ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggYTQ4MDZmMC4uOWIwZDAyNiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTY4LDYgKzY4LDcgQEAKIEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KIEtlbm5ldGggVyBDaGVuIDxrZW5uZXRoLncuY2hlbkBpbnRlbC5jb20+CiBLb3VzaGlrIDxyYWdoYXZlbmRyYS5rb3VzaGlrQG5ldGVyaW9uLmNvbT4KK0t1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4KIExlb25pZCBJIEFuYW5pZXYgPGxlb25pZC5pLmFuYW5pZXZAaW50ZWwuY29tPgogTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CiBNYXJrIEJyb3duIDxicm9vbmllQHNpcmVuYS5vcmcudWs+CkBAIC0xMTEsMyArMTEyLDQgQEAKIFV3ZSBLbGVpbmUtS8O2bmlnIDxVd2UuS2xlaW5lLUtvZW5pZ0BkaWdpLmNvbT4KIFZhbGRpcyBLbGV0bmlla3MgPFZhbGRpcy5LbGV0bmlla3NAdnQuZWR1PgogVGFrYXNoaSBZT1NISUkgPHRha2FzaGkueW9zaGlpLnpqQHJlbmVzYXMuY29tPgorWXVzdWtlIEdvZGEgPGdvZGEueXVzdWtlQHJlbmVzYXMuY29tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWFjcGktcG1wcm9maWxlIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWFjcGktcG1wcm9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NGM3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtYWNwaS1wbXByb2ZpbGUKQEAgLTAsMCArMSwyMiBAQAorV2hhdDogCQkvc3lzL2Zpcm13YXJlL2FjcGkvcG1fcHJvZmlsZQorRGF0ZToJCTAzLU5vdi0yMDExCitLZXJuZWxWZXJzaW9uOgl2My4yCitDb250YWN0OglsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246IAlUaGUgQUNQSSBwbV9wcm9maWxlIHN5c2ZzIGludGVyZmFjZSBleHBvcnRzIHRoZSBwbGF0Zm9ybQorCQlwb3dlciBtYW5hZ2VtZW50IChhbmQgcGVyZm9ybWFuY2UpIHJlcXVpcmVtZW50IGV4cGVjdGF0aW9ucworCQlhcyBwcm92aWRlZCBieSBCSU9TLiBUaGUgaW50ZWdlciB2YWx1ZSBpcyBkaXJlY3RseSBwYXNzZWQgYXMKKwkJcmV0cmlldmVkIGZyb20gdGhlIEZBRFQgQUNQSSB0YWJsZS4KK1ZhbHVlczogICAgICAgICBGb3IgcG9zc2libGUgdmFsdWVzIHNlZSBBQ1BJIHNwZWNpZmljYXRpb246CisJCTUuMi45IEZpeGVkIEFDUEkgRGVzY3JpcHRpb24gVGFibGUgKEZBRFQpCisJCUZpZWxkOiBQcmVmZXJyZWRfUE1fUHJvZmlsZQorCisJCUN1cnJlbnRseSB0aGVzZSB2YWx1ZXMgYXJlIGRlZmluZWQgYnkgc3BlYzoKKwkJMCBVbnNwZWNpZmllZAorCQkxIERlc2t0b3AKKwkJMiBNb2JpbGUKKwkJMyBXb3Jrc3RhdGlvbgorCQk0IEVudGVycHJpc2UgU2VydmVyCisJCTUgU09ITyBTZXJ2ZXIKKwkJNiBBcHBsaWFuY2UgUEMKKwkJNyBQZXJmb3JtYW5jZSBTZXJ2ZXIKKwkJPjcgUmVzZXJ2ZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1pZGVhcGFkIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9kZWJ1Z2ZzLWlkZWFwYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3OWMwYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1pZGVhcGFkCkBAIC0wLDAgKzEsMTkgQEAKK1doYXQ6CQkvc3lzL2tlcm5lbC9kZWJ1Zy9pZGVhcGFkL2NmZworRGF0ZToJCVNlcCAyMDExCitLZXJuZWxWZXJzaW9uOgkzLjIKK0NvbnRhY3Q6CUlrZSBQYW5oYyA8aWtlLnBhbkBjYW5vbmljYWwuY29tPgorRGVzY3JpcHRpb246CisKK2NmZyBzaG93cyB0aGUgcmV0dXJuIHZhbHVlIG9mIF9DRkcgbWV0aG9kIGluIFZQQzIwMDQgZGV2aWNlLiBJdCB0ZWxscyBtYWNoaW5lCitjYXBhYmlsaXR5IGFuZCB3aGF0IGdyYXBoaWMgY29tcG9uZW50IHdpdGhpbiB0aGUgbWFjaGluZS4KKworCitXaGF0OgkJL3N5cy9rZXJuZWwvZGVidWcvaWRlYXBhZC9zdGF0dXMKK0RhdGU6CQlTZXAgMjAxMQorS2VybmVsVmVyc2lvbjoJMy4yCitDb250YWN0OglJa2UgUGFuaGMgPGlrZS5wYW5AY2Fub25pY2FsLmNvbT4KK0Rlc2NyaXB0aW9uOgorCitzdGF0dXMgc2hvd3MgaW5mb3Mgd2UgY2FuIHJlYWQgYW5kIHRlbGxzIGl0cyBtZWFuaW5nIGFuZCB2YWx1ZS4KKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJsb2NrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1ibG9jawppbmRleCBjMWViNDFjLi4yYjVkNTYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJsb2NrCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYmxvY2sKQEAgLTIwNiwzICsyMDYsMTYgQEAKIAkJd2hlbiBhIGRpc2NhcmRlZCBhcmVhIGlzIHJlYWQgdGhlIGRpc2NhcmRfemVyb2VzX2RhdGEKIAkJcGFyYW1ldGVyIHdpbGwgYmUgc2V0IHRvIG9uZS4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgMCBhbmQKIAkJdGhlIHJlc3VsdCBvZiByZWFkaW5nIGEgZGlzY2FyZGVkIGFyZWEgaXMgdW5kZWZpbmVkLgorV2hhdDoJCS9zeXMvYmxvY2svPGRpc2s+L2FsaWFzCitEYXRlOgkJQXVnIDIwMTEKK0NvbnRhY3Q6CU5hbyBOaXNoaWppbWEgPG5hby5uaXNoaWppbWEueHRAaGl0YWNoaS5jb20+CitEZXNjcmlwdGlvbjoKKwkJQSByYXcgZGV2aWNlIG5hbWUgb2YgYSBkaXNrIGRvZXMgbm90IGFsd2F5cyBwb2ludCBhIHNhbWUgZGlzaworCQllYWNoIGJvb3QtdXAgdGltZS4gVGhlcmVmb3JlLCB1c2VycyBoYXZlIHRvIHVzZSBwZXJzaXN0ZW50CisJCWRldmljZSBuYW1lcywgd2hpY2ggdWRldiBjcmVhdGVzIHdoZW4gdGhlIGtlcm5lbCBmaW5kcyBhIGRpc2ssCisJCWluc3RlYWQgb2YgcmF3IGRldmljZSBuYW1lLiBIb3dldmVyLCBrZXJuZWwgZG9lc24ndCBzaG93IHRob3NlCisJCXBlcnNpc3RlbnQgbmFtZXMgb24gaXRzIG1lc3NhZ2VzIChlLmcuIGRtZXNnKS4KKwkJVGhpcyBmaWxlIGNhbiBzdG9yZSBhbiBhbGlhcyBvZiB0aGUgZGlzayBhbmQgaXQgd291bGQgYmUKKwkJYXBwZWFyZWQgaW4ga2VybmVsIG1lc3NhZ2VzIGlmIGl0IGlzIHNldC4gQSBkaXNrIGNhbiBoYXZlIGFuCisJCWFsaWFzIHdoaWNoIGxlbmd0aCBpcyB1cCB0byAyNTVieXRlcy4gVXNlcnMgY2FuIHVzZSBhbHBoYWJldHMsCisJCW51bWJlcnMsICItIiBhbmQgIl8iIGluIGFsaWFzIG5hbWUuIFRoaXMgZmlsZSBpcyB3cml0ZW9uY2UuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1wY2ktZGV2aWNlcy1jY2lzcyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzCmluZGV4IGY1YmIwYTMuLjUzZDk5ZWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzCkBAIC03MSwzICs3MSwxMCBAQAogCQlhIGR1bXAgZGV2aWNlLCBhcyBrZHVtcCByZXF1aXJlcyByZXNldHRpbmcgdGhlIGRldmljZSBpbiBvcmRlcgogCQl0byB3b3JrIHJlbGlhYmx5LgogCitXaGVyZToJCS9zeXMvYnVzL3BjaS9kZXZpY2VzLzxkZXY+L2NjaXNzWC90cmFuc3BvcnRfbW9kZQorRGF0ZToJCUp1bHkgMjAxMQorS2VybmVsIFZlcnNpb246CTMuMAorQ29udGFjdDoJaXNzX3N0b3JhZ2VkZXZAaHAuY29tCitEZXNjcmlwdGlvbjoJVmFsdWUgb2YgInNpbXBsZSIgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIGJlZW4gcGxhY2VkCisJCWluICJzaW1wbGUgbW9kZSIuIFZhbHVlIG9mICJwZXJmb3JtYW50IiBpbmRpY2F0ZXMgdGhhdCB0aGUKKwkJY29udHJvbGxlciBoYXMgYmVlbiBwbGFjZWQgaW4gInBlcmZvcm1hbnQgbW9kZSIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci13YWNvbSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLXdhY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDRkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci13YWNvbQpAQCAtMCwwICsxLDcyIEBACitXaGF0OgkJL3N5cy9jbGFzcy9oaWRyYXcvaGlkcmF3Ki9kZXZpY2Uvc3BlZWQKK0RhdGU6CQlBcHJpbCAyMDEwCitLZXJuZWwgVmVyc2lvbjoJMi42LjM1CitDb250YWN0OglsaW51eC1ibHVldG9vdGhAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJVGhlIC9zeXMvY2xhc3MvaGlkcmF3L2hpZHJhdyovZGV2aWNlL3NwZWVkIGZpbGUgY29udHJvbHMKKwkJcmVwb3J0aW5nIHNwZWVkIG9mIFdhY29tIGJsdWV0b290aCB0YWJsZXQuIFJlYWRpbmcgZnJvbQorCQl0aGlzIGZpbGUgcmV0dXJucyAxIGlmIHRhYmxldCByZXBvcnRzIGluIGhpZ2ggc3BlZWQgbW9kZQorCQlvciAwIG90aGVyd2lzZS4gV3JpdGluZyB0byB0aGlzIGZpbGUgb25lIG9mIHRoZXNlIHZhbHVlcworCQlzd2l0Y2hlcyByZXBvcnRpbmcgc3BlZWQuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL2xlZAorRGF0ZToJCUF1Z3VzdCAyMDExCitDb250YWN0OglsaW51eC1pbnB1dEB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlBdHRyaWJ1dGUgZ3JvdXAgZm9yIGNvbnRyb2wgb2YgdGhlIHN0YXR1cyBMRURzIGFuZCB0aGUgT0xFRHMuCisJCVRoaXMgYXR0cmlidXRlIGdyb3VwIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBJbnR1b3MgNCBNLCBMLAorCQlhbmQgWEwgKHdpdGggTEVEcyBhbmQgT0xFRHMpIGFuZCBDaW50aXEgMjFVWDIgKExFRHMgb25seSkuCisJCVRoZXJlZm9yZSBpdHMgcHJlc2VuY2UgaW1wbGljaXRseSBzaWduaWZpZXMgdGhlIHByZXNlbmNlIG9mCisJCXNhaWQgTEVEcyBhbmQgT0xFRHMgb24gdGhlIHRhYmxldCBkZXZpY2UuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL3N0YXR1czBfbHVtaW5hbmNlCitEYXRlOgkJQXVndXN0IDIwMTEKK0NvbnRhY3Q6CWxpbnV4LWlucHV0QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVdyaXRpbmcgdG8gdGhpcyBmaWxlIHNldHMgdGhlIHN0YXR1cyBMRUQgbHVtaW5hbmNlICgxLi4xMjcpCisJCXdoZW4gdGhlIHN0eWx1cyBkb2VzIG5vdCB0b3VjaCB0aGUgdGFibGV0IHN1cmZhY2UsIGFuZCBubworCQlidXR0b24gaXMgcHJlc3NlZCBvbiB0aGUgc3R5bHVzLiBUaGlzIGx1bWluYW5jZSBsZXZlbCBpcworCQlub3JtYWxseSBsb3dlciB0aGFuIHRoZSBsZXZlbCB3aGVuIGEgYnV0dG9uIGlzIHByZXNzZWQuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL3N0YXR1czFfbHVtaW5hbmNlCitEYXRlOgkJQXVndXN0IDIwMTEKK0NvbnRhY3Q6CWxpbnV4LWlucHV0QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVdyaXRpbmcgdG8gdGhpcyBmaWxlIHNldHMgdGhlIHN0YXR1cyBMRUQgbHVtaW5hbmNlICgxLi4xMjcpCisJCXdoZW4gdGhlIHN0eWx1cyB0b3VjaGVzIHRoZSB0YWJsZXQgc3VyZmFjZSwgb3IgYW55IGJ1dHRvbiBpcworCQlwcmVzc2VkIG9uIHRoZSBzdHlsdXMuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL3N0YXR1c19sZWQwX3NlbGVjdAorRGF0ZToJCUF1Z3VzdCAyMDExCitDb250YWN0OglsaW51eC1pbnB1dEB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlXcml0aW5nIHRvIHRoaXMgZmlsZSBzZXRzIHdoaWNoIG9uZSBvZiB0aGUgZm91ciAoZm9yIEludHVvcyA0KQorCQlvciBvZiB0aGUgcmlnaHQgZm91ciAoZm9yIENpbnRpcSAyMVVYMikgc3RhdHVzIExFRHMgaXMgYWN0aXZlICgwLi4zKS4KKwkJVGhlIG90aGVyIHRocmVlIExFRHMgb24gdGhlIHNhbWUgc2lkZSBhcmUgYWx3YXlzIGluYWN0aXZlLgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNmZz4uPGludGY+L3dhY29tX2xlZC9zdGF0dXNfbGVkMV9zZWxlY3QKK0RhdGU6CQlTZXB0ZW1iZXIgMjAxMQorQ29udGFjdDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJV3JpdGluZyB0byB0aGlzIGZpbGUgc2V0cyB3aGljaCBvbmUgb2YgdGhlIGxlZnQgZm91ciAoZm9yIENpbnRpcSAyMVVYMikKKwkJc3RhdHVzIExFRHMgaXMgYWN0aXZlICgwLi4zKS4gVGhlIG90aGVyIHRocmVlIExFRHMgb24gdGhlIGxlZnQgYXJlIGFsd2F5cworCQlpbmFjdGl2ZS4KKworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+OjxjZmc+LjxpbnRmPi93YWNvbV9sZWQvYnV0dG9uc19sdW1pbmFuY2UKK0RhdGU6CQlBdWd1c3QgMjAxMQorQ29udGFjdDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJV3JpdGluZyB0byB0aGlzIGZpbGUgc2V0cyB0aGUgb3ZlcmFsbCBsdW1pbmFuY2UgbGV2ZWwgKDAuLjE1KQorCQlvZiBhbGwgZWlnaHQgYnV0dG9uIE9MRUQgZGlzcGxheXMuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL2J1dHRvbjxuPl9yYXdpbWcKK0RhdGU6CQlBdWd1c3QgMjAxMQorQ29udGFjdDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJV2hlbiB3cml0aW5nIGEgMTAyNCBieXRlIHJhdyBpbWFnZSBpbiBXYWNvbSBJbnR1b3MgNAorCQlpbnRlcmxlYXZpbmcgZm9ybWF0IHRvIHRoZSBmaWxlLCB0aGUgaW1hZ2Ugc2hvd3MgdXAgb24gQnV0dG9uIE4KKwkJb2YgdGhlIGRldmljZS4gVGhlIGltYWdlIGlzIGEgNjR4MzIgcGl4ZWwgNC1iaXQgZ3JheSBpbWFnZS4gVGhlCisJCTEwMjQgYnl0ZSBiaW5hcnkgaXMgc3BsaXQgdXAgaW50byAxNnggNjQgYnl0ZSBjaHVua3MuIEVhY2ggNjQKKwkJYnl0ZSBjaHVuayBlbmNvZGVzIHRoZSBpbWFnZSBkYXRhIGZvciB0d28gY29uc2VjdXRpdmUgbGluZXMgb24KKwkJdGhlIGRpc3BsYXkuIFRoZSBsb3cgbmliYmxlIG9mIGVhY2ggYnl0ZSBjb250YWlucyB0aGUgZmlyc3QKKwkJbGluZSwgYW5kIHRoZSBoaWdoIG5pYmJsZSBjb250YWlucyB0aGUgc2Vjb25kIGxpbmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wbGF0Zm9ybS1pZGVhcGFkLWxhcHRvcAppbmRleCBmZjUzMTgzLi44MTRiMDEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcGxhdGZvcm0taWRlYXBhZC1sYXB0b3AKQEAgLTUsMTkgKzUsNCBAQAogRGVzY3JpcHRpb246CiAJCUNvbnRyb2wgdGhlIHBvd2VyIG9mIGNhbWVyYSBtb2R1bGUuIDEgbWVhbnMgb24sIDAgbWVhbnMgb2ZmLgogCi1XaGF0OgkJL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2lkZWFwYWQvY2ZnCi1EYXRlOgkJSnVuIDIwMTEKLUtlcm5lbFZlcnNpb246CTMuMQotQ29udGFjdDoJIklrZSBQYW5oYyA8aWtlLnBhbkBjYW5vbmljYWwuY29tPiIKLURlc2NyaXB0aW9uOgotCQlJZGVhcGFkIGNhcGFiaWxpdHkgYml0cy4KLQkJQml0IDgtMTA6IDEgLSBJbnRlbCBncmFwaGljIG9ubHkKLQkJICAgICAgICAgIDIgLSBBVEkgZ3JhcGhpYyBvbmx5Ci0JCSAgICAgICAgICAzIC0gTnZpZGlhIGdyYXBoaWMgb25seQotCQkgICAgICAgICAgNCAtIEludGVsIGFuZCBBVEkgZ3JhcGhpYwotCQkgICAgICAgICAgNSAtIEludGVsIGFuZCBOdmlkaWEgZ3JhcGhpYwotCQlCaXQgMTY6IEJsdWV0b290aCBleGlzdCAoMSBmb3IgZXhpc3QpCi0JCUJpdCAxNzogM0cgZXhpc3QgKDEgZm9yIGV4aXN0KQotCQlCaXQgMTg6IFdpZmkgZXhpc3QgKDEgZm9yIGV4aXN0KQotCQlCaXQgMTk6IENhbWVyYSBleGlzdCAoMSBmb3IgZXhpc3QpCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtd2Fjb20gYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXdhY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTE3OTc2Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtd2Fjb20KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1XaGF0OgkJL3N5cy9jbGFzcy9oaWRyYXcvaGlkcmF3Ki9kZXZpY2Uvc3BlZWQKLURhdGU6CQlBcHJpbCAyMDEwCi1LZXJuZWwgVmVyc2lvbjoJMi42LjM1Ci1Db250YWN0OglsaW51eC1ibHVldG9vdGhAdmdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJVGhlIC9zeXMvY2xhc3MvaGlkcmF3L2hpZHJhdyovZGV2aWNlL3NwZWVkIGZpbGUgY29udHJvbHMKLQkJcmVwb3J0aW5nIHNwZWVkIG9mIHdhY29tIGJsdWV0b290aCB0YWJsZXQuIFJlYWRpbmcgZnJvbQotCQl0aGlzIGZpbGUgcmV0dXJucyAxIGlmIHRhYmxldCByZXBvcnRzIGluIGhpZ2ggc3BlZWQgbW9kZQotCQlvciAwIG90aGVyd2lzZS4gV3JpdGluZyB0byB0aGlzIGZpbGUgb25lIG9mIHRoZXNlIHZhbHVlcwotCQlzd2l0Y2hlcyByZXBvcnRpbmcgc3BlZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCBjOTQwMjM5Li4yYjkwZDMyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTE2Niw4ICsxNjYsOCBAQAogZWxzZQogCWRvX3RoYXQoKTsKIAotVGhpcyBkb2VzIG5vdCBhcHBseSBpZiBvbmUgYnJhbmNoIG9mIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IGlzIGEgc2luZ2xlCi1zdGF0ZW1lbnQuIFVzZSBicmFjZXMgaW4gYm90aCBicmFuY2hlcy4KK1RoaXMgZG9lcyBub3QgYXBwbHkgaWYgb25seSBvbmUgYnJhbmNoIG9mIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IGlzIGEgc2luZ2xlCitzdGF0ZW1lbnQ7IGluIHRoZSBsYXR0ZXIgY2FzZSB1c2UgYnJhY2VzIGluIGJvdGggYnJhbmNoZXM6CiAKIGlmIChjb25kaXRpb24pIHsKIAlkb190aGlzKCk7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0IGIvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAppbmRleCBmZTIzMjY5Li42NmJkOTdhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKQEAgLTUwLDYgKzUwLDEzIEBACiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvIGlnbm9yZSBmbGFncyB0aGF0IGFmZmVjdCB0aGUgbG9jYXRpb24gb2YKIHRoZSByZXR1cm5lZCBtZW1vcnksIGxpa2UgR0ZQX0RNQSkuCiAKK3ZvaWQgKgorZG1hX3phbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQorCitXcmFwcyBkbWFfYWxsb2NfY29oZXJlbnQoKSBhbmQgYWxzbyB6ZXJvZXMgdGhlIHJldHVybmVkIG1lbW9yeSBpZiB0aGUKK2FsbG9jYXRpb24gYXR0ZW1wdCBzdWNjZWVkZWQuCisKIHZvaWQKIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLAogCQkJICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RybS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RybS50bXBsCmluZGV4IGMyNzkxNTguLjE5NmI4YjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kcm0udG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHJtLnRtcGwKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgIFRoZSBMaW51eCBEUk0gbGF5ZXIgY29udGFpbnMgY29kZSBpbnRlbmRlZCB0byBzdXBwb3J0IHRoZSBuZWVkcwogICAgICAgb2YgY29tcGxleCBncmFwaGljcyBkZXZpY2VzLCB1c3VhbGx5IGNvbnRhaW5pbmcgcHJvZ3JhbW1hYmxlCiAgICAgICBwaXBlbGluZXMgd2VsbCBzdWl0ZWQgdG8gM0QgZ3JhcGhpY3MgYWNjZWxlcmF0aW9uLiAgR3JhcGhpY3MKLSAgICAgIGRyaXZlcnMgaW4gdGhlIGtlcm5lbCBjYW4gbWFrZSB1c2Ugb2YgRFJNIGZ1bmN0aW9ucyB0byBtYWtlCisgICAgICBkcml2ZXJzIGluIHRoZSBrZXJuZWwgbWF5IG1ha2UgdXNlIG9mIERSTSBmdW5jdGlvbnMgdG8gbWFrZQogICAgICAgdGFza3MgbGlrZSBtZW1vcnkgbWFuYWdlbWVudCwgaW50ZXJydXB0IGhhbmRsaW5nIGFuZCBETUEgZWFzaWVyLAogICAgICAgYW5kIHByb3ZpZGUgYSB1bmlmb3JtIGludGVyZmFjZSB0byBhcHBsaWNhdGlvbnMuCiAgICAgPC9wYXJhPgpAQCAtNTcsMTAgKzU3LDEwIEBACiAgICAgICBleGlzdGluZyBkcml2ZXJzLgogICAgIDwvcGFyYT4KICAgICA8cGFyYT4KLSAgICAgIEZpcnN0LCB3ZSdsbCBnbyBvdmVyIHNvbWUgdHlwaWNhbCBkcml2ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgIEZpcnN0LCB3ZSBnbyBvdmVyIHNvbWUgdHlwaWNhbCBkcml2ZXIgaW5pdGlhbGl6YXRpb24KICAgICAgIHJlcXVpcmVtZW50cywgbGlrZSBzZXR0aW5nIHVwIGNvbW1hbmQgYnVmZmVycywgY3JlYXRpbmcgYW4KICAgICAgIGluaXRpYWwgb3V0cHV0IGNvbmZpZ3VyYXRpb24sIGFuZCBpbml0aWFsaXppbmcgY29yZSBzZXJ2aWNlcy4KLSAgICAgIFN1YnNlcXVlbnQgc2VjdGlvbnMgd2lsbCBjb3ZlciBjb3JlIGludGVybmFscyBpbiBtb3JlIGRldGFpbCwKKyAgICAgIFN1YnNlcXVlbnQgc2VjdGlvbnMgY292ZXIgY29yZSBpbnRlcm5hbHMgaW4gbW9yZSBkZXRhaWwsCiAgICAgICBwcm92aWRpbmcgaW1wbGVtZW50YXRpb24gbm90ZXMgYW5kIGV4YW1wbGVzLgogICAgIDwvcGFyYT4KICAgICA8cGFyYT4KQEAgLTc0LDcgKzc0LDcgQEAKICAgICA8L3BhcmE+CiAgICAgPHBhcmE+CiAgICAgICBUaGUgY29yZSBvZiBldmVyeSBEUk0gZHJpdmVyIGlzIHN0cnVjdCBkcm1fZHJpdmVyLiAgRHJpdmVycwotICAgICAgd2lsbCB0eXBpY2FsbHkgc3RhdGljYWxseSBpbml0aWFsaXplIGEgZHJtX2RyaXZlciBzdHJ1Y3R1cmUsCisgICAgICB0eXBpY2FsbHkgc3RhdGljYWxseSBpbml0aWFsaXplIGEgZHJtX2RyaXZlciBzdHJ1Y3R1cmUsCiAgICAgICB0aGVuIHBhc3MgaXQgdG8gZHJtX2luaXQoKSBhdCBsb2FkIHRpbWUuCiAgICAgPC9wYXJhPgogCkBAIC04OCw4ICs4OCw4IEBACiAgICAgPC9wYXJhPgogICAgIDxwcm9ncmFtbGlzdGluZz4KICAgICAgIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7Ci0JLyogZG9uJ3QgdXNlIG10cnIncyBoZXJlLCB0aGUgWHNlcnZlciBvciB1c2VyIHNwYWNlIGFwcCBzaG91bGQKLQkgKiBkZWFsIHdpdGggdGhlbSBmb3IgaW50ZWwgaGFyZHdhcmUuCisJLyogRG9uJ3QgdXNlIE1UUlJzIGhlcmU7IHRoZSBYc2VydmVyIG9yIHVzZXJzcGFjZSBhcHAgc2hvdWxkCisJICogZGVhbCB3aXRoIHRoZW0gZm9yIEludGVsIGhhcmR3YXJlLgogCSAqLwogCS5kcml2ZXJfZmVhdHVyZXMgPQogCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8CkBAIC0xNTQsOCArMTU0LDggQEAKICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgIDxwYXJhPgogICAgICAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRha2VuIGZyb20gdGhlIGk5MTUgRFJNIGRyaXZlciwgdGhlIGRyaXZlcgotICAgICAgc2V0cyBzZXZlcmFsIGZsYWdzIGluZGljYXRpbmcgd2hhdCBjb3JlIGZlYXR1cmVzIGl0IHN1cHBvcnRzLgotICAgICAgV2UnbGwgZ28gb3ZlciB0aGUgaW5kaXZpZHVhbCBjYWxsYmFja3MgaW4gbGF0ZXIgc2VjdGlvbnMuICBTaW5jZQorICAgICAgc2V0cyBzZXZlcmFsIGZsYWdzIGluZGljYXRpbmcgd2hhdCBjb3JlIGZlYXR1cmVzIGl0IHN1cHBvcnRzOworICAgICAgd2UgZ28gb3ZlciB0aGUgaW5kaXZpZHVhbCBjYWxsYmFja3MgaW4gbGF0ZXIgc2VjdGlvbnMuICBTaW5jZQogICAgICAgZmxhZ3MgaW5kaWNhdGUgd2hpY2ggZmVhdHVyZXMgeW91ciBkcml2ZXIgc3VwcG9ydHMgdG8gdGhlIERSTQogICAgICAgY29yZSwgeW91IG5lZWQgdG8gc2V0IG1vc3Qgb2YgdGhlbSBwcmlvciB0byBjYWxsaW5nIGRybV9pbml0KCkuICBTb21lLAogICAgICAgbGlrZSBEUklWRVJfTU9ERVNFVCBjYW4gYmUgc2V0IGxhdGVyIGJhc2VkIG9uIHVzZXIgc3VwcGxpZWQgcGFyYW1ldGVycywKQEAgLTIwMyw4ICsyMDMsOCBAQAogCTx0ZXJtPkRSSVZFUl9IQVZFX0lSUTwvdGVybT48dGVybT5EUklWRVJfSVJRX1NIQVJFRDwvdGVybT4KIAk8bGlzdGl0ZW0+CiAJICA8cGFyYT4KLQkgICAgRFJJVkVSX0hBVkVfSVJRIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkcml2ZXIgaGFzIGEgSVJRCi0JICAgIGhhbmRsZXIsIERSSVZFUl9JUlFfU0hBUkVEIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkZXZpY2UgJmFtcDsKKwkgICAgRFJJVkVSX0hBVkVfSVJRIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkcml2ZXIgaGFzIGFuIElSUQorCSAgICBoYW5kbGVyLiAgRFJJVkVSX0lSUV9TSEFSRUQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRldmljZSAmYW1wOwogCSAgICBoYW5kbGVyIHN1cHBvcnQgc2hhcmVkIElSUXMgKG5vdGUgdGhhdCB0aGlzIGlzIHJlcXVpcmVkIG9mCiAJICAgIFBDSSBkcml2ZXJzKS4KIAkgIDwvcGFyYT4KQEAgLTIxNCw4ICsyMTQsOCBAQAogCTx0ZXJtPkRSSVZFUl9ETUFfUVVFVUU8L3Rlcm0+CiAJPGxpc3RpdGVtPgogCSAgPHBhcmE+Ci0JICAgIElmIHRoZSBkcml2ZXIgcXVldWVzIERNQSByZXF1ZXN0cyBhbmQgY29tcGxldGVzIHRoZW0KLQkgICAgYXN5bmNocm9ub3VzbHksIHRoaXMgZmxhZyBzaG91bGQgYmUgc2V0LiAgRGVwcmVjYXRlZC4KKwkgICAgU2hvdWxkIGJlIHNldCBpZiB0aGUgZHJpdmVyIHF1ZXVlcyBETUEgcmVxdWVzdHMgYW5kIGNvbXBsZXRlcyB0aGVtCisJICAgIGFzeW5jaHJvbm91c2x5LiAgRGVwcmVjYXRlZC4KIAkgIDwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CkBAIC0yMzgsNyArMjM4LDcgQEAKICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgICA8cGFyYT4KICAgICAgIEluIHRoaXMgc3BlY2lmaWMgY2FzZSwgdGhlIGRyaXZlciByZXF1aXJlcyBBR1AgYW5kIHN1cHBvcnRzCi0gICAgICBJUlFzLiAgRE1BLCBhcyB3ZSdsbCBzZWUsIGlzIGhhbmRsZWQgYnkgZGV2aWNlIHNwZWNpZmljIGlvY3RscworICAgICAgSVJRcy4gIERNQSwgYXMgZGlzY3Vzc2VkIGxhdGVyLCBpcyBoYW5kbGVkIGJ5IGRldmljZS1zcGVjaWZpYyBpb2N0bHMKICAgICAgIGluIHRoaXMgY2FzZS4gIEl0IGFsc28gc3VwcG9ydHMgdGhlIGtlcm5lbCBtb2RlIHNldHRpbmcgQVBJcywgdGhvdWdoCiAgICAgICB1bmxpa2UgaW4gdGhlIGFjdHVhbCBpOTE1IGRyaXZlciBzb3VyY2UsIHRoaXMgZXhhbXBsZSB1bmNvbmRpdGlvbmFsbHkKICAgICAgIGV4cG9ydHMgS01TIGNhcGFiaWxpdHkuCkBAIC0yNjksMzYgKzI2OSwzNCBAQAogICAgICAgaW5pdGlhbCBvdXRwdXQgY29uZmlndXJhdGlvbi4KICAgICA8L3BhcmE+CiAgICAgPHBhcmE+Ci0gICAgICBOb3RlIHRoYXQgdGhlIHRhc2tzIHBlcmZvcm1lZCBhdCBkcml2ZXIgbG9hZCB0aW1lIG11c3Qgbm90Ci0gICAgICBjb25mbGljdCB3aXRoIERSTSBjbGllbnQgcmVxdWlyZW1lbnRzLiAgRm9yIGluc3RhbmNlLCBpZiB1c2VyCisgICAgICBJZiBjb21wYXRpYmlsaXR5IGlzIGEgY29uY2VybiAoZS5nLiB3aXRoIGRyaXZlcnMgY29udmVydGVkIG92ZXIKKyAgICAgIHRvIHRoZSBuZXcgaW50ZXJmYWNlcyBmcm9tIHRoZSBvbGQgb25lcyksIGNhcmUgbXVzdCBiZSB0YWtlbiB0bworICAgICAgcHJldmVudCBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYW5kIGNvbnRyb2wgdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aAorICAgICAgY3VycmVudGx5IGFjdGl2ZSB1c2Vyc3BhY2UgZHJpdmVycy4gIEZvciBpbnN0YW5jZSwgaWYgdXNlcgogICAgICAgbGV2ZWwgbW9kZSBzZXR0aW5nIGRyaXZlcnMgYXJlIGluIHVzZSwgaXQgd291bGQgYmUgcHJvYmxlbWF0aWMKICAgICAgIHRvIHBlcmZvcm0gb3V0cHV0IGRpc2NvdmVyeSAmYW1wOyBjb25maWd1cmF0aW9uIGF0IGxvYWQgdGltZS4KLSAgICAgIExpa2V3aXNlLCBpZiBwcmUtbWVtb3J5IG1hbmFnZW1lbnQgYXdhcmUgdXNlciBsZXZlbCBkcml2ZXJzIGFyZQorICAgICAgTGlrZXdpc2UsIGlmIHVzZXItbGV2ZWwgZHJpdmVycyB1bmF3YXJlIG9mIG1lbW9yeSBtYW5hZ2VtZW50IGFyZQogICAgICAgaW4gdXNlLCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgY29tbWFuZCBidWZmZXIgc2V0dXAgbWF5IG5lZWQgdG8KLSAgICAgIGJlIG9taXR0ZWQuICBUaGVzZSByZXF1aXJlbWVudHMgYXJlIGRyaXZlciBzcGVjaWZpYywgYW5kIGNhcmUKKyAgICAgIGJlIG9taXR0ZWQuICBUaGVzZSByZXF1aXJlbWVudHMgYXJlIGRyaXZlci1zcGVjaWZpYywgYW5kIGNhcmUKICAgICAgIG5lZWRzIHRvIGJlIHRha2VuIHRvIGtlZXAgYm90aCBvbGQgYW5kIG5ldyBhcHBsaWNhdGlvbnMgYW5kCiAgICAgICBsaWJyYXJpZXMgd29ya2luZy4gIFRoZSBpOTE1IGRyaXZlciBzdXBwb3J0cyB0aGUgIm1vZGVzZXQiCiAgICAgICBtb2R1bGUgcGFyYW1ldGVyIHRvIGNvbnRyb2wgd2hldGhlciBhZHZhbmNlZCBmZWF0dXJlcyBhcmUKLSAgICAgIGVuYWJsZWQgYXQgbG9hZCB0aW1lIG9yIGluIGxlZ2FjeSBmYXNoaW9uLiAgSWYgY29tcGF0aWJpbGl0eSBpcwotICAgICAgYSBjb25jZXJuIChlLmcuIHdpdGggZHJpdmVycyBjb252ZXJ0ZWQgb3ZlciB0byB0aGUgbmV3IGludGVyZmFjZXMKLSAgICAgIGZyb20gdGhlIG9sZCBvbmVzKSwgY2FyZSBtdXN0IGJlIHRha2VuIHRvIHByZXZlbnQgaW5jb21wYXRpYmxlCi0gICAgICBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYW5kIGNvbnRyb2wgd2l0aCB0aGUgY3VycmVudGx5IGFjdGl2ZQotICAgICAgdXNlcnNwYWNlIGRyaXZlcnMuCisgICAgICBlbmFibGVkIGF0IGxvYWQgdGltZSBvciBpbiBsZWdhY3kgZmFzaGlvbi4KICAgICA8L3BhcmE+CiAKICAgICA8c2VjdDI+CiAgICAgICA8dGl0bGU+RHJpdmVyIHByaXZhdGUgJmFtcDsgcGVyZm9ybWFuY2UgY291bnRlcnM8L3RpdGxlPgogICAgICAgPHBhcmE+CiAJVGhlIGRyaXZlciBwcml2YXRlIGhhbmdzIG9mZiB0aGUgbWFpbiBkcm1fZGV2aWNlIHN0cnVjdHVyZSBhbmQKLQljYW4gYmUgdXNlZCBmb3IgdHJhY2tpbmcgdmFyaW91cyBkZXZpY2Ugc3BlY2lmaWMgYml0cyBvZgorCWNhbiBiZSB1c2VkIGZvciB0cmFja2luZyB2YXJpb3VzIGRldmljZS1zcGVjaWZpYyBiaXRzIG9mCiAJaW5mb3JtYXRpb24sIGxpa2UgcmVnaXN0ZXIgb2Zmc2V0cywgY29tbWFuZCBidWZmZXIgc3RhdHVzLAogCXJlZ2lzdGVyIHN0YXRlIGZvciBzdXNwZW5kL3Jlc3VtZSwgZXRjLiAgQXQgbG9hZCB0aW1lLCBhCi0JZHJpdmVyIGNhbiBzaW1wbHkgYWxsb2NhdGUgb25lIGFuZCBzZXQgZHJtX2RldmljZS5kZXZfcHJpdgotCWFwcHJvcHJpYXRlbHk7IGF0IHVubG9hZCB0aGUgZHJpdmVyIGNhbiBmcmVlIGl0IGFuZCBzZXQKLQlkcm1fZGV2aWNlLmRldl9wcml2IHRvIE5VTEwuCisJZHJpdmVyIG1heSBzaW1wbHkgYWxsb2NhdGUgb25lIGFuZCBzZXQgZHJtX2RldmljZS5kZXZfcHJpdgorCWFwcHJvcHJpYXRlbHk7IGl0IHNob3VsZCBiZSBmcmVlZCBhbmQgZHJtX2RldmljZS5kZXZfcHJpdiBzZXQKKwl0byBOVUxMIHdoZW4gdGhlIGRyaXZlciBpcyB1bmxvYWRlZC4KICAgICAgIDwvcGFyYT4KICAgICAgIDxwYXJhPgotCVRoZSBEUk0gc3VwcG9ydHMgc2V2ZXJhbCBjb3VudGVycyB3aGljaCBjYW4gYmUgdXNlZCBmb3Igcm91Z2gKKwlUaGUgRFJNIHN1cHBvcnRzIHNldmVyYWwgY291bnRlcnMgd2hpY2ggbWF5IGJlIHVzZWQgZm9yIHJvdWdoCiAJcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXphdGlvbi4gIE5vdGUgdGhhdCB0aGUgRFJNIHN0YXQgY291bnRlcgogCXN5c3RlbSBpcyBub3Qgb2Z0ZW4gdXNlZCBieSBhcHBsaWNhdGlvbnMsIGFuZCBzdXBwb3J0aW5nCiAJYWRkaXRpb25hbCBjb3VudGVycyBpcyBjb21wbGV0ZWx5IG9wdGlvbmFsLgpAQCAtMzA3LDE1ICszMDUsMTUgQEAKIAlUaGVzZSBpbnRlcmZhY2VzIGFyZSBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuICBJZiBwZXJmb3JtYW5jZQogCW1vbml0b3JpbmcgaXMgZGVzaXJlZCwgdGhlIGRldmVsb3BlciBzaG91bGQgaW52ZXN0aWdhdGUgYW5kCiAJcG90ZW50aWFsbHkgZW5oYW5jZSB0aGUga2VybmVsIHBlcmYgYW5kIHRyYWNpbmcgaW5mcmFzdHJ1Y3R1cmUgdG8gZXhwb3J0Ci0JR1BVIHJlbGF0ZWQgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gdG8gcGVyZm9ybWFuY2UgbW9uaXRvcmluZwotCXRvb2xzIGFuZCBhcHBsaWNhdGlvbnMuCisJR1BVIHJlbGF0ZWQgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gZm9yIGNvbnN1bXB0aW9uIGJ5IHBlcmZvcm1hbmNlCisJbW9uaXRvcmluZyB0b29scyBhbmQgYXBwbGljYXRpb25zLgogICAgICAgPC9wYXJhPgogICAgIDwvc2VjdDI+CiAKICAgICA8c2VjdDI+CiAgICAgICA8dGl0bGU+Q29uZmlndXJpbmcgdGhlIGRldmljZTwvdGl0bGU+CiAgICAgICA8cGFyYT4KLQlPYnZpb3VzbHksIGRldmljZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZGV2aWNlIHNwZWNpZmljLgorCU9idmlvdXNseSwgZGV2aWNlIGNvbmZpZ3VyYXRpb24gaXMgZGV2aWNlLXNwZWNpZmljLgogCUhvd2V2ZXIsIHRoZXJlIGFyZSBzZXZlcmFsIGNvbW1vbiBvcGVyYXRpb25zOiBmaW5kaW5nIGEKIAlkZXZpY2UncyBQQ0kgcmVzb3VyY2VzLCBtYXBwaW5nIHRoZW0sIGFuZCBwb3RlbnRpYWxseSBzZXR0aW5nCiAJdXAgYW4gSVJRIGhhbmRsZXIuCkBAIC0zMjMsMTAgKzMyMSwxMCBAQAogICAgICAgPHBhcmE+CiAJRmluZGluZyAmYW1wOyBtYXBwaW5nIHJlc291cmNlcyBpcyBmYWlybHkgc3RyYWlnaHRmb3J3YXJkLiAgVGhlCiAJRFJNIHdyYXBwZXIgZnVuY3Rpb25zLCBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KCkgYW5kCi0JZHJtX2dldF9yZXNvdXJjZV9sZW4oKSBjYW4gYmUgdXNlZCB0byBmaW5kIEJBUnMgb24gdGhlIGdpdmVuCisJZHJtX2dldF9yZXNvdXJjZV9sZW4oKSwgbWF5IGJlIHVzZWQgdG8gZmluZCBCQVJzIG9uIHRoZSBnaXZlbgogCWRybV9kZXZpY2Ugc3RydWN0LiAgT25jZSB0aG9zZSB2YWx1ZXMgaGF2ZSBiZWVuIHJldHJpZXZlZCwgdGhlCiAJZHJpdmVyIGxvYWQgZnVuY3Rpb24gY2FuIGNhbGwgZHJtX2FkZG1hcCgpIHRvIGNyZWF0ZSBhIG5ldwotCW1hcHBpbmcgZm9yIHRoZSBCQVIgaW4gcXVlc3Rpb24uICBOb3RlIHlvdSdsbCBwcm9iYWJseSB3YW50IGEKKwltYXBwaW5nIGZvciB0aGUgQkFSIGluIHF1ZXN0aW9uLiAgTm90ZSB0aGF0IHlvdSBwcm9iYWJseSB3YW50IGEKIAlkcm1fbG9jYWxfbWFwX3QgaW4geW91ciBkcml2ZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gdHJhY2sgYW55CiAJbWFwcGluZ3MgeW91IGNyZWF0ZS4KIDwhLS0gIUZkcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYyBkcm1fZ2V0X3Jlc291cmNlXyogLS0+CkBAIC0zMzUsMjAgKzMzMywyMCBAQAogICAgICAgPHBhcmE+CiAJaWYgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIGlzbid0IGEgY29uY2VybgogCShEUk0gZHJpdmVycyBjYW4gcnVuIHVuZGVyIHZhcmlvdXMgQlNEIHZhcmlhbnRzIGFuZCBPcGVuU29sYXJpcyksCi0JbmF0aXZlIExpbnV4IGNhbGxzIGNhbiBiZSB1c2VkIGZvciB0aGUgYWJvdmUsIGUuZy4gcGNpX3Jlc291cmNlXyoKKwluYXRpdmUgTGludXggY2FsbHMgbWF5IGJlIHVzZWQgZm9yIHRoZSBhYm92ZSwgZS5nLiBwY2lfcmVzb3VyY2VfKgogCWFuZCBpb21hcCovaW91bm1hcC4gIFNlZSB0aGUgTGludXggZGV2aWNlIGRyaXZlciBib29rIGZvciBtb3JlCiAJaW5mby4KICAgICAgIDwvcGFyYT4KICAgICAgIDxwYXJhPgotCU9uY2UgeW91IGhhdmUgYSByZWdpc3RlciBtYXAsIHlvdSBjYW4gdXNlIHRoZSBEUk1fUkVBRG4oKSBhbmQKKwlPbmNlIHlvdSBoYXZlIGEgcmVnaXN0ZXIgbWFwLCB5b3UgbWF5IHVzZSB0aGUgRFJNX1JFQURuKCkgYW5kCiAJRFJNX1dSSVRFbigpIG1hY3JvcyB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycyBvbiB5b3VyIGRldmljZSwgb3IKLQl1c2UgZHJpdmVyIHNwZWNpZmljIHZlcnNpb25zIHRvIG9mZnNldCBpbnRvIHlvdXIgTU1JTyBzcGFjZQotCXJlbGF0aXZlIHRvIGEgZHJpdmVyIHNwZWNpZmljIGJhc2UgcG9pbnRlciAoc2VlIEk5MTVfUkVBRCBmb3IKLQlleGFtcGxlKS4KKwl1c2UgZHJpdmVyLXNwZWNpZmljIHZlcnNpb25zIHRvIG9mZnNldCBpbnRvIHlvdXIgTU1JTyBzcGFjZQorCXJlbGF0aXZlIHRvIGEgZHJpdmVyLXNwZWNpZmljIGJhc2UgcG9pbnRlciAoc2VlIEk5MTVfUkVBRCBmb3IKKwlhbiBleGFtcGxlKS4KICAgICAgIDwvcGFyYT4KICAgICAgIDxwYXJhPgogCUlmIHlvdXIgZGV2aWNlIHN1cHBvcnRzIGludGVycnVwdCBnZW5lcmF0aW9uLCB5b3UgbWF5IHdhbnQgdG8KLQlzZXR1cCBhbiBpbnRlcnJ1cHQgaGFuZGxlciBhdCBkcml2ZXIgbG9hZCB0aW1lIGFzIHdlbGwuICBUaGlzCisJc2V0IHVwIGFuIGludGVycnVwdCBoYW5kbGVyIHdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQuICBUaGlzCiAJaXMgZG9uZSB1c2luZyB0aGUgZHJtX2lycV9pbnN0YWxsKCkgZnVuY3Rpb24uICBJZiB5b3VyIGRldmljZQogCXN1cHBvcnRzIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdHMsIGl0IHNob3VsZCBjYWxsCiAJZHJtX3ZibGFua19pbml0KCkgdG8gaW5pdGlhbGl6ZSB0aGUgY29yZSB2YmxhbmsgaGFuZGxpbmcgY29kZSBiZWZvcmUKQEAgLTM1Nyw3ICszNTUsNyBAQAogICAgICAgPC9wYXJhPgogPCEtLSFGZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMgZHJtX2lycV9pbnN0YWxsLS0+CiAgICAgICA8cGFyYT4KLQlPbmNlIHlvdXIgaW50ZXJydXB0IGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCAoaXQnbGwgdXNlIHlvdXIKKwlPbmNlIHlvdXIgaW50ZXJydXB0IGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCAoaXQgdXNlcyB5b3VyCiAJZHJtX2RyaXZlci5pcnFfaGFuZGxlciBhcyB0aGUgYWN0dWFsIGludGVycnVwdCBoYW5kbGluZwogCWZ1bmN0aW9uKSwgeW91IGNhbiBzYWZlbHkgZW5hYmxlIGludGVycnVwdHMgb24geW91ciBkZXZpY2UsCiAJYXNzdW1pbmcgYW55IG90aGVyIHN0YXRlIHlvdXIgaW50ZXJydXB0IGhhbmRsZXIgdXNlcyBpcyBhbHNvCkBAIC0zNzEsMTAgKzM2OSwxMCBAQAogCXVzaW5nIHRoZSBwY2lfbWFwX3JvbSgpIGNhbGwsIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdAogCXRha2VzIGNhcmUgb2YgbWFwcGluZyB0aGUgYWN0dWFsIFJPTSwgd2hldGhlciBpdCBoYXMgYmVlbgogCXNoYWRvd2VkIGludG8gbWVtb3J5ICh0eXBpY2FsbHkgYXQgYWRkcmVzcyAweGMwMDAwKSBvciBleGlzdHMKLQlvbiB0aGUgUENJIGRldmljZSBpbiB0aGUgUk9NIEJBUi4gIE5vdGUgdGhhdCBvbmNlIHlvdSd2ZQotCW1hcHBlZCB0aGUgUk9NIGFuZCBleHRyYWN0ZWQgYW55IG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgYmUKLQlzdXJlIHRvIHVubWFwIGl0OyBvbiBtYW55IGRldmljZXMgdGhlIFJPTSBhZGRyZXNzIGRlY29kZXIgaXMKLQlzaGFyZWQgd2l0aCBvdGhlciBCQVJzLCBzbyBsZWF2aW5nIGl0IG1hcHBlZCBjYW4gY2F1c2UKKwlvbiB0aGUgUENJIGRldmljZSBpbiB0aGUgUk9NIEJBUi4gIE5vdGUgdGhhdCBhZnRlciB0aGUgUk9NCisJaGFzIGJlZW4gbWFwcGVkIGFuZCBhbnkgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGhhcyBiZWVuIGV4dHJhY3RlZCwKKwlpdCBzaG91bGQgYmUgdW5tYXBwZWQ7IG9uIG1hbnkgZGV2aWNlcywgdGhlIFJPTSBhZGRyZXNzIGRlY29kZXIgaXMKKwlzaGFyZWQgd2l0aCBvdGhlciBCQVJzLCBzbyBsZWF2aW5nIGl0IG1hcHBlZCBjb3VsZCBjYXVzZQogCXVuZGVzaXJlZCBiZWhhdmlvciBsaWtlIGhhbmdzIG9yIG1lbW9yeSBjb3JydXB0aW9uLgogPCEtLSFGZHJpdmVycy9wY2kvcm9tLmMgcGNpX21hcF9yb20tLT4KICAgICAgIDwvcGFyYT4KQEAgLTM4OSw5ICszODcsOSBAQAogCXNob3VsZCBzdXBwb3J0IGEgbWVtb3J5IG1hbmFnZXIuCiAgICAgICA8L3BhcmE+CiAgICAgICA8cGFyYT4KLQlJZiB5b3VyIGRyaXZlciBzdXBwb3J0cyBtZW1vcnkgbWFuYWdlbWVudCAoaXQgc2hvdWxkISksIHlvdSdsbAorCUlmIHlvdXIgZHJpdmVyIHN1cHBvcnRzIG1lbW9yeSBtYW5hZ2VtZW50IChpdCBzaG91bGQhKSwgeW91CiAJbmVlZCB0byBzZXQgdGhhdCB1cCBhdCBsb2FkIHRpbWUgYXMgd2VsbC4gIEhvdyB5b3UgaW5pdGlhbGl6ZQotCWl0IGRlcGVuZHMgb24gd2hpY2ggbWVtb3J5IG1hbmFnZXIgeW91J3JlIHVzaW5nLCBUVE0gb3IgR0VNLgorCWl0IGRlcGVuZHMgb24gd2hpY2ggbWVtb3J5IG1hbmFnZXIgeW91J3JlIHVzaW5nOiBUVE0gb3IgR0VNLgogICAgICAgPC9wYXJhPgogICAgICAgPHNlY3QzPgogCTx0aXRsZT5UVE0gaW5pdGlhbGl6YXRpb248L3RpdGxlPgpAQCAtNDAxLDcgKzM5OSw3IEBACiAJICBhbmQgZGV2aWNlcyB3aXRoIGRlZGljYXRlZCB2aWRlbyBSQU0gKFZSQU0pLCBpLmUuIG1vc3QgZGlzY3JldGUKIAkgIGdyYXBoaWNzIGRldmljZXMuICBJZiB5b3VyIGRldmljZSBoYXMgZGVkaWNhdGVkIFJBTSwgc3VwcG9ydGluZwogCSAgVFRNIGlzIGRlc2lyYWJsZS4gIFRUTSBhbHNvIGludGVncmF0ZXMgdGlnaHRseSB3aXRoIHlvdXIKLQkgIGRyaXZlciBzcGVjaWZpYyBidWZmZXIgZXhlY3V0aW9uIGZ1bmN0aW9uLiAgU2VlIHRoZSByYWRlb24KKwkgIGRyaXZlci1zcGVjaWZpYyBidWZmZXIgZXhlY3V0aW9uIGZ1bmN0aW9uLiAgU2VlIHRoZSByYWRlb24KIAkgIGRyaXZlciBmb3IgZXhhbXBsZXMuCiAJPC9wYXJhPgogCTxwYXJhPgpAQCAtNDI5LDIxICs0MjcsMjEgQEAKIAkgIGNyZWF0ZWQgYnkgdGhlIG1lbW9yeSBtYW5hZ2VyIGF0IHJ1bnRpbWUuICBZb3VyIGdsb2JhbCBUVE0gc2hvdWxkCiAJICBoYXZlIGEgdHlwZSBvZiBUVE1fR0xPQkFMX1RUTV9NRU0uICBUaGUgc2l6ZSBmaWVsZCBmb3IgdGhlIGdsb2JhbAogCSAgb2JqZWN0IHNob3VsZCBiZSBzaXplb2Yoc3RydWN0IHR0bV9tZW1fZ2xvYmFsKSwgYW5kIHRoZSBpbml0IGFuZAotCSAgcmVsZWFzZSBob29rcyBzaG91bGQgcG9pbnQgYXQgeW91ciBkcml2ZXIgc3BlY2lmaWMgaW5pdCBhbmQKLQkgIHJlbGVhc2Ugcm91dGluZXMsIHdoaWNoIHdpbGwgcHJvYmFibHkgZXZlbnR1YWxseSBjYWxsCi0JICB0dG1fbWVtX2dsb2JhbF9pbml0IGFuZCB0dG1fbWVtX2dsb2JhbF9yZWxlYXNlIHJlc3BlY3RpdmVseS4KKwkgIHJlbGVhc2UgaG9va3Mgc2hvdWxkIHBvaW50IGF0IHlvdXIgZHJpdmVyLXNwZWNpZmljIGluaXQgYW5kCisJICByZWxlYXNlIHJvdXRpbmVzLCB3aGljaCBwcm9iYWJseSBldmVudHVhbGx5IGNhbGwKKwkgIHR0bV9tZW1fZ2xvYmFsX2luaXQgYW5kIHR0bV9tZW1fZ2xvYmFsX3JlbGVhc2UsIHJlc3BlY3RpdmVseS4KIAk8L3BhcmE+CiAJPHBhcmE+CiAJICBPbmNlIHlvdXIgZ2xvYmFsIFRUTSBhY2NvdW50aW5nIHN0cnVjdHVyZSBpcyBzZXQgdXAgYW5kIGluaXRpYWxpemVkCi0JICAoZG9uZSBieSBjYWxsaW5nIHR0bV9nbG9iYWxfaXRlbV9yZWYgb24gdGhlIGdsb2JhbCBvYmplY3QgeW91Ci0JICBqdXN0IGNyZWF0ZWQpLCB5b3UnbGwgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgb2JqZWN0IFRUTSB0bworCSAgYnkgY2FsbGluZyB0dG1fZ2xvYmFsX2l0ZW1fcmVmKCkgb24gaXQsCisJICB5b3UgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgb2JqZWN0IFRUTSB0bwogCSAgcHJvdmlkZSBhIHBvb2wgZm9yIGJ1ZmZlciBvYmplY3QgYWxsb2NhdGlvbiBieSBjbGllbnRzIGFuZCB0aGUKIAkgIGtlcm5lbCBpdHNlbGYuICBUaGUgdHlwZSBvZiB0aGlzIG9iamVjdCBzaG91bGQgYmUgVFRNX0dMT0JBTF9UVE1fQk8sCiAJICBhbmQgaXRzIHNpemUgc2hvdWxkIGJlIHNpemVvZihzdHJ1Y3QgdHRtX2JvX2dsb2JhbCkuICBBZ2FpbiwKLQkgIGRyaXZlciBzcGVjaWZpYyBpbml0IGFuZCByZWxlYXNlIGZ1bmN0aW9ucyBjYW4gYmUgcHJvdmlkZWQsCi0JICBsaWtlbHkgZXZlbnR1YWxseSBjYWxsaW5nIHR0bV9ib19nbG9iYWxfaW5pdCBhbmQKLQkgIHR0bV9ib19nbG9iYWxfcmVsZWFzZSwgcmVzcGVjdGl2ZWx5LiAgQWxzbyBsaWtlIHRoZSBwcmV2aW91cwotCSAgb2JqZWN0LCB0dG1fZ2xvYmFsX2l0ZW1fcmVmIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGluaXRpYWwgcmVmZXJlbmNlCisJICBkcml2ZXItc3BlY2lmaWMgaW5pdCBhbmQgcmVsZWFzZSBmdW5jdGlvbnMgbWF5IGJlIHByb3ZpZGVkLAorCSAgbGlrZWx5IGV2ZW50dWFsbHkgY2FsbGluZyB0dG1fYm9fZ2xvYmFsX2luaXQoKSBhbmQKKwkgIHR0bV9ib19nbG9iYWxfcmVsZWFzZSgpLCByZXNwZWN0aXZlbHkuICBBbHNvLCBsaWtlIHRoZSBwcmV2aW91cworCSAgb2JqZWN0LCB0dG1fZ2xvYmFsX2l0ZW1fcmVmKCkgaXMgdXNlZCB0byBjcmVhdGUgYW4gaW5pdGlhbCByZWZlcmVuY2UKIAkgIGNvdW50IGZvciB0aGUgVFRNLCB3aGljaCB3aWxsIGNhbGwgeW91ciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KIAk8L3BhcmE+CiAgICAgICA8L3NlY3QzPgpAQCAtNDUzLDI3ICs0NTEsMjYgQEAKIAkgIEdFTSBpcyBhbiBhbHRlcm5hdGl2ZSB0byBUVE0sIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgVU1BCiAJICBkZXZpY2VzLiAgSXQgaGFzIHNpbXBsZXIgaW5pdGlhbGl6YXRpb24gYW5kIGV4ZWN1dGlvbiByZXF1aXJlbWVudHMKIAkgIHRoYW4gVFRNLCBidXQgaGFzIG5vIFZSQU0gbWFuYWdlbWVudCBjYXBhYmlsaXR5LiAgQ29yZSBHRU0KLQkgIGluaXRpYWxpemF0aW9uIGlzIGNvbXByaXNlZCBvZiBhIGJhc2ljIGRybV9tbV9pbml0IGNhbGwgdG8gY3JlYXRlCisJICBpcyBpbml0aWFsaXplZCBieSBjYWxsaW5nIGRybV9tbV9pbml0KCkgdG8gY3JlYXRlCiAJICBhIEdUVCBEUk0gTU0gb2JqZWN0LCB3aGljaCBwcm92aWRlcyBhbiBhZGRyZXNzIHNwYWNlIHBvb2wgZm9yCi0JICBvYmplY3QgYWxsb2NhdGlvbi4gIEluIGEgS01TIGNvbmZpZ3VyYXRpb24sIHRoZSBkcml2ZXIgd2lsbAotCSAgbmVlZCB0byBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGNvbW1hbmQgcmluZyBidWZmZXIgZm9sbG93aW5nCi0JICBiYXNpYyBHRU0gaW5pdGlhbGl6YXRpb24uICBNb3N0IFVNQSBkZXZpY2VzIGhhdmUgYSBzby1jYWxsZWQKKwkgIG9iamVjdCBhbGxvY2F0aW9uLiAgSW4gYSBLTVMgY29uZmlndXJhdGlvbiwgdGhlIGRyaXZlcgorCSAgbmVlZHMgdG8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjb21tYW5kIHJpbmcgYnVmZmVyIGZvbGxvd2luZworCSAgY29yZSBHRU0gaW5pdGlhbGl6YXRpb24uICBBIFVNQSBkZXZpY2UgdXN1YWxseSBoYXMgd2hhdCBpcyBjYWxsZWQgYQogCSAgInN0b2xlbiIgbWVtb3J5IHJlZ2lvbiwgd2hpY2ggcHJvdmlkZXMgc3BhY2UgZm9yIHRoZSBpbml0aWFsCiAJICBmcmFtZWJ1ZmZlciBhbmQgbGFyZ2UsIGNvbnRpZ3VvdXMgbWVtb3J5IHJlZ2lvbnMgcmVxdWlyZWQgYnkgdGhlCi0JICBkZXZpY2UuICBUaGlzIHNwYWNlIGlzIG5vdCB0eXBpY2FsbHkgbWFuYWdlZCBieSBHRU0sIGFuZCBtdXN0CisJICBkZXZpY2UuICBUaGlzIHNwYWNlIGlzIG5vdCB0eXBpY2FsbHkgbWFuYWdlZCBieSBHRU0sIGFuZCBpdCBtdXN0CiAJICBiZSBpbml0aWFsaXplZCBzZXBhcmF0ZWx5IGludG8gaXRzIG93biBEUk0gTU0gb2JqZWN0LgogCTwvcGFyYT4KIAk8cGFyYT4KLQkgIEluaXRpYWxpemF0aW9uIHdpbGwgYmUgZHJpdmVyIHNwZWNpZmljLCBhbmQgd2lsbCBkZXBlbmQgb24KLQkgIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGRldmljZS4gIEluIHRoZSBjYXNlIG9mIEludGVsCisJICBJbml0aWFsaXphdGlvbiBpcyBkcml2ZXItc3BlY2lmaWMuIEluIHRoZSBjYXNlIG9mIEludGVsCiAJICBpbnRlZ3JhdGVkIGdyYXBoaWNzIGNoaXBzIGxpa2UgOTY1R00sIEdFTSBpbml0aWFsaXphdGlvbiBjYW4KIAkgIGJlIGRvbmUgYnkgY2FsbGluZyB0aGUgaW50ZXJuYWwgR0VNIGluaXQgZnVuY3Rpb24sCiAJICBpOTE1X2dlbV9kb19pbml0KCkuICBTaW5jZSB0aGUgOTY1R00gaXMgYSBVTUEgZGV2aWNlCi0JICAoaS5lLiBpdCBkb2Vzbid0IGhhdmUgZGVkaWNhdGVkIFZSQU0pLCBHRU0gd2lsbCBtYW5hZ2UKKwkgIChpLmUuIGl0IGRvZXNuJ3QgaGF2ZSBkZWRpY2F0ZWQgVlJBTSksIEdFTSBtYW5hZ2VzCiAJICBtYWtpbmcgcmVndWxhciBSQU0gYXZhaWxhYmxlIGZvciBHUFUgb3BlcmF0aW9ucy4gIE1lbW9yeSBzZXQKIAkgIGFzaWRlIGJ5IHRoZSBCSU9TIChjYWxsZWQgInN0b2xlbiIgbWVtb3J5IGJ5IHRoZSBpOTE1Ci0JICBkcml2ZXIpIHdpbGwgYmUgbWFuYWdlZCBieSB0aGUgRFJNIG1lbXJhbmdlIGFsbG9jYXRvcjsgdGhlCi0JICByZXN0IG9mIHRoZSBhcGVydHVyZSB3aWxsIGJlIG1hbmFnZWQgYnkgR0VNLgorCSAgZHJpdmVyKSBpcyBtYW5hZ2VkIGJ5IHRoZSBEUk0gbWVtcmFuZ2UgYWxsb2NhdG9yOyB0aGUKKwkgIHJlc3Qgb2YgdGhlIGFwZXJ0dXJlIGlzIG1hbmFnZWQgYnkgR0VNLgogCSAgPHByb2dyYW1saXN0aW5nPgogCSAgICAvKiBCYXNpYyBtZW1yYW5nZSBhbGxvY2F0b3IgZm9yIHN0b2xlbiBzcGFjZSAoYWthIHZyYW0pICovCiAJICAgIGRybV9tZW1yYW5nZV9pbml0KCZhbXA7ZGV2X3ByaXYtPnZyYW0sIDAsIHByZWFsbG9jX3NpemUpOwpAQCAtNDgzLDcgKzQ4MCw3IEBACiA8IS0tIUVkcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1yYW5nZS5jLS0+CiAJPC9wYXJhPgogCTxwYXJhPgotCSAgT25jZSB0aGUgbWVtb3J5IG1hbmFnZXIgaGFzIGJlZW4gc2V0IHVwLCB3ZSBjYW4gYWxsb2NhdGUgdGhlCisJICBPbmNlIHRoZSBtZW1vcnkgbWFuYWdlciBoYXMgYmVlbiBzZXQgdXAsIHdlIG1heSBhbGxvY2F0ZSB0aGUKIAkgIGNvbW1hbmQgYnVmZmVyLiAgSW4gdGhlIGk5MTUgY2FzZSwgdGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBhCiAJICBHRU0gZnVuY3Rpb24sIGk5MTVfZ2VtX2luaXRfcmluZ2J1ZmZlcigpLgogCTwvcGFyYT4KQEAgLTQ5MywxNiArNDkwLDI1IEBACiAgICAgPHNlY3QyPgogICAgICAgPHRpdGxlPk91dHB1dCBjb25maWd1cmF0aW9uPC90aXRsZT4KICAgICAgIDxwYXJhPgotCVRoZSBmaW5hbCBpbml0aWFsaXphdGlvbiB0YXNrIGlzIG91dHB1dCBjb25maWd1cmF0aW9uLiAgVGhpcyBpbnZvbHZlcwotCWZpbmRpbmcgYW5kIGluaXRpYWxpemluZyB0aGUgQ1JUQ3MsIGVuY29kZXJzIGFuZCBjb25uZWN0b3JzCi0JZm9yIHlvdXIgZGV2aWNlLCBjcmVhdGluZyBhbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gYW5kCi0JcmVnaXN0ZXJpbmcgYSBmcmFtZWJ1ZmZlciBjb25zb2xlIGRyaXZlci4KKwlUaGUgZmluYWwgaW5pdGlhbGl6YXRpb24gdGFzayBpcyBvdXRwdXQgY29uZmlndXJhdGlvbi4gIFRoaXMgaW52b2x2ZXM6CisJPGl0ZW1pemVkbGlzdD4KKwkgIDxsaXN0aXRlbT4KKwkgICAgRmluZGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBDUlRDcywgZW5jb2RlcnMsIGFuZCBjb25uZWN0b3JzCisJICAgIGZvciB0aGUgZGV2aWNlLgorCSAgPC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT4KKwkgICAgQ3JlYXRpbmcgYW4gaW5pdGlhbCBjb25maWd1cmF0aW9uLgorCSAgPC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT4KKwkgICAgUmVnaXN0ZXJpbmcgYSBmcmFtZWJ1ZmZlciBjb25zb2xlIGRyaXZlci4KKwkgIDwvbGlzdGl0ZW0+CisJPC9pdGVtaXplZGxpc3Q+CiAgICAgICA8L3BhcmE+CiAgICAgICA8c2VjdDM+CiAJPHRpdGxlPk91dHB1dCBkaXNjb3ZlcnkgYW5kIGluaXRpYWxpemF0aW9uPC90aXRsZT4KIAk8cGFyYT4KLQkgIFNldmVyYWwgY29yZSBmdW5jdGlvbnMgZXhpc3QgdG8gY3JlYXRlIENSVENzLCBlbmNvZGVycyBhbmQKLQkgIGNvbm5lY3RvcnMsIG5hbWVseSBkcm1fY3J0Y19pbml0KCksIGRybV9jb25uZWN0b3JfaW5pdCgpIGFuZAorCSAgU2V2ZXJhbCBjb3JlIGZ1bmN0aW9ucyBleGlzdCB0byBjcmVhdGUgQ1JUQ3MsIGVuY29kZXJzLCBhbmQKKwkgIGNvbm5lY3RvcnMsIG5hbWVseTogZHJtX2NydGNfaW5pdCgpLCBkcm1fY29ubmVjdG9yX2luaXQoKSwgYW5kCiAJICBkcm1fZW5jb2Rlcl9pbml0KCksIGFsb25nIHdpdGggc2V2ZXJhbCAiaGVscGVyIiBmdW5jdGlvbnMgdG8KIAkgIHBlcmZvcm0gY29tbW9uIHRhc2tzLgogCTwvcGFyYT4KQEAgLTU1NSwxMCArNTYxLDEwIEBACiAJPC9wcm9ncmFtbGlzdGluZz4KIAk8cGFyYT4KIAkgIEluIHRoZSBleGFtcGxlIGFib3ZlIChhZ2FpbiwgdGFrZW4gZnJvbSB0aGUgaTkxNSBkcml2ZXIpLCBhCi0JICBDUlQgY29ubmVjdG9yIGFuZCBlbmNvZGVyIGNvbWJpbmF0aW9uIGlzIGNyZWF0ZWQuICBBIGRldmljZQotCSAgc3BlY2lmaWMgaTJjIGJ1cyBpcyBhbHNvIGNyZWF0ZWQsIGZvciBmZXRjaGluZyBFRElEIGRhdGEgYW5kCisJICBDUlQgY29ubmVjdG9yIGFuZCBlbmNvZGVyIGNvbWJpbmF0aW9uIGlzIGNyZWF0ZWQuICBBIGRldmljZS1zcGVjaWZpYworCSAgaTJjIGJ1cyBpcyBhbHNvIGNyZWF0ZWQgZm9yIGZldGNoaW5nIEVESUQgZGF0YSBhbmQKIAkgIHBlcmZvcm1pbmcgbW9uaXRvciBkZXRlY3Rpb24uICBPbmNlIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlLAotCSAgdGhlIG5ldyBjb25uZWN0b3IgaXMgcmVnaXN0ZXJlZCB3aXRoIHN5c2ZzLCB0byBtYWtlIGl0cworCSAgdGhlIG5ldyBjb25uZWN0b3IgaXMgcmVnaXN0ZXJlZCB3aXRoIHN5c2ZzIHRvIG1ha2UgaXRzCiAJICBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMuCiAJPC9wYXJhPgogCTxzZWN0ND4KQEAgLTU2NywxMiArNTczLDEyIEBACiAJICAgIFNpbmNlIG1hbnkgUEMtY2xhc3MgZ3JhcGhpY3MgZGV2aWNlcyBoYXZlIHNpbWlsYXIgZGlzcGxheSBvdXRwdXQKIAkgICAgZGVzaWducywgdGhlIERSTSBwcm92aWRlcyBhIHNldCBvZiBoZWxwZXIgZnVuY3Rpb25zIHRvIG1ha2UKIAkgICAgb3V0cHV0IG1hbmFnZW1lbnQgZWFzaWVyLiAgVGhlIGNvcmUgaGVscGVyIHJvdXRpbmVzIGhhbmRsZQotCSAgICBlbmNvZGVyIHJlLXJvdXRpbmcgYW5kIGRpc2FibGluZyBvZiB1bnVzZWQgZnVuY3Rpb25zIGZvbGxvd2luZwotCSAgICBtb2RlIHNldC4gIFVzaW5nIHRoZSBoZWxwZXJzIGlzIG9wdGlvbmFsLCBidXQgcmVjb21tZW5kZWQgZm9yCisJICAgIGVuY29kZXIgcmUtcm91dGluZyBhbmQgdGhlIGRpc2FibGluZyBvZiB1bnVzZWQgZnVuY3Rpb25zIGZvbGxvd2luZworCSAgICBtb2RlIHNldHRpbmcuICBVc2luZyB0aGUgaGVscGVycyBpcyBvcHRpb25hbCwgYnV0IHJlY29tbWVuZGVkIGZvcgogCSAgICBkZXZpY2VzIHdpdGggUEMtc3R5bGUgYXJjaGl0ZWN0dXJlcyAoaS5lLiBhIHNldCBvZiBkaXNwbGF5IHBsYW5lcwogCSAgICBmb3IgZmVlZGluZyBwaXhlbHMgdG8gZW5jb2RlcnMgd2hpY2ggYXJlIGluIHR1cm4gcm91dGVkIHRvCiAJICAgIGNvbm5lY3RvcnMpLiAgRGV2aWNlcyB3aXRoIG1vcmUgY29tcGxleCByZXF1aXJlbWVudHMgbmVlZGluZwotCSAgICBmaW5lciBncmFpbmVkIG1hbmFnZW1lbnQgY2FuIG9wdCB0byB1c2UgdGhlIGNvcmUgY2FsbGJhY2tzCisJICAgIGZpbmVyIGdyYWluZWQgbWFuYWdlbWVudCBtYXkgb3B0IHRvIHVzZSB0aGUgY29yZSBjYWxsYmFja3MKIAkgICAgZGlyZWN0bHkuCiAJICA8L3BhcmE+CiAJICA8cGFyYT4KQEAgLTU4MCwxNyArNTg2LDI1IEBACiAJICA8L3BhcmE+CiAJPC9zZWN0ND4KIAk8cGFyYT4KLQkgIEZvciBlYWNoIGVuY29kZXIsIENSVEMgYW5kIGNvbm5lY3Rvciwgc2V2ZXJhbCBmdW5jdGlvbnMgbXVzdAotCSAgYmUgcHJvdmlkZWQsIGRlcGVuZGluZyBvbiB0aGUgb2JqZWN0IHR5cGUuICBFbmNvZGVyIG9iamVjdHMKLQkgIG5lZWQgdG8gcHJvdmlkZSBhIERQTVMgKGJhc2ljYWxseSBvbi9vZmYpIGZ1bmN0aW9uLCBtb2RlIGZpeHVwCi0JICAoZm9yIGNvbnZlcnRpbmcgcmVxdWVzdGVkIG1vZGVzIGludG8gbmF0aXZlIGhhcmR3YXJlIHRpbWluZ3MpLAotCSAgYW5kIHByZXBhcmUsIHNldCBhbmQgY29tbWl0IGZ1bmN0aW9ucyBmb3IgdXNlIGJ5IHRoZSBjb3JlIERSTQotCSAgaGVscGVyIGZ1bmN0aW9ucy4gIENvbm5lY3RvciBoZWxwZXJzIG5lZWQgdG8gcHJvdmlkZSBtb2RlIGZldGNoIGFuZAotCSAgdmFsaWRpdHkgZnVuY3Rpb25zIGFzIHdlbGwgYXMgYW4gZW5jb2RlciBtYXRjaGluZyBmdW5jdGlvbiBmb3IKLQkgIHJldHVybmluZyBhbiBpZGVhbCBlbmNvZGVyIGZvciBhIGdpdmVuIGNvbm5lY3Rvci4gIFRoZSBjb3JlCi0JICBjb25uZWN0b3IgZnVuY3Rpb25zIGluY2x1ZGUgYSBEUE1TIGNhbGxiYWNrLCAoZGVwcmVjYXRlZCkKLQkgIHNhdmUvcmVzdG9yZSByb3V0aW5lcywgZGV0ZWN0aW9uLCBtb2RlIHByb2JpbmcsIHByb3BlcnR5IGhhbmRsaW5nLAotCSAgYW5kIGNsZWFudXAgZnVuY3Rpb25zLgorCSAgRWFjaCBlbmNvZGVyIG9iamVjdCBuZWVkcyB0byBwcm92aWRlOgorCSAgPGl0ZW1pemVkbGlzdD4KKwkgICAgPGxpc3RpdGVtPgorCSAgICAgIEEgRFBNUyAoYmFzaWNhbGx5IG9uL29mZikgZnVuY3Rpb24uCisJICAgIDwvbGlzdGl0ZW0+CisJICAgIDxsaXN0aXRlbT4KKwkgICAgICBBIG1vZGUtZml4dXAgZnVuY3Rpb24gKGZvciBjb252ZXJ0aW5nIHJlcXVlc3RlZCBtb2RlcyBpbnRvCisJICAgICAgbmF0aXZlIGhhcmR3YXJlIHRpbWluZ3MpLgorCSAgICA8L2xpc3RpdGVtPgorCSAgICA8bGlzdGl0ZW0+CisJICAgICAgRnVuY3Rpb25zIChwcmVwYXJlLCBzZXQsIGFuZCBjb21taXQpIGZvciB1c2UgYnkgdGhlIGNvcmUgRFJNCisJICAgICAgaGVscGVyIGZ1bmN0aW9ucy4KKwkgICAgPC9saXN0aXRlbT4KKwkgIDwvaXRlbWl6ZWRsaXN0PgorCSAgQ29ubmVjdG9yIGhlbHBlcnMgbmVlZCB0byBwcm92aWRlIGZ1bmN0aW9ucyAobW9kZS1mZXRjaCwgdmFsaWRpdHksCisJICBhbmQgZW5jb2Rlci1tYXRjaGluZykgZm9yIHJldHVybmluZyBhbiBpZGVhbCBlbmNvZGVyIGZvciBhIGdpdmVuCisJICBjb25uZWN0b3IuICBUaGUgY29yZSBjb25uZWN0b3IgZnVuY3Rpb25zIGluY2x1ZGUgYSBEUE1TIGNhbGxiYWNrLAorCSAgc2F2ZS9yZXN0b3JlIHJvdXRpbmVzIChkZXByZWNhdGVkKSwgZGV0ZWN0aW9uLCBtb2RlIHByb2JpbmcsCisJICBwcm9wZXJ0eSBoYW5kbGluZywgYW5kIGNsZWFudXAgZnVuY3Rpb25zLgogCTwvcGFyYT4KIDwhLS0hRWRyaXZlcnMvY2hhci9kcm0vZHJtX2NydGMuaC0tPgogPCEtLSFFZHJpdmVycy9jaGFyL2RybS9kcm1fY3J0Yy5jLS0+CkBAIC02MDUsMjMgKzYxOSwzNCBAQAogICAgIDx0aXRsZT5WQmxhbmsgZXZlbnQgaGFuZGxpbmc8L3RpdGxlPgogICAgIDxwYXJhPgogICAgICAgVGhlIERSTSBjb3JlIGV4cG9zZXMgdHdvIHZlcnRpY2FsIGJsYW5rIHJlbGF0ZWQgaW9jdGxzOgotICAgICAgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LIGFuZCBEUk1fSU9DVExfTU9ERVNFVF9DVEwuCisgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPkRSTV9JT0NUTF9XQUlUX1ZCTEFOSzwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhpcyB0YWtlcyBhIHN0cnVjdCBkcm1fd2FpdF92Ymxhbmsgc3RydWN0dXJlIGFzIGl0cyBhcmd1bWVudCwKKyAgICAgICAgICAgICAgYW5kIGl0IGlzIHVzZWQgdG8gYmxvY2sgb3IgcmVxdWVzdCBhIHNpZ25hbCB3aGVuIGEgc3BlY2lmaWVkCisgICAgICAgICAgICAgIHZibGFuayBldmVudCBvY2N1cnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+RFJNX0lPQ1RMX01PREVTRVRfQ1RMPC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgYXBwbGljYXRpb24gbGV2ZWwgZHJpdmVycyBiZWZvcmUgYW5kCisgICAgICAgICAgICAgIGFmdGVyIG1vZGUgc2V0dGluZywgc2luY2Ugb24gbWFueSBkZXZpY2VzIHRoZSB2ZXJ0aWNhbCBibGFuaworICAgICAgICAgICAgICBjb3VudGVyIGlzIHJlc2V0IGF0IHRoYXQgdGltZS4gIEludGVybmFsbHksIHRoZSBEUk0gc25hcHNob3RzCisgICAgICAgICAgICAgIHRoZSBsYXN0IHZibGFuayBjb3VudCB3aGVuIHRoZSBpb2N0bCBpcyBjYWxsZWQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgX0RSTV9QUkVfTU9ERVNFVCBjb21tYW5kLCBzbyB0aGF0IHRoZSBjb3VudGVyIHdvbid0IGdvIGJhY2t3YXJkcworICAgICAgICAgICAgICAod2hpY2ggaXMgZGVhbHQgd2l0aCB3aGVuIF9EUk1fUE9TVF9NT0RFU0VUIGlzIHVzZWQpLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPC92YXJpYWJsZWxpc3Q+CiA8IS0tIUVkcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYy0tPgogICAgIDwvcGFyYT4KICAgICA8cGFyYT4KLSAgICAgIERSTV9JT0NUTF9XQUlUX1ZCTEFOSyB0YWtlcyBhIHN0cnVjdCBkcm1fd2FpdF92Ymxhbmsgc3RydWN0dXJlCi0gICAgICBhcyBpdHMgYXJndW1lbnQsIGFuZCBpcyB1c2VkIHRvIGJsb2NrIG9yIHJlcXVlc3QgYSBzaWduYWwgd2hlbiBhCi0gICAgICBzcGVjaWZpZWQgdmJsYW5rIGV2ZW50IG9jY3Vycy4KLSAgICA8L3BhcmE+Ci0gICAgPHBhcmE+Ci0gICAgICBEUk1fSU9DVExfTU9ERVNFVF9DVEwgc2hvdWxkIGJlIGNhbGxlZCBieSBhcHBsaWNhdGlvbiBsZXZlbAotICAgICAgZHJpdmVycyBiZWZvcmUgYW5kIGFmdGVyIG1vZGUgc2V0dGluZywgc2luY2Ugb24gbWFueSBkZXZpY2VzIHRoZQotICAgICAgdmVydGljYWwgYmxhbmsgY291bnRlciB3aWxsIGJlIHJlc2V0IGF0IHRoYXQgdGltZS4gIEludGVybmFsbHksCi0gICAgICB0aGUgRFJNIHNuYXBzaG90cyB0aGUgbGFzdCB2YmxhbmsgY291bnQgd2hlbiB0aGUgaW9jdGwgaXMgY2FsbGVkCi0gICAgICB3aXRoIHRoZSBfRFJNX1BSRV9NT0RFU0VUIGNvbW1hbmQgc28gdGhhdCB0aGUgY291bnRlciB3b24ndCBnbwotICAgICAgYmFja3dhcmRzICh3aGljaCBpcyBkZWFsdCB3aXRoIHdoZW4gX0RSTV9QT1NUX01PREVTRVQgaXMgdXNlZCkuCi0gICAgPC9wYXJhPgotICAgIDxwYXJhPgogICAgICAgVG8gc3VwcG9ydCB0aGUgZnVuY3Rpb25zIGFib3ZlLCB0aGUgRFJNIGNvcmUgcHJvdmlkZXMgc2V2ZXJhbAogICAgICAgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdHJhY2tpbmcgdmVydGljYWwgYmxhbmsgY291bnRlcnMsIGFuZAogICAgICAgcmVxdWlyZXMgZHJpdmVycyB0byBwcm92aWRlIHNldmVyYWwgY2FsbGJhY2tzOgpAQCAtNjMyLDI0ICs2NTcsMjQgQEAKICAgICAgIHJlZ2lzdGVyLiAgVGhlIGVuYWJsZSBhbmQgZGlzYWJsZSB2YmxhbmsgY2FsbGJhY2tzIHNob3VsZCBlbmFibGUKICAgICAgIGFuZCBkaXNhYmxlIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdHMsIHJlc3BlY3RpdmVseS4gIEluIHRoZQogICAgICAgYWJzZW5jZSBvZiBEUk0gY2xpZW50cyB3YWl0aW5nIG9uIHZibGFuayBldmVudHMsIHRoZSBjb3JlIERSTQotICAgICAgY29kZSB3aWxsIHVzZSB0aGUgZGlzYWJsZV92YmxhbmsoKSBmdW5jdGlvbiB0byBkaXNhYmxlCi0gICAgICBpbnRlcnJ1cHRzLCB3aGljaCBzYXZlcyBwb3dlci4gIFRoZXknbGwgYmUgcmUtZW5hYmxlZCBhZ2FpbiB3aGVuCisgICAgICBjb2RlIHVzZXMgdGhlIGRpc2FibGVfdmJsYW5rKCkgZnVuY3Rpb24gdG8gZGlzYWJsZQorICAgICAgaW50ZXJydXB0cywgd2hpY2ggc2F2ZXMgcG93ZXIuICBUaGV5IGFyZSByZS1lbmFibGVkIGFnYWluIHdoZW4KICAgICAgIGEgY2xpZW50IGNhbGxzIHRoZSB2Ymxhbmsgd2FpdCBpb2N0bCBhYm92ZS4KICAgICA8L3BhcmE+CiAgICAgPHBhcmE+Ci0gICAgICBEZXZpY2VzIHRoYXQgZG9uJ3QgcHJvdmlkZSBhIGNvdW50IHJlZ2lzdGVyIGNhbiBzaW1wbHkgdXNlIGFuCisgICAgICBBIGRldmljZSB0aGF0IGRvZXNuJ3QgcHJvdmlkZSBhIGNvdW50IHJlZ2lzdGVyIG1heSBzaW1wbHkgdXNlIGFuCiAgICAgICBpbnRlcm5hbCBhdG9taWMgY291bnRlciBpbmNyZW1lbnRlZCBvbiBldmVyeSB2ZXJ0aWNhbCBibGFuawotICAgICAgaW50ZXJydXB0LCBhbmQgY2FuIG1ha2UgdGhlaXIgZW5hYmxlIGFuZCBkaXNhYmxlIHZibGFuawotICAgICAgZnVuY3Rpb25zIGludG8gbm8tb3BzLgorICAgICAgaW50ZXJydXB0IChhbmQgdGhlbiB0cmVhdCB0aGUgZW5hYmxlX3ZibGFuaygpIGFuZCBkaXNhYmxlX3ZibGFuaygpCisgICAgICBjYWxsYmFja3MgYXMgbm8tb3BzKS4KICAgICA8L3BhcmE+CiAgIDwvc2VjdDE+CiAKICAgPHNlY3QxPgogICAgIDx0aXRsZT5NZW1vcnkgbWFuYWdlbWVudDwvdGl0bGU+CiAgICAgPHBhcmE+Ci0gICAgICBUaGUgbWVtb3J5IG1hbmFnZXIgbGllcyBhdCB0aGUgaGVhcnQgb2YgbWFueSBEUk0gb3BlcmF0aW9ucywgYW5kCi0gICAgICBpcyBhbHNvIHJlcXVpcmVkIHRvIHN1cHBvcnQgYWR2YW5jZWQgY2xpZW50IGZlYXR1cmVzIGxpa2UgT3BlbkdMCi0gICAgICBwYnVmZmVycy4gIFRoZSBEUk0gY3VycmVudGx5IGNvbnRhaW5zIHR3byBtZW1vcnkgbWFuYWdlcnMsIFRUTQorICAgICAgVGhlIG1lbW9yeSBtYW5hZ2VyIGxpZXMgYXQgdGhlIGhlYXJ0IG9mIG1hbnkgRFJNIG9wZXJhdGlvbnM7IGl0CisgICAgICBpcyByZXF1aXJlZCB0byBzdXBwb3J0IGFkdmFuY2VkIGNsaWVudCBmZWF0dXJlcyBsaWtlIE9wZW5HTAorICAgICAgcGJ1ZmZlcnMuICBUaGUgRFJNIGN1cnJlbnRseSBjb250YWlucyB0d28gbWVtb3J5IG1hbmFnZXJzOiBUVE0KICAgICAgIGFuZCBHRU0uCiAgICAgPC9wYXJhPgogCkBAIC02NzksNDEgKzcwNCw0NiBAQAogICAgICAgPHBhcmE+CiAJR0VNLWVuYWJsZWQgZHJpdmVycyBtdXN0IHByb3ZpZGUgZ2VtX2luaXRfb2JqZWN0KCkgYW5kCiAJZ2VtX2ZyZWVfb2JqZWN0KCkgY2FsbGJhY2tzIHRvIHN1cHBvcnQgdGhlIGNvcmUgbWVtb3J5Ci0JYWxsb2NhdGlvbiByb3V0aW5lcy4gIFRoZXkgc2hvdWxkIGFsc28gcHJvdmlkZSBzZXZlcmFsIGRyaXZlcgotCXNwZWNpZmljIGlvY3RscyB0byBzdXBwb3J0IGNvbW1hbmQgZXhlY3V0aW9uLCBwaW5uaW5nLCBidWZmZXIKKwlhbGxvY2F0aW9uIHJvdXRpbmVzLiAgVGhleSBzaG91bGQgYWxzbyBwcm92aWRlIHNldmVyYWwgZHJpdmVyLXNwZWNpZmljCisJaW9jdGxzIHRvIHN1cHBvcnQgY29tbWFuZCBleGVjdXRpb24sIHBpbm5pbmcsIGJ1ZmZlcgogCXJlYWQgJmFtcDsgd3JpdGUsIG1hcHBpbmcsIGFuZCBkb21haW4gb3duZXJzaGlwIHRyYW5zZmVycy4KICAgICAgIDwvcGFyYT4KICAgICAgIDxwYXJhPgotCU9uIGEgZnVuZGFtZW50YWwgbGV2ZWwsIEdFTSBpbnZvbHZlcyBzZXZlcmFsIG9wZXJhdGlvbnM6IG1lbW9yeQotCWFsbG9jYXRpb24gYW5kIGZyZWVpbmcsIGNvbW1hbmQgZXhlY3V0aW9uLCBhbmQgYXBlcnR1cmUgbWFuYWdlbWVudAotCWF0IGNvbW1hbmQgZXhlY3V0aW9uIHRpbWUuICBCdWZmZXIgb2JqZWN0IGFsbG9jYXRpb24gaXMgcmVsYXRpdmVseQorCU9uIGEgZnVuZGFtZW50YWwgbGV2ZWwsIEdFTSBpbnZvbHZlcyBzZXZlcmFsIG9wZXJhdGlvbnM6CisJPGl0ZW1pemVkbGlzdD4KKwkgIDxsaXN0aXRlbT5NZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZzwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+Q29tbWFuZCBleGVjdXRpb248L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPkFwZXJ0dXJlIG1hbmFnZW1lbnQgYXQgY29tbWFuZCBleGVjdXRpb24gdGltZTwvbGlzdGl0ZW0+CisJPC9pdGVtaXplZGxpc3Q+CisJQnVmZmVyIG9iamVjdCBhbGxvY2F0aW9uIGlzIHJlbGF0aXZlbHkKIAlzdHJhaWdodGZvcndhcmQgYW5kIGxhcmdlbHkgcHJvdmlkZWQgYnkgTGludXgncyBzaG1lbSBsYXllciwgd2hpY2gKIAlwcm92aWRlcyBtZW1vcnkgdG8gYmFjayBlYWNoIG9iamVjdC4gIFdoZW4gbWFwcGVkIGludG8gdGhlIEdUVAogCW9yIHVzZWQgaW4gYSBjb21tYW5kIGJ1ZmZlciwgdGhlIGJhY2tpbmcgcGFnZXMgZm9yIGFuIG9iamVjdCBhcmUKIAlmbHVzaGVkIHRvIG1lbW9yeSBhbmQgbWFya2VkIHdyaXRlIGNvbWJpbmVkIHNvIGFzIHRvIGJlIGNvaGVyZW50Ci0Jd2l0aCB0aGUgR1BVLiAgTGlrZXdpc2UsIHdoZW4gdGhlIEdQVSBmaW5pc2hlcyByZW5kZXJpbmcgdG8gYW4gb2JqZWN0LAotCWlmIHRoZSBDUFUgYWNjZXNzZXMgaXQsIGl0IG11c3QgYmUgbWFkZSBjb2hlcmVudCB3aXRoIHRoZSBDUFUncyB2aWV3CisJd2l0aCB0aGUgR1BVLiAgTGlrZXdpc2UsIGlmIHRoZSBDUFUgYWNjZXNzZXMgYW4gb2JqZWN0IGFmdGVyIHRoZSBHUFUKKwloYXMgZmluaXNoZWQgcmVuZGVyaW5nIHRvIHRoZSBvYmplY3QsIHRoZW4gdGhlIG9iamVjdCBtdXN0IGJlIG1hZGUKKwljb2hlcmVudCB3aXRoIHRoZSBDUFUncyB2aWV3CiAJb2YgbWVtb3J5LCB1c3VhbGx5IGludm9sdmluZyBHUFUgY2FjaGUgZmx1c2hpbmcgb2YgdmFyaW91cyBraW5kcy4KLQlUaGlzIGNvcmUgQ1BVJmx0Oy0mZ3Q7R1BVIGNvaGVyZW5jeSBtYW5hZ2VtZW50IGlzIHByb3ZpZGVkIGJ5IHRoZSBHRU0KLQlzZXQgZG9tYWluIGZ1bmN0aW9uLCB3aGljaCBldmFsdWF0ZXMgYW4gb2JqZWN0J3MgY3VycmVudCBkb21haW4gYW5kCisJVGhpcyBjb3JlIENQVSZsdDstJmd0O0dQVSBjb2hlcmVuY3kgbWFuYWdlbWVudCBpcyBwcm92aWRlZCBieSBhCisJZGV2aWNlLXNwZWNpZmljIGlvY3RsLCB3aGljaCBldmFsdWF0ZXMgYW4gb2JqZWN0J3MgY3VycmVudCBkb21haW4gYW5kCiAJcGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBmbHVzaGluZyBvciBzeW5jaHJvbml6YXRpb24gdG8gcHV0IHRoZSBvYmplY3QKIAlpbnRvIHRoZSBkZXNpcmVkIGNvaGVyZW5jeSBkb21haW4gKG5vdGUgdGhhdCB0aGUgb2JqZWN0IG1heSBiZSBidXN5LAotCWkuZS4gYW4gYWN0aXZlIHJlbmRlciB0YXJnZXQ7IGluIHRoYXQgY2FzZSB0aGUgc2V0IGRvbWFpbiBmdW5jdGlvbgotCXdpbGwgYmxvY2sgdGhlIGNsaWVudCBhbmQgd2FpdCBmb3IgcmVuZGVyaW5nIHRvIGNvbXBsZXRlIGJlZm9yZQorCWkuZS4gYW4gYWN0aXZlIHJlbmRlciB0YXJnZXQ7IGluIHRoYXQgY2FzZSwgc2V0dGluZyB0aGUgZG9tYWluCisJYmxvY2tzIHRoZSBjbGllbnQgYW5kIHdhaXRzIGZvciByZW5kZXJpbmcgdG8gY29tcGxldGUgYmVmb3JlCiAJcGVyZm9ybWluZyBhbnkgbmVjZXNzYXJ5IGZsdXNoaW5nIG9wZXJhdGlvbnMpLgogICAgICAgPC9wYXJhPgogICAgICAgPHBhcmE+CiAJUGVyaGFwcyB0aGUgbW9zdCBpbXBvcnRhbnQgR0VNIGZ1bmN0aW9uIGlzIHByb3ZpZGluZyBhIGNvbW1hbmQKIAlleGVjdXRpb24gaW50ZXJmYWNlIHRvIGNsaWVudHMuICBDbGllbnQgcHJvZ3JhbXMgY29uc3RydWN0IGNvbW1hbmQKLQlidWZmZXJzIGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkgb2JqZWN0cwotCWFuZCBzdWJtaXQgdGhlbSB0byBHRU0uICBBdCB0aGF0IHBvaW50LCBHRU0gd2lsbCB0YWtlIGNhcmUgdG8gYmluZAorCWJ1ZmZlcnMgY29udGFpbmluZyByZWZlcmVuY2VzIHRvIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeSBvYmplY3RzLAorCWFuZCB0aGVuIHN1Ym1pdCB0aGVtIHRvIEdFTS4gIEF0IHRoYXQgcG9pbnQsIEdFTSB0YWtlcyBjYXJlIHRvIGJpbmQKIAlhbGwgdGhlIG9iamVjdHMgaW50byB0aGUgR1RULCBleGVjdXRlIHRoZSBidWZmZXIsIGFuZCBwcm92aWRlCiAJbmVjZXNzYXJ5IHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIGNsaWVudHMgYWNjZXNzaW5nIHRoZSBzYW1lIGJ1ZmZlcnMuCiAJVGhpcyBvZnRlbiBpbnZvbHZlcyBldmljdGluZyBzb21lIG9iamVjdHMgZnJvbSB0aGUgR1RUIGFuZCByZS1iaW5kaW5nCiAJb3RoZXJzIChhIGZhaXJseSBleHBlbnNpdmUgb3BlcmF0aW9uKSwgYW5kIHByb3ZpZGluZyByZWxvY2F0aW9uCiAJc3VwcG9ydCB3aGljaCBoaWRlcyBmaXhlZCBHVFQgb2Zmc2V0cyBmcm9tIGNsaWVudHMuICBDbGllbnRzIG11c3QKIAl0YWtlIGNhcmUgbm90IHRvIHN1Ym1pdCBjb21tYW5kIGJ1ZmZlcnMgdGhhdCByZWZlcmVuY2UgbW9yZSBvYmplY3RzCi0JdGhhbiBjYW4gZml0IGluIHRoZSBHVFQgb3IgR0VNIHdpbGwgcmVqZWN0IHRoZW0gYW5kIG5vIHJlbmRlcmluZworCXRoYW4gY2FuIGZpdCBpbiB0aGUgR1RUOyBvdGhlcndpc2UsIEdFTSB3aWxsIHJlamVjdCB0aGVtIGFuZCBubyByZW5kZXJpbmcKIAl3aWxsIG9jY3VyLiAgU2ltaWxhcmx5LCBpZiBzZXZlcmFsIG9iamVjdHMgaW4gdGhlIGJ1ZmZlciByZXF1aXJlCiAJZmVuY2UgcmVnaXN0ZXJzIHRvIGJlIGFsbG9jYXRlZCBmb3IgY29ycmVjdCByZW5kZXJpbmcgKGUuZy4gMkQgYmxpdHMKIAlvbiBwcmUtOTY1IGNoaXBzKSwgY2FyZSBtdXN0IGJlIHRha2VuIG5vdCB0byByZXF1aXJlIG1vcmUgZmVuY2UKQEAgLTcyOSw3ICs3NTksNyBAQAogICAgIDx0aXRsZT5PdXRwdXQgbWFuYWdlbWVudDwvdGl0bGU+CiAgICAgPHBhcmE+CiAgICAgICBBdCB0aGUgY29yZSBvZiB0aGUgRFJNIG91dHB1dCBtYW5hZ2VtZW50IGNvZGUgaXMgYSBzZXQgb2YKLSAgICAgIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIENSVENzLCBlbmNvZGVycyBhbmQgY29ubmVjdG9ycy4KKyAgICAgIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIENSVENzLCBlbmNvZGVycywgYW5kIGNvbm5lY3RvcnMuCiAgICAgPC9wYXJhPgogICAgIDxwYXJhPgogICAgICAgQSBDUlRDIGlzIGFuIGFic3RyYWN0aW9uIHJlcHJlc2VudGluZyBhIHBhcnQgb2YgdGhlIGNoaXAgdGhhdApAQCAtNzY1LDIxICs3OTUsMTkgQEAKICAgPHNlY3QxPgogICAgIDx0aXRsZT5GcmFtZWJ1ZmZlciBtYW5hZ2VtZW50PC90aXRsZT4KICAgICA8cGFyYT4KLSAgICAgIEluIG9yZGVyIHRvIHNldCBhIG1vZGUgb24gYSBnaXZlbiBDUlRDLCBlbmNvZGVyIGFuZCBjb25uZWN0b3IKLSAgICAgIGNvbmZpZ3VyYXRpb24sIGNsaWVudHMgbmVlZCB0byBwcm92aWRlIGEgZnJhbWVidWZmZXIgb2JqZWN0IHdoaWNoCi0gICAgICB3aWxsIHByb3ZpZGUgYSBzb3VyY2Ugb2YgcGl4ZWxzIGZvciB0aGUgQ1JUQyB0byBkZWxpdmVyIHRvIHRoZSBlbmNvZGVyKHMpCi0gICAgICBhbmQgdWx0aW1hdGVseSB0aGUgY29ubmVjdG9yKHMpIGluIHRoZSBjb25maWd1cmF0aW9uLiAgQSBmcmFtZWJ1ZmZlcgotICAgICAgaXMgZnVuZGFtZW50YWxseSBhIGRyaXZlciBzcGVjaWZpYyBtZW1vcnkgb2JqZWN0LCBtYWRlIGludG8gYW4gb3BhcXVlCi0gICAgICBoYW5kbGUgYnkgdGhlIERSTSBhZGRmYiBmdW5jdGlvbi4gIE9uY2UgYW4gZmIgaGFzIGJlZW4gY3JlYXRlZCB0aGlzCi0gICAgICB3YXkgaXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgS01TIG1vZGUgc2V0dGluZyByb3V0aW5lcyBmb3IgdXNlIGluCi0gICAgICBhIGNvbmZpZ3VyYXRpb24uCisgICAgICBDbGllbnRzIG5lZWQgdG8gcHJvdmlkZSBhIGZyYW1lYnVmZmVyIG9iamVjdCB3aGljaCBwcm92aWRlcyBhIHNvdXJjZQorICAgICAgb2YgcGl4ZWxzIGZvciBhIENSVEMgdG8gZGVsaXZlciB0byB0aGUgZW5jb2RlcihzKSBhbmQgdWx0aW1hdGVseSB0aGUKKyAgICAgIGNvbm5lY3RvcihzKS4gQSBmcmFtZWJ1ZmZlciBpcyBmdW5kYW1lbnRhbGx5IGEgZHJpdmVyLXNwZWNpZmljIG1lbW9yeQorICAgICAgb2JqZWN0LCBtYWRlIGludG8gYW4gb3BhcXVlIGhhbmRsZSBieSB0aGUgRFJNJ3MgYWRkZmIoKSBmdW5jdGlvbi4KKyAgICAgIE9uY2UgYSBmcmFtZWJ1ZmZlciBoYXMgYmVlbiBjcmVhdGVkIHRoaXMgd2F5LCBpdCBtYXkgYmUgcGFzc2VkIHRvIHRoZQorICAgICAgS01TIG1vZGUgc2V0dGluZyByb3V0aW5lcyBmb3IgdXNlIGluIGEgY29tcGxldGVkIGNvbmZpZ3VyYXRpb24uCiAgICAgPC9wYXJhPgogICA8L3NlY3QxPgogCiAgIDxzZWN0MT4KICAgICA8dGl0bGU+Q29tbWFuZCBzdWJtaXNzaW9uICZhbXA7IGZlbmNpbmc8L3RpdGxlPgogICAgIDxwYXJhPgotICAgICAgVGhpcyBzaG91bGQgY292ZXIgYSBmZXcgZGV2aWNlIHNwZWNpZmljIGNvbW1hbmQgc3VibWlzc2lvbgorICAgICAgVGhpcyBzaG91bGQgY292ZXIgYSBmZXcgZGV2aWNlLXNwZWNpZmljIGNvbW1hbmQgc3VibWlzc2lvbgogICAgICAgaW1wbGVtZW50YXRpb25zLgogICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KQEAgLTc4OSw3ICs4MTcsNyBAQAogICAgIDxwYXJhPgogICAgICAgVGhlIERSTSBjb3JlIHByb3ZpZGVzIHNvbWUgc3VzcGVuZC9yZXN1bWUgY29kZSwgYnV0IGRyaXZlcnMKICAgICAgIHdhbnRpbmcgZnVsbCBzdXNwZW5kL3Jlc3VtZSBzdXBwb3J0IHNob3VsZCBwcm92aWRlIHNhdmUoKSBhbmQKLSAgICAgIHJlc3RvcmUoKSBmdW5jdGlvbnMuICBUaGVzZSB3aWxsIGJlIGNhbGxlZCBhdCBzdXNwZW5kLAorICAgICAgcmVzdG9yZSgpIGZ1bmN0aW9ucy4gIFRoZXNlIGFyZSBjYWxsZWQgYXQgc3VzcGVuZCwKICAgICAgIGhpYmVybmF0ZSwgb3IgcmVzdW1lIHRpbWUsIGFuZCBzaG91bGQgcGVyZm9ybSBhbnkgc3RhdGUgc2F2ZSBvcgogICAgICAgcmVzdG9yZSByZXF1aXJlZCBieSB5b3VyIGRldmljZSBhY3Jvc3Mgc3VzcGVuZCBvciBoaWJlcm5hdGUKICAgICAgIHN0YXRlcy4KQEAgLTgxMiw4ICs4NDAsOCBAQAogICAgIDxwYXJhPgogICAgICAgVGhlIERSTSBjb3JlIGV4cG9ydHMgc2V2ZXJhbCBpbnRlcmZhY2VzIHRvIGFwcGxpY2F0aW9ucywKICAgICAgIGdlbmVyYWxseSBpbnRlbmRlZCB0byBiZSB1c2VkIHRocm91Z2ggY29ycmVzcG9uZGluZyBsaWJkcm0KLSAgICAgIHdyYXBwZXIgZnVuY3Rpb25zLiAgSW4gYWRkaXRpb24sIGRyaXZlcnMgZXhwb3J0IGRldmljZSBzcGVjaWZpYwotICAgICAgaW50ZXJmYWNlcyBmb3IgdXNlIGJ5IHVzZXJzcGFjZSBkcml2ZXJzICZhbXA7IGRldmljZSBhd2FyZQorICAgICAgd3JhcHBlciBmdW5jdGlvbnMuICBJbiBhZGRpdGlvbiwgZHJpdmVycyBleHBvcnQgZGV2aWNlLXNwZWNpZmljCisgICAgICBpbnRlcmZhY2VzIGZvciB1c2UgYnkgdXNlcnNwYWNlIGRyaXZlcnMgJmFtcDsgZGV2aWNlLWF3YXJlCiAgICAgICBhcHBsaWNhdGlvbnMgdGhyb3VnaCBpb2N0bHMgYW5kIHN5c2ZzIGZpbGVzLgogICAgIDwvcGFyYT4KICAgICA8cGFyYT4KQEAgLTgyMiw4ICs4NTAsOCBAQAogICAgICAgbWFuYWdlbWVudCwgbWVtb3J5IG1hbmFnZW1lbnQsIGFuZCBvdXRwdXQgbWFuYWdlbWVudC4KICAgICA8L3BhcmE+CiAgICAgPHBhcmE+Ci0gICAgICBDb3ZlciBnZW5lcmljIGlvY3RscyBhbmQgc3lzZnMgbGF5b3V0IGhlcmUuICBPbmx5IG5lZWQgaGlnaAotICAgICAgbGV2ZWwgaW5mbywgc2luY2UgbWFuIHBhZ2VzIHdpbGwgY292ZXIgdGhlIHJlc3QuCisgICAgICBDb3ZlciBnZW5lcmljIGlvY3RscyBhbmQgc3lzZnMgbGF5b3V0IGhlcmUuICBXZSBvbmx5IG5lZWQgaGlnaC1sZXZlbAorICAgICAgaW5mbywgc2luY2UgbWFuIHBhZ2VzIHNob3VsZCBjb3ZlciB0aGUgcmVzdC4KICAgICA8L3BhcmE+CiAgIDwvY2hhcHRlcj4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kdmJwcm9wZXJ0eS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbAppbmRleCAyMDdlMWE1Li4zYmM4YTYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbApAQCAtMzUyLDYgKzM1Miw3IEBACiAJU1lTX0NNTUIsCiAJU1lTX0RBQiwKIAlTWVNfRFZCVDIsCisJU1lTX1RVUkJPLAogfSBmZV9kZWxpdmVyeV9zeXN0ZW1fdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAJCTwvc2VjdGlvbj4KQEAgLTgwOSw2ICs4MTAsOCBAQAogCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CiAJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CiAJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVk9MVEFHRSI+PGNvbnN0YW50PkRUVl9WT0xUQUdFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRPTkUiPjxjb25zdGFudD5EVFZfVE9ORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgogCQk8L2l0ZW1pemVkbGlzdD4KIAkJPHBhcmE+RnV0dXJlIGltcGxlbWVudGF0aW9ucyBtaWdodCBhZGQgdGhvc2UgdHdvIG1pc3NpbmcgcGFyYW1ldGVyczo8L3BhcmE+CiAJCTxpdGVtaXplZGxpc3QgbWFyaz0nb3BlbmNpcmNsZSc+CkBAIC04MTgsMjUgKzgyMSwxOCBAQAogCTwvc2VjdGlvbj4KIAk8c2VjdGlvbiBpZD0iZHZiczItcGFyYW1zIj4KIAkJPHRpdGxlPkRWQi1TMiBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgotCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBEVkItUzI6PC9wYXJhPgorCQk8cGFyYT5JbiBhZGRpdGlvbiB0byBhbGwgcGFyYW1ldGVycyB2YWxpZCBmb3IgRFZCLVMsIERWQi1TMiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6PC9wYXJhPgogCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+Ci0JCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DTEVBUiI+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+Ci0JCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KLQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtU1lNQk9MLVJBVEUiPjxjb25zdGFudD5EVFZfU1lNQk9MX1JBVEU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KLQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSU5ORVItRkVDIj48Y29uc3RhbnQ+RFRWX0lOTkVSX0ZFQzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1WT0xUQUdFIj48Y29uc3RhbnQ+RFRWX1ZPTFRBR0U8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KLQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVE9ORSI+PGNvbnN0YW50PkRUVl9UT05FPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgogCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1QSUxPVCI+PGNvbnN0YW50PkRUVl9QSUxPVDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgogCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ST0xMT0ZGIj48Y29uc3RhbnQ+RFRWX1JPTExPRkY8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KIAkJPC9pdGVtaXplZGxpc3Q+Ci0JCTxwYXJhPkZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgYWRkIHRob3NlIHR3byBtaXNzaW5nIHBhcmFtZXRlcnM6PC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0idHVyYm8tcGFyYW1zIj4KKwkJPHRpdGxlPlR1cmJvIGNvZGUgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJPHBhcmE+SW4gYWRkaXRpb24gdG8gYWxsIHBhcmFtZXRlcnMgdmFsaWQgZm9yIERWQi1TLCB0dXJibyBjb2RlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczo8L3BhcmE+CiAJCTxpdGVtaXplZGxpc3QgbWFyaz0nb3BlbmNpcmNsZSc+Ci0JCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURJU0VRQy1NQVNURVIiPjxjb25zdGFudD5EVFZfRElTRVFDX01BU1RFUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ESVNFUUMtU0xBVkUtUkVQTFkiPjxjb25zdGFudD5EVFZfRElTRVFDX1NMQVZFX1JFUExZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgogCQk8L2l0ZW1pemVkbGlzdD4KIAk8L3NlY3Rpb24+CiAJPHNlY3Rpb24gaWQ9ImlzZGJzLXBhcmFtcyI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2ludHJvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvaW50cm8ueG1sCmluZGV4IGM3NWRjN2MuLjE3MDA2NGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvaW50cm8ueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvaW50cm8ueG1sCkBAIC0yMDUsNyArMjA1LDcgQEAKIGFkZGl0aW9uYWwgaW5jbHVkZSBmaWxlIDxlbXBoYXNpcwogcm9sZT0idHQiPmxpbnV4L2R2Yi92ZXJzaW9uLmg8L2VtcGhhc2lzPiBleGlzdHMsIHdoaWNoIGRlZmluZXMgdGhlCiBjb25zdGFudCA8ZW1waGFzaXMgcm9sZT0idHQiPkRWQl9BUElfVkVSU0lPTjwvZW1waGFzaXM+LiBUaGlzIGRvY3VtZW50Ci1kZXNjcmliZXMgPGVtcGhhc2lzIHJvbGU9InR0Ij5EVkJfQVBJX1ZFUlNJT04mI3gwMEEwOzM8L2VtcGhhc2lzPi4KK2Rlc2NyaWJlcyA8ZW1waGFzaXMgcm9sZT0idHQiPkRWQl9BUElfVkVSU0lPTiA1LjQ8L2VtcGhhc2lzPi4KIDwvcGFyYT4KIAogPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sCmluZGV4IGNlMTAwNGEuLmI2ODY5OGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29tcGF0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbXBhdC54bWwKQEAgLTIzNzAsNiArMjM3MCwxNCBAQAogICAgICAgICA8L2xpc3RpdGVtPgogICAgICAgPC9vcmRlcmVkbGlzdD4KICAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24+CisgICAgICA8dGl0bGU+VjRMMiBpbiBMaW51eCAzLjI8L3RpdGxlPgorICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisJICA8cGFyYT5WNEwyX0NUUkxfRkxBR19WT0xBVElMRSB3YXMgYWRkZWQgdG8gc2lnbmFsIHZvbGF0aWxlIGNvbnRyb2xzIHRvIHVzZXJzcGFjZS48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L29yZGVyZWRsaXN0PgorICAgIDwvc2VjdGlvbj4KIAogICAgIDxzZWN0aW9uIGlkPSJvdGhlciI+CiAgICAgICA8dGl0bGU+UmVsYXRpb24gb2YgVjRMMiB0byBvdGhlciBMaW51eCBtdWx0aW1lZGlhIEFQSXM8L3RpdGxlPgpAQCAtMjQ3OCw2ICsyNDg2LDkgQEAKICAgICAgICAgPGxpc3RpdGVtPgogCSAgPHBhcmE+Rmxhc2ggQVBJLiA8eHJlZiBsaW5rZW5kPSJmbGFzaC1jb250cm9scyIgLz48L3BhcmE+CiAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKwkgIDxwYXJhPiZWSURJT0MtQ1JFQVRFLUJVRlM7IGFuZCAmVklESU9DLVBSRVBBUkUtQlVGOyBpb2N0bHMuPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgogICAgICAgPC9pdGVtaXplZGxpc3Q+CiAgICAgPC9zZWN0aW9uPgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbnRyb2xzLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCmluZGV4IDIzZmRmNzkuLjNiYzVlZTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCkBAIC0yMzIsOCArMjMyLDkgQEAKIAkgICAgPGVudHJ5PkVuYWJsZXMgYSBwb3dlciBsaW5lIGZyZXF1ZW5jeSBmaWx0ZXIgdG8gYXZvaWQKIGZsaWNrZXIuIFBvc3NpYmxlIHZhbHVlcyBmb3IgPGNvbnN0YW50PmVudW0gdjRsMl9wb3dlcl9saW5lX2ZyZXF1ZW5jeTwvY29uc3RhbnQ+IGFyZToKIDxjb25zdGFudD5WNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9ESVNBQkxFRDwvY29uc3RhbnQ+ICgwKSwKLTxjb25zdGFudD5WNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaPC9jb25zdGFudD4gKDEpIGFuZAotPGNvbnN0YW50PlY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFo8L2NvbnN0YW50PiAoMikuPC9lbnRyeT4KKzxjb25zdGFudD5WNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaPC9jb25zdGFudD4gKDEpLAorPGNvbnN0YW50PlY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFo8L2NvbnN0YW50PiAoMikgYW5kCis8Y29uc3RhbnQ+VjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfQVVUTzwvY29uc3RhbnQ+ICgzKS48L2VudHJ5PgogCSAgPC9yb3c+CiAJICA8cm93PgogCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfQ0lEX0hVRV9BVVRPPC9jb25zdGFudD48L2VudHJ5PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtc3ViZGV2LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXN1YmRldi54bWwKaW5kZXggMDVjOGZlZi4uMDkxNmE3MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtc3ViZGV2LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1zdWJkZXYueG1sCkBAIC0yNjYsNyArMjY2LDcgQEAKIAogICAgICAgPHBhcmE+V2hlbiBzYXRpc2ZpZWQgd2l0aCB0aGUgdHJ5IHJlc3VsdHMsIGFwcGxpY2F0aW9ucyBjYW4gc2V0IHRoZSBhY3RpdmUKICAgICAgIGZvcm1hdHMgYnkgc2V0dGluZyB0aGUgPHN0cnVjdGZpZWxkPndoaWNoPC9zdHJ1Y3RmaWVsZD4gYXJndW1lbnQgdG8KLSAgICAgIDxjb25zdGFudD5WNEwyX1NVQkRFVl9GT1JNQVRfVFJZPC9jb25zdGFudD4uIEFjdGl2ZSBmb3JtYXRzIGFyZSBjaGFuZ2VkCisgICAgICA8Y29uc3RhbnQ+VjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTwvY29uc3RhbnQ+LiBBY3RpdmUgZm9ybWF0cyBhcmUgY2hhbmdlZAogICAgICAgZXhhY3RseSBhcyB0cnkgZm9ybWF0cyBieSBkcml2ZXJzLiBUbyBhdm9pZCBtb2RpZnlpbmcgdGhlIGhhcmR3YXJlIHN0YXRlCiAgICAgICBkdXJpbmcgZm9ybWF0IG5lZ290aWF0aW9uLCBhcHBsaWNhdGlvbnMgc2hvdWxkIG5lZ290aWF0ZSB0cnkgZm9ybWF0cyBmaXJzdAogICAgICAgYW5kIHRoZW4gbW9kaWZ5IHRoZSBhY3RpdmUgc2V0dGluZ3MgdXNpbmcgdGhlIHRyeSBmb3JtYXRzIHJldHVybmVkIGR1cmluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9pby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2lvLnhtbAppbmRleCBjNTdkMWVjLi4zZjQ3ZGYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2lvLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2lvLnhtbApAQCAtOTI3LDYgKzkyNywzMyBAQAogQXBwbGljYXRpb25zIHNldCBvciBjbGVhciB0aGlzIGZsYWcgYmVmb3JlIGNhbGxpbmcgdGhlCiA8Y29uc3RhbnQ+VklESU9DX1FCVUY8L2NvbnN0YW50PiBpb2N0bC48L2VudHJ5PgogCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfQlVGX0ZMQUdfUFJFUEFSRUQ8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4weDA0MDA8L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIGJ1ZmZlciBoYXMgYmVlbiBwcmVwYXJlZCBmb3IgSS9PIGFuZCBjYW4gYmUgcXVldWVkIGJ5IHRoZQorYXBwbGljYXRpb24uIERyaXZlcnMgc2V0IG9yIGNsZWFyIHRoaXMgZmxhZyB3aGVuIHRoZQorPGxpbmsgbGlua2VuZD0idmlkaW9jLXF1ZXJ5YnVmIj5WSURJT0NfUVVFUllCVUY8L2xpbms+LCA8bGluaworCSAgbGlua2VuZD0idmlkaW9jLXFidWYiPlZJRElPQ19QUkVQQVJFX0JVRjwvbGluaz4sIDxsaW5rCisJICBsaW5rZW5kPSJ2aWRpb2MtcWJ1ZiI+VklESU9DX1FCVUY8L2xpbms+IG9yIDxsaW5rCisJICBsaW5rZW5kPSJ2aWRpb2MtcWJ1ZiI+VklESU9DX0RRQlVGPC9saW5rPiBpb2N0bCBpcyBjYWxsZWQuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0JVRl9GTEFHX05PX0NBQ0hFX0lOVkFMSURBVEU8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4weDA0MDA8L2VudHJ5PgorCSAgICA8ZW50cnk+Q2FjaGVzIGRvIG5vdCBoYXZlIHRvIGJlIGludmFsaWRhdGVkIGZvciB0aGlzIGJ1ZmZlci4KK1R5cGljYWxseSBhcHBsaWNhdGlvbnMgc2hhbGwgdXNlIHRoaXMgZmxhZyBpZiB0aGUgZGF0YSBjYXB0dXJlZCBpbiB0aGUgYnVmZmVyCitpcyBub3QgZ29pbmcgdG8gYmUgdG91Y2hlZCBieSB0aGUgQ1BVLCBpbnN0ZWFkIHRoZSBidWZmZXIgd2lsbCwgcHJvYmFibHksIGJlCitwYXNzZWQgb24gdG8gYSBETUEtY2FwYWJsZSBoYXJkd2FyZSB1bml0IGZvciBmdXJ0aGVyIHByb2Nlc3Npbmcgb3Igb3V0cHV0LgorPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0JVRl9GTEFHX05PX0NBQ0hFX0NMRUFOPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwODAwPC9lbnRyeT4KKwkgICAgPGVudHJ5PkNhY2hlcyBkbyBub3QgaGF2ZSB0byBiZSBjbGVhbmVkIGZvciB0aGlzIGJ1ZmZlci4KK1R5cGljYWxseSBhcHBsaWNhdGlvbnMgc2hhbGwgdXNlIHRoaXMgZmxhZyBmb3Igb3V0cHV0IGJ1ZmZlcnMgaWYgdGhlIGRhdGEKK2luIHRoaXMgYnVmZmVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIGJ5IHRoZSBDUFUgYnV0IGJ5IHNvbWUgRE1BLWNhcGFibGUgdW5pdCwKK2luIHdoaWNoIGNhc2UgY2FjaGVzIGhhdmUgbm90IGJlZW4gdXNlZC48L2VudHJ5PgorCSAgPC9yb3c+CiAJPC90Ym9keT4KICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92NGwyLnhtbAppbmRleCAwZDA1ZTg3Li4yYWIzNjVjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDIueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdjRsMi54bWwKQEAgLTEyOCw2ICsxMjgsMTMgQEAKIGFwcGxpY2F0aW9ucy4gLS0+CiAKICAgICAgIDxyZXZpc2lvbj4KKwk8cmV2bnVtYmVyPjMuMjwvcmV2bnVtYmVyPgorCTxkYXRlPjIwMTEtMDgtMjY8L2RhdGU+CisJPGF1dGhvcmluaXRpYWxzPmh2PC9hdXRob3Jpbml0aWFscz4KKwk8cmV2cmVtYXJrPkFkZGVkIFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFLjwvcmV2cmVtYXJrPgorICAgICAgPC9yZXZpc2lvbj4KKworICAgICAgPHJldmlzaW9uPgogCTxyZXZudW1iZXI+My4xPC9yZXZudW1iZXI+CiAJPGRhdGU+MjAxMS0wNi0yNzwvZGF0ZT4KIAk8YXV0aG9yaW5pdGlhbHM+bWNjLCBwbywgaHY8L2F1dGhvcmluaXRpYWxzPgpAQCAtNDEwLDcgKzQxNyw3IEBACiA8L3BhcnRpbmZvPgogCiA8dGl0bGU+VmlkZW8gZm9yIExpbnV4IFR3byBBUEkgU3BlY2lmaWNhdGlvbjwvdGl0bGU+Ci0gPHN1YnRpdGxlPlJldmlzaW9uIDMuMTwvc3VidGl0bGU+CisgPHN1YnRpdGxlPlJldmlzaW9uIDMuMjwvc3VidGl0bGU+CiAKICAgPGNoYXB0ZXIgaWQ9ImNvbW1vbiI+CiAgICAgJnN1Yi1jb21tb247CkBAIC00NjIsNiArNDY5LDcgQEAKICAgICAmc3ViLWNsb3NlOwogICAgICZzdWItaW9jdGw7CiAgICAgPCEtLSBBbGwgaW9jdGxzIGdvIGhlcmUuIC0tPgorICAgICZzdWItY3JlYXRlLWJ1ZnM7CiAgICAgJnN1Yi1jcm9wY2FwOwogICAgICZzdWItZGJnLWctY2hpcC1pZGVudDsKICAgICAmc3ViLWRiZy1nLXJlZ2lzdGVyOwpAQCAtNTA0LDYgKzUxMiw3IEBACiAgICAgJnN1Yi1xdWVyeWN0cmw7CiAgICAgJnN1Yi1xdWVyeS1kdi1wcmVzZXQ7CiAgICAgJnN1Yi1xdWVyeXN0ZDsKKyAgICAmc3ViLXByZXBhcmUtYnVmOwogICAgICZzdWItcmVxYnVmczsKICAgICAmc3ViLXMtaHctZnJlcS1zZWVrOwogICAgICZzdWItc3RyZWFtb247CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1jcmVhdGUtYnVmcy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1jcmVhdGUtYnVmcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhZThhNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWNyZWF0ZS1idWZzLnhtbApAQCAtMCwwICsxLDEzOSBAQAorPHJlZmVudHJ5IGlkPSJ2aWRpb2MtY3JlYXRlLWJ1ZnMiPgorICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5pb2N0bCBWSURJT0NfQ1JFQVRFX0JVRlM8L3JlZmVudHJ5dGl0bGU+CisgICAgJm1hbnZvbDsKKyAgPC9yZWZtZXRhPgorCisgIDxyZWZuYW1lZGl2PgorICAgIDxyZWZuYW1lPlZJRElPQ19DUkVBVEVfQlVGUzwvcmVmbmFtZT4KKyAgICA8cmVmcHVycG9zZT5DcmVhdGUgYnVmZmVycyBmb3IgTWVtb3J5IE1hcHBlZCBvciBVc2VyIFBvaW50ZXIgSS9PPC9yZWZwdXJwb3NlPgorICA8L3JlZm5hbWVkaXY+CisKKyAgPHJlZnN5bm9wc2lzZGl2PgorICAgIDxmdW5jc3lub3BzaXM+CisgICAgICA8ZnVuY3Byb3RvdHlwZT4KKwk8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPmlvY3RsPC9mdW5jdGlvbj48L2Z1bmNkZWY+CisJPHBhcmFtZGVmPmludCA8cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKwk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJPHBhcmFtZGVmPnN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzICo8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorICAgICAgPC9mdW5jcHJvdG90eXBlPgorICAgIDwvZnVuY3N5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+QXJndW1lbnRzPC90aXRsZT4KKworICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+JmZkOzwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5WSURJT0NfQ1JFQVRFX0JVRlM8L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+PC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKworICAgIDxwYXJhPlRoaXMgaW9jdGwgaXMgdXNlZCB0byBjcmVhdGUgYnVmZmVycyBmb3IgPGxpbmsgbGlua2VuZD0ibW1hcCI+bWVtb3J5CittYXBwZWQ8L2xpbms+IG9yIDxsaW5rIGxpbmtlbmQ9InVzZXJwIj51c2VyIHBvaW50ZXI8L2xpbms+CitJL08uIEl0IGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIG9yIGluIGFkZGl0aW9uIHRvIHRoZQorPGNvbnN0YW50PlZJRElPQ19SRVFCVUZTPC9jb25zdGFudD4gaW9jdGwsIHdoZW4gYSB0aWdodGVyIGNvbnRyb2wgb3ZlciBidWZmZXJzCitpcyByZXF1aXJlZC4gVGhpcyBpb2N0bCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIGNyZWF0ZSBidWZmZXJzIG9mCitkaWZmZXJlbnQgc2l6ZXMuPC9wYXJhPgorCisgICAgPHBhcmE+VG8gYWxsb2NhdGUgZGV2aWNlIGJ1ZmZlcnMgYXBwbGljYXRpb25zIGluaXRpYWxpemUgcmVsZXZhbnQgZmllbGRzIG9mCit0aGUgPHN0cnVjdG5hbWU+djRsMl9jcmVhdGVfYnVmZmVyczwvc3RydWN0bmFtZT4gc3RydWN0dXJlLiBUaGV5IHNldCB0aGUKKzxzdHJ1Y3RmaWVsZD50eXBlPC9zdHJ1Y3RmaWVsZD4gZmllbGQgaW4gdGhlCis8c3RydWN0bmFtZT52NGwyX2Zvcm1hdDwvc3RydWN0bmFtZT4gc3RydWN0dXJlLCBlbWJlZGRlZCBpbiB0aGlzCitzdHJ1Y3R1cmUsIHRvIHRoZSByZXNwZWN0aXZlIHN0cmVhbSBvciBidWZmZXIgdHlwZS4KKzxzdHJ1Y3RmaWVsZD5jb3VudDwvc3RydWN0ZmllbGQ+IG11c3QgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgYnVmZmVycy4KKzxzdHJ1Y3RmaWVsZD5tZW1vcnk8L3N0cnVjdGZpZWxkPiBzcGVjaWZpZXMgdGhlIHJlcXVpcmVkIEkvTyBtZXRob2QuIFRoZQorPHN0cnVjdGZpZWxkPmZvcm1hdDwvc3RydWN0ZmllbGQ+IGZpZWxkIHNoYWxsIHR5cGljYWxseSBiZSBmaWxsZWQgaW4gdXNpbmcKK2VpdGhlciB0aGUgPGNvbnN0YW50PlZJRElPQ19UUllfRk1UPC9jb25zdGFudD4gb3IKKzxjb25zdGFudD5WSURJT0NfR19GTVQ8L2NvbnN0YW50PiBpb2N0bCgpLiBBZGRpdGlvbmFsbHksIGFwcGxpY2F0aW9ucyBjYW4gYWRqdXN0Cis8c3RydWN0ZmllbGQ+c2l6ZWltYWdlPC9zdHJ1Y3RmaWVsZD4gZmllbGRzIHRvIGZpdCB0aGVpciBzcGVjaWZpYyBuZWVkcy4gVGhlCis8c3RydWN0ZmllbGQ+cmVzZXJ2ZWQ8L3N0cnVjdGZpZWxkPiBhcnJheSBtdXN0IGJlIHplcm9lZC48L3BhcmE+CisKKyAgICA8cGFyYT5XaGVuIHRoZSBpb2N0bCBpcyBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgdGhlIGRyaXZlcgord2lsbCBhdHRlbXB0IHRvIGFsbG9jYXRlIHVwIHRvIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ1ZmZlcnMgYW5kIHN0b3JlIHRoZQorYWN0dWFsIG51bWJlciBhbGxvY2F0ZWQgYW5kIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUKKzxzdHJ1Y3RmaWVsZD5jb3VudDwvc3RydWN0ZmllbGQ+IGFuZCB0aGUgPHN0cnVjdGZpZWxkPmluZGV4PC9zdHJ1Y3RmaWVsZD4gZmllbGRzCityZXNwZWN0aXZlbHkuIE9uIHJldHVybiA8c3RydWN0ZmllbGQ+Y291bnQ8L3N0cnVjdGZpZWxkPiBjYW4gYmUgc21hbGxlciB0aGFuCit0aGUgbnVtYmVyIHJlcXVlc3RlZC4gVGhlIGRyaXZlciBtYXkgYWxzbyBpbmNyZWFzZSBidWZmZXIgc2l6ZXMgaWYgcmVxdWlyZWQsCitob3dldmVyLCBpdCB3aWxsIG5vdCB1cGRhdGUgPHN0cnVjdGZpZWxkPnNpemVpbWFnZTwvc3RydWN0ZmllbGQ+IGZpZWxkIHZhbHVlcy4KK1RoZSB1c2VyIGhhcyB0byB1c2UgPGNvbnN0YW50PlZJRElPQ19RVUVSWUJVRjwvY29uc3RhbnQ+IHRvIHJldHJpZXZlIHRoYXQKK2luZm9ybWF0aW9uLjwvcGFyYT4KKworICAgIDx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSJub25lIiBpZD0idjRsMi1jcmVhdGUtYnVmZmVycyI+CisgICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPnY0bDJfY3JlYXRlX2J1ZmZlcnM8L3N0cnVjdG5hbWU+PC90aXRsZT4KKyAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisJJmNzLXN0cjsKKwk8dGJvZHkgdmFsaWduPSJ0b3AiPgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5pbmRleDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBzdGFydGluZyBidWZmZXIgaW5kZXgsIHJldHVybmVkIGJ5IHRoZSBkcml2ZXIuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5jb3VudDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBudW1iZXIgb2YgYnVmZmVycyByZXF1ZXN0ZWQgb3IgZ3JhbnRlZC48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+JnY0bDItbWVtb3J5OzwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+bWVtb3J5PC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+QXBwbGljYXRpb25zIHNldCB0aGlzIGZpZWxkIHRvCis8Y29uc3RhbnQ+VjRMMl9NRU1PUllfTU1BUDwvY29uc3RhbnQ+IG9yCis8Y29uc3RhbnQ+VjRMMl9NRU1PUllfVVNFUlBUUjwvY29uc3RhbnQ+LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT4mdjRsMi1mb3JtYXQ7PC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5mb3JtYXQ8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT5GaWxsZWQgaW4gYnkgdGhlIGFwcGxpY2F0aW9uLCBwcmVzZXJ2ZWQgYnkgdGhlIGRyaXZlci48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnJlc2VydmVkPC9zdHJ1Y3RmaWVsZD5bOF08L2VudHJ5PgorCSAgICA8ZW50cnk+QSBwbGFjZSBob2xkZXIgZm9yIGZ1dHVyZSBleHRlbnNpb25zLjwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgJnJldHVybi12YWx1ZTsKKworICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxlcnJvcmNvZGU+RU5PTUVNPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPk5vIG1lbW9yeSB0byBhbGxvY2F0ZSBidWZmZXJzIGZvciA8bGluayBsaW5rZW5kPSJtbWFwIj5tZW1vcnkKK21hcHBlZDwvbGluaz4gSS9PLjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPlRoZSBidWZmZXIgdHlwZSAoPHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPiBmaWVsZCkgb3IgdGhlCityZXF1ZXN0ZWQgSS9PIG1ldGhvZCAoPHN0cnVjdGZpZWxkPm1lbW9yeTwvc3RydWN0ZmllbGQ+KSBpcyBub3QKK3N1cHBvcnRlZC48L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgIDwvdmFyaWFibGVsaXN0PgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWRxZXZlbnQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKaW5kZXggNzc2OTY0Mi4uZTg3MTRhYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKQEAgLTg4LDYgKzg4LDEyIEBACiAJICA8L3Jvdz4KIAkgIDxyb3c+CiAJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+JnY0bDItZXZlbnQtZnJhbWUtc3luYzs8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5mcmFtZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PkV2ZW50IGRhdGEgZm9yIGV2ZW50IFY0TDJfRVZFTlRfRlJBTUVfU1lOQy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KIAkgICAgPGVudHJ5Pl9fdTg8L2VudHJ5PgogICAgICAgICAgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5kYXRhPC9zdHJ1Y3RmaWVsZD5bNjRdPC9lbnRyeT4KIAkgICAgPGVudHJ5PkV2ZW50IGRhdGEuIERlZmluZWQgYnkgdGhlIGV2ZW50IHR5cGUuIFRoZSB1bmlvbgpAQCAtMTM1LDYgKzE0MSwxMjkgQEAKICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CiAKKyAgICA8dGFibGUgZnJhbWU9Im5vbmUiIHBnd2lkZT0iMSIgaWQ9InY0bDItZXZlbnQtdnN5bmMiPgorICAgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX2V2ZW50X3ZzeW5jPC9zdHJ1Y3RuYW1lPjwvdGl0bGU+CisgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorCSZjcy1zdHI7CisJPHRib2R5IHZhbGlnbj0idG9wIj4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3U4PC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5maWVsZDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSB1cGNvbWluZyBmaWVsZC4gU2VlICZ2NGwyLWZpZWxkOy48L2VudHJ5PgorCSAgPC9yb3c+CisJPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvdGFibGU+CisKKyAgICA8dGFibGUgZnJhbWU9Im5vbmUiIHBnd2lkZT0iMSIgaWQ9InY0bDItZXZlbnQtY3RybCI+CisgICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPnY0bDJfZXZlbnRfY3RybDwvc3RydWN0bmFtZT48L3RpdGxlPgorICAgICAgPHRncm91cCBjb2xzPSI0Ij4KKwkmY3Mtc3RyOworCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmNoYW5nZXM8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+QSBiaXRtYXNrIHRoYXQgdGVsbHMgd2hhdCBoYXMgY2hhbmdlZC4gU2VlIDx4cmVmIGxpbmtlbmQ9ImNoYW5nZXMtZmxhZ3MiIC8+LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dHlwZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgdHlwZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLWN0cmwtdHlwZTsuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5PnVuaW9uIChhbm9ueW1vdXMpPC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dmFsdWU8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgMzItYml0IHZhbHVlIG9mIHRoZSBjb250cm9sIGZvciAzMi1iaXQgY29udHJvbCB0eXBlcy4KKwkJVGhpcyBpcyAwIGZvciBzdHJpbmcgY29udHJvbHMgc2luY2UgdGhlIHZhbHVlIG9mIGEgc3RyaW5nCisJCWNhbm5vdCBiZSBwYXNzZWQgdXNpbmcgJlZJRElPQy1EUUVWRU5UOy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5Pl9fczY0PC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD52YWx1ZTY0PC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIDY0LWJpdCB2YWx1ZSBvZiB0aGUgY29udHJvbCBmb3IgNjQtYml0IGNvbnRyb2wgdHlwZXMuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5mbGFnczwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgY29udHJvbCBmbGFncy4gU2VlIDx4cmVmIGxpbmtlbmQ9ImNvbnRyb2wtZmxhZ3MiIC8+LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+bWluaW11bTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLXF1ZXJ5Y3RybDsuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fczMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5tYXhpbXVtPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBjb250cm9sLiBTZWUgJnY0bDItcXVlcnljdHJsOy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnN0ZXA8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIHN0ZXAgdmFsdWUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1xdWVyeWN0cmw7LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZGVmYXVsdF92YWx1ZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgZGVmYXVsdCB2YWx1ZSB2YWx1ZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLXF1ZXJ5Y3RybDsuPC9lbnRyeT4KKwkgIDwvcm93PgorCTwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L3RhYmxlPgorCisgICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LWZyYW1lLXN5bmMiPgorICAgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX2V2ZW50X2ZyYW1lX3N5bmM8L3N0cnVjdG5hbWU+PC90aXRsZT4KKyAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisJJmNzLXN0cjsKKwk8dGJvZHkgdmFsaWduPSJ0b3AiPgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5mcmFtZV9zZXF1ZW5jZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PgorCSAgICAgIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGZyYW1lIGJlaW5nIHJlY2VpdmVkLgorCSAgICA8L2VudHJ5PgorCSAgPC9yb3c+CisJPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvdGFibGU+CisKKyAgICA8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9ImNoYW5nZXMtZmxhZ3MiPgorICAgICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgorICAgICAgPHRncm91cCBjb2xzPSIzIj4KKwkmY3MtZGVmOworCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRVZFTlRfQ1RSTF9DSF9WQUxVRTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjB4MDAwMTwvZW50cnk+CisJICAgIDxlbnRyeT5UaGlzIGNvbnRyb2wgZXZlbnQgd2FzIHRyaWdnZXJlZCBiZWNhdXNlIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbAorCQljaGFuZ2VkLiBTcGVjaWFsIGNhc2U6IGlmIGEgYnV0dG9uIGNvbnRyb2wgaXMgcHJlc3NlZCwgdGhlbiB0aGlzCisJCWV2ZW50IGlzIHNlbnQgYXMgd2VsbCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm90IGV4cGxpY2l0IHZhbHVlCisJCWFzc29jaWF0ZWQgd2l0aCBhIGJ1dHRvbiBjb250cm9sLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9DVFJMX0NIX0ZMQUdTPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwMDAyPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgY29udHJvbCBldmVudCB3YXMgdHJpZ2dlcmVkIGJlY2F1c2UgdGhlIGNvbnRyb2wgZmxhZ3MKKwkJY2hhbmdlZC48L2VudHJ5PgorCSAgPC9yb3c+CisJPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvdGFibGU+CiAgIDwvcmVmc2VjdDE+CiAgIDxyZWZzZWN0MT4KICAgICAmcmV0dXJuLXZhbHVlOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcHJlcGFyZS1idWYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcHJlcGFyZS1idWYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZGU2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1wcmVwYXJlLWJ1Zi54bWwKQEAgLTAsMCArMSw4OCBAQAorPHJlZmVudHJ5IGlkPSJ2aWRpb2MtcHJlcGFyZS1idWYiPgorICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5pb2N0bCBWSURJT0NfUFJFUEFSRV9CVUY8L3JlZmVudHJ5dGl0bGU+CisgICAgJm1hbnZvbDsKKyAgPC9yZWZtZXRhPgorCisgIDxyZWZuYW1lZGl2PgorICAgIDxyZWZuYW1lPlZJRElPQ19QUkVQQVJFX0JVRjwvcmVmbmFtZT4KKyAgICA8cmVmcHVycG9zZT5QcmVwYXJlIGEgYnVmZmVyIGZvciBJL088L3JlZnB1cnBvc2U+CisgIDwvcmVmbmFtZWRpdj4KKworICA8cmVmc3lub3BzaXNkaXY+CisgICAgPGZ1bmNzeW5vcHNpcz4KKyAgICAgIDxmdW5jcHJvdG90eXBlPgorCTxmdW5jZGVmPmludCA8ZnVuY3Rpb24+aW9jdGw8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KKwk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKwk8cGFyYW1kZWY+c3RydWN0IHY0bDJfYnVmZmVyICo8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorICAgICAgPC9mdW5jcHJvdG90eXBlPgorICAgIDwvZnVuY3N5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+QXJndW1lbnRzPC90aXRsZT4KKworICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+JmZkOzwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5WSURJT0NfUFJFUEFSRV9CVUY8L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+PC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKworICAgIDxwYXJhPkFwcGxpY2F0aW9ucyBjYW4gb3B0aW9uYWxseSBjYWxsIHRoZQorPGNvbnN0YW50PlZJRElPQ19QUkVQQVJFX0JVRjwvY29uc3RhbnQ+IGlvY3RsIHRvIHBhc3Mgb3duZXJzaGlwIG9mIHRoZSBidWZmZXIKK3RvIHRoZSBkcml2ZXIgYmVmb3JlIGFjdHVhbGx5IGVucXVldWluZyBpdCwgdXNpbmcgdGhlCis8Y29uc3RhbnQ+VklESU9DX1FCVUY8L2NvbnN0YW50PiBpb2N0bCwgYW5kIHRvIHByZXBhcmUgaXQgZm9yIGZ1dHVyZSBJL08uCitTdWNoIHByZXBhcmF0aW9ucyBtYXkgaW5jbHVkZSBjYWNoZSBpbnZhbGlkYXRpb24gb3IgY2xlYW5pbmcuIFBlcmZvcm1pbmcgdGhlbQoraW4gYWR2YW5jZSBzYXZlcyB0aW1lIGR1cmluZyB0aGUgYWN0dWFsIEkvTy4gSW4gY2FzZSBzdWNoIGNhY2hlIG9wZXJhdGlvbnMgYXJlCitub3QgcmVxdWlyZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIG9uZSBvZgorPGNvbnN0YW50PlY0TDJfQlVGX0ZMQUdfTk9fQ0FDSEVfSU5WQUxJREFURTwvY29uc3RhbnQ+IGFuZAorPGNvbnN0YW50PlY0TDJfQlVGX0ZMQUdfTk9fQ0FDSEVfQ0xFQU48L2NvbnN0YW50PiBmbGFncyB0byBza2lwIHRoZSByZXNwZWN0aXZlCitzdGVwLjwvcGFyYT4KKworICAgIDxwYXJhPlRoZSA8c3RydWN0bmFtZT52NGwyX2J1ZmZlcjwvc3RydWN0bmFtZT4gc3RydWN0dXJlIGlzCitzcGVjaWZpZWQgaW4gPHhyZWYgbGlua2VuZD0iYnVmZmVyIiAvPi48L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgICZyZXR1cm4tdmFsdWU7CisKKyAgICA8dmFyaWFibGVsaXN0PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48ZXJyb3Jjb2RlPkVCVVNZPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPkZpbGUgSS9PIGlzIGluIHByb2dyZXNzLjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPlRoZSBidWZmZXIgPHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPiBpcyBub3QKK3N1cHBvcnRlZCwgb3IgdGhlIDxzdHJ1Y3RmaWVsZD5pbmRleDwvc3RydWN0ZmllbGQ+IGlzIG91dCBvZiBib3VuZHMsCitvciBubyBidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUKKzxzdHJ1Y3RmaWVsZD51c2VycHRyPC9zdHJ1Y3RmaWVsZD4gb3IKKzxzdHJ1Y3RmaWVsZD5sZW5ndGg8L3N0cnVjdGZpZWxkPiBhcmUgaW52YWxpZC48L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgIDwvdmFyaWFibGVsaXN0PgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeWN0cmwueG1sCmluZGV4IDY3N2VhNjQuLjBhYzAwNTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnljdHJsLnhtbApAQCAtNDA2LDYgKzQwNiwxNSBAQAogd3JpdGluZyBhIHZhbHVlIHdpbGwgY2F1c2UgdGhlIGRldmljZSB0byBjYXJyeSBvdXQgYSBnaXZlbiBhY3Rpb24KICgmZWc7IG1vdG9yIGNvbnRyb2wpIGJ1dCBubyBtZWFuaW5nZnVsIHZhbHVlIGNhbiBiZSByZXR1cm5lZC48L2VudHJ5PgogCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwMDgwPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgY29udHJvbCBpcyB2b2xhdGlsZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wKK2NoYW5nZXMgY29udGludW91c2x5LiBBIHR5cGljYWwgZXhhbXBsZSB3b3VsZCBiZSB0aGUgY3VycmVudCBnYWluIHZhbHVlIGlmIHRoZSBkZXZpY2UKK2lzIGluIGF1dG8tZ2FpbiBtb2RlLiBJbiBzdWNoIGEgY2FzZSB0aGUgaGFyZHdhcmUgY2FsY3VsYXRlcyB0aGUgZ2FpbiB2YWx1ZSBiYXNlZCBvbgordGhlIGxpZ2h0aW5nIGNvbmRpdGlvbnMgd2hpY2ggY2FuIGNoYW5nZSBvdmVyIHRpbWUuIE5vdGUgdGhhdCBzZXR0aW5nIGEgbmV3IHZhbHVlIGZvcgorYSB2b2xhdGlsZSBjb250cm9sIHdpbGwgaGF2ZSBubyBlZmZlY3QuIFRoZSBuZXcgdmFsdWUgd2lsbCBqdXN0IGJlIGlnbm9yZWQuPC9lbnRyeT4KKwkgIDwvcm93PgogCTwvdGJvZHk+CiAgICAgICA8L3Rncm91cD4KICAgICA8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3Vic2NyaWJlLWV2ZW50LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YnNjcmliZS1ldmVudC54bWwKaW5kZXggNjljMGQ4YS4uNWM3MGI2MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3Vic2NyaWJlLWV2ZW50LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJzY3JpYmUtZXZlbnQueG1sCkBAIC0xMzksNiArMTM5LDIyIEBACiAJICAgIDwvZW50cnk+CiAJICA8L3Jvdz4KIAkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9GUkFNRV9TWU5DPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+NDwvZW50cnk+CisJICAgIDxlbnRyeT4KKwkgICAgICA8cGFyYT5UcmlnZ2VyZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgcmVjZXB0aW9uIG9mIGEKKwkgICAgICBmcmFtZSBoYXMgYmVndW4uIFRoaXMgZXZlbnQgaGFzIGEKKwkgICAgICAmdjRsMi1ldmVudC1mcmFtZS1zeW5jOyBhc3NvY2lhdGVkIHdpdGggaXQuPC9wYXJhPgorCisJICAgICAgPHBhcmE+SWYgdGhlIGhhcmR3YXJlIG5lZWRzIHRvIGJlIHN0b3BwZWQgaW4gdGhlIGNhc2Ugb2YgYQorCSAgICAgIGJ1ZmZlciB1bmRlcnJ1biBpdCBtaWdodCBub3QgYmUgYWJsZSB0byBnZW5lcmF0ZSB0aGlzIGV2ZW50LgorCSAgICAgIEluIHN1Y2ggY2FzZXMgdGhlIDxzdHJ1Y3RmaWVsZD5mcmFtZV9zZXF1ZW5jZTwvc3RydWN0ZmllbGQ+CisJICAgICAgZmllbGQgaW4gJnY0bDItZXZlbnQtZnJhbWUtc3luYzsgd2lsbCBub3QgYmUgaW5jcmVtZW50ZWQuIFRoaXMKKwkgICAgICBjYXVzZXMgdHdvIGNvbnNlY3V0aXZlIGZyYW1lIHNlcXVlbmNlIG51bWJlcnMgdG8gaGF2ZSBuIHRpbWVzCisJICAgICAgZnJhbWUgaW50ZXJ2YWwgaW4gYmV0d2VlbiB0aGVtLjwvcGFyYT4KKwkgICAgPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KIAkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQ8L2NvbnN0YW50PjwvZW50cnk+CiAJICAgIDxlbnRyeT4weDA4MDAwMDAwPC9lbnRyeT4KIAkgICAgPGVudHJ5PkJhc2UgZXZlbnQgbnVtYmVyIGZvciBkcml2ZXItcHJpdmF0ZSBldmVudHMuPC9lbnRyeT4KQEAgLTE4MywxMTMgKzE5OSw2IEBACiAgICAgICA8L3Rncm91cD4KICAgICA8L3RhYmxlPgogCi0gICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LXZzeW5jIj4KLSAgICAgIDx0aXRsZT5zdHJ1Y3QgPHN0cnVjdG5hbWU+djRsMl9ldmVudF92c3luYzwvc3RydWN0bmFtZT48L3RpdGxlPgotICAgICAgPHRncm91cCBjb2xzPSIzIj4KLQkmY3Mtc3RyOwotCTx0Ym9keSB2YWxpZ249InRvcCI+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X191ODwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZmllbGQ8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT5UaGUgdXBjb21pbmcgZmllbGQuIFNlZSAmdjRsMi1maWVsZDsuPC9lbnRyeT4KLQkgIDwvcm93PgotCTwvdGJvZHk+Ci0gICAgICA8L3Rncm91cD4KLSAgICA8L3RhYmxlPgotCi0gICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LWN0cmwiPgotICAgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX2V2ZW50X2N0cmw8L3N0cnVjdG5hbWU+PC90aXRsZT4KLSAgICAgIDx0Z3JvdXAgY29scz0iNCI+Ci0JJmNzLXN0cjsKLQk8dGJvZHkgdmFsaWduPSJ0b3AiPgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KLQkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5jaGFuZ2VzPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+PC9lbnRyeT4KLQkgICAgPGVudHJ5PkEgYml0bWFzayB0aGF0IHRlbGxzIHdoYXQgaGFzIGNoYW5nZWQuIFNlZSA8eHJlZiBsaW5rZW5kPSJjaGFuZ2VzLWZsYWdzIiAvPi48L2VudHJ5PgotCSAgPC9yb3c+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIHR5cGUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1jdHJsLXR5cGU7LjwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT51bmlvbiAoYW5vbnltb3VzKTwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+PC9lbnRyeT4KLQkgICAgPGVudHJ5PjwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnZhbHVlPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIDMyLWJpdCB2YWx1ZSBvZiB0aGUgY29udHJvbCBmb3IgMzItYml0IGNvbnRyb2wgdHlwZXMuCi0JCVRoaXMgaXMgMCBmb3Igc3RyaW5nIGNvbnRyb2xzIHNpbmNlIHRoZSB2YWx1ZSBvZiBhIHN0cmluZwotCQljYW5ub3QgYmUgcGFzc2VkIHVzaW5nICZWSURJT0MtRFFFVkVOVDsuPC9lbnRyeT4KLQkgIDwvcm93PgotCSAgPHJvdz4KLQkgICAgPGVudHJ5PjwvZW50cnk+Ci0JICAgIDxlbnRyeT5fX3M2NDwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dmFsdWU2NDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KLQkgICAgPGVudHJ5PlRoZSA2NC1iaXQgdmFsdWUgb2YgdGhlIGNvbnRyb2wgZm9yIDY0LWJpdCBjb250cm9sIHR5cGVzLjwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZmxhZ3M8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIGNvbnRyb2wgZmxhZ3MuIFNlZSA8eHJlZiBsaW5rZW5kPSJjb250cm9sLWZsYWdzIiAvPi48L2VudHJ5PgotCSAgPC9yb3c+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPm1pbmltdW08L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1xdWVyeWN0cmw7LjwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+bWF4aW11bTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KLQkgICAgPGVudHJ5PjwvZW50cnk+Ci0JICAgIDxlbnRyeT5UaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLXF1ZXJ5Y3RybDsuPC9lbnRyeT4KLQkgIDwvcm93PgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pl9fczMyPC9lbnRyeT4KLQkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5zdGVwPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+PC9lbnRyeT4KLQkgICAgPGVudHJ5PlRoZSBzdGVwIHZhbHVlIG9mIHRoZSBjb250cm9sLiBTZWUgJnY0bDItcXVlcnljdHJsOy48L2VudHJ5PgotCSAgPC9yb3c+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmRlZmF1bHRfdmFsdWU8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIGRlZmF1bHQgdmFsdWUgdmFsdWUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1xdWVyeWN0cmw7LjwvZW50cnk+Ci0JICA8L3Jvdz4KLQk8L3Rib2R5PgotICAgICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KLQotICAgIDx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSJub25lIiBpZD0iY2hhbmdlcy1mbGFncyI+Ci0gICAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgICA8dGdyb3VwIGNvbHM9IjMiPgotCSZjcy1kZWY7Ci0JPHRib2R5IHZhbGlnbj0idG9wIj4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9DVFJMX0NIX1ZBTFVFPC9jb25zdGFudD48L2VudHJ5PgotCSAgICA8ZW50cnk+MHgwMDAxPC9lbnRyeT4KLQkgICAgPGVudHJ5PlRoaXMgY29udHJvbCBldmVudCB3YXMgdHJpZ2dlcmVkIGJlY2F1c2UgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sCi0JCWNoYW5nZWQuIFNwZWNpYWwgY2FzZTogaWYgYSBidXR0b24gY29udHJvbCBpcyBwcmVzc2VkLCB0aGVuIHRoaXMKLQkJZXZlbnQgaXMgc2VudCBhcyB3ZWxsLCBldmVuIHRob3VnaCB0aGVyZSBpcyBub3QgZXhwbGljaXQgdmFsdWUKLQkJYXNzb2NpYXRlZCB3aXRoIGEgYnV0dG9uIGNvbnRyb2wuPC9lbnRyeT4KLQkgIDwvcm93PgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX0NUUkxfQ0hfRkxBR1M8L2NvbnN0YW50PjwvZW50cnk+Ci0JICAgIDxlbnRyeT4weDAwMDI8L2VudHJ5PgotCSAgICA8ZW50cnk+VGhpcyBjb250cm9sIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYmVjYXVzZSB0aGUgY29udHJvbCBmbGFncwotCQljaGFuZ2VkLjwvZW50cnk+Ci0JICA8L3Jvdz4KLQk8L3Rib2R5PgotICAgICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KICAgPC9yZWZzZWN0MT4KICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbXRkbmFuZC50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL210ZG5hbmQudG1wbAppbmRleCAxNzkxMGUyLi4wYzY3NGJlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbXRkbmFuZC50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tdGRuYW5kLnRtcGwKQEAgLTU3Miw3ICs1NzIsNyBAQAogCQkJPC9wYXJhPgogCQkJPHBhcmE+CiAJCQkJVGhlIHNpbXBsZXN0IHdheSB0byBhY3RpdmF0ZSB0aGUgRkxBU0ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlIHN1cHBvcnQgCi0JCQkJaXMgdG8gc2V0IHRoZSBvcHRpb24gTkFORF9VU0VfRkxBU0hfQkJUIGluIHRoZSBvcHRpb24gZmllbGQgb2YKKwkJCQlpcyB0byBzZXQgdGhlIG9wdGlvbiBOQU5EX0JCVF9VU0VfRkxBU0ggaW4gdGhlIGJidF9vcHRpb24gZmllbGQgb2YKIAkJCQl0aGUgbmFuZCBjaGlwIHN0cnVjdHVyZSBiZWZvcmUgY2FsbGluZyBuYW5kX3NjYW4oKS4gRm9yIEFHLUFORAogCQkJCWNoaXBzIGlzIHRoaXMgZG9uZSBieSBkZWZhdWx0LgogCQkJCVRoaXMgYWN0aXZhdGVzIHRoZSBkZWZhdWx0IEZMQVNIIGJhc2VkIGJhZCBibG9jayB0YWJsZSBmdW5jdGlvbmFsaXR5IApAQCAtNzczLDIwICs3NzMsNiBAQAogCQkJCWRvbmUgYWNjb3JkaW5nIHRvIHRoZSBkZWZhdWx0IGJ1aWx0aW4gc2NoZW1lLgogCQkJPC9wYXJhPgogCQk8L3NlY3QyPgotCQk8c2VjdDIgaWQ9IlVzZXJfc3BhY2VfcGxhY2VtZW50X3NlbGVjdGlvbiI+Ci0JCQk8dGl0bGU+VXNlciBzcGFjZSBwbGFjZW1lbnQgc2VsZWN0aW9uPC90aXRsZT4KLQkJPHBhcmE+Ci0JCQlBbGwgbm9uIGVjYyBmdW5jdGlvbnMgbGlrZSBtdGQtPnJlYWQgYW5kIG10ZC0+d3JpdGUgdXNlIGFuIGludGVybmFsIAotCQkJc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgc2V0IGJ5IGFuIGlvY3RsLiBUaGlzIHN0cnVjdHVyZSBpcyBwcmVzZXQgCi0JCQl0byB0aGUgYXV0b3BsYWNlbWVudCBkZWZhdWx0LgotCSAgICAgCQk8cHJvZ3JhbWxpc3Rpbmc+Ci0JaW9jdGwgKGZkLCBNRU1TRVRPT0JTRUwsIG9vYnNlbCk7Ci0JICAgICAJCTwvcHJvZ3JhbWxpc3Rpbmc+Ci0JCQlvb2JzZWwgaXMgYSBwb2ludGVyIHRvIGEgdXNlciBzdXBwbGllZCBzdHJ1Y3R1cmUgb2YgdHlwZQotCQkJbmFuZF9vb2Jjb25maWcuIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSAKLQkJCWNyaXRlcmlhIG9mIHRoZSBmaWxlc3lzdGVtLCB3aGljaCB3aWxsIGJlIHVzZWQuIFNlZSBhbiBleGFtcGxlIGluIHV0aWxzL25hbmR3cml0ZS5jLgotCQk8L3BhcmE+Ci0JCTwvc2VjdDI+CiAJPC9zZWN0MT4JCiAJPHNlY3QxIGlkPSJTcGFyZV9hcmVhX2F1dG9wbGFjZW1lbnRfZGVmYXVsdCI+CiAJCTx0aXRsZT5TcGFyZSBhcmVhIGF1dG9wbGFjZW1lbnQgZGVmYXVsdCBzY2hlbWVzPC90aXRsZT4KQEAgLTExNTgsOSArMTE0NCw2IEBACiAJCVRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiBuYW5kLmguIFRoZXkgYXJlIG9yZWQgdG9nZXRoZXIgdG8gZGVzY3JpYmUKIAkJdGhlIGZ1bmN0aW9uYWxpdHkuCiAgICAgIAkJPHByb2dyYW1saXN0aW5nPgotLyogVXNlIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlLiBUaGlzIG9wdGlvbiBpcyBwYXJzZWQgYnkgdGhlCi0gKiBkZWZhdWx0IGJhZCBibG9jayB0YWJsZSBmdW5jdGlvbiAobmFuZF9kZWZhdWx0X2JidCkuICovCi0jZGVmaW5lIE5BTkRfVVNFX0ZMQVNIX0JCVAkweDAwMDEwMDAwCiAvKiBUaGUgaHcgZWNjIGdlbmVyYXRvciBwcm92aWRlcyBhIHN5bmRyb21lIGluc3RlYWQgYSBlY2MgdmFsdWUgb24gcmVhZCAKICAqIFRoaXMgY2FuIG9ubHkgd29yayBpZiB3ZSBoYXZlIHRoZSBlY2MgYnl0ZXMgZGlyZWN0bHkgYmVoaW5kIHRoZSAKICAqIGRhdGEgYnl0ZXMuIEFwcGxpZXMgZm9yIERPQyBhbmQgQUctQU5EIFJlbmVzYXMgSFcgUmVlZCBTb2xvbW9uIGdlbmVyYXRvcnMgKi8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCmluZGV4IDU5OGMyMmYuLjVkZTIzYzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbApAQCAtNDI4OCw3ICs0Mjg4LDcgQEAKIDwhW0NEQVRBWwogICBzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOwogICBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19NUFU0MDEsIHBvcnQsIGluZm9fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgaXJxLCBpcnFfZmxhZ3MsICZybWlkaSk7CisgICAgICAgICAgICAgICAgICAgICAgaXJxLCAmcm1pZGkpOwogXV0+CiAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CkBAIC00MzQzLDYgKzQzNDMsMTMgQEAKIAlieSBpdHNlbGYgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbSBpbiB0aGUgaXJxIGhhbmRsZXIuCiAJPC9wYXJhPgogCisJPHBhcmE+CisJSWYgdGhlIE1QVS00MDEgaW50ZXJmYWNlIHNoYXJlcyBpdHMgaW50ZXJydXB0IHdpdGggdGhlIG90aGVyIGxvZ2ljYWwKKwlkZXZpY2VzIG9uIHRoZSBjYXJkLCBzZXQgPGNvbnN0YW50Pk1QVTQwMV9JTkZPX0lSUV9IT09LPC9jb25zdGFudD4KKwkoc2VlIDxsaW5rIGxpbmtlbmQ9Im1pZGktaW50ZXJmYWNlLWludGVycnVwdC1oYW5kbGVyIj48Y2l0ZXRpdGxlPgorCWJlbG93PC9jaXRldGl0bGU+PC9saW5rPikuCisJPC9wYXJhPgorCiAgICAgICA8cGFyYT4KICAgICAgICAgVXN1YWxseSwgdGhlIHBvcnQgYWRkcmVzcyBjb3JyZXNwb25kcyB0byB0aGUgY29tbWFuZCBwb3J0IGFuZAogICAgICAgICBwb3J0ICsgMSBjb3JyZXNwb25kcyB0byB0aGUgZGF0YSBwb3J0LiBJZiBub3QsIHlvdSBtYXkgY2hhbmdlCkBAIC00Mzc1LDE0ICs0MzgyLDEyIEBACiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgotICAgICAgICBUaGUgNnRoIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgaXJxIG51bWJlciBmb3IgVUFSVC4gSWYgdGhlIGlycQotICAgICAgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIHBhc3MgMCB0byB0aGUgN3RoIGFyZ3VtZW50Ci0gICAgICAoPHBhcmFtZXRlcj5pcnFfZmxhZ3M8L3BhcmFtZXRlcj4pLiBPdGhlcndpc2UsIHBhc3MgdGhlIGZsYWdzCi0gICAgICBmb3IgaXJxIGFsbG9jYXRpb24gCi0gICAgICAoPGNvbnN0YW50PlNBX1hYWDwvY29uc3RhbnQ+IGJpdHMpIHRvIGl0LCBhbmQgdGhlIGlycSB3aWxsIGJlCi0gICAgICByZXNlcnZlZCBieSB0aGUgbXB1NDAxLXVhcnQgbGF5ZXIuIElmIHRoZSBjYXJkIGRvZXNuJ3QgZ2VuZXJhdGUKLSAgICAgIFVBUlQgaW50ZXJydXB0cywgcGFzcyAtMSBhcyB0aGUgaXJxIG51bWJlci4gVGhlbiBhIHRpbWVyCi0gICAgICBpbnRlcnJ1cHQgd2lsbCBiZSBpbnZva2VkIGZvciBwb2xsaW5nLiAKKwlUaGUgNnRoIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgSVNBIGlycSBudW1iZXIgdGhhdCB3aWxsIGJlCisJYWxsb2NhdGVkLiAgSWYgbm8gaW50ZXJydXB0IGlzIHRvIGJlIGFsbG9jYXRlZCAoYmVjYXVzZSB5b3VyCisJY29kZSBpcyBhbHJlYWR5IGFsbG9jYXRpbmcgYSBzaGFyZWQgaW50ZXJydXB0LCBvciBiZWNhdXNlIHRoZQorCWRldmljZSBkb2VzIG5vdCB1c2UgaW50ZXJydXB0cyksIHBhc3MgLTEgaW5zdGVhZC4KKwlGb3IgYSBNUFUtNDAxIGRldmljZSB3aXRob3V0IGFuIGludGVycnVwdCwgYSBwb2xsaW5nIHRpbWVyCisJd2lsbCBiZSB1c2VkIGluc3RlYWQuCiAgICAgICA8L3BhcmE+CiAgICAgPC9zZWN0aW9uPgogCkBAIC00MzkwLDEyICs0Mzk1LDEzIEBACiAgICAgICA8dGl0bGU+SW50ZXJydXB0IEhhbmRsZXI8L3RpdGxlPgogICAgICAgPHBhcmE+CiAgICAgICAgIFdoZW4gdGhlIGludGVycnVwdCBpcyBhbGxvY2F0ZWQgaW4KLSAgICAgIDxmdW5jdGlvbj5zbmRfbXB1NDAxX3VhcnRfbmV3KCk8L2Z1bmN0aW9uPiwgdGhlIHByaXZhdGUKLSAgICAgIGludGVycnVwdCBoYW5kbGVyIGlzIHVzZWQsIGhlbmNlIHlvdSBkb24ndCBoYXZlIGFueXRoaW5nIGVsc2UgdG8gZG8KLSAgICAgIHRoYW4gY3JlYXRpbmcgdGhlIG1wdTQwMSBzdHVmZi4gT3RoZXJ3aXNlLCB5b3UgaGF2ZSB0byBjYWxsCi0gICAgICA8ZnVuY3Rpb24+c25kX21wdTQwMV91YXJ0X2ludGVycnVwdCgpPC9mdW5jdGlvbj4gZXhwbGljaXRseSB3aGVuCi0gICAgICBhIFVBUlQgaW50ZXJydXB0IGlzIGludm9rZWQgYW5kIGNoZWNrZWQgaW4geW91ciBvd24gaW50ZXJydXB0Ci0gICAgICBoYW5kbGVyLiAgCisgICAgICA8ZnVuY3Rpb24+c25kX21wdTQwMV91YXJ0X25ldygpPC9mdW5jdGlvbj4sIGFuIGV4Y2x1c2l2ZSBJU0EKKyAgICAgIGludGVycnVwdCBoYW5kbGVyIGlzIGF1dG9tYXRpY2FsbHkgdXNlZCwgaGVuY2UgeW91IGRvbid0IGhhdmUKKyAgICAgIGFueXRoaW5nIGVsc2UgdG8gZG8gdGhhbiBjcmVhdGluZyB0aGUgbXB1NDAxIHN0dWZmLiAgT3RoZXJ3aXNlLCB5b3UKKyAgICAgIGhhdmUgdG8gc2V0IDxjb25zdGFudD5NUFU0MDFfSU5GT19JUlFfSE9PSzwvY29uc3RhbnQ+LCBhbmQgY2FsbAorICAgICAgPGZ1bmN0aW9uPnNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoKTwvZnVuY3Rpb24+IGV4cGxpY2l0bHkgZnJvbSB5b3VyCisgICAgICBvd24gaW50ZXJydXB0IGhhbmRsZXIgd2hlbiBpdCBoYXMgZGV0ZXJtaW5lZCB0aGF0IGEgVUFSVCBpbnRlcnJ1cHQKKyAgICAgIGhhcyBvY2N1cnJlZC4KICAgICAgIDwvcGFyYT4KIAogICAgICAgPHBhcmE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Jsb2NrL3N3aXRjaGluZy1zY2hlZC50eHQgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL3N3aXRjaGluZy1zY2hlZC50eHQKaW5kZXggNzFjZmJkYy4uM2IyNjEyZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ibG9jay9zd2l0Y2hpbmctc2NoZWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYmxvY2svc3dpdGNoaW5nLXNjaGVkLnR4dApAQCAtMSw2ICsxLDYgQEAKIFRvIGNob29zZSBJTyBzY2hlZHVsZXJzIGF0IGJvb3QgdGltZSwgdXNlIHRoZSBhcmd1bWVudCAnZWxldmF0b3I9ZGVhZGxpbmUnLgotJ25vb3AnLCAnYXMnIGFuZCAnY2ZxJyAodGhlIGRlZmF1bHQpIGFyZSBhbHNvIGF2YWlsYWJsZS4gSU8gc2NoZWR1bGVycyBhcmUKLWFzc2lnbmVkIGdsb2JhbGx5IGF0IGJvb3QgdGltZSBvbmx5IHByZXNlbnRseS4KKydub29wJyBhbmQgJ2NmcScgKHRoZSBkZWZhdWx0KSBhcmUgYWxzbyBhdmFpbGFibGUuIElPIHNjaGVkdWxlcnMgYXJlIGFzc2lnbmVkCitnbG9iYWxseSBhdCBib290IHRpbWUgb25seSBwcmVzZW50bHkuCiAKIEVhY2ggaW8gcXVldWUgaGFzIGEgc2V0IG9mIGlvIHNjaGVkdWxlciB0dW5hYmxlcyBhc3NvY2lhdGVkIHdpdGggaXQuIFRoZXNlCiB0dW5hYmxlcyBjb250cm9sIGhvdyB0aGUgaW8gc2NoZWR1bGVyIHdvcmtzLiBZb3UgY2FuIGZpbmQgdGhlc2UgZW50cmllcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9jY2lzcy50eHQgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L2NjaXNzLnR4dAppbmRleCBjMDBjNmE1Li43MTQ2NGUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L2NjaXNzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L2NjaXNzLnR4dApAQCAtNzgsNiArNzgsMTYgQEAKIC9kZXYvY2Npc3MvYzFkMXAyCQlDb250cm9sbGVyIDEsIGRpc2sgMSwgcGFydGl0aW9uIDIKIC9kZXYvY2Npc3MvYzFkMXAzCQlDb250cm9sbGVyIDEsIGRpc2sgMSwgcGFydGl0aW9uIDMKIAorQ0NJU1Mgc2ltcGxlIG1vZGUgc3VwcG9ydAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgImNjaXNzX3NpbXBsZV9tb2RlPTEiIGJvb3QgcGFyYW1ldGVyIG1heSBiZSB1c2VkIHRvIHByZXZlbnQgdGhlIGRyaXZlcgorZnJvbSBwdXR0aW5nIHRoZSBjb250cm9sbGVyIGludG8gInBlcmZvcm1hbnQiIG1vZGUuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQKK3dpdGggc2ltcGxlIG1vZGUsIGVhY2ggY29tbWFuZCBjb21wbGV0aW9uIHJlcXVpcmVzIGFuIGludGVycnVwdCwgd2hpbGUgd2l0aAorInBlcmZvcm1hbnQgbW9kZSIgKHRoZSBkZWZhdWx0LCBhbmQgb3JkaW5hcmlseSBiZXR0ZXIgcGVyZm9ybWluZykgaXQgaXMKK3Bvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY29tbWFuZCBjb21wbGV0aW9ucyBpbmRpY2F0ZWQgYnkgYSBzaW5nbGUKK2ludGVycnVwdC4KKwogU0NTSSB0YXBlIGRyaXZlIGFuZCBtZWRpdW0gY2hhbmdlciBzdXBwb3J0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0CmluZGV4IGNkNjdlOTAuLjljNDUyZWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQKQEAgLTQ1NCw4ICs0NTQsOCBAQAogbW92ZSBpdCBpbnRvIGEgbmV3IGNncm91cCAocG9zc2libHkgdGhlIHJvb3QgY2dyb3VwKSBieSB3cml0aW5nIHRvIHRoZQogbmV3IGNncm91cCdzIHRhc2tzIGZpbGUuCiAKLU5vdGU6IElmIHRoZSBucyBjZ3JvdXAgaXMgYWN0aXZlLCBtb3ZpbmcgYSBwcm9jZXNzIHRvIGFub3RoZXIgY2dyb3VwIGNhbgotZmFpbC4KK05vdGU6IER1ZSB0byBzb21lIHJlc3RyaWN0aW9ucyBlbmZvcmNlZCBieSBzb21lIGNncm91cCBzdWJzeXN0ZW1zLCBtb3ZpbmcKK2EgcHJvY2VzcyB0byBhbm90aGVyIGNncm91cCBjYW4gZmFpbC4KIAogMi4zIE1vdW50aW5nIGhpZXJhcmNoaWVzIGJ5IG5hbWUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZnJlZXplci1zdWJzeXN0ZW0udHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2ZyZWV6ZXItc3Vic3lzdGVtLnR4dAppbmRleCBjMjFkNzc3Li43ZTYyZGUxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZnJlZXplci1zdWJzeXN0ZW0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9mcmVlemVyLXN1YnN5c3RlbS50eHQKQEAgLTMzLDkgKzMzLDkgQEAKIAogCUZyb20gYSBzZWNvbmQsIHVucmVsYXRlZCBiYXNoIHNoZWxsOgogCSQga2lsbCAtU0lHU1RPUCAxNjY5MAotCSQga2lsbCAtU0lHQ09OVCAxNjk5MAorCSQga2lsbCAtU0lHQ09OVCAxNjY5MAogCi0JPGF0IHRoaXMgcG9pbnQgMTY5OTAgZXhpdHMgYW5kIGNhdXNlcyAxNjY0NCB0byBleGl0IHRvbz4KKwk8YXQgdGhpcyBwb2ludCAxNjY5MCBleGl0cyBhbmQgY2F1c2VzIDE2NjQ0IHRvIGV4aXQgdG9vPgogCiBUaGlzIGhhcHBlbnMgYmVjYXVzZSBiYXNoIGNhbiBvYnNlcnZlIGJvdGggc2lnbmFscyBhbmQgY2hvb3NlIGhvdyBpdAogcmVzcG9uZHMgdG8gdGhlbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbW9yeS50eHQKaW5kZXggMDZlYjZkOS4uY2MwZWJjNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbW9yeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbW9yeS50eHQKQEAgLTQxOCw3ICs0MTgsNiBAQAogCiAjIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBzdGF0cyBhcmUgZGVwZW5kZW50IG9uIENPTkZJR19ERUJVR19WTS4KIAotaW5hY3RpdmVfcmF0aW8JCS0gVk0gaW50ZXJuYWwgcGFyYW1ldGVyLiAoc2VlIG1tL3BhZ2VfYWxsb2MuYykKIHJlY2VudF9yb3RhdGVkX2Fub24JLSBWTSBpbnRlcm5hbCBwYXJhbWV0ZXIuIChzZWUgbW0vdm1zY2FuLmMpCiByZWNlbnRfcm90YXRlZF9maWxlCS0gVk0gaW50ZXJuYWwgcGFyYW1ldGVyLiAoc2VlIG1tL3Ztc2Nhbi5jKQogcmVjZW50X3NjYW5uZWRfYW5vbgktIFZNIGludGVybmFsIHBhcmFtZXRlci4gKHNlZSBtbS92bXNjYW4uYykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1sb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWxvZy50eHQKaW5kZXggOTk0ZGQ3NS4uYzE1NWFjNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWxvZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWxvZy50eHQKQEAgLTQ4LDcgKzQ4LDcgQEAKIGNvbW11bmljYXRpb24uCiAKIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIHVzZXJzcGFjZSBsb2cgaW1wbGVtZW50YXRpb25zIHRoYXQgbGV2ZXJhZ2UgdGhpcwotZnJhbWV3b3JrIC0gImNsdXN0ZXJlZF9kaXNrIiBhbmQgImNsdXN0ZXJlZF9jb3JlIi4gIFRoZXNlIGltcGxlbWVudGF0aW9ucworZnJhbWV3b3JrIC0gImNsdXN0ZXJlZC1kaXNrIiBhbmQgImNsdXN0ZXJlZC1jb3JlIi4gIFRoZXNlIGltcGxlbWVudGF0aW9ucwogcHJvdmlkZSBhIGNsdXN0ZXItY29oZXJlbnQgbG9nIGZvciBzaGFyZWQtc3RvcmFnZS4gIERldmljZS1tYXBwZXIgbWlycm9yaW5nCiBjYW4gYmUgdXNlZCBpbiBhIHNoYXJlZC1zdG9yYWdlIGVudmlyb25tZW50IHdoZW4gdGhlIGNsdXN0ZXIgbG9nIGltcGxlbWVudGF0aW9ucwogYXJlIGVtcGxveWVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL3BlcnNpc3RlbnQtZGF0YS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvcGVyc2lzdGVudC1kYXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTVkZjliCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL3BlcnNpc3RlbnQtZGF0YS50eHQKQEAgLTAsMCArMSw4NCBAQAorSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworVGhlIG1vcmUtc29waGlzdGljYXRlZCBkZXZpY2UtbWFwcGVyIHRhcmdldHMgcmVxdWlyZSBjb21wbGV4IG1ldGFkYXRhCit0aGF0IGlzIG1hbmFnZWQgaW4ga2VybmVsLiAgSW4gbGF0ZSAyMDEwIHdlIHdlcmUgc2VlaW5nIHRoYXQgdmFyaW91cworZGlmZmVyZW50IHRhcmdldHMgd2VyZSByb2xsaW5nIHRoZWlyIG93biBkYXRhIHN0cnV0dXJlcywgZm9yIGV4YW1wbGU6CisKKy0gTWlrdWxhcyBQYXRvY2thJ3MgbXVsdGlzbmFwIGltcGxlbWVudGF0aW9uCistIEhlaW56IE1hdWVsc2hhZ2VuJ3MgdGhpbiBwcm92aXNpb25pbmcgdGFyZ2V0CistIEFub3RoZXIgYnRyZWUtYmFzZWQgY2FjaGluZyB0YXJnZXQgcG9zdGVkIHRvIGRtLWRldmVsCistIEFub3RoZXIgbXVsdGktc25hcHNob3QgdGFyZ2V0IGJhc2VkIG9uIGEgZGVzaWduIG9mIERhbmllbCBQaGlsbGlwcworCitNYWludGFpbmluZyB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgdGFrZXMgYSBsb3Qgb2Ygd29yaywgc28gaWYgcG9zc2libGUKK3dlJ2QgbGlrZSB0byByZWR1Y2UgdGhlIG51bWJlci4KKworVGhlIHBlcnNpc3RlbnQtZGF0YSBsaWJyYXJ5IGlzIGFuIGF0dGVtcHQgdG8gcHJvdmlkZSBhIHJlLXVzYWJsZQorZnJhbWV3b3JrIGZvciBwZW9wbGUgd2hvIHdhbnQgdG8gc3RvcmUgbWV0YWRhdGEgaW4gZGV2aWNlLW1hcHBlcgordGFyZ2V0cy4gIEl0J3MgY3VycmVudGx5IHVzZWQgYnkgdGhlIHRoaW4tcHJvdmlzaW9uaW5nIHRhcmdldCBhbmQgYW4KK3VwY29taW5nIGhpZXJhcmNoaWNhbCBzdG9yYWdlIHRhcmdldC4KKworT3ZlcnZpZXcKKz09PT09PT09CisKK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gdGhlIGhlYWRlciBmaWxlcyB3aGljaCBjYW4gYWxsIGJlIGZvdW5kCit1bmRlciBkcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS4KKworVGhlIGJsb2NrIG1hbmFnZXIKKy0tLS0tLS0tLS0tLS0tLS0tCisKK2RtLWJsb2NrLW1hbmFnZXIuW2hjXQorCitUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGF0YSBvbiBkaXNrIGluIGZpeGVkIHNpemVkLWJsb2Nrcy4gIFRoZXJlCitpcyBhIHJlYWQvd3JpdGUgbG9ja2luZyBpbnRlcmZhY2UgdG8gcHJldmVudCBjb25jdXJyZW50IGFjY2Vzc2VzLCBhbmQKK2tlZXAgZGF0YSB0aGF0IGlzIGJlaW5nIHVzZWQgaW4gdGhlIGNhY2hlLgorCitDbGllbnRzIG9mIHBlcnNpc3RlbnQtZGF0YSBhcmUgdW5saWtlbHkgdG8gdXNlIHRoaXMgZGlyZWN0bHkuCisKK1RoZSB0cmFuc2FjdGlvbiBtYW5hZ2VyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkbS10cmFuc2FjdGlvbi1tYW5hZ2VyLltoY10KKworVGhpcyByZXN0cmljdHMgYWNjZXNzIHRvIGJsb2NrcyBhbmQgZW5mb3JjZXMgY29weS1vbi13cml0ZSBzZW1hbnRpY3MuCitUaGUgb25seSB3YXkgeW91IGNhbiBnZXQgaG9sZCBvZiBhIHdyaXRhYmxlIGJsb2NrIHRocm91Z2ggdGhlCit0cmFuc2FjdGlvbiBtYW5hZ2VyIGlzIGJ5IHNoYWRvd2luZyBhbiBleGlzdGluZyBibG9jayAoaWUuIGRvaW5nCitjb3B5LW9uLXdyaXRlKSBvciBhbGxvY2F0aW5nIGEgZnJlc2ggb25lLiAgU2hhZG93aW5nIGlzIGVsaWRlZCB3aXRoaW4KK3RoZSBzYW1lIHRyYW5zYWN0aW9uIHNvIHBlcmZvcm1hbmNlIGlzIHJlYXNvbmFibGUuICBUaGUgY29tbWl0IG1ldGhvZAorZW5zdXJlcyB0aGF0IGFsbCBkYXRhIGlzIGZsdXNoZWQgYmVmb3JlIGl0IHdyaXRlcyB0aGUgc3VwZXJibG9jay4KK09uIHBvd2VyIGZhaWx1cmUgeW91ciBtZXRhZGF0YSB3aWxsIGJlIGFzIGl0IHdhcyB3aGVuIGxhc3QgY29tbWl0dGVkLgorCitUaGUgU3BhY2UgTWFwcworLS0tLS0tLS0tLS0tLS0KKworZG0tc3BhY2UtbWFwLmgKK2RtLXNwYWNlLW1hcC1tZXRhZGF0YS5baGNdCitkbS1zcGFjZS1tYXAtZGlzay5baGNdCisKK09uLWRpc2sgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQga2VlcCB0cmFjayBvZiByZWZlcmVuY2UgY291bnRzIG9mIGJsb2Nrcy4KK0Fsc28gYWN0cyBhcyB0aGUgYWxsb2NhdG9yIG9mIG5ldyBibG9ja3MuICBDdXJyZW50bHkgdHdvCitpbXBsZW1lbnRhdGlvbnM6IGEgc2ltcGxlciBvbmUgZm9yIG1hbmFnaW5nIGJsb2NrcyBvbiBhIGRpZmZlcmVudAorZGV2aWNlIChlZy4gdGhpbmx5LXByb3Zpc2lvbmVkIGRhdGEgYmxvY2tzKTsgYW5kIG9uZSBmb3IgbWFuYWdpbmcKK3RoZSBtZXRhZGF0YSBzcGFjZS4gIFRoZSBsYXR0ZXIgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIG5lZWQgdG8gc3RvcmUKK2l0cyBvd24gZGF0YSB3aXRoaW4gdGhlIHNwYWNlIGl0J3MgbWFuYWdpbmcuCisKK1RoZSBkYXRhIHN0cnVjdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworZG0tYnRyZWUuW2hjXQorZG0tYnRyZWUtcmVtb3ZlLmMKK2RtLWJ0cmVlLXNwaW5lLmMKK2RtLWJ0cmVlLWludGVybmFsLmgKKworQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgb25lIGRhdGEgc3RydWN0dXJlLCBhIGhpZXJhcmNoaWNhbCBidHJlZS4KK1RoZXJlIGFyZSBwbGFucyB0byBhZGQgbW9yZS4gIEZvciBleGFtcGxlLCBzb21ldGhpbmcgd2l0aCBhbgorYXJyYXktbGlrZSBpbnRlcmZhY2Ugd291bGQgc2VlIGEgbG90IG9mIHVzZS4KKworVGhlIGJ0cmVlIGlzICdoaWVyYXJjaGljYWwnIGluIHRoYXQgeW91IGNhbiBkZWZpbmUgaXQgdG8gYmUgY29tcG9zZWQKK29mIG5lc3RlZCBidHJlZXMsIGFuZCB0YWtlIG11bHRpcGxlIGtleXMuICBGb3IgZXhhbXBsZSwgdGhlCit0aGluLXByb3Zpc2lvbmluZyB0YXJnZXQgdXNlcyBhIGJ0cmVlIHdpdGggdHdvIGxldmVscyBvZiBuZXN0aW5nLgorVGhlIGZpcnN0IG1hcHMgYSBkZXZpY2UgaWQgdG8gYSBtYXBwaW5nIHRyZWUsIGFuZCB0aGF0IGluIHR1cm4gbWFwcyBhCit2aXJ0dWFsIGJsb2NrIHRvIGEgcGh5c2ljYWwgYmxvY2suCisKK1ZhbHVlcyBzdG9yZWQgaW4gdGhlIGJ0cmVlcyBjYW4gaGF2ZSBhcmJpdHJhcnkgc2l6ZS4gIEtleXMgYXJlIGFsd2F5cworNjRiaXRzLCBhbHRob3VnaCBuZXN0aW5nIGFsbG93cyB5b3UgdG8gdXNlIG11bHRpcGxlIGtleXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvdGhpbi1wcm92aXNpb25pbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL3RoaW4tcHJvdmlzaW9uaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFkOWQxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL3RoaW4tcHJvdmlzaW9uaW5nLnR4dApAQCAtMCwwICsxLDI4NSBAQAorSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworVGhpcyBkb2N1bWVudCBkZXNjaWJlcyBhIGNvbGxlY3Rpb24gb2YgZGV2aWNlLW1hcHBlciB0YXJnZXRzIHRoYXQKK2JldHdlZW4gdGhlbSBpbXBsZW1lbnQgdGhpbi1wcm92aXNpb25pbmcgYW5kIHNuYXBzaG90cy4KKworVGhlIG1haW4gaGlnaGxpZ2h0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24sIGNvbXBhcmVkIHRvIHRoZSBwcmV2aW91cworaW1wbGVtZW50YXRpb24gb2Ygc25hcHNob3RzLCBpcyB0aGF0IGl0IGFsbG93cyBtYW55IHZpcnR1YWwgZGV2aWNlcyB0bworYmUgc3RvcmVkIG9uIHRoZSBzYW1lIGRhdGEgdm9sdW1lLiAgVGhpcyBzaW1wbGlmaWVzIGFkbWluaXN0cmF0aW9uIGFuZAorYWxsb3dzIHRoZSBzaGFyaW5nIG9mIGRhdGEgYmV0d2VlbiB2b2x1bWVzLCB0aHVzIHJlZHVjaW5nIGRpc2sgdXNhZ2UuCisKK0Fub3RoZXIgc2lnbmlmaWNhbnQgZmVhdHVyZSBpcyBzdXBwb3J0IGZvciBhbiBhcmJpdHJhcnkgZGVwdGggb2YKK3JlY3Vyc2l2ZSBzbmFwc2hvdHMgKHNuYXBzaG90cyBvZiBzbmFwc2hvdHMgb2Ygc25hcHNob3RzIC4uLikuICBUaGUKK3ByZXZpb3VzIGltcGxlbWVudGF0aW9uIG9mIHNuYXBzaG90cyBkaWQgdGhpcyBieSBjaGFpbmluZyB0b2dldGhlcgorbG9va3VwIHRhYmxlcywgYW5kIHNvIHBlcmZvcm1hbmNlIHdhcyBPKGRlcHRoKS4gIFRoaXMgbmV3CitpbXBsZW1lbnRhdGlvbiB1c2VzIGEgc2luZ2xlIGRhdGEgc3RydWN0dXJlIHRvIGF2b2lkIHRoaXMgZGVncmFkYXRpb24KK3dpdGggZGVwdGguICBGcmFnbWVudGF0aW9uIG1heSBzdGlsbCBiZSBhbiBpc3N1ZSwgaG93ZXZlciwgaW4gc29tZQorc2NlbmFyaW9zLgorCitNZXRhZGF0YSBpcyBzdG9yZWQgb24gYSBzZXBhcmF0ZSBkZXZpY2UgZnJvbSBkYXRhLCBnaXZpbmcgdGhlCithZG1pbmlzdHJhdG9yIHNvbWUgZnJlZWRvbSwgZm9yIGV4YW1wbGUgdG86CisKKy0gSW1wcm92ZSBtZXRhZGF0YSByZXNpbGllbmNlIGJ5IHN0b3JpbmcgbWV0YWRhdGEgb24gYSBtaXJyb3JlZCB2b2x1bWUKKyAgYnV0IGRhdGEgb24gYSBub24tbWlycm9yZWQgb25lLgorCistIEltcHJvdmUgcGVyZm9ybWFuY2UgYnkgc3RvcmluZyB0aGUgbWV0YWRhdGEgb24gU1NELgorCitTdGF0dXMKKz09PT09PQorCitUaGVzZSB0YXJnZXRzIGFyZSB2ZXJ5IG11Y2ggc3RpbGwgaW4gdGhlIEVYUEVSSU1FTlRBTCBzdGF0ZS4gIFBsZWFzZQorZG8gbm90IHlldCByZWx5IG9uIHRoZW0gaW4gcHJvZHVjdGlvbi4gIEJ1dCBkbyBleHBlcmltZW50IGFuZCBvZmZlciB1cworZmVlZGJhY2suICBEaWZmZXJlbnQgdXNlIGNhc2VzIHdpbGwgaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UKK2NoYXJhY3RlcmlzdGljcywgZm9yIGV4YW1wbGUgZHVlIHRvIGZyYWdtZW50YXRpb24gb2YgdGhlIGRhdGEgdm9sdW1lLgorCitJZiB5b3UgZmluZCB0aGlzIHNvZnR3YXJlIGlzIG5vdCBwZXJmb3JtaW5nIGFzIGV4cGVjdGVkIHBsZWFzZSBtYWlsCitkbS1kZXZlbEByZWRoYXQuY29tIHdpdGggZGV0YWlscyBhbmQgd2UnbGwgdHJ5IG91ciBiZXN0IHRvIGltcHJvdmUKK3RoaW5ncyBmb3IgeW91LgorCitVc2Vyc3BhY2UgdG9vbHMgZm9yIGNoZWNraW5nIGFuZCByZXBhaXJpbmcgdGhlIG1ldGFkYXRhIGFyZSB1bmRlcgorZGV2ZWxvcG1lbnQuCisKK0Nvb2tib29rCis9PT09PT09PQorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgcXVpY2sgcmVjaXBlcyBmb3IgdXNpbmcgdGhpbiBwcm92aXNpb25pbmcuCitUaGV5IHVzZSB0aGUgZG1zZXR1cCBwcm9ncmFtIHRvIGNvbnRyb2wgdGhlIGRldmljZS1tYXBwZXIgZHJpdmVyCitkaXJlY3RseS4gIEVuZCB1c2VycyB3aWxsIGJlIGFkdmlzZWQgdG8gdXNlIGEgaGlnaGVyLWxldmVsIHZvbHVtZQorbWFuYWdlciBzdWNoIGFzIExWTTIgb25jZSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLgorCitQb29sIGRldmljZQorLS0tLS0tLS0tLS0KKworVGhlIHBvb2wgZGV2aWNlIHRpZXMgdG9nZXRoZXIgdGhlIG1ldGFkYXRhIHZvbHVtZSBhbmQgdGhlIGRhdGEgdm9sdW1lLgorSXQgbWFwcyBJL08gbGluZWFybHkgdG8gdGhlIGRhdGEgdm9sdW1lIGFuZCB1cGRhdGVzIHRoZSBtZXRhZGF0YSB2aWEKK3R3byBtZWNoYW5pc21zOgorCistIEZ1bmN0aW9uIGNhbGxzIGZyb20gdGhlIHRoaW4gdGFyZ2V0cworCistIERldmljZS1tYXBwZXIgJ21lc3NhZ2VzJyBmcm9tIHVzZXJzcGFjZSB3aGljaCBjb250cm9sIHRoZSBjcmVhdGlvbiBvZiBuZXcKKyAgdmlydHVhbCBkZXZpY2VzIGFtb25nc3Qgb3RoZXIgdGhpbmdzLgorCitTZXR0aW5nIHVwIGEgZnJlc2ggcG9vbCBkZXZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZXR0aW5nIHVwIGEgcG9vbCBkZXZpY2UgcmVxdWlyZXMgYSB2YWxpZCBtZXRhZGF0YSBkZXZpY2UsIGFuZCBhCitkYXRhIGRldmljZS4gIElmIHlvdSBkbyBub3QgaGF2ZSBhbiBleGlzdGluZyBtZXRhZGF0YSBkZXZpY2UgeW91IGNhbgorbWFrZSBvbmUgYnkgemVyb2luZyB0aGUgZmlyc3QgNGsgdG8gaW5kaWNhdGUgZW1wdHkgbWV0YWRhdGEuCisKKyAgICBkZCBpZj0vZGV2L3plcm8gb2Y9JG1ldGFkYXRhX2RldiBicz00MDk2IGNvdW50PTEKKworVGhlIGFtb3VudCBvZiBtZXRhZGF0YSB5b3UgbmVlZCB3aWxsIHZhcnkgYWNjb3JkaW5nIHRvIGhvdyBtYW55IGJsb2NrcworYXJlIHNoYXJlZCBiZXR3ZWVuIHRoaW4gZGV2aWNlcyAoaS5lLiB0aHJvdWdoIHNuYXBzaG90cykuICBJZiB5b3UgaGF2ZQorbGVzcyBzaGFyaW5nIHRoYW4gYXZlcmFnZSB5b3UnbGwgbmVlZCBhIGxhcmdlci10aGFuLWF2ZXJhZ2UgbWV0YWRhdGEgZGV2aWNlLgorCitBcyBhIGd1aWRlLCB3ZSBzdWdnZXN0IHlvdSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyB0byB1c2UgaW4gdGhlCittZXRhZGF0YSBkZXZpY2UgYXMgNDggKiAkZGF0YV9kZXZfc2l6ZSAvICRkYXRhX2Jsb2NrX3NpemUgYnV0IHJvdW5kIGl0IHVwCit0byAyTUIgaWYgdGhlIGFuc3dlciBpcyBzbWFsbGVyLiAgVGhlIGxhcmdlc3Qgc2l6ZSBzdXBwb3J0ZWQgaXMgMTZHQi4KKworSWYgeW91J3JlIGNyZWF0aW5nIGxhcmdlIG51bWJlcnMgb2Ygc25hcHNob3RzIHdoaWNoIGFyZSByZWNvcmRpbmcgbGFyZ2UKK2Ftb3VudHMgb2YgY2hhbmdlLCB5b3UgbWF5IG5lZWQgZmluZCB5b3UgbmVlZCB0byBpbmNyZWFzZSB0aGlzLgorCitSZWxvYWRpbmcgYSBwb29sIHRhYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBtYXkgcmVsb2FkIGEgcG9vbCdzIHRhYmxlLCBpbmRlZWQgdGhpcyBpcyBob3cgdGhlIHBvb2wgaXMgcmVzaXplZAoraWYgaXQgcnVucyBvdXQgb2Ygc3BhY2UuICAoTi5CLiBXaGlsZSBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IG1ldGFkYXRhCitkZXZpY2Ugd2hlbiByZWxvYWRpbmcgaXMgbm90IGZvcmJpZGRlbiBhdCB0aGUgbW9tZW50LCB0aGluZ3Mgd2lsbCBnbword3JvbmcgaWYgaXQgZG9lcyBub3Qgcm91dGUgSS9PIHRvIGV4YWN0bHkgdGhlIHNhbWUgb24tZGlzayBsb2NhdGlvbiBhcworcHJldmlvdXNseS4pCisKK1VzaW5nIGFuIGV4aXN0aW5nIHBvb2wgZGV2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZG1zZXR1cCBjcmVhdGUgcG9vbCBcCisJLS10YWJsZSAiMCAyMDk3MTUyMCB0aGluLXBvb2wgJG1ldGFkYXRhX2RldiAkZGF0YV9kZXYgXAorCQkgJGRhdGFfYmxvY2tfc2l6ZSAkbG93X3dhdGVyX21hcmsiCisKKyRkYXRhX2Jsb2NrX3NpemUgZ2l2ZXMgdGhlIHNtYWxsZXN0IHVuaXQgb2YgZGlzayBzcGFjZSB0aGF0IGNhbiBiZQorYWxsb2NhdGVkIGF0IGEgdGltZSBleHByZXNzZWQgaW4gdW5pdHMgb2YgNTEyLWJ5dGUgc2VjdG9ycy4gIFBlb3BsZQorcHJpbWFyaWx5IGludGVyZXN0ZWQgaW4gdGhpbiBwcm92aXNpb25pbmcgbWF5IHdhbnQgdG8gdXNlIGEgdmFsdWUgc3VjaAorYXMgMTAyNCAoNTEyS0IpLiAgUGVvcGxlIGRvaW5nIGxvdHMgb2Ygc25hcHNob3R0aW5nIG1heSB3YW50IGEgc21hbGxlciB2YWx1ZQorc3VjaCBhcyAxMjggKDY0S0IpLiAgSWYgeW91IGFyZSBub3QgemVyb2luZyBuZXdseS1hbGxvY2F0ZWQgZGF0YSwKK2EgbGFyZ2VyICRkYXRhX2Jsb2NrX3NpemUgaW4gdGhlIHJlZ2lvbiBvZiAyNTYwMDAgKDEyOE1CKSBpcyBzdWdnZXN0ZWQuCiskZGF0YV9ibG9ja19zaXplIG11c3QgYmUgdGhlIHNhbWUgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUKK21ldGFkYXRhIGRldmljZS4KKworJGxvd193YXRlcl9tYXJrIGlzIGV4cHJlc3NlZCBpbiBibG9ja3Mgb2Ygc2l6ZSAkZGF0YV9ibG9ja19zaXplLiAgSWYKK2ZyZWUgc3BhY2Ugb24gdGhlIGRhdGEgZGV2aWNlIGRyb3BzIGJlbG93IHRoaXMgbGV2ZWwgdGhlbiBhIGRtIGV2ZW50Cit3aWxsIGJlIHRyaWdnZXJlZCB3aGljaCBhIHVzZXJzcGFjZSBkYWVtb24gc2hvdWxkIGNhdGNoIGFsbG93aW5nIGl0IHRvCitleHRlbmQgdGhlIHBvb2wgZGV2aWNlLiAgT25seSBvbmUgc3VjaCBldmVudCB3aWxsIGJlIHNlbnQuCitSZXN1bWluZyBhIGRldmljZSB3aXRoIGEgbmV3IHRhYmxlIGl0c2VsZiB0cmlnZ2VycyBhbiBldmVudCBzbyB0aGUKK3VzZXJzcGFjZSBkYWVtb24gY2FuIHVzZSB0aGlzIHRvIGRldGVjdCBhIHNpdHVhdGlvbiB3aGVyZSBhIG5ldyB0YWJsZQorYWxyZWFkeSBleGNlZWRzIHRoZSB0aHJlc2hvbGQuCisKK1RoaW4gcHJvdmlzaW9uaW5nCistLS0tLS0tLS0tLS0tLS0tLQorCitpKSBDcmVhdGluZyBhIG5ldyB0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lLgorCisgIFRvIGNyZWF0ZSBhIG5ldyB0aGlubHktIHByb3Zpc2lvbmVkIHZvbHVtZSB5b3UgbXVzdCBzZW5kIGEgbWVzc2FnZSB0byBhbgorICBhY3RpdmUgcG9vbCBkZXZpY2UsIC9kZXYvbWFwcGVyL3Bvb2wgaW4gdGhpcyBleGFtcGxlLgorCisgICAgZG1zZXR1cCBtZXNzYWdlIC9kZXYvbWFwcGVyL3Bvb2wgMCAiY3JlYXRlX3RoaW4gMCIKKworICBIZXJlICcwJyBpcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgdm9sdW1lLCBhIDI0LWJpdCBudW1iZXIuICBJdCdzIHVwCisgIHRvIHRoZSBjYWxsZXIgdG8gYWxsb2NhdGUgYW5kIG1hbmFnZSB0aGVzZSBpZGVudGlmaWVycy4gIElmIHRoZQorICBpZGVudGlmaWVyIGlzIGFscmVhZHkgaW4gdXNlLCB0aGUgbWVzc2FnZSB3aWxsIGZhaWwgd2l0aCAtRUVYSVNULgorCitpaSkgVXNpbmcgYSB0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lLgorCisgIFRoaW5seS1wcm92aXNpb25lZCB2b2x1bWVzIGFyZSBhY3RpdmF0ZWQgdXNpbmcgdGhlICd0aGluJyB0YXJnZXQ6CisKKyAgICBkbXNldHVwIGNyZWF0ZSB0aGluIC0tdGFibGUgIjAgMjA5NzE1MiB0aGluIC9kZXYvbWFwcGVyL3Bvb2wgMCIKKworICBUaGUgbGFzdCBwYXJhbWV0ZXIgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSB0aGlucCBkZXZpY2UuCisKK0ludGVybmFsIHNuYXBzaG90cworLS0tLS0tLS0tLS0tLS0tLS0tCisKK2kpIENyZWF0aW5nIGFuIGludGVybmFsIHNuYXBzaG90LgorCisgIFNuYXBzaG90cyBhcmUgY3JlYXRlZCB3aXRoIGFub3RoZXIgbWVzc2FnZSB0byB0aGUgcG9vbC4KKworICBOLkIuICBJZiB0aGUgb3JpZ2luIGRldmljZSB0aGF0IHlvdSB3aXNoIHRvIHNuYXBzaG90IGlzIGFjdGl2ZSwgeW91CisgIG11c3Qgc3VzcGVuZCBpdCBiZWZvcmUgY3JlYXRpbmcgdGhlIHNuYXBzaG90IHRvIGF2b2lkIGNvcnJ1cHRpb24uCisgIFRoaXMgaXMgTk9UIGVuZm9yY2VkIGF0IHRoZSBtb21lbnQsIHNvIHBsZWFzZSBiZSBjYXJlZnVsIQorCisgICAgZG1zZXR1cCBzdXNwZW5kIC9kZXYvbWFwcGVyL3RoaW4KKyAgICBkbXNldHVwIG1lc3NhZ2UgL2Rldi9tYXBwZXIvcG9vbCAwICJjcmVhdGVfc25hcCAxIDAiCisgICAgZG1zZXR1cCByZXN1bWUgL2Rldi9tYXBwZXIvdGhpbgorCisgIEhlcmUgJzEnIGlzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgdm9sdW1lLCBhIDI0LWJpdCBudW1iZXIuICAnMCcgaXMgdGhlCisgIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW4gZGV2aWNlLgorCitpaSkgVXNpbmcgYW4gaW50ZXJuYWwgc25hcHNob3QuCisKKyAgT25jZSBjcmVhdGVkLCB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW55IGNvbm5lY3Rpb24KKyAgYmV0d2VlbiB0aGUgb3JpZ2luIGFuZCB0aGUgc25hcHNob3QuICBJbmRlZWQgdGhlIHNuYXBzaG90IGlzIG5vCisgIGRpZmZlcmVudCBmcm9tIGFueSBvdGhlciB0aGlubHktcHJvdmlzaW9uZWQgZGV2aWNlIGFuZCBjYW4gYmUKKyAgc25hcHNob3R0ZWQgaXRzZWxmIHZpYSB0aGUgc2FtZSBtZXRob2QuICBJdCdzIHBlcmZlY3RseSBsZWdhbCB0bworICBoYXZlIG9ubHkgb25lIG9mIHRoZW0gYWN0aXZlLCBhbmQgdGhlcmUncyBubyBvcmRlcmluZyByZXF1aXJlbWVudCBvbgorICBhY3RpdmF0aW5nIG9yIHJlbW92aW5nIHRoZW0gYm90aC4gIChUaGlzIGRpZmZlcnMgZnJvbSBjb252ZW50aW9uYWwKKyAgZGV2aWNlLW1hcHBlciBzbmFwc2hvdHMuKQorCisgIEFjdGl2YXRlIGl0IGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGFueSBvdGhlciB0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lOgorCisgICAgZG1zZXR1cCBjcmVhdGUgc25hcCAtLXRhYmxlICIwIDIwOTcxNTIgdGhpbiAvZGV2L21hcHBlci9wb29sIDEiCisKK0RlYWN0aXZhdGlvbgorLS0tLS0tLS0tLS0tCisKK0FsbCBkZXZpY2VzIHVzaW5nIGEgcG9vbCBtdXN0IGJlIGRlYWN0aXZhdGVkIGJlZm9yZSB0aGUgcG9vbCBpdHNlbGYKK2NhbiBiZS4KKworICAgIGRtc2V0dXAgcmVtb3ZlIHRoaW4KKyAgICBkbXNldHVwIHJlbW92ZSBzbmFwCisgICAgZG1zZXR1cCByZW1vdmUgcG9vbAorCitSZWZlcmVuY2UKKz09PT09PT09PQorCisndGhpbi1wb29sJyB0YXJnZXQKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitpKSBDb25zdHJ1Y3RvcgorCisgICAgdGhpbi1wb29sIDxtZXRhZGF0YSBkZXY+IDxkYXRhIGRldj4gPGRhdGEgYmxvY2sgc2l6ZSAoc2VjdG9ycyk+IFwKKwkgICAgICA8bG93IHdhdGVyIG1hcmsgKGJsb2Nrcyk+IFs8bnVtYmVyIG9mIGZlYXR1cmUgYXJncz4gWzxhcmc+XSpdCisKKyAgICBPcHRpb25hbCBmZWF0dXJlIGFyZ3VtZW50czoKKyAgICAtICdza2lwX2Jsb2NrX3plcm9pbmcnOiBza2lwcyB0aGUgemVyb2luZyBvZiBuZXdseS1wcm92aXNpb25lZCBibG9ja3MuCisKKyAgICBEYXRhIGJsb2NrIHNpemUgbXVzdCBiZSBiZXR3ZWVuIDY0S0IgKDEyOCBzZWN0b3JzKSBhbmQgMUdCCisgICAgKDIwOTcxNTIgc2VjdG9ycykgaW5jbHVzaXZlLgorCisKK2lpKSBTdGF0dXMKKworICAgIDx0cmFuc2FjdGlvbiBpZD4gPHVzZWQgbWV0YWRhdGEgYmxvY2tzPi88dG90YWwgbWV0YWRhdGEgYmxvY2tzPgorICAgIDx1c2VkIGRhdGEgYmxvY2tzPi88dG90YWwgZGF0YSBibG9ja3M+IDxoZWxkIG1ldGFkYXRhIHJvb3Q+CisKKworICAgIHRyYW5zYWN0aW9uIGlkOgorCUEgNjQtYml0IG51bWJlciB1c2VkIGJ5IHVzZXJzcGFjZSB0byBoZWxwIHN5bmNocm9uaXNlIHdpdGggbWV0YWRhdGEKKwlmcm9tIHZvbHVtZSBtYW5hZ2Vycy4KKworICAgIHVzZWQgZGF0YSBibG9ja3MgLyB0b3RhbCBkYXRhIGJsb2NrcworCUlmIHRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgZHJvcHMgYmVsb3cgdGhlIHBvb2wncyBsb3cgd2F0ZXIgbWFyayBhCisJZG0gZXZlbnQgd2lsbCBiZSBzZW50IHRvIHVzZXJzcGFjZS4gIFRoaXMgZXZlbnQgaXMgZWRnZS10cmlnZ2VyZWQgYW5kCisJaXQgd2lsbCBvY2N1ciBvbmx5IG9uY2UgYWZ0ZXIgZWFjaCByZXN1bWUgc28gdm9sdW1lIG1hbmFnZXIgd3JpdGVycworCXNob3VsZCByZWdpc3RlciBmb3IgdGhlIGV2ZW50IGFuZCB0aGVuIGNoZWNrIHRoZSB0YXJnZXQncyBzdGF0dXMuCisKKyAgICBoZWxkIG1ldGFkYXRhIHJvb3Q6CisJVGhlIGxvY2F0aW9uLCBpbiBzZWN0b3JzLCBvZiB0aGUgbWV0YWRhdGEgcm9vdCB0aGF0IGhhcyBiZWVuCisJJ2hlbGQnIGZvciB1c2Vyc3BhY2UgcmVhZCBhY2Nlc3MuICAnLScgaW5kaWNhdGVzIHRoZXJlIGlzIG5vCisJaGVsZCByb290LiAgVGhpcyBmZWF0dXJlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgc28gJy0nIGlzCisJYWx3YXlzIHJldHVybmVkLgorCitpaWkpIE1lc3NhZ2VzCisKKyAgICBjcmVhdGVfdGhpbiA8ZGV2IGlkPgorCisJQ3JlYXRlIGEgbmV3IHRoaW5seS1wcm92aXNpb25lZCBkZXZpY2UuCisJPGRldiBpZD4gaXMgYW4gYXJiaXRyYXJ5IHVuaXF1ZSAyNC1iaXQgaWRlbnRpZmllciBjaG9zZW4gYnkKKwl0aGUgY2FsbGVyLgorCisgICAgY3JlYXRlX3NuYXAgPGRldiBpZD4gPG9yaWdpbiBpZD4KKworCUNyZWF0ZSBhIG5ldyBzbmFwc2hvdCBvZiBhbm90aGVyIHRoaW5seS1wcm92aXNpb25lZCBkZXZpY2UuCisJPGRldiBpZD4gaXMgYW4gYXJiaXRyYXJ5IHVuaXF1ZSAyNC1iaXQgaWRlbnRpZmllciBjaG9zZW4gYnkKKwl0aGUgY2FsbGVyLgorCTxvcmlnaW4gaWQ+IGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB0aGlubHktcHJvdmlzaW9uZWQgZGV2aWNlCisJb2Ygd2hpY2ggdGhlIG5ldyBkZXZpY2Ugd2lsbCBiZSBhIHNuYXBzaG90LgorCisgICAgZGVsZXRlIDxkZXYgaWQ+CisKKwlEZWxldGVzIGEgdGhpbiBkZXZpY2UuICBJcnJldmVyc2libGUuCisKKyAgICB0cmltIDxkZXYgaWQ+IDxuZXcgc2l6ZSBpbiBzZWN0b3JzPgorCisJRGVsZXRlIG1hcHBpbmdzIGZyb20gdGhlIGVuZCBvZiBhIHRoaW4gZGV2aWNlLiAgSXJyZXZlcnNpYmxlLgorCVlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSdyZSByZWR1Y2luZyB0aGUgc2l6ZSBvZgorCXlvdXIgdGhpbmx5LXByb3Zpc2lvbmVkIGRldmljZS4gIEluIG1hbnkgY2FzZXMsIGR1ZSB0byB0aGUKKwlzaGFyaW5nIG9mIGJsb2NrcyBiZXR3ZWVuIGRldmljZXMsIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworCWRldGVybWluZSBpbiBhZHZhbmNlIGhvdyBtdWNoIHNwYWNlICd0cmltJyB3aWxsIHJlbGVhc2UuICAoSW4KKwlmdXR1cmUgYSB1c2Vyc3BhY2UgdG9vbCBtaWdodCBiZSBhYmxlIHRvIHBlcmZvcm0gdGhpcworCWNhbGN1bGF0aW9uLikKKworICAgIHNldF90cmFuc2FjdGlvbl9pZCA8Y3VycmVudCBpZD4gPG5ldyBpZD4KKworCVVzZXJsYW5kIHZvbHVtZSBtYW5hZ2Vycywgc3VjaCBhcyBMVk0sIG5lZWQgYSB3YXkgdG8KKwlzeW5jaHJvbmlzZSB0aGVpciBleHRlcm5hbCBtZXRhZGF0YSB3aXRoIHRoZSBpbnRlcm5hbCBtZXRhZGF0YSBvZiB0aGUKKwlwb29sIHRhcmdldC4gIFRoZSB0aGluLXBvb2wgdGFyZ2V0IG9mZmVycyB0byBzdG9yZSBhbgorCWFyYml0cmFyeSA2NC1iaXQgdHJhbnNhY3Rpb24gaWQgYW5kIHJldHVybiBpdCBvbiB0aGUgdGFyZ2V0J3MKKwlzdGF0dXMgbGluZS4gIFRvIGF2b2lkIHJhY2VzIHlvdSBtdXN0IHByb3ZpZGUgd2hhdCB5b3UgdGhpbmsKKwl0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpZCBpcyB3aGVuIHlvdSBjaGFuZ2UgaXQgd2l0aCB0aGlzCisJY29tcGFyZS1hbmQtc3dhcCBtZXNzYWdlLgorCisndGhpbicgdGFyZ2V0CistLS0tLS0tLS0tLS0tCisKK2kpIENvbnN0cnVjdG9yCisKKyAgICB0aGluIDxwb29sIGRldj4gPGRldiBpZD4KKworICAgIHBvb2wgZGV2OgorCXRoZSB0aGluLXBvb2wgZGV2aWNlLCBlLmcuIC9kZXYvbWFwcGVyL215X3Bvb2wgb3IgMjUzOjAKKworICAgIGRldiBpZDoKKwl0aGUgaW50ZXJuYWwgZGV2aWNlIGlkZW50aWZpZXIgb2YgdGhlIGRldmljZSB0byBiZQorCWFjdGl2YXRlZC4KKworVGhlIHBvb2wgZG9lc24ndCBzdG9yZSBhbnkgc2l6ZSBhZ2FpbnN0IHRoZSB0aGluIGRldmljZXMuICBJZiB5b3UKK2xvYWQgYSB0aGluIHRhcmdldCB0aGF0IGlzIHNtYWxsZXIgdGhhbiB5b3UndmUgYmVlbiB1c2luZyBwcmV2aW91c2x5LAordGhlbiB5b3UnbGwgaGF2ZSBubyBhY2Nlc3MgdG8gYmxvY2tzIG1hcHBlZCBiZXlvbmQgdGhlIGVuZC4gIElmIHlvdQorbG9hZCBhIHRhcmdldCB0aGF0IGlzIGJpZ2dlciB0aGFuIGJlZm9yZSwgdGhlbiBleHRyYSBibG9ja3Mgd2lsbCBiZQorcHJvdmlzaW9uZWQgYXMgYW5kIHdoZW4gbmVlZGVkLgorCitJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIHNpemUgb2YgeW91ciB0aGluIGRldmljZSBhbmQgcG90ZW50aWFsbHkKK3JlZ2FpbiBzb21lIHNwYWNlIHRoZW4gc2VuZCB0aGUgJ3RyaW0nIG1lc3NhZ2UgdG8gdGhlIHBvb2wuCisKK2lpKSBTdGF0dXMKKworICAgICA8bnIgbWFwcGVkIHNlY3RvcnM+IDxoaWdoZXN0IG1hcHBlZCBzZWN0b3I+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2NhbHhlZGEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9jYWx4ZWRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzU1Y2FhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9jYWx4ZWRhLnR4dApAQCAtMCwwICsxLDggQEAKK0NhbHhlZGEgSGlnaGJhbmsgUGxhdGZvcm1zIERldmljZSBUcmVlIEJpbmRpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCb2FyZHMgd2l0aCBDYWx4ZWRhIENvcnRleC1BOSBiYXNlZCBIaWdoYmFuayBTT0Mgc2hhbGwgaGF2ZSB0aGUgZm9sbG93aW5nCitwcm9wZXJ0aWVzLgorCitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAiY2FseGVkYSxoaWdoYmFuayI7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2ZzbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2ZzbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4NDhhZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vZnNsLnR4dApAQCAtMCwwICsxLDI2IEBACitGcmVlc2NhbGUgaS5NWCBQbGF0Zm9ybXMgRGV2aWNlIFRyZWUgQmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2kuTVg1MSBCYWJiYWdlIEJvYXJkCitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWJhYmJhZ2UiLCAiZnNsLGlteDUxIjsKKworaS5NWDUzIEF1dG9tb3RpdmUgUmVmZXJlbmNlIERlc2lnbiBCb2FyZAorUmVxdWlyZWQgcm9vdCBub2RlIHByb3BlcnRpZXM6CisgICAgLSBjb21wYXRpYmxlID0gImZzbCxpbXg1My1hcmQiLCAiZnNsLGlteDUzIjsKKworaS5NWDUzIEV2YWx1YXRpb24gS2l0CitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWV2ayIsICJmc2wsaW14NTMiOworCitpLk1YNTMgUXVpY2sgU3RhcnQgQm9hcmQKK1JlcXVpcmVkIHJvb3Qgbm9kZSBwcm9wZXJ0aWVzOgorICAgIC0gY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtcXNiIiwgImZzbCxpbXg1MyI7CisKK2kuTVg1MyBTbWFydCBNb2JpbGUgUmVmZXJlbmNlIERlc2lnbiBCb2FyZAorUmVxdWlyZWQgcm9vdCBub2RlIHByb3BlcnRpZXM6CisgICAgLSBjb21wYXRpYmxlID0gImZzbCxpbXg1My1zbWQiLCAiZnNsLGlteDUzIjsKKworaS5NWDYgUXVhZCBTQUJSRSBBdXRvbW90aXZlIEJvYXJkCitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXNhYnJlYXV0byIsICJmc2wsaW14NnEiOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9naWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9naWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTE2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2dpYy50eHQKQEAgLTAsMCArMSw1NSBAQAorKiBBUk0gR2VuZXJpYyBJbnRlcnJ1cHQgQ29udHJvbGxlcgorCitBUk0gU01QIGNvcmVzIGFyZSBvZnRlbiBhc3NvY2lhdGVkIHdpdGggYSBHSUMsIHByb3ZpZGluZyBwZXIgcHJvY2Vzc29yCitpbnRlcnJ1cHRzIChQUEkpLCBzaGFyZWQgcHJvY2Vzc29yIGludGVycnVwdHMgKFNQSSkgYW5kIHNvZnR3YXJlCitnZW5lcmF0ZWQgaW50ZXJydXB0cyAoU0dJKS4KKworUHJpbWFyeSBHSUMgaXMgYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIENQVSBhbmQgdHlwaWNhbGx5IGhhcyBQUElzIGFuZCBTR0lzLgorU2Vjb25kYXJ5IEdJQ3MgYXJlIGNhc2NhZGVkIGludG8gdGhlIHVwd2FyZCBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgZG8gbm90CitoYXZlIFBQSXMgb3IgU0dJcy4KKworTWFpbiBub2RlIHJlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgb2Y6CisJImFybSxjb3J0ZXgtYTktZ2ljIgorCSJhcm0sYXJtMTFtcC1naWMiCistIGludGVycnVwdC1jb250cm9sbGVyIDogSWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorLSAjaW50ZXJydXB0LWNlbGxzIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgbmVlZGVkIHRvIGVuY29kZSBhbgorICBpbnRlcnJ1cHQgc291cmNlLiAgVGhlIHR5cGUgc2hhbGwgYmUgYSA8dTMyPiBhbmQgdGhlIHZhbHVlIHNoYWxsIGJlIDMuCisKKyAgVGhlIDFzdCBjZWxsIGlzIHRoZSBpbnRlcnJ1cHQgdHlwZTsgMCBmb3IgU1BJIGludGVycnVwdHMsIDEgZm9yIFBQSQorICBpbnRlcnJ1cHRzLgorCisgIFRoZSAybmQgY2VsbCBjb250YWlucyB0aGUgaW50ZXJydXB0IG51bWJlciBmb3IgdGhlIGludGVycnVwdCB0eXBlLgorICBTUEkgaW50ZXJydXB0cyBhcmUgaW4gdGhlIHJhbmdlIFswLTk4N10uICBQUEkgaW50ZXJydXB0cyBhcmUgaW4gdGhlCisgIHJhbmdlIFswLTE1XS4KKworICBUaGUgM3JkIGNlbGwgaXMgdGhlIGZsYWdzLCBlbmNvZGVkIGFzIGZvbGxvd3M6CisJYml0c1szOjBdIHRyaWdnZXIgdHlwZSBhbmQgbGV2ZWwgZmxhZ3MuCisJCTEgPSBsb3ctdG8taGlnaCBlZGdlIHRyaWdnZXJlZAorCQkyID0gaGlnaC10by1sb3cgZWRnZSB0cmlnZ2VyZWQKKwkJNCA9IGFjdGl2ZSBoaWdoIGxldmVsLXNlbnNpdGl2ZQorCQk4ID0gYWN0aXZlIGxvdyBsZXZlbC1zZW5zaXRpdmUKKwliaXRzWzE1OjhdIFBQSSBpbnRlcnJ1cHQgY3B1IG1hc2suICBFYWNoIGJpdCBjb3JyZXNwb25kcyB0byBlYWNoIG9mCisJdGhlIDggcG9zc2libGUgY3B1cyBhdHRhY2hlZCB0byB0aGUgR0lDLiAgQSBiaXQgc2V0IHRvICcxJyBpbmRpY2F0ZWQKKwl0aGUgaW50ZXJydXB0IGlzIHdpcmVkIHRvIHRoYXQgQ1BVLiAgT25seSB2YWxpZCBmb3IgUFBJIGludGVycnVwdHMuCisKKy0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyhzKSBhbmQgc2l6ZSBvZiB0aGUgR0lDIHJlZ2lzdGVycy4gVGhlCisgIGZpcnN0IHJlZ2lvbiBpcyB0aGUgR0lDIGRpc3RyaWJ1dG9yIHJlZ2lzdGVyIGJhc2UgYW5kIHNpemUuIFRoZSAybmQgcmVnaW9uIGlzCisgIHRoZSBHSUMgY3B1IGludGVyZmFjZSByZWdpc3RlciBiYXNlIGFuZCBzaXplLgorCitPcHRpb25hbAorLSBpbnRlcnJ1cHRzCTogSW50ZXJydXB0IHNvdXJjZSBvZiB0aGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLiBPbmx5CisgIHByZXNlbnQgb24gc2Vjb25kYXJ5IEdJQ3MuCisKK0V4YW1wbGU6CisKKwlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckBmZmYxMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCXJlZyA9IDwweGZmZjExMDAwIDB4MTAwMD4sCisJCSAgICAgIDwweGZmZjEwMTAwIDB4MTAwPjsKKwl9OworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvZHNwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9kc3AudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODMwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvZHNwLnR4dApAQCAtMCwwICsxLDE0IEBACisqIFRJIC0gRFNQIChEaWdpdGFsIFNpZ25hbCBQcm9jZXNzb3IpCisKK1RJIERTUCBpbmNsdWRlZCBpbiBPTUFQIFNvQworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJ0aSxvbWFwMy1jNjQiIGZvciBPTUFQMyAmIDQKKy0gdGksaHdtb2RzOiAiZHNwIgorCitFeGFtcGxlczoKKworZHNwIHsKKyAgICBjb21wYXRpYmxlID0gInRpLG9tYXAzLWM2NCI7CisgICAgdGksaHdtb2RzID0gImRzcCI7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9vbWFwL2l2YS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvaXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDYyOTUxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9vbWFwL2l2YS50eHQKQEAgLTAsMCArMSwxOSBAQAorKiBUSSAtIElWQSAoSW1hZ2luZyBhbmQgVmlkZW8gQWNjZWxlcmF0b3IpIHN1YnN5c3RlbQorCitUaGUgSVZBIGNvbnRhaW4gdmFyaW91cyBhdWRpbywgdmlkZW8gb3IgaW1hZ2luZyBIVyBhY2NlbGVyYXRvcgorZGVwZW5kaW5nIG9mIHRoZSB2ZXJzaW9uLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlOgorICAtICJ0aSxpdmFoZCIgZm9yIE9NQVA0CisgIC0gInRpLGl2YTIuMiIgZm9yIE9NQVAzCisgIC0gInRpLGl2YTIuMSIgZm9yIE9NQVAyNDMwCisgIC0gInRpLGl2YTEiIGZvciBPTUFQMjQyMAorLSB0aSxod21vZHM6ICJpdmEiCisKK0V4YW1wbGVzOgorCitpdmEgeworICAgIGNvbXBhdGlibGUgPSAidGksaXZhaGQiLCAidGksaXZhIjsKKyAgICB0aSxod21vZHMgPSAiaXZhIjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvbDMtbm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9sMy1ub2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODhhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvbDMtbm9jLnR4dApAQCAtMCwwICsxLDE5IEBACisqIFRJIC0gTDMgTmV0d29yayBPbiBDaGlwIChOb0MpCisKK1RoaXMgdmVyc2lvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2VuZXJpYyBOb0MgSVAKK3Byb3ZpZGVkIGJ5IEFydGVyaXMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInRpLG9tYXAzLWwzLXNteCIgZm9yIE9NQVAzIGZhbWlseQorICAgICAgICAgICAgICAgU2hvdWxkIGJlICJ0aSxvbWFwNC1sMy1ub2MiIGZvciBPTUFQNCBmYW1pbHkKKy0gdGksaHdtb2RzOiAibDNfbWFpbl8xIiwgLi4uIE9uZSBod21vZCBmb3IgZWFjaCBub2MgZG9tYWluLgorCitFeGFtcGxlczoKKworb2NwIHsKKwljb21wYXRpYmxlID0gInRpLG9tYXA0LWwzLW5vYyIsICJzaW1wbGUtYnVzIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlyYW5nZXM7CisJdGksaHdtb2RzID0gImwzX21haW5fMSIsICJsM19tYWluXzIiLCAibDNfbWFpbl8zIjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvbXB1LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9tcHUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNWE0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvbXB1LnR4dApAQCAtMCwwICsxLDI3IEBACisqIFRJIC0gTVBVIChNYWluIFByb2Nlc3NvciBVbml0KSBzdWJzeXN0ZW0KKworVGhlIE1QVSBzdWJzeXN0ZW0gY29udGFpbiBvbmUgb3Igc2V2ZXJhbCBBUk0gY29yZXMKK2RlcGVuZGluZyBvZiB0aGUgdmVyc2lvbi4KK1RoZSBNUFUgY29udGFpbiBDUFVzLCBHSUMsIEwyIGNhY2hlIGFuZCBhIGxvY2FsIFBSQ00uCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInRpLG9tYXAzLW1wdSIgZm9yIE9NQVAzCisgICAgICAgICAgICAgICBTaG91bGQgYmUgInRpLG9tYXA0LW1wdSIgZm9yIE9NQVA0CistIHRpLGh3bW9kczogIm1wdSIKKworRXhhbXBsZXM6CisKKy0gRm9yIGFuIE9NQVA0IFNNUCBzeXN0ZW06CisKK21wdSB7CisgICAgY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC1tcHUiOworICAgIHRpLGh3bW9kcyA9ICJtcHUiOworfTsKKworCistIEZvciBhbiBPTUFQMyBtb25vY29yZSBzeXN0ZW06CisKK21wdSB7CisgICAgY29tcGF0aWJsZSA9ICJ0aSxvbWFwMy1tcHUiOworICAgIHRpLGh3bW9kcyA9ICJtcHUiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9vbWFwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9vbWFwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRhYjQwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9vbWFwL29tYXAudHh0CkBAIC0wLDAgKzEsNDMgQEAKKyogVGV4YXMgSW5zdHJ1bWVudHMgT01BUAorCitPTUFQIGlzIGN1cnJlbnRseSB1c2luZyBhIHN0YXRpYyBmaWxlIHBlciBTb0MgZmFtaWx5IHRvIGRlc2NyaWJlIHRoZQorSVBzIHByZXNlbnQgaW4gdGhlIFNvQy4KK09uIHRvcCBvZiB0aGF0IGFuIG9tYXBfZGV2aWNlIGlzIGNyZWF0ZWQgdG8gZXh0ZW5kIHRoZSBwbGF0Zm9ybV9kZXZpY2UKK2NhcGFiaWxpdGllcyBhbmQgdG8gYWxsb3cgYmluZGluZyB3aXRoIG9uZSBvciBzZXZlcmFsIGh3bW9kcy4KK1RoZSBod21vZHMgd2lsbCBjb250YWluIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gYnVpbGQgdGhlIGRldmljZToKK2FkcmVzc2UgcmFuZ2UsIGlycSBsaW5lcywgZG1hIGxpbmVzLCBpbnRlcmNvbm5lY3QsIFBSQ00gcmVnaXN0ZXIsCitjbG9jayBkb21haW4sIGlucHV0IGNsb2Nrcy4KK0ZvciB0aGUgbW9tZW50IGp1c3QgcG9pbnQgdG8gdGhlIGV4aXN0aW5nIGh3bW9kLCB0aGUgbmV4dCBzdGVwIHdpbGwgYmUKK3RvIG1vdmUgZGF0YSBmcm9tIGh3bW9kIHRvIGRldmljZS10cmVlIHJlcHJlc2VudGF0aW9uLgorCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IEV2ZXJ5IGRldmljZXMgcHJlc2VudCBpbiBPTUFQIFNvQyBzaG91bGQgYmUgaW4gdGhlCisgIGZvcm06ICJ0aSxYWFgiCistIHRpLGh3bW9kczogbGlzdCBvZiBod21vZCBuYW1lcyAoYXNjaWkgc3RyaW5ncyksIHRoYXQgY29tZXMgZnJvbSB0aGUgT01BUAorICBIVyBkb2N1bWVudGF0aW9uLCBhdHRhY2hlZCB0byBhIGRldmljZS4gTXVzdCBjb250YWluIGF0IGxlYXN0CisgIG9uZSBod21vZC4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gdGksbm9faWRsZV9vbl9zdXNwZW5kOiBXaGVuIHByZXNlbnQsIGl0IHByZXZlbnRzIHRoZSBQTSB0byBpZGxlIHRoZSBtb2R1bGUKKyAgZHVyaW5nIHN1c3BlbmQuCisKKworRXhhbXBsZToKKworc3BpbmxvY2tAMSB7CisgICAgY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC1zcGlubG9jayI7CisgICAgdGksaHdtb2RzID0gInNwaW5sb2NrIjsKK307CisKKworQm9hcmRzOgorCistIE9NQVAzIEJlYWdsZUJvYXJkIDogTG93IGNvc3QgY29tbXVuaXR5IGJvYXJkCisgIGNvbXBhdGlibGUgPSAidGksb21hcDMtYmVhZ2xlIiwgInRpLG9tYXAzIgorCistIE9NQVA0IFNEUCA6IFNvZnR3YXJlIERldmVsb3BlbWVudCBCb2FyZAorICBjb21wYXRpYmxlID0gInRpLG9tYXA0LXNkcCIsICJ0aSxvbWFwNDQzMCIKKworLSBPTUFQNCBQYW5kYUJvYXJkIDogTG93IGNvc3QgY29tbXVuaXR5IGJvYXJkCisgIGNvbXBhdGlibGUgPSAidGksb21hcDQtcGFuZGEiLCAidGksb21hcDQ0MzAiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3BpY294Y2VsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3BpY294Y2VsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1YzBlZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcGljb3hjZWxsLnR4dApAQCAtMCwwICsxLDI0IEBACitQaWNvY2hpcCBwaWNvWGNlbGwgZGV2aWNlIHRyZWUgYmluZGluZ3MuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcXVpcmVkIHJvb3Qgbm9kZSBwcm9wZXJ0aWVzOgorICAgIC0gY29tcGF0aWJsZToKKwktICJwaWNvY2hpcCxwYzczMDItcGMzeDMiIDogUEM3MzAyIGRldmVsb3BtZW50IGJvYXJkIHdpdGggUEMzWDMgZGV2aWNlLgorCS0gInBpY29jaGlwLHBjNzMwMi1wYzN4MiIgOiBQQzczMDIgZGV2ZWxvcG1lbnQgYm9hcmQgd2l0aCBQQzNYMiBkZXZpY2UuCisJLSAicGljb2NoaXAscGMzeDMiIDogcGljb1hjZWxsIFBDM1gzIGRldmljZSBiYXNlZCBib2FyZC4KKwktICJwaWNvY2hpcCxwYzN4MiIgOiBwaWNvWGNlbGwgUEMzWDIgZGV2aWNlIGJhc2VkIGJvYXJkLgorCitUaW1lcnMgcmVxdWlyZWQgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItdGltZXIiCisgICAgLSBpbnRlcnJ1cHRzIDogVGhlIHNpbmdsZSBJUlEgbGluZSBmb3IgdGhlIHRpbWVyLgorICAgIC0gY2xvY2stZnJlcSA6IFRoZSBmcmVxdWVuY3kgaW4gSFogb2YgdGhlIHRpbWVyLgorICAgIC0gcmVnIDogVGhlIHJlZ2lzdGVyIGJhbmsgZm9yIHRoZSB0aW1lci4KKworTm90ZTogdHdvIHRpbWVycyBhcmUgcmVxdWlyZWQgLSBvbmUgZm9yIHRoZSBzY2hlZHVsZXIgY2xvY2sgYW5kIG9uZSBmb3IgdGhlCitldmVudCB0aWNrL05PSFouCisKK1ZJQyByZXF1aXJlZCBwcm9wZXJ0aWVzOgorICAgIC0gY29tcGF0aWJsZSA9ICJhcm0scGwxOTItdmljIi4KKyAgICAtIGludGVycnVwdC1jb250cm9sbGVyLgorICAgIC0gcmVnIDogVGhlIHJlZ2lzdGVyIGJhbmsgZm9yIHRoZSBkZXZpY2UuCisgICAgLSAjaW50ZXJydXB0LWNlbGxzIDogTXVzdCBiZSAxLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9wcmltZWNlbGwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9wcmltZWNlbGwudHh0CmluZGV4IDFkNWQ3YTguLjk1MWNhNDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcHJpbWVjZWxsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3ByaW1lY2VsbC50eHQKQEAgLTYsNyArNiw5IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBhIHNwZWNpZmljIHZhbHVlIGZvciBwZXJpcGhlcmFsIGFuZCAiYXJtLHByaW1lY2VsbCIKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBhIHNwZWNpZmljIG5hbWUgZm9yIHRoZSBwZXJpcGhlcmFsIGFuZAorICAgICAgICAgICAgICAgImFybSxwcmltZWNlbGwiLiAgVGhlIHNwZWNpZmljIG5hbWUgd2lsbCBtYXRjaCB0aGUgQVJNCisgICAgICAgICAgICAgICBlbmdpbmVlcmluZyBuYW1lIGZvciB0aGUgbG9naWMgYmxvY2sgaW4gdGhlIGZvcm06ICJhcm0scGw/Pz8iCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvY2FseGVkYS1zYXRhLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvY2FseGVkYS1zYXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNhYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2F0YS9jYWx4ZWRhLXNhdGEudHh0CkBAIC0wLDAgKzEsMTcgQEAKKyogQ2FseGVkYSBTQVRBIENvbnRyb2xsZXIKKworU0FUQSBub2RlcyBhcmUgZGVmaW5lZCB0byBkZXNjcmliZSBvbi1jaGlwIFNlcmlhbCBBVEEgY29udHJvbGxlcnMuCitFYWNoIFNBVEEgY29udHJvbGxlciBzaG91bGQgaGF2ZSBpdHMgb3duIG5vZGUuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgICAgICAgIDogY29tcGF0aWJsZSBsaXN0LCBjb250YWlucyAiY2FseGVkYSxoYi1haGNpIgorLSBpbnRlcnJ1cHRzICAgICAgICA6IDxpbnRlcnJ1cHQgbWFwcGluZyBmb3IgU0FUQSBJUlE+CistIHJlZyAgICAgICAgICAgICAgIDogPHJlZ2lzdGVycyBtYXBwaW5nPgorCitFeGFtcGxlOgorICAgICAgICBzYXRhQGZmZTA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJjYWx4ZWRhLGhiLWFoY2kiOworICAgICAgICAgICAgICAgIHJlZyA9IDwweGZmZTA4MDAwIDB4MTAwMD47CisgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxMTU+OworICAgICAgICB9OworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY3J5cHRvL3BpY29jaGlwLXNwYWNjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jcnlwdG8vcGljb2NoaXAtc3BhY2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjA5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY3J5cHRvL3BpY29jaGlwLXNwYWNjLnR4dApAQCAtMCwwICsxLDIzIEBACitQaWNvY2hpcCBwaWNvWGNlbGwgU1BBY2MgKFNlY3VyaXR5IFByb3RvY29sIEFjY2VsZXJhdG9yKSBiaW5kaW5ncworCitQaWNvY2hpcCBwaWNvWGNlbGwgZGV2aWNlcyBjb250YWluIGNyeXB0byBvZmZsb2FkIGVuZ2luZXMgdGhhdCBtYXkgYmUgdXNlZCBmb3IKK0lQU0VDIGFuZCBmZW10b2NlbGwgbGF5ZXIgMiBjaXBoZXJpbmcuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgIC0gY29tcGF0aWJsZSA6ICJwaWNvY2hpcCxzcGFjYy1pcHNlYyIgZm9yIHRoZSBJUFNFQyBvZmZsb2FkIGVuZ2luZQorICAgICJwaWNvY2hpcCxzcGFjYy1sMiIgZm9yIHRoZSBmZW10b2NlbGwgbGF5ZXIgMiBjaXBoZXJpbmcgZW5naW5lLgorICAtIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoaXMgZGV2aWNlCisgIC0gaW50ZXJydXB0LXBhcmVudCA6IFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0IGNvbnRyb2xzIHRoZSBTUEFjYworICAgIGludGVycnVwdC4KKyAgLSBpbnRlcnJ1cHRzIDogVGhlIGludGVycnVwdCBsaW5lIGZyb20gdGhlIFNQQWNjLgorICAtIHJlZi1jbG9jayA6IFRoZSBpbnB1dCBjbG9jayB0aGF0IGRyaXZlcyB0aGUgU1BBY2MuCisKK0V4YW1wbGUgU1BBY2Mgbm9kZToKKworc3BhY2NAMTAwMDAgeworCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2MtaXBzZWMiOworCXJlZyA9IDwweDEwMDAwMCAweDEwMDAwPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwlpbnRlcnJ1cHRzID0gPDI0PjsKKwlyZWYtY2xvY2sgPSA8Jmlwc2VjX2Nsaz4sICJyZWYiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL3BsMDYxLWdwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vcGwwNjEtZ3Bpby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjNDE2YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL3BsMDYxLWdwaW8udHh0CkBAIC0wLDAgKzEsMTAgQEAKK0FSTSBQTDA2MSBHUElPIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJhcm0scGwwNjEiLCAiYXJtLHByaW1lY2VsbCIKKy0gI2dwaW8tY2VsbHMgOiBTaG91bGQgYmUgdHdvLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlciBhbmQgdGhlCisgIHNlY29uZCBjZWxsIGlzIHVzZWQgdG8gc3BlY2lmeSBvcHRpb25hbCBwYXJhbWV0ZXJzOgorICAtIGJpdCAwIHNwZWNpZmllcyBwb2xhcml0eSAoMCBmb3Igbm9ybWFsLCAxIGZvciBpbnZlcnRlZCkKKy0gZ3Bpby1jb250cm9sbGVyIDogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgR1BJTyBjb250cm9sbGVyLgorLSBpbnRlcnJ1cHRzIDogSW50ZXJydXB0IG1hcHBpbmcgZm9yIEdQSU8gSVJRLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2ZzbC1pbXgtaTJjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvZnNsLWlteC1pMmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzY2Y0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2ZzbC1pbXgtaTJjLnR4dApAQCAtMCwwICsxLDI1IEBACisqIEZyZWVzY2FsZSBJbnRlciBJQyAoSTJDKSBhbmQgSGlnaCBTcGVlZCBJbnRlciBJQyAoSFMtSTJDKSBmb3IgaS5NWAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJmc2wsPGNoaXA+LWkyYyIKKy0gcmVnIDogU2hvdWxkIGNvbnRhaW4gSTJDL0hTLUkyQyByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAorLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGNvbnRhaW4gSTJDL0hTLUkyQyBpbnRlcnJ1cHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gY2xvY2stZnJlcXVlbmN5IDogQ29uc3RhaW5zIGRlc2lyZWQgSTJDL0hTLUkyQyBidXMgY2xvY2sgZnJlcXVlbmN5IGluIEh6LgorICBUaGUgYWJzZW5jZSBvZiB0aGUgcHJvcG9lcnR5IGluZGljYXRlcyB0aGUgZGVmYXVsdCBmcmVxdWVuY3kgMTAwIGtIei4KKworRXhhbXBsZXM6CisKK2kyY0A4M2ZjNDAwMCB7IC8qIEkyQzIgb24gaS5NWDUxICovCisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtaTJjIiwgImZzbCxpbXgxLWkyYyI7CisJcmVnID0gPDB4ODNmYzQwMDAgMHg0MDAwPjsKKwlpbnRlcnJ1cHRzID0gPDYzPjsKK307CisKK2kyY0A3MDAzODAwMCB7IC8qIEhTLUkyQyBvbiBpLk1YNTEgKi8KKwljb21wYXRpYmxlID0gImZzbCxpbXg1MS1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwlyZWcgPSA8MHg3MDAzODAwMCAweDQwMDA+OworCWludGVycnVwdHMgPSA8NjQ+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDw0MDAwMDA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvc2Ftc3VuZy1pMmMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9zYW1zdW5nLWkyYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4MzJjNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvc2Ftc3VuZy1pMmMudHh0CkBAIC0wLDAgKzEsMzkgQEAKKyogU2Ftc3VuZydzIEkyQyBjb250cm9sbGVyCisKK1RoZSBTYW1zdW5nJ3MgSTJDIGNvbnRyb2xsZXIgaXMgdXNlZCB0byBpbnRlcmZhY2Ugd2l0aCBJMkMgZGV2aWNlcy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAgLSBjb21wYXRpYmxlOiB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcuCisgICAgICAoYSkgInNhbXN1bmcsIHMzYzI0MTAtaTJjIiwgZm9yIGkyYyBjb21wYXRpYmxlIHdpdGggczNjMjQxMCBpMmMuCisgICAgICAoYikgInNhbXN1bmcsIHMzYzI0NDAtaTJjIiwgZm9yIGkyYyBjb21wYXRpYmxlIHdpdGggczNjMjQ0MCBpMmMuCisgIC0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkCisgICAgcmVnaW9uLgorICAtIGludGVycnVwdHM6IGludGVycnVwdCBudW1iZXIgdG8gdGhlIGNwdS4KKyAgLSBzYW1zdW5nLGkyYy1zZGEtZGVsYXk6IERlbGF5IChpbiBucykgYXBwbGllZCB0byBkYXRhIGxpbmUgKFNEQSkgZWRnZXMuCisgIC0gZ3Bpb3M6IFRoZSBvcmRlciBvZiB0aGUgZ3Bpb3Mgc2hvdWxkIGJlIHRoZSBmb2xsb3dpbmc6IDxTREEsIFNDTD4uCisgICAgVGhlIGdwaW8gc3BlY2lmaWVyIGRlcGVuZHMgb24gdGhlIGdwaW8gY29udHJvbGxlci4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAgLSBzYW1zdW5nLGkyYy1zbGF2ZS1hZGRyOiBTbGF2ZSBhZGRyZXNzIGluIG11bHRpLW1hc3RlciBlbnZpcm9tZW50LiBJZiBub3QKKyAgICBzcGVjaWZpZWQsIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgLSBzYW1zdW5nLGkyYy1tYXgtYnVzLWZyZXE6IERlc2lyZWQgZnJlcXVlbmN5IGluIEh6IG9mIHRoZSBidXMuIElmIG5vdAorICAgIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaW4gSHogaXMgMTAwMDAwLgorCitFeGFtcGxlOgorCisJaTJjQDEzODcwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMzYzI0NDAtaTJjIjsKKwkJcmVnID0gPDB4MTM4NzAwMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPDM0NT47CisJCXNhbXN1bmcsaTJjLXNkYS1kZWxheSA9IDwxMDA+OworCQlzYW1zdW5nLGkyYy1tYXgtYnVzLWZyZXEgPSA8MTAwMDAwPjsKKwkJZ3Bpb3MgPSA8JmdwZDEgMiAwIC8qIFNEQSAqLworCQkJICZncGQxIDMgMCAvKiBTQ0wgKi8+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJd204OTk0QDFhIHsKKwkJCWNvbXBhdGlibGUgPSAid2xmLHdtODk5NCI7CisJCQlyZWcgPSA8MHgxYT47CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbnZpZGlhLXNkaGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbnZpZGlhLXNkaGNpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTUxMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9udmlkaWEtc2RoY2kudHh0CkBAIC0wLDAgKzEsMjcgQEAKKyogTlZJRElBIFRlZ3JhIFNlY3VyZSBEaWdpdGFsIEhvc3QgQ29udHJvbGxlcgorCitUaGlzIGNvbnRyb2xsZXIgb24gVGVncmEgZmFtaWx5IFNvQ3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBNTUMsIFNELAorYW5kIFNESU8gdHlwZXMgb2YgbWVtb3J5IGNhcmRzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJudmlkaWEsPGNoaXA+LXNkaGNpIgorLSByZWcgOiBTaG91bGQgY29udGFpbiBTRC9NTUMgcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKKy0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIFNEL01NQyBpbnRlcnJ1cHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gY2QtZ3Bpb3MgOiBTcGVjaWZ5IEdQSU9zIGZvciBjYXJkIGRldGVjdGlvbgorLSB3cC1ncGlvcyA6IFNwZWNpZnkgR1BJT3MgZm9yIHdyaXRlIHByb3RlY3Rpb24KKy0gcG93ZXItZ3Bpb3MgOiBTcGVjaWZ5IEdQSU9zIGZvciBwb3dlciBjb250cm9sCistIHN1cHBvcnQtOGJpdCA6IEJvb2xlYW4sIGluZGljYXRlcyBpZiA4LWJpdCBtb2RlIHNob3VsZCBiZSB1c2VkLgorCitFeGFtcGxlOgorCitzZGhjaUBjODAwMDIwMCB7CisJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZGhjaSI7CisJcmVnID0gPDB4YzgwMDAyMDAgMHgyMDA+OworCWludGVycnVwdHMgPSA8NDc+OworCWNkLWdwaW9zID0gPCZncGlvIDY5IDA+OyAvKiBncGlvIFBJNSAqLworCXdwLWdwaW9zID0gPCZncGlvIDU3IDA+OyAvKiBncGlvIFBIMSAqLworCXBvd2VyLWdwaW9zID0gPCZncGlvIDE1NSAwPjsgLyogZ3BpbyBQVDMgKi8KKwlzdXBwb3J0LThiaXQ7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL210ZC9hdG1lbC1kYXRhZmxhc2gudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL210ZC9hdG1lbC1kYXRhZmxhc2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjZkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbXRkL2F0bWVsLWRhdGFmbGFzaC50eHQKQEAgLTAsMCArMSwxNCBAQAorKiBBdG1lbCBEYXRhIEZsYXNoCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAiYXRtZWwsPG1vZGVsPiIsICJhdG1lbCw8c2VyaWVzPiIsICJhdG1lbCxkYXRhZmxhc2giLgorCitFeGFtcGxlOgorCitmbGFzaEAxIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljb21wYXRpYmxlID0gImF0bWVsLGF0NDVkYjMyMWQiLCAiYXRtZWwsYXQ0NSIsICJhdG1lbCxkYXRhZmxhc2giOworCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDI1MDAwMDAwPjsKKwlyZWcgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bpbm11eC9waW5tdXhfbnZpZGlhLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5tdXgvcGlubXV4X252aWRpYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmODJkYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5tdXgvcGlubXV4X252aWRpYS50eHQKQEAgLTAsMCArMSw1IEBACitOVklESUEgVGVncmEgMiBwaW5tdXggY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogIm52aWRpYSx0ZWdyYTIwLXBpbm11eCIKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL2JvYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9ib2FyZC50eHQKaW5kZXggMzllOTQxNS4uMzgwOTE0ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL2JvYXJkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvYm9hcmQudHh0CkBAIC0xLDMgKzEsOCBAQAorRnJlZXNjYWxlIFJlZmVyZW5jZSBCb2FyZCBCaW5kaW5ncworCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBkZXZpY2UgdHJlZSBiaW5kaW5ncyBmb3IgdmFyaW91cyBkZXZpY2VzIHRoYXQKK2V4aXN0IG9uIHNvbWUgRnJlZXNjYWxlIHJlZmVyZW5jZSBib2FyZHMuCisKICogQm9hcmQgQ29udHJvbCBhbmQgU3RhdHVzIChCQ1NSKQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgpAQCAtMTIsMjUgKzE3LDI2IEBACiAJCXJlZyA9IDxmODAwMDAwMCA4MDAwPjsKIAl9OwogCi0qIEZyZWVzY2FsZSBvbiBib2FyZCBGUEdBCisqIEZyZWVzY2FsZSBvbi1ib2FyZCBGUEdBCiAKIFRoaXMgaXMgdGhlIG1lbW9yeS1tYXBwZWQgcmVnaXN0ZXJzIGZvciBvbiBib2FyZCBGUEdBLgogCiBSZXF1aXJlZCBwcm9wZXJpdGllczoKLS0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiZnNsLGZwZ2EtcGl4aXMiLgotLSByZWcgOiBzaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgRlBQR0EgcmVnaXN0ZXIKLSAgc2V0LgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgYSBib2FyZC1zcGVjaWZpYyBzdHJpbmcgZm9sbG93ZWQgYnkgYSBzdHJpbmcKKyAgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBGUEdBLiAgRXhhbXBsZToKKwkiZnNsLDxib2FyZD4tZnBnYSIsICJmc2wsZnBnYS1waXhpcyIKKy0gcmVnOiBzaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgRlBHQSByZWdpc3RlciBzZXQuCiAtIGludGVycnVwdC1wYXJlbnQ6IHNob3VsZCBzcGVjaWZ5IHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlci4KLS0gaW50ZXJydXB0cyA6IHNob3VsZCBzcGVjaWZ5IGV2ZW50ICh3YWtldXApIElSUS4KKy0gaW50ZXJydXB0czogc2hvdWxkIHNwZWNpZnkgZXZlbnQgKHdha2V1cCkgSVJRLgogCi1FeGFtcGxlIChNUEM4NjEwSFBDRCk6CitFeGFtcGxlIChQMTAyMkRTKToKIAotCWJvYXJkLWNvbnRyb2xAZTgwMDAwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxmcGdhLXBpeGlzIjsKLQkJcmVnID0gPDB4ZTgwMDAwMDAgMzI+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDw4IDg+OwotCX07CisJIGJvYXJkLWNvbnRyb2xAMywwIHsKKwkJIGNvbXBhdGlibGUgPSAiZnNsLHAxMDIyZHMtZnBnYSIsICJmc2wsZnBnYS1uZ3BpeGlzIjsKKwkJIHJlZyA9IDwzIDAgMHgzMD47CisJCSBpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJIGludGVycnVwdHMgPSA8OCA4IDAgMD47CisJIH07CiAKICogRnJlZXNjYWxlIEJDU1IgR1BJTyBiYW5rcwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvZGNzci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvZGNzci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NGViNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9kY3NyLnR4dApAQCAtMCwwICsxLDM5NSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRGVidWcgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyIChEQ1NSKSBCaW5kaW5nCitDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisKK05PVEU6IFRoZSBiaW5kaW5ncyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudCBhcmUgcHJlbGltaW5hcnkgYW5kIHN1YmplY3QKK3RvIGNoYW5nZS4gIFNvbWUgb2YgdGhlIGNvbXBhdGlibGUgc3RyaW5ncyB0aGF0IGNvbnRhaW4gb25seSBnZW5lcmljIG5hbWVzCittYXkgdHVybiBvdXQgdG8gYmUgaW5hcHByb3ByaWF0ZSwgb3IgbmVlZCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gZGVzY3JpYmUKK3RoZSBpbnRlZ3JhdGlvbiBvZiB0aGUgYmxvY2sgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY2hpcC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEZWJ1ZyBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgTWVtb3J5IE1hcAorCitEZXNjcmlwdGlvbgorCitUaGlzIG5vZGUgZGVmaW5lcyB0aGUgYmFzZSBhZGRyZXNzIGFuZCByYW5nZSBmb3IgdGhlCitkZWZpbmVkIERDU1IgTWVtb3J5IE1hcC4gQ2hpbGQgbm9kZXMgd2lsbCBkZXNjcmliZSB0aGUgaW5kaXZpZHVhbAorZGVidWcgYmxvY2tzIGRlZmluZWQgd2l0aGluIHRoaXMgbWVtb3J5IHNwYWNlLgorCitQUk9QRVJUSUVTCisKKwktIGNvbXBhdGlibGUKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IE11c3QgaW5jbHVkZSAiZnNsLGRjc3IiIGFuZCAic2ltcGxlLWJ1cyIuCisJVGhlIERDU1Igc3BhY2UgZXhpc3RzIGluIHRoZSBtZW1vcnktbWFwcGVkIGJ1cy4KKworCS0gI2FkZHJlc3MtY2VsbHMKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8dTMyPgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBEZWZpbmVzIHRoZSBudW1iZXIgb2YgY2VsbHMKKwlvciByZXByZXNlbnRpbmcgcGh5c2ljYWwgYWRkcmVzc2VzIGluIGNoaWxkIG5vZGVzLgorCisJLSAjc2l6ZS1jZWxscworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDx1MzI+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIERlZmluZXMgdGhlIG51bWJlciBvZiBjZWxscworCW9yIHJlcHJlc2VudGluZyB0aGUgc2l6ZSBvZiBwaHlzaWNhbCBhZGRyZXNzZXMgaW4KKwljaGlsZCBub2Rlcy4KKworCS0gcmFuZ2VzCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBBIHN0YW5kYXJkIHByb3BlcnR5LiBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlyYW5nZSBvZiB0aGUgRENTUiBzcGFjZS4KKworRVhBTVBMRQorCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxkY3NyIiwgInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHgwMDAwMDAwMCAweDAxMDA4MDAwPjsKKwl9OworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0V2ZW50IFByb2Nlc3NpbmcgVW5pdAorCitUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIERDU1Igc3BhY2UgYWxsb2NhdGVkIHRvIHRoZSBFUFUKKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgImZzbCxkY3NyLWVwdSIKKworCS0gaW50ZXJydXB0cworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wX2VuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogIFNwZWNpZmllcyB0aGUgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIEVQVS4KKwlUaGUgdmFsdWUgb2YgdGhlIGludGVycnVwdHMgcHJvcGVydHkgY29uc2lzdHMgb2YgdGhyZWUKKwlpbnRlcnJ1cHQgc3BlY2lmaWVycy4gVGhlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVyIGlzIGRlZmluZWQKKwlieSB0aGUgYmluZGluZyBkb2N1bWVudCBkZXNjcmliaW5nIHRoZSBub2RlJ3MgaW50ZXJydXB0IHBhcmVudC4KKworCVRoZSBFUFUgY291bnRlcnMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYXNzZXJ0IHRoZSBwZXJmb3JtYW5jZQorCW1vbml0b3IgaW50ZXJydXB0IHNpZ25hbCBiYXNlZCBvbiBlaXRoZXIgY291bnRlciBvdmVyZmxvdyBvciB2YWx1ZQorCW1hdGNoLiBXaGljaCBjb3VudGVyIGFzc2VydGVkIHRoZSBpbnRlcnJ1cHQgaXMgY2FwdHVyZWQgaW4gYW4gRVBVCisJQ291bnRlciBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChFUENQVUlTUikuCisKKwlUaGUgRVBVIHVuaXQgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBhc3NlcnQgZWl0aGVyIG9yIGJvdGggb2YKKwl0d28gaW50ZXJydXB0IHNpZ25hbHMgYmFzZWQgb24gZGVidWcgZXZlbnQgc291cmNlcyB3aXRoaW4gdGhlIFNvQy4KKwlUaGUgaW50ZXJydXB0IHNpZ25hbHMgYXJlIGVwdV94dF9pbnQwIGFuZCBlcHVfeHRfaW50MS4KKwlXaGljaCBldmVudCBzb3VyY2UgYXNzZXJ0ZWQgdGhlIGludGVycnVwdCBpcyBjYXB0dXJlZCBpbiBhbiBFUFUKKwlJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChFUElTUjAsRVBJU1IxKS4KKworCUludGVycnVwdCBudW1iZXJzIGFyZSBsaXNlZCBpbiBvcmRlciAocGVyZm1vbiwgZXZlbnQwLCBldmVudDEpLgorCisJLSBpbnRlcnJ1cHQtcGFyZW50CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHBoYW5kbGU+CisJRGVmaW5pdGlvbjogQSBzaW5nbGUgPHBoYW5kbGU+IHZhbHVlIHRoYXQgcG9pbnRzCisJdG8gdGhlIGludGVycnVwdCBwYXJlbnQgdG8gd2hpY2ggdGhlIGNoaWxkIGRvbWFpbgorCWlzIGJlaW5nIG1hcHBlZC4gVmFsdWUgbXVzdCBiZSAiJm1waWMiCisKKwktIHJlZworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIFNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcworCW9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBEQ1NSIHNwYWNlIHJlZ2lzdGVycyBvZiB0aGUgZGV2aWNlCisJY29uZmlndXJhdGlvbiBibG9jay4KKworRVhBTVBMRQorCWRjc3ItZXB1QDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWVwdSI7CisJCWludGVycnVwdHMgPSA8NTIgMiAwIDAKKwkJCSAgICAgIDg0IDIgMCAwCisJCQkgICAgICA4NSAyIDAgMD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJfTsKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05leHVzIFBvcnQgQ29udHJvbGxlcgorCitUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIERDU1Igc3BhY2UgYWxsb2NhdGVkIHRvIHRoZSBOUEMKKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgImZzbCxkY3NyLW5wYyIKKworCS0gcmVnCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBBIHN0YW5kYXJkIHByb3BlcnR5LiAgU3BlY2lmaWVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzCisJb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIERDU1Igc3BhY2UgcmVnaXN0ZXJzIG9mIHRoZSBkZXZpY2UKKwljb25maWd1cmF0aW9uIGJsb2NrLgorCVRoZSBOZXh1cyBQb3J0IGNvbnRyb2xsZXIgb2NjdXBpZXMgdHdvIHJlZ2lvbnMgaW4gdGhlIERDU1Igc3BhY2UKKwl3aXRoIGRpc3RpbmN0IGZ1bmN0aW9uYWxpdHkuCisKKwlUaGUgZmlyc3QgcmVnaXN0ZXIgcmFuZ2UgZGVzY3JpYmVzIHRoZSBOZXh1cyBQb3J0IENvbnRyb2xsZXIKKwljb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzLgorCisJVGhlIHNlY29uZCByZWdpc3RlciByYW5nZSBkZXNjcmliZXMgdGhlIE5leHVzIFBvcnQgQ29udHJvbGxlcgorCWludGVybmFsIHRyYWNlIGJ1ZmZlci4gVGhlIE5QQyB0cmFjZSBidWZmZXIgaXMgYSBzbWFsbCBtZW1vcnkgYnVmZmVyCisJd2hpY2ggc3RhZ2VzIHRoZSBuZXh1cyB0cmFjZSBkYXRhIGZvciB0cmFuc21pc3Npb24gdmlhIHRoZSBBdXJvcmEgcG9ydAorCW9yIHRvIGEgRERSIGJhc2VkIHRyYWNlIGJ1ZmZlci4gSW4gc29tZSBjb25maWd1cmF0aW9ucyB0aGUgTlBDIHRyYWNlCisJYnVmZmVyIGNhbiBiZSB0aGUgb25seSB0cmFjZSBidWZmZXIgdXNlZC4KKworCitFWEFNUExFCisJCWRjc3ItbnBjIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDAwIDB4MTAwMDAwMCAweDgwMDA+OworCQl9OworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTmV4dXMgQ29uY2VudHJhdG9yCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8gdGhlIE5YQworCitQUk9QRVJUSUVTCisKKwktIGNvbXBhdGlibGUKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IE11c3QgaW5jbHVkZSAiZnNsLGRjc3ItbnhjIgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisKK0VYQU1QTEUKKwkJZGNzci1ueGNAMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW54YyI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCX07Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29yZU5ldCBEZWJ1ZyBDb250cm9sbGVyCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBDb3JlTmV0IERlYnVnIGNvbnRyb2xsZXIuCisKK1BST1BFUlRJRVMKKworCS0gY29tcGF0aWJsZQorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmc+CisJRGVmaW5pdGlvbjogTXVzdCBpbmNsdWRlICJmc2wsZGNzci1jb3JlbmV0IgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisJVGhlIENvcmVOZXQgRGVidWcgY29udHJvbGxlciBvY2N1cGllcyB0d28gcmVnaW9ucyBpbiB0aGUgRENTUiBzcGFjZQorCXdpdGggZGlzdGluY3QgZnVuY3Rpb25hbGl0eS4KKworCVRoZSBmaXJzdCByZWdpc3RlciByYW5nZSBkZXNjcmliZXMgdGhlIENvcmVOZXQgRGVidWcgQ29udHJvbGxlcgorCWZ1bmN0aW9uYWx0eSB0byBwZXJmb3JtIHRyYW5zYWN0aW9uIGFuZCB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgbWF0Y2hlcy4KKworCVRoZSBzZWNvbmQgcmVnaXN0ZXIgcmFuZ2UgZGVzY3JpYmVzIHRoZSBDb3JlTmV0IERlYnVnIENvbnRyb2xsZXIKKwlmdW5jdGlvbmFsdHkgdG8gdHJpZ2dlciBldmVudCBub3RpZmljYXRpb25zIGFuZCBkZWJ1ZyB0cmFjZXMuCisKK0VYQU1QTEUKKwkJZGNzci1jb3JlbmV0IHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7CisJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47CisJCX07CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEYXRhIFBhdGggRGVidWcgY29udHJvbGxlcgorCitUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIERDU1Igc3BhY2UgYWxsb2NhdGVkIHRvCit0aGUgRFBBQSBEZWJ1ZyBDb250cm9sbGVyLiBUaGlzIGNvbnRyb2xsZXIgY29udHJvbHMgZGVidWcgY29uZmlndXJhdGlvbgorZm9yIHRoZSBRTUFOIGFuZCBGTUFOIGJsb2Nrcy4KKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgYm90aCBhbiBpZGVudGlmaWVyIHNwZWNpZmljIHRvIHRoZSBTb0MKKwlvciBEZWJ1ZyBJUCBvZiB0aGUgZm9ybSAiZnNsLDxzb2M+LWRjc3ItZHBhYSIgaW4gYWRkaXRpb24gdG8gdGhlCisJZ2VuZXJpYyBjb21wYXRpYmxlIHN0cmluZyAiZnNsLGRjc3ItZHBhYSIuCisKKwktIHJlZworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIFNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcworCW9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBEQ1NSIHNwYWNlIHJlZ2lzdGVycyBvZiB0aGUgZGV2aWNlCisJY29uZmlndXJhdGlvbiBibG9jay4KKworRVhBTVBMRQorCQlkY3NyLWRwYWFAOTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kY3NyLWRwYWEiLCAiZnNsLGRjc3ItZHBhYSI7CisJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCX07CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitPQ2VhTiBEZWJ1ZyBjb250cm9sbGVyCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBPQ04gRGVidWcgQ29udHJvbGxlci4KKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgYm90aCBhbiBpZGVudGlmaWVyIHNwZWNpZmljIHRvIHRoZSBTb0MKKwlvciBEZWJ1ZyBJUCBvZiB0aGUgZm9ybSAiZnNsLDxzb2M+LWRjc3Itb2NuIiBpbiBhZGRpdGlvbiB0byB0aGUKKwlnZW5lcmljIGNvbXBhdGlibGUgc3RyaW5nICJmc2wsZGNzci1vY24iLgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisKK0VYQU1QTEUKKwkJZGNzci1vY25AMTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZGNzci1vY24iLCAiZnNsLGRjc3Itb2NuIjsKKwkJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47CisJCX07CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitERFIgQ29udHJvbGxlciBEZWJ1ZyBjb250cm9sbGVyCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBPQ04gRGVidWcgQ29udHJvbGxlci4KKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgImZzbCxkY3NyLWRkciIKKworCS0gZGV2LWhhbmRsZQorCVVzYWdlOiByZXF1aXJlZAorCURlZmluaXRpb246IEEgcGhhbmRsZSB0byBhc3NvY2lhdGUgdGhpcyBkZWJ1ZyBub2RlIHdpdGggaXRzCisJY29tcG9uZW50IGNvbnRyb2xsZXIuCisKKwktIHJlZworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIFNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcworCW9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBEQ1NSIHNwYWNlIHJlZ2lzdGVycyBvZiB0aGUgZGV2aWNlCisJY29uZmlndXJhdGlvbiBibG9jay4KKworRVhBTVBMRQorCQlkY3NyLWRkckAxMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCQlkZXYtaGFuZGxlID0gPCZkZHIxPjsKKwkJCXJlZyA9IDwweDEyMDAwIDB4MTAwMD47CisJCX07CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOZXh1cyBBdXJvcmEgTGluayBDb250cm9sbGVyCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBOQUwgQ29udHJvbGxlci4KKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgYm90aCBhbiBpZGVudGlmaWVyIHNwZWNpZmljIHRvIHRoZSBTb0MKKwlvciBEZWJ1ZyBJUCBvZiB0aGUgZm9ybSAiZnNsLDxzb2M+LWRjc3ItbmFsIiBpbiBhZGRpdGlvbiB0byB0aGUKKwlnZW5lcmljIGNvbXBhdGlibGUgc3RyaW5nICJmc2wsZGNzci1uYWwiLgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisKK0VYQU1QTEUKKwkJZGNzci1uYWxAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZGNzci1uYWwiLCAiZnNsLGRjc3ItbmFsIjsKKwkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJCX07CisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1J1biBDb250cm9sIGFuZCBQb3dlciBNYW5hZ2VtZW50CisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBSQ1BNIERlYnVnIENvbnRyb2xsZXIuIFRoaXMgZnVuY3Rpb25saXR5IGlzIGxpbWl0ZWQgdG8gdGhlCitjb250cm9sIHRoZSBkZWJ1ZyBvcGVyYXRpb25zIG9mIHRoZSBTb0MgYW5kIGNvcmVzLgorCitQUk9QRVJUSUVTCisKKwktIGNvbXBhdGlibGUKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IE11c3QgaW5jbHVkZSBib3RoIGFuIGlkZW50aWZpZXIgc3BlY2lmaWMgdG8gdGhlIFNvQworCW9yIERlYnVnIElQIG9mIHRoZSBmb3JtICJmc2wsPHNvYz4tZGNzci1yY3BtIiBpbiBhZGRpdGlvbiB0byB0aGUKKwlnZW5lcmljIGNvbXBhdGlibGUgc3RyaW5nICJmc2wsZGNzci1yY3BtIi4KKworCS0gcmVnCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBBIHN0YW5kYXJkIHByb3BlcnR5LiAgU3BlY2lmaWVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzCisJb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIERDU1Igc3BhY2UgcmVnaXN0ZXJzIG9mIHRoZSBkZXZpY2UKKwljb25maWd1cmF0aW9uIGJsb2NrLgorCitFWEFNUExFCisJCWRjc3ItcmNwbUAyMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kY3NyLXJjcG0iLCAiZnNsLGRjc3ItcmNwbSI7CisJCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCQl9OworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29yZSBTZXJ2aWNlIEJyaWRnZSBQcm94eQorCitUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIERDU1Igc3BhY2UgYWxsb2NhdGVkIHRvCit0aGUgQ29yZSBTZXJ2aWNlIEJyaWRnZSBQcm94aWVzLgorVGhlcmUgaXMgb25lIENvcmUgU2VydmljZSBCcmlkZ2UgUHJveHkgZGV2aWNlIGZvciBlYWNoIENQVSBpbiB0aGUgc3lzdGVtLgorVGhpcyBmdW5jdGlvbmxpdHkgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkZWJ1ZyBvcGVyYXRpb25zIG9mIHRoZSBDUFUuCisKK1BST1BFUlRJRVMKKworCS0gY29tcGF0aWJsZQorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmc+CisJRGVmaW5pdGlvbjogTXVzdCBpbmNsdWRlIGJvdGggYW4gaWRlbnRpZmllciBzcGVjaWZpYyB0byB0aGUgY3B1CisJb2YgdGhlIGZvcm0gImZzbCxkY3NyLTxjcHU+LXNiLXByb3h5IiBpbiBhZGRpdGlvbiB0byB0aGUKKwlnZW5lcmljIGNvbXBhdGlibGUgc3RyaW5nICJmc2wsZGNzci1jcHUtc2ItcHJveHkiLgorCisJLSBjcHUtaGFuZGxlCisJVXNhZ2U6IHJlcXVpcmVkCisJRGVmaW5pdGlvbjogQSBwaGFuZGxlIHRvIGFzc29jaWF0ZSB0aGlzIGRlYnVnIG5vZGUgd2l0aCBpdHMgY3B1LgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisKK0VYQU1QTEUKKwkJZGNzci1jcHUtc2ItcHJveHlANDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLAorCQkJCSAgICAgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwKKwkJCQkgICAgICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1MT47CisJCQlyZWcgPSA8MHg0MTAwMCAweDEwMDA+OworCQl9OworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL21zaS1waWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL21zaS1waWMudHh0CmluZGV4IDcwNTU4YzMuLjVkNTg2ZTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9tc2ktcGljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbXNpLXBpYy50eHQKQEAgLTI1LDYgKzI1LDE2IEBACiAgIGFyZSByb3V0ZWQgdG8gSVBJQywgYW5kIGZvciA4NXh4Lzg2eHggY3B1IHRoZSBpbnRlcnJ1cHRzIGFyZSByb3V0ZWQKICAgdG8gTVBJQy4KIAorT3B0aW9uYWwgcHJvcGVydGllczoKKy0gbXNpLWFkZHJlc3MtNjQ6IDY0LWJpdCBQQ0kgYWRkcmVzcyBvZiB0aGUgTVNJSVIgcmVnaXN0ZXIuIFRoZSBNU0lJUiByZWdpc3RlcgorICBpcyB1c2VkIGZvciBNU0kgbWVzc2FnaW5nLiAgVGhlIGFkZHJlc3Mgb2YgTVNJSVIgaW4gUENJIGFkZHJlc3Mgc3BhY2UgaXMKKyAgdGhlIE1TSSBtZXNzYWdlIGFkZHJlc3MuCisKKyAgVGhpcyBwcm9wZXJ0eSBtYXkgYmUgdXNlZCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIGh5cGVydmlzb3IKKyAgaGFzIGNyZWF0ZWQgYW4gYWx0ZXJuYXRlIG1hcHBpbmcgZm9yIHRoZSBNU0lSIGJsb2NrLiAgU2VlIGJlbG93IGZvciBhbgorICBleHBsYW5hdGlvbi4KKworCiBFeGFtcGxlOgogCW1zaUA0MTYwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtbXNpIiwgImZzbCxtcGljLW1zaSI7CkBAIC00MSwzICs1MSwzNSBAQAogCQkJMHhlNyAwPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJfTsKKworVGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yIGFuZCBtc2ktYWRkcmVzcy02NAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTm9ybWFsbHksIFBDSSBkZXZpY2VzIGhhdmUgYWNjZXNzIHRvIGFsbCBvZiBDQ1NSIHZpYSBhbiBBVE1VIG1hcHBpbmcuICBUaGUKK0ZyZWVzY2FsZSBNU0kgZHJpdmVyIGNhbGN1bGF0ZXMgdGhlIGFkZHJlc3Mgb2YgTVNJSVIgKGluIHRoZSBNU0kgcmVnaXN0ZXIKK2Jsb2NrKSBhbmQgc2V0cyB0aGF0IGFkZHJlc3MgYXMgdGhlIE1TSSBtZXNzYWdlIGFkZHJlc3MuCisKK0luIGEgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQsIHRoZSBoeXBlcnZpc29yIG1heSBuZWVkIHRvIGNyZWF0ZSBhbiBJT01NVQorbWFwcGluZyBmb3IgTVNJSVIuICBUaGUgRnJlZXNjYWxlIGVQQVBSIGh5cGVydmlzb3IgaGFzIHRoaXMgcmVxdWlyZW1lbnQKK2JlY2F1c2Ugb2YgaGFyZHdhcmUgbGltaXRhdGlvbnMgb2YgdGhlIFBlcmlwaGVyYWwgQWNjZXNzIE1hbmFnZW1lbnQgVW5pdAorKFBBTVUpLCB3aGljaCBpcyBjdXJyZW50bHkgdGhlIG9ubHkgSU9NTVUgdGhhdCB0aGUgaHlwZXJ2aXNvciBzdXBwb3J0cy4KK1RoZSBBVE1VIGlzIHByb2dyYW1tZWQgd2l0aCB0aGUgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcywgYW5kIHRoZSBQQU1VCitpbnRlcmNlcHRzIHRyYW5zYWN0aW9ucyBhbmQgcmVyb3V0ZXMgdGhlbSB0byB0aGUgdHJ1ZSBwaHlzaWNhbCBhZGRyZXNzLgorCitJbiB0aGUgUEFNVSwgZWFjaCBQQ0kgY29udHJvbGxlciBpcyBnaXZlbiBvbmx5IG9uZSBwcmltYXJ5IHdpbmRvdy4gIFRoZQorUEFNVSByZXN0cmljdHMgRE1BIG9wZXJhdGlvbnMgc28gdGhhdCB0aGV5IGNhbiBvbmx5IG9jY3VyIHdpdGhpbiBhIHdpbmRvdy4KK0JlY2F1c2UgUENJIGRldmljZXMgbXVzdCBiZSBhYmxlIHRvIERNQSB0byBtZW1vcnksIHRoZSBwcmltYXJ5IHdpbmRvdyBtdXN0CitiZSB1c2VkIHRvIGNvdmVyIGFsbCBvZiB0aGUgZ3Vlc3QncyBtZW1vcnkgc3BhY2UuCisKK1BBTVUgcHJpbWFyeSB3aW5kb3dzIGNhbiBiZSBkaXZpZGVkIGludG8gMjU2IHN1YndpbmRvd3MsIGFuZCBlYWNoCitzdWJ3aW5kb3cgY2FuIGhhdmUgaXRzIG93biBhZGRyZXNzIG1hcHBpbmcgKCJndWVzdCBwaHlzaWNhbCIgdG8gInRydWUKK3BoeXNpY2FsIikuICBIb3dldmVyLCBlYWNoIHN1YndpbmRvdyBoYXMgdG8gaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQsIHdoaWNoCittZWFucyB0aGV5IGNhbm5vdCBiZSBsb2NhdGVkIGF0IGp1c3QgYW55IGFkZHJlc3MuICBCZWNhdXNlIG9mIHRoZXNlCityZXN0cmljdGlvbnMsIGl0IGlzIHVzdWFsbHkgaW1wb3NzaWJsZSB0byBjcmVhdGUgYSA0S0Igc3Vid2luZG93IHRoYXQKK2NvdmVycyBNU0lJUiB3aGVyZSBpdCdzIG5vcm1hbGx5IGxvY2F0ZWQuCisKK1RoZXJlZm9yZSwgdGhlIGh5cGVydmlzb3IgaGFzIHRvIGNyZWF0ZSBhIHN1YndpbmRvdyBpbnNpZGUgdGhlIHNhbWUKK3ByaW1hcnkgd2luZG93IHVzZWQgZm9yIG1lbW9yeSwgYnV0IG1hcHBlZCB0byB0aGUgTVNJUiBibG9jayAod2hlcmUgTVNJSVIKK2xpdmVzKS4gIFRoZSBmaXJzdCBzdWJ3aW5kb3cgYWZ0ZXIgdGhlIGVuZCBvZiBndWVzdCBtZW1vcnkgaXMgdXNlZCBmb3IKK3RoaXMuICBUaGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIG1zaS1hZGRyZXNzLTY0IHByb3BlcnR5IGlzIHRoZSBQQ0kKK2FkZHJlc3Mgb2YgTVNJSVIuICBUaGUgaHlwZXJ2aXNvciBjb25maWd1cmVzIHRoZSBQQU1VIHRvIG1hcCB0aGF0IGFkZHJlc3MgdG8KK3RoZSB0cnVlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgTVNJSVIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc29jL2NvZGVjcy9mc2wtc2d0bDUwMDAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NvYy9jb2RlY3MvZnNsLXNndGw1MDAwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzNjZDQxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NvYy9jb2RlY3MvZnNsLXNndGw1MDAwLnR4dApAQCAtMCwwICsxLDExIEBACisqIEZyZWVzY2FsZSBTR1RMNTAwMCBTdGVyZW8gQ29kZWMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJmc2wsc2d0bDUwMDAiLgorCitFeGFtcGxlOgorCitjb2RlYzogc2d0bDUwMDBAMGEgeworCWNvbXBhdGlibGUgPSAiZnNsLHNndGw1MDAwIjsKKwlyZWcgPSA8MHgwYT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODUxMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NTEwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFhMzJiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODUxMC50eHQKQEAgLTAsMCArMSwxOCBAQAorV004NTEwIGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204NTEwIgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CisgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg1MTBAMWEgeworCWNvbXBhdGlibGUgPSAid2xmLHdtODUxMCI7CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg1MjMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODUyMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3NDYxOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg1MjMudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1dNODUyMyBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBJMkMgb25seS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODUyMyIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlLgorCitFeGFtcGxlOgorCitjb2RlYzogd204NTIzQDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg1MjMiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NTgwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg1ODAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTgyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NTgwLnR4dApAQCAtMCwwICsxLDE2IEBACitXTTg1ODAgYXVkaW8gQ09ERUMKKworVGhpcyBkZXZpY2Ugc3VwcG9ydHMgSTJDIG9ubHkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogIndsZix3bTg1ODAiCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4KKworRXhhbXBsZToKKworY29kZWM6IHdtODU4MEAxYSB7CisJY29tcGF0aWJsZSA9ICJ3bGYsd204NTgwIjsKKwlyZWcgPSA8MHgxYT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODcxMS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzExLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ5OTk4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODcxMS50eHQKQEAgLTAsMCArMSwxOCBAQAorV004NzExIGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204NzExIgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CisgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg3MTFAMWEgeworCWNvbXBhdGlibGUgPSAid2xmLHdtODcxMSI7CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3MjgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODcyOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiNWMzNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3MjgudHh0CkBAIC0wLDAgKzEsMTggQEAKK1dNODcyOCBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBib3RoIEkyQyBhbmQgU1BJIChjb25maWd1cmVkIHdpdGggcGluIHN0cmFwcGluZworb24gdGhlIGJvYXJkKS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODcyOCIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMsIHRoZSBjaGlwIHNlbGVjdAorICAgICAgICAgIG51bWJlciBmb3IgU1BJLgorCitFeGFtcGxlOgorCitjb2RlYzogd204NzI4QDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg3MjgiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzMxLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3MzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjcwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzMxLnR4dApAQCAtMCwwICsxLDE4IEBACitXTTg3MzEgYXVkaW8gQ09ERUMKKworVGhpcyBkZXZpY2Ugc3VwcG9ydHMgYm90aCBJMkMgYW5kIFNQSSAoY29uZmlndXJlZCB3aXRoIHBpbiBzdHJhcHBpbmcKK29uIHRoZSBib2FyZCkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogIndsZix3bTg3MzEiCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3IgSTJDLCB0aGUgY2hpcCBzZWxlY3QKKyAgICAgICAgICBudW1iZXIgZm9yIFNQSS4KKworRXhhbXBsZToKKworY29kZWM6IHdtODczMUAxYSB7CisJY29tcGF0aWJsZSA9ICJ3bGYsd204NzMxIjsKKwlyZWcgPSA8MHgxYT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODczNy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzM3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmMyY2VhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODczNy50eHQKQEAgLTAsMCArMSwxOCBAQAorV004NzM3IGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204NzM3IgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CisgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg3MzdAMWEgeworCWNvbXBhdGlibGUgPSAid2xmLHdtODczNyI7CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3NDEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc0MS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiZGE1OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3NDEudHh0CkBAIC0wLDAgKzEsMTggQEAKK1dNODc0MSBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBib3RoIEkyQyBhbmQgU1BJIChjb25maWd1cmVkIHdpdGggcGluIHN0cmFwcGluZworb24gdGhlIGJvYXJkKS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODc0MSIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMsIHRoZSBjaGlwIHNlbGVjdAorICAgICAgICAgIG51bWJlciBmb3IgU1BJLgorCitFeGFtcGxlOgorCitjb2RlYzogd204NzQxQDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg3NDEiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzUwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3NTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjIzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzUwLnR4dApAQCAtMCwwICsxLDE4IEBACitXTTg3NTAgYW5kIFdNODk4NyBhdWRpbyBDT0RFQ3MKKworVGhlc2UgZGV2aWNlcyBzdXBwb3J0IGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204NzUwIiBvciAid2xmLHdtODk4NyIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMsIHRoZSBjaGlwIHNlbGVjdAorICAgICAgICAgIG51bWJlciBmb3IgU1BJLgorCitFeGFtcGxlOgorCitjb2RlYzogd204NzUwQDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg3NTAiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzUzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3NTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NTI3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzUzLnR4dApAQCAtMCwwICsxLDE4IEBACitXTTg3NTMgYXVkaW8gQ09ERUMKKworVGhpcyBkZXZpY2Ugc3VwcG9ydHMgYm90aCBJMkMgYW5kIFNQSSAoY29uZmlndXJlZCB3aXRoIHBpbiBzdHJhcHBpbmcKK29uIHRoZSBib2FyZCkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogIndsZix3bTg3NTMiCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3IgSTJDLCB0aGUgY2hpcCBzZWxlY3QKKyAgICAgICAgICBudW1iZXIgZm9yIFNQSS4KKworRXhhbXBsZToKKworY29kZWM6IHdtODczN0AxYSB7CisJY29tcGF0aWJsZSA9ICJ3bGYsd204NzUzIjsKKwlyZWcgPSA8MHgxYT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc3MC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzcwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjZlMDBjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc3MC50eHQKQEAgLTAsMCArMSwxNiBAQAorV004NzcwIGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIFNQSS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODc3MCIKKworICAtIHJlZyA6IHRoZSBjaGlwIHNlbGVjdCBudW1iZXIuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg3NzBAMSB7CisJY29tcGF0aWJsZSA9ICJ3bGYsd204NzcwIjsKKwlyZWcgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc3Ni50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204Nzc2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjljYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc3Ni50eHQKQEAgLTAsMCArMSwxOCBAQAorV004Nzc2IGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204Nzc2IgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CisgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg3NzZAMWEgeworCWNvbXBhdGlibGUgPSAid2xmLHdtODc3NiI7CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg4MDQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODgwNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzYTU2ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg4MDQudHh0CkBAIC0wLDAgKzEsMTggQEAKK1dNODgwNCBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBib3RoIEkyQyBhbmQgU1BJIChjb25maWd1cmVkIHdpdGggcGluIHN0cmFwcGluZworb24gdGhlIGJvYXJkKS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODgwNCIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMsIHRoZSBjaGlwIHNlbGVjdAorICAgICAgICAgIG51bWJlciBmb3IgU1BJLgorCitFeGFtcGxlOgorCitjb2RlYzogd204ODA0QDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg4MDQiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaV9wbDAyMi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaV9wbDAyMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2ZWMzZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpX3BsMDIyLnR4dApAQCAtMCwwICsxLDEyIEBACitBUk0gUEwwMjIgU1BJIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJhcm0scGwwMjIiLCAiYXJtLHByaW1lY2VsbCIKKy0gcmVnIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQorLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGNvbnRhaW4gU1BJIGNvbnRyb2xsZXIgaW50ZXJydXB0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGNzLWdwaW9zIDogc2hvdWxkIHNwZWNpZnkgR1BJT3MgdXNlZCBmb3IgY2hpcHNlbGVjdHMuCisgIFRoZSBncGlvcyB3aWxsIGJlIHJlZmVycmVkIHRvIGFzIHJlZyA9IDxpbmRleD4gaW4gdGhlIFNQSSBjaGlsZCBub2Rlcy4KKyAgSWYgdW5zcGVjaWZpZWQsIGEgc2luZ2xlIFNQSSBkZXZpY2Ugd2l0aG91dCBhIGNoaXAgc2VsZWN0IGNhbiBiZSB1c2VkLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdHR5L3NlcmlhbC9tc21fc2VyaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90dHkvc2VyaWFsL21zbV9zZXJpYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjM4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdHR5L3NlcmlhbC9tc21fc2VyaWFsLnR4dApAQCAtMCwwICsxLDI3IEBACisqIFF1YWxjb21tIE1TTSBVQVJUCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOgorCS0gInFjb20sbXNtLXVhcnQiLCBhbmQgb25lIG9mICJxY29tLG1zbS1oc3VhcnQiIG9yCisJICAicWNvbSxtc20tbHN1YXJ0Ii4KKy0gcmVnIDogb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQorCWZvciB0aGUgaHN1YXJ0IG9wZXJhdGluZyBpbiBjb21wYXRpYmxlIG1vZGUsIHRoZXJlIHNob3VsZCBiZSBhCisJc2Vjb25kIHBhaXIgZGVzY3JpYmluZyB0aGUgZ3NiaSByZWdpc3RlcnMuCistIGludGVycnVwdHMgOiBzaG91bGQgY29udGFpbiB0aGUgdWFydCBpbnRlcnJ1cHQuCisKK1RoZXJlIGFyZSB0d28gZGlmZmVyZW50IFVBUlQgYmxvY2tzIHVzZWQgaW4gTVNNIGRldmljZXMsCisicWNvbSxtc20taHN1YXJ0IiBhbmQgInFjb20sbXNtLWxzdWFydCIuICBUaGUgbXNtLXNlcmlhbCBkcml2ZXIgaXMKK2FibGUgdG8gaGFuZGxlIGJvdGggb2YgdGhlc2UsIGFuZCBtYXRjaGVzIGFnYWluc3QgdGhlICJxY29tLG1zbS11YXJ0IgorYXMgdGhlIGNvbXBhdGliaWxpdHkuCisKK1RoZSByZWdpc3RlcnMgZm9yIHRoZSAicWNvbSxtc20taHN1YXJ0IiBkZXZpY2UgbmVlZCB0byBzcGVjaWZ5IGJvdGgKK3JlZ2lzdGVyIGJsb2NrcywgZXZlbiBmb3IgdGhlIGNvbW1vbiBkcml2ZXIuCisKK0V4YW1wbGU6CisKKwl1YXJ0QDE5YzQwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20taHN1YXJ0IiwgInFjb20sbXNtLXVhcnQiOworCQlyZWcgPSA8MHgxOWM0MDAwMCAweDEwMDA+LAorCQkgICAgICA8MHgxOWMwMDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE5NT47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3ZlbmRvci1wcmVmaXhlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1NTI3OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0CkBAIC0wLDAgKzEsNDAgQEAKK0RldmljZSB0cmVlIGJpbmRpbmcgdmVuZG9yIHByZWZpeCByZWdpc3RyeS4gIEtlZXAgbGlzdCBpbiBhbHBoYWJldGljYWwgb3JkZXIuCisKK1RoaXMgaXNuJ3QgYW4gZXhoYXVzdGl2ZSBsaXN0LCBidXQgeW91IHNob3VsZCBhZGQgbmV3IHByZWZpeGVzIHRvIGl0IGJlZm9yZQordXNpbmcgdGhlbSB0byBhdm9pZCBuYW1lLXNwYWNlIGNvbGxpc2lvbnMuCisKK2FkaQlBbmFsb2cgRGV2aWNlcywgSW5jLgorYW1jYwlBcHBsaWVkIE1pY3JvIENpcmN1aXRzIENvcnBvcmF0aW9uIChBUE0sIGZvcm1hbGx5IEFNQ0MpCithcG0JQXBwbGllZCBNaWNybyBDaXJjdWl0cyBDb3Jwb3JhdGlvbiAoQVBNKQorYXJtCUFSTSBMdGQuCithdG1lbAlBdG1lbCBDb3Jwb3JhdGlvbgorY2hycAlDb21tb24gSGFyZHdhcmUgUmVmZXJlbmNlIFBsYXRmb3JtCitkYWxsYXMJTWF4aW0gSW50ZWdyYXRlZCBQcm9kdWN0cyAoZm9ybWVybHkgRGFsbGFzIFNlbWljb25kdWN0b3IpCitkZW54CURlbnggU29mdHdhcmUgRW5naW5lZXJpbmcKK2Vwc29uCVNlaWtvIEVwc29uIENvcnAuCitlc3QJRVNUZWVtIFdpcmVsZXNzIE1vZGVtcworZnNsCUZyZWVzY2FsZSBTZW1pY29uZHVjdG9yCitHRUZhbnVjCUdFIEZhbnVjIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuCitnZWYJR0UgRmFudWMgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KK2hwCUhld2xldHQgUGFja2FyZAoraWJtCUludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgKElCTSkKK2lkdAlJbnRlZ3JhdGVkIERldmljZSBUZWNobm9sb2dpZXMsIEluYy4KK2ludGVyY29udHJvbAlJbnRlciBDb250cm9sIEdyb3VwCitsaW51eAlMaW51eC1zcGVjaWZpYyBiaW5kaW5nCittYXJ2ZWxsCU1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCittYXhpbQlNYXhpbSBJbnRlZ3JhdGVkIFByb2R1Y3RzCittb3NhaXh0ZWNoCU1vc2FpeCBUZWNobm9sb2dpZXMsIEluYy4KK25hdGlvbmFsCU5hdGlvbmFsIFNlbWljb25kdWN0b3IKK25pbnRlbmRvCU5pbnRlbmRvCitudmlkaWEJTlZJRElBCitueHAJTlhQIFNlbWljb25kdWN0b3JzCitwb3dlcnZyCUltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworcWNvbQlRdWFsY29tbSwgSW5jLgorcmFtdHJvbglSYW10cm9uIEludGVybmF0aW9uYWwKK3NhbXN1bmcJU2Ftc3VuZyBTZW1pY29uZHVjdG9yCitzY2hpbmRsZXIJU2NoaW5kbGVyCitzaW10ZWsKK3NpcmYJU2lSRiBUZWNobm9sb2d5LCBJbmMuCitzdGVyaWNzc29uCVNULUVyaWNzc29uCit0aQlUZXhhcyBJbnN0cnVtZW50cworeGxueAlYaWxpbngKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92aXJ0aW8vbW1pby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmlydGlvL21taW8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNjljMWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmlydGlvL21taW8udHh0CkBAIC0wLDAgKzEsMTcgQEAKKyogdmlydGlvIG1lbW9yeSBtYXBwZWQgZGV2aWNlCisKK1NlZSBodHRwOi8vb3psYWJzLm9yZy9+cnVzdHkvdmlydGlvLXNwZWMvIGZvciBtb3JlIGRldGFpbHMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZToJInZpcnRpbyxtbWlvIiBjb21wYXRpYmlsaXR5IHN0cmluZworLSByZWc6CQljb250cm9sIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgYW5kIHNpemUgaW5jbHVkaW5nIGNvbmZpZ3VyYXRpb24gc3BhY2UKKy0gaW50ZXJydXB0czoJaW50ZXJydXB0IGdlbmVyYXRlZCBieSB0aGUgZGV2aWNlCisKK0V4YW1wbGU6CisKKwl2aXJ0aW9fYmxvY2tAMzAwMCB7CisJCWNvbXBhdGlibGUgPSAidmlydGlvLG1taW8iOworCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKKwkJaW50ZXJydXB0cyA9IDw0MT47CisJfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSBiL0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUKaW5kZXggYzQ2NmY1OC4uZTY3YmU3YSAxMDA3NTUKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZQorKysgYi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlCkBAIC0yNyw3ICsyNyw4IEBACiAJCSJvcjUxMjExIiwgIm9yNTExMzJfcWFtIiwgIm9yNTExMzJfdnNiIiwgImJsdWViaXJkIiwKIAkJIm9wZXJhMSIsICJjeDIzMXh4IiwgImN4MTgiLCAiY3gyMzg4NSIsICJwdnJ1c2IyIiwgIm1wYzcxOCIsCiAJCSJhZjkwMTUiLCAibmdlbmUiLCAiYXo2MDI3IiwgImxtZTI1MTBfbGciLCAibG1lMjUxMGNfczczOTUiLAotCQkibG1lMjUxMGNfczczOTVfb2xkIiwgImRyeGsiLCAiZHJ4a190ZXJyYXRlY19oNSIpOworCQkibG1lMjUxMGNfczczOTVfb2xkIiwgImRyeGsiLCAiZHJ4a190ZXJyYXRlY19oNSIsICJ0ZGExMDA3MSIsCisJCSJpdDkxMzUiICk7CiAKICMgQ2hlY2sgYXJncwogc3ludGF4KCkgaWYgKHNjYWxhcihAQVJHVikgIT0gMSk7CkBAIC01NzUsMTkgKzU3NiwxMCBAQAogfQogCiBzdWIgYXo2MDI3ewotICAgIG15ICRmaWxlID0gIkFaNjAyN19MaW51eF9Ecml2ZXIudGFyLmd6IjsKLSAgICBteSAkdXJsID0gImh0dHA6Ly9saW51eC50ZXJyYXRlYy5kZS9maWxlcy8kZmlsZSI7CiAgICAgbXkgJGZpcm13YXJlID0gImR2Yi11c2ItYXo2MDI3LTAzLmZ3IjsKKyAgICBteSAkdXJsID0gImh0dHA6Ly9saW51eC50ZXJyYXRlYy5kZS9maWxlcy9URVJSQVRFQ19TNy8kZmlybXdhcmUiOwogCi0gICAgd2dldGZpbGUoJGZpbGUsICR1cmwpOwotCi0gICAgI3VudGFyCi0gICAgaWYoIHN5c3RlbSgidGFyIHh6dmYgJGZpbGUgJGZpcm13YXJlIikpewotICAgICAgICBkaWUgImZhaWxlZCB0byB1bnRhciBmaXJtd2FyZSI7Ci0gICAgfQotICAgIGlmKCBzeXN0ZW0oInJtICRmaWxlIikpewotICAgICAgICBkaWUgKCJ1bmFibGUgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5IGZpbGVzIik7Ci0gICAgfQorICAgIHdnZXRmaWxlKCRmaXJtd2FyZSwgJHVybCk7CiAKICAgICAkZmlybXdhcmU7CiB9CkBAIC02NjUsNiArNjU3LDQxIEBACiAgICAgIiRmd2ZpbGUiCiB9CiAKK3N1YiBpdDkxMzUgeworICAgIG15ICR1cmwgPSAiaHR0cDovL2t3b3JsZC5zZXJ2ZXIyNjEuY29tL2t3b3JsZC9DRC9JVEVfVGlWbWUvVjEuMDAvIjsKKyAgICBteSAkemlwZmlsZSA9ICJEcml2ZXJfVjEwLjMyMy4xLjA0MTIuMTAwNDEyLnppcCI7CisgICAgbXkgJGhhc2ggPSAiNzliNTk3ZGM2NDg2OThlZDY4MjA4NDVjMGM5ZDBkMzciOworICAgIG15ICR0bXBkaXIgPSB0ZW1wZGlyKERJUiA9PiAiL3RtcCIsIENMRUFOVVAgPT4gMCk7CisgICAgbXkgJGRydmZpbGUgPSAiRHJpdmVyX1YxMC4zMjMuMS4wNDEyLjEwMDQxMi9EYXRhL3g4Ni9JVDkxMzVCREEuc3lzIjsKKyAgICBteSAkZndmaWxlID0gImR2Yi11c2ItaXQ5MTM3LTAxLmZ3IjsKKworICAgIGNoZWNrc3RhbmRhcmQoKTsKKworICAgIHdnZXRmaWxlKCR6aXBmaWxlLCAkdXJsIC4gJHppcGZpbGUpOworICAgIHZlcmlmeSgkemlwZmlsZSwgJGhhc2gpOworICAgIHVuemlwKCR6aXBmaWxlLCAkdG1wZGlyKTsKKyAgICBleHRyYWN0KCIkdG1wZGlyLyRkcnZmaWxlIiwgNjk2MzIsIDU3MzEsICIkZndmaWxlIik7CisKKyAgICAiJGZ3ZmlsZSIKK30KKworc3ViIHRkYTEwMDcxIHsKKyAgICBteSAkc291cmNlZmlsZSA9ICJQQ1RWXzQ2MGVfcmVmZXJlbmNlLnppcCI7CisgICAgbXkgJHVybCA9ICJmdHA6Ly9mdHAucGN0dnN5c3RlbXMuY29tL1RWL2RyaXZlci9QQ1RWJTIwNzBlJTIwODBlJTIwMTAwZSUyMDMyMGUlMjAzMzBlJTIwODAwZS8iOworICAgIG15ICRoYXNoID0gIjQ0MDNkZTkwM2JmMjU5MzQ2NGM4ZDc0YmJjMjAwYTU3IjsKKyAgICBteSAkZndmaWxlID0gImR2Yi1mZS10ZGExMDA3MS5mdyI7CisgICAgbXkgJHRtcGRpciA9IHRlbXBkaXIoRElSID0+ICIvdG1wIiwgQ0xFQU5VUCA9PiAxKTsKKworICAgIGNoZWNrc3RhbmRhcmQoKTsKKworICAgIHdnZXRmaWxlKCRzb3VyY2VmaWxlLCAkdXJsIC4gJHNvdXJjZWZpbGUpOworICAgIHZlcmlmeSgkc291cmNlZmlsZSwgJGhhc2gpOworICAgIHVuemlwKCRzb3VyY2VmaWxlLCAkdG1wZGlyKTsKKyAgICBleHRyYWN0KCIkdG1wZGlyL1BDVFZcIDcwZVwgODBlXCAxMDBlXCAzMjBlXCAzMzBlXCA4MDBlLzMyXCBiaXQvZW1PRU0uc3lzIiwgMHg2N2QzOCwgNDA1MDQsICRmd2ZpbGUpOworCisgICAgIiRmd2ZpbGUiOworfQorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBVdGlsaXRpZXMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvaXQ5MTM3LnR4dCBiL0RvY3VtZW50YXRpb24vZHZiL2l0OTEzNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2NzI2ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2l0OTEzNy50eHQKQEAgLTAsMCArMSw5IEBACitUbyBleHRyYWN0IGZpcm13YXJlIGZvciBLd29ybGQgVUI0OTktMlQgKGlkIDFiODA6ZTQwOSkgeW91IG5lZWQgdG8gY29weSB0aGUKK2ZvbGxvd2luZyBmaWxlKHMpIHRvIHRoaXMgZGlyZWN0b3J5LgorCitJVDkxMzVCREEuc3lzIERhdGVkIE1vbiAyMiBNYXIgMjAxMCAwMjoyMDowOCBHTVQKKworZXh0cmFjdCB1c2luZyBkZAorZGQgaWY9SVQ5MTM1QkRBLnN5cyBpYnM9MSBza2lwPTY5NjMyIGNvdW50PTU3MzEgb2Y9ZHZiLXVzYi1pdDkxMzctMDEuZncKKworY29weSB0byBkZWZhdWx0IGZpcm13YXJlIGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQKaW5kZXggODJhNWQyNS4uYmE0YmU4YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0CkBAIC0yMSw2ICsyMSwxMSBAQAogICAvc3lzL2Jsb2NrLzxkZXZpY2U+L21ha2UtaXQtZmFpbCBvcgogICAvc3lzL2Jsb2NrLzxkZXZpY2U+LzxwYXJ0aXRpb24+L21ha2UtaXQtZmFpbC4gKGdlbmVyaWNfbWFrZV9yZXF1ZXN0KCkpCiAKK28gZmFpbF9tbWNfcmVxdWVzdAorCisgIGluamVjdHMgTU1DIGRhdGEgZXJyb3JzIG9uIGRldmljZXMgcGVybWl0dGVkIGJ5IHNldHRpbmcKKyAgZGVidWdmcyBlbnRyaWVzIHVuZGVyIC9zeXMva2VybmVsL2RlYnVnL21tYzAvZmFpbF9tbWNfcmVxdWVzdAorCiBDb25maWd1cmUgZmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdGllcyBiZWhhdmlvcgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTE1LDcgKzEyMCw4IEBACiAKIAlmYWlsc2xhYj0KIAlmYWlsX3BhZ2VfYWxsb2M9Ci0JZmFpbF9tYWtlX3JlcXVlc3Q9PGludGVydmFsPiw8cHJvYmFiaWxpdHk+LDxzcGFjZT4sPHRpbWVzPgorCWZhaWxfbWFrZV9yZXF1ZXN0PQorCW1tY19jb3JlLmZhaWxfcmVxdWVzdD08aW50ZXJ2YWw+LDxwcm9iYWJpbGl0eT4sPHNwYWNlPiw8dGltZXM+CiAKIEhvdyB0byBhZGQgbmV3IGZhdWx0IGluamVjdGlvbiBjYXBhYmlsaXR5CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi91ZGxmYi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZiL3VkbGZiLnR4dAppbmRleCA3ZmRkZTJhLi41N2QyZjI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZiL3VkbGZiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL3VkbGZiLnR4dApAQCAtODcsMjMgKzg3LDM4IEBACiBvcHRpb25zLCBob3dldmVyLgogCiBGcm9tIHRoZSBjb21tYW5kIGxpbmUsIHBhc3Mgb3B0aW9ucyB0byBtb2Rwcm9iZQotbW9kcHJvYmUgdWRsZmIgZGVmaW89MSBjb25zb2xlPTEKK21vZHByb2JlIHVkbGZiIGZiX2RlZmlvPTAgY29uc29sZT0xIHNoYWRvdz0xCiAKLU9yIGZvciBwZXJtYW5lbnQgb3B0aW9uLCBjcmVhdGUgZmlsZSBsaWtlIC9ldGMvbW9kcHJvYmUuZC9vcHRpb25zIHdpdGggdGV4dAotb3B0aW9ucyB1ZGxmYiBkZWZpbz0xIGNvbnNvbGU9MQorT3IgbW9kaWZ5IG9wdGlvbnMgb24gdGhlIGZseSBhdCAvc3lzL21vZHVsZS91ZGxmYi9wYXJhbWV0ZXJzIGRpcmVjdG9yeSB2aWEKK3N1ZG8gbmFubyBmYl9kZWZpbworY2hhbmdlIHRoZSBwYXJhbWV0ZXIgaW4gcGxhY2UsIGFuZCBzYXZlIHRoZSBmaWxlLgogCi1BY2NlcHRlZCBvcHRpb25zOgorVW5wbHVnL3JlcGx1ZyBVU0IgZGV2aWNlIHRvIGFwcGx5IHdpdGggbmV3IHNldHRpbmdzCisKK09yIGZvciBwZXJtYW5lbnQgb3B0aW9uLCBjcmVhdGUgZmlsZSBsaWtlIC9ldGMvbW9kcHJvYmUuZC91ZGxmYi5jb25mIHdpdGggdGV4dAorb3B0aW9ucyB1ZGxmYiBmYl9kZWZpbz0wIGNvbnNvbGU9MSBzaGFkb3c9MQorCitBY2NlcHRlZCBib29sZWFuIG9wdGlvbnM6CiAKIGZiX2RlZmlvCU1ha2UgdXNlIG9mIHRoZSBmYl9kZWZpbyAoQ09ORklHX0ZCX0RFRkVSUkVEX0lPKSBrZXJuZWwKIAkJbW9kdWxlIHRvIHRyYWNrIGNoYW5nZWQgYXJlYXMgb2YgdGhlIGZyYW1lYnVmZmVyIGJ5IHBhZ2UgZmF1bHRzLgotICAgICAgICAJU3RhbmRhcmQgZmJkZXYgYXBwbGljYXRpb25zIHRoYXQgdXNlIG1tYXAgYnV0IHRoYXQgZG8gbm90Ci0JCXJlcG9ydCBkYW1hZ2UsIG1heSBiZSBhYmxlIHRvIHdvcmsgd2l0aCB0aGlzIGVuYWJsZWQuCi0JCURpc2FibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSBvZiBvdmVyaGVhZCBhbmQgb3RoZXIgaXNzdWVzLgorCQlTdGFuZGFyZCBmYmRldiBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgbW1hcCBidXQgdGhhdCBkbyBub3QKKwkJcmVwb3J0IGRhbWFnZSwgc2hvdWxkIGJlIGFibGUgdG8gd29yayB3aXRoIHRoaXMgZW5hYmxlZC4KKwkJRGlzYWJsZSB3aGVuIHJ1bm5pbmcgd2l0aCBYIHNlcnZlciB0aGF0IHN1cHBvcnRzIHJlcG9ydGluZworCQljaGFuZ2VkIHJlZ2lvbnMgdmlhIGlvY3RsLCBhcyB0aGlzIG1ldGhvZCBpcyBzaW1wbGVyLAorCQltb3JlIHN0YWJsZSwgYW5kIGhpZ2hlciBwZXJmb3JtYW5jZS4KKwkJZGVmYXVsdDogZmJfZGVmaW89MQogCi1jb25zb2xlCQlBbGxvdyBmYmNvbiB0byBhdHRhY2ggdG8gdWRsZmIgcHJvdmlkZWQgZnJhbWVidWZmZXJzLiBUaGlzCi0JCWlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSBmYmNvbiB3aWxsIGFnZ3Jlc3NpdmVseSBjb25zdW1lCi0JCXRoZSBmaXJzdCBmcmFtZWJ1ZmZlciBpdCBmaW5kcywgd2hpY2ggaXNuJ3QgdXN1YWxseSB3aGF0IHRoZQotCQl1c2VyIHdhbnRzIGluIHRoZSBjYXNlIG9mIFVTQiBkaXNwbGF5cy4KK2NvbnNvbGUJQWxsb3cgZmJjb24gdG8gYXR0YWNoIHRvIHVkbGZiIHByb3ZpZGVkIGZyYW1lYnVmZmVycy4KKwkJQ2FuIGJlIGRpc2FibGVkIGlmIGZiY29uIGFuZCBvdGhlciBjbGllbnRzCisJCShlLmcuIFggd2l0aCAtLXNoYXJlZC12dCkgYXJlIGluIGNvbmZsaWN0LgorCQlkZWZhdWx0OiBjb25zb2xlPTEKKworc2hhZG93CQlBbGxvY2F0ZSBhIDJuZCBmcmFtZWJ1ZmZlciB0byBzaGFkb3cgd2hhdCdzIGN1cnJlbnRseSBhY3Jvc3MKKwkJdGhlIFVTQiBidXMgaW4gZGV2aWNlIG1lbW9yeS4gSWYgYW55IHBpeGVscyBhcmUgdW5jaGFuZ2VkLAorCQlkbyBub3QgdHJhbnNtaXQuIFNwZW5kcyBob3N0IG1lbW9yeSB0byBzYXZlIFVTQiB0cmFuc2ZlcnMuCisJCUVuYWJsZWQgYnkgZGVmYXVsdC4gT25seSBkaXNhYmxlIG9uIHZlcnkgbG93IG1lbW9yeSBzeXN0ZW1zLgorCQlkZWZhdWx0OiBzaGFkb3c9MQogCiBTeXNmcyBBdHRyaWJ1dGVzCiA9PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggZDVhYzM2Mi4uM2Q4NDkxMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMTMzLDQxICsxMzMsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJc3lzX3N5c2N0bAotV2hlbjoJU2VwdGVtYmVyIDIwMTAKLU9wdGlvbjogQ09ORklHX1NZU0NUTF9TWVNDQUxMCi1XaHk6CVRoZSBzYW1lIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiBhIG1vcmUgY29udmVuaWVudCBmcm9tCi0JL3Byb2Mvc3lzLCBhbmQgbm9uZSBvZiB0aGUgc3lzY3RsIHZhcmlhYmxlcyBhcHBlYXIgdG8gYmUKLQlpbXBvcnRhbnQgcGVyZm9ybWFuY2Ugd2lzZS4KLQotCUJpbmFyeSBzeXNjdGxzIGFyZSBhIGxvbmcgc3RhbmRpbmcgc291cmNlIG9mIHN1YnRsZSBrZXJuZWwKLQlidWdzIGFuZCBzZWN1cml0eSBpc3N1ZXMuCi0KLQlXaGVuIEkgbG9va2VkIHNldmVyYWwgbW9udGhzIGFnbyBhbGwgSSBjb3VsZCBmaW5kIGFmdGVyCi0Jc2VhcmNoaW5nIHNldmVyYWwgZGlzdHJpYnV0aW9ucyB3ZXJlIDUgdXNlciBzcGFjZSBwcm9ncmFtcyBhbmQKLQlnbGliYyAod2hpY2ggZmFsbHMgYmFjayB0byAvcHJvYy9zeXMpIHVzaW5nIHRoaXMgc3lzY2FsbC4KLQotCVRoZSBtYW4gcGFnZSBmb3Igc3lzY3RsKDIpIGRvY3VtZW50cyBpdCBhcyB1bnVzYWJsZSBmb3IgdXNlcgotCXNwYWNlIHByb2dyYW1zLgotCi0Jc3lzY3RsKDIpIGlzIG5vdCBnZW5lcmFsbHkgQUJJIGNvbXBhdGlibGUgdG8gYSAzMmJpdCB1c2VyCi0Jc3BhY2UgYXBwbGljYXRpb24gb24gYSA2NGJpdCBhbmQgYSAzMmJpdCBrZXJuZWwuCi0KLQlGb3IgdGhlIGxhc3Qgc2V2ZXJhbCBtb250aHMgdGhlIHBvbGljeSBoYXMgYmVlbiBubyBuZXcgYmluYXJ5Ci0Jc3lzY3RscyBhbmQgbm8gb25lIGhhcyBwdXQgZm9yd2FyZCBhbiBhcmd1bWVudCB0byB1c2UgdGhlbS4KLQotCUJpbmFyeSBzeXNjdGxzIGlzc3VlcyBzZWVtIHRvIGtlZXAgaGFwcGVuaW5nIGFwcGVhcmluZyBzbwotCXByb3Blcmx5IGRlcHJlY2F0aW5nIHRoZW0gKHdpdGggYSB3YXJuaW5nIHRvIHVzZXIgc3BhY2UpIGFuZCBhCi0JMiB5ZWFyIGdyYWNlIHdhcm5pbmcgcGVyaW9kIHdpbGwgbWVhbiBldmVudHVhbGx5IHdlIGNhbiBraWxsCi0JdGhlbSBhbmQgZW5kIHRoZSBwYWluLgotCi0JSW4gdGhlIG1lYW4gdGltZSBpbmRpdmlkdWFsIGJpbmFyeSBzeXNjdGxzIGNhbiBiZSBkZWFsdCB3aXRoCi0JaW4gYSBwaWVjZXdpc2UgZmFzaGlvbi4KLQotV2hvOglFcmljIEJpZWRlcm1hbiA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJL3Byb2MvPHBpZD4vb29tX2FkagogV2hlbjoJQXVndXN0IDIwMTIKIFdoeToJL3Byb2MvPHBpZD4vb29tX2FkaiBhbGxvd3MgdXNlcnNwYWNlIHRvIGluZmx1ZW5jZSB0aGUgb29tIGtpbGxlcidzCkBAIC00OTUsMjkgKzQ2MCw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJU3VwcG9ydCBmb3IgVVZDSU9DX0NUUkxfQUREIGluIHRoZSB1dmN2aWRlbyBkcml2ZXIKLVdoZW46CTMuMgotV2h5OglUaGUgaW5mb3JtYXRpb24gcGFzc2VkIHRvIHRoZSBkcml2ZXIgYnkgdGhpcyBpb2N0bCBpcyBub3cgcXVlcmllZAotCWR5bmFtaWNhbGx5IGZyb20gdGhlIGRldmljZS4KLVdobzoJTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdoYXQ6CVN1cHBvcnQgZm9yIFVWQ0lPQ19DVFJMX01BUF9PTEQgaW4gdGhlIHV2Y3ZpZGVvIGRyaXZlcgotV2hlbjoJMy4yCi1XaHk6CVVzZWQgb25seSBieSBhcHBsaWNhdGlvbnMgY29tcGlsZWQgYWdhaW5zdCBvbGRlciBkcml2ZXIgdmVyc2lvbnMuCi0JU3VwZXJzZWRlZCBieSBVVkNJT0NfQ1RSTF9NQVAgd2hpY2ggc3VwcG9ydHMgVjRMMiBtZW51IGNvbnRyb2xzLgotV2hvOglMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2hhdDoJU3VwcG9ydCBmb3IgVVZDSU9DX0NUUkxfR0VUIGFuZCBVVkNJT0NfQ1RSTF9TRVQgaW4gdGhlIHV2Y3ZpZGVvIGRyaXZlcgotV2hlbjoJMy4yCi1XaHk6CVN1cGVyc2VkZWQgYnkgdGhlIFVWQ0lPQ19DVFJMX1FVRVJZIGlvY3RsLgotV2hvOglMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJU3VwcG9ydCBmb3IgZHJpdmVyIHNwZWNpZmljIGlvY3RscyBpbiB0aGUgcHdjIGRyaXZlciAoZXZlcnl0aGluZwogCWRlZmluZWQgaW4gbWVkaWEvcHdjLWlvY3RsLmgpCiBXaGVuOgkzLjMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZwppbmRleCA2NTMzODA3Li5kODE5YmExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCkBAIC0yOSw2ICsyOSw3IEBACiBkX2NvbXBhcmU6CXllcwkJbm8JCW5vCQltYXliZQogZF9kZWxldGU6CW5vCQl5ZXMJCW5vCQlubwogZF9yZWxlYXNlOglubwkJbm8JCXllcwkJbm8KK2RfcHJ1bmU6ICAgICAgICBubyAgICAgICAgICAgICAgeWVzICAgICAgICAgICAgIG5vICAgICAgICAgICAgICBubwogZF9pcHV0OgkJbm8JCW5vCQl5ZXMJCW5vCiBkX2RuYW1lOglubwkJbm8JCW5vCQlubwogZF9hdXRvbW91bnQ6CW5vCQlubwkJeWVzCQlubwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0My50eHQKaW5kZXggMjJmM2EwZS4uYjEwMGFkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDMudHh0CkBAIC03MywxNCArNzMsNiBAQAogCQkJYWxzbyBiZSB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIGJhcnJpZXJzLCBmb3IKIAkJCWNvbnNpc3RlbmN5IHdpdGggb3RoZXIgZXh0MyBtb3VudCBvcHRpb25zLgogCi1vcmxvdgkJKCopCVRoaXMgZW5hYmxlcyB0aGUgbmV3IE9ybG92IGJsb2NrIGFsbG9jYXRvci4gSXQgaXMKLQkJCWVuYWJsZWQgYnkgZGVmYXVsdC4KLQotb2xkYWxsb2MJCVRoaXMgZGlzYWJsZXMgdGhlIE9ybG92IGJsb2NrIGFsbG9jYXRvciBhbmQgZW5hYmxlcwotCQkJdGhlIG9sZCBibG9jayBhbGxvY2F0b3IuICBPcmxvdiBzaG91bGQgaGF2ZSBiZXR0ZXIKLQkJCXBlcmZvcm1hbmNlIC0gd2UnZCBsaWtlIHRvIGdldCBzb21lIGZlZWRiYWNrIGlmIGl0J3MKLQkJCXRoZSBjb250cmFyeSBmb3IgeW91LgotCiB1c2VyX3hhdHRyCQlFbmFibGVzIEV4dGVuZGVkIFVzZXIgQXR0cmlidXRlcy4gIEFkZGl0aW9uYWxseSwgeW91CiAJCQluZWVkIHRvIGhhdmUgZXh0ZW5kZWQgYXR0cmlidXRlIHN1cHBvcnQgZW5hYmxlZCBpbiB0aGUKIAkJCWtlcm5lbCBjb25maWd1cmF0aW9uIChDT05GSUdfRVhUM19GU19YQVRUUikuICBTZWUgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dAppbmRleCAyMzJhNTc1Li40OTE3Y2YyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQKQEAgLTE2MCw3ICsxNjAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgCWxlYWQgdG8gYW55IG51bWJlciBvZiBwcm9ibGVtcy4KIAogZGF0YT1qb3VybmFsCQlBbGwgZGF0YSBhcmUgY29tbWl0dGVkIGludG8gdGhlIGpvdXJuYWwgcHJpb3IgdG8gYmVpbmcKLQkJCXdyaXR0ZW4gaW50byB0aGUgbWFpbiBmaWxlIHN5c3RlbS4KKwkJCXdyaXR0ZW4gaW50byB0aGUgbWFpbiBmaWxlIHN5c3RlbS4gIEVuYWJsaW5nCisJCQl0aGlzIG1vZGUgd2lsbCBkaXNhYmxlIGRlbGF5ZWQgYWxsb2NhdGlvbiBhbmQKKwkJCU9fRElSRUNUIHN1cHBvcnQuCiAKIGRhdGE9b3JkZXJlZAkoKikJQWxsIGRhdGEgYXJlIGZvcmNlZCBkaXJlY3RseSBvdXQgdG8gdGhlIG1haW4gZmlsZQogCQkJc3lzdGVtIHByaW9yIHRvIGl0cyBtZXRhZGF0YSBiZWluZyBjb21taXR0ZWQgdG8gdGhlCkBAIC0yMDEsMzAgKzIwMywxOSBAQAogCQkJdGFibGUgcmVhZGFoZWFkIGFsZ29yaXRobSB3aWxsIHByZS1yZWFkIGludG8KIAkJCXRoZSBidWZmZXIgY2FjaGUuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMiBibG9ja3MuCiAKLW9ybG92CQkoKikJVGhpcyBlbmFibGVzIHRoZSBuZXcgT3Jsb3YgYmxvY2sgYWxsb2NhdG9yLiBJdCBpcwotCQkJZW5hYmxlZCBieSBkZWZhdWx0LgotCi1vbGRhbGxvYwkJVGhpcyBkaXNhYmxlcyB0aGUgT3Jsb3YgYmxvY2sgYWxsb2NhdG9yIGFuZCBlbmFibGVzCi0JCQl0aGUgb2xkIGJsb2NrIGFsbG9jYXRvci4gIE9ybG92IHNob3VsZCBoYXZlIGJldHRlcgotCQkJcGVyZm9ybWFuY2UgLSB3ZSdkIGxpa2UgdG8gZ2V0IHNvbWUgZmVlZGJhY2sgaWYgaXQncwotCQkJdGhlIGNvbnRyYXJ5IGZvciB5b3UuCi0KLXVzZXJfeGF0dHIJCUVuYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLiAgQWRkaXRpb25hbGx5LCB5b3UKLQkJCW5lZWQgdG8gaGF2ZSBleHRlbmRlZCBhdHRyaWJ1dGUgc3VwcG9ydCBlbmFibGVkIGluIHRoZQotCQkJa2VybmVsIGNvbmZpZ3VyYXRpb24gKENPTkZJR19FWFQ0X0ZTX1hBVFRSKS4gIFNlZSB0aGUKLQkJCWF0dHIoNSkgbWFudWFsIHBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvIHRvCi0JCQlsZWFybiBtb3JlIGFib3V0IGV4dGVuZGVkIGF0dHJpYnV0ZXMuCi0KLW5vdXNlcl94YXR0cgkJRGlzYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLgotCi1hY2wJCQlFbmFibGVzIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIHN1cHBvcnQuCi0JCQlBZGRpdGlvbmFsbHksIHlvdSBuZWVkIHRvIGhhdmUgQUNMIHN1cHBvcnQgZW5hYmxlZCBpbgotCQkJdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIChDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wpLgotCQkJU2VlIHRoZSBhY2woNSkgbWFudWFsIHBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvCi0JCQlmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK25vdXNlcl94YXR0cgkJRGlzYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLiBJZiB5b3UgaGF2ZSBleHRlbmRlZAorCQkJYXR0cmlidXRlIHN1cHBvcnQgZW5hYmxlZCBpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24KKwkJCShDT05GSUdfRVhUNF9GU19YQVRUUiksIGV4dGVuZGVkIGF0dHJpYnV0ZSBzdXBwb3J0CisJCQlpcyBlbmFibGVkIGJ5IGRlZmF1bHQgb24gbW91bnQuIFNlZSB0aGUgYXR0cig1KSBtYW51YWwKKwkJCXBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvIGZvciBtb3JlIGluZm9ybWF0aW9uCisJCQlhYm91dCBleHRlbmRlZCBhdHRyaWJ1dGVzLgogCiBub2FjbAkJCVRoaXMgb3B0aW9uIGRpc2FibGVzIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3QKLQkJCXN1cHBvcnQuCisJCQlzdXBwb3J0LiBJZiBBQ0wgc3VwcG9ydCBpcyBlbmFibGVkIGluIHRoZSBrZXJuZWwKKwkJCWNvbmZpZ3VyYXRpb24gKENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCksIEFDTCBpcworCQkJZW5hYmxlZCBieSBkZWZhdWx0IG9uIG1vdW50LiBTZWUgdGhlIGFjbCg1KSBtYW51YWwKKwkJCXBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvIGZvciBtb3JlIGluZm9ybWF0aW9uCisJCQlhYm91dCBhY2wuCiAKIGJzZGRmCQkoKikJTWFrZSAnZGYnIGFjdCBsaWtlIEJTRC4KIG1pbml4ZGYJCQlNYWtlICdkZicgYWN0IGxpa2UgTWluaXguCkBAIC00MTksOCArNDEwLDggQEAKIEluIHRoZSBldmVudCBvZiBhIGNyYXNoLCB0aGUgam91cm5hbCBjYW4gYmUgcmVwbGF5ZWQsIGJyaW5naW5nIGJvdGggZGF0YSBhbmQKIG1ldGFkYXRhIGludG8gYSBjb25zaXN0ZW50IHN0YXRlLiAgVGhpcyBtb2RlIGlzIHRoZSBzbG93ZXN0IGV4Y2VwdCB3aGVuIGRhdGEKIG5lZWRzIHRvIGJlIHJlYWQgZnJvbSBhbmQgd3JpdHRlbiB0byBkaXNrIGF0IHRoZSBzYW1lIHRpbWUgd2hlcmUgaXQKLW91dHBlcmZvcm1zIGFsbCBvdGhlcnMgbW9kZXMuICBDdXJyZW50bHkgZXh0NCBkb2VzIG5vdCBoYXZlIGRlbGF5ZWQKLWFsbG9jYXRpb24gc3VwcG9ydCBpZiB0aGlzIGRhdGEgam91cm5hbGxpbmcgbW9kZSBpcyBzZWxlY3RlZC4KK291dHBlcmZvcm1zIGFsbCBvdGhlcnMgbW9kZXMuICBFbmFibGluZyB0aGlzIG1vZGUgd2lsbCBkaXNhYmxlIGRlbGF5ZWQKK2FsbG9jYXRpb24gYW5kIE9fRElSRUNUIHN1cHBvcnQuCiAKIC9wcm9jIGVudHJpZXMKID09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaGZzLnR4dAppbmRleCBiZDBmYTc3MC4uZDA5NmRmNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9oZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaGZzLnR4dApAQCAtMSwzICsxLDQgQEAKK05vdGU6IFRoaXMgZmlsZXN5c3RlbSBkb2Vzbid0IGhhdmUgYSBtYWludGFpbmVyLgogCiBNYWNpbnRvc2ggSEZTIEZpbGVzeXN0ZW0gZm9yIExpbnV4CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC03Niw4ICs3Nyw2IEBACiBDcmVkaXRzCiA9PT09PT09CiAKLVRoZSBIRlMgZHJpdmVycyB3YXMgd3JpdHRlbiBieSBQYXVsIEguIEhhcmdyb3ZlYSAoaGFyZ3JvdmVAc2NjbS5TdGFuZm9yZC5FRFUpCi1hbmQgaXMgbm93IG1haW50YWluZWQgYnkgUm9tYW4gWmlwcGVsIChyb21hbkBhcmRpc3RlY2guY29tKSBhdCBBcmRpcwotVGVjaG5vbG9naWVzLgotUm9tYW4gcmV3cm90ZSBsYXJnZSBwYXJ0cyBvZiB0aGUgY29kZSBhbmQgYnJvdWdodCBpbiBidHJlZSByb3V0aW5lcyBkZXJpdmVkCi1mcm9tIEJyYWQgQm95ZXIncyBoZnNwbHVzIGRyaXZlciAoYWxzbyBtYWludGFpbmVkIGJ5IFJvbWFuIG5vdykuCitUaGUgSEZTIGRyaXZlcnMgd2FzIHdyaXR0ZW4gYnkgUGF1bCBILiBIYXJncm92ZWEgKGhhcmdyb3ZlQHNjY20uU3RhbmZvcmQuRURVKS4KK1JvbWFuIFppcHBlbCAocm9tYW5AYXJkaXN0ZWNoLmNvbSkgcmV3cm90ZSBsYXJnZSBwYXJ0cyBvZiB0aGUgY29kZSBhbmQgYnJvdWdodAoraW4gYnRyZWUgcm91dGluZXMgZGVyaXZlZCBmcm9tIEJyYWQgQm95ZXIncyBoZnNwbHVzIGRyaXZlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lub3RpZnkudHh0CmluZGV4IDU5YTkxOWYuLmNmZDAyNzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9pbm90aWZ5LnR4dApAQCAtMTk0LDcgKzE5NCw4IEBACiBFYWNoIHdhdGNoIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbm90aWZ5X3dhdGNoIHN0cnVjdHVyZS4gIFdhdGNoZXMgYXJlIGNoYWluZWQKIG9mZiBvZiBlYWNoIGFzc29jaWF0ZWQgaW5vdGlmeV9oYW5kbGUgYW5kIGVhY2ggYXNzb2NpYXRlZCBpbm9kZS4KIAotU2VlIGZzL2lub3RpZnkuYyBhbmQgZnMvaW5vdGlmeV91c2VyLmMgZm9yIHRoZSBsb2NraW5nIGFuZCBsaWZldGltZSBydWxlcy4KK1NlZSBmcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X2Zzbm90aWZ5LmMgYW5kIGZzL25vdGlmeS9pbm90aWZ5L2lub3RpZnlfdXNlci5jCitmb3IgdGhlIGxvY2tpbmcgYW5kIGxpZmV0aW1lIHJ1bGVzLgogCiAKICh2aSkgUmF0aW9uYWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2VoZiBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmCmluZGV4IDc2ZmZlZjkuLjNmNDRkYmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmCkBAIC0xNCw2ICsxNCwxMCBAQAogICAgIFByZWZpeDogJ3c4MzYyN2RoZycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSVNBIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gU3VwZXIgSS9PIHJlZ2lzdGVycwogICAgIERhdGFzaGVldDogbm90IGF2YWlsYWJsZQorICAqIFdpbmJvbmQgVzgzNjI3VUhHCisgICAgUHJlZml4OiAndzgzNjI3dWhnJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJU0EgYWRkcmVzcyByZXRyaWV2ZWQgZnJvbSBTdXBlciBJL08gcmVnaXN0ZXJzCisgICAgRGF0YXNoZWV0OiBhdmFpbGFibGUgZnJvbSB3d3cubnV2b3Rvbi5jb20KICAgKiBXaW5ib25kIFc4MzY2N0hHCiAgICAgUHJlZml4OiAndzgzNjY3aGcnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IElTQSBhZGRyZXNzIHJldHJpZXZlZCBmcm9tIFN1cGVyIEkvTyByZWdpc3RlcnMKQEAgLTQyLDE0ICs0NiwxMyBAQAogLS0tLS0tLS0tLS0KIAogVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM2MjdFSEYsIFc4MzYyN0VIRywKLVc4MzYyN0RIRywgVzgzNjI3REhHLVAsIFc4MzY2N0hHLCBXODM2NjdIRy1CLCBXODM2NjdIRy1JIChOQ1Q2Nzc1RiksCi1hbmQgTkNUNjc3NkYgc3VwZXIgSS9PIGNoaXBzLiBXZSB3aWxsIHJlZmVyIHRvIHRoZW0gY29sbGVjdGl2ZWx5IGFzCi1XaW5ib25kIGNoaXBzLgorVzgzNjI3REhHLCBXODM2MjdESEctUCwgVzgzNjI3VUhHLCBXODM2NjdIRywgVzgzNjY3SEctQiwgVzgzNjY3SEctSQorKE5DVDY3NzVGKSwgYW5kIE5DVDY3NzZGIHN1cGVyIEkvTyBjaGlwcy4gV2Ugd2lsbCByZWZlciB0byB0aGVtIGNvbGxlY3RpdmVseQorYXMgV2luYm9uZCBjaGlwcy4KIAotVGhlIGNoaXBzIGltcGxlbWVudCB0aHJlZSB0ZW1wZXJhdHVyZSBzZW5zb3JzICh1cCB0byBmb3VyIGZvciA2NjdIRy1CLCBhbmQgbmluZQotZm9yIE5DVDY3NzVGIGFuZCBOQ1Q2Nzc2RiksIGZpdmUgZmFuIHJvdGF0aW9uIHNwZWVkIHNlbnNvcnMsIHRlbiBhbmFsb2cgdm9sdGFnZQotc2Vuc29ycyAob25seSBuaW5lIGZvciB0aGUgNjI3REhHKSwgb25lIFZJRCAoNiBwaW5zIGZvciB0aGUgNjI3RUhGL0VIRywgOCBwaW5zCi1mb3IgdGhlIDYyN0RIRyBhbmQgNjY3SEcpLCBhbGFybXMgd2l0aCBiZWVwIHdhcm5pbmdzIChjb250cm9sIHVuaW1wbGVtZW50ZWQpLAorVGhlIGNoaXBzIGltcGxlbWVudCAyIHRvIDQgdGVtcGVyYXR1cmUgc2Vuc29ycyAoOSBmb3IgTkNUNjc3NUYgYW5kIE5DVDY3NzZGKSwKKzIgdG8gNSBmYW4gcm90YXRpb24gc3BlZWQgc2Vuc29ycywgOCB0byAxMCBhbmFsb2cgdm9sdGFnZSBzZW5zb3JzLCBvbmUgVklECisoZXhjZXB0IGZvciA2MjdVSEcpLCBhbGFybXMgd2l0aCBiZWVwIHdhcm5pbmdzIChjb250cm9sIHVuaW1wbGVtZW50ZWQpLAogYW5kIHNvbWUgYXV0b21hdGljIGZhbiByZWd1bGF0aW9uIHN0cmF0ZWdpZXMgKHBsdXMgbWFudWFsIGZhbiBjb250cm9sIG1vZGUpLgogCiBUaGUgdGVtcGVyYXR1cmUgc2Vuc29yIHNvdXJjZXMgb24gVzgyNjc3SEctQiwgTkNUNjc3NUYsIGFuZCBOQ1Q2Nzc2RiBhcmUKQEAgLTg2LDE3ICs4OSwxNiBAQAogCiB0ZW1wMSAtPiBwd20xCiB0ZW1wMiAtPiBwd20yCi10ZW1wMyAtPiBwd20zCit0ZW1wMyAtPiBwd20zIChub3Qgb24gNjI3VUhHKQogcHJvZyAgLT4gcHdtNCAobm90IG9uIDY2N0hHIGFuZCA2NjdIRy1COyB0aGUgcHJvZ3JhbW1hYmxlIHNldHRpbmcgaXMgbm90CiAJICAgICAgIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyKQogCiAvc3lzIGZpbGVzCiAtLS0tLS0tLS0tCiAKLW5hbWUgLSB0aGlzIGlzIGEgc3RhbmRhcmQgaHdtb24gZGV2aWNlIGVudHJ5LiBGb3IgdGhlIFc4MzYyN0VIRiBhbmQgVzgzNjI3RUhHLAotICAgICAgIGl0IGlzIHNldCB0byAidzgzNjI3ZWhmIiwgZm9yIHRoZSBXODM2MjdESEcgaXQgaXMgc2V0IHRvICJ3ODM2MjdkaGciLAotICAgICAgIGZvciB0aGUgVzgzNjY3SEcgYW5kIFc4MzY2N0hHLUIgaXQgaXMgc2V0IHRvICJ3ODM2NjdoZyIsIGZvciBOQ1Q2Nzc1RiBpdAotICAgICAgIGlzIHNldCB0byAibmN0Njc3NSIsIGFuZCBmb3IgTkNUNjc3NkYgaXQgaXMgc2V0IHRvICJuY3Q2Nzc2Ii4KK25hbWUgLSB0aGlzIGlzIGEgc3RhbmRhcmQgaHdtb24gZGV2aWNlIGVudHJ5LCBpdCBjb250YWlucyB0aGUgbmFtZSBvZgorICAgICAgIHRoZSBkZXZpY2UgKHNlZSB0aGUgcHJlZml4IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzIGF0CisgICAgICAgdGhlIHRvcCBvZiB0aGlzIGZpbGUpCiAKIHB3bVsxLTRdIC0gdGhpcyBmaWxlIHN0b3JlcyBQV00gZHV0eSBjeWNsZSBvciBEQyB2YWx1ZSAoZmFuIHNwZWVkKSBpbiByYW5nZToKIAkgICAwIChzdG9wKSB0byAyNTUgKGZ1bGwpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3c3BpbmxvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9od3NwaW5sb2NrLnR4dAppbmRleCA3ZGNkMWE0Li5hOTAzZWU1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3c3BpbmxvY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaHdzcGlubG9jay50eHQKQEAgLTM5LDIzICszOSwyMCBAQAogICAgICBpbiBjYXNlIGFuIHVudXNlZCBod3NwaW5sb2NrIGlzbid0IGF2YWlsYWJsZS4gVXNlcnMgb2YgdGhpcwogICAgICBBUEkgd2lsbCB1c3VhbGx5IHdhbnQgdG8gY29tbXVuaWNhdGUgdGhlIGxvY2sncyBpZCB0byB0aGUgcmVtb3RlIGNvcmUKICAgICAgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgc3luY2hyb25pemF0aW9uLgotICAgICBDYW4gYmUgY2FsbGVkIGZyb20gYW4gYXRvbWljIGNvbnRleHQgKHRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgc2xlZXApIGJ1dAotICAgICBub3QgZnJvbSB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQuCisgICAgIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MgY29udGV4dCAobWlnaHQgc2xlZXApLgogCiAgIHN0cnVjdCBod3NwaW5sb2NrICpod3NwaW5fbG9ja19yZXF1ZXN0X3NwZWNpZmljKHVuc2lnbmVkIGludCBpZCk7CiAgICAtIGFzc2lnbiBhIHNwZWNpZmljIGh3c3BpbmxvY2sgaWQgYW5kIHJldHVybiBpdHMgYWRkcmVzcywgb3IgTlVMTAogICAgICBpZiB0aGF0IGh3c3BpbmxvY2sgaXMgYWxyZWFkeSBpbiB1c2UuIFVzdWFsbHkgYm9hcmQgY29kZSB3aWxsCiAgICAgIGJlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbiBvcmRlciB0byByZXNlcnZlIHNwZWNpZmljIGh3c3BpbmxvY2sKICAgICAgaWRzIGZvciBwcmVkZWZpbmVkIHB1cnBvc2VzLgotICAgICBDYW4gYmUgY2FsbGVkIGZyb20gYW4gYXRvbWljIGNvbnRleHQgKHRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgc2xlZXApIGJ1dAotICAgICBub3QgZnJvbSB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQuCisgICAgIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MgY29udGV4dCAobWlnaHQgc2xlZXApLgogCiAgIGludCBod3NwaW5fbG9ja19mcmVlKHN0cnVjdCBod3NwaW5sb2NrICpod2xvY2spOwogICAgLSBmcmVlIGEgcHJldmlvdXNseS1hc3NpZ25lZCBod3NwaW5sb2NrOyByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYW4KICAgICAgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvbiBmYWlsdXJlIChlLmcuIC1FSU5WQUwgaWYgdGhlIGh3c3BpbmxvY2sKICAgICAgaXMgYWxyZWFkeSBmcmVlKS4KLSAgICAgQ2FuIGJlIGNhbGxlZCBmcm9tIGFuIGF0b21pYyBjb250ZXh0ICh0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IHNsZWVwKSBidXQKLSAgICAgbm90IGZyb20gd2l0aGluIGludGVycnVwdCBjb250ZXh0LgorICAgICBTaG91bGQgYmUgY2FsbGVkIGZyb20gYSBwcm9jZXNzIGNvbnRleHQgKG1pZ2h0IHNsZWVwKS4KIAogICBpbnQgaHdzcGluX2xvY2tfdGltZW91dChzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrLCB1bnNpZ25lZCBpbnQgdGltZW91dCk7CiAgICAtIGxvY2sgYSBwcmV2aW91c2x5LWFzc2lnbmVkIGh3c3BpbmxvY2sgd2l0aCBhIHRpbWVvdXQgbGltaXQgKHNwZWNpZmllZCBpbgpAQCAtMjMwLDQ1ICsyMjcsNjIgQEAKIAogNC4gQVBJIGZvciBpbXBsZW1lbnRvcnMKIAotICBpbnQgaHdzcGluX2xvY2tfcmVnaXN0ZXIoc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jayk7CisgIGludCBod3NwaW5fbG9ja19yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbmssIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJY29uc3Qgc3RydWN0IGh3c3BpbmxvY2tfb3BzICpvcHMsIGludCBiYXNlX2lkLCBpbnQgbnVtX2xvY2tzKTsKICAgIC0gdG8gYmUgY2FsbGVkIGZyb20gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24sIGluCi0gICAgIG9yZGVyIHRvIHJlZ2lzdGVyIGEgbmV3IGh3c3BpbmxvY2sgaW5zdGFuY2UuIENhbiBiZSBjYWxsZWQgZnJvbSBhbiBhdG9taWMKLSAgICAgY29udGV4dCAodGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBzbGVlcCkgYnV0IG5vdCBmcm9tIHdpdGhpbiBpbnRlcnJ1cHQKLSAgICAgY29udGV4dC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgb3JkZXIgdG8gcmVnaXN0ZXIgYSBuZXcgaHdzcGlubG9jayBkZXZpY2UgKHdoaWNoIGlzIHVzdWFsbHkgYSBiYW5rIG9mCisgICAgIG51bWVyb3VzIGxvY2tzKS4gU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0ICh0aGlzIGZ1bmN0aW9uCisgICAgIG1pZ2h0IHNsZWVwKS4KKyAgICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KIAotICBzdHJ1Y3QgaHdzcGlubG9jayAqaHdzcGluX2xvY2tfdW5yZWdpc3Rlcih1bnNpZ25lZCBpbnQgaWQpOworICBpbnQgaHdzcGluX2xvY2tfdW5yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbmspOwogICAgLSB0byBiZSBjYWxsZWQgZnJvbSB0aGUgdW5kZXJseWluZyB2ZW5kb3Itc3BlY2lmaWMgaW1wbGVtZW50YXRpb24sIGluIG9yZGVyCi0gICAgIHRvIHVucmVnaXN0ZXIgYW4gZXhpc3RpbmcgKGFuZCB1bnVzZWQpIGh3c3BpbmxvY2sgaW5zdGFuY2UuCi0gICAgIENhbiBiZSBjYWxsZWQgZnJvbSBhbiBhdG9taWMgY29udGV4dCAod2lsbCBub3Qgc2xlZXApIGJ1dCBub3QgZnJvbQotICAgICB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQuCisgICAgIHRvIHVucmVnaXN0ZXIgYW4gaHdzcGlubG9jayBkZXZpY2UgKHdoaWNoIGlzIHVzdWFsbHkgYSBiYW5rIG9mIG51bWVyb3VzCisgICAgIGxvY2tzKS4KKyAgICAgU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0ICh0aGlzIGZ1bmN0aW9uIG1pZ2h0IHNsZWVwKS4KICAgICAgUmV0dXJucyB0aGUgYWRkcmVzcyBvZiBod3NwaW5sb2NrIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZXJyb3IgKGUuZy4KICAgICAgaWYgdGhlIGh3c3BpbmxvY2sgaXMgc2lsbCBpbiB1c2UpLgogCi01LiBzdHJ1Y3QgaHdzcGlubG9jaworNS4gSW1wb3J0YW50IHN0cnVjdHMKIAotVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyBhbiBod3NwaW5sb2NrIGluc3RhbmNlLiBJdCBpcyByZWdpc3RlcmVkIGJ5IHRoZQotdW5kZXJseWluZyBod3NwaW5sb2NrIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBod3NwaW5fbG9ja19yZWdpc3RlcigpIEFQSS4KK3N0cnVjdCBod3NwaW5sb2NrX2RldmljZSBpcyBhIGRldmljZSB3aGljaCB1c3VhbGx5IGNvbnRhaW5zIGEgYmFuaworb2YgaGFyZHdhcmUgbG9ja3MuIEl0IGlzIHJlZ2lzdGVyZWQgYnkgdGhlIHVuZGVybHlpbmcgaHdzcGlubG9jaworaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIGh3c3Bpbl9sb2NrX3JlZ2lzdGVyKCkgQVBJLgogCiAvKioKLSAqIHN0cnVjdCBod3NwaW5sb2NrIC0gdmVuZG9yLXNwZWNpZmljIGh3c3BpbmxvY2sgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBAZGV2OiB1bmRlcmx5aW5nIGRldmljZSwgd2lsbCBiZSB1c2VkIHdpdGggcnVudGltZSBQTSBhcGkKLSAqIEBvcHM6IHZlbmRvci1zcGVjaWZpYyBod3NwaW5sb2NrIGhhbmRsZXJzCi0gKiBAaWQ6IGEgZ2xvYmFsLCB1bmlxdWUsIHN5c3RlbS13aWRlLCBpbmRleCBvZiB0aGUgbG9jay4KLSAqIEBsb2NrOiBpbml0aWFsaXplZCBhbmQgdXNlZCBieSBod3NwaW5sb2NrIGNvcmUKLSAqIEBvd25lcjogdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBtb2R1bGUsIHVzZWQgdG8gbWFpbnRhaW4gbW9kdWxlIHJlZiBjb3VudAorICogc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlIC0gYSBkZXZpY2Ugd2hpY2ggdXN1YWxseSBzcGFucyBudW1lcm91cyBod3NwaW5sb2NrcworICogQGRldjogdW5kZXJseWluZyBkZXZpY2UsIHdpbGwgYmUgdXNlZCB0byBpbnZva2UgcnVudGltZSBQTSBhcGkKKyAqIEBvcHM6IHBsYXRmb3JtLXNwZWNpZmljIGh3c3BpbmxvY2sgaGFuZGxlcnMKKyAqIEBiYXNlX2lkOiBpZCBpbmRleCBvZiB0aGUgZmlyc3QgbG9jayBpbiB0aGlzIGRldmljZQorICogQG51bV9sb2NrczogbnVtYmVyIG9mIGxvY2tzIGluIHRoaXMgZGV2aWNlCisgKiBAbG9jazogZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFycmF5IG9mICdzdHJ1Y3QgaHdzcGlubG9jaycKICAqLwotc3RydWN0IGh3c3BpbmxvY2sgeworc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJY29uc3Qgc3RydWN0IGh3c3BpbmxvY2tfb3BzICpvcHM7Ci0JaW50IGlkOwotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlpbnQgYmFzZV9pZDsKKwlpbnQgbnVtX2xvY2tzOworCXN0cnVjdCBod3NwaW5sb2NrIGxvY2tbMF07CiB9OwogCi1UaGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSB0byBhc3NpZ24gdGhlIGRldiwgb3BzLCBpZCBhbmQKLW93bmVyIG1lbWJlcnMuIFRoZSBsb2NrIG1lbWJlciwgT1RPSCwgaXMgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYnkgdGhlIGh3c3BpbmxvY2sKLWNvcmUuCitzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgY29udGFpbnMgYW4gYXJyYXkgb2YgaHdzcGlubG9jayBzdHJ1Y3RzLCBlYWNoCitvZiB3aGljaCByZXByZXNlbnRzIGEgc2luZ2xlIGhhcmR3YXJlIGxvY2s6CisKKy8qKgorICogc3RydWN0IGh3c3BpbmxvY2sgLSB0aGlzIHN0cnVjdCByZXByZXNlbnRzIGEgc2luZ2xlIGh3c3BpbmxvY2sgaW5zdGFuY2UKKyAqIEBiYW5rOiB0aGUgaHdzcGlubG9ja19kZXZpY2Ugc3RydWN0dXJlIHdoaWNoIG93bnMgdGhpcyBsb2NrCisgKiBAbG9jazogaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYnkgaHdzcGlubG9jayBjb3JlCisgKiBAcHJpdjogcHJpdmF0ZSBkYXRhLCBvd25lZCBieSB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybS1zcGVjaWZpYyBod3NwaW5sb2NrIGRydgorICovCitzdHJ1Y3QgaHdzcGlubG9jayB7CisJc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rOworCXNwaW5sb2NrX3QgbG9jazsKKwl2b2lkICpwcml2OworfTsKKworV2hlbiByZWdpc3RlcmluZyBhIGJhbmsgb2YgbG9ja3MsIHRoZSBod3NwaW5sb2NrIGRyaXZlciBvbmx5IG5lZWRzIHRvCitzZXQgdGhlIHByaXYgbWVtYmVycyBvZiB0aGUgbG9ja3MuIFRoZSByZXN0IG9mIHRoZSBtZW1iZXJzIGFyZSBzZXQgYW5kCitpbml0aWFsaXplZCBieSB0aGUgaHdzcGlubG9jayBjb3JlIGl0c2VsZi4KIAogNi4gSW1wbGVtZW50YXRpb24gY2FsbGJhY2tzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL3NtYnVzLXByb3RvY29sIGIvRG9jdW1lbnRhdGlvbi9pMmMvc21idXMtcHJvdG9jb2wKaW5kZXggN2MxOWQxYS4uNDlmNWI2OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvc21idXMtcHJvdG9jb2wKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvc21idXMtcHJvdG9jb2wKQEAgLTg4LDYgKzg4LDEwIEBACiAKIFMgQWRkciBXciBbQV0gQ29tbSBbQV0gUyBBZGRyIFJkIFtBXSBbRGF0YUxvd10gQSBbRGF0YUhpZ2hdIE5BIFAKIAorTm90ZSB0aGUgY29udmVuaWVuY2UgZnVuY3Rpb24gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkIGlzCithdmFpbGFibGUgZm9yIHJlYWRzIHdoZXJlIHRoZSB0d28gZGF0YSBieXRlcyBhcmUgdGhlIG90aGVyIHdheQorYXJvdW5kIChub3QgU01CdXMgY29tcGxpYW50LCBidXQgdmVyeSBwb3B1bGFyLikKKwogCiBTTUJ1cyBXcml0ZSBCeXRlOiAgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSgpCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMDgsNiArMTEyLDEwIEBACiAKIFMgQWRkciBXciBbQV0gQ29tbSBbQV0gRGF0YUxvdyBbQV0gRGF0YUhpZ2ggW0FdIFAKIAorTm90ZSB0aGUgY29udmVuaWVuY2UgZnVuY3Rpb24gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZCBpcworYXZhaWxhYmxlIGZvciB3cml0ZXMgd2hlcmUgdGhlIHR3byBkYXRhIGJ5dGVzIGFyZSB0aGUgb3RoZXIgd2F5Cithcm91bmQgKG5vdCBTTUJ1cyBjb21wbGlhbnQsIGJ1dCB2ZXJ5IHBvcHVsYXIuKQorCiAKIFNNQnVzIFByb2Nlc3MgQ2FsbDogIGkyY19zbWJ1c19wcm9jZXNzX2NhbGwoKQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L2VsYW50ZWNoLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQvZWxhbnRlY2gudHh0CmluZGV4IGRiNzk4YWYuLjU2MDJlYjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5wdXQvZWxhbnRlY2gudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQvZWxhbnRlY2gudHh0CkBAIC0xNiwxNSArMTYsMjggQEAKIAogIDEuIEludHJvZHVjdGlvbgogIDIuIEV4dHJhIGtub2JzCi0gMy4gSGFyZHdhcmUgdmVyc2lvbiAxCi0gICAgMy4xIFJlZ2lzdGVycwotICAgIDMuMiBOYXRpdmUgcmVsYXRpdmUgbW9kZSA0IGJ5dGUgcGFja2V0IGZvcm1hdAotICAgIDMuMyBOYXRpdmUgYWJzb2x1dGUgbW9kZSA0IGJ5dGUgcGFja2V0IGZvcm1hdAotIDQuIEhhcmR3YXJlIHZlcnNpb24gMgorIDMuIERpZmZlcmVudGlhdGluZyBoYXJkd2FyZSB2ZXJzaW9ucworIDQuIEhhcmR3YXJlIHZlcnNpb24gMQogICAgIDQuMSBSZWdpc3RlcnMKLSAgICA0LjIgTmF0aXZlIGFic29sdXRlIG1vZGUgNiBieXRlIHBhY2tldCBmb3JtYXQKLSAgICAgICAgNC4yLjEgT25lIGZpbmdlciB0b3VjaAotICAgICAgICA0LjIuMiBUd28gZmluZ2VyIHRvdWNoCisgICAgNC4yIE5hdGl2ZSByZWxhdGl2ZSBtb2RlIDQgYnl0ZSBwYWNrZXQgZm9ybWF0CisgICAgNC4zIE5hdGl2ZSBhYnNvbHV0ZSBtb2RlIDQgYnl0ZSBwYWNrZXQgZm9ybWF0CisgNS4gSGFyZHdhcmUgdmVyc2lvbiAyCisgICAgNS4xIFJlZ2lzdGVycworICAgIDUuMiBOYXRpdmUgYWJzb2x1dGUgbW9kZSA2IGJ5dGUgcGFja2V0IGZvcm1hdAorICAgICAgICA1LjIuMSBQYXJpdHkgY2hlY2tpbmcgYW5kIHBhY2tldCByZS1zeW5jaHJvbml6YXRpb24KKyAgICAgICAgNS4yLjIgT25lL1RocmVlIGZpbmdlciB0b3VjaAorICAgICAgICA1LjIuMyBUd28gZmluZ2VyIHRvdWNoCisgNi4gSGFyZHdhcmUgdmVyc2lvbiAzCisgICAgNi4xIFJlZ2lzdGVycworICAgIDYuMiBOYXRpdmUgYWJzb2x1dGUgbW9kZSA2IGJ5dGUgcGFja2V0IGZvcm1hdAorICAgICAgICA2LjIuMSBPbmUvVGhyZWUgZmluZ2VyIHRvdWNoCisgICAgICAgIDYuMi4yIFR3byBmaW5nZXIgdG91Y2gKKyA3LiBIYXJkd2FyZSB2ZXJzaW9uIDQKKyAgICA3LjEgUmVnaXN0ZXJzCisgICAgNy4yIE5hdGl2ZSBhYnNvbHV0ZSBtb2RlIDYgYnl0ZSBwYWNrZXQgZm9ybWF0CisgICAgICAgIDcuMi4xIFN0YXR1cyBwYWNrZXQKKyAgICAgICAgNy4yLjIgSGVhZCBwYWNrZXQKKyAgICAgICAgNy4yLjMgTW90aW9uIHBhY2tldAogCiAKIApAQCAtMzc1LDcgKzM4OCw3IEBACiAKIEluIGNhc2UgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQsIGFsbCB0aGUgcGFja2V0cyBhcmUgc2hpZnRlZCBieSBvbmUgKGFuZCBwYWNrZXRbMF0gaXMgZGlzY2FyZGVkKS4KIAotNS4yLjEgT25lL1RocmVlIGZpbmdlciB0b3VjaAorNS4yLjIgT25lL1RocmVlIGZpbmdlciB0b3VjaAogICAgICAgfn5+fn5+fn5+fn5+fn5+fgogCiBieXRlIDA6CkBAIC0zODQsMTkgKzM5NywxOSBAQAogCSBuMSAgbjAgIHczICB3MiAgIC4gICAuICAgUiAgIEwKIAogICAgICAgICAgTCwgUiA9IDEgd2hlbiBMZWZ0LCBSaWdodCBtb3VzZSBidXR0b24gcHJlc3NlZAotICAgICAgICAgbjEuLm4wID0gbnVtYmVycyBvZiBmaW5nZXJzIG9uIHRvdWNocGFkCisgICAgICAgICBuMS4ubjAgPSBudW1iZXIgb2YgZmluZ2VycyBvbiB0b3VjaHBhZAogCiBieXRlIDE6CiAKICAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCi0JIHA3ICBwNiAgcDUgIHA0ICAuICB4MTAgeDkgIHg4CisJIHA3ICBwNiAgcDUgIHA0IHgxMSB4MTAgeDkgIHg4CiAKIGJ5dGUgMjoKIAogICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKIAkgeDcgIHg2ICB4NSAgeDQgIHgzICB4MiAgeDEgIHgwCiAKLSAgICAgICAgIHgxMC4ueDAgPSBhYnNvbHV0ZSB4IHZhbHVlIChob3Jpem9udGFsKQorICAgICAgICAgeDExLi54MCA9IGFic29sdXRlIHggdmFsdWUgKGhvcml6b250YWwpCiAKIGJ5dGUgMzoKIApAQCAtNDIwLDcgKzQzMyw3IEBACiBieXRlIDQ6CiAKICAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCi0gICAgICAgIHAzICBwMSAgcDIgIHAwICAgLiAgIC4gIHk5ICB5OAorICAgICAgICBwMyAgcDEgIHAyICBwMCAgeTExIHkxMCB5OSAgeTgKIAogCSBwNy4ucDAgPSBwcmVzc3VyZSAobm90IEVGMTEzKQogCkBAIC00MjksMTAgKzQ0MiwxMCBAQAogICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKICAgICAgICAgeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCiAKLSAgICAgICAgIHk5Li55MCA9IGFic29sdXRlIHkgdmFsdWUgKHZlcnRpY2FsKQorICAgICAgICAgeTExLi55MCA9IGFic29sdXRlIHkgdmFsdWUgKHZlcnRpY2FsKQogCiAKLTQuMi4yIFR3byBmaW5nZXIgdG91Y2gKKzUuMi4zIFR3byBmaW5nZXIgdG91Y2gKICAgICAgIH5+fn5+fn5+fn5+fn5+fn4KIAogTm90ZSB0aGF0IHRoZSB0d28gcGFpcnMgb2YgY29vcmRpbmF0ZXMgYXJlIG5vdCBleGFjdGx5IHRoZSBjb29yZGluYXRlcyBvZiB0aGUKQEAgLTQ0Niw3ICs0NTksNyBAQAogICAgICAgICBuMSAgbjAgIGF5OCBheDggIC4gICAuICAgUiAgIEwKIAogICAgICAgICAgTCwgUiA9IDEgd2hlbiBMZWZ0LCBSaWdodCBtb3VzZSBidXR0b24gcHJlc3NlZAotICAgICAgICAgbjEuLm4wID0gbnVtYmVycyBvZiBmaW5nZXJzIG9uIHRvdWNocGFkCisgICAgICAgICBuMS4ubjAgPSBudW1iZXIgb2YgZmluZ2VycyBvbiB0b3VjaHBhZAogCiBieXRlIDE6CiAKQEAgLTQ4MCwzICs0OTMsMjUzIEBACiAgICAgICAgIGJ5NyBieTggYnk1IGJ5NCBieTMgYnkyIGJ5MSBieTAKIAogICAgICAgICAgYnk4Li5ieTAgPSB1cHBlci1yaWdodCBmaW5nZXIgYWJzb2x1dGUgeSB2YWx1ZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCis2LiBIYXJkd2FyZSB2ZXJzaW9uIDMKKyAgID09PT09PT09PT09PT09PT09PQorCis2LjEgUmVnaXN0ZXJzCisgICAgfn5+fn5+fn5+CisqIHJlZ18xMAorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICAgMCAgIDAgICAwICAgMCAgIDAgICAwICAgMCAgIEEKKworICAgICAgICAgQTogMSA9IGVuYWJsZSBhYnNvbHV0ZSB0cmFja2luZworCis2LjIgTmF0aXZlIGFic29sdXRlIG1vZGUgNiBieXRlIHBhY2tldCBmb3JtYXQKKyAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorMSBhbmQgMyBmaW5nZXIgdG91Y2ggc2hhcmVzIHRoZSBzYW1lIDYtYnl0ZSBwYWNrZXQgZm9ybWF0LCBleGNlcHQgdGhhdAorMyBmaW5nZXIgdG91Y2ggb25seSByZXBvcnRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIGFsbCB0aHJlZSBmaW5nZXJzLgorCitGaXJtd2FyZSB3b3VsZCBzZW5kIDEyIGJ5dGVzIG9mIGRhdGEgZm9yIDIgZmluZ2VyIHRvdWNoLgorCitOb3RlIG9uIGRlYm91bmNlOgorSW4gY2FzZSB0aGUgYm94IGhhcyB1bnN0YWJsZSBwb3dlciBzdXBwbHkgb3Igb3RoZXIgZWxlY3RyaWNpdHkgaXNzdWVzLCBvcgord2hlbiBudW1iZXIgb2YgZmluZ2VyIGNoYW5nZXMsIEYvVyB3b3VsZCBzZW5kICJkZWJvdW5jZSBwYWNrZXQiIHRvIGluZm9ybQorZHJpdmVyIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGluIGRlYm91bmNlIHN0YXR1cy4KK1RoZSBkZWJvdWNlIHBhY2tldCBoYXMgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CisgICAgYnl0ZSAwOiAweGM0CisgICAgYnl0ZSAxOiAweGZmCisgICAgYnl0ZSAyOiAweGZmCisgICAgYnl0ZSAzOiAweDAyCisgICAgYnl0ZSA0OiAweGZmCisgICAgYnl0ZSA1OiAweGZmCitXaGVuIHdlIGVuY291bnRlciB0aGlzIGtpbmQgb2YgcGFja2V0LCB3ZSBqdXN0IGlnbm9yZSBpdC4KKworNi4yLjEgT25lL1RocmVlIGZpbmdlciB0b3VjaAorICAgICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitieXRlIDA6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIG4xICBuMCAgdzMgIHcyICAgMCAgIDEgICBSICAgTAorCisgICAgICAgIEwsIFIgPSAxIHdoZW4gTGVmdCwgUmlnaHQgbW91c2UgYnV0dG9uIHByZXNzZWQKKyAgICAgICAgbjEuLm4wID0gbnVtYmVyIG9mIGZpbmdlcnMgb24gdG91Y2hwYWQKKworYnl0ZSAxOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICBwNyAgcDYgIHA1ICBwNCB4MTEgeDEwICB4OSAgeDgKKworYnl0ZSAyOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICB4NyAgeDYgIHg1ICB4NCAgeDMgIHgyICB4MSAgeDAKKworICAgICAgICB4MTEuLngwID0gYWJzb2x1dGUgeCB2YWx1ZSAoaG9yaXpvbnRhbCkKKworYnl0ZSAzOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICAgMCAgIDAgIHcxICB3MCAgIDAgICAwICAgMSAgIDAKKworICAgICAgICAgdzMuLncwID0gd2lkdGggb2YgdGhlIGZpbmdlciB0b3VjaAorCitieXRlIDQ6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIHAzICBwMSAgcDIgIHAwICB5MTEgeTEwIHk5ICB5OAorCisgICAgICAgIHA3Li5wMCA9IHByZXNzdXJlCisKK2J5dGUgNToKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCisKKyAgICAgICAgeTExLi55MCA9IGFic29sdXRlIHkgdmFsdWUgKHZlcnRpY2FsKQorCis2LjIuMiBUd28gZmluZ2VyIHRvdWNoCisgICAgICB+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBwYWNrZXQgZm9ybWF0IGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9yIHR3byBmaW5nZXIgdG91Y2gsIGV4Y2VwdCB0aGUgaGFyZHdhcmUKK3NlbmRzIHR3byA2IGJ5dGUgcGFja2V0cy4gVGhlIGZpcnN0IHBhY2tldCBjb250YWlucyBkYXRhIGZvciB0aGUgZmlyc3QgZmluZ2VyLAordGhlIHNlY29uZCBwYWNrZXQgaGFzIGRhdGEgZm9yIHRoZSBzZWNvbmQgZmluZ2VyLiBTbyBmb3IgdHdvIGZpbmdlciB0b3VjaCBhCit0b3RhbCBvZiAxMiBieXRlcyBhcmUgc2VudC4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworNy4gSGFyZHdhcmUgdmVyc2lvbiA0CisgICA9PT09PT09PT09PT09PT09PT0KKworNy4xIFJlZ2lzdGVycworICAgIH5+fn5+fn5+fgorKiByZWdfMDcKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgIDAgICAwICAgMCAgIDAgICAwICAgMCAgIDAgICBBCisKKyAgICAgICAgIEE6IDEgPSBlbmFibGUgYWJzb2x1dGUgdHJhY2tpbmcKKworNy4yIE5hdGl2ZSBhYnNvbHV0ZSBtb2RlIDYgYnl0ZSBwYWNrZXQgZm9ybWF0CisgICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3Y0IGhhcmR3YXJlIGlzIGEgdHJ1ZSBtdWx0aXRvdWNoIHRvdWNocGFkLCBjYXBhYmxlIG9mIHRyYWNraW5nIHVwIHRvIDUgZmluZ2Vycy4KK1VuZm9ydHVuYXRlbHksIGR1ZSB0byBQUy8yJ3MgbGltaXRlZCBiYW5kd2lkdGgsIGl0cyBwYWNrZXQgZm9ybWF0IGlzIHJhdGhlcgorY29tcGxleC4KKworV2hlbmV2ZXIgdGhlIG51bWJlcnMgb3IgaWRlbnRpdGllcyBvZiB0aGUgZmluZ2VycyBjaGFuZ2VzLCB0aGUgaGFyZHdhcmUgc2VuZHMgYQorc3RhdHVzIHBhY2tldCB0byBpbmRpY2F0ZSBob3cgbWFueSBhbmQgd2hpY2ggZmluZ2VycyBpcyBvbiB0b3VjaHBhZCwgZm9sbG93ZWQgYnkKK2hlYWQgcGFja2V0cyBvciBtb3Rpb24gcGFja2V0cy4gQSBoZWFkIHBhY2tldCBjb250YWlucyBkYXRhIG9mIGZpbmdlciBpZCwgZmluZ2VyCitwb3NpdGlvbiAoYWJzb2x1dGUgeCwgeSB2YWx1ZXMpLCB3aWR0aCwgYW5kIHByZXNzdXJlLiBBIG1vdGlvbiBwYWNrZXQgY29udGFpbnMKK3R3byBmaW5nZXJzJyBwb3NpdGlvbiBkZWx0YS4KKworRm9yIGV4YW1wbGUsIHdoZW4gc3RhdHVzIHBhY2tldCB0ZWxscyB0aGVyZSBhcmUgMiBmaW5nZXJzIG9uIHRvdWNocGFkLCB0aGVuIHdlCitjYW4gZXhwZWN0IHR3byBmb2xsb3dpbmcgaGVhZCBwYWNrZXRzLiBJZiB0aGUgZmluZ2VyIHN0YXR1cyBkb2Vzbid0IGNoYW5nZSwKK3RoZSBmb2xsb3dpbmcgcGFja2V0cyB3b3VsZCBiZSBtb3Rpb24gcGFja2V0cywgb25seSBzZW5kaW5nIGRlbHRhIG9mIGZpbmdlcgorcG9zaXRpb24sIHVudGlsIHdlIHJlY2VpdmUgYSBzdGF0dXMgcGFja2V0LgorCitPbmUgZXhjZXB0aW9uIGlzIG9uZSBmaW5nZXIgdG91Y2guIHdoZW4gYSBzdGF0dXMgcGFja2V0IHRlbGxzIHVzIHRoZXJlIGlzIG9ubHkKK29uZSBmaW5nZXIsIHRoZSBoYXJkd2FyZSB3b3VsZCBqdXN0IHNlbmQgaGVhZCBwYWNrZXRzIGFmdGVyd2FyZHMuCisKKzcuMi4xIFN0YXR1cyBwYWNrZXQKKyAgICAgIH5+fn5+fn5+fn5+fn4KKworYnl0ZSAwOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICAgLiAgIC4gICAuICAgLiAgIDAgICAxICAgUiAgIEwKKworICAgICAgICAgTCwgUiA9IDEgd2hlbiBMZWZ0LCBSaWdodCBtb3VzZSBidXR0b24gcHJlc3NlZAorCitieXRlIDE6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgICAuICAgLiAgIC4gZnQ0IGZ0MyBmdDIgZnQxIGZ0MAorCisgICAgICAgICBmdDQgZnQzIGZ0MiBmdDEgZnQwIGZ0biA9IDEgd2hlbiBmaW5nZXIgbiBpcyBvbiB0b3VjaHBhZAorCitieXRlIDI6IG5vdCB1c2VkCisKK2J5dGUgMzoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgIC4gICAuICAgLiAgIDEgICAwICAgMCAgIDAgICAwCisKKyAgICAgICAgIGNvbnN0YW50IGJpdHMKKworYnl0ZSA0OgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICAgcCAgIC4gICAuICAgLiAgIC4gICAuICAgLiAgIC4KKworICAgICAgICAgcCA9IDEgZm9yIHBhbG0KKworYnl0ZSA1OiBub3QgdXNlZAorCis3LjIuMiBIZWFkIHBhY2tldAorICAgICAgfn5+fn5+fn5+fn4KKworYnl0ZSAwOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICB3MyAgdzIgIHcxICB3MCAgIDAgICAxICAgUiAgIEwKKworICAgICAgICBMLCBSID0gMSB3aGVuIExlZnQsIFJpZ2h0IG1vdXNlIGJ1dHRvbiBwcmVzc2VkCisgICAgICAgIHczLi53MCA9IGZpbmdlciB3aWR0aCAoc3BhbnMgaG93IG1hbnkgdHJhY2UgbGluZXMpCisKK2J5dGUgMToKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgcDcgIHA2ICBwNSAgcDQgeDExIHgxMCAgeDkgIHg4CisKK2J5dGUgMjoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgeDcgIHg2ICB4NSAgeDQgIHgzICB4MiAgeDEgIHgwCisKKyAgICAgICAgeDExLi54MCA9IGFic29sdXRlIHggdmFsdWUgKGhvcml6b250YWwpCisKK2J5dGUgMzoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICBpZDIgaWQxIGlkMCAgIDEgICAwICAgMCAgIDAgICAxCisKKyAgICAgICBpZDIuLmlkMCA9IGZpbmdlciBpZAorCitieXRlIDQ6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIHAzICBwMSAgcDIgIHAwICB5MTEgeTEwIHk5ICB5OAorCisgICAgICAgIHA3Li5wMCA9IHByZXNzdXJlCisKK2J5dGUgNToKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCisKKyAgICAgICAgeTExLi55MCA9IGFic29sdXRlIHkgdmFsdWUgKHZlcnRpY2FsKQorCis3LjIuMyBNb3Rpb24gcGFja2V0CisgICAgICB+fn5+fn5+fn5+fn5+CisKK2J5dGUgMDoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICBpZDIgaWQxIGlkMCAgIHcgICAwICAgMSAgIFIgICBMCisKKyAgICAgICBMLCBSID0gMSB3aGVuIExlZnQsIFJpZ2h0IG1vdXNlIGJ1dHRvbiBwcmVzc2VkCisgICAgICAgaWQyLi5pZDAgPSBmaW5nZXIgaWQKKyAgICAgICB3ID0gMSB3aGVuIGRlbHRhIG92ZXJmbG93cyAoPiAxMjcgb3IgPCAtMTI4KSwgaW4gdGhpcyBjYXNlCisgICAgICAgZmlybXdhcmUgc2VuZHMgdXMgKGRlbHRhIHggLyA1KSBhbmQgKGRlbHRhIHkgIC8gNSkKKworYnl0ZSAxOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICB4NyAgeDYgIHg1ICB4NCAgeDMgIHgyICB4MSAgeDAKKworICAgICAgICB4Ny4ueDAgPSBkZWx0YSB4ICh0d28ncyBjb21wbGVtZW50KQorCitieXRlIDI6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIHk3ICB5NiAgeTUgIHk0ICB5MyAgeTIgIHkxICB5MAorCisgICAgICAgIHk3Li55MCA9IGRlbHRhIHkgKHR3bydzIGNvbXBsZW1lbnQpCisKK2J5dGUgMzoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICBpZDIgaWQxIGlkMCAgIDEgICAwICAgMCAgIDEgICAwCisKKyAgICAgICBpZDIuLmlkMCA9IGZpbmdlciBpZAorCitieXRlIDQ6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIHg3ICB4NiAgeDUgIHg0ICB4MyAgeDIgIHgxICB4MAorCisgICAgICAgIHg3Li54MCA9IGRlbHRhIHggKHR3bydzIGNvbXBsZW1lbnQpCisKK2J5dGUgNToKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCisKKyAgICAgICAgeTcuLnkwID0gZGVsdGEgeSAodHdvJ3MgY29tcGxlbWVudCkKKworICAgICAgICBieXRlIDAgfiAyIGZvciBvbmUgZmluZ2VyCisgICAgICAgIGJ5dGUgMyB+IDUgZm9yIGFub3RoZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5wdXQvbXVsdGktdG91Y2gtcHJvdG9jb2wudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9tdWx0aS10b3VjaC1wcm90b2NvbC50eHQKaW5kZXggNzE1MzZlNy4uNTQzMTAxYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9tdWx0aS10b3VjaC1wcm90b2NvbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9tdWx0aS10b3VjaC1wcm90b2NvbC50eHQKQEAgLTY1LDYgKzY1LDIwIEBACiBlbmQuICBVcG9uIHJlY2VpdmluZyBhbiBNVCBldmVudCwgb25lIHNpbXBseSB1cGRhdGVzIHRoZSBhcHByb3ByaWF0ZQogYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IHNsb3QuCiAKK1NvbWUgZGV2aWNlcyBpZGVudGlmeSBhbmQvb3IgdHJhY2sgbW9yZSBjb250YWN0cyB0aGFuIHRoZXkgY2FuIHJlcG9ydCB0byB0aGUKK2RyaXZlci4gIEEgZHJpdmVyIGZvciBzdWNoIGEgZGV2aWNlIHNob3VsZCBhc3NvY2lhdGUgb25lIHR5cGUgQiBzbG90IHdpdGggZWFjaAorY29udGFjdCB0aGF0IGlzIHJlcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4gIFdoZW5ldmVyIHRoZSBpZGVudGl0eSBvZiB0aGUKK2NvbnRhY3QgYXNzb2NpYXRlZCB3aXRoIGEgc2xvdCBjaGFuZ2VzLCB0aGUgZHJpdmVyIHNob3VsZCBpbnZhbGlkYXRlIHRoYXQKK3Nsb3QgYnkgY2hhbmdpbmcgaXRzIEFCU19NVF9UUkFDS0lOR19JRC4gIElmIHRoZSBoYXJkd2FyZSBzaWduYWxzIHRoYXQgaXQgaXMKK3RyYWNraW5nIG1vcmUgY29udGFjdHMgdGhhbiBpdCBpcyBjdXJyZW50bHkgcmVwb3J0aW5nLCB0aGUgZHJpdmVyIHNob3VsZCB1c2UKK2EgQlROX1RPT0xfKlRBUCBldmVudCB0byBpbmZvcm0gdXNlcnNwYWNlIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgY29udGFjdHMKK2JlaW5nIHRyYWNrZWQgYnkgdGhlIGhhcmR3YXJlIGF0IHRoYXQgbW9tZW50LiAgVGhlIGRyaXZlciBzaG91bGQgZG8gdGhpcyBieQorZXhwbGljaXRseSBzZW5kaW5nIHRoZSBjb3JyZXNwb25kaW5nIEJUTl9UT09MXypUQVAgZXZlbnQgYW5kIHNldHRpbmcKK3VzZV9jb3VudCB0byBmYWxzZSB3aGVuIGNhbGxpbmcgaW5wdXRfbXRfcmVwb3J0X3BvaW50ZXJfZW11bGF0aW9uKCkuCitUaGUgZHJpdmVyIHNob3VsZCBvbmx5IGFkdmVydGlzZSBhcyBtYW55IHNsb3RzIGFzIHRoZSBoYXJkd2FyZSBjYW4gcmVwb3J0LgorVXNlcnNwYWNlIGNhbiBkZXRlY3QgdGhhdCBhIGRyaXZlciBjYW4gcmVwb3J0IG1vcmUgdG90YWwgY29udGFjdHMgdGhhbiBzbG90cworYnkgbm90aW5nIHRoYXQgdGhlIGxhcmdlc3Qgc3VwcG9ydGVkIEJUTl9UT09MXypUQVAgZXZlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlCit0b3RhbCBudW1iZXIgb2YgdHlwZSBCIHNsb3RzIHJlcG9ydGVkIGluIHRoZSBhYnNpbmZvIGZvciB0aGUgQUJTX01UX1NMT1QgYXhpcy4KIAogUHJvdG9jb2wgRXhhbXBsZSBBCiAtLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggYThiYTExOS4uYTBjNWM1ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTMwNyw2ICszMDcsMTkgQEAKIAkJCWJlaGF2aW91ciB0byBiZSBzcGVjaWZpZWQuICBCaXQgMCBlbmFibGVzIHdhcm5pbmdzLAogCQkJYml0IDEgZW5hYmxlcyBmaXh1cHMsIGFuZCBiaXQgMiBzZW5kcyBhIHNlZ2ZhdWx0LgogCisJYWxpZ25fdmFfYWRkcj0JW1g4Ni02NF0KKwkJCUFsaWduIHZpcnR1YWwgYWRkcmVzc2VzIGJ5IGNsZWFyaW5nIHNsaWNlIFsxNDoxMl0gd2hlbgorCQkJYWxsb2NhdGluZyBhIFZNQSBhdCBwcm9jZXNzIGNyZWF0aW9uIHRpbWUuIFRoaXMgb3B0aW9uCisJCQlnaXZlcyB5b3UgdXAgdG8gMyUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb24gQU1EIEYxNWgKKwkJCW1hY2hpbmVzICh3aGVyZSBpdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQpIGZvciBhCisJCQlDUFUtaW50ZW5zaXZlIHN0eWxlIGJlbmNobWFyaywgYW5kIGl0IGNhbiB2YXJ5IGhpZ2hseSBpbgorCQkJYSBtaWNyb2JlbmNobWFyayBkZXBlbmRpbmcgb24gd29ya2xvYWQgYW5kIGNvbXBpbGVyLgorCisJCQkxOiBvbmx5IGZvciAzMi1iaXQgcHJvY2Vzc2VzCisJCQkyOiBvbmx5IGZvciA2NC1iaXQgcHJvY2Vzc2VzCisJCQlvbjogZW5hYmxlIGZvciBib3RoIDMyLSBhbmQgNjQtYml0IHByb2Nlc3NlcworCQkJb2ZmOiBkaXNhYmxlIGZvciBib3RoIDMyLSBhbmQgNjQtYml0IHByb2Nlc3NlcworCiAJYW1kX2lvbW11PQlbSFcsWDg2LTg0XQogCQkJUGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSBBTUQgSU9NTVUgZHJpdmVyIGluIHRoZSBzeXN0ZW0uCiAJCQlQb3NzaWJsZSB2YWx1ZXMgYXJlOgpAQCAtNzI4LDEwICs3NDEsMTAgQEAKIAkJCVNlZSBEb2N1bWVudGF0aW9uL2Jsb2NrL2NmcS1pb3NjaGVkLnR4dCBhbmQKIAkJCURvY3VtZW50YXRpb24vYmxvY2svZGVhZGxpbmUtaW9zY2hlZC50eHQgZm9yIGRldGFpbHMuCiAKLQllbGZjb3JlaGRyPQlbSUEtNjQsUFBDLFNILFg4Nl0KKwllbGZjb3JlaGRyPVtzaXplW0tNR11AXW9mZnNldFtLTUddIFtJQTY0LFBQQyxTSCxYODYsUzM5MF0KIAkJCVNwZWNpZmllcyBwaHlzaWNhbCBhZGRyZXNzIG9mIHN0YXJ0IG9mIGtlcm5lbCBjb3JlCi0JCQlpbWFnZSBlbGYgaGVhZGVyLiBHZW5lcmFsbHkga2V4ZWMgbG9hZGVyIHdpbGwKLQkJCXBhc3MgdGhpcyBvcHRpb24gdG8gY2FwdHVyZSBrZXJuZWwuCisJCQlpbWFnZSBlbGYgaGVhZGVyIGFuZCBvcHRpb25hbGx5IHRoZSBzaXplLiBHZW5lcmFsbHkKKwkJCWtleGVjIGxvYWRlciB3aWxsIHBhc3MgdGhpcyBvcHRpb24gdG8gY2FwdHVyZSBrZXJuZWwuCiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQgZm9yIGRldGFpbHMuCiAKIAllbmFibGVfbXRycl9jbGVhbnVwIFtYODZdCkBAIC05NjAsNiArOTczLDkgQEAKIAlpZ25vcmVfbG9nbGV2ZWwJW0tOTF0KIAkJCUlnbm9yZSBsb2dsZXZlbCBzZXR0aW5nIC0gdGhpcyB3aWxsIHByaW50IC9hbGwvCiAJCQlrZXJuZWwgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLgorCQkJV2UgYWxzbyBhZGQgaXQgYXMgcHJpbnRrIG1vZHVsZSBwYXJhbWV0ZXIsIHNvIHVzZXJzCisJCQljb3VsZCBjaGFuZ2UgaXQgZHluYW1pY2FsbHksIHVzdWFsbHkgYnkKKwkJCS9zeXMvbW9kdWxlL3ByaW50ay9wYXJhbWV0ZXJzL2lnbm9yZV9sb2dsZXZlbC4KIAogCWloYXNoX2VudHJpZXM9CVtLTkxdCiAJCQlTZXQgbnVtYmVyIG9mIGhhc2ggYnVja2V0cyBmb3IgaW5vZGUgY2FjaGUuCkBAIC0xMTg4LDYgKzEyMDQsMTAgQEAKIAkJCVtLVk0sSW50ZWxdIERpc2FibGUgRmxleFByaW9yaXR5IGZlYXR1cmUgKFRQUiBzaGFkb3cpLgogCQkJRGVmYXVsdCBpcyAxIChlbmFibGVkKQogCisJa3ZtLWludGVsLm5lc3RlZD0KKwkJCVtLVk0sSW50ZWxdIEVuYWJsZSBWTVggbmVzdGluZyAoblZNWCkuCisJCQlEZWZhdWx0IGlzIDAgKGRpc2FibGVkKQorCiAJa3ZtLWludGVsLnVucmVzdHJpY3RlZF9ndWVzdD0KIAkJCVtLVk0sSW50ZWxdIERpc2FibGUgdW5yZXN0cmljdGVkIGd1ZXN0IGZlYXR1cmUKIAkJCSh2aXJ0dWFsaXplZCByZWFsIGFuZCB1bnBhZ2VkIG1vZGUpIG9uIGNhcGFibGUKQEAgLTE2NDksNiArMTY2OSwxMSBAQAogCQkJZGVidWdnaW5nIGRyaXZlciBzdXNwZW5kL3Jlc3VtZSBob29rcykuICBUaGlzIG1heQogCQkJbm90IHdvcmsgcmVsaWFibHkgd2l0aCBhbGwgY29uc29sZXMsIGJ1dCBpcyBrbm93bgogCQkJdG8gd29yayB3aXRoIHNlcmlhbCBhbmQgVkdBIGNvbnNvbGVzLgorCQkJVG8gZmFjaWxpdGF0ZSBtb3JlIGZsZXhpYmxlIGRlYnVnZ2luZywgd2UgYWxzbyBhZGQKKwkJCWNvbnNvbGVfc3VzcGVuZCwgYSBwcmludGsgbW9kdWxlIHBhcmFtZXRlciB0byBjb250cm9sCisJCQlpdC4gVXNlcnMgY291bGQgdXNlIGNvbnNvbGVfc3VzcGVuZCAodXN1YWxseQorCQkJL3N5cy9tb2R1bGUvcHJpbnRrL3BhcmFtZXRlcnMvY29uc29sZV9zdXNwZW5kKSB0bworCQkJdHVybiBvbi9vZmYgaXQgZHluYW1pY2FsbHkuCiAKIAlub2FsaWVuY2FjaGUJW01NLCBOVU1BLCBTTEFCXSBEaXNhYmxlcyB0aGUgYWxsb2NhdGlvbiBvZiBhbGllbgogCQkJY2FjaGVzIGluIHRoZSBzbGFiIGFsbG9jYXRvci4gIFNhdmVzIHBlci1ub2RlIG1lbW9yeSwKQEAgLTE3ODQsNiArMTgwOSwxMSBAQAogCiAJbm9yZXNpZHVhbAlbUFBDXSBEb24ndCB1c2UgcmVzaWR1YWwgZGF0YSBvbiBQUmVQIG1hY2hpbmVzLgogCisJbm9yZHJhbmQJW1g4Nl0gRGlzYWJsZSB0aGUgZGlyZWN0IHVzZSBvZiB0aGUgUkRSQU5ECisJCQlpbnN0cnVjdGlvbiBldmVuIGlmIGl0IGlzIHN1cHBvcnRlZCBieSB0aGUKKwkJCXByb2Nlc3Nvci4gIFJEUkFORCBpcyBzdGlsbCBhdmFpbGFibGUgdG8gdXNlcgorCQkJc3BhY2UgYXBwbGljYXRpb25zLgorCiAJbm9yZXN1bWUJW1NXU1VTUF0gRGlzYWJsZXMgcmVzdW1lIGFuZCByZXN0b3JlcyBvcmlnaW5hbCBzd2FwCiAJCQlzcGFjZS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CmluZGV4IDNmZjBkYWQuLjlkNjY2ODIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQKQEAgLTQxMSw5ICs0MTEsOSBAQAogCiAweDEwMDQJMHgwMwlGTitGNAkJU2xlZXAgYnV0dG9uIChBQ1BJIHNsZWVwIGJ1dHRvbgogCQkJCXNlbWFudGljcywgaS5lLiBzbGVlcC10by1SQU0pLgotCQkJCUl0IGlzIGFsd2F5cyBnZW5lcmF0ZSBzb21lIGtpbmQKKwkJCQlJdCBhbHdheXMgZ2VuZXJhdGVzIHNvbWUga2luZAogCQkJCW9mIGV2ZW50LCBlaXRoZXIgdGhlIGhvdCBrZXkKLQkJCQlldmVudCBvciBhIEFDUEkgc2xlZXAgYnV0dG9uCisJCQkJZXZlbnQgb3IgYW4gQUNQSSBzbGVlcCBidXR0b24KIAkJCQlldmVudC4gVGhlIGZpcm13YXJlIG1heQogCQkJCXJlZnVzZSB0byBnZW5lcmF0ZSBmdXJ0aGVyIEZOK0Y0CiAJCQkJa2V5IHByZXNzZXMgdW50aWwgYSBTMyBvciBTNCBBQ1BJCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkcy1jbGFzcy50eHQgYi9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkcy1jbGFzcy50eHQKaW5kZXggNDk5NjU4Ni4uNzk2OTljMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHMtY2xhc3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbGVkcy9sZWRzLWNsYXNzLnR4dApAQCAtNjEsOCArNjEsOCBAQAogU29tZSBMRURzIGNhbiBiZSBwcm9ncmFtbWVkIHRvIGJsaW5rIHdpdGhvdXQgYW55IENQVSBpbnRlcmFjdGlvbi4gVG8KIHN1cHBvcnQgdGhpcyBmZWF0dXJlLCBhIExFRCBkcml2ZXIgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IHRoZQogYmxpbmtfc2V0KCkgZnVuY3Rpb24gKHNlZSA8bGludXgvbGVkcy5oPikuIFRvIHNldCBhbiBMRUQgdG8gYmxpbmtpbmcsCi1ob3dldmVyLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHVzZSB0aGUgQVBJIGZ1bmN0aW9uIGxlZF9ibGlua19zZXQoKSwKLWFzIGl0IHdpbGwgY2hlY2sgYW5kIGltcGxlbWVudCBzb2Z0d2FyZSBmYWxsYmFjayBpZiBuZWNlc3NhcnkuCitob3dldmVyLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSBBUEkgZnVuY3Rpb24gbGVkX2JsaW5rX3NldCgpLCBhcyBpdAord2lsbCBjaGVjayBhbmQgaW1wbGVtZW50IHNvZnR3YXJlIGZhbGxiYWNrIGlmIG5lY2Vzc2FyeS4KIAogVG8gdHVybiBvZmYgYmxpbmtpbmcgYWdhaW4sIHVzZSB0aGUgQVBJIGZ1bmN0aW9uIGxlZF9icmlnaHRuZXNzX3NldCgpCiBhcyB0aGF0IHdpbGwgbm90IGp1c3Qgc2V0IHRoZSBMRUQgYnJpZ2h0bmVzcyBidXQgYWxzbyBzdG9wIGFueSBzb2Z0d2FyZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwdnMtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcHZzLXN5c2N0bC50eHQKaW5kZXggNGNjZGJjYS4uZjJhMjQ4OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwdnMtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXB2cy1zeXNjdGwudHh0CkBAIC0xNSw2ICsxNSwyMyBAQAogICAgICAgICBlbmFibGVkIGFuZCB0aGUgdmFyaWFibGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gMiwgb3RoZXJ3aXNlCiAgICAgICAgIHRoZSBzdHJhdGVneSBpcyBkaXNhYmxlZCBhbmQgdGhlIHZhcmlhYmxlIGlzICBzZXQgIHRvIDEuCiAKK2Nvbm50cmFjayAtIEJPT0xFQU4KKwkwIC0gZGlzYWJsZWQgKGRlZmF1bHQpCisJbm90IDAgLSBlbmFibGVkCisKKwlJZiBzZXQsIG1haW50YWluIGNvbm5lY3Rpb24gdHJhY2tpbmcgZW50cmllcyBmb3IKKwljb25uZWN0aW9ucyBoYW5kbGVkIGJ5IElQVlMuCisKKwlUaGlzIHNob3VsZCBiZSBlbmFibGVkIGlmIGNvbm5lY3Rpb25zIGhhbmRsZWQgYnkgSVBWUyBhcmUgdG8gYmUKKwlhbHNvIGhhbmRsZWQgYnkgc3RhdGVmdWwgZmlyZXdhbGwgcnVsZXMuIFRoYXQgaXMsIGlwdGFibGVzIHJ1bGVzCisJdGhhdCBtYWtlIHVzZSBvZiBjb25uZWN0aW9uIHRyYWNraW5nLiAgSXQgaXMgYSBwZXJmb3JtYW5jZQorCW9wdGltaXNhdGlvbiB0byBkaXNhYmxlIHRoaXMgc2V0dGluZyBvdGhlcndpc2UuCisKKwlDb25uZWN0aW9ucyBoYW5kbGVkIGJ5IHRoZSBJUFZTIEZUUCBhcHBsaWNhdGlvbiBtb2R1bGUKKwl3aWxsIGhhdmUgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyaWVzIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorCisJT25seSBhdmFpbGFibGUgd2hlbiBJUFZTIGlzIGNvbXBpbGVkIHdpdGggQ09ORklHX0lQX1ZTX05GQ1QgZW5hYmxlZC4KKwogY2FjaGVfYnlwYXNzIC0gQk9PTEVBTgogICAgICAgICAwIC0gZGlzYWJsZWQgKGRlZmF1bHQpCiAgICAgICAgIG5vdCAwIC0gZW5hYmxlZApAQCAtMzksNyArNTYsNyBAQAogCTExICAgICAgICAgLSBJUFZTIHBhY2tldCBoYW5kbGluZyAoaXBfdnNfaW4vaXBfdnNfb3V0KQogCTEyIG9yIG1vcmUgLSBwYWNrZXQgdHJhdmVyc2FsCiAKLQlPbmx5IGF2YWlsYWJsZSB3aGVuIElQVlMgaXMgY29tcGlsZWQgd2l0aCB0aGUgQ09ORklHX0lQVlNfREVCVUcKKwlPbmx5IGF2YWlsYWJsZSB3aGVuIElQVlMgaXMgY29tcGlsZWQgd2l0aCBDT05GSUdfSVBfVlNfREVCVUcgZW5hYmxlZC4KIAogCUhpZ2hlciBkZWJ1Z2dpbmcgbGV2ZWxzIGluY2x1ZGUgdGhlIG1lc3NhZ2VzIGZvciBsb3dlciBkZWJ1Z2dpbmcKIAlsZXZlbHMsIHNvIHNldHRpbmcgZGVidWcgbGV2ZWwgMiwgaW5jbHVkZXMgbGV2ZWwgMCwgMSBhbmQgMgpAQCAtMTIzLDEzICsxNDAsMTEgQEAKIHNlY3VyZV90Y3AgLSBJTlRFR0VSCiAgICAgICAgIDAgIC0gZGlzYWJsZWQgKGRlZmF1bHQpCiAKLSAgICAgICAgVGhlIHNlY3VyZV90Y3AgZGVmZW5zZSBpcyB0byB1c2UgYSBtb3JlIGNvbXBsaWNhdGVkIHN0YXRlCi0gICAgICAgIHRyYW5zaXRpb24gdGFibGUgYW5kIHNvbWUgcG9zc2libGUgc2hvcnQgdGltZW91dHMgb2YgZWFjaAotICAgICAgICBzdGF0ZS4gSW4gdGhlIFZTL05BVCwgaXQgZGVsYXlzIHRoZSBlbnRlcmluZyB0aGUgRVNUQUJMSVNIRUQKLSAgICAgICAgdW50aWwgdGhlIHJlYWwgc2VydmVyIHN0YXJ0cyB0byBzZW5kIGRhdGEgYW5kIEFDSyBwYWNrZXQKLSAgICAgICAgKGFmdGVyIDMtd2F5IGhhbmRzaGFrZSkuCisJVGhlIHNlY3VyZV90Y3AgZGVmZW5zZSBpcyB0byB1c2UgYSBtb3JlIGNvbXBsaWNhdGVkIFRDUCBzdGF0ZQorCXRyYW5zaXRpb24gdGFibGUuIEZvciBWUy9OQVQsIGl0IGFsc28gZGVsYXlzIGVudGVyaW5nIHRoZQorCVRDUCBFU1RBQkxJU0hFRCBzdGF0ZSB1bnRpbCB0aGUgdGhyZWUgd2F5IGhhbmRzaGFrZSBpcyBjb21wbGV0ZWQuCiAKLSAgICAgICAgVGhlIHZhbHVlIGRlZmluaXRpb24gaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiBkcm9wX2VudHJ5IG9yCisgICAgICAgIFRoZSB2YWx1ZSBkZWZpbml0aW9uIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgZHJvcF9lbnRyeSBhbmQKICAgICAgICAgZHJvcF9wYWNrZXQuCiAKIHN5bmNfdGhyZXNob2xkIC0gSU5URUdFUgpAQCAtMTQxLDMgKzE1NiwzNiBAQAogICAgICAgICBzeW5jaHJvbml6ZWQsIGV2ZXJ5IHRpbWUgdGhlIG51bWJlciBvZiBpdHMgaW5jb21pbmcgcGFja2V0cwogICAgICAgICBtb2R1bHVzIDUwIGVxdWFscyB0aGUgdGhyZXNob2xkLiBUaGUgcmFuZ2Ugb2YgdGhlIHRocmVzaG9sZCBpcwogICAgICAgICBmcm9tIDAgdG8gNDkuCisKK3NuYXRfcmVyb3V0ZSAtIEJPT0xFQU4KKwkwIC0gZGlzYWJsZWQKKwlub3QgMCAtIGVuYWJsZWQgKGRlZmF1bHQpCisKKwlJZiBlbmFibGVkLCByZWNhbGN1bGF0ZSB0aGUgcm91dGUgb2YgU05BVGVkIHBhY2tldHMgZnJvbQorCXJlYWxzZXJ2ZXJzIHNvIHRoYXQgdGhleSBhcmUgcm91dGVkIGFzIGlmIHRoZXkgb3JpZ2luYXRlIGZyb20gdGhlCisJZGlyZWN0b3IuIE90aGVyd2lzZSB0aGV5IGFyZSByb3V0ZWQgYXMgaWYgdGhleSBhcmUgZm9yd2FyZGVkIGJ5IHRoZQorCWRpcmVjdG9yLgorCisJSWYgcG9saWN5IHJvdXRpbmcgaXMgaW4gZWZmZWN0IHRoZW4gaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgcm91dGUKKwlvZiBhIHBhY2tldCBvcmlnaW5hdGluZyBmcm9tIGEgZGlyZWN0b3IgaXMgcm91dGVkIGRpZmZlcmVudGx5IHRvIGEKKwlwYWNrZXQgYmVpbmcgZm9yd2FyZGVkIGJ5IHRoZSBkaXJlY3Rvci4KKworCUlmIHBvbGljeSByb3V0aW5nIGlzIG5vdCBpbiBlZmZlY3QgdGhlbiB0aGUgcmVjYWxjdWxhdGVkIHJvdXRlIHdpbGwKKwlhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIHJvdXRlIHNvIGl0IGlzIGFuIG9wdGltaXNhdGlvbgorCXRvIGRpc2FibGUgc25hdF9yZXJvdXRlIGFuZCBhdm9pZCB0aGUgcmVjYWxjdWxhdGlvbi4KKworc3luY192ZXJzaW9uIC0gSU5URUdFUgorCWRlZmF1bHQgMQorCisJVGhlIHZlcnNpb24gb2YgdGhlIHN5bmNocm9uaXNhdGlvbiBwcm90b2NvbCB1c2VkIHdoZW4gc2VuZGluZworCXN5bmNocm9uaXNhdGlvbiBtZXNzYWdlcy4KKworCTAgc2VsZWN0cyB0aGUgb3JpZ2luYWwgc3luY2hyb25pc2F0aW9uIHByb3RvY29sICh2ZXJzaW9uIDApLiBUaGlzCisJc2hvdWxkIGJlIHVzZWQgd2hlbiBzZW5kaW5nIHN5bmNocm9uaXNhdGlvbiBtZXNzYWdlcyB0byBhIGxlZ2FjeQorCXN5c3RlbSB0aGF0IG9ubHkgdW5kZXJzdGFuZHMgdGhlIG9yaWdpbmFsIHN5bmNocm9uaXNhdGlvbiBwcm90b2NvbC4KKworCTEgc2VsZWN0cyB0aGUgY3VycmVudCBzeW5jaHJvbmlzYXRpb24gcHJvdG9jb2wgKHZlcnNpb24gMSkuIFRoaXMKKwlzaG91bGQgYmUgdXNlZCB3aGVyZSBwb3NzaWJsZS4KKworCUtlcm5lbHMgd2l0aCB0aGlzIHN5bmNfdmVyc2lvbiBlbnRyeSBhcmUgYWJsZSB0byByZWNlaXZlIG1lc3NhZ2VzCisJb2YgYm90aCB2ZXJzaW9uIDEgYW5kIHZlcnNpb24gMiBvZiB0aGUgc3luY2hyb25pc2F0aW9uIHByb3RvY29sLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0CmluZGV4IDZmZTkwMDEuLjEzMDMyYzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL29vcHMtdHJhY2luZy50eHQKQEAgLTI2Myw2ICsyNjMsOCBAQAogIDEyOiAnSScgaWYgdGhlIGtlcm5lbCBpcyB3b3JraW5nIGFyb3VuZCBhIHNldmVyZSBidWcgaW4gdGhlIHBsYXRmb3JtCiAgICAgIGZpcm13YXJlIChCSU9TIG9yIHNpbWlsYXIpLgogCisgMTM6ICdPJyBpZiBhbiBleHRlcm5hbGx5LWJ1aWx0ICgib3V0LW9mLXRyZWUiKSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLgorCiBUaGUgcHJpbWFyeSByZWFzb24gZm9yIHRoZSAnVGFpbnRlZDogJyBzdHJpbmcgaXMgdG8gdGVsbCBrZXJuZWwKIGRlYnVnZ2VycyBpZiB0aGlzIGlzIGEgY2xlYW4ga2VybmVsIG9yIGlmIGFueXRoaW5nIHVudXN1YWwgaGFzCiBvY2N1cnJlZC4gIFRhaW50aW5nIGlzIHBlcm1hbmVudDogZXZlbiBpZiBhbiBvZmZlbmRpbmcgbW9kdWxlIGlzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ZyZWV6aW5nLW9mLXRhc2tzLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CmluZGV4IDM4YjU3MjQuLjMxNmMyYmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CkBAIC0yMiwxMiArMjIsMTIgQEAKIGVpdGhlciB3YWtlcyB0aGVtIHVwLCBpZiB0aGV5IGFyZSBrZXJuZWwgdGhyZWFkcywgb3Igc2VuZHMgZmFrZSBzaWduYWxzIHRvIHRoZW0sCiBpZiB0aGV5IGFyZSB1c2VyIHNwYWNlIHByb2Nlc3Nlcy4gIEEgdGFzayB0aGF0IGhhcyBUSUZfRlJFRVpFIHNldCwgc2hvdWxkIHJlYWN0CiB0byBpdCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiBjYWxsZWQgcmVmcmlnZXJhdG9yKCkgKGRlZmluZWQgaW4KLWtlcm5lbC9wb3dlci9wcm9jZXNzLmMpLCB3aGljaCBzZXRzIHRoZSB0YXNrJ3MgUEZfRlJPWkVOIGZsYWcsIGNoYW5nZXMgaXRzIHN0YXRlCitrZXJuZWwvZnJlZXplci5jKSwgd2hpY2ggc2V0cyB0aGUgdGFzaydzIFBGX0ZST1pFTiBmbGFnLCBjaGFuZ2VzIGl0cyBzdGF0ZQogdG8gVEFTS19VTklOVEVSUlVQVElCTEUgYW5kIG1ha2VzIGl0IGxvb3AgdW50aWwgUEZfRlJPWkVOIGlzIGNsZWFyZWQgZm9yIGl0LgogVGhlbiwgd2Ugc2F5IHRoYXQgdGhlIHRhc2sgaXMgJ2Zyb3plbicgYW5kIHRoZXJlZm9yZSB0aGUgc2V0IG9mIGZ1bmN0aW9ucwogaGFuZGxpbmcgdGhpcyBtZWNoYW5pc20gaXMgcmVmZXJyZWQgdG8gYXMgJ3RoZSBmcmVlemVyJyAodGhlc2UgZnVuY3Rpb25zIGFyZQotZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jIGFuZCBpbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaCkuICBVc2VyIHNwYWNlCi1wcm9jZXNzZXMgYXJlIGdlbmVyYWxseSBmcm96ZW4gYmVmb3JlIGtlcm5lbCB0aHJlYWRzLgorZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jLCBrZXJuZWwvZnJlZXplci5jICYgaW5jbHVkZS9saW51eC9mcmVlemVyLmgpLgorVXNlciBzcGFjZSBwcm9jZXNzZXMgYXJlIGdlbmVyYWxseSBmcm96ZW4gYmVmb3JlIGtlcm5lbCB0aHJlYWRzLgogCiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gY2FsbCByZWZyaWdlcmF0b3IoKSBkaXJlY3RseS4gIEluc3RlYWQsIGl0IGlzCiByZWNvbW1lbmRlZCB0byB1c2UgdGhlIHRyeV90b19mcmVlemUoKSBmdW5jdGlvbiAoZGVmaW5lZCBpbgpAQCAtOTUsNyArOTUsNyBAQAogYWRkaXRpb25hbCBtZW1vcnkgYW5kIHdlIHByZXZlbnQgdGhlbSBmcm9tIGRvaW5nIHRoYXQgYnkgZnJlZXppbmcgdGhlbSBlYXJsaWVyLgogW09mIGNvdXJzZSwgdGhpcyBhbHNvIG1lYW5zIHRoYXQgZGV2aWNlIGRyaXZlcnMgc2hvdWxkIG5vdCBhbGxvY2F0ZSBzdWJzdGFudGlhbAogYW1vdW50cyBvZiBtZW1vcnkgZnJvbSB0aGVpciAuc3VzcGVuZCgpIGNhbGxiYWNrcyBiZWZvcmUgaGliZXJuYXRpb24sIGJ1dCB0aGlzCi1pcyBlIHNlcGFyYXRlIGlzc3VlLl0KK2lzIGEgc2VwYXJhdGUgaXNzdWUuXQogCiAzLiBUaGUgdGhpcmQgcmVhc29uIGlzIHRvIHByZXZlbnQgdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUga2VybmVsIHRocmVhZHMKIGZyb20gaW50ZXJmZXJpbmcgd2l0aCB0aGUgc3VzcGVuZGluZyBhbmQgcmVzdW1pbmcgb2YgZGV2aWNlcy4gIEEgdXNlciBzcGFjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvbWFjaGluZS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dAppbmRleCBiNDI0MTliLi5jZTYzYWYwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dApAQCAtMTYsNyArMTYsNyBAQAogZWFjaCByZWd1bGF0b3IuCiAKIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CS8qIGNvbnN1bWVyICovCisJY29uc3QgY2hhciAqZGV2X25hbWU7CS8qIGNvbnN1bWVyIGRldl9uYW1lKCkgKi8KIAljb25zdCBjaGFyICpzdXBwbHk7CS8qIGNvbnN1bWVyIHN1cHBseSAtIGUuZy4gInZjYyIgKi8KIH07CiAKQEAgLTI0LDEzICsyNCwxMyBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcmVndWxhdG9yMV9jb25zdW1lcnNbXSA9IHsKIHsKLQkuZGV2CT0gJnBsYXRmb3JtX2NvbnN1bWVyQl9kZXZpY2UuZGV2LAotCS5zdXBwbHkJPSAiVmNjIiwKKwkuZGV2X25hbWUJPSAiZGV2X25hbWUoY29uc3VtZXIgQikiLAorCS5zdXBwbHkJCT0gIlZjYyIsCiB9LH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByZWd1bGF0b3IyX2NvbnN1bWVyc1tdID0gewogewotCS5kZXYJPSAmcGxhdGZvcm1fY29uc3VtZXJBX2RldmljZS5kZXYsCisJLmRldgk9ICJkZXZfbmFtZShjb25zdW1lciBBIiksCiAJLnN1cHBseQk9ICJWY2MiLAogfSx9OwogCkBAIC00Myw2ICs0Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByZWd1bGF0b3IxX2RhdGEgPSB7CiAJLmNvbnN0cmFpbnRzID0geworCQkubmFtZSA9ICJSZWd1bGF0b3ItMSIsCiAJCS5taW5fdVYgPSAzMzAwMDAwLAogCQkubWF4X3VWID0gMzMwMDAwMCwKIAkJLnZhbGlkX21vZGVzX21hc2sgPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwsCkBAIC01MSwxMyArNTIsMTkgQEAKIAkuY29uc3VtZXJfc3VwcGxpZXMgPSByZWd1bGF0b3IxX2NvbnN1bWVycywKIH07CiAKK1RoZSBuYW1lIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gc29tZXRoaW5nIHRoYXQgaXMgdXNlZnVsbHkgZGVzY3JpcHRpdmUKK2ZvciB0aGUgYm9hcmQgZm9yIGNvbmZpZ3VyYXRpb24gb2Ygc3VwcGxpZXMgZm9yIG90aGVyIHJlZ3VsYXRvcnMgYW5kCitmb3IgdXNlIGluIGxvZ2dpbmcgYW5kIG90aGVyIGRpYWdub3N0aWMgb3V0cHV0LiAgTm9ybWFsbHkgdGhlIG5hbWUKK3VzZWQgZm9yIHRoZSBzdXBwbHkgcmFpbCBpbiB0aGUgc2NoZW1hdGljIGlzIGEgZ29vZCBjaG9pY2UuICBJZiBubworbmFtZSBpcyBwcm92aWRlZCB0aGVuIHRoZSBzdWJzeXN0ZW0gd2lsbCBjaG9vc2Ugb25lLgorCiBSZWd1bGF0b3ItMSBzdXBwbGllcyBwb3dlciB0byBSZWd1bGF0b3ItMi4gVGhpcyByZWxhdGlvbnNoaXAgbXVzdCBiZSByZWdpc3RlcmVkCiB3aXRoIHRoZSBjb3JlIHNvIHRoYXQgUmVndWxhdG9yLTEgaXMgYWxzbyBlbmFibGVkIHdoZW4gQ29uc3VtZXIgQSBlbmFibGVzIGl0cwogc3VwcGx5IChSZWd1bGF0b3ItMikuIFRoZSBzdXBwbHkgcmVndWxhdG9yIGlzIHNldCBieSB0aGUgc3VwcGx5X3JlZ3VsYXRvcgotZmllbGQgYmVsb3c6LQorZmllbGQgYmVsb3cgYW5kIGNvOi0KIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHJlZ3VsYXRvcjJfZGF0YSA9IHsKLQkuc3VwcGx5X3JlZ3VsYXRvciA9ICJyZWd1bGF0b3JfbmFtZSIsCisJLnN1cHBseV9yZWd1bGF0b3IgPSAiUmVndWxhdG9yLTEiLAogCS5jb25zdHJhaW50cyA9IHsKIAkJLm1pbl91ViA9IDE4MDAwMDAsCiAJCS5tYXhfdVYgPSAyMDAwMDAwLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQKaW5kZXggMGU4NTYwOC4uNTMzNjE0OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0CkBAIC03ODksNiArNzg5LDE2IEBACiBTaW1pbGFybHksIGlmIHRoZSBwb3dlci51c2VfYXV0b3N1c3BlbmQgZmllbGQgaXNuJ3Qgc2V0IHRoZW4gdGhlIGF1dG9zdXNwZW5kCiBoZWxwZXIgZnVuY3Rpb25zIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSB0aGUgbm9uLWF1dG9zdXNwZW5kIGNvdW50ZXJwYXJ0cy4KIAorVW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzIGEgZHJpdmVyIG9yIHN1YnN5c3RlbSBtYXkgd2FudCB0byBwcmV2ZW50IGEgZGV2aWNlCitmcm9tIGF1dG9zdXNwZW5kaW5nIGltbWVkaWF0ZWx5LCBldmVuIHRob3VnaCB0aGUgdXNhZ2UgY291bnRlciBpcyB6ZXJvIGFuZCB0aGUKK2F1dG9zdXNwZW5kIGRlbGF5IHRpbWUgaGFzIGV4cGlyZWQuICBJZiB0aGUgLT5ydW50aW1lX3N1c3BlbmQoKSBjYWxsYmFjaworcmV0dXJucyAtRUFHQUlOIG9yIC1FQlVTWSwgYW5kIGlmIHRoZSBuZXh0IGF1dG9zdXNwZW5kIGRlbGF5IGV4cGlyYXRpb24gdGltZSBpcworaW4gdGhlIGZ1dHVyZSAoYXMgaXQgbm9ybWFsbHkgd291bGQgYmUgaWYgdGhlIGNhbGxiYWNrIGludm9rZWQKK3BtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koKSksIHRoZSBQTSBjb3JlIHdpbGwgYXV0b21hdGljYWxseSByZXNjaGVkdWxlIHRoZQorYXV0b3N1c3BlbmQuICBUaGUgLT5ydW50aW1lX3N1c3BlbmQoKSBjYWxsYmFjayBjYW4ndCBkbyB0aGlzIHJlc2NoZWR1bGluZworaXRzZWxmIGJlY2F1c2Ugbm8gc3VzcGVuZCByZXF1ZXN0cyBvZiBhbnkga2luZCBhcmUgYWNjZXB0ZWQgd2hpbGUgdGhlIGRldmljZSBpcworc3VzcGVuZGluZyAoaS5lLiwgd2hpbGUgdGhlIGNhbGxiYWNrIGlzIHJ1bm5pbmcpLgorCiBUaGUgaW1wbGVtZW50YXRpb24gaXMgd2VsbCBzdWl0ZWQgZm9yIGFzeW5jaHJvbm91cyB1c2UgaW4gaW50ZXJydXB0IGNvbnRleHRzLgogSG93ZXZlciBzdWNoIHVzZSBpbmV2aXRhYmx5IGludm9sdmVzIHJhY2VzLCBiZWNhdXNlIHRoZSBQTSBjb3JlIGNhbid0CiBzeW5jaHJvbml6ZSAtPnJ1bnRpbWVfc3VzcGVuZCgpIGNhbGxiYWNrcyB3aXRoIHRoZSBhcnJpdmFsIG9mIEkvTyByZXF1ZXN0cy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcmFwaWRpby9yYXBpZGlvLnR4dCBiL0RvY3VtZW50YXRpb24vcmFwaWRpby9yYXBpZGlvLnR4dAppbmRleCBiZTcwZWUxLi5jNzU2OTRiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vcmFwaWRpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9yYXBpZGlvL3JhcGlkaW8udHh0CkBAIC0xNDQsNyArMTQ0LDcgQEAKIAogQWZ0ZXIgdGhlIGhvc3QgaGFzIGNvbXBsZXRlZCBlbnVtZXJhdGlvbiBvZiB0aGUgZW50aXJlIG5ldHdvcmsgaXQgcmVsZWFzZXMKIGRldmljZXMgYnkgY2xlYXJpbmcgZGV2aWNlIElEIGxvY2tzIChjYWxscyByaW9fY2xlYXJfbG9ja3MoKSkuIEZvciBlYWNoIGVuZHBvaW50Ci1pbiB0aGUgc3lzdGVtLCBpdCBzZXRzIHRoZSBNYXN0ZXIgRW5hYmxlIGJpdCBpbiB0aGUgUG9ydCBHZW5lcmFsIENvbnRyb2wgQ1NSCitpbiB0aGUgc3lzdGVtLCBpdCBzZXRzIHRoZSBEaXNjb3ZlcmVkIGJpdCBpbiB0aGUgUG9ydCBHZW5lcmFsIENvbnRyb2wgQ1NSCiB0byBpbmRpY2F0ZSB0aGF0IGVudW1lcmF0aW9uIGlzIGNvbXBsZXRlZCBhbmQgYWdlbnRzIGFyZSBhbGxvd2VkIHRvIGV4ZWN1dGUKIHBhc3NpdmUgZGlzY292ZXJ5IG9mIHRoZSBuZXR3b3JrLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vdHNpNzIxLnR4dCBiL0RvY3VtZW50YXRpb24vcmFwaWRpby90c2k3MjEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNWYzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vdHNpNzIxLnR4dApAQCAtMCwwICsxLDQ5IEBACitSYXBpZElPIHN1YnN5c3RlbSBtcG9ydCBkcml2ZXIgZm9yIElEVCBUc2k3MjEgUENJIEV4cHJlc3MtdG8tU1JJTyBicmlkZ2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0kuIE92ZXJ2aWV3CisKK1RoaXMgZHJpdmVyIGltcGxlbWVudHMgYWxsIGN1cnJlbnRseSBkZWZpbmVkIFJhcGlkSU8gbXBvcnQgY2FsbGJhY2sgZnVuY3Rpb25zLgorSXQgc3VwcG9ydHMgbWFpbnRlbmFuY2UgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucywgaW5ib3VuZCBhbmQgb3V0Ym91bmQgUmFwaWRJTworZG9vcmJlbGxzLCBpbmJvdW5kIG1haW50ZW5hbmNlIHBvcnQtd3JpdGVzIGFuZCBSYXBpZElPIG1lc3NhZ2luZy4KKworVG8gZ2VuZXJhdGUgU1JJTyBtYWludGVuYW5jZSB0cmFuc2FjdGlvbnMgdGhpcyBkcml2ZXIgdXNlcyBvbmUgb2YgVHNpNzIxIERNQQorY2hhbm5lbHMuIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIGFjY2VzcyB0byBsYXJnZXIgcmFuZ2Ugb2YgaG9wIGNvdW50cyBhbmQKK2Rlc3RpbmF0aW9uIElEcyB3aXRob3V0IG5lZWQgZm9yIGNoYW5nZXMgaW4gb3V0Ym91bmQgd2luZG93IHRyYW5zbGF0aW9uLgorCitSYXBpZElPIG1lc3NhZ2luZyBzdXBwb3J0IHVzZXMgZGVkaWNhdGVkIG1lc3NhZ2luZyBjaGFubmVscyBmb3IgZWFjaCBtYWlsYm94LgorRm9yIGluYm91bmQgbWVzc2FnZXMgdGhpcyBkcml2ZXIgdXNlcyBkZXN0aW5hdGlvbiBJRCBtYXRjaGluZyB0byBmb3J3YXJkIG1lc3NhZ2VzCitpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgcXVldWUuIE1lc3NhZ2luZyBjYWxsYmFja3MgYXJlIGltcGxlbWVudGVkIHRvIGJlCitmdWxseSBjb21wYXRpYmxlIHdpdGggUklPTkVUIGRyaXZlciAoRXRoZXJuZXQgb3ZlciBSYXBpZElPIG1lc3NhZ2luZyBzZXJ2aWNlcykuCisKK0lJLiBLbm93biBwcm9ibGVtcworCisgIE5vbmUuCisKK0lJSS4gVG8gZG8KKworIEFkZCBETUEgZGF0YSB0cmFuc2ZlcnMgKG5vbi1tZXNzYWdpbmcpLgorIEFkZCBpbmJvdW5kIHJlZ2lvbiAoU1JJTy10by1QQ0llKSBtYXBwaW5nLgorCitJVi4gVmVyc2lvbiBIaXN0b3J5CisKKyAgMS4wLjAgLSBJbml0aWFsIGRyaXZlciByZWxlYXNlLgorCitWLiAgTGljZW5zZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBDb3B5cmlnaHQoYykgMjAxMSBJbnRlZ3JhdGVkIERldmljZSBUZWNobm9sb2d5LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9zY3NpLzAwLUlOREVYCmluZGV4IGMyZTE4ZTEuLmI0OGRlZDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvMDAtSU5ERVgKQEAgLTI4LDYgKzI4LDggQEAKIAktIExpY2VuY2Ugb2YgdGhlIEZsYXNocG9pbnQgZHJpdmVyCiBMSUNFTlNFLnFsYTJ4eHgKIAktIExpY2Vuc2UgZm9yIFFMb2dpYyBMaW51eCBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIgZmlybXdhcmUuCitMSUNFTlNFLnFsYTR4eHgKKwktIExpY2Vuc2UgZm9yIFFMb2dpYyBMaW51eCBpU0NTSSBIQkEgRHJpdmVyLgogTXlsZXgudHh0CiAJLSBpbmZvIG9uIGRyaXZlciBmb3IgTXlsZXggYWRhcHRlcnMKIE5pbmphU0NTSS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMKaW5kZXggMWI2ZTI3ZC4uNjRhZGI5OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMKQEAgLTEsMyArMSwxOCBAQAorUmVsZWFzZSBEYXRlICAgIDogV2VkLiBPY3QgNSwgMjAxMSAxNzowMDowMCBQU1QgMjAxMCAtCisJCQkoZW1haWxkLWlkOm1lZ2FyYWlkbGludXhAbHNpLmNvbSkKKwkJCUFkYW0gUmFkZm9yZAorQ3VycmVudCBWZXJzaW9uIDogMDAuMDAuMDYuMTItcmMxCitPbGQgVmVyc2lvbiAgICAgOiAwMC4wMC4wNS40MC1yYzEKKyAgICAxLiBDb250aW51ZSBib290aW5nIGltbWVkaWF0ZWx5IGlmIEZXIGluIEZBVUxUIGF0IGRyaXZlciBsb2FkIHRpbWUuCisgICAgMi4gSW5jcmVhc2UgZGVmYXVsdCBjbWRzIHBlciBsdW4gdG8gMjU2LgorICAgIDMuIEZpeCBtaXNtYXRjaCBpbiBtZWdhc2FzX3Jlc2V0X2Z1c2lvbigpIG11dGV4IGxvY2stdW5sb2NrLgorICAgIDQuIFJlbW92ZSBzb21lIHVuLW5lY2Vzc2FyeSBjb2RlLgorICAgIDUuIENsZWFyIHN0YXRlIGNoYW5nZSBpbnRlcnJ1cHRzIGZvciBGdXNpb24vSW52YWRlci4KKyAgICA2LiBDbGVhciBGVVNJT05fSU5fUkVTRVQgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHMuCisgICAgNy4gQWRkIHN1cHBvcnQgZm9yIE1lZ2FSQUlEIDkzNjAvOTM4MCAxMkdCL3MgY29udHJvbGxlcnMuCisgICAgOC4gQWRkIG11bHRpcGxlIE1TSS1YIHZlY3Rvci9tdWx0aXBsZSByZXBseSBxdWV1ZSBzdXBwb3J0LgorICAgIDkuIEFkZCBkcml2ZXIgd29ya2Fyb3VuZCBmb3IgUEVSQzUvMTA2OCBrZHVtcCBrZXJuZWwgcGFuaWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBSZWxlYXNlIERhdGUgICAgOiBUdWUuIEp1bCAyNiwgMjAxMSAxNzowMDowMCBQU1QgMjAxMCAtCiAJCQkoZW1haWxkLWlkOm1lZ2FyYWlkbGludXhAbHNpLmNvbSkKIAkJCUFkYW0gUmFkZm9yZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0xJQ0VOU0UucWxhNHh4eCBiL0RvY3VtZW50YXRpb24vc2NzaS9MSUNFTlNFLnFsYTR4eHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0OTgwZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9MSUNFTlNFLnFsYTR4eHgKQEAgLTAsMCArMSwzMTAgQEAKK0NvcHlyaWdodCAoYykgMjAwMy0yMDExIFFMb2dpYyBDb3Jwb3JhdGlvbgorUUxvZ2ljIExpbnV4IGlTQ1NJIEhCQSBEcml2ZXIKKworVGhpcyBwcm9ncmFtIGluY2x1ZGVzIGEgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMy54LgorWW91IG1heSBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUgZGV2aWNlIGRyaXZlciBjb2RlIHVuZGVyIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGEgY29weSBvZiB3aGljaCBpcyBhdHRhY2hlZCBoZXJldG8gYXMKK0V4aGliaXQgQSkgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gKHZlcnNpb24gMikuCisKK1JFR0FSRExFU1MgT0YgV0hBVCBMSUNFTlNJTkcgTUVDSEFOSVNNIElTIFVTRUQgT1IgQVBQTElDQUJMRSwKK1RISVMgUFJPR1JBTSBJUyBQUk9WSURFRCBCWSBRTE9HSUMgQ09SUE9SQVRJT04gIkFTIElTJycgQU5EIEFOWQorRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUgorQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKK0VYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKK09VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitVU0VSIEFDS05PV0xFREdFUyBBTkQgQUdSRUVTIFRIQVQgVVNFIE9GIFRISVMgUFJPR1JBTSBXSUxMIE5PVAorQ1JFQVRFIE9SIEdJVkUgR1JPVU5EUyBGT1IgQSBMSUNFTlNFIEJZIElNUExJQ0FUSU9OLCBFU1RPUFBFTCwgT1IKK09USEVSV0lTRSBJTiBBTlkgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyAoUEFURU5ULCBDT1BZUklHSFQsCitUUkFERSBTRUNSRVQsIE1BU0sgV09SSywgT1IgT1RIRVIgUFJPUFJJRVRBUlkgUklHSFQpIEVNQk9ESUVEIElOCitBTlkgT1RIRVIgUUxPR0lDIEhBUkRXQVJFIE9SIFNPRlRXQVJFIEVJVEhFUiBTT0xFTFkgT1IgSU4KK0NPTUJJTkFUSU9OIFdJVEggVEhJUyBQUk9HUkFNLgorCisKK0VYSElCSVQgQQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9ibngyZmMudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL2JueDJmYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4MjM1NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9ibngyZmMudHh0CkBAIC0wLDAgKzEsNzUgQEAKK09wZXJhdGluZyBGQ29FIHVzaW5nIGJueDJmYworPT09PT09PT09PT09PT09PT09PT09PT09PT09CitCcm9hZGNvbSBGQ29FIG9mZmxvYWQgdGhyb3VnaCBibngyZmMgaXMgZnVsbCBzdGF0ZWZ1bCBoYXJkd2FyZSBvZmZsb2FkIHRoYXQKK2Nvb3BlcmF0ZXMgd2l0aCBhbGwgaW50ZXJmYWNlcyBwcm92aWRlZCBieSB0aGUgTGludXggZWNvc3lzdGVtIGZvciBGQy9GQ29FIGFuZAorU0NTSSBjb250cm9sbGVycy4gIEFzIHN1Y2gsIEZDb0UgZnVuY3Rpb25hbGl0eSwgb25jZSBlbmFibGVkIGlzIGxhcmdlbHkKK3RyYW5zcGFyZW50LiBEZXZpY2VzIGRpc2NvdmVyZWQgb24gdGhlIFNBTiB3aWxsIGJlIHJlZ2lzdGVyZWQgYW5kIHVucmVnaXN0ZXJlZAorYXV0b21hdGljYWxseSB3aXRoIHRoZSB1cHBlciBzdG9yYWdlIGxheWVycy4KKworRGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoZSBCcm9hZGNvbSdzIEZDb0Ugb2ZmbG9hZCBpcyBmdWxseSBvZmZsb2FkZWQsIGl0IGRvZXMKK2RlcGVuZCBvbiB0aGUgc3RhdGUgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlcyB0byBvcGVyYXRlLiBBcyBzdWNoLCB0aGUgbmV0d29yaworaW50ZXJmYWNlIChlLmcuIGV0aDApIGFzc29jaWF0ZWQgd2l0aCB0aGUgRkNvRSBvZmZsb2FkIGluaXRpYXRvciBtdXN0IGJlICd1cCcuCitJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBuZXR3b3JrIGludGVyZmFjZXMgYmUgY29uZmlndXJlZCB0byBiZSBicm91Z2h0IHVwCithdXRvbWF0aWNhbGx5IGF0IGJvb3QgdGltZS4KKworRnVydGhlcm1vcmUsIHRoZSBCcm9hZGNvbSBGQ29FIG9mZmxvYWQgc29sdXRpb24gY3JlYXRlcyBWTEFOIGludGVyZmFjZXMgdG8KK3N1cHBvcnQgdGhlIFZMQU5zIHRoYXQgaGF2ZSBiZWVuIGRpc2NvdmVyZWQgZm9yIEZDb0Ugb3BlcmF0aW9uIChlLmcuCitldGgwLjEwMDEtZmNvZSkuICBEbyBub3QgZGVsZXRlIG9yIGRpc2FibGUgdGhlc2UgaW50ZXJmYWNlcyBvciBGQ29FIG9wZXJhdGlvbgord2lsbCBiZSBkaXNydXB0ZWQuCisKK0RyaXZlciBVc2FnZSBNb2RlbDoKKz09PT09PT09PT09PT09PT09PT0KKworMS4gRW5zdXJlIHRoYXQgZmNvZS11dGlscyBwYWNrYWdlIGlzIGluc3RhbGxlZC4KKworMi4gQ29uZmlndXJlIHRoZSBpbnRlcmZhY2VzIG9uIHdoaWNoIGJueDJmYyBkcml2ZXIgaGFzIHRvIG9wZXJhdGUgb24uCitIZXJlIGFyZSB0aGUgc3RlcHMgdG8gY29uZmlndXJlOgorCWEuIGNkIC9ldGMvZmNvZQorCWIuIGNvcHkgY2ZnLWV0aHggdG8gY2ZnLWV0aDUgaWYgRkNvRSBoYXMgdG8gYmUgZW5hYmxlZCBvbiBldGg1LgorCWMuIFJlcGVhdCB0aGlzIGZvciBhbGwgdGhlIGludGVyZmFjZXMgd2hlcmUgRkNvRSBoYXMgdG8gYmUgZW5hYmxlZC4KKwlkLiBFZGl0IGFsbCB0aGUgY2ZnLWV0aCBmaWxlcyB0byBzZXQgIm5vIiBmb3IgRENCX1JFUVVJUkVEKiogZmllbGQsIGFuZAorCSAgICJ5ZXMiIGZvciBBVVRPX1ZMQU4uCisJZS4gT3RoZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNob3VsZCBiZSBsZWZ0IGFzIGRlZmF1bHQKKworMy4gRW5zdXJlIHRoYXQgImJueDJmYyIgaXMgaW4gU1VQUE9SVEVEX0RSSVZFUlMgbGlzdCBpbiAvZXRjL2Zjb2UvY29uZmlnLgorCis0LiBTdGFydCBmY29lIHNlcnZpY2UuIChzZXJ2aWNlIGZjb2Ugc3RhcnQpLiBJZiBCcm9hZGNvbSBkZXZpY2VzIGFyZSBwcmVzZW50IGluCit0aGUgc3lzdGVtLCBibngyZmMgZHJpdmVyIHdvdWxkIGF1dG9tYXRpY2FsbHkgY2xhaW0gdGhlIGludGVyZmFjZXMsIHN0YXJ0cyB2bGFuCitkaXNjb3ZlcnkgYW5kIGxvZyBpbnRvIHRoZSB0YXJnZXRzLgorCis1LiAiU3ltYm9saWMgTmFtZSIgaW4gJ2Zjb2VhZG0gLWknIG91dHB1dCB3b3VsZCBkaXNwbGF5IGlmIGJueDJmYyBoYXMgY2xhaW1lZAordGhlIGludGVyZmFjZS4KK0VnOgorW3Jvb3RAYmgyIH5dIyBmY29lYWRtIC1pCisgICAgRGVzY3JpcHRpb246ICAgICAgTmV0WHRyZW1lIElJIEJDTTU3NzEyIDEwIEdpZ2FiaXQgRXRoZXJuZXQKKyAgICBSZXZpc2lvbjogICAgICAgICAwMQorICAgIE1hbnVmYWN0dXJlcjogICAgIEJyb2FkY29tIENvcnBvcmF0aW9uCisgICAgU2VyaWFsIE51bWJlcjogICAgMDAxMDE4NkZENTU4CisgICAgRHJpdmVyOiAgICAgICAgICAgYm54MnggMS43MC4wMC0wCisgICAgTnVtYmVyIG9mIFBvcnRzOiAgMgorCisgICAgICAgIFN5bWJvbGljIE5hbWU6ICAgICBibngyZmMgdjEuMC41IG92ZXIgZXRoNS40CisgICAgICAgIE9TIERldmljZSBOYW1lOiAgICBob3N0MTEKKyAgICAgICAgTm9kZSBOYW1lOiAgICAgICAgIDB4MTAwMDAwMTAxODZGRDU1OQorICAgICAgICBQb3J0IE5hbWU6ICAgICAgICAgMHgyMDAwMDAxMDE4NkZENTU5CisgICAgICAgIEZhYnJpY05hbWU6ICAgICAgICAweDIwMDEwMDBERUNCM0I2ODEKKyAgICAgICAgU3BlZWQ6ICAgICAgICAgICAgIDEwIEdiaXQKKyAgICAgICAgU3VwcG9ydGVkIFNwZWVkOiAgIDEwIEdiaXQKKyAgICAgICAgTWF4RnJhbWVTaXplOiAgICAgIDIwNDgKKyAgICAgICAgRkMtSUQgKFBvcnQgSUQpOiAgIDB4MEYwMzc3CisgICAgICAgIFN0YXRlOiAgICAgICAgICAgICBPbmxpbmUKKworNi4gVmVyaWZ5IHRoZSB2bGFuIGRpc2NvdmVyeSBpcyBwZXJmb3JtZWQgYnkgcnVubmluZyBpZmNvbmZpZyBhbmQgbm90aWNlCis8SU5URVJGQUNFPi48VkxBTj4tZmNvZSBpbnRlcmZhY2VzIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCisKK1JlZmVyIHRvIGZjb2VhZG0gbWFucGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBmY29lYWRtIG9wZXJhdGlvbnMgdG8KK2NyZWF0ZS9kZXN0cm95IGludGVyZmFjZXMgb3IgdG8gZGlzcGxheSBsdW4vdGFyZ2V0IGluZm9ybWF0aW9uLgorCitOT1RFOgorPT09PQorKiogQnJvYWRjb20gRkNvRSBjYXBhYmxlIGRldmljZXMgaW1wbGVtZW50IGEgRENCWC9MTERQIGNsaWVudCBvbi1jaGlwLiBPbmx5IG9uZQorTExEUCBjbGllbnQgaXMgYWxsb3dlZCBwZXIgaW50ZXJmYWNlLiBGb3IgcHJvcGVyIG9wZXJhdGlvbiBhbGwgaG9zdCBzb2Z0d2FyZQorYmFzZWQgRENCWC9MTERQIGNsaWVudHMgKGUuZy4gbGxkcGFkKSBtdXN0IGJlIGRpc2FibGVkLiBUbyBkaXNhYmxlIGxsZHBhZCBvbiBhCitnaXZlbiBpbnRlcmZhY2UsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKK2xsZHB0b29sIHNldC1sbGRwIC1pIDxpbnRlcmZhY2VfbmFtZT4gYWRtaW5TdGF0dXM9ZGlzYWJsZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2VyaWFsL2NvbXB1dG9uZS50eHQgYi9Eb2N1bWVudGF0aW9uL3NlcmlhbC9jb21wdXRvbmUudHh0CmluZGV4IDYwYTZmNjUuLjM5ZGRjZGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2VyaWFsL2NvbXB1dG9uZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvY29tcHV0b25lLnR4dApAQCAtMjAsOCArMjAsNiBAQAogRGF0ZTogMTEvMDEvMjAwMQogSGlzdG9yaWNhbCBBdXRob3I6IEFuZHJldyBNYW5pc29uIDxhbWFuaXNvbkBhbWVyaWNhLm5ldD4KIFByaW1hcnkgQXV0aG9yOiBEb3VnIE1jTmFzaAotU3VwcG9ydDogc3VwcG9ydEBjb21wdXRvbmUuY29tCi1GaXhlcyBhbmQgVXBkYXRlczogTWlrZSBXYXJmaWVsZCA8bWh3QHdpdHRzZW5kLmNvbT4KIAogVGhpcyBmaWxlIGFzc3VtZXMgdGhhdCB5b3UgYXJlIHVzaW5nIHRoZSBDb21wdXRvbmUgZHJpdmVycyB3aGljaCBhcmUKIGludGVncmF0ZWQgaW50byB0aGUga2VybmVsIHNvdXJjZXMuICBGb3IgdXBkYXRpbmcgdGhlIGRyaXZlcnMgb3IgaW5zdGFsbGluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAppbmRleCA4OTc1NzAxLi45MzY2OTllIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dApAQCAtODg2LDYgKzg4NiwxMiBAQAogCQlkaXNhYmxlKQogICAgIHBvd2VyX3NhdmVfY29udHJvbGxlciAtIFJlc2V0IEhELWF1ZGlvIGNvbnRyb2xsZXIgaW4gcG93ZXItc2F2aW5nIG1vZGUKIAkJKGRlZmF1bHQgPSBvbikKKyAgICBhbGlnbl9idWZmZXJfc2l6ZSAtIEZvcmNlIHJvdW5kaW5nIG9mIGJ1ZmZlci9wZXJpb2Qgc2l6ZXMgdG8gbXVsdGlwbGVzCisgICAgCQkgICAgICBvZiAxMjggYnl0ZXMuIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgaW4gdGVybXMgb2YgbWVtb3J5CisJCSAgICAgIGFjY2VzcyBidXQgaXNuJ3QgcmVxdWlyZWQgYnkgdGhlIEhEQSBzcGVjIGFuZCBwcmV2ZW50cworCQkgICAgICB1c2VycyBmcm9tIHNwZWNpZnlpbmcgZXhhY3QgcGVyaW9kL2J1ZmZlciBzaXplcy4KKwkJICAgICAgKGRlZmF1bHQgPSBvbikKKyAgICBzbm9vcAktIEVuYWJsZS9kaXNhYmxlIHNub29waW5nIChkZWZhdWx0ID0gb24pCiAKICAgICBUaGlzIG1vZHVsZSBzdXBwb3J0cyBtdWx0aXBsZSBjYXJkcyBhbmQgYXV0b3Byb2JlLgogICAgIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLUNvbnRyb2xzLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Db250cm9scy50eHQKaW5kZXggMTQ4MjAzNS4uZTk2MjFlMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLUNvbnRyb2xzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tQ29udHJvbHMudHh0CkBAIC05OCwzICs5OCwxOSBAQAogCiAqIEF1dG8tTXV0ZSBNb2RlCiAgIFNlZSBSZWF0ZWsgY29kZWNzLgorCisKK0FuYWxvZyBjb2RlY3MKKy0tLS0tLS0tLS0tLS0tCisKKyogQ2hhbm5lbCBNb2RlCisgIFRoaXMgaXMgYW4gZW51bSBjb250cm9sIHRvIGNoYW5nZSB0aGUgc3Vycm91bmQtY2hhbm5lbCBzZXR1cCwKKyAgYXBwZWFycyBvbmx5IHdoZW4gdGhlIHN1cnJvdW5kIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUuCisgIEl0IGdpdmVzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgdXNlZCwgIjJjaCIsICI0Y2giIGFuZCAiNmNoIi4KKyAgQWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uLCB0aGlzIGFsc28gY29udHJvbHMgdGhlCisgIGphY2stcmV0YXNraW5nIG9mIG11bHRpLUkvTyBqYWNrcy4KKworKiBJbmRlcGVuZGVudCBIUAorICBXaGVuIHRoaXMgZW51bSBjb250cm9sIGlzIGVuYWJsZWQsIHRoZSBoZWFkcGhvbmUgb3V0cHV0IGlzIHJvdXRlZAorICBmcm9tIGFuIGluZGl2aWR1YWwgc3RyZWFtICh0aGUgdGhpcmQgUENNIHN1Y2ggYXMgaHc6MCwyKSBpbnN0ZWFkIG9mCisgIHRoZSBwcmltYXJ5IHN0cmVhbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Nb2RlbHMudHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLU1vZGVscy50eHQKaW5kZXggZDcwYzkzYi4uZWRhZDk5YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLU1vZGVscy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLU1vZGVscy50eHQKQEAgLTI5LDkgKzI5LDYgQEAKIAogQUxDMjYwCiA9PT09PT0KLSAgaHAJCUhQIG1hY2hpbmVzCi0gIGhwLTMwMTMJSFAgbWFjaGluZXMgKDMwMTMtdmFyaWFudCkKLSAgaHAtZGM3NjAwCUhQIERDNzYwMAogICBmdWppdHN1CUZ1aml0c3UgUzcwMjAKICAgYWNlcgkJQWNlciBUcmF2ZWxNYXRlCiAgIHdpbGwJCVdpbGwgbGFwdG9wcyAoUEIgVjc5MDApCkBAIC00NiwxNSArNDMsMTAgQEAKIEFMQzI2MgogPT09PT09CiAgIGZ1aml0c3UJRnVqaXRzdSBMYXB0b3AKLSAgaHAtYnBjCUhQIHh3NDQwMC82NDAwLzg0MDAvOTQwMCBsYXB0b3BzCi0gIGhwLWJwYy1kNzAwMAlIUCBCUEMgRDcwMDAKLSAgaHAtdGMtdDU3MzUJSFAgVGhpbiBDbGllbnQgVDU3MzUKLSAgaHAtcnA1NzAwCUhQIFJQNTcwMAogICBiZW5xCQlCZW5xIEVEOAogICBiZW5xLXQzMQlCZW5xIFQzMQogICBoaXBwbwkJSGlwcG8gKEFUSSkgd2l0aCBqYWNrIGRldGVjdGlvbiwgU29ueSBVWC05MHMKICAgaGlwcG9fMQlIaXBwbyAoQmVucSkgd2l0aCBqYWNrIGRldGVjdGlvbgotICBzb255LWFzc2FtZAlTb255IEFTU0FNRAogICB0b3NoaWJhLXMwNglUb3NoaWJhIFMwNgogICB0b3NoaWJhLXJ4MQlUb3NoaWJhIFJYMQogICB0eWFuCQlUeWFuIFRodW5kZXIgbjY2NTBXIChTMjkxNS1FKQpAQCAtNjYsNDMgKzU4LDE1IEBACiAKIEFMQzI2Ny8yNjgKID09PT09PT09PT0KLSAgcXVhbnRhLWlsMQlRdWFudGEgSUwxIG1pbmktbm90ZWJvb2sKLSAgM3N0YWNrCTMtc3RhY2sgbW9kZWwKLSAgdG9zaGliYQlUb3NoaWJhIEEyMDUKLSAgYWNlcgkJQWNlciBsYXB0b3BzCi0gIGFjZXItZG1pYwlBY2VyIGxhcHRvcHMgd2l0aCBkaWdpdGFsLW1pYwotICBhY2VyLWFzcGlyZQlBY2VyIEFzcGlyZSBPbmUKLSAgZGVsbAkJRGVsbCBPRU0gbGFwdG9wcyAoVm9zdHJvIDEyMDApCi0gIHplcHRvCQlaZXB0byBsYXB0b3BzCi0gIHRlc3QJCWZvciB0ZXN0aW5nL2RlYnVnZ2luZyBwdXJwb3NlLCBhbG1vc3QgYWxsIGNvbnRyb2xzIGNhbgotCQlhZGp1c3RlZC4gIEFwcGVhcmluZyBvbmx5IHdoZW4gY29tcGlsZWQgd2l0aAotCQkkQ09ORklHX1NORF9ERUJVRz15Ci0gIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKKyAgTi9BCiAKIEFMQzI2OQogPT09PT09Ci0gIGJhc2ljCQlCYXNpYyBwcmVzZXQKLSAgcXVhbnRhCVF1YW50YSBGTDEKICAgbGFwdG9wLWFtaWMJTGFwdG9wcyB3aXRoIGFuYWxvZy1taWMgaW5wdXQKICAgbGFwdG9wLWRtaWMJTGFwdG9wcyB3aXRoIGRpZ2l0YWwtbWljIGlucHV0Ci0gIGZ1aml0c3UJRlNDIEFtaWxvCi0gIGxpZmVib29rCUZ1aml0c3UgTGlmZWJvb2sgUzY0MjAKLSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiBBTEM2NjIvNjYzLzI3MgogPT09PT09PT09PT09PT0KLSAgM3N0YWNrLWRpZwkzLXN0YWNrICgyLWNoYW5uZWwpIHdpdGggU1BESUYKLSAgM3N0YWNrLTZjaAkgMy1zdGFjayAoNi1jaGFubmVsKQotICAzc3RhY2stNmNoLWRpZyAzLXN0YWNrICg2LWNoYW5uZWwpIHdpdGggU1BESUYKLSAgNXN0YWNrLWRpZwkgNS1zdGFjayB3aXRoIFNQRElGCi0gIGxlbm92by0xMDFlCSBMZW5vdm8gbGFwdG9wCi0gIGVlZXBjLXA3MDEJQVNVUyBFZWVwYyBQNzAxCi0gIGVlZXBjLWVwMjAJQVNVUyBFZWVwYyBFUDIwCi0gIGVjcwkJRUNTL0ZveGNvbm4gbW9ibwotICBtNTF2YQkJQVNVUyBNNTFWQQotICBnNzF2CQlBU1VTIEc3MVYKLSAgaDEzCQlBU1VTIEgxMwotICBnNTB2CQlBU1VTIEc1MFYKICAgYXN1cy1tb2RlMQlBU1VTCiAgIGFzdXMtbW9kZTIJQVNVUwogICBhc3VzLW1vZGUzCUFTVVMKQEAgLTExMSwxNSArNzUsMTAgQEAKICAgYXN1cy1tb2RlNglBU1VTCiAgIGFzdXMtbW9kZTcJQVNVUwogICBhc3VzLW1vZGU4CUFTVVMKLSAgZGVsbAkJRGVsbCB3aXRoIEFMQzI3MgotICBkZWxsLXptMQlEZWxsIFpNMSB3aXRoIEFMQzI3MgotICBzYW1zdW5nLW5jMTAJU2Ftc3VuZyBOQzEwIG1pbmkgbm90ZWJvb2sKLSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiBBTEM2ODAKID09PT09PQotICBiYXNlCQlCYXNlIG1vZGVsIChBU1VTIE5YOTApCi0gIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKKyAgTi9BCiAKIEFMQzg4Mi84ODMvODg1Lzg4OC84ODkKID09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE3NSwyOCArMTM0LDExIEBACiAKIEFMQzg2MS82NjAKID09PT09PT09PT0KLSAgM3N0YWNrCTMtamFjawotICAzc3RhY2stZGlnCTMtamFjayB3aXRoIFNQRElGIEkvTwotICA2c3RhY2stZGlnCTYtamFjayB3aXRoIFNQRElGIEkvTwotICAzc3RhY2stNjYwCTMtamFjayAoZm9yIEFMQzY2MCkKLSAgdW5pd2lsbC1tMzEJVW5pd2lsbCBNMzEgbGFwdG9wCi0gIHRvc2hpYmEJVG9zaGliYSBsYXB0b3Agc3VwcG9ydAotICBhc3VzCQlBc3VzIGxhcHRvcCBzdXBwb3J0Ci0gIGFzdXMtbGFwdG9wCUFTVVMgRjIvRjMgbGFwdG9wcwotICBhdXRvCQlhdXRvLWNvbmZpZyByZWFkaW5nIEJJT1MgKGRlZmF1bHQpCisgIE4vQQogCiBBTEM4NjFWRC82NjBWRAogPT09PT09PT09PT09PT0KLSAgM3N0YWNrCTMtamFjawotICAzc3RhY2stZGlnCTMtamFjayB3aXRoIFNQRElGIE9VVAotICA2c3RhY2stZGlnCTYtamFjayB3aXRoIFNQRElGIE9VVAotICAzc3RhY2stNjYwCTMtamFjayAoZm9yIEFMQzY2MFZEKQotICAzc3RhY2stNjYwLWRpZ291dCAzLWphY2sgd2l0aCBTUERJRiBPVVQgKGZvciBBTEM2NjBWRCkKLSAgbGVub3ZvCUxlbm92byAzMDAwIEMyMDAKLSAgZGFsbGFzCURhbGxhcyBsYXB0b3BzCi0gIGhwCQlIUCBUWDEwMDAKLSAgYXN1cy12MXMJQVNVUyBWMVNuCi0gIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKKyAgTi9BCiAKIENNSTk4ODAKID09PT09PT0KQEAgLTI4OSw3ICsyMzEsNiBAQAogICBocC1kdjY3MzYJSFAgZHY2NzM2CiAgIGhwLWY3MDAJSFAgQ29tcGFxIFByZXNhcmlvIEY3MDAKICAgaWRlYXBhZAlMZW5vdm8gSWRlYVBhZCBsYXB0b3AKLSAgbGVub3ZvLXgyMDAJTGVub3ZvIFgyMDAgbGFwdG9wCiAgIHRvc2hpYmEJVG9zaGliYSBTYXRlbGxpdGUgTTMwMAogCiBDb25leGFudCA1MDY2CkBAIC00MDgsNiArMzQ5LDcgQEAKICAgcmVmCQlSZWZlcmVuY2UgYm9hcmQKICAgbWljLXJlZglSZWZlcmVuY2UgYm9hcmQgd2l0aCBwb3dlciBtYW5hZ2VtZW50IGZvciBwb3J0cwogICBkZWxsLXMxNAlEZWxsIGxhcHRvcAorICBkZWxsLXZvc3Ryby0zNTAwCURlbGwgVm9zdHJvIDM1MDAgbGFwdG9wCiAgIGhwCQlIUCBsYXB0b3BzIHdpdGggKGludmVydGVkKSBtdXRlLUxFRAogICBocC1kdjctNDAwMAlIUCBkdi03IDQwMDAKICAgYXV0bwkJQklPUyBzZXR1cCAoZGVmYXVsdCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8udHh0CmluZGV4IGM4MmJlYjAuLjAzZTI3NzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLnR4dApAQCAtNDQ3LDcgKzQ0NywxMCBAQAogdGhyZWUgbnVtYmVycyBpbmRpY2F0aW5nIHRoZSBjb2RlYyB2ZW5kb3ItaWQgKDB4MTIzNDU2NzggaW4gdGhlCiBleGFtcGxlKSwgdGhlIGNvZGVjIHN1YnN5c3RlbS1pZCAoMHhhYmNkMTIzNCkgYW5kIHRoZSBhZGRyZXNzICgyKSBvZgogdGhlIGNvZGVjLiAgVGhlIHJlc3QgcGF0Y2ggZW50cmllcyBhcmUgYXBwbGllZCB0byB0aGlzIHNwZWNpZmllZCBjb2RlYwotdW50aWwgYW5vdGhlciBjb2RlYyBlbnRyeSBpcyBnaXZlbi4KK3VudGlsIGFub3RoZXIgY29kZWMgZW50cnkgaXMgZ2l2ZW4uICBQYXNzaW5nIDAgb3IgYSBuZWdhdGl2ZSBudW1iZXIgdG8KK3RoZSBmaXJzdCBvciB0aGUgc2Vjb25kIHZhbHVlIHdpbGwgbWFrZSB0aGUgY2hlY2sgb2YgdGhlIGNvcnJlc3BvbmRpbmcKK2ZpZWxkIGJlIHNraXBwZWQuICBJdCdsbCBiZSB1c2VmdWwgZm9yIHJlYWxseSBicm9rZW4gZGV2aWNlcyB0aGF0IGRvbid0Citpbml0aWFsaXplIFNTSUQgcHJvcGVybHkuCiAKIFRoZSBgW21vZGVsXWAgbGluZSBhbGxvd3MgdG8gY2hhbmdlIHRoZSBtb2RlbCBuYW1lIG9mIHRoZSBlYWNoIGNvZGVjLgogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGl0IHdpbGwgYmUgY2hhbmdlZCB0byBtb2RlbD1hdXRvLgpAQCAtNDkxLDcgKzQ5NCw3IEBACiBUaGUgaGQtYXVkaW8gZHJpdmVyIHJlYWRzIHRoZSBmaWxlIHZpYSByZXF1ZXN0X2Zpcm13YXJlKCkuICBUaHVzLAogYSBwYXRjaCBmaWxlIGhhcyB0byBiZSBsb2NhdGVkIG9uIHRoZSBhcHByb3ByaWF0ZSBmaXJtd2FyZSBwYXRoLAogdHlwaWNhbGx5LCAvbGliL2Zpcm13YXJlLiAgRm9yIGV4YW1wbGUsIHdoZW4geW91IHBhc3MgdGhlIG9wdGlvbgotYHBhdGNoPWhkYS1pbml0LmZ3YCwgdGhlIGZpbGUgL2xpYi9maXJtd2FyZS9oZGEtaW5pdC1mdyBtdXN0IGJlCitgcGF0Y2g9aGRhLWluaXQuZndgLCB0aGUgZmlsZSAvbGliL2Zpcm13YXJlL2hkYS1pbml0LmZ3IG11c3QgYmUKIHByZXNlbnQuCiAKIFRoZSBwYXRjaCBtb2R1bGUgb3B0aW9uIGlzIHNwZWNpZmljIHRvIGVhY2ggY2FyZCBpbnN0YW5jZSwgYW5kIHlvdQpAQCAtNTI0LDYgKzUyNyw1NCBAQAogY2hlY2sgdGhlIGN1cnJlbnQgdmFsdWUuICBJZiBpdCdzIG5vbi16ZXJvLCB0aGUgZmVhdHVyZSBpcyB0dXJuZWQgb24uCiAKIAorVHJhY2Vwb2ludHMKK35+fn5+fn5+fn5+CitUaGUgaGQtYXVkaW8gZHJpdmVyIGdpdmVzIGEgZmV3IGJhc2ljIHRyYWNlcG9pbnRzLgorYGhkYTpoZGFfc2VuZF9jbWRgIHRyYWNlcyBlYWNoIENPUkIgd3JpdGUgd2hpbGUgYGhkYTpoZGFfZ2V0X3Jlc3BvbnNlYAordHJhY2VzIHRoZSByZXNwb25zZSBmcm9tIFJJUkIgKG9ubHkgd2hlbiByZWFkIGZyb20gdGhlIGNvZGVjIGRyaXZlcikuCitgaGRhOmhkYV9idXNfcmVzZXRgIHRyYWNlcyB0aGUgYnVzLXJlc2V0IGR1ZSB0byBmYXRhbCBlcnJvciwgZXRjLAorYGhkYTpoZGFfdW5zb2xfZXZlbnRgIHRyYWNlcyB0aGUgdW5zb2xpY2l0ZWQgZXZlbnRzLCBhbmQKK2BoZGE6aGRhX3Bvd2VyX2Rvd25gIGFuZCBgaGRhOmhkYV9wb3dlcl91cGAgdHJhY2UgdGhlIHBvd2VyIGRvd24vdXAKK3ZpYSBwb3dlci1zYXZpbmcgYmVoYXZpb3IuCisKK0VuYWJsaW5nIGFsbCB0cmFjZXBvaW50cyBjYW4gYmUgZG9uZSBsaWtlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIyBlY2hvIDEgPiAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9oZGEvZW5hYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RoZW4gYWZ0ZXIgc29tZSBjb21tYW5kcywgeW91IGNhbiB0cmFjZXMgZnJvbQorL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy90cmFjZSBmaWxlLiAgRm9yIGV4YW1wbGUsIHdoZW4geW91IHdhbnQgdG8KK3RyYWNlIHdoYXQgY29kZWMgY29tbWFuZCBpcyBzZW50LCBlbmFibGUgdGhlIHRyYWNlcG9pbnQgbGlrZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAjIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlCisgICMgdHJhY2VyOiBub3AKKyAgIworICAjICAgICAgIFRBU0stUElEICAgIENQVSMgICAgVElNRVNUQU1QICBGVU5DVElPTgorICAjICAgICAgICAgIHwgfCAgICAgICB8ICAgICAgICAgIHwgICAgICAgICB8CisgICAgICAgICA8Li4uPi03ODA3ICBbMDAyXSAxMDUxNDcuNzc0ODg5OiBoZGFfc2VuZF9jbWQ6IFswOjBdIHZhbD1lM2EwMTkKKyAgICAgICAgIDwuLi4+LTc4MDcgIFswMDJdIDEwNTE0Ny43NzQ4OTM6IGhkYV9zZW5kX2NtZDogWzA6MF0gdmFsPWUzOTAxOQorICAgICAgICAgPC4uLj4tNzgwNyAgWzAwMl0gMTA1MTQ3Ljk5OTU0MjogaGRhX3NlbmRfY21kOiBbMDowXSB2YWw9ZTNhMDFhCisgICAgICAgICA8Li4uPi03ODA3ICBbMDAyXSAxMDUxNDcuOTk5NTQzOiBoZGFfc2VuZF9jbWQ6IFswOjBdIHZhbD1lMzkwMWEKKyAgICAgICAgIDwuLi4+LTI2NzY0IFswMDFdIDM0OTIyMi44MzcxNDM6IGhkYV9zZW5kX2NtZDogWzA6MF0gdmFsPWUzYTAxOQorICAgICAgICAgPC4uLj4tMjY3NjQgWzAwMV0gMzQ5MjIyLjgzNzE0ODogaGRhX3NlbmRfY21kOiBbMDowXSB2YWw9ZTM5MDE5CisgICAgICAgICA8Li4uPi0yNjc2NCBbMDAxXSAzNDkyMjMuMDU4NTM5OiBoZGFfc2VuZF9jbWQ6IFswOjBdIHZhbD1lM2EwMWEKKyAgICAgICAgIDwuLi4+LTI2NzY0IFswMDFdIDM0OTIyMy4wNTg1NDE6IGhkYV9zZW5kX2NtZDogWzA6MF0gdmFsPWUzOTAxYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitIZXJlIGBbMDowXWAgaW5kaWNhdGVzIHRoZSBjYXJkIG51bWJlciBhbmQgdGhlIGNvZGVjIGFkZHJlc3MsIGFuZAorYHZhbGAgc2hvd3MgdGhlIHZhbHVlIHNlbnQgdG8gdGhlIGNvZGVjLCByZXNwZWN0aXZlbHkuICBUaGUgdmFsdWUgaXMKK2EgcGFja2VkIHZhbHVlLCBhbmQgeW91IGNhbiBkZWNvZGUgaXQgdmlhIGhkYS1kZWNvZGUtdmVyYiBwcm9ncmFtCitpbmNsdWRlZCBpbiBoZGEtZW11IHBhY2thZ2UgYmVsb3cuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlIGUzYTAxOSBpcwordG8gc2V0IHRoZSBsZWZ0IG91dHB1dC1hbXAgdmFsdWUgdG8gMjUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgJSBoZGEtZGVjb2RlLXZlcmIgMHhlM2EwMTkKKyAgcmF3IHZhbHVlID0gMHgwMGUzYTAxOQorICBjaWQgPSAwLCBuaWQgPSAweDBlLCB2ZXJiID0gMHgzYTAsIHBhcm0gPSAweDE5CisgIHJhdyB2YWx1ZTogdmVyYiA9IDB4M2EwLCBwYXJtID0gMHgxOQorICB2ZXJibmFtZSA9IHNldF9hbXBfZ2Fpbl9tdXRlCisgIGFtcCByYXcgdmFsID0gMHhhMDE5CisgIG91dHB1dCwgbGVmdCwgaWR4PTAsIG11dGU9MCwgdmFsPTI1CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCiBEZXZlbG9wbWVudCBUcmVlCiB+fn5+fn5+fn5+fn5+fn5+CiBUaGUgbGF0ZXN0IGRldmVsb3BtZW50IGNvZGVzIGZvciBIRC1hdWRpbyBhcmUgZm91bmQgb24gc291bmQgZ2l0IHRyZWU6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dAppbmRleCA3MDRlNDc0Li4xZjI0NjM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKQEAgLTI0LDYgKzI0LDcgQEAKIC0gYm9vdGxvYWRlcl90eXBlCSAgICAgWyBYODYgb25seSBdCiAtIGJvb3Rsb2FkZXJfdmVyc2lvbgkgICAgIFsgWDg2IG9ubHkgXQogLSBjYWxsaG9tZQkJICAgICBbIFMzOTAgb25seSBdCistIGNhcF9sYXN0X2NhcAogLSBjb3JlX3BhdHRlcm4KIC0gY29yZV9waXBlX2xpbWl0CiAtIGNvcmVfdXNlc19waWQKQEAgLTE1NSw2ICsxNTYsMTMgQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorY2FwX2xhc3RfY2FwCisKK0hpZ2hlc3QgdmFsaWQgY2FwYWJpbGl0eSBvZiB0aGUgcnVubmluZyBrZXJuZWwuICBFeHBvcnRzCitDQVBfTEFTVF9DQVAgZnJvbSB0aGUga2VybmVsLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiBjb3JlX3BhdHRlcm46CiAKIGNvcmVfcGF0dGVybiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjb3JlIGR1bXBmaWxlIHBhdHRlcm4gbmFtZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvcG9zdHByb2Nlc3MvdHJhY2Utdm1zY2FuLXBvc3Rwcm9jZXNzLnBsIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9wb3N0cHJvY2Vzcy90cmFjZS12bXNjYW4tcG9zdHByb2Nlc3MucGwKaW5kZXggMTJjZWNjOC4uNGEzN2M0NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS9wb3N0cHJvY2Vzcy90cmFjZS12bXNjYW4tcG9zdHByb2Nlc3MucGwKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9wb3N0cHJvY2Vzcy90cmFjZS12bXNjYW4tcG9zdHByb2Nlc3MucGwKQEAgLTM3OSwxMCArMzc5LDEwIEBACiAKIAkJCSMgVG8gY2xvc2VyIG1hdGNoIHZtc3RhdCBzY2FubmluZyBzdGF0aXN0aWNzLCBvbmx5IGNvdW50IGlzb2xhdGVfYm90aAogCQkJIyBhbmQgaXNvbGF0ZV9pbmFjdGl2ZSBhcyBzY2FubmluZy4gaXNvbGF0ZV9hY3RpdmUgaXMgcm90YXRpb24KLQkJCSMgaXNvbGF0ZV9pbmFjdGl2ZSA9PSAwCi0JCQkjIGlzb2xhdGVfYWN0aXZlICAgPT0gMQotCQkJIyBpc29sYXRlX2JvdGggICAgID09IDIKLQkJCWlmICgkaXNvbGF0ZV9tb2RlICE9IDEpIHsKKwkJCSMgaXNvbGF0ZV9pbmFjdGl2ZSA9PSAxCisJCQkjIGlzb2xhdGVfYWN0aXZlICAgPT0gMgorCQkJIyBpc29sYXRlX2JvdGggICAgID09IDMKKwkJCWlmICgkaXNvbGF0ZV9tb2RlICE9IDIpIHsKIAkJCQkkcGVycHJvY2Vzc3BpZHskcHJvY2Vzc19waWR9LT57SElHSF9OUl9TQ0FOTkVEfSArPSAkbnJfc2Nhbm5lZDsKIAkJCX0KIAkJCSRwZXJwcm9jZXNzcGlkeyRwcm9jZXNzX3BpZH0tPntISUdIX05SX0NPTlRJR19ESVJUWX0gKz0gJG5yX2NvbnRpZ19kaXJ0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvQ0FSRExJU1QgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnRtNjAwMApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9DQVJETElTVApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50bTYwMDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvZ3NwY2EudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9nc3BjYS50eHQKaW5kZXggNWJmYTlhNy4uYjE1ZTI5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9nc3BjYS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9nc3BjYS50eHQKQEAgLTgsNiArOCw3IEBACiAtLS0tCiBzcGNhNTAxCQkwMDAwOjAwMDAJTXlzdEZyb21PcmkgVW5rbm93biBDYW1lcmEKIHNwY2E1MDgJCTAxMzA6MDEzMAlDbG9uZSBEaWdpdGFsIFdlYmNhbSAxMTA0MworemMzeHgJCTAzZjA6MWIwNwlIUCBQcmVtaXVtIFN0YXJ0ZXIgQ2FtCiBtNTYwMgkJMDQwMjo1NjAyCUFMaSBWaWRlbyBDYW1lcmEgQ29udHJvbGxlcgogc3BjYTUwMQkJMDQwYTowMDAyCUtvZGFrIERWQy0zMjUKIHNwY2E1MDAJCTA0MGE6MDMwMAlLb2RhayBFWjIwMApAQCAtMTkwLDYgKzE5MSw3IEBACiBvdjUxOQkJMDVhOTowNTMwCU9tbmlWaXNpb24KIG92NTE5CQkwNWE5OjI4MDAJT21uaVZpc2lvbiBTdXBlckNBTQogb3Y1MTkJCTA1YTk6NDUxOQlXZWJjYW0gQ2xhc3NpYworb3Y1MzRfOQkJMDVhOTo4MDY1CU9tbmlWaXNpb24gdGVzdCBraXQgb3Y1Mzgrb3Y5NzEyCiBvdjUxOQkJMDVhOTo4NTE5CU9tbmlWaXNpb24KIG92NTE5CQkwNWE5OmE1MTEJRC1MaW5rIFVTQiBEaWdpdGFsIFZpZGVvIENhbWVyYQogb3Y1MTkJCTA1YTk6YTUxOAlELUxpbmsgRFNCLUMzMTAgV2ViY2FtCkBAIC0xOTksNiArMjAxLDggQEAKIGdsODYwCQkwNWUzOmYxOTEJR2VuZXN5cyBMb2dpYyBQQyBDYW1lcmEKIHNwY2E1NjEJCTA2MGI6YTAwMQlNYXhlbGwgQ29tcGFjdCBQYyBQTTMKIHpjM3h4CQkwNjk4OjIwMDMJQ1RYIE03MzBWIGJ1aWx0IGluCit0b3BybwkJMDZhMjowMDAzCVRQNjgwMCBQQyBDYW1lcmEsIENtb1ggQ1gwMzQyIHdlYmNhbQordG9wcm8JCTA2YTI6NjgxMAlDcmVhdGl2ZSBRbWF4CiBudzgweAkJMDZhNTowMDAwCVR5cGhvb24gV2ViY2FtIDEwMCBVU0IKIG53ODB4CQkwNmE1OmQwMDEJRGl2aW8gYmFzZWQgd2ViY2Ftcwogbnc4MHgJCTA2YTU6ZDgwMAlEaXZpbyBDaGljb255IFR3aW5rbGVDYW0sIFRydXN0IFNwYWNlQ2FtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L29tYXAzaXNwLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvb21hcDNpc3AudHh0CmluZGV4IDY5YmUyYzcuLjVkZDE0MzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvb21hcDNpc3AudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvb21hcDNpc3AudHh0CkBAIC03MCwxMCArNzAsMTEgQEAKIFRoZSBPTUFQIDMgSVNQIGRyaXZlciBkb2VzIHN1cHBvcnQgdGhlIFY0TDIgZXZlbnQgaW50ZXJmYWNlIG9uIENDREMgYW5kCiBzdGF0aXN0aWNzIChBRVdCLCBBRiBhbmQgaGlzdG9ncmFtKSBzdWJkZXZzLgogCi1UaGUgQ0NEQyBzdWJkZXYgcHJvZHVjZXMgVjRMMl9FVkVOVF9PTUFQM0lTUF9IU19WUyB0eXBlIGV2ZW50IG9uIEhTX1ZTCi1pbnRlcnJ1cHQgd2hpY2ggaXMgdXNlZCB0byBzaWduYWwgZnJhbWUgc3RhcnQuIFRoZSBldmVudCBpcyB0cmlnZ2VyZWQgZXhhY3RseQotd2hlbiB0aGUgcmVjZXB0aW9uIG9mIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmcmFtZSBzdGFydHMgaW4gdGhlIENDREMgbW9kdWxlLgotVGhlIGV2ZW50IGNhbiBiZSBzdWJzY3JpYmVkIG9uIHRoZSBDQ0RDIHN1YmRldi4KK1RoZSBDQ0RDIHN1YmRldiBwcm9kdWNlcyBWNEwyX0VWRU5UX0ZSQU1FX1NZTkMgdHlwZSBldmVudCBvbiBIU19WUworaW50ZXJydXB0IHdoaWNoIGlzIHVzZWQgdG8gc2lnbmFsIGZyYW1lIHN0YXJ0LiBFYXJsaWVyIHZlcnNpb24gb2YgdGhpcworZHJpdmVyIHVzZWQgVjRMMl9FVkVOVF9PTUFQM0lTUF9IU19WUyBmb3IgdGhpcyBwdXJwb3NlLiBUaGUgZXZlbnQgaXMKK3RyaWdnZXJlZCBleGFjdGx5IHdoZW4gdGhlIHJlY2VwdGlvbiBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZnJhbWUgc3RhcnRzCitpbiB0aGUgQ0NEQyBtb2R1bGUuIFRoZSBldmVudCBjYW4gYmUgc3Vic2NyaWJlZCBvbiB0aGUgQ0NEQyBzdWJkZXYuCiAKIChXaGVuIHVzaW5nIHBhcmFsbGVsIGludGVyZmFjZSBvbmUgbXVzdCBwYXkgYWNjb3VudCB0byBjb3JyZWN0IGNvbmZpZ3VyYXRpb24KIG9mIHRoZSBWUyBzaWduYWwgcG9sYXJpdHkuIFRoaXMgaXMgYXV0b21hdGljYWxseSBjb3JyZWN0IHdoZW4gdXNpbmcgdGhlIHNlcmlhbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWNvbnRyb2xzLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1jb250cm9scy50eHQKaW5kZXggOTM0NmZjOC4uMjZhYTA1NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWNvbnRyb2xzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItY29udHJvbHMudHh0CkBAIC0yODUsMTEgKzI4NSwxMSBAQAogTm90ZSB0aGF0IHlvdSB1c2UgdGhlICduZXcgdmFsdWUnIHVuaW9uIGFzIHdlbGwgaW4gZ192b2xhdGlsZV9jdHJsLiBJbiBnZW5lcmFsCiBjb250cm9scyB0aGF0IG5lZWQgdG8gaW1wbGVtZW50IGdfdm9sYXRpbGVfY3RybCBhcmUgcmVhZC1vbmx5IGNvbnRyb2xzLgogCi1UbyBtYXJrIGEgY29udHJvbCBhcyB2b2xhdGlsZSB5b3UgaGF2ZSB0byBzZXQgdGhlIGlzX3ZvbGF0aWxlIGZsYWc6CitUbyBtYXJrIGEgY29udHJvbCBhcyB2b2xhdGlsZSB5b3UgaGF2ZSB0byBzZXQgVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEU6CiAKIAljdHJsID0gdjRsMl9jdHJsX25ld19zdGQoJnNkLT5jdHJsX2hhbmRsZXIsIC4uLik7CiAJaWYgKGN0cmwpCi0JCWN0cmwtPmlzX3ZvbGF0aWxlID0gMTsKKwkJY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEU7CiAKIEZvciB0cnkvc19jdHJsIHRoZSBuZXcgdmFsdWVzIChpLmUuIGFzIHBhc3NlZCBieSB0aGUgdXNlcikgYXJlIGZpbGxlZCBpbiBhbmQKIHlvdSBjYW4gbW9kaWZ5IHRoZW0gaW4gdHJ5X2N0cmwgb3Igc2V0IHRoZW0gaW4gc19jdHJsLiBUaGUgJ2N1cicgdW5pb24KQEAgLTM2Nyw4ICszNjcsNyBAQAogVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHByaXYgcG9pbnRlciB3aGljaCBjYW4gYmUgc2V0IHRvIGRyaXZlci1zcGVjaWZpYwogcHJpdmF0ZSBkYXRhLgogCi1UaGUgdjRsMl9jdHJsX2NvbmZpZyBzdHJ1Y3QgYWxzbyBoYXMgZmllbGRzIHRvIHNldCB0aGUgaXNfcHJpdmF0ZSBhbmQgaXNfdm9sYXRpbGUKLWZsYWdzLgorVGhlIHY0bDJfY3RybF9jb25maWcgc3RydWN0IGFsc28gaGFzIGEgZmllbGQgdG8gc2V0IHRoZSBpc19wcml2YXRlIGZsYWcuCiAKIElmIHRoZSBuYW1lIGZpZWxkIGlzIG5vdCBzZXQsIHRoZW4gdGhlIGZyYW1ld29yayB3aWxsIGFzc3VtZSB0aGlzIGlzIGEgc3RhbmRhcmQKIGNvbnRyb2wgYW5kIHdpbGwgZmlsbCBpbiB0aGUgbmFtZSwgdHlwZSBhbmQgZmxhZ3MgZmllbGRzIGFjY29yZGluZ2x5LgpAQCAtNDk2LDE4ICs0OTUsMjAgQEAKIAogQSBjb21tb24gdHlwZSBvZiBjb250cm9sIGNsdXN0ZXIgaXMgb25lIHRoYXQgaGFuZGxlcyAnYXV0by1mb28vZm9vJy10eXBlCiBjb250cm9scy4gVHlwaWNhbCBleGFtcGxlcyBhcmUgYXV0b2dhaW4vZ2FpbiwgYXV0b2V4cG9zdXJlL2V4cG9zdXJlLAotYXV0b3doaXRlYmFsYW5jZS9yZWQgYmFsYW5jZS9ibHVlIGJhbGFuY2UuIEluIGFsbCBjYXNlcyB5b3UgaGF2ZSBvbmUgY29udHJvbHMKK2F1dG93aGl0ZWJhbGFuY2UvcmVkIGJhbGFuY2UvYmx1ZSBiYWxhbmNlLiBJbiBhbGwgY2FzZXMgeW91IGhhdmUgb25lIGNvbnRyb2wKIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGFub3RoZXIgY29udHJvbCBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGhhcmR3YXJlLAogb3Igd2hldGhlciBpdCBpcyB1bmRlciBtYW51YWwgY29udHJvbCBmcm9tIHRoZSB1c2VyLgogCiBJZiB0aGUgY2x1c3RlciBpcyBpbiBhdXRvbWF0aWMgbW9kZSwgdGhlbiB0aGUgbWFudWFsIGNvbnRyb2xzIHNob3VsZCBiZQotbWFya2VkIGluYWN0aXZlLiBXaGVuIHRoZSB2b2xhdGlsZSBjb250cm9scyBhcmUgcmVhZCB0aGUgZ192b2xhdGlsZV9jdHJsCi1vcGVyYXRpb24gc2hvdWxkIHJldHVybiB0aGUgdmFsdWUgdGhhdCB0aGUgaGFyZHdhcmUncyBhdXRvbWF0aWMgbW9kZSBzZXQgdXAKLWF1dG9tYXRpY2FsbHkuCittYXJrZWQgaW5hY3RpdmUgYW5kIHZvbGF0aWxlLiBXaGVuIHRoZSB2b2xhdGlsZSBjb250cm9scyBhcmUgcmVhZCB0aGUKK2dfdm9sYXRpbGVfY3RybCBvcGVyYXRpb24gc2hvdWxkIHJldHVybiB0aGUgdmFsdWUgdGhhdCB0aGUgaGFyZHdhcmUncyBhdXRvbWF0aWMKK21vZGUgc2V0IHVwIGF1dG9tYXRpY2FsbHkuCiAKIElmIHRoZSBjbHVzdGVyIGlzIHB1dCBpbiBtYW51YWwgbW9kZSwgdGhlbiB0aGUgbWFudWFsIGNvbnRyb2xzIHNob3VsZCBiZWNvbWUKLWFjdGl2ZSBhZ2FpbiBhbmQgdGhlIGlzX3ZvbGF0aWxlIGZsYWcgc2hvdWxkIGJlIGlnbm9yZWQgKHNvIGdfdm9sYXRpbGVfY3RybCBpcwotbm8gbG9uZ2VyIGNhbGxlZCB3aGlsZSBpbiBtYW51YWwgbW9kZSkuCithY3RpdmUgYWdhaW4gYW5kIHRoZSB2b2xhdGlsZSBmbGFnIGlzIGNsZWFyZWQgKHNvIGdfdm9sYXRpbGVfY3RybCBpcyBubyBsb25nZXIKK2NhbGxlZCB3aGlsZSBpbiBtYW51YWwgbW9kZSkuIEluIGFkZGl0aW9uIGp1c3QgYmVmb3JlIHN3aXRjaGluZyB0byBtYW51YWwgbW9kZQordGhlIGN1cnJlbnQgdmFsdWVzIGFzIGRldGVybWluZWQgYnkgdGhlIGF1dG8gbW9kZSBhcmUgY29waWVkIGFzIHRoZSBuZXcgbWFudWFsCit2YWx1ZXMuCiAKIEZpbmFsbHkgdGhlIFY0TDJfQ1RSTF9GTEFHX1VQREFURSBzaG91bGQgYmUgc2V0IGZvciB0aGUgYXV0byBjb250cm9sIHNpbmNlCiBjaGFuZ2luZyB0aGF0IGNvbnRyb2wgYWZmZWN0cyB0aGUgY29udHJvbCBmbGFncyBvZiB0aGUgbWFudWFsIGNvbnRyb2xzLgpAQCAtNTIwLDcgKzUyMSwxMSBAQAogCiBUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBhcmUgaWRlbnRpY2FsIHRvIHY0bDJfY3RybF9jbHVzdGVyLiBUaGUgdGhpcmQgYXJndW1lbnQKIHRlbGxzIHRoZSBmcmFtZXdvcmsgd2hpY2ggdmFsdWUgc3dpdGNoZXMgdGhlIGNsdXN0ZXIgaW50byBtYW51YWwgbW9kZS4gVGhlCi1sYXN0IGFyZ3VtZW50IHdpbGwgb3B0aW9uYWxseSBzZXQgdGhlIGlzX3ZvbGF0aWxlIGZsYWcgZm9yIHRoZSBub24tYXV0byBjb250cm9scy4KK2xhc3QgYXJndW1lbnQgd2lsbCBvcHRpb25hbGx5IHNldCBWNEwyX0NUUkxfRkxBR19WT0xBVElMRSBmb3IgdGhlIG5vbi1hdXRvIGNvbnRyb2xzLgorSWYgaXQgaXMgZmFsc2UsIHRoZW4gdGhlIG1hbnVhbCBjb250cm9scyBhcmUgbmV2ZXIgdm9sYXRpbGUuIFlvdSB3b3VsZCB0eXBpY2FsbHkKK3VzZSB0aGF0IGlmIHRoZSBoYXJkd2FyZSBkb2VzIG5vdCBnaXZlIHlvdSB0aGUgb3B0aW9uIHRvIHJlYWQgYmFjayB0byB2YWx1ZXMgYXMKK2RldGVybWluZWQgYnkgdGhlIGF1dG8gbW9kZSAoZS5nLiBpZiBhdXRvZ2FpbiBpcyBvbiwgdGhlIGhhcmR3YXJlIGRvZXNuJ3QgYWxsb3cKK3lvdSB0byBvYnRhaW4gdGhlIGN1cnJlbnQgZ2FpbiB2YWx1ZSkuCiAKIFRoZSBmaXJzdCBjb250cm9sIG9mIHRoZSBjbHVzdGVyIGlzIGFzc3VtZWQgdG8gYmUgdGhlICdhdXRvJyBjb250cm9sLgogCkBAIC02ODEsMTYgKzY4Niw2IEBACiBjb3VudCBpZiBub3RoaW5nIHdhcyBkb25lIHlldC4gSWYgaXQgaXMgbGVzcyB0aGFuIGNvdW50IHRoZW4gb25seSB0aGUgY29udHJvbHMKIHVwIHRvIGVycm9yX2lkeC0xIHdlcmUgc3VjY2Vzc2Z1bGx5IGFwcGxpZWQuCiAKLTMpIFdoZW4gYXR0ZW1wdGluZyB0byByZWFkIGEgYnV0dG9uIGNvbnRyb2wgdGhlIGZyYW1ld29yayB3aWxsIHJldHVybiAtRUFDQ0VTCi1pbnN0ZWFkIG9mIC1FSU5WQUwgYXMgc3RhdGVkIGluIHRoZSBzcGVjLiBJdCBzZWVtcyB0byBtYWtlIG1vcmUgc2Vuc2Ugc2luY2UKLWJ1dHRvbiBjb250cm9scyBhcmUgd3JpdGUtb25seSBjb250cm9scy4KLQotNCkgQXR0ZW1wdGluZyB0byB3cml0ZSB0byBhIHJlYWQtb25seSBjb250cm9sIHdpbGwgcmV0dXJuIC1FQUNDRVMgaW5zdGVhZCBvZgotLUVJTlZBTCBhcyB0aGUgc3BlYyBzYXlzLgotCi01KSBUaGUgc3BlYyBkb2VzIG5vdCBtZW50aW9uIHdoYXQgc2hvdWxkIGhhcHBlbiB3aGVuIHlvdSB0cnkgdG8gc2V0L2dldCBhCi1jb250cm9sIGNsYXNzIGNvbnRyb2xzLiBUaGUgZnJhbWV3b3JrIHdpbGwgcmV0dXJuIC1FQUNDRVMuCi0KIAogUHJvcG9zYWxzIGZvciBFeHRlbnNpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTcwMyw5ICs2OTgsMyBAQAogMikgSXQgaXMgcG9zc2libGUgdG8gbWFyayBpbiB0aGUgY29udHJvbHMgYXJyYXkgd2hpY2ggY29udHJvbHMgaGF2ZSBiZWVuCiBzdWNjZXNzZnVsbHkgd3JpdHRlbiBhbmQgd2hpY2ggZmFpbGVkIGJ5IGZvciBleGFtcGxlIGFkZGluZyBhIGJpdCB0byB0aGUKIGNvbnRyb2wgSUQuIE5vdCBzdXJlIGlmIGl0IGlzIHdvcnRoIHRoZSBlZmZvcnQsIHRob3VnaC4KLQotMykgVHJ5aW5nIHRvIHNldCB2b2xhdGlsZSBpbmFjdGl2ZSBjb250cm9scyBzaG91bGQgcmVzdWx0IGluIC1FQUNDRVNTLgotCi00KSBBZGQgYSBuZXcgZmxhZyB0byBtYXJrIHZvbGF0aWxlIGNvbnRyb2xzLiBBbnkgYXBwbGljYXRpb24gdGhhdCB3YW50cwotdG8gc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9scyBjYW4gdGhlbiBza2lwIHZvbGF0aWxlIGluYWN0aXZlIGNvbnRyb2xzLgotQ3VycmVudGx5IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZXRlY3Qgc3VjaCBjb250cm9scy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dAppbmRleCBiMGU0YjljLi43OTQ1YjBiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2FwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9hcGkudHh0CkBAIC0xNzUsMTAgKzE3NSwzMCBAQAogUmV0dXJuczogdmNwdSBmZCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgogCiBUaGlzIEFQSSBhZGRzIGEgdmNwdSB0byBhIHZpcnR1YWwgbWFjaGluZS4gIFRoZSB2Y3B1IGlkIGlzIGEgc21hbGwgaW50ZWdlcgotaW4gdGhlIHJhbmdlIFswLCBtYXhfdmNwdXMpLiAgWW91IGNhbiB1c2UgS1ZNX0NBUF9OUl9WQ1BVUyBvZiB0aGUKLUtWTV9DSEVDS19FWFRFTlNJT04gaW9jdGwoKSB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIGZvciBtYXhfdmNwdXMgYXQgcnVuLXRpbWUuCitpbiB0aGUgcmFuZ2UgWzAsIG1heF92Y3B1cykuCisKK1RoZSByZWNvbW1lbmRlZCBtYXhfdmNwdXMgdmFsdWUgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgS1ZNX0NBUF9OUl9WQ1BVUyBvZgordGhlIEtWTV9DSEVDS19FWFRFTlNJT04gaW9jdGwoKSBhdCBydW4tdGltZS4KK1RoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlIGZvciBtYXhfdmNwdXMgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUKK0tWTV9DQVBfTUFYX1ZDUFVTIG9mIHRoZSBLVk1fQ0hFQ0tfRVhURU5TSU9OIGlvY3RsKCkgYXQgcnVuLXRpbWUuCisKIElmIHRoZSBLVk1fQ0FQX05SX1ZDUFVTIGRvZXMgbm90IGV4aXN0LCB5b3Ugc2hvdWxkIGFzc3VtZSB0aGF0IG1heF92Y3B1cyBpcyA0CiBjcHVzIG1heC4KK0lmIHRoZSBLVk1fQ0FQX01BWF9WQ1BVUyBkb2VzIG5vdCBleGlzdCwgeW91IHNob3VsZCBhc3N1bWUgdGhhdCBtYXhfdmNwdXMgaXMKK3NhbWUgYXMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gS1ZNX0NBUF9OUl9WQ1BVUy4KKworT24gcG93ZXJwYyB1c2luZyBib29rM3NfaHYgbW9kZSwgdGhlIHZjcHVzIGFyZSBtYXBwZWQgb250byB2aXJ0dWFsCit0aHJlYWRzIGluIG9uZSBvciBtb3JlIHZpcnR1YWwgQ1BVIGNvcmVzLiAgKFRoaXMgaXMgYmVjYXVzZSB0aGUKK2hhcmR3YXJlIHJlcXVpcmVzIGFsbCB0aGUgaGFyZHdhcmUgdGhyZWFkcyBpbiBhIENQVSBjb3JlIHRvIGJlIGluIHRoZQorc2FtZSBwYXJ0aXRpb24uKSAgVGhlIEtWTV9DQVBfUFBDX1NNVCBjYXBhYmlsaXR5IGluZGljYXRlcyB0aGUgbnVtYmVyCitvZiB2Y3B1cyBwZXIgdmlydHVhbCBjb3JlICh2Y29yZSkuICBUaGUgdmNvcmUgaWQgaXMgb2J0YWluZWQgYnkKK2RpdmlkaW5nIHRoZSB2Y3B1IGlkIGJ5IHRoZSBudW1iZXIgb2YgdmNwdXMgcGVyIHZjb3JlLiAgVGhlIHZjcHVzIGluIGEKK2dpdmVuIHZjb3JlIHdpbGwgYWx3YXlzIGJlIGluIHRoZSBzYW1lIHBoeXNpY2FsIGNvcmUgYXMgZWFjaCBvdGhlcgorKHRob3VnaCB0aGF0IG1pZ2h0IGJlIGEgZGlmZmVyZW50IHBoeXNpY2FsIGNvcmUgZnJvbSB0aW1lIHRvIHRpbWUpLgorVXNlcnNwYWNlIGNhbiBjb250cm9sIHRoZSB0aHJlYWRpbmcgKFNNVCkgbW9kZSBvZiB0aGUgZ3Vlc3QgYnkgaXRzCithbGxvY2F0aW9uIG9mIHZjcHUgaWRzLiAgRm9yIGV4YW1wbGUsIGlmIHVzZXJzcGFjZSB3YW50cworc2luZ2xlLXRocmVhZGVkIGd1ZXN0IHZjcHVzLCBpdCBzaG91bGQgbWFrZSBhbGwgdmNwdSBpZHMgYmUgYSBtdWx0aXBsZQorb2YgdGhlIG51bWJlciBvZiB2Y3B1cyBwZXIgdmNvcmUuCiAKIE9uIHBvd2VycGMgdXNpbmcgYm9vazNzX2h2IG1vZGUsIHRoZSB2Y3B1cyBhcmUgbWFwcGVkIG9udG8gdmlydHVhbAogdGhyZWFkcyBpbiBvbmUgb3IgbW9yZSB2aXJ0dWFsIENQVSBjb3Jlcy4gIChUaGlzIGlzIGJlY2F1c2UgdGhlCkBAIC0xNjMzLDMgKzE2NTMsNTAgQEAKIAkJY2hhciBwYWRkaW5nWzI1Nl07CiAJfTsKIH07CisKKzYuIENhcGFiaWxpdGllcyB0aGF0IGNhbiBiZSBlbmFibGVkCisKK1RoZXJlIGFyZSBjZXJ0YWluIGNhcGFiaWxpdGllcyB0aGF0IGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHZpcnR1YWwgQ1BVIHdoZW4KK2VuYWJsZWQuIFRvIGVuYWJsZSB0aGVtLCBwbGVhc2Ugc2VlIHNlY3Rpb24gNC4zNy4gQmVsb3cgeW91IGNhbiBmaW5kIGEgbGlzdCBvZgorY2FwYWJpbGl0aWVzIGFuZCB3aGF0IHRoZWlyIGVmZmVjdCBvbiB0aGUgdkNQVSBpcyB3aGVuIGVuYWJsaW5nIHRoZW0uCisKK1RoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgZGVzY3JpcHRpb246CisKKyAgQXJjaGl0ZWN0dXJlczogd2hpY2ggaW5zdHJ1Y3Rpb24gc2V0IGFyY2hpdGVjdHVyZXMgcHJvdmlkZSB0aGlzIGlvY3RsLgorICAgICAgeDg2IGluY2x1ZGVzIGJvdGggaTM4NiBhbmQgeDg2XzY0LgorCisgIFBhcmFtZXRlcnM6IHdoYXQgcGFyYW1ldGVycyBhcmUgYWNjZXB0ZWQgYnkgdGhlIGNhcGFiaWxpdHkuCisKKyAgUmV0dXJuczogdGhlIHJldHVybiB2YWx1ZS4gIEdlbmVyYWwgZXJyb3IgbnVtYmVycyAoRUJBREYsIEVOT01FTSwgRUlOVkFMKQorICAgICAgYXJlIG5vdCBkZXRhaWxlZCwgYnV0IGVycm9ycyB3aXRoIHNwZWNpZmljIG1lYW5pbmdzIGFyZS4KKworNi4xIEtWTV9DQVBfUFBDX09TSQorCitBcmNoaXRlY3R1cmVzOiBwcGMKK1BhcmFtZXRlcnM6IG5vbmUKK1JldHVybnM6IDAgb24gc3VjY2VzczsgLTEgb24gZXJyb3IKKworVGhpcyBjYXBhYmlsaXR5IGVuYWJsZXMgaW50ZXJjZXB0aW9uIG9mIE9TSSBoeXBlcmNhbGxzIHRoYXQgb3RoZXJ3aXNlIHdvdWxkCitiZSB0cmVhdGVkIGFzIG5vcm1hbCBzeXN0ZW0gY2FsbHMgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgZ3Vlc3QuIE9TSSBoeXBlcmNhbGxzCit3ZXJlIGludmVudGVkIGJ5IE1hYy1vbi1MaW51eCB0byBoYXZlIGEgc3RhbmRhcmRpemVkIGNvbW11bmljYXRpb24gbWVjaGFuaXNtCitiZXR3ZWVuIHRoZSBndWVzdCBhbmQgdGhlIGhvc3QuCisKK1doZW4gdGhpcyBjYXBhYmlsaXR5IGlzIGVuYWJsZWQsIEtWTV9FWElUX09TSSBjYW4gb2NjdXIuCisKKzYuMiBLVk1fQ0FQX1BQQ19QQVBSCisKK0FyY2hpdGVjdHVyZXM6IHBwYworUGFyYW1ldGVyczogbm9uZQorUmV0dXJuczogMCBvbiBzdWNjZXNzOyAtMSBvbiBlcnJvcgorCitUaGlzIGNhcGFiaWxpdHkgZW5hYmxlcyBpbnRlcmNlcHRpb24gb2YgUEFQUiBoeXBlcmNhbGxzLiBQQVBSIGh5cGVyY2FsbHMgYXJlCitkb25lIHVzaW5nIHRoZSBoeXBlcmNhbGwgaW5zdHJ1Y3Rpb24gInNjIDEiLgorCitJdCBhbHNvIHNldHMgdGhlIGd1ZXN0IHByaXZpbGVnZSBsZXZlbCB0byAic3VwZXJ2aXNvciIgbW9kZS4gVXN1YWxseSB0aGUgZ3Vlc3QKK3J1bnMgaW4gImh5cGVydmlzb3IiIHByaXZpbGVnZSBtb2RlIHdpdGggYSBmZXcgbWlzc2luZyBmZWF0dXJlcy4KKworSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlLCBpdCBjaGFuZ2VzIHRoZSBzZW1hbnRpY3Mgb2YgU0RSMS4gSW4gdGhpcyBtb2RlLCB0aGUKK0hUQUIgYWRkcmVzcyBwYXJ0IG9mIFNEUjEgY29udGFpbnMgYW4gSFZBIGluc3RlYWQgb2YgYSBHUEEsIGFzIFBBUFIga2VlcHMgdGhlCitIVEFCIGludmlzaWJsZSB0byB0aGUgZ3Vlc3QuCisKK1doZW4gdGhpcyBjYXBhYmlsaXR5IGlzIGVuYWJsZWQsIEtWTV9FWElUX1BBUFJfSENBTEwgY2FuIG9jY3VyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC91bWwvVXNlck1vZGVMaW51eC1IT1dUTy50eHQKaW5kZXggNWQwZmM4Yi4uNzdkZmVjZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CkBAIC0xMzQsMTMgKzEzNCwxMyBAQAogCiAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIAotICAxCDEuCC4gIEkISW4IbnQIdHIIcm8Ib2QIZHUIdWMIY3QIdGkIaW8Ib24IbgorICAxLiAgSW50cm9kdWN0aW9uCiAKICAgV2VsY29tZSB0byBVc2VyIE1vZGUgTGludXguICBJdCdzIGdvaW5nIHRvIGJlIGZ1bi4KIAogCiAKLSAgMQgxLgguMQgxLgguICBICEhvCG93CHcgaQhpcwhzIFUIVXMIc2UIZXIIciBNCE1vCG9kCGRlCGUgTAhMaQhpbghudQh1eAh4IEQIRGkIaWYIZmYIZmUIZXIIcmUIZW4IbnQIdD8IPworICAxLjEuICBIb3cgaXMgVXNlciBNb2RlIExpbnV4IERpZmZlcmVudD8KIAogICBOb3JtYWxseSwgdGhlIExpbnV4IEtlcm5lbCB0YWxrcyBzdHJhaWdodCB0byB5b3VyIGhhcmR3YXJlICh2aWRlbwogICBjYXJkLCBrZXlib2FyZCwgaGFyZCBkcml2ZXMsIGV0YyksIGFuZCBhbnkgcHJvZ3JhbXMgd2hpY2ggcnVuIGFzayB0aGUKQEAgLTE4MSw3ICsxODEsNyBAQAogCiAKIAotICAxCDEuCC4yCDIuCC4gIFcIV2gIaHkIeSBXCFdvCG91CHVsCGxkCGQgSQhJIFcIV2EIYW4IbnQIdCBVCFVzCHNlCGVyCHIgTQhNbwhvZAhkZQhlIEwITGkIaW4IbnUIdXgIeD8IPworICAxLjIuICBXaHkgV291bGQgSSBXYW50IFVzZXIgTW9kZSBMaW51eD8KIAogCiAgIDEuIElmIFVzZXIgTW9kZSBMaW51eCBjcmFzaGVzLCB5b3VyIGhvc3Qga2VybmVsIGlzIHN0aWxsIGZpbmUuCkBAIC0yMDYsMTIgKzIwNiwxMiBAQAogCiAKIAotICAyCDIuCC4gIEMIQ28Ib20IbXAIcGkIaWwIbGkIaW4IbmcIZyB0CHRoCGhlCGUgawhrZQhlcghybghuZQhlbAhsIGEIYW4IbmQIZCBtCG1vCG9kCGR1CHVsCGxlCGVzCHMKKyAgMi4gIENvbXBpbGluZyB0aGUga2VybmVsIGFuZCBtb2R1bGVzCiAKIAogCiAKLSAgMggyLgguMQgxLgguICBDCENvCG9tCG1wCHBpCGlsCGxpCGluCG5nCGcgdAh0aAhoZQhlIGsIa2UIZXIIcm4IbmUIZWwIbAorICAyLjEuICBDb21waWxpbmcgdGhlIGtlcm5lbAogCiAKICAgQ29tcGlsaW5nIHRoZSB1c2VyIG1vZGUga2VybmVsIGlzIGp1c3QgbGlrZSBjb21waWxpbmcgYW55IG90aGVyCkBAIC0zMjIsNyArMzIyLDcgQEAKICAgYnVnIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdGhhdCBoYXZlIGdvbmUgaW50byBzdWJzZXF1ZW50IHJlbGVhc2VzLgogCiAKLSAgMggyLgguMggyLgguICBDCENvCG9tCG1wCHBpCGlsCGxpCGluCG5nCGcgYQhhbghuZAhkIGkIaW4IbnMIc3QIdGEIYWwIbGwIbGkIaW4IbmcIZyBrCGtlCGVyCHJuCG5lCGVsCGwgbQhtbwhvZAhkdQh1bAhsZQhlcwhzCisgIDIuMi4gIENvbXBpbGluZyBhbmQgaW5zdGFsbGluZyBrZXJuZWwgbW9kdWxlcwogCiAgIFVNTCBtb2R1bGVzIGFyZSBidWlsdCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIG5hdGl2ZSBrZXJuZWwgKHdpdGggdGhlCiAgIGV4Y2VwdGlvbiBvZiB0aGUgJ0FSQ0g9dW0nIHRoYXQgeW91IGFsd2F5cyBuZWVkIGZvciBVTUwpOgpAQCAtMzg2LDE5ICszODYsMTkgQEAKIAogCiAKLSAgMggyLgguMwgzLgguICBDCENvCG9tCG1wCHBpCGlsCGxpCGluCG5nCGcgYQhhbghuZAhkIGkIaW4IbnMIc3QIdGEIYWwIbGwIbGkIaW4IbmcIZyB1CHVtCG1sCGxfCF91CHV0CHRpCGlsCGxpCGl0CHRpCGllCGVzCHMKKyAgMi4zLiAgQ29tcGlsaW5nIGFuZCBpbnN0YWxsaW5nIHVtbF91dGlsaXRpZXMKIAogICBNYW55IGZlYXR1cmVzIG9mIHRoZSBVTUwga2VybmVsIHJlcXVpcmUgYSB1c2VyLXNwYWNlIGhlbHBlciBwcm9ncmFtLAogICBzbyBhIHVtbF91dGlsaXRpZXMgcGFja2FnZSBpcyBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIGtlcm5lbAogICBwYXRjaCB3aGljaCBwcm92aWRlcyB0aGVzZSBoZWxwZXJzLiBJbmNsdWRlZCB3aXRoaW4gdGhpcyBpczoKIAotICArCG8gIHBvcnQtaGVscGVyIC0gVXNlZCBieSBjb25zb2xlcyB3aGljaCBjb25uZWN0IHRvIHh0ZXJtcyBvciBwb3J0cworICBvICBwb3J0LWhlbHBlciAtIFVzZWQgYnkgY29uc29sZXMgd2hpY2ggY29ubmVjdCB0byB4dGVybXMgb3IgcG9ydHMKIAotICArCG8gIHR1bmN0bCAtIENvbmZpZ3VyYXRpb24gdG9vbCB0byBjcmVhdGUgYW5kIGRlbGV0ZSB0YXAgZGV2aWNlcworICBvICB0dW5jdGwgLSBDb25maWd1cmF0aW9uIHRvb2wgdG8gY3JlYXRlIGFuZCBkZWxldGUgdGFwIGRldmljZXMKIAotICArCG8gIHVtbF9uZXQgLSBTZXR1aWQgYmluYXJ5IGZvciBhdXRvbWF0aWMgdGFwIGRldmljZSBjb25maWd1cmF0aW9uCisgIG8gIHVtbF9uZXQgLSBTZXR1aWQgYmluYXJ5IGZvciBhdXRvbWF0aWMgdGFwIGRldmljZSBjb25maWd1cmF0aW9uCiAKLSAgKwhvICB1bWxfc3dpdGNoIC0gVXNlci1zcGFjZSB2aXJ0dWFsIHN3aXRjaCByZXF1aXJlZCBmb3IgZGFlbW9uCisgIG8gIHVtbF9zd2l0Y2ggLSBVc2VyLXNwYWNlIHZpcnR1YWwgc3dpdGNoIHJlcXVpcmVkIGZvciBkYWVtb24KICAgICAgdHJhbnNwb3J0CiAKICAgICAgVGhlIHVtbF91dGlsaXRpZXMgdHJlZSBpcyBjb21waWxlZCB3aXRoOgpAQCAtNDIzLDExICs0MjMsMTEgQEAKIAogCiAKLSAgMwgzLgguICBSCFJ1CHVuCG5uCG5pCGluCG5nCGcgVQhVTQhNTAhMIGEIYW4IbmQIZCBsCGxvCG9nCGdnCGdpCGluCG5nCGcgaQhpbghuCisgIDMuICBSdW5uaW5nIFVNTCBhbmQgbG9nZ2luZyBpbgogCiAKIAotICAzCDMuCC4xCDEuCC4gIFIIUnUIdW4Ibm4IbmkIaW4IbmcIZyBVCFVNCE1MCEwKKyAgMy4xLiAgUnVubmluZyBVTUwKIAogICBJdCBydW5zIG9uIDIuMi4xNSBvciBsYXRlciwgYW5kIGFsbCAyLjQga2VybmVscy4KIApAQCAtNDU0LDcgKzQ1NCw3IEBACiAKIAogCi0gIDMIMy4ILjIIMi4ILiAgTAhMbwhvZwhnZwhnaQhpbghuZwhnIGkIaW4IbgorICAzLjIuICBMb2dnaW5nIGluCiAKIAogCkBAIC00NjgsNyArNDY4LDcgQEAKIAogICBUaGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3RoZXIgd2F5cyB0byBsb2cgaW46CiAKLSAgKwhvICBPbiBhIHZpcnR1YWwgY29uc29sZQorICBvICBPbiBhIHZpcnR1YWwgY29uc29sZQogCiAKIApAQCAtNDgwLDcgKzQ4MCw3IEBACiAKIAogCi0gICsIbyAgT3ZlciB0aGUgc2VyaWFsIGxpbmUKKyAgbyAgT3ZlciB0aGUgc2VyaWFsIGxpbmUKIAogCiAgICAgIEluIHRoZSBib290IG91dHB1dCwgZmluZCBhIGxpbmUgdGhhdCBsb29rcyBsaWtlOgpAQCAtNTAzLDcgKzUwMyw3IEBACiAKIAogCi0gICsIbyAgT3ZlciB0aGUgbmV0CisgIG8gIE92ZXIgdGhlIG5ldAogCiAKICAgICAgSWYgdGhlIG5ldHdvcmsgaXMgcnVubmluZywgdGhlbiB5b3UgY2FuIHRlbG5ldCB0byB0aGUgdmlydHVhbApAQCAtNTE0LDEzICs1MTQsMTMgQEAKICAgZG93biBhbmQgdGhlIHByb2Nlc3Mgd2lsbCBleGl0LgogCiAKLSAgMwgzLgguMwgzLgguICBFCEV4CHhhCGFtCG1wCHBsCGxlCGVzCHMKKyAgMy4zLiAgRXhhbXBsZXMKIAogICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIFVNTCBpbiBhY3Rpb246CiAKLSAgKwhvICBBIGxvZ2luIHNlc3Npb24gPGh0dHA6Ly91c2VyLW1vZGUtbGludXguc291cmNlZm9yZ2UubmV0L2xvZ2luLmh0bWw+CisgIG8gIEEgbG9naW4gc2Vzc2lvbiA8aHR0cDovL3VzZXItbW9kZS1saW51eC5zb3VyY2Vmb3JnZS5uZXQvbG9naW4uaHRtbD4KIAotICArCG8gIEEgdmlydHVhbCBuZXR3b3JrIDxodHRwOi8vdXNlci1tb2RlLWxpbnV4LnNvdXJjZWZvcmdlLm5ldC9uZXQuaHRtbD4KKyAgbyAgQSB2aXJ0dWFsIG5ldHdvcmsgPGh0dHA6Ly91c2VyLW1vZGUtbGludXguc291cmNlZm9yZ2UubmV0L25ldC5odG1sPgogCiAKIApAQCAtNTI4LDEyICs1MjgsMTIgQEAKIAogCiAKLSAgNAg0LgguICBVCFVNCE1MCEwgbwhvbghuIDIIMkcIRy8ILzIIMkcIRyBoCGhvCG9zCHN0CHRzCHMKKyAgNC4gIFVNTCBvbiAyRy8yRyBob3N0cwogCiAKIAogCi0gIDQINC4ILjEIMS4ILiAgSQhJbghudAh0cghybwhvZAhkdQh1YwhjdAh0aQhpbwhvbghuCisgIDQuMS4gIEludHJvZHVjdGlvbgogCiAKICAgTW9zdCBMaW51eCBtYWNoaW5lcyBhcmUgY29uZmlndXJlZCBzbyB0aGF0IHRoZSBrZXJuZWwgb2NjdXBpZXMgdGhlCkBAIC01NDYsNyArNTQ2LDcgQEAKIAogCiAKLSAgNAg0LgguMggyLgguICBUCFRoCGhlCGUgcAhwcghybwhvYghibAhsZQhlbQhtCisgIDQuMi4gIFRoZSBwcm9ibGVtCiAKIAogICBUaGUgcHJlYnVpbHQgVU1MIGJpbmFyaWVzIG9uIHRoaXMgc2l0ZSB3aWxsIG5vdCBydW4gb24gMkcvMkcgaG9zdHMKQEAgLTU1OCw3ICs1NTgsNyBAQAogCiAKIAotICA0CDQuCC4zCDMuCC4gIFQIVGgIaGUIZSBzCHNvCG9sCGx1CHV0CHRpCGlvCG9uCG4KKyAgNC4zLiAgVGhlIHNvbHV0aW9uCiAKIAogICBUaGUgZml4IGZvciB0aGlzIGlzIHRvIHJlYnVpbGQgVU1MIGZyb20gc291cmNlIGFmdGVyIGVuYWJsaW5nCkBAIC01NzYsNyArNTc2LDcgQEAKIAogCiAKLSAgNQg1LgguICBTCFNlCGV0CHR0CHRpCGluCG5nCGcgdQh1cAhwIHMIc2UIZXIIcmkIaWEIYWwIbCBsCGxpCGluCG5lCGVzCHMgYQhhbghuZAhkIGMIY28Ib24IbnMIc28Ib2wIbGUIZXMIcworICA1LiAgU2V0dGluZyB1cCBzZXJpYWwgbGluZXMgYW5kIGNvbnNvbGVzCiAKIAogICBJdCBpcyBwb3NzaWJsZSB0byBhdHRhY2ggVU1MIHNlcmlhbCBsaW5lcyBhbmQgY29uc29sZXMgdG8gbWFueSB0eXBlcwpAQCAtNTg2LDEyICs1ODYsMTIgQEAKICAgWW91IGNhbiBhdHRhY2ggdGhlbSB0byBob3N0IHB0eXMsIHR0eXMsIGZpbGUgZGVzY3JpcHRvcnMsIGFuZCBwb3J0cy4KICAgVGhpcyBhbGxvd3MgeW91IHRvIGRvIHRoaW5ncyBsaWtlCiAKLSAgKwhvICBoYXZlIGEgVU1MIGNvbnNvbGUgYXBwZWFyIG9uIGFuIHVudXNlZCBob3N0IGNvbnNvbGUsCisgIG8gIGhhdmUgYSBVTUwgY29uc29sZSBhcHBlYXIgb24gYW4gdW51c2VkIGhvc3QgY29uc29sZSwKIAotICArCG8gIGhvb2sgdHdvIHZpcnR1YWwgbWFjaGluZXMgdG9nZXRoZXIgYnkgaGF2aW5nIG9uZSBhdHRhY2ggdG8gYSBwdHkKKyAgbyAgaG9vayB0d28gdmlydHVhbCBtYWNoaW5lcyB0b2dldGhlciBieSBoYXZpbmcgb25lIGF0dGFjaCB0byBhIHB0eQogICAgICBhbmQgaGF2aW5nIHRoZSBvdGhlciBhdHRhY2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgdHR5CiAKLSAgKwhvICBtYWtlIGEgdmlydHVhbCBtYWNoaW5lIGFjY2Vzc2libGUgZnJvbSB0aGUgbmV0IGJ5IGF0dGFjaGluZyBhCisgIG8gIG1ha2UgYSB2aXJ0dWFsIG1hY2hpbmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBuZXQgYnkgYXR0YWNoaW5nIGEKICAgICAgY29uc29sZSB0byBhIHBvcnQgb24gdGhlIGhvc3QuCiAKIApAQCAtNTk5LDcgKzU5OSw3IEBACiAKIAogCi0gIDUINS4ILjEIMS4ILiAgUwhTcAhwZQhlYwhjaQhpZghmeQh5aQhpbghuZwhnIHQIdGgIaGUIZSBkCGRlCGV2CHZpCGljCGNlCGUKKyAgNS4xLiAgU3BlY2lmeWluZyB0aGUgZGV2aWNlCiAKICAgRGV2aWNlcyBhcmUgc3BlY2lmaWVkIHdpdGggImNvbiIgb3IgInNzbCIgKGNvbnNvbGUgb3Igc2VyaWFsIGxpbmUsCiAgIHJlc3BlY3RpdmVseSksIG9wdGlvbmFsbHkgd2l0aCBhIGRldmljZSBudW1iZXIgaWYgeW91IGFyZSB0YWxraW5nCkBAIC02MjYsMTMgKzYyNiwxMyBAQAogCiAKIAotICA1CDUuCC4yCDIuCC4gIFMIU3AIcGUIZWMIY2kIaWYIZnkIeWkIaW4IbmcIZyB0CHRoCGhlCGUgYwhjaAhoYQhhbghubghuZQhlbAhsCisgIDUuMi4gIFNwZWNpZnlpbmcgdGhlIGNoYW5uZWwKIAogICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IHR5cGVzIG9mIGNoYW5uZWxzIHRvIGF0dGFjaCBhIFVNTAogICBkZXZpY2UgdG8sIGVhY2ggd2l0aCBhIGRpZmZlcmVudCB3YXkgb2Ygc3BlY2lmeWluZyBleGFjdGx5IHdoYXQgdG8KICAgYXR0YWNoIHRvLgogCi0gICsIbyAgcHNldWRvLXRlcm1pbmFscyAtIGRldmljZT1wdHkgcHRzIHRlcm1pbmFscyAtIGRldmljZT1wdHMKKyAgbyAgcHNldWRvLXRlcm1pbmFscyAtIGRldmljZT1wdHkgcHRzIHRlcm1pbmFscyAtIGRldmljZT1wdHMKIAogCiAgICAgIFRoaXMgd2lsbCBjYXVzZSBVTUwgdG8gYWxsb2NhdGUgYSBmcmVlIGhvc3QgcHNldWRvLXRlcm1pbmFsIGZvciB0aGUKQEAgLTY0MCwyMCArNjQwLDIwIEBACiAgICAgIGxvZy4gIFlvdSBhY2Nlc3MgaXQgYnkgYXR0YWNoaW5nIGEgdGVybWluYWwgcHJvZ3JhbSB0byB0aGUKICAgICAgY29ycmVzcG9uZGluZyB0dHk6CiAKLSAgKwhvICBzY3JlZW4gL2Rldi9wdHMvbgorICBvICBzY3JlZW4gL2Rldi9wdHMvbgogCi0gICsIbyAgc2NyZWVuIC9kZXYvdHR5eHgKKyAgbyAgc2NyZWVuIC9kZXYvdHR5eHgKIAotICArCG8gIG1pbmljb20gLW8gLXAgL2Rldi90dHl4eCAtIG1pbmljb20gc2VlbXMgbm90IGFibGUgdG8gaGFuZGxlIHB0cworICBvICBtaW5pY29tIC1vIC1wIC9kZXYvdHR5eHggLSBtaW5pY29tIHNlZW1zIG5vdCBhYmxlIHRvIGhhbmRsZSBwdHMKICAgICAgZGV2aWNlcwogCi0gICsIbyAga2VybWl0IC0gc3RhcnQgaXQgdXAsICdvcGVuJyB0aGUgZGV2aWNlLCB0aGVuICdjb25uZWN0JworICBvICBrZXJtaXQgLSBzdGFydCBpdCB1cCwgJ29wZW4nIHRoZSBkZXZpY2UsIHRoZW4gJ2Nvbm5lY3QnCiAKIAogCiAKIAotICArCG8gIHRlcm1pbmFscyAtIGRldmljZT10dHk6dHR5IGRldmljZSBmaWxlCisgIG8gIHRlcm1pbmFscyAtIGRldmljZT10dHk6dHR5IGRldmljZSBmaWxlCiAKIAogICAgICBUaGlzIHdpbGwgbWFrZSBVTUwgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIHNwZWNpZmllZCB0dHkgKGkuZQpAQCAtNjcyLDcgKzY3Miw3IEBACiAKIAogCi0gICsIbyAgeHRlcm1zIC0gZGV2aWNlPXh0ZXJtCisgIG8gIHh0ZXJtcyAtIGRldmljZT14dGVybQogCiAKICAgICAgVU1MIHdpbGwgcnVuIGFuIHh0ZXJtIGFuZCB0aGUgZGV2aWNlIHdpbGwgYmUgYXR0YWNoZWQgdG8gaXQuCkBAIC02ODEsNyArNjgxLDcgQEAKIAogCiAKLSAgKwhvICBQb3J0IC0gZGV2aWNlPXBvcnQ6cG9ydCBudW1iZXIKKyAgbyAgUG9ydCAtIGRldmljZT1wb3J0OnBvcnQgbnVtYmVyCiAKIAogICAgICBUaGlzIHdpbGwgYXR0YWNoIHRoZSBVTUwgZGV2aWNlcyB0byB0aGUgc3BlY2lmaWVkIGhvc3QgcG9ydC4KQEAgLTcyNSw3ICs3MjUsNyBAQAogCiAKIAotICArCG8gIGFscmVhZHktZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9ycyAtIGRldmljZT1maWxlIGRlc2NyaXB0b3IKKyAgbyAgYWxyZWFkeS1leGlzdGluZyBmaWxlIGRlc2NyaXB0b3JzIC0gZGV2aWNlPWZpbGUgZGVzY3JpcHRvcgogCiAKICAgICAgSWYgeW91IHNldCB1cCBhIGZpbGUgZGVzY3JpcHRvciBvbiB0aGUgVU1MIGNvbW1hbmQgbGluZSwgeW91IGNhbgpAQCAtNzQzLDcgKzc0Myw3IEBACiAKIAogCi0gICsIbyAgTm90aGluZyAtIGRldmljZT1udWxsCisgIG8gIE5vdGhpbmcgLSBkZXZpY2U9bnVsbAogCiAKICAgICAgVGhpcyBhbGxvd3MgdGhlIGRldmljZSB0byBiZSBvcGVuZWQsIGluIGNvbnRyYXN0IHRvICdub25lJywgYnV0CkBAIC03NTQsNyArNzU0LDcgQEAKIAogCiAKLSAgKwhvICBOb25lIC0gZGV2aWNlPW5vbmUKKyAgbyAgTm9uZSAtIGRldmljZT1ub25lCiAKIAogICAgICBUaGlzIGNhdXNlcyB0aGUgZGV2aWNlIHRvIGRpc2FwcGVhci4KQEAgLTc3MCw3ICs3NzAsNyBAQAogCiAKIAotICB3aWxsIGNhdXNlIHNlcmlhbCBsaW5lIDMgdG8gYWNjZXB0IGlucHV0IG9uIHRoZSBob3N0J3MgL2Rldi90dHkzIGFuZAorICB3aWxsIGNhdXNlIHNlcmlhbCBsaW5lIDMgdG8gYWNjZXB0IGlucHV0IG9uIHRoZSBob3N0J3MgL2Rldi90dHkyIGFuZAogICBkaXNwbGF5IG91dHB1dCBvbiBhbiB4dGVybS4gIFRoYXQncyBhIHNpbGx5IGV4YW1wbGUgLSB0aGUgbW9zdCBjb21tb24KICAgdXNlIG9mIHRoaXMgc3ludGF4IGlzIHRvIHJlYXR0YWNoIHRoZSBtYWluIGNvbnNvbGUgdG8gc3RkaW4gYW5kIHN0ZG91dAogICBhcyBzaG93biBhYm92ZS4KQEAgLTc4NSw3ICs3ODUsNyBAQAogCiAKIAotICA1CDUuCC4zCDMuCC4gIEUIRXgIeGEIYW0IbXAIcGwIbGUIZXMIcworICA1LjMuICBFeGFtcGxlcwogCiAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBpbnRlcmVzdGluZyB0aGluZ3MgeW91IGNhbiBkbyB3aXRoIHRoaXMKICAgY2FwYWJpbGl0eS4KQEAgLTgzOCw3ICs4MzgsNyBAQAogICBwcm9tcHQgb2YgdGhlIG90aGVyIHZpcnR1YWwgbWFjaGluZS4KIAogCi0gIDYINi4ILiAgUwhTZQhldAh0dAh0aQhpbghuZwhnIHUIdXAIcCB0CHRoCGhlCGUgbghuZQhldAh0dwh3bwhvcghyawhrCisgIDYuICBTZXR0aW5nIHVwIHRoZSBuZXR3b3JrCiAKIAogCkBAIC04NTgsMTkgKzg1OCwxOSBAQAogICBUaGVyZSBhcmUgY3VycmVudGx5IGZpdmUgdHJhbnNwb3J0IHR5cGVzIGF2YWlsYWJsZSBmb3IgYSBVTUwgdmlydHVhbAogICBtYWNoaW5lIHRvIGV4Y2hhbmdlIHBhY2tldHMgd2l0aCBvdGhlciBob3N0czoKIAotICArCG8gIGV0aGVydGFwCisgIG8gIGV0aGVydGFwCiAKLSAgKwhvICBUVU4vVEFQCisgIG8gIFRVTi9UQVAKIAotICArCG8gIE11bHRpY2FzdAorICBvICBNdWx0aWNhc3QKIAotICArCG8gIGEgc3dpdGNoIGRhZW1vbgorICBvICBhIHN3aXRjaCBkYWVtb24KIAotICArCG8gIHNsaXAKKyAgbyAgc2xpcAogCi0gICsIbyAgc2xpcnAKKyAgbyAgc2xpcnAKIAotICArCG8gIHBjYXAKKyAgbyAgcGNhcAogCiAgICAgIFRoZSBUVU4vVEFQLCBldGhlcnRhcCwgc2xpcCwgYW5kIHNsaXJwIHRyYW5zcG9ydHMgYWxsb3cgYSBVTUwKICAgICAgaW5zdGFuY2UgdG8gZXhjaGFuZ2UgcGFja2V0cyB3aXRoIHRoZSBob3N0LiAgVGhleSBtYXkgYmUgZGlyZWN0ZWQKQEAgLTg5MywyOCArODkzLDI4IEBACiAgIFdpdGggc28gbWFueSBob3N0IHRyYW5zcG9ydHMsIHdoaWNoIG9uZSBzaG91bGQgeW91IHVzZT8gIEhlcmUncyB3aGVuCiAgIHlvdSBzaG91bGQgdXNlIGVhY2ggb25lOgogCi0gICsIbyAgZXRoZXJ0YXAgLSBpZiB5b3Ugd2FudCBhY2Nlc3MgdG8gdGhlIGhvc3QgbmV0d29ya2luZyBhbmQgaXQgaXMKKyAgbyAgZXRoZXJ0YXAgLSBpZiB5b3Ugd2FudCBhY2Nlc3MgdG8gdGhlIGhvc3QgbmV0d29ya2luZyBhbmQgaXQgaXMKICAgICAgcnVubmluZyAyLjIKIAotICArCG8gIFRVTi9UQVAgLSBpZiB5b3Ugd2FudCBhY2Nlc3MgdG8gdGhlIGhvc3QgbmV0d29ya2luZyBhbmQgaXQgaXMKKyAgbyAgVFVOL1RBUCAtIGlmIHlvdSB3YW50IGFjY2VzcyB0byB0aGUgaG9zdCBuZXR3b3JraW5nIGFuZCBpdCBpcwogICAgICBydW5uaW5nIDIuNC4gIEFsc28sIHRoZSBUVU4vVEFQIHRyYW5zcG9ydCBpcyBhYmxlIHRvIHVzZSBhCiAgICAgIHByZWNvbmZpZ3VyZWQgZGV2aWNlLCBhbGxvd2luZyBpdCB0byBhdm9pZCB1c2luZyB0aGUgc2V0dWlkIHVtbF9uZXQKICAgICAgaGVscGVyLCB3aGljaCBpcyBhIHNlY3VyaXR5IGFkdmFudGFnZS4KIAotICArCG8gIE11bHRpY2FzdCAtIGlmIHlvdSB3YW50IGEgcHVyZWx5IHZpcnR1YWwgbmV0d29yayBhbmQgeW91IGRvbid0IHdhbnQKKyAgbyAgTXVsdGljYXN0IC0gaWYgeW91IHdhbnQgYSBwdXJlbHkgdmlydHVhbCBuZXR3b3JrIGFuZCB5b3UgZG9uJ3Qgd2FudAogICAgICB0byBzZXQgdXAgYW55dGhpbmcgYnV0IHRoZSBVTUwKIAotICArCG8gIGEgc3dpdGNoIGRhZW1vbiAtIGlmIHlvdSB3YW50IGEgcHVyZWx5IHZpcnR1YWwgbmV0d29yayBhbmQgeW91CisgIG8gIGEgc3dpdGNoIGRhZW1vbiAtIGlmIHlvdSB3YW50IGEgcHVyZWx5IHZpcnR1YWwgbmV0d29yayBhbmQgeW91CiAgICAgIGRvbid0IG1pbmQgcnVubmluZyB0aGUgZGFlbW9uIGluIG9yZGVyIHRvIGdldCBzb21ld2hhdCBiZXR0ZXIKICAgICAgcGVyZm9ybWFuY2UKIAotICArCG8gIHNsaXAgLSB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB0byBydW4gdGhlIHNsaXAgYmFja2VuZCB1bmxlc3MKKyAgbyAgc2xpcCAtIHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIgcmVhc29uIHRvIHJ1biB0aGUgc2xpcCBiYWNrZW5kIHVubGVzcwogICAgICBldGhlcnRhcCBhbmQgVFVOL1RBUCBhcmUganVzdCBub3QgYXZhaWxhYmxlIGZvciBzb21lIHJlYXNvbgogCi0gICsIbyAgc2xpcnAgLSBpZiB5b3UgZG9uJ3QgaGF2ZSByb290IGFjY2VzcyBvbiB0aGUgaG9zdCB0byBzZXR1cAorICBvICBzbGlycCAtIGlmIHlvdSBkb24ndCBoYXZlIHJvb3QgYWNjZXNzIG9uIHRoZSBob3N0IHRvIHNldHVwCiAgICAgIG5ldHdvcmtpbmcsIG9yIGlmIHlvdSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFuIElQIHRvIHlvdXIgVU1MCiAKLSAgKwhvICBwY2FwIC0gbm90IG11Y2ggdXNlIGZvciBhY3R1YWwgbmV0d29yayBjb25uZWN0aXZpdHksIGJ1dCBncmVhdCBmb3IKKyAgbyAgcGNhcCAtIG5vdCBtdWNoIHVzZSBmb3IgYWN0dWFsIG5ldHdvcmsgY29ubmVjdGl2aXR5LCBidXQgZ3JlYXQgZm9yCiAgICAgIG1vbml0b3JpbmcgdHJhZmZpYyBvbiB0aGUgaG9zdAogCiAgICAgIEV0aGVydGFwIGlzIGF2YWlsYWJsZSBvbiAyLjQgYW5kIHdvcmtzIGZpbmUuICBUVU4vVEFQIGlzIHByZWZlcnJlZApAQCAtOTI2LDcgKzkyNiw3IEBACiAgICAgIGV4cGxvaXQgdGhlIGhlbHBlcidzIHJvb3QgcHJpdmlsZWdlcy4KIAogCi0gIDYINi4ILjEIMS4ILiAgRwhHZQhlbghuZQhlcghyYQhhbAhsIHMIc2UIZXQIdHUIdXAIcAorICA2LjEuICBHZW5lcmFsIHNldHVwCiAKICAgRmlyc3QsIHlvdSBtdXN0IGhhdmUgdGhlIHZpcnR1YWwgbmV0d29yayBlbmFibGVkIGluIHlvdXIgVU1MLiAgSWYgYXJlCiAgIHJ1bm5pbmcgYSBwcmVidWlsdCBrZXJuZWwgZnJvbSB0aGlzIHNpdGUsIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeQpAQCAtOTk1LDcgKzk5NSw3IEBACiAKIAogCi0gIDYINi4ILjIIMi4ILiAgVQhVcwhzZQhlcghycwhzcAhwYQhhYwhjZQhlIGQIZGEIYWUIZW0IbW8Ib24IbnMIcworICA2LjIuICBVc2Vyc3BhY2UgZGFlbW9ucwogCiAgIFlvdSB3aWxsIGxpa2VseSBuZWVkIHRoZSBzZXR1aWQgaGVscGVyLCBvciB0aGUgc3dpdGNoIGRhZW1vbiwgb3IgYm90aC4KICAgVGhleSBhcmUgYm90aCBpbnN0YWxsZWQgd2l0aCB0aGUgUlBNIGFuZCBkZWIsIHNvIGlmIHlvdSd2ZSBpbnN0YWxsZWQKQEAgLTEwMTEsNyArMTAxMSw3IEBACiAKIAogCi0gIDYINi4ILjMIMy4ILiAgUwhTcAhwZQhlYwhjaQhpZghmeQh5aQhpbghuZwhnIGUIZXQIdGgIaGUIZXIIcm4IbmUIZXQIdCBhCGFkCGRkCGRyCHJlCGVzCHNzCHNlCGVzCHMKKyAgNi4zLiAgU3BlY2lmeWluZyBldGhlcm5ldCBhZGRyZXNzZXMKIAogICBCZWxvdywgeW91IHdpbGwgc2VlIHRoYXQgdGhlIFRVTi9UQVAsIGV0aGVydGFwLCBhbmQgZGFlbW9uIGludGVyZmFjZXMKICAgYWxsb3cgeW91IHRvIHNwZWNpZnkgaGFyZHdhcmUgYWRkcmVzc2VzIGZvciB0aGUgdmlydHVhbCBldGhlcm5ldApAQCAtMTAyMywxMSArMTAyMywxMSBAQAogICBzdWZmaWNpZW50IHRvIGd1YXJhbnRlZSBhIHVuaXF1ZSBoYXJkd2FyZSBhZGRyZXNzIGZvciB0aGUgZGV2aWNlLiAgQQogICBjb3VwbGUgb2YgZXhjZXB0aW9ucyBhcmU6CiAKLSAgKwhvICBBbm90aGVyIHNldCBvZiB2aXJ0dWFsIGV0aGVybmV0IGRldmljZXMgYXJlIG9uIHRoZSBzYW1lIG5ldHdvcmsgYW5kCisgIG8gIEFub3RoZXIgc2V0IG9mIHZpcnR1YWwgZXRoZXJuZXQgZGV2aWNlcyBhcmUgb24gdGhlIHNhbWUgbmV0d29yayBhbmQKICAgICAgdGhleSBhcmUgYXNzaWduZWQgaGFyZHdhcmUgYWRkcmVzc2VzIHVzaW5nIGEgZGlmZmVyZW50IHNjaGVtZSB3aGljaAogICAgICBtYXkgY29uZmxpY3Qgd2l0aCB0aGUgVU1MIElQIGFkZHJlc3MtYmFzZWQgc2NoZW1lCiAKLSAgKwhvICBZb3UgYXJlbid0IGdvaW5nIHRvIHVzZSB0aGUgZGV2aWNlIGZvciBJUCBuZXR3b3JraW5nLCBzbyB5b3UgZG9uJ3QKKyAgbyAgWW91IGFyZW4ndCBnb2luZyB0byB1c2UgdGhlIGRldmljZSBmb3IgSVAgbmV0d29ya2luZywgc28geW91IGRvbid0CiAgICAgIGFzc2lnbiB0aGUgZGV2aWNlIGFuIElQIGFkZHJlc3MKIAogICAgICBJZiB5b3UgbGV0IHRoZSBkcml2ZXIgcHJvdmlkZSB0aGUgaGFyZHdhcmUgYWRkcmVzcywgeW91IHNob3VsZCBtYWtlCkBAIC0xMDQ5LDcgKzEwNDksNyBAQAogCiAKIAotICA2CDYuCC40CDQuCC4gIFUIVU0ITUwITCBpCGluCG50CHRlCGVyCHJmCGZhCGFjCGNlCGUgcwhzZQhldAh0dQh1cAhwCisgIDYuNC4gIFVNTCBpbnRlcmZhY2Ugc2V0dXAKIAogICBPbmNlIHRoZSBuZXR3b3JrIGRldmljZXMgaGF2ZSBiZWVuIGRlc2NyaWJlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB5b3UKICAgc2hvdWxkIGJvb3QgVU1MIGFuZCBsb2cgaW4uCkBAIC0xMTMxLDcgKzExMzEsNyBAQAogCiAKIAotICA2CDYuCC41CDUuCC4gIE0ITXUIdWwIbHQIdGkIaWMIY2EIYXMIc3QIdAorICA2LjUuICBNdWx0aWNhc3QKIAogICBUaGUgc2ltcGxlc3Qgd2F5IHRvIHNldCB1cCBhIHZpcnR1YWwgbmV0d29yayBiZXR3ZWVuIG11bHRpcGxlIFVNTHMgaXMKICAgdG8gdXNlIHRoZSBtY2FzdCB0cmFuc3BvcnQuICBUaGlzIHdhcyB3cml0dGVuIGJ5IEhhcmFsZCBXZWx0ZSBhbmQgaXMKQEAgLTExOTQsNyArMTE5NCw3IEBACiAKIAogCi0gIDYINi4ILjYINi4ILiAgVAhUVQhVTghOLwgvVAhUQQhBUAhQIHcId2kIaXQIdGgIaCB0CHRoCGhlCGUgdQh1bQhtbAhsXwhfbghuZQhldAh0IGgIaGUIZWwIbHAIcGUIZXIIcgorICA2LjYuICBUVU4vVEFQIHdpdGggdGhlIHVtbF9uZXQgaGVscGVyCiAKICAgVFVOL1RBUCBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBvbiAyLjQgdG8gZXhjaGFuZ2UgcGFja2V0cyB3aXRoIHRoZQogICBob3N0LiAgVGhlIFRVTi9UQVAgYmFja2VuZCBoYXMgYmVlbiBpbiBVTUwgc2luY2UgMi40LjktM3VtLgpAQCAtMTI0NywxMCArMTI0NywxMCBAQAogICBUaGVyZSBhcmUgYSBjb3VwbGUgcG90ZW50aWFsIHByb2JsZW1zIHdpdGggcnVubmluZyB0aGUgVFVOL1RBUAogICB0cmFuc3BvcnQgb24gYSAyLjQgaG9zdCBrZXJuZWwKIAotICArCG8gIFRVTi9UQVAgc2VlbXMgbm90IHRvIHdvcmsgb24gMi40LjMgYW5kIGVhcmxpZXIuICBVcGdyYWRlIHRoZSBob3N0CisgIG8gIFRVTi9UQVAgc2VlbXMgbm90IHRvIHdvcmsgb24gMi40LjMgYW5kIGVhcmxpZXIuICBVcGdyYWRlIHRoZSBob3N0CiAgICAgIGtlcm5lbCBvciB1c2UgdGhlIGV0aGVydGFwIHRyYW5zcG9ydC4KIAotICArCG8gIFdpdGggYW4gdXBncmFkZWQga2VybmVsLCBUVU4vVEFQIG1heSBmYWlsIHdpdGgKKyAgbyAgV2l0aCBhbiB1cGdyYWRlZCBrZXJuZWwsIFRVTi9UQVAgbWF5IGZhaWwgd2l0aAogCiAKICAgICAgICBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlCkBAIC0xMjY5LDcgKzEyNjksNyBAQAogCiAKIAotICA2CDYuCC43CDcuCC4gIFQIVFUIVU4ITi8IL1QIVEEIQVAIUCB3CHdpCGl0CHRoCGggYQhhIHAIcHIIcmUIZWMIY28Ib24IbmYIZmkIaWcIZ3UIdXIIcmUIZWQIZCB0CHRhCGFwCHAgZAhkZQhldgh2aQhpYwhjZQhlCisgIDYuNy4gIFRVTi9UQVAgd2l0aCBhIHByZWNvbmZpZ3VyZWQgdGFwIGRldmljZQogCiAgIElmIHlvdSBwcmVmZXIgbm90IHRvIGhhdmUgVU1MIHVzZSB1bWxfbmV0ICh3aGljaCBpcyBzb21ld2hhdAogICBpbnNlY3VyZSksIHdpdGggVU1MIDIuNC4xNy0xMSwgeW91IGNhbiBzZXQgdXAgYSBUVU4vVEFQIGRldmljZQpAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKICAgdGhlcmUgaXMgbm8gbmVlZCBmb3Igcm9vdCBhc3Npc3RhbmNlLiAgU2V0dGluZyB1cCB0aGUgZGV2aWNlIGlzIGRvbmUKICAgYXMgZm9sbG93czoKIAotICArCG8gIENyZWF0ZSB0aGUgZGV2aWNlIHdpdGggdHVuY3RsIChhdmFpbGFibGUgZnJvbSB0aGUgVU1MIHV0aWxpdGllcworICBvICBDcmVhdGUgdGhlIGRldmljZSB3aXRoIHR1bmN0bCAoYXZhaWxhYmxlIGZyb20gdGhlIFVNTCB1dGlsaXRpZXMKICAgICAgdGFyYmFsbCkKIAogCkBAIC0xMjkxLDcgKzEyOTEsNyBAQAogICB3aGVyZSB1aWQgaXMgdGhlIHVzZXIgaWQgb3IgdXNlcm5hbWUgdGhhdCBVTUwgd2lsbCBiZSBydW4gYXMuICBUaGlzCiAgIHdpbGwgdGVsbCB5b3Ugd2hhdCBkZXZpY2Ugd2FzIGNyZWF0ZWQuCiAKLSAgKwhvICBDb25maWd1cmUgdGhlIGRldmljZSBJUCAoY2hhbmdlIElQIGFkZHJlc3NlcyBhbmQgZGV2aWNlIG5hbWUgdG8KKyAgbyAgQ29uZmlndXJlIHRoZSBkZXZpY2UgSVAgKGNoYW5nZSBJUCBhZGRyZXNzZXMgYW5kIGRldmljZSBuYW1lIHRvCiAgICAgIHN1aXQpCiAKIApAQCAtMTMwMyw3ICsxMzAzLDcgQEAKIAogCiAKLSAgKwhvICBTZXQgdXAgcm91dGluZyBhbmQgYXJwaW5nIGlmIGRlc2lyZWQgLSB0aGlzIGlzIG15IHJlY2lwZSwgdGhlcmUgYXJlCisgIG8gIFNldCB1cCByb3V0aW5nIGFuZCBhcnBpbmcgaWYgZGVzaXJlZCAtIHRoaXMgaXMgbXkgcmVjaXBlLCB0aGVyZSBhcmUKICAgICAgb3RoZXIgd2F5cyBvZiBkb2luZyB0aGUgc2FtZSB0aGluZwogCiAKQEAgLTEzMzgsNyArMTMzOCw3IEBACiAgIHV0aWxpdHkgd2hpY2ggcmVhZHMgdGhlIGluZm9ybWF0aW9uIGZyb20gYSBjb25maWcgZmlsZSBhbmQgc2V0cyB1cAogICBkZXZpY2VzIGF0IGJvb3QgdGltZS4KIAotICArCG8gIFJhdGhlciB0aGFuIHVzaW5nIHVwIHR3byBJUHMgYW5kIEFSUGluZyBmb3Igb25lIG9mIHRoZW0sIHlvdSBjYW4KKyAgbyAgUmF0aGVyIHRoYW4gdXNpbmcgdXAgdHdvIElQcyBhbmQgQVJQaW5nIGZvciBvbmUgb2YgdGhlbSwgeW91IGNhbgogICAgICBhbHNvIHByb3ZpZGUgZGlyZWN0IGFjY2VzcyB0byB5b3VyIExBTiBieSB0aGUgVU1MIGJ5IHVzaW5nIGEKICAgICAgYnJpZGdlLgogCkBAIC0xNDE3LDcgKzE0MTcsNyBAQAogICBOb3RlIHRoYXQgJ2JyMCcgc2hvdWxkIGJlIHNldHVwIHVzaW5nIGlmY29uZmlnIHdpdGggdGhlIGV4aXN0aW5nIElQCiAgIGFkZHJlc3Mgb2YgZXRoMCwgYXMgZXRoMCBubyBsb25nZXIgaGFzIGl0cyBvd24gSVAuCiAKLSAgKwhvCisgIG8KIAogCiAgICAgIEFsc28sIHRoZSAvZGV2L25ldC90dW4gZGV2aWNlIG11c3QgYmUgd3JpdGFibGUgYnkgdGhlIHVzZXIgcnVubmluZwpAQCAtMTQzOCwxMSArMTQzOCwxMSBAQAogICBkZXZpY2VzIGFuZCBjaGdycCAvZGV2L25ldC90dW4gdG8gdGhhdCBncm91cCB3aXRoIG1vZGUgNjY0IG9yIDY2MC4KIAogCi0gICsIbyAgT25jZSB0aGUgZGV2aWNlIGlzIHNldCB1cCwgcnVuIFVNTCB3aXRoICdldGgwPXR1bnRhcCxkZXZpY2UgbmFtZScKKyAgbyAgT25jZSB0aGUgZGV2aWNlIGlzIHNldCB1cCwgcnVuIFVNTCB3aXRoICdldGgwPXR1bnRhcCxkZXZpY2UgbmFtZScKICAgICAgKGkuZS4gJ2V0aDA9dHVudGFwLHRhcDAnKSBvbiB0aGUgY29tbWFuZCBsaW5lIChvciBkbyBpdCB3aXRoIHRoZQogICAgICBtY29uc29sZSBjb25maWcgY29tbWFuZCkuCiAKLSAgKwhvICBCcmluZyB0aGUgZXRoIGRldmljZSB1cCBpbiBVTUwgYW5kIHlvdSdyZSBpbiBidXNpbmVzcy4KKyAgbyAgQnJpbmcgdGhlIGV0aCBkZXZpY2UgdXAgaW4gVU1MIGFuZCB5b3UncmUgaW4gYnVzaW5lc3MuCiAKICAgICAgSWYgeW91IGRvbid0IHdhbnQgdGhhdCB0YXAgZGV2aWNlIGFueSBtb3JlLCB5b3UgY2FuIG1ha2UgaXQgbm9uLQogICAgICBwZXJzaXN0ZW50IHdpdGgKQEAgLTE0NjUsNyArMTQ2NSw3IEBACiAKIAogCi0gIDYINi4ILjgIOC4ILiAgRQhFdAh0aAhoZQhlcghydAh0YQhhcAhwCisgIDYuOC4gIEV0aGVydGFwCiAKICAgRXRoZXJ0YXAgaXMgdGhlIGdlbmVyYWwgbWVjaGFuaXNtIG9uIDIuMiBmb3IgdXNlcnNwYWNlIHByb2Nlc3NlcyB0bwogICBleGNoYW5nZSBwYWNrZXRzIHdpdGggdGhlIGtlcm5lbC4KQEAgLTE1NjEsOSArMTU2MSw5IEBACiAKIAogCi0gIDYINi4ILjkIOS4ILiAgVAhUaAhoZQhlIHMIc3cId2kIaXQIdGMIY2gIaCBkCGRhCGFlCGVtCG1vCG9uCG4KKyAgNi45LiAgVGhlIHN3aXRjaCBkYWVtb24KIAotICBOCE5vCG90CHRlCGU6IFRoaXMgaXMgdGhlIGRhZW1vbiBmb3JtZXJseSBrbm93biBhcyB1bWxfcm91dGVyLCBidXQgd2hpY2ggd2FzCisgIE5vdGU6IFRoaXMgaXMgdGhlIGRhZW1vbiBmb3JtZXJseSBrbm93biBhcyB1bWxfcm91dGVyLCBidXQgd2hpY2ggd2FzCiAgIHJlbmFtZWQgc28gdGhlIG5ldHdvcmsgd2VlbmllcyBvZiB0aGUgd29ybGQgd291bGQgc3RvcCBncm93bGluZyBhdCBtZS4KIAogCkBAIC0xNjQ5LDcgKzE2NDksNyBAQAogCiAKIAotICA2CDYuCC4xCDEwCDAuCC4gIFMIU2wIbGkIaXAIcAorICA2LjEwLiAgU2xpcAogCiAgIFNsaXAgaXMgYW5vdGhlciwgbGVzcyBnZW5lcmFsLCBtZWNoYW5pc20gZm9yIGEgcHJvY2VzcyB0byBjb21tdW5pY2F0ZQogICB3aXRoIHRoZSBob3N0IG5ldHdvcmtpbmcuICBJbiBjb250cmFzdCB0byB0aGUgZXRoZXJ0YXAgaW50ZXJmYWNlLApAQCAtMTY4MSw3ICsxNjgxLDcgQEAKIAogCiAKLSAgNgg2LgguMQgxMQgxLgguICBTCFNsCGxpCGlyCHJwCHAKKyAgNi4xMS4gIFNsaXJwCiAKICAgc2xpcnAgdXNlcyBhbiBleHRlcm5hbCBwcm9ncmFtLCB1c3VhbGx5IC91c3IvYmluL3NsaXJwLCB0byBwcm92aWRlIElQCiAgIG9ubHkgbmV0d29ya2luZyBjb25uZWN0aXZpdHkgdGhyb3VnaCB0aGUgaG9zdC4gVGhpcyBpcyBzaW1pbGFyIHRvIElQCkBAIC0xNzM3LDcgKzE3MzcsNyBAQAogCiAKIAotICA2CDYuCC4xCDEyCDIuCC4gIHAIcGMIY2EIYXAIcAorICA2LjEyLiAgcGNhcAogCiAgIFRoZSBwY2FwIHRyYW5zcG9ydCBpcyBhdHRhY2hlZCB0byBhIFVNTCBldGhlcm5ldCBkZXZpY2Ugb24gdGhlIGNvbW1hbmQKICAgbGluZSBvciB3aXRoIHVtbF9tY29uc29sZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3ludGF4OgpAQCAtMTc3Nyw3ICsxNzc3LDcgQEAKIAogCiAKLSAgNgg2LgguMQgxMwgzLgguICBTCFNlCGV0CHR0CHRpCGluCG5nCGcgdQh1cAhwIHQIdGgIaGUIZSBoCGhvCG9zCHN0CHQgeQh5bwhvdQh1cghycwhzZQhlbAhsZghmCisgIDYuMTMuICBTZXR0aW5nIHVwIHRoZSBob3N0IHlvdXJzZWxmCiAKICAgSWYgeW91IGRvbid0IHNwZWNpZnkgYW4gYWRkcmVzcyBmb3IgdGhlIGhvc3Qgc2lkZSBvZiB0aGUgZXRoZXJ0YXAgb3IKICAgc2xpcCBkZXZpY2UsIFVNTCB3b24ndCBkbyBhbnkgc2V0dXAgb24gdGhlIGhvc3QuICBTbyB0aGlzIGlzIHdoYXQgaXMKQEAgLTE3ODUsNyArMTc4NSw3IEBACiAgIDE5Mi4xNjguMC4yNTEgYW5kIGEgVU1MLXNpZGUgSVAgb2YgMTkyLjE2OC4wLjI1MCAtIGFkanVzdCB0byBzdWl0IHlvdXIKICAgb3duIG5ldHdvcmspOgogCi0gICsIbyAgVGhlIGRldmljZSBuZWVkcyB0byBiZSBjb25maWd1cmVkIHdpdGggaXRzIElQIGFkZHJlc3MuICBUYXAgZGV2aWNlcworICBvICBUaGUgZGV2aWNlIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBpdHMgSVAgYWRkcmVzcy4gIFRhcCBkZXZpY2VzCiAgICAgIGFyZSBhbHNvIGNvbmZpZ3VyZWQgd2l0aCBhbiBtdHUgb2YgMTQ4NC4gIFNsaXAgZGV2aWNlcyBhcmUKICAgICAgY29uZmlndXJlZCB3aXRoIGEgcG9pbnQtdG8tcG9pbnQgYWRkcmVzcyBwb2ludGluZyBhdCB0aGUgVU1MIGlwCiAgICAgIGFkZHJlc3MuCkBAIC0xODA1LDcgKzE4MDUsNyBAQAogCiAKIAotICArCG8gIElmIGEgdGFwIGRldmljZSBpcyBiZWluZyBzZXQgdXAsIGEgcm91dGUgaXMgc2V0IHRvIHRoZSBVTUwgSVAuCisgIG8gIElmIGEgdGFwIGRldmljZSBpcyBiZWluZyBzZXQgdXAsIGEgcm91dGUgaXMgc2V0IHRvIHRoZSBVTUwgSVAuCiAKIAogICAgICAgIFVNTCMgcm91dGUgYWRkIC1ob3N0IDE5Mi4xNjguMC4yNTAgZ3cgMTkyLjE2OC4wLjI1MQpAQCAtMTgxNCw3ICsxODE0LDcgQEAKIAogCiAKLSAgKwhvICBUbyBhbGxvdyBvdGhlciBob3N0cyBvbiB5b3VyIG5ldHdvcmsgdG8gc2VlIHRoZSB2aXJ0dWFsIG1hY2hpbmUsCisgIG8gIFRvIGFsbG93IG90aGVyIGhvc3RzIG9uIHlvdXIgbmV0d29yayB0byBzZWUgdGhlIHZpcnR1YWwgbWFjaGluZSwKICAgICAgcHJveHkgYXJwIGlzIHNldCB1cCBmb3IgaXQuCiAKIApAQCAtMTgyNCw3ICsxODI0LDcgQEAKIAogCiAKLSAgKwhvICBGaW5hbGx5LCB0aGUgaG9zdCBpcyBzZXQgdXAgdG8gcm91dGUgcGFja2V0cy4KKyAgbyAgRmluYWxseSwgdGhlIGhvc3QgaXMgc2V0IHVwIHRvIHJvdXRlIHBhY2tldHMuCiAKIAogICAgICAgIGhvc3QjICBlY2hvIDEgPiAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZApAQCAtMTgzOCwxMiArMTgzOCwxMiBAQAogCiAKIAotICA3CDcuCC4gIFMIU2gIaGEIYXIIcmkIaW4IbmcIZyBGCEZpCGlsCGxlCGVzCHN5CHlzCHN0CHRlCGVtCG1zCHMgYghiZQhldAh0dwh3ZQhlZQhlbghuIFYIVmkIaXIIcnQIdHUIdWEIYWwIbCBNCE1hCGFjCGNoCGhpCGluCG5lCGVzCHMKKyAgNy4gIFNoYXJpbmcgRmlsZXN5c3RlbXMgYmV0d2VlbiBWaXJ0dWFsIE1hY2hpbmVzCiAKIAogCiAKLSAgNwg3LgguMQgxLgguICBBCEEgdwh3YQhhcghybghuaQhpbghuZwhnCisgIDcuMS4gIEEgd2FybmluZwogCiAgIERvbid0IGF0dGVtcHQgdG8gc2hhcmUgZmlsZXN5c3RlbXMgc2ltcGx5IGJ5IGJvb3RpbmcgdHdvIFVNTHMgZnJvbSB0aGUKICAgc2FtZSBmaWxlLiAgVGhhdCdzIHRoZSBzYW1lIHRoaW5nIGFzIGJvb3RpbmcgdHdvIHBoeXNpY2FsIG1hY2hpbmVzCkBAIC0xODUxLDcgKzE4NTEsNyBAQAogCiAKIAotICA3CDcuCC4yCDIuCC4gIFUIVXMIc2kIaW4IbmcIZyBsCGxhCGF5CHllCGVyCHJlCGVkCGQgYghibAhsbwhvYwhjawhrIGQIZGUIZXYIdmkIaWMIY2UIZXMIcworICA3LjIuICBVc2luZyBsYXllcmVkIGJsb2NrIGRldmljZXMKIAogICBUaGUgd2F5IHRvIHNoYXJlIGEgZmlsZXN5c3RlbSBiZXR3ZWVuIHR3byB2aXJ0dWFsIG1hY2hpbmVzIGlzIHRvIHVzZQogICB0aGUgY29weS1vbi13cml0ZSAoQ09XKSBsYXllcmluZyBjYXBhYmlsaXR5IG9mIHRoZSB1YmQgYmxvY2sgZHJpdmVyLgpAQCAtMTg5Niw3ICsxODk2LDcgQEAKIAogCiAKLSAgNwg3LgguMwgzLgguICBOCE5vCG90CHRlCGUhCCEKKyAgNy4zLiAgTm90ZSEKIAogICBXaGVuIGNoZWNraW5nIHRoZSBzaXplIG9mIHRoZSBDT1cgZmlsZSBpbiBvcmRlciB0byBzZWUgdGhlIGdvYnMgb2YKICAgc3BhY2UgdGhhdCB5b3UncmUgc2F2aW5nLCBtYWtlIHN1cmUgeW91IHVzZSAnbHMgLWxzJyB0byBzZWUgdGhlIGFjdHVhbApAQCAtMTkyNiw3ICsxOTI2LDcgQEAKIAogCiAKLSAgNwg3LgguNAg0LgguICBBCEFuCG5vCG90CHRoCGhlCGVyCHIgdwh3YQhhcghybghuaQhpbghuZwhnCisgIDcuNC4gIEFub3RoZXIgd2FybmluZwogCiAgIE9uY2UgYSBmaWxlc3lzdGVtIGlzIGJlaW5nIHVzZWQgYXMgYSByZWFkb25seSBiYWNraW5nIGZpbGUgZm9yIGEgQ09XCiAgIGZpbGUsIGRvIG5vdCBib290IGRpcmVjdGx5IGZyb20gaXQgb3IgbW9kaWZ5IGl0IGluIGFueSB3YXkuICBEb2luZyBzbwpAQCAtMTk1Miw3ICsxOTUyLDcgQEAKIAogCiAKLSAgNwg3LgguNQg1LgguICB1CHVtCG1sCGxfCF9tCG1vCG9vCG8gOgg6IE0ITWUIZXIIcmcIZ2kIaW4IbmcIZyBhCGEgQwhDTwhPVwhXIGYIZmkIaWwIbGUIZSB3CHdpCGl0CHRoCGggaQhpdAh0cwhzIGIIYmEIYWMIY2sIa2kIaW4IbmcIZyBmCGZpCGlsCGxlCGUKKyAgNy41LiAgdW1sX21vbyA6IE1lcmdpbmcgYSBDT1cgZmlsZSB3aXRoIGl0cyBiYWNraW5nIGZpbGUKIAogICBEZXBlbmRpbmcgb24gaG93IHlvdSB1c2UgVU1MIGFuZCBDT1cgZGV2aWNlcywgaXQgbWF5IGJlIGFkdmlzYWJsZSB0bwogICBtZXJnZSB0aGUgY2hhbmdlcyBpbiB0aGUgQ09XIGZpbGUgaW50byB0aGUgYmFja2luZyBmaWxlIGV2ZXJ5IG9uY2UgaW4KQEAgLTIwMDEsNyArMjAwMSw3IEBACiAKIAogCi0gIDgIOC4ILiAgQwhDcghyZQhlYQhhdAh0aQhpbghuZwhnIGYIZmkIaWwIbGUIZXMIc3kIeXMIc3QIdGUIZW0IbXMIcworICA4LiAgQ3JlYXRpbmcgZmlsZXN5c3RlbXMKIAogCiAgIFlvdSBtYXkgd2FudCB0byBjcmVhdGUgYW5kIG1vdW50IG5ldyBVTUwgZmlsZXN5c3RlbXMsIGVpdGhlciBiZWNhdXNlCkBAIC0yMDE1LDcgKzIwMTUsNyBAQAogICBzaG91bGQgYmUgZWFzeSB0byB0cmFuc2xhdGUgdG8gdGhlIGZpbGVzeXN0ZW0gb2YgeW91ciBjaG9pY2UuCiAKIAotICA4CDguCC4xCDEuCC4gIEMIQ3IIcmUIZWEIYXQIdGUIZSB0CHRoCGhlCGUgZghmaQhpbAhsZQhlcwhzeQh5cwhzdAh0ZQhlbQhtIGYIZmkIaWwIbGUIZQorICA4LjEuICBDcmVhdGUgdGhlIGZpbGVzeXN0ZW0gZmlsZQogCiAgIGRkIGlzIHlvdXIgZnJpZW5kLiAgQWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRlbGwgZGQgdG8gY3JlYXRlIGFuIGVtcHR5CiAgIGZpbGUgb2YgdGhlIGFwcHJvcHJpYXRlIHNpemUuICBJIHVzdWFsbHkgbWFrZSBpdCBzcGFyc2UgdG8gc2F2ZSB0aW1lCkBAIC0yMDMyLDcgKzIwMzIsNyBAQAogCiAKIAotICA4CDguCC4yCDIuCC4gIEEIQXMIc3MIc2kIaWcIZ24IbiB0CHRoCGhlCGUgZghmaQhpbAhsZQhlIHQIdG8IbyBhCGEgVQhVTQhNTAhMIGQIZGUIZXYIdmkIaWMIY2UIZQorICA4LjIuICBBc3NpZ24gdGhlIGZpbGUgdG8gYSBVTUwgZGV2aWNlCiAKICAgQWRkIGFuIGFyZ3VtZW50IGxpa2UgdGhlIGZvbGxvd2luZyB0byB0aGUgVU1MIGNvbW1hbmQgbGluZToKIApAQCAtMjA0NSw3ICsyMDQ1LDcgQEAKIAogCiAKLSAgOAg4LgguMwgzLgguICBDCENyCHJlCGVhCGF0CHRpCGluCG5nCGcgYQhhbghuZAhkIG0IbW8Ib3UIdW4IbnQIdGkIaW4IbmcIZyB0CHRoCGhlCGUgZghmaQhpbAhsZQhlcwhzeQh5cwhzdAh0ZQhlbQhtCisgIDguMy4gIENyZWF0aW5nIGFuZCBtb3VudGluZyB0aGUgZmlsZXN5c3RlbQogCiAgIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaWxlc3lzdGVtIGlzIGF2YWlsYWJsZSwgZWl0aGVyIGJ5IGJlaW5nIGJ1aWx0IGludG8KICAgdGhlIGtlcm5lbCwgb3IgYXZhaWxhYmxlIGFzIGEgbW9kdWxlLCB0aGVuIGJvb3QgdXAgVU1MIGFuZCBsb2cgaW4uICBJZgpAQCAtMjA5Niw3ICsyMDk2LDcgQEAKIAogCiAKLSAgOQg5LgguICBICEhvCG9zCHN0CHQgZghmaQhpbAhsZQhlIGEIYWMIY2MIY2UIZXMIc3MIcworICA5LiAgSG9zdCBmaWxlIGFjY2VzcwogCiAKICAgSWYgeW91IHdhbnQgdG8gYWNjZXNzIGZpbGVzIG9uIHRoZSBob3N0IG1hY2hpbmUgZnJvbSBpbnNpZGUgVU1MLCB5b3UKQEAgLTIxMTIsNyArMjExMiw3IEBACiAgIGZpbGVzIGNvbnRhaW5lZCBpbiBpdCBqdXN0IGFzIHlvdSB3b3VsZCBvbiB0aGUgaG9zdC4KIAogCi0gIDkIOS4ILjEIMS4ILiAgVQhVcwhzaQhpbghuZwhnIGgIaG8Ib3MIc3QIdGYIZnMIcworICA5LjEuICBVc2luZyBob3N0ZnMKIAogICBUbyBiZWdpbiB3aXRoLCBtYWtlIHN1cmUgdGhhdCBob3N0ZnMgaXMgYXZhaWxhYmxlIGluc2lkZSB0aGUgdmlydHVhbAogICBtYWNoaW5lIHdpdGgKQEAgLTIxNTEsNyArMjE1MSw3IEBACiAKIAogCi0gIDkIOS4ILjIIMi4ILiAgaAhobwhvcwhzdAh0ZghmcwhzIGEIYXMIcyB0CHRoCGhlCGUgcghybwhvbwhvdAh0IGYIZmkIaWwIbGUIZXMIc3kIeXMIc3QIdGUIZW0IbQorICA5LjIuICBob3N0ZnMgYXMgdGhlIHJvb3QgZmlsZXN5c3RlbQogCiAgIEl0J3MgcG9zc2libGUgdG8gYm9vdCBmcm9tIGEgZGlyZWN0b3J5IGhpZXJhcmNoeSBvbiB0aGUgaG9zdCB1c2luZwogICBob3N0ZnMgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIHN0YW5kYXJkIGZpbGVzeXN0ZW0gaW4gYSBmaWxlLgpAQCAtMjE5NCwyMCArMjE5NCwyMCBAQAogICBVTUwgc2hvdWxkIHRoZW4gYm9vdCBhcyBpdCBkb2VzIG5vcm1hbGx5LgogCiAKLSAgOQg5LgguMwgzLgguICBCCEJ1CHVpCGlsCGxkCGRpCGluCG5nCGcgaAhobwhvcwhzdAh0ZghmcwhzCisgIDkuMy4gIEJ1aWxkaW5nIGhvc3RmcwogCiAgIElmIHlvdSBuZWVkIHRvIGJ1aWxkIGhvc3RmcyBiZWNhdXNlIGl0J3Mgbm90IGluIHlvdXIga2VybmVsLCB5b3UgaGF2ZQogICB0d28gY2hvaWNlczoKIAogCiAKLSAgKwhvICBDb21waWxpbmcgaG9zdGZzIGludG8gdGhlIGtlcm5lbDoKKyAgbyAgQ29tcGlsaW5nIGhvc3RmcyBpbnRvIHRoZSBrZXJuZWw6CiAKIAogICAgICBSZWNvbmZpZ3VyZSB0aGUga2VybmVsIGFuZCBzZXQgdGhlICdIb3N0IGZpbGVzeXN0ZW0nIG9wdGlvbiB1bmRlcgogCiAKLSAgKwhvICBDb21waWxpbmcgaG9zdGZzIGFzIGEgbW9kdWxlOgorICBvICBDb21waWxpbmcgaG9zdGZzIGFzIGEgbW9kdWxlOgogCiAKICAgICAgUmVjb25maWd1cmUgdGhlIGtlcm5lbCBhbmQgc2V0IHRoZSAnSG9zdCBmaWxlc3lzdGVtJyBvcHRpb24gdW5kZXIKQEAgLTIyMjgsNyArMjIyOCw3IEBACiAKIAogCi0gIDEIMTAIMC4ILiAgVAhUaAhoZQhlIE0ITWEIYW4IbmEIYWcIZ2UIZW0IbWUIZW4IbnQIdCBDCENvCG9uCG5zCHNvCG9sCGxlCGUKKyAgMTAuICBUaGUgTWFuYWdlbWVudCBDb25zb2xlCiAKIAogCkBAIC0yMjQwLDE1ICsyMjQwLDE1IEBACiAKICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB5b3UgY2FuIGRvIHdpdGggdGhlIG1jb25zb2xlIGludGVyZmFjZToKIAotICArCG8gIGdldCB0aGUga2VybmVsIHZlcnNpb24KKyAgbyAgZ2V0IHRoZSBrZXJuZWwgdmVyc2lvbgogCi0gICsIbyAgYWRkIGFuZCByZW1vdmUgZGV2aWNlcworICBvICBhZGQgYW5kIHJlbW92ZSBkZXZpY2VzCiAKLSAgKwhvICBoYWx0IG9yIHJlYm9vdCB0aGUgbWFjaGluZQorICBvICBoYWx0IG9yIHJlYm9vdCB0aGUgbWFjaGluZQogCi0gICsIbyAgU2VuZCBTeXNScSBjb21tYW5kcworICBvICBTZW5kIFN5c1JxIGNvbW1hbmRzCiAKLSAgKwhvICBQYXVzZSBhbmQgcmVzdW1lIHRoZSBVTUwKKyAgbyAgUGF1c2UgYW5kIHJlc3VtZSB0aGUgVU1MCiAKIAogICBZb3UgbmVlZCB0aGUgbWNvbnNvbGUgY2xpZW50ICh1bWxfbWNvbnNvbGUpIHdoaWNoIGlzIHByZXNlbnQgaW4gQ1ZTCkBAIC0yMzAwLDI4ICsyMzAwLDI4IEBACiAKICAgWW91J2xsIGdldCBhIHByb21wdCwgYXQgd2hpY2ggeW91IGNhbiBydW4gb25lIG9mIHRoZXNlIGNvbW1hbmRzOgogCi0gICsIbyAgdmVyc2lvbgorICBvICB2ZXJzaW9uCiAKLSAgKwhvICBoYWx0CisgIG8gIGhhbHQKIAotICArCG8gIHJlYm9vdAorICBvICByZWJvb3QKIAotICArCG8gIGNvbmZpZworICBvICBjb25maWcKIAotICArCG8gIHJlbW92ZQorICBvICByZW1vdmUKIAotICArCG8gIHN5c3JxCisgIG8gIHN5c3JxCiAKLSAgKwhvICBoZWxwCisgIG8gIGhlbHAKIAotICArCG8gIGNhZAorICBvICBjYWQKIAotICArCG8gIHN0b3AKKyAgbyAgc3RvcAogCi0gICsIbyAgZ28KKyAgbyAgZ28KIAogCi0gIDEIMTAIMC4ILjEIMS4ILiAgdgh2ZQhlcghycwhzaQhpbwhvbghuCisgIDEwLjEuICB2ZXJzaW9uCiAKICAgVGhpcyB0YWtlcyBubyBhcmd1bWVudHMuICBJdCBwcmludHMgdGhlIFVNTCB2ZXJzaW9uLgogCkBAIC0yMzQyLDcgKzIzNDIsNyBAQAogCiAKIAotICAxCDEwCDAuCC4yCDIuCC4gIGgIaGEIYWwIbHQIdCBhCGFuCG5kCGQgcghyZQhlYghibwhvbwhvdAh0CisgIDEwLjIuICBoYWx0IGFuZCByZWJvb3QKIAogICBUaGVzZSB0YWtlIG5vIGFyZ3VtZW50cy4gIFRoZXkgc2h1dCB0aGUgbWFjaGluZSBkb3duIGltbWVkaWF0ZWx5LCB3aXRoCiAgIG5vIHN5bmNpbmcgb2YgZGlza3MgYW5kIG5vIGNsZWFuIHNodXRkb3duIG9mIHVzZXJzcGFjZS4gIFNvLCB0aGV5IGFyZQpAQCAtMjM1Nyw3ICsyMzU3LDcgQEAKIAogCiAKLSAgMQgxMAgwLgguMwgzLgguICBjCGNvCG9uCG5mCGZpCGlnCGcKKyAgMTAuMy4gIGNvbmZpZwogCiAgICJjb25maWciIGFkZHMgYSBuZXcgZGV2aWNlIHRvIHRoZSB2aXJ0dWFsIG1hY2hpbmUuICBDdXJyZW50bHkgdGhlIHViZAogICBhbmQgbmV0d29yayBkcml2ZXJzIHN1cHBvcnQgdGhpcy4gIEl0IHRha2VzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhlCkBAIC0yMzc4LDcgKzIzNzgsNyBAQAogCiAKIAotICAxCDEwCDAuCC40CDQuCC4gIHIIcmUIZW0IbW8Ib3YIdmUIZQorICAxMC40LiAgcmVtb3ZlCiAKICAgInJlbW92ZSIgZGVsZXRlcyBhIGRldmljZSBmcm9tIHRoZSBzeXN0ZW0uICBJdHMgYXJndW1lbnQgaXMganVzdCB0aGUKICAgbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGJlIHJlbW92ZWQuIFRoZSBkZXZpY2UgbXVzdCBiZSBpZGxlIGluIHdoYXRldmVyCkBAIC0yMzk3LDcgKzIzOTcsNyBAQAogCiAKIAotICAxCDEwCDAuCC41CDUuCC4gIHMIc3kIeXMIc3IIcnEIcQorICAxMC41LiAgc3lzcnEKIAogICBUaGlzIHRha2VzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgYSBzaW5nbGUgbGV0dGVyLiAgSXQgY2FsbHMgdGhlCiAgIGdlbmVyaWMga2VybmVsJ3MgU3lzUnEgZHJpdmVyLCB3aGljaCBkb2VzIHdoYXRldmVyIGlzIGNhbGxlZCBmb3IgYnkKQEAgLTI0MDcsMTQgKzI0MDcsMTQgQEAKIAogCiAKLSAgMQgxMAgwLgguNgg2LgguICBoCGhlCGVsCGxwCHAKKyAgMTAuNi4gIGhlbHAKIAogICAiaGVscCIgcmV0dXJucyBhIHN0cmluZyBsaXN0aW5nIHRoZSB2YWxpZCBjb21tYW5kcyBhbmQgd2hhdCBlYWNoIG9uZQogICBkb2VzLgogCiAKIAotICAxCDEwCDAuCC43CDcuCC4gIGMIY2EIYWQIZAorICAxMC43LiAgY2FkCiAKICAgVGhpcyBpbnZva2VzIHRoZSBDdGwtQWx0LURlbCBhY3Rpb24gb24gaW5pdC4gIFdoYXQgZXhhY3RseSB0aGlzIGVuZHMKICAgdXAgZG9pbmcgaXMgdXAgdG8gL2V0Yy9pbml0dGFiLiAgTm9ybWFsbHksIGl0IHJlYm9vdHMgdGhlIG1hY2hpbmUuCkBAIC0yNDMyLDcgKzI0MzIsNyBAQAogCiAKIAotICAxCDEwCDAuCC44CDguCC4gIHMIc3QIdG8Ib3AIcAorICAxMC44LiAgc3RvcAogCiAgIFRoaXMgcHV0cyB0aGUgVU1MIGluIGEgbG9vcCByZWFkaW5nIG1jb25zb2xlIHJlcXVlc3RzIHVudGlsIGEgJ2dvJwogICBtY29uc29sZSBjb21tYW5kIGlzIHJlY2VpdmVkLiBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBtYWtpbmcgYmFja3VwcwpAQCAtMjQ0OCw3ICsyNDQ4LDcgQEAKIAogCiAKLSAgMQgxMAgwLgguOQg5LgguICBnCGdvCG8KKyAgMTAuOS4gIGdvCiAKICAgVGhpcyByZXN1bWVzIGEgVU1MIGFmdGVyIGJlaW5nIHBhdXNlZCBieSBhICdzdG9wJyBjb21tYW5kLiBOb3RlIHRoYXQKICAgd2hlbiB0aGUgVU1MIGhhcyByZXN1bWVkLCBUQ1AgY29ubmVjdGlvbnMgbWF5IGhhdmUgdGltZWQgb3V0IGFuZCBpZgpAQCAtMjQ2MiwxMCArMjQ2MiwxMCBAQAogCiAKIAotICAxCDExCDEuCC4gIEsIS2UIZXIIcm4IbmUIZWwIbCBkCGRlCGViCGJ1CHVnCGdnCGdpCGluCG5nCGcKKyAgMTEuICBLZXJuZWwgZGVidWdnaW5nCiAKIAotICBOCE5vCG90CHRlCGU6CDogVGhlIGludGVyZmFjZSB0aGF0IG1ha2VzIGRlYnVnZ2luZywgYXMgZGVzY3JpYmVkIGhlcmUsIHBvc3NpYmxlCisgIE5vdGU6IFRoZSBpbnRlcmZhY2UgdGhhdCBtYWtlcyBkZWJ1Z2dpbmcsIGFzIGRlc2NyaWJlZCBoZXJlLCBwb3NzaWJsZQogICBpcyBwcmVzZW50IGluIDIuNC4wLXRlc3Q2IGtlcm5lbHMgYW5kIGxhdGVyLgogCiAKQEAgLTI0ODUsNyArMjQ4NSw3IEBACiAKIAogCi0gIDEIMTEIMS4ILjEIMS4ILiAgUwhTdAh0YQhhcghydAh0aQhpbghuZwhnIHQIdGgIaGUIZSBrCGtlCGVyCHJuCG5lCGVsCGwgdQh1bghuZAhkZQhlcghyIGcIZ2QIZGIIYgorICAxMS4xLiAgU3RhcnRpbmcgdGhlIGtlcm5lbCB1bmRlciBnZGIKIAogICBZb3UgY2FuIGhhdmUgdGhlIGtlcm5lbCBydW5uaW5nIHVuZGVyIHRoZSBjb250cm9sIG9mIGdkYiBmcm9tIHRoZQogICBiZWdpbm5pbmcgYnkgcHV0dGluZyAnZGVidWcnIG9uIHRoZSBjb21tYW5kIGxpbmUuICBZb3Ugd2lsbCBnZXQgYW4KQEAgLTI0OTgsNyArMjQ5OCw3IEBACiAgIFRoZXJlIGlzIGEgdHJhbnNjcmlwdCBvZiBhIGRlYnVnZ2luZyBzZXNzaW9uICBoZXJlIDxkZWJ1Zy0KICAgc2Vzc2lvbi5odG1sPiAsIHdpdGggYnJlYWtwb2ludHMgYmVpbmcgc2V0IGluIHRoZSBzY2hlZHVsZXIgYW5kIGluIGFuCiAgIGludGVycnVwdCBoYW5kbGVyLgotICAxCDExCDEuCC4yCDIuCC4gIEUIRXgIeGEIYW0IbWkIaW4IbmkIaW4IbmcIZyBzCHNsCGxlCGVlCGVwCHBpCGluCG5nCGcgcAhwcghybwhvYwhjZQhlcwhzcwhzZQhlcwhzCisgIDExLjIuICBFeGFtaW5pbmcgc2xlZXBpbmcgcHJvY2Vzc2VzCiAKICAgTm90IGV2ZXJ5IGJ1ZyBpcyBldmlkZW50IGluIHRoZSBjdXJyZW50bHkgcnVubmluZyBwcm9jZXNzLiAgU29tZXRpbWVzLAogICBwcm9jZXNzZXMgaGFuZyBpbiB0aGUga2VybmVsIHdoZW4gdGhleSBzaG91bGRuJ3QgYmVjYXVzZSB0aGV5J3ZlCkBAIC0yNTE2LDcgKzI1MTYsNyBAQAogCiAgIE5vdyB3aGF0IHlvdSBkbyBpcyB0aGlzOgogCi0gICsIbyAgZGV0YWNoIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkCisgIG8gIGRldGFjaCBmcm9tIHRoZSBjdXJyZW50IHRocmVhZAogCiAKICAgICAgICAoVU1MIGdkYikgIGRldApAQCAtMjUyNSw3ICsyNTI1LDcgQEAKIAogCiAKLSAgKwhvICBhdHRhY2ggdG8gdGhlIHRocmVhZCB5b3UgYXJlIGludGVyZXN0ZWQgaW4KKyAgbyAgYXR0YWNoIHRvIHRoZSB0aHJlYWQgeW91IGFyZSBpbnRlcmVzdGVkIGluCiAKIAogICAgICAgIChVTUwgZ2RiKSAgYXR0IDxob3N0IHBpZD4KQEAgLTI1MzQsNyArMjUzNCw3IEBACiAKIAogCi0gICsIbyAgbG9vayBhdCBpdHMgc3RhY2sgYW5kIGFueXRoaW5nIGVsc2Ugb2YgaW50ZXJlc3QKKyAgbyAgbG9vayBhdCBpdHMgc3RhY2sgYW5kIGFueXRoaW5nIGVsc2Ugb2YgaW50ZXJlc3QKIAogCiAgICAgICAgKFVNTCBnZGIpICBidApAQCAtMjU0NSw3ICsyNTQ1LDcgQEAKICAgTm90ZSB0aGF0IHlvdSBjYW4ndCBkbyBhbnl0aGluZyBhdCB0aGlzIHBvaW50IHRoYXQgcmVxdWlyZXMgdGhhdCBhCiAgIHByb2Nlc3MgZXhlY3V0ZSwgZS5nLiBjYWxsaW5nIGEgZnVuY3Rpb24KIAotICArCG8gIHdoZW4geW91J3JlIGRvbmUgbG9va2luZyBhdCB0aGF0IHByb2Nlc3MsIHJlYXR0YWNoIHRvIHRoZSBjdXJyZW50CisgIG8gIHdoZW4geW91J3JlIGRvbmUgbG9va2luZyBhdCB0aGF0IHByb2Nlc3MsIHJlYXR0YWNoIHRvIHRoZSBjdXJyZW50CiAgICAgIHRocmVhZCBhbmQgY29udGludWUgaXQKIAogCkBAIC0yNTY5LDEyICsyNTY5LDEyIEBACiAKIAogCi0gIDEIMTEIMS4ILjMIMy4ILiAgUghSdQh1bghubghuaQhpbghuZwhnIGQIZGQIZGQIZCBvCG9uCG4gVQhVTQhNTAhMCisgIDExLjMuICBSdW5uaW5nIGRkZCBvbiBVTUwKIAogICBkZGQgd29ya3Mgb24gVU1MLCBidXQgcmVxdWlyZXMgYSBzcGVjaWFsIGtsdWRnZS4gIFRoZSBwcm9jZXNzIGdvZXMKICAgbGlrZSB0aGlzOgogCi0gICsIbyAgU3RhcnQgZGRkCisgIG8gIFN0YXJ0IGRkZAogCiAKICAgICAgICBob3N0JSBkZGQgbGludXgKQEAgLTI1ODMsMTQgKzI1ODMsMTQgQEAKIAogCiAKLSAgKwhvICBXaXRoIHBzLCBnZXQgdGhlIHBpZCBvZiB0aGUgZ2RiIHRoYXQgZGRkIHN0YXJ0ZWQuICBZb3UgY2FuIGFzayB0aGUKKyAgbyAgV2l0aCBwcywgZ2V0IHRoZSBwaWQgb2YgdGhlIGdkYiB0aGF0IGRkZCBzdGFydGVkLiAgWW91IGNhbiBhc2sgdGhlCiAgICAgIGdkYiB0byB0ZWxsIHlvdSwgYnV0IGZvciBzb21lIHJlYXNvbiB0aGF0IGNvbmZ1c2VzIHRoaW5ncyBhbmQKICAgICAgY2F1c2VzIGEgaGFuZy4KIAotICArCG8gIHJ1biBVTUwgd2l0aCAnZGVidWc9cGFyZW50IGdkYi1waWQ9PHBpZD4nIGFkZGVkIHRvIHRoZSBjb21tYW5kIGxpbmUKKyAgbyAgcnVuIFVNTCB3aXRoICdkZWJ1Zz1wYXJlbnQgZ2RiLXBpZD08cGlkPicgYWRkZWQgdG8gdGhlIGNvbW1hbmQgbGluZQogICAgICAtIGl0IHdpbGwganVzdCBzaXQgdGhlcmUgYWZ0ZXIgeW91IGhpdCByZXR1cm4KIAotICArCG8gIHR5cGUgJ2F0dCAxJyB0byB0aGUgZGRkIGdkYiBhbmQgeW91IHdpbGwgc2VlIHNvbWV0aGluZyBsaWtlCisgIG8gIHR5cGUgJ2F0dCAxJyB0byB0aGUgZGRkIGdkYiBhbmQgeW91IHdpbGwgc2VlIHNvbWV0aGluZyBsaWtlCiAKIAogICAgICAgIDB4YTAxM2RjNTEgaW4gX19raWxsICgpCkBAIC0yNjAyLDEyICsyNjAyLDEyIEBACiAKIAogCi0gICsIbyAgQXQgdGhpcyBwb2ludCwgdHlwZSAnYycsIFVNTCB3aWxsIGJvb3QgdXAsIGFuZCB5b3UgY2FuIHVzZSBkZGQganVzdAorICBvICBBdCB0aGlzIHBvaW50LCB0eXBlICdjJywgVU1MIHdpbGwgYm9vdCB1cCwgYW5kIHlvdSBjYW4gdXNlIGRkZCBqdXN0CiAgICAgIGFzIHlvdSBkbyBvbiBhbnkgb3RoZXIgcHJvY2Vzcy4KIAogCiAKLSAgMQgxMQgxLgguNAg0LgguICBECERlCGViCGJ1CHVnCGdnCGdpCGluCG5nCGcgbQhtbwhvZAhkdQh1bAhsZQhlcwhzCisgIDExLjQuICBEZWJ1Z2dpbmcgbW9kdWxlcwogCiAgIGdkYiBoYXMgc3VwcG9ydCBmb3IgZGVidWdnaW5nIGNvZGUgd2hpY2ggaXMgZHluYW1pY2FsbHkgbG9hZGVkIGludG8KICAgdGhlIHByb2Nlc3MuICBUaGlzIHN1cHBvcnQgaXMgd2hhdCBpcyBuZWVkZWQgdG8gZGVidWcga2VybmVsIG1vZHVsZXMKQEAgLTI4MjMsNyArMjgyMyw3IEBACiAKIAogCi0gIDEIMTEIMS4ILjUINS4ILiAgQQhBdAh0dAh0YQhhYwhjaAhoaQhpbghuZwhnIGcIZ2QIZGIIYiB0CHRvCG8gdAh0aAhoZQhlIGsIa2UIZXIIcm4IbmUIZWwIbAorICAxMS41LiAgQXR0YWNoaW5nIGdkYiB0byB0aGUga2VybmVsCiAKICAgSWYgeW91IGRvbid0IGhhdmUgdGhlIGtlcm5lbCBydW5uaW5nIHVuZGVyIGdkYiwgeW91IGNhbiBhdHRhY2ggZ2RiIHRvCiAgIGl0IGxhdGVyIGJ5IHNlbmRpbmcgdGhlIHRyYWNpbmcgdGhyZWFkIGEgU0lHVVNSMS4gIFRoZSBmaXJzdCBsaW5lIG9mCkBAIC0yODU3LDcgKzI4NTcsNyBAQAogCiAKIAotICAxCDExCDEuCC42CDYuCC4gIFUIVXMIc2kIaW4IbmcIZyBhCGFsCGx0CHRlCGVyCHJuCG5hCGF0CHRlCGUgZAhkZQhlYghidQh1ZwhnZwhnZQhlcghycwhzCisgIDExLjYuICBVc2luZyBhbHRlcm5hdGUgZGVidWdnZXJzCiAKICAgVU1MIGhhcyBzdXBwb3J0IGZvciBhdHRhY2hpbmcgdG8gYW4gYWxyZWFkeSBydW5uaW5nIGRlYnVnZ2VyIHJhdGhlcgogICB0aGFuIHN0YXJ0aW5nIGdkYiBpdHNlbGYuICBUaGlzIGlzIHByZXNlbnQgaW4gQ1ZTIGFzIG9mIDE3IEFwciAyMDAxLgpAQCAtMjg4Niw3ICsyODg2LDcgQEAKICAgQW4gZXhhbXBsZSBvZiBhbiBhbHRlcm5hdGUgZGVidWdnZXIgaXMgc3RyYWNlLiAgWW91IGNhbiBzdHJhY2UgdGhlCiAgIGFjdHVhbCBrZXJuZWwgYXMgZm9sbG93czoKIAotICArCG8gIFJ1biB0aGUgZm9sbG93aW5nIGluIGEgc2hlbGwKKyAgbyAgUnVuIHRoZSBmb2xsb3dpbmcgaW4gYSBzaGVsbAogCiAKICAgICAgICBob3N0JQpAQCAtMjg5NCwxMCArMjg5NCwxMCBAQAogCiAKIAotICArCG8gIFJ1biBVTUwgd2l0aCAnZGVidWcnIGFuZCAnZ2RiLXBpZD08cGlkPicgd2l0aCB0aGUgcGlkIHByaW50ZWQgb3V0CisgIG8gIFJ1biBVTUwgd2l0aCAnZGVidWcnIGFuZCAnZ2RiLXBpZD08cGlkPicgd2l0aCB0aGUgcGlkIHByaW50ZWQgb3V0CiAgICAgIGJ5IHRoZSBwcmV2aW91cyBjb21tYW5kCiAKLSAgKwhvICBIaXQgcmV0dXJuIGluIHRoZSBzaGVsbCwgYW5kIFVNTCB3aWxsIHN0YXJ0IHJ1bm5pbmcsIGFuZCBzdHJhY2UKKyAgbyAgSGl0IHJldHVybiBpbiB0aGUgc2hlbGwsIGFuZCBVTUwgd2lsbCBzdGFydCBydW5uaW5nLCBhbmQgc3RyYWNlCiAgICAgIG91dHB1dCB3aWxsIHN0YXJ0IGFjY3VtdWxhdGluZyBpbiB0aGUgb3V0cHV0IGZpbGUuCiAKICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gcnVubmluZwpAQCAtMjkxNyw5ICsyOTE3LDkgQEAKIAogCiAKLSAgMQgxMggyLgguICBLCEtlCGVyCHJuCG5lCGVsCGwgZAhkZQhlYghidQh1ZwhnZwhnaQhpbghuZwhnIGUIZXgIeGEIYW0IbXAIcGwIbGUIZXMIcworICAxMi4gIEtlcm5lbCBkZWJ1Z2dpbmcgZXhhbXBsZXMKIAotICAxCDEyCDIuCC4xCDEuCC4gIFQIVGgIaGUIZSBjCGNhCGFzCHNlCGUgbwhvZghmIHQIdGgIaGUIZSBoCGh1CHVuCG5nCGcgZghmcwhzYwhjawhrCisgIDEyLjEuICBUaGUgY2FzZSBvZiB0aGUgaHVuZyBmc2NrCiAKICAgV2hlbiBib290aW5nIHVwIHRoZSBrZXJuZWwsIGZzY2sgZmFpbGVkLCBhbmQgZHJvcHBlZCBtZSBpbnRvIGEgc2hlbGwKICAgdG8gZml4IHRoaW5ncyB1cC4gIEkgcmFuIGZzY2sgLXksIHdoaWNoIGh1bmc6CkBAIC0zMTU0LDkgKzMxNTQsOSBAQAogCiAgIFRoZSBpbnRlcmVzdGluZyB0aGluZ3MgaGVyZSBhcmUgOgogCi0gICsIbyAgVGhlcmUgYXJlIHR3byBzZWdmYXVsdHMgb24gdGhpcyBzdGFjayAoZnJhbWVzIDkgYW5kIDE0KQorICBvICBUaGVyZSBhcmUgdHdvIHNlZ2ZhdWx0cyBvbiB0aGlzIHN0YWNrIChmcmFtZXMgOSBhbmQgMTQpCiAKLSAgKwhvICBUaGUgZmlyc3QgZmF1bHRpbmcgYWRkcmVzcyAoZnJhbWUgMTEpIGlzIDB4NTAwMDA4MDAKKyAgbyAgVGhlIGZpcnN0IGZhdWx0aW5nIGFkZHJlc3MgKGZyYW1lIDExKSBpcyAweDUwMDAwODAwCiAKICAgKGdkYikgcCAodm9pZCAqKTEzNDIxNzkzMjgKICAgJDE2ID0gKHZvaWQgKikgMHg1MDAwMDgwMApAQCAtMzM5OSw3ICszMzk5LDcgQEAKICAgb24gd2lsbCBiZSBzb21ld2hhdCBjbGVhcmVyLgogCiAKLSAgMQgxMggyLgguMggyLgguICBFCEVwCHBpCGlzCHNvCG9kCGRlCGUgMggyOgg6IFQIVGgIaGUIZSBjCGNhCGFzCHNlCGUgbwhvZghmIHQIdGgIaGUIZSBoCGh1CHVuCG5nCGcgZghmcwhzYwhjawhrCisgIDEyLjIuICBFcGlzb2RlIDI6IFRoZSBjYXNlIG9mIHRoZSBodW5nIGZzY2sKIAogICBBZnRlciBzZXR0aW5nIGEgdHJhcCBpbiB0aGUgU0VHViBoYW5kbGVyIGZvciBhY2Nlc3NlcyB0byB0aGUgc2lnbmFsCiAgIHRocmVhZCdzIHN0YWNrLCBJIHJlcmFuIHRoZSBrZXJuZWwuCkBAIC0zNzg4LDEyICszNzg4LDEyIEBACiAKIAogCi0gIDEIMTMIMy4ILiAgVwhXaAhoYQhhdAh0IHQIdG8IbyBkCGRvCG8gdwh3aAhoZQhlbghuIFUIVU0ITUwITCBkCGRvCG9lCGVzCHNuCG4nCCd0CHQgdwh3bwhvcghyawhrCisgIDEzLiAgV2hhdCB0byBkbyB3aGVuIFVNTCBkb2Vzbid0IHdvcmsKIAogCiAKIAotICAxCDEzCDMuCC4xCDEuCC4gIFMIU3QIdHIIcmEIYW4IbmcIZ2UIZSBjCGNvCG9tCG1wCHBpCGlsCGxhCGF0CHRpCGlvCG9uCG4gZQhlcghycghybwhvcghycwhzIHcId2gIaGUIZW4IbiB5CHlvCG91CHUgYghidQh1aQhpbAhsZAhkIGYIZnIIcm8Ib20IbSBzCHNvCG91CHVyCHJjCGNlCGUKKyAgMTMuMS4gIFN0cmFuZ2UgY29tcGlsYXRpb24gZXJyb3JzIHdoZW4geW91IGJ1aWxkIGZyb20gc291cmNlCiAKICAgQXMgb2YgdGVzdDExLCBpdCBpcyBuZWNlc3NhcnkgdG8gaGF2ZSAiQVJDSD11bSIgaW4gdGhlIGVudmlyb25tZW50IG9yCiAgIG9uIHRoZSBtYWtlIGNvbW1hbmQgbGluZSBmb3IgYWxsIHN0ZXBzIGluIGJ1aWxkaW5nIFVNTCwgaW5jbHVkaW5nCkBAIC0zODI0LDggKzM4MjQsOCBAQAogCiAKIAotICAxCDEzCDMuCC4zCDMuCC4gIEEIQSB2CHZhCGFyCHJpCGllCGV0CHR5CHkgbwhvZghmIHAIcGEIYW4IbmkIaWMIY3MIcyBhCGFuCG5kCGQgaAhoYQhhbghuZwhncwhzIHcId2kIaXQIdGgIaCAvCC90CHRtCG1wCHAgbwhvbghuIGEIYSByCHJlCGVpCGlzCHNlCGVyCHJmCGZzCHMgIGYIZmkIaWwIbGUIZXMIc3kIeXMIcy0ILQotICB0CHRlCGVtCG0KKyAgMTMuMy4gIEEgdmFyaWV0eSBvZiBwYW5pY3MgYW5kIGhhbmdzIHdpdGggL3RtcCBvbiBhIHJlaXNlcmZzICBmaWxlc3lzLQorICB0ZW0KIAogICBJIHNhdyB0aGlzIG9uIHJlaXNlcmZzIDMuNS4yMSBhbmQgaXQgc2VlbXMgdG8gYmUgZml4ZWQgaW4gMy41LjI3LgogICBQYW5pY3MgcHJlY2VkZWQgYnkKQEAgLTM4NDIsOCArMzg0Miw4IEBACiAKIAogCi0gIDEIMTMIMy4ILjQINC4ILiAgVAhUaAhoZQhlIGMIY28Ib20IbXAIcGkIaWwIbGUIZSBmCGZhCGFpCGlsCGxzCHMgdwh3aQhpdAh0aAhoIGUIZXIIcnIIcm8Ib3IIcnMIcyBhCGFiCGJvCG91CHV0CHQgYwhjbwhvbghuZghmbAhsaQhpYwhjdAh0aQhpbghuZwhnIHQIdHkIeXAIcGUIZXMIcyBmCGZvCG9yCHIKLSAgJwgnbwhvcAhwZQhlbghuJwgnLAgsICcIJ2QIZHUIdXAIcCcIJywILCBhCGFuCG5kCGQgJwgndwh3YQhhaQhpdAh0cAhwaQhpZAhkJwgnCisgIDEzLjQuICBUaGUgY29tcGlsZSBmYWlscyB3aXRoIGVycm9ycyBhYm91dCBjb25mbGljdGluZyB0eXBlcyBmb3IKKyAgJ29wZW4nLCAnZHVwJywgYW5kICd3YWl0cGlkJwogCiAgIFRoaXMgaGFwcGVucyB3aGVuIHlvdSBidWlsZCBpbiAvdXNyL3NyYy9saW51eC4gIFRoZSBVTUwgYnVpbGQgbWFrZXMKICAgdGhlIGluY2x1ZGUvYXNtIGxpbmsgcG9pbnQgdG8gaW5jbHVkZS9hc20tdW0uICAvdXNyL2luY2x1ZGUvYXNtIHBvaW50cwpAQCAtMzg1NCwxNCArMzg1NCwxNCBAQAogCiAKIAotICAxCDEzCDMuCC41CDUuCC4gIFUIVU0ITUwITCBkCGRvCG9lCGVzCHNuCG4nCCd0CHQgdwh3bwhvcghyawhrIHcId2gIaGUIZW4IbiAvCC90CHRtCG1wCHAgaQhpcwhzIGEIYW4IbiBOCE5GCEZTCFMgZghmaQhpbAhsZQhlcwhzeQh5cwhzdAh0ZQhlbQhtCisgIDEzLjUuICBVTUwgZG9lc24ndCB3b3JrIHdoZW4gL3RtcCBpcyBhbiBORlMgZmlsZXN5c3RlbQogCiAgIFRoaXMgc2VlbXMgdG8gYmUgYSBzaW1pbGFyIHNpdHVhdGlvbiB3aXRoIHRoZSBSZWlzZXJGUyBwcm9ibGVtIGFib3ZlLgogICBTb21lIHZlcnNpb25zIG9mIE5GUyBzZWVtcyBub3QgdG8gaGFuZGxlIG1tYXAgY29ycmVjdGx5LCB3aGljaCBVTUwKICAgZGVwZW5kcyBvbi4gIFRoZSB3b3JrYXJvdW5kIGlzIGhhdmUgL3RtcCBiZSBhIG5vbi1ORlMgZGlyZWN0b3J5LgogCiAKLSAgMQgxMwgzLgguNgg2LgguICBVCFVNCE1MCEwgaAhoYQhhbghuZwhncwhzIG8Ib24IbiBiCGJvCG9vCG90CHQgdwh3aAhoZQhlbghuIGMIY28Ib20IbXAIcGkIaWwIbGUIZWQIZCB3CHdpCGl0CHRoCGggZwhncAhwcghybwhvZghmIHMIc3UIdXAIcHAIcG8Ib3IIcnQIdAorICAxMy42LiAgVU1MIGhhbmdzIG9uIGJvb3Qgd2hlbiBjb21waWxlZCB3aXRoIGdwcm9mIHN1cHBvcnQKIAogICBJZiB5b3UgYnVpbGQgVU1MIHdpdGggZ3Byb2Ygc3VwcG9ydCBhbmQsIGVhcmx5IGluIHRoZSBib290LCBpdCBkb2VzCiAgIHRoaXMKQEAgLTM4NzgsNyArMzg3OCw3IEBACiAKIAogCi0gIDEIMTMIMy4ILjcINy4ILiAgcwhzeQh5cwhzbAhsbwhvZwhnZAhkIGQIZGkIaWUIZXMIcyB3CHdpCGl0CHRoCGggYQhhIFMIU0kISUcIR1QIVEUIRVIIUk0ITSBvCG9uCG4gcwhzdAh0YQhhcghydAh0dQh1cAhwCisgIDEzLjcuICBzeXNsb2dkIGRpZXMgd2l0aCBhIFNJR1RFUk0gb24gc3RhcnR1cAogCiAgIFRoZSBleGFjdCBib290IGVycm9yIGRlcGVuZHMgb24gdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IHlvdSdyZSBib290aW5nLAogICBidXQgRGViaWFuIHByb2R1Y2VzIHRoaXM6CkBAIC0zODk3LDE3ICszODk3LDE3IEBACiAKIAogCi0gIDEIMTMIMy4ILjgIOC4ILiAgVAhUVQhVTghOLwgvVAhUQQhBUAhQIG4IbmUIZXQIdHcId28Ib3IIcmsIa2kIaW4IbmcIZyBkCGRvCG9lCGVzCHNuCG4nCCd0CHQgdwh3bwhvcghyawhrIG8Ib24IbiBhCGEgMggyLgguNAg0IGgIaG8Ib3MIc3QIdAorICAxMy44LiAgVFVOL1RBUCBuZXR3b3JraW5nIGRvZXNuJ3Qgd29yayBvbiBhIDIuNCBob3N0CiAKICAgVGhlcmUgYXJlIGEgY291cGxlIG9mIHByb2JsZW1zIHdoaWNoIHdlcmUKICAgPGh0dHA6Ly93d3cuZ2VvY3Jhd2xlci5jb20vbGlzdHMvMy9Tb3VyY2VGb3JnZS81OTcvMC8+IG5hbWU9InBvaW50ZWQKICAgb3V0Ij4gIGJ5IFRpbSBSb2JpbnNvbiA8dGltcm8gYXQgdHJrciBkb3QgbmV0PgogCi0gICsIbyAgSXQgZG9lc24ndCB3b3JrIG9uIGhvc3RzIHJ1bm5pbmcgMi40LjcgKG9yIHRoZXJlYWJvdXRzKSBvciBlYXJsaWVyLgorICBvICBJdCBkb2Vzbid0IHdvcmsgb24gaG9zdHMgcnVubmluZyAyLjQuNyAob3IgdGhlcmVhYm91dHMpIG9yIGVhcmxpZXIuCiAgICAgIFRoZSBmaXggaXMgdG8gdXBncmFkZSB0byBzb21ldGhpbmcgbW9yZSByZWNlbnQgYW5kIHRoZW4gcmVhZCB0aGUKICAgICAgbmV4dCBpdGVtLgogCi0gICsIbyAgSWYgeW91IHNlZQorICBvICBJZiB5b3Ugc2VlCiAKIAogICAgICAgIEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUKQEAgLTM5MjEsOCArMzkyMSw4IEBACiAKIAogCi0gIDEIMTMIMy4ILjkIOS4ILiAgWQhZbwhvdQh1IGMIY2EIYW4IbiBuCG5lCGV0CHR3CHdvCG9yCHJrCGsgdAh0bwhvIHQIdGgIaGUIZSBoCGhvCG9zCHN0CHQgYghidQh1dAh0IG4Ibm8Ib3QIdCB0CHRvCG8gbwhvdAh0aAhoZQhlcghyIG0IbWEIYWMIY2gIaGkIaW4IbmUIZXMIcyBvCG9uCG4gdAh0aAhoZQhlCi0gIG4IbmUIZXQIdAorICAxMy45LiAgWW91IGNhbiBuZXR3b3JrIHRvIHRoZSBob3N0IGJ1dCBub3QgdG8gb3RoZXIgbWFjaGluZXMgb24gdGhlCisgIG5ldAogCiAgIElmIHlvdSBjYW4gY29ubmVjdCB0byB0aGUgaG9zdCwgYW5kIHRoZSBob3N0IGNhbiBjb25uZWN0IHRvIFVNTCwgYnV0CiAgIHlvdSBjYW5ub3QgY29ubmVjdCB0byBhbnkgb3RoZXIgbWFjaGluZXMsIHRoZW4geW91IG1heSBuZWVkIHRvIGVuYWJsZQpAQCAtMzk3Miw3ICszOTcyLDcgQEAKIAogCiAKLSAgMQgxMwgzLgguMQgxMAgwLgguICBJCEkgaAhoYQhhdgh2ZQhlIG4Ibm8IbyByCHJvCG9vCG90CHQgYQhhbghuZAhkIEkISSB3CHdhCGFuCG50CHQgdAh0bwhvIHMIc2MIY3IIcmUIZWEIYW0IbQorICAxMy4xMC4gIEkgaGF2ZSBubyByb290IGFuZCBJIHdhbnQgdG8gc2NyZWFtCiAKICAgVGhhbmtzIHRvIEJpcmdpdCBXYWhsaWNoIGZvciB0ZWxsaW5nIG1lIGFib3V0IHRoaXMgc3RyYW5nZSBvbmUuICBJdAogICB0dXJucyBvdXQgdGhhdCB0aGVyZSdzIGEgbGltaXQgb2Ygc2l4IGVudmlyb25tZW50IHZhcmlhYmxlcyBvbiB0aGUKQEAgLTM5ODcsNyArMzk4Nyw3IEBACiAKIAogCi0gIDEIMTMIMy4ILjEIMTEIMS4ILiAgVQhVTQhNTAhMIGIIYnUIdWkIaWwIbGQIZCBjCGNvCG9uCG5mCGZsCGxpCGljCGN0CHQgYghiZQhldAh0dwh3ZQhlZQhlbghuIHAIcHQIdHIIcmEIYWMIY2UIZS4ILmgIaCBhCGFuCG5kCGQgdQh1YwhjbwhvbghudAh0ZQhleAh4dAh0LgguaAhoCisgIDEzLjExLiAgVU1MIGJ1aWxkIGNvbmZsaWN0IGJldHdlZW4gcHRyYWNlLmggYW5kIHVjb250ZXh0LmgKIAogICBPbiBzb21lIG9sZGVyIHN5c3RlbXMsIC91c3IvaW5jbHVkZS9hc20vcHRyYWNlLmggYW5kCiAgIC91c3IvaW5jbHVkZS9zeXMvdWNvbnRleHQuaCBkZWZpbmUgdGhlIHNhbWUgbmFtZXMuICBTbywgd2hlbiB0aGV5J3JlCkBAIC00MDA3LDcgKzQwMDcsNyBAQAogCiAKIAotICAxCDEzCDMuCC4xCDEyCDIuCC4gIFQIVGgIaGUIZSBVCFVNCE1MCEwgQghCbwhvZwhnbwhvTQhNaQhpcAhwcwhzIGkIaXMIcyBlCGV4CHhhCGFjCGN0CHRsCGx5CHkgaAhoYQhhbAhsZghmIHQIdGgIaGUIZSBoCGhvCG9zCHN0CHQnCCdzCHMgQghCbwhvZwhnbwhvTQhNaQhpcAhwcwhzCisgIDEzLjEyLiAgVGhlIFVNTCBCb2dvTWlwcyBpcyBleGFjdGx5IGhhbGYgdGhlIGhvc3QncyBCb2dvTWlwcwogCiAgIE9uIGkzODYga2VybmVscywgdGhlcmUgYXJlIHR3byB3YXlzIG9mIHJ1bm5pbmcgdGhlIGxvb3AgdGhhdCBpcyB1c2VkCiAgIHRvIGNhbGN1bGF0ZSB0aGUgQm9nb01pcHMgcmF0aW5nLCB1c2luZyB0aGUgVFNDIGlmIGl0J3MgdGhlcmUgb3IgdXNpbmcKQEAgLTQwMTksNyArNDAxOSw3IEBACiAKIAogCi0gIDEIMTMIMy4ILjEIMTMIMy4ILiAgVwhXaAhoZQhlbghuIHkIeW8Ib3UIdSByCHJ1CHVuCG4gVQhVTQhNTAhMLAgsIGkIaXQIdCBpCGltCG1tCG1lCGVkCGRpCGlhCGF0CHRlCGVsCGx5CHkgcwhzZQhlZwhnZghmYQhhdQh1bAhsdAh0cwhzCisgIDEzLjEzLiAgV2hlbiB5b3UgcnVuIFVNTCwgaXQgaW1tZWRpYXRlbHkgc2VnZmF1bHRzCiAKICAgSWYgdGhlIGhvc3QgaXMgY29uZmlndXJlZCB3aXRoIHRoZSAyRy8yRyBhZGRyZXNzIHNwYWNlIHNwbGl0LCB0aGF0J3MKICAgd2h5LiAgU2VlIGBgVU1MIG9uIDJHLzJHIGhvc3RzJycgIGZvciB0aGUgZGV0YWlscyBvbiBnZXR0aW5nIFVNTCB0bwpAQCAtNDAyNyw3ICs0MDI3LDcgQEAKIAogCiAKLSAgMQgxMwgzLgguMQgxNAg0LgguICB4CHh0CHRlCGVyCHJtCG1zCHMgYQhhcAhwcAhwZQhlYQhhcghyLAgsIHQIdGgIaGUIZW4IbiBpCGltCG1tCG1lCGVkCGRpCGlhCGF0CHRlCGVsCGx5CHkgZAhkaQhpcwhzYQhhcAhwcAhwZQhlYQhhcghyCisgIDEzLjE0LiAgeHRlcm1zIGFwcGVhciwgdGhlbiBpbW1lZGlhdGVseSBkaXNhcHBlYXIKIAogICBJZiB5b3UncmUgcnVubmluZyBhbiB1cCB0byBkYXRlIGtlcm5lbCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mCiAgIHVtbF91dGlsaXRpZXMsIHRoZSBwb3J0LWhlbHBlciBwcm9ncmFtIHdpbGwgbm90IHdvcmsgcHJvcGVybHksIHNvCkBAIC00MDM5LDcgKzQwMzksNyBAQAogCiAKIAotICAxCDEzCDMuCC4xCDE1CDUuCC4gIEEIQW4IbnkIeSBvCG90CHRoCGhlCGVyCHIgcAhwYQhhbghuaQhpYwhjLAgsIGgIaGEIYW4IbmcIZywILCBvCG9yCHIgcwhzdAh0cghyYQhhbghuZwhnZQhlIGIIYmUIZWgIaGEIYXYIdmkIaW8Ib3IIcgorICAxMy4xNS4gIEFueSBvdGhlciBwYW5pYywgaGFuZywgb3Igc3RyYW5nZSBiZWhhdmlvcgogCiAgIElmIHlvdSdyZSBzZWVpbmcgdHJ1bHkgc3RyYW5nZSBiZWhhdmlvciwgc3VjaCBhcyBoYW5ncyBvciBwYW5pY3MgdGhhdAogICBoYXBwZW4gaW4gcmFuZG9tIHBsYWNlcywgb3IgeW91IHRyeSBydW5uaW5nIHRoZSBkZWJ1Z2dlciB0byBzZWUgd2hhdCdzCkBAIC00MDU5LDcgKzQwNTksNyBAQAogCiAgIElmIHlvdSB3YW50IHRvIGJlIHN1cGVyLWhlbHBmdWwsIHJlYWQgYGBEaWFnbm9zaW5nIFByb2JsZW1zJycgYW5kCiAgIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGNvbnRhaW5lZCB0aGVyZWluLgotICAxCDE0CDQuCC4gIEQIRGkIaWEIYWcIZ24Ibm8Ib3MIc2kIaW4IbmcIZyBQCFByCHJvCG9iCGJsCGxlCGVtCG1zCHMKKyAgMTQuICBEaWFnbm9zaW5nIFByb2JsZW1zCiAKIAogICBJZiB5b3UgZ2V0IFVNTCB0byBjcmFzaCwgaGFuZywgb3Igb3RoZXJ3aXNlIG1pc2JlaGF2ZSwgeW91IHNob3VsZApAQCAtNDA3OCw3ICs0MDc4LDcgQEAKICAgYGBLZXJuZWwgZGVidWdnaW5nJycgIFVNTCBmaXJzdC4KIAogCi0gIDEIMTQINC4ILjEIMS4ILiAgQwhDYQhhcwhzZQhlIDEIMSA6CDogTghObwhvcghybQhtYQhhbAhsIGsIa2UIZXIIcm4IbmUIZWwIbCBwCHBhCGFuCG5pCGljCGNzCHMKKyAgMTQuMS4gIENhc2UgMSA6IE5vcm1hbCBrZXJuZWwgcGFuaWNzCiAKICAgVGhlIG1vc3QgY29tbW9uIGNhc2UgaXMgZm9yIGEgbm9ybWFsIHRocmVhZCB0byBwYW5pYy4gIFRvIGRlYnVnIHRoaXMsCiAgIHlvdSB3aWxsIG5lZWQgdG8gcnVuIGl0IHVuZGVyIHRoZSBkZWJ1Z2dlciAoYWRkICdkZWJ1ZycgdG8gdGhlIGNvbW1hbmQKQEAgLTQxMjgsNyArNDEyOCw3IEBACiAgIHRvIGdldCB0aGF0IGluZm9ybWF0aW9uIGZyb20gdGhlIGZhdWx0aW5nIGlwLgogCiAKLSAgMQgxNAg0LgguMggyLgguICBDCENhCGFzCHNlCGUgMggyIDoIOiBUCFRyCHJhCGFjCGNpCGluCG5nCGcgdAh0aAhocghyZQhlYQhhZAhkIHAIcGEIYW4IbmkIaWMIY3MIcworICAxNC4yLiAgQ2FzZSAyIDogVHJhY2luZyB0aHJlYWQgcGFuaWNzCiAKICAgVGhlIGxlc3MgY29tbW9uIGFuZCBtb3JlIHBhaW5mdWwgY2FzZSBpcyB3aGVuIHRoZSB0cmFjaW5nIHRocmVhZAogICBwYW5pY3MuICBJbiB0aGlzIGNhc2UsIHRoZSBrZXJuZWwgZGVidWdnZXIgd2lsbCBiZSB1c2VsZXNzIGJlY2F1c2UgaXQKQEAgLTQxNjEsNyArNDE2MSw3IEBACiAgIGJhY2t0cmFjZSBpbiBhbmQgd2FpdCBmb3Igb3VyIGNyYWNrIGRlYnVnZ2luZyB0ZWFtIHRvIGZpeCB0aGUgcHJvYmxlbS4KIAogCi0gIDEIMTQINC4ILjMIMy4ILiAgQwhDYQhhcwhzZQhlIDMIMyA6CDogVAhUcghyYQhhYwhjaQhpbghuZwhnIHQIdGgIaHIIcmUIZWEIYWQIZCBwCHBhCGFuCG5pCGljCGNzCHMgYwhjYQhhdQh1cwhzZQhlZAhkIGIIYnkIeSBvCG90CHRoCGhlCGVyCHIgdAh0aAhocghyZQhlYQhhZAhkcwhzCisgIDE0LjMuICBDYXNlIDMgOiBUcmFjaW5nIHRocmVhZCBwYW5pY3MgY2F1c2VkIGJ5IG90aGVyIHRocmVhZHMKIAogICBIb3dldmVyLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIG1pc2JlaGF2aW9yIG9mIGFub3RoZXIgdGhyZWFkCiAgIGNhdXNlZCB0aGUgcHJvYmxlbS4gIFRoZSBtb3N0IGNvbW1vbiBwYW5pYyBvZiB0aGlzIHR5cGUgaXM6CkBAIC00MjI3LDcgKzQyMjcsNyBAQAogCiAKIAotICAxCDE0CDQuCC40CDQuCC4gIEMIQ2EIYXMIc2UIZSA0CDQgOgg6IEgISGEIYW4IbmcIZ3MIcworICAxNC40LiAgQ2FzZSA0IDogSGFuZ3MKIAogICBIYW5ncyBzZWVtIHRvIGJlIGZhaXJseSByYXJlLCBidXQgdGhleSBzb21ldGltZXMgaGFwcGVuLiAgV2hlbiBhIGhhbmcKICAgaGFwcGVucywgd2UgbmVlZCBhIGJhY2t0cmFjZSBmcm9tIHRoZSBvZmZlbmRpbmcgcHJvY2Vzcy4gIFJ1biB0aGUKQEAgLTQyNTcsNyArNDI1Nyw3IEBACiAKIAogCi0gIDEIMTUINS4ILiAgVAhUaAhoYQhhbghuawhrcwhzCisgIDE1LiAgVGhhbmtzCiAKIAogICBBIG51bWJlciBvZiBwZW9wbGUgaGF2ZSBoZWxwZWQgdGhpcyBwcm9qZWN0IGluIHZhcmlvdXMgd2F5cywgYW5kIHRoaXMKQEAgLTQyNzQsMjAgKzQyNzQsMjAgQEAKICAgYm9va2tlZXBpbmcgbGFwc2VzIGFuZCBJIGZvcmdldCBhYm91dCBjb250cmlidXRpb25zLgogCiAKLSAgMQgxNQg1LgguMQgxLgguICBDCENvCG9kCGRlCGUgYQhhbghuZAhkIEQIRG8Ib2MIY3UIdW0IbWUIZW4IbnQIdGEIYXQIdGkIaW8Ib24IbgorICAxNS4xLiAgQ29kZSBhbmQgRG9jdW1lbnRhdGlvbgogCiAgIFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5IGF0IGxpbnV4Y2FyZS5jb20uYXU+ICAtCiAKLSAgKwhvICB3cm90ZSB0aGUgIEhPV1RPIDxodHRwOi8vdXNlci1tb2RlLQorICBvICB3cm90ZSB0aGUgIEhPV1RPIDxodHRwOi8vdXNlci1tb2RlLQogICAgICBsaW51eC5zb3VyY2Vmb3JnZS5uZXQvVXNlck1vZGVMaW51eC1IT1dUTy5odG1sPgogCi0gICsIbyAgcHJvZGRlZCBtZSBpbnRvIG1ha2luZyB0aGlzIHByb2plY3Qgb2ZmaWNpYWwgYW5kIHB1dHRpbmcgaXQgb24KKyAgbyAgcHJvZGRlZCBtZSBpbnRvIG1ha2luZyB0aGlzIHByb2plY3Qgb2ZmaWNpYWwgYW5kIHB1dHRpbmcgaXQgb24KICAgICAgU291cmNlRm9yZ2UKIAotICArCG8gIGNhbWUgdXAgd2l0aCB0aGUgd2F5IGNvb2wgVU1MIGxvZ28gPGh0dHA6Ly91c2VyLW1vZGUtCisgIG8gIGNhbWUgdXAgd2l0aCB0aGUgd2F5IGNvb2wgVU1MIGxvZ28gPGh0dHA6Ly91c2VyLW1vZGUtCiAgICAgIGxpbnV4LnNvdXJjZWZvcmdlLm5ldC91bWwtc21hbGwucG5nPgogCi0gICsIbyAgcmVkaWQgdGhlIGNvbmZpZyBwcm9jZXNzCisgIG8gIHJlZGlkIHRoZSBjb25maWcgcHJvY2VzcwogCiAKICAgUGV0ZXIgTW91bGRlciA8cmVpdGVyIGF0IG5ldHNwYWNlLm5ldC5hdT4gIC0gRml4ZWQgbXkgY29uZmlnIGFuZCBidWlsZApAQCAtNDI5NiwxOCArNDI5NiwxOCBAQAogCiAgIEJpbGwgU3RlYXJucyA8d3N0ZWFybnMgYXQgcG9ib3guY29tPiAgLQogCi0gICsIbyAgSE9XVE8gdXBkYXRlcworICBvICBIT1dUTyB1cGRhdGVzCiAKLSAgKwhvICBsb3RzIG9mIGJ1ZyByZXBvcnRzCisgIG8gIGxvdHMgb2YgYnVnIHJlcG9ydHMKIAotICArCG8gIGxvdHMgb2YgdGVzdGluZworICBvICBsb3RzIG9mIHRlc3RpbmcKIAotICArCG8gIGRlZGljYXRlZCBhIGJveCAodW1sLmlzdHMuZGFydG1vdXRoLmVkdSkgdG8gc3VwcG9ydCBVTUwgZGV2ZWxvcG1lbnQKKyAgbyAgZGVkaWNhdGVkIGEgYm94ICh1bWwuaXN0cy5kYXJ0bW91dGguZWR1KSB0byBzdXBwb3J0IFVNTCBkZXZlbG9wbWVudAogCi0gICsIbyAgd3JvdGUgdGhlIG1rcm9vdGZzIHNjcmlwdCwgd2hpY2ggYWxsb3dzIGJvb3RhYmxlIGZpbGVzeXN0ZW1zIG9mCisgIG8gIHdyb3RlIHRoZSBta3Jvb3RmcyBzY3JpcHQsIHdoaWNoIGFsbG93cyBib290YWJsZSBmaWxlc3lzdGVtcyBvZgogICAgICBSUE0tYmFzZWQgZGlzdHJpYnV0aW9ucyB0byBiZSBjcmFua2VkIG91dAogCi0gICsIbyAgY3JhbmtlZCBvdXQgYSBsYXJnZSBudW1iZXIgb2YgZmlsZXN5c3RlbXMgd2l0aCBzYWlkIHNjcmlwdAorICBvICBjcmFua2VkIG91dCBhIGxhcmdlIG51bWJlciBvZiBmaWxlc3lzdGVtcyB3aXRoIHNhaWQgc2NyaXB0CiAKIAogICBKaW0gTGV1IDxqbGV1IGF0IG1pbmRzcHJpbmcuY29tPiAgLSBXcm90ZSB0aGUgdmlydHVhbCBldGhlcm5ldCBkcml2ZXIKQEAgLTQzNzUsMTc2ICs0Mzc1LDE3NiBAQAogCiAgIERhdmlkIENvdWxzb24gPGh0dHA6Ly9kYXZpZGNvdWxzb24ubmV0PiAgLQogCi0gICsIbyAgU2V0IHVwIHRoZSB1c2VybW9kZWxpbnV4Lm9yZyA8aHR0cDovL3VzZXJtb2RlbGludXgub3JnPiAgc2l0ZSwKKyAgbyAgU2V0IHVwIHRoZSB1c2VybW9kZWxpbnV4Lm9yZyA8aHR0cDovL3VzZXJtb2RlbGludXgub3JnPiAgc2l0ZSwKICAgICAgd2hpY2ggaXMgYSBncmVhdCB3YXkgb2Yga2VlcGluZyB0aGUgVU1MIHVzZXIgY29tbXVuaXR5IG9uIHRvcCBvZgogICAgICBVTUwgZ29pbmdzLW9uLgogCi0gICsIbyAgU2l0ZSBkb2N1bWVudGF0aW9uIGFuZCB1cGRhdGVzCisgIG8gIFNpdGUgZG9jdW1lbnRhdGlvbiBhbmQgdXBkYXRlcwogCi0gICsIbyAgTmlmdHkgbGl0dGxlIFVNTCBtYW5hZ2VtZW50IGRhZW1vbiAgVU1MZAorICBvICBOaWZ0eSBsaXR0bGUgVU1MIG1hbmFnZW1lbnQgZGFlbW9uICBVTUxkCiAgICAgIDxodHRwOi8vdW1sLm9wZW5jb25zdWx0YW5jeS5jb20vdW1sZC8+CiAKLSAgKwhvICBMb3RzIG9mIHRlc3RpbmcgYW5kIGJ1ZyByZXBvcnRzCisgIG8gIExvdHMgb2YgdGVzdGluZyBhbmQgYnVnIHJlcG9ydHMKIAogCiAKIAotICAxCDE1CDUuCC4yCDIuCC4gIEYIRmwIbHUIdXMIc2gIaGkIaW4IbmcIZyBvCG91CHV0CHQgYghidQh1ZwhncwhzCisgIDE1LjIuICBGbHVzaGluZyBvdXQgYnVncwogCiAKIAotICArCG8gIFl1cmkgUHVkZ29yb2Rza3kKKyAgbyAgWXVyaSBQdWRnb3JvZHNreQogCi0gICsIbyAgR2VyYWxkIEJyaXR0b24KKyAgbyAgR2VyYWxkIEJyaXR0b24KIAotICArCG8gIElhbiBXZWhybWFuCisgIG8gIElhbiBXZWhybWFuCiAKLSAgKwhvICBHb3JkIExhbWIKKyAgbyAgR29yZCBMYW1iCiAKLSAgKwhvICBFdWdlbmUgS29vbnR6CisgIG8gIEV1Z2VuZSBLb29udHoKIAotICArCG8gIEpvaG4gSC4gSGFydG1hbgorICBvICBKb2huIEguIEhhcnRtYW4KIAotICArCG8gIEFuZGVycyBLYXJsc3NvbgorICBvICBBbmRlcnMgS2FybHNzb24KIAotICArCG8gIERhbmllbCBQaGlsbGlwcworICBvICBEYW5pZWwgUGhpbGxpcHMKIAotICArCG8gIEpvaG4gRnJlbWxpbgorICBvICBKb2huIEZyZW1saW4KIAotICArCG8gIFJhaW5lciBCdXJnc3RhbGxlcgorICBvICBSYWluZXIgQnVyZ3N0YWxsZXIKIAotICArCG8gIEphbWVzIFN0ZXZlbnNvbgorICBvICBKYW1lcyBTdGV2ZW5zb24KIAotICArCG8gIE1hdHQgQ2xheQorICBvICBNYXR0IENsYXkKIAotICArCG8gIENsaWZmIEplZmZlcmllcworICBvICBDbGlmZiBKZWZmZXJpZXMKIAotICArCG8gIEdlb2ZmIEhvZmYKKyAgbyAgR2VvZmYgSG9mZgogCi0gICsIbyAgTGVubmVydCBCdXl0ZW5oZWsKKyAgbyAgTGVubmVydCBCdXl0ZW5oZWsKIAotICArCG8gIEFsIFZpcm8KKyAgbyAgQWwgVmlybwogCi0gICsIbyAgRnJhbmsgS2xpbmdlbmhvZWZlcgorICBvICBGcmFuayBLbGluZ2VuaG9lZmVyCiAKLSAgKwhvICBMaXZpbyBCYWxkaW5pIFNvYXJlcworICBvICBMaXZpbyBCYWxkaW5pIFNvYXJlcwogCi0gICsIbyAgSm9uIEJ1cmdlc3MKKyAgbyAgSm9uIEJ1cmdlc3MKIAotICArCG8gIFBldHJ1IFBhbGVyCisgIG8gIFBldHJ1IFBhbGVyCiAKLSAgKwhvICBQYXVsCisgIG8gIFBhdWwKIAotICArCG8gIENocmlzIFJlYWhhcmQKKyAgbyAgQ2hyaXMgUmVhaGFyZAogCi0gICsIbyAgU3ZlcmtlciBOaWxzc29uCisgIG8gIFN2ZXJrZXIgTmlsc3NvbgogCi0gICsIbyAgR29uZyBTdQorICBvICBHb25nIFN1CiAKLSAgKwhvICBqb2hhbiB2ZXJyZXB0CisgIG8gIGpvaGFuIHZlcnJlcHQKIAotICArCG8gIEJqb3JuIEVyaWtzc29uCisgIG8gIEJqb3JuIEVyaWtzc29uCiAKLSAgKwhvICBMb3JlbnpvIEFsbGVncnVjY2kKKyAgbyAgTG9yZW56byBBbGxlZ3J1Y2NpCiAKLSAgKwhvICBNdWxpIEJlbi1ZZWh1ZGEKKyAgbyAgTXVsaSBCZW4tWWVodWRhCiAKLSAgKwhvICBEYXZpZCBNYW5zZmllbGQKKyAgbyAgRGF2aWQgTWFuc2ZpZWxkCiAKLSAgKwhvICBIb3dhcmQgR29mZgorICBvICBIb3dhcmQgR29mZgogCi0gICsIbyAgTWlrZSBBbmRlcnNvbgorICBvICBNaWtlIEFuZGVyc29uCiAKLSAgKwhvICBKb2huIEJ5cm5lCisgIG8gIEpvaG4gQnlybmUKIAotICArCG8gIFNhcGFuIEouIEJhdGlhCisgIG8gIFNhcGFuIEouIEJhdGlhCiAKLSAgKwhvICBJcmlzIEh1YW5nCisgIG8gIElyaXMgSHVhbmcKIAotICArCG8gIEphbiBIdWRlYworICBvICBKYW4gSHVkZWMKIAotICArCG8gIFZvbHVzcGEKKyAgbyAgVm9sdXNwYQogCiAKIAogCi0gIDEIMTUINS4ILjMIMy4ILiAgQghCdQh1ZwhnbAhsZQhldAh0cwhzIGEIYW4IbmQIZCBjCGNsCGxlCGVhCGFuCG4tCC11CHVwCHBzCHMKKyAgMTUuMy4gIEJ1Z2xldHMgYW5kIGNsZWFuLXVwcwogCiAKIAotICArCG8gIERhdmUgWmFyenlja2kKKyAgbyAgRGF2ZSBaYXJ6eWNraQogCi0gICsIbyAgQWRhbSBMYXp1cgorICBvICBBZGFtIExhenVyCiAKLSAgKwhvICBCb3JpYSBGZWlnaW4KKyAgbyAgQm9yaWEgRmVpZ2luCiAKLSAgKwhvICBCcmlhbiBKLiBNdXJyZWxsCisgIG8gIEJyaWFuIEouIE11cnJlbGwKIAotICArCG8gIEpTCisgIG8gIEpTCiAKLSAgKwhvICBSb21hbiBaaXBwZWwKKyAgbyAgUm9tYW4gWmlwcGVsCiAKLSAgKwhvICBXaWwgQ29vbGV5CisgIG8gIFdpbCBDb29sZXkKIAotICArCG8gIEF5ZWxldCBTaGVtZXNoCisgIG8gIEF5ZWxldCBTaGVtZXNoCiAKLSAgKwhvICBXaWxsIER5c29uCisgIG8gIFdpbGwgRHlzb24KIAotICArCG8gIFN2ZXJrZXIgTmlsc3NvbgorICBvICBTdmVya2VyIE5pbHNzb24KIAotICArCG8gIGR2b3JhaworICBvICBkdm9yYWsKIAotICArCG8gIHYubmFnYSBzcmluaXZhcworICBvICB2Lm5hZ2Egc3Jpbml2YXMKIAotICArCG8gIFNobG9taSBGaXNoCisgIG8gIFNobG9taSBGaXNoCiAKLSAgKwhvICBSb2dlciBCaW5ucworICBvICBSb2dlciBCaW5ucwogCi0gICsIbyAgam9oYW4gdmVycmVwdAorICBvICBqb2hhbiB2ZXJyZXB0CiAKLSAgKwhvICBNckNodW9pCisgIG8gIE1yQ2h1b2kKIAotICArCG8gIFBldGVyIENsZXZlCisgIG8gIFBldGVyIENsZXZlCiAKLSAgKwhvICBWaW5jZW50IEd1ZmZlbnMKKyAgbyAgVmluY2VudCBHdWZmZW5zCiAKLSAgKwhvICBOYXRoYW4gU2NvdHQKKyAgbyAgTmF0aGFuIFNjb3R0CiAKLSAgKwhvICBQYXRyaWNrIENhdWxmaWVsZAorICBvICBQYXRyaWNrIENhdWxmaWVsZAogCi0gICsIbyAgamJlYXJjZQorICBvICBqYmVhcmNlCiAKLSAgKwhvICBDYXRhbGluIE1hcmluYXMKKyAgbyAgQ2F0YWxpbiBNYXJpbmFzCiAKLSAgKwhvICBTaGFuZSBTcGVuY2VyCisgIG8gIFNoYW5lIFNwZW5jZXIKIAotICArCG8gIFpvdSBNaW4KKyAgbyAgWm91IE1pbgogCiAKLSAgKwhvICBSeWFuIEJvZGVyCisgIG8gIFJ5YW4gQm9kZXIKIAotICArCG8gIExvcmVuem8gQ29saXR0aQorICBvICBMb3JlbnpvIENvbGl0dGkKIAotICArCG8gIEd3ZW5kYWwgR3JpZ25vdQorICBvICBHd2VuZGFsIEdyaWdub3UKIAotICArCG8gIEFuZHJlJyBCcmVpbGVyCisgIG8gIEFuZHJlJyBCcmVpbGVyCiAKLSAgKwhvICBUc3V0b211IFlhc3VkYQorICBvICBUc3V0b211IFlhc3VkYQogCiAKIAotICAxCDE1CDUuCC40CDQuCC4gIEMIQ2EIYXMIc2UIZSBTCFN0CHR1CHVkCGRpCGllCGVzCHMKKyAgMTUuNC4gIENhc2UgU3R1ZGllcwogCiAKLSAgKwhvICBKb24gV3JpZ2h0CisgIG8gIEpvbiBXcmlnaHQKIAotICArCG8gIFdpbGxpYW0gTWNFd2FuCisgIG8gIFdpbGxpYW0gTWNFd2FuCiAKLSAgKwhvICBNaWNoYWVsIFJpY2hhcmRzb24KKyAgbyAgTWljaGFlbCBSaWNoYXJkc29uCiAKIAogCi0gIDEIMTUINS4ILjUINS4ILiAgTwhPdAh0aAhoZQhlcghyIGMIY28Ib24IbnQIdHIIcmkIaWIIYnUIdXQIdGkIaW8Ib24IbnMIcworICAxNS41LiAgT3RoZXIgY29udHJpYnV0aW9ucwogCiAKICAgQmlsbCBDYXJyIDxCaWxsLkNhcnIgYXQgY29tcGFxLmNvbT4gIG1hZGUgdGhlIFJlZCBIYXQgbWtyb290ZnMgc2NyaXB0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL2NvbnZlcnRfZHJpdmVyc190b19rZXJuZWxfYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvY29udmVydF9kcml2ZXJzX3RvX2tlcm5lbF9hcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWU5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL2NvbnZlcnRfZHJpdmVyc190b19rZXJuZWxfYXBpLnR4dApAQCAtMCwwICsxLDE5NSBAQAorQ29udmVydGluZyBvbGQgd2F0Y2hkb2cgZHJpdmVycyB0byB0aGUgd2F0Y2hkb2cgZnJhbWV3b3JrCitieSBXb2xmcmFtIFNhbmcgPHcuc2FuZ0BwZW5ndXRyb25peC5kZT4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCZWZvcmUgdGhlIHdhdGNoZG9nIGZyYW1ld29yayBjYW1lIGludG8gdGhlIGtlcm5lbCwgZXZlcnkgZHJpdmVyIGhhZCB0bworaW1wbGVtZW50IHRoZSBBUEkgb24gaXRzIG93bi4gTm93LCBhcyB0aGUgZnJhbWV3b3JrIGZhY3RvcmVkIG91dCB0aGUgY29tbW9uCitjb21wb25lbnRzLCB0aG9zZSBkcml2ZXJzIGNhbiBiZSBsaWdodGVuZWQgbWFraW5nIGl0IGEgdXNlciBvZiB0aGUgZnJhbWV3b3JrLgorVGhpcyBkb2N1bWVudCBzaGFsbCBndWlkZSB5b3UgZm9yIHRoaXMgdGFzay4gVGhlIG5lY2Vzc2FyeSBzdGVwcyBhcmUgZGVzY3JpYmVkCithcyB3ZWxsIGFzIHRoaW5ncyB0byBsb29rIG91dCBmb3IuCisKKworUmVtb3ZlIHRoZSBmaWxlX29wZXJhdGlvbnMgc3RydWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT2xkIGRyaXZlcnMgZGVmaW5lIHRoZWlyIG93biBmaWxlX29wZXJhdGlvbnMgZm9yIGFjdGlvbnMgbGlrZSBvcGVuKCksIHdyaXRlKCksCitldGMuLi4gVGhlc2UgYXJlIG5vdyBoYW5kbGVkIGJ5IHRoZSBmcmFtZXdvcmsgYW5kIGp1c3QgY2FsbCB0aGUgZHJpdmVyIHdoZW4KK25lZWRlZC4gU28sIGluIGdlbmVyYWwsIHRoZSAnZmlsZV9vcGVyYXRpb25zJyBzdHJ1Y3QgYW5kIGFzc29ydGVkIGZ1bmN0aW9ucyBjYW4KK2dvLiBPbmx5IHZlcnkgZmV3IGRyaXZlci1zcGVjaWZpYyBkZXRhaWxzIGhhdmUgdG8gYmUgbW92ZWQgdG8gb3RoZXIgZnVuY3Rpb25zLgorSGVyZSBpcyBhIG92ZXJ2aWV3IG9mIHRoZSBmdW5jdGlvbnMgYW5kIHByb2JhYmx5IG5lZWRlZCBhY3Rpb25zOgorCistIG9wZW46IEV2ZXJ5dGhpbmcgZGVhbGluZyB3aXRoIHJlc291cmNlIG1hbmFnZW1lbnQgKGZpbGUtb3BlbiBjaGVja3MsIG1hZ2ljCisgIGNsb3NlIHByZXBhcmF0aW9ucykgY2FuIHNpbXBseSBnby4gRGV2aWNlIHNwZWNpZmljIHN0dWZmIG5lZWRzIHRvIGdvIHRvIHRoZQorICBkcml2ZXIgc3BlY2lmaWMgc3RhcnQtZnVuY3Rpb24uIE5vdGUgdGhhdCBmb3Igc29tZSBkcml2ZXJzLCB0aGUgc3RhcnQtZnVuY3Rpb24KKyAgYWxzbyBzZXJ2ZXMgYXMgdGhlIHBpbmctZnVuY3Rpb24uIElmIHRoYXQgaXMgdGhlIGNhc2UgYW5kIHlvdSBuZWVkIHN0YXJ0L3N0b3AKKyAgdG8gYmUgYmFsYW5jZWQgKGNsb2NrcyEpLCB5b3UgYXJlIGJldHRlciBvZmYgcmVmYWN0b3JpbmcgYSBzZXBhcmF0ZSBzdGFydC1mdW5jdGlvbi4KKworLSBjbG9zZTogU2FtZSBoaW50cyBhcyBmb3Igb3BlbiBhcHBseS4KKworLSB3cml0ZTogQ2FuIHNpbXBseSBnbywgYWxsIGRlZmluZWQgYmVoYXZpb3VyIGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIGZyYW1ld29yaywKKyAgaS5lLiBwaW5nIG9uIHdyaXRlIGFuZCBtYWdpYyBjaGFyICgnVicpIGhhbmRsaW5nLgorCistIGlvY3RsOiBXaGlsZSB0aGUgZHJpdmVyIGlzIGFsbG93ZWQgdG8gaGF2ZSBleHRlbnNpb25zIHRvIHRoZSBJT0NUTCBpbnRlcmZhY2UsCisgIHRoZSBtb3N0IGNvbW1vbiBvbmVzIGFyZSBoYW5kbGVkIGJ5IHRoZSBmcmFtZXdvcmssIHN1cHBvcnRlZCBieSBzb21lIGFzc2lzdGFuY2UKKyAgZnJvbSB0aGUgZHJpdmVyOgorCisJV0RJT0NfR0VUU1VQUE9SVDoKKwkJUmV0dXJucyB0aGUgbWFuZGF0b3J5IHdhdGNoZG9nX2luZm8gc3RydWN0IGZyb20gdGhlIGRyaXZlcgorCisJV0RJT0NfR0VUU1RBVFVTOgorCQlOZWVkcyB0aGUgc3RhdHVzLWNhbGxiYWNrIGRlZmluZWQsIG90aGVyd2lzZSByZXR1cm5zIDAKKworCVdESU9DX0dFVEJPT1RTVEFUVVM6CisJCU5lZWRzIHRoZSBib290c3RhdHVzIG1lbWJlciBwcm9wZXJseSBzZXQuIE1ha2Ugc3VyZSBpdCBpcyAwIGlmIHlvdQorCQlkb24ndCBoYXZlIGZ1cnRoZXIgc3VwcG9ydCEKKworCVdESU9DX1NFVE9QVElPTlM6CisJCU5vIHByZXBhcmF0aW9ucyBuZWVkZWQKKworCVdESU9DX0tFRVBBTElWRToKKwkJSWYgd2FudGVkLCBvcHRpb25zIGluIHdhdGNoZG9nX2luZm8gbmVlZCB0byBoYXZlIFdESU9GX0tFRVBBTElWRVBJTkcKKwkJc2V0CisKKwlXRElPQ19TRVRUSU1FT1VUOgorCQlPcHRpb25zIGluIHdhdGNoZG9nX2luZm8gbmVlZCB0byBoYXZlIFdESU9GX1NFVFRJTUVPVVQgc2V0CisJCWFuZCBhIHNldF90aW1lb3V0LWNhbGxiYWNrIGhhcyB0byBiZSBkZWZpbmVkLiBUaGUgY29yZSB3aWxsIGFsc28KKwkJZG8gbGltaXQtY2hlY2tpbmcsIGlmIG1pbl90aW1lb3V0IGFuZCBtYXhfdGltZW91dCBpbiB0aGUgd2F0Y2hkb2cKKwkJZGV2aWNlIGFyZSBzZXQuIEFsbCBpcyBvcHRpb25hbC4KKworCVdESU9DX0dFVFRJTUVPVVQ6CisJCU5vIHByZXBhcmF0aW9ucyBuZWVkZWQKKworICBPdGhlciBJT0NUTHMgY2FuIGJlIHNlcnZlZCB1c2luZyB0aGUgaW9jdGwtY2FsbGJhY2suIE5vdGUgdGhhdCB0aGlzIGlzIG1haW5seQorICBpbnRlbmRlZCBmb3IgcG9ydGluZyBvbGQgZHJpdmVyczsgbmV3IGRyaXZlcnMgc2hvdWxkIG5vdCBpbnZlbnQgcHJpdmF0ZSBJT0NUTHMuCisgIFByaXZhdGUgSU9DVExzIGFyZSBwcm9jZXNzZWQgZmlyc3QuIFdoZW4gdGhlIGNhbGxiYWNrIHJldHVybnMgd2l0aAorICAtRU5PSU9DVExDTUQsIHRoZSBJT0NUTHMgb2YgdGhlIGZyYW1ld29yayB3aWxsIGJlIHRyaWVkLCB0b28uIEFueSBvdGhlciBlcnJvcgorICBpcyBkaXJlY3RseSBnaXZlbiB0byB0aGUgdXNlci4KKworRXhhbXBsZSBjb252ZXJzaW9uOgorCistc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgczNjMjQxMHdkdF9mb3BzID0geworLSAgICAgICAub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKy0gICAgICAgLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAorLSAgICAgICAud3JpdGUgICAgICAgICAgPSBzM2MyNDEwd2R0X3dyaXRlLAorLSAgICAgICAudW5sb2NrZWRfaW9jdGwgPSBzM2MyNDEwd2R0X2lvY3RsLAorLSAgICAgICAub3BlbiAgICAgICAgICAgPSBzM2MyNDEwd2R0X29wZW4sCistICAgICAgIC5yZWxlYXNlICAgICAgICA9IHMzYzI0MTB3ZHRfcmVsZWFzZSwKKy19OworCitDaGVjayB0aGUgZnVuY3Rpb25zIGZvciBkZXZpY2Utc3BlY2lmaWMgc3R1ZmYgYW5kIGtlZXAgaXQgZm9yIGxhdGVyCityZWZhY3RvcmluZy4gVGhlIHJlc3QgY2FuIGdvLgorCisKK1JlbW92ZSB0aGUgbWlzY2RldmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NpbmNlIHRoZSBmaWxlX29wZXJhdGlvbnMgYXJlIGdvbmUgbm93LCB5b3UgY2FuIGFsc28gcmVtb3ZlIHRoZSAnc3RydWN0CittaXNjZGV2aWNlJy4gVGhlIGZyYW1ld29yayB3aWxsIGNyZWF0ZSBpdCBvbiB3YXRjaGRvZ19kZXZfcmVnaXN0ZXIoKSBjYWxsZWQgYnkKK3dhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgpLgorCistc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHMzYzI0MTB3ZHRfbWlzY2RldiA9IHsKKy0gICAgICAgLm1pbm9yICAgICAgICAgID0gV0FUQ0hET0dfTUlOT1IsCistICAgICAgIC5uYW1lICAgICAgICAgICA9ICJ3YXRjaGRvZyIsCistICAgICAgIC5mb3BzICAgICAgICAgICA9ICZzM2MyNDEwd2R0X2ZvcHMsCistfTsKKworCitSZW1vdmUgb2Jzb2xldGUgaW5jbHVkZXMgYW5kIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCZWNhdXNlIG9mIHRoZSBzaW1wbGlmaWNhdGlvbnMsIGEgZmV3IGRlZmluZXMgYXJlIHByb2JhYmx5IHVudXNlZCBub3cuIFJlbW92ZQordGhlbS4gSW5jbHVkZXMgY2FuIGJlIHJlbW92ZWQsIHRvby4gRm9yIGV4YW1wbGU6CisKKy0gI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CistICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+IChpZiBNT0RVTEVfQUxJQVNfTUlTQ0RFViBpcyBub3QgdXNlZCkKKy0gI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4gKGlmIG5vIGN1c3RvbSBJT0NUTHMgYXJlIHVzZWQpCisKKworQWRkIHRoZSB3YXRjaGRvZyBvcGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIHBvc3NpYmxlIGNhbGxiYWNrcyBhcmUgZGVmaW5lZCBpbiAnc3RydWN0IHdhdGNoZG9nX29wcycuIFlvdSBjYW4gZmluZCBpdAorZXhwbGFpbmVkIGluICd3YXRjaGRvZy1rZXJuZWwtYXBpLnR4dCcgaW4gdGhpcyBkaXJlY3RvcnkuIHN0YXJ0KCksIHN0b3AoKSBhbmQKK293bmVyIG11c3QgYmUgc2V0LCB0aGUgcmVzdCBhcmUgb3B0aW9uYWwuIFlvdSB3aWxsIGVhc2lseSBmaW5kIGNvcnJlc3BvbmRpbmcKK2Z1bmN0aW9ucyBpbiB0aGUgb2xkIGRyaXZlci4gTm90ZSB0aGF0IHlvdSB3aWxsIG5vdyBnZXQgYSBwb2ludGVyIHRvIHRoZQord2F0Y2hkb2dfZGV2aWNlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZXNlIGZ1bmN0aW9ucywgc28geW91IHByb2JhYmx5IGhhdmUgdG8KK2NoYW5nZSB0aGUgZnVuY3Rpb24gaGVhZGVyLiBPdGhlciBjaGFuZ2VzIGFyZSBtb3N0IGxpa2VseSBub3QgbmVlZGVkLCBiZWNhdXNlCitoZXJlIHNpbXBseSBoYXBwZW5zIHRoZSBkaXJlY3QgaGFyZHdhcmUgYWNjZXNzLiBJZiB5b3UgaGF2ZSBkZXZpY2Utc3BlY2lmaWMKK2NvZGUgbGVmdCBmcm9tIHRoZSBhYm92ZSBzdGVwcywgaXQgc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50byB0aGVzZSBjYWxsYmFja3MuCisKK0hlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZToKKworK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHMzYzI0MTB3ZHRfb3BzID0geworKyAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKKysgICAgICAgLnN0YXJ0ID0gczNjMjQxMHdkdF9zdGFydCwKKysgICAgICAgLnN0b3AgPSBzM2MyNDEwd2R0X3N0b3AsCisrICAgICAgIC5waW5nID0gczNjMjQxMHdkdF9rZWVwYWxpdmUsCisrICAgICAgIC5zZXRfdGltZW91dCA9IHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdCwKKyt9OworCitBIHR5cGljYWwgZnVuY3Rpb24taGVhZGVyIGNoYW5nZSBsb29rcyBsaWtlOgorCistc3RhdGljIHZvaWQgczNjMjQxMHdkdF9rZWVwYWxpdmUodm9pZCkKKytzdGF0aWMgaW50IHMzYzI0MTB3ZHRfa2VlcGFsaXZlKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKKyB7CisuLi4KKysKKysgICAgICAgcmV0dXJuIDA7CisgfQorCisuLi4KKworLSAgICAgICBzM2MyNDEwd2R0X2tlZXBhbGl2ZSgpOworKyAgICAgICBzM2MyNDEwd2R0X2tlZXBhbGl2ZSgmczNjMjQxMF93ZGQpOworCisKK0FkZCB0aGUgd2F0Y2hkb2cgZGV2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3cgd2UgbmVlZCB0byBjcmVhdGUgYSAnc3RydWN0IHdhdGNoZG9nX2RldmljZScgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlCituZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSBmcmFtZXdvcmsuIFRoZSBzdHJ1Y3QgaXMgYWxzbyBleHBsYWluZWQgaW4gZGV0YWlsCitpbiAnd2F0Y2hkb2cta2VybmVsLWFwaS50eHQnIGluIHRoaXMgZGlyZWN0b3J5LiBXZSBwYXNzIGl0IHRoZSBtYW5kYXRvcnkKK3dhdGNoZG9nX2luZm8gc3RydWN0IGFuZCB0aGUgbmV3bHkgY3JlYXRlZCB3YXRjaGRvZ19vcHMuIE9mdGVuLCBvbGQgZHJpdmVycworaGF2ZSB0aGVpciBvd24gcmVjb3JkLWtlZXBpbmcgZm9yIHRoaW5ncyBsaWtlIGJvb3RzdGF0dXMgYW5kIHRpbWVvdXQgdXNpbmcKK3N0YXRpYyB2YXJpYWJsZXMuIFRob3NlIGhhdmUgdG8gYmUgY29udmVydGVkIHRvIHVzZSB0aGUgbWVtYmVycyBpbgord2F0Y2hkb2dfZGV2aWNlLiBOb3RlIHRoYXQgdGhlIHRpbWVvdXQgdmFsdWVzIGFyZSB1bnNpZ25lZCBpbnQuIFNvbWUgZHJpdmVycwordXNlIHNpZ25lZCBpbnQsIHNvIHRoaXMgaGFzIHRvIGJlIGNvbnZlcnRlZCwgdG9vLgorCitIZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGUgZm9yIGEgd2F0Y2hkb2cgZGV2aWNlOgorCisrc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgczNjMjQxMF93ZGQgPSB7CisrICAgICAgIC5pbmZvID0gJnMzYzI0MTBfd2R0X2lkZW50LAorKyAgICAgICAub3BzID0gJnMzYzI0MTB3ZHRfb3BzLAorK307CisKKworUmVnaXN0ZXIgdGhlIHdhdGNoZG9nIGRldmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZXBsYWNlIG1pc2NfcmVnaXN0ZXIoJm1pc2NkZXYpIHdpdGggd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZ3YXRjaGRvZ19kZXYpLgorTWFrZSBzdXJlIHRoZSByZXR1cm4gdmFsdWUgZ2V0cyBjaGVja2VkIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSwgaWYgcHJlc2VudCwKK3N0aWxsIGZpdHMuIEFsc28gY29udmVydCB0aGUgdW5yZWdpc3RlciBjYXNlLgorCistICAgICAgIHJldCA9IG1pc2NfcmVnaXN0ZXIoJnMzYzI0MTB3ZHRfbWlzY2Rldik7CisrICAgICAgIHJldCA9IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgmczNjMjQxMF93ZGQpOworCisuLi4KKworLSAgICAgICBtaXNjX2RlcmVnaXN0ZXIoJnMzYzI0MTB3ZHRfbWlzY2Rldik7CisrICAgICAgIHdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKCZzM2MyNDEwX3dkZCk7CisKKworVXBkYXRlIHRoZSBLY29uZmlnLWVudHJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGVudHJ5IGZvciB0aGUgZHJpdmVyIG5vdyBuZWVkcyB0byBzZWxlY3QgV0FUQ0hET0dfQ09SRToKKworKyAgICAgICBzZWxlY3QgV0FUQ0hET0dfQ09SRQorCisKK0NyZWF0ZSBhIHBhdGNoIGFuZCBzZW5kIGl0IHRvIHVwc3RyZWFtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNYWtlIHN1cmUgeW91IHVuZGVyc3Rvb2QgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBhbmQgc2VuZCB5b3VyIHBhdGNoIHRvCitsaW51eC13YXRjaGRvZ0B2Z2VyLmtlcm5lbC5vcmcuIFdlIGFyZSBsb29raW5nIGZvcndhcmQgdG8gaXQgOikKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvZW50cnlfNjQudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvZW50cnlfNjQudHh0CmluZGV4IDc4NjlmMTQuLmJjNzIyNmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24veDg2L2VudHJ5XzY0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni9lbnRyeV82NC50eHQKQEAgLTI3LDkgKzI3LDYgQEAKICAgIG1hZ2ljYWxseS1nZW5lcmF0ZWQgZnVuY3Rpb25zIHRoYXQgbWFrZSB0aGVpciB3YXkgdG8gZG9fSVJRIHdpdGgKICAgIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGFzIGEgcGFyYW1ldGVyLgogCi0gLSBlbXVsYXRlX3ZzeXNjYWxsOiBpbnQgMHhjYywgYSBzcGVjaWFsIG5vbi1BQkkgZW50cnkgdXNlZCBieQotICAgdnN5c2NhbGwgZW11bGF0aW9uLgotCiAgLSBBUElDIGludGVycnVwdHM6IFZhcmlvdXMgc3BlY2lhbC1wdXJwb3NlIGludGVycnVwdHMgZm9yIHRoaW5ncwogICAgbGlrZSBUTEIgc2hvb3Rkb3duLgogCmRpZmYgLS1naXQgYS9LYnVpbGQgYi9LYnVpbGQKaW5kZXggMjExNDExMy4uYjhiNzA4YSAxMDA2NDQKLS0tIGEvS2J1aWxkCisrKyBiL0tidWlsZApAQCAtODgsMTEgKzg4LDEzIEBACiAjIDMpIENoZWNrIGZvciBtaXNzaW5nIHN5c3RlbSBjYWxscwogIwogCi1xdWlldF9jbWRfc3lzY2FsbHMgPSBDQUxMICAgICQ8Ci0gICAgICBjbWRfc3lzY2FsbHMgPSAkKENPTkZJR19TSEVMTCkgJDwgJChDQykgJChjX2ZsYWdzKQorYWx3YXlzICs9IG1pc3Npbmctc3lzY2FsbHMKK3RhcmdldHMgKz0gbWlzc2luZy1zeXNjYWxscwogCi1QSE9OWSArPSBtaXNzaW5nLXN5c2NhbGxzCi1taXNzaW5nLXN5c2NhbGxzOiBzY3JpcHRzL2NoZWNrc3lzY2FsbHMuc2ggRk9SQ0UKK3F1aWV0X2NtZF9zeXNjYWxscyA9IENBTEwgICAgJDwKKyAgICAgIGNtZF9zeXNjYWxscyA9ICQoQ09ORklHX1NIRUxMKSAkPCAkKENDKSAkKGNfZmxhZ3MpICQobWlzc2luZ19zeXNjYWxsc19mbGFncykKKworbWlzc2luZy1zeXNjYWxsczogc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoICQob2Zmc2V0cy1maWxlKSBGT1JDRQogCSQoY2FsbCBjbWQsc3lzY2FsbHMpCiAKICMgS2VlcCB0aGVzZSB0d28gZmlsZXMgZHVyaW5nIG1ha2UgY2xlYW4KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMjdhZjljOS4uMDcxYTk5NiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTMxNiw2ICszMTYsMTAgQEAKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYwogCitBRERSRVNTIFNQQUNFIExBWU9VVCBSQU5ET01JWkFUSU9OIChBU0xSKQorTToJSmlyaSBLb3NpbmEgPGprb3NpbmFAc3VzZS5jej4KK1M6CU1haW50YWluZWQKKwogQURNMTAyNSBIQVJEV0FSRSBNT05JVE9SIERSSVZFUgogTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCkBAIC01MjksNiArNTMzLDcgQEAKIEY6CWRyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC8KIAogQU5BTE9HIERFVklDRVMgSU5DIEFTT0MgQ09ERUMgRFJJVkVSUworTToJTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CiBMOglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly93aWtpLmFuYWxvZy5jb20vCkBAIC02ODcsNiArNjkyLDEyIEBACiBGOglkcml2ZXJzL210ZC9uYW5kL2JjbV91bWlfYmNoLmMKIEY6CWRyaXZlcnMvbXRkL25hbmQvbmFuZF9iY21fdW1pLmgKIAorQVJNL0NBTFhFREEgSElHSEJBTksgQVJDSElURUNUVVJFCitNOglSb2IgSGVycmluZyA8cm9iLmhlcnJpbmdAY2FseGVkYS5jb20+CitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0vbWFjaC1oaWdoYmFuay8KKwogQVJNL0NBVklVTSBORVRXT1JLUyBDTlMzWFhYIE1BQ0hJTkUgU1VQUE9SVAogTToJQW50b24gVm9yb250c292IDxhdm9yb250c292QG12aXN0YS5jb20+CiBTOglNYWludGFpbmVkCkBAIC03ODYsNiArNzk3LDEzIEBACiBTOglNYWludGFpbmVkCiBGOglhcmNoL2FybS9tYWNoLW14NS8KIAorQVJNL0ZSRUVTQ0FMRSBJTVg2CitNOglTaGF3biBHdW8gPHNoYXduLmd1b0BsaW5hcm8ub3JnPgorTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKK1M6CU1haW50YWluZWQKK1Q6CWdpdCBnaXQ6Ly9naXQubGluYXJvLm9yZy9wZW9wbGUvc2hhd25ndW8vbGludXgtMi42LmdpdAorRjoJYXJjaC9hcm0vbWFjaC1pbXgvKmlteDYqCisKIEFSTS9HTE9NQVRJT04gR0VTQkM5MzEyU1ggTUFDSElORSBTVVBQT1JUCiBNOglMZW5uZXJ0IEJ1eXRlbmhlayA8a2VybmVsQHdhbnRzdG9mbHkub3JnPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKQEAgLTEwMTQsNiArMTAzMiw3IEBACiBGOglhcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pb21kLmgKIEY6CWFyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL21lbWMuaAogRjoJYXJjaC9hcm0vbWFjaC1ycGMvCitGOglkcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2V0aGVyaC5jCiBGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvZXRoZXIxKgogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvc2VlcS9ldGhlcjMqCiBGOglkcml2ZXJzL3Njc2kvYXJtLwpAQCAtMTA4NCw2ICsxMTAzLDI1IEBACiBGOglhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0LypmaW1jKgogRjoJZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy8KIAorQVJNL1NBTVNVTkcgUzVQIFNFUklFUyBNdWx0aSBGb3JtYXQgQ29kZWMgKE1GQykgU1VQUE9SVAorTToJS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4KK006CUthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CitNOiAgICAgSmVvbmd0YWUgUGFyayA8anRwLnBhcmtAc2Ftc3VuZy5jb20+CitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW1mYy5jCitGOglkcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvCisKK0FSTS9TQU1TVU5HIFM1UCBTRVJJRVMgVFYgU1VCU1lTVEVNIFNVUFBPUlQKK006CUt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+CitNOglUb21hc3ogU3RhbmlzbGF3c2tpIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0vcGxhdC1zNXAvZGV2LXR2LmMKK0Y6CWRyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2LworCiBBUk0vU0hNT0JJTEUgQVJNIEFSQ0hJVEVDVFVSRQogTToJUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KIE06CU1hZ251cyBEYW1tIDxtYWdudXMuZGFtbUBnbWFpbC5jb20+CkBAIC0xNjgwLDYgKzE3MTgsNyBAQAogRjoJaW5jbHVkZS9saW51eC9jYW4vY29yZS5oCiBGOglpbmNsdWRlL2xpbnV4L2Nhbi9iY20uaAogRjoJaW5jbHVkZS9saW51eC9jYW4vcmF3LmgKK0Y6CWluY2x1ZGUvbGludXgvY2FuL2d3LmgKIAogQ0FOIE5FVFdPUksgRFJJVkVSUwogTToJV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CkBAIC0yMzA0LDYgKzIzNDMsMTMgQEAKIEY6CWRyaXZlcnMvZ3B1L2RybS9pOTE1CiBGOglpbmNsdWRlL2RybS9pOTE1KgogCitEUk0gRFJJVkVSUyBGT1IgRVhZTk9TCitNOglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CitMOglkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvZ3B1L2RybS9leHlub3MKK0Y6CWluY2x1ZGUvZHJtL2V4eW5vcyoKKwogRFNDQzQgRFJJVkVSCiBNOglGcmFuY29pcyBSb21pZXUgPHJvbWlldUBmci56b3JlaWwuY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwpAQCAtMjM1MCw3ICsyMzk2LDcgQEAKIEY6CW5ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidCouYwogCiBFQ1JZUFQgRklMRSBTWVNURU0KLU06CVR5bGVyIEhpY2tzIDx0eWhpY2tzQGxpbnV4LnZuZXQuaWJtLmNvbT4KK006CVR5bGVyIEhpY2tzIDx0eWhpY2tzQGNhbm9uaWNhbC5jb20+CiBNOglEdXN0aW4gS2lya2xhbmQgPGtpcmtsYW5kQGNhbm9uaWNhbC5jb20+CiBMOgllY3J5cHRmc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHBzOi8vbGF1bmNocGFkLm5ldC9lY3J5cHRmcwpAQCAtMjQzMSw4ICsyNDc3LDYgQEAKIFc6CWJsdWVzbW9rZS5zb3VyY2Vmb3JnZS5uZXQKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCi1GOglkcml2ZXJzL2VkYWMvZWRhY19tY2UuYwotRjoJaW5jbHVkZS9saW51eC9lZGFjX21jZS5oCiAKIEVEQUMtSTgyOTc1WAogTToJUmFuZ2FuYXRoYW4gRGVzaWthbiA8cmF2aUBqZXR6dGVjaG5vbG9naWVzLmNvbT4KQEAgLTI0NTYsNiArMjUwMCwxMyBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9lZGFjL3I4MjYwMF9lZGFjLmMKIAorRURBQy1TQlJJREdFCitNOglNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KK0w6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCitXOglibHVlc21va2Uuc291cmNlZm9yZ2UubmV0CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2VkYWMvc2JfZWRhYy5jCisKIEVESVJPTCBVQS0xMDEvVUEtMTAwMCBEUklWRVIKIE06CUNsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKQEAgLTI5NzcsNiArMzAyOCwxMyBAQAogRjoJZHJpdmVycy9jaGFyL2h3X3JhbmRvbS8KIEY6CWluY2x1ZGUvbGludXgvaHdfcmFuZG9tLmgKIAorSEFSRFdBUkUgU1BJTkxPQ0sgQ09SRQorTToJT2hhZCBCZW4tQ29oZW4gPG9oYWRAd2l6ZXJ5LmNvbT4KK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vaHdzcGlubG9jay50eHQKK0Y6CWRyaXZlcnMvaHdzcGlubG9jay9od3NwaW5sb2NrXyoKK0Y6CWluY2x1ZGUvbGludXgvaHdzcGlubG9jay5oCisKIEhBUk1PTlkgU09VTkQgRFJJVkVSCiBNOglLeWxlIE1jTWFydGluIDxreWxlQG1jbWFydGluLmNhPgogTDoJbGludXgtcGFyaXNjQHZnZXIua2VybmVsLm9yZwpAQCAtMzE2OSw4ICszMjI3LDcgQEAKIE06CVRvbnkgTHVjayA8dG9ueS5sdWNrQGludGVsLmNvbT4KIE06CUZlbmdodWEgWXUgPGZlbmdodWEueXVAaW50ZWwuY29tPgogTDoJbGludXgtaWE2NEB2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly93d3cuaWE2NC1saW51eC5vcmcvCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2FlZ2wvbGludXgtMi42LmdpdAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9hZWdsL2xpbnV4LmdpdAogUzoJTWFpbnRhaW5lZAogRjoJYXJjaC9pYTY0LwogCkBAIC0zMjA4LDYgKzMyNjUsMTMgQEAKIEY6CWRyaXZlcnMvaWRlLwogRjoJaW5jbHVkZS9saW51eC9pZGUuaAogCitJREVBUEFEIExBUFRPUCBFWFRSQVMgRFJJVkVSCitNOglJa2UgUGFuaGMgPGlrZS5wYW5AY2Fub25pY2FsLmNvbT4KK0w6CXBsYXRmb3JtLWRyaXZlci14ODZAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vbGF1bmNocGFkLm5ldC9pZGVhcGFkLWxhcHRvcAorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9wbGF0Zm9ybS94ODYvaWRlYXBhZC1sYXB0b3AuYworCiBJREUvQVRBUEkgRFJJVkVSUwogTToJQm9yaXNsYXYgUGV0a292IDxwZXRrb3ZiYkBnbWFpbC5jb20+CiBMOglsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnCkBAIC0zOTk0LDYgKzQwNTgsNyBAQAogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9taXNjLWRldmljZXMvbGlzM2x2MDJkCiBGOglkcml2ZXJzL21pc2MvbGlzM2x2MDJkLworRjoJZHJpdmVycy9wbGF0Zm9ybS94ODYvaHBfYWNjZWwuYwogCiBMTEMgKDgwMi4yKQogTToJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGdob3N0cHJvdG9jb2xzLm5ldD4KQEAgLTQ0MjEsMTEgKzQ0ODYsOSBAQAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vCiAKIE5FVEZJTFRFUi9JUFRBQkxFUy9JUENIQUlOUwotUDoJUnVzdHkgUnVzc2VsbAotUDoJTWFyYyBCb3VjaGVyCi1QOglKYW1lcyBNb3JyaXMKIFA6CUhhcmFsZCBXZWx0ZQogUDoJSm96c2VmIEthZGxlY3NpaworTToJUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQG5ldGZpbHRlci5vcmc+CiBNOglQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KIEw6CW5ldGZpbHRlci1kZXZlbEB2Z2VyLmtlcm5lbC5vcmcKIEw6CW5ldGZpbHRlckB2Z2VyLmtlcm5lbC5vcmcKQEAgLTQ2MTgsNyArNDY4MSw3IEBACiBXOglodHRwOi8vd3d3Lm11cnUuY29tL2xpbnV4L29tYXAvCiBXOglodHRwOi8vbGludXgub21hcC5jb20vCiBROglodHRwOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvcHJvamVjdC9saW51eC1vbWFwL2xpc3QvCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RtbGluZC9saW51eC1vbWFwLTIuNi5naXQKK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG1saW5kL2xpbnV4LW9tYXAuZ2l0CiBTOglNYWludGFpbmVkCiBGOglhcmNoL2FybS8qb21hcCovCiAKQEAgLTQ2NjYsNiArNDcyOSwxMyBAQAogRjoJZHJpdmVycy92aWRlby9vbWFwMi8KIEY6CURvY3VtZW50YXRpb24vYXJtL09NQVAvRFNTCiAKK09NQVAgSEFSRFdBUkUgU1BJTkxPQ0sgU1VQUE9SVAorTToJT2hhZCBCZW4tQ29oZW4gPG9oYWRAd2l6ZXJ5LmNvbT4KK0w6CWxpbnV4LW9tYXBAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2h3c3BpbmxvY2svb21hcF9od3NwaW5sb2NrLmMKK0Y6CWFyY2gvYXJtL21hY2gtb21hcDIvaHdzcGlubG9jay5jCisKIE9NQVAgTU1DIFNVUFBPUlQKIE06CUphcmtrbyBMYXZpbmVuIDxqYXJra28ubGF2aW5lbkBub2tpYS5jb20+CiBMOglsaW51eC1vbWFwQHZnZXIua2VybmVsLm9yZwpAQCAtNDc2MCwxMCArNDgzMCwxMiBAQAogCiBPUEVOIEZJUk1XQVJFIEFORCBGTEFUVEVORUQgREVWSUNFIFRSRUUKIE06CUdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK006CVJvYiBIZXJyaW5nIDxyb2IuaGVycmluZ0BjYWx4ZWRhLmNvbT4KIEw6CWRldmljZXRyZWUtZGlzY3Vzc0BsaXN0cy5vemxhYnMub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly9mZHQuc2VjcmV0bGFiLmNhCiBUOglnaXQgZ2l0Oi8vZ2l0LnNlY3JldGxhYi5jYS9naXQvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlCiBGOglkcml2ZXJzL29mCiBGOglpbmNsdWRlL2xpbnV4L29mKi5oCiBLOglvZl9nZXRfcHJvcGVydHkKQEAgLTQ5NDYsNyArNTAxOCw3IEBACiBGOglpbmNsdWRlL2xpbnV4L2kyYy1wY2EtcGxhdGZvcm0uaAogCiBQQ0kgRVJST1IgUkVDT1ZFUlkKLU06CUxpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPgorTTogICAgIExpbmFzIFZlcHN0YXMgPGxpbmFzdmVwc3Rhc0BnbWFpbC5jb20+CiBMOglsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CURvY3VtZW50YXRpb24vUENJL3BjaS1lcnJvci1yZWNvdmVyeS50eHQKQEAgLTUzMjYsNiArNTM5OCwxMiBAQAogRjoJaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKIEY6CWluY2x1ZGUvbGludXgvcW54dHlwZXMuaAogCitRVUFMQ09NTSBIRVhBR09OIEFSQ0hJVEVDVFVSRQorTToJUmljaGFyZCBLdW8gPHJrdW9AY29kZWF1cm9yYS5vcmc+CitMOglsaW51eC1oZXhhZ29uQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCitGOglhcmNoL2hleGFnb24vCisKIFJBRE9TIEJMT0NLIERFVklDRSAoUkJEKQogRjoJaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oCiBNOglZZWh1ZGEgU2FkZWggPHllaHVkYUBocS5uZXdkcmVhbS5uZXQ+CkBAIC01NDAxLDcgKzU0NzksNyBAQAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMKIAogUkRTIC0gUkVMSUFCTEUgREFUQUdSQU0gU09DS0VUUwotTToJQW5keSBHcm92ZXIgPGFuZHkuZ3JvdmVyQG9yYWNsZS5jb20+CitNOglWZW5rYXQgVmVua2F0c3VicmEgPHZlbmthdC54LnZlbmthdHN1YnJhQG9yYWNsZS5jb20+CiBMOglyZHMtZGV2ZWxAb3NzLm9yYWNsZS5jb20gKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogUzoJU3VwcG9ydGVkCiBGOgluZXQvcmRzLwpAQCAtNTk2Nyw2ICs2MDQ1LDEyIEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzk0MjAuKgogCitTTVNDIFVGWDYwMDAgYW5kIFVGWDcwMDAgVVNCIHRvIFZHQSBEUklWRVIKK006CVN0ZXZlIEdsZW5kaW5uaW5nIDxzdGV2ZS5nbGVuZGlubmluZ0BzbXNjLmNvbT4KK0w6CWxpbnV4LWZiZGV2QHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL3ZpZGVvL3Ntc2N1ZnguYworCiBTTi1JQTY0IChJdGFuaXVtKSBTVUItUExBVEZPUk0KIE06CUplcyBTb3JlbnNlbiA8amVzQHNnaS5jb20+CiBMOglsaW51eC1hbHRpeEBzZ2kuY29tCkBAIC02MDM2LDcgKzYxMjAsNyBAQAogTToJVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly93d3cuYWxzYS1wcm9qZWN0Lm9yZy8KLVQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdGl3YWkvc291bmQtMi42LmdpdAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXdhaS9zb3VuZC5naXQKIFQ6CWdpdCBnaXQ6Ly9naXQuYWxzYS1wcm9qZWN0Lm9yZy9hbHNhLWtlcm5lbC5naXQKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vc291bmQvCkBAIC02MDQ2LDcgKzYxMzAsNyBAQAogU09VTkQgLSBTT0MgTEFZRVIgLyBEWU5BTUlDIEFVRElPIFBPV0VSIE1BTkFHRU1FTlQgKEFTb0MpCiBNOglMaWFtIEdpcmR3b29kIDxscmdAdGkuY29tPgogTToJTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Ci1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2Jyb29uaWUvc291bmQtMi42LmdpdAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9icm9vbmllL3NvdW5kLmdpdAogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly9hbHNhLXByb2plY3Qub3JnL21haW4vaW5kZXgucGhwL0FTb0MKIFM6CVN1cHBvcnRlZApAQCAtNjYyNSw3ICs2NzA5LDYgQEAKIAogVURGIEZJTEVTWVNURU0KIE06CUphbiBLYXJhIDxqYWNrQHN1c2UuY3o+Ci1XOglodHRwOi8vbGludXgtdWRmLnNvdXJjZWZvcmdlLm5ldAogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy91ZGYudHh0CiBGOglmcy91ZGYvCkBAIC03MjU3LDYgKzczNDAsNyBAQAogVzoJaHR0cDovL29wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbS9jb250ZW50L2xpbnV4LWRyaXZlcnMtd29sZnNvbi1kZXZpY2VzCiBTOglTdXBwb3J0ZWQKIEY6CURvY3VtZW50YXRpb24vaHdtb24vd204Mz8/CitGOglhcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1jcmFnNjQxMCoKIEY6CWRyaXZlcnMvbGVkcy9sZWRzLXdtODMqLmMKIEY6CWRyaXZlcnMvaW5wdXQvbWlzYy93bTgzMXgtb24uYwogRjoJZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTgzMXgtdHMuYwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCAwN2JjOTI1Li5kYWI4NjEwIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw4ICsxLDggQEAKIFZFUlNJT04gPSAzCi1QQVRDSExFVkVMID0gMQorUEFUQ0hMRVZFTCA9IDIKIFNVQkxFVkVMID0gMAotRVhUUkFWRVJTSU9OID0KLU5BTUUgPSAiRGl2ZW1hc3RlciBFZGl0aW9uIgorRVhUUkFWRVJTSU9OID0gLXJjMgorTkFNRSA9IFNhYmVyLXRvb3RoZWQgU3F1aXJyZWwKIAogIyAqRE9DVU1FTlRBVElPTioKICMgVG8gc2VlIGEgbGlzdCBvZiB0eXBpY2FsIHRhcmdldHMgZXhlY3V0ZSAibWFrZSBoZWxwIgpAQCAtOTgzLDcgKzk4Myw2IEBACiAKIHByZXBhcmUwOiBhcmNocHJlcGFyZSBGT1JDRQogCSQoUSkkKE1BS0UpICQoYnVpbGQpPS4KLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT0uIG1pc3Npbmctc3lzY2FsbHMKIAogIyBBbGwgdGhlIHByZXBhcmluZy4uCiBwcmVwYXJlOiBwcmVwYXJlMApAQCAtMTE5OCw3ICsxMTk3LDcgQEAKIAlAZmluZCAkKHNyY3RyZWUpICQoUkNTX0ZJTkRfSUdOT1JFKSBcCiAJCVwoIC1uYW1lICcqLm9yaWcnIC1vIC1uYW1lICcqLnJlaicgLW8gLW5hbWUgJyp+JyBcCiAJCS1vIC1uYW1lICcqLmJhaycgLW8gLW5hbWUgJyMqIycgLW8gLW5hbWUgJy4qLm9yaWcnIFwKLQkJLW8gLW5hbWUgJy4qLnJlaicgLW8gLXNpemUgMCBcCisJCS1vIC1uYW1lICcuKi5yZWonIFwKIAkJLW8gLW5hbWUgJyolJyAtbyAtbmFtZSAnLiouY21kJyAtbyAtbmFtZSAnY29yZScgXCkgXAogCQktdHlwZSBmIC1wcmludCB8IHhhcmdzIHJtIC1mCiAKQEAgLTEyOTYsNyArMTI5NSw2IEBACiAJQGVjaG8gICcJCTI6IHdhcm5pbmdzIHdoaWNoIG9jY3VyIHF1aXRlIG9mdGVuIGJ1dCBtYXkgc3RpbGwgYmUgcmVsZXZhbnQnCiAJQGVjaG8gICcJCTM6IG1vcmUgb2JzY3VyZSB3YXJuaW5ncywgY2FuIG1vc3QgbGlrZWx5IGJlIGlnbm9yZWQnCiAJQGVjaG8gICcJCU11bHRpcGxlIGxldmVscyBjYW4gYmUgY29tYmluZWQgd2l0aCBXPTEyIG9yIFc9MTIzJwotCUBlY2hvICAnICBtYWtlIFJFQ09SRE1DT1VOVF9XQVJOPTEgW3RhcmdldHNdIFdhcm4gYWJvdXQgaWdub3JlZCBtY291bnQgc2VjdGlvbnMnCiAJQGVjaG8gICcnCiAJQGVjaG8gICdFeGVjdXRlICJtYWtlIiBvciAibWFrZSBhbGwiIHRvIGJ1aWxkIGFsbCB0YXJnZXRzIG1hcmtlZCB3aXRoIFsqXSAnCiAJQGVjaG8gICdGb3IgZnVydGhlciBpbmZvIHNlZSB0aGUgLi9SRUFETUUgZmlsZScKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvS2NvbmZpZyBiL2FyY2gvYWxwaGEvS2NvbmZpZwppbmRleCA4YmI5MzYyLi4zZDc0ODAxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL0tjb25maWcKKysrIGIvYXJjaC9hbHBoYS9LY29uZmlnCkBAIC00NDUsMTEgKzQ0NSw2IEBACiAJICBJcyB0aGlzIGEgbWFjaGluZSBiYXNlZCBvbiB0aGUgRVY2NyBjb3JlPyAgSWYgaW4gZG91YnQsIHNlbGVjdCBOIGhlcmUKIAkgIGFuZCB0aGUgbWFjaGluZSB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gRVY2LgogCi1jb25maWcgQUxQSEFfRVY3Ci0JYm9vbAotCWRlcGVuZHMgb24gQUxQSEFfTUFSVkVMCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBBTFBIQV9NQ1BDSUEKIAlib29sCiAJZGVwZW5kcyBvbiBBTFBIQV9SQVdISURFCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCAwNmVkZmVmLi4wODIzNTVmIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTY5LDYgKzY5LDkgQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICA0MAogCisjZGVmaW5lIFNPX1dJRklfU1RBVFVTCQk0MQorI2RlZmluZSBTQ01fV0lGSV9TVEFUVVMJCVNPX1dJRklfU1RBVFVTCisKIC8qIE9fTk9OQkxPQ0sgY2xhc2hlcyB3aXRoIHRoZSBiaXRzIHVzZWQgZm9yIHNvY2tldCB0eXBlcy4gIFRoZXJlZm9yZSB3ZQogICogaGF2ZSB0byBkZWZpbmUgU09DS19OT05CTE9DSyB0byBhIGRpZmZlcmVudCB2YWx1ZSBoZXJlLgogICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCA0YWM0OGEwLi4yMjA3ZmM2IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTQ1NywxMCArNDU3LDEyIEBACiAjZGVmaW5lIF9fTlJfY2xvY2tfYWRqdGltZQkJNDk5CiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkJNTAwCiAjZGVmaW5lIF9fTlJfc2V0bnMJCQk1MDEKKyNkZWZpbmUgX19OUl9hY2NlcHQ0CQkJNTAyCisjZGVmaW5lIF9fTlJfc2VuZG1tc2cJCQk1MDMKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9TWVNDQUxMUwkJCTUwMgorI2RlZmluZSBOUl9TWVNDQUxMUwkJCTUwNAogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX2lyb25nYXRlLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX2lyb25nYXRlLmMKaW5kZXggYTg3MjA3OC4uMDAwOTZkZiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9pcm9uZ2F0ZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2NvcmVfaXJvbmdhdGUuYwpAQCAtMzAzLDYgKzMwMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAKICNkZWZpbmUgR0VUX1BBR0VfRElSX09GRihhZGRyKSAoYWRkciA+PiAyMikKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS1zeXNmcy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLXN5c2ZzLmMKaW5kZXggYjg5OWU5NS4uNTM2NDljNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLXN5c2ZzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLXN5c2ZzLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jCmluZGV4IDAyMmMyNzQ4Li40MzYxMDgwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3NldHVwLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zZXR1cC5jCmluZGV4IGNjMGZkODYuLjMyZGU1NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc2V0dXAuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBwYW5pY19ub3RpZmllcl9saXN0Owogc3RhdGljIGludCBhbHBoYV9wYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c3RibHMuUyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c3RibHMuUwppbmRleCA2YWNlYTFmLi5lNTM0ZTFjIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXN0YmxzLlMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzdGJscy5TCkBAIC01MjAsNiArNTIwLDggQEAKIAkucXVhZCBzeXNfY2xvY2tfYWRqdGltZQogCS5xdWFkIHN5c19zeW5jZnMJCQkvKiA1MDAgKi8KIAkucXVhZCBzeXNfc2V0bnMKKwkucXVhZCBzeXNfYWNjZXB0NAorCS5xdWFkIHN5c19zZW5kbW1zZwogCiAJLnNpemUgc3lzX2NhbGxfdGFibGUsIC4gLSBzeXNfY2FsbF90YWJsZQogCS50eXBlIHN5c19jYWxsX3RhYmxlLCBAb2JqZWN0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCA4MDkwY2FkLi40NDc4OWVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL0tjb25maWcKQEAgLTI5LDYgKzI5LDcgQEAKIAlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCiAJc2VsZWN0IEhBVkVfU1BBUlNFX0lSUQogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCisJc2VsZWN0IENQVV9QTSBpZiAoU1VTUEVORCB8fCBDUFVfSURMRSkKIAloZWxwCiAJICBUaGUgQVJNIHNlcmllcyBpcyBhIGxpbmUgb2YgbG93LXBvd2VyLWNvbnN1bXB0aW9uIFJJU0MgY2hpcCBkZXNpZ25zCiAJICBsaWNlbnNlZCBieSBBUk0gTHRkIGFuZCB0YXJnZXRlZCBhdCBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgYW5kCkBAIC0yMTEsNiArMjEyLDE5IEBACiAJICB0aGlzIGZlYXR1cmUgKGVnLCBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSBzaW5nbGUgbWFjaGluZSkgYW5kCiAJICB5b3UgbmVlZCB0byBzaHJpbmsgdGhlIGtlcm5lbCB0byB0aGUgbWluaW1hbCBzaXplLgogCitjb25maWcgTkVFRF9NQUNIX01FTU9SWV9ICisJYm9vbAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHdoZW4gbWFjaC9tZW1vcnkuaCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNwZWNpYWwKKwkgIGRlZmluaXRpb25zIGZvciB0aGlzIHBsYXRmb3JtLiAgVGhlIG5lZWQgZm9yIG1hY2gvbWVtb3J5Lmggc2hvdWxkCisJICBiZSBhdm9pZGVkIHdoZW4gcG9zc2libGUuCisKK2NvbmZpZyBQSFlTX09GRlNFVAorCWhleCAiUGh5c2ljYWwgYWRkcmVzcyBvZiBtYWluIG1lbW9yeSIKKwlkZXBlbmRzIG9uICFBUk1fUEFUQ0hfUEhZU19WSVJUICYmICFORUVEX01BQ0hfTUVNT1JZX0gKKwloZWxwCisJICBQbGVhc2UgcHJvdmlkZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZQorCSAgbG9jYXRpb24gb2YgbWFpbiBtZW1vcnkgaW4geW91ciBzeXN0ZW0uCiAKIGNvbmZpZyBHRU5FUklDX0JVRwogCWRlZl9ib29sIHkKQEAgLTI0Nyw2ICsyNjEsNyBAQAogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IFBMQVRfVkVSU0FUSUxFCiAJc2VsZWN0IFBMQVRfVkVSU0FUSUxFX0ZQR0FfSVJRCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIEFSTSdzIEludGVncmF0b3IgcGxhdGZvcm0uCiAKQEAgLTI2Miw2ICsyNzcsNyBAQAogCXNlbGVjdCBQTEFUX1ZFUlNBVElMRV9DTENECiAJc2VsZWN0IEFSTV9USU1FUl9TUDgwNAogCXNlbGVjdCBHUElPX1BMMDYxIGlmIEdQSU9MSUIKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIEFSTSBMdGQgUmVhbFZpZXcgYm9hcmRzLgogCkBAIC0zMTgsMTAgKzMzNCwyNSBAQAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIEJyb2FkY29tJ3MgQkNNUmluZyBwbGF0Zm9ybS4KIAorY29uZmlnIEFSQ0hfSElHSEJBTksKKwlib29sICJDYWx4ZWRhIEhpZ2hiYW5rLWJhc2VkIgorCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgorCXNlbGVjdCBBUk1fQU1CQQorCXNlbGVjdCBBUk1fR0lDCisJc2VsZWN0IEFSTV9USU1FUl9TUDgwNAorCXNlbGVjdCBDTEtERVZfTE9PS1VQCisJc2VsZWN0IENQVV9WNworCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCisJc2VsZWN0IEhBVkVfQVJNX1NDVQorCXNlbGVjdCBVU0VfT0YKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgQ2FseGVkYSBIaWdoYmFuayBTb0MgYmFzZWQgYm9hcmRzLgorCiBjb25maWcgQVJDSF9DTFBTNzExWAogCWJvb2wgIkNpcnJ1cyBMb2dpYyBDTFBTNzExeC9FUDcyMXgtYmFzZWQiCiAJc2VsZWN0IENQVV9BUk03MjBUCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIENpcnJ1cyBMb2dpYyA3MTF4LzcyMXggYmFzZWQgYm9hcmRzLgogCkBAIC0zNjEsNiArMzkyLDcgQEAKIAlzZWxlY3QgSVNBCiAJc2VsZWN0IE5PX0lPUE9SVAogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVAorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBUaGlzIGlzIGFuIGV2YWx1YXRpb24gYm9hcmQgZm9yIHRoZSBTdHJvbmdBUk0gcHJvY2Vzc29yIGF2YWlsYWJsZQogCSAgZnJvbSBEaWdpdGFsLiBJdCBoYXMgbGltaXRlZCBoYXJkd2FyZSBvbi1ib2FyZCwgaW5jbHVkaW5nIGFuCkBAIC0zNzYsNiArNDA4LDcgQEAKIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgQVJDSF9IQVNfSE9MRVNfTUVNT1JZTU9ERUwKIAlzZWxlY3QgQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDaXJydXMgRVA5M3h4IHNlcmllcyBvZiBDUFVzLgogCkBAIC0zODUsNiArNDE4LDcgQEAKIAlzZWxlY3QgRk9PVEJSSURHRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfSURFCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIERDMjEyODUgY29tcGFuaW9uIGNoaXAKIAkgICgiRm9vdEJyaWRnZSIpLCBzdWNoIGFzIHRoZSBTaW10ZWMgQ0FUUyBhbmQgdGhlIFJlYmVsIE5ldFdpbmRlci4KQEAgLTM5Nyw2ICs0MzEsNyBAQAogCXNlbGVjdCBDTEtTUkNfTU1JTwogCXNlbGVjdCBHRU5FUklDX0lSUV9DSElQCiAJc2VsZWN0IEhBVkVfU0NIRURfQ0xPQ0sKKwlzZWxlY3QgTVVMVElfSVJRX0hBTkRMRVIKIAloZWxwCiAJICBTdXBwb3J0IGZvciBGcmVlc2NhbGUgTVhDL2lNWC1iYXNlZCBmYW1pbHkgb2YgcHJvY2Vzc29ycwogCkBAIC00MzQsNiArNDY5LDcgQEAKIAlzZWxlY3QgUENJCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCiAJc2VsZWN0IFZNU1BMSVRfMUcKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICiAJaGVscAogCSAgU3VwcG9ydCBmb3IgSW50ZWwncyBJT1AxM1hYIChYU2NhbGUpIGZhbWlseSBvZiBwcm9jZXNzb3JzLgogCkBAIC00NjQsNiArNTAwLDcgQEAKIAlzZWxlY3QgQ1BVX1hTQzMKICAJc2VsZWN0IFBDSQogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVAorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBTdXBwb3J0IGZvciBJbnRlbCdzIElYUDIzeHggKFhTY2FsZSkgZmFtaWx5IG9mIHByb2Nlc3NvcnMuCiAKQEAgLTQ3Myw2ICs1MTAsNyBAQAogCXNlbGVjdCBDUFVfWFNDQUxFCiAJc2VsZWN0IFBDSQogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVAorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBTdXBwb3J0IGZvciBJbnRlbCdzIElYUDI0MDAvMjgwMCAoWFNjYWxlKSBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KIApAQCAtNTU3LDYgKzU5NSw3IEBACiAJc2VsZWN0IFRJQ0tfT05FU0hPVAogCXNlbGVjdCBQTEFUX1BYQQogCXNlbGVjdCBTUEFSU0VfSVJRCisJc2VsZWN0IEdFTkVSSUNfQUxMT0NBVE9SCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgTWFydmVsbCdzIFBYQTE2OC9QWEE5MTAoTU1QKSBhbmQgTU1QMiBwcm9jZXNzb3IgbGluZS4KIApAQCAtNTY1LDYgKzYwNCw3IEBACiAJc2VsZWN0IENQVV9BUk05MjJUCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIE1pY3JlbC9LZW5kaW4gS1M4Njk1ICJDZW50YXVyIiAoQVJNOTIyVCkgYmFzZWQKIAkgIFN5c3RlbS1vbi1DaGlwIGRldmljZXMuCkBAIC01ODUsMTQgKzYyNSw2IEBACiAJICA8aHR0cDovL3d3dy5udXZvdG9uLmNvbS9ocS9lbnUvUHJvZHVjdEFuZFNhbGVzL1Byb2R1Y3RMaW5lcy8KIAkJQ29uc3VtZXJFbGVjdHJvbmljc0lDL0FSTU1pY3JvY29udHJvbGxlci9BUk1NaWNyb2NvbnRyb2xsZXI+CiAKLWNvbmZpZyBBUkNIX05VQzkzWAotCWJvb2wgIk51dm90b24gTlVDOTNYIENQVSIKLQlzZWxlY3QgQ1BVX0FSTTkyNlQKLQlzZWxlY3QgQ0xLREVWX0xPT0tVUAotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIE51dm90b24gKFdpbmJvbmQgbG9naWMgZGVwdC4pIE5VQzkzWCBNQ1UsVGhlIE5VQzkzWCBpcyBhCi0JICBsb3ctcG93ZXIgYW5kIGhpZ2ggcGVyZm9ybWFuY2UgTVBFRy00L0pQRUcgbXVsdGltZWRpYSBjb250cm9sbGVyIGNoaXAuCi0KIGNvbmZpZyBBUkNIX1RFR1JBCiAJYm9vbCAiTlZJRElBIFRlZ3JhIgogCXNlbGVjdCBDTEtERVZfTE9PS1VQCkBAIC02MDYsNiArNjM4LDI0IEBACiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgTlZJRElBIFRlZ3JhIGJhc2VkIHN5c3RlbXMgKFRlZ3JhIEFQWCwKIAkgIFRlZ3JhIDZ4eCBhbmQgVGVncmEgMiBzZXJpZXMpLgogCitjb25maWcgQVJDSF9QSUNPWENFTEwKKwlib29sICJQaWNvY2hpcCBwaWNvWGNlbGwiCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IEFSTV9QQVRDSF9QSFlTX1ZJUlQKKwlzZWxlY3QgQVJNX1ZJQworCXNlbGVjdCBDUFVfVjZLCisJc2VsZWN0IERXX0FQQl9USU1FUgorCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCisJc2VsZWN0IEdFTkVSSUNfR1BJTworCXNlbGVjdCBIQVZFX1NDSEVEX0NMT0NLCisJc2VsZWN0IEhBVkVfVENNCisJc2VsZWN0IE5PX0lPUE9SVAorCXNlbGVjdCBVU0VfT0YKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgUGljb2NoaXAgcGljb1hjZWxsCisJICBmYW1pbHkgb2YgRmVtdG9jZWxsIGRldmljZXMuICBUaGUgcGljb3hjZWxsIHN1cHBvcnQgcmVxdWlyZXMgZGV2aWNlIHRyZWUKKwkgIGZvciBhbGwgYm9hcmRzLgorCiBjb25maWcgQVJDSF9QTlg0MDA4CiAJYm9vbCAiUGhpbGlwcyBOZXhwZXJpYSBQTlg0MDA4IE1vYmlsZSIKIAlzZWxlY3QgQ1BVX0FSTTkyNlQKQEAgLTY1Nyw2ICs3MDcsNyBAQAogCXNlbGVjdCBTUEFSU0VfSVJRCiAJc2VsZWN0IE1VTFRJX0lSUV9IQU5ETEVSCiAJc2VsZWN0IFBNX0dFTkVSSUNfRE9NQUlOUyBpZiBQTQorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBTdXBwb3J0IGZvciBSZW5lc2FzJ3MgU0gtTW9iaWxlIGFuZCBSLU1vYmlsZSBBUk0gcGxhdGZvcm1zLgogCkBAIC02NzIsNiArNzIzLDcgQEAKIAlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCiAJc2VsZWN0IEhBVkVfSURFCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIE9uIHRoZSBBY29ybiBSaXNjLVBDLCBMaW51eCBjYW4gc3VwcG9ydCB0aGUgaW50ZXJuYWwgSURFIGRpc2sgYW5kCiAJICBDRC1ST00gaW50ZXJmYWNlLCBzZXJpYWwgYW5kIHBhcmFsbGVsIHBvcnQsIGFuZCB0aGUgZmxvcHB5IGRyaXZlLgpAQCAtNjkxLDYgKzc0Myw3IEBACiAJc2VsZWN0IFRJQ0tfT05FU0hPVAogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBIQVZFX0lERQorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBTdXBwb3J0IGZvciBTdHJvbmdBUk0gMTF4MCBiYXNlZCBib2FyZHMuCiAKQEAgLTcxNyw2ICs3NzAsNyBAQAogCXNlbGVjdCBDUFVfVjYKIAlzZWxlY3QgQVJNX1ZJQwogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBIQVZFX1RDTQogCXNlbGVjdCBDTEtERVZfTE9PS1VQCiAJc2VsZWN0IE5PX0lPUE9SVAogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVApAQCAtNzI1LDkgKzc3OSw2IEBACiAJc2VsZWN0IFNBTVNVTkdfQ0xLU1JDCiAJc2VsZWN0IFNBTVNVTkdfSVJRX1ZJQ19USU1FUgogCXNlbGVjdCBTM0NfR1BJT19UUkFDSwotCXNlbGVjdCBTM0NfR1BJT19QVUxMX1VQRE9XTgotCXNlbGVjdCBTM0NfR1BJT19DRkdfUzNDMjRYWAotCXNlbGVjdCBTM0NfR1BJT19DRkdfUzNDNjRYWAogCXNlbGVjdCBTM0NfREVWX05BTkQKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgU0FNU1VOR19HUElPTElCXzRCSVQKQEAgLTc4MiwxMSArODMzLDEyIEBACiAJc2VsZWN0IEhBVkVfUzNDMjQxMF9JMkMgaWYgSTJDCiAJc2VsZWN0IEhBVkVfUzNDX1JUQyBpZiBSVENfQ0xBU1MKIAlzZWxlY3QgSEFWRV9TM0MyNDEwX1dBVENIRE9HIGlmIFdBVENIRE9HCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFNhbXN1bmcgUzVQVjIxMC9TNVBDMTEwIHNlcmllcyBiYXNlZCBzeXN0ZW1zCiAKLWNvbmZpZyBBUkNIX0VYWU5PUzQKLQlib29sICJTYW1zdW5nIEVYWU5PUzQiCitjb25maWcgQVJDSF9FWFlOT1MKKwlib29sICJTQU1TVU5HIEVYWU5PUyIKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCXNlbGVjdCBBUkNIX0hBU19IT0xFU19NRU1PUllNT0RFTApAQCAtNzk4LDggKzg1MCw5IEBACiAJc2VsZWN0IEhBVkVfUzNDX1JUQyBpZiBSVENfQ0xBU1MKIAlzZWxlY3QgSEFWRV9TM0MyNDEwX0kyQyBpZiBJMkMKIAlzZWxlY3QgSEFWRV9TM0MyNDEwX1dBVENIRE9HIGlmIFdBVENIRE9HCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKLQkgIFNhbXN1bmcgRVhZTk9TNCBzZXJpZXMgYmFzZWQgc3lzdGVtcworCSAgU3VwcG9ydCBmb3IgU0FNU1VORydzIEVYWU5PUyBTb0NzIChFWFlOT1M0LzUpCiAKIGNvbmZpZyBBUkNIX1NIQVJLCiAJYm9vbCAiU2hhcmsiCkBAIC04MDksNiArODYyLDcgQEAKIAlzZWxlY3QgWk9ORV9ETUEKIAlzZWxlY3QgUENJCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBTdHJvbmdBUk0gYmFzZWQgRGlnaXRhbCBETkFSRCBtYWNoaW5lLCBhbHNvIGtub3duCiAJICBhcyAiU2hhcmsiICg8aHR0cDovL3d3dy5zaGFyay1saW51eC5kZS9zaGFyay5odG1sPikuCkBAIC04MzEsMTEgKzg4NSwxNCBAQAogCXNlbGVjdCBIQVZFX1NDSEVEX0NMT0NLCiAJc2VsZWN0IEhBVkVfVENNCiAJc2VsZWN0IEFSTV9BTUJBCisJc2VsZWN0IEFSTV9QQVRDSF9QSFlTX1ZJUlQKIAlzZWxlY3QgQVJNX1ZJQwogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IENMS0RFVl9MT09LVVAKIAlzZWxlY3QgSEFWRV9NQUNIX0NMS0RFVgogCXNlbGVjdCBHRU5FUklDX0dQSU8KKwlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICiAJaGVscAogCSAgU3VwcG9ydCBmb3IgU1QtRXJpY3Nzb24gVTMwMCBzZXJpZXMgbW9iaWxlIHBsYXRmb3Jtcy4KIApAQCAtOTc5LDggKzEwMzYsNiBAQAogc291cmNlICJhcmNoL2FybS9tYWNoLW5vbWFkaWsvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9hcm0vcGxhdC1ub21hZGlrL0tjb25maWciCiAKLXNvdXJjZSAiYXJjaC9hcm0vbWFjaC1udWM5M3gvS2NvbmZpZyIKLQogc291cmNlICJhcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZyIKIAogc291cmNlICJhcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWciCkBAIC0xMDI0LDcgKzEwNzksNyBAQAogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtczVwdjIxMC9LY29uZmlnIgogCi1zb3VyY2UgImFyY2gvYXJtL21hY2gtZXh5bm9zNC9LY29uZmlnIgorc291cmNlICJhcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZyIKIApAQCAtMTM3NCw3ICsxNDI5LDcgQEAKIAlkZXBlbmRzIG9uIFJFQUxWSUVXX0VCX0FSTTExTVAgfHwgUkVBTFZJRVdfRUJfQTlNUCB8fCBcCiAJCSBNQUNIX1JFQUxWSUVXX1BCMTFNUCB8fCBNQUNIX1JFQUxWSUVXX1BCWCB8fCBBUkNIX09NQVA0IHx8IFwKIAkJIEFSQ0hfRVhZTk9TNCB8fCBBUkNIX1RFR1JBIHx8IEFSQ0hfVTg1MDAgfHwgQVJDSF9WRVhQUkVTU19DQTlYNCB8fCBcCi0JCSBBUkNIX01TTV9TQ09SUElPTk1QIHx8IEFSQ0hfU0hNT0JJTEUKKwkJIEFSQ0hfTVNNX1NDT1JQSU9OTVAgfHwgQVJDSF9TSE1PQklMRSB8fCBBUkNIX0hJR0hCQU5LIHx8IFNPQ19JTVg2UQogCWRlcGVuZHMgb24gTU1VCiAJc2VsZWN0IFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTCiAJc2VsZWN0IEhBVkVfQVJNX1NDVSBpZiAhQVJDSF9NU01fU0NPUlBJT05NUApAQCAtMTgzNCw2ICsxODg5LDM4IEBACiAKIGVuZGNob2ljZQogCitjb25maWcgQVJNX0FQUEVOREVEX0RUQgorCWJvb2wgIlVzZSBhcHBlbmRlZCBkZXZpY2UgdHJlZSBibG9iIHRvIHpJbWFnZSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE9GICYmICFaQk9PVF9ST00gJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiwgdGhlIGJvb3QgY29kZSB3aWxsIGxvb2sgZm9yIGEgZGV2aWNlIHRyZWUgYmluYXJ5CisJICAoRFRCKSBhcHBlbmRlZCB0byB6SW1hZ2UKKwkgIChlLmcuIGNhdCB6SW1hZ2UgPGZpbGVuYW1lPi5kdGIgPiB6SW1hZ2Vfd19kdGIpLgorCisJICBUaGlzIGlzIG1lYW50IGFzIGEgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBjb252ZW5pZW5jZSBmb3IgdGhvc2UKKwkgIHN5c3RlbXMgd2l0aCBhIGJvb3Rsb2FkZXIgdGhhdCBjYW4ndCBiZSB1cGdyYWRlZCB0byBhY2NvbW1vZGF0ZQorCSAgdGhlIGRvY3VtZW50ZWQgYm9vdCBwcm90b2NvbCB1c2luZyBhIGRldmljZSB0cmVlLgorCisJICBCZXdhcmUgdGhhdCB0aGVyZSBpcyB2ZXJ5IGxpdHRsZSBpbiB0ZXJtcyBvZiBwcm90ZWN0aW9uIGFnYWluc3QKKwkgIHRoaXMgb3B0aW9uIGJlaW5nIGNvbmZ1c2VkIGJ5IGxlZnRvdmVyIGdhcmJhZ2UgaW4gbWVtb3J5IHRoYXQgbWlnaHQKKwkgIGxvb2sgbGlrZSBhIERUQiBoZWFkZXIgYWZ0ZXIgYSByZWJvb3QgaWYgbm8gYWN0dWFsIERUQiBpcyBhcHBlbmRlZAorCSAgdG8gekltYWdlLiAgRG8gbm90IGxlYXZlIHRoaXMgb3B0aW9uIGFjdGl2ZSBpbiBhIHByb2R1Y3Rpb24ga2VybmVsCisJICBpZiB5b3UgZG9uJ3QgaW50ZW5kIHRvIGFsd2F5cyBhcHBlbmQgYSBEVEIuICBQcm9wZXIgcGFzc2luZyBvZiB0aGUKKwkgIGxvY2F0aW9uIGludG8gcjIgb2YgYSBib290bG9hZGVyIHByb3ZpZGVkIERUQiBpcyBhbHdheXMgcHJlZmVyYWJsZQorCSAgdG8gdGhpcyBvcHRpb24uCisKK2NvbmZpZyBBUk1fQVRBR19EVEJfQ09NUEFUCisJYm9vbCAiU3VwcGxlbWVudCB0aGUgYXBwZW5kZWQgRFRCIHdpdGggdHJhZGl0aW9uYWwgQVRBRyBpbmZvcm1hdGlvbiIKKwlkZXBlbmRzIG9uIEFSTV9BUFBFTkRFRF9EVEIKKwloZWxwCisJICBTb21lIG9sZCBib290bG9hZGVycyBjYW4ndCBiZSB1cGRhdGVkIHRvIGEgRFRCIGNhcGFibGUgb25lLCB5ZXQKKwkgIHRoZXkgcHJvdmlkZSBBVEFHcyB3aXRoIG1lbW9yeSBjb25maWd1cmF0aW9uLCB0aGUgcmFtZGlzayBhZGRyZXNzLAorCSAgdGhlIGtlcm5lbCBjbWRsaW5lIHN0cmluZywgZXRjLiAgU3VjaCBpbmZvcm1hdGlvbiBpcyBkeW5hbWljYWxseQorCSAgcHJvdmlkZWQgYnkgdGhlIGJvb3Rsb2FkZXIgYW5kIGNhbid0IGFsd2F5cyBiZSBzdG9yZWQgaW4gYSBzdGF0aWMKKwkgIERUQi4gIFRvIGFsbG93IGEgZGV2aWNlIHRyZWUgZW5hYmxlZCBrZXJuZWwgdG8gYmUgdXNlZCB3aXRoIHN1Y2gKKwkgIGJvb3Rsb2FkZXJzLCB0aGlzIG9wdGlvbiBhbGxvd3MgekltYWdlIHRvIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uCisJICBmcm9tIHRoZSBBVEFHIGxpc3QgYW5kIHN0b3JlIGl0IGF0IHJ1biB0aW1lIGludG8gdGhlIGFwcGVuZGVkIERUQi4KKwogY29uZmlnIENNRExJTkUKIAlzdHJpbmcgIkRlZmF1bHQga2VybmVsIGNvbW1hbmQgc3RyaW5nIgogCWRlZmF1bHQgIiIKQEAgLTE5ODAsNiArMjA2Nyw3IEBACiAJYm9vbAogCWRlcGVuZHMgb24gQ1BVX0ZSRVEgJiYgQVJDSF9QWEEgJiYgUFhBMjV4CiAJZGVmYXVsdCB5CisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCiAJc2VsZWN0IENQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRQogCiBjb25maWcgQ1BVX0ZSRVFfUzNDCkBAIC0yMTIzLDcgKzIyMTEsNyBAQAogc291cmNlICJrZXJuZWwvcG93ZXIvS2NvbmZpZyIKIAogY29uZmlnIEFSQ0hfU1VTUEVORF9QT1NTSUJMRQotCWRlcGVuZHMgb24gIUFSQ0hfUzVQNjRYMCAmJiAhQVJDSF9TNVBDMTAwCisJZGVwZW5kcyBvbiAhQVJDSF9TNVBDMTAwCiAJZGVwZW5kcyBvbiBDUFVfQVJNOTIwVCB8fCBDUFVfQVJNOTI2VCB8fCBDUFVfU0ExMTAwIHx8IFwKIAkJQ1BVX1Y2IHx8IENQVV9WNksgfHwgQ1BVX1Y3IHx8IENQVV9YU0MzIHx8IENQVV9YU0NBTEUKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnIGIvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZwppbmRleCBkZjNlYjNjLi5jNTIxM2U3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvYXJtL0tjb25maWcuZGVidWcKQEAgLTEyOCw2ICsxMjgsMTI1IEBACiAJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgcHJpbnQgcm91dGluZXMgdG8gZGlyZWN0CiAJCSAgdGhlaXIgb3V0cHV0IHRvIHRoZSBzZWNvbmQgc2VyaWFsIHBvcnQgb24gdGhlc2UgZGV2aWNlcy4KIAorCWNvbmZpZyBERUJVR19ISUdIQkFOS19VQVJUCisJCWJvb2wgIktlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIG1lc3NhZ2VzIHZpYSBIaWdoYmFuayBVQVJUIgorCQlkZXBlbmRzIG9uIEFSQ0hfSElHSEJBTksKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIGRlYnVnIHByaW50IHJvdXRpbmVzIHRvIGRpcmVjdAorCQkgIHRoZWlyIG91dHB1dCB0byB0aGUgVUFSVCBvbiBIaWdoYmFuayBiYXNlZCBkZXZpY2VzLgorCisJY29uZmlnIERFQlVHX0lNWDFfVUFSVAorCQlib29sICJpLk1YMSBEZWJ1ZyBVQVJUIgorCQlkZXBlbmRzIG9uIFNPQ19JTVgxCisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIHN1cHBvcnQKKwkJICBvbiBpLk1YMS4KKworCWNvbmZpZyBERUJVR19JTVgyM19VQVJUCisJCWJvb2wgImkuTVgyMyBEZWJ1ZyBVQVJUIgorCQlkZXBlbmRzIG9uIFNPQ19JTVgyMworCQloZWxwCisJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBrZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBzdXBwb3J0CisJCSAgb24gaS5NWDIzLgorCisJY29uZmlnIERFQlVHX0lNWDI1X1VBUlQKKwkJYm9vbCAiaS5NWDI1IERlYnVnIFVBUlQiCisJCWRlcGVuZHMgb24gU09DX0lNWDI1CisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIHN1cHBvcnQKKwkJICBvbiBpLk1YMjUuCisKKwljb25maWcgREVCVUdfSU1YMjFfSU1YMjdfVUFSVAorCQlib29sICJpLk1YMjEgYW5kIGkuTVgyNyBEZWJ1ZyBVQVJUIgorCQlkZXBlbmRzIG9uIFNPQ19JTVgyMSB8fCBTT0NfSU1YMjcKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQga2VybmVsIGxvdy1sZXZlbCBkZWJ1Z2dpbmcgc3VwcG9ydAorCQkgIG9uIGkuTVgyMSBvciBpLk1YMjcuCisKKwljb25maWcgREVCVUdfSU1YMjhfVUFSVAorCQlib29sICJpLk1YMjggRGVidWcgVUFSVCIKKwkJZGVwZW5kcyBvbiBTT0NfSU1YMjgKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQga2VybmVsIGxvdy1sZXZlbCBkZWJ1Z2dpbmcgc3VwcG9ydAorCQkgIG9uIGkuTVgyOC4KKworCWNvbmZpZyBERUJVR19JTVgzMV9JTVgzNV9VQVJUCisJCWJvb2wgImkuTVgzMSBhbmQgaS5NWDM1IERlYnVnIFVBUlQiCisJCWRlcGVuZHMgb24gU09DX0lNWDMxIHx8IFNPQ19JTVgzNQorCQloZWxwCisJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBrZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBzdXBwb3J0CisJCSAgb24gaS5NWDMxIG9yIGkuTVgzNS4KKworCWNvbmZpZyBERUJVR19JTVg1MV9VQVJUCisJCWJvb2wgImkuTVg1MSBEZWJ1ZyBVQVJUIgorCQlkZXBlbmRzIG9uIFNPQ19JTVg1MQorCQloZWxwCisJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBrZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBzdXBwb3J0CisJCSAgb24gaS5NWDUxLgorCisJY29uZmlnIERFQlVHX0lNWDUwX0lNWDUzX1VBUlQKKwkJYm9vbCAiaS5NWDUwIGFuZCBpLk1YNTMgRGVidWcgVUFSVCIKKwkJZGVwZW5kcyBvbiBTT0NfSU1YNTAgfHwgU09DX0lNWDUzCisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIHN1cHBvcnQKKwkJICBvbiBpLk1YNTAgb3IgaS5NWDUzLgorCisJY29uZmlnIERFQlVHX0lNWDZRX1VBUlQKKwkJYm9vbCAiaS5NWDZRIERlYnVnIFVBUlQiCisJCWRlcGVuZHMgb24gU09DX0lNWDZRCisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIHN1cHBvcnQKKwkJICBvbiBpLk1YNlEuCisKKwljb25maWcgREVCVUdfUzNDX1VBUlQwCisJCWRlcGVuZHMgb24gUExBVF9TQU1TVU5HCisJCWJvb2wgIlVzZSBTM0MgVUFSVCAwIGZvciBsb3ctbGV2ZWwgZGVidWciCisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBkZWJ1ZyBwcmludCByb3V0aW5lcyB0byBkaXJlY3QKKwkJICB0aGVpciBvdXRwdXQgdG8gVUFSVCAwLiBUaGUgcG9ydCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXNlZAorCQkgIGJ5IHRoZSBib290LWxvYWRlciBiZWZvcmUgdXNlLgorCisJCSAgVGhlIHVuY29tcHJlc3NvciBjb2RlIHBvcnQgY29uZmlndXJhdGlvbiBpcyBub3cgaGFuZGxlZAorCQkgIGJ5IENPTkZJR19TM0NfTE9XTEVWRUxfVUFSVF9QT1JULgorCisJY29uZmlnIERFQlVHX1MzQ19VQVJUMQorCQlkZXBlbmRzIG9uIFBMQVRfU0FNU1VORworCQlib29sICJVc2UgUzNDIFVBUlQgMSBmb3IgbG93LWxldmVsIGRlYnVnIgorCQloZWxwCisJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgcHJpbnQgcm91dGluZXMgdG8gZGlyZWN0CisJCSAgdGhlaXIgb3V0cHV0IHRvIFVBUlQgMS4gVGhlIHBvcnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGlzZWQKKwkJICBieSB0aGUgYm9vdC1sb2FkZXIgYmVmb3JlIHVzZS4KKworCQkgIFRoZSB1bmNvbXByZXNzb3IgY29kZSBwb3J0IGNvbmZpZ3VyYXRpb24gaXMgbm93IGhhbmRsZWQKKwkJICBieSBDT05GSUdfUzNDX0xPV0xFVkVMX1VBUlRfUE9SVC4KKworCWNvbmZpZyBERUJVR19TM0NfVUFSVDIKKwkJZGVwZW5kcyBvbiBQTEFUX1NBTVNVTkcKKwkJYm9vbCAiVXNlIFMzQyBVQVJUIDIgZm9yIGxvdy1sZXZlbCBkZWJ1ZyIKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIGRlYnVnIHByaW50IHJvdXRpbmVzIHRvIGRpcmVjdAorCQkgIHRoZWlyIG91dHB1dCB0byBVQVJUIDIuIFRoZSBwb3J0IG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpc2VkCisJCSAgYnkgdGhlIGJvb3QtbG9hZGVyIGJlZm9yZSB1c2UuCisKKwkJICBUaGUgdW5jb21wcmVzc29yIGNvZGUgcG9ydCBjb25maWd1cmF0aW9uIGlzIG5vdyBoYW5kbGVkCisJCSAgYnkgQ09ORklHX1MzQ19MT1dMRVZFTF9VQVJUX1BPUlQuCisKKwljb25maWcgREVCVUdfUkVBTFZJRVdfU1REX1BPUlQKKwkJYm9vbCAiUmVhbFZpZXcgRGVmYXVsdCBVQVJUIgorCQlkZXBlbmRzIG9uIEFSQ0hfUkVBTFZJRVcKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIGRlYnVnIHByaW50IHJvdXRpbmVzIHRvIGRpcmVjdAorCQkgIHRoZWlyIG91dHB1dCB0byB0aGUgc2VyaWFsIHBvcnQgb24gUmVhbFZpZXcgRUIsIFBCMTFNUCwgUEJBOAorCQkgIGFuZCBQQlggcGxhdGZvcm1zLgorCisJY29uZmlnIERFQlVHX1JFQUxWSUVXX1BCMTE3Nl9QT1JUCisJCWJvb2wgIlJlYWxWaWV3IFBCMTE3NiBVQVJUIgorCQlkZXBlbmRzIG9uIE1BQ0hfUkVBTFZJRVdfUEIxMTc2CisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBkZWJ1ZyBwcmludCByb3V0aW5lcyB0byBkaXJlY3QKKwkJICB0aGVpciBvdXRwdXQgdG8gdGhlIHN0YW5kYXJkIHNlcmlhbCBwb3J0IG9uIHRoZSBSZWFsVmlldworCQkgIFBCMTE3NiBwbGF0Zm9ybS4KKwogZW5kY2hvaWNlCiAKIGNvbmZpZyBFQVJMWV9QUklOVEsKQEAgLTE0NiwxNiArMjY1LDEwIEBACiAJICBidWZmZXIgZHJpdmVyIHRoYXQgd2lsbCBhbGxvdyB5b3UgdG8gY29sbGVjdCB0cmFjZXMgb2YgdGhlCiAJICBrZXJuZWwgY29kZS4KIAotY29uZmlnIERFQlVHX1MzQ19VQVJUCi0JZGVwZW5kcyBvbiBQTEFUX1NBTVNVTkcKLQlpbnQgIlMzQyBVQVJUIHRvIHVzZSBmb3IgbG93LWxldmVsIGRlYnVnIgotCWRlZmF1bHQgIjAiCitjb25maWcgQVJNX0tQUk9CRVNfVEVTVAorCXRyaXN0YXRlICJLcHJvYmVzIHRlc3QgbW9kdWxlIgorCWRlcGVuZHMgb24gS1BST0JFUyAmJiBNT0RVTEVTCiAJaGVscAotCSAgQ2hvaWNlIGZvciBVQVJUIGZvciBrZXJuZWwgbG93LWxldmVsIHVzaW5nIFMzQyBVQVJUUywKLQkgIHNob3VsZCBiZSBiZXR3ZWVuIHplcm8gYW5kIHR3by4gVGhlIHBvcnQgbXVzdCBoYXZlIGJlZW4KLQkgIGluaXRpYWxpc2VkIGJ5IHRoZSBib290LWxvYWRlciBiZWZvcmUgdXNlLgotCi0JICBUaGUgdW5jb21wcmVzc29yIGNvZGUgcG9ydCBjb25maWd1cmF0aW9uIGlzIG5vdyBoYW5kbGVkCi0JICBieSBDT05GSUdfUzNDX0xPV0xFVkVMX1VBUlRfUE9SVC4KKwkgIFBlcmZvcm0gdGVzdHMgb2Yga3Byb2JlcyBBUEkgYW5kIGluc3RydWN0aW9uIHNldCBzaW11bGF0aW9uLgogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDU2NjVjMmEuLmRmY2YzYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0xNDQsNiArMTQ0LDcgQEAKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9FUDkzWFgpCQk6PSBlcDkzeHgKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9HRU1JTkkpCQk6PSBnZW1pbmkKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9INzIwWCkJCTo9IGg3MjB4CittYWNoaW5lLSQoQ09ORklHX0FSQ0hfSElHSEJBTkspCQk6PSBoaWdoYmFuawogbWFjaGluZS0kKENPTkZJR19BUkNIX0lOVEVHUkFUT1IpCTo9IGludGVncmF0b3IKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9JT1AxM1hYKQkJOj0gaW9wMTN4eAogbWFjaGluZS0kKENPTkZJR19BUkNIX0lPUDMyWCkJCTo9IGlvcDMyeApAQCAtMTU3LDEwICsxNTgsOCBAQAogbWFjaGluZS0kKENPTkZJR19BUkNIX01NUCkJCTo9IG1tcAogbWFjaGluZS0kKENPTkZJR19BUkNIX01TTSkJCTo9IG1zbQogbWFjaGluZS0kKENPTkZJR19BUkNIX01WNzhYWDApCQk6PSBtdjc4eHgwCi1tYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgxKQkJOj0gaW14Ci1tYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgyKQkJOj0gaW14Ci1tYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgyNSkJCTo9IGlteAotbWFjaGluZS0kKENPTkZJR19BUkNIX01YMykJCTo9IGlteAorbWFjaGluZS0kKENPTkZJR19BUkNIX0lNWF9WNF9WNSkJOj0gaW14CittYWNoaW5lLSQoQ09ORklHX0FSQ0hfSU1YX1Y2X1Y3KQk6PSBpbXgKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9NWDUpCQk6PSBteDUKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9NWFMpCQk6PSBteHMKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9ORVRYKQkJOj0gbmV0eApAQCAtMTcwLDYgKzE2OSw3IEBACiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfT01BUDMpCQk6PSBvbWFwMgogbWFjaGluZS0kKENPTkZJR19BUkNIX09NQVA0KQkJOj0gb21hcDIKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9PUklPTjVYKQkJOj0gb3Jpb241eAorbWFjaGluZS0kKENPTkZJR19BUkNIX1BJQ09YQ0VMTCkJOj0gcGljb3hjZWxsCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfUE5YNDAwOCkJCTo9IHBueDQwMDgKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9QUklNQTIpCQk6PSBwcmltYTIKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9QWEEpCQk6PSBweGEKQEAgLTE4MCw3ICsxODAsNyBAQAogbWFjaGluZS0kKENPTkZJR19BUkNIX1M1UDY0WDApCQk6PSBzNXA2NHgwCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfUzVQQzEwMCkJCTo9IHM1cGMxMDAKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TNVBWMjEwKQkJOj0gczVwdjIxMAotbWFjaGluZS0kKENPTkZJR19BUkNIX0VYWU5PUzQpCQk6PSBleHlub3M0CittYWNoaW5lLSQoQ09ORklHX0FSQ0hfRVhZTk9TNCkJCTo9IGV4eW5vcwogbWFjaGluZS0kKENPTkZJR19BUkNIX1NBMTEwMCkJCTo9IHNhMTEwMAogbWFjaGluZS0kKENPTkZJR19BUkNIX1NIQVJLKQkJOj0gc2hhcmsKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TSE1PQklMRSkgCTo9IHNobW9iaWxlCkBAIC0xOTIsNyArMTkyLDYgQEAKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9WRVhQUkVTUykJCTo9IHZleHByZXNzCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfVlQ4NTAwKQkJOj0gdnQ4NTAwCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfVzkwWDkwMCkJCTo9IHc5MHg5MDAKLW1hY2hpbmUtJChDT05GSUdfQVJDSF9OVUM5M1gpCQk6PSBudWM5M3gKIG1hY2hpbmUtJChDT05GSUdfRk9PVEJSSURHRSkJCTo9IGZvb3RicmlkZ2UKIG1hY2hpbmUtJChDT05GSUdfTUFDSF9TUEVBUjMwMCkJCTo9IHNwZWFyM3h4CiBtYWNoaW5lLSQoQ09ORklHX01BQ0hfU1BFQVIzMTApCQk6PSBzcGVhcjN4eApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkLy5naXRpZ25vcmUgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZQppbmRleCBjNjAyODk2Li5lMDkzNmExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZQorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZQpAQCAtNSwzICs1LDEyIEBACiBwaWdneS5sem1hCiB2bWxpbnV4CiB2bWxpbnV4LmxkcworCisjIGJvcnJvd2VkIGxpYmZkdCBmaWxlcworZmR0LmMKK2ZkdC5oCitmZHRfcm8uYworZmR0X3J3LmMKK2ZkdF93aXAuYworbGliZmR0LmgKK2xpYmZkdF9pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggYTZiMzBiMy4uMjFmNTZmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtMjYsNiArMjYsMTAgQEAKIE9CSlMJKz0gbWlzYy5vIGRlY29tcHJlc3MubwogRk9OVEMJPSAkKHNyY3RyZWUpL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mb250X2Fjb3JuXzh4OC5jCiAKKyMgc3RyaW5nIGxpYnJhcnkgY29kZSAoLU9zIGlzIGVuZm9yY2VkIHRvIGtlZXAgaXQgbXVjaCBzbWFsbGVyKQorT0JKUwkJKz0gc3RyaW5nLm8KK0NGTEFHU19zdHJpbmcubwk6PSAtT3MKKwogIwogIyBBcmNoaXRlY3R1cmUgZGVwZW5kZW5jaWVzCiAjCkBAIC04OSwyMSArOTMsNDEgQEAKIHN1ZmZpeF8kKENPTkZJR19LRVJORUxfTFpPKSAgPSBsem8KIHN1ZmZpeF8kKENPTkZJR19LRVJORUxfTFpNQSkgPSBsem1hCiAKKyMgQm9ycm93ZWQgbGliZmR0IGZpbGVzIGZvciB0aGUgQVRBRyBjb21wYXRpYmlsaXR5IG1vZGUKKworbGliZmR0CQk6PSBmZHRfcncuYyBmZHRfcm8uYyBmZHRfd2lwLmMgZmR0LmMKK2xpYmZkdF9oZHJzCTo9IGZkdC5oIGxpYmZkdC5oIGxpYmZkdF9pbnRlcm5hbC5oCisKK2xpYmZkdF9vYmpzCTo9ICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQobGliZmR0KSkpCisKKyQoYWRkcHJlZml4ICQob2JqKS8sJChsaWJmZHQpICQobGliZmR0X2hkcnMpKTogJChvYmopLyU6ICQoc3JjdHJlZSkvc2NyaXB0cy9kdGMvbGliZmR0LyUKKwkkKGNhbGwgY21kLHNoaXBwZWQpCisKKyQoYWRkcHJlZml4ICQob2JqKS8sJChsaWJmZHRfb2JqcykgYXRhZ3NfdG9fZmR0Lm8pOiBcCisJJChhZGRwcmVmaXggJChvYmopLywkKGxpYmZkdF9oZHJzKSkKKworaWZlcSAoJChDT05GSUdfQVJNX0FUQUdfRFRCX0NPTVBBVCkseSkKK09CSlMJKz0gJChsaWJmZHRfb2JqcykgYXRhZ3NfdG9fZmR0Lm8KK2VuZGlmCisKIHRhcmdldHMgICAgICAgOj0gdm1saW51eCB2bWxpbnV4LmxkcyBcCiAJCSBwaWdneS4kKHN1ZmZpeF95KSBwaWdneS4kKHN1ZmZpeF95KS5vIFwKLQkJIGZvbnQubyBmb250LmMgaGVhZC5vIG1pc2MubyAkKE9CSlMpCisJCSBsaWIxZnVuY3MubyBsaWIxZnVuY3MuUyBmb250Lm8gZm9udC5jIGhlYWQubyBtaXNjLm8gJChPQkpTKQogCiAjIE1ha2Ugc3VyZSBmaWxlcyBhcmUgcmVtb3ZlZCBkdXJpbmcgY2xlYW4KLWV4dHJhLXkgICAgICAgKz0gcGlnZ3kuZ3ppcCBwaWdneS5sem8gcGlnZ3kubHptYSBsaWIxZnVuY3MuUworZXh0cmEteSAgICAgICArPSBwaWdneS5nemlwIHBpZ2d5Lmx6byBwaWdneS5sem1hIGxpYjFmdW5jcy5TICQobGliZmR0KSAkKGxpYmZkdF9oZHJzKQogCiBpZmVxICgkKENPTkZJR19GVU5DVElPTl9UUkFDRVIpLHkpCiBPUklHX0NGTEFHUyA6PSAkKEtCVUlMRF9DRkxBR1MpCiBLQlVJTERfQ0ZMQUdTID0gJChzdWJzdCAtcGcsICwgJChPUklHX0NGTEFHUykpCiBlbmRpZgogCi1jY2ZsYWdzLXkgOj0gLWZwaWMgLWZuby1idWlsdGluCitjY2ZsYWdzLXkgOj0gLWZwaWMgLWZuby1idWlsdGluIC1JJChvYmopCiBhc2ZsYWdzLXkgOj0gLVdhLC1tYXJjaD1hbGwKIAorIyBTdXBwbHkga2VybmVsIEJTUyBzaXplIHRvIHRoZSBkZWNvbXByZXNzb3IgdmlhIGEgbGlua2VyIHN5bWJvbC4KK0tCU1NfU1ogPSAkKHNoZWxsIHNpemUgJChvYmopLy4uLy4uLy4uLy4uL3ZtbGludXggfCBhd2sgJ0VORHtwcmludCAkJDN9JykKK0xERkxBR1Nfdm1saW51eCA9IC0tZGVmc3ltIF9rZXJuZWxfYnNzX3NpemU9JChLQlNTX1NaKQogIyBTdXBwbHkgWlJFTEFERFIgdG8gdGhlIGRlY29tcHJlc3NvciB2aWEgYSBsaW5rZXIgc3ltYm9sLgogaWZuZXEgKCQoQ09ORklHX0FVVE9fWlJFTEFERFIpLHkpCiBMREZMQUdTX3ZtbGludXggKz0gLS1kZWZzeW0genJlbGFkZHI9JChaUkVMQUREUikKQEAgLTEyMyw3ICsxNDcsNyBAQAogIyBGb3IgX19hZWFiaV91aWRpdm1vZAogbGliMWZ1bmNzID0gJChvYmopL2xpYjFmdW5jcy5vCiAKLSQob2JqKS9saWIxZnVuY3MuUzogJChzcmN0cmVlKS9hcmNoLyQoU1JDQVJDSCkvbGliL2xpYjFmdW5jcy5TIEZPUkNFCiskKG9iaikvbGliMWZ1bmNzLlM6ICQoc3JjdHJlZSkvYXJjaC8kKFNSQ0FSQ0gpL2xpYi9saWIxZnVuY3MuUwogCSQoY2FsbCBjbWQsc2hpcHBlZCkKIAogIyBXZSBuZWVkIHRvIHByZXZlbnQgYW55IEdPVE9GRiByZWxvY3MgYmVpbmcgdXNlZCB3aXRoIHJlZmVyZW5jZXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9hdGFnc190b19mZHQuYyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9hdGFnc190b19mZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2UxMWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2F0YWdzX3RvX2ZkdC5jCkBAIC0wLDAgKzEsOTcgQEAKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKworc3RhdGljIGludCBub2RlX29mZnNldCh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5vZGVfcGF0aCkKK3sKKwlpbnQgb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0KGZkdCwgbm9kZV9wYXRoKTsKKwlpZiAob2Zmc2V0ID09IC1GRFRfRVJSX05PVEZPVU5EKQorCQlvZmZzZXQgPSBmZHRfYWRkX3N1Ym5vZGUoZmR0LCAwLCBub2RlX3BhdGgpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0cHJvcCh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5vZGVfcGF0aCwgY29uc3QgY2hhciAqcHJvcGVydHksCisJCSAgIHVpbnQzMl90ICp2YWxfYXJyYXksIGludCBzaXplKQoreworCWludCBvZmZzZXQgPSBub2RlX29mZnNldChmZHQsIG5vZGVfcGF0aCk7CisJaWYgKG9mZnNldCA8IDApCisJCXJldHVybiBvZmZzZXQ7CisJcmV0dXJuIGZkdF9zZXRwcm9wKGZkdCwgb2Zmc2V0LCBwcm9wZXJ0eSwgdmFsX2FycmF5LCBzaXplKTsKK30KKworc3RhdGljIGludCBzZXRwcm9wX3N0cmluZyh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5vZGVfcGF0aCwKKwkJCSAgY29uc3QgY2hhciAqcHJvcGVydHksIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlpbnQgb2Zmc2V0ID0gbm9kZV9vZmZzZXQoZmR0LCBub2RlX3BhdGgpOworCWlmIChvZmZzZXQgPCAwKQorCQlyZXR1cm4gb2Zmc2V0OworCXJldHVybiBmZHRfc2V0cHJvcF9zdHJpbmcoZmR0LCBvZmZzZXQsIHByb3BlcnR5LCBzdHJpbmcpOworfQorCitzdGF0aWMgaW50IHNldHByb3BfY2VsbCh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5vZGVfcGF0aCwKKwkJCWNvbnN0IGNoYXIgKnByb3BlcnR5LCB1aW50MzJfdCB2YWwpCit7CisJaW50IG9mZnNldCA9IG5vZGVfb2Zmc2V0KGZkdCwgbm9kZV9wYXRoKTsKKwlpZiAob2Zmc2V0IDwgMCkKKwkJcmV0dXJuIG9mZnNldDsKKwlyZXR1cm4gZmR0X3NldHByb3BfY2VsbChmZHQsIG9mZnNldCwgcHJvcGVydHksIHZhbCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuZCBmb2xkIHByb3ZpZGVkIEFUQUdzIGludG8gdGhlIHByb3ZpZGVkIEZEVC4KKyAqCisgKiBSRXR1cm4gdmFsdWVzOgorICogICAgPSAwIC0+IHByZXRlbmQgc3VjY2VzcworICogICAgPSAxIC0+IGJhZCBBVEFHIChtYXkgcmV0cnkgd2l0aCBhbm90aGVyIHBvc3NpYmxlIEFUQUcgcG9pbnRlcikKKyAqICAgIDwgMCAtPiBlcnJvciBmcm9tIGxpYmZkdAorICovCitpbnQgYXRhZ3NfdG9fZmR0KHZvaWQgKmF0YWdfbGlzdCwgdm9pZCAqZmR0LCBpbnQgdG90YWxfc3BhY2UpCit7CisJc3RydWN0IHRhZyAqYXRhZyA9IGF0YWdfbGlzdDsKKwl1aW50MzJfdCBtZW1fcmVnX3Byb3BlcnR5WzIgKiBOUl9CQU5LU107CisJaW50IG1lbWNvdW50ID0gMDsKKwlpbnQgcmV0OworCisJLyogbWFrZSBzdXJlIHdlJ3ZlIGdvdCBhbiBhbGlnbmVkIHBvaW50ZXIgKi8KKwlpZiAoKHUzMilhdGFnX2xpc3QgJiAweDMpCisJCXJldHVybiAxOworCisJLyogaWYgd2UgZ2V0IGEgRFRCIGhlcmUgd2UncmUgZG9uZSBhbHJlYWR5ICovCisJaWYgKCoodTMyICopYXRhZ19saXN0ID09IGZkdDMyX3RvX2NwdShGRFRfTUFHSUMpKQorCSAgICAgICByZXR1cm4gMDsKKworCS8qIHZhbGlkYXRlIHRoZSBBVEFHICovCisJaWYgKGF0YWctPmhkci50YWcgIT0gQVRBR19DT1JFIHx8CisJICAgIChhdGFnLT5oZHIuc2l6ZSAhPSB0YWdfc2l6ZSh0YWdfY29yZSkgJiYKKwkgICAgIGF0YWctPmhkci5zaXplICE9IDIpKQorCQlyZXR1cm4gMTsKKworCS8qIGxldCdzIGdpdmUgaXQgYWxsIHRoZSByb29tIGl0IGNvdWxkIG5lZWQgKi8KKwlyZXQgPSBmZHRfb3Blbl9pbnRvKGZkdCwgZmR0LCB0b3RhbF9zcGFjZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3JfZWFjaF90YWcoYXRhZywgYXRhZ19saXN0KSB7CisJCWlmIChhdGFnLT5oZHIudGFnID09IEFUQUdfQ01ETElORSkgeworCQkJc2V0cHJvcF9zdHJpbmcoZmR0LCAiL2Nob3NlbiIsICJib290YXJncyIsCisJCQkJCWF0YWctPnUuY21kbGluZS5jbWRsaW5lKTsKKwkJfSBlbHNlIGlmIChhdGFnLT5oZHIudGFnID09IEFUQUdfTUVNKSB7CisJCQlpZiAobWVtY291bnQgPj0gc2l6ZW9mKG1lbV9yZWdfcHJvcGVydHkpLzQpCisJCQkJY29udGludWU7CisJCQltZW1fcmVnX3Byb3BlcnR5W21lbWNvdW50KytdID0gY3B1X3RvX2ZkdDMyKGF0YWctPnUubWVtLnN0YXJ0KTsKKwkJCW1lbV9yZWdfcHJvcGVydHlbbWVtY291bnQrK10gPSBjcHVfdG9fZmR0MzIoYXRhZy0+dS5tZW0uc2l6ZSk7CisJCX0gZWxzZSBpZiAoYXRhZy0+aGRyLnRhZyA9PSBBVEFHX0lOSVRSRDIpIHsKKwkJCXVpbnQzMl90IGluaXRyZF9zdGFydCwgaW5pdHJkX3NpemU7CisJCQlpbml0cmRfc3RhcnQgPSBhdGFnLT51LmluaXRyZC5zdGFydDsKKwkJCWluaXRyZF9zaXplID0gYXRhZy0+dS5pbml0cmQuc2l6ZTsKKwkJCXNldHByb3BfY2VsbChmZHQsICIvY2hvc2VuIiwgImxpbnV4LGluaXRyZC1zdGFydCIsCisJCQkJCWluaXRyZF9zdGFydCk7CisJCQlzZXRwcm9wX2NlbGwoZmR0LCAiL2Nob3NlbiIsICJsaW51eCxpbml0cmQtZW5kIiwKKwkJCQkJaW5pdHJkX3N0YXJ0ICsgaW5pdHJkX3NpemUpOworCQl9CisJfQorCisJaWYgKG1lbWNvdW50KQorCQlzZXRwcm9wKGZkdCwgIi9tZW1vcnkiLCAicmVnIiwgbWVtX3JlZ19wcm9wZXJ0eSwgNCptZW1jb3VudCk7CisKKwlyZXR1cm4gZmR0X3BhY2soZmR0KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGU5NWE1OTguLmMyZWZmYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtMjE2LDYgKzIxNiwxMDQgQEAKIAkJbW92CXIxMCwgcjYKICNlbmRpZgogCisJCW1vdglyNSwgIzAJCQlAIGluaXQgZHRiIHNpemUgdG8gMAorI2lmZGVmIENPTkZJR19BUk1fQVBQRU5ERURfRFRCCisvKgorICogICByMCAgPSBkZWx0YQorICogICByMiAgPSBCU1Mgc3RhcnQKKyAqICAgcjMgID0gQlNTIGVuZAorICogICByNCAgPSBmaW5hbCBrZXJuZWwgYWRkcmVzcworICogICByNSAgPSBhcHBlbmRlZCBkdGIgc2l6ZSAoc3RpbGwgdW5rbm93bikKKyAqICAgcjYgID0gX2VkYXRhCisgKiAgIHI3ICA9IGFyY2hpdGVjdHVyZSBJRAorICogICByOCAgPSBhdGFncy9kZXZpY2UgdHJlZSBwb2ludGVyCisgKiAgIHI5ICA9IHNpemUgb2YgZGVjb21wcmVzc2VkIGltYWdlCisgKiAgIHIxMCA9IGVuZCBvZiB0aGlzIGltYWdlLCBpbmNsdWRpbmcgIGJzcy9zdGFjay9tYWxsb2Mgc3BhY2UgaWYgbm9uIFhJUAorICogICByMTEgPSBHT1Qgc3RhcnQKKyAqICAgcjEyID0gR09UIGVuZAorICogICBzcCAgPSBzdGFjayBwb2ludGVyCisgKgorICogaWYgdGhlcmUgYXJlIGRldmljZSB0cmVlcyAoZHRiKSBhcHBlbmRlZCB0byB6SW1hZ2UsIGFkdmFuY2UgcjEwIHNvIHRoYXQgdGhlCisgKiBkdGIgZGF0YSB3aWxsIGdldCByZWxvY2F0ZWQgYWxvbmcgd2l0aCB0aGUga2VybmVsIGlmIG5lY2Vzc2FyeS4KKyAqLworCisJCWxkcglsciwgW3I2LCAjMF0KKyNpZm5kZWYgX19BUk1FQl9fCisJCWxkcglyMSwgPTB4ZWRmZTBkZDAJCUAgc2lnIGlzIDB4ZDAwZGZlZWQgYmlnIGVuZGlhbgorI2Vsc2UKKwkJbGRyCXIxLCA9MHhkMDBkZmVlZAorI2VuZGlmCisJCWNtcAlsciwgcjEKKwkJYm5lCWR0Yl9jaGVja19kb25lCQlAIG5vdCBmb3VuZAorCisjaWZkZWYgQ09ORklHX0FSTV9BVEFHX0RUQl9DT01QQVQKKwkJLyoKKwkJICogT0suLi4gTGV0J3MgZG8gc29tZSBmdW5reSBidXNpbmVzcyBoZXJlLgorCQkgKiBJZiB3ZSBkbyBoYXZlIGEgRFRCIGFwcGVuZGVkIHRvIHpJbWFnZSwgYW5kIHdlIGRvIGhhdmUKKwkJICogYW4gQVRBRyBsaXN0IGFyb3VuZCwgd2Ugd2FudCB0aGUgbGF0ZXIgdG8gYmUgdHJhbnNsYXRlZAorCQkgKiBhbmQgZm9sZGVkIGludG8gdGhlIGZvcm1lciBoZXJlLiAgVG8gYmUgb24gdGhlIHNhZmUgc2lkZSwKKwkJICogbGV0J3MgdGVtcG9yYXJpbHkgbW92ZSAgdGhlIHN0YWNrIGF3YXkgaW50byB0aGUgbWFsbG9jCisJCSAqIGFyZWEuICBObyBHT1QgZml4dXAgaGFzIG9jY3VycmVkIHlldCwgYnV0IG5vbmUgb2YgdGhlCisJCSAqIGNvZGUgd2UncmUgYWJvdXQgdG8gY2FsbCB1c2VzIGFueSBnbG9iYWwgdmFyaWFibGUuCisJCSovCisJCWFkZAlzcCwgc3AsICMweDEwMDAwCisJCXN0bWZkCXNwISwge3IwLXIzLCBpcCwgbHJ9CisJCW1vdglyMCwgcjgKKwkJbW92CXIxLCByNgorCQlzdWIJcjIsIHNwLCByNgorCQlibAlhdGFnc190b19mZHQKKworCQkvKgorCQkgKiBJZiByZXR1cm5lZCB2YWx1ZSBpcyAxLCB0aGVyZSBpcyBubyBBVEFHIGF0IHRoZSBsb2NhdGlvbgorCQkgKiBwb2ludGVkIGJ5IHI4LiAgVHJ5IHRoZSB0eXBpY2FsIDB4MTAwIG9mZnNldCBmcm9tIHN0YXJ0CisJCSAqIG9mIFJBTSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisJCSAqLworCQljbXAJcjAsICMxCisJCXN1YglyMCwgcjQsICNURVhUX09GRlNFVAorCQlhZGQJcjAsIHIwLCAjMHgxMDAKKwkJbW92CXIxLCByNgorCQlzdWIJcjIsIHNwLCByNgorCQlibG5lCWF0YWdzX3RvX2ZkdAorCisJCWxkbWZkCXNwISwge3IwLXIzLCBpcCwgbHJ9CisJCXN1YglzcCwgc3AsICMweDEwMDAwCisjZW5kaWYKKworCQltb3YJcjgsIHI2CQkJQCB1c2UgdGhlIGFwcGVuZGVkIGRldmljZSB0cmVlCisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoYXQgdGhlIERUQiBkb2Vzbid0IGVuZCB1cCBpbiB0aGUgZmluYWwKKwkJICoga2VybmVsJ3MgLmJzcyBhcmVhLiBUbyBkbyBzbywgd2UgYWRqdXN0IHRoZSBkZWNvbXByZXNzZWQKKwkJICoga2VybmVsIHNpemUgdG8gY29tcGVuc2F0ZSBpZiB0aGF0IC5ic3Mgc2l6ZSBpcyBsYXJnZXIKKwkJICogdGhhbiB0aGUgcmVsb2NhdGVkIGNvZGUuCisJCSAqLworCQlsZHIJcjUsID1fa2VybmVsX2Jzc19zaXplCisJCWFkcglyMSwgd29udF9vdmVyd3JpdGUKKwkJc3ViCXIxLCByNiwgcjEKKwkJc3VicwlyMSwgcjUsIHIxCisJCWFkZGhpCXI5LCByOSwgcjEKKworCQkvKiBHZXQgdGhlIGR0YidzIHNpemUgKi8KKwkJbGRyCXI1LCBbcjYsICM0XQorI2lmbmRlZiBfX0FSTUVCX18KKwkJLyogY29udmVydCByNSAoZHRiIHNpemUpIHRvIGxpdHRsZSBlbmRpYW4gKi8KKwkJZW9yCXIxLCByNSwgcjUsIHJvciAjMTYKKwkJYmljCXIxLCByMSwgIzB4MDBmZjAwMDAKKwkJbW92CXI1LCByNSwgcm9yICM4CisJCWVvcglyNSwgcjUsIHIxLCBsc3IgIzgKKyNlbmRpZgorCisJCS8qIHByZXNlcnZlIDY0LWJpdCBhbGlnbm1lbnQgKi8KKwkJYWRkCXI1LCByNSwgIzcKKwkJYmljCXI1LCByNSwgIzcKKworCQkvKiByZWxvY2F0ZSBzb21lIHBvaW50ZXJzIHBhc3QgdGhlIGFwcGVuZGVkIGR0YiAqLworCQlhZGQJcjYsIHI2LCByNQorCQlhZGQJcjEwLCByMTAsIHI1CisJCWFkZAlzcCwgc3AsIHI1CitkdGJfY2hlY2tfZG9uZToKKyNlbmRpZgorCiAvKgogICogQ2hlY2sgdG8gc2VlIGlmIHdlIHdpbGwgb3ZlcndyaXRlIG91cnNlbHZlcy4KICAqICAgcjQgID0gZmluYWwga2VybmVsIGFkZHJlc3MKQEAgLTIyMywxNSArMzIxLDE0IEBACiAgKiAgIHIxMCA9IGVuZCBvZiB0aGlzIGltYWdlLCBpbmNsdWRpbmcgIGJzcy9zdGFjay9tYWxsb2Mgc3BhY2UgaWYgbm9uIFhJUAogICogV2UgYmFzaWNhbGx5IHdhbnQ6CiAgKiAgIHI0IC0gMTZrIHBhZ2UgZGlyZWN0b3J5ID49IHIxMCAtPiBPSwotICogICByNCArIGltYWdlIGxlbmd0aCA8PSBjdXJyZW50IHBvc2l0aW9uIChwYykgLT4gT0sKKyAqICAgcjQgKyBpbWFnZSBsZW5ndGggPD0gYWRkcmVzcyBvZiB3b250X292ZXJ3cml0ZSAtPiBPSwogICovCiAJCWFkZAlyMTAsIHIxMCwgIzE2Mzg0CiAJCWNtcAlyNCwgcjEwCiAJCWJocwl3b250X292ZXJ3cml0ZQogCQlhZGQJcjEwLCByNCwgcjkKLSAgIEFSTSgJCWNtcAlyMTAsIHBjCQkpCi0gVEhVTUIoCQltb3YJbHIsIHBjCQkpCi0gVEhVTUIoCQljbXAJcjEwLCBscgkJKQorCQlhZHIJcjksIHdvbnRfb3ZlcndyaXRlCisJCWNtcAlyMTAsIHI5CiAJCWJscwl3b250X292ZXJ3cml0ZQogCiAvKgpAQCAtMjg1LDE0ICszODIsMTYgQEAKICAqICAgcjIgID0gQlNTIHN0YXJ0CiAgKiAgIHIzICA9IEJTUyBlbmQKICAqICAgcjQgID0ga2VybmVsIGV4ZWN1dGlvbiBhZGRyZXNzCisgKiAgIHI1ICA9IGFwcGVuZGVkIGR0YiBzaXplICgwIGlmIG5vdCBwcmVzZW50KQogICogICByNyAgPSBhcmNoaXRlY3R1cmUgSUQKICAqICAgcjggID0gYXRhZ3MgcG9pbnRlcgogICogICByMTEgPSBHT1Qgc3RhcnQKICAqICAgcjEyID0gR09UIGVuZAogICogICBzcCAgPSBzdGFjayBwb2ludGVyCiAgKi8KLQkJdGVxCXIwLCAjMAorCQlvcnJzCXIxLCByMCwgcjUKIAkJYmVxCW5vdF9yZWxvY2F0ZWQKKwogCQlhZGQJcjExLCByMTEsIHIwCiAJCWFkZAlyMTIsIHIxMiwgcjAKIApAQCAtMzA3LDEyICs0MDYsMjEgQEAKIAogCQkvKgogCQkgKiBSZWxvY2F0ZSBhbGwgZW50cmllcyBpbiB0aGUgR09UIHRhYmxlLgorCQkgKiBCdW1wIGJzcyBlbnRyaWVzIHRvIF9lZGF0YSArIGR0YiBzaXplCiAJCSAqLwogMToJCWxkcglyMSwgW3IxMSwgIzBdCQlAIHJlbG9jYXRlIGVudHJpZXMgaW4gdGhlIEdPVAotCQlhZGQJcjEsIHIxLCByMAkJQCB0YWJsZS4gIFRoaXMgZml4ZXMgdXAgdGhlCi0JCXN0cglyMSwgW3IxMV0sICM0CQlAIEMgcmVmZXJlbmNlcy4KKwkJYWRkCXIxLCByMSwgcjAJCUAgVGhpcyBmaXhlcyB1cCBDIHJlZmVyZW5jZXMKKwkJY21wCXIxLCByMgkJCUAgaWYgZW50cnkgPj0gYnNzX3N0YXJ0ICYmCisJCWNtcGhzCXIzLCByMQkJCUAgICAgICAgYnNzX2VuZCA+IGVudHJ5CisJCWFkZGhpCXIxLCByMSwgcjUJCUAgICAgZW50cnkgKz0gZHRiIHNpemUKKwkJc3RyCXIxLCBbcjExXSwgIzQJCUAgbmV4dCBlbnRyeQogCQljbXAJcjExLCByMTIKIAkJYmxvCTFiCisKKwkJLyogYnVtcCBvdXIgYnNzIHBvaW50ZXJzIHRvbyAqLworCQlhZGQJcjIsIHIyLCByNQorCQlhZGQJcjMsIHIzLCByNQorCiAjZWxzZQogCiAJCS8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvbGliZmR0X2Vudi5oIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2xpYmZkdF9lbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjRlNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2xpYmZkdF9lbnYuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9BUk1fTElCRkRUX0VOVl9ICisjZGVmaW5lIF9BUk1fTElCRkRUX0VOVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2RlZmluZSBmZHQxNl90b19jcHUoeCkJCWJlMTZfdG9fY3B1KHgpCisjZGVmaW5lIGNwdV90b19mZHQxNih4KQkJY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgZmR0MzJfdG9fY3B1KHgpCQliZTMyX3RvX2NwdSh4KQorI2RlZmluZSBjcHVfdG9fZmR0MzIoeCkJCWNwdV90b19iZTMyKHgpCisjZGVmaW5lIGZkdDY0X3RvX2NwdSh4KQkJYmU2NF90b19jcHUoeCkKKyNkZWZpbmUgY3B1X3RvX2ZkdDY0KHgpCQljcHVfdG9fYmU2NCh4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvbWlzYy5jCmluZGV4IDgzMmQzNzIuLjhlMmE4ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtMTgsMTQgKzE4LDkgQEAKIAogdW5zaWduZWQgaW50IF9fbWFjaGluZV9hcmNoX3R5cGU7CiAKLSNkZWZpbmUgX0xJTlVYX1NUUklOR19IXwotCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4JLyogZm9yIGlubGluZSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIGZvciBzaXplX3QgKi8KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogZm9yIE5VTEwgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vc3RyaW5nLmg+Ci0KIAogc3RhdGljIHZvaWQgcHV0c3RyKGNvbnN0IGNoYXIgKnB0cik7CiBleHRlcm4gdm9pZCBlcnJvcihjaGFyICp4KTsKQEAgLTEwMSw0MSArOTYsNiBAQAogCWZsdXNoKCk7CiB9CiAKLQotdm9pZCAqbWVtY3B5KHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbikKLXsKLQlpbnQgaSA9IDA7Ci0JdW5zaWduZWQgY2hhciAqZCA9ICh1bnNpZ25lZCBjaGFyICopX19kZXN0LCAqcyA9ICh1bnNpZ25lZCBjaGFyICopX19zcmM7Ci0KLQlmb3IgKGkgPSBfX24gPj4gMzsgaSA+IDA7IGktLSkgewotCQkqZCsrID0gKnMrKzsKLQkJKmQrKyA9ICpzKys7Ci0JCSpkKysgPSAqcysrOwotCQkqZCsrID0gKnMrKzsKLQkJKmQrKyA9ICpzKys7Ci0JCSpkKysgPSAqcysrOwotCQkqZCsrID0gKnMrKzsKLQkJKmQrKyA9ICpzKys7Ci0JfQotCi0JaWYgKF9fbiAmIDEgPDwgMikgewotCQkqZCsrID0gKnMrKzsKLQkJKmQrKyA9ICpzKys7Ci0JCSpkKysgPSAqcysrOwotCQkqZCsrID0gKnMrKzsKLQl9Ci0KLQlpZiAoX19uICYgMSA8PCAxKSB7Ci0JCSpkKysgPSAqcysrOwotCQkqZCsrID0gKnMrKzsKLQl9Ci0KLQlpZiAoX19uICYgMSkKLQkJKmQrKyA9ICpzKys7Ci0KLQlyZXR1cm4gX19kZXN0OwotfQotCiAvKgogICogZ3ppcCBkZWNsYXJhdGlvbnMKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3N0cmluZy5jIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZTUzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBhcmNoL2FybS9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKKyAqCisgKiBTbWFsbCBzdWJzZXQgb2Ygc2ltcGxlIHN0cmluZyByb3V0aW5lcworICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKwordm9pZCAqbWVtY3B5KHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbikKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgY2hhciAqZCA9ICh1bnNpZ25lZCBjaGFyICopX19kZXN0LCAqcyA9ICh1bnNpZ25lZCBjaGFyICopX19zcmM7CisKKwlmb3IgKGkgPSBfX24gPj4gMzsgaSA+IDA7IGktLSkgeworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJfQorCisJaWYgKF9fbiAmIDEgPDwgMikgeworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwl9CisKKwlpZiAoX19uICYgMSA8PCAxKSB7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwl9CisKKwlpZiAoX19uICYgMSkKKwkJKmQrKyA9ICpzKys7CisKKwlyZXR1cm4gX19kZXN0OworfQorCit2b2lkICptZW1tb3ZlKHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgKmQgPSBfX2Rlc3Q7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcyA9IF9fc3JjOworCisJaWYgKF9fZGVzdCA9PSBfX3NyYykKKwkJcmV0dXJuIF9fZGVzdDsKKworCWlmIChfX2Rlc3QgPCBfX3NyYykKKwkJcmV0dXJuIG1lbWNweShfX2Rlc3QsIF9fc3JjLCBjb3VudCk7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJZFtjb3VudF0gPSBzW2NvdW50XTsKKwlyZXR1cm4gX19kZXN0OworfQorCitzaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKnMpCit7CisJY29uc3QgY2hhciAqc2MgPSBzOworCisJd2hpbGUgKCpzYyAhPSAnXDAnKQorCQlzYysrOworCXJldHVybiBzYyAtIHM7Cit9CisKK2ludCBtZW1jbXAoY29uc3Qgdm9pZCAqY3MsIGNvbnN0IHZvaWQgKmN0LCBzaXplX3QgY291bnQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3UxID0gY3MsICpzdTIgPSBjdCwgKmVuZCA9IHN1MSArIGNvdW50OworCWludCByZXMgPSAwOworCisJd2hpbGUgKHN1MSA8IGVuZCkgeworCQlyZXMgPSAqc3UxKysgLSAqc3UyKys7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJlczsKK30KKworaW50IHN0cmNtcChjb25zdCBjaGFyICpjcywgY29uc3QgY2hhciAqY3QpCit7CisJdW5zaWduZWQgY2hhciBjMSwgYzI7CisJaW50IHJlcyA9IDA7CisKKwlkbyB7CisJCWMxID0gKmNzKys7CisJCWMyID0gKmN0Kys7CisJCXJlcyA9IGMxIC0gYzI7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwl9IHdoaWxlIChjMSk7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCAqbWVtY2hyKGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3QgY291bnQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHM7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJaWYgKCh1bnNpZ25lZCBjaGFyKWMgPT0gKnArKykKKwkJCXJldHVybiAodm9pZCAqKShwIC0gMSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKnN0cmNocihjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKwl3aGlsZSAoKnMgIT0gKGNoYXIpYykKKwkJaWYgKCpzKysgPT0gJ1wwJykKKwkJCXJldHVybiBOVUxMOworCXJldHVybiAoY2hhciAqKXM7Cit9CisKKyN1bmRlZiBtZW1zZXQKKwordm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3QgY291bnQpCit7CisJY2hhciAqeHMgPSBzOworCXdoaWxlIChjb3VudC0tKQorCQkqeHMrKyA9IGM7CisJcmV0dXJuIHM7Cit9CisKK3ZvaWQgX19tZW16ZXJvKHZvaWQgKnMsIHNpemVfdCBjb3VudCkKK3sKKwltZW1zZXQocywgMCwgY291bnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLmluIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLmluCmluZGV4IDRlNzI4ODMuLjQ5MTlmMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4Lmxkcy5pbgorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuaW4KQEAgLTUxLDYgKzUxLDEwIEBACiAgIF9nb3Rfc3RhcnQgPSAuOwogICAuZ290CQkJOiB7ICooLmdvdCkgfQogICBfZ290X2VuZCA9IC47CisKKyAgLyogZW5zdXJlIHRoZSB6SW1hZ2UgZmlsZSBzaXplIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDY0IGJpdHMgKi8KKyAgLyogKHdpdGhvdXQgYSBkdW1teSBieXRlLCBsZCBqdXN0IGlnbm9yZXMgdGhlIGVtcHR5IHNlY3Rpb24pICovCisgIC5wYWQJCQk6IHsgQllURSgwKTsgLiA9IEFMSUdOKDgpOyB9CiAgIF9lZGF0YSA9IC47CiAKICAgLiA9IEJTU19TVEFSVDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05ZzIwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOWcyMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWYwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOWcyMC5kdHNpCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogYXQ5MXNhbTlnMjAuZHRzaSAtIERldmljZSBUcmVlIEluY2x1ZGUgZmlsZSBmb3IgQVQ5MVNBTTlHMjAgZmFtaWx5IFNvQworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgQXRtZWwsCisgKiAgICAgICAgICAgICAgICAyMDExIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPiwKKyAqICAgICAgICAgICAgICAgIDIwMTEgSmVhbi1DaHJpc3RvcGhlIFBMQUdOSU9MLVZJTExBUkQgPHBsYWduaW9qQGpjcm9zb2Z0LmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworCisvaW5jbHVkZS8gInNrZWxldG9uLmR0c2kiCisKKy8geworCW1vZGVsID0gIkF0bWVsIEFUOTFTQU05RzIwIGZhbWlseSBTb0MiOworCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTlnMjAiOworCWludGVycnVwdC1wYXJlbnQgPSA8JmFpYz47CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZkYmd1OworCQlzZXJpYWwxID0gJnVzYXJ0MDsKKwkJc2VyaWFsMiA9ICZ1c2FydDE7CisJCXNlcmlhbDMgPSAmdXNhcnQyOworCQlzZXJpYWw0ID0gJnVzYXJ0MzsKKwkJc2VyaWFsNSA9ICZ1c2FydDQ7CisJCXNlcmlhbDYgPSAmdXNhcnQ1OworCX07CisJY3B1cyB7CisJCWNwdUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGFybTkyNmVqcyI7CisJCX07CisJfTsKKworCW1lbW9yeUAyMDAwMDAwMCB7CisJCXJlZyA9IDwweDIwMDAwMDAwIDB4MDgwMDAwMDA+OworCX07CisKKwlhaGIgeworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKworCQlhcGIgeworCQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXM7CisKKwkJCWFpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJAZmZmZmYwMDAgeworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxcm05MjAwLWFpYyI7CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJaW50ZXJydXB0LXBhcmVudDsKKwkJCQlyZWcgPSA8MHhmZmZmZjAwMCAweDIwMD47CisJCQl9OworCisJCQlkYmd1OiBzZXJpYWxAZmZmZmYyMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZmZmMjAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDE+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2FydDA6IHNlcmlhbEBmZmZiMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC11c2FydCI7CisJCQkJcmVnID0gPDB4ZmZmYjAwMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8Nj47CisJCQkJYXRtZWwsdXNlLWRtYS1yeDsKKwkJCQlhdG1lbCx1c2UtZG1hLXR4OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2FydDE6IHNlcmlhbEBmZmZiNDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC11c2FydCI7CisJCQkJcmVnID0gPDB4ZmZmYjQwMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8Nz47CisJCQkJYXRtZWwsdXNlLWRtYS1yeDsKKwkJCQlhdG1lbCx1c2UtZG1hLXR4OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2FydDI6IHNlcmlhbEBmZmZiODAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC11c2FydCI7CisJCQkJcmVnID0gPDB4ZmZmYjgwMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8OD47CisJCQkJYXRtZWwsdXNlLWRtYS1yeDsKKwkJCQlhdG1lbCx1c2UtZG1hLXR4OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2FydDM6IHNlcmlhbEBmZmZkMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC11c2FydCI7CisJCQkJcmVnID0gPDB4ZmZmZDAwMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8MjM+OworCQkJCWF0bWVsLHVzZS1kbWEtcng7CisJCQkJYXRtZWwsdXNlLWRtYS10eDsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQ0OiBzZXJpYWxAZmZmZDQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZmQ0MDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDI0PjsKKwkJCQlhdG1lbCx1c2UtZG1hLXJ4OworCQkJCWF0bWVsLHVzZS1kbWEtdHg7CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXVzYXJ0NTogc2VyaWFsQGZmZmQ4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05MjYwLXVzYXJ0IjsKKwkJCQlyZWcgPSA8MHhmZmZkODAwMCAweDIwMD47CisJCQkJaW50ZXJydXB0cyA9IDwyNT47CisJCQkJYXRtZWwsdXNlLWRtYS1yeDsKKwkJCQlhdG1lbCx1c2UtZG1hLXR4OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTlnNDUuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05ZzQ1LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2YTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05ZzQ1LmR0c2kKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBhdDkxc2FtOWc0NS5kdHNpIC0gRGV2aWNlIFRyZWUgSW5jbHVkZSBmaWxlIGZvciBBVDkxU0FNOUc0NSBmYW1pbHkgU29DCisgKiAgICAgICAgICAgICAgICAgICAgYXBwbGllcyB0byBBVDkxU0FNOUc0NSwgQVQ5MVNBTTlNMTAsCisgKiAgICAgICAgICAgICAgICAgICAgQVQ5MVNBTTlHNDYsIEFUOTFTQU05TTExIFNvQworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgQXRtZWwsCisgKiAgICAgICAgICAgICAgICAyMDExIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKy9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKKworLyB7CisJbW9kZWwgPSAiQXRtZWwgQVQ5MVNBTTlHNDUgZmFtaWx5IFNvQyI7CisJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOWc0NSI7CisJaW50ZXJydXB0LXBhcmVudCA9IDwmYWljPjsKKworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJmRiZ3U7CisJCXNlcmlhbDEgPSAmdXNhcnQwOworCQlzZXJpYWwyID0gJnVzYXJ0MTsKKwkJc2VyaWFsMyA9ICZ1c2FydDI7CisJCXNlcmlhbDQgPSAmdXNhcnQzOworCX07CisJY3B1cyB7CisJCWNwdUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGFybTkyNmVqcyI7CisJCX07CisJfTsKKworCW1lbW9yeUA3MDAwMDAwMCB7CisJCXJlZyA9IDwweDcwMDAwMDAwIDB4MTAwMDAwMDA+OworCX07CisKKwlhaGIgeworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKworCQlhcGIgeworCQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXM7CisKKwkJCWFpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJAZmZmZmYwMDAgeworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxcm05MjAwLWFpYyI7CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJaW50ZXJydXB0LXBhcmVudDsKKwkJCQlyZWcgPSA8MHhmZmZmZjAwMCAweDIwMD47CisJCQl9OworCisJCQlkbWE6IGRtYS1jb250cm9sbGVyQGZmZmZlYzAwIHsKKwkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05ZzQ1LWRtYSI7CisJCQkJcmVnID0gPDB4ZmZmZmVjMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8MjE+OworCQkJfTsKKworCQkJZGJndTogc2VyaWFsQGZmZmZlZTAwIHsKKwkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05MjYwLXVzYXJ0IjsKKwkJCQlyZWcgPSA8MHhmZmZmZWUwMCAweDIwMD47CisJCQkJaW50ZXJydXB0cyA9IDwxPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQwOiBzZXJpYWxAZmZmOGMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZjhjMDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc+OworCQkJCWF0bWVsLHVzZS1kbWEtcng7CisJCQkJYXRtZWwsdXNlLWRtYS10eDsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQxOiBzZXJpYWxAZmZmOTAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZjkwMDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg+OworCQkJCWF0bWVsLHVzZS1kbWEtcng7CisJCQkJYXRtZWwsdXNlLWRtYS10eDsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQyOiBzZXJpYWxAZmZmOTQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZjk0MDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDk+OworCQkJCWF0bWVsLHVzZS1kbWEtcng7CisJCQkJYXRtZWwsdXNlLWRtYS10eDsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQzOiBzZXJpYWxAZmZmOTgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZjk4MDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEwPjsKKwkJCQlhdG1lbCx1c2UtZG1hLXJ4OworCQkJCWF0bWVsLHVzZS1kbWEtdHg7CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOW0xMGc0NWVrLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05bTEwZzQ1ZWsuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjM0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOW0xMGc0NWVrLmR0cwpAQCAtMCwwICsxLDM1IEBACisvKgorICogYXQ5MXNhbTltMTBnNDVlay5kdHMgLSBEZXZpY2UgVHJlZSBmaWxlIGZvciBBVDkxU0FNOU0xMEc0NS1FSyBib2FyZAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgQXRtZWwsCisgKiAgICAgICAgICAgICAgICAyMDExIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisvZHRzLXYxLzsKKy9pbmNsdWRlLyAiYXQ5MXNhbTlnNDUuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiQXRtZWwgQVQ5MVNBTTlNMTBHNDUtRUsiOworCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTltMTBnNDVlayIsICJhdG1lbCxhdDkxc2FtOWc0NSIsICJhdG1lbCxhdDkxc2FtOSI7CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJtZW09NjRNIGNvbnNvbGU9dHR5UzAsMTE1MjAwIG10ZHBhcnRzPWF0bWVsX25hbmQ6NE0oYm9vdHN0cmFwL3Vib290L2tlcm5lbClybyw2ME0ocm9vdGZzKSwtKGRhdGEpIHJvb3Q9L2Rldi9tdGRibG9jazEgcncgcm9vdGZzdHlwZT1qZmZzMiI7CisJfTsKKworCW1lbW9yeUA3MDAwMDAwMCB7CisJCXJlZyA9IDwweDcwMDAwMDAwIDB4NDAwMDAwMD47CisJfTsKKworCWFoYiB7CisJCWFwYiB7CisJCQlkYmd1OiBzZXJpYWxAZmZmZmVlMDAgeworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCXVzYXJ0MTogc2VyaWFsQGZmZjkwMDAwIHsKKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaGlnaGJhbmsuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaGlnaGJhbmsuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYjFhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9oaWdoYmFuay5kdHMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBDYWx4ZWRhLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvZHRzLXYxLzsKKworLyogRmlyc3QgNEtCIGhhcyBwZW4gZm9yIHNlY29uZGFyeSBjb3Jlcy4gKi8KKy9tZW1yZXNlcnZlLyAweDAwMDAwMDAwIDB4MDAwMTAwMDsKKworLyB7CisJbW9kZWwgPSAiQ2FseGVkYSBIaWdoYmFuayI7CisJY29tcGF0aWJsZSA9ICJjYWx4ZWRhLGhpZ2hiYW5rIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1QDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE5IjsKKwkJCXJlZyA9IDwwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKworCQljcHVAMSB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQkJcmVnID0gPDE+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCisJCWNwdUAyIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOSI7CisJCQlyZWcgPSA8Mj47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisKKwkJY3B1QDMgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE5IjsKKwkJCXJlZyA9IDwzPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJbmFtZSA9ICJtZW1vcnkiOworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHgwMDAwMDAwMCAweGZmOTAwMDAwPjsKKwl9OworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiY29uc29sZT10dHlBTUEwIjsKKwl9OworCisJc29jIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpbnRjPjsKKwkJcmFuZ2VzOworCisJCXRpbWVyQGZmZjEwNjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHNtcC10d2QiOworCQkJcmVnID0gPDB4ZmZmMTA2MDAgMHgyMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmMDQ+OworCQl9OworCisJCXdhdGNoZG9nQGZmZjEwNjIwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS13ZHQiOworCQkJcmVnID0gPDB4ZmZmMTA2MjAgMHgyMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTQgMHhmMDQ+OworCQl9OworCisJCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQGZmZjExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCWludGVycnVwdC1wYXJlbnQ7CisJCQlyZWcgPSA8MHhmZmYxMTAwMCAweDEwMDA+LAorCQkJICAgICAgPDB4ZmZmMTAxMDAgMHgxMDA+OworCQl9OworCisJCUwyOiBsMi1jYWNoZSB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDMxMC1jYWNoZSI7CisJCQlyZWcgPSA8MHhmZmYxMjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDcwIDQ+OworCQkJY2FjaGUtdW5pZmllZDsKKwkJCWNhY2hlLWxldmVsID0gPDI+OworCQl9OworCisJCXBtdSB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTktcG11IjsKKwkJCWludGVycnVwdHMgPSA8MCA3NiA0ICAwIDc1IDQgIDAgNzQgNCAgMCA3MyA0PjsKKwkJfTsKKworCQlzYXRhQGZmZTA4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2FseGVkYSxoYi1haGNpIjsKKwkJCXJlZyA9IDwweGZmZTA4MDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDgzIDQ+OworCQl9OworCisJCXNkaGNpQGZmZTBlMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2FseGVkYSxoYi1zZGhjaSI7CisJCQlyZWcgPSA8MHhmZmUwZTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDkwIDQ+OworCQl9OworCisJCWlwY0BmZmYyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDMyMCIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweGZmZjIwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgNyA0PjsKKwkJfTsKKworCQlncGlvZTogZ3Bpb0BmZmYzMDAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJcmVnID0gPDB4ZmZmMzAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxNCA0PjsKKwkJfTsKKworCQlncGlvZjogZ3Bpb0BmZmYzMTAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJcmVnID0gPDB4ZmZmMzEwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxNSA0PjsKKwkJfTsKKworCQlncGlvZzogZ3Bpb0BmZmYzMjAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJcmVnID0gPDB4ZmZmMzIwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxNiA0PjsKKwkJfTsKKworCQlncGlvaDogZ3Bpb0BmZmYzMzAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJcmVnID0gPDB4ZmZmMzMwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxNyA0PjsKKwkJfTsKKworCQl0aW1lciB7CisJCQljb21wYXRpYmxlID0gImFybSxzcDgwNCIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweGZmZjM0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgMTggND47CisJCX07CisKKwkJcnRjQGZmZjM1MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDMxIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4ZmZmMzUwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxOSA0PjsKKwkJfTsKKworCQlzZXJpYWxAZmZmMzYwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwMTEiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHhmZmYzNjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDIwIDQ+OworCQl9OworCisJCXNtaWNAZmZmM2EwMDAgeworCQkJY29tcGF0aWJsZSA9ICJpcG1pLXNtaWMiOworCQkJZGV2aWNlX3R5cGUgPSAiaXBtaSI7CisJCQlyZWcgPSA8MHhmZmYzYTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDI0IDQ+OworCQkJcmVnLXNpemUgPSA8ND47CisJCQlyZWctc3BhY2luZyA9IDw0PjsKKwkJfTsKKworCQlzcmVnc0BmZmYzYzAwMCB7CisJCQljb21wYXRpYmxlID0gImNhbHhlZGEsaGItc3JlZ3MiOworCQkJcmVnID0gPDB4ZmZmM2MwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlkbWFAZmZmM2QwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwzMzAiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHhmZmYzZDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDkyIDQ+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS1iYWJiYWdlLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODc2NmFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKy9kdHMtdjEvOworL2luY2x1ZGUvICJpbXg1MS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJGcmVlc2NhbGUgaS5NWDUxIEJhYmJhZ2UgQm9hcmQiOworCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWJhYmJhZ2UiLCAiZnNsLGlteDUxIjsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gImNvbnNvbGU9dHR5bXhjMCwxMTUyMDAgcm9vdD0vZGV2L21tY2JsazBwMyByb290d2FpdCI7CisJfTsKKworCW1lbW9yeSB7CisJCXJlZyA9IDwweDkwMDAwMDAwIDB4MjAwMDAwMDA+OworCX07CisKKwlzb2MgeworCQlhaXBzQDcwMDAwMDAwIHsgLyogYWlwcy0xICovCisJCQlzcGJhQDcwMDAwMDAwIHsKKwkJCQllc2RoY0A3MDAwNDAwMCB7IC8qIEVTREhDMSAqLworCQkJCQlmc2wsY2QtaW50ZXJuYWw7CisJCQkJCWZzbCx3cC1pbnRlcm5hbDsKKwkJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJCX07CisKKwkJCQllc2RoY0A3MDAwODAwMCB7IC8qIEVTREhDMiAqLworCQkJCQljZC1ncGlvcyA9IDwmZ3BpbzAgNiAwPjsgLyogR1BJTzFfNiAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzAgNSAwPjsgLyogR1BJTzFfNSAqLworCQkJCQlzdGF0dXMgPSAib2theSI7CisJCQkJfTsKKworCQkJCXVhcnQyOiB1YXJ0QDcwMDBjMDAwIHsgLyogVUFSVDMgKi8KKwkJCQkJZnNsLHVhcnQtaGFzLXJ0c2N0czsKKwkJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJCX07CisKKwkJCQllY3NwaUA3MDAxMDAwMCB7IC8qIEVDU1BJMSAqLworCQkJCQlmc2wsc3BpLW51bS1jaGlwc2VsZWN0cyA9IDwyPjsKKwkJCQkJY3MtZ3Bpb3MgPSA8JmdwaW8zIDI0IDA+LCAvKiBHUElPNF8yNCAqLworCQkJCQkJICAgPCZncGlvMyAyNSAwPjsgLyogR1BJTzRfMjUgKi8KKwkJCQkJc3RhdHVzID0gIm9rYXkiOworCisJCQkJCXBtaWM6IG1jMTM4OTJAMCB7CisJCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsbWMxMzg5MiI7CisJCQkJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw2MDAwMDAwPjsKKwkJCQkJCXJlZyA9IDwwPjsKKwkJCQkJCW1jMTN4eHgtaXJxLWdwaW9zID0gPCZncGlvMCA4IDA+OyAvKiBHUElPMV84ICovCisJCQkJCQlmc2wsbWMxM3h4eC11c2VzLXJlZ3VsYXRvcjsKKwkJCQkJfTsKKworCQkJCQlmbGFzaDogYXQ0NWRiMzIxZEAxIHsKKwkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0NDVkYjMyMWQiLCAiYXRtZWwsYXQ0NSIsICJhdG1lbCxkYXRhZmxhc2giOworCQkJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MjUwMDAwMDA+OworCQkJCQkJcmVnID0gPDE+OworCisJCQkJCQlwYXJ0aXRpb25AMCB7CisJCQkJCQkJbGFiZWwgPSAiVS1Cb290IjsKKwkJCQkJCQlyZWcgPSA8MHgwIDB4NDAwMDA+OworCQkJCQkJCXJlYWQtb25seTsKKwkJCQkJCX07CisKKwkJCQkJCXBhcnRpdGlvbkA0MDAwMCB7CisJCQkJCQkJbGFiZWwgPSAiS2VybmVsIjsKKwkJCQkJCQlyZWcgPSA8MHg0MDAwMCAweDNjMDAwMD47CisJCQkJCQl9OworCQkJCQl9OworCQkJCX07CisJCQl9OworCisJCQl3ZG9nQDczZjk4MDAwIHsgLyogV0RPRzEgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCisJCQlpb211eGNANzNmYTgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWlvbXV4Yy1iYWJiYWdlIjsKKwkJCQlyZWcgPSA8MHg3M2ZhODAwMCAweDQwMDA+OworCQkJfTsKKworCQkJdWFydDA6IHVhcnRANzNmYmMwMDAgeworCQkJCWZzbCx1YXJ0LWhhcy1ydHNjdHM7CisJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJfTsKKworCQkJdWFydDE6IHVhcnRANzNmYzAwMDAgeworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisKKwkJYWlwc0A4MDAwMDAwMCB7CS8qIGFpcHMtMiAqLworCQkJc2RtYUA4M2ZiMDAwMCB7CisJCQkJZnNsLHNkbWEtcmFtLXNjcmlwdC1uYW1lID0gImlteC9zZG1hL3NkbWEtaW14NTEuYmluIjsKKwkJCX07CisKKwkJCWkyY0A4M2ZjNDAwMCB7IC8qIEkyQzIgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisKKwkJCQljb2RlYzogc2d0bDUwMDBAMGEgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZ3RsNTAwMCI7CisJCQkJCXJlZyA9IDwweDBhPjsKKwkJCQl9OworCQkJfTsKKworCQkJZmVjQDgzZmVjMDAwIHsKKwkJCQlwaHktbW9kZSA9ICJtaWkiOworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisJfTsKKworCWdwaW8ta2V5cyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1rZXlzIjsKKworCQlwb3dlciB7CisJCQlsYWJlbCA9ICJQb3dlciBCdXR0b24iOworCQkJZ3Bpb3MgPSA8JmdwaW8xIDIxIDA+OworCQkJbGludXgsY29kZSA9IDwxMTY+OyAvKiBLRVlfUE9XRVIgKi8KKwkJCWdwaW8ta2V5LHdha2V1cDsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2FiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS5kdHNpCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisvaW5jbHVkZS8gInNrZWxldG9uLmR0c2kiCisKKy8geworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJnVhcnQwOworCQlzZXJpYWwxID0gJnVhcnQxOworCQlzZXJpYWwyID0gJnVhcnQyOworCX07CisKKwl0emljOiB0ei1pbnRlcnJ1cHQtY29udHJvbGxlckBlMDAwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLXR6aWMiLCAiZnNsLHR6aWMiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4ZTAwMDAwMDAgMHg0MDAwPjsKKwl9OworCisJY2xvY2tzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCWNraWwgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWNraWwiLCAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDMyNzY4PjsKKwkJfTsKKworCQlja2loMSB7CisJCQljb21wYXRpYmxlID0gImZzbCxpbXgtY2tpaDEiLCAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIyNTc5MjAwPjsKKwkJfTsKKworCQlja2loMiB7CisJCQljb21wYXRpYmxlID0gImZzbCxpbXgtY2tpaDIiLCAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQl9OworCisJCW9zYyB7CisJCQljb21wYXRpYmxlID0gImZzbCxpbXgtb3NjIiwgImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyNDAwMDAwMD47CisJCX07CisJfTsKKworCXNvYyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmdHppYz47CisJCXJhbmdlczsKKworCQlhaXBzQDcwMDAwMDAwIHsgLyogQUlQUzEgKi8KKwkJCWNvbXBhdGlibGUgPSAiZnNsLGFpcHMtYnVzIiwgInNpbXBsZS1idXMiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDcwMDAwMDAwIDB4MTAwMDAwMDA+OworCQkJcmFuZ2VzOworCisJCQlzcGJhQDcwMDAwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzcGJhLWJ1cyIsICJzaW1wbGUtYnVzIjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQlyZWcgPSA8MHg3MDAwMDAwMCAweDQwMDAwPjsKKwkJCQlyYW5nZXM7CisKKwkJCQllc2RoY0A3MDAwNDAwMCB7IC8qIEVTREhDMSAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1lc2RoYyI7CisJCQkJCXJlZyA9IDwweDcwMDA0MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8MT47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKworCQkJCWVzZGhjQDcwMDA4MDAwIHsgLyogRVNESEMyICovCisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWVzZGhjIjsKKwkJCQkJcmVnID0gPDB4NzAwMDgwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwyPjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJdWFydDI6IHVhcnRANzAwMGMwMDAgeyAvKiBVQVJUMyAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS11YXJ0IiwgImZzbCxpbXgyMS11YXJ0IjsKKwkJCQkJcmVnID0gPDB4NzAwMGMwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwzMz47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKworCQkJCWVjc3BpQDcwMDEwMDAwIHsgLyogRUNTUEkxICovCisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZWNzcGkiOworCQkJCQlyZWcgPSA8MHg3MDAxMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDM2PjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZXNkaGNANzAwMjAwMDAgeyAvKiBFU0RIQzMgKi8KKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZXNkaGMiOworCQkJCQlyZWcgPSA8MHg3MDAyMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDM+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllc2RoY0A3MDAyNDAwMCB7IC8qIEVTREhDNCAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1lc2RoYyI7CisJCQkJCXJlZyA9IDwweDcwMDI0MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8ND47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKwkJCX07CisKKwkJCWdwaW8wOiBncGlvQDczZjg0MDAwIHsgLyogR1BJTzEgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg3M2Y4NDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTAgNTE+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzE6IGdwaW9ANzNmODgwMDAgeyAvKiBHUElPMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDczZjg4MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw1MiA1Mz47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvMjogZ3Bpb0A3M2Y4YzAwMCB7IC8qIEdQSU8zICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4NzNmOGMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU0IDU1PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWdwaW8zOiBncGlvQDczZjkwMDAwIHsgLyogR1BJTzQgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg3M2Y5MDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTYgNTc+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJd2RvZ0A3M2Y5ODAwMCB7IC8qIFdET0cxICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtd2R0IiwgImZzbCxpbXgyMS13ZHQiOworCQkJCXJlZyA9IDwweDczZjk4MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw1OD47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXdkb2dANzNmOWMwMDAgeyAvKiBXRE9HMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLXdkdCIsICJmc2wsaW14MjEtd2R0IjsKKwkJCQlyZWcgPSA8MHg3M2Y5YzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTk+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1YXJ0MDogdWFydEA3M2ZiYzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4NzNmYmMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMxPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdWFydDE6IHVhcnRANzNmYzAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLXVhcnQiLCAiZnNsLGlteDIxLXVhcnQiOworCQkJCXJlZyA9IDwweDczZmMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwzMj47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisJCX07CisKKwkJYWlwc0A4MDAwMDAwMCB7CS8qIEFJUFMyICovCisJCQljb21wYXRpYmxlID0gImZzbCxhaXBzLWJ1cyIsICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MDAwMDAwMCAweDEwMDAwMDAwPjsKKwkJCXJhbmdlczsKKworCQkJZWNzcGlAODNmYWMwMDAgeyAvKiBFQ1NQSTIgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1lY3NwaSI7CisJCQkJcmVnID0gPDB4ODNmYWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM3PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJc2RtYUA4M2ZiMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtc2RtYSIsICJmc2wsaW14MzUtc2RtYSI7CisJCQkJcmVnID0gPDB4ODNmYjAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDY+OworCQkJfTsKKworCQkJY3NwaUA4M2ZjMDAwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtY3NwaSIsICJmc2wsaW14MzUtY3NwaSI7CisJCQkJcmVnID0gPDB4ODNmYzAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM4PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJaTJjQDgzZmM0MDAwIHsgLyogSTJDMiAqLworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWkyYyIsICJmc2wsaW14MS1pMmMiOworCQkJCXJlZyA9IDwweDgzZmM0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw2Mz47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCWkyY0A4M2ZjODAwMCB7IC8qIEkyQzEgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwkJCQlyZWcgPSA8MHg4M2ZjODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NjI+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQlmZWNAODNmZWMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWZlYyIsICJmc2wsaW14MjctZmVjIjsKKwkJCQlyZWcgPSA8MHg4M2ZlYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8ODc+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtYXJkLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLWFyZC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiN2Y4MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLWFyZC5kdHMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKy9kdHMtdjEvOworL2luY2x1ZGUvICJpbXg1My5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJGcmVlc2NhbGUgaS5NWDUzIEF1dG9tb3RpdmUgUmVmZXJlbmNlIERlc2lnbiBCb2FyZCI7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtYXJkIiwgImZzbCxpbXg1MyI7CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9tbWNibGswcDMgcm9vdHdhaXQiOworCX07CisKKwltZW1vcnkgeworCQlyZWcgPSA8MHg3MDAwMDAwMCAweDQwMDAwMDAwPjsKKwl9OworCisJc29jIHsKKwkJYWlwc0A1MDAwMDAwMCB7IC8qIEFJUFMxICovCisJCQlzcGJhQDUwMDAwMDAwIHsKKwkJCQllc2RoY0A1MDAwNDAwMCB7IC8qIEVTREhDMSAqLworCQkJCQljZC1ncGlvcyA9IDwmZ3BpbzAgMSAwPjsgLyogR1BJTzFfMSAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzAgOSAwPjsgLyogR1BJTzFfOSAqLworCQkJCQlzdGF0dXMgPSAib2theSI7CisJCQkJfTsKKwkJCX07CisKKwkJCXdkb2dANTNmOTgwMDAgeyAvKiBXRE9HMSAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCWlvbXV4Y0A1M2ZhODAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtaW9tdXhjLWFyZCI7CisJCQkJcmVnID0gPDB4NTNmYTgwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCXVhcnQwOiB1YXJ0QDUzZmJjMDAwIHsgLyogVUFSVDEgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCisJCWFpcHNANjAwMDAwMDAgewkvKiBBSVBTMiAqLworCQkJc2RtYUA2M2ZiMDAwMCB7CisJCQkJZnNsLHNkbWEtcmFtLXNjcmlwdC1uYW1lID0gImlteC9zZG1hL3NkbWEtaW14NTMuYmluIjsKKwkJCX07CisJCX07CisJfTsKKworCWVpbS1jczFAZjQwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLGVpbS1idXMiLCAic2ltcGxlLWJ1cyI7CisJCXJlZyA9IDwweGY0MDAwMDAwIDB4M2ZmMDAwMD47CisJCXJhbmdlczsKKworCQlsYW45MjIwQGY0MDAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic21zYyxsYW45MjIwIiwgInNtc2MsbGFuOTExNSI7CisJCQlyZWcgPSA8MHhmNDAwMDAwMCAweDIwMDAwMDA+OworCQkJcGh5LW1vZGUgPSAibWlpIjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8xPjsKKwkJCWludGVycnVwdHMgPSA8MzE+OworCQkJcmVnLWlvLXdpZHRoID0gPDQ+OworCQkJc21zYyxpcnEtcHVzaC1wdWxsOworCQl9OworCX07CisKKwlncGlvLWtleXMgeworCQljb21wYXRpYmxlID0gImdwaW8ta2V5cyI7CisKKwkJaG9tZSB7CisJCQlsYWJlbCA9ICJIb21lIjsKKwkJCWdwaW9zID0gPCZncGlvNCAxMCAwPjsgLyogR1BJTzVfMTAgKi8KKwkJCWxpbnV4LGNvZGUgPSA8MTAyPjsgLyogS0VZX0hPTUUgKi8KKwkJCWdwaW8ta2V5LHdha2V1cDsKKwkJfTsKKworCQliYWNrIHsKKwkJCWxhYmVsID0gIkJhY2siOworCQkJZ3Bpb3MgPSA8JmdwaW80IDExIDA+OyAvKiBHUElPNV8xMSAqLworCQkJbGludXgsY29kZSA9IDwxNTg+OyAvKiBLRVlfQkFDSyAqLworCQkJZ3Bpby1rZXksd2FrZXVwOworCQl9OworCisJCXByb2dyYW0geworCQkJbGFiZWwgPSAiUHJvZ3JhbSI7CisJCQlncGlvcyA9IDwmZ3BpbzQgMTIgMD47IC8qIEdQSU81XzEyICovCisJCQlsaW51eCxjb2RlID0gPDM2Mj47IC8qIEtFWV9QUk9HUkFNICovCisJCQlncGlvLWtleSx3YWtldXA7CisJCX07CisKKwkJdm9sdW1lLXVwIHsKKwkJCWxhYmVsID0gIlZvbHVtZSBVcCI7CisJCQlncGlvcyA9IDwmZ3BpbzQgMTMgMD47IC8qIEdQSU81XzEzICovCisJCQlsaW51eCxjb2RlID0gPDExNT47IC8qIEtFWV9WT0xVTUVVUCAqLworCQl9OworCisJCXZvbHVtZS1kb3duIHsKKwkJCWxhYmVsID0gIlZvbHVtZSBEb3duIjsKKwkJCWdwaW9zID0gPCZncGlvMyAwIDA+OyAvKiBHUElPNF8wICovCisJCQlsaW51eCxjb2RlID0gPDExND47IC8qIEtFWV9WT0xVTUVET1dOICovCisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My1ldmsuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtZXZrLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjNhODgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtZXZrLmR0cwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworL2R0cy12MS87CisvaW5jbHVkZS8gImlteDUzLmR0c2kiCisKKy8geworCW1vZGVsID0gIkZyZWVzY2FsZSBpLk1YNTMgRXZhbHVhdGlvbiBLaXQiOworCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWV2ayIsICJmc2wsaW14NTMiOworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiY29uc29sZT10dHlteGMwLDExNTIwMCByb290PS9kZXYvbW1jYmxrMHAzIHJvb3R3YWl0IjsKKwl9OworCisJbWVtb3J5IHsKKwkJcmVnID0gPDB4NzAwMDAwMDAgMHg4MDAwMDAwMD47CisJfTsKKworCXNvYyB7CisJCWFpcHNANTAwMDAwMDAgeyAvKiBBSVBTMSAqLworCQkJc3BiYUA1MDAwMDAwMCB7CisJCQkJZXNkaGNANTAwMDQwMDAgeyAvKiBFU0RIQzEgKi8KKwkJCQkJY2QtZ3Bpb3MgPSA8JmdwaW8yIDEzIDA+OyAvKiBHUElPM18xMyAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzIgMTQgMD47IC8qIEdQSU8zXzE0ICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCisJCQkJZWNzcGlANTAwMTAwMDAgeyAvKiBFQ1NQSTEgKi8KKwkJCQkJZnNsLHNwaS1udW0tY2hpcHNlbGVjdHMgPSA8Mj47CisJCQkJCWNzLWdwaW9zID0gPCZncGlvMSAzMCAwPiwgLyogR1BJTzJfMzAgKi8KKwkJCQkJCSAgIDwmZ3BpbzIgMTkgMD47IC8qIEdQSU8zXzE5ICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKworCQkJCQlmbGFzaDogYXQ0NWRiMzIxZEAxIHsKKwkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0NDVkYjMyMWQiLCAiYXRtZWwsYXQ0NSIsICJhdG1lbCxkYXRhZmxhc2giOworCQkJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MjUwMDAwMDA+OworCQkJCQkJcmVnID0gPDE+OworCisJCQkJCQlwYXJ0aXRpb25AMCB7CisJCQkJCQkJbGFiZWwgPSAiVS1Cb290IjsKKwkJCQkJCQlyZWcgPSA8MHgwIDB4NDAwMDA+OworCQkJCQkJCXJlYWQtb25seTsKKwkJCQkJCX07CisKKwkJCQkJCXBhcnRpdGlvbkA0MDAwMCB7CisJCQkJCQkJbGFiZWwgPSAiS2VybmVsIjsKKwkJCQkJCQlyZWcgPSA8MHg0MDAwMCAweDNjMDAwMD47CisJCQkJCQl9OworCQkJCQl9OworCQkJCX07CisKKwkJCQllc2RoY0A1MDAyMDAwMCB7IC8qIEVTREhDMyAqLworCQkJCQljZC1ncGlvcyA9IDwmZ3BpbzIgMTEgMD47IC8qIEdQSU8zXzExICovCisJCQkJCXdwLWdwaW9zID0gPCZncGlvMiAxMiAwPjsgLyogR1BJTzNfMTIgKi8KKwkJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJCX07CisJCQl9OworCisJCQl3ZG9nQDUzZjk4MDAwIHsgLyogV0RPRzEgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCisJCQlpb211eGNANTNmYTgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWlvbXV4Yy1ldmsiOworCQkJCXJlZyA9IDwweDUzZmE4MDAwIDB4NDAwMD47CisJCQl9OworCisJCQl1YXJ0MDogdWFydEA1M2ZiYzAwMCB7IC8qIFVBUlQxICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJfTsKKwkJfTsKKworCQlhaXBzQDYwMDAwMDAwIHsJLyogQUlQUzIgKi8KKwkJCXNkbWFANjNmYjAwMDAgeworCQkJCWZzbCxzZG1hLXJhbS1zY3JpcHQtbmFtZSA9ICJpbXgvc2RtYS9zZG1hLWlteDUzLmJpbiI7CisJCQl9OworCisJCQlpMmNANjNmYzQwMDAgeyAvKiBJMkMyICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCisJCQkJcG1pYzogbWMxMzg5MkAwOCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1jMTM4OTIiLCAiZnNsLG1jMTN4eHgiOworCQkJCQlyZWcgPSA8MHgwOD47CisJCQkJfTsKKworCQkJCWNvZGVjOiBzZ3RsNTAwMEAwYSB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNndGw1MDAwIjsKKwkJCQkJcmVnID0gPDB4MGE+OworCQkJCX07CisJCQl9OworCisJCQlmZWNANjNmZWMwMDAgeworCQkJCXBoeS1tb2RlID0gInJtaWkiOworCQkJCXBoeS1yZXNldC1ncGlvcyA9IDwmZ3BpbzYgNiAwPjsgLyogR1BJTzdfNiAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisJfTsKKworCWxlZHMgeworCQljb21wYXRpYmxlID0gImdwaW8tbGVkcyI7CisKKwkJZ3JlZW4geworCQkJbGFiZWwgPSAiSGVhcnRiZWF0IjsKKwkJCWdwaW9zID0gPCZncGlvNiA3IDA+OyAvKiBHUElPN183ICovCisJCQlsaW51eCxkZWZhdWx0LXRyaWdnZXIgPSAiaGVhcnRiZWF0IjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLXFzYi5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1xc2IuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNmRlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1xc2IuZHRzCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisvZHRzLXYxLzsKKy9pbmNsdWRlLyAiaW14NTMuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiRnJlZXNjYWxlIGkuTVg1MyBRdWljayBTdGFydCBCb2FyZCI7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtcXNiIiwgImZzbCxpbXg1MyI7CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9tbWNibGswcDMgcm9vdHdhaXQiOworCX07CisKKwltZW1vcnkgeworCQlyZWcgPSA8MHg3MDAwMDAwMCAweDQwMDAwMDAwPjsKKwl9OworCisJc29jIHsKKwkJYWlwc0A1MDAwMDAwMCB7IC8qIEFJUFMxICovCisJCQlzcGJhQDUwMDAwMDAwIHsKKwkJCQllc2RoY0A1MDAwNDAwMCB7IC8qIEVTREhDMSAqLworCQkJCQljZC1ncGlvcyA9IDwmZ3BpbzIgMTMgMD47IC8qIEdQSU8zXzEzICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMjAwMDAgeyAvKiBFU0RIQzMgKi8KKwkJCQkJY2QtZ3Bpb3MgPSA8JmdwaW8yIDExIDA+OyAvKiBHUElPM18xMSAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzIgMTIgMD47IC8qIEdQSU8zXzEyICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCQkJfTsKKworCQkJd2RvZ0A1M2Y5ODAwMCB7IC8qIFdET0cxICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJfTsKKworCQkJaW9tdXhjQDUzZmE4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1pb211eGMtcXNiIjsKKwkJCQlyZWcgPSA8MHg1M2ZhODAwMCAweDQwMDA+OworCQkJfTsKKworCQkJdWFydDA6IHVhcnRANTNmYmMwMDAgeyAvKiBVQVJUMSAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisKKwkJYWlwc0A2MDAwMDAwMCB7CS8qIEFJUFMyICovCisJCQlzZG1hQDYzZmIwMDAwIHsKKwkJCQlmc2wsc2RtYS1yYW0tc2NyaXB0LW5hbWUgPSAiaW14L3NkbWEvc2RtYS1pbXg1My5iaW4iOworCQkJfTsKKworCQkJaTJjQDYzZmM0MDAwIHsgLyogSTJDMiAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKworCQkJCWNvZGVjOiBzZ3RsNTAwMEAwYSB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNndGw1MDAwIjsKKwkJCQkJcmVnID0gPDB4MGE+OworCQkJCX07CisJCQl9OworCisJCQlpMmNANjNmYzgwMDAgeyAvKiBJMkMxICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCisJCQkJYWNjZWxlcm9tZXRlcjogbW1hODQ1MEAxYyB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1tYTg0NTAiOworCQkJCQlyZWcgPSA8MHgxYz47CisJCQkJfTsKKworCQkJCXBtaWM6IGRpYWxvZ0A0OCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZGlhbG9nLGRhOTA1MyIsICJkaWFsb2csZGE5MDUyIjsKKwkJCQkJcmVnID0gPDB4NDg+OworCQkJCX07CisJCQl9OworCisJCQlmZWNANjNmZWMwMDAgeworCQkJCXBoeS1tb2RlID0gInJtaWkiOworCQkJCXBoeS1yZXNldC1ncGlvcyA9IDwmZ3BpbzYgNiAwPjsgLyogR1BJTzdfNiAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisJfTsKKworCWdwaW8ta2V5cyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1rZXlzIjsKKworCQlwb3dlciB7CisJCQlsYWJlbCA9ICJQb3dlciBCdXR0b24iOworCQkJZ3Bpb3MgPSA8JmdwaW8wIDggMD47IC8qIEdQSU8xXzggKi8KKwkJCWxpbnV4LGNvZGUgPSA8MTE2PjsgLyogS0VZX1BPV0VSICovCisJCQlncGlvLWtleSx3YWtldXA7CisJCX07CisKKwkJdm9sdW1lLXVwIHsKKwkJCWxhYmVsID0gIlZvbHVtZSBVcCI7CisJCQlncGlvcyA9IDwmZ3BpbzEgMTQgMD47IC8qIEdQSU8yXzE0ICovCisJCQlsaW51eCxjb2RlID0gPDExNT47IC8qIEtFWV9WT0xVTUVVUCAqLworCQl9OworCisJCXZvbHVtZS1kb3duIHsKKwkJCWxhYmVsID0gIlZvbHVtZSBEb3duIjsKKwkJCWdwaW9zID0gPCZncGlvMSAxNSAwPjsgLyogR1BJTzJfMTUgKi8KKwkJCWxpbnV4LGNvZGUgPSA8MTE0PjsgLyogS0VZX1ZPTFVNRURPV04gKi8KKwkJfTsKKwl9OworCisJbGVkcyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1sZWRzIjsKKworCQl1c2VyIHsKKwkJCWxhYmVsID0gIkhlYXJ0YmVhdCI7CisJCQlncGlvcyA9IDwmZ3BpbzYgNyAwPjsgLyogR1BJTzdfNyAqLworCQkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gImhlYXJ0YmVhdCI7CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My1zbWQuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtc21kLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWMwNjJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtc21kLmR0cwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworL2R0cy12MS87CisvaW5jbHVkZS8gImlteDUzLmR0c2kiCisKKy8geworCW1vZGVsID0gIkZyZWVzY2FsZSBpLk1YNTMgU21hcnQgTW9iaWxlIFJlZmVyZW5jZSBEZXNpZ24gQm9hcmQiOworCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXNtZCIsICJmc2wsaW14NTMiOworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiY29uc29sZT10dHlteGMwLDExNTIwMCByb290PS9kZXYvbW1jYmxrMHAzIHJvb3R3YWl0IjsKKwl9OworCisJbWVtb3J5IHsKKwkJcmVnID0gPDB4NzAwMDAwMDAgMHg0MDAwMDAwMD47CisJfTsKKworCXNvYyB7CisJCWFpcHNANTAwMDAwMDAgeyAvKiBBSVBTMSAqLworCQkJc3BiYUA1MDAwMDAwMCB7CisJCQkJZXNkaGNANTAwMDQwMDAgeyAvKiBFU0RIQzEgKi8KKwkJCQkJY2QtZ3Bpb3MgPSA8JmdwaW8yIDEzIDA+OyAvKiBHUElPM18xMyAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzMgMTEgMD47IC8qIEdQSU80XzExICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMDgwMDAgeyAvKiBFU0RIQzIgKi8KKwkJCQkJZnNsLGNhcmQtd2lyZWQ7CisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCisJCQkJdWFydDI6IHVhcnRANTAwMGMwMDAgeyAvKiBVQVJUMyAqLworCQkJCQlmc2wsdWFydC1oYXMtcnRzY3RzOworCQkJCQlzdGF0dXMgPSAib2theSI7CisJCQkJfTsKKworCQkJCWVjc3BpQDUwMDEwMDAwIHsgLyogRUNTUEkxICovCisJCQkJCWZzbCxzcGktbnVtLWNoaXBzZWxlY3RzID0gPDI+OworCQkJCQljcy1ncGlvcyA9IDwmZ3BpbzEgMzAgMD4sIC8qIEdQSU8yXzMwICovCisJCQkJCQkgICA8JmdwaW8yIDE5IDA+OyAvKiBHUElPM18xOSAqLworCQkJCQlzdGF0dXMgPSAib2theSI7CisKKwkJCQkJemlnYmVlOiBtYzEzMjNAMCB7CisJCQkJCQljb21wYXRpYmxlID0gImZzbCxtYzEzMjMiOworCQkJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8ODAwMDAwMD47CisJCQkJCQlyZWcgPSA8MD47CisJCQkJCX07CisKKwkJCQkJZmxhc2g6IG0yNXAzMkAxIHsKKwkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCQljb21wYXRpYmxlID0gInN0LG0yNXAzMiIsICJzdCxtMjVwIjsKKwkJCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDIwMDAwMDAwPjsKKwkJCQkJCXJlZyA9IDwxPjsKKworCQkJCQkJcGFydGl0aW9uQDAgeworCQkJCQkJCWxhYmVsID0gIlUtQm9vdCI7CisJCQkJCQkJcmVnID0gPDB4MCAweDQwMDAwPjsKKwkJCQkJCQlyZWFkLW9ubHk7CisJCQkJCQl9OworCisJCQkJCQlwYXJ0aXRpb25ANDAwMDAgeworCQkJCQkJCWxhYmVsID0gIktlcm5lbCI7CisJCQkJCQkJcmVnID0gPDB4NDAwMDAgMHgzYzAwMDA+OworCQkJCQkJfTsKKwkJCQkJfTsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMjAwMDAgeyAvKiBFU0RIQzMgKi8KKwkJCQkJZnNsLGNhcmQtd2lyZWQ7CisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCQkJfTsKKworCQkJd2RvZ0A1M2Y5ODAwMCB7IC8qIFdET0cxICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJfTsKKworCQkJaW9tdXhjQDUzZmE4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1pb211eGMtc21kIjsKKwkJCQlyZWcgPSA8MHg1M2ZhODAwMCAweDQwMDA+OworCQkJfTsKKworCQkJdWFydDA6IHVhcnRANTNmYmMwMDAgeyAvKiBVQVJUMSAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCXVhcnQxOiB1YXJ0QDUzZmMwMDAwIHsgLyogVUFSVDIgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCisJCWFpcHNANjAwMDAwMDAgewkvKiBBSVBTMiAqLworCQkJc2RtYUA2M2ZiMDAwMCB7CisJCQkJZnNsLHNkbWEtcmFtLXNjcmlwdC1uYW1lID0gImlteC9zZG1hL3NkbWEtaW14NTMuYmluIjsKKwkJCX07CisKKwkJCWkyY0A2M2ZjNDAwMCB7IC8qIEkyQzIgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisKKwkJCQljb2RlYzogc2d0bDUwMDBAMGEgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZ3RsNTAwMCI7CisJCQkJCXJlZyA9IDwweDBhPjsKKwkJCQl9OworCisJCQkJbWFnbmV0b21ldGVyOiBtYWczMTEwQDBlIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsbWFnMzExMCI7CisJCQkJCXJlZyA9IDwweDBlPjsKKwkJCQl9OworCisJCQkJdG91Y2hrZXk6IG1wcjEyMUA1YSB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wcjEyMSI7CisJCQkJCXJlZyA9IDwweDVhPjsKKwkJCQl9OworCQkJfTsKKworCQkJaTJjQDYzZmM4MDAwIHsgLyogSTJDMSAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKworCQkJCWFjY2VsZXJvbWV0ZXI6IG1tYTg0NTBAMWMgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxtbWE4NDUwIjsKKwkJCQkJcmVnID0gPDB4MWM+OworCQkJCX07CisKKwkJCQljYW1lcmE6IG92NTY0MkAzYyB7CisJCQkJCWNvbXBhdGlibGUgPSAib3Z0aSxvdjU2NDIiOworCQkJCQlyZWcgPSA8MHgzYz47CisJCQkJfTsKKworCQkJCXBtaWM6IGRpYWxvZ0A0OCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZGlhbG9nLGRhOTA1MyIsICJkaWFsb2csZGE5MDUyIjsKKwkJCQkJcmVnID0gPDB4NDg+OworCQkJCX07CisJCQl9OworCisJCQlmZWNANjNmZWMwMDAgeworCQkJCXBoeS1tb2RlID0gInJtaWkiOworCQkJCXBoeS1yZXNldC1ncGlvcyA9IDwmZ3BpbzYgNiAwPjsgLyogR1BJTzdfNiAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisJfTsKKworCWdwaW8ta2V5cyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1rZXlzIjsKKworCQl2b2x1bWUtdXAgeworCQkJbGFiZWwgPSAiVm9sdW1lIFVwIjsKKwkJCWdwaW9zID0gPCZncGlvMSAxNCAwPjsgLyogR1BJTzJfMTQgKi8KKwkJCWxpbnV4LGNvZGUgPSA8MTE1PjsgLyogS0VZX1ZPTFVNRVVQICovCisJCX07CisKKwkJdm9sdW1lLWRvd24geworCQkJbGFiZWwgPSAiVm9sdW1lIERvd24iOworCQkJZ3Bpb3MgPSA8JmdwaW8xIDE1IDA+OyAvKiBHUElPMl8xNSAqLworCQkJbGludXgsY29kZSA9IDwxMTQ+OyAvKiBLRVlfVk9MVU1FRE9XTiAqLworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5Y2Q4NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLmR0c2kKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKy9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKKworLyB7CisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmdWFydDA7CisJCXNlcmlhbDEgPSAmdWFydDE7CisJCXNlcmlhbDIgPSAmdWFydDI7CisJCXNlcmlhbDMgPSAmdWFydDM7CisJCXNlcmlhbDQgPSAmdWFydDQ7CisJfTsKKworCXR6aWM6IHR6LWludGVycnVwdC1jb250cm9sbGVyQDBmZmZjMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtdHppYyIsICJmc2wsdHppYyI7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHgwZmZmYzAwMCAweDQwMDA+OworCX07CisKKwljbG9ja3MgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY2tpbCB7CisJCQljb21wYXRpYmxlID0gImZzbCxpbXgtY2tpbCIsICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MzI3Njg+OworCQl9OworCisJCWNraWgxIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1ja2loMSIsICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MjI1NzkyMDA+OworCQl9OworCisJCWNraWgyIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1ja2loMiIsICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCX07CisKKwkJb3NjIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1vc2MiLCAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDI0MDAwMDAwPjsKKwkJfTsKKwl9OworCisJc29jIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ0emljPjsKKwkJcmFuZ2VzOworCisJCWFpcHNANTAwMDAwMDAgeyAvKiBBSVBTMSAqLworCQkJY29tcGF0aWJsZSA9ICJmc2wsYWlwcy1idXMiLCAic2ltcGxlLWJ1cyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4NTAwMDAwMDAgMHgxMDAwMDAwMD47CisJCQlyYW5nZXM7CisKKwkJCXNwYmFANTAwMDAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNwYmEtYnVzIiwgInNpbXBsZS1idXMiOworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCXJlZyA9IDwweDUwMDAwMDAwIDB4NDAwMDA+OworCQkJCXJhbmdlczsKKworCQkJCWVzZGhjQDUwMDA0MDAwIHsgLyogRVNESEMxICovCisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWVzZGhjIjsKKwkJCQkJcmVnID0gPDB4NTAwMDQwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwxPjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMDgwMDAgeyAvKiBFU0RIQzIgKi8KKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZXNkaGMiOworCQkJCQlyZWcgPSA8MHg1MDAwODAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDI+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQl1YXJ0MjogdWFydEA1MDAwYzAwMCB7IC8qIFVBUlQzICovCisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXVhcnQiLCAiZnNsLGlteDIxLXVhcnQiOworCQkJCQlyZWcgPSA8MHg1MDAwYzAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDMzPjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZWNzcGlANTAwMTAwMDAgeyAvKiBFQ1NQSTEgKi8KKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1lY3NwaSIsICJmc2wsaW14NTEtZWNzcGkiOworCQkJCQlyZWcgPSA8MHg1MDAxMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDM2PjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMjAwMDAgeyAvKiBFU0RIQzMgKi8KKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZXNkaGMiOworCQkJCQlyZWcgPSA8MHg1MDAyMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDM+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllc2RoY0A1MDAyNDAwMCB7IC8qIEVTREhDNCAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1lc2RoYyI7CisJCQkJCXJlZyA9IDwweDUwMDI0MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8ND47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKwkJCX07CisKKwkJCWdwaW8wOiBncGlvQDUzZjg0MDAwIHsgLyogR1BJTzEgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg1M2Y4NDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTAgNTE+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzE6IGdwaW9ANTNmODgwMDAgeyAvKiBHUElPMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDUzZjg4MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw1MiA1Mz47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvMjogZ3Bpb0A1M2Y4YzAwMCB7IC8qIEdQSU8zICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4NTNmOGMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU0IDU1PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWdwaW8zOiBncGlvQDUzZjkwMDAwIHsgLyogR1BJTzQgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg1M2Y5MDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTYgNTc+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJd2RvZ0A1M2Y5ODAwMCB7IC8qIFdET0cxICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtd2R0IiwgImZzbCxpbXgyMS13ZHQiOworCQkJCXJlZyA9IDwweDUzZjk4MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw1OD47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXdkb2dANTNmOWMwMDAgeyAvKiBXRE9HMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXdkdCIsICJmc2wsaW14MjEtd2R0IjsKKwkJCQlyZWcgPSA8MHg1M2Y5YzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTk+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1YXJ0MDogdWFydEA1M2ZiYzAwMCB7IC8qIFVBUlQxICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4NTNmYmMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMxPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdWFydDE6IHVhcnRANTNmYzAwMDAgeyAvKiBVQVJUMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXVhcnQiLCAiZnNsLGlteDIxLXVhcnQiOworCQkJCXJlZyA9IDwweDUzZmMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwzMj47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCWdwaW80OiBncGlvQDUzZmRjMDAwIHsgLyogR1BJTzUgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg1M2ZkYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MTAzIDEwND47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvNTogZ3Bpb0A1M2ZlMDAwMCB7IC8qIEdQSU82ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4NTNmZTAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEwNSAxMDY+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzY6IGdwaW9ANTNmZTQwMDAgeyAvKiBHUElPNyAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDUzZmU0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwxMDcgMTA4PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWkyY0A1M2ZlYzAwMCB7IC8qIEkyQzMgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwkJCQlyZWcgPSA8MHg1M2ZlYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NjQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1YXJ0MzogdWFydEA1M2ZmMDAwMCB7IC8qIFVBUlQ0ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4NTNmZjAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEzPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKwkJfTsKKworCQlhaXBzQDYwMDAwMDAwIHsJLyogQUlQUzIgKi8KKwkJCWNvbXBhdGlibGUgPSAiZnNsLGFpcHMtYnVzIiwgInNpbXBsZS1idXMiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDYwMDAwMDAwIDB4MTAwMDAwMDA+OworCQkJcmFuZ2VzOworCisJCQl1YXJ0NDogdWFydEA2M2Y5MDAwMCB7IC8qIFVBUlQ1ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4NjNmOTAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg2PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJZWNzcGlANjNmYWMwMDAgeyAvKiBFQ1NQSTIgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1lY3NwaSIsICJmc2wsaW14NTEtZWNzcGkiOworCQkJCXJlZyA9IDwweDYzZmFjMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwzNz47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXNkbWFANjNmYjAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXNkbWEiLCAiZnNsLGlteDM1LXNkbWEiOworCQkJCXJlZyA9IDwweDYzZmIwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw2PjsKKwkJCX07CisKKwkJCWNzcGlANjNmYzAwMDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWNzcGkiLCAiZnNsLGlteDM1LWNzcGkiOworCQkJCXJlZyA9IDwweDYzZmMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwzOD47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCWkyY0A2M2ZjNDAwMCB7IC8qIEkyQzIgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwkJCQlyZWcgPSA8MHg2M2ZjNDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NjM+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQlpMmNANjNmYzgwMDAgeyAvKiBJMkMxICovCisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtaTJjIiwgImZzbCxpbXgxLWkyYyI7CisJCQkJcmVnID0gPDB4NjNmYzgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDYyPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJZmVjQDYzZmVjMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1mZWMiLCAiZnNsLGlteDI1LWZlYyI7CisJCQkJcmVnID0gPDB4NjNmZWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg3PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxLXNhYnJlYXV0by5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cS1zYWJyZWF1dG8uZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Mjk3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cS1zYWJyZWF1dG8uZHRzCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKy9kdHMtdjEvOworL2luY2x1ZGUvICJpbXg2cS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJGcmVlc2NhbGUgaS5NWDYgUXVhZCBTQUJSRSBBdXRvbW90aXZlIEJvYXJkIjsKKwljb21wYXRpYmxlID0gImZzbCxpbXg2cS1zYWJyZWF1dG8iLCAiZnNsLGlteDZxIjsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gImNvbnNvbGU9dHR5bXhjMCwxMTUyMDAgcm9vdD0vZGV2L21tY2JsazNwMyByb290d2FpdCI7CisJfTsKKworCW1lbW9yeSB7CisJCXJlZyA9IDwweDEwMDAwMDAwIDB4ODAwMDAwMDA+OworCX07CisKKwlzb2MgeworCQlhaXBzLWJ1c0AwMjEwMDAwMCB7IC8qIEFJUFMyICovCisJCQllbmV0QDAyMTg4MDAwIHsKKwkJCQlwaHktbW9kZSA9ICJyZ21paSI7CisJCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbMDAgMDQgOUYgMDEgMUIgNjFdOworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCXVzZGhjQDAyMTk4MDAwIHsgLyogdVNESEMzICovCisJCQkJY2QtZ3Bpb3MgPSA8JmdwaW81IDExIDA+OyAvKiBHUElPNl8xMSAqLworCQkJCXdwLWdwaW9zID0gPCZncGlvNSAxNCAwPjsgLyogR1BJTzZfMTQgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCisJCQl1c2RoY0AwMjE5YzAwMCB7IC8qIHVTREhDNCAqLworCQkJCWZzbCxjYXJkLXdpcmVkOworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCXVhcnQzOiB1YXJ0QDAyMWYwMDAwIHsgLyogVUFSVDQgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCX07CisKKwlsZWRzIHsKKwkJY29tcGF0aWJsZSA9ICJncGlvLWxlZHMiOworCisJCWRlYnVnLWxlZCB7CisJCQlsYWJlbCA9ICJIZWFydGJlYXQiOworCQkJZ3Bpb3MgPSA8JmdwaW8yIDI1IDA+OyAvKiBHUElPM18yNSAqLworCQkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gImhlYXJ0YmVhdCI7CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGRhNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEuZHRzaQpAQCAtMCwwICsxLDU3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZ1YXJ0MDsKKwkJc2VyaWFsMSA9ICZ1YXJ0MTsKKwkJc2VyaWFsMiA9ICZ1YXJ0MjsKKwkJc2VyaWFsMyA9ICZ1YXJ0MzsKKwkJc2VyaWFsNCA9ICZ1YXJ0NDsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHVAMCB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQkJcmVnID0gPDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCisJCWNwdUAxIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOSI7CisJCQlyZWcgPSA8MT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisKKwkJY3B1QDIgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE5IjsKKwkJCXJlZyA9IDwyPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKworCQljcHVAMyB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQkJcmVnID0gPDM+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCX07CisKKwlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckAwMGEwMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQlyZWcgPSA8MHgwMGEwMTAwMCAweDEwMDA+LAorCQkgICAgICA8MHgwMGEwMDEwMCAweDEwMD47CisJfTsKKworCWNsb2NrcyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlja2lsIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1ja2lsIiwgImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMjc2OD47CisJCX07CisKKwkJY2tpaDEgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWNraWgxIiwgImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQlvc2MgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14LW9zYyIsICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MjQwMDAwMDA+OworCQl9OworCX07CisKKwlzb2MgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmludGM+OworCQlyYW5nZXM7CisKKwkJdGltZXJAMDBhMDA2MDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sc21wLXR3ZCI7CisJCQlyZWcgPSA8MHgwMGEwMDYwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmND47CisJCX07CisKKwkJTDI6IGwyLWNhY2hlQDAwYTAyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMzEwLWNhY2hlIjsKKwkJCXJlZyA9IDwweDAwYTAyMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgOTIgMHgwND47CisJCQljYWNoZS11bmlmaWVkOworCQkJY2FjaGUtbGV2ZWwgPSA8Mj47CisJCX07CisKKwkJYWlwcy1idXNAMDIwMDAwMDAgeyAvKiBBSVBTMSAqLworCQkJY29tcGF0aWJsZSA9ICJmc2wsYWlwcy1idXMiLCAic2ltcGxlLWJ1cyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4MDIwMDAwMDAgMHgxMDAwMDA+OworCQkJcmFuZ2VzOworCisJCQlzcGJhLWJ1c0AwMjAwMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc3BiYS1idXMiLCAic2ltcGxlLWJ1cyI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDB4MDIwMDAwMDAgMHg0MDAwMD47CisJCQkJcmFuZ2VzOworCisJCQkJc3BkaWZAMDIwMDQwMDAgeworCQkJCQlyZWcgPSA8MHgwMjAwNDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDAgNTIgMHgwND47CisJCQkJfTsKKworCQkJCWVjc3BpQDAyMDA4MDAwIHsgLyogZUNTUEkxICovCisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZWNzcGkiLCAiZnNsLGlteDUxLWVjc3BpIjsKKwkJCQkJcmVnID0gPDB4MDIwMDgwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDMxIDB4MDQ+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllY3NwaUAwMjAwYzAwMCB7IC8qIGVDU1BJMiAqLworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWVjc3BpIiwgImZzbCxpbXg1MS1lY3NwaSI7CisJCQkJCXJlZyA9IDwweDAyMDBjMDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8MCAzMiAweDA0PjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZWNzcGlAMDIwMTAwMDAgeyAvKiBlQ1NQSTMgKi8KKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1lY3NwaSIsICJmc2wsaW14NTEtZWNzcGkiOworCQkJCQlyZWcgPSA8MHgwMjAxMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDAgMzMgMHgwND47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKworCQkJCWVjc3BpQDAyMDE0MDAwIHsgLyogZUNTUEk0ICovCisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZWNzcGkiLCAiZnNsLGlteDUxLWVjc3BpIjsKKwkJCQkJcmVnID0gPDB4MDIwMTQwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDM0IDB4MDQ+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllY3NwaUAwMjAxODAwMCB7IC8qIGVDU1BJNSAqLworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWVjc3BpIiwgImZzbCxpbXg1MS1lY3NwaSI7CisJCQkJCXJlZyA9IDwweDAyMDE4MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8MCAzNSAweDA0PjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJdWFydDA6IHVhcnRAMDIwMjAwMDAgeyAvKiBVQVJUMSAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS11YXJ0IiwgImZzbCxpbXgyMS11YXJ0IjsKKwkJCQkJcmVnID0gPDB4MDIwMjAwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDI2IDB4MDQ+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllc2FpQDAyMDI0MDAwIHsKKwkJCQkJcmVnID0gPDB4MDIwMjQwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDUxIDB4MDQ+OworCQkJCX07CisKKwkJCQlzc2lAMDIwMjgwMDAgeyAvKiBTU0kxICovCisJCQkJCXJlZyA9IDwweDAyMDI4MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8MCA0NiAweDA0PjsKKwkJCQl9OworCisJCQkJc3NpQDAyMDJjMDAwIHsgLyogU1NJMiAqLworCQkJCQlyZWcgPSA8MHgwMjAyYzAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDAgNDcgMHgwND47CisJCQkJfTsKKworCQkJCXNzaUAwMjAzMDAwMCB7IC8qIFNTSTMgKi8KKwkJCQkJcmVnID0gPDB4MDIwMzAwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDQ4IDB4MDQ+OworCQkJCX07CisKKwkJCQlhc3JjQDAyMDM0MDAwIHsKKwkJCQkJcmVnID0gPDB4MDIwMzQwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDUwIDB4MDQ+OworCQkJCX07CisKKwkJCQlzcGJhQDAyMDNjMDAwIHsKKwkJCQkJcmVnID0gPDB4MDIwM2MwMDAgMHg0MDAwPjsKKwkJCQl9OworCQkJfTsKKworCQkJdnB1QDAyMDQwMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjA0MDAwMCAweDNjMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMyAweDA0IDAgMTIgMHgwND47CisJCQl9OworCisJCQlhaXBzdHpAMDIwN2MwMDAgeyAvKiBBSVBTVFoxICovCisJCQkJcmVnID0gPDB4MDIwN2MwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCXB3bUAwMjA4MDAwMCB7IC8qIFBXTTEgKi8KKwkJCQlyZWcgPSA8MHgwMjA4MDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4MyAweDA0PjsKKwkJCX07CisKKwkJCXB3bUAwMjA4NDAwMCB7IC8qIFBXTTIgKi8KKwkJCQlyZWcgPSA8MHgwMjA4NDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4NCAweDA0PjsKKwkJCX07CisKKwkJCXB3bUAwMjA4ODAwMCB7IC8qIFBXTTMgKi8KKwkJCQlyZWcgPSA8MHgwMjA4ODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4NSAweDA0PjsKKwkJCX07CisKKwkJCXB3bUAwMjA4YzAwMCB7IC8qIFBXTTQgKi8KKwkJCQlyZWcgPSA8MHgwMjA4YzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4NiAweDA0PjsKKwkJCX07CisKKwkJCWZsZXhjYW5AMDIwOTAwMDAgeyAvKiBDQU4xICovCisJCQkJcmVnID0gPDB4MDIwOTAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTEwIDB4MDQ+OworCQkJfTsKKworCQkJZmxleGNhbkAwMjA5NDAwMCB7IC8qIENBTjIgKi8KKwkJCQlyZWcgPSA8MHgwMjA5NDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAxMTEgMHgwND47CisJCQl9OworCisJCQlncHRAMDIwOTgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWdwdCI7CisJCQkJcmVnID0gPDB4MDIwOTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNTUgMHgwND47CisJCQl9OworCisJCQlncGlvMDogZ3Bpb0AwMjA5YzAwMCB7IC8qIEdQSU8xICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4MDIwOWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNjYgMHgwNCAwIDY3IDB4MDQ+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzE6IGdwaW9AMDIwYTAwMDAgeyAvKiBHUElPMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDAyMGEwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDY4IDB4MDQgMCA2OSAweDA0PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWdwaW8yOiBncGlvQDAyMGE0MDAwIHsgLyogR1BJTzMgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHgwMjBhNDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA3MCAweDA0IDAgNzEgMHgwND47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvMzogZ3Bpb0AwMjBhODAwMCB7IC8qIEdQSU80ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4MDIwYTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNzIgMHgwNCAwIDczIDB4MDQ+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzQ6IGdwaW9AMDIwYWMwMDAgeyAvKiBHUElPNSAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDAyMGFjMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDc0IDB4MDQgMCA3NSAweDA0PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWdwaW81OiBncGlvQDAyMGIwMDAwIHsgLyogR1BJTzYgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHgwMjBiMDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA3NiAweDA0IDAgNzcgMHgwND47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvNjogZ3Bpb0AwMjBiNDAwMCB7IC8qIEdQSU83ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4MDIwYjQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNzggMHgwNCAwIDc5IDB4MDQ+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJa3BwQDAyMGI4MDAwIHsKKwkJCQlyZWcgPSA8MHgwMjBiODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4MiAweDA0PjsKKwkJCX07CisKKwkJCXdkb2dAMDIwYmMwMDAgeyAvKiBXRE9HMSAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXdkdCIsICJmc2wsaW14MjEtd2R0IjsKKwkJCQlyZWcgPSA8MHgwMjBiYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4MCAweDA0PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJd2RvZ0AwMjBjMDAwMCB7IC8qIFdET0cyICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtd2R0IiwgImZzbCxpbXgyMS13ZHQiOworCQkJCXJlZyA9IDwweDAyMGMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDgxIDB4MDQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQljY21AMDIwYzQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWNjbSI7CisJCQkJcmVnID0gPDB4MDIwYzQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgODcgMHgwNCAwIDg4IDB4MDQ+OworCQkJfTsKKworCQkJYW5hdG9wQDAyMGM4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1hbmF0b3AiOworCQkJCXJlZyA9IDwweDAyMGM4MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDQ5IDB4MDQgMCA1NCAweDA0IDAgMTI3IDB4MDQ+OworCQkJfTsKKworCQkJdXNicGh5QDAyMGM5MDAwIHsgLyogVVNCUEhZMSAqLworCQkJCXJlZyA9IDwweDAyMGM5MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDQ0IDB4MDQ+OworCQkJfTsKKworCQkJdXNicGh5QDAyMGNhMDAwIHsgLyogVVNCUEhZMiAqLworCQkJCXJlZyA9IDwweDAyMGNhMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDQ1IDB4MDQ+OworCQkJfTsKKworCQkJc252c0AwMjBjYzAwMCB7CisJCQkJcmVnID0gPDB4MDIwY2MwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTkgMHgwNCAwIDIwIDB4MDQ+OworCQkJfTsKKworCQkJZXBpdEAwMjBkMDAwMCB7IC8qIEVQSVQxICovCisJCQkJcmVnID0gPDB4MDIwZDAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNTYgMHgwND47CisJCQl9OworCisJCQllcGl0QDAyMGQ0MDAwIHsgLyogRVBJVDIgKi8KKwkJCQlyZWcgPSA8MHgwMjBkNDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA1NyAweDA0PjsKKwkJCX07CisKKwkJCXNyY0AwMjBkODAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtc3JjIjsKKwkJCQlyZWcgPSA8MHgwMjBkODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA5MSAweDA0IDAgOTYgMHgwND47CisJCQl9OworCisJCQlncGNAMDIwZGMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWdwYyI7CisJCQkJcmVnID0gPDB4MDIwZGMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgODkgMHgwNCAwIDkwIDB4MDQ+OworCQkJfTsKKworCQkJaW9tdXhjQDAyMGUwMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjBlMDAwMCAweDQwMDA+OworCQkJfTsKKworCQkJZGNpY0AwMjBlNDAwMCB7IC8qIERDSUMxICovCisJCQkJcmVnID0gPDB4MDIwZTQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTI0IDB4MDQ+OworCQkJfTsKKworCQkJZGNpY0AwMjBlODAwMCB7IC8qIERDSUMyICovCisJCQkJcmVnID0gPDB4MDIwZTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTI1IDB4MDQ+OworCQkJfTsKKworCQkJc2RtYUAwMjBlYzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtc2RtYSIsICJmc2wsaW14MzUtc2RtYSI7CisJCQkJcmVnID0gPDB4MDIwZWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMiAweDA0PjsKKwkJCX07CisJCX07CisKKwkJYWlwcy1idXNAMDIxMDAwMDAgeyAvKiBBSVBTMiAqLworCQkJY29tcGF0aWJsZSA9ICJmc2wsYWlwcy1idXMiLCAic2ltcGxlLWJ1cyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4MDIxMDAwMDAgMHgxMDAwMDA+OworCQkJcmFuZ2VzOworCisJCQljYWFtQDAyMTAwMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjEwMDAwMCAweDQwMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTA1IDB4MDQgMCAxMDYgMHgwND47CisJCQl9OworCisJCQlhaXBzdHpAMDIxN2MwMDAgeyAvKiBBSVBTVFoyICovCisJCQkJcmVnID0gPDB4MDIxN2MwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCWVuZXRAMDIxODgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWZlYyI7CisJCQkJcmVnID0gPDB4MDIxODgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTE4IDB4MDQgMCAxMTkgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCW1sYkAwMjE4YzAwMCB7CisJCQkJcmVnID0gPDB4MDIxOGMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNTMgMHgwNCAwIDExNyAweDA0IDAgMTI2IDB4MDQ+OworCQkJfTsKKworCQkJdXNkaGNAMDIxOTAwMDAgeyAvKiB1U0RIQzEgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS11c2RoYyI7CisJCQkJcmVnID0gPDB4MDIxOTAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMjIgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXVzZGhjQDAyMTk0MDAwIHsgLyogdVNESEMyICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdXNkaGMiOworCQkJCXJlZyA9IDwweDAyMTk0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDIzIDB4MDQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2RoY0AwMjE5ODAwMCB7IC8qIHVTREhDMyAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVzZGhjIjsKKwkJCQlyZWcgPSA8MHgwMjE5ODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAyNCAweDA0PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNkaGNAMDIxOWMwMDAgeyAvKiB1U0RIQzQgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS11c2RoYyI7CisJCQkJcmVnID0gPDB4MDIxOWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMjUgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCWkyY0AwMjFhMDAwMCB7IC8qIEkyQzEgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwkJCQlyZWcgPSA8MHgwMjFhMDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAzNiAweDA0PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJaTJjQDAyMWE0MDAwIHsgLyogSTJDMiAqLworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWkyYyIsICJmc2wsaW14MS1pMmMiOworCQkJCXJlZyA9IDwweDAyMWE0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDM3IDB4MDQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQlpMmNAMDIxYTgwMDAgeyAvKiBJMkMzICovCisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtaTJjIiwgImZzbCxpbXgxLWkyYyI7CisJCQkJcmVnID0gPDB4MDIxYTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMzggMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXJvbWNwQDAyMWFjMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjFhYzAwMCAweDQwMDA+OworCQkJfTsKKworCQkJbW1kY0AwMjFiMDAwMCB7IC8qIE1NREMwICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtbW1kYyI7CisJCQkJcmVnID0gPDB4MDIxYjAwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCW1tZGNAMDIxYjQwMDAgeyAvKiBNTURDMSAqLworCQkJCXJlZyA9IDwweDAyMWI0MDAwIDB4NDAwMD47CisJCQl9OworCisJCQl3ZWltQDAyMWI4MDAwIHsKKwkJCQlyZWcgPSA8MHgwMjFiODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAxNCAweDA0PjsKKwkJCX07CisKKwkJCW9jb3RwQDAyMWJjMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjFiYzAwMCAweDQwMDA+OworCQkJfTsKKworCQkJb2NvdHBAMDIxYzAwMDAgeworCQkJCXJlZyA9IDwweDAyMWMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDIxIDB4MDQ+OworCQkJfTsKKworCQkJdHphc2NAMDIxZDAwMDAgeyAvKiBUWkFTQzEgKi8KKwkJCQlyZWcgPSA8MHgwMjFkMDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAxMDggMHgwND47CisJCQl9OworCisJCQl0emFzY0AwMjFkNDAwMCB7IC8qIFRaQVNDMiAqLworCQkJCXJlZyA9IDwweDAyMWQ0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDEwOSAweDA0PjsKKwkJCX07CisKKwkJCWF1ZG11eEAwMjFkODAwMCB7CisJCQkJcmVnID0gPDB4MDIxZDgwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCW1pcGlAMDIxZGMwMDAgeyAvKiBNSVBJLUNTSSAqLworCQkJCXJlZyA9IDwweDAyMWRjMDAwIDB4NDAwMD47CisJCQl9OworCisJCQltaXBpQDAyMWUwMDAwIHsgLyogTUlQSS1EU0kgKi8KKwkJCQlyZWcgPSA8MHgwMjFlMDAwMCAweDQwMDA+OworCQkJfTsKKworCQkJdmRvYUAwMjFlNDAwMCB7CisJCQkJcmVnID0gPDB4MDIxZTQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTggMHgwND47CisJCQl9OworCisJCQl1YXJ0MTogdWFydEAwMjFlODAwMCB7IC8qIFVBUlQyICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4MDIxZTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMjcgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXVhcnQyOiB1YXJ0QDAyMWVjMDAwIHsgLyogVUFSVDMgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS11YXJ0IiwgImZzbCxpbXgyMS11YXJ0IjsKKwkJCQlyZWcgPSA8MHgwMjFlYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAyOCAweDA0PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdWFydDM6IHVhcnRAMDIxZjAwMDAgeyAvKiBVQVJUNCAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVhcnQiLCAiZnNsLGlteDIxLXVhcnQiOworCQkJCXJlZyA9IDwweDAyMWYwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDI5IDB4MDQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1YXJ0NDogdWFydEAwMjFmNDAwMCB7IC8qIFVBUlQ1ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4MDIxZjQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMzAgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204NjYwLXN1cmYuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODY2MC1zdXJmLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRlZDBkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODY2MC1zdXJmLmR0cwpAQCAtMCwwICsxLDI0IEBACisvZHRzLXYxLzsKKworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBNU004NjYwIFNVUkYiOworCWNvbXBhdGlibGUgPSAicWNvbSxtc204NjYwLXN1cmYiLCAicWNvbSxtc204NjYwIjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpbnRjPjsKKworCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQDAyMDgwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS04NjYwLXFnaWMiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJcmVnID0gPCAweDAyMDgwMDAwIDB4MTAwMCA+LAorCQkgICAgICA8IDB4MDIwODEwMDAgMHgxMDAwID47CisJfTsKKworCXNlcmlhbEAxOWM0MDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWhzdWFydCIsICJxY29tLG1zbS11YXJ0IjsKKwkJcmVnID0gPDB4MTljNDAwMDAgMHgxMDAwPiwKKwkJICAgICAgPDB4MTljMDAwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxOTU+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtYmVhZ2xlLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLWJlYWdsZS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4NmJlNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLWJlYWdsZS5kdHMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisvZHRzLXYxLzsKKworL2luY2x1ZGUvICJvbWFwMy5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJUSSBPTUFQMyBCZWFnbGVCb2FyZCI7CisJY29tcGF0aWJsZSA9ICJ0aSxvbWFwMy1iZWFnbGUiLCAidGksb21hcDMiOworCisJLyoKKwkgKiBTaW5jZSB0aGUgaW5pdGlhbCBkZXZpY2UgdHJlZSBib2FyZCBmaWxlIGRvZXMgbm90IGNyZWF0ZSBhbnkKKwkgKiBkZXZpY2VzIChNTUMsIG5ldHdvcmsuLi4pLCB0aGUgb25seSB3YXkgdG8gYm9vdCBpcyB0byBwcm92aWRlIGEKKwkgKiByYW1kaXNrLgorCSAqLworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gInJvb3Q9L2Rldi9yYW0wIHJ3IGNvbnNvbGU9dHR5TzIsMTE1MjAwbjggaW5pdHJkPTB4ODE2MDAwMDAsMjBNIHJhbWRpc2tfc2l6ZT0yMDQ4MCBub19jb25zb2xlX3N1c3BlbmQgZGVidWcgZWFybHlwcmludGsiOworCX07CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHg4MDAwMDAwMCAweDIwMDAwMDAwPjsgLyogNTEyIE1CICovCisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9vbWFwMy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjAyYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMuZHRzaQpAQCAtMCwwICsxLDYzIEBACisvKgorICogRGV2aWNlIFRyZWUgU291cmNlIGZvciBPTUFQMyBTb0MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwljb21wYXRpYmxlID0gInRpLG9tYXAzNDMwIiwgInRpLG9tYXAzIjsKKworCWNwdXMgeworCQljcHVAMCB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTgiOworCQl9OworCX07CisKKwkvKgorCSAqIFRoZSBzb2Mgbm9kZSByZXByZXNlbnRzIHRoZSBzb2MgdG9wIGxldmVsIHZpZXcuIEl0IGlzIHVzZXMgZm9yIElQcworCSAqIHRoYXQgYXJlIG5vdCBtZW1vcnkgbWFwcGVkIGluIHRoZSBNUFUgdmlldyBvciBmb3IgdGhlIE1QVSBpdHNlbGYuCisJICovCisJc29jIHsKKwkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwLWluZnJhIjsKKwkJbXB1IHsKKwkJCWNvbXBhdGlibGUgPSAidGksb21hcDMtbXB1IjsKKwkJCXRpLGh3bW9kcyA9ICJtcHUiOworCQl9OworCisJCWl2YSB7CisJCQljb21wYXRpYmxlID0gInRpLGl2YTIuMiI7CisJCQl0aSxod21vZHMgPSAiaXZhIjsKKworCQkJZHNwIHsKKwkJCQljb21wYXRpYmxlID0gInRpLG9tYXAzLWM2NCI7CisJCQl9OworCQl9OworCX07CisKKwkvKgorCSAqIFhYWDogVXNlIGEgZmxhdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgT01BUDMgaW50ZXJjb25uZWN0LgorCSAqIFRoZSByZWFsIE9NQVAgaW50ZXJjb25uZWN0IG5ldHdvcmsgaXMgcXVpdGUgY29tcGxleC4KKwkgKiBTaW5jZSB0aGF0IHdpbGwgbm90IGJyaW5nIHJlYWwgYWR2YW50YWdlIHRvIHJlcHJlc2VudCB0aGF0IGluIERUIGZvcgorCSAqIHRoZSBtb21lbnQsIGp1c3QgdXNlIGEgZmFrZSBPQ1AgYnVzIGVudHJ5IHRvIHJlcHJlc2VudCB0aGUgd2hvbGUgYnVzCisJICogaGllcmFyY2h5LgorCSAqLworCW9jcCB7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmFuZ2VzOworCQl0aSxod21vZHMgPSAibDNfbWFpbiI7CisKKwkJaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXJAMSB7CisJCQljb21wYXRpYmxlID0gInRpLG9tYXAzLWludGMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQtcGFuZGEuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQtcGFuZGEuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDI2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC1wYW5kYS5kdHMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisvZHRzLXYxLzsKKworL2luY2x1ZGUvICJvbWFwNC5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJUSSBPTUFQNCBQYW5kYUJvYXJkIjsKKwljb21wYXRpYmxlID0gInRpLG9tYXA0LXBhbmRhIiwgInRpLG9tYXA0NDMwIiwgInRpLG9tYXA0IjsKKworCS8qCisJICogU2luY2UgdGhlIGluaXRpYWwgZGV2aWNlIHRyZWUgYm9hcmQgZmlsZSBkb2VzIG5vdCBjcmVhdGUgYW55CisJICogZGV2aWNlcyAoTU1DLCBuZXR3b3JrLi4uKSwgdGhlIG9ubHkgd2F5IHRvIGJvb3QgaXMgdG8gcHJvdmlkZSBhCisJICogcmFtZGlzay4KKwkgKi8KKwljaG9zZW4geworCQlib290YXJncyA9ICJyb290PS9kZXYvcmFtMCBydyBjb25zb2xlPXR0eU8yLDExNTIwMG44IGluaXRyZD0weDgxNjAwMDAwLDIwTSByYW1kaXNrX3NpemU9MjA0ODAgbm9fY29uc29sZV9zdXNwZW5kIGRlYnVnIjsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4ODAwMDAwMDAgMHg0MDAwMDAwMD47IC8qIDEgR0IgKi8KKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA0LXNkcC5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC1zZHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NmUyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC1zZHAuZHRzCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworL2R0cy12MS87CisKKy9pbmNsdWRlLyAib21hcDQuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiVEkgT01BUDQgU0RQIGJvYXJkIjsKKwljb21wYXRpYmxlID0gInRpLG9tYXA0LXNkcCIsICJ0aSxvbWFwNDQzMCIsICJ0aSxvbWFwNCI7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBpbml0aWFsIGRldmljZSB0cmVlIGJvYXJkIGZpbGUgZG9lcyBub3QgY3JlYXRlIGFueQorCSAqIGRldmljZXMgKE1NQywgbmV0d29yay4uLiksIHRoZSBvbmx5IHdheSB0byBib290IGlzIHRvIHByb3ZpZGUgYQorCSAqIHJhbWRpc2suCisJICovCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAicm9vdD0vZGV2L3JhbTAgcncgY29uc29sZT10dHlPMiwxMTUyMDBuOCBpbml0cmQ9MHg4MTYwMDAwMCwyME0gcmFtZGlza19zaXplPTIwNDgwIG5vX2NvbnNvbGVfc3VzcGVuZCBkZWJ1ZyI7CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDgwMDAwMDAwIDB4NDAwMDAwMDA+OyAvKiAxIEdCICovCisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9vbWFwNC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzYxYzgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQuZHRzaQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBDYXJ2ZW91dCBmb3IgbXVsdGltZWRpYSB1c2VjYXNlcworICogSXQgc2hvdWxkIGJlIHRoZSBsYXN0IDQ4TUIgb2YgdGhlIGZpcnN0IDUxMk1CIG1lbW9yeSBwYXJ0CisgKiBJbiB0aGVvcnksIGl0IHNob3VsZCBub3QgZXZlbiBleGlzdC4gVGhhdCB6b25lIHNob3VsZCBiZSByZXNlcnZlZAorICogZHluYW1pY2FsbHkgZHVyaW5nIHRoZSAucmVzZXJ2ZSBjYWxsYmFjay4KKyAqLworL21lbXJlc2VydmUvIDB4OWQwMDAwMDAgMHgwMzAwMDAwMDsKKworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwljb21wYXRpYmxlID0gInRpLG9tYXA0NDMwIiwgInRpLG9tYXA0IjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OworCisJYWxpYXNlcyB7CisJfTsKKworCWNwdXMgeworCQljcHVAMCB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQl9OworCQljcHVAMSB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQl9OworCX07CisKKwkvKgorCSAqIFRoZSBzb2Mgbm9kZSByZXByZXNlbnRzIHRoZSBzb2MgdG9wIGxldmVsIHZpZXcuIEl0IGlzIHVzZXMgZm9yIElQcworCSAqIHRoYXQgYXJlIG5vdCBtZW1vcnkgbWFwcGVkIGluIHRoZSBNUFUgdmlldyBvciBmb3IgdGhlIE1QVSBpdHNlbGYuCisJICovCisJc29jIHsKKwkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwLWluZnJhIjsKKwkJbXB1IHsKKwkJCWNvbXBhdGlibGUgPSAidGksb21hcDQtbXB1IjsKKwkJCXRpLGh3bW9kcyA9ICJtcHUiOworCQl9OworCisJCWRzcCB7CisJCQljb21wYXRpYmxlID0gInRpLG9tYXAzLWM2NCI7CisJCQl0aSxod21vZHMgPSAiZHNwIjsKKwkJfTsKKworCQlpdmEgeworCQkJY29tcGF0aWJsZSA9ICJ0aSxpdmFoZCI7CisJCQl0aSxod21vZHMgPSAiaXZhIjsKKwkJfTsKKwl9OworCisJLyoKKwkgKiBYWFg6IFVzZSBhIGZsYXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIE9NQVA0IGludGVyY29ubmVjdC4KKwkgKiBUaGUgcmVhbCBPTUFQIGludGVyY29ubmVjdCBuZXR3b3JrIGlzIHF1aXRlIGNvbXBsZXguCisJICoKKwkgKiBNUFUgLSstLSBNUFVfUFJJVkFURSAtIEdJQywgTDIKKwkgKiAgICAgIHwKKwkgKiAgICAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisJICogICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorCSAqICAgICAgKyAgICAgICAgICAgICstIEVNSUYgLSBERFIgIHwKKwkgKiAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CisJICogICAgICB8ICAgICAgICAgICAgKyAgICAgKy0tLS0tLS0tKworCSAqICAgICAgfCAgICAgICAgICAgIHwgICAgIHwKKwkgKiAgICAgIHwgICAgICAgICAgICArLSBMNF9BQkUgLSBBRVNTLCBNQ0JTUCwgVElNRVJzLi4uCisJICogICAgICB8ICAgICAgICAgICAgfAorCSAqICAgICAgKy0gTDNfTUFJTiAtLSstIEw0X0NPUkUgLSBJUHMuLi4KKwkgKiAgICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgKy0gTDRfUEVSIC0gSVBzLi4uCisJICogICAgICAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgICstIEw0X0NGRyAtKy0gTDRfV0tVUCAtIElQcy4uLgorCSAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgKy0gSVBzLi4uCisJICogICAgICAgICAgICAgICAgICAgKy0gSVBVIC0tLS0rCisJICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgKy0gRFNQIC0tLS0rCisJICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgKy0gRFNTIC0tLS0rCisJICoKKwkgKiBTaW5jZSB0aGF0IHdpbGwgbm90IGJyaW5nIHJlYWwgYWR2YW50YWdlIHRvIHJlcHJlc2VudCB0aGF0IGluIERUIGZvcgorCSAqIHRoZSBtb21lbnQsIGp1c3QgdXNlIGEgZmFrZSBPQ1AgYnVzIGVudHJ5IHRvIHJlcHJlc2VudCB0aGUgd2hvbGUgYnVzCisJICogaGllcmFyY2h5LgorCSAqLworCW9jcCB7CisJCWNvbXBhdGlibGUgPSAidGksb21hcDQtbDMtbm9jIiwgInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKwkJdGksaHdtb2RzID0gImwzX21haW5fMSIsICJsM19tYWluXzIiLCAibDNfbWFpbl8zIjsKKworCQlnaWM6IGludGVycnVwdC1jb250cm9sbGVyQDQ4MjQxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4NDgyNDEwMDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDQ4MjQwMTAwIDB4MDEwMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGMzeDIuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3BpY294Y2VsbC1wYzN4Mi5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYThjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGMzeDIuZHRzaQpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgUGljb2NoaXAsIEphbWllIElsZXMKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisvaW5jbHVkZS8gInNrZWxldG9uLmR0c2kiCisvIHsKKwltb2RlbCA9ICJQaWNvY2hpcCBwaWNvWGNlbGwgUEMzWDIiOworCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDIiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHVAMCB7CisJCQljb21wYXRpYmxlID0gImFybSwxMTc2anotcyI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwMDAwPjsKKwkJCXJlZyA9IDwwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDwzMjc2OD47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLXNpemUgPSA8MzI3Njg+OworCQl9OworCX07CisKKwljbG9ja3MgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKworCQlwY2xrOiBjbG9ja0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiLCAicGNsayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCXJlZi1jbG9jayA9IDwmcmVmX2Nsaz4sICJyZWYiOworCQl9OworCX07CisKKwlwYXhpIHsKKwkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyYW5nZXMgPSA8MCAweDgwMDAwMDAwIDB4NDAwMDAwPjsKKworCQllbWFjOiBnZW1AMzAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJjYWRlbmNlLGdlbSI7CisJCQlyZWcgPSA8MHgzMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MzE+OworCQl9OworCisJCWRtYWMxOiBkbWFjQDQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxkdy1kbWFjIjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0cyA9IDwyNT47CisJCX07CisKKwkJZG1hYzI6IGRtYWNANTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWRtYWMiOworCQkJcmVnID0gPDB4NTAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDI2PjsKKwkJfTsKKworCQl2aWMwOiBpbnRlcnJ1cHQtY29udHJvbGxlckA2MDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDE5Mi12aWMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQlyZWcgPSA8MHg2MDAwMCAweDEwMDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJfTsKKworCQl2aWMxOiBpbnRlcnJ1cHQtY29udHJvbGxlckA2NDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDE5Mi12aWMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQlyZWcgPSA8MHg2NDAwMCAweDEwMDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJfTsKKworCQlmdXNlOiBwaWNveGNlbGwtZnVzZUA4MDAwMCB7CisJCQljb21wYXRpYmxlID0gInBpY294Y2VsbCxmdXNlLXBjM3gyIjsKKwkJCXJlZyA9IDwweDgwMDAwIDB4MTAwMDA+OworCQl9OworCisJCXNzaTogcGljb3hjZWxsLXNwaUA5MDAwMCB7CisJCQljb21wYXRpYmxlID0gInBpY294Y2VsbCxzcGkiOworCQkJcmVnID0gPDB4OTAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MTA+OworCQl9OworCisJCWlwc2VjOiBzcGFjY0AxMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxzcGFjYy1pcHNlYyI7CisJCQlyZWcgPSA8MHgxMDAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MjQ+OworCQkJcmVmLWNsb2NrID0gPCZwY2xrPiwgInJlZiI7CisJCX07CisKKwkJc3J0cDogc3BhY2NAMTQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2Mtc3J0cCI7CisJCQlyZWcgPSA8MHgxNDAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MjM+OworCQl9OworCisJCWwyX2VuZ2luZTogc3BhY2NAMTgwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2MtbDIiOworCQkJcmVnID0gPDB4MTgwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDIyPjsKKwkJCXJlZi1jbG9jayA9IDwmcGNsaz4sICJyZWYiOworCQl9OworCisJCWFwYiB7CisJCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJhbmdlcyA9IDwwIDB4MjAwMDAwIDB4ODAwMDA+OworCisJCQlydGMwOiBydGNAMDAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItcnRjIjsKKwkJCQljbG9jay1mcmVxID0gPDIwMDAwMDAwMD47CisJCQkJcmVnID0gPDB4MDAwMDAgMHhmPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg+OworCQkJfTsKKworCQkJdGltZXIwOiB0aW1lckAxMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4Mi10aW1lciI7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQkJaW50ZXJydXB0cyA9IDw0PjsKKwkJCQljbG9jay1mcmVxID0gPDIwMDAwMDAwMD47CisJCQkJcmVnID0gPDB4MTAwMDAgMHgxND47CisJCQl9OworCisJCQl0aW1lcjE6IHRpbWVyQDEwMDE0IHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gyLXRpbWVyIjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU+OworCQkJCWNsb2NrLWZyZXEgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWcgPSA8MHgxMDAxNCAweDE0PjsKKwkJCX07CisKKwkJCXRpbWVyMjogdGltZXJAMTAwMjggeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItdGltZXIiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8Nj47CisJCQkJY2xvY2stZnJlcSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZyA9IDwweDEwMDI4IDB4MTQ+OworCQkJfTsKKworCQkJdGltZXIzOiB0aW1lckAxMDAzYyB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4Mi10aW1lciI7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQkJaW50ZXJydXB0cyA9IDw3PjsKKwkJCQljbG9jay1mcmVxID0gPDIwMDAwMDAwMD47CisJCQkJcmVnID0gPDB4MTAwM2MgMHgxND47CisJCQl9OworCisJCQlncGlvOiBncGlvQDIwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLWdwaW8iOworCQkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJcmVnLWlvLXdpZHRoID0gPDQ+OworCisJCQkJYmFua2E6IGdwaW8tY29udHJvbGxlckAwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi1ncGlvLWJhbmsiOworCQkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCQlncGlvLWdlbmVyaWMsbnItZ3BpbyA9IDw4PjsKKworCQkJCQlyZWdvZmZzZXQtZGF0ID0gPDB4NTA+OworCQkJCQlyZWdvZmZzZXQtc2V0ID0gPDB4MDA+OworCQkJCQlyZWdvZmZzZXQtZGlyb3V0ID0gPDB4MDQ+OworCQkJCX07CisKKwkJCQliYW5rYjogZ3Bpby1jb250cm9sbGVyQDEgeworCQkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLWdwaW8tYmFuayI7CisJCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJCWdwaW8tZ2VuZXJpYyxuci1ncGlvID0gPDg+OworCisJCQkJCXJlZ29mZnNldC1kYXQgPSA8MHg1ND47CisJCQkJCXJlZ29mZnNldC1zZXQgPSA8MHgwYz47CisJCQkJCXJlZ29mZnNldC1kaXJvdXQgPSA8MHgxMD47CisJCQkJfTsKKwkJCX07CisKKwkJCXVhcnQwOiB1YXJ0QDMwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLXVhcnQiOworCQkJCXJlZyA9IDwweDMwMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMT47CisJCQkJaW50ZXJydXB0cyA9IDwxMD47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDM2ODY0MDA+OworCQkJCXJlZy1zaGlmdCA9IDwyPjsKKwkJCQlyZWctaW8td2lkdGggPSA8ND47CisJCQl9OworCisJCQl1YXJ0MTogdWFydEA0MDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi11YXJ0IjsKKwkJCQlyZWcgPSA8MHg0MDAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzE+OworCQkJCWludGVycnVwdHMgPSA8OT47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDM2ODY0MDA+OworCQkJCXJlZy1zaGlmdCA9IDwyPjsKKwkJCQlyZWctaW8td2lkdGggPSA8ND47CisJCQl9OworCisJCQl3ZG9nOiB3YXRjaGRvZ0A1MDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi13ZGciOworCQkJCXJlZyA9IDwweDUwMDAwIDB4MTAwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8MTE+OworCQkJCWJ1cy1jbG9jayA9IDwmcGNsaz4sICJidXMiOworCQkJfTsKKwkJfTsKKwl9OworCisJcndpZC1heGkgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlczsKKworCQllYmlANTAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXMgPSA8MCAwIDB4NDAwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMSAwIDB4NDgwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMiAwIDB4NTAwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMyAwIDB4NTgwMDAwMDAgMHgwODAwMDAwMD47CisJCX07CisKKwkJYXhpMnBpY29AYzAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxheGkycGljby1wYzN4MiI7CisJCQlyZWcgPSA8MHhjMDAwMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjE+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvcGljb3hjZWxsLXBjM3gzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGMzeDMuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWE5NjJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcGljb3hjZWxsLXBjM3gzLmR0c2kKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIFBpY29jaGlwLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorLyB7CisJbW9kZWwgPSAiUGljb2NoaXAgcGljb1hjZWxsIFBDM1gzIjsKKwljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1QDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sMTE3Nmp6LXMiOworCQkJY3B1LWNsb2NrID0gPCZhcm1fY2xrPiwgImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlkLWNhY2hlLXNpemUgPSA8MzI3Njg+OworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1zaXplID0gPDMyNzY4PjsKKwkJfTsKKwl9OworCisJY2xvY2tzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyYW5nZXM7CisKKwkJY2xrZ2F0ZTogY2xrZ2F0ZUA4MDBhMDA0OCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4ODAwYTAwNDggND47CisJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWNsay1nYXRlIjsKKworCQkJdHpwcm90X2NsazogY2xvY2tAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4My1nYXRlZC1jbGsiOworCQkJCWNsb2NrLW91dHB1dHMgPSAiYnVzIjsKKwkJCQlwaWNvY2hpcCxjbGstZGlzYWJsZS1iaXQgPSA8MD47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwMD47CisJCQkJcmVmLWNsb2NrID0gPCZyZWZfY2xrPiwgInJlZiI7CisJCQl9OworCisJCQlzcGlfY2xrOiBjbG9ja0AxIHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWdhdGVkLWNsayI7CisJCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiOworCQkJCXBpY29jaGlwLGNsay1kaXNhYmxlLWJpdCA9IDwxPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCX07CisKKwkJCWRtYWMwX2NsazogY2xvY2tAMiB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4My1nYXRlZC1jbGsiOworCQkJCWNsb2NrLW91dHB1dHMgPSAiYnVzIjsKKwkJCQlwaWNvY2hpcCxjbGstZGlzYWJsZS1iaXQgPSA8Mj47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwMD47CisJCQkJcmVmLWNsb2NrID0gPCZyZWZfY2xrPiwgInJlZiI7CisJCQl9OworCisJCQlkbWFjMV9jbGs6IGNsb2NrQDMgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDMtZ2F0ZWQtY2xrIjsKKwkJCQljbG9jay1vdXRwdXRzID0gImJ1cyI7CisJCQkJcGljb2NoaXAsY2xrLWRpc2FibGUtYml0ID0gPDM+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZi1jbG9jayA9IDwmcmVmX2Nsaz4sICJyZWYiOworCQkJfTsKKworCQkJZWJpX2NsazogY2xvY2tANCB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4My1nYXRlZC1jbGsiOworCQkJCWNsb2NrLW91dHB1dHMgPSAiYnVzIjsKKwkJCQlwaWNvY2hpcCxjbGstZGlzYWJsZS1iaXQgPSA8ND47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwMD47CisJCQkJcmVmLWNsb2NrID0gPCZyZWZfY2xrPiwgInJlZiI7CisJCQl9OworCisJCQlpcHNlY19jbGs6IGNsb2NrQDUgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDMtZ2F0ZWQtY2xrIjsKKwkJCQljbG9jay1vdXRwdXRzID0gImJ1cyI7CisJCQkJcGljb2NoaXAsY2xrLWRpc2FibGUtYml0ID0gPDU+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZi1jbG9jayA9IDwmcmVmX2Nsaz4sICJyZWYiOworCQkJfTsKKworCQkJbDJfY2xrOiBjbG9ja0A2IHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWdhdGVkLWNsayI7CisJCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiOworCQkJCXBpY29jaGlwLGNsay1kaXNhYmxlLWJpdCA9IDw2PjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCX07CisKKwkJCXRybmdfY2xrOiBjbG9ja0A3IHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWdhdGVkLWNsayI7CisJCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiOworCQkJCXBpY29jaGlwLGNsay1kaXNhYmxlLWJpdCA9IDw3PjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCX07CisKKwkJCWZ1c2VfY2xrOiBjbG9ja0A4IHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWdhdGVkLWNsayI7CisJCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiOworCQkJCXBpY29jaGlwLGNsay1kaXNhYmxlLWJpdCA9IDw4PjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCX07CisKKwkJCW90cF9jbGs6IGNsb2NrQDkgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDMtZ2F0ZWQtY2xrIjsKKwkJCQljbG9jay1vdXRwdXRzID0gImJ1cyI7CisJCQkJcGljb2NoaXAsY2xrLWRpc2FibGUtYml0ID0gPDk+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZi1jbG9jayA9IDwmcmVmX2Nsaz4sICJyZWYiOworCQkJfTsKKwkJfTsKKworCQlhcm1fY2xrOiBjbG9ja0AxMSB7CisJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLXBsbCI7CisJCQlyZWcgPSA8MHg4MDBhMDA1MCAweDg+OworCQkJcGljb2NoaXAsbWluLWZyZXEgPSA8MTQwMDAwMDAwPjsKKwkJCXBpY29jaGlwLG1heC1mcmVxID0gPDcwMDAwMDAwMD47CisJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCWNsb2NrLW91dHB1dHMgPSAiY3B1IjsKKwkJfTsKKworCQlwY2xrOiBjbG9ja0AxMiB7CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLW91dHB1dHMgPSAiYnVzIiwgInBjbGsiOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwMD47CisJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJfTsKKwl9OworCisJcGF4aSB7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmFuZ2VzID0gPDAgMHg4MDAwMDAwMCAweDQwMDAwMD47CisKKwkJZW1hYzogZ2VtQDMwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2FkZW5jZSxnZW0iOworCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MzE+OworCQl9OworCisJCWRtYWMxOiBkbWFjQDQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxkdy1kbWFjIjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDI1PjsKKwkJfTsKKworCQlkbWFjMjogZG1hY0A1MDAwMCB7CisJCQljb21wYXRpYmxlID0gInNucHMsZHctZG1hYyI7CisJCQlyZWcgPSA8MHg1MDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJaW50ZXJydXB0cyA9IDwyNj47CisJCX07CisKKwkJdmljMDogaW50ZXJydXB0LWNvbnRyb2xsZXJANjAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwxOTItdmljIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJcmVnID0gPDB4NjAwMDAgMHgxMDAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCX07CisKKwkJdmljMTogaW50ZXJydXB0LWNvbnRyb2xsZXJANjQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwxOTItdmljIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJcmVnID0gPDB4NjQwMDAgMHgxMDAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCX07CisKKwkJZnVzZTogcGljb3hjZWxsLWZ1c2VAODAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNveGNlbGwsZnVzZS1wYzN4MyI7CisJCQlyZWcgPSA8MHg4MDAwMCAweDEwMDAwPjsKKwkJfTsKKworCQlzc2k6IHBpY294Y2VsbC1zcGlAOTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNveGNlbGwsc3BpIjsKKwkJCXJlZyA9IDwweDkwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDEwPjsKKwkJfTsKKworCQlpcHNlYzogc3BhY2NAMTAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2MtaXBzZWMiOworCQkJcmVnID0gPDB4MTAwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDI0PjsKKwkJCXJlZi1jbG9jayA9IDwmaXBzZWNfY2xrPiwgInJlZiI7CisJCX07CisKKwkJc3J0cDogc3BhY2NAMTQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2Mtc3J0cCI7CisJCQlyZWcgPSA8MHgxNDAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MjM+OworCQl9OworCisJCWwyX2VuZ2luZTogc3BhY2NAMTgwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2MtbDIiOworCQkJcmVnID0gPDB4MTgwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDIyPjsKKwkJCXJlZi1jbG9jayA9IDwmbDJfY2xrPiwgInJlZiI7CisJCX07CisKKwkJYXBiIHsKKwkJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmFuZ2VzID0gPDAgMHgyMDAwMDAgMHg4MDAwMD47CisKKwkJCXJ0YzA6IHJ0Y0AwMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4Mi1ydGMiOworCQkJCWNsb2NrLWZyZXEgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWcgPSA8MHgwMDAwMCAweGY+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8OD47CisJCQl9OworCisJCQl0aW1lcjA6IHRpbWVyQDEwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gyLXRpbWVyIjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQ+OworCQkJCWNsb2NrLWZyZXEgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWcgPSA8MHgxMDAwMCAweDE0PjsKKwkJCX07CisKKwkJCXRpbWVyMTogdGltZXJAMTAwMTQgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItdGltZXIiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8NT47CisJCQkJY2xvY2stZnJlcSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZyA9IDwweDEwMDE0IDB4MTQ+OworCQkJfTsKKworCQkJZ3BpbzogZ3Bpb0AyMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi1ncGlvIjsKKwkJCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXJlZy1pby13aWR0aCA9IDw0PjsKKworCQkJCWJhbmthOiBncGlvLWNvbnRyb2xsZXJAMCB7CisJCQkJCWNvbXBhdGlibGUgPSAic25wcyxkdy1hcGItZ3Bpby1iYW5rIjsKKwkJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQkJZ3Bpby1nZW5lcmljLG5yLWdwaW8gPSA8OD47CisKKwkJCQkJcmVnb2Zmc2V0LWRhdCA9IDwweDUwPjsKKwkJCQkJcmVnb2Zmc2V0LXNldCA9IDwweDAwPjsKKwkJCQkJcmVnb2Zmc2V0LWRpcm91dCA9IDwweDA0PjsKKwkJCQl9OworCisJCQkJYmFua2I6IGdwaW8tY29udHJvbGxlckAxIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi1ncGlvLWJhbmsiOworCQkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCQlncGlvLWdlbmVyaWMsbnItZ3BpbyA9IDwxNj47CisKKwkJCQkJcmVnb2Zmc2V0LWRhdCA9IDwweDU0PjsKKwkJCQkJcmVnb2Zmc2V0LXNldCA9IDwweDBjPjsKKwkJCQkJcmVnb2Zmc2V0LWRpcm91dCA9IDwweDEwPjsKKwkJCQl9OworCisJCQkJYmFua2Q6IGdwaW8tY29udHJvbGxlckAyIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi1ncGlvLWJhbmsiOworCQkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCQlncGlvLWdlbmVyaWMsbnItZ3BpbyA9IDwzMD47CisKKwkJCQkJcmVnb2Zmc2V0LWRhdCA9IDwweDVjPjsKKwkJCQkJcmVnb2Zmc2V0LXNldCA9IDwweDI0PjsKKwkJCQkJcmVnb2Zmc2V0LWRpcm91dCA9IDwweDI4PjsKKwkJCQl9OworCQkJfTsKKworCQkJdWFydDA6IHVhcnRAMzAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAic25wcyxkdy1hcGItdWFydCI7CisJCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEwPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MzY4NjQwMD47CisJCQkJcmVnLXNoaWZ0ID0gPDI+OworCQkJCXJlZy1pby13aWR0aCA9IDw0PjsKKwkJCX07CisKKwkJCXVhcnQxOiB1YXJ0QDQwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLXVhcnQiOworCQkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMT47CisJCQkJaW50ZXJydXB0cyA9IDw5PjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MzY4NjQwMD47CisJCQkJcmVnLXNoaWZ0ID0gPDI+OworCQkJCXJlZy1pby13aWR0aCA9IDw0PjsKKwkJCX07CisKKwkJCXdkb2c6IHdhdGNoZG9nQDUwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLXdkZyI7CisJCQkJcmVnID0gPDB4NTAwMDAgMHgxMDAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQkJaW50ZXJydXB0cyA9IDwxMT47CisJCQkJYnVzLWNsb2NrID0gPCZwY2xrPiwgImJ1cyI7CisJCQl9OworCisJCQl0aW1lcjI6IHRpbWVyQDYwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gyLXRpbWVyIjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDY+OworCQkJCWNsb2NrLWZyZXEgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWcgPSA8MHg2MDAwMCAweDE0PjsKKwkJCX07CisKKwkJCXRpbWVyMzogdGltZXJANjAwMTQgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItdGltZXIiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8Nz47CisJCQkJY2xvY2stZnJlcSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZyA9IDwweDYwMDE0IDB4MTQ+OworCQkJfTsKKwkJfTsKKwl9OworCisJcndpZC1heGkgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlczsKKworCQllYmlANTAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXMgPSA8MCAwIDB4NDAwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMSAwIDB4NDgwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMiAwIDB4NTAwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMyAwIDB4NTgwMDAwMDAgMHgwODAwMDAwMD47CisJCX07CisKKwkJYXhpMnBpY29AYzAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxheGkycGljby1wYzN4MyI7CisJCQlyZWcgPSA8MHhjMDAwMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJaW50ZXJydXB0cyA9IDwxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMT47CisJCX07CisKKwkJb3RwQGZmZmY4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsb3RwLXBjM3gzIjsKKwkJCXJlZyA9IDwweGZmZmY4MDAwIDB4ODAwMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGM3MzAyLXBjM3gyLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3BpY294Y2VsbC1wYzczMDItcGMzeDIuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTc0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGM3MzAyLXBjM3gyLmR0cwpAQCAtMCwwICsxLDg2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMSBQaWNvY2hpcCwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisvaW5jbHVkZS8gInBpY294Y2VsbC1wYzN4Mi5kdHNpIgorLyB7CisJbW9kZWwgPSAiUGljb2NoaXAgUEM3MzAyIChQQzNYMikiOworCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGM3MzAyLXBjM3gyIiwgInBpY29jaGlwLHBjM3gyIjsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAgMHgwODAwMDAwMD47CisJfTsKKworCWNob3NlbiB7CisJCWxpbnV4LHN0ZG91dC1wYXRoID0gJnVhcnQwOworCX07CisKKwljbG9ja3MgeworCQlyZWZfY2xrOiBjbG9ja0AxIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stb3V0cHV0cyA9ICJyZWYiOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwPjsKKwkJfTsKKwl9OworCisJcndpZC1heGkgeworCQllYmlANTAwMDAwMDAgeworCQkJbmFuZDogZ3Bpby1uYW5kQDIsMCB7CisJCQkJY29tcGF0aWJsZSA9ICJncGlvLWNvbnRyb2wtbmFuZCI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDIgMHgwMDAwIDB4MTAwMD47CisJCQkJYnVzLWNsb2NrID0gPCZwY2xrPiwgImJ1cyI7CisJCQkJZ3Bpby1jb250cm9sLW5hbmQsaW8tc3luYy1yZWcgPQorCQkJCQk8MHgwMDAwMDAwMCAweDgwMjIwMDAwPjsKKworCQkJCWdwaW9zID0gPCZiYW5rYSAxIDAJLyogcmR5ICovCisJCQkJCSAmYmFua2EgMiAwIAkvKiBuY2UgKi8KKwkJCQkJICZiYW5rYSAzIDAgCS8qIGFsZSAqLworCQkJCQkgJmJhbmthIDQgMCAJLyogY2xlICovCisJCQkJCSAwCQkvKiBud3AgKi8+OworCisJCQkJYm9vdEAxMDAwMDAgeworCQkJCQlsYWJlbCA9ICJCb290IjsKKwkJCQkJcmVnID0gPDB4MTAwMDAwIDB4ODAwMDA+OworCQkJCX07CisKKwkJCQlyZWR1bmRhbnQtYm9vdEAyMDAwMDAgeworCQkJCQlsYWJlbCA9ICJSZWR1bmRhbnQgQm9vdCI7CisJCQkJCXJlZyA9IDwweDIwMDAwMCAweDgwMDAwPjsKKwkJCQl9OworCisJCQkJYm9vdC1lbnZAMzAwMDAwIHsKKwkJCQkJbGFiZWwgPSAiQm9vdCBFdmlyb25tZW50IjsKKwkJCQkJcmVnID0gPDB4MzAwMDAwIDB4MjAwMDA+OworCQkJCX07CisKKwkJCQlyZWR1bmRhbnQtYm9vdC1lbnZAMzIwMDAwIHsKKwkJCQkJbGFiZWwgPSAiUmVkdW5kYW50IEJvb3QgRW52aXJvbm1lbnQiOworCQkJCQlyZWcgPSA8MHgzMDAwMDAgMHgyMDAwMD47CisJCQkJfTsKKworCQkJCWtlcm5lbEAzODAwMDAgeworCQkJCQlsYWJlbCA9ICJLZXJuZWwiOworCQkJCQlyZWcgPSA8MHgzODAwMDAgMHg4MDAwMDA+OworCQkJCX07CisKKwkJCQlmc0BiODAwMDAgeworCQkJCQlsYWJlbCA9ICJGaWxlIFN5c3RlbSI7CisJCQkJCXJlZyA9IDwweGI4MDAwMCAweGY0ODAwMDA+OworCQkJCX07CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvcGljb3hjZWxsLXBjNzMwMi1wYzN4My5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGM3MzAyLXBjM3gzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTMxN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcGljb3hjZWxsLXBjNzMwMi1wYzN4My5kdHMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgUGljb2NoaXAsIEphbWllIElsZXMKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL2luY2x1ZGUvICJwaWNveGNlbGwtcGMzeDMuZHRzaSIKKy8geworCW1vZGVsID0gIlBpY29jaGlwIFBDNzMwMiAoUEMzWDMpIjsKKwljb21wYXRpYmxlID0gInBpY29jaGlwLHBjNzMwMi1wYzN4MyIsICJwaWNvY2hpcCxwYzN4MyI7CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHgwIDB4MDgwMDAwMDA+OworCX07CisKKwljaG9zZW4geworCQlsaW51eCxzdGRvdXQtcGF0aCA9ICZ1YXJ0MDsKKwl9OworCisJY2xvY2tzIHsKKwkJcmVmX2NsazogY2xvY2tAMTAgeworCQkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1vdXRwdXRzID0gInJlZiI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDA+OworCQl9OworCisJCWNsa2dhdGU6IGNsa2dhdGVAODAwYTAwNDggeworCQkJY2xvY2tANCB7CisJCQkJcGljb2NoaXAsY2xrLW5vLWRpc2FibGU7CisJCQl9OworCQl9OworCX07CisKKwlyd2lkLWF4aSB7CisJCWViaUA1MDAwMDAwMCB7CisJCQluYW5kOiBncGlvLW5hbmRAMiwwIHsKKwkJCQljb21wYXRpYmxlID0gImdwaW8tY29udHJvbC1uYW5kIjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQlyZWcgPSA8MiAweDAwMDAgMHgxMDAwPjsKKwkJCQlidXMtY2xvY2sgPSA8JmViaV9jbGs+LCAiYnVzIjsKKwkJCQlncGlvLWNvbnRyb2wtbmFuZCxpby1zeW5jLXJlZyA9CisJCQkJCTwweDAwMDAwMDAwIDB4ODAyMjAwMDA+OworCisJCQkJZ3Bpb3MgPSA8JmJhbmthIDEgMAkvKiByZHkgKi8KKwkJCQkJICZiYW5rYSAyIDAgCS8qIG5jZSAqLworCQkJCQkgJmJhbmthIDMgMCAJLyogYWxlICovCisJCQkJCSAmYmFua2EgNCAwIAkvKiBjbGUgKi8KKwkJCQkJIDAJCS8qIG53cCAqLz47CisKKwkJCQlib290QDEwMDAwMCB7CisJCQkJCWxhYmVsID0gIkJvb3QiOworCQkJCQlyZWcgPSA8MHgxMDAwMDAgMHg4MDAwMD47CisJCQkJfTsKKworCQkJCXJlZHVuZGFudC1ib290QDIwMDAwMCB7CisJCQkJCWxhYmVsID0gIlJlZHVuZGFudCBCb290IjsKKwkJCQkJcmVnID0gPDB4MjAwMDAwIDB4ODAwMDA+OworCQkJCX07CisKKwkJCQlib290LWVudkAzMDAwMDAgeworCQkJCQlsYWJlbCA9ICJCb290IEV2aXJvbm1lbnQiOworCQkJCQlyZWcgPSA8MHgzMDAwMDAgMHgyMDAwMD47CisJCQkJfTsKKworCQkJCXJlZHVuZGFudC1ib290LWVudkAzMjAwMDAgeworCQkJCQlsYWJlbCA9ICJSZWR1bmRhbnQgQm9vdCBFbnZpcm9ubWVudCI7CisJCQkJCXJlZyA9IDwweDMwMDAwMCAweDIwMDAwPjsKKwkJCQl9OworCisJCQkJa2VybmVsQDM4MDAwMCB7CisJCQkJCWxhYmVsID0gIktlcm5lbCI7CisJCQkJCXJlZyA9IDwweDM4MDAwMCAweDgwMDAwMD47CisJCQkJfTsKKworCQkJCWZzQGI4MDAwMCB7CisJCQkJCWxhYmVsID0gIkZpbGUgU3lzdGVtIjsKKwkJCQkJcmVnID0gPDB4YjgwMDAwIDB4ZjQ4MDAwMD47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9wcmltYTItY2IuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvcHJpbWEyLWNiLmR0cwppbmRleCA2ZmVjYzg4Li4zNGFlM2E2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9wcmltYTItY2IuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3ByaW1hMi1jYi5kdHMKQEAgLTM5LDkgKzM5LDEyIEBACiAJCXJhbmdlcyA9IDwweDQwMDAwMDAwIDB4NDAwMDAwMDAgMHg4MDAwMDAwMD47CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckA4MDA0MDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImFybSxwbDMxMC1jYWNoZSI7CisJCQljb21wYXRpYmxlID0gImFybSxwbDMxMC1jYWNoZSIsICJzaXJmLHByaW1hMi1wbDMxMC1jYWNoZSI7CiAJCQlyZWcgPSA8MHg4MDA0MDAwMCAweDEwMDA+OwogCQkJaW50ZXJydXB0cyA9IDw1OT47CisJCQlhcm0sdGFnLWxhdGVuY3kgPSA8MSAxIDE+OworCQkJYXJtLGRhdGEtbGF0ZW5jeSA9IDwxIDEgMT47CisJCQlhcm0sZmlsdGVyLXJhbmdlcyA9IDwwIDB4NDAwMDAwMDA+OwogCQl9OwogCiAJCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQDgwMDIwMDAwIHsKQEAgLTY3LDYgKzcwLDExIEBACiAJCQkJY29tcGF0aWJsZSA9ICJzaXJmLHByaW1hMi1yc3RjIjsKIAkJCQlyZWcgPSA8MHg4ODAxMDAwMCAweDEwMDA+OwogCQkJfTsKKworCQkJcnNjLWNvbnRyb2xsZXJAODgwMjAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAic2lyZixwcmltYTItcnNjIjsKKwkJCQlyZWcgPSA8MHg4ODAyMDAwMCAweDEwMDA+OworCQkJfTsKIAkJfTsKIAogCQltZW0taW9iZyB7CkBAIC0yNzQsNyArMjgyLDcgQEAKIAkJCWdwaW86IGdwaW8tY29udHJvbGxlckBiMDEyMDAwMCB7CiAJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQljb21wYXRpYmxlID0gInNpcmYscHJpbWEyLWdwaW8iOworCQkJCWNvbXBhdGlibGUgPSAic2lyZixwcmltYTItZ3Bpby1waW5tdXgiOwogCQkJCXJlZyA9IDwweGIwMTIwMDAwIDB4MTAwMDA+OwogCQkJCWdwaW8tY29udHJvbGxlcjsKIAkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKQEAgLTM1OCw3ICszNjYsNyBAQAogCQl9OwogCiAJCXJ0Yy1pb2JnIHsKLQkJCWNvbXBhdGlibGUgPSAic2lyZixwcmltYTItcnRjaW9iZyIsICJzaW1wbGUtYnVzIjsKKwkJCWNvbXBhdGlibGUgPSAic2lyZixwcmltYTItcnRjaW9iZyIsICJzaXJmLXByaW1hMi1ydGNpb2JnLWJ1cyI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OwogCQkJcmVnID0gPDB4ODAwMzAwMDAgMHgxMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYS1oYXJtb255LmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzCmluZGV4IGU1ODE4NjYuLjBlMjI1YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzCkBAIC02Niw1ICs2Niw2IEBACiAJCWNkLWdwaW9zID0gPCZncGlvIDU4IDA+OyAvKiBncGlvIFBIMiAqLwogCQl3cC1ncGlvcyA9IDwmZ3BpbyA1OSAwPjsgLyogZ3BpbyBQSDMgKi8KIAkJcG93ZXItZ3Bpb3MgPSA8JmdwaW8gNzAgMD47IC8qIGdwaW8gUEk2ICovCisJCXN1cHBvcnQtOGJpdDsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLXNlYWJvYXJkLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLXNlYWJvYXJkLmR0cwppbmRleCA2NGNlZGNhLi5hNzIyOTliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYS1zZWFib2FyZC5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtc2VhYm9hcmQuZHRzCkBAIC0yNSw0ICsyNSw4IEBACiAJCXdwLWdwaW9zID0gPCZncGlvIDU3IDA+OyAvKiBncGlvIFBIMSAqLwogCQlwb3dlci1ncGlvcyA9IDwmZ3BpbyA3MCAwPjsgLyogZ3BpbyBQSTYgKi8KIAl9OworCisJc2RoY2lAYzgwMDA2MDAgeworCQlzdXBwb3J0LThiaXQ7CisJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYS12ZW50YW5hLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLXZlbnRhbmEuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWFiZDZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtdmVudGFuYS5kdHMKQEAgLTAsMCArMSwzMSBAQAorL2R0cy12MS87CisKKy9tZW1yZXNlcnZlLyAweDFjMDAwMDAwIDB4MDQwMDAwMDA7CisvaW5jbHVkZS8gInRlZ3JhMjAuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiTlZJRElBIFRlZ3JhMiBWZW50YW5hIGV2YWx1YXRpb24gYm9hcmQiOworCWNvbXBhdGlibGUgPSAibnZpZGlhLHZlbnRhbmEiLCAibnZpZGlhLHRlZ3JhMjAiOworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAidm1hbGxvYz0xOTJNIHZpZGVvPXRlZ3JhZmIgY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvcmFtIHJkaW5pdD0vc2Jpbi9pbml0IjsKKwl9OworCisJbWVtb3J5IHsKKwkJcmVnID0gPCAweDAwMDAwMDAwIDB4NDAwMDAwMDAgPjsKKwl9OworCisJc2VyaWFsQDcwMDA2MzAwIHsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPCAyMTYwMDAwMDAgPjsKKwl9OworCisJc2RoY2lAYzgwMDA0MDAgeworCQljZC1ncGlvcyA9IDwmZ3BpbyA2OSAwPjsgLyogZ3BpbyBQSTUgKi8KKwkJd3AtZ3Bpb3MgPSA8JmdwaW8gNTcgMD47IC8qIGdwaW8gUEgxICovCisJCXBvd2VyLWdwaW9zID0gPCZncGlvIDcwIDA+OyAvKiBncGlvIFBJNiAqLworCX07CisKKwlzZGhjaUBjODAwMDYwMCB7CisJCXN1cHBvcnQtOGJpdDsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMjAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMjAuZHRzaQppbmRleCA1NzI3NTk1Li42NWQ3ZTZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTIwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEyMC5kdHNpCkBAIC03Nyw2ICs3NywxNCBAQAogCQlncGlvLWNvbnRyb2xsZXI7CiAJfTsKIAorCXBpbm11eDogcGlubXV4QDcwMDAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1waW5tdXgiOworCQlyZWcgPSA8IDB4NzAwMDAwMTQgMHgxMCAgICAvKiBUcmktc3RhdGUgcmVnaXN0ZXJzICovCisJCQkweDcwMDAwMDgwIDB4MjAgICAgLyogTXV4IHJlZ2lzdGVycyAqLworCQkJMHg3MDAwMDBhMCAweDE0ICAgIC8qIFB1bGwtdXAvZG93biByZWdpc3RlcnMgKi8KKwkJCTB4NzAwMDA4NjggMHhhOCA+OyAvKiBQYWQgY29udHJvbCByZWdpc3RlcnMgKi8KKwl9OworCiAJc2VyaWFsQDcwMDA2MDAwIHsKIAkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC11YXJ0IjsKIAkJcmVnID0gPDB4NzAwMDYwMDAgMHg0MD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy91c2JfYTlnMjAuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdXNiX2E5ZzIwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjZlMmMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdXNiX2E5ZzIwLmR0cwpAQCAtMCwwICsxLDMwIEBACisvKgorICogdXNiX2E5ZzIwLmR0cyAtIERldmljZSBUcmVlIGZpbGUgZm9yIENhbG9hIFVTQiBBOUcyMCBib2FyZAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgSmVhbi1DaHJpc3RvcGhlIFBMQUdOSU9MLVZJTExBUkQgPHBsYWduaW9qQGpjcm9zb2Z0LmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworL2R0cy12MS87CisvaW5jbHVkZS8gImF0OTFzYW05ZzIwLmR0c2kiCisKKy8geworCW1vZGVsID0gIkNhbGFvIFVTQiBBOUcyMCI7CisJY29tcGF0aWJsZSA9ICJjYWxhbyx1c2ItYTlnMjAiLCAiYXRtZWwsYXQ5MXNhbTlnMjAiLCAiYXRtZWwsYXQ5MXNhbTkiOworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAibWVtPTY0TSBjb25zb2xlPXR0eVMwLDExNTIwMCBtdGRwYXJ0cz1hdG1lbF9uYW5kOjEyOGsoYXQ5MWJvb3RzdHJhcCksMjU2ayhiYXJlYm94KXJvLDEyOGsoYmFyZWJveGVudiksMTI4ayhiYXJlYm94ZW52MiksNE0oa2VybmVsKSwxMjBNKHJvb3RmcyksLShkYXRhKSByb290PS9kZXYvbXRkYmxvY2s1IHJ3IHJvb3Rmc3R5cGU9dWJpZnMiOworCX07CisKKwltZW1vcnlAMjAwMDAwMDAgeworCQlyZWcgPSA8MHgyMDAwMDAwMCAweDQwMDAwMDA+OworCX07CisKKwlhaGIgeworCQlhcGIgeworCQkJZGJndTogc2VyaWFsQGZmZmZmMjAwIHsKKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL0tjb25maWcgYi9hcmNoL2FybS9jb21tb24vS2NvbmZpZwppbmRleCA0YjcxNzY2Li43NGRmOWNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vS2NvbmZpZworKysgYi9hcmNoL2FybS9jb21tb24vS2NvbmZpZwpAQCAtMSw0ICsxLDUgQEAKIGNvbmZpZyBBUk1fR0lDCisJc2VsZWN0IElSUV9ET01BSU4KIAlib29sCiAKIGNvbmZpZyBBUk1fVklDCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZ2ljLmMgYi9hcmNoL2FybS9jb21tb24vZ2ljLmMKaW5kZXggYmRiYjNmNy4uMGU2YWU0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2dpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9naWMuYwpAQCAtMjQsMTAgKzI0LDIwIEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdV9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KQEAgLTcxLDggKzgxLDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2ljX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IGdpY19jaGlwX2RhdGEgKmdpY19kYXRhID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JcmV0dXJuIGQtPmlycSAtIGdpY19kYXRhLT5pcnFfb2Zmc2V0OworCXJldHVybiBkLT5od2lycTsKIH0KIAogLyoKQEAgLTgwLDcgKzg5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZ2ljX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQl1MzIgbWFzayA9IDEgPDwgKGQtPmlycSAlIDMyKTsKKwl1MzIgbWFzayA9IDEgPDwgKGdpY19pcnEoZCkgJSAzMik7CiAKIAlyYXdfc3Bpbl9sb2NrKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKIAl3cml0ZWxfcmVsYXhlZChtYXNrLCBnaWNfZGlzdF9iYXNlKGQpICsgR0lDX0RJU1RfRU5BQkxFX0NMRUFSICsgKGdpY19pcnEoZCkgLyAzMikgKiA0KTsKQEAgLTkxLDcgKzEwMCw3IEBACiAKIHN0YXRpYyB2b2lkIGdpY191bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQl1MzIgbWFzayA9IDEgPDwgKGQtPmlycSAlIDMyKTsKKwl1MzIgbWFzayA9IDEgPDwgKGdpY19pcnEoZCkgJSAzMik7CiAKIAlyYXdfc3Bpbl9sb2NrKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKIAlpZiAoZ2ljX2FyY2hfZXh0bi5pcnFfdW5tYXNrKQpAQCAtMTcyLDcgKzE4MSw3IEBACiAJCQkgICAgYm9vbCBmb3JjZSkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZyA9IGdpY19kaXN0X2Jhc2UoZCkgKyBHSUNfRElTVF9UQVJHRVQgKyAoZ2ljX2lycShkKSAmIH4zKTsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSAoZC0+aXJxICUgNCkgKiA4OworCXVuc2lnbmVkIGludCBzaGlmdCA9IChnaWNfaXJxKGQpICUgNCkgKiA4OwogCXVuc2lnbmVkIGludCBjcHUgPSBjcHVtYXNrX2FueV9hbmQobWFza192YWwsIGNwdV9vbmxpbmVfbWFzayk7CiAJdTMyIHZhbCwgbWFzaywgYml0OwogCkBAIC0yMjMsNyArMjMyLDcgQEAKIAlpZiAoZ2ljX2lycSA9PSAxMDIzKQogCQlnb3RvIG91dDsKIAotCWNhc2NhZGVfaXJxID0gZ2ljX2lycSArIGNoaXBfZGF0YS0+aXJxX29mZnNldDsKKwljYXNjYWRlX2lycSA9IGlycV9kb21haW5fdG9faXJxKCZjaGlwX2RhdGEtPmRvbWFpbiwgZ2ljX2lycSk7CiAJaWYgKHVubGlrZWx5KGdpY19pcnEgPCAzMiB8fCBnaWNfaXJxID4gMTAyMCB8fCBjYXNjYWRlX2lycSA+PSBOUl9JUlFTKSkKIAkJZG9fYmFkX0lSUShjYXNjYWRlX2lycSwgZGVzYyk7CiAJZWxzZQpAQCAtMjU1LDExICsyNjQsMTIgQEAKIAlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihpcnEsIGdpY19oYW5kbGVfY2FzY2FkZV9pcnEpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2Rpc3RfaW5pdChzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljLAotCXVuc2lnbmVkIGludCBpcnFfc3RhcnQpCitzdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2Rpc3RfaW5pdChzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljKQogewotCXVuc2lnbmVkIGludCBnaWNfaXJxcywgaXJxX2xpbWl0LCBpOworCXVuc2lnbmVkIGludCBpLCBpcnE7CiAJdTMyIGNwdW1hc2s7CisJdW5zaWduZWQgaW50IGdpY19pcnFzID0gZ2ljLT5naWNfaXJxczsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluID0gJmdpYy0+ZG9tYWluOwogCXZvaWQgX19pb21lbSAqYmFzZSA9IGdpYy0+ZGlzdF9iYXNlOwogCXUzMiBjcHUgPSAwOwogCkBAIC0yNzQsMTUgKzI4NCw2IEBACiAJd3JpdGVsX3JlbGF4ZWQoMCwgYmFzZSArIEdJQ19ESVNUX0NUUkwpOwogCiAJLyoKLQkgKiBGaW5kIG91dCBob3cgbWFueSBpbnRlcnJ1cHRzIGFyZSBzdXBwb3J0ZWQuCi0JICogVGhlIEdJQyBvbmx5IHN1cHBvcnRzIHVwIHRvIDEwMjAgaW50ZXJydXB0IHNvdXJjZXMuCi0JICovCi0JZ2ljX2lycXMgPSByZWFkbF9yZWxheGVkKGJhc2UgKyBHSUNfRElTVF9DVFIpICYgMHgxZjsKLQlnaWNfaXJxcyA9IChnaWNfaXJxcyArIDEpICogMzI7Ci0JaWYgKGdpY19pcnFzID4gMTAyMCkKLQkJZ2ljX2lycXMgPSAxMDIwOwotCi0JLyoKIAkgKiBTZXQgYWxsIGdsb2JhbCBpbnRlcnJ1cHRzIHRvIGJlIGxldmVsIHRyaWdnZXJlZCwgYWN0aXZlIGxvdy4KIAkgKi8KIAlmb3IgKGkgPSAzMjsgaSA8IGdpY19pcnFzOyBpICs9IDE2KQpAQCAtMzA4LDE5ICszMDksMjAgQEAKIAkJd3JpdGVsX3JlbGF4ZWQoMHhmZmZmZmZmZiwgYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9DTEVBUiArIGkgKiA0IC8gMzIpOwogCiAJLyoKLQkgKiBMaW1pdCBudW1iZXIgb2YgaW50ZXJydXB0cyByZWdpc3RlcmVkIHRvIHRoZSBwbGF0Zm9ybSBtYXhpbXVtCi0JICovCi0JaXJxX2xpbWl0ID0gZ2ljLT5pcnFfb2Zmc2V0ICsgZ2ljX2lycXM7Ci0JaWYgKFdBUk5fT04oaXJxX2xpbWl0ID4gTlJfSVJRUykpCi0JCWlycV9saW1pdCA9IE5SX0lSUVM7Ci0KLQkvKgogCSAqIFNldHVwIHRoZSBMaW51eCBJUlEgc3Vic3lzdGVtLgogCSAqLwotCWZvciAoaSA9IGlycV9zdGFydDsgaSA8IGlycV9saW1pdDsgaSsrKSB7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpLCAmZ2ljX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGksIGdpYyk7Ci0JCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCWlycV9kb21haW5fZm9yX2VhY2hfaXJxKGRvbWFpbiwgaSwgaXJxKSB7CisJCWlmIChpIDwgMzIpIHsKKwkJCWlycV9zZXRfcGVyY3B1X2RldmlkKGlycSk7CisJCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmZ2ljX2NoaXAsCisJCQkJCQkgaGFuZGxlX3BlcmNwdV9kZXZpZF9pcnEpOworCQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX05PQVVUT0VOKTsKKwkJfSBlbHNlIHsKKwkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZnaWNfY2hpcCwKKwkJCQkJCSBoYW5kbGVfZmFzdGVvaV9pcnEpOworCQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwkJfQorCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGdpYyk7CiAJfQogCiAJd3JpdGVsX3JlbGF4ZWQoMSwgYmFzZSArIEdJQ19ESVNUX0NUUkwpOwpAQCAtMzQ5LDIzICszNTEsMjcwIEBACiAJd3JpdGVsX3JlbGF4ZWQoMSwgYmFzZSArIEdJQ19DUFVfQ1RSTCk7CiB9CiAKLXZvaWQgX19pbml0IGdpY19pbml0KHVuc2lnbmVkIGludCBnaWNfbnIsIHVuc2lnbmVkIGludCBpcnFfc3RhcnQsCisjaWZkZWYgQ09ORklHX0NQVV9QTQorLyoKKyAqIFNhdmVzIHRoZSBHSUMgZGlzdHJpYnV0b3IgcmVnaXN0ZXJzIGR1cmluZyBzdXNwZW5kIG9yIGlkbGUuICBNdXN0IGJlIGNhbGxlZAorICogd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGJ1dCBiZWZvcmUgcG93ZXJpbmcgZG93biB0aGUgR0lDLiAgQWZ0ZXIgY2FsbGluZworICogdGhpcyBmdW5jdGlvbiwgbm8gaW50ZXJydXB0cyB3aWxsIGJlIGRlbGl2ZXJlZCBieSB0aGUgR0lDLCBhbmQgYW5vdGhlcgorICogcGxhdGZvcm0tc3BlY2lmaWMgd2FrZXVwIHNvdXJjZSBtdXN0IGJlIGVuYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGdpY19kaXN0X3NhdmUodW5zaWduZWQgaW50IGdpY19ucikKK3sKKwl1bnNpZ25lZCBpbnQgZ2ljX2lycXM7CisJdm9pZCBfX2lvbWVtICpkaXN0X2Jhc2U7CisJaW50IGk7CisKKwlpZiAoZ2ljX25yID49IE1BWF9HSUNfTlIpCisJCUJVRygpOworCisJZ2ljX2lycXMgPSBnaWNfZGF0YVtnaWNfbnJdLmdpY19pcnFzOworCWRpc3RfYmFzZSA9IGdpY19kYXRhW2dpY19ucl0uZGlzdF9iYXNlOworCisJaWYgKCFkaXN0X2Jhc2UpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBESVZfUk9VTkRfVVAoZ2ljX2lycXMsIDE2KTsgaSsrKQorCQlnaWNfZGF0YVtnaWNfbnJdLnNhdmVkX3NwaV9jb25mW2ldID0KKwkJCXJlYWRsX3JlbGF4ZWQoZGlzdF9iYXNlICsgR0lDX0RJU1RfQ09ORklHICsgaSAqIDQpOworCisJZm9yIChpID0gMDsgaSA8IERJVl9ST1VORF9VUChnaWNfaXJxcywgNCk7IGkrKykKKwkJZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9zcGlfdGFyZ2V0W2ldID0KKwkJCXJlYWRsX3JlbGF4ZWQoZGlzdF9iYXNlICsgR0lDX0RJU1RfVEFSR0VUICsgaSAqIDQpOworCisJZm9yIChpID0gMDsgaSA8IERJVl9ST1VORF9VUChnaWNfaXJxcywgMzIpOyBpKyspCisJCWdpY19kYXRhW2dpY19ucl0uc2F2ZWRfc3BpX2VuYWJsZVtpXSA9CisJCQlyZWFkbF9yZWxheGVkKGRpc3RfYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9TRVQgKyBpICogNCk7Cit9CisKKy8qCisgKiBSZXN0b3JlcyB0aGUgR0lDIGRpc3RyaWJ1dG9yIHJlZ2lzdGVycyBkdXJpbmcgcmVzdW1lIG9yIHdoZW4gY29taW5nIG91dCBvZgorICogaWRsZS4gIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyBpbnRlcnJ1cHRzLiAgSWYgYSBsZXZlbCBpbnRlcnJ1cHQKKyAqIHRoYXQgb2NjdXJlZCB3aGlsZSB0aGUgR0lDIHdhcyBzdXNwZW5kZWQgaXMgc3RpbGwgcHJlc2VudCwgaXQgd2lsbCBiZQorICogaGFuZGxlZCBub3JtYWxseSwgYnV0IGFueSBlZGdlIGludGVycnVwdHMgdGhhdCBvY2N1cmVkIHdpbGwgbm90IGJlIHNlZW4gYnkKKyAqIHRoZSBHSUMgYW5kIG5lZWQgdG8gYmUgaGFuZGxlZCBieSB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgd2FrZXVwIHNvdXJjZS4KKyAqLworc3RhdGljIHZvaWQgZ2ljX2Rpc3RfcmVzdG9yZSh1bnNpZ25lZCBpbnQgZ2ljX25yKQoreworCXVuc2lnbmVkIGludCBnaWNfaXJxczsKKwl1bnNpZ25lZCBpbnQgaTsKKwl2b2lkIF9faW9tZW0gKmRpc3RfYmFzZTsKKworCWlmIChnaWNfbnIgPj0gTUFYX0dJQ19OUikKKwkJQlVHKCk7CisKKwlnaWNfaXJxcyA9IGdpY19kYXRhW2dpY19ucl0uZ2ljX2lycXM7CisJZGlzdF9iYXNlID0gZ2ljX2RhdGFbZ2ljX25yXS5kaXN0X2Jhc2U7CisKKwlpZiAoIWRpc3RfYmFzZSkKKwkJcmV0dXJuOworCisJd3JpdGVsX3JlbGF4ZWQoMCwgZGlzdF9iYXNlICsgR0lDX0RJU1RfQ1RSTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKGdpY19pcnFzLCAxNik7IGkrKykKKwkJd3JpdGVsX3JlbGF4ZWQoZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9zcGlfY29uZltpXSwKKwkJCWRpc3RfYmFzZSArIEdJQ19ESVNUX0NPTkZJRyArIGkgKiA0KTsKKworCWZvciAoaSA9IDA7IGkgPCBESVZfUk9VTkRfVVAoZ2ljX2lycXMsIDQpOyBpKyspCisJCXdyaXRlbF9yZWxheGVkKDB4YTBhMGEwYTAsCisJCQlkaXN0X2Jhc2UgKyBHSUNfRElTVF9QUkkgKyBpICogNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKGdpY19pcnFzLCA0KTsgaSsrKQorCQl3cml0ZWxfcmVsYXhlZChnaWNfZGF0YVtnaWNfbnJdLnNhdmVkX3NwaV90YXJnZXRbaV0sCisJCQlkaXN0X2Jhc2UgKyBHSUNfRElTVF9UQVJHRVQgKyBpICogNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKGdpY19pcnFzLCAzMik7IGkrKykKKwkJd3JpdGVsX3JlbGF4ZWQoZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9zcGlfZW5hYmxlW2ldLAorCQkJZGlzdF9iYXNlICsgR0lDX0RJU1RfRU5BQkxFX1NFVCArIGkgKiA0KTsKKworCXdyaXRlbF9yZWxheGVkKDEsIGRpc3RfYmFzZSArIEdJQ19ESVNUX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCBnaWNfY3B1X3NhdmUodW5zaWduZWQgaW50IGdpY19ucikKK3sKKwlpbnQgaTsKKwl1MzIgKnB0cjsKKwl2b2lkIF9faW9tZW0gKmRpc3RfYmFzZTsKKwl2b2lkIF9faW9tZW0gKmNwdV9iYXNlOworCisJaWYgKGdpY19uciA+PSBNQVhfR0lDX05SKQorCQlCVUcoKTsKKworCWRpc3RfYmFzZSA9IGdpY19kYXRhW2dpY19ucl0uZGlzdF9iYXNlOworCWNwdV9iYXNlID0gZ2ljX2RhdGFbZ2ljX25yXS5jcHVfYmFzZTsKKworCWlmICghZGlzdF9iYXNlIHx8ICFjcHVfYmFzZSkKKwkJcmV0dXJuOworCisJcHRyID0gX190aGlzX2NwdV9wdHIoZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9wcGlfZW5hYmxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKDMyLCAzMik7IGkrKykKKwkJcHRyW2ldID0gcmVhZGxfcmVsYXhlZChkaXN0X2Jhc2UgKyBHSUNfRElTVF9FTkFCTEVfU0VUICsgaSAqIDQpOworCisJcHRyID0gX190aGlzX2NwdV9wdHIoZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9wcGlfY29uZik7CisJZm9yIChpID0gMDsgaSA8IERJVl9ST1VORF9VUCgzMiwgMTYpOyBpKyspCisJCXB0cltpXSA9IHJlYWRsX3JlbGF4ZWQoZGlzdF9iYXNlICsgR0lDX0RJU1RfQ09ORklHICsgaSAqIDQpOworCit9CisKK3N0YXRpYyB2b2lkIGdpY19jcHVfcmVzdG9yZSh1bnNpZ25lZCBpbnQgZ2ljX25yKQoreworCWludCBpOworCXUzMiAqcHRyOworCXZvaWQgX19pb21lbSAqZGlzdF9iYXNlOworCXZvaWQgX19pb21lbSAqY3B1X2Jhc2U7CisKKwlpZiAoZ2ljX25yID49IE1BWF9HSUNfTlIpCisJCUJVRygpOworCisJZGlzdF9iYXNlID0gZ2ljX2RhdGFbZ2ljX25yXS5kaXN0X2Jhc2U7CisJY3B1X2Jhc2UgPSBnaWNfZGF0YVtnaWNfbnJdLmNwdV9iYXNlOworCisJaWYgKCFkaXN0X2Jhc2UgfHwgIWNwdV9iYXNlKQorCQlyZXR1cm47CisKKwlwdHIgPSBfX3RoaXNfY3B1X3B0cihnaWNfZGF0YVtnaWNfbnJdLnNhdmVkX3BwaV9lbmFibGUpOworCWZvciAoaSA9IDA7IGkgPCBESVZfUk9VTkRfVVAoMzIsIDMyKTsgaSsrKQorCQl3cml0ZWxfcmVsYXhlZChwdHJbaV0sIGRpc3RfYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9TRVQgKyBpICogNCk7CisKKwlwdHIgPSBfX3RoaXNfY3B1X3B0cihnaWNfZGF0YVtnaWNfbnJdLnNhdmVkX3BwaV9jb25mKTsKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKDMyLCAxNik7IGkrKykKKwkJd3JpdGVsX3JlbGF4ZWQocHRyW2ldLCBkaXN0X2Jhc2UgKyBHSUNfRElTVF9DT05GSUcgKyBpICogNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKDMyLCA0KTsgaSsrKQorCQl3cml0ZWxfcmVsYXhlZCgweGEwYTBhMGEwLCBkaXN0X2Jhc2UgKyBHSUNfRElTVF9QUkkgKyBpICogNCk7CisKKwl3cml0ZWxfcmVsYXhlZCgweGYwLCBjcHVfYmFzZSArIEdJQ19DUFVfUFJJTUFTSyk7CisJd3JpdGVsX3JlbGF4ZWQoMSwgY3B1X2Jhc2UgKyBHSUNfQ1BVX0NUUkwpOworfQorCitzdGF0aWMgaW50IGdpY19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgY21kLAl2b2lkICp2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9HSUNfTlI7IGkrKykgeworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIENQVV9QTV9FTlRFUjoKKwkJCWdpY19jcHVfc2F2ZShpKTsKKwkJCWJyZWFrOworCQljYXNlIENQVV9QTV9FTlRFUl9GQUlMRUQ6CisJCWNhc2UgQ1BVX1BNX0VYSVQ6CisJCQlnaWNfY3B1X3Jlc3RvcmUoaSk7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfQ0xVU1RFUl9QTV9FTlRFUjoKKwkJCWdpY19kaXN0X3NhdmUoaSk7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfQ0xVU1RFUl9QTV9FTlRFUl9GQUlMRUQ6CisJCWNhc2UgQ1BVX0NMVVNURVJfUE1fRVhJVDoKKwkJCWdpY19kaXN0X3Jlc3RvcmUoaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZ2ljX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gZ2ljX25vdGlmaWVyLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGdpY19wbV9pbml0KHN0cnVjdCBnaWNfY2hpcF9kYXRhICpnaWMpCit7CisJZ2ljLT5zYXZlZF9wcGlfZW5hYmxlID0gX19hbGxvY19wZXJjcHUoRElWX1JPVU5EX1VQKDMyLCAzMikgKiA0LAorCQlzaXplb2YodTMyKSk7CisJQlVHX09OKCFnaWMtPnNhdmVkX3BwaV9lbmFibGUpOworCisJZ2ljLT5zYXZlZF9wcGlfY29uZiA9IF9fYWxsb2NfcGVyY3B1KERJVl9ST1VORF9VUCgzMiwgMTYpICogNCwKKwkJc2l6ZW9mKHUzMikpOworCUJVR19PTighZ2ljLT5zYXZlZF9wcGlfY29uZik7CisKKwljcHVfcG1fcmVnaXN0ZXJfbm90aWZpZXIoJmdpY19ub3RpZmllcl9ibG9jayk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IGdpY19wbV9pbml0KHN0cnVjdCBnaWNfY2hpcF9kYXRhICpnaWMpCit7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGludCBnaWNfaXJxX2RvbWFpbl9kdF90cmFuc2xhdGUoc3RydWN0IGlycV9kb21haW4gKmQsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCQkgICAgICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF90eXBlKQoreworCWlmIChkLT5vZl9ub2RlICE9IGNvbnRyb2xsZXIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpbnRzaXplIDwgMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgdGhlIGludGVycnVwdCBudW1iZXIgYW5kIGFkZCAxNiB0byBza2lwIG92ZXIgU0dJcyAqLworCSpvdXRfaHdpcnEgPSBpbnRzcGVjWzFdICsgMTY7CisKKwkvKiBGb3IgU1BJcywgd2UgbmVlZCB0byBhZGQgMTYgbW9yZSB0byBnZXQgdGhlIEdJQyBpcnEgSUQgbnVtYmVyICovCisJaWYgKCFpbnRzcGVjWzBdKQorCQkqb3V0X2h3aXJxICs9IDE2OworCisJKm91dF90eXBlID0gaW50c3BlY1syXSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIGdpY19pcnFfZG9tYWluX29wcyA9IHsKKyNpZmRlZiBDT05GSUdfT0YKKwkuZHRfdHJhbnNsYXRlID0gZ2ljX2lycV9kb21haW5fZHRfdHJhbnNsYXRlLAorI2VuZGlmCit9OworCit2b2lkIF9faW5pdCBnaWNfaW5pdCh1bnNpZ25lZCBpbnQgZ2ljX25yLCBpbnQgaXJxX3N0YXJ0LAogCXZvaWQgX19pb21lbSAqZGlzdF9iYXNlLCB2b2lkIF9faW9tZW0gKmNwdV9iYXNlKQogewogCXN0cnVjdCBnaWNfY2hpcF9kYXRhICpnaWM7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKwlpbnQgZ2ljX2lycXM7CiAKIAlCVUdfT04oZ2ljX25yID49IE1BWF9HSUNfTlIpOwogCiAJZ2ljID0gJmdpY19kYXRhW2dpY19ucl07CisJZG9tYWluID0gJmdpYy0+ZG9tYWluOwogCWdpYy0+ZGlzdF9iYXNlID0gZGlzdF9iYXNlOwogCWdpYy0+Y3B1X2Jhc2UgPSBjcHVfYmFzZTsKLQlnaWMtPmlycV9vZmZzZXQgPSAoaXJxX3N0YXJ0IC0gMSkgJiB+MzE7CiAKLQlpZiAoZ2ljX25yID09IDApCisJLyoKKwkgKiBGb3IgcHJpbWFyeSBHSUNzLCBza2lwIG92ZXIgU0dJcy4KKwkgKiBGb3Igc2Vjb25kYXJ5IEdJQ3MsIHNraXAgb3ZlciBQUElzLCB0b28uCisJICovCisJaWYgKGdpY19uciA9PSAwKSB7CiAJCWdpY19jcHVfYmFzZV9hZGRyID0gY3B1X2Jhc2U7CisJCWRvbWFpbi0+aHdpcnFfYmFzZSA9IDE2OworCQlpZiAoaXJxX3N0YXJ0ID4gMCkKKwkJCWlycV9zdGFydCA9IChpcnFfc3RhcnQgJiB+MzEpICsgMTY7CisJfSBlbHNlCisJCWRvbWFpbi0+aHdpcnFfYmFzZSA9IDMyOwogCi0JZ2ljX2Rpc3RfaW5pdChnaWMsIGlycV9zdGFydCk7CisJLyoKKwkgKiBGaW5kIG91dCBob3cgbWFueSBpbnRlcnJ1cHRzIGFyZSBzdXBwb3J0ZWQuCisJICogVGhlIEdJQyBvbmx5IHN1cHBvcnRzIHVwIHRvIDEwMjAgaW50ZXJydXB0IHNvdXJjZXMuCisJICovCisJZ2ljX2lycXMgPSByZWFkbF9yZWxheGVkKGRpc3RfYmFzZSArIEdJQ19ESVNUX0NUUikgJiAweDFmOworCWdpY19pcnFzID0gKGdpY19pcnFzICsgMSkgKiAzMjsKKwlpZiAoZ2ljX2lycXMgPiAxMDIwKQorCQlnaWNfaXJxcyA9IDEwMjA7CisJZ2ljLT5naWNfaXJxcyA9IGdpY19pcnFzOworCisJZG9tYWluLT5ucl9pcnEgPSBnaWNfaXJxcyAtIGRvbWFpbi0+aHdpcnFfYmFzZTsKKwlkb21haW4tPmlycV9iYXNlID0gaXJxX2FsbG9jX2Rlc2NzKGlycV9zdGFydCwgMTYsIGRvbWFpbi0+bnJfaXJxLAorCQkJCQkgICBudW1hX25vZGVfaWQoKSk7CisJaWYgKElTX0VSUl9WQUxVRShkb21haW4tPmlycV9iYXNlKSkgeworCQlXQVJOKDEsICJDYW5ub3QgYWxsb2NhdGUgaXJxX2Rlc2NzIEAgSVJRJWQsIGFzc3VtaW5nIHByZS1hbGxvY2F0ZWRcbiIsCisJCSAgICAgaXJxX3N0YXJ0KTsKKwkJZG9tYWluLT5pcnFfYmFzZSA9IGlycV9zdGFydDsKKwl9CisJZG9tYWluLT5wcml2ID0gZ2ljOworCWRvbWFpbi0+b3BzID0gJmdpY19pcnFfZG9tYWluX29wczsKKwlpcnFfZG9tYWluX2FkZChkb21haW4pOworCisJZ2ljX2NoaXAuZmxhZ3MgfD0gZ2ljX2FyY2hfZXh0bi5mbGFnczsKKwlnaWNfZGlzdF9pbml0KGdpYyk7CiAJZ2ljX2NwdV9pbml0KGdpYyk7CisJZ2ljX3BtX2luaXQoZ2ljKTsKIH0KIAogdm9pZCBfX2NwdWluaXQgZ2ljX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBnaWNfbnIpCkBAIC0zNzUsMTYgKzYyNCw2IEBACiAJZ2ljX2NwdV9pbml0KCZnaWNfZGF0YVtnaWNfbnJdKTsKIH0KIAotdm9pZCBfX2NwdWluaXQgZ2ljX2VuYWJsZV9wcGkodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlycV9zZXRfc3RhdHVzX2ZsYWdzKGlycSwgSVJRX05PUFJPQkUpOwotCWdpY191bm1hc2tfaXJxKGlycV9nZXRfaXJxX2RhdGEoaXJxKSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCiAjaWZkZWYgQ09ORklHX1NNUAogdm9pZCBnaWNfcmFpc2Vfc29mdGlycShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgdW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTQwNSwzICs2NDQsMzUgQEAKIAl3cml0ZWxfcmVsYXhlZChtYXAgPDwgMTYgfCBpcnEsIGdpY19kYXRhWzBdLmRpc3RfYmFzZSArIEdJQ19ESVNUX1NPRlRJTlQpOwogfQogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBpbnQgZ2ljX2NudCBfX2luaXRkYXRhID0gMDsKKworaW50IF9faW5pdCBnaWNfb2ZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQoreworCXZvaWQgX19pb21lbSAqY3B1X2Jhc2U7CisJdm9pZCBfX2lvbWVtICpkaXN0X2Jhc2U7CisJaW50IGlycTsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluID0gJmdpY19kYXRhW2dpY19jbnRdLmRvbWFpbjsKKworCWlmIChXQVJOX09OKCFub2RlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkaXN0X2Jhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKKwlXQVJOKCFkaXN0X2Jhc2UsICJ1bmFibGUgdG8gbWFwIGdpYyBkaXN0IHJlZ2lzdGVyc1xuIik7CisKKwljcHVfYmFzZSA9IG9mX2lvbWFwKG5vZGUsIDEpOworCVdBUk4oIWNwdV9iYXNlLCAidW5hYmxlIHRvIG1hcCBnaWMgY3B1IHJlZ2lzdGVyc1xuIik7CisKKwlkb21haW4tPm9mX25vZGUgPSBvZl9ub2RlX2dldChub2RlKTsKKworCWdpY19pbml0KGdpY19jbnQsIC0xLCBkaXN0X2Jhc2UsIGNwdV9iYXNlKTsKKworCWlmIChwYXJlbnQpIHsKKwkJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJCWdpY19jYXNjYWRlX2lycShnaWNfY250LCBpcnEpOworCX0KKwlnaWNfY250Kys7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYyBiL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYwppbmRleCBhNzkzNGJhLi5iNTM5ZWM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2l0ODE1Mi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pdDgxNTIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYyBiL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYwppbmRleCAwNTY5ZGU2Li42MTY5MWNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCkBAIC03MTgsNiArNzE4LDEwIEBACiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCisJcmV0ID0gY2xrX3ByZXBhcmUoc2FjaGlwLT5jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Nsa3B1dDsKKwogCXNwaW5fbG9ja19pbml0KCZzYWNoaXAtPmxvY2spOwogCiAJc2FjaGlwLT5kZXYgPSBtZTsKQEAgLTczMyw3ICs3MzcsNyBAQAogCXNhY2hpcC0+YmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgUEFHRV9TSVpFICogMik7CiAJaWYgKCFzYWNoaXAtPmJhc2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfY2xrcHV0OworCQlnb3RvIGVycl9jbGtfdW5wcmVwOwogCX0KIAogCS8qCkBAIC04MDksNiArODEzLDggQEAKIAogIGVycl91bm1hcDoKIAlpb3VubWFwKHNhY2hpcC0+YmFzZSk7CisgZXJyX2Nsa191bnByZXA6CisJY2xrX3VucHJlcGFyZShzYWNoaXAtPmNsayk7CiAgZXJyX2Nsa3B1dDoKIAljbGtfcHV0KHNhY2hpcC0+Y2xrKTsKICBlcnJfZnJlZToKQEAgLTgzNSw2ICs4NDEsNyBAQAogCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9XQUtFRU4xKTsKIAogCWNsa19kaXNhYmxlKHNhY2hpcC0+Y2xrKTsKKwljbGtfdW5wcmVwYXJlKHNhY2hpcC0+Y2xrKTsKIAogCWlmIChzYWNoaXAtPmlycSAhPSBOT19JUlEpIHsKIAkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoc2FjaGlwLT5pcnEsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMgYi9hcmNoL2FybS9jb21tb24vc2Nvb3AuYwppbmRleCBhMDdiMGU3Li4wYzYxNmQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2Nvb3AuYworKysgYi9hcmNoL2FybS9jb21tb24vc2Nvb3AuYwpAQCAtMTIsMTEgKzEyLDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgogCiAvKiBQQ01DSUEgdG8gU2Nvb3AgbGlua2FnZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3RpbWVyLXNwLmMgYi9hcmNoL2FybS9jb21tb24vdGltZXItc3AuYwppbmRleCA0MWRmNDc4Li4yMzkzYjViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vdGltZXItc3AuYworKysgYi9hcmNoL2FybS9jb21tb24vdGltZXItc3AuYwpAQCAtNDEsOSArNDEsMTcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAl9CiAKKwllcnIgPSBjbGtfcHJlcGFyZShjbGspOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJzcDgwNDogJXMgY2xvY2sgZmFpbGVkIHRvIHByZXBhcmU6ICVkXG4iLCBuYW1lLCBlcnIpOworCQljbGtfcHV0KGNsayk7CisJCXJldHVybiBlcnI7CisJfQorCiAJZXJyID0gY2xrX2VuYWJsZShjbGspOwogCWlmIChlcnIpIHsKIAkJcHJfZXJyKCJzcDgwNDogJXMgY2xvY2sgZmFpbGVkIHRvIGVuYWJsZTogJWRcbiIsIG5hbWUsIGVycik7CisJCWNsa191bnByZXBhcmUoY2xrKTsKIAkJY2xrX3B1dChjbGspOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTUyLDYgKzYwLDcgQEAKIAlpZiAocmF0ZSA8IDApIHsKIAkJcHJfZXJyKCJzcDgwNDogJXMgY2xvY2sgZmFpbGVkIHRvIGdldCByYXRlOiAlbGRcbiIsIG5hbWUsIHJhdGUpOwogCQljbGtfZGlzYWJsZShjbGspOworCQljbGtfdW5wcmVwYXJlKGNsayk7CiAJCWNsa19wdXQoY2xrKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXNhbTlnNDVfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9hdDkxc2FtOWc0NV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4NzZkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXNhbTlnNDVfZGVmY29uZmlnCkBAIC0wLDAgKzEsMjE0IEBACitDT05GSUdfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX0xCREFGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQVQ5MT15CitDT05GSUdfQVJDSF9BVDkxU0FNOUc0NT15CitDT05GSUdfTUFDSF9BVDkxU0FNOU0xMEc0NUVLPXkKK0NPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1M9eQorQ09ORklHX0FUOTFfU0xPV19DTE9DSz15CitDT05GSUdfQUVBQkk9eQorIyBDT05GSUdfT0FCSV9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19VQUNDRVNTX1dJVEhfTUVNQ1BZPXkKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im1lbT0xMjhNIGNvbnNvbGU9dHR5UzAsMTE1MjAwIGluaXRyZD0weDcxMTAwMDAwLDI1MTY1ODI0IHJvb3Q9L2Rldi9yYW0wIHJ3IgorQ09ORklHX0FVVE9fWlJFTEFERFI9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CitDT05GSUdfSVBWNj15CisjIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorQ09ORklHX0lQVjZfU0lUXzZSRD15CitDT05GSUdfQ0ZHODAyMTE9eQorQ09ORklHX0xJQjgwMjExPXkKK0NPTkZJR19NQUM4MDIxMT15CitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX0RFVlRNUEZTPXkKK0NPTkZJR19ERVZUTVBGU19NT1VOVD15CisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAorQ09ORklHX01URD15CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorQ09ORklHX01URF9EQVRBRkxBU0g9eQorQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfTkFORF9BVE1FTD15CitDT05GSUdfTVREX1VCST15CitDT05GSUdfQkxLX0RFVl9MT09QPXkKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9NAorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX01JU0NfREVWSUNFUz15CitDT05GSUdfQVRNRUxfUFdNPXkKK0NPTkZJR19BVE1FTF9UQ0xJQj15CitDT05GSUdfU0NTST15CitDT05GSUdfQkxLX0RFVl9TRD15CitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorIyBDT05GSUdfU0NTSV9MT1dMRVZFTCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfTUlJPXkKK0NPTkZJR19EQVZJQ09NX1BIWT15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NQUNCPXkKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CitDT05GSUdfTElCRVJUQVNfVEhJTkZJUk09bQorQ09ORklHX0xJQkVSVEFTX1RISU5GSVJNX1VTQj1tCitDT05GSUdfQVQ3NkM1MFhfVVNCPW0KK0NPTkZJR19VU0JfWkQxMjAxPW0KK0NPTkZJR19SVEw4MTg3PW0KK0NPTkZJR19BVEhfQ09NTU9OPW0KK0NPTkZJR19BVEg5Sz1tCitDT05GSUdfQ0FSTDkxNzA9bQorQ09ORklHX0I0Mz1tCitDT05GSUdfQjQzX1BIWV9OPXkKK0NPTkZJR19MSUJFUlRBUz1tCitDT05GSUdfTElCRVJUQVNfVVNCPW0KK0NPTkZJR19MSUJFUlRBU19TRElPPW0KK0NPTkZJR19MSUJFUlRBU19TUEk9bQorQ09ORklHX1JUMlgwMD1tCitDT05GSUdfUlQyNTAwVVNCPW0KK0NPTkZJR19SVDczVVNCPW0KK0NPTkZJR19SVDI4MDBVU0I9bQorQ09ORklHX1JUMjgwMFVTQl9SVDUzWFg9eQorQ09ORklHX1JUMjgwMFVTQl9VTktOT1dOPXkKK0NPTkZJR19SVEw4MTkyQ1U9bQorQ09ORklHX1dMMTI1MT1tCitDT05GSUdfV0wxMjUxX1NESU89bQorQ09ORklHX1dMMTJYWF9NRU5VPW0KK0NPTkZJR19XTDEyWFg9bQorQ09ORklHX1dMMTJYWF9TRElPPW0KK0NPTkZJR19aRDEyMTFSVz1tCitDT05GSUdfTVdJRklFWD1tCitDT05GSUdfTVdJRklFWF9TRElPPW0KK0NPTkZJR19JTlBVVF9QT0xMREVWPW0KKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD00ODAKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT0yNzIKK0NPTkZJR19JTlBVVF9KT1lERVY9eQorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0tFWUJPQVJEX0FUS0JEIGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9RVDEwNzA9bQorQ09ORklHX0tFWUJPQVJEX1FUMjE2MD1tCitDT05GSUdfS0VZQk9BUkRfR1BJTz15CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorQ09ORklHX1RPVUNIU0NSRUVOX0FUTUVMX01YVD1tCitDT05GSUdfVE9VQ0hTQ1JFRU5fQVRNRUxfVFNBRENDPXkKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTQKK0NPTkZJR19TRVJJQUxfQVRNRUw9eQorQ09ORklHX1NFUklBTF9BVE1FTF9DT05TT0xFPXkKK0NPTkZJR19IV19SQU5ET009eQorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0dQSU89eQorQ09ORklHX1NQST15CitDT05GSUdfU1BJX0FUTUVMPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19GQj15CitDT05GSUdfRkJfQVRNRUw9eQorQ09ORklHX0ZCX1VETD1tCitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKKyMgQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQorQ09ORklHX0JBQ0tMSUdIVF9BVE1FTF9MQ0RDPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSPXkKK0NPTkZJR19TTkRfTUlYRVJfT1NTPXkKK0NPTkZJR19TTkRfUENNX09TUz15CisjIENPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRFJJVkVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVJNIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQVRNRUxfQUM5N0M9eQorIyBDT05GSUdfU05EX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1VTQl9BVURJTz1tCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUz15CitDT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MgaXMgbm90IHNldAorQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX09IQ0lfSENEPXkKK0NPTkZJR19VU0JfQUNNPXkKK0NPTkZJR19VU0JfU1RPUkFHRT15CitDT05GSUdfVVNCX0dBREdFVD15CitDT05GSUdfVVNCX0FUTUVMX1VTQkE9bQorQ09ORklHX1VTQl9aRVJPPW0KK0NPTkZJR19VU0JfQVVESU89bQorQ09ORklHX1VTQl9FVEg9bQorQ09ORklHX1VTQl9FVEhfRUVNPXkKK0NPTkZJR19VU0JfTUFTU19TVE9SQUdFPW0KK0NPTkZJR19VU0JfR19TRVJJQUw9bQorQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFPW0KK0NPTkZJR19VU0JfR19NVUxUST1tCitDT05GSUdfVVNCX0dfTVVMVElfQ0RDPXkKK0NPTkZJR19NTUM9eQorIyBDT05GSUdfTU1DX0JMT0NLX0JPVU5DRSBpcyBub3Qgc2V0CitDT05GSUdfU0RJT19VQVJUPW0KK0NPTkZJR19NTUNfQVRNRUxNQ0k9eQorQ09ORklHX01NQ19BVE1FTE1DSV9ETUE9eQorQ09ORklHX0xFRFNfQVRNRUxfUFdNPXkKK0NPTkZJR19MRURTX0dQSU89eQorQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj15CitDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD15CitDT05GSUdfTEVEU19UUklHR0VSX0dQSU89eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0RSVl9BVDkxUk05MjAwPXkKK0NPTkZJR19ETUFERVZJQ0VTPXkKK0NPTkZJR19BVF9IRE1BQz15CitDT05GSUdfRE1BVEVTVD1tCisjIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19GQU5PVElGWT15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9TVU1NQVJZPXkKK0NPTkZJR19DUkFNRlM9bQorQ09ORklHX1NRVUFTSEZTPW0KK0NPTkZJR19TUVVBU0hGU19FTUJFRERFRD15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX1NUUklQX0FTTV9TWU1TPXkKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1VTRVI9eQorQ09ORklHX0NSWVBUT19FQ0I9eQorIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KK0NPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQorIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zNF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2V4eW5vczRfZGVmY29uZmlnCmluZGV4IGRhNTNmZjMuLmJmZmU2OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zNF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9leHlub3M0X2RlZmNvbmZpZwpAQCAtNCwxOCArNCwxOCBAQAogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfRVhZTk9TND15CitDT05GSUdfQVJDSF9FWFlOT1M9eQogQ09ORklHX1MzQ19MT1dMRVZFTF9VQVJUX1BPUlQ9MQogQ09ORklHX01BQ0hfU01ES0MyMTA9eQotQ09ORklHX01BQ0hfU01ES1YzMTA9eQogQ09ORklHX01BQ0hfQVJNTEVYNDIxMD15CiBDT05GSUdfTUFDSF9VTklWRVJTQUxfQzIxMD15CiBDT05GSUdfTUFDSF9OVVJJPXkKK0NPTkZJR19NQUNIX09SSUdFTj15CitDT05GSUdfTUFDSF9TTURLNDQxMj15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CiBDT05GSUdfU01QPXkKIENPTkZJR19OUl9DUFVTPTIKLUNPTkZJR19IT1RQTFVHX0NQVT15CiBDT05GSUdfUFJFRU1QVD15CiBDT05GSUdfQUVBQkk9eQogQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9yYW0wIHJ3IHJhbWRpc2s9ODE5MiBpbml0cmQ9MHg0MTAwMDAwMCw4TSBjb25zb2xlPXR0eVNBQzEsMTE1MjAwIGluaXQ9L2xpbnV4cmMgbWVtPTI1Nk0iCkBAIC02MCwxMyArNjAsOSBAQAogQ09ORklHX0RFQlVHX1JUX01VVEVYRVM9eQogQ09ORklHX0RFQlVHX1NQSU5MT0NLPXkKIENPTkZJR19ERUJVR19NVVRFWEVTPXkKLUNPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUD15CiBDT05GSUdfREVCVUdfSU5GTz15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiBDT05GSUdfREVCVUdfVVNFUj15Ci1DT05GSUdfREVCVUdfRVJST1JTPXkKIENPTkZJR19ERUJVR19MTD15CiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKLUNPTkZJR19ERUJVR19TM0NfVUFSVD0xCiBDT05GSUdfQ1JDX0NDSVRUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaW14X3Y0X3Y1X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW14X3Y0X3Y1X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWE0MTkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9pbXhfdjRfdjVfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTcwIEBACitDT05GSUdfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0VYUEVSVD15CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX09QUk9GSUxFPXkKK0NPTkZJR19LUFJPQkVTPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfTVhDPXkKK0NPTkZJR19BUkNIX0lNWF9WNF9WNT15CitDT05GSUdfQVJDSF9NWDFBRFM9eQorQ09ORklHX01BQ0hfU0NCOTMyOD15CitDT05GSUdfTUFDSF9NWDIxQURTPXkKK0NPTkZJR19NQUNIX01YMjVfM0RTPXkKK0NPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVgyNT15CitDT05GSUdfTUFDSF9NWDI3QURTPXkKK0NPTkZJR19NQUNIX1BDTTAzOD15CitDT05GSUdfTUFDSF9DUFVJTVgyNz15CitDT05GSUdfTUFDSF9FVUtSRUFfQ1BVSU1YMjdfVVNFU0RIQzI9eQorQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDI3X1VTRVVBUlQ0PXkKK0NPTkZJR19NQUNIX01YMjdfM0RTPXkKK0NPTkZJR19NQUNIX0lNWDI3X1ZJU1NUUklNX00xMD15CitDT05GSUdfTUFDSF9JTVgyN0xJVEU9eQorQ09ORklHX01BQ0hfUENBMTAwPXkKK0NPTkZJR19NQUNIX01YVF9URDYwPXkKK0NPTkZJR19NQUNIX0lNWDI3SVBDQU09eQorQ09ORklHX01YQ19JUlFfUFJJT1I9eQorQ09ORklHX01YQ19QV009eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX0FFQUJJPXkKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0ZQRV9OV0ZQRT15CitDT05GSUdfRlBFX05XRlBFX1hQPXkKK0NPTkZJR19QTV9ERUJVRz15CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19ERVZUTVBGUz15CitDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQorQ09ORklHX01URD15CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfR0VPTUVUUlk9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfVUJJPXkKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorQ09ORklHX0VFUFJPTV9BVDI0PXkKK0NPTkZJR19FRVBST01fQVQyNT15CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19TTUM5MVg9eQorQ09ORklHX0RNOTAwMD15CitDT05GSUdfU01DOTExWD15CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CitDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0Nj1tCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTA9bQorQ09ORklHX1NFUklBTF9JTVg9eQorQ09ORklHX1NFUklBTF9JTVhfQ09OU09MRT15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0kyQ19JTVg9eQorQ09ORklHX1NQST15CitDT05GSUdfU1BJX0lNWD15CitDT05GSUdfVzE9eQorQ09ORklHX1cxX01BU1RFUl9NWEM9eQorQ09ORklHX1cxX1NMQVZFX1RIRVJNPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfSU1YMl9XRFQ9eQorQ09ORklHX01GRF9NQzEzWFhYPXkKK0NPTkZJR19SRUdVTEFUT1I9eQorQ09ORklHX1JFR1VMQVRPUl9NQzEzNzgzPXkKK0NPTkZJR19SRUdVTEFUT1JfTUMxMzg5Mj15CitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0lNWD15CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKK0NPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPXkKK0NPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPXkKK0NPTkZJR19CQUNLTElHSFRfUFdNPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GT05UUz15CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0xPR089eQorQ09ORklHX1NPVU5EPXkKK0NPTkZJR19TTkQ9eQorIyBDT05GSUdfU05EX0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU09DPXkKK0NPTkZJR19TTkRfSU1YX1NPQz15CitDT05GSUdfU05EX1NPQ19NWDI3VklTX0FJQzMyWDQ9eQorQ09ORklHX1NORF9TT0NfUEhZQ09SRV9BQzk3PXkKK0NPTkZJR19TTkRfU09DX0VVS1JFQV9UTFYzMjA9eQorQ09ORklHX1VTQl9ISUQ9bQorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9eQorQ09ORklHX1VTQl9FSENJX01YQz15CitDT05GSUdfVVNCX1VMUEk9eQorQ09ORklHX01NQz15CitDT05GSUdfTU1DX01YQz15CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9eQorQ09ORklHX0xFRFNfTUMxMzc4Mz15CitDT05GSUdfTEVEU19UUklHR0VSUz15CitDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfQkFDS0xJR0hUPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfR1BJTz15CitDT05GSUdfTEVEU19UUklHR0VSX0RFRkFVTFRfT049eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzPXkKK0NPTkZJR19SVENfRFJWX0lNWERJPXkKK0NPTkZJR19SVENfTVhDPXkKK0NPTkZJR19ETUFERVZJQ0VTPXkKK0NPTkZJR19JTVhfU0RNQT15CitDT05GSUdfSU1YX0RNQT15CisjIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJPQ19QQUdFX01PTklUT1IgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfVUJJRlNfRlM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCitDT05GSUdfTkxTX0NPREVQQUdFXzg1MD1tCitDT05GSUdfTkxTX0lTTzg4NTlfMT15CitDT05GSUdfTkxTX0lTTzg4NTlfMTU9bQorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXgxX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MzZkMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL214MV9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19JS0NPTkZJRz15Ci1DT05GSUdfSUtDT05GSUdfUFJPQz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQotQ09ORklHX0VYUEVSVD15Ci1DT05GSUdfU0xBQj15Ci1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci1DT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15Ci1DT05GSUdfTU9EVkVSU0lPTlM9eQotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfTVhDPXkKLUNPTkZJR19BUkNIX01YMT15Ci1DT05GSUdfQVJDSF9NWDFBRFM9eQotQ09ORklHX01BQ0hfU0NCOTMyOD15Ci1DT05GSUdfTUFDSF9BUEY5MzI4PXkKLUNPTkZJR19NWENfSVJRX1BSSU9SPXkKLUNPTkZJR19OT19IWj15Ci1DT05GSUdfSElHSF9SRVNfVElNRVJTPXkKLUNPTkZJR19QUkVFTVBUPXkKLUNPTkZJR19BRUFCST15Ci1DT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCi1DT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKLUNPTkZJR19DTURMSU5FPSJub2luaXRyZCBjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9tdGRibG9jazIgcncgaXA9b2ZmIgotQ09ORklHX1BNPXkKLUNPTkZJR19QTV9ERUJVRz15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLUNPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCi1DT05GSUdfRldfTE9BREVSPW0KLUNPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLUNPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTE9DSz15Ci1DT05GSUdfTVREX0NGST15Ci1DT05GSUdfTVREX1BIWVNNQVA9eQotIyBDT05GSUdfQkxLX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX1BIWUxJQj15Ci1DT05GSUdfU01TQ19QSFk9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfRE05MDAwPXkKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX0lNWD15Ci1DT05GSUdfU0VSSUFMX0lNWF9DT05TT0xFPXkKLSMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj15Ci1DT05GSUdfSTJDX0lNWD15Ci1DT05GSUdfVzE9eQotQ09ORklHX1cxX01BU1RFUl9NWEM9eQotQ09ORklHX1cxX1NMQVZFX1RIRVJNPXkKLSMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19GQj15Ci1DT05GSUdfVVNCX0dBREdFVD15Ci1DT05GSUdfVVNCX0dBREdFVF9JTVg9eQotQ09ORklHX1VTQl9FVEg9bQotQ09ORklHX01NQz15Ci1DT05GSUdfTU1DX01YQz15Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKLUNPTkZJR19JTk9USUZZPXkKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfSkZGUzJfRlM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ORlNfVjQ9eQotQ09ORklHX1JPT1RfTkZTPXkKLSMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAotIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQotIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDIxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXgyMV9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMWY4OGQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9teDIxX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAotQ09ORklHX0VYUEVSVD15Ci1DT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15Ci1DT05GSUdfU0xBQj15Ci1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX01YQz15Ci1DT05GSUdfQVJDSF9NWDI9eQotQ09ORklHX01BQ0hfTVgyMUFEUz15Ci1DT05GSUdfTVhDX1BXTT15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfUFJFRU1QVD15Ci1DT05GSUdfQUVBQkk9eQotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfTkVUPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0Ci1DT05GSUdfTVREPXkKLUNPTkZJR19NVERfREVCVUc9eQotQ09ORklHX01URF9ERUJVR19WRVJCT1NFPTMKLUNPTkZJR19NVERfUEFSVElUSU9OUz15Ci1DT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQotQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKLUNPTkZJR19NVERfQ0hBUj15Ci1DT05GSUdfTVREX0JMT0NLPXkKLUNPTkZJR19NVERfQ0ZJPXkKLUNPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKLUNPTkZJR19NVERfQ0ZJX0dFT01FVFJZPXkKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0FNRFNURD15Ci1DT05GSUdfTVREX1BIWVNNQVA9eQotQ09ORklHX01URF9OQU5EPXkKLUNPTkZJR19NVERfTkFORF9NWEM9eQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPXkKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfRVZERVY9eQotIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MQotQ09ORklHX1NFUklBTF9JTVg9eQotQ09ORklHX1NFUklBTF9JTVhfQ09OU09MRT15Ci0jIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotQ09ORklHX0kyQz15Ci1DT05GSUdfSTJDX0NIQVJERVY9eQotQ09ORklHX0kyQ19JTVg9eQotQ09ORklHX1NQST15Ci0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci1DT05GSUdfRkI9eQotQ09ORklHX0ZCX0lNWD15Ci0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15Ci1DT05GSUdfRk9OVFM9eQotQ09ORklHX0ZPTlRfOHg4PXkKLUNPTkZJR19MT0dPPXkKLSMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19NTUM9eQotQ09ORklHX01NQ19NWEM9eQotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfRlM9eQotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19KRkZTMl9GUz15Ci1DT05GSUdfTkZTX0ZTPXkKLUNPTkZJR19ORlNfVjM9eQotQ09ORklHX1JPT1RfTkZTPXkKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKLSMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgyN19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL214MjdfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWQ0YzY1Ni4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL214MjdfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfUE9TSVhfTVFVRVVFPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfRVhQRVJUPXkKLUNPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKLSMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAotQ09ORklHX1NMQUI9eQotQ09ORklHX1BST0ZJTElORz15Ci1DT05GSUdfT1BST0ZJTEU9eQotQ09ORklHX0tQUk9CRVM9eQotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9NWEM9eQotQ09ORklHX0FSQ0hfTVgyPXkKLUNPTkZJR19NQUNIX01YMjc9eQotQ09ORklHX01BQ0hfTVgyN0FEUz15Ci1DT05GSUdfTUFDSF9QQ00wMzg9eQotQ09ORklHX01BQ0hfQ1BVSU1YMjc9eQotQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDI3X1VTRVNESEMyPXkKLUNPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVgyN19VU0VVQVJUND15Ci1DT05GSUdfTUFDSF9NWDI3XzNEUz15Ci1DT05GSUdfTUFDSF9JTVgyN19WSVNTVFJJTV9NMTA9eQotQ09ORklHX01BQ0hfSU1YMjdMSVRFPXkKLUNPTkZJR19NQUNIX1BDQTEwMD15Ci1DT05GSUdfTUFDSF9NWFRfVEQ2MD15Ci1DT05GSUdfTVhDX0lSUV9QUklPUj15Ci1DT05GSUdfTVhDX1BXTT15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfUFJFRU1QVD15Ci1DT05GSUdfQUVBQkk9eQotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfRlBFX05XRlBFPXkKLUNPTkZJR19GUEVfTldGUEVfWFA9eQotQ09ORklHX1BNPXkKLUNPTkZJR19QTV9ERUJVRz15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLUNPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLUNPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTE9DSz15Ci1DT05GSUdfTVREX0NGST15Ci1DT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15Ci1DT05GSUdfTVREX0NGSV9HRU9NRVRSWT15Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0kyIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKLUNPTkZJR19NVERfUEhZU01BUD15Ci1DT05GSUdfTVREX05BTkQ9eQotQ09ORklHX01URF9OQU5EX01YQz15Ci1DT05GSUdfTVREX1VCST15Ci1DT05GSUdfRUVQUk9NX0FUMjQ9eQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfRkVDPXkKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfRVZERVY9eQotIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKLUNPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2PW0KLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfODI1MD1tCi1DT05GSUdfU0VSSUFMX0lNWD15Ci1DT05GSUdfU0VSSUFMX0lNWF9DT05TT0xFPXkKLSMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj15Ci1DT05GSUdfSTJDX0lNWD15Ci1DT05GSUdfU1BJPXkKLUNPTkZJR19TUElfSU1YPXkKLUNPTkZJR19XMT15Ci1DT05GSUdfVzFfTUFTVEVSX01YQz15Ci1DT05GSUdfVzFfU0xBVkVfVEhFUk09eQotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotQ09ORklHX0ZCPXkKLUNPTkZJR19GQl9JTVg9eQotQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQotQ09ORklHX0ZPTlRTPXkKLUNPTkZJR19GT05UXzh4OD15Ci0jIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCPW0KLSMgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MgaXMgbm90IHNldAotQ09ORklHX1VTQl9VTFBJPXkKLUNPTkZJR19NTUM9eQotQ09ORklHX01NQ19NWEM9eQotQ09ORklHX1JUQ19DTEFTUz15Ci1DT05GSUdfUlRDX0RSVl9QQ0Y4NTYzPXkKLSMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAotIyBDT05GSUdfUFJPQ19QQUdFX01PTklUT1IgaXMgbm90IHNldAotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19KRkZTMl9GUz15Ci1DT05GSUdfVUJJRlNfRlM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTkxTPXkKLUNPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KLUNPTkZJR19OTFNfSVNPODg1OV8xPXkKLUNPTkZJR19OTFNfSVNPODg1OV8xNT1tCi1DT05GSUdfREVCVUdfRlM9eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQotIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDNfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9teDNfZGVmY29uZmlnCmluZGV4IDdjNGIzMGIuLmNiMDcxN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgzX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL214M19kZWZjb25maWcKQEAgLTMsNyArMyw2IEBACiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19FWFBFUlQ9eQogQ09ORklHX1NMQUI9eQogQ09ORklHX01PRFVMRVM9eQpAQCAtMTMsMjAgKzEyLDIxIEBACiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9NWEM9eQogQ09ORklHX01BQ0hfTVgzMUFEU19XTTExMzNfRVYxPXkKK0NPTkZJR19NQUNIX01YMzFMSUxMWT15CitDT05GSUdfTUFDSF9NWDMxTElURT15CiBDT05GSUdfTUFDSF9QQ00wMzc9eQogQ09ORklHX01BQ0hfUENNMDM3X0VFVD15Ci1DT05GSUdfTUFDSF9NWDMxTElURT15CiBDT05GSUdfTUFDSF9NWDMxXzNEUz15CiBDT05GSUdfTUFDSF9NWDMxTU9CT0FSRD15Ci1DT05GSUdfTUFDSF9NWDMxTElMTFk9eQogQ09ORklHX01BQ0hfUU9ORz15Ci1DT05GSUdfTUFDSF9QQ00wNDM9eQogQ09ORklHX01BQ0hfQVJNQURJTExPNVgwPXkKLUNPTkZJR19NQUNIX01YMzVfM0RTPXkKIENPTkZJR19NQUNIX0taTV9BUk0xMV8wMT15CitDT05GSUdfTUFDSF9QQ00wNDM9eQorQ09ORklHX01BQ0hfTVgzNV8zRFM9eQogQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDM1PXkKIENPTkZJR19NWENfSVJRX1BSSU9SPXkKIENPTkZJR19NWENfUFdNPXkKK0NPTkZJR19BUk1fRVJSQVRBXzQxMTkyMD15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CiBDT05GSUdfUFJFRU1QVD15CkBAIC0zNSw3ICszNSw2IEBACiBDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKIENPTkZJR19DTURMSU5FPSJub2luaXRyZCBjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9tdGRibG9jazIgcncgaXA9b2ZmIgogQ09ORklHX1ZGUD15Ci1DT05GSUdfUE09eQogQ09ORklHX1BNX0RFQlVHPXkKIENPTkZJR19ORVQ9eQogQ09ORklHX1BBQ0tFVD15CkBAIC01Miw3ICs1MSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0ZXX0xPQURFUj1tCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpAQCAtNjIsMjQgKzYwLDI3IEBACiBDT05GSUdfTVREX05BTkRfTVhDPXkKIENPTkZJR19NVERfVUJJPXkKICMgQ09ORklHX0JMS19ERVYgaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CiBDT05GSUdfRUVQUk9NX0FUMjQ9eQogQ09ORklHX05FVERFVklDRVM9eQogQ09ORklHX1NNU0NfUEhZPXkKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX1NNU0M5MTFYPXkKIENPTkZJR19ETkVUPXkKLUNPTkZJR19GRUM9eQogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0FUS0JEIGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9JTVg9eQorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAogIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF84MjUwPW0KIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CiBDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKIENPTkZJR19TRVJJQUxfSU1YPXkKIENPTkZJR19TRVJJQUxfSU1YX0NPTlNPTEU9eQotIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19DSEFSREVWPXkKQEAgLTg5LDEyICs5MCwxNSBAQAogQ09ORklHX1cxX01BU1RFUl9NWEM9eQogQ09ORklHX1cxX1NMQVZFX1RIRVJNPXkKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfSU1YMl9XRFQ9eQogQ09ORklHX01GRF9XTTgzNTBfSTJDPXkKIENPTkZJR19SRUdVTEFUT1I9eQogQ09ORklHX1JFR1VMQVRPUl9XTTgzNTA9eQogQ09ORklHX01FRElBX1NVUFBPUlQ9eQogQ09ORklHX1ZJREVPX0RFVj15Ci0jIENPTkZJR19WSURFT19BTExPV19WNEwxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUVESUFfVFVORVJfQ1VTVE9NSVNFIGlzIG5vdCBzZXQKIENPTkZJR19TT0NfQ0FNRVJBPXkKIENPTkZJR19TT0NfQ0FNRVJBX01UOU0wMDE9eQogQ09ORklHX1NPQ19DQU1FUkFfTVQ5TTExMT15CkBAIC0xMDUsOSArMTA5LDI2IEBACiBDT05GSUdfVklERU9fTVgzPXkKICMgQ09ORklHX1JBRElPX0FEQVBURVJTIGlzIG5vdCBzZXQKIENPTkZJR19GQj15Ci0jIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkQ9eQorQ09ORklHX1NORD15CisjIENPTkZJR19TTkRfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TUEkgaXMgbm90IHNldAorQ09ORklHX1NORF9TT0M9eQorQ09ORklHX1NORF9JTVhfU09DPXkKK0NPTkZJR19TTkRfTVhDX1NPQ19XTTExMzNfRVYxPXkKK0NPTkZJR19TTkRfU09DX1BIWUNPUkVfQUM5Nz15CitDT05GSUdfU05EX1NPQ19FVUtSRUFfVExWMzIwPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX0VIQ0lfTVhDPXkKK0NPTkZJR19VU0JfR0FER0VUPW0KK0NPTkZJR19VU0JfRlNMX1VTQjI9bQorQ09ORklHX1VTQl9HX1NFUklBTD1tCitDT05GSUdfVVNCX1VMUEk9eQogQ09ORklHX01NQz15CiBDT05GSUdfTU1DX01YQz15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfTVhDPXkKIENPTkZJR19ETUFERVZJQ0VTPXkKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX1RNUEZTPXkKQEAgLTExOSw2ICsxNDAsNSBAQAogQ09ORklHX1JPT1RfTkZTPXkKICMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDUxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXg1MV9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzU4MDIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9teDUxX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLSMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE4Ci1DT05GSUdfUkVMQVk9eQotQ09ORklHX0VYUEVSVD15Ci0jIENPTkZJR19TTFVCX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotQ09ORklHX01PRFZFUlNJT05TPXkKLUNPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQotIyBDT05GSUdfTEJEQUYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfTVhDPXkKLUNPTkZJR19BUkNIX01YNTE9eQotQ09ORklHX01BQ0hfTVg1MV9CQUJCQUdFPXkKLUNPTkZJR19NQUNIX01YNTFfM0RTPXkKLUNPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVg1MT15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQotQ09ORklHX0FFQUJJPXkKLSMgQ09ORklHX09BQklfQ09NUEFUIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9MzI3NjgKLUNPTkZJR19DTURMSU5FPSJub2luaXRyZCBjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xOTIuMTY4LjAuMTAxOi9zaGFyZWQvbmZzIGlwPWRoY3AiCi1DT05GSUdfVkZQPXkKLUNPTkZJR19ORU9OPXkKLUNPTkZJR19CSU5GTVRfTUlTQz1tCi1DT05GSUdfUE09eQotQ09ORklHX1BNX0RFQlVHPXkKLUNPTkZJR19QTV9URVNUX1NVU1BFTkQ9eQotQ09ORklHX05FVD15Ci1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19VTklYPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAotQ09ORklHX0NPTk5FQ1RPUj15Ci1DT05GSUdfQkxLX0RFVl9MT09QPXkKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT02NTUzNgotIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJPXkKLSMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfU0NTSV9NVUxUSV9MVU49eQotQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKLUNPTkZJR19TQ1NJX0xPR0dJTkc9eQotQ09ORklHX1NDU0lfU0NBTl9BU1lOQz15Ci0jIENPTkZJR19TQ1NJX0xPV0xFVkVMIGlzIG5vdCBzZXQKLUNPTkZJR19BVEE9bQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX01BUlZFTExfUEhZPXkKLUNPTkZJR19EQVZJQ09NX1BIWT15Ci1DT05GSUdfUVNFTUlfUEhZPXkKLUNPTkZJR19MWFRfUEhZPXkKLUNPTkZJR19DSUNBREFfUEhZPXkKLUNPTkZJR19WSVRFU1NFX1BIWT15Ci1DT05GSUdfU01TQ19QSFk9eQotQ09ORklHX0JST0FEQ09NX1BIWT15Ci1DT05GSUdfSUNQTFVTX1BIWT15Ci1DT05GSUdfUkVBTFRFS19QSFk9eQotQ09ORklHX05BVElPTkFMX1BIWT15Ci1DT05GSUdfU1RFMTBYUD15Ci1DT05GSUdfTFNJX0VUMTAxMUNfUEhZPXkKLUNPTkZJR19NRElPX0JJVEJBTkc9eQotQ09ORklHX01ESU9fR1BJTz15Ci1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19NSUk9bQotQ09ORklHX0ZFQz15Ci0jIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfRkZfTUVNTEVTUz1tCi0jIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfRVZERVY9eQotQ09ORklHX0tFWUJPQVJEX0dQSU89eQotQ09ORklHX0lOUFVUX0VWQlVHPW0KLUNPTkZJR19NT1VTRV9QUzI9bQotQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSD15Ci1DT05GSUdfU0VSSU9fU0VSUE9SVD1tCi1DT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKLSMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAotQ09ORklHX1NFUklBTF9JTVg9eQotQ09ORklHX1NFUklBTF9JTVhfQ09OU09MRT15Ci0jIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0Ci1DT05GSUdfSFdfUkFORE9NPXkKLUNPTkZJR19JMkM9eQotIyBDT05GSUdfSTJDX0NPTVBBVCBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX0NIQVJERVY9bQotIyBDT05GSUdfSTJDX0hFTFBFUl9BVVRPIGlzIG5vdCBzZXQKLUNPTkZJR19JMkNfQUxHT0JJVD1tCi1DT05GSUdfSTJDX0FMR09QQ0Y9bQotQ09ORklHX0kyQ19BTEdPUENBPW0KLUNPTkZJR19HUElPX1NZU0ZTPXkKLSMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19VU0I9eQotQ09ORklHX1VTQl9FSENJX0hDRD15Ci1DT05GSUdfVVNCX0VIQ0lfTVhDPXkKLUNPTkZJR19VU0JfU1RPUkFHRT15Ci1DT05GSUdfTU1DPXkKLUNPTkZJR19NTUNfQkxPQ0s9bQotQ09ORklHX01NQ19TREhDST1tCi1DT05GSUdfTkVXX0xFRFM9eQotQ09ORklHX0xFRFNfQ0xBU1M9eQotQ09ORklHX1JUQ19DTEFTUz15Ci1DT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMPXkKLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19FWFQyX0ZTX1hBVFRSPXkKLUNPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfRVhUMl9GU19TRUNVUklUWT15Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQotQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQotQ09ORklHX0VYVDRfRlM9eQotQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZPXkKLUNPTkZJR19RVU9UQT15Ci1DT05GSUdfUVVPVEFfTkVUTElOS19JTlRFUkZBQ0U9eQotIyBDT05GSUdfUFJJTlRfUVVPVEFfV0FSTklORyBpcyBub3Qgc2V0Ci1DT05GSUdfQVVUT0ZTX0ZTPXkKLUNPTkZJR19BVVRPRlM0X0ZTPXkKLUNPTkZJR19GVVNFX0ZTPXkKLUNPTkZJR19JU085NjYwX0ZTPW0KLUNPTkZJR19KT0xJRVQ9eQotQ09ORklHX1pJU09GUz15Ci1DT05GSUdfVURGX0ZTPW0KLUNPTkZJR19NU0RPU19GUz1tCi1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX0NPTkZJR0ZTX0ZTPW0KLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci1DT05GSUdfTkZTX1YzX0FDTD15Ci1DT05GSUdfTkZTX1Y0PXkKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9ImNwNDM3IgotQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQotQ09ORklHX05MU19BU0NJST15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMT15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMTU9bQotQ09ORklHX05MU19VVEY4PXkKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci1DT05GSUdfREVCVUdfRlM9eQotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci0jIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTV9VTldJTkQgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0xMPXkKLUNPTkZJR19FQVJMWV9QUklOVEs9eQotQ09ORklHX1NFQ1VSSVRZRlM9eQotQ09ORklHX0NSWVBUT19ERUZMQVRFPXkKLUNPTkZJR19DUllQVE9fTFpPPXkKLSMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX0NDSVRUPW0KLUNPTkZJR19DUkNfVDEwRElGPXkKLUNPTkZJR19DUkM3PW0KLUNPTkZJR19MSUJDUkMzMkM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDVfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9teDVfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDhkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL214NV9kZWZjb25maWcKQEAgLTAsMCArMSwxODQgQEAKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0tFUk5FTF9MWk89eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTgKK0NPTkZJR19SRUxBWT15CitDT05GSUdfRVhQRVJUPXkKKyMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9NWEM9eQorQ09ORklHX0FSQ0hfTVg1PXkKK0NPTkZJR19NQUNIX01YNTFfQkFCQkFHRT15CitDT05GSUdfTUFDSF9NWDUxXzNEUz15CitDT05GSUdfTUFDSF9FVUtSRUFfQ1BVSU1YNTE9eQorQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDUxU0Q9eQorQ09ORklHX01BQ0hfTVg1MV9FRklLQU1YPXkKK0NPTkZJR19NQUNIX01YNTFfRUZJS0FTQj15CitDT05GSUdfTUFDSF9NWDUzX0VWSz15CitDT05GSUdfTUFDSF9NWDUzX1NNRD15CitDT05GSUdfTUFDSF9NWDUzX0xPQ089eQorQ09ORklHX01BQ0hfTVg1M19BUkQ9eQorQ09ORklHX01YQ19QV009eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX1ZNU1BMSVRfMkc9eQorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKK0NPTkZJR19BRUFCST15CisjIENPTkZJR19PQUJJX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTMyNzY4CitDT05GSUdfQ01ETElORT0ibm9pbml0cmQgY29uc29sZT10dHlteGMwLDExNTIwMCIKK0NPTkZJR19WRlA9eQorQ09ORklHX05FT049eQorQ09ORklHX0JJTkZNVF9NSVNDPW0KK0NPTkZJR19QTV9ERUJVRz15CitDT05GSUdfUE1fVEVTVF9TVVNQRU5EPXkKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfVU5JWD15CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQorQ09ORklHX0RFVlRNUEZTX01PVU5UPXkKKyMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAorQ09ORklHX0NPTk5FQ1RPUj15CitDT05GSUdfQkxLX0RFVl9MT09QPXkKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT02NTUzNgorIyBDT05GSUdfU0NTSV9QUk9DX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CitDT05GSUdfU0NTSV9DT05TVEFOVFM9eQorQ09ORklHX1NDU0lfTE9HR0lORz15CitDT05GSUdfU0NTSV9TQ0FOX0FTWU5DPXkKKyMgQ09ORklHX1NDU0lfTE9XTEVWRUwgaXMgbm90IHNldAorQ09ORklHX0FUQT15CitDT05GSUdfUEFUQV9JTVg9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX01JST1tCitDT05GSUdfTUFSVkVMTF9QSFk9eQorQ09ORklHX0RBVklDT01fUEhZPXkKK0NPTkZJR19RU0VNSV9QSFk9eQorQ09ORklHX0xYVF9QSFk9eQorQ09ORklHX0NJQ0FEQV9QSFk9eQorQ09ORklHX1ZJVEVTU0VfUEhZPXkKK0NPTkZJR19TTVNDX1BIWT15CitDT05GSUdfQlJPQURDT01fUEhZPXkKK0NPTkZJR19JQ1BMVVNfUEhZPXkKK0NPTkZJR19SRUFMVEVLX1BIWT15CitDT05GSUdfTkFUSU9OQUxfUEhZPXkKK0NPTkZJR19TVEUxMFhQPXkKK0NPTkZJR19MU0lfRVQxMDExQ19QSFk9eQorQ09ORklHX01JQ1JFTF9QSFk9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorQ09ORklHX0lOUFVUX0VWQlVHPW0KK0NPTkZJR19LRVlCT0FSRF9HUElPPXkKK0NPTkZJR19NT1VTRV9QUzI9bQorQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSD15CitDT05GSUdfSU5QVVRfTUlTQz15CitDT05GSUdfSU5QVVRfTU1BODQ1MD15CitDT05GSUdfU0VSSU9fU0VSUE9SVD1tCitDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9JTVg9eQorQ09ORklHX1NFUklBTF9JTVhfQ09OU09MRT15CitDT05GSUdfSFdfUkFORE9NPXkKK0NPTkZJR19JMkM9eQorIyBDT05GSUdfSTJDX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0NIQVJERVY9eQorIyBDT05GSUdfSTJDX0hFTFBFUl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfQUxHT0JJVD1tCitDT05GSUdfSTJDX0FMR09QQ0Y9bQorQ09ORklHX0kyQ19BTEdPUENBPW0KK0NPTkZJR19JMkNfSU1YPXkKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9JTVg9eQorQ09ORklHX0dQSU9fU1lTRlM9eQorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKK0NPTkZJR19JTVgyX1dEVD15CitDT05GSUdfTUZEX01DMTNYWFg9eQorQ09ORklHX1JFR1VMQVRPUj15CitDT05GSUdfUkVHVUxBVE9SX01DMTM4OTI9eQorQ09ORklHX1VTQj15CitDT05GSUdfVVNCX0VIQ0lfSENEPXkKK0NPTkZJR19VU0JfRUhDSV9NWEM9eQorQ09ORklHX1VTQl9TVE9SQUdFPXkKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19CTE9DSz1tCitDT05GSUdfTU1DX1NESENJPXkKK0NPTkZJR19NTUNfU0RIQ0lfUExURk09eQorQ09ORklHX01NQ19TREhDSV9FU0RIQ19JTVg9eQorQ09ORklHX05FV19MRURTPXkKK0NPTkZJR19MRURTX0NMQVNTPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTD15CitDT05GSUdfUlRDX01YQz15CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19FWFQ0X0ZTPXkKK0NPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUNF9GU19TRUNVUklUWT15CitDT05GSUdfUVVPVEE9eQorQ09ORklHX1FVT1RBX05FVExJTktfSU5URVJGQUNFPXkKKyMgQ09ORklHX1BSSU5UX1FVT1RBX1dBUk5JTkcgaXMgbm90IHNldAorQ09ORklHX0FVVE9GUzRfRlM9eQorQ09ORklHX0ZVU0VfRlM9eQorQ09ORklHX0lTTzk2NjBfRlM9bQorQ09ORklHX0pPTElFVD15CitDT05GSUdfWklTT0ZTPXkKK0NPTkZJR19VREZfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfQ09ORklHRlNfRlM9bQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKK0NPTkZJR19ORlNfVjNfQUNMPXkKK0NPTkZJR19ORlNfVjQ9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iY3A0MzciCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CitDT05GSUdfTkxTX0FTQ0lJPXkKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCitDT05GSUdfTkxTX1VURjg9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUk1fVU5XSU5EIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWUZTPXkKK0NPTkZJR19DUllQVE9fREVGTEFURT1tCitDT05GSUdfQ1JZUFRPX0xaTz1tCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAorQ09ORklHX0NSQ19DQ0lUVD1tCitDT05GSUdfQ1JDX1QxMERJRj15CitDT05GSUdfQ1JDNz1tCitDT05GSUdfTElCQ1JDMzJDPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXhzX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXhzX2RlZmNvbmZpZwppbmRleCBkYjJjYjdkLi42ZWU3ODFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL214c19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9teHNfZGVmY29uZmlnCkBAIC0yNiw2ICsyNiw3IEBACiBDT05GSUdfTUFDSF9NWDI4RVZLPXkKIENPTkZJR19NQUNIX1NUTVAzNzhYX0RFVkI9eQogQ09ORklHX01BQ0hfVFgyOD15CitDT05GSUdfTUFDSF9NMjhFVks9eQogIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKIENPTkZJR19OT19IWj15CiBDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvdGVncmFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy90ZWdyYV9kZWZjb25maWcKaW5kZXggODg0NWYxYy4uMTk1NzI5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy90ZWdyYV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy90ZWdyYV9kZWZjb25maWcKQEAgLTI1LDYgKzI1LDcgQEAKIENPTkZJR19NQUNIX1BBWjAwPXkKIENPTkZJR19NQUNIX1RSSU1TTElDRT15CiBDT05GSUdfTUFDSF9XQVJJTz15CitDT05GSUdfTUFDSF9WRU5UQU5BPXkKIENPTkZJR19URUdSQV9ERUJVR19VQVJURD15CiBDT05GSUdfQVJNX0VSUkFUQV83NDIyMzA9eQogQ09ORklHX05PX0haPXkKQEAgLTM4LDcgKzM5LDYgQEAKIENPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKIENPTkZJR19aQk9PVF9ST01fQlNTPTB4MAogQ09ORklHX1ZGUD15Ci1DT05GSUdfUE09eQogQ09ORklHX05FVD15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19VTklYPXkKQEAgLTY1LDYgKzY1LDcgQEAKIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUz15CiAjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKIENPTkZJR19NSVNDX0RFVklDRVM9eQogQ09ORklHX0FENTI1WF9EUE9UPXkKQEAgLTcyLDM0ICs3Myw2MSBAQAogQ09ORklHX0lDUzkzMlM0MDE9eQogQ09ORklHX0FQRFM5ODAyQUxTPXkKIENPTkZJR19JU0wyOTAwMz15CitDT05GSUdfU0NTST15CitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19TQ1NJX0xPV0xFVkVMIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKIENPTkZJR19EVU1NWT15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19SODE2OT15CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1BFR0FTVVM9eQorQ09ORklHX1VTQl9VU0JORVQ9eQorQ09ORklHX1VTQl9ORVRfU01TQzc1WFg9eQorQ09ORklHX1VTQl9ORVRfU01TQzk1WFg9eQogIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAogIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMXzgyNTA9eQogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9PRl9QTEFURk9STT15CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAogQ09ORklHX0kyQz15CiAjIENPTkZJR19JMkNfQ09NUEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19IRUxQRVJfQVVUTyBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX1RFR1JBPXkKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9URUdSQT15CiBDT05GSUdfU0VOU09SU19MTTkwPXkKIENPTkZJR19NRkRfVFBTNjU4Nlg9eQogQ09ORklHX1JFR1VMQVRPUj15CiBDT05GSUdfUkVHVUxBVE9SX1RQUzY1ODZYPXkKLSMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKKyMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RSSVZFUlMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1VTQiBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NPQz15CitDT05GSUdfU05EX1NPQ19URUdSQT15CitDT05GSUdfU05EX1NPQ19URUdSQV9XTTg5MDM9eQorQ09ORklHX1NORF9TT0NfVEVHUkFfVFJJTVNMSUNFPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX0VIQ0lfVEVHUkE9eQorQ09ORklHX1VTQl9TVE9SQUdFPXkKIENPTkZJR19NTUM9eQogQ09ORklHX01NQ19TREhDST15CiBDT05GSUdfTU1DX1NESENJX1BMVEZNPXkKIENPTkZJR19NTUNfU0RIQ0lfVEVHUkE9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0RSVl9URUdSQT15CiBDT05GSUdfU1RBR0lORz15Ci0jIENPTkZJR19TVEFHSU5HX0VYQ0xVREVfQlVJTEQgaXMgbm90IHNldAogQ09ORklHX0lJTz15CiBDT05GSUdfU0VOU09SU19JU0wyOTAxOD15CiBDT05GSUdfU0VOU09SU19BSzg5NzU9eQpAQCAtMTIzLDE4ICsxNTEsMTUgQEAKIENPTkZJR19QUklOVEtfVElNRT15CiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX1NDSEVEU1RBVFM9eQogQ09ORklHX1RJTUVSX1NUQVRTPXkKIENPTkZJR19ERUJVR19TTEFCPXkKICMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX01VVEVYRVM9eQotQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQPXkKIENPTkZJR19ERUJVR19JTkZPPXkKIENPTkZJR19ERUJVR19WTT15CiBDT05GSUdfREVCVUdfU0c9eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfTEw9eQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX0VDQj15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kZXZpY2UuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RldmljZS5oCmluZGV4IDY2MTVmMDMuLjdhYTM2ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RldmljZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RldmljZS5oCkBAIC0xNSw3ICsxNSwxMiBAQAogI2VuZGlmCiB9OwogCitzdHJ1Y3Qgb21hcF9kZXZpY2U7CisKIHN0cnVjdCBwZGV2X2FyY2hkYXRhIHsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQCisJc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKyNlbmRpZgogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAppbmRleCAyOGI3ZWU4Li5jYjNiN2M5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKQEAgLTIwNSw2ICsyMDUsMTMgQEAKIGludCBkbWFfbW1hcF93cml0ZWNvbWJpbmUoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwKIAkJdm9pZCAqLCBkbWFfYWRkcl90LCBzaXplX3QpOwogCisvKgorICogVGhpcyBjYW4gYmUgY2FsbGVkIGR1cmluZyBib290IHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBjb25zaXN0ZW50CisgKiBETUEgcmVnaW9uIGFib3ZlIGl0J3MgZGVmYXVsdCB2YWx1ZSBvZiAyTUIuIEl0IG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUKKyAqIG1lbW9yeSBhbGxvY2F0b3IgaXMgaW5pdGlhbGlzZWQsIGkuZS4gYmVmb3JlIGFueSBjb3JlX2luaXRjYWxsLgorICovCitleHRlcm4gdm9pZCBfX2luaXQgaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKIAogI2lmZGVmIENPTkZJR19ETUFCT1VOQ0UKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbnRyeS1tYWNyby1tdWx0aS5TIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZW50cnktbWFjcm8tbXVsdGkuUwppbmRleCAyZjFlMjA5Li44OGQ2MTgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbnRyeS1tYWNyby1tdWx0aS5TCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VudHJ5LW1hY3JvLW11bHRpLlMKQEAgLTI1LDEzICsyNSw2IEBACiAJbW92bmUJcjEsIHNwCiAJYWRybmUJbHIsIEJTWU0oMWIpCiAJYm5lCWRvX0lQSQotCi0jaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotCXRlc3RfZm9yX2x0aXJxIHIwLCByMiwgcjYsIGxyCi0JbW92bmUJcjAsIHNwCi0JYWRybmUJbHIsIEJTWU0oMWIpCi0JYm5lCWRvX2xvY2FsX3RpbWVyCi0jZW5kaWYKICNlbmRpZgogOTk5NzoKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ3Bpby5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ3Bpby5oCmluZGV4IDE2NmE3YTMuLjExYWQwYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2dwaW8uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9ncGlvLmgKQEAgLTQsNCArNCwyMyBAQAogLyogbm90IGFsbCBBUk0gcGxhdGZvcm1zIG5lY2Vzc2FyaWx5IHN1cHBvcnQgdGhpcyBBUEkgLi4uICovCiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKKyNpZm5kZWYgX19BUk1fR1BJT0xJQl9DT01QTEVYCisvKiBOb3RlOiB0aGlzIG1heSByZWx5IHVwb24gdGhlIHZhbHVlIG9mIEFSQ0hfTlJfR1BJT1Mgc2V0IGluIG1hY2gvZ3Bpby5oICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgorCisvKiBUaGUgdHJpdmlhbCBncGlvbGliIGRpc3BhdGNoZXJzICovCisjZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlICBfX2dwaW9fZ2V0X3ZhbHVlCisjZGVmaW5lIGdwaW9fc2V0X3ZhbHVlICBfX2dwaW9fc2V0X3ZhbHVlCisjZGVmaW5lIGdwaW9fY2Fuc2xlZXAgICBfX2dwaW9fY2Fuc2xlZXAKKyNlbmRpZgorCisvKgorICogUHJvdmlkZSBhIGRlZmF1bHQgZ3Bpb190b19pcnEoKSB3aGljaCBzaG91bGQgc2F0aXNmeSBldmVyeSBjYXNlLgorICogSG93ZXZlciwgc29tZSBwbGF0Zm9ybXMgd2FudCB0byBkbyB0aGlzIGRpZmZlcmVudGx5LCBzbyBhbGxvdyB0aGVtCisgKiB0byBvdmVycmlkZSBpdC4KKyAqLworI2lmbmRlZiBncGlvX3RvX2lycQorI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCisjZW5kaWYKKwogI2VuZGlmIC8qIF9BUkNIX0FSTV9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCA4OWFkMTgwLi5kZGYwN2E5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC05LDkgKzksNiBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgaW50IF9fc29mdGlycV9wZW5kaW5nOwotI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKLQl1bnNpZ25lZCBpbnQgbG9jYWxfdGltZXJfaXJxczsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19TTVAKIAl1bnNpZ25lZCBpbnQgaXBpX2lycXNbTlJfSVBJXTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oCmluZGV4IDQzNGVkY2MuLjFkYjExNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmgKQEAgLTEwMiw3ICsxMDIsMTQgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIGV4dGVybiB2b2lkIF9faW5pdCBsMngwX2luaXQodm9pZCBfX2lvbWVtICpiYXNlLCBfX3UzMiBhdXhfdmFsLCBfX3UzMiBhdXhfbWFzayk7CisjaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfTDJYMCkgJiYgZGVmaW5lZChDT05GSUdfT0YpCiBleHRlcm4gaW50IGwyeDBfb2ZfaW5pdChfX3UzMiBhdXhfdmFsLCBfX3UzMiBhdXhfbWFzayk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbDJ4MF9vZl9pbml0KF9fdTMyIGF1eF92YWwsIF9fdTMyIGF1eF9tYXNrKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCiAKIHN0cnVjdCBsMngwX3JlZ3MgewogCXVuc2lnbmVkIGxvbmcgcGh5X2Jhc2U7CkBAIC0xMjEsNiArMTI4LDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBsMngwX3JlZ3MgbDJ4MF9zYXZlZF9yZWdzOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9lbnRyeS1tYWNyby1naWMuUyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TCmluZGV4IGMxMTViODIuLjc0ZWJjODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TCkBAIC0yMiwxNSArMjIsMTEgQEAKICAqIGludGVycnVwdCBjb250cm9sbGVyIHNwZWMuICBUbyB3aXQ6CiAgKgogICogSW50ZXJydXB0cyAwLTE1IGFyZSBJUEkKLSAqIDE2LTI4IGFyZSByZXNlcnZlZAotICogMjktMzEgYXJlIGxvY2FsLiAgV2UgYWxsb3cgMzAgdG8gYmUgdXNlZCBmb3IgdGhlIHdhdGNoZG9nLgorICogMTYtMzEgYXJlIGxvY2FsLiAgV2UgYWxsb3cgMzAgdG8gYmUgdXNlZCBmb3IgdGhlIHdhdGNoZG9nLgogICogMzItMTAyMCBhcmUgZ2xvYmFsCiAgKiAxMDIxLTEwMjIgYXJlIHJlc2VydmVkCiAgKiAxMDIzIGlzICJzcHVyaW91cyIgKG5vIGludGVycnVwdCkKICAqCi0gKiBGb3Igbm93LCB3ZSBpZ25vcmUgYWxsIGxvY2FsIGludGVycnVwdHMgc28gb25seSByZXR1cm4gYW4gaW50ZXJydXB0IGlmIGl0J3MKLSAqIGJldHdlZW4gMzAgYW5kIDEwMjAuICBUaGUgdGVzdF9mb3JfaXBpIHJvdXRpbmUgYmVsb3cgd2lsbCBwaWNrIHVwIG9uIElQSXMuCi0gKgogICogQSBzaW1wbGUgcmVhZCBmcm9tIHRoZSBjb250cm9sbGVyIHdpbGwgdGVsbCB1cyB0aGUgbnVtYmVyIG9mIHRoZSBoaWdoZXN0CiAgKiBwcmlvcml0eSBlbmFibGVkIGludGVycnVwdC4gIFdlIHRoZW4ganVzdCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgaW4gdGhlCiAgKiB2YWxpZCByYW5nZSBmb3IgYW4gSVJRICgzMC0xMDIwIGluY2x1c2l2ZSkuCkBAIC00Myw3ICszOSw3IEBACiAKIAlsZHIJXHRtcCwgPTEwMjEKIAliaWMgICAgIFxpcnFuciwgXGlycXN0YXQsICMweDFjMDAKLQljbXAgICAgIFxpcnFuciwgIzI5CisJY21wICAgICBcaXJxbnIsICMxNQogCWNtcGNjCVxpcnFuciwgXGlycW5yCiAJY21wbmUJXGlycW5yLCBcdG1wCiAJY21wY3MJXGlycW5yLCBcaXJxbnIKQEAgLTYyLDE0ICs1OCwzIEBACiAJc3RyY2MJXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfRU9JXQogCWNtcGNzCVxpcnFuciwgXGlycW5yCiAJLmVuZG0KLQotLyogQXMgYWJvdmUsIHRoaXMgYXNzdW1lcyB0aGF0IGlycXN0YXQgYW5kIGJhc2UgYXJlIHByZXNlcnZlZC4uICovCi0KLQkubWFjcm8gdGVzdF9mb3JfbHRpcnEsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQliaWMJXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAotCW1vdiAJXHRtcCwgIzAKLQljbXAJXGlycW5yLCAjMjkKLQltb3ZlcQlcdG1wLCAjMQotCXN0cmVxCVxpcnFzdGF0LCBbXGJhc2UsICNHSUNfQ1BVX0VPSV0KLQljbXAJXHRtcCwgIzAKLQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvZ2ljLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9naWMuaAppbmRleCA0MzVkM2Y4Li4zZTkxZjIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9naWMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9naWMuaApAQCAtMzMsMTkgKzMzLDMyIEBACiAjZGVmaW5lIEdJQ19ESVNUX1NPRlRJTlQJCTB4ZjAwCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CitzdHJ1Y3QgZGV2aWNlX25vZGU7CisKIGV4dGVybiB2b2lkIF9faW9tZW0gKmdpY19jcHVfYmFzZV9hZGRyOwogZXh0ZXJuIHN0cnVjdCBpcnFfY2hpcCBnaWNfYXJjaF9leHRuOwogCi12b2lkIGdpY19pbml0KHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB2b2lkIF9faW9tZW0gKiwgdm9pZCBfX2lvbWVtICopOwordm9pZCBnaWNfaW5pdCh1bnNpZ25lZCBpbnQsIGludCwgdm9pZCBfX2lvbWVtICosIHZvaWQgX19pb21lbSAqKTsKK2ludCBnaWNfb2ZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KTsKIHZvaWQgZ2ljX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCk7CiB2b2lkIGdpY19jYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgZ2ljX25yLCB1bnNpZ25lZCBpbnQgaXJxKTsKIHZvaWQgZ2ljX3JhaXNlX3NvZnRpcnEoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBpcnEpOwotdm9pZCBnaWNfZW5hYmxlX3BwaSh1bnNpZ25lZCBpbnQpOwogCiBzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSB7Ci0JdW5zaWduZWQgaW50IGlycV9vZmZzZXQ7CiAJdm9pZCBfX2lvbWVtICpkaXN0X2Jhc2U7CiAJdm9pZCBfX2lvbWVtICpjcHVfYmFzZTsKKyNpZmRlZiBDT05GSUdfQ1BVX1BNCisJdTMyIHNhdmVkX3NwaV9lbmFibGVbRElWX1JPVU5EX1VQKDEwMjAsIDMyKV07CisJdTMyIHNhdmVkX3NwaV9jb25mW0RJVl9ST1VORF9VUCgxMDIwLCAxNildOworCXUzMiBzYXZlZF9zcGlfdGFyZ2V0W0RJVl9ST1VORF9VUCgxMDIwLCA0KV07CisJdTMyIF9fcGVyY3B1ICpzYXZlZF9wcGlfZW5hYmxlOworCXUzMiBfX3BlcmNwdSAqc2F2ZWRfcHBpX2NvbmY7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSVJRX0RPTUFJTgorCXN0cnVjdCBpcnFfZG9tYWluIGRvbWFpbjsKKyNlbmRpZgorCXVuc2lnbmVkIGludCBnaWNfaXJxczsKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaW9wM3h4LWdwaW8uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2lvcDN4eC1ncGlvLmgKaW5kZXggYjY5ZDk3Mi4uOWVkYTdkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaW9wM3h4LWdwaW8uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pb3AzeHgtZ3Bpby5oCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KIAorI2RlZmluZSBfX0FSTV9HUElPTElCX0NPTVBMRVgKKwogI2RlZmluZSBJT1AzWFhfTl9HUElPUwk4CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pdDgxNTIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2l0ODE1Mi5oCmluZGV4IGIzZmVhMzguLjQzY2FiNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2l0ODE1Mi5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2l0ODE1Mi5oCkBAIC05LDcgKzksNyBAQAogCiAjaWZuZGVmIF9fQVNNX0hBUkRXQVJFX0lUODE1Ml9ICiAjZGVmaW5lIF9fQVNNX0hBUkRXQVJFX0lUODE1Ml9ICi1leHRlcm4gdW5zaWduZWQgbG9uZyBpdDgxNTJfYmFzZV9hZGRyZXNzOworZXh0ZXJuIHZvaWQgX19pb21lbSAqaXQ4MTUyX2Jhc2VfYWRkcmVzczsKIAogI2RlZmluZSBJVDgxNTJfSU9fQkFTRQkJCShpdDgxNTJfYmFzZV9hZGRyZXNzICsgMHgwM2UwMDAwMCkKICNkZWZpbmUgSVQ4MTUyX0NGR1JFR19CQVNFCQkoaXQ4MTUyX2Jhc2VfYWRkcmVzcyArIDB4MDNmMDAwMDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9wbDA4MC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvcGwwODAuaAppbmRleCBlNGEwNGU0Li4zM2M3OGQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9wbDA4MC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3BsMDgwLmgKQEAgLTIxLDYgKzIxLDkgQEAKICAqIE9uZU5BTkQgZmVhdHVyZXMuCiAqLwogCisjaWZuZGVmIEFTTV9QTDA4MF9ICisjZGVmaW5lIEFTTV9QTDA4MF9ICisKICNkZWZpbmUgUEwwODBfSU5UX1NUQVRVUwkJCSgweDAwKQogI2RlZmluZSBQTDA4MF9UQ19TVEFUVVMJCQkJKDB4MDQpCiAjZGVmaW5lIFBMMDgwX1RDX0NMRUFSCQkJCSgweDA4KQpAQCAtMTM4LDMgKzE0MSw0IEBACiAJdTMyCWNvbnRyb2wxOwogfTsKIAorI2VuZGlmIC8qIEFTTV9QTDA4MF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKaW5kZXggZjM4OWIyNy4uYzE5MGJjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaApAQCAtNTAsNiArNTAsNyBAQAogI2RlZmluZSBBUk1fREVCVUdfQVJDSF9WNl8xCTIKICNkZWZpbmUgQVJNX0RFQlVHX0FSQ0hfVjdfRUNQMTQJMwogI2RlZmluZSBBUk1fREVCVUdfQVJDSF9WN19NTQk0CisjZGVmaW5lIEFSTV9ERUJVR19BUkNIX1Y3XzEJNQogCiAvKiBCcmVha3BvaW50ICovCiAjZGVmaW5lIEFSTV9CUkVBS1BPSU5UX0VYRUNVVEUJMApAQCAtNTcsNiArNTgsNyBAQAogLyogV2F0Y2hwb2ludHMgKi8KICNkZWZpbmUgQVJNX0JSRUFLUE9JTlRfTE9BRAkxCiAjZGVmaW5lIEFSTV9CUkVBS1BPSU5UX1NUT1JFCTIKKyNkZWZpbmUgQVJNX0ZTUl9BQ0NFU1NfTUFTSwkoMSA8PCAxMSkKIAogLyogUHJpdmlsZWdlIExldmVscyAqLwogI2RlZmluZSBBUk1fQlJFQUtQT0lOVF9QUklWCTEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2xvY2FsdGltZXIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2xvY2FsdGltZXIuaAppbmRleCA2ZmQ5NTVkLi5jNmExODQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9sb2NhbHRpbWVyLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbG9jYWx0aW1lci5oCkBAIC0xMSw2ICsxMSw3IEBACiAjZGVmaW5lIF9fQVNNX0FSTV9MT0NBTFRJTUVSX0gKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2U7CiAKQEAgLTE5LDMxICsyMCwyMCBAQAogICovCiB2b2lkIHBlcmNwdV90aW1lcl9zZXR1cCh2b2lkKTsKIAotLyoKLSAqIENhbGxlZCBmcm9tIGFzc2VtYmx5LCB0aGlzIGlzIHRoZSBsb2NhbCB0aW1lciBJUlEgaGFuZGxlcgotICovCi1hc21saW5rYWdlIHZvaWQgZG9fbG9jYWxfdGltZXIoc3RydWN0IHB0X3JlZ3MgKik7Ci0KLS8qCi0gKiBDYWxsZWQgZnJvbSBDIGNvZGUKLSAqLwotdm9pZCBoYW5kbGVfbG9jYWxfdGltZXIoc3RydWN0IHB0X3JlZ3MgKik7Ci0KICNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCiAKICNpZmRlZiBDT05GSUdfSEFWRV9BUk1fVFdECiAKICNpbmNsdWRlICJzbXBfdHdkLmgiCiAKLSNkZWZpbmUgbG9jYWxfdGltZXJfYWNrKCkJdHdkX3RpbWVyX2FjaygpCisjZGVmaW5lIGxvY2FsX3RpbWVyX3N0b3AoYykJdHdkX3RpbWVyX3N0b3AoKGMpKQogCiAjZWxzZQogCiAvKgotICogUGxhdGZvcm0gcHJvdmlkZXMgdGhpcyB0byBhY2tub3dsZWRnZSBhIGxvY2FsIHRpbWVyIElSUS4KLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9jYWwgdGltZXIgSVJRIGlzIHRvIGJlIHByb2Nlc3NlZC4KKyAqIFN0b3AgdGhlIGxvY2FsIHRpbWVyCiAgKi8KLWludCBsb2NhbF90aW1lcl9hY2sodm9pZCk7Cit2b2lkIGxvY2FsX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKIAogI2VuZGlmCiAKQEAgLTU4LDYgKzQ4LDEwIEBACiB7CiAJcmV0dXJuIC1FTlhJTzsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworfQogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9hcmNoLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaAppbmRleCBjNTY5OTk4Li43ZDE5NDI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaApAQCAtMTcsNyArMTcsNyBAQAogc3RydWN0IG1hY2hpbmVfZGVzYyB7CiAJdW5zaWduZWQgaW50CQlucjsJCS8qIGFyY2hpdGVjdHVyZSBudW1iZXIJKi8KIAljb25zdCBjaGFyCQkqbmFtZTsJCS8qIGFyY2hpdGVjdHVyZSBuYW1lCSovCi0JdW5zaWduZWQgbG9uZwkJYm9vdF9wYXJhbXM7CS8qIHRhZ2dlZCBsaXN0CQkqLworCXVuc2lnbmVkIGxvbmcJCWF0YWdfb2Zmc2V0OwkvKiB0YWdnZWQgbGlzdCAocmVsYXRpdmUpICovCiAJY29uc3QgY2hhcgkJKipkdF9jb21wYXQ7CS8qIGFycmF5IG9mIGRldmljZSB0cmVlCiAJCQkJCQkgKiAnY29tcGF0aWJsZScgc3RyaW5ncwkqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9tYXAuaAppbmRleCBkMmZlZGI1Li5iMzZmMzY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21hcC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvbWFwLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNkZWZpbmUgTVRfTUVNT1JZX05PTkNBQ0hFRAkxMQogI2RlZmluZSBNVF9NRU1PUllfRFRDTQkJMTIKICNkZWZpbmUgTVRfTUVNT1JZX0lUQ00JCTEzCisjZGVmaW5lIE1UX01FTU9SWV9TTwkJMTQKIAogI2lmZGVmIENPTkZJR19NTVUKIGV4dGVybiB2b2lkIGlvdGFibGVfaW5pdChzdHJ1Y3QgbWFwX2Rlc2MgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21lbW9yeS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKaW5kZXggNDQxZmM0Zi4uYTg5OTdkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKQEAgLTE2LDkgKzE2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIAorI2lmZGVmIENPTkZJR19ORUVEX01BQ0hfTUVNT1JZX0gKKyNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgorI2VuZGlmCisKIC8qCiAgKiBBbGxvdyBmb3IgY29uc3RhbnRzIGRlZmluZWQgaGVyZSB0byBiZSB1c2VkIGZyb20gYXNzZW1ibHkgY29kZQogICogYnkgcHJlcGVuZGluZyB0aGUgVUwgc3VmZml4IG9ubHkgd2l0aCBhY3R1YWwgQyBjb2RlIGNvbXBpbGF0aW9uLgpAQCAtNzcsMTYgKzgwLDcgQEAKICAqLwogI2RlZmluZSBJT1JFTUFQX01BWF9PUkRFUgkyNAogCi0vKgotICogU2l6ZSBvZiBETUEtY29uc2lzdGVudCBtZW1vcnkgcmVnaW9uLiAgTXVzdCBiZSBtdWx0aXBsZSBvZiAyTSwKLSAqIGJldHdlZW4gMk1CIGFuZCAxNE1CIGluY2x1c2l2ZS4KLSAqLwotI2lmbmRlZiBDT05TSVNURU5UX0RNQV9TSVpFCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUgCVNaXzJNCi0jZW5kaWYKLQogI2RlZmluZSBDT05TSVNURU5UX0VORAkJKDB4ZmZlMDAwMDBVTCkKLSNkZWZpbmUgQ09OU0lTVEVOVF9CQVNFCQkoQ09OU0lTVEVOVF9FTkQgLSBDT05TSVNURU5UX0RNQV9TSVpFKQogCiAjZWxzZSAvKiBDT05GSUdfTU1VICovCiAKQEAgLTE5Myw3ICsxODcsMTEgQEAKICNlbmRpZgogCiAjaWZuZGVmIFBIWVNfT0ZGU0VUCisjaWZkZWYgUExBVF9QSFlTX09GRlNFVAogI2RlZmluZSBQSFlTX09GRlNFVAlQTEFUX1BIWVNfT0ZGU0VUCisjZWxzZQorI2RlZmluZSBQSFlTX09GRlNFVAlVTChDT05GSUdfUEhZU19PRkZTRVQpCisjZW5kaWYKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IDhhZGUxODQuLjk0NTFkY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTEwMSw2ICsxMDEsOSBAQAogI2RlZmluZSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHByb3QpIFwKIAlfX3BncHJvdF9tb2RpZnkocHJvdCwgTF9QVEVfTVRfTUFTSywgTF9QVEVfTVRfQlVGRkVSQUJMRSkKIAorI2RlZmluZSBwZ3Byb3Rfc3Ryb25nbHlvcmRlcmVkKHByb3QpIFwKKwlfX3BncHJvdF9tb2RpZnkocHJvdCwgTF9QVEVfTVRfTUFTSywgTF9QVEVfTVRfVU5DQUNIRUQpCisKICNpZmRlZiBDT05GSUdfQVJNX0RNQV9NRU1fQlVGRkVSQUJMRQogI2RlZmluZSBwZ3Byb3RfZG1hY29oZXJlbnQocHJvdCkgXAogCV9fcGdwcm90X21vZGlmeShwcm90LCBMX1BURV9NVF9NQVNLLCBMX1BURV9NVF9CVUZGRVJBQkxFIHwgTF9QVEVfWE4pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wbXUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BtdS5oCmluZGV4IGI3ZTgyYzQuLjcxZDk5YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BtdS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BtdS5oCkBAIC0xMyw3ICsxMywxMiBAQAogI2RlZmluZSBfX0FSTV9QTVVfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAKKy8qCisgKiBUeXBlcyBvZiBQTVVzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGFuZCByZXF1aXJlIG11dHVhbAorICogZXhjbHVzaW9uIGJldHdlZW4gcHJvZmlsaW5nIHRvb2xzLgorICovCiBlbnVtIGFybV9wbXVfdHlwZSB7CiAJQVJNX1BNVV9ERVZJQ0VfQ1BVCT0gMCwKIAlBUk1fTlVNX1BNVV9ERVZJQ0VTLApAQCAtMzcsMjEgKzQyLDE3IEBACiAgKiByZXNlcnZlX3BtdSgpIC0gcmVzZXJ2ZSB0aGUgaGFyZHdhcmUgcGVyZm9ybWFuY2UgY291bnRlcnMKICAqCiAgKiBSZXNlcnZlIHRoZSBoYXJkd2FyZSBwZXJmb3JtYW5jZSBjb3VudGVycyBpbiB0aGUgc3lzdGVtIGZvciBleGNsdXNpdmUgdXNlLgotICogVGhlIHBsYXRmb3JtX2RldmljZSBmb3IgdGhlIHN5c3RlbSBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLCBFUlJfUFRSKCkKLSAqIGVuY29kZWQgZXJyb3Igb24gZmFpbHVyZS4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FQlVTWSBpZiB0aGUgbG9jayBpcyBhbHJlYWR5IGhlbGQuCiAgKi8KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKK2V4dGVybiBpbnQKIHJlc2VydmVfcG11KGVudW0gYXJtX3BtdV90eXBlIHR5cGUpOwogCiAvKioKICAqIHJlbGVhc2VfcG11KCkgLSBSZWxpbnF1aXNoIGNvbnRyb2wgb2YgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzCiAgKgogICogUmVsZWFzZSB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgYW5kIGFsbG93IHNvbWVvbmUgZWxzZSB0byB1c2UgdGhlbS4KLSAqIENhbGxlcnMgbXVzdCBoYXZlIGRpc2FibGVkIHRoZSBjb3VudGVycyBhbmQgcmVsZWFzZWQgSVJRcyBiZWZvcmUgY2FsbGluZwotICogdGhpcy4gVGhlIHBsYXRmb3JtX2RldmljZSByZXR1cm5lZCBmcm9tIHJlc2VydmVfcG11KCkgbXVzdCBiZSBwYXNzZWQgYXMKLSAqIGEgY29va2llLgogICovCi1leHRlcm4gaW50CitleHRlcm4gdm9pZAogcmVsZWFzZV9wbXUoZW51bSBhcm1fcG11X3R5cGUgdHlwZSk7CiAKIC8qKgpAQCAtNjgsMjQgKzY5LDc4IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKK3N0YXRpYyBpbmxpbmUgaW50CiByZXNlcnZlX3BtdShlbnVtIGFybV9wbXVfdHlwZSB0eXBlKQogewotCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotcmVsZWFzZV9wbXUoZW51bSBhcm1fcG11X3R5cGUgdHlwZSkKLXsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLWluaXRfcG11KGVudW0gYXJtX3BtdV90eXBlIHR5cGUpCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19CitzdGF0aWMgaW5saW5lIHZvaWQKK3JlbGVhc2VfcG11KGVudW0gYXJtX3BtdV90eXBlIHR5cGUpCXsgfQogCiAjZW5kaWYgLyogQ09ORklHX0NQVV9IQVNfUE1VICovCiAKKyNpZmRlZiBDT05GSUdfSFdfUEVSRl9FVkVOVFMKKworLyogVGhlIGV2ZW50cyBmb3IgYSBnaXZlbiBQTVUgcmVnaXN0ZXIgc2V0LiAqLworc3RydWN0IHBtdV9od19ldmVudHMgeworCS8qCisJICogVGhlIGV2ZW50cyB0aGF0IGFyZSBhY3RpdmUgb24gdGhlIFBNVSBmb3IgdGhlIGdpdmVuIGluZGV4LgorCSAqLworCXN0cnVjdCBwZXJmX2V2ZW50CSoqZXZlbnRzOworCisJLyoKKwkgKiBBIDEgYml0IGZvciBhbiBpbmRleCBpbmRpY2F0ZXMgdGhhdCB0aGUgY291bnRlciBpcyBiZWluZyB1c2VkIGZvcgorCSAqIGFuIGV2ZW50LiBBIDAgbWVhbnMgdGhhdCB0aGUgY291bnRlciBjYW4gYmUgdXNlZC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAqdXNlZF9tYXNrOworCisJLyoKKwkgKiBIYXJkd2FyZSBsb2NrIHRvIHNlcmlhbGl6ZSBhY2Nlc3NlcyB0byBQTVUgcmVnaXN0ZXJzLiBOZWVkZWQgZm9yIHRoZQorCSAqIHJlYWQvbW9kaWZ5L3dyaXRlIHNlcXVlbmNlcy4KKwkgKi8KKwlyYXdfc3BpbmxvY2tfdAkJcG11X2xvY2s7Cit9OworCitzdHJ1Y3QgYXJtX3BtdSB7CisJc3RydWN0IHBtdQlwbXU7CisJZW51bSBhcm1fcGVyZl9wbXVfaWRzIGlkOworCWVudW0gYXJtX3BtdV90eXBlIHR5cGU7CisJY3B1bWFza190CWFjdGl2ZV9pcnFzOworCWNvbnN0IGNoYXIJKm5hbWU7CisJaXJxcmV0dXJuX3QJKCpoYW5kbGVfaXJxKShpbnQgaXJxX251bSwgdm9pZCAqZGV2KTsKKwl2b2lkCQkoKmVuYWJsZSkoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmV2dCwgaW50IGlkeCk7CisJdm9pZAkJKCpkaXNhYmxlKShzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqZXZ0LCBpbnQgaWR4KTsKKwlpbnQJCSgqZ2V0X2V2ZW50X2lkeCkoc3RydWN0IHBtdV9od19ldmVudHMgKmh3X2V2ZW50cywKKwkJCQkJIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MpOworCWludAkJKCpzZXRfZXZlbnRfZmlsdGVyKShzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqZXZ0LAorCQkJCQkgICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cik7CisJdTMyCQkoKnJlYWRfY291bnRlcikoaW50IGlkeCk7CisJdm9pZAkJKCp3cml0ZV9jb3VudGVyKShpbnQgaWR4LCB1MzIgdmFsKTsKKwl2b2lkCQkoKnN0YXJ0KSh2b2lkKTsKKwl2b2lkCQkoKnN0b3ApKHZvaWQpOworCXZvaWQJCSgqcmVzZXQpKHZvaWQgKik7CisJaW50CQkoKm1hcF9ldmVudCkoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKKwlpbnQJCW51bV9ldmVudHM7CisJYXRvbWljX3QJYWN0aXZlX2V2ZW50czsKKwlzdHJ1Y3QgbXV0ZXgJcmVzZXJ2ZV9tdXRleDsKKwl1NjQJCW1heF9wZXJpb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGxhdF9kZXZpY2U7CisJc3RydWN0IHBtdV9od19ldmVudHMJKigqZ2V0X2h3X2V2ZW50cykodm9pZCk7Cit9OworCisjZGVmaW5lIHRvX2FybV9wbXUocCkgKGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgYXJtX3BtdSwgcG11KSkKKworaW50IF9faW5pdCBhcm1wbXVfcmVnaXN0ZXIoc3RydWN0IGFybV9wbXUgKmFybXBtdSwgY2hhciAqbmFtZSwgaW50IHR5cGUpOworCit1NjQgYXJtcG11X2V2ZW50X3VwZGF0ZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAorCQkJaW50IGlkeCwgaW50IG92ZXJmbG93KTsKKworaW50IGFybXBtdV9ldmVudF9zZXRfcGVyaW9kKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgICBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAorCQkJICAgIGludCBpZHgpOworCisjZW5kaWYgLyogQ09ORklHX0hXX1BFUkZfRVZFTlRTICovCisKICNlbmRpZiAvKiBfX0FSTV9QTVVfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9jLWZucy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvYy1mbnMuaAppbmRleCA2MzNkMWNiLi45ZTkyY2IyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvYy1mbnMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9jLWZucy5oCkBAIC04MSw2ICs4MSwxMCBAQAogZXh0ZXJuIHZvaWQgY3B1X2RvX3N3aXRjaF9tbSh1bnNpZ25lZCBsb25nIHBnZF9waHlzLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiBleHRlcm4gdm9pZCBjcHVfc2V0X3B0ZV9leHQocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGV4dCk7CiBleHRlcm4gdm9pZCBjcHVfcmVzZXQodW5zaWduZWQgbG9uZyBhZGRyKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCisvKiBUaGVzZSB0aHJlZSBhcmUgcHJpdmF0ZSB0byBhcmNoL2FybS9rZXJuZWwvc3VzcGVuZC5jICovCitleHRlcm4gdm9pZCBjcHVfZG9fc3VzcGVuZCh2b2lkICopOworZXh0ZXJuIHZvaWQgY3B1X2RvX3Jlc3VtZSh2b2lkICopOwogI2Vsc2UKICNkZWZpbmUgY3B1X3Byb2NfaW5pdAkJCXByb2Nlc3Nvci5fcHJvY19pbml0CiAjZGVmaW5lIGNwdV9wcm9jX2ZpbgkJCXByb2Nlc3Nvci5fcHJvY19maW4KQEAgLTg5LDYgKzkzLDEwIEBACiAjZGVmaW5lIGNwdV9kY2FjaGVfY2xlYW5fYXJlYQkJcHJvY2Vzc29yLmRjYWNoZV9jbGVhbl9hcmVhCiAjZGVmaW5lIGNwdV9zZXRfcHRlX2V4dAkJCXByb2Nlc3Nvci5zZXRfcHRlX2V4dAogI2RlZmluZSBjcHVfZG9fc3dpdGNoX21tCQlwcm9jZXNzb3Iuc3dpdGNoX21tCisKKy8qIFRoZXNlIHRocmVlIGFyZSBwcml2YXRlIHRvIGFyY2gvYXJtL2tlcm5lbC9zdXNwZW5kLmMgKi8KKyNkZWZpbmUgY3B1X2RvX3N1c3BlbmQJCQlwcm9jZXNzb3IuZG9fc3VzcGVuZAorI2RlZmluZSBjcHVfZG9fcmVzdW1lCQkJcHJvY2Vzc29yLmRvX3Jlc3VtZQogI2VuZGlmCiAKIGV4dGVybiB2b2lkIGNwdV9yZXN1bWUodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXAuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IDBhMTdiNjIuLjFlNTcxN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcC5oCkBAIC05OSw5ICs5OSw0IEBACiBleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpOwogZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOwogCi0vKgotICogc2hvdyBsb2NhbCBpbnRlcnJ1cHQgaW5mbwotICovCi1leHRlcm4gdm9pZCBzaG93X2xvY2FsX2lycXMoc3RydWN0IHNlcV9maWxlICosIGludCk7Ci0KICNlbmRpZiAvKiBpZm5kZWYgX19BU01fQVJNX1NNUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXBfdHdkLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXBfdHdkLmgKaW5kZXggZmVkOTk4MS4uZWY5ZmZiYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcF90d2QuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXBfdHdkLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogZXh0ZXJuIHZvaWQgX19pb21lbSAqdHdkX2Jhc2U7CiAKLWludCB0d2RfdGltZXJfYWNrKHZvaWQpOwogdm9pZCB0d2RfdGltZXJfc2V0dXAoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKK3ZvaWQgdHdkX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NvY2tldC5oCmluZGV4IDkwZmZkMDQuLmRlYzZmOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC02Miw0ICs2Miw3IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3VzcGVuZC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3VzcGVuZC5oCmluZGV4IGIwZTRlMWEuLjFjMGE1NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N1c3BlbmQuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zdXNwZW5kLmgKQEAgLTEsMjIgKzEsNyBAQAogI2lmbmRlZiBfX0FTTV9BUk1fU1VTUEVORF9ICiAjZGVmaW5lIF9fQVNNX0FSTV9TVVNQRU5EX0gKIAotI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KLSNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLQogZXh0ZXJuIHZvaWQgY3B1X3Jlc3VtZSh2b2lkKTsKLQotLyoKLSAqIEhpZGUgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgdG8gX19jcHVfc3VzcGVuZCAtIHRoZXNlIGFyZSBhbiBpbXBsZW1lbnRhdGlvbgotICogZGV0YWlsIHdoaWNoIHBsYXRmb3JtIGNvZGUgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgY3B1X3N1c3BlbmQodW5zaWduZWQgbG9uZyBhcmcsIGludCAoKmZuKSh1bnNpZ25lZCBsb25nKSkKLXsKLQlleHRlcm4gaW50IF9fY3B1X3N1c3BlbmQoaW50LCBsb25nLCB1bnNpZ25lZCBsb25nLAotCQkJCSBpbnQgKCopKHVuc2lnbmVkIGxvbmcpKTsKLQlpbnQgcmV0ID0gX19jcHVfc3VzcGVuZCgwLCBQSFlTX09GRlNFVCAtIFBBR0VfT0ZGU0VULCBhcmcsIGZuKTsKLQlmbHVzaF90bGJfYWxsKCk7Ci0JcmV0dXJuIHJldDsKLX0KK2V4dGVybiBpbnQgY3B1X3N1c3BlbmQodW5zaWduZWQgbG9uZywgaW50ICgqKSh1bnNpZ25lZCBsb25nKSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlIGIvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCmluZGV4IDY4MDM2ZWUuLjE2ZWVkNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKQEAgLTI5LDcgKzI5LDcgQEAKIG9iai0kKENPTkZJR19BUlRIVVIpCQkrPSBhcnRodXIubwogb2JqLSQoQ09ORklHX0lTQV9ETUEpCQkrPSBkbWEtaXNhLm8KIG9iai0kKENPTkZJR19QQ0kpCQkrPSBiaW9zMzIubyBpc2Eubwotb2JqLSQoQ09ORklHX0FSTV9DUFVfU1VTUEVORCkJKz0gc2xlZXAubworb2JqLSQoQ09ORklHX0FSTV9DUFVfU1VTUEVORCkJKz0gc2xlZXAubyBzdXNwZW5kLm8KIG9iai0kKENPTkZJR19IQVZFX1NDSEVEX0NMT0NLKQkrPSBzY2hlZF9jbG9jay5vCiBvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc21wX3RsYi5vCiBvYmotJChDT05GSUdfSEFWRV9BUk1fU0NVKQkrPSBzbXBfc2N1Lm8KQEAgLTQzLDYgKzQzLDEzIEBACiBlbHNlCiBvYmotJChDT05GSUdfS1BST0JFUykJCSs9IGtwcm9iZXMtYXJtLm8KIGVuZGlmCitvYmotJChDT05GSUdfQVJNX0tQUk9CRVNfVEVTVCkJKz0gdGVzdC1rcHJvYmVzLm8KK3Rlc3Qta3Byb2Jlcy1vYmpzCQk6PSBrcHJvYmVzLXRlc3QubworaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKK3Rlc3Qta3Byb2Jlcy1vYmpzCQkrPSBrcHJvYmVzLXRlc3QtdGh1bWIubworZWxzZQordGVzdC1rcHJvYmVzLW9ianMJCSs9IGtwcm9iZXMtdGVzdC1hcm0ubworZW5kaWYKIG9iai0kKENPTkZJR19BVEFHU19QUk9DKQkrPSBhdGFncy5vCiBvYmotJChDT05GSUdfT0FCSV9DT01QQVQpCSs9IHN5c19vYWJpLWNvbXBhdC5vCiBvYmotJChDT05GSUdfQVJNX1RIVU1CRUUpCSs9IHRodW1iZWUubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMgYi9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYwppbmRleCA4ZTNjNmYxLi41YjBiY2U2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYwpAQCAtNyw3ICs3LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvaGFzaC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCmluZGV4IGMwZDkyMDMuLmI1MzBlOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKQEAgLTUsNyArNSw3IEBACiAgKgogICogIEJpdHMgdGFrZW4gZnJvbSB2YXJpb3VzIHBsYWNlcy4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9kZWJ1Zy5TIGIvYXJjaC9hcm0va2VybmVsL2RlYnVnLlMKaW5kZXggMGY4NTJkMC4uMjA0ZTIxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2RlYnVnLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2RlYnVnLlMKQEAgLTIyLDcgKzIyLDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19JQ0VEQ0MpCiAJCUBAIGRlYnVnIHVzaW5nIEFSTSBFbWJlZGRlZElDRSBEQ0MgY2hhbm5lbAogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJLmVuZG0KIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9WNikgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1Y2SykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1Y3KQpAQCAtMTA2LDcgKzEwNiw3IEBACiAKICNpZmRlZiBDT05GSUdfTU1VCiAJCS5tYWNybwlhZGRydWFydF9jdXJyZW50LCByeCwgdG1wMSwgdG1wMgotCQlhZGRydWFydAlcdG1wMSwgXHRtcDIKKwkJYWRkcnVhcnQJXHRtcDEsIFx0bXAyLCBccngKIAkJbXJjCQlwMTUsIDAsIFxyeCwgYzEsIGMwCiAJCXRzdAkJXHJ4LCAjMQogCQltb3ZlcQkJXHJ4LCBcdG1wMQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYyBiL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKaW5kZXggMWEzM2U5ZC4uYmVlN2Y5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCkBAIC05LDcgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbGYuYyBiL2FyY2gvYXJtL2tlcm5lbC9lbGYuYwppbmRleCA5YjA1YzZhLi5kZGJhNDFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZWxmLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VsZi5jCkBAIC0xLDQgKzEsNCBAQAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZXRtLmMgYi9hcmNoL2FybS9rZXJuZWwvZXRtLmMKaW5kZXggMWJlYzhiNS4uMzZkMjBiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2V0bS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9ldG0uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY29yZXNpZ2h0Lmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCmluZGV4IDIzOTcwM2QuLjU2NmM1NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwpAQCAtOTksNyArOTksNyBAQAogCXN1YglyNCwgcjMsIHI0CQkJQCAoUEhZU19PRkZTRVQgLSBQQUdFX09GRlNFVCkKIAlhZGQJcjgsIHI4LCByNAkJCUAgUEhZU19PRkZTRVQKICNlbHNlCi0JbGRyCXI4LCA9UExBVF9QSFlTX09GRlNFVAorCWxkcglyOCwgPVBIWVNfT0ZGU0VUCQlAIGFsd2F5cyBjb25zdGFudCBpbiB0aGlzIGNhc2UKICNlbmRpZgogCiAJLyoKQEAgLTIzOCw3ICsyMzgsNyBAQAogCSAqIFRoaXMgYWxsb3dzIGRlYnVnIG1lc3NhZ2VzIHRvIGJlIG91dHB1dAogCSAqIHZpYSBhIHNlcmlhbCBjb25zb2xlIGJlZm9yZSBwYWdpbmdfaW5pdC4KIAkgKi8KLQlhZGRydWFydCByNywgcjMKKwlhZGRydWFydCByNywgcjMsIHIwCiAKIAltb3YJcjMsIHIzLCBsc3IgI1NFQ1RJT05fU0hJRlQKIAltb3YJcjMsIHIzLCBsc2wgI1BNRF9PUkRFUgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2h3X2JyZWFrcG9pbnQuYyBiL2FyY2gvYXJtL2tlcm5lbC9od19icmVha3BvaW50LmMKaW5kZXggYTkyN2NhMS4uODE0YTUyYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9od19icmVha3BvaW50LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2h3X2JyZWFrcG9pbnQuYwpAQCAtNDUsNyArNDUsNiBAQAogCiAvKiBOdW1iZXIgb2YgQlJQL1dSUCByZWdpc3RlcnMgb24gdGhpcyBDUFUuICovCiBzdGF0aWMgaW50IGNvcmVfbnVtX2JycHM7Ci1zdGF0aWMgaW50IGNvcmVfbnVtX3Jlc2VydmVkX2JycHM7CiBzdGF0aWMgaW50IGNvcmVfbnVtX3dycHM7CiAKIC8qIERlYnVnIGFyY2hpdGVjdHVyZSB2ZXJzaW9uLiAqLwpAQCAtMTM3LDEwICsxMzYsMTEgQEAKIAl1MzIgZGlkcjsKIAogCS8qIERvIHdlIGltcGxlbWVudCB0aGUgZXh0ZW5kZWQgQ1BVSUQgaW50ZXJmYWNlPyAqLwotCWlmIChXQVJOX09OQ0UoKCgocmVhZF9jcHVpZF9pZCgpID4+IDE2KSAmIDB4ZikgIT0gMHhmKSwKLQkgICAgIkNQVUlEIGZlYXR1cmUgcmVnaXN0ZXJzIG5vdCBzdXBwb3J0ZWQuICIKLQkgICAgIkFzc3VtaW5nIHY2IGRlYnVnIGlzIHByZXNlbnQuXG4iKSkKKwlpZiAoKChyZWFkX2NwdWlkX2lkKCkgPj4gMTYpICYgMHhmKSAhPSAweGYpIHsKKwkJcHJfd2FybmluZygiQ1BVSUQgZmVhdHVyZSByZWdpc3RlcnMgbm90IHN1cHBvcnRlZC4gIgorCQkJICAgIkFzc3VtaW5nIHY2IGRlYnVnIGlzIHByZXNlbnQuXG4iKTsKIAkJcmV0dXJuIEFSTV9ERUJVR19BUkNIX1Y2OworCX0KIAogCUFSTV9EQkdfUkVBRChjMCwgMCwgZGlkcik7CiAJcmV0dXJuIChkaWRyID4+IDE2KSAmIDB4ZjsKQEAgLTE1NCwxMCArMTU0LDIxIEBACiBzdGF0aWMgaW50IGRlYnVnX2FyY2hfc3VwcG9ydGVkKHZvaWQpCiB7CiAJdTggYXJjaCA9IGdldF9kZWJ1Z19hcmNoKCk7Ci0JcmV0dXJuIGFyY2ggPj0gQVJNX0RFQlVHX0FSQ0hfVjYgJiYgYXJjaCA8PSBBUk1fREVCVUdfQVJDSF9WN19FQ1AxNDsKKworCS8qIFdlIGRvbid0IHN1cHBvcnQgdGhlIG1lbW9yeS1tYXBwZWQgaW50ZXJmYWNlLiAqLworCXJldHVybiAoYXJjaCA+PSBBUk1fREVCVUdfQVJDSF9WNiAmJiBhcmNoIDw9IEFSTV9ERUJVR19BUkNIX1Y3X0VDUDE0KSB8fAorCQlhcmNoID49IEFSTV9ERUJVR19BUkNIX1Y3XzE7CiB9CiAKLS8qIERldGVybWluZSBudW1iZXIgb2YgQlJQIHJlZ2lzdGVyIGF2YWlsYWJsZS4gKi8KKy8qIERldGVybWluZSBudW1iZXIgb2YgV1JQIHJlZ2lzdGVycyBhdmFpbGFibGUuICovCitzdGF0aWMgaW50IGdldF9udW1fd3JwX3Jlc291cmNlcyh2b2lkKQoreworCXUzMiBkaWRyOworCUFSTV9EQkdfUkVBRChjMCwgMCwgZGlkcik7CisJcmV0dXJuICgoZGlkciA+PiAyOCkgJiAweGYpICsgMTsKK30KKworLyogRGV0ZXJtaW5lIG51bWJlciBvZiBCUlAgcmVnaXN0ZXJzIGF2YWlsYWJsZS4gKi8KIHN0YXRpYyBpbnQgZ2V0X251bV9icnBfcmVzb3VyY2VzKHZvaWQpCiB7CiAJdTMyIGRpZHI7CkBAIC0xNzYsOSArMTg3LDEwIEBACiBzdGF0aWMgaW50IGdldF9udW1fd3Jwcyh2b2lkKQogewogCS8qCi0JICogRklYTUU6IFdoZW4gYSB3YXRjaHBvaW50IGZpcmVzLCB0aGUgb25seSB3YXkgdG8gd29yayBvdXQgd2hpY2gKLQkgKiB3YXRjaHBvaW50IGl0IHdhcyBpcyBieSBkaXNhc3NlbWJsaW5nIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbgotCSAqIGFuZCB3b3JraW5nIG91dCB0aGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGFjY2Vzcy4KKwkgKiBPbiBkZWJ1ZyBhcmNoaXRlY3R1cmVzIHByaW9yIHRvIDcuMSwgd2hlbiBhIHdhdGNocG9pbnQgZmlyZXMsIHRoZQorCSAqIG9ubHkgd2F5IHRvIHdvcmsgb3V0IHdoaWNoIHdhdGNocG9pbnQgaXQgd2FzIGlzIGJ5IGRpc2Fzc2VtYmxpbmcKKwkgKiB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gYW5kIHdvcmtpbmcgb3V0IHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkKKwkgKiBhY2Nlc3MuCiAJICoKIAkgKiBGdXJ0aGVybW9yZSwgd2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgd2F0Y2hwb2ludCB3YXMgcHJlY2lzZQogCSAqIHNpbmNlIGltcHJlY2lzZSB3YXRjaHBvaW50cyBwcmV2ZW50IHVzIGZyb20gY2FsY3VsYXRpbmcgcmVnaXN0ZXIKQEAgLTE5MiwzNiArMjA0LDE3IEBACiAJICogW3RoZSBBUk0gQVJNIHN0YXRlcyB0aGF0IHRoZSBERkFSIGlzIFVOS05PV04sIGJ1dCBleHBlcmllbmNlIHNob3dzCiAJICogdGhhdCBpdCBpcyBzZXQgb24gc29tZSBpbXBsZW1lbnRhdGlvbnNdLgogCSAqLworCWlmIChnZXRfZGVidWdfYXJjaCgpIDwgQVJNX0RFQlVHX0FSQ0hfVjdfMSkKKwkJcmV0dXJuIDE7CiAKLSNpZiAwCi0JaW50IHdycHM7Ci0JdTMyIGRpZHI7Ci0JQVJNX0RCR19SRUFEKGMwLCAwLCBkaWRyKTsKLQl3cnBzID0gKChkaWRyID4+IDI4KSAmIDB4ZikgKyAxOwotI2VuZGlmCi0JaW50IHdycHMgPSAxOwotCi0JaWYgKGNvcmVfaGFzX21pc21hdGNoX2JycHMoKSAmJiB3cnBzID49IGdldF9udW1fYnJwX3Jlc291cmNlcygpKQotCQl3cnBzID0gZ2V0X251bV9icnBfcmVzb3VyY2VzKCkgLSAxOwotCi0JcmV0dXJuIHdycHM7Ci19Ci0KLS8qIFdlIHJlc2VydmUgb25lIGJyZWFrcG9pbnQgZm9yIGVhY2ggd2F0Y2hwb2ludC4gKi8KLXN0YXRpYyBpbnQgZ2V0X251bV9yZXNlcnZlZF9icnBzKHZvaWQpCi17Ci0JaWYgKGNvcmVfaGFzX21pc21hdGNoX2JycHMoKSkKLQkJcmV0dXJuIGdldF9udW1fd3JwcygpOwotCXJldHVybiAwOworCXJldHVybiBnZXRfbnVtX3dycF9yZXNvdXJjZXMoKTsKIH0KIAogLyogRGV0ZXJtaW5lIG51bWJlciBvZiB1c2FibGUgQlJQcyBhdmFpbGFibGUuICovCiBzdGF0aWMgaW50IGdldF9udW1fYnJwcyh2b2lkKQogewogCWludCBicnBzID0gZ2V0X251bV9icnBfcmVzb3VyY2VzKCk7Ci0JaWYgKGNvcmVfaGFzX21pc21hdGNoX2JycHMoKSkKLQkJYnJwcyAtPSBnZXRfbnVtX3Jlc2VydmVkX2JycHMoKTsKLQlyZXR1cm4gYnJwczsKKwlyZXR1cm4gY29yZV9oYXNfbWlzbWF0Y2hfYnJwcygpID8gYnJwcyAtIDEgOiBicnBzOwogfQogCiAvKgpAQCAtMjM5LDcgKzIzMiw3IEBACiAKIAkvKiBFbnN1cmUgdGhhdCBoYWx0aW5nIG1vZGUgaXMgZGlzYWJsZWQuICovCiAJaWYgKFdBUk5fT05DRShkc2NyICYgQVJNX0RTQ1JfSERCR0VOLAotCQkJImhhbHRpbmcgZGVidWcgbW9kZSBlbmFibGVkLiBVbmFibGUgdG8gYWNjZXNzIGhhcmR3YXJlIHJlc291cmNlcy5cbiIpKSB7CisJCSJoYWx0aW5nIGRlYnVnIG1vZGUgZW5hYmxlZC4gVW5hYmxlIHRvIGFjY2VzcyBoYXJkd2FyZSByZXNvdXJjZXMuXG4iKSkgewogCQlyZXQgPSAtRVBFUk07CiAJCWdvdG8gb3V0OwogCX0KQEAgLTI1NSw2ICsyNDgsNyBAQAogCQlBUk1fREJHX1dSSVRFKGMxLCAwLCAoZHNjciB8IEFSTV9EU0NSX01EQkdFTikpOwogCQlicmVhazsKIAljYXNlIEFSTV9ERUJVR19BUkNIX1Y3X0VDUDE0OgorCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjdfMToKIAkJQVJNX0RCR19XUklURShjMiwgMiwgKGRzY3IgfCBBUk1fRFNDUl9NREJHRU4pKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTM0NiwyNCArMzQwLDEwIEBACiAJCXZhbF9iYXNlID0gQVJNX0JBU0VfQlZSOwogCQlzbG90cyA9IChzdHJ1Y3QgcGVyZl9ldmVudCAqKilfX2dldF9jcHVfdmFyKGJwX29uX3JlZyk7CiAJCW1heF9zbG90cyA9IGNvcmVfbnVtX2JycHM7Ci0JCWlmIChpbmZvLT5zdGVwX2N0cmwuZW5hYmxlZCkgewotCQkJLyogT3ZlcnJpZGUgdGhlIGJyZWFrcG9pbnQgZGF0YSB3aXRoIHRoZSBzdGVwIGRhdGEuICovCi0JCQlhZGRyID0gaW5mby0+dHJpZ2dlciAmIH4weDM7Ci0JCQljdHJsID0gZW5jb2RlX2N0cmxfcmVnKGluZm8tPnN0ZXBfY3RybCk7Ci0JCX0KIAl9IGVsc2UgewogCQkvKiBXYXRjaHBvaW50ICovCi0JCWlmIChpbmZvLT5zdGVwX2N0cmwuZW5hYmxlZCkgewotCQkJLyogSW5zdGFsbCBpbnRvIHRoZSByZXNlcnZlZCBicmVha3BvaW50IHJlZ2lvbi4gKi8KLQkJCWN0cmxfYmFzZSA9IEFSTV9CQVNFX0JDUiArIGNvcmVfbnVtX2JycHM7Ci0JCQl2YWxfYmFzZSA9IEFSTV9CQVNFX0JWUiArIGNvcmVfbnVtX2JycHM7Ci0JCQkvKiBPdmVycmlkZSB0aGUgd2F0Y2hwb2ludCBkYXRhIHdpdGggdGhlIHN0ZXAgZGF0YS4gKi8KLQkJCWFkZHIgPSBpbmZvLT50cmlnZ2VyICYgfjB4MzsKLQkJCWN0cmwgPSBlbmNvZGVfY3RybF9yZWcoaW5mby0+c3RlcF9jdHJsKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfYmFzZSA9IEFSTV9CQVNFX1dDUjsKLQkJCXZhbF9iYXNlID0gQVJNX0JBU0VfV1ZSOwotCQl9CisJCWN0cmxfYmFzZSA9IEFSTV9CQVNFX1dDUjsKKwkJdmFsX2Jhc2UgPSBBUk1fQkFTRV9XVlI7CiAJCXNsb3RzID0gKHN0cnVjdCBwZXJmX2V2ZW50ICoqKV9fZ2V0X2NwdV92YXIod3Bfb25fcmVnKTsKIAkJbWF4X3Nsb3RzID0gY29yZV9udW1fd3JwczsKIAl9CkBAIC0zODIsNiArMzYyLDE3IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCS8qIE92ZXJyaWRlIHRoZSBicmVha3BvaW50IGRhdGEgd2l0aCB0aGUgc3RlcCBkYXRhLiAqLworCWlmIChpbmZvLT5zdGVwX2N0cmwuZW5hYmxlZCkgeworCQlhZGRyID0gaW5mby0+dHJpZ2dlciAmIH4weDM7CisJCWN0cmwgPSBlbmNvZGVfY3RybF9yZWcoaW5mby0+c3RlcF9jdHJsKTsKKwkJaWYgKGluZm8tPmN0cmwudHlwZSAhPSBBUk1fQlJFQUtQT0lOVF9FWEVDVVRFKSB7CisJCQlpID0gMDsKKwkJCWN0cmxfYmFzZSA9IEFSTV9CQVNFX0JDUiArIGNvcmVfbnVtX2JycHM7CisJCQl2YWxfYmFzZSA9IEFSTV9CQVNFX0JWUiArIGNvcmVfbnVtX2JycHM7CisJCX0KKwl9CisKIAkvKiBTZXR1cCB0aGUgYWRkcmVzcyByZWdpc3Rlci4gKi8KIAl3cml0ZV93Yl9yZWcodmFsX2Jhc2UgKyBpLCBhZGRyKTsKIApAQCAtNDA1LDEwICszOTYsNyBAQAogCQltYXhfc2xvdHMgPSBjb3JlX251bV9icnBzOwogCX0gZWxzZSB7CiAJCS8qIFdhdGNocG9pbnQgKi8KLQkJaWYgKGluZm8tPnN0ZXBfY3RybC5lbmFibGVkKQotCQkJYmFzZSA9IEFSTV9CQVNFX0JDUiArIGNvcmVfbnVtX2JycHM7Ci0JCWVsc2UKLQkJCWJhc2UgPSBBUk1fQkFTRV9XQ1I7CisJCWJhc2UgPSBBUk1fQkFTRV9XQ1I7CiAJCXNsb3RzID0gKHN0cnVjdCBwZXJmX2V2ZW50ICoqKV9fZ2V0X2NwdV92YXIod3Bfb25fcmVnKTsKIAkJbWF4X3Nsb3RzID0gY29yZV9udW1fd3JwczsKIAl9CkBAIC00MjYsNiArNDE0LDEzIEBACiAJaWYgKFdBUk5fT05DRShpID09IG1heF9zbG90cywgIkNhbid0IGZpbmQgYW55IGJyZWFrcG9pbnQgc2xvdFxuIikpCiAJCXJldHVybjsKIAorCS8qIEVuc3VyZSB0aGF0IHdlIGRpc2FibGUgdGhlIG1pc21hdGNoIGJyZWFrcG9pbnQuICovCisJaWYgKGluZm8tPmN0cmwudHlwZSAhPSBBUk1fQlJFQUtQT0lOVF9FWEVDVVRFICYmCisJICAgIGluZm8tPnN0ZXBfY3RybC5lbmFibGVkKSB7CisJCWkgPSAwOworCQliYXNlID0gQVJNX0JBU0VfQkNSICsgY29yZV9udW1fYnJwczsKKwl9CisKIAkvKiBSZXNldCB0aGUgY29udHJvbCByZWdpc3Rlci4gKi8KIAl3cml0ZV93Yl9yZWcoYmFzZSArIGksIDApOwogfQpAQCAtNjMyLDEwICs2MjcsOSBAQAogCSAqIHdlIGNhbiB1c2UgdGhlIG1pc21hdGNoIGZlYXR1cmUgYXMgYSBwb29yLW1hbidzIGhhcmR3YXJlCiAJICogc2luZ2xlLXN0ZXAsIGJ1dCB0aGlzIG9ubHkgd29ya3MgZm9yIHBlci10YXNrIGJyZWFrcG9pbnRzLgogCSAqLwotCWlmIChXQVJOX09OQ0UoIWJwLT5vdmVyZmxvd19oYW5kbGVyICYmCi0JCShhcmNoX2NoZWNrX2JwX2luX2tlcm5lbHNwYWNlKGJwKSB8fCAhY29yZV9oYXNfbWlzbWF0Y2hfYnJwcygpCi0JCSB8fCAhYnAtPmh3LmJwX3RhcmdldCksCi0JCQkib3ZlcmZsb3cgaGFuZGxlciByZXF1aXJlZCBidXQgbm9uZSBmb3VuZFxuIikpIHsKKwlpZiAoIWJwLT5vdmVyZmxvd19oYW5kbGVyICYmIChhcmNoX2NoZWNrX2JwX2luX2tlcm5lbHNwYWNlKGJwKSB8fAorCSAgICAhY29yZV9oYXNfbWlzbWF0Y2hfYnJwcygpIHx8ICFicC0+aHcuYnBfdGFyZ2V0KSkgeworCQlwcl93YXJuaW5nKCJvdmVyZmxvdyBoYW5kbGVyIHJlcXVpcmVkIGJ1dCBub25lIGZvdW5kXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiBvdXQ6CkBAIC02NjYsMzQgKzY2MCw2MiBAQAogCWFyY2hfaW5zdGFsbF9od19icmVha3BvaW50KGJwKTsKIH0KIAotc3RhdGljIHZvaWQgd2F0Y2hwb2ludF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgdW5rbm93biwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCB3YXRjaHBvaW50X2hhbmRsZXIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZnNyLAorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWludCBpOworCWludCBpLCBhY2Nlc3M7CisJdTMyIHZhbCwgY3RybF9yZWcsIGFsaWdubWVudF9tYXNrOwogCXN0cnVjdCBwZXJmX2V2ZW50ICp3cCwgKipzbG90czsKIAlzdHJ1Y3QgYXJjaF9od19icmVha3BvaW50ICppbmZvOworCXN0cnVjdCBhcmNoX2h3X2JyZWFrcG9pbnRfY3RybCBjdHJsOwogCiAJc2xvdHMgPSAoc3RydWN0IHBlcmZfZXZlbnQgKiopX19nZXRfY3B1X3Zhcih3cF9vbl9yZWcpOwogCi0JLyogV2l0aG91dCBhIGRpc2Fzc2VtYmxlciwgd2UgY2FuIG9ubHkgaGFuZGxlIDEgd2F0Y2hwb2ludC4gKi8KLQlCVUdfT04oY29yZV9udW1fd3JwcyA+IDEpOwotCiAJZm9yIChpID0gMDsgaSA8IGNvcmVfbnVtX3dycHM7ICsraSkgewogCQlyY3VfcmVhZF9sb2NrKCk7CiAKIAkJd3AgPSBzbG90c1tpXTsKIAotCQlpZiAod3AgPT0gTlVMTCkgewotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQljb250aW51ZTsKKwkJaWYgKHdwID09IE5VTEwpCisJCQlnb3RvIHVubG9jazsKKworCQlpbmZvID0gY291bnRlcl9hcmNoX2JwKHdwKTsKKwkJLyoKKwkJICogVGhlIERGQVIgaXMgYW4gdW5rbm93biB2YWx1ZSBvbiBkZWJ1ZyBhcmNoaXRlY3R1cmVzIHByaW9yCisJCSAqIHRvIDcuMS4gU2luY2Ugd2Ugb25seSBhbGxvdyBhIHNpbmdsZSB3YXRjaHBvaW50IG9uIHRoZXNlCisJCSAqIG9sZGVyIENQVXMsIHdlIGNhbiBzZXQgdGhlIHRyaWdnZXIgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZQorCQkgKiBmYXVsdGluZyBhZGRyZXNzLgorCQkgKi8KKwkJaWYgKGRlYnVnX2FyY2ggPCBBUk1fREVCVUdfQVJDSF9WN18xKSB7CisJCQlCVUdfT04oaSA+IDApOworCQkJaW5mby0+dHJpZ2dlciA9IHdwLT5hdHRyLmJwX2FkZHI7CisJCX0gZWxzZSB7CisJCQlpZiAoaW5mby0+Y3RybC5sZW4gPT0gQVJNX0JSRUFLUE9JTlRfTEVOXzgpCisJCQkJYWxpZ25tZW50X21hc2sgPSAweDc7CisJCQllbHNlCisJCQkJYWxpZ25tZW50X21hc2sgPSAweDM7CisKKwkJCS8qIENoZWNrIGlmIHRoZSB3YXRjaHBvaW50IHZhbHVlIG1hdGNoZXMuICovCisJCQl2YWwgPSByZWFkX3diX3JlZyhBUk1fQkFTRV9XVlIgKyBpKTsKKwkJCWlmICh2YWwgIT0gKGFkZHIgJiB+YWxpZ25tZW50X21hc2spKQorCQkJCWdvdG8gdW5sb2NrOworCisJCQkvKiBQb3NzaWJsZSBtYXRjaCwgY2hlY2sgdGhlIGJ5dGUgYWRkcmVzcyBzZWxlY3QuICovCisJCQljdHJsX3JlZyA9IHJlYWRfd2JfcmVnKEFSTV9CQVNFX1dDUiArIGkpOworCQkJZGVjb2RlX2N0cmxfcmVnKGN0cmxfcmVnLCAmY3RybCk7CisJCQlpZiAoISgoMSA8PCAoYWRkciAmIGFsaWdubWVudF9tYXNrKSkgJiBjdHJsLmxlbikpCisJCQkJZ290byB1bmxvY2s7CisKKwkJCS8qIENoZWNrIHRoYXQgdGhlIGFjY2VzcyB0eXBlIG1hdGNoZXMuICovCisJCQlhY2Nlc3MgPSAoZnNyICYgQVJNX0ZTUl9BQ0NFU1NfTUFTSykgPyBIV19CUkVBS1BPSU5UX1cgOgorCQkJCSBIV19CUkVBS1BPSU5UX1I7CisJCQlpZiAoIShhY2Nlc3MgJiBod19icmVha3BvaW50X3R5cGUod3ApKSkKKwkJCQlnb3RvIHVubG9jazsKKworCQkJLyogV2UgaGF2ZSBhIHdpbm5lci4gKi8KKwkJCWluZm8tPnRyaWdnZXIgPSBhZGRyOwogCQl9CiAKLQkJLyoKLQkJICogVGhlIERGQVIgaXMgYW4gdW5rbm93biB2YWx1ZS4gU2luY2Ugd2Ugb25seSBhbGxvdyBhCi0JCSAqIHNpbmdsZSB3YXRjaHBvaW50LCB3ZSBjYW4gc2V0IHRoZSB0cmlnZ2VyIHRvIHRoZSBsb3dlc3QKLQkJICogcG9zc2libGUgZmF1bHRpbmcgYWRkcmVzcy4KLQkJICovCi0JCWluZm8gPSBjb3VudGVyX2FyY2hfYnAod3ApOwotCQlpbmZvLT50cmlnZ2VyID0gd3AtPmF0dHIuYnBfYWRkcjsKIAkJcHJfZGVidWcoIndhdGNocG9pbnQgZmlyZWQ6IGFkZHJlc3MgPSAweCV4XG4iLCBpbmZvLT50cmlnZ2VyKTsKIAkJcGVyZl9icF9ldmVudCh3cCwgcmVncyk7CiAKQEAgLTcwNSw2ICs3MjcsNyBAQAogCQlpZiAoIXdwLT5vdmVyZmxvd19oYW5kbGVyKQogCQkJZW5hYmxlX3NpbmdsZV9zdGVwKHdwLCBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpKTsKIAordW5sb2NrOgogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiB9CkBAIC03MTcsNyArNzQwLDcgQEAKIAogCXNsb3RzID0gKHN0cnVjdCBwZXJmX2V2ZW50ICoqKV9fZ2V0X2NwdV92YXIod3Bfb25fcmVnKTsKIAotCWZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9yZXNlcnZlZF9icnBzOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgY29yZV9udW1fd3JwczsgKytpKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKIAogCQl3cCA9IHNsb3RzW2ldOwpAQCAtODIwLDcgKzg0Myw3IEBACiAJY2FzZSBBUk1fRU5UUllfQVNZTkNfV0FUQ0hQT0lOVDoKIAkJV0FSTigxLCAiQXN5bmNocm9ub3VzIHdhdGNocG9pbnQgZXhjZXB0aW9uIHRha2VuLiBEZWJ1Z2dpbmcgcmVzdWx0cyBtYXkgYmUgdW5yZWxpYWJsZVxuIik7CiAJY2FzZSBBUk1fRU5UUllfU1lOQ19XQVRDSFBPSU5UOgotCQl3YXRjaHBvaW50X2hhbmRsZXIoYWRkciwgcmVncyk7CisJCXdhdGNocG9pbnRfaGFuZGxlcihhZGRyLCBmc3IsIHJlZ3MpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAxOyAvKiBVbmhhbmRsZWQgZmF1bHQuICovCkBAIC04MzQsMTEgKzg1NywzMSBAQAogLyoKICAqIE9uZS10aW1lIGluaXRpYWxpc2F0aW9uLgogICovCi1zdGF0aWMgdm9pZCByZXNldF9jdHJsX3JlZ3Modm9pZCAqaW5mbykKK3N0YXRpYyBjcHVtYXNrX3QgZGVidWdfZXJyX21hc2s7CisKK3N0YXRpYyBpbnQgZGVidWdfcmVnX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnN0cikKIHsKLQlpbnQgaSwgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlwcl93YXJuaW5nKCJEZWJ1ZyByZWdpc3RlciBhY2Nlc3MgKDB4JXgpIGNhdXNlZCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gb24gQ1BVICVkXG4iLAorCQkgICBpbnN0ciwgY3B1KTsKKworCS8qIFNldCB0aGUgZXJyb3IgZmxhZyBmb3IgdGhpcyBDUFUgYW5kIHNraXAgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uLiAqLworCWNwdW1hc2tfc2V0X2NwdShjcHUsICZkZWJ1Z19lcnJfbWFzayk7CisJaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSArPSA0OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHVuZGVmX2hvb2sgZGVidWdfcmVnX2hvb2sgPSB7CisJLmluc3RyX21hc2sJPSAweDBmZTgwZjEwLAorCS5pbnN0cl92YWwJPSAweDBlMDAwZTEwLAorCS5mbgkJPSBkZWJ1Z19yZWdfdHJhcCwKK307CisKK3N0YXRpYyB2b2lkIHJlc2V0X2N0cmxfcmVncyh2b2lkICp1bnVzZWQpCit7CisJaW50IGksIHJhd19udW1fYnJwcywgZXJyID0gMCwgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXUzMiBkYmdfcG93ZXI7Ci0JY3B1bWFza190ICpjcHVtYXNrID0gaW5mbzsKIAogCS8qCiAJICogdjcgZGVidWcgY29udGFpbnMgc2F2ZSBhbmQgcmVzdG9yZSByZWdpc3RlcnMgc28gdGhhdCBkZWJ1ZyBzdGF0ZQpAQCAtODQ4LDM4ICs4OTEsNTcgQEAKIAkgKiBBY2Nlc3MgUmVnaXN0ZXIgdG8gYXZvaWQgdGFraW5nIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiBleGNlcHRpb25zCiAJICogbGF0ZXIgb24uCiAJICovCi0JaWYgKGRlYnVnX2FyY2ggPj0gQVJNX0RFQlVHX0FSQ0hfVjdfRUNQMTQpIHsKKwlzd2l0Y2ggKGRlYnVnX2FyY2gpIHsKKwljYXNlIEFSTV9ERUJVR19BUkNIX1Y2OgorCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjZfMToKKwkJLyogQVJNdjYgY29yZXMganVzdCBuZWVkIHRvIHJlc2V0IHRoZSByZWdpc3RlcnMuICovCisJCWdvdG8gcmVzZXRfcmVnczsKKwljYXNlIEFSTV9ERUJVR19BUkNIX1Y3X0VDUDE0OgogCQkvKgogCQkgKiBFbnN1cmUgc3RpY2t5IHBvd2VyLWRvd24gaXMgY2xlYXIgKGkuZS4gZGVidWcgbG9naWMgaXMKIAkJICogcG93ZXJlZCB1cCkuCiAJCSAqLwogCQlhc20gdm9sYXRpbGUoIm1yYyBwMTQsIDAsICUwLCBjMSwgYzUsIDQiIDogIj1yIiAoZGJnX3Bvd2VyKSk7Ci0JCWlmICgoZGJnX3Bvd2VyICYgMHgxKSA9PSAwKSB7Ci0JCQlwcl93YXJuaW5nKCJDUFUgJWQgZGVidWcgaXMgcG93ZXJlZCBkb3duIVxuIiwgY3B1KTsKLQkJCWNwdW1hc2tfb3IoY3B1bWFzaywgY3B1bWFzaywgY3B1bWFza19vZihjcHUpKTsKLQkJCXJldHVybjsKLQkJfQotCisJCWlmICgoZGJnX3Bvd2VyICYgMHgxKSA9PSAwKQorCQkJZXJyID0gLUVQRVJNOworCQlicmVhazsKKwljYXNlIEFSTV9ERUJVR19BUkNIX1Y3XzE6CiAJCS8qCi0JCSAqIFVuY29uZGl0aW9uYWxseSBjbGVhciB0aGUgbG9jayBieSB3cml0aW5nIGEgdmFsdWUKLQkJICogb3RoZXIgdGhhbiAweEM1QUNDRTU1IHRvIHRoZSBhY2Nlc3MgcmVnaXN0ZXIuCisJCSAqIEVuc3VyZSB0aGUgT1MgZG91YmxlIGxvY2sgaXMgY2xlYXIuCiAJCSAqLwotCQlhc20gdm9sYXRpbGUoIm1jciBwMTQsIDAsICUwLCBjMSwgYzAsIDQiIDogOiAiciIgKDApKTsKLQkJaXNiKCk7Ci0KLQkJLyoKLQkJICogQ2xlYXIgYW55IGNvbmZpZ3VyZWQgdmVjdG9yLWNhdGNoIGV2ZW50cyBiZWZvcmUKLQkJICogZW5hYmxpbmcgbW9uaXRvciBtb2RlLgotCQkgKi8KLQkJYXNtIHZvbGF0aWxlKCJtY3IgcDE0LCAwLCAlMCwgYzAsIGM3LCAwIiA6IDogInIiICgwKSk7Ci0JCWlzYigpOworCQlhc20gdm9sYXRpbGUoIm1yYyBwMTQsIDAsICUwLCBjMSwgYzMsIDQiIDogIj1yIiAoZGJnX3Bvd2VyKSk7CisJCWlmICgoZGJnX3Bvd2VyICYgMHgxKSA9PSAxKQorCQkJZXJyID0gLUVQRVJNOworCQlicmVhazsKIAl9CiAKKwlpZiAoZXJyKSB7CisJCXByX3dhcm5pbmcoIkNQVSAlZCBkZWJ1ZyBpcyBwb3dlcmVkIGRvd24hXG4iLCBjcHUpOworCQljcHVtYXNrX29yKCZkZWJ1Z19lcnJfbWFzaywgJmRlYnVnX2Vycl9tYXNrLCBjcHVtYXNrX29mKGNwdSkpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBVbmNvbmRpdGlvbmFsbHkgY2xlYXIgdGhlIGxvY2sgYnkgd3JpdGluZyBhIHZhbHVlCisJICogb3RoZXIgdGhhbiAweEM1QUNDRTU1IHRvIHRoZSBhY2Nlc3MgcmVnaXN0ZXIuCisJICovCisJYXNtIHZvbGF0aWxlKCJtY3IgcDE0LCAwLCAlMCwgYzEsIGMwLCA0IiA6IDogInIiICgwKSk7CisJaXNiKCk7CisKKwkvKgorCSAqIENsZWFyIGFueSBjb25maWd1cmVkIHZlY3Rvci1jYXRjaCBldmVudHMgYmVmb3JlCisJICogZW5hYmxpbmcgbW9uaXRvciBtb2RlLgorCSAqLworCWFzbSB2b2xhdGlsZSgibWNyIHAxNCwgMCwgJTAsIGMwLCBjNywgMCIgOiA6ICJyIiAoMCkpOworCWlzYigpOworCityZXNldF9yZWdzOgogCWlmIChlbmFibGVfbW9uaXRvcl9tb2RlKCkpCiAJCXJldHVybjsKIAogCS8qIFdlIG11c3QgYWxzbyByZXNldCBhbnkgcmVzZXJ2ZWQgcmVnaXN0ZXJzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9icnBzICsgY29yZV9udW1fcmVzZXJ2ZWRfYnJwczsgKytpKSB7CisJcmF3X251bV9icnBzID0gZ2V0X251bV9icnBfcmVzb3VyY2VzKCk7CisJZm9yIChpID0gMDsgaSA8IHJhd19udW1fYnJwczsgKytpKSB7CiAJCXdyaXRlX3diX3JlZyhBUk1fQkFTRV9CQ1IgKyBpLCAwVUwpOwogCQl3cml0ZV93Yl9yZWcoQVJNX0JBU0VfQlZSICsgaSwgMFVMKTsKIAl9CkBAIC04OTUsNiArOTU3LDcgQEAKIHsKIAlpZiAoYWN0aW9uID09IENQVV9PTkxJTkUpCiAJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgoaW50KWNwdSwgcmVzZXRfY3RybF9yZWdzLCBOVUxMLCAxKTsKKwogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKQEAgLTkwNSw3ICs5NjgsNiBAQAogc3RhdGljIGludCBfX2luaXQgYXJjaF9od19icmVha3BvaW50X2luaXQodm9pZCkKIHsKIAl1MzIgZHNjcjsKLQljcHVtYXNrX3QgY3B1bWFzayA9IHsgQ1BVX0JJVFNfTk9ORSB9OwogCiAJZGVidWdfYXJjaCA9IGdldF9kZWJ1Z19hcmNoKCk7CiAKQEAgLTkxNiwyOCArOTc4LDMxIEBACiAKIAkvKiBEZXRlcm1pbmUgaG93IG1hbnkgQlJQcy9XUlBzIGFyZSBhdmFpbGFibGUuICovCiAJY29yZV9udW1fYnJwcyA9IGdldF9udW1fYnJwcygpOwotCWNvcmVfbnVtX3Jlc2VydmVkX2JycHMgPSBnZXRfbnVtX3Jlc2VydmVkX2JycHMoKTsKIAljb3JlX251bV93cnBzID0gZ2V0X251bV93cnBzKCk7CiAKLQlwcl9pbmZvKCJmb3VuZCAlZCBicmVha3BvaW50IGFuZCAlZCB3YXRjaHBvaW50IHJlZ2lzdGVycy5cbiIsCi0JCWNvcmVfbnVtX2JycHMgKyBjb3JlX251bV9yZXNlcnZlZF9icnBzLCBjb3JlX251bV93cnBzKTsKLQotCWlmIChjb3JlX251bV9yZXNlcnZlZF9icnBzKQotCQlwcl9pbmZvKCIlZCBicmVha3BvaW50KHMpIHJlc2VydmVkIGZvciB3YXRjaHBvaW50ICIKLQkJCQkic2luZ2xlLXN0ZXAuXG4iLCBjb3JlX251bV9yZXNlcnZlZF9icnBzKTsKKwkvKgorCSAqIFdlIG5lZWQgdG8gdHJlYWQgY2FyZWZ1bGx5IGhlcmUgYmVjYXVzZSBEQkdTV0VOQUJMRSBtYXkgYmUKKwkgKiBkcml2ZW4gbG93IG9uIHRoaXMgY29yZSBhbmQgdGhlcmUgaXNuJ3QgYW4gYXJjaGl0ZWN0ZWQgd2F5IHRvCisJICogZGV0ZXJtaW5lIHRoYXQuCisJICovCisJcmVnaXN0ZXJfdW5kZWZfaG9vaygmZGVidWdfcmVnX2hvb2spOwogCiAJLyoKIAkgKiBSZXNldCB0aGUgYnJlYWtwb2ludCByZXNvdXJjZXMuIFdlIGFzc3VtZSB0aGF0IGEgaGFsdGluZwogCSAqIGRlYnVnZ2VyIHdpbGwgbGVhdmUgdGhlIHdvcmxkIGluIGEgbmljZSBzdGF0ZSBmb3IgdXMuCiAJICovCi0Jb25fZWFjaF9jcHUocmVzZXRfY3RybF9yZWdzLCAmY3B1bWFzaywgMSk7Ci0JaWYgKCFjcHVtYXNrX2VtcHR5KCZjcHVtYXNrKSkgeworCW9uX2VhY2hfY3B1KHJlc2V0X2N0cmxfcmVncywgTlVMTCwgMSk7CisJdW5yZWdpc3Rlcl91bmRlZl9ob29rKCZkZWJ1Z19yZWdfaG9vayk7CisJaWYgKCFjcHVtYXNrX2VtcHR5KCZkZWJ1Z19lcnJfbWFzaykpIHsKIAkJY29yZV9udW1fYnJwcyA9IDA7Ci0JCWNvcmVfbnVtX3Jlc2VydmVkX2JycHMgPSAwOwogCQljb3JlX251bV93cnBzID0gMDsKIAkJcmV0dXJuIDA7CiAJfQogCisJcHJfaW5mbygiZm91bmQgJWQgIiAiJXMiICJicmVha3BvaW50IGFuZCAlZCB3YXRjaHBvaW50IHJlZ2lzdGVycy5cbiIsCisJCWNvcmVfbnVtX2JycHMsIGNvcmVfaGFzX21pc21hdGNoX2JycHMoKSA/ICIoKzEgcmVzZXJ2ZWQpICIgOgorCQkiIiwgY29yZV9udW1fd3Jwcyk7CisKIAlBUk1fREJHX1JFQUQoYzEsIDAsIGRzY3IpOwogCWlmIChkc2NyICYgQVJNX0RTQ1JfSERCR0VOKSB7CiAJCW1heF93YXRjaHBvaW50X2xlbiA9IDQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaW8uYyBiL2FyY2gvYXJtL2tlcm5lbC9pby5jCmluZGV4IGY0NDcwMzAuLmRjZDViNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pby5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pby5jCkBAIC0xLDQgKzEsNCBAQAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2lycS5jIGIvYXJjaC9hcm0va2VybmVsL2lycS5jCmluZGV4IDUzOTE5YjIuLjNlZmQ4MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKQEAgLTIyLDcgKzIyLDYgQEAKICAqICBOYXR1cmFsbHkgaXQncyBub3QgYSAxOjEgcmVsYXRpb24sIGJ1dCB0aGVyZSBhcmUgc2ltaWxhcml0aWVzLgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTU5LDkgKzU4LDYgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJc2hvd19pcGlfbGlzdChwLCBwcmVjKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKLQlzaG93X2xvY2FsX2lycXMocCwgcHJlYyk7Ci0jZW5kaWYKIAlzZXFfcHJpbnRmKHAsICIlKnM6ICUxMGx1XG4iLCBwcmVjLCAiRXJyIiwgaXJxX2Vycl9jb3VudCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy1hcm0uYyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLWFybS5jCmluZGV4IDc5MjAzZWUuLjlmZTg5MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLWFybS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLWFybS5jCkBAIC02MCw2ICs2MCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJrcHJvYmVzLmgiCiAKQEAgLTk3MSw2ICs5NzIsOSBAQAogCiAJREVDT0RFX0VORAogfTsKKyNpZmRlZiBDT05GSUdfQVJNX0tQUk9CRVNfVEVTVF9NT0RVTEUKK0VYUE9SVF9TWU1CT0xfR1BMKGtwcm9iZV9kZWNvZGVfYXJtX3RhYmxlKTsKKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgYXJtX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LWFybS5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGVzdC1hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzgyZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGVzdC1hcm0uYwpAQCAtMCwwICsxLDEzMjMgQEAKKy8qCisgKiBhcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LWFybS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEpvbiBNZWRodXJzdCA8dGl4eUB5eGl0LmNvLnVrPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImtwcm9iZXMtdGVzdC5oIgorCisKKyNkZWZpbmUgVEVTVF9JU0EgIjMyIgorCisjZGVmaW5lIFRFU1RfQVJNX1RPX1RIVU1CX0lOVEVSV09SS19SKGNvZGUxLCByZWcsIHZhbCwgY29kZTIpCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlMSAjcmVnIGNvZGUyKQkJCVwKKwlURVNUX0FSR19SRUcocmVnLCB2YWwpCQkJCQlcCisJVEVTVF9BUkdfUkVHKDE0LCA5OWYpCQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJXAorCSI1MDoJbm9wCQkJXG5cdCIJCQlcCisJIjE6CSJjb2RlMSAjcmVnIGNvZGUyIglcblx0IgkJCVwKKwkiCWJ4CWxyCQlcblx0IgkJCVwKKwkiLnRodW1iCQkJCVxuXHQiCQkJXAorCSIzOglhZHIJbHIsIDJmCQlcblx0IgkJCVwKKwkiCWJ4CWxyCQlcblx0IgkJCVwKKwkiLmFybQkJCQlcblx0IgkJCVwKKwkiMjoJbm9wCQkJXG5cdCIJCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9BUk1fVE9fVEhVTUJfSU5URVJXT1JLX1AoY29kZTEsIHJlZywgdmFsLCBjb2RlMikJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcgY29kZTIpCQkJXAorCVRFU1RfQVJHX1BUUihyZWcsIHZhbCkJCQkJCVwKKwlURVNUX0FSR19SRUcoMTQsIDk5ZikJCQkJCVwKKwlURVNUX0FSR19NRU0oMTUsIDNmKzEpCQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJXAorCSI1MDoJbm9wCQkJXG5cdCIJCQlcCisJIjE6CSJjb2RlMSAjcmVnIGNvZGUyIglcblx0IgkJCVwKKwkiCWJ4CWxyCQlcblx0IgkJCVwKKwkiLnRodW1iCQkJCVxuXHQiCQkJXAorCSIzOglhZHIJbHIsIDJmCQlcblx0IgkJCVwKKwkiCWJ4CWxyCQlcblx0IgkJCVwKKwkiLmFybQkJCQlcblx0IgkJCVwKKwkiMjoJbm9wCQkJXG5cdCIJCQlcCisJVEVTVENBU0VfRU5ECisKKwordm9pZCBrcHJvYmVfYXJtX3Rlc3RfY2FzZXModm9pZCkKK3sKKwlrcHJvYmVfdGVzdF9mbGFncyA9IDA7CisKKwlURVNUX0dST1VQKCJEYXRhLXByb2Nlc3NpbmcgKHJlZ2lzdGVyKSwgKHJlZ2lzdGVyLXNoaWZ0ZWQgcmVnaXN0ZXIpLCAoaW1tZWRpYXRlKSIpCisKKyNkZWZpbmUgX0RBVEFfUFJPQ0VTU0lOR19ETk0ob3Ascyx2YWwpCQkJCQkJXAorCVRFU1RfUlIoICBvcCAiZXEiIHMgIglyMCwgIHIiLDEsIFZBTDEsIiwgciIsMiwgdmFsLCAiIikJCVwKKwlURVNUX1JSKCAgb3AgIm5lIiBzICIJcjEsICByIiwxLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgbHNsICMzIikJXAorCVRFU1RfUlIoICBvcCAiY3MiIHMgIglyMiwgIHIiLDMsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBsc3IgIzQiKQlcCisJVEVTVF9SUiggIG9wICJjYyIgcyAiCXIzLCAgciIsMywgVkFMMSwiLCByIiwyLCB2YWwsICIsIGFzciAjNSIpCVwKKwlURVNUX1JSKCAgb3AgIm1pIiBzICIJcjQsICByIiw1LCBWQUwxLCIsIHIiLDIsIE4odmFsKSwiLCBhc3IgIzYiKQlcCisJVEVTVF9SUiggIG9wICJwbCIgcyAiCXI1LCAgciIsNSwgVkFMMSwiLCByIiwyLCB2YWwsICIsIHJvciAjNyIpCVwKKwlURVNUX1JSKCAgb3AgInZzIiBzICIJcjYsICByIiw3LCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgcnJ4IikJCVwKKwlURVNUX1IoICAgb3AgInZjIiBzICIJcjYsICByIiw3LCBWQUwxLCIsIHBjLCBsc2wgIzMiKQkJCVwKKwlURVNUX1IoICAgb3AgInZjIiBzICIJcjYsICByIiw3LCBWQUwxLCIsIHNwLCBsc3IgIzQiKQkJCVwKKwlURVNUX1IoICAgb3AgInZjIiBzICIJcjYsICBwYywgciIsNywgVkFMMSwiLCBhc3IgIzUiKQkJCVwKKwlURVNUX1IoICAgb3AgInZjIiBzICIJcjYsICBzcCwgciIsNywgVkFMMSwiLCByb3IgIzYiKQkJCVwKKwlURVNUX1JSUiggb3AgImhpIiBzICIJcjgsICByIiw5LCBWQUwxLCIsIHIiLDE0LHZhbCwgIiwgbHNsIHIiLDAsIDMsIiIpXAorCVRFU1RfUlJSKCBvcCAibHMiIHMgIglyOSwgIHIiLDksIFZBTDEsIiwgciIsMTQsdmFsLCAiLCBsc3IgciIsNywgNCwiIilcCisJVEVTVF9SUlIoIG9wICJnZSIgcyAiCXIxMCwgciIsMTEsVkFMMSwiLCByIiwxNCx2YWwsICIsIGFzciByIiw3LCA1LCIiKVwKKwlURVNUX1JSUiggb3AgImx0IiBzICIJcjExLCByIiwxMSxWQUwxLCIsIHIiLDE0LE4odmFsKSwiLCBhc3IgciIsNywgNiwiIilcCisJVEVTVF9SUiggIG9wICJndCIgcyAiCXIxMiwgcjEzIiAgICAgICAiLCByIiwxNCx2YWwsICIsIHJvciByIiwxNCw3LCIiKVwKKwlURVNUX1JSKCAgb3AgImxlIiBzICIJcjE0LCByIiwwLCB2YWwsICIsIHIxMyIgICAgICAgIiwgbHNsIHIiLDE0LDgsIiIpXAorCVRFU1RfUlIoICBvcCBzICIJcjEyLCBwYyIgICAgICAgICIsIHIiLDE0LHZhbCwgIiwgcm9yIHIiLDE0LDcsIiIpXAorCVRFU1RfUlIoICBvcCBzICIJcjE0LCByIiwwLCB2YWwsICIsIHBjIiAgICAgICAgIiwgbHNsIHIiLDE0LDgsIiIpXAorCVRFU1RfUiggICBvcCAiZXEiIHMgIglyMCwgIHIiLDExLFZBTDEsIiwgIzB4ZjUiKQkJCVwKKwlURVNUX1IoICAgb3AgIm5lIiBzICIJcjExLCByIiwwLCBWQUwxLCIsICMweGY1MDAwMDAwIikJCVwKKwlURVNUX1IoICAgb3AgcyAiCXI3LCAgciIsOCwgVkFMMiwiLCAjMHgwMDBhZjAwMCIpCQlcCisJVEVTVCggICAgIG9wIHMgIglyNCwgIHBjIiAgICAgICAgIiwgIzB4MDAwMDVhMDAiKQorCisjZGVmaW5lIERBVEFfUFJPQ0VTU0lOR19ETk0ob3AsdmFsKQkJXAorCV9EQVRBX1BST0NFU1NJTkdfRE5NKG9wLCIiLHZhbCkJCVwKKwlfREFUQV9QUk9DRVNTSU5HX0ROTShvcCwicyIsdmFsKQorCisjZGVmaW5lIERBVEFfUFJPQ0VTU0lOR19OTShvcCx2YWwpCQkJCQkJXAorCVRFU1RfUlIoICBvcCAibmUJciIsMSwgVkFMMSwiLCByIiwyLCB2YWwsICIiKQkJCVwKKwlURVNUX1JSKCAgb3AgImVxCXIiLDEsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBsc2wgIzMiKQkJXAorCVRFU1RfUlIoICBvcCAiY2MJciIsMywgVkFMMSwiLCByIiwyLCB2YWwsICIsIGxzciAjNCIpCQlcCisJVEVTVF9SUiggIG9wICJjcwlyIiwzLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgYXNyICM1IikJCVwKKwlURVNUX1JSKCAgb3AgInBsCXIiLDUsIFZBTDEsIiwgciIsMiwgTih2YWwpLCIsIGFzciAjNiIpCQlcCisJVEVTVF9SUiggIG9wICJtaQlyIiw1LCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgcm9yICM3IikJCVwKKwlURVNUX1JSKCAgb3AgInZjCXIiLDcsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBycngiKQkJXAorCVRFU1RfUiAoICBvcCAidnMJciIsNywgVkFMMSwiLCBwYywgbHNsICMzIikJCQlcCisJVEVTVF9SICggIG9wICJ2cwlyIiw3LCBWQUwxLCIsIHNwLCBsc3IgIzQiKQkJCVwKKwlURVNUX1IoICAgb3AgInZzCXBjLCByIiw3LCBWQUwxLCIsIGFzciAjNSIpCQkJXAorCVRFU1RfUiggICBvcCAidnMJc3AsIHIiLDcsIFZBTDEsIiwgcm9yICM2IikJCQlcCisJVEVTVF9SUlIoIG9wICJscwlyIiw5LCBWQUwxLCIsIHIiLDE0LHZhbCwgIiwgbHNsIHIiLDAsIDMsIiIpCVwKKwlURVNUX1JSUiggb3AgImhpCXIiLDksIFZBTDEsIiwgciIsMTQsdmFsLCAiLCBsc3IgciIsNywgNCwiIikJXAorCVRFU1RfUlJSKCBvcCAibHQJciIsMTEsVkFMMSwiLCByIiwxNCx2YWwsICIsIGFzciByIiw3LCA1LCIiKQlcCisJVEVTVF9SUlIoIG9wICJnZQlyIiwxMSxWQUwxLCIsIHIiLDE0LE4odmFsKSwiLCBhc3IgciIsNywgNiwiIikJXAorCVRFU1RfUlIoICBvcCAibGUJcjEzIiAgICAgICAiLCByIiwxNCx2YWwsICIsIHJvciByIiwxNCw3LCIiKQlcCisJVEVTVF9SUiggIG9wICJndAlyIiwwLCB2YWwsICIsIHIxMyIgICAgICAgIiwgbHNsIHIiLDE0LDgsIiIpCVwKKwlURVNUX1JSKCAgb3AgIglwYyIgICAgICAgICIsIHIiLDE0LHZhbCwgIiwgcm9yIHIiLDE0LDcsIiIpCQlcCisJVEVTVF9SUiggIG9wICIJciIsMCwgdmFsLCAiLCBwYyIgICAgICAgICIsIGxzbCByIiwxNCw4LCIiKQkJXAorCVRFU1RfUiggICBvcCAiZXEJciIsMTEsVkFMMSwiLCAjMHhmNSIpCQkJCVwKKwlURVNUX1IoICAgb3AgIm5lCXIiLDAsIFZBTDEsIiwgIzB4ZjUwMDAwMDAiKQkJCVwKKwlURVNUX1IoICAgb3AgIglyIiw4LCBWQUwyLCIsICMweDAwMGFmMDAwIikKKworI2RlZmluZSBfREFUQV9QUk9DRVNTSU5HX0RNKG9wLHMsdmFsKQkJCQkJXAorCVRFU1RfUiggICBvcCAiZXEiIHMgIglyMCwgIHIiLDEsIHZhbCwgIiIpCQkJXAorCVRFU1RfUiggICBvcCAibmUiIHMgIglyMSwgIHIiLDEsIHZhbCwgIiwgbHNsICMzIikJCVwKKwlURVNUX1IoICAgb3AgImNzIiBzICIJcjIsICByIiwzLCB2YWwsICIsIGxzciAjNCIpCQlcCisJVEVTVF9SKCAgIG9wICJjYyIgcyAiCXIzLCAgciIsMywgdmFsLCAiLCBhc3IgIzUiKQkJXAorCVRFU1RfUiggICBvcCAibWkiIHMgIglyNCwgIHIiLDUsIE4odmFsKSwiLCBhc3IgIzYiKQkJXAorCVRFU1RfUiggICBvcCAicGwiIHMgIglyNSwgIHIiLDUsIHZhbCwgIiwgcm9yICM3IikJCVwKKwlURVNUX1IoICAgb3AgInZzIiBzICIJcjYsICByIiwxMCx2YWwsICIsIHJyeCIpCQlcCisJVEVTVCggICAgIG9wICJ2cyIgcyAiCXI3LCAgcGMsIGxzbCAjMyIpCQkJXAorCVRFU1QoICAgICBvcCAidnMiIHMgIglyNywgIHNwLCBsc3IgIzQiKQkJCVwKKwlURVNUX1JSKCAgb3AgInZjIiBzICIJcjgsICByIiw3LCB2YWwsICIsIGxzbCByIiwwLCAzLCIiKQlcCisJVEVTVF9SUiggIG9wICJoaSIgcyAiCXI5LCAgciIsOSwgdmFsLCAiLCBsc3IgciIsNywgNCwiIikJXAorCVRFU1RfUlIoICBvcCAibHMiIHMgIglyMTAsIHIiLDksIHZhbCwgIiwgYXNyIHIiLDcsIDUsIiIpCVwKKwlURVNUX1JSKCAgb3AgImdlIiBzICIJcjExLCByIiwxMSxOKHZhbCksIiwgYXNyIHIiLDcsIDYsIiIpCVwKKwlURVNUX1JSKCAgb3AgImx0IiBzICIJcjEyLCByIiwxMSx2YWwsICIsIHJvciByIiwxNCw3LCIiKQlcCisJVEVTVF9SKCAgIG9wICJndCIgcyAiCXIxNCwgcjEzIiAgICAgICAiLCBsc2wgciIsMTQsOCwiIikJXAorCVRFU1RfUiggICBvcCAibGUiIHMgIglyMTQsIHBjIiAgICAgICAgIiwgbHNsIHIiLDE0LDgsIiIpCVwKKwlURVNUKCAgICAgb3AgImVxIiBzICIJcjAsICAjMHhmNSIpCQkJCVwKKwlURVNUKCAgICAgb3AgIm5lIiBzICIJcjExLCAjMHhmNTAwMDAwMCIpCQkJXAorCVRFU1QoICAgICBvcCBzICIJcjcsICAjMHgwMDBhZjAwMCIpCQkJXAorCVRFU1QoICAgICBvcCBzICIJcjQsICAjMHgwMDAwNWEwMCIpCisKKyNkZWZpbmUgREFUQV9QUk9DRVNTSU5HX0RNKG9wLHZhbCkJCVwKKwlfREFUQV9QUk9DRVNTSU5HX0RNKG9wLCIiLHZhbCkJCVwKKwlfREFUQV9QUk9DRVNTSU5HX0RNKG9wLCJzIix2YWwpCisKKwlEQVRBX1BST0NFU1NJTkdfRE5NKCJhbmQiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HX0ROTSgiZW9yIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lOR19ETk0oInN1YiIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkdfRE5NKCJyc2IiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HX0ROTSgiYWRkIixWQUwyKQorCURBVEFfUFJPQ0VTU0lOR19ETk0oImFkYyIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkdfRE5NKCJzYmMiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HX0ROTSgicnNjIixWQUwyKQorCURBVEFfUFJPQ0VTU0lOR19OTSgidHN0IiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lOR19OTSgidGVxIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lOR19OTSgiY21wIixWQUwyKQorCURBVEFfUFJPQ0VTU0lOR19OTSgiY21uIixWQUwyKQorCURBVEFfUFJPQ0VTU0lOR19ETk0oIm9yciIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkdfRE0oIm1vdiIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkdfRE5NKCJiaWMiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HX0RNKCJtdm4iLFZBTDIpCisKKwlURVNUKCJtb3YJaXAsIHNwIikgLyogVGhpcyBoYXMgc3BlY2lhbCBjYXNlIGVtdWxhdGlvbiBjb2RlICovCisKKwlURVNUX1NVUFBPUlRFRCgibW92CXBjLCAjMHgxMDAwIik7CisJVEVTVF9TVVBQT1JURUQoIm1vdglzcCwgIzB4MTAwMCIpOworCVRFU1RfU1VQUE9SVEVEKCJjbXAJcGMsICMweDEwMDAiKTsKKwlURVNUX1NVUFBPUlRFRCgiY21wCXNwLCAjMHgxMDAwIik7CisKKwkvKiBEYXRhLXByb2Nlc3Npbmcgd2l0aCBQQyBhcyBzaGlmdCovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTVjMGYxZQlAIGNtcAlyMTIsIHIxNCwgYXNsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxYTBjZjFlCUAgbW92CXIxMiwgcjE0LCBhc2wgcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA4Y2FmMWUJQCBhZGQJcjEwLCByMTIsIHIxNCwgYXNsIHBjIikKKworCS8qIERhdGEtcHJvY2Vzc2luZyB3aXRoIFBDIGFzIHNoaWZ0Ki8KKwlURVNUX1VOU1VQUE9SVEVEKCJtb3ZzCXBjLCByMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgibW92cwlwYywgcjEsIGxzbCByMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgibW92cwlwYywgIzB4MTAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoImFkZHMJcGMsIGxyLCByMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiYWRkcwlwYywgbHIsIHIxLCBsc2wgcjIiKQorCVRFU1RfVU5TVVBQT1JURUQoImFkZHMJcGMsIGxyLCAjNCIpCisKKwkvKiBEYXRhLXByb2Nlc3Npbmcgd2l0aCBTUCBhcyB0YXJnZXQgKi8KKwlURVNUKCJhZGQJc3AsIHNwLCAjMTYiKQorCVRFU1QoInN1YglzcCwgc3AsICM4IikKKwlURVNUKCJiaWMJc3AsIHNwLCAjMHgyMCIpCisJVEVTVCgib3JyCXNwLCBzcCwgIzB4MjAiKQorCVRFU1RfUFIoICJhZGQJc3AsIHIiLDEwLDAsIiwgciIsMTEsNCwiIikKKwlURVNUX1BSUigiYWRkCXNwLCByIiwxMCwwLCIsIHIiLDExLDQsIiwgYXNsIHIiLDEyLDEsIiIpCisJVEVTVF9QKCAgIm1vdglzcCwgciIsMTAsMCwiIikKKwlURVNUX1BSKCAibW92CXNwLCByIiwxMCwwLCIsIGFzbCByIiwxMiwwLCIiKQorCisJLyogRGF0YS1wcm9jZXNzaW5nIHdpdGggUEMgYXMgdGFyZ2V0ICovCisJVEVTVF9CRiggICAiYWRkCXBjLCBwYywgIzJmLTFiLTgiKQorCVRFU1RfQkZfUiAoImFkZAlwYywgcGMsIHIiLDE0LDJmLTFmLTgsIiIpCisJVEVTVF9CRl9SICgiYWRkCXBjLCByIiwxNCwyZi0xZi04LCIsIHBjIikKKwlURVNUX0JGX1IgKCJtb3YJcGMsIHIiLDAsMmYsIiIpCisJVEVTVF9CRl9SUigibW92CXBjLCByIiwwLDJmLCIsIGFzbCByIiwxLDAsIiIpCisJVEVTVF9CQiggICAic3ViCXBjLCBwYywgIzFiLTJiKzgiKQorI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CisJVEVTVF9CQiggICAic3ViCXBjLCBwYywgIzFiLTJiKzgtMiIpIC8qIFVOUFJFRElDVEFCTEUgYmVmb3JlIEFSTXY2ICovCisjZW5kaWYKKwlURVNUX0JCX1IoICJzdWIJcGMsIHBjLCByIiwxNCwgMWYtMmYrOCwiIikKKwlURVNUX0JCX1IoICJyc2IJcGMsIHIiLDE0LDFmLTJmKzgsIiwgcGMiKQorCVRFU1RfUlIoICAgImFkZAlwYywgcGMsIHIiLDEwLC0yLCIsIGFzbCByIiwxMSwxLCIiKQorI2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisJVEVTVF9BUk1fVE9fVEhVTUJfSU5URVJXT1JLX1IoImFkZAlwYywgcGMsIHIiLDAsM2YtMWYtOCsxLCIiKQorCVRFU1RfQVJNX1RPX1RIVU1CX0lOVEVSV09SS19SKCJzdWIJcGMsIHIiLDAsM2YrOCsxLCIsICM4IikKKyNlbmRpZgorCVRFU1RfR1JPVVAoIk1pc2NlbGxhbmVvdXMgaW5zdHJ1Y3Rpb25zIikKKworCVRFU1QoIm1ycwlyMCwgY3BzciIpCisJVEVTVCgibXJzcGwJcjcsIGNwc3IiKQorCVRFU1QoIm1ycwlyMTQsIGNwc3IiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEwZmYwMDAJQCBtcnMgcjE1LCBjcHNyIikKKwlURVNUX1VOU1VQUE9SVEVEKCJtcnMJcjAsIHNwc3IiKQorCVRFU1RfVU5TVVBQT1JURUQoIm1ycwlsciwgc3BzciIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJtc3IJY3BzciwgcjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIm1zcgljcHNyX2YsIGxyIikKKwlURVNUX1VOU1VQUE9SVEVEKCJtc3IJc3BzciwgcjAiKQorCisJVEVTVF9CRl9SKCJieAlyIiwwLDJmLCIiKQorCVRFU1RfQkJfUigiYngJciIsNywyZiwiIikKKwlURVNUX0JGX1IoImJ4ZXEJciIsMTQsMmYsIiIpCisKKwlURVNUX1IoImNseglyMCwgciIsMCwgMHgwLCIiKQorCVRFU1RfUigiY2x6ZXEJcjcsIHIiLDE0LDB4MSwiIikKKwlURVNUX1IoImNseglsciwgciIsNywgMHhmZmZmZmZmZiwiIikKKwlURVNUKCAgImNseglyNCwgc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4MDE2ZmZmMTAJQCBjbHogcGMsIHIwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweDAxNmYwZjFmCUAgY2x6IHIwLCBwYyIpCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCVRFU1RfVU5TVVBQT1JURUQoImJ4aglyMCIpCisjZW5kaWYKKworCVRFU1RfQkZfUigiYmx4CXIiLDAsMmYsIiIpCisJVEVTVF9CQl9SKCJibHgJciIsNywyZiwiIikKKwlURVNUX0JGX1IoImJseGVxCXIiLDE0LDJmLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4MDEyMDAwM2YJQCBibHggcGMiKQorCisJVEVTVF9SUiggICAicWFkZAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgInFhZGR2cwlsciwgciIsOSwgVkFMMiwiLCByIiw4LCBWQUwxLCIiKQorCVRFU1RfUiggICAgInFhZGQJbHIsIHIiLDksIFZBTDIsIiwgcjEzIikKKwlURVNUX1JSKCAgICJxc3ViCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAicXN1YnZzCWxyLCByIiw5LCBWQUwyLCIsIHIiLDgsIFZBTDEsIiIpCisJVEVTVF9SKCAgICAicXN1YglsciwgciIsOSwgVkFMMiwiLCByMTMiKQorCVRFU1RfUlIoICAgInFkYWRkCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAicWRhZGR2cwlsciwgciIsOSwgVkFMMiwiLCByIiw4LCBWQUwxLCIiKQorCVRFU1RfUiggICAgInFkYWRkCWxyLCByIiw5LCBWQUwyLCIsIHIxMyIpCisJVEVTVF9SUiggICAicWRzdWIJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICJxZHN1YnZzCWxyLCByIiw5LCBWQUwyLCIsIHIiLDgsIFZBTDEsIiIpCisJVEVTVF9SKCAgICAicWRzdWIJbHIsIHIiLDksIFZBTDIsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMDFmMDUwCUAgcWFkZCBwYywgcjAsIHIxIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMjFmMDUwCUAgcXN1YiBwYywgcjAsIHIxIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNDFmMDUwCUAgcWRhZGQgcGMsIHIwLCByMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTYxZjA1MAlAIHFkc3ViIHBjLCByMCwgcjEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE2ZjIwNTAJQCBxZHN1YiByMiwgcjAsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNjEyMDVmCUAgcWRzdWIgcjIsIHBjLCByMSIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJia3B0CTB4ZmZmZiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiYmtwdAkweDAwMDAiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTYwMDA3MCBAIHNtYyAjMCIpCisKKwlURVNUX0dST1VQKCJIYWxmd29yZCBtdWx0aXBseSBhbmQgbXVsdGlwbHktYWNjdW11bGF0ZSIpCisKKwlURVNUX1JSUiggICAgInNtbGFiYglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICAic21sYWJiZ2UJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAgInNtbGFiYglsciwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTBmMzI4MSBAIHNtbGFiYiBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9SUlIoICAgICJzbWxhdGIJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICAgInNtbGF0YmdlCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgICJzbWxhdGIJbHIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEwZjMyYTEgQCBzbWxhdGIgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfUlJSKCAgICAic21sYWJ0CXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgICJzbWxhYnRnZQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICAic21sYWJ0CWxyLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMGYzMmMxIEAgc21sYWJ0IHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1JSUiggICAgInNtbGF0dAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICAic21sYXR0Z2UJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAgInNtbGF0dAlsciwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTBmMzJlMSBAIHNtbGF0dCBwYywgcjEsIHIyLCByMyIpCisKKwlURVNUX1JSUiggICAgInNtbGF3YglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICAic21sYXdiZ2UJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAgInNtbGF3YglsciwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTJmMzI4MSBAIHNtbGF3YiBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9SUlIoICAgICJzbWxhd3QJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICAgInNtbGF3dGdlCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgICJzbWxhd3QJbHIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEyZjMyYzEgQCBzbWxhd3QgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEyMDMyY2YgQCBzbWxhd3QgcjAsIHBjLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEyMDNmYzEgQCBzbWxhd3QgcjAsIHIxLCBwYywgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEyMGYyYzEgQCBzbWxhd3QgcjAsIHIxLCByMiwgcGMiKQorCisJVEVTVF9SUiggICAgInNtdWx3YglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsd2JnZQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIiKQorCVRFU1RfUiggICAgICJzbXVsd2IJbHIsIHIiLDEsIFZBTDIsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMmYwMmExIEAgc211bHdiIHBjLCByMSwgcjIiKQorCVRFU1RfUlIoICAgICJzbXVsd3QJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211bHd0Z2UJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiIikKKwlURVNUX1IoICAgICAic211bHd0CWxyLCByIiwxLCBWQUwyLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTJmMDJlMSBAIHNtdWx3dCBwYywgcjEsIHIyIikKKworCVRFU1RfUlJSUiggICJzbWxhbGJiCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAgInNtbGFsYmJsZQlyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCVRFU1RfUlJSKCAgICJzbWxhbGJiCXIiLDE0LFZBTDMsIiwgciIsNywgVkFMNCwiLCByIiw1LCBWQUwxLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTRmMTM4MiBAIHNtbGFsYmIgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE0MWYzODIgQCBzbWxhbGJiIHIxLCBwYywgcjIsIHIzIikKKwlURVNUX1JSUlIoICAic21sYWx0YglyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggICJzbWxhbHRibGUJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKwlURVNUX1JSUiggICAic21sYWx0YglyIiwxNCxWQUwzLCIsIHIiLDcsIFZBTDQsIiwgciIsNSwgVkFMMSwiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE0ZjEzYTIgQCBzbWxhbHRiIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNDFmM2EyIEAgc21sYWx0YiByMSwgcGMsIHIyLCByMyIpCisJVEVTVF9SUlJSKCAgInNtbGFsYnQJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgciIsMywgVkFMNCkKKwlURVNUX1JSUlIoICAic21sYWxidGxlCXIiLDgsIFZBTDQsIiwgciIsOSwgVkFMMSwiLCByIiwxMCxWQUwyLCIsIHIiLDExLFZBTDMpCisJVEVTVF9SUlIoICAgInNtbGFsYnQJciIsMTQsVkFMMywiLCByIiw3LCBWQUw0LCIsIHIiLDUsIFZBTDEsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNGYxM2MyIEAgc21sYWxidCBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTQxZjNjMiBAIHNtbGFsYnQgcjEsIHBjLCByMiwgcjMiKQorCVRFU1RfUlJSUiggICJzbWxhbHR0CXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAgInNtbGFsdHRsZQlyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCVRFU1RfUlJSKCAgICJzbWxhbHR0CXIiLDE0LFZBTDMsIiwgciIsNywgVkFMNCwiLCByIiw1LCBWQUwxLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTRmMTNlMiBAIHNtbGFsYmIgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE0MGYzZTIgQCBzbWxhbGJiIHIwLCBwYywgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNDAxM2VmIEAgc21sYWxiYiByMCwgcjEsIHBjLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTQwMWZlMiBAIHNtbGFsYmIgcjAsIHIxLCByMiwgcGMiKQorCisJVEVTVF9SUiggICAgInNtdWxiYglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsYmJnZQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIiKQorCVRFU1RfUiggICAgICJzbXVsYmIJbHIsIHIiLDEsIFZBTDIsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNmYwMjgxIEAgc211bGJiIHBjLCByMSwgcjIiKQorCVRFU1RfUlIoICAgICJzbXVsdGIJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211bHRiZ2UJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiIikKKwlURVNUX1IoICAgICAic211bHRiCWxyLCByIiwxLCBWQUwyLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTZmMDJhMSBAIHNtdWx0YiBwYywgcjEsIHIyIikKKwlURVNUX1JSKCAgICAic211bGJ0CXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWxidGdlCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiIpCisJVEVTVF9SKCAgICAgInNtdWxidAlsciwgciIsMSwgVkFMMiwiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE2ZjAyYzEgQCBzbXVsdGIgcGMsIHIxLCByMiIpCisJVEVTVF9SUiggICAgInNtdWx0dAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsdHRnZQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIiKQorCVRFU1RfUiggICAgICJzbXVsdHQJbHIsIHIiLDEsIFZBTDIsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNmYwMmUxIEAgc211bHR0IHBjLCByMSwgcjIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE2MDAyZWYgQCBzbXVsdHQgcjAsIHBjLCByMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTYwMGZlMSBAIHNtdWx0dCByMCwgcjEsIHBjIikKKworCVRFU1RfR1JPVVAoIk11bHRpcGx5IGFuZCBtdWx0aXBseS1hY2N1bXVsYXRlIikKKworCVRFU1RfUlIoICAgICJtdWwJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAibXVsbHMJcjcsIHIiLDgsIFZBTDIsIiwgciIsOSwgVkFMMiwiIikKKwlURVNUX1IoICAgICAibXVsCWxyLCByIiw0LCBWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDBmMDI5MSBAIG11bCBwYywgcjEsIHIyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwMDAwMjlmIEAgbXVsIHIwLCBwYywgcjIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTAwMDBmOTEgQCBtdWwgcjAsIHIxLCBwYyIpCisJVEVTVF9SUiggICAgIm11bHMJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAibXVsbHNzCXI3LCByIiw4LCBWQUwyLCIsIHIiLDksIFZBTDIsIiIpCisJVEVTVF9SKCAgICAgIm11bHMJbHIsIHIiLDQsIFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwMWYwMjkxIEAgbXVscyBwYywgcjEsIHIyIikKKworCVRFU1RfUlJSKCAgICAibWxhCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgICJtbGFoaQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICAibWxhCWxyLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwMmYzMjkxIEAgbWxhIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1JSUiggICAgIm1sYXMJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICAgIm1sYWhpcwlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICAibWxhcwlsciwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDNmMzI5MSBAIG1sYXMgcGMsIHIxLCByMiwgcjMiKQorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYKKwlURVNUX1JSKCAgInVtYWFsCXIwLCByMSwgciIsMiwgVkFMMSwiLCByIiwzLCBWQUwyLCIiKQorCVRFU1RfUlIoICAidW1hYWxscwlyNywgcjgsIHIiLDksIFZBTDIsIiwgciIsMTAsIFZBTDEsIiIpCisJVEVTVF9SKCAgICJ1bWFhbAlsciwgcjEyLCByIiwxMSxWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDQxZjM5MiBAIHVtYWFsIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwNGYwMzkyIEAgdW1hYWwgcjAsIHBjLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA1MDAwOTAgQCB1bmRlZiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDVmZmY5ZiBAIHVuZGVmIikKKworCVRFU1RfUlJSKCAgIm1scwkJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICJtbHNoaQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgIm1scwkJbHIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA2ZjMyOTEgQCBtbHMgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA2MDMyOWYgQCBtbHMgcjAsIHBjLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA2MDNmOTEgQCBtbHMgcjAsIHIxLCBwYywgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA2MGYyOTEgQCBtbHMgcjAsIHIxLCByMiwgcGMiKQorI2VuZGlmCisKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwNzAwMDkwIEAgdW5kZWYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA3ZmZmOWYgQCB1bmRlZiIpCisKKwlURVNUX1JSKCAgInVtdWxsCXIwLCByMSwgciIsMiwgVkFMMSwiLCByIiwzLCBWQUwyLCIiKQorCVRFU1RfUlIoICAidW11bGxscwlyNywgcjgsIHIiLDksIFZBTDIsIiwgciIsMTAsIFZBTDEsIiIpCisJVEVTVF9SKCAgICJ1bXVsbAlsciwgcjEyLCByIiwxMSxWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDgxZjM5MiBAIHVtdWxsIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwOGYxMzkyIEAgdW11bGwgcjEsIHBjLCByMiwgcjMiKQorCVRFU1RfUlIoICAidW11bGxzCXIwLCByMSwgciIsMiwgVkFMMSwiLCByIiwzLCBWQUwyLCIiKQorCVRFU1RfUlIoICAidW11bGxsc3MJcjcsIHI4LCByIiw5LCBWQUwyLCIsIHIiLDEwLCBWQUwxLCIiKQorCVRFU1RfUiggICAidW11bGxzCWxyLCByMTIsIHIiLDExLFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwOTFmMzkyIEAgdW11bGxzIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwOWYxMzkyIEAgdW11bGxzIHIxLCBwYywgcjIsIHIzIikKKworCVRFU1RfUlJSUiggICJ1bWxhbAlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggICJ1bWxhbGxlCXIiLDgsIFZBTDQsIiwgciIsOSwgVkFMMSwiLCByIiwxMCxWQUwyLCIsIHIiLDExLFZBTDMpCisJVEVTVF9SUlIoICAgInVtbGFsCXIiLDE0LFZBTDMsIiwgciIsNywgVkFMNCwiLCByIiw1LCBWQUwxLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGFmMTM5MiBAIHVtbGFsIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwYTFmMzkyIEAgdW1sYWwgcjEsIHBjLCByMiwgcjMiKQorCVRFU1RfUlJSUiggICJ1bWxhbHMJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgciIsMywgVkFMNCkKKwlURVNUX1JSUlIoICAidW1sYWxsZXMJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKwlURVNUX1JSUiggICAidW1sYWxzCXIiLDE0LFZBTDMsIiwgciIsNywgVkFMNCwiLCByIiw1LCBWQUwxLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGJmMTM5MiBAIHVtbGFscyBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGIxZjM5MiBAIHVtbGFscyByMSwgcGMsIHIyLCByMyIpCisKKwlURVNUX1JSKCAgInNtdWxsCXIwLCByMSwgciIsMiwgVkFMMSwiLCByIiwzLCBWQUwyLCIiKQorCVRFU1RfUlIoICAic211bGxscwlyNywgcjgsIHIiLDksIFZBTDIsIiwgciIsMTAsIFZBTDEsIiIpCisJVEVTVF9SKCAgICJzbXVsbAlsciwgcjEyLCByIiwxMSxWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGMxZjM5MiBAIHNtdWxsIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwY2YxMzkyIEAgc211bGwgcjEsIHBjLCByMiwgcjMiKQorCVRFU1RfUlIoICAic211bGxzCXIwLCByMSwgciIsMiwgVkFMMSwiLCByIiwzLCBWQUwyLCIiKQorCVRFU1RfUlIoICAic211bGxsc3MJcjcsIHI4LCByIiw5LCBWQUwyLCIsIHIiLDEwLCBWQUwxLCIiKQorCVRFU1RfUiggICAic211bGxzCWxyLCByMTIsIHIiLDExLFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwZDFmMzkyIEAgc211bGxzIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwZGYxMzkyIEAgc211bGxzIHIxLCBwYywgcjIsIHIzIikKKworCVRFU1RfUlJSUiggICJzbWxhbAlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggICJzbWxhbGxlCXIiLDgsIFZBTDQsIiwgciIsOSwgVkFMMSwiLCByIiwxMCxWQUwyLCIsIHIiLDExLFZBTDMpCisJVEVTVF9SUlIoICAgInNtbGFsCXIiLDE0LFZBTDMsIiwgciIsNywgVkFMNCwiLCByIiw1LCBWQUwxLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGVmMTM5MiBAIHNtbGFsIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwZTFmMzkyIEAgc21sYWwgcjEsIHBjLCByMiwgcjMiKQorCVRFU1RfUlJSUiggICJzbWxhbHMJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgciIsMywgVkFMNCkKKwlURVNUX1JSUlIoICAic21sYWxsZXMJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKwlURVNUX1JSUiggICAic21sYWxzCXIiLDE0LFZBTDMsIiwgciIsNywgVkFMNCwiLCByIiw1LCBWQUwxLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGZmMTM5MiBAIHNtbGFscyBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGYwZjM5MiBAIHNtbGFscyByMCwgcGMsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGYwMTM5ZiBAIHNtbGFscyByMCwgcjEsIHBjLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGYwMWY5MiBAIHNtbGFscyByMCwgcjEsIHIyLCBwYyIpCisKKwlURVNUX0dST1VQKCJTeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyIpCisKKwkvKgorCSAqIFVzZSBoYXJkIGNvZGVkIGNvbnN0YW50cyBmb3IgU1dQIGluc3RydWN0aW9ucyB0byBhdm9pZCB3YXJuaW5ncworCSAqIGFib3V0IGRlcHJlY2F0ZWQgaW5zdHJ1Y3Rpb25zLgorCSAqLworCVRFU1RfUlAoICIud29yZCAweGUxMDhlMDk3IEAgc3dwCWxyLCByIiw3LFZBTDIsIiwgW3IiLDgsMCwiXSIpCisJVEVTVF9SKCAgIi53b3JkIDB4NjEwZDAwOTEgQCBzd3B2cwlyMCwgciIsMSxWQUwxLCIsIFtzcF0iKQorCVRFU1RfUlAoICIud29yZCAweGUxMGNkMDllIEAgc3dwCXNwLCByIiwxNCxWQUwyLCIsIFtyIiwxMiwxMyo0LCJdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMDJmMDkxIEAgc3dwIHBjLCByMSwgW3IyXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTAyMDA5ZiBAIHN3cCByMCwgcGMsIFtyMl0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEwZjAwOTEgQCBzd3AgcjAsIHIxLCBbcGNdIikKKwlURVNUX1JQKCAiLndvcmQgMHhlMTQ4ZTA5NyBAIHN3cGIJbHIsIHIiLDcsVkFMMiwiLCBbciIsOCwwLCJdIikKKwlURVNUX1IoICAiLndvcmQgMHg2MTRkMDA5MSBAIHN3cHZzYglyMCwgciIsMSxWQUwxLCIsIFtzcF0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE0MmYwOTEgQCBzd3BiIHBjLCByMSwgW3IyXSIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZAkweGUxMTAwMDkwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZAkweGUxMjAwMDkwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZAkweGUxMzAwMDkwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZAkweGUxNTAwMDkwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZAkweGUxNjAwMDkwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZAkweGUxNzAwMDkwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCVRFU1RfVU5TVVBQT1JURUQoImxkcmV4CXIyLCBbc3BdIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzdHJleGQJcjAsIHIyLCByMywgW3NwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgibGRyZXhkCXIyLCByMywgW3NwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3RyZXhiCXIwLCByMiwgW3NwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgibGRyZXhiCXIyLCBbc3BdIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzdHJleGgJcjAsIHIyLCBbc3BdIikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJleGgJcjIsIFtzcF0iKQorI2VuZGlmCisJVEVTVF9HUk9VUCgiRXh0cmEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMiKQorCisJVEVTVF9SUFIoICAic3RyaAlyIiwwLCBWQUwxLCIsIFtyIiwxLCA0OCwiLCAtciIsMiwgMjQsIl0iKQorCVRFU1RfUlBSKCAgInN0cmVxaAlyIiwxNCxWQUwyLCIsIFtyIiwxMywwLCAiLCByIiwxMiwgNDgsIl0iKQorCVRFU1RfUlBSKCAgInN0cmgJciIsMSwgVkFMMSwiLCBbciIsMiwgMjQsIiwgciIsMywgIDQ4LCJdISIpCisJVEVTVF9SUFIoICAic3RybmVoCXIiLDEyLFZBTDIsIiwgW3IiLDExLDQ4LCIsIC1yIiwxMCwyNCwiXSEiKQorCVRFU1RfUlBSKCAgInN0cmgJciIsMiwgVkFMMSwiLCBbciIsMywgMjQsIl0sIHIiLDQsIDQ4LCIiKQorCVRFU1RfUlBSKCAgInN0cmgJciIsMTAsVkFMMiwiLCBbciIsOSwgNDgsIl0sIC1yIiwxMSwyNCwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxYWZjMGJhCUAgc3RyaCByMTIsIFtwYywgcjEwXSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA4OWYwYmIJQCBzdHJoIHBjLCBbcjldLCByMTEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA4OWEwYmYJQCBzdHJoIHIxMCwgW3I5XSwgcGMiKQorCisJVEVTVF9QUiggICAibGRyaAlyMCwgW3IiLDAsICA0OCwiLCAtciIsMiwgMjQsIl0iKQorCVRFU1RfUFIoICAgImxkcmNzaAlyMTQsIFtyIiwxMywwLCAiLCByIiwxMiwgNDgsIl0iKQorCVRFU1RfUFIoICAgImxkcmgJcjEsIFtyIiwyLCAgMjQsIiwgciIsMywgIDQ4LCJdISIpCisJVEVTVF9QUiggICAibGRyY2NoCXIxMiwgW3IiLDExLDQ4LCIsIC1yIiwxMCwyNCwiXSEiKQorCVRFU1RfUFIoICAgImxkcmgJcjIsIFtyIiwzLCAgMjQsIl0sIHIiLDQsIDQ4LCIiKQorCVRFU1RfUFIoICAgImxkcmgJcjEwLCBbciIsOSwgNDgsIl0sIC1yIiwxMSwyNCwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxYmZjMGJhCUAgbGRyaCByMTIsIFtwYywgcjEwXSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA5OWYwYmIJQCBsZHJoIHBjLCBbcjldLCByMTEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA5OWEwYmYJQCBsZHJoIHIxMCwgW3I5XSwgcGMiKQorCisJVEVTVF9SUCggICAic3RyaAlyIiwwLCBWQUwxLCIsIFtyIiwxLCAyNCwiLCAjLTJdIikKKwlURVNUX1JQKCAgICJzdHJtaWgJciIsMTQsVkFMMiwiLCBbciIsMTMsMCwgIiwgIzJdIikKKwlURVNUX1JQKCAgICJzdHJoCXIiLDEsIFZBTDEsIiwgW3IiLDIsIDI0LCIsICM0XSEiKQorCVRFU1RfUlAoICAgInN0cnBsaAlyIiwxMixWQUwyLCIsIFtyIiwxMSwyNCwiLCAjLTRdISIpCisJVEVTVF9SUCggICAic3RyaAlyIiwyLCBWQUwxLCIsIFtyIiwzLCAyNCwiXSwgIzQ4IikKKwlURVNUX1JQKCAgICJzdHJoCXIiLDEwLFZBTDIsIiwgW3IiLDksIDY0LCJdLCAjLTQ4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxZWZjM2IwCUAgc3RyaCByMTIsIFtwYywgIzQ4XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBjOWYzYjAJQCBzdHJoIHBjLCBbcjldLCAjNDgiKQorCisJVEVTVF9QKAkgICAibGRyaAlyMCwgW3IiLDAsICAyNCwiLCAjLTJdIikKKwlURVNUX1AoCSAgICJsZHJ2c2gJcjE0LCBbciIsMTMsMCwgIiwgIzJdIikKKwlURVNUX1AoCSAgICJsZHJoCXIxLCBbciIsMiwgIDI0LCIsICM0XSEiKQorCVRFU1RfUCgJICAgImxkcnZjaAlyMTIsIFtyIiwxMSwyNCwiLCAjLTRdISIpCisJVEVTVF9QKAkgICAibGRyaAlyMiwgW3IiLDMsICAyNCwiXSwgIzQ4IikKKwlURVNUX1AoCSAgICJsZHJoCXIxMCwgW3IiLDksIDY0LCJdLCAjLTQ4IikKKwlURVNUKCAgICAgICJsZHJoCXIwLCBbcGMsICMwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMWZmYzNiMAlAIGxkcmggcjEyLCBbcGMsICM0OF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwZDlmM2IwCUAgbGRyaCBwYywgW3I5XSwgIzQ4IikKKworCVRFU1RfUFIoICAgImxkcnNiCXIwLCBbciIsMCwgIDQ4LCIsIC1yIiwyLCAyNCwiXSIpCisJVEVTVF9QUiggICAibGRyaGlzYglyMTQsIFtyIiwxMywwLCIsIHIiLDEyLCAgNDgsIl0iKQorCVRFU1RfUFIoICAgImxkcnNiCXIxLCBbciIsMiwgIDI0LCIsIHIiLDMsICA0OCwiXSEiKQorCVRFU1RfUFIoICAgImxkcmxzc2IJcjEyLCBbciIsMTEsNDgsIiwgLXIiLDEwLDI0LCJdISIpCisJVEVTVF9QUiggICAibGRyc2IJcjIsIFtyIiwzLCAgMjQsIl0sIHIiLDQsIDQ4LCIiKQorCVRFU1RfUFIoICAgImxkcnNiCXIxMCwgW3IiLDksIDQ4LCJdLCAtciIsMTEsMjQsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMWJmYzBkYQlAIGxkcnNiIHIxMiwgW3BjLCByMTBdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDk5ZjBkYglAIGxkcnNiIHBjLCBbcjldLCByMTEiKQorCisJVEVTVF9QKAkgICAibGRyc2IJcjAsIFtyIiwwLCAgMjQsIiwgIy0xXSIpCisJVEVTVF9QKAkgICAibGRyZ2VzYglyMTQsIFtyIiwxMywwLCAiLCAjMV0iKQorCVRFU1RfUCgJICAgImxkcnNiCXIxLCBbciIsMiwgIDI0LCIsICM0XSEiKQorCVRFU1RfUCgJICAgImxkcmx0c2IJcjEyLCBbciIsMTEsMjQsIiwgIy00XSEiKQorCVRFU1RfUCgJICAgImxkcnNiCXIyLCBbciIsMywgIDI0LCJdLCAjNDgiKQorCVRFU1RfUCgJICAgImxkcnNiCXIxMCwgW3IiLDksIDY0LCJdLCAjLTQ4IikKKwlURVNUKCAgICAgICJsZHJzYglyMCwgW3BjLCAjMF0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFmZmMzZDAJQCBsZHJzYiByMTIsIFtwYywgIzQ4XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBkOWYzZDAJQCBsZHJzYiBwYywgW3I5XSwgIzQ4IikKKworCVRFU1RfUFIoICAgImxkcnNoCXIwLCBbciIsMCwgIDQ4LCIsIC1yIiwyLCAyNCwiXSIpCisJVEVTVF9QUiggICAibGRyZ3RzaAlyMTQsIFtyIiwxMywwLCAiLCByIiwxMiwgNDgsIl0iKQorCVRFU1RfUFIoICAgImxkcnNoCXIxLCBbciIsMiwgIDI0LCIsIHIiLDMsICA0OCwiXSEiKQorCVRFU1RfUFIoICAgImxkcmxlc2gJcjEyLCBbciIsMTEsNDgsIiwgLXIiLDEwLDI0LCJdISIpCisJVEVTVF9QUiggICAibGRyc2gJcjIsIFtyIiwzLCAgMjQsIl0sIHIiLDQsIDQ4LCIiKQorCVRFU1RfUFIoICAgImxkcnNoCXIxMCwgW3IiLDksIDQ4LCJdLCAtciIsMTEsMjQsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMWJmYzBmYQlAIGxkcnNoIHIxMiwgW3BjLCByMTBdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDk5ZjBmYglAIGxkcnNoIHBjLCBbcjldLCByMTEiKQorCisJVEVTVF9QKAkgICAibGRyc2gJcjAsIFtyIiwwLCAgMjQsIiwgIy0xXSIpCisJVEVTVF9QKAkgICAibGRyZXFzaAlyMTQsIFtyIiwxMywwICwiLCAjMV0iKQorCVRFU1RfUCgJICAgImxkcnNoCXIxLCBbciIsMiwgIDI0LCIsICM0XSEiKQorCVRFU1RfUCgJICAgImxkcm5lc2gJcjEyLCBbciIsMTEsMjQsIiwgIy00XSEiKQorCVRFU1RfUCgJICAgImxkcnNoCXIyLCBbciIsMywgIDI0LCJdLCAjNDgiKQorCVRFU1RfUCgJICAgImxkcnNoCXIxMCwgW3IiLDksIDY0LCJdLCAjLTQ4IikKKwlURVNUKCAgICAgICJsZHJzaAlyMCwgW3BjLCAjMF0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFmZmMzZjAJQCBsZHJzaCByMTIsIFtwYywgIzQ4XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBkOWYzZjAJQCBsZHJzaCBwYywgW3I5XSwgIzQ4IikKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA3CisJVEVTVF9VTlNVUFBPUlRFRCgic3RyaHQJcjEsIFtyMl0sIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJodAlyMSwgW3IyXSwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoInN0cmh0CXIxLCBbcjJdLCAjNDgiKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcmh0CXIxLCBbcjJdLCAjNDgiKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcnNidAlyMSwgW3IyXSwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcnNidAlyMSwgW3IyXSwgIzQ4IikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJzaHQJcjEsIFtyMl0sIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJzaHQJcjEsIFtyMl0sICM0OCIpCisjZW5kaWYKKworCVRFU1RfUlBSKCAgInN0cmQJciIsMCwgVkFMMSwiLCBbciIsMSwgNDgsIiwgLXIiLDIsMjQsIl0iKQorCVRFU1RfUlBSKCAgInN0cmNjZAlyIiw4LCBWQUwyLCIsIFtyIiwxMywwLCAiLCByIiwxMiw0OCwiXSIpCisJVEVTVF9SUFIoICAic3RyZAlyIiw0LCBWQUwxLCIsIFtyIiwyLCAyNCwiLCByIiwzLCA0OCwiXSEiKQorCVRFU1RfUlBSKCAgInN0cmNzZAlyIiwxMixWQUwyLCIsIFtyIiwxMSw0OCwiLCAtciIsMTAsMjQsIl0hIikKKwlURVNUX1JQUiggICJzdHJkCXIiLDIsIFZBTDEsIiwgW3IiLDMsIDI0LCJdLCByIiw0LDQ4LCIiKQorCVRFU1RfUlBSKCAgInN0cmQJciIsMTAsVkFMMiwiLCBbciIsOSwgNDgsIl0sIC1yIiw3LDI0LCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFhZmMwZmEJQCBzdHJkIHIxMiwgW3BjLCByMTBdISIpCisKKwlURVNUX1BSKCAgICJsZHJkCXIwLCBbciIsMCwgNDgsIiwgLXIiLDIsMjQsIl0iKQorCVRFU1RfUFIoICAgImxkcm1pZAlyOCwgW3IiLDEzLDAsICIsIHIiLDEyLDQ4LCJdIikKKwlURVNUX1BSKCAgICJsZHJkCXI0LCBbciIsMiwgMjQsIiwgciIsMywgNDgsIl0hIikKKwlURVNUX1BSKCAgICJsZHJwbGQJcjYsIFtyIiwxMSw0OCwiLCAtciIsMTAsMjQsIl0hIikKKwlURVNUX1BSKCAgICJsZHJkCXIyLCBbciIsNSwgMjQsIl0sIHIiLDQsNDgsIiIpCisJVEVTVF9QUiggICAibGRyZAlyMTAsIFtyIiw5LDQ4LCJdLCAtciIsNywyNCwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxYWZjMGRhCUAgbGRyZCByMTIsIFtwYywgcjEwXSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA4OWYwZGIJQCBsZHJkIHBjLCBbcjldLCByMTEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA4OWUwZGIJQCBsZHJkIGxyLCBbcjldLCByMTEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA4OWMwZGYJQCBsZHJkIHIxMiwgW3I5XSwgcGMiKQorCisJVEVTVF9SUCggICAic3RyZAlyIiwwLCBWQUwxLCIsIFtyIiwxLCAyNCwiLCAjLThdIikKKwlURVNUX1JQKCAgICJzdHJ2c2QJciIsOCwgVkFMMiwiLCBbciIsMTMsMCwgIiwgIzhdIikKKwlURVNUX1JQKCAgICJzdHJkCXIiLDQsIFZBTDEsIiwgW3IiLDIsIDI0LCIsICMxNl0hIikKKwlURVNUX1JQKCAgICJzdHJ2Y2QJciIsMTIsVkFMMiwiLCBbciIsMTEsMjQsIiwgIy0xNl0hIikKKwlURVNUX1JQKCAgICJzdHJkCXIiLDIsIFZBTDEsIiwgW3IiLDQsIDI0LCJdLCAjNDgiKQorCVRFU1RfUlAoICAgInN0cmQJciIsMTAsVkFMMiwiLCBbciIsOSwgNjQsIl0sICMtNDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFlZmMzZjAJQCBzdHJkIHIxMiwgW3BjLCAjNDhdISIpCisKKwlURVNUX1AoCSAgICJsZHJkCXIwLCBbciIsMCwgMjQsIiwgIy04XSIpCisJVEVTVF9QKAkgICAibGRyaGlkCXI4LCBbciIsMTMsMCwgIiwgIzhdIikKKwlURVNUX1AoCSAgICJsZHJkCXI0LCBbciIsMiwgMjQsIiwgIzE2XSEiKQorCVRFU1RfUCgJICAgImxkcmxzZAlyNiwgW3IiLDExLDI0LCIsICMtMTZdISIpCisJVEVTVF9QKAkgICAibGRyZAlyMiwgW3IiLDUsIDI0LCJdLCAjNDgiKQorCVRFU1RfUCgJICAgImxkcmQJcjEwLCBbciIsOSw2LCJdLCAjLTQ4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxZWZjM2QwCUAgbGRyZCByMTIsIFtwYywgIzQ4XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBjOWYzZDAJQCBsZHJkIHBjLCBbcjldLCAjNDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBjOWUzZDAJQCBsZHJkIGxyLCBbcjldLCAjNDgiKQorCisJVEVTVF9HUk9VUCgiTWlzY2VsbGFuZW91cyIpCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNworCVRFU1QoIm1vdncJcjAsICMwIikKKwlURVNUKCJtb3Z3CXIwLCAjMHhmZmZmIikKKwlURVNUKCJtb3Z3CWxyLCAjMHhmZmZmIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUzMDBmMDAwCUAgbW92dyBwYywgIzAiKQorCVRFU1RfUigibW92dAlyIiwwLCBWQUwxLCIsICMwIikKKwlURVNUX1IoIm1vdnQJciIsMCwgVkFMMiwiLCAjMHhmZmZmIikKKwlURVNUX1IoIm1vdnQJciIsMTQsVkFMMSwiLCAjMHhmZmZmIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUzNDBmMDAwCUAgbW92dCBwYywgIzAiKQorI2VuZGlmCisKKwlURVNUX1VOU1VQUE9SVEVEKCJtc3IJY3BzciwgMHgxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgibXNyCWNwc3JfZiwgMHhmMDAwMDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgibXNyCXNwc3IsIDB4MTMiKQorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKwlURVNUX1NVUFBPUlRFRCgieWllbGQiKQorCVRFU1QoInNldiIpCisJVEVTVCgibm9wIikKKwlURVNUKCJ3ZmkiKQorCVRFU1RfU1VQUE9SVEVEKCJ3ZmUiKQorCVRFU1RfVU5TVVBQT1JURUQoImRiZyAjMCIpCisjZW5kaWYKKworCVRFU1RfR1JPVVAoIkxvYWQvc3RvcmUgd29yZCBhbmQgdW5zaWduZWQgYnl0ZSIpCisKKyNkZWZpbmUgTE9BRF9TVE9SRShieXRlKQkJCQkJCQlcCisJVEVTVF9SUCggInN0ciJieXRlIglyIiwwLCBWQUwxLCIsIFtyIiwxLCAyNCwiLCAjLTJdIikJCVwKKwlURVNUX1JQKCAic3RyImJ5dGUiCXIiLDE0LFZBTDIsIiwgW3IiLDEzLDAsICIsICMyXSIpCQlcCisJVEVTVF9SUCggInN0ciJieXRlIglyIiwxLCBWQUwxLCIsIFtyIiwyLCAyNCwiLCAjNF0hIikJCVwKKwlURVNUX1JQKCAic3RyImJ5dGUiCXIiLDEyLFZBTDIsIiwgW3IiLDExLDI0LCIsICMtNF0hIikJCVwKKwlURVNUX1JQKCAic3RyImJ5dGUiCXIiLDIsIFZBTDEsIiwgW3IiLDMsIDI0LCJdLCAjNDgiKQkJXAorCVRFU1RfUlAoICJzdHIiYnl0ZSIJciIsMTAsVkFMMiwiLCBbciIsOSwgNjQsIl0sICMtNDgiKQkJXAorCVRFU1RfUlBSKCJzdHIiYnl0ZSIJciIsMCwgVkFMMSwiLCBbciIsMSwgNDgsIiwgLXIiLDIsIDI0LCJdIikJXAorCVRFU1RfUlBSKCJzdHIiYnl0ZSIJciIsMTQsVkFMMiwiLCBbciIsMTMsMCwgIiwgciIsMTIsIDQ4LCJdIikJXAorCVRFU1RfUlBSKCJzdHIiYnl0ZSIJciIsMSwgVkFMMSwiLCBbciIsMiwgMjQsIiwgciIsMywgIDQ4LCJdISIpCVwKKwlURVNUX1JQUigic3RyImJ5dGUiCXIiLDEyLFZBTDIsIiwgW3IiLDExLDQ4LCIsIC1yIiwxMCwyNCwiXSEiKQlcCisJVEVTVF9SUFIoInN0ciJieXRlIglyIiwyLCBWQUwxLCIsIFtyIiwzLCAyNCwiXSwgciIsNCwgNDgsIiIpCVwKKwlURVNUX1JQUigic3RyImJ5dGUiCXIiLDEwLFZBTDIsIiwgW3IiLDksIDQ4LCJdLCAtciIsMTEsMjQsIiIpCVwKKwlURVNUX1JQUigic3RyImJ5dGUiCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDI0LCIsIHIiLDIsICAzMiwiLCBhc2wgIzFdIilcCisJVEVTVF9SUFIoInN0ciJieXRlIglyIiwxNCxWQUwyLCIsIFtyIiwxMywwLCAiLCByIiwxMiwgMzIsIiwgbHNyICMyXSIpXAorCVRFU1RfUlBSKCJzdHIiYnl0ZSIJciIsMSwgVkFMMSwiLCBbciIsMiwgMjQsIiwgciIsMywgIDMyLCIsIGFzciAjM10hIilcCisJVEVTVF9SUFIoInN0ciJieXRlIglyIiwxMixWQUwyLCIsIFtyIiwxMSwyNCwiLCByIiwxMCwgNCwiLCByb3IgIzMxXSEiKVwKKwlURVNUX1AoICAibGRyImJ5dGUiCXIwLCBbciIsMCwgIDI0LCIsICMtMl0iKQkJCVwKKwlURVNUX1AoICAibGRyImJ5dGUiCXIxNCwgW3IiLDEzLDAsICIsICMyXSIpCQkJCVwKKwlURVNUX1AoICAibGRyImJ5dGUiCXIxLCBbciIsMiwgIDI0LCIsICM0XSEiKQkJCVwKKwlURVNUX1AoICAibGRyImJ5dGUiCXIxMiwgW3IiLDExLDI0LCIsICMtNF0hIikJCQlcCisJVEVTVF9QKCAgImxkciJieXRlIglyMiwgW3IiLDMsICAyNCwiXSwgIzQ4IikJCQlcCisJVEVTVF9QKCAgImxkciJieXRlIglyMTAsIFtyIiw5LCA2NCwiXSwgIy00OCIpCQkJXAorCVRFU1RfUFIoICJsZHIiYnl0ZSIJcjAsIFtyIiwwLCAgNDgsIiwgLXIiLDIsIDI0LCJdIikJCVwKKwlURVNUX1BSKCAibGRyImJ5dGUiCXIxNCwgW3IiLDEzLDAsICIsIHIiLDEyLCA0OCwiXSIpCQlcCisJVEVTVF9QUiggImxkciJieXRlIglyMSwgW3IiLDIsICAyNCwiLCByIiwzLCA0OCwiXSEiKQkJXAorCVRFU1RfUFIoICJsZHIiYnl0ZSIJcjEyLCBbciIsMTEsNDgsIiwgLXIiLDEwLDI0LCJdISIpCQlcCisJVEVTVF9QUiggImxkciJieXRlIglyMiwgW3IiLDMsICAyNCwiXSwgciIsNCwgNDgsIiIpCQkJXAorCVRFU1RfUFIoICJsZHIiYnl0ZSIJcjEwLCBbciIsOSwgNDgsIl0sIC1yIiwxMSwyNCwiIikJCVwKKwlURVNUX1BSKCAibGRyImJ5dGUiCXIwLCBbciIsMCwgIDI0LCIsIHIiLDIsICAzMiwiLCBhc2wgIzFdIikJXAorCVRFU1RfUFIoICJsZHIiYnl0ZSIJcjE0LCBbciIsMTMsMCwgIiwgciIsMTIsIDMyLCIsIGxzciAjMl0iKQlcCisJVEVTVF9QUiggImxkciJieXRlIglyMSwgW3IiLDIsICAyNCwiLCByIiwzLCAgMzIsIiwgYXNyICMzXSEiKQlcCisJVEVTVF9QUiggImxkciJieXRlIglyMTIsIFtyIiwxMSwyNCwiLCByIiwxMCwgNCwiLCByb3IgIzMxXSEiKQlcCisJVEVTVCggICAgImxkciJieXRlIglyMCwgW3BjLCAjMF0iKQkJCQkJXAorCVRFU1RfUiggICJsZHIiYnl0ZSIJcjEyLCBbcGMsIHIiLDE0LDAsIl0iKQorCisJTE9BRF9TVE9SRSgiIikKKwlURVNUX1AoICAgInN0cglwYywgW3IiLDAsMCwiLCAjMTUqNF0iKQorCVRFU1RfUiggICAic3RyCXBjLCBbc3AsIHIiLDIsMTUqNCwiXSIpCisJVEVTVF9CRiggICJsZHIJcGMsIFtzcCwgIzE1KjRdIikKKwlURVNUX0JGX1IoImxkcglwYywgW3NwLCByIiwyLDE1KjQsIl0iKQorCisJVEVTVF9QKCAgICJzdHIJc3AsIFtyIiwwLDAsIiwgIzEzKjRdIikKKwlURVNUX1IoICAgInN0cglzcCwgW3NwLCByIiwyLDEzKjQsIl0iKQorCVRFU1RfQkYoICAibGRyCXNwLCBbc3AsICMxMyo0XSIpCisJVEVTVF9CRl9SKCJsZHIJc3AsIFtzcCwgciIsMiwxMyo0LCJdIikKKworI2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisJVEVTVF9BUk1fVE9fVEhVTUJfSU5URVJXT1JLX1AoImxkcglwYywgW3IiLDAsMCwiLCAjMTUqNF0iKQorI2VuZGlmCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNWFmNjAwOAlAIHN0ciByNiwgW3BjLCAjOF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3YWY2MDA4CUAgc3RyIHI2LCBbcGMsIHI4XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTViZjYwMDgJQCBsZHIgcjYsIFtwYywgIzhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlN2JmNjAwOAlAIGxkciByNiwgW3BjLCByOF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3ODg2MDBmCUAgc3RyIHI2LCBbcjgsIHBjXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzk4NjAwZglAIGxkciByNiwgW3I4LCBwY10iKQorCisJTE9BRF9TVE9SRSgiYiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNWY3ZjAwOAlAIGxkcmIgcGMsIFtyNywgIzhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlN2Y3ZjAwOAlAIGxkcmIgcGMsIFtyNywgcjhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNWVmNjAwOAlAIHN0cmIgcjYsIFtwYywgIzhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlN2VmNjAwOAlAIHN0cmIgcjYsIFtwYywgcjNdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNWZmNjAwOAlAIGxkcmIgcjYsIFtwYywgIzhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlN2ZmNjAwOAlAIGxkcmIgcjYsIFtwYywgcjNdISIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJ0CXIwLCBbcjFdLCAjNCIpCisJVEVTVF9VTlNVUFBPUlRFRCgibGRydAlyMSwgW3IyXSwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoInN0cnQJcjIsIFtyM10sICM0IikKKwlURVNUX1VOU1VQUE9SVEVEKCJzdHJ0CXIzLCBbcjRdLCByNSIpCisJVEVTVF9VTlNVUFBPUlRFRCgibGRyYnQJcjQsIFtyNV0sICM0IikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJidAlyNSwgW3I2XSwgcjciKQorCVRFU1RfVU5TVVBQT1JURUQoInN0cmJ0CXI2LCBbcjddLCAjNCIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3RyYnQJcjcsIFtyOF0sIHI5IikKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA3CisJVEVTVF9HUk9VUCgiUGFyYWxsZWwgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uLCBzaWduZWQiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjAwMDAxMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjBmZmZmZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisKKwlURVNUX1JSKCAgICAic2FkZDE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic2FkZDE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MWNmZjFhCUAgc2FkZDE2CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInNhc3gJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzYXN4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MWNmZjNhCUAgc2FzeAlwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJzc2F4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic3NheAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjFjZmY1YQlAIHNzYXgJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAic3N1YjE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic3N1YjE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MWNmZjdhCUAgc3N1YjE2CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInNhZGQ4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic2FkZDgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYxY2ZmOWEJQCBzYWRkOAlwYywgcjEyLCByMTAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYxMDAwYjAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYxZmZmYmYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYxMDAwZDAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYxZmZmZGYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfUlIoICAgICJzc3ViOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNzdWI4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MWNmZmZhCUAgc3N1YjgJcGMsIHIxMiwgcjEwIikKKworCVRFU1RfUlIoICAgICJxYWRkMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJxYWRkMTYJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYyY2ZmMWEJQCBxYWRkMTYJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAicWFzeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInFhc3gJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYyY2ZmM2EJQCBxYXN4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInFzYXgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJxc2F4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MmNmZjVhCUAgcXNheAlwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJxc3ViMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJxc3ViMTYJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYyY2ZmN2EJQCBxc3ViMTYJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAicWFkZDgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJxYWRkOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjJjZmY5YQlAIHFhZGQ4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjIwMDBiMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjJmZmZiZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjIwMDBkMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjJmZmZkZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9SUiggICAgInFzdWI4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAicXN1YjgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYyY2ZmZmEJQCBxc3ViOAlwYywgcjEyLCByMTAiKQorCisJVEVTVF9SUiggICAgInNoYWRkMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzaGFkZDE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2M2NmZjFhCUAgc2hhZGQxNglwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJzaGFzeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNoYXN4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2M2NmZjNhCUAgc2hhc3gJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAic2hzYXgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzaHNheAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjNjZmY1YQlAIHNoc2F4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInNoc3ViMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzaHN1YjE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2M2NmZjdhCUAgc2hzdWIxNglwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJzaGFkZDgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzaGFkZDgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYzY2ZmOWEJQCBzaGFkZDgJcGMsIHIxMiwgcjEwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MzAwMGIwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2M2ZmZmJmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MzAwMGQwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2M2ZmZmRmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1JSKCAgICAic2hzdWI4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic2hzdWI4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2M2NmZmZhCUAgc2hzdWI4CXBjLCByMTIsIHIxMCIpCisKKwlURVNUX0dST1VQKCJQYXJhbGxlbCBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24sIHVuc2lnbmVkIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY0MDAwMTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY0ZmZmZmYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCisJVEVTVF9SUiggICAgInVhZGQxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVhZGQxNglyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjVjZmYxYQlAIHVhZGQxNglwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJ1YXN4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidWFzeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjVjZmYzYQlAIHVhc3gJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAidXNheAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVzYXgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY1Y2ZmNWEJQCB1c2F4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInVzdWIxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVzdWIxNglyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjVjZmY3YQlAIHVzdWIxNglwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJ1YWRkOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVhZGQ4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NWNmZjlhCUAgdWFkZDgJcGMsIHIxMiwgcjEwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NTAwMGIwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NWZmZmJmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NTAwMGQwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NWZmZmRmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1JSKCAgICAidXN1YjgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1c3ViOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjVjZmZmYQlAIHVzdWI4CXBjLCByMTIsIHIxMCIpCisKKwlURVNUX1JSKCAgICAidXFhZGQxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVxYWRkMTYJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY2Y2ZmMWEJQCB1cWFkZDE2CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInVxYXN4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXFhc3gJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY2Y2ZmM2EJQCB1cWFzeAlwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJ1cXNheAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVxc2F4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NmNmZjVhCUAgdXFzYXgJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAidXFzdWIxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVxc3ViMTYJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY2Y2ZmN2EJQCB1cXN1YjE2CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInVxYWRkOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVxYWRkOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjZjZmY5YQlAIHVxYWRkOAlwYywgcjEyLCByMTAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY2MDAwYjAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY2ZmZmYmYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY2MDAwZDAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY2ZmZmZGYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfUlIoICAgICJ1cXN1YjgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1cXN1YjgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY2Y2ZmZmEJQCB1cXN1YjgJcGMsIHIxMiwgcjEwIikKKworCVRFU1RfUlIoICAgICJ1aGFkZDE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidWhhZGQxNglyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjdjZmYxYQlAIHVoYWRkMTYJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAidWhhc3gJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1aGFzeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjdjZmYzYQlAIHVoYXN4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInVoc2F4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidWhzYXgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY3Y2ZmNWEJQCB1aHNheAlwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJ1aHN1YjE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidWhzdWIxNglyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjdjZmY3YQlAIHVoc3ViMTYJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAidWhhZGQ4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidWhhZGQ4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2N2NmZjlhCUAgdWhhZGQ4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjcwMDBiMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjdmZmZiZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjcwMDBkMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjdmZmZkZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9SUiggICAgInVoc3ViOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVoc3ViOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjdjZmZmYQlAIHVoc3ViOAlwYywgcjEyLCByMTAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY3ZmVmZmEJQCB1aHN1YjgJcjE0LCBwYywgcjEwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2N2NlZmZmCUAgdWhzdWI4CXIxNCwgcjEyLCBwYyIpCisjZW5kaWYgLyogX19MSU5VWF9BUk1fQVJDSF9fID49IDcgKi8KKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CisJVEVTVF9HUk9VUCgiUGFja2luZywgdW5wYWNraW5nLCBzYXR1cmF0aW9uLCBhbmQgcmV2ZXJzYWwiKQorCisJVEVTVF9SUiggICAgInBraGJ0CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAicGtoYnQJcjE0LHIiLDEyLCBISDEsIiwgciIsMTAsSEgyLCIsIGxzbCAjMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjhjZjExYQlAIHBraGJ0CXBjLCByMTIsIHIxMCwgbHNsICMyIikKKwlURVNUX1JSKCAgICAicGtodGIJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJwa2h0YglyMTQsciIsMTIsIEhIMSwiLCByIiwxMCxISDIsIiwgYXNyICMyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2OGNmMTVhCUAgcGtodGIJcGMsIHIxMiwgcjEwLCBhc3IgIzIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY4ZmUxNWEJQCBwa2h0YglyMTQsIHBjLCByMTAsIGFzciAjMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjhjZTE1ZglAIHBraHRiCXIxNCwgcjEyLCBwYywgYXNyICMyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2OTAwMDEwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2OWZmZmRmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKworCVRFU1RfUiggICAgICJzc2F0CXIwLCAjMjQsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoICAgICAic3NhdAlyMTQsICMyNCwgciIsMTIsIFZBTDIsIiIpCisJVEVTVF9SKCAgICAgInNzYXQJcjAsICMyNCwgciIsMCwgICBWQUwxLCIsIGxzbCAjOCIpCisJVEVTVF9SKCAgICAgInNzYXQJcjE0LCAjMjQsIHIiLDEyLCBWQUwyLCIsIGFzciAjOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmI3ZjAxYwlAIHNzYXQJcGMsICMyNCwgcjEyIikKKworCVRFU1RfUiggICAgICJ1c2F0CXIwLCAjMjQsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoICAgICAidXNhdAlyMTQsICMyNCwgciIsMTIsIFZBTDIsIiIpCisJVEVTVF9SKCAgICAgInVzYXQJcjAsICMyNCwgciIsMCwgICBWQUwxLCIsIGxzbCAjOCIpCisJVEVTVF9SKCAgICAgInVzYXQJcjE0LCAjMjQsIHIiLDEyLCBWQUwyLCIsIGFzciAjOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmY3ZjAxYwlAIHVzYXQJcGMsICMyNCwgcjEyIikKKworCVRFU1RfUlIoICAgICJzeHRhYjE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic3h0YWIxNglyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAic3h0YjE2CXI4LCByIiw3LCAgSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY4Y2Y0N2EJQCBzeHRhYjE2CXBjLHIxMiwgcjEwLCByb3IgIzgiKQorCisJVEVTVF9SUiggICAgInNlbAlyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic2VsCXIxNCwgciIsMTIsVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2OGNmZmJhCUAgc2VsCXBjLCByMTIsIHIxMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjhmZWZiYQlAIHNlbAlyMTQsIHBjLCByMTAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY4Y2VmYmYJQCBzZWwJcjE0LCByMTIsIHBjIikKKworCVRFU1RfUiggICAgICJzc2F0MTYJcjAsICMxMiwgciIsMCwgICBISDEsIiIpCisJVEVTVF9SKCAgICAgInNzYXQxNglyMTQsICMxMiwgciIsMTIsIEhIMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2YWJmZjNjCUAgc3NhdDE2CXBjLCAjMTIsIHIxMiIpCisKKwlURVNUX1JSKCAgICAic3h0YWIJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzeHRhYglyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAic3h0YglyOCwgciIsNywgIEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2YWNmNDdhCUAgc3h0YWIJcGMscjEyLCByMTAsIHJvciAjOCIpCisKKwlURVNUX1IoICAgICAicmV2CXIwLCByIiwwLCAgIFZBTDEsIiIpCisJVEVTVF9SKCAgICAgInJldglyMTQsIHIiLDEyLCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZiZmZmM2MJQCByZXYJcGMsIHIxMiIpCisKKwlURVNUX1JSKCAgICAic3h0YWgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzeHRhaAlyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAic3h0aAlyOCwgciIsNywgIEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2YmNmNDdhCUAgc3h0YWgJcGMscjEyLCByMTAsIHJvciAjOCIpCisKKwlURVNUX1IoICAgICAicmV2MTYJcjAsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoICAgICAicmV2MTYJcjE0LCByIiwxMiwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2YmZmZmJjCUAgcmV2MTYJcGMsIHIxMiIpCisKKwlURVNUX1JSKCAgICAidXh0YWIxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInV4dGFiMTYJcjE0LHIiLDEyLCBISDIsIiwgciIsMTAsSEgxLCIsIHJvciAjOCIpCisJVEVTVF9SKCAgICAgInV4dGIxNglyOCwgciIsNywgIEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2Y2NmNDdhCUAgdXh0YWIxNglwYyxyMTIsIHIxMCwgcm9yICM4IikKKworCVRFU1RfUiggICAgICJ1c2F0MTYJcjAsICMxMiwgciIsMCwgICBISDEsIiIpCisJVEVTVF9SKCAgICAgInVzYXQxNglyMTQsICMxMiwgciIsMTIsIEhIMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZWNmZjNjCUAgdXNhdDE2CXBjLCAjMTIsIHIxMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmVjZWYzZglAIHVzYXQxNglyMTQsICMxMiwgcGMiKQorCisJVEVTVF9SUiggICAgInV4dGFiCXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXh0YWIJcjE0LHIiLDEyLCBISDIsIiwgciIsMTAsSEgxLCIsIHJvciAjOCIpCisJVEVTVF9SKCAgICAgInV4dGIJcjgsIHIiLDcsICBISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmVjZjQ3YQlAIHV4dGFiCXBjLHIxMiwgcjEwLCByb3IgIzgiKQorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKwlURVNUX1IoICAgICAicmJpdAlyMCwgciIsMCwgICBWQUwxLCIiKQorCVRFU1RfUiggICAgICJyYml0CXIxNCwgciIsMTIsIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmZmZmYzYwlAIHJiaXQJcGMsIHIxMiIpCisjZW5kaWYKKworCVRFU1RfUlIoICAgICJ1eHRhaAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInV4dGFoCXIxNCxyIiwxMiwgSEgyLCIsIHIiLDEwLEhIMSwiLCByb3IgIzgiKQorCVRFU1RfUiggICAgICJ1eHRoCXI4LCByIiw3LCAgSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZmZmYwNzcJQCB1eHRoCXBjLCByNyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmZmODA3ZglAIHV4dGgJcjgsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZmNmNDdhCUAgdXh0YWgJcGMsIHIxMiwgcjEwLCByb3IgIzgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZmY2U0N2YJQCB1eHRhaAlyMTQsIHIxMiwgcGMsIHJvciAjOCIpCisKKwlURVNUX1IoICAgICAicmV2c2gJcjAsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoICAgICAicmV2c2gJcjE0LCByIiwxMiwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZmZmZjNjCUAgcmV2c2gJcGMsIHIxMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmZmZWYzZglAIHJldnNoCXIxNCwgcGMiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjkwMDA3MCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjlmZmY3ZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZDAwMDcwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZGZmZjdmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNiAqLworCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYKKwlURVNUX0dST1VQKCJTaWduZWQgbXVsdGlwbGllcyIpCisKKwlURVNUX1JSUiggICAic21sYWQJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAgInNtbGFkCXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTcwZjhhMWMJQCBzbWxhZAlwYywgcjEyLCByMTAsIHI4IikKKwlURVNUX1JSUiggICAic21sYWR4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhZHgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzBmOGEzYwlAIHNtbGFkeAlwYywgcjEyLCByMTAsIHI4IikKKworCVRFU1RfUlIoICAgInNtdWFkCXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICJzbXVhZAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzBmZmExYwlAIHNtdWFkCXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAic211YWR4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICJzbXVhZHgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTcwZmZhM2MJQCBzbXVhZHgJcGMsIHIxMiwgcjEwIikKKworCVRFU1RfUlJSKCAgICJzbWxzZAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21sc2QJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzBmOGE1YwlAIHNtbHNkCXBjLCByMTIsIHIxMCwgcjgiKQorCVRFU1RfUlJSKCAgICJzbWxzZHgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAgInNtbHNkeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiwgciIsOCwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3MGY4YTdjCUAgc21sc2R4CXBjLCByMTIsIHIxMCwgcjgiKQorCisJVEVTVF9SUiggICAic211c2QJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgInNtdXNkCXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3MGZmYTVjCUAgc211c2QJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICJzbXVzZHgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgInNtdXNkeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzBmZmE3YwlAIHNtdXNkeAlwYywgcjEyLCByMTAiKQorCisJVEVTVF9SUlJSKCAic21sYWxkCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwgIiwgciIsMCwgSEgxLCIsIHIiLDEsIEhIMikKKwlURVNUX1JSUlIoICJzbWxhbGQJciIsMTEsVkFMMiwiLCByIiwxMCxWQUwxLCAiLCByIiw5LCBISDIsIiwgciIsOCwgSEgxKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc0YWY4MTkJQCBzbWxhbGQJcGMsIHIxMCwgcjksIHI4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NGZiODE5CUAgc21sYWxkCXIxMSwgcGMsIHI5LCByOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzRhYjgxZglAIHNtbGFsZAlyMTEsIHIxMCwgcGMsIHI4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NGFiZjE5CUAgc21sYWxkCXIxMSwgcjEwLCByOSwgcGMiKQorCisJVEVTVF9SUlJSKCAic21sYWxkeAlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsICIsIHIiLDAsIEhIMSwiLCByIiwxLCBISDIpCisJVEVTVF9SUlJSKCAic21sYWxkeAlyIiwxMSxWQUwyLCIsIHIiLDEwLFZBTDEsICIsIHIiLDksIEhIMiwiLCByIiw4LCBISDEpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzRhZjgzOQlAIHNtbGFsZHgJcGMsIHIxMCwgcjksIHI4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NGZiODM5CUAgc21sYWxkeAlyMTEsIHBjLCByOSwgcjgiKQorCisJVEVTVF9SUlIoICAic21tbGEJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICJzbW1sYQlyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc1ZjhhMWMJQCBzbW1sYQlwYywgcjEyLCByMTAsIHI4IikKKwlURVNUX1JSUiggICJzbW1sYXIJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICJzbW1sYXIJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiwgciIsOCwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NWY4YTNjCUAgc21tbGFyCXBjLCByMTIsIHIxMCwgcjgiKQorCisJVEVTVF9SUiggICAic21tdWwJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiIpCisJVEVTVF9SUiggICAic21tdWwJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzVmZmExYwlAIHNtbXVsCXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAic21tdWxyCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgInNtbXVscglyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NWZmYTNjCUAgc21tdWxyCXBjLCByMTIsIHIxMCIpCisKKwlURVNUX1JSUiggICJzbW1scwlyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgInNtbWxzCXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMCxWQUwxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzVmOGFkYwlAIHNtbWxzCXBjLCByMTIsIHIxMCwgcjgiKQorCVRFU1RfUlJSKCAgInNtbWxzcglyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgInNtbWxzcglyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc1ZjhhZmMJQCBzbW1sc3IJcGMsIHIxMiwgcjEwLCByOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzVlOGFmZglAIHNtbWxzcglyMTQsIHBjLCByMTAsIHI4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NWU4ZmZjCUAgc21tbHNyCXIxNCwgcjEyLCBwYywgcjgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc1ZWZhZmMJQCBzbW1sc3IJcjE0LCByMTIsIHIxMCwgcGMiKQorCisJVEVTVF9SUiggICAidXNhZDgJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiIpCisJVEVTVF9SUiggICAidXNhZDgJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzVmZmExYwlAIHVzYWQ4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzVlZmExZglAIHVzYWQ4CXIxNCwgcGMsIHIxMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzVlZmYxYwlAIHVzYWQ4CXIxNCwgcjEyLCBwYyIpCisKKwlURVNUX1JSUiggICJ1c2FkYTgJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiIikKKwlURVNUX1JSUiggICJ1c2FkYTgJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiwgciIsOCwgVkFMMywiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3OGY4YTFjCUAgdXNhZGE4CXBjLCByMTIsIHIxMCwgcjgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc4ZThhMWYJQCB1c2FkYTgJcjE0LCBwYywgcjEwLCByOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzhlOGYxYwlAIHVzYWRhOAlyMTQsIHIxMiwgcGMsIHI4IikKKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNiAqLworCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKwlURVNUX0dST1VQKCJCaXQgRmllbGQiKQorCisJVEVTVF9SKCAgICAgInNiZngJcjAsIHIiLDAgICwgVkFMMSwiLCAjMCwgIzMxIikKKwlURVNUX1IoICAgICAic2JmeGVxCXIxNCwgciIsMTIsIFZBTDIsIiwgIzgsICMxNiIpCisJVEVTVF9SKCAgICAgInNiZngJcjQsIHIiLDEwLCAgVkFMMSwiLCAjMTYsICMxNSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlN2FmZjQ1YwlAIHNiZngJcGMsIHIxMiwgIzgsICMxNiIpCisKKwlURVNUX1IoICAgICAidWJmeAlyMCwgciIsMCAgLCBWQUwxLCIsICMwLCAjMzEiKQorCVRFU1RfUiggICAgICJ1YmZ4Y3MJcjE0LCByIiwxMiwgVkFMMiwiLCAjOCwgIzE2IikKKwlURVNUX1IoICAgICAidWJmeAlyNCwgciIsMTAsICBWQUwxLCIsICMxNiwgIzE1IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3ZWZmNDVjCUAgdWJmeAlwYywgcjEyLCAjOCwgIzE2IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3ZWZjNDVmCUAgdWJmeAlyMTIsIHBjLCAjOCwgIzE2IikKKworCVRFU1RfUiggICAgICJiZmMJciIsMCwgVkFMMSwiLCAjNCwgIzIwIikKKwlURVNUX1IoICAgICAiYmZjdnMJciIsMTQsVkFMMiwiLCAjNCwgIzIwIikKKwlURVNUX1IoICAgICAiYmZjCXIiLDcsIFZBTDEsIiwgIzAsICMzMSIpCisJVEVTVF9SKCAgICAgImJmYwlyIiw4LCBWQUwyLCIsICMwLCAjMzEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTdkZWYwMWYJQCBiZmMJcGMsICMwLCAjMzEiKTsKKworCVRFU1RfUlIoICAgICJiZmkJciIsMCwgVkFMMSwiLCByIiwwICAsIFZBTDIsIiwgIzAsICMzMSIpCisJVEVTVF9SUiggICAgImJmaXBsCXIiLDEyLFZBTDEsIiwgciIsMTQgLCBWQUwyLCIsICM0LCAjMjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTdkN2YyMWUJQCBiZmkJcGMsIHIxNCwgIzQsICMyMCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweDA3ZjAwMGYwIikgIC8qIFBlcm1hbmVudGx5IFVOREVGSU5FRCAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4MDdmZmZmZmYiKSAgLyogUGVybWFuZW50bHkgVU5ERUZJTkVEICovCisjZW5kaWYgLyogX19MSU5VWF9BUk1fQVJDSF9fID49IDYgKi8KKworCVRFU1RfR1JPVVAoIkJyYW5jaCwgYnJhbmNoIHdpdGggbGluaywgYW5kIGJsb2NrIGRhdGEgdHJhbnNmZXIiKQorCisJVEVTVF9QKCAgICJzdG1kYQlyIiwwLCAxNio0LCIsIHtyMH0iKQorCVRFU1RfUCggICAic3RtZXFkYQlyIiw0LCAxNio0LCIsIHtyMC1yMTV9IikKKwlURVNUX1AoICAgInN0bW5lZGEJciIsOCwgMTYqNCwiISwge3I4LXIxNX0iKQorCVRFU1RfUCggICAic3RtZGEJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX1AoICAgInN0bWRhCXIiLDEzLDAsICAgIiEsIHtwY30iKQorCisJVEVTVF9QKCAgICJsZG1kYQlyIiwwLCAxNio0LCIsIHtyMH0iKQorCVRFU1RfQkZfUCgibGRtY3NkYQlyIiw0LCAxNSo0LCIsIHtyMC1yMTV9IikKKwlURVNUX0JGX1AoImxkbWNjZGEJciIsNywgMTUqNCwiISwge3I4LXIxNX0iKQorCVRFU1RfUCggICAibGRtZGEJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX0JGX1AoImxkbWRhCXIiLDE0LDE1KjQsIiEsIHtwY30iKQorCisJVEVTVF9QKCAgICJzdG1pYQlyIiwwLCAxNio0LCIsIHtyMH0iKQorCVRFU1RfUCggICAic3RtbWlpYQlyIiw0LCAxNio0LCIsIHtyMC1yMTV9IikKKwlURVNUX1AoICAgInN0bXBsaWEJciIsOCwgMTYqNCwiISwge3I4LXIxNX0iKQorCVRFU1RfUCggICAic3RtaWEJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX1AoICAgInN0bWlhCXIiLDE0LDAsICAgIiEsIHtwY30iKQorCisJVEVTVF9QKCAgICJsZG1pYQlyIiwwLCAxNio0LCIsIHtyMH0iKQorCVRFU1RfQkZfUCgibGRtdnNpYQlyIiw0LCAwLCAgICIsIHtyMC1yMTV9IikKKwlURVNUX0JGX1AoImxkbXZjaWEJciIsNywgOCo0LCAiISwge3I4LXIxNX0iKQorCVRFU1RfUCggICAibGRtaWEJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX0JGX1AoImxkbWlhCXIiLDE0LDE1KjQsIiEsIHtwY30iKQorCisJVEVTVF9QKCAgICJzdG1kYglyIiwwLCAxNio0LCIsIHtyMH0iKQorCVRFU1RfUCggICAic3RtaGlkYglyIiw0LCAxNio0LCIsIHtyMC1yMTV9IikKKwlURVNUX1AoICAgInN0bWxzZGIJciIsOCwgMTYqNCwiISwge3I4LXIxNX0iKQorCVRFU1RfUCggICAic3RtZGIJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDEzLDQsICAgIiEsIHtwY30iKQorCisJVEVTVF9QKCAgICJsZG1kYglyIiwwLCAxNio0LCIsIHtyMH0iKQorCVRFU1RfQkZfUCgibGRtZ2VkYglyIiw0LCAxNio0LCIsIHtyMC1yMTV9IikKKwlURVNUX0JGX1AoImxkbWx0ZGIJciIsNywgMTYqNCwiISwge3I4LXIxNX0iKQorCVRFU1RfUCggICAibGRtZGIJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX0JGX1AoImxkbWRiCXIiLDE0LDE2KjQsIiEsIHtwY30iKQorCisJVEVTVF9QKCAgICJzdG1pYglyIiwwLCAxNio0LCIsIHtyMH0iKQorCVRFU1RfUCggICAic3RtZ3RpYglyIiw0LCAxNio0LCIsIHtyMC1yMTV9IikKKwlURVNUX1AoICAgInN0bWxlaWIJciIsOCwgMTYqNCwiISwge3I4LXIxNX0iKQorCVRFU1RfUCggICAic3RtaWIJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX1AoICAgInN0bWliCXIiLDEzLC00LCAgIiEsIHtwY30iKQorCisJVEVTVF9QKCAgICJsZG1pYglyIiwwLCAxNio0LCIsIHtyMH0iKQorCVRFU1RfQkZfUCgibGRtZXFpYglyIiw0LCAtNCwiLCB7cjAtcjE1fSIpCisJVEVTVF9CRl9QKCJsZG1uZWliCXIiLDcsIDcqNCwiISwge3I4LXIxNX0iKQorCVRFU1RfUCggICAibGRtaWIJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX0JGX1AoImxkbWliCXIiLDE0LDE0KjQsIiEsIHtwY30iKQorCisJVEVTVF9QKCAgICJzdG1kYglyIiwxMywxNio0LCIhLCB7cjMtcjEyLGxyfSIpCisJVEVTVF9QKAkgICJzdG1lcWRiCXIiLDEzLDE2KjQsIiEsIHtyMy1yMTJ9IikKKwlURVNUX1AoICAgInN0bW5lZGIJciIsMiwgMTYqNCwiLCB7cjMtcjEyLGxyfSIpCisJVEVTVF9QKCAgICJzdG1kYglyIiwxMywxNio0LCIhLCB7cjItcjEyLGxyfSIpCisJVEVTVF9QKCAgICJzdG1kYglyIiwwLCAxNio0LCIsIHtyMC1yMTJ9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDAsIDE2KjQsIiwge3IwLXIxMixscn0iKQorCisJVEVTVF9CRl9QKCJsZG1pYQlyIiwxMyw1KjQsICIhLCB7cjMtcjEyLHBjfSIpCisJVEVTVF9QKAkgICJsZG1jY2lhCXIiLDEzLDUqNCwgIiEsIHtyMy1yMTJ9IikKKwlURVNUX0JGX1AoImxkbWNzaWEJciIsMiwgNSo0LCAiISwge3IzLXIxMixwY30iKQorCVRFU1RfQkZfUCgibGRtaWEJciIsMTMsNCo0LCAiISwge3IyLXIxMixwY30iKQorCVRFU1RfUCggICAibGRtaWEJciIsMCwgMTYqNCwiLCB7cjAtcjEyfSIpCisJVEVTVF9QKCAgICJsZG1pYQlyIiwwLCAxNio0LCIsIHtyMC1yMTIsbHJ9IikKKworI2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisJVEVTVF9BUk1fVE9fVEhVTUJfSU5URVJXT1JLX1AoImxkbXBsaWEJciIsMCwxNSo0LCIsIHtwY30iKQorCVRFU1RfQVJNX1RPX1RIVU1CX0lOVEVSV09SS19QKCJsZG1taWlhCXIiLDEzLDAsIiwge3IwLXIxNX0iKQorI2VuZGlmCisJVEVTVF9CRigiYgkyZiIpCisJVEVTVF9CRigiYmwJMmYiKQorCVRFU1RfQkIoImIJMmIiKQorCVRFU1RfQkIoImJsCTJiIikKKworCVRFU1RfQkYoImJlcQkyZiIpCisJVEVTVF9CRigiYmxlcQkyZiIpCisJVEVTVF9CQigiYm5lCTJiIikKKwlURVNUX0JCKCJibG5lCTJiIikKKworCVRFU1RfQkYoImJndAkyZiIpCisJVEVTVF9CRigiYmxndAkyZiIpCisJVEVTVF9CQigiYmx0CTJiIikKKwlURVNUX0JCKCJibGx0CTJiIikKKworCVRFU1RfR1JPVVAoIlN1cGVydmlzb3IgQ2FsbCwgYW5kIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyIpCisKKwkvKgorCSAqIFdlIGNhbid0IHJlYWxseSB0ZXN0IHRoZXNlIGJ5IGV4ZWN1dGluZyB0aGVtLCBzbyBhbGwKKwkgKiB3ZSBjYW4gZG8gaXMgY2hlY2sgdGhhdCBwcm9iZXMgYXJlLCBvciBhcmUgbm90IGFsbG93ZWQuCisJICogQXQgdGhlIG1vbWVudCBub25lIGFyZSBhbGxvd2VkLi4uCisJICovCisjZGVmaW5lIFRFU1RfQ09QUk9DRVNTT1IoY29kZSkgVEVTVF9VTlNVUFBPUlRFRChjb2RlKQorCisjZGVmaW5lIENPUFJPQ0VTU09SX0lOU1RSVUNUSU9OU19TVF9MRCh0d28sY2MpCQkJCQlcCisJVEVTVF9DT1BST0NFU1NPUigic3RjInR3byIJMCwgY3IwLCBbcjEzLCAjNF0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvIgkwLCBjcjAsIFtyMTMsICMtNF0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvIgkwLCBjcjAsIFtyMTMsICM0XSEiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvIgkwLCBjcjAsIFtyMTMsICMtNF0hIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigic3RjInR3byIJMCwgY3IwLCBbcjEzXSwgIzQiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvIgkwLCBjcjAsIFtyMTNdLCAjLTQiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvIgkwLCBjcjAsIFtyMTNdLCB7MX0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvImwJMCwgY3IwLCBbcjEzLCAjNF0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvImwJMCwgY3IwLCBbcjEzLCAjLTRdIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigic3RjInR3byJsCTAsIGNyMCwgW3IxMywgIzRdISIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoInN0YyJ0d28ibAkwLCBjcjAsIFtyMTMsICMtNF0hIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigic3RjInR3byJsCTAsIGNyMCwgW3IxM10sICM0IikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigic3RjInR3byJsCTAsIGNyMCwgW3IxM10sICMtNCIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoInN0YyJ0d28ibAkwLCBjcjAsIFtyMTNdLCB7MX0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJsZGMidHdvIgkwLCBjcjAsIFtyMTMsICM0XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28iCTAsIGNyMCwgW3IxMywgIy00XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28iCTAsIGNyMCwgW3IxMywgIzRdISIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28iCTAsIGNyMCwgW3IxMywgIy00XSEiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJsZGMidHdvIgkwLCBjcjAsIFtyMTNdLCAjNCIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28iCTAsIGNyMCwgW3IxM10sICMtNCIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28iCTAsIGNyMCwgW3IxM10sIHsxfSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28ibAkwLCBjcjAsIFtyMTMsICM0XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28ibAkwLCBjcjAsIFtyMTMsICMtNF0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJsZGMidHdvImwJMCwgY3IwLCBbcjEzLCAjNF0hIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigibGRjInR3byJsCTAsIGNyMCwgW3IxMywgIy00XSEiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJsZGMidHdvImwJMCwgY3IwLCBbcjEzXSwgIzQiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJsZGMidHdvImwJMCwgY3IwLCBbcjEzXSwgIy00IikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigibGRjInR3byJsCTAsIGNyMCwgW3IxM10sIHsxfSIpCQkJXAorCQkJCQkJCQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAic3RjInR3byIJMCwgY3IwLCBbcjE1LCAjNF0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAic3RjInR3byIJMCwgY3IwLCBbcjE1LCAjLTRdIikJCQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiZGFmMDAwMQlAIHN0YyJ0d28iCTAsIGNyMCwgW3IxNSwgIzRdISIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJkMmYwMDAxCUAgc3RjInR3byIJMCwgY3IwLCBbcjE1LCAjLTRdISIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJjYWYwMDAxCUAgc3RjInR3byIJMCwgY3IwLCBbcjE1XSwgIzQiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiYzJmMDAwMQlAIHN0YyJ0d28iCTAsIGNyMCwgW3IxNV0sICMtNCIpCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAic3RjInR3byIJMCwgY3IwLCBbcjE1XSwgezF9IikJCQlcCisJVEVTVF9DT1BST0NFU1NPUiggInN0YyJ0d28ibAkwLCBjcjAsIFtyMTUsICM0XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJzdGMidHdvImwJMCwgY3IwLCBbcjE1LCAjLTRdIikJCQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiZGVmMDAwMQlAIHN0YyJ0d28ibAkwLCBjcjAsIFtyMTUsICM0XSEiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiZDZmMDAwMQlAIHN0YyJ0d28ibAkwLCBjcjAsIFtyMTUsICMtNF0hIikJXAorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ImNjImNlZjAwMDEJQCBzdGMidHdvImwJMCwgY3IwLCBbcjE1XSwgIzQiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiYzZmMDAwMQlAIHN0YyJ0d28ibAkwLCBjcjAsIFtyMTVdLCAjLTQiKQlcCisJVEVTVF9DT1BST0NFU1NPUiggInN0YyJ0d28ibAkwLCBjcjAsIFtyMTVdLCB7MX0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAibGRjInR3byIJMCwgY3IwLCBbcjE1LCAjNF0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAibGRjInR3byIJMCwgY3IwLCBbcjE1LCAjLTRdIikJCQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiZGJmMDAwMQlAIGxkYyJ0d28iCTAsIGNyMCwgW3IxNSwgIzRdISIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJkM2YwMDAxCUAgbGRjInR3byIJMCwgY3IwLCBbcjE1LCAjLTRdISIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJjYmYwMDAxCUAgbGRjInR3byIJMCwgY3IwLCBbcjE1XSwgIzQiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiYzNmMDAwMQlAIGxkYyJ0d28iCTAsIGNyMCwgW3IxNV0sICMtNCIpCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAibGRjInR3byIJMCwgY3IwLCBbcjE1XSwgezF9IikJCQlcCisJVEVTVF9DT1BST0NFU1NPUiggImxkYyJ0d28ibAkwLCBjcjAsIFtyMTUsICM0XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJsZGMidHdvImwJMCwgY3IwLCBbcjE1LCAjLTRdIikJCQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiZGZmMDAwMQlAIGxkYyJ0d28ibAkwLCBjcjAsIFtyMTUsICM0XSEiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiZDdmMDAwMQlAIGxkYyJ0d28ibAkwLCBjcjAsIFtyMTUsICMtNF0hIikJXAorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ImNjImNmZjAwMDEJQCBsZGMidHdvImwJMCwgY3IwLCBbcjE1XSwgIzQiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiYzdmMDAwMQlAIGxkYyJ0d28ibAkwLCBjcjAsIFtyMTVdLCAjLTQiKQlcCisJVEVTVF9DT1BST0NFU1NPUiggImxkYyJ0d28ibAkwLCBjcjAsIFtyMTVdLCB7MX0iKQorCisjZGVmaW5lIENPUFJPQ0VTU09SX0lOU1RSVUNUSU9OU19NQ19NUih0d28sY2MpCQkJCQlcCisJCQkJCQkJCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJtY3JyInR3byIJMCwgMTUsIHIwLCByMTQsIGNyMCIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJtY3JyInR3byIJMTUsIDAsIHIxNCwgcjAsIGNyMTUiKQkJCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJjNGYwMGYwCUAgbWNyciJ0d28iCTAsIDE1LCByMCwgcjE1LCBjcjAiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiYzQwZmYwZglAIG1jcnIidHdvIgkxNSwgMCwgcjE1LCByMCwgY3IxNSIpCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAibXJyYyJ0d28iCTAsIDE1LCByMCwgcjE0LCBjcjAiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAibXJyYyJ0d28iCTE1LCAwLCByMTQsIHIwLCBjcjE1IikJCQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiYzVmMDBmMAlAIG1ycmMidHdvIgkwLCAxNSwgcjAsIHIxNSwgY3IwIikJXAorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ImNjImM1MGZmMGYJQCBtcnJjInR3byIJMTUsIDAsIHIxNSwgcjAsIGNyMTUiKQlcCisJVEVTVF9DT1BST0NFU1NPUiggImNkcCJ0d28iCTE1LCAxNSwgY3IxNSwgY3IxNSwgY3IxNSwgNyIpCQlcCisJVEVTVF9DT1BST0NFU1NPUiggImNkcCJ0d28iCTAsIDAsIGNyMCwgY3IwLCBjcjAsIDAiKQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJtY3IidHdvIgkxNSwgNywgcjE1LCBjcjE1LCBjcjE1LCA3IikJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAibWNyInR3byIJMCwgMCwgcjAsIGNyMCwgY3IwLCAwIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUiggIm1yYyJ0d28iCTE1LCA3LCByMTUsIGNyMTUsIGNyMTUsIDciKQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJtcmMidHdvIgkwLCAwLCByMCwgY3IwLCBjcjAsIDAiKQorCisJQ09QUk9DRVNTT1JfSU5TVFJVQ1RJT05TX1NUX0xEKCIiLCJlIikKKwlDT1BST0NFU1NPUl9JTlNUUlVDVElPTlNfTUNfTVIoIiIsImUiKQorCVRFU1RfVU5TVVBQT1JURUQoInN2YwkwIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzdmMJMHhmZmZmZmYiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgic3ZjCTAiKQorCisJVEVTVF9HUk9VUCgiVW5jb25kaXRpb25hbCBpbnN0cnVjdGlvbiIpCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCVRFU1RfVU5TVVBQT1JURUQoInNyc2RhCXNwLCAweDEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzcnNkYglzcCwgMHgxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3JzaWEJc3AsIDB4MTMiKQorCVRFU1RfVU5TVVBQT1JURUQoInNyc2liCXNwLCAweDEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzcnNkYQlzcCEsIDB4MTMiKQorCVRFU1RfVU5TVVBQT1JURUQoInNyc2RiCXNwISwgMHgxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3JzaWEJc3AhLCAweDEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzcnNpYglzcCEsIDB4MTMiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgicmZlZGEJc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoInJmZWRiCXNwIikKKwlURVNUX1VOU1VQUE9SVEVEKCJyZmVpYQlzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgicmZlaWIJc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoInJmZWRhCXNwISIpCisJVEVTVF9VTlNVUFBPUlRFRCgicmZlZGIJc3AhIikKKwlURVNUX1VOU1VQUE9SVEVEKCJyZmVpYQlzcCEiKQorCVRFU1RfVU5TVVBQT1JURUQoInJmZWliCXNwISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhmODFkMGEwMAlAIHJmZWRhCXBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGY5MWQwYTAwCUAgcmZlZGIJcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4Zjg5ZDBhMDAJQCByZmVpYQlwYyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhmOTlkMGEwMAlAIHJmZWliCXBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGY4M2QwYTAwCUAgcmZlZGEJcGMhIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGY5M2QwYTAwCUAgcmZlZGIJcGMhIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGY4YmQwYTAwCUAgcmZlaWEJcGMhIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGY5YmQwYTAwCUAgcmZlaWIJcGMhIikKKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNiAqLworCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYKKwlURVNUX1goCSJibHgJX19kdW1teV90aHVtYl9zdWJyb3V0aW5lX2V2ZW4iLAorCQkiLnRodW1iCQkJCVxuXHQiCisJCSIuc3BhY2UgNAkJCVxuXHQiCisJCSIudHlwZSBfX2R1bW15X3RodW1iX3N1YnJvdXRpbmVfZXZlbiwgJSVmdW5jdGlvbiBcblx0IgorCQkiX19kdW1teV90aHVtYl9zdWJyb3V0aW5lX2V2ZW46CVxuXHQiCisJCSJtb3YJcjAsIHBjCQkJXG5cdCIKKwkJImJ4CWxyCQkJXG5cdCIKKwkJIi5hcm0JCQkJXG5cdCIKKwkpCisJVEVTVCgJImJseAlfX2R1bW15X3RodW1iX3N1YnJvdXRpbmVfZXZlbiIpCisKKwlURVNUX1goCSJibHgJX19kdW1teV90aHVtYl9zdWJyb3V0aW5lX29kZCIsCisJCSIudGh1bWIJCQkJXG5cdCIKKwkJIi5zcGFjZSAyCQkJXG5cdCIKKwkJIi50eXBlIF9fZHVtbXlfdGh1bWJfc3Vicm91dGluZV9vZGQsICUlZnVuY3Rpb24JXG5cdCIKKwkJIl9fZHVtbXlfdGh1bWJfc3Vicm91dGluZV9vZGQ6CVxuXHQiCisJCSJtb3YJcjAsIHBjCQkJXG5cdCIKKwkJImJ4CWxyCQkJXG5cdCIKKwkJIi5hcm0JCQkJXG5cdCIKKwkpCisJVEVTVCgJImJseAlfX2R1bW15X3RodW1iX3N1YnJvdXRpbmVfb2RkIikKKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNiAqLworCisJQ09QUk9DRVNTT1JfSU5TVFJVQ1RJT05TX1NUX0xEKCIyIiwiZiIpCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYKKwlDT1BST0NFU1NPUl9JTlNUUlVDVElPTlNfTUNfTVIoIjIiLCJmIikKKyNlbmRpZgorCisJVEVTVF9HUk9VUCgiTWlzY2VsbGFuZW91cyBpbnN0cnVjdGlvbnMsIG1lbW9yeSBoaW50cywgYW5kIEFkdmFuY2VkIFNJTUQgaW5zdHJ1Y3Rpb25zIikKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CisJVEVTVF9VTlNVUFBPUlRFRCgiY3BzCTB4MTMiKQorCVRFU1RfVU5TVVBQT1JURUQoImNwc2llCWkiKQorCVRFU1RfVU5TVVBQT1JURUQoImNwc2lkCWkiKQorCVRFU1RfVU5TVVBQT1JURUQoImNwc2llCWksMHgxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiY3BzaWQJaSwweDEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzZXRlbmQJbGUiKQorCVRFU1RfVU5TVVBQT1JURUQoInNldGVuZAliZSIpCisjZW5kaWYKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA3CisJVEVTVF9QKCJwbGkJW3IiLDAsMGIsIiwgIzE2XSIpCisJVEVTVCggICJwbGkJW3BjLCAjMF0iKQorCVRFU1RfUlIoInBsaQlbciIsMTIsMGIsIiwgciIsMCwgMTYsIl0iKQorCVRFU1RfUlIoInBsaQlbciIsMCwgMGIsIiwgLXIiLDEyLDE2LCIsIGxzbCAjNF0iKQorI2VuZGlmCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCVRFU1RfUCgicGxkCVtyIiwwLDMyLCIsICMtMTZdIikKKwlURVNUKCAgInBsZAlbcGMsICMwXSIpCisJVEVTVF9QUigicGxkCVtyIiw3LCAyNCwgIiwgciIsMCwgMTYsIl0iKQorCVRFU1RfUFIoInBsZAlbciIsOCwgMjQsICIsIC1yIiwxMiwxNiwiLCBsc2wgIzRdIikKKyNlbmRpZgorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKwlURVNUX1NVUFBPUlRFRCggICIud29yZCAweGY1OTBmMDAwCUAgcGxkdyBbcjAsICMwXSIpCisJVEVTVF9TVVBQT1JURUQoICAiLndvcmQgMHhmNzk3ZjAwMAlAIHBsZHcJW3I3LCByMF0iKQorCVRFU1RfU1VQUE9SVEVEKCAgIi53b3JkIDB4Zjc5OGYxOGMJQCBwbGR3CVtyOCwgcjEyLCBsc2wgIzNdIik7CisjZW5kaWYKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA3CisJVEVTVF9VTlNVUFBPUlRFRCgiY2xyZXgiKQorCVRFU1RfVU5TVVBQT1JURUQoImRzYiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiZG1iIikKKwlURVNUX1VOU1VQUE9SVEVEKCJpc2IiKQorI2VuZGlmCisKKwl2ZXJib3NlKCJcbiIpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LXRodW1iLmMgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LXRodW1iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3MjZjMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QtdGh1bWIuYwpAQCAtMCwwICsxLDExODcgQEAKKy8qCisgKiBhcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LXRodW1iLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSm9uIE1lZGh1cnN0IDx0aXh5QHl4aXQuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAia3Byb2Jlcy10ZXN0LmgiCisKKworI2RlZmluZSBURVNUX0lTQSAiMTYiCisKKyNkZWZpbmUgRE9OVF9URVNUX0lOX0lUQkxPQ0sodGVzdHMpCQkJXAorCWtwcm9iZV90ZXN0X2ZsYWdzIHw9IFRFU1RfRkxBR19OT19JVEJMT0NLOwlcCisJdGVzdHMJCQkJCQlcCisJa3Byb2JlX3Rlc3RfZmxhZ3MgJj0gflRFU1RfRkxBR19OT19JVEJMT0NLOworCisjZGVmaW5lIENPTkRJVElPTl9JTlNUUlVDVElPTlMoY2NfcG9zLCB0ZXN0cykJCVwKKwlrcHJvYmVfdGVzdF9jY19wb3NpdGlvbiA9IGNjX3BvczsJCVwKKwlET05UX1RFU1RfSU5fSVRCTE9DSyh0ZXN0cykJCQlcCisJa3Byb2JlX3Rlc3RfY2NfcG9zaXRpb24gPSAwOworCisjZGVmaW5lIFRFU1RfSVRCTE9DSyhjb2RlKQkJCQlcCisJa3Byb2JlX3Rlc3RfZmxhZ3MgfD0gVEVTVF9GTEFHX0ZVTExfSVRCTE9DSzsJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUpCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCVwKKwkiNTA6CW5vcAkJCVxuXHQiCQlcCisJIjE6CSJjb2RlIgkJCVxuXHQiCQlcCisJIgltb3YgcjEsICMweDExCQlcblx0IgkJXAorCSIJbW92IHIyLCAjMHgyMgkJXG5cdCIJCVwKKwkiCW1vdiByMywgIzB4MzMJCVxuXHQiCQlcCisJIjI6CW5vcAkJCVxuXHQiCQlcCisJVEVTVENBU0VfRU5ECQkJCQlcCisJa3Byb2JlX3Rlc3RfZmxhZ3MgJj0gflRFU1RfRkxBR19GVUxMX0lUQkxPQ0s7CisKKyNkZWZpbmUgVEVTVF9USFVNQl9UT19BUk1fSU5URVJXT1JLX1AoY29kZTEsIHJlZywgdmFsLCBjb2RlMikJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcgY29kZTIpCQkJXAorCVRFU1RfQVJHX1BUUihyZWcsIHZhbCkJCQkJCVwKKwlURVNUX0FSR19SRUcoMTQsIDk5ZisxKQkJCQkJXAorCVRFU1RfQVJHX01FTSgxNSwgM2YpCQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJXAorCSIJbm9wCQkJXG5cdCIgLyogVG8gYWxpZ24gMWYgKi8JXAorCSI1MDoJbm9wCQkJXG5cdCIJCQlcCisJIjE6CSJjb2RlMSAjcmVnIGNvZGUyIglcblx0IgkJCVwKKwkiCWJ4CWxyCQlcblx0IgkJCVwKKwkiLmFybQkJCQlcblx0IgkJCVwKKwkiMzoJYWRyCWxyLCAyZisxCVxuXHQiCQkJXAorCSIJYngJbHIJCVxuXHQiCQkJXAorCSIudGh1bWIJCQkJXG5cdCIJCQlcCisJIjI6CW5vcAkJCVxuXHQiCQkJXAorCVRFU1RDQVNFX0VORAorCisKK3ZvaWQga3Byb2JlX3RodW1iMTZfdGVzdF9jYXNlcyh2b2lkKQoreworCWtwcm9iZV90ZXN0X2ZsYWdzID0gVEVTVF9GTEFHX05BUlJPV19JTlNUUjsKKworCVRFU1RfR1JPVVAoIlNoaWZ0IChpbW1lZGlhdGUpLCBhZGQsIHN1YnRyYWN0LCBtb3ZlLCBhbmQgY29tcGFyZSIpCisKKwlURVNUX1IoICAgICJsc2xzCXI3LCByIiwwLFZBTDEsIiwgIzUiKQorCVRFU1RfUiggICAgImxzbHMJcjAsIHIiLDcsVkFMMiwiLCAjMTEiKQorCVRFU1RfUiggICAgImxzcnMJcjcsIHIiLDAsVkFMMSwiLCAjNSIpCisJVEVTVF9SKCAgICAibHNycwlyMCwgciIsNyxWQUwyLCIsICMxMSIpCisJVEVTVF9SKCAgICAiYXNycwlyNywgciIsMCxWQUwxLCIsICM1IikKKwlURVNUX1IoICAgICJhc3JzCXIwLCByIiw3LFZBTDIsIiwgIzExIikKKwlURVNUX1JSKCAgICJhZGRzCXIyLCByIiwwLFZBTDEsIiwgciIsNyxWQUwyLCIiKQorCVRFU1RfUlIoICAgImFkZHMJcjUsIHIiLDcsVkFMMiwiLCByIiwwLFZBTDIsIiIpCisJVEVTVF9SUiggICAic3VicwlyMiwgciIsMCxWQUwxLCIsIHIiLDcsVkFMMiwiIikKKwlURVNUX1JSKCAgICJzdWJzCXI1LCByIiw3LFZBTDIsIiwgciIsMCxWQUwyLCIiKQorCVRFU1RfUiggICAgImFkZHMJcjcsIHIiLDAsVkFMMSwiLCAjNSIpCisJVEVTVF9SKCAgICAiYWRkcwlyMCwgciIsNyxWQUwyLCIsICMyIikKKwlURVNUX1IoICAgICJzdWJzCXI3LCByIiwwLFZBTDEsIiwgIzUiKQorCVRFU1RfUiggICAgInN1YnMJcjAsIHIiLDcsVkFMMiwiLCAjMiIpCisJVEVTVCggICAgICAibW92cy5uCXIwLCAjMHg1ZiIpCisJVEVTVCggICAgICAibW92cy5uCXI3LCAjMHhhMCIpCisJVEVTVF9SKCAgICAiY21wLm4JciIsMCwweDVlLCAiLCAjMHg1ZiIpCisJVEVTVF9SKCAgICAiY21wLm4JciIsNSwweDE1ZiwiLCAjMHg1ZiIpCisJVEVTVF9SKCAgICAiY21wLm4JciIsNywweGEwLCAiLCAjMHhhMCIpCisJVEVTVF9SKCAgICAiYWRkcy5uCXIiLDAsVkFMMSwiLCAjMHg1ZiIpCisJVEVTVF9SKCAgICAiYWRkcy5uCXIiLDcsVkFMMiwiLCAjMHhhMCIpCisJVEVTVF9SKCAgICAic3Vicy5uCXIiLDAsVkFMMSwiLCAjMHg1ZiIpCisJVEVTVF9SKCAgICAic3Vicy5uCXIiLDcsVkFMMiwiLCAjMHhhMCIpCisKKwlURVNUX0dST1VQKCIxNi1iaXQgVGh1bWIgZGF0YS1wcm9jZXNzaW5nIGluc3RydWN0aW9ucyIpCisKKyNkZWZpbmUgREFUQV9QUk9DRVNTSU5HMTYob3AsdmFsKQkJCVwKKwlURVNUX1JSKCAgIG9wIglyIiwwLFZBTDEsIiwgciIsNyx2YWwsIiIpCVwKKwlURVNUX1JSKCAgIG9wIglyIiw3LFZBTDIsIiwgciIsMCx2YWwsIiIpCisKKwlEQVRBX1BST0NFU1NJTkcxNigiYW5kcyIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkcxNigiZW9ycyIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkcxNigibHNscyIsMTEpCisJREFUQV9QUk9DRVNTSU5HMTYoImxzcnMiLDExKQorCURBVEFfUFJPQ0VTU0lORzE2KCJhc3JzIiwxMSkKKwlEQVRBX1BST0NFU1NJTkcxNigiYWRjcyIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkcxNigic2JjcyIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkcxNigicm9ycyIsMTEpCisJREFUQV9QUk9DRVNTSU5HMTYoInRzdCIsMHhmMDBmMDBmZikKKwlURVNUX1IoInJzYnMJciIsMCxWQUwxLCIsICMwIikKKwlURVNUX1IoInJzYnMJciIsNyxWQUwyLCIsICMwIikKKwlEQVRBX1BST0NFU1NJTkcxNigiY21wIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lORzE2KCJjbW4iLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HMTYoIm9ycnMiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HMTYoIm11bHMiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HMTYoImJpY3MiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HMTYoIm12bnMiLFZBTDIpCisKKwlURVNUX0dST1VQKCJTcGVjaWFsIGRhdGEgaW5zdHJ1Y3Rpb25zIGFuZCBicmFuY2ggYW5kIGV4Y2hhbmdlIikKKworCVRFU1RfUlIoICAiYWRkCXIiLDAsIFZBTDEsIiwgciIsNyxWQUwyLCIiKQorCVRFU1RfUlIoICAiYWRkCXIiLDMsIFZBTDIsIiwgciIsOCxWQUwzLCIiKQorCVRFU1RfUlIoICAiYWRkCXIiLDgsIFZBTDMsIiwgciIsMCxWQUwxLCIiKQorCVRFU1RfUiggICAiYWRkCXNwIiAgICAgICAgIiwgciIsOCwtOCwgICIiKQorCVRFU1RfUiggICAiYWRkCXIiLDE0LFZBTDEsIiwgcGMiKQorCVRFU1RfQkZfUigiYWRkCXBjIiAgICAgICAgIiwgciIsMCwyZi0xZi04LCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweDQ0ZmYJQCBhZGQgcGMsIHBjIikKKworCVRFU1RfUlIoICAiY21wCXIiLDMsVkFMMSwiLCByIiw4LFZBTDIsIiIpCisJVEVTVF9SUiggICJjbXAJciIsOCxWQUwyLCIsIHIiLDAsVkFMMSwiIikKKwlURVNUX1IoICAgImNtcAlzcCIgICAgICAgIiwgciIsOCwtOCwgICIiKQorCisJVEVTVF9SKCAgICJtb3YJcjAsIHIiLDcsVkFMMiwiIikKKwlURVNUX1IoICAgIm1vdglyMywgciIsOCxWQUwzLCIiKQorCVRFU1RfUiggICAibW92CXI4LCByIiwwLFZBTDEsIiIpCisJVEVTVF9QKCAgICJtb3YJc3AsIHIiLDgsLTgsICAiIikKKwlURVNUKCAgICAgIm1vdglsciwgcGMiKQorCVRFU1RfQkZfUigibW92CXBjLCByIiwwLDJmLCAgIiIpCisKKwlURVNUX0JGX1IoImJ4CXIiLDAsIDJmKzEsIiIpCisJVEVTVF9CRl9SKCJieAlyIiwxNCwyZisxLCIiKQorCVRFU1RDQVNFX1NUQVJUKCJieAlwYyIpCisJCVRFU1RfQVJHX1JFRygxNCwgOTlmKzEpCisJCVRFU1RfQVJHX0VORCgiIikKKwkJIglub3AJCQlcblx0IiAvKiBUbyBhbGlnbiB0aGUgYnggcGMqLworCQkiNTA6CW5vcAkJCVxuXHQiCisJCSIxOglieAlwYwkJXG5cdCIKKwkJIglieAlscgkJXG5cdCIKKwkJIi5hcm0JCQkJXG5cdCIKKwkJIglhZHIJbHIsIDJmKzEJXG5cdCIKKwkJIglieAlscgkJXG5cdCIKKwkJIi50aHVtYgkJCQlcblx0IgorCQkiMjoJbm9wCQkJXG5cdCIKKwlURVNUQ0FTRV9FTkQKKworCVRFU1RfQkZfUigiYmx4CXIiLDAsIDJmKzEsIiIpCisJVEVTVF9CQl9SKCJibHgJciIsMTQsMmYrMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHg0N2Y4CUAgYmx4IHBjIikKKworCVRFU1RfR1JPVVAoIkxvYWQgZnJvbSBMaXRlcmFsIFBvb2wiKQorCisJVEVTVF9YKCAibGRyCXIwLCAzZiIsCisJCSIuYWxpZ24JCQkJCVxuXHQiCisJCSIzOgkud29yZAkiX19zdHJpbmdpZnkoVkFMMSkpCisJVEVTVF9YKCAibGRyCXI3LCAzZiIsCisJCSIuc3BhY2UgMTI4CQkJCVxuXHQiCisJCSIuYWxpZ24JCQkJCVxuXHQiCisJCSIzOgkud29yZAkiX19zdHJpbmdpZnkoVkFMMikpCisKKwlURVNUX0dST1VQKCIxNi1iaXQgVGh1bWIgTG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMiKQorCisJVEVTVF9SUFIoInN0cglyIiwwLCBWQUwxLCIsIFtyIiwxLCAyNCwiLCByIiwyLCAgNDgsIl0iKQorCVRFU1RfUlBSKCJzdHIJciIsNywgVkFMMiwiLCBbciIsNiwgMjQsIiwgciIsNSwgIDQ4LCJdIikKKwlURVNUX1JQUigic3RyaAlyIiwwLCBWQUwxLCIsIFtyIiwxLCAyNCwiLCByIiwyLCAgNDgsIl0iKQorCVRFU1RfUlBSKCJzdHJoCXIiLDcsIFZBTDIsIiwgW3IiLDYsIDI0LCIsIHIiLDUsICA0OCwiXSIpCisJVEVTVF9SUFIoInN0cmIJciIsMCwgVkFMMSwiLCBbciIsMSwgMjQsIiwgciIsMiwgIDQ4LCJdIikKKwlURVNUX1JQUigic3RyYglyIiw3LCBWQUwyLCIsIFtyIiw2LCAyNCwiLCByIiw1LCAgNDgsIl0iKQorCVRFU1RfUFIoICJsZHJzYglyMCwgW3IiLDEsIDI0LCIsIHIiLDIsICA0OCwiXSIpCisJVEVTVF9QUiggImxkcnNiCXI3LCBbciIsNiwgMjQsIiwgciIsNSwgIDUwLCJdIikKKwlURVNUX1BSKCAibGRyCXIwLCBbciIsMSwgMjQsIiwgciIsMiwgIDQ4LCJdIikKKwlURVNUX1BSKCAibGRyCXI3LCBbciIsNiwgMjQsIiwgciIsNSwgIDQ4LCJdIikKKwlURVNUX1BSKCAibGRyaAlyMCwgW3IiLDEsIDI0LCIsIHIiLDIsICA0OCwiXSIpCisJVEVTVF9QUiggImxkcmgJcjcsIFtyIiw2LCAyNCwiLCByIiw1LCAgNTAsIl0iKQorCVRFU1RfUFIoICJsZHJiCXIwLCBbciIsMSwgMjQsIiwgciIsMiwgIDQ4LCJdIikKKwlURVNUX1BSKCAibGRyYglyNywgW3IiLDYsIDI0LCIsIHIiLDUsICA1MCwiXSIpCisJVEVTVF9QUiggImxkcnNoCXIwLCBbciIsMSwgMjQsIiwgciIsMiwgIDQ4LCJdIikKKwlURVNUX1BSKCAibGRyc2gJcjcsIFtyIiw2LCAyNCwiLCByIiw1LCAgNTAsIl0iKQorCisJVEVTVF9SUCgic3RyCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDI0LCIsICMxMjBdIikKKwlURVNUX1JQKCJzdHIJciIsNywgVkFMMiwiLCBbciIsNiwgMjQsIiwgIzEyMF0iKQorCVRFU1RfUCggImxkcglyMCwgW3IiLDEsIDI0LCIsICMxMjBdIikKKwlURVNUX1AoICJsZHIJcjcsIFtyIiw2LCAyNCwiLCAjMTIwXSIpCisJVEVTVF9SUCgic3RyYglyIiwwLCBWQUwxLCIsIFtyIiwxLCAyNCwiLCAjMzBdIikKKwlURVNUX1JQKCJzdHJiCXIiLDcsIFZBTDIsIiwgW3IiLDYsIDI0LCIsICMzMF0iKQorCVRFU1RfUCggImxkcmIJcjAsIFtyIiwxLCAyNCwiLCAjMzBdIikKKwlURVNUX1AoICJsZHJiCXI3LCBbciIsNiwgMjQsIiwgIzMwXSIpCisJVEVTVF9SUCgic3RyaAlyIiwwLCBWQUwxLCIsIFtyIiwxLCAyNCwiLCAjNjBdIikKKwlURVNUX1JQKCJzdHJoCXIiLDcsIFZBTDIsIiwgW3IiLDYsIDI0LCIsICM2MF0iKQorCVRFU1RfUCggImxkcmgJcjAsIFtyIiwxLCAyNCwiLCAjNjBdIikKKwlURVNUX1AoICJsZHJoCXI3LCBbciIsNiwgMjQsIiwgIzYwXSIpCisKKwlURVNUX1IoICJzdHIJciIsMCwgVkFMMSwiLCBbc3AsICMwXSIpCisJVEVTVF9SKCAic3RyCXIiLDcsIFZBTDIsIiwgW3NwLCAjMTYwXSIpCisJVEVTVCggICAibGRyCXIwLCBbc3AsICMwXSIpCisJVEVTVCggICAibGRyCXI3LCBbc3AsICMxNjBdIikKKworCVRFU1RfUlAoInN0cglyIiwwLCBWQUwxLCIsIFtyIiwwLCAyNCwiXSIpCisJVEVTVF9QKCAibGRyCXIwLCBbciIsMCwgMjQsIl0iKQorCisJVEVTVF9HUk9VUCgiR2VuZXJhdGUgUEMtL1NQLXJlbGF0aXZlIGFkZHJlc3MiKQorCisJVEVTVCgiYWRkCXIwLCBwYywgIzQiKQorCVRFU1QoImFkZAlyNywgcGMsICMxMDIwIikKKwlURVNUKCJhZGQJcjAsIHNwLCAjNCIpCisJVEVTVCgiYWRkCXI3LCBzcCwgIzEwMjAiKQorCisJVEVTVF9HUk9VUCgiTWlzY2VsbGFuZW91cyAxNi1iaXQgaW5zdHJ1Y3Rpb25zIikKKworCVRFU1RfVU5TVVBQT1JURUQoICJjcHNpZQlpIikKKwlURVNUX1VOU1VQUE9SVEVEKCAiY3BzaWQJaSIpCisJVEVTVF9VTlNVUFBPUlRFRCggInNldGVuZAlsZSIpCisJVEVTVF9VTlNVUFBPUlRFRCggInNldGVuZAliZSIpCisKKwlURVNUKCJhZGQJc3AsICMiX19zdHJpbmdpZnkoVEVTVF9NRU1PUllfU0laRSkpIC8qIEFzc3VtZXMgVEVTVF9NRU1PUllfU0laRSA8IDB4NDAwICovCisJVEVTVCgic3ViCXNwLCAjMHg3Zio0IikKKworRE9OVF9URVNUX0lOX0lUQkxPQ0soCisJVEVTVF9CRl9SKCAgImNibnoJciIsMCwwLCAiLCAyZiIpCisJVEVTVF9CRl9SKCAgImNieglyIiwyLC0xLCIsIDJmIikKKwlURVNUX0JGX1JYKCAiY2JueglyIiw0LDEsICIsIDJmIiwweDIwKQorCVRFU1RfQkZfUlgoICJjYnoJciIsNywwLCAiLCAyZiIsMHg0MCkKKykKKwlURVNUX1IoInN4dGgJcjAsIHIiLDcsIEhIMSwiIikKKwlURVNUX1IoInN4dGgJcjcsIHIiLDAsIEhIMiwiIikKKwlURVNUX1IoInN4dGIJcjAsIHIiLDcsIEhIMSwiIikKKwlURVNUX1IoInN4dGIJcjcsIHIiLDAsIEhIMiwiIikKKwlURVNUX1IoInV4dGgJcjAsIHIiLDcsIEhIMSwiIikKKwlURVNUX1IoInV4dGgJcjcsIHIiLDAsIEhIMiwiIikKKwlURVNUX1IoInV4dGIJcjAsIHIiLDcsIEhIMSwiIikKKwlURVNUX1IoInV4dGIJcjcsIHIiLDAsIEhIMiwiIikKKwlURVNUX1IoInJldglyMCwgciIsNywgVkFMMSwiIikKKwlURVNUX1IoInJldglyNywgciIsMCwgVkFMMiwiIikKKwlURVNUX1IoInJldjE2CXIwLCByIiw3LCBWQUwxLCIiKQorCVRFU1RfUigicmV2MTYJcjcsIHIiLDAsIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4YmE4MCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4YmFiZiIpCisJVEVTVF9SKCJyZXZzaAlyMCwgciIsNywgVkFMMSwiIikKKwlURVNUX1IoInJldnNoCXI3LCByIiwwLCBWQUwyLCIiKQorCisjZGVmaW5lIFRFU1RfUE9QUEMoY29kZSwgb2Zmc2V0KQlcCisJVEVTVENBU0VfU1RBUlQoY29kZSkJCVwKKwlURVNUX0FSR19QVFIoMTMsIG9mZnNldCkJXAorCVRFU1RfQVJHX0VORCgiIikJCVwKKwlURVNUX0JSQU5DSF9GKGNvZGUsMCkJCVwKKwlURVNUQ0FTRV9FTkQKKworCVRFU1QoInB1c2gJe3IwfSIpCisJVEVTVCgicHVzaAl7cjd9IikKKwlURVNUKCJwdXNoCXtyMTR9IikKKwlURVNUKCJwdXNoCXtyMC1yNyxyMTR9IikKKwlURVNUKCJwdXNoCXtyMCxyMixyNCxyNixyMTR9IikKKwlURVNUKCJwdXNoCXtyMSxyMyxyNSxyN30iKQorCVRFU1QoInBvcAl7cjB9IikKKwlURVNUKCJwb3AJe3I3fSIpCisJVEVTVCgicG9wCXtyMCxyMixyNCxyNn0iKQorCVRFU1RfUE9QUEMoInBvcAl7cGN9IiwxNSo0KQorCVRFU1RfUE9QUEMoInBvcAl7cjAtcjcscGN9Iiw3KjQpCisJVEVTVF9QT1BQQygicG9wCXtyMSxyMyxyNSxyNyxwY30iLDExKjQpCisJVEVTVF9USFVNQl9UT19BUk1fSU5URVJXT1JLX1AoInBvcAl7cGN9CUAgIiwxMywxNSo0LCIiKQorCVRFU1RfVEhVTUJfVE9fQVJNX0lOVEVSV09SS19QKCJwb3AJe3IwLXI3LHBjfQlAICIsMTMsNyo0LCIiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiYmtwdC5uCTAiKQorCVRFU1RfVU5TVVBQT1JURUQoImJrcHQubgkyNTUiKQorCisJVEVTVF9TVVBQT1JURUQoInlpZWxkIikKKwlURVNUKCJzZXYiKQorCVRFU1QoIm5vcCIpCisJVEVTVCgid2ZpIikKKwlURVNUX1NVUFBPUlRFRCgid2ZlIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhiZjUwIikgLyogVW5hc3NpZ25lZCBoaW50cyAqLworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGJmZjAiKSAvKiBVbmFzc2lnbmVkIGhpbnRzICovCisKKyNkZWZpbmUgVEVTVF9JVChjb2RlLCBjb2RlMikJCQlcCisJVEVTVENBU0VfU1RBUlQoY29kZSkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCVwKKwkiNTA6CW5vcAkJCVxuXHQiCVwKKwkiMToJImNvZGUiCQkJXG5cdCIJXAorCSIJImNvZGUyIgkJCVxuXHQiCVwKKwkiMjoJbm9wCQkJXG5cdCIJXAorCVRFU1RDQVNFX0VORAorCitET05UX1RFU1RfSU5fSVRCTE9DSygKKwlURVNUX0lUKCJpdAllcSIsIm1vdmVxIHIwLCMwIikKKwlURVNUX0lUKCJpdAl2YyIsIm1vdnZjIHIwLCMwIikKKwlURVNUX0lUKCJpdAlsZSIsIm1vdmxlIHIwLCMwIikKKwlURVNUX0lUKCJpdGUJZXEiLCJtb3ZlcSByMCwjMFxuXHQgIG1vdm5lIHIxLCMxIikKKwlURVNUX0lUKCJpdGV0CXZjIiwibW92dmMgcjAsIzBcblx0ICBtb3Z2cyByMSwjMVxuXHQgIG1vdnZjIHIyLCMyIikKKwlURVNUX0lUKCJpdGV0ZQlsZSIsIm1vdmxlIHIwLCMwXG5cdCAgbW92Z3QgcjEsIzFcblx0ICBtb3ZsZSByMiwjMlxuXHQgIG1vdmd0IHIzLCMzIikKKwlURVNUX0lUKCJpdHR0dAlsZSIsIm1vdmxlIHIwLCMwXG5cdCAgbW92bGUgcjEsIzFcblx0ICBtb3ZsZSByMiwjMlxuXHQgIG1vdmxlIHIzLCMzIikKKwlURVNUX0lUKCJpdGVlZQlsZSIsIm1vdmxlIHIwLCMwXG5cdCAgbW92Z3QgcjEsIzFcblx0ICBtb3ZndCByMiwjMlxuXHQgIG1vdmd0IHIzLCMzIikKKykKKworCVRFU1RfR1JPVVAoIkxvYWQgYW5kIHN0b3JlIG11bHRpcGxlIikKKworCVRFU1RfUCgibGRtaWEJciIsNCwgMTYqNCwiISwge3IwLHI3fSIpCisJVEVTVF9QKCJsZG1pYQlyIiw3LCAxNio0LCIhLCB7cjAtcjZ9IikKKwlURVNUX1AoInN0bWlhCXIiLDQsIDE2KjQsIiEsIHtyMCxyN30iKQorCVRFU1RfUCgic3RtaWEJciIsMCwgMTYqNCwiISwge3IwLXI3fSIpCisKKwlURVNUX0dST1VQKCJDb25kaXRpb25hbCBicmFuY2ggYW5kIFN1cGVydmlzb3IgQ2FsbCBpbnN0cnVjdGlvbnMiKQorCitDT05ESVRJT05fSU5TVFJVQ1RJT05TKDgsCisJVEVTVF9CRigiYmVxCTJmIikKKwlURVNUX0JCKCJibmUJMmIiKQorCVRFU1RfQkYoImJndAkyZiIpCisJVEVTVF9CQigiYmx0CTJiIikKKykKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhkZTAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhkZWZmIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzdmMJIzB4MDAiKQorCVRFU1RfVU5TVVBQT1JURUQoInN2YwkjMHhmZiIpCisKKwlURVNUX0dST1VQKCJVbmNvbmRpdGlvbmFsIGJyYW5jaCIpCisKKwlURVNUX0JGKCAgImIJMmYiKQorCVRFU1RfQkIoICAiYgkyYiIpCisJVEVTVF9CRl9YKCJiCTJmIiwgMHg0MDApCisJVEVTVF9CQl9YKCJiCTJiIiwgMHg0MDApCisKKwlURVNUX0dST1VQKCJUZXN0aW5nIGluc3RydWN0aW9ucyBpbiBJVCBibG9ja3MiKQorCisJVEVTVF9JVEJMT0NLKCJzdWJzLm4gcjAsIHIwIikKKworCXZlcmJvc2UoIlxuIik7Cit9CisKKwordm9pZCBrcHJvYmVfdGh1bWIzMl90ZXN0X2Nhc2VzKHZvaWQpCit7CisJa3Byb2JlX3Rlc3RfZmxhZ3MgPSAwOworCisJVEVTVF9HUk9VUCgiTG9hZC9zdG9yZSBtdWx0aXBsZSIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJyZmVkYglzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgicmZlaWEJc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoInJmZWRiCXNwISIpCisJVEVTVF9VTlNVUFBPUlRFRCgicmZlaWEJc3AhIikKKworCVRFU1RfUCggICAic3RtaWEJciIsMCwgMTYqNCwiLCB7cjAscjh9IikKKwlURVNUX1AoICAgInN0bWlhCXIiLDQsIDE2KjQsIiwge3IwLXIxMixyMTR9IikKKwlURVNUX1AoICAgInN0bWlhCXIiLDcsIDE2KjQsIiEsIHtyOC1yMTIscjE0fSIpCisJVEVTVF9QKCAgICJzdG1pYQlyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCisJVEVTVF9QKCAgICJsZG1pYQlyIiwwLCAxNio0LCIsIHtyMCxyOH0iKQorCVRFU1RfUCggICAibGRtaWEJciIsNCwgMCwgICAiLCB7cjAtcjEyLHIxNH0iKQorCVRFU1RfQkZfUCgibGRtaWEJciIsNSwgOCo0LCAiISwge3I2LXIxMixyMTV9IikKKwlURVNUX1AoICAgImxkbWlhCXIiLDEyLDE2KjQsIiEsIHtyMSxyMyxyNSxyNyxyOC1yMTEscjE0fSIpCisJVEVTVF9CRl9QKCJsZG1pYQlyIiwxNCwxNCo0LCIhLCB7cjQscGN9IikKKworCVRFU1RfUCggICAic3RtZGIJciIsMCwgMTYqNCwiLCB7cjAscjh9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDQsIDE2KjQsIiwge3IwLXIxMixyMTR9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDUsIDE2KjQsIiEsIHtyOC1yMTIscjE0fSIpCisJVEVTVF9QKCAgICJzdG1kYglyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCisJVEVTVF9QKCAgICJsZG1kYglyIiwwLCAxNio0LCIsIHtyMCxyOH0iKQorCVRFU1RfUCggICAibGRtZGIJciIsNCwgMTYqNCwiLCB7cjAtcjEyLHIxNH0iKQorCVRFU1RfQkZfUCgibGRtZGIJciIsNSwgMTYqNCwiISwge3I2LXIxMixyMTV9IikKKwlURVNUX1AoICAgImxkbWRiCXIiLDEyLDE2KjQsIiEsIHtyMSxyMyxyNSxyNyxyOC1yMTEscjE0fSIpCisJVEVTVF9CRl9QKCJsZG1kYglyIiwxNCwxNio0LCIhLCB7cjQscGN9IikKKworCVRFU1RfUCggICAic3RtZGIJciIsMTMsMTYqNCwiISwge3IzLXIxMixscn0iKQorCVRFU1RfUCgJICAic3RtZGIJciIsMTMsMTYqNCwiISwge3IzLXIxMn0iKQorCVRFU1RfUCggICAic3RtZGIJciIsMiwgMTYqNCwiLCB7cjMtcjEyLGxyfSIpCisJVEVTVF9QKCAgICJzdG1kYglyIiwxMywxNio0LCIhLCB7cjItcjEyLGxyfSIpCisJVEVTVF9QKCAgICJzdG1kYglyIiwwLCAxNio0LCIsIHtyMC1yMTJ9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDAsIDE2KjQsIiwge3IwLXIxMixscn0iKQorCisJVEVTVF9CRl9QKCJsZG1pYQlyIiwxMyw1KjQsICIhLCB7cjMtcjEyLHBjfSIpCisJVEVTVF9QKAkgICJsZG1pYQlyIiwxMyw1KjQsICIhLCB7cjMtcjEyfSIpCisJVEVTVF9CRl9QKCJsZG1pYQlyIiwyLCA1KjQsICIhLCB7cjMtcjEyLHBjfSIpCisJVEVTVF9CRl9QKCJsZG1pYQlyIiwxMyw0KjQsICIhLCB7cjItcjEyLHBjfSIpCisJVEVTVF9QKCAgICJsZG1pYQlyIiwwLCAxNio0LCIsIHtyMC1yMTJ9IikKKwlURVNUX1AoICAgImxkbWlhCXIiLDAsIDE2KjQsIiwge3IwLXIxMixscn0iKQorCisJVEVTVF9USFVNQl9UT19BUk1fSU5URVJXT1JLX1AoImxkbWlhCXIiLDAsMTQqNCwiLCB7cjEyLHBjfSIpCisJVEVTVF9USFVNQl9UT19BUk1fSU5URVJXT1JLX1AoImxkbWlhCXIiLDEzLDIqNCwiLCB7cjAtcjEyLHBjfSIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlODhmLDB4MDEwMQlAIHN0bWlhCXBjLCB7cjAscjh9IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOTJmLDB4NWYwMAlAIHN0bWRiCXBjISwge3I4LXIxMixyMTR9IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOGJkLDB4YzAwMAlAIGxkbWlhCXIxMyEsIHtyMTQscGN9IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOTNlLDB4YzAwMAlAIGxkbWRiCXIxNCEsIHtyMTQscGN9IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOGE3LDB4M2YwMAlAIHN0bWlhCXI3ISwge3I4LXIxMixzcH0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU4YTcsMHg5ZjAwCUAgc3RtaWEJcjchLCB7cjgtcjEyLHBjfSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZTkzZSwweDIwMTAJQCBsZG1kYglyMTQhLCB7cjQsc3B9IikKKworCVRFU1RfR1JPVVAoIkxvYWQvc3RvcmUgZG91YmxlIG9yIGV4Y2x1c2l2ZSwgdGFibGUgYnJhbmNoIikKKworCVRFU1RfUCggICJsZHJkCXIwLCByMSwgW3IiLDEsIDI0LCIsICMtMTZdIikKKwlURVNUKCAgICAibGRyZAlyMTIsIHIxNCwgW3NwLCAjMTZdIikKKwlURVNUX1AoICAibGRyZAlyMSwgcjAsIFtyIiw3LCAyNCwiLCAjLTE2XSEiKQorCVRFU1QoICAgICJsZHJkCXIxNCwgcjEyLCBbc3AsICMxNl0hIikKKwlURVNUX1AoICAibGRyZAlyMSwgcjAsIFtyIiw3LCAyNCwiXSwgIzE2IikKKwlURVNUKCAgICAibGRyZAlyNywgcjgsIFtzcF0sICMtMTYiKQorCisJVEVTVF9YKCAibGRyZAlyMTIsIHIxNCwgM2YiLAorCQkiLmFsaWduIDMJCQkJXG5cdCIKKwkJIjM6CS53b3JkCSJfX3N0cmluZ2lmeShWQUwxKSIJXG5cdCIKKwkJIgkud29yZAkiX19zdHJpbmdpZnkoVkFMMikpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOWZmLDB4ZWMwNAlAIGxkcmQJcjE0LCByMTIsIFtwYywgIzE2XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU4ZmYsMHhlYzA0CUAgbGRyZAlyMTQsIHIxMiwgW3BjXSwgIzE2IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOWQ0LDB4ZDgwMAlAIGxkcmQJc3AsIHI4LCBbcjRdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOWQ0LDB4ZjgwMAlAIGxkcmQJcGMsIHI4LCBbcjRdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOWQ0LDB4N2QwMAlAIGxkcmQJcjcsIHNwLCBbcjRdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOWQ0LDB4N2YwMAlAIGxkcmQJcjcsIHBjLCBbcjRdIikKKworCVRFU1RfUlJQKCJzdHJkCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCBbciIsMSwgMjQsIiwgIy0xNl0iKQorCVRFU1RfUlIoICJzdHJkCXIiLDEyLFZBTDIsIiwgciIsMTQsVkFMMSwiLCBbc3AsICMxNl0iKQorCVRFU1RfUlJQKCJzdHJkCXIiLDEsIFZBTDEsIiwgciIsMCwgVkFMMiwiLCBbciIsNywgMjQsIiwgIy0xNl0hIikKKwlURVNUX1JSKCAic3RyZAlyIiwxNCxWQUwyLCIsIHIiLDEyLFZBTDEsIiwgW3NwLCAjMTZdISIpCisJVEVTVF9SUlAoInN0cmQJciIsMSwgVkFMMSwiLCByIiwwLCBWQUwyLCIsIFtyIiw3LCAyNCwiXSwgIzE2IikKKwlURVNUX1JSKCAic3RyZAlyIiw3LCBWQUwyLCIsIHIiLDgsIFZBTDEsIiwgW3NwXSwgIy0xNiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZTllZiwweGVjMDQJQCBzdHJkCXIxNCwgcjEyLCBbcGMsICMxNl0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOGVmLDB4ZWMwNAlAIHN0cmQJcjE0LCByMTIsIFtwY10sICMxNiIpCisKKwlURVNUX1JYKCJ0YmIJW3BjLCByIiwwLCAoOWYtKDFmKzQpKSwiXSIsCisJCSI5OgkJCVxuXHQiCisJCSIuYnl0ZQkoMmYtMWItNCk+PjEJXG5cdCIKKwkJIi5ieXRlCSgzZi0xYi00KT4+MQlcblx0IgorCQkiMzoJbXZuCXIwLCByMAlcblx0IgorCQkiMjoJbm9wCQlcblx0IikKKworCVRFU1RfUlgoInRiYglbcGMsIHIiLDQsICg5Zi0oMWYrNCkrMSksIl0iLAorCQkiOToJCQlcblx0IgorCQkiLmJ5dGUJKDJmLTFiLTQpPj4xCVxuXHQiCisJCSIuYnl0ZQkoM2YtMWItNCk+PjEJXG5cdCIKKwkJIjM6CW12bglyMCwgcjAJXG5cdCIKKwkJIjI6CW5vcAkJXG5cdCIpCisKKwlURVNUX1JSWCgidGJiCVtyIiwxLDlmLCIsIHIiLDIsMCwiXSIsCisJCSI5OgkJCVxuXHQiCisJCSIuYnl0ZQkoMmYtMWItNCk+PjEJXG5cdCIKKwkJIi5ieXRlCSgzZi0xYi00KT4+MQlcblx0IgorCQkiMzoJbXZuCXIwLCByMAlcblx0IgorCQkiMjoJbm9wCQlcblx0IikKKworCVRFU1RfUlgoInRiaAlbcGMsIHIiLDcsICg5Zi0oMWYrNCkpPj4xLCJdIiwKKwkJIjk6CQkJXG5cdCIKKwkJIi5zaG9ydAkoMmYtMWItNCk+PjEJXG5cdCIKKwkJIi5zaG9ydAkoM2YtMWItNCk+PjEJXG5cdCIKKwkJIjM6CW12bglyMCwgcjAJXG5cdCIKKwkJIjI6CW5vcAkJXG5cdCIpCisKKwlURVNUX1JYKCJ0YmgJW3BjLCByIiwxMiwgKCg5Zi0oMWYrNCkpPj4xKSsxLCJdIiwKKwkJIjk6CQkJXG5cdCIKKwkJIi5zaG9ydAkoMmYtMWItNCk+PjEJXG5cdCIKKwkJIi5zaG9ydAkoM2YtMWItNCk+PjEJXG5cdCIKKwkJIjM6CW12bglyMCwgcjAJXG5cdCIKKwkJIjI6CW5vcAkJXG5cdCIpCisKKwlURVNUX1JSWCgidGJoCVtyIiwxLDlmLCAiLCByIiwxNCwxLCJdIiwKKwkJIjk6CQkJXG5cdCIKKwkJIi5zaG9ydAkoMmYtMWItNCk+PjEJXG5cdCIKKwkJIi5zaG9ydAkoM2YtMWItNCk+PjEJXG5cdCIKKwkJIjM6CW12bglyMCwgcjAJXG5cdCIKKwkJIjI6CW5vcAkJXG5cdCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOGQxLDB4ZjAxZglAIHRiaCBbcjEsIHBjXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZThkMSwweGYwMWQJQCB0YmggW3IxLCBzcF0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU4ZGQsMHhmMDEyCUAgdGJoIFtzcCwgcjJdIikKKworCVRFU1RfVU5TVVBQT1JURUQoInN0cmV4YglyMCwgcjEsIFtyMl0iKQorCVRFU1RfVU5TVVBQT1JURUQoInN0cmV4aAlyMCwgcjEsIFtyMl0iKQorCVRFU1RfVU5TVVBQT1JURUQoInN0cmV4ZAlyMCwgcjEsIFtyMl0iKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcmV4YglyMCwgW3IxXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgibGRyZXhoCXIwLCBbcjFdIikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJleGQJcjAsIFtyMV0iKQorCisJVEVTVF9HUk9VUCgiRGF0YS1wcm9jZXNzaW5nIChzaGlmdGVkIHJlZ2lzdGVyKSBhbmQgKG1vZGlmaWVkIGltbWVkaWF0ZSkiKQorCisjZGVmaW5lIF9EQVRBX1BST0NFU1NJTkczMl9ETk0ob3Ascyx2YWwpCQkJCQlcCisJVEVTVF9SUihvcCBzIi53CXIwLCAgciIsMSwgVkFMMSwiLCByIiwyLCB2YWwsICIiKQkJCVwKKwlURVNUX1JSKG9wIHMiCXIxLCAgciIsMSwgVkFMMSwiLCByIiwyLCB2YWwsICIsIGxzbCAjMyIpCQlcCisJVEVTVF9SUihvcCBzIglyMiwgIHIiLDMsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBsc3IgIzQiKQkJXAorCVRFU1RfUlIob3AgcyIJcjMsICByIiwzLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgYXNyICM1IikJCVwKKwlURVNUX1JSKG9wIHMiCXI0LCAgciIsNSwgVkFMMSwiLCByIiwyLCBOKHZhbCksIiwgYXNyICM2IikJCVwKKwlURVNUX1JSKG9wIHMiCXI1LCAgciIsNSwgVkFMMSwiLCByIiwyLCB2YWwsICIsIHJvciAjNyIpCQlcCisJVEVTVF9SUihvcCBzIglyOCwgIHIiLDksIFZBTDEsIiwgciIsMTAsdmFsLCAiLCBycngiKQkJCVwKKwlURVNUX1IoIG9wIHMiCXIwLCAgciIsMTEsVkFMMSwiLCAjMHgwMDAxMDAwMSIpCQkJXAorCVRFU1RfUiggb3AgcyIJcjExLCByIiwwLCBWQUwxLCIsICMweGY1MDAwMDAwIikJCQlcCisJVEVTVF9SKCBvcCBzIglyNywgIHIiLDgsIFZBTDIsIiwgIzB4MDAwYWYwMDAiKQorCisjZGVmaW5lIERBVEFfUFJPQ0VTU0lORzMyX0ROTShvcCx2YWwpCQlcCisJX0RBVEFfUFJPQ0VTU0lORzMyX0ROTShvcCwiIix2YWwpCVwKKwlfREFUQV9QUk9DRVNTSU5HMzJfRE5NKG9wLCJzIix2YWwpCisKKyNkZWZpbmUgREFUQV9QUk9DRVNTSU5HMzJfTk0ob3AsdmFsKQkJCQkJXAorCVRFU1RfUlIob3AiLncJciIsMSwgVkFMMSwiLCByIiwyLCB2YWwsICIiKQkJCVwKKwlURVNUX1JSKG9wIglyIiwxLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgbHNsICMzIikJCVwKKwlURVNUX1JSKG9wIglyIiwzLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgbHNyICM0IikJCVwKKwlURVNUX1JSKG9wIglyIiwzLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgYXNyICM1IikJCVwKKwlURVNUX1JSKG9wIglyIiw1LCBWQUwxLCIsIHIiLDIsIE4odmFsKSwiLCBhc3IgIzYiKQkJXAorCVRFU1RfUlIob3AiCXIiLDUsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCByb3IgIzciKQkJXAorCVRFU1RfUlIob3AiCXIiLDksIFZBTDEsIiwgciIsMTAsdmFsLCAiLCBycngiKQkJXAorCVRFU1RfUiggb3AiCXIiLDExLFZBTDEsIiwgIzB4MDAwMTAwMDEiKQkJCVwKKwlURVNUX1IoIG9wIglyIiwwLCBWQUwxLCIsICMweGY1MDAwMDAwIikJCQlcCisJVEVTVF9SKCBvcCIJciIsOCwgVkFMMiwiLCAjMHgwMDBhZjAwMCIpCisKKyNkZWZpbmUgX0RBVEFfUFJPQ0VTU0lORzMyX0RNKG9wLHMsdmFsKQkJCQlcCisJVEVTVF9SKCBvcCBzIi53CXIwLCAgciIsMTQsIHZhbCwgIiIpCQkJXAorCVRFU1RfUiggb3AgcyIJcjEsICByIiwxMiwgdmFsLCAiLCBsc2wgIzMiKQkJXAorCVRFU1RfUiggb3AgcyIJcjIsICByIiwxMSwgdmFsLCAiLCBsc3IgIzQiKQkJXAorCVRFU1RfUiggb3AgcyIJcjMsICByIiwxMCwgdmFsLCAiLCBhc3IgIzUiKQkJXAorCVRFU1RfUiggb3AgcyIJcjQsICByIiw5LCBOKHZhbCksIiwgYXNyICM2IikJCVwKKwlURVNUX1IoIG9wIHMiCXI1LCAgciIsOCwgdmFsLCAiLCByb3IgIzciKQkJXAorCVRFU1RfUiggb3AgcyIJcjgsICByIiw3LHZhbCwgIiwgcnJ4IikJCQlcCisJVEVTVCggICBvcCBzIglyMCwgICMweDAwMDEwMDAxIikJCQlcCisJVEVTVCggICBvcCBzIglyMTEsICMweGY1MDAwMDAwIikJCQlcCisJVEVTVCggICBvcCBzIglyNywgICMweDAwMGFmMDAwIikJCQlcCisJVEVTVCggICBvcCBzIglyNCwgICMweDAwMDA1YTAwIikKKworI2RlZmluZSBEQVRBX1BST0NFU1NJTkczMl9ETShvcCx2YWwpCQlcCisJX0RBVEFfUFJPQ0VTU0lORzMyX0RNKG9wLCIiLHZhbCkJXAorCV9EQVRBX1BST0NFU1NJTkczMl9ETShvcCwicyIsdmFsKQorCisJREFUQV9QUk9DRVNTSU5HMzJfRE5NKCJhbmQiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HMzJfTk0oInRzdCIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkczMl9ETk0oImJpYyIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkczMl9ETk0oIm9yciIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkczMl9ETSgibW92IixWQUwyKQorCURBVEFfUFJPQ0VTU0lORzMyX0ROTSgib3JuIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lORzMyX0RNKCJtdm4iLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HMzJfRE5NKCJlb3IiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HMzJfTk0oInRlcSIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkczMl9ETk0oImFkZCIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkczMl9OTSgiY21uIixWQUwyKQorCURBVEFfUFJPQ0VTU0lORzMyX0ROTSgiYWRjIixWQUwyKQorCURBVEFfUFJPQ0VTU0lORzMyX0ROTSgic2JjIixWQUwyKQorCURBVEFfUFJPQ0VTU0lORzMyX0ROTSgic3ViIixWQUwyKQorCURBVEFfUFJPQ0VTU0lORzMyX05NKCJjbXAiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HMzJfRE5NKCJyc2IiLFZBTDIpCisKKwlURVNUX1JSKCJwa2hidAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUigicGtoYnQJcjE0LHIiLDEyLCBISDEsIiwgciIsMTAsSEgyLCIsIGxzbCAjMiIpCisJVEVTVF9SUigicGtodGIJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoInBraHRiCXIxNCxyIiwxMiwgSEgxLCIsIHIiLDEwLEhIMiwiLCBhc3IgIzIiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWExNywweDBmMGQJQCB0c3QudyByNywgc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhMTcsMHgwZjBmCUAgdHN0LncgcjcsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYTFkLDB4MGYwNwlAIHRzdC53IHNwLCByNyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWExZiwweDBmMDcJQCB0c3QudyBwYywgcjciKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwMWQsMHgxZjA4CUAgdHN0IHNwLCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjAxZiwweDFmMDgJQCB0c3QgcGMsICMweDAwMDgwMDA4IikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhOTcsMHgwZjBkCUAgdGVxLncgcjcsIHNwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYTk3LDB4MGYwZglAIHRlcS53IHI3LCBwYyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWE5ZCwweDBmMDcJQCB0ZXEudyBzcCwgcjciKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhOWYsMHgwZjA3CUAgdGVxLncgcGMsIHI3IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMDlkLDB4MWYwOAlAIHRzdCBzcCwgIzB4MDAwODAwMDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwOWYsMHgxZjA4CUAgdHN0IHBjLCAjMHgwMDA4MDAwOCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjE3LDB4MGYwZAlAIGNtbi53IHI3LCBzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIxNywweDBmMGYJQCBjbW4udyByNywgcGMiKQorCVRFU1RfUCgiY21uLncJc3AsIHIiLDcsMCwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjFmLDB4MGYwNwlAIGNtbi53IHBjLCByNyIpCisJVEVTVCggICJjbW4Jc3AsICMweDAwMDgwMDA4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMTFmLDB4MWYwOAlAIGNtbiBwYywgIzB4MDAwODAwMDgiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWJiNywweDBmMGQJQCBjbXAudyByNywgc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGViYjcsMHgwZjBmCUAgY21wLncgcjcsIHBjIikKKwlURVNUX1AoImNtcC53CXNwLCByIiw3LDAsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWJiZiwweDBmMDcJQCBjbXAudyBwYywgcjciKQorCVRFU1QoICAiY21wCXNwLCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjFiZiwweDFmMDgJQCBjbXAgcGMsICMweDAwMDgwMDA4IikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhNWYsMHgwNzBkCUAgbW92cy53IHI3LCBzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWE1ZiwweDA3MGYJQCBtb3ZzLncgcjcsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYTVmLDB4MGQwNwlAIG1vdnMudyBzcCwgcjciKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhNGYsMHgwZjA3CUAgbW92LncgIHBjLCByNyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjA0ZiwweDFkMDgJQCBtb3Ygc3AsICMweDAwMDgwMDA4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMDRmLDB4MWYwOAlAIG1vdiBwYywgIzB4MDAwODAwMDgiKQorCisJVEVTVF9SKCJhZGQudwlyMCwgc3AsIHIiLDEsIDQsIiIpCisJVEVTVF9SKCJhZGRzCXIwLCBzcCwgciIsMSwgNCwiLCBhc2wgIzMiKQorCVRFU1RfUigiYWRkCXIwLCBzcCwgciIsMSwgNCwiLCBhc2wgIzQiKQorCVRFU1RfUigiYWRkCXIwLCBzcCwgciIsMSwgMTYsIiwgcm9yICMxIikKKwlURVNUX1IoImFkZC53CXNwLCBzcCwgciIsMSwgNCwiIikKKwlURVNUX1IoImFkZAlzcCwgc3AsIHIiLDEsIDQsIiwgYXNsICMzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjBkLDB4MWQwMQlAIGFkZCBzcCwgc3AsIHIxLCBhc2wgIzQiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGViMGQsMHgwZDcxCUAgYWRkIHNwLCBzcCwgcjEsIHJvciAjMSIpCisJVEVTVCggICJhZGQudwlyMCwgc3AsICMyNCIpCisJVEVTVCggICJhZGQudwlzcCwgc3AsICMyNCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwZCwweDBmMDEJQCBhZGQgcGMsIHNwLCByMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwZCwweDAwMGYJQCBhZGQgcjAsIHNwLCBwYyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwZCwweDAwMGQJQCBhZGQgcjAsIHNwLCBzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwZCwweDBkMGYJQCBhZGQgc3AsIHNwLCBwYyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwZCwweDBkMGQJQCBhZGQgc3AsIHNwLCBzcCIpCisKKwlURVNUX1IoInN1Yi53CXIwLCBzcCwgciIsMSwgNCwiIikKKwlURVNUX1IoInN1YnMJcjAsIHNwLCByIiwxLCA0LCIsIGFzbCAjMyIpCisJVEVTVF9SKCJzdWIJcjAsIHNwLCByIiwxLCA0LCIsIGFzbCAjNCIpCisJVEVTVF9SKCJzdWIJcjAsIHNwLCByIiwxLCAxNiwiLCByb3IgIzEiKQorCVRFU1RfUigic3ViLncJc3AsIHNwLCByIiwxLCA0LCIiKQorCVRFU1RfUigic3ViCXNwLCBzcCwgciIsMSwgNCwiLCBhc2wgIzMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGViYWQsMHgxZDAxCUAgc3ViIHNwLCBzcCwgcjEsIGFzbCAjNCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWJhZCwweDBkNzEJQCBzdWIgc3AsIHNwLCByMSwgcm9yICMxIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYmFkLDB4MGYwMQlAIHN1YiBwYywgc3AsIHIxIikKKwlURVNUKCAgInN1Yi53CXIwLCBzcCwgIzI0IikKKwlURVNUKCAgInN1Yi53CXNwLCBzcCwgIzI0IikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhMDIsMHgwMTBmCUAgYW5kIHIxLCByMiwgcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhMGYsMHgwMTAzCUAgYW5kIHIxLCBwYywgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhMDIsMHgwZjAzCUAgYW5kIHBjLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhMDIsMHgwMTBkCUAgYW5kIHIxLCByMiwgc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhMGQsMHgwMTAzCUAgYW5kIHIxLCBzcCwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhMDIsMHgwZDAzCUAgYW5kIHNwLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwMGQsMHgxMTA4CUAgYW5kIHIxLCBzcCwgIzB4MDAwODAwMDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwMGYsMHgxMTA4CUAgYW5kIHIxLCBwYywgIzB4MDAwODAwMDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwMDIsMHgxZDA4CUAgYW5kIHNwLCByOCwgIzB4MDAwODAwMDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwMDIsMHgxZjA4CUAgYW5kIHBjLCByOCwgIzB4MDAwODAwMDgiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwMiwweDAxMGYJQCBhZGQgcjEsIHIyLCBwYyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwZiwweDAxMDMJQCBhZGQgcjEsIHBjLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwMiwweDBmMDMJQCBhZGQgcGMsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwMiwweDAxMGQJQCBhZGQgcjEsIHIyLCBzcCIpCisJVEVTVF9TVVBQT1JURUQoICAiLnNob3J0IDB4ZWIwZCwweDAxMDMJQCBhZGQgcjEsIHNwLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwMiwweDBkMDMJQCBhZGQgc3AsIHIyLCByMyIpCisJVEVTVF9TVVBQT1JURUQoICAiLnNob3J0IDB4ZjEwZCwweDExMDgJQCBhZGQgcjEsIHNwLCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjEwZCwweDFmMDgJQCBhZGQgcGMsIHNwLCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjEwZiwweDExMDgJQCBhZGQgcjEsIHBjLCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjEwMiwweDFkMDgJQCBhZGQgc3AsIHI4LCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjEwMiwweDFmMDgJQCBhZGQgcGMsIHI4LCAjMHgwMDA4MDAwOCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYWEwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWFmMCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGViMjAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjgwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWJlMCwweDAwMDAiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjBhMCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwYzAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMGYwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjEyMCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYxODAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMWUwLDB4MDAwMCIpCisKKwlURVNUX0dST1VQKCJDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWMwMCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVmZjAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYzAwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmZmMCwweDAwMDAiKQorCisJVEVTVF9HUk9VUCgiRGF0YS1wcm9jZXNzaW5nIChwbGFpbiBiaW5hcnkgaW1tZWRpYXRlKSIpCisKKwlURVNUX1IoImFkZHcJcjAsICByIiwxLCBWQUwxLCIsICMweDEyMyIpCisJVEVTVCggICJhZGR3CXIxNCwgc3AsICMweGY1YSIpCisJVEVTVCggICJhZGR3CXNwLCBzcCwgIzB4MjAiKQorCVRFU1QoICAiYWRkdwlyNywgIHBjLCAjMHg4ODgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYyMGYsMHgxZjIwCUAgYWRkdyBwYywgcGMsICMweDEyMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjIwZCwweDFmMjAJQCBhZGR3IHBjLCBzcCwgIzB4MTIwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMjBmLDB4MWQyMAlAIGFkZHcgc3AsIHBjLCAjMHgxMjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYyMDAsMHgxZDIwCUAgYWRkdyBzcCwgcjAsICMweDEyMCIpCisKKwlURVNUX1IoInN1YncJcjAsICByIiwxLCBWQUwxLCIsICMweDEyMyIpCisJVEVTVCggICJzdWJ3CXIxNCwgc3AsICMweGY1YSIpCisJVEVTVCggICJzdWJ3CXNwLCBzcCwgIzB4MjAiKQorCVRFU1QoICAic3VidwlyNywgIHBjLCAjMHg4ODgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYyYWYsMHgxZjIwCUAgc3VidyBwYywgcGMsICMweDEyMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjJhZCwweDFmMjAJQCBzdWJ3IHBjLCBzcCwgIzB4MTIwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMmFmLDB4MWQyMAlAIHN1Yncgc3AsIHBjLCAjMHgxMjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYyYTAsMHgxZDIwCUAgc3VidyBzcCwgcjAsICMweDEyMCIpCisKKwlURVNUKCJtb3Z3CXIwLCAjMCIpCisJVEVTVCgibW92dwlyMCwgIzB4ZmZmZiIpCisJVEVTVCgibW92dwlsciwgIzB4ZmZmZiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjI0MCwweDBkMDAJQCBtb3Z3IHNwLCAjMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjI0MCwweDBmMDAJQCBtb3Z3IHBjLCAjMCIpCisKKwlURVNUX1IoIm1vdnQJciIsMCwgVkFMMSwiLCAjMCIpCisJVEVTVF9SKCJtb3Z0CXIiLDAsIFZBTDIsIiwgIzB4ZmZmZiIpCisJVEVTVF9SKCJtb3Z0CXIiLDE0LFZBTDEsIiwgIzB4ZmZmZiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjJjMCwweDBkMDAJQCBtb3Z0IHNwLCAjMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjJjMCwweDBmMDAJQCBtb3Z0IHBjLCAjMCIpCisKKwlURVNUX1IoICAgICAic3NhdAlyMCwgIzI0LCByIiwwLCAgIFZBTDEsIiIpCisJVEVTVF9SKCAgICAgInNzYXQJcjE0LCAjMjQsIHIiLDEyLCBWQUwyLCIiKQorCVRFU1RfUiggICAgICJzc2F0CXIwLCAjMjQsIHIiLDAsICAgVkFMMSwiLCBsc2wgIzgiKQorCVRFU1RfUiggICAgICJzc2F0CXIxNCwgIzI0LCByIiwxMiwgVkFMMiwiLCBhc3IgIzgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzMGMsMHgwZDE3CUAgc3NhdAlzcCwgIzI0LCByMTIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzMGMsMHgwZjE3CUAgc3NhdAlwYywgIzI0LCByMTIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzMGQsMHgwYzE3CUAgc3NhdAlyMTIsICMyNCwgc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzMGYsMHgwYzE3CUAgc3NhdAlyMTIsICMyNCwgcGMiKQorCisJVEVTVF9SKCAgICAgInVzYXQJcjAsICMyNCwgciIsMCwgICBWQUwxLCIiKQorCVRFU1RfUiggICAgICJ1c2F0CXIxNCwgIzI0LCByIiwxMiwgVkFMMiwiIikKKwlURVNUX1IoICAgICAidXNhdAlyMCwgIzI0LCByIiwwLCAgIFZBTDEsIiwgbHNsICM4IikKKwlURVNUX1IoICAgICAidXNhdAlyMTQsICMyNCwgciIsMTIsIFZBTDIsIiwgYXNyICM4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzhjLDB4MGQxNwlAIHVzYXQJc3AsICMyNCwgcjEyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzhjLDB4MGYxNwlAIHVzYXQJcGMsICMyNCwgcjEyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzhkLDB4MGMxNwlAIHVzYXQJcjEyLCAjMjQsIHNwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzhmLDB4MGMxNwlAIHVzYXQJcjEyLCAjMjQsIHBjIikKKworCVRFU1RfUiggICAgICJzc2F0MTYJcjAsICMxMiwgciIsMCwgICBISDEsIiIpCisJVEVTVF9SKCAgICAgInNzYXQxNglyMTQsICMxMiwgciIsMTIsIEhIMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzJjLDB4MGQwYglAIHNzYXQxNglzcCwgIzEyLCByMTIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzMmMsMHgwZjBiCUAgc3NhdDE2CXBjLCAjMTIsIHIxMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjMyZCwweDBjMGIJQCBzc2F0MTYJcjEyLCAjMTIsIHNwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzJmLDB4MGMwYglAIHNzYXQxNglyMTIsICMxMiwgcGMiKQorCisJVEVTVF9SKCAgICAgInVzYXQxNglyMCwgIzEyLCByIiwwLCAgIEhIMSwiIikKKwlURVNUX1IoICAgICAidXNhdDE2CXIxNCwgIzEyLCByIiwxMiwgSEgyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzYWMsMHgwZDBiCUAgdXNhdDE2CXNwLCAjMTIsIHIxMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjNhYywweDBmMGIJQCB1c2F0MTYJcGMsICMxMiwgcjEyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmM2FkLDB4MGMwYglAIHVzYXQxNglyMTIsICMxMiwgc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzYWYsMHgwYzBiCUAgdXNhdDE2CXIxMiwgIzEyLCBwYyIpCisKKwlURVNUX1IoICAgICAic2JmeAlyMCwgciIsMCAgLCBWQUwxLCIsICMwLCAjMzEiKQorCVRFU1RfUiggICAgICJzYmZ4CXIxNCwgciIsMTIsIFZBTDIsIiwgIzgsICMxNiIpCisJVEVTVF9SKCAgICAgInNiZngJcjQsIHIiLDEwLCAgVkFMMSwiLCAjMTYsICMxNSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjM0YywweDJkMGYJQCBzYmZ4CXNwLCByMTIsICM4LCAjMTYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzNGMsMHgyZjBmCUAgc2JmeAlwYywgcjEyLCAjOCwgIzE2IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzRkLDB4MmMwZglAIHNiZngJcjEyLCBzcCwgIzgsICMxNiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjM0ZiwweDJjMGYJQCBzYmZ4CXIxMiwgcGMsICM4LCAjMTYiKQorCisJVEVTVF9SKCAgICAgInViZngJcjAsIHIiLDAgICwgVkFMMSwiLCAjMCwgIzMxIikKKwlURVNUX1IoICAgICAidWJmeAlyMTQsIHIiLDEyLCBWQUwyLCIsICM4LCAjMTYiKQorCVRFU1RfUiggICAgICJ1YmZ4CXI0LCByIiwxMCwgIFZBTDEsIiwgIzE2LCAjMTUiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzY2MsMHgyZDBmCUAgdWJmeAlzcCwgcjEyLCAjOCwgIzE2IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmM2NjLDB4MmYwZglAIHViZngJcGMsIHIxMiwgIzgsICMxNiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjNjZCwweDJjMGYJQCB1YmZ4CXIxMiwgc3AsICM4LCAjMTYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzY2YsMHgyYzBmCUAgdWJmeAlyMTIsIHBjLCAjOCwgIzE2IikKKworCVRFU1RfUiggICAgICJiZmMJciIsMCwgVkFMMSwiLCAjNCwgIzIwIikKKwlURVNUX1IoICAgICAiYmZjCXIiLDE0LFZBTDIsIiwgIzQsICMyMCIpCisJVEVTVF9SKCAgICAgImJmYwlyIiw3LCBWQUwxLCIsICMwLCAjMzEiKQorCVRFU1RfUiggICAgICJiZmMJciIsOCwgVkFMMiwiLCAjMCwgIzMxIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzZmLDB4MGQxZQlAIGJmYwlzcCwgIzAsICMzMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjM2ZiwweDBmMWUJQCBiZmMJcGMsICMwLCAjMzEiKQorCisJVEVTVF9SUiggICAgImJmaQlyIiwwLCBWQUwxLCIsIHIiLDAgICwgVkFMMiwiLCAjMCwgIzMxIikKKwlURVNUX1JSKCAgICAiYmZpCXIiLDEyLFZBTDEsIiwgciIsMTQgLCBWQUwyLCIsICM0LCAjMjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzNmUsMHgxZDE3CUAgYmZpCXNwLCByMTQsICM0LCAjMjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzNmUsMHgxZjE3CUAgYmZpCXBjLCByMTQsICM0LCAjMjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzNmQsMHgxZTE3CUAgYmZpCXIxNCwgc3AsICM0LCAjMjAiKQorCisJVEVTVF9HUk9VUCgiQnJhbmNoZXMgYW5kIG1pc2NlbGxhbmVvdXMgY29udHJvbCIpCisKK0NPTkRJVElPTl9JTlNUUlVDVElPTlMoMjIsCisJVEVTVF9CRigiYmVxLncJMmYiKQorCVRFU1RfQkIoImJuZS53CTJiIikKKwlURVNUX0JGKCJiZ3QudwkyZiIpCisJVEVTVF9CQigiYmx0LncJMmIiKQorCVRFU1RfQkZfWCgiYnBsLncJMmYiLDB4MTAwMCkKKykKKworCVRFU1RfVU5TVVBQT1JURUQoIm1zcgljcHNyLCByMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgibXNyCWNwc3JfZiwgcjEiKQorCVRFU1RfVU5TVVBQT1JURUQoIm1zcglzcHNyLCByMiIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJjcHNpZS53CWkiKQorCVRFU1RfVU5TVVBQT1JURUQoImNwc2lkLncJaSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiY3BzCTB4MTMiKQorCisJVEVTVF9TVVBQT1JURUQoInlpZWxkLnciKQorCVRFU1QoInNldi53IikKKwlURVNUKCJub3AudyIpCisJVEVTVCgid2ZpLnciKQorCVRFU1RfU1VQUE9SVEVEKCJ3ZmUudyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiZGJnLncJIzAiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiY2xyZXgiKQorCVRFU1RfVU5TVVBQT1JURUQoImRzYiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiZG1iIikKKwlURVNUX1VOU1VQUE9SVEVEKCJpc2IiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiYnhqCXIwIikKKworCVRFU1RfVU5TVVBQT1JURUQoInN1YnMJcGMsIGxyLCAjNCIpCisKKwlURVNUKCJtcnMJcjAsIGNwc3IiKQorCVRFU1QoIm1ycwlyMTQsIGNwc3IiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzZWYsMHg4ZDAwCUAgbXJzCXNwLCBzcHNyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmM2VmLDB4OGYwMAlAIG1ycwlwYywgc3BzciIpCisJVEVTVF9VTlNVUFBPUlRFRCgibXJzCXIwLCBzcHNyIikKKwlURVNUX1VOU1VQUE9SVEVEKCJtcnMJbHIsIHNwc3IiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjdmMCwweDgwMDAgQCBzbWMgIzAiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjdmMCwweGEwMDAgQCB1bmRlZmVpbmVkIikKKworCVRFU1RfQkYoICAiYi53CTJmIikKKwlURVNUX0JCKCAgImIudwkyYiIpCisJVEVTVF9CRl9YKCJiLncJMmYiLCAweDEwMDApCisKKwlURVNUX0JGKCAgImJsLncJMmYiKQorCVRFU1RfQkIoICAiYmwudwkyYiIpCisJVEVTVF9CQl9YKCJibC53CTJiIiwgMHgxMDAwKQorCisJVEVTVF9YKAkiYmx4CV9fZHVtbXlfYXJtX3N1YnJvdXRpbmUiLAorCQkiLmFybQkJCQlcblx0IgorCQkiLmFsaWduCQkJCVxuXHQiCisJCSIudHlwZSBfX2R1bW15X2FybV9zdWJyb3V0aW5lLCAlJWZ1bmN0aW9uIFxuXHQiCisJCSJfX2R1bW15X2FybV9zdWJyb3V0aW5lOglcblx0IgorCQkibW92CXIwLCBwYwkJCVxuXHQiCisJCSJieAlscgkJCVxuXHQiCisJCSIudGh1bWIJCQkJXG5cdCIKKwkpCisJVEVTVCgJImJseAlfX2R1bW15X2FybV9zdWJyb3V0aW5lIikKKworCVRFU1RfR1JPVVAoIlN0b3JlIHNpbmdsZSBkYXRhIGl0ZW0iKQorCisjZGVmaW5lIFNJTkdMRV9TVE9SRShzaXplKQkJCQkJCQlcCisJVEVTVF9SUCggInN0ciJzaXplIglyIiwwLCBWQUwxLCIsIFtyIiwxMSwtMTAyNCwiLCAjMTAyNF0iKQkJXAorCVRFU1RfUlAoICJzdHIic2l6ZSIJciIsMTQsVkFMMiwiLCBbciIsMSwgLTEwMjQsIiwgIzEwODBdIikJCVwKKwlURVNUX1JQKCAic3RyInNpemUiCXIiLDAsIFZBTDEsIiwgW3IiLDExLDI1NiwgICIsICMtMTIwXSIpCQlcCisJVEVTVF9SUCggInN0ciJzaXplIglyIiwxNCxWQUwyLCIsIFtyIiwxLCAyNTYsICAiLCAjLTEyOF0iKQkJXAorCVRFU1RfUlAoICJzdHIic2l6ZSIJciIsMCwgVkFMMSwiLCBbciIsMTEsMjQsICAiXSwgIzEyMCIpCQlcCisJVEVTVF9SUCggInN0ciJzaXplIglyIiwxNCxWQUwyLCIsIFtyIiwxLCAyNCwgICJdLCAjMTI4IikJCVwKKwlURVNUX1JQKCAic3RyInNpemUiCXIiLDAsIFZBTDEsIiwgW3IiLDExLDI0LCAgIl0sICMtMTIwIikJCVwKKwlURVNUX1JQKCAic3RyInNpemUiCXIiLDE0LFZBTDIsIiwgW3IiLDEsIDI0LCAgIl0sICMtMTI4IikJCVwKKwlURVNUX1JQKCAic3RyInNpemUiCXIiLDAsIFZBTDEsIiwgW3IiLDExLDI0LCAgICIsICMxMjBdISIpCQlcCisJVEVTVF9SUCggInN0ciJzaXplIglyIiwxNCxWQUwyLCIsIFtyIiwxLCAyNCwgICAiLCAjMTI4XSEiKQkJXAorCVRFU1RfUlAoICJzdHIic2l6ZSIJciIsMCwgVkFMMSwiLCBbciIsMTEsMjU2LCAgIiwgIy0xMjBdISIpCQlcCisJVEVTVF9SUCggInN0ciJzaXplIglyIiwxNCxWQUwyLCIsIFtyIiwxLCAyNTYsICAiLCAjLTEyOF0hIikJCVwKKwlURVNUX1JQUigic3RyInNpemUiLncJciIsMCwgVkFMMSwiLCBbciIsMSwgMCwiLCByIiwyLCA0LCJdIikJCVwKKwlURVNUX1JQUigic3RyInNpemUiCXIiLDE0LFZBTDIsIiwgW3IiLDEwLDAsIiwgciIsMTEsNCwiLCBsc2wgIzFdIikJXAorCVRFU1RfUiggICJzdHIic2l6ZSIudwlyIiw3LCBWQUwxLCIsIFtzcCwgIzI0XSIpCQkJXAorCVRFU1RfUlAoICJzdHIic2l6ZSIudwlyIiwwLCBWQUwyLCIsIFtyIiwwLDAsICJdIikJCQlcCisJVEVTVF9VTlNVUFBPUlRFRCgic3RyInNpemUidAlyMCwgW3IxLCAjNF0iKQorCisJU0lOR0xFX1NUT1JFKCJiIikKKwlTSU5HTEVfU1RPUkUoImgiKQorCVNJTkdMRV9TVE9SRSgiIikKKworCVRFU1QoInN0cglzcCwgW3NwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjhjZiwweGUwMDAJQCBzdHIJcjE0LCBbcGNdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmOGNlLDB4ZjAwMAlAIHN0cglwYywgW3IxNF0iKQorCisJVEVTVF9HUk9VUCgiQWR2YW5jZWQgU0lNRCBlbGVtZW50IG9yIHN0cnVjdHVyZSBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmOTAwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjkyZiwweGZmZmYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY5ODAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmOWVmLDB4ZmZmZiIpCisKKwlURVNUX0dST1VQKCJMb2FkIHNpbmdsZSBkYXRhIGl0ZW0gYW5kIG1lbW9yeSBoaW50cyIpCisKKyNkZWZpbmUgU0lOR0xFX0xPQUQoc2l6ZSkJCQkJCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIwLCBbciIsMTEsLTEwMjQsICIsICMxMDI0XSIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIxNCwgW3IiLDEsIC0xMDI0LCIsICMxMDgwXSIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIwLCBbciIsMTEsMjU2LCAgICIsICMtMTIwXSIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIxNCwgW3IiLDEsIDI1NiwgICIsICMtMTI4XSIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIwLCBbciIsMTEsMjQsICAgIl0sICMxMjAiKQkJXAorCVRFU1RfUCggImxkciJzaXplIglyMTQsIFtyIiwxLCAyNCwgICJdLCAjMTI4IikJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIJcjAsIFtyIiwxMSwyNCwgICAiXSwgIy0xMjAiKQkJXAorCVRFU1RfUCggImxkciJzaXplIglyMTQsIFtyIiwxLDI0LCAgICJdLCAjLTEyOCIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIwLCBbciIsMTEsMjQsICAgICIsICMxMjBdISIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIxNCwgW3IiLDEsIDI0LCAgICIsICMxMjhdISIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIwLCBbciIsMTEsMjU2LCAgICIsICMtMTIwXSEiKQkJXAorCVRFU1RfUCggImxkciJzaXplIglyMTQsIFtyIiwxLCAyNTYsICAiLCAjLTEyOF0hIikJCVwKKwlURVNUX1BSKCJsZHIic2l6ZSIudwlyMCwgW3IiLDEsIDAsIiwgciIsMiwgNCwiXSIpCQlcCisJVEVTVF9QUigibGRyInNpemUiCXIxNCwgW3IiLDEwLDAsIiwgciIsMTEsNCwiLCBsc2wgIzFdIikJXAorCVRFU1RfWCggImxkciJzaXplIi53CXIwLCAzZiIsCQkJCVwKKwkJIi5hbGlnbiAzCQkJCVxuXHQiCQlcCisJCSIzOgkud29yZAkiX19zdHJpbmdpZnkoVkFMMSkpCQkJXAorCVRFU1RfWCggImxkciJzaXplIi53CXIxNCwgM2YiLAkJCQlcCisJCSIuYWxpZ24gMwkJCQlcblx0IgkJXAorCQkiMzoJLndvcmQJIl9fc3RyaW5naWZ5KFZBTDIpKQkJCVwKKwlURVNUKCAgICJsZHIic2l6ZSIudwlyNywgM2IiKQkJCQlcCisJVEVTVCggICAibGRyInNpemUiLncJcjcsIFtzcCwgIzI0XSIpCQkJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIudwlyMCwgW3IiLDAsMCwgIl0iKQkJCVwKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHIic2l6ZSJ0CXIwLCBbcjEsICM0XSIpCisKKwlTSU5HTEVfTE9BRCgiYiIpCisJU0lOR0xFX0xPQUQoInNiIikKKwlTSU5HTEVfTE9BRCgiaCIpCisJU0lOR0xFX0xPQUQoInNoIikKKwlTSU5HTEVfTE9BRCgiIikKKworCVRFU1RfQkZfUCgibGRyCXBjLCBbciIsMTQsIDE1KjQsIl0iKQorCVRFU1RfUCggICAibGRyCXNwLCBbciIsMTQsIDEzKjQsIl0iKQorCVRFU1RfQkZfUigibGRyCXBjLCBbc3AsIHIiLDE0LCAxNSo0LCJdIikKKwlURVNUX1IoICAgImxkcglzcCwgW3NwLCByIiwxNCwgMTMqNCwiXSIpCisJVEVTVF9USFVNQl9UT19BUk1fSU5URVJXT1JLX1AoImxkcglwYywgW3IiLDAsMCwiLCAjMTUqNF0iKQorCVRFU1RfU1VQUE9SVEVEKCJsZHIJc3AsIDk5ZiIpCisJVEVTVF9TVVBQT1JURUQoImxkcglwYywgOTlmIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY4NTQsMHg3MDBkCUAgbGRyCXI3LCBbcjQsIHNwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4Zjg1NCwweDcwMGYJQCBsZHIJcjcsIFtyNCwgcGNdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmODE0LDB4NzAwZAlAIGxkcmIJcjcsIFtyNCwgc3BdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmODE0LDB4NzAwZglAIGxkcmIJcjcsIFtyNCwgcGNdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmODlmLDB4ZDAwNAlAIGxkcmIJc3AsIDk5ZiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjgxNCwweGQwMDgJQCBsZHJiCXNwLCBbcjQsIHI4XSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4Zjg5NCwweGQwMDAJQCBsZHJiCXNwLCBbcjRdIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY4NjAsMHgwMDAwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmOWZmLDB4ZmZmZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4Zjk1MCwweDAwMDAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY5NWYsMHhmZmZmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmODAwLDB4MDgwMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4Zjk3ZiwweGZhZmYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCisJVEVTVCggICAicGxpCVtwYywgIzRdIikKKwlURVNUKCAgICJwbGkJW3BjLCAjLTRdIikKKwlURVNUKCAgICJwbGQJW3BjLCAjNF0iKQorCVRFU1QoICAgInBsZAlbcGMsICMtNF0iKQorCisJVEVTVF9QKCAicGxkCVtyIiwwLC0xMDI0LCIsICMxMDI0XSIpCisJVEVTVCggICAiLnNob3J0IDB4ZjhiMCwweGY0MDAJQCBwbGR3CVtyMCwgIzEwMjRdIikKKwlURVNUX1AoICJwbGkJW3IiLDQsIDBiLCIsICMxMDI0XSIpCisJVEVTVF9QKCAicGxkCVtyIiw3LCAxMjAsIiwgIy0xMjBdIikKKwlURVNUKCAgICIuc2hvcnQgMHhmODM3LDB4ZmM3OAlAIHBsZHcJW3I3LCAjLTEyMF0iKQorCVRFU1RfUCggInBsaQlbciIsMTEsMTIwLCIsICMtMTIwXSIpCisJVEVTVCggICAicGxkCVtzcCwgIzBdIikKKworCVRFU1RfUFIoInBsZAlbciIsNywgMjQsICIsIHIiLDAsIDE2LCJdIikKKwlURVNUX1BSKCJwbGQJW3IiLDgsIDI0LCAiLCByIiwxMiwxNiwiLCBsc2wgIzNdIikKKwlURVNUX1NVUFBPUlRFRCgiLnNob3J0IDB4ZjgzNywweGYwMDAJQCBwbGR3CVtyNywgcjBdIikKKwlURVNUX1NVUFBPUlRFRCgiLnNob3J0IDB4ZjgzOCwweGYwM2MJQCBwbGR3CVtyOCwgcjEyLCBsc2wgIzNdIik7CisJVEVTVF9SUigicGxpCVtyIiwxMiwwYiwiLCByIiwwLCAxNiwiXSIpCisJVEVTVF9SUigicGxpCVtyIiwwLCAwYiwiLCByIiwxMiwxNiwiLCBsc2wgIzNdIikKKwlURVNUX1IoICJwbGQJW3NwLCByIiwxLCAxNiwiXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjgxNywweGYwMGQgIEBwbGQJW3I3LCBzcF0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY4MTcsMHhmMDBmICBAcGxkCVtyNywgcGNdIikKKworCVRFU1RfR1JPVVAoIkRhdGEtcHJvY2Vzc2luZyAocmVnaXN0ZXIpIikKKworI2RlZmluZSBTSElGVFMzMihvcCkJCQkJCVwKKwlURVNUX1JSKG9wIglyMCwgIHIiLDEsIFZBTDEsIiwgciIsMiwgMywgIiIpCVwKKwlURVNUX1JSKG9wIglyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTEsMTAsIiIpCisKKwlTSElGVFMzMigibHNsIikKKwlTSElGVFMzMigibHNscyIpCisJU0hJRlRTMzIoImxzciIpCisJU0hJRlRTMzIoImxzcnMiKQorCVNISUZUUzMyKCJhc3IiKQorCVNISUZUUzMyKCJhc3JzIikKKwlTSElGVFMzMigicm9yIikKKwlTSElGVFMzMigicm9ycyIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTAxLDB4ZmYwMglAIGxzbAlwYywgcjEsIHIyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTAxLDB4ZmQwMglAIGxzbAlzcCwgcjEsIHIyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTBmLDB4ZjAwMglAIGxzbAlyMCwgcGMsIHIyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTBkLDB4ZjAwMglAIGxzbAlyMCwgc3AsIHIyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTAxLDB4ZjAwZglAIGxzbAlyMCwgcjEsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTAxLDB4ZjAwZAlAIGxzbAlyMCwgcjEsIHNwIikKKworCVRFU1RfUlIoICAgICJzeHRhaAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInN4dGFoCXIxNCxyIiwxMiwgSEgyLCIsIHIiLDEwLEhIMSwiLCByb3IgIzgiKQorCVRFU1RfUiggICAgICJzeHRoCXI4LCByIiw3LCAgSEgxLCIiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmEwZiwweGZmODcJQCBzeHRoCXBjLCByNyIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhMGYsMHhmZDg3CUAgc3h0aAlzcCwgcjciKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTBmLDB4Zjg4ZglAIHN4dGgJcjgsIHBjIik7CisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmEwZiwweGY4OGQJQCBzeHRoCXI4LCBzcCIpOworCisJVEVTVF9SUiggICAgInV4dGFoCXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXh0YWgJcjE0LHIiLDEyLCBISDIsIiwgciIsMTAsSEgxLCIsIHJvciAjOCIpCisJVEVTVF9SKCAgICAgInV4dGgJcjgsIHIiLDcsICBISDEsIiIpCisKKwlURVNUX1JSKCAgICAic3h0YWIxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInN4dGFiMTYJcjE0LHIiLDEyLCBISDIsIiwgciIsMTAsSEgxLCIsIHJvciAjOCIpCisJVEVTVF9SKCAgICAgInN4dGIxNglyOCwgciIsNywgIEhIMSwiIikKKworCVRFU1RfUlIoICAgICJ1eHRhYjE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXh0YWIxNglyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAidXh0YjE2CXI4LCByIiw3LCAgSEgxLCIiKQorCisJVEVTVF9SUiggICAgInN4dGFiCXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic3h0YWIJcjE0LHIiLDEyLCBISDIsIiwgciIsMTAsSEgxLCIsIHJvciAjOCIpCisJVEVTVF9SKCAgICAgInN4dGIJcjgsIHIiLDcsICBISDEsIiIpCisKKwlURVNUX1JSKCAgICAidXh0YWIJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1eHRhYglyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAidXh0YglyOCwgciIsNywgIEhIMSwiIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhNjAsMHgwMGYwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTdmLDB4ZmZmZiIpCisKKyNkZWZpbmUgUEFSQUxMRUxfQUREX1NVQihvcCkJCQkJCVwKKwlURVNUX1JSKCAgb3AiYWRkMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQlcCisJVEVTVF9SUiggIG9wImFkZDE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikJXAorCVRFU1RfUlIoICBvcCJhc3gJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQlcCisJVEVTVF9SUiggIG9wImFzeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCVwKKwlURVNUX1JSKCAgb3Aic2F4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikJXAorCVRFU1RfUlIoICBvcCJzYXgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQlcCisJVEVTVF9SUiggIG9wInN1YjE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikJXAorCVRFU1RfUlIoICBvcCJzdWIxNglyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCVwKKwlURVNUX1JSKCAgb3AiYWRkOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCVwKKwlURVNUX1JSKCAgb3AiYWRkOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCVwKKwlURVNUX1JSKCAgb3Aic3ViOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCVwKKwlURVNUX1JSKCAgb3Aic3ViOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisKKwlURVNUX0dST1VQKCJQYXJhbGxlbCBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24sIHNpZ25lZCIpCisKKwlQQVJBTExFTF9BRERfU1VCKCJzIikKKwlQQVJBTExFTF9BRERfU1VCKCJxIikKKwlQQVJBTExFTF9BRERfU1VCKCJzaCIpCisKKwlURVNUX0dST1VQKCJQYXJhbGxlbCBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24sIHVuc2lnbmVkIikKKworCVBBUkFMTEVMX0FERF9TVUIoInUiKQorCVBBUkFMTEVMX0FERF9TVUIoInVxIikKKwlQQVJBTExFTF9BRERfU1VCKCJ1aCIpCisKKwlURVNUX0dST1VQKCJNaXNjZWxsYW5lb3VzIG9wZXJhdGlvbnMiKQorCisJVEVTVF9SUigicWFkZAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoInFhZGQJbHIsIHIiLDksIFZBTDIsIiwgciIsOCwgVkFMMSwiIikKKwlURVNUX1JSKCJxc3ViCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUigicXN1YglsciwgciIsOSwgVkFMMiwiLCByIiw4LCBWQUwxLCIiKQorCVRFU1RfUlIoInFkYWRkCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUigicWRhZGQJbHIsIHIiLDksIFZBTDIsIiwgciIsOCwgVkFMMSwiIikKKwlURVNUX1JSKCJxZHN1YglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoInFkc3ViCWxyLCByIiw5LCBWQUwyLCIsIHIiLDgsIFZBTDEsIiIpCisKKwlURVNUX1IoInJldi53CXIwLCByIiwwLCAgIFZBTDEsIiIpCisJVEVTVF9SKCJyZXYJcjE0LCByIiwxMiwgVkFMMiwiIikKKwlURVNUX1IoInJldjE2LncJcjAsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoInJldjE2CXIxNCwgciIsMTIsIFZBTDIsIiIpCisJVEVTVF9SKCJyYml0CXIwLCByIiwwLCAgIFZBTDEsIiIpCisJVEVTVF9SKCJyYml0CXIxNCwgciIsMTIsIFZBTDIsIiIpCisJVEVTVF9SKCJyZXZzaC53CXIwLCByIiwwLCAgIFZBTDEsIiIpCisJVEVTVF9SKCJyZXZzaAlyMTQsIHIiLDEyLCBWQUwyLCIiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmE5YywweGZmOGMJQCByZXYJcGMsIHIxMiIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhOWMsMHhmZDhjCUAgcmV2CXNwLCByMTIiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTlmLDB4ZmU4ZglAIHJldglyMTQsIHBjIik7CisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmE5ZCwweGZlOGQJQCByZXYJcjE0LCBzcCIpOworCisJVEVTVF9SUigic2VsCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIiKQorCVRFU1RfUlIoInNlbAlyMTQsIHIiLDEyLFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisKKwlURVNUX1IoImNseglyMCwgciIsMCwgMHgwLCIiKQorCVRFU1RfUigiY2x6CXI3LCByIiwxNCwweDEsIiIpCisJVEVTVF9SKCJjbHoJbHIsIHIiLDcsIDB4ZmZmZmZmZmYsIiIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTgwLDB4ZjAzMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmFmZiwweGZmN2YiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhYjAsMHhmMDAwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYWZmLDB4ZmY3ZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisKKwlURVNUX0dST1VQKCJNdWx0aXBseSwgbXVsdGlwbHkgYWNjdW11bGF0ZSwgYW5kIGFic29sdXRlIGRpZmZlcmVuY2Ugb3BlcmF0aW9ucyIpCisKKwlURVNUX1JSKCAgICAibXVsCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgIm11bAlyNywgciIsOCwgVkFMMiwiLCByIiw5LCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDgsMHhmZjA5CUAgbXVsCXBjLCByOCwgcjkiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDgsMHhmZDA5CUAgbXVsCXNwLCByOCwgcjkiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMGYsMHhmNzA5CUAgbXVsCXI3LCBwYywgcjkiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMGQsMHhmNzA5CUAgbXVsCXI3LCBzcCwgcjkiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDgsMHhmNzBmCUAgbXVsCXI3LCByOCwgcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDgsMHhmNzBkCUAgbXVsCXI3LCByOCwgc3AiKQorCisJVEVTVF9SUlIoICAgIm1sYQlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICJtbGEJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjA4LDB4YWYwOQlAIG1sYQlwYywgcjgsIHI5LCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjA4LDB4YWQwOQlAIG1sYQlzcCwgcjgsIHI5LCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjBmLDB4YTcwOQlAIG1sYQlyNywgcGMsIHI5LCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjBkLDB4YTcwOQlAIG1sYQlyNywgc3AsIHI5LCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjA4LDB4YTcwZglAIG1sYQlyNywgcjgsIHBjLCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjA4LDB4YTcwZAlAIG1sYQlyNywgcjgsIHNwLCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjA4LDB4ZDcwOQlAIG1sYQlyNywgcjgsIHI5LCBzcCIpOworCisJVEVTVF9SUlIoICAgIm1scwlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICJtbHMJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKworCVRFU1RfUlJSKCAgICJzbWxhYmIJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICAic21sYWJiCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUlIoICAgInNtbGF0YglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhdGIJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSUiggICAic21sYWJ0CXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgInNtbGFidAlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhdHQJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICAic21sYXR0CXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWxiYglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsYmIJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiIikKKwlURVNUX1JSKCAgICAic211bHRiCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWx0YglyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIiKQorCVRFU1RfUlIoICAgICJzbXVsYnQJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211bGJ0CXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiIpCisJVEVTVF9SUiggICAgInNtdWx0dAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsdHQJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiIikKKworCVRFU1RfUlJSKCAgICJzbWxhZAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21sYWQJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9SUlIoICAgInNtbGFkeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21sYWR4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVhZAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNtdWFkCXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1JSKCAgICAic211YWR4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic211YWR4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKworCVRFU1RfUlJSKCAgICJzbWxhd2IJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICAic21sYXdiCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUlIoICAgInNtbGF3dAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhd3QJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211bHdiCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWx3YglyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIiKQorCVRFU1RfUlIoICAgICJzbXVsd3QJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211bHd0CXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiIpCisKKwlURVNUX1JSUiggICAic21sc2QJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAgInNtbHNkCXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfUlJSKCAgICJzbWxzZHgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAgInNtbHNkeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiwgciIsOCwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211c2QJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzbXVzZAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9SUiggICAgInNtdXNkeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNtdXNkeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisKKwlURVNUX1JSUiggICAic21tbGEJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21tbGEJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiwgciIsOCwgVkFMMiwiIikKKwlURVNUX1JSUiggICAic21tbGFyCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAgInNtbWxhcglyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbW11bAlyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic21tdWwJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiIpCisJVEVTVF9SUiggICAgInNtbXVscglyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic21tdWxyCXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMCxWQUwxLCIiKQorCisJVEVTVF9SUlIoICAgInNtbWxzCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAgInNtbWxzCXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMCxWQUwxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9SUlIoICAgInNtbWxzcglyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgICJzbW1sc3IJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiwgciIsOCwgVkFMMiwiIikKKworCVRFU1RfUlJSKCAgICJ1c2FkYTgJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiIikKKwlURVNUX1JSUiggICAidXNhZGE4CXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMCxWQUwxLCIsIHIiLDgsIFZBTDMsIiIpCisJVEVTVF9SUiggICAgInVzYWQ4CXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJ1c2FkOAlyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDAsMHhmMDEwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjBmLDB4ZmYxZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmI3MCwweGYwMTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiN2YsMHhmZjFmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjcwLDB4MDAxMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmI3ZiwweGZmMWYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCisJVEVTVF9HUk9VUCgiTG9uZyBtdWx0aXBseSwgbG9uZyBtdWx0aXBseSBhY2N1bXVsYXRlLCBhbmQgZGl2aWRlIikKKworCVRFU1RfUlIoICAgInNtdWxsCXIwLCByMSwgciIsMiwgVkFMMSwiLCByIiwzLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgInNtdWxsCXI3LCByOCwgciIsOSwgVkFMMiwiLCByIiwxMCwgVkFMMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjg5LDB4ZjgwYQlAIHNtdWxsCXBjLCByOCwgcjksIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiODksMHhkODBhCUAgc211bGwJc3AsIHI4LCByOSwgcjEwIik7CisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmI4OSwweDdmMGEJQCBzbXVsbAlyNywgcGMsIHI5LCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjg5LDB4N2QwYQlAIHNtdWxsCXI3LCBzcCwgcjksIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiOGYsMHg3ODBhCUAgc211bGwJcjcsIHI4LCBwYywgcjEwIik7CisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmI4ZCwweDc4MGEJQCBzbXVsbAlyNywgcjgsIHNwLCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjg5LDB4NzgwZglAIHNtdWxsCXI3LCByOCwgcjksIHBjIik7CisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmI4OSwweDc4MGQJQCBzbXVsbAlyNywgcjgsIHI5LCBzcCIpOworCisJVEVTVF9SUiggICAidW11bGwJcjAsIHIxLCByIiwyLCBWQUwxLCIsIHIiLDMsIFZBTDIsIiIpCisJVEVTVF9SUiggICAidW11bGwJcjcsIHI4LCByIiw5LCBWQUwyLCIsIHIiLDEwLCBWQUwxLCIiKQorCisJVEVTVF9SUlJSKCAic21sYWwJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgciIsMywgVkFMNCkKKwlURVNUX1JSUlIoICJzbWxhbAlyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCisJVEVTVF9SUlJSKCAic21sYWxiYglyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggInNtbGFsYmIJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKwlURVNUX1JSUlIoICJzbWxhbGJ0CXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAic21sYWxidAlyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCVRFU1RfUlJSUiggInNtbGFsdGIJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgciIsMywgVkFMNCkKKwlURVNUX1JSUlIoICJzbWxhbHRiCXIiLDgsIFZBTDQsIiwgciIsOSwgVkFMMSwiLCByIiwxMCxWQUwyLCIsIHIiLDExLFZBTDMpCisJVEVTVF9SUlJSKCAic21sYWx0dAlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggInNtbGFsdHQJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKworCVRFU1RfUlJSUiggInNtbGFsZAlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsICIsIHIiLDAsIEhIMSwiLCByIiwxLCBISDIpCisJVEVTVF9SUlJSKCAic21sYWxkCXIiLDExLFZBTDIsIiwgciIsMTAsVkFMMSwgIiwgciIsOSwgSEgyLCIsIHIiLDgsIEhIMSkKKwlURVNUX1JSUlIoICJzbWxhbGR4CXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwgIiwgciIsMCwgSEgxLCIsIHIiLDEsIEhIMikKKwlURVNUX1JSUlIoICJzbWxhbGR4CXIiLDExLFZBTDIsIiwgciIsMTAsVkFMMSwgIiwgciIsOSwgSEgyLCIsIHIiLDgsIEhIMSkKKworCVRFU1RfUlJSUiggInNtbHNsZAlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsICIsIHIiLDAsIEhIMSwiLCByIiwxLCBISDIpCisJVEVTVF9SUlJSKCAic21sc2xkCXIiLDExLFZBTDIsIiwgciIsMTAsVkFMMSwgIiwgciIsOSwgSEgyLCIsIHIiLDgsIEhIMSkKKwlURVNUX1JSUlIoICJzbWxzbGR4CXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwgIiwgciIsMCwgSEgxLCIsIHIiLDEsIEhIMikKKwlURVNUX1JSUlIoICJzbWxzbGR4CXIiLDExLFZBTDIsIiwgciIsMTAsVkFMMSwgIiwgciIsOSwgSEgyLCIsIHIiLDgsIEhIMSkKKworCVRFU1RfUlJSUiggInVtbGFsCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAidW1sYWwJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKwlURVNUX1JSUlIoICJ1bWFhbAlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggInVtYWFsCXIiLDgsIFZBTDQsIiwgciIsOSwgVkFMMSwiLCByIiwxMCxWQUwyLCIsIHIiLDExLFZBTDMpCisKKwlURVNUX0dST1VQKCJDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmMwMCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZmZmYsMHhmZmZmIikKKworCVRFU1RfR1JPVVAoIlRlc3RpbmcgaW5zdHJ1Y3Rpb25zIGluIElUIGJsb2NrcyIpCisKKwlURVNUX0lUQkxPQ0soInN1Yi53CXIwLCByMCIpCisKKwl2ZXJib3NlKCJcbiIpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LmMgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3Y2RkNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QuYwpAQCAtMCwwICsxLDE3NDggQEAKKy8qCisgKiBhcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSm9uIE1lZGh1cnN0IDx0aXh5QHl4aXQuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0ZXN0IGNvZGUgZm9yIEFSTSBrcHJvYmVzLgorICoKKyAqIFRoZSB0b3AgbGV2ZWwgZnVuY3Rpb24gcnVuX2FsbF90ZXN0cygpIGV4ZWN1dGVzIHRlc3RzIGZvciBhbGwgb2YgdGhlCisgKiBzdXBwb3J0ZWQgaW5zdHJ1Y3Rpb24gc2V0czogQVJNLCAxNi1iaXQgVGh1bWIsIGFuZCAzMi1iaXQgVGh1bWIuIFRoZXNlIHRlc3RzCisgKiBmYWxsIGludG8gdHdvIGNhdGVnb3JpZXM7IHJ1bl9hcGlfdGVzdHMoKSBjaGVja3MgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUKKyAqIGtwcm9iZXMgQVBJLCBhbmQgcnVuX3Rlc3RfY2FzZXMoKSBpcyBhIGNvbXByZWhlbnNpdmUgdGVzdCBmb3Iga3Byb2JlcworICogaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgYW5kIHNpbXVsYXRpb24uCisgKgorICogcnVuX3Rlc3RfY2FzZXMoKSBmaXJzdCBjaGVja3MgdGhlIGtwcm9iZXMgZGVjb2RpbmcgdGFibGUgZm9yIHNlbGYgY29uc2lzdGVuY3kKKyAqICh1c2luZyB0YWJsZV90ZXN0KCkpIHRoZW4gZXhlY3V0ZXMgYSBzZXJpZXMgb2YgdGVzdCBjYXNlcyBmb3IgZWFjaCBvZiB0aGUgQ1BVCisgKiBpbnN0cnVjdGlvbiBmb3Jtcy4gY292ZXJhZ2Vfc3RhcnQoKSBhbmQgY292ZXJhZ2VfZW5kKCkgYXJlIHVzZWQgdG8gdmVyaWZ5CisgKiB0aGF0IHRoZXNlIHRlc3QgY2FzZXMgY292ZXIgYWxsIG9mIHRoZSBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgaW5zdHJ1Y3Rpb25zCisgKiBkZXNjcmliZWQgYnkgdGhlIGtwcm9iZXMgZGVjb2RpbmcgdGFibGVzLgorICoKKyAqIFRoZSBpbmRpdmlkdWFsIHRlc3QgY2FzZXMgYXJlIGluIGtwcm9iZXMtdGVzdC1hcm0uYyBhbmQga3Byb2Jlcy10ZXN0LXRodW1iLmMKKyAqIHdoaWNoIHVzZSB0aGUgbWFjcm9zIGRlZmluZWQgaW4ga3Byb2Jlcy10ZXN0LmguIFRoZSByZXN0IG9mIHRoaXMKKyAqIGRvY3VtZW50YXRpb24gd2lsbCBkZXNjcmliZSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBmcmFtZXdvcmsgdXNlZCBieSB0aGVzZQorICogdGVzdCBjYXNlcy4KKyAqLworCisvKgorICogVEVTVElORyBNRVRIT0RPTE9HWQorICogLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoZSBtZXRob2RvbG9neSB1c2VkIHRvIHRlc3QgYW4gQVJNIGluc3RydWN0aW9uICd0ZXN0X2luc24nIGlzIHRvIHVzZQorICogaW5saW5lIGFzc2VtYmxlciBsaWtlOgorICoKKyAqIHRlc3RfYmVmb3JlOiBub3AKKyAqIHRlc3RfY2FzZToJdGVzdF9pbnNuCisgKiB0ZXN0X2FmdGVyOglub3AKKyAqCisgKiBXaGVuIHRoZSB0ZXN0IGNhc2UgaXMgcnVuIGEga3Byb2JlIGlzIHBsYWNlZCBvZiBlYWNoIG5vcC4gVGhlCisgKiBwb3N0LWhhbmRsZXIgb2YgdGhlIHRlc3RfYmVmb3JlIHByb2JlIGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBzYXZlZCBDUFUKKyAqIHJlZ2lzdGVyIGNvbnRleHQgdG8gdGhhdCB3aGljaCB3ZSByZXF1aXJlIGZvciB0aGUgdGVzdCBjYXNlLiBUaGUKKyAqIHByZS1oYW5kbGVyIG9mIHRoZSBvZiB0aGUgdGVzdF9hZnRlciBwcm9iZSBzYXZlcyBhIGNvcHkgb2YgdGhlIENQVQorICogcmVnaXN0ZXIgY29udGV4dC4gSW4gdGhpcyB3YXkgd2UgY2FuIGV4ZWN1dGUgdGVzdF9pbnNuIHdpdGggYSBzcGVjaWZpYworICogcmVnaXN0ZXIgY29udGV4dCBhbmQgc2VlIHRoZSByZXN1bHRzIGFmdGVyd2FyZHMuCisgKgorICogVG8gYWN0dWFsbHkgdGVzdCB0aGUga3Byb2JlcyBpbnN0cnVjdGlvbiBlbXVsYXRpb24gd2UgcGVyZm9ybSB0aGUgYWJvdmUKKyAqIHN0ZXAgYSBzZWNvbmQgdGltZSBidXQgd2l0aCBhbiBhZGRpdGlvbmFsIGtwcm9iZSBvbiB0aGUgdGVzdF9jYXNlCisgKiBpbnN0cnVjdGlvbiBpdHNlbGYuIElmIHRoZSBlbXVsYXRpb24gaXMgYWNjdXJhdGUgdGhlbiB0aGUgcmVzdWx0cyBzZWVuCisgKiBieSB0aGUgdGVzdF9hZnRlciBwcm9iZSB3aWxsIGJlIGlkZW50aWNhbCB0byB0aGUgZmlyc3QgcnVuIHdoaWNoIGRpZG4ndAorICogaGF2ZSBhIHByb2JlIG9uIHRlc3RfY2FzZS4KKyAqCisgKiBFYWNoIHRlc3QgY2FzZSBpcyBydW4gc2V2ZXJhbCB0aW1lcyB3aXRoIGEgdmFyaWV0eSBvZiB2YXJpYXRpb25zIGluIHRoZQorICogZmxhZ3MgdmFsdWUgb2Ygc3RvcmVkIGluIENQU1IsIGFuZCBmb3IgVGh1bWIgY29kZSwgZGlmZmVyZW50IElUU3RhdGUuCisgKgorICogRm9yIGluc3RydWN0aW9ucyB3aGljaCBjYW4gbW9kaWZ5IFBDLCBhIHNlY29uZCB0ZXN0X2FmdGVyIHByb2JlIGlzIHVzZWQKKyAqIGxpa2UgdGhpczoKKyAqCisgKiB0ZXN0X2JlZm9yZTogbm9wCisgKiB0ZXN0X2Nhc2U6CXRlc3RfaW5zbgorICogdGVzdF9hZnRlcjoJbm9wCisgKgkJYiB0ZXN0X2RvbmUKKyAqIHRlc3RfYWZ0ZXIyOiBub3AKKyAqIHRlc3RfZG9uZToKKyAqCisgKiBUaGUgdGVzdCBjYXNlIGlzIGNvbnN0cnVjdGVkIHN1Y2ggdGhhdCB0ZXN0X2luc24gYnJhbmNoZXMgdG8KKyAqIHRlc3RfYWZ0ZXIyLCBvciwgaWYgdGVzdGluZyBhIGNvbmRpdGlvbmFsIGluc3RydWN0aW9uLCBpdCBtYXkganVzdAorICogY29udGludWUgdG8gdGVzdF9hZnRlci4gVGhlIHByb2JlcyBpbnNlcnRlZCBhdCBib3RoIGxvY2F0aW9ucyBsZXQgdXMKKyAqIGRldGVybWluZSB3aGljaCBoYXBwZW5lZC4gQSBzaW1pbGFyIGFwcHJvYWNoIGlzIHVzZWQgZm9yIHRlc3RpbmcKKyAqIGJhY2t3YXJkcyBicmFuY2hlcy4uLgorICoKKyAqCQliIHRlc3RfYmVmb3JlCisgKgkJYiB0ZXN0X2RvbmUgIEAgaGVscHMgdG8gY29wZSB3aXRoIG9mZiBieSAxIGJyYW5jaGVzCisgKiB0ZXN0X2FmdGVyMjogbm9wCisgKgkJYiB0ZXN0X2RvbmUKKyAqIHRlc3RfYmVmb3JlOiBub3AKKyAqIHRlc3RfY2FzZToJdGVzdF9pbnNuCisgKiB0ZXN0X2FmdGVyOglub3AKKyAqIHRlc3RfZG9uZToKKyAqCisgKiBUaGUgbWFjcm9zIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGFzc2VtYmxlciBpbnN0cnVjdGlvbnMgZGVzY3JpYmUgYWJvdmUKKyAqIGFyZSBURVNUX0lOU1RSVUNUSU9OLCBURVNUX0JSQU5DSF9GIChicmFuY2ggZm9yd2FyZHMpIGFuZCBURVNUX0JSQU5DSF9CCisgKiAoYnJhbmNoIGJhY2t3YXJkcykuIEluIHRoZXNlLCB0aGUgbG9jYWwgdmFyaWFibGVzIG51bWJlcmVkIDEsIDUwLCAyIGFuZAorICogOTkgcmVwcmVzZW50OiB0ZXN0X2JlZm9yZSwgdGVzdF9jYXNlLCB0ZXN0X2FmdGVyMiBhbmQgdGVzdF9kb25lLgorICoKKyAqIEZSQU1FV09SSworICogLS0tLS0tLS0tCisgKgorICogRWFjaCB0ZXN0IGNhc2UgaXMgd3JhcHBlZCBiZXR3ZWVuIHRoZSBwYWlyIG9mIG1hY3JvcyBURVNUQ0FTRV9TVEFSVCBhbmQKKyAqIFRFU1RDQVNFX0VORC4gQXMgd2VsbCBhcyBwZXJmb3JtaW5nIHRoZSBpbmxpbmUgYXNzZW1ibGVyIGJvaWxlcnBsYXRlLAorICogdGhlc2UgY2FsbCBvdXQgdG8gdGhlIGtwcm9iZXNfdGVzdF9jYXNlX3N0YXJ0KCkgYW5kCisgKiBrcHJvYmVzX3Rlc3RfY2FzZV9lbmQoKSBmdW5jdGlvbnMgd2hpY2ggZHJpdmUgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdAorICogY2FzZS4gVGhlIHNwZWNpZmljIGFyZ3VtZW50cyB0byB1c2UgZm9yIGVhY2ggdGVzdCBjYXNlIGFyZSBzdG9yZWQgYXMKKyAqIGlubGluZSBkYXRhIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSB2YXJpb3VzIFRFU1RfQVJHXyogbWFjcm9zLiBQdXR0aW5nCisgKiB0aGlzIGFsbCB0b2dldGhlciwgYSBzaW1wbGUgdGVzdCBjYXNlIG1heSBsb29rIGxpa2U6CisgKgorICoJVEVTVENBU0VfU1RBUlQoIlRlc3RpbmcgbW92IHIwLCByNyIpCisgKglURVNUX0FSR19SRUcoNywgMHgxMjM0NTY3OCkgLy8gU2V0IHI3PTB4MTIzNDU2NzgKKyAqCVRFU1RfQVJHX0VORCgiIikKKyAqCVRFU1RfSU5TVFJVQ1RJT04oIm1vdiByMCwgcjciKQorICoJVEVTVENBU0VfRU5ECisgKgorICogTm90ZSwgaW4gcHJhY3RpY2UgdGhlIHNpbmdsZSBjb252ZW5pZW5jZSBtYWNybyBURVNUX1Igd291bGQgYmUgdXNlZCBmb3IgdGhpcworICogaW5zdGVhZC4KKyAqCisgKiBUaGUgYWJvdmUgd291bGQgZXhwYW5kIHRvIGFzc2VtYmxlciBsb29raW5nIHNvbWV0aGluZyBsaWtlOgorICoKKyAqCUAgVEVTVENBU0VfU1RBUlQKKyAqCWJsCV9fa3Byb2Jlc190ZXN0X2Nhc2Vfc3RhcnQKKyAqCUAgc3RhcnQgb2YgaW5saW5lIGRhdGEuLi4KKyAqCS5hc2NpaSAibW92IHIwLCByNyIJQCB0ZXh0IHRpdGxlIGZvciB0ZXN0IGNhc2UKKyAqCS5ieXRlCTAKKyAqCS5hbGlnbgkyCisgKgorICoJQCBURVNUX0FSR19SRUcKKyAqCS5ieXRlCUFSR19UWVBFX1JFRworICoJLmJ5dGUJNworICoJLnNob3J0CTAKKyAqCS53b3JkCTB4MTIzNDU2NworICoKKyAqCUAgVEVTVF9BUkdfRU5ECisgKgkuYnl0ZQlBUkdfVFlQRV9FTkQKKyAqCS5ieXRlCVRFU1RfSVNBCUAgZmxhZ3MsIGluY2x1ZGluZyBJU0EgYmVpbmcgdGVzdGVkCisgKgkuc2hvcnQJNTBmLTBmCQlAIG9mZnNldCBvZiAndGVzdF9iZWZvcmUnCisgKgkuc2hvcnQJMmYtMGYJCUAgb2Zmc2V0IG9mICd0ZXN0X2FmdGVyMicgKGlmIHJlbGV2ZW50KQorICoJLnNob3J0CTk5Zi0wZgkJQCBvZmZzZXQgb2YgJ3Rlc3RfZG9uZScKKyAqCUAgc3RhcnQgb2YgdGVzdCBjYXNlIGNvZGUuLi4KKyAqCTA6CisgKgkuY29kZQlURVNUX0lTQQlAIHN3aXRjaCB0byBJU0EgYmVpbmcgdGVzdGVkCisgKgorICoJQCBURVNUX0lOU1RSVUNUSU9OCisgKgk1MDoJbm9wCQlAIGxvY2F0aW9uIGZvciAndGVzdF9iZWZvcmUnIHByb2JlCisgKgkxOgltb3YgcjAsIHI3CUAgdGhlIHRlc3QgY2FzZSBpbnN0cnVjdGlvbiAndGVzdF9pbnNuJworICoJCW5vcAkJQCBsb2NhdGlvbiBmb3IgJ3Rlc3RfYWZ0ZXInIHByb2JlCisgKgorICoJLy8gVEVTVENBU0VfRU5ECisgKgkyOgorICoJOTk6CWJsIF9fa3Byb2Jlc190ZXN0X2Nhc2VfZW5kXyMjVEVTVF9JU0EKKyAqCS5jb2RlCU5PTk1BTF9JU0EKKyAqCisgKiBXaGVuIHRoZSBhYm92ZSBpcyBleGVjdXRlIHRoZSBmb2xsb3dpbmcgaGFwcGVucy4uLgorICoKKyAqIF9fa3Byb2Jlc190ZXN0X2Nhc2Vfc3RhcnQoKSBpcyBhbiBhc3NlbWJsZXIgd3JhcHBlciB3aGljaCBzZXRzIHVwIHNwYWNlCisgKiBmb3IgYSBzdGFjayBidWZmZXIgYW5kIGNhbGxzIHRoZSBDIGZ1bmN0aW9uIGtwcm9iZXNfdGVzdF9jYXNlX3N0YXJ0KCkuCisgKiBUaGlzIEMgZnVuY3Rpb24gd2lsbCBkbyBzb21lIGluaXRpYWwgcHJvY2Vzc2luZyBvZiB0aGUgaW5saW5lIGRhdGEgYW5kCisgKiBzZXR1cCBzb21lIGdsb2JhbCBzdGF0ZS4gSXQgdGhlbiBpbnNlcnRzIHRoZSB0ZXN0X2JlZm9yZSBhbmQgdGVzdF9hZnRlcgorICoga3Byb2JlcyBhbmQgcmV0dXJucyBhIHZhbHVlIHdoaWNoIGNhdXNlcyB0aGUgYXNzZW1ibGVyIHdyYXBwZXIgdG8ganVtcAorICogdG8gdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0IGNhc2UgY29kZSwgKGxvY2FsIGxhYmVsICcwJykuCisgKgorICogV2hlbiB0aGUgdGVzdCBjYXNlIGNvZGUgZXhlY3V0ZXMsIHRoZSB0ZXN0X2JlZm9yZSBwcm9iZSB3aWxsIGJlIGhpdCBhbmQKKyAqIHRlc3RfYmVmb3JlX3Bvc3RfaGFuZGxlciB3aWxsIGNhbGwgc2V0dXBfdGVzdF9jb250ZXh0KCkuIFRoaXMgZmlsbHMgdGhlCisgKiBzdGFjayBidWZmZXIgYW5kIENQVSByZWdpc3RlcnMgd2l0aCBhIHRlc3QgcGF0dGVybiBhbmQgdGhlbiBwcm9jZXNzZXMKKyAqIHRoZSB0ZXN0IGNhc2UgYXJndW1lbnRzLiBJbiBvdXIgZXhhbXBsZSB0aGVyZSBpcyBvbmUgVEVTVF9BUkdfUkVHIHdoaWNoCisgKiBpbmRpY2F0ZXMgdGhhdCBSNyBzaG91bGQgYmUgbG9hZGVkIHdpdGggdGhlIHZhbHVlIDB4MTIzNDU2NzguCisgKgorICogV2hlbiB0aGUgdGVzdF9iZWZvcmUgcHJvYmUgZW5kcywgdGhlIHRlc3QgY2FzZSBjb250aW51ZXMgYW5kIGV4ZWN1dGVzCisgKiB0aGUgIm1vdiByMCwgcjciIGluc3RydWN0aW9uLiBJdCB0aGVuIGhpdHMgdGhlIHRlc3RfYWZ0ZXIgcHJvYmUgYW5kIHRoZQorICogcHJlLWhhbmRsZXIgZm9yIHRoaXMgKHRlc3RfYWZ0ZXJfcHJlX2hhbmRsZXIpIHdpbGwgc2F2ZSBhIGNvcHkgb2YgdGhlCisgKiBDUFUgcmVnaXN0ZXIgY29udGV4dC4gVGhpcyBzaG91bGQgbm93IGhhdmUgUjAgaG9sZGluZyB0aGUgc2FtZSB2YWx1ZSBhcworICogUjcuCisgKgorICogRmluYWxseSB3ZSBnZXQgdG8gdGhlIGNhbGwgdG8gX19rcHJvYmVzX3Rlc3RfY2FzZV9lbmRfezMyLDE2fS4gVGhpcyBpcworICogYW4gYXNzZW1ibGVyIHdyYXBwZXIgd2hpY2ggc3dpdGNoZXMgYmFjayB0byB0aGUgSVNBIHVzZWQgYnkgdGhlIHRlc3QKKyAqIGNvZGUgYW5kIGNhbGxzIHRoZSBDIGZ1bmN0aW9uIGtwcm9iZXNfdGVzdF9jYXNlX2VuZCgpLgorICoKKyAqIEZvciBlYWNoIHJ1biB0aHJvdWdoIHRoZSB0ZXN0IGNhc2UsIHRlc3RfY2FzZV9ydW5fY291bnQgaXMgaW5jcmVtZW50ZWQKKyAqIGJ5IG9uZS4gRm9yIGV2ZW4gcnVucywga3Byb2Jlc190ZXN0X2Nhc2VfZW5kKCkgc2F2ZXMgYSBjb3B5IG9mIHRoZQorICogcmVnaXN0ZXIgYW5kIHN0YWNrIGJ1ZmZlciBjb250ZW50cyBmcm9tIHRoZSB0ZXN0IGNhc2UganVzdCBydW4uIEl0IHRoZW4KKyAqIGluc2VydHMgYSBrcHJvYmUgb24gdGhlIHRlc3QgY2FzZSBpbnN0cnVjdGlvbiAndGVzdF9pbnNuJyBhbmQgcmV0dXJucyBhCisgKiB2YWx1ZSB0byBjYXVzZSB0aGUgdGVzdCBjYXNlIGNvZGUgdG8gYmUgcmUtcnVuLgorICoKKyAqIEZvciBvZGQgbnVtYmVyZWQgcnVucywga3Byb2Jlc190ZXN0X2Nhc2VfZW5kKCkgY29tcGFyZXMgdGhlIHJlZ2lzdGVyIGFuZAorICogc3RhY2sgYnVmZmVyIGNvbnRlbnRzIHRvIHRob3NlIHRoYXQgd2VyZSBzYXZlZCBvbiB0aGUgcHJldmlvdXMgZXZlbgorICogbnVtYmVyZWQgcnVuICh0aGUgb25lIHdpdGhvdXQgdGhlIGtwcm9iZSBvbiB0ZXN0X2luc24pLiBUaGVzZSBzaG91bGQgYmUKKyAqIHRoZSBzYW1lIGlmIHRoZSBrcHJvYmUgaW5zdHJ1Y3Rpb24gc2ltdWxhdGlvbiByb3V0aW5lIGlzIGNvcnJlY3QuCisgKgorICogVGhlIHBhaXIgb2YgdGVzdCBjYXNlIHJ1bnMgaXMgcmVwZWF0ZWQgd2l0aCBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mCisgKiBmbGFnIHZhbHVlcyBpbiBDUFNSIGFuZCwgZm9yIFRodW1iLCBkaWZmZXJlbnQgSVRTdGF0ZS4gVGhpcyBpcworICogY29udHJvbGxlZCBieSB0ZXN0X2NvbnRleHRfY3BzcigpLgorICoKKyAqIEJVSUxESU5HIFRFU1QgQ0FTRVMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogQXMgYW4gYWlkIHRvIGJ1aWxkaW5nIHRlc3QgY2FzZXMsIHRoZSBzdGFjayBidWZmZXIgaXMgaW5pdGlhbGlzZWQgd2l0aAorICogc29tZSBzcGVjaWFsIHZhbHVlczoKKyAqCisgKiAgIFtTUCsxMyo0XQlDb250YWlucyBTUCsxMjAuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBpbnN0cnVjdGlvbnMKKyAqCQl3aGljaCBsb2FkIGEgdmFsdWUgaW50byBTUC4KKyAqCisgKiAgIFtTUCsxNSo0XQlXaGVuIHRlc3RpbmcgYnJhbmNoaW5nIGluc3RydWN0aW9ucyB1c2luZyBURVNUX0JSQU5DSF97RixCfSwKKyAqCQl0aGlzIGhvbGRzIHRoZSB0YXJnZXQgYWRkcmVzcyBvZiB0aGUgYnJhbmNoLCAndGVzdF9hZnRlcjInLgorICoJCVRoaXMgY2FuIGJlIHVzZWQgdG8gdGVzdCBpbnN0cnVjdGlvbnMgd2hpY2ggbG9hZCBhIFBDIHZhbHVlCisgKgkJZnJvbSBtZW1vcnkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisKKyNpbmNsdWRlICJrcHJvYmVzLmgiCisjaW5jbHVkZSAia3Byb2Jlcy10ZXN0LmgiCisKKworI2RlZmluZSBCRU5DSE1BUktJTkcJMQorCisKKy8qCisgKiBUZXN0IGJhc2ljIEFQSQorICovCisKK3N0YXRpYyBib29sIHRlc3RfcmVnc19vazsKK3N0YXRpYyBpbnQgdGVzdF9mdW5jX2luc3RhbmNlOworc3RhdGljIGludCBwcmVfaGFuZGxlcl9jYWxsZWQ7CitzdGF0aWMgaW50IHBvc3RfaGFuZGxlcl9jYWxsZWQ7CitzdGF0aWMgaW50IGpwcm9iZV9mdW5jX2NhbGxlZDsKK3N0YXRpYyBpbnQga3JldHByb2JlX2hhbmRsZXJfY2FsbGVkOworCisjZGVmaW5lIEZVTkNfQVJHMSAweDEyMzQ1Njc4CisjZGVmaW5lIEZVTkNfQVJHMiAweGFiY2RlZgorCisKKyNpZm5kZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKworbG9uZyBhcm1fZnVuYyhsb25nIHIwLCBsb25nIHIxKTsKKworc3RhdGljIHZvaWQgX191c2VkIF9fbmFrZWQgX19hcm1fa3Byb2Jlc190ZXN0X2Z1bmModm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIuYXJtCQkJCQlcblx0IgorCQkiLnR5cGUgYXJtX2Z1bmMsICUlZnVuY3Rpb24JCVxuXHQiCisJCSJhcm1fZnVuYzoJCQkJXG5cdCIKKwkJImFkZHMJcjAsIHIwLCByMQkJCVxuXHQiCisJCSJieAlscgkJCQlcblx0IgorCQkiLmNvZGUgIk5PUk1BTF9JU0EJIC8qIEJhY2sgdG8gVGh1bWIgaWYgbmVjZXNzYXJ5ICovCisJCTogOiA6ICJyMCIsICJyMSIsICJjYyIKKwkpOworfQorCisjZWxzZSAvKiBDT05GSUdfVEhVTUIyX0tFUk5FTCAqLworCitsb25nIHRodW1iMTZfZnVuYyhsb25nIHIwLCBsb25nIHIxKTsKK2xvbmcgdGh1bWIzMmV2ZW5fZnVuYyhsb25nIHIwLCBsb25nIHIxKTsKK2xvbmcgdGh1bWIzMm9kZF9mdW5jKGxvbmcgcjAsIGxvbmcgcjEpOworCitzdGF0aWMgdm9pZCBfX3VzZWQgX19uYWtlZCBfX3RodW1iX2twcm9iZXNfdGVzdF9mdW5jcyh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIi50eXBlIHRodW1iMTZfZnVuYywgJSVmdW5jdGlvbgkJXG5cdCIKKwkJInRodW1iMTZfZnVuYzoJCQkJXG5cdCIKKwkJImFkZHMubglyMCwgcjAsIHIxCQkJXG5cdCIKKwkJImJ4CWxyCQkJCVxuXHQiCisKKwkJIi5hbGlnbgkJCQkJXG5cdCIKKwkJIi50eXBlIHRodW1iMzJldmVuX2Z1bmMsICUlZnVuY3Rpb24JXG5cdCIKKwkJInRodW1iMzJldmVuX2Z1bmM6CQkJXG5cdCIKKwkJImFkZHMudwlyMCwgcjAsIHIxCQkJXG5cdCIKKwkJImJ4CWxyCQkJCVxuXHQiCisKKwkJIi5hbGlnbgkJCQkJXG5cdCIKKwkJIm5vcC5uCQkJCQlcblx0IgorCQkiLnR5cGUgdGh1bWIzMm9kZF9mdW5jLCAlJWZ1bmN0aW9uCVxuXHQiCisJCSJ0aHVtYjMyb2RkX2Z1bmM6CQkJXG5cdCIKKwkJImFkZHMudwlyMCwgcjAsIHIxCQkJXG5cdCIKKwkJImJ4CWxyCQkJCVxuXHQiCisKKwkJOiA6IDogInIwIiwgInIxIiwgImNjIgorCSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfVEhVTUIyX0tFUk5FTCAqLworCisKK3N0YXRpYyBpbnQgY2FsbF90ZXN0X2Z1bmMobG9uZyAoKmZ1bmMpKGxvbmcsIGxvbmcpLCBib29sIGNoZWNrX3Rlc3RfcmVncykKK3sKKwlsb25nIHJldDsKKworCSsrdGVzdF9mdW5jX2luc3RhbmNlOworCXRlc3RfcmVnc19vayA9IGZhbHNlOworCisJcmV0ID0gKCpmdW5jKShGVU5DX0FSRzEsIEZVTkNfQVJHMik7CisJaWYgKHJldCAhPSBGVU5DX0FSRzEgKyBGVU5DX0FSRzIpIHsKKwkJcHJfZXJyKCJGQUlMOiBjYWxsX3Rlc3RfZnVuYzogZnVuYyByZXR1cm5lZCAlbHhcbiIsIHJldCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoY2hlY2tfdGVzdF9yZWdzICYmICF0ZXN0X3JlZ3Nfb2spIHsKKwkJcHJfZXJyKCJGQUlMOiB0ZXN0IHJlZ3Mgbm90IE9LXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IF9fa3Byb2JlcyBwcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmVfaGFuZGxlcl9jYWxsZWQgPSB0ZXN0X2Z1bmNfaW5zdGFuY2U7CisJaWYgKHJlZ3MtPkFSTV9yMCA9PSBGVU5DX0FSRzEgJiYgcmVncy0+QVJNX3IxID09IEZVTkNfQVJHMikKKwkJdGVzdF9yZWdzX29rID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzIHBvc3RfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXBvc3RfaGFuZGxlcl9jYWxsZWQgPSB0ZXN0X2Z1bmNfaW5zdGFuY2U7CisJaWYgKHJlZ3MtPkFSTV9yMCAhPSBGVU5DX0FSRzEgKyBGVU5DX0FSRzIgfHwgcmVncy0+QVJNX3IxICE9IEZVTkNfQVJHMikKKwkJdGVzdF9yZWdzX29rID0gZmFsc2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga3Byb2JlIHRoZV9rcHJvYmUgPSB7CisJLmFkZHIJCT0gMCwKKwkucHJlX2hhbmRsZXIJPSBwcmVfaGFuZGxlciwKKwkucG9zdF9oYW5kbGVyCT0gcG9zdF9oYW5kbGVyCit9OworCitzdGF0aWMgaW50IHRlc3Rfa3Byb2JlKGxvbmcgKCpmdW5jKShsb25nLCBsb25nKSkKK3sKKwlpbnQgcmV0OworCisJdGhlX2twcm9iZS5hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKWZ1bmM7CisJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZ0aGVfa3Byb2JlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZBSUw6IHJlZ2lzdGVyX2twcm9iZSBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBjYWxsX3Rlc3RfZnVuYyhmdW5jLCB0cnVlKTsKKworCXVucmVnaXN0ZXJfa3Byb2JlKCZ0aGVfa3Byb2JlKTsKKwl0aGVfa3Byb2JlLmZsYWdzID0gMDsgLyogQ2xlYXIgZGlzYWJsZSBmbGFnIHRvIGFsbG93IHJldXNlICovCisKKwlpZiAoIXJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHByZV9oYW5kbGVyX2NhbGxlZCAhPSB0ZXN0X2Z1bmNfaW5zdGFuY2UpIHsKKwkJcHJfZXJyKCJGQUlMOiBrcHJvYmUgcHJlX2hhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocG9zdF9oYW5kbGVyX2NhbGxlZCAhPSB0ZXN0X2Z1bmNfaW5zdGFuY2UpIHsKKwkJcHJfZXJyKCJGQUlMOiBrcHJvYmUgcG9zdF9oYW5kbGVyIG5vdCBjYWxsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFjYWxsX3Rlc3RfZnVuYyhmdW5jLCBmYWxzZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwcmVfaGFuZGxlcl9jYWxsZWQgPT0gdGVzdF9mdW5jX2luc3RhbmNlIHx8CisJCQkJcG9zdF9oYW5kbGVyX2NhbGxlZCA9PSB0ZXN0X2Z1bmNfaW5zdGFuY2UpIHsKKwkJcHJfZXJyKCJGQUlMOiBwcm9iZSBjYWxsZWQgYWZ0ZXIgdW5yZWdpc3RlcmluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMganByb2JlX2Z1bmMobG9uZyByMCwgbG9uZyByMSkKK3sKKwlqcHJvYmVfZnVuY19jYWxsZWQgPSB0ZXN0X2Z1bmNfaW5zdGFuY2U7CisJaWYgKHIwID09IEZVTkNfQVJHMSAmJiByMSA9PSBGVU5DX0FSRzIpCisJCXRlc3RfcmVnc19vayA9IHRydWU7CisJanByb2JlX3JldHVybigpOworfQorCitzdGF0aWMgc3RydWN0IGpwcm9iZSB0aGVfanByb2JlID0geworCS5lbnRyeQkJPSBqcHJvYmVfZnVuYywKK307CisKK3N0YXRpYyBpbnQgdGVzdF9qcHJvYmUobG9uZyAoKmZ1bmMpKGxvbmcsIGxvbmcpKQoreworCWludCByZXQ7CisKKwl0aGVfanByb2JlLmtwLmFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopZnVuYzsKKwlyZXQgPSByZWdpc3Rlcl9qcHJvYmUoJnRoZV9qcHJvYmUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiRkFJTDogcmVnaXN0ZXJfanByb2JlIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNhbGxfdGVzdF9mdW5jKGZ1bmMsIHRydWUpOworCisJdW5yZWdpc3Rlcl9qcHJvYmUoJnRoZV9qcHJvYmUpOworCXRoZV9qcHJvYmUua3AuZmxhZ3MgPSAwOyAvKiBDbGVhciBkaXNhYmxlIGZsYWcgdG8gYWxsb3cgcmV1c2UgKi8KKworCWlmICghcmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoanByb2JlX2Z1bmNfY2FsbGVkICE9IHRlc3RfZnVuY19pbnN0YW5jZSkgeworCQlwcl9lcnIoIkZBSUw6IGpwcm9iZSBoYW5kbGVyIGZ1bmN0aW9uIG5vdCBjYWxsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFjYWxsX3Rlc3RfZnVuYyhmdW5jLCBmYWxzZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChqcHJvYmVfZnVuY19jYWxsZWQgPT0gdGVzdF9mdW5jX2luc3RhbmNlKSB7CisJCXByX2VycigiRkFJTDogcHJvYmUgY2FsbGVkIGFmdGVyIHVucmVnaXN0ZXJpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2twcm9iZXMKK2tyZXRwcm9iZV9oYW5kbGVyKHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlrcmV0cHJvYmVfaGFuZGxlcl9jYWxsZWQgPSB0ZXN0X2Z1bmNfaW5zdGFuY2U7CisJaWYgKHJlZ3NfcmV0dXJuX3ZhbHVlKHJlZ3MpID09IEZVTkNfQVJHMSArIEZVTkNfQVJHMikKKwkJdGVzdF9yZWdzX29rID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBrcmV0cHJvYmUgdGhlX2tyZXRwcm9iZSA9IHsKKwkuaGFuZGxlcgk9IGtyZXRwcm9iZV9oYW5kbGVyLAorfTsKKworc3RhdGljIGludCB0ZXN0X2tyZXRwcm9iZShsb25nICgqZnVuYykobG9uZywgbG9uZykpCit7CisJaW50IHJldDsKKworCXRoZV9rcmV0cHJvYmUua3AuYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKilmdW5jOworCXJldCA9IHJlZ2lzdGVyX2tyZXRwcm9iZSgmdGhlX2tyZXRwcm9iZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJGQUlMOiByZWdpc3Rlcl9rcmV0cHJvYmUgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gY2FsbF90ZXN0X2Z1bmMoZnVuYywgdHJ1ZSk7CisKKwl1bnJlZ2lzdGVyX2tyZXRwcm9iZSgmdGhlX2tyZXRwcm9iZSk7CisJdGhlX2tyZXRwcm9iZS5rcC5mbGFncyA9IDA7IC8qIENsZWFyIGRpc2FibGUgZmxhZyB0byBhbGxvdyByZXVzZSAqLworCisJaWYgKCFyZXQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrcmV0cHJvYmVfaGFuZGxlcl9jYWxsZWQgIT0gdGVzdF9mdW5jX2luc3RhbmNlKSB7CisJCXByX2VycigiRkFJTDoga3JldHByb2JlIGhhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWNhbGxfdGVzdF9mdW5jKGZ1bmMsIGZhbHNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGpwcm9iZV9mdW5jX2NhbGxlZCA9PSB0ZXN0X2Z1bmNfaW5zdGFuY2UpIHsKKwkJcHJfZXJyKCJGQUlMOiBrcmV0cHJvYmUgY2FsbGVkIGFmdGVyIHVucmVnaXN0ZXJpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydW5fYXBpX3Rlc3RzKGxvbmcgKCpmdW5jKShsb25nLCBsb25nKSkKK3sKKwlpbnQgcmV0OworCisJcHJfaW5mbygiICAgIGtwcm9iZVxuIik7CisJcmV0ID0gdGVzdF9rcHJvYmUoZnVuYyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwcl9pbmZvKCIgICAganByb2JlXG4iKTsKKwlyZXQgPSB0ZXN0X2pwcm9iZShmdW5jKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXByX2luZm8oIiAgICBrcmV0cHJvYmVcbiIpOworCXJldCA9IHRlc3Rfa3JldHByb2JlKGZ1bmMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEJlbmNobWFya2luZworICovCisKKyNpZiBCRU5DSE1BUktJTkcKKworc3RhdGljIHZvaWQgX19uYWtlZCBiZW5jaG1hcmtfbm9wKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkibm9wCQlcblx0IgorCQkiYngJbHIiCisJKTsKK30KKworI2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisjZGVmaW5lIHdpZGUgIi53IgorI2Vsc2UKKyNkZWZpbmUgd2lkZQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9fbmFrZWQgYmVuY2htYXJrX3B1c2hwb3AxKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkic3RtZGIid2lkZSIJc3AhLCB7cjMtcjExLGxyfSAgXG5cdCIKKwkJImxkbWlhIndpZGUiCXNwISwge3IzLXIxMSxwY30iCisJKTsKK30KKworc3RhdGljIHZvaWQgX19uYWtlZCBiZW5jaG1hcmtfcHVzaHBvcDIodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJzdG1kYiJ3aWRlIglzcCEsIHtyMC1yOCxscn0gIFxuXHQiCisJCSJsZG1pYSJ3aWRlIglzcCEsIHtyMC1yOCxwY30iCisJKTsKK30KKworc3RhdGljIHZvaWQgX19uYWtlZCBiZW5jaG1hcmtfcHVzaHBvcDModm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJzdG1kYiJ3aWRlIglzcCEsIHtyNCxscn0gIFxuXHQiCisJCSJsZG1pYSJ3aWRlIglzcCEsIHtyNCxwY30iCisJKTsKK30KKworc3RhdGljIHZvaWQgX19uYWtlZCBiZW5jaG1hcmtfcHVzaHBvcDQodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJzdG1kYiJ3aWRlIglzcCEsIHtyMCxscn0gIFxuXHQiCisJCSJsZG1pYSJ3aWRlIglzcCEsIHtyMCxwY30iCisJKTsKK30KKworCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKworc3RhdGljIHZvaWQgX19uYWtlZCBiZW5jaG1hcmtfcHVzaHBvcF90aHVtYih2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJInB1c2gubgl7cjAtcjcsbHJ9ICBcblx0IgorCQkicG9wLm4Je3IwLXI3LHBjfSIKKwkpOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBfX2twcm9iZXMKK2JlbmNobWFya19wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZW5jaG1hcmsodm9pZCgqZm4pKHZvaWQpKQoreworCXVuc2lnbmVkIG4sIGksIHQsIHQwOworCisJZm9yIChuID0gMTAwMDsgOyBuICo9IDIpIHsKKwkJdDAgPSBzY2hlZF9jbG9jaygpOworCQlmb3IgKGkgPSBuOyBpID4gMDsgLS1pKQorCQkJZm4oKTsKKwkJdCA9IHNjaGVkX2Nsb2NrKCkgLSB0MDsKKwkJaWYgKHQgPj0gMjUwMDAwMDAwKQorCQkJYnJlYWs7IC8qIFN0b3Agb25jZSB3ZSB0b29rIG1vcmUgdGhhbiAwLjI1IHNlY29uZHMgKi8KKwl9CisJcmV0dXJuIHQgLyBuOyAvKiBUaW1lIGZvciBvbmUgaXRlcmF0aW9uIGluIG5hbm9zZWNvbmRzICovCit9OworCitzdGF0aWMgaW50IGtwcm9iZV9iZW5jaG1hcmsodm9pZCgqZm4pKHZvaWQpLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGtwcm9iZSBrID0geworCQkuYWRkcgkJPSAoa3Byb2JlX29wY29kZV90ICopKCh1aW50cHRyX3QpZm4gKyBvZmZzZXQpLAorCQkucHJlX2hhbmRsZXIJPSBiZW5jaG1hcmtfcHJlX2hhbmRsZXIsCisJfTsKKworCWludCByZXQgPSByZWdpc3Rlcl9rcHJvYmUoJmspOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiRkFJTDogcmVnaXN0ZXJfa3Byb2JlIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGJlbmNobWFyayhmbik7CisKKwl1bnJlZ2lzdGVyX2twcm9iZSgmayk7CisJcmV0dXJuIHJldDsKK307CisKK3N0cnVjdCBiZW5jaG1hcmtzIHsKKwl2b2lkCQkoKmZuKSh2b2lkKTsKKwl1bnNpZ25lZAlvZmZzZXQ7CisJY29uc3QgY2hhcgkqdGl0bGU7Cit9OworCitzdGF0aWMgaW50IHJ1bl9iZW5jaG1hcmtzKHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYmVuY2htYXJrcyBsaXN0W10gPSB7CisJCXsmYmVuY2htYXJrX25vcCwgMCwgIm5vcCJ9LAorCQkvKgorCQkgKiBiZW5jaG1hcmtfcHVzaHBvcHsxLDN9IHdpbGwgaGF2ZSB0aGUgb3B0aW1pc2VkCisJCSAqIGluc3RydWN0aW9uIGVtdWxhdGlvbiwgd2hpbHN0IGJlbmNobWFya19wdXNocG9wezIsNH0gd2lsbAorCQkgKiBiZSB0aGUgZXF1aXZhbGVudCB1bm9wdGltaXNlZCBpbnN0cnVjdGlvbnMuCisJCSAqLworCQl7JmJlbmNobWFya19wdXNocG9wMSwgMCwgInN0bWRiCXNwISwge3IzLXIxMSxscn0ifSwKKwkJeyZiZW5jaG1hcmtfcHVzaHBvcDEsIDQsICJsZG1pYQlzcCEsIHtyMy1yMTEscGN9In0sCisJCXsmYmVuY2htYXJrX3B1c2hwb3AyLCAwLCAic3RtZGIJc3AhLCB7cjAtcjgsbHJ9In0sCisJCXsmYmVuY2htYXJrX3B1c2hwb3AyLCA0LCAibGRtaWEJc3AhLCB7cjAtcjgscGN9In0sCisJCXsmYmVuY2htYXJrX3B1c2hwb3AzLCAwLCAic3RtZGIJc3AhLCB7cjQsbHJ9In0sCisJCXsmYmVuY2htYXJrX3B1c2hwb3AzLCA0LCAibGRtaWEJc3AhLCB7cjQscGN9In0sCisJCXsmYmVuY2htYXJrX3B1c2hwb3A0LCAwLCAic3RtZGIJc3AhLCB7cjAsbHJ9In0sCisJCXsmYmVuY2htYXJrX3B1c2hwb3A0LCA0LCAibGRtaWEJc3AhLCB7cjAscGN9In0sCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwkJeyZiZW5jaG1hcmtfcHVzaHBvcF90aHVtYiwgMCwgInB1c2gubgl7cjAtcjcsbHJ9In0sCisJCXsmYmVuY2htYXJrX3B1c2hwb3BfdGh1bWIsIDIsICJwb3Aubgl7cjAtcjcscGN9In0sCisjZW5kaWYKKwkJezB9CisJfTsKKworCXN0cnVjdCBiZW5jaG1hcmtzICpiOworCWZvciAoYiA9IGxpc3Q7IGItPmZuOyArK2IpIHsKKwkJcmV0ID0ga3Byb2JlX2JlbmNobWFyayhiLT5mbiwgYi0+b2Zmc2V0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlwcl9pbmZvKCIgICAgJWRucyBmb3Iga3Byb2JlICVzXG4iLCByZXQsIGItPnRpdGxlKTsKKwl9CisKKwlwcl9pbmZvKCJcbiIpOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQkVOQ0hNQVJLSU5HICovCisKKworLyoKKyAqIERlY29kaW5nIHRhYmxlIHNlbGYtY29uc2lzdGVuY3kgdGVzdHMKKyAqLworCitzdGF0aWMgY29uc3QgaW50IGRlY29kZV9zdHJ1Y3Rfc2l6ZXNbTlVNX0RFQ09ERV9UWVBFU10gPSB7CisJW0RFQ09ERV9UWVBFX1RBQkxFXQk9IHNpemVvZihzdHJ1Y3QgZGVjb2RlX3RhYmxlKSwKKwlbREVDT0RFX1RZUEVfQ1VTVE9NXQk9IHNpemVvZihzdHJ1Y3QgZGVjb2RlX2N1c3RvbSksCisJW0RFQ09ERV9UWVBFX1NJTVVMQVRFXQk9IHNpemVvZihzdHJ1Y3QgZGVjb2RlX3NpbXVsYXRlKSwKKwlbREVDT0RFX1RZUEVfRU1VTEFURV0JPSBzaXplb2Yoc3RydWN0IGRlY29kZV9lbXVsYXRlKSwKKwlbREVDT0RFX1RZUEVfT1JdCT0gc2l6ZW9mKHN0cnVjdCBkZWNvZGVfb3IpLAorCVtERUNPREVfVFlQRV9SRUpFQ1RdCT0gc2l6ZW9mKHN0cnVjdCBkZWNvZGVfcmVqZWN0KQorfTsKKworc3RhdGljIGludCB0YWJsZV9pdGVyKGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtICp0YWJsZSwKKwkJCWludCAoKmZuKShjb25zdCBzdHJ1Y3QgZGVjb2RlX2hlYWRlciAqLCB2b2lkICopLAorCQkJdm9pZCAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgZGVjb2RlX2hlYWRlciAqaCA9IChzdHJ1Y3QgZGVjb2RlX2hlYWRlciAqKXRhYmxlOworCWludCByZXN1bHQ7CisKKwlmb3IgKDs7KSB7CisJCWVudW0gZGVjb2RlX3R5cGUgdHlwZSA9IGgtPnR5cGVfcmVncy5iaXRzICYgREVDT0RFX1RZUEVfTUFTSzsKKworCQlpZiAodHlwZSA9PSBERUNPREVfVFlQRV9FTkQpCisJCQlyZXR1cm4gMDsKKworCQlyZXN1bHQgPSBmbihoLCBhcmdzKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJaCA9IChzdHJ1Y3QgZGVjb2RlX2hlYWRlciAqKQorCQkJKCh1aW50cHRyX3QpaCArIGRlY29kZV9zdHJ1Y3Rfc2l6ZXNbdHlwZV0pOworCisJfQorfQorCitzdGF0aWMgaW50IHRhYmxlX3Rlc3RfZmFpbChjb25zdCBzdHJ1Y3QgZGVjb2RlX2hlYWRlciAqaCwgY29uc3QgY2hhciogbWVzc2FnZSkKK3sKKworCXByX2VycigiRkFJTDoga3Byb2JlcyB0ZXN0IGZhaWx1cmUgXCIlc1wiIChtYXNrICUwOHgsIHZhbHVlICUwOHgpXG4iLAorCQkJCQltZXNzYWdlLCBoLT5tYXNrLmJpdHMsIGgtPnZhbHVlLmJpdHMpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdHJ1Y3QgdGFibGVfdGVzdF9hcmdzIHsKKwljb25zdCB1bmlvbiBkZWNvZGVfaXRlbSAqcm9vdF90YWJsZTsKKwl1MzIJCQlwYXJlbnRfbWFzazsKKwl1MzIJCQlwYXJlbnRfdmFsdWU7Cit9OworCitzdGF0aWMgaW50IHRhYmxlX3Rlc3RfZm4oY29uc3Qgc3RydWN0IGRlY29kZV9oZWFkZXIgKmgsIHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IHRhYmxlX3Rlc3RfYXJncyAqYSA9IChzdHJ1Y3QgdGFibGVfdGVzdF9hcmdzICopYXJnczsKKwllbnVtIGRlY29kZV90eXBlIHR5cGUgPSBoLT50eXBlX3JlZ3MuYml0cyAmIERFQ09ERV9UWVBFX01BU0s7CisKKwlpZiAoaC0+dmFsdWUuYml0cyAmIH5oLT5tYXNrLmJpdHMpCisJCXJldHVybiB0YWJsZV90ZXN0X2ZhaWwoaCwgIk1hdGNoIHZhbHVlIGhhcyBiaXRzIG5vdCBpbiBtYXNrIik7CisKKwlpZiAoKGgtPm1hc2suYml0cyAmIGEtPnBhcmVudF9tYXNrKSAhPSBhLT5wYXJlbnRfbWFzaykKKwkJcmV0dXJuIHRhYmxlX3Rlc3RfZmFpbChoLCAiTWFzayBoYXMgYml0cyBub3QgaW4gcGFyZW50IG1hc2siKTsKKworCWlmICgoaC0+dmFsdWUuYml0cyBeIGEtPnBhcmVudF92YWx1ZSkgJiBhLT5wYXJlbnRfbWFzaykKKwkJcmV0dXJuIHRhYmxlX3Rlc3RfZmFpbChoLCAiVmFsdWUgaXMgaW5jb25zaXN0ZW50IHdpdGggcGFyZW50Iik7CisKKwlpZiAodHlwZSA9PSBERUNPREVfVFlQRV9UQUJMRSkgeworCQlzdHJ1Y3QgZGVjb2RlX3RhYmxlICpkID0gKHN0cnVjdCBkZWNvZGVfdGFibGUgKiloOworCQlzdHJ1Y3QgdGFibGVfdGVzdF9hcmdzIGFyZ3MyID0gKmE7CisJCWFyZ3MyLnBhcmVudF9tYXNrID0gaC0+bWFzay5iaXRzOworCQlhcmdzMi5wYXJlbnRfdmFsdWUgPSBoLT52YWx1ZS5iaXRzOworCQlyZXR1cm4gdGFibGVfaXRlcihkLT50YWJsZS50YWJsZSwgdGFibGVfdGVzdF9mbiwgJmFyZ3MyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YWJsZV90ZXN0KGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtICp0YWJsZSkKK3sKKwlzdHJ1Y3QgdGFibGVfdGVzdF9hcmdzIGFyZ3MgPSB7CisJCS5yb290X3RhYmxlCT0gdGFibGUsCisJCS5wYXJlbnRfbWFzawk9IDAsCisJCS5wYXJlbnRfdmFsdWUJPSAwCisJfTsKKwlyZXR1cm4gdGFibGVfaXRlcihhcmdzLnJvb3RfdGFibGUsIHRhYmxlX3Rlc3RfZm4sICZhcmdzKTsKK30KKworCisvKgorICogRGVjb2RpbmcgdGFibGUgdGVzdCBjb3ZlcmFnZSBhbmFseXNpcworICoKKyAqIGNvdmVyYWdlX3N0YXJ0KCkgYnVpbGRzIGEgY292ZXJhZ2VfdGFibGUgd2hpY2ggY29udGFpbnMgYSBsaXN0IG9mCisgKiBjb3ZlcmFnZV9lbnRyeSdzIHRvIG1hdGNoIGVhY2ggZW50cnkgaW4gdGhlIHNwZWNpZmllZCBrcHJvYmVzIGluc3RydWN0aW9uCisgKiBkZWNvZGluZyB0YWJsZS4KKyAqCisgKiBXaGVuIHRlc3QgY2FzZXMgYXJlIHJ1biwgY292ZXJhZ2VfYWRkKCkgaXMgY2FsbGVkIHRvIHByb2Nlc3MgZWFjaCBjYXNlLgorICogVGhpcyBsb29rcyB1cCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgY292ZXJhZ2VfdGFibGUgYW5kIHNldHMgaXQgYXMKKyAqIGJlaW5nIG1hdGNoZWQsIGFzIHdlbGwgYXMgY2xlYXJpbmcgdGhlIHJlZ3MgZmxhZyBhcHByb3ByaWF0ZSBmb3IgdGhlIHRlc3QuCisgKgorICogQWZ0ZXIgYWxsIHRlc3QgY2FzZXMgaGF2ZSBiZWVuIHJ1biwgY292ZXJhZ2VfZW5kKCkgaXMgY2FsbGVkIHRvIGNoZWNrIHRoYXQKKyAqIGFsbCBlbnRyaWVzIGluIGNvdmVyYWdlX3RhYmxlIGhhdmUgYmVlbiBtYXRjaGVkIGFuZCB0aGF0IGFsbCByZWdzIGZsYWdzIGFyZQorICogY2xlYXJlZC4gSS5lLiB0aGF0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJlZCBieQorICogdGhlIGtwcm9iZXMgZGVjb2RpbmcgdGFibGVzIGhhdmUgaGFkIGEgdGVzdCBjYXNlIGV4ZWN1dGVkIGZvciB0aGVtLgorICovCisKK2Jvb2wgY292ZXJhZ2VfZmFpbDsKKworI2RlZmluZSBNQVhfQ09WRVJBR0VfRU5UUklFUyAyNTYKKworc3RydWN0IGNvdmVyYWdlX2VudHJ5IHsKKwljb25zdCBzdHJ1Y3QgZGVjb2RlX2hlYWRlcgkqaGVhZGVyOworCXVuc2lnbmVkCQkJcmVnczsKKwl1bnNpZ25lZAkJCW5lc3Rpbmc7CisJY2hhcgkJCQltYXRjaGVkOworfTsKKworc3RydWN0IGNvdmVyYWdlX3RhYmxlIHsKKwlzdHJ1Y3QgY292ZXJhZ2VfZW50cnkJKmJhc2U7CisJdW5zaWduZWQJCW51bV9lbnRyaWVzOworCXVuc2lnbmVkCQluZXN0aW5nOworfTsKKworc3RydWN0IGNvdmVyYWdlX3RhYmxlIGNvdmVyYWdlOworCisjZGVmaW5lIENPVkVSQUdFX0FOWV9SRUcJKDE8PDApCisjZGVmaW5lIENPVkVSQUdFX1NQCQkoMTw8MSkKKyNkZWZpbmUgQ09WRVJBR0VfUEMJCSgxPDwyKQorI2RlZmluZSBDT1ZFUkFHRV9QQ1dCCQkoMTw8MykKKworc3RhdGljIGNvbnN0IGNoYXIgY292ZXJhZ2VfcmVnaXN0ZXJfbG9va3VwWzE2XSA9IHsKKwlbUkVHX1RZUEVfQU5ZXQkJPSBDT1ZFUkFHRV9BTllfUkVHIHwgQ09WRVJBR0VfU1AgfCBDT1ZFUkFHRV9QQywKKwlbUkVHX1RZUEVfU0FNRUFTMTZdCT0gQ09WRVJBR0VfQU5ZX1JFRywKKwlbUkVHX1RZUEVfU1BdCQk9IENPVkVSQUdFX1NQLAorCVtSRUdfVFlQRV9QQ10JCT0gQ09WRVJBR0VfUEMsCisJW1JFR19UWVBFX05PU1BdCQk9IENPVkVSQUdFX0FOWV9SRUcgfCBDT1ZFUkFHRV9TUCwKKwlbUkVHX1RZUEVfTk9TUFBDXQk9IENPVkVSQUdFX0FOWV9SRUcgfCBDT1ZFUkFHRV9TUCB8IENPVkVSQUdFX1BDLAorCVtSRUdfVFlQRV9OT1BDXQkJPSBDT1ZFUkFHRV9BTllfUkVHIHwgQ09WRVJBR0VfUEMsCisJW1JFR19UWVBFX05PUENXQl0JPSBDT1ZFUkFHRV9BTllfUkVHIHwgQ09WRVJBR0VfUEMgfCBDT1ZFUkFHRV9QQ1dCLAorCVtSRUdfVFlQRV9OT1BDWF0JPSBDT1ZFUkFHRV9BTllfUkVHLAorCVtSRUdfVFlQRV9OT1NQUENYXQk9IENPVkVSQUdFX0FOWV9SRUcgfCBDT1ZFUkFHRV9TUCwKK307CisKK3Vuc2lnbmVkIGNvdmVyYWdlX3N0YXJ0X3JlZ2lzdGVycyhjb25zdCBzdHJ1Y3QgZGVjb2RlX2hlYWRlciAqaCkKK3sKKwl1bnNpZ25lZCByZWdzID0gMDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkgKz0gNCkgeworCQlpbnQgciA9IChoLT50eXBlX3JlZ3MuYml0cyA+PiAoREVDT0RFX1RZUEVfQklUUyArIGkpKSAmIDB4ZjsKKwkJcmVncyB8PSBjb3ZlcmFnZV9yZWdpc3Rlcl9sb29rdXBbcl0gPDwgaTsKKwl9CisJcmV0dXJuIHJlZ3M7Cit9CisKK3N0YXRpYyBpbnQgY292ZXJhZ2Vfc3RhcnRfZm4oY29uc3Qgc3RydWN0IGRlY29kZV9oZWFkZXIgKmgsIHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IGNvdmVyYWdlX3RhYmxlICpjb3ZlcmFnZSA9IChzdHJ1Y3QgY292ZXJhZ2VfdGFibGUgKilhcmdzOworCWVudW0gZGVjb2RlX3R5cGUgdHlwZSA9IGgtPnR5cGVfcmVncy5iaXRzICYgREVDT0RFX1RZUEVfTUFTSzsKKwlzdHJ1Y3QgY292ZXJhZ2VfZW50cnkgKmVudHJ5ID0gY292ZXJhZ2UtPmJhc2UgKyBjb3ZlcmFnZS0+bnVtX2VudHJpZXM7CisKKwlpZiAoY292ZXJhZ2UtPm51bV9lbnRyaWVzID09IE1BWF9DT1ZFUkFHRV9FTlRSSUVTIC0gMSkgeworCQlwcl9lcnIoIkZBSUw6IE91dCBvZiBzcGFjZSBmb3IgdGVzdCBjb3ZlcmFnZSBkYXRhIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCSsrY292ZXJhZ2UtPm51bV9lbnRyaWVzOworCisJZW50cnktPmhlYWRlciA9IGg7CisJZW50cnktPnJlZ3MgPSBjb3ZlcmFnZV9zdGFydF9yZWdpc3RlcnMoaCk7CisJZW50cnktPm5lc3RpbmcgPSBjb3ZlcmFnZS0+bmVzdGluZzsKKwllbnRyeS0+bWF0Y2hlZCA9IGZhbHNlOworCisJaWYgKHR5cGUgPT0gREVDT0RFX1RZUEVfVEFCTEUpIHsKKwkJc3RydWN0IGRlY29kZV90YWJsZSAqZCA9IChzdHJ1Y3QgZGVjb2RlX3RhYmxlICopaDsKKwkJaW50IHJldDsKKwkJKytjb3ZlcmFnZS0+bmVzdGluZzsKKwkJcmV0ID0gdGFibGVfaXRlcihkLT50YWJsZS50YWJsZSwgY292ZXJhZ2Vfc3RhcnRfZm4sIGNvdmVyYWdlKTsKKwkJLS1jb3ZlcmFnZS0+bmVzdGluZzsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3ZlcmFnZV9zdGFydChjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSAqdGFibGUpCit7CisJY292ZXJhZ2UuYmFzZSA9IGttYWxsb2MoTUFYX0NPVkVSQUdFX0VOVFJJRVMgKgorCQkJCXNpemVvZihzdHJ1Y3QgY292ZXJhZ2VfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwljb3ZlcmFnZS5udW1fZW50cmllcyA9IDA7CisJY292ZXJhZ2UubmVzdGluZyA9IDA7CisJcmV0dXJuIHRhYmxlX2l0ZXIodGFibGUsIGNvdmVyYWdlX3N0YXJ0X2ZuLCAmY292ZXJhZ2UpOworfQorCitzdGF0aWMgdm9pZAorY292ZXJhZ2VfYWRkX3JlZ2lzdGVycyhzdHJ1Y3QgY292ZXJhZ2VfZW50cnkgKmVudHJ5LCBrcHJvYmVfb3Bjb2RlX3QgaW5zbikKK3sKKwlpbnQgcmVncyA9IGVudHJ5LT5oZWFkZXItPnR5cGVfcmVncy5iaXRzID4+IERFQ09ERV9UWVBFX0JJVFM7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDIwOyBpICs9IDQpIHsKKwkJZW51bSBkZWNvZGVfcmVnX3R5cGUgcmVnX3R5cGUgPSAocmVncyA+PiBpKSAmIDB4ZjsKKwkJaW50IHJlZyA9IChpbnNuID4+IGkpICYgMHhmOworCQlpbnQgZmxhZzsKKworCQlpZiAoIXJlZ190eXBlKQorCQkJY29udGludWU7CisKKwkJaWYgKHJlZyA9PSAxMykKKwkJCWZsYWcgPSBDT1ZFUkFHRV9TUDsKKwkJZWxzZSBpZiAocmVnID09IDE1KQorCQkJZmxhZyA9IENPVkVSQUdFX1BDOworCQllbHNlCisJCQlmbGFnID0gQ09WRVJBR0VfQU5ZX1JFRzsKKwkJZW50cnktPnJlZ3MgJj0gfihmbGFnIDw8IGkpOworCisJCXN3aXRjaCAocmVnX3R5cGUpIHsKKworCQljYXNlIFJFR19UWVBFX05PTkU6CisJCWNhc2UgUkVHX1RZUEVfQU5ZOgorCQljYXNlIFJFR19UWVBFX1NBTUVBUzE2OgorCQkJYnJlYWs7CisKKwkJY2FzZSBSRUdfVFlQRV9TUDoKKwkJCWlmIChyZWcgIT0gMTMpCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUdfVFlQRV9QQzoKKwkJCWlmIChyZWcgIT0gMTUpCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUdfVFlQRV9OT1NQOgorCQkJaWYgKHJlZyA9PSAxMykKKwkJCQlyZXR1cm47CisJCQlicmVhazsKKworCQljYXNlIFJFR19UWVBFX05PU1BQQzoKKwkJY2FzZSBSRUdfVFlQRV9OT1NQUENYOgorCQkJaWYgKHJlZyA9PSAxMyB8fCByZWcgPT0gMTUpCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUdfVFlQRV9OT1BDV0I6CisJCQlpZiAoIWlzX3dyaXRlYmFjayhpbnNuKSkKKwkJCQlicmVhazsKKwkJCWlmIChyZWcgPT0gMTUpIHsKKwkJCQllbnRyeS0+cmVncyAmPSB+KENPVkVSQUdFX1BDV0IgPDwgaSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSRUdfVFlQRV9OT1BDOgorCQljYXNlIFJFR19UWVBFX05PUENYOgorCQkJaWYgKHJlZyA9PSAxNSkKKwkJCQlyZXR1cm47CisJCQlicmVhazsKKwkJfQorCisJfQorfQorCitzdGF0aWMgdm9pZCBjb3ZlcmFnZV9hZGQoa3Byb2JlX29wY29kZV90IGluc24pCit7CisJc3RydWN0IGNvdmVyYWdlX2VudHJ5ICplbnRyeSA9IGNvdmVyYWdlLmJhc2U7CisJc3RydWN0IGNvdmVyYWdlX2VudHJ5ICplbmQgPSBjb3ZlcmFnZS5iYXNlICsgY292ZXJhZ2UubnVtX2VudHJpZXM7CisJYm9vbCBtYXRjaGVkID0gZmFsc2U7CisJdW5zaWduZWQgbmVzdGluZyA9IDA7CisKKwlmb3IgKDsgZW50cnkgPCBlbmQ7ICsrZW50cnkpIHsKKwkJY29uc3Qgc3RydWN0IGRlY29kZV9oZWFkZXIgKmggPSBlbnRyeS0+aGVhZGVyOworCQllbnVtIGRlY29kZV90eXBlIHR5cGUgPSBoLT50eXBlX3JlZ3MuYml0cyAmIERFQ09ERV9UWVBFX01BU0s7CisKKwkJaWYgKGVudHJ5LT5uZXN0aW5nID4gbmVzdGluZykKKwkJCWNvbnRpbnVlOyAvKiBTa2lwIHN1Yi10YWJsZSB3ZSBkaWRuJ3QgbWF0Y2ggKi8KKworCQlpZiAoZW50cnktPm5lc3RpbmcgPCBuZXN0aW5nKQorCQkJYnJlYWs7IC8qIEVuZCBvZiBzdWItdGFibGUgd2Ugd2VyZSBzY2FubmluZyAqLworCisJCWlmICghbWF0Y2hlZCkgeworCQkJaWYgKChpbnNuICYgaC0+bWFzay5iaXRzKSAhPSBoLT52YWx1ZS5iaXRzKQorCQkJCWNvbnRpbnVlOworCQkJZW50cnktPm1hdGNoZWQgPSB0cnVlOworCQl9CisKKwkJc3dpdGNoICh0eXBlKSB7CisKKwkJY2FzZSBERUNPREVfVFlQRV9UQUJMRToKKwkJCSsrbmVzdGluZzsKKwkJCWJyZWFrOworCisJCWNhc2UgREVDT0RFX1RZUEVfQ1VTVE9NOgorCQljYXNlIERFQ09ERV9UWVBFX1NJTVVMQVRFOgorCQljYXNlIERFQ09ERV9UWVBFX0VNVUxBVEU6CisJCQljb3ZlcmFnZV9hZGRfcmVnaXN0ZXJzKGVudHJ5LCBpbnNuKTsKKwkJCXJldHVybjsKKworCQljYXNlIERFQ09ERV9UWVBFX09SOgorCQkJbWF0Y2hlZCA9IHRydWU7CisJCQlicmVhazsKKworCQljYXNlIERFQ09ERV9UWVBFX1JFSkVDVDoKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwkJfQorCisJfQorfQorCitzdGF0aWMgdm9pZCBjb3ZlcmFnZV9lbmQodm9pZCkKK3sKKwlzdHJ1Y3QgY292ZXJhZ2VfZW50cnkgKmVudHJ5ID0gY292ZXJhZ2UuYmFzZTsKKwlzdHJ1Y3QgY292ZXJhZ2VfZW50cnkgKmVuZCA9IGNvdmVyYWdlLmJhc2UgKyBjb3ZlcmFnZS5udW1fZW50cmllczsKKworCWZvciAoOyBlbnRyeSA8IGVuZDsgKytlbnRyeSkgeworCQl1MzIgbWFzayA9IGVudHJ5LT5oZWFkZXItPm1hc2suYml0czsKKwkJdTMyIHZhbHVlID0gZW50cnktPmhlYWRlci0+dmFsdWUuYml0czsKKworCQlpZiAoZW50cnktPnJlZ3MpIHsKKwkJCXByX2VycigiRkFJTDogUmVnaXN0ZXIgdGVzdCBjb3ZlcmFnZSBtaXNzaW5nIGZvciAlMDh4ICUwOHggKCUwNXgpXG4iLAorCQkJCW1hc2ssIHZhbHVlLCBlbnRyeS0+cmVncyk7CisJCQljb3ZlcmFnZV9mYWlsID0gdHJ1ZTsKKwkJfQorCQlpZiAoIWVudHJ5LT5tYXRjaGVkKSB7CisJCQlwcl9lcnIoIkZBSUw6IFRlc3QgY292ZXJhZ2UgZW50cnkgbWlzc2luZyBmb3IgJTA4eCAlMDh4XG4iLAorCQkJCW1hc2ssIHZhbHVlKTsKKwkJCWNvdmVyYWdlX2ZhaWwgPSB0cnVlOworCQl9CisJfQorCisJa2ZyZWUoY292ZXJhZ2UuYmFzZSk7Cit9CisKKworLyoKKyAqIEZyYW1ld29yayBmb3IgaW5zdHJ1Y3Rpb24gc2V0IHRlc3QgY2FzZXMKKyAqLworCit2b2lkIF9fbmFrZWQgX19rcHJvYmVzX3Rlc3RfY2FzZV9zdGFydCh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJInN0bWRiCXNwISwge3I0LXIxMX0JCQkJXG5cdCIKKwkJInN1YglzcCwgc3AsICMiX19zdHJpbmdpZnkoVEVTVF9NRU1PUllfU0laRSkiXG5cdCIKKwkJImJpYwlyMCwgbHIsICMxICBAIHIwID0gaW5saW5lIHRpdGxlIHN0cmluZwlcblx0IgorCQkibW92CXIxLCBzcAkJCQkJXG5cdCIKKwkJImJsCWtwcm9iZXNfdGVzdF9jYXNlX3N0YXJ0CQkJXG5cdCIKKwkJImJ4CXIwCQkJCQlcblx0IgorCSk7Cit9CisKKyNpZm5kZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwordm9pZCBfX25ha2VkIF9fa3Byb2Jlc190ZXN0X2Nhc2VfZW5kXzMyKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkibW92CXI0LCBscgkJCQkJXG5cdCIKKwkJImJsCWtwcm9iZXNfdGVzdF9jYXNlX2VuZAkJCVxuXHQiCisJCSJjbXAJcjAsICMwCQkJCQlcblx0IgorCQkibW92bmUJcGMsIHIwCQkJCQlcblx0IgorCQkibW92CXIwLCByNAkJCQkJXG5cdCIKKwkJImFkZAlzcCwgc3AsICMiX19zdHJpbmdpZnkoVEVTVF9NRU1PUllfU0laRSkiXG5cdCIKKwkJImxkbWlhCXNwISwge3I0LXIxMX0JCQkJXG5cdCIKKwkJIm1vdglwYywgcjAJCQkJCVxuXHQiCisJKTsKK30KKworI2Vsc2UgLyogQ09ORklHX1RIVU1CMl9LRVJORUwgKi8KKwordm9pZCBfX25ha2VkIF9fa3Byb2Jlc190ZXN0X2Nhc2VfZW5kXzE2KHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkibW92CXI0LCBscgkJCQkJXG5cdCIKKwkJImJsCWtwcm9iZXNfdGVzdF9jYXNlX2VuZAkJCVxuXHQiCisJCSJjbXAJcjAsICMwCQkJCQlcblx0IgorCQkiYnhuZQlyMAkJCQkJXG5cdCIKKwkJIm1vdglyMCwgcjQJCQkJCVxuXHQiCisJCSJhZGQJc3AsIHNwLCAjIl9fc3RyaW5naWZ5KFRFU1RfTUVNT1JZX1NJWkUpIlxuXHQiCisJCSJsZG1pYQlzcCEsIHtyNC1yMTF9CQkJCVxuXHQiCisJCSJieAlyMAkJCQkJXG5cdCIKKwkpOworfQorCit2b2lkIF9fbmFrZWQgX19rcHJvYmVzX3Rlc3RfY2FzZV9lbmRfMzIodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIuYXJtCQkJCQkJXG5cdCIKKwkJIm9ycglsciwgbHIsICMxICBAIHdpbGwgcmV0dXJuIHRvIFRodW1iIGNvZGUJXG5cdCIKKwkJImxkcglwYywgMWYJCQkJCVxuXHQiCisJCSIxOgkJCQkJCVxuXHQiCisJCSIud29yZAlfX2twcm9iZXNfdGVzdF9jYXNlX2VuZF8xNgkJXG5cdCIKKwkpOworfQorCisjZW5kaWYKKworCitpbnQga3Byb2JlX3Rlc3RfZmxhZ3M7CitpbnQga3Byb2JlX3Rlc3RfY2NfcG9zaXRpb247CisKK3N0YXRpYyBpbnQgdGVzdF90cnlfY291bnQ7CitzdGF0aWMgaW50IHRlc3RfcGFzc19jb3VudDsKK3N0YXRpYyBpbnQgdGVzdF9mYWlsX2NvdW50OworCitzdGF0aWMgc3RydWN0IHB0X3JlZ3MgaW5pdGlhbF9yZWdzOworc3RhdGljIHN0cnVjdCBwdF9yZWdzIGV4cGVjdGVkX3JlZ3M7CitzdGF0aWMgc3RydWN0IHB0X3JlZ3MgcmVzdWx0X3JlZ3M7CisKK3N0YXRpYyB1MzIgZXhwZWN0ZWRfbWVtb3J5W1RFU1RfTUVNT1JZX1NJWkUvc2l6ZW9mKHUzMildOworCitzdGF0aWMgY29uc3QgY2hhciAqY3VycmVudF90aXRsZTsKK3N0YXRpYyBzdHJ1Y3QgdGVzdF9hcmcgKmN1cnJlbnRfYXJnczsKK3N0YXRpYyB1MzIgKmN1cnJlbnRfc3RhY2s7CitzdGF0aWMgdWludHB0cl90IGN1cnJlbnRfYnJhbmNoX3RhcmdldDsKKworc3RhdGljIHVpbnRwdHJfdCBjdXJyZW50X2NvZGVfc3RhcnQ7CitzdGF0aWMga3Byb2JlX29wY29kZV90IGN1cnJlbnRfaW5zdHJ1Y3Rpb247CisKKworI2RlZmluZSBURVNUX0NBU0VfUEFTU0VEIC0xCisjZGVmaW5lIFRFU1RfQ0FTRV9GQUlMRUQgLTIKKworc3RhdGljIGludCB0ZXN0X2Nhc2VfcnVuX2NvdW50Oworc3RhdGljIGJvb2wgdGVzdF9jYXNlX2lzX3RodW1iOworc3RhdGljIGludCB0ZXN0X2luc3RhbmNlOworCisvKgorICogV2UgaWdub3JlIHRoZSBzdGF0ZSBvZiB0aGUgaW1wcmVjaXNlIGFib3J0IGRpc2FibGUgZmxhZyAoQ1BTUi5BKSBiZWNhdXNlIHRoaXMKKyAqIGNhbiBjaGFuZ2UgcmFuZG9tbHkgYXMgdGhlIGtlcm5lbCBkb2Vzbid0IHRha2UgY2FyZSB0byBwcmVzZXJ2ZSBvciBpbml0aWFsaXNlCisgKiB0aGlzIGFjcm9zcyBjb250ZXh0IHN3aXRjaGVzLiBBbHNvLCB3aXRoIFNlY3VyaXR5IEV4dGVudGlvbnMsIHRoZSBmbGFnIG1heQorICogbm90IGJlIHVuZGVyIGNvbnRyb2wgb2YgdGhlIGtlcm5lbDsgZm9yIHRoaXMgcmVhc29uIHdlIGlnbm9yZSB0aGUgc3RhdGUgb2YKKyAqIHRoZSBGSVEgZGlzYWJsZSBmbGFnIENQU1IuRiBhcyB3ZWxsLgorICovCisjZGVmaW5lIFBTUl9JR05PUkVfQklUUyAoUFNSX0FfQklUIHwgUFNSX0ZfQklUKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0ZXN0X2NoZWNrX2NjKGludCBjYywgdW5zaWduZWQgbG9uZyBjcHNyKQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKworCXN3aXRjaCAoY2MpIHsKKwljYXNlIDB4MDogLyogZXEgKi8KKwkJcmV0dXJuIGNwc3IgJiBQU1JfWl9CSVQ7CisKKwljYXNlIDB4MTogLyogbmUgKi8KKwkJcmV0dXJuICh+Y3BzcikgJiBQU1JfWl9CSVQ7CisKKwljYXNlIDB4MjogLyogY3MgKi8KKwkJcmV0dXJuIGNwc3IgJiBQU1JfQ19CSVQ7CisKKwljYXNlIDB4MzogLyogY2MgKi8KKwkJcmV0dXJuICh+Y3BzcikgJiBQU1JfQ19CSVQ7CisKKwljYXNlIDB4NDogLyogbWkgKi8KKwkJcmV0dXJuIGNwc3IgJiBQU1JfTl9CSVQ7CisKKwljYXNlIDB4NTogLyogcGwgKi8KKwkJcmV0dXJuICh+Y3BzcikgJiBQU1JfTl9CSVQ7CisKKwljYXNlIDB4NjogLyogdnMgKi8KKwkJcmV0dXJuIGNwc3IgJiBQU1JfVl9CSVQ7CisKKwljYXNlIDB4NzogLyogdmMgKi8KKwkJcmV0dXJuICh+Y3BzcikgJiBQU1JfVl9CSVQ7CisKKwljYXNlIDB4ODogLyogaGkgKi8KKwkJY3BzciAmPSB+KGNwc3IgPj4gMSk7IC8qIFBTUl9DX0JJVCAmPSB+UFNSX1pfQklUICovCisJCXJldHVybiBjcHNyICYgUFNSX0NfQklUOworCisJY2FzZSAweDk6IC8qIGxzICovCisJCWNwc3IgJj0gfihjcHNyID4+IDEpOyAvKiBQU1JfQ19CSVQgJj0gflBTUl9aX0JJVCAqLworCQlyZXR1cm4gKH5jcHNyKSAmIFBTUl9DX0JJVDsKKworCWNhc2UgMHhhOiAvKiBnZSAqLworCQljcHNyIF49IChjcHNyIDw8IDMpOyAvKiBQU1JfTl9CSVQgXj0gUFNSX1ZfQklUICovCisJCXJldHVybiAofmNwc3IpICYgUFNSX05fQklUOworCisJY2FzZSAweGI6IC8qIGx0ICovCisJCWNwc3IgXj0gKGNwc3IgPDwgMyk7IC8qIFBTUl9OX0JJVCBePSBQU1JfVl9CSVQgKi8KKwkJcmV0dXJuIGNwc3IgJiBQU1JfTl9CSVQ7CisKKwljYXNlIDB4YzogLyogZ3QgKi8KKwkJdGVtcCA9IGNwc3IgXiAoY3BzciA8PCAzKTsgLyogUFNSX05fQklUIF49IFBTUl9WX0JJVCAqLworCQl0ZW1wIHw9IChjcHNyIDw8IDEpOwkgICAvKiBQU1JfTl9CSVQgfD0gUFNSX1pfQklUICovCisJCXJldHVybiAofnRlbXApICYgUFNSX05fQklUOworCisJY2FzZSAweGQ6IC8qIGxlICovCisJCXRlbXAgPSBjcHNyIF4gKGNwc3IgPDwgMyk7IC8qIFBTUl9OX0JJVCBePSBQU1JfVl9CSVQgKi8KKwkJdGVtcCB8PSAoY3BzciA8PCAxKTsJICAgLyogUFNSX05fQklUIHw9IFBTUl9aX0JJVCAqLworCQlyZXR1cm4gdGVtcCAmIFBTUl9OX0JJVDsKKworCWNhc2UgMHhlOiAvKiBhbCAqLworCWNhc2UgMHhmOiAvKiB1bmNvbmRpdGlvbmFsICovCisJCXJldHVybiB0cnVlOworCX0KKwlCVUcoKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgaXNfbGFzdF9zY2VuYXJpbzsKK3N0YXRpYyBpbnQgcHJvYmVfc2hvdWxkX3J1bjsgLyogMCA9IG5vLCAxID0geWVzLCAtMSA9IHVua25vd24gKi8KK3N0YXRpYyBpbnQgbWVtb3J5X25lZWRzX2NoZWNraW5nOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0ZXN0X2NvbnRleHRfY3BzcihpbnQgc2NlbmFyaW8pCit7CisJdW5zaWduZWQgbG9uZyBjcHNyOworCisJcHJvYmVfc2hvdWxkX3J1biA9IDE7CisKKwkvKiBEZWZhdWx0IGNhc2UgaXMgdGhhdCB3ZSBjeWNsZSB0aHJvdWdoIDE2IGNvbWJpbmF0aW9ucyBvZiBmbGFncyAqLworCWNwc3IgID0gKHNjZW5hcmlvICYgMHhmKSA8PCAyODsgLyogTixaLEMsViBmbGFncyAqLworCWNwc3IgfD0gKHNjZW5hcmlvICYgMHhmKSA8PCAxNjsgLyogR0UgZmxhZ3MgKi8KKwljcHNyIHw9IChzY2VuYXJpbyAmIDB4MSkgPDwgMjc7IC8qIFRvZ2dsZSBRIGZsYWcgKi8KKworCWlmICghdGVzdF9jYXNlX2lzX3RodW1iKSB7CisJCS8qIFRlc3RpbmcgQVJNIGNvZGUgKi8KKwkJcHJvYmVfc2hvdWxkX3J1biA9IHRlc3RfY2hlY2tfY2MoY3VycmVudF9pbnN0cnVjdGlvbiA+PiAyOCwgY3BzcikgIT0gMDsKKwkJaWYgKHNjZW5hcmlvID09IDE1KQorCQkJaXNfbGFzdF9zY2VuYXJpbyA9IHRydWU7CisKKwl9IGVsc2UgaWYgKGtwcm9iZV90ZXN0X2ZsYWdzICYgVEVTVF9GTEFHX05PX0lUQkxPQ0spIHsKKwkJLyogVGVzdGluZyBUaHVtYiBjb2RlIHdpdGhvdXQgc2V0dGluZyBJVFNUQVRFICovCisJCWlmIChrcHJvYmVfdGVzdF9jY19wb3NpdGlvbikgeworCQkJaW50IGNjID0gKGN1cnJlbnRfaW5zdHJ1Y3Rpb24gPj4ga3Byb2JlX3Rlc3RfY2NfcG9zaXRpb24pICYgMHhmOworCQkJcHJvYmVfc2hvdWxkX3J1biA9IHRlc3RfY2hlY2tfY2MoY2MsIGNwc3IpICE9IDA7CisJCX0KKworCQlpZiAoc2NlbmFyaW8gPT0gMTUpCisJCQlpc19sYXN0X3NjZW5hcmlvID0gdHJ1ZTsKKworCX0gZWxzZSBpZiAoa3Byb2JlX3Rlc3RfZmxhZ3MgJiBURVNUX0ZMQUdfRlVMTF9JVEJMT0NLKSB7CisJCS8qIFRlc3RpbmcgVGh1bWIgY29kZSB3aXRoIGFsbCBjb21iaW5hdGlvbnMgb2YgSVRTVEFURSAqLworCQl1bnNpZ25lZCB4ID0gKHNjZW5hcmlvID4+IDQpOworCQl1bnNpZ25lZCBjb25kX2Jhc2UgPSB4ICUgNzsgLyogSVRTVEFURTw3OjU+ICovCisJCXVuc2lnbmVkIG1hc2sgPSB4IC8gNyArIDI7ICAvKiBJVFNUQVRFPDQ6MD4sIGJpdHMgcmV2ZXJzZWQgKi8KKworCQlpZiAobWFzayA+IDB4MWYpIHsKKwkJCS8qIEZpbmlzaCBieSB0ZXN0aW5nIHN0YXRlIGZyb20gaW5zdHJ1Y3Rpb24gJ2l0dCBhbCcgKi8KKwkJCWNvbmRfYmFzZSA9IDc7CisJCQltYXNrID0gMHg0OworCQkJaWYgKChzY2VuYXJpbyAmIDB4ZikgPT0gMHhmKQorCQkJCWlzX2xhc3Rfc2NlbmFyaW8gPSB0cnVlOworCQl9CisKKwkJY3BzciB8PSBjb25kX2Jhc2UgPDwgMTM7CS8qIElUU1RBVEU8Nzo1PiAqLworCQljcHNyIHw9IChtYXNrICYgMHgxKSA8PCAxMjsJLyogSVRTVEFURTw0PiAqLworCQljcHNyIHw9IChtYXNrICYgMHgyKSA8PCAxMDsJLyogSVRTVEFURTwzPiAqLworCQljcHNyIHw9IChtYXNrICYgMHg0KSA8PCA4OwkvKiBJVFNUQVRFPDI+ICovCisJCWNwc3IgfD0gKG1hc2sgJiAweDgpIDw8IDIzOwkvKiBJVFNUQVRFPDE+ICovCisJCWNwc3IgfD0gKG1hc2sgJiAweDEwKSA8PCAyMTsJLyogSVRTVEFURTwwPiAqLworCisJCXByb2JlX3Nob3VsZF9ydW4gPSB0ZXN0X2NoZWNrX2NjKChjcHNyID4+IDEyKSAmIDB4ZiwgY3BzcikgIT0gMDsKKworCX0gZWxzZSB7CisJCS8qIFRlc3RpbmcgVGh1bWIgY29kZSB3aXRoIHNldmVyYWwgY29tYmluYXRpb25zIG9mIElUU1RBVEUgKi8KKwkJc3dpdGNoIChzY2VuYXJpbykgeworCQljYXNlIDE2OiAvKiBDbGVhciBOWkNWIGZsYWdzIGFuZCAnaXQgZXEnIHN0YXRlIChmYWxzZSBhcyBaPTApICovCisJCQljcHNyID0gMHgwMDAwMDgwMDsKKwkJCXByb2JlX3Nob3VsZF9ydW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMTc6IC8qIFNldCBOWkNWIGZsYWdzIGFuZCAnaXQgdmMnIHN0YXRlIChmYWxzZSBhcyBWPTEpICovCisJCQljcHNyID0gMHhmMDAwNzgwMDsKKwkJCXByb2JlX3Nob3VsZF9ydW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMTg6IC8qIENsZWFyIE5aQ1YgZmxhZ3MgYW5kICdpdCBscycgc3RhdGUgKHRydWUgYXMgQz0wKSAqLworCQkJY3BzciA9IDB4MDAwMDk4MDA7CisJCQlicmVhazsKKwkJY2FzZSAxOTogLyogU2V0IE5aQ1YgZmxhZ3MgYW5kICdpdCBjcycgc3RhdGUgKHRydWUgYXMgQz0xKSAqLworCQkJY3BzciA9IDB4ZjAwMDI4MDA7CisJCQlpc19sYXN0X3NjZW5hcmlvID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGNwc3I7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3Rlc3RfY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgc2NlbmFyaW8gPSB0ZXN0X2Nhc2VfcnVuX2NvdW50Pj4xOworCXVuc2lnbmVkIGxvbmcgdmFsOworCXN0cnVjdCB0ZXN0X2FyZyAqYXJnczsKKwlpbnQgaTsKKworCWlzX2xhc3Rfc2NlbmFyaW8gPSBmYWxzZTsKKwltZW1vcnlfbmVlZHNfY2hlY2tpbmcgPSBmYWxzZTsKKworCS8qIEluaXRpYWxpc2UgdGVzdCBtZW1vcnkgb24gc3RhY2sgKi8KKwl2YWwgPSAoc2NlbmFyaW8gJiAxKSA/IFZBTE0gOiB+VkFMTTsKKwlmb3IgKGkgPSAwOyBpIDwgVEVTVF9NRU1PUllfU0laRSAvIHNpemVvZihjdXJyZW50X3N0YWNrWzBdKTsgKytpKQorCQljdXJyZW50X3N0YWNrW2ldID0gdmFsICsgKGkgPDwgOCk7CisJLyogUHV0IHRhcmdldCBvZiBicmFuY2ggb24gc3RhY2sgZm9yIHRlc3RzIHdoaWNoIGxvYWQgUEMgZnJvbSBtZW1vcnkgKi8KKwlpZiAoY3VycmVudF9icmFuY2hfdGFyZ2V0KQorCQljdXJyZW50X3N0YWNrWzE1XSA9IGN1cnJlbnRfYnJhbmNoX3RhcmdldDsKKwkvKiBQdXQgYSB2YWx1ZSBmb3IgU1Agb24gc3RhY2sgZm9yIHRlc3RzIHdoaWNoIGxvYWQgU1AgZnJvbSBtZW1vcnkgKi8KKwljdXJyZW50X3N0YWNrWzEzXSA9ICh1MzIpY3VycmVudF9zdGFjayArIDEyMDsKKworCS8qIEluaXRpYWxpc2UgcmVnaXN0ZXIgdmFsdWVzIHRvIHRoZWlyIGRlZmF1bHQgc3RhdGUgKi8KKwl2YWwgPSAoc2NlbmFyaW8gJiAyKSA/IFZBTFIgOiB+VkFMUjsKKwlmb3IgKGkgPSAwOyBpIDwgMTM7ICsraSkKKwkJcmVncy0+dXJlZ3NbaV0gPSB2YWwgXiAoaSA8PCA4KTsKKwlyZWdzLT5BUk1fbHIgPSB2YWwgXiAoMTQgPDwgOCk7CisJcmVncy0+QVJNX2Nwc3IgJj0gfihBUFNSX01BU0sgfCBQU1JfSVRfTUFTSyk7CisJcmVncy0+QVJNX2Nwc3IgfD0gdGVzdF9jb250ZXh0X2Nwc3Ioc2NlbmFyaW8pOworCisJLyogUGVyZm9ybSB0ZXN0Y2FzZSBzcGVjaWZpYyByZWdpc3RlciBzZXR1cCAgKi8KKwlhcmdzID0gY3VycmVudF9hcmdzOworCWZvciAoOyBhcmdzWzBdLnR5cGUgIT0gQVJHX1RZUEVfRU5EOyArK2FyZ3MpCisJCXN3aXRjaCAoYXJnc1swXS50eXBlKSB7CisJCWNhc2UgQVJHX1RZUEVfUkVHOiB7CisJCQlzdHJ1Y3QgdGVzdF9hcmdfcmVncHRyICphcmcgPQorCQkJCShzdHJ1Y3QgdGVzdF9hcmdfcmVncHRyICopYXJnczsKKwkJCXJlZ3MtPnVyZWdzW2FyZy0+cmVnXSA9IGFyZy0+dmFsOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBBUkdfVFlQRV9QVFI6IHsKKwkJCXN0cnVjdCB0ZXN0X2FyZ19yZWdwdHIgKmFyZyA9CisJCQkJKHN0cnVjdCB0ZXN0X2FyZ19yZWdwdHIgKilhcmdzOworCQkJcmVncy0+dXJlZ3NbYXJnLT5yZWddID0KKwkJCQkodW5zaWduZWQgbG9uZyljdXJyZW50X3N0YWNrICsgYXJnLT52YWw7CisJCQltZW1vcnlfbmVlZHNfY2hlY2tpbmcgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBBUkdfVFlQRV9NRU06IHsKKwkJCXN0cnVjdCB0ZXN0X2FyZ19tZW0gKmFyZyA9IChzdHJ1Y3QgdGVzdF9hcmdfbWVtICopYXJnczsKKwkJCWN1cnJlbnRfc3RhY2tbYXJnLT5pbmRleF0gPSBhcmctPnZhbDsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorfQorCitzdHJ1Y3QgdGVzdF9wcm9iZSB7CisJc3RydWN0IGtwcm9iZQlrcHJvYmU7CisJYm9vbAkJcmVnaXN0ZXJlZDsKKwlpbnQJCWhpdDsKK307CisKK3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJfdGVzdF9wcm9iZShzdHJ1Y3QgdGVzdF9wcm9iZSAqcHJvYmUpCit7CisJaWYgKHByb2JlLT5yZWdpc3RlcmVkKSB7CisJCXVucmVnaXN0ZXJfa3Byb2JlKCZwcm9iZS0+a3Byb2JlKTsKKwkJcHJvYmUtPmtwcm9iZS5mbGFncyA9IDA7IC8qIENsZWFyIGRpc2FibGUgZmxhZyB0byBhbGxvdyByZXVzZSAqLworCX0KKwlwcm9iZS0+cmVnaXN0ZXJlZCA9IGZhbHNlOworfQorCitzdGF0aWMgaW50IHJlZ2lzdGVyX3Rlc3RfcHJvYmUoc3RydWN0IHRlc3RfcHJvYmUgKnByb2JlKQoreworCWludCByZXQ7CisKKwlpZiAocHJvYmUtPnJlZ2lzdGVyZWQpCisJCUJVRygpOworCisJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZwcm9iZS0+a3Byb2JlKTsKKwlpZiAocmV0ID49IDApIHsKKwkJcHJvYmUtPnJlZ2lzdGVyZWQgPSB0cnVlOworCQlwcm9iZS0+aGl0ID0gLTE7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzCit0ZXN0X2JlZm9yZV9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljb250YWluZXJfb2YocCwgc3RydWN0IHRlc3RfcHJvYmUsIGtwcm9iZSktPmhpdCA9IHRlc3RfaW5zdGFuY2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcwordGVzdF9iZWZvcmVfcG9zdF9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc2V0dXBfdGVzdF9jb250ZXh0KHJlZ3MpOworCWluaXRpYWxfcmVncyA9ICpyZWdzOworCWluaXRpYWxfcmVncy5BUk1fY3BzciAmPSB+UFNSX0lHTk9SRV9CSVRTOworfQorCitzdGF0aWMgaW50IF9fa3Byb2JlcwordGVzdF9jYXNlX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgdGVzdF9wcm9iZSwga3Byb2JlKS0+aGl0ID0gdGVzdF9pbnN0YW5jZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2twcm9iZXMKK3Rlc3RfYWZ0ZXJfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgdGVzdF9wcm9iZSwga3Byb2JlKS0+aGl0ID09IHRlc3RfaW5zdGFuY2UpCisJCXJldHVybiAwOyAvKiBBbHJlYWR5IHJ1biBmb3IgdGhpcyB0ZXN0IGluc3RhbmNlICovCisKKwlyZXN1bHRfcmVncyA9ICpyZWdzOworCXJlc3VsdF9yZWdzLkFSTV9jcHNyICY9IH5QU1JfSUdOT1JFX0JJVFM7CisKKwkvKiBVbmRvIGFueSBjaGFuZ2VzIGRvbmUgdG8gU1AgYnkgdGhlIHRlc3QgY2FzZSAqLworCXJlZ3MtPkFSTV9zcCA9ICh1bnNpZ25lZCBsb25nKWN1cnJlbnRfc3RhY2s7CisKKwljb250YWluZXJfb2YocCwgc3RydWN0IHRlc3RfcHJvYmUsIGtwcm9iZSktPmhpdCA9IHRlc3RfaW5zdGFuY2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGVzdF9wcm9iZSB0ZXN0X2JlZm9yZV9wcm9iZSA9IHsKKwkua3Byb2JlLnByZV9oYW5kbGVyCT0gdGVzdF9iZWZvcmVfcHJlX2hhbmRsZXIsCisJLmtwcm9iZS5wb3N0X2hhbmRsZXIJPSB0ZXN0X2JlZm9yZV9wb3N0X2hhbmRsZXIsCit9OworCitzdGF0aWMgc3RydWN0IHRlc3RfcHJvYmUgdGVzdF9jYXNlX3Byb2JlID0geworCS5rcHJvYmUucHJlX2hhbmRsZXIJPSB0ZXN0X2Nhc2VfcHJlX2hhbmRsZXIsCit9OworCitzdGF0aWMgc3RydWN0IHRlc3RfcHJvYmUgdGVzdF9hZnRlcl9wcm9iZSA9IHsKKwkua3Byb2JlLnByZV9oYW5kbGVyCT0gdGVzdF9hZnRlcl9wcmVfaGFuZGxlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGVzdF9wcm9iZSB0ZXN0X2FmdGVyMl9wcm9iZSA9IHsKKwkua3Byb2JlLnByZV9oYW5kbGVyCT0gdGVzdF9hZnRlcl9wcmVfaGFuZGxlciwKK307CisKK3N0YXRpYyB2b2lkIHRlc3RfY2FzZV9jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2JlZm9yZV9wcm9iZSk7CisJdW5yZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2Nhc2VfcHJvYmUpOworCXVucmVnaXN0ZXJfdGVzdF9wcm9iZSgmdGVzdF9hZnRlcl9wcm9iZSk7CisJdW5yZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2FmdGVyMl9wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcl9lcnIoInIwICAlMDhseCB8IHIxICAlMDhseCB8IHIyICAlMDhseCB8IHIzICAlMDhseFxuIiwKKwkJcmVncy0+QVJNX3IwLCByZWdzLT5BUk1fcjEsIHJlZ3MtPkFSTV9yMiwgcmVncy0+QVJNX3IzKTsKKwlwcl9lcnIoInI0ICAlMDhseCB8IHI1ICAlMDhseCB8IHI2ICAlMDhseCB8IHI3ICAlMDhseFxuIiwKKwkJcmVncy0+QVJNX3I0LCByZWdzLT5BUk1fcjUsIHJlZ3MtPkFSTV9yNiwgcmVncy0+QVJNX3I3KTsKKwlwcl9lcnIoInI4ICAlMDhseCB8IHI5ICAlMDhseCB8IHIxMCAlMDhseCB8IHIxMSAlMDhseFxuIiwKKwkJcmVncy0+QVJNX3I4LCByZWdzLT5BUk1fcjksIHJlZ3MtPkFSTV9yMTAsIHJlZ3MtPkFSTV9mcCk7CisJcHJfZXJyKCJyMTIgJTA4bHggfCBzcCAgJTA4bHggfCBsciAgJTA4bHggfCBwYyAgJTA4bHhcbiIsCisJCXJlZ3MtPkFSTV9pcCwgcmVncy0+QVJNX3NwLCByZWdzLT5BUk1fbHIsIHJlZ3MtPkFSTV9wYyk7CisJcHJfZXJyKCJjcHNyICUwOGx4XG4iLCByZWdzLT5BUk1fY3Bzcik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21lbW9yeSh1MzIgKm1lbSwgc2l6ZV90IHNpemUpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNpemUgLyBzaXplb2YodTMyKTsgaSArPSA0KQorCQlwcl9lcnIoIiUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIG1lbVtpXSwgbWVtW2krMV0sCisJCQkJCQltZW1baSsyXSwgbWVtW2krM10pOworfQorCitzdGF0aWMgc2l6ZV90IGV4cGVjdGVkX21lbW9yeV9zaXplKHUzMiAqc3ApCit7CisJc2l6ZV90IHNpemUgPSBzaXplb2YoZXhwZWN0ZWRfbWVtb3J5KTsKKwlpbnQgb2Zmc2V0ID0gKHVpbnRwdHJfdClzcCAtICh1aW50cHRyX3QpY3VycmVudF9zdGFjazsKKwlpZiAob2Zmc2V0ID4gMCkKKwkJc2l6ZSAtPSBvZmZzZXQ7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2FzZV9mYWlsZWQoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwl0ZXN0X2Nhc2VfY2xlYW51cCgpOworCisJcHJfZXJyKCJGQUlMOiAlc1xuIiwgbWVzc2FnZSk7CisJcHJfZXJyKCJGQUlMOiBUZXN0ICVzXG4iLCBjdXJyZW50X3RpdGxlKTsKKwlwcl9lcnIoIkZBSUw6IFNjZW5hcmlvICVkXG4iLCB0ZXN0X2Nhc2VfcnVuX2NvdW50ID4+IDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2luc3RydWN0aW9uKHVuc2lnbmVkIGxvbmcgcGMpCit7CisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwlpZiAoKHBjICYgMSkgJiYgIWlzX3dpZGVfaW5zdHJ1Y3Rpb24oKih1MTYgKikocGMgLSAxKSkpCisJCXJldHVybiBwYyArIDI7CisJZWxzZQorI2VuZGlmCisJcmV0dXJuIHBjICsgNDsKK30KKworc3RhdGljIHVpbnRwdHJfdCBfX3VzZWQga3Byb2Jlc190ZXN0X2Nhc2Vfc3RhcnQoY29uc3QgY2hhciAqdGl0bGUsIHZvaWQgKnN0YWNrKQoreworCXN0cnVjdCB0ZXN0X2FyZyAqYXJnczsKKwlzdHJ1Y3QgdGVzdF9hcmdfZW5kICplbmRfYXJnOworCXVuc2lnbmVkIGxvbmcgdGVzdF9jb2RlOworCisJYXJncyA9IChzdHJ1Y3QgdGVzdF9hcmcgKilQVFJfQUxJR04odGl0bGUgKyBzdHJsZW4odGl0bGUpICsgMSwgNCk7CisKKwljdXJyZW50X3RpdGxlID0gdGl0bGU7CisJY3VycmVudF9hcmdzID0gYXJnczsKKwljdXJyZW50X3N0YWNrID0gc3RhY2s7CisKKwkrK3Rlc3RfdHJ5X2NvdW50OworCisJd2hpbGUgKGFyZ3MtPnR5cGUgIT0gQVJHX1RZUEVfRU5EKQorCQkrK2FyZ3M7CisJZW5kX2FyZyA9IChzdHJ1Y3QgdGVzdF9hcmdfZW5kICopYXJnczsKKworCXRlc3RfY29kZSA9ICh1bnNpZ25lZCBsb25nKShhcmdzICsgMSk7IC8qIENvZGUgc3RhcnRzIGFmdGVyIGFyZ3MgKi8KKworCXRlc3RfY2FzZV9pc190aHVtYiA9IGVuZF9hcmctPmZsYWdzICYgQVJHX0ZMQUdfVEhVTUI7CisJaWYgKHRlc3RfY2FzZV9pc190aHVtYikKKwkJdGVzdF9jb2RlIHw9IDE7CisKKwljdXJyZW50X2NvZGVfc3RhcnQgPSB0ZXN0X2NvZGU7CisKKwljdXJyZW50X2JyYW5jaF90YXJnZXQgPSAwOworCWlmIChlbmRfYXJnLT5icmFuY2hfb2Zmc2V0ICE9IGVuZF9hcmctPmVuZF9vZmZzZXQpCisJCWN1cnJlbnRfYnJhbmNoX3RhcmdldCA9IHRlc3RfY29kZSArIGVuZF9hcmctPmJyYW5jaF9vZmZzZXQ7CisKKwl0ZXN0X2NvZGUgKz0gZW5kX2FyZy0+Y29kZV9vZmZzZXQ7CisJdGVzdF9iZWZvcmVfcHJvYmUua3Byb2JlLmFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopdGVzdF9jb2RlOworCisJdGVzdF9jb2RlID0gbmV4dF9pbnN0cnVjdGlvbih0ZXN0X2NvZGUpOworCXRlc3RfY2FzZV9wcm9iZS5rcHJvYmUuYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKil0ZXN0X2NvZGU7CisKKwlpZiAodGVzdF9jYXNlX2lzX3RodW1iKSB7CisJCXUxNiAqcCA9ICh1MTYgKikodGVzdF9jb2RlICYgfjEpOworCQljdXJyZW50X2luc3RydWN0aW9uID0gcFswXTsKKwkJaWYgKGlzX3dpZGVfaW5zdHJ1Y3Rpb24oY3VycmVudF9pbnN0cnVjdGlvbikpIHsKKwkJCWN1cnJlbnRfaW5zdHJ1Y3Rpb24gPDw9IDE2OworCQkJY3VycmVudF9pbnN0cnVjdGlvbiB8PSBwWzFdOworCQl9CisJfSBlbHNlIHsKKwkJY3VycmVudF9pbnN0cnVjdGlvbiA9ICoodTMyICopdGVzdF9jb2RlOworCX0KKworCWlmIChjdXJyZW50X3RpdGxlWzBdID09ICcuJykKKwkJdmVyYm9zZSgiJXNcbiIsIGN1cnJlbnRfdGl0bGUpOworCWVsc2UKKwkJdmVyYm9zZSgiJXNcdEAgJTAqeFxuIiwgY3VycmVudF90aXRsZSwKKwkJCQkJdGVzdF9jYXNlX2lzX3RodW1iID8gNCA6IDgsCisJCQkJCWN1cnJlbnRfaW5zdHJ1Y3Rpb24pOworCisJdGVzdF9jb2RlID0gbmV4dF9pbnN0cnVjdGlvbih0ZXN0X2NvZGUpOworCXRlc3RfYWZ0ZXJfcHJvYmUua3Byb2JlLmFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopdGVzdF9jb2RlOworCisJaWYgKGtwcm9iZV90ZXN0X2ZsYWdzICYgVEVTVF9GTEFHX05BUlJPV19JTlNUUikgeworCQlpZiAoIXRlc3RfY2FzZV9pc190aHVtYiB8fAorCQkJaXNfd2lkZV9pbnN0cnVjdGlvbihjdXJyZW50X2luc3RydWN0aW9uKSkgeworCQkJCXRlc3RfY2FzZV9mYWlsZWQoImV4cGVjdGVkIDE2LWJpdCBpbnN0cnVjdGlvbiIpOworCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0ZXN0X2Nhc2VfaXNfdGh1bWIgJiYKKwkJCSFpc193aWRlX2luc3RydWN0aW9uKGN1cnJlbnRfaW5zdHJ1Y3Rpb24pKSB7CisJCQkJdGVzdF9jYXNlX2ZhaWxlZCgiZXhwZWN0ZWQgMzItYml0IGluc3RydWN0aW9uIik7CisJCQkJZ290byBmYWlsOworCQl9CisJfQorCisJY292ZXJhZ2VfYWRkKGN1cnJlbnRfaW5zdHJ1Y3Rpb24pOworCisJaWYgKGVuZF9hcmctPmZsYWdzICYgQVJHX0ZMQUdfVU5TVVBQT1JURUQpIHsKKwkJaWYgKHJlZ2lzdGVyX3Rlc3RfcHJvYmUoJnRlc3RfY2FzZV9wcm9iZSkgPCAwKQorCQkJZ290byBwYXNzOworCQl0ZXN0X2Nhc2VfZmFpbGVkKCJyZWdpc3RlcmVkIHByb2JlIGZvciB1bnN1cHBvcnRlZCBpbnN0cnVjdGlvbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGVuZF9hcmctPmZsYWdzICYgQVJHX0ZMQUdfU1VQUE9SVEVEKSB7CisJCWlmIChyZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2Nhc2VfcHJvYmUpID49IDApCisJCQlnb3RvIHBhc3M7CisJCXRlc3RfY2FzZV9mYWlsZWQoImNvdWxkbid0IHJlZ2lzdGVyIHByb2JlIGZvciBzdXBwb3J0ZWQgaW5zdHJ1Y3Rpb24iKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChyZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2JlZm9yZV9wcm9iZSkgPCAwKSB7CisJCXRlc3RfY2FzZV9mYWlsZWQoInJlZ2lzdGVyIHRlc3RfYmVmb3JlX3Byb2JlIGZhaWxlZCIpOworCQlnb3RvIGZhaWw7CisJfQorCWlmIChyZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2FmdGVyX3Byb2JlKSA8IDApIHsKKwkJdGVzdF9jYXNlX2ZhaWxlZCgicmVnaXN0ZXIgdGVzdF9hZnRlcl9wcm9iZSBmYWlsZWQiKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoY3VycmVudF9icmFuY2hfdGFyZ2V0KSB7CisJCXRlc3RfYWZ0ZXIyX3Byb2JlLmtwcm9iZS5hZGRyID0KKwkJCQkoa3Byb2JlX29wY29kZV90ICopY3VycmVudF9icmFuY2hfdGFyZ2V0OworCQlpZiAocmVnaXN0ZXJfdGVzdF9wcm9iZSgmdGVzdF9hZnRlcjJfcHJvYmUpIDwgMCkgeworCQkJdGVzdF9jYXNlX2ZhaWxlZCgicmVnaXN0ZXIgdGVzdF9hZnRlcjJfcHJvYmUgZmFpbGVkIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwkvKiBTdGFydCBmaXJzdCBydW4gb2YgdGVzdCBjYXNlICovCisJdGVzdF9jYXNlX3J1bl9jb3VudCA9IDA7CisJKyt0ZXN0X2luc3RhbmNlOworCXJldHVybiBjdXJyZW50X2NvZGVfc3RhcnQ7CitwYXNzOgorCXRlc3RfY2FzZV9ydW5fY291bnQgPSBURVNUX0NBU0VfUEFTU0VEOworCXJldHVybiAodWludHB0cl90KXRlc3RfYWZ0ZXJfcHJvYmUua3Byb2JlLmFkZHI7CitmYWlsOgorCXRlc3RfY2FzZV9ydW5fY291bnQgPSBURVNUX0NBU0VfRkFJTEVEOworCXJldHVybiAodWludHB0cl90KXRlc3RfYWZ0ZXJfcHJvYmUua3Byb2JlLmFkZHI7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrX3Rlc3RfcmVzdWx0cyh2b2lkKQoreworCXNpemVfdCBtZW1fc2l6ZSA9IDA7CisJdTMyICptZW0gPSAwOworCisJaWYgKG1lbWNtcCgmZXhwZWN0ZWRfcmVncywgJnJlc3VsdF9yZWdzLCBzaXplb2YoZXhwZWN0ZWRfcmVncykpKSB7CisJCXRlc3RfY2FzZV9mYWlsZWQoInJlZ2lzdGVycyBkaWZmZXIiKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChtZW1vcnlfbmVlZHNfY2hlY2tpbmcpIHsKKwkJbWVtID0gKHUzMiAqKXJlc3VsdF9yZWdzLkFSTV9zcDsKKwkJbWVtX3NpemUgPSBleHBlY3RlZF9tZW1vcnlfc2l6ZShtZW0pOworCQlpZiAobWVtY21wKGV4cGVjdGVkX21lbW9yeSwgbWVtLCBtZW1fc2l6ZSkpIHsKKwkJCXRlc3RfY2FzZV9mYWlsZWQoInRlc3QgbWVtb3J5IGRpZmZlcnMiKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworCitmYWlsOgorCXByX2VycigiaW5pdGlhbF9yZWdzOlxuIik7CisJcHJpbnRfcmVnaXN0ZXJzKCZpbml0aWFsX3JlZ3MpOworCXByX2VycigiZXhwZWN0ZWRfcmVnczpcbiIpOworCXByaW50X3JlZ2lzdGVycygmZXhwZWN0ZWRfcmVncyk7CisJcHJfZXJyKCJyZXN1bHRfcmVnczpcbiIpOworCXByaW50X3JlZ2lzdGVycygmcmVzdWx0X3JlZ3MpOworCisJaWYgKG1lbSkgeworCQlwcl9lcnIoImN1cnJlbnRfc3RhY2s9JXBcbiIsIGN1cnJlbnRfc3RhY2spOworCQlwcl9lcnIoImV4cGVjdGVkX21lbW9yeTpcbiIpOworCQlwcmludF9tZW1vcnkoZXhwZWN0ZWRfbWVtb3J5LCBtZW1fc2l6ZSk7CisJCXByX2VycigicmVzdWx0X21lbW9yeTpcbiIpOworCQlwcmludF9tZW1vcnkobWVtLCBtZW1fc2l6ZSk7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdWludHB0cl90IF9fdXNlZCBrcHJvYmVzX3Rlc3RfY2FzZV9lbmQodm9pZCkKK3sKKwlpZiAodGVzdF9jYXNlX3J1bl9jb3VudCA8IDApIHsKKwkJaWYgKHRlc3RfY2FzZV9ydW5fY291bnQgPT0gVEVTVF9DQVNFX1BBU1NFRCkKKwkJCS8qIGtwcm9iZXNfdGVzdF9jYXNlX3N0YXJ0IGRpZCBhbGwgdGhlIG5lZWRlZCB0ZXN0aW5nICovCisJCQlnb3RvIHBhc3M7CisJCWVsc2UKKwkJCS8qIGtwcm9iZXNfdGVzdF9jYXNlX3N0YXJ0IGZhaWxlZCAqLworCQkJZ290byBmYWlsOworCX0KKworCWlmICh0ZXN0X2JlZm9yZV9wcm9iZS5oaXQgIT0gdGVzdF9pbnN0YW5jZSkgeworCQl0ZXN0X2Nhc2VfZmFpbGVkKCJ0ZXN0X2JlZm9yZV9oYW5kbGVyIG5vdCBydW4iKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICh0ZXN0X2FmdGVyX3Byb2JlLmhpdCAhPSB0ZXN0X2luc3RhbmNlICYmCisJCQkJdGVzdF9hZnRlcjJfcHJvYmUuaGl0ICE9IHRlc3RfaW5zdGFuY2UpIHsKKwkJdGVzdF9jYXNlX2ZhaWxlZCgidGVzdF9hZnRlcl9oYW5kbGVyIG5vdCBydW4iKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qCisJICogRXZlbiBudW1iZXJlZCB0ZXN0IHJ1bnMgcmFuIHdpdGhvdXQgYSBwcm9iZSBvbiB0aGUgdGVzdCBjYXNlIHNvCisJICogd2UgY2FuIGdhdGhlciByZWZlcmVuY2UgcmVzdWx0cy4gVGhlIHN1YnNlcXVlbnQgb2RkIG51bWJlcmVkIHJ1bgorCSAqIHdpbGwgaGF2ZSB0aGUgcHJvYmUgaW5zZXJ0ZWQuCisJKi8KKwlpZiAoKHRlc3RfY2FzZV9ydW5fY291bnQgJiAxKSA9PSAwKSB7CisJCS8qIFNhdmUgcmVzdWx0cyBmcm9tIHJ1biB3aXRob3V0IHByb2JlICovCisJCXUzMiAqbWVtID0gKHUzMiAqKXJlc3VsdF9yZWdzLkFSTV9zcDsKKwkJZXhwZWN0ZWRfcmVncyA9IHJlc3VsdF9yZWdzOworCQltZW1jcHkoZXhwZWN0ZWRfbWVtb3J5LCBtZW0sIGV4cGVjdGVkX21lbW9yeV9zaXplKG1lbSkpOworCisJCS8qIEluc2VydCBwcm9iZSBvbnRvIHRlc3QgY2FzZSBpbnN0cnVjdGlvbiAqLworCQlpZiAocmVnaXN0ZXJfdGVzdF9wcm9iZSgmdGVzdF9jYXNlX3Byb2JlKSA8IDApIHsKKwkJCXRlc3RfY2FzZV9mYWlsZWQoInJlZ2lzdGVyIHRlc3RfY2FzZV9wcm9iZSBmYWlsZWQiKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIENoZWNrIHByb2JlIHJhbiBhcyBleHBlY3RlZCAqLworCQlpZiAocHJvYmVfc2hvdWxkX3J1biA9PSAxKSB7CisJCQlpZiAodGVzdF9jYXNlX3Byb2JlLmhpdCAhPSB0ZXN0X2luc3RhbmNlKSB7CisJCQkJdGVzdF9jYXNlX2ZhaWxlZCgidGVzdF9jYXNlX2hhbmRsZXIgbm90IHJ1biIpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfSBlbHNlIGlmIChwcm9iZV9zaG91bGRfcnVuID09IDApIHsKKwkJCWlmICh0ZXN0X2Nhc2VfcHJvYmUuaGl0ID09IHRlc3RfaW5zdGFuY2UpIHsKKwkJCQl0ZXN0X2Nhc2VfZmFpbGVkKCJ0ZXN0X2Nhc2VfaGFuZGxlciByYW4iKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKworCQkvKiBSZW1vdmUgcHJvYmUgZm9yIGFueSBzdWJzZXF1ZW50IHJlZmVyZW5jZSBydW4gKi8KKwkJdW5yZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2Nhc2VfcHJvYmUpOworCisJCWlmICghY2hlY2tfdGVzdF9yZXN1bHRzKCkpCisJCQlnb3RvIGZhaWw7CisKKwkJaWYgKGlzX2xhc3Rfc2NlbmFyaW8pCisJCQlnb3RvIHBhc3M7CisJfQorCisJLyogRG8gbmV4dCB0ZXN0IHJ1biAqLworCSsrdGVzdF9jYXNlX3J1bl9jb3VudDsKKwkrK3Rlc3RfaW5zdGFuY2U7CisJcmV0dXJuIGN1cnJlbnRfY29kZV9zdGFydDsKK2ZhaWw6CisJKyt0ZXN0X2ZhaWxfY291bnQ7CisJZ290byBlbmQ7CitwYXNzOgorCSsrdGVzdF9wYXNzX2NvdW50OworZW5kOgorCXRlc3RfY2FzZV9jbGVhbnVwKCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFRvcCBsZXZlbCB0ZXN0IGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgcnVuX3Rlc3RfY2FzZXModm9pZCAoKnRlc3RzKSh2b2lkKSwgY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gKnRhYmxlKQoreworCWludCByZXQ7CisKKwlwcl9pbmZvKCIgICAgQ2hlY2sgZGVjb2RpbmcgdGFibGVzXG4iKTsKKwlyZXQgPSB0YWJsZV90ZXN0KHRhYmxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcHJfaW5mbygiICAgIFJ1biB0ZXN0IGNhc2VzXG4iKTsKKwlyZXQgPSBjb3ZlcmFnZV9zdGFydCh0YWJsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXRlc3RzKCk7CisKKwljb3ZlcmFnZV9lbmQoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBydW5fYWxsX3Rlc3RzKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9pbmZvKCJCZWdpbmluZyBrcHJvYmUgdGVzdHMuLi5cbiIpOworCisjaWZuZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisKKwlwcl9pbmZvKCJQcm9iZSBBUk0gY29kZVxuIik7CisJcmV0ID0gcnVuX2FwaV90ZXN0cyhhcm1fZnVuYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlwcl9pbmZvKCJBUk0gaW5zdHJ1Y3Rpb24gc2ltdWxhdGlvblxuIik7CisJcmV0ID0gcnVuX3Rlc3RfY2FzZXMoa3Byb2JlX2FybV90ZXN0X2Nhc2VzLCBrcHJvYmVfZGVjb2RlX2FybV90YWJsZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKyNlbHNlIC8qIENPTkZJR19USFVNQjJfS0VSTkVMICovCisKKwlwcl9pbmZvKCJQcm9iZSAxNi1iaXQgVGh1bWIgY29kZVxuIik7CisJcmV0ID0gcnVuX2FwaV90ZXN0cyh0aHVtYjE2X2Z1bmMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcHJfaW5mbygiUHJvYmUgMzItYml0IFRodW1iIGNvZGUsIGV2ZW4gaGFsZndvcmRcbiIpOworCXJldCA9IHJ1bl9hcGlfdGVzdHModGh1bWIzMmV2ZW5fZnVuYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlwcl9pbmZvKCJQcm9iZSAzMi1iaXQgVGh1bWIgY29kZSwgb2RkIGhhbGZ3b3JkXG4iKTsKKwlyZXQgPSBydW5fYXBpX3Rlc3RzKHRodW1iMzJvZGRfZnVuYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlwcl9pbmZvKCIxNi1iaXQgVGh1bWIgaW5zdHJ1Y3Rpb24gc2ltdWxhdGlvblxuIik7CisJcmV0ID0gcnVuX3Rlc3RfY2FzZXMoa3Byb2JlX3RodW1iMTZfdGVzdF9jYXNlcywKKwkJCQlrcHJvYmVfZGVjb2RlX3RodW1iMTZfdGFibGUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcHJfaW5mbygiMzItYml0IFRodW1iIGluc3RydWN0aW9uIHNpbXVsYXRpb25cbiIpOworCXJldCA9IHJ1bl90ZXN0X2Nhc2VzKGtwcm9iZV90aHVtYjMyX3Rlc3RfY2FzZXMsCisJCQkJa3Byb2JlX2RlY29kZV90aHVtYjMyX3RhYmxlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKyNlbmRpZgorCisJcHJfaW5mbygiVG90YWwgaW5zdHJ1Y3Rpb24gc2ltdWxhdGlvbiB0ZXN0cz0lZCwgcGFzcz0lZCBmYWlsPSVkXG4iLAorCQl0ZXN0X3RyeV9jb3VudCwgdGVzdF9wYXNzX2NvdW50LCB0ZXN0X2ZhaWxfY291bnQpOworCWlmICh0ZXN0X2ZhaWxfY291bnQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisjaWYgQkVOQ0hNQVJLSU5HCisJcHJfaW5mbygiQmVuY2htYXJrc1xuIik7CisJcmV0ID0gcnVuX2JlbmNobWFya3MoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKyNlbmRpZgorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKwkvKiBXZSBhcmUgYWJsZSB0byBydW4gYWxsIHRlc3QgY2FzZXMgc28gY292ZXJhZ2Ugc2hvdWxkIGJlIGNvbXBsZXRlICovCisJaWYgKGNvdmVyYWdlX2ZhaWwpIHsKKwkJcHJfZXJyKCJGQUlMOiBUZXN0IGNvdmVyYWdlIGNoZWNrcyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKworb3V0OgorCWlmIChyZXQgPT0gMCkKKwkJcHJfaW5mbygiRmluaXNoZWQga3Byb2JlIHRlc3RzIE9LXG4iKTsKKwllbHNlCisJCXByX2Vycigia3Byb2JlIHRlc3RzIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBNb2R1bGUgc2V0dXAKKyAqLworCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrcHJvYmVfdGVzdF9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KHJ1bl9hbGxfdGVzdHMpCittb2R1bGVfZXhpdChrcHJvYmVfdGVzdF9leGl0KQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZWxzZSAvKiAhTU9EVUxFICovCisKK2xhdGVfaW5pdGNhbGwocnVuX2FsbF90ZXN0cyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGVzdC5oIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzVkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LmgKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBhcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSm9uIE1lZGh1cnN0IDx0aXh5QHl4aXQuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2RlZmluZSBWRVJCT1NFIDAgLyogU2V0IHRvICcxJyBmb3IgbW9yZSBsb2dnaW5nIG9mIHRlc3QgY2FzZXMgKi8KKworI2lmZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisjZGVmaW5lIE5PUk1BTF9JU0EgIjE2IgorI2Vsc2UKKyNkZWZpbmUgTk9STUFMX0lTQSAiMzIiCisjZW5kaWYKKworCisvKiBGbGFncyB1c2VkIGluIGtwcm9iZV90ZXN0X2ZsYWdzICovCisjZGVmaW5lIFRFU1RfRkxBR19OT19JVEJMT0NLCSgxPDwwKQorI2RlZmluZSBURVNUX0ZMQUdfRlVMTF9JVEJMT0NLCSgxPDwxKQorI2RlZmluZSBURVNUX0ZMQUdfTkFSUk9XX0lOU1RSCSgxPDwyKQorCitleHRlcm4gaW50IGtwcm9iZV90ZXN0X2ZsYWdzOworZXh0ZXJuIGludCBrcHJvYmVfdGVzdF9jY19wb3NpdGlvbjsKKworCisjZGVmaW5lIFRFU1RfTUVNT1JZX1NJWkUgMjU2CisKKworLyoKKyAqIFRlc3QgY2FzZSBzdHJ1Y3R1cmVzLgorICoKKyAqIFRoZSBhcmd1bWVudHMgZ2l2ZW4gdG8gdGVzdCBjYXNlcyBjYW4gYmUgb25lIG9mIHRocmVlIHR5cGVzLgorICoKKyAqICAgQVJHX1RZUEVfUkVHCisgKglMb2FkIGEgcmVnaXN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCisgKgorICogICBBUkdfVFlQRV9QVFIKKyAqCUxvYWQgYSByZWdpc3RlciB3aXRoIGEgcG9pbnRlciBpbnRvIHRoZSBzdGFjayBidWZmZXIgKFNQICsgZ2l2ZW4gdmFsdWUpLgorICoKKyAqICAgQVJHX1RZUEVfTUVNCisgKglTdG9yZSB0aGUgZ2l2ZW4gdmFsdWUgaW50byB0aGUgc3RhY2sgYnVmZmVyIGF0IFtTUCtpbmRleF0uCisgKgorICovCisKKyNkZWZpbmUJQVJHX1RZUEVfRU5ECTAKKyNkZWZpbmUJQVJHX1RZUEVfUkVHCTEKKyNkZWZpbmUJQVJHX1RZUEVfUFRSCTIKKyNkZWZpbmUJQVJHX1RZUEVfTUVNCTMKKworI2RlZmluZSBBUkdfRkxBR19VTlNVUFBPUlRFRAkweDAxCisjZGVmaW5lIEFSR19GTEFHX1NVUFBPUlRFRAkweDAyCisjZGVmaW5lIEFSR19GTEFHX1RIVU1CCQkweDEwCS8qIE11c3QgYmUgMTYgc28gVEVTVF9JU0EgY2FuIGJlIHVzZWQgKi8KKyNkZWZpbmUgQVJHX0ZMQUdfQVJNCQkweDIwCS8qIE11c3QgYmUgMzIgc28gVEVTVF9JU0EgY2FuIGJlIHVzZWQgKi8KKworc3RydWN0IHRlc3RfYXJnIHsKKwl1OAl0eXBlOwkJLyogQVJHX1RZUEVfeCAqLworCXU4CV9wYWRkaW5nWzddOworfTsKKworc3RydWN0IHRlc3RfYXJnX3JlZ3B0ciB7CisJdTgJdHlwZTsJCS8qIEFSR19UWVBFX1JFRyBvciBBUkdfVFlQRV9QVFIgKi8KKwl1OAlyZWc7CisJdTgJX3BhZGRpbmdbMl07CisJdTMyCXZhbDsKK307CisKK3N0cnVjdCB0ZXN0X2FyZ19tZW0geworCXU4CXR5cGU7CQkvKiBBUkdfVFlQRV9NRU0gKi8KKwl1OAlpbmRleDsKKwl1OAlfcGFkZGluZ1syXTsKKwl1MzIJdmFsOworfTsKKworc3RydWN0IHRlc3RfYXJnX2VuZCB7CisJdTgJdHlwZTsJCS8qIEFSR19UWVBFX0VORCAqLworCXU4CWZsYWdzOwkJLyogQVJHX0ZMQUdfeCAqLworCXUxNgljb2RlX29mZnNldDsKKwl1MTYJYnJhbmNoX29mZnNldDsKKwl1MTYJZW5kX29mZnNldDsKK307CisKKworLyoKKyAqIEJ1aWxkaW5nIGJsb2NrcyBmb3IgdGVzdCBjYXNlcy4KKyAqCisgKiBFYWNoIHRlc3QgY2FzZSBpcyB3cmFwcGVkIGJldHdlZW4gVEVTVENBU0VfU1RBUlQgYW5kIFRFU1RDQVNFX0VORC4KKyAqCisgKiBUbyBzcGVjaWZ5IGFyZ3VtZW50cyBmb3IgYSB0ZXN0IGNhc2UgdGhlIFRFU1RfQVJHX3tSRUcsUFRSLE1FTX0gbWFjcm9zIGFyZQorICogdXNlZCBmb2xsb3dlZCBieSBhIHRlcm1pbmF0aW5nIFRFU1RfQVJHX0VORC4KKyAqCisgKiBBZnRlciB0aGlzLCB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgdGVzdGVkIGlzIGRlZmluZWQgd2l0aCBURVNUX0lOU1RSVUNUSU9OLgorICogT3IgZm9yIGJyYW5jaGVzLCBURVNUX0JSQU5DSF9CIGFuZCBURVNUX0JSQU5DSF9GIChicmFuY2ggZm9yd2FyZHMvYmFja3dhcmRzKS4KKyAqCisgKiBTb21lIHNwZWNpZmljIHRlc3QgY2FzZXMgbWF5IG1ha2UgdXNlIG9mIG90aGVyIGN1c3RvbSBjb25zdHJ1Y3RzLgorICovCisKKyNpZiBWRVJCT1NFCisjZGVmaW5lIHZlcmJvc2UoZm10LCAuLi4pIHByX2luZm8oZm10LCAjI19fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgdmVyYm9zZShmbXQsIC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFRFU1RfR1JPVVAodGl0bGUpCQkJCQlcCisJdmVyYm9zZSgiXG4iKTsJCQkJCQlcCisJdmVyYm9zZSh0aXRsZSJcbiIpOwkJCQkJXAorCXZlcmJvc2UoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKyNkZWZpbmUgVEVTVENBU0VfU1RBUlQodGl0bGUpCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJXAorCSJibAlfX2twcm9iZXNfdGVzdF9jYXNlX3N0YXJ0CQlcblx0IglcCisJLyogZG9uJ3QgdXNlIC5hc2NpeiBoZXJlIGFzICd0aXRsZScgbWF5IGJlICovCQlcCisJLyogbXVsdGlwbGUgc3RyaW5ncyB0byBiZSBjb25jYXRlbmF0ZWQuICAqLwkJXAorCSIuYXNjaWkgIiN0aXRsZSIJCQkJXG5cdCIJXAorCSIuYnl0ZQkwCQkJCQlcblx0IglcCisJIi5hbGlnbgkyCQkJCQlcblx0IgorCisjZGVmaW5lCVRFU1RfQVJHX1JFRyhyZWcsIHZhbCkJCQkJCVwKKwkiLmJ5dGUJIl9fc3RyaW5naWZ5KEFSR19UWVBFX1JFRykiCQlcblx0IglcCisJIi5ieXRlCSIjcmVnIgkJCQkJXG5cdCIJXAorCSIuc2hvcnQJMAkJCQkJXG5cdCIJXAorCSIud29yZAkiI3ZhbCIJCQkJCVxuXHQiCisKKyNkZWZpbmUJVEVTVF9BUkdfUFRSKHJlZywgdmFsKQkJCQkJXAorCSIuYnl0ZQkiX19zdHJpbmdpZnkoQVJHX1RZUEVfUFRSKSIJCVxuXHQiCVwKKwkiLmJ5dGUJIiNyZWciCQkJCQlcblx0IglcCisJIi5zaG9ydAkwCQkJCQlcblx0IglcCisJIi53b3JkCSIjdmFsIgkJCQkJXG5cdCIKKworI2RlZmluZQlURVNUX0FSR19NRU0oaW5kZXgsIHZhbCkJCQkJXAorCSIuYnl0ZQkiX19zdHJpbmdpZnkoQVJHX1RZUEVfTUVNKSIJCVxuXHQiCVwKKwkiLmJ5dGUJIiNpbmRleCIJCQkJXG5cdCIJXAorCSIuc2hvcnQJMAkJCQkJXG5cdCIJXAorCSIud29yZAkiI3ZhbCIJCQkJCVxuXHQiCisKKyNkZWZpbmUJVEVTVF9BUkdfRU5EKGZsYWdzKQkJCQkJXAorCSIuYnl0ZQkiX19zdHJpbmdpZnkoQVJHX1RZUEVfRU5EKSIJCVxuXHQiCVwKKwkiLmJ5dGUJIlRFU1RfSVNBIGZsYWdzIgkJCVxuXHQiCVwKKwkiLnNob3J0CTUwZi0wZgkJCQkJXG5cdCIJXAorCSIuc2hvcnQJMmYtMGYJCQkJCVxuXHQiCVwKKwkiLnNob3J0CTk5Zi0wZgkJCQkJXG5cdCIJXAorCSIuY29kZSAiVEVTVF9JU0EiCQkJCVxuXHQiCVwKKwkiMDoJCQkJCQlcblx0IgorCisjZGVmaW5lIFRFU1RfSU5TVFJVQ1RJT04oaW5zdHJ1Y3Rpb24pCQkJCVwKKwkiNTA6CW5vcAkJCQkJXG5cdCIJXAorCSIxOgkiaW5zdHJ1Y3Rpb24iCQkJCVxuXHQiCVwKKwkiCW5vcAkJCQkJXG5cdCIKKworI2RlZmluZSBURVNUX0JSQU5DSF9GKGluc3RydWN0aW9uLCB4dHJhX2Rpc3QpCQkJXAorCVRFU1RfSU5TVFJVQ1RJT04oaW5zdHJ1Y3Rpb24pCQkJCVwKKwkiLmlmICIjeHRyYV9kaXN0IgkJCQlcblx0IglcCisJIgliCTk5ZgkJCQlcblx0IglcCisJIi5zcGFjZSAiI3h0cmFfZGlzdCIJCQkJXG5cdCIJXAorCSIuZW5kaWYJCQkJCQlcblx0IglcCisJIgliCTk5ZgkJCQlcblx0IglcCisJIjI6CW5vcAkJCQkJXG5cdCIKKworI2RlZmluZSBURVNUX0JSQU5DSF9CKGluc3RydWN0aW9uLCB4dHJhX2Rpc3QpCQkJXAorCSIJYgk1MGYJCQkJXG5cdCIJXAorCSIJYgk5OWYJCQkJXG5cdCIJXAorCSIyOglub3AJCQkJCVxuXHQiCVwKKwkiCWIJOTlmCQkJCVxuXHQiCVwKKwkiLmlmICIjeHRyYV9kaXN0IgkJCQlcblx0IglcCisJIi5zcGFjZSAiI3h0cmFfZGlzdCIJCQkJXG5cdCIJXAorCSIuZW5kaWYJCQkJCQlcblx0IglcCisJVEVTVF9JTlNUUlVDVElPTihpbnN0cnVjdGlvbikKKworI2RlZmluZSBURVNUQ0FTRV9FTkQJCQkJCQlcCisJIjI6CQkJCQkJXG5cdCIJXAorCSI5OToJCQkJCQlcblx0IglcCisJIglibCBfX2twcm9iZXNfdGVzdF9jYXNlX2VuZF8iVEVTVF9JU0EiCVxuXHQiCVwKKwkiLmNvZGUgIk5PUk1BTF9JU0EiCQkJCVxuXHQiCVwKKwk6IDoJCQkJCQkJXAorCTogInIwIiwgInIxIiwgInIyIiwgInIzIiwgImlwIiwgImxyIiwgIm1lbW9yeSIsICJjYyIJXAorCSk7CisKKworLyoKKyAqIE1hY3JvcyB0byBkZWZpbmUgdGVzdCBjYXNlcy4KKyAqCisgKiBUaG9zZSBvZiB0aGUgZm9ybSBURVNUX3tSLFAsTX0qIGNhbiBiZSB1c2VkIHRvIGRlZmluZSB0ZXN0IGNhc2VzCisgKiB3aGljaCB0YWtlIGNvbWJpbmF0aW9ucyBvZiB0aGUgdGhyZWUgYmFzaWMgdHlwZXMgb2YgYXJndW1lbnRzLiBFLmcuCisgKgorICogICBURVNUX1IJT25lIHJlZ2lzdGVyIGFyZ3VtZW50CisgKiAgIFRFU1RfUlIJVHdvIHJlZ2lzdGVyIGFyZ3VtZW50cworICogICBURVNUX1JQUglBIHJlZ2lzdGVyLCBhIHBvaW50ZXIsIHRoZW4gYSByZWdpc3RlciBhcmd1bWVudAorICoKKyAqIEZvciB0ZXN0aW5nIGluc3RydWN0aW9ucyB3aGljaCBtYXkgYnJhbmNoLCB0aGVyZSBhcmUgbWFjcm9zIFRFU1RfQkZfKgorICogYW5kIFRFU1RfQkJfKiBmb3IgYnJhbmNoaW5nIGZvcndhcmRzIGFuZCBiYWNrd2FyZHMuCisgKgorICogVEVTVF9TVVBQT1JURUQgYW5kIFRFU1RfVU5TVVBQT1JURUQgZG9uJ3QgY2F1c2UgdGhlIGNvZGUgdG8gYmUgZXhlY3V0ZWQsCisgKiB0aGUganVzdCB2ZXJpZnkgdGhhdCBhIGtwcm9iZSBpcyBvciBpcyBub3QgYWxsb3dlZCBvbiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uCisgKi8KKworI2RlZmluZSBURVNUKGNvZGUpCQkJCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlKQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJXAorCVRFU1RfSU5TVFJVQ1RJT04oY29kZSkJCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9VTlNVUFBPUlRFRChjb2RlKQkJCQkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUpCQkJCQlcCisJVEVTVF9BUkdfRU5EKCJ8Il9fc3RyaW5naWZ5KEFSR19GTEFHX1VOU1VQUE9SVEVEKSkJXAorCVRFU1RfSU5TVFJVQ1RJT04oY29kZSkJCQkJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1NVUFBPUlRFRChjb2RlKQkJCQkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUpCQkJCQlcCisJVEVTVF9BUkdfRU5EKCJ8Il9fc3RyaW5naWZ5KEFSR19GTEFHX1NVUFBPUlRFRCkpCVwKKwlURVNUX0lOU1RSVUNUSU9OKGNvZGUpCQkJCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9SKGNvZGUxLCByZWcsIHZhbCwgY29kZTIpCQkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcgY29kZTIpCQlcCisJVEVTVF9BUkdfUkVHKHJlZywgdmFsKQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnIGNvZGUyKQkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfUlIoY29kZTEsIHJlZzEsIHZhbDEsIGNvZGUyLCByZWcyLCB2YWwyLCBjb2RlMykJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzKQkJXAorCVRFU1RfQVJHX1JFRyhyZWcxLCB2YWwxKQkJCQlcCisJVEVTVF9BUkdfUkVHKHJlZzIsIHZhbDIpCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMykJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1JSUihjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIsIHJlZzIsIHZhbDIsIGNvZGUzLCByZWczLCB2YWwzLCBjb2RlNClcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMgI3JlZzMgY29kZTQpCQlcCisJVEVTVF9BUkdfUkVHKHJlZzEsIHZhbDEpCQkJCQkJXAorCVRFU1RfQVJHX1JFRyhyZWcyLCB2YWwyKQkJCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMywgdmFsMykJCQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMyAjcmVnMyBjb2RlNCkJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1JSUlIoY29kZTEsIHJlZzEsIHZhbDEsIGNvZGUyLCByZWcyLCB2YWwyLCBjb2RlMywgcmVnMywgdmFsMywgY29kZTQsIHJlZzQsIHZhbDQpCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMyAjcmVnMyBjb2RlNCAjcmVnNCkJCVwKKwlURVNUX0FSR19SRUcocmVnMSwgdmFsMSkJCQkJCQlcCisJVEVTVF9BUkdfUkVHKHJlZzIsIHZhbDIpCQkJCQkJXAorCVRFU1RfQVJHX1JFRyhyZWczLCB2YWwzKQkJCQkJCVwKKwlURVNUX0FSR19SRUcocmVnNCwgdmFsNCkJCQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMyAjcmVnMyBjb2RlNCAjcmVnNCkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfUChjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIpCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlMSAjcmVnMSBjb2RlMikJXAorCVRFU1RfQVJHX1BUUihyZWcxLCB2YWwxKQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnMSBjb2RlMikJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfUFIoY29kZTEsIHJlZzEsIHZhbDEsIGNvZGUyLCByZWcyLCB2YWwyLCBjb2RlMykJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzKQkJXAorCVRFU1RfQVJHX1BUUihyZWcxLCB2YWwxKQkJCQlcCisJVEVTVF9BUkdfUkVHKHJlZzIsIHZhbDIpCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMykJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1JQKGNvZGUxLCByZWcxLCB2YWwxLCBjb2RlMiwgcmVnMiwgdmFsMiwgY29kZTMpCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMykJCVwKKwlURVNUX0FSR19SRUcocmVnMSwgdmFsMSkJCQkJXAorCVRFU1RfQVJHX1BUUihyZWcyLCB2YWwyKQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJXAorCVRFU1RfSU5TVFJVQ1RJT04oY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMpCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9QUlIoY29kZTEsIHJlZzEsIHZhbDEsIGNvZGUyLCByZWcyLCB2YWwyLCBjb2RlMywgcmVnMywgdmFsMywgY29kZTQpXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzICNyZWczIGNvZGU0KQkJXAorCVRFU1RfQVJHX1BUUihyZWcxLCB2YWwxKQkJCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMiwgdmFsMikJCQkJCQlcCisJVEVTVF9BUkdfUkVHKHJlZzMsIHZhbDMpCQkJCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQkJCQkJXAorCVRFU1RfSU5TVFJVQ1RJT04oY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMgI3JlZzMgY29kZTQpCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9SUFIoY29kZTEsIHJlZzEsIHZhbDEsIGNvZGUyLCByZWcyLCB2YWwyLCBjb2RlMywgcmVnMywgdmFsMywgY29kZTQpXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzICNyZWczIGNvZGU0KQkJXAorCVRFU1RfQVJHX1JFRyhyZWcxLCB2YWwxKQkJCQkJCVwKKwlURVNUX0FSR19QVFIocmVnMiwgdmFsMikJCQkJCQlcCisJVEVTVF9BUkdfUkVHKHJlZzMsIHZhbDMpCQkJCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQkJCQkJXAorCVRFU1RfSU5TVFJVQ1RJT04oY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMgI3JlZzMgY29kZTQpCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9SUlAoY29kZTEsIHJlZzEsIHZhbDEsIGNvZGUyLCByZWcyLCB2YWwyLCBjb2RlMywgcmVnMywgdmFsMywgY29kZTQpXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzICNyZWczIGNvZGU0KQkJXAorCVRFU1RfQVJHX1JFRyhyZWcxLCB2YWwxKQkJCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMiwgdmFsMikJCQkJCQlcCisJVEVTVF9BUkdfUFRSKHJlZzMsIHZhbDMpCQkJCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQkJCQkJXAorCVRFU1RfSU5TVFJVQ1RJT04oY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMgI3JlZzMgY29kZTQpCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9CRl9QKGNvZGUxLCByZWcxLCB2YWwxLCBjb2RlMikJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyKQlcCisJVEVTVF9BUkdfUFRSKHJlZzEsIHZhbDEpCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCVwKKwlURVNUX0JSQU5DSF9GKGNvZGUxICNyZWcxIGNvZGUyLCAwKQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9CRl9YKGNvZGUsIHh0cmFfZGlzdCkJCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlKQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJXAorCVRFU1RfQlJBTkNIX0YoY29kZSwgeHRyYV9kaXN0KQkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfQkJfWChjb2RlLCB4dHJhX2Rpc3QpCQlcCisJVEVTVENBU0VfU1RBUlQoY29kZSkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCVwKKwlURVNUX0JSQU5DSF9CKGNvZGUsIHh0cmFfZGlzdCkJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX0JGX1JYKGNvZGUxLCByZWcsIHZhbCwgY29kZTIsIHh0cmFfZGlzdCkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcgY29kZTIpCQlcCisJVEVTVF9BUkdfUkVHKHJlZywgdmFsKQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQlcCisJVEVTVF9CUkFOQ0hfRihjb2RlMSAjcmVnIGNvZGUyLCB4dHJhX2Rpc3QpCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX0JCX1JYKGNvZGUxLCByZWcsIHZhbCwgY29kZTIsIHh0cmFfZGlzdCkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcgY29kZTIpCQlcCisJVEVTVF9BUkdfUkVHKHJlZywgdmFsKQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQlcCisJVEVTVF9CUkFOQ0hfQihjb2RlMSAjcmVnIGNvZGUyLCB4dHJhX2Rpc3QpCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX0JGKGNvZGUpCVRFU1RfQkZfWChjb2RlLCAwKQorI2RlZmluZSBURVNUX0JCKGNvZGUpCVRFU1RfQkJfWChjb2RlLCAwKQorCisjZGVmaW5lIFRFU1RfQkZfUihjb2RlMSwgcmVnLCB2YWwsIGNvZGUyKSBURVNUX0JGX1JYKGNvZGUxLCByZWcsIHZhbCwgY29kZTIsIDApCisjZGVmaW5lIFRFU1RfQkJfUihjb2RlMSwgcmVnLCB2YWwsIGNvZGUyKSBURVNUX0JCX1JYKGNvZGUxLCByZWcsIHZhbCwgY29kZTIsIDApCisKKyNkZWZpbmUgVEVTVF9CRl9SUihjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIsIHJlZzIsIHZhbDIsIGNvZGUzKQlcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMpCQlcCisJVEVTVF9BUkdfUkVHKHJlZzEsIHZhbDEpCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMiwgdmFsMikJCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQkJCVwKKwlURVNUX0JSQU5DSF9GKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzLCAwKQkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfWChjb2RlLCBjb2RleCkJCQlcCisJVEVTVENBU0VfU1RBUlQoY29kZSkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCVwKKwlURVNUX0lOU1RSVUNUSU9OKGNvZGUpCQkJXAorCSIJYgk5OWYJCVxuXHQiCVwKKwkiCSJjb2RleCIJCQlcblx0IglcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9SWChjb2RlMSwgcmVnLCB2YWwsIGNvZGUyLCBjb2RleCkJCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlMSAjcmVnIGNvZGUyKQkJXAorCVRFU1RfQVJHX1JFRyhyZWcsIHZhbCkJCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQkJXAorCVRFU1RfSU5TVFJVQ1RJT04oY29kZTEgX19zdHJpbmdpZnkocmVnKSBjb2RlMikJXAorCSIJYgk5OWYJCVxuXHQiCQlcCisJIgkiY29kZXgiCQkJXG5cdCIJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1JSWChjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIsIHJlZzIsIHZhbDIsIGNvZGUzLCBjb2RleCkJCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMykJCQkJXAorCVRFU1RfQVJHX1JFRyhyZWcxLCB2YWwxKQkJCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMiwgdmFsMikJCQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSBfX3N0cmluZ2lmeShyZWcxKSBjb2RlMiBfX3N0cmluZ2lmeShyZWcyKSBjb2RlMykJXAorCSIJYgk5OWYJCVxuXHQiCQkJCQlcCisJIgkiY29kZXgiCQkJXG5cdCIJCQkJCVwKKwlURVNUQ0FTRV9FTkQKKworCisvKiBWYXJpb3VzIHZhbHVlcyB1c2VkIGluIHRlc3QgY2FzZXMuLi4gKi8KKyNkZWZpbmUgTih2YWwpCSh2YWwgXiAweGZmZmZmZmZmKQorI2RlZmluZSBWQUwxCTB4MTIzNDU2NzgKKyNkZWZpbmUgVkFMMglOKFZBTDEpCisjZGVmaW5lIFZBTDMJMHhhNWY4MDEKKyNkZWZpbmUgVkFMNAlOKFZBTDMpCisjZGVmaW5lIFZBTE0JMHg0NTY3ODlhYgorI2RlZmluZSBWQUxSCTB4ZGVhZGRlYWQKKyNkZWZpbmUgSEgxCTB4MDEyM2ZlY2IKKyNkZWZpbmUgSEgyCTB4YTk4NzQ1NjcKKworCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKK3ZvaWQga3Byb2JlX3RodW1iMTZfdGVzdF9jYXNlcyh2b2lkKTsKK3ZvaWQga3Byb2JlX3RodW1iMzJfdGVzdF9jYXNlcyh2b2lkKTsKKyNlbHNlCit2b2lkIGtwcm9iZV9hcm1fdGVzdF9jYXNlcyh2b2lkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGh1bWIuYyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRodW1iLmMKaW5kZXggOTAyY2E1OS4uOGY5NmVjNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGh1bWIuYworKysgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10aHVtYi5jCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJrcHJvYmVzLmgiCiAKQEAgLTk0Myw2ICs5NDQsOSBAQAogCSAqLwogCURFQ09ERV9FTkQKIH07CisjaWZkZWYgQ09ORklHX0FSTV9LUFJPQkVTX1RFU1RfTU9EVUxFCitFWFBPUlRfU1lNQk9MX0dQTChrcHJvYmVfZGVjb2RlX3RodW1iMzJfdGFibGUpOworI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcwogdDE2X3NpbXVsYXRlX2J4Ymx4KHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMTQyMyw2ICsxNDI3LDkgQEAKIAogCURFQ09ERV9FTkQKIH07CisjaWZkZWYgQ09ORklHX0FSTV9LUFJPQkVTX1RFU1RfTU9EVUxFCitFWFBPUlRfU1lNQk9MX0dQTChrcHJvYmVfZGVjb2RlX3RodW1iMTZfdGFibGUpOworI2VuZGlmCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fa3Byb2JlcyB0aHVtYl9jaGVja19jYyh1bnNpZ25lZCBsb25nIGNwc3IpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5oIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuaAppbmRleCBhNmFlZGEwLi4zODk0NWY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5oCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmgKQEAgLTQxMyw2ICs0MTMsMTQgQEAKIAlERUNPREVfSEVBREVSKERFQ09ERV9UWVBFX1JFSkVDVCwgX21hc2ssIF92YWx1ZSwgMCkKIAogCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKK2V4dGVybiBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSBrcHJvYmVfZGVjb2RlX3RodW1iMTZfdGFibGVbXTsKK2V4dGVybiBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSBrcHJvYmVfZGVjb2RlX3RodW1iMzJfdGFibGVbXTsKKyNlbHNlCitleHRlcm4gY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0ga3Byb2JlX2RlY29kZV9hcm1fdGFibGVbXTsKKyNlbmRpZgorCisKIGludCBrcHJvYmVfZGVjb2RlX2luc24oa3Byb2JlX29wY29kZV90IGluc24sIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gKmFzaSwKIAkJCWNvbnN0IHVuaW9uIGRlY29kZV9pdGVtICp0YWJsZSwgYm9vbCB0aHVtYjE2KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2xlZHMuYyBiL2FyY2gvYXJtL2tlcm5lbC9sZWRzLmMKaW5kZXggMGYxMDdkYy4uMGJjZDM4MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2xlZHMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvbGVkcy5jCkBAIC03LDEwICs3LDExIEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDUzYzljMjYuLjI0ZTIzNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMTIsOSArMTIsMTAgQEAKICAqLwogI2RlZmluZSBwcl9mbXQoZm10KSAiaHcgcGVyZmV2ZW50czogIiBmbXQKIAorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtMjYsMTYgKzI3LDggQEAKICNpbmNsdWRlIDxhc20vcG11Lmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBtdV9kZXZpY2U7Ci0KIC8qCi0gKiBIYXJkd2FyZSBsb2NrIHRvIHNlcmlhbGl6ZSBhY2Nlc3NlcyB0byBQTVUgcmVnaXN0ZXJzLiBOZWVkZWQgZm9yIHRoZQotICogcmVhZC9tb2RpZnkvd3JpdGUgc2VxdWVuY2VzLgotICovCi1zdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhwbXVfbG9jayk7Ci0KLS8qCi0gKiBBUk12NiBzdXBwb3J0cyBhIG1heGltdW0gb2YgMyBldmVudHMsIHN0YXJ0aW5nIGZyb20gaW5kZXggMS4gSWYgd2UgYWRkCisgKiBBUk12NiBzdXBwb3J0cyBhIG1heGltdW0gb2YgMyBldmVudHMsIHN0YXJ0aW5nIGZyb20gaW5kZXggMC4gSWYgd2UgYWRkCiAgKiBhbm90aGVyIHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgbW9yZSwgd2UgbmVlZCB0byBpbmNyZWFzZSB0aGlzIHRvIGJlIHRoZQogICogbGFyZ2VzdCBvZiBhbGwgcGxhdGZvcm1zLgogICoKQEAgLTQzLDYyICszNiwyNCBAQAogICogIGN5Y2xlIGNvdW50ZXIgQ0NOVCArIDMxIGV2ZW50cyBjb3VudGVycyBDTlQwLi4zMC4KICAqICBDb3J0ZXgtQTggaGFzIDErNCBjb3VudGVycywgQ29ydGV4LUE5IGhhcyAxKzYgY291bnRlcnMuCiAgKi8KLSNkZWZpbmUgQVJNUE1VX01BWF9IV0VWRU5UUwkJMzMKKyNkZWZpbmUgQVJNUE1VX01BWF9IV0VWRU5UUwkJMzIKIAotLyogVGhlIGV2ZW50cyBmb3IgYSBnaXZlbiBDUFUuICovCi1zdHJ1Y3QgY3B1X2h3X2V2ZW50cyB7Ci0JLyoKLQkgKiBUaGUgZXZlbnRzIHRoYXQgYXJlIGFjdGl2ZSBvbiB0aGUgQ1BVIGZvciB0aGUgZ2l2ZW4gaW5kZXguIEluZGV4IDAKLQkgKiBpcyByZXNlcnZlZC4KLQkgKi8KLQlzdHJ1Y3QgcGVyZl9ldmVudAkqZXZlbnRzW0FSTVBNVV9NQVhfSFdFVkVOVFNdOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2V2ZW50ICogW0FSTVBNVV9NQVhfSFdFVkVOVFNdLCBod19ldmVudHMpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcgW0JJVFNfVE9fTE9OR1MoQVJNUE1VX01BWF9IV0VWRU5UUyldLCB1c2VkX21hc2spOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwbXVfaHdfZXZlbnRzLCBjcHVfaHdfZXZlbnRzKTsKIAotCS8qCi0JICogQSAxIGJpdCBmb3IgYW4gaW5kZXggaW5kaWNhdGVzIHRoYXQgdGhlIGNvdW50ZXIgaXMgYmVpbmcgdXNlZCBmb3IKLQkgKiBhbiBldmVudC4gQSAwIG1lYW5zIHRoYXQgdGhlIGNvdW50ZXIgY2FuIGJlIHVzZWQuCi0JICovCi0JdW5zaWduZWQgbG9uZwkJdXNlZF9tYXNrW0JJVFNfVE9fTE9OR1MoQVJNUE1VX01BWF9IV0VWRU5UUyldOwotCi0JLyoKLQkgKiBBIDEgYml0IGZvciBhbiBpbmRleCBpbmRpY2F0ZXMgdGhhdCB0aGUgY291bnRlciBpcyBhY3RpdmVseSBiZWluZwotCSAqIHVzZWQuCi0JICovCi0JdW5zaWduZWQgbG9uZwkJYWN0aXZlX21hc2tbQklUU19UT19MT05HUyhBUk1QTVVfTUFYX0hXRVZFTlRTKV07Ci19Owotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfaHdfZXZlbnRzLCBjcHVfaHdfZXZlbnRzKTsKLQotc3RydWN0IGFybV9wbXUgewotCWVudW0gYXJtX3BlcmZfcG11X2lkcyBpZDsKLQljb25zdCBjaGFyCSpuYW1lOwotCWlycXJldHVybl90CSgqaGFuZGxlX2lycSkoaW50IGlycV9udW0sIHZvaWQgKmRldik7Ci0Jdm9pZAkJKCplbmFibGUpKHN0cnVjdCBod19wZXJmX2V2ZW50ICpldnQsIGludCBpZHgpOwotCXZvaWQJCSgqZGlzYWJsZSkoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmV2dCwgaW50IGlkeCk7Ci0JaW50CQkoKmdldF9ldmVudF9pZHgpKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAotCQkJCQkgc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3Yyk7Ci0JdTMyCQkoKnJlYWRfY291bnRlcikoaW50IGlkeCk7Ci0Jdm9pZAkJKCp3cml0ZV9jb3VudGVyKShpbnQgaWR4LCB1MzIgdmFsKTsKLQl2b2lkCQkoKnN0YXJ0KSh2b2lkKTsKLQl2b2lkCQkoKnN0b3ApKHZvaWQpOwotCXZvaWQJCSgqcmVzZXQpKHZvaWQgKik7Ci0JY29uc3QgdW5zaWduZWQJKCpjYWNoZV9tYXApW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQotCQkJCSAgICBbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCi0JCQkJICAgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdOwotCWNvbnN0IHVuc2lnbmVkCSgqZXZlbnRfbWFwKVtQRVJGX0NPVU5UX0hXX01BWF07Ci0JdTMyCQlyYXdfZXZlbnRfbWFzazsKLQlpbnQJCW51bV9ldmVudHM7Ci0JdTY0CQltYXhfcGVyaW9kOwotfTsKKyNkZWZpbmUgdG9fYXJtX3BtdShwKSAoY29udGFpbmVyX29mKHAsIHN0cnVjdCBhcm1fcG11LCBwbXUpKQogCiAvKiBTZXQgYXQgcnVudGltZSB3aGVuIHdlIGtub3cgd2hhdCBDUFUgdHlwZSB3ZSBhcmUuICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgKmFybXBtdTsKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdTsKIAogZW51bSBhcm1fcGVyZl9wbXVfaWRzCiBhcm1wbXVfZ2V0X3BtdV9pZCh2b2lkKQogewogCWludCBpZCA9IC1FTk9ERVY7CiAKLQlpZiAoYXJtcG11ICE9IE5VTEwpCi0JCWlkID0gYXJtcG11LT5pZDsKKwlpZiAoY3B1X3BtdSAhPSBOVUxMKQorCQlpZCA9IGNwdV9wbXUtPmlkOwogCiAJcmV0dXJuIGlkOwogfQpAQCAtMTA5LDggKzY0LDggQEAKIHsKIAlpbnQgbWF4X2V2ZW50cyA9IDA7CiAKLQlpZiAoYXJtcG11ICE9IE5VTEwpCi0JCW1heF9ldmVudHMgPSBhcm1wbXUtPm51bV9ldmVudHM7CisJaWYgKGNwdV9wbXUgIT0gTlVMTCkKKwkJbWF4X2V2ZW50cyA9IGNwdV9wbXUtPm51bV9ldmVudHM7CiAKIAlyZXR1cm4gbWF4X2V2ZW50czsKIH0KQEAgLTEzMCw3ICs4NSwxMSBAQAogI2RlZmluZSBDQUNIRV9PUF9VTlNVUFBPUlRFRAkJMHhGRkZGCiAKIHN0YXRpYyBpbnQKLWFybXBtdV9tYXBfY2FjaGVfZXZlbnQodTY0IGNvbmZpZykKK2FybXBtdV9tYXBfY2FjaGVfZXZlbnQoY29uc3QgdW5zaWduZWQgKCpjYWNoZV9tYXApCisJCQkJICAgICAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCSAgICAgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KKwkJCQkgICAgICBbUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYXSwKKwkJICAgICAgIHU2NCBjb25maWcpCiB7CiAJdW5zaWduZWQgaW50IGNhY2hlX3R5cGUsIGNhY2hlX29wLCBjYWNoZV9yZXN1bHQsIHJldDsKIApAQCAtMTQ2LDcgKzEwNSw3IEBACiAJaWYgKGNhY2hlX3Jlc3VsdCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gKGludCkoKmFybXBtdS0+Y2FjaGVfbWFwKVtjYWNoZV90eXBlXVtjYWNoZV9vcF1bY2FjaGVfcmVzdWx0XTsKKwlyZXQgPSAoaW50KSgqY2FjaGVfbWFwKVtjYWNoZV90eXBlXVtjYWNoZV9vcF1bY2FjaGVfcmVzdWx0XTsKIAogCWlmIChyZXQgPT0gQ0FDSEVfT1BfVU5TVVBQT1JURUQpCiAJCXJldHVybiAtRU5PRU5UOwpAQCAtMTU1LDIzICsxMTQsNDYgQEAKIH0KIAogc3RhdGljIGludAotYXJtcG11X21hcF9ldmVudCh1NjQgY29uZmlnKQorYXJtcG11X21hcF9ldmVudChjb25zdCB1bnNpZ25lZCAoKmV2ZW50X21hcClbUEVSRl9DT1VOVF9IV19NQVhdLCB1NjQgY29uZmlnKQogewotCWludCBtYXBwaW5nID0gKCphcm1wbXUtPmV2ZW50X21hcClbY29uZmlnXTsKLQlyZXR1cm4gbWFwcGluZyA9PSBIV19PUF9VTlNVUFBPUlRFRCA/IC1FT1BOT1RTVVBQIDogbWFwcGluZzsKKwlpbnQgbWFwcGluZyA9ICgqZXZlbnRfbWFwKVtjb25maWddOworCXJldHVybiBtYXBwaW5nID09IEhXX09QX1VOU1VQUE9SVEVEID8gLUVOT0VOVCA6IG1hcHBpbmc7CiB9CiAKIHN0YXRpYyBpbnQKLWFybXBtdV9tYXBfcmF3X2V2ZW50KHU2NCBjb25maWcpCithcm1wbXVfbWFwX3Jhd19ldmVudCh1MzIgcmF3X2V2ZW50X21hc2ssIHU2NCBjb25maWcpCiB7Ci0JcmV0dXJuIChpbnQpKGNvbmZpZyAmIGFybXBtdS0+cmF3X2V2ZW50X21hc2spOworCXJldHVybiAoaW50KShjb25maWcgJiByYXdfZXZlbnRfbWFzayk7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBpbnQgbWFwX2NwdV9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgY29uc3QgdW5zaWduZWQgKCpldmVudF9tYXApW1BFUkZfQ09VTlRfSFdfTUFYXSwKKwkJCSBjb25zdCB1bnNpZ25lZCAoKmNhY2hlX21hcCkKKwkJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdLAorCQkJIHUzMiByYXdfZXZlbnRfbWFzaykKK3sKKwl1NjQgY29uZmlnID0gZXZlbnQtPmF0dHIuY29uZmlnOworCisJc3dpdGNoIChldmVudC0+YXR0ci50eXBlKSB7CisJY2FzZSBQRVJGX1RZUEVfSEFSRFdBUkU6CisJCXJldHVybiBhcm1wbXVfbWFwX2V2ZW50KGV2ZW50X21hcCwgY29uZmlnKTsKKwljYXNlIFBFUkZfVFlQRV9IV19DQUNIRToKKwkJcmV0dXJuIGFybXBtdV9tYXBfY2FjaGVfZXZlbnQoY2FjaGVfbWFwLCBjb25maWcpOworCWNhc2UgUEVSRl9UWVBFX1JBVzoKKwkJcmV0dXJuIGFybXBtdV9tYXBfcmF3X2V2ZW50KHJhd19ldmVudF9tYXNrLCBjb25maWcpOworCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCitpbnQKIGFybXBtdV9ldmVudF9zZXRfcGVyaW9kKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKIAkJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsCiAJCQlpbnQgaWR4KQogeworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOwogCXM2NCBsZWZ0ID0gbG9jYWw2NF9yZWFkKCZod2MtPnBlcmlvZF9sZWZ0KTsKIAlzNjQgcGVyaW9kID0gaHdjLT5zYW1wbGVfcGVyaW9kOwogCWludCByZXQgPSAwOwpAQCAtMjAyLDExICsxODQsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdTY0Cit1NjQKIGFybXBtdV9ldmVudF91cGRhdGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAogCQkgICAgc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywKIAkJICAgIGludCBpZHgsIGludCBvdmVyZmxvdykKIHsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShldmVudC0+cG11KTsKIAl1NjQgZGVsdGEsIHByZXZfcmF3X2NvdW50LCBuZXdfcmF3X2NvdW50OwogCiBhZ2FpbjoKQEAgLTI0NiwxMSArMjI5LDkgQEAKIHN0YXRpYyB2b2lkCiBhcm1wbXVfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKIHsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShldmVudC0+cG11KTsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKIAotCWlmICghYXJtcG11KQotCQlyZXR1cm47Ci0KIAkvKgogCSAqIEFSTSBwbXUgYWx3YXlzIGhhcyB0byB1cGRhdGUgdGhlIGNvdW50ZXIsIHNvIGlnbm9yZQogCSAqIFBFUkZfRUZfVVBEQVRFLCBzZWUgY29tbWVudHMgaW4gYXJtcG11X3N0YXJ0KCkuCkBAIC0yNjYsMTEgKzI0Nyw5IEBACiBzdGF0aWMgdm9pZAogYXJtcG11X3N0YXJ0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQogeworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwogCi0JaWYgKCFhcm1wbXUpCi0JCXJldHVybjsKLQogCS8qCiAJICogQVJNIHBtdSBhbHdheXMgaGFzIHRvIHJlcHJvZ3JhbSB0aGUgcGVyaW9kLCBzbyBpZ25vcmUKIAkgKiBQRVJGX0VGX1JFTE9BRCwgc2VlIHRoZSBjb21tZW50IGJlbG93LgpAQCAtMjkzLDE2ICsyNzIsMTYgQEAKIHN0YXRpYyB2b2lkCiBhcm1wbXVfZGVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQogewotCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CisJc3RydWN0IGFybV9wbXUgKmFybXBtdSA9IHRvX2FybV9wbXUoZXZlbnQtPnBtdSk7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmh3X2V2ZW50cyA9IGFybXBtdS0+Z2V0X2h3X2V2ZW50cygpOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwogCWludCBpZHggPSBod2MtPmlkeDsKIAogCVdBUk5fT04oaWR4IDwgMCk7CiAKLQljbGVhcl9iaXQoaWR4LCBjcHVjLT5hY3RpdmVfbWFzayk7CiAJYXJtcG11X3N0b3AoZXZlbnQsIFBFUkZfRUZfVVBEQVRFKTsKLQljcHVjLT5ldmVudHNbaWR4XSA9IE5VTEw7Ci0JY2xlYXJfYml0KGlkeCwgY3B1Yy0+dXNlZF9tYXNrKTsKKwlod19ldmVudHMtPmV2ZW50c1tpZHhdID0gTlVMTDsKKwljbGVhcl9iaXQoaWR4LCBod19ldmVudHMtPnVzZWRfbWFzayk7CiAKIAlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CiB9CkBAIC0zMTAsNyArMjg5LDggQEAKIHN0YXRpYyBpbnQKIGFybXBtdV9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShldmVudC0+cG11KTsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqaHdfZXZlbnRzID0gYXJtcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CiAJaW50IGlkeDsKIAlpbnQgZXJyID0gMDsKQEAgLTMxOCw3ICsyOTgsNyBAQAogCXBlcmZfcG11X2Rpc2FibGUoZXZlbnQtPnBtdSk7CiAKIAkvKiBJZiB3ZSBkb24ndCBoYXZlIGEgc3BhY2UgZm9yIHRoZSBjb3VudGVyIHRoZW4gZmluaXNoIGVhcmx5LiAqLwotCWlkeCA9IGFybXBtdS0+Z2V0X2V2ZW50X2lkeChjcHVjLCBod2MpOworCWlkeCA9IGFybXBtdS0+Z2V0X2V2ZW50X2lkeChod19ldmVudHMsIGh3Yyk7CiAJaWYgKGlkeCA8IDApIHsKIAkJZXJyID0gaWR4OwogCQlnb3RvIG91dDsKQEAgLTMzMCw4ICszMTAsNyBAQAogCSAqLwogCWV2ZW50LT5ody5pZHggPSBpZHg7CiAJYXJtcG11LT5kaXNhYmxlKGh3YywgaWR4KTsKLQljcHVjLT5ldmVudHNbaWR4XSA9IGV2ZW50OwotCXNldF9iaXQoaWR4LCBjcHVjLT5hY3RpdmVfbWFzayk7CisJaHdfZXZlbnRzLT5ldmVudHNbaWR4XSA9IGV2ZW50OwogCiAJaHdjLT5zdGF0ZSA9IFBFUkZfSEVTX1NUT1BQRUQgfCBQRVJGX0hFU19VUFRPREFURTsKIAlpZiAoZmxhZ3MgJiBQRVJGX0VGX1NUQVJUKQpAQCAtMzQ1LDI1ICszMjQsMjUgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3RydWN0IHBtdSBwbXU7Ci0KIHN0YXRpYyBpbnQKLXZhbGlkYXRlX2V2ZW50KHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAordmFsaWRhdGVfZXZlbnQoc3RydWN0IHBtdV9od19ldmVudHMgKmh3X2V2ZW50cywKIAkgICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogeworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOwogCXN0cnVjdCBod19wZXJmX2V2ZW50IGZha2VfZXZlbnQgPSBldmVudC0+aHc7CisJc3RydWN0IHBtdSAqbGVhZGVyX3BtdSA9IGV2ZW50LT5ncm91cF9sZWFkZXItPnBtdTsKIAotCWlmIChldmVudC0+cG11ICE9ICZwbXUgfHwgZXZlbnQtPnN0YXRlIDw9IFBFUkZfRVZFTlRfU1RBVEVfT0ZGKQorCWlmIChldmVudC0+cG11ICE9IGxlYWRlcl9wbXUgfHwgZXZlbnQtPnN0YXRlIDw9IFBFUkZfRVZFTlRfU1RBVEVfT0ZGKQogCQlyZXR1cm4gMTsKIAotCXJldHVybiBhcm1wbXUtPmdldF9ldmVudF9pZHgoY3B1YywgJmZha2VfZXZlbnQpID49IDA7CisJcmV0dXJuIGFybXBtdS0+Z2V0X2V2ZW50X2lkeChod19ldmVudHMsICZmYWtlX2V2ZW50KSA+PSAwOwogfQogCiBzdGF0aWMgaW50CiB2YWxpZGF0ZV9ncm91cChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKnNpYmxpbmcsICpsZWFkZXIgPSBldmVudC0+Z3JvdXBfbGVhZGVyOwotCXN0cnVjdCBjcHVfaHdfZXZlbnRzIGZha2VfcG11OworCXN0cnVjdCBwbXVfaHdfZXZlbnRzIGZha2VfcG11OwogCiAJbWVtc2V0KCZmYWtlX3BtdSwgMCwgc2l6ZW9mKGZha2VfcG11KSk7CiAKQEAgLTM4MywxMTAgKzM2MiwxMTkgQEAKIAogc3RhdGljIGlycXJldHVybl90IGFybXBtdV9wbGF0Zm9ybV9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQogewotCXN0cnVjdCBhcm1fcG11X3BsYXRkYXRhICpwbGF0ID0gZGV2X2dldF9wbGF0ZGF0YSgmcG11X2RldmljZS0+ZGV2KTsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gKHN0cnVjdCBhcm1fcG11ICopIGRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0X2RldmljZSA9IGFybXBtdS0+cGxhdF9kZXZpY2U7CisJc3RydWN0IGFybV9wbXVfcGxhdGRhdGEgKnBsYXQgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwbGF0X2RldmljZS0+ZGV2KTsKIAogCXJldHVybiBwbGF0LT5oYW5kbGVfaXJxKGlycSwgZGV2LCBhcm1wbXUtPmhhbmRsZV9pcnEpOwogfQogCitzdGF0aWMgdm9pZAorYXJtcG11X3JlbGVhc2VfaGFyZHdhcmUoc3RydWN0IGFybV9wbXUgKmFybXBtdSkKK3sKKwlpbnQgaSwgaXJxLCBpcnFzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBtdV9kZXZpY2UgPSBhcm1wbXUtPnBsYXRfZGV2aWNlOworCisJaXJxcyA9IG1pbihwbXVfZGV2aWNlLT5udW1fcmVzb3VyY2VzLCBudW1fcG9zc2libGVfY3B1cygpKTsKKworCWZvciAoaSA9IDA7IGkgPCBpcnFzOyArK2kpIHsKKwkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShpLCAmYXJtcG11LT5hY3RpdmVfaXJxcykpCisJCQljb250aW51ZTsKKwkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCBpKTsKKwkJaWYgKGlycSA+PSAwKQorCQkJZnJlZV9pcnEoaXJxLCBhcm1wbXUpOworCX0KKworCXJlbGVhc2VfcG11KGFybXBtdS0+dHlwZSk7Cit9CisKIHN0YXRpYyBpbnQKLWFybXBtdV9yZXNlcnZlX2hhcmR3YXJlKHZvaWQpCithcm1wbXVfcmVzZXJ2ZV9oYXJkd2FyZShzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11KQogewogCXN0cnVjdCBhcm1fcG11X3BsYXRkYXRhICpwbGF0OwogCWlycV9oYW5kbGVyX3QgaGFuZGxlX2lycTsKLQlpbnQgaSwgZXJyID0gLUVOT0RFViwgaXJxOworCWludCBpLCBlcnIsIGlycSwgaXJxczsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbXVfZGV2aWNlID0gYXJtcG11LT5wbGF0X2RldmljZTsKIAotCXBtdV9kZXZpY2UgPSByZXNlcnZlX3BtdShBUk1fUE1VX0RFVklDRV9DUFUpOwotCWlmIChJU19FUlIocG11X2RldmljZSkpIHsKKwllcnIgPSByZXNlcnZlX3BtdShhcm1wbXUtPnR5cGUpOworCWlmIChlcnIpIHsKIAkJcHJfd2FybmluZygidW5hYmxlIHRvIHJlc2VydmUgcG11XG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIocG11X2RldmljZSk7CisJCXJldHVybiBlcnI7CiAJfQogCi0JaW5pdF9wbXUoQVJNX1BNVV9ERVZJQ0VfQ1BVKTsKLQogCXBsYXQgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwbXVfZGV2aWNlLT5kZXYpOwogCWlmIChwbGF0ICYmIHBsYXQtPmhhbmRsZV9pcnEpCiAJCWhhbmRsZV9pcnEgPSBhcm1wbXVfcGxhdGZvcm1faXJxOwogCWVsc2UKIAkJaGFuZGxlX2lycSA9IGFybXBtdS0+aGFuZGxlX2lycTsKIAotCWlmIChwbXVfZGV2aWNlLT5udW1fcmVzb3VyY2VzIDwgMSkgeworCWlycXMgPSBtaW4ocG11X2RldmljZS0+bnVtX3Jlc291cmNlcywgbnVtX3Bvc3NpYmxlX2NwdXMoKSk7CisJaWYgKGlycXMgPCAxKSB7CiAJCXByX2Vycigibm8gaXJxcyBmb3IgUE1VcyBkZWZpbmVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IHBtdV9kZXZpY2UtPm51bV9yZXNvdXJjZXM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBpcnFzOyArK2kpIHsKKwkJZXJyID0gMDsKIAkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCBpKTsKIAkJaWYgKGlycSA8IDApCiAJCQljb250aW51ZTsKIAorCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgc2luZ2xlIFBNVSBpbnRlcnJ1cHQgdGhhdCB3ZSBjYW4ndCBzaGlmdCwKKwkJICogYXNzdW1lIHRoYXQgd2UncmUgcnVubmluZyBvbiBhIHVuaXByb2Nlc3NvciBtYWNoaW5lIGFuZAorCQkgKiBjb250aW51ZS4gT3RoZXJ3aXNlLCBjb250aW51ZSB3aXRob3V0IHRoaXMgaW50ZXJydXB0LgorCQkgKi8KKwkJaWYgKGlycV9zZXRfYWZmaW5pdHkoaXJxLCBjcHVtYXNrX29mKGkpKSAmJiBpcnFzID4gMSkgeworCQkJcHJfd2FybmluZygidW5hYmxlIHRvIHNldCBpcnEgYWZmaW5pdHkgKGlycT0lZCwgY3B1PSV1KVxuIiwKKwkJCQkgICAgaXJxLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJZXJyID0gcmVxdWVzdF9pcnEoaXJxLCBoYW5kbGVfaXJxLAogCQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCi0JCQkJICAiYXJtcG11IiwgTlVMTCk7CisJCQkJICAiYXJtLXBtdSIsIGFybXBtdSk7CiAJCWlmIChlcnIpIHsKLQkJCXByX3dhcm5pbmcoInVuYWJsZSB0byByZXF1ZXN0IElSUSVkIGZvciBBUk0gcGVyZiAiCi0JCQkJImNvdW50ZXJzXG4iLCBpcnEpOwotCQkJYnJlYWs7CisJCQlwcl9lcnIoInVuYWJsZSB0byByZXF1ZXN0IElSUSVkIGZvciBBUk0gUE1VIGNvdW50ZXJzXG4iLAorCQkJCWlycSk7CisJCQlhcm1wbXVfcmVsZWFzZV9oYXJkd2FyZShhcm1wbXUpOworCQkJcmV0dXJuIGVycjsKIAkJfQorCisJCWNwdW1hc2tfc2V0X2NwdShpLCAmYXJtcG11LT5hY3RpdmVfaXJxcyk7CiAJfQogCi0JaWYgKGVycikgewotCQlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLQkJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocG11X2RldmljZSwgaSk7Ci0JCQlpZiAoaXJxID49IDApCi0JCQkJZnJlZV9pcnEoaXJxLCBOVUxMKTsKLQkJfQotCQlyZWxlYXNlX3BtdShBUk1fUE1VX0RFVklDRV9DUFUpOwotCQlwbXVfZGV2aWNlID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAotYXJtcG11X3JlbGVhc2VfaGFyZHdhcmUodm9pZCkKLXsKLQlpbnQgaSwgaXJxOwotCi0JZm9yIChpID0gcG11X2RldmljZS0+bnVtX3Jlc291cmNlcyAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0JCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocG11X2RldmljZSwgaSk7Ci0JCWlmIChpcnEgPj0gMCkKLQkJCWZyZWVfaXJxKGlycSwgTlVMTCk7Ci0JfQotCWFybXBtdS0+c3RvcCgpOwotCi0JcmVsZWFzZV9wbXUoQVJNX1BNVV9ERVZJQ0VfQ1BVKTsKLQlwbXVfZGV2aWNlID0gTlVMTDsKLX0KLQotc3RhdGljIGF0b21pY190IGFjdGl2ZV9ldmVudHMgPSBBVE9NSUNfSU5JVCgwKTsKLXN0YXRpYyBERUZJTkVfTVVURVgocG11X3Jlc2VydmVfbXV0ZXgpOwotCi1zdGF0aWMgdm9pZAogaHdfcGVyZl9ldmVudF9kZXN0cm95KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jaygmYWN0aXZlX2V2ZW50cywgJnBtdV9yZXNlcnZlX211dGV4KSkgewotCQlhcm1wbXVfcmVsZWFzZV9oYXJkd2FyZSgpOwotCQltdXRleF91bmxvY2soJnBtdV9yZXNlcnZlX211dGV4KTsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShldmVudC0+cG11KTsKKwlhdG9taWNfdCAqYWN0aXZlX2V2ZW50cwkgPSAmYXJtcG11LT5hY3RpdmVfZXZlbnRzOworCXN0cnVjdCBtdXRleCAqcG11X3Jlc2VydmVfbXV0ZXggPSAmYXJtcG11LT5yZXNlcnZlX211dGV4OworCisJaWYgKGF0b21pY19kZWNfYW5kX211dGV4X2xvY2soYWN0aXZlX2V2ZW50cywgcG11X3Jlc2VydmVfbXV0ZXgpKSB7CisJCWFybXBtdV9yZWxlYXNlX2hhcmR3YXJlKGFybXBtdSk7CisJCW11dGV4X3VubG9jayhwbXVfcmVzZXJ2ZV9tdXRleCk7CiAJfQogfQogCiBzdGF0aWMgaW50CitldmVudF9yZXF1aXJlc19tb2RlX2V4Y2x1c2lvbihzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQoreworCXJldHVybiBhdHRyLT5leGNsdWRlX2lkbGUgfHwgYXR0ci0+ZXhjbHVkZV91c2VyIHx8CisJICAgICAgIGF0dHItPmV4Y2x1ZGVfa2VybmVsIHx8IGF0dHItPmV4Y2x1ZGVfaHY7Cit9CisKK3N0YXRpYyBpbnQKIF9faHdfcGVyZl9ldmVudF9pbml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShldmVudC0+cG11KTsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKIAlpbnQgbWFwcGluZywgZXJyOwogCi0JLyogRGVjb2RlIHRoZSBnZW5lcmljIHR5cGUgaW50byBhbiBBUk0gZXZlbnQgaWRlbnRpZmllci4gKi8KLQlpZiAoUEVSRl9UWVBFX0hBUkRXQVJFID09IGV2ZW50LT5hdHRyLnR5cGUpIHsKLQkJbWFwcGluZyA9IGFybXBtdV9tYXBfZXZlbnQoZXZlbnQtPmF0dHIuY29uZmlnKTsKLQl9IGVsc2UgaWYgKFBFUkZfVFlQRV9IV19DQUNIRSA9PSBldmVudC0+YXR0ci50eXBlKSB7Ci0JCW1hcHBpbmcgPSBhcm1wbXVfbWFwX2NhY2hlX2V2ZW50KGV2ZW50LT5hdHRyLmNvbmZpZyk7Ci0JfSBlbHNlIGlmIChQRVJGX1RZUEVfUkFXID09IGV2ZW50LT5hdHRyLnR5cGUpIHsKLQkJbWFwcGluZyA9IGFybXBtdV9tYXBfcmF3X2V2ZW50KGV2ZW50LT5hdHRyLmNvbmZpZyk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoImV2ZW50IHR5cGUgJXggbm90IHN1cHBvcnRlZFxuIiwgZXZlbnQtPmF0dHIudHlwZSk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9CisJbWFwcGluZyA9IGFybXBtdS0+bWFwX2V2ZW50KGV2ZW50KTsKIAogCWlmIChtYXBwaW5nIDwgMCkgewogCQlwcl9kZWJ1ZygiZXZlbnQgJXg6JWxseCBub3Qgc3VwcG9ydGVkXG4iLCBldmVudC0+YXR0ci50eXBlLApAQCAtNDk1LDM0ICs0ODMsMzEgQEAKIAl9CiAKIAkvKgotCSAqIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBleGNsdWRlIHRoZSBjb3VudGVyIGZyb20gY2VydGFpbiBtb2Rlcy4KLQkgKiBUaGUgQVJNIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGFyZSBvbiBhbGwgb2YgdGhlIHRpbWUgc28gaWYgc29tZW9uZQotCSAqIGhhcyBhc2tlZCB1cyBmb3Igc29tZSBleGNsdWRlcyB0aGVuIHdlIGhhdmUgdG8gZmFpbC4KKwkgKiBXZSBkb24ndCBhc3NpZ24gYW4gaW5kZXggdW50aWwgd2UgYWN0dWFsbHkgcGxhY2UgdGhlIGV2ZW50IG9udG8KKwkgKiBoYXJkd2FyZS4gVXNlIC0xIHRvIHNpZ25pZnkgdGhhdCB3ZSBoYXZlbid0IGRlY2lkZWQgd2hlcmUgdG8gcHV0IGl0CisJICogeWV0LiBGb3IgU01QIHN5c3RlbXMsIGVhY2ggY29yZSBoYXMgaXQncyBvd24gUE1VIHNvIHdlIGNhbid0IGRvIGFueQorCSAqIGNsZXZlciBhbGxvY2F0aW9uIG9yIGNvbnN0cmFpbnRzIGNoZWNraW5nIGF0IHRoaXMgcG9pbnQuCiAJICovCi0JaWYgKGV2ZW50LT5hdHRyLmV4Y2x1ZGVfa2VybmVsIHx8IGV2ZW50LT5hdHRyLmV4Y2x1ZGVfdXNlciB8fAotCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2h2IHx8IGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaWRsZSkgeworCWh3Yy0+aWR4CQk9IC0xOworCWh3Yy0+Y29uZmlnX2Jhc2UJPSAwOworCWh3Yy0+Y29uZmlnCQk9IDA7CisJaHdjLT5ldmVudF9iYXNlCQk9IDA7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBleGNsdWRlIHRoZSBjb3VudGVyIGZyb20gY2VydGFpbiBtb2Rlcy4KKwkgKi8KKwlpZiAoKCFhcm1wbXUtPnNldF9ldmVudF9maWx0ZXIgfHwKKwkgICAgIGFybXBtdS0+c2V0X2V2ZW50X2ZpbHRlcihod2MsICZldmVudC0+YXR0cikpICYmCisJICAgICBldmVudF9yZXF1aXJlc19tb2RlX2V4Y2x1c2lvbigmZXZlbnQtPmF0dHIpKSB7CiAJCXByX2RlYnVnKCJBUk0gcGVyZm9ybWFuY2UgY291bnRlcnMgZG8gbm90IHN1cHBvcnQgIgogCQkJICJtb2RlIGV4Y2x1c2lvblxuIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCiAJLyoKLQkgKiBXZSBkb24ndCBhc3NpZ24gYW4gaW5kZXggdW50aWwgd2UgYWN0dWFsbHkgcGxhY2UgdGhlIGV2ZW50IG9udG8KLQkgKiBoYXJkd2FyZS4gVXNlIC0xIHRvIHNpZ25pZnkgdGhhdCB3ZSBoYXZlbid0IGRlY2lkZWQgd2hlcmUgdG8gcHV0IGl0Ci0JICogeWV0LiBGb3IgU01QIHN5c3RlbXMsIGVhY2ggY29yZSBoYXMgaXQncyBvd24gUE1VIHNvIHdlIGNhbid0IGRvIGFueQotCSAqIGNsZXZlciBhbGxvY2F0aW9uIG9yIGNvbnN0cmFpbnRzIGNoZWNraW5nIGF0IHRoaXMgcG9pbnQuCisJICogU3RvcmUgdGhlIGV2ZW50IGVuY29kaW5nIGludG8gdGhlIGNvbmZpZ19iYXNlIGZpZWxkLgogCSAqLwotCWh3Yy0+aWR4ID0gLTE7Ci0KLQkvKgotCSAqIFN0b3JlIHRoZSBldmVudCBlbmNvZGluZyBpbnRvIHRoZSBjb25maWdfYmFzZSBmaWVsZC4gY29uZmlnIGFuZAotCSAqIGV2ZW50X2Jhc2UgYXJlIHVudXNlZCBhcyB0aGUgb25seSAyIHRoaW5ncyB3ZSBuZWVkIHRvIGtub3cgYXJlCi0JICogdGhlIGV2ZW50IG1hcHBpbmcgYW5kIHRoZSBjb3VudGVyIHRvIHVzZS4gVGhlIGNvdW50ZXIgdG8gdXNlIGlzCi0JICogYWxzbyB0aGUgaW5keCBhbmQgdGhlIGNvbmZpZ19iYXNlIGlzIHRoZSBldmVudCB0eXBlLgotCSAqLwotCWh3Yy0+Y29uZmlnX2Jhc2UJICAgID0gKHVuc2lnbmVkIGxvbmcpbWFwcGluZzsKLQlod2MtPmNvbmZpZwkJICAgID0gMDsKLQlod2MtPmV2ZW50X2Jhc2UJCSAgICA9IDA7CisJaHdjLT5jb25maWdfYmFzZQkgICAgfD0gKHVuc2lnbmVkIGxvbmcpbWFwcGluZzsKIAogCWlmICghaHdjLT5zYW1wbGVfcGVyaW9kKSB7CiAJCWh3Yy0+c2FtcGxlX3BlcmlvZCAgPSBhcm1wbXUtPm1heF9wZXJpb2Q7CkBAIC01NDIsMzIgKzUyNywyMyBAQAogCiBzdGF0aWMgaW50IGFybXBtdV9ldmVudF9pbml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShldmVudC0+cG11KTsKIAlpbnQgZXJyID0gMDsKKwlhdG9taWNfdCAqYWN0aXZlX2V2ZW50cyA9ICZhcm1wbXUtPmFjdGl2ZV9ldmVudHM7CiAKLQlzd2l0Y2ggKGV2ZW50LT5hdHRyLnR5cGUpIHsKLQljYXNlIFBFUkZfVFlQRV9SQVc6Ci0JY2FzZSBQRVJGX1RZUEVfSEFSRFdBUkU6Ci0JY2FzZSBQRVJGX1RZUEVfSFdfQ0FDSEU6Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKKwlpZiAoYXJtcG11LT5tYXBfZXZlbnQoZXZlbnQpID09IC1FTk9FTlQpCiAJCXJldHVybiAtRU5PRU5UOwotCX0KLQotCWlmICghYXJtcG11KQotCQlyZXR1cm4gLUVOT0RFVjsKIAogCWV2ZW50LT5kZXN0cm95ID0gaHdfcGVyZl9ldmVudF9kZXN0cm95OwogCi0JaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZhY3RpdmVfZXZlbnRzKSkgewotCQltdXRleF9sb2NrKCZwbXVfcmVzZXJ2ZV9tdXRleCk7Ci0JCWlmIChhdG9taWNfcmVhZCgmYWN0aXZlX2V2ZW50cykgPT0gMCkgewotCQkJZXJyID0gYXJtcG11X3Jlc2VydmVfaGFyZHdhcmUoKTsKLQkJfQorCWlmICghYXRvbWljX2luY19ub3RfemVybyhhY3RpdmVfZXZlbnRzKSkgeworCQltdXRleF9sb2NrKCZhcm1wbXUtPnJlc2VydmVfbXV0ZXgpOworCQlpZiAoYXRvbWljX3JlYWQoYWN0aXZlX2V2ZW50cykgPT0gMCkKKwkJCWVyciA9IGFybXBtdV9yZXNlcnZlX2hhcmR3YXJlKGFybXBtdSk7CiAKIAkJaWYgKCFlcnIpCi0JCQlhdG9taWNfaW5jKCZhY3RpdmVfZXZlbnRzKTsKLQkJbXV0ZXhfdW5sb2NrKCZwbXVfcmVzZXJ2ZV9tdXRleCk7CisJCQlhdG9taWNfaW5jKGFjdGl2ZV9ldmVudHMpOworCQltdXRleF91bmxvY2soJmFybXBtdS0+cmVzZXJ2ZV9tdXRleCk7CiAJfQogCiAJaWYgKGVycikKQEAgLTU4MiwyMiArNTU4LDkgQEAKIAogc3RhdGljIHZvaWQgYXJtcG11X2VuYWJsZShzdHJ1Y3QgcG11ICpwbXUpCiB7Ci0JLyogRW5hYmxlIGFsbCBvZiB0aGUgcGVyZiBldmVudHMgb24gaGFyZHdhcmUuICovCi0JaW50IGlkeCwgZW5hYmxlZCA9IDA7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKLQotCWlmICghYXJtcG11KQotCQlyZXR1cm47Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8PSBhcm1wbXUtPm51bV9ldmVudHM7ICsraWR4KSB7Ci0JCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGNwdWMtPmV2ZW50c1tpZHhdOwotCi0JCWlmICghZXZlbnQpCi0JCQljb250aW51ZTsKLQotCQlhcm1wbXUtPmVuYWJsZSgmZXZlbnQtPmh3LCBpZHgpOwotCQllbmFibGVkID0gMTsKLQl9CisJc3RydWN0IGFybV9wbXUgKmFybXBtdSA9IHRvX2FybV9wbXUocG11KTsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqaHdfZXZlbnRzID0gYXJtcG11LT5nZXRfaHdfZXZlbnRzKCk7CisJaW50IGVuYWJsZWQgPSBiaXRtYXBfd2VpZ2h0KGh3X2V2ZW50cy0+dXNlZF9tYXNrLCBhcm1wbXUtPm51bV9ldmVudHMpOwogCiAJaWYgKGVuYWJsZWQpCiAJCWFybXBtdS0+c3RhcnQoKTsKQEAgLTYwNSwyMCArNTY4LDMyIEBACiAKIHN0YXRpYyB2b2lkIGFybXBtdV9kaXNhYmxlKHN0cnVjdCBwbXUgKnBtdSkKIHsKLQlpZiAoYXJtcG11KQotCQlhcm1wbXUtPnN0b3AoKTsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShwbXUpOworCWFybXBtdS0+c3RvcCgpOwogfQogCi1zdGF0aWMgc3RydWN0IHBtdSBwbXUgPSB7Ci0JLnBtdV9lbmFibGUJPSBhcm1wbXVfZW5hYmxlLAotCS5wbXVfZGlzYWJsZQk9IGFybXBtdV9kaXNhYmxlLAotCS5ldmVudF9pbml0CT0gYXJtcG11X2V2ZW50X2luaXQsCi0JLmFkZAkJPSBhcm1wbXVfYWRkLAotCS5kZWwJCT0gYXJtcG11X2RlbCwKLQkuc3RhcnQJCT0gYXJtcG11X3N0YXJ0LAotCS5zdG9wCQk9IGFybXBtdV9zdG9wLAotCS5yZWFkCQk9IGFybXBtdV9yZWFkLAotfTsKK3N0YXRpYyB2b2lkIF9faW5pdCBhcm1wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11KQoreworCWF0b21pY19zZXQoJmFybXBtdS0+YWN0aXZlX2V2ZW50cywgMCk7CisJbXV0ZXhfaW5pdCgmYXJtcG11LT5yZXNlcnZlX211dGV4KTsKKworCWFybXBtdS0+cG11ID0gKHN0cnVjdCBwbXUpIHsKKwkJLnBtdV9lbmFibGUJPSBhcm1wbXVfZW5hYmxlLAorCQkucG11X2Rpc2FibGUJPSBhcm1wbXVfZGlzYWJsZSwKKwkJLmV2ZW50X2luaXQJPSBhcm1wbXVfZXZlbnRfaW5pdCwKKwkJLmFkZAkJPSBhcm1wbXVfYWRkLAorCQkuZGVsCQk9IGFybXBtdV9kZWwsCisJCS5zdGFydAkJPSBhcm1wbXVfc3RhcnQsCisJCS5zdG9wCQk9IGFybXBtdV9zdG9wLAorCQkucmVhZAkJPSBhcm1wbXVfcmVhZCwKKwl9OworfQorCitpbnQgX19pbml0IGFybXBtdV9yZWdpc3RlcihzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11LCBjaGFyICpuYW1lLCBpbnQgdHlwZSkKK3sKKwlhcm1wbXVfaW5pdChhcm1wbXUpOworCXJldHVybiBwZXJmX3BtdV9yZWdpc3RlcigmYXJtcG11LT5wbXUsIG5hbWUsIHR5cGUpOworfQogCiAvKiBJbmNsdWRlIHRoZSBQTVUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLiAqLwogI2luY2x1ZGUgInBlcmZfZXZlbnRfeHNjYWxlLmMiCkBAIC02MzAsMTQgKzYwNSw3MiBAQAogICogVGhpcyByZXF1aXJlcyBTTVAgdG8gYmUgYXZhaWxhYmxlLCBzbyBleGlzdHMgYXMgYSBzZXBhcmF0ZSBpbml0Y2FsbC4KICAqLwogc3RhdGljIGludCBfX2luaXQKLWFybXBtdV9yZXNldCh2b2lkKQorY3B1X3BtdV9yZXNldCh2b2lkKQogewotCWlmIChhcm1wbXUgJiYgYXJtcG11LT5yZXNldCkKLQkJcmV0dXJuIG9uX2VhY2hfY3B1KGFybXBtdS0+cmVzZXQsIE5VTEwsIDEpOworCWlmIChjcHVfcG11ICYmIGNwdV9wbXUtPnJlc2V0KQorCQlyZXR1cm4gb25fZWFjaF9jcHUoY3B1X3BtdS0+cmVzZXQsIE5VTEwsIDEpOwogCXJldHVybiAwOwogfQotYXJjaF9pbml0Y2FsbChhcm1wbXVfcmVzZXQpOworYXJjaF9pbml0Y2FsbChjcHVfcG11X3Jlc2V0KTsKIAorLyoKKyAqIFBNVSBwbGF0Zm9ybSBkcml2ZXIgYW5kIGRldmljZXRyZWUgYmluZGluZ3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybXBtdV9vZl9kZXZpY2VfaWRzW10gPSB7CisJey5jb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTktcG11In0sCisJey5jb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTgtcG11In0sCisJey5jb21wYXRpYmxlID0gImFybSxhcm0xMTM2LXBtdSJ9LAorCXsuY29tcGF0aWJsZSA9ICJhcm0sYXJtMTE3Ni1wbXUifSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGFybXBtdV9wbGF0X2RldmljZV9pZHNbXSA9IHsKKwl7Lm5hbWUgPSAiYXJtLXBtdSJ9LAorCXt9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYXJtcG11X2RldmljZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNwdV9wbXUtPnBsYXRfZGV2aWNlID0gcGRldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXJtcG11X2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXJtLXBtdSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFybXBtdV9vZl9kZXZpY2VfaWRzLAorCX0sCisJLnByb2JlCQk9IGFybXBtdV9kZXZpY2VfcHJvYmUsCisJLmlkX3RhYmxlCT0gYXJtcG11X3BsYXRfZGV2aWNlX2lkcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX3BtdV9kcml2ZXIodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhcm1wbXVfZHJpdmVyKTsKK30KK2RldmljZV9pbml0Y2FsbChyZWdpc3Rlcl9wbXVfZHJpdmVyKTsKKworc3RhdGljIHN0cnVjdCBwbXVfaHdfZXZlbnRzICphcm1wbXVfZ2V0X2NwdV9ldmVudHModm9pZCkKK3sKKwlyZXR1cm4gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjcHVfcG11X2luaXQoc3RydWN0IGFybV9wbXUgKmFybXBtdSkKK3sKKwlpbnQgY3B1OworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9ICZwZXJfY3B1KGNwdV9od19ldmVudHMsIGNwdSk7CisJCWV2ZW50cy0+ZXZlbnRzID0gcGVyX2NwdShod19ldmVudHMsIGNwdSk7CisJCWV2ZW50cy0+dXNlZF9tYXNrID0gcGVyX2NwdSh1c2VkX21hc2ssIGNwdSk7CisJCXJhd19zcGluX2xvY2tfaW5pdCgmZXZlbnRzLT5wbXVfbG9jayk7CisJfQorCWFybXBtdS0+Z2V0X2h3X2V2ZW50cyA9IGFybXBtdV9nZXRfY3B1X2V2ZW50czsKKwlhcm1wbXUtPnR5cGUgPSBBUk1fUE1VX0RFVklDRV9DUFU7Cit9CisKKy8qCisgKiBDUFUgUE1VIGlkZW50aWZpY2F0aW9uIGFuZCByZWdpc3RyYXRpb24uCisgKi8KIHN0YXRpYyBpbnQgX19pbml0CiBpbml0X2h3X3BlcmZfZXZlbnRzKHZvaWQpCiB7CkBAIC02NTEsMjIgKzY4NCwyMiBAQAogCQljYXNlIDB4QjM2MDoJLyogQVJNMTEzNiAqLwogCQljYXNlIDB4QjU2MDoJLyogQVJNMTE1NiAqLwogCQljYXNlIDB4Qjc2MDoJLyogQVJNMTE3NiAqLwotCQkJYXJtcG11ID0gYXJtdjZwbXVfaW5pdCgpOworCQkJY3B1X3BtdSA9IGFybXY2cG11X2luaXQoKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4QjAyMDoJLyogQVJNMTFtcGNvcmUgKi8KLQkJCWFybXBtdSA9IGFybXY2bXBjb3JlX3BtdV9pbml0KCk7CisJCQljcHVfcG11ID0gYXJtdjZtcGNvcmVfcG11X2luaXQoKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4QzA4MDoJLyogQ29ydGV4LUE4ICovCi0JCQlhcm1wbXUgPSBhcm12N19hOF9wbXVfaW5pdCgpOworCQkJY3B1X3BtdSA9IGFybXY3X2E4X3BtdV9pbml0KCk7CiAJCQlicmVhazsKIAkJY2FzZSAweEMwOTA6CS8qIENvcnRleC1BOSAqLwotCQkJYXJtcG11ID0gYXJtdjdfYTlfcG11X2luaXQoKTsKKwkJCWNwdV9wbXUgPSBhcm12N19hOV9wbXVfaW5pdCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhDMDUwOgkvKiBDb3J0ZXgtQTUgKi8KLQkJCWFybXBtdSA9IGFybXY3X2E1X3BtdV9pbml0KCk7CisJCQljcHVfcG11ID0gYXJtdjdfYTVfcG11X2luaXQoKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4QzBGMDoJLyogQ29ydGV4LUExNSAqLwotCQkJYXJtcG11ID0gYXJtdjdfYTE1X3BtdV9pbml0KCk7CisJCQljcHVfcG11ID0gYXJtdjdfYTE1X3BtdV9pbml0KCk7CiAJCQlicmVhazsKIAkJfQogCS8qIEludGVsIENQVXMgW3hzY2FsZV0uICovCkBAIC02NzQsMjMgKzcwNywyMyBAQAogCQlwYXJ0X251bWJlciA9IChjcHVpZCA+PiAxMykgJiAweDc7CiAJCXN3aXRjaCAocGFydF9udW1iZXIpIHsKIAkJY2FzZSAxOgotCQkJYXJtcG11ID0geHNjYWxlMXBtdV9pbml0KCk7CisJCQljcHVfcG11ID0geHNjYWxlMXBtdV9pbml0KCk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJYXJtcG11ID0geHNjYWxlMnBtdV9pbml0KCk7CisJCQljcHVfcG11ID0geHNjYWxlMnBtdV9pbml0KCk7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmIChhcm1wbXUpIHsKKwlpZiAoY3B1X3BtdSkgewogCQlwcl9pbmZvKCJlbmFibGVkIHdpdGggJXMgUE1VIGRyaXZlciwgJWQgY291bnRlcnMgYXZhaWxhYmxlXG4iLAotCQkJYXJtcG11LT5uYW1lLCBhcm1wbXUtPm51bV9ldmVudHMpOworCQkJY3B1X3BtdS0+bmFtZSwgY3B1X3BtdS0+bnVtX2V2ZW50cyk7CisJCWNwdV9wbXVfaW5pdChjcHVfcG11KTsKKwkJYXJtcG11X3JlZ2lzdGVyKGNwdV9wbXUsICJjcHUiLCBQRVJGX1RZUEVfUkFXKTsKIAl9IGVsc2UgewogCQlwcl9pbmZvKCJubyBoYXJkd2FyZSBzdXBwb3J0IGF2YWlsYWJsZVxuIik7CiAJfQogCi0JcGVyZl9wbXVfcmVnaXN0ZXIoJnBtdSwgImNwdSIsIFBFUkZfVFlQRV9SQVcpOwotCiAJcmV0dXJuIDA7CiB9CiBlYXJseV9pbml0Y2FsbChpbml0X2h3X3BlcmZfZXZlbnRzKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y2LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ni5jCmluZGV4IGRkN2YzYjkuLmU2M2Q4MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y2LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjYuYwpAQCAtNTQsNyArNTQsNyBAQAogfTsKIAogZW51bSBhcm12Nl9jb3VudGVycyB7Ci0JQVJNVjZfQ1lDTEVfQ09VTlRFUiA9IDEsCisJQVJNVjZfQ1lDTEVfQ09VTlRFUiA9IDAsCiAJQVJNVjZfQ09VTlRFUjAsCiAJQVJNVjZfQ09VTlRFUjEsCiB9OwpAQCAtNDMzLDYgKzQzMyw3IEBACiAJCSAgICAgIGludCBpZHgpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWwsIG1hc2ssIGV2dCwgZmxhZ3M7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAogCWlmIChBUk1WNl9DWUNMRV9DT1VOVEVSID09IGlkeCkgewogCQltYXNrCT0gMDsKQEAgLTQ1NCwxMiArNDU1LDI5IEBACiAJICogTWFzayBvdXQgdGhlIGN1cnJlbnQgZXZlbnQgYW5kIHNldCB0aGUgY291bnRlciB0byBjb3VudCB0aGUgZXZlbnQKIAkgKiB0aGF0IHdlJ3JlIGludGVyZXN0ZWQgaW4uCiAJICovCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCXZhbCA9IGFybXY2X3BtY3JfcmVhZCgpOwogCXZhbCAmPSB+bWFzazsKIAl2YWwgfD0gZXZ0OwogCWFybXY2X3BtY3Jfd3JpdGUodmFsKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGNvdW50ZXJfaXNfYWN0aXZlKHVuc2lnbmVkIGxvbmcgcG1jciwgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAwOworCWlmIChpZHggPT0gQVJNVjZfQ1lDTEVfQ09VTlRFUikKKwkJbWFzayA9IEFSTVY2X1BNQ1JfQ0NPVU5UX0lFTjsKKwllbHNlIGlmIChpZHggPT0gQVJNVjZfQ09VTlRFUjApCisJCW1hc2sgPSBBUk1WNl9QTUNSX0NPVU5UMF9JRU47CisJZWxzZSBpZiAoaWR4ID09IEFSTVY2X0NPVU5URVIxKQorCQltYXNrID0gQVJNVjZfUE1DUl9DT1VOVDFfSUVOOworCisJaWYgKG1hc2spCisJCXJldHVybiBwbWNyICYgbWFzazsKKworCVdBUk5fT05DRSgxLCAiaW52YWxpZCBjb3VudGVyIG51bWJlciAoJWQpXG4iLCBpZHgpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QKQEAgLTQ2OCw3ICs0ODYsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcG1jciA9IGFybXY2X3BtY3JfcmVhZCgpOwogCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIGRhdGE7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWM7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmNwdWM7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJaW50IGlkeDsKIApAQCAtNDg3LDExICs1MDUsMTEgQEAKIAlwZXJmX3NhbXBsZV9kYXRhX2luaXQoJmRhdGEsIDApOwogCiAJY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCWZvciAoaWR4ID0gMDsgaWR4IDw9IGFybXBtdS0+bnVtX2V2ZW50czsgKytpZHgpIHsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNwdV9wbXUtPm51bV9ldmVudHM7ICsraWR4KSB7CiAJCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGNwdWMtPmV2ZW50c1tpZHhdOwogCQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjOwogCi0JCWlmICghdGVzdF9iaXQoaWR4LCBjcHVjLT5hY3RpdmVfbWFzaykpCisJCWlmICghY291bnRlcl9pc19hY3RpdmUocG1jciwgaWR4KSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qCkBAIC01MDgsNyArNTI2LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCAmZGF0YSwgcmVncykpCi0JCQlhcm1wbXUtPmRpc2FibGUoaHdjLCBpZHgpOworCQkJY3B1X3BtdS0+ZGlzYWJsZShod2MsIGlkeCk7CiAJfQogCiAJLyoKQEAgLTUyNywyOCArNTQ1LDMwIEBACiBhcm12NnBtdV9zdGFydCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZhbDsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCXZhbCA9IGFybXY2X3BtY3JfcmVhZCgpOwogCXZhbCB8PSBBUk1WNl9QTUNSX0VOQUJMRTsKIAlhcm12Nl9wbWNyX3dyaXRlKHZhbCk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQKIGFybXY2cG11X3N0b3Aodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWw7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAl2YWwgPSBhcm12Nl9wbWNyX3JlYWQoKTsKIAl2YWwgJj0gfkFSTVY2X1BNQ1JfRU5BQkxFOwogCWFybXY2X3BtY3Jfd3JpdGUodmFsKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50Ci1hcm12NnBtdV9nZXRfZXZlbnRfaWR4KHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAorYXJtdjZwbXVfZ2V0X2V2ZW50X2lkeChzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqY3B1YywKIAkJICAgICAgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpldmVudCkKIHsKIAkvKiBBbHdheXMgcGxhY2UgYSBjeWNsZSBjb3VudGVyIGludG8gdGhlIGN5Y2xlIGNvdW50ZXIuICovCkBAIC01NzgsNiArNTk4LDcgQEAKIAkJICAgICAgIGludCBpZHgpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWwsIG1hc2ssIGV2dCwgZmxhZ3M7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAogCWlmIChBUk1WNl9DWUNMRV9DT1VOVEVSID09IGlkeCkgewogCQltYXNrCT0gQVJNVjZfUE1DUl9DQ09VTlRfSUVOOwpAQCAtNTk4LDEyICs2MTksMTIgQEAKIAkgKiBvZiBFVE0gYnVzIHNpZ25hbCBhc3NlcnRpb24gY3ljbGVzLiBUaGUgZXh0ZXJuYWwgcmVwb3J0aW5nIHNob3VsZAogCSAqIGJlIGRpc2FibGVkIGFuZCBzbyB0aGlzIHNob3VsZCBuZXZlciBpbmNyZW1lbnQuCiAJICovCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCXZhbCA9IGFybXY2X3BtY3JfcmVhZCgpOwogCXZhbCAmPSB+bWFzazsKIAl2YWwgfD0gZXZ0OwogCWFybXY2X3BtY3Jfd3JpdGUodmFsKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNjExLDYgKzYzMiw3IEBACiAJCQkgICAgICBpbnQgaWR4KQogewogCXVuc2lnbmVkIGxvbmcgdmFsLCBtYXNrLCBmbGFncywgZXZ0ID0gMDsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCiAJaWYgKEFSTVY2X0NZQ0xFX0NPVU5URVIgPT0gaWR4KSB7CiAJCW1hc2sJPSBBUk1WNl9QTUNSX0NDT1VOVF9JRU47CkBAIC02MjcsMTUgKzY0OSwyMSBAQAogCSAqIFVubGlrZSBVUCBBUk12Niwgd2UgZG9uJ3QgaGF2ZSBhIHdheSBvZiBzdG9wcGluZyB0aGUgY291bnRlcnMuIFdlCiAJICogc2ltcGx5IGRpc2FibGUgdGhlIGludGVycnVwdCByZXBvcnRpbmcuCiAJICovCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCXZhbCA9IGFybXY2X3BtY3JfcmVhZCgpOwogCXZhbCAmPSB+bWFzazsKIAl2YWwgfD0gZXZ0OwogCWFybXY2X3BtY3Jfd3JpdGUodmFsKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgYXJtdjZwbXUgPSB7CitzdGF0aWMgaW50IGFybXY2X21hcF9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIG1hcF9jcHVfZXZlbnQoZXZlbnQsICZhcm12Nl9wZXJmX21hcCwKKwkJCQkmYXJtdjZfcGVyZl9jYWNoZV9tYXAsIDB4RkYpOworfQorCitzdGF0aWMgc3RydWN0IGFybV9wbXUgYXJtdjZwbXUgPSB7CiAJLmlkCQkJPSBBUk1fUEVSRl9QTVVfSURfVjYsCiAJLm5hbWUJCQk9ICJ2NiIsCiAJLmhhbmRsZV9pcnEJCT0gYXJtdjZwbXVfaGFuZGxlX2lycSwKQEAgLTY0NiwxNCArNjc0LDEyIEBACiAJLmdldF9ldmVudF9pZHgJCT0gYXJtdjZwbXVfZ2V0X2V2ZW50X2lkeCwKIAkuc3RhcnQJCQk9IGFybXY2cG11X3N0YXJ0LAogCS5zdG9wCQkJPSBhcm12NnBtdV9zdG9wLAotCS5jYWNoZV9tYXAJCT0gJmFybXY2X3BlcmZfY2FjaGVfbWFwLAotCS5ldmVudF9tYXAJCT0gJmFybXY2X3BlcmZfbWFwLAotCS5yYXdfZXZlbnRfbWFzawkJPSAweEZGLAorCS5tYXBfZXZlbnQJCT0gYXJtdjZfbWFwX2V2ZW50LAogCS5udW1fZXZlbnRzCQk9IDMsCiAJLm1heF9wZXJpb2QJCT0gKDFMTFUgPDwgMzIpIC0gMSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY2cG11X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY2cG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gJmFybXY2cG11OwogfQpAQCAtNjY1LDcgKzY5MSwxNCBAQAogICogZGlzYWJsZSB0aGUgaW50ZXJydXB0IHJlcG9ydGluZyBhbmQgdXBkYXRlIHRoZSBldmVudC4gV2hlbiB1bnRocm90dGxpbmcgd2UKICAqIHJlc2V0IHRoZSBwZXJpb2QgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0IHJlcG9ydGluZy4KICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11IGFybXY2bXBjb3JlX3BtdSA9IHsKKworc3RhdGljIGludCBhcm12Nm1wY29yZV9tYXBfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBtYXBfY3B1X2V2ZW50KGV2ZW50LCAmYXJtdjZtcGNvcmVfcGVyZl9tYXAsCisJCQkJJmFybXY2bXBjb3JlX3BlcmZfY2FjaGVfbWFwLCAweEZGKTsKK30KKworc3RhdGljIHN0cnVjdCBhcm1fcG11IGFybXY2bXBjb3JlX3BtdSA9IHsKIAkuaWQJCQk9IEFSTV9QRVJGX1BNVV9JRF9WNk1QLAogCS5uYW1lCQkJPSAidjZtcGNvcmUiLAogCS5oYW5kbGVfaXJxCQk9IGFybXY2cG11X2hhbmRsZV9pcnEsCkBAIC02NzYsMjQgKzcwOSwyMiBAQAogCS5nZXRfZXZlbnRfaWR4CQk9IGFybXY2cG11X2dldF9ldmVudF9pZHgsCiAJLnN0YXJ0CQkJPSBhcm12NnBtdV9zdGFydCwKIAkuc3RvcAkJCT0gYXJtdjZwbXVfc3RvcCwKLQkuY2FjaGVfbWFwCQk9ICZhcm12Nm1wY29yZV9wZXJmX2NhY2hlX21hcCwKLQkuZXZlbnRfbWFwCQk9ICZhcm12Nm1wY29yZV9wZXJmX21hcCwKLQkucmF3X2V2ZW50X21hc2sJCT0gMHhGRiwKKwkubWFwX2V2ZW50CQk9IGFybXY2bXBjb3JlX21hcF9ldmVudCwKIAkubnVtX2V2ZW50cwkJPSAzLAogCS5tYXhfcGVyaW9kCQk9ICgxTExVIDw8IDMyKSAtIDEsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12Nm1wY29yZV9wbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjZtcGNvcmVfcG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gJmFybXY2bXBjb3JlX3BtdTsKIH0KICNlbHNlCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12NnBtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12NnBtdV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY2bXBjb3JlX3BtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12Nm1wY29yZV9wbXVfaW5pdCh2b2lkKQogewogCXJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjcuYyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y3LmMKaW5kZXggNmJlM2UyZS4uMWVmNmQwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjcuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jCkBAIC0xNyw2ICsxNyw5IEBACiAgKi8KIAogI2lmZGVmIENPTkZJR19DUFVfVjcKKworc3RhdGljIHN0cnVjdCBhcm1fcG11IGFybXY3cG11OworCiAvKgogICogQ29tbW9uIEFSTXY3IGV2ZW50IHR5cGVzCiAgKgpAQCAtNjc2LDI1ICs2NzksMjYgQEAKIH07CiAKIC8qCi0gKiBQZXJmIEV2ZW50cyBjb3VudGVycworICogUGVyZiBFdmVudHMnIGluZGljZXMKICAqLwotZW51bSBhcm12N19jb3VudGVycyB7Ci0JQVJNVjdfQ1lDTEVfQ09VTlRFUgkJPSAxLAkvKiBDeWNsZSBjb3VudGVyICovCi0JQVJNVjdfQ09VTlRFUjAJCQk9IDIsCS8qIEZpcnN0IGV2ZW50IGNvdW50ZXIgKi8KLX07CisjZGVmaW5lCUFSTVY3X0lEWF9DWUNMRV9DT1VOVEVSCTAKKyNkZWZpbmUJQVJNVjdfSURYX0NPVU5URVIwCTEKKyNkZWZpbmUJQVJNVjdfSURYX0NPVU5URVJfTEFTVAkoQVJNVjdfSURYX0NZQ0xFX0NPVU5URVIgKyBjcHVfcG11LT5udW1fZXZlbnRzIC0gMSkKIAotLyoKLSAqIFRoZSBjeWNsZSBjb3VudGVyIGlzIEFSTVY3X0NZQ0xFX0NPVU5URVIuCi0gKiBUaGUgZmlyc3QgZXZlbnQgY291bnRlciBpcyBBUk1WN19DT1VOVEVSMC4KLSAqIFRoZSBsYXN0IGV2ZW50IGNvdW50ZXIgaXMgKEFSTVY3X0NPVU5URVIwICsgYXJtcG11LT5udW1fZXZlbnRzIC0gMSkuCi0gKi8KLSNkZWZpbmUJQVJNVjdfQ09VTlRFUl9MQVNUCShBUk1WN19DT1VOVEVSMCArIGFybXBtdS0+bnVtX2V2ZW50cyAtIDEpCisjZGVmaW5lCUFSTVY3X01BWF9DT1VOVEVSUwkzMgorI2RlZmluZQlBUk1WN19DT1VOVEVSX01BU0sJKEFSTVY3X01BWF9DT1VOVEVSUyAtIDEpCiAKIC8qCiAgKiBBUk12NyBsb3cgbGV2ZWwgUE1OQyBhY2Nlc3MKICAqLwogCiAvKgorICogUGVyZiBFdmVudCB0byBsb3cgbGV2ZWwgY291bnRlcnMgbWFwcGluZworICovCisjZGVmaW5lCUFSTVY3X0lEWF9UT19DT1VOVEVSKHgpCVwKKwkoKCh4KSAtIEFSTVY3X0lEWF9DT1VOVEVSMCkgJiBBUk1WN19DT1VOVEVSX01BU0spCisKKy8qCiAgKiBQZXItQ1BVIFBNTkM6IGNvbmZpZyByZWcKICAqLwogI2RlZmluZSBBUk1WN19QTU5DX0UJCSgxIDw8IDApIC8qIEVuYWJsZSBhbGwgY291bnRlcnMgKi8KQEAgLTcwOCwxMDMgKzcxMiw3NiBAQAogI2RlZmluZQlBUk1WN19QTU5DX01BU0sJCTB4M2YJIC8qIE1hc2sgZm9yIHdyaXRhYmxlIGJpdHMgKi8KIAogLyoKLSAqIEF2YWlsYWJsZSBjb3VudGVycwotICovCi0jZGVmaW5lIEFSTVY3X0NOVDAJCTAJLyogRmlyc3QgZXZlbnQgY291bnRlciAqLwotI2RlZmluZSBBUk1WN19DQ05UCQkzMQkvKiBDeWNsZSBjb3VudGVyICovCi0KLS8qIFBlcmYgRXZlbnQgdG8gbG93IGxldmVsIGNvdW50ZXJzIG1hcHBpbmcgKi8KLSNkZWZpbmUgQVJNVjdfRVZFTlRfQ05UX1RPX0NOVHgJKEFSTVY3X0NPVU5URVIwIC0gQVJNVjdfQ05UMCkKLQotLyoKLSAqIENOVEVOUzogY291bnRlcnMgZW5hYmxlIHJlZwotICovCi0jZGVmaW5lIEFSTVY3X0NOVEVOU19QKGlkeCkJKDEgPDwgKGlkeCAtIEFSTVY3X0VWRU5UX0NOVF9UT19DTlR4KSkKLSNkZWZpbmUgQVJNVjdfQ05URU5TX0MJCSgxIDw8IEFSTVY3X0NDTlQpCi0KLS8qCi0gKiBDTlRFTkM6IGNvdW50ZXJzIGRpc2FibGUgcmVnCi0gKi8KLSNkZWZpbmUgQVJNVjdfQ05URU5DX1AoaWR4KQkoMSA8PCAoaWR4IC0gQVJNVjdfRVZFTlRfQ05UX1RPX0NOVHgpKQotI2RlZmluZSBBUk1WN19DTlRFTkNfQwkJKDEgPDwgQVJNVjdfQ0NOVCkKLQotLyoKLSAqIElOVEVOUzogY291bnRlcnMgb3ZlcmZsb3cgaW50ZXJydXB0IGVuYWJsZSByZWcKLSAqLwotI2RlZmluZSBBUk1WN19JTlRFTlNfUChpZHgpCSgxIDw8IChpZHggLSBBUk1WN19FVkVOVF9DTlRfVE9fQ05UeCkpCi0jZGVmaW5lIEFSTVY3X0lOVEVOU19DCQkoMSA8PCBBUk1WN19DQ05UKQotCi0vKgotICogSU5URU5DOiBjb3VudGVycyBvdmVyZmxvdyBpbnRlcnJ1cHQgZGlzYWJsZSByZWcKLSAqLwotI2RlZmluZSBBUk1WN19JTlRFTkNfUChpZHgpCSgxIDw8IChpZHggLSBBUk1WN19FVkVOVF9DTlRfVE9fQ05UeCkpCi0jZGVmaW5lIEFSTVY3X0lOVEVOQ19DCQkoMSA8PCBBUk1WN19DQ05UKQotCi0vKgotICogRVZUU0VMOiBFdmVudCBzZWxlY3Rpb24gcmVnCi0gKi8KLSNkZWZpbmUJQVJNVjdfRVZUU0VMX01BU0sJMHhmZgkJLyogTWFzayBmb3Igd3JpdGFibGUgYml0cyAqLwotCi0vKgotICogU0VMRUNUOiBDb3VudGVyIHNlbGVjdGlvbiByZWcKLSAqLwotI2RlZmluZQlBUk1WN19TRUxFQ1RfTUFTSwkweDFmCQkvKiBNYXNrIGZvciB3cml0YWJsZSBiaXRzICovCi0KLS8qCiAgKiBGTEFHOiBjb3VudGVycyBvdmVyZmxvdyBmbGFnIHN0YXR1cyByZWcKICAqLwotI2RlZmluZSBBUk1WN19GTEFHX1AoaWR4KQkoMSA8PCAoaWR4IC0gQVJNVjdfRVZFTlRfQ05UX1RPX0NOVHgpKQotI2RlZmluZSBBUk1WN19GTEFHX0MJCSgxIDw8IEFSTVY3X0NDTlQpCiAjZGVmaW5lCUFSTVY3X0ZMQUdfTUFTSwkJMHhmZmZmZmZmZgkvKiBNYXNrIGZvciB3cml0YWJsZSBiaXRzICovCiAjZGVmaW5lCUFSTVY3X09WRVJGTE9XRURfTUFTSwlBUk1WN19GTEFHX01BU0sKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFybXY3X3BtbmNfcmVhZCh2b2lkKQorLyoKKyAqIFBNWEVWVFlQRVI6IEV2ZW50IHNlbGVjdGlvbiByZWcKKyAqLworI2RlZmluZQlBUk1WN19FVlRZUEVfTUFTSwkweGMwMDAwMGZmCS8qIE1hc2sgZm9yIHdyaXRhYmxlIGJpdHMgKi8KKyNkZWZpbmUJQVJNVjdfRVZUWVBFX0VWRU5UCTB4ZmYJCS8qIE1hc2sgZm9yIEVWRU5UIGJpdHMgKi8KKworLyoKKyAqIEV2ZW50IGZpbHRlcnMgZm9yIFBNVXYyCisgKi8KKyNkZWZpbmUJQVJNVjdfRVhDTFVERV9QTDEJKDEgPDwgMzEpCisjZGVmaW5lCUFSTVY3X0VYQ0xVREVfVVNFUgkoMSA8PCAzMCkKKyNkZWZpbmUJQVJNVjdfSU5DTFVERV9IWVAJKDEgPDwgMjcpCisKK3N0YXRpYyBpbmxpbmUgdTMyIGFybXY3X3BtbmNfcmVhZCh2b2lkKQogewogCXUzMiB2YWw7CiAJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMiwgMCIgOiAiPXIiKHZhbCkpOwogCXJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcm12N19wbW5jX3dyaXRlKHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIGFybXY3X3BtbmNfd3JpdGUodTMyIHZhbCkKIHsKIAl2YWwgJj0gQVJNVjdfUE1OQ19NQVNLOwogCWlzYigpOwogCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTIsIDAiIDogOiAiciIodmFsKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFybXY3X3BtbmNfaGFzX292ZXJmbG93ZWQodW5zaWduZWQgbG9uZyBwbW5jKQorc3RhdGljIGlubGluZSBpbnQgYXJtdjdfcG1uY19oYXNfb3ZlcmZsb3dlZCh1MzIgcG1uYykKIHsKIAlyZXR1cm4gcG1uYyAmIEFSTVY3X09WRVJGTE9XRURfTUFTSzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXJtdjdfcG1uY19jb3VudGVyX2hhc19vdmVyZmxvd2VkKHVuc2lnbmVkIGxvbmcgcG1uYywKLQkJCQkJZW51bSBhcm12N19jb3VudGVycyBjb3VudGVyKQorc3RhdGljIGlubGluZSBpbnQgYXJtdjdfcG1uY19jb3VudGVyX3ZhbGlkKGludCBpZHgpCit7CisJcmV0dXJuIGlkeCA+PSBBUk1WN19JRFhfQ1lDTEVfQ09VTlRFUiAmJiBpZHggPD0gQVJNVjdfSURYX0NPVU5URVJfTEFTVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXJtdjdfcG1uY19jb3VudGVyX2hhc19vdmVyZmxvd2VkKHUzMiBwbW5jLCBpbnQgaWR4KQogewogCWludCByZXQgPSAwOworCXUzMiBjb3VudGVyOwogCi0JaWYgKGNvdW50ZXIgPT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikKLQkJcmV0ID0gcG1uYyAmIEFSTVY3X0ZMQUdfQzsKLQllbHNlIGlmICgoY291bnRlciA+PSBBUk1WN19DT1VOVEVSMCkgJiYgKGNvdW50ZXIgPD0gQVJNVjdfQ09VTlRFUl9MQVNUKSkKLQkJcmV0ID0gcG1uYyAmIEFSTVY3X0ZMQUdfUChjb3VudGVyKTsKLQllbHNlCisJaWYgKCFhcm12N19wbW5jX2NvdW50ZXJfdmFsaWQoaWR4KSkgewogCQlwcl9lcnIoIkNQVSV1IGNoZWNraW5nIHdyb25nIGNvdW50ZXIgJWQgb3ZlcmZsb3cgc3RhdHVzXG4iLAotCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBjb3VudGVyKTsKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKKwl9IGVsc2UgeworCQljb3VudGVyID0gQVJNVjdfSURYX1RPX0NPVU5URVIoaWR4KTsKKwkJcmV0ID0gcG1uYyAmIEJJVChjb3VudGVyKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX3NlbGVjdF9jb3VudGVyKHVuc2lnbmVkIGludCBpZHgpCitzdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX3NlbGVjdF9jb3VudGVyKGludCBpZHgpCiB7Ci0JdTMyIHZhbDsKKwl1MzIgY291bnRlcjsKIAotCWlmICgoaWR4IDwgQVJNVjdfQ09VTlRFUjApIHx8IChpZHggPiBBUk1WN19DT1VOVEVSX0xBU1QpKSB7Ci0JCXByX2VycigiQ1BVJXUgc2VsZWN0aW5nIHdyb25nIFBNTkMgY291bnRlciIKLQkJCSIgJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKLQkJcmV0dXJuIC0xOworCWlmICghYXJtdjdfcG1uY19jb3VudGVyX3ZhbGlkKGlkeCkpIHsKKwkJcHJfZXJyKCJDUFUldSBzZWxlY3Rpbmcgd3JvbmcgUE1OQyBjb3VudGVyICVkXG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBpZHgpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl2YWwgPSAoaWR4IC0gQVJNVjdfRVZFTlRfQ05UX1RPX0NOVHgpICYgQVJNVjdfU0VMRUNUX01BU0s7Ci0JYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgNSIgOiA6ICJyIiAodmFsKSk7CisJY291bnRlciA9IEFSTVY3X0lEWF9UT19DT1VOVEVSKGlkeCk7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgNSIgOiA6ICJyIiAoY291bnRlcikpOwogCWlzYigpOwogCiAJcmV0dXJuIGlkeDsKQEAgLTgxMiwxMjQgKzc4OSw5NSBAQAogCiBzdGF0aWMgaW5saW5lIHUzMiBhcm12N3BtdV9yZWFkX2NvdW50ZXIoaW50IGlkeCkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKKwl1MzIgdmFsdWUgPSAwOwogCi0JaWYgKGlkeCA9PSBBUk1WN19DWUNMRV9DT1VOVEVSKQotCQlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDAsICUwLCBjOSwgYzEzLCAwIiA6ICI9ciIgKHZhbHVlKSk7Ci0JZWxzZSBpZiAoKGlkeCA+PSBBUk1WN19DT1VOVEVSMCkgJiYgKGlkeCA8PSBBUk1WN19DT1VOVEVSX0xBU1QpKSB7Ci0JCWlmIChhcm12N19wbW5jX3NlbGVjdF9jb3VudGVyKGlkeCkgPT0gaWR4KQotCQkJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMiIKLQkJCQkgICAgIDogIj1yIiAodmFsdWUpKTsKLQl9IGVsc2UKKwlpZiAoIWFybXY3X3BtbmNfY291bnRlcl92YWxpZChpZHgpKQogCQlwcl9lcnIoIkNQVSV1IHJlYWRpbmcgd3JvbmcgY291bnRlciAlZFxuIiwKIAkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKKwllbHNlIGlmIChpZHggPT0gQVJNVjdfSURYX0NZQ0xFX0NPVU5URVIpCisJCWFzbSB2b2xhdGlsZSgibXJjIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDAiIDogIj1yIiAodmFsdWUpKTsKKwllbHNlIGlmIChhcm12N19wbW5jX3NlbGVjdF9jb3VudGVyKGlkeCkgPT0gaWR4KQorCQlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDAsICUwLCBjOSwgYzEzLCAyIiA6ICI9ciIgKHZhbHVlKSk7CiAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcm12N3BtdV93cml0ZV9jb3VudGVyKGludCBpZHgsIHUzMiB2YWx1ZSkKIHsKLQlpZiAoaWR4ID09IEFSTVY3X0NZQ0xFX0NPVU5URVIpCi0JCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDAiIDogOiAiciIgKHZhbHVlKSk7Ci0JZWxzZSBpZiAoKGlkeCA+PSBBUk1WN19DT1VOVEVSMCkgJiYgKGlkeCA8PSBBUk1WN19DT1VOVEVSX0xBU1QpKSB7Ci0JCWlmIChhcm12N19wbW5jX3NlbGVjdF9jb3VudGVyKGlkeCkgPT0gaWR4KQotCQkJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMywgMiIKLQkJCQkgICAgIDogOiAiciIgKHZhbHVlKSk7Ci0JfSBlbHNlCisJaWYgKCFhcm12N19wbW5jX2NvdW50ZXJfdmFsaWQoaWR4KSkKIAkJcHJfZXJyKCJDUFUldSB3cml0aW5nIHdyb25nIGNvdW50ZXIgJWRcbiIsCiAJCQlzbXBfcHJvY2Vzc29yX2lkKCksIGlkeCk7CisJZWxzZSBpZiAoaWR4ID09IEFSTVY3X0lEWF9DWUNMRV9DT1VOVEVSKQorCQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzEzLCAwIiA6IDogInIiICh2YWx1ZSkpOworCWVsc2UgaWYgKGFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIoaWR4KSA9PSBpZHgpCisJCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDIiIDogOiAiciIgKHZhbHVlKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcm12N19wbW5jX3dyaXRlX2V2dHNlbCh1bnNpZ25lZCBpbnQgaWR4LCB1MzIgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIGFybXY3X3BtbmNfd3JpdGVfZXZ0c2VsKGludCBpZHgsIHUzMiB2YWwpCiB7CiAJaWYgKGFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIoaWR4KSA9PSBpZHgpIHsKLQkJdmFsICY9IEFSTVY3X0VWVFNFTF9NQVNLOworCQl2YWwgJj0gQVJNVjdfRVZUWVBFX01BU0s7CiAJCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDEiIDogOiAiciIgKHZhbCkpOwogCX0KIH0KIAotc3RhdGljIGlubGluZSB1MzIgYXJtdjdfcG1uY19lbmFibGVfY291bnRlcih1bnNpZ25lZCBpbnQgaWR4KQorc3RhdGljIGlubGluZSBpbnQgYXJtdjdfcG1uY19lbmFibGVfY291bnRlcihpbnQgaWR4KQogewotCXUzMiB2YWw7CisJdTMyIGNvdW50ZXI7CiAKLQlpZiAoKGlkeCAhPSBBUk1WN19DWUNMRV9DT1VOVEVSKSAmJgotCSAgICAoKGlkeCA8IEFSTVY3X0NPVU5URVIwKSB8fCAoaWR4ID4gQVJNVjdfQ09VTlRFUl9MQVNUKSkpIHsKLQkJcHJfZXJyKCJDUFUldSBlbmFibGluZyB3cm9uZyBQTU5DIGNvdW50ZXIiCi0JCQkiICVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGlkeCk7Ci0JCXJldHVybiAtMTsKKwlpZiAoIWFybXY3X3BtbmNfY291bnRlcl92YWxpZChpZHgpKSB7CisJCXByX2VycigiQ1BVJXUgZW5hYmxpbmcgd3JvbmcgUE1OQyBjb3VudGVyICVkXG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBpZHgpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoaWR4ID09IEFSTVY3X0NZQ0xFX0NPVU5URVIpCi0JCXZhbCA9IEFSTVY3X0NOVEVOU19DOwotCWVsc2UKLQkJdmFsID0gQVJNVjdfQ05URU5TX1AoaWR4KTsKLQotCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTIsIDEiIDogOiAiciIgKHZhbCkpOwotCisJY291bnRlciA9IEFSTVY3X0lEWF9UT19DT1VOVEVSKGlkeCk7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgMSIgOiA6ICJyIiAoQklUKGNvdW50ZXIpKSk7CiAJcmV0dXJuIGlkeDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgYXJtdjdfcG1uY19kaXNhYmxlX2NvdW50ZXIodW5zaWduZWQgaW50IGlkeCkKK3N0YXRpYyBpbmxpbmUgaW50IGFybXY3X3BtbmNfZGlzYWJsZV9jb3VudGVyKGludCBpZHgpCiB7Ci0JdTMyIHZhbDsKKwl1MzIgY291bnRlcjsKIAotCi0JaWYgKChpZHggIT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikgJiYKLQkgICAgKChpZHggPCBBUk1WN19DT1VOVEVSMCkgfHwgKGlkeCA+IEFSTVY3X0NPVU5URVJfTEFTVCkpKSB7Ci0JCXByX2VycigiQ1BVJXUgZGlzYWJsaW5nIHdyb25nIFBNTkMgY291bnRlciIKLQkJCSIgJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKLQkJcmV0dXJuIC0xOworCWlmICghYXJtdjdfcG1uY19jb3VudGVyX3ZhbGlkKGlkeCkpIHsKKwkJcHJfZXJyKCJDUFUldSBkaXNhYmxpbmcgd3JvbmcgUE1OQyBjb3VudGVyICVkXG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBpZHgpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoaWR4ID09IEFSTVY3X0NZQ0xFX0NPVU5URVIpCi0JCXZhbCA9IEFSTVY3X0NOVEVOQ19DOwotCWVsc2UKLQkJdmFsID0gQVJNVjdfQ05URU5DX1AoaWR4KTsKLQotCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTIsIDIiIDogOiAiciIgKHZhbCkpOwotCisJY291bnRlciA9IEFSTVY3X0lEWF9UT19DT1VOVEVSKGlkeCk7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgMiIgOiA6ICJyIiAoQklUKGNvdW50ZXIpKSk7CiAJcmV0dXJuIGlkeDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgYXJtdjdfcG1uY19lbmFibGVfaW50ZW5zKHVuc2lnbmVkIGludCBpZHgpCitzdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX2VuYWJsZV9pbnRlbnMoaW50IGlkeCkKIHsKLQl1MzIgdmFsOworCXUzMiBjb3VudGVyOwogCi0JaWYgKChpZHggIT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikgJiYKLQkgICAgKChpZHggPCBBUk1WN19DT1VOVEVSMCkgfHwgKGlkeCA+IEFSTVY3X0NPVU5URVJfTEFTVCkpKSB7Ci0JCXByX2VycigiQ1BVJXUgZW5hYmxpbmcgd3JvbmcgUE1OQyBjb3VudGVyIgotCQkJIiBpbnRlcnJ1cHQgZW5hYmxlICVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGlkeCk7Ci0JCXJldHVybiAtMTsKKwlpZiAoIWFybXY3X3BtbmNfY291bnRlcl92YWxpZChpZHgpKSB7CisJCXByX2VycigiQ1BVJXUgZW5hYmxpbmcgd3JvbmcgUE1OQyBjb3VudGVyIElSUSBlbmFibGUgJWRcbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCksIGlkeCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChpZHggPT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikKLQkJdmFsID0gQVJNVjdfSU5URU5TX0M7Ci0JZWxzZQotCQl2YWwgPSBBUk1WN19JTlRFTlNfUChpZHgpOwotCi0JYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxNCwgMSIgOiA6ICJyIiAodmFsKSk7Ci0KKwljb3VudGVyID0gQVJNVjdfSURYX1RPX0NPVU5URVIoaWR4KTsKKwlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzE0LCAxIiA6IDogInIiIChCSVQoY291bnRlcikpKTsKIAlyZXR1cm4gaWR4OwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBhcm12N19wbW5jX2Rpc2FibGVfaW50ZW5zKHVuc2lnbmVkIGludCBpZHgpCitzdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX2Rpc2FibGVfaW50ZW5zKGludCBpZHgpCiB7Ci0JdTMyIHZhbDsKKwl1MzIgY291bnRlcjsKIAotCWlmICgoaWR4ICE9IEFSTVY3X0NZQ0xFX0NPVU5URVIpICYmCi0JICAgICgoaWR4IDwgQVJNVjdfQ09VTlRFUjApIHx8IChpZHggPiBBUk1WN19DT1VOVEVSX0xBU1QpKSkgewotCQlwcl9lcnIoIkNQVSV1IGRpc2FibGluZyB3cm9uZyBQTU5DIGNvdW50ZXIiCi0JCQkiIGludGVycnVwdCBlbmFibGUgJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKLQkJcmV0dXJuIC0xOworCWlmICghYXJtdjdfcG1uY19jb3VudGVyX3ZhbGlkKGlkeCkpIHsKKwkJcHJfZXJyKCJDUFUldSBkaXNhYmxpbmcgd3JvbmcgUE1OQyBjb3VudGVyIElSUSBlbmFibGUgJWRcbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCksIGlkeCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChpZHggPT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikKLQkJdmFsID0gQVJNVjdfSU5URU5DX0M7Ci0JZWxzZQotCQl2YWwgPSBBUk1WN19JTlRFTkNfUChpZHgpOwotCi0JYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxNCwgMiIgOiA6ICJyIiAodmFsKSk7Ci0KKwljb3VudGVyID0gQVJNVjdfSURYX1RPX0NPVU5URVIoaWR4KTsKKwlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzE0LCAyIiA6IDogInIiIChCSVQoY291bnRlcikpKTsKIAlyZXR1cm4gaWR4OwogfQogCkBAIC05NzMsMTQgKzkyMSwxNCBAQAogCWFzbSB2b2xhdGlsZSgibXJjIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDAiIDogIj1yIiAodmFsKSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiQ0NOVCAgPTB4JTA4eFxuIiwgdmFsKTsKIAotCWZvciAoY250ID0gQVJNVjdfQ09VTlRFUjA7IGNudCA8IEFSTVY3X0NPVU5URVJfTEFTVDsgY250KyspIHsKKwlmb3IgKGNudCA9IEFSTVY3X0lEWF9DT1VOVEVSMDsgY250IDw9IEFSTVY3X0lEWF9DT1VOVEVSX0xBU1Q7IGNudCsrKSB7CiAJCWFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIoY250KTsKIAkJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMiIgOiAiPXIiICh2YWwpKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQ05UWyVkXSBjb3VudCA9MHglMDh4XG4iLAotCQkJY250LUFSTVY3X0VWRU5UX0NOVF9UT19DTlR4LCB2YWwpOworCQkJQVJNVjdfSURYX1RPX0NPVU5URVIoY250KSwgdmFsKTsKIAkJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMSIgOiAiPXIiICh2YWwpKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQ05UWyVkXSBldnRzZWw9MHglMDh4XG4iLAotCQkJY250LUFSTVY3X0VWRU5UX0NOVF9UT19DTlR4LCB2YWwpOworCQkJQVJNVjdfSURYX1RPX0NPVU5URVIoY250KSwgdmFsKTsKIAl9CiB9CiAjZW5kaWYKQEAgLTk4OCwxMiArOTM2LDEzIEBACiBzdGF0aWMgdm9pZCBhcm12N3BtdV9lbmFibGVfZXZlbnQoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywgaW50IGlkeCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKIAkvKgogCSAqIEVuYWJsZSBjb3VudGVyIGFuZCBpbnRlcnJ1cHQsIGFuZCBzZXQgdGhlIGNvdW50ZXIgdG8gY291bnQKIAkgKiB0aGUgZXZlbnQgdGhhdCB3ZSdyZSBpbnRlcmVzdGVkIGluLgogCSAqLwotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAogCS8qCiAJICogRGlzYWJsZSBjb3VudGVyCkBAIC0xMDAyLDkgKzk1MSwxMCBAQAogCiAJLyoKIAkgKiBTZXQgZXZlbnQgKGlmIGRlc3RpbmVkIGZvciBQTU54IGNvdW50ZXJzKQotCSAqIFdlIGRvbid0IG5lZWQgdG8gc2V0IHRoZSBldmVudCBpZiBpdCdzIGEgY3ljbGUgY291bnQKKwkgKiBXZSBvbmx5IG5lZWQgdG8gc2V0IHRoZSBldmVudCBmb3IgdGhlIGN5Y2xlIGNvdW50ZXIgaWYgd2UKKwkgKiBoYXZlIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gZXZlbnQgZmlsdGVyaW5nLgogCSAqLwotCWlmIChpZHggIT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikKKwlpZiAoYXJtdjdwbXUuc2V0X2V2ZW50X2ZpbHRlciB8fCBpZHggIT0gQVJNVjdfSURYX0NZQ0xFX0NPVU5URVIpCiAJCWFybXY3X3BtbmNfd3JpdGVfZXZ0c2VsKGlkeCwgaHdjLT5jb25maWdfYmFzZSk7CiAKIAkvKgpAQCAtMTAxNywxNyArOTY3LDE4IEBACiAJICovCiAJYXJtdjdfcG1uY19lbmFibGVfY291bnRlcihpZHgpOwogCi0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgYXJtdjdwbXVfZGlzYWJsZV9ldmVudChzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLCBpbnQgaWR4KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAogCS8qCiAJICogRGlzYWJsZSBjb3VudGVyIGFuZCBpbnRlcnJ1cHQKIAkgKi8KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAKIAkvKgogCSAqIERpc2FibGUgY291bnRlcgpAQCAtMTAzOSwxNCArOTkwLDE0IEBACiAJICovCiAJYXJtdjdfcG1uY19kaXNhYmxlX2ludGVucyhpZHgpOwogCi0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGFybXY3cG11X2hhbmRsZV9pcnEoaW50IGlycV9udW0sIHZvaWQgKmRldikKIHsKLQl1bnNpZ25lZCBsb25nIHBtbmM7CisJdTMyIHBtbmM7CiAJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKLQlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YzsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqY3B1YzsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAlpbnQgaWR4OwogCkBAIC0xMDY5LDEzICsxMDIwLDEwIEBACiAJcGVyZl9zYW1wbGVfZGF0YV9pbml0KCZkYXRhLCAwKTsKIAogCWNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKLQlmb3IgKGlkeCA9IDA7IGlkeCA8PSBhcm1wbXUtPm51bV9ldmVudHM7ICsraWR4KSB7CisJZm9yIChpZHggPSAwOyBpZHggPCBjcHVfcG11LT5udW1fZXZlbnRzOyArK2lkeCkgewogCQlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBjcHVjLT5ldmVudHNbaWR4XTsKIAkJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YzsKIAotCQlpZiAoIXRlc3RfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spKQotCQkJY29udGludWU7Ci0KIAkJLyoKIAkJICogV2UgaGF2ZSBhIHNpbmdsZSBpbnRlcnJ1cHQgZm9yIGFsbCBjb3VudGVycy4gQ2hlY2sgdGhhdAogCQkgKiBlYWNoIGNvdW50ZXIgaGFzIG92ZXJmbG93ZWQgYmVmb3JlIHdlIHByb2Nlc3MgaXQuCkBAIC0xMDkwLDcgKzEwMzgsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsICZkYXRhLCByZWdzKSkKLQkJCWFybXBtdS0+ZGlzYWJsZShod2MsIGlkeCk7CisJCQljcHVfcG11LT5kaXNhYmxlKGh3YywgaWR4KTsKIAl9CiAKIAkvKgpAQCAtMTEwOCw2MSArMTA1NiwxMTQgQEAKIHN0YXRpYyB2b2lkIGFybXY3cG11X3N0YXJ0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCS8qIEVuYWJsZSBhbGwgY291bnRlcnMgKi8KIAlhcm12N19wbW5jX3dyaXRlKGFybXY3X3BtbmNfcmVhZCgpIHwgQVJNVjdfUE1OQ19FKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBhcm12N3BtdV9zdG9wKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCS8qIERpc2FibGUgYWxsIGNvdW50ZXJzICovCiAJYXJtdjdfcG1uY193cml0ZShhcm12N19wbW5jX3JlYWQoKSAmIH5BUk1WN19QTU5DX0UpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgYXJtdjdwbXVfZ2V0X2V2ZW50X2lkeChzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywKK3N0YXRpYyBpbnQgYXJtdjdwbXVfZ2V0X2V2ZW50X2lkeChzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqY3B1YywKIAkJCQkgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpldmVudCkKIHsKIAlpbnQgaWR4OworCXVuc2lnbmVkIGxvbmcgZXZ0eXBlID0gZXZlbnQtPmNvbmZpZ19iYXNlICYgQVJNVjdfRVZUWVBFX0VWRU5UOwogCiAJLyogQWx3YXlzIHBsYWNlIGEgY3ljbGUgY291bnRlciBpbnRvIHRoZSBjeWNsZSBjb3VudGVyLiAqLwotCWlmIChldmVudC0+Y29uZmlnX2Jhc2UgPT0gQVJNVjdfUEVSRkNUUl9DUFVfQ1lDTEVTKSB7Ci0JCWlmICh0ZXN0X2FuZF9zZXRfYml0KEFSTVY3X0NZQ0xFX0NPVU5URVIsIGNwdWMtPnVzZWRfbWFzaykpCisJaWYgKGV2dHlwZSA9PSBBUk1WN19QRVJGQ1RSX0NQVV9DWUNMRVMpIHsKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQVJNVjdfSURYX0NZQ0xFX0NPVU5URVIsIGNwdWMtPnVzZWRfbWFzaykpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAotCQlyZXR1cm4gQVJNVjdfQ1lDTEVfQ09VTlRFUjsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBGb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBhIGN5Y2xlIGNvdW50ZXIsIHRyeSBhbmQgdXNlCi0JCSAqIHRoZSBldmVudHMgY291bnRlcnMKLQkJICovCi0JCWZvciAoaWR4ID0gQVJNVjdfQ09VTlRFUjA7IGlkeCA8PSBhcm1wbXUtPm51bV9ldmVudHM7ICsraWR4KSB7Ci0JCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaWR4LCBjcHVjLT51c2VkX21hc2spKQotCQkJCXJldHVybiBpZHg7Ci0JCX0KLQotCQkvKiBUaGUgY291bnRlcnMgYXJlIGFsbCBpbiB1c2UuICovCi0JCXJldHVybiAtRUFHQUlOOworCQlyZXR1cm4gQVJNVjdfSURYX0NZQ0xFX0NPVU5URVI7CiAJfQorCisJLyoKKwkgKiBGb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBhIGN5Y2xlIGNvdW50ZXIsIHRyeSBhbmQgdXNlCisJICogdGhlIGV2ZW50cyBjb3VudGVycworCSAqLworCWZvciAoaWR4ID0gQVJNVjdfSURYX0NPVU5URVIwOyBpZHggPCBjcHVfcG11LT5udW1fZXZlbnRzOyArK2lkeCkgeworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaWR4LCBjcHVjLT51c2VkX21hc2spKQorCQkJcmV0dXJuIGlkeDsKKwl9CisKKwkvKiBUaGUgY291bnRlcnMgYXJlIGFsbCBpbiB1c2UuICovCisJcmV0dXJuIC1FQUdBSU47Cit9CisKKy8qCisgKiBBZGQgYW4gZXZlbnQgZmlsdGVyIHRvIGEgZ2l2ZW4gZXZlbnQuIFRoaXMgd2lsbCBvbmx5IHdvcmsgZm9yIFBNVXYyIFBNVXMuCisgKi8KK3N0YXRpYyBpbnQgYXJtdjdwbXVfc2V0X2V2ZW50X2ZpbHRlcihzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqZXZlbnQsCisJCQkJICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQoreworCXVuc2lnbmVkIGxvbmcgY29uZmlnX2Jhc2UgPSAwOworCisJaWYgKGF0dHItPmV4Y2x1ZGVfaWRsZSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoYXR0ci0+ZXhjbHVkZV91c2VyKQorCQljb25maWdfYmFzZSB8PSBBUk1WN19FWENMVURFX1VTRVI7CisJaWYgKGF0dHItPmV4Y2x1ZGVfa2VybmVsKQorCQljb25maWdfYmFzZSB8PSBBUk1WN19FWENMVURFX1BMMTsKKwlpZiAoIWF0dHItPmV4Y2x1ZGVfaHYpCisJCWNvbmZpZ19iYXNlIHw9IEFSTVY3X0lOQ0xVREVfSFlQOworCisJLyoKKwkgKiBJbnN0YWxsIHRoZSBmaWx0ZXIgaW50byBjb25maWdfYmFzZSBhcyB0aGlzIGlzIHVzZWQgdG8KKwkgKiBjb25zdHJ1Y3QgdGhlIGV2ZW50IHR5cGUuCisJICovCisJZXZlbnQtPmNvbmZpZ19iYXNlID0gY29uZmlnX2Jhc2U7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYXJtdjdwbXVfcmVzZXQodm9pZCAqaW5mbykKIHsKLQl1MzIgaWR4LCBuYl9jbnQgPSBhcm1wbXUtPm51bV9ldmVudHM7CisJdTMyIGlkeCwgbmJfY250ID0gY3B1X3BtdS0+bnVtX2V2ZW50czsKIAogCS8qIFRoZSBjb3VudGVyIGFuZCBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVycyBhcmUgdW5rbm93biBhdCByZXNldC4gKi8KLQlmb3IgKGlkeCA9IDE7IGlkeCA8IG5iX2NudDsgKytpZHgpCisJZm9yIChpZHggPSBBUk1WN19JRFhfQ1lDTEVfQ09VTlRFUjsgaWR4IDwgbmJfY250OyArK2lkeCkKIAkJYXJtdjdwbXVfZGlzYWJsZV9ldmVudChOVUxMLCBpZHgpOwogCiAJLyogSW5pdGlhbGl6ZSAmIFJlc2V0IFBNTkM6IEMgYW5kIFAgYml0cyAqLwogCWFybXY3X3BtbmNfd3JpdGUoQVJNVjdfUE1OQ19QIHwgQVJNVjdfUE1OQ19DKTsKIH0KIAorc3RhdGljIGludCBhcm12N19hOF9tYXBfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBtYXBfY3B1X2V2ZW50KGV2ZW50LCAmYXJtdjdfYThfcGVyZl9tYXAsCisJCQkJJmFybXY3X2E4X3BlcmZfY2FjaGVfbWFwLCAweEZGKTsKK30KKworc3RhdGljIGludCBhcm12N19hOV9tYXBfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBtYXBfY3B1X2V2ZW50KGV2ZW50LCAmYXJtdjdfYTlfcGVyZl9tYXAsCisJCQkJJmFybXY3X2E5X3BlcmZfY2FjaGVfbWFwLCAweEZGKTsKK30KKworc3RhdGljIGludCBhcm12N19hNV9tYXBfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBtYXBfY3B1X2V2ZW50KGV2ZW50LCAmYXJtdjdfYTVfcGVyZl9tYXAsCisJCQkJJmFybXY3X2E1X3BlcmZfY2FjaGVfbWFwLCAweEZGKTsKK30KKworc3RhdGljIGludCBhcm12N19hMTVfbWFwX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlyZXR1cm4gbWFwX2NwdV9ldmVudChldmVudCwgJmFybXY3X2ExNV9wZXJmX21hcCwKKwkJCQkmYXJtdjdfYTE1X3BlcmZfY2FjaGVfbWFwLCAweEZGKTsKK30KKwogc3RhdGljIHN0cnVjdCBhcm1fcG11IGFybXY3cG11ID0gewogCS5oYW5kbGVfaXJxCQk9IGFybXY3cG11X2hhbmRsZV9pcnEsCiAJLmVuYWJsZQkJCT0gYXJtdjdwbXVfZW5hYmxlX2V2ZW50LApAQCAtMTE3Myw3ICsxMTc0LDYgQEAKIAkuc3RhcnQJCQk9IGFybXY3cG11X3N0YXJ0LAogCS5zdG9wCQkJPSBhcm12N3BtdV9zdG9wLAogCS5yZXNldAkJCT0gYXJtdjdwbXVfcmVzZXQsCi0JLnJhd19ldmVudF9tYXNrCQk9IDB4RkYsCiAJLm1heF9wZXJpb2QJCT0gKDFMTFUgPDwgMzIpIC0gMSwKIH07CiAKQEAgLTExODgsNjIgKzExODgsNTkgQEAKIAlyZXR1cm4gbmJfY250ICsgMTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYThfcG11X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E4X3BtdV9pbml0KHZvaWQpCiB7CiAJYXJtdjdwbXUuaWQJCT0gQVJNX1BFUkZfUE1VX0lEX0NBODsKIAlhcm12N3BtdS5uYW1lCQk9ICJBUk12NyBDb3J0ZXgtQTgiOwotCWFybXY3cG11LmNhY2hlX21hcAk9ICZhcm12N19hOF9wZXJmX2NhY2hlX21hcDsKLQlhcm12N3BtdS5ldmVudF9tYXAJPSAmYXJtdjdfYThfcGVyZl9tYXA7CisJYXJtdjdwbXUubWFwX2V2ZW50CT0gYXJtdjdfYThfbWFwX2V2ZW50OwogCWFybXY3cG11Lm51bV9ldmVudHMJPSBhcm12N19yZWFkX251bV9wbW5jX2V2ZW50cygpOwogCXJldHVybiAmYXJtdjdwbXU7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E5X3BtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hOV9wbXVfaW5pdCh2b2lkKQogewogCWFybXY3cG11LmlkCQk9IEFSTV9QRVJGX1BNVV9JRF9DQTk7CiAJYXJtdjdwbXUubmFtZQkJPSAiQVJNdjcgQ29ydGV4LUE5IjsKLQlhcm12N3BtdS5jYWNoZV9tYXAJPSAmYXJtdjdfYTlfcGVyZl9jYWNoZV9tYXA7Ci0JYXJtdjdwbXUuZXZlbnRfbWFwCT0gJmFybXY3X2E5X3BlcmZfbWFwOworCWFybXY3cG11Lm1hcF9ldmVudAk9IGFybXY3X2E5X21hcF9ldmVudDsKIAlhcm12N3BtdS5udW1fZXZlbnRzCT0gYXJtdjdfcmVhZF9udW1fcG1uY19ldmVudHMoKTsKIAlyZXR1cm4gJmFybXY3cG11OwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hNV9wbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYTVfcG11X2luaXQodm9pZCkKIHsKIAlhcm12N3BtdS5pZAkJPSBBUk1fUEVSRl9QTVVfSURfQ0E1OwogCWFybXY3cG11Lm5hbWUJCT0gIkFSTXY3IENvcnRleC1BNSI7Ci0JYXJtdjdwbXUuY2FjaGVfbWFwCT0gJmFybXY3X2E1X3BlcmZfY2FjaGVfbWFwOwotCWFybXY3cG11LmV2ZW50X21hcAk9ICZhcm12N19hNV9wZXJmX21hcDsKKwlhcm12N3BtdS5tYXBfZXZlbnQJPSBhcm12N19hNV9tYXBfZXZlbnQ7CiAJYXJtdjdwbXUubnVtX2V2ZW50cwk9IGFybXY3X3JlYWRfbnVtX3BtbmNfZXZlbnRzKCk7CiAJcmV0dXJuICZhcm12N3BtdTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYTE1X3BtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hMTVfcG11X2luaXQodm9pZCkKIHsKIAlhcm12N3BtdS5pZAkJPSBBUk1fUEVSRl9QTVVfSURfQ0ExNTsKIAlhcm12N3BtdS5uYW1lCQk9ICJBUk12NyBDb3J0ZXgtQTE1IjsKLQlhcm12N3BtdS5jYWNoZV9tYXAJPSAmYXJtdjdfYTE1X3BlcmZfY2FjaGVfbWFwOwotCWFybXY3cG11LmV2ZW50X21hcAk9ICZhcm12N19hMTVfcGVyZl9tYXA7CisJYXJtdjdwbXUubWFwX2V2ZW50CT0gYXJtdjdfYTE1X21hcF9ldmVudDsKIAlhcm12N3BtdS5udW1fZXZlbnRzCT0gYXJtdjdfcmVhZF9udW1fcG1uY19ldmVudHMoKTsKKwlhcm12N3BtdS5zZXRfZXZlbnRfZmlsdGVyID0gYXJtdjdwbXVfc2V0X2V2ZW50X2ZpbHRlcjsKIAlyZXR1cm4gJmFybXY3cG11OwogfQogI2Vsc2UKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E4X3BtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hOF9wbXVfaW5pdCh2b2lkKQogewogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hOV9wbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYTlfcG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYTVfcG11X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E1X3BtdV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2ExNV9wbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYTE1X3BtdV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF94c2NhbGUuYyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3hzY2FsZS5jCmluZGV4IDNjNDM5NzQuLmUwY2NhMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3hzY2FsZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3hzY2FsZS5jCkBAIC00MCw3ICs0MCw3IEBACiB9OwogCiBlbnVtIHhzY2FsZV9jb3VudGVycyB7Ci0JWFNDQUxFX0NZQ0xFX0NPVU5URVIJPSAxLAorCVhTQ0FMRV9DWUNMRV9DT1VOVEVSCT0gMCwKIAlYU0NBTEVfQ09VTlRFUjAsCiAJWFNDQUxFX0NPVU5URVIxLAogCVhTQ0FMRV9DT1VOVEVSMiwKQEAgLTIyMiw3ICsyMjIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcG1uYzsKIAlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSBkYXRhOwotCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpjcHVjOwogCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCWludCBpZHg7CiAKQEAgLTI0OSwxMyArMjQ5LDEwIEBACiAJcGVyZl9zYW1wbGVfZGF0YV9pbml0KCZkYXRhLCAwKTsKIAogCWNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKLQlmb3IgKGlkeCA9IDA7IGlkeCA8PSBhcm1wbXUtPm51bV9ldmVudHM7ICsraWR4KSB7CisJZm9yIChpZHggPSAwOyBpZHggPCBjcHVfcG11LT5udW1fZXZlbnRzOyArK2lkeCkgewogCQlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBjcHVjLT5ldmVudHNbaWR4XTsKIAkJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YzsKIAotCQlpZiAoIXRlc3RfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spKQotCQkJY29udGludWU7Ci0KIAkJaWYgKCF4c2NhbGUxX3BtbmNfY291bnRlcl9oYXNfb3ZlcmZsb3dlZChwbW5jLCBpZHgpKQogCQkJY29udGludWU7CiAKQEAgLTI2Niw3ICsyNjMsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsICZkYXRhLCByZWdzKSkKLQkJCWFybXBtdS0+ZGlzYWJsZShod2MsIGlkeCk7CisJCQljcHVfcG11LT5kaXNhYmxlKGh3YywgaWR4KTsKIAl9CiAKIAlpcnFfd29ya19ydW4oKTsKQEAgLTI4NCw2ICsyODEsNyBAQAogeHNjYWxlMXBtdV9lbmFibGVfZXZlbnQoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywgaW50IGlkeCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbCwgbWFzaywgZXZ0LCBmbGFnczsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCiAJc3dpdGNoIChpZHgpIHsKIAljYXNlIFhTQ0FMRV9DWUNMRV9DT1VOVEVSOgpAQCAtMzA1LDE4ICszMDMsMTkgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAl2YWwgPSB4c2NhbGUxcG11X3JlYWRfcG1uYygpOwogCXZhbCAmPSB+bWFzazsKIAl2YWwgfD0gZXZ0OwogCXhzY2FsZTFwbXVfd3JpdGVfcG1uYyh2YWwpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkCiB4c2NhbGUxcG11X2Rpc2FibGVfZXZlbnQoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywgaW50IGlkeCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbCwgbWFzaywgZXZ0LCBmbGFnczsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCiAJc3dpdGNoIChpZHgpIHsKIAljYXNlIFhTQ0FMRV9DWUNMRV9DT1VOVEVSOgpAQCAtMzM2LDE2ICszMzUsMTYgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAl2YWwgPSB4c2NhbGUxcG11X3JlYWRfcG1uYygpOwogCXZhbCAmPSB+bWFzazsKIAl2YWwgfD0gZXZ0OwogCXhzY2FsZTFwbXVfd3JpdGVfcG1uYyh2YWwpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKLXhzY2FsZTFwbXVfZ2V0X2V2ZW50X2lkeChzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywKK3hzY2FsZTFwbXVfZ2V0X2V2ZW50X2lkeChzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqY3B1YywKIAkJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpldmVudCkKIHsKIAlpZiAoWFNDQUxFX1BFUkZDVFJfQ0NOVCA9PSBldmVudC0+Y29uZmlnX2Jhc2UpIHsKQEAgLTM2OCwyNCArMzY3LDI2IEBACiB4c2NhbGUxcG11X3N0YXJ0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgdmFsOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJdmFsID0geHNjYWxlMXBtdV9yZWFkX3BtbmMoKTsKIAl2YWwgfD0gWFNDQUxFX1BNVV9FTkFCTEU7CiAJeHNjYWxlMXBtdV93cml0ZV9wbW5jKHZhbCk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQKIHhzY2FsZTFwbXVfc3RvcCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZhbDsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCXZhbCA9IHhzY2FsZTFwbXVfcmVhZF9wbW5jKCk7CiAJdmFsICY9IH5YU0NBTEVfUE1VX0VOQUJMRTsKIAl4c2NhbGUxcG11X3dyaXRlX3BtbmModmFsKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMgpAQCAtNDI0LDcgKzQyNSwxMyBAQAogCX0KIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11IHhzY2FsZTFwbXUgPSB7CitzdGF0aWMgaW50IHhzY2FsZV9tYXBfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBtYXBfY3B1X2V2ZW50KGV2ZW50LCAmeHNjYWxlX3BlcmZfbWFwLAorCQkJCSZ4c2NhbGVfcGVyZl9jYWNoZV9tYXAsIDB4RkYpOworfQorCitzdGF0aWMgc3RydWN0IGFybV9wbXUgeHNjYWxlMXBtdSA9IHsKIAkuaWQJCT0gQVJNX1BFUkZfUE1VX0lEX1hTQ0FMRTEsCiAJLm5hbWUJCT0gInhzY2FsZTEiLAogCS5oYW5kbGVfaXJxCT0geHNjYWxlMXBtdV9oYW5kbGVfaXJxLApAQCAtNDM1LDE0ICs0NDIsMTIgQEAKIAkuZ2V0X2V2ZW50X2lkeAk9IHhzY2FsZTFwbXVfZ2V0X2V2ZW50X2lkeCwKIAkuc3RhcnQJCT0geHNjYWxlMXBtdV9zdGFydCwKIAkuc3RvcAkJPSB4c2NhbGUxcG11X3N0b3AsCi0JLmNhY2hlX21hcAk9ICZ4c2NhbGVfcGVyZl9jYWNoZV9tYXAsCi0JLmV2ZW50X21hcAk9ICZ4c2NhbGVfcGVyZl9tYXAsCi0JLnJhd19ldmVudF9tYXNrCT0gMHhGRiwKKwkubWFwX2V2ZW50CT0geHNjYWxlX21hcF9ldmVudCwKIAkubnVtX2V2ZW50cwk9IDMsCiAJLm1heF9wZXJpb2QJPSAoMUxMVSA8PCAzMikgLSAxLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgeHNjYWxlMXBtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCB4c2NhbGUxcG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gJnhzY2FsZTFwbXU7CiB9CkBAIC01NjAsNyArNTY1LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHBtbmMsIG9mX2ZsYWdzOwogCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIGRhdGE7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWM7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmNwdWM7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJaW50IGlkeDsKIApAQCAtNTgxLDEzICs1ODYsMTAgQEAKIAlwZXJmX3NhbXBsZV9kYXRhX2luaXQoJmRhdGEsIDApOwogCiAJY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCWZvciAoaWR4ID0gMDsgaWR4IDw9IGFybXBtdS0+bnVtX2V2ZW50czsgKytpZHgpIHsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNwdV9wbXUtPm51bV9ldmVudHM7ICsraWR4KSB7CiAJCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGNwdWMtPmV2ZW50c1tpZHhdOwogCQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjOwogCi0JCWlmICghdGVzdF9iaXQoaWR4LCBjcHVjLT5hY3RpdmVfbWFzaykpCi0JCQljb250aW51ZTsKLQogCQlpZiAoIXhzY2FsZTJfcG1uY19jb3VudGVyX2hhc19vdmVyZmxvd2VkKHBtbmMsIGlkeCkpCiAJCQljb250aW51ZTsKIApAQCAtNTk4LDcgKzYwMCw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgJmRhdGEsIHJlZ3MpKQotCQkJYXJtcG11LT5kaXNhYmxlKGh3YywgaWR4KTsKKwkJCWNwdV9wbXUtPmRpc2FibGUoaHdjLCBpZHgpOwogCX0KIAogCWlycV93b3JrX3J1bigpOwpAQCAtNjE2LDYgKzYxOCw3IEBACiB4c2NhbGUycG11X2VuYWJsZV9ldmVudChzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLCBpbnQgaWR4KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGllbiwgZXZ0c2VsOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKIAlpZW4gPSB4c2NhbGUycG11X3JlYWRfaW50X2VuYWJsZSgpOwogCWV2dHNlbCA9IHhzY2FsZTJwbXVfcmVhZF9ldmVudF9zZWxlY3QoKTsKQEAgLTY0OSwxNiArNjUyLDE3IEBACiAJCXJldHVybjsKIAl9CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJeHNjYWxlMnBtdV93cml0ZV9ldmVudF9zZWxlY3QoZXZ0c2VsKTsKIAl4c2NhbGUycG11X3dyaXRlX2ludF9lbmFibGUoaWVuKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZAogeHNjYWxlMnBtdV9kaXNhYmxlX2V2ZW50KHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsIGludCBpZHgpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgaWVuLCBldnRzZWw7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAogCWllbiA9IHhzY2FsZTJwbXVfcmVhZF9pbnRfZW5hYmxlKCk7CiAJZXZ0c2VsID0geHNjYWxlMnBtdV9yZWFkX2V2ZW50X3NlbGVjdCgpOwpAQCAtNjkyLDE0ICs2OTYsMTQgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAl4c2NhbGUycG11X3dyaXRlX2V2ZW50X3NlbGVjdChldnRzZWwpOwogCXhzY2FsZTJwbXVfd3JpdGVfaW50X2VuYWJsZShpZW4pOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKLXhzY2FsZTJwbXVfZ2V0X2V2ZW50X2lkeChzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywKK3hzY2FsZTJwbXVfZ2V0X2V2ZW50X2lkeChzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqY3B1YywKIAkJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpldmVudCkKIHsKIAlpbnQgaWR4ID0geHNjYWxlMXBtdV9nZXRfZXZlbnRfaWR4KGNwdWMsIGV2ZW50KTsKQEAgLTcxOCwyNCArNzIyLDI2IEBACiB4c2NhbGUycG11X3N0YXJ0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgdmFsOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJdmFsID0geHNjYWxlMnBtdV9yZWFkX3BtbmMoKSAmIH5YU0NBTEVfUE1VX0NOVDY0OwogCXZhbCB8PSBYU0NBTEVfUE1VX0VOQUJMRTsKIAl4c2NhbGUycG11X3dyaXRlX3BtbmModmFsKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZAogeHNjYWxlMnBtdV9zdG9wKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgdmFsOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJdmFsID0geHNjYWxlMnBtdV9yZWFkX3BtbmMoKTsKIAl2YWwgJj0gflhTQ0FMRV9QTVVfRU5BQkxFOwogCXhzY2FsZTJwbXVfd3JpdGVfcG1uYyh2YWwpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyCkBAIC03ODYsNyArNzkyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSB4c2NhbGUycG11ID0geworc3RhdGljIHN0cnVjdCBhcm1fcG11IHhzY2FsZTJwbXUgPSB7CiAJLmlkCQk9IEFSTV9QRVJGX1BNVV9JRF9YU0NBTEUyLAogCS5uYW1lCQk9ICJ4c2NhbGUyIiwKIAkuaGFuZGxlX2lycQk9IHhzY2FsZTJwbXVfaGFuZGxlX2lycSwKQEAgLTc5NywyNCArODAzLDIyIEBACiAJLmdldF9ldmVudF9pZHgJPSB4c2NhbGUycG11X2dldF9ldmVudF9pZHgsCiAJLnN0YXJ0CQk9IHhzY2FsZTJwbXVfc3RhcnQsCiAJLnN0b3AJCT0geHNjYWxlMnBtdV9zdG9wLAotCS5jYWNoZV9tYXAJPSAmeHNjYWxlX3BlcmZfY2FjaGVfbWFwLAotCS5ldmVudF9tYXAJPSAmeHNjYWxlX3BlcmZfbWFwLAotCS5yYXdfZXZlbnRfbWFzawk9IDB4RkYsCisJLm1hcF9ldmVudAk9IHhzY2FsZV9tYXBfZXZlbnQsCiAJLm51bV9ldmVudHMJPSA1LAogCS5tYXhfcGVyaW9kCT0gKDFMTFUgPDwgMzIpIC0gMSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IHhzY2FsZTJwbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgeHNjYWxlMnBtdV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuICZ4c2NhbGUycG11OwogfQogI2Vsc2UKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IHhzY2FsZTFwbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgeHNjYWxlMXBtdV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IHhzY2FsZTJwbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgeHNjYWxlMnBtdV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcGo0LWNwMC5jIGIvYXJjaC9hcm0va2VybmVsL3BqNC1jcDAuYwppbmRleCBhNGIxYjA3Li42NzljZjRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcGo0LWNwMC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wajQtY3AwLmMKQEAgLTEwLDcgKzEwLDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BtdS5jIGIvYXJjaC9hcm0va2VybmVsL3BtdS5jCmluZGV4IGM1MzQ3NGYuLjJjMzQwN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wbXUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcG11LmMKQEAgLTEwLDE5MiArMTAsMjYgQEAKICAqCiAgKi8KIAotI2RlZmluZSBwcl9mbXQoZm10KSAiUE1VOiAiIGZtdAotCi0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BtdS5oPgogCi1zdGF0aWMgdm9sYXRpbGUgbG9uZyBwbXVfbG9jazsKKy8qCisgKiBQTVUgbG9ja2luZyB0byBlbnN1cmUgbXV0dWFsIGV4Y2x1c2lvbiBiZXR3ZWVuIGRpZmZlcmVudCBzdWJzeXN0ZW1zLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbXVfbG9ja1tCSVRTX1RPX0xPTkdTKEFSTV9OVU1fUE1VX0RFVklDRVMpXTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBtdV9kZXZpY2VzW0FSTV9OVU1fUE1VX0RFVklDRVNdOwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwbXVfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQkJZW51bSBhcm1fcG11X3R5cGUgdHlwZSkKLXsKLQlpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBBUk1fTlVNX1BNVV9ERVZJQ0VTKSB7Ci0JCXByX3dhcm5pbmcoInJlY2VpdmVkIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IGZvciB1bmtub3duICIKLQkJCQkiUE1VIGRldmljZSB0eXBlICVkXG4iLCB0eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHBtdV9kZXZpY2VzW3R5cGVdKSB7Ci0JCXByX3dhcm5pbmcoInJlamVjdGluZyBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIFBNVSBkZXZpY2UgIgotCQkJInR5cGUgJWQuIiwgdHlwZSk7Ci0JCXJldHVybiAtRU5PU1BDOwotCX0KLQotCXByX2luZm8oInJlZ2lzdGVyZWQgbmV3IFBNVSBkZXZpY2Ugb2YgdHlwZSAlZFxuIiwgdHlwZSk7Ci0JcG11X2RldmljZXNbdHlwZV0gPSBwZGV2OwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIE9GX01BVENIX1BNVShfbmFtZSwgX3R5cGUpIHsJXAotCS5jb21wYXRpYmxlID0gX25hbWUsCQlcCi0JLmRhdGEgPSAodm9pZCAqKV90eXBlLAkJXAotfQotCi0jZGVmaW5lIE9GX01BVENIX0NQVShuYW1lKQlPRl9NQVRDSF9QTVUobmFtZSwgQVJNX1BNVV9ERVZJQ0VfQ1BVKQotCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBhcm1wbXVfb2ZfZGV2aWNlX2lkc1tdID0gewotCU9GX01BVENIX0NQVSgiYXJtLGNvcnRleC1hOS1wbXUiKSwKLQlPRl9NQVRDSF9DUFUoImFybSxjb3J0ZXgtYTgtcG11IiksCi0JT0ZfTUFUQ0hfQ1BVKCJhcm0sYXJtMTEzNi1wbXUiKSwKLQlPRl9NQVRDSF9DUFUoImFybSxhcm0xMTc2LXBtdSIpLAotCXt9LAotfTsKLQotI2RlZmluZSBQTEFUX01BVENIX1BNVShfbmFtZSwgX3R5cGUpIHsJXAotCS5uYW1lCQk9IF9uYW1lLAlcCi0JLmRyaXZlcl9kYXRhCT0gX3R5cGUsCVwKLX0KLQotI2RlZmluZSBQTEFUX01BVENIX0NQVShfbmFtZSkJUExBVF9NQVRDSF9QTVUoX25hbWUsIEFSTV9QTVVfREVWSUNFX0NQVSkKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgYXJtcG11X3BsYXRfZGV2aWNlX2lkc1tdID0gewotCVBMQVRfTUFUQ0hfQ1BVKCJhcm0tcG11IiksCi0Je30sCi19OwotCi1lbnVtIGFybV9wbXVfdHlwZSBhcm1wbXVfZGV2aWNlX3R5cGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkCSpvZl9pZDsKLQljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICpwZGV2X2lkOwotCi0JLyogcHJvdmlkZWQgYnkgb2ZfZGV2aWNlX2lkIHRhYmxlICovCi0JaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7Ci0JCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGFybXBtdV9vZl9kZXZpY2VfaWRzLCAmcGRldi0+ZGV2KTsKLQkJQlVHX09OKCFvZl9pZCk7Ci0JCXJldHVybiAoZW51bSBhcm1fcG11X3R5cGUpb2ZfaWQtPmRhdGE7Ci0JfQotCi0JLyogUHJvdmlkZWQgYnkgcGxhdGZvcm1fZGV2aWNlX2lkIHRhYmxlICovCi0JcGRldl9pZCA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldik7Ci0JQlVHX09OKCFwZGV2X2lkKTsKLQlyZXR1cm4gcGRldl9pZC0+ZHJpdmVyX2RhdGE7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGFybXBtdV9kZXZpY2VfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gcG11X3JlZ2lzdGVyKHBkZXYsIGFybXBtdV9kZXZpY2VfdHlwZShwZGV2KSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFybXBtdV9kcml2ZXIgPSB7Ci0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gImFybS1wbXUiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBhcm1wbXVfb2ZfZGV2aWNlX2lkcywKLQl9LAotCS5wcm9iZQkJPSBhcm1wbXVfZGV2aWNlX3Byb2JlLAotCS5pZF90YWJsZQk9IGFybXBtdV9wbGF0X2RldmljZV9pZHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9wbXVfZHJpdmVyKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXJtcG11X2RyaXZlcik7Ci19Ci1kZXZpY2VfaW5pdGNhbGwocmVnaXN0ZXJfcG11X2RyaXZlcik7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKgoraW50CiByZXNlcnZlX3BtdShlbnVtIGFybV9wbXVfdHlwZSB0eXBlKQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0KLQlpZiAodGVzdF9hbmRfc2V0X2JpdF9sb2NrKHR5cGUsICZwbXVfbG9jaykpIHsKLQkJcGRldiA9IEVSUl9QVFIoLUVCVVNZKTsKLQl9IGVsc2UgaWYgKHBtdV9kZXZpY2VzW3R5cGVdID09IE5VTEwpIHsKLQkJY2xlYXJfYml0X3VubG9jayh0eXBlLCAmcG11X2xvY2spOwotCQlwZGV2ID0gRVJSX1BUUigtRU5PREVWKTsKLQl9IGVsc2UgewotCQlwZGV2ID0gcG11X2RldmljZXNbdHlwZV07Ci0JfQotCi0JcmV0dXJuIHBkZXY7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXRfbG9jayh0eXBlLCBwbXVfbG9jaykgPyAtRUJVU1kgOiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVzZXJ2ZV9wbXUpOwogCi1pbnQKK3ZvaWQKIHJlbGVhc2VfcG11KGVudW0gYXJtX3BtdV90eXBlIHR5cGUpCiB7Ci0JaWYgKFdBUk5fT04oIXBtdV9kZXZpY2VzW3R5cGVdKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JY2xlYXJfYml0X3VubG9jayh0eXBlLCAmcG11X2xvY2spOwotCXJldHVybiAwOworCWNsZWFyX2JpdF91bmxvY2sodHlwZSwgcG11X2xvY2spOwogfQotRVhQT1JUX1NZTUJPTF9HUEwocmVsZWFzZV9wbXUpOwotCi1zdGF0aWMgaW50Ci1zZXRfaXJxX2FmZmluaXR5KGludCBpcnEsCi0JCSB1bnNpZ25lZCBpbnQgY3B1KQotewotI2lmZGVmIENPTkZJR19TTVAKLQlpbnQgZXJyID0gaXJxX3NldF9hZmZpbml0eShpcnEsIGNwdW1hc2tfb2YoY3B1KSk7Ci0JaWYgKGVycikKLQkJcHJfd2FybmluZygidW5hYmxlIHRvIHNldCBpcnEgYWZmaW5pdHkgKGlycT0lZCwgY3B1PSV1KVxuIiwKLQkJCSAgIGlycSwgY3B1KTsKLQlyZXR1cm4gZXJyOwotI2Vsc2UKLQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50Ci1pbml0X2NwdV9wbXUodm9pZCkKLXsKLQlpbnQgaSwgaXJxcywgZXJyID0gMDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gcG11X2RldmljZXNbQVJNX1BNVV9ERVZJQ0VfQ1BVXTsKLQotCWlmICghcGRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpcnFzID0gcGRldi0+bnVtX3Jlc291cmNlczsKLQotCS8qCi0JICogSWYgd2UgaGF2ZSBhIHNpbmdsZSBQTVUgaW50ZXJydXB0IHRoYXQgd2UgY2FuJ3Qgc2hpZnQsIGFzc3VtZSB0aGF0Ci0JICogd2UncmUgcnVubmluZyBvbiBhIHVuaXByb2Nlc3NvciBtYWNoaW5lIGFuZCBjb250aW51ZS4KLQkgKi8KLQlpZiAoaXJxcyA9PSAxICYmICFpcnFfY2FuX3NldF9hZmZpbml0eShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApKSkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaXJxczsgKytpKSB7Ci0JCWVyciA9IHNldF9pcnFfYWZmaW5pdHkocGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKSwgaSk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1pbnQKLWluaXRfcG11KGVudW0gYXJtX3BtdV90eXBlIHR5cGUpCi17Ci0JaW50IGVyciA9IDA7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEFSTV9QTVVfREVWSUNFX0NQVToKLQkJZXJyID0gaW5pdF9jcHVfcG11KCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX3dhcm5pbmcoImF0dGVtcHQgdG8gaW5pdGlhbGlzZSBQTVUgb2YgdW5rbm93biAiCi0JCQkgICAidHlwZSAlZFxuIiwgdHlwZSk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGluaXRfcG11KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGZkMDgxNDAuLjc1MzE2ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwpAQCAtMTAsNyArMTAsNyBAQAogICovCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMjQ5MWYzYi4uNDgzNzI3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcmV0dXJuX2FkZHJlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9yZXR1cm5fYWRkcmVzcy5jCmluZGV4IDBiMTNhNzIuLjgwODU0MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9yZXR1cm5fYWRkcmVzcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9yZXR1cm5fYWRkcmVzcy5jCkBAIC04LDcgKzgsNyBAQAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19GUkFNRV9QT0lOVEVSKSAmJiAhZGVmaW5lZChDT05GSUdfQVJNX1VOV0lORCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKaW5kZXggM2ZlOTNmNy4uN2U3OTc3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKQEAgLTcsNyArNyw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTg0OSwyNSArODQ5LDggQEAKIAogCWlmIChfX2F0YWdzX3BvaW50ZXIpCiAJCXRhZ3MgPSBwaHlzX3RvX3ZpcnQoX19hdGFnc19wb2ludGVyKTsKLQllbHNlIGlmIChtZGVzYy0+Ym9vdF9wYXJhbXMpIHsKLSNpZmRlZiBDT05GSUdfTU1VCi0JCS8qCi0JCSAqIFdlIHN0aWxsIGFyZSBleGVjdXRpbmcgd2l0aCBhIG1pbmltYWwgTU1VIG1hcHBpbmcgY3JlYXRlZAotCQkgKiB3aXRoIHRoZSBwcmVzdW1wdGlvbiB0aGF0IHRoZSBtYWNoaW5lIGRlZmF1bHQgZm9yIHRoaXMKLQkJICogaXMgbG9jYXRlZCBpbiB0aGUgZmlyc3QgTUIgb2YgUkFNLiAgQW55dGhpbmcgZWxzZSB3aWxsCi0JCSAqIGZhdWx0IGFuZCBzaWxlbnRseSBoYW5nIHRoZSBrZXJuZWwgYXQgdGhpcyBwb2ludC4KLQkJICovCi0JCWlmIChtZGVzYy0+Ym9vdF9wYXJhbXMgPCBQSFlTX09GRlNFVCB8fAotCQkgICAgbWRlc2MtPmJvb3RfcGFyYW1zID49IFBIWVNfT0ZGU0VUICsgU1pfMU0pIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiRGVmYXVsdCBib290IHBhcmFtcyBhdCBwaHlzaWNhbCAweCUwOGx4IG91dCBvZiByZWFjaFxuIiwKLQkJCSAgICAgICBtZGVzYy0+Ym9vdF9wYXJhbXMpOwotCQl9IGVsc2UKLSNlbmRpZgotCQl7Ci0JCQl0YWdzID0gcGh5c190b192aXJ0KG1kZXNjLT5ib290X3BhcmFtcyk7Ci0JCX0KLQl9CisJZWxzZSBpZiAobWRlc2MtPmF0YWdfb2Zmc2V0KQorCQl0YWdzID0gKHZvaWQgKikoUEFHRV9PRkZTRVQgKyBtZGVzYy0+YXRhZ19vZmZzZXQpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfREVQUkVDQVRFRF9QQVJBTV9TVFJVQ1QpCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbGVlcC5TIGIvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKaW5kZXggZGM5MDJmMi4uMDIwZTk5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKQEAgLTgsOTIgKzgsNjEgQEAKIAkudGV4dAogCiAvKgotICogU2F2ZSBDUFUgc3RhdGUgZm9yIGEgc3VzcGVuZAotICogIHIxID0gdjpwIG9mZnNldAotICogIHIyID0gc3VzcGVuZCBmdW5jdGlvbiBhcmcwCi0gKiAgcjMgPSBzdXNwZW5kIGZ1bmN0aW9uCisgKiBTYXZlIENQVSBzdGF0ZSBmb3IgYSBzdXNwZW5kLiAgVGhpcyBzYXZlcyB0aGUgQ1BVIGdlbmVyYWwgcHVycG9zZQorICogcmVnaXN0ZXJzLCBhbmQgYWxsb2NhdGVzIHNwYWNlIG9uIHRoZSBrZXJuZWwgc3RhY2sgdG8gc2F2ZSB0aGUgQ1BVCisgKiBzcGVjaWZpYyByZWdpc3RlcnMgYW5kIHNvbWUgb3RoZXIgZGF0YSBmb3IgcmVzdW1lLgorICogIHIwID0gc3VzcGVuZCBmdW5jdGlvbiBhcmcwCisgKiAgcjEgPSBzdXNwZW5kIGZ1bmN0aW9uCiAgKi8KIEVOVFJZKF9fY3B1X3N1c3BlbmQpCiAJc3RtZmQJc3AhLCB7cjQgLSByMTEsIGxyfQogI2lmZGVmIE1VTFRJX0NQVQogCWxkcglyMTAsID1wcm9jZXNzb3IKLQlsZHIJcjUsIFtyMTAsICNDUFVfU0xFRVBfU0laRV0gQCBzaXplIG9mIENQVSBzbGVlcCBzdGF0ZQotCWxkcglpcCwgW3IxMCwgI0NQVV9ET19SRVNVTUVdIEAgdmlydHVhbCByZXN1bWUgZnVuY3Rpb24KKwlsZHIJcjQsIFtyMTAsICNDUFVfU0xFRVBfU0laRV0gQCBzaXplIG9mIENQVSBzbGVlcCBzdGF0ZQogI2Vsc2UKLQlsZHIJcjUsID1jcHVfc3VzcGVuZF9zaXplCi0JbGRyCWlwLCA9Y3B1X2RvX3Jlc3VtZQorCWxkcglyNCwgPWNwdV9zdXNwZW5kX3NpemUKICNlbmRpZgotCW1vdglyNiwgc3AJCQlAIGN1cnJlbnQgdmlydHVhbCBTUAotCXN1YglzcCwgc3AsIHI1CQlAIGFsbG9jYXRlIENQVSBzdGF0ZSBvbiBzdGFjawotCW1vdglyMCwgc3AJCQlAIHNhdmUgcG9pbnRlciB0byBDUFUgc2F2ZSBibG9jawotCWFkZAlpcCwgaXAsIHIxCQlAIGNvbnZlcnQgcmVzdW1lIGZuIHRvIHBoeXMKLQlzdG1mZAlzcCEsIHtyMSwgcjYsIGlwfQlAIHNhdmUgdjpwLCB2aXJ0IFNQLCBwaHlzIHJlc3VtZSBmbgotCWxkcglyNSwgPXNsZWVwX3NhdmVfc3AKLQlhZGQJcjYsIHNwLCByMQkJQCBjb252ZXJ0IFNQIHRvIHBoeXMKLQlzdG1mZAlzcCEsIHtyMiwgcjN9CQlAIHNhdmUgc3VzcGVuZCBmdW5jIGFyZyBhbmQgcG9pbnRlcgorCW1vdglyNSwgc3AJCQlAIGN1cnJlbnQgdmlydHVhbCBTUAorCWFkZAlyNCwgcjQsICMxMgkJQCBTcGFjZSBmb3IgcGdkLCB2aXJ0IHNwLCBwaHlzIHJlc3VtZSBmbgorCXN1YglzcCwgc3AsIHI0CQlAIGFsbG9jYXRlIENQVSBzdGF0ZSBvbiBzdGFjaworCXN0bWZkCXNwISwge3IwLCByMX0JCUAgc2F2ZSBzdXNwZW5kIGZ1bmMgYXJnIGFuZCBwb2ludGVyCisJYWRkCXIwLCBzcCwgIzgJCUAgc2F2ZSBwb2ludGVyIHRvIHNhdmUgYmxvY2sKKwltb3YJcjEsIHI0CQkJQCBzaXplIG9mIHNhdmUgYmxvY2sKKwltb3YJcjIsIHI1CQkJQCB2aXJ0dWFsIFNQCisJbGRyCXIzLCA9c2xlZXBfc2F2ZV9zcAogI2lmZGVmIENPTkZJR19TTVAKIAlBTFRfU01QKG1yYyBwMTUsIDAsIGxyLCBjMCwgYzAsIDUpCiAJQUxUX1VQKG1vdiBsciwgIzApCiAJYW5kCWxyLCBsciwgIzE1Ci0Jc3RyCXI2LCBbcjUsIGxyLCBsc2wgIzJdCUAgc2F2ZSBwaHlzIFNQCi0jZWxzZQotCXN0cglyNiwgW3I1XQkJQCBzYXZlIHBoeXMgU1AKKwlhZGQJcjMsIHIzLCBsciwgbHNsICMyCiAjZW5kaWYKLSNpZmRlZiBNVUxUSV9DUFUKLQltb3YJbHIsIHBjCi0JbGRyCXBjLCBbcjEwLCAjQ1BVX0RPX1NVU1BFTkRdIEAgc2F2ZSBDUFUgc3RhdGUKLSNlbHNlCi0JYmwJY3B1X2RvX3N1c3BlbmQKLSNlbmRpZgotCi0JQCBmbHVzaCBkYXRhIGNhY2hlCi0jaWZkZWYgTVVMVElfQ0FDSEUKLQlsZHIJcjEwLCA9Y3B1X2NhY2hlCi0JbW92CWxyLCBwYwotCWxkcglwYywgW3IxMCwgI0NBQ0hFX0ZMVVNIX0tFUk5fQUxMXQotI2Vsc2UKLQlibAlfX2NwdWNfZmx1c2hfa2Vybl9hbGwKLSNlbmRpZgorCWJsCV9fY3B1X3N1c3BlbmRfc2F2ZQogCWFkcglsciwgQlNZTShjcHVfc3VzcGVuZF9hYm9ydCkKIAlsZG1mZAlzcCEsIHtyMCwgcGN9CQlAIGNhbGwgc3VzcGVuZCBmbgogRU5EUFJPQyhfX2NwdV9zdXNwZW5kKQogCS5sdG9yZwogCiBjcHVfc3VzcGVuZF9hYm9ydDoKLQlsZG1pYQlzcCEsIHtyMSAtIHIzfQkJQCBwb3AgdjpwLCB2aXJ0IFNQLCBwaHlzIHJlc3VtZSBmbgorCWxkbWlhCXNwISwge3IxIC0gcjN9CQlAIHBvcCBwaHlzIHBnZCwgdmlydCBTUCwgcGh5cyByZXN1bWUgZm4KKwl0ZXEJcjAsICMwCisJbW92ZXEJcjAsICMxCQkJQCBmb3JjZSBub24temVybyB2YWx1ZQogCW1vdglzcCwgcjIKIAlsZG1mZAlzcCEsIHtyNCAtIHIxMSwgcGN9CiBFTkRQUk9DKGNwdV9zdXNwZW5kX2Fib3J0KQogCiAvKgogICogcjAgPSBjb250cm9sIHJlZ2lzdGVyIHZhbHVlCi0gKiByMSA9IHY6cCBvZmZzZXQgKHByZXNlcnZlZCBieSBjcHVfZG9fcmVzdW1lKQotICogcjIgPSBwaHlzIHBhZ2UgdGFibGUgYmFzZQotICogcjMgPSBMMSBzZWN0aW9uIGZsYWdzCiAgKi8KLUVOVFJZKGNwdV9yZXN1bWVfbW11KQotCWFkcglyNCwgY3B1X3Jlc3VtZV90dXJuX21tdV9vbgotCW1vdglyNCwgcjQsIGxzciAjMjAKLQlvcnIJcjMsIHIzLCByNCwgbHNsICMyMAotCWxkcglyNSwgW3IyLCByNCwgbHNsICMyXQlAIHNhdmUgb2xkIG1hcHBpbmcKLQlzdHIJcjMsIFtyMiwgcjQsIGxzbCAjMl0JQCBzZXR1cCAxOjEgbWFwcGluZyBmb3IgbW11IGNvZGUKLQlzdWIJcjIsIHIyLCByMQotCWxkcglyMywgPWNwdV9yZXN1bWVfYWZ0ZXJfbW11Ci0JYmljCXIxLCByMCwgI0NSX0MJCUAgZW5zdXJlIEQtY2FjaGUgaXMgZGlzYWJsZWQKLQliCWNwdV9yZXN1bWVfdHVybl9tbXVfb24KLUVORFBST0MoY3B1X3Jlc3VtZV9tbXUpCi0JLmx0b3JnCiAJLmFsaWduCTUKLWNwdV9yZXN1bWVfdHVybl9tbXVfb246Ci0JbWNyCXAxNSwgMCwgcjEsIGMxLCBjMCwgMAlAIHR1cm4gb24gTU1VLCBJLWNhY2hlLCBldGMKLQltcmMJcDE1LCAwLCByMSwgYzAsIGMwLCAwCUAgcmVhZCBpZCByZWcKLQltb3YJcjEsIHIxCi0JbW92CXIxLCByMQorRU5UUlkoY3B1X3Jlc3VtZV9tbXUpCisJbGRyCXIzLCA9Y3B1X3Jlc3VtZV9hZnRlcl9tbXUKKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCUAgdHVybiBvbiBNTVUsIEktY2FjaGUsIGV0YworCW1yYwlwMTUsIDAsIHIwLCBjMCwgYzAsIDAJQCByZWFkIGlkIHJlZworCW1vdglyMCwgcjAKKwltb3YJcjAsIHIwCiAJbW92CXBjLCByMwkJCUAganVtcCB0byB2aXJ0dWFsIGFkZHJlc3MKLUVORFBST0MoY3B1X3Jlc3VtZV90dXJuX21tdV9vbikKK0VORFBST0MoY3B1X3Jlc3VtZV9tbXUpCiBjcHVfcmVzdW1lX2FmdGVyX21tdToKLQlzdHIJcjUsIFtyMiwgcjQsIGxzbCAjMl0JQCByZXN0b3JlIG9sZCBtYXBwaW5nCi0JbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAlAIHR1cm4gb24gRC1jYWNoZQogCWJsCWNwdV9pbml0CQlAIHJlc3RvcmUgdGhlIHVuZC9hYnQvaXJxIGJhbmtlZCByZWdzCiAJbW92CXIwLCAjMAkJCUAgcmV0dXJuIHplcm8gb24gc3VjY2VzcwogCWxkbWZkCXNwISwge3I0IC0gcjExLCBwY30KQEAgLTExOSw3ICs4OCw3IEBACiAJbGRyCXIwLCBzbGVlcF9zYXZlX3NwCUAgc3RhY2sgcGh5cyBhZGRyCiAjZW5kaWYKIAlzZXRtb2RlCVBTUl9JX0JJVCB8IFBTUl9GX0JJVCB8IFNWQ19NT0RFLCByMSAgQCBzZXQgU1ZDLCBpcnFzIG9mZgotCUAgbG9hZCB2OnAsIHN0YWNrLCByZXN1bWUgZm4KKwlAIGxvYWQgcGh5cyBwZ2QsIHN0YWNrLCByZXN1bWUgZm4KICAgQVJNKAlsZG1pYQlyMCEsIHtyMSwgc3AsIHBjfQkpCiBUSFVNQigJbGRtaWEJcjAhLCB7cjEsIHIyLCByM30JKQogVEhVTUIoCW1vdglzcCwgcjIJCQkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKaW5kZXggOTRmMzRhNi4uZWY1NjQwYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwpAQCAtNDYwLDEwICs0NjAsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBOUl9JUEk7IGkrKykKIAkJc3VtICs9IF9fZ2V0X2lycV9zdGF0KGNwdSwgaXBpX2lycXNbaV0pOwogCi0jaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotCXN1bSArPSBfX2dldF9pcnFfc3RhdChjcHUsIGxvY2FsX3RpbWVyX2lycXMpOwotI2VuZGlmCi0KIAlyZXR1cm4gc3VtOwogfQogCkBAIC00ODAsMzggKzQ3Niw2IEBACiAJaXJxX2V4aXQoKTsKIH0KIAotI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKLWFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgZG9fbG9jYWxfdGltZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaGFuZGxlX2xvY2FsX3RpbWVyKHJlZ3MpOwotfQotCi12b2lkIGhhbmRsZV9sb2NhbF90aW1lcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWlmIChsb2NhbF90aW1lcl9hY2soKSkgewotCQlfX2luY19pcnFfc3RhdChjcHUsIGxvY2FsX3RpbWVyX2lycXMpOwotCQlpcGlfdGltZXIoKTsKLQl9Ci0KLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwotfQotCi12b2lkIHNob3dfbG9jYWxfaXJxcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGludCBwcmVjKQotewotCXVuc2lnbmVkIGludCBjcHU7Ci0KLQlzZXFfcHJpbnRmKHAsICIlKnM6ICIsIHByZWMsICJMT0MiKTsKLQotCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkKLQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBfX2dldF9pcnFfc3RhdChjcHUsIGxvY2FsX3RpbWVyX2lycXMpKTsKLQotCXNlcV9wcmludGYocCwgIiBMb2NhbCB0aW1lciBpbnRlcnJ1cHRzXG4iKTsKLX0KLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCiBzdGF0aWMgdm9pZCBzbXBfdGltZXJfYnJvYWRjYXN0KGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewpAQCAtNTYyLDcgKzUyNiw3IEBACiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmcGVyX2NwdShwZXJjcHVfY2xvY2tldmVudCwgY3B1KTsKIAotCWV2dC0+c2V0X21vZGUoQ0xPQ0tfRVZUX01PREVfVU5VU0VELCBldnQpOworCWxvY2FsX3RpbWVyX3N0b3AoZXZ0KTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcF90d2QuYwppbmRleCAwMWMxODYyLi5hOGE2NjgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL3NtcF90d2QuaD4KKyNpbmNsdWRlIDxhc20vbG9jYWx0aW1lci5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KIAogLyogc2V0IHVwIGJ5IHRoZSBwbGF0Zm9ybSBjb2RlICovCkBAIC0yNiw2ICsyNyw4IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHR3ZF90aW1lcl9yYXRlOwogCitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBfX3BlcmNwdSAqKnR3ZF9ldnQ7CisKIHN0YXRpYyB2b2lkIHR3ZF9zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKIAkJCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKIHsKQEAgLTgwLDYgKzgzLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgdHdkX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xrKQoreworCXR3ZF9zZXRfbW9kZShDTE9DS19FVlRfTU9ERV9VTlVTRUQsIGNsayk7CisJZGlzYWJsZV9wZXJjcHVfaXJxKGNsay0+aXJxKTsKK30KKwogc3RhdGljIHZvaWQgX19jcHVpbml0IHR3ZF9jYWxpYnJhdGVfcmF0ZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgY291bnQ7CkBAIC0xMTksMTEgKzEyOCw0MyBAQAogCX0KIH0KIAorc3RhdGljIGlycXJldHVybl90IHR3ZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAqKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKiopZGV2X2lkOworCisJaWYgKHR3ZF90aW1lcl9hY2soKSkgeworCQlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKwogLyoKICAqIFNldHVwIHRoZSBsb2NhbCBjbG9jayBldmVudHMgZm9yIGEgQ1BVLgogICovCiB2b2lkIF9fY3B1aW5pdCB0d2RfdGltZXJfc2V0dXAoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xrKQogeworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKip0aGlzX2NwdV9jbGs7CisKKwlpZiAoIXR3ZF9ldnQpIHsKKwkJaW50IGVycjsKKworCQl0d2RfZXZ0ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CisJCWlmICghdHdkX2V2dCkgeworCQkJcHJfZXJyKCJ0d2Q6IGNhbid0IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQllcnIgPSByZXF1ZXN0X3BlcmNwdV9pcnEoY2xrLT5pcnEsIHR3ZF9oYW5kbGVyLAorCQkJCQkgInR3ZCIsIHR3ZF9ldnQpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoInR3ZDogY2FuJ3QgcmVnaXN0ZXIgaW50ZXJydXB0ICVkICglZClcbiIsCisJCQkgICAgICAgY2xrLT5pcnEsIGVycik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKIAl0d2RfY2FsaWJyYXRlX3JhdGUoKTsKIAogCWNsay0+bmFtZSA9ICJsb2NhbF90aW1lciI7CkBAIC0xMzcsOCArMTc4LDEwIEBACiAJY2xrLT5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmZmYsIGNsayk7CiAJY2xrLT5taW5fZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZiwgY2xrKTsKIAorCXRoaXNfY3B1X2NsayA9IF9fdGhpc19jcHVfcHRyKHR3ZF9ldnQpOworCSp0aGlzX2NwdV9jbGsgPSBjbGs7CisKIAljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoY2xrKTsKIAotCS8qIE1ha2Ugc3VyZSBvdXIgbG9jYWwgaW50ZXJydXB0IGNvbnRyb2xsZXIgaGFzIHRoaXMgZW5hYmxlZCAqLwotCWdpY19lbmFibGVfcHBpKGNsay0+aXJxKTsKKwllbmFibGVfcGVyY3B1X2lycShjbGstPmlycSwgMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9hcm0va2VybmVsL3N0YWNrdHJhY2UuYwppbmRleCAzODFkMjNhLi4wMGY3OWU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc3RhY2t0cmFjZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTEsNCArMSw0IEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zdXNwZW5kLmMgYi9hcmNoL2FybS9rZXJuZWwvc3VzcGVuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTIyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvc3VzcGVuZC5jCkBAIC0wLDAgKzEsNzIgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKK3N0YXRpYyBwZ2RfdCAqc3VzcGVuZF9wZ2Q7CisKK2V4dGVybiBpbnQgX19jcHVfc3VzcGVuZCh1bnNpZ25lZCBsb25nLCBpbnQgKCopKHVuc2lnbmVkIGxvbmcpKTsKK2V4dGVybiB2b2lkIGNwdV9yZXN1bWVfbW11KHZvaWQpOworCisvKgorICogVGhpcyBpcyBjYWxsZWQgYnkgX19jcHVfc3VzcGVuZCgpIHRvIHNhdmUgdGhlIHN0YXRlLCBhbmQgZG8gd2hhdGV2ZXIKKyAqIGZsdXNoaW5nIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHdoZW4gdGhlIENQVSBnb2VzIHRvIHNsZWVwIHdlIGhhdmUKKyAqIHRoZSBuZWNlc3NhcnkgZGF0YSBhdmFpbGFibGUgd2hlbiB0aGUgY2FjaGVzIGFyZSBub3Qgc2VhcmNoZWQuCisgKi8KK3ZvaWQgX19jcHVfc3VzcGVuZF9zYXZlKHUzMiAqcHRyLCB1MzIgcHRyc3osIHUzMiBzcCwgdTMyICpzYXZlX3B0cikKK3sKKwkqc2F2ZV9wdHIgPSB2aXJ0X3RvX3BoeXMocHRyKTsKKworCS8qIFRoaXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBMRE0gaW4gY3B1X3Jlc3VtZSgpIGFzc2VtYmx5ICovCisJKnB0cisrID0gdmlydF90b19waHlzKHN1c3BlbmRfcGdkKTsKKwkqcHRyKysgPSBzcDsKKwkqcHRyKysgPSB2aXJ0X3RvX3BoeXMoY3B1X2RvX3Jlc3VtZSk7CisKKwljcHVfZG9fc3VzcGVuZChwdHIpOworCisJZmx1c2hfY2FjaGVfYWxsKCk7CisJb3V0ZXJfY2xlYW5fcmFuZ2UoKnNhdmVfcHRyLCAqc2F2ZV9wdHIgKyBwdHJzeik7CisJb3V0ZXJfY2xlYW5fcmFuZ2UodmlydF90b19waHlzKHNhdmVfcHRyKSwKKwkJCSAgdmlydF90b19waHlzKHNhdmVfcHRyKSArIHNpemVvZigqc2F2ZV9wdHIpKTsKK30KKworLyoKKyAqIEhpZGUgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgdG8gX19jcHVfc3VzcGVuZCAtIHRoZXNlIGFyZSBhbiBpbXBsZW1lbnRhdGlvbgorICogZGV0YWlsIHdoaWNoIHBsYXRmb3JtIGNvZGUgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dC4KKyAqLworaW50IGNwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgKCpmbikodW5zaWduZWQgbG9uZykpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5hY3RpdmVfbW07CisJaW50IHJldDsKKworCWlmICghc3VzcGVuZF9wZ2QpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBQcm92aWRlIGEgdGVtcG9yYXJ5IHBhZ2UgdGFibGUgd2l0aCBhbiBpZGVudGl0eSBtYXBwaW5nIGZvcgorCSAqIHRoZSBNTVUtZW5hYmxlIGNvZGUsIHJlcXVpcmVkIGZvciByZXN1bWluZy4gIE9uIHN1Y2Nlc3NmdWwKKwkgKiByZXN1bWUgKGluZGljYXRlZCBieSBhIHplcm8gcmV0dXJuIGNvZGUpLCB3ZSBuZWVkIHRvIHN3aXRjaAorCSAqIGJhY2sgdG8gdGhlIGNvcnJlY3QgcGFnZSB0YWJsZXMuCisJICovCisJcmV0ID0gX19jcHVfc3VzcGVuZChhcmcsIGZuKTsKKwlpZiAocmV0ID09IDApIHsKKwkJY3B1X3N3aXRjaF9tbShtbS0+cGdkLCBtbSk7CisJCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBjcHVfc3VzcGVuZF9pbml0KHZvaWQpCit7CisJc3VzcGVuZF9wZ2QgPSBwZ2RfYWxsb2MoJmluaXRfbW0pOworCWlmIChzdXNwZW5kX3BnZCkgeworCQl1bnNpZ25lZCBsb25nIGFkZHIgPSB2aXJ0X3RvX3BoeXMoY3B1X3Jlc3VtZV9tbXUpOworCQlpZGVudGl0eV9tYXBwaW5nX2FkZChzdXNwZW5kX3BnZCwgYWRkciwgYWRkciArIFNFQ1RJT05fU0laRSk7CisJfQorCXJldHVybiBzdXNwZW5kX3BnZCA/IDAgOiAtRU5PTUVNOworfQorY29yZV9pbml0Y2FsbChjcHVfc3VzcGVuZF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMgYi9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jCmluZGV4IDYyZTdjNjEuLmQyYjE3NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYwpAQCAtMTIsNyArMTIsNyBAQAogICogIGhhdmUgYSBub24tc3RhbmRhcmQgY2FsbGluZyBzZXF1ZW5jZSBvbiB0aGUgTGludXgvYXJtCiAgKiAgcGxhdGZvcm0uCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FybS9rZXJuZWwvdGltZS5jCmluZGV4IDVhNTRiOTUuLjhjNTdkZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwpAQCAtMTEsNyArMTEsNyBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQVJNLXNwZWNpZmljIHRpbWUgaGFuZGxpbmcgZGV0YWlsczoKICAqICByZWFkaW5nIHRoZSBSVEMgYXQgYm9vdHVwLCBldGMuLi4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC91bndpbmQuYyBiL2FyY2gvYXJtL2tlcm5lbC91bndpbmQuYwppbmRleCBkMmNiMGIzLi5lN2U4MzY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdW53aW5kLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3Vud2luZC5jCkBAIC0zOSw3ICszOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC94c2NhbGUtY3AwLmMgYi9hcmNoL2FybS9rZXJuZWwveHNjYWxlLWNwMC5jCmluZGV4IDE3OTYxNTcuLmU0MmFkYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC94c2NhbGUtY3AwLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3hzY2FsZS1jcDAuYwpAQCAtOCw3ICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWF0OTEvS2NvbmZpZwppbmRleCAyMjQ4NDY3Li5kMTExYzNlOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL0tjb25maWcKQEAgLTE4Miw2ICsxODIsMTEgQEAKIAloZWxwCiAJICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBlY285MjAgYm9hcmQKIAorY29uZmlnIE1BQ0hfUlNJX0VXUworCWJvb2wgIlJTSSBFbWJlZGRlZCBXZWJzZXJ2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX0FUOTFSTTkyMDAKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIFJTSXMgRVdTIGJvYXJkLgogZW5kaWYKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xOTAsMTIgKzE5NSw2IEBACiAKIGNvbW1lbnQgIkFUOTFTQU05MjYwIFZhcmlhbnRzIgogCi1jb25maWcgQVJDSF9BVDkxU0FNOTI2MF9TQU05WEUKLQlib29sICJBVDkxU0FNOVhFIgotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgQXRtZWwncyBBVDkxU0FNOVhFIFN5c3RlbS1vbi1DaGlwLgotCSAgVGhleSBhcmUgYmFzaWNhbGx5IEFUOTFTQU05MjYwcyB3aXRoIHZhcmlvdXMgc2l6ZXMgb2YgZW1iZWRkZWQgRmxhc2guCi0KIGNvbW1lbnQgIkFUOTFTQU05MjYwIC8gQVQ5MVNBTTlYRSBCb2FyZCBUeXBlIgogCiBjb25maWcgTUFDSF9BVDkxU0FNOTI2MEVLCkBAIC0zODEsNiArMzgwLDE0IEBACiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEdTX0lBMThfUyBib2FyZAogCSAgcHJvZHVjZWQgYnkgR2VvU0lHIEx0ZCBjb21wYW55LiBUaGlzIGlzIGFuIGludGVybmV0IGFjY2VsZXJvZ3JhcGguCiAJICA8aHR0cDovL3d3dy5nZW9zaWcuY29tPgorCitjb25maWcgTUFDSF9VU0JfQTlHMjAKKwlib29sICJDQUxBTyBVU0ItQTlHMjAiCisJZGVwZW5kcyBvbiBBUkNIX0FUOTFTQU05RzIwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSB1c2luZyBhIENhbGFvIFN5c3RlbXMgVVNCLUE5RzIwLgorCSAgPGh0dHA6Ly93d3cuY2FsYW8tc3lzdGVtcy5jb20+CisKIGVuZGlmCiAKIGlmIChBUkNIX0FUOTFTQU05MjYwIHx8IEFSQ0hfQVQ5MVNBTTlHMjApCkBAIC00NDIsNiArNDQ5LDE3IEBACiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitjb21tZW50ICJHZW5lcmljIEJvYXJkIFR5cGUiCisKK2NvbmZpZyBNQUNIX0FUOTFTQU1fRFQKKwlib29sICJBdG1lbCBBVDkxU0FNIEV2YWx1YXRpb24gS2l0cyB3aXRoIGRldmljZS10cmVlIHN1cHBvcnQiCisJc2VsZWN0IFVTRV9PRgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IHRvIGV4cGVyaW1lbnQgZGV2aWNlLXRyZWUgd2l0aAorCSAgYW4gQXRtZWwgRXZhbHVhdGlvbiBLaXQuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBjb21tZW50ICJBVDkxIEJvYXJkIE9wdGlvbnMiCiAKIGNvbmZpZyBNVERfQVQ5MV9EQVRBRkxBU0hfQ0FSRApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlCmluZGV4IGJmNTdlOGIuLjI0MjE3NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUKQEAgLTM2LDEyICszNiwxMyBAQAogb2JqLSQoQ09ORklHX01BQ0hfWUw5MjAwKQkrPSBib2FyZC15bC05MjAwLm8KIG9iai0kKENPTkZJR19NQUNIX0NQVUFUOTEpCSs9IGJvYXJkLWNwdWF0OTEubwogb2JqLSQoQ09ORklHX01BQ0hfRUNPOTIwKQkrPSBib2FyZC1lY285MjAubworb2JqLSQoQ09ORklHX01BQ0hfUlNJX0VXUykJKz0gYm9hcmQtcnNpLWV3cy5vCiAKICMgQVQ5MVNBTTkyNjAgYm9hcmQtc3BlY2lmaWMgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfQVQ5MVNBTTkyNjBFSykgKz0gYm9hcmQtc2FtOTI2MGVrLm8KIG9iai0kKENPTkZJR19NQUNIX0NBTTYwKQkrPSBib2FyZC1jYW02MC5vCiBvYmotJChDT05GSUdfTUFDSF9TQU05X0w5MjYwKQkrPSBib2FyZC1zYW05LWw5MjYwLm8KLW9iai0kKENPTkZJR19NQUNIX1VTQl9BOTI2MCkJKz0gYm9hcmQtdXNiLWE5MjYwLm8KK29iai0kKENPTkZJR19NQUNIX1VTQl9BOTI2MCkJKz0gYm9hcmQtdXNiLWE5MjZ4Lm8KIG9iai0kKENPTkZJR19NQUNIX1FJTF9BOTI2MCkJKz0gYm9hcmQtcWlsLWE5MjYwLm8KIG9iai0kKENPTkZJR19NQUNIX0FGRUI5MjYwKQkrPSBib2FyZC1hZmViLTkyNjB2MS5vCiBvYmotJChDT05GSUdfTUFDSF9DUFU5MjYwKQkrPSBib2FyZC1jcHU5a3JlYS5vCkBAIC01Myw3ICs1NCw3IEBACiAKICMgQVQ5MVNBTTkyNjMgYm9hcmQtc3BlY2lmaWMgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfQVQ5MVNBTTkyNjNFSykgKz0gYm9hcmQtc2FtOTI2M2VrLm8KLW9iai0kKENPTkZJR19NQUNIX1VTQl9BOTI2MykJKz0gYm9hcmQtdXNiLWE5MjYzLm8KK29iai0kKENPTkZJR19NQUNIX1VTQl9BOTI2MykJKz0gYm9hcmQtdXNiLWE5MjZ4Lm8KIG9iai0kKENPTkZJR19NQUNIX05FT0NPUkU5MjYpCSs9IGJvYXJkLW5lb2NvcmU5MjYubwogCiAjIEFUOTFTQU05UkwgYm9hcmQtc3BlY2lmaWMgc3VwcG9ydApAQCAtNjcsNiArNjgsNyBAQAogb2JqLSQoQ09ORklHX01BQ0hfUE9SVFVYRzIwKQkrPSBib2FyZC1zdGFtcDlnMjAubwogb2JqLSQoQ09ORklHX01BQ0hfUENPTlRST0xfRzIwKQkrPSBib2FyZC1wY29udHJvbC1nMjAubyBib2FyZC1zdGFtcDlnMjAubwogb2JqLSQoQ09ORklHX01BQ0hfR1NJQTE4UykJKz0gYm9hcmQtZ3NpYTE4cy5vIGJvYXJkLXN0YW1wOWcyMC5vCitvYmotJChDT05GSUdfTUFDSF9VU0JfQTlHMjApCSs9IGJvYXJkLXVzYi1hOTI2eC5vCiAKICMgQVQ5MVNBTTkyNjAvQVQ5MVNBTTlHMjAgYm9hcmQtc3BlY2lmaWMgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfU05BUFBFUl85MjYwKQkrPSBib2FyZC1zbmFwcGVyOTI2MC5vCkBAIC03NCw2ICs3Niw5IEBACiAjIEFUOTFTQU05RzQ1IGJvYXJkLXNwZWNpZmljIHN1cHBvcnQKIG9iai0kKENPTkZJR19NQUNIX0FUOTFTQU05TTEwRzQ1RUspICs9IGJvYXJkLXNhbTltMTBnNDVlay5vCiAKKyMgQVQ5MVNBTSBib2FyZCB3aXRoIGRldmljZS10cmVlCitvYmotJChDT05GSUdfTUFDSF9BVDkxU0FNX0RUKSArPSBib2FyZC1kdC5vCisKICMgQVQ5MUNBUDkgYm9hcmQtc3BlY2lmaWMgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfQVQ5MUNBUDlBREspCSs9IGJvYXJkLWNhcDlhZGsubwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZS5ib290CmluZGV4IDlhYjVhM2UuLjhkZGFmYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZS5ib290CisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZS5ib290CkBAIC0xNiwzICsxNiw1IEBACiBwYXJhbXNfcGh5cy15CTo9IDB4MjAwMDAxMDAKIGluaXRyZF9waHlzLXkJOj0gMHgyMDQxMDAwMAogZW5kaWYKKworZHRiLSQoQ09ORklHX01BQ0hfQVQ5MVNBTV9EVCkgKz0gYXQ5MXNhbTltMTBnNDVlay5kdGIgdXNiX2E5ZzIwLmR0YgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYwppbmRleCBiZmM2ODQ0Li5lY2RkNTRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYwpAQCAtMjE5LDYgKzIxOSw4IEBACiAJQ0xLREVWX0NPTl9ERVZfSUQoInQwX2NsayIsICJhdG1lbF90Y2IuMCIsICZ0Y2JfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAorCS8qIGZha2UgaGNsayBjbG9jayAqLworCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0OTFfb2hjaSIsICZvaGNpX2NsayksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgdXNhcnRfY2xvY2tzX2xvb2t1cHNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jCmluZGV4IGRiYTBkOGQuLmFkYWQ3MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KIApAQCAtMjMsNyArMjQsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxY2FwOS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MWNhcDlfbWF0cml4Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KQEAgLTgwLDYgKzgwLDEyIEBACiAJCQlhdDkxX3NldF9ncGlvX291dHB1dChkYXRhLT52YnVzX3BpbltpXSwgMCk7CiAJfQogCisJLyogRW5hYmxlIG92ZXJjdXJyZW50IG5vdGlmaWNhdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5wb3J0czsgaSsrKSB7CisJCWlmIChkYXRhLT5vdmVyY3VycmVudF9waW5baV0pCisJCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSwgMSk7CisJfQorCiAJdXNiaF9kYXRhID0gKmRhdGE7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxX3VzYmhfZGV2aWNlKTsKIH0KQEAgLTkyLDcgKzk4LDcgQEAKICAqICBVU0IgSFMgRGV2aWNlIChHYWRnZXQpCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX0dBREdFVF9BVE1FTF9VU0JBKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkFfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9BVE1FTF9VU0JBKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfQVRNRUxfVVNCQV9NT0RVTEUpCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiYV91ZGNfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewpAQCAtMTAxNSw4ICsxMDIxLDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQVRNRUwpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRiZ3VfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAotCQkuZW5kCT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCisJCS5zdGFydAk9IEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCisJCS5lbmQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC0xMDI5LDcgKzEwMzUsNiBAQAogc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgZGJndV9kYXRhID0gewogCS51c2VfZG1hX3R4CT0gMCwKIAkudXNlX2RtYV9yeAk9IDAsCQkvKiBEQkdVIG5vdCBjYXBhYmxlIG9mIHJlY2VpdmUgRE1BICovCi0JLnJlZ3MJCT0gKHZvaWQgX19pb21lbSAqKShBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVKSwKIH07CiAKIHN0YXRpYyB1NjQgZGJndV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCmluZGV4IGY3MzMwMmQuLjcxM2QzYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYwpAQCAtMTkzLDYgKzE5Myw4IEBACiAJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjAiLCAmc3NjMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4xIiwgJnNzYzFfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMiIsICZzc2MyX2NsayksCisJLyogZmFrZSBoY2xrIGNsb2NrICovCisJQ0xLREVWX0NPTl9ERVZfSUQoImhjbGsiLCAiYXQ5MV9vaGNpIiwgJm9oY2lfY2xrKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCB1c2FydF9jbG9ja3NfbG9va3Vwc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jCmluZGV4IDcyMjc3NTUuLjY2NTkxZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMF9kZXZpY2VzLmMKQEAgLTE0LDExICsxNCwxMSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDAuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDBfbWMuaD4KIApAQCAtNjAsOSArNjAsMTcgQEAKIAogdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VzYmgoc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKQogeworCWludCBpOworCiAJaWYgKCFkYXRhKQogCQlyZXR1cm47CiAKKwkvKiBFbmFibGUgb3ZlcmN1cnJlbnQgbm90aWZpY2F0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRzOyBpKyspIHsKKwkJaWYgKGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSkKKwkJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldLCAxKTsKKwl9CisKIAl1c2JoX2RhdGEgPSAqZGF0YTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfdXNiaF9kZXZpY2UpOwogfQpAQCAtODY5LDggKzg3Nyw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0FUTUVMKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYmd1X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSwKLQkJLmVuZAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UgKyBTWl81MTIgLSAxLAorCQkuc3RhcnQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAorCQkuZW5kCT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtODgzLDcgKzg5MSw2IEBACiBzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSBkYmd1X2RhdGEgPSB7CiAJLnVzZV9kbWFfdHgJPSAwLAogCS51c2VfZG1hX3J4CT0gMCwJCS8qIERCR1Ugbm90IGNhcGFibGUgb2YgcmVjZWl2ZSBETUEgKi8KLQkucmVncwkJPSAodm9pZCBfX2lvbWVtICopKEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpLAogfTsKIAogc3RhdGljIHU2NCBkYmd1X2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYwppbmRleCBjYjM5N2JlLi5iODRhOWY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYwpAQCAtMTk5LDYgKzE5OSwxNiBAQAogCUNMS0RFVl9DT05fREVWX0lEKCJ0NF9jbGsiLCAiYXRtZWxfdGNiLjEiLCAmdGM0X2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQ1X2NsayIsICJhdG1lbF90Y2IuMSIsICZ0YzVfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2NfY2xrKSwKKwkvKiBtb3JlIHVzYXJ0IGxvb2t1cCB0YWJsZSBmb3IgRFQgZW50cmllcyAqLworCUNMS0RFVl9DT05fREVWX0lEKCJ1c2FydCIsICJmZmZmZjIwMC5zZXJpYWwiLCAmbWNrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgidXNhcnQiLCAiZmZmYjAwMDAuc2VyaWFsIiwgJnVzYXJ0MF9jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJ1c2FydCIsICJmZmZiNDAwMC5zZXJpYWwiLCAmdXNhcnQxX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInVzYXJ0IiwgImZmZmI4MDAwLnNlcmlhbCIsICZ1c2FydDJfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgidXNhcnQiLCAiZmZmZDAwMDAuc2VyaWFsIiwgJnVzYXJ0M19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJ1c2FydCIsICJmZmZkNDAwMC5zZXJpYWwiLCAmdXNhcnQ0X2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInVzYXJ0IiwgImZmZmQ4MDAwLnNlcmlhbCIsICZ1c2FydDVfY2xrKSwKKwkvKiBmYWtlIGhjbGsgY2xvY2sgKi8KKwlDTEtERVZfQ09OX0RFVl9JRCgiaGNsayIsICJhdDkxX29oY2kiLCAmb2hjaV9jbGspLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHVzYXJ0X2Nsb2Nrc19sb29rdXBzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwX2RldmljZXMuYwppbmRleCAzOWY4MWY0Li4yNWUzNDY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMKQEAgLTEzLDExICsxMywxMSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTkyNjAuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05MjYwX21hdHJpeC5oPgpAQCAtNjEsOSArNjEsMTcgQEAKIAogdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VzYmgoc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKQogeworCWludCBpOworCiAJaWYgKCFkYXRhKQogCQlyZXR1cm47CiAKKwkvKiBFbmFibGUgb3ZlcmN1cnJlbnQgbm90aWZpY2F0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRzOyBpKyspIHsKKwkJaWYgKGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSkKKwkJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldLCAxKTsKKwl9CisKIAl1c2JoX2RhdGEgPSAqZGF0YTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFfdXNiaF9kZXZpY2UpOwogfQpAQCAtMzE5LDcgKzMyNyw3IEBACiAJaWYgKCFkYXRhKQogCQlyZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFUTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CiAJCWlmIChkYXRhLT5zbG90W2ldLmJ1c193aWR0aCkgewogCQkJLyogaW5wdXQvaXJxICovCiAJCQlpZiAoZGF0YS0+c2xvdFtpXS5kZXRlY3RfcGluKSB7CkBAIC04MjksOCArODM3LDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQVRNRUwpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRiZ3VfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAotCQkuZW5kCT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCisJCS5zdGFydAk9IEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCisJCS5lbmQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC04NDMsNyArODUxLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIGRiZ3VfZGF0YSA9IHsKIAkudXNlX2RtYV90eAk9IDAsCiAJLnVzZV9kbWFfcngJPSAwLAkJLyogREJHVSBub3QgY2FwYWJsZSBvZiByZWNlaXZlIERNQSAqLwotCS5yZWdzCQk9ICh2b2lkIF9faW9tZW0gKikoQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSksCiB9OwogCiBzdGF0aWMgdTY0IGRiZ3VfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jCmluZGV4IDZjOGUzYjUuLjY1OGE1MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jCkBAIC0xMjksNiArMTI5LDIwIEBACiAJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKIH07CiAKKy8qIEhDbG9ja3MgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGhjazAgPSB7CisJLm5hbWUJCT0gImhjazAiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX0hDSzAsCisJLnR5cGUJCT0gQ0xLX1RZUEVfU1lTVEVNLAorCS5pZAkJPSAwLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGhjazEgPSB7CisJLm5hbWUJCT0gImhjazEiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX0hDSzEsCisJLnR5cGUJCT0gQ0xLX1RZUEVfU1lTVEVNLAorCS5pZAkJPSAxLAorfTsKKwogc3RhdGljIHN0cnVjdCBjbGsgKnBlcmlwaF9jbG9ja3NbXSBfX2luaXRkYXRhID0gewogCSZwaW9BX2NsaywKIAkmcGlvQl9jbGssCkBAIC0xNjEsNiArMTc1LDcgQEAKIAlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4yIiwgJnNzYzJfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgiaGNsayIsICJhdDkxX29oY2kiLCAmaGNrMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgdXNhcnRfY2xvY2tzX2xvb2t1cHNbXSA9IHsKQEAgLTE5OSwyMCArMjE0LDYgQEAKIAkuaWQJCT0gMywKIH07CiAKLS8qIEhDbG9ja3MgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGhjazAgPSB7Ci0JLm5hbWUJCT0gImhjazAiLAotCS5wbWNfbWFzawk9IEFUOTFfUE1DX0hDSzAsCi0JLnR5cGUJCT0gQ0xLX1RZUEVfU1lTVEVNLAotCS5pZAkJPSAwLAotfTsKLXN0YXRpYyBzdHJ1Y3QgY2xrIGhjazEgPSB7Ci0JLm5hbWUJCT0gImhjazEiLAotCS5wbWNfbWFzawk9IEFUOTFfUE1DX0hDSzEsCi0JLnR5cGUJCT0gQ0xLX1RZUEVfU1lTVEVNLAotCS5pZAkJPSAxLAotfTsKLQogc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05MjYxX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKQogewogCWludCBpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MV9kZXZpY2VzLmMKaW5kZXggMGY5MTc5Mi4uYWU3OGY0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogCkBAIC0yMSw3ICsyMiw2IEBACiAjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTkyNjEuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05MjYxX21hdHJpeC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CkBAIC02NCw5ICs2NCwxNyBAQAogCiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdXNiaChzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgKmRhdGEpCiB7CisJaW50IGk7CisKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKIAorCS8qIEVuYWJsZSBvdmVyY3VycmVudCBub3RpZmljYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydHM7IGkrKykgeworCQlpZiAoZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldKQorCQkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5vdmVyY3VycmVudF9waW5baV0sIDEpOworCX0KKwogCXVzYmhfZGF0YSA9ICpkYXRhOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTkyNjFfdXNiaF9kZXZpY2UpOwogfQpAQCAtODA4LDggKzgxNiw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0FUTUVMKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYmd1X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSwKLQkJLmVuZAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UgKyBTWl81MTIgLSAxLAorCQkuc3RhcnQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAorCQkuZW5kCT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtODIyLDcgKzgzMCw2IEBACiBzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSBkYmd1X2RhdGEgPSB7CiAJLnVzZV9kbWFfdHgJPSAwLAogCS51c2VfZG1hX3J4CT0gMCwJCS8qIERCR1Ugbm90IGNhcGFibGUgb2YgcmVjZWl2ZSBETUEgKi8KLQkucmVncwkJPSAodm9pZCBfX2lvbWVtICopKEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpLAogfTsKIAogc3RhdGljIHU2NCBkYmd1X2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYwppbmRleCAwNDRmM2M5Li5mODNmYmIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYwpAQCAtMTg5LDYgKzE4OSw4IEBACiAJQ0xLREVWX0NPTl9ERVZfSUQoInNwaV9jbGsiLCAiYXRtZWxfc3BpLjAiLCAmc3BpMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJzcGlfY2xrIiwgImF0bWVsX3NwaS4xIiwgJnNwaTFfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4wIiwgJnRjYl9jbGspLAorCS8qIGZha2UgaGNsayBjbG9jayAqLworCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0OTFfb2hjaSIsICZvaGNpX2NsayksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgdXNhcnRfY2xvY2tzX2xvb2t1cHNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jCmluZGV4IGEwNTBmNDEuLmFkMDE3ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KIApAQCAtMjAsNyArMjEsNiBAQAogI2luY2x1ZGUgPHZpZGVvL2F0bWVsX2xjZGMuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05MjYzLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOTI2M19tYXRyaXguaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgpAQCAtNzQsNiArNzQsMTIgQEAKIAkJCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGRhdGEtPnZidXNfcGluW2ldLCAwKTsKIAl9CiAKKwkvKiBFbmFibGUgb3ZlcmN1cnJlbnQgbm90aWZpY2F0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRzOyBpKyspIHsKKwkJaWYgKGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSkKKwkJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldLCAxKTsKKwl9CisKIAl1c2JoX2RhdGEgPSAqZGF0YTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFfdXNiaF9kZXZpY2UpOwogfQpAQCAtMTE5MCw4ICsxMTk2LDggQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYmd1X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSwKLQkJLmVuZAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UgKyBTWl81MTIgLSAxLAorCQkuc3RhcnQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAorCQkuZW5kCT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtMTIwNCw3ICsxMjEwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIGRiZ3VfZGF0YSA9IHsKIAkudXNlX2RtYV90eAk9IDAsCiAJLnVzZV9kbWFfcngJPSAwLAkJLyogREJHVSBub3QgY2FwYWJsZSBvZiByZWNlaXZlIERNQSAqLwotCS5yZWdzCQk9ICh2b2lkIF9faW9tZW0gKikoQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSksCiB9OwogCiBzdGF0aWMgdTY0IGRiZ3VfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDUuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jCmluZGV4IGUwNGM1ZmIuLjMxOGIwNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtNTMsNiArNTQsMTEgQEAKIAkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05RzQ1X0lEX1BJT0RFLAogCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCiB9Oworc3RhdGljIHN0cnVjdCBjbGsgdHJuZ19jbGsgPSB7CisJLm5hbWUJCT0gInRybmdfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05RzQ1X0lEX1RSTkcsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CiBzdGF0aWMgc3RydWN0IGNsayB1c2FydDBfY2xrID0gewogCS5uYW1lCQk9ICJ1c2FydDBfY2xrIiwKIAkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05RzQ1X0lEX1VTMCwKQEAgLTE3Niw2ICsxODIsNyBAQAogCSZwaW9CX2NsaywKIAkmcGlvQ19jbGssCiAJJnBpb0RFX2NsaywKKwkmdHJuZ19jbGssCiAJJnVzYXJ0MF9jbGssCiAJJnVzYXJ0MV9jbGssCiAJJnVzYXJ0Ml9jbGssCkBAIC0yMTUsNiArMjIyLDE1IEBACiAJQ0xLREVWX0NPTl9ERVZfSUQoInQwX2NsayIsICJhdG1lbF90Y2IuMSIsICZ0Y2IwX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjAiLCAmc3NjMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4xIiwgJnNzYzFfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRChOVUxMLCAiYXRtZWwtdHJuZyIsICZ0cm5nX2NsayksCisJLyogbW9yZSB1c2FydCBsb29rdXAgdGFibGUgZm9yIERUIGVudHJpZXMgKi8KKwlDTEtERVZfQ09OX0RFVl9JRCgidXNhcnQiLCAiZmZmZmVlMDAuc2VyaWFsIiwgJm1jayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInVzYXJ0IiwgImZmZjhjMDAwLnNlcmlhbCIsICZ1c2FydDBfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgidXNhcnQiLCAiZmZmOTAwMDAuc2VyaWFsIiwgJnVzYXJ0MV9jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJ1c2FydCIsICJmZmY5NDAwMC5zZXJpYWwiLCAmdXNhcnQyX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInVzYXJ0IiwgImZmZjk4MDAwLnNlcmlhbCIsICZ1c2FydDNfY2xrKSwKKwkvKiBmYWtlIGhjbGsgY2xvY2sgKi8KKwlDTEtERVZfQ09OX0RFVl9JRCgiaGNsayIsICJhdDkxX29oY2kiLCAmdWhwaHNfY2xrKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCB1c2FydF9jbG9ja3NfbG9va3Vwc1tdID0gewpAQCAtMzE5LDYgKzMzNSw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTlnNDVfbWFwX2lvKHZvaWQpCiB7CiAJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlHNDVfU1JBTV9CQVNFLCBBVDkxU0FNOUc0NV9TUkFNX1NJWkUpOworCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZShTWl80TSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9pbml0aWFsaXplKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDVfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1X2RldmljZXMuYwppbmRleCA2MDBiZmZiLi4wOWExNmQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDVfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvYXRtZWwtbWNpLmg+CkBAIC0yMSw3ICsyMiw2IEBACiAjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlnNDUuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05ZzQ1X21hdHJpeC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CkBAIC0xMjQsNiArMTI0LDEyIEBACiAJCQlhdDkxX3NldF9ncGlvX291dHB1dChkYXRhLT52YnVzX3BpbltpXSwgMCk7CiAJfQogCisJLyogRW5hYmxlIG92ZXJjdXJyZW50IG5vdGlmaWNhdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5wb3J0czsgaSsrKSB7CisJCWlmIChkYXRhLT5vdmVyY3VycmVudF9waW5baV0pCisJCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSwgMSk7CisJfQorCiAJdXNiaF9vaGNpX2RhdGEgPSAqZGF0YTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFfdXNiaF9vaGNpX2RldmljZSk7CiB9CkBAIC0xOTEsNyArMTk3LDcgQEAKICAqICBVU0IgSFMgRGV2aWNlIChHYWRnZXQpCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX0dBREdFVF9BVE1FTF9VU0JBKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkFfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9BVE1FTF9VU0JBKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfQVRNRUxfVVNCQV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYmFfdWRjX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gQVQ5MVNBTTlHNDVfVURQSFNfRklGTywKQEAgLTEwOTUsNiArMTEwMSwzNCBAQAogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVFJORworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0hXX1JBTkRPTV9BVE1FTCkgfHwgZGVmaW5lZChDT05GSUdfSFdfUkFORE9NX0FUTUVMX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdHJuZ19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IEFUOTFTQU05RzQ1X0JBU0VfVFJORywKKwkJLmVuZAk9IEFUOTFTQU05RzQ1X0JBU0VfVFJORyArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOWc0NV90cm5nX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWwtdHJuZyIsCisJLmlkCQk9IC0xLAorCS5yZXNvdXJjZQk9IHRybmdfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0cm5nX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3Rybmcodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFzYW05ZzQ1X3RybmdfZGV2aWNlKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3Rybmcodm9pZCkge30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFdhdGNoZG9nCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0xMjk4LDggKzEzMzIsOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9BVE1FTCkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGJndV9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCi0JCS5lbmQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKKwkJLnN0YXJ0CT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSwKKwkJLmVuZAk9IEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UgKyBTWl81MTIgLSAxLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKQEAgLTEzMTIsNyArMTM0Niw2IEBACiBzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSBkYmd1X2RhdGEgPSB7CiAJLnVzZV9kbWFfdHgJPSAwLAogCS51c2VfZG1hX3J4CT0gMCwKLQkucmVncwkJPSAodm9pZCBfX2lvbWVtICopKEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpLAogfTsKIAogc3RhdGljIHU2NCBkYmd1X2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwpAQCAtMTU4Myw2ICsxNjE2LDcgQEAKIAlhdDkxX2FkZF9kZXZpY2VfaGRtYWMoKTsKIAlhdDkxX2FkZF9kZXZpY2VfcnRjKCk7CiAJYXQ5MV9hZGRfZGV2aWNlX3J0dCgpOworCWF0OTFfYWRkX2RldmljZV90cm5nKCk7CiAJYXQ5MV9hZGRfZGV2aWNlX3dhdGNoZG9nKCk7CiAJYXQ5MV9hZGRfZGV2aWNlX3RjKCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMKaW5kZXggYWFjYjE5ZC4uNjI4ZWI1NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmxfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KIApAQCAtMTcsNyArMTgsNiBAQAogI2luY2x1ZGUgPHZpZGVvL2F0bWVsX2xjZGMuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05cmwuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05cmxfbWF0cml4Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KQEAgLTc1LDcgKzc1LDcgQEAKICAqICBVU0IgSFMgRGV2aWNlIChHYWRnZXQpCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX0dBREdFVF9BVE1FTF9VU0JBKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkFfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9BVE1FTF9VU0JBKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfQVRNRUxfVVNCQV9NT0RVTEUpCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiYV91ZGNfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewpAQCAtOTA4LDggKzkwOCw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0FUTUVMKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYmd1X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSwKLQkJLmVuZAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UgKyBTWl81MTIgLSAxLAorCQkuc3RhcnQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAorCQkuZW5kCT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtOTIyLDcgKzkyMiw2IEBACiBzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSBkYmd1X2RhdGEgPSB7CiAJLnVzZV9kbWFfdHgJPSAwLAogCS51c2VfZG1hX3J4CT0gMCwJCS8qIERCR1Ugbm90IGNhcGFibGUgb2YgcmVjZWl2ZSBETUEgKi8KLQkucmVncwkJPSAodm9pZCBfX2lvbWVtICopKEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpLAogfTsKIAogc3RhdGljIHU2NCBkYmd1X2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLTFhcm0uYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC0xYXJtLmMKaW5kZXggNWFhNTg4NS4uMzY3ZDVjZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLTFhcm0uYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtMWFybS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzQsNyArMzUsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtYWZlYi05MjYwdjEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jCmluZGV4IGIwYzc5NmQuLjQyODJkOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jCkBAIC0yNSw2ICsyNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDMsNyArNDQsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCkBAIC0xMzAsMTkgKzEzMCwxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoYWZlYjkyNjBfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBhZmViOTI2MF9uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBhZmViOTI2MF9uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMSwKIAkuY2xlCQk9IDIyLAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxMywKIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTQsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAogCS5idXNfd2lkdGhfMTYJPSAwLAorCS5wYXJ0cwkJPSBhZmViOTI2MF9uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShhZmViOTI2MF9uYW5kX3BhcnRpdGlvbiksCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYW02MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhbTYwLmMKaW5kZXggZDFhYmQ1OC4uZjkwY2ZiMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhbTYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhbTYwLmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zOCw3ICszOSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KIAogI2luY2x1ZGUgInNhbTlfc21jLmgiCkBAIC0xMzIsMTkgKzEzMiwxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoY2FtNjBfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBjYW02MF9uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBjYW02MF9uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMSwKIAkuY2xlCQk9IDIyLAogCS8vIC5kZXRfcGluCT0gLi4uIG5vdCB0aGVyZQogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEE5LAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEE3LAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCT0gY2FtNjBfbmFuZF9wYXJ0aXRpb24sCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoY2FtNjBfbmFuZF9wYXJ0aXRpb24pLAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBjYW02MF9uYW5kX3NtY19jb25maWcgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYwppbmRleCA2NzliMGI3Li41ZGZmZDNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC00MSw3ICs0Miw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxY2FwOV9tYXRyaXguaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogI2luY2x1ZGUgPG1hY2gvc3lzdGVtX3Jldi5oPgpAQCAtMTY5LDE5ICsxNjksMTQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGNhcDlhZGtfbmFuZF9wYXJ0aXRpb25zKTsKLQlyZXR1cm4gY2FwOWFka19uYW5kX3BhcnRpdGlvbnM7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgY2FwOWFka19uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMSwKIAkuY2xlCQk9IDIyLAogLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAogLy8JLnJkeV9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEQxNSwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCisJLnBhcnRzCQk9IGNhcDlhZGtfbmFuZF9wYXJ0aXRpb25zLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGNhcDlhZGtfbmFuZF9wYXJ0aXRpb25zKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgY2FwOWFka19uYW5kX3NtY19jb25maWcgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FybWV2YS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcm1ldmEuYwppbmRleCBjNTc4YzVkOTAuLjc3NGM4N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXJtZXZhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcm1ldmEuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM1LDcgKzM2LDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHU5a3JlYS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdTlrcmVhLmMKaW5kZXggZjRkYThhMS4uZmM4ODVhNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdTlrcmVhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdTlrcmVhLmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC00MCw3ICs0MSw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOTI2MF9tYXRyaXguaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdWF0OTEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHVhdDkxLmMKaW5kZXggMmQ5MTlmNS4uZDM1ZTY1YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdWF0OTEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1YXQ5MS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzYsNyArMzcsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMF9tYy5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYwppbmRleCAxNzY1NGQ1Li5jMzkzNjY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzgsNyArMzksNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjYzNy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjYzNy5jCmluZGV4IDcyYjU1NjcuLjU4NjEwMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2I2MzcuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiNjM3LmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMzUsNyArMzYsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWR0LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjdkMzI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWR0LmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAgU2V0dXAgY29kZSBmb3IgQVQ5MVNBTSBFdmFsdWF0aW9uIEtpdHMgd2l0aCBEZXZpY2UgVHJlZSBzdXBwb3J0CisgKgorICogIENvdmVyczogKiBBVDkxU0FNOUc0NS1FS0VTICBib2FyZAorICogICAgICAgICAgKiBBVDkxU0FNOU0xMC1FS0VTICBib2FyZAorICogICAgICAgICAgKiBBVDkxU0FNOU0xMEc0NS1FSyBib2FyZAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgQXRtZWwsCisgKiAgICAgICAgICAgICAgICAyMDExIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9zeXN0ZW1fcmV2Lmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlICJzYW05X3NtYy5oIgorI2luY2x1ZGUgImdlbmVyaWMuaCIKKworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQoreworCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMi4wMDAgTUh6IGNyeXN0YWwgKi8KKwlhdDkxX2luaXRpYWxpemUoMTIwMDAwMDApOworCisJLyogREdCVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KKwlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CisKKwkvKiBzZXQgc2VyaWFsIGNvbnNvbGUgdG8gdHR5UzAgKGllLCBEQkdVKSAqLworCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOworfQorCisvKiBkZXRfcGluIGlzIG5vdCBjb25uZWN0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZWtfbmFuZF9kYXRhID0geworCS5hbGUJCT0gMjEsCisJLmNsZQkJPSAyMiwKKwkucmR5X3Bpbgk9IEFUOTFfUElOX1BDOCwKKwkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTQsCit9OworCitzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMCwKKwkubnJkX3NldHVwCQk9IDIsCisJLm5jc193cml0ZV9zZXR1cAk9IDAsCisJLm53ZV9zZXR1cAkJPSAyLAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDQsCisJLm5yZF9wdWxzZQkJPSA0LAorCS5uY3Nfd3JpdGVfcHVsc2UJPSA0LAorCS5ud2VfcHVsc2UJCT0gNCwKKworCS5yZWFkX2N5Y2xlCQk9IDcsCisJLndyaXRlX2N5Y2xlCQk9IDcsCisKKwkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFLAorCS50ZGZfY3ljbGVzCQk9IDMsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCit7CisJZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNiA9IGJvYXJkX2hhdmVfbmFuZF8xNmJpdCgpOworCS8qIHNldHVwIGJ1cy13aWR0aCAoOCBvciAxNikgKi8KKwlpZiAoZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKKwkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzE2OworCWVsc2UKKwkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzg7CisKKwkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KKwlzYW05X3NtY19jb25maWd1cmUoMywgJmVrX25hbmRfc21jX2NvbmZpZyk7CisKKwlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWljX29mX21hdGNoW10gX19pbml0Y29uc3QgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxcm05MjAwLWFpYyIsIH0sCisJe30sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MV9kdF9pbml0X2lycSh2b2lkKQoreworCWlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKGFpY19vZl9tYXRjaCwgMHhmZmZmZjAwMCwgMCk7CisJYXQ5MV9pbml0X2lycV9kZWZhdWx0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxX2R0X2RldmljZV9pbml0KHZvaWQpCit7CisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb2ZfZGVmYXVsdF9idXNfbWF0Y2hfdGFibGUsIE5VTEwsIE5VTEwpOworCisJLyogTkFORCAqLworCWVrX2FkZF9kZXZpY2VfbmFuZCgpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYXQ5MV9kdF9ib2FyZF9jb21wYXRbXSBfX2luaXRkYXRhID0geworCSJhdG1lbCxhdDkxc2FtOW0xMGc0NWVrIiwKKwkiY2FsYW8sdXNiLWE5ZzIwIiwKKwlOVUxMCit9OworCitEVF9NQUNISU5FX1NUQVJUKGF0OTFzYW1fZHQsICJBdG1lbCBBVDkxU0FNIChEZXZpY2UgVHJlZSkiKQorCS8qIE1haW50YWluZXI6IEF0bWVsICovCisJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBhdDkxX2R0X2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBhdDkxX2R0X2RldmljZV9pbml0LAorCS5kdF9jb21wYXQJPSBhdDkxX2R0X2JvYXJkX2NvbXBhdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWI5MjAwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWI5MjAwLmMKaW5kZXggMDExNzBhMi4uNDVkYjdhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWViOTIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lYjkyMDAuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM1LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY2JhdDkxLmMKaW5kZXggN2MwMzEzYy4uMmY5YzE2ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY2JhdDkxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM3LDcgKzM4LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWthZmEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYWZhLmMKaW5kZXggNGExNzA4OS4uM2JhZTczZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWthZmEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2FmYS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzQsNyArMzUsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2I5MjAyLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2I5MjAyLmMKaW5kZXggOWRjOGQ0OS4uZTYxMzUxZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWtiOTIwMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYjkyMDIuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM1LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMF9tYy5oPgogCkBAIC05NywxOSArOTcsMTQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGtiOTIwMl9uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGtiOTIwMl9uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBrYjkyMDJfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjIsCiAJLmNsZQkJPSAyMSwKIAkvLyAuZGV0X3Bpbgk9IC4uLiBub3QgdGhlcmUKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMjksCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQzI4LAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCT0ga2I5MjAyX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGtiOTIwMl9uYW5kX3BhcnRpdGlvbiksCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQga2I5MjAyX2JvYXJkX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtbmVvY29yZTkyNi5jCmluZGV4IDliYzZhYjMuLmVmODE2YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLW5lb2NvcmU5MjYuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQ0LDcgKzQ1LDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KIAogI2luY2x1ZGUgInNhbTlfc21jLmgiCkBAIC0xODIsMTkgKzE4MiwxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUobmVvY29yZTkyNl9uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIG5lb2NvcmU5MjZfbmFuZF9wYXJ0aXRpb247Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgbmVvY29yZTkyNl9uYW5kX2RhdGEgPSB7CiAJLmFsZQkJCT0gMjEsCiAJLmNsZQkJCT0gMjIsCiAJLnJkeV9waW4JCT0gQVQ5MV9QSU5fUEIxOSwKIAkucmR5X3Bpbl9hY3RpdmVfbG93CT0gMSwKIAkuZW5hYmxlX3BpbgkJPSBBVDkxX1BJTl9QRDE1LAotCS5wYXJ0aXRpb25faW5mbwkJPSBuYW5kX3BhcnRpdGlvbnMsCisJLnBhcnRzCQkJPSBuZW9jb3JlOTI2X25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJCT0gQVJSQVlfU0laRShuZW9jb3JlOTI2X25hbmRfcGFydGl0aW9uKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgbmVvY29yZTkyNl9uYW5kX3NtY19jb25maWcgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGljb3R1eDIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBpY290dXgyMDAuYwppbmRleCBiN2I4MzkwLi4wYThmZTZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGljb3R1eDIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1waWNvdHV4MjAwLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNyw3ICszOCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxcm05MjAwX21jLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcWlsLWE5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcWlsLWE5MjYwLmMKaW5kZXggODFmOTExMC4uMDc0MjFiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXFpbC1hOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQwLDcgKzQxLDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KIApAQCAtMTMwLDE5ICsxMzAsMTQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKTsKLQlyZXR1cm4gZWtfbmFuZF9wYXJ0aXRpb247Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZWtfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjEsCiAJLmNsZQkJPSAyMiwKIC8vCS5kZXRfcGluCT0gLi4uIG5vdCBjb25uZWN0ZWQKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTMsCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQzE0LAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCT0gZWtfbmFuZF9wYXJ0aXRpb24sCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pLAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZGsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBkay5jCmluZGV4IDZmMDhmYWEuLjgwYThjOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBkay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBkay5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzksNyArNDAsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDBfbWMuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKQEAgLTEzOCwxOSArMTM4LDE0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShka19uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGRrX25hbmRfcGFydGl0aW9uOwotfQotCiBzdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBfX2luaXRkYXRhIGRrX25hbmRfZGF0YSA9IHsKIAkuYWxlCQk9IDIyLAogCS5jbGUJCT0gMjEsCiAJLmRldF9waW4JPSBBVDkxX1BJTl9QQjEsCiAJLnJkeV9waW4JPSBBVDkxX1BJTl9QQzIsCiAJLy8gLmVuYWJsZV9waW4JPSAuLi4gbm90IHRoZXJlCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSBka19uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShka19uYW5kX3BhcnRpdGlvbiksCiB9OwogCiAjZGVmaW5lIERLX0ZMQVNIX0JBU0UJQVQ5MV9DSElQU0VMRUNUXzAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGVrLmMKaW5kZXggODViY2NjZC4uOTlmZDdmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGVrLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zOSw3ICs0MCw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMF9tYy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJzaS1ld3MuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1yc2ktZXdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyN2RmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1yc2ktZXdzLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBib2FyZC1yc2ktZXdzLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKQorICogIDIwMDUgU0FOIFBlb3BsZSwKKyAqICAyMDA4LTIwMTEgUi1TLUkgRWxla3Ryb3RlY2huaWsgR21iSCAmIENvLiBLRworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgorCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQgcnNpX2V3c19pbml0X2Vhcmx5KHZvaWQpCit7CisJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisKKwkvKiBTZXR1cCB0aGUgTEVEcyAqLworCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BCNiwgQVQ5MV9QSU5fUEI5KTsKKworCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCisJLyogVGhpcyBvbmUgaXMgZm9yIGRlYnVnZ2luZyAqLworCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKKworCS8qIFVTQVJUMSBvbiB0dHlTMi4gKFJ4LCBUeCwgQ1RTLCBSVFMsIERUUiwgRFNSLCBEQ0QsIFJJKSAqLworCS8qIERpYWxpbi8tb3V0IG1vZGVtIGludGVyZmFjZSAqLworCWF0OTFfcmVnaXN0ZXJfdWFydChBVDkxUk05MjAwX0lEX1VTMSwgMiwgQVRNRUxfVUFSVF9DVFMgfCBBVE1FTF9VQVJUX1JUUworCQkJICAgfCBBVE1FTF9VQVJUX0RUUiB8IEFUTUVMX1VBUlRfRFNSIHwgQVRNRUxfVUFSVF9EQ0QKKwkJCSAgIHwgQVRNRUxfVUFSVF9SSSk7CisKKwkvKiBVU0FSVDMgb24gdHR5UzQuIChSeCwgVHgsIFJUUykgKi8KKwkvKiBSUzQ4NSBjb21tdW5pY2F0aW9uICovCisJYXQ5MV9yZWdpc3Rlcl91YXJ0KEFUOTFSTTkyMDBfSURfVVMzLCA0LCBBVE1FTF9VQVJUX1JUUyk7CisKKwkvKiBzZXQgc2VyaWFsIGNvbnNvbGUgdG8gdHR5UzAgKGllLCBEQkdVKSAqLworCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOworfQorCisvKgorICogRXRoZXJuZXQKKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIHJzaV9ld3NfZXRoX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCisJLmlzX3JtaWkJPSAxLAorfTsKKworLyoKKyAqIFVTQiBIb3N0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgcnNpX2V3c191c2JoX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkucG9ydHMJCT0gMSwKK307CisKKy8qCisgKiBTRC9NQworICovCitzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgcnNpX2V3c19tbWNfZGF0YSBfX2luaXRkYXRhID0geworCS5zbG90X2IJCT0gMCwKKwkud2lyZTQJCT0gMSwKKwkuZGV0X3Bpbgk9IEFUOTFfUElOX1BCMjcsCisJLndwX3BpbgkJPSBBVDkxX1BJTl9QQjI5LAorfTsKKworLyoKKyAqIEkyQworICovCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIHJzaV9ld3NfaTJjX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oImRzMTMzNyIsIDB4NjgpLAorCX0sCisJeworCQlJMkNfQk9BUkRfSU5GTygiMjRjMDEiLCAweDUwKSwKKwl9Cit9OworCisvKgorICogTEVEcworICovCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIHJzaV9ld3NfbGVkc1tdID0geworCXsKKwkJLm5hbWUJCQk9ICJsZWQwIiwKKwkJLmdwaW8JCQk9IEFUOTFfUElOX1BCNiwKKwkJLmFjdGl2ZV9sb3cJCT0gMCwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJsZWQxIiwKKwkJLmdwaW8JCQk9IEFUOTFfUElOX1BCNywKKwkJLmFjdGl2ZV9sb3cJCT0gMCwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJsZWQyIiwKKwkJLmdwaW8JCQk9IEFUOTFfUElOX1BCOCwKKwkJLmFjdGl2ZV9sb3cJCT0gMCwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJsZWQzIiwKKwkJLmdwaW8JCQk9IEFUOTFfUElOX1BCOSwKKwkJLmFjdGl2ZV9sb3cJCT0gMCwKKwl9LAorfTsKKworLyoKKyAqIERhdGFGbGFzaAorICovCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHJzaV9ld3Nfc3BpX2RldmljZXNbXSA9IHsKKwl7CS8qIERhdGFGbGFzaCBjaGlwIDEqLworCQkubW9kYWxpYXMJPSAibXRkX2RhdGFmbGFzaCIsCisJCS5jaGlwX3NlbGVjdAk9IDAsCisJCS5tYXhfc3BlZWRfaHoJPSA1ICogMTAwMCAqIDEwMDAsCisJfSwKKwl7CS8qIERhdGFGbGFzaCBjaGlwIDIqLworCQkubW9kYWxpYXMJPSAibXRkX2RhdGFmbGFzaCIsCisJCS5jaGlwX3NlbGVjdAk9IDEsCisJCS5tYXhfc3BlZWRfaHoJPSA1ICogMTAwMCAqIDEwMDAsCisJfSwKK307CisKKy8qCisgKiBOT1IgZmxhc2gKKyAqLworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHJzaWV3c19ub3JfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJCT0gImJvb3QiLAorCQkub2Zmc2V0CQk9IDAsCisJCS5zaXplCQk9IDMgKiBTWl8xMjhLLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUKKwl9LAorCXsKKwkJLm5hbWUJCT0gImtlcm5lbCIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQkJPSBTWl8yTSAtICgzICogU1pfMTI4SykKKwl9LAorCXsKKwkJLm5hbWUJCT0gInJvb3QiLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJCT0gU1pfOE0KKwl9LAorCXsKKwkJLm5hbWUJCT0gImtlcm5lbHVwZCIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQkJPSAzICogU1pfNTEySywKKwkJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFCisJfSwKKwl7CisJCS5uYW1lCQk9ICJyb290dXBkIiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCQk9IDkgKiBTWl81MTJLLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgcnNpZXdzX25vcl9kYXRhID0geworCS53aWR0aAkJPSAyLAorCS5wYXJ0cwkJPSByc2lld3Nfbm9yX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShyc2lld3Nfbm9yX3BhcnRpdGlvbnMpLAorfTsKKworI2RlZmluZSBOT1JfQkFTRQlBVDkxX0NISVBTRUxFQ1RfMAorI2RlZmluZSBOT1JfU0laRQlTWl8xNk0KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBub3JfZmxhc2hfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBOT1JfQkFTRSwKKwkJLmVuZAk9IE5PUl9CQVNFICsgTk9SX1NJWkUgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByc2lld3Nfbm9yX2ZsYXNoID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9ICZyc2lld3Nfbm9yX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBub3JfZmxhc2hfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShub3JfZmxhc2hfcmVzb3VyY2VzKSwKK307CisKKy8qCisgKiBJbml0IEZ1bmMKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHJzaV9ld3NfYm9hcmRfaW5pdCh2b2lkKQoreworCS8qIFNlcmlhbCAqLworCWF0OTFfYWRkX2RldmljZV9zZXJpYWwoKTsKKwlhdDkxX3NldF9ncGlvX291dHB1dChBVDkxX1BJTl9QQTIxLCAwKTsKKwkvKiBFdGhlcm5ldCAqLworCWF0OTFfYWRkX2RldmljZV9ldGgoJnJzaV9ld3NfZXRoX2RhdGEpOworCS8qIFVTQiBIb3N0ICovCisJYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJnJzaV9ld3NfdXNiaF9kYXRhKTsKKwkvKiBJMkMgKi8KKwlhdDkxX2FkZF9kZXZpY2VfaTJjKHJzaV9ld3NfaTJjX2RldmljZXMsCisJCQlBUlJBWV9TSVpFKHJzaV9ld3NfaTJjX2RldmljZXMpKTsKKwkvKiBTUEkgKi8KKwlhdDkxX2FkZF9kZXZpY2Vfc3BpKHJzaV9ld3Nfc3BpX2RldmljZXMsCisJCQlBUlJBWV9TSVpFKHJzaV9ld3Nfc3BpX2RldmljZXMpKTsKKwkvKiBNTUMgKi8KKwlhdDkxX2FkZF9kZXZpY2VfbW1jKDAsICZyc2lfZXdzX21tY19kYXRhKTsKKwkvKiBOT1IgRmxhc2ggKi8KKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJzaWV3c19ub3JfZmxhc2gpOworCS8qIExFRHMgKi8KKwlhdDkxX2dwaW9fbGVkcyhyc2lfZXdzX2xlZHMsIEFSUkFZX1NJWkUocnNpX2V3c19sZWRzKSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoUlNJX0VXUywgIlJTSSBFV1MiKQorCS8qIE1haW50YWluZXI6IEpvc2VmIEhvbHptYXlyIDxob2x6bWF5ckByc2ktZWxla3Ryb3RlY2huaWsuZGU+ICovCisJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCisJLmluaXRfZWFybHkJPSByc2lfZXdzX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAorCS5pbml0X21hY2hpbmUJPSByc2lfZXdzX2JvYXJkX2luaXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTktbDkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMKaW5kZXggNGQzYTAyZi4uMDcyZDUzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTktbDkyNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOS1sOTI2MC5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzcsNyArMzgsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAKICNpbmNsdWRlICJzYW05X3NtYy5oIgpAQCAtMTMxLDE5ICsxMzEsMTQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKTsKLQlyZXR1cm4gZWtfbmFuZF9wYXJ0aXRpb247Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZWtfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjEsCiAJLmNsZQkJPSAyMiwKIC8vCS5kZXRfcGluCT0gLi4uIG5vdCBjb25uZWN0ZWQKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTMsCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQzE0LAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCT0gZWtfbmFuZF9wYXJ0aXRpb24sCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pLAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKaW5kZXggOGE1MGMzZS4uNGYxMDE4MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQxLDcgKzQyLDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KICNpbmNsdWRlIDxtYWNoL3N5c3RlbV9yZXYuaD4KQEAgLTE3MywxOSArMTczLDE0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGVrX25hbmRfcGFydGl0aW9uOwotfQotCiBzdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBfX2luaXRkYXRhIGVrX25hbmRfZGF0YSA9IHsKIAkuYWxlCQk9IDIxLAogCS5jbGUJCT0gMjIsCiAvLwkuZGV0X3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCiAJLnJkeV9waW4JPSBBVDkxX1BJTl9QQzEzLAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNCwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCisJLnBhcnRzCQk9IGVrX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZWtfbmFuZF9zbWNfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCmluZGV4IDUwOTZhMGUuLmIwMDViNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC00NSw3ICs0Niw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAjaW5jbHVkZSA8bWFjaC9zeXN0ZW1fcmV2Lmg+CkBAIC0xNzksMTkgKzE3OSwxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBla19uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMiwKIAkuY2xlCQk9IDIxLAogLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxNSwKIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTQsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSBla19uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYwppbmRleCBlYThmMTg1Li5iY2NkY2YyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDQsNyArNDUsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogI2luY2x1ZGUgPG1hY2gvc3lzdGVtX3Jldi5oPgpAQCAtMTgwLDE5ICsxODAsMTQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKTsKLQlyZXR1cm4gZWtfbmFuZF9wYXJ0aXRpb247Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZWtfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjEsCiAJLmNsZQkJPSAyMiwKIC8vCS5kZXRfcGluCT0gLi4uIG5vdCBjb25uZWN0ZWQKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BBMjIsCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QRDE1LAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCT0gZWtfbmFuZF9wYXJ0aXRpb24sCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pLAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKaW5kZXggODE3ZjU5ZC4uNjRmYzc1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQxLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogI2luY2x1ZGUgPG1hY2gvc3lzdGVtX3Jldi5oPgogCkBAIC0xNTcsMTkgKzE1NywxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBla19uYW5kX3BhcnRpdGlvbjsKLX0KLQogLyogZGV0X3BpbiBpcyBub3QgY29ubmVjdGVkICovCiBzdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBfX2luaXRkYXRhIGVrX25hbmRfZGF0YSA9IHsKIAkuYWxlCQk9IDIxLAogCS5jbGUJCT0gMjIsCiAJLnJkeV9waW4JPSBBVDkxX1BJTl9QQzEzLAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNCwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCisJLnBhcnRzCQk9IGVrX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZWtfbmFuZF9zbWNfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCmluZGV4IGFkMjM0Y2MuLjkyZGU5MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zOCw3ICszOSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KICNpbmNsdWRlIDxtYWNoL3N5c3RlbV9yZXYuaD4KQEAgLTEzNywxOSArMTM3LDE0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGVrX25hbmRfcGFydGl0aW9uOwotfQotCiAvKiBkZXRfcGluIGlzIG5vdCBjb25uZWN0ZWQgKi8KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZWtfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjEsCiAJLmNsZQkJPSAyMiwKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDOCwKIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTQsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSBla19uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKaW5kZXggNGYxNGI1NC4uYjJiNzQ4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKQEAgLTgsNiArOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzAsNyArMzEsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCkBAIC04OCwxOSArODgsMTQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKTsKLQlyZXR1cm4gZWtfbmFuZF9wYXJ0aXRpb247Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZWtfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjEsCiAJLmNsZQkJPSAyMiwKIC8vCS5kZXRfcGluCT0gLi4uIG5vdCBjb25uZWN0ZWQKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BEMTcsCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQjYsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSBla19uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zbmFwcGVyOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKaW5kZXggYzczZDI1ZS4uMGRmMDFjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKQEAgLTk3LDE4ICs5NywxMiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQKLXNuYXBwZXI5MjYwX25hbmRfcGFydGl0aW9uX2luZm8oaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShzbmFwcGVyOTI2MF9uYW5kX3BhcnRpdGlvbnMpOwotCXJldHVybiBzbmFwcGVyOTI2MF9uYW5kX3BhcnRpdGlvbnM7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgc25hcHBlcjkyNjBfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjEsCiAJLmNsZQkJPSAyMiwKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTMsCi0JLnBhcnRpdGlvbl9pbmZvCT0gc25hcHBlcjkyNjBfbmFuZF9wYXJ0aXRpb25faW5mbywKKwkucGFydHMJCT0gc25hcHBlcjkyNjBfbmFuZF9wYXJ0aXRpb25zLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKHNuYXBwZXI5MjYwX25hbmRfcGFydGl0aW9ucyksCiAJLmJ1c193aWR0aF8xNgk9IDAsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGMxYTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1IFNBTiBQZW9wbGUKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgQXRtZWwKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQ2FsYW8tc3lzdGVtcwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLQotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgotI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgotCi0jaW5jbHVkZSAic2FtOV9zbWMuaCIKLSNpbmNsdWRlICJnZW5lcmljLmgiCi0KLQotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKLXsKLQkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTIuMDAwIE1IeiBjcnlzdGFsICovCi0JYXQ5MV9pbml0aWFsaXplKDEyMDAwMDAwKTsKLQotCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCi0JYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwotCi0JLyogc2V0IHNlcmlhbCBjb25zb2xlIHRvIHR0eVMwIChpZSwgREJHVSkgKi8KLQlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKLX0KLQotLyoKLSAqIFVTQiBIb3N0IHBvcnQKLSAqLwotc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSBfX2luaXRkYXRhIGVrX3VzYmhfZGF0YSA9IHsKLQkucG9ydHMJCT0gMiwKLX07Ci0KLS8qCi0gKiBVU0IgRGV2aWNlIHBvcnQKLSAqLwotc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIF9faW5pdGRhdGEgZWtfdWRjX2RhdGEgPSB7Ci0JLnZidXNfcGluCT0gQVQ5MV9QSU5fUEM1LAotCS5wdWxsdXBfcGluCT0gMCwJCS8qIHB1bGwtdXAgZHJpdmVuIGJ5IFVEQyAqLwotfTsKLQotLyoKLSAqIE1BQ0IgRXRoZXJuZXQgZGV2aWNlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGVrX21hY2JfZGF0YSA9IHsKLQkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQTMxLAotCS5pc19ybWlpCT0gMSwKLX07Ci0KLS8qCi0gKiBOQU5EIGZsYXNoCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBfX2luaXRkYXRhIGVrX25hbmRfcGFydGl0aW9uW10gPSB7Ci0JewotCQkubmFtZQk9ICJVYm9vdCAmIEtlcm5lbCIsCi0JCS5vZmZzZXQJPSAwLAotCQkuc2l6ZQk9IFNaXzE2TSwKLQl9LAotCXsKLQkJLm5hbWUJPSAiUm9vdCBGUyIsCi0JCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCi0JCS5zaXplCT0gMTIwICogU1pfMU0sCi0JfSwKLQl7Ci0JCS5uYW1lCT0gIkZTIiwKLQkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKLQkJLnNpemUJPSAxMjAgKiBTWl8xTSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBla19uYW5kX3BhcnRpdGlvbjsKLX0KLQotc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7Ci0JLmFsZQkJPSAyMSwKLQkuY2xlCQk9IDIyLAotLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAotCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxMywKLQkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTQsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7Ci0JLm5jc19yZWFkX3NldHVwCQk9IDAsCi0JLm5yZF9zZXR1cAkJPSAxLAotCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAotCS5ud2Vfc2V0dXAJCT0gMSwKLQotCS5uY3NfcmVhZF9wdWxzZQkJPSAzLAotCS5ucmRfcHVsc2UJCT0gMywKLQkubmNzX3dyaXRlX3B1bHNlCT0gMywKLQkubndlX3B1bHNlCQk9IDMsCi0KLQkucmVhZF9jeWNsZQkJPSA1LAotCS53cml0ZV9jeWNsZQkJPSA1LAotCi0JLm1vZGUJCQk9IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSB8IEFUOTFfU01DX0RCV184LAotCS50ZGZfY3ljbGVzCQk9IDIsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCi17Ci0JLyogY29uZmlndXJlIGNoaXAtc2VsZWN0IDMgKE5BTkQpICovCi0Jc2FtOV9zbWNfY29uZmlndXJlKDMsICZla19uYW5kX3NtY19jb25maWcpOwotCi0JYXQ5MV9hZGRfZGV2aWNlX25hbmQoJmVrX25hbmRfZGF0YSk7Ci19Ci0KLS8qCi0gKiBHUElPIEJ1dHRvbnMKLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gZWtfYnV0dG9uc1tdID0gewotCXsJLyogVVNFUiBQVVNIIEJVVFRPTiAqLwotCQkuY29kZQkJPSBLRVlfRU5URVIsCi0JCS5ncGlvCQk9IEFUOTFfUElOX1BCMTAsCi0JCS5hY3RpdmVfbG93CT0gMSwKLQkJLmRlc2MJCT0gInVzZXJfcGIiLAotCQkud2FrZXVwCQk9IDEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBla19idXR0b25fZGF0YSA9IHsKLQkuYnV0dG9ucwk9IGVrX2J1dHRvbnMsCi0JLm5idXR0b25zCT0gQVJSQVlfU0laRShla19idXR0b25zKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVrX2J1dHRvbl9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImdwaW8ta2V5cyIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gMCwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZWtfYnV0dG9uX2RhdGEsCi0JfQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfYnV0dG9ucyh2b2lkKQotewotCWF0OTFfc2V0X0dQSU9fcGVyaXBoKEFUOTFfUElOX1BCMTAsIDEpOwkvKiB1c2VyIHB1c2ggYnV0dG9uLCBwdWxsIHVwIGVuYWJsZWQgKi8KLQlhdDkxX3NldF9kZWdsaXRjaChBVDkxX1BJTl9QQjEwLCAxKTsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWtfYnV0dG9uX2RldmljZSk7Ci19Ci0jZWxzZQotc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfYnV0dG9ucyh2b2lkKSB7fQotI2VuZGlmCi0KLS8qCi0gKiBMRURzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZWtfbGVkc1tdID0gewotCXsJLyogdXNlcl9sZWQgKGdyZWVuKSAqLwotCQkubmFtZQkJCT0gInVzZXJfbGVkIiwKLQkJLmdwaW8JCQk9IEFUOTFfUElOX1BCMjEsCi0JCS5hY3RpdmVfbG93CQk9IDAsCi0JCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKLQl9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfYm9hcmRfaW5pdCh2b2lkKQotewotCS8qIFNlcmlhbCAqLwotCWF0OTFfYWRkX2RldmljZV9zZXJpYWwoKTsKLQkvKiBVU0IgSG9zdCAqLwotCWF0OTFfYWRkX2RldmljZV91c2JoKCZla191c2JoX2RhdGEpOwotCS8qIFVTQiBEZXZpY2UgKi8KLQlhdDkxX2FkZF9kZXZpY2VfdWRjKCZla191ZGNfZGF0YSk7Ci0JLyogTkFORCAqLwotCWVrX2FkZF9kZXZpY2VfbmFuZCgpOwotCS8qIEkyQyAqLwotCWF0OTFfYWRkX2RldmljZV9pMmMoTlVMTCwgMCk7Ci0JLyogRXRoZXJuZXQgKi8KLQlhdDkxX2FkZF9kZXZpY2VfZXRoKCZla19tYWNiX2RhdGEpOwotCS8qIFB1c2ggQnV0dG9ucyAqLwotCWVrX2FkZF9kZXZpY2VfYnV0dG9ucygpOwotCS8qIExFRHMgKi8KLQlhdDkxX2dwaW9fbGVkcyhla19sZWRzLCBBUlJBWV9TSVpFKGVrX2xlZHMpKTsKLQkvKiBzaHV0ZG93biBjb250cm9sbGVyLCB3YWtldXAgYnV0dG9uICg1IG1zZWMgbG93KSAqLwotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU0hEV19NUiwgQVQ5MV9TSERXX0NQVFdLMF8oMTApIHwgQVQ5MV9TSERXX1dLTU9ERTBfTE9XCi0JCQkJfCBBVDkxX1NIRFdfUlRUV0tFTik7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoVVNCX0E5MjYwLCAiQ0FMQU8gVVNCX0E5MjYwIikKLQkvKiBNYWludGFpbmVyOiBjYWxhby1zeXN0ZW1zICovCi0JLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCi0JLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWU3OTM3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uLgotICogIENvcHlyaWdodCAoQykgMjAwNyBDYWxhby1zeXN0ZW1zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+Ci0jaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+Ci0KLSNpbmNsdWRlICJzYW05X3NtYy5oIgotI2luY2x1ZGUgImdlbmVyaWMuaCIKLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQotewotCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMi4wMCBNSHogY3J5c3RhbCAqLwotCWF0OTFfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7Ci0KLQkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwotCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKLQotCS8qIHNldCBzZXJpYWwgY29uc29sZSB0byB0dHlTMCAoaWUsIERCR1UpICovCi0JYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7Ci19Ci0KLS8qCi0gKiBVU0IgSG9zdCBwb3J0Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgX19pbml0ZGF0YSBla191c2JoX2RhdGEgPSB7Ci0JLnBvcnRzCQk9IDIsCi19OwotCi0vKgotICogVVNCIERldmljZSBwb3J0Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSBfX2luaXRkYXRhIGVrX3VkY19kYXRhID0gewotCS52YnVzX3Bpbgk9IEFUOTFfUElOX1BCMTEsCi0JLnB1bGx1cF9waW4JPSAwLAkJLyogcHVsbC11cCBkcml2ZW4gYnkgVURDICovCi19OwotCi0vKgotICogU1BJIGRldmljZXMuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gZWtfc3BpX2RldmljZXNbXSA9IHsKLSNpZiAhZGVmaW5lZChDT05GSUdfTU1DX0FUOTEpCi0JewkvKiBEYXRhRmxhc2ggY2hpcCAqLwotCQkubW9kYWxpYXMJPSAibXRkX2RhdGFmbGFzaCIsCi0JCS5jaGlwX3NlbGVjdAk9IDAsCi0JCS5tYXhfc3BlZWRfaHoJPSAxNSAqIDEwMDAgKiAxMDAwLAotCQkuYnVzX251bQk9IDAsCi0JfQotI2VuZGlmCi19OwotCi0vKgotICogTUFDQiBFdGhlcm5ldCBkZXZpY2UKLSAqLwotc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgZWtfbWFjYl9kYXRhID0gewotCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BFMzEsCi0JLmlzX3JtaWkJPSAxLAotfTsKLQotLyoKLSAqIE5BTkQgZmxhc2gKLSAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIF9faW5pdGRhdGEgZWtfbmFuZF9wYXJ0aXRpb25bXSA9IHsKLQl7Ci0JCS5uYW1lCT0gIkxpbnV4IEtlcm5lbCIsCi0JCS5vZmZzZXQJPSAwLAotCQkuc2l6ZQk9IFNaXzE2TSwKLQl9LAotCXsKLQkJLm5hbWUJPSAiUm9vdCBGUyIsCi0JCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCi0JCS5zaXplCT0gMTIwICogU1pfMU0sCi0JfSwKLQl7Ci0JCS5uYW1lCT0gIkZTIiwKLQkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKLQkJLnNpemUJPSAxMjAgKiBTWl8xTSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBla19uYW5kX3BhcnRpdGlvbjsKLX0KLQotc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7Ci0JLmFsZQkJPSAyMSwKLQkuY2xlCQk9IDIyLAotLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAotCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEEyMiwKLQkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BEMTUsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7Ci0JLm5jc19yZWFkX3NldHVwCQk9IDAsCi0JLm5yZF9zZXR1cAkJPSAxLAotCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAotCS5ud2Vfc2V0dXAJCT0gMSwKLQotCS5uY3NfcmVhZF9wdWxzZQkJPSAzLAotCS5ucmRfcHVsc2UJCT0gMywKLQkubmNzX3dyaXRlX3B1bHNlCT0gMywKLQkubndlX3B1bHNlCQk9IDMsCi0KLQkucmVhZF9jeWNsZQkJPSA1LAotCS53cml0ZV9jeWNsZQkJPSA1LAotCi0JLm1vZGUJCQk9IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSB8IEFUOTFfU01DX0RCV184LAotCS50ZGZfY3ljbGVzCQk9IDIsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCi17Ci0JLyogY29uZmlndXJlIGNoaXAtc2VsZWN0IDMgKE5BTkQpICovCi0Jc2FtOV9zbWNfY29uZmlndXJlKDMsICZla19uYW5kX3NtY19jb25maWcpOwotCi0JYXQ5MV9hZGRfZGV2aWNlX25hbmQoJmVrX25hbmRfZGF0YSk7Ci19Ci0KLQotLyoKLSAqIEdQSU8gQnV0dG9ucwotICovCi0jaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gZWtfYnV0dG9uc1tdID0gewotCXsJLyogVVNFUiBQVVNIIEJVVFRPTiAqLwotCQkuY29kZQkJPSBLRVlfRU5URVIsCi0JCS5ncGlvCQk9IEFUOTFfUElOX1BCMTAsCi0JCS5hY3RpdmVfbG93CT0gMSwKLQkJLmRlc2MJCT0gInVzZXJfcGIiLAotCQkud2FrZXVwCQk9IDEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBla19idXR0b25fZGF0YSA9IHsKLQkuYnV0dG9ucwk9IGVrX2J1dHRvbnMsCi0JLm5idXR0b25zCT0gQVJSQVlfU0laRShla19idXR0b25zKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVrX2J1dHRvbl9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImdwaW8ta2V5cyIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gMCwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZWtfYnV0dG9uX2RhdGEsCi0JfQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfYnV0dG9ucyh2b2lkKQotewotCWF0OTFfc2V0X0dQSU9fcGVyaXBoKEFUOTFfUElOX1BCMTAsIDEpOwkvKiB1c2VyIHB1c2ggYnV0dG9uLCBwdWxsIHVwIGVuYWJsZWQgKi8KLQlhdDkxX3NldF9kZWdsaXRjaChBVDkxX1BJTl9QQjEwLCAxKTsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWtfYnV0dG9uX2RldmljZSk7Ci19Ci0jZWxzZQotc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfYnV0dG9ucyh2b2lkKSB7fQotI2VuZGlmCi0KLS8qCi0gKiBMRURzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZWtfbGVkc1tdID0gewotCXsJLyogdXNlcl9sZWQgKGdyZWVuKSAqLwotCQkubmFtZQkJCT0gInVzZXJfbGVkIiwKLQkJLmdwaW8JCQk9IEFUOTFfUElOX1BCMjEsCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKLQl9Ci19OwotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBla19ib2FyZF9pbml0KHZvaWQpCi17Ci0JLyogU2VyaWFsICovCi0JYXQ5MV9hZGRfZGV2aWNlX3NlcmlhbCgpOwotCS8qIFVTQiBIb3N0ICovCi0JYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJmVrX3VzYmhfZGF0YSk7Ci0JLyogVVNCIERldmljZSAqLwotCWF0OTFfYWRkX2RldmljZV91ZGMoJmVrX3VkY19kYXRhKTsKLQkvKiBTUEkgKi8KLQlhdDkxX2FkZF9kZXZpY2Vfc3BpKGVrX3NwaV9kZXZpY2VzLCBBUlJBWV9TSVpFKGVrX3NwaV9kZXZpY2VzKSk7Ci0JLyogRXRoZXJuZXQgKi8KLQlhdDkxX2FkZF9kZXZpY2VfZXRoKCZla19tYWNiX2RhdGEpOwotCS8qIE5BTkQgKi8KLQlla19hZGRfZGV2aWNlX25hbmQoKTsKLQkvKiBJMkMgKi8KLQlhdDkxX2FkZF9kZXZpY2VfaTJjKE5VTEwsIDApOwotCS8qIFB1c2ggQnV0dG9ucyAqLwotCWVrX2FkZF9kZXZpY2VfYnV0dG9ucygpOwotCS8qIExFRHMgKi8KLQlhdDkxX2dwaW9fbGVkcyhla19sZWRzLCBBUlJBWV9TSVpFKGVrX2xlZHMpKTsKLQkvKiBzaHV0ZG93biBjb250cm9sbGVyLCB3YWtldXAgYnV0dG9uICg1IG1zZWMgbG93KSAqLwotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU0hEV19NUiwgQVQ5MV9TSERXX0NQVFdLMF8oMTApIHwgQVQ5MV9TSERXX1dLTU9ERTBfTE9XCi0JCQkJfCBBVDkxX1NIRFdfUlRUV0tFTik7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoVVNCX0E5MjYzLCAiQ0FMQU8gVVNCX0E5MjYzIikKLQkvKiBNYWludGFpbmVyOiBjYWxhby1zeXN0ZW1zICovCi0JLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCi0JLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2eC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjBiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjZ4LmMKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjZ4LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IFNBTiBQZW9wbGUKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24uCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IENhbGFvLXN5c3RlbXMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgSmVhbi1DaHJpc3RvcGhlIFBMQUdOSU9MLVZJTExBUkQgPHBsYWduaW9qQGpjcm9zb2Z0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9tbWNfc3BpLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KKworI2luY2x1ZGUgInNhbTlfc21jLmgiCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCit7CisJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEyLjAwIE1IeiBjcnlzdGFsICovCisJYXQ5MV9pbml0aWFsaXplKDEyMDAwMDAwKTsKKworCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCisJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOworCisJLyogc2V0IHNlcmlhbCBjb25zb2xlIHRvIHR0eVMwIChpZSwgREJHVSkgKi8KKwlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKK30KKworLyoKKyAqIFVTQiBIb3N0IHBvcnQKKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSBfX2luaXRkYXRhIGVrX3VzYmhfZGF0YSA9IHsKKwkucG9ydHMJCT0gMiwKK307CisKKy8qCisgKiBVU0IgRGV2aWNlIHBvcnQKKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIF9faW5pdGRhdGEgZWtfdWRjX2RhdGEgPSB7CisJLnZidXNfcGluCT0gQVQ5MV9QSU5fUEIxMSwKKwkucHVsbHVwX3Bpbgk9IDAsCQkvKiBwdWxsLXVwIGRyaXZlbiBieSBVREMgKi8KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX3VkYyh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX3VzYl9hOTI2MCgpIHx8IG1hY2hpbmVfaXNfdXNiX2E5ZzIwKCkpCisJCWVrX3VkY19kYXRhLnZidXNfcGluID0gQVQ5MV9QSU5fUEM1OworCisJYXQ5MV9hZGRfZGV2aWNlX3VkYygmZWtfdWRjX2RhdGEpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCisjZGVmaW5lIE1NQ19TUElfQ0FSRF9ERVRFQ1RfSU5UIEFUOTFfUElOX1BDNAorc3RhdGljIGludCBhdDkxX21tY19zcGlfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJaXJxcmV0dXJuX3QgKCpkZXRlY3RfaW50KShpbnQsIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJLyogQ29uZmlndXJlIEludGVycnVwdCBwaW4gYXMgaW5wdXQsIG5vIHB1bGwtdXAgKi8KKwlhdDkxX3NldF9ncGlvX2lucHV0KE1NQ19TUElfQ0FSRF9ERVRFQ1RfSU5ULCAwKTsKKwlyZXR1cm4gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoTU1DX1NQSV9DQVJEX0RFVEVDVF9JTlQpLCBkZXRlY3RfaW50LAorCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCSJtbWMtc3BpLWRldGVjdCIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBhdDkxX21tY19zcGlfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZnJlZV9pcnEoZ3Bpb190b19pcnEoTU1DX1NQSV9DQVJEX0RFVEVDVF9JTlQpLCBkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBtbWNfc3BpX3BsYXRmb3JtX2RhdGEgYXQ5MV9tbWNfc3BpX3BkYXRhID0geworCS5pbml0ID0gYXQ5MV9tbWNfc3BpX2luaXQsCisJLmV4aXQgPSBhdDkxX21tY19zcGlfZXhpdCwKKwkuZGV0ZWN0X2RlbGF5ID0gMTAwLCAvKiBtc2VjcyAqLworfTsKKyNlbmRpZgorCisvKgorICogU1BJIGRldmljZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gdXNiX2E5MjYzX3NwaV9kZXZpY2VzW10gPSB7CisjaWYgIWRlZmluZWQoQ09ORklHX01NQ19BVDkxKQorCXsJLyogRGF0YUZsYXNoIGNoaXAgKi8KKwkJLm1vZGFsaWFzCT0gIm10ZF9kYXRhZmxhc2giLAorCQkuY2hpcF9zZWxlY3QJPSAwLAorCQkubWF4X3NwZWVkX2h6CT0gMTUgKiAxMDAwICogMTAwMCwKKwkJLmJ1c19udW0JPSAwLAorCX0KKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyB1c2JfYTlnMjBfc3BpX2RldmljZXNbXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcyA9ICJtbWNfc3BpIiwKKwkJLm1heF9zcGVlZF9oeiA9IDIwMDAwMDAwLAkvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMSwKKwkJLmNoaXBfc2VsZWN0ID0gMCwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYXQ5MV9tbWNfc3BpX3BkYXRhLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2Vfc3BpKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdXNiX2E5MjYzKCkpCisJCWF0OTFfYWRkX2RldmljZV9zcGkodXNiX2E5MjYzX3NwaV9kZXZpY2VzLCBBUlJBWV9TSVpFKHVzYl9hOTI2M19zcGlfZGV2aWNlcykpOworCWVsc2UgaWYgKG1hY2hpbmVfaXNfdXNiX2E5ZzIwKCkpCisJCWF0OTFfYWRkX2RldmljZV9zcGkodXNiX2E5ZzIwX3NwaV9kZXZpY2VzLCBBUlJBWV9TSVpFKHVzYl9hOWcyMF9zcGlfZGV2aWNlcykpOworfQorCisvKgorICogTUFDQiBFdGhlcm5ldCBkZXZpY2UKKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgZWtfbWFjYl9kYXRhID0geworCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BFMzEsCisJLmlzX3JtaWkJPSAxLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfZXRoKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdXNiX2E5MjYwKCkgfHwgbWFjaGluZV9pc191c2JfYTlnMjAoKSkKKwkJZWtfbWFjYl9kYXRhLnBoeV9pcnFfcGluID0gQVQ5MV9QSU5fUEEzMTsKKworCWF0OTFfYWRkX2RldmljZV9ldGgoJmVrX21hY2JfZGF0YSk7Cit9CisKKy8qCisgKiBOQU5EIGZsYXNoCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBfX2luaXRkYXRhIGVrX25hbmRfcGFydGl0aW9uW10gPSB7CisJeworCQkubmFtZQk9ICJiYXJlYm94IiwKKwkJLm9mZnNldAk9IDAsCisJCS5zaXplCT0gMyAqIFNaXzEyOEssCisJfSwgeworCQkubmFtZQk9ICJiYXJlYm94ZW52IiwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSBTWl8xMjhLLAorCX0sIHsKKwkJLm5hbWUJPSAiYmFyZWJveGVudjIiLAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQk9IFNaXzEyOEssCisJfSwgeworCQkubmFtZQk9ICJrZXJuZWwiLAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQk9IDQgKiBTWl8xTSwKKwl9LCB7CisJCS5uYW1lCT0gInJvb3RmcyIsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCT0gMTIwICogU1pfMU0sCisJfSwgeworCQkubmFtZQk9ICJkYXRhIiwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSBNVERQQVJUX1NJWl9GVUxMLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZWtfbmFuZF9kYXRhID0geworCS5hbGUJCT0gMjEsCisJLmNsZQkJPSAyMiwKKy8vCS5kZXRfcGluCT0gLi4uIG5vdCBjb25uZWN0ZWQKKwkucmR5X3Bpbgk9IEFUOTFfUElOX1BBMjIsCisJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QRDE1LAorCS5wYXJ0cwkJPSBla19uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbiksCit9OworCitzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIHVzYl9hOTI2MF9uYW5kX3NtY19jb25maWcgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDAsCisJLm5yZF9zZXR1cAkJPSAxLAorCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAorCS5ud2Vfc2V0dXAJCT0gMSwKKworCS5uY3NfcmVhZF9wdWxzZQkJPSAzLAorCS5ucmRfcHVsc2UJCT0gMywKKwkubmNzX3dyaXRlX3B1bHNlCT0gMywKKwkubndlX3B1bHNlCQk9IDMsCisKKwkucmVhZF9jeWNsZQkJPSA1LAorCS53cml0ZV9jeWNsZQkJPSA1LAorCisJLm1vZGUJCQk9IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSB8IEFUOTFfU01DX0RCV184LAorCS50ZGZfY3ljbGVzCQk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIHVzYl9hOWcyMF9uYW5kX3NtY19jb25maWcgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDAsCisJLm5yZF9zZXR1cAkJPSAyLAorCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAorCS5ud2Vfc2V0dXAJCT0gMiwKKworCS5uY3NfcmVhZF9wdWxzZQkJPSA0LAorCS5ucmRfcHVsc2UJCT0gNCwKKwkubmNzX3dyaXRlX3B1bHNlCT0gNCwKKwkubndlX3B1bHNlCQk9IDQsCisKKwkucmVhZF9jeWNsZQkJPSA3LAorCS53cml0ZV9jeWNsZQkJPSA3LAorCisJLm1vZGUJCQk9IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSB8IEFUOTFfU01DX0RCV184LAorCS50ZGZfY3ljbGVzCQk9IDMsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdXNiX2E5MjYwKCkgfHwgbWFjaGluZV9pc191c2JfYTlnMjAoKSkgeworCQlla19uYW5kX2RhdGEucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTM7CisJCWVrX25hbmRfZGF0YS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNDsKKwl9CisKKwkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KKwlpZiAobWFjaGluZV9pc191c2JfYTlnMjAoKSkKKwkJc2FtOV9zbWNfY29uZmlndXJlKDMsICZ1c2JfYTlnMjBfbmFuZF9zbWNfY29uZmlnKTsKKwllbHNlCisJCXNhbTlfc21jX2NvbmZpZ3VyZSgzLCAmdXNiX2E5MjYwX25hbmRfc21jX2NvbmZpZyk7CisKKwlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKK30KKworCisvKgorICogR1BJTyBCdXR0b25zCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBla19idXR0b25zW10gPSB7CisJewkvKiBVU0VSIFBVU0ggQlVUVE9OICovCisJCS5jb2RlCQk9IEtFWV9FTlRFUiwKKwkJLmdwaW8JCT0gQVQ5MV9QSU5fUEIxMCwKKwkJLmFjdGl2ZV9sb3cJPSAxLAorCQkuZGVzYwkJPSAidXNlcl9wYiIsCisJCS53YWtldXAJCT0gMSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGVrX2J1dHRvbl9kYXRhID0geworCS5idXR0b25zCT0gZWtfYnV0dG9ucywKKwkubmJ1dHRvbnMJPSBBUlJBWV9TSVpFKGVrX2J1dHRvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZWtfYnV0dG9uX2RldmljZSA9IHsKKwkubmFtZQkJPSAiZ3Bpby1rZXlzIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZla19idXR0b25fZGF0YSwKKwl9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9idXR0b25zKHZvaWQpCit7CisJYXQ5MV9zZXRfR1BJT19wZXJpcGgoQVQ5MV9QSU5fUEIxMCwgMSk7CS8qIHVzZXIgcHVzaCBidXR0b24sIHB1bGwgdXAgZW5hYmxlZCAqLworCWF0OTFfc2V0X2RlZ2xpdGNoKEFUOTFfUElOX1BCMTAsIDEpOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZla19idXR0b25fZGV2aWNlKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9idXR0b25zKHZvaWQpIHt9CisjZW5kaWYKKworLyoKKyAqIExFRHMKKyAqLworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBla19sZWRzW10gPSB7CisJewkvKiB1c2VyX2xlZCAoZ3JlZW4pICovCisJCS5uYW1lCQkJPSAidXNlcl9sZWQiLAorCQkuZ3BpbwkJCT0gQVQ5MV9QSU5fUEIyMSwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJoZWFydGJlYXQiLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBla19pMmNfZGV2aWNlc1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInJ2MzAyOWMyIiwgMHg1NiksCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX2xlZHModm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc191c2JfYTkyNjAoKSB8fCBtYWNoaW5lX2lzX3VzYl9hOWcyMCgpKQorCQlla19sZWRzWzBdLmFjdGl2ZV9sb3cgPSAwOworCisJYXQ5MV9ncGlvX2xlZHMoZWtfbGVkcywgQVJSQVlfU0laRShla19sZWRzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19ib2FyZF9pbml0KHZvaWQpCit7CisJLyogU2VyaWFsICovCisJYXQ5MV9hZGRfZGV2aWNlX3NlcmlhbCgpOworCS8qIFVTQiBIb3N0ICovCisJYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJmVrX3VzYmhfZGF0YSk7CisJLyogVVNCIERldmljZSAqLworCWVrX2FkZF9kZXZpY2VfdWRjKCk7CisJLyogU1BJICovCisJZWtfYWRkX2RldmljZV9zcGkoKTsKKwkvKiBFdGhlcm5ldCAqLworCWVrX2FkZF9kZXZpY2VfZXRoKCk7CisJLyogTkFORCAqLworCWVrX2FkZF9kZXZpY2VfbmFuZCgpOworCS8qIFB1c2ggQnV0dG9ucyAqLworCWVrX2FkZF9kZXZpY2VfYnV0dG9ucygpOworCS8qIExFRHMgKi8KKwlla19hZGRfZGV2aWNlX2xlZHMoKTsKKworCWlmIChtYWNoaW5lX2lzX3VzYl9hOWcyMCgpKSB7CisJCS8qIEkyQyAqLworCQlhdDkxX2FkZF9kZXZpY2VfaTJjKGVrX2kyY19kZXZpY2VzLCBBUlJBWV9TSVpFKGVrX2kyY19kZXZpY2VzKSk7CisJfSBlbHNlIHsKKwkJLyogSTJDICovCisJCWF0OTFfYWRkX2RldmljZV9pMmMoTlVMTCwgMCk7CisJCS8qIHNodXRkb3duIGNvbnRyb2xsZXIsIHdha2V1cCBidXR0b24gKDUgbXNlYyBsb3cpICovCisJCWF0OTFfc3lzX3dyaXRlKEFUOTFfU0hEV19NUiwgQVQ5MV9TSERXX0NQVFdLMF8oMTApCisJCQkJfCBBVDkxX1NIRFdfV0tNT0RFMF9MT1cKKwkJCQl8IEFUOTFfU0hEV19SVFRXS0VOKTsKKwl9Cit9CisKK01BQ0hJTkVfU1RBUlQoVVNCX0E5MjYzLCAiQ0FMQU8gVVNCX0E5MjYzIikKKwkvKiBNYWludGFpbmVyOiBjYWxhby1zeXN0ZW1zICovCisJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCisJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCitNQUNISU5FX0VORAorCitNQUNISU5FX1NUQVJUKFVTQl9BOTI2MCwgIkNBTEFPIFVTQl9BOTI2MCIpCisJLyogTWFpbnRhaW5lcjogY2FsYW8tc3lzdGVtcyAqLworCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKKwkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAorCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAorTUFDSElORV9FTkQKKworTUFDSElORV9TVEFSVChVU0JfQTlHMjAsICJDQUxBTyBVU0JfQTkyRzAiKQorCS8qIE1haW50YWluZXI6IEplYW4tQ2hyaXN0b3BoZSBQTEFHTklPTC1WSUxMQVJEICovCisJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCisJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXlsLTkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC15bC05MjAwLmMKaW5kZXggOTVlZGNiZC4uMTJhM2Y5NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXlsLTkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQteWwtOTIwMC5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDMsNyArNDQsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDBfbWMuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCkBAIC0xNzIsMTkgKzE3MiwxNCBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRSh5bDkyMDBfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiB5bDkyMDBfbmFuZF9wYXJ0aXRpb247Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgeWw5MjAwX25hbmRfZGF0YSA9IHsKIAkuYWxlCQk9IDYsCiAJLmNsZQkJPSA3LAogCS8vIC5kZXRfcGluCT0gLi4uIG5vdCBjb25uZWN0ZWQKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTQsCS8qIFIvIUIgKFNoZWV0MTApICovCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQzE1LAkvKiAhQ0UgIChTaGVldDEwKSAqLwotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCT0geWw5MjAwX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKHlsOTIwMF9uYW5kX3BhcnRpdGlvbiksCiB9OwogCiAvKgpAQCAtMzg5LDcgKzM4NCw3IEBACiAjaW5jbHVkZSA8dmlkZW8vczFkMTN4eHhmYi5oPgogCiAKLXN0YXRpYyB2b2lkIF9faW5pdCB5bDkyMDBfaW5pdF92aWRlbyh2b2lkKQorc3RhdGljIHZvaWQgeWw5MjAwX2luaXRfdmlkZW8odm9pZCkKIHsKIAkvKiBOV0FJVCBTaWduYWwgKi8KIAlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzYsIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2NwdWlkbGUuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9jcHVpZGxlLmMKaW5kZXggMWNmZWFjMS4uYTg1MWU2YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9jcHVpZGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2NwdWlkbGUuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAicG0uaCIKIApAQCAtMzMsNyArMzQsOCBAQAogCiAvKiBBY3R1YWwgY29kZSB0aGF0IHB1dHMgdGhlIFNvQyBpbiBkaWZmZXJlbnQgaWRsZSBzdGF0ZXMgKi8KIHN0YXRpYyBpbnQgYXQ5MV9lbnRlcl9pZGxlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKKwkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJICAgICAgIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgdGltZXZhbCBiZWZvcmUsIGFmdGVyOwogCWludCBpZGxlX3RpbWU7CkBAIC00MSwxMCArNDMsMTAgQEAKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJZG9fZ2V0dGltZW9mZGF5KCZiZWZvcmUpOwotCWlmIChzdGF0ZSA9PSAmZGV2LT5zdGF0ZXNbMF0pCisJaWYgKGluZGV4ID09IDApCiAJCS8qIFdhaXQgZm9yIGludGVycnVwdCBzdGF0ZSAqLwogCQljcHVfZG9faWRsZSgpOwotCWVsc2UgaWYgKHN0YXRlID09ICZkZXYtPnN0YXRlc1sxXSkgeworCWVsc2UgaWYgKGluZGV4ID09IDEpIHsKIAkJYXNtKCJiIDFmOyAuYWxpZ24gNTsgMToiKTsKIAkJYXNtKCJtY3IgcDE1LCAwLCByMCwgYzcsIGMxMCwgNCIpOwkvKiBkcmFpbiB3cml0ZSBidWZmZXIgKi8KIAkJc2F2ZWRfbHByID0gc2RyYW1fc2VsZnJlZnJlc2hfZW5hYmxlKCk7CkBAIC01NSwzNCArNTcsMzggQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJaWRsZV90aW1lID0gKGFmdGVyLnR2X3NlYyAtIGJlZm9yZS50dl9zZWMpICogVVNFQ19QRVJfU0VDICsKIAkJCShhZnRlci50dl91c2VjIC0gYmVmb3JlLnR2X3VzZWMpOwotCXJldHVybiBpZGxlX3RpbWU7CisKKwlkZXYtPmxhc3RfcmVzaWRlbmN5ID0gaWRsZV90aW1lOworCXJldHVybiBpbmRleDsKIH0KIAogLyogSW5pdGlhbGl6ZSBDUFUgaWRsZSBieSByZWdpc3RlcmluZyB0aGUgaWRsZSBzdGF0ZXMgKi8KIHN0YXRpYyBpbnQgYXQ5MV9pbml0X2NwdWlkbGUodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldmljZTsKLQotCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZhdDkxX2lkbGVfZHJpdmVyKTsKKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRyaXZlciA9ICZhdDkxX2lkbGVfZHJpdmVyOwogCiAJZGV2aWNlID0gJnBlcl9jcHUoYXQ5MV9jcHVpZGxlX2RldmljZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlkZXZpY2UtPnN0YXRlX2NvdW50ID0gQVQ5MV9NQVhfU1RBVEVTOworCWRyaXZlci0+c3RhdGVfY291bnQgPSBBVDkxX01BWF9TVEFURVM7CiAKIAkvKiBXYWl0IGZvciBpbnRlcnJ1cHQgc3RhdGUgKi8KLQlkZXZpY2UtPnN0YXRlc1swXS5lbnRlciA9IGF0OTFfZW50ZXJfaWRsZTsKLQlkZXZpY2UtPnN0YXRlc1swXS5leGl0X2xhdGVuY3kgPSAxOwotCWRldmljZS0+c3RhdGVzWzBdLnRhcmdldF9yZXNpZGVuY3kgPSAxMDAwMDsKLQlkZXZpY2UtPnN0YXRlc1swXS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOwotCXN0cmNweShkZXZpY2UtPnN0YXRlc1swXS5uYW1lLCAiV0ZJIik7Ci0Jc3RyY3B5KGRldmljZS0+c3RhdGVzWzBdLmRlc2MsICJXYWl0IGZvciBpbnRlcnJ1cHQiKTsKKwlkcml2ZXItPnN0YXRlc1swXS5lbnRlciA9IGF0OTFfZW50ZXJfaWRsZTsKKwlkcml2ZXItPnN0YXRlc1swXS5leGl0X2xhdGVuY3kgPSAxOworCWRyaXZlci0+c3RhdGVzWzBdLnRhcmdldF9yZXNpZGVuY3kgPSAxMDAwMDsKKwlkcml2ZXItPnN0YXRlc1swXS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOworCXN0cmNweShkcml2ZXItPnN0YXRlc1swXS5uYW1lLCAiV0ZJIik7CisJc3RyY3B5KGRyaXZlci0+c3RhdGVzWzBdLmRlc2MsICJXYWl0IGZvciBpbnRlcnJ1cHQiKTsKIAogCS8qIFdhaXQgZm9yIGludGVycnVwdCBhbmQgUkFNIHNlbGYgcmVmcmVzaCBzdGF0ZSAqLwotCWRldmljZS0+c3RhdGVzWzFdLmVudGVyID0gYXQ5MV9lbnRlcl9pZGxlOwotCWRldmljZS0+c3RhdGVzWzFdLmV4aXRfbGF0ZW5jeSA9IDEwOwotCWRldmljZS0+c3RhdGVzWzFdLnRhcmdldF9yZXNpZGVuY3kgPSAxMDAwMDsKLQlkZXZpY2UtPnN0YXRlc1sxXS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOwotCXN0cmNweShkZXZpY2UtPnN0YXRlc1sxXS5uYW1lLCAiUkFNX1NSIik7Ci0Jc3RyY3B5KGRldmljZS0+c3RhdGVzWzFdLmRlc2MsICJXRkkgYW5kIFJBTSBTZWxmIFJlZnJlc2giKTsKKwlkcml2ZXItPnN0YXRlc1sxXS5lbnRlciA9IGF0OTFfZW50ZXJfaWRsZTsKKwlkcml2ZXItPnN0YXRlc1sxXS5leGl0X2xhdGVuY3kgPSAxMDsKKwlkcml2ZXItPnN0YXRlc1sxXS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwMDA7CisJZHJpdmVyLT5zdGF0ZXNbMV0uZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKKwlzdHJjcHkoZHJpdmVyLT5zdGF0ZXNbMV0ubmFtZSwgIlJBTV9TUiIpOworCXN0cmNweShkcml2ZXItPnN0YXRlc1sxXS5kZXNjLCAiV0ZJIGFuZCBSQU0gU2VsZiBSZWZyZXNoIik7CisKKwljcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigmYXQ5MV9pZGxlX2RyaXZlcik7CiAKIAlpZiAoY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UoZGV2aWNlKSkgewogCQlwcmludGsoS0VSTl9FUlIgImF0OTFfaW5pdF9jcHVpZGxlOiBGYWlsZWQgcmVnaXN0ZXJpbmdcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ncGlvLmMKaW5kZXggNDYxNTUyOC4uMjI0ZTllMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvZ3Bpby5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CkBAIC0yMiw5ICsyMyw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotCi0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOWc0NS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOWc0NS5oCmluZGV4IDJjNjExYjkuLjQwNmJiNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlnNDUuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05ZzQ1LmgKQEAgLTEyOCw4ICsxMjgsNiBAQAogI2RlZmluZSBBVDkxU0FNOUc0NV9FSENJX0JBU0UJMHgwMDgwMDAwMAkvKiBVU0IgSG9zdCBjb250cm9sbGVyIChFSENJKSAqLwogI2RlZmluZSBBVDkxU0FNOUc0NV9WREVDX0JBU0UJMHgwMDkwMDAwMAkvKiBWaWRlbyBEZWNvZGVyIENvbnRyb2xsZXIgKi8KIAotI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFCVNaXzRNCi0KIC8qCiAgKiBETUEgcGVyaXBoZXJhbCBpZGVudGlmaWVycwogICogZm9yIGhhcmR3YXJlIGhhbmRzaGFraW5nIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ib2FyZC5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ib2FyZC5oCmluZGV4IGVkNTQ0YTAuLmVhYzkyZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYm9hcmQuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmgKQEAgLTk4LDYgKzk4LDExIEBACiBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgewogCXU4CQlwb3J0czsJCS8qIG51bWJlciBvZiBwb3J0cyBvbiByb290IGh1YiAqLwogCXU4CQl2YnVzX3BpblsyXTsJLyogcG9ydCBwb3dlci1jb250cm9sIHBpbiAqLworCXU4ICAgICAgICAgICAgICB2YnVzX3Bpbl9pbnZlcnRlZDsKKwl1OCAgICAgICAgICAgICAgb3ZlcmN1cnJlbnRfc3VwcG9ydGVkOworCXU4ICAgICAgICAgICAgICBvdmVyY3VycmVudF9waW5bMl07CisJdTggICAgICAgICAgICAgIG92ZXJjdXJyZW50X3N0YXR1c1syXTsKKwl1OCAgICAgICAgICAgICAgb3ZlcmN1cnJlbnRfY2hhbmdlZFsyXTsKIH07CiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VzYmgoc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKTsKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdXNiaF9vaGNpKHN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqZGF0YSk7CkBAIC0xMTIsNyArMTE3LDggQEAKIAl1OAkJYWxlOwkJLyogYWRkcmVzcyBsaW5lIG51bWJlciBjb25uZWN0ZWQgdG8gQUxFICovCiAJdTgJCWNsZTsJCS8qIGFkZHJlc3MgbGluZSBudW1iZXIgY29ubmVjdGVkIHRvIENMRSAqLwogCXU4CQlidXNfd2lkdGhfMTY7CS8qIGJ1c3dpZHRoIGlzIDE2IGJpdCAqLwotCXN0cnVjdCBtdGRfcGFydGl0aW9uKiAoKnBhcnRpdGlvbl9pbmZvKShpbnQsIGludCopOworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKKwl1bnNpZ25lZCBpbnQJbnVtX3BhcnRzOwogfTsKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbmFuZChzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhICpkYXRhKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGJjMWUwYjIuLjBlZDg2NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX2RiZ3UuaD4KIAotCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCWxkcglccnAsID0oQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSkJQCBTeXN0ZW0gcGVyaXBoZXJhbHMgKHBoeXMgYWRkcmVzcykKIAlsZHIJXHJ2LCA9KEFUOTFfVkFfQkFTRV9TWVMJKyBBVDkxX0RCR1UpCUAgU3lzdGVtIHBlcmlwaGVyYWxzICh2aXJ0IGFkZHJlc3MpCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggMDU2ZGM2Ni4uMmI5YTFmNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTIxNCwxMSArMjE0LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgkJLyogY2Fuc2xlZXAgd3JhcHBlcnMgKi8KLQotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKIAogI2RlZmluZSBncGlvX3RvX2lycShncGlvKSAoZ3BpbykKICNkZWZpbmUgaXJxX3RvX2dwaW8oaXJxKSAgKGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvdGltZXguaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvdGltZXguaAppbmRleCAzMWFjMmQ5Li44NTgyMGFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL3RpbWV4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC90aW1leC5oCkBAIC02NCw3ICs2NCwxMiBAQAogCiAjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05RzIwKQogCisjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9VU0JfQTlHMjApCisjZGVmaW5lIEFUOTFTQU05X01BU1RFUl9DTE9DSwkxMzMwMDAwMDAKKyNlbHNlCiAjZGVmaW5lIEFUOTFTQU05X01BU1RFUl9DTE9DSwkxMzIwOTYwMDAKKyNlbmRpZgorCiAjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJKEFUOTFTQU05X01BU1RFUl9DTE9DSy8xNikKIAogI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOUc0NSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKaW5kZXggOGViNDU5Zi4uOGU0YTFiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKQEAgLTIxLDYgKzIxLDggQEAKICNpZm5kZWYgX19BU01fQVJDSF9WTUFMTE9DX0gKICNkZWZpbmUgX19BU01fQVJDSF9WTUFMTE9DX0gKIAorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKwogI2RlZmluZSBWTUFMTE9DX0VORAkJKEFUOTFfVklSVF9CQVNFICYgUEdESVJfTUFTSykKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvbGVkcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2xlZHMuYwppbmRleCAwNDE1YTgzOS4uOGRmYWZlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2xlZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvbGVkcy5jCkBAIC05LDEzICs5LDEzIEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KIAorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL3BtLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvcG0uYwppbmRleCA0MTU5ZWNhLi43MDQ2MTU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvcG0uYwpAQCAtMTAsNiArMTAsNyBAQAogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KQEAgLTI1LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvYXQ5MV9wbWMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2RtYS5jCmluZGV4IDBjYTAwMDUuLmI1MmI4ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvZG1hLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCBlZDc4YWFiLi42YWUyMGE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0yMiw3ICsyMiw2IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAogCiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KICNpbmNsdWRlIDxjZmdfZ2xvYmFsLmg+CiAjaW5jbHVkZSA8bWFjaC9jc3AvbW1faW8uaD4KIApAQCAtMzEsNyArMzAsNyBAQAogICogICpfU0laRSAgaXMgdGhlIHNpemUgb2YgdGhlIHJlZ2lvbgogICogICpfQkFTRSAgaXMgdGhlIHZpcnR1YWwgYWRkcmVzcwogICovCi0jZGVmaW5lIFJBTV9TVEFSVCAgICAgICAgICAgICAgIFBMQVRfUEhZU19PRkZTRVQKKyNkZWZpbmUgUkFNX1NUQVJUICAgICAgICAgICAgICAgUEhZU19PRkZTRVQKIAogI2RlZmluZSBSQU1fU0laRSAgICAgICAgICAgICAgICAoQ0ZHX0dMT0JBTF9SQU1fU0laRS1DRkdfR0xPQkFMX1JBTV9TSVpFX1JFU0VSVkVEKQogI2RlZmluZSBSQU1fQkFTRSAgICAgICAgICAgICAgICBQQUdFX09GRlNFVApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTYyZTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgMjAwNSAtIDIwMDggQnJvYWRjb20gQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCi0qIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdG8geW91Ci0qIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwICh0aGUgIkdQTCIpLgotKgotKiBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZSB0aGlzCi0qIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQgdW5kZXIgYQotKiBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbgotKiBjb25zZW50LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNpbmNsdWRlIDxjZmdfZ2xvYmFsLmg+Ci0KLS8qCi0gKiBQaHlzaWNhbCB2cyB2aXJ0dWFsIFJBTSBhZGRyZXNzIHNwYWNlIGNvbnZlcnNpb24uICBUaGVzZSBhcmUKLSAqIHByaXZhdGUgZGVmaW5pdGlvbnMgd2hpY2ggc2hvdWxkIE5PVCBiZSB1c2VkIG91dHNpZGUgbWVtb3J5LmgKLSAqIGZpbGVzLiAgVXNlIHZpcnRfdG9fcGh5cy9waHlzX3RvX3ZpcnQvX19wYS9fX3ZhIGluc3RlYWQuCi0gKi8KLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUIENGR19HTE9CQUxfUkFNX0JBU0UKLQotLyoKLSAqIE1heGltdW0gRE1BIG1lbW9yeSBhbGxvd2VkIGlzIDE0TQotICovCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUgKFNaXzE2TSAtIFNaXzJNKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9tbS5jIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL21tLmMKaW5kZXggMGYxYzM3ZS4uMWFkZWM3OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9tbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9tbS5jCkBAIC0xMyw2ICsxMyw4IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KQEAgLTUzLDQgKzU1LDYgQEAKIHsKIAogCWlvdGFibGVfaW5pdChiY21yaW5nX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYmNtcmluZ19pb19kZXNjKSk7CisJLyogTWF4aW11bSBETUEgbWVtb3J5IGFsbG93ZWQgaXMgMTRNICovCisJaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKDE0IDw8IDIwKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYXV0Y3B1MTIuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYXV0Y3B1MTIuYwppbmRleCA0YTc0YjJjOS4uMDI3NjA5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYXV0Y3B1MTIuYwpAQCAtNjQsNyArNjQsNyBAQAogCiBNQUNISU5FX1NUQVJUKEFVVENQVTEyLCAiYXV0cm9uaXggYXV0Y3B1MTIiKQogCS8qIE1haW50YWluZXI6IFRob21hcyBHbGVpeG5lciAqLwotCS5ib290X3BhcmFtcwk9IDB4YzAwMjAwMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgyMDAwMCwKIAkubWFwX2lvCQk9IGF1dGNwdTEyX21hcF9pbywKIAkuaW5pdF9pcnEJPSBjbHBzNzExeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmNscHM3MTF4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jCmluZGV4IDVhMTY4OWQuLjI1YjNiZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2RiODk3MTIuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAogTUFDSElORV9TVEFSVChDREI4OTcxMiwgIkNpcnJ1cy1DREI4OTcxMiIpCiAJLyogTWFpbnRhaW5lcjogUmF5IExlaHRpbmllbWkgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gY2RiODk3MTJfbWFwX2lvLAogCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NlaXZhLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NlaXZhLmMKaW5kZXggMTY0ODFjZi4uMWRmOWVjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZWl2YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2VpdmEuYwpAQCAtNTYsNyArNTYsNyBAQAogCiBNQUNISU5FX1NUQVJUKENFSVZBLCAiQ0VJVkEvUG9sYXJvaWQgUGhvdG8gTUFYIERpZ2l0YWwgUGljdHVyZSBGcmFtZSIpCiAJLyogTWFpbnRhaW5lcjogUm9iIFNjb3R0ICovCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGNlaXZhX21hcF9pbywKIAkuaW5pdF9pcnEJPSBjbHBzNzExeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmNscHM3MTF4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jbGVwNzMxMi5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jbGVwNzMxMi5jCmluZGV4IDBhMmU3NGYuLjgwNDk2YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogTUFDSElORV9TVEFSVChDTEVQNzIxMiwgIkNpcnJ1cyBMb2dpYyA3MjEyLzczMTIiKQogCS8qIE1haW50YWluZXI6IE5vYm9keSAqLwotCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgwMTAwLAogCS5maXh1cAkJPSBmaXh1cF9jbGVwNzMxMiwKIAkubWFwX2lvCQk9IGNscHM3MTF4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBjbHBzNzExeF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1hcmNoLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtYXJjaC5jCmluZGV4IDcyNWE3YTUuLjk3MjFmNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1hcmNoLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYwpAQCAtNTYsNyArNTYsNyBAQAogCiBNQUNISU5FX1NUQVJUKEVEQjcyMTEsICJDTC1FREI3MjExIChFUDcyMTEgZXZhbCBib2FyZCkiKQogCS8qIE1haW50YWluZXI6IEpvbiBNY0NsaW50b2NrICovCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAyMDEwMCwJLyogMHhjMDAwMDAwMCAtIDB4YzAwMWZmZmYgY2FuIGJlIHZpZGVvIFJBTSAqLworCS5hdGFnX29mZnNldAk9IDB4MjAxMDAsCS8qIDB4YzAwMDAwMDAgLSAweGMwMDFmZmZmIGNhbiBiZSB2aWRlbyBSQU0gKi8KIAkuZml4dXAJCT0gZml4dXBfZWRiNzIxMSwKIAkubWFwX2lvCQk9IGVkYjcyMTFfbWFwX2lvLAogCS5yZXNlcnZlCT0gZWRiNzIxMV9yZXNlcnZlLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCmluZGV4IDE5NDdiMzAuLmQ5OTI1NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKQEAgLTc0LDcgKzc0LDYgQEAKIAogTUFDSElORV9TVEFSVChGT1JUVU5FVCwgIkFSTS1Gb3J0dU5ldCIpCiAJLyogTWFpbnRhaW5lcjogRm9ydHVOZXQgSW5jLiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAwMDAsCiAJLmZpeHVwCQk9IGZvcnR1bmV0X2ZpeHVwLAogCS5tYXBfaW8JCT0gY2xwczcxMXhfbWFwX2lvLAogCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggNTA3YzY4Ny4uYjgwMmU4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKICNpZm5kZWYgQ09ORklHX0RFQlVHX0NMUFM3MTFYX1VBUlQyCiAJCW1vdglccnAsICMweDAwMDAJQCBVQVJUMQogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYwppbmRleCAzZjc5NmUwLi42ZWNlYTk1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYwpAQCAtODgsNyArODgsNyBAQAogCiBNQUNISU5FX1NUQVJUKFA3MjBULCAiQVJNLVByb3NwZWN0b3I3MjBUIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuZml4dXAJCT0gZml4dXBfcDcyMHQsCiAJLm1hcF9pbwkJPSBwNzIwdF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvY25zMzQyMHZiLmMgYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvY25zMzQyMHZiLmMKaW5kZXggM2U3ZDE0OS4uNTVmN2I0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2NuczM0MjB2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9jbnMzNDIwdmIuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ05TMzQyMFZCLCAiQ2F2aXVtIE5ldHdvcmtzIENOUzM0MjAgVmFsaWRhdGlvbiBCb2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGNuczM0MjBfbWFwX2lvLAogCS5pbml0X2lycQk9IGNuczN4eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjbnMzeHh4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDU2ZDgyODYuLmQwNGMxNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTEwLDcgKzEwLDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LHJwLHJ2CisJCS5tYWNybwlhZGRydWFydCxycCxydix0bXAKIAkJbW92CVxycCwgIzB4MDAwMDkwMDAKIAkJb3JyCVxydiwgXHJwLCAjMHhmMDAwMDAwMAlAIHZpcnR1YWwgYmFzZQogCQlvcnIJXHJwLCBccnAsICMweDEwMDAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxNmM1Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIEFSTSBMaW1pdGVkCi0gKiBDb3B5cmlnaHQgMjAwOCBDYXZpdW0gTmV0d29ya3MKLSAqCi0gKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19NQUNIX01FTU9SWV9ICi0KLS8qCi0gKiBQaHlzaWNhbCBEUkFNIG9mZnNldC4KLSAqLwotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDAwMDAwMDAwKQotCi0jZGVmaW5lIF9fcGh5c190b19idXMoeCkJKCh4KSArIFBIWVNfT0ZGU0VUKQotI2RlZmluZSBfX2J1c190b19waHlzKHgpCSgoeCkgLSBQSFlTX09GRlNFVCkKLQotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHYpCV9fcGh5c190b19idXMoX192aXJ0X3RvX3BoeXModikpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoYikJX19waHlzX3RvX3ZpcnQoX19idXNfdG9fcGh5cyhiKSkKLSNkZWZpbmUgX19wZm5fdG9fYnVzKHApCQlfX3BoeXNfdG9fYnVzKF9fcGZuX3RvX3BoeXMocCkpCi0jZGVmaW5lIF9fYnVzX3RvX3BmbihiKQkJX19waHlzX3RvX3BmbihfX2J1c190b19waHlzKGIpKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL0tjb25maWcKaW5kZXggYzBkZWFjYS4uMzJkODM3ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL0tjb25maWcKQEAgLTE5Miw2ICsxOTIsMTYgQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBEQTg1MF9XTDEyWFgKKwlib29sICJBTTE4eCB3bDEyNzEgZGF1Z2h0ZXIgYm9hcmQiCisJZGVwZW5kcyBvbiBNQUNIX0RBVklOQ0lfREE4NTBfRVZNCisJaGVscAorCSAgVGhlIHdsMTI3MSBkYXVnaHRlciBjYXJkIGZvciBBTTE4eCBFVk1zIGlzIGEgY29tYm8gd2lyZWxlc3MKKwkgIGNvbm5lY3Rpdml0eSBhZGQtb24gY2FyZCwgYmFzZWQgb24gdGhlIExTIFJlc2VhcmNoIFRpV2kgbW9kdWxlIHdpdGgKKwkgIFRleGFzIEluc3RydW1lbnRzJyB3bDEyNzEgc29sdXRpb24uCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byB1c2UgYSB3bDEyNzEgZXhwYW5zaW9uIGNhcmQgY29ubmVjdGVkIHRvIHRoZQorCSAgQU0xOHggRVZNLgorCiBjb25maWcgR1BJT19QQ0E5NTNYCiAJZGVmYXVsdCBNQUNIX0RBVklOQ0lfREE4NTBfRVZNCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9NYWtlZmlsZQppbmRleCAwYjg3YTFjLi40OTVlMzEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogCiAjIENvbW1vbiBvYmplY3RzCiBvYmoteSAJCQk6PSB0aW1lLm8gY2xvY2subyBzZXJpYWwubyBpby5vIHBzYy5vIFwKLQkJCSAgIGdwaW8ubyBkbWEubyB1c2IubyBjb21tb24ubyBzcmFtLm8gYWVtaWYubworCQkJICAgZG1hLm8gdXNiLm8gY29tbW9uLm8gc3JhbS5vIGFlbWlmLm8KIAogb2JqLSQoQ09ORklHX0RBVklOQ0lfTVVYKQkJKz0gbXV4Lm8KIApAQCAtMTcsNyArMTcsNiBAQAogb2JqLSQoQ09ORklHX0FSQ0hfREFWSU5DSV9EQTgzMCkgICAgICAgICs9IGRhODMwLm8gZGV2aWNlcy1kYTh4eC5vCiBvYmotJChDT05GSUdfQVJDSF9EQVZJTkNJX0RBODUwKSAgICAgICAgKz0gZGE4NTAubyBkZXZpY2VzLWRhOHh4Lm8KIG9iai0kKENPTkZJR19BUkNIX0RBVklOQ0lfVE5FVFYxMDdYKSAgICArPSB0bmV0djEwN3gubyBkZXZpY2VzLXRuZXR2MTA3eC5vCi1vYmotJChDT05GSUdfQVJDSF9EQVZJTkNJX1RORVRWMTA3WCkgICAgKz0gZ3Bpby10bmV0djEwN3gubwogCiBvYmotJChDT05GSUdfQUlOVEMpCQkJKz0gaXJxLm8KIG9iai0kKENPTkZJR19DUF9JTlRDKQkJCSs9IGNwX2ludGMubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODMwLWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODMwLWV2bS5jCmluZGV4IDg0ZmQ3ODYuLjExYzNkYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTgzMC1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4MzAtZXZtLmMKQEAgLTM3Nyw3ICszNzcsNyBAQAogCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoZGE4MzBfZXZtX25hbmRfcGFydGl0aW9ucyksCiAJLmVjY19tb2RlCT0gTkFORF9FQ0NfSFcsCiAJLmVjY19iaXRzCT0gNCwKLQkub3B0aW9ucwk9IE5BTkRfVVNFX0ZMQVNIX0JCVCwKKwkuYmJ0X29wdGlvbnMJPSBOQU5EX0JCVF9VU0VfRkxBU0gsCiAJLmJidF90ZAkJPSAmZGE4MzBfZXZtX25hbmRfYmJ0X21haW5fZGVzY3IsCiAJLmJidF9tZAkJPSAmZGE4MzBfZXZtX25hbmRfYmJ0X21pcnJvcl9kZXNjciwKIAkudGltaW5nICAgICAgICAgPSAmZGE4MzBfZXZtX25hbmRmbGFzaF90aW1pbmcsCkBAIC02NzYsNyArNjc2LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChEQVZJTkNJX0RBODMwX0VWTSwgIkRhVmluY2kgREE4MzAvT01BUC1MMTM3L0FNMTd4IEVWTSIpCi0JLmJvb3RfcGFyYW1zCT0gKERBOFhYX0REUl9CQVNFICsgMHgxMDApLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZGE4MzBfZXZtX21hcF9pbywKIAkuaW5pdF9pcnEJPSBjcF9pbnRjX2luaXQsCiAJLnRpbWVyCQk9ICZkYXZpbmNpX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODUwLWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODUwLWV2bS5jCmluZGV4IDAwOGQ1MTQuLjFkN2QyNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTg1MC1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4NTAtZXZtLmMKQEAgLTMxLDYgKzMxLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC90cHM2NTA3eC10cy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dsMTJ4eC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC00OSw2ICs1MSw5IEBACiAjZGVmaW5lIERBODUwX01NQ1NEX0NEX1BJTgkJR1BJT19UT19QSU4oNCwgMCkKICNkZWZpbmUgREE4NTBfTU1DU0RfV1BfUElOCQlHUElPX1RPX1BJTig0LCAxKQogCisjZGVmaW5lIERBODUwX1dMQU5fRU4JCQlHUElPX1RPX1BJTig2LCA5KQorI2RlZmluZSBEQTg1MF9XTEFOX0lSUQkJCUdQSU9fVE9fUElOKDYsIDEwKQorCiAjZGVmaW5lIERBODUwX01JSV9NRElPX0NMS0VOX1BJTglHUElPX1RPX1BJTigyLCA2KQogCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZGE4NTBldm1fc3BpZmxhc2hfcGFydFtdID0gewpAQCAtMjUxLDcgKzI1Niw3IEBACiAJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShkYTg1MF9ldm1fbmFuZGZsYXNoX3BhcnRpdGlvbiksCiAJLmVjY19tb2RlCT0gTkFORF9FQ0NfSFcsCiAJLmVjY19iaXRzCT0gNCwKLQkub3B0aW9ucwk9IE5BTkRfVVNFX0ZMQVNIX0JCVCwKKwkuYmJ0X29wdGlvbnMJPSBOQU5EX0JCVF9VU0VfRkxBU0gsCiAJLnRpbWluZwkJPSAmZGE4NTBfZXZtX25hbmRmbGFzaF90aW1pbmcsCiB9OwogCkBAIC0xMTQzLDYgKzExNDgsMTEwIEBACiBzdGF0aWMgX19pbml0IGludCBkYTg1MF9ldm1faW5pdF9jcHVmcmVxKHZvaWQpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0RBODUwX1dMMTJYWAorCitzdGF0aWMgdm9pZCB3bDEyeHhfc2V0X3Bvd2VyKGludCBpbmRleCwgYm9vbCBwb3dlcl9vbikKK3sKKwlzdGF0aWMgYm9vbCBwb3dlcl9zdGF0ZTsKKworCXByX2RlYnVnKCJQb3dlcmluZyAlcyB3bDEyeHgiLCBwb3dlcl9vbiA/ICJvbiIgOiAib2ZmIik7CisKKwlpZiAocG93ZXJfb24gPT0gcG93ZXJfc3RhdGUpCisJCXJldHVybjsKKwlwb3dlcl9zdGF0ZSA9IHBvd2VyX29uOworCisJaWYgKHBvd2VyX29uKSB7CisJCS8qIFBvd2VyIHVwIHNlcXVlbmNlIHJlcXVpcmVkIGZvciB3bDEyN3ggZGV2aWNlcyAqLworCQlncGlvX3NldF92YWx1ZShEQTg1MF9XTEFOX0VOLCAxKTsKKwkJdXNsZWVwX3JhbmdlKDE1MDAwLCAxNTAwMCk7CisJCWdwaW9fc2V0X3ZhbHVlKERBODUwX1dMQU5fRU4sIDApOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CisJCWdwaW9fc2V0X3ZhbHVlKERBODUwX1dMQU5fRU4sIDEpOworCQltc2xlZXAoNzApOworCX0gZWxzZSB7CisJCWdwaW9fc2V0X3ZhbHVlKERBODUwX1dMQU5fRU4sIDApOworCX0KK30KKworc3RhdGljIHN0cnVjdCBkYXZpbmNpX21tY19jb25maWcgZGE4NTBfd2wxMnh4X21tY19jb25maWcgPSB7CisJLnNldF9wb3dlcgk9IHdsMTJ4eF9zZXRfcG93ZXIsCisJLndpcmVzCQk9IDQsCisJLm1heF9mcmVxCT0gMjUwMDAwMDAsCisJLmNhcHMJCT0gTU1DX0NBUF80X0JJVF9EQVRBIHwgTU1DX0NBUF9OT05SRU1PVkFCTEUgfAorCQkJICBNTUNfQ0FQX1BPV0VSX09GRl9DQVJELAorCS52ZXJzaW9uCT0gTU1DX0NUTFJfVkVSU0lPTl8yLAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IGRhODUwX3dsMTJ4eF9waW5zW10gX19pbml0Y29uc3QgPSB7CisJREE4NTBfTU1DU0QxX0RBVF8wLCBEQTg1MF9NTUNTRDFfREFUXzEsIERBODUwX01NQ1NEMV9EQVRfMiwKKwlEQTg1MF9NTUNTRDFfREFUXzMsIERBODUwX01NQ1NEMV9DTEssIERBODUwX01NQ1NEMV9DTUQsCisJREE4NTBfR1BJTzZfOSwgREE4NTBfR1BJTzZfMTAsCisJLTEKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2wxMnh4X3BsYXRmb3JtX2RhdGEgZGE4NTBfd2wxMnh4X3dsYW5fZGF0YSBfX2luaXRkYXRhID0geworCS5pcnEJCQk9IC0xLAorCS5ib2FyZF9yZWZfY2xvY2sJPSBXTDEyWFhfUkVGQ0xPQ0tfMzgsCisJLnBsYXRmb3JtX3F1aXJrcwk9IFdMMTJYWF9QTEFURk9STV9RVUlSS19FREdFX0lSUSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGRhODUwX3dsMTJ4eF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGRhdmluY2lfY2ZnX3JlZ19saXN0KGRhODUwX3dsMTJ4eF9waW5zKTsKKwlpZiAocmV0KSB7CisJCXByX2Vycigid2wxMnh4L21tYyBtdXggc2V0dXAgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCXJldCA9IGRhODUwX3JlZ2lzdGVyX21tY3NkMSgmZGE4NTBfd2wxMnh4X21tY19jb25maWcpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJ3bDEyeHgvbW1jIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShEQTg1MF9XTEFOX0VOLCBHUElPRl9PVVRfSU5JVF9MT1csICJ3bDEyeHhfZW4iKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiQ291bGQgbm90IHJlcXVlc3Qgd2wxMnh4IGVuYWJsZSBncGlvOiAlZFxuIiwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoREE4NTBfV0xBTl9JUlEsIEdQSU9GX0lOLCAid2wxMnh4X2lycSIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgcmVxdWVzdCB3bDEyeHggaXJxIGdwaW86ICVkXG4iLCByZXQpOworCQlnb3RvIGZyZWVfd2xhbl9lbjsKKwl9CisKKwlkYTg1MF93bDEyeHhfd2xhbl9kYXRhLmlycSA9IGdwaW9fdG9faXJxKERBODUwX1dMQU5fSVJRKTsKKworCXJldCA9IHdsMTJ4eF9zZXRfcGxhdGZvcm1fZGF0YSgmZGE4NTBfd2wxMnh4X3dsYW5fZGF0YSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBzZXQgd2wxMnh4IGRhdGE6ICVkXG4iLCByZXQpOworCQlnb3RvIGZyZWVfd2xhbl9pcnE7CisJfQorCisJcmV0dXJuIDA7CisKK2ZyZWVfd2xhbl9pcnE6CisJZ3Bpb19mcmVlKERBODUwX1dMQU5fSVJRKTsKKworZnJlZV93bGFuX2VuOgorCWdwaW9fZnJlZShEQTg1MF9XTEFOX0VOKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisjZWxzZSAvKiBDT05GSUdfREE4NTBfV0wxMlhYICovCisKK3N0YXRpYyBfX2luaXQgaW50IGRhODUwX3dsMTJ4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfREE4NTBfV0wxMlhYICovCisKICNkZWZpbmUgREE4NTBFVk1fU0FUQV9SRUZDTEtQTl9SQVRFCSgxMDAgKiAxMDAwICogMTAwMCkKIAogc3RhdGljIF9faW5pdCB2b2lkIGRhODUwX2V2bV9pbml0KHZvaWQpCkBAIC0xMTk3LDYgKzEzMDYsMTEgQEAKIAkJaWYgKHJldCkKIAkJCXByX3dhcm5pbmcoImRhODUwX2V2bV9pbml0OiBtbWNzZDAgcmVnaXN0cmF0aW9uIGZhaWxlZDoiCiAJCQkJCSIgJWRcbiIsIHJldCk7CisKKwkJcmV0ID0gZGE4NTBfd2wxMnh4X2luaXQoKTsKKwkJaWYgKHJldCkKKwkJCXByX3dhcm5pbmcoImRhODUwX2V2bV9pbml0OiB3bDEyeHggaW5pdGlhbGl6YXRpb24iCisJCQkJICAgIiBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCX0KIAogCWRhdmluY2lfc2VyaWFsX2luaXQoJmRhODUwX2V2bV91YXJ0X2NvbmZpZyk7CkBAIC0xMjkxLDcgKzE0MDUsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKERBVklOQ0lfREE4NTBfRVZNLCAiRGFWaW5jaSBEQTg1MC9PTUFQLUwxMzgvQU0xOHggRVZNIikKLQkuYm9vdF9wYXJhbXMJPSAoREE4WFhfRERSX0JBU0UgKyAweDEwMCksCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBkYTg1MF9ldm1fbWFwX2lvLAogCS5pbml0X2lycQk9IGNwX2ludGNfaW5pdCwKIAkudGltZXIJCT0gJmRhdmluY2lfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtZXZtLmMKaW5kZXggMjQxYTZiZC4uNGUwZTcwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1ldm0uYwpAQCAtNzcsNyArNzcsNyBAQAogCS5wYXJ0cwkJCT0gZGF2aW5jaV9uYW5kX3BhcnRpdGlvbnMsCiAJLm5yX3BhcnRzCQk9IEFSUkFZX1NJWkUoZGF2aW5jaV9uYW5kX3BhcnRpdGlvbnMpLAogCS5lY2NfbW9kZQkJPSBOQU5EX0VDQ19IVywKLQkub3B0aW9ucwkJPSBOQU5EX1VTRV9GTEFTSF9CQlQsCisJLmJidF9vcHRpb25zCQk9IE5BTkRfQkJUX1VTRV9GTEFTSCwKIAkuZWNjX2JpdHMJCT0gNCwKIH07CiAKQEAgLTM1MSw3ICszNTEsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKERBVklOQ0lfRE0zNTVfRVZNLCAiRGFWaW5jaSBETTM1NSBFVk0iKQotCS5ib290X3BhcmFtcyAgPSAoMHg4MDAwMDEwMCksCisJLmF0YWdfb2Zmc2V0ICA9IDB4MTAwLAogCS5tYXBfaW8JICAgICAgPSBkbTM1NV9ldm1fbWFwX2lvLAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lcgkgICAgICA9ICZkYXZpbmNpX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWxlb3BhcmQuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1sZW9wYXJkLmMKaW5kZXggYmVlMjg0Yy4uZmYyZDI0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWxlb3BhcmQuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtbGVvcGFyZC5jCkBAIC03NCw3ICs3NCw3IEBACiAJLnBhcnRzCQkJPSBkYXZpbmNpX25hbmRfcGFydGl0aW9ucywKIAkubnJfcGFydHMJCT0gQVJSQVlfU0laRShkYXZpbmNpX25hbmRfcGFydGl0aW9ucyksCiAJLmVjY19tb2RlCQk9IE5BTkRfRUNDX0hXX1NZTkRST01FLAotCS5vcHRpb25zCQk9IE5BTkRfVVNFX0ZMQVNIX0JCVCwKKwkuYmJ0X29wdGlvbnMJCT0gTkFORF9CQlRfVVNFX0ZMQVNILAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXZpbmNpX25hbmRfcmVzb3VyY2VzW10gPSB7CkBAIC0yNzAsNyArMjcwLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChETTM1NV9MRU9QQVJELCAiRGFWaW5jaSBETTM1NSBsZW9wYXJkIikKLQkuYm9vdF9wYXJhbXMgID0gKDB4ODAwMDAxMDApLAorCS5hdGFnX29mZnNldCAgPSAweDEwMCwKIAkubWFwX2lvCSAgICAgID0gZG0zNTVfbGVvcGFyZF9tYXBfaW8sCiAJLmluaXRfaXJxICAgICA9IGRhdmluY2lfaXJxX2luaXQsCiAJLnRpbWVyCSAgICAgID0gJmRhdmluY2lfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMKaW5kZXggOTgxOGYyMS4uMTkxOGFlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM2NS1ldm0uYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJLnBhcnRzCQkJPSBkYXZpbmNpX25hbmRfcGFydGl0aW9ucywKIAkubnJfcGFydHMJCT0gQVJSQVlfU0laRShkYXZpbmNpX25hbmRfcGFydGl0aW9ucyksCiAJLmVjY19tb2RlCQk9IE5BTkRfRUNDX0hXLAotCS5vcHRpb25zCQk9IE5BTkRfVVNFX0ZMQVNIX0JCVCwKKwkuYmJ0X29wdGlvbnMJCT0gTkFORF9CQlRfVVNFX0ZMQVNILAogCS5lY2NfYml0cwkJPSA0LAogfTsKIApAQCAtNjEyLDcgKzYxMiw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoREFWSU5DSV9ETTM2NV9FVk0sICJEYVZpbmNpIERNMzY1IEVWTSIpCi0JLmJvb3RfcGFyYW1zCT0gKDB4ODAwMDAxMDApLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZG0zNjVfZXZtX21hcF9pbywKIAkuaW5pdF9pcnEJPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lcgkJPSAmZGF2aW5jaV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NHgtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDR4LWV2bS5jCmluZGV4IDk1NjA3YTEuLjBjZjhhYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NHgtZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ0eC1ldm0uYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdHZwNTE0eC5oPgogCkBAIC0xNTAsNyArMTUxLDcgQEAKIAkucGFydHMJCT0gZGF2aW5jaV9ldm1fbmFuZGZsYXNoX3BhcnRpdGlvbiwKIAkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGRhdmluY2lfZXZtX25hbmRmbGFzaF9wYXJ0aXRpb24pLAogCS5lY2NfbW9kZQk9IE5BTkRfRUNDX0hXLAotCS5vcHRpb25zCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCS5iYnRfb3B0aW9ucwk9IE5BTkRfQkJUX1VTRV9GTEFTSCwKIAkudGltaW5nCQk9ICZkYXZpbmNpX2V2bV9uYW5kZmxhc2hfdGltaW5nLAogfTsKIApAQCAtNzEyLDcgKzcxMyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoREFWSU5DSV9FVk0sICJEYVZpbmNpIERNNjQ0eCBFVk0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUgPHNvdXJjZUBtdmlzdGEuY29tPiAqLwotCS5ib290X3BhcmFtcyAgPSAoREFWSU5DSV9ERFJfQkFTRSArIDB4MTAwKSwKKwkuYXRhZ19vZmZzZXQgID0gMHgxMDAsCiAJLm1hcF9pbwkgICAgICA9IGRhdmluY2lfZXZtX21hcF9pbywKIAkuaW5pdF9pcnEgICAgID0gZGF2aW5jaV9pcnFfaW5pdCwKIAkudGltZXIJICAgICAgPSAmZGF2aW5jaV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NngtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDZ4LWV2bS5jCmluZGV4IDk5M2EzMTQ2Li5lNTc0ZDdmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ2eC1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDZ4LWV2bS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC03OTIsNyArNzkzLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChEQVZJTkNJX0RNNjQ2N19FVk0sICJEYVZpbmNpIERNNjQ2eCBFVk0iKQotCS5ib290X3BhcmFtcyAgPSAoMHg4MDAwMDEwMCksCisJLmF0YWdfb2Zmc2V0ICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgPSBkYXZpbmNpX21hcF9pbywKIAkuaW5pdF9pcnEgICAgID0gZGF2aW5jaV9pcnFfaW5pdCwKIAkudGltZXIgICAgICAgID0gJmRhdmluY2lfdGltZXIsCkBAIC04MDEsNyArODAyLDcgQEAKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoREFWSU5DSV9ETTY0NjdURVZNLCAiRGFWaW5jaSBETTY0NjdUIEVWTSIpCi0JLmJvb3RfcGFyYW1zICA9ICgweDgwMDAwMTAwKSwKKwkuYXRhZ19vZmZzZXQgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICA9IGRhdmluY2lfbWFwX2lvLAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lciAgICAgICAgPSAmZGF2aW5jaV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1taXR5b21hcGwxMzguYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1taXR5b21hcGwxMzguYwppbmRleCBjMjc4MjI2Li4zY2ZmZjU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtbWl0eW9tYXBsMTM4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW1pdHlvbWFwbDEzOC5jCkBAIC0zOTYsNyArMzk2LDggQEAKIAkucGFydHMJCT0gbWl0eW9tYXBsMTM4X25hbmRmbGFzaF9wYXJ0aXRpb24sCiAJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShtaXR5b21hcGwxMzhfbmFuZGZsYXNoX3BhcnRpdGlvbiksCiAJLmVjY19tb2RlCT0gTkFORF9FQ0NfSFcsCi0JLm9wdGlvbnMJPSBOQU5EX1VTRV9GTEFTSF9CQlQgfCBOQU5EX0JVU1dJRFRIXzE2LAorCS5iYnRfb3B0aW9ucwk9IE5BTkRfQkJUX1VTRV9GTEFTSCwKKwkub3B0aW9ucwk9IE5BTkRfQlVTV0lEVEhfMTYsCiAJLmVjY19iaXRzCT0gMSwgLyogNCBiaXQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHdpdGggMTYgYml0IE5BTkQgKi8KIH07CiAKQEAgLTU2Niw3ICs1NjcsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKE1JVFlPTUFQTDEzOCwgIk1pdHlEU1AtTDEzOC9NaXR5QVJNLTE4MDgiKQotCS5ib290X3BhcmFtcwk9IChEQThYWF9ERFJfQkFTRSArIDB4MTAwKSwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG1pdHlvbWFwbDEzOF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gY3BfaW50Y19pbml0LAogCS50aW1lcgkJPSAmZGF2aW5jaV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1uZXVyb3Mtb3NkMi5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW5ldXJvcy1vc2QyLmMKaW5kZXggZDYwYTgwMC4uZTVmMjMxYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW5ldXJvcy1vc2QyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW5ldXJvcy1vc2QyLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAkucGFydHMJCT0gZGF2aW5jaV9udG9zZDJfbmFuZGZsYXNoX3BhcnRpdGlvbiwKIAkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGRhdmluY2lfbnRvc2QyX25hbmRmbGFzaF9wYXJ0aXRpb24pLAogCS5lY2NfbW9kZQk9IE5BTkRfRUNDX0hXLAotCS5vcHRpb25zCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCS5iYnRfb3B0aW9ucwk9IE5BTkRfQkJUX1VTRV9GTEFTSCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGF2aW5jaV9udG9zZDJfbmFuZGZsYXNoX3Jlc291cmNlW10gPSB7CkBAIC0yNzIsNyArMjcyLDcgQEAKIAogTUFDSElORV9TVEFSVChORVVST1NfT1NEMiwgIk5ldXJvcyBPU0QyIikKIAkvKiBNYWludGFpbmVyOiBOZXVyb3MgVGVjaG5vbG9naWVzIDxuZXVyb3NAZ3JvdXBzLmdvb2dsZS5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gKERBVklOQ0lfRERSX0JBU0UgKyAweDEwMCksCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJID0gZGF2aW5jaV9udG9zZDJfbWFwX2lvLAogCS5pbml0X2lycQk9IGRhdmluY2lfaXJxX2luaXQsCiAJLnRpbWVyCQk9ICZkYXZpbmNpX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW9tYXBsMTM4LWhhd2suYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1vbWFwbDEzOC1oYXdrLmMKaW5kZXggMjM3MzMyYS4uYzY3MDFlNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW9tYXBsMTM4LWhhd2suYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtb21hcGwxMzgtaGF3ay5jCkBAIC0zMzgsNyArMzM4LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChPTUFQTDEzOF9IQVdLQk9BUkQsICJBTTE4eC9PTUFQLUwxMzggSGF3a2JvYXJkIikKLQkuYm9vdF9wYXJhbXMJPSAoREE4WFhfRERSX0JBU0UgKyAweDEwMCksCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBvbWFwbDEzOF9oYXdrX21hcF9pbywKIAkuaW5pdF9pcnEJPSBjcF9pbnRjX2luaXQsCiAJLnRpbWVyCQk9ICZkYXZpbmNpX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXNmZnNkci5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXNmZnNkci5jCmluZGV4IDVmNDM4NWMuLjVkZDRkYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1zZmZzZHIuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtc2Zmc2RyLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNGRlNEUiwgIkx5cnRlY2ggU0ZGU0RSIikKIAkvKiBNYWludGFpbmVyOiBIdWdvIFZpbGxlbmV1dmUgaHVnby52aWxsZW5ldXZlQGx5cnRlY2guY29tICovCi0JLmJvb3RfcGFyYW1zICA9IChEQVZJTkNJX0REUl9CQVNFICsgMHgxMDApLAorCS5hdGFnX29mZnNldCAgPSAweDEwMCwKIAkubWFwX2lvCSAgICAgID0gZGF2aW5jaV9zZmZzZHJfbWFwX2lvLAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lcgkgICAgICA9ICZkYXZpbmNpX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXRuZXR2MTA3eC1ldm0uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC10bmV0djEwN3gtZXZtLmMKaW5kZXggNzgyODkyMC4uZjY5ZTQwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXRuZXR2MTA3eC1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtdG5ldHYxMDd4LWV2bS5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAkucGFydHMJCT0gbmFuZF9wYXJ0aXRpb25zLAogCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUobmFuZF9wYXJ0aXRpb25zKSwKIAkuZWNjX21vZGUJPSBOQU5EX0VDQ19IVywKLQkub3B0aW9ucwk9IE5BTkRfVVNFX0ZMQVNIX0JCVCwKKwkuYmJ0X29wdGlvbnMJPSBOQU5EX0JCVF9VU0VfRkxBU0gsCiAJLmVjY19iaXRzCT0gMSwKIH07CiAKQEAgLTI3Nyw3ICsyNzcsNyBAQAogI2VuZGlmCiAKIE1BQ0hJTkVfU1RBUlQoVE5FVFYxMDdYLCAiVE5FVFYxMDdYIEVWTSIpCi0JLmJvb3RfcGFyYW1zCT0gKFRORVRWMTA3WF9ERFJfQkFTRSArIDB4MTAwKSwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHRuZXR2MTA3eF9pbml0LAogCS5pbml0X2lycQk9IGNwX2ludGNfaW5pdCwKIAkudGltZXIJCT0gJmRhdmluY2lfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2RjZTk0OS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NkY2U5NDkuYwppbmRleCBiYThiMTJiLi5mMjIzMmNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2RjZTk0OS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jZGNlOTQ5LmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL2NkY2U5NDkuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jb21tb24uYwppbmRleCAxZDI1NTczLi44NjVmZmU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NvbW1vbi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RhdmluY2lfZW1hYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC04Niw2ICs4Nyw4IEBACiAJCWlvdGFibGVfaW5pdChkYXZpbmNpX3NvY19pbmZvLmlvX2Rlc2MsCiAJCQkJZGF2aW5jaV9zb2NfaW5mby5pb19kZXNjX251bSk7CiAKKwlpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoMTQgPDwgMjApOworCiAJLyoKIAkgKiBOb3JtYWxseSBkZXZpY2VtYXBzX2luaXQoKSB3b3VsZCBmbHVzaCBjYWNoZXMgYW5kIHRsYiBhZnRlcgogCSAqIG1kZXNjLT5tYXBfaW8oKSwgYnV0IHdlIG11c3QgYWxzbyBkbyBpdCBoZXJlIGJlY2F1c2Ugb2YgdGhlIENQVQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwdWZyZXEuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVmcmVxLmMKaW5kZXggNDE2NjllYy4uNWJiYTcwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwdWZyZXEuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1ZnJlcS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHVmcmVxLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1aWRsZS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwdWlkbGUuYwppbmRleCBiZDU5ZjMxLi5hMzBjN2M1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1aWRsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVpZGxlLmMKQEAgLTE2LDEwICsxNiwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogCiAjaW5jbHVkZSA8bWFjaC9jcHVpZGxlLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KKyNpbmNsdWRlIDxtYWNoL2RkcjIuaD4KIAogI2RlZmluZSBEQVZJTkNJX0NQVUlETEVfTUFYX1NUQVRFUwkyCiAKQEAgLTc4LDkgKzc5LDExIEBACiAKIC8qIEFjdHVhbCBjb2RlIHRoYXQgcHV0cyB0aGUgU29DIGluIGRpZmZlcmVudCBpZGxlIHN0YXRlcyAqLwogc3RhdGljIGludCBkYXZpbmNpX2VudGVyX2lkbGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkJCQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCisJCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkJCQlpbnQgaW5kZXgpCiB7Ci0Jc3RydWN0IGRhdmluY2lfb3BzICpvcHMgPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RhdGUpOworCXN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICpzdGF0ZV91c2FnZSA9ICZkZXYtPnN0YXRlc191c2FnZVtpbmRleF07CisJc3RydWN0IGRhdmluY2lfb3BzICpvcHMgPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RhdGVfdXNhZ2UpOwogCXN0cnVjdCB0aW1ldmFsIGJlZm9yZSwgYWZ0ZXI7CiAJaW50IGlkbGVfdGltZTsKIApAQCAtOTgsMTMgKzEwMSwxNyBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlpZGxlX3RpbWUgPSAoYWZ0ZXIudHZfc2VjIC0gYmVmb3JlLnR2X3NlYykgKiBVU0VDX1BFUl9TRUMgKwogCQkJKGFmdGVyLnR2X3VzZWMgLSBiZWZvcmUudHZfdXNlYyk7Ci0JcmV0dXJuIGlkbGVfdGltZTsKKworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSBpZGxlX3RpbWU7CisKKwlyZXR1cm4gaW5kZXg7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGRhdmluY2lfY3B1aWRsZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCByZXQ7CiAJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcml2ZXIgPSAmZGF2aW5jaV9pZGxlX2RyaXZlcjsKIAlzdHJ1Y3QgZGF2aW5jaV9jcHVpZGxlX2NvbmZpZyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCWRldmljZSA9ICZwZXJfY3B1KGRhdmluY2lfY3B1aWRsZV9kZXZpY2UsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CkBAIC0xMTYsMzMgKzEyMywzNCBAQAogCiAJZGRyMl9yZWdfYmFzZSA9IHBkYXRhLT5kZHIyX2N0bHJfYmFzZTsKIAorCS8qIFdhaXQgZm9yIGludGVycnVwdCBzdGF0ZSAqLworCWRyaXZlci0+c3RhdGVzWzBdLmVudGVyID0gZGF2aW5jaV9lbnRlcl9pZGxlOworCWRyaXZlci0+c3RhdGVzWzBdLmV4aXRfbGF0ZW5jeSA9IDE7CisJZHJpdmVyLT5zdGF0ZXNbMF0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOworCWRyaXZlci0+c3RhdGVzWzBdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CisJc3RyY3B5KGRyaXZlci0+c3RhdGVzWzBdLm5hbWUsICJXRkkiKTsKKwlzdHJjcHkoZHJpdmVyLT5zdGF0ZXNbMF0uZGVzYywgIldhaXQgZm9yIGludGVycnVwdCIpOworCisJLyogV2FpdCBmb3IgaW50ZXJydXB0IGFuZCBERFIgc2VsZiByZWZyZXNoIHN0YXRlICovCisJZHJpdmVyLT5zdGF0ZXNbMV0uZW50ZXIgPSBkYXZpbmNpX2VudGVyX2lkbGU7CisJZHJpdmVyLT5zdGF0ZXNbMV0uZXhpdF9sYXRlbmN5ID0gMTA7CisJZHJpdmVyLT5zdGF0ZXNbMV0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOworCWRyaXZlci0+c3RhdGVzWzFdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CisJc3RyY3B5KGRyaXZlci0+c3RhdGVzWzFdLm5hbWUsICJERFIgU1IiKTsKKwlzdHJjcHkoZHJpdmVyLT5zdGF0ZXNbMV0uZGVzYywgIldGSSBhbmQgRERSIFNlbGYgUmVmcmVzaCIpOworCWlmIChwZGF0YS0+ZGRyMl9wZG93bikKKwkJZGF2aW5jaV9zdGF0ZXNbMV0uZmxhZ3MgfD0gREFWSU5DSV9DUFVJRExFX0ZMQUdTX0REUjJfUFdETjsKKwljcHVpZGxlX3NldF9zdGF0ZWRhdGEoJmRldmljZS0+c3RhdGVzX3VzYWdlWzFdLCAmZGF2aW5jaV9zdGF0ZXNbMV0pOworCisJZGV2aWNlLT5zdGF0ZV9jb3VudCA9IERBVklOQ0lfQ1BVSURMRV9NQVhfU1RBVEVTOworCWRyaXZlci0+c3RhdGVfY291bnQgPSBEQVZJTkNJX0NQVUlETEVfTUFYX1NUQVRFUzsKKwogCXJldCA9IGNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZkYXZpbmNpX2lkbGVfZHJpdmVyKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBkcml2ZXJcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIFdhaXQgZm9yIGludGVycnVwdCBzdGF0ZSAqLwotCWRldmljZS0+c3RhdGVzWzBdLmVudGVyID0gZGF2aW5jaV9lbnRlcl9pZGxlOwotCWRldmljZS0+c3RhdGVzWzBdLmV4aXRfbGF0ZW5jeSA9IDE7Ci0JZGV2aWNlLT5zdGF0ZXNbMF0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOwotCWRldmljZS0+c3RhdGVzWzBdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7Ci0Jc3RyY3B5KGRldmljZS0+c3RhdGVzWzBdLm5hbWUsICJXRkkiKTsKLQlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMF0uZGVzYywgIldhaXQgZm9yIGludGVycnVwdCIpOwotCi0JLyogV2FpdCBmb3IgaW50ZXJydXB0IGFuZCBERFIgc2VsZiByZWZyZXNoIHN0YXRlICovCi0JZGV2aWNlLT5zdGF0ZXNbMV0uZW50ZXIgPSBkYXZpbmNpX2VudGVyX2lkbGU7Ci0JZGV2aWNlLT5zdGF0ZXNbMV0uZXhpdF9sYXRlbmN5ID0gMTA7Ci0JZGV2aWNlLT5zdGF0ZXNbMV0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOwotCWRldmljZS0+c3RhdGVzWzFdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7Ci0Jc3RyY3B5KGRldmljZS0+c3RhdGVzWzFdLm5hbWUsICJERFIgU1IiKTsKLQlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMV0uZGVzYywgIldGSSBhbmQgRERSIFNlbGYgUmVmcmVzaCIpOwotCWlmIChwZGF0YS0+ZGRyMl9wZG93bikKLQkJZGF2aW5jaV9zdGF0ZXNbMV0uZmxhZ3MgfD0gREFWSU5DSV9DUFVJRExFX0ZMQUdTX0REUjJfUFdETjsKLQljcHVpZGxlX3NldF9zdGF0ZWRhdGEoJmRldmljZS0+c3RhdGVzWzFdLCAmZGF2aW5jaV9zdGF0ZXNbMV0pOwotCi0JZGV2aWNlLT5zdGF0ZV9jb3VudCA9IERBVklOQ0lfQ1BVSURMRV9NQVhfU1RBVEVTOwotCiAJcmV0ID0gY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UoZGV2aWNlKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBkZXZpY2VcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODMwLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGE4MzAuYwppbmRleCAyZWQyZjgyLi5hNmJmNWRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGE4MzAuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGE4MzAuYwpAQCAtOCw2ICs4LDcgQEAKICAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwogICogb3IgaW1wbGllZC4KICAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKQEAgLTE5LDcgKzIwLDcgQEAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvdGltZS5oPgogI2luY2x1ZGUgPG1hY2gvZGE4eHguaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZGF2aW5jaS5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKICNpbmNsdWRlICJtdXguaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTg1MC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODUwLmMKaW5kZXggOTM1ZGJlZC4uYjA0N2Y4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODUwLmMKQEAgLTExLDYgKzExLDcgQEAKICAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwogICogb3IgaW1wbGllZC4KICAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yNyw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bWFjaC9kYTh4eC5oPgogI2luY2x1ZGUgPG1hY2gvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPG1hY2gvcG0uaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZGF2aW5jaS5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKICNpbmNsdWRlICJtdXguaCIKQEAgLTUzNSw2ICs1MzYsMTMgQEAKIAlNVVhfQ0ZHKERBODUwLCBNTUNTRDBfREFUXzMsCTEwLAkyMCwJMTUsCTIsCWZhbHNlKQogCU1VWF9DRkcoREE4NTAsIE1NQ1NEMF9DTEssCTEwLAkwLAkxNSwJMiwJZmFsc2UpCiAJTVVYX0NGRyhEQTg1MCwgTU1DU0QwX0NNRCwJMTAsCTQsCTE1LAkyLAlmYWxzZSkKKwkvKiBNTUMvU0QxIGZ1bmN0aW9uICovCisJTVVYX0NGRyhEQTg1MCwgTU1DU0QxX0RBVF8wLAkxOCwJOCwJMTUsCTIsCWZhbHNlKQorCU1VWF9DRkcoREE4NTAsIE1NQ1NEMV9EQVRfMSwJMTksCTE2LAkxNSwJMiwJZmFsc2UpCisJTVVYX0NGRyhEQTg1MCwgTU1DU0QxX0RBVF8yLAkxOSwJMTIsCTE1LAkyLAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBNTUNTRDFfREFUXzMsCTE5LAk4LAkxNSwJMiwJZmFsc2UpCisJTVVYX0NGRyhEQTg1MCwgTU1DU0QxX0NMSywJMTgsCTEyLAkxNSwJMiwJZmFsc2UpCisJTVVYX0NGRyhEQTg1MCwgTU1DU0QxX0NNRCwJMTgsCTE2LAkxNSwJMiwJZmFsc2UpCiAJLyogRU1JRjIuNS9FTUlGQSBmdW5jdGlvbiAqLwogCU1VWF9DRkcoREE4NTAsIEVNQV9EXzcsCQk5LAkwLAkxNSwJMSwJZmFsc2UpCiAJTVVYX0NGRyhEQTg1MCwgRU1BX0RfNiwJCTksCTQsCTE1LAkxLAlmYWxzZSkKQEAgLTU5Myw2ICs2MDEsOCBAQAogCU1VWF9DRkcoREE4NTAsIEdQSU8zXzEzLAk3LAk4LAkxNSwJOCwJZmFsc2UpCiAJTVVYX0NGRyhEQTg1MCwgR1BJTzRfMCwJCTEwLAkyOCwJMTUsCTgsCWZhbHNlKQogCU1VWF9DRkcoREE4NTAsIEdQSU80XzEsCQkxMCwJMjQsCTE1LAk4LAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBHUElPNl85LAkJMTMsCTI0LAkxNSwJOCwJZmFsc2UpCisJTVVYX0NGRyhEQTg1MCwgR1BJTzZfMTAsCTEzLAkyMCwJMTUsCTgsCWZhbHNlKQogCU1VWF9DRkcoREE4NTAsIEdQSU82XzEzLAkxMywJOCwJMTUsCTgsCWZhbHNlKQogCU1VWF9DRkcoREE4NTAsIFJUQ19BTEFSTSwJMCwJMjgsCTE1LAkyLAlmYWxzZSkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtZGE4eHguYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMKaW5kZXggMmY3ZTcxOS4uNjhkZWY3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtZGE4eHguYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jCkBAIC0xMzYsNiArMTM2LDcgQEAKIAkubl9jYwkJCT0gMSwKIAkucXVldWVfdGNfbWFwcGluZwk9IGRhOHh4X3F1ZXVlX3RjX21hcHBpbmcsCiAJLnF1ZXVlX3ByaW9yaXR5X21hcHBpbmcJPSBkYTh4eF9xdWV1ZV9wcmlvcml0eV9tYXBwaW5nLAorCS5kZWZhdWx0X3F1ZXVlCQk9IEVWRU5UUV8xLAogfTsKIAogc3RhdGljIHN0cnVjdCBlZG1hX3NvY19pbmZvICpkYTgzMF9lZG1hX2luZm9bRURNQV9NQVhfQ0NdID0gewpAQCAtMTUxLDYgKzE1Miw3IEBACiAJCS5uX2NjCQkJPSAxLAogCQkucXVldWVfdGNfbWFwcGluZwk9IGRhOHh4X3F1ZXVlX3RjX21hcHBpbmcsCiAJCS5xdWV1ZV9wcmlvcml0eV9tYXBwaW5nCT0gZGE4eHhfcXVldWVfcHJpb3JpdHlfbWFwcGluZywKKwkJLmRlZmF1bHRfcXVldWUJCT0gRVZFTlRRXzEsCiAJfSwKIAl7CiAJCS5uX2NoYW5uZWwJCT0gMzIsCkBAIC0xNjAsNiArMTYyLDcgQEAKIAkJLm5fY2MJCQk9IDEsCiAJCS5xdWV1ZV90Y19tYXBwaW5nCT0gZGE4NTBfcXVldWVfdGNfbWFwcGluZywKIAkJLnF1ZXVlX3ByaW9yaXR5X21hcHBpbmcJPSBkYTg1MF9xdWV1ZV9wcmlvcml0eV9tYXBwaW5nLAorCQkuZGVmYXVsdF9xdWV1ZQkJPSBFVkVOVFFfMCwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtdG5ldHYxMDd4LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy10bmV0djEwN3guYwppbmRleCA2MTYyY2FlLi4yOWIxN2Y3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy10bmV0djEwN3guYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy10bmV0djEwN3guYwpAQCAtODAsNiArODAsNyBAQAogCS5uX2NjCQkJPSAxLAogCS5xdWV1ZV90Y19tYXBwaW5nCT0gZWRtYV90Y19tYXBwaW5nLAogCS5xdWV1ZV9wcmlvcml0eV9tYXBwaW5nCT0gZWRtYV9wcmlvcml0eV9tYXBwaW5nLAorCS5kZWZhdWx0X3F1ZXVlCQk9IEVWRU5UUV8xLAogfTsKIAogc3RhdGljIHN0cnVjdCBlZG1hX3NvY19pbmZvICp0bmV0djEwN3hfZWRtYV9pbmZvW0VETUFfTUFYX0NDXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTM1NS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzU1LmMKaW5kZXggYTNhOTRlOS4uZmU1MjBkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzU1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzU1LmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCkBAIC0zMCw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2FzcC5oPgogI2luY2x1ZGUgPG1hY2gvc3BpLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWRhdmluY2kuaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAibXV4LmgiCkBAIC01OTEsNiArNTkxLDcgQEAKIAkubl9jYwkJCT0gMSwKIAkucXVldWVfdGNfbWFwcGluZwk9IHF1ZXVlX3RjX21hcHBpbmcsCiAJLnF1ZXVlX3ByaW9yaXR5X21hcHBpbmcJPSBxdWV1ZV9wcmlvcml0eV9tYXBwaW5nLAorCS5kZWZhdWx0X3F1ZXVlCQk9IEVWRU5UUV8xLAogfTsKIAogc3RhdGljIHN0cnVjdCBlZG1hX3NvY19pbmZvICpkbTM1NV9lZG1hX2luZm9bRURNQV9NQVhfQ0NdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzY1LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG0zNjUuYwppbmRleCA0NjA0ZTcyLi42NzllMTY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG0zNjUuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG0zNjUuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0zNCw3ICszMyw3IEBACiAjaW5jbHVkZSA8bWFjaC9hc3AuaD4KICNpbmNsdWRlIDxtYWNoL2tleXNjYW4uaD4KICNpbmNsdWRlIDxtYWNoL3NwaS5oPgotCisjaW5jbHVkZSA8bWFjaC9ncGlvLWRhdmluY2kuaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAibXV4LmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDR4LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDR4LmMKaW5kZXggNGM4MmMyNy4uMzQ3MDk4MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ0eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NHguYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKQEAgLTI2LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9hc3AuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZGF2aW5jaS5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKICNpbmNsdWRlICJtdXguaCIKQEAgLTUxNCw2ICs1MTQsNyBAQAogCS5uX2NjCQkJPSAxLAogCS5xdWV1ZV90Y19tYXBwaW5nCT0gcXVldWVfdGNfbWFwcGluZywKIAkucXVldWVfcHJpb3JpdHlfbWFwcGluZwk9IHF1ZXVlX3ByaW9yaXR5X21hcHBpbmcsCisJLmRlZmF1bHRfcXVldWUJCT0gRVZFTlRRXzEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGVkbWFfc29jX2luZm8gKmRtNjQ0eF9lZG1hX2luZm9bRURNQV9NQVhfQ0NdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ2eC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ2eC5jCmluZGV4IDE4MDJlNzEuLjBiNjhlZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NnguYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDZ4LmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCkBAIC0yNyw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bWFjaC9zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvYXNwLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWRhdmluY2kuaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAibXV4LmgiCkBAIC01NTUsNiArNTU1LDcgQEAKIAkubl9jYwkJCT0gMSwKIAkucXVldWVfdGNfbWFwcGluZwk9IGRtNjQ2eF9xdWV1ZV90Y19tYXBwaW5nLAogCS5xdWV1ZV9wcmlvcml0eV9tYXBwaW5nCT0gZG02NDZ4X3F1ZXVlX3ByaW9yaXR5X21hcHBpbmcsCisJLmRlZmF1bHRfcXVldWUJCT0gRVZFTlRRXzEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGVkbWFfc29jX2luZm8gKmRtNjQ2eF9lZG1hX2luZm9bRURNQV9NQVhfQ0NdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtYS5jCmluZGV4IDZiOTY2OTguLmRhOTAxMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG1hLmMKQEAgLTE0MzUsMTIgKzE0MzUsMTEgQEAKIAkJCWdvdG8gZmFpbDE7CiAJCX0KIAotCQllZG1hX2NjW2pdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVkbWEpLCBHRlBfS0VSTkVMKTsKKwkJZWRtYV9jY1tqXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlZG1hKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZWRtYV9jY1tqXSkgewogCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCWdvdG8gZmFpbDE7CiAJCX0KLQkJbWVtc2V0KGVkbWFfY2Nbal0sIDAsIHNpemVvZihzdHJ1Y3QgZWRtYSkpOwogCiAJCWVkbWFfY2Nbal0tPm51bV9jaGFubmVscyA9IG1pbl90KHVuc2lnbmVkLCBpbmZvW2pdLT5uX2NoYW5uZWwsCiAJCQkJCQkJRURNQV9NQVhfRE1BQ0gpOwpAQCAtMTQ1MCw4ICsxNDQ5LDYgQEAKIAkJCQkJCQlFRE1BX01BWF9DQyk7CiAKIAkJZWRtYV9jY1tqXS0+ZGVmYXVsdF9xdWV1ZSA9IGluZm9bal0tPmRlZmF1bHRfcXVldWU7Ci0JCWlmICghZWRtYV9jY1tqXS0+ZGVmYXVsdF9xdWV1ZSkKLQkJCWVkbWFfY2Nbal0tPmRlZmF1bHRfcXVldWUgPSBFVkVOVFFfMTsKIAogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJETUEgUkVHIEJBU0UgQUREUj0lcFxuIiwKIAkJCWVkbWFjY19yZWdzX2Jhc2Vbal0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZmJlMTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKgotICogVEkgRGFWaW5jaSBHUElPIFN1cHBvcnQKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBEYXZpZCBCcm93bmVsbAotICogQ29weXJpZ2h0IChjKSAyMDA3LCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotCi1zdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgewotCXUzMglkaXI7Ci0JdTMyCW91dF9kYXRhOwotCXUzMglzZXRfZGF0YTsKLQl1MzIJY2xyX2RhdGE7Ci0JdTMyCWluX2RhdGE7Ci0JdTMyCXNldF9yaXNpbmc7Ci0JdTMyCWNscl9yaXNpbmc7Ci0JdTMyCXNldF9mYWxsaW5nOwotCXUzMgljbHJfZmFsbGluZzsKLQl1MzIJaW50c3RhdDsKLX07Ci0KLSNkZWZpbmUgY2hpcDJjb250cm9sbGVyKGNoaXApCVwKLQljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyLCBjaGlwKQotCi1zdGF0aWMgc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyIGNoaXBzW0RJVl9ST1VORF9VUChEQVZJTkNJX05fR1BJTywgMzIpXTsKLXN0YXRpYyB2b2lkIF9faW9tZW0gKmdwaW9fYmFzZTsKLQotc3RhdGljIHN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtIF9faW5pdCAqZ3BpbzJyZWdzKHVuc2lnbmVkIGdwaW8pCi17Ci0Jdm9pZCBfX2lvbWVtICpwdHI7Ci0KLQlpZiAoZ3BpbyA8IDMyICogMSkKLQkJcHRyID0gZ3Bpb19iYXNlICsgMHgxMDsKLQllbHNlIGlmIChncGlvIDwgMzIgKiAyKQotCQlwdHIgPSBncGlvX2Jhc2UgKyAweDM4OwotCWVsc2UgaWYgKGdwaW8gPCAzMiAqIDMpCi0JCXB0ciA9IGdwaW9fYmFzZSArIDB4NjA7Ci0JZWxzZSBpZiAoZ3BpbyA8IDMyICogNCkKLQkJcHRyID0gZ3Bpb19iYXNlICsgMHg4ODsKLQllbHNlIGlmIChncGlvIDwgMzIgKiA1KQotCQlwdHIgPSBncGlvX2Jhc2UgKyAweGIwOwotCWVsc2UKLQkJcHRyID0gTlVMTDsKLQlyZXR1cm4gcHRyOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICppcnEycmVncyhpbnQgaXJxKQotewotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnOwotCi0JZyA9IChfX2ZvcmNlIHN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICopaXJxX2dldF9jaGlwX2RhdGEoaXJxKTsKLQotCXJldHVybiBnOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBkYXZpbmNpX2dwaW9faXJxX3NldHVwKHZvaWQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogYm9hcmQgc2V0dXAgY29kZSAqTVVTVCogc2V0dXAgcGlubXV4IGFuZCBlbmFibGUgdGhlIEdQSU8gY2xvY2suICovCi1zdGF0aWMgaW5saW5lIGludCBfX2RhdmluY2lfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQl1bnNpZ25lZCBvZmZzZXQsIGJvb2wgb3V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICpkID0gY2hpcDJjb250cm9sbGVyKGNoaXApOwotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gZC0+cmVnczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiB0ZW1wOwotCXUzMiBtYXNrID0gMSA8PCBvZmZzZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOwotCXRlbXAgPSBfX3Jhd19yZWFkbCgmZy0+ZGlyKTsKLQlpZiAob3V0KSB7Ci0JCXRlbXAgJj0gfm1hc2s7Ci0JCV9fcmF3X3dyaXRlbChtYXNrLCB2YWx1ZSA/ICZnLT5zZXRfZGF0YSA6ICZnLT5jbHJfZGF0YSk7Ci0JfSBlbHNlIHsKLQkJdGVtcCB8PSBtYXNrOwotCX0KLQlfX3Jhd193cml0ZWwodGVtcCwgJmctPmRpcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGF2aW5jaV9kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBfX2RhdmluY2lfZGlyZWN0aW9uKGNoaXAsIG9mZnNldCwgZmFsc2UsIDApOwotfQotCi1zdGF0aWMgaW50Ci1kYXZpbmNpX2RpcmVjdGlvbl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JcmV0dXJuIF9fZGF2aW5jaV9kaXJlY3Rpb24oY2hpcCwgb2Zmc2V0LCB0cnVlLCB2YWx1ZSk7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBwaW4ncyB2YWx1ZSAod29ya3MgZXZlbiBpZiBpdCdzIHNldCB1cCBhcyBvdXRwdXQpOwotICogcmV0dXJucyB6ZXJvL25vbnplcm8uCi0gKgotICogTm90ZSB0aGF0IGNoYW5nZXMgYXJlIHN5bmNoZWQgdG8gdGhlIEdQSU8gY2xvY2ssIHNvIHJlYWRpbmcgdmFsdWVzIGJhY2sKLSAqIHJpZ2h0IGFmdGVyIHlvdSd2ZSBzZXQgdGhlbSBtYXkgZ2l2ZSBvbGQgdmFsdWVzLgotICovCi1zdGF0aWMgaW50IGRhdmluY2lfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqZCA9IGNoaXAyY29udHJvbGxlcihjaGlwKTsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGQtPnJlZ3M7Ci0KLQlyZXR1cm4gKDEgPDwgb2Zmc2V0KSAmIF9fcmF3X3JlYWRsKCZnLT5pbl9kYXRhKTsKLX0KLQotLyoKLSAqIEFzc3VtaW5nIHRoZSBwaW4gaXMgbXV4ZWQgYXMgYSBncGlvIG91dHB1dCwgc2V0IGl0cyBvdXRwdXQgdmFsdWUuCi0gKi8KLXN0YXRpYyB2b2lkCi1kYXZpbmNpX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqZCA9IGNoaXAyY29udHJvbGxlcihjaGlwKTsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGQtPnJlZ3M7Ci0KLQlfX3Jhd193cml0ZWwoKDEgPDwgb2Zmc2V0KSwgdmFsdWUgPyAmZy0+c2V0X2RhdGEgOiAmZy0+Y2xyX2RhdGEpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBkYXZpbmNpX2dwaW9fc2V0dXAodm9pZCkKLXsKLQlpbnQgaSwgYmFzZTsKLQl1bnNpZ25lZCBuZ3BpbzsKLQlzdHJ1Y3QgZGF2aW5jaV9zb2NfaW5mbyAqc29jX2luZm8gPSAmZGF2aW5jaV9zb2NfaW5mbzsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgKnJlZ3M7Ci0KLQlpZiAoc29jX2luZm8tPmdwaW9fdHlwZSAhPSBHUElPX1RZUEVfREFWSU5DSSkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIFRoZSBncGlvIGJhbmtzIGNvbmNlcHR1YWxseSBleHBvc2UgYSBzZWdtZW50ZWQgYml0bWFwLAotCSAqIGFuZCAibmdwaW8iIGlzIG9uZSBtb3JlIHRoYW4gdGhlIGxhcmdlc3QgemVyby1iYXNlZAotCSAqIGJpdCBpbmRleCB0aGF0J3MgdmFsaWQuCi0JICovCi0JbmdwaW8gPSBzb2NfaW5mby0+Z3Bpb19udW07Ci0JaWYgKG5ncGlvID09IDApIHsKLQkJcHJfZXJyKCJHUElPIHNldHVwOiAgaG93IG1hbnkgR1BJT3M/XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKFdBUk5fT04oREFWSU5DSV9OX0dQSU8gPCBuZ3BpbykpCi0JCW5ncGlvID0gREFWSU5DSV9OX0dQSU87Ci0KLQlncGlvX2Jhc2UgPSBpb3JlbWFwKHNvY19pbmZvLT5ncGlvX2Jhc2UsIFNaXzRLKTsKLQlpZiAoV0FSTl9PTighZ3Bpb19iYXNlKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwLCBiYXNlID0gMDsgYmFzZSA8IG5ncGlvOyBpKyssIGJhc2UgKz0gMzIpIHsKLQkJY2hpcHNbaV0uY2hpcC5sYWJlbCA9ICJEYVZpbmNpIjsKLQotCQljaGlwc1tpXS5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IGRhdmluY2lfZGlyZWN0aW9uX2luOwotCQljaGlwc1tpXS5jaGlwLmdldCA9IGRhdmluY2lfZ3Bpb19nZXQ7Ci0JCWNoaXBzW2ldLmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IGRhdmluY2lfZGlyZWN0aW9uX291dDsKLQkJY2hpcHNbaV0uY2hpcC5zZXQgPSBkYXZpbmNpX2dwaW9fc2V0OwotCi0JCWNoaXBzW2ldLmNoaXAuYmFzZSA9IGJhc2U7Ci0JCWNoaXBzW2ldLmNoaXAubmdwaW8gPSBuZ3BpbyAtIGJhc2U7Ci0JCWlmIChjaGlwc1tpXS5jaGlwLm5ncGlvID4gMzIpCi0JCQljaGlwc1tpXS5jaGlwLm5ncGlvID0gMzI7Ci0KLQkJc3Bpbl9sb2NrX2luaXQoJmNoaXBzW2ldLmxvY2spOwotCi0JCXJlZ3MgPSBncGlvMnJlZ3MoYmFzZSk7Ci0JCWNoaXBzW2ldLnJlZ3MgPSByZWdzOwotCQljaGlwc1tpXS5zZXRfZGF0YSA9ICZyZWdzLT5zZXRfZGF0YTsKLQkJY2hpcHNbaV0uY2xyX2RhdGEgPSAmcmVncy0+Y2xyX2RhdGE7Ci0JCWNoaXBzW2ldLmluX2RhdGEgPSAmcmVncy0+aW5fZGF0YTsKLQotCQlncGlvY2hpcF9hZGQoJmNoaXBzW2ldLmNoaXApOwotCX0KLQotCXNvY19pbmZvLT5ncGlvX2N0bHJzID0gY2hpcHM7Ci0Jc29jX2luZm8tPmdwaW9fY3RscnNfbnVtID0gRElWX1JPVU5EX1VQKG5ncGlvLCAzMik7Ci0KLQlkYXZpbmNpX2dwaW9faXJxX3NldHVwKCk7Ci0JcmV0dXJuIDA7Ci19Ci1wdXJlX2luaXRjYWxsKGRhdmluY2lfZ3Bpb19zZXR1cCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqIFdlIGV4cGVjdCBpcnFzIHdpbGwgbm9ybWFsbHkgYmUgc2V0IHVwIGFzIGlucHV0IHBpbnMsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlCi0gKiB1c2VkIGFzIG91dHB1dCBwaW5zIC4uLiB3aGljaCBpcyBjb252ZW5pZW50IGZvciB0ZXN0aW5nLgotICoKLSAqIE5PVEU6ICBUaGUgZmlyc3QgZmV3IEdQSU9zIGFsc28gaGF2ZSBkaXJlY3QgSU5UQyBob29rdXBzIGluIGFkZGl0aW9uCi0gKiB0byB0aGVpciBHUElPQk5LMCBpcnEsIHdpdGggYSBiaXQgbGVzcyBvdmVyaGVhZC4KLSAqCi0gKiBBbGwgdGhvc2UgSU5UQyBob29rdXBzIChkaXJlY3QsIHBsdXMgc2V2ZXJhbCBJUlEgYmFua3MpIGNhbiBhbHNvCi0gKiBzZXJ2ZSBhcyBFRE1BIGV2ZW50IHRyaWdnZXJzLgotICovCi0KLXN0YXRpYyB2b2lkIGdwaW9faXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gaXJxMnJlZ3MoZC0+aXJxKTsKLQl1MzIgbWFzayA9ICh1MzIpIGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGQpOwotCi0JX19yYXdfd3JpdGVsKG1hc2ssICZnLT5jbHJfZmFsbGluZyk7Ci0JX19yYXdfd3JpdGVsKG1hc2ssICZnLT5jbHJfcmlzaW5nKTsKLX0KLQotc3RhdGljIHZvaWQgZ3Bpb19pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGlycTJyZWdzKGQtPmlycSk7Ci0JdTMyIG1hc2sgPSAodTMyKSBpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkKTsKLQl1bnNpZ25lZCBzdGF0dXMgPSBpcnFkX2dldF90cmlnZ2VyX3R5cGUoZCk7Ci0KLQlzdGF0dXMgJj0gSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwgSVJRX1RZUEVfRURHRV9SSVNJTkc7Ci0JaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IElSUV9UWVBFX0VER0VfRkFMTElORyB8IElSUV9UWVBFX0VER0VfUklTSU5HOwotCi0JaWYgKHN0YXR1cyAmIElSUV9UWVBFX0VER0VfRkFMTElORykKLQkJX19yYXdfd3JpdGVsKG1hc2ssICZnLT5zZXRfZmFsbGluZyk7Ci0JaWYgKHN0YXR1cyAmIElSUV9UWVBFX0VER0VfUklTSU5HKQotCQlfX3Jhd193cml0ZWwobWFzaywgJmctPnNldF9yaXNpbmcpOwotfQotCi1zdGF0aWMgaW50IGdwaW9faXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCB0cmlnZ2VyKQotewotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gaXJxMnJlZ3MoZC0+aXJxKTsKLQl1MzIgbWFzayA9ICh1MzIpIGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGQpOwotCi0JaWYgKHRyaWdnZXIgJiB+KElSUV9UWVBFX0VER0VfRkFMTElORyB8IElSUV9UWVBFX0VER0VfUklTSU5HKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBncGlvX2lycWNoaXAgPSB7Ci0JLm5hbWUJCT0gIkdQSU8iLAotCS5pcnFfZW5hYmxlCT0gZ3Bpb19pcnFfZW5hYmxlLAotCS5pcnFfZGlzYWJsZQk9IGdwaW9faXJxX2Rpc2FibGUsCi0JLmlycV9zZXRfdHlwZQk9IGdwaW9faXJxX3R5cGUsCi0JLmZsYWdzCQk9IElSUUNISVBfU0VUX1RZUEVfTUFTS0VELAotfTsKLQotc3RhdGljIHZvaWQKLWdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmc7Ci0JdTMyIG1hc2sgPSAweGZmZmY7Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICpkOwotCi0JZCA9IChzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKilpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOwotCWcgPSAoc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKilkLT5yZWdzOwotCi0JLyogd2Ugb25seSBjYXJlIGFib3V0IG9uZSBiYW5rICovCi0JaWYgKGlycSAmIDEpCi0JCW1hc2sgPDw9IDE2OwotCi0JLyogdGVtcG9yYXJpbHkgbWFzayAobGV2ZWwgc2Vuc2l0aXZlKSBwYXJlbnQgSVJRICovCi0JZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX21hc2soJmRlc2MtPmlycV9kYXRhKTsKLQlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKCZkZXNjLT5pcnFfZGF0YSk7Ci0Jd2hpbGUgKDEpIHsKLQkJdTMyCQlzdGF0dXM7Ci0JCWludAkJbjsKLQkJaW50CQlyZXM7Ci0KLQkJLyogYWNrIGFueSBpcnFzICovCi0JCXN0YXR1cyA9IF9fcmF3X3JlYWRsKCZnLT5pbnRzdGF0KSAmIG1hc2s7Ci0JCWlmICghc3RhdHVzKQotCQkJYnJlYWs7Ci0JCV9fcmF3X3dyaXRlbChzdGF0dXMsICZnLT5pbnRzdGF0KTsKLQotCQkvKiBub3cgZGVtdXggdGhlbSB0byB0aGUgcmlnaHQgbG93bGV2ZWwgaGFuZGxlciAqLwotCQluID0gZC0+aXJxX2Jhc2U7Ci0JCWlmIChpcnEgJiAxKSB7Ci0JCQluICs9IDE2OwotCQkJc3RhdHVzID4+PSAxNjsKLQkJfQotCi0JCXdoaWxlIChzdGF0dXMpIHsKLQkJCXJlcyA9IGZmcyhzdGF0dXMpOwotCQkJbiArPSByZXM7Ci0JCQlnZW5lcmljX2hhbmRsZV9pcnEobiAtIDEpOwotCQkJc3RhdHVzID4+PSByZXM7Ci0JCX0KLQl9Ci0JZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX3VubWFzaygmZGVzYy0+aXJxX2RhdGEpOwotCS8qIG5vdyBpdCBtYXkgcmUtdHJpZ2dlciAqLwotfQotCi1zdGF0aWMgaW50IGdwaW9fdG9faXJxX2JhbmtlZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICpkID0gY2hpcDJjb250cm9sbGVyKGNoaXApOwotCi0JaWYgKGQtPmlycV9iYXNlID49IDApCi0JCXJldHVybiBkLT5pcnFfYmFzZSArIG9mZnNldDsKLQllbHNlCi0JCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW50IGdwaW9fdG9faXJxX3VuYmFua2VkKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9zb2NfaW5mbyAqc29jX2luZm8gPSAmZGF2aW5jaV9zb2NfaW5mbzsKLQotCS8qIE5PVEU6ICB3ZSBhc3N1bWUgZm9yIG5vdyB0aGF0IG9ubHkgaXJxcyBpbiB0aGUgZmlyc3QgZ3Bpb19jaGlwCi0JICogY2FuIHByb3ZpZGUgZGlyZWN0LW1hcHBlZCBJUlFzIHRvIEFJTlRDICh1cCB0byAzMiBHUElPcykuCi0JICovCi0JaWYgKG9mZnNldCA8IHNvY19pbmZvLT5ncGlvX3VuYmFua2VkKQotCQlyZXR1cm4gc29jX2luZm8tPmdwaW9faXJxICsgb2Zmc2V0OwotCWVsc2UKLQkJcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbnQgZ3Bpb19pcnFfdHlwZV91bmJhbmtlZChzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIHRyaWdnZXIpCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmcgPSBpcnEycmVncyhkLT5pcnEpOwotCXUzMiBtYXNrID0gKHUzMikgaXJxX2RhdGFfZ2V0X2lycV9oYW5kbGVyX2RhdGEoZCk7Ci0KLQlpZiAodHJpZ2dlciAmIH4oSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCV9fcmF3X3dyaXRlbChtYXNrLCAodHJpZ2dlciAmIElSUV9UWVBFX0VER0VfRkFMTElORykKLQkJICAgICA/ICZnLT5zZXRfZmFsbGluZyA6ICZnLT5jbHJfZmFsbGluZyk7Ci0JX19yYXdfd3JpdGVsKG1hc2ssICh0cmlnZ2VyICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCi0JCSAgICAgPyAmZy0+c2V0X3Jpc2luZyA6ICZnLT5jbHJfcmlzaW5nKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogTk9URTogIGZvciBzdXNwZW5kL3Jlc3VtZSwgcHJvYmFibHkgYmVzdCB0byBtYWtlIGEgcGxhdGZvcm1fZGV2aWNlIHdpdGgKLSAqIHN1c3BlbmRfbGF0ZS9yZXN1bWVfcmVzdW1lIGNhbGxzIGhvb2tpbmcgaW50byByZXN1bHRzIG9mIHRoZSBzZXRfd2FrZSgpCi0gKiBjYWxscyAuLi4gc28gaWYgbm8gZ3Bpb3MgYXJlIHdha2V1cCBldmVudHMgdGhlIGNsb2NrIGNhbiBiZSBkaXNhYmxlZCwKLSAqIHdpdGggb3V0cHV0cyBsZWZ0IGF0IHByZXZpb3VzbHkgc2V0IGxldmVscywgYW5kIHNvIHRoYXQgVkREM1AzVi5JT1BXRE4wCi0gKiAoZG02NDQ2KSBjYW4gYmUgc2V0IGFwcHJvcHJpYXRlbHkgZm9yIEdQSU9WMzMgcGlucy4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBkYXZpbmNpX2dwaW9faXJxX3NldHVwKHZvaWQpCi17Ci0JdW5zaWduZWQJZ3BpbywgaXJxLCBiYW5rOwotCXN0cnVjdCBjbGsJKmNsazsKLQl1MzIJCWJpbnRlbiA9IDA7Ci0JdW5zaWduZWQJbmdwaW8sIGJhbmtfaXJxOwotCXN0cnVjdCBkYXZpbmNpX3NvY19pbmZvICpzb2NfaW5mbyA9ICZkYXZpbmNpX3NvY19pbmZvOwotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncwlfX2lvbWVtICpnOwotCi0JbmdwaW8gPSBzb2NfaW5mby0+Z3Bpb19udW07Ci0KLQliYW5rX2lycSA9IHNvY19pbmZvLT5ncGlvX2lycTsKLQlpZiAoYmFua19pcnEgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkRvbid0IGtub3cgZmlyc3QgR1BJTyBiYW5rIElSUS5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljbGsgPSBjbGtfZ2V0KE5VTEwsICJncGlvIik7Ci0JaWYgKElTX0VSUihjbGspKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWxkIGdldHRpbmcgZ3BpbyBjbG9jaz9cbiIsCi0JCSAgICAgICBQVFJfRVJSKGNsaykpOwotCQlyZXR1cm4gUFRSX0VSUihjbGspOwotCX0KLQljbGtfZW5hYmxlKGNsayk7Ci0KLQkvKiBBcnJhbmdlIGdwaW9fdG9faXJxKCkgc3VwcG9ydCwgaGFuZGxpbmcgZWl0aGVyIGRpcmVjdCBJUlFzIG9yCi0JICogYmFua2VkIElSUXMuICBIYXZpbmcgR1BJT3MgaW4gdGhlIGZpcnN0IEdQSU8gYmFuayB1c2UgZGlyZWN0Ci0JICogSVJRcywgd2hpbGUgdGhlIG90aGVycyB1c2UgYmFua2VkIElSUXMsIHdvdWxkIG5lZWQgc29tZSBzZXR1cAotCSAqIHR3ZWFrcyB0byByZWNvZ25pemUgaGFyZHdhcmUgd2hpY2ggY2FuIGRvIHRoYXQuCi0JICovCi0JZm9yIChncGlvID0gMCwgYmFuayA9IDA7IGdwaW8gPCBuZ3BpbzsgYmFuaysrLCBncGlvICs9IDMyKSB7Ci0JCWNoaXBzW2JhbmtdLmNoaXAudG9faXJxID0gZ3Bpb190b19pcnFfYmFua2VkOwotCQljaGlwc1tiYW5rXS5pcnFfYmFzZSA9IHNvY19pbmZvLT5ncGlvX3VuYmFua2VkCi0JCQk/IC1FSU5WQUwKLQkJCTogKHNvY19pbmZvLT5pbnRjX2lycV9udW0gKyBncGlvKTsKLQl9Ci0KLQkvKgotCSAqIEFJTlRDIGNhbiBoYW5kbGUgZGlyZWN0L3VuYmFua2VkIElSUXMgZm9yIEdQSU9zLCB3aXRoIHRoZSBHUElPCi0JICogY29udHJvbGxlciBvbmx5IGhhbmRsaW5nIHRyaWdnZXIgbW9kZXMuICBXZSBjdXJyZW50bHkgYXNzdW1lIG5vCi0JICogSVJRIG11eCBjb25mbGljdHM7IGdwaW9faXJxX3R5cGVfdW5iYW5rZWQoKSBpcyBvbmx5IGZvciBHUElPcy4KLQkgKi8KLQlpZiAoc29jX2luZm8tPmdwaW9fdW5iYW5rZWQpIHsKLQkJc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBncGlvX2lycWNoaXBfdW5iYW5rZWQ7Ci0KLQkJLyogcGFzcyAiYmFuayAwIiBHUElPIElSUXMgdG8gQUlOVEMgKi8KLQkJY2hpcHNbMF0uY2hpcC50b19pcnEgPSBncGlvX3RvX2lycV91bmJhbmtlZDsKLQkJYmludGVuID0gQklUKDApOwotCi0JCS8qIEFJTlRDIGhhbmRsZXMgbWFzay91bm1hc2s7IEdQSU8gaGFuZGxlcyB0cmlnZ2VyaW5nICovCi0JCWlycSA9IGJhbmtfaXJxOwotCQlncGlvX2lycWNoaXBfdW5iYW5rZWQgPSAqaXJxX2dldF9jaGlwKGlycSk7Ci0JCWdwaW9faXJxY2hpcF91bmJhbmtlZC5uYW1lID0gIkdQSU8tQUlOVEMiOwotCQlncGlvX2lycWNoaXBfdW5iYW5rZWQuaXJxX3NldF90eXBlID0gZ3Bpb19pcnFfdHlwZV91bmJhbmtlZDsKLQotCQkvKiBkZWZhdWx0IHRyaWdnZXI6IGJvdGggZWRnZXMgKi8KLQkJZyA9IGdwaW8ycmVncygwKTsKLQkJX19yYXdfd3JpdGVsKH4wLCAmZy0+c2V0X2ZhbGxpbmcpOwotCQlfX3Jhd193cml0ZWwofjAsICZnLT5zZXRfcmlzaW5nKTsKLQotCQkvKiBzZXQgdGhlIGRpcmVjdCBJUlFzIHVwIHRvIHVzZSB0aGF0IGlycWNoaXAgKi8KLQkJZm9yIChncGlvID0gMDsgZ3BpbyA8IHNvY19pbmZvLT5ncGlvX3VuYmFua2VkOyBncGlvKyssIGlycSsrKSB7Ci0JCQlpcnFfc2V0X2NoaXAoaXJxLCAmZ3Bpb19pcnFjaGlwX3VuYmFua2VkKTsKLQkJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgKHZvaWQgKilfX2dwaW9fbWFzayhncGlvKSk7Ci0JCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIChfX2ZvcmNlIHZvaWQgKilnKTsKLQkJCWlycV9zZXRfc3RhdHVzX2ZsYWdzKGlycSwgSVJRX1RZUEVfRURHRV9CT1RIKTsKLQkJfQotCi0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKgotCSAqIE9yLCBBSU5UQyBjYW4gaGFuZGxlIElSUXMgZm9yIGJhbmtzIG9mIDE2IEdQSU8gSVJRcywgd2hpY2ggd2UKLQkgKiB0aGVuIGNoYWluIHRocm91Z2ggb3VyIG93biBoYW5kbGVyLgotCSAqLwotCWZvciAoZ3BpbyA9IDAsIGlycSA9IGdwaW9fdG9faXJxKDApLCBiYW5rID0gMDsKLQkJCWdwaW8gPCBuZ3BpbzsKLQkJCWJhbmsrKywgYmFua19pcnErKykgewotCQl1bnNpZ25lZAkJaTsKLQotCQkvKiBkaXNhYmxlZCBieSBkZWZhdWx0LCBlbmFibGVkIG9ubHkgYXMgbmVlZGVkICovCi0JCWcgPSBncGlvMnJlZ3MoZ3Bpbyk7Ci0JCV9fcmF3X3dyaXRlbCh+MCwgJmctPmNscl9mYWxsaW5nKTsKLQkJX19yYXdfd3JpdGVsKH4wLCAmZy0+Y2xyX3Jpc2luZyk7Ci0KLQkJLyogc2V0IHVwIGFsbCBpcnFzIGluIHRoaXMgYmFuayAqLwotCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihiYW5rX2lycSwgZ3Bpb19pcnFfaGFuZGxlcik7Ci0KLQkJLyoKLQkJICogRWFjaCBjaGlwIGhhbmRsZXMgMzIgZ3Bpb3MsIGFuZCBlYWNoIGlycSBiYW5rIGNvbnNpc3RzIG9mIDE2Ci0JCSAqIGdwaW8gaXJxcy4gUGFzcyB0aGUgaXJxIGJhbmsncyBjb3JyZXNwb25kaW5nIGNvbnRyb2xsZXIgdG8KLQkJICogdGhlIGNoYWluZWQgaXJxIGhhbmRsZXIuCi0JCSAqLwotCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShiYW5rX2lycSwgJmNoaXBzW2dwaW8gLyAzMl0pOwotCi0JCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBncGlvIDwgbmdwaW87IGkrKywgaXJxKyssIGdwaW8rKykgewotCQkJaXJxX3NldF9jaGlwKGlycSwgJmdwaW9faXJxY2hpcCk7Ci0JCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIChfX2ZvcmNlIHZvaWQgKilnKTsKLQkJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgKHZvaWQgKilfX2dwaW9fbWFzayhncGlvKSk7Ci0JCQlpcnFfc2V0X2hhbmRsZXIoaXJxLCBoYW5kbGVfc2ltcGxlX2lycSk7Ci0JCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7Ci0JCX0KLQotCQliaW50ZW4gfD0gQklUKGJhbmspOwotCX0KLQotZG9uZToKLQkvKiBCSU5URU4gLS0gcGVyLWJhbmsgaW50ZXJydXB0IGVuYWJsZS4gZ2VuaXJxIHdvdWxkIGFsc28gbGV0IHRoZXNlCi0JICogYml0cyBiZSBzZXQvY2xlYXJlZCBkeW5hbWljYWxseS4KLQkgKi8KLQlfX3Jhd193cml0ZWwoYmludGVuLCBncGlvX2Jhc2UgKyAweDA4KTsKLQotCXByaW50ayhLRVJOX0lORk8gIkRhVmluY2k6ICVkIGdwaW8gaXJxc1xuIiwgaXJxIC0gZ3Bpb190b19pcnEoMCkpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RkcjIuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZGRyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOWUwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RkcjIuaApAQCAtMCwwICsxLDQgQEAKKyNkZWZpbmUgRERSMl9TRFJDUl9PRkZTRVQJMHhjCisjZGVmaW5lIEREUjJfU1JQRF9CSVQJCSgxIDw8IDIzKQorI2RlZmluZSBERFIyX01DTEtTVE9QRU5fQklUCSgxIDw8IDMwKQorI2RlZmluZSBERFIyX0xQTU9ERU5fQklUCSgxIDw8IDMxKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGY4YjdlYTQuLmNmOTQ1NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTE4LDU2ICsxOCw1MCBAQAogCiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogCi0jaW5jbHVkZSA8YXNtL21lbW9yeS5oPgotCiAjaW5jbHVkZSA8bWFjaC9zZXJpYWwuaD4KIAogI2RlZmluZSBVQVJUX1NISUZUCTIKIAotI2RlZmluZSBkYXZpbmNpX3VhcnRfdjJwKHgpCSgoeCkgLSBQQUdFX09GRlNFVCArIFBMQVRfUEhZU19PRkZTRVQpCi0jZGVmaW5lIGRhdmluY2lfdWFydF9wMnYoeCkJKCh4KSAtIFBMQVRfUEhZU19PRkZTRVQgKyBQQUdFX09GRlNFVCkKLQogCQkucHVzaHNlY3Rpb24gLmRhdGEKIGRhdmluY2lfdWFydF9waHlzOgkud29yZAkwCiBkYXZpbmNpX3VhcnRfdmlydDoJLndvcmQJMAogCQkucG9wc2VjdGlvbgogCi0JCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAogCQkvKiBVc2UgZGF2aW5jaV91YXJ0X3BoeXMvdmlydCBpZiBhbHJlYWR5IGNvbmZpZ3VyZWQgKi8KLTEwOgkJbXJjCXAxNSwgMCwgXHJwLCBjMSwgYzAKLQkJdHN0CVxycCwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQlsZHJlcQlccnAsID1kYXZpbmNpX3VhcnRfdjJwKGRhdmluY2lfdWFydF9waHlzKQotCQlsZHJuZQlccnAsID1kYXZpbmNpX3VhcnRfcGh5cwotCQlhZGQJXHJ2LCBccnAsICM0CQlAIGRhdmluY2lfdWFydF92aXJ0Ci0JCWxkcglccnAsIFtccnAsICMwXQotCQlsZHIJXHJ2LCBbXHJ2LCAjMF0KKzEwOgkJYWRyCVxycCwgOTlmCQlAIGdldCBlZmZlY3RpdmUgYWRkciBvZiA5OWYKKwkJbGRyCVxydiwgW1xycF0JCUAgZ2V0IGFic29sdXRlIGFkZHIgb2YgOTlmCisJCXN1YglccnYsIFxydiwgXHJwCQlAIG9mZnNldCBiZXR3ZWVuIHRoZSB0d28KKwkJbGRyCVxycCwgW1xycCwgIzRdCQlAIGFicyBhZGRyIG9mIG9tYXBfdWFydF9waHlzCisJCXN1YglcdG1wLCBccnAsIFxydgkJQCBtYWtlIGl0IGVmZmVjdGl2ZQorCQlsZHIJXHJwLCBbXHRtcCwgIzBdCQlAIGRhdmluY2lfdWFydF9waHlzCisJCWxkcglccnYsIFtcdG1wLCAjNF0JCUAgZGF2aW5jaV91YXJ0X3ZpcnQKIAkJY21wCVxycCwgIzAJCQlAIGlzIHBvcnQgY29uZmlndXJlZD8KIAkJY21wbmUJXHJ2LCAjMAotCQlibmUJOTlmCQkJQCBhbHJlYWR5IGNvbmZpZ3VyZWQKKwkJYm5lCTEwMGYJCQlAIGFscmVhZHkgY29uZmlndXJlZAogCiAJCS8qIENoZWNrIHRoZSBkZWJ1ZyBVQVJUIGFkZHJlc3Mgc2V0IGluIHVuY29tcHJlc3MuaCAqLwotCQltcmMJcDE1LCAwLCBccnAsIGMxLCBjMAotCQl0c3QJXHJwLCAjMQkJCUAgTU1VIGVuYWJsZWQ/CisJCWFuZAlccnAsIHBjLCAjMHhmZjAwMDAwMAorCQlsZHIJXHJ2LCA9REFWSU5DSV9VQVJUX0lORk9fT0ZTCisJCWFkZAlccnAsIFxycCwgXHJ2CiAKIAkJLyogQ29weSB1YXJ0IHBoeXMgYWRkcmVzcyBmcm9tIGRlY29tcHJlc3NvciB1YXJ0IGluZm8gKi8KLQkJbGRyZXEJXHJ2LCA9ZGF2aW5jaV91YXJ0X3YycChkYXZpbmNpX3VhcnRfcGh5cykKLQkJbGRybmUJXHJ2LCA9ZGF2aW5jaV91YXJ0X3BoeXMKLQkJbGRyZXEJXHJwLCA9REFWSU5DSV9VQVJUX0lORk8KLQkJbGRybmUJXHJwLCA9ZGF2aW5jaV91YXJ0X3AydihEQVZJTkNJX1VBUlRfSU5GTykKLQkJbGRyCVxycCwgW1xycCwgIzBdCi0JCXN0cglccnAsIFtccnZdCisJCWxkcglccnYsIFtccnAsICMwXQorCQlzdHIJXHJ2LCBbXHRtcCwgIzBdCiAKIAkJLyogQ29weSB1YXJ0IHZpcnQgYWRkcmVzcyBmcm9tIGRlY29tcHJlc3NvciB1YXJ0IGluZm8gKi8KLQkJbGRyZXEJXHJ2LCA9ZGF2aW5jaV91YXJ0X3YycChkYXZpbmNpX3VhcnRfdmlydCkKLQkJbGRybmUJXHJ2LCA9ZGF2aW5jaV91YXJ0X3ZpcnQKLQkJbGRyZXEJXHJwLCA9REFWSU5DSV9VQVJUX0lORk8KLQkJbGRybmUJXHJwLCA9ZGF2aW5jaV91YXJ0X3AydihEQVZJTkNJX1VBUlRfSU5GTykKLQkJbGRyCVxycCwgW1xycCwgIzRdCi0JCXN0cglccnAsIFtccnZdCisJCWxkcglccnYsIFtccnAsICM0XQorCQlzdHIJXHJ2LCBbXHRtcCwgIzRdCiAKIAkJYgkxMGIKLTk5OgorCisJCS5hbGlnbgorOTk6CQkud29yZAkuCisJCS53b3JkCWRhdmluY2lfdWFydF9waHlzCisJCS5sdG9yZworCisxMDA6CiAJCS5lbmRtCiAKIAkJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8tZGF2aW5jaS5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLWRhdmluY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmRkMWZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLWRhdmluY2kuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogVEkgRGFWaW5jaSBHUElPIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGF2aWQgQnJvd25lbGwKKyAqIENvcHlyaWdodCAoYykgMjAwNywgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmCV9fREFWSU5DSV9EQVZJTkNJX0dQSU9fSAorI2RlZmluZQlfX0RBVklOQ0lfREFWSU5DSV9HUElPX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisKKyNkZWZpbmUgREFWSU5DSV9HUElPX0JBU0UgMHgwMUM2NzAwMAorCitlbnVtIGRhdmluY2lfZ3Bpb190eXBlIHsKKwlHUElPX1RZUEVfREFWSU5DSSA9IDAsCisJR1BJT19UWVBFX1RORVRWMTA3WCwKK307CisKKy8qCisgKiBiYXNpYyBncGlvIHJvdXRpbmVzCisgKgorICogYm9hcmQtc3BlY2lmaWMgaW5pdCBzaG91bGQgYmUgZG9uZSBieSBhcmNoLy4uLi8uLi4vYm9hcmQtWFhYLmMgKG1heWJlCisgKiBpbml0aWFsaXppbmcgYmFua3MgdG9nZXRoZXIpIHJhdGhlciB0aGFuIGJvb3QgbG9hZGVyczsga2V4ZWMoKSB3b24ndAorICogZ28gdGhyb3VnaCBib290IGxvYWRlcnMuCisgKgorICogdGhlIGdwaW8gY2xvY2sgd2lsbCBiZSB0dXJuZWQgb24gd2hlbiBncGlvcyBhcmUgdXNlZCwgYW5kIHlvdSBtYXkgYWxzbworICogbmVlZCB0byBwYXkgYXR0ZW50aW9uIHRvIFBJTk1VWCByZWdpc3RlcnMgdG8gYmUgc3VyZSB0aG9zZSBwaW5zIGFyZQorICogdXNlZCBhcyBncGlvcywgbm90IHdpdGggb3RoZXIgcGVyaXBoZXJhbHMuCisgKgorICogT24tY2hpcCBHUElPcyBhcmUgbnVtYmVyZWQgMC4uKERBVklOQ0lfTl9HUElPLTEpLiAgRm9yIGRvY3VtZW50YXRpb24sCisgKiBhbmQgbWF5YmUgZm9yIGxhdGVyIHVwZGF0ZXMsIGNvZGUgbWF5IHdyaXRlIEdQSU8oTikuICBUaGVzZSBtYXkgYmUKKyAqIGFsbCAxLjhWIHNpZ25hbHMsIGFsbCAzLjNWIG9uZXMsIG9yIGEgbWl4IG9mIHRoZSB0d28uICBBIGdpdmVuIGNoaXAKKyAqIG1heSBub3Qgc3VwcG9ydCBhbGwgdGhlIEdQSU9zIGluIHRoYXQgcmFuZ2UuCisgKgorICogR1BJT3MgY2FuIGFsc28gYmUgb24gZXh0ZXJuYWwgY2hpcHMsIG51bWJlcmVkIGFmdGVyIHRoZSBvbmVzIGJ1aWx0LWluCisgKiB0byB0aGUgRGFWaW5jaSBjaGlwLiAgRm9yIG5vdywgdGhleSB3b24ndCBiZSB1c2FibGUgYXMgSVJRIHNvdXJjZXMuCisgKi8KKyNkZWZpbmUJR1BJTyhYKQkJKFgpCQkvKiAwIDw9IFggPD0gKERBVklOQ0lfTl9HUElPIC0gMSkgKi8KKworLyogQ29udmVydCBHUElPIHNpZ25hbCB0byBHUElPIHBpbiBudW1iZXIgKi8KKyNkZWZpbmUgR1BJT19UT19QSU4oYmFuaywgZ3BpbykJKDE2ICogKGJhbmspICsgKGdwaW8pKQorCitzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgeworCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKKwlpbnQJCQlpcnFfYmFzZTsKKwlzcGlubG9ja190CQlsb2NrOworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJdm9pZCBfX2lvbWVtCQkqc2V0X2RhdGE7CisJdm9pZCBfX2lvbWVtCQkqY2xyX2RhdGE7CisJdm9pZCBfX2lvbWVtCQkqaW5fZGF0YTsKK307CisKKy8qIFRoZSBfX2dwaW9fdG9fY29udHJvbGxlcigpIGFuZCBfX2dwaW9fbWFzaygpIGZ1bmN0aW9ucyBpbmxpbmUgdG8gY29uc3RhbnRzCisgKiB3aXRoIGNvbnN0YW50IHBhcmFtZXRlcnM7IG9yIGluIG91dGxpbmVkIGNvZGUgdGhleSBleGVjdXRlIGF0IHJ1bnRpbWUuCisgKgorICogWW91J2QgYWNjZXNzIHRoZSBjb250cm9sbGVyIGRpcmVjdGx5IHdoZW4gcmVhZGluZyBvciB3cml0aW5nIG1vcmUgdGhhbgorICogb25lIGdwaW8gdmFsdWUgYXQgYSB0aW1lLCBhbmQgdG8gc3VwcG9ydCB3aXJlZCBsb2dpYyB3aGVyZSB0aGUgdmFsdWUKKyAqIGJlaW5nIGRyaXZlbiBieSB0aGUgY3B1IG5lZWQgbm90IG1hdGNoIHRoZSB2YWx1ZSByZWFkIGJhY2suCisgKgorICogVGhlc2UgYXJlIE5PVCBwYXJ0IG9mIHRoZSBjcm9zcy1wbGF0Zm9ybSBHUElPIGludGVyZmFjZQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqCitfX2dwaW9fdG9fY29udHJvbGxlcih1bnNpZ25lZCBncGlvKQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqY3RscnMgPSBkYXZpbmNpX3NvY19pbmZvLmdwaW9fY3RscnM7CisJaW50IGluZGV4ID0gZ3BpbyAvIDMyOworCisJaWYgKCFjdGxycyB8fCBpbmRleCA+PSBkYXZpbmNpX3NvY19pbmZvLmdwaW9fY3RscnNfbnVtKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBjdGxycyArIGluZGV4OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBfX2dwaW9fbWFzayh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiAxIDw8IChncGlvICUgMzIpOworfQorCisjZW5kaWYJLyogX19EQVZJTkNJX0RBVklOQ0lfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGZiZWNlMTIuLjk2MGU5ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xMyw4MCArMTMsMTIgQEAKICNpZm5kZWYJX19EQVZJTkNJX0dQSU9fSAogI2RlZmluZQlfX0RBVklOQ0lfR1BJT19ICiAKLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2RlZmluZSBfX0FSTV9HUElPTElCX0NPTVBMRVgKIAotI2RlZmluZSBEQVZJTkNJX0dQSU9fQkFTRSAweDAxQzY3MDAwCi0KLWVudW0gZGF2aW5jaV9ncGlvX3R5cGUgewotCUdQSU9fVFlQRV9EQVZJTkNJID0gMCwKLQlHUElPX1RZUEVfVE5FVFYxMDdYLAotfTsKLQotLyoKLSAqIGJhc2ljIGdwaW8gcm91dGluZXMKLSAqCi0gKiBib2FyZC1zcGVjaWZpYyBpbml0IHNob3VsZCBiZSBkb25lIGJ5IGFyY2gvLi4uLy4uLi9ib2FyZC1YWFguYyAobWF5YmUKLSAqIGluaXRpYWxpemluZyBiYW5rcyB0b2dldGhlcikgcmF0aGVyIHRoYW4gYm9vdCBsb2FkZXJzOyBrZXhlYygpIHdvbid0Ci0gKiBnbyB0aHJvdWdoIGJvb3QgbG9hZGVycy4KLSAqCi0gKiB0aGUgZ3BpbyBjbG9jayB3aWxsIGJlIHR1cm5lZCBvbiB3aGVuIGdwaW9zIGFyZSB1c2VkLCBhbmQgeW91IG1heSBhbHNvCi0gKiBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gUElOTVVYIHJlZ2lzdGVycyB0byBiZSBzdXJlIHRob3NlIHBpbnMgYXJlCi0gKiB1c2VkIGFzIGdwaW9zLCBub3Qgd2l0aCBvdGhlciBwZXJpcGhlcmFscy4KLSAqCi0gKiBPbi1jaGlwIEdQSU9zIGFyZSBudW1iZXJlZCAwLi4oREFWSU5DSV9OX0dQSU8tMSkuICBGb3IgZG9jdW1lbnRhdGlvbiwKLSAqIGFuZCBtYXliZSBmb3IgbGF0ZXIgdXBkYXRlcywgY29kZSBtYXkgd3JpdGUgR1BJTyhOKS4gIFRoZXNlIG1heSBiZQotICogYWxsIDEuOFYgc2lnbmFscywgYWxsIDMuM1Ygb25lcywgb3IgYSBtaXggb2YgdGhlIHR3by4gIEEgZ2l2ZW4gY2hpcAotICogbWF5IG5vdCBzdXBwb3J0IGFsbCB0aGUgR1BJT3MgaW4gdGhhdCByYW5nZS4KLSAqCi0gKiBHUElPcyBjYW4gYWxzbyBiZSBvbiBleHRlcm5hbCBjaGlwcywgbnVtYmVyZWQgYWZ0ZXIgdGhlIG9uZXMgYnVpbHQtaW4KLSAqIHRvIHRoZSBEYVZpbmNpIGNoaXAuICBGb3Igbm93LCB0aGV5IHdvbid0IGJlIHVzYWJsZSBhcyBJUlEgc291cmNlcy4KLSAqLwotI2RlZmluZQlHUElPKFgpCQkoWCkJCS8qIDAgPD0gWCA8PSAoREFWSU5DSV9OX0dQSU8gLSAxKSAqLwotCi0vKiBDb252ZXJ0IEdQSU8gc2lnbmFsIHRvIEdQSU8gcGluIG51bWJlciAqLwotI2RlZmluZSBHUElPX1RPX1BJTihiYW5rLCBncGlvKQkoMTYgKiAoYmFuaykgKyAoZ3BpbykpCi0KLXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciB7Ci0Jc3RydWN0IGdwaW9fY2hpcAljaGlwOwotCWludAkJCWlycV9iYXNlOwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jdm9pZCBfX2lvbWVtCQkqcmVnczsKLQl2b2lkIF9faW9tZW0JCSpzZXRfZGF0YTsKLQl2b2lkIF9faW9tZW0JCSpjbHJfZGF0YTsKLQl2b2lkIF9faW9tZW0JCSppbl9kYXRhOwotfTsKLQotLyogVGhlIF9fZ3Bpb190b19jb250cm9sbGVyKCkgYW5kIF9fZ3Bpb19tYXNrKCkgZnVuY3Rpb25zIGlubGluZSB0byBjb25zdGFudHMKLSAqIHdpdGggY29uc3RhbnQgcGFyYW1ldGVyczsgb3IgaW4gb3V0bGluZWQgY29kZSB0aGV5IGV4ZWN1dGUgYXQgcnVudGltZS4KLSAqCi0gKiBZb3UnZCBhY2Nlc3MgdGhlIGNvbnRyb2xsZXIgZGlyZWN0bHkgd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgbW9yZSB0aGFuCi0gKiBvbmUgZ3BpbyB2YWx1ZSBhdCBhIHRpbWUsIGFuZCB0byBzdXBwb3J0IHdpcmVkIGxvZ2ljIHdoZXJlIHRoZSB2YWx1ZQotICogYmVpbmcgZHJpdmVuIGJ5IHRoZSBjcHUgbmVlZCBub3QgbWF0Y2ggdGhlIHZhbHVlIHJlYWQgYmFjay4KLSAqCi0gKiBUaGVzZSBhcmUgTk9UIHBhcnQgb2YgdGhlIGNyb3NzLXBsYXRmb3JtIEdQSU8gaW50ZXJmYWNlCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICoKLV9fZ3Bpb190b19jb250cm9sbGVyKHVuc2lnbmVkIGdwaW8pCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICpjdGxycyA9IGRhdmluY2lfc29jX2luZm8uZ3Bpb19jdGxyczsKLQlpbnQgaW5kZXggPSBncGlvIC8gMzI7Ci0KLQlpZiAoIWN0bHJzIHx8IGluZGV4ID49IGRhdmluY2lfc29jX2luZm8uZ3Bpb19jdGxyc19udW0pCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGN0bHJzICsgaW5kZXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIF9fZ3Bpb19tYXNrKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIDEgPDwgKGdwaW8gJSAzMik7Ci19CisvKiBUaGUgaW5saW5lIHZlcnNpb25zIHVzZSB0aGUgc3RhdGljIGlubGluZXMgaW4gdGhlIGRyaXZlciBoZWFkZXIgKi8KKyNpbmNsdWRlICJncGlvLWRhdmluY2kuaCIKIAogLyoKICAqIFRoZSBnZXQvc2V0L2NsZWFyIGZ1bmN0aW9ucyB3aWxsIGlubGluZSB3aGVuIGNhbGxlZCB3aXRoIGNvbnN0YW50CkBAIC0xNDcsMTEgKzc5LDYgQEAKIAkJcmV0dXJuIF9fZ3Bpb19jYW5zbGVlcChncGlvKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gX19ncGlvX3RvX2lycShncGlvKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQogewogCS8qIGRvbid0IHN1cHBvcnQgdGhlIHJldmVyc2UgbWFwcGluZyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NzMxOTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBEYVZpbmNpIG1lbW9yeSBzcGFjZSBkZWZpbml0aW9ucwotICoKLSAqIEF1dGhvcjogS2V2aW4gSGlsbWFuLCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqCi0gKiAyMDA3IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgotICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQotICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLgotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVkIEZpbGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBEQVZJTkNJX0REUl9CQVNFCTB4ODAwMDAwMDAKLSNkZWZpbmUgREE4WFhfRERSX0JBU0UJCTB4YzAwMDAwMDAKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfREFWSU5DSV9EQThYWCkgJiYgZGVmaW5lZChDT05GSUdfQVJDSF9EQVZJTkNJX0RNeCkKLSNlcnJvciBDYW5ub3QgZW5hYmxlIERhVmluY2kgYW5kIERBOFhYIHBsYXRmb3JtcyBjb25jdXJyZW50bHkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfREFWSU5DSV9EQThYWCkKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVCBEQThYWF9ERFJfQkFTRQotI2Vsc2UKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVCBEQVZJTkNJX0REUl9CQVNFCi0jZW5kaWYKLQotI2RlZmluZSBERFIyX1NEUkNSX09GRlNFVAkweGMKLSNkZWZpbmUgRERSMl9TUlBEX0JJVAkJQklUKDIzKQotI2RlZmluZSBERFIyX01DTEtTVE9QRU5fQklUCUJJVCgzMCkKLSNkZWZpbmUgRERSMl9MUE1PREVOX0JJVAlCSVQoMzEpCi0KLS8qCi0gKiBJbmNyZWFzZSBzaXplIG9mIERNQS1jb25zaXN0ZW50IG1lbW9yeSByZWdpb24KLSAqLwotI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFICgxNDw8MjApCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL21tYy5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tbWMuaAppbmRleCBkNGYxZTk2Li41YmE2YjIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL21tYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbW1jLmgKQEAgLTEyLDYgKzEyLDkgQEAKIAkvKiBnZXRfY2QoKS9nZXRfd3AoKSBtYXkgc2xlZXAgKi8KIAlpbnQJKCpnZXRfY2QpKGludCBtb2R1bGUpOwogCWludAkoKmdldF9ybykoaW50IG1vZHVsZSk7CisKKwl2b2lkCSgqc2V0X3Bvd2VyKShpbnQgbW9kdWxlLCBib29sIG9uKTsKKwogCS8qIHdpcmVzID09IDAgaXMgZXF1aXZhbGVudCB0byB3aXJlcyA9PSA0ICg0LWJpdCBwYXJhbGxlbCkgKi8KIAl1OAl3aXJlczsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tdXguaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbXV4LmgKaW5kZXggNWQ0ZTBmZS4uYTdlOTJmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tdXguaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL211eC5oCkBAIC04NTcsNiArODU3LDE0IEBACiAJREE4NTBfTU1DU0QwX0NMSywKIAlEQTg1MF9NTUNTRDBfQ01ELAogCisJLyogTU1DL1NEMSBmdW5jdGlvbiAqLworCURBODUwX01NQ1NEMV9EQVRfMCwKKwlEQTg1MF9NTUNTRDFfREFUXzEsCisJREE4NTBfTU1DU0QxX0RBVF8yLAorCURBODUwX01NQ1NEMV9EQVRfMywKKwlEQTg1MF9NTUNTRDFfQ0xLLAorCURBODUwX01NQ1NEMV9DTUQsCisKIAkvKiBFTUlGMi41L0VNSUZBIGZ1bmN0aW9uICovCiAJREE4NTBfRU1BX0RfNywKIAlEQTg1MF9FTUFfRF82LApAQCAtOTE2LDYgKzkyNCw4IEBACiAJREE4NTBfR1BJTzNfMTMsCiAJREE4NTBfR1BJTzRfMCwKIAlEQTg1MF9HUElPNF8xLAorCURBODUwX0dQSU82XzksCisJREE4NTBfR1BJTzZfMTAsCiAJREE4NTBfR1BJTzZfMTMsCiAJREE4NTBfUlRDX0FMQVJNLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbmFuZC5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9uYW5kLmgKaW5kZXggMDI1MTUxMC4uMWNmNTU1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9uYW5kLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9uYW5kLmgKQEAgLTc0LDggKzc0LDEwIEBACiAJbmFuZF9lY2NfbW9kZXNfdAllY2NfbW9kZTsKIAl1OAkJCWVjY19iaXRzOwogCi0JLyogZS5nLiBOQU5EX0JVU1dJRFRIXzE2IG9yIE5BTkRfVVNFX0ZMQVNIX0JCVCAqLworCS8qIGUuZy4gTkFORF9CVVNXSURUSF8xNiAqLwogCXVuc2lnbmVkCQlvcHRpb25zOworCS8qIGUuZy4gTkFORF9CQlRfVVNFX0ZMQVNIICovCisJdW5zaWduZWQJCWJidF9vcHRpb25zOwogCiAJLyogTWFpbiBhbmQgbWlycm9yIGJidCBkZXNjcmlwdG9yIG92ZXJyaWRlcyAqLwogCXN0cnVjdCBuYW5kX2JidF9kZXNjcgkqYmJ0X3RkOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9zZXJpYWwuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvc2VyaWFsLmgKaW5kZXggYzllNmNlMS4uZTM0N2Q4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9zZXJpYWwuaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3NlcmlhbC5oCkBAIC0yMSw4ICsyMSw5IEBACiAgKiBtYWNyb3MgaW4gZGVidWctbWFjcm8uUy4KICAqCiAgKiBUaGlzIGFyZWEgc2l0cyBqdXN0IGJlbG93IHRoZSBwYWdlIHRhYmxlcyAoc2VlIGFyY2gvYXJtL2tlcm5lbC9oZWFkLlMpLgorICogV2UgZGVmaW5lIGl0IGFzIGEgcmVsYXRpdmUgb2Zmc2V0IGZyb20gc3RhcnQgb2YgdXNhYmxlIFJBTS4KICAqLwotI2RlZmluZSBEQVZJTkNJX1VBUlRfSU5GTwkoUExBVF9QSFlTX09GRlNFVCArIDB4M2ZmOCkKKyNkZWZpbmUgREFWSU5DSV9VQVJUX0lORk9fT0ZTCTB4M2ZmOAogCiAjZGVmaW5lIERBVklOQ0lfVUFSVDBfQkFTRQkoSU9fUEhZUyArIDB4MjAwMDApCiAjZGVmaW5lIERBVklOQ0lfVUFSVDFfQkFTRQkoSU9fUEhZUyArIDB4MjA0MDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IDc4ZDgwNjguLjlkYzdjZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCkBAIC00Myw3ICs0MywxMiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3VhcnRfaW5mbyh1MzIgcGh5cywgdm9pZCAqIF9faW9tZW0gdmlydCkKIHsKLQl1MzIgKnVhcnRfaW5mbyA9ICh1MzIgKikoREFWSU5DSV9VQVJUX0lORk8pOworCS8qCisJICogR2V0IGFkZHJlc3Mgb2Ygc29tZS5ic3MgdmFyaWFibGUgYW5kIHJvdW5kIGl0IGRvd24KKwkgKiBhIGxhIENPTkZJR19BVVRPX1pSRUxBRERSLgorCSAqLworCXUzMiByYW1fc3RhcnQgPSAodTMyKSZ1YXJ0ICYgMHhmODAwMDAwMDsKKwl1MzIgKnVhcnRfaW5mbyA9ICh1MzIgKikocmFtX3N0YXJ0ICsgREFWSU5DSV9VQVJUX0lORk9fT0ZTKTsKIAogCXVhcnQgPSAodTMyICopcGh5czsKIAl1YXJ0X2luZm9bMF0gPSBwaHlzOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3NsZWVwLlMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvc2xlZXAuUwppbmRleCA1ZjFlMDQ1Li5kNGU5MzE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvc2xlZXAuUworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvc2xlZXAuUwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8bWFjaC9wc2MuaD4KLSNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgorI2luY2x1ZGUgPG1hY2gvZGRyMi5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3RuZXR2MTA3eC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3RuZXR2MTA3eC5jCmluZGV4IDFiMjhmZGQuLjQwOWJiODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS90bmV0djEwN3guYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvdG5ldHYxMDd4LmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpAQCAtMjcsOSArMjgsOSBAQAogI2luY2x1ZGUgPG1hY2gvcHNjLmg+CiAjaW5jbHVkZSA8bWFjaC9jcF9pbnRjLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvdG5ldHYxMDd4Lmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWRhdmluY2kuaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAibXV4LmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvY20tYTUxMC5jIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL2NtLWE1MTAuYwppbmRleCAwM2UxMWY5Li5jOGE0MDZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRvdmUvY20tYTUxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZG92ZS9jbS1hNTEwLmMKQEAgLTg3LDcgKzg3LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChDTV9BNTEwLCAiQ29tcHVsYWIgQ00tQTUxMCBCb2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gY21fYTUxMF9pbml0LAogCS5tYXBfaW8JCT0gZG92ZV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBkb3ZlX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvZG92ZS1kYi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL2RvdmUtZGItc2V0dXAuYwppbmRleCAyYWMzNGVjLi4xMWVhMzRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRvdmUvZG92ZS1kYi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZG92ZS9kb3ZlLWRiLXNldHVwLmMKQEAgLTk0LDcgKzk0LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChET1ZFX0RCLCAiTWFydmVsbCBEQi1NVjg4QVA1MTAtQlAgRGV2ZWxvcG1lbnQgQm9hcmQiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGRvdmVfZGJfaW5pdCwKIAkubWFwX2lvCQk9IGRvdmVfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZG92ZV9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kb3ZlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGRhOGJmMmIuLjU5MjljYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZG92ZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWRvdmUvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2JyaWRnZS1yZWdzLmg+CiAKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAlsZHIJXHJwLCA9RE9WRV9TQl9SRUdTX1BIWVNfQkFTRQogCWxkcglccnYsID1ET1ZFX1NCX1JFR1NfVklSVF9CQVNFCiAJb3JyCVxycCwgXHJwLCAjMHgwMDAxMjAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kb3ZlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtZG92ZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzkzZmUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1kb3ZlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWRvdmUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jCmluZGV4IDA4N2JjNzcuLmQwY2U4YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYwpAQCAtMjgwLDcgKzI4MCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoRUJTQTExMCwgIkVCU0ExMTAiKQogCS8qIE1haW50YWluZXI6IFJ1c3NlbGwgS2luZyAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDA0MDAsCisJLmF0YWdfb2Zmc2V0CT0gMHg0MDAsCiAJLnJlc2VydmVfbHAwCT0gMSwKIAkucmVzZXJ2ZV9scDIJPSAxLAogCS5zb2Z0X3JlYm9vdAk9IDEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggN2VmNTY5MC4uYmIwMmMwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICoqLwogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbW92CVxycCwgIzB4ZjAwMDAwMDAKIAkJb3JyCVxycCwgXHJwLCAjMHgwMDAwMGJlMAogCQltb3YJXHJwLCBccnYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9LY29uZmlnCmluZGV4IDNhMDhiMTguLjk3YTI0OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvS2NvbmZpZwpAQCAtMTgyLDYgKzE4MiwxMyBAQAogCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCiAJICBUZWNobm9sb2dpYyBTeXN0ZW1zIFRTLTcyeHggYm9hcmQuCiAKK2NvbmZpZyBNQUNIX1ZJU0lPTl9FUDkzMDcKKwlib29sICJTdXBwb3J0IFZpc2lvbiBFbmdyYXZpbmcgU3lzdGVtcyBFUDkzMDcgU29NIgorCWRlcGVuZHMgb24gRVA5M1hYX1NEQ0UwX1BIWVNfT0ZGU0VUCisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCisJICBWaXNpb24gRW5ncmF2aW5nIFN5c3RlbXMgRVA5MzA3IFNvTS4KKwogY2hvaWNlCiAJcHJvbXB0ICJTZWxlY3QgYSBVQVJUIGZvciBlYXJseSBrZXJuZWwgbWVzc2FnZXMiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvTWFrZWZpbGUKaW5kZXggM2NlZGNmMi4uNTc0MjA5ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlCkBAIC0xNSwzICsxNSw0IEBACiBvYmotJChDT05GSUdfTUFDSF9TSU1fT05FKQkrPSBzaW1vbmUubwogb2JqLSQoQ09ORklHX01BQ0hfU05BUFBFUl9DTDE1KQkrPSBzbmFwcGVyY2wxNS5vCiBvYmotJChDT05GSUdfTUFDSF9UUzcyWFgpCSs9IHRzNzJ4eC5vCitvYmotJChDT05GSUdfTUFDSF9WSVNJT05fRVA5MzA3KSs9IHZpc2lvbl9lcDkzMDcubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvYWRzc3BoZXJlLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9hZHNzcGhlcmUuYwppbmRleCA2MWI5OGNlLi4wNzEzNDQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9hZHNzcGhlcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9hZHNzcGhlcmUuYwpAQCAtMzMsNyArMzMsNyBAQAogCiBNQUNISU5FX1NUQVJUKEFEU1NQSEVSRSwgIkFEUyBTcGhlcmUgYm9hcmQiKQogCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQyArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKaW5kZXggYzYwZjA4MS4uMjQzMmE2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwpAQCAtMzMsMTEgKzMzLDEzIEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogI2luY2x1ZGUgPG1hY2gvZXA5M3h4X2tleXBhZC5oPgogI2luY2x1ZGUgPG1hY2gvZXA5M3h4X3NwaS5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1lcDkzeHguaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzeHguYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzeHguYwppbmRleCA5OTY5YmIxLi43MGVmOGM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5M3h4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTN4eC5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZmIuaD4KICNpbmNsdWRlIDxtYWNoL2VwOTN4eF9zcGkuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZXA5M3h4Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTE1OSw2ICsxNjAsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFREI5M3h4IEkyUwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlZGI5M3h4X2F1ZGlvX2RldmljZSA9IHsKKwkubmFtZQkJPSAiZWRiOTN4eC1hdWRpbyIsCisJLmlkCQk9IC0xLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgZWRiOTN4eF9oYXNfYXVkaW8odm9pZCkKIHsKIAlyZXR1cm4gKG1hY2hpbmVfaXNfZWRiOTMwMSgpIHx8IG1hY2hpbmVfaXNfZWRiOTMwMigpIHx8CkBAIC0xNzAsNiArMTc2LDcgQEAKIHsKIAlpZiAoZWRiOTN4eF9oYXNfYXVkaW8oKSkgewogCQllcDkzeHhfcmVnaXN0ZXJfaTJzKCk7CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWRiOTN4eF9hdWRpb19kZXZpY2UpOwogCX0KIH0KIApAQCAtMjQwLDcgKzI0Nyw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfRURCOTMwMQogTUFDSElORV9TVEFSVChFREI5MzAxLCAiQ2lycnVzIExvZ2ljIEVEQjkzMDEgRXZhbHVhdGlvbiBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKQEAgLTI1MSw3ICsyNTgsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX0VEQjkzMDIKIE1BQ0hJTkVfU1RBUlQoRURCOTMwMiwgIkNpcnJ1cyBMb2dpYyBFREI5MzAyIEV2YWx1YXRpb24gQm9hcmQiKQogCS8qIE1haW50YWluZXI6IEdlb3JnZSBLYXNocGVya28gPGdlb3JnZUBjaGFzLmNvbS51YT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApAQCAtMjYyLDcgKzI2OSw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfRURCOTMwMkEKIE1BQ0hJTkVfU1RBUlQoRURCOTMwMkEsICJDaXJydXMgTG9naWMgRURCOTMwMkEgRXZhbHVhdGlvbiBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UwX1BIWVNfQkFTRSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCkBAIC0yNzMsNyArMjgwLDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9FREI5MzA3CiBNQUNISU5FX1NUQVJUKEVEQjkzMDcsICJDaXJydXMgTG9naWMgRURCOTMwNyBFdmFsdWF0aW9uIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApAQCAtMjg0LDcgKzI5MSw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfRURCOTMwN0EKIE1BQ0hJTkVfU1RBUlQoRURCOTMwN0EsICJDaXJydXMgTG9naWMgRURCOTMwN0EgRXZhbHVhdGlvbiBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UwX1BIWVNfQkFTRSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCkBAIC0yOTUsNyArMzAyLDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9FREI5MzEyCiBNQUNISU5FX1NUQVJUKEVEQjkzMTIsICJDaXJydXMgTG9naWMgRURCOTMxMiBFdmFsdWF0aW9uIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBUb3VmZWVxIEh1c3NhaW4gPHRvdWZlZXFfaHVzc2FpbkBpbmZvc3lzLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApAQCAtMzA2LDcgKzMxMyw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfRURCOTMxNQogTUFDSElORV9TVEFSVChFREI5MzE1LCAiQ2lycnVzIExvZ2ljIEVEQjkzMTUgRXZhbHVhdGlvbiBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKQEAgLTMxNyw3ICszMjQsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX0VEQjkzMTVBCiBNQUNISU5FX1NUQVJUKEVEQjkzMTVBLCAiQ2lycnVzIExvZ2ljIEVEQjkzMTVBIEV2YWx1YXRpb24gQm9hcmQiKQogCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFMF9QSFlTX0JBU0UgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ2VzYmM5MzEyLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYwppbmRleCA5YmQzMTUyLi40NWVlMjA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYwpAQCAtMzMsNyArMzMsNyBAQAogCiBNQUNISU5FX1NUQVJUKEdFU0JDOTMxMiwgIkdsb21hdGlvbiBHRVNCQy05MzEyLXN4IikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBiMjViYzkwNy4uYWY1NGU0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTExLDcgKzExLDcgQEAKICAqLwogI2luY2x1ZGUgPG1hY2gvZXA5M3h4LXJlZ3MuaD4KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCWxkcglccnAsID1FUDkzWFhfQVBCX1BIWVNfQkFTRQlAIFBoeXNpY2FsIGJhc2UKIAkJbGRyCVxydiwgPUVQOTNYWF9BUEJfVklSVF9CQVNFCUAgdmlydHVhbCBiYXNlCiAJCW9ycglccnAsIFxycCwgIzB4MDAwYzAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9ncGlvLWVwOTN4eC5oIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8tZXA5M3h4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmZjJlYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9ncGlvLWVwOTN4eC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiBJbmNsdWRlIGZpbGUgZm9yIHRoZSBFUDkzWFggR1BJTyBjb250cm9sbGVyIG1hY2hpbmUgc3BlY2lmaWNzICovCisKKyNpZm5kZWYgX19HUElPX0VQOTNYWF9ICisjZGVmaW5lIF9fR1BJT19FUDkzWFhfSAorCisvKiBHUElPIHBvcnQgQS4gICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQSh4KQkJKCh4KSArIDApCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8wCQlFUDkzWFhfR1BJT19MSU5FX0EoMCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzEJCUVQOTNYWF9HUElPX0xJTkVfQSgxKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMgkJRVA5M1hYX0dQSU9fTElORV9BKDIpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8zCQlFUDkzWFhfR1BJT19MSU5FX0EoMykKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzQJCUVQOTNYWF9HUElPX0xJTkVfQSg0KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPNQkJRVA5M1hYX0dQSU9fTElORV9BKDUpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU82CQlFUDkzWFhfR1BJT19MSU5FX0EoNikKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzcJCUVQOTNYWF9HUElPX0xJTkVfQSg3KQorCisvKiBHUElPIHBvcnQgQi4gICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQih4KQkJKCh4KSArIDgpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU84CQlFUDkzWFhfR1BJT19MSU5FX0IoMCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzkJCUVQOTNYWF9HUElPX0xJTkVfQigxKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMTAJRVA5M1hYX0dQSU9fTElORV9CKDIpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8xMQlFUDkzWFhfR1BJT19MSU5FX0IoMykKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzEyCUVQOTNYWF9HUElPX0xJTkVfQig0KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMTMJRVA5M1hYX0dQSU9fTElORV9CKDUpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8xNAlFUDkzWFhfR1BJT19MSU5FX0IoNikKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzE1CUVQOTNYWF9HUElPX0xJTkVfQig3KQorCisvKiBHUElPIHBvcnQgQy4gICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQyh4KQkJKCh4KSArIDQwKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzAJCUVQOTNYWF9HUElPX0xJTkVfQygwKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzEJCUVQOTNYWF9HUElPX0xJTkVfQygxKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzIJCUVQOTNYWF9HUElPX0xJTkVfQygyKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzMJCUVQOTNYWF9HUElPX0xJTkVfQygzKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzQJCUVQOTNYWF9HUElPX0xJTkVfQyg0KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzUJCUVQOTNYWF9HUElPX0xJTkVfQyg1KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzYJCUVQOTNYWF9HUElPX0xJTkVfQyg2KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzcJCUVQOTNYWF9HUElPX0xJTkVfQyg3KQorCisvKiBHUElPIHBvcnQgRC4gICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRCh4KQkJKCh4KSArIDI0KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDAJCUVQOTNYWF9HUElPX0xJTkVfRCgwKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDEJCUVQOTNYWF9HUElPX0xJTkVfRCgxKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDIJCUVQOTNYWF9HUElPX0xJTkVfRCgyKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDMJCUVQOTNYWF9HUElPX0xJTkVfRCgzKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDQJCUVQOTNYWF9HUElPX0xJTkVfRCg0KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDUJCUVQOTNYWF9HUElPX0xJTkVfRCg1KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDYJCUVQOTNYWF9HUElPX0xJTkVfRCg2KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDcJCUVQOTNYWF9HUElPX0xJTkVfRCg3KQorCisvKiBHUElPIHBvcnQgRS4gICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRSh4KQkJKCh4KSArIDMyKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0dSTEVECQlFUDkzWFhfR1BJT19MSU5FX0UoMCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9SRExFRAkJRVA5M1hYX0dQSU9fTElORV9FKDEpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRElPUm4JCUVQOTNYWF9HUElPX0xJTkVfRSgyKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0lERUNTMW4JRVA5M1hYX0dQSU9fTElORV9FKDMpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSURFQ1MybglFUDkzWFhfR1BJT19MSU5FX0UoNCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9JREVEQTAJCUVQOTNYWF9HUElPX0xJTkVfRSg1KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0lERURBMQkJRVA5M1hYX0dQSU9fTElORV9FKDYpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSURFREEyCQlFUDkzWFhfR1BJT19MSU5FX0UoNykKKworLyogR1BJTyBwb3J0IEYuICAqLworI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0YoeCkJCSgoeCkgKyAxNikKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9XUAkJRVA5M1hYX0dQSU9fTElORV9GKDApCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUNDRDEJCUVQOTNYWF9HUElPX0xJTkVfRigxKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX01DQ0QyCQlFUDkzWFhfR1BJT19MSU5FX0YoMikKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9NQ0JWRDEJCUVQOTNYWF9HUElPX0xJTkVfRigzKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX01DQlZEMgkJRVA5M1hYX0dQSU9fTElORV9GKDQpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfVlMxCQlFUDkzWFhfR1BJT19MSU5FX0YoNSkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9SRUFEWQkJRVA5M1hYX0dQSU9fTElORV9GKDYpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfVlMyCQlFUDkzWFhfR1BJT19MSU5FX0YoNykKKworLyogR1BJTyBwb3J0IEcuICAqLworI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0coeCkJCSgoeCkgKyA0OCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FRUNMSwkJRVA5M1hYX0dQSU9fTElORV9HKDApCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUVEQVQJCUVQOTNYWF9HUElPX0xJTkVfRygxKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1NMQTAJCUVQOTNYWF9HUElPX0xJTkVfRygyKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1NMQTEJCUVQOTNYWF9HUElPX0xJTkVfRygzKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMTIJCUVQOTNYWF9HUElPX0xJTkVfRyg0KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMTMJCUVQOTNYWF9HUElPX0xJTkVfRyg1KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMTQJCUVQOTNYWF9HUElPX0xJTkVfRyg2KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMTUJCUVQOTNYWF9HUElPX0xJTkVfRyg3KQorCisvKiBHUElPIHBvcnQgSC4gICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSCh4KQkJKCh4KSArIDU2KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMAkJRVA5M1hYX0dQSU9fTElORV9IKDApCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxCQlFUDkzWFhfR1BJT19MSU5FX0goMSkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDIJCUVQOTNYWF9HUElPX0xJTkVfSCgyKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMwkJRVA5M1hYX0dQSU9fTElORV9IKDMpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQ0CQlFUDkzWFhfR1BJT19MSU5FX0goNCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDUJCUVQOTNYWF9HUElPX0xJTkVfSCg1KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0RENgkJRVA5M1hYX0dQSU9fTElORV9IKDYpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQ3CQlFUDkzWFhfR1BJT19MSU5FX0goNykKKworLyogbWF4aW11bSB2YWx1ZSBmb3IgZ3BpbyBsaW5lIGlkZW50aWZpZXJzICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUFYCQlFUDkzWFhfR1BJT19MSU5FX0goNykKKworLyogbWF4aW11bSB2YWx1ZSBmb3IgaXJxIGNhcGFibGUgbGluZSBpZGVudGlmaWVycyAqLworI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX01BWF9JUlEJRVA5M1hYX0dQSU9fTElORV9GKDcpCisKKyNlbmRpZiAvKiBfX0dQSU9fRVA5M1hYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGM1NzE1MmMuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSwxMjAgKzEgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSAotI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSAotCi0vKiBHUElPIHBvcnQgQS4gICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQSh4KQkJKCh4KSArIDApCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8wCQlFUDkzWFhfR1BJT19MSU5FX0EoMCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzEJCUVQOTNYWF9HUElPX0xJTkVfQSgxKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMgkJRVA5M1hYX0dQSU9fTElORV9BKDIpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8zCQlFUDkzWFhfR1BJT19MSU5FX0EoMykKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzQJCUVQOTNYWF9HUElPX0xJTkVfQSg0KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPNQkJRVA5M1hYX0dQSU9fTElORV9BKDUpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU82CQlFUDkzWFhfR1BJT19MSU5FX0EoNikKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzcJCUVQOTNYWF9HUElPX0xJTkVfQSg3KQotCi0vKiBHUElPIHBvcnQgQi4gICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQih4KQkJKCh4KSArIDgpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU84CQlFUDkzWFhfR1BJT19MSU5FX0IoMCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzkJCUVQOTNYWF9HUElPX0xJTkVfQigxKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMTAJRVA5M1hYX0dQSU9fTElORV9CKDIpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8xMQlFUDkzWFhfR1BJT19MSU5FX0IoMykKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzEyCUVQOTNYWF9HUElPX0xJTkVfQig0KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMTMJRVA5M1hYX0dQSU9fTElORV9CKDUpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8xNAlFUDkzWFhfR1BJT19MSU5FX0IoNikKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzE1CUVQOTNYWF9HUElPX0xJTkVfQig3KQotCi0vKiBHUElPIHBvcnQgQy4gICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQyh4KQkJKCh4KSArIDQwKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzAJCUVQOTNYWF9HUElPX0xJTkVfQygwKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzEJCUVQOTNYWF9HUElPX0xJTkVfQygxKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzIJCUVQOTNYWF9HUElPX0xJTkVfQygyKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzMJCUVQOTNYWF9HUElPX0xJTkVfQygzKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzQJCUVQOTNYWF9HUElPX0xJTkVfQyg0KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzUJCUVQOTNYWF9HUElPX0xJTkVfQyg1KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzYJCUVQOTNYWF9HUElPX0xJTkVfQyg2KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JPVzcJCUVQOTNYWF9HUElPX0xJTkVfQyg3KQotCi0vKiBHUElPIHBvcnQgRC4gICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRCh4KQkJKCh4KSArIDI0KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDAJCUVQOTNYWF9HUElPX0xJTkVfRCgwKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDEJCUVQOTNYWF9HUElPX0xJTkVfRCgxKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDIJCUVQOTNYWF9HUElPX0xJTkVfRCgyKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDMJCUVQOTNYWF9HUElPX0xJTkVfRCgzKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDQJCUVQOTNYWF9HUElPX0xJTkVfRCg0KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDUJCUVQOTNYWF9HUElPX0xJTkVfRCg1KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDYJCUVQOTNYWF9HUElPX0xJTkVfRCg2KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0NPTDcJCUVQOTNYWF9HUElPX0xJTkVfRCg3KQotCi0vKiBHUElPIHBvcnQgRS4gICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRSh4KQkJKCh4KSArIDMyKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0dSTEVECQlFUDkzWFhfR1BJT19MSU5FX0UoMCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9SRExFRAkJRVA5M1hYX0dQSU9fTElORV9FKDEpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRElPUm4JCUVQOTNYWF9HUElPX0xJTkVfRSgyKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0lERUNTMW4JRVA5M1hYX0dQSU9fTElORV9FKDMpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSURFQ1MybglFUDkzWFhfR1BJT19MSU5FX0UoNCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9JREVEQTAJCUVQOTNYWF9HUElPX0xJTkVfRSg1KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0lERURBMQkJRVA5M1hYX0dQSU9fTElORV9FKDYpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSURFREEyCQlFUDkzWFhfR1BJT19MSU5FX0UoNykKLQotLyogR1BJTyBwb3J0IEYuICAqLwotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0YoeCkJCSgoeCkgKyAxNikKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9XUAkJRVA5M1hYX0dQSU9fTElORV9GKDApCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUNDRDEJCUVQOTNYWF9HUElPX0xJTkVfRigxKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX01DQ0QyCQlFUDkzWFhfR1BJT19MSU5FX0YoMikKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9NQ0JWRDEJCUVQOTNYWF9HUElPX0xJTkVfRigzKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX01DQlZEMgkJRVA5M1hYX0dQSU9fTElORV9GKDQpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfVlMxCQlFUDkzWFhfR1BJT19MSU5FX0YoNSkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9SRUFEWQkJRVA5M1hYX0dQSU9fTElORV9GKDYpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfVlMyCQlFUDkzWFhfR1BJT19MSU5FX0YoNykKLQotLyogR1BJTyBwb3J0IEcuICAqLwotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0coeCkJCSgoeCkgKyA0OCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FRUNMSwkJRVA5M1hYX0dQSU9fTElORV9HKDApCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUVEQVQJCUVQOTNYWF9HUElPX0xJTkVfRygxKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1NMQTAJCUVQOTNYWF9HUElPX0xJTkVfRygyKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1NMQTEJCUVQOTNYWF9HUElPX0xJTkVfRygzKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMTIJCUVQOTNYWF9HUElPX0xJTkVfRyg0KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMTMJCUVQOTNYWF9HUElPX0xJTkVfRyg1KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMTQJCUVQOTNYWF9HUElPX0xJTkVfRyg2KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMTUJCUVQOTNYWF9HUElPX0xJTkVfRyg3KQotCi0vKiBHUElPIHBvcnQgSC4gICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSCh4KQkJKCh4KSArIDU2KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMAkJRVA5M1hYX0dQSU9fTElORV9IKDApCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxCQlFUDkzWFhfR1BJT19MSU5FX0goMSkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDIJCUVQOTNYWF9HUElPX0xJTkVfSCgyKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMwkJRVA5M1hYX0dQSU9fTElORV9IKDMpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQ0CQlFUDkzWFhfR1BJT19MSU5FX0goNCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDUJCUVQOTNYWF9HUElPX0xJTkVfSCg1KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0RENgkJRVA5M1hYX0dQSU9fTElORV9IKDYpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQ3CQlFUDkzWFhfR1BJT19MSU5FX0goNykKLQotLyogbWF4aW11bSB2YWx1ZSBmb3IgZ3BpbyBsaW5lIGlkZW50aWZpZXJzICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUFYCQlFUDkzWFhfR1BJT19MSU5FX0goNykKLQotLyogbWF4aW11bSB2YWx1ZSBmb3IgaXJxIGNhcGFibGUgbGluZSBpZGVudGlmaWVycyAqLwotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX01BWF9JUlEJRVA5M1hYX0dQSU9fTElORV9GKDcpCi0KLS8qIG5ldyBnZW5lcmljIEdQSU8gQVBJIC0gc2VlIERvY3VtZW50YXRpb24vZ3Bpby50eHQgKi8KLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKLQotLyoKLSAqIE1hcCBHUElPIEEwLi5BNyAgKDAuLjcpICB0byBpcnEgNjQuLjcxLAotICogICAgICAgICAgQjAuLkI3ICAoNy4uMTUpIHRvIGlycSA3Mi4uNzksIGFuZAotICogICAgICAgICAgRjAuLkY3ICgxNi4uMjQpIHRvIGlycSA4MC4uODcuCi0gKi8KLSNkZWZpbmUgZ3Bpb190b19pcnEoZ3BpbykJXAotCSgoKGdwaW8pIDw9IEVQOTNYWF9HUElPX0xJTkVfTUFYX0lSUSkgPyAoNjQgKyAoZ3BpbykpIDogLUVJTlZBTCkKLQotI2RlZmluZSBpcnFfdG9fZ3BpbyhpcnEpCSgoaXJxKSAtIGdwaW9fdG9faXJxKDApKQotCi0jZW5kaWYKKy8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9taWNybzkuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L21pY3JvOS5jCmluZGV4IDdhZGVhNjIuLmU3MmY3MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L21pY3JvOS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L21pY3JvOS5jCkBAIC03Nyw3ICs3Nyw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfTUlDUk85SAogTUFDSElORV9TVEFSVChNSUNSTzksICJDb250ZWMgTWljcm85LUhpZ2giKQogCS8qIE1haW50YWluZXI6IEh1YmVydCBGZXVyc3RlaW4gPGh1YmVydC5mZXVyc3RlaW5AY29udGVjLmF0PiAqLwotCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQyArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCkBAIC04OCw3ICs4OCw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfTUlDUk85TQogTUFDSElORV9TVEFSVChNSUNSTzlNLCAiQ29udGVjIE1pY3JvOS1NaWQiKQogCS8qIE1haW50YWluZXI6IEh1YmVydCBGZXVyc3RlaW4gPGh1YmVydC5mZXVyc3RlaW5AY29udGVjLmF0PiAqLwotCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfQVNZTkMgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApAQCAtOTksNyArOTksNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX01JQ1JPOUwKIE1BQ0hJTkVfU1RBUlQoTUlDUk85TCwgIkNvbnRlYyBNaWNybzktTGl0ZSIpCiAJLyogTWFpbnRhaW5lcjogSHViZXJ0IEZldXJzdGVpbiA8aHViZXJ0LmZldXJzdGVpbkBjb250ZWMuYXQ+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKQEAgLTExMCw3ICsxMTAsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX01JQ1JPOVMKIE1BQ0hJTkVfU1RBUlQoTUlDUk85UywgIkNvbnRlYyBNaWNybzktU2xpbSIpCiAJLyogTWFpbnRhaW5lcjogSHViZXJ0IEZldXJzdGVpbiA8aHViZXJ0LmZldXJzdGVpbkBjb250ZWMuYXQ+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9BU1lOQyArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9zaW1vbmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NpbW9uZS5jCmluZGV4IDgzOTJlOTUuLjUyZTA5MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NpbW9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NpbW9uZS5jCkBAIC0xOCwxMiArMTgsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1lcDkzeHguaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtNTMsNiArNTMsMTcgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2ltb25lX2F1ZGlvX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2ltb25lLWF1ZGlvIiwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgc2ltb25lX3JlZ2lzdGVyX2F1ZGlvKHZvaWQpCit7CisJZXA5M3h4X3JlZ2lzdGVyX2FjOTcoKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNpbW9uZV9hdWRpb19kZXZpY2UpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgc2ltb25lX2luaXRfbWFjaGluZSh2b2lkKQogewogCWVwOTN4eF9pbml0X2RldmljZXMoKTsKQEAgLTYxLDEyICs3MiwxMiBAQAogCWVwOTN4eF9yZWdpc3Rlcl9mYigmc2ltb25lX2ZiX2luZm8pOwogCWVwOTN4eF9yZWdpc3Rlcl9pMmMoJnNpbW9uZV9pMmNfZ3Bpb19kYXRhLCBzaW1vbmVfaTJjX2JvYXJkX2luZm8sCiAJCQkgICAgQVJSQVlfU0laRShzaW1vbmVfaTJjX2JvYXJkX2luZm8pKTsKLQllcDkzeHhfcmVnaXN0ZXJfYWM5NygpOworCXNpbW9uZV9yZWdpc3Rlcl9hdWRpbygpOwogfQogCiBNQUNISU5FX1NUQVJUKFNJTV9PTkUsICJTaW1wbGVtYWNoaW5lcyBTaW0uT25lIEJvYXJkIikKLS8qIE1haW50YWluZXI6IFJ5YW4gTWFsbG9uICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UwX1BIWVNfQkFTRSArIDB4MTAwLAorCS8qIE1haW50YWluZXI6IFJ5YW4gTWFsbG9uICovCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NuYXBwZXJjbDE1LmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9zbmFwcGVyY2wxNS5jCmluZGV4IDJlOWM2MTQuLjgxMjFlM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NuYXBwZXJjbDE1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvc25hcHBlcmNsMTUuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CkBAIC0zMCw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1lcDkzeHguaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMTUwLDYgKzE1MCwxNyBAQAogCS5icHAJCQk9IDE2LAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc25hcHBlcmNsMTVfYXVkaW9fZGV2aWNlID0geworCS5uYW1lCQk9ICJzbmFwcGVyY2wxNS1hdWRpbyIsCisJLmlkCQk9IC0xLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHNuYXBwZXJjbDE1X3JlZ2lzdGVyX2F1ZGlvKHZvaWQpCit7CisJZXA5M3h4X3JlZ2lzdGVyX2kycygpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc25hcHBlcmNsMTVfYXVkaW9fZGV2aWNlKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IHNuYXBwZXJjbDE1X2luaXRfbWFjaGluZSh2b2lkKQogewogCWVwOTN4eF9pbml0X2RldmljZXMoKTsKQEAgLTE1NywxMyArMTY4LDEzIEBACiAJZXA5M3h4X3JlZ2lzdGVyX2kyYygmc25hcHBlcmNsMTVfaTJjX2dwaW9fZGF0YSwgc25hcHBlcmNsMTVfaTJjX2RhdGEsCiAJCQkgICAgQVJSQVlfU0laRShzbmFwcGVyY2wxNV9pMmNfZGF0YSkpOwogCWVwOTN4eF9yZWdpc3Rlcl9mYigmc25hcHBlcmNsMTVfZmJfaW5mbyk7Ci0JZXA5M3h4X3JlZ2lzdGVyX2kycygpOworCXNuYXBwZXJjbDE1X3JlZ2lzdGVyX2F1ZGlvKCk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbmFwcGVyY2wxNV9uYW5kX2RldmljZSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoU05BUFBFUl9DTDE1LCAiQmx1ZXdhdGVyIFN5c3RlbXMgU25hcHBlciBDTDE1IikKIAkvKiBNYWludGFpbmVyOiBSeWFuIE1hbGxvbiAqLwotCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFMF9QSFlTX0JBU0UgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lciAJCT0gJmVwOTN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3RzNzJ4eC5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdHM3Mnh4LmMKaW5kZXggYzJkMmNmNC4uOGIyZjE0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdHM3Mnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdHM3Mnh4LmMKQEAgLTExNiw4ICsxMTYsOSBAQAogCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCS8qIGZvcmNlIHJlYWQtb25seSAqLwogCX0sIHsKIAkJLm5hbWUJCT0gIkxpbnV4IiwKLQkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCi0JCS5zaXplCQk9IDAsCQkJLyogZmlsbGVkIGluIGxhdGVyICovCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfUkVUQUlOLAorCQkuc2l6ZQkJPSBUUzcyWFhfUkVEQk9PVF9QQVJUX1NJWkUsCisJCQkJLyogbGVhdmUgc28gbXVjaCBmb3IgbGFzdCBwYXJ0aXRpb24gKi8KIAl9LCB7CiAJCS5uYW1lCQk9ICJSZWRCb290IiwKIAkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCkBAIC0xMjYsMjggKzEyNywxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgdm9pZCB0czcyeHhfbmFuZF9zZXRfcGFydHModWludDY0X3Qgc2l6ZSwKLQkJCQkgIHN0cnVjdCBwbGF0Zm9ybV9uYW5kX2NoaXAgKmNoaXApCi17Ci0JLyogRmFjdG9yeSBUUy03Mnh4IGJvYXJkcyBvbmx5IGNvbWUgd2l0aCAzMk1pQiBvciAxMjhNaUIgTkFORCBvcHRpb25zICovCi0JaWYgKHNpemUgPT0gU1pfMzJNIHx8IHNpemUgPT0gU1pfMTI4TSkgewotCQkvKiBTZXQgdGhlICJMaW51eCIgcGFydGl0aW9uIHNpemUgKi8KLQkJdHM3Mnh4X25hbmRfcGFydHNbMV0uc2l6ZSA9IHNpemUgLSBUUzcyWFhfUkVEQk9PVF9QQVJUX1NJWkU7Ci0KLQkJY2hpcC0+cGFydGl0aW9ucyA9IHRzNzJ4eF9uYW5kX3BhcnRzOwotCQljaGlwLT5ucl9wYXJ0aXRpb25zID0gQVJSQVlfU0laRSh0czcyeHhfbmFuZF9wYXJ0cyk7Ci0JfSBlbHNlIHsKLQkJcHJfd2FybmluZygiVW5rbm93biBuYW5kIGRpc2sgc2l6ZTolbGx1TWlCXG4iLCBzaXplID4+IDIwKTsKLQl9Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fbmFuZF9kYXRhIHRzNzJ4eF9uYW5kX2RhdGEgPSB7CiAJLmNoaXAgPSB7CiAJCS5ucl9jaGlwcwk9IDEsCiAJCS5jaGlwX29mZnNldAk9IDAsCiAJCS5jaGlwX2RlbGF5CT0gMTUsCiAJCS5wYXJ0X3Byb2JlX3R5cGVzID0gdHM3Mnh4X25hbmRfcGFydF9wcm9iZXMsCi0JCS5zZXRfcGFydHMJPSB0czcyeHhfbmFuZF9zZXRfcGFydHMsCisJCS5wYXJ0aXRpb25zCT0gdHM3Mnh4X25hbmRfcGFydHMsCisJCS5ucl9wYXJ0aXRpb25zCT0gQVJSQVlfU0laRSh0czcyeHhfbmFuZF9wYXJ0cyksCiAJfSwKIAkuY3RybCA9IHsKIAkJLmNtZF9jdHJsCT0gdHM3Mnh4X25hbmRfaHdjb250cm9sLApAQCAtMjU3LDcgKzI0NCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVFM3MlhYLCAiVGVjaG5vbG9naWMgU3lzdGVtcyBUUy03Mnh4IFNCQyIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSB0czcyeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3Zpc2lvbl9lcDkzMDcuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L3Zpc2lvbl9lcDkzMDcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTZlNGRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdmlzaW9uX2VwOTMwNy5jCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1lcDkzeHgvdmlzaW9uX2VwOTMwNy5jCisgKiBWaXNpb24gRW5ncmF2aW5nIFN5c3RlbXMgRVA5MzA3IFNvTSBzdXBwb3J0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFZpc2lvbiBFbmdyYXZpbmcgU3lzdGVtcworICogSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3BjYTk1M3guaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL21tY19zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZmIuaD4KKyNpbmNsdWRlIDxtYWNoL2VwOTN4eF9zcGkuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RhdGljIEkvTyBtYXBwaW5ncyBmb3IgdGhlIEZQR0EKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBWSVNJT05fUEhZU19CQVNFCUVQOTNYWF9DUzdfUEhZU19CQVNFCisjZGVmaW5lIFZJU0lPTl9WSVJUX0JBU0UJMHhmZWJmZjAwMAorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHZpc2lvbl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gVklTSU9OX1ZJUlRfQkFTRSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFZJU0lPTl9QSFlTX0JBU0UpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB2aXNpb25fbWFwX2lvKHZvaWQpCit7CisJZXA5M3h4X21hcF9pbygpOworCisJaW90YWJsZV9pbml0KHZpc2lvbl9pb19kZXNjLCBBUlJBWV9TSVpFKHZpc2lvbl9pb19kZXNjKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFdGhlcm5ldAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGVwOTN4eF9ldGhfZGF0YSB2aXNpb25fZXRoX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkucGh5X2lkCQk9IDEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnJhbWVidWZmZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBWSVNJT05fTENEX0VOQUJMRQlFUDkzWFhfR1BJT19MSU5FX0VHUElPMQorCitzdGF0aWMgaW50IHZpc2lvbl9sY2Rfc2V0dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZ3Bpb19yZXF1ZXN0X29uZShWSVNJT05fTENEX0VOQUJMRSwgR1BJT0ZfSU5JVF9ISUdILAorCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXA5M3h4X2RldmNmZ19jbGVhcl9iaXRzKEVQOTNYWF9TWVNDT05fREVWQ0ZHX1JBUyB8CisJCQkJIEVQOTNYWF9TWVNDT05fREVWQ0ZHX1JBU09OUDMgfAorCQkJCSBFUDkzWFhfU1lTQ09OX0RFVkNGR19FWFZDKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2aXNpb25fbGNkX3RlYXJkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJZ3Bpb19mcmVlKFZJU0lPTl9MQ0RfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgdmlzaW9uX2xjZF9ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaWYgKGJsYW5rX21vZGUpCisJCWdwaW9fc2V0X3ZhbHVlKFZJU0lPTl9MQ0RfRU5BQkxFLCAwKTsKKwllbHNlCisJCWdwaW9fc2V0X3ZhbHVlKFZJU0lPTl9MQ0RfRU5BQkxFLCAxKTsKK30KKworc3RhdGljIHN0cnVjdCBlcDkzeHhmYl9tYWNoX2luZm8gZXA5M3h4ZmJfaW5mbyBfX2luaXRkYXRhID0geworCS5udW1fbW9kZXMJPSBFUDkzWFhGQl9VU0VfTU9ERURCLAorCS5icHAJCT0gMTYsCisJLmZsYWdzCQk9IEVQOTNYWEZCX1VTRV9TRENTTjAgfCBFUDkzWFhGQl9QQ0xLX0ZBTExJTkcsCisJLnNldHVwCQk9IHZpc2lvbl9sY2Rfc2V0dXAsCisJLnRlYXJkb3duCT0gdmlzaW9uX2xjZF90ZWFyZG93biwKKwkuYmxhbmsJCT0gdmlzaW9uX2xjZF9ibGFuaywKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdQSU8gRXhwYW5kZXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUENBOTUzOV83NF9HUElPX0JBU0UJKEVQOTNYWF9HUElPX0xJTkVfTUFYICsgMSkKKyNkZWZpbmUgUENBOTUzOV83NV9HUElPX0JBU0UJKFBDQTk1MzlfNzRfR1BJT19CQVNFICsgMTYpCisjZGVmaW5lIFBDQTk1MzlfNzZfR1BJT19CQVNFCShQQ0E5NTM5Xzc1X0dQSU9fQkFTRSArIDE2KQorI2RlZmluZSBQQ0E5NTM5Xzc3X0dQSU9fQkFTRQkoUENBOTUzOV83Nl9HUElPX0JBU0UgKyAxNikKKworc3RhdGljIHN0cnVjdCBwY2E5NTN4X3BsYXRmb3JtX2RhdGEgcGNhOTUzeF83NF9ncGlvX2RhdGEgPSB7CisJLmdwaW9fYmFzZQk9IFBDQTk1MzlfNzRfR1BJT19CQVNFLAorCS5pcnFfYmFzZQk9IEVQOTNYWF9CT0FSRF9JUlEoMCksCit9OworCitzdGF0aWMgc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSBwY2E5NTN4Xzc1X2dwaW9fZGF0YSA9IHsKKwkuZ3Bpb19iYXNlCT0gUENBOTUzOV83NV9HUElPX0JBU0UsCisJLmlycV9iYXNlCT0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSBwY2E5NTN4Xzc2X2dwaW9fZGF0YSA9IHsKKwkuZ3Bpb19iYXNlCT0gUENBOTUzOV83Nl9HUElPX0JBU0UsCisJLmlycV9iYXNlCT0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSBwY2E5NTN4Xzc3X2dwaW9fZGF0YSA9IHsKKwkuZ3Bpb19iYXNlCT0gUENBOTUzOV83N19HUElPX0JBU0UsCisJLmlycV9iYXNlCT0gLTEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSTJDIEJ1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGkyY19ncGlvX3BsYXRmb3JtX2RhdGEgdmlzaW9uX2kyY19ncGlvX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkuc2RhX3BpbgkJPSBFUDkzWFhfR1BJT19MSU5FX0VFREFULAorCS5zY2xfcGluCQk9IEVQOTNYWF9HUElPX0xJTkVfRUVDTEssCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIHZpc2lvbl9pMmNfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygiaXNsMTIwOCIsIDB4NmYpLAorCQkuaXJxCQk9IElSUV9FUDkzWFhfRVhUMSwKKwl9LCB7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2E5NTM5IiwgMHg3NCksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJnBjYTk1M3hfNzRfZ3Bpb19kYXRhLAorCQkuaXJxCQk9IGdwaW9fdG9faXJxKEVQOTNYWF9HUElPX0xJTkVfRig3KSksCisJfSwgeworCQlJMkNfQk9BUkRfSU5GTygicGNhOTUzOSIsIDB4NzUpLAorCQkucGxhdGZvcm1fZGF0YQk9ICZwY2E5NTN4Xzc1X2dwaW9fZGF0YSwKKwl9LCB7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2E5NTM5IiwgMHg3NiksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJnBjYTk1M3hfNzZfZ3Bpb19kYXRhLAorCX0sIHsKKwkJSTJDX0JPQVJEX0lORk8oInBjYTk1MzkiLCAweDc3KSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmcGNhOTUzeF83N19ncGlvX2RhdGEsCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTUEkgRmxhc2gKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBWSVNJT05fU1BJX0ZMQVNIX0NTCUVQOTNYWF9HUElPX0xJTkVfRUdQSU83CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiB2aXNpb25fc3BpX2ZsYXNoX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lCT0gIlNQSSBib290c3RyYXAiLAorCQkub2Zmc2V0CT0gMCwKKwkJLnNpemUJPSBTWl80SywKKwl9LCB7CisJCS5uYW1lCT0gIkJvb3RzdHJhcCBjb25maWciLAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZQk9IFNaXzRLLAorCX0sIHsKKwkJLm5hbWUJPSAiU3lzdGVtIGNvbmZpZyIsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplCT0gTVREUEFSVF9TSVpfRlVMTCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIHZpc2lvbl9zcGlfZmxhc2hfZGF0YSA9IHsKKwkubmFtZQkJPSAiU1BJIEZsYXNoIiwKKwkucGFydHMJCT0gdmlzaW9uX3NwaV9mbGFzaF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUodmlzaW9uX3NwaV9mbGFzaF9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBpbnQgdmlzaW9uX3NwaV9mbGFzaF9od19zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBncGlvX3JlcXVlc3Rfb25lKFZJU0lPTl9TUElfRkxBU0hfQ1MsIEdQSU9GX0lOSVRfSElHSCwKKwkJCQlzcGktPm1vZGFsaWFzKTsKK30KKworc3RhdGljIHZvaWQgdmlzaW9uX3NwaV9mbGFzaF9od19jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJZ3Bpb19mcmVlKFZJU0lPTl9TUElfRkxBU0hfQ1MpOworfQorCitzdGF0aWMgdm9pZCB2aXNpb25fc3BpX2ZsYXNoX2h3X2NzX2NvbnRyb2woc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQoreworCWdwaW9fc2V0X3ZhbHVlKFZJU0lPTl9TUElfRkxBU0hfQ1MsIHZhbHVlKTsKK30KKworc3RhdGljIHN0cnVjdCBlcDkzeHhfc3BpX2NoaXBfb3BzIHZpc2lvbl9zcGlfZmxhc2hfaHcgPSB7CisJLnNldHVwCQk9IHZpc2lvbl9zcGlfZmxhc2hfaHdfc2V0dXAsCisJLmNsZWFudXAJPSB2aXNpb25fc3BpX2ZsYXNoX2h3X2NsZWFudXAsCisJLmNzX2NvbnRyb2wJPSB2aXNpb25fc3BpX2ZsYXNoX2h3X2NzX2NvbnRyb2wsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU1BJIFNEL01NQyBob3N0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVklTSU9OX1NQSV9NTUNfQ1MJRVA5M1hYX0dQSU9fTElORV9HKDIpCisjZGVmaW5lIFZJU0lPTl9TUElfTU1DX1dQCUVQOTNYWF9HUElPX0xJTkVfRigwKQorI2RlZmluZSBWSVNJT05fU1BJX01NQ19DRAlFUDkzWFhfR1BJT19MSU5FX0VHUElPMTUKKworc3RhdGljIHN0cnVjdCBncGlvIHZpc2lvbl9zcGlfbW1jX2dwaW9zW10gPSB7CisJeyBWSVNJT05fU1BJX01NQ19XUCwgR1BJT0ZfRElSX0lOLCAibW1jX3NwaTp3cCIgfSwKKwl7IFZJU0lPTl9TUElfTU1DX0NELCBHUElPRl9ESVJfSU4sICJtbWNfc3BpOmNkIiB9LAorfTsKKworc3RhdGljIGludCB2aXNpb25fc3BpX21tY19pbml0KHN0cnVjdCBkZXZpY2UgKnBkZXYsCisJCQlpcnFyZXR1cm5fdCAoKmZ1bmMpKGludCwgdm9pZCAqKSwgdm9pZCAqcGRhdGEpCit7CisJaW50IGVycjsKKworCWVyciA9IGdwaW9fcmVxdWVzdF9hcnJheSh2aXNpb25fc3BpX21tY19ncGlvcywKKwkJCQkgQVJSQVlfU0laRSh2aXNpb25fc3BpX21tY19ncGlvcykpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBncGlvX3NldF9kZWJvdW5jZShWSVNJT05fU1BJX01NQ19DRCwgMSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2VycjsKKworCWVyciA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKFZJU0lPTl9TUElfTU1DX0NEKSwgZnVuYywKKwkJCUlSUV9UWVBFX0VER0VfQk9USCwgIm1tY19zcGk6Y2QiLCBwZGF0YSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2VycjsKKworCXJldHVybiAwOworCitleGl0X2VycjoKKwlncGlvX2ZyZWVfYXJyYXkodmlzaW9uX3NwaV9tbWNfZ3Bpb3MsIEFSUkFZX1NJWkUodmlzaW9uX3NwaV9tbWNfZ3Bpb3MpKTsKKwlyZXR1cm4gZXJyOworCit9CisKK3N0YXRpYyB2b2lkIHZpc2lvbl9zcGlfbW1jX2V4aXQoc3RydWN0IGRldmljZSAqcGRldiwgdm9pZCAqcGRhdGEpCit7CisJZnJlZV9pcnEoZ3Bpb190b19pcnEoVklTSU9OX1NQSV9NTUNfQ0QpLCBwZGF0YSk7CisJZ3Bpb19mcmVlX2FycmF5KHZpc2lvbl9zcGlfbW1jX2dwaW9zLCBBUlJBWV9TSVpFKHZpc2lvbl9zcGlfbW1jX2dwaW9zKSk7Cit9CisKK3N0YXRpYyBpbnQgdmlzaW9uX3NwaV9tbWNfZ2V0X3JvKHN0cnVjdCBkZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuICEhZ3Bpb19nZXRfdmFsdWUoVklTSU9OX1NQSV9NTUNfV1ApOworfQorCitzdGF0aWMgaW50IHZpc2lvbl9zcGlfbW1jX2dldF9jZChzdHJ1Y3QgZGV2aWNlICpwZGV2KQoreworCXJldHVybiAhZ3Bpb19nZXRfdmFsdWUoVklTSU9OX1NQSV9NTUNfQ0QpOworfQorCitzdGF0aWMgc3RydWN0IG1tY19zcGlfcGxhdGZvcm1fZGF0YSB2aXNpb25fc3BpX21tY19kYXRhID0geworCS5pbml0CQk9IHZpc2lvbl9zcGlfbW1jX2luaXQsCisJLmV4aXQJCT0gdmlzaW9uX3NwaV9tbWNfZXhpdCwKKwkuZ2V0X3JvCQk9IHZpc2lvbl9zcGlfbW1jX2dldF9ybywKKwkuZ2V0X2NkCQk9IHZpc2lvbl9zcGlfbW1jX2dldF9jZCwKKwkuZGV0ZWN0X2RlbGF5CT0gMTAwLAorCS5wb3dlcnVwX21zZWNzCT0gMTAwLAorCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAorfTsKKworc3RhdGljIGludCB2aXNpb25fc3BpX21tY19od19zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBncGlvX3JlcXVlc3Rfb25lKFZJU0lPTl9TUElfTU1DX0NTLCBHUElPRl9JTklUX0hJR0gsCisJCQkJc3BpLT5tb2RhbGlhcyk7Cit9CisKK3N0YXRpYyB2b2lkIHZpc2lvbl9zcGlfbW1jX2h3X2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlncGlvX2ZyZWUoVklTSU9OX1NQSV9NTUNfQ1MpOworfQorCitzdGF0aWMgdm9pZCB2aXNpb25fc3BpX21tY19od19jc19jb250cm9sKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKK3sKKwlncGlvX3NldF92YWx1ZShWSVNJT05fU1BJX01NQ19DUywgdmFsdWUpOworfQorCitzdGF0aWMgc3RydWN0IGVwOTN4eF9zcGlfY2hpcF9vcHMgdmlzaW9uX3NwaV9tbWNfaHcgPSB7CisJLnNldHVwCQk9IHZpc2lvbl9zcGlfbW1jX2h3X3NldHVwLAorCS5jbGVhbnVwCT0gdmlzaW9uX3NwaV9tbWNfaHdfY2xlYW51cCwKKwkuY3NfY29udHJvbAk9IHZpc2lvbl9zcGlfbW1jX2h3X2NzX2NvbnRyb2wsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU1BJIEJ1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHZpc2lvbl9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkubW9kYWxpYXMJCT0gInNzdDI1bCIsCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZ2aXNpb25fc3BpX2ZsYXNoX2RhdGEsCisJCS5jb250cm9sbGVyX2RhdGEJPSAmdmlzaW9uX3NwaV9mbGFzaF9odywKKwkJLm1heF9zcGVlZF9oegkJPSAyMDAwMDAwMCwKKwkJLmJ1c19udW0JCT0gMCwKKwkJLmNoaXBfc2VsZWN0CQk9IDAsCisJCS5tb2RlCQkJPSBTUElfTU9ERV8zLAorCX0sIHsKKwkJLm1vZGFsaWFzCQk9ICJtbWNfc3BpIiwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnZpc2lvbl9zcGlfbW1jX2RhdGEsCisJCS5jb250cm9sbGVyX2RhdGEJPSAmdmlzaW9uX3NwaV9tbWNfaHcsCisJCS5tYXhfc3BlZWRfaHoJCT0gMjAwMDAwMDAsCisJCS5idXNfbnVtCQk9IDAsCisJCS5jaGlwX3NlbGVjdAkJPSAxLAorCQkubW9kZQkJCT0gU1BJX01PREVfMywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBlcDkzeHhfc3BpX2luZm8gdmlzaW9uX3NwaV9tYXN0ZXIgX19pbml0ZGF0YSA9IHsKKwkubnVtX2NoaXBzZWxlY3QJCT0gQVJSQVlfU0laRSh2aXNpb25fc3BpX2JvYXJkX2luZm8pLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hY2hpbmUgSW5pdGlhbGl6YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19pbml0IHZpc2lvbl9pbml0X21hY2hpbmUodm9pZCkKK3sKKwllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CisJZXA5M3h4X3JlZ2lzdGVyX2ZsYXNoKDIsIEVQOTNYWF9DUzZfUEhZU19CQVNFLCBTWl82NE0pOworCWVwOTN4eF9yZWdpc3Rlcl9ldGgoJnZpc2lvbl9ldGhfZGF0YSwgMSk7CisJZXA5M3h4X3JlZ2lzdGVyX2ZiKCZlcDkzeHhmYl9pbmZvKTsKKwllcDkzeHhfcmVnaXN0ZXJfcHdtKDEsIDApOworCisJLyoKKwkgKiBSZXF1ZXN0IHRoZSBncGlvIGV4cGFuZGVyJ3MgaW50ZXJydXB0IGdwaW8gbGluZSBub3cgdG8gcHJldmVudAorCSAqIHRoZSBrZXJuZWwgZnJvbSBkb2luZyBhIFdBUk4gaW4gZ3Bpb2xpYjpncGlvX2Vuc3VyZV9yZXF1ZXN0ZWQoKS4KKwkgKi8KKwlpZiAoZ3Bpb19yZXF1ZXN0X29uZShFUDkzWFhfR1BJT19MSU5FX0YoNyksIEdQSU9GX0RJUl9JTiwKKwkJCQkicGNhOTUzOTo3NCIpKQorCQlwcl93YXJuKCJjYW5ub3QgcmVxdWVzdCBpbnRlcnJ1cHQgZ3BpbyBmb3IgcGNhOTUzOTo3NFxuIik7CisKKwllcDkzeHhfcmVnaXN0ZXJfaTJjKCZ2aXNpb25faTJjX2dwaW9fZGF0YSwgdmlzaW9uX2kyY19pbmZvLAorCQkJCUFSUkFZX1NJWkUodmlzaW9uX2kyY19pbmZvKSk7CisJZXA5M3h4X3JlZ2lzdGVyX3NwaSgmdmlzaW9uX3NwaV9tYXN0ZXIsIHZpc2lvbl9zcGlfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKHZpc2lvbl9zcGlfYm9hcmRfaW5mbykpOworfQorCitNQUNISU5FX1NUQVJUKFZJU0lPTl9FUDkzMDcsICJWaXNpb24gRW5ncmF2aW5nIFN5c3RlbXMgRVA5MzA3IikKKwkvKiBNYWludGFpbmVyOiBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4gKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IHZpc2lvbl9tYXBfaW8sCisJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAorCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSB2aXNpb25faW5pdF9tYWNoaW5lLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNGVjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnCkBAIC0wLDAgKzEsMzQ5IEBACisjIGFyY2gvYXJtL21hY2gtZXh5bm9zL0tjb25maWcKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyMJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyCisKKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRVhZTk9TNAorCitpZiBBUkNIX0VYWU5PUworCittZW51ICJTQU1TVU5HIEVYWU5PUyBTb0NzIFN1cHBvcnQiCisKK2Nob2ljZQorCXByb21wdCAiRVhZTk9TIFN5c3RlbSBUeXBlIgorCWRlZmF1bHQgQVJDSF9FWFlOT1M0CisKK2NvbmZpZyBBUkNIX0VYWU5PUzQKKwlib29sICJTQU1TVU5HIEVYWU5PUzQiCisJaGVscAorCSAgU2Ftc3VuZyBFWFlOT1M0IFNvQ3MgYmFzZWQgc3lzdGVtcworCitlbmRjaG9pY2UKKworY29tbWVudCAiRVhZTk9TIFNvQ3MiCisKK2NvbmZpZyBDUFVfRVhZTk9TNDIxMAorCWJvb2wgIlNBTVNVTkcgRVhZTk9TNDIxMCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TNAorCXNlbGVjdCBTQU1TVU5HX0RNQURFVgorCXNlbGVjdCBBUk1fQ1BVX1NVU1BFTkQgaWYgUE0KKwlzZWxlY3QgUzVQX1BNIGlmIFBNCisJc2VsZWN0IFM1UF9TTEVFUCBpZiBQTQorCWhlbHAKKwkgIEVuYWJsZSBFWFlOT1M0MjEwIENQVSBzdXBwb3J0CisKK2NvbmZpZyBTT0NfRVhZTk9TNDIxMgorCWJvb2wgIlNBTVNVTkcgRVhZTk9TNDIxMiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TNAorCXNlbGVjdCBTNVBfUE0gaWYgUE0KKwlzZWxlY3QgUzVQX1NMRUVQIGlmIFBNCisJaGVscAorCSAgRW5hYmxlIEVYWU5PUzQyMTIgU29DIHN1cHBvcnQKKworY29uZmlnIFNPQ19FWFlOT1M0NDEyCisJYm9vbCAiU0FNU1VORyBFWFlOT1M0NDEyIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVJDSF9FWFlOT1M0CisJaGVscAorCSAgRW5hYmxlIEVYWU5PUzQ0MTIgU29DIHN1cHBvcnQKKworY29uZmlnIEVYWU5PUzRfTUNUCisJYm9vbAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFVzZSBNQ1QgKE11bHRpIENvcmUgVGltZXIpIGFzIGtlcm5lbCB0aW1lcnMKKworY29uZmlnIEVYWU5PUzRfREVWX0FIQ0kKKwlib29sCisJaGVscAorCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMgZm9yIEFIQ0kKKworY29uZmlnIEVYWU5PUzRfU0VUVVBfRklNRDAKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIEZJTUQwLgorCitjb25maWcgRVhZTk9TNF9ERVZfUEQKKwlib29sCisJaGVscAorCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMgZm9yIFBvd2VyIERvbWFpbgorCitjb25maWcgRVhZTk9TNF9ERVZfU1lTTU1VCisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBTWVNURU0gTU1VIGluIEVYWU5PUzQKKworY29uZmlnIEVYWU5PUzRfREVWX0RXTUNJCisJYm9vbAorCWhlbHAKKwkgIENvbXBpbGUgaW4gcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb25zIGZvciBEV01DSQorCitjb25maWcgRVhZTk9TNF9TRVRVUF9JMkMxCisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDEuCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzIKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgMi4KKworY29uZmlnIEVYWU5PUzRfU0VUVVBfSTJDMworCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgaTJjIGJ1cyAzLgorCitjb25maWcgRVhZTk9TNF9TRVRVUF9JMkM0CisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDQuCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzUKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgNS4KKworY29uZmlnIEVYWU5PUzRfU0VUVVBfSTJDNgorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgaTJjIGJ1cyA2LgorCitjb25maWcgRVhZTk9TNF9TRVRVUF9JMkM3CisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDcuCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX0tFWVBBRAorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3Iga2V5cGFkLgorCitjb25maWcgRVhZTk9TNF9TRVRVUF9TREhDSQorCWJvb2wKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9TREhDSV9HUElPCisJaGVscAorCSAgSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgRVhZTk9TNCBiYXNlZCBTREhDSSBzeXN0ZW1zLgorCitjb25maWcgRVhZTk9TNF9TRVRVUF9TREhDSV9HUElPCisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBTREhDSSBncGlvLgorCitjb25maWcgRVhZTk9TNF9TRVRVUF9GSU1DCisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciB0aGUgY2FtZXJhIGludGVyZmFjZXMuCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX1VTQl9QSFkKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIFVTQiBQSFkgY29udHJvbGxlcgorCisjIG1hY2hpbmUgc3VwcG9ydAorCitpZiBBUkNIX0VYWU5PUzQKKworY29tbWVudCAiRVhZTk9TNDIxMCBCb2FyZHMiCisKK2NvbmZpZyBNQUNIX1NNREtDMjEwCisJYm9vbCAiU01ES0MyMTAiCisJc2VsZWN0IE1BQ0hfU01ES1YzMTAKKwloZWxwCisJICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgU01ES0MyMTAKKworY29uZmlnIE1BQ0hfU01ES1YzMTAKKwlib29sICJTTURLVjMxMCIKKwlzZWxlY3QgQ1BVX0VYWU5PUzQyMTAKKwlzZWxlY3QgUzVQX0RFVl9GSU1EMAorCXNlbGVjdCBTM0NfREVWX1JUQworCXNlbGVjdCBTM0NfREVWX1dEVAorCXNlbGVjdCBTM0NfREVWX0kyQzEKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMAorCXNlbGVjdCBTNVBfREVWX0ZJTUMxCisJc2VsZWN0IFM1UF9ERVZfRklNQzIKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMworCXNlbGVjdCBTNVBfREVWX0kyQ19IRE1JUEhZCisJc2VsZWN0IFM1UF9ERVZfTUZDCisJc2VsZWN0IFM1UF9ERVZfVFYKKwlzZWxlY3QgUzVQX0RFVl9VU0JfRUhDSQorCXNlbGVjdCBTM0NfREVWX0hTTU1DCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMxCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMyCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMzCisJc2VsZWN0IFNBTVNVTkdfREVWX0JBQ0tMSUdIVAorCXNlbGVjdCBFWFlOT1M0X0RFVl9BSENJCisJc2VsZWN0IFNBTVNVTkdfREVWX0tFWVBBRAorCXNlbGVjdCBFWFlOT1M0X0RFVl9QRAorCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KKwlzZWxlY3QgRVhZTk9TNF9ERVZfU1lTTU1VCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfRklNRDAKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMxCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfS0VZUEFECisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9VU0JfUEhZCisJaGVscAorCSAgTWFjaGluZSBzdXBwb3J0IGZvciBTYW1zdW5nIFNNREtWMzEwCisKK2NvbmZpZyBNQUNIX0FSTUxFWDQyMTAKKwlib29sICJBUk1MRVg0MjEwIgorCXNlbGVjdCBDUFVfRVhZTk9TNDIxMAorCXNlbGVjdCBTM0NfREVWX1JUQworCXNlbGVjdCBTM0NfREVWX1dEVAorCXNlbGVjdCBTM0NfREVWX0hTTU1DCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMyCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMzCisJc2VsZWN0IEVYWU5PUzRfREVWX0FIQ0kKKwlzZWxlY3QgRVhZTk9TNF9ERVZfU1lTTU1VCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKKwloZWxwCisJICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgQVJNTEVYNDIxMCBiYXNlZCBvbiBFWFlOT1M0MjEwCisKK2NvbmZpZyBNQUNIX1VOSVZFUlNBTF9DMjEwCisJYm9vbCAiTW9iaWxlIFVOSVZFUlNBTF9DMjEwIEJvYXJkIgorCXNlbGVjdCBDUFVfRVhZTk9TNDIxMAorCXNlbGVjdCBTNVBfR1BJT19JTlQKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMAorCXNlbGVjdCBTNVBfREVWX0ZJTUMxCisJc2VsZWN0IFM1UF9ERVZfRklNQzIKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMworCXNlbGVjdCBTNVBfREVWX0NTSVMwCisJc2VsZWN0IFM1UF9ERVZfRklNRDAKKwlzZWxlY3QgUzNDX0RFVl9IU01NQworCXNlbGVjdCBTM0NfREVWX0hTTU1DMgorCXNlbGVjdCBTM0NfREVWX0hTTU1DMworCXNlbGVjdCBTM0NfREVWX0kyQzEKKwlzZWxlY3QgUzNDX0RFVl9JMkMzCisJc2VsZWN0IFMzQ19ERVZfSTJDNQorCXNlbGVjdCBTNVBfREVWX0kyQ19IRE1JUEhZCisJc2VsZWN0IFM1UF9ERVZfTUZDCisJc2VsZWN0IFM1UF9ERVZfT05FTkFORAorCXNlbGVjdCBTNVBfREVWX1RWCisJc2VsZWN0IEVYWU5PUzRfREVWX1BECisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfRklNRDAKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMxCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDMworCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzUKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9TREhDSQorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0ZJTUMKKwlzZWxlY3QgUzVQX1NFVFVQX01JUElQSFkKKwloZWxwCisJICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgTW9iaWxlIFVuaXZlcnNhbCBTNVBDMjEwIFJlZmVyZW5jZQorCSAgQm9hcmQuCisKK2NvbmZpZyBNQUNIX05VUkkKKwlib29sICJNb2JpbGUgTlVSSSBCb2FyZCIKKwlzZWxlY3QgQ1BVX0VYWU5PUzQyMTAKKwlzZWxlY3QgUzVQX0dQSU9fSU5UCisJc2VsZWN0IFMzQ19ERVZfV0RUCisJc2VsZWN0IFMzQ19ERVZfUlRDCisJc2VsZWN0IFM1UF9ERVZfRklNRDAKKwlzZWxlY3QgUzNDX0RFVl9IU01NQworCXNlbGVjdCBTM0NfREVWX0hTTU1DMgorCXNlbGVjdCBTM0NfREVWX0hTTU1DMworCXNlbGVjdCBTM0NfREVWX0kyQzEKKwlzZWxlY3QgUzNDX0RFVl9JMkMzCisJc2VsZWN0IFMzQ19ERVZfSTJDNQorCXNlbGVjdCBTNVBfREVWX0NTSVMwCisJc2VsZWN0IFM1UF9ERVZfRklNQzAKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMQorCXNlbGVjdCBTNVBfREVWX0ZJTUMyCisJc2VsZWN0IFM1UF9ERVZfRklNQzMKKwlzZWxlY3QgUzVQX0RFVl9NRkMKKwlzZWxlY3QgUzVQX0RFVl9VU0JfRUhDSQorCXNlbGVjdCBTNVBfU0VUVVBfTUlQSVBIWQorCXNlbGVjdCBFWFlOT1M0X0RFVl9QRAorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0ZJTUMKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9GSU1EMAorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzEKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMzCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDNQorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfVVNCX1BIWQorCXNlbGVjdCBTNVBfU0VUVVBfTUlQSVBIWQorCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KKwlzZWxlY3QgU0FNU1VOR19ERVZfQURDCisJaGVscAorCSAgTWFjaGluZSBzdXBwb3J0IGZvciBTYW1zdW5nIE1vYmlsZSBOVVJJIEJvYXJkLgorCitjb25maWcgTUFDSF9PUklHRU4KKwlib29sICJPUklHRU4iCisJc2VsZWN0IENQVV9FWFlOT1M0MjEwCisJc2VsZWN0IFMzQ19ERVZfUlRDCisJc2VsZWN0IFMzQ19ERVZfV0RUCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMKKwlzZWxlY3QgUzNDX0RFVl9IU01NQzIKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMAorCXNlbGVjdCBTNVBfREVWX0ZJTUMxCisJc2VsZWN0IFM1UF9ERVZfRklNQzIKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMworCXNlbGVjdCBTNVBfREVWX0ZJTUQwCisJc2VsZWN0IFM1UF9ERVZfSTJDX0hETUlQSFkKKwlzZWxlY3QgUzVQX0RFVl9NRkMKKwlzZWxlY3QgUzVQX0RFVl9UVgorCXNlbGVjdCBTNVBfREVWX1VTQl9FSENJCisJc2VsZWN0IFNBTVNVTkdfREVWX0JBQ0tMSUdIVAorCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KKwlzZWxlY3QgRVhZTk9TNF9ERVZfUEQKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9GSU1EMAorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfVVNCX1BIWQorCWhlbHAKKwkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgT1JJR0VOIGJhc2VkIG9uIFNhbXN1bmcgRVhZTk9TNDIxMAorCitjb21tZW50ICJFWFlOT1M0MjEyIEJvYXJkcyIKKworY29uZmlnIE1BQ0hfU01ESzQyMTIKKwlib29sICJTTURLNDIxMiIKKwlzZWxlY3QgU09DX0VYWU5PUzQyMTIKKwlzZWxlY3QgUzNDX0RFVl9IU01NQzIKKwlzZWxlY3QgUzNDX0RFVl9IU01NQzMKKwlzZWxlY3QgUzNDX0RFVl9JMkMxCisJc2VsZWN0IFMzQ19ERVZfSTJDMworCXNlbGVjdCBTM0NfREVWX0kyQzcKKwlzZWxlY3QgUzNDX0RFVl9SVEMKKwlzZWxlY3QgUzNDX0RFVl9XRFQKKwlzZWxlY3QgU0FNU1VOR19ERVZfQkFDS0xJR0hUCisJc2VsZWN0IFNBTVNVTkdfREVWX0tFWVBBRAorCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMxCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDMworCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzcKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9LRVlQQUQKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9TREhDSQorCWhlbHAKKwkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgU2Ftc3VuZyBTTURLNDIxMgorCitjb21tZW50ICJFWFlOT1M0NDEyIEJvYXJkcyIKKworY29uZmlnIE1BQ0hfU01ESzQ0MTIKKwlib29sICJTTURLNDQxMiIKKwlzZWxlY3QgU09DX0VYWU5PUzQ0MTIKKwlzZWxlY3QgTUFDSF9TTURLNDIxMgorCWhlbHAKKwkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgU2Ftc3VuZyBTTURLNDQxMgorZW5kaWYKKworaWYgQVJDSF9FWFlOT1M0CisKK2NvbW1lbnQgIkNvbmZpZ3VyYXRpb24gZm9yIEhTTU1DIDgtYml0IGJ1cyB3aWR0aCIKKworY29uZmlnIEVYWU5PUzRfU0RIQ0lfQ0gwXzhCSVQKKwlib29sICJDaGFubmVsIDAgd2l0aCA4LWJpdCBidXMiCisJaGVscAorCSAgU3VwcG9ydCBIU01NQyBDaGFubmVsIDAgOC1iaXQgYnVzLgorCSAgSWYgc2VsZWN0ZWQsIENoYW5uZWwgMSBpcyBkaXNhYmxlZC4KKworY29uZmlnIEVYWU5PUzRfU0RIQ0lfQ0gyXzhCSVQKKwlib29sICJDaGFubmVsIDIgd2l0aCA4LWJpdCBidXMiCisJaGVscAorCSAgU3VwcG9ydCBIU01NQyBDaGFubmVsIDIgOC1iaXQgYnVzLgorCSAgSWYgc2VsZWN0ZWQsIENoYW5uZWwgMyBpcyBkaXNhYmxlZC4KK2VuZGlmCisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwNjlhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL01ha2VmaWxlCkBAIC0wLDAgKzEsNjAgQEAKKyMgYXJjaC9hcm0vbWFjaC1leHlub3MvTWFrZWZpbGUKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyMJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyCisKK29iai15CQkJCTo9CitvYmotbQkJCQk6PQorb2JqLW4JCQkJOj0KK29iai0JCQkJOj0KKworIyBDb3JlIHN1cHBvcnQgZm9yIEVYWU5PUzQgc3lzdGVtCisKK29iai0kKENPTkZJR19BUkNIX0VYWU5PUzQpCSs9IGNwdS5vIGluaXQubyBjbG9jay5vIGlycS1jb21iaW5lci5vIHNldHVwLWkyYzAubworb2JqLSQoQ09ORklHX0FSQ0hfRVhZTk9TNCkJKz0gaXJxLWVpbnQubyBkbWEubyBwbXUubworb2JqLSQoQ09ORklHX0NQVV9FWFlOT1M0MjEwKQkrPSBjbG9jay1leHlub3M0MjEwLm8KK29iai0kKENPTkZJR19TT0NfRVhZTk9TNDIxMikJKz0gY2xvY2stZXh5bm9zNDIxMi5vCitvYmotJChDT05GSUdfUE0pCQkrPSBwbS5vCitvYmotJChDT05GSUdfQ1BVX0lETEUpCQkrPSBjcHVpZGxlLm8KKworb2JqLSQoQ09ORklHX1NNUCkJCSs9IHBsYXRzbXAubyBoZWFkc21wLm8KKworb2JqLSQoQ09ORklHX0VYWU5PUzRfTUNUKQkrPSBtY3QubworCitvYmotJChDT05GSUdfSE9UUExVR19DUFUpCSs9IGhvdHBsdWcubworCisjIG1hY2hpbmUgc3VwcG9ydAorCitvYmotJChDT05GSUdfTUFDSF9TTURLQzIxMCkJCSs9IG1hY2gtc21ka3YzMTAubworb2JqLSQoQ09ORklHX01BQ0hfU01ES1YzMTApCQkrPSBtYWNoLXNtZGt2MzEwLm8KK29iai0kKENPTkZJR19NQUNIX0FSTUxFWDQyMTApCQkrPSBtYWNoLWFybWxleDQyMTAubworb2JqLSQoQ09ORklHX01BQ0hfVU5JVkVSU0FMX0MyMTApCSs9IG1hY2gtdW5pdmVyc2FsX2MyMTAubworb2JqLSQoQ09ORklHX01BQ0hfTlVSSSkJCQkrPSBtYWNoLW51cmkubworb2JqLSQoQ09ORklHX01BQ0hfT1JJR0VOKQkJKz0gbWFjaC1vcmlnZW4ubworCitvYmotJChDT05GSUdfTUFDSF9TTURLNDIxMikJCSs9IG1hY2gtc21kazR4MTIubworb2JqLSQoQ09ORklHX01BQ0hfU01ESzQ0MTIpCQkrPSBtYWNoLXNtZGs0eDEyLm8KKworIyBkZXZpY2Ugc3VwcG9ydAorCitvYmotJChDT05GSUdfQVJDSF9FWFlOT1M0KQkJKz0gZGV2LWF1ZGlvLm8KK29iai0kKENPTkZJR19FWFlOT1M0X0RFVl9BSENJKQkJKz0gZGV2LWFoY2kubworb2JqLSQoQ09ORklHX0VYWU5PUzRfREVWX1BEKQkJKz0gZGV2LXBkLm8KK29iai0kKENPTkZJR19FWFlOT1M0X0RFVl9TWVNNTVUpCSs9IGRldi1zeXNtbXUubworb2JqLSQoQ09ORklHX0VYWU5PUzRfREVWX0RXTUNJKQkJKz0gZGV2LWR3bWNpLm8KKworb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfRklNQykJKz0gc2V0dXAtZmltYy5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9GSU1EMCkJKz0gc2V0dXAtZmltZDAubworb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDMSkJKz0gc2V0dXAtaTJjMS5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkMyKQkrPSBzZXR1cC1pMmMyLm8KK29iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0kyQzMpCSs9IHNldHVwLWkyYzMubworb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDNCkJKz0gc2V0dXAtaTJjNC5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkM1KQkrPSBzZXR1cC1pMmM1Lm8KK29iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0kyQzYpCSs9IHNldHVwLWkyYzYubworb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDNykJKz0gc2V0dXAtaTJjNy5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9LRVlQQUQpCSs9IHNldHVwLWtleXBhZC5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9TREhDSSkJKz0gc2V0dXAtc2RoY2kubworb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfU0RIQ0lfR1BJTykJKz0gc2V0dXAtc2RoY2ktZ3Bpby5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9VU0JfUEhZKQkrPSBzZXR1cC11c2ItcGh5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1leHlub3MvTWFrZWZpbGUuYm9vdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L01ha2VmaWxlLmJvb3QKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL01ha2VmaWxlLmJvb3QKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Nsb2NrLWV4eW5vczQyMTAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Nsb2NrLWV4eW5vczQyMTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQ1ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvY2xvY2stZXh5bm9zNDIxMC5jCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Nsb2NrLWV4eW5vczQyMTAuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBFWFlOT1M0MjEwIC0gQ2xvY2sgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorCisjaW5jbHVkZSA8cGxhdC9jcHUtZnJlcS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcGxsLmg+CisjaW5jbHVkZSA8cGxhdC9zNXAtY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLWNsa3NyYy5oPgorI2luY2x1ZGUgPHBsYXQvZXh5bm9zNC5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvZXh5bm9zNC1jbG9jay5oPgorCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgZXh5bm9zNDIxMF9jbG9ja19zYXZlW10gPSB7CisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfSU1BR0UpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0xDRDEpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0lNQUdFKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9MQ0QxKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX0xDRDEpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9JTUFHRV80MjEwKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfTENEMSksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX1BFUklSXzQyMTApLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrICpzeXNjbGtzW10gPSB7CisJLyogbm90aGluZyBoZXJlIHlldCAqLworfTsKKworc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX2xjZDFfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfTENEMSwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrc3Jjc1tdID0geworCXsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19zYXRhIiwKKwkJCS5pZAkJPSAtMSwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDI0KSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X21vdXRfY29yZWJ1cywKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0ZTWVMsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDEgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMwLCAuc2hpZnQgPSAyMCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX2ZpbWQiLAorCQkJLmRldm5hbWUJPSAiZXh5bm9zNC1mYi4xIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19sY2QxX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19MQ0QxLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0xDRDEsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc19vZmZbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJzYXRhcGh5IiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJzYXRhIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMCksCisJfSwgeworCQkubmFtZQkJPSAiZmltZCIsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtZmIuMSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbGNkMV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sCit9OworCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGV4eW5vczQyMTBfY2xvY2tfc3VzcGVuZCh2b2lkKQoreworCXMzY19wbV9kb19zYXZlKGV4eW5vczQyMTBfY2xvY2tfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0MjEwX2Nsb2NrX3NhdmUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0MjEwX2Nsb2NrX3Jlc3VtZSh2b2lkKQoreworCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNDIxMF9jbG9ja19zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczQyMTBfY2xvY2tfc2F2ZSkpOworfQorCisjZWxzZQorI2RlZmluZSBleHlub3M0MjEwX2Nsb2NrX3N1c3BlbmQgTlVMTAorI2RlZmluZSBleHlub3M0MjEwX2Nsb2NrX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RydWN0IHN5c2NvcmVfb3BzIGV4eW5vczQyMTBfY2xvY2tfc3lzY29yZV9vcHMgPSB7CisJLnN1c3BlbmQJPSBleHlub3M0MjEwX2Nsb2NrX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBleHlub3M0MjEwX2Nsb2NrX3Jlc3VtZSwKK307CisKK3ZvaWQgX19pbml0IGV4eW5vczQyMTBfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpCit7CisJaW50IHB0cjsKKworCWNsa19tb3V0X21wbGwucmVnX3NyYy5yZWcgPSBTNVBfQ0xLU1JDX0NQVTsKKwljbGtfbW91dF9tcGxsLnJlZ19zcmMuc2hpZnQgPSA4OworCWNsa19tb3V0X21wbGwucmVnX3NyYy5zaXplID0gMTsKKworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShzeXNjbGtzKTsgcHRyKyspCisJCXMzY19yZWdpc3Rlcl9jbGtzcmMoc3lzY2xrc1twdHJdLCAxKTsKKworCXMzY19yZWdpc3Rlcl9jbGtzcmMoY2xrc3JjcywgQVJSQVlfU0laRShjbGtzcmNzKSk7CisKKwlzM2NfcmVnaXN0ZXJfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKKwlzM2NfZGlzYWJsZV9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOworCisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmV4eW5vczQyMTBfY2xvY2tfc3lzY29yZV9vcHMpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvY2xvY2stZXh5bm9zNDIxMi5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvY2xvY2stZXh5bm9zNDIxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDVkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9jbG9jay1leHlub3M0MjEyLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvY2xvY2stZXh5bm9zNDIxMi5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQyMTIgLSBDbG9jayBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9wbGwuaD4KKyNpbmNsdWRlIDxwbGF0L3M1cC1jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2stY2xrc3JjLmg+CisjaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CisjaW5jbHVkZSA8bWFjaC9leHlub3M0LWNsb2NrLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0MjEyX2Nsb2NrX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19JTUFHRSksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfSU1BR0UpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9JTUFHRV80MjEyKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfUEVSSVJfNDIxMiksCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrX3NyY19tcGxsX3VzZXJfbGlzdFtdID0geworCVswXSA9ICZjbGtfZmluX21wbGwsCisJWzFdID0gJmNsa19tb3V0X21wbGwuY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtfc3JjX21wbGxfdXNlciA9IHsKKwkuc291cmNlcwk9IGNsa19zcmNfbXBsbF91c2VyX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa19zcmNfbXBsbF91c2VyX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X21wbGxfdXNlciA9IHsKKwkuY2xrID0geworCQkubmFtZQkJPSAibW91dF9tcGxsX3VzZXIiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrX3NyY19tcGxsX3VzZXIsCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NQVSwgLnNoaWZ0ID0gMjQsIC5zaXplID0gMSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrICpzeXNjbGtzW10gPSB7CisJJmNsa19tb3V0X21wbGxfdXNlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtzcmNzW10gPSB7CisJLyogbm90aGluZyBoZXJlIHlldCAqLworfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3Nfb2ZmW10gPSB7CisJLyogbm90aGluZyBoZXJlIHlldCAqLworfTsKKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBleHlub3M0MjEyX2Nsb2NrX3N1c3BlbmQodm9pZCkKK3sKKwlzM2NfcG1fZG9fc2F2ZShleHlub3M0MjEyX2Nsb2NrX3NhdmUsIEFSUkFZX1NJWkUoZXh5bm9zNDIxMl9jbG9ja19zYXZlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNDIxMl9jbG9ja19yZXN1bWUodm9pZCkKK3sKKwlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKGV4eW5vczQyMTJfY2xvY2tfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0MjEyX2Nsb2NrX3NhdmUpKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgZXh5bm9zNDIxMl9jbG9ja19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgZXh5bm9zNDIxMl9jbG9ja19yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0cnVjdCBzeXNjb3JlX29wcyBleHlub3M0MjEyX2Nsb2NrX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kCT0gZXh5bm9zNDIxMl9jbG9ja19zdXNwZW5kLAorCS5yZXN1bWUJCT0gZXh5bm9zNDIxMl9jbG9ja19yZXN1bWUsCit9OworCit2b2lkIF9faW5pdCBleHlub3M0MjEyX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKQoreworCWludCBwdHI7CisKKwkvKiB1c2JwaHkxIGlzIHJlbW92ZWQgKi8KKwljbGtzZXRfZ3JvdXBfbGlzdFs0XSA9IE5VTEw7CisKKwkvKiBtb3V0X21wbGxfdXNlciBpcyB1c2VkICovCisJY2xrc2V0X2dyb3VwX2xpc3RbNl0gPSAmY2xrX21vdXRfbXBsbF91c2VyLmNsazsKKwljbGtzZXRfYWNsa190b3BfbGlzdFswXSA9ICZjbGtfbW91dF9tcGxsX3VzZXIuY2xrOworCisJY2xrX21vdXRfbXBsbC5yZWdfc3JjLnJlZyA9IFM1UF9DTEtTUkNfRE1DOworCWNsa19tb3V0X21wbGwucmVnX3NyYy5zaGlmdCA9IDEyOworCWNsa19tb3V0X21wbGwucmVnX3NyYy5zaXplID0gMTsKKworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShzeXNjbGtzKTsgcHRyKyspCisJCXMzY19yZWdpc3Rlcl9jbGtzcmMoc3lzY2xrc1twdHJdLCAxKTsKKworCXMzY19yZWdpc3Rlcl9jbGtzcmMoY2xrc3JjcywgQVJSQVlfU0laRShjbGtzcmNzKSk7CisKKwlzM2NfcmVnaXN0ZXJfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKKwlzM2NfZGlzYWJsZV9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOworCisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmV4eW5vczQyMTJfY2xvY2tfc3lzY29yZV9vcHMpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Nsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5NGYwYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Nsb2NrLmMKQEAgLTAsMCArMSwxNDkxIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvY2xvY2suYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQgLSBDbG9jayBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9wbGwuaD4KKyNpbmNsdWRlIDxwbGF0L3M1cC1jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2stY2xrc3JjLmg+CisjaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL3N5c21tdS5oPgorI2luY2x1ZGUgPG1hY2gvZXh5bm9zNC1jbG9jay5oPgorCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgZXh5bm9zNF9jbG9ja19zYXZlW10gPSB7CisJU0FWRV9JVEVNKFM1UF9DTEtESVZfTEVGVEJVUyksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0xFRlRCVVMpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX1JJR0hUQlVTKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfUklHSFRCVVMpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX1RPUDApLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX1RPUDEpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0NBTSksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfVFYpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01GQyksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfRzNEKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19MQ0QwKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVVESU8pLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0ZTWVMpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX1BFUklMMCksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfUEVSSUwxKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9DQU0pLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX1RWKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9NRkMpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0czRCksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfTENEMCksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfTUFVRElPKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9GU1lTMCksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfRlNZUzEpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0ZTWVMyKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9GU1lTMyksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfUEVSSUwwKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9QRVJJTDEpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX1BFUklMMiksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfUEVSSUwzKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9QRVJJTDQpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX1BFUklMNSksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfVE9QKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX1RPUCksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19DQU0pLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfVFYpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfTENEMCksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19NQVVESU8pLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfRlNZUyksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19QRVJJTDApLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfUEVSSUwxKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVjJfUkFUSU8pLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9TQ0xLQ0FNKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfQ0FNKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfVFYpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9NRkMpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9HM0QpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9MQ0QwKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfRlNZUyksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0dQUyksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX1BFUklMKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfQkxPQ0spLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfRE1DKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19ETUMpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0RNQzApLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0RNQzEpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9ETUMpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0NQVSksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfQ1BVKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9DUFUgKyAweDQpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9TQ0xLQ1BVKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfQ1BVKSwKK307CisKK3N0cnVjdCBjbGsgY2xrX3NjbGtfaGRtaTI3bSA9IHsKKwkubmFtZQkJPSAic2Nsa19oZG1pMjdtIiwKKwkucmF0ZQkJPSAyNzAwMDAwMCwKK307CisKK3N0cnVjdCBjbGsgY2xrX3NjbGtfaGRtaXBoeSA9IHsKKwkubmFtZQkJPSAic2Nsa19oZG1pcGh5IiwKK307CisKK3N0cnVjdCBjbGsgY2xrX3NjbGtfdXNicGh5MCA9IHsKKwkubmFtZQkJPSAic2Nsa191c2JwaHkwIiwKKwkucmF0ZQkJPSAyNzAwMDAwMCwKK307CisKK3N0cnVjdCBjbGsgY2xrX3NjbGtfdXNicGh5MSA9IHsKKwkubmFtZQkJPSAic2Nsa191c2JwaHkxIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2FwYl9wY2xrID0geworCS5uYW1lCQk9ICJhcGJfcGNsayIsCisJLmlkCQk9IC0xLAorfTsKKworc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX3RvcF9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19UT1AsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19DQU0sIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX2xjZDBfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfTENEMCwgY2xrLCBlbmFibGUpOworfQorCitpbnQgZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS1NSQ19NQVNLX0ZTWVMsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19QRVJJTDAsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19QRVJJTDEsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9tZmNfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9NRkMsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX3R2X2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS1NSQ19NQVNLX1RWLCBjbGssIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfQ0FNLCBjbGssIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfdHZfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9UViwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrX2lwX2ltYWdlX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfSU1BR0UsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9sY2QwX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfTENEMCwgY2xrLCBlbmFibGUpOworfQorCitpbnQgZXh5bm9zNF9jbGtfaXBfbGNkMV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX0xDRDEsIGNsaywgZW5hYmxlKTsKK30KKworaW50IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9GU1lTLCBjbGssIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9QRVJJTCwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrX2lwX3BlcmlyX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfUEVSSVIsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa19oZG1pcGh5X2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0hETUlfUEhZX0NPTlRST0wsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa19kYWNfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfREFDX1BIWV9DT05UUk9MLCBjbGssIGVuYWJsZSk7Cit9CisKKy8qIENvcmUgbGlzdCBvZiBDTVVfQ1BVIHNpZGUgKi8KKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2FwbGwgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gIm1vdXRfYXBsbCIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtfc3JjX2FwbGwsCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NQVSwgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCit9OworCitzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa19hcGxsID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJzY2xrX2FwbGwiLAorCQkucGFyZW50CQk9ICZjbGtfbW91dF9hcGxsLmNsaywKKwl9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDMgfSwKK307CisKK3N0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2VwbGwgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gIm1vdXRfZXBsbCIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtfc3JjX2VwbGwsCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDAsIC5zaGlmdCA9IDQsIC5zaXplID0gMSB9LAorfTsKKworc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbXBsbCA9IHsKKwkuY2xrID0geworCQkubmFtZQkJPSAibW91dF9tcGxsIiwKKwl9LAorCS5zb3VyY2VzCT0gJmNsa19zcmNfbXBsbCwKKworCS8qIHJlZ19zcmMgd2lsbCBiZSBhZGRlZCBpbiBlYWNoIFNvQ3MnIGNsb2NrICovCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRjb3JlX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX21vdXRfYXBsbC5jbGssCisJWzFdID0gJmNsa19tb3V0X21wbGwuY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dGNvcmUgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfbW91dGNvcmVfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRjb3JlX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0Y29yZSA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAibW91dGNvcmUiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrc2V0X21vdXRjb3JlLAorCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19DUFUsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfY29yZWNsayA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAiY29yZV9jbGsiLAorCQkucGFyZW50CQk9ICZjbGtfbW91dGNvcmUuY2xrLAorCX0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gMCwgLnNpemUgPSAzIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FybWNsayA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAiYXJtY2xrIiwKKwkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZW0wID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhY2xrX2NvcmVtMCIsCisJCS5wYXJlbnQJCT0gJmNsa19jb3JlY2xrLmNsaywKKwl9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDQsIC5zaXplID0gMyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrX2NvcmVzID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhY2xrX2NvcmVzIiwKKwkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAorCX0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gNCwgLnNpemUgPSAzIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZW0xID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhY2xrX2NvcmVtMSIsCisJCS5wYXJlbnQJCT0gJmNsa19jb3JlY2xrLmNsaywKKwl9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDgsIC5zaXplID0gMyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19wZXJpcGhjbGsgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gInBlcmlwaGNsayIsCisJCS5wYXJlbnQJCT0gJmNsa19jb3JlY2xrLmNsaywKKwl9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDMgfSwKK307CisKKy8qIENvcmUgbGlzdCBvZiBDTVVfQ09SRSBzaWRlICovCisKK3N0cnVjdCBjbGsgKmNsa3NldF9jb3JlYnVzX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX21vdXRfbXBsbC5jbGssCisJWzFdID0gJmNsa19zY2xrX2FwbGwuY2xrLAorfTsKKworc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0X2NvcmVidXMgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfY29yZWJ1c19saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfY29yZWJ1c19saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9jb3JlYnVzID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJtb3V0X2NvcmVidXMiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrc2V0X21vdXRfY29yZWJ1cywKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRE1DLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa19kbWMgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gInNjbGtfZG1jIiwKKwkJLnBhcmVudAkJPSAmY2xrX21vdXRfY29yZWJ1cy5jbGssCisJfSwKKwkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfRE1DMCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gMyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrX2NvcmVkID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhY2xrX2NvcmVkIiwKKwkJLnBhcmVudAkJPSAmY2xrX3NjbGtfZG1jLmNsaywKKwl9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9ETUMwLCAuc2hpZnQgPSAxNiwgLnNpemUgPSAzIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZXAgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImFjbGtfY29yZXAiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa19jb3JlZC5jbGssCisJfSwKKwkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfRE1DMCwgLnNoaWZ0ID0gMjAsIC5zaXplID0gMyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrX2FjcCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAiYWNsa19hY3AiLAorCQkucGFyZW50CQk9ICZjbGtfbW91dF9jb3JlYnVzLmNsaywKKwl9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9ETUMwLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDMgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfcGNsa19hY3AgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gInBjbGtfYWNwIiwKKwkJLnBhcmVudAkJPSAmY2xrX2FjbGtfYWNwLmNsaywKKwl9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9ETUMwLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDMgfSwKK307CisKKy8qIENvcmUgbGlzdCBvZiBDTVVfVE9QIHNpZGUgKi8KKworc3RydWN0IGNsayAqY2xrc2V0X2FjbGtfdG9wX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX21vdXRfbXBsbC5jbGssCisJWzFdID0gJmNsa19zY2xrX2FwbGwuY2xrLAorfTsKKworc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9hY2xrID0geworCS5zb3VyY2VzCT0gY2xrc2V0X2FjbGtfdG9wX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9hY2xrX3RvcF9saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa18yMDAgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImFjbGtfMjAwIiwKKwl9LAorCS5zb3VyY2VzCT0gJmNsa3NldF9hY2xrLAorCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AwLCAuc2hpZnQgPSAxMiwgLnNpemUgPSAxIH0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1RPUCwgLnNoaWZ0ID0gMCwgLnNpemUgPSAzIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfMTAwID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhY2xrXzEwMCIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfYWNsaywKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gMTYsIC5zaXplID0gMSB9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9UT1AsIC5zaGlmdCA9IDQsIC5zaXplID0gNCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrXzE2MCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAiYWNsa18xNjAiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrc2V0X2FjbGssCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDAsIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDEgfSwKKwkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfVE9QLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDMgfSwKK307CisKK3N0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrXzEzMyA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAiYWNsa18xMzMiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrc2V0X2FjbGssCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDAsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDEgfSwKKwkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfVE9QLCAuc2hpZnQgPSAxMiwgLnNpemUgPSAzIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X3ZwbGxzcmNfbGlzdFtdID0geworCVswXSA9ICZjbGtfZmluX3ZwbGwsCisJWzFdID0gJmNsa19zY2xrX2hkbWkyN20sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF92cGxsc3JjID0geworCS5zb3VyY2VzCT0gY2xrc2V0X3ZwbGxzcmNfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X3ZwbGxzcmNfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3ZwbGxzcmMgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gInZwbGxfc3JjIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3RvcF9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrc2V0X3ZwbGxzcmMsCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDEsIC5zaGlmdCA9IDAsIC5zaXplID0gMSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9zY2xrX3ZwbGxfbGlzdFtdID0geworCVswXSA9ICZjbGtfdnBsbHNyYy5jbGssCisJWzFdID0gJmNsa19mb3V0X3ZwbGwsCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9zY2xrX3ZwbGwgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfc2Nsa192cGxsX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9zY2xrX3ZwbGxfbGlzdCksCit9OworCitzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa192cGxsID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJzY2xrX3ZwbGwiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrc2V0X3NjbGtfdnBsbCwKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gOCwgLnNpemUgPSAxIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc19vZmZbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJ0aW1lcnMiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDE8PDI0KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJjc2lzIiwKKwkJLmRldm5hbWUJPSAiczVwLW1pcGktY3Npcy4wIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJjc2lzIiwKKwkJLmRldm5hbWUJPSAiczVwLW1pcGktY3Npcy4xIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJmaW1jIiwKKwkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjAiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sIHsKKwkJLm5hbWUJCT0gImZpbWMiLAorCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMSksCisJfSwgeworCQkubmFtZQkJPSAiZmltYyIsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4yIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAyKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJmaW1jIiwKKwkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjMiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDMpLAorCX0sIHsKKwkJLm5hbWUJCT0gImZpbWQiLAorCQkuZGV2bmFtZQk9ICJleHlub3M0LWZiLjAiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2xjZDBfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJoc21tYyIsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKKwkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTMzLmNsaywKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNSksCisJfSwgeworCQkubmFtZQkJPSAiaHNtbWMiLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDYpLAorCX0sIHsKKwkJLm5hbWUJCT0gImhzbW1jIiwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjIiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA3KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJoc21tYyIsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4zIiwKKwkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTMzLmNsaywKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgOCksCisJfSwgeworCQkubmFtZQkJPSAiZHdtbWMiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA5KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJkYWMiLAorCQkuZGV2bmFtZQk9ICJzNXAtc2RvIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF90dl9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDIpLAorCX0sIHsKKwkJLm5hbWUJCT0gIm1peGVyIiwKKwkJLmRldm5hbWUJPSAiczVwLW1peGVyIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF90dl9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDEpLAorCX0sIHsKKwkJLm5hbWUJCT0gInZwIiwKKwkJLmRldm5hbWUJPSAiczVwLW1peGVyIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF90dl9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sIHsKKwkJLm5hbWUJCT0gImhkbWkiLAorCQkuZGV2bmFtZQk9ICJleHlub3M0LWhkbWkiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3R2X2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMyksCisJfSwgeworCQkubmFtZQkJPSAiaGRtaXBoeSIsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtaGRtaSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaGRtaXBoeV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sIHsKKwkJLm5hbWUJCT0gImRhY3BoeSIsCisJCS5kZXZuYW1lCT0gInM1cC1zZG8iLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2RhY19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sIHsKKwkJLm5hbWUJCT0gImRtYSIsCisJCS5kZXZuYW1lCT0gImRtYS1wbDMzMC4wIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwgeworCQkubmFtZQkJPSAiZG1hIiwKKwkJLmRldm5hbWUJPSAiZG1hLXBsMzMwLjEiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJhZGMiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTUpLAorCX0sIHsKKwkJLm5hbWUJCT0gImtleXBhZCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaXJfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxNiksCisJfSwgeworCQkubmFtZQkJPSAicnRjIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpcl9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDE1KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaXJfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxNCksCisJfSwgeworCQkubmFtZQkJPSAidXNiaG9zdCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsICwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCisJfSwgeworCQkubmFtZQkJPSAib3RnIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTMpLAorCX0sIHsKKwkJLm5hbWUJCT0gInNwaSIsCisJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjAiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTYpLAorCX0sIHsKKwkJLm5hbWUJCT0gInNwaSIsCisJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjEiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTcpLAorCX0sIHsKKwkJLm5hbWUJCT0gInNwaSIsCisJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjIiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTgpLAorCX0sIHsKKwkJLm5hbWUJCT0gImlpcyIsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjAiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTkpLAorCX0sIHsKKwkJLm5hbWUJCT0gImlpcyIsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjEiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMjApLAorCX0sIHsKKwkJLm5hbWUJCT0gImlpcyIsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjIiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMjEpLAorCX0sIHsKKwkJLm5hbWUJCT0gImFjOTciLAorCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWFjOTciLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMjcpLAorCX0sIHsKKwkJLm5hbWUJCT0gImZpbWcyZCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfaW1hZ2VfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJtZmMiLAorCQkuZGV2bmFtZQk9ICJzNXAtbWZjIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9tZmNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJpMmMiLAorCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy4wIiwKKwkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDYpLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjEiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNyksCisJfSwgeworCQkubmFtZQkJPSAiaTJjIiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuMiIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJpMmMiLAorCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy4zIiwKKwkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDkpLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjQiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTApLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjUiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTEpLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjYiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjciLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTMpLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaGRtaXBoeS1pMmMiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTQpLAorCX0sIHsKKwkJLm5hbWUJCT0gIlNZU01NVV9NRE1BIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9pbWFnZV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDUpLAorCX0sIHsKKwkJLm5hbWUJCT0gIlNZU01NVV9GSU1DMCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNyksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUMxIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfRklNQzIiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDkpLAorCX0sIHsKKwkJLm5hbWUJCT0gIlNZU01NVV9GSU1DMyIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTApLAorCX0sIHsKKwkJLm5hbWUJCT0gIlNZU01NVV9KUEVHIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMSksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUQwIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9sY2QwX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNCksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUQxIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9sY2QxX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNCksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX1BDSWUiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxOCksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX0cyRCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfaW1hZ2VfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfUk9UQVRPUiIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfaW1hZ2VfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfVFYiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3R2X2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNCksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX01GQ19MIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9tZmNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfTUZDX1IiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX21mY19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDIpLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzW10gPSB7CisJeworCQkubmFtZQkJPSAidWFydCIsCisJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4wIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sIHsKKwkJLm5hbWUJCT0gInVhcnQiLAorCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjIiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMiksCisJfSwgeworCQkubmFtZQkJPSAidWFydCIsCisJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4zIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDMpLAorCX0sIHsKKwkJLm5hbWUJCT0gInVhcnQiLAorCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuNCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjUiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNSksCisJfQorfTsKKworc3RydWN0IGNsayAqY2xrc2V0X2dyb3VwX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX2V4dF94dGFsX211eCwKKwlbMV0gPSAmY2xrX3h1c2J4dGksCisJWzJdID0gJmNsa19zY2xrX2hkbWkyN20sCisJWzNdID0gJmNsa19zY2xrX3VzYnBoeTAsCisJWzRdID0gJmNsa19zY2xrX3VzYnBoeTEsCisJWzVdID0gJmNsa19zY2xrX2hkbWlwaHksCisJWzZdID0gJmNsa19tb3V0X21wbGwuY2xrLAorCVs3XSA9ICZjbGtfbW91dF9lcGxsLmNsaywKKwlbOF0gPSAmY2xrX3NjbGtfdnBsbC5jbGssCit9OworCitzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X2dyb3VwID0geworCS5zb3VyY2VzCT0gY2xrc2V0X2dyb3VwX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9ncm91cF9saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dF9nMmQwX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX21vdXRfbXBsbC5jbGssCisJWzFdID0gJmNsa19zY2xrX2FwbGwuY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9nMmQwID0geworCS5zb3VyY2VzCT0gY2xrc2V0X21vdXRfZzJkMF9saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dF9nMmQwX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2cyZDAgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gIm1vdXRfZzJkMCIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9nMmQwLAorCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19JTUFHRSwgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRfZzJkMV9saXN0W10gPSB7CisJWzBdID0gJmNsa19tb3V0X2VwbGwuY2xrLAorCVsxXSA9ICZjbGtfc2Nsa192cGxsLmNsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X21vdXRfZzJkMSA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9tb3V0X2cyZDFfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRfZzJkMV9saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9nMmQxID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJtb3V0X2cyZDEiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrc2V0X21vdXRfZzJkMSwKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfSU1BR0UsIC5zaGlmdCA9IDQsIC5zaXplID0gMSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9tb3V0X2cyZF9saXN0W10gPSB7CisJWzBdID0gJmNsa19tb3V0X2cyZDAuY2xrLAorCVsxXSA9ICZjbGtfbW91dF9nMmQxLmNsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X21vdXRfZzJkID0geworCS5zb3VyY2VzCT0gY2xrc2V0X21vdXRfZzJkX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9tb3V0X2cyZF9saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dF9tZmMwX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX21vdXRfbXBsbC5jbGssCisJWzFdID0gJmNsa19zY2xrX2FwbGwuY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9tZmMwID0geworCS5zb3VyY2VzCT0gY2xrc2V0X21vdXRfbWZjMF9saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dF9tZmMwX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X21mYzAgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gIm1vdXRfbWZjMCIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9tZmMwLAorCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19NRkMsIC5zaGlmdCA9IDAsIC5zaXplID0gMSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9tb3V0X21mYzFfbGlzdFtdID0geworCVswXSA9ICZjbGtfbW91dF9lcGxsLmNsaywKKwlbMV0gPSAmY2xrX3NjbGtfdnBsbC5jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0X21mYzEgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9tZmMxX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9tb3V0X21mYzFfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbWZjMSA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAibW91dF9tZmMxIiwKKwl9LAorCS5zb3VyY2VzCT0gJmNsa3NldF9tb3V0X21mYzEsCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX01GQywgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRfbWZjX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX21vdXRfbWZjMC5jbGssCisJWzFdID0gJmNsa19tb3V0X21mYzEuY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9tZmMgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9tZmNfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRfbWZjX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9zY2xrX2RhY19saXN0W10gPSB7CisJWzBdID0gJmNsa19zY2xrX3ZwbGwuY2xrLAorCVsxXSA9ICZjbGtfc2Nsa19oZG1pcGh5LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfc2Nsa19kYWMgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfc2Nsa19kYWNfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X3NjbGtfZGFjX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2RhYyA9IHsKKwkuY2xrCQk9IHsKKwkJLm5hbWUJCT0gInNjbGtfZGFjIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3R2X2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgOCksCisJfSwKKwkuc291cmNlcyA9ICZjbGtzZXRfc2Nsa19kYWMsCisJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RWLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa19waXhlbCA9IHsKKwkuY2xrCQk9IHsKKwkJLm5hbWUJCT0gInNjbGtfcGl4ZWwiLAorCQkucGFyZW50ID0gJmNsa19zY2xrX3ZwbGwuY2xrLAorCX0sCisJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1RWLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfc2Nsa19oZG1pX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX3NjbGtfcGl4ZWwuY2xrLAorCVsxXSA9ICZjbGtfc2Nsa19oZG1pcGh5LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfc2Nsa19oZG1pID0geworCS5zb3VyY2VzCT0gY2xrc2V0X3NjbGtfaGRtaV9saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfc2Nsa19oZG1pX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2hkbWkgPSB7CisJLmNsawkJPSB7CisJCS5uYW1lCQk9ICJzY2xrX2hkbWkiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfdHZfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKKwl9LAorCS5zb3VyY2VzID0gJmNsa3NldF9zY2xrX2hkbWksCisJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RWLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfc2Nsa19taXhlcl9saXN0W10gPSB7CisJWzBdID0gJmNsa19zY2xrX2RhYy5jbGssCisJWzFdID0gJmNsa19zY2xrX2hkbWkuY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfc2Nsa19taXhlciA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9zY2xrX21peGVyX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9zY2xrX21peGVyX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX21peGVyID0geworCS5jbGsJCT0geworCQkubmFtZQkJPSAic2Nsa19taXhlciIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza190dl9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDQpLAorCX0sCisJLnNvdXJjZXMgPSAmY2xrc2V0X3NjbGtfbWl4ZXIsCisJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RWLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayAqc2Nsa190dltdID0geworCSZjbGtfc2Nsa19kYWMsCisJJmNsa19zY2xrX3BpeGVsLAorCSZjbGtfc2Nsa19oZG1pLAorCSZjbGtfc2Nsa19taXhlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWMwID0geworCS5jbGsJCT0geworCQkubmFtZQkJPSAiZG91dF9tbWMwIiwKKwl9LAorCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMxLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWMxID0geworCS5jbGsJCT0geworCQkubmFtZQkJPSAiZG91dF9tbWMxIiwKKwl9LAorCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gNCwgLnNpemUgPSA0IH0sCisJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMxLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2RvdXRfbW1jMiA9IHsKKwkuY2xrCQk9IHsKKwkJLm5hbWUJCT0gImRvdXRfbW1jMiIsCisJfSwKKwkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0ZTWVMsIC5zaGlmdCA9IDgsIC5zaXplID0gNCB9LAorCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMiwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2RvdXRfbW1jMyA9IHsKKwkuY2xrCQk9IHsKKwkJLm5hbWUJCT0gImRvdXRfbW1jMyIsCisJfSwKKwkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0ZTWVMsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKKwkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzIsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWM0ID0geworCS5jbGsJCT0geworCQkubmFtZQkJPSAiZG91dF9tbWM0IiwKKwl9LAorCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAorCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMywgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrc3Jjc1tdID0geworCXsKKwkJLmNsawk9IHsKKwkJCS5uYW1lCQk9ICJ1Y2xrMSIsCisJCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMCIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwwX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDAsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwwLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInVjbGsxIiwKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4xIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDBfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgNCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9QRVJJTDAsIC5zaGlmdCA9IDQsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAidWNsazEiLAorCQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjIiLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfUEVSSUwwLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMCwgLnNoaWZ0ID0gOCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJ1Y2xrMSIsCisJCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMyIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwwX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfUEVSSUwwLCAuc2hpZnQgPSAxMiwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9QRVJJTDAsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfcHdtIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDBfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMjQpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDAsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMywgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX2NzaXMiLAorCQkJLmRldm5hbWUJPSAiczVwLW1pcGktY3Npcy4wIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMjQpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMjQsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19jc2lzIiwKKwkJCS5kZXZuYW1lCT0gInM1cC1taXBpLWNzaXMuMSIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDI4KSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ0FNLCAuc2hpZnQgPSAyOCwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDI4LCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfY2FtMCIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ0FNLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfY2FtMSIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDIwKSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ0FNLCAuc2hpZnQgPSAyMCwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfZmltYyIsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMCIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ0FNLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfZmltYyIsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMSIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDQpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDQsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ0FNLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfZmltYyIsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMiIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDgpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDgsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ0FNLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfZmltYyIsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMyIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ0FNLCAuc2hpZnQgPSAxMiwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfZmltZCIsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZiLjAiLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2xjZDBfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0xDRDAsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfTENEMCwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX3NwaSIsCisJCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDFfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMTYpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDEsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX3NwaSIsCisJCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4xIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDFfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMjApLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDEsIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMSwgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19zcGkiLAorCQkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMiIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwxX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDI0KSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfUEVSSUwxLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9QRVJJTDIsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19maW1nMmQiLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfbW91dF9nMmQsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19JTUFHRSwgLnNoaWZ0ID0gOCwgLnNpemUgPSAxIH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9JTUFHRSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX21mYyIsCisJCQkuZGV2bmFtZQk9ICJzNXAtbWZjIiwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X21vdXRfbWZjLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfTUZDLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDEgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX01GQywgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX21tYyIsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMCIsCisJCQkucGFyZW50CQk9ICZjbGtfZG91dF9tbWMwLmNsaywKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCQl9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzEsIC5zaGlmdCA9IDgsIC5zaXplID0gOCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19tbWMiLAorCQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjEiLAorCQkJLnBhcmVudCAgICAgICAgID0gJmNsa19kb3V0X21tYzEuY2xrLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgNCksCisJCX0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMSwgLnNoaWZ0ID0gMjQsIC5zaXplID0gOCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19tbWMiLAorCQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjIiLAorCQkJLnBhcmVudCAgICAgICAgID0gJmNsa19kb3V0X21tYzIuY2xrLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgOCksCisJCX0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMiwgLnNoaWZ0ID0gOCwgLnNpemUgPSA4IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX21tYyIsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMyIsCisJCQkucGFyZW50ICAgICAgICAgPSAmY2xrX2RvdXRfbW1jMy5jbGssCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCisJCX0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMiwgLnNoaWZ0ID0gMjQsIC5zaXplID0gOCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19kd21tYyIsCisJCQkucGFyZW50ICAgICAgICAgPSAmY2xrX2RvdXRfbW1jNC5jbGssCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCAxNiksCisJCX0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMywgLnNoaWZ0ID0gOCwgLnNpemUgPSA4IH0sCisJfQorfTsKKworLyogQ2xvY2sgaW5pdGlhbGl6YXRpb24gY29kZSAqLworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrICpzeXNjbGtzW10gPSB7CisJJmNsa19tb3V0X2FwbGwsCisJJmNsa19zY2xrX2FwbGwsCisJJmNsa19tb3V0X2VwbGwsCisJJmNsa19tb3V0X21wbGwsCisJJmNsa19tb3V0Y29yZSwKKwkmY2xrX2NvcmVjbGssCisJJmNsa19hcm1jbGssCisJJmNsa19hY2xrX2NvcmVtMCwKKwkmY2xrX2FjbGtfY29yZXMsCisJJmNsa19hY2xrX2NvcmVtMSwKKwkmY2xrX3BlcmlwaGNsaywKKwkmY2xrX21vdXRfY29yZWJ1cywKKwkmY2xrX3NjbGtfZG1jLAorCSZjbGtfYWNsa19jb3JlZCwKKwkmY2xrX2FjbGtfY29yZXAsCisJJmNsa19hY2xrX2FjcCwKKwkmY2xrX3BjbGtfYWNwLAorCSZjbGtfdnBsbHNyYywKKwkmY2xrX3NjbGtfdnBsbCwKKwkmY2xrX2FjbGtfMjAwLAorCSZjbGtfYWNsa18xMDAsCisJJmNsa19hY2xrXzE2MCwKKwkmY2xrX2FjbGtfMTMzLAorCSZjbGtfZG91dF9tbWMwLAorCSZjbGtfZG91dF9tbWMxLAorCSZjbGtfZG91dF9tbWMyLAorCSZjbGtfZG91dF9tbWMzLAorCSZjbGtfZG91dF9tbWM0LAorCSZjbGtfbW91dF9tZmMwLAorCSZjbGtfbW91dF9tZmMxLAorfTsKKworc3RhdGljIGludCB4dGFsX3JhdGU7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGV4eW5vczRfZm91dF9hcGxsX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoc29jX2lzX2V4eW5vczQyMTAoKSkKKwkJcmV0dXJuIHM1cF9nZXRfcGxsNDV4eCh4dGFsX3JhdGUsIF9fcmF3X3JlYWRsKFM1UF9BUExMX0NPTjApLAorCQkJCQlwbGxfNDUwOCk7CisJZWxzZSBpZiAoc29jX2lzX2V4eW5vczQyMTIoKSB8fCBzb2NfaXNfZXh5bm9zNDQxMigpKQorCQlyZXR1cm4gczVwX2dldF9wbGwzNXh4KHh0YWxfcmF0ZSwgX19yYXdfcmVhZGwoUzVQX0FQTExfQ09OMCkpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBleHlub3M0X2ZvdXRfYXBsbF9vcHMgPSB7CisJLmdldF9yYXRlID0gZXh5bm9zNF9mb3V0X2FwbGxfZ2V0X3JhdGUsCit9OworCitzdGF0aWMgdTMyIHZwbGxfZGl2W11bOF0gPSB7CisJeyAgNTQwMDAwMDAsIDMsIDUzLCAzLCAxMDI0LCAwLCAxNywgMCB9LAorCXsgMTA4MDAwMDAwLCAzLCA1MywgMiwgMTAyNCwgMCwgMTcsIDAgfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGV4eW5vczRfdnBsbF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cmF0ZTsKK30KKworc3RhdGljIGludCBleHlub3M0X3ZwbGxfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgaW50IHZwbGxfY29uMCwgdnBsbF9jb24xID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFJldHVybiBpZiBub3RoaW5nIGNoYW5nZWQgKi8KKwlpZiAoY2xrLT5yYXRlID09IHJhdGUpCisJCXJldHVybiAwOworCisJdnBsbF9jb24wID0gX19yYXdfcmVhZGwoUzVQX1ZQTExfQ09OMCk7CisJdnBsbF9jb24wICY9IH4oMHgxIDw8IDI3IHwJCQkJCVwKKwkJCVBMTDkwWFhfTURJVl9NQVNLIDw8IFBMTDQ2WFhfTURJVl9TSElGVCB8CVwKKwkJCVBMTDkwWFhfUERJVl9NQVNLIDw8IFBMTDQ2WFhfUERJVl9TSElGVCB8CVwKKwkJCVBMTDkwWFhfU0RJVl9NQVNLIDw8IFBMTDQ2WFhfU0RJVl9TSElGVCk7CisKKwl2cGxsX2NvbjEgPSBfX3Jhd19yZWFkbChTNVBfVlBMTF9DT04xKTsKKwl2cGxsX2NvbjEgJj0gfihQTEw0NlhYX01SUl9NQVNLIDw8IFBMTDQ2WFhfTVJSX1NISUZUIHwJXAorCQkJUExMNDZYWF9NRlJfTUFTSyA8PCBQTEw0NlhYX01GUl9TSElGVCB8CVwKKwkJCVBMTDQ2NTBDX0tESVZfTUFTSyA8PCBQTEw0NlhYX0tESVZfU0hJRlQpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodnBsbF9kaXYpOyBpKyspIHsKKwkJaWYgKHZwbGxfZGl2W2ldWzBdID09IHJhdGUpIHsKKwkJCXZwbGxfY29uMCB8PSB2cGxsX2RpdltpXVsxXSA8PCBQTEw0NlhYX1BESVZfU0hJRlQ7CisJCQl2cGxsX2NvbjAgfD0gdnBsbF9kaXZbaV1bMl0gPDwgUExMNDZYWF9NRElWX1NISUZUOworCQkJdnBsbF9jb24wIHw9IHZwbGxfZGl2W2ldWzNdIDw8IFBMTDQ2WFhfU0RJVl9TSElGVDsKKwkJCXZwbGxfY29uMSB8PSB2cGxsX2RpdltpXVs0XSA8PCBQTEw0NlhYX0tESVZfU0hJRlQ7CisJCQl2cGxsX2NvbjEgfD0gdnBsbF9kaXZbaV1bNV0gPDwgUExMNDZYWF9NRlJfU0hJRlQ7CisJCQl2cGxsX2NvbjEgfD0gdnBsbF9kaXZbaV1bNl0gPDwgUExMNDZYWF9NUlJfU0hJRlQ7CisJCQl2cGxsX2NvbjAgfD0gdnBsbF9kaXZbaV1bN10gPDwgMjc7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IEFSUkFZX1NJWkUodnBsbF9kaXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgQ2xvY2sgVlBMTCBGcmVxdWVuY3lcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlfX3Jhd193cml0ZWwodnBsbF9jb24wLCBTNVBfVlBMTF9DT04wKTsKKwlfX3Jhd193cml0ZWwodnBsbF9jb24xLCBTNVBfVlBMTF9DT04xKTsKKworCS8qIFdhaXQgZm9yIFZQTEwgbG9jayAqLworCXdoaWxlICghKF9fcmF3X3JlYWRsKFM1UF9WUExMX0NPTjApICYgKDEgPDwgUExMNDZYWF9MT0NLRURfU0hJRlQpKSkKKwkJY29udGludWU7CisKKwljbGstPnJhdGUgPSByYXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgZXh5bm9zNF92cGxsX29wcyA9IHsKKwkuZ2V0X3JhdGUgPSBleHlub3M0X3ZwbGxfZ2V0X3JhdGUsCisJLnNldF9yYXRlID0gZXh5bm9zNF92cGxsX3NldF9yYXRlLAorfTsKKwordm9pZCBfX2luaXRfb3JfY3B1ZnJlcSBleHlub3M0X3NldHVwX2Nsb2Nrcyh2b2lkKQoreworCXN0cnVjdCBjbGsgKnh0YWxfY2xrOworCXVuc2lnbmVkIGxvbmcgYXBsbCA9IDA7CisJdW5zaWduZWQgbG9uZyBtcGxsID0gMDsKKwl1bnNpZ25lZCBsb25nIGVwbGwgPSAwOworCXVuc2lnbmVkIGxvbmcgdnBsbCA9IDA7CisJdW5zaWduZWQgbG9uZyB2cGxsc3JjOworCXVuc2lnbmVkIGxvbmcgeHRhbDsKKwl1bnNpZ25lZCBsb25nIGFybWNsazsKKwl1bnNpZ25lZCBsb25nIHNjbGtfZG1jOworCXVuc2lnbmVkIGxvbmcgYWNsa18yMDA7CisJdW5zaWduZWQgbG9uZyBhY2xrXzEwMDsKKwl1bnNpZ25lZCBsb25nIGFjbGtfMTYwOworCXVuc2lnbmVkIGxvbmcgYWNsa18xMzM7CisJdW5zaWduZWQgaW50IHB0cjsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVnaXN0ZXJpbmcgY2xvY2tzXG4iLCBfX2Z1bmNfXyk7CisKKwl4dGFsX2NsayA9IGNsa19nZXQoTlVMTCwgInh0YWwiKTsKKwlCVUdfT04oSVNfRVJSKHh0YWxfY2xrKSk7CisKKwl4dGFsID0gY2xrX2dldF9yYXRlKHh0YWxfY2xrKTsKKworCXh0YWxfcmF0ZSA9IHh0YWw7CisKKwljbGtfcHV0KHh0YWxfY2xrKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogeHRhbCBpcyAlbGRcbiIsIF9fZnVuY19fLCB4dGFsKTsKKworCWlmIChzb2NfaXNfZXh5bm9zNDIxMCgpKSB7CisJCWFwbGwgPSBzNXBfZ2V0X3BsbDQ1eHgoeHRhbCwgX19yYXdfcmVhZGwoUzVQX0FQTExfQ09OMCksCisJCQkJCXBsbF80NTA4KTsKKwkJbXBsbCA9IHM1cF9nZXRfcGxsNDV4eCh4dGFsLCBfX3Jhd19yZWFkbChTNVBfTVBMTF9DT04wKSwKKwkJCQkJcGxsXzQ1MDgpOworCQllcGxsID0gczVwX2dldF9wbGw0Nnh4KHh0YWwsIF9fcmF3X3JlYWRsKFM1UF9FUExMX0NPTjApLAorCQkJCQlfX3Jhd19yZWFkbChTNVBfRVBMTF9DT04xKSwgcGxsXzQ2MDApOworCisJCXZwbGxzcmMgPSBjbGtfZ2V0X3JhdGUoJmNsa192cGxsc3JjLmNsayk7CisJCXZwbGwgPSBzNXBfZ2V0X3BsbDQ2eHgodnBsbHNyYywgX19yYXdfcmVhZGwoUzVQX1ZQTExfQ09OMCksCisJCQkJCV9fcmF3X3JlYWRsKFM1UF9WUExMX0NPTjEpLCBwbGxfNDY1MGMpOworCX0gZWxzZSBpZiAoc29jX2lzX2V4eW5vczQyMTIoKSB8fCBzb2NfaXNfZXh5bm9zNDQxMigpKSB7CisJCWFwbGwgPSBzNXBfZ2V0X3BsbDM1eHgoeHRhbCwgX19yYXdfcmVhZGwoUzVQX0FQTExfQ09OMCkpOworCQltcGxsID0gczVwX2dldF9wbGwzNXh4KHh0YWwsIF9fcmF3X3JlYWRsKFM1UF9NUExMX0NPTjApKTsKKwkJZXBsbCA9IHM1cF9nZXRfcGxsMzZ4eCh4dGFsLCBfX3Jhd19yZWFkbChTNVBfRVBMTF9DT04wKSwKKwkJCQkJX19yYXdfcmVhZGwoUzVQX0VQTExfQ09OMSkpOworCisJCXZwbGxzcmMgPSBjbGtfZ2V0X3JhdGUoJmNsa192cGxsc3JjLmNsayk7CisJCXZwbGwgPSBzNXBfZ2V0X3BsbDM2eHgodnBsbHNyYywgX19yYXdfcmVhZGwoUzVQX1ZQTExfQ09OMCksCisJCQkJCV9fcmF3X3JlYWRsKFM1UF9WUExMX0NPTjEpKTsKKwl9IGVsc2UgeworCQkvKiBub3RoaW5nICovCisJfQorCisJY2xrX2ZvdXRfYXBsbC5vcHMgPSAmZXh5bm9zNF9mb3V0X2FwbGxfb3BzOworCWNsa19mb3V0X21wbGwucmF0ZSA9IG1wbGw7CisJY2xrX2ZvdXRfZXBsbC5yYXRlID0gZXBsbDsKKwljbGtfZm91dF92cGxsLm9wcyA9ICZleHlub3M0X3ZwbGxfb3BzOworCWNsa19mb3V0X3ZwbGwucmF0ZSA9IHZwbGw7CisKKwlwcmludGsoS0VSTl9JTkZPICJFWFlOT1M0OiBQTEwgc2V0dGluZ3MsIEE9JWxkLCBNPSVsZCwgRT0lbGQgVj0lbGQiLAorCQkJYXBsbCwgbXBsbCwgZXBsbCwgdnBsbCk7CisKKwlhcm1jbGsgPSBjbGtfZ2V0X3JhdGUoJmNsa19hcm1jbGsuY2xrKTsKKwlzY2xrX2RtYyA9IGNsa19nZXRfcmF0ZSgmY2xrX3NjbGtfZG1jLmNsayk7CisKKwlhY2xrXzIwMCA9IGNsa19nZXRfcmF0ZSgmY2xrX2FjbGtfMjAwLmNsayk7CisJYWNsa18xMDAgPSBjbGtfZ2V0X3JhdGUoJmNsa19hY2xrXzEwMC5jbGspOworCWFjbGtfMTYwID0gY2xrX2dldF9yYXRlKCZjbGtfYWNsa18xNjAuY2xrKTsKKwlhY2xrXzEzMyA9IGNsa19nZXRfcmF0ZSgmY2xrX2FjbGtfMTMzLmNsayk7CisKKwlwcmludGsoS0VSTl9JTkZPICJFWFlOT1M0OiBBUk1DTEs9JWxkLCBETUM9JWxkLCBBQ0xLMjAwPSVsZFxuIgorCQkJICJBQ0xLMTAwPSVsZCwgQUNMSzE2MD0lbGQsIEFDTEsxMzM9JWxkXG4iLAorCQkJYXJtY2xrLCBzY2xrX2RtYywgYWNsa18yMDAsCisJCQlhY2xrXzEwMCwgYWNsa18xNjAsIGFjbGtfMTMzKTsKKworCWNsa19mLnJhdGUgPSBhcm1jbGs7CisJY2xrX2gucmF0ZSA9IHNjbGtfZG1jOworCWNsa19wLnJhdGUgPSBhY2xrXzEwMDsKKworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShjbGtzcmNzKTsgcHRyKyspCisJCXMzY19zZXRfY2xrc3JjKCZjbGtzcmNzW3B0cl0sIHRydWUpOworfQorCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc1tdIF9faW5pdGRhdGEgPSB7CisJJmNsa19zY2xrX2hkbWkyN20sCisJJmNsa19zY2xrX2hkbWlwaHksCisJJmNsa19zY2xrX3VzYnBoeTAsCisJJmNsa19zY2xrX3VzYnBoeTEsCit9OworCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGV4eW5vczRfY2xvY2tfc3VzcGVuZCh2b2lkKQoreworCXMzY19wbV9kb19zYXZlKGV4eW5vczRfY2xvY2tfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2Nsb2NrX3NhdmUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9jbG9ja19yZXN1bWUodm9pZCkKK3sKKwlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKGV4eW5vczRfY2xvY2tfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2Nsb2NrX3NhdmUpKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgZXh5bm9zNF9jbG9ja19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgZXh5bm9zNF9jbG9ja19yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0cnVjdCBzeXNjb3JlX29wcyBleHlub3M0X2Nsb2NrX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kCT0gZXh5bm9zNF9jbG9ja19zdXNwZW5kLAorCS5yZXN1bWUJCT0gZXh5bm9zNF9jbG9ja19yZXN1bWUsCit9OworCit2b2lkIF9faW5pdCBleHlub3M0X3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKQoreworCWludCBwdHI7CisKKwlzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrcyhjbGtzLCBBUlJBWV9TSVpFKGNsa3MpKTsKKworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShzeXNjbGtzKTsgcHRyKyspCisJCXMzY19yZWdpc3Rlcl9jbGtzcmMoc3lzY2xrc1twdHJdLCAxKTsKKworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShzY2xrX3R2KTsgcHRyKyspCisJCXMzY19yZWdpc3Rlcl9jbGtzcmMoc2Nsa190dltwdHJdLCAxKTsKKworCXMzY19yZWdpc3Rlcl9jbGtzcmMoY2xrc3JjcywgQVJSQVlfU0laRShjbGtzcmNzKSk7CisJczNjX3JlZ2lzdGVyX2Nsb2Nrcyhpbml0X2Nsb2NrcywgQVJSQVlfU0laRShpbml0X2Nsb2NrcykpOworCisJczNjX3JlZ2lzdGVyX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7CisJczNjX2Rpc2FibGVfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKKworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZleHlub3M0X2Nsb2NrX3N5c2NvcmVfb3BzKTsKKwlzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZkdW1teV9hcGJfcGNsayk7CisKKwlzM2NfcHdtY2xrX2luaXQoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlYzI0NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2NwdS5jCkBAIC0wLDAgKzEsMjk4IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vcy9jcHUuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KKyNpbmNsdWRlIDxwbGF0L2FkYy1jb3JlLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorI2luY2x1ZGUgPHBsYXQvZmItY29yZS5oPgorI2luY2x1ZGUgPHBsYXQvZmltYy1jb3JlLmg+CisjaW5jbHVkZSA8cGxhdC9paWMtY29yZS5oPgorI2luY2x1ZGUgPHBsYXQvcmVzZXQuaD4KKyNpbmNsdWRlIDxwbGF0L3R2LWNvcmUuaD4KKworI2luY2x1ZGUgPG1hY2gvcmVncy1pcnEuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtcG11Lmg+CisKK3Vuc2lnbmVkIGludCBnaWNfYmFua19vZmZzZXQgX19yZWFkX21vc3RseTsKKworZXh0ZXJuIGludCBjb21iaW5lcl9pbml0KHVuc2lnbmVkIGludCBjb21iaW5lcl9uciwgdm9pZCBfX2lvbWVtICpiYXNlLAorCQkJIHVuc2lnbmVkIGludCBpcnFfc3RhcnQpOworZXh0ZXJuIHZvaWQgY29tYmluZXJfY2FzY2FkZV9pcnEodW5zaWduZWQgaW50IGNvbWJpbmVyX25yLCB1bnNpZ25lZCBpbnQgaXJxKTsKKworLyogSW5pdGlhbCBJTyBtYXBwaW5ncyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBleHlub3NfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX1NZU1RJTUVSLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TX1BBX1NZU1RJTUVSKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfUE1VLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TX1BBX1BNVSksCisJCS5sZW5ndGgJCT0gU1pfNjRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9DT01CSU5FUl9CQVNFLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TX1BBX0NPTUJJTkVSKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfR0lDX0NQVSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PU19QQV9HSUNfQ1BVKSwKKwkJLmxlbmd0aAkJPSBTWl82NEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0dJQ19ESVNULAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TX1BBX0dJQ19ESVNUKSwKKwkJLmxlbmd0aAkJPSBTWl82NEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzNDX1ZBX1VBUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihTM0NfUEFfVUFSVCksCisJCS5sZW5ndGgJCT0gU1pfNTEySywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGV4eW5vczRfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0NNVSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfQ01VKSwKKwkJLmxlbmd0aAkJPSBTWl8xMjhLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9DT1JFUEVSSV9CQVNFLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9DT1JFUEVSSSksCisJCS5sZW5ndGgJCT0gU1pfOEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0wyQ0MsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0wyQ0MpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9HUElPMSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfR1BJTzEpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9HUElPMiwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfR1BJTzIpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9HUElPMywKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfR1BJTzMpLAorCQkubGVuZ3RoCQk9IFNaXzI1NiwKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfRE1DMCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfRE1DMCksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX1NST01DLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9TUk9NQyksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzNDX1ZBX1VTQl9IU1BIWSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfSFNQSFkpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgZXh5bm9zNF9pb2Rlc2MwW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX1NZU1JBTSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfU1lTUkFNMCksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBleHlub3M0X2lvZGVzYzFbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfU1lTUkFNLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9TWVNSQU0xKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBleHlub3NfaWRsZSh2b2lkKQoreworCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCWNwdV9kb19pZGxlKCk7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfc3dfcmVzZXQodm9pZCkKK3sKKwlfX3Jhd193cml0ZWwoMHgxLCBTNVBfU1dSRVNFVCk7Cit9CisKKy8qCisgKiBleHlub3NfbWFwX2lvCisgKgorICogcmVnaXN0ZXIgdGhlIHN0YW5kYXJkIGNwdSBJTyBhcmVhcworICovCit2b2lkIF9faW5pdCBleHlub3M0X21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChleHlub3NfaW9kZXNjLCBBUlJBWV9TSVpFKGV4eW5vc19pb2Rlc2MpKTsKKwlpb3RhYmxlX2luaXQoZXh5bm9zNF9pb2Rlc2MsIEFSUkFZX1NJWkUoZXh5bm9zNF9pb2Rlc2MpKTsKKworCWlmIChzb2NfaXNfZXh5bm9zNDIxMCgpICYmIHNhbXN1bmdfcmV2KCkgPT0gRVhZTk9TNDIxMF9SRVZfMCkKKwkJaW90YWJsZV9pbml0KGV4eW5vczRfaW9kZXNjMCwgQVJSQVlfU0laRShleHlub3M0X2lvZGVzYzApKTsKKwllbHNlCisJCWlvdGFibGVfaW5pdChleHlub3M0X2lvZGVzYzEsIEFSUkFZX1NJWkUoZXh5bm9zNF9pb2Rlc2MxKSk7CisKKwkvKiBpbml0aWFsaXplIGRldmljZSBpbmZvcm1hdGlvbiBlYXJseSAqLworCWV4eW5vczRfZGVmYXVsdF9zZGhjaTAoKTsKKwlleHlub3M0X2RlZmF1bHRfc2RoY2kxKCk7CisJZXh5bm9zNF9kZWZhdWx0X3NkaGNpMigpOworCWV4eW5vczRfZGVmYXVsdF9zZGhjaTMoKTsKKworCXMzY19hZGNfc2V0bmFtZSgic2Ftc3VuZy1hZGMtdjMiKTsKKworCXMzY19maW1jX3NldG5hbWUoMCwgImV4eW5vczQtZmltYyIpOworCXMzY19maW1jX3NldG5hbWUoMSwgImV4eW5vczQtZmltYyIpOworCXMzY19maW1jX3NldG5hbWUoMiwgImV4eW5vczQtZmltYyIpOworCXMzY19maW1jX3NldG5hbWUoMywgImV4eW5vczQtZmltYyIpOworCisJLyogVGhlIEkyQyBidXMgY29udHJvbGxlcnMgYXJlIGRpcmVjdGx5IGNvbXBhdGlibGUgd2l0aCBzM2MyNDQwICovCisJczNjX2kyYzBfc2V0bmFtZSgiczNjMjQ0MC1pMmMiKTsKKwlzM2NfaTJjMV9zZXRuYW1lKCJzM2MyNDQwLWkyYyIpOworCXMzY19pMmMyX3NldG5hbWUoInMzYzI0NDAtaTJjIik7CisKKwlzNXBfZmJfc2V0bmFtZSgwLCAiZXh5bm9zNC1mYiIpOworCXM1cF9oZG1pX3NldG5hbWUoImV4eW5vczQtaGRtaSIpOworfQorCit2b2lkIF9faW5pdCBleHlub3M0X2luaXRfY2xvY2tzKGludCB4dGFsKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlczogaW5pdGlhbGl6aW5nIGNsb2Nrc1xuIiwgX19mdW5jX18pOworCisJczNjMjR4eF9yZWdpc3Rlcl9iYXNlY2xvY2tzKHh0YWwpOworCXM1cF9yZWdpc3Rlcl9jbG9ja3MoeHRhbCk7CisKKwlpZiAoc29jX2lzX2V4eW5vczQyMTAoKSkKKwkJZXh5bm9zNDIxMF9yZWdpc3Rlcl9jbG9ja3MoKTsKKwllbHNlIGlmIChzb2NfaXNfZXh5bm9zNDIxMigpIHx8IHNvY19pc19leHlub3M0NDEyKCkpCisJCWV4eW5vczQyMTJfcmVnaXN0ZXJfY2xvY2tzKCk7CisKKwlleHlub3M0X3JlZ2lzdGVyX2Nsb2NrcygpOworCWV4eW5vczRfc2V0dXBfY2xvY2tzKCk7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfZ2ljX2lycV9maXhfYmFzZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGdpY19jaGlwX2RhdGEgKmdpY19kYXRhID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwlnaWNfZGF0YS0+Y3B1X2Jhc2UgPSBTNVBfVkFfR0lDX0NQVSArCisJCQkgICAgKGdpY19iYW5rX29mZnNldCAqIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwlnaWNfZGF0YS0+ZGlzdF9iYXNlID0gUzVQX1ZBX0dJQ19ESVNUICsKKwkJCSAgICAoZ2ljX2Jhbmtfb2Zmc2V0ICogc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKwordm9pZCBfX2luaXQgZXh5bm9zNF9pbml0X2lycSh2b2lkKQoreworCWludCBpcnE7CisKKwlnaWNfYmFua19vZmZzZXQgPSBzb2NfaXNfZXh5bm9zNDQxMigpID8gMHg0MDAwIDogMHg4MDAwOworCisJZ2ljX2luaXQoMCwgSVJRX1BQSSgwKSwgUzVQX1ZBX0dJQ19ESVNULCBTNVBfVkFfR0lDX0NQVSk7CisJZ2ljX2FyY2hfZXh0bi5pcnFfZW9pID0gZXh5bm9zNF9naWNfaXJxX2ZpeF9iYXNlOworCWdpY19hcmNoX2V4dG4uaXJxX3VubWFzayA9IGV4eW5vczRfZ2ljX2lycV9maXhfYmFzZTsKKwlnaWNfYXJjaF9leHRuLmlycV9tYXNrID0gZXh5bm9zNF9naWNfaXJxX2ZpeF9iYXNlOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCBNQVhfQ09NQklORVJfTlI7IGlycSsrKSB7CisKKwkJY29tYmluZXJfaW5pdChpcnEsICh2b2lkIF9faW9tZW0gKilTNVBfVkFfQ09NQklORVIoaXJxKSwKKwkJCQlDT01CSU5FUl9JUlEoaXJxLCAwKSk7CisJCWNvbWJpbmVyX2Nhc2NhZGVfaXJxKGlycSwgSVJRX1NQSShpcnEpKTsKKwl9CisKKwkvKiBUaGUgcGFyYW1ldGVycyBvZiBzNXBfaW5pdF9pcnEoKSBhcmUgZm9yIFZJQyBpbml0LgorCSAqIFRoZXNlcyBwYXJhbWV0ZXJzIHNob3VsZCBiZSBOVUxMIGFuZCAwIGJlY2F1c2UgRVhZTk9TNAorCSAqIHVzZXMgR0lDIGluc3RlYWQgb2YgVklDLgorCSAqLworCXM1cF9pbml0X2lycShOVUxMLCAwKTsKK30KKworc3RydWN0IHN5c2Rldl9jbGFzcyBleHlub3M0X3N5c2NsYXNzID0geworCS5uYW1lCT0gImV4eW5vczQtY29yZSIsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZXh5bm9zNF9zeXNkZXYgPSB7CisJLmNscwk9ICZleHlub3M0X3N5c2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXh5bm9zNF9jb3JlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZleHlub3M0X3N5c2NsYXNzKTsKK30KK2NvcmVfaW5pdGNhbGwoZXh5bm9zNF9jb3JlX2luaXQpOworCisjaWZkZWYgQ09ORklHX0NBQ0hFX0wyWDAKK3N0YXRpYyBpbnQgX19pbml0IGV4eW5vczRfbDJ4MF9jYWNoZV9pbml0KHZvaWQpCit7CisJLyogVEFHLCBEYXRhIExhdGVuY3kgQ29udHJvbDogMmN5Y2xlICovCisJX19yYXdfd3JpdGVsKDB4MTEwLCBTNVBfVkFfTDJDQyArIEwyWDBfVEFHX0xBVEVOQ1lfQ1RSTCk7CisKKwlpZiAoc29jX2lzX2V4eW5vczQyMTAoKSkKKwkJX19yYXdfd3JpdGVsKDB4MTEwLCBTNVBfVkFfTDJDQyArIEwyWDBfREFUQV9MQVRFTkNZX0NUUkwpOworCWVsc2UgaWYgKHNvY19pc19leHlub3M0MjEyKCkgfHwgc29jX2lzX2V4eW5vczQ0MTIoKSkKKwkJX19yYXdfd3JpdGVsKDB4MTIwLCBTNVBfVkFfTDJDQyArIEwyWDBfREFUQV9MQVRFTkNZX0NUUkwpOworCisJLyogTDJYMCBQcmVmZXRjaCBDb250cm9sICovCisJX19yYXdfd3JpdGVsKDB4MzAwMDAwMDcsIFM1UF9WQV9MMkNDICsgTDJYMF9QUkVGRVRDSF9DVFJMKTsKKworCS8qIEwyWDAgUG93ZXIgQ29udHJvbCAqLworCV9fcmF3X3dyaXRlbChMMlgwX0RZTkFNSUNfQ0xLX0dBVElOR19FTiB8IEwyWDBfU1ROREJZX01PREVfRU4sCisJCSAgICAgUzVQX1ZBX0wyQ0MgKyBMMlgwX1BPV0VSX0NUUkwpOworCisJbDJ4MF9pbml0KFM1UF9WQV9MMkNDLCAweDdDNDcwMDAxLCAweEMyMDBmZmZmKTsKKworCXJldHVybiAwOworfQorCitlYXJseV9pbml0Y2FsbChleHlub3M0X2wyeDBfY2FjaGVfaW5pdCk7CisjZW5kaWYKKworaW50IF9faW5pdCBleHlub3NfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkVYWU5PUzogSW5pdGlhbGl6aW5nIGFyY2hpdGVjdHVyZVxuIik7CisKKwkvKiBzZXQgaWRsZSBmdW5jdGlvbiAqLworCXBtX2lkbGUgPSBleHlub3NfaWRsZTsKKworCS8qIHNldCBzd19yZXNldCBmdW5jdGlvbiAqLworCWlmIChzb2NfaXNfZXh5bm9zNDIxMCgpIHx8IHNvY19pc19leHlub3M0MjEyKCkgfHwgc29jX2lzX2V4eW5vczQ0MTIoKSkKKwkJczVwX3Jlc2V0X2hvb2sgPSBleHlub3M0X3N3X3Jlc2V0OworCisJcmV0dXJuIHN5c2Rldl9yZWdpc3RlcigmZXh5bm9zNF9zeXNkZXYpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvY3B1aWRsZS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvY3B1aWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjY1MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9jcHVpZGxlLmMKQEAgLTAsMCArMSw5MCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdWlkbGUuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgorCitzdGF0aWMgaW50IGV4eW5vczRfZW50ZXJfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJICAgICAgaW50IGluZGV4KTsKKworc3RhdGljIHN0cnVjdCBjcHVpZGxlX3N0YXRlIGV4eW5vczRfY3B1aWRsZV9zZXRbXSA9IHsKKwlbMF0gPSB7CisJCS5lbnRlcgkJCT0gZXh5bm9zNF9lbnRlcl9pZGxlLAorCQkuZXhpdF9sYXRlbmN5CQk9IDEsCisJCS50YXJnZXRfcmVzaWRlbmN5CT0gMTAwMDAwLAorCQkuZmxhZ3MJCQk9IENQVUlETEVfRkxBR19USU1FX1ZBTElELAorCQkubmFtZQkJCT0gIklETEUiLAorCQkuZGVzYwkJCT0gIkFSTSBjbG9jayBnYXRpbmcoV0ZJKSIsCisJfSwKK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UsIGV4eW5vczRfY3B1aWRsZV9kZXZpY2UpOworCitzdGF0aWMgc3RydWN0IGNwdWlkbGVfZHJpdmVyIGV4eW5vczRfaWRsZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImV4eW5vczRfaWRsZSIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBleHlub3M0X2VudGVyX2lkbGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkgICAgICBpbnQgaW5kZXgpCit7CisJc3RydWN0IHRpbWV2YWwgYmVmb3JlLCBhZnRlcjsKKwlpbnQgaWRsZV90aW1lOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkb19nZXR0aW1lb2ZkYXkoJmJlZm9yZSk7CisKKwljcHVfZG9faWRsZSgpOworCisJZG9fZ2V0dGltZW9mZGF5KCZhZnRlcik7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWlkbGVfdGltZSA9IChhZnRlci50dl9zZWMgLSBiZWZvcmUudHZfc2VjKSAqIFVTRUNfUEVSX1NFQyArCisJCSAgICAoYWZ0ZXIudHZfdXNlYyAtIGJlZm9yZS50dl91c2VjKTsKKworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSBpZGxlX3RpbWU7CisJcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgaW50IF9faW5pdCBleHlub3M0X2luaXRfY3B1aWRsZSh2b2lkKQoreworCWludCBpLCBtYXhfY3B1aWRsZV9zdGF0ZSwgY3B1X2lkOworCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gJmV4eW5vczRfaWRsZV9kcml2ZXI7CisKKwkvKiBTZXR1cCBjcHVpZGxlIGRyaXZlciAqLworCWRydi0+c3RhdGVfY291bnQgPSAoc2l6ZW9mKGV4eW5vczRfY3B1aWRsZV9zZXQpIC8KKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjcHVpZGxlX3N0YXRlKSk7CisJbWF4X2NwdWlkbGVfc3RhdGUgPSBkcnYtPnN0YXRlX2NvdW50OworCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1aWRsZV9zdGF0ZTsgaSsrKSB7CisJCW1lbWNweSgmZHJ2LT5zdGF0ZXNbaV0sICZleHlub3M0X2NwdWlkbGVfc2V0W2ldLAorCQkJCXNpemVvZihzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSkpOworCX0KKwljcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigmZXh5bm9zNF9pZGxlX2RyaXZlcik7CisKKwlmb3JfZWFjaF9jcHUoY3B1X2lkLCBjcHVfb25saW5lX21hc2spIHsKKwkJZGV2aWNlID0gJnBlcl9jcHUoZXh5bm9zNF9jcHVpZGxlX2RldmljZSwgY3B1X2lkKTsKKwkJZGV2aWNlLT5jcHUgPSBjcHVfaWQ7CisKKwkJZGV2aWNlLT5zdGF0ZV9jb3VudCA9IGRydi0+c3RhdGVfY291bnQ7CisKKwkJaWYgKGNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKGRldmljZSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ1BVaWRsZSByZWdpc3RlciBkZXZpY2UgZmFpbGVkXG4sIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChleHlub3M0X2luaXRfY3B1aWRsZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LWFoY2kuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Rldi1haGNpLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtYWhjaS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9kZXYtYWhjaS5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LWF1ZGlvLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9kZXYtYXVkaW8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1hdWRpby5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9kZXYtYXVkaW8uYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1kd21jaS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvZGV2LWR3bWNpLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtZHdtY2kuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvZGV2LWR3bWNpLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtcGQuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Rldi1wZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LXBkLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2Rldi1wZC5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9kZXYtc3lzbW11LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9kZXYtc3lzbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxNTYzZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Rldi1zeXNtbXUuYwpAQCAtMCwwICsxLDIzMyBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1zeXNtbXUuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBFWFlOT1M0IC0gU3lzdGVtIE1NVSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9zeXNtbXUuaD4KKyNpbmNsdWRlIDxwbGF0L3M1cC1jbG9jay5oPgorCisvKiBUaGVzZSBuYW1lcyBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjbG9jayBuYW1lcyBpbiBtYWNoLWV4eW5vczQvY2xvY2suYyAqLworY29uc3QgY2hhciAqc3lzbW11X2lwc19uYW1lW0VYWU5PUzRfU1lTTU1VX1RPVEFMX0lQTlVNXSA9IHsKKwkiU1lTTU1VX01ETUEiCSwKKwkiU1lTTU1VX1NTUyIJLAorCSJTWVNNTVVfRklNQzAiCSwKKwkiU1lTTU1VX0ZJTUMxIgksCisJIlNZU01NVV9GSU1DMiIJLAorCSJTWVNNTVVfRklNQzMiCSwKKwkiU1lTTU1VX0pQRUciCSwKKwkiU1lTTU1VX0ZJTUQwIgksCisJIlNZU01NVV9GSU1EMSIJLAorCSJTWVNNTVVfUENJZSIJLAorCSJTWVNNTVVfRzJEIgksCisJIlNZU01NVV9ST1RBVE9SIiwKKwkiU1lTTU1VX01ETUEyIgksCisJIlNZU01NVV9UViIJLAorCSJTWVNNTVVfTUZDX0wiCSwKKwkiU1lTTU1VX01GQ19SIgksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGV4eW5vczRfc3lzbW11X3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRE1BLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfTURNQSArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX01ETUEwXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX01ETUEwXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9TU1MsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9TU1MgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVszXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9TU1NfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfU1NTXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzRdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMCwKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMwICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbNV0gPSB7CisJCS5zdGFydAk9IElSUV9TWVNNTVVfRklNQzBfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfRklNQzBfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbNl0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMxLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzEgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVs3XSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9GSU1DMV8wLAorCQkuZW5kCT0gSVJRX1NZU01NVV9GSU1DMV8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVs4XSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzIsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMiArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzldID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0ZJTUMyXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX0ZJTUMyXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzEwXSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzMsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMyArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzExXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9GSU1DM18wLAorCQkuZW5kCT0gSVJRX1NZU01NVV9GSU1DM18wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsxMl0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0pQRUcsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9KUEVHICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMTNdID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0pQRUdfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfSlBFR18wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsxNF0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUQwLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNRDAgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxNV0gPSB7CisJCS5zdGFydAk9IElSUV9TWVNNTVVfTENEMF9NMF8wLAorCQkuZW5kCT0gSVJRX1NZU01NVV9MQ0QwX00wXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzE2XSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNRDEsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1EMSArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzE3XSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9MQ0QxX00xXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX0xDRDFfTTFfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMThdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9QQ0llLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfUENJZSArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzE5XSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9QQ0lFXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX1BDSUVfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMjBdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9HMkQsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9HMkQgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsyMV0gPSB7CisJCS5zdGFydAk9IElSUV9TWVNNTVVfMkRfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfMkRfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMjJdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9ST1RBVE9SLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfUk9UQVRPUiArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzIzXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9ST1RBVE9SXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX1JPVEFUT1JfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMjRdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRE1BMiwKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX01ETUEyICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMjVdID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX01ETUExXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX01ETUExXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzI2XSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfVFYsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9UViArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzI3XSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9UVl9NMF8wLAorCQkuZW5kCT0gSVJRX1NZU01NVV9UVl9NMF8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyOF0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX01GQ19MLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfTUZDX0wgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsyOV0gPSB7CisJCS5zdGFydAk9IElSUV9TWVNNTVVfTUZDX00wXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX01GQ19NMF8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszMF0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX01GQ19SLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfTUZDX1IgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVszMV0gPSB7CisJCS5zdGFydAk9IElSUV9TWVNNTVVfTUZDX00xXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX01GQ19NMV8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9zeXNtbXUgPSB7CisJLm5hbWUJCT0gInM1cC1zeXNtbXUiLAorCS5pZAkJPSAzMiwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZXh5bm9zNF9zeXNtbXVfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IGV4eW5vczRfc3lzbW11X3Jlc291cmNlLAorfTsKK0VYUE9SVF9TWU1CT0woZXh5bm9zNF9kZXZpY2Vfc3lzbW11KTsKKworc3RhdGljIHN0cnVjdCBjbGsgKnN5c21tdV9jbGtbUzVQX1NZU01NVV9UT1RBTF9JUE5VTV07Cit2b2lkIHN5c21tdV9jbGtfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN5c21tdV9pcHMgaXBzKQoreworCXN5c21tdV9jbGtbaXBzXSA9IGNsa19nZXQoZGV2LCBzeXNtbXVfaXBzX25hbWVbaXBzXSk7CisJaWYgKElTX0VSUihzeXNtbXVfY2xrW2lwc10pKQorCQlzeXNtbXVfY2xrW2lwc10gPSBOVUxMOworCWVsc2UKKwkJY2xrX3B1dChzeXNtbXVfY2xrW2lwc10pOworfQorCit2b2lkIHN5c21tdV9jbGtfZW5hYmxlKHN5c21tdV9pcHMgaXBzKQoreworCWlmIChzeXNtbXVfY2xrW2lwc10pCisJCWNsa19lbmFibGUoc3lzbW11X2Nsa1tpcHNdKTsKK30KKwordm9pZCBzeXNtbXVfY2xrX2Rpc2FibGUoc3lzbW11X2lwcyBpcHMpCit7CisJaWYgKHN5c21tdV9jbGtbaXBzXSkKKwkJY2xrX2Rpc2FibGUoc3lzbW11X2Nsa1tpcHNdKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2N2M2MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2RtYS5jCkBAIC0wLDAgKzEsMjUwIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvZG1hLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZC4KKyAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwzMzAuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2lycXMuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKworc3RhdGljIHU2NCBkbWFfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0cnVjdCBkbWFfcGwzMzBfcGVyaSBwZG1hMF9wZXJpWzI4XSA9IHsKKwl7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01TTV9SRVEwLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTVNNX1JFUTIsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkyX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwU19UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQ0X1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUNF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU0xJTUJVUzBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NMSU1CVVMwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TTElNQlVTMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU0xJTUJVUzJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NMSU1CVVM0X1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TTElNQlVTNF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfQUM5N19NSUNJTiwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfQUM5N19QQ01JTiwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfQUM5N19QQ01PVVQsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LAorfTsKKworc3RydWN0IGRtYV9wbDMzMF9wbGF0ZGF0YSBleHlub3M0X3BkbWEwX3BkYXRhID0geworCS5ucl92YWxpZF9wZXJpID0gQVJSQVlfU0laRShwZG1hMF9wZXJpKSwKKwkucGVyaSA9IHBkbWEwX3BlcmksCit9OworCitzdHJ1Y3QgYW1iYV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfcGRtYTAgPSB7CisJLmRldiA9IHsKKwkJLmluaXRfbmFtZSA9ICJkbWEtcGwzMzAuMCIsCisJCS5kbWFfbWFzayA9ICZkbWFfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXh5bm9zNF9wZG1hMF9wZGF0YSwKKwl9LAorCS5yZXMgPSB7CisJCS5zdGFydCA9IEVYWU5PUzRfUEFfUERNQTAsCisJCS5lbmQgPSBFWFlOT1M0X1BBX1BETUEwICsgU1pfNEssCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLmlycSA9IHtJUlFfUERNQTAsIE5PX0lSUX0sCisJLnBlcmlwaGlkID0gMHgwMDA0MTMzMCwKK307CisKK3N0cnVjdCBkbWFfcGwzMzBfcGVyaSBwZG1hMV9wZXJpWzI1XSA9IHsKKwl7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01TTV9SRVExLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTVNNX1JFUTMsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwU19UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUM19UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU0xJTUJVUzFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NMSU1CVVMxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TTElNQlVTM19SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU0xJTUJVUzNfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NMSU1CVVM1X1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TTElNQlVTNV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sCit9OworCitzdHJ1Y3QgZG1hX3BsMzMwX3BsYXRkYXRhIGV4eW5vczRfcGRtYTFfcGRhdGEgPSB7CisJLm5yX3ZhbGlkX3BlcmkgPSBBUlJBWV9TSVpFKHBkbWExX3BlcmkpLAorCS5wZXJpID0gcGRtYTFfcGVyaSwKK307CisKK3N0cnVjdCBhbWJhX2RldmljZSBleHlub3M0X2RldmljZV9wZG1hMSA9IHsKKwkuZGV2ID0geworCQkuaW5pdF9uYW1lID0gImRtYS1wbDMzMC4xIiwKKwkJLmRtYV9tYXNrID0gJmRtYV9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCQkucGxhdGZvcm1fZGF0YSA9ICZleHlub3M0X3BkbWExX3BkYXRhLAorCX0sCisJLnJlcyA9IHsKKwkJLnN0YXJ0ID0gRVhZTk9TNF9QQV9QRE1BMSwKKwkJLmVuZCA9IEVYWU5PUzRfUEFfUERNQTEgKyBTWl80SywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkuaXJxID0ge0lSUV9QRE1BMSwgTk9fSVJRfSwKKwkucGVyaXBoaWQgPSAweDAwMDQxMzMwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXh5bm9zNF9kbWFfaW5pdCh2b2lkKQoreworCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKCZleHlub3M0X2RldmljZV9wZG1hMCwgJmlvbWVtX3Jlc291cmNlKTsKKwlhbWJhX2RldmljZV9yZWdpc3RlcigmZXh5bm9zNF9kZXZpY2VfcGRtYTEsICZpb21lbV9yZXNvdXJjZSk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoZXh5bm9zNF9kbWFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaGVhZHNtcC5TIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaGVhZHNtcC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvaGVhZHNtcC5TCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9oZWFkc21wLlMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTcwZTdlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaG90cGx1Zy5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiBsaW51eCBhcmNoL2FybS9tYWNoLWV4eW5vczQvaG90cGx1Zy5jCisgKgorICogIENsb25lZCBmcm9tIGxpbnV4L2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBBUk0gTHRkLgorICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtcG11Lmg+CisKK2V4dGVybiB2b2xhdGlsZSBpbnQgcGVuX3JlbGVhc2U7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfZW50ZXJfbG93cG93ZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdjsKKworCWZsdXNoX2NhY2hlX2FsbCgpOworCWFzbSB2b2xhdGlsZSgKKwkiCW1jcglwMTUsIDAsICUxLCBjNywgYzUsIDBcbiIKKwkiCW1jcglwMTUsIDAsICUxLCBjNywgYzEwLCA0XG4iCisJLyoKKwkgKiBUdXJuIG9mZiBjb2hlcmVuY3kKKwkgKi8KKwkiCW1yYwlwMTUsIDAsICUwLCBjMSwgYzAsIDFcbiIKKwkiCWJpYwklMCwgJTAsICUzXG4iCisJIgltY3IJcDE1LCAwLCAlMCwgYzEsIGMwLCAxXG4iCisJIgltcmMJcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCisJIgliaWMJJTAsICUwLCAlMlxuIgorCSIJbWNyCXAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgorCSAgOiAiPSZyIiAodikKKwkgIDogInIiICgwKSwgIklyIiAoQ1JfQyksICJJciIgKDB4NDApCisJICA6ICJjYyIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2xlYXZlX2xvd3Bvd2VyKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHY7CisKKwlhc20gdm9sYXRpbGUoCisJIm1yYwlwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKKwkiCW9ycgklMCwgJTAsICUxXG4iCisJIgltY3IJcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCisJIgltcmMJcDE1LCAwLCAlMCwgYzEsIGMwLCAxXG4iCisJIglvcnIJJTAsICUwLCAlMlxuIgorCSIJbWNyCXAxNSwgMCwgJTAsIGMxLCBjMCwgMVxuIgorCSAgOiAiPSZyIiAodikKKwkgIDogIklyIiAoQ1JfQyksICJJciIgKDB4NDApCisJICA6ICJjYyIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGxhdGZvcm1fZG9fbG93cG93ZXIodW5zaWduZWQgaW50IGNwdSwgaW50ICpzcHVyaW91cykKK3sKKwlmb3IgKDs7KSB7CisKKwkJLyogbWFrZSBjcHUxIHRvIGJlIHR1cm5lZCBvZmYgYXQgbmV4dCBXRkkgY29tbWFuZCAqLworCQlpZiAoY3B1ID09IDEpCisJCQlfX3Jhd193cml0ZWwoMCwgUzVQX0FSTV9DT1JFMV9DT05GSUdVUkFUSU9OKTsKKworCQkvKgorCQkgKiBoZXJlJ3MgdGhlIFdGSQorCQkgKi8KKwkJYXNtKCIud29yZAkweGUzMjBmMDAzXG4iCisJCSAgICA6CisJCSAgICA6CisJCSAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKworCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1X2xvZ2ljYWxfbWFwKGNwdSkpIHsKKwkJCS8qCisJCQkgKiBPSywgcHJvcGVyIHdha2V1cCwgd2UncmUgZG9uZQorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEdldHRpbmcgaGVyZSwgbWVhbnMgdGhhdCB3ZSBoYXZlIGNvbWUgb3V0IG9mIFdGSSB3aXRob3V0CisJCSAqIGhhdmluZyBiZWVuIHdva2VuIHVwIC0gdGhpcyBzaG91bGRuJ3QgaGFwcGVuCisJCSAqCisJCSAqIEp1c3Qgbm90ZSBpdCBoYXBwZW5pbmcgLSB3aGVuIHdlJ3JlIHdva2VuLCB3ZSBjYW4gcmVwb3J0CisJCSAqIGl0cyBvY2N1cnJlbmNlLgorCQkgKi8KKwkJKCpzcHVyaW91cykrKzsKKwl9Cit9CisKK2ludCBwbGF0Zm9ybV9jcHVfa2lsbCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiAxOworfQorCisvKgorICogcGxhdGZvcm0tc3BlY2lmaWMgY29kZSB0byBzaHV0ZG93biBhIENQVQorICoKKyAqIENhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQKKyAqLwordm9pZCBwbGF0Zm9ybV9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IHNwdXJpb3VzID0gMDsKKworCS8qCisJICogd2UncmUgcmVhZHkgZm9yIHNodXRkb3duIG5vdywgc28gZG8gaXQKKwkgKi8KKwljcHVfZW50ZXJfbG93cG93ZXIoKTsKKwlwbGF0Zm9ybV9kb19sb3dwb3dlcihjcHUsICZzcHVyaW91cyk7CisKKwkvKgorCSAqIGJyaW5nIHRoaXMgQ1BVIGJhY2sgaW50byB0aGUgd29ybGQgb2YgY2FjaGUKKwkgKiBjb2hlcmVuY3ksIGFuZCB0aGVuIHJlc3RvcmUgaW50ZXJydXB0cworCSAqLworCWNwdV9sZWF2ZV9sb3dwb3dlcigpOworCisJaWYgKHNwdXJpb3VzKQorCQlwcl93YXJuKCJDUFUldTogJXUgc3B1cmlvdXMgd2FrZXVwIGNhbGxzXG4iLCBjcHUsIHNwdXJpb3VzKTsKK30KKworaW50IHBsYXRmb3JtX2NwdV9kaXNhYmxlKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiB3ZSBkb24ndCBhbGxvdyBDUFUgMCB0byBiZSBzaHV0ZG93biAoaXQgaXMgc3RpbGwgdG9vIHNwZWNpYWwKKwkgKiBlLmcuIGNsb2NrIHRpY2sgaW50ZXJydXB0cykKKwkgKi8KKwlyZXR1cm4gY3B1ID09IDAgPyAtRVBFUk0gOiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2FjZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTAsMCArMSwzNSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKy8qIHB1bGwgaW4gdGhlIHJlbGV2YW50IHJlZ2lzdGVyIGFuZCBtYXAgZmlsZXMuICovCisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisJLyogbm90ZSwgZm9yIHRoZSBib290IHByb2Nlc3MgdG8gd29yayB3ZSBoYXZlIHRvIGtlZXAgdGhlIFVBUlQKKwkgKiB2aXJ0dWFsIGFkZHJlc3MgYWxpZ25lZCB0byBhbiAxTWlCIGJvdW5kYXJ5IGZvciB0aGUgTDEKKwkgKiBtYXBwaW5nIHRoZSBoZWFkIGNvZGUgbWFrZXMuIFdlIGtlZXAgdGhlIFVBUlQgdmlydHVhbCBhZGRyZXNzCisJICogYWxpZ25lZCBhbmQgYWRkIGluIHRoZSBvZmZzZXQgd2hlbiB3ZSBsb2FkIHRoZSB2YWx1ZSBoZXJlLgorCSAqLworCisJLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYsIHRtcAorCQlsZHIJXHJwLCA9IFMzQ19QQV9VQVJUCisJCWxkcglccnYsID0gUzNDX1ZBX1VBUlQKKyNpZiBDT05GSUdfREVCVUdfUzNDX1VBUlQgIT0gMAorCQlhZGQJXHJwLCBccnAsICMoMHgxMDAwMCAqIENPTkZJR19ERUJVR19TM0NfVUFSVCkKKwkJYWRkCVxydiwgXHJ2LCAjKDB4MTAwMDAgKiBDT05GSUdfREVCVUdfUzNDX1VBUlQpCisjZW5kaWYKKwkuZW5kbQorCisjZGVmaW5lIGZpZm9fZnVsbCBmaWZvX2Z1bGxfczVwdjIxMAorI2RlZmluZSBmaWZvX2xldmVsIGZpZm9fbGV2ZWxfczVwdjIxMAorCisjaW5jbHVkZSA8cGxhdC9kZWJ1Zy1tYWNyby5TPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTg0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQuCisgKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX01BQ0hfRE1BX0gKKyNkZWZpbmUgX19NQUNIX0RNQV9ICisKKy8qIFRoaXMgcGxhdGZvcm0gdXNlcyB0aGUgY29tbW9uIERNQSBBUEkgZHJpdmVyIGZvciBQTDMzMCAqLworI2luY2x1ZGUgPHBsYXQvZG1hLXBsMzMwLmg+CisKKyNlbmRpZiAvKiBfX01BQ0hfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZHdtY2kuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9kd21jaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2R3bWNpLmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9kd21jaS5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTlmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMCwwICsxLDkxIEBACisvKiBhcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKyAqCisgKiBDbG9uZWQgZnJvbSBhcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisgKgorICogTG93LWxldmVsIElSUSBoZWxwZXIgbWFjcm9zIGZvciBFWFlOT1M0IHBsYXRmb3JtcworICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKi8KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKworCQkubWFjcm8JZGlzYWJsZV9maXEKKwkJLmVuZG0KKworCQkubWFjcm8gIGdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgdG1wCisJCW1vdglcdG1wLCAjMAorCisJCW1yYwlwMTUsIDAsIFxiYXNlLCBjMCwgYzAsIDUKKwkJYW5kCVxiYXNlLCBcYmFzZSwgIzMKKwkJY21wCVxiYXNlLCAjMAorCQliZXEJMWYKKworCQlsZHIJXHRtcCwgPWdpY19iYW5rX29mZnNldAorCQlsZHIJXHRtcCwgW1x0bXBdCisJCWNtcAlcYmFzZSwgIzEKKwkJYmVxCTFmCisKKwkJY21wCVxiYXNlLCAjMgorCQlhZGRlcQlcdG1wLCBcdG1wLCBcdG1wCisJCWFkZG5lCVx0bXAsIFx0bXAsIFx0bXAsIExTTCAjMQorCisxOgkJbGRyCVxiYXNlLCA9Z2ljX2NwdV9iYXNlX2FkZHIKKwkJbGRyCVxiYXNlLCBbXGJhc2VdCisJCWFkZAlcYmFzZSwgXGJhc2UsIFx0bXAKKwkJLmVuZG0KKworCQkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKKwkJLmVuZG0KKworCQkvKgorCQkgKiBUaGUgaW50ZXJydXB0IG51bWJlcmluZyBzY2hlbWUgaXMgZGVmaW5lZCBpbiB0aGUKKwkJICogaW50ZXJydXB0IGNvbnRyb2xsZXIgc3BlYy4gIFRvIHdpdDoKKwkJICoKKwkJICogSW50ZXJydXB0cyAwLTE1IGFyZSBJUEkKKwkJICogMTYtMjggYXJlIHJlc2VydmVkCisJCSAqIDI5LTMxIGFyZSBsb2NhbC4gIFdlIGFsbG93IDMwIHRvIGJlIHVzZWQgZm9yIHRoZSB3YXRjaGRvZy4KKwkJICogMzItMTAyMCBhcmUgZ2xvYmFsCisJCSAqIDEwMjEtMTAyMiBhcmUgcmVzZXJ2ZWQKKwkJICogMTAyMyBpcyAic3B1cmlvdXMiIChubyBpbnRlcnJ1cHQpCisJCSAqCisJCSAqIEZvciBub3csIHdlIGlnbm9yZSBhbGwgbG9jYWwgaW50ZXJydXB0cyBzbyBvbmx5IHJldHVybiBhbiBpbnRlcnJ1cHQgaWYgaXQncworCQkgKiBiZXR3ZWVuIDMwIGFuZCAxMDIwLiAgVGhlIHRlc3RfZm9yX2lwaSByb3V0aW5lIGJlbG93IHdpbGwgcGljayB1cCBvbiBJUElzLgorCQkgKgorCQkgKiBBIHNpbXBsZSByZWFkIGZyb20gdGhlIGNvbnRyb2xsZXIgd2lsbCB0ZWxsIHVzIHRoZSBudW1iZXIgb2YgdGhlIGhpZ2hlc3QKKyAgICAgICAgICAgICAgICAgKiBwcmlvcml0eSBlbmFibGVkIGludGVycnVwdC4gIFdlIHRoZW4ganVzdCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgaW4gdGhlCisJCSAqIHZhbGlkIHJhbmdlIGZvciBhbiBJUlEgKDMwLTEwMjAgaW5jbHVzaXZlKS4KKwkJICovCisKKwkJLm1hY3JvICBnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKKworCQlsZHIgICAgIFxpcnFzdGF0LCBbXGJhc2UsICNHSUNfQ1BVX0lOVEFDS10gLyogYml0cyAxMi0xMCA9IHNyYyBDUFUsIDktMCA9IGludCAjICovCisKKwkJbGRyCVx0bXAsID0xMDIxCisKKwkJYmljICAgICBcaXJxbnIsIFxpcnFzdGF0LCAjMHgxYzAwCisKKwkJY21wICAgICBcaXJxbnIsICMxNQorCQljbXBjYwlcaXJxbnIsIFxpcnFucgorCQljbXBuZQlcaXJxbnIsIFx0bXAKKwkJY21wY3MJXGlycW5yLCBcaXJxbnIKKwkJYWRkbmUJXGlycW5yLCBcaXJxbnIsICMzMgorCisJCS5lbmRtCisKKwkJLyogV2UgYXNzdW1lIHRoYXQgaXJxc3RhdCAodGhlIHJhdyB2YWx1ZSBvZiB0aGUgSVJRIGFja25vd2xlZGdlCisJCSAqIHJlZ2lzdGVyKSBpcyBwcmVzZXJ2ZWQgZnJvbSB0aGUgbWFjcm8gYWJvdmUuCisJCSAqIElmIHRoZXJlIGlzIGFuIElQSSwgd2UgaW1tZWRpYXRlbHkgc2lnbmFsIGVuZCBvZiBpbnRlcnJ1cHQgb24gdGhlCisJCSAqIGNvbnRyb2xsZXIsIHNpbmNlIHRoaXMgcmVxdWlyZXMgdGhlIG9yaWdpbmFsIGlycXN0YXQgdmFsdWUgd2hpY2gKKwkJICogd2Ugd29uJ3QgZWFzaWx5IGJlIGFibGUgdG8gcmVjcmVhdGUgbGF0ZXIuCisJCSAqLworCisJCS5tYWNybyB0ZXN0X2Zvcl9pcGksIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKKwkJYmljCVxpcnFuciwgXGlycXN0YXQsICMweDFjMDAKKwkJY21wCVxpcnFuciwgIzE2CisJCXN0cmNjCVxpcnFzdGF0LCBbXGJhc2UsICNHSUNfQ1BVX0VPSV0KKwkJY21wY3MJXGlycW5yLCBcaXJxbnIKKwkJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9leHlub3M0LWNsb2NrLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZXh5bm9zNC1jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2ZjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZXh5bm9zNC1jbG9jay5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2V4eW5vczQtY2xvY2suaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgZXh5bm9zNCBjbG9jayBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9DTE9DS19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfQ0xPQ0tfSCBfX0ZJTEVfXworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19zY2xrX2hkbWkyN207CitleHRlcm4gc3RydWN0IGNsayBjbGtfc2Nsa191c2JwaHkwOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX3NjbGtfdXNicGh5MTsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19zY2xrX2hkbWlwaHk7CisKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa19hcGxsOworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X21wbGw7CitleHRlcm4gc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfMTMzOworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2VwbGw7CitleHRlcm4gc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfdnBsbDsKKworZXh0ZXJuIHN0cnVjdCBjbGsgKmNsa3NldF9jb3JlYnVzX2xpc3RbXTsKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X21vdXRfY29yZWJ1czsKKworZXh0ZXJuIHN0cnVjdCBjbGsgKmNsa3NldF9hY2xrX3RvcF9saXN0W107CitleHRlcm4gc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9hY2xrOworCitleHRlcm4gc3RydWN0IGNsayAqY2xrc2V0X2dyb3VwX2xpc3RbXTsKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X2dyb3VwOworCitleHRlcm4gaW50IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CitleHRlcm4gaW50IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOworZXh0ZXJuIGludCBleHlub3M0X2Nsa19pcF9sY2QxX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKTsKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1MjNjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZ3Bpby5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogRVhZTk9TNCAtIEdQSU8gbGliIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSAorI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSCBfX0ZJTEVfXworCisvKiBQcmFjdGljYWxseSwgR1BJTyBiYW5rcyB1cCB0byBHUFogYXJlIHRoZSBjb25maWd1cmFibGUgZ3BpbyBiYW5rcyAqLworCisvKiBHUElPIGJhbmsgc2l6ZXMgKi8KKyNkZWZpbmUgRVhZTk9TNF9HUElPX0EwX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fQTFfTlIJKDYpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19CX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fQzBfTlIJKDUpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19DMV9OUgkoNSkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0QwX05SCSg0KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fRDFfTlIJKDQpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19FMF9OUgkoNSkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0UxX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fRTJfTlIJKDYpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19FM19OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0U0X05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fRjBfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19GMV9OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0YyX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fRjNfTlIJKDYpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19KMF9OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0oxX05SCSg1KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fSzBfTlIJKDcpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19LMV9OUgkoNykKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0syX05SCSg3KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fSzNfTlIJKDcpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19MMF9OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0wxX05SCSgzKQorI2RlZmluZSBFWFlOT1M0X0dQSU9fTDJfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19YMF9OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX1gxX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fWDJfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19YM19OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX1kwX05SCSg2KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fWTFfTlIJKDQpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19ZMl9OUgkoNikKKyNkZWZpbmUgRVhZTk9TNF9HUElPX1kzX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fWTRfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19ZNV9OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX1k2X05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fWl9OUgkoNykKKworLyogR1BJTyBiYW5rIG51bWJlcnMgKi8KKworI2RlZmluZSBFWFlOT1M0X0dQSU9fTkVYVChfX2dwaW8pIFwKKwkoKF9fZ3BpbyMjX1NUQVJUKSArIChfX2dwaW8jI19OUikgKyBDT05GSUdfUzNDX0dQSU9fU1BBQ0UgKyAxKQorCitlbnVtIHM1cF9ncGlvX251bWJlciB7CisJRVhZTk9TNF9HUElPX0EwX1NUQVJUCT0gMCwKKwlFWFlOT1M0X0dQSU9fQTFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fQTApLAorCUVYWU5PUzRfR1BJT19CX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0ExKSwKKwlFWFlOT1M0X0dQSU9fQzBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fQiksCisJRVhZTk9TNF9HUElPX0MxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0MwKSwKKwlFWFlOT1M0X0dQSU9fRDBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fQzEpLAorCUVYWU5PUzRfR1BJT19EMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19EMCksCisJRVhZTk9TNF9HUElPX0UwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0QxKSwKKwlFWFlOT1M0X0dQSU9fRTFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRTApLAorCUVYWU5PUzRfR1BJT19FMl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19FMSksCisJRVhZTk9TNF9HUElPX0UzX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0UyKSwKKwlFWFlOT1M0X0dQSU9fRTRfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRTMpLAorCUVYWU5PUzRfR1BJT19GMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19FNCksCisJRVhZTk9TNF9HUElPX0YxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0YwKSwKKwlFWFlOT1M0X0dQSU9fRjJfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRjEpLAorCUVYWU5PUzRfR1BJT19GM19TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19GMiksCisJRVhZTk9TNF9HUElPX0owX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0YzKSwKKwlFWFlOT1M0X0dQSU9fSjFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fSjApLAorCUVYWU5PUzRfR1BJT19LMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19KMSksCisJRVhZTk9TNF9HUElPX0sxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0swKSwKKwlFWFlOT1M0X0dQSU9fSzJfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fSzEpLAorCUVYWU5PUzRfR1BJT19LM19TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19LMiksCisJRVhZTk9TNF9HUElPX0wwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0szKSwKKwlFWFlOT1M0X0dQSU9fTDFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fTDApLAorCUVYWU5PUzRfR1BJT19MMl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19MMSksCisJRVhZTk9TNF9HUElPX1gwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0wyKSwKKwlFWFlOT1M0X0dQSU9fWDFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWDApLAorCUVYWU5PUzRfR1BJT19YMl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19YMSksCisJRVhZTk9TNF9HUElPX1gzX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1gyKSwKKwlFWFlOT1M0X0dQSU9fWTBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWDMpLAorCUVYWU5PUzRfR1BJT19ZMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19ZMCksCisJRVhZTk9TNF9HUElPX1kyX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1kxKSwKKwlFWFlOT1M0X0dQSU9fWTNfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWTIpLAorCUVYWU5PUzRfR1BJT19ZNF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19ZMyksCisJRVhZTk9TNF9HUElPX1k1X1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1k0KSwKKwlFWFlOT1M0X0dQSU9fWTZfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWTUpLAorCUVYWU5PUzRfR1BJT19aX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1k2KSwKK307CisKKy8qIEVYWU5PUzQgR1BJTyBudW1iZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRVhZTk9TNF9HUEEwKF9ucikJKEVYWU5PUzRfR1BJT19BMF9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQQTEoX25yKQkoRVhZTk9TNF9HUElPX0ExX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BCKF9ucikJKEVYWU5PUzRfR1BJT19CX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BDMChfbnIpCShFWFlOT1M0X0dQSU9fQzBfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEMxKF9ucikJKEVYWU5PUzRfR1BJT19DMV9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQRDAoX25yKQkoRVhZTk9TNF9HUElPX0QwX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BEMShfbnIpCShFWFlOT1M0X0dQSU9fRDFfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEUwKF9ucikJKEVYWU5PUzRfR1BJT19FMF9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQRTEoX25yKQkoRVhZTk9TNF9HUElPX0UxX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BFMihfbnIpCShFWFlOT1M0X0dQSU9fRTJfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEUzKF9ucikJKEVYWU5PUzRfR1BJT19FM19TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQRTQoX25yKQkoRVhZTk9TNF9HUElPX0U0X1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BGMChfbnIpCShFWFlOT1M0X0dQSU9fRjBfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEYxKF9ucikJKEVYWU5PUzRfR1BJT19GMV9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQRjIoX25yKQkoRVhZTk9TNF9HUElPX0YyX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BGMyhfbnIpCShFWFlOT1M0X0dQSU9fRjNfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEowKF9ucikJKEVYWU5PUzRfR1BJT19KMF9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQSjEoX25yKQkoRVhZTk9TNF9HUElPX0oxX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BLMChfbnIpCShFWFlOT1M0X0dQSU9fSzBfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEsxKF9ucikJKEVYWU5PUzRfR1BJT19LMV9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQSzIoX25yKQkoRVhZTk9TNF9HUElPX0syX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BLMyhfbnIpCShFWFlOT1M0X0dQSU9fSzNfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEwwKF9ucikJKEVYWU5PUzRfR1BJT19MMF9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQTDEoX25yKQkoRVhZTk9TNF9HUElPX0wxX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BMMihfbnIpCShFWFlOT1M0X0dQSU9fTDJfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUFgwKF9ucikJKEVYWU5PUzRfR1BJT19YMF9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQWDEoX25yKQkoRVhZTk9TNF9HUElPX1gxX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BYMihfbnIpCShFWFlOT1M0X0dQSU9fWDJfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUFgzKF9ucikJKEVYWU5PUzRfR1BJT19YM19TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQWTAoX25yKQkoRVhZTk9TNF9HUElPX1kwX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BZMShfbnIpCShFWFlOT1M0X0dQSU9fWTFfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUFkyKF9ucikJKEVYWU5PUzRfR1BJT19ZMl9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQWTMoX25yKQkoRVhZTk9TNF9HUElPX1kzX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BZNChfbnIpCShFWFlOT1M0X0dQSU9fWTRfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUFk1KF9ucikJKEVYWU5PUzRfR1BJT19ZNV9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQWTYoX25yKQkoRVhZTk9TNF9HUElPX1k2X1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BaKF9ucikJKEVYWU5PUzRfR1BJT19aX1NUQVJUICsgKF9ucikpCisKKy8qIHRoZSBlbmQgb2YgdGhlIEVYWU5PUzQgc3BlY2lmaWMgZ3Bpb3MgKi8KKyNkZWZpbmUgRVhZTk9TNF9HUElPX0VORAkoRVhZTk9TNF9HUFooRVhZTk9TNF9HUElPX1pfTlIpICsgMSkKKyNkZWZpbmUgUzNDX0dQSU9fRU5ECQlFWFlOT1M0X0dQSU9fRU5ECisKKy8qIGRlZmluZSB0aGUgbnVtYmVyIG9mIGdwaW9zIHdlIG5lZWQgdG8gdGhlIG9uZSBhZnRlciB0aGUgR1BaKCkgcmFuZ2UgKi8KKyNkZWZpbmUgQVJDSF9OUl9HUElPUwkJKEVYWU5PUzRfR1BaKEVYWU5PUzRfR1BJT19aX05SKSArCVwKKwkJCQkgQ09ORklHX1NBTVNVTkdfR1BJT19FWFRSQSArIDEpCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9pby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2lvLmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9pby5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQ0YjdlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtMCwwICsxLDE2OSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9pcnFzLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBFWFlOT1M0IC0gSVJRIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9JUlFTX0gKKyNkZWZpbmUgX19BU01fQVJDSF9JUlFTX0ggX19GSUxFX18KKworI2luY2x1ZGUgPHBsYXQvaXJxcy5oPgorCisvKiBQUEk6IFByaXZhdGUgUGVyaXBoZXJhbCBJbnRlcnJ1cHQgKi8KKworI2RlZmluZSBJUlFfUFBJKHgpCQlTNVBfSVJRKHgrMTYpCisKKyNkZWZpbmUgSVJRX01DVF9MT0NBTFRJTUVSCUlSUV9QUEkoMTIpCisKKy8qIFNQSTogU2hhcmVkIFBlcmlwaGVyYWwgSW50ZXJydXB0ICovCisKKyNkZWZpbmUgSVJRX1NQSSh4KQkJUzVQX0lSUSh4KzMyKQorCisjZGVmaW5lIElSUV9FSU5UMAkJSVJRX1NQSSgxNikKKyNkZWZpbmUgSVJRX0VJTlQxCQlJUlFfU1BJKDE3KQorI2RlZmluZSBJUlFfRUlOVDIJCUlSUV9TUEkoMTgpCisjZGVmaW5lIElSUV9FSU5UMwkJSVJRX1NQSSgxOSkKKyNkZWZpbmUgSVJRX0VJTlQ0CQlJUlFfU1BJKDIwKQorI2RlZmluZSBJUlFfRUlOVDUJCUlSUV9TUEkoMjEpCisjZGVmaW5lIElSUV9FSU5UNgkJSVJRX1NQSSgyMikKKyNkZWZpbmUgSVJRX0VJTlQ3CQlJUlFfU1BJKDIzKQorI2RlZmluZSBJUlFfRUlOVDgJCUlSUV9TUEkoMjQpCisjZGVmaW5lIElSUV9FSU5UOQkJSVJRX1NQSSgyNSkKKyNkZWZpbmUgSVJRX0VJTlQxMAkJSVJRX1NQSSgyNikKKyNkZWZpbmUgSVJRX0VJTlQxMQkJSVJRX1NQSSgyNykKKyNkZWZpbmUgSVJRX0VJTlQxMgkJSVJRX1NQSSgyOCkKKyNkZWZpbmUgSVJRX0VJTlQxMwkJSVJRX1NQSSgyOSkKKyNkZWZpbmUgSVJRX0VJTlQxNAkJSVJRX1NQSSgzMCkKKyNkZWZpbmUgSVJRX0VJTlQxNQkJSVJRX1NQSSgzMSkKKyNkZWZpbmUgSVJRX0VJTlQxNl8zMQkJSVJRX1NQSSgzMikKKworI2RlZmluZSBJUlFfUERNQTAJCUlSUV9TUEkoMzUpCisjZGVmaW5lIElSUV9QRE1BMQkJSVJRX1NQSSgzNikKKyNkZWZpbmUgSVJRX1RJTUVSMF9WSUMJCUlSUV9TUEkoMzcpCisjZGVmaW5lIElSUV9USU1FUjFfVklDCQlJUlFfU1BJKDM4KQorI2RlZmluZSBJUlFfVElNRVIyX1ZJQwkJSVJRX1NQSSgzOSkKKyNkZWZpbmUgSVJRX1RJTUVSM19WSUMJCUlSUV9TUEkoNDApCisjZGVmaW5lIElSUV9USU1FUjRfVklDCQlJUlFfU1BJKDQxKQorI2RlZmluZSBJUlFfTUNUX0wwCQlJUlFfU1BJKDQyKQorI2RlZmluZSBJUlFfV0RUCQkJSVJRX1NQSSg0MykKKyNkZWZpbmUgSVJRX1JUQ19BTEFSTQkJSVJRX1NQSSg0NCkKKyNkZWZpbmUgSVJRX1JUQ19USUMJCUlSUV9TUEkoNDUpCisjZGVmaW5lIElSUV9HUElPX1hCCQlJUlFfU1BJKDQ2KQorI2RlZmluZSBJUlFfR1BJT19YQQkJSVJRX1NQSSg0NykKKyNkZWZpbmUgSVJRX01DVF9MMQkJSVJRX1NQSSg0OCkKKworI2RlZmluZSBJUlFfVUFSVDAJCUlSUV9TUEkoNTIpCisjZGVmaW5lIElSUV9VQVJUMQkJSVJRX1NQSSg1MykKKyNkZWZpbmUgSVJRX1VBUlQyCQlJUlFfU1BJKDU0KQorI2RlZmluZSBJUlFfVUFSVDMJCUlSUV9TUEkoNTUpCisjZGVmaW5lIElSUV9VQVJUNAkJSVJRX1NQSSg1NikKKyNkZWZpbmUgSVJRX01DVF9HMAkJSVJRX1NQSSg1NykKKyNkZWZpbmUgSVJRX0lJQwkJCUlSUV9TUEkoNTgpCisjZGVmaW5lIElSUV9JSUMxCQlJUlFfU1BJKDU5KQorI2RlZmluZSBJUlFfSUlDMgkJSVJRX1NQSSg2MCkKKyNkZWZpbmUgSVJRX0lJQzMJCUlSUV9TUEkoNjEpCisjZGVmaW5lIElSUV9JSUM0CQlJUlFfU1BJKDYyKQorI2RlZmluZSBJUlFfSUlDNQkJSVJRX1NQSSg2MykKKyNkZWZpbmUgSVJRX0lJQzYJCUlSUV9TUEkoNjQpCisjZGVmaW5lIElSUV9JSUM3CQlJUlFfU1BJKDY1KQorCisjZGVmaW5lIElSUV9VU0JfSE9TVAkJSVJRX1NQSSg3MCkKKyNkZWZpbmUgSVJRX1VTQl9IU09URwkJSVJRX1NQSSg3MSkKKyNkZWZpbmUgSVJRX01PREVNX0lGCQlJUlFfU1BJKDcyKQorI2RlZmluZSBJUlFfSFNNTUMwCQlJUlFfU1BJKDczKQorI2RlZmluZSBJUlFfSFNNTUMxCQlJUlFfU1BJKDc0KQorI2RlZmluZSBJUlFfSFNNTUMyCQlJUlFfU1BJKDc1KQorI2RlZmluZSBJUlFfSFNNTUMzCQlJUlFfU1BJKDc2KQorI2RlZmluZSBJUlFfRFdNQ0kJCUlSUV9TUEkoNzcpCisKKyNkZWZpbmUgSVJRX01JUElfQ1NJUzAJCUlSUV9TUEkoNzgpCisjZGVmaW5lIElSUV9NSVBJX0NTSVMxCQlJUlFfU1BJKDgwKQorCisjZGVmaW5lIElSUV9PTkVOQU5EX0FVREkJSVJRX1NQSSg4MikKKyNkZWZpbmUgSVJRX1JPVEFUT1IJCUlSUV9TUEkoODMpCisjZGVmaW5lIElSUV9GSU1DMAkJSVJRX1NQSSg4NCkKKyNkZWZpbmUgSVJRX0ZJTUMxCQlJUlFfU1BJKDg1KQorI2RlZmluZSBJUlFfRklNQzIJCUlSUV9TUEkoODYpCisjZGVmaW5lIElSUV9GSU1DMwkJSVJRX1NQSSg4NykKKyNkZWZpbmUgSVJRX0pQRUcJCUlSUV9TUEkoODgpCisjZGVmaW5lIElSUV8yRAkJCUlSUV9TUEkoODkpCisjZGVmaW5lIElSUV9QQ0lFCQlJUlFfU1BJKDkwKQorCisjZGVmaW5lIElSUV9NSVhFUgkJSVJRX1NQSSg5MSkKKyNkZWZpbmUgSVJRX0hETUkJCUlSUV9TUEkoOTIpCisjZGVmaW5lIElSUV9JSUNfSERNSVBIWQkJSVJRX1NQSSg5MykKKyNkZWZpbmUgSVJRX01GQwkJCUlSUV9TUEkoOTQpCisjZGVmaW5lIElSUV9TRE8JCQlJUlFfU1BJKDk1KQorCisjZGVmaW5lIElSUV9BVURJT19TUwkJSVJRX1NQSSg5NikKKyNkZWZpbmUgSVJRX0kyUzAJCUlSUV9TUEkoOTcpCisjZGVmaW5lIElSUV9JMlMxCQlJUlFfU1BJKDk4KQorI2RlZmluZSBJUlFfSTJTMgkJSVJRX1NQSSg5OSkKKyNkZWZpbmUgSVJRX0FDOTcJCUlSUV9TUEkoMTAwKQorCisjZGVmaW5lIElSUV9TUERJRgkJSVJRX1NQSSgxMDQpCisjZGVmaW5lIElSUV9BREMwCQlJUlFfU1BJKDEwNSkKKyNkZWZpbmUgSVJRX1BFTjAJCUlSUV9TUEkoMTA2KQorI2RlZmluZSBJUlFfQURDMQkJSVJRX1NQSSgxMDcpCisjZGVmaW5lIElSUV9QRU4xCQlJUlFfU1BJKDEwOCkKKyNkZWZpbmUgSVJRX0tFWVBBRAkJSVJRX1NQSSgxMDkpCisjZGVmaW5lIElSUV9QTVUJCQlJUlFfU1BJKDExMCkKKyNkZWZpbmUgSVJRX0dQUwkJCUlSUV9TUEkoMTExKQorI2RlZmluZSBJUlFfSU5URkVFRENUUkxfU1NTCUlSUV9TUEkoMTEyKQorI2RlZmluZSBJUlFfU0xJTUJVUwkJSVJRX1NQSSgxMTMpCisKKyNkZWZpbmUgSVJRX1RTSQkJCUlSUV9TUEkoMTE1KQorI2RlZmluZSBJUlFfU0FUQQkJSVJRX1NQSSgxMTYpCisKKyNkZWZpbmUgTUFYX0lSUV9JTl9DT01CSU5FUgk4CisjZGVmaW5lIENPTUJJTkVSX0dST1VQKHgpCSgoeCkgKiBNQVhfSVJRX0lOX0NPTUJJTkVSICsgSVJRX1NQSSgxMjgpKQorI2RlZmluZSBDT01CSU5FUl9JUlEoeCwgeSkJKENPTUJJTkVSX0dST1VQKHgpICsgeSkKKworI2RlZmluZSBJUlFfU1lTTU1VX01ETUEwXzAJQ09NQklORVJfSVJRKDQsIDApCisjZGVmaW5lIElSUV9TWVNNTVVfU1NTXzAJQ09NQklORVJfSVJRKDQsIDEpCisjZGVmaW5lIElSUV9TWVNNTVVfRklNQzBfMAlDT01CSU5FUl9JUlEoNCwgMikKKyNkZWZpbmUgSVJRX1NZU01NVV9GSU1DMV8wCUNPTUJJTkVSX0lSUSg0LCAzKQorI2RlZmluZSBJUlFfU1lTTU1VX0ZJTUMyXzAJQ09NQklORVJfSVJRKDQsIDQpCisjZGVmaW5lIElSUV9TWVNNTVVfRklNQzNfMAlDT01CSU5FUl9JUlEoNCwgNSkKKyNkZWZpbmUgSVJRX1NZU01NVV9KUEVHXzAJQ09NQklORVJfSVJRKDQsIDYpCisjZGVmaW5lIElSUV9TWVNNTVVfMkRfMAkJQ09NQklORVJfSVJRKDQsIDcpCisKKyNkZWZpbmUgSVJRX1NZU01NVV9ST1RBVE9SXzAJQ09NQklORVJfSVJRKDUsIDApCisjZGVmaW5lIElSUV9TWVNNTVVfTURNQTFfMAlDT01CSU5FUl9JUlEoNSwgMSkKKyNkZWZpbmUgSVJRX1NZU01NVV9MQ0QwX00wXzAJQ09NQklORVJfSVJRKDUsIDIpCisjZGVmaW5lIElSUV9TWVNNTVVfTENEMV9NMV8wCUNPTUJJTkVSX0lSUSg1LCAzKQorI2RlZmluZSBJUlFfU1lTTU1VX1RWX00wXzAJQ09NQklORVJfSVJRKDUsIDQpCisjZGVmaW5lIElSUV9TWVNNTVVfTUZDX00wXzAJQ09NQklORVJfSVJRKDUsIDUpCisjZGVmaW5lIElSUV9TWVNNTVVfTUZDX00xXzAJQ09NQklORVJfSVJRKDUsIDYpCisjZGVmaW5lIElSUV9TWVNNTVVfUENJRV8wCUNPTUJJTkVSX0lSUSg1LCA3KQorCisjZGVmaW5lIElSUV9GSU1EMF9GSUZPCQlDT01CSU5FUl9JUlEoMTEsIDApCisjZGVmaW5lIElSUV9GSU1EMF9WU1lOQwkJQ09NQklORVJfSVJRKDExLCAxKQorI2RlZmluZSBJUlFfRklNRDBfU1lTVEVNCUNPTUJJTkVSX0lSUSgxMSwgMikKKworI2RlZmluZSBNQVhfQ09NQklORVJfTlIJCTE2CisKKyNkZWZpbmUgSVJRX0FEQwkJCUlSUV9BREMwCisjZGVmaW5lIElSUV9UQwkJCUlSUV9QRU4wCisKKyNkZWZpbmUgUzVQX0lSUV9FSU5UX0JBU0UJQ09NQklORVJfSVJRKE1BWF9DT01CSU5FUl9OUiwgMCkKKworI2RlZmluZSBTNVBfRUlOVF9CQVNFMQkJKFM1UF9JUlFfRUlOVF9CQVNFICsgMCkKKyNkZWZpbmUgUzVQX0VJTlRfQkFTRTIJCShTNVBfSVJRX0VJTlRfQkFTRSArIDE2KQorCisvKiBvcHRpb25hbCBHUElPIGludGVycnVwdHMgKi8KKyNkZWZpbmUgUzVQX0dQSU9JTlRfQkFTRQkoUzVQX0lSUV9FSU5UX0JBU0UgKyAzMikKKyNkZWZpbmUgSVJRX0dQSU8xX05SX0dST1VQUwkxNgorI2RlZmluZSBJUlFfR1BJTzJfTlJfR1JPVVBTCTkKKyNkZWZpbmUgSVJRX0dQSU9fRU5ECQkoUzVQX0dQSU9JTlRfQkFTRSArIFM1UF9HUElPSU5UX0NPVU5UKQorCisvKiBTZXQgdGhlIGRlZmF1bHQgTlJfSVJRUyAqLworI2RlZmluZSBOUl9JUlFTCQkJKElSUV9HUElPX0VORCArIDY0KQorCisjZW5kaWYgLyogX19BU01fQVJDSF9JUlFTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9tYXAuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg1NDFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL21hcC5oCkBAIC0wLDAgKzEsMTk3IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvbWFwLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogRVhZTk9TNCAtIE1lbW9yeSBtYXAgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX01BUF9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfTUFQX0ggX19GSUxFX18KKworI2luY2x1ZGUgPHBsYXQvbWFwLWJhc2UuaD4KKworLyoKKyAqIEVYWU5PUzQgVUFSVCBvZmZzZXQgaXMgMHgxMDAwMCBidXQgdGhlIG9sZGVyIFM1UCBTb0NzIGFyZSAweDQwMC4KKyAqIFNvIG5lZWQgdG8gZGVmaW5lIGl0LCBhbmQgaGVyZSBpcyB0byBhdm9pZCByZWRlZmluaXRpb24gd2FybmluZy4KKyAqLworI2RlZmluZSBTM0NfVUFSVF9PRkZTRVQJCQkoMHgxMDAwMCkKKworI2luY2x1ZGUgPHBsYXQvbWFwLXM1cC5oPgorCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTUkFNMAkJMHgwMjAyNTAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU1JBTTEJCTB4MDIwMjAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX0ZJTUMwCQkweDExODAwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfRklNQzEJCTB4MTE4MTAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9GSU1DMgkJMHgxMTgyMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX0ZJTUMzCQkweDExODMwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9JMlMwCQkJMHgwMzgzMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX0kyUzEJCQkweEUzMTAwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfSTJTMgkJCTB4RTJBMDAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX1BDTTAJCQkweDAzODQwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfUENNMQkJCTB4MTM5ODAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9QQ00yCQkJMHgxMzk5MDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfU1JPTV9CQU5LKHgpCQkoMHgwNDAwMDAwMCArICgoeCkgKiAweDAxMDAwMDAwKSkKKworI2RlZmluZSBFWFlOT1M0X1BBX09ORU5BTkQJCTB4MEMwMDAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9PTkVOQU5EX0RNQQkJMHgwQzYwMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfQ0hJUElECQkweDEwMDAwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9TWVNDT04JCTB4MTAwMTAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9QTVUJCQkweDEwMDIwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfQ01VCQkJMHgxMDAzMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTVElNRVIJCTB4MTAwNTAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9XQVRDSERPRwkJMHgxMDA2MDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1JUQwkJCTB4MTAwNzAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX0tFWVBBRAkJMHgxMDBBMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfRE1DMAkJCTB4MTA0MDAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX0NPTUJJTkVSCQkweDEwNDQwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9HSUNfQ1BVCQkweDEwNDgwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfR0lDX0RJU1QJCTB4MTA0OTAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX0NPUkVQRVJJCQkweDEwNTAwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfVFdECQkJMHgxMDUwMDYwMAorI2RlZmluZSBFWFlOT1M0X1BBX0wyQ0MJCQkweDEwNTAyMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9NRE1BCQkJMHgxMDgxMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1BETUEwCQkweDEyNjgwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfUERNQTEJCTB4MTI2OTAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9NRE1BCQkweDEwQTQwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX1NTUwkJMHgxMEE1MDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMAkJMHgxMUEyMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMQkJMHgxMUEzMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMgkJMHgxMUE0MDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMwkJMHgxMUE1MDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9KUEVHCQkweDExQTYwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUQwCQkweDExRTIwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUQxCQkweDEyMjIwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX1BDSWUJCTB4MTI2MjAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfRzJECQkweDEyQTIwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX1JPVEFUT1IJMHgxMkEzMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9NRE1BMgkJMHgxMkE0MDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9UVgkJMHgxMkUyMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9NRkNfTAkJMHgxMzYyMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9NRkNfUgkJMHgxMzYzMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfR1BJTzEJCTB4MTE0MDAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9HUElPMgkJMHgxMTAwMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX0dQSU8zCQkweDAzODYwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9NSVBJX0NTSVMwCQkweDExODgwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfTUlQSV9DU0lTMQkJMHgxMTg5MDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfRklNRDAJCTB4MTFDMDAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX0hTTU1DKHgpCQkoMHgxMjUxMDAwMCArICgoeCkgKiAweDEwMDAwKSkKKyNkZWZpbmUgRVhZTk9TNF9QQV9EV01DSQkJMHgxMjU1MDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfU0FUQQkJCTB4MTI1NjAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9TQVRBUEhZCQkweDEyNUQwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU0FUQVBIWV9DVFJMCQkweDEyNkIwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9TUk9NQwkJMHgxMjU3MDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfRUhDSQkJCTB4MTI1ODAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9IU1BIWQkJMHgxMjVCMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX01GQwkJCTB4MTM0MDAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX1VBUlQJCQkweDEzODAwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9WUAkJCTB4MTJDMDAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9NSVhFUgkJMHgxMkMxMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NETwkJCTB4MTJDMjAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9IRE1JCQkJMHgxMkQwMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX0lJQ19IRE1JUEhZCQkweDEzOEUwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9JSUMoeCkJCSgweDEzODYwMDAwICsgKCh4KSAqIDB4MTAwMDApKQorCisjZGVmaW5lIEVYWU5PUzRfUEFfQURDCQkJMHgxMzkxMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX0FEQzEJCQkweDEzOTExMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9BQzk3CQkJMHgxMzlBMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfU1BESUYJCTB4MTM5QjAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX1RJTUVSCQkweDEzOUQwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9TRFJBTQkJMHg0MDAwMDAwMAorCisvKiBDb21wYXRpYmlsdGl5IERlZmluZXMgKi8KKworI2RlZmluZSBTM0NfUEFfSFNNTUMwCQkJRVhZTk9TNF9QQV9IU01NQygwKQorI2RlZmluZSBTM0NfUEFfSFNNTUMxCQkJRVhZTk9TNF9QQV9IU01NQygxKQorI2RlZmluZSBTM0NfUEFfSFNNTUMyCQkJRVhZTk9TNF9QQV9IU01NQygyKQorI2RlZmluZSBTM0NfUEFfSFNNTUMzCQkJRVhZTk9TNF9QQV9IU01NQygzKQorI2RlZmluZSBTM0NfUEFfSUlDCQkJRVhZTk9TNF9QQV9JSUMoMCkKKyNkZWZpbmUgUzNDX1BBX0lJQzEJCQlFWFlOT1M0X1BBX0lJQygxKQorI2RlZmluZSBTM0NfUEFfSUlDMgkJCUVYWU5PUzRfUEFfSUlDKDIpCisjZGVmaW5lIFMzQ19QQV9JSUMzCQkJRVhZTk9TNF9QQV9JSUMoMykKKyNkZWZpbmUgUzNDX1BBX0lJQzQJCQlFWFlOT1M0X1BBX0lJQyg0KQorI2RlZmluZSBTM0NfUEFfSUlDNQkJCUVYWU5PUzRfUEFfSUlDKDUpCisjZGVmaW5lIFMzQ19QQV9JSUM2CQkJRVhZTk9TNF9QQV9JSUMoNikKKyNkZWZpbmUgUzNDX1BBX0lJQzcJCQlFWFlOT1M0X1BBX0lJQyg3KQorI2RlZmluZSBTM0NfUEFfUlRDCQkJRVhZTk9TNF9QQV9SVEMKKyNkZWZpbmUgUzNDX1BBX1dEVAkJCUVYWU5PUzRfUEFfV0FUQ0hET0cKKyNkZWZpbmUgUzNDX1BBX1VBUlQJCQlFWFlOT1M0X1BBX1VBUlQKKworI2RlZmluZSBTNVBfUEFfQ0hJUElECQkJRVhZTk9TNF9QQV9DSElQSUQKKyNkZWZpbmUgUzVQX1BBX0VIQ0kJCQlFWFlOT1M0X1BBX0VIQ0kKKyNkZWZpbmUgUzVQX1BBX0ZJTUMwCQkJRVhZTk9TNF9QQV9GSU1DMAorI2RlZmluZSBTNVBfUEFfRklNQzEJCQlFWFlOT1M0X1BBX0ZJTUMxCisjZGVmaW5lIFM1UF9QQV9GSU1DMgkJCUVYWU5PUzRfUEFfRklNQzIKKyNkZWZpbmUgUzVQX1BBX0ZJTUMzCQkJRVhZTk9TNF9QQV9GSU1DMworI2RlZmluZSBTNVBfUEFfRklNRDAJCQlFWFlOT1M0X1BBX0ZJTUQwCisjZGVmaW5lIFM1UF9QQV9IRE1JCQkJRVhZTk9TNF9QQV9IRE1JCisjZGVmaW5lIFM1UF9QQV9JSUNfSERNSVBIWQkJRVhZTk9TNF9QQV9JSUNfSERNSVBIWQorI2RlZmluZSBTNVBfUEFfTUZDCQkJRVhZTk9TNF9QQV9NRkMKKyNkZWZpbmUgUzVQX1BBX01JUElfQ1NJUzAJCUVYWU5PUzRfUEFfTUlQSV9DU0lTMAorI2RlZmluZSBTNVBfUEFfTUlQSV9DU0lTMQkJRVhZTk9TNF9QQV9NSVBJX0NTSVMxCisjZGVmaW5lIFM1UF9QQV9NSVhFUgkJCUVYWU5PUzRfUEFfTUlYRVIKKyNkZWZpbmUgUzVQX1BBX09ORU5BTkQJCQlFWFlOT1M0X1BBX09ORU5BTkQKKyNkZWZpbmUgUzVQX1BBX09ORU5BTkRfRE1BCQlFWFlOT1M0X1BBX09ORU5BTkRfRE1BCisjZGVmaW5lIFM1UF9QQV9TRE8JCQlFWFlOT1M0X1BBX1NETworI2RlZmluZSBTNVBfUEFfU0RSQU0JCQlFWFlOT1M0X1BBX1NEUkFNCisjZGVmaW5lIFM1UF9QQV9TUk9NQwkJCUVYWU5PUzRfUEFfU1JPTUMKKyNkZWZpbmUgUzVQX1BBX1NZU0NPTgkJCUVYWU5PUzRfUEFfU1lTQ09OCisjZGVmaW5lIFM1UF9QQV9USU1FUgkJCUVYWU5PUzRfUEFfVElNRVIKKyNkZWZpbmUgUzVQX1BBX1ZQCQkJRVhZTk9TNF9QQV9WUAorCisjZGVmaW5lIFNBTVNVTkdfUEFfQURDCQkJRVhZTk9TNF9QQV9BREMKKyNkZWZpbmUgU0FNU1VOR19QQV9BREMxCQkJRVhZTk9TNF9QQV9BREMxCisjZGVmaW5lIFNBTVNVTkdfUEFfS0VZUEFECQlFWFlOT1M0X1BBX0tFWVBBRAorCisjZGVmaW5lIEVYWU5PU19QQV9DT01CSU5FUgkJRVhZTk9TNF9QQV9DT01CSU5FUgorI2RlZmluZSBFWFlOT1NfUEFfR0lDX0NQVQkJRVhZTk9TNF9QQV9HSUNfQ1BVCisjZGVmaW5lIEVYWU5PU19QQV9HSUNfRElTVAkJRVhZTk9TNF9QQV9HSUNfRElTVAorI2RlZmluZSBFWFlOT1NfUEFfUE1VCQkJRVhZTk9TNF9QQV9QTVUKKyNkZWZpbmUgRVhZTk9TX1BBX1NZU1RJTUVSCQlFWFlOT1M0X1BBX1NZU1RJTUVSCisKKy8qIENvbXBhdGliaWxpdHkgVUFSVCAqLworCisjZGVmaW5lIFMzQ19WQV9VQVJUeCh4KQkJCShTM0NfVkFfVUFSVCArICgoeCkgKiBTM0NfVUFSVF9PRkZTRVQpKQorCisjZGVmaW5lIFM1UF9QQV9VQVJUKHgpCQkJKFMzQ19QQV9VQVJUICsgKCh4KSAqIFMzQ19VQVJUX09GRlNFVCkpCisjZGVmaW5lIFM1UF9QQV9VQVJUMAkJCVM1UF9QQV9VQVJUKDApCisjZGVmaW5lIFM1UF9QQV9VQVJUMQkJCVM1UF9QQV9VQVJUKDEpCisjZGVmaW5lIFM1UF9QQV9VQVJUMgkJCVM1UF9QQV9VQVJUKDIpCisjZGVmaW5lIFM1UF9QQV9VQVJUMwkJCVM1UF9QQV9VQVJUKDMpCisjZGVmaW5lIFM1UF9QQV9VQVJUNAkJCVM1UF9QQV9VQVJUKDQpCisKKyNkZWZpbmUgUzVQX1NaX1VBUlQJCQlTWl8yNTYKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9wbS1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4ZGE1MWUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaApAQCAtMCwwICsxLDY1IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaCwKKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogRVhZTk9TNDIxMCAtIFBNIGNvcmUgc3VwcG9ydCBmb3IgYXJjaC9hcm0vcGxhdC1zNXAvcG0uYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfUE1fQ09SRV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfUE1fQ09SRV9IIF9fRklMRV9fCisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtcG11Lmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fZGVidWdfaW5pdF91YXJ0KHZvaWQpCit7CisJLyogbm90aGluZyBoZXJlIHlldCAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2FyY2hfcHJlcGFyZV9pcnFzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKwl0bXAgPSBfX3Jhd19yZWFkbChTNVBfV0FLRVVQX01BU0spOworCXRtcCAmPSB+KDEgPDwgMzEpOworCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9XQUtFVVBfTUFTSyk7CisKKwlfX3Jhd193cml0ZWwoczNjX2lycXdha2VfaW50bWFzaywgUzVQX1dBS0VVUF9NQVNLKTsKKwlfX3Jhd193cml0ZWwoczNjX2lycXdha2VfZWludG1hc2ssIFM1UF9FSU5UX1dBS0VVUF9NQVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9hcmNoX3N0b3BfY2xvY2tzKHZvaWQpCit7CisJLyogbm90aGluZyBoZXJlIHlldCAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2FyY2hfc2hvd19yZXN1bWVfaXJxcyh2b2lkKQoreworCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9hcmNoX3VwZGF0ZV91YXJ0KHZvaWQgX19pb21lbSAqcmVncywKKwkJCQkJICAgc3RydWN0IHBtX3VhcnRfc2F2ZSAqc2F2ZSkKK3sKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fcmVzdG9yZWRfZ3Bpb3Modm9pZCkKK3sKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYW1zdW5nX3BtX3NhdmVkX2dwaW9zKHZvaWQpCit7CisJLyogbm90aGluZyBoZXJlIHlldCAqLworfQorCisjZW5kaWYgLyogX19BU01fQVJDSF9QTV9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9wbXUuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9wbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJkZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3BtdS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcG11LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIEVYWU5PUzQyMTAgLSBQTVUoUG93ZXIgTWFuYWdlbWVudCBVbml0KSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9QTVVfSAorI2RlZmluZSBfX0FTTV9BUkNIX1BNVV9IIF9fRklMRV9fCisKKyNkZWZpbmUgUE1VX1RBQkxFX0VORAlOVUxMCisKK2VudW0gc3lzX3Bvd2VyZG93biB7CisJU1lTX0FGVFIsCisJU1lTX0xQQSwKKwlTWVNfU0xFRVAsCisJTlVNX1NZU19QT1dFUkRPV04sCit9OworCitzdHJ1Y3QgZXh5bm9zNF9wbXVfY29uZiB7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdW5zaWduZWQgaW50IHZhbFtOVU1fU1lTX1BPV0VSRE9XTl07Cit9OworCitleHRlcm4gdm9pZCBleHlub3M0X3N5c19wb3dlcmRvd25fY29uZihlbnVtIHN5c19wb3dlcmRvd24gbW9kZSk7CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1BNVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtYXVkc3MuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLWF1ZHNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1hdWRzcy5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1hdWRzcy5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzM3ZWJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaApAQCAtMCwwICsxLDIxMCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBFWFlOT1M0IC0gQ2xvY2sgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfQ0xPQ0tfSAorI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfQ0xPQ0tfSCBfX0ZJTEVfXworCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjZGVmaW5lIFM1UF9DTEtSRUcoeCkJCQkoUzVQX1ZBX0NNVSArICh4KSkKKworI2RlZmluZSBTNVBfQ0xLRElWX0xFRlRCVVMJCVM1UF9DTEtSRUcoMHgwNDUwMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUX0xFRlRCVVMJCVM1UF9DTEtSRUcoMHgwNDYwMCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfTEVGVEJVUwkJUzVQX0NMS1JFRygweDA0ODAwKQorCisjZGVmaW5lIFM1UF9DTEtESVZfUklHSFRCVVMJCVM1UF9DTEtSRUcoMHgwODUwMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUX1JJR0hUQlVTCVM1UF9DTEtSRUcoMHgwODYwMCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfUklHSFRCVVMJCVM1UF9DTEtSRUcoMHgwODgwMCkKKworI2RlZmluZSBTNVBfRVBMTF9MT0NLCQkJUzVQX0NMS1JFRygweDBDMDEwKQorI2RlZmluZSBTNVBfVlBMTF9MT0NLCQkJUzVQX0NMS1JFRygweDBDMDIwKQorCisjZGVmaW5lIFM1UF9FUExMX0NPTjAJCQlTNVBfQ0xLUkVHKDB4MEMxMTApCisjZGVmaW5lIFM1UF9FUExMX0NPTjEJCQlTNVBfQ0xLUkVHKDB4MEMxMTQpCisjZGVmaW5lIFM1UF9WUExMX0NPTjAJCQlTNVBfQ0xLUkVHKDB4MEMxMjApCisjZGVmaW5lIFM1UF9WUExMX0NPTjEJCQlTNVBfQ0xLUkVHKDB4MEMxMjQpCisKKyNkZWZpbmUgUzVQX0NMS1NSQ19UT1AwCQkJUzVQX0NMS1JFRygweDBDMjEwKQorI2RlZmluZSBTNVBfQ0xLU1JDX1RPUDEJCQlTNVBfQ0xLUkVHKDB4MEMyMTQpCisjZGVmaW5lIFM1UF9DTEtTUkNfQ0FNCQkJUzVQX0NMS1JFRygweDBDMjIwKQorI2RlZmluZSBTNVBfQ0xLU1JDX1RWCQkJUzVQX0NMS1JFRygweDBDMjI0KQorI2RlZmluZSBTNVBfQ0xLU1JDX01GQwkJCVM1UF9DTEtSRUcoMHgwQzIyOCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19HM0QJCQlTNVBfQ0xLUkVHKDB4MEMyMkMpCisjZGVmaW5lIFM1UF9DTEtTUkNfSU1BR0UJCVM1UF9DTEtSRUcoMHgwQzIzMCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19MQ0QwCQkJUzVQX0NMS1JFRygweDBDMjM0KQorI2RlZmluZSBTNVBfQ0xLU1JDX01BVURJTwkJUzVQX0NMS1JFRygweDBDMjNDKQorI2RlZmluZSBTNVBfQ0xLU1JDX0ZTWVMJCQlTNVBfQ0xLUkVHKDB4MEMyNDApCisjZGVmaW5lIFM1UF9DTEtTUkNfUEVSSUwwCQlTNVBfQ0xLUkVHKDB4MEMyNTApCisjZGVmaW5lIFM1UF9DTEtTUkNfUEVSSUwxCQlTNVBfQ0xLUkVHKDB4MEMyNTQpCisKKyNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX1RPUAkJUzVQX0NMS1JFRygweDBDMzEwKQorI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfQ0FNCQlTNVBfQ0xLUkVHKDB4MEMzMjApCisjZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19UVgkJUzVQX0NMS1JFRygweDBDMzI0KQorI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfTENEMAkJUzVQX0NMS1JFRygweDBDMzM0KQorI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfTUFVRElPCQlTNVBfQ0xLUkVHKDB4MEMzM0MpCisjZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19GU1lTCQlTNVBfQ0xLUkVHKDB4MEMzNDApCisjZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19QRVJJTDAJCVM1UF9DTEtSRUcoMHgwQzM1MCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX1BFUklMMQkJUzVQX0NMS1JFRygweDBDMzU0KQorCisjZGVmaW5lIFM1UF9DTEtESVZfVE9QCQkJUzVQX0NMS1JFRygweDBDNTEwKQorI2RlZmluZSBTNVBfQ0xLRElWX0NBTQkJCVM1UF9DTEtSRUcoMHgwQzUyMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9UVgkJCVM1UF9DTEtSRUcoMHgwQzUyNCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9NRkMJCQlTNVBfQ0xLUkVHKDB4MEM1MjgpCisjZGVmaW5lIFM1UF9DTEtESVZfRzNECQkJUzVQX0NMS1JFRygweDBDNTJDKQorI2RlZmluZSBTNVBfQ0xLRElWX0lNQUdFCQlTNVBfQ0xLUkVHKDB4MEM1MzApCisjZGVmaW5lIFM1UF9DTEtESVZfTENEMAkJCVM1UF9DTEtSRUcoMHgwQzUzNCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9NQVVESU8JCVM1UF9DTEtSRUcoMHgwQzUzQykKKyNkZWZpbmUgUzVQX0NMS0RJVl9GU1lTMAkJUzVQX0NMS1JFRygweDBDNTQwKQorI2RlZmluZSBTNVBfQ0xLRElWX0ZTWVMxCQlTNVBfQ0xLUkVHKDB4MEM1NDQpCisjZGVmaW5lIFM1UF9DTEtESVZfRlNZUzIJCVM1UF9DTEtSRUcoMHgwQzU0OCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9GU1lTMwkJUzVQX0NMS1JFRygweDBDNTRDKQorI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMMAkJUzVQX0NMS1JFRygweDBDNTUwKQorI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMMQkJUzVQX0NMS1JFRygweDBDNTU0KQorI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMMgkJUzVQX0NMS1JFRygweDBDNTU4KQorI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMMwkJUzVQX0NMS1JFRygweDBDNTVDKQorI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMNAkJUzVQX0NMS1JFRygweDBDNTYwKQorI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMNQkJUzVQX0NMS1JFRygweDBDNTY0KQorI2RlZmluZSBTNVBfQ0xLRElWMl9SQVRJTwkJUzVQX0NMS1JFRygweDBDNTgwKQorCisjZGVmaW5lIFM1UF9DTEtESVZfU1RBVF9UT1AJCVM1UF9DTEtSRUcoMHgwQzYxMCkKKworI2RlZmluZSBTNVBfQ0xLR0FURV9TQ0xLQ0FNCQlTNVBfQ0xLUkVHKDB4MEM4MjApCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0NBTQkJUzVQX0NMS1JFRygweDBDOTIwKQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9UVgkJUzVQX0NMS1JFRygweDBDOTI0KQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9NRkMJCVM1UF9DTEtSRUcoMHgwQzkyOCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfRzNECQlTNVBfQ0xLUkVHKDB4MEM5MkMpCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0lNQUdFCQkoc29jX2lzX2V4eW5vczQyMTAoKSA/IFwKKwkJCQkJUzVQX0NMS1JFRygweDBDOTMwKSA6IFwKKwkJCQkJUzVQX0NMS1JFRygweDA0OTMwKSkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfSU1BR0VfNDIxMAlTNVBfQ0xLUkVHKDB4MEM5MzApCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0lNQUdFXzQyMTIJUzVQX0NMS1JFRygweDA0OTMwKQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9MQ0QwCQlTNVBfQ0xLUkVHKDB4MEM5MzQpCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0ZTWVMJCVM1UF9DTEtSRUcoMHgwQzk0MCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfR1BTCQlTNVBfQ0xLUkVHKDB4MEM5NEMpCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX1BFUklMCQlTNVBfQ0xLUkVHKDB4MEM5NTApCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX1BFUklSCQkoc29jX2lzX2V4eW5vczQyMTAoKSA/IFwKKwkJCQkJUzVQX0NMS1JFRygweDBDOTYwKSA6IFwKKwkJCQkJUzVQX0NMS1JFRygweDA4OTYwKSkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfUEVSSVJfNDIxMAlTNVBfQ0xLUkVHKDB4MEM5NjApCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX1BFUklSXzQyMTIJUzVQX0NMS1JFRygweDA4OTYwKQorI2RlZmluZSBTNVBfQ0xLR0FURV9CTE9DSwkJUzVQX0NMS1JFRygweDBDOTcwKQorCisjZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19ETUMJCVM1UF9DTEtSRUcoMHgxMDMwMCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19ETUMJCQlTNVBfQ0xLUkVHKDB4MTAyMDApCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMAkJCVM1UF9DTEtSRUcoMHgxMDUwMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMxCQkJUzVQX0NMS1JFRygweDEwNTA0KQorI2RlZmluZSBTNVBfQ0xLRElWX1NUQVRfRE1DMAkJUzVQX0NMS1JFRygweDEwNjAwKQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9ETUMJCVM1UF9DTEtSRUcoMHgxMDkwMCkKKworI2RlZmluZSBTNVBfQVBMTF9MT0NLCQkJUzVQX0NMS1JFRygweDE0MDAwKQorI2RlZmluZSBTNVBfTVBMTF9MT0NLCQkJKHNvY19pc19leHlub3M0MjEwKCkgPyBcCisJCQkJCVM1UF9DTEtSRUcoMHgxNDAwNCkgOiAgXAorCQkJCQlTNVBfQ0xLUkVHKDB4MTAwMDgpKQorI2RlZmluZSBTNVBfQVBMTF9DT04wCQkJUzVQX0NMS1JFRygweDE0MTAwKQorI2RlZmluZSBTNVBfQVBMTF9DT04xCQkJUzVQX0NMS1JFRygweDE0MTA0KQorI2RlZmluZSBTNVBfTVBMTF9DT04wCQkJKHNvY19pc19leHlub3M0MjEwKCkgPyBcCisJCQkJCVM1UF9DTEtSRUcoMHgxNDEwOCkgOiBcCisJCQkJCVM1UF9DTEtSRUcoMHgxMDEwOCkpCisjZGVmaW5lIFM1UF9NUExMX0NPTjEJCQkoc29jX2lzX2V4eW5vczQyMTAoKSA/IFwKKwkJCQkJUzVQX0NMS1JFRygweDE0MTBDKSA6IFwKKwkJCQkJUzVQX0NMS1JFRygweDEwMTBDKSkKKworI2RlZmluZSBTNVBfQ0xLU1JDX0NQVQkJCVM1UF9DTEtSRUcoMHgxNDIwMCkKKyNkZWZpbmUgUzVQX0NMS01VWF9TVEFUQ1BVCQlTNVBfQ0xLUkVHKDB4MTQ0MDApCisKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUJCQlTNVBfQ0xLUkVHKDB4MTQ1MDApCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMQkJCVM1UF9DTEtSRUcoMHgxNDUwNCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUQ1BVCQlTNVBfQ0xLUkVHKDB4MTQ2MDApCisjZGVmaW5lIFM1UF9DTEtESVZfU1RBVENQVTEJCVM1UF9DTEtSRUcoMHgxNDYwNCkKKworI2RlZmluZSBTNVBfQ0xLR0FURV9TQ0xLQ1BVCQlTNVBfQ0xLUkVHKDB4MTQ4MDApCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0NQVQkJUzVQX0NMS1JFRygweDE0OTAwKQorCisjZGVmaW5lIFM1UF9BUExMX0xPQ0tUSU1FCQkoMHgxQzIwKQkvKiAzMDB1cyAqLworCisjZGVmaW5lIFM1UF9BUExMQ09OMF9FTkFCTEVfU0hJRlQJKDMxKQorI2RlZmluZSBTNVBfQVBMTENPTjBfTE9DS0VEX1NISUZUCSgyOSkKKyNkZWZpbmUgUzVQX0FQTExfVkFMXzEwMDAJCSgoMjUwIDw8IDE2KSB8ICg2IDw8IDgpIHwgMSkKKyNkZWZpbmUgUzVQX0FQTExfVkFMXzgwMAkJKCgyMDAgPDwgMTYpIHwgKDYgPDwgOCkgfCAxKQorCisjZGVmaW5lIFM1UF9FUExMQ09OMF9FTkFCTEVfU0hJRlQJKDMxKQorI2RlZmluZSBTNVBfRVBMTENPTjBfTE9DS0VEX1NISUZUCSgyOSkKKworI2RlZmluZSBTNVBfVlBMTENPTjBfRU5BQkxFX1NISUZUCSgzMSkKKyNkZWZpbmUgUzVQX1ZQTExDT04wX0xPQ0tFRF9TSElGVAkoMjkpCisKKyNkZWZpbmUgUzVQX0NMS1NSQ19DUFVfTVVYQ09SRV9TSElGVAkoMTYpCisjZGVmaW5lIFM1UF9DTEtNVVhfU1RBVENQVV9NVVhDT1JFX01BU0sJKDB4NyA8PCBTNVBfQ0xLU1JDX0NQVV9NVVhDT1JFX1NISUZUKQorCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFX1NISUZUCSgwKQorI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQ09SRV9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX0NPUkVfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFTTBfU0hJRlQJKDQpCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFTTBfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9DT1JFTTBfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFTTFfU0hJRlQJKDgpCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFTTFfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9DT1JFTTFfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9QRVJJUEhfU0hJRlQJKDEyKQorI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfUEVSSVBIX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0NQVTBfUEVSSVBIX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQVRCX1NISUZUCSgxNikKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0FUQl9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX0FUQl9TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX1BDTEtEQkdfU0hJRlQJKDIwKQorI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfUENMS0RCR19NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX1BDTEtEQkdfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9BUExMX1NISUZUCSgyNCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0FQTExfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9BUExMX1NISUZUKQorCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9BQ1BfU0hJRlQJKDApCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9BQ1BfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfRE1DMF9BQ1BfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9BQ1BQQ0xLX1NISUZUCSg0KQorI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQUNQUENMS19NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0FDUFBDTEtfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9EUEhZX1NISUZUCSg4KQorI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRFBIWV9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0RQSFlfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9ETUNfU0hJRlQJKDEyKQorI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRE1DX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfRE1DX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRE1DRF9TSElGVAkoMTYpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9ETUNEX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfRE1DRF9TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0RNQ1BfU0hJRlQJKDIwKQorI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRE1DUF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0RNQ1BfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9DT1BZMl9TSElGVAkoMjQpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9DT1BZMl9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0NPUFkyX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQ09SRVRJX1NISUZUCSgyOCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0NPUkVUSV9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0NPUkVUSV9TSElGVCkKKworI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMjAwX1NISUZUCSgwKQorI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMjAwX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX1RPUF9BQ0xLMjAwX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTAwX1NISUZUCSg0KQorI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTAwX01BU0sJKDB4ZiA8PCBTNVBfQ0xLRElWX1RPUF9BQ0xLMTAwX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTYwX1NISUZUCSg4KQorI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTYwX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX1RPUF9BQ0xLMTYwX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTMzX1NISUZUCSgxMikKKyNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfQUNMSzEzM19NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9UT1BfQUNMSzEzM19TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfT05FTkFORF9TSElGVAkoMTYpCisjZGVmaW5lIFM1UF9DTEtESVZfVE9QX09ORU5BTkRfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfVE9QX09ORU5BTkRfU0hJRlQpCisKKyNkZWZpbmUgUzVQX0NMS0RJVl9CVVNfR0RMUl9TSElGVAkoMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9CVVNfR0RMUl9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9CVVNfR0RMUl9TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9CVVNfR1BMUl9TSElGVAkoNCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9CVVNfR1BMUl9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9CVVNfR1BMUl9TSElGVCkKKworLyogT25seSBmb3IgRVhZTk9TNDIxMCAqLworCisjZGVmaW5lIFM1UF9DTEtTUkNfTENEMQkJCVM1UF9DTEtSRUcoMHgwQzIzOCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX0xDRDEJCVM1UF9DTEtSRUcoMHgwQzMzOCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9MQ0QxCQkJUzVQX0NMS1JFRygweDBDNTM4KQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9MQ0QxCQlTNVBfQ0xLUkVHKDB4MEM5MzgpCisKKy8qIENvbXBhdGliaWxpdHkgZGVmaW5lcyBhbmQgaW5jbHVzaW9uICovCisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtcG11Lmg+CisKKyNkZWZpbmUgUzVQX0VQTExfQ09OCQkJUzVQX0VQTExfQ09OMAorCisjZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX0NMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1ncGlvLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1ncGlvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1ncGlvLmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1pcnEuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLW1jdC5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtbWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkZDAyYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLW1jdC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1tY3QuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBFWFlOT1M0IE1DVCBjb25maWd1dGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9SRUdTX01DVF9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19NQ1RfSCBfX0ZJTEVfXworCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworI2RlZmluZSBFWFlOT1M0X01DVFJFRyh4KQkJKFM1UF9WQV9TWVNUSU1FUiArICh4KSkKKworI2RlZmluZSBFWFlOT1M0X01DVF9HX0NOVF9MCQlFWFlOT1M0X01DVFJFRygweDEwMCkKKyNkZWZpbmUgRVhZTk9TNF9NQ1RfR19DTlRfVQkJRVhZTk9TNF9NQ1RSRUcoMHgxMDQpCisjZGVmaW5lIEVYWU5PUzRfTUNUX0dfQ05UX1dTVEFUCQlFWFlOT1M0X01DVFJFRygweDExMCkKKworI2RlZmluZSBFWFlOT1M0X01DVF9HX0NPTVAwX0wJCUVYWU5PUzRfTUNUUkVHKDB4MjAwKQorI2RlZmluZSBFWFlOT1M0X01DVF9HX0NPTVAwX1UJCUVYWU5PUzRfTUNUUkVHKDB4MjA0KQorI2RlZmluZSBFWFlOT1M0X01DVF9HX0NPTVAwX0FERF9JTkNSCUVYWU5PUzRfTUNUUkVHKDB4MjA4KQorCisjZGVmaW5lIEVYWU5PUzRfTUNUX0dfVENPTgkJRVhZTk9TNF9NQ1RSRUcoMHgyNDApCisKKyNkZWZpbmUgRVhZTk9TNF9NQ1RfR19JTlRfQ1NUQVQJCUVYWU5PUzRfTUNUUkVHKDB4MjQ0KQorI2RlZmluZSBFWFlOT1M0X01DVF9HX0lOVF9FTkIJCUVYWU5PUzRfTUNUUkVHKDB4MjQ4KQorI2RlZmluZSBFWFlOT1M0X01DVF9HX1dTVEFUCQlFWFlOT1M0X01DVFJFRygweDI0QykKKworI2RlZmluZSBfRVhZTk9TNF9NQ1RfTF9CQVNFCQlFWFlOT1M0X01DVFJFRygweDMwMCkKKyNkZWZpbmUgRVhZTk9TNF9NQ1RfTF9CQVNFKHgpCQkoX0VYWU5PUzRfTUNUX0xfQkFTRSArICgweDEwMCAqIHgpKQorI2RlZmluZSBFWFlOT1M0X01DVF9MX01BU0sJCSgweGZmZmZmZjAwKQorCisjZGVmaW5lIE1DVF9MX1RDTlRCX09GRlNFVAkJKDB4MDApCisjZGVmaW5lIE1DVF9MX0lDTlRCX09GRlNFVAkJKDB4MDgpCisjZGVmaW5lIE1DVF9MX1RDT05fT0ZGU0VUCQkoMHgyMCkKKyNkZWZpbmUgTUNUX0xfSU5UX0NTVEFUX09GRlNFVAkJKDB4MzApCisjZGVmaW5lIE1DVF9MX0lOVF9FTkJfT0ZGU0VUCQkoMHgzNCkKKyNkZWZpbmUgTUNUX0xfV1NUQVRfT0ZGU0VUCQkoMHg0MCkKKworI2RlZmluZSBNQ1RfR19UQ09OX1NUQVJUCQkoMSA8PCA4KQorI2RlZmluZSBNQ1RfR19UQ09OX0NPTVAwX0FVVE9fSU5DCSgxIDw8IDEpCisjZGVmaW5lIE1DVF9HX1RDT05fQ09NUDBfRU5BQkxFCQkoMSA8PCAwKQorCisjZGVmaW5lIE1DVF9MX1RDT05fSU5URVJWQUxfTU9ERQkoMSA8PCAyKQorI2RlZmluZSBNQ1RfTF9UQ09OX0lOVF9TVEFSVAkJKDEgPDwgMSkKKyNkZWZpbmUgTUNUX0xfVENPTl9USU1FUl9TVEFSVAkJKDEgPDwgMCkKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUkVHU19NQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLW1lbS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtbWVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1tZW0uaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtbWVtLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLXBtdS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtcG11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmZjhlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLXBtdS5oCkBAIC0wLDAgKzEsMjIwIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtcG11LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBFWFlOT1M0IC0gUG93ZXIgbWFuYWdlbWVudCB1bml0IGRlZmluaXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfUE1VX0gKKyNkZWZpbmUgX19BU01fQVJDSF9SRUdTX1BNVV9IIF9fRklMRV9fCisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjZGVmaW5lIFM1UF9QTVVSRUcoeCkJCQkJKFM1UF9WQV9QTVUgKyAoeCkpCisKKyNkZWZpbmUgUzVQX0NFTlRSQUxfU0VRX0NPTkZJR1VSQVRJT04JCVM1UF9QTVVSRUcoMHgwMjAwKQorCisjZGVmaW5lIFM1UF9DRU5UUkFMX0xPV1BXUl9DRkcJCQkoMSA8PCAxNikKKworI2RlZmluZSBTNVBfQ0VOVFJBTF9TRVFfT1BUSU9OCQkJUzVQX1BNVVJFRygweDAyMDgpCisKKyNkZWZpbmUgUzVQX1VTRV9TVEFOREJZX1dGSTAJCQkoMSA8PCAxNikKKyNkZWZpbmUgUzVQX1VTRV9TVEFOREJZX1dGSTEJCQkoMSA8PCAxNykKKyNkZWZpbmUgUzVQX1VTRV9TVEFOREJZV0ZJX0lTUF9BUk0JCSgxIDw8IDE4KQorI2RlZmluZSBTNVBfVVNFX1NUQU5EQllfV0ZFMAkJCSgxIDw8IDI0KQorI2RlZmluZSBTNVBfVVNFX1NUQU5EQllfV0ZFMQkJCSgxIDw8IDI1KQorI2RlZmluZSBTNVBfVVNFX1NUQU5EQllXRkVfSVNQX0FSTQkJKDEgPDwgMjYpCisKKyNkZWZpbmUgUzVQX1NXUkVTRVQJCQkJUzVQX1BNVVJFRygweDA0MDApCisKKyNkZWZpbmUgUzVQX1dBS0VVUF9TVEFUCQkJCVM1UF9QTVVSRUcoMHgwNjAwKQorI2RlZmluZSBTNVBfRUlOVF9XQUtFVVBfTUFTSwkJCVM1UF9QTVVSRUcoMHgwNjA0KQorI2RlZmluZSBTNVBfV0FLRVVQX01BU0sJCQkJUzVQX1BNVVJFRygweDA2MDgpCisKKyNkZWZpbmUgUzVQX0hETUlfUEhZX0NPTlRST0wJCQlTNVBfUE1VUkVHKDB4MDcwMCkKKyNkZWZpbmUgUzVQX0hETUlfUEhZX0VOQUJMRQkJCSgxIDw8IDApCisKKyNkZWZpbmUgUzVQX0RBQ19QSFlfQ09OVFJPTAkJCVM1UF9QTVVSRUcoMHgwNzBDKQorI2RlZmluZSBTNVBfREFDX1BIWV9FTkFCTEUJCQkoMSA8PCAwKQorCisjZGVmaW5lIFM1UF9NSVBJX0RQSFlfQ09OVFJPTChuKQkJUzVQX1BNVVJFRygweDA3MTAgKyAobikgKiA0KQorI2RlZmluZSBTNVBfTUlQSV9EUEhZX0VOQUJMRQkJCSgxIDw8IDApCisjZGVmaW5lIFM1UF9NSVBJX0RQSFlfU1JFU0VUTgkJCSgxIDw8IDEpCisjZGVmaW5lIFM1UF9NSVBJX0RQSFlfTVJFU0VUTgkJCSgxIDw8IDIpCisKKyNkZWZpbmUgUzVQX0lORk9STTAJCQkJUzVQX1BNVVJFRygweDA4MDApCisjZGVmaW5lIFM1UF9JTkZPUk0xCQkJCVM1UF9QTVVSRUcoMHgwODA0KQorI2RlZmluZSBTNVBfSU5GT1JNMgkJCQlTNVBfUE1VUkVHKDB4MDgwOCkKKyNkZWZpbmUgUzVQX0lORk9STTMJCQkJUzVQX1BNVVJFRygweDA4MEMpCisjZGVmaW5lIFM1UF9JTkZPUk00CQkJCVM1UF9QTVVSRUcoMHgwODEwKQorI2RlZmluZSBTNVBfSU5GT1JNNQkJCQlTNVBfUE1VUkVHKDB4MDgxNCkKKyNkZWZpbmUgUzVQX0lORk9STTYJCQkJUzVQX1BNVVJFRygweDA4MTgpCisjZGVmaW5lIFM1UF9JTkZPUk03CQkJCVM1UF9QTVVSRUcoMHgwODFDKQorCisjZGVmaW5lIFM1UF9BUk1fQ09SRTBfTE9XUFdSCQkJUzVQX1BNVVJFRygweDEwMDApCisjZGVmaW5lIFM1UF9ESVNfSVJRX0NPUkUwCQkJUzVQX1BNVVJFRygweDEwMDQpCisjZGVmaW5lIFM1UF9ESVNfSVJRX0NFTlRSQUwwCQkJUzVQX1BNVVJFRygweDEwMDgpCisjZGVmaW5lIFM1UF9BUk1fQ09SRTFfTE9XUFdSCQkJUzVQX1BNVVJFRygweDEwMTApCisjZGVmaW5lIFM1UF9ESVNfSVJRX0NPUkUxCQkJUzVQX1BNVVJFRygweDEwMTQpCisjZGVmaW5lIFM1UF9ESVNfSVJRX0NFTlRSQUwxCQkJUzVQX1BNVVJFRygweDEwMTgpCisjZGVmaW5lIFM1UF9BUk1fQ09NTU9OX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMDgwKQorI2RlZmluZSBTNVBfTDJfMF9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEwQzApCisjZGVmaW5lIFM1UF9MMl8xX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTBDNCkKKyNkZWZpbmUgUzVQX0NNVV9BQ0xLU1RPUF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEwMCkKKyNkZWZpbmUgUzVQX0NNVV9TQ0xLU1RPUF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEwNCkKKyNkZWZpbmUgUzVQX0NNVV9SRVNFVF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEwQykKKyNkZWZpbmUgUzVQX0FQTExfU1lTQ0xLX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTIwKQorI2RlZmluZSBTNVBfTVBMTF9TWVNDTEtfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExMjQpCisjZGVmaW5lIFM1UF9WUExMX1NZU0NMS19MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEyOCkKKyNkZWZpbmUgUzVQX0VQTExfU1lTQ0xLX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTJDKQorI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfR1BTX0FMSVZFX0xPV1BXUglTNVBfUE1VUkVHKDB4MTEzOCkKKyNkZWZpbmUgUzVQX0NNVV9SRVNFVF9HUFNBTElWRV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTNDKQorI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfQ0FNX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNDApCisjZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9UVl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTQ0KQorI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfTUZDX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNDgpCisjZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9HM0RfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE0QykKKyNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX0xDRDBfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE1MCkKKyNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX01BVURJT19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTU4KQorI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfR1BTX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNUMpCisjZGVmaW5lIFM1UF9DTVVfUkVTRVRfQ0FNX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNjApCisjZGVmaW5lIFM1UF9DTVVfUkVTRVRfVFZfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExNjQpCisjZGVmaW5lIFM1UF9DTVVfUkVTRVRfTUZDX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNjgpCisjZGVmaW5lIFM1UF9DTVVfUkVTRVRfRzNEX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNkMpCisjZGVmaW5lIFM1UF9DTVVfUkVTRVRfTENEMF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTcwKQorI2RlZmluZSBTNVBfQ01VX1JFU0VUX01BVURJT19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTc4KQorI2RlZmluZSBTNVBfQ01VX1JFU0VUX0dQU19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTdDKQorI2RlZmluZSBTNVBfVE9QX0JVU19MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTE4MCkKKyNkZWZpbmUgUzVQX1RPUF9SRVRFTlRJT05fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE4NCkKKyNkZWZpbmUgUzVQX1RPUF9QV1JfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExODgpCisjZGVmaW5lIFM1UF9MT0dJQ19SRVNFVF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFBMCkKKyNkZWZpbmUgUzVQX09ORU5BTkRfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUMwKQorI2RlZmluZSBTNVBfRzJEX0FDUF9NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExQzgpCisjZGVmaW5lIFM1UF9VU0JPVEdfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUNDKQorI2RlZmluZSBTNVBfSFNNTUNfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUQwKQorI2RlZmluZSBTNVBfQ1NTWVNfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUQ0KQorI2RlZmluZSBTNVBfU0VDU1NfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUQ4KQorI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9EUkFNX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMDApCisjZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX01BVURJT19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjA0KQorI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9HUElPX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMjApCisjZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX1VBUlRfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIyNCkKKyNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fTU1DQV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjI4KQorI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9NTUNCX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMkMpCisjZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX0VCSUFfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIzMCkKKyNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fRUJJQl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjM0KQorI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9JU09MQVRJT05fTE9XUFdSCVM1UF9QTVVSRUcoMHgxMjQwKQorI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9BTFZfU0VMX0xPV1BXUglTNVBfUE1VUkVHKDB4MTI2MCkKKyNkZWZpbmUgUzVQX1hVU0JYVElfTE9XUFdSCQkJUzVQX1BNVVJFRygweDEyODApCisjZGVmaW5lIFM1UF9YWFRJX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTI4NCkKKyNkZWZpbmUgUzVQX0VYVF9SRUdVTEFUT1JfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTJDMCkKKyNkZWZpbmUgUzVQX0dQSU9fTU9ERV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTMwMCkKKyNkZWZpbmUgUzVQX0dQSU9fTU9ERV9NQVVESU9fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTM0MCkKKyNkZWZpbmUgUzVQX0NBTV9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEzODApCisjZGVmaW5lIFM1UF9UVl9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEzODQpCisjZGVmaW5lIFM1UF9NRkNfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzg4KQorI2RlZmluZSBTNVBfRzNEX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTM4QykKKyNkZWZpbmUgUzVQX0xDRDBfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzkwKQorI2RlZmluZSBTNVBfTUFVRElPX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMzk4KQorI2RlZmluZSBTNVBfR1BTX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTM5QykKKyNkZWZpbmUgUzVQX0dQU19BTElWRV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTNBMCkKKworI2RlZmluZSBTNVBfQVJNX0NPUkUwX0NPTkZJR1VSQVRJT04JCVM1UF9QTVVSRUcoMHgyMDAwKQorI2RlZmluZSBTNVBfQVJNX0NPUkUwX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyMDA4KQorI2RlZmluZSBTNVBfQVJNX0NPUkUxX0NPTkZJR1VSQVRJT04JCVM1UF9QTVVSRUcoMHgyMDgwKQorI2RlZmluZSBTNVBfQVJNX0NPUkUxX1NUQVRVUwkJCVM1UF9QTVVSRUcoMHgyMDg0KQorI2RlZmluZSBTNVBfQVJNX0NPUkUxX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyMDg4KQorCisjZGVmaW5lIFM1UF9BUk1fQ09NTU9OX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyNDA4KQorI2RlZmluZSBTNVBfVE9QX1BXUl9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MkM0OCkKKyNkZWZpbmUgUzVQX0NBTV9PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDMDgpCisjZGVmaW5lIFM1UF9UVl9PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDMjgpCisjZGVmaW5lIFM1UF9NRkNfT1BUSU9OCQkJCVM1UF9QTVVSRUcoMHgzQzQ4KQorI2RlZmluZSBTNVBfRzNEX09QVElPTgkJCQlTNVBfUE1VUkVHKDB4M0M2OCkKKyNkZWZpbmUgUzVQX0xDRDBfT1BUSU9OCQkJCVM1UF9QTVVSRUcoMHgzQzg4KQorI2RlZmluZSBTNVBfTENEMV9PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDQTgpCisjZGVmaW5lIFM1UF9NQVVESU9fT1BUSU9OCQkJUzVQX1BNVVJFRygweDNDQzgpCisjZGVmaW5lIFM1UF9HUFNfT1BUSU9OCQkJCVM1UF9QTVVSRUcoMHgzQ0U4KQorI2RlZmluZSBTNVBfR1BTX0FMSVZFX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzRDA4KQorCisjZGVmaW5lIFM1UF9QQURfUkVUX01BVURJT19PUFRJT04JCVM1UF9QTVVSRUcoMHgzMDI4KQorI2RlZmluZSBTNVBfUEFEX1JFVF9HUElPX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTA4KQorI2RlZmluZSBTNVBfUEFEX1JFVF9VQVJUX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTI4KQorI2RlZmluZSBTNVBfUEFEX1JFVF9NTUNBX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTQ4KQorI2RlZmluZSBTNVBfUEFEX1JFVF9NTUNCX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTY4KQorI2RlZmluZSBTNVBfUEFEX1JFVF9FQklBX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTg4KQorI2RlZmluZSBTNVBfUEFEX1JFVF9FQklCX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMUE4KQorCisjZGVmaW5lIFM1UF9QTVVfQ0FNX0NPTkYJCQlTNVBfUE1VUkVHKDB4M0MwMCkKKyNkZWZpbmUgUzVQX1BNVV9UVl9DT05GCQkJCVM1UF9QTVVSRUcoMHgzQzIwKQorI2RlZmluZSBTNVBfUE1VX01GQ19DT05GCQkJUzVQX1BNVVJFRygweDNDNDApCisjZGVmaW5lIFM1UF9QTVVfRzNEX0NPTkYJCQlTNVBfUE1VUkVHKDB4M0M2MCkKKyNkZWZpbmUgUzVQX1BNVV9MQ0QwX0NPTkYJCQlTNVBfUE1VUkVHKDB4M0M4MCkKKyNkZWZpbmUgUzVQX1BNVV9HUFNfQ09ORgkJCVM1UF9QTVVSRUcoMHgzQ0UwKQorCisjZGVmaW5lIFM1UF9QTVVfU0FUQV9QSFlfQ09OVFJPTF9FTgkJMHgxCisjZGVmaW5lIFM1UF9DT1JFX0xPQ0FMX1BXUl9FTgkJCTB4MworI2RlZmluZSBTNVBfSU5UX0xPQ0FMX1BXUl9FTgkJCTB4NworCisjZGVmaW5lIFM1UF9DSEVDS19TTEVFUAkJCQkweDAwMDAwQkFECisKKy8qIE9ubHkgZm9yIEVYWU5PUzQyMTAgKi8KKyNkZWZpbmUgUzVQX1VTQkhPU1RfUEhZX0NPTlRST0wJCVM1UF9QTVVSRUcoMHgwNzA4KQorI2RlZmluZSBTNVBfVVNCSE9TVF9QSFlfRU5BQkxFCQkoMSA8PCAwKQorCisjZGVmaW5lIFM1UF9QTVVfU0FUQV9QSFlfQ09OVFJPTAlTNVBfUE1VUkVHKDB4MDcyMCkKKworI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfTENEMV9MT1dQV1IJUzVQX1BNVVJFRygweDExNTQpCisjZGVmaW5lIFM1UF9DTVVfUkVTRVRfTENEMV9MT1dQV1IJUzVQX1BNVVJFRygweDExNzQpCisjZGVmaW5lIFM1UF9NT0RJTUlGX01FTV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMUM0KQorI2RlZmluZSBTNVBfUENJRV9NRU1fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTFFMCkKKyNkZWZpbmUgUzVQX1NBVEFfTUVNX0xPV1BXUgkJUzVQX1BNVVJFRygweDExRTQpCisjZGVmaW5lIFM1UF9MQ0QxX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMzk0KQorCisjZGVmaW5lIFM1UF9QTVVfTENEMV9DT05GCQlTNVBfUE1VUkVHKDB4M0NBMCkKKworLyogT25seSBmb3IgRVhZTk9TNDIxMiAqLworI2RlZmluZSBTNVBfSVNQX0FSTV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTA1MCkKKyNkZWZpbmUgUzVQX0RJU19JUlFfSVNQX0FSTV9MT0NBTF9MT1dQV1IJUzVQX1BNVVJFRygweDEwNTQpCisjZGVmaW5lIFM1UF9ESVNfSVJRX0lTUF9BUk1fQ0VOVFJBTF9MT1dQV1IJUzVQX1BNVVJFRygweDEwNTgpCisjZGVmaW5lIFM1UF9DTVVfQUNMS1NUT1BfQ09SRUJMS19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTEwKQorI2RlZmluZSBTNVBfQ01VX1NDTEtTVE9QX0NPUkVCTEtfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTExNCkKKyNkZWZpbmUgUzVQX0NNVV9SRVNFVF9DT1JFQkxLX0xPV1BXUgkJUzVQX1BNVVJFRygweDExMUMpCisjZGVmaW5lIFM1UF9NUExMVVNFUl9TWVNDTEtfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTEzMCkKKyNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX0lTUF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTU0KQorI2RlZmluZSBTNVBfQ01VX1JFU0VUX0lTUF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTc0KQorI2RlZmluZSBTNVBfVE9QX0JVU19DT1JFQkxLX0xPV1BXUgkJUzVQX1BNVVJFRygweDExOTApCisjZGVmaW5lIFM1UF9UT1BfUkVURU5USU9OX0NPUkVCTEtfTE9XUFdSCVM1UF9QTVVSRUcoMHgxMTk0KQorI2RlZmluZSBTNVBfVE9QX1BXUl9DT1JFQkxLX0xPV1BXUgkJUzVQX1BNVVJFRygweDExOTgpCisjZGVmaW5lIFM1UF9PU0NDTEtfR0FURV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFBNCkKKyNkZWZpbmUgUzVQX0xPR0lDX1JFU0VUX0NPUkVCTEtfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTFCMCkKKyNkZWZpbmUgUzVQX09TQ0NMS19HQVRFX0NPUkVCTEtfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTFCNCkKKyNkZWZpbmUgUzVQX0hTSV9NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExQzQpCisjZGVmaW5lIFM1UF9ST1RBVE9SX01FTV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFEQykKKyNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fR1BJT19DT1JFQkxLX0xPV1BXUglTNVBfUE1VUkVHKDB4MTIzQykKKyNkZWZpbmUgUzVQX1BBRF9JU09MQVRJT05fQ09SRUJMS19MT1dQV1IJUzVQX1BNVVJFRygweDEyNTApCisjZGVmaW5lIFM1UF9HUElPX01PREVfQ09SRUJMS19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMzIwKQorI2RlZmluZSBTNVBfVE9QX0FTQl9SRVNFVF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMzQ0KQorI2RlZmluZSBTNVBfVE9QX0FTQl9JU09MQVRJT05fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTM0OCkKKyNkZWZpbmUgUzVQX0lTUF9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEzOTQpCisjZGVmaW5lIFM1UF9EUkFNX0ZSRVFfRE9XTl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxM0IwKQorI2RlZmluZSBTNVBfRERSUEhZX0RMTE9GRl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxM0I0KQorI2RlZmluZSBTNVBfQ01VX1NZU0NMS19JU1BfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTNCOCkKKyNkZWZpbmUgUzVQX0NNVV9TWVNDTEtfR1BTX0xPV1BXUgkJUzVQX1BNVVJFRygweDEzQkMpCisjZGVmaW5lIFM1UF9MUEREUl9QSFlfRExMX0xPQ0tfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTNDMCkKKworI2RlZmluZSBTNVBfQVJNX0wyXzBfT1BUSU9OCQkJUzVQX1BNVVJFRygweDI2MDgpCisjZGVmaW5lIFM1UF9BUk1fTDJfMV9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MjYyOCkKKyNkZWZpbmUgUzVQX09ORU5BTkRfTUVNX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyRTA4KQorI2RlZmluZSBTNVBfSFNJX01FTV9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MkUyOCkKKyNkZWZpbmUgUzVQX0cyRF9BQ1BfTUVNX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyRTQ4KQorI2RlZmluZSBTNVBfVVNCT1RHX01FTV9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MkU2OCkKKyNkZWZpbmUgUzVQX0hTTU1DX01FTV9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MkU4OCkKKyNkZWZpbmUgUzVQX0NTU1lTX01FTV9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MkVBOCkKKyNkZWZpbmUgUzVQX1NFQ1NTX01FTV9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MkVDOCkKKyNkZWZpbmUgUzVQX1JPVEFUT1JfTUVNX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyRjQ4KQorCisjZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX1BNVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3Mtc3lzbW11LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1zeXNtbXUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXN5c21tdS5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1zeXNtbXUuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXVzYi1waHkuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLXVzYi1waHkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXVzYi1waHkuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtdXNiLXBoeS5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3N5c21tdS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3N5c21tdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3N5c21tdS5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvc3lzbW11LmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvc3lzdGVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC90aW1leC5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3RpbWV4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvdGltZXguaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3RpbWV4LmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbml0LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbml0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbml0LmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luaXQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2lycS1jb21iaW5lci5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaXJxLWNvbWJpbmVyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pcnEtY29tYmluZXIuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaXJxLWNvbWJpbmVyLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pcnEtZWludC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaXJxLWVpbnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2lycS1laW50LmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2lycS1laW50LmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtYXJtbGV4NDIxMC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1hcm1sZXg0MjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYTZjMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtYXJtbGV4NDIxMC5jCkBAIC0wLDAgKzEsMjE1IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1hcm1sZXg0MjEwLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zcm9tLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFSTUxFWDQyMTBfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWElMRVZFTCB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1RYSVJRTU9ERSB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYSVJRTU9ERSB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYRklGT19UT0kgfAlcCisJCQkJIFMzQzI0NDNfVUNPTl9SWEVSUl9JUlFFTikKKworI2RlZmluZSBBUk1MRVg0MjEwX1VMQ09OX0RFRkFVTFQJUzNDMjQxMF9MQ09OX0NTOAorCisjZGVmaW5lIEFSTUxFWDQyMTBfVUZDT05fREVGQVVMVAkoUzNDMjQxMF9VRkNPTl9GSUZPTU9ERSB8CVwKKwkJCQkgUzVQVjIxMF9VRkNPTl9UWFRSSUc0IHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1JYVFJJRzQpCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIGFybWxleDQyMTBfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkJPSAwLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gQVJNTEVYNDIxMF9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBBUk1MRVg0MjEwX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBBUk1MRVg0MjEwX1VGQ09OX0RFRkFVTFQsCisJfSwKKwlbMV0gPSB7CisJCS5od3BvcnQJCT0gMSwKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IEFSTUxFWDQyMTBfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gQVJNTEVYNDIxMF9VTENPTl9ERUZBVUxULAorCQkudWZjb24JCT0gQVJNTEVYNDIxMF9VRkNPTl9ERUZBVUxULAorCX0sCisJWzJdID0geworCQkuaHdwb3J0CQk9IDIsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBBUk1MRVg0MjEwX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IEFSTUxFWDQyMTBfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IEFSTUxFWDQyMTBfVUZDT05fREVGQVVMVCwKKwl9LAorCVszXSA9IHsKKwkJLmh3cG9ydAkJPSAzLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gQVJNTEVYNDIxMF9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBBUk1MRVg0MjEwX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBBUk1MRVg0MjEwX1VGQ09OX0RFRkFVTFQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIGFybWxleDQyMTBfaHNtbWMwX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX1BFUk1BTkVOVCwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCisjaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gwXzhCSVQKKwkubWF4X3dpZHRoCQk9IDgsCisJLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzhfQklUX0RBVEEsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIGFybWxleDQyMTBfaHNtbWMyX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCisJLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BYMig1KSwKKwkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCisJLm1heF93aWR0aAkJPSA0LAorfTsKKworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgYXJtbGV4NDIxMF9oc21tYzNfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfUEVSTUFORU5ULAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKKwkubWF4X3dpZHRoCQk9IDQsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXJtbGV4NDIxMF9zZGhjaV9pbml0KHZvaWQpCit7CisJczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoJmFybWxleDQyMTBfaHNtbWMwX3BkYXRhKTsKKwlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmYXJtbGV4NDIxMF9oc21tYzJfcGRhdGEpOworCXMzY19zZGhjaTNfc2V0X3BsYXRkYXRhKCZhcm1sZXg0MjEwX2hzbW1jM19wZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhcm1sZXg0MjEwX3dsYW5faW5pdCh2b2lkKQoreworCS8qIGVuYWJsZSAqLworCXMzY19ncGlvX2NmZ3BpbihFWFlOT1M0X0dQWDIoMCksIFMzQ19HUElPX1NGTigweGYpKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKEVYWU5PUzRfR1BYMigwKSwgUzNDX0dQSU9fUFVMTF9VUCk7CisKKwkvKiByZXNldCAqLworCXMzY19ncGlvX2NmZ3BpbihFWFlOT1M0X0dQWDEoNiksIFMzQ19HUElPX1NGTigweGYpKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKEVYWU5PUzRfR1BYMSg2KSwgUzNDX0dQSU9fUFVMTF9VUCk7CisKKwkvKiB3YWtldXAgKi8KKwlzM2NfZ3Bpb19jZmdwaW4oRVhZTk9TNF9HUFgxKDUpLCBTM0NfR1BJT19TRk4oMHhmKSk7CisJczNjX2dwaW9fc2V0cHVsbChFWFlOT1M0X0dQWDEoNSksIFMzQ19HUElPX1BVTExfVVApOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFybWxleDQyMTBfc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NST01fQkFOSygzKSwKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1JPTV9CQU5LKDMpICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9FSU5UKDI3KSwKKwkJLmVuZAk9IElSUV9FSU5UKDI3KSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJUlFGX1RSSUdHRVJfSElHSCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbXNjOTExeF9wbGF0Zm9ybV9jb25maWcgc21zYzkyMTVfY29uZmlnID0geworCS5pcnFfcG9sYXJpdHkJPSBTTVNDOTExWF9JUlFfUE9MQVJJVFlfQUNUSVZFX0hJR0gsCisJLmlycV90eXBlCT0gU01TQzkxMVhfSVJRX1RZUEVfUFVTSF9QVUxMLAorCS5mbGFncwkJPSBTTVNDOTExWF9VU0VfMTZCSVQgfCBTTVNDOTExWF9GT1JDRV9JTlRFUk5BTF9QSFksCisJLnBoeV9pbnRlcmZhY2UJPSBQSFlfSU5URVJGQUNFX01PREVfTUlJLAorCS5tYWMJCT0gezB4MDAsIDB4ODAsIDB4MDAsIDB4MjMsIDB4NDUsIDB4Njd9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXJtbGV4NDIxMF9zbXNjOTExeCA9IHsKKwkubmFtZQkJPSAic21zYzkxMXgiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXJtbGV4NDIxMF9zbXNjOTExeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGFybWxleDQyMTBfc21zYzkxMXhfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZzbXNjOTIxNV9jb25maWcsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphcm1sZXg0MjEwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzM2NfZGV2aWNlX2hzbW1jMCwKKwkmczNjX2RldmljZV9oc21tYzIsCisJJnMzY19kZXZpY2VfaHNtbWMzLAorCSZzM2NfZGV2aWNlX3J0YywKKwkmczNjX2RldmljZV93ZHQsCisJJmV4eW5vczRfZGV2aWNlX3N5c21tdSwKKwkmc2Ftc3VuZ19hc29jX2RtYSwKKwkmYXJtbGV4NDIxMF9zbXNjOTExeCwKKwkmZXh5bm9zNF9kZXZpY2VfYWhjaSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhcm1sZXg0MjEwX3Ntc2M5MTF4X2luaXQodm9pZCkKK3sKKwl1MzIgY3MxOworCisJLyogY29uZmlndXJlIG5DUzEgd2lkdGggdG8gMTYgYml0cyAqLworCWNzMSA9IF9fcmF3X3JlYWRsKFM1UF9TUk9NX0JXKSAmCisJCX4oUzVQX1NST01fQldfX0NTX01BU0sgPDwgUzVQX1NST01fQldfX05DUzFfX1NISUZUKTsKKwljczEgfD0gKCgxIDw8IFM1UF9TUk9NX0JXX19EQVRBV0lEVEhfX1NISUZUKSB8CisJCSgwIDw8IFM1UF9TUk9NX0JXX19XQUlURU5BQkxFX19TSElGVCkgfAorCQkoMSA8PCBTNVBfU1JPTV9CV19fQUREUk1PREVfX1NISUZUKSB8CisJCSgxIDw8IFM1UF9TUk9NX0JXX19CWVRFRU5BQkxFX19TSElGVCkpIDw8CisJCVM1UF9TUk9NX0JXX19OQ1MxX19TSElGVDsKKwlfX3Jhd193cml0ZWwoY3MxLCBTNVBfU1JPTV9CVyk7CisKKwkvKiBzZXQgdGltaW5nIGZvciBuQ1MxIHN1aXRhYmxlIGZvciBldGhlcm5ldCBjaGlwICovCisJX19yYXdfd3JpdGVsKCgweDEgPDwgUzVQX1NST01fQkNYX19QTUNfX1NISUZUKSB8CisJCSAgICAgKDB4OSA8PCBTNVBfU1JPTV9CQ1hfX1RBQ1BfX1NISUZUKSB8CisJCSAgICAgKDB4YyA8PCBTNVBfU1JPTV9CQ1hfX1RDQUhfX1NISUZUKSB8CisJCSAgICAgKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1RDT0hfX1NISUZUKSB8CisJCSAgICAgKDB4NiA8PCBTNVBfU1JPTV9CQ1hfX1RBQ0NfX1NISUZUKSB8CisJCSAgICAgKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1RDT1NfX1NISUZUKSB8CisJCSAgICAgKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1RBQ1NfX1NISUZUKSwgUzVQX1NST01fQkMxKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFybWxleDQyMTBfbWFwX2lvKHZvaWQpCit7CisJczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQX1ZBX0NISVBJRCk7CisJczNjMjR4eF9pbml0X2Nsb2NrcygyNDAwMDAwMCk7CisJczNjMjR4eF9pbml0X3VhcnRzKGFybWxleDQyMTBfdWFydGNmZ3MsCisJCQkgICBBUlJBWV9TSVpFKGFybWxleDQyMTBfdWFydGNmZ3MpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFybWxleDQyMTBfbWFjaGluZV9pbml0KHZvaWQpCit7CisJYXJtbGV4NDIxMF9zbXNjOTExeF9pbml0KCk7CisKKwlhcm1sZXg0MjEwX3NkaGNpX2luaXQoKTsKKworCWFybWxleDQyMTBfd2xhbl9pbml0KCk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhcm1sZXg0MjEwX2RldmljZXMsCisJCQkgICAgIEFSUkFZX1NJWkUoYXJtbGV4NDIxMF9kZXZpY2VzKSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoQVJNTEVYNDIxMCwgIkFSTUxFWDQyMTAiKQorCS8qIE1haW50YWluZXI6IEFsaW0gQWtodGFyIDxhbGltLmFraHRhckBzYW1zdW5nLmNvbT4gKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAorCS5tYXBfaW8JCT0gYXJtbGV4NDIxMF9tYXBfaW8sCisJLmluaXRfbWFjaGluZQk9IGFybWxleDQyMTBfbWFjaGluZV9pbml0LAorCS50aW1lcgkJPSAmZXh5bm9zNF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLW51cmkuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtbnVyaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNmJiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLW51cmkuYwpAQCAtMCwwICsxLDEzMzkgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1udXJpLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL2F0bWVsX214dF90cy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL21heDg5MDNfY2hhcmdlci5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk3Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTctcHJpdmF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+CisKKyNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KKyNpbmNsdWRlIDxtZWRpYS9tNW1vbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zNXBfZmltYy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8cGxhdC9hZGMuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtZmItdjQuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2ZiLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorI2luY2x1ZGUgPHBsYXQvZWhjaS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KKyNpbmNsdWRlIDxwbGF0L21mYy5oPgorI2luY2x1ZGUgPHBsYXQvcGQuaD4KKyNpbmNsdWRlIDxwbGF0L2ZpbWMtY29yZS5oPgorI2luY2x1ZGUgPHBsYXQvY2FtcG9ydC5oPgorI2luY2x1ZGUgPHBsYXQvbWlwaV9jc2lzLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisvKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlVSSV9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYSUxFVkVMIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fVFhJUlFNT0RFIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhJUlFNT0RFIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhGSUZPX1RPSSB8CVwKKwkJCQkgUzNDMjQ0M19VQ09OX1JYRVJSX0lSUUVOKQorCisjZGVmaW5lIE5VUklfVUxDT05fREVGQVVMVAlTM0MyNDEwX0xDT05fQ1M4CisKKyNkZWZpbmUgTlVSSV9VRkNPTl9ERUZBVUxUCShTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFIHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1RYVFJJRzI1NiB8CVwKKwkJCQkgUzVQVjIxMF9VRkNPTl9SWFRSSUcyNTYpCisKK2VudW0gZml4ZWRfcmVndWxhdG9yX2lkIHsKKwlGSVhFRF9SRUdfSURfTU1DID0gMCwKKwlGSVhFRF9SRUdfSURfTUFYODkwMywKKwlGSVhFRF9SRUdfSURfQ0FNX0EyOFYsCisJRklYRURfUkVHX0lEX0NBTV8xMlYsCit9OworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyBudXJpX3VhcnRjZmdzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5od3BvcnQJCT0gMCwKKwkJLnVjb24JCT0gTlVSSV9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBOVVJJX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBOVVJJX1VGQ09OX0RFRkFVTFQsCisJfSwKKwl7CisJCS5od3BvcnQJCT0gMSwKKwkJLnVjb24JCT0gTlVSSV9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBOVVJJX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBOVVJJX1VGQ09OX0RFRkFVTFQsCisJfSwKKwl7CisJCS5od3BvcnQJCT0gMiwKKwkJLnVjb24JCT0gTlVSSV9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBOVVJJX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBOVVJJX1VGQ09OX0RFRkFVTFQsCisJfSwKKwl7CisJCS5od3BvcnQJCT0gMywKKwkJLnVjb24JCT0gTlVSSV9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBOVVJJX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBOVVJJX1VGQ09OX0RFRkFVTFQsCisJfSwKK307CisKKy8qIGVNTUMgKi8KK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIG51cmlfaHNtbWMwX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkubWF4X3dpZHRoCQk9IDgsCisJLmhvc3RfY2FwcwkJPSAoTU1DX0NBUF84X0JJVF9EQVRBIHwgTU1DX0NBUF80X0JJVF9EQVRBIHwKKwkJCQlNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8CisJCQkJTU1DX0NBUF9ESVNBQkxFIHwgTU1DX0NBUF9FUkFTRSksCisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX1BFUk1BTkVOVCwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZW1tY19zdXBwbGllc1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAiczNjLXNkaGNpLjAiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgImR3X21tYyIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGVtbWNfZml4ZWRfdm9sdGFnZV9pbml0X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCQk9IHsKKwkJLm5hbWUJCT0gIlZNRU1fVkREXzIuOFYiLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGVtbWNfc3VwcGxpZXMpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGVtbWNfc3VwcGxpZXMsCit9OworCitzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIGVtbWNfZml4ZWRfdm9sdGFnZV9jb25maWcgPSB7CisJLnN1cHBseV9uYW1lCQk9ICJNQVNTTUVNT1JZX0VOIChpbnZlcnRlZCkiLAorCS5taWNyb3ZvbHRzCQk9IDI4MDAwMDAsCisJLmdwaW8JCQk9IEVYWU5PUzRfR1BMMSgxKSwKKwkuZW5hYmxlX2hpZ2gJCT0gZmFsc2UsCisJLmluaXRfZGF0YQkJPSAmZW1tY19maXhlZF92b2x0YWdlX2luaXRfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVtbWNfZml4ZWRfdm9sdGFnZSA9IHsKKwkubmFtZQkJCT0gInJlZy1maXhlZC12b2x0YWdlIiwKKwkuaWQJCQk9IEZJWEVEX1JFR19JRF9NTUMsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZlbW1jX2ZpeGVkX3ZvbHRhZ2VfY29uZmlnLAorCX0sCit9OworCisvKiBTRCAqLworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgbnVyaV9oc21tYzJfZGF0YSBfX2luaXRkYXRhID0geworCS5tYXhfd2lkdGgJCT0gNCwKKwkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfNF9CSVRfREFUQSB8CisJCQkJTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQgfAorCQkJCU1NQ19DQVBfRElTQUJMRSwKKwkuZXh0X2NkX2dwaW8JCT0gRVhZTk9TNF9HUFgzKDMpLAkvKiBYRUlOVF8yNyAqLworCS5leHRfY2RfZ3Bpb19pbnZlcnQJPSAxLAorCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKK307CisKKy8qIFdMQU4gKi8KK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIG51cmlfaHNtbWMzX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkubWF4X3dpZHRoCQk9IDQsCisJLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzRfQklUX0RBVEEgfAorCQkJCU1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVELAorCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9FWFRFUk5BTCwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbnVyaV9zZGhjaV9pbml0KHZvaWQpCit7CisJczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoJm51cmlfaHNtbWMwX2RhdGEpOworCXMzY19zZGhjaTJfc2V0X3BsYXRkYXRhKCZudXJpX2hzbW1jMl9kYXRhKTsKKwlzM2Nfc2RoY2kzX3NldF9wbGF0ZGF0YSgmbnVyaV9oc21tYzNfZGF0YSk7Cit9CisKKy8qIEdQSU8gS0VZUyAqLworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIG51cmlfZ3Bpb19rZXlzX3RhYmxlc1tdID0geworCXsKKwkJLmNvZGUJCQk9IEtFWV9WT0xVTUVVUCwKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigwKSwJLyogWEVJTlQxNiAqLworCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX1ZPTFVNRVVQIiwKKwkJLnR5cGUJCQk9IEVWX0tFWSwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmRlYm91bmNlX2ludGVydmFsCT0gMSwKKwl9LCB7CisJCS5jb2RlCQkJPSBLRVlfVk9MVU1FRE9XTiwKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigxKSwJLyogWEVJTlQxNyAqLworCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX1ZPTFVNRURPV04iLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sIHsKKwkJLmNvZGUJCQk9IEtFWV9QT1dFUiwKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMig3KSwJLyogWEVJTlQyMyAqLworCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX1BPV0VSIiwKKwkJLnR5cGUJCQk9IEVWX0tFWSwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLndha2V1cAkJCT0gMSwKKwkJLmRlYm91bmNlX2ludGVydmFsCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBudXJpX2dwaW9fa2V5c19kYXRhID0geworCS5idXR0b25zCQk9IG51cmlfZ3Bpb19rZXlzX3RhYmxlcywKKwkubmJ1dHRvbnMJCT0gQVJSQVlfU0laRShudXJpX2dwaW9fa2V5c190YWJsZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbnVyaV9ncGlvX2tleXMgPSB7CisJLm5hbWUJCQk9ICJncGlvLWtleXMiLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbnVyaV9ncGlvX2tleXNfZGF0YSwKKwl9LAorfTsKKworLyogRnJhbWUgQnVmZmVyICovCitzdGF0aWMgc3RydWN0IHMzY19mYl9wZF93aW4gbnVyaV9mYl93aW4wID0geworCS53aW5fbW9kZSA9IHsKKwkJLmxlZnRfbWFyZ2luCT0gNjQsCisJCS5yaWdodF9tYXJnaW4JPSAxNiwKKwkJLnVwcGVyX21hcmdpbgk9IDY0LAorCQkubG93ZXJfbWFyZ2luCT0gMSwKKwkJLmhzeW5jX2xlbgk9IDQ4LAorCQkudnN5bmNfbGVuCT0gMywKKwkJLnhyZXMJCT0gMTI4MCwKKwkJLnlyZXMJCT0gODAwLAorCQkucmVmcmVzaAk9IDYwLAorCX0sCisJLm1heF9icHAJPSAyNCwKKwkuZGVmYXVsdF9icHAJPSAxNiwKKwkudmlydHVhbF94CT0gMTI4MCwKKwkudmlydHVhbF95CT0gODAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgbnVyaV9mYl9wZGF0YSBfX2luaXRkYXRhID0geworCS53aW5bMF0JCT0gJm51cmlfZmJfd2luMCwKKwkudmlkY29uMAk9IFZJRENPTjBfVklET1VUX1JHQiB8IFZJRENPTjBfUE5STU9ERV9SR0IgfAorCQkJICBWSURDT04wX0NMS1NFTF9MQ0QsCisJLnZpZGNvbjEJPSBWSURDT04xX0lOVl9IU1lOQyB8IFZJRENPTjFfSU5WX1ZTWU5DLAorCS5zZXR1cF9ncGlvCT0gZXh5bm9zNF9maW1kMF9ncGlvX3NldHVwXzI0YnBwLAorfTsKKworc3RhdGljIHZvaWQgbnVyaV9sY2RfcG93ZXJfb24oc3RydWN0IHBsYXRfbGNkX2RhdGEgKnBkLCB1bnNpZ25lZCBpbnQgcG93ZXIpCit7CisJaW50IGdwaW8gPSBFWFlOT1M0X0dQRTEoNSk7CisKKwlncGlvX3JlcXVlc3QoZ3BpbywgIkxWRFNfblNIRE4iKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgcG93ZXIpOworCWdwaW9fZnJlZShncGlvKTsKK30KKworc3RhdGljIGludCBudXJpX2JsX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQsIGdwaW8gPSBFWFlOT1M0X0dQRTIoMyk7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoZ3BpbywgIkxDRF9MRE9fRU4iKTsKKwlpZiAoIXJldCkKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBudXJpX2JsX25vdGlmeShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBicmlnaHRuZXNzKQoreworCWlmIChicmlnaHRuZXNzIDwgMSkKKwkJYnJpZ2h0bmVzcyA9IDA7CisKKwlncGlvX3NldF92YWx1ZShFWFlOT1M0X0dQRTIoMyksIDEpOworCisJcmV0dXJuIGJyaWdodG5lc3M7Cit9CisKK3N0YXRpYyB2b2lkIG51cmlfYmxfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZ3Bpb19mcmVlKEVYWU5PUzRfR1BFMigzKSk7Cit9CisKKy8qIG51cmkgcHdtIGJhY2tsaWdodCAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgbnVyaV9iYWNrbGlnaHRfZGF0YSA9IHsKKwkucHdtX2lkCQkJPSAwLAorCS5wd21fcGVyaW9kX25zCQk9IDMwMDAwLAorCS5tYXhfYnJpZ2h0bmVzcwkJPSAxMDAsCisJLmRmdF9icmlnaHRuZXNzCQk9IDUwLAorCS5pbml0CQkJPSBudXJpX2JsX2luaXQsCisJLm5vdGlmeQkJCT0gbnVyaV9ibF9ub3RpZnksCisJLmV4aXQJCQk9IG51cmlfYmxfZXhpdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG51cmlfYmFja2xpZ2h0X2RldmljZSA9IHsKKwkubmFtZQkJCT0gInB3bS1iYWNrbGlnaHQiLAorCS5pZAkJCT0gLTEsCisJLmRldgkJCT0geworCQkucGFyZW50CQk9ICZzM2NfZGV2aWNlX3RpbWVyWzBdLmRldiwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbnVyaV9iYWNrbGlnaHRfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X2xjZF9kYXRhIG51cmlfbGNkX3BsYXRmb3JtX2RhdGEgPSB7CisJLnNldF9wb3dlcgkJPSBudXJpX2xjZF9wb3dlcl9vbiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG51cmlfbGNkX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInBsYXRmb3JtLWxjZCIsCisJLmlkCQkJPSAtMSwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm51cmlfbGNkX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKKy8qIEkyQzEgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjMV9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwkvKiBHeXJvLCBUbyBiZSB1cGRhdGVkICovCit9OworCisvKiBUU1AgKi8KK3N0YXRpYyB1OCBteHRfaW5pdF92YWxzW10gPSB7CisJLyogTVhUX0dFTl9DT01NQU5EKDYpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBNWFRfR0VOX1BPV0VSKDcpICovCisJMHgyMCwgMHhmZiwgMHgzMiwKKwkvKiBNWFRfR0VOX0FDUVVJUkUoOCkgKi8KKwkweDBhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDIzLAorCS8qIE1YVF9UT1VDSF9NVUxUSSg5KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisJMHgwMCwgMHgwMSwgMHgwMSwgMHgwZSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsCisJLyogTVhUX1RPVUNIX0tFWUFSUkFZKDE1KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisJMHgwMCwKKwkvKiBNWFRfU1BUX0dQSU9QV00oMTkpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIE1YVF9QUk9DSV9HUklQRkFDRSgyMCkgKi8KKwkweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDUwLCAweDI4LCAweDA0LAorCTB4MGYsIDB4MGEsCisJLyogTVhUX1BST0NHX05PSVNFKDIyKSAqLworCTB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MjMsIDB4MDAsCisJMHgwMCwgMHgwNSwgMHgwZiwgMHgxOSwgMHgyMywgMHgyZCwgMHgwMywKKwkvKiBNWFRfVE9VQ0hfUFJPWElNSVRZKDIzKSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkvKiBNWFRfUFJPQ0lfT05FVE9VQ0goMjQpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIE1YVF9TUFRfU0VMRlRFU1QoMjUpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIE1YVF9QUk9DSV9UV09UT1VDSCgyNykgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIE1YVF9TUFRfQ1RFQ09ORklHKDI4KSAqLworCTB4MDAsIDB4MDAsIDB4MDIsIDB4MDgsIDB4MTAsIDB4MDAsCit9OworCitzdGF0aWMgc3RydWN0IG14dF9wbGF0Zm9ybV9kYXRhIG14dF9wbGF0Zm9ybV9kYXRhID0geworCS5jb25maWcJCQk9IG14dF9pbml0X3ZhbHMsCisJLmNvbmZpZ19sZW5ndGgJCT0gQVJSQVlfU0laRShteHRfaW5pdF92YWxzKSwKKworCS54X2xpbmUJCQk9IDE4LAorCS55X2xpbmUJCQk9IDExLAorCS54X3NpemUJCQk9IDEwMjQsCisJLnlfc2l6ZQkJCT0gNjAwLAorCS5ibGVuCQkJPSAweDEsCisJLnRocmVzaG9sZAkJPSAweDI4LAorCS52b2x0YWdlCQk9IDI4MDAwMDAsCQkvKiAyLjhWICovCisJLm9yaWVudAkJCT0gTVhUX0RJQUdPTkFMX0NPVU5URVIsCisJLmlycWZsYWdzCQk9IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBpMmMzX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkuZmxhZ3MJCT0gMCwKKwkuYnVzX251bQk9IDMsCisJLnNsYXZlX2FkZHIJPSAweDEwLAorCS5mcmVxdWVuY3kJPSA0MDAgKiAxMDAwLAorCS5zZGFfZGVsYXkJPSAxMDAsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyYzNfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygiYXRtZWxfbXh0X3RzIiwgMHg0YSksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJm14dF9wbGF0Zm9ybV9kYXRhLAorCQkuaXJxCQk9IElSUV9FSU5UKDQpLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbnVyaV90c3BfaW5pdCh2b2lkKQoreworCWludCBncGlvOworCisJLyogVE9VQ0hfSU5UOiBYRUlOVF80ICovCisJZ3BpbyA9IEVYWU5PUzRfR1BYMCg0KTsKKwlncGlvX3JlcXVlc3QoZ3BpbywgIlRPVUNIX0lOVCIpOworCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMHhmKSk7CisJczNjX2dwaW9fc2V0cHVsbChncGlvLCBTM0NfR1BJT19QVUxMX1VQKTsKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xX1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZCIsICJzNXAtYWRjIiksIC8qIFVzZWQgYnkgQ1BVJ3MgQURDIGRydiAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvM19bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQxMSIsICJzNXAtbWlwaS1jc2lzLjAiKSwgLyogTUlQSSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvNF9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQxOCIsICJzNXAtbWlwaS1jc2lzLjAiKSwgLyogTUlQSSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvNV9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2aHNpYyIsICJtb2RlbWN0bCIpLCAvKiBNT0RFTSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvN19bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJkaWdfMTgiLCAiMC0wMDFmIiksIC8qIEhDRDgwMyAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvOF9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2dXNiX2QiLCBOVUxMKSwgLyogVXNlZCBieSBDUFUgKi8KKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGFjIiwgTlVMTCksIC8qIFVzZWQgYnkgQ1BVICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xMV9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2Y2MiLCAicGxhdGZvcm0tbGNkIiksIC8qIFU4MDQgTFZEUyAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTJfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkaW8iLCAiNi0wMDNjIiksIC8qIEhEQzgwMiAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTNfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJzM2Mtc2RoY2kuMiIpLCAvKiBURkxBU0ggKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE0X1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImlubW90b3IiLCAibWF4ODk5Ny1oYXB0aWMiKSwKK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE1X1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImF2ZGQiLCAiMy0wMDRhIiksIC8qIFRvdWNoIFNjcmVlbiAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTZfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiZF9zZW5zb3IiLCAiMC0wMDFmIiksIC8qIEhEQzgwMyAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMThfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkIiwgIjMtMDA0YSIpLCAvKiBUb3VjaCBTY3JlZW4gKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2sxX1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9hcm0iLCBOVUxMKSwgLyogQ1BVRlJFUSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazJfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX2ludCIsIE5VTEwpLCAvKiBDUFVGUkVRICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19idWNrM19bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQiLCAibWFsaV9kZXYuMCIpLCAvKiBHM0Qgb2YgRXh5bm9zIDQgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s0X1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImNvcmUiLCAiMC0wMDFmIiksIC8qIEhEQzgwMyAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazZfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiZGlnXzI4IiwgIjAtMDAxZiIpLCAvKiBwaW4gIjciIG9mIEhEQzgwMyAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfZXNhZmVvdXQxX1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInVzYl92YnVzIiwgTlVMTCksIC8qIENQVSdzIFVTQiBPVEcgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2VzYWZlb3V0Ml9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ1c2JfdmJ1cyIsICJtb2RlbWN0bCIpLCAvKiBWQlVTIG9mIE1vZGVtICovCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2NoYXJnZXJfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmluY2hnMSIsICJjaGFyZ2VyLW1hbmFnZXIuMCIpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfY2hnX3RvZmZfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmluY2hnX3N0b3AiLCBOVUxMKSwgLyogZm9yIGphY2sgaW50ZXJydXB0IGhhbmRsZXJzICovCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3XzMya2h6X2FwX1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImdwc19jbGsiLCAiYmNtNDc1MSIpLAorCVJFR1VMQVRPUl9TVVBQTFkoImJ0X2NsayIsICJiY200MzMwLWIxIiksCisJUkVHVUxBVE9SX1NVUFBMWSgid2lmaV9jbGsiLCAiYmNtNDMzLWIxIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzFfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWQURDXzMuM1ZfQzIxMCIsCisJCS5taW5fdVYJCT0gMzMwMDAwMCwKKwkJLm1heF91VgkJPSAzMzAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzFfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzFfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8yX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkFMSVZFXzEuMVZfQzIxMCIsCisJCS5taW5fdVYJCT0gMTEwMDAwMCwKKwkJLm1heF91VgkJPSAxMTAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5lbmFibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8zX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVlVTQl8xLjFWX0MyMTAiLAorCQkubWluX3VWCQk9IDExMDAwMDAsCisJCS5tYXhfdVYJCT0gMTEwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5hcHBseV91Vgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8zXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8zXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvNF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZNSVBJXzEuOFYiLAorCQkubWluX3VWCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCT0gMTgwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5hcHBseV91Vgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG80XyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG80XywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvNV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZIU0lDXzEuMlZfQzIxMCIsCisJCS5taW5fdVYJCT0gMTIwMDAwMCwKKwkJLm1heF91VgkJPSAxMjAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzVfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzVfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG82X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkNDXzEuOFZfUERBIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzdfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJDQU1fSVNQXzEuOFYiLAorCQkubWluX3VWCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCT0gMTgwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5hcHBseV91Vgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG83XyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG83XywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvOF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZVU0IvVkRBQ18zLjNWX0MyMTAiLAorCQkubWluX3VWCQk9IDMzMDAwMDAsCisJCS5tYXhfdVYJCT0gMzMwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5hcHBseV91Vgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG84XyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG84XywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvOV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZDQ18yLjhWX1BEQSIsCisJCS5taW5fdVYJCT0gMjgwMDAwMCwKKwkJLm1heF91VgkJPSAyODAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5lbmFibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xMF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZQTExfMS4xVl9DMjEwIiwKKwkJLm1pbl91VgkJPSAxMTAwMDAwLAorCQkubWF4X3VWCQk9IDExMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xMV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkxWRFNfVkREMy4zViIsCisJCS5taW5fdVYJCT0gMzMwMDAwMCwKKwkJLm1heF91VgkJPSAzMzAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmJvb3Rfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMTFfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzExXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTJfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWVF9DQU1fMS44ViIsCisJCS5taW5fdVYJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJPSAxODAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzEyXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xMl8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzEzX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVlRGXzIuOFYiLAorCQkubWluX3VWCQk9IDI4MDAwMDAsCisJCS5tYXhfdVYJCT0gMjgwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5hcHBseV91Vgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xM18pLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMTNfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xNF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZDQ18zLjBWX01PVE9SIiwKKwkJLm1pbl91VgkJPSAzMDAwMDAwLAorCQkubWF4X3VWCQk9IDMwMDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMTRfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzE0XywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTVfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWVE9VQ0hfQURWVjIuOFYiLAorCQkubWluX3VWCQk9IDI4MDAwMDAsCisJCS5tYXhfdVYJCT0gMjgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xNV8pLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMTVfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xNl9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkNBTV9TRU5TT1JfSU9fMS44ViIsCisJCS5taW5fdVYJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJPSAxODAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzE2XyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xNl8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE4X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVlRPVUNIX1ZERDIuOFYiLAorCQkubWluX3VWCQk9IDI4MDAwMDAsCisJCS5tYXhfdVYJCT0gMjgwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5hcHBseV91Vgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xOF8pLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMThfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8yMV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERFFfTTFNMl8xLjJWIiwKKwkJLm1pbl91VgkJPSAxMjAwMDAwLAorCQkubWF4X3VWCQk9IDEyMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrMV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZBUk1fMS4yVl9DMjEwIiwKKwkJLm1pbl91VgkJPSA5MDAwMDAsCisJCS5tYXhfdVYJCT0gMTM1MDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShtYXg4OTk3X2J1Y2sxXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gbWF4ODk5N19idWNrMV8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2syX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVklOVF8xLjFWX0MyMTAiLAorCQkubWluX3VWCQk9IDkwMDAwMCwKKwkJLm1heF91VgkJPSAxMTAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG1heDg5OTdfYnVjazJfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBtYXg4OTk3X2J1Y2syXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRzNEXzEuMVZfQzIxMCIsCisJCS5taW5fdVYJCT0gOTAwMDAwLAorCQkubWF4X3VWCQk9IDExMDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSB8CisJCQkJICBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShtYXg4OTk3X2J1Y2szXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gbWF4ODk5N19idWNrM18sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s0X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiQ0FNX0lTUF9DT1JFXzEuMlYiLAorCQkubWluX3VWCQk9IDEyMDAwMDAsCisJCS5tYXhfdVYJCT0gMTIwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUobWF4ODk5N19idWNrNF8pLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IG1heDg5OTdfYnVjazRfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrNV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZNRU1fMS4yVl9DMjEwIiwKKwkJLm1pbl91VgkJPSAxMjAwMDAwLAorCQkubWF4X3VWCQk9IDEyMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s2X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiQ0FNX0FGXzIuOFYiLAorCQkubWluX3VWCQk9IDI4MDAwMDAsCisJCS5tYXhfdVYJCT0gMjgwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUobWF4ODk5N19idWNrNl8pLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IG1heDg5OTdfYnVjazZfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrN19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZDQ19TVUJfMi4wViIsCisJCS5taW5fdVYJCT0gMjAwMDAwMCwKKwkJLm1heF91VgkJPSAyMDAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5lbmFibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N18zMmtoel9hcF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIjMyS0h6IEFQIiwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZW5hYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShtYXg4OTk3XzMya2h6X2FwXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gbWF4ODk5N18zMmtoel9hcF8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3XzMya2h6X2NwX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiMzJLSHogQ1AiLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N192aWNoZ19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZJQ0hHIiwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfZXNhZmVvdXQxX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiU0FGRU9VVDEiLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2VzYWZlb3V0MV8pLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfZXNhZmVvdXQxXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfZXNhZmVvdXQyX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiU0FGRU9VVDIiLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2VzYWZlb3V0Ml8pLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfZXNhZmVvdXQyXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfY2hhcmdlcl9jdl9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkNIQVJHRVJfQ1YiLAorCQkubWluX3VWCQk9IDQyMDAwMDAsCisJCS5tYXhfdVYJCT0gNDIwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19jaGFyZ2VyX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiQ0hBUkdFUiIsCisJCS5taW5fdUEJCT0gMjAwMDAwLAorCQkubWF4X3VBCQk9IDk1MDAwMCwKKwkJLmJvb3Rfb24JPSAxLAorCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUyB8CisJCQkJUkVHVUxBVE9SX0NIQU5HRV9DVVJSRU5ULAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19jaGFyZ2VyXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19jaGFyZ2VyXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfY2hhcmdlcl90b3BvZmZfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJDSEFSR0VSIFRPUE9GRiIsCisJCS5taW5fdUEJCT0gNTAwMDAsCisJCS5tYXhfdUEJCT0gMjAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX0NVUlJFTlQsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2NoZ190b2ZmXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19jaGdfdG9mZl8sCit9OworCitzdGF0aWMgc3RydWN0IG1heDg5OTdfcmVndWxhdG9yX2RhdGEgX19pbml0ZGF0YSBudXJpX21heDg5OTdfcmVndWxhdG9yc1tdID0geworCXsgTUFYODk5N19MRE8xLCAmbWF4ODk5N19sZG8xX2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMiwgJm1heDg5OTdfbGRvMl9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzMsICZtYXg4OTk3X2xkbzNfZGF0YSB9LAorCXsgTUFYODk5N19MRE80LCAmbWF4ODk5N19sZG80X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPNSwgJm1heDg5OTdfbGRvNV9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzYsICZtYXg4OTk3X2xkbzZfZGF0YSB9LAorCXsgTUFYODk5N19MRE83LCAmbWF4ODk5N19sZG83X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPOCwgJm1heDg5OTdfbGRvOF9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzksICZtYXg4OTk3X2xkbzlfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xMCwgJm1heDg5OTdfbGRvMTBfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xMSwgJm1heDg5OTdfbGRvMTFfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xMiwgJm1heDg5OTdfbGRvMTJfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xMywgJm1heDg5OTdfbGRvMTNfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xNCwgJm1heDg5OTdfbGRvMTRfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xNSwgJm1heDg5OTdfbGRvMTVfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xNiwgJm1heDg5OTdfbGRvMTZfZGF0YSB9LAorCisJeyBNQVg4OTk3X0xETzE4LCAmbWF4ODk5N19sZG8xOF9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzIxLCAmbWF4ODk5N19sZG8yMV9kYXRhIH0sCisKKwl7IE1BWDg5OTdfQlVDSzEsICZtYXg4OTk3X2J1Y2sxX2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzIsICZtYXg4OTk3X2J1Y2syX2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzMsICZtYXg4OTk3X2J1Y2szX2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzQsICZtYXg4OTk3X2J1Y2s0X2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzUsICZtYXg4OTk3X2J1Y2s1X2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzYsICZtYXg4OTk3X2J1Y2s2X2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzcsICZtYXg4OTk3X2J1Y2s3X2RhdGEgfSwKKworCXsgTUFYODk5N19FTjMyS0haX0FQLCAmbWF4ODk5N18zMmtoel9hcF9kYXRhIH0sCisJeyBNQVg4OTk3X0VOMzJLSFpfQ1AsICZtYXg4OTk3XzMya2h6X2NwX2RhdGEgfSwKKworCXsgTUFYODk5N19FTlZJQ0hHLCAmbWF4ODk5N192aWNoZ19kYXRhIH0sCisJeyBNQVg4OTk3X0VTQUZFT1VUMSwgJm1heDg5OTdfZXNhZmVvdXQxX2RhdGEgfSwKKwl7IE1BWDg5OTdfRVNBRkVPVVQyLCAmbWF4ODk5N19lc2FmZW91dDJfZGF0YSB9LAorCXsgTUFYODk5N19DSEFSR0VSX0NWLCAmbWF4ODk5N19jaGFyZ2VyX2N2X2RhdGEgfSwKKwl7IE1BWDg5OTdfQ0hBUkdFUiwgJm1heDg5OTdfY2hhcmdlcl9kYXRhIH0sCisJeyBNQVg4OTk3X0NIQVJHRVJfVE9QT0ZGLCAmbWF4ODk5N19jaGFyZ2VyX3RvcG9mZl9kYXRhIH0sCit9OworCitzdGF0aWMgc3RydWN0IG1heDg5OTdfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIG51cmlfbWF4ODk5N19wZGF0YSA9IHsKKwkud2FrZXVwCQkJPSAxLAorCisJLm51bV9yZWd1bGF0b3JzCQk9IEFSUkFZX1NJWkUobnVyaV9tYXg4OTk3X3JlZ3VsYXRvcnMpLAorCS5yZWd1bGF0b3JzCQk9IG51cmlfbWF4ODk5N19yZWd1bGF0b3JzLAorCisJLmJ1Y2sxMjVfZ3Bpb3MgPSB7IEVYWU5PUzRfR1BYMCg1KSwgRVhZTk9TNF9HUFgwKDYpLCBFWFlOT1M0X0dQTDAoMCkgfSwKKwkuYnVjazJfZ3Bpb2R2cyA9IHRydWUsCisKKwkuYnVjazFfdm9sdGFnZVswXSA9IDEzNTAwMDAsIC8qIDEuMzVWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbMV0gPSAxMzAwMDAwLCAvKiAxLjNWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbMl0gPSAxMjUwMDAwLCAvKiAxLjI1ViAqLworCS5idWNrMV92b2x0YWdlWzNdID0gMTIwMDAwMCwgLyogMS4yViAqLworCS5idWNrMV92b2x0YWdlWzRdID0gMTE1MDAwMCwgLyogMS4xNVYgKi8KKwkuYnVjazFfdm9sdGFnZVs1XSA9IDExMDAwMDAsIC8qIDEuMVYgKi8KKwkuYnVjazFfdm9sdGFnZVs2XSA9IDEwMDAwMDAsIC8qIDEuMFYgKi8KKwkuYnVjazFfdm9sdGFnZVs3XSA9IDk1MDAwMCwgLyogMC45NVYgKi8KKworCS5idWNrMl92b2x0YWdlWzBdID0gMTEwMDAwMCwgLyogMS4xViAqLworCS5idWNrMl92b2x0YWdlWzFdID0gMTAwMDAwMCwgLyogMS4wViAqLworCS5idWNrMl92b2x0YWdlWzJdID0gOTUwMDAwLCAvKiAwLjk1ViAqLworCS5idWNrMl92b2x0YWdlWzNdID0gOTAwMDAwLCAvKiAwLjlWICovCisJLmJ1Y2syX3ZvbHRhZ2VbNF0gPSAxMTAwMDAwLCAvKiAxLjFWICovCisJLmJ1Y2syX3ZvbHRhZ2VbNV0gPSAxMDAwMDAwLCAvKiAxLjBWICovCisJLmJ1Y2syX3ZvbHRhZ2VbNl0gPSA5NTAwMDAsIC8qIDAuOTVWICovCisJLmJ1Y2syX3ZvbHRhZ2VbN10gPSA5MDAwMDAsIC8qIDAuOVYgKi8KKworCS5idWNrNV92b2x0YWdlWzBdID0gMTIwMDAwMCwgLyogMS4yViAqLworCS5idWNrNV92b2x0YWdlWzFdID0gMTIwMDAwMCwgLyogMS4yViAqLworCS5idWNrNV92b2x0YWdlWzJdID0gMTIwMDAwMCwgLyogMS4yViAqLworCS5idWNrNV92b2x0YWdlWzNdID0gMTIwMDAwMCwgLyogMS4yViAqLworCS5idWNrNV92b2x0YWdlWzRdID0gMTIwMDAwMCwgLyogMS4yViAqLworCS5idWNrNV92b2x0YWdlWzVdID0gMTIwMDAwMCwgLyogMS4yViAqLworCS5idWNrNV92b2x0YWdlWzZdID0gMTIwMDAwMCwgLyogMS4yViAqLworCS5idWNrNV92b2x0YWdlWzddID0gMTIwMDAwMCwgLyogMS4yViAqLworfTsKKworLyogR1BJTyBJMkMgNSAoUE1JQykgKi8KK2VudW0geyBJMkM1X01BWDg5OTcgfTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjNV9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwlbSTJDNV9NQVg4OTk3XSA9IHsKKwkJSTJDX0JPQVJEX0lORk8oIm1heDg5OTciLCAweENDID4+IDEpLAorCQkucGxhdGZvcm1fZGF0YQk9ICZudXJpX21heDg5OTdfcGRhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF4MTcwNDJfcGxhdGZvcm1fZGF0YSBudXJpX2JhdHRlcnlfcGxhdGZvcm1fZGF0YSA9IHsKK307CisKKy8qIEdQSU8gSTJDIDkgKEZ1ZWwgR2F1Z2UpICovCitzdGF0aWMgc3RydWN0IGkyY19ncGlvX3BsYXRmb3JtX2RhdGEgaTJjOV9ncGlvX2RhdGEgPSB7CisJLnNkYV9waW4JCT0gRVhZTk9TNF9HUFk0KDApLCAgICAgIC8qIFhNMEFERFJfOCAqLworCS5zY2xfcGluCQk9IEVYWU5PUzRfR1BZNCgxKSwgICAgICAvKiBYTTBBRERSXzkgKi8KK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmM5X2dwaW8gPSB7CisJLm5hbWUJCQk9ICJpMmMtZ3BpbyIsCisJLmlkCQkJPSA5LAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmaTJjOV9ncGlvX2RhdGEsCisJfSwKK307CitlbnVtIHsgSTJDOV9NQVgxNzA0Mn07CitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyYzlfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJW0kyQzlfTUFYMTcwNDJdID0geworCQlJMkNfQk9BUkRfSU5GTygibWF4MTcwNDIiLCAweDM2KSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmbnVyaV9iYXR0ZXJ5X3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKKy8qIE1BWDg5MDMgU2Vjb25kYXJ5IENoYXJnZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBzdXBwbGllc19tYXg4OTAzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmluY2hnMiIsICJjaGFyZ2VyLW1hbmFnZXIuMCIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG1heDg5MDNfY2hhcmdlcl9lbl9kYXRhID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm5hbWUJCT0gIlZPVVRfQ0hBUkdFUiIsCisJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYm9vdF9vbgk9IDEsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShzdXBwbGllc19tYXg4OTAzKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBzdXBwbGllc19tYXg4OTAzLAorfTsKKworc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyBtYXg4OTAzX2NoYXJnZXJfZW4gPSB7CisJLnN1cHBseV9uYW1lID0gIlZPVVRfQ0hBUkdFUiIsCisJLm1pY3Jvdm9sdHMgPSA1MDAwMDAwLCAvKiBBc3N1bWUgNVZEQyAqLworCS5ncGlvID0gRVhZTk9TNF9HUFk0KDUpLCAvKiBUQV9FTiBuZWdhZ2VkICovCisJLmVuYWJsZV9oaWdoID0gMCwgLyogRW5hYmxlID0gTG93ICovCisJLmVuYWJsZWRfYXRfYm9vdCA9IDEsCisJLmluaXRfZGF0YSA9ICZtYXg4OTAzX2NoYXJnZXJfZW5fZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1heDg5MDNfZml4ZWRfcmVnX2RldiA9IHsKKwkubmFtZSA9ICJyZWctZml4ZWQtdm9sdGFnZSIsCisJLmlkID0gRklYRURfUkVHX0lEX01BWDg5MDMsCisJLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEJPSAmbWF4ODkwM19jaGFyZ2VyX2VuIH0sCit9OworCitzdGF0aWMgc3RydWN0IG1heDg5MDNfcGRhdGEgbnVyaV9tYXg4OTAzID0geworCS8qCisJICogY2VuOiBkb24ndCBjb250cm9sIHdpdGggdGhlIGRyaXZlciwgbGV0IGl0IGJlCisJICogY29udHJvbGxlZCBieSByZWd1bGF0b3IgYWJvdmUKKwkgKi8KKwkuZG9rID0gRVhZTk9TNF9HUFgxKDQpLCAvKiBUQV9uQ09OTkVDVEVEICovCisJLyogdW9rLCB1c3VzOiBub3QgY29ubmVjdGVkICovCisJLmNoZyA9IEVYWU5PUzRfR1BFMigwKSwgLyogVEFfbkNIRyAqLworCS8qIGZsdDogdmNjXzEuOFZfcGRhICovCisJLmRjbSA9IEVYWU5PUzRfR1BMMCgxKSwgLyogQ1VSUl9BREogKi8KKworCS5kY192YWxpZCA9IHRydWUsCisJLnVzYl92YWxpZCA9IGZhbHNlLCAvKiBVU0IgaXMgbm90IHdpcmVkIHRvIE1BWDg5MDMgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG51cmlfbWF4ODkwM19kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJtYXg4OTAzLWNoYXJnZXIiLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbnVyaV9tYXg4OTAzLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbnVyaV9wb3dlcl9pbml0KHZvaWQpCit7CisJaW50IGdwaW87CisJaW50IGlycV9iYXNlID0gSVJRX0dQSU9fRU5EICsgMTsKKwlpbnQgdGFfZW4gPSAwOworCisJbnVyaV9tYXg4OTk3X3BkYXRhLmlycV9iYXNlID0gaXJxX2Jhc2U7CisJaXJxX2Jhc2UgKz0gTUFYODk5N19JUlFfTlI7CisKKwlncGlvID0gRVhZTk9TNF9HUFgwKDcpOworCWdwaW9fcmVxdWVzdChncGlvLCAiQVBfUE1JQ19JUlEiKTsKKwlzM2NfZ3Bpb19jZmdwaW4oZ3BpbywgUzNDX0dQSU9fU0ZOKDB4ZikpOworCXMzY19ncGlvX3NldHB1bGwoZ3BpbywgUzNDX0dQSU9fUFVMTF9OT05FKTsKKworCWdwaW8gPSBFWFlOT1M0X0dQWDIoMyk7CisJZ3Bpb19yZXF1ZXN0KGdwaW8sICJGVUVMX0FMRVJUIik7CisJczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigweGYpKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKGdwaW8sIFMzQ19HUElPX1BVTExfTk9ORSk7CisKKwlncGlvID0gbnVyaV9tYXg4OTAzLmRvazsKKwlncGlvX3JlcXVlc3QoZ3BpbywgIlRBX25DT05ORUNURUQiKTsKKwlzM2NfZ3Bpb19jZmdwaW4oZ3BpbywgUzNDX0dQSU9fU0ZOKDB4ZikpOworCXMzY19ncGlvX3NldHB1bGwoZ3BpbywgUzNDX0dQSU9fUFVMTF9OT05FKTsKKwl0YV9lbiA9IGdwaW9fZ2V0X3ZhbHVlKGdwaW8pID8gMCA6IDE7CisKKwlncGlvID0gbnVyaV9tYXg4OTAzLmNoZzsKKwlncGlvX3JlcXVlc3QoZ3BpbywgIlRBX25DSEciKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKKworCWdwaW8gPSBudXJpX21heDg5MDMuZGNtOworCWdwaW9fcmVxdWVzdChncGlvLCAiQ1VSUl9BREoiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgdGFfZW4pOworfQorCisvKiBVU0IgRUhDSSAqLworc3RhdGljIHN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSBudXJpX2VoY2lfcGRhdGE7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBudXJpX2VoY2lfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSAqcGRhdGEgPSAmbnVyaV9laGNpX3BkYXRhOworCisJczVwX2VoY2lfc2V0X3BsYXRkYXRhKHBkYXRhKTsKK30KKworLyogQ0FNRVJBICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY2FtX3ZkZGFfc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiYV9zZW5zb3IiLCAiMC0wMDFmIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgY2FtX3ZkZGFfcmVnX2luaXRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7IC52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTIH0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoY2FtX3ZkZGFfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBjYW1fdmRkYV9zdXBwbHksCit9OworCitzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIGNhbV92ZGRhX2ZpeGVkX3ZvbHRhZ2VfY2ZnID0geworCS5zdXBwbHlfbmFtZQk9ICJDQU1fSU9fRU4iLAorCS5taWNyb3ZvbHRzCT0gMjgwMDAwMCwKKwkuZ3BpbwkJPSBFWFlOT1M0X0dQRTIoMSksIC8qIENBTV9JT19FTiAqLworCS5lbmFibGVfaGlnaAk9IDEsCisJLmluaXRfZGF0YQk9ICZjYW1fdmRkYV9yZWdfaW5pdF9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2FtX3ZkZGFfZml4ZWRfcmRldiA9IHsKKwkubmFtZSA9ICJyZWctZml4ZWQtdm9sdGFnZSIsIC5pZCA9IEZJWEVEX1JFR19JRF9DQU1fQTI4ViwKKwkuZGV2ID0geyAucGxhdGZvcm1fZGF0YQk9ICZjYW1fdmRkYV9maXhlZF92b2x0YWdlX2NmZyB9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGNhbWVyYV84bV8xMnZfc3VwcGx5ID0KKwlSRUdVTEFUT1JfU1VQUExZKCJkaWdfMTIiLCAiMC0wMDFmIik7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBjYW1fOG1fMTJ2X3JlZ19pbml0X2RhdGEgPSB7CisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmNhbWVyYV84bV8xMnZfc3VwcGx5LAorCS5jb25zdHJhaW50cyA9IHsKKwkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyBjYW1fOG1fMTJ2X2ZpeGVkX3ZvbHRhZ2VfY2ZnID0geworCS5zdXBwbHlfbmFtZQk9ICI4TV8xLjJWIiwKKwkubWljcm92b2x0cwk9IDEyMDAwMDAsCisJLmdwaW8JCT0gRVhZTk9TNF9HUEUyKDUpLCAvKiA4TV8xLjJWX0VOICovCisJLmVuYWJsZV9oaWdoCT0gMSwKKwkuaW5pdF9kYXRhCT0gJmNhbV84bV8xMnZfcmVnX2luaXRfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNhbV84bV8xMnZfZml4ZWRfcmRldiA9IHsKKwkubmFtZSA9ICJyZWctZml4ZWQtdm9sdGFnZSIsIC5pZCA9IEZJWEVEX1JFR19JRF9DQU1fMTJWLAorCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJmNhbV84bV8xMnZfZml4ZWRfdm9sdGFnZV9jZmcgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczVwX3BsYXRmb3JtX21pcGlfY3NpcyBtaXBpX2NzaXNfcGxhdGRhdGEgPSB7CisJLmNsa19yYXRlCT0gMTY2MDAwMDAwVUwsCisJLmxhbmVzCQk9IDIsCisJLmFsaWdubWVudAk9IDMyLAorCS5oc19zZXR0bGUJPSAxMiwKKwkucGh5X2VuYWJsZQk9IHM1cF9jc2lzX3BoeV9lbmFibGUsCit9OworCisjZGVmaW5lIEdQSU9fQ0FNX01FR0FfUlNUCUVYWU5PUzRfR1BZMyg3KSAvKiBJU1BfUkVTRVQgKi8KKyNkZWZpbmUgR1BJT19DQU1fOE1fSVNQX0lOVAlFWFlOT1M0X0dQTDIoNSkKKworc3RhdGljIHN0cnVjdCBtNW1vbHNfcGxhdGZvcm1fZGF0YSBtNW1vbHNfcGxhdGRhdGEgPSB7CisJLmdwaW9fcmVzZXQgPSBHUElPX0NBTV9NRUdBX1JTVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbTVtb2xzX2JvYXJkX2luZm8gPSB7CisJSTJDX0JPQVJEX0lORk8oIk01TU9MUyIsIDB4MUYpLAorCS5wbGF0Zm9ybV9kYXRhCT0gJm01bW9sc19wbGF0ZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczVwX2ZpbWNfaXNwX2luZm8gbnVyaV9jYW1lcmFfc2Vuc29yc1tdID0geworCXsKKwkJLmZsYWdzCQk9IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKKwkJCQkgIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XLAorCQkuYnVzX3R5cGUJPSBGSU1DX01JUElfQ1NJMiwKKwkJLmJvYXJkX2luZm8JPSAmbTVtb2xzX2JvYXJkX2luZm8sCisJCS5jbGtfZnJlcXVlbmN5CT0gMjQwMDAwMDBVTCwKKwkJLmNzaV9kYXRhX2FsaWduCT0gMzIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczVwX3BsYXRmb3JtX2ZpbWMgZmltY19tZF9wbGF0ZGF0YSA9IHsKKwkuaXNwX2luZm8JPSBudXJpX2NhbWVyYV9zZW5zb3JzLAorCS5udW1fY2xpZW50cwk9IEFSUkFZX1NJWkUobnVyaV9jYW1lcmFfc2Vuc29ycyksCit9OworCitzdGF0aWMgc3RydWN0IGdwaW8gbnVyaV9jYW1lcmFfZ3Bpb3NbXSA9IHsKKwl7IEdQSU9fQ0FNXzhNX0lTUF9JTlQsCUdQSU9GX0lOLCAgICAgICAgICAgIjhNX0lTUF9JTlQiICB9LAorCXsgR1BJT19DQU1fTUVHQV9SU1QsCUdQSU9GX09VVF9JTklUX0xPVywgIkNBTV84TV9OUlNUIiB9LAorfTsKKworc3RhdGljIHZvaWQgbnVyaV9jYW1lcmFfaW5pdCh2b2lkKQoreworCXMzY19zZXRfcGxhdGRhdGEoJm1pcGlfY3Npc19wbGF0ZGF0YSwgc2l6ZW9mKG1pcGlfY3Npc19wbGF0ZGF0YSksCisJCQkgJnM1cF9kZXZpY2VfbWlwaV9jc2lzMCk7CisJczNjX3NldF9wbGF0ZGF0YSgmZmltY19tZF9wbGF0ZGF0YSwgIHNpemVvZihmaW1jX21kX3BsYXRkYXRhKSwKKwkJCSAmczVwX2RldmljZV9maW1jX21kKTsKKworCWlmIChncGlvX3JlcXVlc3RfYXJyYXkobnVyaV9jYW1lcmFfZ3Bpb3MsCisJCQkgICAgICAgQVJSQVlfU0laRShudXJpX2NhbWVyYV9ncGlvcykpKSB7CisJCXByX2VycigiJXM6IEdQSU8gcmVxdWVzdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCW01bW9sc19ib2FyZF9pbmZvLmlycSA9IHM1cF9yZWdpc3Rlcl9ncGlvX2ludGVycnVwdChHUElPX0NBTV84TV9JU1BfSU5UKTsKKwlpZiAoIUlTX0VSUl9WQUxVRShtNW1vbHNfYm9hcmRfaW5mby5pcnEpKQorCQlzM2NfZ3Bpb19jZmdwaW4oR1BJT19DQU1fOE1fSVNQX0lOVCwgUzNDX0dQSU9fU0ZOKDB4RikpOworCWVsc2UKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGNvbmZpZ3VyZSA4TV9JU1BfSU5UIEdQSU9cbiIsIF9fZnVuY19fKTsKKworCS8qIEZyZWUgR1BJT3MgY29udHJvbGxlZCBkaXJlY3RseSBieSB0aGUgc2Vuc29yIGRyaXZlcnMuICovCisJZ3Bpb19mcmVlKEdQSU9fQ0FNX01FR0FfUlNUKTsKKworCWlmIChleHlub3M0X2ZpbWNfc2V0dXBfZ3BpbyhTNVBfQ0FNUE9SVF9BKSkgeworCQlwcl9lcnIoIiVzOiBDYW1lcmEgcG9ydCBBIHNldHVwIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCS8qIEluY3JlYXNlIGRyaXZlIHN0cmVuZ3RoIG9mIHRoZSBzZW5zb3IgY2xvY2sgb3V0cHV0ICovCisJczVwX2dwaW9fc2V0X2RydnN0cihFWFlOT1M0X0dQSjEoMyksIFM1UF9HUElPX0RSVlNUUl9MVjQpOworfQorCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIG51cmlfaTJjMF9wbGF0ZGF0YSBfX2luaXRkYXRhID0geworCS5mcmVxdWVuY3kJPSA0MDAwMDBVLAorCS5zZGFfZGVsYXkJPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbnVyaV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkvKiBTYW1zdW5nIFBsYXRmb3JtIERldmljZXMgKi8KKwkmczNjX2RldmljZV9pMmM1LCAvKiBQTUlDIHNob3VsZCBpbml0aWFsaXplIGZpcnN0ICovCisJJnMzY19kZXZpY2VfaTJjMCwKKwkmZW1tY19maXhlZF92b2x0YWdlLAorCSZzNXBfZGV2aWNlX21pcGlfY3NpczAsCisJJnM1cF9kZXZpY2VfZmltYzAsCisJJnM1cF9kZXZpY2VfZmltYzEsCisJJnM1cF9kZXZpY2VfZmltYzIsCisJJnM1cF9kZXZpY2VfZmltYzMsCisJJnM1cF9kZXZpY2VfZmltZDAsCisJJnMzY19kZXZpY2VfaHNtbWMwLAorCSZzM2NfZGV2aWNlX2hzbW1jMiwKKwkmczNjX2RldmljZV9oc21tYzMsCisJJnMzY19kZXZpY2Vfd2R0LAorCSZzM2NfZGV2aWNlX3RpbWVyWzBdLAorCSZzNXBfZGV2aWNlX2VoY2ksCisJJnMzY19kZXZpY2VfaTJjMywKKwkmaTJjOV9ncGlvLAorCSZzM2NfZGV2aWNlX2FkYywKKwkmczNjX2RldmljZV9ydGMsCisJJnM1cF9kZXZpY2VfbWZjLAorCSZzNXBfZGV2aWNlX21mY19sLAorCSZzNXBfZGV2aWNlX21mY19yLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9NRkNdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9MQ0QwXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXSwKKwkmczVwX2RldmljZV9maW1jX21kLAorCisJLyogTlVSSSBEZXZpY2VzICovCisJJm51cmlfZ3Bpb19rZXlzLAorCSZudXJpX2xjZF9kZXZpY2UsCisJJm51cmlfYmFja2xpZ2h0X2RldmljZSwKKwkmbWF4ODkwM19maXhlZF9yZWdfZGV2LAorCSZudXJpX21heDg5MDNfZGV2aWNlLAorCSZjYW1fdmRkYV9maXhlZF9yZGV2LAorCSZjYW1fOG1fMTJ2X2ZpeGVkX3JkZXYsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbnVyaV9tYXBfaW8odm9pZCkKK3sKKwlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKDI0MDAwMDAwKTsKKwlzM2MyNHh4X2luaXRfdWFydHMobnVyaV91YXJ0Y2ZncywgQVJSQVlfU0laRShudXJpX3VhcnRjZmdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBudXJpX3Jlc2VydmUodm9pZCkKK3sKKwlzNXBfbWZjX3Jlc2VydmVfbWVtKDB4NDMwMDAwMDAsIDggPDwgMjAsIDB4NTEwMDAwMDAsIDggPDwgMjApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbnVyaV9tYWNoaW5lX2luaXQodm9pZCkKK3sKKwludXJpX3NkaGNpX2luaXQoKTsKKwludXJpX3RzcF9pbml0KCk7CisJbnVyaV9wb3dlcl9pbml0KCk7CisKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoJm51cmlfaTJjMF9wbGF0ZGF0YSk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgaTJjMV9kZXZzLCBBUlJBWV9TSVpFKGkyYzFfZGV2cykpOworCXMzY19pMmMzX3NldF9wbGF0ZGF0YSgmaTJjM19kYXRhKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygzLCBpMmMzX2RldnMsIEFSUkFZX1NJWkUoaTJjM19kZXZzKSk7CisJczNjX2kyYzVfc2V0X3BsYXRkYXRhKE5VTEwpOworCWkyYzVfZGV2c1tJMkM1X01BWDg5OTddLmlycSA9IGdwaW9fdG9faXJxKEVYWU5PUzRfR1BYMCg3KSk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oNSwgaTJjNV9kZXZzLCBBUlJBWV9TSVpFKGkyYzVfZGV2cykpOworCWkyYzlfZGV2c1tJMkM5X01BWDE3MDQyXS5pcnEgPSBncGlvX3RvX2lycShFWFlOT1M0X0dQWDIoMykpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDksIGkyYzlfZGV2cywgQVJSQVlfU0laRShpMmM5X2RldnMpKTsKKworCXM1cF9maW1kMF9zZXRfcGxhdGRhdGEoJm51cmlfZmJfcGRhdGEpOworCisJbnVyaV9jYW1lcmFfaW5pdCgpOworCisJbnVyaV9laGNpX2luaXQoKTsKKwljbGtfeHVzYnh0aS5yYXRlID0gMjQwMDAwMDA7CisKKwkvKiBMYXN0ICovCisJcGxhdGZvcm1fYWRkX2RldmljZXMobnVyaV9kZXZpY2VzLCBBUlJBWV9TSVpFKG51cmlfZGV2aWNlcykpOworCXM1cF9kZXZpY2VfbWZjLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXS5kZXY7CisJczVwX2RldmljZV9maW1kMC5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDBdLmRldjsKKworCXM1cF9kZXZpY2VfZmltYzAuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLmRldjsKKwlzNXBfZGV2aWNlX2ZpbWMxLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXS5kZXY7CisJczVwX2RldmljZV9maW1jMi5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0uZGV2OworCXM1cF9kZXZpY2VfZmltYzMuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLmRldjsKKwlzNXBfZGV2aWNlX21pcGlfY3NpczAuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLmRldjsKK30KKworTUFDSElORV9TVEFSVChOVVJJLCAiTlVSSSIpCisJLyogTWFpbnRhaW5lcjogS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4gKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAorCS5tYXBfaW8JCT0gbnVyaV9tYXBfaW8sCisJLmluaXRfbWFjaGluZQk9IG51cmlfbWFjaGluZV9pbml0LAorCS50aW1lcgkJPSAmZXh5bm9zNF90aW1lciwKKwkucmVzZXJ2ZSAgICAgICAgPSAmbnVyaV9yZXNlcnZlLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtb3JpZ2VuLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLW9yaWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MGI1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLW9yaWdlbi5jCkBAIC0wLDAgKzEsNzAwIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1vcmlnZW4uYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBJbnNpZ25hbCBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3Lmluc2lnbmFsLmNvLmtyLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTcuaD4KKyNpbmNsdWRlIDxsaW51eC9sY2QuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8dmlkZW8vcGxhdGZvcm1fbGNkLmg+CisKKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CisjaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KKyNpbmNsdWRlIDxwbGF0L2VoY2kuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8cGxhdC9wZC5oPgorI2luY2x1ZGUgPHBsYXQvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L21mYy5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE9SSUdFTl9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYSUxFVkVMIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fVFhJUlFNT0RFIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhJUlFNT0RFIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhGSUZPX1RPSSB8CVwKKwkJCQkgUzNDMjQ0M19VQ09OX1JYRVJSX0lSUUVOKQorCisjZGVmaW5lIE9SSUdFTl9VTENPTl9ERUZBVUxUCVMzQzI0MTBfTENPTl9DUzgKKworI2RlZmluZSBPUklHRU5fVUZDT05fREVGQVVMVAkoUzNDMjQxMF9VRkNPTl9GSUZPTU9ERSB8CVwKKwkJCQkgUzVQVjIxMF9VRkNPTl9UWFRSSUc0IHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1JYVFJJRzQpCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIG9yaWdlbl91YXJ0Y2Znc1tdIF9faW5pdGRhdGEgPSB7CisJWzBdID0geworCQkuaHdwb3J0CQk9IDAsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBPUklHRU5fVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gT1JJR0VOX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBPUklHRU5fVUZDT05fREVGQVVMVCwKKwl9LAorCVsxXSA9IHsKKwkJLmh3cG9ydAkJPSAxLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gT1JJR0VOX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IE9SSUdFTl9VTENPTl9ERUZBVUxULAorCQkudWZjb24JCT0gT1JJR0VOX1VGQ09OX0RFRkFVTFQsCisJfSwKKwlbMl0gPSB7CisJCS5od3BvcnQJCT0gMiwKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IE9SSUdFTl9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBPUklHRU5fVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IE9SSUdFTl9VRkNPTl9ERUZBVUxULAorCX0sCisJWzNdID0geworCQkuaHdwb3J0CQk9IDMsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBPUklHRU5fVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gT1JJR0VOX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBPUklHRU5fVUZDT05fREVGQVVMVCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbGRvM19jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZDExIiwgInM1cC1taXBpLWNzaXMuMCIpLCAvKiBNSVBJICovCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkIiwgImV4eW5vczQtaGRtaSIpLCAvKiBIRE1JICovCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX3BsbCIsICJleHlub3M0LWhkbWkiKSwgLyogSERNSSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIGxkbzZfY29uc3VtZXJbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQxOCIsICJzNXAtbWlwaS1jc2lzLjAiKSwgLyogTUlQSSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIGxkbzdfY29uc3VtZXJbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJhdmRkIiwgImFsYzU2MjUiKSwgLyogUmVhbHRlayBBTEM1NjI1ICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbGRvOF9jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZCIsICJzNXAtYWRjIiksIC8qIEFEQyAqLworCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9vc2MiLCAiZXh5bm9zNC1oZG1pIiksIC8qIEhETUkgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBsZG85X2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiZHZkZCIsICJzd2ItYTMxIiksIC8qIEFSNjAwMyBXTEFOICYgQ1NSIDg4MTAgQlQgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBsZG8xMV9jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImR2ZGQiLCAiYWxjNTYyNSIpLCAvKiBSZWFsdGVrIEFMQzU2MjUgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBsZG8xNF9jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImF2ZGQxOCIsICJzd2ItYTMxIiksIC8qIEFSNjAwMyBXTEFOICYgQ1NSIDg4MTAgQlQgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBsZG8xN19jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZDMzIiwgInN3Yi1hMzEiKSwgLyogQVI2MDAzIFdMQU4gJiBDU1IgODgxMCBCVCAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIGJ1Y2sxX2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX2FybSIsIE5VTEwpLCAvKiBDUFVGUkVRICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgYnVjazJfY29uc3VtZXJbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfaW50IiwgTlVMTCksIC8qIENQVUZSRVEgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBidWNrM19jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9nM2QiLCAibWFsaV9kcm0iKSwgLyogRzNEICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgYnVjazdfY29uc3VtZXJbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2Y2MiLCAicGxhdGZvcm0tbGNkIiksIC8qIExDRCAqLworfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX0FCQl8zLjNWIiwKKwkJLm1pbl91VgkJPSAzMzAwMDAwLAorCQkubWF4X3VWCQk9IDMzMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzJfZGF0YQk9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfQUxJVkVfMS4xViIsCisJCS5taW5fdVYJCT0gMTEwMDAwMCwKKwkJLm1heF91VgkJPSAxMTAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5lbmFibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8zX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVk1JUElfMS4xViIsCisJCS5taW5fdVYJCT0gMTEwMDAwMCwKKwkJLm1heF91VgkJPSAxMTAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShsZG8zX2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBsZG8zX2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG80X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX1JUQ18xLjhWIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG82X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVk1JUElfMS44ViIsCisJCS5taW5fdVYJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJPSAxODAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShsZG82X2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBsZG82X2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG83X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX0FVRF8xLjhWIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGxkbzdfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGxkbzdfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzhfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWQURDXzMuM1YiLAorCQkubWluX3VWCQk9IDMzMDAwMDAsCisJCS5tYXhfdVYJCT0gMzMwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobGRvOF9jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbGRvOF9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvOV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkRWRERfU1dCXzIuOFYiLAorCQkubWluX3VWCQk9IDI4MDAwMDAsCisJCS5tYXhfdVYJCT0gMjgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobGRvOV9jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbGRvOV9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTBfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfUExMXzEuMVYiLAorCQkubWluX3VWCQk9IDExMDAwMDAsCisJCS5tYXhfdVYJCT0gMTEwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzExX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX0FVRF8zViIsCisJCS5taW5fdVYJCT0gMzAwMDAwMCwKKwkJLm1heF91VgkJPSAzMDAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShsZG8xMV9jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbGRvMTFfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE0X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiQVZERDE4X1NXQl8xLjhWIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGxkbzE0X2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBsZG8xNF9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTdfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfU1dCXzMuM1YiLAorCQkubWluX3VWCQk9IDMzMDAwMDAsCisJCS5tYXhfdVYJCT0gMzMwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobGRvMTdfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGxkbzE3X2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8yMV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERF9NSUZfMS4yViIsCisJCS5taW5fdVYJCT0gMTIwMDAwMCwKKwkJLm1heF91VgkJPSAxMjAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazFfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfQVJNXzEuMlYiLAorCQkubWluX3VWCQk9IDk1MDAwMCwKKwkJLm1heF91VgkJPSAxMzUwMDAwLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLmJvb3Rfb24JPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUoYnVjazFfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGJ1Y2sxX2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrMl9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERF9JTlRfMS4xViIsCisJCS5taW5fdVYJCT0gOTAwMDAwLAorCQkubWF4X3VWCQk9IDExMDAwMDAsCisJCS5hbHdheXNfb24JPSAxLAorCQkuYm9vdF9vbgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShidWNrMl9jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gYnVjazJfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2szX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX0czRF8xLjFWIiwKKwkJLm1pbl91VgkJPSA5MDAwMDAsCisJCS5tYXhfdVYJCT0gMTEwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCQkJUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUoYnVjazNfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGJ1Y2szX2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrNV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERFFfTTFNMl8xLjJWIiwKKwkJLm1pbl91VgkJPSAxMjAwMDAwLAorCQkubWF4X3VWCQk9IDEyMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrN19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERF9MQ0RfMy4zViIsCisJCS5taW5fdVYJCT0gMzMwMDAwMCwKKwkJLm1heF91VgkJPSAzMzAwMDAwLAorCQkuYm9vdF9vbgk9IDEsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMQorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUoYnVjazdfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGJ1Y2s3X2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXg4OTk3X3JlZ3VsYXRvcl9kYXRhIF9faW5pdGRhdGEgb3JpZ2VuX21heDg5OTdfcmVndWxhdG9yc1tdID0geworCXsgTUFYODk5N19MRE8xLAkJJm1heDg5OTdfbGRvMV9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzIsCQkmbWF4ODk5N19sZG8yX2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMywJCSZtYXg4OTk3X2xkbzNfZGF0YSB9LAorCXsgTUFYODk5N19MRE80LAkJJm1heDg5OTdfbGRvNF9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzYsCQkmbWF4ODk5N19sZG82X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPNywJCSZtYXg4OTk3X2xkbzdfZGF0YSB9LAorCXsgTUFYODk5N19MRE84LAkJJm1heDg5OTdfbGRvOF9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzksCQkmbWF4ODk5N19sZG85X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMTAsCSZtYXg4OTk3X2xkbzEwX2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMTEsCSZtYXg4OTk3X2xkbzExX2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMTQsCSZtYXg4OTk3X2xkbzE0X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMTcsCSZtYXg4OTk3X2xkbzE3X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMjEsCSZtYXg4OTk3X2xkbzIxX2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzEsCSZtYXg4OTk3X2J1Y2sxX2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzIsCSZtYXg4OTk3X2J1Y2syX2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzMsCSZtYXg4OTk3X2J1Y2szX2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzUsCSZtYXg4OTk3X2J1Y2s1X2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzcsCSZtYXg4OTk3X2J1Y2s3X2RhdGEgfSwKK307CisKK3N0cnVjdCBtYXg4OTk3X3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBvcmlnZW5fbWF4ODk5N19wZGF0YSA9IHsKKwkubnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKG9yaWdlbl9tYXg4OTk3X3JlZ3VsYXRvcnMpLAorCS5yZWd1bGF0b3JzCT0gb3JpZ2VuX21heDg5OTdfcmVndWxhdG9ycywKKworCS53YWtldXAJPSB0cnVlLAorCS5idWNrMV9ncGlvZHZzCT0gZmFsc2UsCisJLmJ1Y2syX2dwaW9kdnMJPSBmYWxzZSwKKwkuYnVjazVfZ3Bpb2R2cwk9IGZhbHNlLAorCS5pcnFfYmFzZQk9IElSUV9HUElPX0VORCArIDEsCisKKwkuaWdub3JlX2dwaW9kdnNfc2lkZV9lZmZlY3QgPSB0cnVlLAorCS5idWNrMTI1X2RlZmF1bHRfaWR4ID0gMHgwLAorCisJLmJ1Y2sxMjVfZ3Bpb3NbMF0JPSBFWFlOT1M0X0dQWDAoMCksCisJLmJ1Y2sxMjVfZ3Bpb3NbMV0JPSBFWFlOT1M0X0dQWDAoMSksCisJLmJ1Y2sxMjVfZ3Bpb3NbMl0JPSBFWFlOT1M0X0dQWDAoMiksCisKKwkuYnVjazFfdm9sdGFnZVswXQk9IDEzNTAwMDAsCisJLmJ1Y2sxX3ZvbHRhZ2VbMV0JPSAxMzAwMDAwLAorCS5idWNrMV92b2x0YWdlWzJdCT0gMTI1MDAwMCwKKwkuYnVjazFfdm9sdGFnZVszXQk9IDEyMDAwMDAsCisJLmJ1Y2sxX3ZvbHRhZ2VbNF0JPSAxMTUwMDAwLAorCS5idWNrMV92b2x0YWdlWzVdCT0gMTEwMDAwMCwKKwkuYnVjazFfdm9sdGFnZVs2XQk9IDEwMDAwMDAsCisJLmJ1Y2sxX3ZvbHRhZ2VbN10JPSA5NTAwMDAsCisKKwkuYnVjazJfdm9sdGFnZVswXQk9IDExMDAwMDAsCisJLmJ1Y2syX3ZvbHRhZ2VbMV0JPSAxMTAwMDAwLAorCS5idWNrMl92b2x0YWdlWzJdCT0gMTEwMDAwMCwKKwkuYnVjazJfdm9sdGFnZVszXQk9IDExMDAwMDAsCisJLmJ1Y2syX3ZvbHRhZ2VbNF0JPSAxMDAwMDAwLAorCS5idWNrMl92b2x0YWdlWzVdCT0gMTAwMDAwMCwKKwkuYnVjazJfdm9sdGFnZVs2XQk9IDEwMDAwMDAsCisJLmJ1Y2syX3ZvbHRhZ2VbN10JPSAxMDAwMDAwLAorCisJLmJ1Y2s1X3ZvbHRhZ2VbMF0JPSAxMjAwMDAwLAorCS5idWNrNV92b2x0YWdlWzFdCT0gMTIwMDAwMCwKKwkuYnVjazVfdm9sdGFnZVsyXQk9IDEyMDAwMDAsCisJLmJ1Y2s1X3ZvbHRhZ2VbM10JPSAxMjAwMDAwLAorCS5idWNrNV92b2x0YWdlWzRdCT0gMTIwMDAwMCwKKwkuYnVjazVfdm9sdGFnZVs1XQk9IDEyMDAwMDAsCisJLmJ1Y2s1X3ZvbHRhZ2VbNl0JPSAxMjAwMDAwLAorCS5idWNrNV92b2x0YWdlWzddCT0gMTIwMDAwMCwKK307CisKKy8qIEkyQzAgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjMF9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJtYXg4OTk3IiwgKDB4Q0MgPj4gMSkpLAorCQkucGxhdGZvcm1fZGF0YQk9ICZvcmlnZW5fbWF4ODk5N19wZGF0YSwKKwkJLmlycQkJPSBJUlFfRUlOVCg0KSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgb3JpZ2VuX2hzbW1jMF9wZGF0YSBfX2luaXRkYXRhID0geworCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9JTlRFUk5BTCwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCit9OworCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBvcmlnZW5faHNtbWMyX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0lOVEVSTkFMLAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKK307CisKKy8qIFVTQiBFSENJICovCitzdGF0aWMgc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhIG9yaWdlbl9laGNpX3BkYXRhOworCitzdGF0aWMgdm9pZCBfX2luaXQgb3JpZ2VuX2VoY2lfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSAqcGRhdGEgPSAmb3JpZ2VuX2VoY2lfcGRhdGE7CisKKwlzNXBfZWhjaV9zZXRfcGxhdGRhdGEocGRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gb3JpZ2VuX2dwaW9fa2V5c190YWJsZVtdID0geworCXsKKwkJLmNvZGUJCQk9IEtFWV9NRU5VLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgxKDUpLAorCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX01FTlUiLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkud2FrZXVwCQkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sIHsKKwkJLmNvZGUJCQk9IEtFWV9IT01FLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgxKDYpLAorCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX0hPTUUiLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkud2FrZXVwCQkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sIHsKKwkJLmNvZGUJCQk9IEtFWV9CQUNLLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgxKDcpLAorCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX0JBQ0siLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkud2FrZXVwCQkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sIHsKKwkJLmNvZGUJCQk9IEtFWV9VUCwKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigwKSwKKwkJLmRlc2MJCQk9ICJncGlvLWtleXM6IEtFWV9VUCIsCisJCS50eXBlCQkJPSBFVl9LRVksCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS53YWtldXAJCQk9IDEsCisJCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCisJfSwgeworCQkuY29kZQkJCT0gS0VZX0RPV04sCisJCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDIoMSksCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfRE9XTiIsCisJCS50eXBlCQkJPSBFVl9LRVksCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS53YWtldXAJCQk9IDEsCisJCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgb3JpZ2VuX2dwaW9fa2V5c19kYXRhID0geworCS5idXR0b25zCT0gb3JpZ2VuX2dwaW9fa2V5c190YWJsZSwKKwkubmJ1dHRvbnMJPSBBUlJBWV9TSVpFKG9yaWdlbl9ncGlvX2tleXNfdGFibGUpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb3JpZ2VuX2RldmljZV9ncGlva2V5cyA9IHsKKwkubmFtZQkJPSAiZ3Bpby1rZXlzIiwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmb3JpZ2VuX2dwaW9fa2V5c19kYXRhLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBsY2RfaHYwNzB3c2Ffc2V0X3Bvd2VyKHN0cnVjdCBwbGF0X2xjZF9kYXRhICpwZCwgdW5zaWduZWQgaW50IHBvd2VyKQoreworCWludCByZXQ7CisKKwlpZiAocG93ZXIpCisJCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoRVhZTk9TNF9HUEUzKDQpLAorCQkJCQlHUElPRl9PVVRfSU5JVF9ISUdILCAiR1BFM180Iik7CisJZWxzZQorCQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKEVYWU5PUzRfR1BFMyg0KSwKKwkJCQkJR1BJT0ZfT1VUX0lOSVRfTE9XLCAiR1BFM180Iik7CisKKwlncGlvX2ZyZWUoRVhZTk9TNF9HUEUzKDQpKTsKKworCWlmIChyZXQpCisJCXByX2VycigiZmFpbGVkIHRvIHJlcXVlc3QgZ3BpbyBmb3IgTENEIHBvd2VyOiAlZFxuIiwgcmV0KTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0X2xjZF9kYXRhIG9yaWdlbl9sY2RfaHYwNzB3c2FfZGF0YSA9IHsKKwkuc2V0X3Bvd2VyID0gbGNkX2h2MDcwd3NhX3NldF9wb3dlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9yaWdlbl9sY2RfaHYwNzB3c2EgPSB7CisJLm5hbWUJCQk9ICJwbGF0Zm9ybS1sY2QiLAorCS5kZXYucGFyZW50CQk9ICZzNXBfZGV2aWNlX2ZpbWQwLmRldiwKKwkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmb3JpZ2VuX2xjZF9odjA3MHdzYV9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfZmJfcGRfd2luIG9yaWdlbl9mYl93aW4wID0geworCS53aW5fbW9kZSA9IHsKKwkJLmxlZnRfbWFyZ2luCT0gNjQsCisJCS5yaWdodF9tYXJnaW4JPSAxNiwKKwkJLnVwcGVyX21hcmdpbgk9IDY0LAorCQkubG93ZXJfbWFyZ2luCT0gMTYsCisJCS5oc3luY19sZW4JPSA0OCwKKwkJLnZzeW5jX2xlbgk9IDMsCisJCS54cmVzCQk9IDEwMjQsCisJCS55cmVzCQk9IDYwMCwKKwl9LAorCS5tYXhfYnBwCQk9IDMyLAorCS5kZWZhdWx0X2JwcAkJPSAyNCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhIG9yaWdlbl9sY2RfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkud2luWzBdCQk9ICZvcmlnZW5fZmJfd2luMCwKKwkudmlkY29uMAk9IFZJRENPTjBfVklET1VUX1JHQiB8IFZJRENPTjBfUE5STU9ERV9SR0IsCisJLnZpZGNvbjEJPSBWSURDT04xX0lOVl9IU1lOQyB8IFZJRENPTjFfSU5WX1ZTWU5DLAorCS5zZXR1cF9ncGlvCT0gZXh5bm9zNF9maW1kMF9ncGlvX3NldHVwXzI0YnBwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9yaWdlbl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmczNjX2RldmljZV9oc21tYzIsCisJJnMzY19kZXZpY2VfaHNtbWMwLAorCSZzM2NfZGV2aWNlX2kyYzAsCisJJnMzY19kZXZpY2VfcnRjLAorCSZzM2NfZGV2aWNlX3dkdCwKKwkmczVwX2RldmljZV9laGNpLAorCSZzNXBfZGV2aWNlX2ZpbWMwLAorCSZzNXBfZGV2aWNlX2ZpbWMxLAorCSZzNXBfZGV2aWNlX2ZpbWMyLAorCSZzNXBfZGV2aWNlX2ZpbWMzLAorCSZzNXBfZGV2aWNlX2ZpbWQwLAorCSZzNXBfZGV2aWNlX2hkbWksCisJJnM1cF9kZXZpY2VfaTJjX2hkbWlwaHksCisJJnM1cF9kZXZpY2VfbWZjLAorCSZzNXBfZGV2aWNlX21mY19sLAorCSZzNXBfZGV2aWNlX21mY19yLAorCSZzNXBfZGV2aWNlX21peGVyLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9MQ0QwXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9HM0RdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9MQ0QxXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfR1BTXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXSwKKwkmb3JpZ2VuX2RldmljZV9ncGlva2V5cywKKwkmb3JpZ2VuX2xjZF9odjA3MHdzYSwKK307CisKKy8qIExDRCBCYWNrbGlnaHQgZGF0YSAqLworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyBvcmlnZW5fYmxfZ3Bpb19pbmZvID0geworCS5ubwkJPSBFWFlOT1M0X0dQRDAoMCksCisJLmZ1bmMJCT0gUzNDX0dQSU9fU0ZOKDIpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgb3JpZ2VuX2JsX2RhdGEgPSB7CisJLnB3bV9pZAkJPSAwLAorCS5wd21fcGVyaW9kX25zCT0gMTAwMCwKK307CisKK3N0YXRpYyB2b2lkIHM1cF90dl9zZXR1cCh2b2lkKQoreworCS8qIERpcmVjdCBIUEQgdG8gSERNSSBjaGlwICovCisJZ3Bpb19yZXF1ZXN0X29uZShFWFlOT1M0X0dQWDMoNyksIEdQSU9GX0lOLCAiaHBkLXBsdWciKTsKKwlzM2NfZ3Bpb19jZmdwaW4oRVhZTk9TNF9HUFgzKDcpLCBTM0NfR1BJT19TRk4oMHgzKSk7CisJczNjX2dwaW9fc2V0cHVsbChFWFlOT1M0X0dQWDMoNyksIFMzQ19HUElPX1BVTExfTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvcmlnZW5fbWFwX2lvKHZvaWQpCit7CisJczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQX1ZBX0NISVBJRCk7CisJczNjMjR4eF9pbml0X2Nsb2NrcygyNDAwMDAwMCk7CisJczNjMjR4eF9pbml0X3VhcnRzKG9yaWdlbl91YXJ0Y2ZncywgQVJSQVlfU0laRShvcmlnZW5fdWFydGNmZ3MpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG9yaWdlbl9wb3dlcl9pbml0KHZvaWQpCit7CisJZ3Bpb19yZXF1ZXN0KEVYWU5PUzRfR1BYMCg0KSwgIlBNSUNfSVJRIik7CisJczNjX2dwaW9fY2ZncGluKEVYWU5PUzRfR1BYMCg0KSwgUzNDX0dQSU9fU0ZOKDB4ZikpOworCXMzY19ncGlvX3NldHB1bGwoRVhZTk9TNF9HUFgwKDQpLCBTM0NfR1BJT19QVUxMX05PTkUpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb3JpZ2VuX3Jlc2VydmUodm9pZCkKK3sKKwlzNXBfbWZjX3Jlc2VydmVfbWVtKDB4NDMwMDAwMDAsIDggPDwgMjAsIDB4NTEwMDAwMDAsIDggPDwgMjApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb3JpZ2VuX21hY2hpbmVfaW5pdCh2b2lkKQoreworCW9yaWdlbl9wb3dlcl9pbml0KCk7CisKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoTlVMTCk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgaTJjMF9kZXZzLCBBUlJBWV9TSVpFKGkyYzBfZGV2cykpOworCisJLyoKKwkgKiBTaW5jZSBzZGhjaSBpbnN0YW5jZSAyIGNhbiBjb250YWluIGEgYm9vdGFibGUgbWVkaWEsCisJICogc2RoY2kgaW5zdGFuY2UgMCBpcyByZWdpc3RlcmVkIGFmdGVyIGluc3RhbmNlIDIuCisJICovCisJczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJm9yaWdlbl9oc21tYzJfcGRhdGEpOworCXMzY19zZGhjaTBfc2V0X3BsYXRkYXRhKCZvcmlnZW5faHNtbWMwX3BkYXRhKTsKKworCW9yaWdlbl9laGNpX2luaXQoKTsKKwljbGtfeHVzYnh0aS5yYXRlID0gMjQwMDAwMDA7CisKKwlzNXBfdHZfc2V0dXAoKTsKKwlzNXBfaTJjX2hkbWlwaHlfc2V0X3BsYXRkYXRhKE5VTEwpOworCisJczVwX2ZpbWQwX3NldF9wbGF0ZGF0YSgmb3JpZ2VuX2xjZF9wZGF0YSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhvcmlnZW5fZGV2aWNlcywgQVJSQVlfU0laRShvcmlnZW5fZGV2aWNlcykpOworCisJczVwX2RldmljZV9maW1kMC5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDBdLmRldjsKKworCXM1cF9kZXZpY2VfaGRtaS5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX1RWXS5kZXY7CisJczVwX2RldmljZV9taXhlci5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX1RWXS5kZXY7CisKKwlzNXBfZGV2aWNlX21mYy5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX01GQ10uZGV2OworCisJc2Ftc3VuZ19ibF9zZXQoJm9yaWdlbl9ibF9ncGlvX2luZm8sICZvcmlnZW5fYmxfZGF0YSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoT1JJR0VOLCAiT1JJR0VOIikKKwkvKiBNYWludGFpbmVyOiBKZW9uZ0h5ZW9uIEtpbSA8amhraW1AaW5zaWduYWwuY28ua3I+ICovCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLmluaXRfaXJxCT0gZXh5bm9zNF9pbml0X2lycSwKKwkubWFwX2lvCQk9IG9yaWdlbl9tYXBfaW8sCisJLmluaXRfbWFjaGluZQk9IG9yaWdlbl9tYWNoaW5lX2luaXQsCisJLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAorCS5yZXNlcnZlCT0gJm9yaWdlbl9yZXNlcnZlLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtc21kazR4MTIuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtc21kazR4MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2YyZTBlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1zbWRrNHgxMi5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21kazR4MTIuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPHBsYXQvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CisjaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNNREs0WDEyX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9UWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWEZJRk9fVE9JIHwJXAorCQkJCSBTM0MyNDQzX1VDT05fUlhFUlJfSVJRRU4pCisKKyNkZWZpbmUgU01ESzRYMTJfVUxDT05fREVGQVVMVAlTM0MyNDEwX0xDT05fQ1M4CisKKyNkZWZpbmUgU01ESzRYMTJfVUZDT05fREVGQVVMVAkoUzNDMjQxMF9VRkNPTl9GSUZPTU9ERSB8CVwKKwkJCQkgUzVQVjIxMF9VRkNPTl9UWFRSSUc0IHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1JYVFJJRzQpCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIHNtZGs0eDEyX3VhcnRjZmdzW10gX19pbml0ZGF0YSA9IHsKKwlbMF0gPSB7CisJCS5od3BvcnQJCT0gMCwKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IFNNREs0WDEyX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IFNNREs0WDEyX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBTTURLNFgxMl9VRkNPTl9ERUZBVUxULAorCX0sCisJWzFdID0geworCQkuaHdwb3J0CQk9IDEsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBTTURLNFgxMl9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBTTURLNFgxMl9VTENPTl9ERUZBVUxULAorCQkudWZjb24JCT0gU01ESzRYMTJfVUZDT05fREVGQVVMVCwKKwl9LAorCVsyXSA9IHsKKwkJLmh3cG9ydAkJPSAyLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gU01ESzRYMTJfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gU01ESzRYMTJfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFNNREs0WDEyX1VGQ09OX0RFRkFVTFQsCisJfSwKKwlbM10gPSB7CisJCS5od3BvcnQJCT0gMywKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IFNNREs0WDEyX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IFNNREs0WDEyX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBTTURLNFgxMl9VRkNPTl9ERUZBVUxULAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrNHgxMl9oc21tYzJfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfSU5URVJOQUwsCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorI2lmZGVmIENPTkZJR19FWFlOT1M0X1NESENJX0NIMl84QklUCisJLm1heF93aWR0aAkJPSA4LAorCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF84X0JJVF9EQVRBLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrNHgxMl9oc21tYzNfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfSU5URVJOQUwsCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG1heDg5OTdfYnVjazEgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9hcm0iLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG1heDg5OTdfYnVjazIgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9pbnQiLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG1heDg5OTdfYnVjazMgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9nM2QiLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG1heDg5OTdfYnVjazFfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfQVJNX1NNREs0WDEyIiwKKwkJLm1pbl91VgkJPSA5MjUwMDAsCisJCS5tYXhfdVYJCT0gMTM1MDAwMCwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmbWF4ODk5N19idWNrMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBtYXg4OTk3X2J1Y2syX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX0lOVF9TTURLNFgxMiIsCisJCS5taW5fdVYJCT0gOTUwMDAwLAorCQkubWF4X3VWCQk9IDExNTAwMDAsCisJCS5hbHdheXNfb24JPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJm1heDg5OTdfYnVjazIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbWF4ODk5N19idWNrM19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERF9HM0RfU01ESzRYMTIiLAorCQkubWluX3VWCQk9IDk1MDAwMCwKKwkJLm1heF91VgkJPSAxMTUwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAorCQkJCSAgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJm1heDg5OTdfYnVjazMsCit9OworCitzdGF0aWMgc3RydWN0IG1heDg5OTdfcmVndWxhdG9yX2RhdGEgc21kazR4MTJfbWF4ODk5N19yZWd1bGF0b3JzW10gPSB7CisJeyBNQVg4OTk3X0JVQ0sxLCAmbWF4ODk5N19idWNrMV9kYXRhIH0sCisJeyBNQVg4OTk3X0JVQ0syLCAmbWF4ODk5N19idWNrMl9kYXRhIH0sCisJeyBNQVg4OTk3X0JVQ0szLCAmbWF4ODk5N19idWNrM19kYXRhIH0sCit9OworCitzdGF0aWMgc3RydWN0IG1heDg5OTdfcGxhdGZvcm1fZGF0YSBzbWRrNHgxMl9tYXg4OTk3X3BkYXRhID0geworCS5udW1fcmVndWxhdG9ycwk9IEFSUkFZX1NJWkUoc21kazR4MTJfbWF4ODk5N19yZWd1bGF0b3JzKSwKKwkucmVndWxhdG9ycwk9IHNtZGs0eDEyX21heDg5OTdfcmVndWxhdG9ycywKKworCS5idWNrMV92b2x0YWdlWzBdID0gMTEwMDAwMCwJLyogMS4xViAqLworCS5idWNrMV92b2x0YWdlWzFdID0gMTEwMDAwMCwJLyogMS4xViAqLworCS5idWNrMV92b2x0YWdlWzJdID0gMTEwMDAwMCwJLyogMS4xViAqLworCS5idWNrMV92b2x0YWdlWzNdID0gMTEwMDAwMCwJLyogMS4xViAqLworCS5idWNrMV92b2x0YWdlWzRdID0gMTEwMDAwMCwJLyogMS4xViAqLworCS5idWNrMV92b2x0YWdlWzVdID0gMTEwMDAwMCwJLyogMS4xViAqLworCS5idWNrMV92b2x0YWdlWzZdID0gMTAwMDAwMCwJLyogMS4wViAqLworCS5idWNrMV92b2x0YWdlWzddID0gOTUwMDAwLAkvKiAwLjk1ViAqLworCisJLmJ1Y2syX3ZvbHRhZ2VbMF0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2syX3ZvbHRhZ2VbMV0gPSAxMDAwMDAwLAkvKiAxLjBWICovCisJLmJ1Y2syX3ZvbHRhZ2VbMl0gPSA5NTAwMDAsCS8qIDAuOTVWICovCisJLmJ1Y2syX3ZvbHRhZ2VbM10gPSA5MDAwMDAsCS8qIDAuOVYgKi8KKwkuYnVjazJfdm9sdGFnZVs0XSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KKwkuYnVjazJfdm9sdGFnZVs1XSA9IDEwMDAwMDAsCS8qIDEuMFYgKi8KKwkuYnVjazJfdm9sdGFnZVs2XSA9IDk1MDAwMCwJLyogMC45NVYgKi8KKwkuYnVjazJfdm9sdGFnZVs3XSA9IDkwMDAwMCwJLyogMC45ViAqLworCisJLmJ1Y2s1X3ZvbHRhZ2VbMF0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbMV0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbMl0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbM10gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbNF0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbNV0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbNl0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbN10gPSAxMTAwMDAwLAkvKiAxLjFWICovCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIHNtZGs0eDEyX2kyY19kZXZzMFtdIF9faW5pdGRhdGEgPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygibWF4ODk5NyIsIDB4NjYpLAorCQkucGxhdGZvcm1fZGF0YQk9ICZzbWRrNHgxMl9tYXg4OTk3X3BkYXRhLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gc21kazR4MTJfaTJjX2RldnMxW10gX19pbml0ZGF0YSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJ3bTg5OTQiLCAweDFhKSwgfQorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBzbWRrNHgxMl9pMmNfZGV2czNbXSBfX2luaXRkYXRhID0geworCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gc21kazR4MTJfaTJjX2RldnM3W10gX19pbml0ZGF0YSA9IHsKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvIHNtZGs0eDEyX2JsX2dwaW9faW5mbyA9IHsKKwkubm8gPSBFWFlOT1M0X0dQRDAoMSksCisJLmZ1bmMgPSBTM0NfR1BJT19TRk4oMiksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBzbWRrNHgxMl9ibF9kYXRhID0geworCS5wd21faWQgPSAxLAorCS5wd21fcGVyaW9kX25zICA9IDEwMDAsCit9OworCitzdGF0aWMgdWludDMyX3Qgc21kazR4MTJfa2V5bWFwW10gX19pbml0ZGF0YSA9IHsKKwkvKiBLRVkocm93LCBjb2wsIGtleWNvZGUpICovCisJS0VZKDEsIDAsIEtFWV9EKSwgS0VZKDEsIDEsIEtFWV9BKSwgS0VZKDEsIDIsIEtFWV9CKSwKKwlLRVkoMSwgMywgS0VZX0UpLCBLRVkoMSwgNCwgS0VZX0MpCit9OworCitzdGF0aWMgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBzbWRrNHgxMl9rZXltYXBfZGF0YSBfX2luaXRkYXRhID0geworCS5rZXltYXAJCT0gc21kazR4MTJfa2V5bWFwLAorCS5rZXltYXBfc2l6ZQk9IEFSUkFZX1NJWkUoc21kazR4MTJfa2V5bWFwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19rZXlwYWRfcGxhdGRhdGEgc21kazR4MTJfa2V5cGFkX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkua2V5bWFwX2RhdGEJPSAmc21kazR4MTJfa2V5bWFwX2RhdGEsCisJLnJvd3MJCT0gMiwKKwkuY29scwkJPSA1LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtZGs0eDEyX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzM2NfZGV2aWNlX2hzbW1jMiwKKwkmczNjX2RldmljZV9oc21tYzMsCisJJnMzY19kZXZpY2VfaTJjMCwKKwkmczNjX2RldmljZV9pMmMxLAorCSZzM2NfZGV2aWNlX2kyYzMsCisJJnMzY19kZXZpY2VfaTJjNywKKwkmczNjX2RldmljZV9ydGMsCisJJnMzY19kZXZpY2Vfd2R0LAorCSZzYW1zdW5nX2RldmljZV9rZXlwYWQsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgc21kazR4MTJfbWFwX2lvKHZvaWQpCit7CisJY2xrX3h1c2J4dGkucmF0ZSA9IDI0MDAwMDAwOworCisJczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQX1ZBX0NISVBJRCk7CisJczNjMjR4eF9pbml0X2Nsb2NrcyhjbGtfeHVzYnh0aS5yYXRlKTsKKwlzM2MyNHh4X2luaXRfdWFydHMoc21kazR4MTJfdWFydGNmZ3MsIEFSUkFZX1NJWkUoc21kazR4MTJfdWFydGNmZ3MpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNtZGs0eDEyX21hY2hpbmVfaW5pdCh2b2lkKQoreworCXMzY19pMmMwX3NldF9wbGF0ZGF0YShOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBzbWRrNHgxMl9pMmNfZGV2czAsCisJCQkJQVJSQVlfU0laRShzbWRrNHgxMl9pMmNfZGV2czApKTsKKworCXMzY19pMmMxX3NldF9wbGF0ZGF0YShOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBzbWRrNHgxMl9pMmNfZGV2czEsCisJCQkJQVJSQVlfU0laRShzbWRrNHgxMl9pMmNfZGV2czEpKTsKKworCXMzY19pMmMzX3NldF9wbGF0ZGF0YShOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygzLCBzbWRrNHgxMl9pMmNfZGV2czMsCisJCQkJQVJSQVlfU0laRShzbWRrNHgxMl9pMmNfZGV2czMpKTsKKworCXMzY19pMmM3X3NldF9wbGF0ZGF0YShOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbyg3LCBzbWRrNHgxMl9pMmNfZGV2czcsCisJCQkJQVJSQVlfU0laRShzbWRrNHgxMl9pMmNfZGV2czcpKTsKKworCXNhbXN1bmdfYmxfc2V0KCZzbWRrNHgxMl9ibF9ncGlvX2luZm8sICZzbWRrNHgxMl9ibF9kYXRhKTsKKworCXNhbXN1bmdfa2V5cGFkX3NldF9wbGF0ZGF0YSgmc21kazR4MTJfa2V5cGFkX2RhdGEpOworCisJczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJnNtZGs0eDEyX2hzbW1jMl9wZGF0YSk7CisJczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoJnNtZGs0eDEyX2hzbW1jM19wZGF0YSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWRrNHgxMl9kZXZpY2VzLCBBUlJBWV9TSVpFKHNtZGs0eDEyX2RldmljZXMpKTsKK30KKworTUFDSElORV9TVEFSVChTTURLNDIxMiwgIlNNREs0MjEyIikKKwkvKiBNYWludGFpbmVyOiBLdWtqaW4gS2ltIDxrZ2VuZS5raW1Ac2Ftc3VuZy5jb20+ICovCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLmluaXRfaXJxCT0gZXh5bm9zNF9pbml0X2lycSwKKwkubWFwX2lvCQk9IHNtZGs0eDEyX21hcF9pbywKKwkuaW5pdF9tYWNoaW5lCT0gc21kazR4MTJfbWFjaGluZV9pbml0LAorCS50aW1lcgkJPSAmZXh5bm9zNF90aW1lciwKK01BQ0hJTkVfRU5ECisKK01BQ0hJTkVfU1RBUlQoU01ESzQ0MTIsICJTTURLNDQxMiIpCisJLyogTWFpbnRhaW5lcjogS3VramluIEtpbSA8a2dlbmUua2ltQHNhbXN1bmcuY29tPiAqLworCS8qIE1haW50YWluZXI6IENoYW5naHdhbiBZb3VuIDxjaGFvcy55b3VuQHNhbXN1bmcuY29tPiAqLworCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5pbml0X2lycQk9IGV4eW5vczRfaW5pdF9pcnEsCisJLm1hcF9pbwkJPSBzbWRrNHgxMl9tYXBfaW8sCisJLmluaXRfbWFjaGluZQk9IHNtZGs0eDEyX21hY2hpbmVfaW5pdCwKKwkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1zbWRrdjMxMC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1zbWRrdjMxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzJhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLXNtZGt2MzEwLmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGt2MzEwLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbGNkLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPHZpZGVvL3BsYXRmb3JtX2xjZC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc3JvbS5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgorI2luY2x1ZGUgPHBsYXQvZXh5bm9zNC5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9mYi5oPgorI2luY2x1ZGUgPHBsYXQva2V5cGFkLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CisjaW5jbHVkZSA8cGxhdC9wZC5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPHBsYXQvbWZjLmg+CisjaW5jbHVkZSA8cGxhdC9laGNpLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNNREtWMzEwX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9UWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWEZJRk9fVE9JIHwJXAorCQkJCSBTM0MyNDQzX1VDT05fUlhFUlJfSVJRRU4pCisKKyNkZWZpbmUgU01ES1YzMTBfVUxDT05fREVGQVVMVAlTM0MyNDEwX0xDT05fQ1M4CisKKyNkZWZpbmUgU01ES1YzMTBfVUZDT05fREVGQVVMVAkoUzNDMjQxMF9VRkNPTl9GSUZPTU9ERSB8CVwKKwkJCQkgUzVQVjIxMF9VRkNPTl9UWFRSSUc0IHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1JYVFJJRzQpCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIHNtZGt2MzEwX3VhcnRjZmdzW10gX19pbml0ZGF0YSA9IHsKKwlbMF0gPSB7CisJCS5od3BvcnQJCT0gMCwKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IFNNREtWMzEwX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IFNNREtWMzEwX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBTTURLVjMxMF9VRkNPTl9ERUZBVUxULAorCX0sCisJWzFdID0geworCQkuaHdwb3J0CQk9IDEsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBTTURLVjMxMF9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBTTURLVjMxMF9VTENPTl9ERUZBVUxULAorCQkudWZjb24JCT0gU01ES1YzMTBfVUZDT05fREVGQVVMVCwKKwl9LAorCVsyXSA9IHsKKwkJLmh3cG9ydAkJPSAyLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gU01ES1YzMTBfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gU01ES1YzMTBfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFNNREtWMzEwX1VGQ09OX0RFRkFVTFQsCisJfSwKKwlbM10gPSB7CisJCS5od3BvcnQJCT0gMywKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IFNNREtWMzEwX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IFNNREtWMzEwX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBTTURLVjMxMF9VRkNPTl9ERUZBVUxULAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrdjMxMF9oc21tYzBfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfSU5URVJOQUwsCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorI2lmZGVmIENPTkZJR19FWFlOT1M0X1NESENJX0NIMF84QklUCisJLm1heF93aWR0aAkJPSA4LAorCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF84X0JJVF9EQVRBLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrdjMxMF9oc21tYzFfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKKwkuZXh0X2NkX2dwaW8JCT0gRVhZTk9TNF9HUEswKDIpLAorCS5leHRfY2RfZ3Bpb19pbnZlcnQJPSAxLAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGt2MzEwX2hzbW1jMl9wZGF0YSBfX2luaXRkYXRhID0geworCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9JTlRFUk5BTCwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCisjaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gyXzhCSVQKKwkubWF4X3dpZHRoCQk9IDgsCisJLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzhfQklUX0RBVEEsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGt2MzEwX2hzbW1jM19wZGF0YSBfX2luaXRkYXRhID0geworCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAorCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQSzIoMiksCisJLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorfTsKKworc3RhdGljIHZvaWQgbGNkX2x0ZTQ4MHd2X3NldF9wb3dlcihzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsCisJCQkJICAgdW5zaWduZWQgaW50IHBvd2VyKQoreworCWlmIChwb3dlcikgeworI2lmICFkZWZpbmVkKENPTkZJR19CQUNLTElHSFRfUFdNKQorCQlncGlvX3JlcXVlc3Rfb25lKEVYWU5PUzRfR1BEMCgxKSwgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkdQRDAiKTsKKwkJZ3Bpb19mcmVlKEVYWU5PUzRfR1BEMCgxKSk7CisjZW5kaWYKKwkJLyogZmlyZSBuUkVTRVQgb24gcG93ZXIgdXAgKi8KKwkJZ3Bpb19yZXF1ZXN0KEVYWU5PUzRfR1BYMCg2KSwgIkdQWDAiKTsKKworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoRVhZTk9TNF9HUFgwKDYpLCAxKTsKKwkJbWRlbGF5KDEwMCk7CisKKwkJZ3Bpb19zZXRfdmFsdWUoRVhZTk9TNF9HUFgwKDYpLCAwKTsKKwkJbWRlbGF5KDEwKTsKKworCQlncGlvX3NldF92YWx1ZShFWFlOT1M0X0dQWDAoNiksIDEpOworCQltZGVsYXkoMTApOworCisJCWdwaW9fZnJlZShFWFlOT1M0X0dQWDAoNikpOworCX0gZWxzZSB7CisjaWYgIWRlZmluZWQoQ09ORklHX0JBQ0tMSUdIVF9QV00pCisJCWdwaW9fcmVxdWVzdF9vbmUoRVhZTk9TNF9HUEQwKDEpLCBHUElPRl9PVVRfSU5JVF9MT1csICJHUEQwIik7CisJCWdwaW9fZnJlZShFWFlOT1M0X0dQRDAoMSkpOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgc21ka3YzMTBfbGNkX2x0ZTQ4MHd2X2RhdGEgPSB7CisJLnNldF9wb3dlcgkJPSBsY2RfbHRlNDgwd3Zfc2V0X3Bvd2VyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21ka3YzMTBfbGNkX2x0ZTQ4MHd2ID0geworCS5uYW1lCQkJPSAicGxhdGZvcm0tbGNkIiwKKwkuZGV2LnBhcmVudAkJPSAmczVwX2RldmljZV9maW1kMC5kZXYsCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJnNtZGt2MzEwX2xjZF9sdGU0ODB3dl9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfZmJfcGRfd2luIHNtZGt2MzEwX2ZiX3dpbjAgPSB7CisJLndpbl9tb2RlID0geworCQkubGVmdF9tYXJnaW4JPSAxMywKKwkJLnJpZ2h0X21hcmdpbgk9IDgsCisJCS51cHBlcl9tYXJnaW4JPSA3LAorCQkubG93ZXJfbWFyZ2luCT0gNSwKKwkJLmhzeW5jX2xlbgk9IDMsCisJCS52c3luY19sZW4JPSAxLAorCQkueHJlcwkJPSA4MDAsCisJCS55cmVzCQk9IDQ4MCwKKwl9LAorCS5tYXhfYnBwCQk9IDMyLAorCS5kZWZhdWx0X2JwcAkJPSAyNCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhIHNtZGt2MzEwX2xjZDBfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkud2luWzBdCQk9ICZzbWRrdjMxMF9mYl93aW4wLAorCS52aWRjb24wCT0gVklEQ09OMF9WSURPVVRfUkdCIHwgVklEQ09OMF9QTlJNT0RFX1JHQiwKKwkudmlkY29uMQk9IFZJRENPTjFfSU5WX0hTWU5DIHwgVklEQ09OMV9JTlZfVlNZTkMsCisJLnNldHVwX2dwaW8JPSBleHlub3M0X2ZpbWQwX2dwaW9fc2V0dXBfMjRicHAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtZGt2MzEwX3Ntc2M5MTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TUk9NX0JBTksoMSksCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NST01fQkFOSygxKSArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfRUlOVCg1KSwKKwkJLmVuZAk9IElSUV9FSU5UKDUpLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElSUUZfVFJJR0dFUl9MT1csCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc21zYzkxMXhfcGxhdGZvcm1fY29uZmlnIHNtc2M5MjE1X2NvbmZpZyA9IHsKKwkuaXJxX3BvbGFyaXR5CT0gU01TQzkxMVhfSVJRX1BPTEFSSVRZX0FDVElWRV9MT1csCisJLmlycV90eXBlCT0gU01TQzkxMVhfSVJRX1RZUEVfUFVTSF9QVUxMLAorCS5mbGFncwkJPSBTTVNDOTExWF9VU0VfMTZCSVQgfCBTTVNDOTExWF9GT1JDRV9JTlRFUk5BTF9QSFksCisJLnBoeV9pbnRlcmZhY2UJPSBQSFlfSU5URVJGQUNFX01PREVfTUlJLAorCS5tYWMJCT0gezB4MDAsIDB4ODAsIDB4MDAsIDB4MjMsIDB4NDUsIDB4Njd9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21ka3YzMTBfc21zYzkxMXggPSB7CisJLm5hbWUJCT0gInNtc2M5MTF4IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtZGt2MzEwX3Ntc2M5MTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc21ka3YzMTBfc21zYzkxMXhfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZzbXNjOTIxNV9jb25maWcsCisJfSwKK307CisKK3N0YXRpYyB1aW50MzJfdCBzbWRrdjMxMF9rZXltYXBbXSBfX2luaXRkYXRhID0geworCS8qIEtFWShyb3csIGNvbCwga2V5Y29kZSkgKi8KKwlLRVkoMCwgMywgS0VZXzEpLCBLRVkoMCwgNCwgS0VZXzIpLCBLRVkoMCwgNSwgS0VZXzMpLAorCUtFWSgwLCA2LCBLRVlfNCksIEtFWSgwLCA3LCBLRVlfNSksCisJS0VZKDEsIDMsIEtFWV9BKSwgS0VZKDEsIDQsIEtFWV9CKSwgS0VZKDEsIDUsIEtFWV9DKSwKKwlLRVkoMSwgNiwgS0VZX0QpLCBLRVkoMSwgNywgS0VZX0UpCit9OworCitzdGF0aWMgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBzbWRrdjMxMF9rZXltYXBfZGF0YSBfX2luaXRkYXRhID0geworCS5rZXltYXAJCT0gc21ka3YzMTBfa2V5bWFwLAorCS5rZXltYXBfc2l6ZQk9IEFSUkFZX1NJWkUoc21ka3YzMTBfa2V5bWFwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19rZXlwYWRfcGxhdGRhdGEgc21ka3YzMTBfa2V5cGFkX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkua2V5bWFwX2RhdGEJPSAmc21ka3YzMTBfa2V5bWFwX2RhdGEsCisJLnJvd3MJCT0gMiwKKwkuY29scwkJPSA4LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfZGV2czFbXSBfX2luaXRkYXRhID0geworCXtJMkNfQk9BUkRfSU5GTygid204OTk0IiwgMHgxYSksfSwKK307CisKKy8qIFVTQiBFSENJICovCitzdGF0aWMgc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhIHNtZGt2MzEwX2VoY2lfcGRhdGE7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbWRrdjMxMF9laGNpX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgKnBkYXRhID0gJnNtZGt2MzEwX2VoY2lfcGRhdGE7CisKKwlzNXBfZWhjaV9zZXRfcGxhdGRhdGEocGRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21ka3YzMTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnMzY19kZXZpY2VfaHNtbWMwLAorCSZzM2NfZGV2aWNlX2hzbW1jMSwKKwkmczNjX2RldmljZV9oc21tYzIsCisJJnMzY19kZXZpY2VfaHNtbWMzLAorCSZzM2NfZGV2aWNlX2kyYzEsCisJJnM1cF9kZXZpY2VfaTJjX2hkbWlwaHksCisJJnMzY19kZXZpY2VfcnRjLAorCSZzM2NfZGV2aWNlX3dkdCwKKwkmczVwX2RldmljZV9laGNpLAorCSZzNXBfZGV2aWNlX2ZpbWMwLAorCSZzNXBfZGV2aWNlX2ZpbWMxLAorCSZzNXBfZGV2aWNlX2ZpbWMyLAorCSZzNXBfZGV2aWNlX2ZpbWMzLAorCSZleHlub3M0X2RldmljZV9hYzk3LAorCSZleHlub3M0X2RldmljZV9pMnMwLAorCSZzYW1zdW5nX2RldmljZV9rZXlwYWQsCisJJnM1cF9kZXZpY2VfbWZjLAorCSZzNXBfZGV2aWNlX21mY19sLAorCSZzNXBfZGV2aWNlX21mY19yLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9NRkNdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9HM0RdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9MQ0QwXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTENEMV0sCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0sCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX1RWXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfR1BTXSwKKwkmZXh5bm9zNF9kZXZpY2Vfc3BkaWYsCisJJmV4eW5vczRfZGV2aWNlX3N5c21tdSwKKwkmc2Ftc3VuZ19hc29jX2RtYSwKKwkmc2Ftc3VuZ19hc29jX2lkbWEsCisJJnM1cF9kZXZpY2VfZmltZDAsCisJJnNtZGt2MzEwX2xjZF9sdGU0ODB3diwKKwkmc21ka3YzMTBfc21zYzkxMXgsCisJJmV4eW5vczRfZGV2aWNlX2FoY2ksCisJJnM1cF9kZXZpY2VfaGRtaSwKKwkmczVwX2RldmljZV9taXhlciwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbWRrdjMxMF9zbXNjOTExeF9pbml0KHZvaWQpCit7CisJdTMyIGNzMTsKKworCS8qIGNvbmZpZ3VyZSBuQ1MxIHdpZHRoIHRvIDE2IGJpdHMgKi8KKwljczEgPSBfX3Jhd19yZWFkbChTNVBfU1JPTV9CVykgJgorCQl+KFM1UF9TUk9NX0JXX19DU19NQVNLIDw8IFM1UF9TUk9NX0JXX19OQ1MxX19TSElGVCk7CisJY3MxIHw9ICgoMSA8PCBTNVBfU1JPTV9CV19fREFUQVdJRFRIX19TSElGVCkgfAorCQkoMSA8PCBTNVBfU1JPTV9CV19fV0FJVEVOQUJMRV9fU0hJRlQpIHwKKwkJKDEgPDwgUzVQX1NST01fQldfX0JZVEVFTkFCTEVfX1NISUZUKSkgPDwKKwkJUzVQX1NST01fQldfX05DUzFfX1NISUZUOworCV9fcmF3X3dyaXRlbChjczEsIFM1UF9TUk9NX0JXKTsKKworCS8qIHNldCB0aW1pbmcgZm9yIG5DUzEgc3VpdGFibGUgZm9yIGV0aGVybmV0IGNoaXAgKi8KKwlfX3Jhd193cml0ZWwoKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1BNQ19fU0hJRlQpIHwKKwkJICAgICAoMHg5IDw8IFM1UF9TUk9NX0JDWF9fVEFDUF9fU0hJRlQpIHwKKwkJICAgICAoMHhjIDw8IFM1UF9TUk9NX0JDWF9fVENBSF9fU0hJRlQpIHwKKwkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVENPSF9fU0hJRlQpIHwKKwkJICAgICAoMHg2IDw8IFM1UF9TUk9NX0JDWF9fVEFDQ19fU0hJRlQpIHwKKwkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVENPU19fU0hJRlQpIHwKKwkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVEFDU19fU0hJRlQpLCBTNVBfU1JPTV9CQzEpOworfQorCisvKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21ka3YzMTBfYmxfZ3Bpb19pbmZvID0geworCS5ubyA9IEVYWU5PUzRfR1BEMCgxKSwKKwkuZnVuYyA9IFMzQ19HUElPX1NGTigyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGt2MzEwX2JsX2RhdGEgPSB7CisJLnB3bV9pZCA9IDEsCisJLnB3bV9wZXJpb2RfbnMgID0gMTAwMCwKK307CisKK3N0YXRpYyB2b2lkIHM1cF90dl9zZXR1cCh2b2lkKQoreworCS8qIGRpcmVjdCBIUEQgdG8gSERNSSBjaGlwICovCisJV0FSTl9PTihncGlvX3JlcXVlc3Rfb25lKEVYWU5PUzRfR1BYMyg3KSwgR1BJT0ZfSU4sICJocGQtcGx1ZyIpKTsKKwlzM2NfZ3Bpb19jZmdwaW4oRVhZTk9TNF9HUFgzKDcpLCBTM0NfR1BJT19TRk4oMHgzKSk7CisJczNjX2dwaW9fc2V0cHVsbChFWFlOT1M0X0dQWDMoNyksIFMzQ19HUElPX1BVTExfTk9ORSk7CisKKwkvKiBzZXR1cCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBUViBkZXZpY2VzICovCisJczVwX2RldmljZV9oZG1pLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLmRldjsKKwlzNXBfZGV2aWNlX21peGVyLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLmRldjsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNtZGt2MzEwX21hcF9pbyh2b2lkKQoreworCXM1cF9pbml0X2lvKE5VTEwsIDAsIFM1UF9WQV9DSElQSUQpOworCXMzYzI0eHhfaW5pdF9jbG9ja3MoMjQwMDAwMDApOworCXMzYzI0eHhfaW5pdF91YXJ0cyhzbWRrdjMxMF91YXJ0Y2ZncywgQVJSQVlfU0laRShzbWRrdjMxMF91YXJ0Y2ZncykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc21ka3YzMTBfcmVzZXJ2ZSh2b2lkKQoreworCXM1cF9tZmNfcmVzZXJ2ZV9tZW0oMHg0MzAwMDAwMCwgOCA8PCAyMCwgMHg1MTAwMDAwMCwgOCA8PCAyMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbWRrdjMxMF9tYWNoaW5lX2luaXQodm9pZCkKK3sKKwlzM2NfaTJjMV9zZXRfcGxhdGRhdGEoTlVMTCk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgaTJjX2RldnMxLCBBUlJBWV9TSVpFKGkyY19kZXZzMSkpOworCisJc21ka3YzMTBfc21zYzkxMXhfaW5pdCgpOworCisJczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2hzbW1jMF9wZGF0YSk7CisJczNjX3NkaGNpMV9zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2hzbW1jMV9wZGF0YSk7CisJczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2hzbW1jMl9wZGF0YSk7CisJczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2hzbW1jM19wZGF0YSk7CisKKwlzNXBfdHZfc2V0dXAoKTsKKwlzNXBfaTJjX2hkbWlwaHlfc2V0X3BsYXRkYXRhKE5VTEwpOworCisJc2Ftc3VuZ19rZXlwYWRfc2V0X3BsYXRkYXRhKCZzbWRrdjMxMF9rZXlwYWRfZGF0YSk7CisKKwlzYW1zdW5nX2JsX3NldCgmc21ka3YzMTBfYmxfZ3Bpb19pbmZvLCAmc21ka3YzMTBfYmxfZGF0YSk7CisJczVwX2ZpbWQwX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfbGNkMF9wZGF0YSk7CisKKwlzbWRrdjMxMF9laGNpX2luaXQoKTsKKwljbGtfeHVzYnh0aS5yYXRlID0gMjQwMDAwMDA7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWRrdjMxMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNtZGt2MzEwX2RldmljZXMpKTsKKwlzNXBfZGV2aWNlX21mYy5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX01GQ10uZGV2OworfQorCitNQUNISU5FX1NUQVJUKFNNREtWMzEwLCAiU01ES1YzMTAiKQorCS8qIE1haW50YWluZXI6IEt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4gKi8KKwkvKiBNYWludGFpbmVyOiBDaGFuZ2h3YW4gWW91biA8Y2hhb3MueW91bkBzYW1zdW5nLmNvbT4gKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAorCS5tYXBfaW8JCT0gc21ka3YzMTBfbWFwX2lvLAorCS5pbml0X21hY2hpbmUJPSBzbWRrdjMxMF9tYWNoaW5lX2luaXQsCisJLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAorCS5yZXNlcnZlCT0gJnNtZGt2MzEwX3Jlc2VydmUsCitNQUNISU5FX0VORAorCitNQUNISU5FX1NUQVJUKFNNREtDMjEwLCAiU01ES0MyMTAiKQorCS8qIE1haW50YWluZXI6IEt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4gKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAorCS5tYXBfaW8JCT0gc21ka3YzMTBfbWFwX2lvLAorCS5pbml0X21hY2hpbmUJPSBzbWRrdjMxMF9tYWNoaW5lX2luaXQsCisJLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtdW5pdmVyc2FsX2MyMTAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtdW5pdmVyc2FsX2MyMTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmExNzdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC11bml2ZXJzYWxfYzIxMC5jCkBAIC0wLDAgKzEsMTA2NCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtdW5pdmVyc2FsX2MyMTAuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk4Lmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZml4ZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWF4ODk1Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvbWNzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL2F0bWVsX214dF90cy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2ZiLmg+CisjaW5jbHVkZSA8cGxhdC9tZmMuaD4KKyNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CisjaW5jbHVkZSA8cGxhdC9wZC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgorI2luY2x1ZGUgPHBsYXQvZmltYy1jb3JlLmg+CisjaW5jbHVkZSA8cGxhdC9jYW1wb3J0Lmg+CisjaW5jbHVkZSA8cGxhdC9taXBpX2NzaXMuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLW1lZGlhYnVzLmg+CisjaW5jbHVkZSA8bWVkaWEvczVwX2ZpbWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9tNW1vbHMuaD4KKworLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYSUxFVkVMIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fVFhJUlFNT0RFIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhJUlFNT0RFIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhGSUZPX1RPSSB8CVwKKwkJCQkgUzNDMjQ0M19VQ09OX1JYRVJSX0lSUUVOKQorCisjZGVmaW5lIFVOSVZFUlNBTF9VTENPTl9ERUZBVUxUCVMzQzI0MTBfTENPTl9DUzgKKworI2RlZmluZSBVTklWRVJTQUxfVUZDT05fREVGQVVMVAkoUzNDMjQxMF9VRkNPTl9GSUZPTU9ERSB8CVwKKwkJCQkgUzVQVjIxMF9VRkNPTl9UWFRSSUcyNTYgfAlcCisJCQkJIFM1UFYyMTBfVUZDT05fUlhUUklHMjU2KQorCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyB1bml2ZXJzYWxfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkJPSAwLAorCQkudWNvbgkJPSBVTklWRVJTQUxfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBVTklWRVJTQUxfVUZDT05fREVGQVVMVCwKKwl9LAorCVsxXSA9IHsKKwkJLmh3cG9ydAkJPSAxLAorCQkudWNvbgkJPSBVTklWRVJTQUxfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBVTklWRVJTQUxfVUZDT05fREVGQVVMVCwKKwl9LAorCVsyXSA9IHsKKwkJLmh3cG9ydAkJPSAyLAorCQkudWNvbgkJPSBVTklWRVJTQUxfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBVTklWRVJTQUxfVUZDT05fREVGQVVMVCwKKwl9LAorCVszXSA9IHsKKwkJLmh3cG9ydAkJPSAzLAorCQkudWNvbgkJPSBVTklWRVJTQUxfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBVTklWRVJTQUxfVUZDT05fREVGQVVMVCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG1heDg5NTJfY29uc3VtZXIgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9hcm0iLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBtYXg4OTUyX3BsYXRmb3JtX2RhdGEgdW5pdmVyc2FsX21heDg5NTJfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuZ3Bpb192aWQwCT0gRVhZTk9TNF9HUFgwKDMpLAorCS5ncGlvX3ZpZDEJPSBFWFlOT1M0X0dQWDAoNCksCisJLmdwaW9fZW4JPSAtMSwgLyogTm90IGNvbnRyb2xsYWJsZSwgc2V0ICJBbHdheXMgSGlnaCIgKi8KKwkuZGVmYXVsdF9tb2RlCT0gMCwgLyogdmlkMCA9IDAsIHZpZDEgPSAwICovCisJLmR2c19tb2RlCT0geyA0OCwgMzIsIDI4LCAxOCB9LCAvKiAxLjI1LCAxLjIwLCAxLjA1LCAwLjk1ViAqLworCS5zeW5jX2ZyZXEJPSAwLCAvKiBkZWZhdWx0OiBmYXN0ZXN0ICovCisJLnJhbXBfc3BlZWQJPSAwLCAvKiBkZWZhdWx0OiBmYXN0ZXN0ICovCisKKwkucmVnX2RhdGEJPSB7CisJCS5jb25zdHJhaW50cwk9IHsKKwkJCS5uYW1lCQk9ICJWQVJNXzEuMlYiLAorCQkJLm1pbl91VgkJPSA3NzAwMDAsCisJCQkubWF4X3VWCQk9IDE0MDAwMDAsCisJCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UsCisJCQkuYWx3YXlzX29uCT0gMSwKKwkJCS5ib290X29uCT0gMSwKKwkJfSwKKwkJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCisJCS5jb25zdW1lcl9zdXBwbGllcwk9ICZtYXg4OTUyX2NvbnN1bWVyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbHAzOTc0X2J1Y2sxX2NvbnN1bWVyID0KKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfaW50IiwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfYnVjazJfY29uc3VtZXIgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZkZGczZCIsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbHAzOTc0X2J1Y2szX2NvbnN1bWVyID0KKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGV0IiwgInM1cC1zZG8iKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9idWNrMV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZJTlRfMS4xViIsCisJCS5taW5fdVYJCT0gNzUwMDAwLAorCQkubWF4X3VWCQk9IDE1MDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSB8CisJCQlSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmJvb3Rfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcyA9ICZscDM5NzRfYnVjazFfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2J1Y2syX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkczRF8xLjFWIiwKKwkJLm1pbl91VgkJPSA3NTAwMDAsCisJCS5tYXhfdVYJCT0gMTUwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCVJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYm9vdF9vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gJmxwMzk3NF9idWNrMl9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfYnVjazNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWQ0NfMS44ViIsCisJCS5taW5fdVYJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJPSAxODAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5lbmFibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcyA9ICZscDM5NzRfYnVjazNfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2J1Y2s0X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVk1FTV8xLjJWIiwKKwkJLm1pbl91VgkJPSAxMjAwMDAwLAorCQkubWF4X3VWCQk9IDEyMDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8yX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkFMSVZFXzEuMlYiLAorCQkubWluX3VWCQk9IDEyMDAwMDAsCisJCS5tYXhfdVYJCT0gMTIwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZW5hYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfbGRvM19jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZCIsICJleHlub3M0LWhkbWkiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfcGxsIiwgImV4eW5vczQtaGRtaSIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZkZDExIiwgInM1cC1taXBpLWNzaXMuMCIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8zX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVlVTQitNSVBJXzEuMVYiLAorCQkubWluX3VWCQk9IDExMDAwMDAsCisJCS5tYXhfdVYJCT0gMTEwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUobHAzOTc0X2xkbzNfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IGxwMzk3NF9sZG8zX2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxwMzk3NF9sZG80X2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX29zYyIsICJleHlub3M0LWhkbWkiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvNF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZBRENfMy4zViIsCisJCS5taW5fdVYJCT0gMzMwMDAwMCwKKwkJLm1heF91VgkJPSAzMzAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShscDM5NzRfbGRvNF9jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gbHAzOTc0X2xkbzRfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzVfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWVEZfMi44ViIsCisJCS5taW5fdVYJCT0gMjgwMDAwMCwKKwkJLm1heF91VgkJPSAyODAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvNl9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkxETzYiLAorCQkubWluX3VWCQk9IDIwMDAwMDAsCisJCS5tYXhfdVYJCT0gMjAwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbHAzOTc0X2xkbzdfY29uc3VtZXJbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQxOCIsICJzNXAtbWlwaS1jc2lzLjAiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvN19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZMQ0QrVk1JUElfMS44ViIsCisJCS5taW5fdVYJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJPSAxODAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShscDM5NzRfbGRvN19jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbHAzOTc0X2xkbzdfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbHAzOTc0X2xkbzhfY29uc3VtZXJbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQzM2FfZGFjIiwgInM1cC1zZG8iKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvOF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZVU0IrVkRBQ18zLjNWIiwKKwkJLm1pbl91VgkJPSAzMzAwMDAwLAorCQkubWF4X3VWCQk9IDMzMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKGxwMzk3NF9sZG84X2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBscDM5NzRfbGRvOF9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvOV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZDQ18yLjhWIiwKKwkJLm1pbl91VgkJPSAyODAwMDAwLAorCQkubWF4X3VWCQk9IDI4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzEwX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVlBMTF8xLjFWIiwKKwkJLm1pbl91VgkJPSAxMTAwMDAwLAorCQkubWF4X3VWCQk9IDExMDAwMDAsCisJCS5ib290X29uCT0gMSwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbHAzOTc0X2xkbzExX2NvbnN1bWVyID0KKwlSRUdVTEFUT1JfU1VQUExZKCJkaWdfMjgiLCAiMC0wMDFmIik7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvMTFfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJDQU1fQUZfMy4zViIsCisJCS5taW5fdVYJCT0gMzMwMDAwMCwKKwkJLm1heF91VgkJPSAzMzAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmbHAzOTc0X2xkbzExX2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xMl9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlBTXzIuOFYiLAorCQkubWluX3VWCQk9IDI4MDAwMDAsCisJCS5tYXhfdVYJCT0gMjgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzEzX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkhJQ18xLjJWIiwKKwkJLm1pbl91VgkJPSAxMjAwMDAwLAorCQkubWF4X3VWCQk9IDEyMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxwMzk3NF9sZG8xNF9jb25zdW1lciA9CisJUkVHVUxBVE9SX1NVUFBMWSgiZGlnXzE4IiwgIjAtMDAxZiIpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzE0X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiQ0FNX0lfSE9TVF8xLjhWIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcwk9ICZscDM5NzRfbGRvMTRfY29uc3VtZXIsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfbGRvMTVfY29uc3VtZXIgPQorCVJFR1VMQVRPUl9TVVBQTFkoImRpZ18xMiIsICIwLTAwMWYiKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xNV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkNBTV9TX0RJRytGTTMzX0NPUkVfMS4yViIsCisJCS5taW5fdVYJCT0gMTIwMDAwMCwKKwkJLm1heF91VgkJPSAxMjAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmbHAzOTc0X2xkbzE1X2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxwMzk3NF9sZG8xNl9jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImFfc2Vuc29yIiwgIjAtMDAxZiIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xNl9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkNBTV9TX0FOQV8yLjhWIiwKKwkJLm1pbl91VgkJPSAyODAwMDAwLAorCQkubWF4X3VWCQk9IDI4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGxwMzk3NF9sZG8xNl9jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbHAzOTc0X2xkbzE2X2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xN19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZDQ18zLjBWX0xDRCIsCisJCS5taW5fdVYJCT0gMzAwMDAwMCwKKwkJLm1heF91VgkJPSAzMDAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmJvb3Rfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF8zMmtoel9hcF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIjMyS0h6IEFQIiwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZW5hYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfMzJraHpfY3BfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICIzMktIeiBDUCIsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X3ZpY2hnX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVklDSEciLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9lc2FmZW91dDFfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJTQUZFT1VUMSIsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2VzYWZlb3V0Ml9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlNBRkVPVVQyIiwKKwkJLmJvb3Rfb24JPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5lbmFibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtYXg4OTk4X3JlZ3VsYXRvcl9kYXRhIGxwMzk3NF9yZWd1bGF0b3JzW10gPSB7CisJeyBNQVg4OTk4X0xETzIsICAmbHAzOTc0X2xkbzJfZGF0YSB9LAorCXsgTUFYODk5OF9MRE8zLCAgJmxwMzk3NF9sZG8zX2RhdGEgfSwKKwl7IE1BWDg5OThfTERPNCwgICZscDM5NzRfbGRvNF9kYXRhIH0sCisJeyBNQVg4OTk4X0xETzUsICAmbHAzOTc0X2xkbzVfZGF0YSB9LAorCXsgTUFYODk5OF9MRE82LCAgJmxwMzk3NF9sZG82X2RhdGEgfSwKKwl7IE1BWDg5OThfTERPNywgICZscDM5NzRfbGRvN19kYXRhIH0sCisJeyBNQVg4OTk4X0xETzgsICAmbHAzOTc0X2xkbzhfZGF0YSB9LAorCXsgTUFYODk5OF9MRE85LCAgJmxwMzk3NF9sZG85X2RhdGEgfSwKKwl7IE1BWDg5OThfTERPMTAsICZscDM5NzRfbGRvMTBfZGF0YSB9LAorCXsgTUFYODk5OF9MRE8xMSwgJmxwMzk3NF9sZG8xMV9kYXRhIH0sCisJeyBNQVg4OTk4X0xETzEyLCAmbHAzOTc0X2xkbzEyX2RhdGEgfSwKKwl7IE1BWDg5OThfTERPMTMsICZscDM5NzRfbGRvMTNfZGF0YSB9LAorCXsgTUFYODk5OF9MRE8xNCwgJmxwMzk3NF9sZG8xNF9kYXRhIH0sCisJeyBNQVg4OTk4X0xETzE1LCAmbHAzOTc0X2xkbzE1X2RhdGEgfSwKKwl7IE1BWDg5OThfTERPMTYsICZscDM5NzRfbGRvMTZfZGF0YSB9LAorCXsgTUFYODk5OF9MRE8xNywgJmxwMzk3NF9sZG8xN19kYXRhIH0sCisJeyBNQVg4OTk4X0JVQ0sxLCAmbHAzOTc0X2J1Y2sxX2RhdGEgfSwKKwl7IE1BWDg5OThfQlVDSzIsICZscDM5NzRfYnVjazJfZGF0YSB9LAorCXsgTUFYODk5OF9CVUNLMywgJmxwMzk3NF9idWNrM19kYXRhIH0sCisJeyBNQVg4OTk4X0JVQ0s0LCAmbHAzOTc0X2J1Y2s0X2RhdGEgfSwKKwl7IE1BWDg5OThfRU4zMktIWl9BUCwgJmxwMzk3NF8zMmtoel9hcF9kYXRhIH0sCisJeyBNQVg4OTk4X0VOMzJLSFpfQ1AsICZscDM5NzRfMzJraHpfY3BfZGF0YSB9LAorCXsgTUFYODk5OF9FTlZJQ0hHLCAmbHAzOTc0X3ZpY2hnX2RhdGEgfSwKKwl7IE1BWDg5OThfRVNBRkVPVVQxLCAmbHAzOTc0X2VzYWZlb3V0MV9kYXRhIH0sCisJeyBNQVg4OTk4X0VTQUZFT1VUMiwgJmxwMzk3NF9lc2FmZW91dDJfZGF0YSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBtYXg4OTk4X3BsYXRmb3JtX2RhdGEgdW5pdmVyc2FsX2xwMzk3NF9wZGF0YSA9IHsKKwkubnVtX3JlZ3VsYXRvcnMJCT0gQVJSQVlfU0laRShscDM5NzRfcmVndWxhdG9ycyksCisJLnJlZ3VsYXRvcnMJCT0gbHAzOTc0X3JlZ3VsYXRvcnMsCisJLmJ1Y2sxX3ZvbHRhZ2UxCQk9IDExMDAwMDAsCS8qIElOVCAqLworCS5idWNrMV92b2x0YWdlMgkJPSAxMDAwMDAwLAorCS5idWNrMV92b2x0YWdlMwkJPSAxMTAwMDAwLAorCS5idWNrMV92b2x0YWdlNAkJPSAxMDAwMDAwLAorCS5idWNrMV9zZXQxCQk9IEVYWU5PUzRfR1BYMCg1KSwKKwkuYnVjazFfc2V0MgkJPSBFWFlOT1M0X0dQWDAoNiksCisJLmJ1Y2syX3ZvbHRhZ2UxCQk9IDEyMDAwMDAsCS8qIEczRCAqLworCS5idWNrMl92b2x0YWdlMgkJPSAxMTAwMDAwLAorCS5idWNrMV9kZWZhdWx0X2lkeAk9IDAsCisJLmJ1Y2syX3NldDMJCT0gRVhZTk9TNF9HUEUyKDApLAorCS5idWNrMl9kZWZhdWx0X2lkeAk9IDAsCisJLndha2V1cAkJCT0gdHJ1ZSwKK307CisKKworZW51bSBmaXhlZF9yZWd1bGF0b3JfaWQgeworCUZJWEVEX1JFR19JRF9NTUMwLAorCUZJWEVEX1JFR19JRF9IRE1JXzVWLAorCUZJWEVEX1JFR19JRF9DQU1fU19JRiwKKwlGSVhFRF9SRUdfSURfQ0FNX0lfQ09SRSwKKwlGSVhFRF9SRUdfSURfQ0FNX1ZUX0RJTywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBoZG1pX2ZpeGVkX2NvbnN1bWVyID0KKwlSRUdVTEFUT1JfU1VQUExZKCJoZG1pLWVuIiwgImV4eW5vczQtaGRtaSIpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgaGRtaV9maXhlZF92b2x0YWdlX2luaXRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJCT0geworCQkubmFtZQkJPSAiSERNSV81ViIsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmhkbWlfZml4ZWRfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIGhkbWlfZml4ZWRfdm9sdGFnZV9jb25maWcgPSB7CisJLnN1cHBseV9uYW1lCQk9ICJIRE1JX0VOMSIsCisJLm1pY3Jvdm9sdHMJCT0gNTAwMDAwMCwKKwkuZ3BpbwkJCT0gRVhZTk9TNF9HUEUwKDEpLAorCS5lbmFibGVfaGlnaAkJPSB0cnVlLAorCS5pbml0X2RhdGEJCT0gJmhkbWlfZml4ZWRfdm9sdGFnZV9pbml0X2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoZG1pX2ZpeGVkX3ZvbHRhZ2UgPSB7CisJLm5hbWUJCQk9ICJyZWctZml4ZWQtdm9sdGFnZSIsCisJLmlkCQkJPSBGSVhFRF9SRUdfSURfSERNSV81ViwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmhkbWlfZml4ZWRfdm9sdGFnZV9jb25maWcsCisJfSwKK307CisKKy8qIEdQSU8gSTJDIDUgKFBNSUMpICovCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyYzVfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygibWF4ODk1MiIsIDB4QzAgPj4gMSksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJnVuaXZlcnNhbF9tYXg4OTUyX3BkYXRhLAorCX0sIHsKKwkJSTJDX0JPQVJEX0lORk8oImxwMzk3NCIsIDB4Q0MgPj4gMSksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJnVuaXZlcnNhbF9scDM5NzRfcGRhdGEsCisJfSwKK307CisKKy8qIEkyQzMgKFRTUCkgKi8KK3N0YXRpYyBzdHJ1Y3QgbXh0X3BsYXRmb3JtX2RhdGEgcXQ2MDIyNDBfcGxhdGZvcm1fZGF0YSA9IHsKKwkueF9saW5lCQk9IDE5LAorCS55X2xpbmUJCT0gMTEsCisJLnhfc2l6ZQkJPSA4MDAsCisJLnlfc2l6ZQkJPSA0ODAsCisJLmJsZW4JCT0gMHgxMSwKKwkudGhyZXNob2xkCT0gMHgyOCwKKwkudm9sdGFnZQk9IDI4MDAwMDAsCQkvKiAyLjhWICovCisJLm9yaWVudAkJPSBNWFRfRElBR09OQUwsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyYzNfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicXQ2MDIyNDBfdHMiLCAweDRhKSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmcXQ2MDIyNDBfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF90c3BfaW5pdCh2b2lkKQoreworCWludCBncGlvOworCisJLyogVFNQX0xET19PTjogWE1ETUFERFJfMTEgKi8KKwlncGlvID0gRVhZTk9TNF9HUEUyKDMpOworCWdwaW9fcmVxdWVzdChncGlvLCAiVFNQX0xET19PTiIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCAxKTsKKwlncGlvX2V4cG9ydChncGlvLCAwKTsKKworCS8qIFRTUF9JTlQ6IFhNRE1BRERSXzcgKi8KKwlncGlvID0gRVhZTk9TNF9HUEUxKDcpOworCWdwaW9fcmVxdWVzdChncGlvLCAiVFNQX0lOVCIpOworCisJczVwX3JlZ2lzdGVyX2dwaW9faW50ZXJydXB0KGdwaW8pOworCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMHhmKSk7CisJczNjX2dwaW9fc2V0cHVsbChncGlvLCBTM0NfR1BJT19QVUxMX1VQKTsKKwlpMmMzX2RldnNbMF0uaXJxID0gZ3Bpb190b19pcnEoZ3Bpbyk7Cit9CisKKworLyogR1BJTyBJMkMgMTIgKDMgVG91Y2hrZXkpICovCitzdGF0aWMgdWludDMyX3QgdG91Y2hrZXlfa2V5bWFwW10gPSB7CisJLyogTUNTX0tFWV9NQVAodmFsdWUsIGtleWNvZGUpICovCisJTUNTX0tFWV9NQVAoMCwgS0VZX01FTlUpLAkJLyogS0VZX1NFTkQgKi8KKwlNQ1NfS0VZX01BUCgxLCBLRVlfQkFDSyksCQkvKiBLRVlfRU5EICovCit9OworCitzdGF0aWMgc3RydWN0IG1jc19wbGF0Zm9ybV9kYXRhIHRvdWNoa2V5X2RhdGEgPSB7CisJLmtleW1hcAkJPSB0b3VjaGtleV9rZXltYXAsCisJLmtleW1hcF9zaXplCT0gQVJSQVlfU0laRSh0b3VjaGtleV9rZXltYXApLAorCS5rZXlfbWF4dmFsCT0gMiwKK307CisKKy8qIEdQSU8gSTJDIDNfVE9VQ0ggMi44ViAqLworI2RlZmluZSBJMkNfR1BJT19CVVNfMTIJCTEyCitzdGF0aWMgc3RydWN0IGkyY19ncGlvX3BsYXRmb3JtX2RhdGEgaTJjX2dwaW8xMl9kYXRhID0geworCS5zZGFfcGluCT0gRVhZTk9TNF9HUEU0KDApLAkvKiBYTURNREFUQV84ICovCisJLnNjbF9waW4JPSBFWFlOT1M0X0dQRTQoMSksCS8qIFhNRE1EQVRBXzkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyY19ncGlvMTIgPSB7CisJLm5hbWUJCT0gImkyYy1ncGlvIiwKKwkuaWQJCT0gSTJDX0dQSU9fQlVTXzEyLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZpMmNfZ3BpbzEyX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjX2dwaW8xMl9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJtY3M1MDgwX3RvdWNoa2V5IiwgMHgyMCksCisJCS5wbGF0Zm9ybV9kYXRhID0gJnRvdWNoa2V5X2RhdGEsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB1bml2ZXJzYWxfdG91Y2hrZXlfaW5pdCh2b2lkKQoreworCWludCBncGlvOworCisJZ3BpbyA9IEVYWU5PUzRfR1BFMyg3KTsJCQkvKiBYTURNREFUQV83ICovCisJZ3Bpb19yZXF1ZXN0KGdwaW8sICIzX1RPVUNIX0lOVCIpOworCXM1cF9yZWdpc3Rlcl9ncGlvX2ludGVycnVwdChncGlvKTsKKwlzM2NfZ3Bpb19jZmdwaW4oZ3BpbywgUzNDX0dQSU9fU0ZOKDB4ZikpOworCWkyY19ncGlvMTJfZGV2c1swXS5pcnEgPSBncGlvX3RvX2lycShncGlvKTsKKworCWdwaW8gPSBFWFlOT1M0X0dQRTMoMyk7CQkJLyogWE1ETURBVEFfMyAqLworCWdwaW9fcmVxdWVzdChncGlvLCAiM19UT1VDSF9FTiIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCAxKTsKK30KKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyB1bml2ZXJzYWxfaTJjMF9wbGF0ZGF0YSBfX2luaXRkYXRhID0geworCS5mcmVxdWVuY3kJPSAzMDAgKiAxMDAwLAorCS5zZGFfZGVsYXkJPSAyMDAsCit9OworCisvKiBHUElPIEtFWVMgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiB1bml2ZXJzYWxfZ3Bpb19rZXlzX3RhYmxlc1tdID0geworCXsKKwkJLmNvZGUJCQk9IEtFWV9WT0xVTUVVUCwKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigwKSwJLyogWEVJTlQxNiAqLworCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX1ZPTFVNRVVQIiwKKwkJLnR5cGUJCQk9IEVWX0tFWSwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmRlYm91bmNlX2ludGVydmFsCT0gMSwKKwl9LCB7CisJCS5jb2RlCQkJPSBLRVlfVk9MVU1FRE9XTiwKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigxKSwJLyogWEVJTlQxNyAqLworCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX1ZPTFVNRURPV04iLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sIHsKKwkJLmNvZGUJCQk9IEtFWV9DT05GSUcsCisJCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDIoMiksCS8qIFhFSU5UMTggKi8KKwkJLmRlc2MJCQk9ICJncGlvLWtleXM6IEtFWV9DT05GSUciLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sIHsKKwkJLmNvZGUJCQk9IEtFWV9DQU1FUkEsCisJCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDIoMyksCS8qIFhFSU5UMTkgKi8KKwkJLmRlc2MJCQk9ICJncGlvLWtleXM6IEtFWV9DQU1FUkEiLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sIHsKKwkJLmNvZGUJCQk9IEtFWV9PSywKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMyg1KSwJLyogWEVJTlQyOSAqLworCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX09LIiwKKwkJLnR5cGUJCQk9IEVWX0tFWSwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLmRlYm91bmNlX2ludGVydmFsCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSB1bml2ZXJzYWxfZ3Bpb19rZXlzX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSB1bml2ZXJzYWxfZ3Bpb19rZXlzX3RhYmxlcywKKwkubmJ1dHRvbnMJPSBBUlJBWV9TSVpFKHVuaXZlcnNhbF9ncGlvX2tleXNfdGFibGVzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHVuaXZlcnNhbF9ncGlvX2tleXMgPSB7CisJLm5hbWUJCQk9ICJncGlvLWtleXMiLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdW5pdmVyc2FsX2dwaW9fa2V5c19kYXRhLAorCX0sCit9OworCisvKiBlTU1DICovCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSB1bml2ZXJzYWxfaHNtbWMwX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkubWF4X3dpZHRoCQk9IDgsCisJLmhvc3RfY2FwcwkJPSAoTU1DX0NBUF84X0JJVF9EQVRBIHwgTU1DX0NBUF80X0JJVF9EQVRBIHwKKwkJCQlNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8CisJCQkJTU1DX0NBUF9ESVNBQkxFKSwKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfUEVSTUFORU5ULAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBtbWMwX3N1cHBsaWVzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJzM2Mtc2RoY2kuMCIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG1tYzBfZml4ZWRfdm9sdGFnZV9pbml0X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCQk9IHsKKwkJLm5hbWUJCT0gIlZNRU1fVkREXzIuOFYiLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1tYzBfc3VwcGxpZXMpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1tYzBfc3VwcGxpZXMsCit9OworCitzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIG1tYzBfZml4ZWRfdm9sdGFnZV9jb25maWcgPSB7CisJLnN1cHBseV9uYW1lCQk9ICJNQVNTTUVNT1JZX0VOIiwKKwkubWljcm92b2x0cwkJPSAyODAwMDAwLAorCS5ncGlvCQkJPSBFWFlOT1M0X0dQRTEoMyksCisJLmVuYWJsZV9oaWdoCQk9IHRydWUsCisJLmluaXRfZGF0YQkJPSAmbW1jMF9maXhlZF92b2x0YWdlX2luaXRfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1tYzBfZml4ZWRfdm9sdGFnZSA9IHsKKwkubmFtZQkJCT0gInJlZy1maXhlZC12b2x0YWdlIiwKKwkuaWQJCQk9IEZJWEVEX1JFR19JRF9NTUMwLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbW1jMF9maXhlZF92b2x0YWdlX2NvbmZpZywKKwl9LAorfTsKKworLyogU0QgKi8KK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHVuaXZlcnNhbF9oc21tYzJfZGF0YSBfX2luaXRkYXRhID0geworCS5tYXhfd2lkdGgJCT0gNCwKKwkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfNF9CSVRfREFUQSB8CisJCQkJTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQgfAorCQkJCU1NQ19DQVBfRElTQUJMRSwKKwkuZXh0X2NkX2dwaW8JCT0gRVhZTk9TNF9HUFgzKDQpLCAgICAgIC8qIFhFSU5UXzI4ICovCisJLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorfTsKKworLyogV2lGaSAqLworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgdW5pdmVyc2FsX2hzbW1jM19kYXRhIF9faW5pdGRhdGEgPSB7CisJLm1heF93aWR0aAkJPSA0LAorCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF80X0JJVF9EQVRBIHwKKwkJCQlNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8CisJCQkJTU1DX0NBUF9ESVNBQkxFLAorCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9FWFRFUk5BTCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB1bml2ZXJzYWxfc2RoY2lfaW5pdCh2b2lkKQoreworCXMzY19zZGhjaTBfc2V0X3BsYXRkYXRhKCZ1bml2ZXJzYWxfaHNtbWMwX2RhdGEpOworCXMzY19zZGhjaTJfc2V0X3BsYXRkYXRhKCZ1bml2ZXJzYWxfaHNtbWMyX2RhdGEpOworCXMzY19zZGhjaTNfc2V0X3BsYXRkYXRhKCZ1bml2ZXJzYWxfaHNtbWMzX2RhdGEpOworfQorCisvKiBJMkMxICovCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyYzFfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJLyogR3lybywgVG8gYmUgdXBkYXRlZCAqLworfTsKKworLyogRnJhbWUgQnVmZmVyICovCitzdGF0aWMgc3RydWN0IHMzY19mYl9wZF93aW4gdW5pdmVyc2FsX2ZiX3dpbjAgPSB7CisJLndpbl9tb2RlID0geworCQkubGVmdF9tYXJnaW4JPSAxNiwKKwkJLnJpZ2h0X21hcmdpbgk9IDE2LAorCQkudXBwZXJfbWFyZ2luCT0gMiwKKwkJLmxvd2VyX21hcmdpbgk9IDI4LAorCQkuaHN5bmNfbGVuCT0gMiwKKwkJLnZzeW5jX2xlbgk9IDEsCisJCS54cmVzCQk9IDQ4MCwKKwkJLnlyZXMJCT0gODAwLAorCQkucmVmcmVzaAk9IDU1LAorCX0sCisJLm1heF9icHAJPSAzMiwKKwkuZGVmYXVsdF9icHAJPSAxNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhIHVuaXZlcnNhbF9sY2RfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkud2luWzBdCQk9ICZ1bml2ZXJzYWxfZmJfd2luMCwKKwkudmlkY29uMAk9IFZJRENPTjBfVklET1VUX1JHQiB8IFZJRENPTjBfUE5STU9ERV9SR0IgfAorCQkJICBWSURDT04wX0NMS1NFTF9MQ0QsCisJLnZpZGNvbjEJPSBWSURDT04xX0lOVl9WQ0xLIHwgVklEQ09OMV9JTlZfVkRFTgorCQkJICB8IFZJRENPTjFfSU5WX0hTWU5DIHwgVklEQ09OMV9JTlZfVlNZTkMsCisJLnNldHVwX2dwaW8JPSBleHlub3M0X2ZpbWQwX2dwaW9fc2V0dXBfMjRicHAsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY2FtX2lfY29yZV9zdXBwbHkgPQorCVJFR1VMQVRPUl9TVVBQTFkoImNvcmUiLCAiMC0wMDFmIik7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBjYW1faV9jb3JlX3JlZ19pbml0X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzID0geyAudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUyB9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcyA9ICZjYW1faV9jb3JlX3N1cHBseSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgY2FtX2lfY29yZV9maXhlZF92b2x0YWdlX2NmZyA9IHsKKwkuc3VwcGx5X25hbWUJPSAiQ0FNX0lfQ09SRV8xLjJWIiwKKwkubWljcm92b2x0cwk9IDEyMDAwMDAsCisJLmdwaW8JCT0gRVhZTk9TNF9HUEUyKDIpLAkvKiBDQU1fOE1fQ09SRV9FTiAqLworCS5lbmFibGVfaGlnaAk9IDEsCisJLmluaXRfZGF0YQk9ICZjYW1faV9jb3JlX3JlZ19pbml0X2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjYW1faV9jb3JlX2ZpeGVkX3JlZ19kZXYgPSB7CisJLm5hbWUgPSAicmVnLWZpeGVkLXZvbHRhZ2UiLCAuaWQgPSBGSVhFRF9SRUdfSURfQ0FNX0lfQ09SRSwKKwkuZGV2ID0geyAucGxhdGZvcm1fZGF0YQk9ICZjYW1faV9jb3JlX2ZpeGVkX3ZvbHRhZ2VfY2ZnIH0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY2FtX3NfaWZfc3VwcGx5ID0KKwlSRUdVTEFUT1JfU1VQUExZKCJkX3NlbnNvciIsICIwLTAwMWYiKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGNhbV9zX2lmX3JlZ19pbml0X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzID0geyAudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUyB9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcyA9ICZjYW1fc19pZl9zdXBwbHksCit9OworCitzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIGNhbV9zX2lmX2ZpeGVkX3ZvbHRhZ2VfY2ZnID0geworCS5zdXBwbHlfbmFtZQk9ICJDQU1fU19JRl8xLjhWIiwKKwkubWljcm92b2x0cwk9IDE4MDAwMDAsCisJLmdwaW8JCT0gRVhZTk9TNF9HUEUzKDApLAkvKiBDQU1fUFdSX0VOMSAqLworCS5lbmFibGVfaGlnaAk9IDEsCisJLmluaXRfZGF0YQk9ICZjYW1fc19pZl9yZWdfaW5pdF9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2FtX3NfaWZfZml4ZWRfcmVnX2RldiA9IHsKKwkubmFtZSA9ICJyZWctZml4ZWQtdm9sdGFnZSIsIC5pZCA9IEZJWEVEX1JFR19JRF9DQU1fU19JRiwKKwkuZGV2ID0geyAucGxhdGZvcm1fZGF0YQk9ICZjYW1fc19pZl9maXhlZF92b2x0YWdlX2NmZyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzNXBfcGxhdGZvcm1fbWlwaV9jc2lzIG1pcGlfY3Npc19wbGF0ZGF0YSA9IHsKKwkuY2xrX3JhdGUJPSAxNjYwMDAwMDBVTCwKKwkubGFuZXMJCT0gMiwKKwkuYWxpZ25tZW50CT0gMzIsCisJLmhzX3NldHRsZQk9IDEyLAorCS5waHlfZW5hYmxlCT0gczVwX2NzaXNfcGh5X2VuYWJsZSwKK307CisKKyNkZWZpbmUgR1BJT19DQU1fTEVWRUxfRU4obikJRVhZTk9TNF9HUEU0KG4gKyAzKQorI2RlZmluZSBHUElPX0NBTV84TV9JU1BfSU5UCUVYWU5PUzRfR1BYMSg1KQkvKiBYRUlOVF8xMyAqLworI2RlZmluZSBHUElPX0NBTV9NRUdBX25SU1QJRVhZTk9TNF9HUEUyKDUpCisKK3N0YXRpYyBpbnQgbTVtb2xzX3NldF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBvbikKK3sKKwlncGlvX3NldF92YWx1ZShHUElPX0NBTV9MRVZFTF9FTigxKSwgIW9uKTsKKwlncGlvX3NldF92YWx1ZShHUElPX0NBTV9MRVZFTF9FTigyKSwgISFvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbTVtb2xzX3BsYXRmb3JtX2RhdGEgbTVtb2xzX3BsYXRkYXRhID0geworCS5ncGlvX3Jlc2V0CT0gR1BJT19DQU1fTUVHQV9uUlNULAorCS5yZXNldF9wb2xhcml0eQk9IDAsCisJLnNldF9wb3dlcgk9IG01bW9sc19zZXRfcG93ZXIsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIG01bW9sc19ib2FyZF9pbmZvID0geworCUkyQ19CT0FSRF9JTkZPKCJNNU1PTFMiLCAweDFGKSwKKwkucGxhdGZvcm1fZGF0YSA9ICZtNW1vbHNfcGxhdGRhdGEsCit9OworCitzdGF0aWMgc3RydWN0IHM1cF9maW1jX2lzcF9pbmZvIHVuaXZlcnNhbF9jYW1lcmFfc2Vuc29yc1tdID0geworCXsKKwkJLm11eF9pZAkJPSAwLAorCQkuZmxhZ3MJCT0gVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcgfAorCQkJCSAgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1csCisJCS5idXNfdHlwZQk9IEZJTUNfTUlQSV9DU0kyLAorCQkuYm9hcmRfaW5mbwk9ICZtNW1vbHNfYm9hcmRfaW5mbywKKwkJLmkyY19idXNfbnVtCT0gMCwKKwkJLmNsa19mcmVxdWVuY3kJPSAyMTYwMDAwMFVMLAorCQkuY3NpX2RhdGFfYWxpZ24JPSAzMiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzNXBfcGxhdGZvcm1fZmltYyBmaW1jX21kX3BsYXRkYXRhID0geworCS5pc3BfaW5mbwk9IHVuaXZlcnNhbF9jYW1lcmFfc2Vuc29ycywKKwkubnVtX2NsaWVudHMJPSBBUlJBWV9TSVpFKHVuaXZlcnNhbF9jYW1lcmFfc2Vuc29ycyksCit9OworCitzdGF0aWMgc3RydWN0IGdwaW8gdW5pdmVyc2FsX2NhbWVyYV9ncGlvc1tdID0geworCXsgR1BJT19DQU1fTEVWRUxfRU4oMSksCUdQSU9GX09VVF9JTklUX0hJR0gsICJDQU1fTFZMX0VOMSIgfSwKKwl7IEdQSU9fQ0FNX0xFVkVMX0VOKDIpLAlHUElPRl9PVVRfSU5JVF9MT1csICAiQ0FNX0xWTF9FTjIiIH0sCisJeyBHUElPX0NBTV84TV9JU1BfSU5ULAlHUElPRl9JTiwgICAgICAgICAgICAiOE1fSVNQX0lOVCIgIH0sCisJeyBHUElPX0NBTV9NRUdBX25SU1QsCUdQSU9GX09VVF9JTklUX0xPVywgICJDQU1fOE1fTlJTVCIgfSwKK307CisKK3N0YXRpYyB2b2lkIHVuaXZlcnNhbF9jYW1lcmFfaW5pdCh2b2lkKQoreworCXMzY19zZXRfcGxhdGRhdGEoJm1pcGlfY3Npc19wbGF0ZGF0YSwgc2l6ZW9mKG1pcGlfY3Npc19wbGF0ZGF0YSksCisJCQkgJnM1cF9kZXZpY2VfbWlwaV9jc2lzMCk7CisJczNjX3NldF9wbGF0ZGF0YSgmZmltY19tZF9wbGF0ZGF0YSwgIHNpemVvZihmaW1jX21kX3BsYXRkYXRhKSwKKwkJCSAmczVwX2RldmljZV9maW1jX21kKTsKKworCWlmIChncGlvX3JlcXVlc3RfYXJyYXkodW5pdmVyc2FsX2NhbWVyYV9ncGlvcywKKwkJCSAgICAgICBBUlJBWV9TSVpFKHVuaXZlcnNhbF9jYW1lcmFfZ3Bpb3MpKSkgeworCQlwcl9lcnIoIiVzOiBHUElPIHJlcXVlc3QgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXMzY19ncGlvX2NmZ3BpbihHUElPX0NBTV84TV9JU1BfSU5ULCBTM0NfR1BJT19TRk4oMHhmKSkpCisJCW01bW9sc19ib2FyZF9pbmZvLmlycSA9IGdwaW9fdG9faXJxKEdQSU9fQ0FNXzhNX0lTUF9JTlQpOworCWVsc2UKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY29uZmlndXJlIDhNX0lTUF9JTlQgR1BJT1xuIik7CisKKwkvKiBGcmVlIEdQSU9zIGNvbnRyb2xsZWQgZGlyZWN0bHkgYnkgdGhlIHNlbnNvciBkcml2ZXJzLiAqLworCWdwaW9fZnJlZShHUElPX0NBTV9NRUdBX25SU1QpOworCWdwaW9fZnJlZShHUElPX0NBTV84TV9JU1BfSU5UKTsKKworCWlmIChleHlub3M0X2ZpbWNfc2V0dXBfZ3BpbyhTNVBfQ0FNUE9SVF9BKSkKKwkJcHJfZXJyKCJDYW1lcmEgcG9ydCBBIHNldHVwIGZhaWxlZFxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp1bml2ZXJzYWxfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJLyogU2Ftc3VuZyBQbGF0Zm9ybSBEZXZpY2VzICovCisJJnM1cF9kZXZpY2VfbWlwaV9jc2lzMCwKKwkmczVwX2RldmljZV9maW1jMCwKKwkmczVwX2RldmljZV9maW1jMSwKKwkmczVwX2RldmljZV9maW1jMiwKKwkmczVwX2RldmljZV9maW1jMywKKwkmbW1jMF9maXhlZF92b2x0YWdlLAorCSZzM2NfZGV2aWNlX2hzbW1jMCwKKwkmczNjX2RldmljZV9oc21tYzIsCisJJnMzY19kZXZpY2VfaHNtbWMzLAorCSZzM2NfZGV2aWNlX2kyYzAsCisJJnMzY19kZXZpY2VfaTJjMywKKwkmczNjX2RldmljZV9pMmM1LAorCSZzNXBfZGV2aWNlX2kyY19oZG1pcGh5LAorCSZoZG1pX2ZpeGVkX3ZvbHRhZ2UsCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX1RWXSwKKwkmczVwX2RldmljZV9oZG1pLAorCSZzNXBfZGV2aWNlX3NkbywKKwkmczVwX2RldmljZV9taXhlciwKKworCS8qIFVuaXZlcnNhbCBEZXZpY2VzICovCisJJmkyY19ncGlvMTIsCisJJnVuaXZlcnNhbF9ncGlvX2tleXMsCisJJnM1cF9kZXZpY2Vfb25lbmFuZCwKKwkmczVwX2RldmljZV9maW1kMCwKKwkmczVwX2RldmljZV9tZmMsCisJJnM1cF9kZXZpY2VfbWZjX2wsCisJJnM1cF9kZXZpY2VfbWZjX3IsCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX01GQ10sCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDBdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLAorCSZjYW1faV9jb3JlX2ZpeGVkX3JlZ19kZXYsCisJJmNhbV9zX2lmX2ZpeGVkX3JlZ19kZXYsCisJJnM1cF9kZXZpY2VfZmltY19tZCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB1bml2ZXJzYWxfbWFwX2lvKHZvaWQpCit7CisJczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQX1ZBX0NISVBJRCk7CisJczNjMjR4eF9pbml0X2Nsb2NrcygyNDAwMDAwMCk7CisJczNjMjR4eF9pbml0X3VhcnRzKHVuaXZlcnNhbF91YXJ0Y2ZncywgQVJSQVlfU0laRSh1bml2ZXJzYWxfdWFydGNmZ3MpKTsKK30KKwordm9pZCBzNXBfdHZfc2V0dXAodm9pZCkKK3sKKwkvKiBkaXJlY3QgSFBEIHRvIEhETUkgY2hpcCAqLworCWdwaW9fcmVxdWVzdChFWFlOT1M0X0dQWDMoNyksICJocGQtcGx1ZyIpOworCisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoRVhZTk9TNF9HUFgzKDcpKTsKKwlzM2NfZ3Bpb19jZmdwaW4oRVhZTk9TNF9HUFgzKDcpLCBTM0NfR1BJT19TRk4oMHgzKSk7CisJczNjX2dwaW9fc2V0cHVsbChFWFlOT1M0X0dQWDMoNyksIFMzQ19HUElPX1BVTExfTk9ORSk7CisKKwkvKiBzZXR1cCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBUViBkZXZpY2VzICovCisJczVwX2RldmljZV9oZG1pLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLmRldjsKKwlzNXBfZGV2aWNlX21peGVyLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLmRldjsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF9yZXNlcnZlKHZvaWQpCit7CisJczVwX21mY19yZXNlcnZlX21lbSgweDQzMDAwMDAwLCA4IDw8IDIwLCAweDUxMDAwMDAwLCA4IDw8IDIwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF9tYWNoaW5lX2luaXQodm9pZCkKK3sKKwl1bml2ZXJzYWxfc2RoY2lfaW5pdCgpOworCXM1cF90dl9zZXR1cCgpOworCisJczNjX2kyYzBfc2V0X3BsYXRkYXRhKCZ1bml2ZXJzYWxfaTJjMF9wbGF0ZGF0YSk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgaTJjMV9kZXZzLCBBUlJBWV9TSVpFKGkyYzFfZGV2cykpOworCisJdW5pdmVyc2FsX3RzcF9pbml0KCk7CisJczNjX2kyYzNfc2V0X3BsYXRkYXRhKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDMsIGkyYzNfZGV2cywgQVJSQVlfU0laRShpMmMzX2RldnMpKTsKKworCXMzY19pMmM1X3NldF9wbGF0ZGF0YShOVUxMKTsKKwlzNXBfaTJjX2hkbWlwaHlfc2V0X3BsYXRkYXRhKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDUsIGkyYzVfZGV2cywgQVJSQVlfU0laRShpMmM1X2RldnMpKTsKKworCXM1cF9maW1kMF9zZXRfcGxhdGRhdGEoJnVuaXZlcnNhbF9sY2RfcGRhdGEpOworCisJdW5pdmVyc2FsX3RvdWNoa2V5X2luaXQoKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbyhJMkNfR1BJT19CVVNfMTIsIGkyY19ncGlvMTJfZGV2cywKKwkJCUFSUkFZX1NJWkUoaTJjX2dwaW8xMl9kZXZzKSk7CisKKwl1bml2ZXJzYWxfY2FtZXJhX2luaXQoKTsKKworCS8qIExhc3QgKi8KKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyh1bml2ZXJzYWxfZGV2aWNlcywgQVJSQVlfU0laRSh1bml2ZXJzYWxfZGV2aWNlcykpOworCisJczVwX2RldmljZV9tZmMuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9NRkNdLmRldjsKKwlzNXBfZGV2aWNlX2ZpbWQwLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfTENEMF0uZGV2OworCisJczVwX2RldmljZV9maW1jMC5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0uZGV2OworCXM1cF9kZXZpY2VfZmltYzEuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLmRldjsKKwlzNXBfZGV2aWNlX2ZpbWMyLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXS5kZXY7CisJczVwX2RldmljZV9maW1jMy5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0uZGV2OworCXM1cF9kZXZpY2VfbWlwaV9jc2lzMC5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0uZGV2OworfQorCitNQUNISU5FX1NUQVJUKFVOSVZFUlNBTF9DMjEwLCAiVU5JVkVSU0FMX0MyMTAiKQorCS8qIE1haW50YWluZXI6IEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+ICovCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLmluaXRfaXJxCT0gZXh5bm9zNF9pbml0X2lycSwKKwkubWFwX2lvCQk9IHVuaXZlcnNhbF9tYXBfaW8sCisJLmluaXRfbWFjaGluZQk9IHVuaXZlcnNhbF9tYWNoaW5lX2luaXQsCisJLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAorCS5yZXNlcnZlICAgICAgICA9ICZ1bml2ZXJzYWxfcmVzZXJ2ZSwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9tY3QuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21jdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MzQzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9tY3QuYwpAQCAtMCwwICsxLDQ3MSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21jdC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQgTUNUKE11bHRpLUNvcmUgVGltZXIpIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtbWN0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCitlbnVtIHsKKwlNQ1RfSU5UX1NQSSwKKwlNQ1RfSU5UX1BQSQorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX2NudF9wZXJfdGljazsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19yYXRlOworc3RhdGljIHVuc2lnbmVkIGludCBtY3RfaW50X3R5cGU7CisKK3N0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlIHsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQ7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWNoYXIgbmFtZVsxMF07Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UsIHBlcmNwdV9tY3RfdGljayk7CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfbWN0X3dyaXRlKHVuc2lnbmVkIGludCB2YWx1ZSwgdm9pZCAqYWRkcikKK3sKKwl2b2lkIF9faW9tZW0gKnN0YXRfYWRkcjsKKwl1MzIgbWFzazsKKwl1MzIgaTsKKworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgYWRkcik7CisKKwlpZiAobGlrZWx5KGFkZHIgPj0gRVhZTk9TNF9NQ1RfTF9CQVNFKDApKSkgeworCQl1MzIgYmFzZSA9ICh1MzIpIGFkZHIgJiBFWFlOT1M0X01DVF9MX01BU0s7CisJCXN3aXRjaCAoKHUzMikgYWRkciAmIH5FWFlOT1M0X01DVF9MX01BU0spIHsKKwkJY2FzZSAodTMyKSBNQ1RfTF9UQ09OX09GRlNFVDoKKwkJCXN0YXRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgYmFzZSArIE1DVF9MX1dTVEFUX09GRlNFVDsKKwkJCW1hc2sgPSAxIDw8IDM7CQkvKiBMX1RDT04gd3JpdGUgc3RhdHVzICovCisJCQlicmVhazsKKwkJY2FzZSAodTMyKSBNQ1RfTF9JQ05UQl9PRkZTRVQ6CisJCQlzdGF0X2FkZHIgPSAodm9pZCBfX2lvbWVtICopIGJhc2UgKyBNQ1RfTF9XU1RBVF9PRkZTRVQ7CisJCQltYXNrID0gMSA8PCAxOwkJLyogTF9JQ05UQiB3cml0ZSBzdGF0dXMgKi8KKwkJCWJyZWFrOworCQljYXNlICh1MzIpIE1DVF9MX1RDTlRCX09GRlNFVDoKKwkJCXN0YXRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgYmFzZSArIE1DVF9MX1dTVEFUX09GRlNFVDsKKwkJCW1hc2sgPSAxIDw8IDA7CQkvKiBMX1RDTlRCIHdyaXRlIHN0YXR1cyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKCh1MzIpIGFkZHIpIHsKKwkJY2FzZSAodTMyKSBFWFlOT1M0X01DVF9HX1RDT046CisJCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9HX1dTVEFUOworCQkJbWFzayA9IDEgPDwgMTY7CQkvKiBHX1RDT04gd3JpdGUgc3RhdHVzICovCisJCQlicmVhazsKKwkJY2FzZSAodTMyKSBFWFlOT1M0X01DVF9HX0NPTVAwX0w6CisJCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9HX1dTVEFUOworCQkJbWFzayA9IDEgPDwgMDsJCS8qIEdfQ09NUDBfTCB3cml0ZSBzdGF0dXMgKi8KKwkJCWJyZWFrOworCQljYXNlICh1MzIpIEVYWU5PUzRfTUNUX0dfQ09NUDBfVToKKwkJCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0dfV1NUQVQ7CisJCQltYXNrID0gMSA8PCAxOwkJLyogR19DT01QMF9VIHdyaXRlIHN0YXR1cyAqLworCQkJYnJlYWs7CisJCWNhc2UgKHUzMikgRVhZTk9TNF9NQ1RfR19DT01QMF9BRERfSU5DUjoKKwkJCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0dfV1NUQVQ7CisJCQltYXNrID0gMSA8PCAyOwkJLyogR19DT01QMF9BRERfSU5DUiB3IHN0YXR1cyAqLworCQkJYnJlYWs7CisJCWNhc2UgKHUzMikgRVhZTk9TNF9NQ1RfR19DTlRfTDoKKwkJCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0dfQ05UX1dTVEFUOworCQkJbWFzayA9IDEgPDwgMDsJCS8qIEdfQ05UX0wgd3JpdGUgc3RhdHVzICovCisJCQlicmVhazsKKwkJY2FzZSAodTMyKSBFWFlOT1M0X01DVF9HX0NOVF9VOgorCQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfR19DTlRfV1NUQVQ7CisJCQltYXNrID0gMSA8PCAxOwkJLyogR19DTlRfVSB3cml0ZSBzdGF0dXMgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogV2FpdCBtYXhpbXVtIDEgbXMgdW50aWwgd3JpdHRlbiB2YWx1ZXMgYXJlIGFwcGxpZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbG9vcHNfcGVyX2ppZmZ5IC8gMTAwMCAqIEhaOyBpKyspCisJCWlmIChfX3Jhd19yZWFkbChzdGF0X2FkZHIpICYgbWFzaykgeworCQkJX19yYXdfd3JpdGVsKG1hc2ssIHN0YXRfYWRkcik7CisJCQlyZXR1cm47CisJCX0KKworCXBhbmljKCJNQ1QgaGFuZ3MgYWZ0ZXIgd3JpdGluZyAlZCAoYWRkcjoweCUwOHgpXG4iLCB2YWx1ZSwgKHUzMilhZGRyKTsKK30KKworLyogQ2xvY2tzb3VyY2UgaGFuZGxpbmcgKi8KK3N0YXRpYyB2b2lkIGV4eW5vczRfbWN0X2ZyY19zdGFydCh1MzIgaGksIHUzMiBsbykKK3sKKwl1MzIgcmVnOworCisJZXh5bm9zNF9tY3Rfd3JpdGUobG8sIEVYWU5PUzRfTUNUX0dfQ05UX0wpOworCWV4eW5vczRfbWN0X3dyaXRlKGhpLCBFWFlOT1M0X01DVF9HX0NOVF9VKTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKEVYWU5PUzRfTUNUX0dfVENPTik7CisJcmVnIHw9IE1DVF9HX1RDT05fU1RBUlQ7CisJZXh5bm9zNF9tY3Rfd3JpdGUocmVnLCBFWFlOT1M0X01DVF9HX1RDT04pOworfQorCitzdGF0aWMgY3ljbGVfdCBleHlub3M0X2ZyY19yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJdW5zaWduZWQgaW50IGxvLCBoaTsKKwl1MzIgaGkyID0gX19yYXdfcmVhZGwoRVhZTk9TNF9NQ1RfR19DTlRfVSk7CisKKwlkbyB7CisJCWhpID0gaGkyOworCQlsbyA9IF9fcmF3X3JlYWRsKEVYWU5PUzRfTUNUX0dfQ05UX0wpOworCQloaTIgPSBfX3Jhd19yZWFkbChFWFlOT1M0X01DVF9HX0NOVF9VKTsKKwl9IHdoaWxlIChoaSAhPSBoaTIpOworCisJcmV0dXJuICgoY3ljbGVfdCloaSA8PCAzMikgfCBsbzsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9mcmNfcmVzdW1lKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJZXh5bm9zNF9tY3RfZnJjX3N0YXJ0KDAsIDApOworfQorCitzdHJ1Y3QgY2xvY2tzb3VyY2UgbWN0X2ZyYyA9IHsKKwkubmFtZQkJPSAibWN0LWZyYyIsCisJLnJhdGluZwkJPSA0MDAsCisJLnJlYWQJCT0gZXh5bm9zNF9mcmNfcmVhZCwKKwkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCisJLnJlc3VtZQkJPSBleHlub3M0X2ZyY19yZXN1bWUsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNF9jbG9ja3NvdXJjZV9pbml0KHZvaWQpCit7CisJZXh5bm9zNF9tY3RfZnJjX3N0YXJ0KDAsIDApOworCisJaWYgKGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZtY3RfZnJjLCBjbGtfcmF0ZSkpCisJCXBhbmljKCIlczogY2FuJ3QgcmVnaXN0ZXIgY2xvY2tzb3VyY2VcbiIsIG1jdF9mcmMubmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfbWN0X2NvbXAwX3N0b3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdGNvbjsKKworCXRjb24gPSBfX3Jhd19yZWFkbChFWFlOT1M0X01DVF9HX1RDT04pOworCXRjb24gJj0gfihNQ1RfR19UQ09OX0NPTVAwX0VOQUJMRSB8IE1DVF9HX1RDT05fQ09NUDBfQVVUT19JTkMpOworCisJZXh5bm9zNF9tY3Rfd3JpdGUodGNvbiwgRVhZTk9TNF9NQ1RfR19UQ09OKTsKKwlleHlub3M0X21jdF93cml0ZSgwLCBFWFlOT1M0X01DVF9HX0lOVF9FTkIpOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0X21jdF9jb21wMF9zdGFydChlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBjeWNsZXMpCit7CisJdW5zaWduZWQgaW50IHRjb247CisJY3ljbGVfdCBjb21wX2N5Y2xlOworCisJdGNvbiA9IF9fcmF3X3JlYWRsKEVYWU5PUzRfTUNUX0dfVENPTik7CisKKwlpZiAobW9kZSA9PSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykgeworCQl0Y29uIHw9IE1DVF9HX1RDT05fQ09NUDBfQVVUT19JTkM7CisJCWV4eW5vczRfbWN0X3dyaXRlKGN5Y2xlcywgRVhZTk9TNF9NQ1RfR19DT01QMF9BRERfSU5DUik7CisJfQorCisJY29tcF9jeWNsZSA9IGV4eW5vczRfZnJjX3JlYWQoJm1jdF9mcmMpICsgY3ljbGVzOworCWV4eW5vczRfbWN0X3dyaXRlKCh1MzIpY29tcF9jeWNsZSwgRVhZTk9TNF9NQ1RfR19DT01QMF9MKTsKKwlleHlub3M0X21jdF93cml0ZSgodTMyKShjb21wX2N5Y2xlID4+IDMyKSwgRVhZTk9TNF9NQ1RfR19DT01QMF9VKTsKKworCWV4eW5vczRfbWN0X3dyaXRlKDB4MSwgRVhZTk9TNF9NQ1RfR19JTlRfRU5CKTsKKworCXRjb24gfD0gTUNUX0dfVENPTl9DT01QMF9FTkFCTEU7CisJZXh5bm9zNF9tY3Rfd3JpdGUodGNvbiAsIEVYWU5PUzRfTUNUX0dfVENPTik7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9jb21wX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAorCQkJCSAgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJZXh5bm9zNF9tY3RfY29tcDBfc3RhcnQoZXZ0LT5tb2RlLCBjeWNsZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfY29tcF9zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlleHlub3M0X21jdF9jb21wMF9zdG9wKCk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQlleHlub3M0X21jdF9jb21wMF9zdGFydChtb2RlLCBjbGtfY250X3Blcl90aWNrKTsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6CisJY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6CisJY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1JFU1VNRToKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBtY3RfY29tcF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm1jdC1jb21wIiwKKwkuZmVhdHVyZXMgICAgICAgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCisJLnJhdGluZwkJPSAyNTAsCisJLnNldF9uZXh0X2V2ZW50CT0gZXh5bm9zNF9jb21wX3NldF9uZXh0X2V2ZW50LAorCS5zZXRfbW9kZQk9IGV4eW5vczRfY29tcF9zZXRfbW9kZSwKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBleHlub3M0X21jdF9jb21wX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gZGV2X2lkOworCisJZXh5bm9zNF9tY3Rfd3JpdGUoMHgxLCBFWFlOT1M0X01DVF9HX0lOVF9DU1RBVCk7CisKKwlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWN0X2NvbXBfZXZlbnRfaXJxID0geworCS5uYW1lCQk9ICJtY3RfY29tcF9pcnEiLAorCS5mbGFncwkJPSBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAorCS5oYW5kbGVyCT0gZXh5bm9zNF9tY3RfY29tcF9pc3IsCisJLmRldl9pZAkJPSAmbWN0X2NvbXBfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgZXh5bm9zNF9jbG9ja2V2ZW50X2luaXQodm9pZCkKK3sKKwljbGtfY250X3Blcl90aWNrID0gY2xrX3JhdGUgLyAyCS8gSFo7CisKKwljbG9ja2V2ZW50c19jYWxjX211bHRfc2hpZnQoJm1jdF9jb21wX2RldmljZSwgY2xrX3JhdGUgLyAyLCA1KTsKKwltY3RfY29tcF9kZXZpY2UubWF4X2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweGZmZmZmZmZmLCAmbWN0X2NvbXBfZGV2aWNlKTsKKwltY3RfY29tcF9kZXZpY2UubWluX2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweGYsICZtY3RfY29tcF9kZXZpY2UpOworCW1jdF9jb21wX2RldmljZS5jcHVtYXNrID0gY3B1bWFza19vZigwKTsKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJm1jdF9jb21wX2RldmljZSk7CisKKwlzZXR1cF9pcnEoSVJRX01DVF9HMCwgJm1jdF9jb21wX2V2ZW50X2lycSk7Cit9CisKKyNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCisvKiBDbG9jayBldmVudCBoYW5kbGluZyAqLworc3RhdGljIHZvaWQgZXh5bm9zNF9tY3RfdGlja19zdG9wKHN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlICptZXZ0KQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgbWFzayA9IE1DVF9MX1RDT05fSU5UX1NUQVJUIHwgTUNUX0xfVENPTl9USU1FUl9TVEFSVDsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBtZXZ0LT5iYXNlICsgTUNUX0xfVENPTl9PRkZTRVQ7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKTsKKwlpZiAodG1wICYgbWFzaykgeworCQl0bXAgJj0gfm1hc2s7CisJCWV4eW5vczRfbWN0X3dyaXRlKHRtcCwgYWRkcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBleHlub3M0X21jdF90aWNrX3N0YXJ0KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAorCQkJCSAgIHN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlICptZXZ0KQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJZXh5bm9zNF9tY3RfdGlja19zdG9wKG1ldnQpOworCisJdG1wID0gKDEgPDwgMzEpIHwgY3ljbGVzOwkvKiBNQ1RfTF9VUERBVEVfSUNOVEIgKi8KKworCS8qIHVwZGF0ZSBpbnRlcnJ1cHQgY291bnQgYnVmZmVyICovCisJZXh5bm9zNF9tY3Rfd3JpdGUodG1wLCBtZXZ0LT5iYXNlICsgTUNUX0xfSUNOVEJfT0ZGU0VUKTsKKworCS8qIGVuYWJsZSBNQ1QgdGljayBpbnRlcnJ1cHQgKi8KKwlleHlub3M0X21jdF93cml0ZSgweDEsIG1ldnQtPmJhc2UgKyBNQ1RfTF9JTlRfRU5CX09GRlNFVCk7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChtZXZ0LT5iYXNlICsgTUNUX0xfVENPTl9PRkZTRVQpOworCXRtcCB8PSBNQ1RfTF9UQ09OX0lOVF9TVEFSVCB8IE1DVF9MX1RDT05fVElNRVJfU1RBUlQgfAorCSAgICAgICBNQ1RfTF9UQ09OX0lOVEVSVkFMX01PREU7CisJZXh5bm9zNF9tY3Rfd3JpdGUodG1wLCBtZXZ0LT5iYXNlICsgTUNUX0xfVENPTl9PRkZTRVQpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfdGlja19zZXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGN5Y2xlcywKKwkJCQkgICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworCXN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlICptZXZ0ID0gdGhpc19jcHVfcHRyKCZwZXJjcHVfbWN0X3RpY2spOworCisJZXh5bm9zNF9tY3RfdGlja19zdGFydChjeWNsZXMsIG1ldnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHlub3M0X3RpY2tfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQgPSB0aGlzX2NwdV9wdHIoJnBlcmNwdV9tY3RfdGljayk7CisKKwlleHlub3M0X21jdF90aWNrX3N0b3AobWV2dCk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQlleHlub3M0X21jdF90aWNrX3N0YXJ0KGNsa19jbnRfcGVyX3RpY2ssIG1ldnQpOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9tY3RfdGlja19jbGVhcihzdHJ1Y3QgbWN0X2Nsb2NrX2V2ZW50X2RldmljZSAqbWV2dCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSBtZXZ0LT5ldnQ7CisKKwkvKgorCSAqIFRoaXMgaXMgZm9yIHN1cHBvcnRpbmcgb25lc2hvdCBtb2RlLgorCSAqIE1jdCB3b3VsZCBnZW5lcmF0ZSBpbnRlcnJ1cHQgcGVyaW9kaWNhbGx5CisJICogd2l0aG91dCBleHBsaWNpdCBzdG9wcGluZy4KKwkgKi8KKwlpZiAoZXZ0LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1BFUklPRElDKQorCQlleHlub3M0X21jdF90aWNrX3N0b3AobWV2dCk7CisKKwkvKiBDbGVhciB0aGUgTUNUIHRpY2sgaW50ZXJydXB0ICovCisJaWYgKF9fcmF3X3JlYWRsKG1ldnQtPmJhc2UgKyBNQ1RfTF9JTlRfQ1NUQVRfT0ZGU0VUKSAmIDEpIHsKKwkJZXh5bm9zNF9tY3Rfd3JpdGUoMHgxLCBtZXZ0LT5iYXNlICsgTUNUX0xfSU5UX0NTVEFUX09GRlNFVCk7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IGV4eW5vczRfbWN0X3RpY2tfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbWN0X2Nsb2NrX2V2ZW50X2RldmljZSAqbWV2dCA9IGRldl9pZDsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSBtZXZ0LT5ldnQ7CisKKwlleHlub3M0X21jdF90aWNrX2NsZWFyKG1ldnQpOworCisJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1jdF90aWNrMF9ldmVudF9pcnEgPSB7CisJLm5hbWUJCT0gIm1jdF90aWNrMF9pcnEiLAorCS5mbGFncwkJPSBJUlFGX1RJTUVSIHwgSVJRRl9OT0JBTEFOQ0lORywKKwkuaGFuZGxlcgk9IGV4eW5vczRfbWN0X3RpY2tfaXNyLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWN0X3RpY2sxX2V2ZW50X2lycSA9IHsKKwkubmFtZQkJPSAibWN0X3RpY2sxX2lycSIsCisJLmZsYWdzCQk9IElSUUZfVElNRVIgfCBJUlFGX05PQkFMQU5DSU5HLAorCS5oYW5kbGVyCT0gZXh5bm9zNF9tY3RfdGlja19pc3IsCit9OworCitzdGF0aWMgdm9pZCBleHlub3M0X21jdF90aWNrX2luaXQoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworCXN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlICptZXZ0OworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwltZXZ0ID0gdGhpc19jcHVfcHRyKCZwZXJjcHVfbWN0X3RpY2spOworCW1ldnQtPmV2dCA9IGV2dDsKKworCW1ldnQtPmJhc2UgPSBFWFlOT1M0X01DVF9MX0JBU0UoY3B1KTsKKwlzcHJpbnRmKG1ldnQtPm5hbWUsICJtY3RfdGljayVkIiwgY3B1KTsKKworCWV2dC0+bmFtZSA9IG1ldnQtPm5hbWU7CisJZXZ0LT5jcHVtYXNrID0gY3B1bWFza19vZihjcHUpOworCWV2dC0+c2V0X25leHRfZXZlbnQgPSBleHlub3M0X3RpY2tfc2V0X25leHRfZXZlbnQ7CisJZXZ0LT5zZXRfbW9kZSA9IGV4eW5vczRfdGlja19zZXRfbW9kZTsKKwlldnQtPmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9UOworCWV2dC0+cmF0aW5nID0gNDUwOworCisJY2xvY2tldmVudHNfY2FsY19tdWx0X3NoaWZ0KGV2dCwgY2xrX3JhdGUgLyAyLCA1KTsKKwlldnQtPm1heF9kZWx0YV9ucyA9CisJCWNsb2NrZXZlbnRfZGVsdGEybnMoMHg3ZmZmZmZmZiwgZXZ0KTsKKwlldnQtPm1pbl9kZWx0YV9ucyA9CisJCWNsb2NrZXZlbnRfZGVsdGEybnMoMHhmLCBldnQpOworCisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGV2dCk7CisKKwlleHlub3M0X21jdF93cml0ZSgweDEsIG1ldnQtPmJhc2UgKyBNQ1RfTF9UQ05UQl9PRkZTRVQpOworCisJaWYgKG1jdF9pbnRfdHlwZSA9PSBNQ1RfSU5UX1NQSSkgeworCQlpZiAoY3B1ID09IDApIHsKKwkJCW1jdF90aWNrMF9ldmVudF9pcnEuZGV2X2lkID0gbWV2dDsKKwkJCWV2dC0+aXJxID0gSVJRX01DVF9MMDsKKwkJCXNldHVwX2lycShJUlFfTUNUX0wwLCAmbWN0X3RpY2swX2V2ZW50X2lycSk7CisJCX0gZWxzZSB7CisJCQltY3RfdGljazFfZXZlbnRfaXJxLmRldl9pZCA9IG1ldnQ7CisJCQlldnQtPmlycSA9IElSUV9NQ1RfTDE7CisJCQlzZXR1cF9pcnEoSVJRX01DVF9MMSwgJm1jdF90aWNrMV9ldmVudF9pcnEpOworCQkJaXJxX3NldF9hZmZpbml0eShJUlFfTUNUX0wxLCBjcHVtYXNrX29mKDEpKTsKKwkJfQorCX0gZWxzZSB7CisJCWVuYWJsZV9wZXJjcHVfaXJxKElSUV9NQ1RfTE9DQUxUSU1FUiwgMCk7CisJfQorfQorCisvKiBTZXR1cCB0aGUgbG9jYWwgY2xvY2sgZXZlbnRzIGZvciBhIENQVSAqLworaW50IF9fY3B1aW5pdCBsb2NhbF90aW1lcl9zZXR1cChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJZXh5bm9zNF9tY3RfdGlja19pbml0KGV2dCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBsb2NhbF90aW1lcl9zdG9wKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlldnQtPnNldF9tb2RlKENMT0NLX0VWVF9NT0RFX1VOVVNFRCwgZXZ0KTsKKwlpZiAobWN0X2ludF90eXBlID09IE1DVF9JTlRfU1BJKQorCQlkaXNhYmxlX2lycShldnQtPmlycSk7CisJZWxzZQorCQlkaXNhYmxlX3BlcmNwdV9pcnEoSVJRX01DVF9MT0NBTFRJTUVSKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTE9DQUxfVElNRVJTICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBleHlub3M0X3RpbWVyX3Jlc291cmNlcyh2b2lkKQoreworCXN0cnVjdCBjbGsgKm1jdF9jbGs7CisJbWN0X2NsayA9IGNsa19nZXQoTlVMTCwgInh0YWwiKTsKKworCWNsa19yYXRlID0gY2xrX2dldF9yYXRlKG1jdF9jbGspOworCisJaWYgKG1jdF9pbnRfdHlwZSA9PSBNQ1RfSU5UX1BQSSkgeworCQlpbnQgZXJyOworCisJCWVyciA9IHJlcXVlc3RfcGVyY3B1X2lycShJUlFfTUNUX0xPQ0FMVElNRVIsCisJCQkJCSBleHlub3M0X21jdF90aWNrX2lzciwgIk1DVCIsCisJCQkJCSAmcGVyY3B1X21jdF90aWNrKTsKKwkJV0FSTihlcnIsICJNQ1Q6IGNhbid0IHJlcXVlc3QgSVJRICVkICglZClcbiIsCisJCSAgICAgSVJRX01DVF9MT0NBTFRJTUVSLCBlcnIpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczRfdGltZXJfaW5pdCh2b2lkKQoreworCWlmIChzb2NfaXNfZXh5bm9zNDIxMCgpKQorCQltY3RfaW50X3R5cGUgPSBNQ1RfSU5UX1NQSTsKKwllbHNlCisJCW1jdF9pbnRfdHlwZSA9IE1DVF9JTlRfUFBJOworCisJZXh5bm9zNF90aW1lcl9yZXNvdXJjZXMoKTsKKwlleHlub3M0X2Nsb2Nrc291cmNlX2luaXQoKTsKKwlleHlub3M0X2Nsb2NrZXZlbnRfaW5pdCgpOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGV4eW5vczRfdGltZXIgPSB7CisJLmluaXQJCT0gZXh5bm9zNF90aW1lcl9pbml0LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3BsYXRzbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZmYjJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvcGxhdHNtcC5jCkBAIC0wLDAgKzEsMjIzIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvcGxhdHNtcC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogQ2xvbmVkIGZyb20gbGludXgvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9wbGF0c21wLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEFSTSBMdGQuCisgKiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorI2luY2x1ZGUgPGFzbS9zbXBfc2N1Lmg+CisjaW5jbHVkZSA8YXNtL3VuaWZpZWQuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtcG11Lmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorCitleHRlcm4gdW5zaWduZWQgaW50IGdpY19iYW5rX29mZnNldDsKK2V4dGVybiB2b2lkIGV4eW5vczRfc2Vjb25kYXJ5X3N0YXJ0dXAodm9pZCk7CisKKyNkZWZpbmUgQ1BVMV9CT09UX1JFRwkJKHNhbXN1bmdfcmV2KCkgPT0gRVhZTk9TNDIxMF9SRVZfMV8xID8gXAorCQkJCVM1UF9JTkZPUk01IDogUzVQX1ZBX1NZU1JBTSkKKworLyoKKyAqIGNvbnRyb2wgZm9yIHdoaWNoIGNvcmUgaXMgdGhlIG5leHQgdG8gY29tZSBvdXQgb2YgdGhlIHNlY29uZGFyeQorICogYm9vdCAiaG9sZGluZyBwZW4iCisgKi8KKwordm9sYXRpbGUgaW50IF9fY3B1aW5pdGRhdGEgcGVuX3JlbGVhc2UgPSAtMTsKKworLyoKKyAqIFdyaXRlIHBlbl9yZWxlYXNlIGluIGEgd2F5IHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSB2aXNpYmxlIHRvIGFsbAorICogb2JzZXJ2ZXJzLCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciB0aGV5J3JlIHRha2luZyBwYXJ0IGluIGNvaGVyZW5jeQorICogb3Igbm90LiAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBob3RwbHVnIGNvZGUgdG8gd29yayByZWxpYWJseS4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfcGVuX3JlbGVhc2UoaW50IHZhbCkKK3sKKwlwZW5fcmVsZWFzZSA9IHZhbDsKKwlzbXBfd21iKCk7CisJX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKCh2b2lkICopJnBlbl9yZWxlYXNlLCBzaXplb2YocGVuX3JlbGVhc2UpKTsKKwlvdXRlcl9jbGVhbl9yYW5nZShfX3BhKCZwZW5fcmVsZWFzZSksIF9fcGEoJnBlbl9yZWxlYXNlICsgMSkpOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzY3VfYmFzZV9hZGRyKHZvaWQpCit7CisJcmV0dXJuICh2b2lkIF9faW9tZW0gKikoUzVQX1ZBX1NDVSk7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYm9vdF9sb2NrKTsKKworc3RhdGljIHZvaWQgX19jcHVpbml0IGV4eW5vczRfZ2ljX3NlY29uZGFyeV9pbml0KHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpkaXN0X2Jhc2UgPSBTNVBfVkFfR0lDX0RJU1QgKworCQkJCShnaWNfYmFua19vZmZzZXQgKiBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXZvaWQgX19pb21lbSAqY3B1X2Jhc2UgPSBTNVBfVkFfR0lDX0NQVSArCisJCQkJKGdpY19iYW5rX29mZnNldCAqIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJaW50IGk7CisKKwkvKgorCSAqIERlYWwgd2l0aCB0aGUgYmFua2VkIFBQSSBhbmQgU0dJIGludGVycnVwdHMgLSBkaXNhYmxlIGFsbAorCSAqIFBQSSBpbnRlcnJ1cHRzLCBlbnN1cmUgYWxsIFNHSSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgorCSAqLworCV9fcmF3X3dyaXRlbCgweGZmZmYwMDAwLCBkaXN0X2Jhc2UgKyBHSUNfRElTVF9FTkFCTEVfQ0xFQVIpOworCV9fcmF3X3dyaXRlbCgweDAwMDBmZmZmLCBkaXN0X2Jhc2UgKyBHSUNfRElTVF9FTkFCTEVfU0VUKTsKKworCS8qCisJICogU2V0IHByaW9yaXR5IG9uIFBQSSBhbmQgU0dJIGludGVycnVwdHMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gNCkKKwkJX19yYXdfd3JpdGVsKDB4YTBhMGEwYTAsIGRpc3RfYmFzZSArIEdJQ19ESVNUX1BSSSArIGkgKiA0IC8gNCk7CisKKwlfX3Jhd193cml0ZWwoMHhmMCwgY3B1X2Jhc2UgKyBHSUNfQ1BVX1BSSU1BU0spOworCV9fcmF3X3dyaXRlbCgxLCBjcHVfYmFzZSArIEdJQ19DUFVfQ1RSTCk7Cit9CisKK3ZvaWQgX19jcHVpbml0IHBsYXRmb3JtX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiBpZiBhbnkgaW50ZXJydXB0cyBhcmUgYWxyZWFkeSBlbmFibGVkIGZvciB0aGUgcHJpbWFyeQorCSAqIGNvcmUgKGUuZy4gdGltZXIgaXJxKSwgdGhlbiB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBlbmFibGVkCisJICogZm9yIHVzOiBkbyBzbworCSAqLworCWV4eW5vczRfZ2ljX3NlY29uZGFyeV9pbml0KCk7CisKKwkvKgorCSAqIGxldCB0aGUgcHJpbWFyeSBwcm9jZXNzb3Iga25vdyB3ZSdyZSBvdXQgb2YgdGhlCisJICogcGVuLCB0aGVuIGhlYWQgb2ZmIGludG8gdGhlIEMgZW50cnkgcG9pbnQKKwkgKi8KKwl3cml0ZV9wZW5fcmVsZWFzZSgtMSk7CisKKwkvKgorCSAqIFN5bmNocm9uaXNlIHdpdGggdGhlIGJvb3QgdGhyZWFkLgorCSAqLworCXNwaW5fbG9jaygmYm9vdF9sb2NrKTsKKwlzcGluX3VubG9jaygmYm9vdF9sb2NrKTsKK30KKworaW50IF9fY3B1aW5pdCBib290X3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyoKKwkgKiBTZXQgc3luY2hyb25pc2F0aW9uIHN0YXRlIGJldHdlZW4gdGhpcyBib290IHByb2Nlc3NvcgorCSAqIGFuZCB0aGUgc2Vjb25kYXJ5IG9uZQorCSAqLworCXNwaW5fbG9jaygmYm9vdF9sb2NrKTsKKworCS8qCisJICogVGhlIHNlY29uZGFyeSBwcm9jZXNzb3IgaXMgd2FpdGluZyB0byBiZSByZWxlYXNlZCBmcm9tCisJICogdGhlIGhvbGRpbmcgcGVuIC0gcmVsZWFzZSBpdCwgdGhlbiB3YWl0IGZvciBpdCB0byBmbGFnCisJICogdGhhdCBpdCBoYXMgYmVlbiByZWxlYXNlZCBieSByZXNldHRpbmcgcGVuX3JlbGVhc2UuCisJICoKKwkgKiBOb3RlIHRoYXQgInBlbl9yZWxlYXNlIiBpcyB0aGUgaGFyZHdhcmUgQ1BVIElELCB3aGVyZWFzCisJICogImNwdSIgaXMgTGludXgncyBpbnRlcm5hbCBJRC4KKwkgKi8KKwl3cml0ZV9wZW5fcmVsZWFzZShjcHVfbG9naWNhbF9tYXAoY3B1KSk7CisKKwlpZiAoIShfX3Jhd19yZWFkbChTNVBfQVJNX0NPUkUxX1NUQVRVUykgJiBTNVBfQ09SRV9MT0NBTF9QV1JfRU4pKSB7CisJCV9fcmF3X3dyaXRlbChTNVBfQ09SRV9MT0NBTF9QV1JfRU4sCisJCQkgICAgIFM1UF9BUk1fQ09SRTFfQ09ORklHVVJBVElPTik7CisKKwkJdGltZW91dCA9IDEwOworCisJCS8qIHdhaXQgbWF4IDEwIG1zIHVudGlsIGNwdTEgaXMgb24gKi8KKwkJd2hpbGUgKChfX3Jhd19yZWFkbChTNVBfQVJNX0NPUkUxX1NUQVRVUykKKwkJCSYgUzVQX0NPUkVfTE9DQUxfUFdSX0VOKSAhPSBTNVBfQ09SRV9MT0NBTF9QV1JfRU4pIHsKKwkJCWlmICh0aW1lb3V0LS0gPT0gMCkKKwkJCQlicmVhazsKKworCQkJbWRlbGF5KDEpOworCQl9CisKKwkJaWYgKHRpbWVvdXQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjcHUxIHBvd2VyIGVuYWJsZSBmYWlsZWQiKTsKKwkJCXNwaW5fdW5sb2NrKCZib290X2xvY2spOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisJLyoKKwkgKiBTZW5kIHRoZSBzZWNvbmRhcnkgQ1BVIGEgc29mdCBpbnRlcnJ1cHQsIHRoZXJlYnkgY2F1c2luZworCSAqIHRoZSBib290IG1vbml0b3IgdG8gcmVhZCB0aGUgc3lzdGVtIHdpZGUgZmxhZ3MgcmVnaXN0ZXIsCisJICogYW5kIGJyYW5jaCB0byB0aGUgYWRkcmVzcyBmb3VuZCB0aGVyZS4KKwkgKi8KKworCXRpbWVvdXQgPSBqaWZmaWVzICsgKDEgKiBIWik7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXNtcF9ybWIoKTsKKworCQlfX3Jhd193cml0ZWwoQlNZTSh2aXJ0X3RvX3BoeXMoZXh5bm9zNF9zZWNvbmRhcnlfc3RhcnR1cCkpLAorCQkJQ1BVMV9CT09UX1JFRyk7CisJCWdpY19yYWlzZV9zb2Z0aXJxKGNwdW1hc2tfb2YoY3B1KSwgMSk7CisKKwkJaWYgKHBlbl9yZWxlYXNlID09IC0xKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKgorCSAqIG5vdyB0aGUgc2Vjb25kYXJ5IGNvcmUgaXMgc3RhcnRpbmcgdXAgbGV0IGl0IHJ1biBpdHMKKwkgKiBjYWxpYnJhdGlvbnMsIHRoZW4gd2FpdCBmb3IgaXQgdG8gZmluaXNoCisJICovCisJc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7CisKKwlyZXR1cm4gcGVuX3JlbGVhc2UgIT0gLTEgPyAtRU5PU1lTIDogMDsKK30KKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIENQVSBwb3NzaWJsZSBtYXAgZWFybHkgLSB0aGlzIGRlc2NyaWJlcyB0aGUgQ1BVcworICogd2hpY2ggbWF5IGJlIHByZXNlbnQgb3IgYmVjb21lIHByZXNlbnQgaW4gdGhlIHN5c3RlbS4KKyAqLworCit2b2lkIF9faW5pdCBzbXBfaW5pdF9jcHVzKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpzY3VfYmFzZSA9IHNjdV9iYXNlX2FkZHIoKTsKKwl1bnNpZ25lZCBpbnQgaSwgbmNvcmVzOworCisJbmNvcmVzID0gc2N1X2Jhc2UgPyBzY3VfZ2V0X2NvcmVfY291bnQoc2N1X2Jhc2UpIDogMTsKKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmIChuY29yZXMgPiBucl9jcHVfaWRzKSB7CisJCXByX3dhcm4oIlNNUDogJXUgY29yZXMgZ3JlYXRlciB0aGFuIG1heGltdW0gKCV1KSwgY2xpcHBpbmdcbiIsCisJCQluY29yZXMsIG5yX2NwdV9pZHMpOworCQluY29yZXMgPSBucl9jcHVfaWRzOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuY29yZXM7IGkrKykKKwkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKKworCXNldF9zbXBfY3Jvc3NfY2FsbChnaWNfcmFpc2Vfc29mdGlycSk7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCisJc2N1X2VuYWJsZShzY3VfYmFzZV9hZGRyKCkpOworCisJLyoKKwkgKiBXcml0ZSB0aGUgYWRkcmVzcyBvZiBzZWNvbmRhcnkgc3RhcnR1cCBpbnRvIHRoZQorCSAqIHN5c3RlbS13aWRlIGZsYWdzIHJlZ2lzdGVyLiBUaGUgYm9vdCBtb25pdG9yIHdhaXRzCisJICogdW50aWwgaXQgcmVjZWl2ZXMgYSBzb2Z0IGludGVycnVwdCwgYW5kIHRoZW4gdGhlCisJICogc2Vjb25kYXJ5IENQVSBicmFuY2hlcyB0byB0aGlzIGFkZHJlc3MuCisJICovCisJX19yYXdfd3JpdGVsKEJTWU0odmlydF90b19waHlzKGV4eW5vczRfc2Vjb25kYXJ5X3N0YXJ0dXApKSwKKwkJCUNQVTFfQk9PVF9SRUcpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvcG0uYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5YTQzNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3BtLmMKQEAgLTAsMCArMSw0MjggQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQyMTAgLSBQb3dlciBNYW5hZ2VtZW50IHN1cHBvcnQKKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0uYworICogQ29weXJpZ2h0IChjKSAyMDA2IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L3BsbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zcm9tLmg+CisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtcG11Lmg+CisjaW5jbHVkZSA8bWFjaC9wbS1jb3JlLmg+CisjaW5jbHVkZSA8bWFjaC9wbXUuaD4KKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGV4eW5vczRfc2V0X2Nsa3NyY1tdID0geworCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19UT1AJCQksIC52YWwgPSAweDAwMDAwMDAxLCB9LAorCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19DQU0JCQksIC52YWwgPSAweDExMTExMTExLCB9LAorCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19UVgkJCSwgLnZhbCA9IDB4MDAwMDAxMTEsIH0sCisJeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX0xDRDAJCQksIC52YWwgPSAweDAwMDAxMTExLCB9LAorCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19NQVVESU8JCQksIC52YWwgPSAweDAwMDAwMDAxLCB9LAorCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19GU1lTCQkJLCAudmFsID0gMHgwMTAxMTExMSwgfSwKKwl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfUEVSSUwwCQkJLCAudmFsID0gMHgwMTExMTExMSwgfSwKKwl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfUEVSSUwxCQkJLCAudmFsID0gMHgwMTExMDExMSwgfSwKKwl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfRE1DCQkJLCAudmFsID0gMHgwMDAxMDAwMCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0MjEwX3NldF9jbGtzcmNbXSA9IHsKKwl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfTENEMQkJCSwgLnZhbCA9IDB4MDAwMDExMTEsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgZXh5bm9zNF9lcGxsX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzVQX0VQTExfQ09OMCksCisJU0FWRV9JVEVNKFM1UF9FUExMX0NPTjEpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGV4eW5vczRfdnBsbF9zYXZlW10gPSB7CisJU0FWRV9JVEVNKFM1UF9WUExMX0NPTjApLAorCVNBVkVfSVRFTShTNVBfVlBMTF9DT04xKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0X2NvcmVfc2F2ZVtdID0geworCS8qIEdJQyBzaWRlICovCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfQ1BVICsgMHgwMDApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0NQVSArIDB4MDA0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19DUFUgKyAweDAwOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfQ1BVICsgMHgwMEMpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0NQVSArIDB4MDE0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19DUFUgKyAweDAxOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MDAwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgwMDQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDEwMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MTA0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgxMDgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDMwMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MzA0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgzMDgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQwMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDA0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MDgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQwQyksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDEwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MTQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQxOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDFDKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MjApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQyNCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDI4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MkMpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQzMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDM0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MzgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQzQyksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDQwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NDQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ0OCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDRDKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NTApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ1NCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDU4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NUMpLAorCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODAwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MDQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgwOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODBDKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MTApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgxNCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODE4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MUMpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgyMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODI0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MjgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgyQyksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODMwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MzQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgzOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODNDKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NDApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg0NCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODQ4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NEMpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg1MCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODU0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NTgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg1QyksCisKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHhDMDApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweEMwNCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4QzA4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHhDMEMpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweEMxMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4QzE0KSwKKworCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDAwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDAxMCksCisJU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwMjApLAorCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDMwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDA0MCksCisJU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwNTApLAorCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDYwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDA3MCksCisJU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwODApLAorCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDkwKSwKKworCS8qIFNST00gc2lkZSAqLworCVNBVkVfSVRFTShTNVBfU1JPTV9CVyksCisJU0FWRV9JVEVNKFM1UF9TUk9NX0JDMCksCisJU0FWRV9JVEVNKFM1UF9TUk9NX0JDMSksCisJU0FWRV9JVEVNKFM1UF9TUk9NX0JDMiksCisJU0FWRV9JVEVNKFM1UF9TUk9NX0JDMyksCit9OworCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgZXh5bm9zNF9sMmNjX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzVQX1ZBX0wyQ0MgKyBMMlgwX1RBR19MQVRFTkNZX0NUUkwpLAorCVNBVkVfSVRFTShTNVBfVkFfTDJDQyArIEwyWDBfREFUQV9MQVRFTkNZX0NUUkwpLAorCVNBVkVfSVRFTShTNVBfVkFfTDJDQyArIEwyWDBfUFJFRkVUQ0hfQ1RSTCksCisJU0FWRV9JVEVNKFM1UF9WQV9MMkNDICsgTDJYMF9QT1dFUl9DVFJMKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0wyQ0MgKyBMMlgwX0FVWF9DVFJMKSwKK307CisKKy8qIEZvciBDb3J0ZXgtQTkgRGlhZ25vc3RpYyBhbmQgUG93ZXIgY29udHJvbCByZWdpc3RlciAqLworc3RhdGljIHVuc2lnbmVkIGludCBzYXZlX2FybV9yZWdpc3RlclsyXTsKKworc3RhdGljIGludCBleHlub3M0X2NwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW91dGVyX2ZsdXNoX2FsbCgpOworCisJLyogaXNzdWUgdGhlIHN0YW5kYnkgc2lnbmFsIGludG8gdGhlIHBtIHVuaXQuICovCisJY3B1X2RvX2lkbGUoKTsKKworCS8qIHdlIHNob3VsZCBuZXZlciBnZXQgcGFzdCBoZXJlICovCisJcGFuaWMoInNsZWVwIHJlc3VtZWQgdG8gb3JpZ2luYXRvcj8iKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9wbV9wcmVwYXJlKHZvaWQpCit7CisJdTMyIHRtcDsKKworCXMzY19wbV9kb19zYXZlKGV4eW5vczRfY29yZV9zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfY29yZV9zYXZlKSk7CisJczNjX3BtX2RvX3NhdmUoZXh5bm9zNF9sMmNjX3NhdmUsIEFSUkFZX1NJWkUoZXh5bm9zNF9sMmNjX3NhdmUpKTsKKwlzM2NfcG1fZG9fc2F2ZShleHlub3M0X2VwbGxfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2VwbGxfc2F2ZSkpOworCXMzY19wbV9kb19zYXZlKGV4eW5vczRfdnBsbF9zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfdnBsbF9zYXZlKSk7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChTNVBfSU5GT1JNMSk7CisKKwkvKiBTZXQgdmFsdWUgb2YgcG93ZXIgZG93biByZWdpc3RlciBmb3Igc2xlZXAgbW9kZSAqLworCisJZXh5bm9zNF9zeXNfcG93ZXJkb3duX2NvbmYoU1lTX1NMRUVQKTsKKwlfX3Jhd193cml0ZWwoUzVQX0NIRUNLX1NMRUVQLCBTNVBfSU5GT1JNMSk7CisKKwkvKiBlbnN1cmUgYXQgbGVhc3QgSU5GT1JNMCBoYXMgdGhlIHJlc3VtZSBhZGRyZXNzICovCisKKwlfX3Jhd193cml0ZWwodmlydF90b19waHlzKHMzY19jcHVfcmVzdW1lKSwgUzVQX0lORk9STTApOworCisJLyogQmVmb3JlIGVudGVyIGNlbnRyYWwgc2VxdWVuY2UgbW9kZSwgY2xvY2sgc3JjIHJlZ2lzdGVyIGhhdmUgdG8gc2V0ICovCisKKwlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKGV4eW5vczRfc2V0X2Nsa3NyYywgQVJSQVlfU0laRShleHlub3M0X3NldF9jbGtzcmMpKTsKKworCWlmIChzb2NfaXNfZXh5bm9zNDIxMCgpKQorCQlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKGV4eW5vczQyMTBfc2V0X2Nsa3NyYywgQVJSQVlfU0laRShleHlub3M0MjEwX3NldF9jbGtzcmMpKTsKKworfQorCitzdGF0aWMgaW50IGV4eW5vczRfcG1fYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCit7CisJcG1fY3B1X3ByZXAgPSBleHlub3M0X3BtX3ByZXBhcmU7CisJcG1fY3B1X3NsZWVwID0gZXh5bm9zNF9jcHVfc3VzcGVuZDsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNvcHkgZnJvbSBsaW51eC9hcmNoL2FybS9rZXJuZWwvc21wX3NjdS5jICovCisKK3ZvaWQgZXh5bm9zNF9zY3VfZW5hYmxlKHZvaWQgX19pb21lbSAqc2N1X2Jhc2UpCit7CisJdTMyIHNjdV9jdHJsOworCisJc2N1X2N0cmwgPSBfX3Jhd19yZWFkbChzY3VfYmFzZSk7CisJLyogYWxyZWFkeSBlbmFibGVkPyAqLworCWlmIChzY3VfY3RybCAmIDEpCisJCXJldHVybjsKKworCXNjdV9jdHJsIHw9IDE7CisJX19yYXdfd3JpdGVsKHNjdV9jdHJsLCBzY3VfYmFzZSk7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBkYXRhIGFjY2Vzc2VkIGJ5IENQVTAgYmVmb3JlIHRoZSBTQ1Ugd2FzCisJICogaW5pdGlhbGlzZWQgaXMgdmlzaWJsZSB0byB0aGUgb3RoZXIgQ1BVcy4KKwkgKi8KKwlmbHVzaF9jYWNoZV9hbGwoKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxsX2Jhc2VfcmF0ZTsKKworc3RhdGljIHZvaWQgZXh5bm9zNF9yZXN0b3JlX3BsbCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcGxsX2NvbiwgbG9ja3RpbWUsIGxvY2tjbnQ7CisJdW5zaWduZWQgbG9uZyBwbGxfaW5fcmF0ZTsKKwl1bnNpZ25lZCBpbnQgcF9kaXYsIGVwbGxfd2FpdCA9IDAsIHZwbGxfd2FpdCA9IDA7CisKKwlpZiAocGxsX2Jhc2VfcmF0ZSA9PSAwKQorCQlyZXR1cm47CisKKwlwbGxfaW5fcmF0ZSA9IHBsbF9iYXNlX3JhdGU7CisKKwkvKiBFUExMICovCisJcGxsX2NvbiA9IGV4eW5vczRfZXBsbF9zYXZlWzBdLnZhbDsKKworCWlmIChwbGxfY29uICYgKDEgPDwgMzEpKSB7CisJCXBsbF9jb24gJj0gKFBMTDQ2WFhfUERJVl9NQVNLIDw8IFBMTDQ2WFhfUERJVl9TSElGVCk7CisJCXBfZGl2ID0gKHBsbF9jb24gPj4gUExMNDZYWF9QRElWX1NISUZUKTsKKworCQlwbGxfaW5fcmF0ZSAvPSAxMDAwMDAwOworCisJCWxvY2t0aW1lID0gKDMwMDAgLyBwbGxfaW5fcmF0ZSkgKiBwX2RpdjsKKwkJbG9ja2NudCA9IGxvY2t0aW1lICogMTAwMDAgLyAoMTAwMDAgLyBwbGxfaW5fcmF0ZSk7CisKKwkJX19yYXdfd3JpdGVsKGxvY2tjbnQsIFM1UF9FUExMX0xPQ0spOworCisJCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNF9lcGxsX3NhdmUsCisJCQkJCUFSUkFZX1NJWkUoZXh5bm9zNF9lcGxsX3NhdmUpKTsKKwkJZXBsbF93YWl0ID0gMTsKKwl9CisKKwlwbGxfaW5fcmF0ZSA9IHBsbF9iYXNlX3JhdGU7CisKKwkvKiBWUExMICovCisJcGxsX2NvbiA9IGV4eW5vczRfdnBsbF9zYXZlWzBdLnZhbDsKKworCWlmIChwbGxfY29uICYgKDEgPDwgMzEpKSB7CisJCXBsbF9pbl9yYXRlIC89IDEwMDAwMDA7CisJCS8qIDc1MHVzICovCisJCWxvY2t0aW1lID0gNzUwOworCQlsb2NrY250ID0gbG9ja3RpbWUgKiAxMDAwMCAvICgxMDAwMCAvIHBsbF9pbl9yYXRlKTsKKworCQlfX3Jhd193cml0ZWwobG9ja2NudCwgUzVQX1ZQTExfTE9DSyk7CisKKwkJczNjX3BtX2RvX3Jlc3RvcmVfY29yZShleHlub3M0X3ZwbGxfc2F2ZSwKKwkJCQkJQVJSQVlfU0laRShleHlub3M0X3ZwbGxfc2F2ZSkpOworCQl2cGxsX3dhaXQgPSAxOworCX0KKworCS8qIFdhaXQgUExMIGxvY2tpbmcgKi8KKworCWRvIHsKKwkJaWYgKGVwbGxfd2FpdCkgeworCQkJcGxsX2NvbiA9IF9fcmF3X3JlYWRsKFM1UF9FUExMX0NPTjApOworCQkJaWYgKHBsbF9jb24gJiAoMSA8PCBTNVBfRVBMTENPTjBfTE9DS0VEX1NISUZUKSkKKwkJCQllcGxsX3dhaXQgPSAwOworCQl9CisKKwkJaWYgKHZwbGxfd2FpdCkgeworCQkJcGxsX2NvbiA9IF9fcmF3X3JlYWRsKFM1UF9WUExMX0NPTjApOworCQkJaWYgKHBsbF9jb24gJiAoMSA8PCBTNVBfVlBMTENPTjBfTE9DS0VEX1NISUZUKSkKKwkJCQl2cGxsX3dhaXQgPSAwOworCQl9CisJfSB3aGlsZSAoZXBsbF93YWl0IHx8IHZwbGxfd2FpdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBleHlub3M0X3BtX2RyaXZlciA9IHsKKwkuYWRkCQk9IGV4eW5vczRfcG1fYWRkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgZXh5bm9zNF9wbV9kcnZpbml0KHZvaWQpCit7CisJc3RydWN0IGNsayAqcGxsX2Jhc2U7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXMzY19wbV9pbml0KCk7CisKKwkvKiBBbGwgd2FrZXVwIGRpc2FibGUgKi8KKworCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9XQUtFVVBfTUFTSyk7CisJdG1wIHw9ICgoMHhGRiA8PCA4KSB8ICgweDFGIDw8IDEpKTsKKwlfX3Jhd193cml0ZWwodG1wLCBTNVBfV0FLRVVQX01BU0spOworCisJcGxsX2Jhc2UgPSBjbGtfZ2V0KE5VTEwsICJ4dGFsIik7CisKKwlpZiAoIUlTX0VSUihwbGxfYmFzZSkpIHsKKwkJcGxsX2Jhc2VfcmF0ZSA9IGNsa19nZXRfcmF0ZShwbGxfYmFzZSk7CisJCWNsa19wdXQocGxsX2Jhc2UpOworCX0KKworCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZleHlub3M0X3N5c2NsYXNzLCAmZXh5bm9zNF9wbV9kcml2ZXIpOworfQorYXJjaF9pbml0Y2FsbChleHlub3M0X3BtX2RydmluaXQpOworCitzdGF0aWMgaW50IGV4eW5vczRfcG1fc3VzcGVuZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJLyogU2V0dGluZyBDZW50cmFsIFNlcXVlbmNlIFJlZ2lzdGVyIGZvciBwb3dlciBkb3duIG1vZGUgKi8KKworCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DRU5UUkFMX1NFUV9DT05GSUdVUkFUSU9OKTsKKwl0bXAgJj0gflM1UF9DRU5UUkFMX0xPV1BXUl9DRkc7CisJX19yYXdfd3JpdGVsKHRtcCwgUzVQX0NFTlRSQUxfU0VRX0NPTkZJR1VSQVRJT04pOworCisJaWYgKHNvY19pc19leHlub3M0MjEyKCkpIHsKKwkJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NFTlRSQUxfU0VRX09QVElPTik7CisJCXRtcCAmPSB+KFM1UF9VU0VfU1RBTkRCWVdGSV9JU1BfQVJNIHwKKwkJCSBTNVBfVVNFX1NUQU5EQllXRkVfSVNQX0FSTSk7CisJCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9DRU5UUkFMX1NFUV9PUFRJT04pOworCX0KKworCS8qIFNhdmUgUG93ZXIgY29udHJvbCByZWdpc3RlciAqLworCWFzbSAoIm1yYyBwMTUsIDAsICUwLCBjMTUsIGMwLCAwIgorCSAgICAgOiAiPXIiICh0bXApIDogOiAiY2MiKTsKKwlzYXZlX2FybV9yZWdpc3RlclswXSA9IHRtcDsKKworCS8qIFNhdmUgRGlhZ25vc3RpYyByZWdpc3RlciAqLworCWFzbSAoIm1yYyBwMTUsIDAsICUwLCBjMTUsIGMwLCAxIgorCSAgICAgOiAiPXIiICh0bXApIDogOiAiY2MiKTsKKwlzYXZlX2FybV9yZWdpc3RlclsxXSA9IHRtcDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0X3BtX3Jlc3VtZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJLyoKKwkgKiBJZiBQTVUgZmFpbGVkIHdoaWxlIGVudGVyaW5nIHNsZWVwIG1vZGUsIFdGSSB3aWxsIGJlCisJICogaWdub3JlZCBieSBQTVUgYW5kIHRoZW4gZXhpdGluZyBjcHVfZG9faWRsZSgpLgorCSAqIFM1UF9DRU5UUkFMX0xPV1BXUl9DRkcgYml0IHdpbGwgbm90IGJlIHNldCBhdXRvbWF0aWNhbGx5CisJICogaW4gdGhpcyBzaXR1YXRpb24uCisJICovCisJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NFTlRSQUxfU0VRX0NPTkZJR1VSQVRJT04pOworCWlmICghKHRtcCAmIFM1UF9DRU5UUkFMX0xPV1BXUl9DRkcpKSB7CisJCXRtcCB8PSBTNVBfQ0VOVFJBTF9MT1dQV1JfQ0ZHOworCQlfX3Jhd193cml0ZWwodG1wLCBTNVBfQ0VOVFJBTF9TRVFfQ09ORklHVVJBVElPTik7CisJCS8qIE5vIG5lZWQgdG8gcGVyZm9ybSBiZWxvdyByZXN0b3JlIGNvZGUgKi8KKwkJZ290byBlYXJseV93YWtldXA7CisJfQorCS8qIFJlc3RvcmUgUG93ZXIgY29udHJvbCByZWdpc3RlciAqLworCXRtcCA9IHNhdmVfYXJtX3JlZ2lzdGVyWzBdOworCWFzbSB2b2xhdGlsZSAoIm1jciBwMTUsIDAsICUwLCBjMTUsIGMwLCAwIgorCQkgICAgICA6IDogInIiICh0bXApCisJCSAgICAgIDogImNjIik7CisKKwkvKiBSZXN0b3JlIERpYWdub3N0aWMgcmVnaXN0ZXIgKi8KKwl0bXAgPSBzYXZlX2FybV9yZWdpc3RlclsxXTsKKwlhc20gdm9sYXRpbGUgKCJtY3IgcDE1LCAwLCAlMCwgYzE1LCBjMCwgMSIKKwkJICAgICAgOiA6ICJyIiAodG1wKQorCQkgICAgICA6ICJjYyIpOworCisJLyogRm9yIHJlbGVhc2UgcmV0ZW50aW9uICovCisKKwlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9NQVVESU9fT1BUSU9OKTsKKwlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9HUElPX09QVElPTik7CisJX19yYXdfd3JpdGVsKCgxIDw8IDI4KSwgUzVQX1BBRF9SRVRfVUFSVF9PUFRJT04pOworCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX01NQ0FfT1BUSU9OKTsKKwlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9NTUNCX09QVElPTik7CisJX19yYXdfd3JpdGVsKCgxIDw8IDI4KSwgUzVQX1BBRF9SRVRfRUJJQV9PUFRJT04pOworCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX0VCSUJfT1BUSU9OKTsKKworCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNF9jb3JlX3NhdmUsIEFSUkFZX1NJWkUoZXh5bm9zNF9jb3JlX3NhdmUpKTsKKworCWV4eW5vczRfcmVzdG9yZV9wbGwoKTsKKworCWV4eW5vczRfc2N1X2VuYWJsZShTNVBfVkFfU0NVKTsKKworI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCisJczNjX3BtX2RvX3Jlc3RvcmVfY29yZShleHlub3M0X2wyY2Nfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2wyY2Nfc2F2ZSkpOworCW91dGVyX2ludl9hbGwoKTsKKwkvKiBlbmFibGUgTDJYMCovCisJd3JpdGVsX3JlbGF4ZWQoMSwgUzVQX1ZBX0wyQ0MgKyBMMlgwX0NUUkwpOworI2VuZGlmCisKK2Vhcmx5X3dha2V1cDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgZXh5bm9zNF9wbV9zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZAk9IGV4eW5vczRfcG1fc3VzcGVuZCwKKwkucmVzdW1lCQk9IGV4eW5vczRfcG1fcmVzdW1lLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgZXh5bm9zNF9wbV9zeXNjb3JlX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmZXh5bm9zNF9wbV9zeXNjb3JlX29wcyk7CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGV4eW5vczRfcG1fc3lzY29yZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL3BtdS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhNDhmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3BtdS5jCkBAIC0wLDAgKzEsMjMwIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvcG11LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIEVYWU5PUzQyMTAgLSBDUFUgUE1VKFBvd2VyIE1hbmFnZW1lbnQgVW5pdCkgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL3BtdS5oPgorCitzdGF0aWMgc3RydWN0IGV4eW5vczRfcG11X2NvbmYgKmV4eW5vczRfcG11X2NvbmZpZzsKKworc3RhdGljIHN0cnVjdCBleHlub3M0X3BtdV9jb25mIGV4eW5vczQyMTBfcG11X2NvbmZpZ1tdID0geworCS8qIHsgLnJlZyA9IGFkZHJlc3MsIC52YWwgPSB7IEFGVFIsIExQQSwgU0xFRVAgfSAqLworCXsgUzVQX0FSTV9DT1JFMF9MT1dQV1IsCQkJeyAweDAsIDB4MCwgMHgyIH0gfSwKKwl7IFM1UF9ESVNfSVJRX0NPUkUwLAkJCXsgMHgwLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRElTX0lSUV9DRU5UUkFMMCwJCQl7IDB4MCwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0FSTV9DT1JFMV9MT1dQV1IsCQkJeyAweDAsIDB4MCwgMHgyIH0gfSwKKwl7IFM1UF9ESVNfSVJRX0NPUkUxLAkJCXsgMHgwLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRElTX0lSUV9DRU5UUkFMMSwJCQl7IDB4MCwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0FSTV9DT01NT05fTE9XUFdSLAkJeyAweDAsIDB4MCwgMHgyIH0gfSwKKwl7IFM1UF9MMl8wX0xPV1BXUiwJCQl7IDB4MiwgMHgyLCAweDMgfSB9LAorCXsgUzVQX0wyXzFfTE9XUFdSLAkJCXsgMHgyLCAweDIsIDB4MyB9IH0sCisJeyBTNVBfQ01VX0FDTEtTVE9QX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1NDTEtTVE9QX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0xPV1BXUiwJCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0FQTExfU1lTQ0xLX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfTVBMTF9TWVNDTEtfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9WUExMX1NZU0NMS19MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0VQTExfU1lTQ0xLX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfR1BTX0FMSVZFX0xPV1BXUiwJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfR1BTQUxJVkVfTE9XUFdSLAl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX0NBTV9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX1RWX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfTUZDX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfRzNEX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfTENEMF9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX0xDRDFfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfQ0xLU1RPUF9NQVVESU9fTE9XUFdSLAl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX0dQU19MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9DQU1fTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfVFZfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfTUZDX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0czRF9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9MQ0QwX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0xDRDFfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfTUFVRElPX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0dQU19MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX1RPUF9CVVNfTE9XUFdSLAkJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfVE9QX1JFVEVOVElPTl9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDEgfSB9LAorCXsgUzVQX1RPUF9QV1JfTE9XUFdSLAkJCXsgMHgzLCAweDAsIDB4MyB9IH0sCisJeyBTNVBfTE9HSUNfUkVTRVRfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9PTkVOQU5EX01FTV9MT1dQV1IsCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX01PRElNSUZfTUVNX0xPV1BXUiwJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRzJEX0FDUF9NRU1fTE9XUFdSLAkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9VU0JPVEdfTUVNX0xPV1BXUiwJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfSFNNTUNfTUVNX0xPV1BXUiwJCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NTU1lTX01FTV9MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9TRUNTU19NRU1fTE9XUFdSLAkJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUENJRV9NRU1fTE9XUFdSLAkJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfU0FUQV9NRU1fTE9XUFdSLAkJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9EUkFNX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX01BVURJT19MT1dQV1IsCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9HUElPX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX1VBUlRfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fTU1DQV9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9NTUNCX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0VCSUFfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fRUJJQl9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9JU09MQVRJT05fTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fQUxWX1NFTF9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfWFVTQlhUSV9MT1dQV1IsCQkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9YWFRJX0xPV1BXUiwJCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0VYVF9SRUdVTEFUT1JfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9HUElPX01PREVfTE9XUFdSLAkJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfR1BJT19NT0RFX01BVURJT19MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NBTV9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9UVl9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9NRkNfTE9XUFdSLAkJCXsgMHg3LCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRzNEX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0xDRDBfTE9XUFdSLAkJCXsgMHg3LCAweDAsIDB4MCB9IH0sCisJeyBTNVBfTENEMV9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9NQVVESU9fTE9XUFdSLAkJCXsgMHg3LCAweDcsIDB4MCB9IH0sCisJeyBTNVBfR1BTX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0dQU19BTElWRV9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFBNVV9UQUJMRV9FTkQsfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXh5bm9zNF9wbXVfY29uZiBleHlub3M0MjEyX3BtdV9jb25maWdbXSA9IHsKKwl7IFM1UF9BUk1fQ09SRTBfTE9XUFdSLAkJCXsgMHgwLCAweDAsIDB4MiB9IH0sCisJeyBTNVBfRElTX0lSUV9DT1JFMCwJCQl7IDB4MCwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0RJU19JUlFfQ0VOVFJBTDAsCQkJeyAweDAsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9BUk1fQ09SRTFfTE9XUFdSLAkJCXsgMHgwLCAweDAsIDB4MiB9IH0sCisJeyBTNVBfRElTX0lSUV9DT1JFMSwJCQl7IDB4MCwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0RJU19JUlFfQ0VOVFJBTDEsCQkJeyAweDAsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9JU1BfQVJNX0xPV1BXUiwJCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0RJU19JUlFfSVNQX0FSTV9MT0NBTF9MT1dQV1IsCXsgMHgwLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRElTX0lSUV9JU1BfQVJNX0NFTlRSQUxfTE9XUFdSLAl7IDB4MCwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0FSTV9DT01NT05fTE9XUFdSLAkJeyAweDAsIDB4MCwgMHgyIH0gfSwKKwl7IFM1UF9MMl8wX0xPV1BXUiwJCQl7IDB4MCwgMHgwLCAweDMgfSB9LAorCS8qIFhYWF9PUFRJT04gcmVnaXN0ZXIgc2hvdWxkIGJlIHNldCBvdGhlciBmaWVsZCAqLworCXsgUzVQX0FSTV9MMl8wX09QVElPTiwJCQl7IDB4MTAsIDB4MTAsIDB4MCB9IH0sCisJeyBTNVBfTDJfMV9MT1dQV1IsCQkJeyAweDAsIDB4MCwgMHgzIH0gfSwKKwl7IFM1UF9BUk1fTDJfMV9PUFRJT04sCQkJeyAweDEwLCAweDEwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9BQ0xLU1RPUF9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9TQ0xLU1RPUF9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9MT1dQV1IsCQkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9EUkFNX0ZSRVFfRE9XTl9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDEgfSB9LAorCXsgUzVQX0REUlBIWV9ETExPRkZfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgxIH0gfSwKKwl7IFM1UF9MUEREUl9QSFlfRExMX0xPQ0tfTE9XUFdSLAl7IDB4MSwgMHgxLCAweDEgfSB9LAorCXsgUzVQX0NNVV9BQ0xLU1RPUF9DT1JFQkxLX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfU0NMS1NUT1BfQ09SRUJMS19MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0NPUkVCTEtfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9BUExMX1NZU0NMS19MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX01QTExfU1lTQ0xLX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfVlBMTF9TWVNDTEtfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9FUExMX1NZU0NMS19MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX01QTExVU0VSX1NZU0NMS19MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX0dQU19BTElWRV9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0dQU0FMSVZFX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfQ0xLU1RPUF9DQU1fTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfQ0xLU1RPUF9UVl9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX01GQ19MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX0czRF9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX0xDRDBfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfQ0xLU1RPUF9JU1BfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfQ0xLU1RPUF9NQVVESU9fTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX0dQU19MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9DQU1fTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfVFZfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfTUZDX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0czRF9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9MQ0QwX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0lTUF9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9NQVVESU9fTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfR1BTX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfVE9QX0JVU19MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9UT1BfUkVURU5USU9OX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MSB9IH0sCisJeyBTNVBfVE9QX1BXUl9MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgzIH0gfSwKKwl7IFM1UF9UT1BfQlVTX0NPUkVCTEtfTE9XUFdSLAkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9UT1BfUkVURU5USU9OX0NPUkVCTEtfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDEgfSB9LAorCXsgUzVQX1RPUF9QV1JfQ09SRUJMS19MT1dQV1IsCQl7IDB4MywgMHgwLCAweDMgfSB9LAorCXsgUzVQX0xPR0lDX1JFU0VUX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfT1NDQ0xLX0dBVEVfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgxIH0gfSwKKwl7IFM1UF9MT0dJQ19SRVNFVF9DT1JFQkxLX0xPV1BXUiwJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9PU0NDTEtfR0FURV9DT1JFQkxLX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgxIH0gfSwKKwl7IFM1UF9PTkVOQU5EX01FTV9MT1dQV1IsCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX09ORU5BTkRfTUVNX09QVElPTiwJCXsgMHgxMCwgMHgxMCwgMHgwIH0gfSwKKwl7IFM1UF9IU0lfTUVNX0xPV1BXUiwJCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0hTSV9NRU1fT1BUSU9OLAkJCXsgMHgxMCwgMHgxMCwgMHgwIH0gfSwKKwl7IFM1UF9HMkRfQUNQX01FTV9MT1dQV1IsCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0cyRF9BQ1BfTUVNX09QVElPTiwJCXsgMHgxMCwgMHgxMCwgMHgwIH0gfSwKKwl7IFM1UF9VU0JPVEdfTUVNX0xPV1BXUiwJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfVVNCT1RHX01FTV9PUFRJT04sCQl7IDB4MTAsIDB4MTAsIDB4MCB9IH0sCisJeyBTNVBfSFNNTUNfTUVNX0xPV1BXUiwJCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0hTTU1DX01FTV9PUFRJT04sCQkJeyAweDEwLCAweDEwLCAweDAgfSB9LAorCXsgUzVQX0NTU1lTX01FTV9MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DU1NZU19NRU1fT1BUSU9OLAkJCXsgMHgxMCwgMHgxMCwgMHgwIH0gfSwKKwl7IFM1UF9TRUNTU19NRU1fTE9XUFdSLAkJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfU0VDU1NfTUVNX09QVElPTiwJCQl7IDB4MTAsIDB4MTAsIDB4MCB9IH0sCisJeyBTNVBfUk9UQVRPUl9NRU1fTE9XUFdSLAkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9ST1RBVE9SX01FTV9PUFRJT04sCQl7IDB4MTAsIDB4MTAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9EUkFNX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX01BVURJT19MT1dQV1IsCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9HUElPX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX1VBUlRfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fTU1DQV9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9NTUNCX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0VCSUFfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fRUJJQl9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9HUElPX0NPUkVCTEtfTE9XUFdSLHsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9JU09MQVRJT05fTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9JU09MQVRJT05fQ09SRUJMS19MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9BTFZfU0VMX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9YVVNCWFRJX0xPV1BXUiwJCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX1hYVElfTE9XUFdSLAkJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfRVhUX1JFR1VMQVRPUl9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0dQSU9fTU9ERV9MT1dQV1IsCQkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9HUElPX01PREVfQ09SRUJMS19MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0dQSU9fTU9ERV9NQVVESU9fTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9UT1BfQVNCX1JFU0VUX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MSB9IH0sCisJeyBTNVBfVE9QX0FTQl9JU09MQVRJT05fTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgxIH0gfSwKKwl7IFM1UF9DQU1fTE9XUFdSLAkJCXsgMHg3LCAweDAsIDB4MCB9IH0sCisJeyBTNVBfVFZfTE9XUFdSLAkJCXsgMHg3LCAweDAsIDB4MCB9IH0sCisJeyBTNVBfTUZDX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0czRF9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9MQ0QwX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0lTUF9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9NQVVESU9fTE9XUFdSLAkJCXsgMHg3LCAweDcsIDB4MCB9IH0sCisJeyBTNVBfR1BTX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0dQU19BTElWRV9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfU1lTQ0xLX0lTUF9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9TWVNDTEtfR1BTX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBQTVVfVEFCTEVfRU5ELH0sCit9OworCit2b2lkIGV4eW5vczRfc3lzX3Bvd2VyZG93bl9jb25mKGVudW0gc3lzX3Bvd2VyZG93biBtb2RlKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgKGV4eW5vczRfcG11X2NvbmZpZ1tpXS5yZWcgIT0gUE1VX1RBQkxFX0VORCkgOyBpKyspCisJCV9fcmF3X3dyaXRlbChleHlub3M0X3BtdV9jb25maWdbaV0udmFsW21vZGVdLAorCQkJCWV4eW5vczRfcG11X2NvbmZpZ1tpXS5yZWcpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBleHlub3M0X3BtdV9pbml0KHZvaWQpCit7CisJZXh5bm9zNF9wbXVfY29uZmlnID0gZXh5bm9zNDIxMF9wbXVfY29uZmlnOworCisJaWYgKHNvY19pc19leHlub3M0MjEwKCkpIHsKKwkJZXh5bm9zNF9wbXVfY29uZmlnID0gZXh5bm9zNDIxMF9wbXVfY29uZmlnOworCQlwcl9pbmZvKCJFWFlOT1M0MjEwIFBNVSBJbml0aWFsaXplXG4iKTsKKwl9IGVsc2UgaWYgKHNvY19pc19leHlub3M0MjEyKCkpIHsKKwkJZXh5bm9zNF9wbXVfY29uZmlnID0gZXh5bm9zNDIxMl9wbXVfY29uZmlnOworCQlwcl9pbmZvKCJFWFlOT1M0MjEyIFBNVSBJbml0aWFsaXplXG4iKTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCJFWFlOT1M0OiBQTVUgbm90IHN1cHBvcnRlZFxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGV4eW5vczRfcG11X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWZpbWMuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWZpbWMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWZpbWMuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtZmltYy5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtZmltZDAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWZpbWQwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1maW1kMC5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1maW1kMC5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjMC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjMC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjMC5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmMwLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmMxLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmMxLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmMxLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzEuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzIuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzIuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjMi5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjMy5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjMy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjMy5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmMzLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmM0LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmM0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmM0LmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzUuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzUuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjNS5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjNi5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjNi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjNi5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmM2LmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmM3LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmM3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmM3LmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzcuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWtleXBhZC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAta2V5cGFkLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1rZXlwYWQuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAta2V5cGFkLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1zZGhjaS1ncGlvLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1zZGhjaS1ncGlvLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1zZGhjaS1ncGlvLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLXNkaGNpLWdwaW8uYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtc2RoY2kuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLXNkaGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5MzdiNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLXNkaGNpLmMKQEAgLTAsMCArMSwyMiBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLXNkaGNpLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBFWFlOT1M0IC0gSGVscGVyIGZ1bmN0aW9ucyBmb3Igc2V0dGlnbiB1cCBTREhDSSBkZXZpY2UocykgKEhTTU1DKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogY2xvY2sgc291cmNlcyBmb3IgdGhlIG1tYyBidXMgY2xvY2ssIG9yZGVyIGFzIGZvciB0aGUgY3RybDJbNS4uNF0gKi8KKworY2hhciAqZXh5bm9zNF9oc21tY19jbGtzcmNzWzRdID0geworCVswXSA9IE5VTEwsCisJWzFdID0gTlVMTCwKKwlbMl0gPSAic2Nsa19tbWMiLAkvKiBtbWNfYnVzICovCisJWzNdID0gTlVMTCwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtdXNiLXBoeS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtdXNiLXBoeS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtdXNiLXBoeS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC11c2ItcGh5LmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWY5MmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotIyBhcmNoL2FybS9tYWNoLWV4eW5vczQvS2NvbmZpZwotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotIwkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSMKLSMgTGljZW5zZWQgdW5kZXIgR1BMdjIKLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBFWFlOT1M0Ci0KLWlmIEFSQ0hfRVhZTk9TNAotCi1jb25maWcgQ1BVX0VYWU5PUzQyMTAKLQlib29sCi0Jc2VsZWN0IFMzQ19QTDMzMF9ETUEKLQlzZWxlY3QgQVJNX0NQVV9TVVNQRU5EIGlmIFBNCi0JaGVscAotCSAgRW5hYmxlIEVYWU5PUzQyMTAgQ1BVIHN1cHBvcnQKLQotY29uZmlnIEVYWU5PUzRfTUNUCi0JYm9vbAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFVzZSBNQ1QgKE11bHRpIENvcmUgVGltZXIpIGFzIGtlcm5lbCB0aW1lcnMKLQotY29uZmlnIEVYWU5PUzRfREVWX0FIQ0kKLQlib29sCi0JaGVscAotCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMgZm9yIEFIQ0kKLQotY29uZmlnIEVYWU5PUzRfU0VUVVBfRklNRDAKLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIEZJTUQwLgotCi1jb25maWcgRVhZTk9TNF9ERVZfUEQKLQlib29sCi0JaGVscAotCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMgZm9yIFBvd2VyIERvbWFpbgotCi1jb25maWcgRVhZTk9TNF9ERVZfU1lTTU1VCi0JYm9vbAotCWhlbHAKLQkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBTWVNURU0gTU1VIGluIEVYWU5PUzQKLQotY29uZmlnIEVYWU5PUzRfREVWX0RXTUNJCi0JYm9vbAotCWhlbHAKLQkgIENvbXBpbGUgaW4gcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb25zIGZvciBEV01DSQotCi1jb25maWcgRVhZTk9TNF9TRVRVUF9JMkMxCi0JYm9vbAotCWhlbHAKLQkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDEuCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzIKLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgMi4KLQotY29uZmlnIEVYWU5PUzRfU0VUVVBfSTJDMwotCWJvb2wKLQloZWxwCi0JICBDb21tb24gc2V0dXAgY29kZSBmb3IgaTJjIGJ1cyAzLgotCi1jb25maWcgRVhZTk9TNF9TRVRVUF9JMkM0Ci0JYm9vbAotCWhlbHAKLQkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDQuCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzUKLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgNS4KLQotY29uZmlnIEVYWU5PUzRfU0VUVVBfSTJDNgotCWJvb2wKLQloZWxwCi0JICBDb21tb24gc2V0dXAgY29kZSBmb3IgaTJjIGJ1cyA2LgotCi1jb25maWcgRVhZTk9TNF9TRVRVUF9JMkM3Ci0JYm9vbAotCWhlbHAKLQkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDcuCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX0tFWVBBRAotCWJvb2wKLQloZWxwCi0JICBDb21tb24gc2V0dXAgY29kZSBmb3Iga2V5cGFkLgotCi1jb25maWcgRVhZTk9TNF9TRVRVUF9TREhDSQotCWJvb2wKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9TREhDSV9HUElPCi0JaGVscAotCSAgSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgRVhZTk9TNCBiYXNlZCBTREhDSSBzeXN0ZW1zLgotCi1jb25maWcgRVhZTk9TNF9TRVRVUF9TREhDSV9HUElPCi0JYm9vbAotCWhlbHAKLQkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBTREhDSSBncGlvLgotCi1jb25maWcgRVhZTk9TNF9TRVRVUF9GSU1DCi0JYm9vbAotCWhlbHAKLQkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciB0aGUgY2FtZXJhIGludGVyZmFjZXMuCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX1VTQl9QSFkKLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIFVTQiBQSFkgY29udHJvbGxlcgotCi0jIG1hY2hpbmUgc3VwcG9ydAotCi1tZW51ICJFWFlOT1M0IE1hY2hpbmVzIgotCi1jb25maWcgTUFDSF9TTURLQzIxMAotCWJvb2wgIlNNREtDMjEwIgotCXNlbGVjdCBDUFVfRVhZTk9TNDIxMAotCXNlbGVjdCBTNVBfREVWX0ZJTUQwCi0Jc2VsZWN0IFMzQ19ERVZfUlRDCi0Jc2VsZWN0IFMzQ19ERVZfV0RUCi0Jc2VsZWN0IFMzQ19ERVZfSTJDMQotCXNlbGVjdCBTM0NfREVWX0hTTU1DCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMxCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMyCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMzCi0Jc2VsZWN0IFNBTVNVTkdfREVWX1BXTQotCXNlbGVjdCBTQU1TVU5HX0RFVl9CQUNLTElHSFQKLQlzZWxlY3QgRVhZTk9TNF9ERVZfUEQKLQlzZWxlY3QgRVhZTk9TNF9ERVZfU1lTTU1VCi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfRklNRDAKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMxCi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKLQloZWxwCi0JICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgU01ES0MyMTAKLQotY29uZmlnIE1BQ0hfU01ES1YzMTAKLQlib29sICJTTURLVjMxMCIKLQlzZWxlY3QgQ1BVX0VYWU5PUzQyMTAKLQlzZWxlY3QgUzVQX0RFVl9GSU1EMAotCXNlbGVjdCBTM0NfREVWX1JUQwotCXNlbGVjdCBTM0NfREVWX1dEVAotCXNlbGVjdCBTM0NfREVWX0kyQzEKLQlzZWxlY3QgUzNDX0RFVl9IU01NQwotCXNlbGVjdCBTM0NfREVWX0hTTU1DMQotCXNlbGVjdCBTM0NfREVWX0hTTU1DMgotCXNlbGVjdCBTM0NfREVWX0hTTU1DMwotCXNlbGVjdCBTQU1TVU5HX0RFVl9CQUNLTElHSFQKLQlzZWxlY3QgRVhZTk9TNF9ERVZfQUhDSQotCXNlbGVjdCBTQU1TVU5HX0RFVl9LRVlQQUQKLQlzZWxlY3QgRVhZTk9TNF9ERVZfUEQKLQlzZWxlY3QgU0FNU1VOR19ERVZfUFdNCi0Jc2VsZWN0IEVYWU5PUzRfREVWX1NZU01NVQotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0ZJTUQwCi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDMQotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0tFWVBBRAotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJCi0JaGVscAotCSAgTWFjaGluZSBzdXBwb3J0IGZvciBTYW1zdW5nIFNNREtWMzEwCi0KLWNvbmZpZyBNQUNIX0FSTUxFWDQyMTAKLQlib29sICJBUk1MRVg0MjEwIgotCXNlbGVjdCBDUFVfRVhZTk9TNDIxMAotCXNlbGVjdCBTM0NfREVWX1JUQwotCXNlbGVjdCBTM0NfREVWX1dEVAotCXNlbGVjdCBTM0NfREVWX0hTTU1DCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMyCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMzCi0Jc2VsZWN0IEVYWU5PUzRfREVWX0FIQ0kKLQlzZWxlY3QgRVhZTk9TNF9ERVZfU1lTTU1VCi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKLQloZWxwCi0JICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgQVJNTEVYNDIxMCBiYXNlZCBvbiBFWFlOT1M0MjEwCi0KLWNvbmZpZyBNQUNIX1VOSVZFUlNBTF9DMjEwCi0JYm9vbCAiTW9iaWxlIFVOSVZFUlNBTF9DMjEwIEJvYXJkIgotCXNlbGVjdCBDUFVfRVhZTk9TNDIxMAotCXNlbGVjdCBTNVBfR1BJT19JTlQKLQlzZWxlY3QgUzVQX0RFVl9GSU1DMAotCXNlbGVjdCBTNVBfREVWX0ZJTUMxCi0Jc2VsZWN0IFM1UF9ERVZfRklNQzIKLQlzZWxlY3QgUzVQX0RFVl9GSU1DMwotCXNlbGVjdCBTM0NfREVWX0hTTU1DCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMyCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMzCi0Jc2VsZWN0IFMzQ19ERVZfSTJDMQotCXNlbGVjdCBTM0NfREVWX0kyQzMKLQlzZWxlY3QgUzNDX0RFVl9JMkM1Ci0Jc2VsZWN0IFM1UF9ERVZfTUZDCi0Jc2VsZWN0IFM1UF9ERVZfT05FTkFORAotCXNlbGVjdCBFWFlOT1M0X0RFVl9QRAotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzEKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMzCi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDNQotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJCi0JaGVscAotCSAgTWFjaGluZSBzdXBwb3J0IGZvciBTYW1zdW5nIE1vYmlsZSBVbml2ZXJzYWwgUzVQQzIxMCBSZWZlcmVuY2UKLQkgIEJvYXJkLgotCi1jb25maWcgTUFDSF9OVVJJCi0JYm9vbCAiTW9iaWxlIE5VUkkgQm9hcmQiCi0Jc2VsZWN0IENQVV9FWFlOT1M0MjEwCi0Jc2VsZWN0IFMzQ19ERVZfV0RUCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMKLQlzZWxlY3QgUzNDX0RFVl9IU01NQzIKLQlzZWxlY3QgUzNDX0RFVl9IU01NQzMKLQlzZWxlY3QgUzNDX0RFVl9JMkMxCi0Jc2VsZWN0IFMzQ19ERVZfSTJDMwotCXNlbGVjdCBTM0NfREVWX0kyQzUKLQlzZWxlY3QgUzVQX0RFVl9NRkMKLQlzZWxlY3QgUzVQX0RFVl9VU0JfRUhDSQotCXNlbGVjdCBFWFlOT1M0X0RFVl9QRAotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzEKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMzCi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDNQotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJCi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfVVNCX1BIWQotCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KLQlzZWxlY3QgU0FNU1VOR19ERVZfQURDCi0JaGVscAotCSAgTWFjaGluZSBzdXBwb3J0IGZvciBTYW1zdW5nIE1vYmlsZSBOVVJJIEJvYXJkLgotCi1lbmRtZW51Ci0KLWNvbW1lbnQgIkNvbmZpZ3VyYXRpb24gZm9yIEhTTU1DIGJ1cyB3aWR0aCIKLQotbWVudSAiVXNlIDgtYml0IGJ1cyB3aWR0aCIKLQotY29uZmlnIEVYWU5PUzRfU0RIQ0lfQ0gwXzhCSVQKLQlib29sICJDaGFubmVsIDAgd2l0aCA4LWJpdCBidXMiCi0JaGVscAotCSAgU3VwcG9ydCBIU01NQyBDaGFubmVsIDAgOC1iaXQgYnVzLgotCSAgSWYgc2VsZWN0ZWQsIENoYW5uZWwgMSBpcyBkaXNhYmxlZC4KLQotY29uZmlnIEVYWU5PUzRfU0RIQ0lfQ0gyXzhCSVQKLQlib29sICJDaGFubmVsIDIgd2l0aCA4LWJpdCBidXMiCi0JaGVscAotCSAgU3VwcG9ydCBIU01NQyBDaGFubmVsIDIgOC1iaXQgYnVzLgotCSAgSWYgc2VsZWN0ZWQsIENoYW5uZWwgMyBpcyBkaXNhYmxlZC4KLQotZW5kbWVudQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2ZlMWQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMgYXJjaC9hcm0vbWFjaC1leHlub3M0L01ha2VmaWxlCi0jCi0jIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0jCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotIwotIyBMaWNlbnNlZCB1bmRlciBHUEx2MgotCi1vYmoteQkJCQk6PQotb2JqLW0JCQkJOj0KLW9iai1uCQkJCTo9Ci1vYmotCQkJCTo9Ci0KLSMgQ29yZSBzdXBwb3J0IGZvciBFWFlOT1M0IHN5c3RlbQotCi1vYmotJChDT05GSUdfQ1BVX0VYWU5PUzQyMTApCSs9IGNwdS5vIGluaXQubyBjbG9jay5vIGlycS1jb21iaW5lci5vCi1vYmotJChDT05GSUdfQ1BVX0VYWU5PUzQyMTApCSs9IHNldHVwLWkyYzAubyBpcnEtZWludC5vIGRtYS5vIHBtdS5vCi1vYmotJChDT05GSUdfUE0pCQkrPSBwbS5vIHNsZWVwLm8KLW9iai0kKENPTkZJR19DUFVfSURMRSkJCSs9IGNwdWlkbGUubwotCi1vYmotJChDT05GSUdfU01QKQkJKz0gcGxhdHNtcC5vIGhlYWRzbXAubwotCi1vYmotJChDT05GSUdfRVhZTk9TNF9NQ1QpCSs9IG1jdC5vCi0KLW9iai0kKENPTkZJR19IT1RQTFVHX0NQVSkJKz0gaG90cGx1Zy5vCi0KLSMgbWFjaGluZSBzdXBwb3J0Ci0KLW9iai0kKENPTkZJR19NQUNIX1NNREtDMjEwKQkJKz0gbWFjaC1zbWRrYzIxMC5vCi1vYmotJChDT05GSUdfTUFDSF9TTURLVjMxMCkJCSs9IG1hY2gtc21ka3YzMTAubwotb2JqLSQoQ09ORklHX01BQ0hfQVJNTEVYNDIxMCkJCSs9IG1hY2gtYXJtbGV4NDIxMC5vCi1vYmotJChDT05GSUdfTUFDSF9VTklWRVJTQUxfQzIxMCkJKz0gbWFjaC11bml2ZXJzYWxfYzIxMC5vCi1vYmotJChDT05GSUdfTUFDSF9OVVJJKQkJCSs9IG1hY2gtbnVyaS5vCi0KLSMgZGV2aWNlIHN1cHBvcnQKLQotb2JqLXkJCQkJCSs9IGRldi1hdWRpby5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9ERVZfQUhDSSkJCSs9IGRldi1haGNpLm8KLW9iai0kKENPTkZJR19FWFlOT1M0X0RFVl9QRCkJCSs9IGRldi1wZC5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9ERVZfU1lTTU1VKQkrPSBkZXYtc3lzbW11Lm8KLW9iai0kKENPTkZJR19FWFlOT1M0X0RFVl9EV01DSSkJKz0gZGV2LWR3bWNpLm8KLQotb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfRklNQykJKz0gc2V0dXAtZmltYy5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9GSU1EMCkJKz0gc2V0dXAtZmltZDAubwotb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDMSkJKz0gc2V0dXAtaTJjMS5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkMyKQkrPSBzZXR1cC1pMmMyLm8KLW9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0kyQzMpCSs9IHNldHVwLWkyYzMubwotb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDNCkJKz0gc2V0dXAtaTJjNC5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkM1KQkrPSBzZXR1cC1pMmM1Lm8KLW9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0kyQzYpCSs9IHNldHVwLWkyYzYubwotb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDNykJKz0gc2V0dXAtaTJjNy5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9LRVlQQUQpCSs9IHNldHVwLWtleXBhZC5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9TREhDSSkJKz0gc2V0dXAtc2RoY2kubwotb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfU0RIQ0lfR1BJTykJKz0gc2V0dXAtc2RoY2ktZ3Bpby5vCi0KLW9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX1VTQl9QSFkpCSs9IHNldHVwLXVzYi1waHkubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvY2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5NjRkMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvY2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDEyMTIgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Nsb2NrLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0IC0gQ2xvY2sgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPHBsYXQvY3B1LWZyZXEuaD4KLSNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxwbGF0L3BsbC5oPgotI2luY2x1ZGUgPHBsYXQvczVwLWNsb2NrLmg+Ci0jaW5jbHVkZSA8cGxhdC9jbG9jay1jbGtzcmMuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+Ci0jaW5jbHVkZSA8bWFjaC9zeXNtbXUuaD4KLQotc3RhdGljIHN0cnVjdCBjbGsgY2xrX3NjbGtfaGRtaTI3bSA9IHsKLQkubmFtZQkJPSAic2Nsa19oZG1pMjdtIiwKLQkucmF0ZQkJPSAyNzAwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19zY2xrX2hkbWlwaHkgPSB7Ci0JLm5hbWUJCT0gInNjbGtfaGRtaXBoeSIsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBjbGtfc2Nsa191c2JwaHkwID0gewotCS5uYW1lCQk9ICJzY2xrX3VzYnBoeTAiLAotCS5yYXRlCQk9IDI3MDAwMDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgY2xrX3NjbGtfdXNicGh5MSA9IHsKLQkubmFtZQkJPSAic2Nsa191c2JwaHkxIiwKLX07Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtzcmNfbWFza190b3BfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfVE9QLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfQ0FNLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtzcmNfbWFza19sY2QwX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS1NSQ19NQVNLX0xDRDAsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX2xjZDFfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfTENEMSwgY2xrLCBlbmFibGUpOwotfQotCi1zdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19GU1lTLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDBfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfUEVSSUwwLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDFfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfUEVSSUwxLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfbWZjX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfTUZDLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfQ0FNLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfdHZfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9UViwgY2xrLCBlbmFibGUpOwotfQotCi1zdGF0aWMgaW50IGV4eW5vczRfY2xrX2lwX2ltYWdlX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfSU1BR0UsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9sY2QwX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfTENEMCwgY2xrLCBlbmFibGUpOwotfQotCi1zdGF0aWMgaW50IGV4eW5vczRfY2xrX2lwX2xjZDFfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9MQ0QxLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX0ZTWVMsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX1BFUklMLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfcGVyaXJfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9QRVJJUiwgY2xrLCBlbmFibGUpOwotfQotCi0vKiBDb3JlIGxpc3Qgb2YgQ01VX0NQVSBzaWRlICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9hcGxsID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJtb3V0X2FwbGwiLAotCX0sCi0JLnNvdXJjZXMJPSAmY2xrX3NyY19hcGxsLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19DUFUsIC5zaGlmdCA9IDAsIC5zaXplID0gMSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2FwbGwgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gInNjbGtfYXBsbCIsCi0JCS5wYXJlbnQJCT0gJmNsa19tb3V0X2FwbGwuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gMjQsIC5zaXplID0gMyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2VwbGwgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gIm1vdXRfZXBsbCIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtfc3JjX2VwbGwsCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDAsIC5zaGlmdCA9IDQsIC5zaXplID0gMSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X21wbGwgPSB7Ci0JLmNsayA9IHsKLQkJLm5hbWUJCT0gIm1vdXRfbXBsbCIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtfc3JjX21wbGwsCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NQVSwgLnNoaWZ0ID0gOCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRjb3JlX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX21vdXRfYXBsbC5jbGssCi0JWzFdID0gJmNsa19tb3V0X21wbGwuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dGNvcmUgPSB7Ci0JLnNvdXJjZXMJPSBjbGtzZXRfbW91dGNvcmVfbGlzdCwKLQkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRjb3JlX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0Y29yZSA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAibW91dGNvcmUiLAotCX0sCi0JLnNvdXJjZXMJPSAmY2xrc2V0X21vdXRjb3JlLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19DUFUsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfY29yZWNsayA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAiY29yZV9jbGsiLAotCQkucGFyZW50CQk9ICZjbGtfbW91dGNvcmUuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gMCwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FybWNsayA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAiYXJtY2xrIiwKLQkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZW0wID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhY2xrX2NvcmVtMCIsCi0JCS5wYXJlbnQJCT0gJmNsa19jb3JlY2xrLmNsaywKLQl9LAotCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDQsIC5zaXplID0gMyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrX2NvcmVzID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhY2xrX2NvcmVzIiwKLQkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gNCwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZW0xID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhY2xrX2NvcmVtMSIsCi0JCS5wYXJlbnQJCT0gJmNsa19jb3JlY2xrLmNsaywKLQl9LAotCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDgsIC5zaXplID0gMyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19wZXJpcGhjbGsgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gInBlcmlwaGNsayIsCi0JCS5wYXJlbnQJCT0gJmNsa19jb3JlY2xrLmNsaywKLQl9LAotCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9DUFUsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDMgfSwKLX07Ci0KLS8qIENvcmUgbGlzdCBvZiBDTVVfQ09SRSBzaWRlICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfY29yZWJ1c19saXN0W10gPSB7Ci0JWzBdID0gJmNsa19tb3V0X21wbGwuY2xrLAotCVsxXSA9ICZjbGtfc2Nsa19hcGxsLmNsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X21vdXRfY29yZWJ1cyA9IHsKLQkuc291cmNlcwk9IGNsa3NldF9jb3JlYnVzX2xpc3QsCi0JLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9jb3JlYnVzX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2NvcmVidXMgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gIm1vdXRfY29yZWJ1cyIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9jb3JlYnVzLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19ETUMsIC5zaGlmdCA9IDQsIC5zaXplID0gMSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2RtYyA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAic2Nsa19kbWMiLAotCQkucGFyZW50CQk9ICZjbGtfbW91dF9jb3JlYnVzLmNsaywKLQl9LAotCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9ETUMwLCAuc2hpZnQgPSAxMiwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZWQgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImFjbGtfY29yZWQiLAotCQkucGFyZW50CQk9ICZjbGtfc2Nsa19kbWMuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0RNQzAsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDMgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19jb3JlcCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAiYWNsa19jb3JlcCIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrX2NvcmVkLmNsaywKLQl9LAotCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9ETUMwLCAuc2hpZnQgPSAyMCwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfYWNwID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhY2xrX2FjcCIsCi0JCS5wYXJlbnQJCT0gJmNsa19tb3V0X2NvcmVidXMuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0RNQzAsIC5zaGlmdCA9IDAsIC5zaXplID0gMyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19wY2xrX2FjcCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAicGNsa19hY3AiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa19hY3AuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0RNQzAsIC5zaGlmdCA9IDQsIC5zaXplID0gMyB9LAotfTsKLQotLyogQ29yZSBsaXN0IG9mIENNVV9UT1Agc2lkZSAqLwotCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X2FjbGtfdG9wX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX21vdXRfbXBsbC5jbGssCi0JWzFdID0gJmNsa19zY2xrX2FwbGwuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfYWNsayA9IHsKLQkuc291cmNlcwk9IGNsa3NldF9hY2xrX3RvcF9saXN0LAotCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfYWNsa190b3BfbGlzdCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfMjAwID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhY2xrXzIwMCIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfYWNsaywKLQkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gMSB9LAotCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9UT1AsIC5zaGlmdCA9IDAsIC5zaXplID0gMyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrXzEwMCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAiYWNsa18xMDAiLAotCX0sCi0JLnNvdXJjZXMJPSAmY2xrc2V0X2FjbGssCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDAsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDEgfSwKLQkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfVE9QLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDQgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa18xNjAgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImFjbGtfMTYwIiwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa3NldF9hY2xrLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AwLCAuc2hpZnQgPSAyMCwgLnNpemUgPSAxIH0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1RPUCwgLnNoaWZ0ID0gOCwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfMTMzID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhY2xrXzEzMyIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfYWNsaywKLQkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gMjQsIC5zaXplID0gMSB9LAotCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9UT1AsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDMgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfdnBsbHNyY19saXN0W10gPSB7Ci0JWzBdID0gJmNsa19maW5fdnBsbCwKLQlbMV0gPSAmY2xrX3NjbGtfaGRtaTI3bSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X3ZwbGxzcmMgPSB7Ci0JLnNvdXJjZXMJPSBjbGtzZXRfdnBsbHNyY19saXN0LAotCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfdnBsbHNyY19saXN0KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfdnBsbHNyYyA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAidnBsbF9zcmMiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfdG9wX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfdnBsbHNyYywKLQkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMSwgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X3NjbGtfdnBsbF9saXN0W10gPSB7Ci0JWzBdID0gJmNsa192cGxsc3JjLmNsaywKLQlbMV0gPSAmY2xrX2ZvdXRfdnBsbCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X3NjbGtfdnBsbCA9IHsKLQkuc291cmNlcwk9IGNsa3NldF9zY2xrX3ZwbGxfbGlzdCwKLQkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X3NjbGtfdnBsbF9saXN0KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa192cGxsID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJzY2xrX3ZwbGwiLAotCX0sCi0JLnNvdXJjZXMJPSAmY2xrc2V0X3NjbGtfdnBsbCwKLQkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gOCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc19vZmZbXSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJ0aW1lcnMiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDE8PDI0KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJjc2lzIiwKLQkJLmRldm5hbWUJPSAiczVwLW1pcGktY3Npcy4wIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJjc2lzIiwKLQkJLmRldm5hbWUJPSAiczVwLW1pcGktY3Npcy4xIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJmaW1jIiwKLQkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjAiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDApLAotCX0sIHsKLQkJLm5hbWUJCT0gImZpbWMiLAotCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMSIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMSksCi0JfSwgewotCQkubmFtZQkJPSAiZmltYyIsCi0JCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4yIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAyKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJmaW1jIiwKLQkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjMiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDMpLAotCX0sIHsKLQkJLm5hbWUJCT0gImZpbWQiLAotCQkuZGV2bmFtZQk9ICJleHlub3M0LWZiLjAiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2xjZDBfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJmaW1kIiwKLQkJLmRldm5hbWUJPSAiZXh5bm9zNC1mYi4xIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9sY2QxX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JfSwgewotCQkubmFtZQkJPSAic2F0YXBoeSIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDMpLAotCX0sIHsKLQkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjAiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJoc21tYyIsCi0JCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4xIiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTMzLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNiksCi0JfSwgewotCQkubmFtZQkJPSAiaHNtbWMiLAotCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMiIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDcpLAotCX0sIHsKLQkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjMiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJkd21tYyIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDkpLAotCX0sIHsKLQkJLm5hbWUJCT0gInNhdGEiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxMCksCi0JfSwgewotCQkubmFtZQkJPSAicGRtYSIsCi0JCS5kZXZuYW1lCT0gInMzYy1wbDMzMC4wIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JfSwgewotCQkubmFtZQkJPSAicGRtYSIsCi0JCS5kZXZuYW1lCT0gInMzYy1wbDMzMC4xIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMSksCi0JfSwgewotCQkubmFtZQkJPSAiYWRjIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDE1KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJrZXlwYWQiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlyX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTYpLAotCX0sIHsKLQkJLm5hbWUJCT0gInJ0YyIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaXJfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxNSksCi0JfSwgewotCQkubmFtZQkJPSAid2F0Y2hkb2ciLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlyX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTQpLAotCX0sIHsKLQkJLm5hbWUJCT0gInVzYmhvc3QiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCAsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTIpLAotCX0sIHsKLQkJLm5hbWUJCT0gIm90ZyIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDEzKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJzcGkiLAotCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJzcGkiLAotCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4xIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDE3KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJzcGkiLAotCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4yIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDE4KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpaXMiLAotCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWkycy4wIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDE5KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpaXMiLAotCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWkycy4xIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDIwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpaXMiLAotCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWkycy4yIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDIxKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJhYzk3IiwKLQkJLmRldm5hbWUJPSAic2Ftc3VuZy1hYzk3IiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDI3KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJmaW1nMmQiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ltYWdlX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JfSwgewotCQkubmFtZQkJPSAibWZjIiwKLQkJLmRldm5hbWUJPSAiczVwLW1mYyIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbWZjX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JfSwgewotCQkubmFtZQkJPSAiaTJjIiwKLQkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuMCIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA2KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpMmMiLAotCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy4xIiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDcpLAotCX0sIHsKLQkJLm5hbWUJCT0gImkyYyIsCi0JCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjIiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgOCksCi0JfSwgewotCQkubmFtZQkJPSAiaTJjIiwKLQkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuMyIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA5KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpMmMiLAotCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy40IiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpMmMiLAotCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy41IiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDExKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpMmMiLAotCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy42IiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpMmMiLAotCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy43IiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDEzKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJTWVNNTVVfTURNQSIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfaW1hZ2VfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJTWVNNTVVfRklNQzAiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDcpLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9GSU1DMSIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgOCksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUMyIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA5KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJTWVNNTVVfRklNQzMiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJTWVNNTVVfSlBFRyIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTEpLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9GSU1EMCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbGNkMF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDQpLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9GSU1EMSIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbGNkMV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDQpLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9QQ0llIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTgpLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9HMkQiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ltYWdlX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMyksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX1JPVEFUT1IiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ltYWdlX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNCksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX1RWIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF90dl9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDQpLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9NRkNfTCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbWZjX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMSksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX01GQ19SIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9tZmNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAyKSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc1tdID0gewotCXsKLQkJLm5hbWUJCT0gInVhcnQiLAotCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjEiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMSksCi0JfSwgewotCQkubmFtZQkJPSAidWFydCIsCi0JCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4yIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDIpLAotCX0sIHsKLQkJLm5hbWUJCT0gInVhcnQiLAotCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMyIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjQiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNCksCi0JfSwgewotCQkubmFtZQkJPSAidWFydCIsCi0JCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC41IiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDUpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfZ3JvdXBfbGlzdFtdID0gewotCVswXSA9ICZjbGtfZXh0X3h0YWxfbXV4LAotCVsxXSA9ICZjbGtfeHVzYnh0aSwKLQlbMl0gPSAmY2xrX3NjbGtfaGRtaTI3bSwKLQlbM10gPSAmY2xrX3NjbGtfdXNicGh5MCwKLQlbNF0gPSAmY2xrX3NjbGtfdXNicGh5MSwKLQlbNV0gPSAmY2xrX3NjbGtfaGRtaXBoeSwKLQlbNl0gPSAmY2xrX21vdXRfbXBsbC5jbGssCi0JWzddID0gJmNsa19tb3V0X2VwbGwuY2xrLAotCVs4XSA9ICZjbGtfc2Nsa192cGxsLmNsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X2dyb3VwID0gewotCS5zb3VyY2VzCT0gY2xrc2V0X2dyb3VwX2xpc3QsCi0JLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9ncm91cF9saXN0KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dF9nMmQwX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX21vdXRfbXBsbC5jbGssCi0JWzFdID0gJmNsa19zY2xrX2FwbGwuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9nMmQwID0gewotCS5zb3VyY2VzCT0gY2xrc2V0X21vdXRfZzJkMF9saXN0LAotCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dF9nMmQwX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2cyZDAgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gIm1vdXRfZzJkMCIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9nMmQwLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19JTUFHRSwgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRfZzJkMV9saXN0W10gPSB7Ci0JWzBdID0gJmNsa19tb3V0X2VwbGwuY2xrLAotCVsxXSA9ICZjbGtfc2Nsa192cGxsLmNsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X21vdXRfZzJkMSA9IHsKLQkuc291cmNlcwk9IGNsa3NldF9tb3V0X2cyZDFfbGlzdCwKLQkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRfZzJkMV9saXN0KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9nMmQxID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJtb3V0X2cyZDEiLAotCX0sCi0JLnNvdXJjZXMJPSAmY2xrc2V0X21vdXRfZzJkMSwKLQkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfSU1BR0UsIC5zaGlmdCA9IDQsIC5zaXplID0gMSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9tb3V0X2cyZF9saXN0W10gPSB7Ci0JWzBdID0gJmNsa19tb3V0X2cyZDAuY2xrLAotCVsxXSA9ICZjbGtfbW91dF9nMmQxLmNsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X21vdXRfZzJkID0gewotCS5zb3VyY2VzCT0gY2xrc2V0X21vdXRfZzJkX2xpc3QsCi0JLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9tb3V0X2cyZF9saXN0KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dF9tZmMwX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX21vdXRfbXBsbC5jbGssCi0JWzFdID0gJmNsa19zY2xrX2FwbGwuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9tZmMwID0gewotCS5zb3VyY2VzCT0gY2xrc2V0X21vdXRfbWZjMF9saXN0LAotCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dF9tZmMwX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X21mYzAgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gIm1vdXRfbWZjMCIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9tZmMwLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19NRkMsIC5zaGlmdCA9IDAsIC5zaXplID0gMSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9tb3V0X21mYzFfbGlzdFtdID0gewotCVswXSA9ICZjbGtfbW91dF9lcGxsLmNsaywKLQlbMV0gPSAmY2xrX3NjbGtfdnBsbC5jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0X21mYzEgPSB7Ci0JLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9tZmMxX2xpc3QsCi0JLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9tb3V0X21mYzFfbGlzdCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbWZjMSA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAibW91dF9tZmMxIiwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa3NldF9tb3V0X21mYzEsCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX01GQywgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRfbWZjX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX21vdXRfbWZjMC5jbGssCi0JWzFdID0gJmNsa19tb3V0X21mYzEuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9tZmMgPSB7Ci0JLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9tZmNfbGlzdCwKLQkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRfbWZjX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X21tYzAgPSB7Ci0JLmNsawkJPSB7Ci0JCS5uYW1lCQk9ICJkb3V0X21tYzAiLAotCX0sCi0JLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzEsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X21tYzEgPSB7Ci0JLmNsawkJPSB7Ci0JCS5uYW1lCQk9ICJkb3V0X21tYzEiLAotCX0sCi0JLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDQgfSwKLQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzEsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDQgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWMyID0gewotCS5jbGsJCT0gewotCQkubmFtZQkJPSAiZG91dF9tbWMyIiwKLQl9LAotCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gOCwgLnNpemUgPSA0IH0sCi0JLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMyLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWMzID0gewotCS5jbGsJCT0gewotCQkubmFtZQkJPSAiZG91dF9tbWMzIiwKLQl9LAotCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gMTIsIC5zaXplID0gNCB9LAotCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMiwgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X21tYzQgPSB7Ci0JLmNsawkJPSB7Ci0JCS5uYW1lCQk9ICJkb3V0X21tYzQiLAotCX0sCi0JLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCi0JLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMzLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtzcmNzW10gPSB7Ci0JewotCQkuY2xrCT0gewotCQkJLm5hbWUJCT0gInVjbGsxIiwKLQkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4wIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDBfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMCwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9QRVJJTDAsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAidWNsazEiLAotCQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjEiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfUEVSSUwwLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJ1Y2xrMSIsCi0JCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMiIsCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwwX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDgpLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDAsIC5zaGlmdCA9IDgsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwwLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInVjbGsxIiwKLQkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4zIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDBfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDAsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19wd20iLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMCwgLnNoaWZ0ID0gMjQsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwzLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfY3NpcyIsCi0JCQkuZGV2bmFtZQk9ICJzNXAtbWlwaS1jc2lzLjAiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gMjQsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ0FNLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2NzaXMiLAotCQkJLmRldm5hbWUJPSAiczVwLW1pcGktY3Npcy4xIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMjgpLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDI4LCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMjgsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19jYW0wIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMTYpLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19jYW0xIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMjApLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMjAsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19maW1jIiwKLQkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4wIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19maW1jIiwKLQkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4xIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgNCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gNCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDQsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19maW1jIiwKLQkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4yIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgOCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gOCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDgsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19maW1jIiwKLQkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4zIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMTIsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19maW1kIiwKLQkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmIuMCIsCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfbGNkMF9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfTENEMCwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9MQ0QwLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfZmltZCIsCi0JCQkuZGV2bmFtZQk9ICJleHlub3M0LWZiLjEiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2xjZDFfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0xDRDEsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfTENEMSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX3NhdGEiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMjQpLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfbW91dF9jb3JlYnVzLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gMjQsIC5zaXplID0gMSB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzAsIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfc3BpIiwKLQkJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjAiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAxNiksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMSwgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwxLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfc3BpIiwKLQkJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjEiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAyMCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMSwgLnNoaWZ0ID0gMjAsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwxLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX3NwaSIsCi0JCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4yIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDFfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMjQpLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDEsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMiwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2ZpbWcyZCIsCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9tb3V0X2cyZCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0lNQUdFLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDEgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0lNQUdFLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfbWZjIiwKLQkJCS5kZXZuYW1lCT0gInM1cC1tZmMiLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfbW91dF9tZmMsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19NRkMsIC5zaGlmdCA9IDgsIC5zaXplID0gMSB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfTUZDLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKLQkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKLQkJCS5wYXJlbnQJCT0gJmNsa19kb3V0X21tYzAuY2xrLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JCX0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMSwgLnNoaWZ0ID0gOCwgLnNpemUgPSA4IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX21tYyIsCi0JCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCi0JCQkucGFyZW50ICAgICAgICAgPSAmY2xrX2RvdXRfbW1jMS5jbGssCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKLQkJfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMxLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA4IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX21tYyIsCi0JCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMiIsCi0JCQkucGFyZW50ICAgICAgICAgPSAmY2xrX2RvdXRfbW1jMi5jbGssCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKLQkJfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMyLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDggfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKLQkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4zIiwKLQkJCS5wYXJlbnQgICAgICAgICA9ICZjbGtfZG91dF9tbWMzLmNsaywKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKLQkJfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMyLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA4IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2R3bW1jIiwKLQkJCS5wYXJlbnQgICAgICAgICA9ICZjbGtfZG91dF9tbWM0LmNsaywKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKLQkJfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMzLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDggfSwKLQl9Ci19OwotCi0vKiBDbG9jayBpbml0aWFsaXphdGlvbiBjb2RlICovCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgKnN5c2Nsa3NbXSA9IHsKLQkmY2xrX21vdXRfYXBsbCwKLQkmY2xrX3NjbGtfYXBsbCwKLQkmY2xrX21vdXRfZXBsbCwKLQkmY2xrX21vdXRfbXBsbCwKLQkmY2xrX21vdXRjb3JlLAotCSZjbGtfY29yZWNsaywKLQkmY2xrX2FybWNsaywKLQkmY2xrX2FjbGtfY29yZW0wLAotCSZjbGtfYWNsa19jb3JlcywKLQkmY2xrX2FjbGtfY29yZW0xLAotCSZjbGtfcGVyaXBoY2xrLAotCSZjbGtfbW91dF9jb3JlYnVzLAotCSZjbGtfc2Nsa19kbWMsCi0JJmNsa19hY2xrX2NvcmVkLAotCSZjbGtfYWNsa19jb3JlcCwKLQkmY2xrX2FjbGtfYWNwLAotCSZjbGtfcGNsa19hY3AsCi0JJmNsa192cGxsc3JjLAotCSZjbGtfc2Nsa192cGxsLAotCSZjbGtfYWNsa18yMDAsCi0JJmNsa19hY2xrXzEwMCwKLQkmY2xrX2FjbGtfMTYwLAotCSZjbGtfYWNsa18xMzMsCi0JJmNsa19kb3V0X21tYzAsCi0JJmNsa19kb3V0X21tYzEsCi0JJmNsa19kb3V0X21tYzIsCi0JJmNsa19kb3V0X21tYzMsCi0JJmNsa19kb3V0X21tYzQsCi0JJmNsa19tb3V0X21mYzAsCi0JJmNsa19tb3V0X21mYzEsCi19OwotCi1zdGF0aWMgaW50IHh0YWxfcmF0ZTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh5bm9zNF9mb3V0X2FwbGxfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBzNXBfZ2V0X3BsbDQ1eHgoeHRhbF9yYXRlLCBfX3Jhd19yZWFkbChTNVBfQVBMTF9DT04wKSwgcGxsXzQ1MDgpOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgZXh5bm9zNF9mb3V0X2FwbGxfb3BzID0gewotCS5nZXRfcmF0ZSA9IGV4eW5vczRfZm91dF9hcGxsX2dldF9yYXRlLAotfTsKLQotdm9pZCBfX2luaXRfb3JfY3B1ZnJlcSBleHlub3M0X3NldHVwX2Nsb2Nrcyh2b2lkKQotewotCXN0cnVjdCBjbGsgKnh0YWxfY2xrOwotCXVuc2lnbmVkIGxvbmcgYXBsbDsKLQl1bnNpZ25lZCBsb25nIG1wbGw7Ci0JdW5zaWduZWQgbG9uZyBlcGxsOwotCXVuc2lnbmVkIGxvbmcgdnBsbDsKLQl1bnNpZ25lZCBsb25nIHZwbGxzcmM7Ci0JdW5zaWduZWQgbG9uZyB4dGFsOwotCXVuc2lnbmVkIGxvbmcgYXJtY2xrOwotCXVuc2lnbmVkIGxvbmcgc2Nsa19kbWM7Ci0JdW5zaWduZWQgbG9uZyBhY2xrXzIwMDsKLQl1bnNpZ25lZCBsb25nIGFjbGtfMTAwOwotCXVuc2lnbmVkIGxvbmcgYWNsa18xNjA7Ci0JdW5zaWduZWQgbG9uZyBhY2xrXzEzMzsKLQl1bnNpZ25lZCBpbnQgcHRyOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWdpc3RlcmluZyBjbG9ja3NcbiIsIF9fZnVuY19fKTsKLQotCXh0YWxfY2xrID0gY2xrX2dldChOVUxMLCAieHRhbCIpOwotCUJVR19PTihJU19FUlIoeHRhbF9jbGspKTsKLQotCXh0YWwgPSBjbGtfZ2V0X3JhdGUoeHRhbF9jbGspOwotCi0JeHRhbF9yYXRlID0geHRhbDsKLQotCWNsa19wdXQoeHRhbF9jbGspOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB4dGFsIGlzICVsZFxuIiwgX19mdW5jX18sIHh0YWwpOwotCi0JYXBsbCA9IHM1cF9nZXRfcGxsNDV4eCh4dGFsLCBfX3Jhd19yZWFkbChTNVBfQVBMTF9DT04wKSwgcGxsXzQ1MDgpOwotCW1wbGwgPSBzNXBfZ2V0X3BsbDQ1eHgoeHRhbCwgX19yYXdfcmVhZGwoUzVQX01QTExfQ09OMCksIHBsbF80NTA4KTsKLQllcGxsID0gczVwX2dldF9wbGw0Nnh4KHh0YWwsIF9fcmF3X3JlYWRsKFM1UF9FUExMX0NPTjApLAotCQkJCV9fcmF3X3JlYWRsKFM1UF9FUExMX0NPTjEpLCBwbGxfNDYwMCk7Ci0KLQl2cGxsc3JjID0gY2xrX2dldF9yYXRlKCZjbGtfdnBsbHNyYy5jbGspOwotCXZwbGwgPSBzNXBfZ2V0X3BsbDQ2eHgodnBsbHNyYywgX19yYXdfcmVhZGwoUzVQX1ZQTExfQ09OMCksCi0JCQkJX19yYXdfcmVhZGwoUzVQX1ZQTExfQ09OMSksIHBsbF80NjUwYyk7Ci0KLQljbGtfZm91dF9hcGxsLm9wcyA9ICZleHlub3M0X2ZvdXRfYXBsbF9vcHM7Ci0JY2xrX2ZvdXRfbXBsbC5yYXRlID0gbXBsbDsKLQljbGtfZm91dF9lcGxsLnJhdGUgPSBlcGxsOwotCWNsa19mb3V0X3ZwbGwucmF0ZSA9IHZwbGw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJFWFlOT1M0OiBQTEwgc2V0dGluZ3MsIEE9JWxkLCBNPSVsZCwgRT0lbGQgVj0lbGQiLAotCQkJYXBsbCwgbXBsbCwgZXBsbCwgdnBsbCk7Ci0KLQlhcm1jbGsgPSBjbGtfZ2V0X3JhdGUoJmNsa19hcm1jbGsuY2xrKTsKLQlzY2xrX2RtYyA9IGNsa19nZXRfcmF0ZSgmY2xrX3NjbGtfZG1jLmNsayk7Ci0KLQlhY2xrXzIwMCA9IGNsa19nZXRfcmF0ZSgmY2xrX2FjbGtfMjAwLmNsayk7Ci0JYWNsa18xMDAgPSBjbGtfZ2V0X3JhdGUoJmNsa19hY2xrXzEwMC5jbGspOwotCWFjbGtfMTYwID0gY2xrX2dldF9yYXRlKCZjbGtfYWNsa18xNjAuY2xrKTsKLQlhY2xrXzEzMyA9IGNsa19nZXRfcmF0ZSgmY2xrX2FjbGtfMTMzLmNsayk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJFWFlOT1M0OiBBUk1DTEs9JWxkLCBETUM9JWxkLCBBQ0xLMjAwPSVsZFxuIgotCQkJICJBQ0xLMTAwPSVsZCwgQUNMSzE2MD0lbGQsIEFDTEsxMzM9JWxkXG4iLAotCQkJYXJtY2xrLCBzY2xrX2RtYywgYWNsa18yMDAsCi0JCQlhY2xrXzEwMCwgYWNsa18xNjAsIGFjbGtfMTMzKTsKLQotCWNsa19mLnJhdGUgPSBhcm1jbGs7Ci0JY2xrX2gucmF0ZSA9IHNjbGtfZG1jOwotCWNsa19wLnJhdGUgPSBhY2xrXzEwMDsKLQotCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShjbGtzcmNzKTsgcHRyKyspCi0JCXMzY19zZXRfY2xrc3JjKCZjbGtzcmNzW3B0cl0sIHRydWUpOwotfQotCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc1tdIF9faW5pdGRhdGEgPSB7Ci0JLyogTm90aGluZyBoZXJlIHlldCAqLwotfTsKLQotdm9pZCBfX2luaXQgZXh5bm9zNF9yZWdpc3Rlcl9jbG9ja3Modm9pZCkKLXsKLQlpbnQgcHRyOwotCi0JczNjMjR4eF9yZWdpc3Rlcl9jbG9ja3MoY2xrcywgQVJSQVlfU0laRShjbGtzKSk7Ci0KLQlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoc3lzY2xrcyk7IHB0cisrKQotCQlzM2NfcmVnaXN0ZXJfY2xrc3JjKHN5c2Nsa3NbcHRyXSwgMSk7Ci0KLQlzM2NfcmVnaXN0ZXJfY2xrc3JjKGNsa3NyY3MsIEFSUkFZX1NJWkUoY2xrc3JjcykpOwotCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3MsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3MpKTsKLQotCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOwotCXMzY19kaXNhYmxlX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7Ci0KLQlzM2NfcHdtY2xrX2luaXQoKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHUuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2ZDZmYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0KLSNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KLQotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC9jbG9jay5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvZXh5bm9zNC5oPgotI2luY2x1ZGUgPHBsYXQvYWRjLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+Ci0jaW5jbHVkZSA8cGxhdC9mYi1jb3JlLmg+Ci0jaW5jbHVkZSA8cGxhdC9maW1jLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy1jb3JlLmg+Ci0jaW5jbHVkZSA8cGxhdC9yZXNldC5oPgotCi0jaW5jbHVkZSA8bWFjaC9yZWdzLWlycS5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KLQotZXh0ZXJuIGludCBjb21iaW5lcl9pbml0KHVuc2lnbmVkIGludCBjb21iaW5lcl9uciwgdm9pZCBfX2lvbWVtICpiYXNlLAotCQkJIHVuc2lnbmVkIGludCBpcnFfc3RhcnQpOwotZXh0ZXJuIHZvaWQgY29tYmluZXJfY2FzY2FkZV9pcnEodW5zaWduZWQgaW50IGNvbWJpbmVyX25yLCB1bnNpZ25lZCBpbnQgaXJxKTsKLQotLyogSW5pdGlhbCBJTyBtYXBwaW5ncyAqLwotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBleHlub3M0X2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9TWVNUSU1FUiwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfU1lTVElNRVIpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkgCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfU1lTUkFNLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9TWVNSQU0pLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9DTVUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0NNVSksCi0JCS5sZW5ndGgJCT0gU1pfMTI4SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfUE1VLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9QTVUpLAotCQkubGVuZ3RoCQk9IFNaXzY0SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfQ09NQklORVJfQkFTRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfQ09NQklORVIpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9DT1JFUEVSSV9CQVNFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9DT1JFUEVSSSksCi0JCS5sZW5ndGgJCT0gU1pfOEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0wyQ0MsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0wyQ0MpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9HUElPMSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfR1BJTzEpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9HUElPMiwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfR1BJTzIpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9HUElPMywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfR1BJTzMpLAotCQkubGVuZ3RoCQk9IFNaXzI1NiwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfRE1DMCwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfRE1DMCksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzNDX1ZBX1VBUlQsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihTM0NfUEFfVUFSVCksCi0JCS5sZW5ndGgJCT0gU1pfNTEySywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfU1JPTUMsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX1NST01DKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTM0NfVkFfVVNCX0hTUEhZLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9IU1BIWSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0dJQ19DUFUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0dJQ19DUFUpLAotCQkubGVuZ3RoCQk9IFNaXzY0SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfR0lDX0RJU1QsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0dJQ19ESVNUKSwKLQkJLmxlbmd0aAkJPSBTWl82NEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgZXh5bm9zNF9pZGxlKHZvaWQpCi17Ci0JaWYgKCFuZWVkX3Jlc2NoZWQoKSkKLQkJY3B1X2RvX2lkbGUoKTsKLQotCWxvY2FsX2lycV9lbmFibGUoKTsKLX0KLQotc3RhdGljIHZvaWQgZXh5bm9zNF9zd19yZXNldCh2b2lkKQotewotCV9fcmF3X3dyaXRlbCgweDEsIFM1UF9TV1JFU0VUKTsKLX0KLQotLyoKLSAqIGV4eW5vczRfbWFwX2lvCi0gKgotICogcmVnaXN0ZXIgdGhlIHN0YW5kYXJkIGNwdSBJTyBhcmVhcwotICovCi12b2lkIF9faW5pdCBleHlub3M0X21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChleHlub3M0X2lvZGVzYywgQVJSQVlfU0laRShleHlub3M0X2lvZGVzYykpOwotCi0JLyogaW5pdGlhbGl6ZSBkZXZpY2UgaW5mb3JtYXRpb24gZWFybHkgKi8KLQlleHlub3M0X2RlZmF1bHRfc2RoY2kwKCk7Ci0JZXh5bm9zNF9kZWZhdWx0X3NkaGNpMSgpOwotCWV4eW5vczRfZGVmYXVsdF9zZGhjaTIoKTsKLQlleHlub3M0X2RlZmF1bHRfc2RoY2kzKCk7Ci0KLQlzM2NfYWRjX3NldG5hbWUoInNhbXN1bmctYWRjLXYzIik7Ci0KLQlzM2NfZmltY19zZXRuYW1lKDAsICJleHlub3M0LWZpbWMiKTsKLQlzM2NfZmltY19zZXRuYW1lKDEsICJleHlub3M0LWZpbWMiKTsKLQlzM2NfZmltY19zZXRuYW1lKDIsICJleHlub3M0LWZpbWMiKTsKLQlzM2NfZmltY19zZXRuYW1lKDMsICJleHlub3M0LWZpbWMiKTsKLQotCS8qIFRoZSBJMkMgYnVzIGNvbnRyb2xsZXJzIGFyZSBkaXJlY3RseSBjb21wYXRpYmxlIHdpdGggczNjMjQ0MCAqLwotCXMzY19pMmMwX3NldG5hbWUoInMzYzI0NDAtaTJjIik7Ci0JczNjX2kyYzFfc2V0bmFtZSgiczNjMjQ0MC1pMmMiKTsKLQlzM2NfaTJjMl9zZXRuYW1lKCJzM2MyNDQwLWkyYyIpOwotCi0JczVwX2ZiX3NldG5hbWUoMCwgImV4eW5vczQtZmIiKTsKLX0KLQotdm9pZCBfX2luaXQgZXh5bm9zNF9pbml0X2Nsb2NrcyhpbnQgeHRhbCkKLXsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGluaXRpYWxpemluZyBjbG9ja3NcbiIsIF9fZnVuY19fKTsKLQotCXMzYzI0eHhfcmVnaXN0ZXJfYmFzZWNsb2Nrcyh4dGFsKTsKLQlzNXBfcmVnaXN0ZXJfY2xvY2tzKHh0YWwpOwotCWV4eW5vczRfcmVnaXN0ZXJfY2xvY2tzKCk7Ci0JZXh5bm9zNF9zZXR1cF9jbG9ja3MoKTsKLX0KLQotc3RhdGljIHZvaWQgZXh5bm9zNF9naWNfaXJxX2VvaShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0Jc3RydWN0IGdpY19jaGlwX2RhdGEgKmdpY19kYXRhID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0KLQlnaWNfZGF0YS0+Y3B1X2Jhc2UgPSBTNVBfVkFfR0lDX0NQVSArCi0JCQkgICAgKEVYWU5PUzRfR0lDX0JBTktfT0ZGU0VUICogc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLX0KLQotdm9pZCBfX2luaXQgZXh5bm9zNF9pbml0X2lycSh2b2lkKQotewotCWludCBpcnE7Ci0KLQlnaWNfaW5pdCgwLCBJUlFfU1BJKDApLCBTNVBfVkFfR0lDX0RJU1QsIFM1UF9WQV9HSUNfQ1BVKTsKLQlnaWNfYXJjaF9leHRuLmlycV9lb2kgPSBleHlub3M0X2dpY19pcnFfZW9pOwotCi0JZm9yIChpcnEgPSAwOyBpcnEgPCBNQVhfQ09NQklORVJfTlI7IGlycSsrKSB7Ci0KLQkJY29tYmluZXJfaW5pdChpcnEsICh2b2lkIF9faW9tZW0gKilTNVBfVkFfQ09NQklORVIoaXJxKSwKLQkJCQlDT01CSU5FUl9JUlEoaXJxLCAwKSk7Ci0JCWNvbWJpbmVyX2Nhc2NhZGVfaXJxKGlycSwgSVJRX1NQSShpcnEpKTsKLQl9Ci0KLQkvKiBUaGUgcGFyYW1ldGVycyBvZiBzNXBfaW5pdF9pcnEoKSBhcmUgZm9yIFZJQyBpbml0LgotCSAqIFRoZXNlcyBwYXJhbWV0ZXJzIHNob3VsZCBiZSBOVUxMIGFuZCAwIGJlY2F1c2UgRVhZTk9TNAotCSAqIHVzZXMgR0lDIGluc3RlYWQgb2YgVklDLgotCSAqLwotCXM1cF9pbml0X2lycShOVUxMLCAwKTsKLX0KLQotc3RydWN0IHN5c2Rldl9jbGFzcyBleHlub3M0X3N5c2NsYXNzID0gewotCS5uYW1lCT0gImV4eW5vczQtY29yZSIsCi19OwotCi1zdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZXh5bm9zNF9zeXNkZXYgPSB7Ci0JLmNscwk9ICZleHlub3M0X3N5c2NsYXNzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZXh5bm9zNF9jb3JlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZleHlub3M0X3N5c2NsYXNzKTsKLX0KLQotY29yZV9pbml0Y2FsbChleHlub3M0X2NvcmVfaW5pdCk7Ci0KLSNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAotc3RhdGljIGludCBfX2luaXQgZXh5bm9zNF9sMngwX2NhY2hlX2luaXQodm9pZCkKLXsKLQkvKiBUQUcsIERhdGEgTGF0ZW5jeSBDb250cm9sOiAyY3ljbGUgKi8KLQlfX3Jhd193cml0ZWwoMHgxMTAsIFM1UF9WQV9MMkNDICsgTDJYMF9UQUdfTEFURU5DWV9DVFJMKTsKLQlfX3Jhd193cml0ZWwoMHgxMTAsIFM1UF9WQV9MMkNDICsgTDJYMF9EQVRBX0xBVEVOQ1lfQ1RSTCk7Ci0KLQkvKiBMMlgwIFByZWZldGNoIENvbnRyb2wgKi8KLQlfX3Jhd193cml0ZWwoMHgzMDAwMDAwNywgUzVQX1ZBX0wyQ0MgKyBMMlgwX1BSRUZFVENIX0NUUkwpOwotCi0JLyogTDJYMCBQb3dlciBDb250cm9sICovCi0JX19yYXdfd3JpdGVsKEwyWDBfRFlOQU1JQ19DTEtfR0FUSU5HX0VOIHwgTDJYMF9TVE5EQllfTU9ERV9FTiwKLQkJICAgICBTNVBfVkFfTDJDQyArIEwyWDBfUE9XRVJfQ1RSTCk7Ci0KLQlsMngwX2luaXQoUzVQX1ZBX0wyQ0MsIDB4N0M0NzAwMDEsIDB4QzIwMGZmZmYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWVhcmx5X2luaXRjYWxsKGV4eW5vczRfbDJ4MF9jYWNoZV9pbml0KTsKLSNlbmRpZgotCi1pbnQgX19pbml0IGV4eW5vczRfaW5pdCh2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gIkVYWU5PUzQ6IEluaXRpYWxpemluZyBhcmNoaXRlY3R1cmVcbiIpOwotCi0JLyogc2V0IGlkbGUgZnVuY3Rpb24gKi8KLQlwbV9pZGxlID0gZXh5bm9zNF9pZGxlOwotCi0JLyogc2V0IHN3X3Jlc2V0IGZ1bmN0aW9uICovCi0JczVwX3Jlc2V0X2hvb2sgPSBleHlub3M0X3N3X3Jlc2V0OwotCi0JcmV0dXJuIHN5c2Rldl9yZWdpc3RlcigmZXh5bm9zNF9zeXNkZXYpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdWlkbGUuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHVpZGxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmN2U5NmYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdWlkbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHVpZGxlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KLQotc3RhdGljIGludCBleHlub3M0X2VudGVyX2lkbGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpOwotCi1zdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgZXh5bm9zNF9jcHVpZGxlX3NldFtdID0gewotCVswXSA9IHsKLQkJLmVudGVyCQkJPSBleHlub3M0X2VudGVyX2lkbGUsCi0JCS5leGl0X2xhdGVuY3kJCT0gMSwKLQkJLnRhcmdldF9yZXNpZGVuY3kJPSAxMDAwMDAsCi0JCS5mbGFncwkJCT0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCi0JCS5uYW1lCQkJPSAiSURMRSIsCi0JCS5kZXNjCQkJPSAiQVJNIGNsb2NrIGdhdGluZyhXRkkpIiwKLQl9LAotfTsKLQotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVpZGxlX2RldmljZSwgZXh5bm9zNF9jcHVpZGxlX2RldmljZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgZXh5bm9zNF9pZGxlX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiZXh5bm9zNF9pZGxlIiwKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IGV4eW5vczRfZW50ZXJfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgdGltZXZhbCBiZWZvcmUsIGFmdGVyOwotCWludCBpZGxlX3RpbWU7Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWRvX2dldHRpbWVvZmRheSgmYmVmb3JlKTsKLQotCWNwdV9kb19pZGxlKCk7Ci0KLQlkb19nZXR0aW1lb2ZkYXkoJmFmdGVyKTsKLQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JaWRsZV90aW1lID0gKGFmdGVyLnR2X3NlYyAtIGJlZm9yZS50dl9zZWMpICogVVNFQ19QRVJfU0VDICsKLQkJICAgIChhZnRlci50dl91c2VjIC0gYmVmb3JlLnR2X3VzZWMpOwotCi0JcmV0dXJuIGlkbGVfdGltZTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgZXh5bm9zNF9pbml0X2NwdWlkbGUodm9pZCkKLXsKLQlpbnQgaSwgbWF4X2NwdWlkbGVfc3RhdGUsIGNwdV9pZDsKLQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldmljZTsKLQotCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZleHlub3M0X2lkbGVfZHJpdmVyKTsKLQotCWZvcl9lYWNoX2NwdShjcHVfaWQsIGNwdV9vbmxpbmVfbWFzaykgewotCQlkZXZpY2UgPSAmcGVyX2NwdShleHlub3M0X2NwdWlkbGVfZGV2aWNlLCBjcHVfaWQpOwotCQlkZXZpY2UtPmNwdSA9IGNwdV9pZDsKLQotCQlkZXZpY2UtPnN0YXRlX2NvdW50ID0gKHNpemVvZihleHlub3M0X2NwdWlkbGVfc2V0KSAvCi0JCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNwdWlkbGVfc3RhdGUpKTsKLQotCQltYXhfY3B1aWRsZV9zdGF0ZSA9IGRldmljZS0+c3RhdGVfY291bnQ7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG1heF9jcHVpZGxlX3N0YXRlOyBpKyspIHsKLQkJCW1lbWNweSgmZGV2aWNlLT5zdGF0ZXNbaV0sICZleHlub3M0X2NwdWlkbGVfc2V0W2ldLAotCQkJCQlzaXplb2Yoc3RydWN0IGNwdWlkbGVfc3RhdGUpKTsKLQkJfQotCi0JCWlmIChjcHVpZGxlX3JlZ2lzdGVyX2RldmljZShkZXZpY2UpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkNQVWlkbGUgcmVnaXN0ZXIgZGV2aWNlIGZhaWxlZFxuLCIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci1kZXZpY2VfaW5pdGNhbGwoZXh5bm9zNF9pbml0X2NwdWlkbGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1zeXNtbXUuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtc3lzbW11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiN2NhZTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1zeXNtbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LXN5c21tdS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQgLSBTeXN0ZW0gTU1VIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL3N5c21tdS5oPgotI2luY2x1ZGUgPHBsYXQvczVwLWNsb2NrLmg+Ci0KLS8qIFRoZXNlIG5hbWVzIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNsb2NrIG5hbWVzIGluIG1hY2gtZXh5bm9zNC9jbG9jay5jICovCi1jb25zdCBjaGFyICpzeXNtbXVfaXBzX25hbWVbRVhZTk9TNF9TWVNNTVVfVE9UQUxfSVBOVU1dID0gewotCSJTWVNNTVVfTURNQSIJLAotCSJTWVNNTVVfU1NTIgksCi0JIlNZU01NVV9GSU1DMCIJLAotCSJTWVNNTVVfRklNQzEiCSwKLQkiU1lTTU1VX0ZJTUMyIgksCi0JIlNZU01NVV9GSU1DMyIJLAotCSJTWVNNTVVfSlBFRyIJLAotCSJTWVNNTVVfRklNRDAiCSwKLQkiU1lTTU1VX0ZJTUQxIgksCi0JIlNZU01NVV9QQ0llIgksCi0JIlNZU01NVV9HMkQiCSwKLQkiU1lTTU1VX1JPVEFUT1IiLAotCSJTWVNNTVVfTURNQTIiCSwKLQkiU1lTTU1VX1RWIgksCi0JIlNZU01NVV9NRkNfTCIJLAotCSJTWVNNTVVfTUZDX1IiCSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXh5bm9zNF9zeXNtbXVfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX01ETUEsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRE1BICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfTURNQTBfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfTURNQTBfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMl0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX1NTUywKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX1NTUyArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzNdID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX1NTU18wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9TU1NfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbNF0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMwLAotCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzAgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVs1XSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1NZU01NVV9GSU1DMF8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9GSU1DMF8wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVs2XSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzEsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMSArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzddID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0ZJTUMxXzAsCi0JCS5lbmQJPSBJUlFfU1lTTU1VX0ZJTUMxXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzhdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMiwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMyICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbOV0gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfRklNQzJfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfRklNQzJfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMTBdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMywKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMzICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMTFdID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0ZJTUMzXzAsCi0JCS5lbmQJPSBJUlFfU1lTTU1VX0ZJTUMzXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzEyXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfSlBFRywKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0pQRUcgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxM10gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfSlBFR18wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9KUEVHXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzE0XSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNRDAsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1EMCArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzE1XSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1NZU01NVV9MQ0QwX00wXzAsCi0JCS5lbmQJPSBJUlFfU1lTTU1VX0xDRDBfTTBfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMTZdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1EMSwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUQxICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMTddID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0xDRDFfTTFfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfTENEMV9NMV8wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsxOF0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX1BDSWUsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9QQ0llICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMTldID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX1BDSUVfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfUENJRV8wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyMF0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0cyRCwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0cyRCArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzIxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1NZU01NVV8yRF8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV8yRF8wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyMl0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX1JPVEFUT1IsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9ST1RBVE9SICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMjNdID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX1JPVEFUT1JfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfUk9UQVRPUl8wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyNF0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX01ETUEyLAotCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfTURNQTIgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsyNV0gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfTURNQTFfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfTURNQTFfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMjZdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9UViwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX1RWICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMjddID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX1RWX00wXzAsCi0JCS5lbmQJPSBJUlFfU1lTTU1VX1RWX00wXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzI4XSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfTUZDX0wsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRkNfTCArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzI5XSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1NZU01NVV9NRkNfTTBfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfTUZDX00wXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzMwXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfTUZDX1IsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRkNfUiArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzMxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1NZU01NVV9NRkNfTTFfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfTUZDX00xXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3N5c21tdSA9IHsKLQkubmFtZQkJPSAiczVwLXN5c21tdSIsCi0JLmlkCQk9IDMyLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShleHlub3M0X3N5c21tdV9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gZXh5bm9zNF9zeXNtbXVfcmVzb3VyY2UsCi19OwotRVhQT1JUX1NZTUJPTChleHlub3M0X2RldmljZV9zeXNtbXUpOwotCi1zdGF0aWMgc3RydWN0IGNsayAqc3lzbW11X2Nsa1tTNVBfU1lTTU1VX1RPVEFMX0lQTlVNXTsKLXZvaWQgc3lzbW11X2Nsa19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3lzbW11X2lwcyBpcHMpCi17Ci0Jc3lzbW11X2Nsa1tpcHNdID0gY2xrX2dldChkZXYsIHN5c21tdV9pcHNfbmFtZVtpcHNdKTsKLQlpZiAoSVNfRVJSKHN5c21tdV9jbGtbaXBzXSkpCi0JCXN5c21tdV9jbGtbaXBzXSA9IE5VTEw7Ci0JZWxzZQotCQljbGtfcHV0KHN5c21tdV9jbGtbaXBzXSk7Ci19Ci0KLXZvaWQgc3lzbW11X2Nsa19lbmFibGUoc3lzbW11X2lwcyBpcHMpCi17Ci0JaWYgKHN5c21tdV9jbGtbaXBzXSkKLQkJY2xrX2VuYWJsZShzeXNtbXVfY2xrW2lwc10pOwotfQotCi12b2lkIHN5c21tdV9jbGtfZGlzYWJsZShzeXNtbXVfaXBzIGlwcykKLXsKLQlpZiAoc3lzbW11X2Nsa1tpcHNdKQotCQljbGtfZGlzYWJsZShzeXNtbXVfY2xrW2lwc10pOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2RtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjRiYjUzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvZG1hLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZC4KLSAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvaXJxcy5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLQotI2luY2x1ZGUgPHBsYXQvczNjLXBsMzMwLXBkYXRhLmg+Ci0KLXN0YXRpYyB1NjQgZG1hX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGV4eW5vczRfcGRtYTBfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfUERNQTAsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1BETUEwICsgU1pfNEssCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfUERNQTAsCi0JCS5lbmQJPSBJUlFfUERNQTAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9wbGF0ZGF0YSBleHlub3M0X3BkbWEwX3BkYXRhID0gewotCS5wZXJpID0gewotCQlbMF0gPSBETUFDSF9QQ00wX1JYLAotCQlbMV0gPSBETUFDSF9QQ00wX1RYLAotCQlbMl0gPSBETUFDSF9QQ00yX1JYLAotCQlbM10gPSBETUFDSF9QQ00yX1RYLAotCQlbNF0gPSBETUFDSF9NU01fUkVRMCwKLQkJWzVdID0gRE1BQ0hfTVNNX1JFUTIsCi0JCVs2XSA9IERNQUNIX1NQSTBfUlgsCi0JCVs3XSA9IERNQUNIX1NQSTBfVFgsCi0JCVs4XSA9IERNQUNIX1NQSTJfUlgsCi0JCVs5XSA9IERNQUNIX1NQSTJfVFgsCi0JCVsxMF0gPSBETUFDSF9JMlMwU19UWCwKLQkJWzExXSA9IERNQUNIX0kyUzBfUlgsCi0JCVsxMl0gPSBETUFDSF9JMlMwX1RYLAotCQlbMTNdID0gRE1BQ0hfSTJTMl9SWCwKLQkJWzE0XSA9IERNQUNIX0kyUzJfVFgsCi0JCVsxNV0gPSBETUFDSF9VQVJUMF9SWCwKLQkJWzE2XSA9IERNQUNIX1VBUlQwX1RYLAotCQlbMTddID0gRE1BQ0hfVUFSVDJfUlgsCi0JCVsxOF0gPSBETUFDSF9VQVJUMl9UWCwKLQkJWzE5XSA9IERNQUNIX1VBUlQ0X1JYLAotCQlbMjBdID0gRE1BQ0hfVUFSVDRfVFgsCi0JCVsyMV0gPSBETUFDSF9TTElNQlVTMF9SWCwKLQkJWzIyXSA9IERNQUNIX1NMSU1CVVMwX1RYLAotCQlbMjNdID0gRE1BQ0hfU0xJTUJVUzJfUlgsCi0JCVsyNF0gPSBETUFDSF9TTElNQlVTMl9UWCwKLQkJWzI1XSA9IERNQUNIX1NMSU1CVVM0X1JYLAotCQlbMjZdID0gRE1BQ0hfU0xJTUJVUzRfVFgsCi0JCVsyN10gPSBETUFDSF9BQzk3X01JQ0lOLAotCQlbMjhdID0gRE1BQ0hfQUM5N19QQ01JTiwKLQkJWzI5XSA9IERNQUNIX0FDOTdfUENNT1VULAotCQlbMzBdID0gRE1BQ0hfTUFYLAotCQlbMzFdID0gRE1BQ0hfTUFYLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9wZG1hMCA9IHsKLQkubmFtZQkJPSAiczNjLXBsMzMwIiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZXh5bm9zNF9wZG1hMF9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gZXh5bm9zNF9wZG1hMF9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrID0gJmRtYV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAotCQkucGxhdGZvcm1fZGF0YSA9ICZleHlub3M0X3BkbWEwX3BkYXRhLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGV4eW5vczRfcGRtYTFfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfUERNQTEsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1BETUExICsgU1pfNEssCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfUERNQTEsCi0JCS5lbmQJPSBJUlFfUERNQTEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9wbGF0ZGF0YSBleHlub3M0X3BkbWExX3BkYXRhID0gewotCS5wZXJpID0gewotCQlbMF0gPSBETUFDSF9QQ00wX1JYLAotCQlbMV0gPSBETUFDSF9QQ00wX1RYLAotCQlbMl0gPSBETUFDSF9QQ00xX1JYLAotCQlbM10gPSBETUFDSF9QQ00xX1RYLAotCQlbNF0gPSBETUFDSF9NU01fUkVRMSwKLQkJWzVdID0gRE1BQ0hfTVNNX1JFUTMsCi0JCVs2XSA9IERNQUNIX1NQSTFfUlgsCi0JCVs3XSA9IERNQUNIX1NQSTFfVFgsCi0JCVs4XSA9IERNQUNIX0kyUzBTX1RYLAotCQlbOV0gPSBETUFDSF9JMlMwX1JYLAotCQlbMTBdID0gRE1BQ0hfSTJTMF9UWCwKLQkJWzExXSA9IERNQUNIX0kyUzFfUlgsCi0JCVsxMl0gPSBETUFDSF9JMlMxX1RYLAotCQlbMTNdID0gRE1BQ0hfVUFSVDBfUlgsCi0JCVsxNF0gPSBETUFDSF9VQVJUMF9UWCwKLQkJWzE1XSA9IERNQUNIX1VBUlQxX1JYLAotCQlbMTZdID0gRE1BQ0hfVUFSVDFfVFgsCi0JCVsxN10gPSBETUFDSF9VQVJUM19SWCwKLQkJWzE4XSA9IERNQUNIX1VBUlQzX1RYLAotCQlbMTldID0gRE1BQ0hfU0xJTUJVUzFfUlgsCi0JCVsyMF0gPSBETUFDSF9TTElNQlVTMV9UWCwKLQkJWzIxXSA9IERNQUNIX1NMSU1CVVMzX1JYLAotCQlbMjJdID0gRE1BQ0hfU0xJTUJVUzNfVFgsCi0JCVsyM10gPSBETUFDSF9TTElNQlVTNV9SWCwKLQkJWzI0XSA9IERNQUNIX1NMSU1CVVM1X1RYLAotCQlbMjVdID0gRE1BQ0hfU0xJTUJVUzBBVVhfUlgsCi0JCVsyNl0gPSBETUFDSF9TTElNQlVTMEFVWF9UWCwKLQkJWzI3XSA9IERNQUNIX1NQRElGLAotCQlbMjhdID0gRE1BQ0hfTUFYLAotCQlbMjldID0gRE1BQ0hfTUFYLAotCQlbMzBdID0gRE1BQ0hfTUFYLAotCQlbMzFdID0gRE1BQ0hfTUFYLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9wZG1hMSA9IHsKLQkubmFtZQkJPSAiczNjLXBsMzMwIiwKLQkuaWQJCT0gMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZXh5bm9zNF9wZG1hMV9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gZXh5bm9zNF9wZG1hMV9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrID0gJmRtYV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAotCQkucGxhdGZvcm1fZGF0YSA9ICZleHlub3M0X3BkbWExX3BkYXRhLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZXh5bm9zNF9kbWFjc1tdIF9faW5pdGRhdGEgPSB7Ci0JJmV4eW5vczRfZGV2aWNlX3BkbWEwLAotCSZleHlub3M0X2RldmljZV9wZG1hMSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGV4eW5vczRfZG1hX2luaXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhleHlub3M0X2RtYWNzLCBBUlJBWV9TSVpFKGV4eW5vczRfZG1hY3MpKTsKLQotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChleHlub3M0X2RtYV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9ob3RwbHVnLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaG90cGx1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDkwNzg5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9ob3RwbHVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyogbGludXggYXJjaC9hcm0vbWFjaC1leHlub3M0L2hvdHBsdWcuYwotICoKLSAqICBDbG9uZWQgZnJvbSBsaW51eC9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2hvdHBsdWcuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIgQVJNIEx0ZC4KLSAqICBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotCi0jaW5jbHVkZSA8bWFjaC9yZWdzLXBtdS5oPgotCi1leHRlcm4gdm9sYXRpbGUgaW50IHBlbl9yZWxlYXNlOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1X2VudGVyX2xvd3Bvd2VyKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHY7Ci0KLQlmbHVzaF9jYWNoZV9hbGwoKTsKLQlhc20gdm9sYXRpbGUoCi0JIgltY3IJcDE1LCAwLCAlMSwgYzcsIGM1LCAwXG4iCi0JIgltY3IJcDE1LCAwLCAlMSwgYzcsIGMxMCwgNFxuIgotCS8qCi0JICogVHVybiBvZmYgY29oZXJlbmN5Ci0JICovCi0JIgltcmMJcDE1LCAwLCAlMCwgYzEsIGMwLCAxXG4iCi0JIgliaWMJJTAsICUwLCAlM1xuIgotCSIJbWNyCXAxNSwgMCwgJTAsIGMxLCBjMCwgMVxuIgotCSIJbXJjCXAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgotCSIJYmljCSUwLCAlMCwgJTJcbiIKLQkiCW1jcglwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKLQkgIDogIj0mciIgKHYpCi0JICA6ICJyIiAoMCksICJJciIgKENSX0MpLCAiSXIiICgweDQwKQotCSAgOiAiY2MiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNwdV9sZWF2ZV9sb3dwb3dlcih2b2lkKQotewotCXVuc2lnbmVkIGludCB2OwotCi0JYXNtIHZvbGF0aWxlKAotCSJtcmMJcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCi0JIglvcnIJJTAsICUwLCAlMVxuIgotCSIJbWNyCXAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgotCSIJbXJjCXAxNSwgMCwgJTAsIGMxLCBjMCwgMVxuIgotCSIJb3JyCSUwLCAlMCwgJTJcbiIKLQkiCW1jcglwMTUsIDAsICUwLCBjMSwgYzAsIDFcbiIKLQkgIDogIj0mciIgKHYpCi0JICA6ICJJciIgKENSX0MpLCAiSXIiICgweDQwKQotCSAgOiAiY2MiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBsYXRmb3JtX2RvX2xvd3Bvd2VyKHVuc2lnbmVkIGludCBjcHUsIGludCAqc3B1cmlvdXMpCi17Ci0JZm9yICg7OykgewotCi0JCS8qIG1ha2UgY3B1MSB0byBiZSB0dXJuZWQgb2ZmIGF0IG5leHQgV0ZJIGNvbW1hbmQgKi8KLQkJaWYgKGNwdSA9PSAxKQotCQkJX19yYXdfd3JpdGVsKDAsIFM1UF9BUk1fQ09SRTFfQ09ORklHVVJBVElPTik7Ci0KLQkJLyoKLQkJICogaGVyZSdzIHRoZSBXRkkKLQkJICovCi0JCWFzbSgiLndvcmQJMHhlMzIwZjAwM1xuIgotCQkgICAgOgotCQkgICAgOgotCQkgICAgOiAibWVtb3J5IiwgImNjIik7Ci0KLQkJaWYgKHBlbl9yZWxlYXNlID09IGNwdSkgewotCQkJLyoKLQkJCSAqIE9LLCBwcm9wZXIgd2FrZXVwLCB3ZSdyZSBkb25lCi0JCQkgKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogR2V0dGluZyBoZXJlLCBtZWFucyB0aGF0IHdlIGhhdmUgY29tZSBvdXQgb2YgV0ZJIHdpdGhvdXQKLQkJICogaGF2aW5nIGJlZW4gd29rZW4gdXAgLSB0aGlzIHNob3VsZG4ndCBoYXBwZW4KLQkJICoKLQkJICogSnVzdCBub3RlIGl0IGhhcHBlbmluZyAtIHdoZW4gd2UncmUgd29rZW4sIHdlIGNhbiByZXBvcnQKLQkJICogaXRzIG9jY3VycmVuY2UuCi0JCSAqLwotCQkoKnNwdXJpb3VzKSsrOwotCX0KLX0KLQotaW50IHBsYXRmb3JtX2NwdV9raWxsKHVuc2lnbmVkIGludCBjcHUpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBwbGF0Zm9ybS1zcGVjaWZpYyBjb2RlIHRvIHNodXRkb3duIGEgQ1BVCi0gKgotICogQ2FsbGVkIHdpdGggSVJRcyBkaXNhYmxlZAotICovCi12b2lkIHBsYXRmb3JtX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKLXsKLQlpbnQgc3B1cmlvdXMgPSAwOwotCi0JLyoKLQkgKiB3ZSdyZSByZWFkeSBmb3Igc2h1dGRvd24gbm93LCBzbyBkbyBpdAotCSAqLwotCWNwdV9lbnRlcl9sb3dwb3dlcigpOwotCXBsYXRmb3JtX2RvX2xvd3Bvd2VyKGNwdSwgJnNwdXJpb3VzKTsKLQotCS8qCi0JICogYnJpbmcgdGhpcyBDUFUgYmFjayBpbnRvIHRoZSB3b3JsZCBvZiBjYWNoZQotCSAqIGNvaGVyZW5jeSwgYW5kIHRoZW4gcmVzdG9yZSBpbnRlcnJ1cHRzCi0JICovCi0JY3B1X2xlYXZlX2xvd3Bvd2VyKCk7Ci0KLQlpZiAoc3B1cmlvdXMpCi0JCXByX3dhcm4oIkNQVSV1OiAldSBzcHVyaW91cyB3YWtldXAgY2FsbHNcbiIsIGNwdSwgc3B1cmlvdXMpOwotfQotCi1pbnQgcGxhdGZvcm1fY3B1X2Rpc2FibGUodW5zaWduZWQgaW50IGNwdSkKLXsKLQkvKgotCSAqIHdlIGRvbid0IGFsbG93IENQVSAwIHRvIGJlIHNodXRkb3duIChpdCBpcyBzdGlsbCB0b28gc3BlY2lhbAotCSAqIGUuZy4gY2xvY2sgdGljayBpbnRlcnJ1cHRzKQotCSAqLwotCXJldHVybiBjcHUgPT0gMCA/IC1FUEVSTSA6IDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9jbGtkZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmZmE4My4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaWZuZGVmIF9fTUFDSF9DTEtERVZfSF9fCi0jZGVmaW5lIF9fTUFDSF9DTEtERVZfSF9fCi0KLSNkZWZpbmUgX19jbGtfZ2V0KGNsaykgKHsgMTsgfSkKLSNkZWZpbmUgX19jbGtfcHV0KGNsaykgZG8ge30gd2hpbGUgKDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQyZWY4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0vKiBwdWxsIGluIHRoZSByZWxldmFudCByZWdpc3RlciBhbmQgbWFwIGZpbGVzLiAqLwotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotCS8qIG5vdGUsIGZvciB0aGUgYm9vdCBwcm9jZXNzIHRvIHdvcmsgd2UgaGF2ZSB0byBrZWVwIHRoZSBVQVJUCi0JICogdmlydHVhbCBhZGRyZXNzIGFsaWduZWQgdG8gYW4gMU1pQiBib3VuZGFyeSBmb3IgdGhlIEwxCi0JICogbWFwcGluZyB0aGUgaGVhZCBjb2RlIG1ha2VzLiBXZSBrZWVwIHRoZSBVQVJUIHZpcnR1YWwgYWRkcmVzcwotCSAqIGFsaWduZWQgYW5kIGFkZCBpbiB0aGUgb2Zmc2V0IHdoZW4gd2UgbG9hZCB0aGUgdmFsdWUgaGVyZS4KLQkgKi8KLQotCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2Ci0JCWxkcglccnAsID0gUzNDX1BBX1VBUlQKLQkJbGRyCVxydiwgPSBTM0NfVkFfVUFSVAotI2lmIENPTkZJR19ERUJVR19TM0NfVUFSVCAhPSAwCi0JCWFkZAlccnAsIFxycCwgIygweDEwMDAwICogQ09ORklHX0RFQlVHX1MzQ19VQVJUKQotCQlhZGQJXHJ2LCBccnYsICMoMHgxMDAwMCAqIENPTkZJR19ERUJVR19TM0NfVUFSVCkKLSNlbmRpZgotCS5lbmRtCi0KLSNkZWZpbmUgZmlmb19mdWxsIGZpZm9fZnVsbF9zNXB2MjEwCi0jZGVmaW5lIGZpZm9fbGV2ZWwgZmlmb19sZXZlbF9zNXB2MjEwCi0KLSNpbmNsdWRlIDxwbGF0L2RlYnVnLW1hY3JvLlM+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyMDllYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQuCi0gKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfRE1BX0gKLSNkZWZpbmUgX19NQUNIX0RNQV9ICi0KLS8qIFRoaXMgcGxhdGZvcm0gdXNlcyB0aGUgY29tbW9uIFMzQyBETUEgQVBJIGRyaXZlciBmb3IgUEwzMzAgKi8KLSNpbmNsdWRlIDxwbGF0L3MzYy1kbWEtcGwzMzAuaD4KLQotI2VuZGlmIC8qIF9fTUFDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ExZTI4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwotICoKLSAqIENsb25lZCBmcm9tIGFyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKLSAqCi0gKiBMb3ctbGV2ZWwgSVJRIGhlbHBlciBtYWNyb3MgZm9yIEVYWU5PUzQgcGxhdGZvcm1zCi0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qLwotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgotCi0JCS5tYWNybwlkaXNhYmxlX2ZpcQotCQkuZW5kbQotCi0JCS5tYWNybyAgZ2V0X2lycW5yX3ByZWFtYmxlLCBiYXNlLCB0bXAKLQkJbGRyCVxiYXNlLCA9Z2ljX2NwdV9iYXNlX2FkZHIKLQkJbGRyCVxiYXNlLCBbXGJhc2VdCi0JCW1yYyAgICAgcDE1LCAwLCBcdG1wLCBjMCwgYzAsIDUKLQkJYW5kICAgICBcdG1wLCBcdG1wLCAjMwotCQljbXAgICAgIFx0bXAsICMxCi0JCWFkZGVxICAgXGJhc2UsIFxiYXNlLCAjRVhZTk9TNF9HSUNfQkFOS19PRkZTRVQKLQkJLmVuZG0KLQotCQkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKLQkJLmVuZG0KLQotCQkvKgotCQkgKiBUaGUgaW50ZXJydXB0IG51bWJlcmluZyBzY2hlbWUgaXMgZGVmaW5lZCBpbiB0aGUKLQkJICogaW50ZXJydXB0IGNvbnRyb2xsZXIgc3BlYy4gIFRvIHdpdDoKLQkJICoKLQkJICogSW50ZXJydXB0cyAwLTE1IGFyZSBJUEkKLQkJICogMTYtMjggYXJlIHJlc2VydmVkCi0JCSAqIDI5LTMxIGFyZSBsb2NhbC4gIFdlIGFsbG93IDMwIHRvIGJlIHVzZWQgZm9yIHRoZSB3YXRjaGRvZy4KLQkJICogMzItMTAyMCBhcmUgZ2xvYmFsCi0JCSAqIDEwMjEtMTAyMiBhcmUgcmVzZXJ2ZWQKLQkJICogMTAyMyBpcyAic3B1cmlvdXMiIChubyBpbnRlcnJ1cHQpCi0JCSAqCi0JCSAqIEZvciBub3csIHdlIGlnbm9yZSBhbGwgbG9jYWwgaW50ZXJydXB0cyBzbyBvbmx5IHJldHVybiBhbiBpbnRlcnJ1cHQgaWYgaXQncwotCQkgKiBiZXR3ZWVuIDMwIGFuZCAxMDIwLiAgVGhlIHRlc3RfZm9yX2lwaSByb3V0aW5lIGJlbG93IHdpbGwgcGljayB1cCBvbiBJUElzLgotCQkgKgotCQkgKiBBIHNpbXBsZSByZWFkIGZyb20gdGhlIGNvbnRyb2xsZXIgd2lsbCB0ZWxsIHVzIHRoZSBudW1iZXIgb2YgdGhlIGhpZ2hlc3QKLSAgICAgICAgICAgICAgICAgKiBwcmlvcml0eSBlbmFibGVkIGludGVycnVwdC4gIFdlIHRoZW4ganVzdCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgaW4gdGhlCi0JCSAqIHZhbGlkIHJhbmdlIGZvciBhbiBJUlEgKDMwLTEwMjAgaW5jbHVzaXZlKS4KLQkJICovCi0KLQkJLm1hY3JvICBnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQotCQlsZHIgICAgIFxpcnFzdGF0LCBbXGJhc2UsICNHSUNfQ1BVX0lOVEFDS10gLyogYml0cyAxMi0xMCA9IHNyYyBDUFUsIDktMCA9IGludCAjICovCi0KLQkJbGRyCVx0bXAsID0xMDIxCi0KLQkJYmljICAgICBcaXJxbnIsIFxpcnFzdGF0LCAjMHgxYzAwCi0KLQkJY21wICAgICBcaXJxbnIsICMyOQotCQljbXBjYwlcaXJxbnIsIFxpcnFucgotCQljbXBuZQlcaXJxbnIsIFx0bXAKLQkJY21wY3MJXGlycW5yLCBcaXJxbnIKLQkJYWRkbmUJXGlycW5yLCBcaXJxbnIsICMzMgotCi0JCS5lbmRtCi0KLQkJLyogV2UgYXNzdW1lIHRoYXQgaXJxc3RhdCAodGhlIHJhdyB2YWx1ZSBvZiB0aGUgSVJRIGFja25vd2xlZGdlCi0JCSAqIHJlZ2lzdGVyKSBpcyBwcmVzZXJ2ZWQgZnJvbSB0aGUgbWFjcm8gYWJvdmUuCi0JCSAqIElmIHRoZXJlIGlzIGFuIElQSSwgd2UgaW1tZWRpYXRlbHkgc2lnbmFsIGVuZCBvZiBpbnRlcnJ1cHQgb24gdGhlCi0JCSAqIGNvbnRyb2xsZXIsIHNpbmNlIHRoaXMgcmVxdWlyZXMgdGhlIG9yaWdpbmFsIGlycXN0YXQgdmFsdWUgd2hpY2gKLQkJICogd2Ugd29uJ3QgZWFzaWx5IGJlIGFibGUgdG8gcmVjcmVhdGUgbGF0ZXIuCi0JCSAqLwotCi0JCS5tYWNybyB0ZXN0X2Zvcl9pcGksIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQkJYmljCVxpcnFuciwgXGlycXN0YXQsICMweDFjMDAKLQkJY21wCVxpcnFuciwgIzE2Ci0JCXN0cmNjCVxpcnFzdGF0LCBbXGJhc2UsICNHSUNfQ1BVX0VPSV0KLQkJY21wY3MJXGlycW5yLCBcaXJxbnIKLQkJLmVuZG0KLQotCQkvKiBBcyBhYm92ZSwgdGhpcyBhc3N1bWVzIHRoYXQgaXJxc3RhdCBhbmQgYmFzZSBhcmUgcHJlc2VydmVkLi4gKi8KLQotCQkubWFjcm8gdGVzdF9mb3JfbHRpcnEsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQkJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9ncGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTI2NmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9ncGlvLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0IC0gR1BJTyBsaWIgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfR1BJT19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfR1BJT19IIF9fRklMRV9fCi0KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCi0jZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKLQotLyogUHJhY3RpY2FsbHksIEdQSU8gYmFua3MgdXAgdG8gR1BaIGFyZSB0aGUgY29uZmlndXJhYmxlIGdwaW8gYmFua3MgKi8KLQotLyogR1BJTyBiYW5rIHNpemVzICovCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19BMF9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0ExX05SCSg2KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fQl9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0MwX05SCSg1KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fQzFfTlIJKDUpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19EMF9OUgkoNCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0QxX05SCSg0KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fRTBfTlIJKDUpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19FMV9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0UyX05SCSg2KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fRTNfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19FNF9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0YwX05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fRjFfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19GMl9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0YzX05SCSg2KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fSjBfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19KMV9OUgkoNSkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0swX05SCSg3KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fSzFfTlIJKDcpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19LMl9OUgkoNykKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0szX05SCSg3KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fTDBfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19MMV9OUgkoMykKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0wyX05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fWDBfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19YMV9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX1gyX05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fWDNfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19ZMF9OUgkoNikKLSNkZWZpbmUgRVhZTk9TNF9HUElPX1kxX05SCSg0KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fWTJfTlIJKDYpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19ZM19OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX1k0X05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fWTVfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19ZNl9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX1pfTlIJKDcpCi0KLS8qIEdQSU8gYmFuayBudW1iZXJzICovCi0KLSNkZWZpbmUgRVhZTk9TNF9HUElPX05FWFQoX19ncGlvKSBcCi0JKChfX2dwaW8jI19TVEFSVCkgKyAoX19ncGlvIyNfTlIpICsgQ09ORklHX1MzQ19HUElPX1NQQUNFICsgMSkKLQotZW51bSBzNXBfZ3Bpb19udW1iZXIgewotCUVYWU5PUzRfR1BJT19BMF9TVEFSVAk9IDAsCi0JRVhZTk9TNF9HUElPX0ExX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0EwKSwKLQlFWFlOT1M0X0dQSU9fQl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19BMSksCi0JRVhZTk9TNF9HUElPX0MwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0IpLAotCUVYWU5PUzRfR1BJT19DMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19DMCksCi0JRVhZTk9TNF9HUElPX0QwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0MxKSwKLQlFWFlOT1M0X0dQSU9fRDFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRDApLAotCUVYWU5PUzRfR1BJT19FMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19EMSksCi0JRVhZTk9TNF9HUElPX0UxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0UwKSwKLQlFWFlOT1M0X0dQSU9fRTJfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRTEpLAotCUVYWU5PUzRfR1BJT19FM19TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19FMiksCi0JRVhZTk9TNF9HUElPX0U0X1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0UzKSwKLQlFWFlOT1M0X0dQSU9fRjBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRTQpLAotCUVYWU5PUzRfR1BJT19GMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19GMCksCi0JRVhZTk9TNF9HUElPX0YyX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0YxKSwKLQlFWFlOT1M0X0dQSU9fRjNfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRjIpLAotCUVYWU5PUzRfR1BJT19KMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19GMyksCi0JRVhZTk9TNF9HUElPX0oxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0owKSwKLQlFWFlOT1M0X0dQSU9fSzBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fSjEpLAotCUVYWU5PUzRfR1BJT19LMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19LMCksCi0JRVhZTk9TNF9HUElPX0syX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0sxKSwKLQlFWFlOT1M0X0dQSU9fSzNfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fSzIpLAotCUVYWU5PUzRfR1BJT19MMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19LMyksCi0JRVhZTk9TNF9HUElPX0wxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0wwKSwKLQlFWFlOT1M0X0dQSU9fTDJfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fTDEpLAotCUVYWU5PUzRfR1BJT19YMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19MMiksCi0JRVhZTk9TNF9HUElPX1gxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1gwKSwKLQlFWFlOT1M0X0dQSU9fWDJfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWDEpLAotCUVYWU5PUzRfR1BJT19YM19TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19YMiksCi0JRVhZTk9TNF9HUElPX1kwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1gzKSwKLQlFWFlOT1M0X0dQSU9fWTFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWTApLAotCUVYWU5PUzRfR1BJT19ZMl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19ZMSksCi0JRVhZTk9TNF9HUElPX1kzX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1kyKSwKLQlFWFlOT1M0X0dQSU9fWTRfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWTMpLAotCUVYWU5PUzRfR1BJT19ZNV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19ZNCksCi0JRVhZTk9TNF9HUElPX1k2X1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1k1KSwKLQlFWFlOT1M0X0dQSU9fWl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19ZNiksCi19OwotCi0vKiBFWFlOT1M0IEdQSU8gbnVtYmVyIGRlZmluaXRpb25zICovCi0jZGVmaW5lIEVYWU5PUzRfR1BBMChfbnIpCShFWFlOT1M0X0dQSU9fQTBfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEExKF9ucikJKEVYWU5PUzRfR1BJT19BMV9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQQihfbnIpCShFWFlOT1M0X0dQSU9fQl9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQQzAoX25yKQkoRVhZTk9TNF9HUElPX0MwX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BDMShfbnIpCShFWFlOT1M0X0dQSU9fQzFfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEQwKF9ucikJKEVYWU5PUzRfR1BJT19EMF9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQRDEoX25yKQkoRVhZTk9TNF9HUElPX0QxX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BFMChfbnIpCShFWFlOT1M0X0dQSU9fRTBfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEUxKF9ucikJKEVYWU5PUzRfR1BJT19FMV9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQRTIoX25yKQkoRVhZTk9TNF9HUElPX0UyX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BFMyhfbnIpCShFWFlOT1M0X0dQSU9fRTNfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEU0KF9ucikJKEVYWU5PUzRfR1BJT19FNF9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQRjAoX25yKQkoRVhZTk9TNF9HUElPX0YwX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BGMShfbnIpCShFWFlOT1M0X0dQSU9fRjFfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEYyKF9ucikJKEVYWU5PUzRfR1BJT19GMl9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQRjMoX25yKQkoRVhZTk9TNF9HUElPX0YzX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BKMChfbnIpCShFWFlOT1M0X0dQSU9fSjBfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEoxKF9ucikJKEVYWU5PUzRfR1BJT19KMV9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQSzAoX25yKQkoRVhZTk9TNF9HUElPX0swX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BLMShfbnIpCShFWFlOT1M0X0dQSU9fSzFfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEsyKF9ucikJKEVYWU5PUzRfR1BJT19LMl9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQSzMoX25yKQkoRVhZTk9TNF9HUElPX0szX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BMMChfbnIpCShFWFlOT1M0X0dQSU9fTDBfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEwxKF9ucikJKEVYWU5PUzRfR1BJT19MMV9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQTDIoX25yKQkoRVhZTk9TNF9HUElPX0wyX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BYMChfbnIpCShFWFlOT1M0X0dQSU9fWDBfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUFgxKF9ucikJKEVYWU5PUzRfR1BJT19YMV9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQWDIoX25yKQkoRVhZTk9TNF9HUElPX1gyX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BYMyhfbnIpCShFWFlOT1M0X0dQSU9fWDNfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUFkwKF9ucikJKEVYWU5PUzRfR1BJT19ZMF9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQWTEoX25yKQkoRVhZTk9TNF9HUElPX1kxX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BZMihfbnIpCShFWFlOT1M0X0dQSU9fWTJfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUFkzKF9ucikJKEVYWU5PUzRfR1BJT19ZM19TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQWTQoX25yKQkoRVhZTk9TNF9HUElPX1k0X1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BZNShfbnIpCShFWFlOT1M0X0dQSU9fWTVfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUFk2KF9ucikJKEVYWU5PUzRfR1BJT19ZNl9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQWihfbnIpCShFWFlOT1M0X0dQSU9fWl9TVEFSVCArIChfbnIpKQotCi0vKiB0aGUgZW5kIG9mIHRoZSBFWFlOT1M0IHNwZWNpZmljIGdwaW9zICovCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19FTkQJKEVYWU5PUzRfR1BaKEVYWU5PUzRfR1BJT19aX05SKSArIDEpCi0jZGVmaW5lIFMzQ19HUElPX0VORAkJRVhZTk9TNF9HUElPX0VORAotCi0vKiBkZWZpbmUgdGhlIG51bWJlciBvZiBncGlvcyB3ZSBuZWVkIHRvIHRoZSBvbmUgYWZ0ZXIgdGhlIEdQWigpIHJhbmdlICovCi0jZGVmaW5lIEFSQ0hfTlJfR1BJT1MJCShFWFlOT1M0X0dQWihFWFlOT1M0X0dQSU9fWl9OUikgKwlcCi0JCQkJIENPTkZJR19TQU1TVU5HX0dQSU9fRVhUUkEgKyAxKQotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0jZW5kaWYgLyogX19BU01fQVJDSF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9pcnFzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OTUyZjguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9pcnFzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0IC0gSVJRIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9JUlFTX0gKLSNkZWZpbmUgX19BU01fQVJDSF9JUlFTX0ggX19GSUxFX18KLQotI2luY2x1ZGUgPHBsYXQvaXJxcy5oPgotCi0vKiBQUEk6IFByaXZhdGUgUGVyaXBoZXJhbCBJbnRlcnJ1cHQgKi8KLQotI2RlZmluZSBJUlFfUFBJKHgpCQlTNVBfSVJRKHgrMTYpCi0KLS8qIFNQSTogU2hhcmVkIFBlcmlwaGVyYWwgSW50ZXJydXB0ICovCi0KLSNkZWZpbmUgSVJRX1NQSSh4KQkJUzVQX0lSUSh4KzMyKQotCi0jZGVmaW5lIElSUV9FSU5UMAkJSVJRX1NQSSgxNikKLSNkZWZpbmUgSVJRX0VJTlQxCQlJUlFfU1BJKDE3KQotI2RlZmluZSBJUlFfRUlOVDIJCUlSUV9TUEkoMTgpCi0jZGVmaW5lIElSUV9FSU5UMwkJSVJRX1NQSSgxOSkKLSNkZWZpbmUgSVJRX0VJTlQ0CQlJUlFfU1BJKDIwKQotI2RlZmluZSBJUlFfRUlOVDUJCUlSUV9TUEkoMjEpCi0jZGVmaW5lIElSUV9FSU5UNgkJSVJRX1NQSSgyMikKLSNkZWZpbmUgSVJRX0VJTlQ3CQlJUlFfU1BJKDIzKQotI2RlZmluZSBJUlFfRUlOVDgJCUlSUV9TUEkoMjQpCi0jZGVmaW5lIElSUV9FSU5UOQkJSVJRX1NQSSgyNSkKLSNkZWZpbmUgSVJRX0VJTlQxMAkJSVJRX1NQSSgyNikKLSNkZWZpbmUgSVJRX0VJTlQxMQkJSVJRX1NQSSgyNykKLSNkZWZpbmUgSVJRX0VJTlQxMgkJSVJRX1NQSSgyOCkKLSNkZWZpbmUgSVJRX0VJTlQxMwkJSVJRX1NQSSgyOSkKLSNkZWZpbmUgSVJRX0VJTlQxNAkJSVJRX1NQSSgzMCkKLSNkZWZpbmUgSVJRX0VJTlQxNQkJSVJRX1NQSSgzMSkKLSNkZWZpbmUgSVJRX0VJTlQxNl8zMQkJSVJRX1NQSSgzMikKLQotI2RlZmluZSBJUlFfUERNQTAJCUlSUV9TUEkoMzUpCi0jZGVmaW5lIElSUV9QRE1BMQkJSVJRX1NQSSgzNikKLSNkZWZpbmUgSVJRX1RJTUVSMF9WSUMJCUlSUV9TUEkoMzcpCi0jZGVmaW5lIElSUV9USU1FUjFfVklDCQlJUlFfU1BJKDM4KQotI2RlZmluZSBJUlFfVElNRVIyX1ZJQwkJSVJRX1NQSSgzOSkKLSNkZWZpbmUgSVJRX1RJTUVSM19WSUMJCUlSUV9TUEkoNDApCi0jZGVmaW5lIElSUV9USU1FUjRfVklDCQlJUlFfU1BJKDQxKQotI2RlZmluZSBJUlFfTUNUX0wwCQlJUlFfU1BJKDQyKQotI2RlZmluZSBJUlFfV0RUCQkJSVJRX1NQSSg0MykKLSNkZWZpbmUgSVJRX1JUQ19BTEFSTQkJSVJRX1NQSSg0NCkKLSNkZWZpbmUgSVJRX1JUQ19USUMJCUlSUV9TUEkoNDUpCi0jZGVmaW5lIElSUV9HUElPX1hCCQlJUlFfU1BJKDQ2KQotI2RlZmluZSBJUlFfR1BJT19YQQkJSVJRX1NQSSg0NykKLSNkZWZpbmUgSVJRX01DVF9MMQkJSVJRX1NQSSg0OCkKLQotI2RlZmluZSBJUlFfVUFSVDAJCUlSUV9TUEkoNTIpCi0jZGVmaW5lIElSUV9VQVJUMQkJSVJRX1NQSSg1MykKLSNkZWZpbmUgSVJRX1VBUlQyCQlJUlFfU1BJKDU0KQotI2RlZmluZSBJUlFfVUFSVDMJCUlSUV9TUEkoNTUpCi0jZGVmaW5lIElSUV9VQVJUNAkJSVJRX1NQSSg1NikKLSNkZWZpbmUgSVJRX01DVF9HMAkJSVJRX1NQSSg1NykKLSNkZWZpbmUgSVJRX0lJQwkJCUlSUV9TUEkoNTgpCi0jZGVmaW5lIElSUV9JSUMxCQlJUlFfU1BJKDU5KQotI2RlZmluZSBJUlFfSUlDMgkJSVJRX1NQSSg2MCkKLSNkZWZpbmUgSVJRX0lJQzMJCUlSUV9TUEkoNjEpCi0jZGVmaW5lIElSUV9JSUM0CQlJUlFfU1BJKDYyKQotI2RlZmluZSBJUlFfSUlDNQkJSVJRX1NQSSg2MykKLSNkZWZpbmUgSVJRX0lJQzYJCUlSUV9TUEkoNjQpCi0jZGVmaW5lIElSUV9JSUM3CQlJUlFfU1BJKDY1KQotCi0jZGVmaW5lIElSUV9VU0JfSE9TVAkJSVJRX1NQSSg3MCkKLSNkZWZpbmUgSVJRX1VTQl9IU09URwkJSVJRX1NQSSg3MSkKLSNkZWZpbmUgSVJRX01PREVNX0lGCQlJUlFfU1BJKDcyKQotI2RlZmluZSBJUlFfSFNNTUMwCQlJUlFfU1BJKDczKQotI2RlZmluZSBJUlFfSFNNTUMxCQlJUlFfU1BJKDc0KQotI2RlZmluZSBJUlFfSFNNTUMyCQlJUlFfU1BJKDc1KQotI2RlZmluZSBJUlFfSFNNTUMzCQlJUlFfU1BJKDc2KQotI2RlZmluZSBJUlFfRFdNQ0kJCUlSUV9TUEkoNzcpCi0KLSNkZWZpbmUgSVJRX01JUElfQ1NJUzAJCUlSUV9TUEkoNzgpCi0jZGVmaW5lIElSUV9NSVBJX0NTSVMxCQlJUlFfU1BJKDgwKQotCi0jZGVmaW5lIElSUV9PTkVOQU5EX0FVREkJSVJRX1NQSSg4MikKLSNkZWZpbmUgSVJRX1JPVEFUT1IJCUlSUV9TUEkoODMpCi0jZGVmaW5lIElSUV9GSU1DMAkJSVJRX1NQSSg4NCkKLSNkZWZpbmUgSVJRX0ZJTUMxCQlJUlFfU1BJKDg1KQotI2RlZmluZSBJUlFfRklNQzIJCUlSUV9TUEkoODYpCi0jZGVmaW5lIElSUV9GSU1DMwkJSVJRX1NQSSg4NykKLSNkZWZpbmUgSVJRX0pQRUcJCUlSUV9TUEkoODgpCi0jZGVmaW5lIElSUV8yRAkJCUlSUV9TUEkoODkpCi0jZGVmaW5lIElSUV9QQ0lFCQlJUlFfU1BJKDkwKQotCi0jZGVmaW5lIElSUV9NRkMJCQlJUlFfU1BJKDk0KQotCi0jZGVmaW5lIElSUV9BVURJT19TUwkJSVJRX1NQSSg5NikKLSNkZWZpbmUgSVJRX0kyUzAJCUlSUV9TUEkoOTcpCi0jZGVmaW5lIElSUV9JMlMxCQlJUlFfU1BJKDk4KQotI2RlZmluZSBJUlFfSTJTMgkJSVJRX1NQSSg5OSkKLSNkZWZpbmUgSVJRX0FDOTcJCUlSUV9TUEkoMTAwKQotCi0jZGVmaW5lIElSUV9TUERJRgkJSVJRX1NQSSgxMDQpCi0jZGVmaW5lIElSUV9BREMwCQlJUlFfU1BJKDEwNSkKLSNkZWZpbmUgSVJRX1BFTjAJCUlSUV9TUEkoMTA2KQotI2RlZmluZSBJUlFfQURDMQkJSVJRX1NQSSgxMDcpCi0jZGVmaW5lIElSUV9QRU4xCQlJUlFfU1BJKDEwOCkKLSNkZWZpbmUgSVJRX0tFWVBBRAkJSVJRX1NQSSgxMDkpCi0jZGVmaW5lIElSUV9QTVUJCQlJUlFfU1BJKDExMCkKLSNkZWZpbmUgSVJRX0dQUwkJCUlSUV9TUEkoMTExKQotI2RlZmluZSBJUlFfSU5URkVFRENUUkxfU1NTCUlSUV9TUEkoMTEyKQotI2RlZmluZSBJUlFfU0xJTUJVUwkJSVJRX1NQSSgxMTMpCi0KLSNkZWZpbmUgSVJRX1RTSQkJCUlSUV9TUEkoMTE1KQotI2RlZmluZSBJUlFfU0FUQQkJSVJRX1NQSSgxMTYpCi0KLSNkZWZpbmUgTUFYX0lSUV9JTl9DT01CSU5FUgk4Ci0jZGVmaW5lIENPTUJJTkVSX0dST1VQKHgpCSgoeCkgKiBNQVhfSVJRX0lOX0NPTUJJTkVSICsgSVJRX1NQSSgxMjgpKQotI2RlZmluZSBDT01CSU5FUl9JUlEoeCwgeSkJKENPTUJJTkVSX0dST1VQKHgpICsgeSkKLQotI2RlZmluZSBJUlFfU1lTTU1VX01ETUEwXzAJQ09NQklORVJfSVJRKDQsIDApCi0jZGVmaW5lIElSUV9TWVNNTVVfU1NTXzAJQ09NQklORVJfSVJRKDQsIDEpCi0jZGVmaW5lIElSUV9TWVNNTVVfRklNQzBfMAlDT01CSU5FUl9JUlEoNCwgMikKLSNkZWZpbmUgSVJRX1NZU01NVV9GSU1DMV8wCUNPTUJJTkVSX0lSUSg0LCAzKQotI2RlZmluZSBJUlFfU1lTTU1VX0ZJTUMyXzAJQ09NQklORVJfSVJRKDQsIDQpCi0jZGVmaW5lIElSUV9TWVNNTVVfRklNQzNfMAlDT01CSU5FUl9JUlEoNCwgNSkKLSNkZWZpbmUgSVJRX1NZU01NVV9KUEVHXzAJQ09NQklORVJfSVJRKDQsIDYpCi0jZGVmaW5lIElSUV9TWVNNTVVfMkRfMAkJQ09NQklORVJfSVJRKDQsIDcpCi0KLSNkZWZpbmUgSVJRX1NZU01NVV9ST1RBVE9SXzAJQ09NQklORVJfSVJRKDUsIDApCi0jZGVmaW5lIElSUV9TWVNNTVVfTURNQTFfMAlDT01CSU5FUl9JUlEoNSwgMSkKLSNkZWZpbmUgSVJRX1NZU01NVV9MQ0QwX00wXzAJQ09NQklORVJfSVJRKDUsIDIpCi0jZGVmaW5lIElSUV9TWVNNTVVfTENEMV9NMV8wCUNPTUJJTkVSX0lSUSg1LCAzKQotI2RlZmluZSBJUlFfU1lTTU1VX1RWX00wXzAJQ09NQklORVJfSVJRKDUsIDQpCi0jZGVmaW5lIElSUV9TWVNNTVVfTUZDX00wXzAJQ09NQklORVJfSVJRKDUsIDUpCi0jZGVmaW5lIElSUV9TWVNNTVVfTUZDX00xXzAJQ09NQklORVJfSVJRKDUsIDYpCi0jZGVmaW5lIElSUV9TWVNNTVVfUENJRV8wCUNPTUJJTkVSX0lSUSg1LCA3KQotCi0jZGVmaW5lIElSUV9GSU1EMF9GSUZPCQlDT01CSU5FUl9JUlEoMTEsIDApCi0jZGVmaW5lIElSUV9GSU1EMF9WU1lOQwkJQ09NQklORVJfSVJRKDExLCAxKQotI2RlZmluZSBJUlFfRklNRDBfU1lTVEVNCUNPTUJJTkVSX0lSUSgxMSwgMikKLQotI2RlZmluZSBNQVhfQ09NQklORVJfTlIJCTE2Ci0KLSNkZWZpbmUgSVJRX0FEQwkJCUlSUV9BREMwCi0jZGVmaW5lIElSUV9UQwkJCUlSUV9QRU4wCi0KLSNkZWZpbmUgUzVQX0lSUV9FSU5UX0JBU0UJQ09NQklORVJfSVJRKE1BWF9DT01CSU5FUl9OUiwgMCkKLQotI2RlZmluZSBTNVBfRUlOVF9CQVNFMQkJKFM1UF9JUlFfRUlOVF9CQVNFICsgMCkKLSNkZWZpbmUgUzVQX0VJTlRfQkFTRTIJCShTNVBfSVJRX0VJTlRfQkFTRSArIDE2KQotCi0vKiBvcHRpb25hbCBHUElPIGludGVycnVwdHMgKi8KLSNkZWZpbmUgUzVQX0dQSU9JTlRfQkFTRQkoUzVQX0lSUV9FSU5UX0JBU0UgKyAzMikKLSNkZWZpbmUgSVJRX0dQSU8xX05SX0dST1VQUwkxNgotI2RlZmluZSBJUlFfR1BJTzJfTlJfR1JPVVBTCTkKLSNkZWZpbmUgSVJRX0dQSU9fRU5ECQkoUzVQX0dQSU9JTlRfQkFTRSArIFM1UF9HUElPSU5UX0NPVU5UKQotCi0vKiBTZXQgdGhlIGRlZmF1bHQgTlJfSVJRUyAqLwotI2RlZmluZSBOUl9JUlFTCQkJKElSUV9HUElPX0VORCArIDY0KQotCi0jZW5kaWYgLyogX19BU01fQVJDSF9JUlFTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvbWFwLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzIyOTZkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9tYXAuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBFWFlOT1M0IC0gTWVtb3J5IG1hcCBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUFQX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NQVBfSCBfX0ZJTEVfXwotCi0jaW5jbHVkZSA8cGxhdC9tYXAtYmFzZS5oPgotCi0vKgotICogRVhZTk9TNCBVQVJUIG9mZnNldCBpcyAweDEwMDAwIGJ1dCB0aGUgb2xkZXIgUzVQIFNvQ3MgYXJlIDB4NDAwLgotICogU28gbmVlZCB0byBkZWZpbmUgaXQsIGFuZCBoZXJlIGlzIHRvIGF2b2lkIHJlZGVmaW5pdGlvbiB3YXJuaW5nLgotICovCi0jZGVmaW5lIFMzQ19VQVJUX09GRlNFVAkJCSgweDEwMDAwKQotCi0jaW5jbHVkZSA8cGxhdC9tYXAtczVwLmg+Ci0KLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNSQU0JCTB4MDIwMjAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0ZJTUMwCQkweDExODAwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfRklNQzEJCTB4MTE4MTAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9GSU1DMgkJMHgxMTgyMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX0ZJTUMzCQkweDExODMwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9JMlMwCQkJMHgwMzgzMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX0kyUzEJCQkweEUzMTAwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfSTJTMgkJCTB4RTJBMDAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX1BDTTAJCQkweDAzODQwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfUENNMQkJCTB4MTM5ODAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9QQ00yCQkJMHgxMzk5MDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1JPTV9CQU5LKHgpCQkoMHgwNDAwMDAwMCArICgoeCkgKiAweDAxMDAwMDAwKSkKLQotI2RlZmluZSBFWFlOT1M0X1BBX09ORU5BTkQJCTB4MEMwMDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9PTkVOQU5EX0RNQQkJMHgwQzYwMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfQ0hJUElECQkweDEwMDAwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNDT04JCTB4MTAwMTAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9QTVUJCQkweDEwMDIwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfQ01VCQkJMHgxMDAzMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTVElNRVIJCTB4MTAwNTAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9XQVRDSERPRwkJMHgxMDA2MDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1JUQwkJCTB4MTAwNzAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0tFWVBBRAkJMHgxMDBBMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfRE1DMAkJCTB4MTA0MDAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0NPTUJJTkVSCQkweDEwNDQwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9HSUNfQ1BVCQkweDEwNDgwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfR0lDX0RJU1QJCTB4MTA0OTAwMDAKLSNkZWZpbmUgRVhZTk9TNF9HSUNfQkFOS19PRkZTRVQJCTB4ODAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfQ09SRVBFUkkJCTB4MTA1MDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9UV0QJCQkweDEwNTAwNjAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfTDJDQwkJCTB4MTA1MDIwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX01ETUEJCQkweDEwODEwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfUERNQTAJCTB4MTI2ODAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9QRE1BMQkJMHgxMjY5MDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX01ETUEJCTB4MTBBNDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfU1NTCQkweDEwQTUwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMwCQkweDExQTIwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMxCQkweDExQTMwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMyCQkweDExQTQwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMzCQkweDExQTUwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0pQRUcJCTB4MTFBNjAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfRklNRDAJCTB4MTFFMjAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfRklNRDEJCTB4MTIyMjAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfUENJZQkJMHgxMjYyMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9HMkQJCTB4MTJBMjAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfUk9UQVRPUgkweDEyQTMwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX01ETUEyCQkweDEyQTQwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX1RWCQkweDEyRTIwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX01GQ19MCQkweDEzNjIwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX01GQ19SCQkweDEzNjMwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9HUElPMQkJMHgxMTQwMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX0dQSU8yCQkweDExMDAwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfR1BJTzMJCTB4MDM4NjAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX01JUElfQ1NJUzAJCTB4MTE4ODAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9NSVBJX0NTSVMxCQkweDExODkwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9GSU1EMAkJMHgxMUMwMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfSFNNTUMoeCkJCSgweDEyNTEwMDAwICsgKCh4KSAqIDB4MTAwMDApKQotI2RlZmluZSBFWFlOT1M0X1BBX0RXTUNJCQkweDEyNTUwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9TQVRBCQkJMHgxMjU2MDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1NBVEFQSFkJCTB4MTI1RDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TQVRBUEhZX0NUUkwJCTB4MTI2QjAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX1NST01DCQkweDEyNTcwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9FSENJCQkJMHgxMjU4MDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX0hTUEhZCQkweDEyNUIwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfTUZDCQkJMHgxMzQwMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfVUFSVAkJCTB4MTM4MDAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0lJQyh4KQkJKDB4MTM4NjAwMDAgKyAoKHgpICogMHgxMDAwMCkpCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9BREMJCQkweDEzOTEwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfQURDMQkJCTB4MTM5MTEwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0FDOTcJCQkweDEzOUEwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9TUERJRgkJMHgxMzlCMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfVElNRVIJCTB4MTM5RDAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX1NEUkFNCQkweDQwMDAwMDAwCi0KLS8qIENvbXBhdGliaWx0aXkgRGVmaW5lcyAqLwotCi0jZGVmaW5lIFMzQ19QQV9IU01NQzAJCQlFWFlOT1M0X1BBX0hTTU1DKDApCi0jZGVmaW5lIFMzQ19QQV9IU01NQzEJCQlFWFlOT1M0X1BBX0hTTU1DKDEpCi0jZGVmaW5lIFMzQ19QQV9IU01NQzIJCQlFWFlOT1M0X1BBX0hTTU1DKDIpCi0jZGVmaW5lIFMzQ19QQV9IU01NQzMJCQlFWFlOT1M0X1BBX0hTTU1DKDMpCi0jZGVmaW5lIFMzQ19QQV9JSUMJCQlFWFlOT1M0X1BBX0lJQygwKQotI2RlZmluZSBTM0NfUEFfSUlDMQkJCUVYWU5PUzRfUEFfSUlDKDEpCi0jZGVmaW5lIFMzQ19QQV9JSUMyCQkJRVhZTk9TNF9QQV9JSUMoMikKLSNkZWZpbmUgUzNDX1BBX0lJQzMJCQlFWFlOT1M0X1BBX0lJQygzKQotI2RlZmluZSBTM0NfUEFfSUlDNAkJCUVYWU5PUzRfUEFfSUlDKDQpCi0jZGVmaW5lIFMzQ19QQV9JSUM1CQkJRVhZTk9TNF9QQV9JSUMoNSkKLSNkZWZpbmUgUzNDX1BBX0lJQzYJCQlFWFlOT1M0X1BBX0lJQyg2KQotI2RlZmluZSBTM0NfUEFfSUlDNwkJCUVYWU5PUzRfUEFfSUlDKDcpCi0jZGVmaW5lIFNBTVNVTkdfUEFfQURDCQkJRVhZTk9TNF9QQV9BREMKLSNkZWZpbmUgU0FNU1VOR19QQV9BREMxCQkJRVhZTk9TNF9QQV9BREMxCi0jZGVmaW5lIFMzQ19QQV9SVEMJCQlFWFlOT1M0X1BBX1JUQwotI2RlZmluZSBTM0NfUEFfV0RUCQkJRVhZTk9TNF9QQV9XQVRDSERPRwotCi0jZGVmaW5lIFM1UF9QQV9DSElQSUQJCQlFWFlOT1M0X1BBX0NISVBJRAotI2RlZmluZSBTNVBfUEFfRklNQzAJCQlFWFlOT1M0X1BBX0ZJTUMwCi0jZGVmaW5lIFM1UF9QQV9GSU1DMQkJCUVYWU5PUzRfUEFfRklNQzEKLSNkZWZpbmUgUzVQX1BBX0ZJTUMyCQkJRVhZTk9TNF9QQV9GSU1DMgotI2RlZmluZSBTNVBfUEFfRklNQzMJCQlFWFlOT1M0X1BBX0ZJTUMzCi0jZGVmaW5lIFM1UF9QQV9NSVBJX0NTSVMwCQlFWFlOT1M0X1BBX01JUElfQ1NJUzAKLSNkZWZpbmUgUzVQX1BBX01JUElfQ1NJUzEJCUVYWU5PUzRfUEFfTUlQSV9DU0lTMQotI2RlZmluZSBTNVBfUEFfRklNRDAJCQlFWFlOT1M0X1BBX0ZJTUQwCi0jZGVmaW5lIFM1UF9QQV9PTkVOQU5ECQkJRVhZTk9TNF9QQV9PTkVOQU5ECi0jZGVmaW5lIFM1UF9QQV9PTkVOQU5EX0RNQQkJRVhZTk9TNF9QQV9PTkVOQU5EX0RNQQotI2RlZmluZSBTNVBfUEFfU0RSQU0JCQlFWFlOT1M0X1BBX1NEUkFNCi0jZGVmaW5lIFM1UF9QQV9TUk9NQwkJCUVYWU5PUzRfUEFfU1JPTUMKLSNkZWZpbmUgUzVQX1BBX01GQwkJCUVYWU5PUzRfUEFfTUZDCi0jZGVmaW5lIFM1UF9QQV9TWVNDT04JCQlFWFlOT1M0X1BBX1NZU0NPTgotI2RlZmluZSBTNVBfUEFfVElNRVIJCQlFWFlOT1M0X1BBX1RJTUVSCi0jZGVmaW5lIFM1UF9QQV9FSENJCQkJRVhZTk9TNF9QQV9FSENJCi0KLSNkZWZpbmUgU0FNU1VOR19QQV9LRVlQQUQJCUVYWU5PUzRfUEFfS0VZUEFECi0KLS8qIFVBUlQgKi8KLQotI2RlZmluZSBTM0NfUEFfVUFSVAkJCUVYWU5PUzRfUEFfVUFSVAotCi0jZGVmaW5lIFM1UF9QQV9VQVJUKHgpCQkJKFMzQ19QQV9VQVJUICsgKCh4KSAqIFMzQ19VQVJUX09GRlNFVCkpCi0jZGVmaW5lIFM1UF9QQV9VQVJUMAkJCVM1UF9QQV9VQVJUKDApCi0jZGVmaW5lIFM1UF9QQV9VQVJUMQkJCVM1UF9QQV9VQVJUKDEpCi0jZGVmaW5lIFM1UF9QQV9VQVJUMgkJCVM1UF9QQV9VQVJUKDIpCi0jZGVmaW5lIFM1UF9QQV9VQVJUMwkJCVM1UF9QQV9VQVJUKDMpCi0jZGVmaW5lIFM1UF9QQV9VQVJUNAkJCVM1UF9QQV9VQVJUKDQpCi0KLSNkZWZpbmUgUzVQX1NaX1VBUlQJCQlTWl8yNTYKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcG0tY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wbS1jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjNiODEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wbS1jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaCwKLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogRVhZTk9TNDIxMCAtIFBNIGNvcmUgc3VwcG9ydCBmb3IgYXJjaC9hcm0vcGxhdC1zNXAvcG0uYwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KLQotc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9kZWJ1Z19pbml0X3VhcnQodm9pZCkKLXsKLQkvKiBub3RoaW5nIGhlcmUgeWV0ICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF9wcmVwYXJlX2lycXModm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9XQUtFVVBfTUFTSyk7Ci0JdG1wICY9IH4oMSA8PCAzMSk7Ci0JX19yYXdfd3JpdGVsKHRtcCwgUzVQX1dBS0VVUF9NQVNLKTsKLQotCV9fcmF3X3dyaXRlbChzM2NfaXJxd2FrZV9pbnRtYXNrLCBTNVBfV0FLRVVQX01BU0spOwotCV9fcmF3X3dyaXRlbChzM2NfaXJxd2FrZV9laW50bWFzaywgUzVQX0VJTlRfV0FLRVVQX01BU0spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2FyY2hfc3RvcF9jbG9ja3Modm9pZCkKLXsKLQkvKiBub3RoaW5nIGhlcmUgeWV0ICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF9zaG93X3Jlc3VtZV9pcnFzKHZvaWQpCi17Ci0JLyogbm90aGluZyBoZXJlIHlldCAqLwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2FyY2hfdXBkYXRlX3VhcnQodm9pZCBfX2lvbWVtICpyZWdzLAotCQkJCQkgICBzdHJ1Y3QgcG1fdWFydF9zYXZlICpzYXZlKQotewotCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9yZXN0b3JlZF9ncGlvcyh2b2lkKQotewotCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9zYXZlZF9ncGlvcyh2b2lkKQotewotCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcG11LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3BtdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTUyOTA0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcG11LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3BtdS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBFWFlOT1M0MjEwIC0gUE1VKFBvd2VyIE1hbmFnZW1lbnQgVW5pdCkgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUE1VX0gKLSNkZWZpbmUgX19BU01fQVJDSF9QTVVfSCBfX0ZJTEVfXwotCi1lbnVtIHN5c19wb3dlcmRvd24gewotCVNZU19BRlRSLAotCVNZU19MUEEsCi0JU1lTX1NMRUVQLAotCU5VTV9TWVNfUE9XRVJET1dOLAotfTsKLQotZXh0ZXJuIHZvaWQgZXh5bm9zNF9zeXNfcG93ZXJkb3duX2NvbmYoZW51bSBzeXNfcG93ZXJkb3duIG1vZGUpOwotCi0jZW5kaWYgLyogX19BU01fQVJDSF9QTVVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMTIwOTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCi0gKgotICogRVhZTk9TNCAtIHB3bSBjbG9jayBhbmQgdGltZXIgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUFdNQ0xLX0gKLSNkZWZpbmUgX19BU01fQVJDSF9QV01DTEtfSCBfX0ZJTEVfXwotCi0vKioKLSAqIHB3bV9jZmdfc3JjX2lzX3RjbGsoKSAtIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtdXggY29uZmlnIGlzIGEgdGNsawotICogQHRjZmc6IFRoZSB0aW1lciBUQ0ZHMSByZWdpc3RlciBiaXRzIHNoaWZ0ZWQgZG93biB0byAwLgotICoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZyb20gVENGRzEgaXMgYSBUQ0xLIGluc3RlYWQKLSAqIGFueSBvZiB0aGUgVERJViBjbG9ja3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB3bV9jZmdfc3JjX2lzX3RjbGsodW5zaWduZWQgbG9uZyB0Y2ZnKQotewotCXJldHVybiB0Y2ZnID09IFMzQzY0WFhfVENGRzFfTVVYX1RDTEs7Ci19Ci0KLS8qKgotICogdGNmZ190b19kaXZpc29yKCkgLSBjb252ZXJ0IHRjZmcxIHNldHRpbmcgdG8gYSBkaXZpc29yCi0gKiBAdGNmZzE6IFRoZSB0Y2ZnMSBzZXR0aW5nLCBzaGlmdGVkIGRvd24uCi0gKgotICogR2V0IHRoZSBkaXZpc29yIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdGNmZzEgc2V0dGluZy4gV2UgYXNzdW1lIHRoZQotICogY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdG8gc2VlIGlmIHRoaXMgaXMgbm90IGEgVENMSyBzb3VyY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0Y2ZnX3RvX2Rpdmlzb3IodW5zaWduZWQgbG9uZyB0Y2ZnMSkKLXsKLQlyZXR1cm4gMSA8PCB0Y2ZnMTsKLX0KLQotLyoqCi0gKiBwd21fdGRpdl9oYXNfZGl2MSgpIC0gZG9lcyB0aGUgdGRpdiBzZXR0aW5nIGhhdmUgYSAvMQotICoKLSAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgYSAvMSBpbiB0aGUgdGRpdiBzZXR0aW5nLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwd21fdGRpdl9oYXNfZGl2MSh2b2lkKQotewotCXJldHVybiAxOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2Rpdl9iaXRzKCkgLSBjYWxjdWxhdGUgVENGRzEgZGl2aXNvciB2YWx1ZS4KLSAqIEBkaXY6IFRoZSBkaXZpc29yIHRvIGNhbGN1bGF0ZSB0aGUgYml0IGluZm9ybWF0aW9uIGZvci4KLSAqCi0gKiBUdXJuIGEgZGl2aXNvciBpbnRvIHRoZSBuZWNlc3NhcnkgYml0IGZpZWxkIGZvciBUQ0ZHMS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB3bV90ZGl2X2Rpdl9iaXRzKHVuc2lnbmVkIGludCBkaXYpCi17Ci0JcmV0dXJuIGlsb2cyKGRpdik7Ci19Ci0KLSNkZWZpbmUgUzNDX1RDRkcxX01VWF9UQ0xLIFMzQzY0WFhfVENGRzFfTVVYX1RDTEsKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUFdNQ0xLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTNmZGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0IC0gQ2xvY2sgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfQ0xPQ0tfSAotI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfQ0xPQ0tfSCBfX0ZJTEVfXwotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2RlZmluZSBTNVBfQ0xLUkVHKHgpCQkJKFM1UF9WQV9DTVUgKyAoeCkpCi0KLSNkZWZpbmUgUzVQX0NMS0RJVl9MRUZUQlVTCQlTNVBfQ0xLUkVHKDB4MDQ1MDApCi0jZGVmaW5lIFM1UF9DTEtESVZfU1RBVF9MRUZUQlVTCQlTNVBfQ0xLUkVHKDB4MDQ2MDApCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0xFRlRCVVMJCVM1UF9DTEtSRUcoMHgwNDgwMCkKLQotI2RlZmluZSBTNVBfQ0xLRElWX1JJR0hUQlVTCQlTNVBfQ0xLUkVHKDB4MDg1MDApCi0jZGVmaW5lIFM1UF9DTEtESVZfU1RBVF9SSUdIVEJVUwlTNVBfQ0xLUkVHKDB4MDg2MDApCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX1JJR0hUQlVTCQlTNVBfQ0xLUkVHKDB4MDg4MDApCi0KLSNkZWZpbmUgUzVQX0VQTExfTE9DSwkJCVM1UF9DTEtSRUcoMHgwQzAxMCkKLSNkZWZpbmUgUzVQX1ZQTExfTE9DSwkJCVM1UF9DTEtSRUcoMHgwQzAyMCkKLQotI2RlZmluZSBTNVBfRVBMTF9DT04wCQkJUzVQX0NMS1JFRygweDBDMTEwKQotI2RlZmluZSBTNVBfRVBMTF9DT04xCQkJUzVQX0NMS1JFRygweDBDMTE0KQotI2RlZmluZSBTNVBfVlBMTF9DT04wCQkJUzVQX0NMS1JFRygweDBDMTIwKQotI2RlZmluZSBTNVBfVlBMTF9DT04xCQkJUzVQX0NMS1JFRygweDBDMTI0KQotCi0jZGVmaW5lIFM1UF9DTEtTUkNfVE9QMAkJCVM1UF9DTEtSRUcoMHgwQzIxMCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19UT1AxCQkJUzVQX0NMS1JFRygweDBDMjE0KQotI2RlZmluZSBTNVBfQ0xLU1JDX0NBTQkJCVM1UF9DTEtSRUcoMHgwQzIyMCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19UVgkJCVM1UF9DTEtSRUcoMHgwQzIyNCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19NRkMJCQlTNVBfQ0xLUkVHKDB4MEMyMjgpCi0jZGVmaW5lIFM1UF9DTEtTUkNfRzNECQkJUzVQX0NMS1JFRygweDBDMjJDKQotI2RlZmluZSBTNVBfQ0xLU1JDX0lNQUdFCQlTNVBfQ0xLUkVHKDB4MEMyMzApCi0jZGVmaW5lIFM1UF9DTEtTUkNfTENEMAkJCVM1UF9DTEtSRUcoMHgwQzIzNCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19MQ0QxCQkJUzVQX0NMS1JFRygweDBDMjM4KQotI2RlZmluZSBTNVBfQ0xLU1JDX01BVURJTwkJUzVQX0NMS1JFRygweDBDMjNDKQotI2RlZmluZSBTNVBfQ0xLU1JDX0ZTWVMJCQlTNVBfQ0xLUkVHKDB4MEMyNDApCi0jZGVmaW5lIFM1UF9DTEtTUkNfUEVSSUwwCQlTNVBfQ0xLUkVHKDB4MEMyNTApCi0jZGVmaW5lIFM1UF9DTEtTUkNfUEVSSUwxCQlTNVBfQ0xLUkVHKDB4MEMyNTQpCi0KLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1AJCQlTNVBfQ0xLUkVHKDB4MEM1MTApCi0jZGVmaW5lIFM1UF9DTEtESVZfQ0FNCQkJUzVQX0NMS1JFRygweDBDNTIwKQotI2RlZmluZSBTNVBfQ0xLRElWX1RWCQkJUzVQX0NMS1JFRygweDBDNTI0KQotI2RlZmluZSBTNVBfQ0xLRElWX01GQwkJCVM1UF9DTEtSRUcoMHgwQzUyOCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9HM0QJCQlTNVBfQ0xLUkVHKDB4MEM1MkMpCi0jZGVmaW5lIFM1UF9DTEtESVZfSU1BR0UJCVM1UF9DTEtSRUcoMHgwQzUzMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9MQ0QwCQkJUzVQX0NMS1JFRygweDBDNTM0KQotI2RlZmluZSBTNVBfQ0xLRElWX0xDRDEJCQlTNVBfQ0xLUkVHKDB4MEM1MzgpCi0jZGVmaW5lIFM1UF9DTEtESVZfTUFVRElPCQlTNVBfQ0xLUkVHKDB4MEM1M0MpCi0jZGVmaW5lIFM1UF9DTEtESVZfRlNZUzAJCVM1UF9DTEtSRUcoMHgwQzU0MCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9GU1lTMQkJUzVQX0NMS1JFRygweDBDNTQ0KQotI2RlZmluZSBTNVBfQ0xLRElWX0ZTWVMyCQlTNVBfQ0xLUkVHKDB4MEM1NDgpCi0jZGVmaW5lIFM1UF9DTEtESVZfRlNZUzMJCVM1UF9DTEtSRUcoMHgwQzU0QykKLSNkZWZpbmUgUzVQX0NMS0RJVl9QRVJJTDAJCVM1UF9DTEtSRUcoMHgwQzU1MCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9QRVJJTDEJCVM1UF9DTEtSRUcoMHgwQzU1NCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9QRVJJTDIJCVM1UF9DTEtSRUcoMHgwQzU1OCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9QRVJJTDMJCVM1UF9DTEtSRUcoMHgwQzU1QykKLSNkZWZpbmUgUzVQX0NMS0RJVl9QRVJJTDQJCVM1UF9DTEtSRUcoMHgwQzU2MCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9QRVJJTDUJCVM1UF9DTEtSRUcoMHgwQzU2NCkKLSNkZWZpbmUgUzVQX0NMS0RJVjJfUkFUSU8JCVM1UF9DTEtSRUcoMHgwQzU4MCkKLQotI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfVE9QCQlTNVBfQ0xLUkVHKDB4MEMzMTApCi0jZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19DQU0JCVM1UF9DTEtSRUcoMHgwQzMyMCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX1RWCQlTNVBfQ0xLUkVHKDB4MEMzMjQpCi0jZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19MQ0QwCQlTNVBfQ0xLUkVHKDB4MEMzMzQpCi0jZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19MQ0QxCQlTNVBfQ0xLUkVHKDB4MEMzMzgpCi0jZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19NQVVESU8JCVM1UF9DTEtSRUcoMHgwQzMzQykKLSNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX0ZTWVMJCVM1UF9DTEtSRUcoMHgwQzM0MCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX1BFUklMMAkJUzVQX0NMS1JFRygweDBDMzUwKQotI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfUEVSSUwxCQlTNVBfQ0xLUkVHKDB4MEMzNTQpCi0KLSNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUX1RPUAkJUzVQX0NMS1JFRygweDBDNjEwKQotCi0jZGVmaW5lIFM1UF9DTEtHQVRFX1NDTEtDQU0JCVM1UF9DTEtSRUcoMHgwQzgyMCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfQ0FNCQlTNVBfQ0xLUkVHKDB4MEM5MjApCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX1RWCQlTNVBfQ0xLUkVHKDB4MEM5MjQpCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX01GQwkJUzVQX0NMS1JFRygweDBDOTI4KQotI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9HM0QJCVM1UF9DTEtSRUcoMHgwQzkyQykKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfSU1BR0UJCVM1UF9DTEtSRUcoMHgwQzkzMCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfTENEMAkJUzVQX0NMS1JFRygweDBDOTM0KQotI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9MQ0QxCQlTNVBfQ0xLUkVHKDB4MEM5MzgpCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0ZTWVMJCVM1UF9DTEtSRUcoMHgwQzk0MCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfR1BTCQlTNVBfQ0xLUkVHKDB4MEM5NEMpCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX1BFUklMCQlTNVBfQ0xLUkVHKDB4MEM5NTApCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX1BFUklSCQlTNVBfQ0xLUkVHKDB4MEM5NjApCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0JMT0NLCQlTNVBfQ0xLUkVHKDB4MEM5NzApCi0KLSNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX0RNQwkJUzVQX0NMS1JFRygweDEwMzAwKQotI2RlZmluZSBTNVBfQ0xLU1JDX0RNQwkJCVM1UF9DTEtSRUcoMHgxMDIwMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwCQkJUzVQX0NMS1JFRygweDEwNTAwKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzEJCQlTNVBfQ0xLUkVHKDB4MTA1MDQpCi0jZGVmaW5lIFM1UF9DTEtESVZfU1RBVF9ETUMwCQlTNVBfQ0xLUkVHKDB4MTA2MDApCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0RNQwkJUzVQX0NMS1JFRygweDEwOTAwKQotCi0jZGVmaW5lIFM1UF9BUExMX0xPQ0sJCQlTNVBfQ0xLUkVHKDB4MTQwMDApCi0jZGVmaW5lIFM1UF9NUExMX0xPQ0sJCQlTNVBfQ0xLUkVHKDB4MTQwMDQpCi0jZGVmaW5lIFM1UF9BUExMX0NPTjAJCQlTNVBfQ0xLUkVHKDB4MTQxMDApCi0jZGVmaW5lIFM1UF9BUExMX0NPTjEJCQlTNVBfQ0xLUkVHKDB4MTQxMDQpCi0jZGVmaW5lIFM1UF9NUExMX0NPTjAJCQlTNVBfQ0xLUkVHKDB4MTQxMDgpCi0jZGVmaW5lIFM1UF9NUExMX0NPTjEJCQlTNVBfQ0xLUkVHKDB4MTQxMEMpCi0KLSNkZWZpbmUgUzVQX0NMS1NSQ19DUFUJCQlTNVBfQ0xLUkVHKDB4MTQyMDApCi0jZGVmaW5lIFM1UF9DTEtNVVhfU1RBVENQVQkJUzVQX0NMS1JFRygweDE0NDAwKQotCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVCQkJUzVQX0NMS1JFRygweDE0NTAwKQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTEJCQlTNVBfQ0xLUkVHKDB4MTQ1MDQpCi0jZGVmaW5lIFM1UF9DTEtESVZfU1RBVENQVQkJUzVQX0NMS1JFRygweDE0NjAwKQotI2RlZmluZSBTNVBfQ0xLRElWX1NUQVRDUFUxCQlTNVBfQ0xLUkVHKDB4MTQ2MDQpCi0KLSNkZWZpbmUgUzVQX0NMS0dBVEVfU0NMS0NQVQkJUzVQX0NMS1JFRygweDE0ODAwKQotI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9DUFUJCVM1UF9DTEtSRUcoMHgxNDkwMCkKLQotI2RlZmluZSBTNVBfQVBMTF9MT0NLVElNRQkJKDB4MUMyMCkJLyogMzAwdXMgKi8KLQotI2RlZmluZSBTNVBfQVBMTENPTjBfRU5BQkxFX1NISUZUCSgzMSkKLSNkZWZpbmUgUzVQX0FQTExDT04wX0xPQ0tFRF9TSElGVAkoMjkpCi0jZGVmaW5lIFM1UF9BUExMX1ZBTF8xMDAwCQkoKDI1MCA8PCAxNikgfCAoNiA8PCA4KSB8IDEpCi0jZGVmaW5lIFM1UF9BUExMX1ZBTF84MDAJCSgoMjAwIDw8IDE2KSB8ICg2IDw8IDgpIHwgMSkKLQotI2RlZmluZSBTNVBfRVBMTENPTjBfRU5BQkxFX1NISUZUCSgzMSkKLSNkZWZpbmUgUzVQX0VQTExDT04wX0xPQ0tFRF9TSElGVAkoMjkpCi0KLSNkZWZpbmUgUzVQX1ZQTExDT04wX0VOQUJMRV9TSElGVAkoMzEpCi0jZGVmaW5lIFM1UF9WUExMQ09OMF9MT0NLRURfU0hJRlQJKDI5KQotCi0jZGVmaW5lIFM1UF9DTEtTUkNfQ1BVX01VWENPUkVfU0hJRlQJKDE2KQotI2RlZmluZSBTNVBfQ0xLTVVYX1NUQVRDUFVfTVVYQ09SRV9NQVNLCSgweDcgPDwgUzVQX0NMS1NSQ19DUFVfTVVYQ09SRV9TSElGVCkKLQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQ09SRV9TSElGVAkoMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0NPUkVfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9DT1JFX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQ09SRU0wX1NISUZUCSg0KQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQ09SRU0wX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0NQVTBfQ09SRU0wX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQ09SRU0xX1NISUZUCSg4KQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQ09SRU0xX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0NQVTBfQ09SRU0xX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfUEVSSVBIX1NISUZUCSgxMikKLSNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX1BFUklQSF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX1BFUklQSF9TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0FUQl9TSElGVAkoMTYpCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9BVEJfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9BVEJfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9QQ0xLREJHX1NISUZUCSgyMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX1BDTEtEQkdfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9QQ0xLREJHX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQVBMTF9TSElGVAkoMjQpCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9BUExMX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0NQVTBfQVBMTF9TSElGVCkKLQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQUNQX1NISUZUCSgwKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQUNQX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfQUNQX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQUNQUENMS19TSElGVAkoNCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0FDUFBDTEtfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfRE1DMF9BQ1BQQ0xLX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRFBIWV9TSElGVAkoOCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0RQSFlfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfRE1DMF9EUEhZX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRE1DX1NISUZUCSgxMikKLSNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0RNQ19NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0RNQ19TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0RNQ0RfU0hJRlQJKDE2KQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRE1DRF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0RNQ0RfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9ETUNQX1NISUZUCSgyMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0RNQ1BfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfRE1DMF9ETUNQX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQ09QWTJfU0hJRlQJKDI0KQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQ09QWTJfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfRE1DMF9DT1BZMl9TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0NPUkVUSV9TSElGVAkoMjgpCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9DT1JFVElfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfRE1DMF9DT1JFVElfU0hJRlQpCi0KLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfQUNMSzIwMF9TSElGVAkoMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfQUNMSzIwMF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9UT1BfQUNMSzIwMF9TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfQUNMSzEwMF9TSElGVAkoNCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfQUNMSzEwMF9NQVNLCSgweGYgPDwgUzVQX0NMS0RJVl9UT1BfQUNMSzEwMF9TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfQUNMSzE2MF9TSElGVAkoOCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfQUNMSzE2MF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9UT1BfQUNMSzE2MF9TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfQUNMSzEzM19TSElGVAkoMTIpCi0jZGVmaW5lIFM1UF9DTEtESVZfVE9QX0FDTEsxMzNfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfVE9QX0FDTEsxMzNfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfVE9QX09ORU5BTkRfU0hJRlQJKDE2KQotI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9PTkVOQU5EX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX1RPUF9PTkVOQU5EX1NISUZUKQotCi0jZGVmaW5lIFM1UF9DTEtESVZfQlVTX0dETFJfU0hJRlQJKDApCi0jZGVmaW5lIFM1UF9DTEtESVZfQlVTX0dETFJfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQlVTX0dETFJfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfQlVTX0dQTFJfU0hJRlQJKDQpCi0jZGVmaW5lIFM1UF9DTEtESVZfQlVTX0dQTFJfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQlVTX0dQTFJfU0hJRlQpCi0KLS8qIENvbXBhdGliaWxpdHkgZGVmaW5lcyBhbmQgaW5jbHVzaW9uICovCi0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtcG11Lmg+Ci0KLSNkZWZpbmUgUzVQX0VQTExfQ09OCQkJUzVQX0VQTExfQ09OMAotCi0jZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX0NMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1tY3QuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1tY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5Yzg0My4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtbWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtbWN0LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogRVhZTk9TNCBNQ1QgY29uZmlndXRhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19NQ1RfSAotI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfTUNUX0ggX19GSUxFX18KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNkZWZpbmUgRVhZTk9TNF9NQ1RSRUcoeCkJCShTNVBfVkFfU1lTVElNRVIgKyAoeCkpCi0KLSNkZWZpbmUgRVhZTk9TNF9NQ1RfR19DTlRfTAkJRVhZTk9TNF9NQ1RSRUcoMHgxMDApCi0jZGVmaW5lIEVYWU5PUzRfTUNUX0dfQ05UX1UJCUVYWU5PUzRfTUNUUkVHKDB4MTA0KQotI2RlZmluZSBFWFlOT1M0X01DVF9HX0NOVF9XU1RBVAkJRVhZTk9TNF9NQ1RSRUcoMHgxMTApCi0KLSNkZWZpbmUgRVhZTk9TNF9NQ1RfR19DT01QMF9MCQlFWFlOT1M0X01DVFJFRygweDIwMCkKLSNkZWZpbmUgRVhZTk9TNF9NQ1RfR19DT01QMF9VCQlFWFlOT1M0X01DVFJFRygweDIwNCkKLSNkZWZpbmUgRVhZTk9TNF9NQ1RfR19DT01QMF9BRERfSU5DUglFWFlOT1M0X01DVFJFRygweDIwOCkKLQotI2RlZmluZSBFWFlOT1M0X01DVF9HX1RDT04JCUVYWU5PUzRfTUNUUkVHKDB4MjQwKQotCi0jZGVmaW5lIEVYWU5PUzRfTUNUX0dfSU5UX0NTVEFUCQlFWFlOT1M0X01DVFJFRygweDI0NCkKLSNkZWZpbmUgRVhZTk9TNF9NQ1RfR19JTlRfRU5CCQlFWFlOT1M0X01DVFJFRygweDI0OCkKLSNkZWZpbmUgRVhZTk9TNF9NQ1RfR19XU1RBVAkJRVhZTk9TNF9NQ1RSRUcoMHgyNEMpCi0KLSNkZWZpbmUgRVhZTk9TNF9NQ1RfTDBfQkFTRQkJRVhZTk9TNF9NQ1RSRUcoMHgzMDApCi0jZGVmaW5lIEVYWU5PUzRfTUNUX0wxX0JBU0UJCUVYWU5PUzRfTUNUUkVHKDB4NDAwKQotCi0jZGVmaW5lIE1DVF9MX1RDTlRCX09GRlNFVAkJKDB4MDApCi0jZGVmaW5lIE1DVF9MX0lDTlRCX09GRlNFVAkJKDB4MDgpCi0jZGVmaW5lIE1DVF9MX1RDT05fT0ZGU0VUCQkoMHgyMCkKLSNkZWZpbmUgTUNUX0xfSU5UX0NTVEFUX09GRlNFVAkJKDB4MzApCi0jZGVmaW5lIE1DVF9MX0lOVF9FTkJfT0ZGU0VUCQkoMHgzNCkKLSNkZWZpbmUgTUNUX0xfV1NUQVRfT0ZGU0VUCQkoMHg0MCkKLQotI2RlZmluZSBNQ1RfR19UQ09OX1NUQVJUCQkoMSA8PCA4KQotI2RlZmluZSBNQ1RfR19UQ09OX0NPTVAwX0FVVE9fSU5DCSgxIDw8IDEpCi0jZGVmaW5lIE1DVF9HX1RDT05fQ09NUDBfRU5BQkxFCQkoMSA8PCAwKQotCi0jZGVmaW5lIE1DVF9MX1RDT05fSU5URVJWQUxfTU9ERQkoMSA8PCAyKQotI2RlZmluZSBNQ1RfTF9UQ09OX0lOVF9TVEFSVAkJKDEgPDwgMSkKLSNkZWZpbmUgTUNUX0xfVENPTl9USU1FUl9TVEFSVAkJKDEgPDwgMCkKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUkVHU19NQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXBtdS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXBtdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGY5YjQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1wbXUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtcG11LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0IC0gUG93ZXIgbWFuYWdlbWVudCB1bml0IGRlZmluaXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfUE1VX0gKLSNkZWZpbmUgX19BU01fQVJDSF9SRUdTX1BNVV9IIF9fRklMRV9fCi0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jZGVmaW5lIFM1UF9QTVVSRUcoeCkJCQkJKFM1UF9WQV9QTVUgKyAoeCkpCi0KLSNkZWZpbmUgUzVQX0NFTlRSQUxfU0VRX0NPTkZJR1VSQVRJT04JCVM1UF9QTVVSRUcoMHgwMjAwKQotCi0jZGVmaW5lIFM1UF9DRU5UUkFMX0xPV1BXUl9DRkcJCQkoMSA8PCAxNikKLQotI2RlZmluZSBTNVBfQ0VOVFJBTF9TRVFfT1BUSU9OCQkJUzVQX1BNVVJFRygweDAyMDgpCi0KLSNkZWZpbmUgUzVQX1VTRV9TVEFOREJZX1dGSTAJCQkoMSA8PCAxNikKLSNkZWZpbmUgUzVQX1VTRV9TVEFOREJZX1dGSTEJCQkoMSA8PCAxNykKLSNkZWZpbmUgUzVQX1VTRV9TVEFOREJZX1dGRTAJCQkoMSA8PCAyNCkKLSNkZWZpbmUgUzVQX1VTRV9TVEFOREJZX1dGRTEJCQkoMSA8PCAyNSkKLSNkZWZpbmUgUzVQX1VTRV9NQVNLCQkJCSgoMHgzIDw8IDE2KSB8ICgweDMgPDwgMjQpKQotCi0jZGVmaW5lIFM1UF9TV1JFU0VUCQkJCVM1UF9QTVVSRUcoMHgwNDAwKQotCi0jZGVmaW5lIFM1UF9XQUtFVVBfU1RBVAkJCQlTNVBfUE1VUkVHKDB4MDYwMCkKLSNkZWZpbmUgUzVQX0VJTlRfV0FLRVVQX01BU0sJCQlTNVBfUE1VUkVHKDB4MDYwNCkKLSNkZWZpbmUgUzVQX1dBS0VVUF9NQVNLCQkJCVM1UF9QTVVSRUcoMHgwNjA4KQotCi0jZGVmaW5lIFM1UF9VU0JIT1NUX1BIWV9DT05UUk9MCQkJUzVQX1BNVVJFRygweDA3MDgpCi0jZGVmaW5lIFM1UF9VU0JIT1NUX1BIWV9FTkFCTEUJCQkoMSA8PCAwKQotCi0jZGVmaW5lIFM1UF9NSVBJX0RQSFlfQ09OVFJPTChuKQkJUzVQX1BNVVJFRygweDA3MTAgKyAobikgKiA0KQotI2RlZmluZSBTNVBfTUlQSV9EUEhZX0VOQUJMRQkJCSgxIDw8IDApCi0jZGVmaW5lIFM1UF9NSVBJX0RQSFlfU1JFU0VUTgkJCSgxIDw8IDEpCi0jZGVmaW5lIFM1UF9NSVBJX0RQSFlfTVJFU0VUTgkJCSgxIDw8IDIpCi0KLSNkZWZpbmUgUzVQX1BNVV9TQVRBX1BIWV9DT05UUk9MCQlTNVBfUE1VUkVHKDB4MDcyMCkKLSNkZWZpbmUgUzVQX0lORk9STTAJCQkJUzVQX1BNVVJFRygweDA4MDApCi0jZGVmaW5lIFM1UF9JTkZPUk0xCQkJCVM1UF9QTVVSRUcoMHgwODA0KQotI2RlZmluZSBTNVBfSU5GT1JNMgkJCQlTNVBfUE1VUkVHKDB4MDgwOCkKLSNkZWZpbmUgUzVQX0lORk9STTMJCQkJUzVQX1BNVVJFRygweDA4MEMpCi0jZGVmaW5lIFM1UF9JTkZPUk00CQkJCVM1UF9QTVVSRUcoMHgwODEwKQotI2RlZmluZSBTNVBfSU5GT1JNNQkJCQlTNVBfUE1VUkVHKDB4MDgxNCkKLSNkZWZpbmUgUzVQX0lORk9STTYJCQkJUzVQX1BNVVJFRygweDA4MTgpCi0jZGVmaW5lIFM1UF9JTkZPUk03CQkJCVM1UF9QTVVSRUcoMHgwODFDKQotCi0jZGVmaW5lIFM1UF9BUk1fQ09SRTBfTE9XUFdSCQkJUzVQX1BNVVJFRygweDEwMDApCi0jZGVmaW5lIFM1UF9ESVNfSVJRX0NPUkUwCQkJUzVQX1BNVVJFRygweDEwMDQpCi0jZGVmaW5lIFM1UF9ESVNfSVJRX0NFTlRSQUwwCQkJUzVQX1BNVVJFRygweDEwMDgpCi0jZGVmaW5lIFM1UF9BUk1fQ09SRTFfTE9XUFdSCQkJUzVQX1BNVVJFRygweDEwMTApCi0jZGVmaW5lIFM1UF9ESVNfSVJRX0NPUkUxCQkJUzVQX1BNVVJFRygweDEwMTQpCi0jZGVmaW5lIFM1UF9ESVNfSVJRX0NFTlRSQUwxCQkJUzVQX1BNVVJFRygweDEwMTgpCi0jZGVmaW5lIFM1UF9BUk1fQ09NTU9OX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMDgwKQotI2RlZmluZSBTNVBfTDJfMF9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEwQzApCi0jZGVmaW5lIFM1UF9MMl8xX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTBDNCkKLSNkZWZpbmUgUzVQX0NNVV9BQ0xLU1RPUF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEwMCkKLSNkZWZpbmUgUzVQX0NNVV9TQ0xLU1RPUF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEwNCkKLSNkZWZpbmUgUzVQX0NNVV9SRVNFVF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEwQykKLSNkZWZpbmUgUzVQX0FQTExfU1lTQ0xLX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTIwKQotI2RlZmluZSBTNVBfTVBMTF9TWVNDTEtfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExMjQpCi0jZGVmaW5lIFM1UF9WUExMX1NZU0NMS19MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEyOCkKLSNkZWZpbmUgUzVQX0VQTExfU1lTQ0xLX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTJDKQotI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfR1BTX0FMSVZFX0xPV1BXUglTNVBfUE1VUkVHKDB4MTEzOCkKLSNkZWZpbmUgUzVQX0NNVV9SRVNFVF9HUFNBTElWRV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTNDKQotI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfQ0FNX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNDApCi0jZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9UVl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTQ0KQotI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfTUZDX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNDgpCi0jZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9HM0RfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE0QykKLSNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX0xDRDBfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE1MCkKLSNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX0xDRDFfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE1NCkKLSNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX01BVURJT19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTU4KQotI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfR1BTX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNUMpCi0jZGVmaW5lIFM1UF9DTVVfUkVTRVRfQ0FNX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNjApCi0jZGVmaW5lIFM1UF9DTVVfUkVTRVRfVFZfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExNjQpCi0jZGVmaW5lIFM1UF9DTVVfUkVTRVRfTUZDX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNjgpCi0jZGVmaW5lIFM1UF9DTVVfUkVTRVRfRzNEX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNkMpCi0jZGVmaW5lIFM1UF9DTVVfUkVTRVRfTENEMF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTcwKQotI2RlZmluZSBTNVBfQ01VX1JFU0VUX0xDRDFfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE3NCkKLSNkZWZpbmUgUzVQX0NNVV9SRVNFVF9NQVVESU9fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE3OCkKLSNkZWZpbmUgUzVQX0NNVV9SRVNFVF9HUFNfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE3QykKLSNkZWZpbmUgUzVQX1RPUF9CVVNfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExODApCi0jZGVmaW5lIFM1UF9UT1BfUkVURU5USU9OX0xPV1BXUgkJUzVQX1BNVVJFRygweDExODQpCi0jZGVmaW5lIFM1UF9UT1BfUFdSX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTg4KQotI2RlZmluZSBTNVBfTE9HSUNfUkVTRVRfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExQTApCi0jZGVmaW5lIFM1UF9PTkVOQU5EX01FTV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFDMCkKLSNkZWZpbmUgUzVQX01PRElNSUZfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUM0KQotI2RlZmluZSBTNVBfRzJEX0FDUF9NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExQzgpCi0jZGVmaW5lIFM1UF9VU0JPVEdfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUNDKQotI2RlZmluZSBTNVBfSFNNTUNfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUQwKQotI2RlZmluZSBTNVBfQ1NTWVNfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUQ0KQotI2RlZmluZSBTNVBfU0VDU1NfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUQ4KQotI2RlZmluZSBTNVBfUENJRV9NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExRTApCi0jZGVmaW5lIFM1UF9TQVRBX01FTV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFFNCkKLSNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fRFJBTV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjAwKQotI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9NQVVESU9fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIwNCkKLSNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fR1BJT19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjIwKQotI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9VQVJUX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMjQpCi0jZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX01NQ0FfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIyOCkKLSNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fTU1DQl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjJDKQotI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9FQklBX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMzApCi0jZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX0VCSUJfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIzNCkKLSNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fSVNPTEFUSU9OX0xPV1BXUglTNVBfUE1VUkVHKDB4MTI0MCkKLSNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fQUxWX1NFTF9MT1dQV1IJUzVQX1BNVVJFRygweDEyNjApCi0jZGVmaW5lIFM1UF9YVVNCWFRJX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMjgwKQotI2RlZmluZSBTNVBfWFhUSV9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEyODQpCi0jZGVmaW5lIFM1UF9FWFRfUkVHVUxBVE9SX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyQzApCi0jZGVmaW5lIFM1UF9HUElPX01PREVfTE9XUFdSCQkJUzVQX1BNVVJFRygweDEzMDApCi0jZGVmaW5lIFM1UF9HUElPX01PREVfTUFVRElPX0xPV1BXUgkJUzVQX1BNVVJFRygweDEzNDApCi0jZGVmaW5lIFM1UF9DQU1fTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzgwKQotI2RlZmluZSBTNVBfVFZfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzg0KQotI2RlZmluZSBTNVBfTUZDX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTM4OCkKLSNkZWZpbmUgUzVQX0czRF9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEzOEMpCi0jZGVmaW5lIFM1UF9MQ0QwX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTM5MCkKLSNkZWZpbmUgUzVQX0xDRDFfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzk0KQotI2RlZmluZSBTNVBfTUFVRElPX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMzk4KQotI2RlZmluZSBTNVBfR1BTX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTM5QykKLSNkZWZpbmUgUzVQX0dQU19BTElWRV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTNBMCkKLQotI2RlZmluZSBTNVBfQVJNX0NPUkUwX0NPTkZJR1VSQVRJT04JCVM1UF9QTVVSRUcoMHgyMDAwKQotI2RlZmluZSBTNVBfQVJNX0NPUkUwX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyMDA4KQotI2RlZmluZSBTNVBfQVJNX0NPUkUxX0NPTkZJR1VSQVRJT04JCVM1UF9QTVVSRUcoMHgyMDgwKQotI2RlZmluZSBTNVBfQVJNX0NPUkUxX1NUQVRVUwkJCVM1UF9QTVVSRUcoMHgyMDg0KQotI2RlZmluZSBTNVBfQVJNX0NPUkUxX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyMDg4KQotCi0jZGVmaW5lIFM1UF9BUk1fQ09NTU9OX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyNDA4KQotI2RlZmluZSBTNVBfVE9QX1BXUl9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MkM0OCkKLSNkZWZpbmUgUzVQX0NBTV9PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDMDgpCi0jZGVmaW5lIFM1UF9UVl9PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDMjgpCi0jZGVmaW5lIFM1UF9NRkNfT1BUSU9OCQkJCVM1UF9QTVVSRUcoMHgzQzQ4KQotI2RlZmluZSBTNVBfRzNEX09QVElPTgkJCQlTNVBfUE1VUkVHKDB4M0M2OCkKLSNkZWZpbmUgUzVQX0xDRDBfT1BUSU9OCQkJCVM1UF9QTVVSRUcoMHgzQzg4KQotI2RlZmluZSBTNVBfTENEMV9PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDQTgpCi0jZGVmaW5lIFM1UF9NQVVESU9fT1BUSU9OCQkJUzVQX1BNVVJFRygweDNDQzgpCi0jZGVmaW5lIFM1UF9HUFNfT1BUSU9OCQkJCVM1UF9QTVVSRUcoMHgzQ0U4KQotI2RlZmluZSBTNVBfR1BTX0FMSVZFX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzRDA4KQotCi0jZGVmaW5lIFM1UF9QQURfUkVUX01BVURJT19PUFRJT04JCVM1UF9QTVVSRUcoMHgzMDI4KQotI2RlZmluZSBTNVBfUEFEX1JFVF9HUElPX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTA4KQotI2RlZmluZSBTNVBfUEFEX1JFVF9VQVJUX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTI4KQotI2RlZmluZSBTNVBfUEFEX1JFVF9NTUNBX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTQ4KQotI2RlZmluZSBTNVBfUEFEX1JFVF9NTUNCX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTY4KQotI2RlZmluZSBTNVBfUEFEX1JFVF9FQklBX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMTg4KQotI2RlZmluZSBTNVBfUEFEX1JFVF9FQklCX09QVElPTgkJCVM1UF9QTVVSRUcoMHgzMUE4KQotCi0jZGVmaW5lIFM1UF9QTVVfQ0FNX0NPTkYJCQlTNVBfUE1VUkVHKDB4M0MwMCkKLSNkZWZpbmUgUzVQX1BNVV9UVl9DT05GCQkJCVM1UF9QTVVSRUcoMHgzQzIwKQotI2RlZmluZSBTNVBfUE1VX01GQ19DT05GCQkJUzVQX1BNVVJFRygweDNDNDApCi0jZGVmaW5lIFM1UF9QTVVfRzNEX0NPTkYJCQlTNVBfUE1VUkVHKDB4M0M2MCkKLSNkZWZpbmUgUzVQX1BNVV9MQ0QwX0NPTkYJCQlTNVBfUE1VUkVHKDB4M0M4MCkKLSNkZWZpbmUgUzVQX1BNVV9MQ0QxX0NPTkYJCQlTNVBfUE1VUkVHKDB4M0NBMCkKLSNkZWZpbmUgUzVQX1BNVV9HUFNfQ09ORgkJCVM1UF9QTVVSRUcoMHgzQ0UwKQotCi0jZGVmaW5lIFM1UF9QTVVfU0FUQV9QSFlfQ09OVFJPTF9FTgkJMHgxCi0jZGVmaW5lIFM1UF9DT1JFX0xPQ0FMX1BXUl9FTgkJCTB4MwotI2RlZmluZSBTNVBfSU5UX0xPQ0FMX1BXUl9FTgkJCTB4NwotCi0jZGVmaW5lIFM1UF9DSEVDS19TTEVFUAkJCQkweDAwMDAwQkFECi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1JFR1NfUE1VX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLWFybWxleDQyMTAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLWFybWxleDQyMTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4MmM2Mi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1hcm1sZXg0MjEwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtYXJtbGV4NDIxMC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Ntc2M5MTF4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgotI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc3JvbS5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLS8qIEZvbGxvd2luZyBhcmUgZGVmYXVsdCB2YWx1ZXMgZm9yIFVDT04sIFVMQ09OIGFuZCBVRkNPTiBVQVJUIHJlZ2lzdGVycyAqLwotI2RlZmluZSBBUk1MRVg0MjEwX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9UWElSUU1PREUgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWElSUU1PREUgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWEZJRk9fVE9JIHwJXAotCQkJCSBTM0MyNDQzX1VDT05fUlhFUlJfSVJRRU4pCi0KLSNkZWZpbmUgQVJNTEVYNDIxMF9VTENPTl9ERUZBVUxUCVMzQzI0MTBfTENPTl9DUzgKLQotI2RlZmluZSBBUk1MRVg0MjEwX1VGQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUZDT05fRklGT01PREUgfAlcCi0JCQkJIFM1UFYyMTBfVUZDT05fVFhUUklHNCB8CVwKLQkJCQkgUzVQVjIxMF9VRkNPTl9SWFRSSUc0KQotCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyBhcm1sZXg0MjEwX3VhcnRjZmdzW10gX19pbml0ZGF0YSA9IHsKLQlbMF0gPSB7Ci0JCS5od3BvcnQJCT0gMCwKLQkJLmZsYWdzCQk9IDAsCi0JCS51Y29uCQk9IEFSTUxFWDQyMTBfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gQVJNTEVYNDIxMF9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gQVJNTEVYNDIxMF9VRkNPTl9ERUZBVUxULAotCX0sCi0JWzFdID0gewotCQkuaHdwb3J0CQk9IDEsCi0JCS5mbGFncwkJPSAwLAotCQkudWNvbgkJPSBBUk1MRVg0MjEwX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IEFSTUxFWDQyMTBfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IEFSTUxFWDQyMTBfVUZDT05fREVGQVVMVCwKLQl9LAotCVsyXSA9IHsKLQkJLmh3cG9ydAkJPSAyLAotCQkuZmxhZ3MJCT0gMCwKLQkJLnVjb24JCT0gQVJNTEVYNDIxMF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBBUk1MRVg0MjEwX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBBUk1MRVg0MjEwX1VGQ09OX0RFRkFVTFQsCi0JfSwKLQlbM10gPSB7Ci0JCS5od3BvcnQJCT0gMywKLQkJLmZsYWdzCQk9IDAsCi0JCS51Y29uCQk9IEFSTUxFWDQyMTBfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gQVJNTEVYNDIxMF9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gQVJNTEVYNDIxMF9VRkNPTl9ERUZBVUxULAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBhcm1sZXg0MjEwX2hzbW1jMF9wZGF0YSBfX2luaXRkYXRhID0gewotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9QRVJNQU5FTlQsCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotI2lmZGVmIENPTkZJR19FWFlOT1M0X1NESENJX0NIMF84QklUCi0JLm1heF93aWR0aAkJPSA4LAotCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF84X0JJVF9EQVRBLAotI2VuZGlmCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBhcm1sZXg0MjEwX2hzbW1jMl9wZGF0YSBfX2luaXRkYXRhID0gewotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAotCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQWDIoNSksCi0JLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotCS5tYXhfd2lkdGgJCT0gNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIGFybWxleDQyMTBfaHNtbWMzX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX1BFUk1BTkVOVCwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi0JLm1heF93aWR0aAkJPSA0LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGFybWxleDQyMTBfc2RoY2lfaW5pdCh2b2lkKQotewotCXMzY19zZGhjaTBfc2V0X3BsYXRkYXRhKCZhcm1sZXg0MjEwX2hzbW1jMF9wZGF0YSk7Ci0JczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJmFybWxleDQyMTBfaHNtbWMyX3BkYXRhKTsKLQlzM2Nfc2RoY2kzX3NldF9wbGF0ZGF0YSgmYXJtbGV4NDIxMF9oc21tYzNfcGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXJtbGV4NDIxMF93bGFuX2luaXQodm9pZCkKLXsKLQkvKiBlbmFibGUgKi8KLQlzM2NfZ3Bpb19jZmdwaW4oRVhZTk9TNF9HUFgyKDApLCBTM0NfR1BJT19TRk4oMHhmKSk7Ci0JczNjX2dwaW9fc2V0cHVsbChFWFlOT1M0X0dQWDIoMCksIFMzQ19HUElPX1BVTExfVVApOwotCi0JLyogcmVzZXQgKi8KLQlzM2NfZ3Bpb19jZmdwaW4oRVhZTk9TNF9HUFgxKDYpLCBTM0NfR1BJT19TRk4oMHhmKSk7Ci0JczNjX2dwaW9fc2V0cHVsbChFWFlOT1M0X0dQWDEoNiksIFMzQ19HUElPX1BVTExfVVApOwotCi0JLyogd2FrZXVwICovCi0JczNjX2dwaW9fY2ZncGluKEVYWU5PUzRfR1BYMSg1KSwgUzNDX0dQSU9fU0ZOKDB4ZikpOwotCXMzY19ncGlvX3NldHB1bGwoRVhZTk9TNF9HUFgxKDUpLCBTM0NfR1BJT19QVUxMX1VQKTsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhcm1sZXg0MjEwX3Ntc2M5MTF4X3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TUk9NX0JBTksoMyksCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NST01fQkFOSygzKSArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfRUlOVCgyNyksCi0JCS5lbmQJPSBJUlFfRUlOVCgyNyksCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSVJRRl9UUklHR0VSX0hJR0gsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc21zYzkxMXhfcGxhdGZvcm1fY29uZmlnIHNtc2M5MjE1X2NvbmZpZyA9IHsKLQkuaXJxX3BvbGFyaXR5CT0gU01TQzkxMVhfSVJRX1BPTEFSSVRZX0FDVElWRV9ISUdILAotCS5pcnFfdHlwZQk9IFNNU0M5MTFYX0lSUV9UWVBFX1BVU0hfUFVMTCwKLQkuZmxhZ3MJCT0gU01TQzkxMVhfVVNFXzE2QklUIHwgU01TQzkxMVhfRk9SQ0VfSU5URVJOQUxfUEhZLAotCS5waHlfaW50ZXJmYWNlCT0gUEhZX0lOVEVSRkFDRV9NT0RFX01JSSwKLQkubWFjCQk9IHsweDAwLCAweDgwLCAweDAwLCAweDIzLCAweDQ1LCAweDY3fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFybWxleDQyMTBfc21zYzkxMXggPSB7Ci0JLm5hbWUJCT0gInNtc2M5MTF4IiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGFybWxleDQyMTBfc21zYzkxMXhfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBhcm1sZXg0MjEwX3Ntc2M5MTF4X3Jlc291cmNlcywKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmc21zYzkyMTVfY29uZmlnLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXJtbGV4NDIxMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmczNjX2RldmljZV9oc21tYzAsCi0JJnMzY19kZXZpY2VfaHNtbWMyLAotCSZzM2NfZGV2aWNlX2hzbW1jMywKLQkmczNjX2RldmljZV9ydGMsCi0JJnMzY19kZXZpY2Vfd2R0LAotCSZleHlub3M0X2RldmljZV9zeXNtbXUsCi0JJnNhbXN1bmdfYXNvY19kbWEsCi0JJmFybWxleDQyMTBfc21zYzkxMXgsCi0JJmV4eW5vczRfZGV2aWNlX2FoY2ksCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXJtbGV4NDIxMF9zbXNjOTExeF9pbml0KHZvaWQpCi17Ci0JdTMyIGNzMTsKLQotCS8qIGNvbmZpZ3VyZSBuQ1MxIHdpZHRoIHRvIDE2IGJpdHMgKi8KLQljczEgPSBfX3Jhd19yZWFkbChTNVBfU1JPTV9CVykgJgotCQl+KFM1UF9TUk9NX0JXX19DU19NQVNLIDw8IFM1UF9TUk9NX0JXX19OQ1MxX19TSElGVCk7Ci0JY3MxIHw9ICgoMSA8PCBTNVBfU1JPTV9CV19fREFUQVdJRFRIX19TSElGVCkgfAotCQkoMCA8PCBTNVBfU1JPTV9CV19fV0FJVEVOQUJMRV9fU0hJRlQpIHwKLQkJKDEgPDwgUzVQX1NST01fQldfX0FERFJNT0RFX19TSElGVCkgfAotCQkoMSA8PCBTNVBfU1JPTV9CV19fQllURUVOQUJMRV9fU0hJRlQpKSA8PAotCQlTNVBfU1JPTV9CV19fTkNTMV9fU0hJRlQ7Ci0JX19yYXdfd3JpdGVsKGNzMSwgUzVQX1NST01fQlcpOwotCi0JLyogc2V0IHRpbWluZyBmb3IgbkNTMSBzdWl0YWJsZSBmb3IgZXRoZXJuZXQgY2hpcCAqLwotCV9fcmF3X3dyaXRlbCgoMHgxIDw8IFM1UF9TUk9NX0JDWF9fUE1DX19TSElGVCkgfAotCQkgICAgICgweDkgPDwgUzVQX1NST01fQkNYX19UQUNQX19TSElGVCkgfAotCQkgICAgICgweGMgPDwgUzVQX1NST01fQkNYX19UQ0FIX19TSElGVCkgfAotCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQ09IX19TSElGVCkgfAotCQkgICAgICgweDYgPDwgUzVQX1NST01fQkNYX19UQUNDX19TSElGVCkgfAotCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQ09TX19TSElGVCkgfAotCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQUNTX19TSElGVCksIFM1UF9TUk9NX0JDMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhcm1sZXg0MjEwX21hcF9pbyh2b2lkKQotewotCXM1cF9pbml0X2lvKE5VTEwsIDAsIFM1UF9WQV9DSElQSUQpOwotCXMzYzI0eHhfaW5pdF9jbG9ja3MoMjQwMDAwMDApOwotCXMzYzI0eHhfaW5pdF91YXJ0cyhhcm1sZXg0MjEwX3VhcnRjZmdzLAotCQkJICAgQVJSQVlfU0laRShhcm1sZXg0MjEwX3VhcnRjZmdzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhcm1sZXg0MjEwX21hY2hpbmVfaW5pdCh2b2lkKQotewotCWFybWxleDQyMTBfc21zYzkxMXhfaW5pdCgpOwotCi0JYXJtbGV4NDIxMF9zZGhjaV9pbml0KCk7Ci0KLQlhcm1sZXg0MjEwX3dsYW5faW5pdCgpOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMoYXJtbGV4NDIxMF9kZXZpY2VzLAotCQkJICAgICBBUlJBWV9TSVpFKGFybWxleDQyMTBfZGV2aWNlcykpOwotfQotCi1NQUNISU5FX1NUQVJUKEFSTUxFWDQyMTAsICJBUk1MRVg0MjEwIikKLQkvKiBNYWludGFpbmVyOiBBbGltIEFraHRhciA8YWxpbS5ha2h0YXJAc2Ftc3VuZy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzVQX1BBX1NEUkFNICsgMHgxMDAsCi0JLmluaXRfaXJxCT0gZXh5bm9zNF9pbml0X2lycSwKLQkubWFwX2lvCQk9IGFybWxleDQyMTBfbWFwX2lvLAotCS5pbml0X21hY2hpbmUJPSBhcm1sZXg0MjEwX21hY2hpbmVfaW5pdCwKLQkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtbnVyaS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtbnVyaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2JlNzFiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLW51cmkuYworKysgL2Rldi9udWxsCkBAIC0xLDExNjEgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLW51cmkuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMvYXRtZWxfbXh0X3RzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2ZpeGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTcuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5Ny1wcml2YXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KLQotI2luY2x1ZGUgPHZpZGVvL3BsYXRmb3JtX2xjZC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2FkYy5oPgotI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KLSNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L2VoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgotI2luY2x1ZGUgPHBsYXQvaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9tZmMuaD4KLSNpbmNsdWRlIDxwbGF0L3BkLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0vKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTlVSSV9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1JYSUxFVkVMIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fVFhJUlFNT0RFIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhJUlFNT0RFIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhGSUZPX1RPSSB8CVwKLQkJCQkgUzNDMjQ0M19VQ09OX1JYRVJSX0lSUUVOKQotCi0jZGVmaW5lIE5VUklfVUxDT05fREVGQVVMVAlTM0MyNDEwX0xDT05fQ1M4Ci0KLSNkZWZpbmUgTlVSSV9VRkNPTl9ERUZBVUxUCShTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFIHwJXAotCQkJCSBTNVBWMjEwX1VGQ09OX1RYVFJJRzI1NiB8CVwKLQkJCQkgUzVQVjIxMF9VRkNPTl9SWFRSSUcyNTYpCi0KLWVudW0gZml4ZWRfcmVndWxhdG9yX2lkIHsKLQlGSVhFRF9SRUdfSURfTU1DID0gMCwKLQlGSVhFRF9SRUdfSURfTUFYODkwMywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIG51cmlfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLmh3cG9ydAkJPSAwLAotCQkudWNvbgkJPSBOVVJJX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IE5VUklfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IE5VUklfVUZDT05fREVGQVVMVCwKLQl9LAotCXsKLQkJLmh3cG9ydAkJPSAxLAotCQkudWNvbgkJPSBOVVJJX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IE5VUklfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IE5VUklfVUZDT05fREVGQVVMVCwKLQl9LAotCXsKLQkJLmh3cG9ydAkJPSAyLAotCQkudWNvbgkJPSBOVVJJX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IE5VUklfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IE5VUklfVUZDT05fREVGQVVMVCwKLQl9LAotCXsKLQkJLmh3cG9ydAkJPSAzLAotCQkudWNvbgkJPSBOVVJJX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IE5VUklfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IE5VUklfVUZDT05fREVGQVVMVCwKLQl9LAotfTsKLQotLyogZU1NQyAqLwotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgbnVyaV9oc21tYzBfZGF0YSBfX2luaXRkYXRhID0gewotCS5tYXhfd2lkdGgJCT0gOCwKLQkuaG9zdF9jYXBzCQk9IChNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQXzRfQklUX0RBVEEgfAotCQkJCU1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwKLQkJCQlNTUNfQ0FQX0RJU0FCTEUgfCBNTUNfQ0FQX0VSQVNFKSwKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfUEVSTUFORU5ULAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBlbW1jX3N1cHBsaWVzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJzM2Mtc2RoY2kuMCIpLAotCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAiZHdfbW1jIiksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgZW1tY19maXhlZF92b2x0YWdlX2luaXRfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJCT0gewotCQkubmFtZQkJPSAiVk1FTV9WRERfMi44ViIsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUoZW1tY19zdXBwbGllcyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gZW1tY19zdXBwbGllcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgZW1tY19maXhlZF92b2x0YWdlX2NvbmZpZyA9IHsKLQkuc3VwcGx5X25hbWUJCT0gIk1BU1NNRU1PUllfRU4gKGludmVydGVkKSIsCi0JLm1pY3Jvdm9sdHMJCT0gMjgwMDAwMCwKLQkuZ3BpbwkJCT0gRVhZTk9TNF9HUEwxKDEpLAotCS5lbmFibGVfaGlnaAkJPSBmYWxzZSwKLQkuaW5pdF9kYXRhCQk9ICZlbW1jX2ZpeGVkX3ZvbHRhZ2VfaW5pdF9kYXRhLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZW1tY19maXhlZF92b2x0YWdlID0gewotCS5uYW1lCQkJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAotCS5pZAkJCT0gRklYRURfUkVHX0lEX01NQywKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmVtbWNfZml4ZWRfdm9sdGFnZV9jb25maWcsCi0JfSwKLX07Ci0KLS8qIFNEICovCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBudXJpX2hzbW1jMl9kYXRhIF9faW5pdGRhdGEgPSB7Ci0JLm1heF93aWR0aAkJPSA0LAotCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF80X0JJVF9EQVRBIHwKLQkJCQlNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8Ci0JCQkJTU1DX0NBUF9ESVNBQkxFLAotCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQWDMoMyksCS8qIFhFSU5UXzI3ICovCi0JLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCi0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotfTsKLQotLyogV0xBTiAqLwotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgbnVyaV9oc21tYzNfZGF0YSBfX2luaXRkYXRhID0gewotCS5tYXhfd2lkdGgJCT0gNCwKLQkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfNF9CSVRfREFUQSB8Ci0JCQkJTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQsCi0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0VYVEVSTkFMLAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBudXJpX3NkaGNpX2luaXQodm9pZCkKLXsKLQlzM2Nfc2RoY2kwX3NldF9wbGF0ZGF0YSgmbnVyaV9oc21tYzBfZGF0YSk7Ci0JczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJm51cmlfaHNtbWMyX2RhdGEpOwotCXMzY19zZGhjaTNfc2V0X3BsYXRkYXRhKCZudXJpX2hzbW1jM19kYXRhKTsKLX0KLQotLyogR1BJTyBLRVlTICovCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gbnVyaV9ncGlvX2tleXNfdGFibGVzW10gPSB7Ci0JewotCQkuY29kZQkJCT0gS0VZX1ZPTFVNRVVQLAotCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDApLAkvKiBYRUlOVDE2ICovCi0JCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfVk9MVU1FVVAiLAotCQkudHlwZQkJCT0gRVZfS0VZLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAotCX0sIHsKLQkJLmNvZGUJCQk9IEtFWV9WT0xVTUVET1dOLAotCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDEpLAkvKiBYRUlOVDE3ICovCi0JCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfVk9MVU1FRE9XTiIsCi0JCS50eXBlCQkJPSBFVl9LRVksCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCi0JfSwgewotCQkuY29kZQkJCT0gS0VZX1BPV0VSLAotCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDcpLAkvKiBYRUlOVDIzICovCi0JCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfUE9XRVIiLAotCQkudHlwZQkJCT0gRVZfS0VZLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkud2FrZXVwCQkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIG51cmlfZ3Bpb19rZXlzX2RhdGEgPSB7Ci0JLmJ1dHRvbnMJCT0gbnVyaV9ncGlvX2tleXNfdGFibGVzLAotCS5uYnV0dG9ucwkJPSBBUlJBWV9TSVpFKG51cmlfZ3Bpb19rZXlzX3RhYmxlcyksCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBudXJpX2dwaW9fa2V5cyA9IHsKLQkubmFtZQkJCT0gImdwaW8ta2V5cyIsCi0JLmRldgkJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZudXJpX2dwaW9fa2V5c19kYXRhLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBudXJpX2xjZF9wb3dlcl9vbihzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsIHVuc2lnbmVkIGludCBwb3dlcikKLXsKLQlpbnQgZ3BpbyA9IEVYWU5PUzRfR1BFMSg1KTsKLQotCWdwaW9fcmVxdWVzdChncGlvLCAiTFZEU19uU0hETiIpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCBwb3dlcik7Ci0JZ3Bpb19mcmVlKGdwaW8pOwotfQotCi1zdGF0aWMgaW50IG51cmlfYmxfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCwgZ3BpbyA9IEVYWU5PUzRfR1BFMigzKTsKLQotCXJldCA9IGdwaW9fcmVxdWVzdChncGlvLCAiTENEX0xET19FTiIpOwotCWlmICghcmV0KQotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgMCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG51cmlfYmxfbm90aWZ5KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGJyaWdodG5lc3MpCi17Ci0JaWYgKGJyaWdodG5lc3MgPCAxKQotCQlicmlnaHRuZXNzID0gMDsKLQotCWdwaW9fc2V0X3ZhbHVlKEVYWU5PUzRfR1BFMigzKSwgMSk7Ci0KLQlyZXR1cm4gYnJpZ2h0bmVzczsKLX0KLQotc3RhdGljIHZvaWQgbnVyaV9ibF9leGl0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlncGlvX2ZyZWUoRVhZTk9TNF9HUEUyKDMpKTsKLX0KLQotLyogbnVyaSBwd20gYmFja2xpZ2h0ICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBudXJpX2JhY2tsaWdodF9kYXRhID0gewotCS5wd21faWQJCQk9IDAsCi0JLnB3bV9wZXJpb2RfbnMJCT0gMzAwMDAsCi0JLm1heF9icmlnaHRuZXNzCQk9IDEwMCwKLQkuZGZ0X2JyaWdodG5lc3MJCT0gNTAsCi0JLmluaXQJCQk9IG51cmlfYmxfaW5pdCwKLQkubm90aWZ5CQkJPSBudXJpX2JsX25vdGlmeSwKLQkuZXhpdAkJCT0gbnVyaV9ibF9leGl0LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbnVyaV9iYWNrbGlnaHRfZGV2aWNlID0gewotCS5uYW1lCQkJPSAicHdtLWJhY2tsaWdodCIsCi0JLmlkCQkJPSAtMSwKLQkuZGV2CQkJPSB7Ci0JCS5wYXJlbnQJCT0gJnMzY19kZXZpY2VfdGltZXJbMF0uZGV2LAotCQkucGxhdGZvcm1fZGF0YQk9ICZudXJpX2JhY2tsaWdodF9kYXRhLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgbnVyaV9sY2RfcGxhdGZvcm1fZGF0YSA9IHsKLQkuc2V0X3Bvd2VyCQk9IG51cmlfbGNkX3Bvd2VyX29uLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbnVyaV9sY2RfZGV2aWNlID0gewotCS5uYW1lCQkJPSAicGxhdGZvcm0tbGNkIiwKLQkuaWQJCQk9IC0xLAotCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmbnVyaV9sY2RfcGxhdGZvcm1fZGF0YSwKLQl9LAotfTsKLQotLyogSTJDMSAqLwotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmMxX2RldnNbXSBfX2luaXRkYXRhID0gewotCS8qIEd5cm8sIFRvIGJlIHVwZGF0ZWQgKi8KLX07Ci0KLS8qIFRTUCAqLwotc3RhdGljIHU4IG14dF9pbml0X3ZhbHNbXSA9IHsKLQkvKiBNWFRfR0VOX0NPTU1BTkQoNikgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCS8qIE1YVF9HRU5fUE9XRVIoNykgKi8KLQkweDIwLCAweGZmLCAweDMyLAotCS8qIE1YVF9HRU5fQUNRVUlSRSg4KSAqLwotCTB4MGEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4MjMsCi0JLyogTVhUX1RPVUNIX01VTFRJKDkpICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweDAwLCAweDAxLCAweDAxLCAweDBlLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwKLQkvKiBNWFRfVE9VQ0hfS0VZQVJSQVkoMTUpICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweDAwLAotCS8qIE1YVF9TUFRfR1BJT1BXTSgxOSkgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JLyogTVhUX1BST0NJX0dSSVBGQUNFKDIwKSAqLwotCTB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTAsIDB4MjgsIDB4MDQsCi0JMHgwZiwgMHgwYSwKLQkvKiBNWFRfUFJPQ0dfTk9JU0UoMjIpICovCi0JMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgyMywgMHgwMCwKLQkweDAwLCAweDA1LCAweDBmLCAweDE5LCAweDIzLCAweDJkLCAweDAzLAotCS8qIE1YVF9UT1VDSF9QUk9YSU1JVFkoMjMpICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCS8qIE1YVF9QUk9DSV9PTkVUT1VDSCgyNCkgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JLyogTVhUX1NQVF9TRUxGVEVTVCgyNSkgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JLyogTVhUX1BST0NJX1RXT1RPVUNIKDI3KSAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JLyogTVhUX1NQVF9DVEVDT05GSUcoMjgpICovCi0JMHgwMCwgMHgwMCwgMHgwMiwgMHgwOCwgMHgxMCwgMHgwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXh0X3BsYXRmb3JtX2RhdGEgbXh0X3BsYXRmb3JtX2RhdGEgPSB7Ci0JLmNvbmZpZwkJCT0gbXh0X2luaXRfdmFscywKLQkuY29uZmlnX2xlbmd0aAkJPSBBUlJBWV9TSVpFKG14dF9pbml0X3ZhbHMpLAotCi0JLnhfbGluZQkJCT0gMTgsCi0JLnlfbGluZQkJCT0gMTEsCi0JLnhfc2l6ZQkJCT0gMTAyNCwKLQkueV9zaXplCQkJPSA2MDAsCi0JLmJsZW4JCQk9IDB4MSwKLQkudGhyZXNob2xkCQk9IDB4MjgsCi0JLnZvbHRhZ2UJCT0gMjgwMDAwMCwJCS8qIDIuOFYgKi8KLQkub3JpZW50CQkJPSBNWFRfRElBR09OQUxfQ09VTlRFUiwKLQkuaXJxZmxhZ3MJCT0gSVJRRl9UUklHR0VSX0ZBTExJTkcsCi19OwotCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGkyYzNfZGF0YSBfX2luaXRkYXRhID0gewotCS5mbGFncwkJPSAwLAotCS5idXNfbnVtCT0gMywKLQkuc2xhdmVfYWRkcgk9IDB4MTAsCi0JLmZyZXF1ZW5jeQk9IDQwMCAqIDEwMDAsCi0JLnNkYV9kZWxheQk9IDEwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjM19kZXZzW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJhdG1lbF9teHRfdHMiLCAweDRhKSwKLQkJLnBsYXRmb3JtX2RhdGEJPSAmbXh0X3BsYXRmb3JtX2RhdGEsCi0JCS5pcnEJCT0gSVJRX0VJTlQoNCksCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBudXJpX3RzcF9pbml0KHZvaWQpCi17Ci0JaW50IGdwaW87Ci0KLQkvKiBUT1VDSF9JTlQ6IFhFSU5UXzQgKi8KLQlncGlvID0gRVhZTk9TNF9HUFgwKDQpOwotCWdwaW9fcmVxdWVzdChncGlvLCAiVE9VQ0hfSU5UIik7Ci0JczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigweGYpKTsKLQlzM2NfZ3Bpb19zZXRwdWxsKGdwaW8sIFMzQ19HUElPX1BVTExfVVApOwotfQotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzFfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkIiwgInM1cC1hZGMiKSwgLyogVXNlZCBieSBDUFUncyBBREMgZHJ2ICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8zX1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZDExIiwgInM1cC1taXBpLWNzaXMuMCIpLCAvKiBNSVBJICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG80X1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZDE4IiwgInM1cC1taXBpLWNzaXMuMCIpLCAvKiBNSVBJICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG81X1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZoc2ljIiwgIm1vZGVtY3RsIiksIC8qIE1PREVNICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG83X1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoImRpZ18xOCIsICIwLTAwMWYiKSwgLyogSENEODAzICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG84X1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZ1c2JfZCIsIE5VTEwpLCAvKiBVc2VkIGJ5IENQVSAqLwotCVJFR1VMQVRPUl9TVVBQTFkoInZkYWMiLCBOVUxMKSwgLyogVXNlZCBieSBDUFUgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzExX1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZjYyIsICJwbGF0Zm9ybS1sY2QiKSwgLyogVTgwNCBMVkRTICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xMl9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRpbyIsICI2LTAwM2MiKSwgLyogSERDODAyICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xM19bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInMzYy1zZGhjaS4yIiksIC8qIFRGTEFTSCAqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTRfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgiaW5tb3RvciIsICJtYXg4OTk3LWhhcHRpYyIpLAotfTsKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTVfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgiYXZkZCIsICIzLTAwNGEiKSwgLyogVG91Y2ggU2NyZWVuICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xNl9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJkX3NlbnNvciIsICIwLTAwMWYiKSwgLyogSERDODAzICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xOF9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQiLCAiMy0wMDRhIiksIC8qIFRvdWNoIFNjcmVlbiAqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazFfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkX2FybSIsIE5VTEwpLCAvKiBDUFVGUkVRICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19idWNrMl9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfaW50IiwgTlVMTCksIC8qIENQVUZSRVEgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2szX1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZCIsICJtYWxpX2Rldi4wIiksIC8qIEczRCBvZiBFeHlub3MgNCAqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazRfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgiY29yZSIsICIwLTAwMWYiKSwgLyogSERDODAzICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19idWNrNl9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJkaWdfMjgiLCAiMC0wMDFmIiksIC8qIHBpbiAiNyIgb2YgSERDODAzICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19lc2FmZW91dDFfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidXNiX3ZidXMiLCBOVUxMKSwgLyogQ1BVJ3MgVVNCIE9URyAqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfZXNhZmVvdXQyX1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInVzYl92YnVzIiwgIm1vZGVtY3RsIiksIC8qIFZCVVMgb2YgTW9kZW0gKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfY2hhcmdlcl9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2aW5jaGcxIiwgImNoYXJnZXItbWFuYWdlci4wIiksCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19jaGdfdG9mZl9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2aW5jaGdfc3RvcCIsIE5VTEwpLCAvKiBmb3IgamFjayBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfMzJraHpfYXBfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgiZ3BzX2NsayIsICJiY200NzUxIiksCi0JUkVHVUxBVE9SX1NVUFBMWSgiYnRfY2xrIiwgImJjbTQzMzAtYjEiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJ3aWZpX2NsayIsICJiY200MzMtYjEiKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMV9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZBRENfMy4zVl9DMjEwIiwKLQkJLm1pbl91VgkJPSAzMzAwMDAwLAotCQkubWF4X3VWCQk9IDMzMDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMV8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMV8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzJfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQUxJVkVfMS4xVl9DMjEwIiwKLQkJLm1pbl91VgkJPSAxMTAwMDAwLAotCQkubWF4X3VWCQk9IDExMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5hbHdheXNfb24JPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmVuYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzNfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWVVNCXzEuMVZfQzIxMCIsCi0JCS5taW5fdVYJCT0gMTEwMDAwMCwKLQkJLm1heF91VgkJPSAxMTAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzNfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzNfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG80X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVk1JUElfMS44ViIsCi0JCS5taW5fdVYJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJPSAxODAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzRfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzRfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG81X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkhTSUNfMS4yVl9DMjEwIiwKLQkJLm1pbl91VgkJPSAxMjAwMDAwLAotCQkubWF4X3VWCQk9IDEyMDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvNV8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvNV8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzZfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQ0NfMS44Vl9QREEiLAotCQkubWluX3VWCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCT0gMTgwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZW5hYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvN19kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIkNBTV9JU1BfMS44ViIsCi0JCS5taW5fdVYJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJPSAxODAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzdfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzdfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG84X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVlVTQi9WREFDXzMuM1ZfQzIxMCIsCi0JCS5taW5fdVYJCT0gMzMwMDAwMCwKLQkJLm1heF91VgkJPSAzMzAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzhfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzhfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG85X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkNDXzIuOFZfUERBIiwKLQkJLm1pbl91VgkJPSAyODAwMDAwLAotCQkubWF4X3VWCQk9IDI4MDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5hbHdheXNfb24JPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmVuYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzEwX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVlBMTF8xLjFWX0MyMTAiLAotCQkubWluX3VWCQk9IDExMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTEwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzExX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiTFZEU19WREQzLjNWIiwKLQkJLm1pbl91VgkJPSAzMzAwMDAwLAotCQkubWF4X3VWCQk9IDMzMDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuYm9vdF9vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xMV8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMTFfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xMl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZUX0NBTV8xLjhWIiwKLQkJLm1pbl91VgkJPSAxODAwMDAwLAotCQkubWF4X3VWCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMTJfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzEyXywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTNfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWVEZfMi44ViIsCi0JCS5taW5fdVYJCT0gMjgwMDAwMCwKLQkJLm1heF91VgkJPSAyODAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzEzXyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xM18sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE0X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkNDXzMuMFZfTU9UT1IiLAotCQkubWluX3VWCQk9IDMwMDAwMDAsCi0JCS5tYXhfdVYJCT0gMzAwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xNF8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMTRfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xNV9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZUT1VDSF9BRFZWMi44ViIsCi0JCS5taW5fdVYJCT0gMjgwMDAwMCwKLQkJLm1heF91VgkJPSAyODAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzE1XyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xNV8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE2X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiQ0FNX1NFTlNPUl9JT18xLjhWIiwKLQkJLm1pbl91VgkJPSAxODAwMDAwLAotCQkubWF4X3VWCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMTZfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzE2XywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMThfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWVE9VQ0hfVkREMi44ViIsCi0JCS5taW5fdVYJCT0gMjgwMDAwMCwKLQkJLm1heF91VgkJPSAyODAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzE4XyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xOF8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzIxX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkREUV9NMU0yXzEuMlYiLAotCQkubWluX3VWCQk9IDEyMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTIwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2sxX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkFSTV8xLjJWX0MyMTAiLAotCQkubWluX3VWCQk9IDkwMDAwMCwKLQkJLm1heF91VgkJPSAxMzUwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UsCi0JCS5hbHdheXNfb24JPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG1heDg5OTdfYnVjazFfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgPSBtYXg4OTk3X2J1Y2sxXywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazJfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWSU5UXzEuMVZfQzIxMCIsCi0JCS5taW5fdVYJCT0gOTAwMDAwLAotCQkubWF4X3VWCQk9IDExMDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUobWF4ODk5N19idWNrMl8pLAotCS5jb25zdW1lcl9zdXBwbGllcyA9IG1heDg5OTdfYnVjazJfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrM19kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZHM0RfMS4xVl9DMjEwIiwKLQkJLm1pbl91VgkJPSA5MDAwMDAsCi0JCS5tYXhfdVYJCT0gMTEwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKLQkJCQkgIFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG1heDg5OTdfYnVjazNfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgPSBtYXg4OTk3X2J1Y2szXywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazRfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJDQU1fSVNQX0NPUkVfMS4yViIsCi0JCS5taW5fdVYJCT0gMTIwMDAwMCwKLQkJLm1heF91VgkJPSAxMjAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShtYXg4OTk3X2J1Y2s0XyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzID0gbWF4ODk5N19idWNrNF8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s1X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVk1FTV8xLjJWX0MyMTAiLAotCQkubWluX3VWCQk9IDEyMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTIwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZW5hYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazZfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJDQU1fQUZfMi44ViIsCi0JCS5taW5fdVYJCT0gMjgwMDAwMCwKLQkJLm1heF91VgkJPSAyODAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShtYXg4OTk3X2J1Y2s2XyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzID0gbWF4ODk5N19idWNrNl8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s3X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkNDX1NVQl8yLjBWIiwKLQkJLm1pbl91VgkJPSAyMDAwMDAwLAotCQkubWF4X3VWCQk9IDIwMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5hbHdheXNfb24JPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmVuYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3XzMya2h6X2FwX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiMzJLSHogQVAiLAotCQkuYWx3YXlzX29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5lbmFibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG1heDg5OTdfMzJraHpfYXBfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgPSBtYXg4OTk3XzMya2h6X2FwXywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfMzJraHpfY3BfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICIzMktIeiBDUCIsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X3ZpY2hnX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVklDSEciLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19lc2FmZW91dDFfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJTQUZFT1VUMSIsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfZXNhZmVvdXQxXyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19lc2FmZW91dDFfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19lc2FmZW91dDJfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJTQUZFT1VUMiIsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfZXNhZmVvdXQyXyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19lc2FmZW91dDJfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19jaGFyZ2VyX2N2X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiQ0hBUkdFUl9DViIsCi0JCS5taW5fdVYJCT0gNDIwMDAwMCwKLQkJLm1heF91VgkJPSA0MjAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2NoYXJnZXJfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJDSEFSR0VSIiwKLQkJLm1pbl91QQkJPSAyMDAwMDAsCi0JCS5tYXhfdUEJCT0gOTUwMDAwLAotCQkuYm9vdF9vbgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTIHwKLQkJCQlSRUdVTEFUT1JfQ0hBTkdFX0NVUlJFTlQsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2NoYXJnZXJfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2NoYXJnZXJfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19jaGFyZ2VyX3RvcG9mZl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIkNIQVJHRVIgVE9QT0ZGIiwKLQkJLm1pbl91QQkJPSA1MDAwMCwKLQkJLm1heF91QQkJPSAyMDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfQ1VSUkVOVCwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfY2hnX3RvZmZfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2NoZ190b2ZmXywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF4ODk5N19yZWd1bGF0b3JfZGF0YSBfX2luaXRkYXRhIG51cmlfbWF4ODk5N19yZWd1bGF0b3JzW10gPSB7Ci0JeyBNQVg4OTk3X0xETzEsICZtYXg4OTk3X2xkbzFfZGF0YSB9LAotCXsgTUFYODk5N19MRE8yLCAmbWF4ODk5N19sZG8yX2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPMywgJm1heDg5OTdfbGRvM19kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzQsICZtYXg4OTk3X2xkbzRfZGF0YSB9LAotCXsgTUFYODk5N19MRE81LCAmbWF4ODk5N19sZG81X2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPNiwgJm1heDg5OTdfbGRvNl9kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzcsICZtYXg4OTk3X2xkbzdfZGF0YSB9LAotCXsgTUFYODk5N19MRE84LCAmbWF4ODk5N19sZG84X2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPOSwgJm1heDg5OTdfbGRvOV9kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzEwLCAmbWF4ODk5N19sZG8xMF9kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzExLCAmbWF4ODk5N19sZG8xMV9kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzEyLCAmbWF4ODk5N19sZG8xMl9kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzEzLCAmbWF4ODk5N19sZG8xM19kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzE0LCAmbWF4ODk5N19sZG8xNF9kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzE1LCAmbWF4ODk5N19sZG8xNV9kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzE2LCAmbWF4ODk5N19sZG8xNl9kYXRhIH0sCi0KLQl7IE1BWDg5OTdfTERPMTgsICZtYXg4OTk3X2xkbzE4X2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPMjEsICZtYXg4OTk3X2xkbzIxX2RhdGEgfSwKLQotCXsgTUFYODk5N19CVUNLMSwgJm1heDg5OTdfYnVjazFfZGF0YSB9LAotCXsgTUFYODk5N19CVUNLMiwgJm1heDg5OTdfYnVjazJfZGF0YSB9LAotCXsgTUFYODk5N19CVUNLMywgJm1heDg5OTdfYnVjazNfZGF0YSB9LAotCXsgTUFYODk5N19CVUNLNCwgJm1heDg5OTdfYnVjazRfZGF0YSB9LAotCXsgTUFYODk5N19CVUNLNSwgJm1heDg5OTdfYnVjazVfZGF0YSB9LAotCXsgTUFYODk5N19CVUNLNiwgJm1heDg5OTdfYnVjazZfZGF0YSB9LAotCXsgTUFYODk5N19CVUNLNywgJm1heDg5OTdfYnVjazdfZGF0YSB9LAotCi0JeyBNQVg4OTk3X0VOMzJLSFpfQVAsICZtYXg4OTk3XzMya2h6X2FwX2RhdGEgfSwKLQl7IE1BWDg5OTdfRU4zMktIWl9DUCwgJm1heDg5OTdfMzJraHpfY3BfZGF0YSB9LAotCi0JeyBNQVg4OTk3X0VOVklDSEcsICZtYXg4OTk3X3ZpY2hnX2RhdGEgfSwKLQl7IE1BWDg5OTdfRVNBRkVPVVQxLCAmbWF4ODk5N19lc2FmZW91dDFfZGF0YSB9LAotCXsgTUFYODk5N19FU0FGRU9VVDIsICZtYXg4OTk3X2VzYWZlb3V0Ml9kYXRhIH0sCi0JeyBNQVg4OTk3X0NIQVJHRVJfQ1YsICZtYXg4OTk3X2NoYXJnZXJfY3ZfZGF0YSB9LAotCXsgTUFYODk5N19DSEFSR0VSLCAmbWF4ODk5N19jaGFyZ2VyX2RhdGEgfSwKLQl7IE1BWDg5OTdfQ0hBUkdFUl9UT1BPRkYsICZtYXg4OTk3X2NoYXJnZXJfdG9wb2ZmX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgbnVyaV9tYXg4OTk3X3BkYXRhID0gewotCS53YWtldXAJCQk9IDEsCi0KLQkubnVtX3JlZ3VsYXRvcnMJCT0gQVJSQVlfU0laRShudXJpX21heDg5OTdfcmVndWxhdG9ycyksCi0JLnJlZ3VsYXRvcnMJCT0gbnVyaV9tYXg4OTk3X3JlZ3VsYXRvcnMsCi0KLQkuYnVjazEyNV9ncGlvcyA9IHsgRVhZTk9TNF9HUFgwKDUpLCBFWFlOT1M0X0dQWDAoNiksIEVYWU5PUzRfR1BMMCgwKSB9LAotCS5idWNrMl9ncGlvZHZzID0gdHJ1ZSwKLQotCS5idWNrMV92b2x0YWdlWzBdID0gMTM1MDAwMCwgLyogMS4zNVYgKi8KLQkuYnVjazFfdm9sdGFnZVsxXSA9IDEzMDAwMDAsIC8qIDEuM1YgKi8KLQkuYnVjazFfdm9sdGFnZVsyXSA9IDEyNTAwMDAsIC8qIDEuMjVWICovCi0JLmJ1Y2sxX3ZvbHRhZ2VbM10gPSAxMjAwMDAwLCAvKiAxLjJWICovCi0JLmJ1Y2sxX3ZvbHRhZ2VbNF0gPSAxMTUwMDAwLCAvKiAxLjE1ViAqLwotCS5idWNrMV92b2x0YWdlWzVdID0gMTEwMDAwMCwgLyogMS4xViAqLwotCS5idWNrMV92b2x0YWdlWzZdID0gMTAwMDAwMCwgLyogMS4wViAqLwotCS5idWNrMV92b2x0YWdlWzddID0gOTUwMDAwLCAvKiAwLjk1ViAqLwotCi0JLmJ1Y2syX3ZvbHRhZ2VbMF0gPSAxMTAwMDAwLCAvKiAxLjFWICovCi0JLmJ1Y2syX3ZvbHRhZ2VbMV0gPSAxMDAwMDAwLCAvKiAxLjBWICovCi0JLmJ1Y2syX3ZvbHRhZ2VbMl0gPSA5NTAwMDAsIC8qIDAuOTVWICovCi0JLmJ1Y2syX3ZvbHRhZ2VbM10gPSA5MDAwMDAsIC8qIDAuOVYgKi8KLQkuYnVjazJfdm9sdGFnZVs0XSA9IDExMDAwMDAsIC8qIDEuMVYgKi8KLQkuYnVjazJfdm9sdGFnZVs1XSA9IDEwMDAwMDAsIC8qIDEuMFYgKi8KLQkuYnVjazJfdm9sdGFnZVs2XSA9IDk1MDAwMCwgLyogMC45NVYgKi8KLQkuYnVjazJfdm9sdGFnZVs3XSA9IDkwMDAwMCwgLyogMC45ViAqLwotCi0JLmJ1Y2s1X3ZvbHRhZ2VbMF0gPSAxMjAwMDAwLCAvKiAxLjJWICovCi0JLmJ1Y2s1X3ZvbHRhZ2VbMV0gPSAxMjAwMDAwLCAvKiAxLjJWICovCi0JLmJ1Y2s1X3ZvbHRhZ2VbMl0gPSAxMjAwMDAwLCAvKiAxLjJWICovCi0JLmJ1Y2s1X3ZvbHRhZ2VbM10gPSAxMjAwMDAwLCAvKiAxLjJWICovCi0JLmJ1Y2s1X3ZvbHRhZ2VbNF0gPSAxMjAwMDAwLCAvKiAxLjJWICovCi0JLmJ1Y2s1X3ZvbHRhZ2VbNV0gPSAxMjAwMDAwLCAvKiAxLjJWICovCi0JLmJ1Y2s1X3ZvbHRhZ2VbNl0gPSAxMjAwMDAwLCAvKiAxLjJWICovCi0JLmJ1Y2s1X3ZvbHRhZ2VbN10gPSAxMjAwMDAwLCAvKiAxLjJWICovCi19OwotCi0vKiBHUElPIEkyQyA1IChQTUlDKSAqLwotZW51bSB7IEkyQzVfTUFYODk5NyB9Owotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmM1X2RldnNbXSBfX2luaXRkYXRhID0gewotCVtJMkM1X01BWDg5OTddID0gewotCQlJMkNfQk9BUkRfSU5GTygibWF4ODk5NyIsIDB4Q0MgPj4gMSksCi0JCS5wbGF0Zm9ybV9kYXRhCT0gJm51cmlfbWF4ODk5N19wZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtYXgxNzA0Ml9wbGF0Zm9ybV9kYXRhIG51cmlfYmF0dGVyeV9wbGF0Zm9ybV9kYXRhID0gewotfTsKLQotLyogR1BJTyBJMkMgOSAoRnVlbCBHYXVnZSkgKi8KLXN0YXRpYyBzdHJ1Y3QgaTJjX2dwaW9fcGxhdGZvcm1fZGF0YSBpMmM5X2dwaW9fZGF0YSA9IHsKLQkuc2RhX3BpbgkJPSBFWFlOT1M0X0dQWTQoMCksICAgICAgLyogWE0wQUREUl84ICovCi0JLnNjbF9waW4JCT0gRVhZTk9TNF9HUFk0KDEpLCAgICAgIC8qIFhNMEFERFJfOSAqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyYzlfZ3BpbyA9IHsKLQkubmFtZQkJCT0gImkyYy1ncGlvIiwKLQkuaWQJCQk9IDksCi0JLmRldgkJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZpMmM5X2dwaW9fZGF0YSwKLQl9LAotfTsKLWVudW0geyBJMkM5X01BWDE3MDQyfTsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjOV9kZXZzW10gX19pbml0ZGF0YSA9IHsKLQlbSTJDOV9NQVgxNzA0Ml0gPSB7Ci0JCUkyQ19CT0FSRF9JTkZPKCJtYXgxNzA0MiIsIDB4MzYpLAotCQkucGxhdGZvcm1fZGF0YSA9ICZudXJpX2JhdHRlcnlfcGxhdGZvcm1fZGF0YSwKLQl9LAotfTsKLQotLyogTUFYODkwMyBTZWNvbmRhcnkgQ2hhcmdlciAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHN1cHBsaWVzX21heDg5MDNbXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2aW5jaGcyIiwgImNoYXJnZXItbWFuYWdlci4wIiksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbWF4ODkwM19jaGFyZ2VyX2VuX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubmFtZQkJPSAiVk9VVF9DSEFSR0VSIiwKLQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5ib290X29uCT0gMSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHN1cHBsaWVzX21heDg5MDMpLAotCS5jb25zdW1lcl9zdXBwbGllcyA9IHN1cHBsaWVzX21heDg5MDMsCi19OwotCi1zdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIG1heDg5MDNfY2hhcmdlcl9lbiA9IHsKLQkuc3VwcGx5X25hbWUgPSAiVk9VVF9DSEFSR0VSIiwKLQkubWljcm92b2x0cyA9IDUwMDAwMDAsIC8qIEFzc3VtZSA1VkRDICovCi0JLmdwaW8gPSBFWFlOT1M0X0dQWTQoNSksIC8qIFRBX0VOIG5lZ2FnZWQgKi8KLQkuZW5hYmxlX2hpZ2ggPSAwLCAvKiBFbmFibGUgPSBMb3cgKi8KLQkuZW5hYmxlZF9hdF9ib290ID0gMSwKLQkuaW5pdF9kYXRhID0gJm1heDg5MDNfY2hhcmdlcl9lbl9kYXRhLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWF4ODkwM19maXhlZF9yZWdfZGV2ID0gewotCS5uYW1lID0gInJlZy1maXhlZC12b2x0YWdlIiwKLQkuaWQgPSBGSVhFRF9SRUdfSURfTUFYODkwMywKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YQk9ICZtYXg4OTAzX2NoYXJnZXJfZW4gfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF4ODkwM19wZGF0YSBudXJpX21heDg5MDMgPSB7Ci0JLyoKLQkgKiBjZW46IGRvbid0IGNvbnRyb2wgd2l0aCB0aGUgZHJpdmVyLCBsZXQgaXQgYmUKLQkgKiBjb250cm9sbGVkIGJ5IHJlZ3VsYXRvciBhYm92ZQotCSAqLwotCS5kb2sgPSBFWFlOT1M0X0dQWDEoNCksIC8qIFRBX25DT05ORUNURUQgKi8KLQkvKiB1b2ssIHVzdXM6IG5vdCBjb25uZWN0ZWQgKi8KLQkuY2hnID0gRVhZTk9TNF9HUEUyKDApLCAvKiBUQV9uQ0hHICovCi0JLyogZmx0OiB2Y2NfMS44Vl9wZGEgKi8KLQkuZGNtID0gRVhZTk9TNF9HUEwwKDEpLCAvKiBDVVJSX0FESiAqLwotCi0JLmRjX3ZhbGlkID0gdHJ1ZSwKLQkudXNiX3ZhbGlkID0gZmFsc2UsIC8qIFVTQiBpcyBub3Qgd2lyZWQgdG8gTUFYODkwMyAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbnVyaV9tYXg4OTAzX2RldmljZSA9IHsKLQkubmFtZQkJCT0gIm1heDg5MDMtY2hhcmdlciIsCi0JLmRldgkJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZudXJpX21heDg5MDMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpudXJpX2NtX2RldmljZXNbXSA9IHsKLQkmczNjX2RldmljZV9pMmM1LmRldiwKLQkmczNjX2RldmljZV9hZGMuZGV2LAotCU5VTEwsIC8qIFJlc2VydmVkIGZvciBVQVJUICovCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBudXJpX3Bvd2VyX2luaXQodm9pZCkKLXsKLQlpbnQgZ3BpbzsKLQlpbnQgaXJxX2Jhc2UgPSBJUlFfR1BJT19FTkQgKyAxOwotCWludCB0YV9lbiA9IDA7Ci0KLQludXJpX21heDg5OTdfcGRhdGEuaXJxX2Jhc2UgPSBpcnFfYmFzZTsKLQlpcnFfYmFzZSArPSBNQVg4OTk3X0lSUV9OUjsKLQotCWdwaW8gPSBFWFlOT1M0X0dQWDAoNyk7Ci0JZ3Bpb19yZXF1ZXN0KGdwaW8sICJBUF9QTUlDX0lSUSIpOwotCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMHhmKSk7Ci0JczNjX2dwaW9fc2V0cHVsbChncGlvLCBTM0NfR1BJT19QVUxMX05PTkUpOwotCi0JZ3BpbyA9IEVYWU5PUzRfR1BYMigzKTsKLQlncGlvX3JlcXVlc3QoZ3BpbywgIkZVRUxfQUxFUlQiKTsKLQlzM2NfZ3Bpb19jZmdwaW4oZ3BpbywgUzNDX0dQSU9fU0ZOKDB4ZikpOwotCXMzY19ncGlvX3NldHB1bGwoZ3BpbywgUzNDX0dQSU9fUFVMTF9OT05FKTsKLQotCWdwaW8gPSBudXJpX21heDg5MDMuZG9rOwotCWdwaW9fcmVxdWVzdChncGlvLCAiVEFfbkNPTk5FQ1RFRCIpOwotCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMHhmKSk7Ci0JczNjX2dwaW9fc2V0cHVsbChncGlvLCBTM0NfR1BJT19QVUxMX05PTkUpOwotCXRhX2VuID0gZ3Bpb19nZXRfdmFsdWUoZ3BpbykgPyAwIDogMTsKLQotCWdwaW8gPSBudXJpX21heDg5MDMuY2hnOwotCWdwaW9fcmVxdWVzdChncGlvLCAiVEFfbkNIRyIpOwotCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOwotCi0JZ3BpbyA9IG51cmlfbWF4ODkwMy5kY207Ci0JZ3Bpb19yZXF1ZXN0KGdwaW8sICJDVVJSX0FESiIpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCB0YV9lbik7Ci19Ci0KLS8qIFVTQiBFSENJICovCi1zdGF0aWMgc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhIG51cmlfZWhjaV9wZGF0YTsKLQotc3RhdGljIHZvaWQgX19pbml0IG51cmlfZWhjaV9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhICpwZGF0YSA9ICZudXJpX2VoY2lfcGRhdGE7Ci0KLQlzNXBfZWhjaV9zZXRfcGxhdGRhdGEocGRhdGEpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbnVyaV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkvKiBTYW1zdW5nIFBsYXRmb3JtIERldmljZXMgKi8KLQkmczNjX2RldmljZV9pMmM1LCAvKiBQTUlDIHNob3VsZCBpbml0aWFsaXplIGZpcnN0ICovCi0JJmVtbWNfZml4ZWRfdm9sdGFnZSwKLQkmczNjX2RldmljZV9oc21tYzAsCi0JJnMzY19kZXZpY2VfaHNtbWMyLAotCSZzM2NfZGV2aWNlX2hzbW1jMywKLQkmczNjX2RldmljZV93ZHQsCi0JJnMzY19kZXZpY2VfdGltZXJbMF0sCi0JJnM1cF9kZXZpY2VfZWhjaSwKLQkmczNjX2RldmljZV9pMmMzLAotCSZpMmM5X2dwaW8sCi0JJnMzY19kZXZpY2VfYWRjLAotCSZzM2NfZGV2aWNlX3J0YywKLQkmczVwX2RldmljZV9tZmMsCi0JJnM1cF9kZXZpY2VfbWZjX2wsCi0JJnM1cF9kZXZpY2VfbWZjX3IsCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX01GQ10sCi0KLQkvKiBOVVJJIERldmljZXMgKi8KLQkmbnVyaV9ncGlvX2tleXMsCi0JJm51cmlfbGNkX2RldmljZSwKLQkmbnVyaV9iYWNrbGlnaHRfZGV2aWNlLAotCSZtYXg4OTAzX2ZpeGVkX3JlZ19kZXYsCi0JJm51cmlfbWF4ODkwM19kZXZpY2UsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbnVyaV9tYXBfaW8odm9pZCkKLXsKLQlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKLQlzM2MyNHh4X2luaXRfY2xvY2tzKDI0MDAwMDAwKTsKLQlzM2MyNHh4X2luaXRfdWFydHMobnVyaV91YXJ0Y2ZncywgQVJSQVlfU0laRShudXJpX3VhcnRjZmdzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBudXJpX3Jlc2VydmUodm9pZCkKLXsKLQlzNXBfbWZjX3Jlc2VydmVfbWVtKDB4NDMwMDAwMDAsIDggPDwgMjAsIDB4NTEwMDAwMDAsIDggPDwgMjApOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbnVyaV9tYWNoaW5lX2luaXQodm9pZCkKLXsKLQludXJpX3NkaGNpX2luaXQoKTsKLQludXJpX3RzcF9pbml0KCk7Ci0JbnVyaV9wb3dlcl9pbml0KCk7Ci0KLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBpMmMxX2RldnMsIEFSUkFZX1NJWkUoaTJjMV9kZXZzKSk7Ci0JczNjX2kyYzNfc2V0X3BsYXRkYXRhKCZpMmMzX2RhdGEpOwotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDMsIGkyYzNfZGV2cywgQVJSQVlfU0laRShpMmMzX2RldnMpKTsKLQlzM2NfaTJjNV9zZXRfcGxhdGRhdGEoTlVMTCk7Ci0JaTJjNV9kZXZzW0kyQzVfTUFYODk5N10uaXJxID0gZ3Bpb190b19pcnEoRVhZTk9TNF9HUFgwKDcpKTsKLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbyg1LCBpMmM1X2RldnMsIEFSUkFZX1NJWkUoaTJjNV9kZXZzKSk7Ci0JaTJjOV9kZXZzW0kyQzlfTUFYMTcwNDJdLmlycSA9IGdwaW9fdG9faXJxKEVYWU5PUzRfR1BYMigzKSk7Ci0JaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oOSwgaTJjOV9kZXZzLCBBUlJBWV9TSVpFKGkyYzlfZGV2cykpOwotCi0JbnVyaV9laGNpX2luaXQoKTsKLQljbGtfeHVzYnh0aS5yYXRlID0gMjQwMDAwMDA7Ci0KLQkvKiBMYXN0ICovCi0JcGxhdGZvcm1fYWRkX2RldmljZXMobnVyaV9kZXZpY2VzLCBBUlJBWV9TSVpFKG51cmlfZGV2aWNlcykpOwotCXM1cF9kZXZpY2VfbWZjLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXS5kZXY7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoTlVSSSwgIk5VUkkiKQotCS8qIE1haW50YWluZXI6IEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzVQX1BBX1NEUkFNICsgMHgxMDAsCi0JLmluaXRfaXJxCT0gZXh5bm9zNF9pbml0X2lycSwKLQkubWFwX2lvCQk9IG51cmlfbWFwX2lvLAotCS5pbml0X21hY2hpbmUJPSBudXJpX21hY2hpbmVfaW5pdCwKLQkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCi0JLnJlc2VydmUgICAgICAgID0gJm51cmlfcmVzZXJ2ZSwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrYzIxMC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka2MyMTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjNjVlMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrYzIxMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGtjMjEwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbGNkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc3JvbS5oPgotI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgotI2luY2x1ZGUgPHBsYXQvZXh5bm9zNC5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9mYi5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy5oPgotI2luY2x1ZGUgPHBsYXQvcGQuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9iYWNrbGlnaHQuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLS8qIEZvbGxvd2luZyBhcmUgZGVmYXVsdCB2YWx1ZXMgZm9yIFVDT04sIFVMQ09OIGFuZCBVRkNPTiBVQVJUIHJlZ2lzdGVycyAqLwotI2RlZmluZSBTTURLQzIxMF9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1JYSUxFVkVMIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fVFhJUlFNT0RFIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhJUlFNT0RFIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhGSUZPX1RPSSB8CVwKLQkJCQkgUzNDMjQ0M19VQ09OX1JYRVJSX0lSUUVOKQotCi0jZGVmaW5lIFNNREtDMjEwX1VMQ09OX0RFRkFVTFQJUzNDMjQxMF9MQ09OX0NTOAotCi0jZGVmaW5lIFNNREtDMjEwX1VGQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUZDT05fRklGT01PREUgfAlcCi0JCQkJIFM1UFYyMTBfVUZDT05fVFhUUklHNCB8CVwKLQkJCQkgUzVQVjIxMF9VRkNPTl9SWFRSSUc0KQotCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyBzbWRrYzIxMF91YXJ0Y2Znc1tdIF9faW5pdGRhdGEgPSB7Ci0JWzBdID0gewotCQkuaHdwb3J0CQk9IDAsCi0JCS5mbGFncwkJPSAwLAotCQkudWNvbgkJPSBTTURLQzIxMF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBTTURLQzIxMF9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gU01ES0MyMTBfVUZDT05fREVGQVVMVCwKLQl9LAotCVsxXSA9IHsKLQkJLmh3cG9ydAkJPSAxLAotCQkuZmxhZ3MJCT0gMCwKLQkJLnVjb24JCT0gU01ES0MyMTBfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gU01ES0MyMTBfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IFNNREtDMjEwX1VGQ09OX0RFRkFVTFQsCi0JfSwKLQlbMl0gPSB7Ci0JCS5od3BvcnQJCT0gMiwKLQkJLmZsYWdzCQk9IDAsCi0JCS51Y29uCQk9IFNNREtDMjEwX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IFNNREtDMjEwX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBTTURLQzIxMF9VRkNPTl9ERUZBVUxULAotCX0sCi0JWzNdID0gewotCQkuaHdwb3J0CQk9IDMsCi0JCS5mbGFncwkJPSAwLAotCQkudWNvbgkJPSBTTURLQzIxMF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBTTURLQzIxMF9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gU01ES0MyMTBfVUZDT05fREVGQVVMVCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka2MyMTBfaHNtbWMwX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BLMCgyKSwKLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi0jaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gwXzhCSVQKLQkubWF4X3dpZHRoCQk9IDgsCi0JLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzhfQklUX0RBVEEsCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGtjMjEwX2hzbW1jMV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAotCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQSzAoMiksCi0JLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka2MyMTBfaHNtbWMyX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BLMigyKSwKLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi0jaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gyXzhCSVQKLQkubWF4X3dpZHRoCQk9IDgsCi0JLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzhfQklUX0RBVEEsCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGtjMjEwX2hzbW1jM19wZGF0YSBfX2luaXRkYXRhID0gewotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAotCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQSzIoMiksCi0JLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotfTsKLQotc3RhdGljIHZvaWQgbGNkX2x0ZTQ4MHd2X3NldF9wb3dlcihzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsCi0JCQkJICAgdW5zaWduZWQgaW50IHBvd2VyKQotewotCWlmIChwb3dlcikgewotI2lmICFkZWZpbmVkKENPTkZJR19CQUNLTElHSFRfUFdNKQotCQlncGlvX3JlcXVlc3Rfb25lKEVYWU5PUzRfR1BEMCgxKSwgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkdQRDAiKTsKLQkJZ3Bpb19mcmVlKEVYWU5PUzRfR1BEMCgxKSk7Ci0jZW5kaWYKLQkJLyogZmlyZSBuUkVTRVQgb24gcG93ZXIgdXAgKi8KLQkJZ3Bpb19yZXF1ZXN0KEVYWU5PUzRfR1BYMCg2KSwgIkdQWDAiKTsKLQotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoRVhZTk9TNF9HUFgwKDYpLCAxKTsKLQkJbWRlbGF5KDEwMCk7Ci0KLQkJZ3Bpb19zZXRfdmFsdWUoRVhZTk9TNF9HUFgwKDYpLCAwKTsKLQkJbWRlbGF5KDEwKTsKLQotCQlncGlvX3NldF92YWx1ZShFWFlOT1M0X0dQWDAoNiksIDEpOwotCQltZGVsYXkoMTApOwotCi0JCWdwaW9fZnJlZShFWFlOT1M0X0dQWDAoNikpOwotCX0gZWxzZSB7Ci0jaWYgIWRlZmluZWQoQ09ORklHX0JBQ0tMSUdIVF9QV00pCi0JCWdwaW9fcmVxdWVzdF9vbmUoRVhZTk9TNF9HUEQwKDEpLCBHUElPRl9PVVRfSU5JVF9MT1csICJHUEQwIik7Ci0JCWdwaW9fZnJlZShFWFlOT1M0X0dQRDAoMSkpOwotI2VuZGlmCi0JfQotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgc21ka2MyMTBfbGNkX2x0ZTQ4MHd2X2RhdGEgPSB7Ci0JLnNldF9wb3dlcgkJPSBsY2RfbHRlNDgwd3Zfc2V0X3Bvd2VyLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21ka2MyMTBfbGNkX2x0ZTQ4MHd2ID0gewotCS5uYW1lCQkJPSAicGxhdGZvcm0tbGNkIiwKLQkuZGV2LnBhcmVudAkJPSAmczVwX2RldmljZV9maW1kMC5kZXYsCi0JLmRldi5wbGF0Zm9ybV9kYXRhCT0gJnNtZGtjMjEwX2xjZF9sdGU0ODB3dl9kYXRhLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZmJfcGRfd2luIHNtZGtjMjEwX2ZiX3dpbjAgPSB7Ci0JLndpbl9tb2RlID0gewotCQkubGVmdF9tYXJnaW4JPSAxMywKLQkJLnJpZ2h0X21hcmdpbgk9IDgsCi0JCS51cHBlcl9tYXJnaW4JPSA3LAotCQkubG93ZXJfbWFyZ2luCT0gNSwKLQkJLmhzeW5jX2xlbgk9IDMsCi0JCS52c3luY19sZW4JPSAxLAotCQkueHJlcwkJPSA4MDAsCi0JCS55cmVzCQk9IDQ4MCwKLQl9LAotCS5tYXhfYnBwCQk9IDMyLAotCS5kZWZhdWx0X2JwcAkJPSAyNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhIHNtZGtjMjEwX2xjZDBfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkud2luWzBdCQk9ICZzbWRrYzIxMF9mYl93aW4wLAotCS52aWRjb24wCT0gVklEQ09OMF9WSURPVVRfUkdCIHwgVklEQ09OMF9QTlJNT0RFX1JHQiwKLQkudmlkY29uMQk9IFZJRENPTjFfSU5WX0hTWU5DIHwgVklEQ09OMV9JTlZfVlNZTkMsCi0JLnNldHVwX2dwaW8JPSBleHlub3M0X2ZpbWQwX2dwaW9fc2V0dXBfMjRicHAsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNtZGtjMjEwX3Ntc2M5MTF4X3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TUk9NX0JBTksoMSksCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NST01fQkFOSygxKSArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfRUlOVCg1KSwKLQkJLmVuZAk9IElSUV9FSU5UKDUpLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElSUUZfVFJJR0dFUl9MT1csCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc21zYzkxMXhfcGxhdGZvcm1fY29uZmlnIHNtc2M5MjE1X2NvbmZpZyA9IHsKLQkuaXJxX3BvbGFyaXR5CT0gU01TQzkxMVhfSVJRX1BPTEFSSVRZX0FDVElWRV9MT1csCi0JLmlycV90eXBlCT0gU01TQzkxMVhfSVJRX1RZUEVfUFVTSF9QVUxMLAotCS5mbGFncwkJPSBTTVNDOTExWF9VU0VfMTZCSVQgfCBTTVNDOTExWF9GT1JDRV9JTlRFUk5BTF9QSFksCi0JLnBoeV9pbnRlcmZhY2UJPSBQSFlfSU5URVJGQUNFX01PREVfTUlJLAotCS5tYWMJCT0gezB4MDAsIDB4ODAsIDB4MDAsIDB4MjMsIDB4NDUsIDB4Njd9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21ka2MyMTBfc21zYzkxMXggPSB7Ci0JLm5hbWUJCT0gInNtc2M5MTF4IiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtZGtjMjEwX3Ntc2M5MTF4X3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gc21ka2MyMTBfc21zYzkxMXhfcmVzb3VyY2VzLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZzbXNjOTIxNV9jb25maWcsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjX2RldnMxW10gX19pbml0ZGF0YSA9IHsKLQl7STJDX0JPQVJEX0lORk8oIndtODk5NCIsIDB4MWEpLH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21ka2MyMTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJnMzY19kZXZpY2VfaHNtbWMwLAotCSZzM2NfZGV2aWNlX2hzbW1jMSwKLQkmczNjX2RldmljZV9oc21tYzIsCi0JJnMzY19kZXZpY2VfaHNtbWMzLAotCSZzM2NfZGV2aWNlX2kyYzEsCi0JJnMzY19kZXZpY2VfcnRjLAotCSZzM2NfZGV2aWNlX3dkdCwKLQkmZXh5bm9zNF9kZXZpY2VfYWM5NywKLQkmZXh5bm9zNF9kZXZpY2VfaTJzMCwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXSwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfRzNEXSwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTENEMF0sCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDFdLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9UVl0sCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX0dQU10sCi0JJmV4eW5vczRfZGV2aWNlX3N5c21tdSwKLQkmc2Ftc3VuZ19hc29jX2RtYSwKLQkmczVwX2RldmljZV9maW1kMCwKLQkmc21ka2MyMTBfbGNkX2x0ZTQ4MHd2LAotCSZzbWRrYzIxMF9zbXNjOTExeCwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzbWRrYzIxMF9zbXNjOTExeF9pbml0KHZvaWQpCi17Ci0JdTMyIGNzMTsKLQotCS8qIGNvbmZpZ3VyZSBuQ1MxIHdpZHRoIHRvIDE2IGJpdHMgKi8KLQljczEgPSBfX3Jhd19yZWFkbChTNVBfU1JPTV9CVykgJgotCQl+KFM1UF9TUk9NX0JXX19DU19NQVNLIDw8IFM1UF9TUk9NX0JXX19OQ1MxX19TSElGVCk7Ci0JY3MxIHw9ICgoMSA8PCBTNVBfU1JPTV9CV19fREFUQVdJRFRIX19TSElGVCkgfAotCQkoMSA8PCBTNVBfU1JPTV9CV19fV0FJVEVOQUJMRV9fU0hJRlQpIHwKLQkJKDEgPDwgUzVQX1NST01fQldfX0JZVEVFTkFCTEVfX1NISUZUKSkgPDwKLQkJUzVQX1NST01fQldfX05DUzFfX1NISUZUOwotCV9fcmF3X3dyaXRlbChjczEsIFM1UF9TUk9NX0JXKTsKLQotCS8qIHNldCB0aW1pbmcgZm9yIG5DUzEgc3VpdGFibGUgZm9yIGV0aGVybmV0IGNoaXAgKi8KLQlfX3Jhd193cml0ZWwoKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1BNQ19fU0hJRlQpIHwKLQkJICAgICAoMHg5IDw8IFM1UF9TUk9NX0JDWF9fVEFDUF9fU0hJRlQpIHwKLQkJICAgICAoMHhjIDw8IFM1UF9TUk9NX0JDWF9fVENBSF9fU0hJRlQpIHwKLQkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVENPSF9fU0hJRlQpIHwKLQkJICAgICAoMHg2IDw8IFM1UF9TUk9NX0JDWF9fVEFDQ19fU0hJRlQpIHwKLQkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVENPU19fU0hJRlQpIHwKLQkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVEFDU19fU0hJRlQpLCBTNVBfU1JPTV9CQzEpOwotfQotCi0vKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21ka2MyMTBfYmxfZ3Bpb19pbmZvID0gewotCS5ubyA9IEVYWU5PUzRfR1BEMCgxKSwKLQkuZnVuYyA9IFMzQ19HUElPX1NGTigyKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGtjMjEwX2JsX2RhdGEgPSB7Ci0JLnB3bV9pZCA9IDEsCi0JLnB3bV9wZXJpb2RfbnMgID0gMTAwMCwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzbWRrYzIxMF9tYXBfaW8odm9pZCkKLXsKLQlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKLQlzM2MyNHh4X2luaXRfY2xvY2tzKDI0MDAwMDAwKTsKLQlzM2MyNHh4X2luaXRfdWFydHMoc21ka2MyMTBfdWFydGNmZ3MsIEFSUkFZX1NJWkUoc21ka2MyMTBfdWFydGNmZ3MpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHNtZGtjMjEwX21hY2hpbmVfaW5pdCh2b2lkKQotewotCXMzY19pMmMxX3NldF9wbGF0ZGF0YShOVUxMKTsKLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBpMmNfZGV2czEsIEFSUkFZX1NJWkUoaTJjX2RldnMxKSk7Ci0KLQlzbWRrYzIxMF9zbXNjOTExeF9pbml0KCk7Ci0KLQlzM2Nfc2RoY2kwX3NldF9wbGF0ZGF0YSgmc21ka2MyMTBfaHNtbWMwX3BkYXRhKTsKLQlzM2Nfc2RoY2kxX3NldF9wbGF0ZGF0YSgmc21ka2MyMTBfaHNtbWMxX3BkYXRhKTsKLQlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmc21ka2MyMTBfaHNtbWMyX3BkYXRhKTsKLQlzM2Nfc2RoY2kzX3NldF9wbGF0ZGF0YSgmc21ka2MyMTBfaHNtbWMzX3BkYXRhKTsKLQotCXNhbXN1bmdfYmxfc2V0KCZzbWRrYzIxMF9ibF9ncGlvX2luZm8sICZzbWRrYzIxMF9ibF9kYXRhKTsKLQlzNXBfZmltZDBfc2V0X3BsYXRkYXRhKCZzbWRrYzIxMF9sY2QwX3BkYXRhKTsKLQotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNtZGtjMjEwX2RldmljZXMsIEFSUkFZX1NJWkUoc21ka2MyMTBfZGV2aWNlcykpOwotfQotCi1NQUNISU5FX1NUQVJUKFNNREtDMjEwLCAiU01ES0MyMTAiKQotCS8qIE1haW50YWluZXI6IEt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKLQkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAotCS5tYXBfaW8JCT0gc21ka2MyMTBfbWFwX2lvLAotCS5pbml0X21hY2hpbmUJPSBzbWRrYzIxMF9tYWNoaW5lX2luaXQsCi0JLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGt2MzEwLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrdjMxMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQxNDk1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGt2MzEwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka3YzMTAuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc3JvbS5oPgotI2luY2x1ZGUgPHBsYXQvZXh5bm9zNC5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KLSNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+Ci0jaW5jbHVkZSA8cGxhdC9paWMuaD4KLSNpbmNsdWRlIDxwbGF0L3BkLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgotI2luY2x1ZGUgPHBsYXQvYmFja2xpZ2h0Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0vKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgU01ES1YzMTBfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWElMRVZFTCB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1RYSVJRTU9ERSB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1JYSVJRTU9ERSB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1JYRklGT19UT0kgfAlcCi0JCQkJIFMzQzI0NDNfVUNPTl9SWEVSUl9JUlFFTikKLQotI2RlZmluZSBTTURLVjMxMF9VTENPTl9ERUZBVUxUCVMzQzI0MTBfTENPTl9DUzgKLQotI2RlZmluZSBTTURLVjMxMF9VRkNPTl9ERUZBVUxUCShTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFIHwJXAotCQkJCSBTNVBWMjEwX1VGQ09OX1RYVFJJRzQgfAlcCi0JCQkJIFM1UFYyMTBfVUZDT05fUlhUUklHNCkKLQotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgc21ka3YzMTBfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0gewotCVswXSA9IHsKLQkJLmh3cG9ydAkJPSAwLAotCQkuZmxhZ3MJCT0gMCwKLQkJLnVjb24JCT0gU01ES1YzMTBfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gU01ES1YzMTBfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IFNNREtWMzEwX1VGQ09OX0RFRkFVTFQsCi0JfSwKLQlbMV0gPSB7Ci0JCS5od3BvcnQJCT0gMSwKLQkJLmZsYWdzCQk9IDAsCi0JCS51Y29uCQk9IFNNREtWMzEwX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IFNNREtWMzEwX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBTTURLVjMxMF9VRkNPTl9ERUZBVUxULAotCX0sCi0JWzJdID0gewotCQkuaHdwb3J0CQk9IDIsCi0JCS5mbGFncwkJPSAwLAotCQkudWNvbgkJPSBTTURLVjMxMF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBTTURLVjMxMF9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gU01ES1YzMTBfVUZDT05fREVGQVVMVCwKLQl9LAotCVszXSA9IHsKLQkJLmh3cG9ydAkJPSAzLAotCQkuZmxhZ3MJCT0gMCwKLQkJLnVjb24JCT0gU01ES1YzMTBfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gU01ES1YzMTBfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IFNNREtWMzEwX1VGQ09OX0RFRkFVTFQsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGt2MzEwX2hzbW1jMF9wZGF0YSBfX2luaXRkYXRhID0gewotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9JTlRFUk5BTCwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi0jaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gwXzhCSVQKLQkubWF4X3dpZHRoCQk9IDgsCi0JLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzhfQklUX0RBVEEsCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGt2MzEwX2hzbW1jMV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAotCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQSzAoMiksCi0JLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka3YzMTBfaHNtbWMyX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0lOVEVSTkFMLAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLSNpZmRlZiBDT05GSUdfRVhZTk9TNF9TREhDSV9DSDJfOEJJVAotCS5tYXhfd2lkdGgJCT0gOCwKLQkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfOF9CSVRfREFUQSwKLSNlbmRpZgotfTsKLQotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka3YzMTBfaHNtbWMzX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BLMigyKSwKLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNtZGt2MzEwX3Ntc2M5MTF4X3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TUk9NX0JBTksoMSksCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NST01fQkFOSygxKSArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfRUlOVCg1KSwKLQkJLmVuZAk9IElSUV9FSU5UKDUpLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElSUUZfVFJJR0dFUl9MT1csCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc21zYzkxMXhfcGxhdGZvcm1fY29uZmlnIHNtc2M5MjE1X2NvbmZpZyA9IHsKLQkuaXJxX3BvbGFyaXR5CT0gU01TQzkxMVhfSVJRX1BPTEFSSVRZX0FDVElWRV9MT1csCi0JLmlycV90eXBlCT0gU01TQzkxMVhfSVJRX1RZUEVfUFVTSF9QVUxMLAotCS5mbGFncwkJPSBTTVNDOTExWF9VU0VfMTZCSVQgfCBTTVNDOTExWF9GT1JDRV9JTlRFUk5BTF9QSFksCi0JLnBoeV9pbnRlcmZhY2UJPSBQSFlfSU5URVJGQUNFX01PREVfTUlJLAotCS5tYWMJCT0gezB4MDAsIDB4ODAsIDB4MDAsIDB4MjMsIDB4NDUsIDB4Njd9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21ka3YzMTBfc21zYzkxMXggPSB7Ci0JLm5hbWUJCT0gInNtc2M5MTF4IiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtZGt2MzEwX3Ntc2M5MTF4X3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gc21ka3YzMTBfc21zYzkxMXhfcmVzb3VyY2VzLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZzbXNjOTIxNV9jb25maWcsCi0JfSwKLX07Ci0KLXN0YXRpYyB1aW50MzJfdCBzbWRrdjMxMF9rZXltYXBbXSBfX2luaXRkYXRhID0gewotCS8qIEtFWShyb3csIGNvbCwga2V5Y29kZSkgKi8KLQlLRVkoMCwgMywgS0VZXzEpLCBLRVkoMCwgNCwgS0VZXzIpLCBLRVkoMCwgNSwgS0VZXzMpLAotCUtFWSgwLCA2LCBLRVlfNCksIEtFWSgwLCA3LCBLRVlfNSksCi0JS0VZKDEsIDMsIEtFWV9BKSwgS0VZKDEsIDQsIEtFWV9CKSwgS0VZKDEsIDUsIEtFWV9DKSwKLQlLRVkoMSwgNiwgS0VZX0QpLCBLRVkoMSwgNywgS0VZX0UpCi19OwotCi1zdGF0aWMgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBzbWRrdjMxMF9rZXltYXBfZGF0YSBfX2luaXRkYXRhID0gewotCS5rZXltYXAJCT0gc21ka3YzMTBfa2V5bWFwLAotCS5rZXltYXBfc2l6ZQk9IEFSUkFZX1NJWkUoc21ka3YzMTBfa2V5bWFwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19rZXlwYWRfcGxhdGRhdGEgc21ka3YzMTBfa2V5cGFkX2RhdGEgX19pbml0ZGF0YSA9IHsKLQkua2V5bWFwX2RhdGEJPSAmc21ka3YzMTBfa2V5bWFwX2RhdGEsCi0JLnJvd3MJCT0gMiwKLQkuY29scwkJPSA4LAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfZGV2czFbXSBfX2luaXRkYXRhID0gewotCXtJMkNfQk9BUkRfSU5GTygid204OTk0IiwgMHgxYSksfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbWRrdjMxMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmczNjX2RldmljZV9oc21tYzAsCi0JJnMzY19kZXZpY2VfaHNtbWMxLAotCSZzM2NfZGV2aWNlX2hzbW1jMiwKLQkmczNjX2RldmljZV9oc21tYzMsCi0JJnMzY19kZXZpY2VfaTJjMSwKLQkmczNjX2RldmljZV9ydGMsCi0JJnMzY19kZXZpY2Vfd2R0LAotCSZleHlub3M0X2RldmljZV9hYzk3LAotCSZleHlub3M0X2RldmljZV9pMnMwLAotCSZzYW1zdW5nX2RldmljZV9rZXlwYWQsCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX01GQ10sCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX0czRF0sCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDBdLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9MQ0QxXSwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXSwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9HUFNdLAotCSZleHlub3M0X2RldmljZV9zcGRpZiwKLQkmZXh5bm9zNF9kZXZpY2Vfc3lzbW11LAotCSZzYW1zdW5nX2Fzb2NfZG1hLAotCSZzYW1zdW5nX2Fzb2NfaWRtYSwKLQkmc21ka3YzMTBfc21zYzkxMXgsCi0JJmV4eW5vczRfZGV2aWNlX2FoY2ksCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc21ka3YzMTBfc21zYzkxMXhfaW5pdCh2b2lkKQotewotCXUzMiBjczE7Ci0KLQkvKiBjb25maWd1cmUgbkNTMSB3aWR0aCB0byAxNiBiaXRzICovCi0JY3MxID0gX19yYXdfcmVhZGwoUzVQX1NST01fQlcpICYKLQkJfihTNVBfU1JPTV9CV19fQ1NfTUFTSyA8PCBTNVBfU1JPTV9CV19fTkNTMV9fU0hJRlQpOwotCWNzMSB8PSAoKDEgPDwgUzVQX1NST01fQldfX0RBVEFXSURUSF9fU0hJRlQpIHwKLQkJKDEgPDwgUzVQX1NST01fQldfX1dBSVRFTkFCTEVfX1NISUZUKSB8Ci0JCSgxIDw8IFM1UF9TUk9NX0JXX19CWVRFRU5BQkxFX19TSElGVCkpIDw8Ci0JCVM1UF9TUk9NX0JXX19OQ1MxX19TSElGVDsKLQlfX3Jhd193cml0ZWwoY3MxLCBTNVBfU1JPTV9CVyk7Ci0KLQkvKiBzZXQgdGltaW5nIGZvciBuQ1MxIHN1aXRhYmxlIGZvciBldGhlcm5ldCBjaGlwICovCi0JX19yYXdfd3JpdGVsKCgweDEgPDwgUzVQX1NST01fQkNYX19QTUNfX1NISUZUKSB8Ci0JCSAgICAgKDB4OSA8PCBTNVBfU1JPTV9CQ1hfX1RBQ1BfX1NISUZUKSB8Ci0JCSAgICAgKDB4YyA8PCBTNVBfU1JPTV9CQ1hfX1RDQUhfX1NISUZUKSB8Ci0JCSAgICAgKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1RDT0hfX1NISUZUKSB8Ci0JCSAgICAgKDB4NiA8PCBTNVBfU1JPTV9CQ1hfX1RBQ0NfX1NISUZUKSB8Ci0JCSAgICAgKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1RDT1NfX1NISUZUKSB8Ci0JCSAgICAgKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1RBQ1NfX1NISUZUKSwgUzVQX1NST01fQkMxKTsKLX0KLQotLyogTENEIEJhY2tsaWdodCBkYXRhICovCi1zdGF0aWMgc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvIHNtZGt2MzEwX2JsX2dwaW9faW5mbyA9IHsKLQkubm8gPSBFWFlOT1M0X0dQRDAoMSksCi0JLmZ1bmMgPSBTM0NfR1BJT19TRk4oMiksCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBzbWRrdjMxMF9ibF9kYXRhID0gewotCS5wd21faWQgPSAxLAotCS5wd21fcGVyaW9kX25zICA9IDEwMDAsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc21ka3YzMTBfbWFwX2lvKHZvaWQpCi17Ci0JczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQX1ZBX0NISVBJRCk7Ci0JczNjMjR4eF9pbml0X2Nsb2NrcygyNDAwMDAwMCk7Ci0JczNjMjR4eF9pbml0X3VhcnRzKHNtZGt2MzEwX3VhcnRjZmdzLCBBUlJBWV9TSVpFKHNtZGt2MzEwX3VhcnRjZmdzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzbWRrdjMxMF9tYWNoaW5lX2luaXQodm9pZCkKLXsKLQlzM2NfaTJjMV9zZXRfcGxhdGRhdGEoTlVMTCk7Ci0JaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgaTJjX2RldnMxLCBBUlJBWV9TSVpFKGkyY19kZXZzMSkpOwotCi0Jc21ka3YzMTBfc21zYzkxMXhfaW5pdCgpOwotCi0JczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2hzbW1jMF9wZGF0YSk7Ci0JczNjX3NkaGNpMV9zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2hzbW1jMV9wZGF0YSk7Ci0JczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2hzbW1jMl9wZGF0YSk7Ci0JczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2hzbW1jM19wZGF0YSk7Ci0KLQlzYW1zdW5nX2tleXBhZF9zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2tleXBhZF9kYXRhKTsKLQotCXNhbXN1bmdfYmxfc2V0KCZzbWRrdjMxMF9ibF9ncGlvX2luZm8sICZzbWRrdjMxMF9ibF9kYXRhKTsKLQotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNtZGt2MzEwX2RldmljZXMsIEFSUkFZX1NJWkUoc21ka3YzMTBfZGV2aWNlcykpOwotfQotCi1NQUNISU5FX1NUQVJUKFNNREtWMzEwLCAiU01ES1YzMTAiKQotCS8qIE1haW50YWluZXI6IEt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4gKi8KLQkvKiBNYWludGFpbmVyOiBDaGFuZ2h3YW4gWW91biA8Y2hhb3MueW91bkBzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKLQkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAotCS5tYXBfaW8JCT0gc21ka3YzMTBfbWFwX2lvLAotCS5pbml0X21hY2hpbmUJPSBzbWRrdjMxMF9tYWNoaW5lX2luaXQsCi0JLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXVuaXZlcnNhbF9jMjEwLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC11bml2ZXJzYWxfYzIxMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2I1ZDg5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXVuaXZlcnNhbF9jMjEwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzEgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtdW5pdmVyc2FsX2MyMTAuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5OC5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2ZpeGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21heDg5NTIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL21jcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy9hdG1lbF9teHRfdHMuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPHBsYXQvZXh5bm9zNC5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9tZmMuaD4KLSNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+Ci0jaW5jbHVkZSA8cGxhdC9wZC5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1JYSUxFVkVMIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fVFhJUlFNT0RFIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhJUlFNT0RFIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhGSUZPX1RPSSB8CVwKLQkJCQkgUzNDMjQ0M19VQ09OX1JYRVJSX0lSUUVOKQotCi0jZGVmaW5lIFVOSVZFUlNBTF9VTENPTl9ERUZBVUxUCVMzQzI0MTBfTENPTl9DUzgKLQotI2RlZmluZSBVTklWRVJTQUxfVUZDT05fREVGQVVMVAkoUzNDMjQxMF9VRkNPTl9GSUZPTU9ERSB8CVwKLQkJCQkgUzVQVjIxMF9VRkNPTl9UWFRSSUcyNTYgfAlcCi0JCQkJIFM1UFYyMTBfVUZDT05fUlhUUklHMjU2KQotCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyB1bml2ZXJzYWxfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0gewotCVswXSA9IHsKLQkJLmh3cG9ydAkJPSAwLAotCQkudWNvbgkJPSBVTklWRVJTQUxfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBVTklWRVJTQUxfVUZDT05fREVGQVVMVCwKLQl9LAotCVsxXSA9IHsKLQkJLmh3cG9ydAkJPSAxLAotCQkudWNvbgkJPSBVTklWRVJTQUxfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBVTklWRVJTQUxfVUZDT05fREVGQVVMVCwKLQl9LAotCVsyXSA9IHsKLQkJLmh3cG9ydAkJPSAyLAotCQkudWNvbgkJPSBVTklWRVJTQUxfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBVTklWRVJTQUxfVUZDT05fREVGQVVMVCwKLQl9LAotCVszXSA9IHsKLQkJLmh3cG9ydAkJPSAzLAotCQkudWNvbgkJPSBVTklWRVJTQUxfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBVTklWRVJTQUxfVUZDT05fREVGQVVMVCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG1heDg5NTJfY29uc3VtZXIgPQotCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9hcm0iLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBtYXg4OTUyX3BsYXRmb3JtX2RhdGEgdW5pdmVyc2FsX21heDg5NTJfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuZ3Bpb192aWQwCT0gRVhZTk9TNF9HUFgwKDMpLAotCS5ncGlvX3ZpZDEJPSBFWFlOT1M0X0dQWDAoNCksCi0JLmdwaW9fZW4JPSAtMSwgLyogTm90IGNvbnRyb2xsYWJsZSwgc2V0ICJBbHdheXMgSGlnaCIgKi8KLQkuZGVmYXVsdF9tb2RlCT0gMCwgLyogdmlkMCA9IDAsIHZpZDEgPSAwICovCi0JLmR2c19tb2RlCT0geyA0OCwgMzIsIDI4LCAxOCB9LCAvKiAxLjI1LCAxLjIwLCAxLjA1LCAwLjk1ViAqLwotCS5zeW5jX2ZyZXEJPSAwLCAvKiBkZWZhdWx0OiBmYXN0ZXN0ICovCi0JLnJhbXBfc3BlZWQJPSAwLCAvKiBkZWZhdWx0OiBmYXN0ZXN0ICovCi0KLQkucmVnX2RhdGEJPSB7Ci0JCS5jb25zdHJhaW50cwk9IHsKLQkJCS5uYW1lCQk9ICJWQVJNXzEuMlYiLAotCQkJLm1pbl91VgkJPSA3NzAwMDAsCi0JCQkubWF4X3VWCQk9IDE0MDAwMDAsCi0JCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UsCi0JCQkuYWx3YXlzX29uCT0gMSwKLQkJCS5ib290X29uCT0gMSwKLQkJfSwKLQkJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCi0JCS5jb25zdW1lcl9zdXBwbGllcwk9ICZtYXg4OTUyX2NvbnN1bWVyLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbHAzOTc0X2J1Y2sxX2NvbnN1bWVyID0KLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfaW50IiwgTlVMTCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfYnVjazJfY29uc3VtZXIgPQotCVJFR1VMQVRPUl9TVVBQTFkoInZkZGczZCIsIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2J1Y2sxX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVklOVF8xLjFWIiwKLQkJLm1pbl91VgkJPSA3NTAwMDAsCi0JCS5tYXhfdVYJCT0gMTUwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKLQkJCVJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYm9vdF9vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IDEsCi0JLmNvbnN1bWVyX3N1cHBsaWVzID0gJmxwMzk3NF9idWNrMV9jb25zdW1lciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfYnVjazJfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWRzNEXzEuMVYiLAotCQkubWluX3VWCQk9IDc1MDAwMCwKLQkJLm1heF91VgkJPSAxNTAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAotCQkJUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5ib290X29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgPSAmbHAzOTc0X2J1Y2syX2NvbnN1bWVyLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9idWNrM19kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZDQ18xLjhWIiwKLQkJLm1pbl91VgkJPSAxODAwMDAwLAotCQkubWF4X3VWCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5hbHdheXNfb24JPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmVuYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2J1Y2s0X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVk1FTV8xLjJWIiwKLQkJLm1pbl91VgkJPSAxMjAwMDAwLAotCQkubWF4X3VWCQk9IDEyMDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8yX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkFMSVZFXzEuMlYiLAotCQkubWluX3VWCQk9IDEyMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTIwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZW5hYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvM19kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZVU0IrTUlQSV8xLjFWIiwKLQkJLm1pbl91VgkJPSAxMTAwMDAwLAotCQkubWF4X3VWCQk9IDExMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG80X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkFEQ18zLjNWIiwKLQkJLm1pbl91VgkJPSAzMzAwMDAwLAotCQkubWF4X3VWCQk9IDMzMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG81X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVlRGXzIuOFYiLAotCQkubWluX3VWCQk9IDI4MDAwMDAsCi0JCS5tYXhfdVYJCT0gMjgwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzZfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJMRE82IiwKLQkJLm1pbl91VgkJPSAyMDAwMDAwLAotCQkubWF4X3VWCQk9IDIwMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG83X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkxDRCtWTUlQSV8xLjhWIiwKLQkJLm1pbl91VgkJPSAxODAwMDAwLAotCQkubWF4X3VWCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG84X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVlVTQitWREFDXzMuM1YiLAotCQkubWluX3VWCQk9IDMzMDAwMDAsCi0JCS5tYXhfdVYJCT0gMzMwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzlfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQ0NfMi44ViIsCi0JCS5taW5fdVYJCT0gMjgwMDAwMCwKLQkJLm1heF91VgkJPSAyODAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuYWx3YXlzX29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5lbmFibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xMF9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZQTExfMS4xViIsCi0JCS5taW5fdVYJCT0gMTEwMDAwMCwKLQkJLm1heF91VgkJPSAxMTAwMDAwLAotCQkuYm9vdF9vbgk9IDEsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xMV9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIkNBTV9BRl8zLjNWIiwKLQkJLm1pbl91VgkJPSAzMzAwMDAwLAotCQkubWF4X3VWCQk9IDMzMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xMl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlBTXzIuOFYiLAotCQkubWluX3VWCQk9IDI4MDAwMDAsCi0JCS5tYXhfdVYJCT0gMjgwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzEzX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkhJQ18xLjJWIiwKLQkJLm1pbl91VgkJPSAxMjAwMDAwLAotCQkubWF4X3VWCQk9IDEyMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xNF9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIkNBTV9JX0hPU1RfMS44ViIsCi0JCS5taW5fdVYJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJPSAxODAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvMTVfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJDQU1fU19ESUcrRk0zM19DT1JFXzEuMlYiLAotCQkubWluX3VWCQk9IDEyMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTIwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzE2X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiQ0FNX1NfQU5BXzIuOFYiLAotCQkubWluX3VWCQk9IDI4MDAwMDAsCi0JCS5tYXhfdVYJCT0gMjgwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzE3X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkNDXzMuMFZfTENEIiwKLQkJLm1pbl91VgkJPSAzMDAwMDAwLAotCQkubWF4X3VWCQk9IDMwMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYm9vdF9vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0XzMya2h6X2FwX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiMzJLSHogQVAiLAotCQkuYWx3YXlzX29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5lbmFibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF8zMmtoel9jcF9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIjMyS0h6IENQIiwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfdmljaGdfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWSUNIRyIsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2VzYWZlb3V0MV9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlNBRkVPVVQxIiwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZW5hYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfZXNhZmVvdXQyX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiU0FGRU9VVDIiLAotCQkuYm9vdF9vbgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmVuYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1heDg5OThfcmVndWxhdG9yX2RhdGEgbHAzOTc0X3JlZ3VsYXRvcnNbXSA9IHsKLQl7IE1BWDg5OThfTERPMiwgICZscDM5NzRfbGRvMl9kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzMsICAmbHAzOTc0X2xkbzNfZGF0YSB9LAotCXsgTUFYODk5OF9MRE80LCAgJmxwMzk3NF9sZG80X2RhdGEgfSwKLQl7IE1BWDg5OThfTERPNSwgICZscDM5NzRfbGRvNV9kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzYsICAmbHAzOTc0X2xkbzZfZGF0YSB9LAotCXsgTUFYODk5OF9MRE83LCAgJmxwMzk3NF9sZG83X2RhdGEgfSwKLQl7IE1BWDg5OThfTERPOCwgICZscDM5NzRfbGRvOF9kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzksICAmbHAzOTc0X2xkbzlfZGF0YSB9LAotCXsgTUFYODk5OF9MRE8xMCwgJmxwMzk3NF9sZG8xMF9kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzExLCAmbHAzOTc0X2xkbzExX2RhdGEgfSwKLQl7IE1BWDg5OThfTERPMTIsICZscDM5NzRfbGRvMTJfZGF0YSB9LAotCXsgTUFYODk5OF9MRE8xMywgJmxwMzk3NF9sZG8xM19kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzE0LCAmbHAzOTc0X2xkbzE0X2RhdGEgfSwKLQl7IE1BWDg5OThfTERPMTUsICZscDM5NzRfbGRvMTVfZGF0YSB9LAotCXsgTUFYODk5OF9MRE8xNiwgJmxwMzk3NF9sZG8xNl9kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzE3LCAmbHAzOTc0X2xkbzE3X2RhdGEgfSwKLQl7IE1BWDg5OThfQlVDSzEsICZscDM5NzRfYnVjazFfZGF0YSB9LAotCXsgTUFYODk5OF9CVUNLMiwgJmxwMzk3NF9idWNrMl9kYXRhIH0sCi0JeyBNQVg4OTk4X0JVQ0szLCAmbHAzOTc0X2J1Y2szX2RhdGEgfSwKLQl7IE1BWDg5OThfQlVDSzQsICZscDM5NzRfYnVjazRfZGF0YSB9LAotCXsgTUFYODk5OF9FTjMyS0haX0FQLCAmbHAzOTc0XzMya2h6X2FwX2RhdGEgfSwKLQl7IE1BWDg5OThfRU4zMktIWl9DUCwgJmxwMzk3NF8zMmtoel9jcF9kYXRhIH0sCi0JeyBNQVg4OTk4X0VOVklDSEcsICZscDM5NzRfdmljaGdfZGF0YSB9LAotCXsgTUFYODk5OF9FU0FGRU9VVDEsICZscDM5NzRfZXNhZmVvdXQxX2RhdGEgfSwKLQl7IE1BWDg5OThfRVNBRkVPVVQyLCAmbHAzOTc0X2VzYWZlb3V0Ml9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1heDg5OThfcGxhdGZvcm1fZGF0YSB1bml2ZXJzYWxfbHAzOTc0X3BkYXRhID0gewotCS5udW1fcmVndWxhdG9ycwkJPSBBUlJBWV9TSVpFKGxwMzk3NF9yZWd1bGF0b3JzKSwKLQkucmVndWxhdG9ycwkJPSBscDM5NzRfcmVndWxhdG9ycywKLQkuYnVjazFfdm9sdGFnZTEJCT0gMTEwMDAwMCwJLyogSU5UICovCi0JLmJ1Y2sxX3ZvbHRhZ2UyCQk9IDEwMDAwMDAsCi0JLmJ1Y2sxX3ZvbHRhZ2UzCQk9IDExMDAwMDAsCi0JLmJ1Y2sxX3ZvbHRhZ2U0CQk9IDEwMDAwMDAsCi0JLmJ1Y2sxX3NldDEJCT0gRVhZTk9TNF9HUFgwKDUpLAotCS5idWNrMV9zZXQyCQk9IEVYWU5PUzRfR1BYMCg2KSwKLQkuYnVjazJfdm9sdGFnZTEJCT0gMTIwMDAwMCwJLyogRzNEICovCi0JLmJ1Y2syX3ZvbHRhZ2UyCQk9IDExMDAwMDAsCi0JLmJ1Y2sxX2RlZmF1bHRfaWR4CT0gMCwKLQkuYnVjazJfc2V0MwkJPSBFWFlOT1M0X0dQRTIoMCksCi0JLmJ1Y2syX2RlZmF1bHRfaWR4CT0gMCwKLQkud2FrZXVwCQkJPSB0cnVlLAotfTsKLQotLyogR1BJTyBJMkMgNSAoUE1JQykgKi8KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjNV9kZXZzW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJtYXg4OTUyIiwgMHhDMCA+PiAxKSwKLQkJLnBsYXRmb3JtX2RhdGEJPSAmdW5pdmVyc2FsX21heDg5NTJfcGRhdGEsCi0JfSwgewotCQlJMkNfQk9BUkRfSU5GTygibHAzOTc0IiwgMHhDQyA+PiAxKSwKLQkJLnBsYXRmb3JtX2RhdGEJPSAmdW5pdmVyc2FsX2xwMzk3NF9wZGF0YSwKLQl9LAotfTsKLQotLyogSTJDMyAoVFNQKSAqLwotc3RhdGljIHN0cnVjdCBteHRfcGxhdGZvcm1fZGF0YSBxdDYwMjI0MF9wbGF0Zm9ybV9kYXRhID0gewotCS54X2xpbmUJCT0gMTksCi0JLnlfbGluZQkJPSAxMSwKLQkueF9zaXplCQk9IDgwMCwKLQkueV9zaXplCQk9IDQ4MCwKLQkuYmxlbgkJPSAweDExLAotCS50aHJlc2hvbGQJPSAweDI4LAotCS52b2x0YWdlCT0gMjgwMDAwMCwJCS8qIDIuOFYgKi8KLQkub3JpZW50CQk9IE1YVF9ESUFHT05BTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjM19kZXZzW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJxdDYwMjI0MF90cyIsIDB4NGEpLAotCQkucGxhdGZvcm1fZGF0YSA9ICZxdDYwMjI0MF9wbGF0Zm9ybV9kYXRhLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgdW5pdmVyc2FsX3RzcF9pbml0KHZvaWQpCi17Ci0JaW50IGdwaW87Ci0KLQkvKiBUU1BfTERPX09OOiBYTURNQUREUl8xMSAqLwotCWdwaW8gPSBFWFlOT1M0X0dQRTIoMyk7Ci0JZ3Bpb19yZXF1ZXN0KGdwaW8sICJUU1BfTERPX09OIik7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDEpOwotCWdwaW9fZXhwb3J0KGdwaW8sIDApOwotCi0JLyogVFNQX0lOVDogWE1ETUFERFJfNyAqLwotCWdwaW8gPSBFWFlOT1M0X0dQRTEoNyk7Ci0JZ3Bpb19yZXF1ZXN0KGdwaW8sICJUU1BfSU5UIik7Ci0KLQlzNXBfcmVnaXN0ZXJfZ3Bpb19pbnRlcnJ1cHQoZ3Bpbyk7Ci0JczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigweGYpKTsKLQlzM2NfZ3Bpb19zZXRwdWxsKGdwaW8sIFMzQ19HUElPX1BVTExfVVApOwotCWkyYzNfZGV2c1swXS5pcnEgPSBncGlvX3RvX2lycShncGlvKTsKLX0KLQotCi0vKiBHUElPIEkyQyAxMiAoMyBUb3VjaGtleSkgKi8KLXN0YXRpYyB1aW50MzJfdCB0b3VjaGtleV9rZXltYXBbXSA9IHsKLQkvKiBNQ1NfS0VZX01BUCh2YWx1ZSwga2V5Y29kZSkgKi8KLQlNQ1NfS0VZX01BUCgwLCBLRVlfTUVOVSksCQkvKiBLRVlfU0VORCAqLwotCU1DU19LRVlfTUFQKDEsIEtFWV9CQUNLKSwJCS8qIEtFWV9FTkQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWNzX3BsYXRmb3JtX2RhdGEgdG91Y2hrZXlfZGF0YSA9IHsKLQkua2V5bWFwCQk9IHRvdWNoa2V5X2tleW1hcCwKLQkua2V5bWFwX3NpemUJPSBBUlJBWV9TSVpFKHRvdWNoa2V5X2tleW1hcCksCi0JLmtleV9tYXh2YWwJPSAyLAotfTsKLQotLyogR1BJTyBJMkMgM19UT1VDSCAyLjhWICovCi0jZGVmaW5lIEkyQ19HUElPX0JVU18xMgkJMTIKLXN0YXRpYyBzdHJ1Y3QgaTJjX2dwaW9fcGxhdGZvcm1fZGF0YSBpMmNfZ3BpbzEyX2RhdGEgPSB7Ci0JLnNkYV9waW4JPSBFWFlOT1M0X0dQRTQoMCksCS8qIFhNRE1EQVRBXzggKi8KLQkuc2NsX3Bpbgk9IEVYWU5PUzRfR1BFNCgxKSwJLyogWE1ETURBVEFfOSAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJjX2dwaW8xMiA9IHsKLQkubmFtZQkJPSAiaTJjLWdwaW8iLAotCS5pZAkJPSBJMkNfR1BJT19CVVNfMTIsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmkyY19ncGlvMTJfZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfZ3BpbzEyX2RldnNbXSBfX2luaXRkYXRhID0gewotCXsKLQkJSTJDX0JPQVJEX0lORk8oIm1jczUwODBfdG91Y2hrZXkiLCAweDIwKSwKLQkJLnBsYXRmb3JtX2RhdGEgPSAmdG91Y2hrZXlfZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF90b3VjaGtleV9pbml0KHZvaWQpCi17Ci0JaW50IGdwaW87Ci0KLQlncGlvID0gRVhZTk9TNF9HUEUzKDcpOwkJCS8qIFhNRE1EQVRBXzcgKi8KLQlncGlvX3JlcXVlc3QoZ3BpbywgIjNfVE9VQ0hfSU5UIik7Ci0JczVwX3JlZ2lzdGVyX2dwaW9faW50ZXJydXB0KGdwaW8pOwotCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMHhmKSk7Ci0JaTJjX2dwaW8xMl9kZXZzWzBdLmlycSA9IGdwaW9fdG9faXJxKGdwaW8pOwotCi0JZ3BpbyA9IEVYWU5PUzRfR1BFMygzKTsJCQkvKiBYTURNREFUQV8zICovCi0JZ3Bpb19yZXF1ZXN0KGdwaW8sICIzX1RPVUNIX0VOIik7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDEpOwotfQotCi0vKiBHUElPIEtFWVMgKi8KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiB1bml2ZXJzYWxfZ3Bpb19rZXlzX3RhYmxlc1tdID0gewotCXsKLQkJLmNvZGUJCQk9IEtFWV9WT0xVTUVVUCwKLQkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigwKSwJLyogWEVJTlQxNiAqLwotCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX1ZPTFVNRVVQIiwKLQkJLnR5cGUJCQk9IEVWX0tFWSwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmRlYm91bmNlX2ludGVydmFsCT0gMSwKLQl9LCB7Ci0JCS5jb2RlCQkJPSBLRVlfVk9MVU1FRE9XTiwKLQkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigxKSwJLyogWEVJTlQxNyAqLwotCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX1ZPTFVNRURPV04iLAotCQkudHlwZQkJCT0gRVZfS0VZLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAotCX0sIHsKLQkJLmNvZGUJCQk9IEtFWV9DT05GSUcsCi0JCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDIoMiksCS8qIFhFSU5UMTggKi8KLQkJLmRlc2MJCQk9ICJncGlvLWtleXM6IEtFWV9DT05GSUciLAotCQkudHlwZQkJCT0gRVZfS0VZLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAotCX0sIHsKLQkJLmNvZGUJCQk9IEtFWV9DQU1FUkEsCi0JCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDIoMyksCS8qIFhFSU5UMTkgKi8KLQkJLmRlc2MJCQk9ICJncGlvLWtleXM6IEtFWV9DQU1FUkEiLAotCQkudHlwZQkJCT0gRVZfS0VZLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAotCX0sIHsKLQkJLmNvZGUJCQk9IEtFWV9PSywKLQkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMyg1KSwJLyogWEVJTlQyOSAqLwotCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX09LIiwKLQkJLnR5cGUJCQk9IEVWX0tFWSwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmRlYm91bmNlX2ludGVydmFsCT0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSB1bml2ZXJzYWxfZ3Bpb19rZXlzX2RhdGEgPSB7Ci0JLmJ1dHRvbnMJPSB1bml2ZXJzYWxfZ3Bpb19rZXlzX3RhYmxlcywKLQkubmJ1dHRvbnMJPSBBUlJBWV9TSVpFKHVuaXZlcnNhbF9ncGlvX2tleXNfdGFibGVzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHVuaXZlcnNhbF9ncGlvX2tleXMgPSB7Ci0JLm5hbWUJCQk9ICJncGlvLWtleXMiLAotCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmdW5pdmVyc2FsX2dwaW9fa2V5c19kYXRhLAotCX0sCi19OwotCi0vKiBlTU1DICovCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSB1bml2ZXJzYWxfaHNtbWMwX2RhdGEgX19pbml0ZGF0YSA9IHsKLQkubWF4X3dpZHRoCQk9IDgsCi0JLmhvc3RfY2FwcwkJPSAoTU1DX0NBUF84X0JJVF9EQVRBIHwgTU1DX0NBUF80X0JJVF9EQVRBIHwKLQkJCQlNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8Ci0JCQkJTU1DX0NBUF9ESVNBQkxFKSwKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfUEVSTUFORU5ULAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBtbWMwX3N1cHBsaWVzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJzM2Mtc2RoY2kuMCIpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG1tYzBfZml4ZWRfdm9sdGFnZV9pbml0X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCQk9IHsKLQkJLm5hbWUJCT0gIlZNRU1fVkREXzIuOFYiLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1tYzBfc3VwcGxpZXMpLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1tYzBfc3VwcGxpZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIG1tYzBfZml4ZWRfdm9sdGFnZV9jb25maWcgPSB7Ci0JLnN1cHBseV9uYW1lCQk9ICJNQVNTTUVNT1JZX0VOIiwKLQkubWljcm92b2x0cwkJPSAyODAwMDAwLAotCS5ncGlvCQkJPSBFWFlOT1M0X0dQRTEoMyksCi0JLmVuYWJsZV9oaWdoCQk9IHRydWUsCi0JLmluaXRfZGF0YQkJPSAmbW1jMF9maXhlZF92b2x0YWdlX2luaXRfZGF0YSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1tYzBfZml4ZWRfdm9sdGFnZSA9IHsKLQkubmFtZQkJCT0gInJlZy1maXhlZC12b2x0YWdlIiwKLQkuaWQJCQk9IDAsCi0JLmRldgkJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZtbWMwX2ZpeGVkX3ZvbHRhZ2VfY29uZmlnLAotCX0sCi19OwotCi0vKiBTRCAqLwotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgdW5pdmVyc2FsX2hzbW1jMl9kYXRhIF9faW5pdGRhdGEgPSB7Ci0JLm1heF93aWR0aAkJPSA0LAotCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF80X0JJVF9EQVRBIHwKLQkJCQlNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8Ci0JCQkJTU1DX0NBUF9ESVNBQkxFLAotCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQWDMoNCksICAgICAgLyogWEVJTlRfMjggKi8KLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi19OwotCi0vKiBXaUZpICovCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSB1bml2ZXJzYWxfaHNtbWMzX2RhdGEgX19pbml0ZGF0YSA9IHsKLQkubWF4X3dpZHRoCQk9IDQsCi0JLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzRfQklUX0RBVEEgfAotCQkJCU1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwKLQkJCQlNTUNfQ0FQX0RJU0FCTEUsCi0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0VYVEVSTkFMLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF9zZGhjaV9pbml0KHZvaWQpCi17Ci0JczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoJnVuaXZlcnNhbF9oc21tYzBfZGF0YSk7Ci0JczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJnVuaXZlcnNhbF9oc21tYzJfZGF0YSk7Ci0JczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoJnVuaXZlcnNhbF9oc21tYzNfZGF0YSk7Ci19Ci0KLS8qIEkyQzAgKi8KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjMF9kZXZzW10gX19pbml0ZGF0YSA9IHsKLQkvKiBDYW1lcmEsIFRvIGJlIHVwZGF0ZWQgKi8KLX07Ci0KLS8qIEkyQzEgKi8KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjMV9kZXZzW10gX19pbml0ZGF0YSA9IHsKLQkvKiBHeXJvLCBUbyBiZSB1cGRhdGVkICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdW5pdmVyc2FsX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCS8qIFNhbXN1bmcgUGxhdGZvcm0gRGV2aWNlcyAqLwotCSZzNXBfZGV2aWNlX2ZpbWMwLAotCSZzNXBfZGV2aWNlX2ZpbWMxLAotCSZzNXBfZGV2aWNlX2ZpbWMyLAotCSZzNXBfZGV2aWNlX2ZpbWMzLAotCSZtbWMwX2ZpeGVkX3ZvbHRhZ2UsCi0JJnMzY19kZXZpY2VfaHNtbWMwLAotCSZzM2NfZGV2aWNlX2hzbW1jMiwKLQkmczNjX2RldmljZV9oc21tYzMsCi0JJnMzY19kZXZpY2VfaTJjMywKLQkmczNjX2RldmljZV9pMmM1LAotCi0JLyogVW5pdmVyc2FsIERldmljZXMgKi8KLQkmaTJjX2dwaW8xMiwKLQkmdW5pdmVyc2FsX2dwaW9fa2V5cywKLQkmczVwX2RldmljZV9vbmVuYW5kLAotCSZzNXBfZGV2aWNlX21mYywKLQkmczVwX2RldmljZV9tZmNfbCwKLQkmczVwX2RldmljZV9tZmNfciwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB1bml2ZXJzYWxfbWFwX2lvKHZvaWQpCi17Ci0JczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQX1ZBX0NISVBJRCk7Ci0JczNjMjR4eF9pbml0X2Nsb2NrcygyNDAwMDAwMCk7Ci0JczNjMjR4eF9pbml0X3VhcnRzKHVuaXZlcnNhbF91YXJ0Y2ZncywgQVJSQVlfU0laRSh1bml2ZXJzYWxfdWFydGNmZ3MpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF9yZXNlcnZlKHZvaWQpCi17Ci0JczVwX21mY19yZXNlcnZlX21lbSgweDQzMDAwMDAwLCA4IDw8IDIwLCAweDUxMDAwMDAwLCA4IDw8IDIwKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF9tYWNoaW5lX2luaXQodm9pZCkKLXsKLQl1bml2ZXJzYWxfc2RoY2lfaW5pdCgpOwotCi0JaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgaTJjMF9kZXZzLCBBUlJBWV9TSVpFKGkyYzBfZGV2cykpOwotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIGkyYzFfZGV2cywgQVJSQVlfU0laRShpMmMxX2RldnMpKTsKLQotCXVuaXZlcnNhbF90c3BfaW5pdCgpOwotCXMzY19pMmMzX3NldF9wbGF0ZGF0YShOVUxMKTsKLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygzLCBpMmMzX2RldnMsIEFSUkFZX1NJWkUoaTJjM19kZXZzKSk7Ci0KLQlzM2NfaTJjNV9zZXRfcGxhdGRhdGEoTlVMTCk7Ci0JaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oNSwgaTJjNV9kZXZzLCBBUlJBWV9TSVpFKGkyYzVfZGV2cykpOwotCi0JdW5pdmVyc2FsX3RvdWNoa2V5X2luaXQoKTsKLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbyhJMkNfR1BJT19CVVNfMTIsIGkyY19ncGlvMTJfZGV2cywKLQkJCUFSUkFZX1NJWkUoaTJjX2dwaW8xMl9kZXZzKSk7Ci0KLQkvKiBMYXN0ICovCi0JcGxhdGZvcm1fYWRkX2RldmljZXModW5pdmVyc2FsX2RldmljZXMsIEFSUkFZX1NJWkUodW5pdmVyc2FsX2RldmljZXMpKTsKLQlzNXBfZGV2aWNlX21mYy5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX01GQ10uZGV2OwotfQotCi1NQUNISU5FX1NUQVJUKFVOSVZFUlNBTF9DMjEwLCAiVU5JVkVSU0FMX0MyMTAiKQotCS8qIE1haW50YWluZXI6IEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzVQX1BBX1NEUkFNICsgMHgxMDAsCi0JLmluaXRfaXJxCT0gZXh5bm9zNF9pbml0X2lycSwKLQkubWFwX2lvCQk9IHVuaXZlcnNhbF9tYXBfaW8sCi0JLmluaXRfbWFjaGluZQk9IHVuaXZlcnNhbF9tYWNoaW5lX2luaXQsCi0JLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAotCS5yZXNlcnZlICAgICAgICA9ICZ1bml2ZXJzYWxfcmVzZXJ2ZSwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWN0LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDg2ODYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21jdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tY3QuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0IE1DVChNdWx0aS1Db3JlIFRpbWVyKSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtbWN0Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfY250X3Blcl90aWNrOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX3JhdGU7Ci0KLXN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlIHsKLQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQ7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotfTsKLQotc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgbWN0X3RpY2tbMl07Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfbWN0X3dyaXRlKHVuc2lnbmVkIGludCB2YWx1ZSwgdm9pZCAqYWRkcikKLXsKLQl2b2lkIF9faW9tZW0gKnN0YXRfYWRkcjsKLQl1MzIgbWFzazsKLQl1MzIgaTsKLQotCV9fcmF3X3dyaXRlbCh2YWx1ZSwgYWRkcik7Ci0KLQlzd2l0Y2ggKCh1MzIpIGFkZHIpIHsKLQljYXNlICh1MzIpIEVYWU5PUzRfTUNUX0dfVENPTjoKLQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfR19XU1RBVDsKLQkJbWFzayA9IDEgPDwgMTY7CQkvKiBHX1RDT04gd3JpdGUgc3RhdHVzICovCi0JCWJyZWFrOwotCWNhc2UgKHUzMikgRVhZTk9TNF9NQ1RfR19DT01QMF9MOgotCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9HX1dTVEFUOwotCQltYXNrID0gMSA8PCAwOwkJLyogR19DT01QMF9MIHdyaXRlIHN0YXR1cyAqLwotCQlicmVhazsKLQljYXNlICh1MzIpIEVYWU5PUzRfTUNUX0dfQ09NUDBfVToKLQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfR19XU1RBVDsKLQkJbWFzayA9IDEgPDwgMTsJCS8qIEdfQ09NUDBfVSB3cml0ZSBzdGF0dXMgKi8KLQkJYnJlYWs7Ci0JY2FzZSAodTMyKSBFWFlOT1M0X01DVF9HX0NPTVAwX0FERF9JTkNSOgotCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9HX1dTVEFUOwotCQltYXNrID0gMSA8PCAyOwkJLyogR19DT01QMF9BRERfSU5DUiB3cml0ZSBzdGF0dXMgKi8KLQkJYnJlYWs7Ci0JY2FzZSAodTMyKSBFWFlOT1M0X01DVF9HX0NOVF9MOgotCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9HX0NOVF9XU1RBVDsKLQkJbWFzayA9IDEgPDwgMDsJCS8qIEdfQ05UX0wgd3JpdGUgc3RhdHVzICovCi0JCWJyZWFrOwotCWNhc2UgKHUzMikgRVhZTk9TNF9NQ1RfR19DTlRfVToKLQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfR19DTlRfV1NUQVQ7Ci0JCW1hc2sgPSAxIDw8IDE7CQkvKiBHX0NOVF9VIHdyaXRlIHN0YXR1cyAqLwotCQlicmVhazsKLQljYXNlICh1MzIpKEVYWU5PUzRfTUNUX0wwX0JBU0UgKyBNQ1RfTF9UQ09OX09GRlNFVCk6Ci0JCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0wwX0JBU0UgKyBNQ1RfTF9XU1RBVF9PRkZTRVQ7Ci0JCW1hc2sgPSAxIDw8IDM7CQkvKiBMMF9UQ09OIHdyaXRlIHN0YXR1cyAqLwotCQlicmVhazsKLQljYXNlICh1MzIpKEVYWU5PUzRfTUNUX0wxX0JBU0UgKyBNQ1RfTF9UQ09OX09GRlNFVCk6Ci0JCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0wxX0JBU0UgKyBNQ1RfTF9XU1RBVF9PRkZTRVQ7Ci0JCW1hc2sgPSAxIDw8IDM7CQkvKiBMMV9UQ09OIHdyaXRlIHN0YXR1cyAqLwotCQlicmVhazsKLQljYXNlICh1MzIpKEVYWU5PUzRfTUNUX0wwX0JBU0UgKyBNQ1RfTF9UQ05UQl9PRkZTRVQpOgotCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9MMF9CQVNFICsgTUNUX0xfV1NUQVRfT0ZGU0VUOwotCQltYXNrID0gMSA8PCAwOwkJLyogTDBfVENOVEIgd3JpdGUgc3RhdHVzICovCi0JCWJyZWFrOwotCWNhc2UgKHUzMikoRVhZTk9TNF9NQ1RfTDFfQkFTRSArIE1DVF9MX1RDTlRCX09GRlNFVCk6Ci0JCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0wxX0JBU0UgKyBNQ1RfTF9XU1RBVF9PRkZTRVQ7Ci0JCW1hc2sgPSAxIDw8IDA7CQkvKiBMMV9UQ05UQiB3cml0ZSBzdGF0dXMgKi8KLQkJYnJlYWs7Ci0JY2FzZSAodTMyKShFWFlOT1M0X01DVF9MMF9CQVNFICsgTUNUX0xfSUNOVEJfT0ZGU0VUKToKLQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfTDBfQkFTRSArIE1DVF9MX1dTVEFUX09GRlNFVDsKLQkJbWFzayA9IDEgPDwgMTsJCS8qIEwwX0lDTlRCIHdyaXRlIHN0YXR1cyAqLwotCQlicmVhazsKLQljYXNlICh1MzIpKEVYWU5PUzRfTUNUX0wxX0JBU0UgKyBNQ1RfTF9JQ05UQl9PRkZTRVQpOgotCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9MMV9CQVNFICsgTUNUX0xfV1NUQVRfT0ZGU0VUOwotCQltYXNrID0gMSA8PCAxOwkJLyogTDFfSUNOVEIgd3JpdGUgc3RhdHVzICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBXYWl0IG1heGltdW0gMSBtcyB1bnRpbCB3cml0dGVuIHZhbHVlcyBhcmUgYXBwbGllZCAqLwotCWZvciAoaSA9IDA7IGkgPCBsb29wc19wZXJfamlmZnkgLyAxMDAwICogSFo7IGkrKykKLQkJaWYgKF9fcmF3X3JlYWRsKHN0YXRfYWRkcikgJiBtYXNrKSB7Ci0JCQlfX3Jhd193cml0ZWwobWFzaywgc3RhdF9hZGRyKTsKLQkJCXJldHVybjsKLQkJfQotCi0JcGFuaWMoIk1DVCBoYW5ncyBhZnRlciB3cml0aW5nICVkIChhZGRyOjB4JTA4eClcbiIsIHZhbHVlLCAodTMyKWFkZHIpOwotfQotCi0vKiBDbG9ja3NvdXJjZSBoYW5kbGluZyAqLwotc3RhdGljIHZvaWQgZXh5bm9zNF9tY3RfZnJjX3N0YXJ0KHUzMiBoaSwgdTMyIGxvKQotewotCXUzMiByZWc7Ci0KLQlleHlub3M0X21jdF93cml0ZShsbywgRVhZTk9TNF9NQ1RfR19DTlRfTCk7Ci0JZXh5bm9zNF9tY3Rfd3JpdGUoaGksIEVYWU5PUzRfTUNUX0dfQ05UX1UpOwotCi0JcmVnID0gX19yYXdfcmVhZGwoRVhZTk9TNF9NQ1RfR19UQ09OKTsKLQlyZWcgfD0gTUNUX0dfVENPTl9TVEFSVDsKLQlleHlub3M0X21jdF93cml0ZShyZWcsIEVYWU5PUzRfTUNUX0dfVENPTik7Ci19Ci0KLXN0YXRpYyBjeWNsZV90IGV4eW5vczRfZnJjX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKLXsKLQl1bnNpZ25lZCBpbnQgbG8sIGhpOwotCXUzMiBoaTIgPSBfX3Jhd19yZWFkbChFWFlOT1M0X01DVF9HX0NOVF9VKTsKLQotCWRvIHsKLQkJaGkgPSBoaTI7Ci0JCWxvID0gX19yYXdfcmVhZGwoRVhZTk9TNF9NQ1RfR19DTlRfTCk7Ci0JCWhpMiA9IF9fcmF3X3JlYWRsKEVYWU5PUzRfTUNUX0dfQ05UX1UpOwotCX0gd2hpbGUgKGhpICE9IGhpMik7Ci0KLQlyZXR1cm4gKChjeWNsZV90KWhpIDw8IDMyKSB8IGxvOwotfQotCi1zdGF0aWMgdm9pZCBleHlub3M0X2ZyY19yZXN1bWUoc3RydWN0IGNsb2Nrc291cmNlICpjcykKLXsKLQlleHlub3M0X21jdF9mcmNfc3RhcnQoMCwgMCk7Ci19Ci0KLXN0cnVjdCBjbG9ja3NvdXJjZSBtY3RfZnJjID0gewotCS5uYW1lCQk9ICJtY3QtZnJjIiwKLQkucmF0aW5nCQk9IDQwMCwKLQkucmVhZAkJPSBleHlub3M0X2ZyY19yZWFkLAotCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAotCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKLQkucmVzdW1lCQk9IGV4eW5vczRfZnJjX3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M0X2Nsb2Nrc291cmNlX2luaXQodm9pZCkKLXsKLQlleHlub3M0X21jdF9mcmNfc3RhcnQoMCwgMCk7Ci0KLQlpZiAoY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJm1jdF9mcmMsIGNsa19yYXRlKSkKLQkJcGFuaWMoIiVzOiBjYW4ndCByZWdpc3RlciBjbG9ja3NvdXJjZVxuIiwgbWN0X2ZyYy5uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgZXh5bm9zNF9tY3RfY29tcDBfc3RvcCh2b2lkKQotewotCXVuc2lnbmVkIGludCB0Y29uOwotCi0JdGNvbiA9IF9fcmF3X3JlYWRsKEVYWU5PUzRfTUNUX0dfVENPTik7Ci0JdGNvbiAmPSB+KE1DVF9HX1RDT05fQ09NUDBfRU5BQkxFIHwgTUNUX0dfVENPTl9DT01QMF9BVVRPX0lOQyk7Ci0KLQlleHlub3M0X21jdF93cml0ZSh0Y29uLCBFWFlOT1M0X01DVF9HX1RDT04pOwotCWV4eW5vczRfbWN0X3dyaXRlKDAsIEVYWU5PUzRfTUNUX0dfSU5UX0VOQik7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfbWN0X2NvbXAwX3N0YXJ0KGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGN5Y2xlcykKLXsKLQl1bnNpZ25lZCBpbnQgdGNvbjsKLQljeWNsZV90IGNvbXBfY3ljbGU7Ci0KLQl0Y29uID0gX19yYXdfcmVhZGwoRVhZTk9TNF9NQ1RfR19UQ09OKTsKLQotCWlmIChtb2RlID09IENMT0NLX0VWVF9NT0RFX1BFUklPRElDKSB7Ci0JCXRjb24gfD0gTUNUX0dfVENPTl9DT01QMF9BVVRPX0lOQzsKLQkJZXh5bm9zNF9tY3Rfd3JpdGUoY3ljbGVzLCBFWFlOT1M0X01DVF9HX0NPTVAwX0FERF9JTkNSKTsKLQl9Ci0KLQljb21wX2N5Y2xlID0gZXh5bm9zNF9mcmNfcmVhZCgmbWN0X2ZyYykgKyBjeWNsZXM7Ci0JZXh5bm9zNF9tY3Rfd3JpdGUoKHUzMiljb21wX2N5Y2xlLCBFWFlOT1M0X01DVF9HX0NPTVAwX0wpOwotCWV4eW5vczRfbWN0X3dyaXRlKCh1MzIpKGNvbXBfY3ljbGUgPj4gMzIpLCBFWFlOT1M0X01DVF9HX0NPTVAwX1UpOwotCi0JZXh5bm9zNF9tY3Rfd3JpdGUoMHgxLCBFWFlOT1M0X01DVF9HX0lOVF9FTkIpOwotCi0JdGNvbiB8PSBNQ1RfR19UQ09OX0NPTVAwX0VOQUJMRTsKLQlleHlub3M0X21jdF93cml0ZSh0Y29uICwgRVhZTk9TNF9NQ1RfR19UQ09OKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2NvbXBfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCi0JCQkJICAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQlleHlub3M0X21jdF9jb21wMF9zdGFydChldnQtPm1vZGUsIGN5Y2xlcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZXh5bm9zNF9jb21wX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAotCQkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewotCWV4eW5vczRfbWN0X2NvbXAwX3N0b3AoKTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6Ci0JCWV4eW5vczRfbWN0X2NvbXAwX3N0YXJ0KG1vZGUsIGNsa19jbnRfcGVyX3RpY2spOwotCQlicmVhazsKLQotCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIG1jdF9jb21wX2RldmljZSA9IHsKLQkubmFtZQkJPSAibWN0LWNvbXAiLAotCS5mZWF0dXJlcyAgICAgICA9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKLQkucmF0aW5nCQk9IDI1MCwKLQkuc2V0X25leHRfZXZlbnQJPSBleHlub3M0X2NvbXBfc2V0X25leHRfZXZlbnQsCi0JLnNldF9tb2RlCT0gZXh5bm9zNF9jb21wX3NldF9tb2RlLAotfTsKLQotc3RhdGljIGlycXJldHVybl90IGV4eW5vczRfbWN0X2NvbXBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSBkZXZfaWQ7Ci0KLQlleHlub3M0X21jdF93cml0ZSgweDEsIEVYWU5PUzRfTUNUX0dfSU5UX0NTVEFUKTsKLQotCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtY3RfY29tcF9ldmVudF9pcnEgPSB7Ci0JLm5hbWUJCT0gIm1jdF9jb21wX2lycSIsCi0JLmZsYWdzCQk9IElSUUZfVElNRVIgfCBJUlFGX0lSUVBPTEwsCi0JLmhhbmRsZXIJPSBleHlub3M0X21jdF9jb21wX2lzciwKLQkuZGV2X2lkCQk9ICZtY3RfY29tcF9kZXZpY2UsCi19OwotCi1zdGF0aWMgdm9pZCBleHlub3M0X2Nsb2NrZXZlbnRfaW5pdCh2b2lkKQotewotCWNsa19jbnRfcGVyX3RpY2sgPSBjbGtfcmF0ZSAvIDIJLyBIWjsKLQotCWNsb2NrZXZlbnRzX2NhbGNfbXVsdF9zaGlmdCgmbWN0X2NvbXBfZGV2aWNlLCBjbGtfcmF0ZSAvIDIsIDUpOwotCW1jdF9jb21wX2RldmljZS5tYXhfZGVsdGFfbnMgPQotCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmZmYsICZtY3RfY29tcF9kZXZpY2UpOwotCW1jdF9jb21wX2RldmljZS5taW5fZGVsdGFfbnMgPQotCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZiwgJm1jdF9jb21wX2RldmljZSk7Ci0JbWN0X2NvbXBfZGV2aWNlLmNwdW1hc2sgPSBjcHVtYXNrX29mKDApOwotCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSgmbWN0X2NvbXBfZGV2aWNlKTsKLQotCXNldHVwX2lycShJUlFfTUNUX0cwLCAmbWN0X2NvbXBfZXZlbnRfaXJxKTsKLX0KLQotI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKLS8qIENsb2NrIGV2ZW50IGhhbmRsaW5nICovCi1zdGF0aWMgdm9pZCBleHlub3M0X21jdF90aWNrX3N0b3Aoc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0JdW5zaWduZWQgbG9uZyBtYXNrID0gTUNUX0xfVENPTl9JTlRfU1RBUlQgfCBNQ1RfTF9UQ09OX1RJTUVSX1NUQVJUOwotCXZvaWQgX19pb21lbSAqYWRkciA9IG1ldnQtPmJhc2UgKyBNQ1RfTF9UQ09OX09GRlNFVDsKLQotCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpOwotCWlmICh0bXAgJiBtYXNrKSB7Ci0JCXRtcCAmPSB+bWFzazsKLQkJZXh5bm9zNF9tY3Rfd3JpdGUodG1wLCBhZGRyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfbWN0X3RpY2tfc3RhcnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCi0JCQkJICAgc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlleHlub3M0X21jdF90aWNrX3N0b3AobWV2dCk7Ci0KLQl0bXAgPSAoMSA8PCAzMSkgfCBjeWNsZXM7CS8qIE1DVF9MX1VQREFURV9JQ05UQiAqLwotCi0JLyogdXBkYXRlIGludGVycnVwdCBjb3VudCBidWZmZXIgKi8KLQlleHlub3M0X21jdF93cml0ZSh0bXAsIG1ldnQtPmJhc2UgKyBNQ1RfTF9JQ05UQl9PRkZTRVQpOwotCi0JLyogZW5hYmxlIE1DVCB0aWNrIGludGVycnVwdCAqLwotCWV4eW5vczRfbWN0X3dyaXRlKDB4MSwgbWV2dC0+YmFzZSArIE1DVF9MX0lOVF9FTkJfT0ZGU0VUKTsKLQotCXRtcCA9IF9fcmF3X3JlYWRsKG1ldnQtPmJhc2UgKyBNQ1RfTF9UQ09OX09GRlNFVCk7Ci0JdG1wIHw9IE1DVF9MX1RDT05fSU5UX1NUQVJUIHwgTUNUX0xfVENPTl9USU1FUl9TVEFSVCB8Ci0JICAgICAgIE1DVF9MX1RDT05fSU5URVJWQUxfTU9ERTsKLQlleHlub3M0X21jdF93cml0ZSh0bXAsIG1ldnQtPmJhc2UgKyBNQ1RfTF9UQ09OX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF90aWNrX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAotCQkJCSAgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0Jc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQgPSAmbWN0X3RpY2tbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQotCWV4eW5vczRfbWN0X3RpY2tfc3RhcnQoY3ljbGVzLCBtZXZ0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZXh5bm9zNF90aWNrX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAotCQkJCQkgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewotCXN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlICptZXZ0ID0gJm1jdF90aWNrW3NtcF9wcm9jZXNzb3JfaWQoKV07Ci0KLQlleHlub3M0X21jdF90aWNrX3N0b3AobWV2dCk7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgotCQlleHlub3M0X21jdF90aWNrX3N0YXJ0KGNsa19jbnRfcGVyX3RpY2ssIG1ldnQpOwotCQlicmVhazsKLQotCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBleHlub3M0X21jdF90aWNrX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQgPSBkZXZfaWQ7Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gbWV2dC0+ZXZ0OwotCi0JLyoKLQkgKiBUaGlzIGlzIGZvciBzdXBwb3J0aW5nIG9uZXNob3QgbW9kZS4KLQkgKiBNY3Qgd291bGQgZ2VuZXJhdGUgaW50ZXJydXB0IHBlcmlvZGljYWxseQotCSAqIHdpdGhvdXQgZXhwbGljaXQgc3RvcHBpbmcuCi0JICovCi0JaWYgKGV2dC0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKLQkJZXh5bm9zNF9tY3RfdGlja19zdG9wKG1ldnQpOwotCi0JLyogQ2xlYXIgdGhlIE1DVCB0aWNrIGludGVycnVwdCAqLwotCWV4eW5vczRfbWN0X3dyaXRlKDB4MSwgbWV2dC0+YmFzZSArIE1DVF9MX0lOVF9DU1RBVF9PRkZTRVQpOwotCi0JZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1jdF90aWNrMF9ldmVudF9pcnEgPSB7Ci0JLm5hbWUJCT0gIm1jdF90aWNrMF9pcnEiLAotCS5mbGFncwkJPSBJUlFGX1RJTUVSIHwgSVJRRl9OT0JBTEFOQ0lORywKLQkuaGFuZGxlcgk9IGV4eW5vczRfbWN0X3RpY2tfaXNyLAotfTsKLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWN0X3RpY2sxX2V2ZW50X2lycSA9IHsKLQkubmFtZQkJPSAibWN0X3RpY2sxX2lycSIsCi0JLmZsYWdzCQk9IElSUUZfVElNRVIgfCBJUlFGX05PQkFMQU5DSU5HLAotCS5oYW5kbGVyCT0gZXh5bm9zNF9tY3RfdGlja19pc3IsCi19OwotCi1zdGF0aWMgdm9pZCBleHlub3M0X21jdF90aWNrX2luaXQoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQltY3RfdGlja1tjcHVdLmV2dCA9IGV2dDsKLQotCWlmIChjcHUgPT0gMCkgewotCQltY3RfdGlja1tjcHVdLmJhc2UgPSBFWFlOT1M0X01DVF9MMF9CQVNFOwotCQlldnQtPm5hbWUgPSAibWN0X3RpY2swIjsKLQl9IGVsc2UgewotCQltY3RfdGlja1tjcHVdLmJhc2UgPSBFWFlOT1M0X01DVF9MMV9CQVNFOwotCQlldnQtPm5hbWUgPSAibWN0X3RpY2sxIjsKLQl9Ci0KLQlldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mKGNwdSk7Ci0JZXZ0LT5zZXRfbmV4dF9ldmVudCA9IGV4eW5vczRfdGlja19zZXRfbmV4dF9ldmVudDsKLQlldnQtPnNldF9tb2RlID0gZXh5bm9zNF90aWNrX3NldF9tb2RlOwotCWV2dC0+ZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1Q7Ci0JZXZ0LT5yYXRpbmcgPSA0NTA7Ci0KLQljbG9ja2V2ZW50c19jYWxjX211bHRfc2hpZnQoZXZ0LCBjbGtfcmF0ZSAvIDIsIDUpOwotCWV2dC0+bWF4X2RlbHRhX25zID0KLQkJY2xvY2tldmVudF9kZWx0YTJucygweDdmZmZmZmZmLCBldnQpOwotCWV2dC0+bWluX2RlbHRhX25zID0KLQkJY2xvY2tldmVudF9kZWx0YTJucygweGYsIGV2dCk7Ci0KLQljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoZXZ0KTsKLQotCWV4eW5vczRfbWN0X3dyaXRlKDB4MSwgbWN0X3RpY2tbY3B1XS5iYXNlICsgTUNUX0xfVENOVEJfT0ZGU0VUKTsKLQotCWlmIChjcHUgPT0gMCkgewotCQltY3RfdGljazBfZXZlbnRfaXJxLmRldl9pZCA9ICZtY3RfdGlja1tjcHVdOwotCQlzZXR1cF9pcnEoSVJRX01DVF9MMCwgJm1jdF90aWNrMF9ldmVudF9pcnEpOwotCX0gZWxzZSB7Ci0JCW1jdF90aWNrMV9ldmVudF9pcnEuZGV2X2lkID0gJm1jdF90aWNrW2NwdV07Ci0JCXNldHVwX2lycShJUlFfTUNUX0wxLCAmbWN0X3RpY2sxX2V2ZW50X2lycSk7Ci0JCWlycV9zZXRfYWZmaW5pdHkoSVJRX01DVF9MMSwgY3B1bWFza19vZigxKSk7Ci0JfQotfQotCi0vKiBTZXR1cCB0aGUgbG9jYWwgY2xvY2sgZXZlbnRzIGZvciBhIENQVSAqLwotaW50IF9fY3B1aW5pdCBsb2NhbF90aW1lcl9zZXR1cChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0JZXh5bm9zNF9tY3RfdGlja19pbml0KGV2dCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGxvY2FsX3RpbWVyX2Fjayh2b2lkKQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09ORklHX0xPQ0FMX1RJTUVSUyAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNF90aW1lcl9yZXNvdXJjZXModm9pZCkKLXsKLQlzdHJ1Y3QgY2xrICptY3RfY2xrOwotCW1jdF9jbGsgPSBjbGtfZ2V0KE5VTEwsICJ4dGFsIik7Ci0KLQljbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShtY3RfY2xrKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczRfdGltZXJfaW5pdCh2b2lkKQotewotCWV4eW5vczRfdGltZXJfcmVzb3VyY2VzKCk7Ci0JZXh5bm9zNF9jbG9ja3NvdXJjZV9pbml0KCk7Ci0JZXh5bm9zNF9jbG9ja2V2ZW50X2luaXQoKTsKLX0KLQotc3RydWN0IHN5c190aW1lciBleHlub3M0X3RpbWVyID0gewotCS5pbml0CQk9IGV4eW5vczRfdGltZXJfaW5pdCwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BsYXRzbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5MDg5Ni4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvcGxhdHNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbGF0c21wLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBDbG9uZWQgZnJvbSBsaW51eC9hcmNoL2FybS9tYWNoLXZleHByZXNzL3BsYXRzbXAuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIgQVJNIEx0ZC4KLSAqICBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcF9zY3UuaD4KLSNpbmNsdWRlIDxhc20vdW5pZmllZC5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KLQotZXh0ZXJuIHZvaWQgZXh5bm9zNF9zZWNvbmRhcnlfc3RhcnR1cCh2b2lkKTsKLQotI2RlZmluZSBDUFUxX0JPT1RfUkVHIFM1UF9WQV9TWVNSQU0KLQotLyoKLSAqIGNvbnRyb2wgZm9yIHdoaWNoIGNvcmUgaXMgdGhlIG5leHQgdG8gY29tZSBvdXQgb2YgdGhlIHNlY29uZGFyeQotICogYm9vdCAiaG9sZGluZyBwZW4iCi0gKi8KLQotdm9sYXRpbGUgaW50IF9fY3B1aW5pdGRhdGEgcGVuX3JlbGVhc2UgPSAtMTsKLQotLyoKLSAqIFdyaXRlIHBlbl9yZWxlYXNlIGluIGEgd2F5IHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSB2aXNpYmxlIHRvIGFsbAotICogb2JzZXJ2ZXJzLCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciB0aGV5J3JlIHRha2luZyBwYXJ0IGluIGNvaGVyZW5jeQotICogb3Igbm90LiAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBob3RwbHVnIGNvZGUgdG8gd29yayByZWxpYWJseS4KLSAqLwotc3RhdGljIHZvaWQgd3JpdGVfcGVuX3JlbGVhc2UoaW50IHZhbCkKLXsKLQlwZW5fcmVsZWFzZSA9IHZhbDsKLQlzbXBfd21iKCk7Ci0JX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKCh2b2lkICopJnBlbl9yZWxlYXNlLCBzaXplb2YocGVuX3JlbGVhc2UpKTsKLQlvdXRlcl9jbGVhbl9yYW5nZShfX3BhKCZwZW5fcmVsZWFzZSksIF9fcGEoJnBlbl9yZWxlYXNlICsgMSkpOwotfQotCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpzY3VfYmFzZV9hZGRyKHZvaWQpCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKikoUzVQX1ZBX1NDVSk7Ci19Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYm9vdF9sb2NrKTsKLQotc3RhdGljIHZvaWQgX19jcHVpbml0IGV4eW5vczRfZ2ljX3NlY29uZGFyeV9pbml0KHZvaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpkaXN0X2Jhc2UgPSBTNVBfVkFfR0lDX0RJU1QgKwotCQkJCSAoRVhZTk9TNF9HSUNfQkFOS19PRkZTRVQgKiBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCXZvaWQgX19pb21lbSAqY3B1X2Jhc2UgPSBTNVBfVkFfR0lDX0NQVSArCi0JCQkJKEVYWU5PUzRfR0lDX0JBTktfT0ZGU0VUICogc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlpbnQgaTsKLQotCS8qCi0JICogRGVhbCB3aXRoIHRoZSBiYW5rZWQgUFBJIGFuZCBTR0kgaW50ZXJydXB0cyAtIGRpc2FibGUgYWxsCi0JICogUFBJIGludGVycnVwdHMsIGVuc3VyZSBhbGwgU0dJIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCi0JICovCi0JX19yYXdfd3JpdGVsKDB4ZmZmZjAwMDAsIGRpc3RfYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9DTEVBUik7Ci0JX19yYXdfd3JpdGVsKDB4MDAwMGZmZmYsIGRpc3RfYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9TRVQpOwotCi0JLyoKLQkgKiBTZXQgcHJpb3JpdHkgb24gUFBJIGFuZCBTR0kgaW50ZXJydXB0cwotCSAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSA0KQotCQlfX3Jhd193cml0ZWwoMHhhMGEwYTBhMCwgZGlzdF9iYXNlICsgR0lDX0RJU1RfUFJJICsgaSAqIDQgLyA0KTsKLQotCV9fcmF3X3dyaXRlbCgweGYwLCBjcHVfYmFzZSArIEdJQ19DUFVfUFJJTUFTSyk7Ci0JX19yYXdfd3JpdGVsKDEsIGNwdV9iYXNlICsgR0lDX0NQVV9DVFJMKTsKLX0KLQotdm9pZCBfX2NwdWluaXQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSkKLXsKLQkvKgotCSAqIGlmIGFueSBpbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IGVuYWJsZWQgZm9yIHRoZSBwcmltYXJ5Ci0JICogY29yZSAoZS5nLiB0aW1lciBpcnEpLCB0aGVuIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGVuYWJsZWQKLQkgKiBmb3IgdXM6IGRvIHNvCi0JICovCi0JZXh5bm9zNF9naWNfc2Vjb25kYXJ5X2luaXQoKTsKLQotCS8qCi0JICogbGV0IHRoZSBwcmltYXJ5IHByb2Nlc3NvciBrbm93IHdlJ3JlIG91dCBvZiB0aGUKLQkgKiBwZW4sIHRoZW4gaGVhZCBvZmYgaW50byB0aGUgQyBlbnRyeSBwb2ludAotCSAqLwotCXdyaXRlX3Blbl9yZWxlYXNlKC0xKTsKLQotCS8qCi0JICogU3luY2hyb25pc2Ugd2l0aCB0aGUgYm9vdCB0aHJlYWQuCi0JICovCi0Jc3Bpbl9sb2NrKCZib290X2xvY2spOwotCXNwaW5fdW5sb2NrKCZib290X2xvY2spOwotCi0Jc2V0X2NwdV9vbmxpbmUoY3B1LCB0cnVlKTsKLX0KLQotaW50IF9fY3B1aW5pdCBib290X3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCi17Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCi0JLyoKLQkgKiBTZXQgc3luY2hyb25pc2F0aW9uIHN0YXRlIGJldHdlZW4gdGhpcyBib290IHByb2Nlc3NvcgotCSAqIGFuZCB0aGUgc2Vjb25kYXJ5IG9uZQotCSAqLwotCXNwaW5fbG9jaygmYm9vdF9sb2NrKTsKLQotCS8qCi0JICogVGhlIHNlY29uZGFyeSBwcm9jZXNzb3IgaXMgd2FpdGluZyB0byBiZSByZWxlYXNlZCBmcm9tCi0JICogdGhlIGhvbGRpbmcgcGVuIC0gcmVsZWFzZSBpdCwgdGhlbiB3YWl0IGZvciBpdCB0byBmbGFnCi0JICogdGhhdCBpdCBoYXMgYmVlbiByZWxlYXNlZCBieSByZXNldHRpbmcgcGVuX3JlbGVhc2UuCi0JICoKLQkgKiBOb3RlIHRoYXQgInBlbl9yZWxlYXNlIiBpcyB0aGUgaGFyZHdhcmUgQ1BVIElELCB3aGVyZWFzCi0JICogImNwdSIgaXMgTGludXgncyBpbnRlcm5hbCBJRC4KLQkgKi8KLQl3cml0ZV9wZW5fcmVsZWFzZShjcHUpOwotCi0JaWYgKCEoX19yYXdfcmVhZGwoUzVQX0FSTV9DT1JFMV9TVEFUVVMpICYgUzVQX0NPUkVfTE9DQUxfUFdSX0VOKSkgewotCQlfX3Jhd193cml0ZWwoUzVQX0NPUkVfTE9DQUxfUFdSX0VOLAotCQkJICAgICBTNVBfQVJNX0NPUkUxX0NPTkZJR1VSQVRJT04pOwotCi0JCXRpbWVvdXQgPSAxMDsKLQotCQkvKiB3YWl0IG1heCAxMCBtcyB1bnRpbCBjcHUxIGlzIG9uICovCi0JCXdoaWxlICgoX19yYXdfcmVhZGwoUzVQX0FSTV9DT1JFMV9TVEFUVVMpCi0JCQkmIFM1UF9DT1JFX0xPQ0FMX1BXUl9FTikgIT0gUzVQX0NPUkVfTE9DQUxfUFdSX0VOKSB7Ci0JCQlpZiAodGltZW91dC0tID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJCW1kZWxheSgxKTsKLQkJfQotCi0JCWlmICh0aW1lb3V0ID09IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiY3B1MSBwb3dlciBlbmFibGUgZmFpbGVkIik7Ci0JCQlzcGluX3VubG9jaygmYm9vdF9sb2NrKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JfQotCS8qCi0JICogU2VuZCB0aGUgc2Vjb25kYXJ5IENQVSBhIHNvZnQgaW50ZXJydXB0LCB0aGVyZWJ5IGNhdXNpbmcKLQkgKiB0aGUgYm9vdCBtb25pdG9yIHRvIHJlYWQgdGhlIHN5c3RlbSB3aWRlIGZsYWdzIHJlZ2lzdGVyLAotCSAqIGFuZCBicmFuY2ggdG8gdGhlIGFkZHJlc3MgZm91bmQgdGhlcmUuCi0JICovCi0KLQl0aW1lb3V0ID0gamlmZmllcyArICgxICogSFopOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlzbXBfcm1iKCk7Ci0KLQkJX19yYXdfd3JpdGVsKEJTWU0odmlydF90b19waHlzKGV4eW5vczRfc2Vjb25kYXJ5X3N0YXJ0dXApKSwKLQkJCUNQVTFfQk9PVF9SRUcpOwotCQlnaWNfcmFpc2Vfc29mdGlycShjcHVtYXNrX29mKGNwdSksIDEpOwotCi0JCWlmIChwZW5fcmVsZWFzZSA9PSAtMSkKLQkJCWJyZWFrOwotCi0JCXVkZWxheSgxMCk7Ci0JfQotCi0JLyoKLQkgKiBub3cgdGhlIHNlY29uZGFyeSBjb3JlIGlzIHN0YXJ0aW5nIHVwIGxldCBpdCBydW4gaXRzCi0JICogY2FsaWJyYXRpb25zLCB0aGVuIHdhaXQgZm9yIGl0IHRvIGZpbmlzaAotCSAqLwotCXNwaW5fdW5sb2NrKCZib290X2xvY2spOwotCi0JcmV0dXJuIHBlbl9yZWxlYXNlICE9IC0xID8gLUVOT1NZUyA6IDA7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXNlIHRoZSBDUFUgcG9zc2libGUgbWFwIGVhcmx5IC0gdGhpcyBkZXNjcmliZXMgdGhlIENQVXMKLSAqIHdoaWNoIG1heSBiZSBwcmVzZW50IG9yIGJlY29tZSBwcmVzZW50IGluIHRoZSBzeXN0ZW0uCi0gKi8KLQotdm9pZCBfX2luaXQgc21wX2luaXRfY3B1cyh2b2lkKQotewotCXZvaWQgX19pb21lbSAqc2N1X2Jhc2UgPSBzY3VfYmFzZV9hZGRyKCk7Ci0JdW5zaWduZWQgaW50IGksIG5jb3JlczsKLQotCW5jb3JlcyA9IHNjdV9iYXNlID8gc2N1X2dldF9jb3JlX2NvdW50KHNjdV9iYXNlKSA6IDE7Ci0KLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlpZiAobmNvcmVzID4gbnJfY3B1X2lkcykgewotCQlwcl93YXJuKCJTTVA6ICV1IGNvcmVzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtICgldSksIGNsaXBwaW5nXG4iLAotCQkJbmNvcmVzLCBucl9jcHVfaWRzKTsKLQkJbmNvcmVzID0gbnJfY3B1X2lkczsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmNvcmVzOyBpKyspCi0JCXNldF9jcHVfcG9zc2libGUoaSwgdHJ1ZSk7Ci0KLQlzZXRfc21wX2Nyb3NzX2NhbGwoZ2ljX3JhaXNlX3NvZnRpcnEpOwotfQotCi12b2lkIF9faW5pdCBwbGF0Zm9ybV9zbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKLXsKLQotCXNjdV9lbmFibGUoc2N1X2Jhc2VfYWRkcigpKTsKLQotCS8qCi0JICogV3JpdGUgdGhlIGFkZHJlc3Mgb2Ygc2Vjb25kYXJ5IHN0YXJ0dXAgaW50byB0aGUKLQkgKiBzeXN0ZW0td2lkZSBmbGFncyByZWdpc3Rlci4gVGhlIGJvb3QgbW9uaXRvciB3YWl0cwotCSAqIHVudGlsIGl0IHJlY2VpdmVzIGEgc29mdCBpbnRlcnJ1cHQsIGFuZCB0aGVuIHRoZQotCSAqIHNlY29uZGFyeSBDUFUgYnJhbmNoZXMgdG8gdGhpcyBhZGRyZXNzLgotCSAqLwotCV9fcmF3X3dyaXRlbChCU1lNKHZpcnRfdG9fcGh5cyhleHlub3M0X3NlY29uZGFyeV9zdGFydHVwKSksIFM1UF9WQV9TWVNSQU0pOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BtLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvcG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2Y2E5NC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvcG0uYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0MjEwIC0gUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0Ci0gKgotICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLmMKLSAqIENvcHlyaWdodCAoYykgMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotCi0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgotCi0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxwbGF0L3BtLmg+Ci0jaW5jbHVkZSA8cGxhdC9wbGwuaD4KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc3JvbS5oPgotCi0jaW5jbHVkZSA8bWFjaC9yZWdzLWlycS5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLXBtdS5oPgotI2luY2x1ZGUgPG1hY2gvcG0tY29yZS5oPgotI2luY2x1ZGUgPG1hY2gvcG11Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0X3NldF9jbGtzcmNbXSA9IHsKLQl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfVE9QCQkJLCAudmFsID0gMHgwMDAwMDAwMSwgfSwKLQl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfQ0FNCQkJLCAudmFsID0gMHgxMTExMTExMSwgfSwKLQl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfVFYJCQksIC52YWwgPSAweDAwMDAwMTExLCB9LAotCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19MQ0QwCQkJLCAudmFsID0gMHgwMDAwMTExMSwgfSwKLQl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfTENEMQkJCSwgLnZhbCA9IDB4MDAwMDExMTEsIH0sCi0JeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX01BVURJTwkJCSwgLnZhbCA9IDB4MDAwMDAwMDEsIH0sCi0JeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX0ZTWVMJCQksIC52YWwgPSAweDAxMDExMTExLCB9LAotCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19QRVJJTDAJCQksIC52YWwgPSAweDAxMTExMTExLCB9LAotCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19QRVJJTDEJCQksIC52YWwgPSAweDAxMTEwMTExLCB9LAotCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19ETUMJCQksIC52YWwgPSAweDAwMDEwMDAwLCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGV4eW5vczRfZXBsbF9zYXZlW10gPSB7Ci0JU0FWRV9JVEVNKFM1UF9FUExMX0NPTjApLAotCVNBVkVfSVRFTShTNVBfRVBMTF9DT04xKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0X3ZwbGxfc2F2ZVtdID0gewotCVNBVkVfSVRFTShTNVBfVlBMTF9DT04wKSwKLQlTQVZFX0lURU0oUzVQX1ZQTExfQ09OMSksCi19OwotCi1zdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgZXh5bm9zNF9jb3JlX3NhdmVbXSA9IHsKLQkvKiBDTVUgc2lkZSAqLwotCVNBVkVfSVRFTShTNVBfQ0xLRElWX0xFRlRCVVMpLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9MRUZUQlVTKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9SSUdIVEJVUyksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX1JJR0hUQlVTKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19UT1AwKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19UT1AxKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19DQU0pLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX1RWKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19NRkMpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0czRCksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfSU1BR0UpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0xDRDApLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0xDRDEpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BVURJTyksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfRlNZUyksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfUEVSSUwwKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19QRVJJTDEpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX0NBTSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfVFYpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX01GQyksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfRzNEKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9JTUFHRSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfTENEMCksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfTENEMSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfTUFVRElPKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9GU1lTMCksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfRlNZUzEpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX0ZTWVMyKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9GU1lTMyksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfUEVSSUwwKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9QRVJJTDEpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX1BFUklMMiksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfUEVSSUwzKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9QRVJJTDQpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX1BFUklMNSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfVE9QKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX1RPUCksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19DQU0pLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfVFYpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfTENEMCksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19MQ0QxKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX01BVURJTyksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19GU1lTKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX1BFUklMMCksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19QRVJJTDEpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWMl9SQVRJTyksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX1NDTEtDQU0pLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9DQU0pLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9UViksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX01GQyksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0czRCksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0lNQUdFKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfTENEMCksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0xDRDEpLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9GU1lTKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfR1BTKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfUEVSSUwpLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9QRVJJUiksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0JMT0NLKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX0RNQyksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfRE1DKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9ETUMwKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9ETUMxKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfRE1DKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19DUFUpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX0NQVSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfQ1BVICsgMHg0KSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfU0NMS0NQVSksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0NQVSksCi0KLQkvKiBHSUMgc2lkZSAqLwotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0NQVSArIDB4MDAwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19DUFUgKyAweDAwNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfQ1BVICsgMHgwMDgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0NQVSArIDB4MDBDKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19DUFUgKyAweDAxNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfQ1BVICsgMHgwMTgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDAwMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MDA0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgxMDApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDEwNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MTA4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgzMDApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDMwNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MzA4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MDApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQwNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDA4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MEMpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQxMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDE0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MTgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQxQyksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDIwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MjQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQyOCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDJDKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MzApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQzNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDM4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0M0MpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ0MCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDQ0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NDgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ0QyksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDUwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NTQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ1OCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDVDKSwKLQotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgwMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODA0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MDgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgwQyksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODEwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MTQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgxOCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODFDKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MjApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgyNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODI4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MkMpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgzMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODM0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MzgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgzQyksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODQwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NDQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg0OCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODRDKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NTApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg1NCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODU4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NUMpLAotCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4QzAwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHhDMDQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweEMwOCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4QzBDKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHhDMTApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweEMxNCksCi0KLQlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDAwMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwMTApLAotCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDIwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDAzMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwNDApLAotCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDUwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDA2MCksCi0JU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwNzApLAotCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDgwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDA5MCksCi0KLQkvKiBTUk9NIHNpZGUgKi8KLQlTQVZFX0lURU0oUzVQX1NST01fQlcpLAotCVNBVkVfSVRFTShTNVBfU1JPTV9CQzApLAotCVNBVkVfSVRFTShTNVBfU1JPTV9CQzEpLAotCVNBVkVfSVRFTShTNVBfU1JPTV9CQzIpLAotCVNBVkVfSVRFTShTNVBfU1JPTV9CQzMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGV4eW5vczRfbDJjY19zYXZlW10gPSB7Ci0JU0FWRV9JVEVNKFM1UF9WQV9MMkNDICsgTDJYMF9UQUdfTEFURU5DWV9DVFJMKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0wyQ0MgKyBMMlgwX0RBVEFfTEFURU5DWV9DVFJMKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0wyQ0MgKyBMMlgwX1BSRUZFVENIX0NUUkwpLAotCVNBVkVfSVRFTShTNVBfVkFfTDJDQyArIEwyWDBfUE9XRVJfQ1RSTCksCi0JU0FWRV9JVEVNKFM1UF9WQV9MMkNDICsgTDJYMF9BVVhfQ1RSTCksCi19OwotCi0vKiBGb3IgQ29ydGV4LUE5IERpYWdub3N0aWMgYW5kIFBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2F2ZV9hcm1fcmVnaXN0ZXJbMl07Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jcHVfc3VzcGVuZCh1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlvdXRlcl9mbHVzaF9hbGwoKTsKLQotCS8qIGlzc3VlIHRoZSBzdGFuZGJ5IHNpZ25hbCBpbnRvIHRoZSBwbSB1bml0LiAqLwotCWNwdV9kb19pZGxlKCk7Ci0KLQkvKiB3ZSBzaG91bGQgbmV2ZXIgZ2V0IHBhc3QgaGVyZSAqLwotCXBhbmljKCJzbGVlcCByZXN1bWVkIHRvIG9yaWdpbmF0b3I/Iik7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfcG1fcHJlcGFyZSh2b2lkKQotewotCXUzMiB0bXA7Ci0KLQlzM2NfcG1fZG9fc2F2ZShleHlub3M0X2NvcmVfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2NvcmVfc2F2ZSkpOwotCXMzY19wbV9kb19zYXZlKGV4eW5vczRfbDJjY19zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfbDJjY19zYXZlKSk7Ci0JczNjX3BtX2RvX3NhdmUoZXh5bm9zNF9lcGxsX3NhdmUsIEFSUkFZX1NJWkUoZXh5bm9zNF9lcGxsX3NhdmUpKTsKLQlzM2NfcG1fZG9fc2F2ZShleHlub3M0X3ZwbGxfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X3ZwbGxfc2F2ZSkpOwotCi0JdG1wID0gX19yYXdfcmVhZGwoUzVQX0lORk9STTEpOwotCi0JLyogU2V0IHZhbHVlIG9mIHBvd2VyIGRvd24gcmVnaXN0ZXIgZm9yIHNsZWVwIG1vZGUgKi8KLQotCWV4eW5vczRfc3lzX3Bvd2VyZG93bl9jb25mKFNZU19TTEVFUCk7Ci0JX19yYXdfd3JpdGVsKFM1UF9DSEVDS19TTEVFUCwgUzVQX0lORk9STTEpOwotCi0JLyogZW5zdXJlIGF0IGxlYXN0IElORk9STTAgaGFzIHRoZSByZXN1bWUgYWRkcmVzcyAqLwotCi0JX19yYXdfd3JpdGVsKHZpcnRfdG9fcGh5cyhzM2NfY3B1X3Jlc3VtZSksIFM1UF9JTkZPUk0wKTsKLQotCS8qIEJlZm9yZSBlbnRlciBjZW50cmFsIHNlcXVlbmNlIG1vZGUsIGNsb2NrIHNyYyByZWdpc3RlciBoYXZlIHRvIHNldCAqLwotCi0JczNjX3BtX2RvX3Jlc3RvcmVfY29yZShleHlub3M0X3NldF9jbGtzcmMsIEFSUkFZX1NJWkUoZXh5bm9zNF9zZXRfY2xrc3JjKSk7Ci0KLX0KLQotc3RhdGljIGludCBleHlub3M0X3BtX2FkZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQotewotCXBtX2NwdV9wcmVwID0gZXh5bm9zNF9wbV9wcmVwYXJlOwotCXBtX2NwdV9zbGVlcCA9IGV4eW5vczRfY3B1X3N1c3BlbmQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBjb3B5IGZyb20gbGludXgvYXJjaC9hcm0va2VybmVsL3NtcF9zY3UuYyAqLwotCi12b2lkIGV4eW5vczRfc2N1X2VuYWJsZSh2b2lkIF9faW9tZW0gKnNjdV9iYXNlKQotewotCXUzMiBzY3VfY3RybDsKLQotCXNjdV9jdHJsID0gX19yYXdfcmVhZGwoc2N1X2Jhc2UpOwotCS8qIGFscmVhZHkgZW5hYmxlZD8gKi8KLQlpZiAoc2N1X2N0cmwgJiAxKQotCQlyZXR1cm47Ci0KLQlzY3VfY3RybCB8PSAxOwotCV9fcmF3X3dyaXRlbChzY3VfY3RybCwgc2N1X2Jhc2UpOwotCi0JLyoKLQkgKiBFbnN1cmUgdGhhdCB0aGUgZGF0YSBhY2Nlc3NlZCBieSBDUFUwIGJlZm9yZSB0aGUgU0NVIHdhcwotCSAqIGluaXRpYWxpc2VkIGlzIHZpc2libGUgdG8gdGhlIG90aGVyIENQVXMuCi0JICovCi0JZmx1c2hfY2FjaGVfYWxsKCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBsbF9iYXNlX3JhdGU7Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfcmVzdG9yZV9wbGwodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHBsbF9jb24sIGxvY2t0aW1lLCBsb2NrY250OwotCXVuc2lnbmVkIGxvbmcgcGxsX2luX3JhdGU7Ci0JdW5zaWduZWQgaW50IHBfZGl2LCBlcGxsX3dhaXQgPSAwLCB2cGxsX3dhaXQgPSAwOwotCi0JaWYgKHBsbF9iYXNlX3JhdGUgPT0gMCkKLQkJcmV0dXJuOwotCi0JcGxsX2luX3JhdGUgPSBwbGxfYmFzZV9yYXRlOwotCi0JLyogRVBMTCAqLwotCXBsbF9jb24gPSBleHlub3M0X2VwbGxfc2F2ZVswXS52YWw7Ci0KLQlpZiAocGxsX2NvbiAmICgxIDw8IDMxKSkgewotCQlwbGxfY29uICY9IChQTEw0NlhYX1BESVZfTUFTSyA8PCBQTEw0NlhYX1BESVZfU0hJRlQpOwotCQlwX2RpdiA9IChwbGxfY29uID4+IFBMTDQ2WFhfUERJVl9TSElGVCk7Ci0KLQkJcGxsX2luX3JhdGUgLz0gMTAwMDAwMDsKLQotCQlsb2NrdGltZSA9ICgzMDAwIC8gcGxsX2luX3JhdGUpICogcF9kaXY7Ci0JCWxvY2tjbnQgPSBsb2NrdGltZSAqIDEwMDAwIC8gKDEwMDAwIC8gcGxsX2luX3JhdGUpOwotCi0JCV9fcmF3X3dyaXRlbChsb2NrY250LCBTNVBfRVBMTF9MT0NLKTsKLQotCQlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKGV4eW5vczRfZXBsbF9zYXZlLAotCQkJCQlBUlJBWV9TSVpFKGV4eW5vczRfZXBsbF9zYXZlKSk7Ci0JCWVwbGxfd2FpdCA9IDE7Ci0JfQotCi0JcGxsX2luX3JhdGUgPSBwbGxfYmFzZV9yYXRlOwotCi0JLyogVlBMTCAqLwotCXBsbF9jb24gPSBleHlub3M0X3ZwbGxfc2F2ZVswXS52YWw7Ci0KLQlpZiAocGxsX2NvbiAmICgxIDw8IDMxKSkgewotCQlwbGxfaW5fcmF0ZSAvPSAxMDAwMDAwOwotCQkvKiA3NTB1cyAqLwotCQlsb2NrdGltZSA9IDc1MDsKLQkJbG9ja2NudCA9IGxvY2t0aW1lICogMTAwMDAgLyAoMTAwMDAgLyBwbGxfaW5fcmF0ZSk7Ci0KLQkJX19yYXdfd3JpdGVsKGxvY2tjbnQsIFM1UF9WUExMX0xPQ0spOwotCi0JCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNF92cGxsX3NhdmUsCi0JCQkJCUFSUkFZX1NJWkUoZXh5bm9zNF92cGxsX3NhdmUpKTsKLQkJdnBsbF93YWl0ID0gMTsKLQl9Ci0KLQkvKiBXYWl0IFBMTCBsb2NraW5nICovCi0KLQlkbyB7Ci0JCWlmIChlcGxsX3dhaXQpIHsKLQkJCXBsbF9jb24gPSBfX3Jhd19yZWFkbChTNVBfRVBMTF9DT04wKTsKLQkJCWlmIChwbGxfY29uICYgKDEgPDwgUzVQX0VQTExDT04wX0xPQ0tFRF9TSElGVCkpCi0JCQkJZXBsbF93YWl0ID0gMDsKLQkJfQotCi0JCWlmICh2cGxsX3dhaXQpIHsKLQkJCXBsbF9jb24gPSBfX3Jhd19yZWFkbChTNVBfVlBMTF9DT04wKTsKLQkJCWlmIChwbGxfY29uICYgKDEgPDwgUzVQX1ZQTExDT04wX0xPQ0tFRF9TSElGVCkpCi0JCQkJdnBsbF93YWl0ID0gMDsKLQkJfQotCX0gd2hpbGUgKGVwbGxfd2FpdCB8fCB2cGxsX3dhaXQpOwotfQotCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgZXh5bm9zNF9wbV9kcml2ZXIgPSB7Ci0JLmFkZAkJPSBleHlub3M0X3BtX2FkZCwKLX07Ci0KLXN0YXRpYyBfX2luaXQgaW50IGV4eW5vczRfcG1fZHJ2aW5pdCh2b2lkKQotewotCXN0cnVjdCBjbGsgKnBsbF9iYXNlOwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlzM2NfcG1faW5pdCgpOwotCi0JLyogQWxsIHdha2V1cCBkaXNhYmxlICovCi0KLQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfV0FLRVVQX01BU0spOwotCXRtcCB8PSAoKDB4RkYgPDwgOCkgfCAoMHgxRiA8PCAxKSk7Ci0JX19yYXdfd3JpdGVsKHRtcCwgUzVQX1dBS0VVUF9NQVNLKTsKLQotCXBsbF9iYXNlID0gY2xrX2dldChOVUxMLCAieHRhbCIpOwotCi0JaWYgKCFJU19FUlIocGxsX2Jhc2UpKSB7Ci0JCXBsbF9iYXNlX3JhdGUgPSBjbGtfZ2V0X3JhdGUocGxsX2Jhc2UpOwotCQljbGtfcHV0KHBsbF9iYXNlKTsKLQl9Ci0KLQlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmZXh5bm9zNF9zeXNjbGFzcywgJmV4eW5vczRfcG1fZHJpdmVyKTsKLX0KLWFyY2hfaW5pdGNhbGwoZXh5bm9zNF9wbV9kcnZpbml0KTsKLQotc3RhdGljIGludCBleHlub3M0X3BtX3N1c3BlbmQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCS8qIFNldHRpbmcgQ2VudHJhbCBTZXF1ZW5jZSBSZWdpc3RlciBmb3IgcG93ZXIgZG93biBtb2RlICovCi0KLQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0VOVFJBTF9TRVFfQ09ORklHVVJBVElPTik7Ci0JdG1wICY9IH5TNVBfQ0VOVFJBTF9MT1dQV1JfQ0ZHOwotCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9DRU5UUkFMX1NFUV9DT05GSUdVUkFUSU9OKTsKLQotCS8qIFNhdmUgUG93ZXIgY29udHJvbCByZWdpc3RlciAqLwotCWFzbSAoIm1yYyBwMTUsIDAsICUwLCBjMTUsIGMwLCAwIgotCSAgICAgOiAiPXIiICh0bXApIDogOiAiY2MiKTsKLQlzYXZlX2FybV9yZWdpc3RlclswXSA9IHRtcDsKLQotCS8qIFNhdmUgRGlhZ25vc3RpYyByZWdpc3RlciAqLwotCWFzbSAoIm1yYyBwMTUsIDAsICUwLCBjMTUsIGMwLCAxIgotCSAgICAgOiAiPXIiICh0bXApIDogOiAiY2MiKTsKLQlzYXZlX2FybV9yZWdpc3RlclsxXSA9IHRtcDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBleHlub3M0X3BtX3Jlc3VtZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JLyoKLQkgKiBJZiBQTVUgZmFpbGVkIHdoaWxlIGVudGVyaW5nIHNsZWVwIG1vZGUsIFdGSSB3aWxsIGJlCi0JICogaWdub3JlZCBieSBQTVUgYW5kIHRoZW4gZXhpdGluZyBjcHVfZG9faWRsZSgpLgotCSAqIFM1UF9DRU5UUkFMX0xPV1BXUl9DRkcgYml0IHdpbGwgbm90IGJlIHNldCBhdXRvbWF0aWNhbGx5Ci0JICogaW4gdGhpcyBzaXR1YXRpb24uCi0JICovCi0JdG1wID0gX19yYXdfcmVhZGwoUzVQX0NFTlRSQUxfU0VRX0NPTkZJR1VSQVRJT04pOwotCWlmICghKHRtcCAmIFM1UF9DRU5UUkFMX0xPV1BXUl9DRkcpKSB7Ci0JCXRtcCB8PSBTNVBfQ0VOVFJBTF9MT1dQV1JfQ0ZHOwotCQlfX3Jhd193cml0ZWwodG1wLCBTNVBfQ0VOVFJBTF9TRVFfQ09ORklHVVJBVElPTik7Ci0JCS8qIE5vIG5lZWQgdG8gcGVyZm9ybSBiZWxvdyByZXN0b3JlIGNvZGUgKi8KLQkJZ290byBlYXJseV93YWtldXA7Ci0JfQotCS8qIFJlc3RvcmUgUG93ZXIgY29udHJvbCByZWdpc3RlciAqLwotCXRtcCA9IHNhdmVfYXJtX3JlZ2lzdGVyWzBdOwotCWFzbSB2b2xhdGlsZSAoIm1jciBwMTUsIDAsICUwLCBjMTUsIGMwLCAwIgotCQkgICAgICA6IDogInIiICh0bXApCi0JCSAgICAgIDogImNjIik7Ci0KLQkvKiBSZXN0b3JlIERpYWdub3N0aWMgcmVnaXN0ZXIgKi8KLQl0bXAgPSBzYXZlX2FybV9yZWdpc3RlclsxXTsKLQlhc20gdm9sYXRpbGUgKCJtY3IgcDE1LCAwLCAlMCwgYzE1LCBjMCwgMSIKLQkJICAgICAgOiA6ICJyIiAodG1wKQotCQkgICAgICA6ICJjYyIpOwotCi0JLyogRm9yIHJlbGVhc2UgcmV0ZW50aW9uICovCi0KLQlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9NQVVESU9fT1BUSU9OKTsKLQlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9HUElPX09QVElPTik7Ci0JX19yYXdfd3JpdGVsKCgxIDw8IDI4KSwgUzVQX1BBRF9SRVRfVUFSVF9PUFRJT04pOwotCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX01NQ0FfT1BUSU9OKTsKLQlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9NTUNCX09QVElPTik7Ci0JX19yYXdfd3JpdGVsKCgxIDw8IDI4KSwgUzVQX1BBRF9SRVRfRUJJQV9PUFRJT04pOwotCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX0VCSUJfT1BUSU9OKTsKLQotCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNF9jb3JlX3NhdmUsIEFSUkFZX1NJWkUoZXh5bm9zNF9jb3JlX3NhdmUpKTsKLQotCWV4eW5vczRfcmVzdG9yZV9wbGwoKTsKLQotCWV4eW5vczRfc2N1X2VuYWJsZShTNVBfVkFfU0NVKTsKLQotI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCi0JczNjX3BtX2RvX3Jlc3RvcmVfY29yZShleHlub3M0X2wyY2Nfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2wyY2Nfc2F2ZSkpOwotCW91dGVyX2ludl9hbGwoKTsKLQkvKiBlbmFibGUgTDJYMCovCi0Jd3JpdGVsX3JlbGF4ZWQoMSwgUzVQX1ZBX0wyQ0MgKyBMMlgwX0NUUkwpOwotI2VuZGlmCi0KLWVhcmx5X3dha2V1cDoKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgZXh5bm9zNF9wbV9zeXNjb3JlX29wcyA9IHsKLQkuc3VzcGVuZAk9IGV4eW5vczRfcG1fc3VzcGVuZCwKLQkucmVzdW1lCQk9IGV4eW5vczRfcG1fcmVzdW1lLAotfTsKLQotc3RhdGljIF9faW5pdCBpbnQgZXh5bm9zNF9wbV9zeXNjb3JlX2luaXQodm9pZCkKLXsKLQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmZXh5bm9zNF9wbV9zeXNjb3JlX29wcyk7Ci0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKGV4eW5vczRfcG1fc3lzY29yZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbXUuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhOWViMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvcG11LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BtdS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBFWFlOT1M0MjEwIC0gQ1BVIFBNVShQb3dlciBNYW5hZ2VtZW50IFVuaXQpIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+Ci0jaW5jbHVkZSA8bWFjaC9wbXUuaD4KLQotc3RhdGljIHZvaWQgX19pb21lbSAqc3lzX3Bvd2VyZG93bl9yZWdbXSA9IHsKLQlTNVBfQVJNX0NPUkUwX0xPV1BXUiwKLQlTNVBfRElTX0lSUV9DT1JFMCwKLQlTNVBfRElTX0lSUV9DRU5UUkFMMCwKLQlTNVBfQVJNX0NPUkUxX0xPV1BXUiwKLQlTNVBfRElTX0lSUV9DT1JFMSwKLQlTNVBfRElTX0lSUV9DRU5UUkFMMSwKLQlTNVBfQVJNX0NPTU1PTl9MT1dQV1IsCi0JUzVQX0wyXzBfTE9XUFdSLAotCVM1UF9MMl8xX0xPV1BXUiwKLQlTNVBfQ01VX0FDTEtTVE9QX0xPV1BXUiwKLQlTNVBfQ01VX1NDTEtTVE9QX0xPV1BXUiwKLQlTNVBfQ01VX1JFU0VUX0xPV1BXUiwKLQlTNVBfQVBMTF9TWVNDTEtfTE9XUFdSLAotCVM1UF9NUExMX1NZU0NMS19MT1dQV1IsCi0JUzVQX1ZQTExfU1lTQ0xLX0xPV1BXUiwKLQlTNVBfRVBMTF9TWVNDTEtfTE9XUFdSLAotCVM1UF9DTVVfQ0xLU1RPUF9HUFNfQUxJVkVfTE9XUFdSLAotCVM1UF9DTVVfUkVTRVRfR1BTQUxJVkVfTE9XUFdSLAotCVM1UF9DTVVfQ0xLU1RPUF9DQU1fTE9XUFdSLAotCVM1UF9DTVVfQ0xLU1RPUF9UVl9MT1dQV1IsCi0JUzVQX0NNVV9DTEtTVE9QX01GQ19MT1dQV1IsCi0JUzVQX0NNVV9DTEtTVE9QX0czRF9MT1dQV1IsCi0JUzVQX0NNVV9DTEtTVE9QX0xDRDBfTE9XUFdSLAotCVM1UF9DTVVfQ0xLU1RPUF9MQ0QxX0xPV1BXUiwKLQlTNVBfQ01VX0NMS1NUT1BfTUFVRElPX0xPV1BXUiwKLQlTNVBfQ01VX0NMS1NUT1BfR1BTX0xPV1BXUiwKLQlTNVBfQ01VX1JFU0VUX0NBTV9MT1dQV1IsCi0JUzVQX0NNVV9SRVNFVF9UVl9MT1dQV1IsCi0JUzVQX0NNVV9SRVNFVF9NRkNfTE9XUFdSLAotCVM1UF9DTVVfUkVTRVRfRzNEX0xPV1BXUiwKLQlTNVBfQ01VX1JFU0VUX0xDRDBfTE9XUFdSLAotCVM1UF9DTVVfUkVTRVRfTENEMV9MT1dQV1IsCi0JUzVQX0NNVV9SRVNFVF9NQVVESU9fTE9XUFdSLAotCVM1UF9DTVVfUkVTRVRfR1BTX0xPV1BXUiwKLQlTNVBfVE9QX0JVU19MT1dQV1IsCi0JUzVQX1RPUF9SRVRFTlRJT05fTE9XUFdSLAotCVM1UF9UT1BfUFdSX0xPV1BXUiwKLQlTNVBfTE9HSUNfUkVTRVRfTE9XUFdSLAotCVM1UF9PTkVOQU5EX01FTV9MT1dQV1IsCi0JUzVQX01PRElNSUZfTUVNX0xPV1BXUiwKLQlTNVBfRzJEX0FDUF9NRU1fTE9XUFdSLAotCVM1UF9VU0JPVEdfTUVNX0xPV1BXUiwKLQlTNVBfSFNNTUNfTUVNX0xPV1BXUiwKLQlTNVBfQ1NTWVNfTUVNX0xPV1BXUiwKLQlTNVBfU0VDU1NfTUVNX0xPV1BXUiwKLQlTNVBfUENJRV9NRU1fTE9XUFdSLAotCVM1UF9TQVRBX01FTV9MT1dQV1IsCi0JUzVQX1BBRF9SRVRFTlRJT05fRFJBTV9MT1dQV1IsCi0JUzVQX1BBRF9SRVRFTlRJT05fTUFVRElPX0xPV1BXUiwKLQlTNVBfUEFEX1JFVEVOVElPTl9HUElPX0xPV1BXUiwKLQlTNVBfUEFEX1JFVEVOVElPTl9VQVJUX0xPV1BXUiwKLQlTNVBfUEFEX1JFVEVOVElPTl9NTUNBX0xPV1BXUiwKLQlTNVBfUEFEX1JFVEVOVElPTl9NTUNCX0xPV1BXUiwKLQlTNVBfUEFEX1JFVEVOVElPTl9FQklBX0xPV1BXUiwKLQlTNVBfUEFEX1JFVEVOVElPTl9FQklCX0xPV1BXUiwKLQlTNVBfUEFEX1JFVEVOVElPTl9JU09MQVRJT05fTE9XUFdSLAotCVM1UF9QQURfUkVURU5USU9OX0FMVl9TRUxfTE9XUFdSLAotCVM1UF9YVVNCWFRJX0xPV1BXUiwKLQlTNVBfWFhUSV9MT1dQV1IsCi0JUzVQX0VYVF9SRUdVTEFUT1JfTE9XUFdSLAotCVM1UF9HUElPX01PREVfTE9XUFdSLAotCVM1UF9HUElPX01PREVfTUFVRElPX0xPV1BXUiwKLQlTNVBfQ0FNX0xPV1BXUiwKLQlTNVBfVFZfTE9XUFdSLAotCVM1UF9NRkNfTE9XUFdSLAotCVM1UF9HM0RfTE9XUFdSLAotCVM1UF9MQ0QwX0xPV1BXUiwKLQlTNVBfTENEMV9MT1dQV1IsCi0JUzVQX01BVURJT19MT1dQV1IsCi0JUzVQX0dQU19MT1dQV1IsCi0JUzVQX0dQU19BTElWRV9MT1dQV1IsCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN5c19wb3dlcmRvd25fdmFsW11bTlVNX1NZU19QT1dFUkRPV05dID0gewotCS8qIHsgQUZUUiwgTFBBLCBTTEVFUCB9Ki8KLQl7IDAsIDAsIDIgfSwJLyogQVJNX0NPUkUwICovCi0JeyAwLCAwLCAwIH0sCS8qIEFSTV9ESVNfSVJRX0NPUkUwICovCi0JeyAwLCAwLCAwIH0sCS8qIEFSTV9ESVNfSVJRX0NFTlRSQUwwICovCi0JeyAwLCAwLCAyIH0sCS8qIEFSTV9DT1JFMSAqLwotCXsgMCwgMCwgMCB9LAkvKiBBUk1fRElTX0lSUV9DT1JFMSAqLwotCXsgMCwgMCwgMCB9LAkvKiBBUk1fRElTX0lSUV9DRU5UUkFMMSAqLwotCXsgMCwgMCwgMiB9LAkvKiBBUk1fQ09NTU9OICovCi0JeyAyLCAyLCAzIH0sCS8qIEFSTV9DUFVfTDJfMCAqLwotCXsgMiwgMiwgMyB9LAkvKiBBUk1fQ1BVX0wyXzEgKi8KLQl7IDEsIDAsIDAgfSwJLyogQ01VX0FDTEtTVE9QICovCi0JeyAxLCAwLCAwIH0sCS8qIENNVV9TQ0xLU1RPUCAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfUkVTRVQgKi8KLQl7IDEsIDAsIDAgfSwJLyogQVBMTF9TWVNDTEsgKi8KLQl7IDEsIDAsIDAgfSwJLyogTVBMTF9TWVNDTEsgKi8KLQl7IDEsIDAsIDAgfSwJLyogVlBMTF9TWVNDTEsgKi8KLQl7IDEsIDEsIDAgfSwJLyogRVBMTF9TWVNDTEsgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX0NMS1NUT1BfR1BTX0FMSVZFICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9SRVNFVF9HUFNfQUxJVkUgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX0NMS1NUT1BfQ0FNICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9DTEtTVE9QX1RWICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9DTEtTVE9QX01GQyAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfQ0xLU1RPUF9HM0QgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX0NMS1NUT1BfTENEMCAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfQ0xLU1RPUF9MQ0QxICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9DTEtTVE9QX01BVURJTyAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfQ0xLU1RPUF9HUFMgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX1JFU0VUX0NBTSAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfUkVTRVRfVFYgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX1JFU0VUX01GQyAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfUkVTRVRfRzNEICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9SRVNFVF9MQ0QwICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9SRVNFVF9MQ0QxICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9SRVNFVF9NQVVESU8gKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX1JFU0VUX0dQUyAqLwotCXsgMywgMCwgMCB9LAkvKiBUT1BfQlVTICovCi0JeyAxLCAwLCAxIH0sCS8qIFRPUF9SRVRFTlRJT04gKi8KLQl7IDMsIDAsIDMgfSwJLyogVE9QX1BXUiAqLwotCXsgMSwgMSwgMCB9LAkvKiBMT0dJQ19SRVNFVCAqLwotCXsgMywgMCwgMCB9LAkvKiBPTkVOQU5EX01FTSAqLwotCXsgMywgMCwgMCB9LAkvKiBNT0RJTUlGX01FTSAqLwotCXsgMywgMCwgMCB9LAkvKiBHMkRfQUNQX01FTSAqLwotCXsgMywgMCwgMCB9LAkvKiBVU0JPVEdfTUVNICovCi0JeyAzLCAwLCAwIH0sCS8qIEhTTU1DX01FTSAqLwotCXsgMywgMCwgMCB9LAkvKiBDU1NZU19NRU0gKi8KLQl7IDMsIDAsIDAgfSwJLyogU0VDU1NfTUVNICovCi0JeyAzLCAwLCAwIH0sCS8qIFBDSUVfTUVNICovCi0JeyAzLCAwLCAwIH0sCS8qIFNBVEFfTUVNICovCi0JeyAxLCAwLCAwIH0sCS8qIFBBRF9SRVRFTlRJT05fRFJBTSAqLwotCXsgMSwgMSwgMCB9LAkvKiBQQURfUkVURU5USU9OX01BVURJTyAqLwotCXsgMSwgMCwgMCB9LAkvKiBQQURfUkVURU5USU9OX0dQSU8gKi8KLQl7IDEsIDAsIDAgfSwJLyogUEFEX1JFVEVOVElPTl9VQVJUICovCi0JeyAxLCAwLCAwIH0sCS8qIFBBRF9SRVRFTlRJT05fTU1DQSAqLwotCXsgMSwgMCwgMCB9LAkvKiBQQURfUkVURU5USU9OX01NQ0IgKi8KLQl7IDEsIDAsIDAgfSwJLyogUEFEX1JFVEVOVElPTl9FQklBICovCi0JeyAxLCAwLCAwIH0sCS8qIFBBRF9SRVRFTlRJT05fRUJJQiAqLwotCXsgMSwgMCwgMCB9LAkvKiBQQURfUkVURU5USU9OX0lTT0xBVElPTiAqLwotCXsgMSwgMCwgMCB9LAkvKiBQQURfUkVURU5USU9OX0FMVl9TRUwgKi8KLQl7IDEsIDEsIDAgfSwJLyogWFVTQlhUSSAqLwotCXsgMSwgMSwgMCB9LAkvKiBYWFRJICovCi0JeyAxLCAxLCAwIH0sCS8qIEVYVF9SRUdVTEFUT1IgKi8KLQl7IDEsIDAsIDAgfSwJLyogR1BJT19NT0RFICovCi0JeyAxLCAxLCAwIH0sCS8qIEdQSU9fTU9ERV9NQVVESU8gKi8KLQl7IDcsIDAsIDAgfSwJLyogQ0FNICovCi0JeyA3LCAwLCAwIH0sCS8qIFRWICovCi0JeyA3LCAwLCAwIH0sCS8qIE1GQyAqLwotCXsgNywgMCwgMCB9LAkvKiBHM0QgKi8KLQl7IDcsIDAsIDAgfSwJLyogTENEMCAqLwotCXsgNywgMCwgMCB9LAkvKiBMQ0QxICovCi0JeyA3LCA3LCAwIH0sCS8qIE1BVURJTyAqLwotCXsgNywgMCwgMCB9LAkvKiBHUFMgKi8KLQl7IDcsIDAsIDAgfSwJLyogR1BTX0FMSVZFICovCi19OwotCi12b2lkIGV4eW5vczRfc3lzX3Bvd2VyZG93bl9jb25mKGVudW0gc3lzX3Bvd2VyZG93biBtb2RlKQotewotCXVuc2lnbmVkIGludCBjb3VudCA9IEFSUkFZX1NJWkUoc3lzX3Bvd2VyZG93bl9yZWcpOwotCi0JZm9yICg7IGNvdW50ID4gMDsgY291bnQtLSkKLQkJX19yYXdfd3JpdGVsKHN5c19wb3dlcmRvd25fdmFsW2NvdW50IC0gMV1bbW9kZV0sCi0JCQkJc3lzX3Bvd2VyZG93bl9yZWdbY291bnQgLSAxXSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtc2RoY2kuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1zZGhjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTgzZjhjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1zZGhjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLXNkaGNpLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0IC0gSGVscGVyIGZ1bmN0aW9ucyBmb3Igc2V0dGlnbiB1cCBTREhDSSBkZXZpY2UocykgKEhTTU1DKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNkaGNpLmg+Ci0KLS8qIGNsb2NrIHNvdXJjZXMgZm9yIHRoZSBtbWMgYnVzIGNsb2NrLCBvcmRlciBhcyBmb3IgdGhlIGN0cmwyWzUuLjRdICovCi0KLWNoYXIgKmV4eW5vczRfaHNtbWNfY2xrc3Jjc1s0XSA9IHsKLQlbMF0gPSBOVUxMLAotCVsxXSA9IE5VTEwsCi0JWzJdID0gInNjbGtfbW1jIiwJLyogbW1jX2J1cyAqLwotCVszXSA9IE5VTEwsCi19OwotCi12b2lkIGV4eW5vczRfc2V0dXBfc2RoY2lfY2ZnX2NhcmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKnIsCi0JCQkJICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCi17Ci0JdTMyIGN0cmwyLCBjdHJsMzsKLQotCS8qIGRvbid0IG5lZWQgdG8gYWx0ZXIgYW55dGhpbmcgYWNjb3JkaW5nIHRvIGNhcmQtdHlwZSAqLwotCi0JY3RybDIgPSByZWFkbChyICsgUzNDX1NESENJX0NPTlRST0wyKTsKLQotCS8qIHNlbGVjdCBiYXNlIGNsb2NrIHNvdXJjZSB0byBIQ0xLICovCi0KLQljdHJsMiAmPSBTM0NfU0RIQ0lfQ1RSTDJfU0VMQkFTRUNMS19NQVNLOwotCi0JLyoKLQkgKiBjbGVhciBhc3luYyBtb2RlLCBlbmFibGUgY29uZmxpY3QgbWFzaywgcnggZmVlZGJhY2sgY3RybCwgU0QKLQkgKiBjbGsgaG9sZCBhbmQgbm8gdXNlIGRlYm91bmNlIGNvdW50Ci0JICovCi0KLQljdHJsMiB8PSAoUzNDNjRYWF9TREhDSV9DVFJMMl9FTlNUQUFTWU5DQ0xSIHwKLQkJICBTM0M2NFhYX1NESENJX0NUUkwyX0VOQ01EQ05GTVNLIHwKLQkJICBTM0NfU0RIQ0lfQ1RSTDJfRU5GQkNMS1JYIHwKLQkJICBTM0NfU0RIQ0lfQ1RSTDJfREZDTlRfTk9ORSB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0VOQ0xLT1VUSE9MRCk7Ci0KLQkvKiBUeCBhbmQgUnggZmVlZGJhY2sgY2xvY2sgZGVsYXkgY29udHJvbCAqLwotCi0JaWYgKGlvcy0+Y2xvY2sgPCAyNSAqIDEwMDAwMDApCi0JCWN0cmwzID0gKFMzQ19TREhDSV9DVFJMM19GQ1NFTDMgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDIgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDEgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCWVsc2UKLQkJY3RybDMgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8IFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCi0Jd3JpdGVsKGN0cmwyLCByICsgUzNDX1NESENJX0NPTlRST0wyKTsKLQl3cml0ZWwoY3RybDMsIHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDMpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NsZWVwLlMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2xlZXAuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk4NDA3OC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2xlZXAuUworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zbGVlcC5TCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQyMTAgcG93ZXIgTWFuYWdlciAoU3VzcGVuZC1Uby1SQU0pIHN1cHBvcnQKLSAqIEJhc2VkIG9uIFMzQzI0MTAgc2xlZXAgY29kZSBieToKLSAqCUJlbiBEb29rcywgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKgotICogQmFzZWQgb24gUFhBL1NBMTEwMCBzbGVlcCBjb2RlIGJ5OgotICoJTmljb2xhcyBQaXRyZSwgKGMpIDIwMDIgTW9udGEgVmlzdGEgU29mdHdhcmUgSW5jCi0gKglDbGlmZiBCcmFrZSwgKGMpIDIwMDEKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+Ci0KLQkudGV4dAotCi0JLyoKLQkgKiBzbGVlcCBtYWdpYywgdG8gYWxsb3cgdGhlIGJvb3Rsb2FkZXIgdG8gY2hlY2sgZm9yIGFuIHZhbGlkCi0JICogaW1hZ2UgdG8gcmVzdW1lIHRvLiBNdXN0IGJlIHRoZSBmaXJzdCB3b3JkIGJlZm9yZSB0aGUKLQkgKiBzM2NfY3B1X3Jlc3VtZSBlbnRyeS4KLQkgKi8KLQotCS53b3JkCTB4MmJlZGYwMGQKLQotCS8qCi0JICogczNjX2NwdV9yZXN1bWUKLQkgKgotCSAqIHJlc3VtZSBjb2RlIGVudHJ5IGZvciBib290bG9hZGVyIHRvIGNhbGwKLQkgKgotCSAqIHdlIG11c3QgcHV0IHRoaXMgY29kZSBoZXJlIGluIHRoZSBkYXRhIHNlZ21lbnQgYXMgd2UgaGF2ZSBubwotCSAqIG90aGVyIHdheSBvZiByZXN0b3JpbmcgdGhlIHN0YWNrIHBvaW50ZXIgYWZ0ZXIgc2xlZXAsIGFuZCB3ZQotCSAqIG11c3Qgbm90IHdyaXRlIHRvIHRoZSBjb2RlIHNlZ21lbnQgKGNvZGUgaXMgcmVhZC1vbmx5KQotCSAqLwotCi1FTlRSWShzM2NfY3B1X3Jlc3VtZSkKLQliCWNwdV9yZXN1bWUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1ody5jCmluZGV4IDIwNmZmMmYuLmQ1ZjE3ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYwpAQCAtODUsNyArODUsNyBAQAogCiBNQUNISU5FX1NUQVJUKENBVFMsICJDaGFsaWNlLUNBVFMiKQogCS8qIE1haW50YWluZXI6IFBoaWxpcCBCbHVuZGVsbCAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnNvZnRfcmVib290CT0gMSwKIAkuZml4dXAJCT0gZml4dXBfY2F0cywKIAkubWFwX2lvCQk9IGZvb3RicmlkZ2VfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LmMKaW5kZXggMmVmNjlmZi4uMDEyMjEwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoRUJTQTI4NSwgIkVCU0EyODUiKQogCS8qIE1haW50YWluZXI6IFJ1c3NlbGwgS2luZyAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnZpZGVvX3N0YXJ0CT0gMHgwMDBhMDAwMCwKIAkudmlkZW9fZW5kCT0gMHgwMDBiZmZmZiwKIAkubWFwX2lvCQk9IGZvb3RicmlkZ2VfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDFiZTJlZWIuLmU1YWNkZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTE1LDcgKzE1LDcgQEAKIAogI2lmbmRlZiBDT05GSUdfREVCVUdfREMyMTI4NV9QT1JUCiAJLyogRm9yIE5ldFdpbmRlciBkZWJ1Z2dpbmcgKi8KLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHgwMDAwMDNmOAogCQlvcnIJXHJ2LCBccnAsICMweGZmMDAwMDAwCUAgdmlydHVhbAogCQlvcnIJXHJwLCBccnAsICMweDdjMDAwMDAwCUAgcGh5c2ljYWwKQEAgLTMxLDcgKzMxLDcgQEAKIAkJLmVxdQlkYzIxMjg1X2hpZ2gsIEFSTUNTUl9CQVNFICYgMHhmZjAwMDAwMAogCQkuZXF1CWRjMjEyODVfbG93LCAgQVJNQ1NSX0JBU0UgJiAweDAwZmZmZmZmCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQkuaWYJZGMyMTI4NV9sb3cKIAkJbW92CVxycCwgI2RjMjEyODVfbG93CiAJCS5lbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLWh3LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLWh3LmMKaW5kZXggMGY3YWVmZi4uMGQzODQ2ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTkVUV0lOREVSLCAiUmViZWwtTmV0V2luZGVyIikKIAkvKiBNYWludGFpbmVyOiBSdXNzZWxsIEtpbmcvUmViZWwuY29tICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkudmlkZW9fc3RhcnQJPSAweDAwMGEwMDAwLAogCS52aWRlb19lbmQJPSAweDAwMGJmZmZmLAogCS5yZXNlcnZlX2xwMAk9IDEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC5jCmluZGV4IDMyODVlOTEuLmY0MWRiYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUEVSU09OQUxfU0VSVkVSLCAiQ29tcGFxLVBlcnNvbmFsU2VydmVyIikKIAkvKiBNYWludGFpbmVyOiBKYW1leSBIaWNrcyAvIEdlb3JnZSBGcmFuY2UgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZm9vdGJyaWRnZV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZm9vdGJyaWRnZV9pbml0X2lycSwKIAkudGltZXIJCT0gJmZvb3RicmlkZ2VfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC1uYXM0MjIwYi5jIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtbmFzNDIyMGIuYwppbmRleCAwY2Y3YTA3Li41OTI3ZDNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC1uYXM0MjIwYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLW5hczQyMjBiLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKE5BUzQyMjBCLCAiUmFpZHNvbmljIE5BUyBJQi00MjIwLUIiKQotCS5ib290X3BhcmFtcwk9IDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZ2VtaW5pX21hcF9pbywKIAkuaW5pdF9pcnEJPSBnZW1pbmlfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpYjQyMjBiX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtcnV0MXh4LmMgYi9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC1ydXQxeHguYwppbmRleCA0ZmEwOWFmLi5jZDc0MzdhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC1ydXQxeHguYworKysgYi9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC1ydXQxeHguYwpAQCAtODYsNyArODYsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFJVVDEwMCwgIlRlbHRvbmlrYSBSVVQxMDAiKQotCS5ib290X3BhcmFtcwk9IDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZ2VtaW5pX21hcF9pbywKIAkuaW5pdF9pcnEJPSBnZW1pbmlfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZydXQxeHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC13YmQxMTEuYyBiL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLXdiZDExMS5jCmluZGV4IDg4Y2M0MjIuLmEzNjc4ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLXdiZDExMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLXdiZDExMS5jCkBAIC0xMjksNyArMTI5LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChXQkQxMTEsICJXaWxpYm9hcmQgV0JELTExMSIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBnZW1pbmlfbWFwX2lvLAogCS5pbml0X2lycQk9IGdlbWluaV9pbml0X2lycSwKIAkudGltZXIJCT0gJndiZDExMV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLXdiZDIyMi5jIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtd2JkMjIyLmMKaW5kZXggM2EyMjAzNC4uZjM4MjgxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtd2JkMjIyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtd2JkMjIyLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFdCRDIyMiwgIldpbGlib2FyZCBXQkQtMjIyIikKLQkuYm9vdF9wYXJhbXMJPSAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGdlbWluaV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZ2VtaW5pX2luaXRfaXJxLAogCS50aW1lcgkJPSAmd2JkMjIyX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWdlbWluaS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBmNDBlMDA2Li44Mzc2NzA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWdlbWluaS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWdlbWluaS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICovCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCi0JLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJbGRyCVxycCwgPUdFTUlOSV9VQVJUX0JBU0UJCQlAIHBoeXNpY2FsCiAJbGRyCVxydiwgPUlPX0FERFJFU1MoR0VNSU5JX1VBUlRfQkFTRSkJQCB2aXJ0dWFsCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWdlbWluaS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDNiYzJjNzAuLjQwYTA1MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTMsMTEgKzEzLDYgQEAKICNkZWZpbmUgX19NQUNIX0dQSU9fSF9fCiAKICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCiAKICNkZWZpbmUgZ3Bpb190b19pcnEoeCkJKCh4KSArIEdQSU9fSVJRX0JBU0UpCiAjZGVmaW5lIGlycV90b19ncGlvKHgpCSgoeCkgLSBHUElPX0lSUV9CQVNFKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTA5MTVmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgU3RvcmxpbmssIENvcnAuCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgUGF1bGl1cyBaYWxlY2thcyA8cGF1bGl1cy56YWxlY2thc0B0ZWx0b25pa2EubHQ+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2lmbmRlZiBfX01BQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19NQUNIX01FTU9SWV9ICi0KLSNpZmRlZiBDT05GSUdfR0VNSU5JX01FTV9TV0FQCi0jIGRlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCi0jZWxzZQotIyBkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDEwMDAwMDAwKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX01BQ0hfTUVNT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDEtZXZhbC5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKaW5kZXggNjVmMWJlYS4uOTg4NmYxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogTUFDSElORV9TVEFSVChINzIwMSwgIkh5bml4IEdNUzMwQzcyMDEiKQogCS8qIE1haW50YWluZXI6IFJvYmVydCBTY2h3ZWJlbCwgUGVuZ3V0cm9uaXggKi8KLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAxMDAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwMCwKIAkubWFwX2lvCQk9IGg3MjB4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBoNzIweF9pbml0X2lycSwKIAkudGltZXIJCT0gJmg3MjAxX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYwppbmRleCA4ODQ1ODRhLi4yODRhMTM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYwpAQCAtNzEsNyArNzEsNyBAQAogCiBNQUNISU5FX1NUQVJUKEg3MjAyLCAiSHluaXggSE1TMzBDNzIwMiIpCiAJLyogTWFpbnRhaW5lcjogUm9iZXJ0IFNjaHdlYmVsLCBQZW5ndXRyb25peCAqLwotCS5ib290X3BhcmFtcwk9IDB4NDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBoNzIweF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaDcyMDJfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZoNzIwMl90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGMyMDkzZTguLjhhNDYxNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTYsNyArMTYsNyBAQAogCQkuZXF1ICAgIGlvX3ZpcnQsIElPX1ZJUlQKIAkJLmVxdSAgICBpb19waHlzLCBJT19QSFlTCiAKLQkJLm1hY3JvICBhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybyAgYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdiAgICAgXHJwLCAjMHgwMDAyMDAwMAlAIFVBUlQxCiAJCWFkZCAgICAgXHJ2LCBccnAsICNpb192aXJ0CUAgdmlydHVhbCBhZGRyZXNzCiAJCWFkZCAgICAgXHJwLCBccnAsICNpb19waHlzCUAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmRjZjUwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAwIEp1bmdqdW4gS2ltCi0gKgotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHg0MDAwMDAwMCkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2OTU4YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACitvYmoteQkJCQkJOj0gY2xvY2subyBoaWdoYmFuay5vIHN5c3RlbS5vCitvYmotJChDT05GSUdfREVCVUdfSElHSEJBTktfVUFSVCkJKz0gbGx1YXJ0Lm8KK29iai0kKENPTkZJR19TTVApCQkJKz0gcGxhdHNtcC5vCitvYmotJChDT05GSUdfTE9DQUxfVElNRVJTKQkJKz0gbG9jYWx0aW1lci5vCitvYmotJChDT05GSUdfSE9UUExVR19DUFUpCQkrPSBob3RwbHVnLm8KK29iai0kKENPTkZJR19QTV9TTEVFUCkJCQkrPSBwbS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlOTY2MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxIEBACit6cmVsYWRkci15CTo9IDB4MDAwMDgwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjVhMmFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9jbG9jay5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBDYWx4ZWRhLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CisKK3N0cnVjdCBjbGsgeworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKK307CisKK2ludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7fQorCit1bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cmF0ZTsKK30KKworbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gY2xrLT5yYXRlOworfQorCitpbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBlY2xrID0geyAucmF0ZSA9IDIwMDAwMDAwMCB9Oworc3RhdGljIHN0cnVjdCBjbGsgcGNsayA9IHsgLnJhdGUgPSAxNTAwMDAwMDAgfTsKKworc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKKwl7IC5jbGsgPSAmcGNsaywgLmNvbl9pZCA9ICJhcGJfcGNsayIsIH0sCisJeyAuY2xrID0gJnBjbGssIC5kZXZfaWQgPSAic3A4MDQiLCB9LAorCXsgLmNsayA9ICZlY2xrLCAuZGV2X2lkID0gImZmZTBlMDAwLnNkaGNpIiwgfSwKKwl7IC5jbGsgPSAmcGNsaywgLmRldl9pZCA9ICJmZmYzNjAwMC5zZXJpYWwiLCB9LAorfTsKKwordm9pZCBfX2luaXQgaGlnaGJhbmtfY2xvY2tzX2luaXQodm9pZCkKK3sKKwljbGtkZXZfYWRkX3RhYmxlKGxvb2t1cHMsIEFSUkFZX1NJWkUobG9va3VwcykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9jb3JlLmggYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTMzZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9jb3JlLmgKQEAgLTAsMCArMSw5IEBACitleHRlcm4gdm9pZCBoaWdoYmFua19zZXRfY3B1X2p1bXAoaW50IGNwdSwgdm9pZCAqanVtcF9hZGRyKTsKK2V4dGVybiB2b2lkIGhpZ2hiYW5rX2Nsb2Nrc19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19pb21lbSAqc2N1X2Jhc2VfYWRkcjsKKyNpZmRlZiBDT05GSUdfREVCVUdfSElHSEJBTktfVUFSVAorZXh0ZXJuIHZvaWQgaGlnaGJhbmtfbGx1YXJ0X21hcF9pbyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgaGlnaGJhbmtfbGx1YXJ0X21hcF9pbyh2b2lkKSB7fQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaGlnaGJhbmsuYyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaGlnaGJhbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODJkY2YwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9oaWdoYmFuay5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAtMjAxMSBDYWx4ZWRhLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3VuaWZpZWQuaD4KKyNpbmNsdWRlIDxhc20vc21wX3NjdS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hcm1fdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvdGltZXItc3AuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgInN5c3JlZ3MuaCIKKwordm9pZCBfX2lvbWVtICpzcmVnc19iYXNlOworCisjZGVmaW5lIEhCX1NDVV9WSVJUX0JBU0UJMHhmZWUwMDAwMAordm9pZCBfX2lvbWVtICpzY3VfYmFzZV9hZGRyID0gKCh2b2lkIF9faW9tZW0gKikoSEJfU0NVX1ZJUlRfQkFTRSkpOworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHNjdV9pb19kZXNjIF9faW5pdGRhdGEgPSB7CisJLnZpcnR1YWwJPSBIQl9TQ1VfVklSVF9CQVNFLAorCS5wZm4JCT0gMCwgLyogcnVuLXRpbWUgKi8KKwkubGVuZ3RoCQk9IFNaXzRLLAorCS50eXBlCQk9IE1UX0RFVklDRSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoaWdoYmFua19zY3VfbWFwX2lvKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCisJLyogR2V0IFNDVSBiYXNlICovCisJYXNtKCJtcmMgcDE1LCA0LCAlMCwgYzE1LCBjMCwgMCIgOiAiPXIiIChiYXNlKSk7CisKKwlzY3VfaW9fZGVzYy5wZm4gPSBfX3BoeXNfdG9fcGZuKGJhc2UpOworCWlvdGFibGVfaW5pdCgmc2N1X2lvX2Rlc2MsIDEpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaGlnaGJhbmtfbWFwX2lvKHZvaWQpCit7CisJaGlnaGJhbmtfc2N1X21hcF9pbygpOworCWhpZ2hiYW5rX2xsdWFydF9tYXBfaW8oKTsKK30KKworI2RlZmluZSBIQl9KVU1QX1RBQkxFX1BIWVMoY3B1KQkJKDB4NDAgKyAoMHgxMCAqIChjcHUpKSkKKyNkZWZpbmUgSEJfSlVNUF9UQUJMRV9WSVJUKGNwdSkJCXBoeXNfdG9fdmlydChIQl9KVU1QX1RBQkxFX1BIWVMoY3B1KSkKKwordm9pZCBoaWdoYmFua19zZXRfY3B1X2p1bXAoaW50IGNwdSwgdm9pZCAqanVtcF9hZGRyKQoreworCXdyaXRlbChCU1lNKHZpcnRfdG9fcGh5cyhqdW1wX2FkZHIpKSwgSEJfSlVNUF9UQUJMRV9WSVJUKGNwdSkpOworCV9fY3B1Y19mbHVzaF9kY2FjaGVfYXJlYShIQl9KVU1QX1RBQkxFX1ZJUlQoY3B1KSwgMTYpOworCW91dGVyX2NsZWFuX3JhbmdlKEhCX0pVTVBfVEFCTEVfUEhZUyhjcHUpLAorCQkJICBIQl9KVU1QX1RBQkxFX1BIWVMoY3B1KSArIDE1KTsKK30KKworY29uc3Qgc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgaXJxX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE5LWdpYyIsIC5kYXRhID0gZ2ljX29mX2luaXQsIH0sCisJe30KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoaWdoYmFua19pbml0X2lycSh2b2lkKQoreworCW9mX2lycV9pbml0KGlycV9tYXRjaCk7CisJbDJ4MF9vZl9pbml0KDAsIH4wVUwpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaGlnaGJhbmtfdGltZXJfaW5pdCh2b2lkKQoreworCWludCBpcnE7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwl2b2lkIF9faW9tZW0gKnRpbWVyX2Jhc2U7CisKKwkvKiBNYXAgc3lzdGVtIHJlZ2lzdGVycyAqLworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImNhbHhlZGEsaGItc3JlZ3MiKTsKKwlzcmVnc19iYXNlID0gb2ZfaW9tYXAobnAsIDApOworCVdBUk5fT04oIXNyZWdzX2Jhc2UpOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiYXJtLHNwODA0Iik7CisJdGltZXJfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlXQVJOX09OKCF0aW1lcl9iYXNlKTsKKwlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisKKwloaWdoYmFua19jbG9ja3NfaW5pdCgpOworCisJc3A4MDRfY2xvY2tzb3VyY2VfaW5pdCh0aW1lcl9iYXNlICsgMHgyMCwgInRpbWVyMSIpOworCXNwODA0X2Nsb2NrZXZlbnRzX2luaXQodGltZXJfYmFzZSwgaXJxLCAidGltZXIwIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIGhpZ2hiYW5rX3RpbWVyID0geworCS5pbml0ID0gaGlnaGJhbmtfdGltZXJfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIGhpZ2hiYW5rX3Bvd2VyX29mZih2b2lkKQoreworCWhpZ25iYW5rX3NldF9wd3Jfc2h1dGRvd24oKTsKKwlzY3VfcG93ZXJfbW9kZShzY3VfYmFzZV9hZGRyLCBTQ1VfUE1fUE9XRVJPRkYpOworCisJd2hpbGUgKDEpCisJCWNwdV9kb19pZGxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoaWdoYmFua19pbml0KHZvaWQpCit7CisJcG1fcG93ZXJfb2ZmID0gaGlnaGJhbmtfcG93ZXJfb2ZmOworCisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb2ZfZGVmYXVsdF9idXNfbWF0Y2hfdGFibGUsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqaGlnaGJhbmtfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwkiY2FseGVkYSxoaWdoYmFuayIsCisJTlVMTCwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoSElHSEJBTkssICJIaWdoYmFuayIpCisJLm1hcF9pbwkJPSBoaWdoYmFua19tYXBfaW8sCisJLmluaXRfaXJxCT0gaGlnaGJhbmtfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZoaWdoYmFua190aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gaGlnaGJhbmtfaW5pdCwKKwkuZHRfY29tcGF0CT0gaGlnaGJhbmtfbWF0Y2gsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9ob3RwbHVnLmMgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzdjZWJiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9ob3RwbHVnLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIENhbHhlZGEsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgPGFzbS9zbXBfc2N1Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKworZXh0ZXJuIHZvaWQgc2Vjb25kYXJ5X3N0YXJ0dXAodm9pZCk7CisKK2ludCBwbGF0Zm9ybV9jcHVfa2lsbCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiAxOworfQorCisvKgorICogcGxhdGZvcm0tc3BlY2lmaWMgY29kZSB0byBzaHV0ZG93biBhIENQVQorICoKKyAqLwordm9pZCBwbGF0Zm9ybV9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJZmx1c2hfY2FjaGVfYWxsKCk7CisKKwloaWdoYmFua19zZXRfY3B1X2p1bXAoY3B1LCBzZWNvbmRhcnlfc3RhcnR1cCk7CisJc2N1X3Bvd2VyX21vZGUoc2N1X2Jhc2VfYWRkciwgU0NVX1BNX1BPV0VST0ZGKTsKKworCWNwdV9kb19pZGxlKCk7CisKKwkvKiBXZSBzaG91bGQgbmV2ZXIgcmV0dXJuIGZyb20gaWRsZSAqLworCXBhbmljKCJoaWdoYmFuazogY3B1ICVkIHVuZXhwZWN0ZWRseSBleGl0IGZyb20gc2h1dGRvd25cbiIsIGNwdSk7Cit9CisKK2ludCBwbGF0Zm9ybV9jcHVfZGlzYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qCisJICogQ1BVMCBzaG91bGQgbm90IGJlIHNodXQgZG93biB2aWEgaG90cGx1Zy4gIGNwdV9pZGxlIGNhbiBXRkkKKwkgKiBvciBhIHByb3BlciBzaHV0ZG93biBvciBoaWJlcm5hdGUgc2hvdWxkIGJlIHVzZWQuCisJICovCisJcmV0dXJuIGNwdSA9PSAwID8gLUVQRVJNIDogMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNTdmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBEZWJ1Z2dpbmcgbWFjcm8gaW5jbHVkZSBoZWFkZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTkgUnVzc2VsbCBLaW5nCisgKiAgTW92ZWQgZnJvbSBsaW51eC9hcmNoL2FybS9rZXJuZWwvZGVidWcuUyBieSBCZW4gRG9va3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKwkJLm1hY3JvCWFkZHJ1YXJ0LHJwLHJ2LHRtcAorCQltb3Z3CVxydiwgIzB4NjAwMAorCQltb3Z0CVxydiwgIzB4ZmVlMworCQltb3Z3CVxycCwgIzB4NjAwMAorCQltb3Z0CVxycCwgIzB4ZmZmMworCQkuZW5kbQorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYnVnLXBsMDF4LlM+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2MxMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMCwwICsxLDcgQEAKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZW50cnktbWFjcm8tZ2ljLlM+CisKKwkubWFjcm8JZGlzYWJsZV9maXEKKwkuZW5kbQorCisJLm1hY3JvCWFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKKwkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL2dwaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9mdHJhY2UuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvZ3Bpby5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGNmYTNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvaW8uaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX19NQUNIX0lPX0gKKyNkZWZpbmUgX19NQUNIX0lPX0gKKworI2RlZmluZSBfX2lvKGEpCQkoeyAodm9pZCkoYSk7IF9fdHlwZXNhZmVfaW8oMCk7IH0pCisjZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9pcnFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NmFhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19NQUNIX0lSUVNfSAorI2RlZmluZSBfX01BQ0hfSVJRU19ICisKKyNkZWZpbmUgTlJfSVJRUwkJCTE5MgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vZnRyYWNlLmggYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vZnRyYWNlLmgKY29weSB0byBhcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgxOTIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvc3lzdGVtLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwLTIwMTEgQ2FseGVkYSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpZm5kZWYgX19NQUNIX1NZU1RFTV9ICisjZGVmaW5lIF9fTUFDSF9TWVNURU1fSAorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCit7CisJY3B1X2RvX2lkbGUoKTsKK30KKworZXh0ZXJuIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUsIGNvbnN0IGNoYXIgKmNtZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvdGltZXguaCBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkYWM3YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL3RpbWV4LmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9fTUFDSF9USU1FWF9ICisjZGVmaW5lIF9fTUFDSF9USU1FWF9ICisKKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkxMDAwMDAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTIwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9fTUFDSF9VTkNPTVBSRVNTX0gKKyNkZWZpbmUgX19NQUNIX1VOQ09NUFJFU1NfSAorCisjZGVmaW5lIHB1dGMoYykKKyNkZWZpbmUgZmx1c2goKQorI2RlZmluZSBhcmNoX2RlY29tcF9zZXR1cCgpCisjZGVmaW5lIGFyY2hfZGVjb21wX3dkb2coKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaCBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTY5ZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCkBAIC0wLDAgKzEgQEAKKyNkZWZpbmUgVk1BTExPQ19FTkQJCTB4RkVFMDAwMDBVTApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9sbHVhcnQuYyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvbGx1YXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxNTc1MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvbGx1YXJ0LmMKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIENhbHhlZGEsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNkZWZpbmUgSEJfREVCVUdfTExfUEhZU19CQVNFCTB4ZmZmMzYwMDAKKyNkZWZpbmUgSEJfREVCVUdfTExfVklSVF9CQVNFCTB4ZmVlMzYwMDAKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBsbHVhcnRfaW9fZGVzYyBfX2luaXRkYXRhID0geworCS52aXJ0dWFsCT0gSEJfREVCVUdfTExfVklSVF9CQVNFLAorCS5wZm4JCT0gX19waHlzX3RvX3BmbihIQl9ERUJVR19MTF9QSFlTX0JBU0UpLAorCS5sZW5ndGgJCT0gU1pfNEssCisJLnR5cGUJCT0gTVRfREVWSUNFLAorfTsKKwordm9pZCBfX2luaXQgaGlnaGJhbmtfbGx1YXJ0X21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdCgmbGx1YXJ0X2lvX2Rlc2MsIDEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9sb2NhbHRpbWVyLmMgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2xvY2FsdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTAwZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9sb2NhbHRpbWVyLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwLTIwMTEgQ2FseGVkYSwgSW5jLgorICogQmFzZWQgb24gbG9jYWx0aW1lci5jLCBDb3B5cmlnaHQgKEMpIDIwMDIgQVJNIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9zbXBfdHdkLmg+CisKKy8qCisgKiBTZXR1cCB0aGUgbG9jYWwgY2xvY2sgZXZlbnRzIGZvciBhIENQVS4KKyAqLworaW50IF9fY3B1aW5pdCBsb2NhbF90aW1lcl9zZXR1cChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImFybSxzbXAtdHdkIik7CisJaWYgKCF0d2RfYmFzZSkgeworCQl0d2RfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwkJV0FSTl9PTighdHdkX2Jhc2UpOworCX0KKwlldnQtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwl0d2RfdGltZXJfc2V0dXAoZXZ0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9wbGF0c21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxMzY0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvcGxhdHNtcC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMC0yMDExIENhbHhlZGEsIEluYy4KKyAqIEJhc2VkIG9uIHBsYXRzbXAuYywgQ29weXJpZ2h0IChDKSAyMDAyIEFSTSBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL3NtcF9zY3UuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisKK2V4dGVybiB2b2lkIHNlY29uZGFyeV9zdGFydHVwKHZvaWQpOworCit2b2lkIF9fY3B1aW5pdCBwbGF0Zm9ybV9zZWNvbmRhcnlfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWdpY19zZWNvbmRhcnlfaW5pdCgwKTsKK30KKworaW50IF9fY3B1aW5pdCBib290X3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCit7CisJZ2ljX3JhaXNlX3NvZnRpcnEoY3B1bWFza19vZihjcHUpLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIENQVSBwb3NzaWJsZSBtYXAgZWFybHkgLSB0aGlzIGRlc2NyaWJlcyB0aGUgQ1BVcworICogd2hpY2ggbWF5IGJlIHByZXNlbnQgb3IgYmVjb21lIHByZXNlbnQgaW4gdGhlIHN5c3RlbS4KKyAqLwordm9pZCBfX2luaXQgc21wX2luaXRfY3B1cyh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBuY29yZXM7CisKKwluY29yZXMgPSBzY3VfZ2V0X2NvcmVfY291bnQoc2N1X2Jhc2VfYWRkcik7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAobmNvcmVzID4gTlJfQ1BVUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiaGlnaGJhbms6IG5vLiBvZiBjb3JlcyAoJWQpIGdyZWF0ZXIgdGhhbiBjb25maWd1cmVkICIKKwkJICAgICAgICJtYXhpbXVtIG9mICVkIC0gY2xpcHBpbmdcbiIsCisJCSAgICAgICBuY29yZXMsIE5SX0NQVVMpOworCQluY29yZXMgPSBOUl9DUFVTOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuY29yZXM7IGkrKykKKwkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKKworCXNldF9zbXBfY3Jvc3NfY2FsbChnaWNfcmFpc2Vfc29mdGlycSk7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCWludCBpOworCisJc2N1X2VuYWJsZShzY3VfYmFzZV9hZGRyKTsKKworCS8qCisJICogV3JpdGUgdGhlIGFkZHJlc3Mgb2Ygc2Vjb25kYXJ5IHN0YXJ0dXAgaW50byB0aGUganVtcCB0YWJsZQorCSAqIFRoZSBjb3JlcyBhcmUgaW4gd2ZpIGFuZCB3YWl0IHVudGlsIHRoZXkgcmVjZWl2ZSBhIHNvZnQgaW50ZXJydXB0CisJICogYW5kIGEgbm9uLXplcm8gdmFsdWUgdG8ganVtcCB0by4gVGhlbiB0aGUgc2Vjb25kYXJ5IENQVSBicmFuY2hlcworCSAqIHRvIHRoaXMgYWRkcmVzcy4KKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgbWF4X2NwdXM7IGkrKykKKwkJaGlnaGJhbmtfc2V0X2NwdV9qdW1wKGksIHNlY29uZGFyeV9zdGFydHVwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvcG0uYyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2IzYmViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9wbS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBDYWx4ZWRhLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CisjaW5jbHVkZSA8YXNtL3NtcF9zY3UuaD4KKyNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgInN5c3JlZ3MuaCIKKworc3RhdGljIGludCBoaWdoYmFua19zdXNwZW5kX2ZpbmlzaCh1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwljcHVfZG9faWRsZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhpZ2hiYW5rX3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwloaWduYmFua19zZXRfcHdyX3N1c3BlbmQoKTsKKwloaWdoYmFua19zZXRfY3B1X2p1bXAoMCwgY3B1X3Jlc3VtZSk7CisKKwlzY3VfcG93ZXJfbW9kZShzY3VfYmFzZV9hZGRyLCBTQ1VfUE1fUE9XRVJPRkYpOworCWNwdV9zdXNwZW5kKDAsIGhpZ2hiYW5rX3N1c3BlbmRfZmluaXNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGhpZ2hiYW5rX3BtX29wcyA9IHsKKwkuZW50ZXIgPSBoaWdoYmFua19wbV9lbnRlciwKKwkudmFsaWQgPSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaGlnaGJhbmtfcG1faW5pdCh2b2lkKQoreworCXN1c3BlbmRfc2V0X29wcygmaGlnaGJhbmtfcG1fb3BzKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGhpZ2hiYW5rX3BtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9zeXNyZWdzLmggYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL3N5c3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTkxMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9zeXNyZWdzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIENhbHhlZGEsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWZuZGVmIF9NQUNIX0hJR0hCQU5LX19TWVNSRUdTX0hfCisjZGVmaW5lIF9NQUNIX0hJR0hCQU5LX19TWVNSRUdTX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCitleHRlcm4gdm9pZCBfX2lvbWVtICpzcmVnc19iYXNlOworCisjZGVmaW5lIEhCX1NSRUdfQTlfUFdSX1JFUQkJMHhmMDAKKyNkZWZpbmUgSEJfU1JFR19BOV9CT09UX1NUQVQJCTB4ZjA0CisjZGVmaW5lIEhCX1NSRUdfQTlfQk9PVF9EQVRBCQkweGYwOAorCisjZGVmaW5lIEhCX1BXUl9TVVNQRU5ECQkJMAorI2RlZmluZSBIQl9QV1JfU09GVF9SRVNFVAkJMQorI2RlZmluZSBIQl9QV1JfSEFSRF9SRVNFVAkJMgorI2RlZmluZSBIQl9QV1JfU0hVVERPV04JCQkzCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWduYmFua19zZXRfcHdyX3N1c3BlbmQodm9pZCkKK3sKKwl3cml0ZWwoSEJfUFdSX1NVU1BFTkQsIHNyZWdzX2Jhc2UgKyBIQl9TUkVHX0E5X1BXUl9SRVEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlnbmJhbmtfc2V0X3B3cl9zaHV0ZG93bih2b2lkKQoreworCXdyaXRlbChIQl9QV1JfU0hVVERPV04sIHNyZWdzX2Jhc2UgKyBIQl9TUkVHX0E5X1BXUl9SRVEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlnbmJhbmtfc2V0X3B3cl9zb2Z0X3Jlc2V0KHZvaWQpCit7CisJd3JpdGVsKEhCX1BXUl9TT0ZUX1JFU0VULCBzcmVnc19iYXNlICsgSEJfU1JFR19BOV9QV1JfUkVRKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhpZ25iYW5rX3NldF9wd3JfaGFyZF9yZXNldCh2b2lkKQoreworCXdyaXRlbChIQl9QV1JfSEFSRF9SRVNFVCwgc3JlZ3NfYmFzZSArIEhCX1NSRUdfQTlfUFdSX1JFUSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9zeXN0ZW0uYyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvc3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmMGM0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvc3lzdGVtLmMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIENhbHhlZGEsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vc21wX3NjdS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgInN5c3JlZ3MuaCIKKwordm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSwgY29uc3QgY2hhciAqY21kKQoreworCWlmIChtb2RlID09ICdoJykKKwkJaGlnbmJhbmtfc2V0X3B3cl9oYXJkX3Jlc2V0KCk7CisJZWxzZQorCQloaWduYmFua19zZXRfcHdyX3NvZnRfcmVzZXQoKTsKKworCXNjdV9wb3dlcl9tb2RlKHNjdV9iYXNlX2FkZHIsIFNDVV9QTV9QT1dFUk9GRik7CisJY3B1X2RvX2lkbGUoKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcKaW5kZXggMDUxOWRkNy4uNWY3ZjljMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWlteC9LY29uZmlnCkBAIC0xLDEwICsxLDMyIEBACiBjb25maWcgSU1YX0hBVkVfRE1BX1YxCiAJYm9vbAorCitjb25maWcgSEFWRV9JTVhfR1BDCisJYm9vbAorCitjb25maWcgSEFWRV9JTVhfTU1EQworCWJvb2wKKworY29uZmlnIEhBVkVfSU1YX1NSQworCWJvb2wKKwogIwogIyBBUkNIX01YMzEgYW5kIEFSQ0hfTVgzNSBhcmUgbGVmdCBmb3IgY29tcGF0aWJpbGl0eQogIyBTb21lIHVzYWdlcyBhc3N1bWUgdGhhdCBoYXZpbmcgb25lIG9mIHRoZW0gaW1wbGllcyBub3QgaGF2aW5nIChlLmcuKSBBUkNIX01YMi4KICMgVG8gZWFzaWx5IGRpc3Rpbmd1aXNoIGdvb2QgYW5kIHJldmlld2VkIGZyb20gdW5yZXZpZXdlZCB1c2FnZXMgbmV3IChhbmQgSU1ITwogIyBtb3JlIHNlbnNpYmxlKSBuYW1lcyBhcmUgdXNlZDogU09DX0lNWDMxIGFuZCBTT0NfSU1YMzUKK2NvbmZpZyBBUkNIX01YMQorCWJvb2wKKworY29uZmlnIE1BQ0hfTVgyMQorCWJvb2wKKworY29uZmlnIEFSQ0hfTVgyNQorCWJvb2wKKworY29uZmlnIE1BQ0hfTVgyNworCWJvb2wKKwogY29uZmlnIEFSQ0hfTVgzMQogCWJvb2wKIApAQCAtMTMsNiArMzUsNyBAQAogCiBjb25maWcgU09DX0lNWDEKIAlib29sCisJc2VsZWN0IEFSQ0hfTVgxCiAJc2VsZWN0IENQVV9BUk05MjBUCiAJc2VsZWN0IElNWF9IQVZFX0RNQV9WMQogCXNlbGVjdCBJTVhfSEFWRV9JT01VWF9WMQpAQCAtMjAsNiArNDMsNyBAQAogCiBjb25maWcgU09DX0lNWDIxCiAJYm9vbAorCXNlbGVjdCBNQUNIX01YMjEKIAlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgQVJDSF9NWENfQVVETVVYX1YxCiAJc2VsZWN0IElNWF9IQVZFX0RNQV9WMQpAQCAtMjgsNiArNTIsNyBAQAogCiBjb25maWcgU09DX0lNWDI1CiAJYm9vbAorCXNlbGVjdCBBUkNIX01YMjUKIAlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgQVJDSF9NWENfQVVETVVYX1YyCiAJc2VsZWN0IEFSQ0hfTVhDX0lPTVVYX1YzCkBAIC0zNSw2ICs2MCw3IEBACiAKIGNvbmZpZyBTT0NfSU1YMjcKIAlib29sCisJc2VsZWN0IE1BQ0hfTVgyNwogCXNlbGVjdCBDUFVfQVJNOTI2VAogCXNlbGVjdCBBUkNIX01YQ19BVURNVVhfVjEKIAlzZWxlY3QgSU1YX0hBVkVfRE1BX1YxCkBAIC00OCw2ICs3NCw3IEBACiAJc2VsZWN0IEFSQ0hfTVhDX0FVRE1VWF9WMgogCXNlbGVjdCBBUkNIX01YMzEKIAlzZWxlY3QgTVhDX0FWSUMKKwlzZWxlY3QgU01QX09OX1VQIGlmIFNNUAogCiBjb25maWcgU09DX0lNWDM1CiAJYm9vbApAQCAtNTcsOSArODQsMTAgQEAKIAlzZWxlY3QgSEFWRV9FUElUCiAJc2VsZWN0IEFSQ0hfTVgzNQogCXNlbGVjdCBNWENfQVZJQworCXNlbGVjdCBTTVBfT05fVVAgaWYgU01QCiAKIAotaWYgQVJDSF9NWDEKK2lmIEFSQ0hfSU1YX1Y0X1Y1CiAKIGNvbW1lbnQgIk1YMSBwbGF0Zm9ybXM6IgogY29uZmlnIE1BQ0hfTVhMQURTCkBAIC04NywzMCArMTE1LDYgQEAKIAloZWxwCiAJICBTYXkgWWVzIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgQXJtYWRldXMgQVBGOTMyOCBkZXZlbG9wbWVudCBib2FyZAogCi1lbmRpZgotCi1pZiBBUkNIX01YMgotCi1jaG9pY2UKLQlwcm9tcHQgIkNQVXM6IgotCWRlZmF1bHQgTUFDSF9NWDIxCi0KLWNvbmZpZyBNQUNIX01YMjEKLQlib29sICJpLk1YMjEgc3VwcG9ydCIKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgRnJlZXNjYWxlJ3MgTVgyIGJhc2VkIGkuTVgyMSBwcm9jZXNzb3IuCi0KLWNvbmZpZyBNQUNIX01YMjcKLQlib29sICJpLk1YMjcgc3VwcG9ydCIKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgRnJlZXNjYWxlJ3MgTVgyIGJhc2VkIGkuTVgyNyBwcm9jZXNzb3IuCi0KLWVuZGNob2ljZQotCi1lbmRpZgotCi1pZiBNQUNIX01YMjEKLQogY29tbWVudCAiTVgyMSBwbGF0Zm9ybXM6IgogCiBjb25maWcgTUFDSF9NWDIxQURTCkBAIC0xMjQsMTUgKzEyOCwxMiBAQAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBNWDIxQURTIHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCiAJICBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCiAKLWVuZGlmCi0KLWlmIEFSQ0hfTVgyNQotCiBjb21tZW50ICJNWDI1IHBsYXRmb3JtczoiCiAKIGNvbmZpZyBNQUNIX01YMjVfM0RTCiAJYm9vbCAiU3VwcG9ydCBNWDI1UERLICgzRFMpIFBsYXRmb3JtIgogCXNlbGVjdCBTT0NfSU1YMjUKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fRkxFWENBTgogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9GU0xfVVNCMl9VREMKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YMl9XRFQKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YRElfUlRDCkBAIC0xNzQsMTAgKzE3NSw2IEBACiAKIGVuZGNob2ljZQogCi1lbmRpZgotCi1pZiBNQUNIX01YMjcKLQogY29tbWVudCAiTVgyNyBwbGF0Zm9ybXM6IgogCiBjb25maWcgTUFDSF9NWDI3QURTCkBAIC0zNTYsNyArMzUzLDcgQEAKIAogZW5kaWYKIAotaWYgQVJDSF9NWDMKK2lmIEFSQ0hfSU1YX1Y2X1Y3CiAKIGNvbW1lbnQgIk1YMzEgcGxhdGZvcm1zOiIKIApAQCAtNDQ5LDYgKzQ0Niw3IEBACiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lQVV9DT1JFCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX01YQ19FSENJCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX01YQ19NTUMKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX05BTkQKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWAogCXNlbGVjdCBNWENfVUxQSSBpZiBVU0JfVUxQSQpAQCAtNDg1LDYgKzQ4Myw3IEBACiAJYm9vbCAiU3VwcG9ydCBEYXZlL0RFTlggUW9uZ0VWQi1MSVRFIHBsYXRmb3JtIgogCXNlbGVjdCBTT0NfSU1YMzEKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YMl9XRFQKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIERhdmUvREVOWCBRb25nRVZCLUxJVEUgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMKIAkgIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KQEAgLTYwNSw0ICs2MDQsMjAgQEAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgVlBSMjAwIHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCiAJICBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCiAKK2NvbW1lbnQgImkuTVg2IGZhbWlseToiCisKK2NvbmZpZyBTT0NfSU1YNlEKKwlib29sICJpLk1YNiBRdWFkIHN1cHBvcnQiCisJc2VsZWN0IEFSTV9HSUMKKwlzZWxlY3QgQ0FDSEVfTDJYMAorCXNlbGVjdCBDUFVfVjcKKwlzZWxlY3QgSEFWRV9BUk1fU0NVCisJc2VsZWN0IEhBVkVfSU1YX0dQQworCXNlbGVjdCBIQVZFX0lNWF9NTURDCisJc2VsZWN0IEhBVkVfSU1YX1NSQworCXNlbGVjdCBVU0VfT0YKKworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBGcmVlc2NhbGUgaS5NWDYgUXVhZCBwcm9jZXNzb3IuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlCmluZGV4IGU5ZWIzNmQuLmFiYTczMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlCkBAIC0xLDE2ICsxLDE1IEBACiBvYmotJChDT05GSUdfSU1YX0hBVkVfRE1BX1YxKSArPSBkbWEtdjEubwogCi1vYmotJChDT05GSUdfQVJDSF9NWDEpICs9IGNsb2NrLWlteDEubyBtbS1pbXgxLm8KLW9iai0kKENPTkZJR19NQUNIX01YMjEpICs9IGNsb2NrLWlteDIxLm8gbW0taW14MjEubworb2JqLSQoQ09ORklHX1NPQ19JTVgxKSArPSBjbG9jay1pbXgxLm8gbW0taW14MS5vCitvYmotJChDT05GSUdfU09DX0lNWDIxKSArPSBjbG9jay1pbXgyMS5vIG1tLWlteDIxLm8KIAotb2JqLSQoQ09ORklHX0FSQ0hfTVgyNSkgKz0gY2xvY2staW14MjUubyBtbS1pbXgyNS5vIGVoY2ktaW14MjUubworb2JqLSQoQ09ORklHX1NPQ19JTVgyNSkgKz0gY2xvY2staW14MjUubyBtbS1pbXgyNS5vIGVoY2ktaW14MjUubyBjcHUtaW14MjUubwogCi1vYmotJChDT05GSUdfTUFDSF9NWDI3KSArPSBjcHUtaW14MjcubyBwbS1pbXgyNy5vCi1vYmotJChDT05GSUdfTUFDSF9NWDI3KSArPSBjbG9jay1pbXgyNy5vIG1tLWlteDI3Lm8gZWhjaS1pbXgyNy5vCitvYmotJChDT05GSUdfU09DX0lNWDI3KSArPSBjcHUtaW14MjcubyBwbS1pbXgyNy5vCitvYmotJChDT05GSUdfU09DX0lNWDI3KSArPSBjbG9jay1pbXgyNy5vIG1tLWlteDI3Lm8gZWhjaS1pbXgyNy5vCiAKLW9iai0kKENPTkZJR19TT0NfSU1YMzEpICs9IG1tLWlteDMxLm8gY3B1LWlteDMxLm8gY2xvY2staW14MzEubyBpb211eC1pbXgzMS5vIGVoY2ktaW14MzEubwotb2JqLSQoQ09ORklHX1NPQ19JTVgzNSkgKz0gbW0taW14MzUubyBjcHUtaW14MzUubyBjbG9jay1pbXgzNS5vIGVoY2ktaW14MzUubwotb2JqLSQoQ09ORklHX0NBQ0hFX0wyWDApICs9IGNhY2hlLWwyeDAubworb2JqLSQoQ09ORklHX1NPQ19JTVgzMSkgKz0gbW0taW14My5vIGNwdS1pbXgzMS5vIGNsb2NrLWlteDMxLm8gaW9tdXgtaW14MzEubyBlaGNpLWlteDMxLm8KK29iai0kKENPTkZJR19TT0NfSU1YMzUpICs9IG1tLWlteDMubyBjcHUtaW14MzUubyBjbG9jay1pbXgzNS5vIGVoY2ktaW14MzUubwogCiAjIFN1cHBvcnQgZm9yIENNT1Mgc2Vuc29yIGludGVyZmFjZQogb2JqLSQoQ09ORklHX01YMV9WSURFTykgKz0gbXgxLWNhbWVyYS1maXEubyBteDEtY2FtZXJhLWZpcS1rc3ltLm8KQEAgLTYxLDMgKzYwLDE0IEBACiBvYmotJChDT05GSUdfTUFDSF9FVUtSRUFfQ1BVSU1YMzUpICs9IG1hY2gtY3B1aW14MzUubwogb2JqLSQoQ09ORklHX01BQ0hfRVVLUkVBX01CSU1YU0QzNV9CQVNFQk9BUkQpICs9IGV1a3JlYV9tYmlteHNkMzUtYmFzZWJvYXJkLm8KIG9iai0kKENPTkZJR19NQUNIX1ZQUjIwMCkgKz0gbWFjaC12cHIyMDAubworCitvYmotJChDT05GSUdfREVCVUdfTEwpICs9IGxsdWFydC5vCitvYmotJChDT05GSUdfSEFWRV9JTVhfR1BDKSArPSBncGMubworb2JqLSQoQ09ORklHX0hBVkVfSU1YX01NREMpICs9IG1tZGMubworb2JqLSQoQ09ORklHX0hBVkVfSU1YX1NSQykgKz0gc3JjLm8KK29iai0kKENPTkZJR19DUFVfVjcpICs9IGhlYWQtdjcubworQUZMQUdTX2hlYWQtdjcubyA6PS1XYSwtbWFyY2g9YXJtdjctYQorb2JqLSQoQ09ORklHX1NNUCkgKz0gcGxhdHNtcC5vCitvYmotJChDT05GSUdfSE9UUExVR19DUFUpICs9IGhvdHBsdWcubworb2JqLSQoQ09ORklHX0xPQ0FMX1RJTUVSUykgKz0gbG9jYWx0aW1lci5vCitvYmotJChDT05GSUdfU09DX0lNWDZRKSArPSBjbG9jay1pbXg2cS5vIG1hY2gtaW14NnEubyBwbS1pbXg2cS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUuYm9vdAppbmRleCBkYmU2MTIwLi5jZmVkZTU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZS5ib290CisrKyBiL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlLmJvb3QKQEAgLTEsMTkgKzEsMjcgQEAKLXpyZWxhZGRyLSQoQ09ORklHX0FSQ0hfTVgxKQkrPSAweDA4MDA4MDAwCi1wYXJhbXNfcGh5cy0kKENPTkZJR19BUkNIX01YMSkJOj0gMHgwODAwMDEwMAotaW5pdHJkX3BoeXMtJChDT05GSUdfQVJDSF9NWDEpCTo9IDB4MDg4MDAwMDAKK3pyZWxhZGRyLSQoQ09ORklHX1NPQ19JTVgxKQkrPSAweDA4MDA4MDAwCitwYXJhbXNfcGh5cy0kKENPTkZJR19TT0NfSU1YMSkJOj0gMHgwODAwMDEwMAoraW5pdHJkX3BoeXMtJChDT05GSUdfU09DX0lNWDEpCTo9IDB4MDg4MDAwMDAKIAotenJlbGFkZHItJChDT05GSUdfTUFDSF9NWDIxKQkrPSAweEMwMDA4MDAwCi1wYXJhbXNfcGh5cy0kKENPTkZJR19NQUNIX01YMjEpCTo9IDB4QzAwMDAxMDAKLWluaXRyZF9waHlzLSQoQ09ORklHX01BQ0hfTVgyMSkJOj0gMHhDMDgwMDAwMAorenJlbGFkZHItJChDT05GSUdfU09DX0lNWDIxKQkrPSAweEMwMDA4MDAwCitwYXJhbXNfcGh5cy0kKENPTkZJR19TT0NfSU1YMjEpCTo9IDB4QzAwMDAxMDAKK2luaXRyZF9waHlzLSQoQ09ORklHX1NPQ19JTVgyMSkJOj0gMHhDMDgwMDAwMAogCi16cmVsYWRkci0kKENPTkZJR19BUkNIX01YMjUpCSs9IDB4ODAwMDgwMDAKLXBhcmFtc19waHlzLSQoQ09ORklHX0FSQ0hfTVgyNSkJOj0gMHg4MDAwMDEwMAotaW5pdHJkX3BoeXMtJChDT05GSUdfQVJDSF9NWDI1KQk6PSAweDgwODAwMDAwCit6cmVsYWRkci0kKENPTkZJR19TT0NfSU1YMjUpCSs9IDB4ODAwMDgwMDAKK3BhcmFtc19waHlzLSQoQ09ORklHX1NPQ19JTVgyNSkJOj0gMHg4MDAwMDEwMAoraW5pdHJkX3BoeXMtJChDT05GSUdfU09DX0lNWDI1KQk6PSAweDgwODAwMDAwCiAKLXpyZWxhZGRyLSQoQ09ORklHX01BQ0hfTVgyNykJKz0gMHhBMDAwODAwMAotcGFyYW1zX3BoeXMtJChDT05GSUdfTUFDSF9NWDI3KQk6PSAweEEwMDAwMTAwCi1pbml0cmRfcGh5cy0kKENPTkZJR19NQUNIX01YMjcpCTo9IDB4QTA4MDAwMDAKK3pyZWxhZGRyLSQoQ09ORklHX1NPQ19JTVgyNykJKz0gMHhBMDAwODAwMAorcGFyYW1zX3BoeXMtJChDT05GSUdfU09DX0lNWDI3KQk6PSAweEEwMDAwMTAwCitpbml0cmRfcGh5cy0kKENPTkZJR19TT0NfSU1YMjcpCTo9IDB4QTA4MDAwMDAKIAotenJlbGFkZHItJChDT05GSUdfQVJDSF9NWDMpCSs9IDB4ODAwMDgwMDAKLXBhcmFtc19waHlzLSQoQ09ORklHX0FSQ0hfTVgzKQk6PSAweDgwMDAwMTAwCi1pbml0cmRfcGh5cy0kKENPTkZJR19BUkNIX01YMykJOj0gMHg4MDgwMDAwMAorenJlbGFkZHItJChDT05GSUdfU09DX0lNWDMxKQkrPSAweDgwMDA4MDAwCitwYXJhbXNfcGh5cy0kKENPTkZJR19TT0NfSU1YMzEpCTo9IDB4ODAwMDAxMDAKK2luaXRyZF9waHlzLSQoQ09ORklHX1NPQ19JTVgzMSkJOj0gMHg4MDgwMDAwMAorCit6cmVsYWRkci0kKENPTkZJR19TT0NfSU1YMzUpCSs9IDB4ODAwMDgwMDAKK3BhcmFtc19waHlzLSQoQ09ORklHX1NPQ19JTVgzNSkJOj0gMHg4MDAwMDEwMAoraW5pdHJkX3BoeXMtJChDT05GSUdfU09DX0lNWDM1KQk6PSAweDgwODAwMDAwCisKK3pyZWxhZGRyLSQoQ09ORklHX1NPQ19JTVg2USkJKz0gMHgxMDAwODAwMAorcGFyYW1zX3BoeXMtJChDT05GSUdfU09DX0lNWDZRKQk6PSAweDEwMDAwMTAwCitpbml0cmRfcGh5cy0kKENPTkZJR19TT0NfSU1YNlEpCTo9IDB4MTA4MDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2NhY2hlLWwyeDAuYyBiL2FyY2gvYXJtL21hY2gtaW14L2NhY2hlLWwyeDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlkMTMyMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jYWNoZS1sMngwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgUGVuZ3V0cm9uaXgKLSAqIFNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KLSAqIEp1ZXJnZW4gQmVpc2VydCA8ai5iZWlzZXJ0QHBlbmd1dHJvbml4LmRlPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLXN0YXRpYyBpbnQgbXhjX2luaXRfbDJ4MCh2b2lkKQotewotCXZvaWQgX19pb21lbSAqbDJ4MF9iYXNlOwotCXZvaWQgX19pb21lbSAqY2xrY3RsX2Jhc2U7Ci0KLQlpZiAoIWNwdV9pc19teDMxKCkgJiYgIWNwdV9pc19teDM1KCkpCi0JCXJldHVybiAwOwotCi0vKgotICogRmlyc3Qgb2YgYWxsLCB3ZSBtdXN0IHJlcGFpciBicm9rZW4gY2hpcCBzZXR0aW5ncy4gVGhlcmUgYXJlIHNvbWUKLSAqIGkuTVgzNSBDUFVzIGluIHRoZSB3aWxkLCBjb21taW5nIHdpdGggYm9ndXMgTDIgY2FjaGUgc2V0dGluZ3MuIFRoZXNlCi0gKiBtaXNjb25maWd1cmVkIENQVXMgd2lsbCBydW4gYW1vayBpbW1lZGlhdGVseSB3aGVuIHRoZSBMMiBjYWNoZSBnZXRzIGVuYWJsZWQuCi0gKiBXb3JrYXJhb3VuZCBpcyB0byBzZXR1cCB0aGUgY29ycmVjdCByZWdpc3RlciBzZXR0aW5nIHByaW9yIGVuYWJsaW5nIHRoZQotICogTDIgY2FjaGUuIFRoaXMgc2hvdWxkIG5vdCBodXJ0IGFscmVhZHkgd29ya2luZyBDUFVzLCBhcyB0aGV5IGFyZSB1c2luZyB0aGUKLSAqIHNhbWUgdmFsdWUuCi0gKi8KLSNkZWZpbmUgTDJfTUVNX1ZBTCAweDEwCi0KLQljbGtjdGxfYmFzZSA9IGlvcmVtYXAoTVgzNV9DTEtDVExfQkFTRV9BRERSLCA0MDk2KTsKLQlpZiAoY2xrY3RsX2Jhc2UgIT0gTlVMTCkgewotCQl3cml0ZWwoMHgwMDAwMDUxNSwgY2xrY3RsX2Jhc2UgKyBMMl9NRU1fVkFMKTsKLQkJaW91bm1hcChjbGtjdGxfYmFzZSk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJMMiBjYWNoZTogQ2Fubm90IGZpeCB0aW1pbmcuIFRyeWluZyB0byBjb250aW51ZSB3aXRob3V0XG4iKTsKLQl9Ci0KLQlsMngwX2Jhc2UgPSBpb3JlbWFwKE1YM3hfTDJDQ19CQVNFX0FERFIsIDQwOTYpOwotCWlmIChJU19FUlIobDJ4MF9iYXNlKSkgewotCQlwcmludGsoS0VSTl9FUlIgInJlbWFwcGluZyBMMiBjYWNoZSBhcmVhIGZhaWxlZCB3aXRoICVsZFxuIiwKLQkJCQlQVFJfRVJSKGwyeDBfYmFzZSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlsMngwX2luaXQobDJ4MF9iYXNlLCAweDAwMDMwMDI0LCAweDAwMDAwMDAwKTsKLQotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChteGNfaW5pdF9sMngwKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNS5jCmluZGV4IGU2M2UyMzUuLmIwZmVjNzRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI1LmMKQEAgLTI2Myw2ICsyNjMsNyBAQAogREVGSU5FX0NMT0NLKGNzaV9jbGssICAgIDAsIENDTV9DR0NSMSwgIDQsIGdldF9yYXRlX2NzaSwgTlVMTCwgICZjc2lfcGVyX2Nsayk7CiBERUZJTkVfQ0xPQ0soY2FuMV9jbGssCSAwLCBDQ01fQ0dDUjEsICAyLCBnZXRfcmF0ZV9pcGcsIE5VTEwsIE5VTEwpOwogREVGSU5FX0NMT0NLKGNhbjJfY2xrLAkgMSwgQ0NNX0NHQ1IxLCAgMywgZ2V0X3JhdGVfaXBnLCBOVUxMLCBOVUxMKTsKK0RFRklORV9DTE9DSyhpaW1fY2xrLCAgICAwLCBDQ01fQ0dDUjEsIDI2LCBOVUxMLCBOVUxMLCBOVUxMKTsKIAogI2RlZmluZSBfUkVHSVNURVJfQ0xPQ0soZCwgbiwgYykJXAogCXsJCQkJXApAQCAtMzEwLDYgKzMxMSw3IEBACiAJX1JFR0lTVEVSX0NMT0NLKCJmbGV4Y2FuLjEiLCBOVUxMLCBjYW4yX2NsaykKIAkvKiBpLm14MjUgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1zZG1hIiwgTlVMTCwgc2RtYV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJpaW0iLCBpaW1fY2xrKQogfTsKIAogaW50IF9faW5pdCBteDI1X2Nsb2Nrc19pbml0KHZvaWQpCkBAIC0zMzQsNiArMzM2LDEwIEBACiAJLyogQ2xvY2sgc291cmNlIGZvciBncHQgaXMgYWhiX2RpdiAqLwogCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChDUk1fQkFTRSsweDY0KSAmIH4oMSA8PCA1KSwgQ1JNX0JBU0UgKyAweDY0KTsKIAorCWNsa19lbmFibGUoJmlpbV9jbGspOworCWlteF9wcmludF9zaWxpY29uX3JldigiaS5NWDI1IiwgbXgyNV9yZXZpc2lvbigpKTsKKwljbGtfZGlzYWJsZSgmaWltX2Nsayk7CisKIAlteGNfdGltZXJfaW5pdCgmZ3B0X2NsaywgTVgyNV9JT19BRERSRVNTKE1YMjVfR1BUMV9CQVNFX0FERFIpLCA1NCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI3LmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNy5jCmluZGV4IDY5MTJiODIuLjg4ZmUwMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjcuYwpAQCAtNTgzLDcgKzU4Myw3IEBACiBERUZJTkVfQ0xPQ0soZG1hX2NsazEsICAgICAwLCBQQ0NSMSwgMjAsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKIERFRklORV9DTE9DSyhjc2lfY2xrMSwgICAgIDAsIFBDQ1IxLCAyMSwgTlVMTCwgTlVMTCwgJmFoYl9jbGspOwogREVGSU5FX0NMT0NLKGJyb21fY2xrLCAgICAgMCwgUENDUjEsIDIyLCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7Ci1ERUZJTkVfQ0xPQ0soYXRhX2NsaywgICAgICAwLCBQQ0NSMSwgMjMsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKK0RFRklORV9DTE9DSyhwYXRhX2NsaywgICAgICAwLCBQQ0NSMSwgMjMsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKIERFRklORV9DTE9DSyh3ZG9nX2NsaywgICAgIDAsIFBDQ1IxLCAyNCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwogREVGSU5FX0NMT0NLKHVzYl9jbGssICAgICAgMCwgUENDUjEsIDI1LCBnZXRfcmF0ZV91c2IsICZ1c2JfY2xrMSwgJnNwbGxfY2xrKTsKIERFRklORV9DTE9DSyh1YXJ0Nl9jbGsxLCAgIDAsIFBDQ1IxLCAyNiwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwpAQCAtNjY2LDcgKzY2Niw3IEBACiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgyNy1mZWMuMCIsIE5VTEwsIGZlY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJlbWkiLCBlbWlfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAic2FoYXJhMiIsIHNhaGFyYTJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiYXRhIiwgYXRhX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInBhdGFfaW14IiwgTlVMTCwgcGF0YV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJtc3RpY2siLCBtc3RpY2tfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14Mi13ZHQuMCIsIE5VTEwsIHdkb2dfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3BpbyIsIGdwaW9fY2xrKQpAQCAtNzUxLDYgKzc1MSw4IEBACiAJY2xrX2VuYWJsZSgmZ3Bpb19jbGspOwogCWNsa19lbmFibGUoJmVtaV9jbGspOwogCWNsa19lbmFibGUoJmlpbV9jbGspOworCWlteF9wcmludF9zaWxpY29uX3JldigiaS5NWDI3IiwgbXgyN19yZXZpc2lvbigpKTsKKwljbGtfZGlzYWJsZSgmaWltX2Nsayk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19MTCkgJiYgIWRlZmluZWQoQ09ORklHX0RFQlVHX0lDRURDQykKIAljbGtfZW5hYmxlKCZ1YXJ0MV9jbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzEuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDMxLmMKaW5kZXggZDk3Mzc3MC4uOTg4YTI4MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzMS5jCkBAIC00NzYsNyArNDc2LDcgQEAKIERFRklORV9DTE9DSyhlcGl0MV9jbGssICAgMCwgTVhDX0NDTV9DR1IwLCAgNiwgTlVMTCwgTlVMTCwgJnBlcmNsa19jbGspOwogREVGSU5FX0NMT0NLKGVwaXQyX2NsaywgICAxLCBNWENfQ0NNX0NHUjAsICA4LCBOVUxMLCBOVUxMLCAmcGVyY2xrX2Nsayk7CiBERUZJTkVfQ0xPQ0soaWltX2NsaywgICAgIDAsIE1YQ19DQ01fQ0dSMCwgMTAsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKLURFRklORV9DTE9DSyhhdGFfY2xrLCAgICAgMCwgTVhDX0NDTV9DR1IwLCAxMiwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOworREVGSU5FX0NMT0NLKHBhdGFfY2xrLCAgICAgMCwgTVhDX0NDTV9DR1IwLCAxMiwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwogREVGSU5FX0NMT0NLKHNkbWFfY2xrMSwgICAwLCBNWENfQ0NNX0NHUjAsIDE0LCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7CiBERUZJTkVfQ0xPQ0soY3NwaTNfY2xrLCAgIDIsIE1YQ19DQ01fQ0dSMCwgMTYsIE5VTEwsIE5VTEwsICZpcGdfY2xrKTsKIERFRklORV9DTE9DSyhybmdfY2xrLCAgICAgMCwgTVhDX0NDTV9DR1IwLCAxOCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwpAQCAtNTYyLDcgKzU2Miw3IEBACiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjAiLCBOVUxMLCBzc2kxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMSIsIE5VTEwsIHNzaTJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZmlyaSIsIGZpcmlfY2xrKQotCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiYXRhIiwgYXRhX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInBhdGFfaW14IiwgTlVMTCwgcGF0YV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJydGljIiwgcnRpY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJybmciLCBybmdfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14MzEtc2RtYSIsIE5VTEwsIHNkbWFfY2xrMSkKQEAgLTYxMSwxMSArNjExLDExIEBACiAJY2xrX2VuYWJsZSgmZ3B0X2Nsayk7CiAJY2xrX2VuYWJsZSgmZW1pX2Nsayk7CiAJY2xrX2VuYWJsZSgmaWltX2Nsayk7CisJbXgzMV9yZXZpc2lvbigpOworCWNsa19kaXNhYmxlKCZpaW1fY2xrKTsKIAogCWNsa19lbmFibGUoJnNlcmlhbF9wbGxfY2xrKTsKIAotCW14MzFfcmVhZF9jcHVfcmV2KCk7Ci0KIAlpZiAobXgzMV9yZXZpc2lvbigpID49IElNWF9DSElQX1JFVklTSU9OXzJfMCkgewogCQlyZWcgPSBfX3Jhd19yZWFkbChNWENfQ0NNX1BNQ1IxKTsKIAkJLyogTm8gUExMIHJlc3RhcnQgb24gRFZGUyBzd2l0Y2g7IGVuYWJsZSBhdXRvIEVNSSBoYW5kc2hha2UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzNS5jCmluZGV4IDg4YjYyYTA3Li44MTE2ZjExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMKQEAgLTM1NCw3ICszNTQsNyBAQAogCX0KIAogREVGSU5FX0NMT0NLKGFzcmNfY2xrLCAgIDAsIENDTV9DR1IwLCAgMCwgTlVMTCwgTlVMTCk7Ci1ERUZJTkVfQ0xPQ0soYXRhX2NsaywgICAgMCwgQ0NNX0NHUjAsICAyLCBnZXRfcmF0ZV9pcGcsIE5VTEwpOworREVGSU5FX0NMT0NLKHBhdGFfY2xrLCAgICAwLCBDQ01fQ0dSMCwgIDIsIGdldF9yYXRlX2lwZywgTlVMTCk7CiAvKiBERUZJTkVfQ0xPQ0soYXVkbXV4X2NsaywgMCwgQ0NNX0NHUjAsICA0LCBOVUxMLCBOVUxMKTsgKi8KIERFRklORV9DTE9DSyhjYW4xX2NsaywgICAwLCBDQ01fQ0dSMCwgIDYsIGdldF9yYXRlX2lwZywgTlVMTCk7CiBERUZJTkVfQ0xPQ0soY2FuMl9jbGssICAgMSwgQ0NNX0NHUjAsICA4LCBnZXRfcmF0ZV9pcGcsIE5VTEwpOwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhc3JjIiwgYXNyY19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhdGEiLCBhdGFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygicGF0YV9pbXgiLCBOVUxMLCBwYXRhX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImZsZXhjYW4uMCIsIE5VTEwsIGNhbjFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiZmxleGNhbi4xIiwgTlVMTCwgY2FuMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1jc3BpLjAiLCBOVUxMLCBjc3BpMV9jbGspCkBAIC01MzcsNyArNTM3LDggQEAKIAlfX3Jhd193cml0ZWwoY2dyMywgQ0NNX0JBU0UgKyBDQ01fQ0dSMyk7CiAKIAljbGtfZW5hYmxlKCZpaW1fY2xrKTsKLQlteDM1X3JlYWRfY3B1X3JldigpOworCWlteF9wcmludF9zaWxpY29uX3JldigiaS5NWDM1IiwgbXgzNV9yZXZpc2lvbigpKTsKKwljbGtfZGlzYWJsZSgmaWltX2Nsayk7CiAKICNpZmRlZiBDT05GSUdfTVhDX1VTRV9FUElUCiAJZXBpdF90aW1lcl9pbml0KCZlcGl0MV9jbGssCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXg2cS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14NnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNhMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14NnEuYwpAQCAtMCwwICsxLDIwMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2RlZmluZSBQTExfQkFTRQkJSU1YX0lPX0FERFJFU1MoTVg2UV9BTkFUT1BfQkFTRV9BRERSKQorI2RlZmluZSBQTEwxX1NZUwkJKFBMTF9CQVNFICsgMHgwMDApCisjZGVmaW5lIFBMTDJfQlVTCQkoUExMX0JBU0UgKyAweDAzMCkKKyNkZWZpbmUgUExMM19VU0JfT1RHCQkoUExMX0JBU0UgKyAweDAxMCkKKyNkZWZpbmUgUExMNF9BVURJTwkJKFBMTF9CQVNFICsgMHgwNzApCisjZGVmaW5lIFBMTDVfVklERU8JCShQTExfQkFTRSArIDB4MGEwKQorI2RlZmluZSBQTEw2X01MQgkJKFBMTF9CQVNFICsgMHgwZDApCisjZGVmaW5lIFBMTDdfVVNCX0hPU1QJCShQTExfQkFTRSArIDB4MDIwKQorI2RlZmluZSBQTEw4X0VORVQJCShQTExfQkFTRSArIDB4MGUwKQorI2RlZmluZSBQRkRfNDgwCQkJKFBMTF9CQVNFICsgMHgwZjApCisjZGVmaW5lIFBGRF81MjgJCQkoUExMX0JBU0UgKyAweDEwMCkKKyNkZWZpbmUgUExMX05VTV9PRkZTRVQJCTB4MDEwCisjZGVmaW5lIFBMTF9ERU5PTV9PRkZTRVQJMHgwMjAKKworI2RlZmluZSBQRkQwCQkJNworI2RlZmluZSBQRkQxCQkJMTUKKyNkZWZpbmUgUEZEMgkJCTIzCisjZGVmaW5lIFBGRDMJCQkzMQorI2RlZmluZSBQRkRfRlJBQ19NQVNLCQkweDNmCisKKyNkZWZpbmUgQk1fUExMX0JZUEFTUwkJCSgweDEgPDwgMTYpCisjZGVmaW5lIEJNX1BMTF9FTkFCTEUJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBCTV9QTExfUE9XRVJfRE9XTgkJKDB4MSA8PCAxMikKKyNkZWZpbmUgQk1fUExMX0xPQ0sJCQkoMHgxIDw8IDMxKQorI2RlZmluZSBCUF9QTExfU1lTX0RJVl9TRUxFQ1QJCTAKKyNkZWZpbmUgQk1fUExMX1NZU19ESVZfU0VMRUNUCQkoMHg3ZiA8PCAwKQorI2RlZmluZSBCUF9QTExfQlVTX0RJVl9TRUxFQ1QJCTAKKyNkZWZpbmUgQk1fUExMX0JVU19ESVZfU0VMRUNUCQkoMHgxIDw8IDApCisjZGVmaW5lIEJQX1BMTF9VU0JfRElWX1NFTEVDVAkJMAorI2RlZmluZSBCTV9QTExfVVNCX0RJVl9TRUxFQ1QJCSgweDMgPDwgMCkKKyNkZWZpbmUgQlBfUExMX0FWX0RJVl9TRUxFQ1QJCTAKKyNkZWZpbmUgQk1fUExMX0FWX0RJVl9TRUxFQ1QJCSgweDdmIDw8IDApCisjZGVmaW5lIEJQX1BMTF9FTkVUX0RJVl9TRUxFQ1QJCTAKKyNkZWZpbmUgQk1fUExMX0VORVRfRElWX1NFTEVDVAkJKDB4MyA8PCAwKQorI2RlZmluZSBCTV9QTExfRU5FVF9FTl9QQ0lFCQkoMHgxIDw8IDE5KQorI2RlZmluZSBCTV9QTExfRU5FVF9FTl9TQVRBCQkoMHgxIDw8IDIwKQorCisjZGVmaW5lIENDTV9CQVNFCUlNWF9JT19BRERSRVNTKE1YNlFfQ0NNX0JBU0VfQUREUikKKyNkZWZpbmUgQ0NSCQkoQ0NNX0JBU0UgKyAweDAwKQorI2RlZmluZSBDQ0RSCQkoQ0NNX0JBU0UgKyAweDA0KQorI2RlZmluZSBDU1IJCShDQ01fQkFTRSArIDB4MDgpCisjZGVmaW5lIENDU1IJCShDQ01fQkFTRSArIDB4MGMpCisjZGVmaW5lIENBQ1JSCQkoQ0NNX0JBU0UgKyAweDEwKQorI2RlZmluZSBDQkNEUgkJKENDTV9CQVNFICsgMHgxNCkKKyNkZWZpbmUgQ0JDTVIJCShDQ01fQkFTRSArIDB4MTgpCisjZGVmaW5lIENTQ01SMQkJKENDTV9CQVNFICsgMHgxYykKKyNkZWZpbmUgQ1NDTVIyCQkoQ0NNX0JBU0UgKyAweDIwKQorI2RlZmluZSBDU0NEUjEJCShDQ01fQkFTRSArIDB4MjQpCisjZGVmaW5lIENTMUNEUgkJKENDTV9CQVNFICsgMHgyOCkKKyNkZWZpbmUgQ1MyQ0RSCQkoQ0NNX0JBU0UgKyAweDJjKQorI2RlZmluZSBDRENEUgkJKENDTV9CQVNFICsgMHgzMCkKKyNkZWZpbmUgQ0hTQ0NEUgkJKENDTV9CQVNFICsgMHgzNCkKKyNkZWZpbmUgQ1NDRFIyCQkoQ0NNX0JBU0UgKyAweDM4KQorI2RlZmluZSBDU0NEUjMJCShDQ01fQkFTRSArIDB4M2MpCisjZGVmaW5lIENTQ0RSNAkJKENDTV9CQVNFICsgMHg0MCkKKyNkZWZpbmUgQ1dEUgkJKENDTV9CQVNFICsgMHg0NCkKKyNkZWZpbmUgQ0RISVBSCQkoQ0NNX0JBU0UgKyAweDQ4KQorI2RlZmluZSBDRENSCQkoQ0NNX0JBU0UgKyAweDRjKQorI2RlZmluZSBDVE9SCQkoQ0NNX0JBU0UgKyAweDUwKQorI2RlZmluZSBDTFBDUgkJKENDTV9CQVNFICsgMHg1NCkKKyNkZWZpbmUgQ0lTUgkJKENDTV9CQVNFICsgMHg1OCkKKyNkZWZpbmUgQ0lNUgkJKENDTV9CQVNFICsgMHg1YykKKyNkZWZpbmUgQ0NPU1IJCShDQ01fQkFTRSArIDB4NjApCisjZGVmaW5lIENHUFIJCShDQ01fQkFTRSArIDB4NjQpCisjZGVmaW5lIENDR1IwCQkoQ0NNX0JBU0UgKyAweDY4KQorI2RlZmluZSBDQ0dSMQkJKENDTV9CQVNFICsgMHg2YykKKyNkZWZpbmUgQ0NHUjIJCShDQ01fQkFTRSArIDB4NzApCisjZGVmaW5lIENDR1IzCQkoQ0NNX0JBU0UgKyAweDc0KQorI2RlZmluZSBDQ0dSNAkJKENDTV9CQVNFICsgMHg3OCkKKyNkZWZpbmUgQ0NHUjUJCShDQ01fQkFTRSArIDB4N2MpCisjZGVmaW5lIENDR1I2CQkoQ0NNX0JBU0UgKyAweDgwKQorI2RlZmluZSBDQ0dSNwkJKENDTV9CQVNFICsgMHg4NCkKKyNkZWZpbmUgQ01FT1IJCShDQ01fQkFTRSArIDB4ODgpCisKKyNkZWZpbmUgQ0cwCQkwCisjZGVmaW5lIENHMQkJMgorI2RlZmluZSBDRzIJCTQKKyNkZWZpbmUgQ0czCQk2CisjZGVmaW5lIENHNAkJOAorI2RlZmluZSBDRzUJCTEwCisjZGVmaW5lIENHNgkJMTIKKyNkZWZpbmUgQ0c3CQkxNAorI2RlZmluZSBDRzgJCTE2CisjZGVmaW5lIENHOQkJMTgKKyNkZWZpbmUgQ0cxMAkJMjAKKyNkZWZpbmUgQ0cxMQkJMjIKKyNkZWZpbmUgQ0cxMgkJMjQKKyNkZWZpbmUgQ0cxMwkJMjYKKyNkZWZpbmUgQ0cxNAkJMjgKKyNkZWZpbmUgQ0cxNQkJMzAKKworI2RlZmluZSBCTV9DQ1NSX1BMTDFfU1dfU0VMCQkoMHgxIDw8IDIpCisjZGVmaW5lIEJNX0NDU1JfU1RFUF9TRUwJCSgweDEgPDwgOCkKKworI2RlZmluZSBCUF9DQUNSUl9BUk1fUE9ERgkJMAorI2RlZmluZSBCTV9DQUNSUl9BUk1fUE9ERgkJKDB4NyA8PCAwKQorCisjZGVmaW5lIEJQX0NCQ0RSX1BFUklQSDJfQ0xLMl9QT0RGCTAKKyNkZWZpbmUgQk1fQ0JDRFJfUEVSSVBIMl9DTEsyX1BPREYJKDB4NyA8PCAwKQorI2RlZmluZSBCUF9DQkNEUl9NTURDX0NIMV9BWElfUE9ERgkzCisjZGVmaW5lIEJNX0NCQ0RSX01NRENfQ0gxX0FYSV9QT0RGCSgweDcgPDwgMykKKyNkZWZpbmUgQlBfQ0JDRFJfQVhJX1NFTAkJNgorI2RlZmluZSBCTV9DQkNEUl9BWElfU0VMCQkoMHgzIDw8IDYpCisjZGVmaW5lIEJQX0NCQ0RSX0lQR19QT0RGCQk4CisjZGVmaW5lIEJNX0NCQ0RSX0lQR19QT0RGCQkoMHgzIDw8IDgpCisjZGVmaW5lIEJQX0NCQ0RSX0FIQl9QT0RGCQkxMAorI2RlZmluZSBCTV9DQkNEUl9BSEJfUE9ERgkJKDB4NyA8PCAxMCkKKyNkZWZpbmUgQlBfQ0JDRFJfQVhJX1BPREYJCTE2CisjZGVmaW5lIEJNX0NCQ0RSX0FYSV9QT0RGCQkoMHg3IDw8IDE2KQorI2RlZmluZSBCUF9DQkNEUl9NTURDX0NIMF9BWElfUE9ERgkxOQorI2RlZmluZSBCTV9DQkNEUl9NTURDX0NIMF9BWElfUE9ERgkoMHg3IDw8IDE5KQorI2RlZmluZSBCUF9DQkNEUl9QRVJJUEhfQ0xLX1NFTAkJMjUKKyNkZWZpbmUgQk1fQ0JDRFJfUEVSSVBIX0NMS19TRUwJCSgweDEgPDwgMjUpCisjZGVmaW5lIEJQX0NCQ0RSX1BFUklQSDJfQ0xLX1NFTAkyNgorI2RlZmluZSBCTV9DQkNEUl9QRVJJUEgyX0NMS19TRUwJKDB4MSA8PCAyNikKKyNkZWZpbmUgQlBfQ0JDRFJfUEVSSVBIX0NMSzJfUE9ERgkyNworI2RlZmluZSBCTV9DQkNEUl9QRVJJUEhfQ0xLMl9QT0RGCSgweDcgPDwgMjcpCisKKyNkZWZpbmUgQlBfQ0JDTVJfR1BVMkRfQVhJX1NFTAkJMAorI2RlZmluZSBCTV9DQkNNUl9HUFUyRF9BWElfU0VMCQkoMHgxIDw8IDApCisjZGVmaW5lIEJQX0NCQ01SX0dQVTNEX0FYSV9TRUwJCTEKKyNkZWZpbmUgQk1fQ0JDTVJfR1BVM0RfQVhJX1NFTAkJKDB4MSA8PCAxKQorI2RlZmluZSBCUF9DQkNNUl9HUFUzRF9DT1JFX1NFTAkJNAorI2RlZmluZSBCTV9DQkNNUl9HUFUzRF9DT1JFX1NFTAkJKDB4MyA8PCA0KQorI2RlZmluZSBCUF9DQkNNUl9HUFUzRF9TSEFERVJfU0VMCTgKKyNkZWZpbmUgQk1fQ0JDTVJfR1BVM0RfU0hBREVSX1NFTAkoMHgzIDw8IDgpCisjZGVmaW5lIEJQX0NCQ01SX1BDSUVfQVhJX1NFTAkJMTAKKyNkZWZpbmUgQk1fQ0JDTVJfUENJRV9BWElfU0VMCQkoMHgxIDw8IDEwKQorI2RlZmluZSBCUF9DQkNNUl9WRE9fQVhJX1NFTAkJMTEKKyNkZWZpbmUgQk1fQ0JDTVJfVkRPX0FYSV9TRUwJCSgweDEgPDwgMTEpCisjZGVmaW5lIEJQX0NCQ01SX1BFUklQSF9DTEsyX1NFTAkxMgorI2RlZmluZSBCTV9DQkNNUl9QRVJJUEhfQ0xLMl9TRUwJKDB4MyA8PCAxMikKKyNkZWZpbmUgQlBfQ0JDTVJfVlBVX0FYSV9TRUwJCTE0CisjZGVmaW5lIEJNX0NCQ01SX1ZQVV9BWElfU0VMCQkoMHgzIDw8IDE0KQorI2RlZmluZSBCUF9DQkNNUl9HUFUyRF9DT1JFX1NFTAkJMTYKKyNkZWZpbmUgQk1fQ0JDTVJfR1BVMkRfQ09SRV9TRUwJCSgweDMgPDwgMTYpCisjZGVmaW5lIEJQX0NCQ01SX1BSRV9QRVJJUEhfQ0xLX1NFTAkxOAorI2RlZmluZSBCTV9DQkNNUl9QUkVfUEVSSVBIX0NMS19TRUwJKDB4MyA8PCAxOCkKKyNkZWZpbmUgQlBfQ0JDTVJfUEVSSVBIMl9DTEsyX1NFTAkyMAorI2RlZmluZSBCTV9DQkNNUl9QRVJJUEgyX0NMSzJfU0VMCSgweDEgPDwgMjApCisjZGVmaW5lIEJQX0NCQ01SX1BSRV9QRVJJUEgyX0NMS19TRUwJMjEKKyNkZWZpbmUgQk1fQ0JDTVJfUFJFX1BFUklQSDJfQ0xLX1NFTAkoMHgzIDw8IDIxKQorI2RlZmluZSBCUF9DQkNNUl9HUFUyRF9DT1JFX1BPREYJMjMKKyNkZWZpbmUgQk1fQ0JDTVJfR1BVMkRfQ09SRV9QT0RGCSgweDcgPDwgMjMpCisjZGVmaW5lIEJQX0NCQ01SX0dQVTNEX0NPUkVfUE9ERgkyNgorI2RlZmluZSBCTV9DQkNNUl9HUFUzRF9DT1JFX1BPREYJKDB4NyA8PCAyNikKKyNkZWZpbmUgQlBfQ0JDTVJfR1BVM0RfU0hBREVSX1BPREYJMjkKKyNkZWZpbmUgQk1fQ0JDTVJfR1BVM0RfU0hBREVSX1BPREYJKDB4NyA8PCAyOSkKKworI2RlZmluZSBCUF9DU0NNUjFfUEVSQ0xLX1BPREYJCTAKKyNkZWZpbmUgQk1fQ1NDTVIxX1BFUkNMS19QT0RGCQkoMHgzZiA8PCAwKQorI2RlZmluZSBCUF9DU0NNUjFfU1NJMV9TRUwJCTEwCisjZGVmaW5lIEJNX0NTQ01SMV9TU0kxX1NFTAkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgQlBfQ1NDTVIxX1NTSTJfU0VMCQkxMgorI2RlZmluZSBCTV9DU0NNUjFfU1NJMl9TRUwJCSgweDMgPDwgMTIpCisjZGVmaW5lIEJQX0NTQ01SMV9TU0kzX1NFTAkJMTQKKyNkZWZpbmUgQk1fQ1NDTVIxX1NTSTNfU0VMCQkoMHgzIDw8IDE0KQorI2RlZmluZSBCUF9DU0NNUjFfVVNESEMxX1NFTAkJMTYKKyNkZWZpbmUgQk1fQ1NDTVIxX1VTREhDMV9TRUwJCSgweDEgPDwgMTYpCisjZGVmaW5lIEJQX0NTQ01SMV9VU0RIQzJfU0VMCQkxNworI2RlZmluZSBCTV9DU0NNUjFfVVNESEMyX1NFTAkJKDB4MSA8PCAxNykKKyNkZWZpbmUgQlBfQ1NDTVIxX1VTREhDM19TRUwJCTE4CisjZGVmaW5lIEJNX0NTQ01SMV9VU0RIQzNfU0VMCQkoMHgxIDw8IDE4KQorI2RlZmluZSBCUF9DU0NNUjFfVVNESEM0X1NFTAkJMTkKKyNkZWZpbmUgQk1fQ1NDTVIxX1VTREhDNF9TRUwJCSgweDEgPDwgMTkpCisjZGVmaW5lIEJQX0NTQ01SMV9FTUlfUE9ERgkJMjAKKyNkZWZpbmUgQk1fQ1NDTVIxX0VNSV9QT0RGCQkoMHg3IDw8IDIwKQorI2RlZmluZSBCUF9DU0NNUjFfRU1JX1NMT1dfUE9ERgkJMjMKKyNkZWZpbmUgQk1fQ1NDTVIxX0VNSV9TTE9XX1BPREYJCSgweDcgPDwgMjMpCisjZGVmaW5lIEJQX0NTQ01SMV9FTUlfU0VMCQkyNworI2RlZmluZSBCTV9DU0NNUjFfRU1JX1NFTAkJKDB4MyA8PCAyNykKKyNkZWZpbmUgQlBfQ1NDTVIxX0VNSV9TTE9XX1NFTAkJMjkKKyNkZWZpbmUgQk1fQ1NDTVIxX0VNSV9TTE9XX1NFTAkJKDB4MyA8PCAyOSkKKworI2RlZmluZSBCUF9DU0NNUjJfQ0FOX1BPREYJCTIKKyNkZWZpbmUgQk1fQ1NDTVIyX0NBTl9QT0RGCQkoMHgzZiA8PCAyKQorI2RlZmluZSBCTV9DU0NNUjJfTERCX0RJMF9JUFVfRElWCSgweDEgPDwgMTApCisjZGVmaW5lIEJNX0NTQ01SMl9MREJfREkxX0lQVV9ESVYJKDB4MSA8PCAxMSkKKyNkZWZpbmUgQlBfQ1NDTVIyX0VTQUlfU0VMCQkxOQorI2RlZmluZSBCTV9DU0NNUjJfRVNBSV9TRUwJCSgweDMgPDwgMTkpCisKKyNkZWZpbmUgQlBfQ1NDRFIxX1VBUlRfUE9ERgkJMAorI2RlZmluZSBCTV9DU0NEUjFfVUFSVF9QT0RGCQkoMHgzZiA8PCAwKQorI2RlZmluZSBCUF9DU0NEUjFfVVNESEMxX1BPREYJCTExCisjZGVmaW5lIEJNX0NTQ0RSMV9VU0RIQzFfUE9ERgkJKDB4NyA8PCAxMSkKKyNkZWZpbmUgQlBfQ1NDRFIxX1VTREhDMl9QT0RGCQkxNgorI2RlZmluZSBCTV9DU0NEUjFfVVNESEMyX1BPREYJCSgweDcgPDwgMTYpCisjZGVmaW5lIEJQX0NTQ0RSMV9VU0RIQzNfUE9ERgkJMTkKKyNkZWZpbmUgQk1fQ1NDRFIxX1VTREhDM19QT0RGCQkoMHg3IDw8IDE5KQorI2RlZmluZSBCUF9DU0NEUjFfVVNESEM0X1BPREYJCTIyCisjZGVmaW5lIEJNX0NTQ0RSMV9VU0RIQzRfUE9ERgkJKDB4NyA8PCAyMikKKyNkZWZpbmUgQlBfQ1NDRFIxX1ZQVV9BWElfUE9ERgkJMjUKKyNkZWZpbmUgQk1fQ1NDRFIxX1ZQVV9BWElfUE9ERgkJKDB4NyA8PCAyNSkKKworI2RlZmluZSBCUF9DUzFDRFJfU1NJMV9QT0RGCQkwCisjZGVmaW5lIEJNX0NTMUNEUl9TU0kxX1BPREYJCSgweDNmIDw8IDApCisjZGVmaW5lIEJQX0NTMUNEUl9TU0kxX1BSRUQJCTYKKyNkZWZpbmUgQk1fQ1MxQ0RSX1NTSTFfUFJFRAkJKDB4NyA8PCA2KQorI2RlZmluZSBCUF9DUzFDRFJfRVNBSV9QUkVECQk5CisjZGVmaW5lIEJNX0NTMUNEUl9FU0FJX1BSRUQJCSgweDcgPDwgOSkKKyNkZWZpbmUgQlBfQ1MxQ0RSX1NTSTNfUE9ERgkJMTYKKyNkZWZpbmUgQk1fQ1MxQ0RSX1NTSTNfUE9ERgkJKDB4M2YgPDwgMTYpCisjZGVmaW5lIEJQX0NTMUNEUl9TU0kzX1BSRUQJCTIyCisjZGVmaW5lIEJNX0NTMUNEUl9TU0kzX1BSRUQJCSgweDcgPDwgMjIpCisjZGVmaW5lIEJQX0NTMUNEUl9FU0FJX1BPREYJCTI1CisjZGVmaW5lIEJNX0NTMUNEUl9FU0FJX1BPREYJCSgweDcgPDwgMjUpCisKKyNkZWZpbmUgQlBfQ1MyQ0RSX1NTSTJfUE9ERgkJMAorI2RlZmluZSBCTV9DUzJDRFJfU1NJMl9QT0RGCQkoMHgzZiA8PCAwKQorI2RlZmluZSBCUF9DUzJDRFJfU1NJMl9QUkVECQk2CisjZGVmaW5lIEJNX0NTMkNEUl9TU0kyX1BSRUQJCSgweDcgPDwgNikKKyNkZWZpbmUgQlBfQ1MyQ0RSX0xEQl9ESTBfU0VMCQk5CisjZGVmaW5lIEJNX0NTMkNEUl9MREJfREkwX1NFTAkJKDB4NyA8PCA5KQorI2RlZmluZSBCUF9DUzJDRFJfTERCX0RJMV9TRUwJCTEyCisjZGVmaW5lIEJNX0NTMkNEUl9MREJfREkxX1NFTAkJKDB4NyA8PCAxMikKKyNkZWZpbmUgQlBfQ1MyQ0RSX0VORkNfU0VMCQkxNgorI2RlZmluZSBCTV9DUzJDRFJfRU5GQ19TRUwJCSgweDMgPDwgMTYpCisjZGVmaW5lIEJQX0NTMkNEUl9FTkZDX1BSRUQJCTE4CisjZGVmaW5lIEJNX0NTMkNEUl9FTkZDX1BSRUQJCSgweDcgPDwgMTgpCisjZGVmaW5lIEJQX0NTMkNEUl9FTkZDX1BPREYJCTIxCisjZGVmaW5lIEJNX0NTMkNEUl9FTkZDX1BPREYJCSgweDNmIDw8IDIxKQorCisjZGVmaW5lIEJQX0NEQ0RSX0FTUkNfU0VSSUFMX1NFTAk3CisjZGVmaW5lIEJNX0NEQ0RSX0FTUkNfU0VSSUFMX1NFTAkoMHgzIDw8IDcpCisjZGVmaW5lIEJQX0NEQ0RSX0FTUkNfU0VSSUFMX1BPREYJOQorI2RlZmluZSBCTV9DRENEUl9BU1JDX1NFUklBTF9QT0RGCSgweDcgPDwgOSkKKyNkZWZpbmUgQlBfQ0RDRFJfQVNSQ19TRVJJQUxfUFJFRAkxMgorI2RlZmluZSBCTV9DRENEUl9BU1JDX1NFUklBTF9QUkVECSgweDcgPDwgMTIpCisjZGVmaW5lIEJQX0NEQ0RSX1NQRElGX1NFTAkJMjAKKyNkZWZpbmUgQk1fQ0RDRFJfU1BESUZfU0VMCQkoMHgzIDw8IDIwKQorI2RlZmluZSBCUF9DRENEUl9TUERJRl9QT0RGCQkyMgorI2RlZmluZSBCTV9DRENEUl9TUERJRl9QT0RGCQkoMHg3IDw8IDIyKQorI2RlZmluZSBCUF9DRENEUl9TUERJRl9QUkVECQkyNQorI2RlZmluZSBCTV9DRENEUl9TUERJRl9QUkVECQkoMHg3IDw8IDI1KQorI2RlZmluZSBCUF9DRENEUl9IU0lfVFhfUE9ERgkJMjkKKyNkZWZpbmUgQk1fQ0RDRFJfSFNJX1RYX1BPREYJCSgweDcgPDwgMjkpCisjZGVmaW5lIEJQX0NEQ0RSX0hTSV9UWF9TRUwJCTI4CisjZGVmaW5lIEJNX0NEQ0RSX0hTSV9UWF9TRUwJCSgweDEgPDwgMjgpCisKKyNkZWZpbmUgQlBfQ0hTQ0NEUl9JUFUxX0RJMF9TRUwJCTAKKyNkZWZpbmUgQk1fQ0hTQ0NEUl9JUFUxX0RJMF9TRUwJCSgweDcgPDwgMCkKKyNkZWZpbmUgQlBfQ0hTQ0NEUl9JUFUxX0RJMF9QUkVfUE9ERgkzCisjZGVmaW5lIEJNX0NIU0NDRFJfSVBVMV9ESTBfUFJFX1BPREYJKDB4NyA8PCAzKQorI2RlZmluZSBCUF9DSFNDQ0RSX0lQVTFfREkwX1BSRV9TRUwJNgorI2RlZmluZSBCTV9DSFNDQ0RSX0lQVTFfREkwX1BSRV9TRUwJKDB4NyA8PCA2KQorI2RlZmluZSBCUF9DSFNDQ0RSX0lQVTFfREkxX1NFTAkJOQorI2RlZmluZSBCTV9DSFNDQ0RSX0lQVTFfREkxX1NFTAkJKDB4NyA8PCA5KQorI2RlZmluZSBCUF9DSFNDQ0RSX0lQVTFfREkxX1BSRV9QT0RGCTEyCisjZGVmaW5lIEJNX0NIU0NDRFJfSVBVMV9ESTFfUFJFX1BPREYJKDB4NyA8PCAxMikKKyNkZWZpbmUgQlBfQ0hTQ0NEUl9JUFUxX0RJMV9QUkVfU0VMCTE1CisjZGVmaW5lIEJNX0NIU0NDRFJfSVBVMV9ESTFfUFJFX1NFTAkoMHg3IDw8IDE1KQorCisjZGVmaW5lIEJQX0NTQ0RSMl9JUFUyX0RJMF9TRUwJCTAKKyNkZWZpbmUgQk1fQ1NDRFIyX0lQVTJfREkwX1NFTAkJKDB4NykKKyNkZWZpbmUgQlBfQ1NDRFIyX0lQVTJfREkwX1BSRV9QT0RGCTMKKyNkZWZpbmUgQk1fQ1NDRFIyX0lQVTJfREkwX1BSRV9QT0RGCSgweDcgPDwgMykKKyNkZWZpbmUgQlBfQ1NDRFIyX0lQVTJfREkwX1BSRV9TRUwJNgorI2RlZmluZSBCTV9DU0NEUjJfSVBVMl9ESTBfUFJFX1NFTAkoMHg3IDw8IDYpCisjZGVmaW5lIEJQX0NTQ0RSMl9JUFUyX0RJMV9TRUwJCTkKKyNkZWZpbmUgQk1fQ1NDRFIyX0lQVTJfREkxX1NFTAkJKDB4NyA8PCA5KQorI2RlZmluZSBCUF9DU0NEUjJfSVBVMl9ESTFfUFJFX1BPREYJMTIKKyNkZWZpbmUgQk1fQ1NDRFIyX0lQVTJfREkxX1BSRV9QT0RGCSgweDcgPDwgMTIpCisjZGVmaW5lIEJQX0NTQ0RSMl9JUFUyX0RJMV9QUkVfU0VMCTE1CisjZGVmaW5lIEJNX0NTQ0RSMl9JUFUyX0RJMV9QUkVfU0VMCSgweDcgPDwgMTUpCisjZGVmaW5lIEJQX0NTQ0RSMl9FQ1NQSV9DTEtfUE9ERgkxOQorI2RlZmluZSBCTV9DU0NEUjJfRUNTUElfQ0xLX1BPREYJKDB4M2YgPDwgMTkpCisKKyNkZWZpbmUgQlBfQ1NDRFIzX0lQVTFfSFNQX1NFTAkJOQorI2RlZmluZSBCTV9DU0NEUjNfSVBVMV9IU1BfU0VMCQkoMHgzIDw8IDkpCisjZGVmaW5lIEJQX0NTQ0RSM19JUFUxX0hTUF9QT0RGCQkxMQorI2RlZmluZSBCTV9DU0NEUjNfSVBVMV9IU1BfUE9ERgkJKDB4NyA8PCAxMSkKKyNkZWZpbmUgQlBfQ1NDRFIzX0lQVTJfSFNQX1NFTAkJMTQKKyNkZWZpbmUgQk1fQ1NDRFIzX0lQVTJfSFNQX1NFTAkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgQlBfQ1NDRFIzX0lQVTJfSFNQX1BPREYJCTE2CisjZGVmaW5lIEJNX0NTQ0RSM19JUFUyX0hTUF9QT0RGCQkoMHg3IDw8IDE2KQorCisjZGVmaW5lIEJNX0NESElQUl9BWElfUE9ERl9CVVNZCQkoMHgxIDw8IDApCisjZGVmaW5lIEJNX0NESElQUl9BSEJfUE9ERl9CVVNZCQkoMHgxIDw8IDEpCisjZGVmaW5lIEJNX0NESElQUl9NTURDX0NIMV9QT0RGX0JVU1kJKDB4MSA8PCAyKQorI2RlZmluZSBCTV9DREhJUFJfUEVSSVBIMl9TRUxfQlVTWQkoMHgxIDw8IDMpCisjZGVmaW5lIEJNX0NESElQUl9NTURDX0NIMF9QT0RGX0JVU1kJKDB4MSA8PCA0KQorI2RlZmluZSBCTV9DREhJUFJfUEVSSVBIX1NFTF9CVVNZCSgweDEgPDwgNSkKKyNkZWZpbmUgQk1fQ0RISVBSX0FSTV9QT0RGX0JVU1kJCSgweDEgPDwgMTYpCisKKyNkZWZpbmUgQlBfQ0xQQ1JfTFBNCQkJMAorI2RlZmluZSBCTV9DTFBDUl9MUE0JCQkoMHgzIDw8IDApCisjZGVmaW5lIEJNX0NMUENSX0JZUEFTU19QTUlDX1JFQURZCSgweDEgPDwgMikKKyNkZWZpbmUgQk1fQ0xQQ1JfQVJNX0NMS19ESVNfT05fTFBNCSgweDEgPDwgNSkKKyNkZWZpbmUgQk1fQ0xQQ1JfU0JZT1MJCQkoMHgxIDw8IDYpCisjZGVmaW5lIEJNX0NMUENSX0RJU19SRUZfT1NDCQkoMHgxIDw8IDcpCisjZGVmaW5lIEJNX0NMUENSX1ZTVEJZCQkJKDB4MSA8PCA4KQorI2RlZmluZSBCUF9DTFBDUl9TVEJZX0NPVU5UCQk5CisjZGVmaW5lIEJNX0NMUENSX1NUQllfQ09VTlQJCSgweDMgPDwgOSkKKyNkZWZpbmUgQk1fQ0xQQ1JfQ09TQ19QV1JET1dOCQkoMHgxIDw8IDExKQorI2RlZmluZSBCTV9DTFBDUl9XQl9QRVJfQVRfTFBNCQkoMHgxIDw8IDE2KQorI2RlZmluZSBCTV9DTFBDUl9XQl9DT1JFX0FUX0xQTQkJKDB4MSA8PCAxNykKKyNkZWZpbmUgQk1fQ0xQQ1JfQllQX01NRENfQ0gwX0xQTV9IUwkoMHgxIDw8IDE5KQorI2RlZmluZSBCTV9DTFBDUl9CWVBfTU1EQ19DSDFfTFBNX0hTCSgweDEgPDwgMjEpCisjZGVmaW5lIEJNX0NMUENSX01BU0tfQ09SRTBfV0ZJCQkoMHgxIDw8IDIyKQorI2RlZmluZSBCTV9DTFBDUl9NQVNLX0NPUkUxX1dGSQkJKDB4MSA8PCAyMykKKyNkZWZpbmUgQk1fQ0xQQ1JfTUFTS19DT1JFMl9XRkkJCSgweDEgPDwgMjQpCisjZGVmaW5lIEJNX0NMUENSX01BU0tfQ09SRTNfV0ZJCQkoMHgxIDw8IDI1KQorI2RlZmluZSBCTV9DTFBDUl9NQVNLX1NDVV9JRExFCQkoMHgxIDw8IDI2KQorI2RlZmluZSBCTV9DTFBDUl9NQVNLX0wyQ0NfSURMRQkJKDB4MSA8PCAyNykKKworI2RlZmluZSBGUkVRXzQ4ME0JNDgwMDAwMDAwCisjZGVmaW5lIEZSRVFfNTI4TQk1MjgwMDAwMDAKKyNkZWZpbmUgRlJFUV81OTRNCTU5NDAwMDAwMAorI2RlZmluZSBGUkVRXzY1ME0JNjUwMDAwMDAwCisjZGVmaW5lIEZSRVFfMTMwME0JMTMwMDAwMDAwMAorCitzdGF0aWMgc3RydWN0IGNsayBwbGwxX3N5czsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbDJfYnVzOworc3RhdGljIHN0cnVjdCBjbGsgcGxsM191c2Jfb3RnOworc3RhdGljIHN0cnVjdCBjbGsgcGxsNF9hdWRpbzsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbDVfdmlkZW87CitzdGF0aWMgc3RydWN0IGNsayBwbGw2X21sYjsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbDdfdXNiX2hvc3Q7CitzdGF0aWMgc3RydWN0IGNsayBwbGw4X2VuZXQ7CitzdGF0aWMgc3RydWN0IGNsayBhcGJoX2RtYV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBhcm1fY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXBnX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFoYl9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBheGlfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgbW1kY19jaDBfYXhpX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tZGNfY2gxX2F4aV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBwZXJpcGhfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgcGVyaXBoX3ByZV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBwZXJpcGhfY2xrMl9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBwZXJpcGgyX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcmlwaDJfcHJlX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcmlwaDJfY2xrMl9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBncHUyZF9jb3JlX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdTNkX2NvcmVfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgZ3B1M2Rfc2hhZGVyX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGlwZ19wZXJjbGs7CitzdGF0aWMgc3RydWN0IGNsayBlbWlfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgZW1pX3Nsb3dfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgY2FuMV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayB1YXJ0X2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzZGhjMV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayB1c2RoYzJfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgdXNkaGMzX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzZGhjNF9jbGs7CitzdGF0aWMgc3RydWN0IGNsayB2cHVfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaHNpX3R4X2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGlwdTFfZGkwX3ByZV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBpcHUxX2RpMV9wcmVfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXB1Ml9kaTBfcHJlX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGlwdTJfZGkxX3ByZV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBpcHUxX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGlwdTJfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgc3NpMV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBzc2kzX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGVzYWlfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgc3NpMl9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBzcGRpZl9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBhc3JjX3NlcmlhbF9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBncHUyZF9heGlfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgZ3B1M2RfYXhpX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjaWVfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgdmRvX2F4aV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBsZGJfZGkwX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGxkYl9kaTFfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXB1MV9kaTBfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXB1MV9kaTFfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXB1Ml9kaTBfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXB1Ml9kaTFfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgZW5mY19jbGs7CitzdGF0aWMgc3RydWN0IGNsayBkdW1teV9jbGsgPSB7fTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0ZXJuYWxfaGlnaF9yZWZlcmVuY2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBleHRlcm5hbF9sb3dfcmVmZXJlbmNlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgb3NjaWxsYXRvcl9yZWZlcmVuY2U7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vc2NpbGxhdG9yX3JlZmVyZW5jZV9jbG9ja19yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gb3NjaWxsYXRvcl9yZWZlcmVuY2U7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9oaWdoX3JlZmVyZW5jZV9jbG9ja19yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gZXh0ZXJuYWxfaGlnaF9yZWZlcmVuY2U7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9sb3dfcmVmZXJlbmNlX2Nsb2NrX3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBleHRlcm5hbF9sb3dfcmVmZXJlbmNlOworfQorCitzdGF0aWMgc3RydWN0IGNsayBja2lsX2NsayA9IHsKKwkuZ2V0X3JhdGUgPSBnZXRfbG93X3JlZmVyZW5jZV9jbG9ja19yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2tpaF9jbGsgPSB7CisJLmdldF9yYXRlID0gZ2V0X2hpZ2hfcmVmZXJlbmNlX2Nsb2NrX3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBvc2NfY2xrID0geworCS5nZXRfcmF0ZSA9IGdldF9vc2NpbGxhdG9yX3JlZmVyZW5jZV9jbG9ja19yYXRlLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKnBsbF9nZXRfcmVnX2FkZHIoc3RydWN0IGNsayAqcGxsKQoreworCWlmIChwbGwgPT0gJnBsbDFfc3lzKQorCQlyZXR1cm4gUExMMV9TWVM7CisJZWxzZSBpZiAocGxsID09ICZwbGwyX2J1cykKKwkJcmV0dXJuIFBMTDJfQlVTOworCWVsc2UgaWYgKHBsbCA9PSAmcGxsM191c2Jfb3RnKQorCQlyZXR1cm4gUExMM19VU0JfT1RHOworCWVsc2UgaWYgKHBsbCA9PSAmcGxsNF9hdWRpbykKKwkJcmV0dXJuIFBMTDRfQVVESU87CisJZWxzZSBpZiAocGxsID09ICZwbGw1X3ZpZGVvKQorCQlyZXR1cm4gUExMNV9WSURFTzsKKwllbHNlIGlmIChwbGwgPT0gJnBsbDZfbWxiKQorCQlyZXR1cm4gUExMNl9NTEI7CisJZWxzZSBpZiAocGxsID09ICZwbGw3X3VzYl9ob3N0KQorCQlyZXR1cm4gUExMN19VU0JfSE9TVDsKKwllbHNlIGlmIChwbGwgPT0gJnBsbDhfZW5ldCkKKwkJcmV0dXJuIFBMTDhfRU5FVDsKKwllbHNlCisJCUJVRygpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGxsX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IHRpbWVvdXQgPSAweDEwMDAwMDsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1MzIgdmFsOworCisJcmVnID0gcGxsX2dldF9yZWdfYWRkcihjbGspOworCXZhbCA9IHJlYWRsX3JlbGF4ZWQocmVnKTsKKwl2YWwgJj0gfkJNX1BMTF9CWVBBU1M7CisJdmFsICY9IH5CTV9QTExfUE9XRVJfRE9XTjsKKwkvKiA0ODBNSHogUExMcyBoYXZlIHRoZSBvcHBvc2l0ZSBkZWZpbml0aW9uIGZvciBwb3dlciBiaXQgKi8KKwlpZiAoY2xrID09ICZwbGwzX3VzYl9vdGcgfHwgY2xrID09ICZwbGw3X3VzYl9ob3N0KQorCQl2YWwgfD0gQk1fUExMX1BPV0VSX0RPV047CisJd3JpdGVsX3JlbGF4ZWQodmFsLCByZWcpOworCisJLyogV2FpdCBmb3IgUExMIHRvIGxvY2sgKi8KKwl3aGlsZSAoIShyZWFkbF9yZWxheGVkKHJlZykgJiBCTV9QTExfTE9DSykgJiYgLS10aW1lb3V0KQorCQljcHVfcmVsYXgoKTsKKworCWlmICh1bmxpa2VseSghdGltZW91dCkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBFbmFibGUgdGhlIFBMTCBvdXRwdXQgbm93ICovCisJdmFsID0gcmVhZGxfcmVsYXhlZChyZWcpOworCXZhbCB8PSBCTV9QTExfRU5BQkxFOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbGxfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyIHZhbDsKKworCXJlZyA9IHBsbF9nZXRfcmVnX2FkZHIoY2xrKTsKKwl2YWwgPSByZWFkbF9yZWxheGVkKHJlZyk7CisJdmFsICY9IH5CTV9QTExfRU5BQkxFOworCXZhbCB8PSBCTV9QTExfQllQQVNTOworCXZhbCB8PSBCTV9QTExfUE9XRVJfRE9XTjsKKwlpZiAoY2xrID09ICZwbGwzX3VzYl9vdGcgfHwgY2xrID09ICZwbGw3X3VzYl9ob3N0KQorCQl2YWwgJj0gfkJNX1BMTF9QT1dFUl9ET1dOOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcmVnKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxsMV9zeXNfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiBkaXYgPSAocmVhZGxfcmVsYXhlZChQTEwxX1NZUykgJiBCTV9QTExfU1lTX0RJVl9TRUxFQ1QpID4+CisJCSAgQlBfUExMX1NZU19ESVZfU0VMRUNUOworCisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgKiBkaXYgLyAyOworfQorCitzdGF0aWMgaW50IHBsbDFfc3lzX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXUzMiB2YWwsIGRpdjsKKworCWlmIChyYXRlIDwgRlJFUV82NTBNIHx8IHJhdGUgPiBGUkVRXzEzMDBNKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRpdiA9IHJhdGUgKiAyIC8gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl2YWwgPSByZWFkbF9yZWxheGVkKFBMTDFfU1lTKTsKKwl2YWwgJj0gfkJNX1BMTF9TWVNfRElWX1NFTEVDVDsKKwl2YWwgfD0gZGl2IDw8IEJQX1BMTF9TWVNfRElWX1NFTEVDVDsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIFBMTDFfU1lTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGw4X2VuZXRfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiBkaXYgPSAocmVhZGxfcmVsYXhlZChQTEw4X0VORVQpICYgQk1fUExMX0VORVRfRElWX1NFTEVDVCkgPj4KKwkJICBCUF9QTExfRU5FVF9ESVZfU0VMRUNUOworCisJc3dpdGNoIChkaXYpIHsKKwljYXNlIDA6CisJCXJldHVybiAyNTAwMDAwMDsKKwljYXNlIDE6CisJCXJldHVybiA1MDAwMDAwMDsKKwljYXNlIDI6CisJCXJldHVybiAxMDAwMDAwMDA7CisJY2FzZSAzOgorCQlyZXR1cm4gMTI1MDAwMDAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsbDhfZW5ldF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1MzIgdmFsLCBkaXY7CisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDI1MDAwMDAwOgorCQlkaXYgPSAwOworCQlicmVhazsKKwljYXNlIDUwMDAwMDAwOgorCQlkaXYgPSAxOworCQlicmVhazsKKwljYXNlIDEwMDAwMDAwMDoKKwkJZGl2ID0gMjsKKwkJYnJlYWs7CisJY2FzZSAxMjUwMDAwMDA6CisJCWRpdiA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoUExMOF9FTkVUKTsKKwl2YWwgJj0gfkJNX1BMTF9FTkVUX0RJVl9TRUxFQ1Q7CisJdmFsIHw9IGRpdiA8PCBCUF9QTExfRU5FVF9ESVZfU0VMRUNUOworCXdyaXRlbF9yZWxheGVkKHZhbCwgUExMOF9FTkVUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGxfYXZfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gKGNsayA9PSAmcGxsNF9hdWRpbykgPyBQTEw0X0FVRElPIDogUExMNV9WSURFTzsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1MzIgbWZuID0gcmVhZGxfcmVsYXhlZChyZWcgKyBQTExfTlVNX09GRlNFVCk7CisJdTMyIG1mZCA9IHJlYWRsX3JlbGF4ZWQocmVnICsgUExMX0RFTk9NX09GRlNFVCk7CisJdTMyIGRpdiA9IChyZWFkbF9yZWxheGVkKHJlZykgJiBCTV9QTExfQVZfRElWX1NFTEVDVCkgPj4KKwkJICBCUF9QTExfQVZfRElWX1NFTEVDVDsKKworCXJldHVybiAocGFyZW50X3JhdGUgKiBkaXYpICsgKChwYXJlbnRfcmF0ZSAvIG1mZCkgKiBtZm4pOworfQorCitzdGF0aWMgaW50IHBsbF9hdl9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IChjbGsgPT0gJnBsbDRfYXVkaW8pID8gUExMNF9BVURJTyA6IFBMTDVfVklERU87CisJdW5zaWduZWQgaW50IHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1MzIgdmFsLCBkaXY7CisJdTMyIG1mbiwgbWZkID0gMTAwMDAwMDsKKwlzNjQgdGVtcDY0OworCisJaWYgKHJhdGUgPCBGUkVRXzY1ME0gfHwgcmF0ZSA+IEZSRVFfMTMwME0pCisJCXJldHVybiAtRUlOVkFMOworCisJZGl2ID0gcmF0ZSAvIHBhcmVudF9yYXRlOworCXRlbXA2NCA9ICh1NjQpIChyYXRlIC0gZGl2ICogcGFyZW50X3JhdGUpOworCXRlbXA2NCAqPSBtZmQ7CisJZG9fZGl2KHRlbXA2NCwgcGFyZW50X3JhdGUpOworCW1mbiA9IHRlbXA2NDsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQocmVnKTsKKwl2YWwgJj0gfkJNX1BMTF9BVl9ESVZfU0VMRUNUOworCXZhbCB8PSBkaXYgPDwgQlBfUExMX0FWX0RJVl9TRUxFQ1Q7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCByZWcpOworCXdyaXRlbF9yZWxheGVkKG1mbiwgcmVnICsgUExMX05VTV9PRkZTRVQpOworCXdyaXRlbF9yZWxheGVkKG1mZCwgcmVnICsgUExMX0RFTk9NX09GRlNFVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqcGxsX2dldF9kaXZfcmVnX2JpdChzdHJ1Y3QgY2xrICpjbGssIHUzMiAqYnAsIHUzMiAqYm0pCit7CisJdm9pZCBfX2lvbWVtICpyZWc7CisKKwlpZiAoY2xrID09ICZwbGwyX2J1cykgeworCQlyZWcgPSBQTEwyX0JVUzsKKwkJKmJwID0gQlBfUExMX0JVU19ESVZfU0VMRUNUOworCQkqYm0gPSBCTV9QTExfQlVTX0RJVl9TRUxFQ1Q7CisJfSBlbHNlIGlmIChjbGsgPT0gJnBsbDNfdXNiX290ZykgeworCQlyZWcgPSBQTEwzX1VTQl9PVEc7CisJCSpicCA9IEJQX1BMTF9VU0JfRElWX1NFTEVDVDsKKwkJKmJtID0gQk1fUExMX1VTQl9ESVZfU0VMRUNUOworCX0gZWxzZSBpZiAoY2xrID09ICZwbGw3X3VzYl9ob3N0KSB7CisJCXJlZyA9IFBMTDdfVVNCX0hPU1Q7CisJCSpicCA9IEJQX1BMTF9VU0JfRElWX1NFTEVDVDsKKwkJKmJtID0gQk1fUExMX1VTQl9ESVZfU0VMRUNUOworCX0gZWxzZSB7CisJCUJVRygpOworCX0KKworCXJldHVybiByZWc7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBsbF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyIGRpdiwgYnAsIGJtOworCisJcmVnID0gcGxsX2dldF9kaXZfcmVnX2JpdChjbGssICZicCwgJmJtKTsKKwlkaXYgPSAocmVhZGxfcmVsYXhlZChyZWcpICYgYm0pID4+IGJwOworCisJcmV0dXJuIChkaXYgPT0gMSkgPyBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpICogMjIgOgorCQkJICAgIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgKiAyMDsKK30KKworc3RhdGljIGludCBwbGxfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyIHZhbCwgZGl2LCBicCwgYm07CisKKwlpZiAocmF0ZSA9PSBGUkVRXzUyOE0pCisJCWRpdiA9IDE7CisJZWxzZSBpZiAocmF0ZSA9PSBGUkVRXzQ4ME0pCisJCWRpdiA9IDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZyA9IHBsbF9nZXRfZGl2X3JlZ19iaXQoY2xrLCAmYnAsICZibSk7CisJdmFsID0gcmVhZGxfcmVsYXhlZChyZWcpOworCXZhbCAmPSB+Ym07CisJdmFsIHw9IGRpdiA8PCBicDsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBwbGwyX2J1c19nZXRfcmF0ZQlwbGxfZ2V0X3JhdGUKKyNkZWZpbmUgcGxsMl9idXNfc2V0X3JhdGUJcGxsX3NldF9yYXRlCisjZGVmaW5lIHBsbDNfdXNiX290Z19nZXRfcmF0ZQlwbGxfZ2V0X3JhdGUKKyNkZWZpbmUgcGxsM191c2Jfb3RnX3NldF9yYXRlCXBsbF9zZXRfcmF0ZQorI2RlZmluZSBwbGw3X3VzYl9ob3N0X2dldF9yYXRlCXBsbF9nZXRfcmF0ZQorI2RlZmluZSBwbGw3X3VzYl9ob3N0X3NldF9yYXRlCXBsbF9zZXRfcmF0ZQorI2RlZmluZSBwbGw0X2F1ZGlvX2dldF9yYXRlCXBsbF9hdl9nZXRfcmF0ZQorI2RlZmluZSBwbGw0X2F1ZGlvX3NldF9yYXRlCXBsbF9hdl9zZXRfcmF0ZQorI2RlZmluZSBwbGw1X3ZpZGVvX2dldF9yYXRlCXBsbF9hdl9nZXRfcmF0ZQorI2RlZmluZSBwbGw1X3ZpZGVvX3NldF9yYXRlCXBsbF9hdl9zZXRfcmF0ZQorI2RlZmluZSBwbGw2X21sYl9nZXRfcmF0ZQlOVUxMCisjZGVmaW5lIHBsbDZfbWxiX3NldF9yYXRlCU5VTEwKKworI2RlZmluZSBERUZfUExMKG5hbWUpCQkJCQlcCisJc3RhdGljIHN0cnVjdCBjbGsgbmFtZSA9IHsJCQlcCisJCS5lbmFibGUJCT0gcGxsX2VuYWJsZSwJCVwKKwkJLmRpc2FibGUJPSBwbGxfZGlzYWJsZSwJCVwKKwkJLmdldF9yYXRlCT0gbmFtZSMjX2dldF9yYXRlLAlcCisJCS5zZXRfcmF0ZQk9IG5hbWUjI19zZXRfcmF0ZSwJXAorCQkucGFyZW50CQk9ICZvc2NfY2xrLAkJXAorCX0KKworREVGX1BMTChwbGwxX3N5cyk7CitERUZfUExMKHBsbDJfYnVzKTsKK0RFRl9QTEwocGxsM191c2Jfb3RnKTsKK0RFRl9QTEwocGxsNF9hdWRpbyk7CitERUZfUExMKHBsbDVfdmlkZW8pOworREVGX1BMTChwbGw2X21sYik7CitERUZfUExMKHBsbDdfdXNiX2hvc3QpOworREVGX1BMTChwbGw4X2VuZXQpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZmRfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXU2NCB0bXAgPSAodTY0KSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpICogMTg7CisJdTMyIGZyYWMsIGJwX2ZyYWM7CisKKwlpZiAoYXBiaF9kbWFfY2xrLnVzZWNvdW50ID09IDApCisJCWFwYmhfZG1hX2Nsay5lbmFibGUoJmFwYmhfZG1hX2Nsayk7CisKKwlicF9mcmFjID0gY2xrLT5lbmFibGVfc2hpZnQgLSA3OworCWZyYWMgPSByZWFkbF9yZWxheGVkKGNsay0+ZW5hYmxlX3JlZykgPj4gYnBfZnJhYyAmIFBGRF9GUkFDX01BU0s7CisJZG9fZGl2KHRtcCwgZnJhYyk7CisKKwlyZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW50IHBmZF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1MzIgdmFsLCBmcmFjLCBicF9mcmFjOworCXU2NCB0bXAgPSAodTY0KSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpICogMTg7CisKKwlpZiAoYXBiaF9kbWFfY2xrLnVzZWNvdW50ID09IDApCisJCWFwYmhfZG1hX2Nsay5lbmFibGUoJmFwYmhfZG1hX2Nsayk7CisKKwkvKgorCSAqIFJvdW5kIHVwIHRoZSBkaXZpZGVyIHNvIHRoYXQgd2UgZG9uJ3Qgc2V0IGEgcmF0ZQorCSAqIGhpZ2hlciB0aGFuIHdoYXQgaXMgcmVxdWVzdGVkCisJICovCisJdG1wICs9IHJhdGUgLyAyOworCWRvX2Rpdih0bXAsIHJhdGUpOworCWZyYWMgPSB0bXA7CisJZnJhYyA9IChmcmFjIDwgMTIpID8gMTIgOiBmcmFjOworCWZyYWMgPSAoZnJhYyA+IDM1KSA/IDM1IDogZnJhYzsKKworCS8qCisJICogVGhlIGZyYWMgZmllbGQgYWx3YXlzIHN0YXJ0cyBmcm9tIDcgYml0cyBsb3dlcgorCSAqIHBvc2l0aW9uIG9mIGVuYWJsZSBiaXQKKwkgKi8KKwlicF9mcmFjID0gY2xrLT5lbmFibGVfc2hpZnQgLSA3OworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoY2xrLT5lbmFibGVfcmVnKTsKKwl2YWwgJj0gfihQRkRfRlJBQ19NQVNLIDw8IGJwX2ZyYWMpOworCXZhbCB8PSBmcmFjIDw8IGJwX2ZyYWM7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBjbGstPmVuYWJsZV9yZWcpOworCisJdG1wID0gKHU2NCkgY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAqIDE4OworCWRvX2Rpdih0bXAsIGZyYWMpOworCisJaWYgKGFwYmhfZG1hX2Nsay51c2Vjb3VudCA9PSAwKQorCQlhcGJoX2RtYV9jbGsuZGlzYWJsZSgmYXBiaF9kbWFfY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZmRfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1MzIgZnJhYzsKKwl1NjQgdG1wOworCisJdG1wID0gKHU2NCkgY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAqIDE4OworCXRtcCArPSByYXRlIC8gMjsKKwlkb19kaXYodG1wLCByYXRlKTsKKwlmcmFjID0gdG1wOworCWZyYWMgPSAoZnJhYyA8IDEyKSA/IDEyIDogZnJhYzsKKwlmcmFjID0gKGZyYWMgPiAzNSkgPyAzNSA6IGZyYWM7CisJdG1wID0gKHU2NCkgY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAqIDE4OworCWRvX2Rpdih0bXAsIGZyYWMpOworCisJcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGludCBwZmRfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1MzIgdmFsOworCisJaWYgKGFwYmhfZG1hX2Nsay51c2Vjb3VudCA9PSAwKQorCQlhcGJoX2RtYV9jbGsuZW5hYmxlKCZhcGJoX2RtYV9jbGspOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChjbGstPmVuYWJsZV9yZWcpOworCXZhbCAmPSB+KDEgPDwgY2xrLT5lbmFibGVfc2hpZnQpOworCXdyaXRlbF9yZWxheGVkKHZhbCwgY2xrLT5lbmFibGVfcmVnKTsKKworCWlmIChhcGJoX2RtYV9jbGsudXNlY291bnQgPT0gMCkKKwkJYXBiaF9kbWFfY2xrLmRpc2FibGUoJmFwYmhfZG1hX2Nsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGZkX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiB2YWw7CisKKwlpZiAoYXBiaF9kbWFfY2xrLnVzZWNvdW50ID09IDApCisJCWFwYmhfZG1hX2Nsay5lbmFibGUoJmFwYmhfZG1hX2Nsayk7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKGNsay0+ZW5hYmxlX3JlZyk7CisJdmFsIHw9IDEgPDwgY2xrLT5lbmFibGVfc2hpZnQ7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBjbGstPmVuYWJsZV9yZWcpOworCisJaWYgKGFwYmhfZG1hX2Nsay51c2Vjb3VudCA9PSAwKQorCQlhcGJoX2RtYV9jbGsuZGlzYWJsZSgmYXBiaF9kbWFfY2xrKTsKK30KKworI2RlZmluZSBERUZfUEZEKG5hbWUsIGVyLCBlcywgcCkJCQlcCisJc3RhdGljIHN0cnVjdCBjbGsgbmFtZSA9IHsJCQlcCisJCS5lbmFibGVfcmVnCT0gZXIsCQkJXAorCQkuZW5hYmxlX3NoaWZ0CT0gZXMsCQkJXAorCQkuZW5hYmxlCQk9IHBmZF9lbmFibGUsCQlcCisJCS5kaXNhYmxlCT0gcGZkX2Rpc2FibGUsCQlcCisJCS5nZXRfcmF0ZQk9IHBmZF9nZXRfcmF0ZSwJCVwKKwkJLnNldF9yYXRlCT0gcGZkX3NldF9yYXRlLAkJXAorCQkucm91bmRfcmF0ZQk9IHBmZF9yb3VuZF9yYXRlLAlcCisJCS5wYXJlbnQJCT0gcCwJCQlcCisJfQorCitERUZfUEZEKHBsbDJfcGZkXzM1Mm0sIFBGRF81MjgsIFBGRDAsICZwbGwyX2J1cyk7CitERUZfUEZEKHBsbDJfcGZkXzU5NG0sIFBGRF81MjgsIFBGRDEsICZwbGwyX2J1cyk7CitERUZfUEZEKHBsbDJfcGZkXzQwMG0sIFBGRF81MjgsIFBGRDIsICZwbGwyX2J1cyk7CitERUZfUEZEKHBsbDNfcGZkXzcyMG0sIFBGRF80ODAsIFBGRDAsICZwbGwzX3VzYl9vdGcpOworREVGX1BGRChwbGwzX3BmZF81NDBtLCBQRkRfNDgwLCBQRkQxLCAmcGxsM191c2Jfb3RnKTsKK0RFRl9QRkQocGxsM19wZmRfNTA4bSwgUEZEXzQ4MCwgUEZEMiwgJnBsbDNfdXNiX290Zyk7CitERUZfUEZEKHBsbDNfcGZkXzQ1NG0sIFBGRF80ODAsIFBGRDMsICZwbGwzX3VzYl9vdGcpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGwyXzIwMG1fZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gMjsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgcGxsMl8yMDBtID0geworCS5wYXJlbnQgPSAmcGxsMl9wZmRfNDAwbSwKKwkuZ2V0X3JhdGUgPSBwbGwyXzIwMG1fZ2V0X3JhdGUsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGwzXzEyMG1fZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gNDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgcGxsM18xMjBtID0geworCS5wYXJlbnQgPSAmcGxsM191c2Jfb3RnLAorCS5nZXRfcmF0ZSA9IHBsbDNfMTIwbV9nZXRfcmF0ZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBsbDNfODBtX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIDY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbDNfODBtID0geworCS5wYXJlbnQgPSAmcGxsM191c2Jfb3RnLAorCS5nZXRfcmF0ZSA9IHBsbDNfODBtX2dldF9yYXRlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxsM182MG1fZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gODsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgcGxsM182MG0gPSB7CisJLnBhcmVudCA9ICZwbGwzX3VzYl9vdGcsCisJLmdldF9yYXRlID0gcGxsM182MG1fZ2V0X3JhdGUsCit9OworCitzdGF0aWMgaW50IHBsbDFfc3dfY2xrX3NldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJdTMyIHZhbCA9IHJlYWRsX3JlbGF4ZWQoQ0NTUik7CisKKwlpZiAocGFyZW50ID09ICZwbGwxX3N5cykgeworCQl2YWwgJj0gfkJNX0NDU1JfUExMMV9TV19TRUw7CisJCXZhbCAmPSB+Qk1fQ0NTUl9TVEVQX1NFTDsKKwl9IGVsc2UgaWYgKHBhcmVudCA9PSAmb3NjX2NsaykgeworCQl2YWwgfD0gQk1fQ0NTUl9QTEwxX1NXX1NFTDsKKwkJdmFsICY9IH5CTV9DQ1NSX1NURVBfU0VMOworCX0gZWxzZSBpZiAocGFyZW50ID09ICZwbGwyX3BmZF80MDBtKSB7CisJCXZhbCB8PSBCTV9DQ1NSX1BMTDFfU1dfU0VMOworCQl2YWwgfD0gQk1fQ0NTUl9TVEVQX1NFTDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIENDU1IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbDFfc3dfY2xrID0geworCS5wYXJlbnQgPSAmcGxsMV9zeXMsCisJLnNldF9wYXJlbnQgPSBwbGwxX3N3X2Nsa19zZXRfcGFyZW50LAorfTsKKworc3RhdGljIHZvaWQgY2FsY19wcmVkX3BvZGZfZGl2aWRlcnModTMyIGRpdiwgdTMyICpwcmVkLCB1MzIgKnBvZGYpCit7CisJdTMyIG1pbl9wcmVkLCB0ZW1wX3ByZWQsIG9sZF9lcnIsIGVycjsKKworCWlmIChkaXYgPj0gNTEyKSB7CisJCSpwcmVkID0gODsKKwkJKnBvZGYgPSA2NDsKKwl9IGVsc2UgaWYgKGRpdiA+PSA4KSB7CisJCW1pbl9wcmVkID0gKGRpdiAtIDEpIC8gNjQgKyAxOworCQlvbGRfZXJyID0gODsKKwkJZm9yICh0ZW1wX3ByZWQgPSA4OyB0ZW1wX3ByZWQgPj0gbWluX3ByZWQ7IHRlbXBfcHJlZC0tKSB7CisJCQllcnIgPSBkaXYgJSB0ZW1wX3ByZWQ7CisJCQlpZiAoZXJyID09IDApIHsKKwkJCQkqcHJlZCA9IHRlbXBfcHJlZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVyciA9IHRlbXBfcHJlZCAtIGVycjsKKwkJCWlmIChlcnIgPCBvbGRfZXJyKSB7CisJCQkJb2xkX2VyciA9IGVycjsKKwkJCQkqcHJlZCA9IHRlbXBfcHJlZDsKKwkJCX0KKwkJfQorCQkqcG9kZiA9IChkaXYgKyAqcHJlZCAtIDEpIC8gKnByZWQ7CisJfSBlbHNlIGlmIChkaXYgPCA4KSB7CisJCSpwcmVkID0gZGl2OworCQkqcG9kZiA9IDE7CisJfQorfQorCitzdGF0aWMgaW50IF9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1MzIgcmVnOworCXJlZyA9IHJlYWRsX3JlbGF4ZWQoY2xrLT5lbmFibGVfcmVnKTsKKwlyZWcgfD0gMHgzIDw8IGNsay0+ZW5hYmxlX3NoaWZ0OworCXdyaXRlbF9yZWxheGVkKHJlZywgY2xrLT5lbmFibGVfcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiByZWc7CisJcmVnID0gcmVhZGxfcmVsYXhlZChjbGstPmVuYWJsZV9yZWcpOworCXJlZyAmPSB+KDB4MyA8PCBjbGstPmVuYWJsZV9zaGlmdCk7CisJd3JpdGVsX3JlbGF4ZWQocmVnLCBjbGstPmVuYWJsZV9yZWcpOworfQorCitzdHJ1Y3QgZGl2aWRlciB7CisJc3RydWN0IGNsayAqY2xrOworCXZvaWQgX19pb21lbSAqcmVnOworCXUzMiBicF9wcmVkOworCXUzMiBibV9wcmVkOworCXUzMiBicF9wb2RmOworCXUzMiBibV9wb2RmOworfTsKKworI2RlZmluZSBERUZfQ0xLX0RJVjEoZCwgYywgciwgYikJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgZGl2aWRlciBkID0gewkJCQlcCisJCS5jbGsgPSBjLAkJCQkJXAorCQkucmVnID0gciwJCQkJCVwKKwkJLmJwX3BvZGYgPSBCUF8jI3IjI18jI2IjI19QT0RGLAkJCVwKKwkJLmJtX3BvZGYgPSBCTV8jI3IjI18jI2IjI19QT0RGLAkJCVwKKwl9CisKK0RFRl9DTEtfRElWMShhcm1fZGl2LAkJJmFybV9jbGssCQlDQUNSUiwJQVJNKTsKK0RFRl9DTEtfRElWMShpcGdfZGl2LAkJJmlwZ19jbGssCQlDQkNEUiwJSVBHKTsKK0RFRl9DTEtfRElWMShhaGJfZGl2LAkJJmFoYl9jbGssCQlDQkNEUiwJQUhCKTsKK0RFRl9DTEtfRElWMShheGlfZGl2LAkJJmF4aV9jbGssCQlDQkNEUiwJQVhJKTsKK0RFRl9DTEtfRElWMShtbWRjX2NoMF9heGlfZGl2LAkmbW1kY19jaDBfYXhpX2NsaywJQ0JDRFIsCU1NRENfQ0gwX0FYSSk7CitERUZfQ0xLX0RJVjEobW1kY19jaDFfYXhpX2RpdiwJJm1tZGNfY2gxX2F4aV9jbGssCUNCQ0RSLAlNTURDX0NIMV9BWEkpOworREVGX0NMS19ESVYxKHBlcmlwaF9jbGsyX2RpdiwJJnBlcmlwaF9jbGsyX2NsaywJQ0JDRFIsCVBFUklQSF9DTEsyKTsKK0RFRl9DTEtfRElWMShwZXJpcGgyX2NsazJfZGl2LAkmcGVyaXBoMl9jbGsyX2NsaywJQ0JDRFIsCVBFUklQSDJfQ0xLMik7CitERUZfQ0xLX0RJVjEoZ3B1MmRfY29yZV9kaXYsCSZncHUyZF9jb3JlX2NsaywJQ0JDTVIsCUdQVTJEX0NPUkUpOworREVGX0NMS19ESVYxKGdwdTNkX2NvcmVfZGl2LAkmZ3B1M2RfY29yZV9jbGssCUNCQ01SLAlHUFUzRF9DT1JFKTsKK0RFRl9DTEtfRElWMShncHUzZF9zaGFkZXJfZGl2LAkmZ3B1M2Rfc2hhZGVyX2NsaywJQ0JDTVIsCUdQVTNEX1NIQURFUik7CitERUZfQ0xLX0RJVjEoaXBnX3BlcmNsa19kaXYsCSZpcGdfcGVyY2xrLAkJQ1NDTVIxLAlQRVJDTEspOworREVGX0NMS19ESVYxKGVtaV9kaXYsCQkmZW1pX2NsaywJCUNTQ01SMSwJRU1JKTsKK0RFRl9DTEtfRElWMShlbWlfc2xvd19kaXYsCSZlbWlfc2xvd19jbGssCQlDU0NNUjEsCUVNSV9TTE9XKTsKK0RFRl9DTEtfRElWMShjYW5fZGl2LAkJJmNhbjFfY2xrLAkJQ1NDTVIyLAlDQU4pOworREVGX0NMS19ESVYxKHVhcnRfZGl2LAkJJnVhcnRfY2xrLAkJQ1NDRFIxLAlVQVJUKTsKK0RFRl9DTEtfRElWMSh1c2RoYzFfZGl2LAkmdXNkaGMxX2NsaywJCUNTQ0RSMSwJVVNESEMxKTsKK0RFRl9DTEtfRElWMSh1c2RoYzJfZGl2LAkmdXNkaGMyX2NsaywJCUNTQ0RSMSwJVVNESEMyKTsKK0RFRl9DTEtfRElWMSh1c2RoYzNfZGl2LAkmdXNkaGMzX2NsaywJCUNTQ0RSMSwJVVNESEMzKTsKK0RFRl9DTEtfRElWMSh1c2RoYzRfZGl2LAkmdXNkaGM0X2NsaywJCUNTQ0RSMSwJVVNESEM0KTsKK0RFRl9DTEtfRElWMSh2cHVfZGl2LAkJJnZwdV9jbGssCQlDU0NEUjEsCVZQVV9BWEkpOworREVGX0NMS19ESVYxKGhzaV90eF9kaXYsCSZoc2lfdHhfY2xrLAkJQ0RDRFIsCUhTSV9UWCk7CitERUZfQ0xLX0RJVjEoaXB1MV9kaTBfcHJlX2RpdiwJJmlwdTFfZGkwX3ByZV9jbGssCUNIU0NDRFIsIElQVTFfREkwX1BSRSk7CitERUZfQ0xLX0RJVjEoaXB1MV9kaTFfcHJlX2RpdiwJJmlwdTFfZGkxX3ByZV9jbGssCUNIU0NDRFIsIElQVTFfREkxX1BSRSk7CitERUZfQ0xLX0RJVjEoaXB1Ml9kaTBfcHJlX2RpdiwJJmlwdTJfZGkwX3ByZV9jbGssCUNTQ0RSMiwJSVBVMl9ESTBfUFJFKTsKK0RFRl9DTEtfRElWMShpcHUyX2RpMV9wcmVfZGl2LAkmaXB1Ml9kaTFfcHJlX2NsaywJQ1NDRFIyLAlJUFUyX0RJMV9QUkUpOworREVGX0NMS19ESVYxKGlwdTFfZGl2LAkJJmlwdTFfY2xrLAkJQ1NDRFIzLAlJUFUxX0hTUCk7CitERUZfQ0xLX0RJVjEoaXB1Ml9kaXYsCQkmaXB1Ml9jbGssCQlDU0NEUjMsCUlQVTJfSFNQKTsKKworI2RlZmluZSBERUZfQ0xLX0RJVjIoZCwgYywgciwgYikJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgZGl2aWRlciBkID0gewkJCQlcCisJCS5jbGsgPSBjLAkJCQkJXAorCQkucmVnID0gciwJCQkJCVwKKwkJLmJwX3ByZWQgPSBCUF8jI3IjI18jI2IjI19QUkVELAkJCVwKKwkJLmJtX3ByZWQgPSBCTV8jI3IjI18jI2IjI19QUkVELAkJCVwKKwkJLmJwX3BvZGYgPSBCUF8jI3IjI18jI2IjI19QT0RGLAkJCVwKKwkJLmJtX3BvZGYgPSBCTV8jI3IjI18jI2IjI19QT0RGLAkJCVwKKwl9CisKK0RFRl9DTEtfRElWMihzc2kxX2RpdiwJCSZzc2kxX2NsaywJCUNTMUNEUiwJU1NJMSk7CitERUZfQ0xLX0RJVjIoc3NpM19kaXYsCQkmc3NpM19jbGssCQlDUzFDRFIsCVNTSTMpOworREVGX0NMS19ESVYyKGVzYWlfZGl2LAkJJmVzYWlfY2xrLAkJQ1MxQ0RSLAlFU0FJKTsKK0RFRl9DTEtfRElWMihzc2kyX2RpdiwJCSZzc2kyX2NsaywJCUNTMkNEUiwJU1NJMik7CitERUZfQ0xLX0RJVjIoZW5mY19kaXYsCQkmZW5mY19jbGssCQlDUzJDRFIsCUVORkMpOworREVGX0NMS19ESVYyKHNwZGlmX2RpdiwJCSZzcGRpZl9jbGssCQlDRENEUiwJU1BESUYpOworREVGX0NMS19ESVYyKGFzcmNfc2VyaWFsX2RpdiwJJmFzcmNfc2VyaWFsX2NsaywJQ0RDRFIsCUFTUkNfU0VSSUFMKTsKKworc3RhdGljIHN0cnVjdCBkaXZpZGVyICpkaXZpZGVyc1tdID0geworCSZhcm1fZGl2LAorCSZpcGdfZGl2LAorCSZhaGJfZGl2LAorCSZheGlfZGl2LAorCSZtbWRjX2NoMF9heGlfZGl2LAorCSZtbWRjX2NoMV9heGlfZGl2LAorCSZwZXJpcGhfY2xrMl9kaXYsCisJJnBlcmlwaDJfY2xrMl9kaXYsCisJJmdwdTJkX2NvcmVfZGl2LAorCSZncHUzZF9jb3JlX2RpdiwKKwkmZ3B1M2Rfc2hhZGVyX2RpdiwKKwkmaXBnX3BlcmNsa19kaXYsCisJJmVtaV9kaXYsCisJJmVtaV9zbG93X2RpdiwKKwkmY2FuX2RpdiwKKwkmdWFydF9kaXYsCisJJnVzZGhjMV9kaXYsCisJJnVzZGhjMl9kaXYsCisJJnVzZGhjM19kaXYsCisJJnVzZGhjNF9kaXYsCisJJnZwdV9kaXYsCisJJmhzaV90eF9kaXYsCisJJmlwdTFfZGkwX3ByZV9kaXYsCisJJmlwdTFfZGkxX3ByZV9kaXYsCisJJmlwdTJfZGkwX3ByZV9kaXYsCisJJmlwdTJfZGkxX3ByZV9kaXYsCisJJmlwdTFfZGl2LAorCSZpcHUyX2RpdiwKKwkmc3NpMV9kaXYsCisJJnNzaTNfZGl2LAorCSZlc2FpX2RpdiwKKwkmc3NpMl9kaXYsCisJJmVuZmNfZGl2LAorCSZzcGRpZl9kaXYsCisJJmFzcmNfc2VyaWFsX2RpdiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxkYl9kaV9jbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiB2YWwgPSByZWFkbF9yZWxheGVkKENTQ01SMik7CisKKwl2YWwgJj0gKGNsayA9PSAmbGRiX2RpMF9jbGspID8gQk1fQ1NDTVIyX0xEQl9ESTBfSVBVX0RJViA6CisJCQkJICAgICAgIEJNX0NTQ01SMl9MREJfREkxX0lQVV9ESVY7CisJaWYgKHZhbCkKKwkJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyA3OworCWVsc2UKKwkJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgKiAyIC8gNzsKK30KKworc3RhdGljIGludCBsZGJfZGlfY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXUzMiB2YWwgPSByZWFkbF9yZWxheGVkKENTQ01SMik7CisKKwlpZiAocmF0ZSAqIDcgPD0gcGFyZW50X3JhdGUgKyBwYXJlbnRfcmF0ZSAvIDIwKQorCQl2YWwgfD0gQk1fQ1NDTVIyX0xEQl9ESTBfSVBVX0RJVjsKKwllbHNlCisJCXZhbCAmPSB+Qk1fQ1NDTVIyX0xEQl9ESTBfSVBVX0RJVjsKKworCXdyaXRlbF9yZWxheGVkKHZhbCwgQ1NDTVIyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsZGJfZGlfY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlpZiAocmF0ZSAqIDcgPD0gcGFyZW50X3JhdGUgKyBwYXJlbnRfcmF0ZSAvIDIwKQorCQlyZXR1cm4gcGFyZW50X3JhdGUgLyA3OworCWVsc2UKKwkJcmV0dXJuIDIgKiBwYXJlbnRfcmF0ZSAvIDc7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9jbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXN0cnVjdCBkaXZpZGVyICpkOworCXUzMiB2YWwsIHByZWQsIHBvZGY7CisJaW50IGksIG51bTsKKworCWlmIChjbGsgPT0gJmxkYl9kaTBfY2xrIHx8IGNsayA9PSAmbGRiX2RpMV9jbGspCisJCXJldHVybiBsZGJfZGlfY2xrX2dldF9yYXRlKGNsayk7CisKKwludW0gPSBBUlJBWV9TSVpFKGRpdmlkZXJzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWlmIChkaXZpZGVyc1tpXS0+Y2xrID09IGNsaykgeworCQkJZCA9IGRpdmlkZXJzW2ldOworCQkJYnJlYWs7CisJCX0KKwlpZiAoaSA9PSBudW0pCisJCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChkLT5yZWcpOworCXByZWQgPSAoKHZhbCAmIGQtPmJtX3ByZWQpID4+IGQtPmJwX3ByZWQpICsgMTsKKwlwb2RmID0gKCh2YWwgJiBkLT5ibV9wb2RmKSA+PiBkLT5icF9wb2RmKSArIDE7CisKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIChwcmVkICogcG9kZik7Cit9CisKK3N0YXRpYyBpbnQgY2xrX2J1c3lfd2FpdChzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IHRpbWVvdXQgPSAweDEwMDAwMDsKKwl1MzIgYm07CisKKwlpZiAoY2xrID09ICZheGlfY2xrKQorCQlibSA9IEJNX0NESElQUl9BWElfUE9ERl9CVVNZOworCWVsc2UgaWYgKGNsayA9PSAmYWhiX2NsaykKKwkJYm0gPSBCTV9DREhJUFJfQUhCX1BPREZfQlVTWTsKKwllbHNlIGlmIChjbGsgPT0gJm1tZGNfY2gwX2F4aV9jbGspCisJCWJtID0gQk1fQ0RISVBSX01NRENfQ0gwX1BPREZfQlVTWTsKKwllbHNlIGlmIChjbGsgPT0gJnBlcmlwaF9jbGspCisJCWJtID0gQk1fQ0RISVBSX1BFUklQSF9TRUxfQlVTWTsKKwllbHNlIGlmIChjbGsgPT0gJmFybV9jbGspCisJCWJtID0gQk1fQ0RISVBSX0FSTV9QT0RGX0JVU1k7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlICgocmVhZGxfcmVsYXhlZChDREhJUFIpICYgYm0pICYmIC0tdGltZW91dCkKKwkJY3B1X3JlbGF4KCk7CisKKwlpZiAodW5saWtlbHkoIXRpbWVvdXQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2Nsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwlzdHJ1Y3QgZGl2aWRlciAqZDsKKwl1MzIgdmFsLCBkaXYsIG1heF9kaXYsIHByZWQgPSAwLCBwb2RmOworCWludCBpLCBudW07CisKKwlpZiAoY2xrID09ICZsZGJfZGkwX2NsayB8fCBjbGsgPT0gJmxkYl9kaTFfY2xrKQorCQlyZXR1cm4gbGRiX2RpX2Nsa19zZXRfcmF0ZShjbGssIHJhdGUpOworCisJbnVtID0gQVJSQVlfU0laRShkaXZpZGVycyk7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQlpZiAoZGl2aWRlcnNbaV0tPmNsayA9PSBjbGspIHsKKwkJCWQgPSBkaXZpZGVyc1tpXTsKKwkJCWJyZWFrOworCQl9CisJaWYgKGkgPT0gbnVtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1heF9kaXYgPSAoKGQtPmJtX3ByZWQgPj4gZC0+YnBfcHJlZCkgKyAxKSAqCisJCSAgKChkLT5ibV9wb2RmID4+IGQtPmJwX3BvZGYpICsgMSk7CisKKwlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7CisJaWYgKGRpdiA9PSAwKQorCQlkaXYrKzsKKworCWlmICgocGFyZW50X3JhdGUgLyBkaXYgIT0gcmF0ZSkgfHwgZGl2ID4gbWF4X2RpdikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZC0+Ym1fcHJlZCkgeworCQljYWxjX3ByZWRfcG9kZl9kaXZpZGVycyhkaXYsICZwcmVkLCAmcG9kZik7CisJfSBlbHNlIHsKKwkJcHJlZCA9IDE7CisJCXBvZGYgPSBkaXY7CisJfQorCisJdmFsID0gcmVhZGxfcmVsYXhlZChkLT5yZWcpOworCXZhbCAmPSB+KGQtPmJtX3ByZWQgfCBkLT5ibV9wb2RmKTsKKwl2YWwgfD0gKHByZWQgLSAxKSA8PCBkLT5icF9wcmVkIHwgKHBvZGYgLSAxKSA8PCBkLT5icF9wb2RmOworCXdyaXRlbF9yZWxheGVkKHZhbCwgZC0+cmVnKTsKKworCWlmIChjbGsgPT0gJmF4aV9jbGsgfHwgY2xrID09ICZhaGJfY2xrIHx8CisJICAgIGNsayA9PSAmbW1kY19jaDBfYXhpX2NsayB8fCBjbGsgPT0gJmFybV9jbGspCisJCXJldHVybiBjbGtfYnVzeV93YWl0KGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX2Nsa19yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXUzMiBkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7CisJdTMyIGRpdl9tYXgsIHByZWQgPSAwLCBwb2RmOworCXN0cnVjdCBkaXZpZGVyICpkOworCWludCBpLCBudW07CisKKwlpZiAoY2xrID09ICZsZGJfZGkwX2NsayB8fCBjbGsgPT0gJmxkYl9kaTFfY2xrKQorCQlyZXR1cm4gbGRiX2RpX2Nsa19yb3VuZF9yYXRlKGNsaywgcmF0ZSk7CisKKwludW0gPSBBUlJBWV9TSVpFKGRpdmlkZXJzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWlmIChkaXZpZGVyc1tpXS0+Y2xrID09IGNsaykgeworCQkJZCA9IGRpdmlkZXJzW2ldOworCQkJYnJlYWs7CisJCX0KKwlpZiAoaSA9PSBudW0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRpdiA9PSAwIHx8IHBhcmVudF9yYXRlICUgcmF0ZSkKKwkJZGl2Kys7CisKKwlpZiAoZC0+Ym1fcHJlZCkgeworCQljYWxjX3ByZWRfcG9kZl9kaXZpZGVycyhkaXYsICZwcmVkLCAmcG9kZik7CisJCWRpdiA9IHByZWQgKiBwb2RmOworCX0gZWxzZSB7CisJCWRpdl9tYXggPSAoZC0+Ym1fcG9kZiA+PiBkLT5icF9wb2RmKSArIDE7CisJCWlmIChkaXYgPiBkaXZfbWF4KQorCQkJZGl2ID0gZGl2X21heDsKKwl9CisKKwlyZXR1cm4gcGFyZW50X3JhdGUgLyBkaXY7Cit9CisKK3N0cnVjdCBtdWx0aXBsZXhlciB7CisJc3RydWN0IGNsayAqY2xrOworCXZvaWQgX19pb21lbSAqcmVnOworCXUzMiBicDsKKwl1MzIgYm07CisJaW50IHBudW07CisJc3RydWN0IGNsayAqcGFyZW50c1tdOworfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBheGlfbXV4ID0geworCS5jbGsgPSAmYXhpX2NsaywKKwkucmVnID0gQ0JDRFIsCisJLmJwID0gQlBfQ0JDRFJfQVhJX1NFTCwKKwkuYm0gPSBCTV9DQkNEUl9BWElfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGVyaXBoX2NsaywKKwkJJnBsbDJfcGZkXzQwMG0sCisJCSZwbGwzX3BmZF81NDBtLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgcGVyaXBoX211eCA9IHsKKwkuY2xrID0gJnBlcmlwaF9jbGssCisJLnJlZyA9IENCQ0RSLAorCS5icCA9IEJQX0NCQ0RSX1BFUklQSF9DTEtfU0VMLAorCS5ibSA9IEJNX0NCQ0RSX1BFUklQSF9DTEtfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGVyaXBoX3ByZV9jbGssCisJCSZwZXJpcGhfY2xrMl9jbGssCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBwZXJpcGhfcHJlX211eCA9IHsKKwkuY2xrID0gJnBlcmlwaF9wcmVfY2xrLAorCS5yZWcgPSBDQkNNUiwKKwkuYnAgPSBCUF9DQkNNUl9QUkVfUEVSSVBIX0NMS19TRUwsCisJLmJtID0gQk1fQ0JDTVJfUFJFX1BFUklQSF9DTEtfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGxsMl9idXMsCisJCSZwbGwyX3BmZF80MDBtLAorCQkmcGxsMl9wZmRfMzUybSwKKwkJJnBsbDJfMjAwbSwKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIHBlcmlwaF9jbGsyX211eCA9IHsKKwkuY2xrID0gJnBlcmlwaF9jbGsyX2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfUEVSSVBIX0NMSzJfU0VMLAorCS5ibSA9IEJNX0NCQ01SX1BFUklQSF9DTEsyX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJnBsbDNfdXNiX290ZywKKwkJJm9zY19jbGssCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBwZXJpcGgyX211eCA9IHsKKwkuY2xrID0gJnBlcmlwaDJfY2xrLAorCS5yZWcgPSBDQkNEUiwKKwkuYnAgPSBCUF9DQkNEUl9QRVJJUEgyX0NMS19TRUwsCisJLmJtID0gQk1fQ0JDRFJfUEVSSVBIMl9DTEtfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGVyaXBoMl9wcmVfY2xrLAorCQkmcGVyaXBoMl9jbGsyX2NsaywKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIHBlcmlwaDJfcHJlX211eCA9IHsKKwkuY2xrID0gJnBlcmlwaDJfcHJlX2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfUFJFX1BFUklQSDJfQ0xLX1NFTCwKKwkuYm0gPSBCTV9DQkNNUl9QUkVfUEVSSVBIMl9DTEtfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGxsMl9idXMsCisJCSZwbGwyX3BmZF80MDBtLAorCQkmcGxsMl9wZmRfMzUybSwKKwkJJnBsbDJfMjAwbSwKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIHBlcmlwaDJfY2xrMl9tdXggPSB7CisJLmNsayA9ICZwZXJpcGgyX2NsazJfY2xrLAorCS5yZWcgPSBDQkNNUiwKKwkuYnAgPSBCUF9DQkNNUl9QRVJJUEgyX0NMSzJfU0VMLAorCS5ibSA9IEJNX0NCQ01SX1BFUklQSDJfQ0xLMl9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZwbGwzX3VzYl9vdGcsCisJCSZvc2NfY2xrLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgZ3B1MmRfYXhpX211eCA9IHsKKwkuY2xrID0gJmdwdTJkX2F4aV9jbGssCisJLnJlZyA9IENCQ01SLAorCS5icCA9IEJQX0NCQ01SX0dQVTJEX0FYSV9TRUwsCisJLmJtID0gQk1fQ0JDTVJfR1BVMkRfQVhJX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJmF4aV9jbGssCisJCSZhaGJfY2xrLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgZ3B1M2RfYXhpX211eCA9IHsKKwkuY2xrID0gJmdwdTNkX2F4aV9jbGssCisJLnJlZyA9IENCQ01SLAorCS5icCA9IEJQX0NCQ01SX0dQVTNEX0FYSV9TRUwsCisJLmJtID0gQk1fQ0JDTVJfR1BVM0RfQVhJX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJmF4aV9jbGssCisJCSZhaGJfY2xrLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgZ3B1M2RfY29yZV9tdXggPSB7CisJLmNsayA9ICZncHUzZF9jb3JlX2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfR1BVM0RfQ09SRV9TRUwsCisJLmJtID0gQk1fQ0JDTVJfR1BVM0RfQ09SRV9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZtbWRjX2NoMF9heGlfY2xrLAorCQkmcGxsM191c2Jfb3RnLAorCQkmcGxsMl9wZmRfNTk0bSwKKwkJJnBsbDJfcGZkXzQwMG0sCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBncHUzZF9zaGFkZXJfbXV4ID0geworCS5jbGsgPSAmZ3B1M2Rfc2hhZGVyX2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfR1BVM0RfU0hBREVSX1NFTCwKKwkuYm0gPSBCTV9DQkNNUl9HUFUzRF9TSEFERVJfU0VMLAorCS5wYXJlbnRzID0geworCQkmbW1kY19jaDBfYXhpX2NsaywKKwkJJnBsbDNfdXNiX290ZywKKwkJJnBsbDJfcGZkXzU5NG0sCisJCSZwbGwzX3BmZF83MjBtLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgcGNpZV9heGlfbXV4ID0geworCS5jbGsgPSAmcGNpZV9jbGssCisJLnJlZyA9IENCQ01SLAorCS5icCA9IEJQX0NCQ01SX1BDSUVfQVhJX1NFTCwKKwkuYm0gPSBCTV9DQkNNUl9QQ0lFX0FYSV9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZheGlfY2xrLAorCQkmYWhiX2NsaywKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIHZkb19heGlfbXV4ID0geworCS5jbGsgPSAmdmRvX2F4aV9jbGssCisJLnJlZyA9IENCQ01SLAorCS5icCA9IEJQX0NCQ01SX1ZET19BWElfU0VMLAorCS5ibSA9IEJNX0NCQ01SX1ZET19BWElfU0VMLAorCS5wYXJlbnRzID0geworCQkmYXhpX2NsaywKKwkJJmFoYl9jbGssCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciB2cHVfYXhpX211eCA9IHsKKwkuY2xrID0gJnZwdV9jbGssCisJLnJlZyA9IENCQ01SLAorCS5icCA9IEJQX0NCQ01SX1ZQVV9BWElfU0VMLAorCS5ibSA9IEJNX0NCQ01SX1ZQVV9BWElfU0VMLAorCS5wYXJlbnRzID0geworCQkmYXhpX2NsaywKKwkJJnBsbDJfcGZkXzQwMG0sCisJCSZwbGwyX3BmZF8zNTJtLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgZ3B1MmRfY29yZV9tdXggPSB7CisJLmNsayA9ICZncHUyZF9jb3JlX2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfR1BVMkRfQ09SRV9TRUwsCisJLmJtID0gQk1fQ0JDTVJfR1BVMkRfQ09SRV9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZheGlfY2xrLAorCQkmcGxsM191c2Jfb3RnLAorCQkmcGxsMl9wZmRfMzUybSwKKwkJJnBsbDJfcGZkXzQwMG0sCisJCU5VTEwKKwl9LAorfTsKKworI2RlZmluZSBERUZfU1NJX01VWChpZCkJCQkJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgc3NpIyNpZCMjX211eCA9IHsJCQlcCisJCS5jbGsgPSAmc3NpIyNpZCMjX2NsaywJCQkJCVwKKwkJLnJlZyA9IENTQ01SMSwJCQkJCQlcCisJCS5icCA9IEJQX0NTQ01SMV9TU0kjI2lkIyNfU0VMLAkJCQlcCisJCS5ibSA9IEJNX0NTQ01SMV9TU0kjI2lkIyNfU0VMLAkJCQlcCisJCS5wYXJlbnRzID0gewkJCQkJCVwKKwkJCSZwbGwzX3BmZF81MDhtLAkJCQkJXAorCQkJJnBsbDNfcGZkXzQ1NG0sCQkJCQlcCisJCQkmcGxsNF9hdWRpbywJCQkJCVwKKwkJCU5VTEwJCQkJCQlcCisJCX0sCQkJCQkJCVwKKwl9CisKK0RFRl9TU0lfTVVYKDEpOworREVGX1NTSV9NVVgoMik7CitERUZfU1NJX01VWCgzKTsKKworI2RlZmluZSBERUZfVVNESENfTVVYKGlkKQkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIHVzZGhjIyNpZCMjX211eCA9IHsJCQlcCisJCS5jbGsgPSAmdXNkaGMjI2lkIyNfY2xrLAkJCQlcCisJCS5yZWcgPSBDU0NNUjEsCQkJCQkJXAorCQkuYnAgPSBCUF9DU0NNUjFfVVNESEMjI2lkIyNfU0VMLAkJCVwKKwkJLmJtID0gQk1fQ1NDTVIxX1VTREhDIyNpZCMjX1NFTCwJCQlcCisJCS5wYXJlbnRzID0gewkJCQkJCVwKKwkJCSZwbGwyX3BmZF80MDBtLAkJCQkJXAorCQkJJnBsbDJfcGZkXzM1Mm0sCQkJCQlcCisJCQlOVUxMCQkJCQkJXAorCQl9LAkJCQkJCQlcCisJfQorCitERUZfVVNESENfTVVYKDEpOworREVGX1VTREhDX01VWCgyKTsKK0RFRl9VU0RIQ19NVVgoMyk7CitERUZfVVNESENfTVVYKDQpOworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGVtaV9tdXggPSB7CisJLmNsayA9ICZlbWlfY2xrLAorCS5yZWcgPSBDU0NNUjEsCisJLmJwID0gQlBfQ1NDTVIxX0VNSV9TRUwsCisJLmJtID0gQk1fQ1NDTVIxX0VNSV9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZheGlfY2xrLAorCQkmcGxsM191c2Jfb3RnLAorCQkmcGxsMl9wZmRfNDAwbSwKKwkJJnBsbDJfcGZkXzM1Mm0sCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBlbWlfc2xvd19tdXggPSB7CisJLmNsayA9ICZlbWlfc2xvd19jbGssCisJLnJlZyA9IENTQ01SMSwKKwkuYnAgPSBCUF9DU0NNUjFfRU1JX1NMT1dfU0VMLAorCS5ibSA9IEJNX0NTQ01SMV9FTUlfU0xPV19TRUwsCisJLnBhcmVudHMgPSB7CisJCSZheGlfY2xrLAorCQkmcGxsM191c2Jfb3RnLAorCQkmcGxsMl9wZmRfNDAwbSwKKwkJJnBsbDJfcGZkXzM1Mm0sCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBlc2FpX211eCA9IHsKKwkuY2xrID0gJmVzYWlfY2xrLAorCS5yZWcgPSBDU0NNUjIsCisJLmJwID0gQlBfQ1NDTVIyX0VTQUlfU0VMLAorCS5ibSA9IEJNX0NTQ01SMl9FU0FJX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJnBsbDRfYXVkaW8sCisJCSZwbGwzX3BmZF81MDhtLAorCQkmcGxsM19wZmRfNDU0bSwKKwkJJnBsbDNfdXNiX290ZywKKwkJTlVMTAorCX0sCit9OworCisjZGVmaW5lIERFRl9MREJfRElfTVVYKGlkKQkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGxkYl9kaSMjaWQjI19tdXggPSB7CQkJXAorCQkuY2xrID0gJmxkYl9kaSMjaWQjI19jbGssCQkJCVwKKwkJLnJlZyA9IENTMkNEUiwJCQkJCQlcCisJCS5icCA9IEJQX0NTMkNEUl9MREJfREkjI2lkIyNfU0VMLAkJCVwKKwkJLmJtID0gQk1fQ1MyQ0RSX0xEQl9ESSMjaWQjI19TRUwsCQkJXAorCQkucGFyZW50cyA9IHsJCQkJCQlcCisJCQkmcGxsNV92aWRlbywJCQkJCVwKKwkJCSZwbGwyX3BmZF8zNTJtLAkJCQkJXAorCQkJJnBsbDJfcGZkXzQwMG0sCQkJCQlcCisJCQkmcGxsM19wZmRfNTQwbSwJCQkJCVwKKwkJCSZwbGwzX3VzYl9vdGcsCQkJCQlcCisJCQlOVUxMCQkJCQkJXAorCQl9LAkJCQkJCQlcCisJfQorCitERUZfTERCX0RJX01VWCgwKTsKK0RFRl9MREJfRElfTVVYKDEpOworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGVuZmNfbXV4ID0geworCS5jbGsgPSAmZW5mY19jbGssCisJLnJlZyA9IENTMkNEUiwKKwkuYnAgPSBCUF9DUzJDRFJfRU5GQ19TRUwsCisJLmJtID0gQk1fQ1MyQ0RSX0VORkNfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGxsMl9wZmRfMzUybSwKKwkJJnBsbDJfYnVzLAorCQkmcGxsM191c2Jfb3RnLAorCQkmcGxsMl9wZmRfNDAwbSwKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIHNwZGlmX211eCA9IHsKKwkuY2xrID0gJnNwZGlmX2NsaywKKwkucmVnID0gQ0RDRFIsCisJLmJwID0gQlBfQ0RDRFJfU1BESUZfU0VMLAorCS5ibSA9IEJNX0NEQ0RSX1NQRElGX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJnBsbDRfYXVkaW8sCisJCSZwbGwzX3BmZF81MDhtLAorCQkmcGxsM19wZmRfNDU0bSwKKwkJJnBsbDNfdXNiX290ZywKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGFzcmNfc2VyaWFsX211eCA9IHsKKwkuY2xrID0gJmFzcmNfc2VyaWFsX2NsaywKKwkucmVnID0gQ0RDRFIsCisJLmJwID0gQlBfQ0RDRFJfQVNSQ19TRVJJQUxfU0VMLAorCS5ibSA9IEJNX0NEQ0RSX0FTUkNfU0VSSUFMX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJnBsbDRfYXVkaW8sCisJCSZwbGwzX3BmZF81MDhtLAorCQkmcGxsM19wZmRfNDU0bSwKKwkJJnBsbDNfdXNiX290ZywKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGhzaV90eF9tdXggPSB7CisJLmNsayA9ICZoc2lfdHhfY2xrLAorCS5yZWcgPSBDRENEUiwKKwkuYnAgPSBCUF9DRENEUl9IU0lfVFhfU0VMLAorCS5ibSA9IEJNX0NEQ0RSX0hTSV9UWF9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZwbGwzXzEyMG0sCisJCSZwbGwyX3BmZF80MDBtLAorCQlOVUxMCisJfSwKK307CisKKyNkZWZpbmUgREVGX0lQVV9ESV9QUkVfTVVYKHIsIGksIGQpCQkJCQlcCisJc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBpcHUjI2kjI19kaSMjZCMjX3ByZV9tdXggPSB7CQlcCisJCS5jbGsgPSAmaXB1IyNpIyNfZGkjI2QjI19wcmVfY2xrLAkJCVwKKwkJLnJlZyA9IHIsCQkJCQkJXAorCQkuYnAgPSBCUF8jI3IjI19JUFUjI2kjI19ESSMjZCMjX1BSRV9TRUwsCQlcCisJCS5ibSA9IEJNXyMjciMjX0lQVSMjaSMjX0RJIyNkIyNfUFJFX1NFTCwJCVwKKwkJLnBhcmVudHMgPSB7CQkJCQkJXAorCQkJJm1tZGNfY2gwX2F4aV9jbGssCQkJCVwKKwkJCSZwbGwzX3VzYl9vdGcsCQkJCQlcCisJCQkmcGxsNV92aWRlbywJCQkJCVwKKwkJCSZwbGwyX3BmZF8zNTJtLAkJCQkJXAorCQkJJnBsbDJfcGZkXzQwMG0sCQkJCQlcCisJCQkmcGxsM19wZmRfNTQwbSwJCQkJCVwKKwkJCU5VTEwJCQkJCQlcCisJCX0sCQkJCQkJCVwKKwl9CisKK0RFRl9JUFVfRElfUFJFX01VWChDSFNDQ0RSLCAxLCAwKTsKK0RFRl9JUFVfRElfUFJFX01VWChDSFNDQ0RSLCAxLCAxKTsKK0RFRl9JUFVfRElfUFJFX01VWChDU0NEUjIsIDIsIDApOworREVGX0lQVV9ESV9QUkVfTVVYKENTQ0RSMiwgMiwgMSk7CisKKyNkZWZpbmUgREVGX0lQVV9ESV9NVVgociwgaSwgZCkJCQkJCQlcCisJc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBpcHUjI2kjI19kaSMjZCMjX211eCA9IHsJCVwKKwkJLmNsayA9ICZpcHUjI2kjI19kaSMjZCMjX2NsaywJCQkJXAorCQkucmVnID0gciwJCQkJCQlcCisJCS5icCA9IEJQXyMjciMjX0lQVSMjaSMjX0RJIyNkIyNfU0VMLAkJCVwKKwkJLmJtID0gQk1fIyNyIyNfSVBVIyNpIyNfREkjI2QjI19TRUwsCQkJXAorCQkucGFyZW50cyA9IHsJCQkJCQlcCisJCQkmaXB1IyNpIyNfZGkjI2QjI19wcmVfY2xrLAkJCVwKKwkJCSZkdW1teV9jbGssCQkJCQlcCisJCQkmZHVtbXlfY2xrLAkJCQkJXAorCQkJJmxkYl9kaTBfY2xrLAkJCQkJXAorCQkJJmxkYl9kaTFfY2xrLAkJCQkJXAorCQkJTlVMTAkJCQkJCVwKKwkJfSwJCQkJCQkJXAorCX0KKworREVGX0lQVV9ESV9NVVgoQ0hTQ0NEUiwgMSwgMCk7CitERUZfSVBVX0RJX01VWChDSFNDQ0RSLCAxLCAxKTsKK0RFRl9JUFVfRElfTVVYKENTQ0RSMiwgMiwgMCk7CitERUZfSVBVX0RJX01VWChDU0NEUjIsIDIsIDEpOworCisjZGVmaW5lIERFRl9JUFVfTVVYKGlkKQkJCQkJCQlcCisJc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBpcHUjI2lkIyNfbXV4ID0gewkJCVwKKwkJLmNsayA9ICZpcHUjI2lkIyNfY2xrLAkJCQkJXAorCQkucmVnID0gQ1NDRFIzLAkJCQkJCVwKKwkJLmJwID0gQlBfQ1NDRFIzX0lQVSMjaWQjI19IU1BfU0VMLAkJCVwKKwkJLmJtID0gQk1fQ1NDRFIzX0lQVSMjaWQjI19IU1BfU0VMLAkJCVwKKwkJLnBhcmVudHMgPSB7CQkJCQkJXAorCQkJJm1tZGNfY2gwX2F4aV9jbGssCQkJCVwKKwkJCSZwbGwyX3BmZF80MDBtLAkJCQkJXAorCQkJJnBsbDNfMTIwbSwJCQkJCVwKKwkJCSZwbGwzX3BmZF81NDBtLAkJCQkJXAorCQkJTlVMTAkJCQkJCVwKKwkJfSwJCQkJCQkJXAorCX0KKworREVGX0lQVV9NVVgoMSk7CitERUZfSVBVX01VWCgyKTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciAqbXVsdGlwbGV4ZXJzW10gPSB7CisJJmF4aV9tdXgsCisJJnBlcmlwaF9tdXgsCisJJnBlcmlwaF9wcmVfbXV4LAorCSZwZXJpcGhfY2xrMl9tdXgsCisJJnBlcmlwaDJfbXV4LAorCSZwZXJpcGgyX3ByZV9tdXgsCisJJnBlcmlwaDJfY2xrMl9tdXgsCisJJmdwdTJkX2F4aV9tdXgsCisJJmdwdTNkX2F4aV9tdXgsCisJJmdwdTNkX2NvcmVfbXV4LAorCSZncHUzZF9zaGFkZXJfbXV4LAorCSZwY2llX2F4aV9tdXgsCisJJnZkb19heGlfbXV4LAorCSZ2cHVfYXhpX211eCwKKwkmZ3B1MmRfY29yZV9tdXgsCisJJnNzaTFfbXV4LAorCSZzc2kyX211eCwKKwkmc3NpM19tdXgsCisJJnVzZGhjMV9tdXgsCisJJnVzZGhjMl9tdXgsCisJJnVzZGhjM19tdXgsCisJJnVzZGhjNF9tdXgsCisJJmVtaV9tdXgsCisJJmVtaV9zbG93X211eCwKKwkmZXNhaV9tdXgsCisJJmxkYl9kaTBfbXV4LAorCSZsZGJfZGkxX211eCwKKwkmZW5mY19tdXgsCisJJnNwZGlmX211eCwKKwkmYXNyY19zZXJpYWxfbXV4LAorCSZoc2lfdHhfbXV4LAorCSZpcHUxX2RpMF9wcmVfbXV4LAorCSZpcHUxX2RpMF9tdXgsCisJJmlwdTFfZGkxX3ByZV9tdXgsCisJJmlwdTFfZGkxX211eCwKKwkmaXB1Ml9kaTBfcHJlX211eCwKKwkmaXB1Ml9kaTBfbXV4LAorCSZpcHUyX2RpMV9wcmVfbXV4LAorCSZpcHUyX2RpMV9tdXgsCisJJmlwdTFfbXV4LAorCSZpcHUyX211eCwKK307CisKK3N0YXRpYyBpbnQgX2Nsa19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQoreworCXN0cnVjdCBtdWx0aXBsZXhlciAqbTsKKwlpbnQgaSwgbnVtOworCXUzMiB2YWw7CisKKwludW0gPSBBUlJBWV9TSVpFKG11bHRpcGxleGVycyk7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQlpZiAobXVsdGlwbGV4ZXJzW2ldLT5jbGsgPT0gY2xrKSB7CisJCQltID0gbXVsdGlwbGV4ZXJzW2ldOworCQkJYnJlYWs7CisJCX0KKwlpZiAoaSA9PSBudW0pCisJCXJldHVybiAtRUlOVkFMOworCisJaSA9IDA7CisJd2hpbGUgKG0tPnBhcmVudHNbaV0pIHsKKwkJaWYgKHBhcmVudCA9PSBtLT5wYXJlbnRzW2ldKQorCQkJYnJlYWs7CisJCWkrKzsKKwl9CisJaWYgKCFtLT5wYXJlbnRzW2ldKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQobS0+cmVnKTsKKwl2YWwgJj0gfm0tPmJtOworCXZhbCB8PSBpIDw8IG0tPmJwOworCXdyaXRlbF9yZWxheGVkKHZhbCwgbS0+cmVnKTsKKworCWlmIChjbGsgPT0gJnBlcmlwaF9jbGspCisJCXJldHVybiBjbGtfYnVzeV93YWl0KGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBERUZfTkdfQ0xLKG5hbWUsIHApCQkJCVwKKwlzdGF0aWMgc3RydWN0IGNsayBuYW1lID0gewkJCVwKKwkJLmdldF9yYXRlCT0gX2Nsa19nZXRfcmF0ZSwJXAorCQkuc2V0X3JhdGUJPSBfY2xrX3NldF9yYXRlLAlcCisJCS5yb3VuZF9yYXRlCT0gX2Nsa19yb3VuZF9yYXRlLAlcCisJCS5zZXRfcGFyZW50CT0gX2Nsa19zZXRfcGFyZW50LAlcCisJCS5wYXJlbnQJCT0gcCwJCQlcCisJfQorCitERUZfTkdfQ0xLKHBlcmlwaF9jbGsyX2NsaywJJm9zY19jbGspOworREVGX05HX0NMSyhwZXJpcGhfcHJlX2NsaywJJnBsbDJfYnVzKTsKK0RFRl9OR19DTEsocGVyaXBoX2NsaywJCSZwZXJpcGhfcHJlX2Nsayk7CitERUZfTkdfQ0xLKHBlcmlwaDJfY2xrMl9jbGssCSZvc2NfY2xrKTsKK0RFRl9OR19DTEsocGVyaXBoMl9wcmVfY2xrLAkmcGxsMl9idXMpOworREVGX05HX0NMSyhwZXJpcGgyX2NsaywJCSZwZXJpcGgyX3ByZV9jbGspOworREVGX05HX0NMSyhheGlfY2xrLAkJJnBlcmlwaF9jbGspOworREVGX05HX0NMSyhlbWlfY2xrLAkJJmF4aV9jbGspOworREVGX05HX0NMSyhhcm1fY2xrLAkJJnBsbDFfc3dfY2xrKTsKK0RFRl9OR19DTEsoYWhiX2NsaywJCSZwZXJpcGhfY2xrKTsKK0RFRl9OR19DTEsoaXBnX2NsaywJCSZhaGJfY2xrKTsKK0RFRl9OR19DTEsoaXBnX3BlcmNsaywJCSZpcGdfY2xrKTsKK0RFRl9OR19DTEsoaXB1MV9kaTBfcHJlX2NsaywJJnBsbDNfcGZkXzU0MG0pOworREVGX05HX0NMSyhpcHUxX2RpMV9wcmVfY2xrLAkmcGxsM19wZmRfNTQwbSk7CitERUZfTkdfQ0xLKGlwdTJfZGkwX3ByZV9jbGssCSZwbGwzX3BmZF81NDBtKTsKK0RFRl9OR19DTEsoaXB1Ml9kaTFfcHJlX2NsaywJJnBsbDNfcGZkXzU0MG0pOworREVGX05HX0NMSyhhc3JjX3NlcmlhbF9jbGssCSZwbGwzX3VzYl9vdGcpOworCisjZGVmaW5lIERFRl9DTEsobmFtZSwgZXIsIGVzLCBwLCBzKQkJCVwKKwlzdGF0aWMgc3RydWN0IGNsayBuYW1lID0gewkJCVwKKwkJLmVuYWJsZV9yZWcJPSBlciwJCQlcCisJCS5lbmFibGVfc2hpZnQJPSBlcywJCQlcCisJCS5lbmFibGUJCT0gX2Nsa19lbmFibGUsCQlcCisJCS5kaXNhYmxlCT0gX2Nsa19kaXNhYmxlLAkJXAorCQkuZ2V0X3JhdGUJPSBfY2xrX2dldF9yYXRlLAlcCisJCS5zZXRfcmF0ZQk9IF9jbGtfc2V0X3JhdGUsCVwKKwkJLnJvdW5kX3JhdGUJPSBfY2xrX3JvdW5kX3JhdGUsCVwKKwkJLnNldF9wYXJlbnQJPSBfY2xrX3NldF9wYXJlbnQsCVwKKwkJLnBhcmVudAkJPSBwLAkJCVwKKwkJLnNlY29uZGFyeQk9IHMsCQkJXAorCX0KKworREVGX0NMSyhhaXBzX3R6MV9jbGssCSAgQ0NHUjAsIENHMCwgICZhaGJfY2xrLAkgIE5VTEwpOworREVGX0NMSyhhaXBzX3R6Ml9jbGssCSAgQ0NHUjAsIENHMSwgICZhaGJfY2xrLAkgIE5VTEwpOworREVGX0NMSyhhcGJoX2RtYV9jbGssCSAgQ0NHUjAsIENHMiwgICZhaGJfY2xrLAkgIE5VTEwpOworREVGX0NMSyhhc3JjX2NsaywJICBDQ0dSMCwgQ0czLCAgJnBsbDRfYXVkaW8sCSAgTlVMTCk7CitERUZfQ0xLKGNhbjFfc2VyaWFsX2NsaywgIENDR1IwLCBDRzgsICAmcGxsM191c2Jfb3RnLAkgIE5VTEwpOworREVGX0NMSyhjYW4xX2NsaywJICBDQ0dSMCwgQ0c3LCAgJnBsbDNfdXNiX290ZywJICAmY2FuMV9zZXJpYWxfY2xrKTsKK0RFRl9DTEsoY2FuMl9zZXJpYWxfY2xrLCAgQ0NHUjAsIENHMTAsICZwbGwzX3VzYl9vdGcsCSAgTlVMTCk7CitERUZfQ0xLKGNhbjJfY2xrLAkgIENDR1IwLCBDRzksICAmcGxsM191c2Jfb3RnLAkgICZjYW4yX3NlcmlhbF9jbGspOworREVGX0NMSyhlY3NwaTFfY2xrLAkgIENDR1IxLCBDRzAsICAmcGxsM182MG0sCSAgTlVMTCk7CitERUZfQ0xLKGVjc3BpMl9jbGssCSAgQ0NHUjEsIENHMSwgICZwbGwzXzYwbSwJICBOVUxMKTsKK0RFRl9DTEsoZWNzcGkzX2NsaywJICBDQ0dSMSwgQ0cyLCAgJnBsbDNfNjBtLAkgIE5VTEwpOworREVGX0NMSyhlY3NwaTRfY2xrLAkgIENDR1IxLCBDRzMsICAmcGxsM182MG0sCSAgTlVMTCk7CitERUZfQ0xLKGVjc3BpNV9jbGssCSAgQ0NHUjEsIENHNCwgICZwbGwzXzYwbSwJICBOVUxMKTsKK0RFRl9DTEsoZW5ldF9jbGssCSAgQ0NHUjEsIENHNSwgICZpcGdfY2xrLAkgIE5VTEwpOworREVGX0NMSyhlc2FpX2NsaywJICBDQ0dSMSwgQ0c4LCAgJnBsbDNfdXNiX290ZywJICBOVUxMKTsKK0RFRl9DTEsoZ3B0X3NlcmlhbF9jbGssCSAgQ0NHUjEsIENHMTEsICZpcGdfcGVyY2xrLAkgIE5VTEwpOworREVGX0NMSyhncHRfY2xrLAkgIENDR1IxLCBDRzEwLCAmaXBnX3BlcmNsaywJICAmZ3B0X3NlcmlhbF9jbGspOworREVGX0NMSyhncHUyZF9jb3JlX2NsaywJICBDQ0dSMSwgQ0cxMiwgJnBsbDJfcGZkXzM1Mm0sCSAgJmdwdTJkX2F4aV9jbGspOworREVGX0NMSyhncHUzZF9jb3JlX2NsaywJICBDQ0dSMSwgQ0cxMywgJnBsbDJfcGZkXzU5NG0sCSAgJmdwdTNkX2F4aV9jbGspOworREVGX0NMSyhncHUzZF9zaGFkZXJfY2xrLCBDQ0dSMSwgQ0cxMywgJnBsbDNfcGZkXzcyMG0sCSAgJmdwdTNkX2F4aV9jbGspOworREVGX0NMSyhoZG1pX2lhaGJfY2xrLAkgIENDR1IyLCBDRzAsICAmYWhiX2NsaywJICBOVUxMKTsKK0RFRl9DTEsoaGRtaV9pc2ZyX2NsaywJICBDQ0dSMiwgQ0cyLCAgJnBsbDNfcGZkXzU0MG0sCSAgJmhkbWlfaWFoYl9jbGspOworREVGX0NMSyhpMmMxX2NsaywJICBDQ0dSMiwgQ0czLCAgJmlwZ19wZXJjbGssCSAgTlVMTCk7CitERUZfQ0xLKGkyYzJfY2xrLAkgIENDR1IyLCBDRzQsICAmaXBnX3BlcmNsaywJICBOVUxMKTsKK0RFRl9DTEsoaTJjM19jbGssCSAgQ0NHUjIsIENHNSwgICZpcGdfcGVyY2xrLAkgIE5VTEwpOworREVGX0NMSyhpaW1fY2xrLAkgIENDR1IyLCBDRzYsICAmaXBnX2NsaywJICBOVUxMKTsKK0RFRl9DTEsoZW5mY19jbGssCSAgQ0NHUjIsIENHNywgICZwbGwyX3BmZF8zNTJtLAkgIE5VTEwpOworREVGX0NMSyhpcHUxX2NsaywJICBDQ0dSMywgQ0cwLCAgJm1tZGNfY2gwX2F4aV9jbGssIE5VTEwpOworREVGX0NMSyhpcHUxX2RpMF9jbGssCSAgQ0NHUjMsIENHMSwgICZpcHUxX2RpMF9wcmVfY2xrLCBOVUxMKTsKK0RFRl9DTEsoaXB1MV9kaTFfY2xrLAkgIENDR1IzLCBDRzIsICAmaXB1MV9kaTFfcHJlX2NsaywgTlVMTCk7CitERUZfQ0xLKGlwdTJfY2xrLAkgIENDR1IzLCBDRzMsICAmbW1kY19jaDBfYXhpX2NsaywgTlVMTCk7CitERUZfQ0xLKGlwdTJfZGkwX2NsaywJICBDQ0dSMywgQ0c0LCAgJmlwdTJfZGkwX3ByZV9jbGssIE5VTEwpOworREVGX0NMSyhpcHUyX2RpMV9jbGssCSAgQ0NHUjMsIENHNSwgICZpcHUyX2RpMV9wcmVfY2xrLCBOVUxMKTsKK0RFRl9DTEsobGRiX2RpMF9jbGssCSAgQ0NHUjMsIENHNiwgICZwbGwzX3BmZF81NDBtLAkgIE5VTEwpOworREVGX0NMSyhsZGJfZGkxX2NsaywJICBDQ0dSMywgQ0c3LCAgJnBsbDNfcGZkXzU0MG0sCSAgTlVMTCk7CitERUZfQ0xLKGhzaV90eF9jbGssCSAgQ0NHUjMsIENHOCwgICZwbGwyX3BmZF80MDBtLAkgIE5VTEwpOworREVGX0NMSyhtbGJfY2xrLAkgIENDR1IzLCBDRzksICAmcGxsNl9tbGIsCSAgTlVMTCk7CitERUZfQ0xLKG1tZGNfY2gwX2lwZ19jbGssIENDR1IzLCBDRzEyLCAmaXBnX2NsaywJICBOVUxMKTsKK0RFRl9DTEsobW1kY19jaDBfYXhpX2NsaywgQ0NHUjMsIENHMTAsICZwZXJpcGhfY2xrLAkgICZtbWRjX2NoMF9pcGdfY2xrKTsKK0RFRl9DTEsobW1kY19jaDFfaXBnX2NsaywgQ0NHUjMsIENHMTMsICZpcGdfY2xrLAkgIE5VTEwpOworREVGX0NMSyhtbWRjX2NoMV9heGlfY2xrLCBDQ0dSMywgQ0cxMSwgJnBlcmlwaDJfY2xrLAkgICZtbWRjX2NoMV9pcGdfY2xrKTsKK0RFRl9DTEsob3BlbnZnX2F4aV9jbGssICAgQ0NHUjMsIENHMTMsICZheGlfY2xrLAkgIE5VTEwpOworREVGX0NMSyhwd20xX2NsaywJICBDQ0dSNCwgQ0c4LCAgJmlwZ19wZXJjbGssCSAgTlVMTCk7CitERUZfQ0xLKHB3bTJfY2xrLAkgIENDR1I0LCBDRzksICAmaXBnX3BlcmNsaywJICBOVUxMKTsKK0RFRl9DTEsocHdtM19jbGssCSAgQ0NHUjQsIENHMTAsICZpcGdfcGVyY2xrLAkgIE5VTEwpOworREVGX0NMSyhwd200X2NsaywJICBDQ0dSNCwgQ0cxMSwgJmlwZ19wZXJjbGssCSAgTlVMTCk7CitERUZfQ0xLKGdwbWlfYmNoX2FwYl9jbGssIENDR1I0LCBDRzEyLCAmdXNkaGMzX2NsaywJICBOVUxMKTsKK0RFRl9DTEsoZ3BtaV9iY2hfY2xrLAkgIENDR1I0LCBDRzEzLCAmdXNkaGM0X2NsaywJICAmZ3BtaV9iY2hfYXBiX2Nsayk7CitERUZfQ0xLKGdwbWlfYXBiX2NsaywJICBDQ0dSNCwgQ0cxNSwgJnVzZGhjM19jbGssCSAgJmdwbWlfYmNoX2Nsayk7CitERUZfQ0xLKGdwbWlfaW9fY2xrLAkgIENDR1I0LCBDRzE0LCAmZW5mY19jbGssCSAgJmdwbWlfYXBiX2Nsayk7CitERUZfQ0xLKHNkbWFfY2xrLAkgIENDR1I1LCBDRzMsICAmYWhiX2NsaywJICBOVUxMKTsKK0RFRl9DTEsoc3BiYV9jbGssCSAgQ0NHUjUsIENHNiwgICZpcGdfY2xrLAkgIE5VTEwpOworREVGX0NMSyhzcGRpZl9jbGssCSAgQ0NHUjUsIENHNywgICZwbGwzX3VzYl9vdGcsCSAgJnNwYmFfY2xrKTsKK0RFRl9DTEsoc3NpMV9jbGssCSAgQ0NHUjUsIENHOSwgICZwbGwzX3BmZF81MDhtLAkgIE5VTEwpOworREVGX0NMSyhzc2kyX2NsaywJICBDQ0dSNSwgQ0cxMCwgJnBsbDNfcGZkXzUwOG0sCSAgTlVMTCk7CitERUZfQ0xLKHNzaTNfY2xrLAkgIENDR1I1LCBDRzExLCAmcGxsM19wZmRfNTA4bSwJICBOVUxMKTsKK0RFRl9DTEsodWFydF9zZXJpYWxfY2xrLCAgQ0NHUjUsIENHMTMsICZwbGwzX3VzYl9vdGcsCSAgTlVMTCk7CitERUZfQ0xLKHVhcnRfY2xrLAkgIENDR1I1LCBDRzEyLCAmcGxsM184MG0sCSAgJnVhcnRfc2VyaWFsX2Nsayk7CitERUZfQ0xLKHVzYm9oM19jbGssCSAgQ0NHUjYsIENHMCwgICZpcGdfY2xrLAkgIE5VTEwpOworREVGX0NMSyh1c2RoYzFfY2xrLAkgIENDR1I2LCBDRzEsICAmcGxsMl9wZmRfNDAwbSwJICBOVUxMKTsKK0RFRl9DTEsodXNkaGMyX2NsaywJICBDQ0dSNiwgQ0cyLCAgJnBsbDJfcGZkXzQwMG0sCSAgTlVMTCk7CitERUZfQ0xLKHVzZGhjM19jbGssCSAgQ0NHUjYsIENHMywgICZwbGwyX3BmZF80MDBtLAkgIE5VTEwpOworREVGX0NMSyh1c2RoYzRfY2xrLAkgIENDR1I2LCBDRzQsICAmcGxsMl9wZmRfNDAwbSwJICBOVUxMKTsKK0RFRl9DTEsoZW1pX3Nsb3dfY2xrLAkgIENDR1I2LCBDRzUsICAmYXhpX2NsaywJICBOVUxMKTsKK0RFRl9DTEsodmRvX2F4aV9jbGssCSAgQ0NHUjYsIENHNiwgICZheGlfY2xrLAkgIE5VTEwpOworREVGX0NMSyh2cHVfY2xrLAkgIENDR1I2LCBDRzcsICAmYXhpX2NsaywJICBOVUxMKTsKKworc3RhdGljIGludCBwY2llX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKFBMTDhfRU5FVCk7CisJdmFsIHw9IEJNX1BMTF9FTkVUX0VOX1BDSUU7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBQTEw4X0VORVQpOworCisJcmV0dXJuIF9jbGtfZW5hYmxlKGNsayk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaWVfY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiB2YWw7CisKKwlfY2xrX2Rpc2FibGUoY2xrKTsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoUExMOF9FTkVUKTsKKwl2YWwgJj0gQk1fUExMX0VORVRfRU5fUENJRTsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIFBMTDhfRU5FVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjaWVfY2xrID0geworCS5lbmFibGVfcmVnID0gQ0NHUjQsCisJLmVuYWJsZV9zaGlmdCA9IENHMCwKKwkuZW5hYmxlID0gcGNpZV9jbGtfZW5hYmxlLAorCS5kaXNhYmxlID0gcGNpZV9jbGtfZGlzYWJsZSwKKwkuc2V0X3BhcmVudCA9IF9jbGtfc2V0X3BhcmVudCwKKwkucGFyZW50ID0gJmF4aV9jbGssCisJLnNlY29uZGFyeSA9ICZwbGw4X2VuZXQsCit9OworCitzdGF0aWMgaW50IHNhdGFfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoUExMOF9FTkVUKTsKKwl2YWwgfD0gQk1fUExMX0VORVRfRU5fU0FUQTsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIFBMTDhfRU5FVCk7CisKKwlyZXR1cm4gX2Nsa19lbmFibGUoY2xrKTsKK30KKworc3RhdGljIHZvaWQgc2F0YV9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHZhbDsKKworCV9jbGtfZGlzYWJsZShjbGspOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChQTEw4X0VORVQpOworCXZhbCAmPSBCTV9QTExfRU5FVF9FTl9TQVRBOworCXdyaXRlbF9yZWxheGVkKHZhbCwgUExMOF9FTkVUKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgc2F0YV9jbGsgPSB7CisJLmVuYWJsZV9yZWcgPSBDQ0dSNSwKKwkuZW5hYmxlX3NoaWZ0ID0gQ0cyLAorCS5lbmFibGUgPSBzYXRhX2Nsa19lbmFibGUsCisJLmRpc2FibGUgPSBzYXRhX2Nsa19kaXNhYmxlLAorCS5wYXJlbnQgPSAmaXBnX2NsaywKKwkuc2Vjb25kYXJ5ID0gJnBsbDhfZW5ldCwKK307CisKKyNkZWZpbmUgX1JFR0lTVEVSX0NMT0NLKGQsIG4sIGMpIFwKKwl7IFwKKwkJLmRldl9pZCA9IGQsIFwKKwkJLmNvbl9pZCA9IG4sIFwKKwkJLmNsayA9ICZjLCBcCisJfQorCitzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0geworCV9SRUdJU1RFUl9DTE9DSygiMjAyMDAwMC51YXJ0IiwgTlVMTCwgdWFydF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjFlODAwMC51YXJ0IiwgTlVMTCwgdWFydF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjFlYzAwMC51YXJ0IiwgTlVMTCwgdWFydF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjFmMDAwMC51YXJ0IiwgTlVMTCwgdWFydF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjFmNDAwMC51YXJ0IiwgTlVMTCwgdWFydF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjE4ODAwMC5lbmV0IiwgTlVMTCwgZW5ldF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjE5MDAwMC51c2RoYyIsIE5VTEwsIHVzZGhjMV9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjE5NDAwMC51c2RoYyIsIE5VTEwsIHVzZGhjMl9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjE5ODAwMC51c2RoYyIsIE5VTEwsIHVzZGhjM19jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjE5YzAwMC51c2RoYyIsIE5VTEwsIHVzZGhjNF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjFhMDAwMC5pMmMiLCBOVUxMLCBpMmMxX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMWE0MDAwLmkyYyIsIE5VTEwsIGkyYzJfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soIjIxYTgwMDAuaTJjIiwgTlVMTCwgaTJjM19jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjAwODAwMC5lY3NwaSIsIE5VTEwsIGVjc3BpMV9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjAwYzAwMC5lY3NwaSIsIE5VTEwsIGVjc3BpMl9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjAxMDAwMC5lY3NwaSIsIE5VTEwsIGVjc3BpM19jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjAxNDAwMC5lY3NwaSIsIE5VTEwsIGVjc3BpNF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjAxODAwMC5lY3NwaSIsIE5VTEwsIGVjc3BpNV9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjBlYzAwMC5zZG1hIiwgTlVMTCwgc2RtYV9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjBiYzAwMC53ZG9nIiwgTlVMTCwgZHVtbXlfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soIjIwYzAwMDAud2RvZyIsIE5VTEwsIGR1bW15X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJja2loIiwgY2tpaF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY2tpbF9jbGsiLCBja2lsX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhaXBzX3R6MV9jbGsiLCBhaXBzX3R6MV9jbGspLAorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiYWlwc190ejJfY2xrIiwgYWlwc190ejJfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImFzcmNfY2xrIiwgYXNyY19jbGspLAorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY2FuMl9jbGsiLCBjYW4yX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJoZG1pX2lzZnJfY2xrIiwgaGRtaV9pc2ZyX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJpaW1fY2xrIiwgaWltX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJtbGJfY2xrIiwgbWxiX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJvcGVudmdfYXhpX2NsayIsIG9wZW52Z19heGlfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInB3bTFfY2xrIiwgcHdtMV9jbGspLAorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicHdtMl9jbGsiLCBwd20yX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJwd20zX2NsayIsIHB3bTNfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInB3bTRfY2xrIiwgcHdtNF9jbGspLAorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3BtaV9pb19jbGsiLCBncG1pX2lvX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJ1c2JvaDNfY2xrIiwgdXNib2gzX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzYXRhX2NsayIsIHNhdGFfY2xrKSwKK307CisKK2ludCBpbXg2cV9zZXRfbHBtKGVudW0gbXhjX2NwdV9wd3JfbW9kZSBtb2RlKQoreworCXUzMiB2YWwgPSByZWFkbF9yZWxheGVkKENMUENSKTsKKworCXZhbCAmPSB+Qk1fQ0xQQ1JfTFBNOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgV0FJVF9DTE9DS0VEOgorCQlicmVhazsKKwljYXNlIFdBSVRfVU5DTE9DS0VEOgorCQl2YWwgfD0gMHgxIDw8IEJQX0NMUENSX0xQTTsKKwkJYnJlYWs7CisJY2FzZSBTVE9QX1BPV0VSX09OOgorCQl2YWwgfD0gMHgyIDw8IEJQX0NMUENSX0xQTTsKKwkJYnJlYWs7CisJY2FzZSBXQUlUX1VOQ0xPQ0tFRF9QT1dFUl9PRkY6CisJCXZhbCB8PSAweDEgPDwgQlBfQ0xQQ1JfTFBNOworCQl2YWwgJj0gfkJNX0NMUENSX1ZTVEJZOworCQl2YWwgJj0gfkJNX0NMUENSX1NCWU9TOworCQl2YWwgfD0gQk1fQ0xQQ1JfQllQX01NRENfQ0gxX0xQTV9IUzsKKwkJYnJlYWs7CisJY2FzZSBTVE9QX1BPV0VSX09GRjoKKwkJdmFsIHw9IDB4MiA8PCBCUF9DTFBDUl9MUE07CisJCXZhbCB8PSAweDMgPDwgQlBfQ0xQQ1JfU1RCWV9DT1VOVDsKKwkJdmFsIHw9IEJNX0NMUENSX1ZTVEJZOworCQl2YWwgfD0gQk1fQ0xQQ1JfU0JZT1M7CisJCXZhbCB8PSBCTV9DTFBDUl9CWVBfTU1EQ19DSDFfTFBNX0hTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBDTFBDUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpbXg2cV9jbG9ja19kZXNjW10gPSB7CisJaW14X21hcF9lbnRyeShNWDZRLCBDQ00sIE1UX0RFVklDRSksCisJaW14X21hcF9lbnRyeShNWDZRLCBBTkFUT1AsIE1UX0RFVklDRSksCit9OworCitpbnQgX19pbml0IG14NnFfY2xvY2tzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgaSwgaXJxOworCisJaW90YWJsZV9pbml0KGlteDZxX2Nsb2NrX2Rlc2MsIEFSUkFZX1NJWkUoaW14NnFfY2xvY2tfZGVzYykpOworCisJLyogcmV0cmlldmUgdGhlIGZyZXFlbmN5IG9mIGZpeGVkIGNsb2NrcyBmcm9tIGRldmljZSB0cmVlICovCisJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiZml4ZWQtY2xvY2siKSB7CisJCXUzMiByYXRlOworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1mcmVxdWVuY3kiLCAmcmF0ZSkpCisJCQljb250aW51ZTsKKworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaW14LWNraWwiKSkKKwkJCWV4dGVybmFsX2xvd19yZWZlcmVuY2UgPSByYXRlOworCQllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxpbXgtY2tpaDEiKSkKKwkJCWV4dGVybmFsX2hpZ2hfcmVmZXJlbmNlID0gcmF0ZTsKKwkJZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaW14LW9zYyIpKQorCQkJb3NjaWxsYXRvcl9yZWZlcmVuY2UgPSByYXRlOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxvb2t1cHMpOyBpKyspCisJCWNsa2Rldl9hZGQoJmxvb2t1cHNbaV0pOworCisJLyogb25seSBrZWVwIG5lY2Vzc2FyeSBjbG9ja3Mgb24gKi8KKwl3cml0ZWxfcmVsYXhlZCgweDMgPDwgQ0cwICB8IDB4MyA8PCBDRzEgIHwgMHgzIDw8IENHMiwJQ0NHUjApOworCXdyaXRlbF9yZWxheGVkKDB4MyA8PCBDRzggIHwgMHgzIDw8IENHOSAgfCAweDMgPDwgQ0cxMCwJQ0NHUjIpOworCXdyaXRlbF9yZWxheGVkKDB4MyA8PCBDRzEwIHwgMHgzIDw8IENHMTIsCQlDQ0dSMyk7CisJd3JpdGVsX3JlbGF4ZWQoMHgzIDw8IENHNCAgfCAweDMgPDwgQ0c2ICB8IDB4MyA8PCBDRzcsCUNDR1I0KTsKKwl3cml0ZWxfcmVsYXhlZCgweDMgPDwgQ0cwLAkJCQlDQ0dSNSk7CisJd3JpdGVsX3JlbGF4ZWQoMCwJCQkJCUNDR1I2KTsKKwl3cml0ZWxfcmVsYXhlZCgwLAkJCQkJQ0NHUjcpOworCisJY2xrX2VuYWJsZSgmdWFydF9jbGspOworCWNsa19lbmFibGUoJm1tZGNfY2gwX2F4aV9jbGspOworCisJY2xrX3NldF9yYXRlKCZwbGw0X2F1ZGlvLCBGUkVRXzY1ME0pOworCWNsa19zZXRfcmF0ZSgmcGxsNV92aWRlbywgRlJFUV82NTBNKTsKKwljbGtfc2V0X3BhcmVudCgmaXB1MV9kaTBfY2xrLCAmaXB1MV9kaTBfcHJlX2Nsayk7CisJY2xrX3NldF9wYXJlbnQoJmlwdTFfZGkwX3ByZV9jbGssICZwbGw1X3ZpZGVvKTsKKwljbGtfc2V0X3BhcmVudCgmZ3B1M2Rfc2hhZGVyX2NsaywgJnBsbDJfcGZkXzU5NG0pOworCWNsa19zZXRfcmF0ZSgmZ3B1M2Rfc2hhZGVyX2NsaywgRlJFUV81OTRNKTsKKwljbGtfc2V0X3BhcmVudCgmZ3B1M2RfY29yZV9jbGssICZtbWRjX2NoMF9heGlfY2xrKTsKKwljbGtfc2V0X3JhdGUoJmdwdTNkX2NvcmVfY2xrLCBGUkVRXzUyOE0pOworCWNsa19zZXRfcGFyZW50KCZhc3JjX3NlcmlhbF9jbGssICZwbGwzX3VzYl9vdGcpOworCWNsa19zZXRfcmF0ZSgmYXNyY19zZXJpYWxfY2xrLCAxNTAwMDAwKTsKKwljbGtfc2V0X3JhdGUoJmVuZmNfY2xrLCAxMTAwMDAwMCk7CisKKwkvKgorCSAqIEJlZm9yZSBwaW5jdHJsIEFQSSBpcyBhdmFpbGFibGUsIHdlIGhhdmUgdG8gcmVseSBvbiB0aGUgcGFkCisJICogY29uZmlndXJhdGlvbiBzZXQgdXAgYnkgYm9vdGxvYWRlci4gIEZvciB1c2RoYyBleGFtcGxlIGhlcmUsCisJICogdS1ib290IHNldHMgdXAgdGhlIHBhZHMgZm9yIDQ5LjUgTUh6IGNhc2UsIGFuZCB3ZSBoYXZlIHRvIGxvd2VyCisJICogdGhlIHVzZGhjIGNsb2NrIGZyb20gMTk4IHRvIDQ5LjUgTUh6IHRvIG1hdGNoIHRoZSBwYWQgY29uZmlndXJhdGlvbi4KKwkgKgorCSAqIEZJWE1FOiBUaGlzIGlzIHNob3VsZCBiZSByZW1vdmVkIGFmdGVyIHBpbmN0cmwgQVBJIGlzIGF2YWlsYWJsZS4KKwkgKiBBdCB0aGF0IHRpbWUsIHVzZGhjIGRyaXZlciBjYW4gY2FsbCBwaW5jdHJsIEFQSSB0byBjaGFuZ2UgcGFkCisJICogY29uZmlndXJhdGlvbiBkeW5hbWljYWxseSBwZXIgZGlmZmVyZW50IHVzZGhjIGNsb2NrIHNldHRpbmdzLgorCSAqLworCWNsa19zZXRfcmF0ZSgmdXNkaGMxX2NsaywgNDk1MDAwMDApOworCWNsa19zZXRfcmF0ZSgmdXNkaGMyX2NsaywgNDk1MDAwMDApOworCWNsa19zZXRfcmF0ZSgmdXNkaGMzX2NsaywgNDk1MDAwMDApOworCWNsa19zZXRfcmF0ZSgmdXNkaGM0X2NsaywgNDk1MDAwMDApOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLGlteDZxLWdwdCIpOworCWJhc2UgPSBvZl9pb21hcChucCwgMCk7CisJV0FSTl9PTighYmFzZSk7CisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCW14Y190aW1lcl9pbml0KCZncHRfY2xrLCBiYXNlLCBpcnEpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jcHUtaW14MjUuYyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTRiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9jcHUtaW14MjUuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogTVgyNSBDUFUgdHlwZSBkZXRlY3Rpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRGFuaWVsIE1hY2sgPGRhbmllbEBjYWlhcS5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaWltLmg+CisKK3N0YXRpYyBpbnQgbXgyNV9jcHVfcmV2ID0gLTE7CisKK3N0YXRpYyBpbnQgbXgyNV9yZWFkX2NwdV9yZXYodm9pZCkKK3sKKwl1MzIgcmV2OworCisJcmV2ID0gX19yYXdfcmVhZGwoTVgyNV9JT19BRERSRVNTKE1YMjVfSUlNX0JBU0VfQUREUiArIE1YQ19JSU1TUkVWKSk7CisJc3dpdGNoIChyZXYpIHsKKwljYXNlIDB4MDA6CisJCXJldHVybiBJTVhfQ0hJUF9SRVZJU0lPTl8xXzA7CisJY2FzZSAweDAxOgorCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fMV8xOworCWRlZmF1bHQ6CisJCXJldHVybiBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOOworCX0KK30KKworaW50IG14MjVfcmV2aXNpb24odm9pZCkKK3sKKwlpZiAobXgyNV9jcHVfcmV2ID09IC0xKQorCQlteDI1X2NwdV9yZXYgPSBteDI1X3JlYWRfY3B1X3JldigpOworCisJcmV0dXJuIG14MjVfY3B1X3JldjsKK30KK0VYUE9SVF9TWU1CT0wobXgyNV9yZXZpc2lvbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jcHUtaW14MjcuYyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgyNy5jCmluZGV4IDNiMTE3YmUuLmZmMzhlMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgyNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgyNy5jCkBAIC0yNiwxMiArMjYsMTIgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotc3RhdGljIGludCBjcHVfc2lsaWNvbl9yZXYgPSAtMTsKLXN0YXRpYyBpbnQgY3B1X3BhcnRudW1iZXI7CitzdGF0aWMgaW50IG14MjdfY3B1X3JldiA9IC0xOworc3RhdGljIGludCBteDI3X2NwdV9wYXJ0bnVtYmVyOwogCiAjZGVmaW5lIFNZU19DSElQX0lEICAgICAgICAgICAgIDB4MDAgICAgLyogVGhlIG9mZnNldCBvZiBDSElQIElEIHJlZ2lzdGVyICovCiAKLXN0YXRpYyB2b2lkIHF1ZXJ5X3NpbGljb25fcGFyYW1ldGVyKHZvaWQpCitzdGF0aWMgaW50IG14MjdfcmVhZF9jcHVfcmV2KHZvaWQpCiB7CiAJdTMyIHZhbDsKIAkvKgpAQCAtNDIsMjAgKzQyLDE4IEBACiAJdmFsID0gX19yYXdfcmVhZGwoTVgyN19JT19BRERSRVNTKE1YMjdfU1lTQ1RSTF9CQVNFX0FERFIKIAkJCQkrIFNZU19DSElQX0lEKSk7CiAKKwlteDI3X2NwdV9wYXJ0bnVtYmVyID0gKGludCkoKHZhbCA+PiAxMikgJiAweEZGRkYpOworCiAJc3dpdGNoICh2YWwgPj4gMjgpIHsKIAljYXNlIDA6Ci0JCWNwdV9zaWxpY29uX3JldiA9IElNWF9DSElQX1JFVklTSU9OXzFfMDsKLQkJYnJlYWs7CisJCXJldHVybiBJTVhfQ0hJUF9SRVZJU0lPTl8xXzA7CiAJY2FzZSAxOgotCQljcHVfc2lsaWNvbl9yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzA7Ci0JCWJyZWFrOworCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fMl8wOwogCWNhc2UgMjoKLQkJY3B1X3NpbGljb25fcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMl8xOwotCQlicmVhazsKKwkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OXzJfMTsKIAlkZWZhdWx0OgotCQljcHVfc2lsaWNvbl9yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOOworCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fVU5LTk9XTjsKIAl9Ci0JY3B1X3BhcnRudW1iZXIgPSAoaW50KSgodmFsID4+IDEyKSAmIDB4RkZGRik7CiB9CiAKIC8qCkBAIC02NSwxMiArNjMsMTIgQEAKICAqLwogaW50IG14MjdfcmV2aXNpb24odm9pZCkKIHsKLQlpZiAoY3B1X3NpbGljb25fcmV2ID09IC0xKQotCQlxdWVyeV9zaWxpY29uX3BhcmFtZXRlcigpOworCWlmIChteDI3X2NwdV9yZXYgPT0gLTEpCisJCW14MjdfY3B1X3JldiA9IG14MjdfcmVhZF9jcHVfcmV2KCk7CiAKLQlpZiAoY3B1X3BhcnRudW1iZXIgIT0gMHg4ODIxKQorCWlmIChteDI3X2NwdV9wYXJ0bnVtYmVyICE9IDB4ODgyMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gY3B1X3NpbGljb25fcmV2OworCXJldHVybiBteDI3X2NwdV9yZXY7CiB9CiBFWFBPUlRfU1lNQk9MKG14MjdfcmV2aXNpb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY3B1LWlteDMxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9jcHUtaW14MzEuYwppbmRleCBhMzc4MDcwLi4zZjIzNDVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jcHUtaW14MzEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jcHUtaW14MzEuYwpAQCAtMTMsNDUgKzEzLDUwIEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9paW0uaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogCi11bnNpZ25lZCBpbnQgbXgzMV9jcHVfcmV2OwotRVhQT1JUX1NZTUJPTChteDMxX2NwdV9yZXYpOworc3RhdGljIGludCBteDMxX2NwdV9yZXYgPSAtMTsKIAogc3RhdGljIHN0cnVjdCB7CiAJdTggc3JldjsKIAljb25zdCBjaGFyICpuYW1lOwotCWNvbnN0IGNoYXIgKnY7CiAJdW5zaWduZWQgaW50IHJldjsKLX0gbXgzMV9jcHVfdHlwZVtdIF9faW5pdGRhdGEgPSB7Ci0JeyAuc3JldiA9IDB4MDAsIC5uYW1lID0gImkuTVgzMShMKSIsIC52ID0gIjEuMCIsICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8wCX0sCi0JeyAuc3JldiA9IDB4MTAsIC5uYW1lID0gImkuTVgzMSIsICAgIC52ID0gIjEuMSIsICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8xCX0sCi0JeyAuc3JldiA9IDB4MTEsIC5uYW1lID0gImkuTVgzMUwiLCAgIC52ID0gIjEuMSIsICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8xCX0sCi0JeyAuc3JldiA9IDB4MTIsIC5uYW1lID0gImkuTVgzMSIsICAgIC52ID0gIjEuMTUiLCAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8xCX0sCi0JeyAuc3JldiA9IDB4MTMsIC5uYW1lID0gImkuTVgzMUwiLCAgIC52ID0gIjEuMTUiLCAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8xCX0sCi0JeyAuc3JldiA9IDB4MTQsIC5uYW1lID0gImkuTVgzMSIsICAgIC52ID0gIjEuMiIsICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8yCX0sCi0JeyAuc3JldiA9IDB4MTUsIC5uYW1lID0gImkuTVgzMUwiLCAgIC52ID0gIjEuMiIsICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8yCX0sCi0JeyAuc3JldiA9IDB4MjgsIC5uYW1lID0gImkuTVgzMSIsICAgIC52ID0gIjIuMCIsICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMl8wCX0sCi0JeyAuc3JldiA9IDB4MjksIC5uYW1lID0gImkuTVgzMUwiLCAgIC52ID0gIjIuMCIsICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMl8wCX0sCit9IG14MzFfY3B1X3R5cGVbXSA9IHsKKwl7IC5zcmV2ID0gMHgwMCwgLm5hbWUgPSAiaS5NWDMxKEwpIiwgLnJldiA9IElNWF9DSElQX1JFVklTSU9OXzFfMCB9LAorCXsgLnNyZXYgPSAweDEwLCAubmFtZSA9ICJpLk1YMzEiLCAgICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8xIH0sCisJeyAuc3JldiA9IDB4MTEsIC5uYW1lID0gImkuTVgzMUwiLCAgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzEgfSwKKwl7IC5zcmV2ID0gMHgxMiwgLm5hbWUgPSAiaS5NWDMxIiwgICAgLnJldiA9IElNWF9DSElQX1JFVklTSU9OXzFfMSB9LAorCXsgLnNyZXYgPSAweDEzLCAubmFtZSA9ICJpLk1YMzFMIiwgICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8xIH0sCisJeyAuc3JldiA9IDB4MTQsIC5uYW1lID0gImkuTVgzMSIsICAgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzIgfSwKKwl7IC5zcmV2ID0gMHgxNSwgLm5hbWUgPSAiaS5NWDMxTCIsICAgLnJldiA9IElNWF9DSElQX1JFVklTSU9OXzFfMiB9LAorCXsgLnNyZXYgPSAweDI4LCAubmFtZSA9ICJpLk1YMzEiLCAgICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMl8wIH0sCisJeyAuc3JldiA9IDB4MjksIC5uYW1lID0gImkuTVgzMUwiLCAgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzAgfSwKIH07CiAKLXZvaWQgX19pbml0IG14MzFfcmVhZF9jcHVfcmV2KHZvaWQpCitzdGF0aWMgaW50IG14MzFfcmVhZF9jcHVfcmV2KHZvaWQpCiB7CiAJdTMyIGksIHNyZXY7CiAKIAkvKiByZWFkIFNSRVYgcmVnaXN0ZXIgZnJvbSBJSU0gbW9kdWxlICovCiAJc3JldiA9IF9fcmF3X3JlYWRsKE1YMzFfSU9fQUREUkVTUyhNWDMxX0lJTV9CQVNFX0FERFIgKyBNWENfSUlNU1JFVikpOworCXNyZXYgJj0gMHhmZjsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG14MzFfY3B1X3R5cGUpOyBpKyspCiAJCWlmIChzcmV2ID09IG14MzFfY3B1X3R5cGVbaV0uc3JldikgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCSJDUFUgaWRlbnRpZmllZCBhcyAlcywgc2lsaWNvbiByZXYgJXNcbiIsCi0JCQkJbXgzMV9jcHVfdHlwZVtpXS5uYW1lLCBteDMxX2NwdV90eXBlW2ldLnYpOwotCi0JCQlteDMxX2NwdV9yZXYgPSBteDMxX2NwdV90eXBlW2ldLnJldjsKLQkJCXJldHVybjsKKwkJCWlteF9wcmludF9zaWxpY29uX3JldihteDMxX2NwdV90eXBlW2ldLm5hbWUsCisJCQkJCQlteDMxX2NwdV90eXBlW2ldLnJldik7CisJCQlyZXR1cm4gbXgzMV9jcHVfdHlwZVtpXS5yZXY7CiAJCX0KIAotCW14MzFfY3B1X3JldiA9IElNWF9DSElQX1JFVklTSU9OX1VOS05PV047Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmtub3duIENQVSBpZGVudGlmaWVyLiBzcmV2ID0gJTAyeFxuIiwgc3Jldik7CisJaW14X3ByaW50X3NpbGljb25fcmV2KCJpLk1YMzEiLCBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOKTsKKwlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fVU5LTk9XTjsKIH0KKworaW50IG14MzFfcmV2aXNpb24odm9pZCkKK3sKKwlpZiAobXgzMV9jcHVfcmV2ID09IC0xKQorCQlteDMxX2NwdV9yZXYgPSBteDMxX3JlYWRfY3B1X3JldigpOworCisJcmV0dXJuIG14MzFfY3B1X3JldjsKK30KK0VYUE9SVF9TWU1CT0wobXgzMV9yZXZpc2lvbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jcHUtaW14MzUuYyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgzNS5jCmluZGV4IDY2MzdjZDguLjg0NmU0NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgzNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgzNS5jCkBAIC0xMywzMiArMTMsMzAgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9paW0uaD4KIAotdW5zaWduZWQgaW50IG14MzVfY3B1X3JldjsKLUVYUE9SVF9TWU1CT0wobXgzNV9jcHVfcmV2KTsKK3N0YXRpYyBpbnQgbXgzNV9jcHVfcmV2ID0gLTE7CiAKLXZvaWQgX19pbml0IG14MzVfcmVhZF9jcHVfcmV2KHZvaWQpCitzdGF0aWMgaW50IG14MzVfcmVhZF9jcHVfcmV2KHZvaWQpCiB7CiAJdTMyIHJldjsKLQljaGFyICpzcmV2OwogCiAJcmV2ID0gX19yYXdfcmVhZGwoTVgzNV9JT19BRERSRVNTKE1YMzVfSUlNX0JBU0VfQUREUiArIE1YQ19JSU1TUkVWKSk7CiAJc3dpdGNoIChyZXYpIHsKIAljYXNlIDB4MDA6Ci0JCW14MzVfY3B1X3JldiA9IElNWF9DSElQX1JFVklTSU9OXzFfMDsKLQkJc3JldiA9ICIxLjAiOwotCQlicmVhazsKKwkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OXzFfMDsKIAljYXNlIDB4MTA6Ci0JCW14MzVfY3B1X3JldiA9IElNWF9DSElQX1JFVklTSU9OXzJfMDsKLQkJc3JldiA9ICIyLjAiOwotCQlicmVhazsKKwkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OXzJfMDsKIAljYXNlIDB4MTE6Ci0JCW14MzVfY3B1X3JldiA9IElNWF9DSElQX1JFVklTSU9OXzJfMTsKLQkJc3JldiA9ICIyLjEiOwotCQlicmVhazsKKwkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OXzJfMTsKIAlkZWZhdWx0OgotCQlteDM1X2NwdV9yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOOwotCQlzcmV2ID0gInVua25vd24iOworCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fVU5LTk9XTjsKIAl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJDUFUgaWRlbnRpZmllZCBhcyBpLk1YMzUsIHNpbGljb24gcmV2ICVzXG4iLCBzcmV2KTsKIH0KKworaW50IG14MzVfcmV2aXNpb24odm9pZCkKK3sKKwlpZiAobXgzNV9jcHVfcmV2ID09IC0xKQorCQlteDM1X2NwdV9yZXYgPSBteDM1X3JlYWRfY3B1X3JldigpOworCisJcmV0dXJuIG14MzVfY3B1X3JldjsKK30KK0VYUE9SVF9TWU1CT0wobXgzNV9yZXZpc2lvbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDI3LmggYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDI3LmgKaW5kZXggN2Y5N2EzYy4uMmY3MjdkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgyNy5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MjcuaApAQCAtNzYsMyArNzYsNyBAQAogI2RlZmluZSBpbXgyN19hZGRfc3BpX2lteDAocGRhdGEpCWlteDI3X2FkZF9jc3BpKDAsIHBkYXRhKQogI2RlZmluZSBpbXgyN19hZGRfc3BpX2lteDEocGRhdGEpCWlteDI3X2FkZF9jc3BpKDEsIHBkYXRhKQogI2RlZmluZSBpbXgyN19hZGRfc3BpX2lteDIocGRhdGEpCWlteDI3X2FkZF9jc3BpKDIsIHBkYXRhKQorCitleHRlcm4gY29uc3Qgc3RydWN0IGlteF9wYXRhX2lteF9kYXRhIGlteDI3X3BhdGFfaW14X2RhdGE7CisjZGVmaW5lIGlteDI3X2FkZF9wYXRhX2lteCgpIFwKKwlpbXhfYWRkX3BhdGFfaW14KCZpbXgyN19wYXRhX2lteF9kYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgzMS5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgzMS5oCmluZGV4IGRiZTk0MGQuLjQ4OGUyNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MzEuaAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDMxLmgKQEAgLTc4LDMgKzc4LDcgQEAKICNkZWZpbmUgaW14MzFfYWRkX3NwaV9pbXgwKHBkYXRhKQlpbXgzMV9hZGRfY3NwaSgwLCBwZGF0YSkKICNkZWZpbmUgaW14MzFfYWRkX3NwaV9pbXgxKHBkYXRhKQlpbXgzMV9hZGRfY3NwaSgxLCBwZGF0YSkKICNkZWZpbmUgaW14MzFfYWRkX3NwaV9pbXgyKHBkYXRhKQlpbXgzMV9hZGRfY3NwaSgyLCBwZGF0YSkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSBpbXgzMV9wYXRhX2lteF9kYXRhOworI2RlZmluZSBpbXgzMV9hZGRfcGF0YV9pbXgoKSBcCisJaW14X2FkZF9wYXRhX2lteCgmaW14MzFfcGF0YV9pbXhfZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MzUuaCBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MzUuaAppbmRleCAyMzRjYmQzLi43Yjk5ZWYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDM1LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgzNS5oCkBAIC04MSwzICs4MSw3IEBACiAJaW14X2FkZF9zcGlfaW14KCZpbXgzNV9jc3BpX2RhdGFbaWRdLCBwZGF0YSkKICNkZWZpbmUgaW14MzVfYWRkX3NwaV9pbXgwKHBkYXRhKQlpbXgzNV9hZGRfY3NwaSgwLCBwZGF0YSkKICNkZWZpbmUgaW14MzVfYWRkX3NwaV9pbXgxKHBkYXRhKQlpbXgzNV9hZGRfY3NwaSgxLCBwZGF0YSkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSBpbXgzNV9wYXRhX2lteF9kYXRhOworI2RlZmluZSBpbXgzNV9hZGRfcGF0YV9pbXgoKSBcCisJaW14X2FkZF9wYXRhX2lteCgmaW14MzVfcGF0YV9pbXhfZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2dwYy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZ3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1MzdmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2dwYy5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisKKyNkZWZpbmUgR1BDX0lNUjEJCTB4MDA4CisjZGVmaW5lIEdQQ19QR0NfQ1BVX1BETgkJMHgyYTAKKworI2RlZmluZSBJTVJfTlVNCQkJNAorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpncGNfYmFzZTsKK3N0YXRpYyB1MzIgZ3BjX3dha2VfaXJxc1tJTVJfTlVNXTsKK3N0YXRpYyB1MzIgZ3BjX3NhdmVkX2ltcnNbSU1SX05VTV07CisKK3ZvaWQgaW14X2dwY19wcmVfc3VzcGVuZCh2b2lkKQoreworCXZvaWQgX19pb21lbSAqcmVnX2ltcjEgPSBncGNfYmFzZSArIEdQQ19JTVIxOworCWludCBpOworCisJLyogVGVsbCBHUEMgdG8gcG93ZXIgb2ZmIEFSTSBjb3JlIHdoZW4gc3VzcGVuZCAqLworCXdyaXRlbF9yZWxheGVkKDB4MSwgZ3BjX2Jhc2UgKyBHUENfUEdDX0NQVV9QRE4pOworCisJZm9yIChpID0gMDsgaSA8IElNUl9OVU07IGkrKykgeworCQlncGNfc2F2ZWRfaW1yc1tpXSA9IHJlYWRsX3JlbGF4ZWQocmVnX2ltcjEgKyBpICogNCk7CisJCXdyaXRlbF9yZWxheGVkKH5ncGNfd2FrZV9pcnFzW2ldLCByZWdfaW1yMSArIGkgKiA0KTsKKwl9Cit9CisKK3ZvaWQgaW14X2dwY19wb3N0X3Jlc3VtZSh2b2lkKQoreworCXZvaWQgX19pb21lbSAqcmVnX2ltcjEgPSBncGNfYmFzZSArIEdQQ19JTVIxOworCWludCBpOworCisJLyogS2VlcCBBUk0gY29yZSBwb3dlcmVkIG9uIGZvciBvdGhlciBsb3ctcG93ZXIgbW9kZXMgKi8KKwl3cml0ZWxfcmVsYXhlZCgweDAsIGdwY19iYXNlICsgR1BDX1BHQ19DUFVfUEROKTsKKworCWZvciAoaSA9IDA7IGkgPCBJTVJfTlVNOyBpKyspCisJCXdyaXRlbF9yZWxheGVkKGdwY19zYXZlZF9pbXJzW2ldLCByZWdfaW1yMSArIGkgKiA0KTsKK30KKworc3RhdGljIGludCBpbXhfZ3BjX2lycV9zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBvbikKK3sKKwl1bnNpZ25lZCBpbnQgaWR4ID0gZC0+aXJxIC8gMzIgLSAxOworCXUzMiBtYXNrOworCisJLyogU2FuaXR5IGNoZWNrIGZvciBTUEkgaXJxICovCisJaWYgKGQtPmlycSA8IDMyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hc2sgPSAxIDw8IGQtPmlycSAlIDMyOworCWdwY193YWtlX2lycXNbaWR4XSA9IG9uID8gZ3BjX3dha2VfaXJxc1tpZHhdIHwgbWFzayA6CisJCQkJICBncGNfd2FrZV9pcnFzW2lkeF0gJiB+bWFzazsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbXhfZ3BjX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXZvaWQgX19pb21lbSAqcmVnOworCXUzMiB2YWw7CisKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIFNQSSBpcnEgKi8KKwlpZiAoZC0+aXJxIDwgMzIpCisJCXJldHVybjsKKworCXJlZyA9IGdwY19iYXNlICsgR1BDX0lNUjEgKyAoZC0+aXJxIC8gMzIgLSAxKSAqIDQ7CisJdmFsID0gcmVhZGxfcmVsYXhlZChyZWcpOworCXZhbCAmPSB+KDEgPDwgZC0+aXJxICUgMzIpOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgaW14X2dwY19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyIHZhbDsKKworCS8qIFNhbml0eSBjaGVjayBmb3IgU1BJIGlycSAqLworCWlmIChkLT5pcnEgPCAzMikKKwkJcmV0dXJuOworCisJcmVnID0gZ3BjX2Jhc2UgKyBHUENfSU1SMSArIChkLT5pcnEgLyAzMiAtIDEpICogNDsKKwl2YWwgPSByZWFkbF9yZWxheGVkKHJlZyk7CisJdmFsIHw9IDEgPDwgKGQtPmlycSAlIDMyKTsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIHJlZyk7Cit9CisKK3ZvaWQgX19pbml0IGlteF9ncGNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsaW14NnEtZ3BjIik7CisJZ3BjX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJV0FSTl9PTighZ3BjX2Jhc2UpOworCisJLyogUmVnaXN0ZXIgR1BDIGFzIHRoZSBzZWNvbmRhcnkgaW50ZXJydXB0IGNvbnRyb2xsZXIgYmVoaW5kIEdJQyAqLworCWdpY19hcmNoX2V4dG4uaXJxX21hc2sgPSBpbXhfZ3BjX2lycV9tYXNrOworCWdpY19hcmNoX2V4dG4uaXJxX3VubWFzayA9IGlteF9ncGNfaXJxX3VubWFzazsKKwlnaWNfYXJjaF9leHRuLmlycV9zZXRfd2FrZSA9IGlteF9ncGNfaXJxX3NldF93YWtlOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaGVhZC12Ny5TIGIvYXJjaC9hcm0vbWFjaC1pbXgvaGVhZC12Ny5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjllZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9oZWFkLXY3LlMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKworCS5zZWN0aW9uICIudGV4dC5oZWFkIiwgImF4IgorCV9fQ1BVSU5JVAorCisvKgorICogVGhlIHNlY29uZGFyeSBrZXJuZWwgaW5pdCBjYWxscyB2N19mbHVzaF9kY2FjaGVfYWxsIGJlZm9yZSBpdCBlbmFibGVzCisgKiB0aGUgTDE7IGhvd2V2ZXIsIHRoZSBMMSBjb21lcyBvdXQgb2YgcmVzZXQgaW4gYW4gdW5kZWZpbmVkIHN0YXRlLCBzbworICogdGhlIGNsZWFuICsgaW52YWxpZGF0ZSBwZXJmb3JtZWQgYnkgdjdfZmx1c2hfZGNhY2hlX2FsbCBjYXVzZXMgYSBidW5jaAorICogb2YgY2FjaGUgbGluZXMgd2l0aCB1bmluaXRpYWxpemVkIGRhdGEgYW5kIHVuaW5pdGlhbGl6ZWQgdGFncyB0byBnZXQKKyAqIHdyaXR0ZW4gb3V0IHRvIG1lbW9yeSwgd2hpY2ggZG9lcyByZWFsbHkgdW5wbGVhc2FudCB0aGluZ3MgdG8gdGhlIG1haW4KKyAqIHByb2Nlc3Nvci4gIFdlIGZpeCB0aGlzIGJ5IHBlcmZvcm1pbmcgYW4gaW52YWxpZGF0ZSwgcmF0aGVyIHRoYW4gYQorICogY2xlYW4gKyBpbnZhbGlkYXRlLCBiZWZvcmUganVtcGluZyBpbnRvIHRoZSBrZXJuZWwuCisgKgorICogVGhpcyBmdW5jaXRvbiBpcyBjbG9uZWQgZnJvbSBhcmNoL2FybS9tYWNoLXRlZ3JhL2hlYWRzbXAuUywgYW5kIG5lZWRzCisgKiB0byBiZSBjYWxsZWQgZm9yIGJvdGggc2Vjb25kYXJ5IGNvcmVzIHN0YXJ0dXAgYW5kIHByaW1hcnkgY29yZSByZXN1bWUKKyAqIHByb2NlZHVyZXMuICBJZGVhbGx5LCBpdCBzaG91bGQgYmUgbW92ZWQgaW50byBhcmNoL2FybS9tbS9jYWNoZS12Ny5TLgorICovCitFTlRSWSh2N19pbnZhbGlkYXRlX2wxKQorCW1vdglyMCwgIzAKKwltY3IJcDE1LCAyLCByMCwgYzAsIGMwLCAwCisJbXJjCXAxNSwgMSwgcjAsIGMwLCBjMCwgMAorCisJbGRyCXIxLCA9MHg3ZmZmCisJYW5kCXIyLCByMSwgcjAsIGxzciAjMTMKKworCWxkcglyMSwgPTB4M2ZmCisKKwlhbmQJcjMsIHIxLCByMCwgbHNyICMzCUAgTnVtV2F5cyAtIDEKKwlhZGQJcjIsIHIyLCAjMQkJQCBOdW1TZXRzCisKKwlhbmQJcjAsIHIwLCAjMHg3CisJYWRkCXIwLCByMCwgIzQJQCBTZXRTaGlmdAorCisJY2x6CXIxLCByMwkJQCBXYXlTaGlmdAorCWFkZAlyNCwgcjMsICMxCUAgTnVtV2F5cworMToJc3ViCXIyLCByMiwgIzEJQCBOdW1TZXRzLS0KKwltb3YJcjMsIHI0CQlAIFRlbXAgPSBOdW1XYXlzCisyOglzdWJzCXIzLCByMywgIzEJQCBUZW1wLS0KKwltb3YJcjUsIHIzLCBsc2wgcjEKKwltb3YJcjYsIHIyLCBsc2wgcjAKKwlvcnIJcjUsIHI1LCByNglAIFJlZyA9IChUZW1wPDxXYXlTaGlmdCl8KE51bVNldHM8PFNldFNoaWZ0KQorCW1jcglwMTUsIDAsIHI1LCBjNywgYzYsIDIKKwliZ3QJMmIKKwljbXAJcjIsICMwCisJYmd0CTFiCisJZHNiCisJaXNiCisJbW92CXBjLCBscgorRU5EUFJPQyh2N19pbnZhbGlkYXRlX2wxKQorCisjaWZkZWYgQ09ORklHX1NNUAorRU5UUlkodjdfc2Vjb25kYXJ5X3N0YXJ0dXApCisJYmwJdjdfaW52YWxpZGF0ZV9sMQorCWIJc2Vjb25kYXJ5X3N0YXJ0dXAKK0VORFBST0Modjdfc2Vjb25kYXJ5X3N0YXJ0dXApCisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBsb2NhdGVkIGludG8gdGhlIC5kYXRhIHNlY3Rpb24uICBUaGlzIGlzIHRvCisgKiBhbGxvdyBwaHlzX2wyeDBfc2F2ZWRfcmVncyB0byBiZSBhY2Nlc3NlZCB3aXRoIGEgcmVsYXRpdmUgbG9hZAorICogYXMgd2UgYXJlIHJ1bm5pbmcgb24gcGh5c2ljYWwgYWRkcmVzcyBoZXJlLgorICovCisJLmRhdGEKKwkuYWxpZ24KKworCS5tYWNybwlwbDMxMF9yZXN1bWUKKwlsZHIJcjIsIHBoeXNfbDJ4MF9zYXZlZF9yZWdzCisJbGRyCXIwLCBbcjIsICNMMlgwX1JfUEhZX0JBU0VdCUAgZ2V0IHBoeXNpY2FsIGJhc2Ugb2YgbDJ4MAorCWxkcglyMSwgW3IyLCAjTDJYMF9SX0FVWF9DVFJMXQlAIGdldCBhdXhfY3RybCB2YWx1ZQorCXN0cglyMSwgW3IwLCAjTDJYMF9BVVhfQ1RSTF0JQCByZXN0b3JlIGF1eF9jdHJsCisJbW92CXIxLCAjMHgxCisJc3RyCXIxLCBbcjAsICNMMlgwX0NUUkxdCQlAIHJlLWVuYWJsZSBMMgorCS5lbmRtCisKK0VOVFJZKHY3X2NwdV9yZXN1bWUpCisJYmwJdjdfaW52YWxpZGF0ZV9sMQorCXBsMzEwX3Jlc3VtZQorCWIJY3B1X3Jlc3VtZQorRU5EUFJPQyh2N19jcHVfcmVzdW1lKQorCisJLmdsb2JsCXBoeXNfbDJ4MF9zYXZlZF9yZWdzCitwaHlzX2wyeDBfc2F2ZWRfcmVnczoKKyAgICAgICAgLmxvbmcgICAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9ob3RwbHVnLmMgYi9hcmNoL2FybS9tYWNoLWlteC9ob3RwbHVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0OTNhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2hvdHBsdWcuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisKK2ludCBwbGF0Zm9ybV9jcHVfa2lsbCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiAxOworfQorCisvKgorICogcGxhdGZvcm0tc3BlY2lmaWMgY29kZSB0byBzaHV0ZG93biBhIENQVQorICoKKyAqIENhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQKKyAqLwordm9pZCBwbGF0Zm9ybV9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJZmx1c2hfY2FjaGVfYWxsKCk7CisJaW14X2VuYWJsZV9jcHUoY3B1LCBmYWxzZSk7CisJY3B1X2RvX2lkbGUoKTsKKworCS8qIFdlIHNob3VsZCBuZXZlciByZXR1cm4gZnJvbSBpZGxlICovCisJcGFuaWMoImNwdSAlZCB1bmV4cGVjdGVkbHkgZXhpdCBmcm9tIHNodXRkb3duXG4iLCBjcHUpOworfQorCitpbnQgcGxhdGZvcm1fY3B1X2Rpc2FibGUodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIHdlIGRvbid0IGFsbG93IENQVSAwIHRvIGJlIHNodXRkb3duIChpdCBpcyBzdGlsbCB0b28gc3BlY2lhbAorCSAqIGUuZy4gY2xvY2sgdGljayBpbnRlcnJ1cHRzKQorCSAqLworCXJldHVybiBjcHUgPT0gMCA/IC1FUEVSTSA6IDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9pb211eC1pbXgzMS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW9tdXgtaW14MzEuYwppbmRleCBjZjhmODA5Li44MmJkNDQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9pb211eC1pbXgzMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2lvbXV4LWlteDMxLmMKQEAgLTE3LDEzICsxNywxMiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAogICogTUEgMDIxMTAtMTMwMSwgVVNBLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14My5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbGx1YXJ0LmMgYi9hcmNoL2FybS9tYWNoLWlteC9sbHVhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGFiNmYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbGx1YXJ0LmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpbXhfbGx1YXJ0X2Rlc2MgPSB7CisjaWZkZWYgQ09ORklHX0RFQlVHX0lNWDZRX1VBUlQKKwkudmlydHVhbAk9IE1YNlFfSU9fUDJWKE1YNlFfVUFSVDRfQkFTRV9BRERSKSwKKwkucGZuCQk9IF9fcGh5c190b19wZm4oTVg2UV9VQVJUNF9CQVNFX0FERFIpLAorCS5sZW5ndGgJCT0gTVg2UV9VQVJUNF9TSVpFLAorCS50eXBlCQk9IE1UX0RFVklDRSwKKyNlbmRpZgorfTsKKwordm9pZCBfX2luaXQgaW14X2xsdWFydF9tYXBfaW8odm9pZCkKK3sKKwlpZiAoaW14X2xsdWFydF9kZXNjLnZpcnR1YWwpCisJCWlvdGFibGVfaW5pdCgmaW14X2xsdWFydF9kZXNjLCAxKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2xvY2FsdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtaW14L2xvY2FsdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTE2MzUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbG9jYWx0aW1lci5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc21wX3R3ZC5oPgorCisvKgorICogU2V0dXAgdGhlIGxvY2FsIGNsb2NrIGV2ZW50cyBmb3IgYSBDUFUuCisgKi8KK2ludCBfX2NwdWluaXQgbG9jYWxfdGltZXJfc2V0dXAoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJhcm0sc21wLXR3ZCIpOworCWlmICghdHdkX2Jhc2UpIHsKKwkJdHdkX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJCVdBUk5fT04oIXR3ZF9iYXNlKTsKKwl9CisJZXZ0LT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJdHdkX3RpbWVyX3NldHVwKGV2dCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYXBmOTMyOC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcGY5MzI4LmMKaW5kZXggYTQwNGM4OS4uMWU0ODZlNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcGY5MzI4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcGY5MzI4LmMKQEAgLTEzNiw2ICsxMzYsNyBAQAogCS5tYXBfaW8gICAgICAgPSBteDFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ICAgPSBpbXgxX2luaXRfZWFybHksCiAJLmluaXRfaXJxICAgICA9IG14MV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSAgID0gaW14MV9oYW5kbGVfaXJxLAogCS50aW1lciAgICAgICAgPSAmYXBmOTMyOF90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gYXBmOTMyOF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYXJtYWRpbGxvNXgwLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWFybWFkaWxsbzV4MC5jCmluZGV4IGVkZTI3MTAuLmM5YTljZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYXJtYWRpbGxvNXgwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcm1hZGlsbG81eDAuYwpAQCAtMzE0LDI1ICszMTQsMTkgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhCisJCWFybWFkaWxsbzV4MF9ub3JfZmxhc2hfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLndpZHRoCQk9IDIsCiAJLnBhcnRzCQk9IGFybWFkaWxsbzV4MF9ub3JfZmxhc2hfcGFydGl0aW9ucywKIAkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGFybWFkaWxsbzV4MF9ub3JfZmxhc2hfcGFydGl0aW9ucyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGFybWFkaWxsbzV4MF9ub3JfZmxhc2hfcmVzb3VyY2UgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlIGFybWFkaWxsbzV4MF9ub3JfZmxhc2hfcmVzb3VyY2UgX19pbml0Y29uc3QgPSB7CiAJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogCS5zdGFydAkJPSBNWDMxX0NTMF9CQVNFX0FERFIsCiAJLmVuZAkJPSBNWDMxX0NTMF9CQVNFX0FERFIgKyBTWl82NE0gLSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXJtYWRpbGxvNXgwX25vcl9mbGFzaCA9IHsKLQkubmFtZQkJCT0gInBoeXNtYXAtZmxhc2giLAotCS5pZAkJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJCT0gMSwKLQkucmVzb3VyY2UJCT0gJmFybWFkaWxsbzV4MF9ub3JfZmxhc2hfcmVzb3VyY2UsCi19OwotCiAvKgogICogRkIgc3VwcG9ydAogICovCkBAIC01MTQsOCArNTA4LDEwIEBACiAJaW14MzFfYWRkX214M19zZGNfZmIoJm14M2ZiX3BkYXRhKTsKIAogCS8qIFJlZ2lzdGVyIE5PUiBGbGFzaCAqLwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmFybWFkaWxsbzV4MF9ub3JfZmxhc2gsCi0JCQkgICAgJmFybWFkaWxsbzV4MF9ub3JfZmxhc2hfcGRhdGEpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YShOVUxMLCAicGh5c21hcC1mbGFzaCIsIC0xLAorCQkJJmFybWFkaWxsbzV4MF9ub3JfZmxhc2hfcmVzb3VyY2UsIDEsCisJCQkmYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9wZGF0YSwKKwkJCXNpemVvZihhcm1hZGlsbG81eDBfbm9yX2ZsYXNoX3BkYXRhKSk7CiAKIAkvKiBSZWdpc3RlciBOQU5EIEZsYXNoICovCiAJaW14MzFfYWRkX214Y19uYW5kKCZhcm1hZGlsbG81eDBfbmFuZF9ib2FyZF9pbmZvKTsKQEAgLTU1OCwxMCArNTU0LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoQVJNQURJTExPNVgwLCAiQXJtYWRpbGxvLTUwMCIpCiAJLyogTWFpbnRhaW5lcjogQWxiZXJ0byBQYW5penpvICAqLwotCS5ib290X3BhcmFtcyA9IE1YM3hfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgzMV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgzMV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MzFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgzMV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZhcm1hZGlsbG81eDBfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IGFybWFkaWxsbzV4MF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYnVnLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWJ1Zy5jCmluZGV4IGY0OTQ3MDUuLjMxM2Y2MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYnVnLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1idWcuYwpAQCAtNjIsNiArNjIsNyBAQAogCS5tYXBfaW8gPSBteDMxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDMxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgzMV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDMxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJmJ1Z190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gYnVnX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgyNy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgyNy5jCmluZGV4IGY4NTFmZTkuLmVkYjM3MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtY3B1aW14MjcuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDI3LmMKQEAgLTMxMSwxMCArMzExLDExIEBACiB9OwogCiBNQUNISU5FX1NUQVJUKEVVS1JFQV9DUFVJTVgyNywgIkVVS1JFQSBDUFVJTVgyNyIpCi0JLmJvb3RfcGFyYW1zID0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDI3X21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDI3X2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgyN19pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDI3X2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJmV1a3JlYV9jcHVpbXgyN190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gZXVrcmVhX2NwdWlteDI3X2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgzNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgzNS5jCmluZGV4IDRiZDA4M2IuLjY2YWYyZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtY3B1aW14MzUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDM1LmMKQEAgLTY2LDcgKzY2LDcgQEAKIAkJSTJDX0JPQVJEX0lORk8oInRzYzIwMDciLCAweDQ4KSwKIAkJLnR5cGUJCT0gInRzYzIwMDciLAogCQkucGxhdGZvcm1fZGF0YQk9ICZ0c2MyMDA3X2luZm8sCi0JCS5pcnEJCT0gZ3Bpb190b19pcnEoVFNDMjAwN19JUlFHUElPKSwKKwkJLmlycQkJPSBJTVhfR1BJT19UT19JUlEoVFNDMjAwN19JUlFHUElPKSwKIAl9LAogfTsKIApAQCAtMTk0LDEwICsxOTQsMTEgQEAKIAogTUFDSElORV9TVEFSVChFVUtSRUFfQ1BVSU1YMzVTRCwgIkV1a3JlYSBDUFVJTVgzNSIpCiAJLyogTWFpbnRhaW5lcjogRXVrcmVhIEVsZWN0cm9tYXRpcXVlICovCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDM1X21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDM1X2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgzNV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDM1X2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJmV1a3JlYV9jcHVpbXgzNV90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gZXVrcmVhX2NwdWlteDM1X2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1ldWtyZWFfY3B1aW14MjUuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtZXVrcmVhX2NwdWlteDI1LmMKaW5kZXggMjQ0MmQ1ZC4uYWI4ZmJjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1ldWtyZWFfY3B1aW14MjUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWV1a3JlYV9jcHVpbXgyNS5jCkBAIC0xNjMsMTAgKzE2MywxMSBAQAogCiBNQUNISU5FX1NUQVJUKEVVS1JFQV9DUFVJTVgyNVNELCAiRXVrcmVhIENQVUlNWDI1IikKIAkvKiBNYWludGFpbmVyOiBFdWtyZWEgRWxlY3Ryb21hdGlxdWUgKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDI1X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjVfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjVfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDI1X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjVfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmZXVrcmVhX2NwdWlteDI1X3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBldWtyZWFfY3B1aW14MjVfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDI3X3Zpc3N0cmltX20xMC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN192aXNzdHJpbV9tMTAuYwppbmRleCA2Nzc4ZjgxLi4zOGViOWU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDI3X3Zpc3N0cmltX20xMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14Mjdfdmlzc3RyaW1fbTEwLmMKQEAgLTI3NSwxMCArMjc1LDExIEBACiB9OwogCiBNQUNISU5FX1NUQVJUKElNWDI3X1ZJU1NUUklNX00xMCwgIlZpc3RhIFNpbGljb24gVmlzc3RyaW1fTTEwIikKLQkuYm9vdF9wYXJhbXMgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjdfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjdfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDI3X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjdfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmdmlzc3RyaW1fbTEwX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSB2aXNzdHJpbV9tMTBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDI3aXBjYW0uYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MjdpcGNhbS5jCmluZGV4IDI3MmY3OTMuLjcwNTIxNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MjdpcGNhbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MjdpcGNhbS5jCkBAIC03MSwxMCArNzEsMTEgQEAKIAogTUFDSElORV9TVEFSVChJTVgyN0lQQ0FNLCAiRnJlZXNjYWxlIElNWDI3SVBDQU0iKQogCS8qIG1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zID0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDI3X21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDI3X2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgyN19pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDI3X2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MjdpcGNhbV90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXgyN2lwY2FtX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2xpdGUuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MjdsaXRlLmMKaW5kZXggZDgxYTc2OS4uOGQ2YTYzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2xpdGUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDI3bGl0ZS5jCkBAIC03NywxMCArNzcsMTEgQEAKIH07CiAKIE1BQ0hJTkVfU1RBUlQoSU1YMjdMSVRFLCAiTG9naWNQRCBpLk1YMjdMSVRFIikKLQkuYm9vdF9wYXJhbXMgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjdfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjdfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDI3X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjdfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgyN2xpdGVfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MjdsaXRlX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXg2cS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXg2cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjVmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDZxLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworc3RhdGljIHZvaWQgX19pbml0IGlteDZxX2luaXRfbWFjaGluZSh2b2lkKQoreworCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIG9mX2RlZmF1bHRfYnVzX21hdGNoX3RhYmxlLCBOVUxMLCBOVUxMKTsKKworCWlteDZxX3BtX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlteDZxX21hcF9pbyh2b2lkKQoreworCWlteF9sbHVhcnRfbWFwX2lvKCk7CisJaW14X3NjdV9tYXBfaW8oKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlteDZxX2dwaW9fYWRkX2lycV9kb21haW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmludGVycnVwdF9wYXJlbnQpCit7CisJc3RhdGljIGludCBncGlvX2lycV9iYXNlID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgQVJDSF9OUl9HUElPUyAtCisJCQkJICAgMzIgKiA3OyAvKiBpbXg2cSBnZXRzIDcgZ3BpbyBwb3J0cyAqLworCisJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5wLCBncGlvX2lycV9iYXNlKTsKKwlncGlvX2lycV9iYXNlICs9IDMyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXg2cV9pcnFfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTktZ2ljIiwgLmRhdGEgPSBnaWNfb2ZfaW5pdCwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1ncGlvIiwgLmRhdGEgPSBpbXg2cV9ncGlvX2FkZF9pcnFfZG9tYWluLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGlteDZxX2luaXRfaXJxKHZvaWQpCit7CisJbDJ4MF9vZl9pbml0KDAsIH4wVUwpOworCWlteF9zcmNfaW5pdCgpOworCWlteF9ncGNfaW5pdCgpOworCW9mX2lycV9pbml0KGlteDZxX2lycV9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbXg2cV90aW1lcl9pbml0KHZvaWQpCit7CisJbXg2cV9jbG9ja3NfaW5pdCgpOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBpbXg2cV90aW1lciA9IHsKKwkuaW5pdCA9IGlteDZxX3RpbWVyX2luaXQsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaW14NnFfZHRfY29tcGF0W10gX19pbml0ZGF0YSA9IHsKKwkiZnNsLGlteDZxLXNhYnJlYXV0byIsCisJTlVMTCwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoSU1YNlEsICJGcmVlc2NhbGUgaS5NWDYgUXVhZCAoRGV2aWNlIFRyZWUpIikKKwkubWFwX2lvCQk9IGlteDZxX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpbXg2cV9pbml0X2lycSwKKwkuaGFuZGxlX2lycQk9IGlteDZxX2hhbmRsZV9pcnEsCisJLnRpbWVyCQk9ICZpbXg2cV90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gaW14NnFfaW5pdF9tYWNoaW5lLAorCS5kdF9jb21wYXQJPSBpbXg2cV9kdF9jb21wYXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1rem1fYXJtMTFfMDEuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gta3ptX2FybTExXzAxLmMKaW5kZXggZTQ3MmExZC4uNWYzN2Y4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1rem1fYXJtMTFfMDEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWt6bV9hcm0xMV8wMS5jCkBAIC0zNiw2ICszNiw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pb211eC1teDMuaD4KIAogI2luY2x1ZGUgImRldmljZXMtaW14MzEuaCIKQEAgLTI3MSwxMCArMjcyLDExIEBACiB9OwogCiBNQUNISU5FX1NUQVJUKEtaTV9BUk0xMV8wMSwgIkt5b3RvIE1pY3JvY29tcHV0ZXIgQ28uLCBMdGQuIEtaTS1BUk0xMS0wMSIpCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBrem1fbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDMxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAma3ptX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBrem1fYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MWFkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDFhZHMuYwppbmRleCA1Y2Q4YmVlLi5mYzQ5Nzg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MWFkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgxYWRzLmMKQEAgLTY4LDIzICs2OCwxNiBAQAogICogUGh5c21hcCBmbGFzaAogICovCiAKLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIG14MWFkc19mbGFzaF9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgbXgxYWRzX2ZsYXNoX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLndpZHRoCQk9IDQsCQkvKiBiYW5rd2lkdGggaW4gYnl0ZXMgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZmxhc2hfcmVzb3VyY2UgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlIGZsYXNoX3Jlc291cmNlIF9faW5pdGNvbnN0ID0gewogCS5zdGFydAk9IE1YMV9DUzBfUEhZUywKIAkuZW5kCT0gTVgxX0NTMF9QSFlTICsgU1pfMzJNIC0gMSwKIAkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGZsYXNoX2RldmljZSA9IHsKLQkubmFtZQk9ICJwaHlzbWFwLWZsYXNoIiwKLQkuaWQJPSAwLAotCS5yZXNvdXJjZSA9ICZmbGFzaF9yZXNvdXJjZSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi19OwotCiAvKgogICogSTJDCiAgKi8KQEAgLTEyNSw3ICsxMTgsOSBAQAogCWlteDFfYWRkX2lteF91YXJ0MSgmdWFydDFfcGRhdGEpOwogCiAJLyogUGh5c21hcCBmbGFzaCAqLwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmZsYXNoX2RldmljZSwgJm14MWFkc19mbGFzaF9kYXRhKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfcmVzbmRhdGEoTlVMTCwgInBoeXNtYXAtZmxhc2giLCAwLAorCQkJJmZsYXNoX3Jlc291cmNlLCAxLAorCQkJJm14MWFkc19mbGFzaF9kYXRhLCBzaXplb2YobXgxYWRzX2ZsYXNoX2RhdGEpKTsKIAogCS8qIEkyQyAqLwogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIG14MWFkc19pMmNfZGV2aWNlcywKQEAgLTE0NSwxOSArMTQwLDIxIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVgxQURTLCAiRnJlZXNjYWxlIE1YMUFEUyIpCiAJLyogTWFpbnRhaW5lcjogU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCAqLwotCS5ib290X3BhcmFtcyA9IE1YMV9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgxYWRzX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDFhZHNfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoTVhMQURTLCAiRnJlZXNjYWxlIE1YTEFEUyIpCi0JLmJvb3RfcGFyYW1zID0gTVgxX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDFhZHNfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MWFkc19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyMWFkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDIxYWRzLmMKaW5kZXggZDM4OWVjZi4uMjVmODQwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDIxYWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDIxYWRzLmMKQEAgLTMwNSwxMCArMzA1LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVgyMUFEUywgIkZyZWVzY2FsZSBpLk1YMjFBRFMiKQogCS8qIG1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zID0gTVgyMV9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDIxYWRzX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDIxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgyMV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDIxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MjFhZHNfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MjFhZHNfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjVfM2RzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjVfM2RzLmMKaW5kZXggN2Y2NmE5MS4uODhkY2NmMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI1XzNkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyNV8zZHMuYwpAQCAtNDMsNiArNDMsOCBAQAogCiAjaW5jbHVkZSAiZGV2aWNlcy1pbXgyNS5oIgogCisjZGVmaW5lIE1YMjVQREtfQ0FOX1BXRE4JSU1YX0dQSU9fTlIoNCwgNikKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAogfTsKQEAgLTEwOCw2ICsxMTAsMTEgQEAKIAkvKiBJMkMxICovCiAJTVgyNV9QQURfSTJDMV9DTEtfX0kyQzFfQ0xLLAogCU1YMjVfUEFEX0kyQzFfREFUX19JMkMxX0RBVCwKKworCS8qIENBTjEgKi8KKwlNWDI1X1BBRF9HUElPX0FfX0NBTjFfVFgsCisJTVgyNV9QQURfR1BJT19CX19DQU4xX1JYLAorCU1YMjVfUEFEX0QxNF9fR1BJT180XzYsCS8qIENBTl9QV0ROICovCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9kYXRhIG14MjVfZmVjX3BkYXRhIF9faW5pdGNvbnN0ID0gewpAQCAtMjQwLDYgKzI0Nyw5IEBACiAKIAlpbXgyNV9hZGRfc2RoY2lfZXNkaGNfaW14KDAsICZteDI1cGRrX2VzZGhjX3BkYXRhKTsKIAlpbXgyNV9hZGRfaW14X2kyYzAoJm14MjVfM2RzX2kyYzBfZGF0YSk7CisKKwlncGlvX3JlcXVlc3Rfb25lKE1YMjVQREtfQ0FOX1BXRE4sIEdQSU9GX09VVF9JTklUX0xPVywgImNhbi1wd2RuIik7CisJaW14MjVfYWRkX2ZsZXhjYW4wKE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgyNXBka190aW1lcl9pbml0KHZvaWQpCkBAIC0yNTMsMTAgKzI2MywxMSBAQAogCiBNQUNISU5FX1NUQVJUKE1YMjVfM0RTLCAiRnJlZXNjYWxlIE1YMjVQREsgKDNEUykiKQogCS8qIE1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zID0gTVgyNV9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDI1X21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDI1X2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgyNV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDI1X2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MjVwZGtfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MjVwZGtfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdfM2RzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdfM2RzLmMKaW5kZXggNmZhNjkzNC4uYmEyMzJkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI3XzNkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN18zZHMuYwpAQCAtMjQxLDcgKzI0MSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdm1tYzFfY29uc3VtZXJzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgibGNkXzJ2OCIsIE5VTEwpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZjb3JlIiwgInNwaTAuMCIpLAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHZtbWMxX2luaXQgPSB7CkBAIC0yNTcsNyArMjU3LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB2Z2VuX2NvbnN1bWVyc1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9sY2RpbyIsIE5VTEwpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZkZCIsICJzcGkwLjAiKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSB2Z2VuX2luaXQgPSB7CkBAIC0yOTMsOCArMjkzLDcgQEAKIAkJLm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRShteDI3XzNkc19yZWd1bGF0b3JzKSwKIAogCX0sCi0JLmZsYWdzICA9IE1DMTM3ODNfVVNFX1JFR1VMQVRPUiB8IE1DMTM3ODNfVVNFX1RPVUNIU0NSRUVOIHwKLQlNQzEzNzgzX1VTRV9SVEMsCisJLmZsYWdzICA9IE1DMTNYWFhfVVNFX1RPVUNIU0NSRUVOIHwgTUMxM1hYWF9VU0VfUlRDLAogfTsKIAogLyogU1BJICovCkBAIC0zNDgsOCArMzQ3LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgbDRmMDAyNDJ0MDNfcGRhdGEgbXgyN18zZHNfbGNkX3BkYXRhID0gewogCS5yZXNldF9ncGlvCQk9IExDRF9SRVNFVCwKIAkuZGF0YV9lbmFibGVfZ3Bpbwk9IExDRF9FTkFCTEUsCi0JLmNvcmVfc3VwcGx5CQk9ICJsY2RfMnY4IiwKLQkuaW9fc3VwcGx5CQk9ICJ2ZGRfbGNkaW8iLAogfTsKIAogc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBteDI3XzNkc19zcGlfZGV2c1tdIF9faW5pdGRhdGEgPSB7CkBAIC0zNTksNyArMzU2LDcgQEAKIAkJLmJ1c19udW0JPSAxLAogCQkuY2hpcF9zZWxlY3QJPSAwLCAvKiBTUzAgKi8KIAkJLnBsYXRmb3JtX2RhdGEJPSAmbWMxMzc4M19wZGF0YSwKLQkJLmlycSA9IGdwaW9fdG9faXJxKFBNSUNfSU5UKSwKKwkJLmlycSA9IElNWF9HUElPX1RPX0lSUShQTUlDX0lOVCksCiAJCS5tb2RlID0gU1BJX0NTX0hJR0gsCiAJfSwgewogCQkubW9kYWxpYXMJPSAibDRmMDAyNDJ0MDMiLApAQCAtNDIxLDEwICs0MTgsMTEgQEAKIAogTUFDSElORV9TVEFSVChNWDI3XzNEUywgIkZyZWVzY2FsZSBNWDI3UERLIikKIAkvKiBtYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLwotCS5ib290X3BhcmFtcyA9IE1YMjdfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgyN19tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgyN19pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MjdfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgyN19oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDI3cGRrX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDI3cGRrX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI3YWRzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdhZHMuYwppbmRleCBmYzI2ZWQ3Li43NGRkNTczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdhZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdhZHMuYwpAQCAtMTMsNyArMTMsNyBAQAogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjcuaD4KIAogI2luY2x1ZGUgImRldmljZXMtaW14MjcuaCIKQEAgLTM0NSwxMCArMzQ0LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVgyN0FEUywgIkZyZWVzY2FsZSBpLk1YMjdBRFMiKQogCS8qIG1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zID0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDI3YWRzX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDI3X2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgyN19pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDI3X2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MjdhZHNfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MjdhZHNfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFfM2RzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFfM2RzLmMKaW5kZXggYzIwYmU3NS4uYjhjNTRiOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxXzNkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMV8zZHMuYwpAQCAtMjg1LDggKzI4NSw2IEBACiBzdGF0aWMgc3RydWN0IGw0ZjAwMjQydDAzX3BkYXRhIG14MzFfM2RzX2w0ZjAwMjQydDAzX3BkYXRhID0gewogCS5yZXNldF9ncGlvCQk9IElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fTENTMSksCiAJLmRhdGFfZW5hYmxlX2dwaW8JPSBJT01VWF9UT19HUElPKE1YMzFfUElOX1NFUl9SUyksCi0JLmNvcmVfc3VwcGx5CQk9ICJsY2RfMnY4IiwKLQkuaW9fc3VwcGx5CQk9ICJ2ZGRfbGNkaW8iLAogfTsKIAogLyoKQEAgLTQxMSw3ICs0MDksNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHZtbWMxX2NvbnN1bWVyc1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoImxjZF8ydjgiLCBOVUxMKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2Y29yZSIsICJzcGkwLjAiKSwKIAlSRUdVTEFUT1JfU1VQUExZKCJjbW9zXzJ2OCIsICJzb2MtY2FtZXJhLXBkcnYuMCIpLAogfTsKIApAQCAtNDI4LDcgKzQyNiw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdmdlbl9jb25zdW1lcnNbXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfbGNkaW8iLCBOVUxMKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQiLCAic3BpMC4wIiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdmdlbl9pbml0ID0gewpAQCAtNDk0LDcgKzQ5Miw3IEBACiAJCS5yZWd1bGF0b3JzID0gbXgzMV8zZHNfcmVndWxhdG9ycywKIAkJLm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRShteDMxXzNkc19yZWd1bGF0b3JzKSwKIAl9LAotCS5mbGFncyAgPSBNQzEzNzgzX1VTRV9SRUdVTEFUT1IgfCBNQzEzNzgzX1VTRV9UT1VDSFNDUkVFTiwKKwkuZmxhZ3MgID0gTUMxM1hYWF9VU0VfVE9VQ0hTQ1JFRU4sCiB9OwogCiAvKiBTUEkgKi8KQEAgLTU0Miw3ICs1NDAsNyBAQAogbXgzMV8zZHNfbmFuZF9ib2FyZF9pbmZvIF9faW5pdGNvbnN0ID0gewogCS53aWR0aAkJPSAxLAogCS5od19lY2MJCT0gMSwKLSNpZmRlZiBNQUNIX01YMzFfM0RTX01YQ19OQU5EX1VTRV9CQlQKKyNpZmRlZiBDT05GSUdfTUFDSF9NWDMxXzNEU19NWENfTkFORF9VU0VfQkJUCiAJLmZsYXNoX2JidAk9IDEsCiAjZW5kaWYKIH07CkBAIC03NjQsMTAgKzc2MiwxMSBAQAogCiBNQUNISU5FX1NUQVJUKE1YMzFfM0RTLCAiRnJlZXNjYWxlIE1YMzFQREsgKDNEUykiKQogCS8qIE1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDMxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDMxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgzMV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDMxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MzFfM2RzX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDMxXzNkc19pbml0LAogCS5yZXNlcnZlID0gbXgzMV8zZHNfcmVzZXJ2ZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMWFkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxYWRzLmMKaW5kZXggMjljYTg5MC4uOWNjMWE0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxYWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxYWRzLmMKQEAgLTUzNSwxMCArNTM1LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVgzMUFEUywgIkZyZWVzY2FsZSBNWDMxQURTIikKIAkvKiBNYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLwotCS5ib290X3BhcmFtcyA9IE1YM3hfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgzMWFkc19tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgzMV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MzFhZHNfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgzMV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDMxYWRzX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDMxYWRzX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGlsbHkuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMWxpbGx5LmMKaW5kZXggMTI2OTEzYS4uMTAyZWM5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGlsbHkuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFsaWxseS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3Ntc2M5MTF4Lmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CkBAIC0yOTUsMTAgKzI5NiwxMSBAQAogfTsKIAogTUFDSElORV9TVEFSVChMSUxMWTExMzEsICJJTkNPIHN0YXJ0ZWMgTElMTFktMTEzMSIpCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDMxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDMxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgzMV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDMxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MzFsaWxseV90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXgzMWxpbGx5X2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGl0ZS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGl0ZS5jCmluZGV4IDRiNDdmZDkuLjUzNjZkMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMWxpdGUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFsaXRlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9tYzEzNzgzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgpAQCAtMTEyLDggKzExMyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG1jMTN4eHhfcGxhdGZvcm1fZGF0YSBtYzEzNzgzX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmZsYWdzICA9IE1DMTNYWFhfVVNFX1JUQyB8Ci0JCSAgTUMxM1hYWF9VU0VfUkVHVUxBVE9SLAorCS5mbGFncyA9IE1DMTNYWFhfVVNFX1JUQywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gbWMxMzc4M19zcGlfZGV2IF9faW5pdGRhdGEgPSB7CkBAIC0yODAsMTAgKzI4MCwxMSBAQAogCiBNQUNISU5FX1NUQVJUKE1YMzFMSVRFLCAiTG9naWNQRCBpLk1YMzEgU09NIikKIAkvKiBNYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLwotCS5ib290X3BhcmFtcyA9IE1YM3hfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgzMWxpdGVfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDMxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgzMWxpdGVfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MzFsaXRlX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbW9ib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbW9ib2FyZC5jCmluZGV4IGIzNTgzODMuLjkzMjY5MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMW1vYm9hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFtb2JvYXJkLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CkBAIC0yOCw2ICsyOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogCiAjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi91bHBpLmg+CkBAIC0yMjIsNyArMjI3LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtYzEzNzgzX2xlZF9wbGF0Zm9ybV9kYXRhIG1vYm9hcmRfbGVkW10gPSB7CitzdGF0aWMgc3RydWN0IG1jMTN4eHhfbGVkX3BsYXRmb3JtX2RhdGEgbW9ib2FyZF9sZWRbXSA9IHsKIAl7CiAJCS5pZCA9IE1DMTM3ODNfTEVEX1IxLAogCQkubmFtZSA9ICJjb3JlYm9hcmQtbGVkLTQ6cmVkIiwKQEAgLTI1NSw3ICsyNjAsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG1jMTM3ODNfbGVkc19wbGF0Zm9ybV9kYXRhIG1vYm9hcmRfbGVkcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgbWMxM3h4eF9sZWRzX3BsYXRmb3JtX2RhdGEgbW9ib2FyZF9sZWRzID0gewogCS5udW1fbGVkcyA9IEFSUkFZX1NJWkUobW9ib2FyZF9sZWQpLAogCS5sZWQgPSBtb2JvYXJkX2xlZCwKIAkuZmxhZ3MgPSBNQzEzNzgzX0xFRF9TTEVXTElNVEMsCkBAIC0yNjQsMTQgKzI2OSwyMCBAQAogCS50YzJfcGVyaW9kID0gTUMxMzc4M19MRURfUEVSSU9EXzEwTVMsCiB9OwogCitzdGF0aWMgc3RydWN0IG1jMTN4eHhfYnV0dG9uc19wbGF0Zm9ybV9kYXRhIG1vYm9hcmRfYnV0dG9ucyA9IHsKKwkuYjFvbl9mbGFncyA9IE1DMTM3ODNfQlVUVE9OX0RCTkNfNzUwTVMgfCBNQzEzNzgzX0JVVFRPTl9FTkFCTEUgfAorCQkJTUMxMzc4M19CVVRUT05fUE9MX0lOVkVSVCwKKwkuYjFvbl9rZXkgPSBLRVlfUE9XRVIsCit9OworCiBzdGF0aWMgc3RydWN0IG1jMTN4eHhfcGxhdGZvcm1fZGF0YSBtb2JvYXJkX3BtaWMgPSB7CiAJLnJlZ3VsYXRvcnMgPSB7CiAJCS5yZWd1bGF0b3JzID0gbW9ib2FyZF9yZWd1bGF0b3JzLAogCQkubnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKG1vYm9hcmRfcmVndWxhdG9ycyksCiAJfSwKIAkubGVkcyA9ICZtb2JvYXJkX2xlZHMsCi0JLmZsYWdzID0gTUMxM1hYWF9VU0VfUkVHVUxBVE9SIHwgTUMxM1hYWF9VU0VfUlRDIHwKLQkJTUMxM1hYWF9VU0VfQURDIHwgTUMxM1hYWF9VU0VfTEVELAorCS5idXR0b25zID0gJm1vYm9hcmRfYnV0dG9ucywKKwkuZmxhZ3MgPSBNQzEzWFhYX1VTRV9SVEMgfCBNQzEzWFhYX1VTRV9BREMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIG1vYm9hcmRfc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0gewpAQCAtNDkwLDYgKzUwMSwxOCBAQAogCiB9CiAKK3N0YXRpYyB2b2lkIG14MzFtb2JvYXJkX3Bvd2Vyb2ZmKHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrID0gY2xrX2dldF9zeXMoImlteDItd2R0LjAiLCBOVUxMKTsKKworCWlmICghSVNfRVJSKGNsaykpCisJCWNsa19lbmFibGUoY2xrKTsKKworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX1dBVENIRE9HX1JTVF9fV0FUQ0hET0dfUlNUKTsKKworCV9fcmF3X3dyaXRldygxIDw8IDYgfCAxIDw8IDIsIE1YMzFfSU9fQUREUkVTUyhNWDMxX1dET0dfQkFTRV9BRERSKSk7Cit9CisKIHN0YXRpYyBpbnQgbXgzMW1vYm9hcmRfYmFzZWJvYXJkOwogY29yZV9wYXJhbShteDMxbW9ib2FyZF9iYXNlYm9hcmQsIG14MzFtb2JvYXJkX2Jhc2Vib2FyZCwgaW50LCAwNDQ0KTsKIApAQCAtNTI4LDYgKzU1MSw4IEBACiAKIAltb2JvYXJkX3VzYmgyX2luaXQoKTsKIAorCXBtX3Bvd2VyX29mZiA9IG14MzFtb2JvYXJkX3Bvd2Vyb2ZmOworCiAJc3dpdGNoIChteDMxbW9ib2FyZF9iYXNlYm9hcmQpIHsKIAljYXNlIE1YMzFOT0JPQVJEOgogCQlicmVhazsKQEAgLTU2NywxMSArNTkyLDEyIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVgzMU1PQk9BUkQsICJFUEZMIE1vYm90cyBteDMxbW9ib2FyZCIpCiAJLyogTWFpbnRhaW5lcjogVmFsZW50aW4gTG9uZ2NoYW1wLCBFUEZMIE1vYm90cyBncm91cCAqLwotCS5ib290X3BhcmFtcyA9IE1YM3hfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkucmVzZXJ2ZSA9IG14MzFtb2JvYXJkX3Jlc2VydmUsCiAJLm1hcF9pbyA9IG14MzFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDMxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgzMW1vYm9hcmRfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MzFtb2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDM1XzNkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDM1XzNkcy5jCmluZGV4IGIzYjliZDguLjdhNDYyMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzNV8zZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzVfM2RzLmMKQEAgLTIxNywxMCArMjE3LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVgzNV8zRFMsICJGcmVlc2NhbGUgTVgzNVBESyIpCiAJLyogTWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYyAqLwotCS5ib290X3BhcmFtcyA9IE1YM3hfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgzNV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgzNV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MzVfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgzNV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDM1cGRrX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDM1XzNkc19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXh0X3RkNjAuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXh0X3RkNjAuYwppbmRleCBjODU4NzZmLi4xMjVjMTk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14dF90ZDYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teHRfdGQ2MC5jCkBAIC0yNjcsMTAgKzI2NywxMSBAQAogCiBNQUNISU5FX1NUQVJUKE1YVF9URDYwLCAiTWF4dHJhY2sgaS1NWFQgVEQ2MCIpCiAJLyogbWFpbnRhaW5lcjogTWF4dHJhY2sgSW5kdXN0cmlhbCAqLwotCS5ib290X3BhcmFtcyA9IE1YMjdfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgyN19tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgyN19pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MjdfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgyN19oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteHRfdGQ2MF90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXh0X3RkNjBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjYTEwMC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY2ExMDAuYwppbmRleCA3MTA4M2FhLi4yNjA3MmY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjYTEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNhMTAwLmMKQEAgLTQzNSwxMCArNDM1LDExIEBACiB9OwogCiBNQUNISU5FX1NUQVJUKFBDQTEwMCwgInBoeUNBUkQtaS5NWDI3IikKLQkuYm9vdF9wYXJhbXMgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjdfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjdfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDI3X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjdfaGFuZGxlX2lycSwKIAkuaW5pdF9tYWNoaW5lID0gcGNhMTAwX2luaXQsCiAJLnRpbWVyID0gJnBjYTEwMF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzNy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzcuYwppbmRleCBmNDViN2NkLi5lZmQ2YjUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM3LmMKQEAgLTY4OCwxMSArNjg4LDEyIEBACiAKIE1BQ0hJTkVfU1RBUlQoUENNMDM3LCAiUGh5dGVjIFBoeWNvcmUgcGNtMDM3IikKIAkvKiBNYWludGFpbmVyOiBQZW5ndXRyb25peCAqLwotCS5ib290X3BhcmFtcyA9IE1YM3hfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkucmVzZXJ2ZSA9IHBjbTAzN19yZXNlcnZlLAogCS5tYXBfaW8gPSBteDMxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDMxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgzMV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDMxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJnBjbTAzN190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gcGNtMDM3X2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzguYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM4LmMKaW5kZXggMmQ2YTY0Yi4uYTE3ZTljNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzguYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzOC5jCkBAIC0xNzYsNyArMTc2LDkgQEAKICAqIHNldHVwIG90aGVyIHN0dWZmcyB0byBhY2Nlc3MgdGhlIHNyYW0uICovCiBzdGF0aWMgdm9pZCBfX2luaXQgcGNtMDM4X2luaXRfc3JhbSh2b2lkKQogewotCW14Mjdfc2V0dXBfd2VpbWNzKDEsIDB4MDAwMGQ4NDMsIDB4MjIyNTI1MjEsIDB4MjIyMjBhMDApOworCV9fcmF3X3dyaXRlbCgweDAwMDBkODQzLCBNWDI3X0lPX0FERFJFU1MoTVgyN19XRUlNX0NTQ1J4VSgxKSkpOworCV9fcmF3X3dyaXRlbCgweDIyMjUyNTIxLCBNWDI3X0lPX0FERFJFU1MoTVgyN19XRUlNX0NTQ1J4TCgxKSkpOworCV9fcmF3X3dyaXRlbCgweDIyMjIwYTAwLCBNWDI3X0lPX0FERFJFU1MoTVgyN19XRUlNX0NTQ1J4QSgxKSkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIHBjbTAzOF9pMmMxX2RhdGEgX19pbml0Y29uc3QgPSB7CkBAIC0yNjYsOCArMjY4LDcgQEAKIAkJLnJlZ3VsYXRvcnMgPSBwY20wMzhfcmVndWxhdG9ycywKIAkJLm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRShwY20wMzhfcmVndWxhdG9ycyksCiAJfSwKLQkuZmxhZ3MgPSBNQzEzNzgzX1VTRV9BREMgfCBNQzEzNzgzX1VTRV9SRUdVTEFUT1IgfAotCQkgTUMxMzc4M19VU0VfVE9VQ0hTQ1JFRU4sCisJLmZsYWdzID0gTUMxM1hYWF9VU0VfQURDIHwgTUMxM1hYWF9VU0VfVE9VQ0hTQ1JFRU4sCiB9OwogCiBzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHBjbTAzOF9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CkBAIC0zNDksMTAgKzM1MCwxMSBAQAogfTsKIAogTUFDSElORV9TVEFSVChQQ00wMzgsICJwaHlDT1JFLWkuTVgyNyIpCi0JLmJvb3RfcGFyYW1zID0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDI3X21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDI3X2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgyN19pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDI3X2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJnBjbTAzOF90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gcGNtMDM4X2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wNDMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDQzLmMKaW5kZXggNjYwZWMzZS4uNzM2NmMyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wNDMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTA0My5jCkBAIC00MTgsMTAgKzQxOCwxMSBAQAogCiBNQUNISU5FX1NUQVJUKFBDTTA0MywgIlBoeXRlYyBQaHljb3JlIHBjbTA0MyIpCiAJLyogTWFpbnRhaW5lcjogUGVuZ3V0cm9uaXggKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDN4X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MzVfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzVfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDM1X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzVfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmcGNtMDQzX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBwY20wNDNfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXFvbmcuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcW9uZy5jCmluZGV4IDM2MjZmNDguLjRmZjVmYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcW9uZy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcW9uZy5jCkBAIC0xOTAsNyArMTkwLDEwIEBACiBzdGF0aWMgdm9pZCBfX2luaXQgcW9uZ19pbml0X25hbmRfbXRkKHZvaWQpCiB7CiAJLyogaW5pdCBDUyAqLwotCW14MzFfc2V0dXBfd2VpbWNzKDMsIDB4MDAwMDRmMDAsIDB4MjAwMTNiMzEsIDB4MDAwMjA4MDApOworCV9fcmF3X3dyaXRlbCgweDAwMDA0ZjAwLCBNWDMxX0lPX0FERFJFU1MoTVgzMV9XRUlNX0NTQ1J4VSgzKSkpOworCV9fcmF3X3dyaXRlbCgweDIwMDEzYjMxLCBNWDMxX0lPX0FERFJFU1MoTVgzMV9XRUlNX0NTQ1J4TCgzKSkpOworCV9fcmF3X3dyaXRlbCgweDAwMDIwODAwLCBNWDMxX0lPX0FERFJFU1MoTVgzMV9XRUlNX0NTQ1J4QSgzKSkpOworCiAJbXhjX2lvbXV4X3NldF9ncHIoTVVYX1NEQ1RMX0NTRDFfU0VMLCB0cnVlKTsKIAogCS8qIGVuYWJsZSBwaW4gKi8KQEAgLTI0OSw2ICsyNTIsNyBAQAogCW14Y19pbml0X2lteF91YXJ0KCk7CiAJcW9uZ19pbml0X25vcl9tdGQoKTsKIAlxb25nX2luaXRfZnBnYSgpOworCWlteDMxX2FkZF9pbXgyX3dkdChOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHFvbmdfdGltZXJfaW5pdCh2b2lkKQpAQCAtMjYyLDEwICsyNjYsMTEgQEAKIAogTUFDSElORV9TVEFSVChRT05HLCAiRGF2ZS9ERU5YIFFvbmdFVkItTElURSIpCiAJLyogTWFpbnRhaW5lcjogREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyBHbWJIICovCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDMxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDMxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgzMV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDMxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJnFvbmdfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IHFvbmdfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXNjYjkzMjguYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtc2NiOTMyOC5jCmluZGV4IGRiMmQ2MDQuLmJiNmU1YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtc2NiOTMyOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtc2NiOTMyOC5jCkBAIC0xMzcsMTAgKzEzNywxMSBAQAogCiBNQUNISU5FX1NUQVJUKFNDQjkzMjgsICJTeW5lcnRyb25peHggc2NiOTMyOCIpCiAJLyogU2FzY2hhIEhhdWVyICovCi0JLmJvb3RfcGFyYW1zID0gMHgwODAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAxMDAsCiAJLm1hcF9pbyA9IG14MV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZzY2I5MzI4X3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBzY2I5MzI4X2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC12cHIyMDAuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtdnByMjAwLmMKaW5kZXggN2Q4ZTAxMi4uNjkwOTI0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC12cHIyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXZwcjIwMC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAl9LCB7CiAJCUkyQ19CT0FSRF9JTkZPKCJtYzEzODkyIiwgMHgwOCksCiAJCS5wbGF0Zm9ybV9kYXRhID0gJnZwcjIwMF9wbWljLAotCQkuaXJxID0gZ3Bpb190b19pcnEoR1BJT19QTUlDX0lOVCksCisJCS5pcnEgPSBJTVhfR1BJT19UT19JUlEoR1BJT19QTUlDX0lOVCksCiAJfQogfTsKIApAQCAtMzE5LDYgKzMxOSw3IEBACiAJLm1hcF9pbyA9IG14MzVfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzVfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDM1X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzVfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmdnByMjAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSB2cHIyMDBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwZTgyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBBcm0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICogIENvcHlyaWdodCAoQykgMjAwMiBTaGFuZSBOYXkgKHNoYW5lQG1pbmlybC5jb20pCisgKiAgQ29weXJpZ2h0IDIwMDUtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgLSBhZGQgTVgzMSBzcGVjaWZpYyBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC12My5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCitzdGF0aWMgdm9pZCBpbXgzX2lkbGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZyA9IDA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCS8qIGRpc2FibGUgSSBhbmQgRCBjYWNoZSAqLworCQkibXJjIHAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgorCQkiYmljICUwLCAlMCwgIzB4MDAwMDEwMDBcbiIKKwkJImJpYyAlMCwgJTAsICMweDAwMDAwMDA0XG4iCisJCSJtY3IgcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCisJCS8qIGludmFsaWRhdGUgSSBjYWNoZSAqLworCQkibW92ICUwLCAjMFxuIgorCQkibWNyIHAxNSwgMCwgJTAsIGM3LCBjNSwgMFxuIgorCQkvKiBjbGVhciBhbmQgaW52YWxpZGF0ZSBEIGNhY2hlICovCisJCSJtb3YgJTAsICMwXG4iCisJCSJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxNCwgMFxuIgorCQkvKiBXRkkgKi8KKwkJIm1vdiAlMCwgIzBcbiIKKwkJIm1jciBwMTUsIDAsICUwLCBjNywgYzAsIDRcbiIKKwkJIm5vcFxuIiAibm9wXG4iICJub3BcbiIgIm5vcFxuIgorCQkibm9wXG4iICJub3BcbiIgIm5vcFxuIgorCQkvKiBlbmFibGUgSSBhbmQgRCBjYWNoZSAqLworCQkibXJjIHAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgorCQkib3JyICUwLCAlMCwgIzB4MDAwMDEwMDBcbiIKKwkJIm9yciAlMCwgJTAsICMweDAwMDAwMDA0XG4iCisJCSJtY3IgcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCisJCTogIj1yIiAocmVnKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmlteDNfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgc2l6ZV90IHNpemUsCisJCQkJICB1bnNpZ25lZCBpbnQgbXR5cGUpCit7CisJaWYgKG10eXBlID09IE1UX0RFVklDRSkgeworCQkvKgorCQkgKiBBY2Nlc3MgYWxsIHBlcmlwaGVyYWxzIGJlbG93IDB4ODAwMDAwMDAgYXMgbm9uc2hhcmVkIGRldmljZQorCQkgKiBvbiBteDMsIGJ1dCBsZWF2ZSBsMmNjIGFsb25lLiAgT3RoZXJ3aXNlIGNhY2hlIGNvcnJ1cHRpb25zCisJCSAqIGNhbiBvY2N1ci4KKwkJICovCisJCWlmIChwaHlzX2FkZHIgPCAweDgwMDAwMDAwICYmCisJCQkJIWFkZHJfaW5fbW9kdWxlKHBoeXNfYWRkciwgTVgzeF9MMkNDKSkKKwkJCW10eXBlID0gTVRfREVWSUNFX05PTlNIQVJFRDsKKwl9CisKKwlyZXR1cm4gX19hcm1faW9yZW1hcChwaHlzX2FkZHIsIHNpemUsIG10eXBlKTsKK30KKwordm9pZCBpbXgzX2luaXRfbDJ4MCh2b2lkKQoreworCXZvaWQgX19pb21lbSAqbDJ4MF9iYXNlOworCXZvaWQgX19pb21lbSAqY2xrY3RsX2Jhc2U7CisKKy8qCisgKiBGaXJzdCBvZiBhbGwsIHdlIG11c3QgcmVwYWlyIGJyb2tlbiBjaGlwIHNldHRpbmdzLiBUaGVyZSBhcmUgc29tZQorICogaS5NWDM1IENQVXMgaW4gdGhlIHdpbGQsIGNvbW1pbmcgd2l0aCBib2d1cyBMMiBjYWNoZSBzZXR0aW5ncy4gVGhlc2UKKyAqIG1pc2NvbmZpZ3VyZWQgQ1BVcyB3aWxsIHJ1biBhbW9rIGltbWVkaWF0ZWx5IHdoZW4gdGhlIEwyIGNhY2hlIGdldHMgZW5hYmxlZC4KKyAqIFdvcmthcmFvdW5kIGlzIHRvIHNldHVwIHRoZSBjb3JyZWN0IHJlZ2lzdGVyIHNldHRpbmcgcHJpb3IgZW5hYmxpbmcgdGhlCisgKiBMMiBjYWNoZS4gVGhpcyBzaG91bGQgbm90IGh1cnQgYWxyZWFkeSB3b3JraW5nIENQVXMsIGFzIHRoZXkgYXJlIHVzaW5nIHRoZQorICogc2FtZSB2YWx1ZS4KKyAqLworI2RlZmluZSBMMl9NRU1fVkFMIDB4MTAKKworCWNsa2N0bF9iYXNlID0gaW9yZW1hcChNWDM1X0NMS0NUTF9CQVNFX0FERFIsIDQwOTYpOworCWlmIChjbGtjdGxfYmFzZSAhPSBOVUxMKSB7CisJCXdyaXRlbCgweDAwMDAwNTE1LCBjbGtjdGxfYmFzZSArIEwyX01FTV9WQUwpOworCQlpb3VubWFwKGNsa2N0bF9iYXNlKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIkwyIGNhY2hlOiBDYW5ub3QgZml4IHRpbWluZy4gVHJ5aW5nIHRvIGNvbnRpbnVlIHdpdGhvdXRcbiIpOworCX0KKworCWwyeDBfYmFzZSA9IGlvcmVtYXAoTVgzeF9MMkNDX0JBU0VfQUREUiwgNDA5Nik7CisJaWYgKElTX0VSUihsMngwX2Jhc2UpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmVtYXBwaW5nIEwyIGNhY2hlIGFyZWEgZmFpbGVkIHdpdGggJWxkXG4iLAorCQkJCVBUUl9FUlIobDJ4MF9iYXNlKSk7CisJCXJldHVybjsKKwl9CisKKwlsMngwX2luaXQobDJ4MF9iYXNlLCAweDAwMDMwMDI0LCAweDAwMDAwMDAwKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDMxX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCWlteF9tYXBfZW50cnkoTVgzMSwgWF9NRU1DLCBNVF9ERVZJQ0UpLAorCWlteF9tYXBfZW50cnkoTVgzMSwgQVZJQywgTVRfREVWSUNFX05PTlNIQVJFRCksCisJaW14X21hcF9lbnRyeShNWDMxLCBBSVBTMSwgTVRfREVWSUNFX05PTlNIQVJFRCksCisJaW14X21hcF9lbnRyeShNWDMxLCBBSVBTMiwgTVRfREVWSUNFX05PTlNIQVJFRCksCisJaW14X21hcF9lbnRyeShNWDMxLCBTUEJBMCwgTVRfREVWSUNFX05PTlNIQVJFRCksCit9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbWVtb3J5IG1hcC4gSXQgaXMgY2FsbGVkIGR1cmluZyB0aGUKKyAqIHN5c3RlbSBzdGFydHVwIHRvIGNyZWF0ZSBzdGF0aWMgcGh5c2ljYWwgdG8gdmlydHVhbCBtZW1vcnkgbWFwcGluZ3MKKyAqIGZvciB0aGUgSU8gbW9kdWxlcy4KKyAqLwordm9pZCBfX2luaXQgbXgzMV9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQobXgzMV9pb19kZXNjLCBBUlJBWV9TSVpFKG14MzFfaW9fZGVzYykpOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14MzVfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJaW14X21hcF9lbnRyeShNWDM1LCBYX01FTUMsIE1UX0RFVklDRSksCisJaW14X21hcF9lbnRyeShNWDM1LCBBVklDLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKKwlpbXhfbWFwX2VudHJ5KE1YMzUsIEFJUFMxLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKKwlpbXhfbWFwX2VudHJ5KE1YMzUsIEFJUFMyLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKKwlpbXhfbWFwX2VudHJ5KE1YMzUsIFNQQkEwLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKK307CisKK3ZvaWQgX19pbml0IG14MzVfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KG14MzVfaW9fZGVzYywgQVJSQVlfU0laRShteDM1X2lvX2Rlc2MpKTsKK30KKwordm9pZCBfX2luaXQgaW14MzFfaW5pdF9lYXJseSh2b2lkKQoreworCW14Y19zZXRfY3B1X3R5cGUoTVhDX0NQVV9NWDMxKTsKKwlteGNfYXJjaF9yZXNldF9pbml0KE1YMzFfSU9fQUREUkVTUyhNWDMxX1dET0dfQkFTRV9BRERSKSk7CisJaW14X2lkbGUgPSBpbXgzX2lkbGU7CisJaW14X2lvcmVtYXAgPSBpbXgzX2lvcmVtYXA7Cit9CisKK3ZvaWQgX19pbml0IGlteDM1X2luaXRfZWFybHkodm9pZCkKK3sKKwlteGNfc2V0X2NwdV90eXBlKE1YQ19DUFVfTVgzNSk7CisJbXhjX2lvbXV4X3YzX2luaXQoTVgzNV9JT19BRERSRVNTKE1YMzVfSU9NVVhDX0JBU0VfQUREUikpOworCW14Y19hcmNoX3Jlc2V0X2luaXQoTVgzNV9JT19BRERSRVNTKE1YMzVfV0RPR19CQVNFX0FERFIpKTsKKwlpbXhfaWRsZSA9IGlteDNfaWRsZTsKKwlpbXhfaW9yZW1hcCA9IGlteDNfaW9yZW1hcDsKK30KKwordm9pZCBfX2luaXQgbXgzMV9pbml0X2lycSh2b2lkKQoreworCW14Y19pbml0X2lycShNWDMxX0lPX0FERFJFU1MoTVgzMV9BVklDX0JBU0VfQUREUikpOworfQorCit2b2lkIF9faW5pdCBteDM1X2luaXRfaXJxKHZvaWQpCit7CisJbXhjX2luaXRfaXJxKE1YMzVfSU9fQUREUkVTUyhNWDM1X0FWSUNfQkFTRV9BRERSKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgaW14MzFfdG8xX3NkbWFfc2NyaXB0IF9faW5pdGRhdGEgPSB7CisJLnBlcl8yX3Blcl9hZGRyID0gMTY3NywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgaW14MzFfdG8yX3NkbWFfc2NyaXB0IF9faW5pdGRhdGEgPSB7CisJLmFwXzJfYXBfYWRkciA9IDQyMywKKwkuYXBfMl9icF9hZGRyID0gODI5LAorCS5icF8yX2FwX2FkZHIgPSAxMDI5LAorfTsKKworc3RhdGljIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgaW14MzFfc2RtYV9wZGF0YSBfX2luaXRkYXRhID0geworCS5md19uYW1lID0gInNkbWEtaW14MzEtdG8yLmJpbiIsCisJLnNjcmlwdF9hZGRycyA9ICZpbXgzMV90bzJfc2RtYV9zY3JpcHQsCit9OworCit2b2lkIF9faW5pdCBpbXgzMV9zb2NfaW5pdCh2b2lkKQoreworCWludCB0b192ZXJzaW9uID0gbXgzMV9yZXZpc2lvbigpID4+IDQ7CisKKwlpbXgzX2luaXRfbDJ4MCgpOworCisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAwLCBNWDMxX0dQSU8xX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9HUElPMSwgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDMxX0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9HUElPMiwgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDMxX0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9HUElPMywgMCk7CisKKwlpZiAodG9fdmVyc2lvbiA9PSAxKSB7CisJCXN0cm5jcHkoaW14MzFfc2RtYV9wZGF0YS5md19uYW1lLCAic2RtYS1pbXgzMS10bzEuYmluIiwKKwkJCXN0cmxlbihpbXgzMV9zZG1hX3BkYXRhLmZ3X25hbWUpKTsKKwkJaW14MzFfc2RtYV9wZGF0YS5zY3JpcHRfYWRkcnMgPSAmaW14MzFfdG8xX3NkbWFfc2NyaXB0OworCX0KKworCWlteF9hZGRfaW14X3NkbWEoImlteDMxLXNkbWEiLCBNWDMxX1NETUFfQkFTRV9BRERSLCBNWDMxX0lOVF9TRE1BLCAmaW14MzFfc2RtYV9wZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgaW14MzVfdG8xX3NkbWFfc2NyaXB0IF9faW5pdGRhdGEgPSB7CisJLmFwXzJfYXBfYWRkciA9IDY0MiwKKwkudWFydF8yX21jdV9hZGRyID0gODE3LAorCS5tY3VfMl9hcHBfYWRkciA9IDc0NywKKwkudWFydHNoXzJfbWN1X2FkZHIgPSAxMTgzLAorCS5wZXJfMl9zaHBfYWRkciA9IDEwMzMsCisJLm1jdV8yX3NocF9hZGRyID0gOTYxLAorCS5hdGFfMl9tY3VfYWRkciA9IDEzMzMsCisJLm1jdV8yX2F0YV9hZGRyID0gMTI1MiwKKwkuYXBwXzJfbWN1X2FkZHIgPSA2ODMsCisJLnNocF8yX3Blcl9hZGRyID0gMTExMSwKKwkuc2hwXzJfbWN1X2FkZHIgPSA4OTIsCit9OworCitzdGF0aWMgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzIGlteDM1X3RvMl9zZG1hX3NjcmlwdCBfX2luaXRkYXRhID0geworCS5hcF8yX2FwX2FkZHIgPSA3MjksCisJLnVhcnRfMl9tY3VfYWRkciA9IDkwNCwKKwkucGVyXzJfYXBwX2FkZHIgPSAxNTk3LAorCS5tY3VfMl9hcHBfYWRkciA9IDgzNCwKKwkudWFydHNoXzJfbWN1X2FkZHIgPSAxMjcwLAorCS5wZXJfMl9zaHBfYWRkciA9IDExMjAsCisJLm1jdV8yX3NocF9hZGRyID0gMTA0OCwKKwkuYXRhXzJfbWN1X2FkZHIgPSAxNDI5LAorCS5tY3VfMl9hdGFfYWRkciA9IDEzMzksCisJLmFwcF8yX3Blcl9hZGRyID0gMTUzMSwKKwkuYXBwXzJfbWN1X2FkZHIgPSA3NzAsCisJLnNocF8yX3Blcl9hZGRyID0gMTE5OCwKKwkuc2hwXzJfbWN1X2FkZHIgPSA5NzksCit9OworCitzdGF0aWMgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSBpbXgzNV9zZG1hX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmZ3X25hbWUgPSAic2RtYS1pbXgzNS10bzIuYmluIiwKKwkuc2NyaXB0X2FkZHJzID0gJmlteDM1X3RvMl9zZG1hX3NjcmlwdCwKK307CisKK3ZvaWQgX19pbml0IGlteDM1X3NvY19pbml0KHZvaWQpCit7CisJaW50IHRvX3ZlcnNpb24gPSBteDM1X3JldmlzaW9uKCkgPj4gNDsKKworCWlteDNfaW5pdF9sMngwKCk7CisKKwkvKiBpLm14MzUgaGFzIHRoZSBpLm14MzEgdHlwZSBncGlvICovCisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAwLCBNWDM1X0dQSU8xX0JBU0VfQUREUiwgU1pfMTZLLCBNWDM1X0lOVF9HUElPMSwgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDM1X0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDM1X0lOVF9HUElPMiwgMCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDM1X0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDM1X0lOVF9HUElPMywgMCk7CisKKwlpZiAodG9fdmVyc2lvbiA9PSAxKSB7CisJCXN0cm5jcHkoaW14MzVfc2RtYV9wZGF0YS5md19uYW1lLCAic2RtYS1pbXgzNS10bzEuYmluIiwKKwkJCXN0cmxlbihpbXgzNV9zZG1hX3BkYXRhLmZ3X25hbWUpKTsKKwkJaW14MzVfc2RtYV9wZGF0YS5zY3JpcHRfYWRkcnMgPSAmaW14MzVfdG8xX3NkbWFfc2NyaXB0OworCX0KKworCWlteF9hZGRfaW14X3NkbWEoImlteDM1LXNkbWEiLCBNWDM1X1NETUFfQkFTRV9BRERSLCBNWDM1X0lOVF9TRE1BLCAmaW14MzVfc2RtYV9wZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzMS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjNTVlNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBBcm0gTGltaXRlZAotICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAotICogIENvcHlyaWdodCAoQykgMjAwMiBTaGFuZSBOYXkgKHNoYW5lQG1pbmlybC5jb20pCi0gKiAgQ29weXJpZ2h0IDIwMDUtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogICAgLSBhZGQgTVgzMSBzcGVjaWZpYyBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjMuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDMxX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCWlteF9tYXBfZW50cnkoTVgzMSwgWF9NRU1DLCBNVF9ERVZJQ0UpLAotCWlteF9tYXBfZW50cnkoTVgzMSwgQVZJQywgTVRfREVWSUNFX05PTlNIQVJFRCksCi0JaW14X21hcF9lbnRyeShNWDMxLCBBSVBTMSwgTVRfREVWSUNFX05PTlNIQVJFRCksCi0JaW14X21hcF9lbnRyeShNWDMxLCBBSVBTMiwgTVRfREVWSUNFX05PTlNIQVJFRCksCi0JaW14X21hcF9lbnRyeShNWDMxLCBTUEJBMCwgTVRfREVWSUNFX05PTlNIQVJFRCksCi19OwotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbWVtb3J5IG1hcC4gSXQgaXMgY2FsbGVkIGR1cmluZyB0aGUKLSAqIHN5c3RlbSBzdGFydHVwIHRvIGNyZWF0ZSBzdGF0aWMgcGh5c2ljYWwgdG8gdmlydHVhbCBtZW1vcnkgbWFwcGluZ3MKLSAqIGZvciB0aGUgSU8gbW9kdWxlcy4KLSAqLwotdm9pZCBfX2luaXQgbXgzMV9tYXBfaW8odm9pZCkKLXsKLQlpb3RhYmxlX2luaXQobXgzMV9pb19kZXNjLCBBUlJBWV9TSVpFKG14MzFfaW9fZGVzYykpOwotfQotCi12b2lkIF9faW5pdCBpbXgzMV9pbml0X2Vhcmx5KHZvaWQpCi17Ci0JbXhjX3NldF9jcHVfdHlwZShNWENfQ1BVX01YMzEpOwotCW14Y19hcmNoX3Jlc2V0X2luaXQoTVgzMV9JT19BRERSRVNTKE1YMzFfV0RPR19CQVNFX0FERFIpKTsKLX0KLQotdm9pZCBfX2luaXQgbXgzMV9pbml0X2lycSh2b2lkKQotewotCW14Y19pbml0X2lycShNWDMxX0lPX0FERFJFU1MoTVgzMV9BVklDX0JBU0VfQUREUikpOwotfQotCi1zdGF0aWMgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzIGlteDMxX3RvMV9zZG1hX3NjcmlwdCBfX2luaXRkYXRhID0gewotCS5wZXJfMl9wZXJfYWRkciA9IDE2NzcsCi19OwotCi1zdGF0aWMgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzIGlteDMxX3RvMl9zZG1hX3NjcmlwdCBfX2luaXRkYXRhID0gewotCS5hcF8yX2FwX2FkZHIgPSA0MjMsCi0JLmFwXzJfYnBfYWRkciA9IDgyOSwKLQkuYnBfMl9hcF9hZGRyID0gMTAyOSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhIGlteDMxX3NkbWFfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuZndfbmFtZSA9ICJzZG1hLWlteDMxLXRvMi5iaW4iLAotCS5zY3JpcHRfYWRkcnMgPSAmaW14MzFfdG8yX3NkbWFfc2NyaXB0LAotfTsKLQotdm9pZCBfX2luaXQgaW14MzFfc29jX2luaXQodm9pZCkKLXsKLQlpbnQgdG9fdmVyc2lvbiA9IG14MzFfcmV2aXNpb24oKSA+PiA0OwotCi0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAwLCBNWDMxX0dQSU8xX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9HUElPMSwgMCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDMxX0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9HUElPMiwgMCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDMxX0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDMxX0lOVF9HUElPMywgMCk7Ci0KLQlpZiAodG9fdmVyc2lvbiA9PSAxKSB7Ci0JCXN0cm5jcHkoaW14MzFfc2RtYV9wZGF0YS5md19uYW1lLCAic2RtYS1pbXgzMS10bzEuYmluIiwKLQkJCXN0cmxlbihpbXgzMV9zZG1hX3BkYXRhLmZ3X25hbWUpKTsKLQkJaW14MzFfc2RtYV9wZGF0YS5zY3JpcHRfYWRkcnMgPSAmaW14MzFfdG8xX3NkbWFfc2NyaXB0OwotCX0KLQotCWlteF9hZGRfaW14X3NkbWEoImlteDMxLXNkbWEiLCBNWDMxX1NETUFfQkFTRV9BRERSLCBNWDMxX0lOVF9TRE1BLCAmaW14MzFfc2RtYV9wZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5YmFjNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgQXJtIExpbWl0ZWQKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIgU2hhbmUgTmF5IChzaGFuZUBtaW5pcmwuY29tKQotICogIENvcHlyaWdodCAyMDA1LTIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqICAgIC0gYWRkIE1YMzEgc3BlY2lmaWMgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgotCi0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjMuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDM1X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCWlteF9tYXBfZW50cnkoTVgzNSwgWF9NRU1DLCBNVF9ERVZJQ0UpLAotCWlteF9tYXBfZW50cnkoTVgzNSwgQVZJQywgTVRfREVWSUNFX05PTlNIQVJFRCksCi0JaW14X21hcF9lbnRyeShNWDM1LCBBSVBTMSwgTVRfREVWSUNFX05PTlNIQVJFRCksCi0JaW14X21hcF9lbnRyeShNWDM1LCBBSVBTMiwgTVRfREVWSUNFX05PTlNIQVJFRCksCi0JaW14X21hcF9lbnRyeShNWDM1LCBTUEJBMCwgTVRfREVWSUNFX05PTlNIQVJFRCksCi19OwotCi12b2lkIF9faW5pdCBteDM1X21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChteDM1X2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgzNV9pb19kZXNjKSk7Ci19Ci0KLXZvaWQgX19pbml0IGlteDM1X2luaXRfZWFybHkodm9pZCkKLXsKLQlteGNfc2V0X2NwdV90eXBlKE1YQ19DUFVfTVgzNSk7Ci0JbXhjX2lvbXV4X3YzX2luaXQoTVgzNV9JT19BRERSRVNTKE1YMzVfSU9NVVhDX0JBU0VfQUREUikpOwotCW14Y19hcmNoX3Jlc2V0X2luaXQoTVgzNV9JT19BRERSRVNTKE1YMzVfV0RPR19CQVNFX0FERFIpKTsKLX0KLQotdm9pZCBfX2luaXQgbXgzNV9pbml0X2lycSh2b2lkKQotewotCW14Y19pbml0X2lycShNWDM1X0lPX0FERFJFU1MoTVgzNV9BVklDX0JBU0VfQUREUikpOwotfQotCi1zdGF0aWMgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzIGlteDM1X3RvMV9zZG1hX3NjcmlwdCBfX2luaXRkYXRhID0gewotCS5hcF8yX2FwX2FkZHIgPSA2NDIsCi0JLnVhcnRfMl9tY3VfYWRkciA9IDgxNywKLQkubWN1XzJfYXBwX2FkZHIgPSA3NDcsCi0JLnVhcnRzaF8yX21jdV9hZGRyID0gMTE4MywKLQkucGVyXzJfc2hwX2FkZHIgPSAxMDMzLAotCS5tY3VfMl9zaHBfYWRkciA9IDk2MSwKLQkuYXRhXzJfbWN1X2FkZHIgPSAxMzMzLAotCS5tY3VfMl9hdGFfYWRkciA9IDEyNTIsCi0JLmFwcF8yX21jdV9hZGRyID0gNjgzLAotCS5zaHBfMl9wZXJfYWRkciA9IDExMTEsCi0JLnNocF8yX21jdV9hZGRyID0gODkyLAotfTsKLQotc3RhdGljIHN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycyBpbXgzNV90bzJfc2RtYV9zY3JpcHQgX19pbml0ZGF0YSA9IHsKLQkuYXBfMl9hcF9hZGRyID0gNzI5LAotCS51YXJ0XzJfbWN1X2FkZHIgPSA5MDQsCi0JLnBlcl8yX2FwcF9hZGRyID0gMTU5NywKLQkubWN1XzJfYXBwX2FkZHIgPSA4MzQsCi0JLnVhcnRzaF8yX21jdV9hZGRyID0gMTI3MCwKLQkucGVyXzJfc2hwX2FkZHIgPSAxMTIwLAotCS5tY3VfMl9zaHBfYWRkciA9IDEwNDgsCi0JLmF0YV8yX21jdV9hZGRyID0gMTQyOSwKLQkubWN1XzJfYXRhX2FkZHIgPSAxMzM5LAotCS5hcHBfMl9wZXJfYWRkciA9IDE1MzEsCi0JLmFwcF8yX21jdV9hZGRyID0gNzcwLAotCS5zaHBfMl9wZXJfYWRkciA9IDExOTgsCi0JLnNocF8yX21jdV9hZGRyID0gOTc5LAotfTsKLQotc3RhdGljIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgaW14MzVfc2RtYV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5md19uYW1lID0gInNkbWEtaW14MzUtdG8yLmJpbiIsCi0JLnNjcmlwdF9hZGRycyA9ICZpbXgzNV90bzJfc2RtYV9zY3JpcHQsCi19OwotCi12b2lkIF9faW5pdCBpbXgzNV9zb2NfaW5pdCh2b2lkKQotewotCWludCB0b192ZXJzaW9uID0gbXgzNV9yZXZpc2lvbigpID4+IDQ7Ci0KLQkvKiBpLm14MzUgaGFzIHRoZSBpLm14MzEgdHlwZSBncGlvICovCi0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAwLCBNWDM1X0dQSU8xX0JBU0VfQUREUiwgU1pfMTZLLCBNWDM1X0lOVF9HUElPMSwgMCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDM1X0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDM1X0lOVF9HUElPMiwgMCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDM1X0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDM1X0lOVF9HUElPMywgMCk7Ci0KLQlpZiAodG9fdmVyc2lvbiA9PSAxKSB7Ci0JCXN0cm5jcHkoaW14MzVfc2RtYV9wZGF0YS5md19uYW1lLCAic2RtYS1pbXgzNS10bzEuYmluIiwKLQkJCXN0cmxlbihpbXgzNV9zZG1hX3BkYXRhLmZ3X25hbWUpKTsKLQkJaW14MzVfc2RtYV9wZGF0YS5zY3JpcHRfYWRkcnMgPSAmaW14MzVfdG8xX3NkbWFfc2NyaXB0OwotCX0KLQotCWlteF9hZGRfaW14X3NkbWEoImlteDM1LXNkbWEiLCBNWDM1X1NETUFfQkFTRV9BRERSLCBNWDM1X0lOVF9TRE1BLCAmaW14MzVfc2RtYV9wZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tbWRjLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2MWU5OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21tZGMuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisKKyNkZWZpbmUgTU1EQ19NQVBTUgkJMHg0MDQKKyNkZWZpbmUgQlBfTU1EQ19NQVBTUl9QU0QJMAorI2RlZmluZSBCUF9NTURDX01BUFNSX1BTUwk0CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlteF9tbWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXZvaWQgX19pb21lbSAqbW1kY19iYXNlLCAqcmVnOworCXUzMiB2YWw7CisJaW50IHRpbWVvdXQgPSAweDQwMDsKKworCW1tZGNfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlXQVJOX09OKCFtbWRjX2Jhc2UpOworCisJcmVnID0gbW1kY19iYXNlICsgTU1EQ19NQVBTUjsKKworCS8qIEVuYWJsZSBhdXRvbWF0aWMgcG93ZXIgc2F2aW5nICovCisJdmFsID0gcmVhZGxfcmVsYXhlZChyZWcpOworCXZhbCAmPSB+KDEgPDwgQlBfTU1EQ19NQVBTUl9QU0QpOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcmVnKTsKKworCS8qIEVuc3VyZSBpdCdzIHN1Y2Nlc3NmdWxseSBlbmFibGVkICovCisJd2hpbGUgKCEocmVhZGxfcmVsYXhlZChyZWcpICYgMSA8PCBCUF9NTURDX01BUFNSX1BTUykgJiYgLS10aW1lb3V0KQorCQljcHVfcmVsYXgoKTsKKworCWlmICh1bmxpa2VseSghdGltZW91dCkpIHsKKwkJcHJfd2FybigiJXM6IGZhaWxlZCB0byBlbmFibGUgYXV0b21hdGljIHBvd2VyIHNhdmluZ1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14X21tZGNfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtbW1kYyIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbXhfbW1kY19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImlteC1tbWRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGlteF9tbWRjX2R0X2lkcywKKwl9LAorCS5wcm9iZQkJPSBpbXhfbW1kY19wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlteF9tbWRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpbXhfbW1kY19kcml2ZXIpOworfQorcG9zdGNvcmVfaW5pdGNhbGwoaW14X21tZGNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLWlteC9wbGF0c21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5OGM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3BsYXRzbXAuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NtcF9zY3UuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNjdV9iYXNlOworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHNjdV9pb19kZXNjIF9faW5pdGRhdGEgPSB7CisJLyogLnZpcnR1YWwgYW5kIC5wZm4gYXJlIHJ1bi10aW1lIGFzc2lnbmVkICovCisJLmxlbmd0aAkJPSBTWl80SywKKwkudHlwZQkJPSBNVF9ERVZJQ0UsCit9OworCit2b2lkIF9faW5pdCBpbXhfc2N1X21hcF9pbyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKworCS8qIEdldCBTQ1UgYmFzZSAqLworCWFzbSgibXJjIHAxNSwgNCwgJTAsIGMxNSwgYzAsIDAiIDogIj1yIiAoYmFzZSkpOworCisJc2N1X2lvX2Rlc2MudmlydHVhbCA9IElNWF9JT19QMlYoYmFzZSk7CisJc2N1X2lvX2Rlc2MucGZuID0gX19waHlzX3RvX3BmbihiYXNlKTsKKwlpb3RhYmxlX2luaXQoJnNjdV9pb19kZXNjLCAxKTsKKworCXNjdV9iYXNlID0gSU1YX0lPX0FERFJFU1MoYmFzZSk7Cit9CisKK3ZvaWQgX19jcHVpbml0IHBsYXRmb3JtX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiBpZiBhbnkgaW50ZXJydXB0cyBhcmUgYWxyZWFkeSBlbmFibGVkIGZvciB0aGUgcHJpbWFyeQorCSAqIGNvcmUgKGUuZy4gdGltZXIgaXJxKSwgdGhlbiB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBlbmFibGVkCisJICogZm9yIHVzOiBkbyBzbworCSAqLworCWdpY19zZWNvbmRhcnlfaW5pdCgwKTsKK30KKworaW50IF9fY3B1aW5pdCBib290X3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCit7CisJaW14X3NldF9jcHVfanVtcChjcHUsIHY3X3NlY29uZGFyeV9zdGFydHVwKTsKKwlpbXhfZW5hYmxlX2NwdShjcHUsIHRydWUpOworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgQ1BVIHBvc3NpYmxlIG1hcCBlYXJseSAtIHRoaXMgZGVzY3JpYmVzIHRoZSBDUFVzCisgKiB3aGljaCBtYXkgYmUgcHJlc2VudCBvciBiZWNvbWUgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgorICovCit2b2lkIF9faW5pdCBzbXBfaW5pdF9jcHVzKHZvaWQpCit7CisJaW50IGksIG5jb3JlczsKKworCW5jb3JlcyA9IHNjdV9nZXRfY29yZV9jb3VudChzY3VfYmFzZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmNvcmVzOyBpKyspCisJCXNldF9jcHVfcG9zc2libGUoaSwgdHJ1ZSk7CisKKwlzZXRfc21wX2Nyb3NzX2NhbGwoZ2ljX3JhaXNlX3NvZnRpcnEpOworfQorCit2b2lkIGlteF9zbXBfcHJlcGFyZSh2b2lkKQoreworCXNjdV9lbmFibGUoc2N1X2Jhc2UpOworfQorCit2b2lkIF9faW5pdCBwbGF0Zm9ybV9zbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwlpbXhfc21wX3ByZXBhcmUoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDI3LmMgYi9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXgyNy5jCmluZGV4IGFjZjE3NjkuLmU0NTVkMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDI3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14MjcuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvc3lzdGVtLmg+Ci0jaW5jbHVkZSA8bWFjaC9teDI3Lmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiBzdGF0aWMgaW50IG14Mjdfc3VzcGVuZF9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2cS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14NnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjBmMTkxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14NnEuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KKyNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBoeXNfbDJ4MF9zYXZlZF9yZWdzOworCitzdGF0aWMgaW50IGlteDZxX3N1c3BlbmRfZmluaXNoKHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWNwdV9kb19pZGxlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW14NnFfcG1fZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFBNX1NVU1BFTkRfTUVNOgorCQlpbXg2cV9zZXRfbHBtKFNUT1BfUE9XRVJfT0ZGKTsKKwkJaW14X2dwY19wcmVfc3VzcGVuZCgpOworCQlpbXhfc2V0X2NwdV9qdW1wKDAsIHY3X2NwdV9yZXN1bWUpOworCQkvKiBaenogLi4uICovCisJCWNwdV9zdXNwZW5kKDAsIGlteDZxX3N1c3BlbmRfZmluaXNoKTsKKwkJaW14X3NtcF9wcmVwYXJlKCk7CisJCWlteF9ncGNfcG9zdF9yZXN1bWUoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgaW14NnFfcG1fb3BzID0geworCS5lbnRlciA9IGlteDZxX3BtX2VudGVyLAorCS52YWxpZCA9IHN1c3BlbmRfdmFsaWRfb25seV9tZW0sCit9OworCit2b2lkIF9faW5pdCBpbXg2cV9wbV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBUaGUgbDJ4MCBjb3JlIGNvZGUgcHJvdmlkZXMgYW4gaW5mcmFzdHVjdHVyZSB0byBzYXZlIGFuZCByZXN0b3JlCisJICogbDJ4MCByZWdpc3RlcnMgYWNyb3NzIHN1c3BlbmQvcmVzdW1lIGN5Y2xlLiAgQnV0IGJlY2F1c2UgaW14NnEKKwkgKiByZXRhaW5zIEwyIGNvbnRlbnQgZHVyaW5nIHN1c3BlbmQgYW5kIG5lZWRzIHRvIHJlc3VtZSBMMiBiZWZvcmUKKwkgKiBNTVUgaXMgZW5hYmxlZCwgaXQgY2FuIG9ubHkgdXRpbGl6ZSByZWdpc3RlciBzYXZpbmcgc3VwcG9ydCBhbmQKKwkgKiBoYXZlIHRvIHRha2UgY2FyZSBvZiByZXN0b3Jpbmcgb24gaXRzIG93bi4gIFNvIHdlIHNhdmUgcGh5c2ljYWwKKwkgKiBhZGRyZXNzIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IGwyeDAgY29yZSB0byBzYXZlIHJlZ2lzdGVycywKKwkgKiBhbmQgbGF0ZXIgcmVzdG9yZSB0aGUgbmVjZXNzYXJ5IG9uZXMgaW4gaW14NnEgcmVzdW1lIGVudHJ5LgorCSAqLworCXBoeXNfbDJ4MF9zYXZlZF9yZWdzID0gX19wYSgmbDJ4MF9zYXZlZF9yZWdzKTsKKworCXN1c3BlbmRfc2V0X29wcygmaW14NnFfcG1fb3BzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L3NyYy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjYWNiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3NyYy5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pZmllZC5oPgorCisjZGVmaW5lIFNSQ19TQ1IJCQkJMHgwMDAKKyNkZWZpbmUgU1JDX0dQUjEJCQkweDAyMAorI2RlZmluZSBCUF9TUkNfU0NSX0NPUkUxX1JTVAkJMTQKKyNkZWZpbmUgQlBfU1JDX1NDUl9DT1JFMV9FTkFCTEUJCTIyCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNyY19iYXNlOworCit2b2lkIGlteF9lbmFibGVfY3B1KGludCBjcHUsIGJvb2wgZW5hYmxlKQoreworCXUzMiBtYXNrLCB2YWw7CisKKwltYXNrID0gMSA8PCAoQlBfU1JDX1NDUl9DT1JFMV9FTkFCTEUgKyBjcHUgLSAxKTsKKwl2YWwgPSByZWFkbF9yZWxheGVkKHNyY19iYXNlICsgU1JDX1NDUik7CisJdmFsID0gZW5hYmxlID8gdmFsIHwgbWFzayA6IHZhbCAmIH5tYXNrOworCXdyaXRlbF9yZWxheGVkKHZhbCwgc3JjX2Jhc2UgKyBTUkNfU0NSKTsKK30KKwordm9pZCBpbXhfc2V0X2NwdV9qdW1wKGludCBjcHUsIHZvaWQgKmp1bXBfYWRkcikKK3sKKwl3cml0ZWxfcmVsYXhlZChCU1lNKHZpcnRfdG9fcGh5cyhqdW1wX2FkZHIpKSwKKwkJICAgICAgIHNyY19iYXNlICsgU1JDX0dQUjEgKyBjcHUgKiA4KTsKK30KKwordm9pZCBfX2luaXQgaW14X3NyY19pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxpbXg2cS1zcmMiKTsKKwlzcmNfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlXQVJOX09OKCFzcmNfYmFzZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggYTFmNTk4Zi4uNDExYjExNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHgxNjAwMDAwMAlAIHBoeXNpY2FsIGJhc2UgYWRkcmVzcwogCQltb3YJXHJ2LCAjMHhmMDAwMDAwMAlAIHZpcnR1YWwgYmFzZQogCQlhZGQJXHJ2LCBccnYsICMweDE2MDAwMDAwID4+IDQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCmluZGV4IGYyMTE5OTAuLmExNzY5ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSU5URUdSQVRPUiwgIkFSTS1JbnRlZ3JhdG9yIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IGludGVncmF0b3JfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IGFwX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGludGVncmF0b3JfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCmluZGV4IDRlYjAzYWIuLjVkZTQ5YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwpAQCAtNDkyLDcgKzQ5Miw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQ0lOVEVHUkFUT1IsICJBUk0tSW50ZWdyYXRvckNQIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IGludGVncmF0b3JfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IGludGNwX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGludGNwX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZTY2NDQ2Ni4uZDg2OWE2ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCW1vdglccnAsICMweDAwMDAyMzAwCiAJb3JyCVxycCwgXHJwLCAjMHgwMDAwMDA0MAogCW9ycglccnYsIFxycCwgIzB4ZmUwMDAwMDAJQCB2aXJ0dWFsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MG1jLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MG1jLmMKaW5kZXggMjNkZmFmZi4uNGNmMmNjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lxODEzNDBtYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwbWMuYwpAQCAtOTEsNyArOTEsNyBAQAogCiBNQUNISU5FX1NUQVJUKElRODEzNDBNQywgIkludGVsIElRODEzNDBNQyIpCiAJLyogTWFpbnRhaW5lcjogRGFuIFdpbGxpYW1zIDxkYW4uai53aWxsaWFtc0BpbnRlbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zICAgID0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBpb3AxM3h4X21hcF9pbywKIAkuaW5pdF9pcnEgICAgICAgPSBpb3AxM3h4X2luaXRfaXJxLAogCS50aW1lciAgICAgICAgICA9ICZpcTgxMzQwbWNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MHNjLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MHNjLmMKaW5kZXggZGYzNDkyYS4uY2Q5ZTI3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lxODEzNDBzYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwc2MuYwpAQCAtOTMsNyArOTMsNyBAQAogCiBNQUNISU5FX1NUQVJUKElRODEzNDBTQywgIkludGVsIElRODEzNDBTQyIpCiAJLyogTWFpbnRhaW5lcjogRGFuIFdpbGxpYW1zIDxkYW4uai53aWxsaWFtc0BpbnRlbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zICAgID0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBpb3AxM3h4X21hcF9pbywKIAkuaW5pdF9pcnEgICAgICAgPSBpb3AxM3h4X2luaXRfaXJxLAogCS50aW1lciAgICAgICAgICA9ICZpcTgxMzQwc2NfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvcGNpLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvcGNpLmMKaW5kZXggMjUxYzQwOC4uZGIwMTJmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZW03MjEwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYwppbmRleCA2Y2JmZmJmLi40MzI1MDU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoRU03MjEwLCAiTGFubmVyIEVNNzIxMCIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVtNzIxMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaW9wMzJ4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZW03MjEwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmMKaW5kZXggY2VlZjVkNC4uMGVkYzg4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9nbGFudGFuay5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIAogTUFDSElORV9TVEFSVChHTEFOVEFOSywgIkdMQU4gVGFuayIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGdsYW50YW5rX21hcF9pbywKIAkuaW5pdF9pcnEJPSBpb3AzMnhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZnbGFudGFua190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZmY5ZTc2Yy4uMzYzYmRmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTExLDcgKzExLDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHhmZTAwMDAwMAlAIHBoeXNpY2FsIGFzIHdlbGwgYXMgdmlydHVhbAogCQlvcnIJXHJwLCBccnAsICMweDAwODAwMDAwCUAgbG9jYXRpb24gb2YgdGhlIFVBUlQKIAkJbW92CVxydiwgXHJwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OWNjMjMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICovCi0KLSNpZm5kZWYgX19NRU1PUllfSAotI2RlZmluZSBfX01FTU9SWV9ICi0KLS8qCi0gKiBQaHlzaWNhbCBEUkFNIG9mZnNldC4KLSAqLwotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4YTAwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jCmluZGV4IDNhNjI1MTQuLjllN2FhY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTMxMjQ0LmMKQEAgLTMxMyw3ICszMTMsNyBAQAogCiBNQUNISU5FX1NUQVJUKElRMzEyNDQsICJJbnRlbCBJUTMxMjQ0IikKIAkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLwotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBpcTMxMjQ0X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpb3AzMnhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpcTMxMjQ0X3RpbWVyLApAQCAtMzI3LDcgKzMyNyw3IEBACiAgKi8KIE1BQ0hJTkVfU1RBUlQoRVA4MDIxOSwgIkludGVsIEVQODAyMTkiKQogCS8qIE1haW50YWluZXI6IEludGVsIENvcnAuICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGlxMzEyNDRfbWFwX2lvLAogCS5pbml0X2lycQk9IGlvcDMyeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmlxMzEyNDRfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMKaW5kZXggMzViN2U2OS4uNTNlYTg2ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxODAzMjEuYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSVE4MDMyMSwgIkludGVsIElRODAzMjEiKQogCS8qIE1haW50YWluZXI6IEludGVsIENvcnAuICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGlxODAzMjFfbWFwX2lvLAogCS5pbml0X2lycQk9IGlvcDMyeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmlxODAzMjFfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwppbmRleCAxYTM3NGVhLi5kNzI2OTI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKQEAgLTMyNyw3ICszMjcsNyBAQAogCiBNQUNISU5FX1NUQVJUKE4yMTAwLCAiVGhlY3VzIE4yMTAwIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gbjIxMDBfbWFwX2lvLAogCS5pbml0X2lycQk9IGlvcDMyeF9pbml0X2lycSwKIAkudGltZXIJCT0gJm4yMTAwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA0MGM1MDBkLi4zNjFiZTFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweDAwZmYwMDAwCiAJCW9ycglccnAsIFxycCwgIzB4MDAwMGY3MDAKIAkJb3JyCVxydiwgIzB4ZmUwMDAwMDAJQCB2aXJ0dWFsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMWRhZjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtaW9wMzN4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICovCi0KLSNpZm5kZWYgX19NRU1PUllfSAotI2RlZmluZSBfX01FTU9SWV9ICi0KLS8qCi0gKiBQaHlzaWNhbCBEUkFNIG9mZnNldC4KLSAqLwotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMS5jCmluZGV4IDYzN2MwMjcuLjllMTRjY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzEuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMxLmMKQEAgLTE0MSw3ICsxNDEsNyBAQAogCiBNQUNISU5FX1NUQVJUKElRODAzMzEsICJJbnRlbCBJUTgwMzMxIikKIAkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBpb3AzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGlvcDMzeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmlxODAzMzFfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMyLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMyLmMKaW5kZXggOTBhMDQzNi4uMDljODk5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzIuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSVE4MDMzMiwgIkludGVsIElRODAzMzIiKQogCS8qIE1haW50YWluZXI6IEludGVsIENvcnAuICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGlvcDN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaW9wMzN4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXE4MDMzMl90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCmluZGV4IDQwNjgxNjYuLjI0ZjBmZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYwpAQCAtMTMsNyArMTMsNyBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IAogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC0zOSw3ICs0MCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWl4cDIwMDAuaD4KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhpeHAyMDAwX3Nsb3dwb3J0X2xvY2spOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaXhwMjAwMF9zbG93cG9ydF9pcnFfZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwppbmRleCA2MmM2MGFkLi5hZjk5OTQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKQEAgLTI1NCw3ICsyNTQsNyBAQAogCiBNQUNISU5FX1NUQVJUKEVOUDI2MTEsICJSYWRpc3lzIEVOUC0yNjExIFBDSSBuZXR3b3JrIHByb2Nlc3NvciBib2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVucDI2MTFfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDIwMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlbnAyNjExX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDBlZjUzM2IuLmJkZDNjY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTExLDcgKzExLDcgQEAKICAqCiAqLwogCi0JCS5tYWNybyAgYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8gIGFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHgwMDAzMDAwMAogI2lmZGVmCV9fQVJNRUJfXwogCQlvcnIJXHJwLCBccnAsICMweDAwMDAwMDAzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2dwaW8taXhwMjAwMC5oIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9ncGlvLWl4cDIwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjgzNmM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9ncGlvLWl4cDIwMDAuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUsIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogSVhQMjAwMCBHUElPIGluL291dCwgZWRnZS9sZXZlbCBkZXRlY3Rpb24gZm9yIElSUXM6CisgKiBJUlFzIGFyZSBnZW5lcmF0ZWQgb24gRmFsbGluZy1lZGdlLCBSaXNpbmctRWRnZSwgTGV2ZWwtbG93LCBMZXZlbC1IaWdoCisgKiBvciBib3RoIEZhbGxpbmctZWRnZSBhbmQgUmlzaW5nLWVkZ2UuCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkICpiZWZvcmUqIHRoZSBjb3JyZXNwb25kaW5nIElSUSBpcyByZWdpc3RlcmQuCisgKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGRpcmVjdGx5IHNldHRpbmcgdGhlIEdQSU8gcmVnaXN0ZXJzLgorICogR1BJT3MgbWF5IGFsc28gYmUgdXNlZCBhcyBHUElPcyAoZS5nLiBmb3IgZW11bGF0aW5nIGkyYy9zbWIpCisgKi8KKyNpZm5kZWYgX19BU01fQVJDSF9HUElPX0gKKyNkZWZpbmUgX19BU01fQVJDSF9HUElPX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2RlZmluZSBHUElPX0lOCQkJCTAKKyNkZWZpbmUgR1BJT19PVVQJCQkxCisKKyNkZWZpbmUgSVhQMjAwMF9HUElPX0xPVwkJMAorI2RlZmluZSBJWFAyMDAwX0dQSU9fSElHSAkJMQorCitleHRlcm4gdm9pZCBncGlvX2xpbmVfY29uZmlnKGludCBsaW5lLCBpbnQgZGlyZWN0aW9uKTsKKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19saW5lX2dldChpbnQgbGluZSkKK3sKKwlyZXR1cm4gKCgoKklYUDIwMDBfR1BJT19QTFIpID4+IGxpbmUpICYgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2xpbmVfc2V0KGludCBsaW5lLCBpbnQgdmFsdWUpCit7CisJaWYgKHZhbHVlID09IElYUDIwMDBfR1BJT19ISUdIKSB7CisJCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19QT1NSLCAxIDw8IGxpbmUpOworCX0gZWxzZSBpZiAodmFsdWUgPT0gSVhQMjAwMF9HUElPX0xPVykgeworCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fUE9DUiwgMSA8PCBsaW5lKTsKKwl9Cit9CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBBU01fQVJDSF9JWFAyMDAwX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODhkMmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUsIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotLyoKLSAqIElYUDIwMDAgR1BJTyBpbi9vdXQsIGVkZ2UvbGV2ZWwgZGV0ZWN0aW9uIGZvciBJUlFzOgotICogSVJRcyBhcmUgZ2VuZXJhdGVkIG9uIEZhbGxpbmctZWRnZSwgUmlzaW5nLUVkZ2UsIExldmVsLWxvdywgTGV2ZWwtSGlnaAotICogb3IgYm90aCBGYWxsaW5nLWVkZ2UgYW5kIFJpc2luZy1lZGdlLiAgCi0gKiBUaGlzIG11c3QgYmUgY2FsbGVkICpiZWZvcmUqIHRoZSBjb3JyZXNwb25kaW5nIElSUSBpcyByZWdpc3RlcmQuCi0gKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGRpcmVjdGx5IHNldHRpbmcgdGhlIEdQSU8gcmVnaXN0ZXJzLgotICogR1BJT3MgbWF5IGFsc28gYmUgdXNlZCBhcyBHUElPcyAoZS5nLiBmb3IgZW11bGF0aW5nIGkyYy9zbWIpCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9HUElPX0gKLSNkZWZpbmUgX19BU01fQVJDSF9HUElPX0gKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotI2RlZmluZSBHUElPX0lOCQkJCTAKLSNkZWZpbmUgR1BJT19PVVQJCQkxCi0KLSNkZWZpbmUgSVhQMjAwMF9HUElPX0xPVwkJMAotI2RlZmluZSBJWFAyMDAwX0dQSU9fSElHSAkJMQotCi1leHRlcm4gdm9pZCBncGlvX2xpbmVfY29uZmlnKGludCBsaW5lLCBpbnQgZGlyZWN0aW9uKTsKLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19saW5lX2dldChpbnQgbGluZSkKLXsKLQlyZXR1cm4gKCgoKklYUDIwMDBfR1BJT19QTFIpID4+IGxpbmUpICYgMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2xpbmVfc2V0KGludCBsaW5lLCBpbnQgdmFsdWUpCi17Ci0JaWYgKHZhbHVlID09IElYUDIwMDBfR1BJT19ISUdIKSB7Ci0JCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19QT1NSLCAxIDw8IGxpbmUpOwotCX0gZWxzZSBpZiAodmFsdWUgPT0gSVhQMjAwMF9HUElPX0xPVykgewotCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fUE9DUiwgMSA8PCBsaW5lKTsKLQl9Ci19Ci0KLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0KLSNlbmRpZiAvKiBBU01fQVJDSF9JWFAyMDAwX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKaW5kZXggNWJhZDFhOC4uZjdkZmQ5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCiBNQUNISU5FX1NUQVJUKElYRFAyNDAwLCAiSW50ZWwgSVhEUDI0MDAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXhkcDJ4MDBfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4ZHAyNDAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhkcDI0MDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCmluZGV4IDNkM2NlZjguLmQzM2JjYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAogTUFDSElORV9TVEFSVChJWERQMjgwMCwgIkludGVsIElYRFAyODAwIERldmVsb3BtZW50IFBsYXRmb3JtIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGl4ZHAyeDAwX21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeGRwMjgwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4ZHAyODAwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYwppbmRleCAyMzU2MzhmLi42MzRiNmM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYwpAQCAtMTQsNiArMTQsNyBAQAogICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgogICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC00MCw4ICs0MSw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLQorI2luY2x1ZGUgPG1hY2gvZ3Bpby1peHAyMDAwLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJWERQMngwMCBJUlEgSW5pdGlhbGl6YXRpb24KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKaW5kZXggYmUyYTI1NC4uNjFhMjg2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKQEAgLTQxNyw3ICs0MTcsNyBAQAogI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyNDAxCiBNQUNISU5FX1NUQVJUKElYRFAyNDAxLCAiSW50ZWwgSVhEUDI0MDEgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXhkcDJ4MDFfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4ZHAyeDAxX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhkcDJ4MDFfdGltZXIsCkBAIC00MjgsNyArNDI4LDcgQEAKICNpZmRlZiBDT05GSUdfQVJDSF9JWERQMjgwMQogTUFDSElORV9TVEFSVChJWERQMjgwMSwgIkludGVsIElYRFAyODAxIERldmVsb3BtZW50IFBsYXRmb3JtIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGl4ZHAyeDAxX21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeGRwMngwMV9pbml0X2lycSwKIAkudGltZXIJCT0gJml4ZHAyeDAxX3RpbWVyLApAQCAtNDQxLDcgKzQ0MSw3IEBACiAgKi8KIE1BQ0hJTkVfU1RBUlQoSVhEUDI4WDUsICJJbnRlbCBJWERQMjgwNS8yODU1IERldmVsb3BtZW50IFBsYXRmb3JtIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGl4ZHAyeDAxX21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeGRwMngwMV9pbml0X2lycSwKIAkudGltZXIJCT0gJml4ZHAyeDAxX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2VzcHJlc3NvLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvZXNwcmVzc28uYwppbmRleCBlMjVlNWZlLi4zMGRkMzE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvZXNwcmVzc28uYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvZXNwcmVzc28uYwpAQCAtODgsNiArODgsNiBAQAogCS5tYXBfaW8JCT0gaXhwMjN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwMjN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDIzeHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZXNwcmVzc29faW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZjdjNmVlZi4uNWZmNTI0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTIsNyArMTIsNyBAQAogICovCiAjaW5jbHVkZSA8bWFjaC9peHAyM3h4Lmg+CiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQlsZHIJXHJwLCA9SVhQMjNYWF9QRVJJUEhFUkFMX1BIWVMgCUAgcGh5c2ljYWwKIAkJbGRyCVxydiwgPUlYUDIzWFhfUEVSSVBIRVJBTF9WSVJUCUAgdmlydHVhbAogI2lmZGVmIF9fQVJNRUJfXwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2l4ZHAyMzUxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwppbmRleCBlYzAyOGUzLi5iM2E1N2UwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwpAQCAtMzMxLDYgKzMzMSw2IEBACiAJLm1hcF9pbwkJPSBpeGRwMjM1MV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhkcDIzNTFfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHAyM3h4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGl4ZHAyMzUxX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9yb2FkcnVubmVyLmMKaW5kZXggODQ0NTUxZC4uOGY0ZGNiYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcm9hZHJ1bm5lci5jCkBAIC0xNzUsNiArMTc1LDYgQEAKIAkubWFwX2lvCQk9IGl4cDIzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDIzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHAyM3h4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHJvYWRydW5uZXJfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvS2NvbmZpZwppbmRleCA2Zjk5MWM1Li5mZDVlN2I2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWcKQEAgLTE3OSw2ICsxNzksMjUgQEAKIAkJIkhpZ2ggU3BlZWQiIFVBUlQgaXMgbi9jIChhcyBmYXIgYXMgSSBjYW4gdGVsbCkKIAkJMjAgUGluIEFSTS9Yc2NhbGUgSlRBRyBpbnRlcmZhY2Ugb24gSjIKIAorY29uZmlnIE1BQ0hfREVWSVhQCisJYm9vbCAiT21pY3JvbiBERVZJWFAiCisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlIERFVklYUAorCSAgYm9hcmQgZnJvbSBPTUlDUk9OIGVsZWN0cm9uaWNzIEdtYkguCisKK2NvbmZpZyBNQUNIX01JQ0NQVAorCWJvb2wgIk9taWNyb24gTUlDQ1BUIgorCXNlbGVjdCBQQ0kKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgTUlDQ1BUCisJICBib2FyZCBmcm9tIE9NSUNST04gZWxlY3Ryb25pY3MgR21iSC4KKworY29uZmlnIE1BQ0hfTUlDMjU2CisJYm9vbCAiT21pY3JvbiBNSUMyNTYiCisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlIE1JQzI1NgorCSAgYm9hcmQgZnJvbSBPTUlDUk9OIGVsZWN0cm9uaWNzIEdtYkguCisKIGNvbW1lbnQgIklYUDR4eCBPcHRpb25zIgogCiBjb25maWcgSVhQNFhYX0lORElSRUNUX1BDSQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9NYWtlZmlsZQppbmRleCBkODA3ZmMzLi5lZGVkOTRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogb2JqLXBjaS0kKENPTkZJR19NQUNIX0lYRFBHNDI1KQkJKz0gaXhkcGc0MjUtcGNpLm8KIG9iai1wY2ktJChDT05GSUdfQVJDSF9BRElfQ09ZT1RFKQkrPSBjb3lvdGUtcGNpLm8KIG9iai1wY2ktJChDT05GSUdfTUFDSF9HVFdYNTcxNSkJCSs9IGd0d3g1NzE1LXBjaS5vCitvYmotcGNpLSQoQ09ORklHX01BQ0hfTUlDQ1BUKQkJKz0gbWljY3B0LXBjaS5vCiBvYmotcGNpLSQoQ09ORklHX01BQ0hfTlNMVTIpCQkrPSBuc2x1Mi1wY2kubwogb2JqLXBjaS0kKENPTkZJR19NQUNIX05BUzEwMEQpCQkrPSBuYXMxMDBkLXBjaS5vCiBvYmotcGNpLSQoQ09ORklHX01BQ0hfRFNNRzYwMCkJCSs9IGRzbWc2MDAtcGNpLm8KQEAgLTI1LDYgKzI2LDkgQEAKIG9iai0kKENPTkZJR19NQUNIX0lYRFBHNDI1KQkrPSBjb3lvdGUtc2V0dXAubwogb2JqLSQoQ09ORklHX0FSQ0hfQURJX0NPWU9URSkJKz0gY295b3RlLXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX0dUV1g1NzE1KQkrPSBndHd4NTcxNS1zZXR1cC5vCitvYmotJChDT05GSUdfTUFDSF9ERVZJWFApCSs9IG9taXhwLXNldHVwLm8KK29iai0kKENPTkZJR19NQUNIX01JQ0NQVCkJKz0gb21peHAtc2V0dXAubworb2JqLSQoQ09ORklHX01BQ0hfTUlDMjU2KQkrPSBvbWl4cC1zZXR1cC5vCiBvYmotJChDT05GSUdfTUFDSF9OU0xVMikJKz0gbnNsdTItc2V0dXAubwogb2JqLSQoQ09ORklHX01BQ0hfTkFTMTAwRCkJKz0gbmFzMTAwZC1zZXR1cC5vCiBvYmotJChDT05GSUdfTUFDSF9EU01HNjAwKSAgICAgICs9IGRzbWc2MDAtc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXNldHVwLmMKaW5kZXggZWUxOWMxZC4uMzc2MDlhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9hdmlsYS1zZXR1cC5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gYXZpbGFfaW5pdCwKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiAJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCkBAIC0xODUsNyArMTg1LDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gYXZpbGFfaW5pdCwKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiAJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKaW5kZXggZjcyYTNhOC4uODMyNTA1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCmluZGV4IDA3NzcyNTcuLmI4NmEwMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwppbmRleCBlMjQ1NjRiLi44MWRmZWMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGNveW90ZV9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKQEAgLTEzMCw3ICsxMzAsNyBAQAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBjb3lvdGVfaW5pdCwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtc2V0dXAuYwppbmRleCAwM2U1NDUxLi44ODM3ZmJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1zZXR1cC5jCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBBdXRob3I6IFJvZCBXaGl0YnkgPHJvZEB3aGl0YnkuaWQuYXU+CiAgKiBNYWludGFpbmVyczogaHR0cDovL3d3dy5uc2x1Mi1saW51eC5vcmcvCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2RlZmluZSBEU01HNjAwX1NEQV9QSU4JCTUKICNkZWZpbmUgRFNNRzYwMF9TQ0xfUElOCQk0CkBAIC0yNzksNyArMjc4LDcgQEAKIAogTUFDSElORV9TVEFSVChEU01HNjAwLCAiRC1MaW5rIERTTS1HNjAwIFJldkEiKQogCS8qIE1haW50YWluZXI6IHd3dy5uc2x1Mi1saW51eC5vcmcgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJmRzbWc2MDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1zZXR1cC5jCmluZGV4IDIzYThiMzYuLjI4ODdjMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1zZXR1cC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBNYWludGFpbmVyczogaHR0cDovL3d3dy5uc2x1Mi1saW51eC5vcmcvCiAgKgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNkZWZpbmUgRlNHX1NEQV9QSU4JCTEyCiAjZGVmaW5lIEZTR19TQ0xfUElOCQkxMwpAQCAtMjczLDcgKzI3Miw3IEBACiAJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGZzZ19pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dhdGV3YXk3MDAxLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9nYXRld2F5NzAwMS1zZXR1cC5jCmluZGV4IGQ0Zjg1MWIuLmQ2OWQxYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dhdGV3YXk3MDAxLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtc2V0dXAuYwpAQCAtOTksNyArOTksNyBAQAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBnYXRld2F5NzAwMV9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYwppbmRleCA3NTQ4ZDlhLi5iZjY2NzhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9nb3JhbW9fbWxyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jCkBAIC00OTksNyArNDk5LDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZ21scl9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCmluZGV4IDM3OTBkZmYuLmFhMDI5ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGd0d3g1NzE1X2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBiOTc0YTQ5Li44YzlmOGQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTAsNyArMTAsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCi0gICAgICAgICAgICAgICAgLm1hY3JvICBhZGRydWFydCwgcnAsIHJ2CisgICAgICAgICAgICAgICAgLm1hY3JvICBhZGRydWFydCwgcnAsIHJ2LCB0bXAKICNpZmRlZiBfX0FSTUVCX18KICAgICAgICAgICAgICAgICBtb3YgICAgIFxycCwgIzMgICAgICAgICBAIFVhcnQgcmVncyBhcmUgYXQgb2ZmIHNldCBvZiAzIGlmCiAJCQkJCUAgYnl0ZSB3cml0ZXMgdXNlZCAtIEJpZyBFbmRpYW4uCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBhNWY4N2RlLi44M2Q2YjRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKKyNkZWZpbmUgX19BUk1fR1BJT0xJQl9DT01QTEVYCisKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKIHsKIAlyZXR1cm4gMDsKQEAgLTcwLDYgKzcyLDcgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CQkJLyogY2Fuc2xlZXAgd3JhcHBlcnMgKi8KIAogZXh0ZXJuIGludCBncGlvX3RvX2lycShpbnQgZ3Bpbyk7CisjZGVmaW5lIGdwaW9fdG9faXJxIGdwaW9fdG9faXJxCiBleHRlcm4gaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhZjE3Ni4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAppbmRleCAyMTlkN2MxLi5lYjk0NWE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTQxLDcgKzQxLDggQEAKIAkgKiBTb21lIGJvYXJkcyBhcmUgdXNpbmcgVUFSVDIgYXMgY29uc29sZQogCSAqLwogCWlmIChtYWNoaW5lX2lzX2FkaV9jb3lvdGUoKSB8fCBtYWNoaW5lX2lzX2d0d3g1NzE1KCkgfHwKLQkJCSBtYWNoaW5lX2lzX2dhdGV3YXk3MDAxKCkgfHwgbWFjaGluZV9pc193ZzMwMnYyKCkpCisJICAgIG1hY2hpbmVfaXNfZ2F0ZXdheTcwMDEoKSB8fCBtYWNoaW5lX2lzX3dnMzAydjIoKSB8fAorCSAgICBtYWNoaW5lX2lzX2Rldml4cCgpIHx8IG1hY2hpbmVfaXNfbWljY3B0KCkgfHwgbWFjaGluZV9pc19taWMyNTYoKSkKIAkJdWFydF9iYXNlID0gKHZvbGF0aWxlIHUzMiopIElYUDRYWF9VQVJUMl9CQVNFX1BIWVM7CiAJZWxzZQogCQl1YXJ0X2Jhc2UgPSAodm9sYXRpbGUgdTMyKikgSVhQNFhYX1VBUlQxX0JBU0VfUEhZUzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYwppbmRleCA2YTI5Mjc5Li5mMjM1ZjgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gaXhkcDQyNV9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKQEAgLTI3MCw3ICsyNzAsNyBAQAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBpeGRwNDI1X2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApAQCAtMjg0LDcgKzI4NCw3IEBACiAJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGl4ZHA0MjVfaW5pdCwKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiAJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCkBAIC0yOTgsNyArMjk4LDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gaXhkcDQyNV9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L21pY2NwdC1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L21pY2NwdC1wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTBiYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbWljY3B0LXBjaS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWl4cDR4eC9taWNjcHQtcGNpLmMKKyAqCisgKiBNSUNDUFQgYm9hcmQtbGV2ZWwgUENJIGluaXRpYWxpemF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA2IE9NSUNST04gZWxlY3Ryb25pY3MgR21iSAorICoKKyAqIEF1dGhvcjogTWljaGFlbCBKb2NodW0gPG1pY2hhZWwuam9jaHVtQG9taWNyb24uYXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2RlZmluZSBNQVhfREVWCQk0CisjZGVmaW5lIElSUV9MSU5FUwk0CisKKy8qIFBDSSBjb250cm9sbGVyIEdQSU8gdG8gSVJRIHBpbiBtYXBwaW5ncyAqLworI2RlZmluZSBJTlRBCQkxCisjZGVmaW5lIElOVEIJCTIKKyNkZWZpbmUgSU5UQwkJMworI2RlZmluZSBJTlRECQk0CisKKwordm9pZCBfX2luaXQgbWljY3B0X3BjaV9wcmVpbml0KHZvaWQpCit7CisJaXJxX3NldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5UQSksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJaXJxX3NldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5UQiksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJaXJxX3NldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5UQyksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJaXJxX3NldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5URCksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJaXhwNHh4X3BjaV9wcmVpbml0KCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1pY2NwdF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbSVJRX0xJTkVTXSA9IHsKKwkJSVhQNFhYX0dQSU9fSVJRKElOVEEpLAorCQlJWFA0WFhfR1BJT19JUlEoSU5UQiksCisJCUlYUDRYWF9HUElPX0lSUShJTlRDKSwKKwkJSVhQNFhYX0dQSU9fSVJRKElOVEQpCisJfTsKKworCWlmIChzbG90ID49IDEgJiYgc2xvdCA8PSBNQVhfREVWICYmIHBpbiA+PSAxICYmIHBpbiA8PSBJUlFfTElORVMpCisJCXJldHVybiBwY2lfaXJxX3RhYmxlWyhzbG90ICsgcGluIC0gMikgJSA0XTsKKworCXJldHVybiAtMTsKK30KKworc3RydWN0IGh3X3BjaSBtaWNjcHRfcGNpIF9faW5pdGRhdGEgPSB7CisJLm5yX2NvbnRyb2xsZXJzID0gMSwKKwkucHJlaW5pdAk9IG1pY2NwdF9wY2lfcHJlaW5pdCwKKwkuc3dpenpsZQk9IHBjaV9zdGRfc3dpenpsZSwKKwkuc2V0dXAJCT0gaXhwNHh4X3NldHVwLAorCS5zY2FuCQk9IGl4cDR4eF9zY2FuX2J1cywKKwkubWFwX2lycQk9IG1pY2NwdF9tYXBfaXJxLAorfTsKKworaW50IF9faW5pdCBtaWNjcHRfcGNpX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19taWNjcHQoKSkKKwkJcGNpX2NvbW1vbl9pbml0KCZtaWNjcHRfcGNpKTsKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKG1pY2NwdF9wY2lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMKaW5kZXggYWZiNTE4Ny4uZGU3MTZmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYwpAQCAtMTcsNyArMTcsNyBAQAogICogTWFpbnRhaW5lcnM6IGh0dHA6Ly93d3cubnNsdTItbGludXgub3JnLwogICoKICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2RlZmluZSBOQVMxMDBEX1NEQV9QSU4JCTUKICNkZWZpbmUgTkFTMTAwRF9TQ0xfUElOCQk2CkBAIC0zMTQsNyArMzEzLDcgQEAKIAogTUFDSElORV9TVEFSVChOQVMxMDBELCAiSW9tZWdhIE5BUyAxMDBkIikKIAkvKiBNYWludGFpbmVyOiB3d3cubnNsdTItbGludXgub3JnICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lciAgICAgICAgICA9ICZpeHA0eHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYwppbmRleCA2OWU0MGYyLi5hYzgxY2NiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqIE1haW50YWluZXJzOiBodHRwOi8vd3d3Lm5zbHUyLWxpbnV4Lm9yZy8KICAqCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAjZGVmaW5lIE5TTFUyX1NEQV9QSU4JCTcKICNkZWZpbmUgTlNMVTJfU0NMX1BJTgkJNgpAQCAtMzAwLDcgKzI5OSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTlNMVTIsICJMaW5rc3lzIE5TTFUyIikKIAkvKiBNYWludGFpbmVyOiB3d3cubnNsdTItbGludXgub3JnICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lciAgICAgICAgICA9ICZuc2x1Ml90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L29taXhwLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9vbWl4cC1zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNmE4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9vbWl4cC1zZXR1cC5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1peHA0eHgvb21peHAtc2V0dXAuYworICoKKyAqIG9taWNyb24gaXhwNHh4IGJvYXJkIHNldHVwCisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwOSBPTUlDUk9OIGVsZWN0cm9uaWNzIEdtYkgKKyAqCisgKiBiYXNlZCBuc2x1Mi1zZXR1cC5jLCBpeGRwNDI1LXNldHVwLmM6CisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2lmZGVmIENPTkZJR19MRURTX0NMQVNTCisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvbWl4cF9mbGFzaF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBvbWl4cF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9CQkiUmVjb3ZlcnkgQm9vdGxvYWRlciIsCisJCS5zaXplID0JCTB4MDAwMjAwMDAsCisJCS5vZmZzZXQgPQkwLAorCX0sIHsKKwkJLm5hbWUgPQkJIkNhbGlicmF0aW9uIERhdGEiLAorCQkuc2l6ZSA9CQkweDAwMDIwMDAwLAorCQkub2Zmc2V0ID0JMHgwMDAyMDAwMCwKKwl9LCB7CisJCS5uYW1lID0JCSJSZWNvdmVyeSBGUEdBIiwKKwkJLnNpemUgPQkJMHgwMDAyMDAwMCwKKwkJLm9mZnNldCA9CTB4MDAwNDAwMDAsCisJfSwgeworCQkubmFtZSA9CQkiUmVsZWFzZSBCb290bG9hZGVyIiwKKwkJLnNpemUgPQkJMHgwMDAyMDAwMCwKKwkJLm9mZnNldCA9CTB4MDAwNjAwMDAsCisJfSwgeworCQkubmFtZSA9CQkiUmVsZWFzZSBGUEdBIiwKKwkJLnNpemUgPQkJMHgwMDAyMDAwMCwKKwkJLm9mZnNldCA9CTB4MDAwODAwMDAsCisJfSwgeworCQkubmFtZSA9CQkiS2VybmVsIiwKKwkJLnNpemUgPQkJMHgwMDE2MDAwMCwKKwkJLm9mZnNldCA9CTB4MDAwYTAwMDAsCisJfSwgeworCQkubmFtZSA9CQkiRmlsZXN5c3RlbSIsCisJCS5zaXplID0JCTB4MDBDMDAwMDAsCisJCS5vZmZzZXQgPQkweDAwMjAwMDAwLAorCX0sIHsKKwkJLm5hbWUgPQkJIlBlcnNpc3RlbnQgU3RvcmFnZSIsCisJCS5zaXplID0JCTB4MDAyMDAwMDAsCisJCS5vZmZzZXQgPQkweDAwRTAwMDAwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgb21peHBfZmxhc2hfZGF0YVtdID0geworCXsKKwkJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJCS5wYXJ0cwkJPSBvbWl4cF9wYXJ0aXRpb25zLAorCQkubnJfcGFydHMJPSBBUlJBWV9TSVpFKG9taXhwX3BhcnRpdGlvbnMpLAorCX0sIHsKKwkJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJCS5wYXJ0cwkJPSBOVUxMLAorCQkubnJfcGFydHMJPSAwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWl4cF9mbGFzaF9kZXZpY2VbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJJWFA0WFgtRmxhc2giLAorCQkuaWQJCT0gMCwKKwkJLmRldiA9IHsKKwkJCS5wbGF0Zm9ybV9kYXRhID0gJm9taXhwX2ZsYXNoX2RhdGFbMF0sCisJCX0sCisJCS5yZXNvdXJjZSA9ICZvbWl4cF9mbGFzaF9yZXNvdXJjZXNbMF0sCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJJWFA0WFgtRmxhc2giLAorCQkuaWQJCT0gMSwKKwkJLmRldiA9IHsKKwkJCS5wbGF0Zm9ybV9kYXRhID0gJm9taXhwX2ZsYXNoX2RhdGFbMV0sCisJCX0sCisJCS5yZXNvdXJjZSA9ICZvbWl4cF9mbGFzaF9yZXNvdXJjZXNbMV0sCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwl9LAorfTsKKworLyogU3dhcCBVQVJUJ3MgLSBUaGVzZSBib2FyZHMgaGF2ZSB0aGUgY29uc29sZSBvbiBVQVJUMi4gVGhlIGZvbGxvd2luZworICogY29uZmlndXJhdGlvbiBpcyB1c2VkOgorICogICAgICB0dHlTMCAuLiBVQVJUMgorICogICAgICB0dHlTMSAuLiBVQVJUMQorICogVGhpcyB3YXkgc3RhbmRhcmQgaW1hZ2VzIGNhbiBiZSB1c2VkIHdpdGggdGhlIGtlcm5lbCB0aGF0IGV4cGVjdAorICogdGhlIGNvbnNvbGUgb24gdHR5UzAuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb21peHBfdWFydF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTLAorCQkuZW5kCQk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMgKyAweDBmZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydAkJPSBJWFA0WFhfVUFSVDFfQkFTRV9QSFlTLAorCQkuZW5kCQk9IElYUDRYWF9VQVJUMV9CQVNFX1BIWVMgKyAweDBmZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBvbWl4cF91YXJ0X2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gSVhQNFhYX1VBUlQyX0JBU0VfUEhZUywKKwkJLm1lbWJhc2UJPSAoY2hhciAqKUlYUDRYWF9VQVJUMl9CQVNFX1ZJUlQgKyBSRUdfT0ZGU0VULAorCQkuaXJxCQk9IElSUV9JWFA0WFhfVUFSVDIsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gSVhQNFhYX1VBUlRfWFRBTCwKKwl9LCB7CisJCS5tYXBiYXNlCT0gSVhQNFhYX1VBUlQxX0JBU0VfUEhZUywKKwkJLm1lbWJhc2UJPSAoY2hhciAqKUlYUDRYWF9VQVJUMV9CQVNFX1ZJUlQgKyBSRUdfT0ZGU0VULAorCQkuaXJxCQk9IElSUV9JWFA0WFhfVUFSVDEsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gSVhQNFhYX1VBUlRfWFRBTCwKKwl9LCB7CisJCS8qIGxpc3QgdGVybWluYXRpb24gKi8KKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWl4cF91YXJ0ID0geworCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gb21peHBfdWFydF9kYXRhLAorCS5udW1fcmVzb3VyY2VzCQk9IDIsCisJLnJlc291cmNlCQk9IG9taXhwX3VhcnRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBtaWMyNTZfbGVkX3BpbnNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJMRUQtQSIsCisJCS5ncGlvCQk9IDcsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBtaWMyNTZfbGVkX2RhdGEgPSB7CisJLm51bV9sZWRzCQk9IEFSUkFZX1NJWkUobWljMjU2X2xlZF9waW5zKSwKKwkubGVkcwkJCT0gbWljMjU2X2xlZF9waW5zLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWljMjU2X2xlZHMgPSB7CisJLm5hbWUJCQk9ICJsZWRzLWdwaW8iLAorCS5pZAkJCT0gLTEsCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJm1pYzI1Nl9sZWRfZGF0YSwKK307CisKKy8qIEJ1aWx0LWluIDEwLzEwMCBFdGhlcm5ldCBNQUMgaW50ZXJmYWNlcyAqLworc3RhdGljIHN0cnVjdCBldGhfcGxhdF9pbmZvIGl4ZHA0MjVfcGxhdF9ldGhbXSA9IHsKKwl7CisJCS5waHkJCT0gMCwKKwkJLnJ4cQkJPSAzLAorCQkudHhyZWFkeXEJPSAyMCwKKwl9LCB7CisJCS5waHkJCT0gMSwKKwkJLnJ4cQkJPSA0LAorCQkudHhyZWFkeXEJPSAyMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaXhkcDQyNV9ldGhbXSA9IHsKKwl7CisJCS5uYW1lCQkJPSAiaXhwNHh4X2V0aCIsCisJCS5pZAkJCT0gSVhQNFhYX0VUSF9OUEVCLAorCQkuZGV2LnBsYXRmb3JtX2RhdGEJPSBpeGRwNDI1X3BsYXRfZXRoLAorCX0sIHsKKwkJLm5hbWUJCQk9ICJpeHA0eHhfZXRoIiwKKwkJLmlkCQkJPSBJWFA0WFhfRVRIX05QRUMsCisJCS5kZXYucGxhdGZvcm1fZGF0YQk9IGl4ZHA0MjVfcGxhdF9ldGggKyAxLAorCX0sCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpeHBfcGxkZXZbXSBfX2luaXRkYXRhID0geworCSZvbWl4cF91YXJ0LAorCSZvbWl4cF9mbGFzaF9kZXZpY2VbMF0sCisJJml4ZHA0MjVfZXRoWzBdLAorCSZpeGRwNDI1X2V0aFsxXSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptaWMyNTZfcGxkZXZbXSBfX2luaXRkYXRhID0geworCSZvbWl4cF91YXJ0LAorCSZvbWl4cF9mbGFzaF9kZXZpY2VbMF0sCisJJm1pYzI1Nl9sZWRzLAorCSZpeGRwNDI1X2V0aFswXSwKKwkmaXhkcDQyNV9ldGhbMV0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWljY3B0X3BsZGV2W10gX19pbml0ZGF0YSA9IHsKKwkmb21peHBfdWFydCwKKwkmb21peHBfZmxhc2hfZGV2aWNlWzBdLAorCSZvbWl4cF9mbGFzaF9kZXZpY2VbMV0sCisJJml4ZHA0MjVfZXRoWzBdLAorCSZpeGRwNDI1X2V0aFsxXSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWl4cF9pbml0KHZvaWQpCit7CisJaXhwNHh4X3N5c19pbml0KCk7CisKKwkvKiAxNk1pQiBCb290IEZsYXNoICovCisJb21peHBfZmxhc2hfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gSVhQNFhYX0VYUF9CVVNfQkFTRSgwKTsKKwlvbWl4cF9mbGFzaF9yZXNvdXJjZXNbMF0uZW5kICAgPSBJWFA0WFhfRVhQX0JVU19FTkQoMCk7CisKKwkvKiAzMiBNaUIgRGF0YSBGbGFzaCAqLworCW9taXhwX2ZsYXNoX3Jlc291cmNlc1sxXS5zdGFydCA9IElYUDRYWF9FWFBfQlVTX0JBU0UoMik7CisJb21peHBfZmxhc2hfcmVzb3VyY2VzWzFdLmVuZCAgID0gSVhQNFhYX0VYUF9CVVNfRU5EKDIpOworCisJaWYgKG1hY2hpbmVfaXNfZGV2aXhwKCkpCisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldml4cF9wbGRldiwgQVJSQVlfU0laRShkZXZpeHBfcGxkZXYpKTsKKwllbHNlIGlmIChtYWNoaW5lX2lzX21pY2NwdCgpKQorCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhtaWNjcHRfcGxkZXYsIEFSUkFZX1NJWkUobWljY3B0X3BsZGV2KSk7CisJZWxzZSBpZiAobWFjaGluZV9pc19taWMyNTYoKSkKKwkJcGxhdGZvcm1fYWRkX2RldmljZXMobWljMjU2X3BsZGV2LCBBUlJBWV9TSVpFKG1pYzI1Nl9wbGRldikpOworfQorCisjaWZkZWYgQ09ORklHX01BQ0hfREVWSVhQCitNQUNISU5FX1NUQVJUKERFVklYUCwgIk9taWNyb24gREVWSVhQIikKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKKwkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAorCS50aW1lciAgICAgICAgICA9ICZpeHA0eHhfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IG9taXhwX2luaXQsCitNQUNISU5FX0VORAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDSF9NSUNDUFQKK01BQ0hJTkVfU1RBUlQoTUlDQ1BULCAiT21pY3JvbiBNSUNDUFQiKQorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAorCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCisJLnRpbWVyICAgICAgICAgID0gJml4cDR4eF90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gb21peHBfaW5pdCwKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCisjZW5kaWYKK01BQ0hJTkVfRU5ECisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX01JQzI1NgorTUFDSElORV9TVEFSVChNSUMyNTYsICJPbWljcm9uIE1JQzI1NiIpCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCisJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAorCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKKwkudGltZXIgICAgICAgICAgPSAmaXhwNHh4X3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBvbWl4cF9pbml0LAorTUFDSElORV9FTkQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvdnVsY2FuLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tc2V0dXAuYwppbmRleCAwNDUzMzZjLi4yN2U0NjllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tc2V0dXAuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHZ1bGNhbl9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L3dnMzAydjItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L3dnMzAydjItc2V0dXAuYwppbmRleCA0MGI5ZmFkLi5iMTQxNDRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC93ZzMwMnYyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvd2czMDJ2Mi1zZXR1cC5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gd2czMDJ2Ml9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY3B1aWRsZS5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jcHVpZGxlLmMKaW5kZXggZjY4ZDMzZi4uNzA4ODE4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jcHVpZGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jcHVpZGxlLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KICNpbmNsdWRlIDxtYWNoL2tpcmt3b29kLmg+CiAKQEAgLTMyLDE3ICszMywxOCBAQAogCiAvKiBBY3R1YWwgY29kZSB0aGF0IHB1dHMgdGhlIFNvQyBpbiBkaWZmZXJlbnQgaWRsZSBzdGF0ZXMgKi8KIHN0YXRpYyBpbnQga2lya3dvb2RfZW50ZXJfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCisJCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkgICAgICAgaW50IGluZGV4KQogewogCXN0cnVjdCB0aW1ldmFsIGJlZm9yZSwgYWZ0ZXI7CiAJaW50IGlkbGVfdGltZTsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJZG9fZ2V0dGltZW9mZGF5KCZiZWZvcmUpOwotCWlmIChzdGF0ZSA9PSAmZGV2LT5zdGF0ZXNbMF0pCisJaWYgKGluZGV4ID09IDApCiAJCS8qIFdhaXQgZm9yIGludGVycnVwdCBzdGF0ZSAqLwogCQljcHVfZG9faWRsZSgpOwotCWVsc2UgaWYgKHN0YXRlID09ICZkZXYtPnN0YXRlc1sxXSkgeworCWVsc2UgaWYgKGluZGV4ID09IDEpIHsKIAkJLyoKIAkJICogRm9sbG93aW5nIHdyaXRlIHdpbGwgcHV0IEREUiBpbiBzZWxmIHJlZnJlc2guCiAJCSAqIE5vdGUgdGhhdCB3ZSBoYXZlIDI1NiBjeWNsZXMgYmVmb3JlIEREUiBwdXRzIGl0CkBAIC01NywzNSArNTksNDAgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJaWRsZV90aW1lID0gKGFmdGVyLnR2X3NlYyAtIGJlZm9yZS50dl9zZWMpICogVVNFQ19QRVJfU0VDICsKIAkJCShhZnRlci50dl91c2VjIC0gYmVmb3JlLnR2X3VzZWMpOwotCXJldHVybiBpZGxlX3RpbWU7CisKKwkvKiBVcGRhdGUgbGFzdCByZXNpZGVuY3kgKi8KKwlkZXYtPmxhc3RfcmVzaWRlbmN5ID0gaWRsZV90aW1lOworCisJcmV0dXJuIGluZGV4OwogfQogCiAvKiBJbml0aWFsaXplIENQVSBpZGxlIGJ5IHJlZ2lzdGVyaW5nIHRoZSBpZGxlIHN0YXRlcyAqLwogc3RhdGljIGludCBraXJrd29vZF9pbml0X2NwdWlkbGUodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldmljZTsKLQotCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZraXJrd29vZF9pZGxlX2RyaXZlcik7CisJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcml2ZXIgPSAma2lya3dvb2RfaWRsZV9kcml2ZXI7CiAKIAlkZXZpY2UgPSAmcGVyX2NwdShraXJrd29vZF9jcHVpZGxlX2RldmljZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlkZXZpY2UtPnN0YXRlX2NvdW50ID0gS0lSS1dPT0RfTUFYX1NUQVRFUzsKKwlkcml2ZXItPnN0YXRlX2NvdW50ID0gS0lSS1dPT0RfTUFYX1NUQVRFUzsKIAogCS8qIFdhaXQgZm9yIGludGVycnVwdCBzdGF0ZSAqLwotCWRldmljZS0+c3RhdGVzWzBdLmVudGVyID0ga2lya3dvb2RfZW50ZXJfaWRsZTsKLQlkZXZpY2UtPnN0YXRlc1swXS5leGl0X2xhdGVuY3kgPSAxOwotCWRldmljZS0+c3RhdGVzWzBdLnRhcmdldF9yZXNpZGVuY3kgPSAxMDAwMDsKLQlkZXZpY2UtPnN0YXRlc1swXS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOwotCXN0cmNweShkZXZpY2UtPnN0YXRlc1swXS5uYW1lLCAiV0ZJIik7Ci0Jc3RyY3B5KGRldmljZS0+c3RhdGVzWzBdLmRlc2MsICJXYWl0IGZvciBpbnRlcnJ1cHQiKTsKKwlkcml2ZXItPnN0YXRlc1swXS5lbnRlciA9IGtpcmt3b29kX2VudGVyX2lkbGU7CisJZHJpdmVyLT5zdGF0ZXNbMF0uZXhpdF9sYXRlbmN5ID0gMTsKKwlkcml2ZXItPnN0YXRlc1swXS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwMDA7CisJZHJpdmVyLT5zdGF0ZXNbMF0uZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKKwlzdHJjcHkoZHJpdmVyLT5zdGF0ZXNbMF0ubmFtZSwgIldGSSIpOworCXN0cmNweShkcml2ZXItPnN0YXRlc1swXS5kZXNjLCAiV2FpdCBmb3IgaW50ZXJydXB0Iik7CiAKIAkvKiBXYWl0IGZvciBpbnRlcnJ1cHQgYW5kIEREUiBzZWxmIHJlZnJlc2ggc3RhdGUgKi8KLQlkZXZpY2UtPnN0YXRlc1sxXS5lbnRlciA9IGtpcmt3b29kX2VudGVyX2lkbGU7Ci0JZGV2aWNlLT5zdGF0ZXNbMV0uZXhpdF9sYXRlbmN5ID0gMTA7Ci0JZGV2aWNlLT5zdGF0ZXNbMV0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOwotCWRldmljZS0+c3RhdGVzWzFdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7Ci0Jc3RyY3B5KGRldmljZS0+c3RhdGVzWzFdLm5hbWUsICJERFIgU1IiKTsKLQlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMV0uZGVzYywgIldGSSBhbmQgRERSIFNlbGYgUmVmcmVzaCIpOworCWRyaXZlci0+c3RhdGVzWzFdLmVudGVyID0ga2lya3dvb2RfZW50ZXJfaWRsZTsKKwlkcml2ZXItPnN0YXRlc1sxXS5leGl0X2xhdGVuY3kgPSAxMDsKKwlkcml2ZXItPnN0YXRlc1sxXS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwMDA7CisJZHJpdmVyLT5zdGF0ZXNbMV0uZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKKwlzdHJjcHkoZHJpdmVyLT5zdGF0ZXNbMV0ubmFtZSwgIkREUiBTUiIpOworCXN0cmNweShkcml2ZXItPnN0YXRlc1sxXS5kZXNjLCAiV0ZJIGFuZCBERFIgU2VsZiBSZWZyZXNoIik7CiAKKwljcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigma2lya3dvb2RfaWRsZV9kcml2ZXIpOwogCWlmIChjcHVpZGxlX3JlZ2lzdGVyX2RldmljZShkZXZpY2UpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAia2lya3dvb2RfaW5pdF9jcHVpZGxlOiBGYWlsZWQgcmVnaXN0ZXJpbmdcbiIpOwogCQlyZXR1cm4gLUVJTzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZDJuZXRfdjItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZDJuZXRfdjItc2V0dXAuYwppbmRleCAwNDNjZmQ1Li5mNDU3ZTA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2QybmV0X3YyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kMm5ldF92Mi1zZXR1cC5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChEMk5FVF9WMiwgIkxhQ2llIGQyIE5ldHdvcmsgdjIiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGQybmV0X3YyX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kYjg4ZjYyODEtYnAtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZGI4OGY2MjgxLWJwLXNldHVwLmMKaW5kZXggYmZmMDRlMC4uZmY0YzIxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kYjg4ZjYyODEtYnAtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2RiODhmNjI4MS1icC1zZXR1cC5jCkBAIC05Nyw3ICs5Nyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoREI4OEY2MjgxX0JQLCAiTWFydmVsbCBEQi04OEY2MjgxLUJQIERldmVsb3BtZW50IEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBTYWVlZCBCaXNoYXJhIDxzYWVlZEBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBkYjg4ZjYyODFfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2RvY2tzdGFyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2RvY2tzdGFyLXNldHVwLmMKaW5kZXggZjE0ZGZiOC4uZTRkMTk5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kb2Nrc3Rhci1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZG9ja3N0YXItc2V0dXAuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoRE9DS1NUQVIsICJTZWFnYXRlIEZyZWVBZ2VudCBEb2NrU3RhciIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZG9ja3N0YXJfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2d1cnVwbHVnLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2d1cnVwbHVnLXNldHVwLmMKaW5kZXggNDFkMWI0MC4uNmM0MGY3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9ndXJ1cGx1Zy1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZ3VydXBsdWctc2V0dXAuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoR1VSVVBMVUcsICJNYXJ2ZWxsIEd1cnVQbHVnIFJlZmVyZW5jZSBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogU2lkZGFydGggR29yZSA8Z29yZXNAbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZ3VydXBsdWdfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBkYjA2YWU0My4uZjc4NWQ0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC04LDcgKzgsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9icmlkZ2UtcmVncy5oPgogCi0JLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJbGRyCVxycCwgPUtJUktXT09EX1JFR1NfUEhZU19CQVNFCiAJbGRyCVxydiwgPUtJUktXT09EX1JFR1NfVklSVF9CQVNFCiAJb3JyCVxycCwgXHJwLCAjMHgwMDAxMjAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMGI0NC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pcnEuYwppbmRleCAwNWQxOTNhLi5jNGM2OGU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaXJxLmMKQEAgLTcsMTQgKzcsMTMgQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvYnJpZGdlLXJlZ3MuaD4KICNpbmNsdWRlIDxwbGF0L2lycS5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCiAKIHN0YXRpYyB2b2lkIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tcHAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbXBwLmMKaW5kZXggYjBhN2Q5Ny4uY2M0MzFmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tcHAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL21wcC5jCkBAIC03LDEyICs3LDExIEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8cGxhdC9tcHAuaD4KICNpbmNsdWRlICJjb21tb24uaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbXY4OGY2MjgxZ3R3X2dlLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL212ODhmNjI4MWd0d19nZS1zZXR1cC5jCmluZGV4IDAwY2NhMjIuLjlhMWU5MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbXY4OGY2MjgxZ3R3X2dlLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tdjg4ZjYyODFndHdfZ2Utc2V0dXAuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTVY4OEY2MjgxR1RXX0dFLCAiTWFydmVsbCA4OEY2MjgxIEdUVyBHRSBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gbXY4OGY2MjgxZ3R3X2dlX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXRzcGFjZV92Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXRzcGFjZV92Mi1zZXR1cC5jCmluZGV4IDdjZGFiNTcuLjg4NDliY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbmV0c3BhY2VfdjItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL25ldHNwYWNlX3YyLXNldHVwLmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfTkVUU1BBQ0VfVjIKIE1BQ0hJTkVfU1RBUlQoTkVUU1BBQ0VfVjIsICJMYUNpZSBOZXR3b3JrIFNwYWNlIHYyIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBuZXRzcGFjZV92Ml9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKQEAgLTI2OSw3ICsyNjksNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfSU5FVFNQQUNFX1YyCiBNQUNISU5FX1NUQVJUKElORVRTUEFDRV9WMiwgIkxhQ2llIEludGVybmV0IFNwYWNlIHYyIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBuZXRzcGFjZV92Ml9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKQEAgLTI4MCw3ICsyODAsNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfTkVUU1BBQ0VfTUFYX1YyCiBNQUNISU5FX1NUQVJUKE5FVFNQQUNFX01BWF9WMiwgIkxhQ2llIE5ldHdvcmsgU3BhY2UgTWF4IHYyIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBuZXRzcGFjZV92Ml9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbmV0eGJpZ192Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXR4YmlnX3YyLXNldHVwLmMKaW5kZXggNmJlNjI3ZC4uMWJhMTJjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXR4YmlnX3YyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXR4YmlnX3YyLXNldHVwLmMKQEAgLTM5OSw3ICszOTksNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfTkVUMkJJR19WMgogTUFDSElORV9TVEFSVChORVQyQklHX1YyLCAiTGFDaWUgMkJpZyBOZXR3b3JrIHYyIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBuZXR4YmlnX3YyX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApAQCAtNDEwLDcgKzQxMCw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9ORVQ1QklHX1YyCiBNQUNISU5FX1NUQVJUKE5FVDVCSUdfVjIsICJMYUNpZSA1QmlnIE5ldHdvcmsgdjIiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG5ldHhiaWdfdjJfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL29wZW5yZC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9vcGVucmQtc2V0dXAuYwppbmRleCBmNjliZWVmLi41NjYwY2E2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL29wZW5yZC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvb3BlbnJkLXNldHVwLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX09QRU5SRF9CQVNFCiBNQUNISU5FX1NUQVJUKE9QRU5SRF9CQVNFLCAiTWFydmVsbCBPcGVuUkQgQmFzZSBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogRGhhdmFsIFZhc2EgPGRoYXZhbC52YXNhQGVpbmZvY2hpcHMuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG9wZW5yZF9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKQEAgLTIyNiw3ICsyMjYsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX09QRU5SRF9DTElFTlQKIE1BQ0hJTkVfU1RBUlQoT1BFTlJEX0NMSUVOVCwgIk1hcnZlbGwgT3BlblJEIENsaWVudCBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogRGhhdmFsIFZhc2EgPGRoYXZhbC52YXNhQGVpbmZvY2hpcHMuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG9wZW5yZF9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKQEAgLTIzOCw3ICsyMzgsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX09QRU5SRF9VTFRJTUFURQogTUFDSElORV9TVEFSVChPUEVOUkRfVUxUSU1BVEUsICJNYXJ2ZWxsIE9wZW5SRCBVbHRpbWF0ZSBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogRGhhdmFsIFZhc2EgPGRoYXZhbC52YXNhQGVpbmZvY2hpcHMuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG9wZW5yZF9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcmQ4OGY2MTkyLW5hcy1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYxOTItbmFzLXNldHVwLmMKaW5kZXggNzVjNjYwMS4uNjY2Mzg2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYxOTItbmFzLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYxOTItbmFzLXNldHVwLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAogTUFDSElORV9TVEFSVChSRDg4RjYxOTJfTkFTLCAiTWFydmVsbCBSRC04OEY2MTkyLU5BUyBEZXZlbG9wbWVudCBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogU2FlZWQgQmlzaGFyYSA8c2FlZWRAbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcmQ4OGY2MTkyX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYyODEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcmQ4OGY2MjgxLXNldHVwLmMKaW5kZXggMGY3NTQ5NC4uNjZiM2MwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYyODEtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjI4MS1zZXR1cC5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogTUFDSElORV9TVEFSVChSRDg4RjYyODEsICJNYXJ2ZWxsIFJELTg4RjYyODEgUmVmZXJlbmNlIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBTYWVlZCBCaXNoYXJhIDxzYWVlZEBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSByZDg4ZjYyODFfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3NoZWV2YXBsdWctc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvc2hlZXZhcGx1Zy1zZXR1cC5jCmluZGV4IDE3ZGUwYmYuLjhiMTAyZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvc2hlZXZhcGx1Zy1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvc2hlZXZhcGx1Zy1zZXR1cC5jCkBAIC0xMzgsNyArMTM4LDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9TSEVFVkFQTFVHCiBNQUNISU5FX1NUQVJUKFNIRUVWQVBMVUcsICJNYXJ2ZWxsIFNoZWV2YVBsdWcgUmVmZXJlbmNlIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBzaGFkaSBBbW1vdXJpIDxzaGFkaUBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBzaGVldmFwbHVnX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApAQCAtMTQ5LDcgKzE0OSw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9FU0FUQV9TSEVFVkFQTFVHCiBNQUNISU5FX1NUQVJUKEVTQVRBX1NIRUVWQVBMVUcsICJNYXJ2ZWxsIGVTQVRBIFNoZWV2YVBsdWcgUmVmZXJlbmNlIEJvYXJkIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBzaGVldmFwbHVnX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90NTMyNS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90NTMyNS1zZXR1cC5jCmluZGV4IGU2YjliMWIuLmVhMTA0ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvdDUzMjUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3Q1MzI1LXNldHVwLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCiBNQUNISU5FX1NUQVJUKFQ1MzI1LCAiSFAgdDUzMjUgVGhpbiBDbGllbnQiKQogCS8qIE1haW50YWluZXI6IE1hcnRpbiBNaWNobG1heXIgPHRibUBjeXJpdXMuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGhwX3Q1MzI1X2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90czIxOS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90czIxOS1zZXR1cC5jCmluZGV4IDY4ZjMyZjIuLjI2MmMwMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvdHMyMTktc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3RzMjE5LXNldHVwLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiBNQUNISU5FX1NUQVJUKFRTMjE5LCAiUU5BUCBUUy0xMTkvVFMtMjE5IikKIAkvKiBNYWludGFpbmVyOiBNYXJ0aW4gTWljaGxtYXlyIDx0Ym1AY3lyaXVzLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBxbmFwX3RzMjE5X2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90czQxeC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90czQxeC1zZXR1cC5jCmluZGV4IGQ1ZDAwOTkuLmI2OGY1YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvdHM0MXgtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3RzNDF4LXNldHVwLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiBNQUNISU5FX1NUQVJUKFRTNDFYLCAiUU5BUCBUUy00MXgiKQogCS8qIE1haW50YWluZXI6IE1hcnRpbiBNaWNobG1heXIgPHRibUBjeXJpdXMuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHFuYXBfdHM0MXhfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gta3M4Njk1L01ha2VmaWxlCmluZGV4IDdlM2U4MTYuLjg1M2VmZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIyBNYWtlZmlsZSBmb3IgS1M4Njk1IGFyY2hpdGVjdHVyZSBzdXBwb3J0CiAjCiAKLW9iai15CQkJCTo9IGNwdS5vIGlycS5vIHRpbWUubyBncGlvLm8gZGV2aWNlcy5vCitvYmoteQkJCQk6PSBjcHUubyBpcnEubyB0aW1lLm8gZGV2aWNlcy5vCiBvYmotbQkJCQk6PQogb2JqLW4JCQkJOj0KIG9iai0JCQkJOj0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWFjczVrLmMgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1hY3M1ay5jCmluZGV4IDNjYTRmOGUuLmE5MWY5OWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWFjczVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtYWNzNWsuYwpAQCAtMTAsNyArMTAsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1rczg2OTUuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApAQCAtMjIzLDcgKzIyMyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQUNTNUssICJCcml2byBTeXN0ZW1zIExMQyBBQ1MtNTAwMCBNYXN0ZXIgYm9hcmQiKQogCS8qIE1haW50YWluZXI6IFNpbXRlYyBFbGVjdHJvbmljcy4gKi8KLQkuYm9vdF9wYXJhbXMJPSBLUzg2OTVfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGtzODY5NV9tYXBfaW8sCiAJLmluaXRfaXJxCT0ga3M4Njk1X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBhY3M1a19pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtZHNtMzIwLmMgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1kc20zMjAuYwppbmRleCAxMzM4Y2IzLi5kMjRiY2VmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1kc20zMjAuYworKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1kc20zMjAuYwpAQCAtMTAsNyArMTAsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1rczg2OTUuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApAQCAtMTIxLDcgKzEyMSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoRFNNMzIwLCAiRC1MaW5rIERTTS0zMjAgV2lyZWxlc3MgTWVkaWEgUGxheWVyIikKIAkvKiBNYWludGFpbmVyOiBTaW10ZWMgRWxlY3Ryb25pY3MuICovCi0JLmJvb3RfcGFyYW1zCT0gS1M4Njk1X1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBrczg2OTVfbWFwX2lvLAogCS5pbml0X2lycQk9IGtzODY5NV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gZHNtMzIwX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1taWNyZWwuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLW1pY3JlbC5jCmluZGV4IGUyZTNjYmEuLjE2Yzk1NjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLW1pY3JlbC5jCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLW1pY3JlbC5jCkBAIC01LDcgKzUsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1rczg2OTUuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKQEAgLTUzLDcgKzUzLDcgQEAKIAogTUFDSElORV9TVEFSVChLUzg2OTUsICJLUzg2OTUgQ2VudGF1ciBEZXZlbG9wbWVudCBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTWljcmVsIFNlbWljb25kdWN0b3IgSW5jLiAqLwotCS5ib290X3BhcmFtcwk9IEtTODY5NV9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0ga3M4Njk1X21hcF9pbywKIAkuaW5pdF9pcnEJPSBrczg2OTVfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG1pY3JlbF9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvZGV2aWNlcy5jCmluZGV4IGI4OWZiNmQuLjczYmQ2MzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9kZXZpY2VzLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2dwaW8uYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlNDU2NS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gta3M4Njk1L2dwaW8uYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBBbmRyZXcgVmljdG9yCi0gKiBVcGRhdGVkIHRvIEdQSU9MSUIsIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICAgICAgICAgICAgICAgICBEYW5pZWwgU2lsdmVyc3RvbmUgPGRzaWx2ZXJzQHNpbXRlYy5jby51az4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotCi0vKgotICogQ29uZmlndXJlIGEgR1BJTyBsaW5lIGZvciBlaXRoZXIgR1BJTyBmdW5jdGlvbiwgb3IgaXRzIGludGVybmFsCi0gKiBmdW5jdGlvbiAoSW50ZXJydXB0LCBUaW1lciwgZXRjKS4KLSAqLwotc3RhdGljIHZvaWQga3M4Njk1X2dwaW9fbW9kZSh1bnNpZ25lZCBpbnQgcGluLCBzaG9ydCBncGlvKQotewotCXVuc2lnbmVkIGludCBlbmFibGVbXSA9IHsgSU9QQ19JT0VJTlQwRU4sIElPUENfSU9FSU5UMUVOLCBJT1BDX0lPRUlOVDJFTiwgSU9QQ19JT0VJTlQzRU4sIElPUENfSU9USU0wRU4sIElPUENfSU9USU0xRU4gfTsKLQl1bnNpZ25lZCBsb25nIHgsIGZsYWdzOwotCi0JaWYgKHBpbiA+IEtTODY5NV9HUElPXzUpCS8qIG9ubHkgR1BJTyAwLi41IGhhdmUgaW50ZXJuYWwgZnVuY3Rpb25zICovCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BDKTsKLQlpZiAoZ3BpbykJCQkvKiBHUElPOiBzZXQgYml0IHRvIDAgKi8KLQkJeCAmPSB+ZW5hYmxlW3Bpbl07Ci0JZWxzZQkJCQkvKiBJbnRlcm5hbCBmdW5jdGlvbjogc2V0IGJpdCB0byAxICovCi0JCXggfD0gZW5hYmxlW3Bpbl07Ci0JX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEMpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBncGlvX2lycVtdID0geyBLUzg2OTVfSVJRX0VYVEVSTjAsIEtTODY5NV9JUlFfRVhURVJOMSwgS1M4Njk1X0lSUV9FWFRFUk4yLCBLUzg2OTVfSVJRX0VYVEVSTjMgfTsKLQotLyoKLSAqIENvbmZpZ3VyZSBHUElPIHBpbiBhcyBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlLgotICovCi1pbnQga3M4Njk1X2dwaW9faW50ZXJydXB0KHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCB0eXBlKQotewotCXVuc2lnbmVkIGxvbmcgeCwgZmxhZ3M7Ci0KLQlpZiAocGluID4gS1M4Njk1X0dQSU9fMykJLyogb25seSBHUElPIDAuLjMgY2FuIGdlbmVyYXRlIElSUSAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCS8qIHNldCBwaW4gYXMgaW5wdXQgKi8KLQl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7Ci0JeCAmPSB+SU9QTShwaW4pOwotCV9fcmF3X3dyaXRlbCh4LCBLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCS8qIFNldCBJUlEgdHJpZ2dlcmluZyB0eXBlICovCi0JaXJxX3NldF9pcnFfdHlwZShncGlvX2lycVtwaW5dLCB0eXBlKTsKLQotCS8qIGVuYWJsZSBpbnRlcnJ1cHQgbW9kZSAqLwotCWtzODY5NV9ncGlvX21vZGUocGluLCAwKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChrczg2OTVfZ3Bpb19pbnRlcnJ1cHQpOwotCi0KLQotLyogLi4uLiBHZW5lcmljIEdQSU8gaW50ZXJmYWNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KLQotLyoKLSAqIENvbmZpZ3VyZSB0aGUgR1BJTyBsaW5lIGFzIGFuIGlucHV0LgotICovCi1zdGF0aWMgaW50IGtzODY5NV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IHBpbikKLXsKLQl1bnNpZ25lZCBsb25nIHgsIGZsYWdzOwotCi0JaWYgKHBpbiA+IEtTODY5NV9HUElPXzE1KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIHNldCBwaW4gdG8gR1BJTyBtb2RlICovCi0Ja3M4Njk1X2dwaW9fbW9kZShwaW4sIDEpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyogc2V0IHBpbiBhcyBpbnB1dCAqLwotCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKLQl4ICY9IH5JT1BNKHBpbik7Ci0JX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIENvbmZpZ3VyZSB0aGUgR1BJTyBsaW5lIGFzIGFuIG91dHB1dCwgd2l0aCBkZWZhdWx0IHN0YXRlLgotICovCi1zdGF0aWMgaW50IGtzODY5NV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCi0JCQkJCXVuc2lnbmVkIGludCBwaW4sIGludCBzdGF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHgsIGZsYWdzOwotCi0JaWYgKHBpbiA+IEtTODY5NV9HUElPXzE1KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIHNldCBwaW4gdG8gR1BJTyBtb2RlICovCi0Ja3M4Njk1X2dwaW9fbW9kZShwaW4sIDEpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyogc2V0IGxpbmUgc3RhdGUgKi8KLQl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QRCk7Ci0JaWYgKHN0YXRlKQotCQl4IHw9IElPUEQocGluKTsKLQllbHNlCi0JCXggJj0gfklPUEQocGluKTsKLQlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QRCk7Ci0KLQkvKiBzZXQgcGluIGFzIG91dHB1dCAqLwotCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKLQl4IHw9IElPUE0ocGluKTsKLQlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogU2V0IHRoZSBzdGF0ZSBvZiBhbiBvdXRwdXQgR1BJTyBsaW5lLgotICovCi1zdGF0aWMgdm9pZCBrczg2OTVfZ3Bpb19zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCi0JCQkJICB1bnNpZ25lZCBpbnQgcGluLCBpbnQgc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyB4LCBmbGFnczsKLQotCWlmIChwaW4gPiBLUzg2OTVfR1BJT18xNSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyogc2V0IG91dHB1dCBsaW5lIHN0YXRlICovCi0JeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOwotCWlmIChzdGF0ZSkKLQkJeCB8PSBJT1BEKHBpbik7Ci0JZWxzZQotCQl4ICY9IH5JT1BEKHBpbik7Ci0JX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0KLS8qCi0gKiBSZWFkIHRoZSBzdGF0ZSBvZiBhIEdQSU8gbGluZS4KLSAqLwotc3RhdGljIGludCBrczg2OTVfZ3Bpb19nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBwaW4pCi17Ci0JdW5zaWduZWQgbG9uZyB4OwotCi0JaWYgKHBpbiA+IEtTODY5NV9HUElPXzE1KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKLQlyZXR1cm4gKHggJiBJT1BEKHBpbikpICE9IDA7Ci19Ci0KLQotLyoKLSAqIE1hcCBHUElPIGxpbmUgdG8gSVJRIG51bWJlci4KLSAqLwotc3RhdGljIGludCBrczg2OTVfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBwaW4pCi17Ci0JaWYgKHBpbiA+IEtTODY5NV9HUElPXzMpCS8qIG9ubHkgR1BJTyAwLi4zIGNhbiBnZW5lcmF0ZSBJUlEgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gZ3Bpb19pcnFbcGluXTsKLX0KLQotLyoKLSAqIE1hcCBJUlEgbnVtYmVyIHRvIEdQSU8gbGluZS4KLSAqLwotaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKChpcnEgPCBLUzg2OTVfSVJRX0VYVEVSTjApIHx8IChpcnEgPiBLUzg2OTVfSVJRX0VYVEVSTjMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAoaXJxIC0gS1M4Njk1X0lSUV9FWFRFUk4wKTsKLX0KLUVYUE9SVF9TWU1CT0woaXJxX3RvX2dwaW8pOwotCi0vKiBHUElPTElCIGludGVyZmFjZSAqLwotCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBrczg2OTVfZ3Bpb19jaGlwID0gewotCS5sYWJlbAkJCT0gIktTODY5NSIsCi0JLmRpcmVjdGlvbl9pbnB1dAk9IGtzODY5NV9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IGtzODY5NV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCi0JLmdldAkJCT0ga3M4Njk1X2dwaW9fZ2V0X3ZhbHVlLAotCS5zZXQJCQk9IGtzODY5NV9ncGlvX3NldF92YWx1ZSwKLQkudG9faXJxCQkJPSBrczg2OTVfZ3Bpb190b19pcnEsCi0JLmJhc2UJCQk9IDAsCi0JLm5ncGlvCQkJPSAxNiwKLQkuY2FuX3NsZWVwCQk9IDAsCi19OwotCi0vKiBSZWdpc3RlciB0aGUgR1BJT3MgKi8KLXZvaWQga3M4Njk1X3JlZ2lzdGVyX2dwaW9zKHZvaWQpCi17Ci0JaWYgKGdwaW9jaGlwX2FkZCgma3M4Njk1X2dwaW9fY2hpcCkpCi0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIGNvcmUgR1BJT3NcbiIpOwotfQotCi0vKiAuLi4uIERlYnVnIGludGVyZmFjZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0KLXN0YXRpYyBpbnQga3M4Njk1X2dwaW9fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKLXsKLQl1bnNpZ25lZCBpbnQgZW5hYmxlW10gPSB7IElPUENfSU9FSU5UMEVOLCBJT1BDX0lPRUlOVDFFTiwgSU9QQ19JT0VJTlQyRU4sIElPUENfSU9FSU5UM0VOLCBJT1BDX0lPVElNMEVOLCBJT1BDX0lPVElNMUVOIH07Ci0JdW5zaWduZWQgaW50IGludG1hc2tbXSA9IHsgSU9QQ19JT0VJTlQwVE0sIElPUENfSU9FSU5UMVRNLCBJT1BDX0lPRUlOVDJUTSwgSU9QQ19JT0VJTlQzVE0gfTsKLQl1bnNpZ25lZCBsb25nIG1vZGUsIGN0cmwsIGRhdGE7Ci0JaW50IGk7Ci0KLQltb2RlID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7Ci0JY3RybCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEMpOwotCWRhdGEgPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKLQotCXNlcV9wcmludGYocywgIlBpblx0SS9PXHRGdW5jdGlvblx0U3RhdGVcblxuIik7Ci0KLQlmb3IgKGkgPSBLUzg2OTVfR1BJT18wOyBpIDw9IEtTODY5NV9HUElPXzE1IDsgaSsrKSB7Ci0JCXNlcV9wcmludGYocywgIiVpOlx0IiwgaSk7Ci0KLQkJc2VxX3ByaW50ZihzLCAiJXNcdCIsIChtb2RlICYgSU9QTShpKSkgPyAiT3V0cHV0IiA6ICJJbnB1dCIpOwotCi0JCWlmIChpIDw9IEtTODY5NV9HUElPXzMpIHsKLQkJCWlmIChjdHJsICYgZW5hYmxlW2ldKSB7Ci0JCQkJc2VxX3ByaW50ZihzLCAiRVhUJWkgIiwgaSk7Ci0KLQkJCQlzd2l0Y2ggKChjdHJsICYgaW50bWFza1tpXSkgPj4gKDQgKiBpKSkgewotCQkJCQljYXNlIElPUENfVE1fTE9XOgotCQkJCQkJc2VxX3ByaW50ZihzLCAiKExvdykiKTsJCWJyZWFrOwotCQkJCQljYXNlIElPUENfVE1fSElHSDoKLQkJCQkJCXNlcV9wcmludGYocywgIihIaWdoKSIpOwlicmVhazsKLQkJCQkJY2FzZSBJT1BDX1RNX1JJU0lORzoKLQkJCQkJCXNlcV9wcmludGYocywgIihSaXNpbmcpIik7CWJyZWFrOwotCQkJCQljYXNlIElPUENfVE1fRkFMTElORzoKLQkJCQkJCXNlcV9wcmludGYocywgIihGYWxsaW5nKSIpOwlicmVhazsKLQkJCQkJY2FzZSBJT1BDX1RNX0VER0U6Ci0JCQkJCQlzZXFfcHJpbnRmKHMsICIoRWRnZXMpIik7CWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQlzZXFfcHJpbnRmKHMsICJHUElPXHQiKTsKLQkJfQotCQllbHNlIGlmIChpIDw9IEtTODY5NV9HUElPXzUpIHsKLQkJCWlmIChjdHJsICYgZW5hYmxlW2ldKQotCQkJCXNlcV9wcmludGYocywgIlRPVVQlaVx0IiwgaSAtIEtTODY5NV9HUElPXzQpOwotCQkJZWxzZQotCQkJCXNlcV9wcmludGYocywgIkdQSU9cdCIpOwotCQl9Ci0JCWVsc2UKLQkJCXNlcV9wcmludGYocywgIkdQSU9cdCIpOwotCi0JCXNlcV9wcmludGYocywgIlx0Iik7Ci0KLQkJc2VxX3ByaW50ZihzLCAiJWlcbiIsIChkYXRhICYgSU9QRChpKSkgPyAxIDogMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGtzODY5NV9ncGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGtzODY5NV9ncGlvX3Nob3csIE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrczg2OTVfZ3Bpb19vcGVyYXRpb25zID0gewotCS5vcGVuCQk9IGtzODY5NV9ncGlvX29wZW4sCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGtzODY5NV9ncGlvX2RlYnVnZnNfaW5pdCh2b2lkKQotewotCS8qIC9zeXMva2VybmVsL2RlYnVnL2tzODY5NV9ncGlvICovCi0JKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoImtzODY5NV9ncGlvIiwgU19JRlJFRyB8IFNfSVJVR08sIE5VTEwsIE5VTEwsICZrczg2OTVfZ3Bpb19vcGVyYXRpb25zKTsKLQlyZXR1cm4gMDsKLX0KLXBvc3Rjb3JlX2luaXRjYWxsKGtzODY5NV9ncGlvX2RlYnVnZnNfaW5pdCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBiZjUxNmFkLi5hNzllNDg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtdWFydC5oPgogCi0JLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCWxkcglccnAsID1LUzg2OTVfVUFSVF9QQQkJQCBwaHlzaWNhbCBiYXNlIGFkZHJlc3MKIAkJbGRyCVxydiwgPUtTODY5NV9VQVJUX1ZBCQlAIHZpcnR1YWwgYmFzZSBhZGRyZXNzCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9ncGlvLWtzODY5NS5oIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2dwaW8ta3M4Njk1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViMDM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9ncGlvLWtzODY5NS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQW5kcmV3IFZpY3RvcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX01BQ0hfS1M4NjU5X0dQSU9fSAorI2RlZmluZSBfX01BQ0hfS1M4NjU5X0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNkZWZpbmUgS1M4Njk1X0dQSU9fMAkJMAorI2RlZmluZSBLUzg2OTVfR1BJT18xCQkxCisjZGVmaW5lIEtTODY5NV9HUElPXzIJCTIKKyNkZWZpbmUgS1M4Njk1X0dQSU9fMwkJMworI2RlZmluZSBLUzg2OTVfR1BJT180CQk0CisjZGVmaW5lIEtTODY5NV9HUElPXzUJCTUKKyNkZWZpbmUgS1M4Njk1X0dQSU9fNgkJNgorI2RlZmluZSBLUzg2OTVfR1BJT183CQk3CisjZGVmaW5lIEtTODY5NV9HUElPXzgJCTgKKyNkZWZpbmUgS1M4Njk1X0dQSU9fOQkJOQorI2RlZmluZSBLUzg2OTVfR1BJT18xMAkJMTAKKyNkZWZpbmUgS1M4Njk1X0dQSU9fMTEJCTExCisjZGVmaW5lIEtTODY5NV9HUElPXzEyCQkxMgorI2RlZmluZSBLUzg2OTVfR1BJT18xMwkJMTMKKyNkZWZpbmUgS1M4Njk1X0dQSU9fMTQJCTE0CisjZGVmaW5lIEtTODY5NV9HUElPXzE1CQkxNQorCisvKgorICogQ29uZmlndXJlIEdQSU8gcGluIGFzIGV4dGVybmFsIGludGVycnVwdCBzb3VyY2UuCisgKi8KK2V4dGVybiBpbnQga3M4Njk1X2dwaW9faW50ZXJydXB0KHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCB0eXBlKTsKKworLyogUmVnaXN0ZXIgdGhlIEdQSU9zICovCitleHRlcm4gdm9pZCBrczg2OTVfcmVnaXN0ZXJfZ3Bpb3Modm9pZCk7CisKKyNlbmRpZiAvKiBfX01BQ0hfS1M4NjU5X0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggODYzMTJkNC4uZjVmZGEzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xMSw0NyArMTEsOSBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSF8KICNkZWZpbmUgX19BU01fQVJDSF9HUElPX0hfCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2RlZmluZSBLUzg2OTVfR1BJT18wCQkwCi0jZGVmaW5lIEtTODY5NV9HUElPXzEJCTEKLSNkZWZpbmUgS1M4Njk1X0dQSU9fMgkJMgotI2RlZmluZSBLUzg2OTVfR1BJT18zCQkzCi0jZGVmaW5lIEtTODY5NV9HUElPXzQJCTQKLSNkZWZpbmUgS1M4Njk1X0dQSU9fNQkJNQotI2RlZmluZSBLUzg2OTVfR1BJT182CQk2Ci0jZGVmaW5lIEtTODY5NV9HUElPXzcJCTcKLSNkZWZpbmUgS1M4Njk1X0dQSU9fOAkJOAotI2RlZmluZSBLUzg2OTVfR1BJT185CQk5Ci0jZGVmaW5lIEtTODY5NV9HUElPXzEwCQkxMAotI2RlZmluZSBLUzg2OTVfR1BJT18xMQkJMTEKLSNkZWZpbmUgS1M4Njk1X0dQSU9fMTIJCTEyCi0jZGVmaW5lIEtTODY5NV9HUElPXzEzCQkxMwotI2RlZmluZSBLUzg2OTVfR1BJT18xNAkJMTQKLSNkZWZpbmUgS1M4Njk1X0dQSU9fMTUJCTE1Ci0KLS8qCi0gKiBDb25maWd1cmUgR1BJTyBwaW4gYXMgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZS4KLSAqLwotZXh0ZXJuIGludCBrczg2OTVfZ3Bpb19pbnRlcnJ1cHQodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHR5cGUpOwotCiAvKgogICogTWFwIElSUSBudW1iZXIgdG8gR1BJTyBsaW5lLgogICovCiBleHRlcm4gaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpOwogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0vKiBJZiBpdCB0dXJucyBvdXQgdGhhdCB3ZSBuZWVkIHRvIG9wdGltaXNlIEdQSU8gYWNjZXNzIGZvciB0aGUKLSAqIE1pY3JlbCdzIEdQSU9zLCB0aGVuIHRoZXNlIGNhbiBiZSBjaGFuZ2VkIHRvIGNoZWNrIHRoZWlyIGFyZ3VtZW50Ci0gKiBkaXJlY3RseSBhcyBzdGF0aWMgaW5saW5lcy4gSG93ZXZlciBmb3Igbm93IGl0J3MgcHJvYmFibHkgbm90Ci0gKiB3b3J0aHdoaWxlLgotICovCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlIF9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUgX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX3RvX2lycSBfX2dwaW9fdG9faXJxCi0KLS8qIFJlZ2lzdGVyIHRoZSBHUElPcyAqLwotZXh0ZXJuIHZvaWQga3M4Njk1X3JlZ2lzdGVyX2dwaW9zKHZvaWQpOwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2xlZHMuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2xlZHMuYwppbmRleCAxODRlZjc0Li5kNmY2NTAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9sZWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvbGVkcy5jCkBAIC03LDE0ICs3LDE0IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogCiBzdGF0aWMgaW5saW5lIHZvaWQga3M4Njk1X2xlZF9vbih1bnNpZ25lZCBpbnQgbGVkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggYjBhMmRiNy4uMGI0ZTc2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNCw3ICsxNCw3IEBACiAJCS5lcXUJaW9fdmlydCwgSU9fQkFTRQogCQkuZXF1CWlvX3BoeXMsIElPX1NUQVJUCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHgwMDA0NDAwMAlAIFVBUlQxCiBACQltb3YJXHJwLCAjMHgwMDA0NTAwMAlAIFVBUlQyCiAJCWFkZAlccnYsIFxycCwgI2lvX3ZpcnQJQCB2aXJ0dWFsIGFkZHJlc3MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9NYWtlZmlsZQppbmRleCBhNWZjNWQwLi5mNWRiODA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L01ha2VmaWxlCkBAIC0zLDYgKzMsNiBAQAogIwogCiBvYmoteQk6PSB0aW1lci5vIGlycS5vIGNvbW1vbi5vIHNlcmlhbC5vIGNsb2NrLm8KLW9iai15CSs9IGdwaW9saWIubyBwbS5vIHN1c3BlbmQubworb2JqLXkJKz0gcG0ubyBzdXNwZW5kLm8KIG9iai15CSs9IHBoeTMyNTAubwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvZ3Bpb2xpYi5jIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2dwaW9saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwNjFlYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvZ3Bpb2xpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWxwYzMyeHgvZ3Bpb2xpYi5jCi0gKgotICogQXV0aG9yOiBLZXZpbiBXZWxscyA8a2V2aW4ud2VsbHNAbnhwLmNvbT4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlhQIFNlbWljb25kdWN0b3JzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX0lOUF9TVEFURQkJX0dQUkVHKDB4MDAwKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfT1VUUF9TRVQJCV9HUFJFRygweDAwNCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX09VVFBfQ0xSCQlfR1BSRUcoMHgwMDgpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QM19PVVRQX1NUQVRFCQlfR1BSRUcoMHgwMEMpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMl9ESVJfU0VUCQkJX0dQUkVHKDB4MDEwKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfRElSX0NMUgkJCV9HUFJFRygweDAxNCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX0RJUl9TVEFURQkJX0dQUkVHKDB4MDE4KQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfSU5QX1NUQVRFCQlfR1BSRUcoMHgwMUMpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMl9PVVRQX1NFVAkJX0dQUkVHKDB4MDIwKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfT1VUUF9DTFIJCV9HUFJFRygweDAyNCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX01VWF9TRVQJCQlfR1BSRUcoMHgwMjgpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NVVhfQ0xSCQkJX0dQUkVHKDB4MDJDKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfTVVYX1NUQVRFCQlfR1BSRUcoMHgwMzApCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMF9JTlBfU1RBVEUJCV9HUFJFRygweDA0MCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX09VVFBfU0VUCQlfR1BSRUcoMHgwNDQpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMF9PVVRQX0NMUgkJX0dQUkVHKDB4MDQ4KQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfT1VUUF9TVEFURQkJX0dQUkVHKDB4MDRDKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfRElSX1NFVAkJCV9HUFJFRygweDA1MCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0RJUl9DTFIJCQlfR1BSRUcoMHgwNTQpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMF9ESVJfU1RBVEUJCV9HUFJFRygweDA1OCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0lOUF9TVEFURQkJX0dQUkVHKDB4MDYwKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfT1VUUF9TRVQJCV9HUFJFRygweDA2NCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX09VVFBfQ0xSCQlfR1BSRUcoMHgwNjgpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMV9PVVRQX1NUQVRFCQlfR1BSRUcoMHgwNkMpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMV9ESVJfU0VUCQkJX0dQUkVHKDB4MDcwKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfRElSX0NMUgkJCV9HUFJFRygweDA3NCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0RJUl9TVEFURQkJX0dQUkVHKDB4MDc4KQotCi0jZGVmaW5lIEdQSU8wMTJfUElOX1RPX0JJVCh4KQkJCSgxIDw8ICh4KSkKLSNkZWZpbmUgR1BJTzNfUElOX1RPX0JJVCh4KQkJCSgxIDw8ICgoeCkgKyAyNSkpCi0jZGVmaW5lIEdQTzNfUElOX1RPX0JJVCh4KQkJCSgxIDw8ICh4KSkKLSNkZWZpbmUgR1BJTzAxMl9QSU5fSU5fU0VMKHgsIHkpCQkoKCh4KSA+PiAoeSkpICYgMSkKLSNkZWZpbmUgR1BJTzNfUElOX0lOX1NISUZUKHgpCQkJKCh4KSA9PSA1ID8gMjQgOiAxMCArICh4KSkKLSNkZWZpbmUgR1BJTzNfUElOX0lOX1NFTCh4LCB5KQkJCSgoeCkgPj4gR1BJTzNfUElOX0lOX1NISUZUKHkpKQotI2RlZmluZSBHUElPM19QSU41X0lOX1NFTCh4KQkJCSgoKHgpID4+IDI0KSAmIDEpCi0jZGVmaW5lIEdQSTNfUElOX0lOX1NFTCh4LCB5KQkJCSgoKHgpID4+ICh5KSkgJiAxKQotCi1zdHJ1Y3QgZ3Bpb19yZWdzIHsKLQl2b2lkIF9faW9tZW0gKmlucF9zdGF0ZTsKLQl2b2lkIF9faW9tZW0gKm91dHBfc2V0OwotCXZvaWQgX19pb21lbSAqb3V0cF9jbHI7Ci0Jdm9pZCBfX2lvbWVtICpkaXJfc2V0OwotCXZvaWQgX19pb21lbSAqZGlyX2NscjsKLX07Ci0KLS8qCi0gKiBHUElPIG5hbWVzCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpncGlvX3AwX25hbWVzW0xQQzMyWFhfR1BJT19QMF9NQVhdID0gewotCSJwMC4wIiwgInAwLjEiLCAicDAuMiIsICJwMC4zIiwKLQkicDAuNCIsICJwMC41IiwgInAwLjYiLCAicDAuNyIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpncGlvX3AxX25hbWVzW0xQQzMyWFhfR1BJT19QMV9NQVhdID0gewotCSJwMS4wIiwgInAxLjEiLCAicDEuMiIsICJwMS4zIiwKLQkicDEuNCIsICJwMS41IiwgInAxLjYiLCAicDEuNyIsCi0JInAxLjgiLCAicDEuOSIsICJwMS4xMCIsICJwMS4xMSIsCi0JInAxLjEyIiwgInAxLjEzIiwgInAxLjE0IiwgInAxLjE1IiwKLQkicDEuMTYiLCAicDEuMTciLCAicDEuMTgiLCAicDEuMTkiLAotCSJwMS4yMCIsICJwMS4yMSIsICJwMS4yMiIsICJwMS4yMyIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZ3Bpb19wMl9uYW1lc1tMUEMzMlhYX0dQSU9fUDJfTUFYXSA9IHsKLQkicDIuMCIsICJwMi4xIiwgInAyLjIiLCAicDIuMyIsCi0JInAyLjQiLCAicDIuNSIsICJwMi42IiwgInAyLjciLAotCSJwMi44IiwgInAyLjkiLCAicDIuMTAiLCAicDIuMTEiLAotCSJwMi4xMiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpncGlvX3AzX25hbWVzW0xQQzMyWFhfR1BJT19QM19NQVhdID0gewotCSJncGkwMDAiLCAiZ3BpbzAxIiwgImdwaW8wMiIsICJncGlvMDMiLAotCSJncGlvMDQiLCAiZ3BpbzA1IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmdwaV9wM19uYW1lc1tMUEMzMlhYX0dQSV9QM19NQVhdID0gewotCSJncGkwMCIsICJncGkwMSIsICJncGkwMiIsICJncGkwMyIsCi0JImdwaTA0IiwgImdwaTA1IiwgImdwaTA2IiwgImdwaTA3IiwKLQkiZ3BpMDgiLCAiZ3BpMDkiLCAgTlVMTCwgICAgTlVMTCwKLQkgTlVMTCwgICAgTlVMTCwgICAgTlVMTCwgICAiZ3BpMTUiLAotCSJncGkxNiIsICJncGkxNyIsICJncGkxOCIsICJncGkxOSIsCi0JImdwaTIwIiwgImdwaTIxIiwgImdwaTIyIiwgImdwaTIzIiwKLQkiZ3BpMjQiLCAiZ3BpMjUiLCAiZ3BpMjYiLCAiZ3BpMjciCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZ3BvX3AzX25hbWVzW0xQQzMyWFhfR1BPX1AzX01BWF0gPSB7Ci0JImdwbzAwIiwgImdwbzAxIiwgImdwbzAyIiwgImdwbzAzIiwKLQkiZ3BvMDQiLCAiZ3BvMDUiLCAiZ3BvMDYiLCAiZ3BvMDciLAotCSJncG8wOCIsICJncG8wOSIsICJncG8xMCIsICJncG8xMSIsCi0JImdwbzEyIiwgImdwbzEzIiwgImdwbzE0IiwgImdwbzE1IiwKLQkiZ3BvMTYiLCAiZ3BvMTciLCAiZ3BvMTgiLCAiZ3BvMTkiLAotCSJncG8yMCIsICJncG8yMSIsICJncG8yMiIsICJncG8yMyIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19yZWdzIGdwaW9fZ3JwX3JlZ3NfcDAgPSB7Ci0JLmlucF9zdGF0ZQk9IExQQzMyWFhfR1BJT19QMF9JTlBfU1RBVEUsCi0JLm91dHBfc2V0CT0gTFBDMzJYWF9HUElPX1AwX09VVFBfU0VULAotCS5vdXRwX2Nscgk9IExQQzMyWFhfR1BJT19QMF9PVVRQX0NMUiwKLQkuZGlyX3NldAk9IExQQzMyWFhfR1BJT19QMF9ESVJfU0VULAotCS5kaXJfY2xyCT0gTFBDMzJYWF9HUElPX1AwX0RJUl9DTFIsCi19OwotCi1zdGF0aWMgc3RydWN0IGdwaW9fcmVncyBncGlvX2dycF9yZWdzX3AxID0gewotCS5pbnBfc3RhdGUJPSBMUEMzMlhYX0dQSU9fUDFfSU5QX1NUQVRFLAotCS5vdXRwX3NldAk9IExQQzMyWFhfR1BJT19QMV9PVVRQX1NFVCwKLQkub3V0cF9jbHIJPSBMUEMzMlhYX0dQSU9fUDFfT1VUUF9DTFIsCi0JLmRpcl9zZXQJPSBMUEMzMlhYX0dQSU9fUDFfRElSX1NFVCwKLQkuZGlyX2Nscgk9IExQQzMyWFhfR1BJT19QMV9ESVJfQ0xSLAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX3JlZ3MgZ3Bpb19ncnBfcmVnc19wMiA9IHsKLQkuaW5wX3N0YXRlCT0gTFBDMzJYWF9HUElPX1AyX0lOUF9TVEFURSwKLQkub3V0cF9zZXQJPSBMUEMzMlhYX0dQSU9fUDJfT1VUUF9TRVQsCi0JLm91dHBfY2xyCT0gTFBDMzJYWF9HUElPX1AyX09VVFBfQ0xSLAotCS5kaXJfc2V0CT0gTFBDMzJYWF9HUElPX1AyX0RJUl9TRVQsCi0JLmRpcl9jbHIJPSBMUEMzMlhYX0dQSU9fUDJfRElSX0NMUiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19yZWdzIGdwaW9fZ3JwX3JlZ3NfcDMgPSB7Ci0JLmlucF9zdGF0ZQk9IExQQzMyWFhfR1BJT19QM19JTlBfU1RBVEUsCi0JLm91dHBfc2V0CT0gTFBDMzJYWF9HUElPX1AzX09VVFBfU0VULAotCS5vdXRwX2Nscgk9IExQQzMyWFhfR1BJT19QM19PVVRQX0NMUiwKLQkuZGlyX3NldAk9IExQQzMyWFhfR1BJT19QMl9ESVJfU0VULAotCS5kaXJfY2xyCT0gTFBDMzJYWF9HUElPX1AyX0RJUl9DTFIsCi19OwotCi1zdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgewotCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKLQlzdHJ1Y3QgZ3Bpb19yZWdzCSpncGlvX2dycDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICp0b19scGMzMnh4X2dwaW8oCi0Jc3RydWN0IGdwaW9fY2hpcCAqZ3BjKQotewotCXJldHVybiBjb250YWluZXJfb2YoZ3BjLCBzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAsIGNoaXApOwotfQotCi1zdGF0aWMgdm9pZCBfX3NldF9ncGlvX2Rpcl9wMDEyKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCi0JdW5zaWduZWQgcGluLCBpbnQgaW5wdXQpCi17Ci0JaWYgKGlucHV0KQotCQlfX3Jhd193cml0ZWwoR1BJTzAxMl9QSU5fVE9fQklUKHBpbiksCi0JCQlncm91cC0+Z3Bpb19ncnAtPmRpcl9jbHIpOwotCWVsc2UKLQkJX19yYXdfd3JpdGVsKEdQSU8wMTJfUElOX1RPX0JJVChwaW4pLAotCQkJZ3JvdXAtPmdwaW9fZ3JwLT5kaXJfc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgX19zZXRfZ3Bpb19kaXJfcDMoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKLQl1bnNpZ25lZCBwaW4sIGludCBpbnB1dCkKLXsKLQl1MzIgdSA9IEdQSU8zX1BJTl9UT19CSVQocGluKTsKLQotCWlmIChpbnB1dCkKLQkJX19yYXdfd3JpdGVsKHUsIGdyb3VwLT5ncGlvX2dycC0+ZGlyX2Nscik7Ci0JZWxzZQotCQlfX3Jhd193cml0ZWwodSwgZ3JvdXAtPmdwaW9fZ3JwLT5kaXJfc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgX19zZXRfZ3Bpb19sZXZlbF9wMDEyKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCi0JdW5zaWduZWQgcGluLCBpbnQgaGlnaCkKLXsKLQlpZiAoaGlnaCkKLQkJX19yYXdfd3JpdGVsKEdQSU8wMTJfUElOX1RPX0JJVChwaW4pLAotCQkJZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX3NldCk7Ci0JZWxzZQotCQlfX3Jhd193cml0ZWwoR1BJTzAxMl9QSU5fVE9fQklUKHBpbiksCi0JCQlncm91cC0+Z3Bpb19ncnAtPm91dHBfY2xyKTsKLX0KLQotc3RhdGljIHZvaWQgX19zZXRfZ3Bpb19sZXZlbF9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAotCXVuc2lnbmVkIHBpbiwgaW50IGhpZ2gpCi17Ci0JdTMyIHUgPSBHUElPM19QSU5fVE9fQklUKHBpbik7Ci0KLQlpZiAoaGlnaCkKLQkJX19yYXdfd3JpdGVsKHUsIGdyb3VwLT5ncGlvX2dycC0+b3V0cF9zZXQpOwotCWVsc2UKLQkJX19yYXdfd3JpdGVsKHUsIGdyb3VwLT5ncGlvX2dycC0+b3V0cF9jbHIpOwotfQotCi1zdGF0aWMgdm9pZCBfX3NldF9ncG9fbGV2ZWxfcDMoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKLQl1bnNpZ25lZCBwaW4sIGludCBoaWdoKQotewotCWlmIChoaWdoKQotCQlfX3Jhd193cml0ZWwoR1BPM19QSU5fVE9fQklUKHBpbiksIGdyb3VwLT5ncGlvX2dycC0+b3V0cF9zZXQpOwotCWVsc2UKLQkJX19yYXdfd3JpdGVsKEdQTzNfUElOX1RPX0JJVChwaW4pLCBncm91cC0+Z3Bpb19ncnAtPm91dHBfY2xyKTsKLX0KLQotc3RhdGljIGludCBfX2dldF9ncGlvX3N0YXRlX3AwMTIoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKLQl1bnNpZ25lZCBwaW4pCi17Ci0JcmV0dXJuIEdQSU8wMTJfUElOX0lOX1NFTChfX3Jhd19yZWFkbChncm91cC0+Z3Bpb19ncnAtPmlucF9zdGF0ZSksCi0JCXBpbik7Ci19Ci0KLXN0YXRpYyBpbnQgX19nZXRfZ3Bpb19zdGF0ZV9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAotCXVuc2lnbmVkIHBpbikKLXsKLQlpbnQgc3RhdGUgPSBfX3Jhd19yZWFkbChncm91cC0+Z3Bpb19ncnAtPmlucF9zdGF0ZSk7Ci0KLQkvKgotCSAqIFAzIEdQSU8gcGluIGlucHV0IG1hcHBpbmcgaXMgbm90IGNvbnRpZ3VvdXMsIEdQSU9QMy0wLi40IGlzIG1hcHBlZAotCSAqIHRvIGJpdHMgMTAuLjE0LCB3aGlsZSBHUElPUDMtNSBpcyBtYXBwZWQgdG8gYml0IDI0LgotCSAqLwotCXJldHVybiBHUElPM19QSU5fSU5fU0VMKHN0YXRlLCBwaW4pOwotfQotCi1zdGF0aWMgaW50IF9fZ2V0X2dwaV9zdGF0ZV9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAotCXVuc2lnbmVkIHBpbikKLXsKLQlyZXR1cm4gR1BJM19QSU5fSU5fU0VMKF9fcmF3X3JlYWRsKGdyb3VwLT5ncGlvX2dycC0+aW5wX3N0YXRlKSwgcGluKTsKLX0KLQotLyoKLSAqIEdFTkVSSUNfR1BJTyBwcmltaXRpdmVzLgotICovCi1zdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDAxMihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCXVuc2lnbmVkIHBpbikKLXsKLQlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOwotCi0JX19zZXRfZ3Bpb19kaXJfcDAxMihncm91cCwgcGluLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQl1bnNpZ25lZCBwaW4pCi17Ci0Jc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKLQotCV9fc2V0X2dwaW9fZGlyX3AzKGdyb3VwLCBwaW4sIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9pbl9hbHdheXMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQl1bnNpZ25lZCBwaW4pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMDEyKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKLXsKLQlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOwotCi0JcmV0dXJuIF9fZ2V0X2dwaW9fc3RhdGVfcDAxMihncm91cCwgcGluKTsKLX0KLQotc3RhdGljIGludCBscGMzMnh4X2dwaW9fZ2V0X3ZhbHVlX3AzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKLXsKLQlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOwotCi0JcmV0dXJuIF9fZ2V0X2dwaW9fc3RhdGVfcDMoZ3JvdXAsIHBpbik7Ci19Ci0KLXN0YXRpYyBpbnQgbHBjMzJ4eF9ncGlfZ2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKLXsKLQlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOwotCi0JcmV0dXJuIF9fZ2V0X2dwaV9zdGF0ZV9wMyhncm91cCwgcGluKTsKLX0KLQotc3RhdGljIGludCBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMDEyKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKLQlpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKLQotCV9fc2V0X2dwaW9fZGlyX3AwMTIoZ3JvdXAsIHBpbiwgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCi0JaW50IHZhbHVlKQotewotCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7Ci0KLQlfX3NldF9ncGlvX2Rpcl9wMyhncm91cCwgcGluLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfb3V0X2Fsd2F5cyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCi0JaW50IHZhbHVlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBscGMzMnh4X2dwaW9fc2V0X3ZhbHVlX3AwMTIoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAotCWludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOwotCi0JX19zZXRfZ3Bpb19sZXZlbF9wMDEyKGdyb3VwLCBwaW4sIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCi0JaW50IHZhbHVlKQotewotCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7Ci0KLQlfX3NldF9ncGlvX2xldmVsX3AzKGdyb3VwLCBwaW4sIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgbHBjMzJ4eF9ncG9fc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKLQlpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKLQotCV9fc2V0X2dwb19sZXZlbF9wMyhncm91cCwgcGluLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQotewotCWlmIChwaW4gPCBjaGlwLT5uZ3BpbykKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCBscGMzMnh4X2dwaW9jaGlwW10gPSB7Ci0JewotCQkuY2hpcCA9IHsKLQkJCS5sYWJlbAkJCT0gImdwaW9fcDAiLAotCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDAxMiwKLQkJCS5nZXQJCQk9IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDAxMiwKLQkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9vdXRwdXRfcDAxMiwKLQkJCS5zZXQJCQk9IGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDAxMiwKLQkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAotCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BJT19QMF9HUlAsCi0JCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJT19QMF9NQVgsCi0JCQkubmFtZXMJCQk9IGdwaW9fcDBfbmFtZXMsCi0JCQkuY2FuX3NsZWVwCQk9IDAsCi0JCX0sCi0JCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AwLAotCX0sCi0JewotCQkuY2hpcCA9IHsKLQkJCS5sYWJlbAkJCT0gImdwaW9fcDEiLAotCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDAxMiwKLQkJCS5nZXQJCQk9IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDAxMiwKLQkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9vdXRwdXRfcDAxMiwKLQkJCS5zZXQJCQk9IGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDAxMiwKLQkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAotCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BJT19QMV9HUlAsCi0JCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJT19QMV9NQVgsCi0JCQkubmFtZXMJCQk9IGdwaW9fcDFfbmFtZXMsCi0JCQkuY2FuX3NsZWVwCQk9IDAsCi0JCX0sCi0JCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AxLAotCX0sCi0JewotCQkuY2hpcCA9IHsKLQkJCS5sYWJlbAkJCT0gImdwaW9fcDIiLAotCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDAxMiwKLQkJCS5nZXQJCQk9IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDAxMiwKLQkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9vdXRwdXRfcDAxMiwKLQkJCS5zZXQJCQk9IGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDAxMiwKLQkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAotCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BJT19QMl9HUlAsCi0JCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJT19QMl9NQVgsCi0JCQkubmFtZXMJCQk9IGdwaW9fcDJfbmFtZXMsCi0JCQkuY2FuX3NsZWVwCQk9IDAsCi0JCX0sCi0JCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AyLAotCX0sCi0JewotCQkuY2hpcCA9IHsKLQkJCS5sYWJlbAkJCT0gImdwaW9fcDMiLAotCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDMsCi0JCQkuZ2V0CQkJPSBscGMzMnh4X2dwaW9fZ2V0X3ZhbHVlX3AzLAotCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMywKLQkJCS5zZXQJCQk9IGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDMsCi0JCQkucmVxdWVzdAkJPSBscGMzMnh4X2dwaW9fcmVxdWVzdCwKLQkJCS5iYXNlCQkJPSBMUEMzMlhYX0dQSU9fUDNfR1JQLAotCQkJLm5ncGlvCQkJPSBMUEMzMlhYX0dQSU9fUDNfTUFYLAotCQkJLm5hbWVzCQkJPSBncGlvX3AzX25hbWVzLAotCQkJLmNhbl9zbGVlcAkJPSAwLAotCQl9LAotCQkuZ3Bpb19ncnAgPSAmZ3Bpb19ncnBfcmVnc19wMywKLQl9LAotCXsKLQkJLmNoaXAgPSB7Ci0JCQkubGFiZWwJCQk9ICJncGlfcDMiLAotCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5fYWx3YXlzLAotCQkJLmdldAkJCT0gbHBjMzJ4eF9ncGlfZ2V0X3ZhbHVlLAotCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCi0JCQkuYmFzZQkJCT0gTFBDMzJYWF9HUElfUDNfR1JQLAotCQkJLm5ncGlvCQkJPSBMUEMzMlhYX0dQSV9QM19NQVgsCi0JCQkubmFtZXMJCQk9IGdwaV9wM19uYW1lcywKLQkJCS5jYW5fc2xlZXAJCT0gMCwKLQkJfSwKLQkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDMsCi0JfSwKLQl7Ci0JCS5jaGlwID0gewotCQkJLmxhYmVsCQkJPSAiZ3BvX3AzIiwKLQkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9vdXRfYWx3YXlzLAotCQkJLnNldAkJCT0gbHBjMzJ4eF9ncG9fc2V0X3ZhbHVlLAotCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCi0JCQkuYmFzZQkJCT0gTFBDMzJYWF9HUE9fUDNfR1JQLAotCQkJLm5ncGlvCQkJPSBMUEMzMlhYX0dQT19QM19NQVgsCi0JCQkubmFtZXMJCQk9IGdwb19wM19uYW1lcywKLQkJCS5jYW5fc2xlZXAJCT0gMCwKLQkJfSwKLQkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDMsCi0JfSwKLX07Ci0KLXZvaWQgX19pbml0IGxwYzMyeHhfZ3Bpb19pbml0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShscGMzMnh4X2dwaW9jaGlwKTsgaSsrKQotCQlncGlvY2hpcF9hZGQoJmxwYzMyeHhfZ3Bpb2NoaXBbaV0uY2hpcCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggNjI5ZTc0NC4uMzUxYmQ2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMjAsNyArMjAsNyBAQAogICogRGVidWcgb3V0cHV0IGlzIGhhcmRjb2RlZCB0byBzdGFuZGFyZCBVQVJUIDUKICovCiAKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAlsZHJlcQlccnAsID0weDQwMDkwMDAwCiAJbGRybmUJXHJ2LCA9MHhGNDA5MDAwMAogCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2dwaW8tbHBjMzJ4eC5oIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9ncGlvLWxwYzMyeHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODE2ZTIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9ncGlvLWxwYzMyeHguaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQXV0aG9yOiBLZXZpbiBXZWxscyA8a2V2aW4ud2VsbHNAbnhwLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlhQIFNlbWljb25kdWN0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19NQUNIX0dQSU9fTFBDMzJYWF9ICisjZGVmaW5lIF9fTUFDSF9HUElPX0xQQzMyWFhfSAorCisvKgorICogTm90ZSEKKyAqIE11eGVkIEdQIHBpbnMgbmVlZCB0byBiZSBzZXR1cCB0byB0aGUgR1Agc3RhdGUgaW4gdGhlIGJvYXJkIGxldmVsCisgKiBjb2RlIHByaW9yIHRvIHVzaW5nIHRoaXMgZHJpdmVyLgorICogR1BJIHBpbnMgOiAyOHhQMyBncm91cAorICogR1BPIHBpbnMgOiAyNHhQMyBncm91cAorICogR1BJTyBwaW5zOiA4eFAwIGdyb3VwLCAyNHhQMSBncm91cCwgMTN4UDIgZ3JvdXAsIDZ4UDMgZ3JvdXAKKyAqLworCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9NQVggOAorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfTUFYIDI0CisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NQVggMTMKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX01BWCA2CisjZGVmaW5lIExQQzMyWFhfR1BJX1AzX01BWCAyOAorI2RlZmluZSBMUEMzMlhYX0dQT19QM19NQVggMjQKKworI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfR1JQIDAKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0dSUCAoTFBDMzJYWF9HUElPX1AwX0dSUCArIExQQzMyWFhfR1BJT19QMF9NQVgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9HUlAgKExQQzMyWFhfR1BJT19QMV9HUlAgKyBMUEMzMlhYX0dQSU9fUDFfTUFYKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfR1JQIChMUEMzMlhYX0dQSU9fUDJfR1JQICsgTFBDMzJYWF9HUElPX1AyX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUElfUDNfR1JQIChMUEMzMlhYX0dQSU9fUDNfR1JQICsgTFBDMzJYWF9HUElPX1AzX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUE9fUDNfR1JQIChMUEMzMlhYX0dQSV9QM19HUlAgKyBMUEMzMlhYX0dQSV9QM19NQVgpCisKKy8qCisgKiBBIHNwZWNpZmljIEdQSU8gY2FuIGJlIHNlbGVjdGVkIHdpdGggdGhpcyBtYWNybworICogaWUsIEdQSU9fMDUgY2FuIGJlIHNlbGVjdGVkIHdpdGggTFBDMzJYWF9HUElPKExQQzMyWFhfR1BJT19QM19HUlAsIDUpCisgKiBTZWUgdGhlIExQQzMyeDAgVXNlcidzIGd1aWRlIGZvciBHUElPIGdyb3VwIG51bWJlcnMKKyAqLworI2RlZmluZSBMUEMzMlhYX0dQSU8oeCwgeSkgKCh4KSArICh5KSkKKworI2VuZGlmIC8qIF9fTUFDSF9HUElPX0xQQzMyWFhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA2N2QwM2RhLi40MGE4YzE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSw3NCArMSBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCi0gKgotICogQXV0aG9yOiBLZXZpbiBXZWxscyA8a2V2aW4ud2VsbHNAbnhwLmNvbT4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlhQIFNlbWljb25kdWN0b3JzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9HUElPX0gKLSNkZWZpbmUgX19BU01fQVJDSF9HUElPX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotLyoKLSAqIE5vdGUhCi0gKiBNdXhlZCBHUCBwaW5zIG5lZWQgdG8gYmUgc2V0dXAgdG8gdGhlIEdQIHN0YXRlIGluIHRoZSBib2FyZCBsZXZlbAotICogY29kZSBwcmlvciB0byB1c2luZyB0aGlzIGRyaXZlci4KLSAqIEdQSSBwaW5zIDogMjh4UDMgZ3JvdXAKLSAqIEdQTyBwaW5zIDogMjR4UDMgZ3JvdXAKLSAqIEdQSU8gcGluczogOHhQMCBncm91cCwgMjR4UDEgZ3JvdXAsIDEzeFAyIGdyb3VwLCA2eFAzIGdyb3VwCi0gKi8KLQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfTUFYIDgKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX01BWCAyNAotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfTUFYIDEzCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QM19NQVggNgotI2RlZmluZSBMUEMzMlhYX0dQSV9QM19NQVggMjgKLSNkZWZpbmUgTFBDMzJYWF9HUE9fUDNfTUFYIDI0Ci0KLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0dSUCAwCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMV9HUlAgKExQQzMyWFhfR1BJT19QMF9HUlAgKyBMUEMzMlhYX0dQSU9fUDBfTUFYKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfR1JQIChMUEMzMlhYX0dQSU9fUDFfR1JQICsgTFBDMzJYWF9HUElPX1AxX01BWCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX0dSUCAoTFBDMzJYWF9HUElPX1AyX0dSUCArIExQQzMyWFhfR1BJT19QMl9NQVgpCi0jZGVmaW5lIExQQzMyWFhfR1BJX1AzX0dSUCAoTFBDMzJYWF9HUElPX1AzX0dSUCArIExQQzMyWFhfR1BJT19QM19NQVgpCi0jZGVmaW5lIExQQzMyWFhfR1BPX1AzX0dSUCAoTFBDMzJYWF9HUElfUDNfR1JQICsgTFBDMzJYWF9HUElfUDNfTUFYKQotCi0vKgotICogQSBzcGVjaWZpYyBHUElPIGNhbiBiZSBzZWxlY3RlZCB3aXRoIHRoaXMgbWFjcm8KLSAqIGllLCBHUElPXzA1IGNhbiBiZSBzZWxlY3RlZCB3aXRoIExQQzMyWFhfR1BJTyhMUEMzMlhYX0dQSU9fUDNfR1JQLCA1KQotICogU2VlIHRoZSBMUEMzMngwIFVzZXIncyBndWlkZSBmb3IgR1BJTyBncm91cCBudW1iZXJzCi0gKi8KLSNkZWZpbmUgTFBDMzJYWF9HUElPKHgsIHkpICgoeCkgKyAoeSkpCi0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIF9fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCi17Ci0JX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fY2Fuc2xlZXAodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gX19ncGlvX2NhbnNsZWVwKGdwaW8pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBfX2dwaW9fdG9faXJxKGdwaW8pOwotfQotCi0jZW5kaWYKKy8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0N2RkNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0IG9mIGJhbmsgMAotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHg4MDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvcGh5MzI1MC5jIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3BoeTMyNTAuYwppbmRleCA3OTkzYjA5Li42ZDJmMGQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvcGh5MzI1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9waHkzMjUwLmMKQEAgLTM3LDYgKzM3LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWxwYzMyeHguaD4KICNpbmNsdWRlICJjb21tb24uaCIKIAogLyoKQEAgLTM4Miw3ICszODMsNyBAQAogCiBNQUNISU5FX1NUQVJUKFBIWTMyNTAsICJQaHl0ZWMgMzI1MCBib2FyZCB3aXRoIHRoZSBMUEMzMjUwIE1pY3JvY29udHJvbGxlciIpCiAJLyogTWFpbnRhaW5lcjogS2V2aW4gV2VsbHMsIE5YUCBTZW1pY29uZHVjdG9ycyAqLwotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBscGMzMnh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBscGMzMnh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmbHBjMzJ4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW1tcC9LY29uZmlnCmluZGV4IDU2ZWY1ZjYuLjMyM2Q0YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvS2NvbmZpZwpAQCAtNzcsNyArNzcsNyBAQAogCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhlIE1hcnZlbGwgUFhBMTY4LWJhc2VkCiAJICBUZXRvbiBCR0EgRGV2ZWxvcG1lbnQgQm9hcmQuCiAKLWNvbmZpZyBNQUNIX1NIRUVWQUQKK2NvbmZpZyBNQUNIX0dQTFVHRAogCWJvb2wgIk1hcnZlbGwncyBQWEExNjggR3VydVBsdWcgRGlzcGxheSAoZ3BsdWdEKSBCb2FyZCIKIAlzZWxlY3QgQ1BVX1BYQTE2OAogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1tbXAvTWFrZWZpbGUKaW5kZXggYjBhYzk0Mi4uYmEyNTRhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvTWFrZWZpbGUKQEAgLTcsNyArNyw3IEBACiAjIFNvQyBzdXBwb3J0CiBvYmotJChDT05GSUdfQ1BVX1BYQTE2OCkJKz0gcHhhMTY4Lm8gaXJxLXB4YTE2OC5vCiBvYmotJChDT05GSUdfQ1BVX1BYQTkxMCkJKz0gcHhhOTEwLm8gaXJxLXB4YTE2OC5vCi1vYmotJChDT05GSUdfQ1BVX01NUDIpCQkrPSBtbXAyLm8gaXJxLW1tcDIubworb2JqLSQoQ09ORklHX0NQVV9NTVAyKQkJKz0gbW1wMi5vIGlycS1tbXAyLm8gc3JhbS5vCiAKICMgYm9hcmQgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfQVNQRU5JVEUpCSs9IGFzcGVuaXRlLm8KQEAgLTE5LDQgKzE5LDQgQEAKIG9iai0kKENPTkZJR19NQUNIX0ZMSU5UKQkrPSBmbGludC5vCiBvYmotJChDT05GSUdfTUFDSF9NQVJWRUxMX0pBU1BFUikgKz0gamFzcGVyLm8KIG9iai0kKENPTkZJR19NQUNIX1RFVE9OX0JHQSkJKz0gdGV0b25fYmdhLm8KLW9iai0kKENPTkZJR19NQUNIX1NIRUVWQUQpCSs9IGdwbHVnZC5vCitvYmotJChDT05GSUdfTUFDSF9HUExVR0QpCSs9IGdwbHVnZC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9hc3Blbml0ZS5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvYXNwZW5pdGUuYwppbmRleCA0OWM1ZDZkLi43YTYwYmJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9hc3Blbml0ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2FzcGVuaXRlLmMKQEAgLTgsNyArOCw3IEBACiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqICBwdWJsaXNoaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xNywxMyArMTcsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8bWFjaC9hZGRyLW1hcC5oPgogI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTE2OC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMTY4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8dmlkZW8vcHhhMTY4ZmIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPHBsYXQvcHhhMjd4X2tleXBhZC5oPgpAQCAtMTY3LDggKzE2Nyw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfcGxhdGZvcm1fZGF0YSBhc3Blbml0ZV9uYW5kX2luZm8gPSB7CiAJLmVuYWJsZV9hcmJpdGVyCT0gMSwKLQkucGFydHMJCT0gYXNwZW5pdGVfbmFuZF9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoYXNwZW5pdGVfbmFuZF9wYXJ0aXRpb25zKSwKKwkubnVtX2NzID0gMSwKKwkucGFydHNbMF0JPSBhc3Blbml0ZV9uYW5kX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzWzBdCT0gQVJSQVlfU0laRShhc3Blbml0ZV9uYW5kX3BhcnRpdGlvbnMpLAogfTsKIAogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBhc3Blbml0ZV9pMmNfaW5mb1tdIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9icm93bnN0b25lLmMgYi9hcmNoL2FybS9tYWNoLW1tcC9icm93bnN0b25lLmMKaW5kZXggYzc5MTYyYS4uOTgzY2ZiMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvYnJvd25zdG9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2Jyb3duc3RvbmUuYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21heDg2NDkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZml4ZWQuaD4KQEAgLTE4Niw2ICsxODUsMTUgQEAKIAkJfCBQWEFfRkxBR19TRF84X0JJVF9DQVBBQkxFX1NMT1QsCiB9OwogCitzdGF0aWMgc3RydWN0IHNyYW1fcGxhdGRhdGEgbW1wMl9hc3JhbV9wbGF0ZGF0YSA9IHsKKwkucG9vbF9uYW1lCT0gImFzcmFtIiwKKwkuZ3JhbnVsYXJpdHkJPSBTUkFNX0dSQU5VTEFSSVRZLAorfTsKKworc3RhdGljIHN0cnVjdCBzcmFtX3BsYXRkYXRhIG1tcDJfaXNyYW1fcGxhdGRhdGEgPSB7CisJLnBvb2xfbmFtZQk9ICJpc3JhbSIsCisJLmdyYW51bGFyaXR5CT0gU1JBTV9HUkFOVUxBUklUWSwKK307CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBicm93bnN0b25lX2luaXQodm9pZCkKIHsKQEAgLTE5Nyw2ICsyMDUsOCBAQAogCW1tcDJfYWRkX3R3c2koMSwgTlVMTCwgQVJSQVlfQU5EX1NJWkUoYnJvd25zdG9uZV90d3NpMV9pbmZvKSk7CiAJbW1wMl9hZGRfc2Rob3N0KDAsICZtbXAyX3NkaF9wbGF0ZGF0YV9tbWMwKTsgLyogU0QvTU1DICovCiAJbW1wMl9hZGRfc2Rob3N0KDIsICZtbXAyX3NkaF9wbGF0ZGF0YV9tbWMyKTsgLyogZU1NQyAqLworCW1tcDJfYWRkX2FzcmFtKCZtbXAyX2FzcmFtX3BsYXRkYXRhKTsKKwltbXAyX2FkZF9pc3JhbSgmbW1wMl9pc3JhbV9wbGF0ZGF0YSk7CiAKIAkvKiBlbmFibGUgNXYgcmVndWxhdG9yICovCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZicm93bnN0b25lX3ZfNXZwX2RldmljZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1tbXAvY2xvY2suaAppbmRleCAzMTQzZTk5Li4xNDliMzBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2Nsb2NrLmgKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2RlZmluZSBBUEJDX0NMSyhfbmFtZSwgX3JlZywgX2ZuY2xrc2VsLCBfcmF0ZSkJCQlcCiBzdHJ1Y3QgY2xrIGNsa18jI19uYW1lID0gewkJCQkJXAotCQkuY2xrX3JzdAk9ICh2b2lkIF9faW9tZW0gKilBUEJDXyMjX3JlZywJXAorCQkuY2xrX3JzdAk9IEFQQkNfIyNfcmVnLAkJCVwKIAkJLmZuY2xrc2VsCT0gX2ZuY2xrc2VsLAkJCVwKIAkJLnJhdGUJCT0gX3JhdGUsCQkJXAogCQkub3BzCQk9ICZhcGJjX2Nsa19vcHMsCQlcCkBAIC0zOCw3ICszOCw3IEBACiAKICNkZWZpbmUgQVBCQ19DTEtfT1BTKF9uYW1lLCBfcmVnLCBfZm5jbGtzZWwsIF9yYXRlLCBfb3BzKQlcCiBzdHJ1Y3QgY2xrIGNsa18jI19uYW1lID0gewkJCQkJXAotCQkuY2xrX3JzdAk9ICh2b2lkIF9faW9tZW0gKilBUEJDXyMjX3JlZywJXAorCQkuY2xrX3JzdAk9IEFQQkNfIyNfcmVnLAkJCVwKIAkJLmZuY2xrc2VsCT0gX2ZuY2xrc2VsLAkJCVwKIAkJLnJhdGUJCT0gX3JhdGUsCQkJXAogCQkub3BzCQk9IF9vcHMsCQkJCVwKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogI2RlZmluZSBBUE1VX0NMSyhfbmFtZSwgX3JlZywgX2V2YWwsIF9yYXRlKQkJCVwKIHN0cnVjdCBjbGsgY2xrXyMjX25hbWUgPSB7CQkJCQlcCi0JCS5jbGtfcnN0CT0gKHZvaWQgX19pb21lbSAqKUFQTVVfIyNfcmVnLAlcCisJCS5jbGtfcnN0CT0gQVBNVV8jI19yZWcsCQkJXAogCQkuZW5hYmxlX3ZhbAk9IF9ldmFsLAkJCVwKIAkJLnJhdGUJCT0gX3JhdGUsCQkJXAogCQkub3BzCQk9ICZhcG11X2Nsa19vcHMsCQlcCkBAIC01NCw3ICs1NCw3IEBACiAKICNkZWZpbmUgQVBNVV9DTEtfT1BTKF9uYW1lLCBfcmVnLCBfZXZhbCwgX3JhdGUsIF9vcHMpCQlcCiBzdHJ1Y3QgY2xrIGNsa18jI19uYW1lID0gewkJCQkJXAotCQkuY2xrX3JzdAk9ICh2b2lkIF9faW9tZW0gKilBUE1VXyMjX3JlZywJXAorCQkuY2xrX3JzdAk9IEFQTVVfIyNfcmVnLAkJCVwKIAkJLmVuYWJsZV92YWwJPSBfZXZhbCwJCQlcCiAJCS5yYXRlCQk9IF9yYXRlLAkJCVwKIAkJLm9wcwkJPSBfb3BzLAkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtbW1wL2NvbW1vbi5jCmluZGV4IDBlYzBjYTguLjU3MjA2NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2NvbW1vbi5jCkBAIC0yNywxMiArMjcsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgc3RhbmRhcmRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJewogCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVBCX1BIWVNfQkFTRSksCi0JCS52aXJ0dWFsCT0gQVBCX1ZJUlRfQkFTRSwKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylBUEJfVklSVF9CQVNFLAogCQkubGVuZ3RoCQk9IEFQQl9QSFlTX1NJWkUsCiAJCS50eXBlCQk9IE1UX0RFVklDRSwKIAl9LCB7CiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBWElfUEhZU19CQVNFKSwKLQkJLnZpcnR1YWwJPSBBWElfVklSVF9CQVNFLAorCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKUFYSV9WSVJUX0JBU0UsCiAJCS5sZW5ndGgJCT0gQVhJX1BIWVNfU0laRSwKIAkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9ncGx1Z2QuYyBiL2FyY2gvYXJtL21hY2gtbW1wL2dwbHVnZC5jCmluZGV4IDk4ZTI1ZDkuLjY5MTU2NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2dwbHVnZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2dwbHVnZC5jCkBAIC05LDExICs5LDExIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMTY4Lmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMTY4Lmg+CiAKQEAgLTE4OCw3ICsxODgsNyBAQAogCXB4YTE2OF9hZGRfZXRoKCZncGx1Z2RfZXRoX3BsYXRmb3JtX2RhdGEpOwogfQogCi1NQUNISU5FX1NUQVJUKFNIRUVWQUQsICJQWEExNjgtYmFzZWQgR3VydVBsdWcgRGlzcGxheSAoZ3BsdWdEKSBQbGF0Zm9ybSIpCitNQUNISU5FX1NUQVJUKEdQTFVHRCwgIlBYQTE2OC1iYXNlZCBHdXJ1UGx1ZyBEaXNwbGF5IChncGx1Z0QpIFBsYXRmb3JtIikKIAkubWFwX2lvCQk9IG1tcF9tYXBfaW8sCiAJLm5yX2lycXMJPSBJUlFfQk9BUkRfU1RBUlQsCiAJLmluaXRfaXJxICAgICAgID0gcHhhMTY4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL2FkZHItbWFwLmggYi9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvYWRkci1tYXAuaAppbmRleCAzMjU0MDg5Li4zZTQwNGFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvYWRkci1tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvYWRkci1tYXAuaApAQCAtMTEsNiArMTEsMTIgQEAKICNpZm5kZWYgX19BU01fTUFDSF9BRERSX01BUF9ICiAjZGVmaW5lIF9fQVNNX01BQ0hfQUREUl9NQVBfSAogCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKyNkZWZpbmUgSU9NRU0oeCkJKCh2b2lkIF9faW9tZW0gKikoeCkpCisjZWxzZQorI2RlZmluZSBJT01FTSh4KQkoeCkKKyNlbmRpZgorCiAvKiBBUEIgLSBBcHBsaWNhdGlvbiBTdWJzeXN0ZW0gUGVyaXBoZXJhbCBCdXMKICAqCiAgKiBOT1RFOiB0aGUgRE1BIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGFyZSBhY3R1YWxseSBvbiB0aGUgQVhJIGZhYnJpYyAjMQpAQCAtMTgsMTEgKzI0LDExIEBACiAgKiBwZXJpcGhlcmFscyBvbiBBUEIsIGxldCdzIGNvdW50IGl0IGludG8gdGhlIEFCUCBtYXBwaW5nIGFyZWEuCiAgKi8KICNkZWZpbmUgQVBCX1BIWVNfQkFTRQkJMHhkNDAwMDAwMAotI2RlZmluZSBBUEJfVklSVF9CQVNFCQkweGZlMDAwMDAwCisjZGVmaW5lIEFQQl9WSVJUX0JBU0UJCUlPTUVNKDB4ZmUwMDAwMDApCiAjZGVmaW5lIEFQQl9QSFlTX1NJWkUJCTB4MDAyMDAwMDAKIAogI2RlZmluZSBBWElfUEhZU19CQVNFCQkweGQ0MjAwMDAwCi0jZGVmaW5lIEFYSV9WSVJUX0JBU0UJCTB4ZmUyMDAwMDAKKyNkZWZpbmUgQVhJX1ZJUlRfQkFTRQkJSU9NRU0oMHhmZTIwMDAwMCkKICNkZWZpbmUgQVhJX1BIWVNfU0laRQkJMHgwMDIwMDAwMAogCiAvKiBTdGF0aWMgTWVtb3J5IENvbnRyb2xsZXIgLSBDaGlwIFNlbGVjdCAwIGFuZCAxICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDdlMmViZDMuLmI2ZjE0ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2FkZHItbWFwLmg+CiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQlsZHIJXHJwLCA9QVBCX1BIWVNfQkFTRQkJQCBwaHlzaWNhbAogCQlsZHIJXHJ2LCA9QVBCX1ZJUlRfQkFTRQkJQCB2aXJ0dWFsCiAJCW9ycglccnAsIFxycCwgIzB4MDAwMTcwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9ncGlvLXB4YS5oIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL2dwaW8tcHhhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0ZWVhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9ncGlvLXB4YS5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX19BU01fTUFDSF9HUElPX1BYQV9ICisjZGVmaW5lIF9fQVNNX01BQ0hfR1BJT19QWEFfSAorCisjaW5jbHVkZSA8bWFjaC9hZGRyLW1hcC5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCisjZGVmaW5lIEdQSU9fUkVHU19WSVJUCShBUEJfVklSVF9CQVNFICsgMHgxOTAwMCkKKworI2RlZmluZSBCQU5LX09GRihuKQkoKChuKSA8IDMpID8gKG4pIDw8IDIgOiAweDEwMCArICgoKG4pIC0gMykgPDwgMikpCisjZGVmaW5lIEdQSU9fUkVHKHgpCShHUElPX1JFR1NfVklSVCArICh4KSkKKworI2RlZmluZSBOUl9CVUlMVElOX0dQSU8JCUlSUV9HUElPX05VTQorCisjZGVmaW5lIGdwaW9fdG9fYmFuayhncGlvKQkoKGdwaW8pID4+IDUpCisKKy8qIE5PVEU6IHRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCBoZXJlIHRvIG1ha2Ugb3B0aW1pemF0aW9uIG9mCisgKiBncGlvX3tnZXQsc2V0fV92YWx1ZSgpIHRvIHdvcmsgd2hlbiAnZ3BpbycgaXMgYSBjb25zdGFudC4KKyAqIFVzYWdlIG9mIHRoZXNlIG1hY3JvcyBvdGhlcndpc2UgaXMgbm8gbG9uZ2VyIHJlY29tbWVuZGVkLAorICogdXNlIGdlbmVyaWMgR1BJTyBBUEkgd2hlbmV2ZXIgcG9zc2libGUuCisgKi8KKyNkZWZpbmUgR1BJT19iaXQoZ3BpbykJKDEgPDwgKChncGlvKSAmIDB4MWYpKQorCisjZGVmaW5lIEdQTFIoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKGdwaW9fdG9fYmFuayh4KSkgKyAweDAwKQorI2RlZmluZSBHUERSKHgpCQlHUElPX1JFRyhCQU5LX09GRihncGlvX3RvX2JhbmsoeCkpICsgMHgwYykKKyNkZWZpbmUgR1BTUih4KQkJR1BJT19SRUcoQkFOS19PRkYoZ3Bpb190b19iYW5rKHgpKSArIDB4MTgpCisjZGVmaW5lIEdQQ1IoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKGdwaW9fdG9fYmFuayh4KSkgKyAweDI0KQorCisjaW5jbHVkZSA8cGxhdC9ncGlvLXB4YS5oPgorCisjZW5kaWYgLyogX19BU01fTUFDSF9HUElPX1BYQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA3YmZiODI3Li42ODEyNjIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEsMzYgKzEsMTMgQEAKICNpZm5kZWYgX19BU01fTUFDSF9HUElPX0gKICNkZWZpbmUgX19BU01fTUFDSF9HUElPX0gKIAotI2luY2x1ZGUgPG1hY2gvYWRkci1tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CiAKLSNkZWZpbmUgR1BJT19SRUdTX1ZJUlQJKEFQQl9WSVJUX0JBU0UgKyAweDE5MDAwKQotCi0jZGVmaW5lIEJBTktfT0ZGKG4pCSgoKG4pIDwgMykgPyAobikgPDwgMiA6IDB4MTAwICsgKCgobikgLSAzKSA8PCAyKSkKLSNkZWZpbmUgR1BJT19SRUcoeCkJKCooKHZvbGF0aWxlIHUzMiAqKShHUElPX1JFR1NfVklSVCArICh4KSkpKQotCi0jZGVmaW5lIE5SX0JVSUxUSU5fR1BJTwkJSVJRX0dQSU9fTlVNCi0KLSNkZWZpbmUgZ3Bpb190b19iYW5rKGdwaW8pCSgoZ3BpbykgPj4gNSkKICNkZWZpbmUgZ3Bpb190b19pcnEoZ3BpbykJKElSUV9HUElPX1NUQVJUICsgKGdwaW8pKQogI2RlZmluZSBpcnFfdG9fZ3BpbyhpcnEpCSgoaXJxKSAtIElSUV9HUElPX1NUQVJUKQogCi0KICNkZWZpbmUgX19ncGlvX2lzX2ludmVydGVkKGdwaW8pCSgwKQogI2RlZmluZSBfX2dwaW9faXNfb2NjdXBpZWQoZ3BpbykJKDApCiAKLS8qIE5PVEU6IHRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCBoZXJlIHRvIG1ha2Ugb3B0aW1pemF0aW9uIG9mCi0gKiBncGlvX3tnZXQsc2V0fV92YWx1ZSgpIHRvIHdvcmsgd2hlbiAnZ3BpbycgaXMgYSBjb25zdGFudC4KLSAqIFVzYWdlIG9mIHRoZXNlIG1hY3JvcyBvdGhlcndpc2UgaXMgbm8gbG9uZ2VyIHJlY29tbWVuZGVkLAotICogdXNlIGdlbmVyaWMgR1BJTyBBUEkgd2hlbmV2ZXIgcG9zc2libGUuCi0gKi8KLSNkZWZpbmUgR1BJT19iaXQoZ3BpbykJKDEgPDwgKChncGlvKSAmIDB4MWYpKQotCi0jZGVmaW5lIEdQTFIoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKGdwaW9fdG9fYmFuayh4KSkgKyAweDAwKQotI2RlZmluZSBHUERSKHgpCQlHUElPX1JFRyhCQU5LX09GRihncGlvX3RvX2JhbmsoeCkpICsgMHgwYykKLSNkZWZpbmUgR1BTUih4KQkJR1BJT19SRUcoQkFOS19PRkYoZ3Bpb190b19iYW5rKHgpKSArIDB4MTgpCi0jZGVmaW5lIEdQQ1IoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKGdwaW9fdG9fYmFuayh4KSkgKyAweDI0KQotCiAjaW5jbHVkZSA8cGxhdC9ncGlvLmg+CiAjZW5kaWYgLyogX19BU01fTUFDSF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4YjUwYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX01BQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fTUFDSF9NRU1PUllfSAotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmIC8qIF9fQVNNX01BQ0hfTUVNT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9tbXAyLmggYi9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvbW1wMi5oCmluZGV4IGRlN2I4ODguLjJmN2IyZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9tbXAyLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL21tcDIuaApAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9weGEtaTJjLmg+CiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+CisjaW5jbHVkZSA8bWFjaC9zcmFtLmg+CiAKIGV4dGVybiBzdHJ1Y3QgcHhhX2RldmljZV9kZXNjIG1tcDJfZGV2aWNlX3VhcnQxOwogZXh0ZXJuIHN0cnVjdCBweGFfZGV2aWNlX2Rlc2MgbW1wMl9kZXZpY2VfdWFydDI7CkBAIC0yOCw2ICsyOSw4IEBACiBleHRlcm4gc3RydWN0IHB4YV9kZXZpY2VfZGVzYyBtbXAyX2RldmljZV9zZGgxOwogZXh0ZXJuIHN0cnVjdCBweGFfZGV2aWNlX2Rlc2MgbW1wMl9kZXZpY2Vfc2RoMjsKIGV4dGVybiBzdHJ1Y3QgcHhhX2RldmljZV9kZXNjIG1tcDJfZGV2aWNlX3NkaDM7CitleHRlcm4gc3RydWN0IHB4YV9kZXZpY2VfZGVzYyBtbXAyX2RldmljZV9hc3JhbTsKK2V4dGVybiBzdHJ1Y3QgcHhhX2RldmljZV9kZXNjIG1tcDJfZGV2aWNlX2lzcmFtOwogCiBzdGF0aWMgaW5saW5lIGludCBtbXAyX2FkZF91YXJ0KGludCBpZCkKIHsKQEAgLTg1LDUgKzg4LDE1IEBACiAJcmV0dXJuIHB4YV9yZWdpc3Rlcl9kZXZpY2UoZCwgZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1tcDJfYWRkX2FzcmFtKHN0cnVjdCBzcmFtX3BsYXRkYXRhICpkYXRhKQoreworCXJldHVybiBweGFfcmVnaXN0ZXJfZGV2aWNlKCZtbXAyX2RldmljZV9hc3JhbSwgZGF0YSwgc2l6ZW9mKCpkYXRhKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1tcDJfYWRkX2lzcmFtKHN0cnVjdCBzcmFtX3BsYXRkYXRhICpkYXRhKQoreworCXJldHVybiBweGFfcmVnaXN0ZXJfZGV2aWNlKCZtbXAyX2RldmljZV9pc3JhbSwgZGF0YSwgc2l6ZW9mKCpkYXRhKSk7Cit9CisKICNlbmRpZiAvKiBfX0FTTV9NQUNIX01NUDJfSCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvc3JhbS5oIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL3NyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzllMGZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL3NyYW0uaApAQCAtMCwwICsxLDM1IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9zcmFtLmgKKyAqCisgKiAgU1JBTSBNZW1vcnkgTWFuYWdlbWVudAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEgTWFydmVsbCBTZW1pY29uZHVjdG9ycyBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1NSQU1fSAorI2RlZmluZSBfX0FTTV9BUkNIX1NSQU1fSAorCisjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KKworLyogQVJCSVRSQVJZOiAgU1JBTSBhbGxvY2F0aW9ucyBhcmUgbXVsdGlwbGVzIG9mIHRoaXMgMl5OIHNpemUgKi8KKyNkZWZpbmUgU1JBTV9HUkFOVUxBUklUWQk1MTIKKworZW51bSBzcmFtX3R5cGUgeworCU1NUF9TUkFNX1VOREVGSU5FRCA9IDAsCisJTU1QX0FTUkFNLAorCU1NUF9JU1JBTSwKK307CisKK3N0cnVjdCBzcmFtX3BsYXRkYXRhIHsKKwljaGFyICpwb29sX25hbWU7CisJaW50IGdyYW51bGFyaXR5OworfTsKKworZXh0ZXJuIHN0cnVjdCBnZW5fcG9vbCAqc3JhbV9nZXRfZ3Bvb2woY2hhciAqcG9vbF9uYW1lKTsKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfU1JBTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9qYXNwZXIuYyBiL2FyY2gvYXJtL21hY2gtbW1wL2phc3Blci5jCmluZGV4IDVkNjQyMWQuLjhiZmFjNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2phc3Blci5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2phc3Blci5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWF4ODY0OS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTI1Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9tbXAyLmMgYi9hcmNoL2FybS9tYWNoLW1tcC9tbXAyLmMKaW5kZXggMDc5YzE4OC4uNWRkMWQ0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvbW1wMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL21tcDIuYwpAQCAtOSw3ICs5LDYgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjUsNyArMjQsNyBAQAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tcHhhLmg+CiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bWFjaC9tbXAyLmg+CiAKQEAgLTg3LDcgKzg2LDggQEAKIAogdm9pZCBtbXAyX2NsZWFyX3BtaWNfaW50KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBtZnByX3BtaWMsIGRhdGE7CisJdm9pZCBfX2lvbWVtICptZnByX3BtaWM7CisJdW5zaWduZWQgbG9uZyBkYXRhOwogCiAJbWZwcl9wbWljID0gQVBCX1ZJUlRfQkFTRSArIDB4MWUwMDAgKyAweDJjNDsKIAlkYXRhID0gX19yYXdfcmVhZGwobWZwcl9wbWljKTsKQEAgLTIyNiw0ICsyMjYsNyBAQAogTU1QMl9ERVZJQ0Uoc2RoMSwgInNkaGNpLXB4YXYzIiwgMSwgTU1DMiwgMHhkNDI4MDgwMCwgMHgxMjApOwogTU1QMl9ERVZJQ0Uoc2RoMiwgInNkaGNpLXB4YXYzIiwgMiwgTU1DMywgMHhkNDI4MTAwMCwgMHgxMjApOwogTU1QMl9ERVZJQ0Uoc2RoMywgInNkaGNpLXB4YXYzIiwgMywgTU1DNCwgMHhkNDI4MTgwMCwgMHgxMjApOworTU1QMl9ERVZJQ0UoYXNyYW0sICJhc3JhbSIsIC0xLCBOT05FLCAweGUwMDAwMDAwLCAweDQwMDApOworLyogMHhkMTAwMDAwMCB+IDB4ZDEwMWZmZmYgaXMgcmVzZXJ2ZWQgZm9yIHNlY3VyZSBwcm9jZXNzb3IgKi8KK01NUDJfREVWSUNFKGlzcmFtLCAiaXNyYW0iLCAtMSwgTk9ORSwgMHhkMTAyMDAwMCwgMHgxODAwMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvcHhhMTY4LmMKaW5kZXggYjJiMjgwYy4uNzZjYTE1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvcHhhMTY4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvcHhhMTY4LmMKQEAgLTcsNyArNyw2IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTIxLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtYXBiYy5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1hcG11Lmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLXB4YS5oPgogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvcHhhOTEwLmMKaW5kZXggMTQ2NDYwNy4uNGViYmZiYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvcHhhOTEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvcHhhOTEwLmMKQEAgLTcsNyArNyw2IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTIwLDcgKzE5LDcgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtYXBtdS5oPgogI2luY2x1ZGUgPG1hY2gvY3B1dHlwZS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1weGEuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvbWZwLmg+CiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9zcmFtLmMgYi9hcmNoL2FybS9tYWNoLW1tcC9zcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwNGY5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL3NyYW0uYwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLW1tcC9zcmFtLmMKKyAqCisgKiAgYmFzZWQgb24gbWFjaC1kYXZpbmNpL3NyYW0uYyAtIERhVmluY2kgc2ltcGxlIFNSQU0gYWxsb2NhdG9yCisgKgorICogIENvcHlyaWdodCAoYykgMjAxMSBNYXJ2ZWxsIFNlbWljb25kdWN0b3JzIEluYy4KKyAqICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogIEFkZCBmb3IgbW1wIHNyYW0gc3VwcG9ydCAtIExlbyBZYW4gPGxlb3lAbWFydmVsbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgorCisjaW5jbHVkZSA8bWFjaC9zcmFtLmg+CisKK3N0cnVjdCBzcmFtX2JhbmtfaW5mbyB7CisJY2hhciAqcG9vbF9uYW1lOworCXN0cnVjdCBnZW5fcG9vbCAqZ3Bvb2w7CisJaW50IGdyYW51bGFyaXR5OworCisJcGh5c19hZGRyX3Qgc3JhbV9waHlzOworCXZvaWQgX19pb21lbSAqc3JhbV92aXJ0OworCXUzMiBzcmFtX3NpemU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Cit9OworCitzdGF0aWMgREVGSU5FX01VVEVYKHNyYW1fbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHNyYW1fYmFua19saXN0KTsKKworc3RydWN0IGdlbl9wb29sICpzcmFtX2dldF9ncG9vbChjaGFyICpwb29sX25hbWUpCit7CisJc3RydWN0IHNyYW1fYmFua19pbmZvICppbmZvID0gTlVMTDsKKworCWlmICghcG9vbF9uYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCW11dGV4X2xvY2soJnNyYW1fbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZzcmFtX2JhbmtfbGlzdCwgbm9kZSkKKwkJaWYgKCFzdHJjbXAocG9vbF9uYW1lLCBpbmZvLT5wb29sX25hbWUpKQorCQkJYnJlYWs7CisKKwltdXRleF91bmxvY2soJnNyYW1fbG9jayk7CisKKwlpZiAoJmluZm8tPm5vZGUgPT0gJnNyYW1fYmFua19saXN0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpbmZvLT5ncG9vbDsKK30KK0VYUE9SVF9TWU1CT0woc3JhbV9nZXRfZ3Bvb2wpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzcmFtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNyYW1fcGxhdGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNyYW1fYmFua19pbmZvICppbmZvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQgPSAwOworCisJaWYgKCFwZGF0YSAmJiAhcGRhdGEtPnBvb2xfbmFtZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gbWVtb3J5IHJlc291cmNlIGRlZmluZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXJlc291cmNlX3NpemUocmVzKSkKKwkJcmV0dXJuIDA7CisKKwlpbmZvLT5zcmFtX3BoeXMgICA9IChwaHlzX2FkZHJfdClyZXMtPnN0YXJ0OworCWluZm8tPnNyYW1fc2l6ZSAgID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCWluZm8tPnNyYW1fdmlydCAgID0gaW9yZW1hcChpbmZvLT5zcmFtX3BoeXMsIGluZm8tPnNyYW1fc2l6ZSk7CisJaW5mby0+cG9vbF9uYW1lCSAgPSBrc3RyZHVwKHBkYXRhLT5wb29sX25hbWUsIEdGUF9LRVJORUwpOworCWluZm8tPmdyYW51bGFyaXR5ID0gcGRhdGEtPmdyYW51bGFyaXR5OworCisJaW5mby0+Z3Bvb2wgPSBnZW5fcG9vbF9jcmVhdGUoaWxvZzIoaW5mby0+Z3JhbnVsYXJpdHkpLCAtMSk7CisJaWYgKCFpbmZvLT5ncG9vbCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjcmVhdGUgcG9vbCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGNyZWF0ZV9wb29sX2VycjsKKwl9CisKKwlyZXQgPSBnZW5fcG9vbF9hZGRfdmlydChpbmZvLT5ncG9vbCwgKHVuc2lnbmVkIGxvbmcpaW5mby0+c3JhbV92aXJ0LAorCQkJCWluZm8tPnNyYW1fcGh5cywgaW5mby0+c3JhbV9zaXplLCAtMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWRkIG5ldyBjaHVuayBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFkZF9jaHVua19lcnI7CisJfQorCisJbXV0ZXhfbG9jaygmc3JhbV9sb2NrKTsKKwlsaXN0X2FkZCgmaW5mby0+bm9kZSwgJnNyYW1fYmFua19saXN0KTsKKwltdXRleF91bmxvY2soJnNyYW1fbG9jayk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpbml0aWFsaXplZFxuIik7CisJcmV0dXJuIDA7CisKK2FkZF9jaHVua19lcnI6CisJZ2VuX3Bvb2xfZGVzdHJveShpbmZvLT5ncG9vbCk7CitjcmVhdGVfcG9vbF9lcnI6CisJaW91bm1hcChpbmZvLT5zcmFtX3ZpcnQpOworCWtmcmVlKGluZm8tPnBvb2xfbmFtZSk7CitvdXQ6CisJa2ZyZWUoaW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc3JhbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3JhbV9iYW5rX2luZm8gKmluZm87CisKKwlpbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZzcmFtX2xvY2spOworCWxpc3RfZGVsKCZpbmZvLT5ub2RlKTsKKwltdXRleF91bmxvY2soJnNyYW1fbG9jayk7CisKKwlnZW5fcG9vbF9kZXN0cm95KGluZm8tPmdwb29sKTsKKwlpb3VubWFwKGluZm8tPnNyYW1fdmlydCk7CisJa2ZyZWUoaW5mby0+cG9vbF9uYW1lKTsKKwlrZnJlZShpbmZvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgc3JhbV9pZF90YWJsZVtdID0geworCXsgImFzcmFtIiwgTU1QX0FTUkFNIH0sCisJeyAiaXNyYW0iLCBNTVBfSVNSQU0gfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNyYW1fZHJpdmVyID0geworCS5wcm9iZQkJPSBzcmFtX3Byb2JlLAorCS5yZW1vdmUJCT0gc3JhbV9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gIm1tcC1zcmFtIiwKKwl9LAorCS5pZF90YWJsZQk9IHNyYW1faWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzcmFtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzcmFtX2RyaXZlcik7Cit9Citjb3JlX2luaXRjYWxsKHNyYW1faW5pdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL3Rhdm9yZXZiLmMgYi9hcmNoL2FybS9tYWNoLW1tcC90YXZvcmV2Yi5jCmluZGV4IGMyOTZiNzUuLmViNWJlODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL3Rhdm9yZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvdGF2b3JldmIuYwpAQCAtNywxOCArNywxOCBAQAogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiAgcHVibGlzaGhlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPG1hY2gvYWRkci1tYXAuaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGE5MTAuaD4KICNpbmNsdWRlIDxtYWNoL3B4YTkxMC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiY29tbW9uLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKaW5kZXggNDI4NWRmZC4uNGFkMzk2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKQEAgLTE1LDYgKzE1LDggQEAKIG9iai0kKENPTkZJR19NU01fU01EKSArPSBsYXN0X3JhZGlvX2xvZy5vCiBvYmotJChDT05GSUdfTVNNX1NDTSkgKz0gc2NtLm8gc2NtLWJvb3QubwogCitDRkxBR1Nfc2NtLm8gOj0kKGNhbGwgYXMtaW5zdHIsLmFyY2hfZXh0ZW5zaW9uIHNlYywtRFJFUVVJUkVTX1NFQz0xKQorCiBvYmotJChDT05GSUdfSE9UUExVR19DUFUpICs9IGhvdHBsdWcubwogb2JqLSQoQ09ORklHX1NNUCkgKz0gaGVhZHNtcC5vIHBsYXRzbXAubwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1oYWxpYnV0LmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1oYWxpYnV0LmMKaW5kZXggZjgxZWYxZi4uYTYwYWI2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtaGFsaWJ1dC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLWhhbGlidXQuYwpAQCAtOTMsNyArOTMsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEhBTElCVVQsICJIYWxpYnV0IEJvYXJkIChRQ1QgU1VSRjcyMDBBKSIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuZml4dXAJCT0gaGFsaWJ1dF9maXh1cCwKIAkubWFwX2lvCQk9IGhhbGlidXRfbWFwX2lvLAogCS5pbml0X2lycQk9IGhhbGlidXRfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tYWhpbWFoaS5jIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbWFoaW1haGkuYwppbmRleCAxZGYxNWFhLi41YTQ4ODJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tYWhpbWFoaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1haGltYWhpLmMKQEAgLTc0LDcgKzc0LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIG1zbV90aW1lcjsKIAogTUFDSElORV9TVEFSVChNQUhJTUFISSwgIm1haGltYWhpIikKLQkuYm9vdF9wYXJhbXMJPSAweDIwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSBtYWhpbWFoaV9maXh1cCwKIAkubWFwX2lvCQk9IG1haGltYWhpX21hcF9pbywKIAkuaW5pdF9pcnEJPSBtc21faW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc203eDI3LmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc203eDI3LmMKaW5kZXggYzAzZjI2OS4uNmQ4NGVlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtN3gyNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTd4MjcuYwpAQCAtMTMsNyArMTMsNyBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0zNCw3ICszNCw2IEBACiAKICNpbmNsdWRlIDxtYWNoL3ZyZWcuaD4KICNpbmNsdWRlIDxtYWNoL21wcC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogCkBAIC0xMzAsNyArMTI5LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChNU003WDI3X1NVUkYsICJRQ1QgTVNNN3gyNyBTVVJGIikKLQkuYm9vdF9wYXJhbXMJPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBtc203eDJ4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBtc203eDJ4X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBtc203eDJ4X2luaXQsCkBAIC0xMzgsNyArMTM3LDcgQEAKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoTVNNN1gyN19GRkEsICJRQ1QgTVNNN3gyNyBGRkEiKQotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG1zbTd4MnhfbWFwX2lvLAogCS5pbml0X2lycQk9IG1zbTd4MnhfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG1zbTd4MnhfaW5pdCwKQEAgLTE0Niw3ICsxNDUsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChNU003WDI1X1NVUkYsICJRQ1QgTVNNN3gyNSBTVVJGIikKLQkuYm9vdF9wYXJhbXMJPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBtc203eDJ4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBtc203eDJ4X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBtc203eDJ4X2luaXQsCkBAIC0xNTQsNyArMTUzLDcgQEAKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoTVNNN1gyNV9GRkEsICJRQ1QgTVNNN3gyNSBGRkEiKQotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG1zbTd4MnhfbWFwX2lvLAogCS5pbml0X2lycQk9IG1zbTd4MnhfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG1zbTd4MnhfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTd4MzAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTd4MzAuYwppbmRleCBkMWU0Y2M4Li5kYjgxZWQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc203eDMwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtN3gzMC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiAgKiAwMjExMC0xMzAxLCBVU0EuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KQEAgLTQzLDggKzQyLDggQEAKIAogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgbXNtX3RpbWVyOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgbXNtN3gzMF9maXh1cChzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWcsCi0JCQkgY2hhciAqKmNtZGxpbmUsIHN0cnVjdCBtZW1pbmZvICptaSkKK3N0YXRpYyB2b2lkIF9faW5pdCBtc203eDMwX2ZpeHVwKHN0cnVjdCB0YWcgKnRhZywgY2hhciAqKmNtZGxpbmUsCisJCXN0cnVjdCBtZW1pbmZvICptaSkKIHsKIAlmb3IgKDsgdGFnLT5oZHIuc2l6ZTsgdGFnID0gdGFnX25leHQodGFnKSkKIAkJaWYgKHRhZy0+aGRyLnRhZyA9PSBBVEFHX01FTSAmJiB0YWctPnUubWVtLnN0YXJ0ID09IDB4MjAwMDAwKSB7CkBAIC0xMjIsNyArMTIxLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChNU003WDMwX1NVUkYsICJRQ1QgTVNNN1gzMCBTVVJGIikKLQkuYm9vdF9wYXJhbXMgPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLmZpeHVwID0gbXNtN3gzMF9maXh1cCwKIAkucmVzZXJ2ZSA9IG1zbTd4MzBfcmVzZXJ2ZSwKIAkubWFwX2lvID0gbXNtN3gzMF9tYXBfaW8sCkBAIC0xMzIsNyArMTMxLDcgQEAKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoTVNNN1gzMF9GRkEsICJRQ1QgTVNNN1gzMCBGRkEiKQotCS5ib290X3BhcmFtcyA9IFBMQVRfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkuZml4dXAgPSBtc203eDMwX2ZpeHVwLAogCS5yZXNlcnZlID0gbXNtN3gzMF9yZXNlcnZlLAogCS5tYXBfaW8gPSBtc203eDMwX21hcF9pbywKQEAgLTE0Miw3ICsxNDEsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChNU003WDMwX0ZMVUlELCAiUUNUIE1TTTdYMzAgRkxVSUQiKQotCS5ib290X3BhcmFtcyA9IFBMQVRfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkuZml4dXAgPSBtc203eDMwX2ZpeHVwLAogCS5yZXNlcnZlID0gbXNtN3gzMF9yZXNlcnZlLAogCS5tYXBfaW8gPSBtc203eDMwX21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTg5NjAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTg5NjAuYwppbmRleCBiMDQ0NjhlLi42ZGMxY2JkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc204OTYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtODk2MC5jCkBAIC0zMiw4ICszMiw4IEBACiAKICNpbmNsdWRlICJkZXZpY2VzLmgiCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtc204OTYwX2ZpeHVwKHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MsIHN0cnVjdCB0YWcgKnRhZywKLQkJCSBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQorc3RhdGljIHZvaWQgX19pbml0IG1zbTg5NjBfZml4dXAoc3RydWN0IHRhZyAqdGFnLCBjaGFyICoqY21kbGluZSwKKwkJc3RydWN0IG1lbWluZm8gKm1pKQogewogCWZvciAoOyB0YWctPmhkci5zaXplOyB0YWcgPSB0YWdfbmV4dCh0YWcpKQogCQlpZiAodGFnLT5oZHIudGFnID09IEFUQUdfTUVNICYmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc204eDYwLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc204eDYwLmMKaW5kZXggOTIyMWY1NC4uNDRiZjcxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtOHg2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTh4NjAuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKQEAgLTgsMTggKzgsMTYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBLgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMzAsOCArMjgsOCBAQAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogCi1zdGF0aWMgdm9pZCBfX2luaXQgbXNtOHg2MF9maXh1cChzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWcsCi0JCQkgY2hhciAqKmNtZGxpbmUsIHN0cnVjdCBtZW1pbmZvICptaSkKK3N0YXRpYyB2b2lkIF9faW5pdCBtc204eDYwX2ZpeHVwKHN0cnVjdCB0YWcgKnRhZywgY2hhciAqKmNtZGxpbmUsCisJCXN0cnVjdCBtZW1pbmZvICptaSkKIHsKIAlmb3IgKDsgdGFnLT5oZHIuc2l6ZTsgdGFnID0gdGFnX25leHQodGFnKSkKIAkJaWYgKHRhZy0+aGRyLnRhZyA9PSBBVEFHX01FTSAmJgpAQCAtNTMsOCArNTEsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXNtOHg2MF9pbml0X2lycSh2b2lkKQogewotCXVuc2lnbmVkIGludCBpOwotCiAJZ2ljX2luaXQoMCwgR0lDX1BQSV9TVEFSVCwgTVNNX1FHSUNfRElTVF9CQVNFLAogCQkgKHZvaWQgKilNU01fUUdJQ19DUFVfQkFTRSk7CiAKQEAgLTY2LDIxICs2Miw0NyBAQAogCSAqLwogCWlmICghbWFjaGluZV9pc19tc204eDYwX3NpbSgpKQogCQl3cml0ZWwoMHgwMDAwRkZGRiwgTVNNX1FHSUNfRElTVF9CQVNFICsgR0lDX0RJU1RfRU5BQkxFX1NFVCk7Ci0KLQkvKiBGSVhNRTogTm90IGluc3RhbGxpbmcgQVZTX1NWSUNJTlQgYW5kIEFWU19TVklDSU5UU1dET05FIHlldAotCSAqIGFzIHRoZXkgYXJlIGNvbmZpZ3VyZWQgYXMgbGV2ZWwsIHdoaWNoIGRvZXMgbm90IHBsYXkgbmljZSB3aXRoCi0JICogaGFuZGxlX3BlcmNwdV9pcnEuCi0JICovCi0JZm9yIChpID0gR0lDX1BQSV9TVEFSVDsgaSA8IEdJQ19TUElfU1RBUlQ7IGkrKykgewotCQlpZiAoaSAhPSBBVlNfU1ZJQ0lOVCAmJiBpICE9IEFWU19TVklDSU5UU1dET05FKQotCQkJaXJxX3NldF9oYW5kbGVyKGksIGhhbmRsZV9wZXJjcHVfaXJxKTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtc204eDYwX2luaXQodm9pZCkKIHsKIH0KIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIHN0cnVjdCBvZl9kZXZfYXV4ZGF0YSBtc21fYXV4ZGF0YV9sb29rdXBbXSBfX2luaXRkYXRhID0geworCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZHRfZ2ljX21hdGNoW10gX19pbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLTg2NjAtcWdpYyIsIH0sCisJe30KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtc204eDYwX2R0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisKKwlub2RlID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlX2J5X2FkZHJlc3MoTlVMTCwgbXNtX2R0X2dpY19tYXRjaCwKKwkJCU1TTThYNjBfUUdJQ19ESVNUX1BIWVMpOworCWlmIChub2RlKQorCQlpcnFfZG9tYWluX2FkZF9zaW1wbGUobm9kZSwgR0lDX1NQSV9TVEFSVCk7CisKKwlpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJxY29tLG1zbTg2NjAtc3VyZiIpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkluaXQgc3VyZiBVQVJUIHJlZ2lzdGVyc1xuIik7CisJCW1zbTh4NjBfaW5pdF91YXJ0MTJkbSgpOworCX0KKworCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIG9mX2RlZmF1bHRfYnVzX21hdGNoX3RhYmxlLAorCQkJbXNtX2F1eGRhdGFfbG9va3VwLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1zbTh4NjBfZmx1aWRfbWF0Y2hbXSBfX2luaXRkYXRhID0geworCSJxY29tLG1zbTg2NjAtZmx1aWQiLAorCSJxY29tLG1zbTg2NjAtc3VyZiIsCisJTlVMTAorfTsKKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KKwogTUFDSElORV9TVEFSVChNU004WDYwX1JVTUkzLCAiUUNUIE1TTThYNjAgUlVNSTMiKQogCS5maXh1cCA9IG1zbTh4NjBfZml4dXAsCiAJLnJlc2VydmUgPSBtc204eDYwX3Jlc2VydmUsCkBAIC0xMTYsMyArMTM4LDE0IEBACiAJLmluaXRfbWFjaGluZSA9IG1zbTh4NjBfaW5pdCwKIAkudGltZXIgPSAmbXNtX3RpbWVyLAogTUFDSElORV9FTkQKKworI2lmZGVmIENPTkZJR19PRgorLyogVE9ETzogR2VuZXJhbCBkZXZpY2UgdHJlZSBzdXBwb3J0IGZvciBhbGwgTVNNLiAqLworRFRfTUFDSElORV9TVEFSVChNU01fRFQsICJRdWFsY29tbSBNU00gKEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSkiKQorCS5tYXBfaW8gPSBtc204eDYwX21hcF9pbywKKwkuaW5pdF9pcnEgPSBtc204eDYwX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUgPSBtc204eDYwX2R0X2luaXQsCisJLnRpbWVyID0gJm1zbV90aW1lciwKKwkuZHRfY29tcGF0ID0gbXNtOHg2MF9mbHVpZF9tYXRjaCwKK01BQ0hJTkVfRU5ECisjZW5kaWYgLyogQ09ORklHX09GICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1xc2Q4eDUwLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1xc2Q4eDUwLmMKaW5kZXggNmE5NjkxMS4uN2U4OTA5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtcXNkOHg1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXFzZDh4NTAuYwpAQCAtMTQsNyArMTQsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQogICogMDIxMTAtMTMwMSwgVVNBLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL3NpcmMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3ZyZWcuaD4KICNpbmNsdWRlIDxtYWNoL21tYy5oPgogCkBAIC0xOTMsNyArMTkyLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChRU0Q4WDUwX1NVUkYsICJRQ1QgUVNEOFg1MCBTVVJGIikKLQkuYm9vdF9wYXJhbXMgPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IHFzZDh4NTBfbWFwX2lvLAogCS5pbml0X2lycSA9IHFzZDh4NTBfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZSA9IHFzZDh4NTBfaW5pdCwKQEAgLTIwMSw3ICsyMDAsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChRU0Q4WDUwQV9TVDFfNSwgIlFDVCBRU0Q4WDUwQSBTVDEuNSIpCi0JLmJvb3RfcGFyYW1zID0gUExBVF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBxc2Q4eDUwX21hcF9pbywKIAkuaW5pdF9pcnEgPSBxc2Q4eDUwX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUgPSBxc2Q4eDUwX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1zYXBwaGlyZS5jIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtc2FwcGhpcmUuYwppbmRleCBjNmUwNDNjLi4zMmI0NjU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1zYXBwaGlyZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXNhcHBoaXJlLmMKQEAgLTExLDcgKzExLDcgQEAKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIyLDcgKzIyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTEwNSw3ICsxMDQsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNBUFBISVJFLCAic2FwcGhpcmUiKQogLyogTWFpbnRhaW5lcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+ICovCi0JLmJvb3RfcGFyYW1zICAgID0gUExBVF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5maXh1cCAgICAgICAgICA9IHNhcHBoaXJlX2ZpeHVwLAogCS5tYXBfaW8gICAgICAgICA9IHNhcHBoaXJlX21hcF9pbywKIAkuaW5pdF9pcnEgICAgICAgPSBzYXBwaGlyZV9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LW1tYy5jIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQtbW1jLmMKaW5kZXggZjdhOTcyNC4uODY1MDM0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQtbW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQtbW1jLmMKQEAgLTEsNyArMSw3IEBACiAvKiBsaW51eC9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC1tbWMuYwogKiogQXV0aG9yOiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KIAotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL3ZyZWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LXBhbmVsLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC1wYW5lbC5jCmluZGV4IDcyOWJiNDkuLjI1MTA1YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LXBhbmVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQtcGFuZWwuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIGxpbnV4L2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LW1kZGkuYwogKiogQXV0aG9yOiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9tc21fZmIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC5jCmluZGV4IDdhY2QyMDIuLjZiOWIyMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQuYwpAQCAtOTMsNyArOTMsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFRST1VULCAiSFRDIERyZWFtIikKLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSB0cm91dF9maXh1cCwKIAkubWFwX2lvCQk9IHRyb3V0X21hcF9pbywKIAkuaW5pdF9pcnEJPSB0cm91dF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMtbXNtN3gwMC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy1tc203eDAwLmMKaW5kZXggYzRmNWUyNi4uOTkzNzgwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy1tc203eDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy1tc203eDAwLmMKQEAgLTE3NiwxMiArMTc2LDYgQEAKIAkJLm5hbWUJPSAiY21kX2lycSIsCiAJfSwKIAl7Ci0JCS5zdGFydAk9IElOVF9TREMxXzEsCi0JCS5lbmQJPSBJTlRfU0RDMV8xLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQkJLm5hbWUJPSAicGlvX2lycSIsCi0JfSwKLQl7CiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9ESVNBQkxFRCwKIAkJLm5hbWUJPSAic3RhdHVzX2lycSIKIAl9LApAQCAtMjA0LDEyICsxOTgsNiBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAkJLm5hbWUJPSAiY21kX2lycSIsCiAJfSwKLQkJewotCQkuc3RhcnQJPSBJTlRfU0RDMl8xLAotCQkuZW5kCT0gSU5UX1NEQzJfMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JCS5uYW1lCT0gInBpb19pcnEiLAotCX0sCiAJewogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfRElTQUJMRUQsCiAJCS5uYW1lCT0gInN0YXR1c19pcnEiCkBAIC0yMzMsMTIgKzIyMSw2IEBACiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCQkubmFtZQk9ICJjbWRfaXJxIiwKIAl9LAotCQl7Ci0JCS5zdGFydAk9IElOVF9TREMzXzEsCi0JCS5lbmQJPSBJTlRfU0RDM18xLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQkJLm5hbWUJPSAicGlvX2lycSIsCi0JfSwKIAl7CiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9ESVNBQkxFRCwKIAkJLm5hbWUJPSAic3RhdHVzX2lycSIKQEAgLTI2MiwxMiArMjQ0LDYgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJCS5uYW1lCT0gImNtZF9pcnEiLAogCX0sCi0JCXsKLQkJLnN0YXJ0CT0gSU5UX1NEQzRfMSwKLQkJLmVuZAk9IElOVF9TREM0XzEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCQkubmFtZQk9ICJwaW9faXJxIiwKLQl9LAogCXsKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0RJU0FCTEVELAogCQkubmFtZQk9ICJzdGF0dXNfaXJxIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy1xc2Q4eDUwLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLXFzZDh4NTAuYwppbmRleCAxMmQ4ZGViLi4xMzE2MzNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLXFzZDh4NTAuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLXFzZDh4NTAuYwpAQCAtMTQwLDEyICsxNDAsNiBAQAogCQkubmFtZQk9ICJjbWRfaXJxIiwKIAl9LAogCXsKLQkJLnN0YXJ0CT0gSU5UX1NEQzFfMSwKLQkJLmVuZAk9IElOVF9TREMxXzEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCQkubmFtZQk9ICJwaW9faXJxIiwKLQl9LAotCXsKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0RJU0FCTEVELAogCQkubmFtZQk9ICJzdGF0dXNfaXJxIgogCX0sCkBAIC0xNjgsMTIgKzE2Miw2IEBACiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCQkubmFtZQk9ICJjbWRfaXJxIiwKIAl9LAotCQl7Ci0JCS5zdGFydAk9IElOVF9TREMyXzEsCi0JCS5lbmQJPSBJTlRfU0RDMl8xLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQkJLm5hbWUJPSAicGlvX2lycSIsCi0JfSwKIAl7CiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9ESVNBQkxFRCwKIAkJLm5hbWUJPSAic3RhdHVzX2lycSIKQEAgLTE5NywxMiArMTg1LDYgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJCS5uYW1lCT0gImNtZF9pcnEiLAogCX0sCi0JCXsKLQkJLnN0YXJ0CT0gSU5UX1NEQzNfMSwKLQkJLmVuZAk9IElOVF9TREMzXzEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCQkubmFtZQk9ICJwaW9faXJxIiwKLQl9LAogCXsKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0RJU0FCTEVELAogCQkubmFtZQk9ICJzdGF0dXNfaXJxIgpAQCAtMjI2LDEyICsyMDgsNiBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAkJLm5hbWUJPSAiY21kX2lycSIsCiAJfSwKLQkJewotCQkuc3RhcnQJPSBJTlRfU0RDNF8xLAotCQkuZW5kCT0gSU5UX1NEQzRfMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JCS5uYW1lCT0gInBpb19pcnEiLAotCX0sCiAJewogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfRElTQUJMRUQsCiAJCS5uYW1lCT0gInN0YXR1c19pcnEiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ob3RwbHVnLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ob3RwbHVnLmMKaW5kZXggNWEzMWY3MC4uNDFjMjUyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaG90cGx1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2hvdHBsdWcuYwpAQCAtMzcsNyArMzcsNyBAQAogCQkgICAgOgogCQkgICAgOiAibWVtb3J5IiwgImNjIik7CiAKLQkJaWYgKHBlbl9yZWxlYXNlID09IGNwdSkgeworCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1X2xvZ2ljYWxfbWFwKGNwdSkpIHsKIAkJCS8qCiAJCQkgKiBPSywgcHJvcGVyIHdha2V1cCwgd2UncmUgZG9uZQogCQkJICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDY0NmI5OWUuLjJkYzczY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX0hBU19NU01fREVCVUdfVUFSVF9QSFlTKSAmJiAhZGVmaW5lZChDT05GSUdfTVNNX0RFQlVHX1VBUlRfTk9ORSkKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAlsZHIJXHJwLCA9TVNNX0RFQlVHX1VBUlRfUEhZUwogCWxkcglccnYsID1NU01fREVCVUdfVUFSVF9CQVNFCiAJLmVuZG0KQEAgLTM3LDcgKzM3LDcgQEAKIAliZXEJMTAwMWIKIAkuZW5kbQogI2Vsc2UKLQkubWFjcm8gIGFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8gIGFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCW1vdglccnYsICMweGZmMDAwMDAwCiAJb3JyCVxydiwgXHJ2LCAjMHgwMGYwMDAwMAogCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8tcWdpYy5TIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLXFnaWMuUwppbmRleCAxMjQ2NzE1Li43MTcwNzZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8tcWdpYy5TCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby1xZ2ljLlMKQEAgLTgsODEgKzgsMTAgQEAKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZW50cnktbWFjcm8tZ2ljLlM+CiAKIAkubWFjcm8JZGlzYWJsZV9maXEKIAkuZW5kbQogCi0JLm1hY3JvICBnZXRfaXJxbnJfcHJlYW1ibGUsIGJhc2UsIHRtcAotCWxkcglcYmFzZSwgPWdpY19jcHVfYmFzZV9hZGRyCi0JbGRyCVxiYXNlLCBbXGJhc2VdCi0JLmVuZG0KLQogCS5tYWNybyAgYXJjaF9yZXRfdG9fdXNlciwgdG1wMSwgdG1wMgogCS5lbmRtCi0KLQkvKgotCSAqIFRoZSBpbnRlcnJ1cHQgbnVtYmVyaW5nIHNjaGVtZSBpcyBkZWZpbmVkIGluIHRoZQotCSAqIGludGVycnVwdCBjb250cm9sbGVyIHNwZWMuICBUbyB3aXQ6Ci0JICoKLQkgKiBNaWdyYXRlZCB0aGUgY29kZSBmcm9tIEFSTSBNUCBwb3J0IHRvIGJlIG1vcmUgY29uc2lzdGVudAotCSAqIHdpdGggaW50ZXJydXB0IHByb2Nlc3NpbmcgLCB0aGUgZm9sbG93aW5nIHN0aWxsIGhvbGRzIHRydWUKLQkgKiBob3dldmVyLCBhbGwgaW50ZXJydXB0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSByZWdhcmRsZXNzIG9mCi0JICogaWYgdGhleSBhcmUgbG9jYWwgSVBJIG9yIFBQSQotCSAqCi0JICogSW50ZXJydXB0cyAwLTE1IGFyZSBJUEkKLQkgKiAxNi0zMSBhcmUgUFBJCi0JICogICAoMTYtMTggYXJlIHRoZSB0aW1lcnMpCi0JICogMzItMTAyMCBhcmUgZ2xvYmFsCi0JICogMTAyMS0xMDIyIGFyZSByZXNlcnZlZAotCSAqIDEwMjMgaXMgInNwdXJpb3VzIiAobm8gaW50ZXJydXB0KQotCSAqCi0JICogQSBzaW1wbGUgcmVhZCBmcm9tIHRoZSBjb250cm9sbGVyIHdpbGwgdGVsbCB1cyB0aGUgbnVtYmVyIG9mIHRoZQotCSAqIGhpZ2hlc3QgcHJpb3JpdHkgZW5hYmxlZCBpbnRlcnJ1cHQuICBXZSB0aGVuIGp1c3QgbmVlZCB0byBjaGVjawotCSAqIHdoZXRoZXIgaXQgaXMgaW4gdGhlIHZhbGlkIHJhbmdlIGZvciBhbiBJUlEgKDAtMTAyMCBpbmNsdXNpdmUpLgotCSAqCi0JICogQmFzZSBBUk0gY29kZSBhc3N1bWVzIHRoYXQgdGhlIGxvY2FsIChwcml2YXRlKSBwZXJpcGhlcmFsIGludGVycnVwdHMKLQkgKiBhcmUgbm90IHZhbGlkLCB3ZSB0cmVhdCB0aGVtIGRpZmZlcmVudGx5LCBpbiB0aGF0IHRoZSBwcml2YXRlcyBhcmUKLQkgKiBoYW5kbGVkIGxpa2Ugbm9ybWFsIHNoYXJlZCBpbnRlcnJ1cHRzIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IG9ubHkKLQkgKiBvbmUgcHJvY2Vzc29yIGNhbiByZWdpc3RlciB0aGUgaW50ZXJydXB0IGFuZCB0aGUgaGFuZGxlciBtdXN0IGJlCi0JICogdGhlIHNhbWUgZm9yIGFsbCBwcm9jZXNzb3JzLgotCSAqLwotCi0JLm1hY3JvICBnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQotCWxkciAgXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfSU5UQUNLXSAvKiBiaXRzIDEyLTEwID1zcmNDUFUsCi0JCQkJCQkgICA5LTAgPWludCAjICovCi0KLQliaWMgICAgIFxpcnFuciwgXGlycXN0YXQsICMweDFjMDAJQG1hc2sgc3JjCi0JY21wICAgICBcaXJxbnIsICMxNQotCWxkcgkJXHRtcCwgPTEwMjEKLQljbXBjYwlcaXJxbnIsIFxpcnFucgotCWNtcG5lCVxpcnFuciwgXHRtcAotCWNtcGNzCVxpcnFuciwgXGlycW5yCi0KLQkuZW5kbQotCi0JLyogV2UgYXNzdW1lIHRoYXQgaXJxc3RhdCAodGhlIHJhdyB2YWx1ZSBvZiB0aGUgSVJRIGFja25vd2xlZGdlCi0JICogcmVnaXN0ZXIpIGlzIHByZXNlcnZlZCBmcm9tIHRoZSBtYWNybyBhYm92ZS4KLQkgKiBJZiB0aGVyZSBpcyBhbiBJUEksIHdlIGltbWVkaWF0ZWx5IHNpZ25hbCBlbmQgb2YgaW50ZXJydXB0IG9uIHRoZQotCSAqIGNvbnRyb2xsZXIsIHNpbmNlIHRoaXMgcmVxdWlyZXMgdGhlIG9yaWdpbmFsIGlycXN0YXQgdmFsdWUgd2hpY2gKLQkgKiB3ZSB3b24ndCBlYXNpbHkgYmUgYWJsZSB0byByZWNyZWF0ZSBsYXRlci4KLQkgKi8KLQkubWFjcm8gdGVzdF9mb3JfaXBpLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCi0gICAgYmljIFxpcnFuciwgXGlycXN0YXQsICMweDFjMDAKLSAgICBjbXAgXGlycW5yLCAjMTYKLSAgICBzdHJjYyAgIFxpcnFzdGF0LCBbXGJhc2UsICNHSUNfQ1BVX0VPSV0KLSAgICBjbXBjcyAgIFxpcnFuciwgXGlycW5yCi0JLmVuZG0KLQotCS8qIEFzIGFib3ZlLCB0aGlzIGFzc3VtZXMgdGhhdCBpcnFzdGF0IGFuZCBiYXNlIGFyZSBwcmVzZXJ2ZWQuLiAqLwotCi0JLm1hY3JvIHRlc3RfZm9yX2x0aXJxLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCi0gICAgYmljIFxpcnFuciwgXGlycXN0YXQsICMweDFjMDAKLSAgICBtb3YgICAgIFx0bXAsICMwCi0gICAgY21wIFxpcnFuciwgIzE2Ci0gICAgbW92ZXEgICBcdG1wLCAjMQotICAgIHN0cmVxICAgXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfRU9JXQotICAgIGNtcCBcdG1wLCAjMAotCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAzNmFkNTBkLi40MGE4YzE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEsMjYgKzEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBdXRob3I6IE1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTVNNX0dQSU9fSAotI2RlZmluZSBfX0FTTV9BUkNIX01TTV9HUElPX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotI2RlZmluZSBncGlvX2dldF92YWx1ZSAgX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZSAgX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwICAgX19ncGlvX2NhbnNsZWVwCi0jZGVmaW5lIGdwaW9fdG9faXJxICAgICBfX2dwaW9fdG9faXJxCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX01TTV9HUElPX0ggKi8KKy8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDVlN2UuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3IEdvb2dsZSwgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLS8qIHBoeXNpY2FsIG9mZnNldCBvZiBSQU0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1FTRDhYNTApICYmIGRlZmluZWQoQ09ORklHX01TTV9TT0NfUkVWX0EpCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MDAwMDAwMDApCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX1FTRDhYNTApCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MjAwMDAwMDApCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMzApCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MDAwMDAwMDApCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTThYNjApCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4NDAwMDAwMDApCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTTg5NjApCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4NDAwMDAwMDApCi0jZWxzZQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDEwMDAwMDAwKQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbW1jLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbW1jLmgKaW5kZXggNTYzMWI1MS4uZmZjZDllMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21tYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tbWMuaApAQCAtOCwxMyArOCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CiAKLXN0cnVjdCBlbWJlZGRlZF9zZGlvX2RhdGEgewotCXN0cnVjdCBzZGlvX2NpcyBjaXM7Ci0Jc3RydWN0IHNkaW9fY2NjciBjY2NyOwotCXN0cnVjdCBzZGlvX2VtYmVkZGVkX2Z1bmMgKmZ1bmNzOwotCWludCBudW1fZnVuY3M7Ci19OwotCiBzdHJ1Y3QgbXNtX21tY19ncGlvIHsKIAl1bnNpZ25lZCBubzsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtMjksOSArMjIsOSBAQAogCXVuc2lnbmVkIGludCBvY3JfbWFzazsJCQkvKiBhdmFpbGFibGUgdm9sdGFnZXMgKi8KIAl1MzIgKCp0cmFuc2xhdGVfdmRkKShzdHJ1Y3QgZGV2aWNlICosIHVuc2lnbmVkIGludCk7CiAJdW5zaWduZWQgaW50ICgqc3RhdHVzKShzdHJ1Y3QgZGV2aWNlICopOwotCXN0cnVjdCBlbWJlZGRlZF9zZGlvX2RhdGEgKmVtYmVkZGVkX3NkaW87CiAJaW50ICgqcmVnaXN0ZXJfc3RhdHVzX25vdGlmeSkodm9pZCAoKmNhbGxiYWNrKShpbnQgY2FyZF9wcmVzZW50LCB2b2lkICpkZXZfaWQpLCB2b2lkICpkZXZfaWQpOwogCXN0cnVjdCBtc21fbW1jX2dwaW9fZGF0YSAqZ3Bpb19kYXRhOworCXZvaWQgKCppbml0X2NhcmQpKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9pby5jCmluZGV4IDE0MGRkYmIuLjg3NTllY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW8uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9wbGF0c21wLmMKaW5kZXggNzI3NjU5NS4uZmRlYzU4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcGxhdHNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL3BsYXRzbXAuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJICogTm90ZSB0aGF0ICJwZW5fcmVsZWFzZSIgaXMgdGhlIGhhcmR3YXJlIENQVSBJRCwgd2hlcmVhcwogCSAqICJjcHUiIGlzIExpbnV4J3MgaW50ZXJuYWwgSUQuCiAJICovCi0JcGVuX3JlbGVhc2UgPSBjcHU7CisJcGVuX3JlbGVhc2UgPSBjcHVfbG9naWNhbF9tYXAoY3B1KTsKIAlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEoKHZvaWQgKikmcGVuX3JlbGVhc2UsIHNpemVvZihwZW5fcmVsZWFzZSkpOwogCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEoJnBlbl9yZWxlYXNlKSwgX19wYSgmcGVuX3JlbGVhc2UgKyAxKSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3NjbS5jIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmMKaW5kZXggMjMyZjk3YS4uYmFmYWJiNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmMKQEAgLTE4MCw2ICsxODAsOSBAQAogCQkJX19hc21lcSgiJTEiLCAicjAiKQogCQkJX19hc21lcSgiJTIiLCAicjEiKQogCQkJX19hc21lcSgiJTMiLCAicjIiKQorI2lmZGVmIFJFUVVJUkVTX1NFQworCQkJIi5hcmNoX2V4dGVuc2lvbiBzZWNcbiIKKyNlbmRpZgogCQkJInNtYwkjMAlAIHN3aXRjaCB0byBzZWN1cmUgd29ybGRcbiIKIAkJCTogIj1yIiAocjApCiAJCQk6ICJyIiAocjApLCAiciIgKHIxKSwgInIiIChyMikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jCmluZGV4IDYzNjIxZjEuLmFmZWVjYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYwpAQCAtNzEsMTIgKzcxLDE2IEBACiBzdHJ1Y3QgbXNtX2Nsb2NrIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICAgY2xvY2tldmVudDsKIAlzdHJ1Y3QgY2xvY2tzb3VyY2UgICAgICAgICAgY2xvY2tzb3VyY2U7Ci0Jc3RydWN0IGlycWFjdGlvbiAgICAgICAgICAgIGlycTsKKwl1bnNpZ25lZCBpbnQJCSAgICBpcnE7CiAJdm9pZCBfX2lvbWVtICAgICAgICAgICAgICAgICpyZWdiYXNlOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBmcmVxOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBzaGlmdDsKIAl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgKmdsb2JhbF9jb3VudGVyOwogCXZvaWQgX19pb21lbSAgICAgICAgICAgICAgICAqbG9jYWxfY291bnRlcjsKKwl1bmlvbiB7CisJCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UJCSpldnQ7CisJCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgX19wZXJjcHUJKipwZXJjcHVfZXZ0OworCX07CQkKIH07CiAKIGVudW0gewpAQCAtODcsMTMgKzkxLDEwIEBACiAKIAogc3RhdGljIHN0cnVjdCBtc21fY2xvY2sgbXNtX2Nsb2Nrc1tdOwotc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmxvY2FsX2Nsb2NrX2V2ZW50OwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbXNtX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gZGV2X2lkOwotCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkKLQkJZXZ0ID0gbG9jYWxfY2xvY2tfZXZlbnQ7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gKihzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICoqKWRldl9pZDsKIAlpZiAoZXZ0LT5ldmVudF9oYW5kbGVyID09IE5VTEwpCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKQEAgLTE3MSwxMyArMTcyLDcgQEAKIAkJCS5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soMzIpLAogCQkJLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiAJCX0sCi0JCS5pcnEgPSB7Ci0JCQkubmFtZSAgICA9ICJncF90aW1lciIsCi0JCQkuZmxhZ3MgICA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJCS5oYW5kbGVyID0gbXNtX3RpbWVyX2ludGVycnVwdCwKLQkJCS5kZXZfaWQgID0gJm1zbV9jbG9ja3NbMF0uY2xvY2tldmVudCwKLQkJCS5pcnEgICAgID0gSU5UX0dQX1RJTUVSX0VYUAotCQl9LAorCQkuaXJxID0gSU5UX0dQX1RJTUVSX0VYUCwKIAkJLmZyZXEgPSBHUFRfSFosCiAJfSwKIAlbTVNNX0NMT0NLX0RHVF0gPSB7CkBAIC0xOTYsMTMgKzE5MSw3IEBACiAJCQkubWFzayAgICAgICAgICAgPSBDTE9DS1NPVVJDRV9NQVNLKCgzMiAtIE1TTV9ER1RfU0hJRlQpKSwKIAkJCS5mbGFncyAgICAgICAgICA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogCQl9LAotCQkuaXJxID0gewotCQkJLm5hbWUgICAgPSAiZGdfdGltZXIiLAotCQkJLmZsYWdzICAgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCi0JCQkuaGFuZGxlciA9IG1zbV90aW1lcl9pbnRlcnJ1cHQsCi0JCQkuZGV2X2lkICA9ICZtc21fY2xvY2tzWzFdLmNsb2NrZXZlbnQsCi0JCQkuaXJxICAgICA9IElOVF9ERUJVR19USU1FUl9FWFAKLQkJfSwKKwkJLmlycSA9IElOVF9ERUJVR19USU1FUl9FWFAsCiAJCS5mcmVxID0gREdUX0haID4+IE1TTV9ER1RfU0hJRlQsCiAJCS5zaGlmdCA9IE1TTV9ER1RfU0hJRlQsCiAJfQpAQCAtMjYxLDEwICsyNTAsMzAgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAibXNtX3RpbWVyX2luaXQ6IGNsb2Nrc291cmNlX3JlZ2lzdGVyICIKIAkJCSAgICAgICAiZmFpbGVkIGZvciAlc1xuIiwgY3MtPm5hbWUpOwogCi0JCXJlcyA9IHNldHVwX2lycShjbG9jay0+aXJxLmlycSwgJmNsb2NrLT5pcnEpOworCQljZS0+aXJxID0gY2xvY2stPmlycTsKKwkJaWYgKGNwdV9pc19tc204eDYwKCkgfHwgY3B1X2lzX21zbTg5NjAoKSkgeworCQkJY2xvY2stPnBlcmNwdV9ldnQgPSBhbGxvY19wZXJjcHUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKKwkJCWlmICghY2xvY2stPnBlcmNwdV9ldnQpIHsKKwkJCQlwcl9lcnIoIm1zbV90aW1lcl9pbml0OiBtZW1vcnkgYWxsb2NhdGlvbiAiCisJCQkJICAgICAgICJmYWlsZWQgZm9yICVzXG4iLCBjZS0+bmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCSpfX3RoaXNfY3B1X3B0cihjbG9jay0+cGVyY3B1X2V2dCkgPSBjZTsKKwkJCXJlcyA9IHJlcXVlc3RfcGVyY3B1X2lycShjZS0+aXJxLCBtc21fdGltZXJfaW50ZXJydXB0LAorCQkJCQkJIGNlLT5uYW1lLCBjbG9jay0+cGVyY3B1X2V2dCk7CisJCQlpZiAoIXJlcykKKwkJCQllbmFibGVfcGVyY3B1X2lycShjZS0+aXJxLCAwKTsKKwkJfSBlbHNlIHsKKwkJCWNsb2NrLT5ldnQgPSBjZTsKKwkJCXJlcyA9IHJlcXVlc3RfaXJxKGNlLT5pcnEsIG1zbV90aW1lcl9pbnRlcnJ1cHQsCisJCQkJCSAgSVJRRl9USU1FUiB8IElSUUZfTk9CQUxBTkNJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCQkgIGNlLT5uYW1lLCAmY2xvY2stPmV2dCk7CisJCX0KKwogCQlpZiAocmVzKQotCQkJcHJpbnRrKEtFUk5fRVJSICJtc21fdGltZXJfaW5pdDogc2V0dXBfaXJxICIKLQkJCSAgICAgICAiZmFpbGVkIGZvciAlc1xuIiwgY3MtPm5hbWUpOworCQkJcHJfZXJyKCJtc21fdGltZXJfaW5pdDogcmVxdWVzdF9pcnEgZmFpbGVkIGZvciAlc1xuIiwKKwkJCSAgICAgICBjZS0+bmFtZSk7CiAKIAkJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGNlKTsKIAl9CkBAIC0yNzMsNiArMjgyLDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiBpbnQgX19jcHVpbml0IGxvY2FsX3RpbWVyX3NldHVwKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKKwlzdGF0aWMgYm9vbCBsb2NhbF90aW1lcl9pbml0ZWQ7CiAJc3RydWN0IG1zbV9jbG9jayAqY2xvY2sgPSAmbXNtX2Nsb2Nrc1tNU01fR0xPQkFMX1RJTUVSXTsKIAogCS8qIFVzZSBleGlzdGluZyBjbG9ja19ldmVudCBmb3IgY3B1IDAgKi8KQEAgLTI4MSwxMiArMjkxLDEzIEBACiAKIAl3cml0ZWwoREdUX0NMS19DVExfRElWXzQsIE1TTV9UTVJfQkFTRSArIERHVF9DTEtfQ1RMKTsKIAotCWlmICghbG9jYWxfY2xvY2tfZXZlbnQpIHsKKwlpZiAoIWxvY2FsX3RpbWVyX2luaXRlZCkgewogCQl3cml0ZWwoMCwgY2xvY2stPnJlZ2Jhc2UgICsgVElNRVJfRU5BQkxFKTsKIAkJd3JpdGVsKDAsIGNsb2NrLT5yZWdiYXNlICsgVElNRVJfQ0xFQVIpOwogCQl3cml0ZWwofjAsIGNsb2NrLT5yZWdiYXNlICsgVElNRVJfTUFUQ0hfVkFMKTsKKwkJbG9jYWxfdGltZXJfaW5pdGVkID0gdHJ1ZTsKIAl9Ci0JZXZ0LT5pcnEgPSBjbG9jay0+aXJxLmlycTsKKwlldnQtPmlycSA9IGNsb2NrLT5pcnE7CiAJZXZ0LT5uYW1lID0gImxvY2FsX3RpbWVyIjsKIAlldnQtPmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVDsKIAlldnQtPnJhdGluZyA9IGNsb2NrLT5jbG9ja2V2ZW50LnJhdGluZzsKQEAgLTI5OCwxNyArMzA5LDE3IEBACiAJCWNsb2NrZXZlbnRfZGVsdGEybnMoMHhmMDAwMDAwMCA+PiBjbG9jay0+c2hpZnQsIGV2dCk7CiAJZXZ0LT5taW5fZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDQsIGV2dCk7CiAKLQlsb2NhbF9jbG9ja19ldmVudCA9IGV2dDsKLQotCWdpY19lbmFibGVfcHBpKGNsb2NrLT5pcnEuaXJxKTsKKwkqX190aGlzX2NwdV9wdHIoY2xvY2stPnBlcmNwdV9ldnQpID0gZXZ0OworCWVuYWJsZV9wZXJjcHVfaXJxKGV2dC0+aXJxLCAwKTsKIAogCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShldnQpOwogCXJldHVybiAwOwogfQogCi1pbmxpbmUgaW50IGxvY2FsX3RpbWVyX2Fjayh2b2lkKQordm9pZCBsb2NhbF90aW1lcl9zdG9wKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKLQlyZXR1cm4gMTsKKwlldnQtPnNldF9tb2RlKENMT0NLX0VWVF9NT0RFX1VOVVNFRCwgZXZ0KTsKKwlkaXNhYmxlX3BlcmNwdV9pcnEoZXZ0LT5pcnEpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9idWZmYWxvLXd4bC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2J1ZmZhbG8td3hsLXNldHVwLmMKaW5kZXggMjBmM2YxMi4uMGU5NDI2OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2J1ZmZhbG8td3hsLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2J1ZmZhbG8td3hsLXNldHVwLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiBNQUNISU5FX1NUQVJUKFRFUkFTVEFUSU9OX1dYTCwgIkJ1ZmZhbG8gTmFzIFdYTCIpCiAJLyogTWFpbnRhaW5lcjogU2ViYXN0aWVuIFJlcXVpZW0gPHNlYmFzdGllbkByZXF1aWVtLmZyPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHd4bF9pbml0LAogCS5tYXBfaW8JCT0gbXY3OHh4MF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBtdjc4eHgwX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvZGI3OHgwMC1icC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2RiNzh4MDAtYnAtc2V0dXAuYwppbmRleCBkZjVhZWJlLi41MGI4NWFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvZGI3OHgwMC1icC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9kYjc4eDAwLWJwLXNldHVwLmMKQEAgLTkzLDcgKzkzLDcgQEAKIAogTUFDSElORV9TVEFSVChEQjc4WDAwX0JQLCAiTWFydmVsbCBEQi03OHgwMC1CUCBEZXZlbG9wbWVudCBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZGI3OHgwMF9pbml0LAogCS5tYXBfaW8JCT0gbXY3OHh4MF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBtdjc4eHgwX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggMDQ4OTE0Mi4uYTdkZjAyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtOCw3ICs4LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvbXY3OHh4MC5oPgogCi0JLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJbGRyCVxycCwgPU1WNzhYWDBfUkVHU19QSFlTX0JBU0UKIAlsZHIJXHJ2LCA9TVY3OFhYMF9SRUdTX1ZJUlRfQkFTRQogCW9ycglccnAsIFxycCwgIzB4MDAwMTIwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjQ4YzUxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaXJxLmMKaW5kZXggM2UyNDQzMS4uZTQyMWI3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pcnEuYwpAQCAtNywxMiArNywxMSBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9icmlkZ2UtcmVncy5oPgogI2luY2x1ZGUgPHBsYXQvaXJxLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvbXBwLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvbXBwLmMKaW5kZXggNTliNzY4Ni4uY2Y0ZTQ5NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL21wcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9tcHAuYwpAQCAtNywxMyArNywxMiBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21idXMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPHBsYXQvbXBwLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCiAjaW5jbHVkZSAibXBwLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcmQ3OHgwMC1tYXNhLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcmQ3OHgwMC1tYXNhLXNldHVwLmMKaW5kZXggZDkyN2YxNC4uZTg1MjIyZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3JkNzh4MDAtbWFzYS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9yZDc4eDAwLW1hc2Etc2V0dXAuYwpAQCAtNzgsNyArNzgsNyBAQAogCiBNQUNISU5FX1NUQVJUKFJENzhYMDBfTUFTQSwgIk1hcnZlbGwgUkQtNzh4MDAtTUFTQSBEZXZlbG9wbWVudCBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcmQ3OHgwMF9tYXNhX2luaXQsCiAJLm1hcF9pbwkJPSBtdjc4eHgwX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG12Nzh4eDBfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW14NS9LY29uZmlnCmluZGV4IGI0ZTdjNTguLmFmMGMyMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvS2NvbmZpZwpAQCAtMSw4ICsxLDkgQEAKLWlmIEFSQ0hfTVg1MDMgfHwgQVJDSF9NWDUxCitpZiBBUkNIX01YNQorCiAjIEFSQ0hfTVg1LzUwLzUzIGFyZSBsZWZ0IHRvIG1hcmsgcGxhY2VzIHdoZXJlIHByZXZlbnQgbXVsdGktc29jIGluIHNpbmdsZQogIyBpbWFnZS4gU28gZm9yIG1vc3QgdGltZSwgU09DX0lNWDUwLzUxLzUzIHNob3VsZCBiZSB1c2VkLgogCi1jb25maWcgQVJDSF9NWDUKK2NvbmZpZyBBUkNIX01YNTEKIAlib29sCiAKIGNvbmZpZyBBUkNIX01YNTAKQEAgLTE5LDcgKzIwLDYgQEAKIAlzZWxlY3QgQVJDSF9NWENfSU9NVVhfVjMKIAlzZWxlY3QgQVJDSF9NWENfQVVETVVYX1YyCiAJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKLQlzZWxlY3QgQVJDSF9NWDUKIAlzZWxlY3QgQVJDSF9NWDUwCiAKIGNvbmZpZwlTT0NfSU1YNTEKQEAgLTMwLDcgKzMwLDcgQEAKIAlzZWxlY3QgQVJDSF9NWENfSU9NVVhfVjMKIAlzZWxlY3QgQVJDSF9NWENfQVVETVVYX1YyCiAJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKLQlzZWxlY3QgQVJDSF9NWDUKKwlzZWxlY3QgQVJDSF9NWDUxCiAKIGNvbmZpZwlTT0NfSU1YNTMKIAlib29sCkBAIC0zOCwxMCArMzgsOCBAQAogCXNlbGVjdCBBUk1fTDFfQ0FDSEVfU0hJRlRfNgogCXNlbGVjdCBNWENfVFpJQwogCXNlbGVjdCBBUkNIX01YQ19JT01VWF9WMwotCXNlbGVjdCBBUkNIX01YNQogCXNlbGVjdCBBUkNIX01YNTMKIAotaWYgQVJDSF9NWDUwX1NVUFBPUlRFRAogI2NvbW1lbnQgImkuTVg1MCBtYWNoaW5lczoiCiAKIGNvbmZpZyBNQUNIX01YNTBfUkRQCkBAIC01MiwyMiArNTAsMjkgQEAKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fU0RIQ0lfRVNESENfSU1YCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgKLQlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fRkVDCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBNWDUwIHJlZmVyZW5jZSBkZXNpZ24gcGxhdGZvcm0gKFJEUCkgYm9hcmQuIFRoaXMKIAkgIGluY2x1ZGVzIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KIAotZW5kaWYgIyBBUkNIX01YNTBfU1VQUE9SVEVECi0KLWlmIEFSQ0hfTVg1MQogY29tbWVudCAiaS5NWDUxIG1hY2hpbmVzOiIKIAorY29uZmlnIE1BQ0hfSU1YNTFfRFQKKwlib29sICJTdXBwb3J0IGkuTVg1MSBwbGF0Zm9ybXMgZnJvbSBkZXZpY2UgdHJlZSIKKwlzZWxlY3QgU09DX0lNWDUxCisJc2VsZWN0IFVTRV9PRgorCXNlbGVjdCBNQUNIX01YNTFfQkFCQkFHRQorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgRnJlZXNjYWxlIGkuTVg1MSBiYXNlZCBwbGF0Zm9ybXMKKwkgIHVzaW5nIHRoZSBkZXZpY2UgdHJlZSBmb3IgZGlzY292ZXJ5CisKIGNvbmZpZyBNQUNIX01YNTFfQkFCQkFHRQogCWJvb2wgIlN1cHBvcnQgTVg1MSBCQUJCQUdFIHBsYXRmb3JtcyIKIAlzZWxlY3QgU09DX0lNWDUxCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0ZTTF9VU0IyX1VEQwogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVgyX1dEVAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX01YQ19FSENJCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NESENJX0VTREhDX0lNWAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCiAJaGVscApAQCAtOTEsOCArOTYsMTAgQEAKIGNvbmZpZyBNQUNIX0VVS1JFQV9DUFVJTVg1MQogCWJvb2wgIlN1cHBvcnQgRXVrcmVhIENQVUlNWDUxIG1vZHVsZSIKIAlzZWxlY3QgU09DX0lNWDUxCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0ZTTF9VU0IyX1VEQwogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX01YQ19FSENJCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX01YQ19OQU5ECiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgKIAloZWxwCkBAIC0xMTksMTAgKzEyNiwxMiBAQAogY29uZmlnIE1BQ0hfRVVLUkVBX0NQVUlNWDUxU0QKIAlib29sICJTdXBwb3J0IEV1a3JlYSBDUFVJTVg1MVNEIG1vZHVsZSIKIAlzZWxlY3QgU09DX0lNWDUxCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0ZTTF9VU0IyX1VEQwogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDCi0Jc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX0VIQ0kKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX05BTkQKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWAogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgRXVrcmVhIENQVUlNWDUxU0QgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMKIAkgIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgbW9kdWxlIGFuZCBpdHMgcGVyaXBoZXJhbHMuCkBAIC0xNDcsNiArMTU2LDggQEAKIAlib29sCiAJc2VsZWN0IFNPQ19JTVg1MQogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfRUhDSQorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9QQVRBX0lNWAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TREhDSV9FU0RIQ19JTVgKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWAogCXNlbGVjdCBNWENfVUxQSSBpZiBVU0JfVUxQSQpAQCAtMTY3LDExICsxNzgsMjAgQEAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgR2VuZXNpIEVmaWthIFNtYXJ0Ym9vay4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYwogCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgogCi1lbmRpZiAjIEFSQ0hfTVg1MQotCi1pZiBBUkNIX01YNTNfU1VQUE9SVEVECiBjb21tZW50ICJpLk1YNTMgbWFjaGluZXM6IgogCitjb25maWcgTUFDSF9JTVg1M19EVAorCWJvb2wgIlN1cHBvcnQgaS5NWDUzIHBsYXRmb3JtcyBmcm9tIGRldmljZSB0cmVlIgorCXNlbGVjdCBTT0NfSU1YNTMKKwlzZWxlY3QgVVNFX09GCisJc2VsZWN0IE1BQ0hfTVg1M19BUkQKKwlzZWxlY3QgTUFDSF9NWDUzX0VWSworCXNlbGVjdCBNQUNIX01YNTNfTE9DTworCXNlbGVjdCBNQUNIX01YNTNfU01ECisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBGcmVlc2NhbGUgaS5NWDUzIGJhc2VkIHBsYXRmb3JtcworCSAgdXNpbmcgdGhlIGRldmljZSB0cmVlIGZvciBkaXNjb3ZlcnkKKwogY29uZmlnIE1BQ0hfTVg1M19FVksKIAlib29sICJTdXBwb3J0IE1YNTMgRVZLIHBsYXRmb3JtcyIKIAlzZWxlY3QgU09DX0lNWDUzCkBAIC0yMjEsNiArMjQxLDQgQEAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgTVg1MyBBUkQgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKIAkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KIAotZW5kaWYgIyBBUkNIX01YNTNfU1VQUE9SVEVECi0KIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXg1L01ha2VmaWxlCmluZGV4IDM4M2U3Y2QuLjBmYzYwODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L01ha2VmaWxlCkBAIC0zLDggKzMsNyBAQAogIwogCiAjIE9iamVjdCBmaWxlIGxpc3RzLgotb2JqLXkgICA6PSBjcHUubyBtbS5vIGNsb2NrLW14NTEtbXg1My5vIGRldmljZXMubyBlaGNpLm8gc3lzdGVtLm8KLW9iai0kKENPTkZJR19TT0NfSU1YNTApICs9IG1tLW14NTAubworb2JqLXkgICA6PSBjcHUubyBtbS5vIGNsb2NrLW14NTEtbXg1My5vIGVoY2kubyBzeXN0ZW0ubwogCiBvYmotJChDT05GSUdfUE0pICs9IHBtLWlteDUubwogb2JqLSQoQ09ORklHX0NQVV9GUkVRX0lNWCkgICAgKz0gY3B1X29wLW14NTEubwpAQCAtMjIsMyArMjEsNiBAQAogb2JqLSQoQ09ORklHX01BQ0hfTVg1MV9FRklLQU1YKSArPSBib2FyZC1teDUxX2VmaWthbXgubwogb2JqLSQoQ09ORklHX01BQ0hfTVg1MV9FRklLQVNCKSArPSBib2FyZC1teDUxX2VmaWthc2Iubwogb2JqLSQoQ09ORklHX01BQ0hfTVg1MF9SRFApICs9IGJvYXJkLW14NTBfcmRwLm8KKworb2JqLSQoQ09ORklHX01BQ0hfSU1YNTFfRFQpICs9IGlteDUxLWR0Lm8KK29iai0kKENPTkZJR19NQUNIX0lNWDUzX0RUKSArPSBpbXg1My1kdC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MS5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtY3B1aW14NTEuYwppbmRleCA2ODkzNGVhLi4xZmMxMTAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLWNwdWlteDUxLmMKQEAgLTIyLDIxICsyMiwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvZXVrcmVhLWJhc2Vib2FyZHMuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14NTEuaD4KIAotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLWlteDUxLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgogCiAjZGVmaW5lIENQVUlNWDUxX1VTQkgxX1NUUAlJTVhfR1BJT19OUigxLCAyNykKICNkZWZpbmUgQ1BVSU1YNTFfUVVBUlRBX0dQSU8JSU1YX0dQSU9fTlIoMywgMjgpCkBAIC01Nyw3ICs1NCw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZSA9ICh1bnNpZ25lZCBsb25nKShNWDUxX0NTMV9CQVNFX0FERFIgKyAweDQwMDAwMCksCi0JCS5pcnEgPSBncGlvX3RvX2lycShDUFVJTVg1MV9RVUFSVEFfR1BJTyksCisJCS5pcnEgPSBJTVhfR1BJT19UT19JUlEoQ1BVSU1YNTFfUVVBUlRBX0dQSU8pLAogCQkuaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfSElHSCwKIAkJLnVhcnRjbGsgPSBDUFVJTVg1MV9RVUFSVF9YVEFMLAogCQkucmVnc2hpZnQgPSBDUFVJTVg1MV9RVUFSVF9SRUdTSElGVCwKQEAgLTY1LDcgKzYyLDcgQEAKIAkJLmZsYWdzID0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUIHwgVVBGX0lPUkVNQVAsCiAJfSwgewogCQkubWFwYmFzZSA9ICh1bnNpZ25lZCBsb25nKShNWDUxX0NTMV9CQVNFX0FERFIgKyAweDgwMDAwMCksCi0JCS5pcnEgPSBncGlvX3RvX2lycShDUFVJTVg1MV9RVUFSVEJfR1BJTyksCisJCS5pcnEgPSBJTVhfR1BJT19UT19JUlEoQ1BVSU1YNTFfUVVBUlRCX0dQSU8pLAogCQkuaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfSElHSCwKIAkJLnVhcnRjbGsgPSBDUFVJTVg1MV9RVUFSVF9YVEFMLAogCQkucmVnc2hpZnQgPSBDUFVJTVg1MV9RVUFSVF9SRUdTSElGVCwKQEAgLTczLDcgKzcwLDcgQEAKIAkJLmZsYWdzID0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUIHwgVVBGX0lPUkVNQVAsCiAJfSwgewogCQkubWFwYmFzZSA9ICh1bnNpZ25lZCBsb25nKShNWDUxX0NTMV9CQVNFX0FERFIgKyAweDEwMDAwMDApLAotCQkuaXJxID0gZ3Bpb190b19pcnEoQ1BVSU1YNTFfUVVBUlRDX0dQSU8pLAorCQkuaXJxID0gSU1YX0dQSU9fVE9fSVJRKENQVUlNWDUxX1FVQVJUQ19HUElPKSwKIAkJLmlycWZsYWdzID0gSVJRRl9UUklHR0VSX0hJR0gsCiAJCS51YXJ0Y2xrID0gQ1BVSU1YNTFfUVVBUlRfWFRBTCwKIAkJLnJlZ3NoaWZ0ID0gQ1BVSU1YNTFfUVVBUlRfUkVHU0hJRlQsCkBAIC04MSw3ICs3OCw3IEBACiAJCS5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAogCX0sIHsKIAkJLm1hcGJhc2UgPSAodW5zaWduZWQgbG9uZykoTVg1MV9DUzFfQkFTRV9BRERSICsgMHgyMDAwMDAwKSwKLQkJLmlycSA9IGdwaW9fdG9faXJxKENQVUlNWDUxX1FVQVJURF9HUElPKSwKKwkJLmlycSA9IElNWF9HUElPX1RPX0lSUShDUFVJTVg1MV9RVUFSVERfR1BJTyksCiAJCS5pcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdILAogCQkudWFydGNsayA9IENQVUlNWDUxX1FVQVJUX1hUQUwsCiAJCS5yZWdzaGlmdCA9IENQVUlNWDUxX1FVQVJUX1JFR1NISUZULApAQCAtMTY3LDcgKzE2NCw3IEBACiAJdm9pZCBfX2lvbWVtICp1c2JfYmFzZTsKIAl2b2lkIF9faW9tZW0gKnVzYm90aGVyX2Jhc2U7CiAKLQl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9PVEdfQkFTRV9BRERSLCBTWl80Syk7CisJdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfVVNCX09UR19CQVNFX0FERFIsIFNaXzRLKTsKIAlpZiAoIXVzYl9iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAl1c2JvdGhlcl9iYXNlID0gdXNiX2Jhc2UgKyBNWDVfVVNCT1RIRVJfUkVHU19PRkZTRVQ7CkBAIC0xOTAsNyArMTg3LDcgQEAKIAl2b2lkIF9faW9tZW0gKnVzYl9iYXNlOwogCXZvaWQgX19pb21lbSAqdXNib3RoZXJfYmFzZTsKIAotCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX09UR19CQVNFX0FERFIsIFNaXzRLKTsKKwl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9VU0JfT1RHX0JBU0VfQUREUiwgU1pfNEspOwogCWlmICghdXNiX2Jhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCXVzYm90aGVyX2Jhc2UgPSB1c2JfYmFzZSArIE1YNV9VU0JPVEhFUl9SRUdTX09GRlNFVDsKQEAgLTIwNiwxNyArMjAzLDE3IEBACiAJCQlNWENfRUhDSV9JVENfTk9fVEhSRVNIT0xEKTsKIH0KIAotc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIGRyX3V0bWlfY29uZmlnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIGRyX3V0bWlfY29uZmlnIF9faW5pdGNvbnN0ID0gewogCS5pbml0CQk9IGluaXRpYWxpemVfb3RnX3BvcnQsCiAJLnBvcnRzYwk9IE1YQ19FSENJX1VUTUlfMTZCSVQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZzbF91c2IyX3BsYXRmb3JtX2RhdGEgdXNiX3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIHVzYl9wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkub3BlcmF0aW5nX21vZGUJPSBGU0xfVVNCMl9EUl9ERVZJQ0UsCiAJLnBoeV9tb2RlCT0gRlNMX1VTQjJfUEhZX1VUTUlfV0lERSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB1c2JoMV9jb25maWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDFfY29uZmlnIF9faW5pdGNvbnN0ID0gewogCS5pbml0CQk9IGluaXRpYWxpemVfdXNiaDFfcG9ydCwKIAkucG9ydHNjCT0gTVhDX0VIQ0lfTU9ERV9VTFBJLAogfTsKQEAgLTI3MCwxMiArMjY3LDEyIEBACiAJCQkJQVJSQVlfU0laRShldWtyZWFfY3B1aW14NTFfaTJjX2RldmljZXMpKTsKIAogCWlmIChvdGdfbW9kZV9ob3N0KQotCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiZHJfaG9zdF9kZXZpY2UsICZkcl91dG1pX2NvbmZpZyk7CisJCWlteDUxX2FkZF9teGNfZWhjaV9vdGcoJmRyX3V0bWlfY29uZmlnKTsKIAllbHNlIHsKIAkJaW5pdGlhbGl6ZV9vdGdfcG9ydChOVUxMKTsKLQkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmRyX3VkY19kZXZpY2UsICZ1c2JfcGRhdGEpOworCQlpbXg1MV9hZGRfZnNsX3VzYjJfdWRjKCZ1c2JfcGRhdGEpOwogCX0KLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiaDFfZGV2aWNlLCAmdXNiaDFfY29uZmlnKTsKKwlpbXg1MV9hZGRfbXhjX2VoY2lfaHMoMSwgJnVzYmgxX2NvbmZpZyk7CiAKICNpZmRlZiBDT05GSUdfTUFDSF9FVUtSRUFfTUJJTVg1MV9CQVNFQk9BUkQKIAlldWtyZWFfbWJpbXg1MV9iYXNlYm9hcmRfaW5pdCgpOwpAQCAtMjkzLDEwICsyOTAsMTEgQEAKIAogTUFDSElORV9TVEFSVChFVUtSRUFfQ1BVSU1YNTEsICJFdWtyZWEgQ1BVSU1YNTEgTW9kdWxlIikKIAkvKiBNYWludGFpbmVyOiBFcmljIELDqW5hcmQgPGVyaWNAZXVrcmVhLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDUxX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14NTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14NTFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDUxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14NTFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXhjX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBldWtyZWFfY3B1aW14NTFfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MXNkLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MXNkLmMKaW5kZXggZmYwOTZkNS4uNTJhMTFjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtY3B1aW14NTFzZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLWNwdWlteDUxc2QuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9jYW4vcGxhdGZvcm0vbWNwMjUxeC5oPgpAQCAtMzIsMTQgKzMxLDEyIEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXg1MS5oPgogCi0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogI2luY2x1ZGUgImRldmljZXMtaW14NTEuaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCiAjaW5jbHVkZSAiY3B1X29wLW14NTEuaCIKIAogI2RlZmluZSBVU0JIMV9SU1QJCUlNWF9HUElPX05SKDIsIDI4KQpAQCAtMTA4LDcgKzEwNSw3IEBACiAKIAkvKiBUb3VjaHNjcmVlbiAqLwogCS8qIElSUSAqLwotCV9NWDUxX1BBRF9HUElPX05BTkRfX0dQSU9fTkFORCB8IE1VWF9QQURfQ1RSTChQQURfQ1RMX1BVU18yMktfVVAgfAorCU5FV19QQURfQ1RSTChNWDUxX1BBRF9HUElPX05BTkRfX0dQSU9fTkFORCwgUEFEX0NUTF9QVVNfMjJLX1VQIHwKIAkJCVBBRF9DVExfUEtFIHwgUEFEX0NUTF9TUkVfRkFTVCB8CiAJCQlQQURfQ1RMX0RTRV9ISUdIIHwgUEFEX0NUTF9QVUUgfCBQQURfQ1RMX0hZUyksCiB9OwpAQCAtMTI5LDcgKzEyNiw3IEBACiAJCUkyQ19CT0FSRF9JTkZPKCJ0c2MyMDA3IiwgMHg0OSksCiAJCS50eXBlCQk9ICJ0c2MyMDA3IiwKIAkJLnBsYXRmb3JtX2RhdGEJPSAmdHNjMjAwN19pbmZvLAotCQkuaXJxCQk9IGdwaW9fdG9faXJxKFRTQzIwMDdfSVJRR1BJTyksCisJCS5pcnEJCT0gSU1YX0dQSU9fVE9fSVJRKFRTQzIwMDdfSVJRR1BJTyksCiAJfSwKIH07CiAKQEAgLTE0OSw3ICsxNDYsNyBAQAogCXZvaWQgX19pb21lbSAqdXNiX2Jhc2U7CiAJdm9pZCBfX2lvbWVtICp1c2JvdGhlcl9iYXNlOwogCi0JdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfT1RHX0JBU0VfQUREUiwgU1pfNEspOworCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX1VTQl9PVEdfQkFTRV9BRERSLCBTWl80Syk7CiAJaWYgKCF1c2JfYmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJdXNib3RoZXJfYmFzZSA9IHVzYl9iYXNlICsgTVg1X1VTQk9USEVSX1JFR1NfT0ZGU0VUOwpAQCAtMTcyLDcgKzE2OSw3IEBACiAJdm9pZCBfX2lvbWVtICp1c2JfYmFzZTsKIAl2b2lkIF9faW9tZW0gKnVzYm90aGVyX2Jhc2U7CiAKLQl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9PVEdfQkFTRV9BRERSLCBTWl80Syk7CisJdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfVVNCX09UR19CQVNFX0FERFIsIFNaXzRLKTsKIAlpZiAoIXVzYl9iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAl1c2JvdGhlcl9iYXNlID0gdXNiX2Jhc2UgKyBNWDVfVVNCT1RIRVJfUkVHU19PRkZTRVQ7CkBAIC0xODksMTcgKzE4NiwxNyBAQAogCQkJTVhDX0VIQ0lfSVRDX05PX1RIUkVTSE9MRCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBkcl91dG1pX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBkcl91dG1pX2NvbmZpZyBfX2luaXRjb25zdCA9IHsKIAkuaW5pdAkJPSBpbml0aWFsaXplX290Z19wb3J0LAogCS5wb3J0c2MJPSBNWENfRUhDSV9VVE1JXzE2QklULAogfTsKIAotc3RhdGljIHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIHVzYl9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSB1c2JfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLm9wZXJhdGluZ19tb2RlCT0gRlNMX1VTQjJfRFJfREVWSUNFLAogCS5waHlfbW9kZQk9IEZTTF9VU0IyX1BIWV9VVE1JX1dJREUsCiB9OwogCi1zdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDFfY29uZmlnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIHVzYmgxX2NvbmZpZyBfX2luaXRjb25zdCA9IHsKIAkuaW5pdAkJPSBpbml0aWFsaXplX3VzYmgxX3BvcnQsCiAJLnBvcnRzYwk9IE1YQ19FSENJX01PREVfVUxQSSwKIH07CkBAIC0yNDUsNyArMjQyLDcgQEAKIAkJLm1vZGUJCT0gU1BJX01PREVfMCwKIAkJLmNoaXBfc2VsZWN0ICAgICA9IDAsCiAJCS5wbGF0Zm9ybV9kYXRhICAgPSAmbWNwMjUxeF9pbmZvLAotCQkuaXJxICAgICAgICAgICAgID0gZ3Bpb190b19pcnEoQ0FOX0lSUUdQSU8pCisJCS5pcnEgICAgICAgICAgICAgPSBJTVhfR1BJT19UT19JUlEoQ0FOX0lSUUdQSU8pCiAJfSwKIH07CiAKQEAgLTMwMywxNyArMzAwLDE3IEBACiAJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7CiAKIAlpZiAob3RnX21vZGVfaG9zdCkKLQkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmRyX2hvc3RfZGV2aWNlLCAmZHJfdXRtaV9jb25maWcpOworCQlpbXg1MV9hZGRfbXhjX2VoY2lfb3RnKCZkcl91dG1pX2NvbmZpZyk7CiAJZWxzZSB7CiAJCWluaXRpYWxpemVfb3RnX3BvcnQoTlVMTCk7Ci0JCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2Jkcl91ZGNfZGV2aWNlLCAmdXNiX3BkYXRhKTsKKwkJaW14NTFfYWRkX2ZzbF91c2IyX3VkYygmdXNiX3BkYXRhKTsKIAl9CiAKIAlncGlvX3JlcXVlc3QoVVNCSDFfUlNULCAidXNiX3JzdCIpOwogCWdwaW9fZGlyZWN0aW9uX291dHB1dChVU0JIMV9SU1QsIDApOwogCW1zbGVlcCgyMCk7CiAJZ3Bpb19zZXRfdmFsdWUoVVNCSDFfUlNULCAxKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiaDFfZGV2aWNlLCAmdXNiaDFfY29uZmlnKTsKKwlpbXg1MV9hZGRfbXhjX2VoY2lfaHMoMSwgJnVzYmgxX2NvbmZpZyk7CiAKICNpZmRlZiBDT05GSUdfTUFDSF9FVUtSRUFfTUJJTVhTRDUxX0JBU0VCT0FSRAogCWV1a3JlYV9tYmlteHNkNTFfYmFzZWJvYXJkX2luaXQoKTsKQEAgLTMzMSwxMCArMzI4LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoRVVLUkVBX0NQVUlNWDUxU0QsICJFdWtyZWEgQ1BVSU1YNTFTRCIpCiAJLyogTWFpbnRhaW5lcjogRXJpYyBCw6luYXJkIDxlcmljQGV1a3JlYS5jb20+ICovCi0JLmJvb3RfcGFyYW1zID0gTVg1MV9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDUxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDUxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXg1MV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDUxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14Y190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gZXVrcmVhX2NwdWlteDUxc2RfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUwX3JkcC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MF9yZHAuYwppbmRleCA3ZGUyNWM2Li5mYzM2MjFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUwX3JkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTBfcmRwLmMKQEAgLTIxOSw2ICsyMTksNyBAQAogCS5tYXBfaW8gPSBteDUwX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDUwX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXg1MF9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDUwX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14NTBfcmRwX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDUwX3JkcF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfM2RzLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxXzNkcy5jCmluZGV4IDA3YTM4MTUuLjA1NzgzOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfM2RzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV8zZHMuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPG1hY2gvM2RzX2RlYnVnYm9hcmQuaD4KIAogI2luY2x1ZGUgImRldmljZXMtaW14NTEuaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCiAKICNkZWZpbmUgRVhQSU9fUEFSRU5UX0lOVAlncGlvX3RvX2lycShJTVhfR1BJT19OUigxLCA2KSkKICNkZWZpbmUgTVg1MV8zRFNfRUNTUEkyX0NTCShHUElPX1BPUlRDICsgMjgpCkBAIC0xNjksMTAgKzE2OCwxMSBAQAogCiBNQUNISU5FX1NUQVJUKE1YNTFfM0RTLCAiRnJlZXNjYWxlIE1YNTEgMy1TdGFjayBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDUxX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14NTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14NTFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDUxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14NTFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXg1MV8zZHNfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14NTFfM2RzX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9iYWJiYWdlLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2JhYmJhZ2UuYwppbmRleCAxMWIwZmY2Li41YzgzNzYwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9iYWJiYWdlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9iYWJiYWdlLmMKQEAgLTI0LDE0ICsyNCwxMiBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14NTEuaD4KIAotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLWlteDUxLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgImNwdV9vcC1teDUxLmgiCiAKICNkZWZpbmUgQkFCQkFHRV9VU0JfSFVCX1JFU0VUCUlNWF9HUElPX05SKDEsIDcpCkBAIC0xNzYsNyArMTc0LDcgQEAKIAkuYml0cmF0ZSA9IDEwMDAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgYmFiYmFnZV9oc2kyY19kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSBiYWJiYWdlX2hzaTJjX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLmJpdHJhdGUgPSA0MDAwMDAsCiB9OwogCkBAIC0yNDksNyArMjQ3LDcgQEAKIAl2b2lkIF9faW9tZW0gKnVzYl9iYXNlOwogCXZvaWQgX19pb21lbSAqdXNib3RoZXJfYmFzZTsKIAotCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX09UR19CQVNFX0FERFIsIFNaXzRLKTsKKwl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9VU0JfT1RHX0JBU0VfQUREUiwgU1pfNEspOwogCWlmICghdXNiX2Jhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCXVzYm90aGVyX2Jhc2UgPSB1c2JfYmFzZSArIE1YNV9VU0JPVEhFUl9SRUdTX09GRlNFVDsKQEAgLTI3Miw3ICsyNzAsNyBAQAogCXZvaWQgX19pb21lbSAqdXNiX2Jhc2U7CiAJdm9pZCBfX2lvbWVtICp1c2JvdGhlcl9iYXNlOwogCi0JdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfT1RHX0JBU0VfQUREUiwgU1pfNEspOworCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX1VTQl9PVEdfQkFTRV9BRERSLCBTWl80Syk7CiAJaWYgKCF1c2JfYmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJdXNib3RoZXJfYmFzZSA9IHVzYl9iYXNlICsgTVg1X1VTQk9USEVSX1JFR1NfT0ZGU0VUOwpAQCAtMjg4LDE3ICsyODYsMTcgQEAKIAkJCU1YQ19FSENJX0lUQ19OT19USFJFU0hPTEQpOwogfQogCi1zdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgZHJfdXRtaV9jb25maWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgZHJfdXRtaV9jb25maWcgX19pbml0Y29uc3QgPSB7CiAJLmluaXQJCT0gaW5pdGlhbGl6ZV9vdGdfcG9ydCwKIAkucG9ydHNjCT0gTVhDX0VIQ0lfVVRNSV8xNkJJVCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSB1c2JfcGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZzbF91c2IyX3BsYXRmb3JtX2RhdGEgdXNiX3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5vcGVyYXRpbmdfbW9kZQk9IEZTTF9VU0IyX0RSX0RFVklDRSwKIAkucGh5X21vZGUJPSBGU0xfVVNCMl9QSFlfVVRNSV9XSURFLAogfTsKIAotc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIHVzYmgxX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB1c2JoMV9jb25maWcgX19pbml0Y29uc3QgPSB7CiAJLmluaXQJCT0gaW5pdGlhbGl6ZV91c2JoMV9wb3J0LAogCS5wb3J0c2MJPSBNWENfRUhDSV9NT0RFX1VMUEksCiB9OwpAQCAtMzUxLDIyICszNDksMjcgQEAKIAkud3BfdHlwZSA9IEVTREhDX1dQX0dQSU8sCiB9OwogCit2b2lkIF9faW5pdCBpbXg1MV9iYWJiYWdlX2NvbW1vbl9pbml0KHZvaWQpCit7CisJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1MWJhYmJhZ2VfcGFkcywKKwkJCQkJIEFSUkFZX1NJWkUobXg1MWJhYmJhZ2VfcGFkcykpOworfQorCiAvKgogICogQm9hcmQgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uCiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBteDUxX2JhYmJhZ2VfaW5pdCh2b2lkKQogewogCWlvbXV4X3YzX2NmZ190IHVzYmgxc3RwID0gTVg1MV9QQURfVVNCSDFfU1RQX19VU0JIMV9TVFA7Ci0JaW9tdXhfdjNfY2ZnX3QgcG93ZXJfa2V5ID0gX01YNTFfUEFEX0VJTV9BMjdfX0dQSU8yXzIxIHwKLQkJTVVYX1BBRF9DVFJMKFBBRF9DVExfU1JFX0ZBU1QgfCBQQURfQ1RMX0RTRV9ISUdIIHwgUEFEX0NUTF9QVVNfMTAwS19VUCk7CisJaW9tdXhfdjNfY2ZnX3QgcG93ZXJfa2V5ID0gTkVXX1BBRF9DVFJMKE1YNTFfUEFEX0VJTV9BMjdfX0dQSU8yXzIxLAorCQlQQURfQ1RMX1NSRV9GQVNUIHwgUEFEX0NUTF9EU0VfSElHSCB8IFBBRF9DVExfUFVTXzEwMEtfVVApOwogCiAJaW14NTFfc29jX2luaXQoKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9GUkVRX0lNWCkKIAlnZXRfY3B1X29wID0gbXg1MV9nZXRfY3B1X29wOwogI2VuZGlmCi0JbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1MWJhYmJhZ2VfcGFkcywKLQkJCQkJQVJSQVlfU0laRShteDUxYmFiYmFnZV9wYWRzKSk7CisJaW14NTFfYmFiYmFnZV9jb21tb25faW5pdCgpOwogCiAJaW14NTFfYWRkX2lteF91YXJ0KDAsICZ1YXJ0X3BkYXRhKTsKIAlpbXg1MV9hZGRfaW14X3VhcnQoMSwgTlVMTCk7CkBAIC0zODEsMTcgKzM4NCwxNyBAQAogCiAJaW14NTFfYWRkX2lteF9pMmMoMCwgJmJhYmJhZ2VfaTJjX2RhdGEpOwogCWlteDUxX2FkZF9pbXhfaTJjKDEsICZiYWJiYWdlX2kyY19kYXRhKTsKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfaHNpMmNfZGV2aWNlLCAmYmFiYmFnZV9oc2kyY19kYXRhKTsKKwlpbXg1MV9hZGRfaHNpMmMoJmJhYmJhZ2VfaHNpMmNfZGF0YSk7CiAKIAlpZiAob3RnX21vZGVfaG9zdCkKLQkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmRyX2hvc3RfZGV2aWNlLCAmZHJfdXRtaV9jb25maWcpOworCQlpbXg1MV9hZGRfbXhjX2VoY2lfb3RnKCZkcl91dG1pX2NvbmZpZyk7CiAJZWxzZSB7CiAJCWluaXRpYWxpemVfb3RnX3BvcnQoTlVMTCk7Ci0JCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2Jkcl91ZGNfZGV2aWNlLCAmdXNiX3BkYXRhKTsKKwkJaW14NTFfYWRkX2ZzbF91c2IyX3VkYygmdXNiX3BkYXRhKTsKIAl9CiAKIAlncGlvX3VzYmgxX2FjdGl2ZSgpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2JoMV9kZXZpY2UsICZ1c2JoMV9jb25maWcpOworCWlteDUxX2FkZF9teGNfZWhjaV9ocygxLCAmdXNiaDFfY29uZmlnKTsKIAkvKiBzZXRiYWNrIFVTQkgxX1NUUCB0byBiZSBmdW5jdGlvbiAqLwogCW14Y19pb211eF92M19zZXR1cF9wYWQodXNiaDFzdHApOwogCWJhYmJhZ2VfdXNiaHViX3Jlc2V0KCk7CkBAIC00MTYsMTAgKzQxOSwxMSBAQAogCiBNQUNISU5FX1NUQVJUKE1YNTFfQkFCQkFHRSwgIkZyZWVzY2FsZSBNWDUxIEJhYmJhZ2UgQm9hcmQiKQogCS8qIE1haW50YWluZXI6IEFtaXQgS3VjaGVyaWEgPGFtaXQua3VjaGVyaWFAY2Fub25pY2FsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDUxX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14NTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14NTFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDUxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14NTFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXg1MV9iYWJiYWdlX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDUxX2JhYmJhZ2VfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2VmaWthbXguYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FteC5jCmluZGV4IDU1MWRhZjguLmE5ZTQ4NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FteC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FteC5jCkBAIC0zMiwxNCArMzIsMTIgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pb211eC1teDUxLmg+CiAKLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy1pbXg1MS5oIgotI2luY2x1ZGUgImRldmljZXMuaCIKICNpbmNsdWRlICJlZmlrYS5oIgogCiAjZGVmaW5lIEVGSUtBTVhfUENCSUQwCQlJTVhfR1BJT19OUigzLCAxNikKQEAgLTE2Myw2ICsxNjEsMTEgQEAKIAkubnVtX2xlZHMgPSBBUlJBWV9TSVpFKG14NTFfZWZpa2FteF9sZWRzKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSBzZF9wZGF0YSA9IHsKKwkuY2RfdHlwZSA9IEVTREhDX0NEX0NPTlRST0xMRVIsCisJLndwX3R5cGUgPSBFU0RIQ19XUF9DT05UUk9MTEVSLAorfTsKKwogc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIG14NTFfZWZpa2FteF9wb3dlcmtleVtdID0gewogCXsKIAkJLmNvZGUgPSBLRVlfUE9XRVIsCkBAIC0yMzksOSArMjQyLDExIEBACiAKIAkvKiBvbiA8IDEuMiBib2FyZHMgYm90aCBTRCBjb250cm9sbGVycyBhcmUgdXNlZCAqLwogCWlmIChzeXN0ZW1fcmV2IDwgMHgxMikgewotCQlpbXg1MV9hZGRfc2RoY2lfZXNkaGNfaW14KDEsIE5VTEwpOworCQlpbXg1MV9hZGRfc2RoY2lfZXNkaGNfaW14KDAsIE5VTEwpOworCQlpbXg1MV9hZGRfc2RoY2lfZXNkaGNfaW14KDEsICZzZF9wZGF0YSk7CiAJCW14NTFfZWZpa2FteF9sZWRzWzJdLmRlZmF1bHRfdHJpZ2dlciA9ICJtbWMxIjsKLQl9CisJfSBlbHNlCisJCWlteDUxX2FkZF9zZGhjaV9lc2RoY19pbXgoMCwgJnNkX3BkYXRhKTsKIAogCWdwaW9fbGVkX3JlZ2lzdGVyX2RldmljZSgtMSwgJm14NTFfZWZpa2FteF9sZWRzX2RhdGEpOwogCWlteF9hZGRfZ3Bpb19rZXlzKCZteDUxX2VmaWthbXhfcG93ZXJrZXlfZGF0YSk7CkBAIC0yODAsMTAgKzI4NSwxMSBAQAogCiBNQUNISU5FX1NUQVJUKE1YNTFfRUZJS0FNWCwgIkdlbmVzaSBFZmlrYU1YIG5ldHRvcCIpCiAJLyogTWFpbnRhaW5lcjogQW1pdCBLdWNoZXJpYSA8YW1pdC5rdWNoZXJpYUBsaW5hcm8ub3JnPiAqLwotCS5ib290X3BhcmFtcyA9IE1YNTFfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXg1MV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXg1MV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14NTFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXg1MV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDUxX2VmaWthbXhfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14NTFfZWZpa2FteF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FzYi5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9lZmlrYXNiLmMKaW5kZXggOGE5YmNhMi4uMzhjNGEzZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9lZmlrYXNiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9lZmlrYXNiLmMKQEAgLTM1LDE0ICszNSwxMiBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14NTEuaD4KIAotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLWlteDUxLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgImVmaWthLmgiCiAKICNkZWZpbmUgRUZJS0FTQl9VU0JIMl9TVFAJSU1YX0dQSU9fTlIoMiwgMjApCkBAIC01Niw2ICs1NCw3IEBACiAjZGVmaW5lIEVGSUtBU0JfUkZLSUxMCQlJTVhfR1BJT19OUigzLCAxKQogCiAjZGVmaW5lIE1YNTFfUEFEX1BXUktFWSBJT01VWF9QQUQoMHg0OGMsIDB4MGY4LCAxLCAweDAsICAgMCwgUEFEX0NUTF9QVVNfMTAwS19VUCB8IFBBRF9DVExfUEtFKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfQ0QJSU9NVVhfUEFEKDB4NDdjLCAweDBlOCwgMSwgX19OQV8sIDAsIE1YNTFfRVNESENfUEFEX0NUUkwpCiAKIHN0YXRpYyBpb211eF92M19jZmdfdCBteDUxZWZpa2FzYl9wYWRzW10gPSB7CiAJLyogVVNCIEhPU1QyICovCkBAIC05Nyw2ICs5Niw4IEBACiAKIAkvKiBCVCAqLwogCU1YNTFfUEFEX0VJTV9BMTdfX0dQSU8yXzExLAorCisJTVg1MV9QQURfU0QxX0NELAogfTsKIAogc3RhdGljIGludCBpbml0aWFsaXplX3VzYmgyX3BvcnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTExOSw3ICsxMjAsNyBAQAogCXJldHVybiBteDUxX2luaXRpYWxpemVfdXNiX2h3KHBkZXYtPmlkLCBNWENfRUhDSV9JVENfTk9fVEhSRVNIT0xEKTsKIH0KIAotc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIHVzYmgyX2NvbmZpZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB1c2JoMl9jb25maWcgX19pbml0ZGF0YSA9IHsKIAkuaW5pdCAgID0gaW5pdGlhbGl6ZV91c2JoMl9wb3J0LAogCS5wb3J0c2MgPSBNWENfRUhDSV9NT0RFX1VMUEksCiB9OwpAQCAtMTI5LDcgKzEzMCw3IEBACiAJdXNiaDJfY29uZmlnLm90ZyA9IGlteF9vdGdfdWxwaV9jcmVhdGUoVUxQSV9PVEdfRFJWVkJVUyB8CiAJCQlVTFBJX09UR19EUlZWQlVTX0VYVCB8IFVMUElfT1RHX0VYVFZCVVNJTkQpOwogCWlmICh1c2JoMl9jb25maWcub3RnKQotCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiaDJfZGV2aWNlLCAmdXNiaDJfY29uZmlnKTsKKwkJaW14NTFfYWRkX214Y19laGNpX2hzKDIsICZ1c2JoMl9jb25maWcpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkIG14NTFfZWZpa2FzYl9sZWRzW10gX19pbml0Y29uc3QgPSB7CkBAIC0xODIsNiArMTgzLDE4IEBACiAJLm5idXR0b25zID0gQVJSQVlfU0laRShteDUxX2VmaWthc2Jfa2V5cyksCiB9OwogCitzdGF0aWMgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgc2QwX3BkYXRhID0geworI2RlZmluZSBFRklLQVNCX1NEMV9DRAlJTVhfR1BJT19OUigyLCAyNykKKwkuY2RfZ3BpbyA9IEVGSUtBU0JfU0QxX0NELAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKKwkud3BfdHlwZSA9IEVTREhDX1dQX0NPTlRST0xMRVIsCit9OworCitzdGF0aWMgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgc2QxX3BkYXRhID0geworCS5jZF90eXBlID0gRVNESENfQ0RfQ09OVFJPTExFUiwKKwkud3BfdHlwZSA9IEVTREhDX1dQX0NPTlRST0xMRVIsCit9OworCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqcHdndDEsICpwd2d0MjsKIAogc3RhdGljIHZvaWQgbXg1MV9lZmlrYXNiX3Bvd2VyX29mZih2b2lkKQpAQCAtMjUwLDcgKzI2Myw4IEBACiAKIAlteDUxX2VmaWthc2JfYm9hcmRfaWQoKTsKIAlteDUxX2VmaWthc2JfdXNiKCk7Ci0JaW14NTFfYWRkX3NkaGNpX2VzZGhjX2lteCgxLCBOVUxMKTsKKwlpbXg1MV9hZGRfc2RoY2lfZXNkaGNfaW14KDAsICZzZDBfcGRhdGEpOworCWlteDUxX2FkZF9zZGhjaV9lc2RoY19pbXgoMSwgJnNkMV9wZGF0YSk7CiAKIAlncGlvX2xlZF9yZWdpc3Rlcl9kZXZpY2UoLTEsICZteDUxX2VmaWthc2JfbGVkc19kYXRhKTsKIAlpbXhfYWRkX2dwaW9fa2V5cygmbXg1MV9lZmlrYXNiX2tleXNfZGF0YSk7CkBAIC0yNjYsMTAgKzI4MCwxMSBAQAogfTsKIAogTUFDSElORV9TVEFSVChNWDUxX0VGSUtBU0IsICJHZW5lc2kgRWZpa2EgU21hcnRib29rIikKLQkuYm9vdF9wYXJhbXMgPSBNWDUxX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14NTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14NTFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDUxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14NTFfaGFuZGxlX2lycSwKIAkuaW5pdF9tYWNoaW5lID0gIGVmaWthc2JfYm9hcmRfaW5pdCwKIAkudGltZXIgPSAmbXg1MV9lZmlrYXNiX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfYXJkLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2FyZC5jCmluZGV4IDc2YTY3YzQuLjBkN2YwZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19hcmQuYwpAQCAtMTM0LDggKzEzNCw4IEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJewotCQkuc3RhcnQgPSAgZ3Bpb190b19pcnEoQVJEX0VUSEVSTkVUX0lOVF9CKSwKLQkJLmVuZCA9ICBncGlvX3RvX2lycShBUkRfRVRIRVJORVRfSU5UX0IpLAorCQkuc3RhcnQgPSAgSU1YX0dQSU9fVE9fSVJRKEFSRF9FVEhFUk5FVF9JTlRfQiksCisJCS5lbmQgPSAgSU1YX0dQSU9fVE9fSVJRKEFSRF9FVEhFUk5FVF9JTlRfQiksCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiB9OwpAQCAtMTcxLDkgKzE3MSw2IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBteDUzX2FyZF9pb19pbml0KHZvaWQpCiB7Ci0JbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1M19hcmRfcGFkcywKLQkJCQlBUlJBWV9TSVpFKG14NTNfYXJkX3BhZHMpKTsKLQogCWdwaW9fcmVxdWVzdChBUkRfRVRIRVJORVRfSU5UX0IsICJldGgtaW50LWIiKTsKIAlncGlvX2RpcmVjdGlvbl9pbnB1dChBUkRfRVRIRVJORVRfSU5UX0IpOwogCkBAIC0yMTYsNiArMjEzLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgX19pbml0IGlteDUzX2FyZF9jb21tb25faW5pdCh2b2lkKQoreworCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14NTNfYXJkX3BhZHMsCisJCQkJCSBBUlJBWV9TSVpFKG14NTNfYXJkX3BhZHMpKTsKKwl3ZWltX2NzX2NvbmZpZygpOworfQorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmFyZF9zbXNjX2xhbjkyMjBfZGV2aWNlLAogfTsKQEAgLTIyNSw4ICsyMjksOCBAQAogCWlteDUzX3NvY19pbml0KCk7CiAJaW14NTNfYWRkX2lteF91YXJ0KDAsIE5VTEwpOwogCisJaW14NTNfYXJkX2NvbW1vbl9pbml0KCk7CiAJbXg1M19hcmRfaW9faW5pdCgpOwotCXdlaW1fY3NfY29uZmlnKCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiAKIAlpbXg1M19hZGRfc2RoY2lfZXNkaGNfaW14KDAsICZteDUzX2FyZF9zZDFfZGF0YSk7CkBAIC0yMzQsNiArMjM4LDcgQEAKIAlpbXg1M19hZGRfaW14X2kyYygxLCAmbXg1M19hcmRfaTJjMl9kYXRhKTsKIAlpbXg1M19hZGRfaW14X2kyYygyLCAmbXg1M19hcmRfaTJjM19kYXRhKTsKIAlpbXhfYWRkX2dwaW9fa2V5cygmYXJkX2J1dHRvbl9kYXRhKTsKKwlpbXg1M19hZGRfYWhjaV9pbXgoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG14NTNfYXJkX3RpbWVyX2luaXQodm9pZCkKQEAgLTI0OSw2ICsyNTQsNyBAQAogCS5tYXBfaW8gPSBteDUzX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDUzX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXg1M19pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDUzX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14NTNfYXJkX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDUzX2FyZF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfZXZrLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2V2ay5jCmluZGV4IDFiNDE3YjAuLjZiZWEzMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfZXZrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19ldmsuYwpAQCAtMTMxLDEyICsxMzEsMTcgQEAKIAkubnVtX2NoaXBzZWxlY3QgPSBBUlJBWV9TSVpFKG14NTNfZXZrX3NwaV9jcyksCiB9OwogCit2b2lkIF9faW5pdCBpbXg1M19ldmtfY29tbW9uX2luaXQodm9pZCkKK3sKKwlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDUzX2V2a19wYWRzLAorCQkJCQkgQVJSQVlfU0laRShteDUzX2V2a19wYWRzKSk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBteDUzX2V2a19ib2FyZF9pbml0KHZvaWQpCiB7CiAJaW14NTNfc29jX2luaXQoKTsKKwlpbXg1M19ldmtfY29tbW9uX2luaXQoKTsKIAotCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14NTNfZXZrX3BhZHMsCi0JCQkJCUFSUkFZX1NJWkUobXg1M19ldmtfcGFkcykpOwogCW14NTNfZXZrX2luaXRfdWFydCgpOwogCW14NTNfZXZrX2ZlY19yZXNldCgpOwogCWlteDUzX2FkZF9mZWMoJm14NTNfZXZrX2ZlY19wZGF0YSk7CkBAIC0xNjcsNiArMTcyLDcgQEAKIAkubWFwX2lvID0gbXg1M19tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXg1M19pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14NTNfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXg1M19oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDUzX2V2a190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXg1M19ldmtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfbG9jby5jCmluZGV4IDRlMWQ1MWQuLjc2NzhmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfbG9jby5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfbG9jby5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KQEAgLTQyLDYgKzQzLDcgQEAKICNkZWZpbmUgTE9DT19TRDNfQ0QJCQlJTVhfR1BJT19OUigzLCAxMSkKICNkZWZpbmUgTE9DT19TRDNfV1AJCQlJTVhfR1BJT19OUigzLCAxMikKICNkZWZpbmUgTE9DT19TRDFfQ0QJCQlJTVhfR1BJT19OUigzLCAxMykKKyNkZWZpbmUgTE9DT19BQ0NFTF9FTgkJCUlNWF9HUElPX05SKDYsIDE0KQogCiBzdGF0aWMgaW9tdXhfdjNfY2ZnX3QgbXg1M19sb2NvX3BhZHNbXSA9IHsKIAkvKiBGRUMgKi8KQEAgLTY0LDYgKzY2LDEwIEBACiAJTVg1M19QQURfS0VZX1JPVzBfX0FVRE1VWF9BVUQ1X1RYRCwKIAlNWDUzX1BBRF9LRVlfQ09MMV9fQVVETVVYX0FVRDVfVFhGUywKIAlNWDUzX1BBRF9LRVlfUk9XMV9fQVVETVVYX0FVRDVfUlhELAorCS8qIEkyQzEgKi8KKwlNWDUzX1BBRF9DU0kwX0RBVDhfX0kyQzFfU0RBLAorCU1YNTNfUEFEX0NTSTBfREFUOV9fSTJDMV9TQ0wsCisJTVg1M19QQURfTkFOREZfQ1MxX19HUElPNl8xNCwJLyogQWNjZWxlcm9tZXRlciBFbmFibGUgKi8KIAkvKiBJMkMyICovCiAJTVg1M19QQURfS0VZX0NPTDNfX0kyQzJfU0NMLAogCU1YNTNfUEFEX0tFWV9ST1czX19JMkMyX1NEQSwKQEAgLTI1NywyMiArMjYzLDQyIEBACiAJLm51bV9sZWRzCT0gQVJSQVlfU0laRShteDUzbG9jb19sZWRzKSwKIH07CiAKK3ZvaWQgX19pbml0IGlteDUzX3FzYl9jb21tb25faW5pdCh2b2lkKQoreworCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14NTNfbG9jb19wYWRzLAorCQkJCQkgQVJSQVlfU0laRShteDUzX2xvY29fcGFkcykpOworfQorCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIG14NTNsb2NvX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygibW1hODQ1MCIsIDB4MUMpLAorCX0sCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgbXg1M19sb2NvX2JvYXJkX2luaXQodm9pZCkKIHsKKwlpbnQgcmV0OwogCWlteDUzX3NvY19pbml0KCk7CisJaW14NTNfcXNiX2NvbW1vbl9pbml0KCk7CiAKLQlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDUzX2xvY29fcGFkcywKLQkJCQkJQVJSQVlfU0laRShteDUzX2xvY29fcGFkcykpOwogCWlteDUzX2FkZF9pbXhfdWFydCgwLCBOVUxMKTsKIAlteDUzX2xvY29fZmVjX3Jlc2V0KCk7CiAJaW14NTNfYWRkX2ZlYygmbXg1M19sb2NvX2ZlY19kYXRhKTsKIAlpbXg1M19hZGRfaW14Ml93ZHQoMCwgTlVMTCk7CisKKwlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKExPQ09fQUNDRUxfRU4sIEdQSU9GX09VVF9JTklUX0hJR0gsICJhY2NlbF9lbiIpOworCWlmIChyZXQpCisJCXByX2VycigiQ2Fubm90IHJlcXVlc3QgQUNDRUxfRU4gcGluOiAlZFxuIiwgcmV0KTsKKworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIG14NTNsb2NvX2kyY19kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUobXg1M2xvY29faTJjX2RldmljZXMpKTsKIAlpbXg1M19hZGRfaW14X2kyYygwLCAmbXg1M19sb2NvX2kyY19kYXRhKTsKIAlpbXg1M19hZGRfaW14X2kyYygxLCAmbXg1M19sb2NvX2kyY19kYXRhKTsKIAlpbXg1M19hZGRfc2RoY2lfZXNkaGNfaW14KDAsICZteDUzX2xvY29fc2QxX2RhdGEpOwogCWlteDUzX2FkZF9zZGhjaV9lc2RoY19pbXgoMiwgJm14NTNfbG9jb19zZDNfZGF0YSk7CiAJaW14X2FkZF9ncGlvX2tleXMoJmxvY29fYnV0dG9uX2RhdGEpOwogCWdwaW9fbGVkX3JlZ2lzdGVyX2RldmljZSgtMSwgJm14NTNsb2NvX2xlZHNfZGF0YSk7CisJaW14NTNfYWRkX2FoY2lfaW14KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBteDUzX2xvY29fdGltZXJfaW5pdCh2b2lkKQpAQCAtMjg4LDYgKzMxNCw3IEBACiAJLm1hcF9pbyA9IG14NTNfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14NTNfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDUzX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14NTNfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXg1M19sb2NvX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDUzX2xvY29fYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX3NtZC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19zbWQuYwppbmRleCBiYzAyODk0Li41OWMwODQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX3NtZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfc21kLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJkZXZpY2VzLWlteDUzLmgiCiAKICNkZWZpbmUgU01EX0ZFQ19QSFlfUlNUCQlJTVhfR1BJT19OUig3LCA2KQorI2RlZmluZSBNWDUzX1NNRF9TQVRBX1BXUl9FTiAgICBJTVhfR1BJT19OUigzLCAzKQogCiBzdGF0aWMgaW9tdXhfdjNfY2ZnX3QgbXg1M19zbWRfcGFkc1tdID0gewogCU1YNTNfUEFEX0NTSTBfREFUMTBfX1VBUlQxX1RYRF9NVVgsCkBAIC0xMTEsMTIgKzExMiwzMCBAQAogCS5iaXRyYXRlID0gMTAwMDAwLAogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIG14NTNfc21kX2FoY2lfcHdyX29uKHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIEVuYWJsZSBTQVRBIFBXUiAqLworCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoTVg1M19TTURfU0FUQV9QV1JfRU4sCisJCQlHUElPRl9ESVJfT1VUIHwgR1BJT0ZfSU5JVF9ISUdILCAiYWhjaS1zYXRhLXB3ciIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gZW5hYmxlIFNBVEFfUFdSX0VOOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KK30KKwordm9pZCBfX2luaXQgaW14NTNfc21kX2NvbW1vbl9pbml0KHZvaWQpCit7CisJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1M19zbWRfcGFkcywKKwkJCQkJIEFSUkFZX1NJWkUobXg1M19zbWRfcGFkcykpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgbXg1M19zbWRfYm9hcmRfaW5pdCh2b2lkKQogewogCWlteDUzX3NvY19pbml0KCk7CisJaW14NTNfc21kX2NvbW1vbl9pbml0KCk7CiAKLQlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDUzX3NtZF9wYWRzLAotCQkJCQlBUlJBWV9TSVpFKG14NTNfc21kX3BhZHMpKTsKIAlteDUzX3NtZF9pbml0X3VhcnQoKTsKIAlteDUzX3NtZF9mZWNfcmVzZXQoKTsKIAlpbXg1M19hZGRfZmVjKCZteDUzX3NtZF9mZWNfZGF0YSk7CkBAIC0xMjUsNiArMTQ0LDggQEAKIAlpbXg1M19hZGRfc2RoY2lfZXNkaGNfaW14KDAsIE5VTEwpOwogCWlteDUzX2FkZF9zZGhjaV9lc2RoY19pbXgoMSwgTlVMTCk7CiAJaW14NTNfYWRkX3NkaGNpX2VzZGhjX2lteCgyLCBOVUxMKTsKKwlteDUzX3NtZF9haGNpX3B3cl9vbigpOworCWlteDUzX2FkZF9haGNpX2lteCgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXg1M19zbWRfdGltZXJfaW5pdCh2b2lkKQpAQCAtMTQwLDYgKzE2MSw3IEBACiAJLm1hcF9pbyA9IG14NTNfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14NTNfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDUzX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14NTNfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXg1M19zbWRfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14NTNfc21kX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMgYi9hcmNoL2FybS9tYWNoLW14NS9jbG9jay1teDUxLW14NTMuYwppbmRleCBmN2JmOTk2Li40Y2IyNzY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9jbG9jay1teDUxLW14NTMuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9jbG9jay1teDUxLW14NTMuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCkBAIC0xMjgwLDkgKzEyODEsOSBAQAogCU5VTEwsICBOVUxMLCAmaXBnX2NsaywgJmdwdF9pcGdfY2xrKTsKIAogREVGSU5FX0NMT0NLKHB3bTFfY2xrLCAwLCBNWENfQ0NNX0NDR1IyLCBNWENfQ0NNX0NDR1J4X0NHNl9PRkZTRVQsCi0JTlVMTCwgTlVMTCwgJmlwZ19jbGssIE5VTEwpOworCU5VTEwsIE5VTEwsICZpcGdfcGVyY2xrLCBOVUxMKTsKIERFRklORV9DTE9DSyhwd20yX2NsaywgMCwgTVhDX0NDTV9DQ0dSMiwgTVhDX0NDTV9DQ0dSeF9DRzhfT0ZGU0VULAotCU5VTEwsIE5VTEwsICZpcGdfY2xrLCBOVUxMKTsKKwlOVUxMLCBOVUxMLCAmaXBnX3BlcmNsaywgTlVMTCk7CiAKIC8qIEkyQyAqLwogREVGSU5FX0NMT0NLKGkyYzFfY2xrLCAwLCBNWENfQ0NNX0NDR1IxLCBNWENfQ0NNX0NDR1J4X0NHOV9PRkZTRVQsCkBAIC0xNDAxLDYgKzE0MDIsMjIgQEAKIAkuc2Vjb25kYXJ5ID0gJmVzZGhjNF9pcGdfY2xrLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgc2F0YV9jbGsgPSB7CisJLnBhcmVudCA9ICZpcGdfY2xrLAorCS5lbmFibGUgPSBfY2xrX21heF9lbmFibGUsCisJLmVuYWJsZV9yZWcgPSBNWENfQ0NNX0NDR1I0LAorCS5lbmFibGVfc2hpZnQgPSBNWENfQ0NNX0NDR1J4X0NHMV9PRkZTRVQsCisJLmRpc2FibGUgPSBfY2xrX21heF9kaXNhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYWhjaV9waHlfY2xrID0geworCS5wYXJlbnQgPSAmdXNiX3BoeTFfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYWhjaV9kbWFfY2xrID0geworCS5wYXJlbnQgPSAmYWhiX2NsaywKK307CisKIERFRklORV9DTE9DSyhtaXBpX2VzY19jbGssIDAsIE1YQ19DQ01fQ0NHUjQsIE1YQ19DQ01fQ0NHUnhfQ0c1X09GRlNFVCwgTlVMTCwgTlVMTCwgTlVMTCwgJnBsbDJfc3dfY2xrKTsKIERFRklORV9DTE9DSyhtaXBpX2hzYzJfY2xrLCAwLCBNWENfQ0NNX0NDR1I0LCBNWENfQ0NNX0NDR1J4X0NHNF9PRkZTRVQsIE5VTEwsIE5VTEwsICZtaXBpX2VzY19jbGssICZwbGwyX3N3X2Nsayk7CiBERUZJTkVfQ0xPQ0sobWlwaV9oc2MxX2NsaywgMCwgTVhDX0NDTV9DQ0dSNCwgTVhDX0NDTV9DQ0dSeF9DRzNfT0ZGU0VULCBOVUxMLCBOVUxMLCAmbWlwaV9oc2MyX2NsaywgJnBsbDJfc3dfY2xrKTsKQEAgLTE0MTgsNiArMTQzNSwxMCBAQAogREVGSU5FX0NMT0NLKGlwdV9kaTFfY2xrLCAwLCBNWENfQ0NNX0NDR1I2LCBNWENfQ0NNX0NDR1J4X0NHNl9PRkZTRVQsCiAJCU5VTEwsIE5VTEwsICZwbGwzX3N3X2NsaywgTlVMTCk7CiAKKy8qIFBBVEEgKi8KK0RFRklORV9DTE9DSyhwYXRhX2NsaywgMCwgTVhDX0NDTV9DQ0dSNCwgTVhDX0NDTV9DQ0dSeF9DRzBfT0ZGU0VULAorCQlOVUxMLCBOVUxMLCAmaXBnX2NsaywgJnNwYmFfY2xrKTsKKwogI2RlZmluZSBfUkVHSVNURVJfQ0xPQ0soZCwgbiwgYykgXAogICAgICAgIHsgXAogCQkuZGV2X2lkID0gZCwgXApAQCAtMTQ3NCw2ICsxNDk1LDcgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pcHV2MyIsICJkaTAiLCBpcHVfZGkwX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pcHV2MyIsICJkaTEiLCBpcHVfZGkxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwY19kdmZzIiwgZ3BjX2R2ZnNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygicGF0YV9pbXgiLCBOVUxMLCBwYXRhX2NsaykKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBteDUzX2xvb2t1cHNbXSA9IHsKQEAgLTE1MDcsNiArMTUyOSwxMCBAQAogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4xIiwgTlVMTCwgc3NpMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjIiLCBOVUxMLCBzc2kzX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1rZXlwYWQiLCBOVUxMLCBkdW1teV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJwYXRhX2lteCIsIE5VTEwsIHBhdGFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14NTMtYWhjaS4wIiwgImFoY2kiLCBzYXRhX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDUzLWFoY2kuMCIsICJhaGNpX3BoeSIsIGFoY2lfcGh5X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDUzLWFoY2kuMCIsICJhaGNpX2RtYSIsIGFoY2lfZG1hX2NsaykKIH07CiAKIHN0YXRpYyB2b2lkIGNsa190cmVlX2luaXQodm9pZCkKQEAgLTE1NDgsOSArMTU3NCw4IEBACiAJY2xrX2VuYWJsZSgmbWFpbl9idXNfY2xrKTsKIAogCWNsa19lbmFibGUoJmlpbV9jbGspOwotCW14NTFfcmV2aXNpb24oKTsKKwlpbXhfcHJpbnRfc2lsaWNvbl9yZXYoImkuTVg1MSIsIG14NTFfcmV2aXNpb24oKSk7CiAJY2xrX2Rpc2FibGUoJmlpbV9jbGspOwotCW14NTFfZGlzcGxheV9yZXZpc2lvbigpOwogCiAJLyogbW92ZSB1c2JfcGh5X2NsayB0byAyNE1IeiAqLwogCWNsa19zZXRfcGFyZW50KCZ1c2JfcGh5MV9jbGssICZvc2NfY2xrKTsKQEAgLTE1NjgsNyArMTU5Myw3IEBACiAKIAkvKiBTeXN0ZW0gdGltZXIgKi8KIAlteGNfdGltZXJfaW5pdCgmZ3B0X2NsaywgTVg1MV9JT19BRERSRVNTKE1YNTFfR1BUMV9CQVNFX0FERFIpLAotCQlNWDUxX01YQ19JTlRfR1BUKTsKKwkJTVg1MV9JTlRfR1BUKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU5Miw5ICsxNjE3LDggQEAKIAljbGtfZW5hYmxlKCZtYWluX2J1c19jbGspOwogCiAJY2xrX2VuYWJsZSgmaWltX2Nsayk7Ci0JbXg1M19yZXZpc2lvbigpOworCWlteF9wcmludF9zaWxpY29uX3JldigiaS5NWDUzIiwgbXg1M19yZXZpc2lvbigpKTsKIAljbGtfZGlzYWJsZSgmaWltX2Nsayk7Ci0JbXg1M19kaXNwbGF5X3JldmlzaW9uKCk7CiAKIAkvKiBTZXQgU0RIQyBwYXJlbnRzIHRvIGJlIFBMTDIgKi8KIAljbGtfc2V0X3BhcmVudCgmZXNkaGMxX2NsaywgJnBsbDJfc3dfY2xrKTsKQEAgLTE2MDksMyArMTYzMyw0MyBAQAogCQlNWDUzX0lOVF9HUFQpOwogCXJldHVybiAwOwogfQorCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgdm9pZCBfX2luaXQgY2xrX2dldF9mcmVxX2R0KHVuc2lnbmVkIGxvbmcgKmNraWwsIHVuc2lnbmVkIGxvbmcgKm9zYywKKwkJCQkgICB1bnNpZ25lZCBsb25nICpja2loMSwgdW5zaWduZWQgbG9uZyAqY2tpaDIpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCS8qIHJldHJpZXZlIHRoZSBmcmVxZW5jeSBvZiBmaXhlZCBjbG9ja3MgZnJvbSBkZXZpY2UgdHJlZSAqLworCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImZpeGVkLWNsb2NrIikgeworCQl1MzIgcmF0ZTsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJnJhdGUpKQorCQkJY29udGludWU7CisKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteC1ja2lsIikpCisJCQkqY2tpbCA9IHJhdGU7CisJCWVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteC1vc2MiKSkKKwkJCSpvc2MgPSByYXRlOworCQllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxpbXgtY2tpaDEiKSkKKwkJCSpja2loMSA9IHJhdGU7CisJCWVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteC1ja2loMiIpKQorCQkJKmNraWgyID0gcmF0ZTsKKwl9Cit9CisKK2ludCBfX2luaXQgbXg1MV9jbG9ja3NfaW5pdF9kdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY2tpbCwgb3NjLCBja2loMSwgY2tpaDI7CisKKwljbGtfZ2V0X2ZyZXFfZHQoJmNraWwsICZvc2MsICZja2loMSwgJmNraWgyKTsKKwlyZXR1cm4gbXg1MV9jbG9ja3NfaW5pdChja2lsLCBvc2MsIGNraWgxLCBja2loMik7Cit9CisKK2ludCBfX2luaXQgbXg1M19jbG9ja3NfaW5pdF9kdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY2tpbCwgb3NjLCBja2loMSwgY2tpaDI7CisKKwljbGtfZ2V0X2ZyZXFfZHQoJmNraWwsICZvc2MsICZja2loMSwgJmNraWgyKTsKKwlyZXR1cm4gbXg1M19jbG9ja3NfaW5pdChja2lsLCBvc2MsIGNraWgxLCBja2loMik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1teDUvY3B1LmMKaW5kZXggODZmODdkYS4uNWM1MzI4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvY3B1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvY3B1LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLXN0YXRpYyBpbnQgY3B1X3NpbGljb25fcmV2ID0gLTE7CitzdGF0aWMgaW50IG14NV9jcHVfcmV2ID0gLTE7CiAKICNkZWZpbmUgSUlNX1NSRVYgMHgyNAogI2RlZmluZSBNWDUwX0hXX0FEQURJR19ESUdQUk9HCTB4QjAKQEAgLTI4LDExICsyOCwxNCBAQAogCXZvaWQgX19pb21lbSAqaWltX2Jhc2UgPSBNWDUxX0lPX0FERFJFU1MoTVg1MV9JSU1fQkFTRV9BRERSKTsKIAl1MzIgcmV2ID0gcmVhZGwoaWltX2Jhc2UgKyBJSU1fU1JFVikgJiAweGZmOwogCi0JaWYgKHJldiA9PSAweDApCisJc3dpdGNoIChyZXYpIHsKKwljYXNlIDB4MDoKIAkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OXzJfMDsKLQllbHNlIGlmIChyZXYgPT0gMHgxMCkKKwljYXNlIDB4MTA6CiAJCXJldHVybiBJTVhfQ0hJUF9SRVZJU0lPTl8zXzA7Ci0JcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OX1VOS05PV047CisJfQogfQogCiAvKgpAQCAtNDUsMzMgKzQ4LDEzIEBACiAJaWYgKCFjcHVfaXNfbXg1MSgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjcHVfc2lsaWNvbl9yZXYgPT0gLTEpCi0JCWNwdV9zaWxpY29uX3JldiA9IGdldF9teDUxX3NyZXYoKTsKKwlpZiAobXg1X2NwdV9yZXYgPT0gLTEpCisJCW14NV9jcHVfcmV2ID0gZ2V0X214NTFfc3JldigpOwogCi0JcmV0dXJuIGNwdV9zaWxpY29uX3JldjsKKwlyZXR1cm4gbXg1X2NwdV9yZXY7CiB9CiBFWFBPUlRfU1lNQk9MKG14NTFfcmV2aXNpb24pOwogCi12b2lkIG14NTFfZGlzcGxheV9yZXZpc2lvbih2b2lkKQotewotCWludCByZXY7Ci0JY2hhciAqc3JldjsKLQlyZXYgPSBteDUxX3JldmlzaW9uKCk7Ci0KLQlzd2l0Y2ggKHJldikgewotCWNhc2UgSU1YX0NISVBfUkVWSVNJT05fMl8wOgotCQlzcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMl8wX1NUUklORzsKLQkJYnJlYWs7Ci0JY2FzZSBJTVhfQ0hJUF9SRVZJU0lPTl8zXzA6Ci0JCXNyZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8zXzBfU1RSSU5HOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fVU5LTk9XTl9TVFJJTkc7Ci0JfQotCXByaW50ayhLRVJOX0lORk8gIkNQVSBpZGVudGlmaWVkIGFzIGkuTVg1MSwgc2lsaWNvbiByZXYgJXNcbiIsIHNyZXYpOwotfQotRVhQT1JUX1NZTUJPTChteDUxX2Rpc3BsYXlfcmV2aXNpb24pOwotCiAjaWZkZWYgQ09ORklHX05FT04KIAogLyoKQEAgLTEyMSwxMCArMTA0LDEwIEBACiAJaWYgKCFjcHVfaXNfbXg1MygpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjcHVfc2lsaWNvbl9yZXYgPT0gLTEpCi0JCWNwdV9zaWxpY29uX3JldiA9IGdldF9teDUzX3NyZXYoKTsKKwlpZiAobXg1X2NwdV9yZXYgPT0gLTEpCisJCW14NV9jcHVfcmV2ID0gZ2V0X214NTNfc3JldigpOwogCi0JcmV0dXJuIGNwdV9zaWxpY29uX3JldjsKKwlyZXR1cm4gbXg1X2NwdV9yZXY7CiB9CiBFWFBPUlRfU1lNQk9MKG14NTNfcmV2aXNpb24pOwogCkBAIC0xMzQsNyArMTE3LDcgQEAKIAl1MzIgcmV2OwogCiAJaWYgKCFhbmF0b3ApIHsKLQkJY3B1X3NpbGljb25fcmV2ID0gLUVJTlZBTDsKKwkJbXg1X2NwdV9yZXYgPSAtRUlOVkFMOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE1OSwzNiArMTQyLDEzIEBACiAJaWYgKCFjcHVfaXNfbXg1MCgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjcHVfc2lsaWNvbl9yZXYgPT0gLTEpCi0JCWNwdV9zaWxpY29uX3JldiA9IGdldF9teDUwX3NyZXYoKTsKKwlpZiAobXg1X2NwdV9yZXYgPT0gLTEpCisJCW14NV9jcHVfcmV2ID0gZ2V0X214NTBfc3JldigpOwogCi0JcmV0dXJuIGNwdV9zaWxpY29uX3JldjsKKwlyZXR1cm4gbXg1X2NwdV9yZXY7CiB9CiBFWFBPUlRfU1lNQk9MKG14NTBfcmV2aXNpb24pOwogCi12b2lkIG14NTNfZGlzcGxheV9yZXZpc2lvbih2b2lkKQotewotCWludCByZXY7Ci0JY2hhciAqc3JldjsKLQlyZXYgPSBteDUzX3JldmlzaW9uKCk7Ci0KLQlzd2l0Y2ggKHJldikgewotCWNhc2UgSU1YX0NISVBfUkVWSVNJT05fMV8wOgotCQlzcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8wX1NUUklORzsKLQkJYnJlYWs7Ci0JY2FzZSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzA6Ci0JCXNyZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzBfU1RSSU5HOwotCQlicmVhazsKLQljYXNlIElNWF9DSElQX1JFVklTSU9OXzJfMToKLQkJc3JldiA9IElNWF9DSElQX1JFVklTSU9OXzJfMV9TVFJJTkc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNyZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOX1NUUklORzsKLQl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIGlkZW50aWZpZWQgYXMgaS5NWDUzLCBzaWxpY29uIHJldiAlc1xuIiwgc3Jldik7Ci19Ci1FWFBPUlRfU1lNQk9MKG14NTNfZGlzcGxheV9yZXZpc2lvbik7Ci0KIHN0YXRpYyBpbnQgX19pbml0IHBvc3RfY3B1X2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgcmVnOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy1pbXg1MS5oIGIvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy1pbXg1MS5oCmluZGV4IGUxMWJjMGUuLmFmNDg4YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMtaW14NTEuaAorKysgYi9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLWlteDUxLmgKQEAgLTEzLDkgKzEzLDE1IEBACiAjZGVmaW5lIGlteDUxX2FkZF9mZWMocGRhdGEpCVwKIAlpbXhfYWRkX2ZlYygmaW14NTFfZmVjX2RhdGEsIHBkYXRhKQogCitleHRlcm4gY29uc3Qgc3RydWN0IGlteF9mc2xfdXNiMl91ZGNfZGF0YSBpbXg1MV9mc2xfdXNiMl91ZGNfZGF0YTsKKyNkZWZpbmUgaW14NTFfYWRkX2ZzbF91c2IyX3VkYyhwZGF0YSkJXAorCWlteF9hZGRfZnNsX3VzYjJfdWRjKCZpbXg1MV9mc2xfdXNiMl91ZGNfZGF0YSwgcGRhdGEpCisKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW14X2lteF9pMmNfZGF0YSBpbXg1MV9pbXhfaTJjX2RhdGFbXTsKICNkZWZpbmUgaW14NTFfYWRkX2lteF9pMmMoaWQsIHBkYXRhKQlcCiAJaW14X2FkZF9pbXhfaTJjKCZpbXg1MV9pbXhfaTJjX2RhdGFbaWRdLCBwZGF0YSkKKyNkZWZpbmUgaW14NTFfYWRkX2hzaTJjKHBkYXRhKQlcCisJaW14NTFfYWRkX2lteF9pMmMoMiwgcGRhdGEpCiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW14X2lteF9zc2lfZGF0YSBpbXg1MV9pbXhfc3NpX2RhdGFbXTsKICNkZWZpbmUgaW14NTFfYWRkX2lteF9zc2koaWQsIHBkYXRhKQlcCkBAIC0yNSw2ICszMSwxMyBAQAogI2RlZmluZSBpbXg1MV9hZGRfaW14X3VhcnQoaWQsIHBkYXRhKQlcCiAJaW14X2FkZF9pbXhfdWFydF8xaXJxKCZpbXg1MV9pbXhfdWFydF9kYXRhW2lkXSwgcGRhdGEpCiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW14X214Y19laGNpX2RhdGEgaW14NTFfbXhjX2VoY2lfb3RnX2RhdGE7CisjZGVmaW5lIGlteDUxX2FkZF9teGNfZWhjaV9vdGcocGRhdGEpCVwKKwlpbXhfYWRkX214Y19laGNpKCZpbXg1MV9teGNfZWhjaV9vdGdfZGF0YSwgcGRhdGEpCitleHRlcm4gY29uc3Qgc3RydWN0IGlteF9teGNfZWhjaV9kYXRhIGlteDUxX214Y19laGNpX2hzX2RhdGFbXTsKKyNkZWZpbmUgaW14NTFfYWRkX214Y19laGNpX2hzKGlkLCBwZGF0YSkJXAorCWlteF9hZGRfbXhjX2VoY2koJmlteDUxX214Y19laGNpX2hzX2RhdGFbaWQgLSAxXSwgcGRhdGEpCisKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW14X214Y19uYW5kX2RhdGEgaW14NTFfbXhjX25hbmRfZGF0YTsKICNkZWZpbmUgaW14NTFfYWRkX214Y19uYW5kKHBkYXRhKQlcCiAJaW14X2FkZF9teGNfbmFuZCgmaW14NTFfbXhjX25hbmRfZGF0YSwgcGRhdGEpCkBAIC01MiwzICs2NSw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGlteF9pbXhfa2V5cGFkX2RhdGEgaW14NTFfaW14X2tleXBhZF9kYXRhOwogI2RlZmluZSBpbXg1MV9hZGRfaW14X2tleXBhZChwZGF0YSkJXAogCWlteF9hZGRfaW14X2tleXBhZCgmaW14NTFfaW14X2tleXBhZF9kYXRhLCBwZGF0YSkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSBpbXg1MV9wYXRhX2lteF9kYXRhOworI2RlZmluZSBpbXg1MV9hZGRfcGF0YV9pbXgoKSBcCisJaW14X2FkZF9wYXRhX2lteCgmaW14NTFfcGF0YV9pbXhfZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMtaW14NTMuaCBiL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMtaW14NTMuaAppbmRleCBjMjdmZThiLi42ZTFlNWQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLWlteDUzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy1pbXg1My5oCkBAIC00MCwzICs0MCw5IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGlteF9pbXhfa2V5cGFkX2RhdGEgaW14NTNfaW14X2tleXBhZF9kYXRhOwogI2RlZmluZSBpbXg1M19hZGRfaW14X2tleXBhZChwZGF0YSkJXAogCWlteF9hZGRfaW14X2tleXBhZCgmaW14NTNfaW14X2tleXBhZF9kYXRhLCBwZGF0YSkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSBpbXg1M19wYXRhX2lteF9kYXRhOworI2RlZmluZSBpbXg1M19hZGRfcGF0YV9pbXgoKSBcCisJaW14X2FkZF9wYXRhX2lteCgmaW14NTNfcGF0YV9pbXhfZGF0YSkKKworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXg1M19hZGRfYWhjaV9pbXgodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MWNhOGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOSBBbWl0IEt1Y2hlcmlhIDxhbWl0Lmt1Y2hlcmlhQGNhbm9uaWNhbC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KLSAqCi0gKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKLSAqCi0gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKLSAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXhjX2hzaTJjX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ID0gTVg1MV9IU0kyQ19ETUFfQkFTRV9BRERSLAotCQkuZW5kID0gTVg1MV9IU0kyQ19ETUFfQkFTRV9BRERSICsgU1pfMTZLIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5zdGFydCA9IE1YNTFfTVhDX0lOVF9IU19JMkMsCi0JCS5lbmQgPSBNWDUxX01YQ19JTlRfSFNfSTJDLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfaHNpMmNfZGV2aWNlID0gewotCS5uYW1lID0gImlteC1pMmMiLAotCS5pZCA9IDIsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG14Y19oc2kyY19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IG14Y19oc2kyY19yZXNvdXJjZXMKLX07Ci0KLXN0YXRpYyB1NjQgdXNiX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2JvdGdfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQgPSBNWDUxX09UR19CQVNFX0FERFIsCi0JCS5lbmQgPSBNWDUxX09UR19CQVNFX0FERFIgKyAweDFmZiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5zdGFydCA9IE1YNTFfTVhDX0lOVF9VU0JfT1RHLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotLyogT1RHIGdhZGdldCBkZXZpY2UgKi8KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VzYmRyX3VkY19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImZzbC11c2IyLXVkYyIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1c2JvdGdfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSB1c2JvdGdfcmVzb3VyY2VzLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sJCT0gJnVzYl9kbWFfbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiZHJfaG9zdF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAibXhjLWVoY2kiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVzYm90Z19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IHVzYm90Z19yZXNvdXJjZXMsCi0JLmRldiA9IHsKLQkJLmRtYV9tYXNrID0gJnVzYl9kbWFfbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2JoMV9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IE1YNTFfT1RHX0JBU0VfQUREUiArIDB4MjAwLAotCQkuZW5kID0gTVg1MV9PVEdfQkFTRV9BRERSICsgMHgyMDAgKyAweDFmZiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5zdGFydCA9IE1YNTFfTVhDX0lOVF9VU0JfSDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2JoMV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAibXhjLWVoY2kiLAotCS5pZCA9IDEsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVzYmgxX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gdXNiaDFfcmVzb3VyY2VzLAotCS5kZXYgPSB7Ci0JCS5kbWFfbWFzayA9ICZ1c2JfZG1hX21hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiaDJfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQgPSBNWDUxX09UR19CQVNFX0FERFIgKyAweDQwMCwKLQkJLmVuZCA9IE1YNTFfT1RHX0JBU0VfQUREUiArIDB4NDAwICsgMHgxZmYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JewotCQkuc3RhcnQgPSBNWDUxX01YQ19JTlRfVVNCX0gyLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiaDJfZGV2aWNlID0gewotCS5uYW1lID0gIm14Yy1laGNpIiwKLQkuaWQgPSAyLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh1c2JoMl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IHVzYmgyX3Jlc291cmNlcywKLQkuZGV2ID0gewotCQkuZG1hX21hc2sgPSAmdXNiX2RtYV9tYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy5oIGIvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE1MTI5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VzYmRyX2hvc3RfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VzYmgxX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2JoMl9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiZHJfdWRjX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19oc2kyY19kZXZpY2U7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9laGNpLmMgYi9hcmNoL2FybS9tYWNoLW14NS9laGNpLmMKaW5kZXggN2NlMTJjOC4uYzE3ZmExMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvZWhjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2VoY2kuYwpAQCAtNTIsNyArNTIsNyBAQAogCXZvaWQgX19pb21lbSAqdXNib3RoZXJfYmFzZTsKIAlpbnQgcmV0ID0gMDsKIAotCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX09UR19CQVNFX0FERFIsIFNaXzRLKTsKKwl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9VU0JfT1RHX0JBU0VfQUREUiwgU1pfNEspOwogCWlmICghdXNiX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcygpOiBpb3JlbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2V1a3JlYV9tYmlteDUxLWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14NTEtYmFzZWJvYXJkLmMKaW5kZXggYmJmNDU2NC4uYTZhM2FiOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14NTEtYmFzZWJvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14NTEtYmFzZWJvYXJkLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLWlteDUxLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgogCiAjZGVmaW5lIE1CSU1YNTFfVFNDMjAwN19HUElPCUlNWF9HUElPX05SKDMsIDMwKQogI2RlZmluZSBNQklNWDUxX0xFRDAJCUlNWF9HUElPX05SKDMsIDUpCkBAIC0xNjAsNyArMTU5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbWJpbXg1MV9pMmNfZGV2aWNlc1tdID0gewogCXsKIAkJSTJDX0JPQVJEX0lORk8oInRzYzIwMDciLCAweDQ5KSwKLQkJLmlycSAgPSBncGlvX3RvX2lycShNQklNWDUxX1RTQzIwMDdfR1BJTyksCisJCS5pcnEgID0gSU1YX0dQSU9fVE9fSVJRKE1CSU1YNTFfVFNDMjAwN19HUElPKSwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmdHNjMjAwN19kYXRhLAogCX0sIHsKIAkJSTJDX0JPQVJEX0lORk8oInRsdjMyMGFpYzIzIiwgMHgxYSksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ldWtyZWFfbWJpbXhzZC1iYXNlYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2V1a3JlYV9tYmlteHNkLWJhc2Vib2FyZC5jCmluZGV4IDI2MTkyMzkuLmQ4MTdmYzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2V1a3JlYV9tYmlteHNkLWJhc2Vib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2V1a3JlYV9tYmlteHNkLWJhc2Vib2FyZC5jCkBAIC0yNCw3ICsyNCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC00MSwxMyArNDAsMTIgQEAKICNpbmNsdWRlIDxtYWNoL2F1ZG11eC5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy1pbXg1MS5oIgotI2luY2x1ZGUgImRldmljZXMuaCIKIAogc3RhdGljIGlvbXV4X3YzX2NmZ190IGV1a3JlYV9tYmlteHNkX3BhZHNbXSA9IHsKIAkvKiBMRUQgKi8KIAlNWDUxX1BBRF9OQU5ERl9EMTBfX0dQSU8zXzMwLAogCS8qIFNXSVRDSCAqLwotCV9NWDUxX1BBRF9OQU5ERl9EOV9fR1BJTzNfMzEgfCBNVVhfUEFEX0NUUkwoUEFEX0NUTF9QVVNfMjJLX1VQIHwKKwlORVdfUEFEX0NUUkwoTVg1MV9QQURfTkFOREZfRDlfX0dQSU8zXzMxLCBQQURfQ1RMX1BVU18yMktfVVAgfAogCQkJUEFEX0NUTF9QS0UgfCBQQURfQ1RMX1NSRV9GQVNUIHwKIAkJCVBBRF9DVExfRFNFX0hJR0ggfCBQQURfQ1RMX1BVRSB8IFBBRF9DVExfSFlTKSwKIAkvKiBVQVJUMiAqLwpAQCAtNjYsNyArNjQsNyBAQAogCU1YNTFfUEFEX1NEMV9EQVRBMl9fU0QxX0RBVEEyLAogCU1YNTFfUEFEX1NEMV9EQVRBM19fU0QxX0RBVEEzLAogCS8qIFNEMSBDRCAqLwotCV9NWDUxX1BBRF9HUElPMV8wX19TRDFfQ0QgfCBNVVhfUEFEX0NUUkwoUEFEX0NUTF9QVVNfMjJLX1VQIHwKKwlORVdfUEFEX0NUUkwoTVg1MV9QQURfR1BJTzFfMF9fU0QxX0NELCBQQURfQ1RMX1BVU18yMktfVVAgfAogCQkJUEFEX0NUTF9QS0UgfCBQQURfQ1RMX1NSRV9GQVNUIHwKIAkJCVBBRF9DVExfRFNFX0hJR0ggfCBQQURfQ1RMX1BVRSB8IFBBRF9DVExfSFlTKSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9pbXg1MS1kdC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvaW14NTEtZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2M2MTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvaW14NTEtZHQuYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvbXg1MS5oPgorCisvKgorICogTG9va3VwIHRhYmxlIGZvciBhdHRhY2hpbmcgYSBzcGVjaWZpYyBuYW1lIGFuZCBwbGF0Zm9ybV9kYXRhIHBvaW50ZXIgdG8KKyAqIGRldmljZXMgYXMgdGhleSBnZXQgY3JlYXRlZCBieSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZSgpLiAgSWRlYWxseSB0aGlzIHRhYmxlCisgKiB3b3VsZCBub3QgZXhpc3QsIGJ1dCB0aGUgY3VycmVudCBjbG9jayBpbXBsZW1lbnRhdGlvbiBkZXBlbmRzIG9uIHNvbWUgZGV2aWNlcworICogaGF2aW5nIGEgc3BlY2lmaWMgbmFtZS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZfYXV4ZGF0YSBpbXg1MV9hdXhkYXRhX2xvb2t1cFtdIF9faW5pdGNvbnN0ID0geworCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTEtdWFydCIsIE1YNTFfVUFSVDFfQkFTRV9BRERSLCAiaW14MjEtdWFydC4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS11YXJ0IiwgTVg1MV9VQVJUMl9CQVNFX0FERFIsICJpbXgyMS11YXJ0LjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLXVhcnQiLCBNWDUxX1VBUlQzX0JBU0VfQUREUiwgImlteDIxLXVhcnQuMiIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTEtZmVjIiwgTVg1MV9GRUNfQkFTRV9BRERSLCAiaW14MjctZmVjLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLWVzZGhjIiwgTVg1MV9FU0RIQzFfQkFTRV9BRERSLCAic2RoY2ktZXNkaGMtaW14NTEuMCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTEtZXNkaGMiLCBNWDUxX0VTREhDMl9CQVNFX0FERFIsICJzZGhjaS1lc2RoYy1pbXg1MS4xIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS1lc2RoYyIsIE1YNTFfRVNESEMzX0JBU0VfQUREUiwgInNkaGNpLWVzZGhjLWlteDUxLjIiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLWVzZGhjIiwgTVg1MV9FU0RIQzRfQkFTRV9BRERSLCAic2RoY2ktZXNkaGMtaW14NTEuMyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTEtZWNzcGkiLCBNWDUxX0VDU1BJMV9CQVNFX0FERFIsICJpbXg1MS1lY3NwaS4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS1lY3NwaSIsIE1YNTFfRUNTUEkyX0JBU0VfQUREUiwgImlteDUxLWVjc3BpLjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLWNzcGkiLCBNWDUxX0NTUElfQkFTRV9BRERSLCAiaW14MzUtY3NwaS4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS1pMmMiLCBNWDUxX0kyQzFfQkFTRV9BRERSLCAiaW14LWkyYy4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS1pMmMiLCBNWDUxX0kyQzJfQkFTRV9BRERSLCAiaW14LWkyYy4xIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS1zZG1hIiwgTVg1MV9TRE1BX0JBU0VfQUREUiwgImlteDM1LXNkbWEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLXdkdCIsIE1YNTFfV0RPRzFfQkFTRV9BRERSLCAiaW14Mi13ZHQuMCIsIE5VTEwpLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGlteDUxX3R6aWNfYWRkX2lycV9kb21haW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmludGVycnVwdF9wYXJlbnQpCit7CisJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5wLCAwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlteDUxX2dwaW9fYWRkX2lycV9kb21haW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmludGVycnVwdF9wYXJlbnQpCit7CisJc3RhdGljIGludCBncGlvX2lycV9iYXNlID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgQVJDSF9OUl9HUElPUyAtCisJCQkJICAgMzIgKiA0OyAvKiBpbXg1MSBnZXRzIDQgZ3BpbyBwb3J0cyAqLworCisJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5wLCBncGlvX2lycV9iYXNlKTsKKwlncGlvX2lycV9iYXNlICs9IDMyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXg1MV9pcnFfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1MS10emljIiwgLmRhdGEgPSBpbXg1MV90emljX2FkZF9pcnFfZG9tYWluLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWdwaW8iLCAuZGF0YSA9IGlteDUxX2dwaW9fYWRkX2lycV9kb21haW4sIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXg1MV9pb211eGNfb2ZfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1MS1pb211eGMtYmFiYmFnZSIsIC5kYXRhID0gaW14NTFfYmFiYmFnZV9jb21tb25faW5pdCwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbXg1MV9kdF9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCXZvaWQgKCpmdW5jKSh2b2lkKTsKKworCW9mX2lycV9pbml0KGlteDUxX2lycV9tYXRjaCk7CisKKwlub2RlID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIGlteDUxX2lvbXV4Y19vZl9tYXRjaCk7CisJaWYgKG5vZGUpIHsKKwkJb2ZfaWQgPSBvZl9tYXRjaF9ub2RlKGlteDUxX2lvbXV4Y19vZl9tYXRjaCwgbm9kZSk7CisJCWZ1bmMgPSBvZl9pZC0+ZGF0YTsKKwkJZnVuYygpOworCQlvZl9ub2RlX3B1dChub2RlKTsKKwl9CisKKwlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShOVUxMLCBvZl9kZWZhdWx0X2J1c19tYXRjaF90YWJsZSwKKwkJCSAgICAgaW14NTFfYXV4ZGF0YV9sb29rdXAsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NTFfdGltZXJfaW5pdCh2b2lkKQoreworCW14NTFfY2xvY2tzX2luaXRfZHQoKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgaW14NTFfdGltZXIgPSB7CisJLmluaXQgPSBpbXg1MV90aW1lcl9pbml0LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlteDUxX2R0X2JvYXJkX2NvbXBhdFtdIF9faW5pdGRhdGEgPSB7CisJImZzbCxpbXg1MS1iYWJiYWdlIiwKKwlOVUxMCit9OworCitEVF9NQUNISU5FX1NUQVJUKElNWDUxX0RULCAiRnJlZXNjYWxlIGkuTVg1MSAoRGV2aWNlIFRyZWUgU3VwcG9ydCkiKQorCS5tYXBfaW8JCT0gbXg1MV9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBpbXg1MV9pbml0X2Vhcmx5LAorCS5pbml0X2lycQk9IG14NTFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEJPSBpbXg1MV9oYW5kbGVfaXJxLAorCS50aW1lcgkJPSAmaW14NTFfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGlteDUxX2R0X2luaXQsCisJLmR0X2NvbXBhdAk9IGlteDUxX2R0X2JvYXJkX2NvbXBhdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9pbXg1My1kdC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvaW14NTMtZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2FhMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvaW14NTMtZHQuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9teDUzLmg+CisKKy8qCisgKiBMb29rdXAgdGFibGUgZm9yIGF0dGFjaGluZyBhIHNwZWNpZmljIG5hbWUgYW5kIHBsYXRmb3JtX2RhdGEgcG9pbnRlciB0bworICogZGV2aWNlcyBhcyB0aGV5IGdldCBjcmVhdGVkIGJ5IG9mX3BsYXRmb3JtX3BvcHVsYXRlKCkuICBJZGVhbGx5IHRoaXMgdGFibGUKKyAqIHdvdWxkIG5vdCBleGlzdCwgYnV0IHRoZSBjdXJyZW50IGNsb2NrIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gc29tZSBkZXZpY2VzCisgKiBoYXZpbmcgYSBzcGVjaWZpYyBuYW1lLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2Rldl9hdXhkYXRhIGlteDUzX2F1eGRhdGFfbG9va3VwW10gX19pbml0Y29uc3QgPSB7CisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My11YXJ0IiwgTVg1M19VQVJUMV9CQVNFX0FERFIsICJpbXgyMS11YXJ0LjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLXVhcnQiLCBNWDUzX1VBUlQyX0JBU0VfQUREUiwgImlteDIxLXVhcnQuMSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtdWFydCIsIE1YNTNfVUFSVDNfQkFTRV9BRERSLCAiaW14MjEtdWFydC4yIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My11YXJ0IiwgTVg1M19VQVJUNF9CQVNFX0FERFIsICJpbXgyMS11YXJ0LjMiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLXVhcnQiLCBNWDUzX1VBUlQ1X0JBU0VfQUREUiwgImlteDIxLXVhcnQuNCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtZmVjIiwgTVg1M19GRUNfQkFTRV9BRERSLCAiaW14MjUtZmVjLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLWVzZGhjIiwgTVg1M19FU0RIQzFfQkFTRV9BRERSLCAic2RoY2ktZXNkaGMtaW14NTMuMCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtZXNkaGMiLCBNWDUzX0VTREhDMl9CQVNFX0FERFIsICJzZGhjaS1lc2RoYy1pbXg1My4xIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My1lc2RoYyIsIE1YNTNfRVNESEMzX0JBU0VfQUREUiwgInNkaGNpLWVzZGhjLWlteDUzLjIiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLWVzZGhjIiwgTVg1M19FU0RIQzRfQkFTRV9BRERSLCAic2RoY2ktZXNkaGMtaW14NTMuMyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtZWNzcGkiLCBNWDUzX0VDU1BJMV9CQVNFX0FERFIsICJpbXg1MS1lY3NwaS4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My1lY3NwaSIsIE1YNTNfRUNTUEkyX0JBU0VfQUREUiwgImlteDUxLWVjc3BpLjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLWNzcGkiLCBNWDUzX0NTUElfQkFTRV9BRERSLCAiaW14MzUtY3NwaS4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My1pMmMiLCBNWDUzX0kyQzFfQkFTRV9BRERSLCAiaW14LWkyYy4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My1pMmMiLCBNWDUzX0kyQzJfQkFTRV9BRERSLCAiaW14LWkyYy4xIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My1pMmMiLCBNWDUzX0kyQzNfQkFTRV9BRERSLCAiaW14LWkyYy4yIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My1zZG1hIiwgTVg1M19TRE1BX0JBU0VfQUREUiwgImlteDM1LXNkbWEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLXdkdCIsIE1YNTNfV0RPRzFfQkFTRV9BRERSLCAiaW14Mi13ZHQuMCIsIE5VTEwpLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGlteDUzX3R6aWNfYWRkX2lycV9kb21haW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmludGVycnVwdF9wYXJlbnQpCit7CisJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5wLCAwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlteDUzX2dwaW9fYWRkX2lycV9kb21haW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmludGVycnVwdF9wYXJlbnQpCit7CisJc3RhdGljIGludCBncGlvX2lycV9iYXNlID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgQVJDSF9OUl9HUElPUyAtCisJCQkJICAgMzIgKiA3OyAvKiBpbXg1MyBnZXRzIDcgZ3BpbyBwb3J0cyAqLworCisJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5wLCBncGlvX2lycV9iYXNlKTsKKwlncGlvX2lycV9iYXNlICs9IDMyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXg1M19pcnFfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My10emljIiwgLmRhdGEgPSBpbXg1M190emljX2FkZF9pcnFfZG9tYWluLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWdwaW8iLCAuZGF0YSA9IGlteDUzX2dwaW9fYWRkX2lycV9kb21haW4sIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXg1M19pb211eGNfb2ZfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My1pb211eGMtYXJkIiwgLmRhdGEgPSBpbXg1M19hcmRfY29tbW9uX2luaXQsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtaW9tdXhjLWV2ayIsIC5kYXRhID0gaW14NTNfZXZrX2NvbW1vbl9pbml0LCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWlvbXV4Yy1xc2IiLCAuZGF0YSA9IGlteDUzX3FzYl9jb21tb25faW5pdCwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My1pb211eGMtc21kIiwgLmRhdGEgPSBpbXg1M19zbWRfY29tbW9uX2luaXQsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NTNfZHRfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKwl2b2lkICgqZnVuYykodm9pZCk7CisKKwlvZl9pcnFfaW5pdChpbXg1M19pcnFfbWF0Y2gpOworCisJbm9kZSA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBpbXg1M19pb211eGNfb2ZfbWF0Y2gpOworCWlmIChub2RlKSB7CisJCW9mX2lkID0gb2ZfbWF0Y2hfbm9kZShpbXg1M19pb211eGNfb2ZfbWF0Y2gsIG5vZGUpOworCQlmdW5jID0gb2ZfaWQtPmRhdGE7CisJCWZ1bmMoKTsKKwkJb2Zfbm9kZV9wdXQobm9kZSk7CisJfQorCisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb2ZfZGVmYXVsdF9idXNfbWF0Y2hfdGFibGUsCisJCQkgICAgIGlteDUzX2F1eGRhdGFfbG9va3VwLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlteDUzX3RpbWVyX2luaXQodm9pZCkKK3sKKwlteDUzX2Nsb2Nrc19pbml0X2R0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIGlteDUzX3RpbWVyID0geworCS5pbml0ID0gaW14NTNfdGltZXJfaW5pdCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppbXg1M19kdF9ib2FyZF9jb21wYXRbXSBfX2luaXRkYXRhID0geworCSJmc2wsaW14NTMtYXJkIiwKKwkiZnNsLGlteDUzLWV2ayIsCisJImZzbCxpbXg1My1xc2IiLAorCSJmc2wsaW14NTMtc21kIiwKKwlOVUxMCit9OworCitEVF9NQUNISU5FX1NUQVJUKElNWDUzX0RULCAiRnJlZXNjYWxlIGkuTVg1MyAoRGV2aWNlIFRyZWUgU3VwcG9ydCkiKQorCS5tYXBfaW8JCT0gbXg1M19tYXBfaW8sCisJLmluaXRfZWFybHkJPSBpbXg1M19pbml0X2Vhcmx5LAorCS5pbml0X2lycQk9IG14NTNfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEJPSBpbXg1M19oYW5kbGVfaXJxLAorCS50aW1lcgkJPSAmaW14NTNfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGlteDUzX2R0X2luaXQsCisJLmR0X2NvbXBhdAk9IGlteDUzX2R0X2JvYXJkX2NvbXBhdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9tbS1teDUwLmMgYi9hcmNoL2FybS9tYWNoLW14NS9tbS1teDUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTM3NGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvbW0tbXg1MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBDcmVhdGUgc3RhdGljIG1hcHBpbmcgYmV0d2VlbiBwaHlzaWNhbCB0byB2aXJ0dWFsIG1lbW9yeS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjMuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLQotLyoKLSAqIERlZmluZSB0aGUgTVg1MCBtZW1vcnkgbWFwLgotICovCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14NTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JaW14X21hcF9lbnRyeShNWDUwLCBUWklDLCBNVF9ERVZJQ0UpLAotCWlteF9tYXBfZW50cnkoTVg1MCwgU1BCQTAsIE1UX0RFVklDRSksCi0JaW14X21hcF9lbnRyeShNWDUwLCBBSVBTMSwgTVRfREVWSUNFKSwKLQlpbXhfbWFwX2VudHJ5KE1YNTAsIEFJUFMyLCBNVF9ERVZJQ0UpLAotfTsKLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIG1lbW9yeSBtYXAuIEl0IGlzIGNhbGxlZCBkdXJpbmcgdGhlCi0gKiBzeXN0ZW0gc3RhcnR1cCB0byBjcmVhdGUgc3RhdGljIHBoeXNpY2FsIHRvIHZpcnR1YWwgbWVtb3J5IG1hcHBpbmdzCi0gKiBmb3IgdGhlIElPIG1vZHVsZXMuCi0gKi8KLXZvaWQgX19pbml0IG14NTBfbWFwX2lvKHZvaWQpCi17Ci0JaW90YWJsZV9pbml0KG14NTBfaW9fZGVzYywgQVJSQVlfU0laRShteDUwX2lvX2Rlc2MpKTsKLX0KLQotdm9pZCBfX2luaXQgaW14NTBfaW5pdF9lYXJseSh2b2lkKQotewotCW14Y19zZXRfY3B1X3R5cGUoTVhDX0NQVV9NWDUwKTsKLQlteGNfaW9tdXhfdjNfaW5pdChNWDUwX0lPX0FERFJFU1MoTVg1MF9JT01VWENfQkFTRV9BRERSKSk7Ci0JbXhjX2FyY2hfcmVzZXRfaW5pdChNWDUwX0lPX0FERFJFU1MoTVg1MF9XRE9HX0JBU0VfQUREUikpOwotfQotCi12b2lkIF9faW5pdCBteDUwX2luaXRfaXJxKHZvaWQpCi17Ci0JdHppY19pbml0X2lycShNWDUwX0lPX0FERFJFU1MoTVg1MF9UWklDX0JBU0VfQUREUikpOwotfQotCi12b2lkIF9faW5pdCBpbXg1MF9zb2NfaW5pdCh2b2lkKQotewotCS8qIGkubXg1MCBoYXMgdGhlIGkubXgzMSB0eXBlIGdwaW8gKi8KLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YNTBfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU8xX0xPVywgTVg1MF9JTlRfR1BJTzFfSElHSCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDUwX0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPMl9MT1csIE1YNTBfSU5UX0dQSU8yX0hJR0gpOwotCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMiwgTVg1MF9HUElPM19CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzNfTE9XLCBNWDUwX0lOVF9HUElPM19ISUdIKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDMsIE1YNTBfR1BJTzRfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU80X0xPVywgTVg1MF9JTlRfR1BJTzRfSElHSCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCA0LCBNWDUwX0dQSU81X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPNV9MT1csIE1YNTBfSU5UX0dQSU81X0hJR0gpOwotCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgNSwgTVg1MF9HUElPNl9CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzZfTE9XLCBNWDUwX0lOVF9HUElPNl9ISUdIKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L21tLmMgYi9hcmNoL2FybS9tYWNoLW14NS9tbS5jCmluZGV4IGJhZWE2ZTUuLjI2ZWFjYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L21tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvbW0uYwpAQCAtMjEsMTIgKzIxLDI3IEBACiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjMuaD4KIAorc3RhdGljIHZvaWQgaW14NV9pZGxlKHZvaWQpCit7CisJbXg1X2NwdV9scF9zZXQoV0FJVF9VTkNMT0NLRURfUE9XRVJfT0ZGKTsKK30KKworLyoKKyAqIERlZmluZSB0aGUgTVg1MCBtZW1vcnkgbWFwLgorICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14NTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJaW14X21hcF9lbnRyeShNWDUwLCBUWklDLCBNVF9ERVZJQ0UpLAorCWlteF9tYXBfZW50cnkoTVg1MCwgU1BCQTAsIE1UX0RFVklDRSksCisJaW14X21hcF9lbnRyeShNWDUwLCBBSVBTMSwgTVRfREVWSUNFKSwKKwlpbXhfbWFwX2VudHJ5KE1YNTAsIEFJUFMyLCBNVF9ERVZJQ0UpLAorfTsKKwogLyoKICAqIERlZmluZSB0aGUgTVg1MSBtZW1vcnkgbWFwLgogICovCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14NTFfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJaW14X21hcF9lbnRyeShNWDUxLCBUWklDLCBNVF9ERVZJQ0UpLAogCWlteF9tYXBfZW50cnkoTVg1MSwgSVJBTSwgTVRfREVWSUNFKSwKLQlpbXhfbWFwX2VudHJ5KE1YNTEsIERFQlVHLCBNVF9ERVZJQ0UpLAogCWlteF9tYXBfZW50cnkoTVg1MSwgQUlQUzEsIE1UX0RFVklDRSksCiAJaW14X21hcF9lbnRyeShNWDUxLCBTUEJBMCwgTVRfREVWSUNFKSwKIAlpbXhfbWFwX2VudHJ5KE1YNTEsIEFJUFMyLCBNVF9ERVZJQ0UpLApAQCAtMzYsNiArNTEsNyBAQAogICogRGVmaW5lIHRoZSBNWDUzIG1lbW9yeSBtYXAuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXg1M19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlpbXhfbWFwX2VudHJ5KE1YNTMsIFRaSUMsIE1UX0RFVklDRSksCiAJaW14X21hcF9lbnRyeShNWDUzLCBBSVBTMSwgTVRfREVWSUNFKSwKIAlpbXhfbWFwX2VudHJ5KE1YNTMsIFNQQkEwLCBNVF9ERVZJQ0UpLAogCWlteF9tYXBfZW50cnkoTVg1MywgQUlQUzIsIE1UX0RFVklDRSksCkBAIC00NiwyMSArNjIsMzQgQEAKICAqIHN5c3RlbSBzdGFydHVwIHRvIGNyZWF0ZSBzdGF0aWMgcGh5c2ljYWwgdG8gdmlydHVhbCBtZW1vcnkgbWFwcGluZ3MKICAqIGZvciB0aGUgSU8gbW9kdWxlcy4KICAqLwordm9pZCBfX2luaXQgbXg1MF9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQobXg1MF9pb19kZXNjLCBBUlJBWV9TSVpFKG14NTBfaW9fZGVzYykpOworfQorCiB2b2lkIF9faW5pdCBteDUxX21hcF9pbyh2b2lkKQogewogCWlvdGFibGVfaW5pdChteDUxX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXg1MV9pb19kZXNjKSk7CiB9CiAKK3ZvaWQgX19pbml0IG14NTNfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KG14NTNfaW9fZGVzYywgQVJSQVlfU0laRShteDUzX2lvX2Rlc2MpKTsKK30KKwordm9pZCBfX2luaXQgaW14NTBfaW5pdF9lYXJseSh2b2lkKQoreworCW14Y19zZXRfY3B1X3R5cGUoTVhDX0NQVV9NWDUwKTsKKwlteGNfaW9tdXhfdjNfaW5pdChNWDUwX0lPX0FERFJFU1MoTVg1MF9JT01VWENfQkFTRV9BRERSKSk7CisJbXhjX2FyY2hfcmVzZXRfaW5pdChNWDUwX0lPX0FERFJFU1MoTVg1MF9XRE9HX0JBU0VfQUREUikpOworfQorCiB2b2lkIF9faW5pdCBpbXg1MV9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJbXhjX3NldF9jcHVfdHlwZShNWENfQ1BVX01YNTEpOwogCW14Y19pb211eF92M19pbml0KE1YNTFfSU9fQUREUkVTUyhNWDUxX0lPTVVYQ19CQVNFX0FERFIpKTsKIAlteGNfYXJjaF9yZXNldF9pbml0KE1YNTFfSU9fQUREUkVTUyhNWDUxX1dET0cxX0JBU0VfQUREUikpOwotfQotCi12b2lkIF9faW5pdCBteDUzX21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChteDUzX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXg1M19pb19kZXNjKSk7CisJaW14X2lkbGUgPSBpbXg1X2lkbGU7CiB9CiAKIHZvaWQgX19pbml0IGlteDUzX2luaXRfZWFybHkodm9pZCkKQEAgLTcwLDM1ICs5OSwxOSBAQAogCW14Y19hcmNoX3Jlc2V0X2luaXQoTVg1M19JT19BRERSRVNTKE1YNTNfV0RPRzFfQkFTRV9BRERSKSk7CiB9CiAKK3ZvaWQgX19pbml0IG14NTBfaW5pdF9pcnEodm9pZCkKK3sKKwl0emljX2luaXRfaXJxKE1YNTBfSU9fQUREUkVTUyhNWDUwX1RaSUNfQkFTRV9BRERSKSk7Cit9CisKIHZvaWQgX19pbml0IG14NTFfaW5pdF9pcnEodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHR6aWNfYWRkcjsKLQl2b2lkIF9faW9tZW0gKnR6aWNfdmlydDsKLQotCWlmIChteDUxX3JldmlzaW9uKCkgPCBJTVhfQ0hJUF9SRVZJU0lPTl8yXzApCi0JCXR6aWNfYWRkciA9IE1YNTFfVFpJQ19CQVNFX0FERFJfVE8xOwotCWVsc2UKLQkJdHppY19hZGRyID0gTVg1MV9UWklDX0JBU0VfQUREUjsKLQotCXR6aWNfdmlydCA9IGlvcmVtYXAodHppY19hZGRyLCBTWl8xNkspOwotCWlmICghdHppY192aXJ0KQotCQlwYW5pYygidW5hYmxlIHRvIG1hcCBUWklDIGludGVycnVwdCBjb250cm9sbGVyXG4iKTsKLQotCXR6aWNfaW5pdF9pcnEodHppY192aXJ0KTsKKwl0emljX2luaXRfaXJxKE1YNTFfSU9fQUREUkVTUyhNWDUxX1RaSUNfQkFTRV9BRERSKSk7CiB9CiAKIHZvaWQgX19pbml0IG14NTNfaW5pdF9pcnEodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHR6aWNfYWRkcjsKLQl2b2lkIF9faW9tZW0gKnR6aWNfdmlydDsKLQotCXR6aWNfYWRkciA9IE1YNTNfVFpJQ19CQVNFX0FERFI7Ci0KLQl0emljX3ZpcnQgPSBpb3JlbWFwKHR6aWNfYWRkciwgU1pfMTZLKTsKLQlpZiAoIXR6aWNfdmlydCkKLQkJcGFuaWMoInVuYWJsZSB0byBtYXAgVFpJQyBpbnRlcnJ1cHQgY29udHJvbGxlclxuIik7Ci0KLQl0emljX2luaXRfaXJxKHR6aWNfdmlydCk7CisJdHppY19pbml0X2lycShNWDUzX0lPX0FERFJFU1MoTVg1M19UWklDX0JBU0VfQUREUikpOwogfQogCiBzdGF0aWMgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzIGlteDUxX3NkbWFfc2NyaXB0IF9faW5pdGRhdGEgPSB7CkBAIC0xMzgsMTMgKzE1MSwyNCBAQAogCS5zY3JpcHRfYWRkcnMgPSAmaW14NTNfc2RtYV9zY3JpcHQsCiB9OwogCit2b2lkIF9faW5pdCBpbXg1MF9zb2NfaW5pdCh2b2lkKQoreworCS8qIGkubXg1MCBoYXMgdGhlIGkubXgzMSB0eXBlIGdwaW8gKi8KKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YNTBfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU8xX0xPVywgTVg1MF9JTlRfR1BJTzFfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDUwX0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPMl9MT1csIE1YNTBfSU5UX0dQSU8yX0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMiwgTVg1MF9HUElPM19CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzNfTE9XLCBNWDUwX0lOVF9HUElPM19ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDMsIE1YNTBfR1BJTzRfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU80X0xPVywgTVg1MF9JTlRfR1BJTzRfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCA0LCBNWDUwX0dQSU81X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPNV9MT1csIE1YNTBfSU5UX0dQSU81X0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgNSwgTVg1MF9HUElPNl9CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzZfTE9XLCBNWDUwX0lOVF9HUElPNl9ISUdIKTsKK30KKwogdm9pZCBfX2luaXQgaW14NTFfc29jX2luaXQodm9pZCkKIHsKIAkvKiBpLm14NTEgaGFzIHRoZSBpLm14MzEgdHlwZSBncGlvICovCi0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAwLCBNWDUxX0dQSU8xX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX01YQ19JTlRfR1BJTzFfTE9XLCBNWDUxX01YQ19JTlRfR1BJTzFfSElHSCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDUxX0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX01YQ19JTlRfR1BJTzJfTE9XLCBNWDUxX01YQ19JTlRfR1BJTzJfSElHSCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDUxX0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX01YQ19JTlRfR1BJTzNfTE9XLCBNWDUxX01YQ19JTlRfR1BJTzNfSElHSCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAzLCBNWDUxX0dQSU80X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX01YQ19JTlRfR1BJTzRfTE9XLCBNWDUxX01YQ19JTlRfR1BJTzRfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAwLCBNWDUxX0dQSU8xX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX0lOVF9HUElPMV9MT1csIE1YNTFfSU5UX0dQSU8xX0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMSwgTVg1MV9HUElPMl9CQVNFX0FERFIsIFNaXzE2SywgTVg1MV9JTlRfR1BJTzJfTE9XLCBNWDUxX0lOVF9HUElPMl9ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YNTFfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YNTFfSU5UX0dQSU8zX0xPVywgTVg1MV9JTlRfR1BJTzNfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAzLCBNWDUxX0dQSU80X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX0lOVF9HUElPNF9MT1csIE1YNTFfSU5UX0dQSU80X0hJR0gpOwogCiAJLyogaS5teDUxIGhhcyB0aGUgaS5teDM1IHR5cGUgc2RtYSAqLwogCWlteF9hZGRfaW14X3NkbWEoImlteDM1LXNkbWEiLCBNWDUxX1NETUFfQkFTRV9BRERSLCBNWDUxX0lOVF9TRE1BLCAmaW14NTFfc2RtYV9wZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9teDUxX2VmaWthLmMgYi9hcmNoL2FybS9tYWNoLW14NS9teDUxX2VmaWthLmMKaW5kZXggYzkyMDk0NS4uZWM2Y2E5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvbXg1MV9lZmlrYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L214NTFfZWZpa2EuYwpAQCAtMzQsMTQgKzM0LDEyIEBACiAjaW5jbHVkZSA8bGludXgvdXNiL3VscGkuaD4KICNpbmNsdWRlIDxtYWNoL3VscGkuaD4KIAotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLWlteDUxLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgImVmaWthLmgiCiAjaW5jbHVkZSAiY3B1X29wLW14NTEuaCIKIApAQCAtMTMzLDcgKzEzMSw3IEBACiAJdTMyIHY7CiAJdm9pZCBfX2lvbWVtICp1c2JfYmFzZTsKIAl2b2lkIF9faW9tZW0gKnVzYm90aGVyX2Jhc2U7Ci0JdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfT1RHX0JBU0VfQUREUiwgU1pfNEspOworCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX1VTQl9PVEdfQkFTRV9BRERSLCBTWl80Syk7CiAJaWYgKCF1c2JfYmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJdXNib3RoZXJfYmFzZSA9ICh2b2lkIF9faW9tZW0gKikodXNiX2Jhc2UgKyBNWDVfVVNCT1RIRVJfUkVHU19PRkZTRVQpOwpAQCAtMTUwLDcgKzE0OCw3IEBACiAJcmV0dXJuIG14NTFfaW5pdGlhbGl6ZV91c2JfaHcocGRldi0+aWQsIE1YQ19FSENJX0lOVEVSTkFMX1BIWSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBkcl91dG1pX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBkcl91dG1pX2NvbmZpZyBfX2luaXRjb25zdCA9IHsKIAkuaW5pdCAgID0gaW5pdGlhbGl6ZV9vdGdfcG9ydCwKIAkucG9ydHNjID0gTVhDX0VIQ0lfVVRNSV8xNkJJVCwKIH07CkBAIC0xNzAsNyArMTY4LDcgQEAKIAlncGlvX3NldF92YWx1ZShFRklLQU1YX1VTQkgxX1NUUCwgMSk7CiAJbXNsZWVwKDEpOwogCi0JdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfT1RHX0JBU0VfQUREUiwgU1pfNEspOworCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX1VTQl9PVEdfQkFTRV9BRERSLCBTWl80Syk7CiAJc29jcmVnc19iYXNlID0gKHZvaWQgX19pb21lbSAqKSh1c2JfYmFzZSArIE1YNV9VU0JPVEhFUl9SRUdTX09GRlNFVCk7CiAKIAkvKiBUaGUgY2xvY2sgZm9yIHRoZSBVU0JIMSBVTFBJIHBvcnQgd2lsbCBjb21lIGV4dGVybmFsbHkgKi8KQEAgLTE4OSw3ICsxODcsNyBAQAogCXJldHVybiBteDUxX2luaXRpYWxpemVfdXNiX2h3KHBkZXYtPmlkLCBNWENfRUhDSV9JVENfTk9fVEhSRVNIT0xEKTsKIH0KIAotc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIHVzYmgxX2NvbmZpZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB1c2JoMV9jb25maWcgX19pbml0ZGF0YSA9IHsKIAkuaW5pdCAgID0gaW5pdGlhbGl6ZV91c2JoMV9wb3J0LAogCS5wb3J0c2MgPSBNWENfRUhDSV9NT0RFX1VMUEksCiB9OwpAQCAtMjE3LDkgKzIxNSw5IEBACiAJdXNiaDFfY29uZmlnLm90ZyA9IGlteF9vdGdfdWxwaV9jcmVhdGUoVUxQSV9PVEdfRFJWVkJVUyB8CiAJCQlVTFBJX09UR19EUlZWQlVTX0VYVCB8IFVMUElfT1RHX0VYVFZCVVNJTkQpOwogCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmRyX2hvc3RfZGV2aWNlLCAmZHJfdXRtaV9jb25maWcpOworCWlteDUxX2FkZF9teGNfZWhjaV9vdGcoJmRyX3V0bWlfY29uZmlnKTsKIAlpZiAodXNiaDFfY29uZmlnLm90ZykKLQkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmgxX2RldmljZSwgJnVzYmgxX2NvbmZpZyk7CisJCWlteDUxX2FkZF9teGNfZWhjaV9ocygxLCAmdXNiaDFfY29uZmlnKTsKIH0KIAogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIG14NTFfZWZpa2Ffc3BpX25vcl9wYXJ0aXRpb25zW10gPSB7CkBAIC01NjcsNyArNTY1LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWMxM3h4eF9wbGF0Zm9ybV9kYXRhIG14NTFfZWZpa2FfbWMxMzg5Ml9kYXRhID0gewotCS5mbGFncyA9IE1DMTNYWFhfVVNFX1JUQyB8IE1DMTNYWFhfVVNFX1JFR1VMQVRPUiwKKwkuZmxhZ3MgPSBNQzEzWFhYX1VTRV9SVEMsCiAJLnJlZ3VsYXRvcnMgPSB7CiAJCS5udW1fcmVndWxhdG9ycyA9IEFSUkFZX1NJWkUobXg1MV9lZmlrYV9yZWd1bGF0b3JzKSwKIAkJLnJlZ3VsYXRvcnMgPSBteDUxX2VmaWthX3JlZ3VsYXRvcnMsCkBAIC01ODksNyArNTg3LDcgQEAKIAkJLmJ1c19udW0gPSAwLAogCQkuY2hpcF9zZWxlY3QgPSAwLAogCQkucGxhdGZvcm1fZGF0YSA9ICZteDUxX2VmaWthX21jMTM4OTJfZGF0YSwKLQkJLmlycSA9IGdwaW9fdG9faXJxKEVGSUtBTVhfUE1JQyksCisJCS5pcnEgPSBJTVhfR1BJT19UT19JUlEoRUZJS0FNWF9QTUlDKSwKIAl9LAogfTsKIApAQCAtNjA5LDcgKzYwNyw2IEBACiAJCQkJCUFSUkFZX1NJWkUobXg1MWVmaWthX3BhZHMpKTsKIAlpbXg1MV9hZGRfaW14X3VhcnQoMCwgJnVhcnRfcGRhdGEpOwogCW14NTFfZWZpa2FfdXNiKCk7Ci0JaW14NTFfYWRkX3NkaGNpX2VzZGhjX2lteCgwLCBOVUxMKTsKIAogCS8qIEZJWE1FOiBjb21lcyBmcm9tIG9yaWdpbmFsIGNvZGUuIGNoZWNrIHRoaXMuICovCiAJaWYgKG14NTFfcmV2aXNpb24oKSA8IElNWF9DSElQX1JFVklTSU9OXzJfMCkKQEAgLTYyNyw4ICs2MjQsOSBAQAogCQlBUlJBWV9TSVpFKG14NTFfZWZpa2Ffc3BpX2JvYXJkX2luZm8pKTsKIAlpbXg1MV9hZGRfZWNzcGkoMCwgJm14NTFfZWZpa2Ffc3BpX3BkYXRhKTsKIAorCWlteDUxX2FkZF9wYXRhX2lteCgpOworCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVFfSU1YKQogCWdldF9jcHVfb3AgPSBteDUxX2dldF9jcHVfb3A7CiAjZW5kaWYKIH0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvcG0taW14NS5jIGIvYXJjaC9hcm0vbWFjaC1teDUvcG0taW14NS5jCmluZGV4IGU0NTI5YWYuLjk4MDUyZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L3BtLWlteDUuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9wbS1pbXg1LmMKQEAgLTE0LDE0ICsxNCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0jaW5jbHVkZSA8bWFjaC9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlICJjcm1fcmVncy5oIgogCiBzdGF0aWMgc3RydWN0IGNsayAqZ3BjX2R2ZnNfY2xrOwogCitzdGF0aWMgaW50IG14NV9zdXNwZW5kX3ByZXBhcmUodm9pZCkKK3sKKwlyZXR1cm4gY2xrX2VuYWJsZShncGNfZHZmc19jbGspOworfQorCiBzdGF0aWMgaW50IG14NV9zdXNwZW5kX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKLQljbGtfZW5hYmxlKGdwY19kdmZzX2Nsayk7CiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgUE1fU1VTUEVORF9NRU06CiAJCW14NV9jcHVfbHBfc2V0KFNUT1BfUE9XRVJfT0ZGKTsKQEAgLTQyLDExICs0NywxNCBAQAogCQlfX3Jhd193cml0ZWwoMCwgTVhDX1NSUEdfRU1QR0MxX1NSUEdDUik7CiAJfQogCWNwdV9kb19pZGxlKCk7Ci0JY2xrX2Rpc2FibGUoZ3BjX2R2ZnNfY2xrKTsKLQogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBteDVfc3VzcGVuZF9maW5pc2godm9pZCkKK3sKKwljbGtfZGlzYWJsZShncGNfZHZmc19jbGspOworfQorCiBzdGF0aWMgaW50IG14NV9wbV92YWxpZChzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCiB7CiAJcmV0dXJuIChzdGF0ZSA+IFBNX1NVU1BFTkRfT04gJiYgc3RhdGUgPD0gUE1fU1VTUEVORF9NQVgpOwpAQCAtNTQsNyArNjIsOSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIG14NV9zdXNwZW5kX29wcyA9IHsKIAkudmFsaWQgPSBteDVfcG1fdmFsaWQsCisJLnByZXBhcmUgPSBteDVfc3VzcGVuZF9wcmVwYXJlLAogCS5lbnRlciA9IG14NV9zdXNwZW5kX2VudGVyLAorCS5maW5pc2ggPSBteDVfc3VzcGVuZF9maW5pc2gsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBteDVfcG1faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvc3lzdGVtLmMgYi9hcmNoL2FybS9tYWNoLW14NS9zeXN0ZW0uYwppbmRleCA3NmFlOGRjLi4xNDRlYmViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9zeXN0ZW0uYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9zeXN0ZW0uYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSAiY3JtX3JlZ3MuaCIKIAogLyogc2V0IGNwdSBsb3cgcG93ZXIgbW9kZSBiZWZvcmUgV0ZJIGluc3RydWN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbXhzL0tjb25maWcKaW5kZXggNGNkMDIzMS4uY2YwMGIzZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW14cy9LY29uZmlnCkBAIC0yMyw2ICsyMyw3IEBACiAJc2VsZWN0IE1YU19IQVZFX0FNQkFfRFVBUlQKIAlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fQVVBUlQKIAlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fTVhTX01NQworCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9SVENfU1RNUDNYWFgKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIFNUTVAzNzh4LWRldmIgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKIAkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KQEAgLTM0LDYgKzM1LDcgQEAKIAlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fQVVBUlQKIAlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fTVhTX01NQwogCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9NWFNGQgorCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9SVENfU1RNUDNYWFgKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIE1YMjNFVksgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKIAkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KQEAgLTQ4LDYgKzUwLDkgQEAKIAlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fRkxFWENBTgogCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9NWFNfTU1DCiAJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX01YU0ZCCisJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX01YU19TQUlGCisJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX01YU19JMkMKKwlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fUlRDX1NUTVAzWFhYCiAJc2VsZWN0IE1YU19PQ09UUAogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgTVgyOEVWSyBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYwpAQCAtNjMsOSArNjgsMjcgQEAKIAlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fTVhTX0kyQwogCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9NWFNfTU1DCiAJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX01YU19QV00KKwlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fUlRDX1NUTVAzWFhYCisKK2NvbmZpZyBNT0RVTEVfTTI4CisJYm9vbAorCXNlbGVjdCBTT0NfSU1YMjgKKwlzZWxlY3QgTEVEU19HUElPX1JFR0lTVEVSCisJc2VsZWN0IE1YU19IQVZFX0FNQkFfRFVBUlQKKwlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fQVVBUlQKKwlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fRkVDCisJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX0ZMRVhDQU4KKwlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fTVhTX0kyQworCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9NWFNfTU1DCisJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX01YU0ZCCisJc2VsZWN0IE1YU19PQ09UUAogCiBjb25maWcgTUFDSF9UWDI4CiAJYm9vbCAiS2EtUm8gVFgyOCBtb2R1bGUiCiAJc2VsZWN0IE1PRFVMRV9UWDI4CiAKK2NvbmZpZyBNQUNIX00yOEVWSworCWJvb2wgIlN1cHBvcnQgREVOWCBNMjhFVksgUGxhdGZvcm0iCisJc2VsZWN0IE1PRFVMRV9NMjgKKwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1teHMvTWFrZWZpbGUKaW5kZXggNmMzODI2Mi4uOGM5M2IyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvTWFrZWZpbGUKQEAgLTEsMTUgKzEsMTYgQEAKICMgQ29tbW9uIHN1cHBvcnQKLW9iai15IDo9IGNsb2NrLm8gZGV2aWNlcy5vIGljb2xsLm8gaW9tdXgubyBzeXN0ZW0ubyB0aW1lci5vCitvYmoteSA6PSBjbG9jay5vIGRldmljZXMubyBpY29sbC5vIGlvbXV4Lm8gc3lzdGVtLm8gdGltZXIubyBtbS5vCiAKIG9iai0kKENPTkZJR19NWFNfT0NPVFApICs9IG9jb3RwLm8KIG9iai0kKENPTkZJR19QTSkgKz0gcG0ubwogCi1vYmotJChDT05GSUdfU09DX0lNWDIzKSArPSBjbG9jay1teDIzLm8gbW0tbXgyMy5vCi1vYmotJChDT05GSUdfU09DX0lNWDI4KSArPSBjbG9jay1teDI4Lm8gbW0tbXgyOC5vCitvYmotJChDT05GSUdfU09DX0lNWDIzKSArPSBjbG9jay1teDIzLm8KK29iai0kKENPTkZJR19TT0NfSU1YMjgpICs9IGNsb2NrLW14MjgubwogCiBvYmotJChDT05GSUdfTUFDSF9TVE1QMzc4WF9ERVZCKSArPSBtYWNoLXN0bXAzNzh4X2RldmIubwogb2JqLSQoQ09ORklHX01BQ0hfTVgyM0VWSykgKz0gbWFjaC1teDIzZXZrLm8KIG9iai0kKENPTkZJR19NQUNIX01YMjhFVkspICs9IG1hY2gtbXgyOGV2ay5vCitvYmotJChDT05GSUdfTUFDSF9NMjhFVkspICAgICs9IG1hY2gtbTI4ZXZrLm8KIG9iai0kKENPTkZJR19NT0RVTEVfVFgyOCkgKz0gbW9kdWxlLXR4Mjgubwogb2JqLSQoQ09ORklHX01BQ0hfVFgyOCkgICAgKz0gbWFjaC10eDI4Lm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvY2xvY2stbXgyOC5jIGIvYXJjaC9hcm0vbWFjaC1teHMvY2xvY2stbXgyOC5jCmluZGV4IDVkY2M1OWQuLjIyOWFlMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2Nsb2NrLW14MjguYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9jbG9jay1teDI4LmMKQEAgLTM0OSw3ICszNDksNyBAQAogCQkJCQkJCQkJXAogCQlyZWcgPSBfX3Jhd19yZWFkbChDTEtDVFJMX0JBU0VfQUREUiArIEhXX0NMS0NUUkxfIyNmcik7CVwKIAkJcmVnICY9IH5CTV9DTEtDVFJMXyMjZnIjI18jI2ZzIyNGUkFDOwkJCVwKLQkJcmVnIHw9IGZyYWM7CQkJCQkJXAorCQlyZWcgfD0gZnJhYyA8PCBCUF9DTEtDVFJMXyMjZnIjI18jI2ZzIyNGUkFDOwkJXAogCQlfX3Jhd193cml0ZWwocmVnLCBDTEtDVFJMX0JBU0VfQUREUiArIEhXX0NMS0NUUkxfIyNmcik7CVwKIAl9CQkJCQkJCQlcCiAJCQkJCQkJCQlcCkBAIC02NDAsNiArNjQwLDggQEAKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImxyYWRjIiwgbHJhZGNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAic3BkaWYiLCBzcGRpZl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgyOC1mYiIsIE5VTEwsIGxjZGlmX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soIm14cy1zYWlmLjAiLCBOVUxMLCBzYWlmMF9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJteHMtc2FpZi4xIiwgTlVMTCwgc2FpZjFfY2xrKQogfTsKIAogc3RhdGljIGludCBjbGtfbWlzY19pbml0KHZvaWQpCkBAIC03MDgsMTEgKzcxMCwxMSBAQAogCiAJLyogU0FJRiBoYXMgdG8gdXNlIGZyYWMgZGl2IGZvciBmdW5jdGlvbmFsIG9wZXJhdGlvbiAqLwogCXJlZyA9IF9fcmF3X3JlYWRsKENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF9TQUlGMCk7Ci0JcmVnICY9IH5CTV9DTEtDVFJMX1NBSUYwX0RJVl9GUkFDX0VOOworCXJlZyB8PSBCTV9DTEtDVFJMX1NBSUYwX0RJVl9GUkFDX0VOOwogCV9fcmF3X3dyaXRlbChyZWcsIENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF9TQUlGMCk7CiAKIAlyZWcgPSBfX3Jhd19yZWFkbChDTEtDVFJMX0JBU0VfQUREUiArIEhXX0NMS0NUUkxfU0FJRjEpOwotCXJlZyAmPSB+Qk1fQ0xLQ1RSTF9TQUlGMV9ESVZfRlJBQ19FTjsKKwlyZWcgfD0gQk1fQ0xLQ1RSTF9TQUlGMV9ESVZfRlJBQ19FTjsKIAlfX3Jhd193cml0ZWwocmVnLCBDTEtDVFJMX0JBU0VfQUREUiArIEhXX0NMS0NUUkxfU0FJRjEpOwogCiAJLyoKQEAgLTczOCwxMSArNzQwLDE3IEBACiAJX19yYXdfd3JpdGVsKEJNX0NMS0NUUkxfQ1BVX0lOVEVSUlVQVF9XQUlULAogCQkJQ0xLQ1RSTF9CQVNFX0FERFIgKyBIV19DTEtDVFJMX0NQVV9TRVQpOwogCi0JLyogRXh0cmEgZmVjIGNsb2NrIHNldHRpbmcgKi8KLQlyZWcgPSBfX3Jhd19yZWFkbChDTEtDVFJMX0JBU0VfQUREUiArIEhXX0NMS0NUUkxfRU5FVCk7Ci0JcmVnICY9IH5CTV9DTEtDVFJMX0VORVRfU0xFRVA7Ci0JcmVnIHw9IEJNX0NMS0NUUkxfRU5FVF9DTEtfT1VUX0VOOwotCV9fcmF3X3dyaXRlbChyZWcsIENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF9FTkVUKTsKKwkvKgorCSAqIEV4dHJhIGZlYyBjbG9jayBzZXR0aW5nCisJICogVGhlIERFTlggTTI4IHVzZXMgYW4gZXh0ZXJuYWwgY2xvY2sgc291cmNlCisJICogYW5kIHRoZSBjbG9jayBvdXRwdXQgbXVzdCBub3QgYmUgZW5hYmxlZAorCSAqLworCWlmICghbWFjaGluZV9pc19tMjhldmsoKSkgeworCQlyZWcgPSBfX3Jhd19yZWFkbChDTEtDVFJMX0JBU0VfQUREUiArIEhXX0NMS0NUUkxfRU5FVCk7CisJCXJlZyAmPSB+Qk1fQ0xLQ1RSTF9FTkVUX1NMRUVQOworCQlyZWcgfD0gQk1fQ0xLQ1RSTF9FTkVUX0NMS19PVVRfRU47CisJCV9fcmF3X3dyaXRlbChyZWcsIENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF9FTkVUKTsKKwl9CiAKIAkvKgogCSAqIDQ4MCBNSHogc2VlbXMgdG9vIGhpZ2ggdG8gYmUgc3NwIGNsb2NrIHNvdXJjZSBkaXJlY3RseSwKQEAgLTc3NCw2ICs3ODIsOCBAQAogCWNsa19lbmFibGUoJnVhcnRfY2xrKTsKIAogCWNsa19zZXRfcGFyZW50KCZsY2RpZl9jbGssICZyZWZfcGl4X2Nsayk7CisJY2xrX3NldF9wYXJlbnQoJnNhaWYwX2NsaywgJnBsbDBfY2xrKTsKKwljbGtfc2V0X3BhcmVudCgmc2FpZjFfY2xrLCAmcGxsMF9jbGspOwogCiAJY2xrZGV2X2FkZF90YWJsZShsb29rdXBzLCBBUlJBWV9TSVpFKGxvb2t1cHMpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy1teDIzLmggYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzLW14MjMuaAppbmRleCBjNmYzNDVmLi4zZmE2NTFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzLW14MjMuaAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzLW14MjMuaApAQCAtMjksMyArMjksNSBAQAogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgbXgyM19hZGRfbXhzZmIoCiAJCWNvbnN0IHN0cnVjdCBteHNmYl9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBteDIzX2FkZF9ydGNfc3RtcDN4eHgodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzLW14MjguaCBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMtbXgyOC5oCmluZGV4IDc5Yjk0NTIuLmM4ODg3MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMtbXgyOC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMtbXgyOC5oCkBAIC00NSwzICs0NSw4IEBACiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBteDI4X2FkZF9teHNmYigKIAkJY29uc3Qgc3RydWN0IG14c2ZiX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBteHNfc2FpZl9kYXRhIG14Mjhfc2FpZl9kYXRhW10gX19pbml0Y29uc3Q7CisjZGVmaW5lIG14MjhfYWRkX3NhaWYoaWQpICAgICAgICAgICAgICBteHNfYWRkX3NhaWYoJm14Mjhfc2FpZl9kYXRhW2lkXSkKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IG14MjhfYWRkX3J0Y19zdG1wM3h4eCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvS2NvbmZpZwppbmRleCBhY2Y5ZWVhLi4xOGI2YmY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9LY29uZmlnCkBAIC0yMywzICsyMyw5IEBACiAKIGNvbmZpZyBNWFNfSEFWRV9QTEFURk9STV9NWFNGQgogCWJvb2wKKworY29uZmlnIE1YU19IQVZFX1BMQVRGT1JNX01YU19TQUlGCisJYm9vbAorCitjb25maWcgTVhTX0hBVkVfUExBVEZPUk1fUlRDX1NUTVAzWFhYCisJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvTWFrZWZpbGUKaW5kZXggMzUxOTE1Yy4uZjUyZTNlNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL01ha2VmaWxlCkBAIC04LDMgKzgsNSBAQAogb2JqLSQoQ09ORklHX01YU19IQVZFX1BMQVRGT1JNX01YU19QV00pICs9IHBsYXRmb3JtLW14cy1wd20ubwogb2JqLXkgKz0gcGxhdGZvcm0tZ3Bpby1teHMubwogb2JqLSQoQ09ORklHX01YU19IQVZFX1BMQVRGT1JNX01YU0ZCKSArPSBwbGF0Zm9ybS1teHNmYi5vCitvYmotJChDT05GSUdfTVhTX0hBVkVfUExBVEZPUk1fTVhTX1NBSUYpICs9IHBsYXRmb3JtLW14cy1zYWlmLm8KK29iai0kKENPTkZJR19NWFNfSEFWRV9QTEFURk9STV9SVENfU1RNUDNYWFgpICs9IHBsYXRmb3JtLXJ0Yy1zdG1wM3h4eC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLW14cy1zYWlmLmMgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLW14cy1zYWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjOTY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tbXhzLXNhaWYuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxtYWNoL214MjMuaD4KKyNpbmNsdWRlIDxtYWNoL214MjguaD4KKyNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CisKKyNkZWZpbmUgbXhzX3NhaWZfZGF0YV9lbnRyeV9zaW5nbGUoc29jLCBfaWQpCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5pZCA9IF9pZCwJCQkJCQlcCisJCS5pb2Jhc2UgPSBzb2MgIyMgX1NBSUYgIyMgX2lkICMjIF9CQVNFX0FERFIsCQlcCisJCS5pcnEgPSBzb2MgIyMgX0lOVF9TQUlGICMjIF9pZCwJCQkJXAorCQkuZG1hID0gc29jICMjIF9ETUFfU0FJRiAjIyBfaWQsCQkJCVwKKwkJLmRtYWlycSA9IHNvYyAjIyBfSU5UX1NBSUYgIyMgX2lkICMjX0RNQSwJCVwKKwl9CisKKyNkZWZpbmUgbXhzX3NhaWZfZGF0YV9lbnRyeShzb2MsIF9pZCkJCQkJCVwKKwlbX2lkXSA9IG14c19zYWlmX2RhdGFfZW50cnlfc2luZ2xlKHNvYywgX2lkKQorCisjaWZkZWYgQ09ORklHX1NPQ19JTVgyOAorY29uc3Qgc3RydWN0IG14c19zYWlmX2RhdGEgbXgyOF9zYWlmX2RhdGFbXSBfX2luaXRjb25zdCA9IHsKKwlteHNfc2FpZl9kYXRhX2VudHJ5KE1YMjgsIDApLAorCW14c19zYWlmX2RhdGFfZW50cnkoTVgyOCwgMSksCit9OworI2VuZGlmCisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBteHNfYWRkX3NhaWYoY29uc3Qgc3RydWN0IG14c19zYWlmX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHJlc291cmNlIHJlc1tdID0geworCQl7CisJCQkuc3RhcnQgPSBkYXRhLT5pb2Jhc2UsCisJCQkuZW5kID0gZGF0YS0+aW9iYXNlICsgU1pfNEsgLSAxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sIHsKKwkJCS5zdGFydCA9IGRhdGEtPmlycSwKKwkJCS5lbmQgPSBkYXRhLT5pcnEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwgeworCQkJLnN0YXJ0ID0gZGF0YS0+ZG1hLAorCQkJLmVuZCA9IGRhdGEtPmRtYSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCQl9LCB7CisJCQkuc3RhcnQgPSBkYXRhLT5kbWFpcnEsCisJCQkuZW5kID0gZGF0YS0+ZG1haXJxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCisKKwl9OworCisJcmV0dXJuIG14c19hZGRfcGxhdGZvcm1fZGV2aWNlKCJteHMtc2FpZiIsIGRhdGEtPmlkLCByZXMsCisJCQkJCUFSUkFZX1NJWkUocmVzKSwgTlVMTCwgMCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLXJ0Yy1zdG1wM3h4eC5jIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1ydGMtc3RtcDN4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzllYWVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1ydGMtc3RtcDN4eHguYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFBlbmd1dHJvbml4LCBXb2xmcmFtIFNhbmcgPHcuc2FuZ0BwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8bWFjaC9teDIzLmg+CisjaW5jbHVkZSA8bWFjaC9teDI4Lmg+CisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX1NPQ19JTVgyMworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IG14MjNfYWRkX3J0Y19zdG1wM3h4eCh2b2lkKQoreworCXN0cnVjdCByZXNvdXJjZSByZXNbXSA9IHsKKwkJeworCQkJLnN0YXJ0ID0gTVgyM19SVENfQkFTRV9BRERSLAorCQkJLmVuZCA9IE1YMjNfUlRDX0JBU0VfQUREUiArIFNaXzhLIC0gMSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LCB7CisJCQkuc3RhcnQgPSBNWDIzX0lOVF9SVENfQUxBUk0sCisJCQkuZW5kID0gTVgyM19JTlRfUlRDX0FMQVJNLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCisJfTsKKworCXJldHVybiBteHNfYWRkX3BsYXRmb3JtX2RldmljZSgic3RtcDN4eHgtcnRjIiwgMCwgcmVzLCBBUlJBWV9TSVpFKHJlcyksCisJCQkJCU5VTEwsIDApOworfQorI2VuZGlmIC8qIENPTkZJR19TT0NfSU1YMjMgKi8KKworI2lmZGVmIENPTkZJR19TT0NfSU1YMjgKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBteDI4X2FkZF9ydGNfc3RtcDN4eHgodm9pZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzW10gPSB7CisJCXsKKwkJCS5zdGFydCA9IE1YMjhfUlRDX0JBU0VfQUREUiwKKwkJCS5lbmQgPSBNWDI4X1JUQ19CQVNFX0FERFIgKyBTWl84SyAtIDEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwkJfSwgeworCQkJLnN0YXJ0ID0gTVgyOF9JTlRfUlRDX0FMQVJNLAorCQkJLmVuZCA9IE1YMjhfSU5UX1JUQ19BTEFSTSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQl9LAorCX07CisKKwlyZXR1cm4gbXhzX2FkZF9wbGF0Zm9ybV9kZXZpY2UoInN0bXAzeHh4LXJ0YyIsIDAsIHJlcywgQVJSQVlfU0laRShyZXMpLAorCQkJCQlOVUxMLCAwKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU09DX0lNWDI4ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDc5NjUwYTEuLjkwYzZiNzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNCwyMyArMTQsMTUgQEAKICNpbmNsdWRlIDxtYWNoL214MjMuaD4KICNpbmNsdWRlIDxtYWNoL214MjguaD4KIAotI2lmZGVmIENPTkZJR19TT0NfSU1YMjMKLSNpZmRlZiBVQVJUX1BBRERSCi0jZXJyb3IgIkNPTkZJR19ERUJVR19MTCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBhcmNocyIKLSNlbmRpZgorI2lmZGVmIENPTkZJR19ERUJVR19JTVgyM19VQVJUCiAjZGVmaW5lIFVBUlRfUEFERFIJTVgyM19EVUFSVF9CQVNFX0FERFIKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NPQ19JTVgyOAotI2lmZGVmIFVBUlRfUEFERFIKLSNlcnJvciAiQ09ORklHX0RFQlVHX0xMIGlzIGluY29tcGF0aWJsZSB3aXRoIG11bHRpcGxlIGFyY2hzIgotI2VuZGlmCisjZWxpZiBkZWZpbmVkIChDT05GSUdfREVCVUdfSU1YMjhfVUFSVCkKICNkZWZpbmUgVUFSVF9QQUREUglNWDI4X0RVQVJUX0JBU0VfQUREUgogI2VuZGlmCiAKICNkZWZpbmUgVUFSVF9WQUREUglNWFNfSU9fQUREUkVTUyhVQVJUX1BBRERSKQogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbGRyCVxycCwgPVVBUlRfUEFERFIJQCBwaHlzaWNhbAogCQlsZHIJXHJ2LCA9VUFSVF9WQUREUglAIHZpcnR1YWwKIAkJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9kZXZpY2VzLWNvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKaW5kZXggODEyZDdhOC4uYTgwODBmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKQEAgLTkyLDMgKzkyLDE1IEBACiAvKiBwd20gKi8KIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBteHNfYWRkX214c19wd20oCiAJCXJlc291cmNlX3NpemVfdCBpb2Jhc2UsIGludCBpZCk7CisKKy8qIHNhaWYgKi8KK3N0cnVjdCBteHNfc2FpZl9kYXRhIHsKKwlpbnQgaWQ7CisJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZTsKKwlyZXNvdXJjZV9zaXplX3QgaXJxOworCXJlc291cmNlX3NpemVfdCBkbWE7CisJcmVzb3VyY2Vfc2l6ZV90IGRtYWlycTsKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBteHNfYWRkX3NhaWYoCisJCWNvbnN0IHN0cnVjdCBteHNfc2FpZl9kYXRhICpkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDgyOGNjY2MuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSwzNSArMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgMjAwOCBKdWVyZ2VuIEJlaXNlcnQsIGtlcm5lbEBwZW5ndXRyb25peC5kZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9NWFNfR1BJT19IX18KLSNkZWZpbmUgX19NQUNIX01YU19HUElPX0hfXwotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0jZGVmaW5lIE1YU19HUElPX05SKGJhbmssIG5yKQkoKGJhbmspICogMzIgKyAobnIpKQotCi0vKiB1c2UgZ3Bpb2xpYiBkaXNwYXRjaGVycyAqLwotI2RlZmluZSBncGlvX2dldF92YWx1ZQkJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQkJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCQlfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEJCV9fZ3Bpb190b19pcnEKLQotI2RlZmluZSBpcnFfdG9fZ3BpbyhpcnEpCSgoaXJxKSAtIE1YU19HUElPX0lSUV9TVEFSVCkKLQotI2VuZGlmIC8qIF9fTUFDSF9NWFNfR1BJT19IX18gKi8KKy8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDIwYTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9NWFNfTUVNT1JZX0hfXwotI2RlZmluZSBfX01BQ0hfTVhTX01FTU9SWV9IX18KLQotI2RlZmluZSBQSFlTX09GRlNFVAkJVUwoMHg0MDAwMDAwMCkKLQotI2VuZGlmIC8qIF9fTUFDSF9NWFNfTUVNT1JZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL214cy5oIGIvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL214cy5oCmluZGV4IDM1YTg5ZGQuLjBkMmQyYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9teHMuaAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvbXhzLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAkJMCkKICNkZWZpbmUgY3B1X2lzX214MjgoKQkJKAkJCQkJXAogCQltYWNoaW5lX2lzX214MjhldmsoKSB8fAkJCQkJXAorCQltYWNoaW5lX2lzX20yOGV2aygpIHx8CQkJCQlcCiAJCW1hY2hpbmVfaXNfdHgyOCgpIHx8CQkJCQlcCiAJCTApCiAKQEAgLTg2LDYgKzg3LDggQEAKIAkudHlwZSA9IF90eXBlLAkJCQkJCQlcCiB9CiAKKyNkZWZpbmUgTVhTX0dQSU9fTlIoYmFuaywgbnIpCSgoYmFuaykgKiAzMiArIChucikpCisKICNkZWZpbmUgTVhTX1NFVF9BRERSCQkweDQKICNkZWZpbmUgTVhTX0NMUl9BRERSCQkweDgKICNkZWZpbmUgTVhTX1RPR19BRERSCQkweGMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IDdmOGJmNjUuLjY3Nzc2NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtNjMsNiArNjMsNyBAQAogCQlteHNfZHVhcnRfYmFzZSA9IE1YMjNfRFVBUlRfQkFTRV9BRERSOwogCQlicmVhazsKIAljYXNlIE1BQ0hfVFlQRV9NWDI4RVZLOgorCWNhc2UgTUFDSF9UWVBFX00yOEVWSzoKIAljYXNlIE1BQ0hfVFlQRV9UWDI4OgogCQlteHNfZHVhcnRfYmFzZSA9IE1YMjhfRFVBUlRfQkFTRV9BRERSOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbTI4ZXZrLmMgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW0yOGV2ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTY4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW0yOGV2ay5jCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExCisgKiBTdGVmYW5vIEJhYmljLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8c2JhYmljQGRlbnguZGU+CisgKgorICogYmFzZWQgb246IG1hY2gtbXgyOF9ldmsuYworICogQ29weXJpZ2h0IDIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvYXQyNC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MjguaD4KKworI2luY2x1ZGUgImRldmljZXMtbXgyOC5oIgorCisjZGVmaW5lIE0yOEVWS19HUElPX1VTRVJMRUQxCU1YU19HUElPX05SKDMsIDE2KQorI2RlZmluZSBNMjhFVktfR1BJT19VU0VSTEVEMglNWFNfR1BJT19OUigzLCAxNykKKworI2RlZmluZSBNWDI4RVZLX0JMX0VOQUJMRQlNWFNfR1BJT19OUigzLCAxOCkKKyNkZWZpbmUgTTI4RVZLX0xDRF9FTkFCTEUJTVhTX0dQSU9fTlIoMywgMjgpCisKKyNkZWZpbmUgTVgyOEVWS19NTUMwX1dSSVRFX1BST1RFQ1QJTVhTX0dQSU9fTlIoMiwgMTIpCisjZGVmaW5lIE1YMjhFVktfTU1DMV9XUklURV9QUk9URUNUCU1YU19HUElPX05SKDAsIDI4KQorCitzdGF0aWMgY29uc3QgaW9tdXhfY2ZnX3QgbTI4ZXZrX3BhZHNbXSBfX2luaXRjb25zdCA9IHsKKwkvKiBkdWFydCAqLworCU1YMjhfUEFEX0FVQVJUMF9DVFNfX0RVQVJUX1JYIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0FVQVJUMF9SVFNfX0RVQVJUX1RYIHwgTVhTX1BBRF9DVFJMLAorCisJLyogYXVhcnQwICovCisJTVgyOF9QQURfQVVBUlQwX1JYX19BVUFSVDBfUlggfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfQVVBUlQwX1RYX19BVUFSVDBfVFggfCBNWFNfUEFEX0NUUkwsCisKKwkvKiBhdWFydDMgKi8KKwlNWDI4X1BBRF9BVUFSVDNfUlhfX0FVQVJUM19SWCB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9BVUFSVDNfVFhfX0FVQVJUM19UWCB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9BVUFSVDNfQ1RTX19BVUFSVDNfQ1RTIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0FVQVJUM19SVFNfX0FVQVJUM19SVFMgfCBNWFNfUEFEX0NUUkwsCisKKyNkZWZpbmUgTVhTX1BBRF9GRUMJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCkKKwkvKiBmZWMwICovCisJTVgyOF9QQURfRU5FVDBfTURDX19FTkVUMF9NREMgfCBNWFNfUEFEX0ZFQywKKwlNWDI4X1BBRF9FTkVUMF9NRElPX19FTkVUMF9NRElPIHwgTVhTX1BBRF9GRUMsCisJTVgyOF9QQURfRU5FVDBfUlhfRU5fX0VORVQwX1JYX0VOIHwgTVhTX1BBRF9GRUMsCisJTVgyOF9QQURfRU5FVDBfUlhEMF9fRU5FVDBfUlhEMCB8IE1YU19QQURfRkVDLAorCU1YMjhfUEFEX0VORVQwX1JYRDFfX0VORVQwX1JYRDEgfCBNWFNfUEFEX0ZFQywKKwlNWDI4X1BBRF9FTkVUMF9UWF9FTl9fRU5FVDBfVFhfRU4gfCBNWFNfUEFEX0ZFQywKKwlNWDI4X1BBRF9FTkVUMF9UWEQwX19FTkVUMF9UWEQwIHwgTVhTX1BBRF9GRUMsCisJTVgyOF9QQURfRU5FVDBfVFhEMV9fRU5FVDBfVFhEMSB8IE1YU19QQURfRkVDLAorCU1YMjhfUEFEX0VORVRfQ0xLX19DTEtDVFJMX0VORVQgfCBNWFNfUEFEX0ZFQywKKwkvKiBmZWMxICovCisJTVgyOF9QQURfRU5FVDBfQ1JTX19FTkVUMV9SWF9FTiB8IE1YU19QQURfRkVDLAorCU1YMjhfUEFEX0VORVQwX1JYRDJfX0VORVQxX1JYRDAgfCBNWFNfUEFEX0ZFQywKKwlNWDI4X1BBRF9FTkVUMF9SWEQzX19FTkVUMV9SWEQxIHwgTVhTX1BBRF9GRUMsCisJTVgyOF9QQURfRU5FVDBfQ09MX19FTkVUMV9UWF9FTiB8IE1YU19QQURfRkVDLAorCU1YMjhfUEFEX0VORVQwX1RYRDJfX0VORVQxX1RYRDAgfCBNWFNfUEFEX0ZFQywKKwlNWDI4X1BBRF9FTkVUMF9UWEQzX19FTkVUMV9UWEQxIHwgTVhTX1BBRF9GRUMsCisKKwkvKiBmbGV4Y2FuMCAqLworCU1YMjhfUEFEX0dQTUlfUkRZMl9fQ0FOMF9UWCwKKwlNWDI4X1BBRF9HUE1JX1JEWTNfX0NBTjBfUlgsCisKKwkvKiBmbGV4Y2FuMSAqLworCU1YMjhfUEFEX0dQTUlfQ0UyTl9fQ0FOMV9UWCwKKwlNWDI4X1BBRF9HUE1JX0NFM05fX0NBTjFfUlgsCisKKwkvKiBJMkMgKi8KKwlNWDI4X1BBRF9JMkMwX1NDTF9fSTJDMF9TQ0wsCisJTVgyOF9QQURfSTJDMF9TREFfX0kyQzBfU0RBLAorCisJLyogbXhzZmIgKGxjZGlmKSAqLworCU1YMjhfUEFEX0xDRF9EMDBfX0xDRF9EMCB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDAxX19MQ0RfRDEgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QwMl9fTENEX0QyIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMDNfX0xDRF9EMyB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDA0X19MQ0RfRDQgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QwNV9fTENEX0Q1IHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMDZfX0xDRF9ENiB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDA3X19MQ0RfRDcgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QwOF9fTENEX0Q4IHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMDlfX0xDRF9EOSB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDEwX19MQ0RfRDEwIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMTFfX0xDRF9EMTEgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QxMl9fTENEX0QxMiB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDEzX19MQ0RfRDEzIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMTRfX0xDRF9EMTQgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QxNV9fTENEX0QxNSB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDE2X19MQ0RfRDE2IHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMTdfX0xDRF9EMTcgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QxOF9fTENEX0QxOCB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDE5X19MQ0RfRDE5IHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMjBfX0xDRF9EMjAgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QyMV9fTENEX0QyMSB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDIyX19MQ0RfRDIyIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMjNfX0xDRF9EMjMgfCBNWFNfUEFEX0NUUkwsCisKKwlNWDI4X1BBRF9MQ0RfRU5BQkxFX19MQ0RfRU5BQkxFCXwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9ET1RDTEtfX0xDRF9ET1RDTEsgfCBNWFNfUEFEX0NUUkwsCisKKwkvKiBtbWMwICovCisJTVgyOF9QQURfU1NQMF9EQVRBMF9fU1NQMF9EMCB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NTUDBfREFUQTFfX1NTUDBfRDEgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9TU1AwX0RBVEEyX19TU1AwX0QyIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfU1NQMF9EQVRBM19fU1NQMF9EMyB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NTUDBfREFUQTRfX1NTUDBfRDQgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9TU1AwX0RBVEE1X19TU1AwX0Q1IHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfU1NQMF9EQVRBNl9fU1NQMF9ENiB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NTUDBfREFUQTdfX1NTUDBfRDcgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9TU1AwX0NNRF9fU1NQMF9DTUQgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9TU1AwX0RFVEVDVF9fU1NQMF9DQVJEX0RFVEVDVCB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9OT1BVTEwpLAorCU1YMjhfUEFEX1NTUDBfU0NLX19TU1AwX1NDSyB8CisJCShNWFNfUEFEXzEyTUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfTk9QVUxMKSwKKworCS8qIG1tYzEgKi8KKwlNWDI4X1BBRF9HUE1JX0QwMF9fU1NQMV9EMCB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0dQTUlfRDAxX19TU1AxX0QxIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9EMDJfX1NTUDFfRDIgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9HUE1JX0QwM19fU1NQMV9EMyB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0dQTUlfRDA0X19TU1AxX0Q0IHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9EMDVfX1NTUDFfRDUgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9HUE1JX0QwNl9fU1NQMV9ENiB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0dQTUlfRDA3X19TU1AxX0Q3IHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9SRFkxX19TU1AxX0NNRCB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0dQTUlfUkRZMF9fU1NQMV9DQVJEX0RFVEVDVCB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9OT1BVTEwpLAorCU1YMjhfUEFEX0dQTUlfV1JOX19TU1AxX1NDSyB8CisJCShNWFNfUEFEXzEyTUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfTk9QVUxMKSwKKwkvKiB3cml0ZSBwcm90ZWN0ICovCisJTVgyOF9QQURfR1BNSV9SRVNFVE5fX0dQSU9fMF8yOCB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9OT1BVTEwpLAorCS8qIHNsb3QgcG93ZXIgZW5hYmxlICovCisJTVgyOF9QQURfUFdNNF9fR1BJT18zXzI5IHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX05PUFVMTCksCisKKwkvKiBsZWQgKi8KKwlNWDI4X1BBRF9QV00wX19HUElPXzNfMTYgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfUFdNMV9fR1BJT18zXzE3IHwgTVhTX1BBRF9DVFJMLAorCisJLyogbmFuZCAqLworCU1YMjhfUEFEX0dQTUlfRDAwX19HUE1JX0QwIHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX05PUFVMTCksCisJTVgyOF9QQURfR1BNSV9EMDFfX0dQTUlfRDEgfAorCQkoTVhTX1BBRF80TUEgfCBNWFNfUEFEXzFWOCB8IE1YU19QQURfTk9QVUxMKSwKKwlNWDI4X1BBRF9HUE1JX0QwMl9fR1BNSV9EMiB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9OT1BVTEwpLAorCU1YMjhfUEFEX0dQTUlfRDAzX19HUE1JX0QzIHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX05PUFVMTCksCisJTVgyOF9QQURfR1BNSV9EMDRfX0dQTUlfRDQgfAorCQkoTVhTX1BBRF80TUEgfCBNWFNfUEFEXzFWOCB8IE1YU19QQURfTk9QVUxMKSwKKwlNWDI4X1BBRF9HUE1JX0QwNV9fR1BNSV9ENSB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9OT1BVTEwpLAorCU1YMjhfUEFEX0dQTUlfRDA2X19HUE1JX0Q2IHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX05PUFVMTCksCisJTVgyOF9QQURfR1BNSV9EMDdfX0dQTUlfRDcgfAorCQkoTVhTX1BBRF80TUEgfCBNWFNfUEFEXzFWOCB8IE1YU19QQURfTk9QVUxMKSwKKwlNWDI4X1BBRF9HUE1JX0NFME5fX0dQTUlfQ0UwTiB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9OT1BVTEwpLAorCU1YMjhfUEFEX0dQTUlfUkRZMF9fR1BNSV9SRUFEWTAgfAorCQkoTVhTX1BBRF80TUEgfCBNWFNfUEFEXzFWOCB8IE1YU19QQURfTk9QVUxMKSwKKwlNWDI4X1BBRF9HUE1JX1JETl9fR1BNSV9SRE4gfAorCQkoTVhTX1BBRF8xMk1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9XUk5fX0dQTUlfV1JOIHwKKwkJKE1YU19QQURfMTJNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0dQTUlfQUxFX19HUE1JX0FMRSB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0dQTUlfQ0xFX19HUE1JX0NMRSB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0dQTUlfUkVTRVROX19HUE1JX1JFU0VUTiB8CisJCShNWFNfUEFEXzEyTUEgfCBNWFNfUEFEXzFWOCB8IE1YU19QQURfUFVMTFVQKSwKKworCS8qIEJhY2tsaWdodCAqLworCU1YMjhfUEFEX1BXTTNfX0dQSU9fM18yOCB8IE1YU19QQURfQ1RSTCwKK307CisKKy8qIGxlZCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZCBtMjhldmtfbGVkc1tdIF9faW5pdGNvbnN0ID0geworCXsKKwkJLm5hbWUgPSAidXNlci1sZWQxIiwKKwkJLmRlZmF1bHRfdHJpZ2dlciA9ICJoZWFydGJlYXQiLAorCQkuZ3BpbyA9IE0yOEVWS19HUElPX1VTRVJMRUQxLAorCX0sCisJeworCQkubmFtZSA9ICJ1c2VyLWxlZDIiLAorCQkuZGVmYXVsdF90cmlnZ2VyID0gImhlYXJ0YmVhdCIsCisJCS5ncGlvID0gTTI4RVZLX0dQSU9fVVNFUkxFRDIsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBtMjhldmtfbGVkX2RhdGEgX19pbml0Y29uc3QgPSB7CisJLmxlZHMgPSBtMjhldmtfbGVkcywKKwkubnVtX2xlZHMgPSBBUlJBWV9TSVpFKG0yOGV2a19sZWRzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2RhdGEgbXgyOF9mZWNfcGRhdGFbXSBfX2luaXRkYXRhID0geworCXsKKwkJLyogZmVjMCAqLworCQkucGh5ID0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUksCisJfSwgeworCQkvKiBmZWMxICovCisJCS5waHkgPSBQSFlfSU5URVJGQUNFX01PREVfUk1JSSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTI4ZXZrX2ZlY19nZXRfbWFjKHZvaWQpCit7CisJaW50IGk7CisJdTMyIHZhbDsKKwljb25zdCB1MzIgKm9jb3RwID0gbXhzX2dldF9vY290cCgpOworCisJaWYgKCFvY290cCkgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0IHdoZW4gcmVhZGluZyBmZWMgbWFjIGZyb20gT0NPVFBcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qCisJICogT0NPVFAgb25seSBzdG9yZXMgdGhlIGxhc3QgNCBvY3RldHMgZm9yIGVhY2ggbWFjIGFkZHJlc3MsCisJICogc28gaGFyZC1jb2RlIERFTlggT1VJIChDMDpFNTo0RSkgaGVyZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXZhbCA9IG9jb3RwW2kgKiA0XTsKKwkJbXgyOF9mZWNfcGRhdGFbaV0ubWFjWzBdID0gMHhDMDsKKwkJbXgyOF9mZWNfcGRhdGFbaV0ubWFjWzFdID0gMHhFNTsKKwkJbXgyOF9mZWNfcGRhdGFbaV0ubWFjWzJdID0gMHg0RTsKKwkJbXgyOF9mZWNfcGRhdGFbaV0ubWFjWzNdID0gKHZhbCA+PiAxNikgJiAweGZmOworCQlteDI4X2ZlY19wZGF0YVtpXS5tYWNbNF0gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJbXgyOF9mZWNfcGRhdGFbaV0ubWFjWzVdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIG14c2ZiIChsY2RpZikgKi8KK3N0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIG0yOGV2a192aWRlb19tb2Rlc1tdID0geworCXsKKwkJLm5hbWUJCT0gIkFtcGlyZSBBTS04MDA0ODBSMlRNUVctVDAxSCIsCisJCS5yZWZyZXNoCT0gNjAsCisJCS54cmVzCQk9IDgwMCwKKwkJLnlyZXMJCT0gNDgwLAorCQkucGl4Y2xvY2sJPSAzMDA2NiwgLyogcGljb3NlY29uZCAoMzMuMjYgTUh6KSAqLworCQkubGVmdF9tYXJnaW4JPSAwLAorCQkucmlnaHRfbWFyZ2luCT0gMjU2LAorCQkudXBwZXJfbWFyZ2luCT0gMCwKKwkJLmxvd2VyX21hcmdpbgk9IDQ1LAorCQkuaHN5bmNfbGVuCT0gMSwKKwkJLnZzeW5jX2xlbgk9IDEsCisJCS5zeW5jCQk9IEZCX1NZTkNfREFUQV9FTkFCTEVfSElHSF9BQ1QsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhzZmJfcGxhdGZvcm1fZGF0YSBtMjhldmtfbXhzZmJfcGRhdGEgX19pbml0Y29uc3QgPSB7CisJLm1vZGVfbGlzdAk9IG0yOGV2a192aWRlb19tb2RlcywKKwkubW9kZV9jb3VudAk9IEFSUkFZX1NJWkUobTI4ZXZrX3ZpZGVvX21vZGVzKSwKKwkuZGVmYXVsdF9icHAJPSAxNiwKKwkubGRfaW50Zl93aWR0aAk9IFNUTUxDRElGXzE4QklULAorfTsKKworc3RhdGljIHN0cnVjdCBhdDI0X3BsYXRmb3JtX2RhdGEgbTI4ZXZrX2VlcHJvbSA9IHsKKwkuYnl0ZV9sZW4gPSAxNjM4NCwKKwkucGFnZV9zaXplID0gMzIsCisJLmZsYWdzID0gQVQyNF9GTEFHX0FERFIxNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbTI4X3N0azV2M19pMmNfYm9hcmRpbmZvW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJhdDI0IiwgMHg1MSksCS8qIEUwPTEsIEUxPTAsIEUyPTAgKi8KKwkJLnBsYXRmb3JtX2RhdGEgPSAmbTI4ZXZrX2VlcHJvbSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBteHNfbW1jX3BsYXRmb3JtX2RhdGEgbTI4ZXZrX21tY19wZGF0YVtdIF9faW5pdGRhdGEgPSB7CisJeworCQkvKiBtbWMwICovCisJCS53cF9ncGlvID0gTVgyOEVWS19NTUMwX1dSSVRFX1BST1RFQ1QsCisJCS5mbGFncyA9IFNMT1RGXzhfQklUX0NBUEFCTEUsCisJfSwgeworCQkvKiBtbWMxICovCisJCS53cF9ncGlvID0gTVgyOEVWS19NTUMxX1dSSVRFX1BST1RFQ1QsCisJCS5mbGFncyA9IFNMT1RGXzhfQklUX0NBUEFCTEUsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtMjhldmtfaW5pdCh2b2lkKQoreworCW14c19pb211eF9zZXR1cF9tdWx0aXBsZV9wYWRzKG0yOGV2a19wYWRzLCBBUlJBWV9TSVpFKG0yOGV2a19wYWRzKSk7CisKKwlteDI4X2FkZF9kdWFydCgpOworCW14MjhfYWRkX2F1YXJ0MCgpOworCW14MjhfYWRkX2F1YXJ0MygpOworCisJaWYgKCFtMjhldmtfZmVjX2dldF9tYWMoKSkgeworCQlteDI4X2FkZF9mZWMoMCwgJm14MjhfZmVjX3BkYXRhWzBdKTsKKwkJbXgyOF9hZGRfZmVjKDEsICZteDI4X2ZlY19wZGF0YVsxXSk7CisJfQorCisJbXgyOF9hZGRfZmxleGNhbigwLCBOVUxMKTsKKwlteDI4X2FkZF9mbGV4Y2FuKDEsIE5VTEwpOworCisJbXgyOF9hZGRfbXhzZmIoJm0yOGV2a19teHNmYl9wZGF0YSk7CisKKwlteDI4X2FkZF9teHNfbW1jKDAsICZtMjhldmtfbW1jX3BkYXRhWzBdKTsKKwlteDI4X2FkZF9teHNfbW1jKDEsICZtMjhldmtfbW1jX3BkYXRhWzFdKTsKKworCWdwaW9fbGVkX3JlZ2lzdGVyX2RldmljZSgwLCAmbTI4ZXZrX2xlZF9kYXRhKTsKKworCS8qIEkyQyAqLworCW14MjhfYWRkX214c19pMmMoMCk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbTI4X3N0azV2M19pMmNfYm9hcmRpbmZvLAorCQkJQVJSQVlfU0laRShtMjhfc3RrNXYzX2kyY19ib2FyZGluZm8pKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG0yOGV2a190aW1lcl9pbml0KHZvaWQpCit7CisJbXgyOF9jbG9ja3NfaW5pdCgpOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBtMjhldmtfdGltZXIgPSB7CisJLmluaXQJPSBtMjhldmtfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoTTI4RVZLLCAiREVOWCBNMjggRVZLIikKKwkubWFwX2lvCQk9IG14MjhfbWFwX2lvLAorCS5pbml0X2lycQk9IG14MjhfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IG0yOGV2a19pbml0LAorCS50aW1lcgkJPSAmbTI4ZXZrX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbXgyM2V2ay5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1teDIzZXZrLmMKaW5kZXggM2MyZGUzMy4uYzMyNWZiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1teDIzZXZrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1teDIzZXZrLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMTY3LDYgKzE2Niw3IEBACiAJCWdwaW9fc2V0X3ZhbHVlKE1YMjNFVktfQkxfRU5BQkxFLCAxKTsKIAogCW14MjNfYWRkX214c2ZiKCZteDIzZXZrX214c2ZiX3BkYXRhKTsKKwlteDIzX2FkZF9ydGNfc3RtcDN4eHgoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG14MjNldmtfdGltZXJfaW5pdCh2b2lkKQpAQCAtMTgyLDYgKzE4Miw2IEBACiAJLyogTWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gKi8KIAkubWFwX2lvCQk9IG14MjNfbWFwX2lvLAogCS5pbml0X2lycQk9IG14MjNfaW5pdF9pcnEsCi0JLmluaXRfbWFjaGluZQk9IG14MjNldmtfaW5pdCwKIAkudGltZXIJCT0gJm14MjNldmtfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IG14MjNldmtfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW14MjhldmsuYyBiL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbXgyOGV2ay5jCmluZGV4IGVhYWY2ZmYuLjA2NGVjNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbXgyOGV2ay5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbXgyOGV2ay5jCkBAIC0xNiw4ICsxNiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZml4ZWQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMTgzLDYgKzE4NSwyNCBAQAogCiAJLyogbGVkICovCiAJTVgyOF9QQURfQVVBUlQxX1RYX19HUElPXzNfNSB8IE1YU19QQURfQ1RSTCwKKworCS8qIEkyQyAqLworCU1YMjhfUEFEX0kyQzBfU0NMX19JMkMwX1NDTCB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0kyQzBfU0RBX19JMkMwX1NEQSB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCisJLyogc2FpZjAgJiBzYWlmMSAqLworCU1YMjhfUEFEX1NBSUYwX01DTEtfX1NBSUYwX01DTEsgfAorCQkoTVhTX1BBRF8xMk1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfU0FJRjBfTFJDTEtfX1NBSUYwX0xSQ0xLIHwKKwkJKE1YU19QQURfMTJNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NBSUYwX0JJVENMS19fU0FJRjBfQklUQ0xLIHwKKwkJKE1YU19QQURfMTJNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NBSUYwX1NEQVRBMF9fU0FJRjBfU0RBVEEwIHwKKwkJKE1YU19QQURfMTJNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NBSUYxX1NEQVRBMF9fU0FJRjFfU0RBVEEwIHwKKwkJKE1YU19QQURfMTJNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAogfTsKIAogLyogbGVkICovCkBAIC0zNTIsNiArMzcyLDU1IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbXhzX2kyYzBfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygic2d0bDUwMDAiLCAweDBhKSwKKwl9LAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFKSB8fCBkZWZpbmVkKENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbXgyOGV2a19hdWRpb19jb25zdW1lcl9zdXBwbGllc1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoIlZEREEiLCAiMC0wMDBhIiksCisJUkVHVUxBVE9SX1NVUFBMWSgiVkRESU8iLCAiMC0wMDBhIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbXgyOGV2a192ZGRfcmVnX2luaXRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCT0gIjNWMyIsCisJCS5hbHdheXNfb24gPSAxLAorCX0sCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gbXgyOGV2a19hdWRpb19jb25zdW1lcl9zdXBwbGllcywKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShteDI4ZXZrX2F1ZGlvX2NvbnN1bWVyX3N1cHBsaWVzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgbXgyOGV2a192ZGRfcGRhdGEgPSB7CisJLnN1cHBseV9uYW1lCT0gImJvYXJkLTNWMyIsCisJLm1pY3Jvdm9sdHMJPSAzMzAwMDAwLAorCS5ncGlvCQk9IC1FSU5WQUwsCisJLmVuYWJsZWRfYXRfYm9vdCA9IDEsCisJLmluaXRfZGF0YQk9ICZteDI4ZXZrX3ZkZF9yZWdfaW5pdF9kYXRhLAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Mjhldmtfdm9sdGFnZV9yZWd1bGF0b3IgPSB7CisJLm5hbWUJCT0gInJlZy1maXhlZC12b2x0YWdlIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZteDI4ZXZrX3ZkZF9wZGF0YSwKKwl9LAorfTsKK3N0YXRpYyB2b2lkIF9faW5pdCBteDI4ZXZrX2FkZF9yZWd1bGF0b3JzKHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZteDI4ZXZrX3ZvbHRhZ2VfcmVndWxhdG9yKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgbXgyOGV2a19hZGRfcmVndWxhdG9ycyh2b2lkKSB7fQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZ3BpbyBteDI4ZXZrX2xjZF9ncGlvc1tdID0geworCXsgTVgyOEVWS19MQ0RfRU5BQkxFLCBHUElPRl9PVVRfSU5JVF9ISUdILCAibGNkLWVuYWJsZSIgfSwKKwl7IE1YMjhFVktfQkxfRU5BQkxFLCBHUElPRl9PVVRfSU5JVF9ISUdILCAiYmwtZW5hYmxlIiB9LAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IG14MjhldmtfaW5pdCh2b2lkKQogewogCWludCByZXQ7CkBAIC0zNzgsMzIgKzQ0Nyw0MSBAQAogCQlteDI4X2FkZF9mbGV4Y2FuKDEsICZteDI4ZXZrX2ZsZXhjYW5fcGRhdGFbMV0pOwogCX0KIAotCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoTVgyOEVWS19MQ0RfRU5BQkxFLCBHUElPRl9ESVJfT1VULCAibGNkLWVuYWJsZSIpOworCXJldCA9IGdwaW9fcmVxdWVzdF9hcnJheShteDI4ZXZrX2xjZF9ncGlvcywKKwkJCQkgQVJSQVlfU0laRShteDI4ZXZrX2xjZF9ncGlvcykpOwogCWlmIChyZXQpCi0JCXByX3dhcm4oImZhaWxlZCB0byByZXF1ZXN0IGdwaW8gbGNkLWVuYWJsZTogJWRcbiIsIHJldCk7CisJCXByX3dhcm4oImZhaWxlZCB0byByZXF1ZXN0IGdwaW8gcGlucyBmb3IgbGNkOiAlZFxuIiwgcmV0KTsKIAllbHNlCi0JCWdwaW9fc2V0X3ZhbHVlKE1YMjhFVktfTENEX0VOQUJMRSwgMSk7CisJCW14MjhfYWRkX214c2ZiKCZteDI4ZXZrX214c2ZiX3BkYXRhKTsKIAotCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoTVgyOEVWS19CTF9FTkFCTEUsIEdQSU9GX0RJUl9PVVQsICJibC1lbmFibGUiKTsKLQlpZiAocmV0KQotCQlwcl93YXJuKCJmYWlsZWQgdG8gcmVxdWVzdCBncGlvIGJsLWVuYWJsZTogJWRcbiIsIHJldCk7Ci0JZWxzZQotCQlncGlvX3NldF92YWx1ZShNWDI4RVZLX0JMX0VOQUJMRSwgMSk7CisJbXgyOF9hZGRfc2FpZigwKTsKKwlteDI4X2FkZF9zYWlmKDEpOwogCi0JbXgyOF9hZGRfbXhzZmIoJm14MjhldmtfbXhzZmJfcGRhdGEpOworCW14MjhfYWRkX214c19pMmMoMCk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbXhzX2kyYzBfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKG14c19pMmMwX2JvYXJkX2luZm8pKTsKKworCW14MjhldmtfYWRkX3JlZ3VsYXRvcnMoKTsKKworCW14c19hZGRfcGxhdGZvcm1fZGV2aWNlKCJteHMtc2d0bDUwMDAiLCAwLCBOVUxMLCAwLAorCQkJTlVMTCwgMCk7CiAKIAkvKiBwb3dlciBvbiBtbWMgc2xvdCBieSB3cml0aW5nIDAgdG8gdGhlIGdwaW8gKi8KIAlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKE1YMjhFVktfTU1DMF9TTE9UX1BPV0VSLCBHUElPRl9PVVRfSU5JVF9MT1csCiAJCQkgICAgICAgIm1tYzAtc2xvdC1wb3dlciIpOwogCWlmIChyZXQpCiAJCXByX3dhcm4oImZhaWxlZCB0byByZXF1ZXN0IGdwaW8gbW1jMC1zbG90LXBvd2VyOiAlZFxuIiwgcmV0KTsKLQlteDI4X2FkZF9teHNfbW1jKDAsICZteDI4ZXZrX21tY19wZGF0YVswXSk7CisJZWxzZQorCQlteDI4X2FkZF9teHNfbW1jKDAsICZteDI4ZXZrX21tY19wZGF0YVswXSk7CiAKIAlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKE1YMjhFVktfTU1DMV9TTE9UX1BPV0VSLCBHUElPRl9PVVRfSU5JVF9MT1csCiAJCQkgICAgICAgIm1tYzEtc2xvdC1wb3dlciIpOwogCWlmIChyZXQpCiAJCXByX3dhcm4oImZhaWxlZCB0byByZXF1ZXN0IGdwaW8gbW1jMS1zbG90LXBvd2VyOiAlZFxuIiwgcmV0KTsKLQlteDI4X2FkZF9teHNfbW1jKDEsICZteDI4ZXZrX21tY19wZGF0YVsxXSk7CisJZWxzZQorCQlteDI4X2FkZF9teHNfbW1jKDEsICZteDI4ZXZrX21tY19wZGF0YVsxXSk7CisKKwlteDI4X2FkZF9ydGNfc3RtcDN4eHgoKTsKIAogCWdwaW9fbGVkX3JlZ2lzdGVyX2RldmljZSgwLCAmbXgyOGV2a19sZWRfZGF0YSk7CiB9CkBAIC00MjEsNiArNDk5LDYgQEAKIAkvKiBNYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLwogCS5tYXBfaW8JCT0gbXgyOF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gbXgyOF9pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lCT0gbXgyOGV2a19pbml0LAogCS50aW1lcgkJPSAmbXgyOGV2a190aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gbXgyOGV2a19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtc3RtcDM3OHhfZGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1zdG1wMzc4eF9kZXZiLmMKaW5kZXggN2YzOGQ4Mi4uMTc3ZTUzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1zdG1wMzc4eF9kZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1zdG1wMzc4eF9kZXZiLmMKQEAgLTE5LDcgKzE5LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtOTEsNiArOTAsNyBAQAogCiAJbXgyM19hZGRfZHVhcnQoKTsKIAlteDIzX2FkZF9hdWFydDAoKTsKKwlteDIzX2FkZF9ydGNfc3RtcDN4eHgoKTsKIAogCS8qIHBvd2VyIG9uIG1tYyBzbG90ICovCiAJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShTVE1QMzc4WF9ERVZCX01NQzBfU0xPVF9QT1dFUiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtdHgyOC5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC10eDI4LmMKaW5kZXggNTE1YTQyMy4uOWExZjBlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC10eDI4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC10eDI4LmMKQEAgLTE2MSw2ICsxNjEsNyBAQAogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIHR4Mjhfc3RrNXYzX2kyY19ib2FyZGluZm8sCiAJCQlBUlJBWV9TSVpFKHR4Mjhfc3RrNXYzX2kyY19ib2FyZGluZm8pKTsKIAlteDI4X2FkZF9teHNfbW1jKDAsICZ0eDI4X21tYzBfcGRhdGEpOworCW14MjhfYWRkX3J0Y19zdG1wM3h4eCgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgdHgyOF90aW1lcl9pbml0KHZvaWQpCkBAIC0xNzUsNiArMTc2LDYgQEAKIE1BQ0hJTkVfU1RBUlQoVFgyOCwgIkthLVJvIGVsZWN0cm9uaWNzIFRYMjggbW9kdWxlIikKIAkubWFwX2lvID0gbXgyOF9tYXBfaW8sCiAJLmluaXRfaXJxID0gbXgyOF9pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lID0gdHgyOF9zdGs1djNfaW5pdCwKIAkudGltZXIgPSAmdHgyOF90aW1lciwKKwkuaW5pdF9tYWNoaW5lID0gdHgyOF9zdGs1djNfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9tbS1teDIzLmMgYi9hcmNoL2FybS9tYWNoLW14cy9tbS1teDIzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjM0NWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvbW0tbXgyMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6Ci0gKgotICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCi0gKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKLSAqCi0gKiBDcmVhdGUgc3RhdGljIG1hcHBpbmcgYmV0d2VlbiBwaHlzaWNhbCB0byB2aXJ0dWFsIG1lbW9yeS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPG1hY2gvbXgyMy5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb211eC5oPgotCi0vKgotICogRGVmaW5lIHRoZSBNWDIzIG1lbW9yeSBtYXAuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXgyM19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQlteHNfbWFwX2VudHJ5KE1YMjMsIE9DUkFNLCBNVF9ERVZJQ0UpLAotCW14c19tYXBfZW50cnkoTVgyMywgSU8sIE1UX0RFVklDRSksCi19OwotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbWVtb3J5IG1hcC4gSXQgaXMgY2FsbGVkIGR1cmluZyB0aGUKLSAqIHN5c3RlbSBzdGFydHVwIHRvIGNyZWF0ZSBzdGF0aWMgcGh5c2ljYWwgdG8gdmlydHVhbCBtZW1vcnkgbWFwcGluZ3MKLSAqIGZvciB0aGUgSU8gbW9kdWxlcy4KLSAqLwotdm9pZCBfX2luaXQgbXgyM19tYXBfaW8odm9pZCkKLXsKLQlpb3RhYmxlX2luaXQobXgyM19pb19kZXNjLCBBUlJBWV9TSVpFKG14MjNfaW9fZGVzYykpOwotfQotCi12b2lkIF9faW5pdCBteDIzX2luaXRfaXJxKHZvaWQpCi17Ci0JaWNvbGxfaW5pdF9pcnEoKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21tLW14MjguYyBiL2FyY2gvYXJtL21hY2gtbXhzL21tLW14MjguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlMThkZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9tbS1teDI4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgtMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKLSAqCi0gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKLSAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAotICoKLSAqIENyZWF0ZSBzdGF0aWMgbWFwcGluZyBiZXR3ZWVuIHBoeXNpY2FsIHRvIHZpcnR1YWwgbWVtb3J5LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8bWFjaC9teDI4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2lvbXV4Lmg+Ci0KLS8qCi0gKiBEZWZpbmUgdGhlIE1YMjggbWVtb3J5IG1hcC4KLSAqLwotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDI4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCW14c19tYXBfZW50cnkoTVgyOCwgT0NSQU0sIE1UX0RFVklDRSksCi0JbXhzX21hcF9lbnRyeShNWDI4LCBJTywgTVRfREVWSUNFKSwKLX07Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBtZW1vcnkgbWFwLiBJdCBpcyBjYWxsZWQgZHVyaW5nIHRoZQotICogc3lzdGVtIHN0YXJ0dXAgdG8gY3JlYXRlIHN0YXRpYyBwaHlzaWNhbCB0byB2aXJ0dWFsIG1lbW9yeSBtYXBwaW5ncwotICogZm9yIHRoZSBJTyBtb2R1bGVzLgotICovCi12b2lkIF9faW5pdCBteDI4X21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChteDI4X2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgyOF9pb19kZXNjKSk7Ci19Ci0KLXZvaWQgX19pbml0IG14MjhfaW5pdF9pcnEodm9pZCkKLXsKLQlpY29sbF9pbml0X2lycSgpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvbW0uYyBiL2FyY2gvYXJtL21hY2gtbXhzL21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhZjVjZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL21tLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqCisgKiBDcmVhdGUgc3RhdGljIG1hcHBpbmcgYmV0d2VlbiBwaHlzaWNhbCB0byB2aXJ0dWFsIG1lbW9yeS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvbXgyMy5oPgorI2luY2x1ZGUgPG1hY2gvbXgyOC5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC5oPgorCisvKgorICogRGVmaW5lIHRoZSBNWDIzIG1lbW9yeSBtYXAuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXgyM19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlteHNfbWFwX2VudHJ5KE1YMjMsIE9DUkFNLCBNVF9ERVZJQ0UpLAorCW14c19tYXBfZW50cnkoTVgyMywgSU8sIE1UX0RFVklDRSksCit9OworCisvKgorICogRGVmaW5lIHRoZSBNWDI4IG1lbW9yeSBtYXAuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXgyOF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlteHNfbWFwX2VudHJ5KE1YMjgsIE9DUkFNLCBNVF9ERVZJQ0UpLAorCW14c19tYXBfZW50cnkoTVgyOCwgSU8sIE1UX0RFVklDRSksCit9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbWVtb3J5IG1hcC4gSXQgaXMgY2FsbGVkIGR1cmluZyB0aGUKKyAqIHN5c3RlbSBzdGFydHVwIHRvIGNyZWF0ZSBzdGF0aWMgcGh5c2ljYWwgdG8gdmlydHVhbCBtZW1vcnkgbWFwcGluZ3MKKyAqIGZvciB0aGUgSU8gbW9kdWxlcy4KKyAqLwordm9pZCBfX2luaXQgbXgyM19tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQobXgyM19pb19kZXNjLCBBUlJBWV9TSVpFKG14MjNfaW9fZGVzYykpOworfQorCit2b2lkIF9faW5pdCBteDIzX2luaXRfaXJxKHZvaWQpCit7CisJaWNvbGxfaW5pdF9pcnEoKTsKK30KKwordm9pZCBfX2luaXQgbXgyOF9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQobXgyOF9pb19kZXNjLCBBUlJBWV9TSVpFKG14MjhfaW9fZGVzYykpOworfQorCit2b2lkIF9faW5pdCBteDI4X2luaXRfaXJxKHZvaWQpCit7CisJaWNvbGxfaW5pdF9pcnEoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA1NmE5MTUyLi4yNDc3ODFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMyw3ICsxMyw3IEBACiAKICNpbmNsdWRlICJoYXJkd2FyZS5oIgogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbW92CVxycCwgIzB4MDAwMDBhMDAKIAkJb3JyCVxydiwgXHJwLCAjaW9fcDJ2KDB4MDAxMDAwMDApCUAgdmlydHVhbAogCQlvcnIJXHJwLCBccnAsICMweDAwMTAwMDAwCQlAIHBoeXNpY2FsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1NjE0OS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqICBhcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4sIFBlbmd1dHJvbml4Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVCBVTCgweDgwMDAwMDAwKQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L254ZGI1MDAuYyBiL2FyY2gvYXJtL21hY2gtbmV0eC9ueGRiNTAwLmMKaW5kZXggY2E4YjIwMy4uOTA5MDNkZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uZXR4L254ZGI1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvbnhkYjUwMC5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChOWERCNTAwLCAiSGlsc2NoZXIgbnhkYjUwMCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG5ldHhfbWFwX2lvLAogCS5pbml0X2lycQk9IG5ldHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZuZXR4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L254ZGtuLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgvbnhka24uYwppbmRleCBkNzc1Y2JlLi5jNjMzODRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvbnhka24uYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvbnhka24uYwpAQCAtOTMsNyArOTMsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKE5YREtOLCAiSGlsc2NoZXIgbnhka24iKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBuZXR4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBuZXR4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmbmV0eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC9ueGViNTAwaG1pLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgvbnhlYjUwMGhtaS5jCmluZGV4IGRlMzY5Y2QuLjhmNTQ4ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9ueGViNTAwaG1pLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L254ZWI1MDBobWkuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTlhFQjUwMEhNSSwgIkhpbHNjaGVyIG54ZWI1MDBobWkiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBuZXR4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBuZXR4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmbmV0eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC94Yy5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMKaW5kZXggZjAwOWI1NC4uZTRjZmI3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2JvYXJkLW5oazg4MTUuYyBiL2FyY2gvYXJtL21hY2gtbm9tYWRpay9ib2FyZC1uaGs4ODE1LmMKaW5kZXggMTM5OTMwMy4uMGNiYjc0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2JvYXJkLW5oazg4MTUuYworKysgYi9hcmNoL2FybS9tYWNoLW5vbWFkaWsvYm9hcmQtbmhrODgxNS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAorI2luY2x1ZGUgPHBsYXQvZ3Bpby1ub21hZGlrLmg+CiAjaW5jbHVkZSA8cGxhdC9tdHUuaD4KIAogI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KQEAgLTI3Niw3ICsyNzcsNyBAQAogCiBNQUNISU5FX1NUQVJUKE5PTUFESUssICJOSEs4ODE1IikKIAkvKiBNYWludGFpbmVyOiBTVCBNaWNyb0VsZWN0cm9uaWNzICovCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBjcHU4ODE1X21hcF9pbywKIAkuaW5pdF9pcnEJPSBjcHU4ODE1X2luaXRfaXJxLAogCS50aW1lcgkJPSAmbm9tYWRpa190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbm9tYWRpay9jcHUtODgxNS5jIGIvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2NwdS04ODE1LmMKaW5kZXggYWM1OGUzYi4uZGM2NzcxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2NwdS04ODE1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2NwdS04ODE1LmMKQEAgLTIxLDggKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAorI2luY2x1ZGUgPHBsYXQvZ3Bpby1ub21hZGlrLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2kyYy04ODE1bmhrLmMgYi9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaTJjLTg4MTVuaGsuYwppbmRleCBhYmZlMjVhLi4wZmMyZjZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaTJjLTg4MTVuaGsuYworKysgYi9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaTJjLTg4MTVuaGsuYwpAQCAtMyw4ICszLDggQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tbm9tYWRpay5oPgogCiAvKgogICogVGhlcmUgYXJlIHR3byBidXNzZXMgaW4gdGhlIDg4MTVOSEsuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZTcxNTFiNC4uNzM1NDE3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbm9tYWRpay9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTAsNyArMTAsNyBAQAogICoKICovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHgwMDEwMDAwMAogCQlhZGQJXHJwLCBccnAsICMweDAwMGZiMDAwCiAJCWFkZAlccnYsIFxycCwgIzB4ZjAwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbm9tYWRpay9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggN2E4MWEwNC4uZWZkZGUwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEsNiArMSw0IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfR1BJT19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfR1BJT19ICiAKLSNpbmNsdWRlIDxwbGF0L2dwaW8uaD4KLQogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzMjUyMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqICBtYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjNDBhMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotaWYgQVJDSF9OVUM5M1gKLQotY29uZmlnIENQVV9OVUM5MzIKLQlib29sCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgTlVDOTMyIG9mIE51dm90b24gTlVDOTNYIENQVXMuCi0KLW1lbnUgIk5VQzkzMiBNYWNoaW5lcyIKLQotY29uZmlnIE1BQ0hfTlVDOTMyRVZCCi0JYm9vbCAiTnV2b3RvbiBOVUM5MzIgRXZhbHVhdGlvbiBCb2FyZCIKLQlkZWZhdWx0IHkKLQlzZWxlY3QgQ1BVX05VQzkzMgotCWhlbHAKLQkgICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIE51dm90b24gTlVDOTMyRVZCCi0KLWVuZG1lbnUKLQotZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MGUyZGUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgotIwotCi0jIE9iamVjdCBmaWxlIGxpc3RzLgotCi1vYmoteQkJCQk6PSBpcnEubyB0aW1lLm8gZGV2Lm8gY3B1Lm8gY2xvY2subwotIyBOVUM5MzIgQ1BVIHN1cHBvcnQgZmlsZXMKLQotb2JqLSQoQ09ORklHX0NQVV9OVUM5MzIpCSs9IG51YzkzMi5vCi0KLSMgbWFjaGluZSBzdXBwb3J0Ci0KLW9iai0kKENPTkZJR19NQUNIX05VQzkzMkVWQikJKz0gbWFjaC1udWM5MzJldmIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L01ha2VmaWxlLmJvb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2Q0MjEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvTWFrZWZpbGUuYm9vdAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotenJlbGFkZHIteQkrPSAweDAwMDA4MDAwCi1wYXJhbXNfcGh5cy15CTo9IDB4MDAwMDAxMDAKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2Nsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjFlZmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvY2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW51YzkzeC9jbG9jay5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQotI2luY2x1ZGUgImNsb2NrLmgiCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xvY2tzX2xvY2spOwotCi1pbnQgY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja3NfbG9jaywgZmxhZ3MpOwotCWlmIChjbGstPmVuYWJsZWQrKyA9PSAwKQotCQkoY2xrLT5lbmFibGUpKGNsaywgMSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKLQotdm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCVdBUk5fT04oY2xrLT5lbmFibGVkID09IDApOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2Nrc19sb2NrLCBmbGFncyk7Ci0JaWYgKC0tY2xrLT5lbmFibGVkID09IDApCi0JCShjbGstPmVuYWJsZSkoY2xrLCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja3NfbG9jaywgZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7Ci0KLXVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gMjcwMDAwMDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19nZXRfcmF0ZSk7Ci0KLXZvaWQgbnVjOTN4X2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXVuc2lnbmVkIGludCBjbG9ja3MgPSBjbGstPmNrZW47Ci0JdW5zaWduZWQgbG9uZyBjbGtlbjsKLQotCWNsa2VuID0gX19yYXdfcmVhZGwoTlVDOTNYX1ZBX0NMS1BXUik7Ci0KLQlpZiAoZW5hYmxlKQotCQljbGtlbiB8PSBjbG9ja3M7Ci0JZWxzZQotCQljbGtlbiAmPSB+Y2xvY2tzOwotCi0JX19yYXdfd3JpdGVsKGNsa2VuLCBOVUM5M1hfVkFfQ0xLUFdSKTsKLX0KLQotdm9pZCBjbGtzX3JlZ2lzdGVyKHN0cnVjdCBjbGtfbG9va3VwICpjbGtzLCBzaXplX3QgbnVtKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotCQljbGtkZXZfYWRkKCZjbGtzW2ldKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2Nsb2NrLmggYi9hcmNoL2FybS9tYWNoLW51YzkzeC9jbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGUxZjFkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2Nsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1udWM5M3gvY2xvY2suaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KLQotdm9pZCBudWM5M3hfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOwotdm9pZCBjbGtzX3JlZ2lzdGVyKHN0cnVjdCBjbGtfbG9va3VwICpjbGtzLCBzaXplX3QgbnVtKTsKLQotc3RydWN0IGNsayB7Ci0JdW5zaWduZWQgbG9uZwkJY2tlbjsKLQl1bnNpZ25lZCBpbnQJCWVuYWJsZWQ7Ci0Jdm9pZAkJCSgqZW5hYmxlKShzdHJ1Y3QgY2xrICosIGludCBlbmFibGUpOwotfTsKLQotI2RlZmluZSBERUZJTkVfQ0xLKF9uYW1lLCBfY3RybGJpdCkJCQlcCi1zdHJ1Y3QgY2xrIGNsa18jI19uYW1lID0gewkJCQlcCi0JCS5lbmFibGUJPSBudWM5M3hfY2xrX2VuYWJsZSwJCVwKLQkJLmNrZW4JPSAoMSA8PCBfY3RybGJpdCksCQlcCi0JfQotCi0jZGVmaW5lIERFRl9DTEtMT09LKF9jbGssIF9kZXZuYW1lLCBfY29ubmFtZSkJCVwKLQl7CQkJCQkJXAotCQkuY2xrCQk9IF9jbGssCQkJXAotCQkuZGV2X2lkCQk9IF9kZXZuYW1lLAkJXAotCQkuY29uX2lkCQk9IF9jb25uYW1lLAkJXAotCX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvY3B1LmMgYi9hcmNoL2FybS9tYWNoLW51YzkzeC9jcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmZjVkOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9jcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1udWM5M3gvY3B1LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgTnV2b3RvbiBjb3Jwb3JhdGlvbi4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogTlVDOTN4IHNlcmllcyBjcHUgY29tbW9uIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1zZXJpYWwuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZWJpLmg+Ci0KLSNpbmNsdWRlICJjcHUuaCIKLSNpbmNsdWRlICJjbG9jay5oIgotCi0vKiBJbml0aWFsIElPIG1hcHBpbmdzICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbnVjOTN4X2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JSU9ERVNDX0VOVChJUlEpLAotCUlPREVTQ19FTlQoR0NSKSwKLQlJT0RFU0NfRU5UKFVBUlQpLAotCUlPREVTQ19FTlQoVElNRVIpLAotCUlPREVTQ19FTlQoRUJJKSwKLX07Ci0KLS8qIEluaXRpYWwgbnVjOTMyIGNsb2NrIGRlY2xhcmF0aW9ucy4gKi8KLXN0YXRpYyBERUZJTkVfQ0xLKGF1ZGlvLCAyKTsKLXN0YXRpYyBERUZJTkVfQ0xLKHNkLCAzKTsKLXN0YXRpYyBERUZJTkVfQ0xLKGpwZywgNCk7Ci1zdGF0aWMgREVGSU5FX0NMSyh2aWRlbywgNSk7Ci1zdGF0aWMgREVGSU5FX0NMSyh2cG9zdCwgNik7Ci1zdGF0aWMgREVGSU5FX0NMSygyZCwgNyk7Ci1zdGF0aWMgREVGSU5FX0NMSyhncHUsIDgpOwotc3RhdGljIERFRklORV9DTEsoZ2RtYSwgOSk7Ci1zdGF0aWMgREVGSU5FX0NMSyhhZGMsIDEwKTsKLXN0YXRpYyBERUZJTkVfQ0xLKHVhcnQsIDExKTsKLXN0YXRpYyBERUZJTkVfQ0xLKHNwaSwgMTIpOwotc3RhdGljIERFRklORV9DTEsocHdtLCAxMyk7Ci1zdGF0aWMgREVGSU5FX0NMSyh0aW1lciwgMTQpOwotc3RhdGljIERFRklORV9DTEsod2R0LCAxNSk7Ci1zdGF0aWMgREVGSU5FX0NMSyhhYzk3LCAxNik7Ci1zdGF0aWMgREVGSU5FX0NMSyhpMnMsIDE2KTsKLXN0YXRpYyBERUZJTkVfQ0xLKHVzYmNrLCAxNyk7Ci1zdGF0aWMgREVGSU5FX0NMSyh1c2I0OCwgMTgpOwotc3RhdGljIERFRklORV9DTEsodXNiaCwgMTkpOwotc3RhdGljIERFRklORV9DTEsoaTJjLCAyMCk7Ci1zdGF0aWMgREVGSU5FX0NMSyhleHQsIDApOwotCi1zdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbnVjOTMyX2Nsa3JlZ3NbXSA9IHsKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX2F1ZGlvLCAibnVjOTMyLWF1ZGlvIiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa19zZCwgIm51YzkzMi1zZCIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfanBnLCAibnVjOTMyLWpwZyIsICJOVUxMIiksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa192aWRlbywgIm51YzkzMi12aWRlbyIsICJOVUxMIiksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa192cG9zdCwgIm51YzkzMi12cG9zdCIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfMmQsICJudWM5MzItMmQiLCBOVUxMKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX2dwdSwgIm51YzkzMi1ncHUiLCBOVUxMKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX2dkbWEsICJudWM5MzItZ2RtYSIsICJOVUxMIiksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa19hZGMsICJudWM5MzItYWRjIiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa191YXJ0LCBOVUxMLCAidWFydCIpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfc3BpLCAibnVjOTMyLXNwaSIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfcHdtLCAibnVjOTMyLXB3bSIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfdGltZXIsIE5VTEwsICJ0aW1lciIpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfd2R0LCAibnVjOTMyLXdkdCIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfYWM5NywgIm51YzkzMi1hYzk3IiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa19pMnMsICJudWM5MzItaTJzIiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa191c2JjaywgIm51YzkzMi11c2JjayIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfdXNiNDgsICJudWM5MzItdXNiNDgiLCBOVUxMKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX3VzYmgsICJudWM5MzItdXNiaCIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfaTJjLCAibnVjOTMyLWkyYyIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfZXh0LCBOVUxMLCAiZXh0IiksCi19OwotCi0vKiBJbml0aWFsIHNlcmlhbCBwbGF0Zm9ybSBkYXRhICovCi0KLXN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBudWM5M3hfdWFydF9kYXRhW10gPSB7Ci0JTlVDOTNYXzgyNTBQT1JUKFVBUlQwKSwKLQl7fSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbnVjOTN4X3NlcmlhbF9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gbnVjOTN4X3VhcnRfZGF0YSwKLQl9LAotfTsKLQotLypJbml0IE5VQzkzeCBldmIgaW8qLwotCi12b2lkIF9faW5pdCBudWM5M3hfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgbWFjaF9zaXplKQotewotCXVuc2lnbmVkIGxvbmcgaWRjb2RlID0gMHgwOwotCi0JaW90YWJsZV9pbml0KG1hY2hfZGVzYywgbWFjaF9zaXplKTsKLQlpb3RhYmxlX2luaXQobnVjOTN4X2lvZGVzYywgQVJSQVlfU0laRShudWM5M3hfaW9kZXNjKSk7Ci0KLQlpZGNvZGUgPSBfX3Jhd19yZWFkbChOVUM5M1hQRElEKTsKLQlpZiAoaWRjb2RlID09IE5VQzkzMl9DUFVJRCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIHR5cGUgMHglMDhseCBpcyBOVUM5MTBcbiIsIGlkY29kZSk7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9FUlIgIkNQVSB0eXBlIGRldGVjdCBlcnJvciFcbiIpOwotCi19Ci0KLS8qSW5pdCBOVUM5M3ggY2xvY2sqLwotCi12b2lkIF9faW5pdCBudWM5M3hfaW5pdF9jbG9ja3Modm9pZCkKLXsKLQljbGtzX3JlZ2lzdGVyKG51YzkzMl9jbGtyZWdzLCBBUlJBWV9TSVpFKG51YzkzMl9jbGtyZWdzKSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2NwdS5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvY3B1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWYyODE5Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9jcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9jcHUuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIE5VQzkzWCBDUFUgc3VwcG9ydAotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jZGVmaW5lIElPREVTQ19FTlQoeSkJCQkJCVwKLXsJCQkJCQkJXAotCS52aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpTlVDOTNYX1ZBXyMjeSwJXAotCS5wZm4gICAgID0gX19waHlzX3RvX3BmbihOVUM5M1hfUEFfIyN5KSwJXAotCS5sZW5ndGggID0gTlVDOTNYX1NaXyMjeSwJCQlcCi0JLnR5cGUgICAgPSBNVF9ERVZJQ0UsCQkJCVwKLX0KLQotI2RlZmluZSBOVUM5M1hfODI1MFBPUlQobmFtZSkJCQkJCVwKLXsJCQkJCQkJCVwKLQkubWVtYmFzZQk9IG5hbWUjI19CQSwJCQkJXAotCS5tYXBiYXNlCT0gbmFtZSMjX1BBLAkJCQlcCi0JLmlycQkJPSBJUlFfIyNuYW1lLAkJCQlcCi0JLnVhcnRjbGsJPSA1NzEzOTIwMCwJCQkJXAotCS5yZWdzaGlmdAk9IDIsCQkJCQlcCi0JLmlvdHlwZQkJPSBVUElPX01FTSwJCQkJXAotCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCVwKLX0KLQotLypDcHUgaWRlbnRpZmllciByZWdpc3RlciovCi0KLSNkZWZpbmUgTlVDOTNYUERJRAlOVUM5M1hfVkFfR0NSCi0jZGVmaW5lIE5VQzkzMl9DUFVJRAkweDI5NTUwMDkxCi0KLS8qIGV4dGVybiBmaWxlIGZyb20gY3B1LmMgKi8KLQotZXh0ZXJuIHZvaWQgbnVjOTN4X2Nsb2NrX3NvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKnNyYyk7Ci1leHRlcm4gdm9pZCBudWM5M3hfaW5pdF9jbG9ja3Modm9pZCk7Ci1leHRlcm4gdm9pZCBudWM5M3hfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgbWFjaF9zaXplKTsKLWV4dGVybiB2b2lkIG51YzkzeF9ib2FyZF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKipkZXZpY2UsIGludCBzaXplKTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG51YzkzeF9zZXJpYWxfZGV2aWNlOwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9kZXYuYyBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2Rldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTYyYWU5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtbnVjOTN4L2Rldi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IE51dm90b24gY29ycG9yYXRpb24uCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjt2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSAiY3B1LmgiCi0KLS8qSGVyZSBzaG91bGQgYmUgeW91ciBldmIgcmVzb3Vyc2Usc3VjaCBhcyBMQ0QqLwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbnVjOTN4X3B1YmxpY19kZXZbXSBfX2luaXRkYXRhID0gewotCSZudWM5M3hfc2VyaWFsX2RldmljZSwKLX07Ci0KLS8qIFByb3ZpZGUgYWRkaW5nIHNwZWNpZmljIENQVSBwbGF0Zm9ybSBkZXZpY2VzIEFQSSAqLwotCi12b2lkIF9faW5pdCBudWM5M3hfYm9hcmRfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqZGV2aWNlLCBpbnQgc2l6ZSkKLXsKLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2UsIHNpemUpOwotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG51YzkzeF9wdWJsaWNfZGV2LCBBUlJBWV9TSVpFKG51YzkzeF9wdWJsaWNfZGV2KSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTJjYmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+Ci0KLQkubWFjcm8gIGdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgdG1wCi0JLmVuZG0KLQotCS5tYWNybyAgYXJjaF9yZXRfdG9fdXNlciwgdG1wMSwgdG1wMgotCS5lbmRtCi0KLQkubWFjcm8JZ2V0X2lycW5yX2FuZF9iYXNlLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCi0KLQkJbW92CVxiYXNlLCAjQUlDX0JBCi0KLQkJbGRyCVxpcnFuciwgWyBcYmFzZSwgI0FJQ19JUEVSXQotCQlsZHIJXGlycW5yLCBbIFxiYXNlLCAjQUlDX0lTTlJdCi0JCWNtcAlcaXJxbnIsICMwCi0KLQkuZW5kbQotCi0JLyogY3VycmVudGx5IGRvbid0IG5lZWQgYW4gZGlzYWJsZV9maXEgbWFjcm8gKi8KLQotCS5tYWNybwlkaXNhYmxlX2ZpcQotCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjVjNmZjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKLSNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9ICi0KLSNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jZW5kaWYgLyogX19BU01fQVJDSF9IQVJEV0FSRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU1MDUxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9pby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9pby5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUk1fQVJDSF9JT19ICi0jZGVmaW5lIF9fQVNNX0FSTV9BUkNIX0lPX0gKLQotI2RlZmluZSBJT19TUEFDRV9MSU1JVAkweGZmZmZmZmZmCi0KLS8qCi0gKiAxOjEgbWFwcGluZyBmb3IgaW9yZW1hcHBlZCByZWdpb25zLgotICovCi0KLSNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQotI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9pcnFzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNGFhNzEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvaXJxcy5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbi4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0lSUVNfSAotI2RlZmluZSBfX0FTTV9BUkNIX0lSUVNfSAotCi0jZGVmaW5lIE5VQzkzWF9JUlEoeCkJKHgpCi0KLS8qIE1haW4gY3B1IGludGVycnVwdHMgKi8KLQotI2RlZmluZSBJUlFfV0RUCQlOVUM5M1hfSVJRKDEpCi0jZGVmaW5lIElSUV9JUlEwCU5VQzkzWF9JUlEoMikKLSNkZWZpbmUgSVJRX0lSUTEJTlVDOTNYX0lSUSgzKQotI2RlZmluZSBJUlFfSVJRMglOVUM5M1hfSVJRKDQpCi0jZGVmaW5lIElSUV9JUlEzCU5VQzkzWF9JUlEoNSkKLSNkZWZpbmUgSVJRX1VTQkgJTlVDOTNYX0lSUSg2KQotI2RlZmluZSBJUlFfQVBVCQlOVUM5M1hfSVJRKDcpCi0jZGVmaW5lIElSUV9WUE9TVAlOVUM5M1hfSVJRKDgpCi0jZGVmaW5lIElSUV9BREMJCU5VQzkzWF9JUlEoOSkKLSNkZWZpbmUgSVJRX1VBUlQwCU5VQzkzWF9JUlEoMTApCi0jZGVmaW5lIElSUV9USU1FUjAJTlVDOTNYX0lSUSgxMSkKLSNkZWZpbmUgSVJRX0dQVTAJTlVDOTNYX0lSUSgxMikKLSNkZWZpbmUgSVJRX0dQVTEJTlVDOTNYX0lSUSgxMykKLSNkZWZpbmUgSVJRX0dQVTIJTlVDOTNYX0lSUSgxNCkKLSNkZWZpbmUgSVJRX0dQVTMJTlVDOTNYX0lSUSgxNSkKLSNkZWZpbmUgSVJRX0dQVTQJTlVDOTNYX0lSUSgxNikKLSNkZWZpbmUgSVJRX1ZJTgkJTlVDOTNYX0lSUSgxNykKLSNkZWZpbmUgSVJRX1VTQkQJTlVDOTNYX0lSUSgxOCkKLSNkZWZpbmUgSVJRX1ZSQU1MRAlOVUM5M1hfSVJRKDE5KQotI2RlZmluZSBJUlFfR0RNQTAJTlVDOTNYX0lSUSgyMCkKLSNkZWZpbmUgSVJRX0dETUExCU5VQzkzWF9JUlEoMjEpCi0jZGVmaW5lIElSUV9TRElPCU5VQzkzWF9JUlEoMjIpCi0jZGVmaW5lIElSUV9GTUkJCU5VQzkzWF9JUlEoMjIpCi0jZGVmaW5lIElSUV9KUEVHCU5VQzkzWF9JUlEoMjMpCi0jZGVmaW5lIElSUV9TUEkwCU5VQzkzWF9JUlEoMjQpCi0jZGVmaW5lIElSUV9TUEkxCU5VQzkzWF9JUlEoMjUpCi0jZGVmaW5lIElSUV9SVEMJCU5VQzkzWF9JUlEoMjYpCi0jZGVmaW5lIElSUV9QV00wCU5VQzkzWF9JUlEoMjcpCi0jZGVmaW5lIElSUV9QV00xCU5VQzkzWF9JUlEoMjgpCi0jZGVmaW5lIElSUV9QV00yCU5VQzkzWF9JUlEoMjkpCi0jZGVmaW5lIElSUV9QV00zCU5VQzkzWF9JUlEoMzApCi0jZGVmaW5lIElSUV9JMlNBQzk3CU5VQzkzWF9JUlEoMzEpCi0jZGVmaW5lIElSUV9DQVAwCUlSUV9QV00wCi0jZGVmaW5lIElSUV9DQVAxCUlSUV9QV00xCi0jZGVmaW5lIElSUV9DQVAyCUlSUV9QV00yCi0jZGVmaW5lIElSUV9DQVAzCUlSUV9QV00zCi0jZGVmaW5lIE5SX0lSUVMJCShJUlFfSTJTQUM5NyArIDEpCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX0lSUV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvbWFwLmggYi9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGI1ZTguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvbWFwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUFQX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NQVBfSAotCi0jZGVmaW5lIE1BUF9PRkZTRVQJKDB4ZmZmMDAwMDApCi0jZGVmaW5lIENMS19PRkZTRVQJKDB4MTApCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0jZGVmaW5lIE5VQzkzWF9BRERSKHgpCSgodm9pZCBfX2lvbWVtICopKDB4RjAwMDAwMDAgKyAoKHgpJih+TUFQX09GRlNFVCkpKSkKLSNlbHNlCi0jZGVmaW5lIE5VQzkzWF9BRERSKHgpCSgweEYwMDAwMDAwICsgKCh4KSYofk1BUF9PRkZTRVQpKSkKLSNlbmRpZgotCi0gLyoKLSAgKiBudWM5MzIgaGFyZHdhcmUgcmVnaXN0ZXIgZGVmaW5pdGlvbgotICAqLwotCi0jZGVmaW5lIE5VQzkzWF9QQV9JUlEJCSgweEZGRjgzMDAwKQotI2RlZmluZSBOVUM5M1hfUEFfR0NSCQkoMHhGRkYwMDAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0VCSQkJKDB4RkZGMDEwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9VQVJUCQkoMHhGRkY4MDAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX1RJTUVSCQkoMHhGRkY4MTAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0dQSU8JCSgweEZGRjg0MDAwKQotI2RlZmluZSBOVUM5M1hfUEFfR0RNQQkJKDB4RkZGMDMwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9VU0JIT1NUCSgweEZGRjBkMDAwKQotI2RlZmluZSBOVUM5M1hfUEFfSTJDCQkoMHhGRkY4OTAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0xDRAkJKDB4RkZGMDYwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9HRQkJKDB4RkZGMDUwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9BREMJCSgweEZGRjg1MDAwKQotI2RlZmluZSBOVUM5M1hfUEFfUlRDCQkoMHhGRkY4NzAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX1BXTQkJKDB4RkZGODIwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9BQ1RMCQkoMHhGRkYwYTAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX1VTQkRFVgkoMHhGRkYwQzAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0pFUEVHCQkoMHhGRkYwZTAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0NBQ0hFX1QJKDB4RkZGNjAwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9WUkFNCQkoMHhGRkYwYjAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0RNQUMJCSgweEZGRjA5MDAwKQotI2RlZmluZSBOVUM5M1hfUEFfSTJTTQkJKDB4RkZGMDgwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9DQUNIRQkJKDB4RkZGMDIwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9HUFUJCSgweEZGRjA0MDAwKQotI2RlZmluZSBOVUM5M1hfUEFfVklERU9JTgkoMHhGRkYwNzAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX1NQSTAJCSgweEZGRjg2MDAwKQotI2RlZmluZSBOVUM5M1hfUEFfU1BJMQkJKDB4RkZGODgwMDApCi0KLSAvKgotICAqIG51YzkzMiB2aXJ0dWFsIGFkZHJlc3MgbWFwcGluZy4KLSAgKiBpbnRlcnJ1cHQgY29udHJvbGxlciBpcyB0aGUgZmlyc3QgdGhpbmcgd2UgcHV0IGluLCB0byBtYWtlCi0gICogdGhlIGFzc2VtYmx5IGNvZGUgZm9yIHRoZSBpcnEgZGV0ZWN0aW9uIGVhc2llcgotICAqLwotCi0jZGVmaW5lIE5VQzkzWF9WQV9JUlEJCU5VQzkzWF9BRERSKDB4MDAwMDAwMDApCi0jZGVmaW5lIE5VQzkzWF9TWl9JUlEJCVNaXzRLCi0KLSNkZWZpbmUgTlVDOTNYX1ZBX0dDUgkJTlVDOTNYX0FERFIoTlVDOTNYX1BBX0lSUSkKLSNkZWZpbmUgTlVDOTNYX1ZBX0NMS1BXUgkoTlVDOTNYX1ZBX0dDUitDTEtfT0ZGU0VUKQotI2RlZmluZSBOVUM5M1hfU1pfR0NSCQlTWl80SwotCi0vKiBFQkkgbWFuYWdlbWVudCAqLwotCi0jZGVmaW5lIE5VQzkzWF9WQV9FQkkJCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9FQkkpCi0jZGVmaW5lIE5VQzkzWF9TWl9FQkkJCVNaXzRLCi0KLS8qIFVBUlRzICovCi0KLSNkZWZpbmUgTlVDOTNYX1ZBX1VBUlQJCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9VQVJUKQotI2RlZmluZSBOVUM5M1hfU1pfVUFSVAkJU1pfNEsKLQotLyogVGltZXJzICovCi0KLSNkZWZpbmUgTlVDOTNYX1ZBX1RJTUVSCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9USU1FUikKLSNkZWZpbmUgTlVDOTNYX1NaX1RJTUVSCVNaXzRLCi0KLS8qIEdQSU8gcG9ydHMgKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfR1BJTwkJTlVDOTNYX0FERFIoTlVDOTNYX1BBX0dQSU8pCi0jZGVmaW5lIE5VQzkzWF9TWl9HUElPCQlTWl80SwotCi0vKiBHRE1BIGNvbnRyb2wgKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfR0RNQQkJTlVDOTNYX0FERFIoTlVDOTNYX1BBX0dETUEpCi0jZGVmaW5lIE5VQzkzWF9TWl9HRE1BCQlTWl80SwotCi0vKiBJMkMgaGFyZHdhcmUgY29udHJvbGxlciAqLwotCi0jZGVmaW5lIE5VQzkzWF9WQV9JMkMJCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9JMkMpCi0jZGVmaW5lIE5VQzkzWF9TWl9JMkMJCVNaXzRLCi0KLS8qIExDRCBjb250cm9sbGVyKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfTENECQlOVUM5M1hfQUREUihOVUM5M1hfUEFfTENEKQotI2RlZmluZSBOVUM5M1hfU1pfTENECQlTWl80SwotCi0vKiAyRCBjb250cm9sbGVyKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfR0UJCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9HRSkKLSNkZWZpbmUgTlVDOTNYX1NaX0dFCQlTWl80SwotCi0vKiBBREMgKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfQURDCQlOVUM5M1hfQUREUihOVUM5M1hfUEFfQURDKQotI2RlZmluZSBOVUM5M1hfU1pfQURDCQlTWl80SwotCi0vKiBSVEMgKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfUlRDCQlOVUM5M1hfQUREUihOVUM5M1hfUEFfUlRDKQotI2RlZmluZSBOVUM5M1hfU1pfUlRDCQlTWl80SwotCi0vKiBQdWxzZSBXaWR0aCBNb2R1bGF0aW9uKFBXTSkgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgTlVDOTNYX1ZBX1BXTQkJTlVDOTNYX0FERFIoTlVDOTNYX1BBX1BXTSkKLSNkZWZpbmUgTlVDOTNYX1NaX1BXTQkJU1pfNEsKLQotLyogQXVkaW8gQ29udHJvbGxlciBjb250cm9sbGVyICovCi0KLSNkZWZpbmUgTlVDOTNYX1ZBX0FDVEwJCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9BQ1RMKQotI2RlZmluZSBOVUM5M1hfU1pfQUNUTAkJU1pfNEsKLQotLyogVVNCIERldmljZSBwb3J0ICovCi0KLSNkZWZpbmUgTlVDOTNYX1ZBX1VTQkRFVglOVUM5M1hfQUREUihOVUM5M1hfUEFfVVNCREVWKQotI2RlZmluZSBOVUM5M1hfU1pfVVNCREVWCVNaXzRLCi0KLS8qIFVTQiBob3N0IGNvbnRyb2xsZXIqLwotI2RlZmluZSBOVUM5M1hfVkFfVVNCSE9TVAlOVUM5M1hfQUREUihOVUM5M1hfUEFfVVNCSE9TVCkKLSNkZWZpbmUgTlVDOTNYX1NaX1VTQkhPU1QJU1pfNEsKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5ODY0Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjI5NTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbi4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfQ0xPQ0tfSAotI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfQ0xPQ0tfSAotCi0vKiBDbG9jayBDb250cm9sIFJlZ2lzdGVycyAgKi8KLSNkZWZpbmUgQ0xLX0JBCQlOVUM5M1hfVkFfQ0xLUFdSCi0jZGVmaW5lIFJFR19DTEtFTgkoQ0xLX0JBICsgMHgwMCkKLSNkZWZpbmUgUkVHX0NMS1NFTAkoQ0xLX0JBICsgMHgwNCkKLSNkZWZpbmUgUkVHX0NMS0RJVgkoQ0xLX0JBICsgMHgwOCkKLSNkZWZpbmUgUkVHX1BMTENPTjAJKENMS19CQSArIDB4MEMpCi0jZGVmaW5lIFJFR19QTExDT04xCShDTEtfQkEgKyAweDEwKQotI2RlZmluZSBSRUdfUE1DT04JKENMS19CQSArIDB4MTQpCi0jZGVmaW5lIFJFR19JUlFXQUtFQ09OCShDTEtfQkEgKyAweDE4KQotI2RlZmluZSBSRUdfSVJRV0FLRUZMQUcJKENMS19CQSArIDB4MUMpCi0jZGVmaW5lIFJFR19JUFNSU1QJKENMS19CQSArIDB4MjApCi0jZGVmaW5lIFJFR19DTEtFTjEJKENMS19CQSArIDB4MjQpCi0jZGVmaW5lIFJFR19DTEtESVYxCShDTEtfQkEgKyAweDI4KQotCi0vKiBEZWZpbmUgUExMIGZyZXEgc2V0dGluZyAqLwotI2RlZmluZSBQTExfRElTQUJMRQkJMHgxMkI2MwotI2RlZmluZQlQTExfNjZNSFoJCTB4MkI2MwotI2RlZmluZQlQTExfMTAwTUhaCQkweDRGNjQKLSNkZWZpbmUgUExMXzEyME1IWgkJMHg0RjYzCi0jZGVmaW5lCVBMTF8xNjZNSFoJCTB4NDEyNAotI2RlZmluZQlQTExfMjAwTUhaCQkweDRGMjQKLQotLyogRGVmaW5lIEFIQjpDUFVGUkVRIHJhdGlvICovCi0jZGVmaW5lCUFIQl9DUFVDTEtfMV8xCQkweDAwCi0jZGVmaW5lCUFIQl9DUFVDTEtfMV8yCQkweDAxCi0jZGVmaW5lCUFIQl9DUFVDTEtfMV80CQkweDAyCi0jZGVmaW5lCUFIQl9DUFVDTEtfMV84CQkweDAzCi0KLS8qIERlZmluZSBBUEI6QUhCIHJhdGlvICovCi0jZGVmaW5lIEFQQl9BSEJfMV8yCQkweDAxCi0jZGVmaW5lIEFQQl9BSEJfMV80CQkweDAyCi0jZGVmaW5lIEFQQl9BSEJfMV84CQkweDAzCi0KLS8qIERlZmluZSBjbG9jayBza2V3ICovCi0jZGVmaW5lIERFRkFVTFRTS0VXCQkweDQ4Ci0KLSNlbmRpZiAvKiAgX19BU01fQVJDSF9SRUdTX0NMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLWViaS5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtZWJpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzI1NTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtZWJpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtZWJpLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19FQklfSAotI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfRUJJX0gKLQotLyogRUJJIENvbnRyb2wgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgRUJJX0JBCQlOVUM5M1hfVkFfRUJJCi0jZGVmaW5lIFJFR19FQklDT04JKEVCSV9CQSArIDB4MDApCi0jZGVmaW5lIFJFR19ST01DT04JKEVCSV9CQSArIDB4MDQpCi0jZGVmaW5lIFJFR19TRENPTkYwCShFQklfQkEgKyAweDA4KQotI2RlZmluZSBSRUdfU0RDT05GMQkoRUJJX0JBICsgMHgwQykKLSNkZWZpbmUgUkVHX1NEVElNRTAJKEVCSV9CQSArIDB4MTApCi0jZGVmaW5lIFJFR19TRFRJTUUxCShFQklfQkEgKyAweDE0KQotI2RlZmluZSBSRUdfRVhUMENPTgkoRUJJX0JBICsgMHgxOCkKLSNkZWZpbmUgUkVHX0VYVDFDT04JKEVCSV9CQSArIDB4MUMpCi0jZGVmaW5lIFJFR19FWFQyQ09OCShFQklfQkEgKyAweDIwKQotI2RlZmluZSBSRUdfRVhUM0NPTgkoRUJJX0JBICsgMHgyNCkKLSNkZWZpbmUgUkVHX0VYVDRDT04JKEVCSV9CQSArIDB4MjgpCi0jZGVmaW5lIFJFR19DS1NLRVcJKEVCSV9CQSArIDB4MkMpCi0KLSNlbmRpZiAvKiAgX19BU01fQVJDSF9SRUdTX0VCSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1pcnEuaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzAyMTU5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX19BU01fQVJDSF9SRUdTX0lSUV9ICi0jZGVmaW5lIF9fX0FTTV9BUkNIX1JFR1NfSVJRX0gKLQotLyogQWR2YW5jZSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoQUlDKSBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBBSUNfQkEgICAgCQlOVUM5M1hfVkFfSVJRCi0KLSNkZWZpbmUgUkVHX0FJQ19JUlFTQwkJKEFJQ19CQSsweDgwKQotI2RlZmluZSBSRUdfQUlDX0dFTgkJKEFJQ19CQSsweDg0KQotI2RlZmluZSBSRUdfQUlDX0dBU1IJCShBSUNfQkErMHg4OCkKLSNkZWZpbmUgUkVHX0FJQ19HU0NSCQkoQUlDX0JBKzB4OEMpCi0jZGVmaW5lIFJFR19BSUNfSVJTUgkJKEFJQ19CQSsweDEwMCkKLSNkZWZpbmUgUkVHX0FJQ19JQVNSCQkoQUlDX0JBKzB4MTA0KQotI2RlZmluZSBSRUdfQUlDX0lTUgkJKEFJQ19CQSsweDEwOCkKLSNkZWZpbmUgUkVHX0FJQ19JUEVSCQkoQUlDX0JBKzB4MTBDKQotI2RlZmluZSBSRUdfQUlDX0lTTlIJCShBSUNfQkErMHgxMTApCi0jZGVmaW5lIFJFR19BSUNfSU1SCQkoQUlDX0JBKzB4MTE0KQotI2RlZmluZSBSRUdfQUlDX09JU1IJCShBSUNfQkErMHgxMTgpCi0jZGVmaW5lIFJFR19BSUNfTUVDUgkJKEFJQ19CQSsweDEyMCkKLSNkZWZpbmUgUkVHX0FJQ19NRENSCQkoQUlDX0JBKzB4MTI0KQotI2RlZmluZSBSRUdfQUlDX1NTQ1IJCShBSUNfQkErMHgxMjgpCi0jZGVmaW5lIFJFR19BSUNfU0NDUgkJKEFJQ19CQSsweDEyQykKLSNkZWZpbmUgUkVHX0FJQ19FT1NDUgkJKEFJQ19CQSsweDEzMCkKLSNkZWZpbmUgQUlDX0lQRVIJCSgweDEwQykKLSNkZWZpbmUgQUlDX0lTTlIJCSgweDExMCkKLQotI2VuZGlmIC8qIF9fX0FTTV9BUkNIX1JFR1NfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLXNlcmlhbC5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3Mtc2VyaWFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2N2EwNDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3Mtc2VyaWFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3Mtc2VyaWFsLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSTV9SRUdTX1NFUklBTF9ICi0jZGVmaW5lIF9fQVNNX0FSTV9SRUdTX1NFUklBTF9ICi0KLSNkZWZpbmUgVUFSVDBfQkEJTlVDOTNYX1ZBX1VBUlQKLSNkZWZpbmUgVUFSVDFfQkEJKE5VQzkzWF9WQV9VQVJUKzB4MTAwKQotCi0jZGVmaW5lIFVBUlQwX1BBCU5VQzkzWF9QQV9VQVJUCi0jZGVmaW5lIFVBUlQxX1BBCShOVUM5M1hfUEFfVUFSVCsweDEwMCkKLQotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi1zdHJ1Y3QgbnVjOTN4X3VhcnRfY2xrc3JjIHsKLQljb25zdCBjaGFyCSpuYW1lOwotCXVuc2lnbmVkIGludAlkaXZpc29yOwotCXVuc2lnbmVkIGludAltaW5fYmF1ZDsKLQl1bnNpZ25lZCBpbnQJbWF4X2JhdWQ7Ci19OwotCi1zdHJ1Y3QgbnVjOTN4X3VhcnRjZmcgewotCXVuc2lnbmVkIGNoYXIJaHdwb3J0OwotCXVuc2lnbmVkIGNoYXIJdW51c2VkOwotCXVuc2lnbmVkIHNob3J0CWZsYWdzOwotCXVuc2lnbmVkIGxvbmcJdWFydF9mbGFnczsKLQotCXVuc2lnbmVkIGxvbmcJdWNvbjsKLQl1bnNpZ25lZCBsb25nCXVsY29uOwotCXVuc2lnbmVkIGxvbmcJdWZjb247Ci0KLQlzdHJ1Y3QgbnVjOTN4X3VhcnRfY2xrc3JjICpjbG9ja3M7Ci0JdW5zaWduZWQgaW50CWNsb2Nrc19zaXplOwotfTsKLQotI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwotCi0jZW5kaWYgLyogX19BU01fQVJNX1JFR1NfU0VSSUFMX0ggKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtdGltZXIuaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLXRpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NGJlOTYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtdGltZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy10aW1lci5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfVElNRVJfSAotI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfVElNRVJfSAotCi0vKiBUaW1lciBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBUTVJfQkEJCQlOVUM5M1hfVkFfVElNRVIKLSNkZWZpbmUgUkVHX1RDU1IwCQkoVE1SX0JBKzB4MDApCi0jZGVmaW5lIFJFR19USUNSMAkJKFRNUl9CQSsweDA4KQotI2RlZmluZSBSRUdfVERSMAkJKFRNUl9CQSsweDEwKQotI2RlZmluZSBSRUdfVElTUgkJKFRNUl9CQSsweDE4KQotI2RlZmluZSBSRUdfV1RDUgkJKFRNUl9CQSsweDFDKQotCi0jZW5kaWYgLyogIF9fQVNNX0FSQ0hfUkVHU19USU1FUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmJkOWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2hudWM5M3gvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KLQotc3RhdGljIHZvaWQgYXJjaF9pZGxlKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGFyY2hfcmVzZXQoY2hhciBtb2RlLCBjb25zdCBjaGFyICpjbWQpCi17Ci0JY3B1X3Jlc2V0KDApOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvdGltZXguaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC90aW1leC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzcxOWNjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC90aW1leC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC90aW1leC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC90aW1leC5oCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1RJTUVYX0gKLSNkZWZpbmUgX19BU01fQVJDSF9USU1FWF9ICi0KLS8qIENMT0NLX1RJQ0tfUkFURSBOb3csIEkgZG9uJ3QgdXNlIGl0LiAqLwotCi0jZGVmaW5lIENMT0NLX1RJQ0tfUkFURSAyNzAwMDAwMAotCi0jZW5kaWYgLyogX19BU01fQVJDSF9USU1FWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxY2I5Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9VTkNPTVBSRVNTX0gKLSNkZWZpbmUgX19BU01fQVJDSF9VTkNPTVBSRVNTX0gKLQotLyogRGVmaW5lcyBmb3IgVUFSVCByZWdpc3RlcnMgKi8KLQotI2luY2x1ZGUgPG1hY2gvcmVncy1zZXJpYWwuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLQotI2RlZmluZSBhcmNoX2RlY29tcF93ZG9nKCkKLQotI2RlZmluZSBUWF9ET05FCShVQVJUX0xTUl9URU1UIHwgVUFSVF9MU1JfVEhSRSkKLXN0YXRpYyB1MzIgKiBjb25zdCB1YXJ0X2Jhc2UgPSAodTMyICopVUFSVDBfUEE7Ci0KLXN0YXRpYyB2b2lkIHB1dGMoaW50IGNoKQotewotCS8qIENoZWNrIFRIUkUgYW5kIFRFTVQgYml0cyBiZWZvcmUgd2UgdHJhbnNtaXQgdGhlIGNoYXJhY3Rlci4KLQkgKi8KLQl3aGlsZSAoKHVhcnRfYmFzZVtVQVJUX0xTUl0gJiBUWF9ET05FKSAhPSBUWF9ET05FKQotCQliYXJyaWVyKCk7Ci0KLQkqdWFydF9iYXNlID0gY2g7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaCh2b2lkKQotewotfQotCi1zdGF0aWMgdm9pZCBhcmNoX2RlY29tcF9zZXR1cCh2b2lkKQotewotfQotCi0jZW5kaWYvKiBfX0FTTV9OVUM5M1hfVU5DT01QUkVTU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxMWE1Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9WTUFMTE9DX0gKLSNkZWZpbmUgX19BU01fQVJDSF9WTUFMTE9DX0gKLQotI2RlZmluZSBWTUFMTE9DX0VORAkgIDB4RTAwMDAwMDBVTAotCi0jZW5kaWYgLyogX19BU01fQVJDSF9WTUFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2lycS5jIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjc5ZjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1udWM5M3gvaXJxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWlycS5oPgotCi1zdGF0aWMgdm9pZCBudWM5M3hfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCV9fcmF3X3dyaXRlbCgxIDw8IGQtPmlycSwgUkVHX0FJQ19NRENSKTsKLX0KLQotLyoKLSAqIEJ5IHRoZSB3OTBwOTEwIHNwZWMsYW55IGlycSxvbmx5IHdyaXRlIDEKLSAqIHRvIFJFR19BSUNfRU9TQ1IgZm9yIEFDSwotICovCi0KLXN0YXRpYyB2b2lkIG51YzkzeF9pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlfX3Jhd193cml0ZWwoMHgwMSwgUkVHX0FJQ19FT1NDUik7Ci19Ci0KLXN0YXRpYyB2b2lkIG51YzkzeF9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlfX3Jhd193cml0ZWwoMSA8PCBkLT5pcnEsIFJFR19BSUNfTUVDUik7Ci0KLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBudWM5M3hfaXJxX2NoaXAgPSB7Ci0JLmlycV9hY2sJPSBudWM5M3hfaXJxX2FjaywKLQkuaXJxX21hc2sJPSBudWM5M3hfaXJxX21hc2ssCi0JLmlycV91bm1hc2sJPSBudWM5M3hfaXJxX3VubWFzaywKLX07Ci0KLXZvaWQgX19pbml0IG51YzkzeF9pbml0X2lycSh2b2lkKQotewotCWludCBpcnFubzsKLQotCV9fcmF3X3dyaXRlbCgweEZGRkZGRkZFLCBSRUdfQUlDX01EQ1IpOwotCi0JZm9yIChpcnFubyA9IElSUV9XRFQ7IGlycW5vIDw9IE5SX0lSUVM7IGlycW5vKyspIHsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycW5vLCAmbnVjOTN4X2lycV9jaGlwLAotCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7Ci0JCXNldF9pcnFfZmxhZ3MoaXJxbm8sIElSUUZfVkFMSUQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L21hY2gtbnVjOTMyZXZiLmMgYi9hcmNoL2FybS9tYWNoLW51YzkzeC9tYWNoLW51YzkzMmV2Yi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzAyNTcwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L21hY2gtbnVjOTMyZXZiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTEwZXZiLmMKLSAqCi0gKiBCYXNlZCBvbiBtYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jIGJ5IEpvbmFzIERpZXRzY2hlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbi4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlICJudWM5MzIuaCIKLQotc3RhdGljIHZvaWQgX19pbml0IG51YzkzMmV2Yl9tYXBfaW8odm9pZCkKLXsKLQludWM5MzJfbWFwX2lvKCk7Ci0JbnVjOTMyX2luaXRfY2xvY2tzKCk7Ci0JbnVjOTMyX2luaXRfdWFydGNsaygpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbnVjOTMyZXZiX2luaXQodm9pZCkKLXsKLQludWM5MzJfYm9hcmRfaW5pdCgpOwotfQotCi1NQUNISU5FX1NUQVJUKE5VQzkzMkVWQiwgIk5VQzkzMkVWQiIpCi0JLyogTWFpbnRhaW5lcjogV2FuIFpvbmdTaHVuICovCi0JLmJvb3RfcGFyYW1zCT0gMCwKLQkubWFwX2lvCQk9IG51YzkzMmV2Yl9tYXBfaW8sCi0JLmluaXRfaXJxCT0gbnVjOTN4X2luaXRfaXJxLAotCS5pbml0X21hY2hpbmUJPSBudWM5MzJldmJfaW5pdCwKLQkudGltZXIJCT0gJm51YzkzeF90aW1lciwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9udWM5MzIuYyBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L251YzkzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTY2ZWFkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L251YzkzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtbnVjOTN4L251YzkzMi5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE51dm90b24gY29ycG9yYXRpb24uCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIE5VQzkzMiBjcHUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjt2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQotI2luY2x1ZGUgImNwdS5oIgotI2luY2x1ZGUgImNsb2NrLmgiCi0KLS8qIGRlZmluZSBzcGVjaWZpYyBDUFUgcGxhdGZvcm0gZGV2aWNlICovCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpudWM5MzJfZGV2W10gX19pbml0ZGF0YSA9IHsKLX07Ci0KLS8qIGRlZmluZSBzcGVjaWZpYyBDUFUgcGxhdGZvcm0gaW8gbWFwICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbnVjOTMyZXZiX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci19OwotCi0vKkluaXQgTlVDOTMyIGV2YiBpbyovCi0KLXZvaWQgX19pbml0IG51YzkzMl9tYXBfaW8odm9pZCkKLXsKLQludWM5M3hfbWFwX2lvKG51YzkzMmV2Yl9pb2Rlc2MsIEFSUkFZX1NJWkUobnVjOTMyZXZiX2lvZGVzYykpOwotfQotCi0vKkluaXQgTlVDOTMyIGNsb2NrKi8KLQotdm9pZCBfX2luaXQgbnVjOTMyX2luaXRfY2xvY2tzKHZvaWQpCi17Ci0JbnVjOTN4X2luaXRfY2xvY2tzKCk7Ci19Ci0KLS8qZW5hYmxlIE5VQzkzMiB1YXJ0IGNsb2NrKi8KLQotdm9pZCBfX2luaXQgbnVjOTMyX2luaXRfdWFydGNsayh2b2lkKQotewotCXN0cnVjdCBjbGsgKmNrX3VhcnQgPSBjbGtfZ2V0KE5VTEwsICJ1YXJ0Iik7Ci0JQlVHX09OKElTX0VSUihja191YXJ0KSk7Ci0KLQljbGtfZW5hYmxlKGNrX3VhcnQpOwotfQotCi0vKkluaXQgTlVDOTMyIGJvYXJkIGluZm8qLwotCi12b2lkIF9faW5pdCBudWM5MzJfYm9hcmRfaW5pdCh2b2lkKQotewotCW51YzkzeF9ib2FyZF9pbml0KG51YzkzMl9kZXYsIEFSUkFZX1NJWkUobnVjOTMyX2RldikpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvbnVjOTMyLmggYi9hcmNoL2FybS9tYWNoLW51YzkzeC9udWM5MzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2NmVkZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9udWM5MzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9udWM5MzIuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBOdXZvdG9uIGNvcnBvcmF0aW9uCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIE5VQzkzeCBDUFUgc3VwcG9ydAotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi1zdHJ1Y3QgbWFwX2Rlc2M7Ci1zdHJ1Y3Qgc3lzX3RpbWVyOwotCi0vKiBjb3JlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyAqLwotCi1leHRlcm4gdm9pZCBudWM5M3hfaW5pdF9pcnEodm9pZCk7Ci1leHRlcm4gc3RydWN0IHN5c190aW1lciBudWM5M3hfdGltZXI7Ci0KLS8qIGV4dGVybiBmaWxlIGZyb20gbnVjOTMyLmMgKi8KLQotZXh0ZXJuIHZvaWQgbnVjOTMyX2JvYXJkX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBudWM5MzJfaW5pdF9jbG9ja3Modm9pZCk7Ci1leHRlcm4gdm9pZCBudWM5MzJfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgbnVjOTMyX2luaXRfdWFydGNsayh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L3RpbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4MDdjMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC90aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtbnVjOTN4L3RpbWUuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24uCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy10aW1lci5oPgotCi0jZGVmaW5lIFJFU0VUSU5UCTB4MDEKLSNkZWZpbmUgUEVSSU9ECQkoMHgwMSA8PCAyNykKLSNkZWZpbmUgT05FU0hPVAkJKDB4MDAgPDwgMjcpCi0jZGVmaW5lIENPVU5URU4JCSgweDAxIDw8IDMwKQotI2RlZmluZSBJTlRFTgkJKDB4MDEgPDwgMjkpCi0KLSNkZWZpbmUgVElDS1NfUEVSX1NFQwkxMDAKLSNkZWZpbmUgUFJFU0NBTEUJMHg2MyAvKiBEaXZpZGVyID0gcHJlc2NhbGUgKyAxICovCi0KLXVuc2lnbmVkIGludCB0aW1lcjBfbG9hZDsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbnVjOTN4X2dldHRpbWVvZmZzZXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLypJUlEgaGFuZGxlciBmb3IgdGhlIHRpbWVyKi8KLQotc3RhdGljIGlycXJldHVybl90IG51YzkzeF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXRpbWVyX3RpY2soKTsKLQlfX3Jhd193cml0ZWwoMHgwMSwgUkVHX1RJU1IpOyAvKiBjbGVhciBUSUYwICovCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBudWM5M3hfdGltZXJfaXJxID0gewotCS5uYW1lCQk9ICJudWM5M3ggVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAotCS5oYW5kbGVyCT0gbnVjOTN4X3RpbWVyX2ludGVycnVwdCwKLX07Ci0KLS8qU2V0IHVwIHRpbWVyIHJlZy4qLwotCi1zdGF0aWMgdm9pZCBudWM5M3hfdGltZXJfc2V0dXAodm9pZCkKLXsKLQlzdHJ1Y3QgY2xrICpja19leHQgPSBjbGtfZ2V0KE5VTEwsICJleHQiKTsKLQlzdHJ1Y3QgY2xrICpja190aW1lciA9IGNsa19nZXQoTlVMTCwgInRpbWVyIik7Ci0JdW5zaWduZWQgaW50IHJhdGUsIHZhbCA9IDA7Ci0KLQlCVUdfT04oSVNfRVJSKGNrX2V4dCkgfHwgSVNfRVJSKGNrX3RpbWVyKSk7Ci0KLQljbGtfZW5hYmxlKGNrX3RpbWVyKTsKLQlyYXRlID0gY2xrX2dldF9yYXRlKGNrX2V4dCk7Ci0JY2xrX3B1dChja19leHQpOwotCXJhdGUgPSByYXRlIC8gKFBSRVNDQUxFICsgMHgwMSk7Ci0KLQkgLyogc2V0IGEga25vd24gc3RhdGUgKi8KLQlfX3Jhd193cml0ZWwoMHgwMCwgUkVHX1RDU1IwKTsKLQlfX3Jhd193cml0ZWwoUkVTRVRJTlQsIFJFR19USVNSKTsKLQotCXRpbWVyMF9sb2FkID0gKHJhdGUgLyBUSUNLU19QRVJfU0VDKTsKLQlfX3Jhd193cml0ZWwodGltZXIwX2xvYWQsIFJFR19USUNSMCk7Ci0KLQl2YWwgfD0gKFBFUklPRCB8IENPVU5URU4gfCBJTlRFTiB8IFBSRVNDQUxFKTsKLQlfX3Jhd193cml0ZWwodmFsLCBSRUdfVENTUjApOwotCi19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBudWM5M3hfdGltZXJfaW5pdCh2b2lkKQotewotCW51YzkzeF90aW1lcl9zZXR1cCgpOwotCXNldHVwX2lycShJUlFfVElNRVIwLCAmbnVjOTN4X3RpbWVyX2lycSk7Ci19Ci0KLXN0cnVjdCBzeXNfdGltZXIgbnVjOTN4X3RpbWVyID0gewotCS5pbml0CQk9IG51YzkzeF90aW1lcl9pbml0LAotCS5vZmZzZXQJCT0gbnVjOTN4X2dldHRpbWVvZmZzZXQsCi0JLnJlc3VtZQkJPSBudWM5M3hfdGltZXJfc2V0dXAKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQppbmRleCA1YjExNGQxLi4xMWM4NWNkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiAjIENvbW1vbiBzdXBwb3J0CiBvYmoteSA6PSBpby5vIGlkLm8gc3JhbS5vIHRpbWUubyBpcnEubyBtdXgubyBmbGFzaC5vIHNlcmlhbC5vIGRldmljZXMubyBkbWEubwotb2JqLXkgKz0gY2xvY2subyBjbG9ja19kYXRhLm8gb3BwX2RhdGEubyByZXNldC5vIHBtX2J1cy5vCitvYmoteSArPSBjbG9jay5vIGNsb2NrX2RhdGEubyBvcHBfZGF0YS5vIHJlc2V0Lm8gcG1fYnVzLm8gdGltZXIubwogCiBvYmotJChDT05GSUdfT01BUF9NQ0JTUCkgKz0gbWNic3AubwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1hbXMtZGVsdGEuYwppbmRleCAzMTJlYTZiLi41MWJhZTMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMKQEAgLTExLDcgKzExLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgogCkBAIC0zMCw3ICszMSw2IEBACiAKICNpbmNsdWRlIDxwbGF0L2lvLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC1hbXMtZGVsdGEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KQEAgLTEzNSwxMiArMTM1LDYgQEAKIAkqKHZvbGF0aWxlIF9fdTE2ICopIEFNU19ERUxUQV9MQVRDSDJfVklSVCA9IGFtc19kZWx0YV9sYXRjaDJfcmVnOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgYW1zX2RlbHRhX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwMV9pbml0X2lycSgpOwotfQotCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGFtc19kZWx0YV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAkvKiBBTVNfREVMVEFfTEFUQ0gxICovCiAJewpAQCAtMzc5LDE3ICszNzMsMTMgQEAKIH0KIGFyY2hfaW5pdGNhbGwoYW1zX2RlbHRhX21vZGVtX2luaXQpOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgYW1zX2RlbHRhX21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChBTVNfREVMVEEsICJBbXN0cmFkIEUzIChEZWx0YSkiKQogCS8qIE1haW50YWluZXI6IEpvbmF0aGFuIE1jRG93ZWxsIDxub29kbGVzQGVhcnRoLmxpPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCi0JLm1hcF9pbwkJPSBhbXNfZGVsdGFfbWFwX2lvLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5tYXBfaW8JCT0gb21hcDE1eHhfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBhbXNfZGVsdGFfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGFtc19kZWx0YV9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1mc2FtcGxlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWZzYW1wbGUuYwppbmRleCBhNmIxYmVhLi4yMzE3ODI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWZzYW1wbGUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWZzYW1wbGUuYwpAQCAtMTAsNyArMTAsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8cGxhdC90Yy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC9mbGFzaC5oPgogI2luY2x1ZGUgPHBsYXQvZnBnYS5oPgpAQCAtMjk3LDYzICsyOTYsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9mc2FtcGxlX2luaXQodm9pZCkKIHsKLQlmc2FtcGxlX2luaXRfc21jOTF4KCk7Ci0KLQlpZiAoZ3Bpb19yZXF1ZXN0KEZTQU1QTEVfTkFORF9SQl9HUElPX1BJTiwgIk5BTkQgcmVhZHkiKSA8IDApCi0JCUJVRygpOwotCWdwaW9fZGlyZWN0aW9uX2lucHV0KEZTQU1QTEVfTkFORF9SQl9HUElPX1BJTik7Ci0KLQlvbWFwX2NmZ19yZWcoTDNfMTYxMF9GTEFTSF9DUzJCX09FKTsKLQlvbWFwX2NmZ19yZWcoTThfMTYxMF9GTEFTSF9DUzJCX1dFKTsKLQotCS8qIE11eCBwaW5zIGZvciBrZXlwYWQgKi8KLQlvbWFwX2NmZ19yZWcoRTJfN1hYX0tCUjApOwotCW9tYXBfY2ZnX3JlZyhKN183WFhfS0JSMSk7Ci0Jb21hcF9jZmdfcmVnKEUxXzdYWF9LQlIyKTsKLQlvbWFwX2NmZ19yZWcoRjNfN1hYX0tCUjMpOwotCW9tYXBfY2ZnX3JlZyhEMl83WFhfS0JSNCk7Ci0Jb21hcF9jZmdfcmVnKEMyXzdYWF9LQkMwKTsKLQlvbWFwX2NmZ19yZWcoRDNfN1hYX0tCQzEpOwotCW9tYXBfY2ZnX3JlZyhFNF83WFhfS0JDMik7Ci0Jb21hcF9jZmdfcmVnKEY0XzdYWF9LQkMzKTsKLQlvbWFwX2NmZ19yZWcoRTNfN1hYX0tCQzQpOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Ci0KLQlvbWFwX2JvYXJkX2NvbmZpZyA9IGZzYW1wbGVfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGZzYW1wbGVfY29uZmlnKTsKLQlvbWFwX3NlcmlhbF9pbml0KCk7Ci0Jb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDEwMCwgTlVMTCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2ZzYW1wbGVfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KLS8qIE9ubHkgRlBHQSBuZWVkcyB0byBiZSBtYXBwZWQgaGVyZS4gQWxsIG90aGVycyBhcmUgZG9uZSB3aXRoIGlvcmVtYXAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcF9mc2FtcGxlX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBIMlAyX0RCR19GUEdBX0JBU0UsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihIMlAyX0RCR19GUEdBX1NUQVJUKSwKLQkJLmxlbmd0aAkJPSBIMlAyX0RCR19GUEdBX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0sCi0JewotCQkudmlydHVhbAk9IEZTQU1QTEVfQ1BMRF9CQVNFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRlNBTVBMRV9DUExEX1NUQVJUKSwKLQkJLmxlbmd0aAkJPSBGU0FNUExFX0NQTERfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFCi0JfQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZnNhbXBsZV9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci0JaW90YWJsZV9pbml0KG9tYXBfZnNhbXBsZV9pb19kZXNjLAotCQkgICAgIEFSUkFZX1NJWkUob21hcF9mc2FtcGxlX2lvX2Rlc2MpKTsKLQogCS8qIEVhcmx5LCBib2FyZC1kZXBlbmRlbnQgaW5pdCAqLwogCiAJLyoKQEAgLTM4NCwxNSArMzI2LDY4IEBACiAJICogQ29uZmlndXJlIE1QVV9FWFRfTklSUSBJTyBpbiBJT19DT05GOSByZWdpc3RlciwKIAkgKiBJdCBpcyB1c2VkIGFzIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyIGludGVycnVwdAogCSAqLwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoT01BUDdYWF9JT19DT05GXzkpICYgMHgxRkZGRkZGRiwgT01BUDdYWF9JT19DT05GXzkpOworCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoT01BUDdYWF9JT19DT05GXzkpICYgMHgxRkZGRkZGRiwKKwkJCU9NQVA3WFhfSU9fQ09ORl85KTsKKworCWZzYW1wbGVfaW5pdF9zbWM5MXgoKTsKKworCWlmIChncGlvX3JlcXVlc3QoRlNBTVBMRV9OQU5EX1JCX0dQSU9fUElOLCAiTkFORCByZWFkeSIpIDwgMCkKKwkJQlVHKCk7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoRlNBTVBMRV9OQU5EX1JCX0dQSU9fUElOKTsKKworCW9tYXBfY2ZnX3JlZyhMM18xNjEwX0ZMQVNIX0NTMkJfT0UpOworCW9tYXBfY2ZnX3JlZyhNOF8xNjEwX0ZMQVNIX0NTMkJfV0UpOworCisJLyogTXV4IHBpbnMgZm9yIGtleXBhZCAqLworCW9tYXBfY2ZnX3JlZyhFMl83WFhfS0JSMCk7CisJb21hcF9jZmdfcmVnKEo3XzdYWF9LQlIxKTsKKwlvbWFwX2NmZ19yZWcoRTFfN1hYX0tCUjIpOworCW9tYXBfY2ZnX3JlZyhGM183WFhfS0JSMyk7CisJb21hcF9jZmdfcmVnKEQyXzdYWF9LQlI0KTsKKwlvbWFwX2NmZ19yZWcoQzJfN1hYX0tCQzApOworCW9tYXBfY2ZnX3JlZyhEM183WFhfS0JDMSk7CisJb21hcF9jZmdfcmVnKEU0XzdYWF9LQkMyKTsKKwlvbWFwX2NmZ19yZWcoRjRfN1hYX0tCQzMpOworCW9tYXBfY2ZnX3JlZyhFM183WFhfS0JDNCk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKKworCW9tYXBfYm9hcmRfY29uZmlnID0gZnNhbXBsZV9jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoZnNhbXBsZV9jb25maWcpOworCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMSwgMTAwLCBOVUxMLCAwKTsKK30KKworLyogT25seSBGUEdBIG5lZWRzIHRvIGJlIG1hcHBlZCBoZXJlLiBBbGwgb3RoZXJzIGFyZSBkb25lIHdpdGggaW9yZW1hcCAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwX2ZzYW1wbGVfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkudmlydHVhbAk9IEgyUDJfREJHX0ZQR0FfQkFTRSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEgyUDJfREJHX0ZQR0FfU1RBUlQpLAorCQkubGVuZ3RoCQk9IEgyUDJfREJHX0ZQR0FfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwKKwl7CisJCS52aXJ0dWFsCT0gRlNBTVBMRV9DUExEX0JBU0UsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihGU0FNUExFX0NQTERfU1RBUlQpLAorCQkubGVuZ3RoCQk9IEZTQU1QTEVfQ1BMRF9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9mc2FtcGxlX21hcF9pbyh2b2lkKQoreworCW9tYXAxNXh4X21hcF9pbygpOworCWlvdGFibGVfaW5pdChvbWFwX2ZzYW1wbGVfaW9fZGVzYywKKwkJICAgICBBUlJBWV9TSVpFKG9tYXBfZnNhbXBsZV9pb19kZXNjKSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9GU0FNUExFLCAiT01BUDczMCBGLVNhbXBsZSIpCiAvKiBNYWludGFpbmVyOiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gb21hcF9mc2FtcGxlX21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAxX2luaXRfZWFybHksCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLmluaXRfaXJxCT0gb21hcF9mc2FtcGxlX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX2ZzYW1wbGVfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMKaW5kZXggMDRmYzM1Ni4uZGM1Yjc1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIyLDE4ICsyMiwxMSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0X2lycSh2b2lkKQotewotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLQogLyogYXNzdW1lIG5vIE1pbmktQUIgcG9ydCAqLwogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKQEAgLTg3LDE3ICs4MCwxMyBAQAogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygxLCAxMDAsIE5VTEwsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9nZW5lcmljX21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChPTUFQX0dFTkVSSUMsICJHZW5lcmljIE9NQVAxNTEwLzE2MTAvMTcxMCIpCiAJLyogTWFpbnRhaW5lcjogVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAotCS5tYXBfaW8JCT0gb21hcF9nZW5lcmljX21hcF9pbywKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IG9tYXAxNnh4X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAxX2luaXRfZWFybHksCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLmluaXRfaXJxCT0gb21hcF9nZW5lcmljX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX2dlbmVyaWNfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDItbW1jLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLW1tYy5jCmluZGV4IGYyZmM0M2QuLmRhMGUzN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDItbW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi1tbWMuYwpAQCAtMTEsMTMgKzExLDEyIEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2kyYy90cHM2NTAxMC5oPgogCiAjaW5jbHVkZSA8cGxhdC9tbWMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2luY2x1ZGUgImJvYXJkLWgyLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYwppbmRleCBjYjdmYjFhLi5iMzM0YjE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTM3MywxMiArMzcyLDYgQEAKIAl9LAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGgyX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwMV9pbml0X2lycSgpOwotfQotCiBzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBoMl91c2JfY29uZmlnIF9faW5pdGRhdGEgPSB7CiAJLyogdXNiMSBoYXMgYSBNaW5pLUFCIHBvcnQgYW5kIGV4dGVybmFsIGlzcDEzMDEgdHJhbnNjZWl2ZXIgKi8KIAkub3RnCQk9IDIsCkBAIC00NTQsMTcgKzQ0NywxMyBAQAogCWgyX21tY19pbml0KCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBoMl9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoT01BUF9IMiwgIlRJLUgyIikKIAkvKiBNYWludGFpbmVyOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKLQkubWFwX2lvCQk9IGgyX21hcF9pbywKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IG9tYXAxNnh4X21hcF9pbywKKwkuaW5pdF9lYXJseSAgICAgPSBvbWFwMV9pbml0X2Vhcmx5LAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5pbml0X2lycQk9IGgyX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBoMl9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy1tbWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMtbW1jLmMKaW5kZXggMjA5ODUyNS4uZjgyNDJhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy1tbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLW1tYy5jCkBAIC0xMSwxMyArMTEsMTIgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8bGludXgvaTJjL3RwczY1MDEwLmg+CiAKICNpbmNsdWRlIDxwbGF0L21tYy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiYm9hcmQtaDMuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCmluZGV4IDMxZjM0ODcuLjc0ZWJlNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtNDM2LDIzICs0MzUsMTMgQEAKIAloM19tbWNfaW5pdCgpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaDNfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBoM19tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoT01BUF9IMywgIlRJIE9NQVAxNzEwIEgzIGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAqLwotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCi0JLm1hcF9pbwkJPSBoM19tYXBfaW8sCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLm1hcF9pbwkJPSBvbWFwMTZ4eF9tYXBfaW8sCisJLmluaXRfZWFybHkgICAgID0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBoM19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwMV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gaDNfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaHRjaGVyYWxkLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWh0Y2hlcmFsZC5jCmluZGV4IDM2ZTA2ZWEuLjNlOTFiYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaHRjaGVyYWxkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1odGNoZXJhbGQuYwpAQCAtMjMsNyArMjMsNiBAQAogICogMDIxMTAtMTMwMSwgVVNBLgogICoKICAqLwotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtNTAwLDcgKzQ5OSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBodGNoZXJhbGRfbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcDFfbWFwX2NvbW1vbl9pbygpOworCW9tYXA3eHhfbWFwX2lvKCk7CiAKIAkvKgogCSAqIFRoZSBMQ0QgcGFuZWwgbXVzdCBiZSBkaXNhYmxlZCBhbmQgRE1BIHR1cm5lZCBvZmYgaGVyZSwgYXMgZG9pbmcKQEAgLTYwMSwyMCArNjAwLDE0IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGh0Y2hlcmFsZF9pbml0X2lycSh2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gImh0Y2hlcmFsZF9pbml0X2lycS5cbiIpOwotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLQogTUFDSElORV9TVEFSVChIRVJBTEQsICJIVEMgSGVyYWxkIikKIAkvKiBNYWludGFpbmVyOiBDb3J5IE1hY2NhcnJvbmUgPGRhcmtzdGFyNjI2MkBnbWFpbC5jb20+ICovCiAJLyogTWFpbnRhaW5lcjogd2luZy1saW51eC5zb3VyY2Vmb3JnZS5uZXQgKi8KLQkuYm9vdF9wYXJhbXMgICAgPSAweDEwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IGh0Y2hlcmFsZF9tYXBfaW8sCisJLmluaXRfZWFybHkgICAgID0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEgICAgICAgPSBodGNoZXJhbGRfaW5pdF9pcnEsCisJLmluaXRfaXJxICAgICAgID0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZSAgID0gaHRjaGVyYWxkX2luaXQsCiAJLnRpbWVyICAgICAgICAgID0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCmluZGV4IDBiMWJhNDYuLjI3MzE1M2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwpAQCAtMTUsNyArMTUsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC9mbGFzaC5oPgogI2luY2x1ZGUgPHBsYXQvZnBnYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvdGMuaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHBsYXQva2V5cGFkLmg+CkBAIC0yODksMTIgKzI4OCw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5ub3ZhdG9yX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwMV9pbml0X2lycSgpOwotfQotCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKIHN0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGlubm92YXRvcjE1MTBfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewogCS8qIGZvciBidW5kbGVkIG5vbi1zdGFuZGFyZCBob3N0IGFuZCBwZXJpcGhlcmFsIGNhYmxlcyAqLwpAQCAtNDM5LDMwICs0MzIsMzIgQEAKIAlpbm5vdmF0b3JfbW1jX2luaXQoKTsKIH0KIAorLyoKKyAqIFJFVklTSVQ6IEFzc3VtZSAxNXh4IGZvciBub3csIHdlIGRvbid0IHdhbnQgdG8gZG8gcmV2aXNpb24gY2hlY2sKKyAqIHVudGlsIGxhdGVyIG9uLiBUaGUgcmlnaHQgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHNldCB1cCBhIGRpZmZlcmVudAorICogbWFjaGluZV9pZCBmb3IgMTZ4eCBJbm5vdmF0b3IsIG9yIHVzZSBkZXZpY2UgdHJlZS4KKyAqLwogc3RhdGljIHZvaWQgX19pbml0IGlubm92YXRvcl9tYXBfaW8odm9pZCkKIHsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7CisJb21hcDE1eHhfbWFwX2lvKCk7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWAotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQlpb3RhYmxlX2luaXQoaW5ub3ZhdG9yMTUxMF9pb19kZXNjLCBBUlJBWV9TSVpFKGlubm92YXRvcjE1MTBfaW9fZGVzYykpOwotCQl1ZGVsYXkoMTApOwkvKiBEZWxheSBuZWVkZWQgZm9yIEZQR0EgKi8KKwlpb3RhYmxlX2luaXQoaW5ub3ZhdG9yMTUxMF9pb19kZXNjLCBBUlJBWV9TSVpFKGlubm92YXRvcjE1MTBfaW9fZGVzYykpOworCXVkZWxheSgxMCk7CS8qIERlbGF5IG5lZWRlZCBmb3IgRlBHQSAqLwogCi0JCS8qIER1bXAgdGhlIElubm92YXRvciBGUEdBIHJldiBlYXJseSAtIHVzZWZ1bCBpbmZvIGZvciBzdXBwb3J0LiAqLwotCQlwcmludGsoIklubm92YXRvciBGUEdBIFJldiAlZC4lZCBCb2FyZCBSZXYgJWRcbiIsCi0JCSAgICAgICBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SRVZfSElHSCksCi0JCSAgICAgICBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SRVZfTE9XKSwKLQkJICAgICAgIGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX0JPQVJEX1JFVikpOwotCX0KLSNlbmRpZgorCS8qIER1bXAgdGhlIElubm92YXRvciBGUEdBIHJldiBlYXJseSAtIHVzZWZ1bCBpbmZvIGZvciBzdXBwb3J0LiAqLworCXByX2RlYnVnKCJJbm5vdmF0b3IgRlBHQSBSZXYgJWQuJWQgQm9hcmQgUmV2ICVkXG4iLAorCQkJZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfUkVWX0hJR0gpLAorCQkJZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfUkVWX0xPVyksCisJCQlmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9CT0FSRF9SRVYpKTsKIH0KIAogTUFDSElORV9TVEFSVChPTUFQX0lOTk9WQVRPUiwgIlRJLUlubm92YXRvciIpCiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLwotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBpbm5vdmF0b3JfbWFwX2lvLAorCS5pbml0X2Vhcmx5ICAgICA9IG9tYXAxX2luaXRfZWFybHksCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLmluaXRfaXJxCT0gaW5ub3ZhdG9yX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBpbm5vdmF0b3JfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYwppbmRleCA1NDY5Y2UyLi42Nzk4Yjg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jCkBAIC03LDcgKzcsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KQEAgLTM5LDIxICszOCw2IEBACiAKICNkZWZpbmUgQURTNzg0Nl9QRU5ET1dOX0dQSU8JMTUKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfbm9raWE3NzBfaW5pdF9pcnEodm9pZCkKLXsKLQkvKiBPbiBOb2tpYSA3NzAsIHRoZSBTbGVlcFggc2lnbmFsIGlzIG1hc2tlZCB3aXRoIGFuCi0JICogTVBVSU8gbGluZSBieSBkZWZhdWx0LiAgSXQgaGFzIHRvIGJlIHVubWFza2VkIGZvciBpdAotCSAqIHRvIGJlY29tZSBmdW5jdGlvbmFsICovCi0KLQkvKiBTbGVlcFggbWFzayBkaXJlY3Rpb24gKi8KLQlvbWFwX3dyaXRldygob21hcF9yZWFkdygweGZmZmI1MDA4KSAmIH4yKSwgMHhmZmZiNTAwOCk7Ci0JLyogVW5tYXNrIFNsZWVwWCBzaWduYWwgKi8KLQlvbWFwX3dyaXRldygob21hcF9yZWFkdygweGZmZmI1MDA0KSAmIH4yKSwgMHhmZmZiNTAwNCk7Ci0KLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbm9raWE3NzBfa2V5bWFwW10gPSB7CiAJS0VZKDEsIDAsIEdST1VQXzAgfCBLRVlfVVApLAogCUtFWSgyLCAwLCBHUk9VUF8xIHwgS0VZX0Y1KSwKQEAgLTI0Niw2ICsyMzAsMTUgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfbm9raWE3NzBfaW5pdCh2b2lkKQogeworCS8qIE9uIE5va2lhIDc3MCwgdGhlIFNsZWVwWCBzaWduYWwgaXMgbWFza2VkIHdpdGggYW4KKwkgKiBNUFVJTyBsaW5lIGJ5IGRlZmF1bHQuICBJdCBoYXMgdG8gYmUgdW5tYXNrZWQgZm9yIGl0CisJICogdG8gYmVjb21lIGZ1bmN0aW9uYWwgKi8KKworCS8qIFNsZWVwWCBtYXNrIGRpcmVjdGlvbiAqLworCW9tYXBfd3JpdGV3KChvbWFwX3JlYWR3KDB4ZmZmYjUwMDgpICYgfjIpLCAweGZmZmI1MDA4KTsKKwkvKiBVbm1hc2sgU2xlZXBYIHNpZ25hbCAqLworCW9tYXBfd3JpdGV3KChvbWFwX3JlYWR3KDB4ZmZmYjUwMDQpICYgfjIpLCAweGZmZmI1MDA0KTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG5va2lhNzcwX2RldmljZXMsIEFSUkFZX1NJWkUobm9raWE3NzBfZGV2aWNlcykpOwogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKG5va2lhNzcwX3NwaV9ib2FyZF9pbmZvLAogCQkJCUFSUkFZX1NJWkUobm9raWE3NzBfc3BpX2JvYXJkX2luZm8pKTsKQEAgLTI1OCwxNiArMjUxLDEyIEBACiAJbm9raWE3NzBfbW1jX2luaXQoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfbm9raWE3NzBfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDFfbWFwX2NvbW1vbl9pbygpOwotfQotCiBNQUNISU5FX1NUQVJUKE5PS0lBNzcwLCAiTm9raWEgNzcwIikKLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAotCS5tYXBfaW8JCT0gb21hcF9ub2tpYTc3MF9tYXBfaW8sCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLm1hcF9pbwkJPSBvbWFwMTZ4eF9tYXBfaW8sCisJLmluaXRfZWFybHkgICAgID0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBvbWFwX25va2lhNzcwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX25va2lhNzcwX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwppbmRleCBiMDhhMjEzLi5jMzg1OTI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKQEAgLTI1LDcgKzI1LDcgQEAKICAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAogICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC00Miw3ICs0Miw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjL3RwczY1MDEwLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMjc5LDEyICsyNzgsNiBAQAogCWlycV9zZXRfaXJxX3R5cGUoZ3Bpb190b19pcnEoNjIpLCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb3NrX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwMV9pbml0X2lycSgpOwotfQotCiBzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBvc2tfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewogCS8qIGhhcyB1c2IgaG9zdCBjb25uZWN0b3IgKEEpIC4uLiBmb3IgZGV2ZWxvcG1lbnQgaXQgY2FuIGFsc28KIAkgKiBiZSB1c2VkLCB3aXRoIGEgTk9OU1RBTkRBUkQgZ2VuZGVyLWJlbmRpbmcgY2FibGUvZG9uZ2xlLCBhcwpAQCAtNTc2LDE3ICs1NjksMTMgQEAKIAlvc2tfbWlzdHJhbF9pbml0KCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvc2tfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDFfbWFwX2NvbW1vbl9pbygpOwotfQotCiBNQUNISU5FX1NUQVJUKE9NQVBfT1NLLCAiVEktT1NLIikKIAkvKiBNYWludGFpbmVyOiBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAotCS5tYXBfaW8JCT0gb3NrX21hcF9pbywKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IG9tYXAxNnh4X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAxX2luaXRfZWFybHksCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLmluaXRfaXJxCT0gb3NrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvc2tfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXRlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jCmluZGV4IDQ1OWNiNmIuLmY5YzQ0Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXRlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYwpAQCAtMTYsNyArMTYsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9mbGFzaC5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KQEAgLTU5LDEyICs1OCw2IEBACiAjZGVmaW5lIFBBTE1URV9NTUMyX0dQSU8JT01BUF9NUFVJTyg3KQogI2RlZmluZSBQQUxNVEVfTU1DM19HUElPCU9NQVBfTVBVSU8oMTEpCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3BhbG10ZV9pbml0X2lycSh2b2lkKQotewotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwYWxtdGVfa2V5bWFwW10gPSB7CiAJS0VZKDAsIDAsIEtFWV9GMSksCQkvKiBDYWxlbmRhciAqLwogCUtFWSgxLCAwLCBLRVlfRjIpLAkJLyogQ29udGFjdHMgKi8KQEAgLTI2OSwxNiArMjYyLDEyIEBACiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDEwMCwgTlVMTCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3BhbG10ZV9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoT01BUF9QQUxNVEUsICJPTUFQMzEwIGJhc2VkIFBhbG0gVHVuZ3N0ZW4gRSIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKLQkubWFwX2lvCQk9IG9tYXBfcGFsbXRlX21hcF9pbywKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IG9tYXAxNXh4X21hcF9pbywKKwkuaW5pdF9lYXJseSAgICAgPSBvbWFwMV9pbml0X2Vhcmx5LAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5pbml0X2lycQk9IG9tYXBfcGFsbXRlX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3BhbG10ZV9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdHQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXR0LmMKaW5kZXggYjIxNGY0NS4uMTFhOTg1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdHQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10dC5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTMwLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPHBsYXQvbGVkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9mbGFzaC5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KQEAgLTI2MywxMiArMjYzLDYgQEAKIAl9CiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wYWxtdHRfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIHBhbG10dF91c2JfY29uZmlnIF9faW5pdGRhdGEgPSB7CiAJLnJlZ2lzdGVyX2Rldgk9IDEsCiAJLmhtY19tb2RlCT0gMCwKQEAgLTMxNSwxNiArMzA5LDEyIEBACiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDEwMCwgTlVMTCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3BhbG10dF9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoT01BUF9QQUxNVFQsICJPTUFQMTUxMCBiYXNlZCBQYWxtIFR1bmdzdGVufFQiKQotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCi0JLm1hcF9pbwkJPSBvbWFwX3BhbG10dF9tYXBfaW8sCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLm1hcF9pbwkJPSBvbWFwMTV4eF9tYXBfaW8sCisJLmluaXRfZWFybHkgICAgID0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBvbWFwX3BhbG10dF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwMV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9wYWxtdHRfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXo3MS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtejcxLmMKaW5kZXggOWIwZWE0OC4uNDIwNjE1NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtejcxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtejcxLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMzIsNyArMzMsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvZmxhc2guaD4KICNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CkBAIC00Miw3ICs0Miw2IEBACiAjaW5jbHVkZSA8cGxhdC9pcmRhLmg+CiAjaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgotI2luY2x1ZGUgPHBsYXQvb21hcC1hbHNhLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KQEAgLTU3LDEzICs1Niw2IEBACiAjZGVmaW5lIFBBTE1aNzFfU0xJREVSX0dQSU8JT01BUF9NUFVJTygzKQogI2RlZmluZSBQQUxNWjcxX01NQ19JTl9HUElPCU9NQVBfTVBVSU8oNCkKIAotc3RhdGljIHZvaWQgX19pbml0Ci1vbWFwX3BhbG16NzFfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGFsbXo3MV9rZXltYXBbXSA9IHsKIAlLRVkoMCwgMCwgS0VZX0YxKSwKIAlLRVkoMSwgMCwgS0VZX0YyKSwKQEAgLTMzNCwxNyArMzI2LDEyIEBACiAJcGFsbXo3MV9ncGlvX3NldHVwKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQKLW9tYXBfcGFsbXo3MV9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoT01BUF9QQUxNWjcxLCAiT01BUDMxMCBiYXNlZCBQYWxtIFppcmU3MSIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKLQkubWFwX2lvCQk9IG9tYXBfcGFsbXo3MV9tYXBfaW8sCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLm1hcF9pbwkJPSBvbWFwMTV4eF9tYXBfaW8sCisJLmluaXRfZWFybHkgICAgID0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBvbWFwX3BhbG16NzFfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfcGFsbXo3MV9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCmluZGV4IDY3YWNkNDEuLjIwM2FlMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPHBsYXQvdGMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvZnBnYS5oPgogI2luY2x1ZGUgPHBsYXQvZmxhc2guaD4KQEAgLTI2NSw1NiArMjY0LDYgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGVyc2V1czJfaW5pdCh2b2lkKQogewotCXBlcnNldXMyX2luaXRfc21jOTF4KCk7Ci0KLQlpZiAoZ3Bpb19yZXF1ZXN0KFAyX05BTkRfUkJfR1BJT19QSU4sICJOQU5EIHJlYWR5IikgPCAwKQotCQlCVUcoKTsKLQlncGlvX2RpcmVjdGlvbl9pbnB1dChQMl9OQU5EX1JCX0dQSU9fUElOKTsKLQotCW9tYXBfY2ZnX3JlZyhMM18xNjEwX0ZMQVNIX0NTMkJfT0UpOwotCW9tYXBfY2ZnX3JlZyhNOF8xNjEwX0ZMQVNIX0NTMkJfV0UpOwotCi0JLyogTXV4IHBpbnMgZm9yIGtleXBhZCAqLwotCW9tYXBfY2ZnX3JlZyhFMl83WFhfS0JSMCk7Ci0Jb21hcF9jZmdfcmVnKEo3XzdYWF9LQlIxKTsKLQlvbWFwX2NmZ19yZWcoRTFfN1hYX0tCUjIpOwotCW9tYXBfY2ZnX3JlZyhGM183WFhfS0JSMyk7Ci0Jb21hcF9jZmdfcmVnKEQyXzdYWF9LQlI0KTsKLQlvbWFwX2NmZ19yZWcoQzJfN1hYX0tCQzApOwotCW9tYXBfY2ZnX3JlZyhEM183WFhfS0JDMSk7Ci0Jb21hcF9jZmdfcmVnKEU0XzdYWF9LQkMyKTsKLQlvbWFwX2NmZ19yZWcoRjRfN1hYX0tCQzMpOwotCW9tYXBfY2ZnX3JlZyhFM183WFhfS0JDNCk7Ci0KLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKLQotCW9tYXBfYm9hcmRfY29uZmlnID0gcGVyc2V1czJfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHBlcnNldXMyX2NvbmZpZyk7Ci0Jb21hcF9zZXJpYWxfaW5pdCgpOwotCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygxLCAxMDAsIE5VTEwsIDApOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wZXJzZXVzMl9pbml0X2lycSh2b2lkKQotewotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLS8qIE9ubHkgRlBHQSBuZWVkcyB0byBiZSBtYXBwZWQgaGVyZS4gQWxsIG90aGVycyBhcmUgZG9uZSB3aXRoIGlvcmVtYXAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcF9wZXJzZXVzMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gSDJQMl9EQkdfRlBHQV9CQVNFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oSDJQMl9EQkdfRlBHQV9TVEFSVCksCi0JCS5sZW5ndGgJCT0gSDJQMl9EQkdfRlBHQV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UKLQl9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wZXJzZXVzMl9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci0JaW90YWJsZV9pbml0KG9tYXBfcGVyc2V1czJfaW9fZGVzYywKLQkJICAgICBBUlJBWV9TSVpFKG9tYXBfcGVyc2V1czJfaW9fZGVzYykpOwotCiAJLyogRWFybHksIGJvYXJkLWRlcGVuZGVudCBpbml0ICovCiAKIAkvKgpAQCAtMzQ1LDE1ICsyOTQsNjIgQEAKIAkgKiBDb25maWd1cmUgTVBVX0VYVF9OSVJRIElPIGluIElPX0NPTkY5IHJlZ2lzdGVyLAogCSAqIEl0IGlzIHVzZWQgYXMgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIgaW50ZXJydXB0CiAJICovCi0Jb21hcF93cml0ZWwob21hcF9yZWFkbChPTUFQN1hYX0lPX0NPTkZfOSkgJiAweDFGRkZGRkZGLCBPTUFQN1hYX0lPX0NPTkZfOSk7CisJb21hcF93cml0ZWwob21hcF9yZWFkbChPTUFQN1hYX0lPX0NPTkZfOSkgJiAweDFGRkZGRkZGLAorCQkJCU9NQVA3WFhfSU9fQ09ORl85KTsKKworCXBlcnNldXMyX2luaXRfc21jOTF4KCk7CisKKwlpZiAoZ3Bpb19yZXF1ZXN0KFAyX05BTkRfUkJfR1BJT19QSU4sICJOQU5EIHJlYWR5IikgPCAwKQorCQlCVUcoKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChQMl9OQU5EX1JCX0dQSU9fUElOKTsKKworCW9tYXBfY2ZnX3JlZyhMM18xNjEwX0ZMQVNIX0NTMkJfT0UpOworCW9tYXBfY2ZnX3JlZyhNOF8xNjEwX0ZMQVNIX0NTMkJfV0UpOworCisJLyogTXV4IHBpbnMgZm9yIGtleXBhZCAqLworCW9tYXBfY2ZnX3JlZyhFMl83WFhfS0JSMCk7CisJb21hcF9jZmdfcmVnKEo3XzdYWF9LQlIxKTsKKwlvbWFwX2NmZ19yZWcoRTFfN1hYX0tCUjIpOworCW9tYXBfY2ZnX3JlZyhGM183WFhfS0JSMyk7CisJb21hcF9jZmdfcmVnKEQyXzdYWF9LQlI0KTsKKwlvbWFwX2NmZ19yZWcoQzJfN1hYX0tCQzApOworCW9tYXBfY2ZnX3JlZyhEM183WFhfS0JDMSk7CisJb21hcF9jZmdfcmVnKEU0XzdYWF9LQkMyKTsKKwlvbWFwX2NmZ19yZWcoRjRfN1hYX0tCQzMpOworCW9tYXBfY2ZnX3JlZyhFM183WFhfS0JDNCk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKKworCW9tYXBfYm9hcmRfY29uZmlnID0gcGVyc2V1czJfY29uZmlnOworCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHBlcnNldXMyX2NvbmZpZyk7CisJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygxLCAxMDAsIE5VTEwsIDApOworfQorCisvKiBPbmx5IEZQR0EgbmVlZHMgdG8gYmUgbWFwcGVkIGhlcmUuIEFsbCBvdGhlcnMgYXJlIGRvbmUgd2l0aCBpb3JlbWFwICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfcGVyc2V1czJfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkudmlydHVhbAk9IEgyUDJfREJHX0ZQR0FfQkFTRSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEgyUDJfREJHX0ZQR0FfU1RBUlQpLAorCQkubGVuZ3RoCQk9IEgyUDJfREJHX0ZQR0FfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGVyc2V1czJfbWFwX2lvKHZvaWQpCit7CisJb21hcDd4eF9tYXBfaW8oKTsKKwlpb3RhYmxlX2luaXQob21hcF9wZXJzZXVzMl9pb19kZXNjLAorCQkgICAgIEFSUkFZX1NJWkUob21hcF9wZXJzZXVzMl9pb19kZXNjKSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9QRVJTRVVTMiwgIk9NQVA3MzAgUGVyc2V1czIiKQogCS8qIE1haW50YWluZXI6IEtldmluIEhpbG1hbiA8a2poQGhpbG1hbi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG9tYXBfcGVyc2V1czJfbWFwX2lvLAorCS5pbml0X2Vhcmx5ICAgICA9IG9tYXAxX2luaXRfZWFybHksCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLmluaXRfaXJxCT0gb21hcF9wZXJzZXVzMl9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwMV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9wZXJzZXVzMl9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEtbW1jLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS1tbWMuYwppbmRleCBlOGRkZDg2Li5iNTlmNzg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS1tbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS1tbWMuYwpAQCAtMTIsMTEgKzEyLDExIEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPHBsYXQvbW1jLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC1zeDEuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX01NQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEuYwppbmRleCA5YzNiN2M1Li4wOTJhNGMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLmMKQEAgLTE0LDcgKzE0LDcgQEAKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtMjYsMTMgKzI2LDEzIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9mbGFzaC5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KQEAgLTQwNywyNCArNDA3LDEzIEBACiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDExLCAwKTsJLypBX1NXSVRDSCA9IDAgKi8KIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMTUsIDApOwkvKkFfVVNCX09OID0gMCAqLwogfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3N4MV9pbml0X2lycSh2b2lkKQotewotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3N4MV9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci19CiAKIE1BQ0hJTkVfU1RBUlQoU1gxLCAiT01BUDMxMCBiYXNlZCBTaWVtZW5zIFNYMSIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKLQkubWFwX2lvCQk9IG9tYXBfc3gxX21hcF9pbywKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IG9tYXAxNXh4X21hcF9pbywKKwkuaW5pdF9lYXJseSAgICAgPSBvbWFwMV9pbml0X2Vhcmx5LAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5pbml0X2lycQk9IG9tYXBfc3gxX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3N4MV9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKaW5kZXggMDM2ZWRjMGUuLjYxZWQ2Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KQEAgLTI0LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3N5c3RlbS5oPgpAQCAtMzMsNyArMzUsNiBAQAogCiAjaW5jbHVkZSA8cGxhdC9ib2FyZC12b2ljZWJsdWUuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvZmxhc2guaD4KICNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvdGMuaD4KQEAgLTE1OSwxNyArMTYwLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIHZvaWNlYmx1ZV9jb25maWdbXSA9IHsKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDFfbWFwX2NvbW1vbl9pbygpOwotfQotCiAjZGVmaW5lIE1BQ0hJTkVfUEFOSUNFRAkJMQogI2RlZmluZSBNQUNISU5FX1JFQk9PVElORwkyCiAjZGVmaW5lIE1BQ0hJTkVfUkVCT09UCQk0CkBAIC0zMDEsMTAgKzI5MSwxMSBAQAogCiBNQUNISU5FX1NUQVJUKFZPSUNFQkxVRSwgIlZvaWNlQmx1ZSBPTUFQNTkxMCIpCiAJLyogTWFpbnRhaW5lcjogTGFkaXNsYXYgTWljaGwgPG1pY2hsQDJuLmN6PiAqLwotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCi0JLm1hcF9pbwkJPSB2b2ljZWJsdWVfbWFwX2lvLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5tYXBfaW8JCT0gb21hcDE1eHhfbWFwX2lvLAorCS5pbml0X2Vhcmx5ICAgICA9IG9tYXAxX2luaXRfZWFybHksCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLmluaXRfaXJxCT0gdm9pY2VibHVlX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSB2b2ljZWJsdWVfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMKaW5kZXggMzZmMjZjMy4uNDhlZjk4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjEsMTAgKzIyLDEwIEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCisjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L3RjLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tbWMuaD4KICNpbmNsdWRlIDxwbGF0L29tYXA3eHguaD4KICNpbmNsdWRlIDxwbGF0L21jYnNwLmg+CkBAIC0yOTEsNiArMjkyLDggQEAKIAlpZiAoIWNwdV9jbGFzc19pc19vbWFwMSgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCW9tYXBfc3JhbV9pbml0KCk7CisKIAkvKiBwbGVhc2Uga2VlcCB0aGVzZSBjYWxscywgYW5kIHRoZWlyIGltcGxlbWVudGF0aW9ucyBhYm92ZSwKIAkgKiBpbiBhbHBoYWJldGljYWwgb3JkZXIgc28gdGhleSdyZSBlYXNpZXIgdG8gc29ydCB0aHJvdWdoLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYwppbmRleCBjZGRiZjhiLi4wYTE3YTFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYwpAQCAtMTcsNiArMTcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0yOCw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxwbGF0L2ZwZ2EuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogc3RhdGljIHZvaWQgZnBnYV9tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA2Mjg1NjA0Li4yYjM2YTI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTEzLDEzICsxMyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAKLSNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+Ci0KICNpbmNsdWRlIDxwbGF0L3NlcmlhbC5oPgogCi0jZGVmaW5lIG9tYXBfdWFydF92MnAoeCkJKCh4KSAtIFBBR0VfT0ZGU0VUICsgUExBVF9QSFlTX09GRlNFVCkKLSNkZWZpbmUgb21hcF91YXJ0X3Aydih4KQkoKHgpIC0gUExBVF9QSFlTX09GRlNFVCArIFBBR0VfT0ZGU0VUKQotCiAJCS5wdXNoc2VjdGlvbiAuZGF0YQogb21hcF91YXJ0X3BoeXM6CS53b3JkCTB4MAogb21hcF91YXJ0X3ZpcnQ6CS53b3JkCTB4MApAQCAtMzEsMjYgKzI2LDI0IEBACiAJCSAqIHRoZSBkZXNpcmVkIFVBUlQgcGh5cyBhbmQgdmlydCBhZGRyZXNzZXMgdGVtcG9yYXJpbHkgaW50bwogCQkgKiB0aGUgb21hcF91YXJ0X3BoeXMgYW5kIG9tYXBfdWFydF92aXJ0IGFib3ZlLgogCQkgKi8KLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCiAJCS8qIFVzZSBvbWFwX3VhcnRfcGh5cy92aXJ0IGlmIGFscmVhZHkgY29uZmlndXJlZCAqLwotOToJCW1yYwlwMTUsIDAsIFxycCwgYzEsIGMwCi0JCXRzdAlccnAsICMxCQkJQCBNTVUgZW5hYmxlZD8KLQkJbGRyZXEJXHJwLCA9b21hcF91YXJ0X3YycChvbWFwX3VhcnRfcGh5cykJQCBNTVUgZGlzYWJsZWQKLQkJbGRybmUJXHJwLCA9b21hcF91YXJ0X3BoeXMJQCBNTVUgZW5hYmxlZAotCQlhZGQJXHJ2LCBccnAsICM0CQlAIG9tYXBfdWFydF92aXJ0Ci0JCWxkcglccnAsIFtccnAsICMwXQotCQlsZHIJXHJ2LCBbXHJ2LCAjMF0KKzk6CQlhZHIJXHJwLCA5OWYJCUAgZ2V0IGVmZmVjdGl2ZSBhZGRyIG9mIDk5ZgorCQlsZHIJXHJ2LCBbXHJwXQkJQCBnZXQgYWJzb2x1dGUgYWRkciBvZiA5OWYKKwkJc3ViCVxydiwgXHJ2LCBccnAJCUAgb2Zmc2V0IGJldHdlZW4gdGhlIHR3bworCQlsZHIJXHJwLCBbXHJwLCAjNF0JCUAgYWJzIGFkZHIgb2Ygb21hcF91YXJ0X3BoeXMKKwkJc3ViCVx0bXAsIFxycCwgXHJ2CQlAIG1ha2UgaXQgZWZmZWN0aXZlCisJCWxkcglccnAsIFtcdG1wLCAjMF0JCUAgb21hcF91YXJ0X3BoeXMKKwkJbGRyCVxydiwgW1x0bXAsICM0XQkJQCBvbWFwX3VhcnRfdmlydAogCQljbXAJXHJwLCAjMAkJCUAgaXMgcG9ydCBjb25maWd1cmVkPwogCQljbXBuZQlccnYsICMwCi0JCWJuZQk5OWYJCQlAIGFscmVhZHkgY29uZmlndXJlZAorCQlibmUJMTAwZgkJCUAgYWxyZWFkeSBjb25maWd1cmVkCiAKIAkJLyogQ2hlY2sgdGhlIGRlYnVnIFVBUlQgY29uZmlndXJhdGlvbiBzZXQgaW4gdW5jb21wcmVzcy5oICovCi0JCW1yYwlwMTUsIDAsIFxycCwgYzEsIGMwCi0JCXRzdAlccnAsICMxCQkJQCBNTVUgZW5hYmxlZD8KLQkJbGRyZXEJXHJwLCA9T01BUF9VQVJUX0lORk8JQCBNTVUgbm90IGVuYWJsZWQKLQkJbGRybmUJXHJwLCA9b21hcF91YXJ0X3AydihPTUFQX1VBUlRfSU5GTykJQCBNTVUgZW5hYmxlZAotCQlsZHIJXHJwLCBbXHJwLCAjMF0KKwkJYW5kCVxycCwgcGMsICMweGZmMDAwMDAwCisJCWxkcglccnYsID1PTUFQX1VBUlRfSU5GT19PRlMKKwkJbGRyCVxycCwgW1xycCwgXHJ2XQogCiAJCS8qIFNlbGVjdCB0aGUgVUFSVCB0byB1c2UgYmFzZWQgb24gdGhlIFVBUlQxIHNjcmF0Y2hwYWQgdmFsdWUgKi8KIDEwOgkJY21wCVxycCwgIzAJCQlAIG5vIHBvcnQgY29uZmlndXJlZD8KQEAgLTc0LDE3ICs2NywxOCBAQAogCiAJCS8qIFN0b3JlIGJvdGggcGh5cyBhbmQgdmlydCBhZGRyZXNzIGZvciB0aGUgdWFydCAqLwogOTg6CQlhZGQJXHJwLCBccnAsICMweGZmMDAwMDAwCUAgcGh5cyBiYXNlCi0JCW1yYwlwMTUsIDAsIFxydiwgYzEsIGMwCi0JCXRzdAlccnYsICMxCQkJQCBNTVUgZW5hYmxlZD8KLQkJbGRyZXEJXHJ2LCA9b21hcF91YXJ0X3YycChvbWFwX3VhcnRfcGh5cykJQCBNTVUgZGlzYWJsZWQKLQkJbGRybmUJXHJ2LCA9b21hcF91YXJ0X3BoeXMJQCBNTVUgZW5hYmxlZAotCQlzdHIJXHJwLCBbXHJ2LCAjMF0KKwkJc3RyCVxycCwgW1x0bXAsICMwXQkJQCBvbWFwX3VhcnRfcGh5cwogCQlzdWIJXHJwLCBccnAsICMweGZmMDAwMDAwCUAgcGh5cyBiYXNlCiAJCWFkZAlccnAsIFxycCwgIzB4ZmUwMDAwMDAJQCB2aXJ0IGJhc2UKLQkJYWRkCVxydiwgXHJ2LCAjNAkJQCBvbWFwX3VhcnRfbHNyCi0JCXN0cglccnAsIFtccnYsICMwXQorCQlzdHIJXHJwLCBbXHRtcCwgIzRdCQlAIG9tYXBfdWFydF92aXJ0CiAJCWIJOWIKLTk5OgorCisJCS5hbGlnbgorOTk6CQkud29yZAkuCisJCS53b3JkCW9tYXBfdWFydF9waHlzCisJCS5sdG9yZworCisxMDA6CiAJCS5lbmRtCiAKIAkJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGU5YjYwMGMuLmM2MzM3NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0yLDQgKzIsNTUgQEAKICAqIGFyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCiAgKi8KIAotI2luY2x1ZGUgPHBsYXQvbWVtb3J5Lmg+CisjaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKKyNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAorCisvKgorICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCisgKi8KKyNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgxMDAwMDAwMCkKKworLyoKKyAqIEJ1cyBhZGRyZXNzIGlzIHBoeXNpY2FsIGFkZHJlc3MsIGV4Y2VwdCBmb3IgT01BUC0xNTEwIExvY2FsIEJ1cy4KKyAqIE9NQVAtMTUxMCBidXMgYWRkcmVzcyBpcyB0cmFuc2xhdGVkIGludG8gYSBMb2NhbCBCdXMgYWRkcmVzcyBpZiB0aGUKKyAqIE9NQVAgYnVzIHR5cGUgaXMgbGJ1cy4gV2UgZG8gdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gYmFzZWQgb24gdGhlCisgKiBkZXZpY2Ugb3ZlcnJpZGluZyB0aGUgZGVmYXVsdHMgdXNlZCBpbiB0aGUgZG1hLW1hcHBpbmcgQVBJLgorICogTm90ZSB0aGF0IHRoZSBpc19sYnVzX2RldmljZSgpIHRlc3QgaXMgbm90IHZlcnkgZWZmaWNpZW50IG9uIDE1MTAKKyAqIGJlY2F1c2Ugb2YgdGhlIHN0cm5jbXAoKS4KKyAqLworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCisKKy8qCisgKiBPTUFQLTE1MTAgTG9jYWwgQnVzIGFkZHJlc3Mgb2Zmc2V0CisgKi8KKyNkZWZpbmUgT01BUDE1MTBfTEJfT0ZGU0VUCVVMKDB4MzAwMDAwMDApCisKKyNkZWZpbmUgdmlydF90b19sYnVzKHgpCQkoKHgpIC0gUEFHRV9PRkZTRVQgKyBPTUFQMTUxMF9MQl9PRkZTRVQpCisjZGVmaW5lIGxidXNfdG9fdmlydCh4KQkJKCh4KSAtIE9NQVAxNTEwX0xCX09GRlNFVCArIFBBR0VfT0ZGU0VUKQorI2RlZmluZSBpc19sYnVzX2RldmljZShkZXYpCShjcHVfaXNfb21hcDE1eHgoKSAmJiBkZXYgJiYgKHN0cm5jbXAoZGV2X25hbWUoZGV2KSwgIm9oY2kiLCA0KSA9PSAwKSkKKworI2RlZmluZSBfX2FyY2hfcGZuX3RvX2RtYShkZXYsIHBmbikJXAorCSh7IGRtYV9hZGRyX3QgX19kbWEgPSBfX3Bmbl90b19waHlzKHBmbik7IFwKKwkgICBpZiAoaXNfbGJ1c19kZXZpY2UoZGV2KSkgXAorCQlfX2RtYSA9IF9fZG1hIC0gUEhZU19PRkZTRVQgKyBPTUFQMTUxMF9MQl9PRkZTRVQ7IFwKKwkgICBfX2RtYTsgfSkKKworI2RlZmluZSBfX2FyY2hfZG1hX3RvX3BmbihkZXYsIGFkZHIpCVwKKwkoeyBkbWFfYWRkcl90IF9fZG1hID0gYWRkcjsJCQkJXAorCSAgIGlmIChpc19sYnVzX2RldmljZShkZXYpKQkJCQlcCisJCV9fZG1hICs9IFBIWVNfT0ZGU0VUIC0gT01BUDE1MTBfTEJfT0ZGU0VUOwlcCisJICAgX19waHlzX3RvX3BmbihfX2RtYSk7CQkJCVwKKwl9KQorCisjZGVmaW5lIF9fYXJjaF9kbWFfdG9fdmlydChkZXYsIGFkZHIpCSh7ICh2b2lkICopIChpc19sYnVzX2RldmljZShkZXYpID8gXAorCQkJCQkJbGJ1c190b192aXJ0KGFkZHIpIDogXAorCQkJCQkJX19waHlzX3RvX3ZpcnQoYWRkcikpOyB9KQorCisjZGVmaW5lIF9fYXJjaF92aXJ0X3RvX2RtYShkZXYsIGFkZHIpCSh7IHVuc2lnbmVkIGxvbmcgX19hZGRyID0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpOyBcCisJCQkJCSAgIChkbWFfYWRkcl90KSAoaXNfbGJ1c19kZXZpY2UoZGV2KSA/IFwKKwkJCQkJCXZpcnRfdG9fbGJ1cyhfX2FkZHIpIDogXAorCQkJCQkJX192aXJ0X3RvX3BoeXMoX19hZGRyKSk7IH0pCisKKyNlbmRpZgkvKiBDT05GSUdfQVJDSF9PTUFQMTVYWCAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYwppbmRleCA4NzA4ODZhLi43OTY5Y2ZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiY2xvY2suaCIKIAogZXh0ZXJuIHZvaWQgb21hcF9jaGVja19yZXZpc2lvbih2b2lkKTsKLWV4dGVybiB2b2lkIG9tYXBfc3JhbV9pbml0KHZvaWQpOwogCiAvKgogICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBtYXkgcHJvdmlkZSB0aGUgZXh0cmEgbWFwcGluZyBiZXNpZGVzIHRoZQpAQCAtODUsNTAgKzg0LDQ1IEBACiAjZW5kaWYKIAogLyoKLSAqIE1hcHMgY29tbW9uIElPIHJlZ2lvbnMgZm9yIG9tYXAxLiBUaGlzIHNob3VsZCBvbmx5IGdldCBjYWxsZWQgZnJvbQotICogYm9hcmQgc3BlY2lmaWMgaW5pdC4KKyAqIE1hcHMgY29tbW9uIElPIHJlZ2lvbnMgZm9yIG9tYXAxCiAgKi8KLXZvaWQgX19pbml0IG9tYXAxX21hcF9jb21tb25faW8odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwMV9tYXBfY29tbW9uX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KG9tYXBfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwX2lvX2Rlc2MpKTsKLQotCS8qIE5vcm1hbGx5IGRldmljZW1hcHNfaW5pdCgpIHdvdWxkIGZsdXNoIGNhY2hlcyBhbmQgdGxiIGFmdGVyCi0JICogbWRlc2MtPm1hcF9pbygpLCBidXQgd2UgbXVzdCBhbHNvIGRvIGl0IGhlcmUgYmVjYXVzZSBvZiB0aGUgQ1BVCi0JICogcmV2aXNpb24gY2hlY2sgYmVsb3cuCi0JICovCi0JbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwotCWZsdXNoX2NhY2hlX2FsbCgpOwotCi0JLyogV2Ugd2FudCB0byBjaGVjayBDUFUgcmV2aXNpb24gZWFybHkgZm9yIGNwdV9pc19vbWFweHh4eCgpIG1hY3Jvcy4KLQkgKiBJTyBzcGFjZSBtYXBwaW5nIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHdlIGNhbiBkbyB0aGF0LgotCSAqLwotCW9tYXBfY2hlY2tfcmV2aXNpb24oKTsKLQotI2lmIGRlZmluZWQgKENPTkZJR19BUkNIX09NQVA3MzApIHx8IGRlZmluZWQgKENPTkZJR19BUkNIX09NQVA4NTApCi0JaWYgKGNwdV9pc19vbWFwN3h4KCkpIHsKLQkJaW90YWJsZV9pbml0KG9tYXA3eHhfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwN3h4X2lvX2Rlc2MpKTsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWAotCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDE1MTBfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMTUxMF9pb19kZXNjKSk7Ci0JfQotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQlpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKLQkJaW90YWJsZV9pbml0KG9tYXAxNnh4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDE2eHhfaW9fZGVzYykpOwotCX0KLSNlbmRpZgotCi0Jb21hcF9zcmFtX2luaXQoKTsKIH0KIAotLyoKLSAqIENvbW1vbiBsb3ctbGV2ZWwgaGFyZHdhcmUgaW5pdCBmb3Igb21hcDEuIFRoaXMgc2hvdWxkIG9ubHkgZ2V0IGNhbGxlZCBmcm9tCi0gKiBib2FyZCBzcGVjaWZpYyBpbml0LgotICovCi12b2lkIF9faW5pdCBvbWFwMV9pbml0X2NvbW1vbl9odyh2b2lkKQorI2lmIGRlZmluZWQgKENPTkZJR19BUkNIX09NQVA3MzApIHx8IGRlZmluZWQgKENPTkZJR19BUkNIX09NQVA4NTApCit2b2lkIF9faW5pdCBvbWFwN3h4X21hcF9pbyh2b2lkKQogeworCW9tYXAxX21hcF9jb21tb25faW8oKTsKKwlpb3RhYmxlX2luaXQob21hcDd4eF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXA3eHhfaW9fZGVzYykpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWAordm9pZCBfX2luaXQgb21hcDE1eHhfbWFwX2lvKHZvaWQpCit7CisJb21hcDFfbWFwX2NvbW1vbl9pbygpOworCWlvdGFibGVfaW5pdChvbWFwMTUxMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNTEwX2lvX2Rlc2MpKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKK3ZvaWQgX19pbml0IG9tYXAxNnh4X21hcF9pbyh2b2lkKQoreworCW9tYXAxX21hcF9jb21tb25faW8oKTsKKwlpb3RhYmxlX2luaXQob21hcDE2eHhfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMTZ4eF9pb19kZXNjKSk7Cit9CisjZW5kaWYKKworLyoKKyAqIENvbW1vbiBsb3ctbGV2ZWwgaGFyZHdhcmUgaW5pdCBmb3Igb21hcDEuCisgKi8KK3ZvaWQgb21hcDFfaW5pdF9lYXJseSh2b2lkKQoreworCW9tYXBfY2hlY2tfcmV2aXNpb24oKTsKKwlvbWFwX2lvcmVtYXBfaW5pdCgpOworCiAJLyogUkVWSVNJVDogUmVmZXIgdG8gT01BUDU5MTAgRXJyYXRhLCBBZHZpc29yeSBTWVNfMTogIlRpbWVvdXQgQWJvcnQKIAkgKiBvbiBhIFBvc3RlZCBXcml0ZSBpbiB0aGUgVElQQiBCcmlkZ2UiLgogCSAqLwpAQCAtMTM4LDggKzEzMiw4IEBACiAJLyogTXVzdCBpbml0IGNsb2NrcyBlYXJseSB0byBhc3N1cmUgdGhhdCB0aW1lciBpbnRlcnJ1cHQgd29ya3MKIAkgKi8KIAlvbWFwMV9jbGtfaW5pdCgpOwotCiAJb21hcDFfbXV4X2luaXQoKTsKKwlvbWFwX2luaXRfY29uc2lzdGVudF9kbWFfc2l6ZSgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKaW5kZXggZTJiOWM5MC4uZTViMTA0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCkBAIC0zNSw3ICszNSw3IEBACiAgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC00NSw3ICs0NSw2IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiAjZGVmaW5lIElSUV9CQU5LKGlycSkgKChpcnEpID4+IDUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwppbmRleCBiNGY5YmU1Li40YjgxOGViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMKQEAgLTksNiArOSw3IEBACiAgKiBUaGUgInN1cmZlciIgZXhwYW5zaW9uIGJvYXJkIGFuZCBIMiBzYW1wbGUgYm9hcmQgYWxzbyBoYXZlIHR3by1jb2xvcgogICogZ3JlZW4rcmVkIExFRHMgKGluIHBhcmFsbGVsKSwgdXNlZCBoZXJlIGZvciB0aW1lciBhbmQgaWRsZSBpbmRpY2F0b3JzLgogICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC0yMCw3ICsyMSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPHBsYXQvZnBnYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAibGVkcy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKaW5kZXggNDk5ZDdhZC4uZGEwOWY0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYwpAQCAtMywxNCArMywxMyBAQAogICoKICAqIExFRCBkcml2ZXIgZm9yIE9TSyB3aXRoIG9wdGlvbmFsIE1pc3RyYWwgUVZHQSBib2FyZAogICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotCiAjaW5jbHVkZSAibGVkcy5oIgogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLmMKaW5kZXggMjJlYjExZC4uYWU2ZGQ5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLmMKQEAgLTMsMTMgKzMsMTMgQEAKICAqCiAgKiBPTUFQIExFRHMgZGlzcGF0Y2hlcgogICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAKICNpbmNsdWRlICJsZWRzLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL21haWxib3guYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbWFpbGJveC5jCmluZGV4IGMwZTFmNDguLmU5NjI5MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvbWFpbGJveC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbWFpbGJveC5jCkBAIC05LDYgKzksNyBAQAogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbWNic3AuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbWNic3AuYwppbmRleCBhYjczOTVkLi45MWY5YWJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9tY2JzcC5jCkBAIC0zMSw2ICszMSw3IEBACiBzdGF0aWMgaW50IGRzcF91c2U7CiBzdGF0aWMgc3RydWN0IGNsayAqYXBpX2NsazsKIHN0YXRpYyBzdHJ1Y3QgY2xrICpkc3BfY2xrOworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKipvbWFwX21jYnNwX2RldmljZXM7CiAKIHN0YXRpYyB2b2lkIG9tYXAxX21jYnNwX3JlcXVlc3QodW5zaWduZWQgaW50IGlkKQogewpAQCAtNzgsNiArNzksMTcgQEAKIAkuZnJlZQkJPSBvbWFwMV9tY2JzcF9mcmVlLAogfTsKIAorI2RlZmluZSBPTUFQN1hYX01DQlNQMV9CQVNFCTB4ZmZmYjEwMDAKKyNkZWZpbmUgT01BUDdYWF9NQ0JTUDJfQkFTRQkweGZmZmIxODAwCisKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AxX0JBU0UJMHhlMTAxMTgwMAorI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDJfQkFTRQkweGZmZmIxMDAwCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQM19CQVNFCTB4ZTEwMTcwMDAKKworI2RlZmluZSBPTUFQMTYxMF9NQ0JTUDFfQkFTRQkweGUxMDExODAwCisjZGVmaW5lIE9NQVAxNjEwX01DQlNQMl9CQVNFCTB4ZmZmYjEwMDAKKyNkZWZpbmUgT01BUDE2MTBfTUNCU1AzX0JBU0UJMHhlMTAxNzAwMAorCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNzMwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA4NTApCiBzdHJ1Y3QgcmVzb3VyY2Ugb21hcDd4eF9tY2JzcF9yZXNbXVs2XSA9IHsKIAl7CkBAIC0zNjksNiArMzgxLDM5IEBACiAjZGVmaW5lIE9NQVAxNlhYX01DQlNQX0NPVU5UCQkwCiAjZW5kaWYKIAorc3RhdGljIHZvaWQgb21hcF9tY2JzcF9yZWdpc3Rlcl9ib2FyZF9jZmcoc3RydWN0IHJlc291cmNlICpyZXMsIGludCByZXNfY291bnQsCisJCQlzdHJ1Y3Qgb21hcF9tY2JzcF9wbGF0Zm9ybV9kYXRhICpjb25maWcsIGludCBzaXplKQoreworCWludCBpOworCisJb21hcF9tY2JzcF9kZXZpY2VzID0ga3phbGxvYyhzaXplICogc2l6ZW9mKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiksCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW9tYXBfbWNic3BfZGV2aWNlcykgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWdpc3RlciBNY0JTUCBkZXZpY2VzXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbmV3X21jYnNwOworCQlpbnQgcmV0OworCisJCW5ld19tY2JzcCA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygib21hcC1tY2JzcCIsIGkgKyAxKTsKKwkJaWYgKCFuZXdfbWNic3ApCisJCQljb250aW51ZTsKKwkJcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMobmV3X21jYnNwLCAmcmVzW2kgKiByZXNfY291bnRdLAorCQkJCQlyZXNfY291bnQpOworCQljb25maWdbaV0ucmVnX3NpemUgPSAyOworCQljb25maWdbaV0ucmVnX3N0ZXAgPSAyOworCQluZXdfbWNic3AtPmRldi5wbGF0Zm9ybV9kYXRhID0gJmNvbmZpZ1tpXTsKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChuZXdfbWNic3ApOworCQlpZiAocmV0KSB7CisJCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KG5ld19tY2JzcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlvbWFwX21jYnNwX2RldmljZXNbaV0gPSBuZXdfbWNic3A7CisJfQorfQorCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwMV9tY2JzcF9pbml0KHZvaWQpCiB7CiAJaWYgKCFjcHVfY2xhc3NfaXNfb21hcDEoKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvcG0uYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvcG0uYwppbmRleCA0OTViMzk4Li44OWVhMjBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbS5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmZGVmIENPTkZJR19PTUFQX01QVV9USU1FUgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTVBVX1RJTUVSKSAmJiAhZGVmaW5lZChDT05GSUdfT01BUF9ETV9USU1FUikKICN3YXJuaW5nIEVuYWJsZSAzMmtIeiBPUyB0aW1lciBpbiBvcmRlciB0byBhbGxvdyBzbGVlcCBzdGF0ZXMgaW4gaWRsZQogCXVzZV9pZGxlY3QxID0gdXNlX2lkbGVjdDEgJiB+KDEgPDwgOSk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKaW5kZXggNTUwY2E5ZC4uOTNhZThmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCkBAIC03LDcgKzcsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjQsNyArMjQsNiBAQAogCiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+CiAKICNpbmNsdWRlICJwbS5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOTA2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWVyLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qKgorICogT01BUDEgRHVhbC1Nb2RlIFRpbWVycyAtIHBsYXRmb3JtIGRldmljZSByZWdpc3RyYXRpb24KKyAqCisgKiBDb250YWlucyBmaXJzdCBsZXZlbCBpbml0aWFsaXphdGlvbiByb3V0aW5lcyB3aGljaCBpbnRlcm5hbGx5CisgKiBnZW5lcmF0ZXMgdGltZXIgZGV2aWNlIGluZm9ybWF0aW9uIGFuZCByZWdpc3RlcnMgd2l0aCBsaW51eAorICogZGV2aWNlIG1vZGVsLiBJdCBhbHNvIGhhcyBsb3cgbGV2ZWwgZnVuY3Rpb24gdG8gY2huYWdlIHRoZSB0aW1lcgorICogaW5wdXQgY2xvY2sgc291cmNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqIFRhcnVuIEthbnRpIERlYkJhcm1hIDx0YXJ1bi5rYW50aUB0aS5jb20+CisgKiBUaGFyYSBHb3BpbmF0aCA8dGhhcmFAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCisjaW5jbHVkZSA8cGxhdC9kbXRpbWVyLmg+CisKKyNkZWZpbmUgT01BUDE2MTBfR1BUSU1FUjFfQkFTRQkJMHhmZmZiMTQwMAorI2RlZmluZSBPTUFQMTYxMF9HUFRJTUVSMl9CQVNFCQkweGZmZmIxYzAwCisjZGVmaW5lIE9NQVAxNjEwX0dQVElNRVIzX0JBU0UJCTB4ZmZmYjI0MDAKKyNkZWZpbmUgT01BUDE2MTBfR1BUSU1FUjRfQkFTRQkJMHhmZmZiMmMwMAorI2RlZmluZSBPTUFQMTYxMF9HUFRJTUVSNV9CQVNFCQkweGZmZmIzNDAwCisjZGVmaW5lIE9NQVAxNjEwX0dQVElNRVI2X0JBU0UJCTB4ZmZmYjNjMDAKKyNkZWZpbmUgT01BUDE2MTBfR1BUSU1FUjdfQkFTRQkJMHhmZmZiNzQwMAorI2RlZmluZSBPTUFQMTYxMF9HUFRJTUVSOF9CQVNFCQkweGZmZmJkNDAwCisKKyNkZWZpbmUgT01BUDFfRE1fVElNRVJfQ09VTlQJCTgKKworc3RhdGljIGludCBvbWFwMV9kbV90aW1lcl9zZXRfc3JjKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJaW50IHNvdXJjZSkKK3sKKwlpbnQgbiA9IChwZGV2LT5pZCAtIDEpIDw8IDE7CisJdTMyIGw7CisKKwlsID0gX19yYXdfcmVhZGwoTU9EX0NPTkZfQ1RSTF8xKSAmIH4oMHgwMyA8PCBuKTsKKwlsIHw9IHNvdXJjZSA8PCBuOworCV9fcmF3X3dyaXRlbChsLCBNT0RfQ09ORl9DVFJMXzEpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IF9faW5pdCBvbWFwMV9kbV90aW1lcl9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IHJldDsKKwlzdHJ1Y3QgZG10aW1lcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCisJaWYgKCFjcHVfaXNfb21hcDE2eHgoKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAxOyBpIDw9IE9NQVAxX0RNX1RJTUVSX0NPVU5UOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlIHJlc1syXTsKKwkJdTMyIGJhc2UsIGlycTsKKworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAxOgorCQkJYmFzZSA9IE9NQVAxNjEwX0dQVElNRVIxX0JBU0U7CisJCQlpcnEgPSBJTlRfMTYxMF9HUFRJTUVSMTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQliYXNlID0gT01BUDE2MTBfR1BUSU1FUjJfQkFTRTsKKwkJCWlycSA9IElOVF8xNjEwX0dQVElNRVIyOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWJhc2UgPSBPTUFQMTYxMF9HUFRJTUVSM19CQVNFOworCQkJaXJxID0gSU5UXzE2MTBfR1BUSU1FUjM7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJYmFzZSA9IE9NQVAxNjEwX0dQVElNRVI0X0JBU0U7CisJCQlpcnEgPSBJTlRfMTYxMF9HUFRJTUVSNDsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQliYXNlID0gT01BUDE2MTBfR1BUSU1FUjVfQkFTRTsKKwkJCWlycSA9IElOVF8xNjEwX0dQVElNRVI1OworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWJhc2UgPSBPTUFQMTYxMF9HUFRJTUVSNl9CQVNFOworCQkJaXJxID0gSU5UXzE2MTBfR1BUSU1FUjY7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJYmFzZSA9IE9NQVAxNjEwX0dQVElNRVI3X0JBU0U7CisJCQlpcnEgPSBJTlRfMTYxMF9HUFRJTUVSNzsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQliYXNlID0gT01BUDE2MTBfR1BUSU1FUjhfQkFTRTsKKwkJCWlycSA9IElOVF8xNjEwX0dQVElNRVI4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogbm90IHN1cHBvc2VkIHRvIHJlYWNoIGhlcmUuCisJCQkgKiB0aGlzIGlzIHRvIHJlbW92ZSB3YXJuaW5nLgorCQkJICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIm9tYXBfdGltZXIiLCBpKTsKKwkJaWYgKCFwZGV2KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZGV2aWNlIGFsbG9jIGZvciBkbXRpbWVyJWRcbiIsCisJCQkJX19mdW5jX18sIGkpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQltZW1zZXQocmVzLCAwLCAyICogc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQlyZXNbMF0uc3RhcnQgPSBiYXNlOworCQlyZXNbMF0uZW5kID0gYmFzZSArIDB4NDY7CisJCXJlc1swXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCQlyZXNbMV0uc3RhcnQgPSBpcnE7CisJCXJlc1sxXS5lbmQgPSBpcnE7CisJCXJlc1sxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCByZXMsCisJCQkJQVJSQVlfU0laRShyZXMpKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBhZGQgcmVzb3VyY2VzLlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGVycl9mcmVlX3BkZXY7CisJCX0KKworCQlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCQlpZiAoIXBkYXRhKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIHBkYXRhLlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfZnJlZV9wZGF0YTsKKwkJfQorCisJCXBkYXRhLT5zZXRfdGltZXJfc3JjID0gb21hcDFfZG1fdGltZXJfc2V0X3NyYzsKKwkJcGRhdGEtPm5lZWRzX21hbnVhbF9yZXNldCA9IDE7CisKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBkYXRhLCBzaXplb2YoKnBkYXRhKSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gYWRkIHBsYXRmb3JtIGRhdGEuXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX2ZyZWVfcGRhdGE7CisJCX0KKworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIGFkZCBwbGF0Zm9ybSBkZXZpY2UuXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX2ZyZWVfcGRhdGE7CisJCX0KKworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIgUmVnaXN0ZXJlZC5cbiIpOworCX0KKworCXJldHVybiAwOworCitlcnJfZnJlZV9wZGF0YToKKwlrZnJlZShwZGF0YSk7CisKK2Vycl9mcmVlX3BkZXY6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisKKwlyZXR1cm4gcmV0OworfQorYXJjaF9pbml0Y2FsbChvbWFwMV9kbV90aW1lcl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZwppbmRleCA4OWJmYjQ5Li41MDM0MTQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCkBAIC0xNCw3ICsxNCw2IEBACiAJc2VsZWN0IFNFUklBTF9PTUFQX0NPTlNPTEUKIAlzZWxlY3QgSTJDCiAJc2VsZWN0IEkyQ19PTUFQCi0Jc2VsZWN0IE1GRF9TVVBQT1JUCiAJc2VsZWN0IE1FTkVMQVVTIGlmIEFSQ0hfT01BUDIKIAlzZWxlY3QgVFdMNDAzMF9DT1JFIGlmIEFSQ0hfT01BUDMgfHwgQVJDSF9PTUFQNAogCXNlbGVjdCBUV0w0MDMwX1BPV0VSIGlmIEFSQ0hfT01BUDMgfHwgQVJDSF9PTUFQNApAQCAtMTA4LDkgKzEwNywxMyBAQAogCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMKIAogY29uZmlnIE1BQ0hfT01BUF9HRU5FUklDCi0JYm9vbCAiR2VuZXJpYyBPTUFQIGJvYXJkIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMgorCWJvb2wgIkdlbmVyaWMgT01BUDIrIGJvYXJkIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMKKwlzZWxlY3QgVVNFX09GCiAJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBmb3IgZ2VuZXJpYyBUSSBPTUFQMisgYm9hcmRzIHVzaW5nIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZS4KKwkgIE1vcmUgaW5mb3JtYXRpb24gYXQgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlCiAKIGNvbmZpZyBNQUNIX09NQVAyX1RVU0I2MDEwCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUKaW5kZXggNzMxN2EyYi4uNjlhYjFjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlCkBAIC04OSwxNCArODksMTMgQEAKIAkJCQkJICAgdnA0NHh4X2RhdGEubwogCiAjIE9NQVAgdm9sdGFnZSBkb21haW5zCi1pZmVxICgkKENPTkZJR19QTSkseSkKLXZvbHRhZ2Vkb21haW4tY29tbW9uCQkJOj0gdm9sdGFnZS5vCi1vYmotJChDT05GSUdfQVJDSF9PTUFQMikJCSs9ICQodm9sdGFnZWRvbWFpbi1jb21tb24pCit2b2x0YWdlZG9tYWluLWNvbW1vbgkJCTo9IHZvbHRhZ2UubyB2Yy5vIHZwLm8KK29iai0kKENPTkZJR19BUkNIX09NQVAyKQkJKz0gJCh2b2x0YWdlZG9tYWluLWNvbW1vbikgXAorCQkJCQkgICB2b2x0YWdlZG9tYWluczJ4eHhfZGF0YS5vCiBvYmotJChDT05GSUdfQVJDSF9PTUFQMykJCSs9ICQodm9sdGFnZWRvbWFpbi1jb21tb24pIFwKIAkJCQkJICAgdm9sdGFnZWRvbWFpbnMzeHh4X2RhdGEubwogb2JqLSQoQ09ORklHX0FSQ0hfT01BUDQpCQkrPSAkKHZvbHRhZ2Vkb21haW4tY29tbW9uKSBcCiAJCQkJCSAgIHZvbHRhZ2Vkb21haW5zNDR4eF9kYXRhLm8KLWVuZGlmCiAKICMgT01BUCBwb3dlcmRvbWFpbiBmcmFtZXdvcmsKIHBvd2VyZG9tYWluLWNvbW1vbgkJCSs9IHBvd2VyZG9tYWluLm8gcG93ZXJkb21haW4tY29tbW9uLm8KQEAgLTExNiw5ICsxMTUsMTIgQEAKIG9iai0kKENPTkZJR19BUkNIX09NQVAyKQkJKz0gY2xvY2tkb21haW4ubyBcCiAJCQkJCSAgIGNsb2NrZG9tYWluMnh4eF8zeHh4Lm8gXAogCQkJCQkgICBjbG9ja2RvbWFpbnMyeHh4XzN4eHhfZGF0YS5vCitvYmotJChDT05GSUdfU09DX09NQVAyNDIwKQkJKz0gY2xvY2tkb21haW5zMjQyMF9kYXRhLm8KK29iai0kKENPTkZJR19TT0NfT01BUDI0MzApCQkrPSBjbG9ja2RvbWFpbnMyNDMwX2RhdGEubwogb2JqLSQoQ09ORklHX0FSQ0hfT01BUDMpCQkrPSBjbG9ja2RvbWFpbi5vIFwKIAkJCQkJICAgY2xvY2tkb21haW4yeHh4XzN4eHgubyBcCi0JCQkJCSAgIGNsb2NrZG9tYWluczJ4eHhfM3h4eF9kYXRhLm8KKwkJCQkJICAgY2xvY2tkb21haW5zMnh4eF8zeHh4X2RhdGEubyBcCisJCQkJCSAgIGNsb2NrZG9tYWluczN4eHhfZGF0YS5vCiBvYmotJChDT05GSUdfQVJDSF9PTUFQNCkJCSs9IGNsb2NrZG9tYWluLm8gXAogCQkJCQkgICBjbG9ja2RvbWFpbjQ0eHgubyBcCiAJCQkJCSAgIGNsb2NrZG9tYWluczQ0eHhfZGF0YS5vCkBAIC0xODUsNzUgKzE4Nyw2MiBAQAogIyBTcGVjaWZpYyBib2FyZCBzdXBwb3J0CiBvYmotJChDT05GSUdfTUFDSF9PTUFQX0dFTkVSSUMpCQkrPSBib2FyZC1nZW5lcmljLm8KIG9iai0kKENPTkZJR19NQUNIX09NQVBfSDQpCQkrPSBib2FyZC1oNC5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQXzI0MzBTRFApCQkrPSBib2FyZC0yNDMwc2RwLm8gXAotCQkJCQkgICBoc21tYy5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQXzI0MzBTRFApCQkrPSBib2FyZC0yNDMwc2RwLm8KIG9iai0kKENPTkZJR19NQUNIX09NQVBfQVBPTExPTikJCSs9IGJvYXJkLWFwb2xsb24ubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUDNfQkVBR0xFKQkJKz0gYm9hcmQtb21hcDNiZWFnbGUubyBcCi0JCQkJCSAgIGhzbW1jLm8KLW9iai0kKENPTkZJR19NQUNIX0RFVktJVDgwMDApICAgICAJKz0gYm9hcmQtZGV2a2l0ODAwMC5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc21tYy5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX0xEUCkJCSs9IGJvYXJkLWxkcC5vIFwKLQkJCQkJICAgYm9hcmQtZmxhc2gubyBcCi0JCQkJCSAgIGhzbW1jLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVAzNTMwX0xWX1NPTSkgICAgICArPSBib2FyZC1vbWFwM2xvZ2ljLm8gXAotCQkJCQkgICBoc21tYy5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQM19UT1JQRURPKSAgICAgICAgKz0gYm9hcmQtb21hcDNsb2dpYy5vIFwKLQkJCQkJICAgaHNtbWMubwotb2JqLSQoQ09ORklHX01BQ0hfT1ZFUk8pCQkrPSBib2FyZC1vdmVyby5vIFwKLQkJCQkJICAgaHNtbWMubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUDNFVk0pCQkrPSBib2FyZC1vbWFwM2V2bS5vIFwKLQkJCQkJICAgaHNtbWMubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUDNfUEFORE9SQSkJKz0gYm9hcmQtb21hcDNwYW5kb3JhLm8gXAotCQkJCQkgICBoc21tYy5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQXzM0MzBTRFApCQkrPSBib2FyZC0zNDMwc2RwLm8gXAotCQkJCQkgICBoc21tYy5vIFwKLQkJCQkJICAgYm9hcmQtZmxhc2gubworb2JqLSQoQ09ORklHX01BQ0hfT01BUDNfQkVBR0xFKQkJKz0gYm9hcmQtb21hcDNiZWFnbGUubworb2JqLSQoQ09ORklHX01BQ0hfREVWS0lUODAwMCkgICAgIAkrPSBib2FyZC1kZXZraXQ4MDAwLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfTERQKQkJKz0gYm9hcmQtbGRwLm8KK29iai0kKENPTkZJR19NQUNIX09NQVAzNTMwX0xWX1NPTSkgICAgICArPSBib2FyZC1vbWFwM2xvZ2ljLm8KK29iai0kKENPTkZJR19NQUNIX09NQVAzX1RPUlBFRE8pICAgICAgICArPSBib2FyZC1vbWFwM2xvZ2ljLm8KK29iai0kKENPTkZJR19NQUNIX0VOQ09SRSkJCSs9IGJvYXJkLW9tYXAzZW5jb3JlLm8KK29iai0kKENPTkZJR19NQUNIX09WRVJPKQkJKz0gYm9hcmQtb3Zlcm8ubworb2JqLSQoQ09ORklHX01BQ0hfT01BUDNFVk0pCQkrPSBib2FyZC1vbWFwM2V2bS5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQM19QQU5ET1JBKQkrPSBib2FyZC1vbWFwM3BhbmRvcmEubworb2JqLSQoQ09ORklHX01BQ0hfT01BUF8zNDMwU0RQKQkJKz0gYm9hcmQtMzQzMHNkcC5vCiBvYmotJChDT05GSUdfTUFDSF9OT0tJQV9OOFgwKQkJKz0gYm9hcmQtbjh4MC5vCiBvYmotJChDT05GSUdfTUFDSF9OT0tJQV9STTY4MCkJCSs9IGJvYXJkLXJtNjgwLm8gXAotCQkJCQkgICBzZHJhbS1ub2tpYS5vIFwKLQkJCQkJICAgaHNtbWMubworCQkJCQkgICBzZHJhbS1ub2tpYS5vCiBvYmotJChDT05GSUdfTUFDSF9OT0tJQV9SWDUxKQkJKz0gYm9hcmQtcng1MS5vIFwKIAkJCQkJICAgc2RyYW0tbm9raWEubyBcCiAJCQkJCSAgIGJvYXJkLXJ4NTEtcGVyaXBoZXJhbHMubyBcCi0JCQkJCSAgIGJvYXJkLXJ4NTEtdmlkZW8ubyBcCi0JCQkJCSAgIGhzbW1jLm8KKwkJCQkJICAgYm9hcmQtcng1MS12aWRlby5vCiBvYmotJChDT05GSUdfTUFDSF9PTUFQX1pPT00yKQkJKz0gYm9hcmQtem9vbS5vIFwKIAkJCQkJICAgYm9hcmQtem9vbS1wZXJpcGhlcmFscy5vIFwKIAkJCQkJICAgYm9hcmQtem9vbS1kaXNwbGF5Lm8gXAotCQkJCQkgICBib2FyZC1mbGFzaC5vIFwKLQkJCQkJICAgaHNtbWMubyBcCiAJCQkJCSAgIGJvYXJkLXpvb20tZGVidWdib2FyZC5vCiBvYmotJChDT05GSUdfTUFDSF9PTUFQX1pPT00zKQkJKz0gYm9hcmQtem9vbS5vIFwKIAkJCQkJICAgYm9hcmQtem9vbS1wZXJpcGhlcmFscy5vIFwKIAkJCQkJICAgYm9hcmQtem9vbS1kaXNwbGF5Lm8gXAotCQkJCQkgICBib2FyZC1mbGFzaC5vIFwKLQkJCQkJICAgaHNtbWMubyBcCiAJCQkJCSAgIGJvYXJkLXpvb20tZGVidWdib2FyZC5vCiBvYmotJChDT05GSUdfTUFDSF9PTUFQXzM2MzBTRFApCQkrPSBib2FyZC0zNjMwc2RwLm8gXAogCQkJCQkgICBib2FyZC16b29tLXBlcmlwaGVyYWxzLm8gXAotCQkJCQkgICBib2FyZC16b29tLWRpc3BsYXkubyBcCi0JCQkJCSAgIGJvYXJkLWZsYXNoLm8gXAotCQkJCQkgICBoc21tYy5vCi1vYmotJChDT05GSUdfTUFDSF9DTV9UMzUpCQkrPSBib2FyZC1jbS10MzUubyBcCi0JCQkJCSAgIGhzbW1jLm8KKwkJCQkJICAgYm9hcmQtem9vbS1kaXNwbGF5Lm8KK29iai0kKENPTkZJR19NQUNIX0NNX1QzNSkJCSs9IGJvYXJkLWNtLXQzNS5vCiBvYmotJChDT05GSUdfTUFDSF9DTV9UMzUxNykJCSs9IGJvYXJkLWNtLXQzNTE3Lm8KLW9iai0kKENPTkZJR19NQUNIX0lHRVAwMDIwKQkJKz0gYm9hcmQtaWdlcDAwMjAubyBcCi0JCQkJCSAgIGhzbW1jLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVAzX1RPVUNIQk9PSykJKz0gYm9hcmQtb21hcDN0b3VjaGJvb2subyBcCi0JCQkJCSAgIGhzbW1jLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVBfNDQzMFNEUCkJCSs9IGJvYXJkLTQ0MzBzZHAubyBcCi0JCQkJCSAgIGhzbW1jLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVA0X1BBTkRBKQkJKz0gYm9hcmQtb21hcDRwYW5kYS5vIFwKLQkJCQkJICAgaHNtbWMubworb2JqLSQoQ09ORklHX01BQ0hfSUdFUDAwMjApCQkrPSBib2FyZC1pZ2VwMDAyMC5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQM19UT1VDSEJPT0spCSs9IGJvYXJkLW9tYXAzdG91Y2hib29rLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfNDQzMFNEUCkJCSs9IGJvYXJkLTQ0MzBzZHAubworb2JqLSQoQ09ORklHX01BQ0hfT01BUDRfUEFOREEpCQkrPSBib2FyZC1vbWFwNHBhbmRhLm8KKworb2JqLSQoQ09ORklHX01BQ0hfUENNMDQ5KQkJKz0gYm9hcmQtb21hcDRwY20wNDkubwogCiBvYmotJChDT05GSUdfTUFDSF9PTUFQMzUxN0VWTSkJCSs9IGJvYXJkLWFtMzUxN2V2bS5vCiAKIG9iai0kKENPTkZJR19NQUNIX0NSQU5FQk9BUkQpCQkrPSBib2FyZC1hbTM1MTdjcmFuZS5vCiAKLW9iai0kKENPTkZJR19NQUNIX1NCQzM1MzApCQkrPSBib2FyZC1vbWFwM3N0YWxrZXIubyBcCi0JCQkJCSAgIGhzbW1jLm8KK29iai0kKENPTkZJR19NQUNIX1NCQzM1MzApCQkrPSBib2FyZC1vbWFwM3N0YWxrZXIubwogb2JqLSQoQ09ORklHX01BQ0hfVEk4MTY4RVZNKQkJKz0gYm9hcmQtdGk4MTY4ZXZtLm8KKwogIyBQbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgaW5pdCBjb2RlCisKK29tYXAtZmxhc2gtJChDT05GSUdfTVREX05BTkRfT01BUDIpCTo9IGJvYXJkLWZsYXNoLm8KK29tYXAtZmxhc2gtJChDT05GSUdfTVREX09ORU5BTkRfT01BUDIpCTo9IGJvYXJkLWZsYXNoLm8KK29iai15CQkJCQkrPSAkKG9tYXAtZmxhc2gteSkgJChvbWFwLWZsYXNoLW0pCisKK29tYXAtaHNtbWMtJChDT05GSUdfTU1DX09NQVBfSFMpCTo9IGhzbW1jLm8KK29iai15CQkJCQkrPSAkKG9tYXAtaHNtbWMtbSkgJChvbWFwLWhzbW1jLXkpCisKKwogdXNiZnMtJChDT05GSUdfQVJDSF9PTUFQX09URykJCTo9IHVzYi1mcy5vCiBvYmoteQkJCQkJKz0gJCh1c2Jmcy1tKSAkKHVzYmZzLXkpCiBvYmoteQkJCQkJKz0gdXNiLW11c2IubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYwppbmRleCBmNzliN2QyLi5kNzA0ZjBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYwpAQCAtMzksNiArMzksOSBAQAogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLXNtYzkxeC5oPgogCisjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZ2VuZXJpYy1kcGkuaD4KKwogI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgImhzbW1jLmgiCiAjaW5jbHVkZSAiY29tbW9uLWJvYXJkLWRldmljZXMuaCIKQEAgLTk5LDIwICsxMDIsNzIgQEAKIAkucmVzb3VyY2UJPSAmc2RwMjQzMF9mbGFzaF9yZXNvdXJjZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNkcDI0MzBfbGNkX2RldmljZSA9IHsKLQkubmFtZQkJPSAic2RwMjQzMF9sY2QiLAotCS5pZAkJPSAtMSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzZHAyNDMwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzZHAyNDMwX2ZsYXNoX2RldmljZSwKK307CisKKy8qIExDRCAqLworI2RlZmluZSBTRFAyNDMwX0xDRF9QQU5FTF9CQUNLTElHSFRfR1BJTwk5MQorI2RlZmluZSBTRFAyNDMwX0xDRF9QQU5FTF9FTkFCTEVfR1BJTwkJMTU0CisKK3N0YXRpYyBpbnQgc2RwMjQzMF9wYW5lbF9lbmFibGVfbGNkKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoU0RQMjQzMF9MQ0RfUEFORUxfRU5BQkxFX0dQSU8sIDEpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChTRFAyNDMwX0xDRF9QQU5FTF9CQUNLTElHSFRfR1BJTywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2RwMjQzMF9wYW5lbF9kaXNhYmxlX2xjZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFNEUDI0MzBfTENEX1BBTkVMX0VOQUJMRV9HUElPLCAwKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoU0RQMjQzMF9MQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU8sIDApOworfQorCitzdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgc2RwMjQzMF9wYW5lbF9kYXRhID0geworCS5uYW1lCQkJPSAibmVjX25sMjQzMmRyMjItMTFiIiwKKwkucGxhdGZvcm1fZW5hYmxlCT0gc2RwMjQzMF9wYW5lbF9lbmFibGVfbGNkLAorCS5wbGF0Zm9ybV9kaXNhYmxlCT0gc2RwMjQzMF9wYW5lbF9kaXNhYmxlX2xjZCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIHNkcDI0MzBfbGNkX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImxjZCIsCisJLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKKwkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMTYsCisJLmRhdGEJCQk9ICZzZHAyNDMwX3BhbmVsX2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqc2RwMjQzMF9kc3NfZGV2aWNlc1tdID0gewogCSZzZHAyNDMwX2xjZF9kZXZpY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyBzZHAyNDMwX2xjZF9jb25maWcgX19pbml0ZGF0YSA9IHsKLQkuY3RybF9uYW1lCT0gImludGVybmFsIiwKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyBzZHAyNDMwX2Rzc19kYXRhID0geworCS5udW1fZGV2aWNlcwk9IEFSUkFZX1NJWkUoc2RwMjQzMF9kc3NfZGV2aWNlcyksCisJLmRldmljZXMJPSBzZHAyNDMwX2Rzc19kZXZpY2VzLAorCS5kZWZhdWx0X2RldmljZQk9ICZzZHAyNDMwX2xjZF9kZXZpY2UsCiB9OwogCitzdGF0aWMgdm9pZCBfX2luaXQgc2RwMjQzMF9kaXNwbGF5X2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXN0YXRpYyBzdHJ1Y3QgZ3BpbyBncGlvc1tdIF9faW5pdGRhdGEgPSB7CisJCXsgU0RQMjQzMF9MQ0RfUEFORUxfRU5BQkxFX0dQSU8sIEdQSU9GX09VVF9JTklUX0xPVywKKwkJCSJMQ0QgcmVzZXQiIH0sCisJCXsgU0RQMjQzMF9MQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU8sIEdQSU9GX09VVF9JTklUX0xPVywKKwkJCSJMQ0QgQmFja2xpZ2h0IiB9LAorCX07CisKKwlyID0gZ3Bpb19yZXF1ZXN0X2FycmF5KGdwaW9zLCBBUlJBWV9TSVpFKGdwaW9zKSk7CisJaWYgKHIpIHsKKwkJcHJfZXJyKCJDYW5ub3QgcmVxdWVzdCBMQ0QgR1BJT3MsIGVycm9yICVkXG4iLCByKTsKKwkJcmV0dXJuOworCX0KKworCW9tYXBfZGlzcGxheV9pbml0KCZzZHAyNDMwX2Rzc19kYXRhKTsKK30KKwogI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkgfHwgZGVmaW5lZChDT05GSUdfU01DOTF4X01PRFVMRSkKIAogc3RhdGljIHN0cnVjdCBvbWFwX3NtYzkxeF9wbGF0Zm9ybV9kYXRhIGJvYXJkX3NtYzkxeF9kYXRhID0gewpAQCAtMTM3LDE2ICsxOTIsNiBAQAogCiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgc2RwMjQzMF9jb25maWdbXSBfX2luaXRkYXRhID0gewotCXtPTUFQX1RBR19MQ0QsICZzZHAyNDMwX2xjZF9jb25maWd9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfMjQzMHNkcF9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgc2RwMjQzMF92bW1jMV9zdXBwbGllc1tdID0gewogCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIiksCiB9OwpAQCAtMjI5LDEzICsyNzQsMTEgQEAKIHsKIAlvbWFwMjQzMF9tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9aQUMpOwogCi0Jb21hcF9ib2FyZF9jb25maWcgPSBzZHAyNDMwX2NvbmZpZzsKLQlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShzZHAyNDMwX2NvbmZpZyk7Ci0KIAlvbWFwMjQzMF9pMmNfaW5pdCgpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc2RwMjQzMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNkcDI0MzBfZGV2aWNlcykpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChOVUxMLCBOVUxMKTsKIAlvbWFwMl9oc21tY19pbml0KG1tYyk7CiAJb21hcDJfdXNiZnNfaW5pdCgmc2RwMjQzMF91c2JfY29uZmlnKTsKIApAQCAtMjQ3LDIwICsyOTAsMTYgQEAKIAkvKiBUdXJuIG9mZiBzZWNvbmRhcnkgTENEIGJhY2tsaWdodCAqLwogCWdwaW9fcmVxdWVzdF9vbmUoU0VDT05EQVJZX0xDRF9HUElPLCBHUElPRl9PVVRfSU5JVF9MT1csCiAJCQkgIlNlY29uZGFyeSBMQ0QgYmFja2xpZ2h0Iik7Ci19CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwXzI0MzBzZHBfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDJfc2V0X2dsb2JhbHNfMjQzeCgpOwotCW9tYXAyNDN4X21hcF9jb21tb25faW8oKTsKKwlzZHAyNDMwX2Rpc3BsYXlfaW5pdCgpOwogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfMjQzMFNEUCwgIk9NQVAyNDMwIHNkcDI0MzAgYm9hcmQiKQogCS8qIE1haW50YWluZXI6IFN5ZWQgS2hhc2ltIC0gVGV4YXMgSW5zdHJ1bWVudHMgSW5jICovCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkubWFwX2lvCQk9IG9tYXBfMjQzMHNkcF9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwXzI0MzBzZHBfaW5pdF9lYXJseSwKKwkubWFwX2lvCQk9IG9tYXAyNDN4X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAyNDMwX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDJfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfMjQzMHNkcF9pbml0LAogCS50aW1lcgkJPSAmb21hcDJfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCmluZGV4IGJkNjAwY2YuLjc3MTQyYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+Ci0jaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZHZpLmg+CiAKICNpbmNsdWRlIDxwbGF0L2dwbWMtc21jOTF4Lmg+CiAKQEAgLTE4Niw4ICsxODYsNyBAQAogCS5wbGF0Zm9ybV9kaXNhYmxlCT0gc2RwMzQzMF9wYW5lbF9kaXNhYmxlX2xjZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBkdmlfcGFuZWwgPSB7Ci0JLm5hbWUJCQk9ICJnZW5lcmljIiwKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgZHZpX3BhbmVsID0gewogCS5wbGF0Zm9ybV9lbmFibGUJPSBzZHAzNDMwX3BhbmVsX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUJPSBzZHAzNDMwX3BhbmVsX2Rpc2FibGVfZHZpLAogfTsKQEAgLTE5NSw3ICsxOTQsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2Ugc2RwMzQzMF9kdmlfZGV2aWNlID0gewogCS5uYW1lCQkJPSAiZHZpIiwKIAkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kcml2ZXJfbmFtZQkJPSAiZHZpIiwKIAkuZGF0YQkJCT0gJmR2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCiB9OwpAQCAtMjI1LDEyICsyMjQsNiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgc2RwMzQzMF9jb25maWdbXSBfX2luaXRkYXRhID0gewogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfMzQzMHNkcF9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKGh5YjE4bTUxMjE2MGFmNl9zZHJjX3BhcmFtcywgTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcDJfaHNtbWNfaW5mbyBtbWNbXSA9IHsKIAl7CiAJCS5tbWMJCT0gMSwKQEAgLTcxOSw2ICs3MTIsNyBAQAogCQlncGlvX3BlbmRvd24gPSBTRFAzNDMwX1RTX0dQSU9fSVJRX1NEUFYxOwogCW9tYXBfYWRzNzg0Nl9pbml0KDEsIGdwaW9fcGVuZG93biwgMzEwLCBOVUxMKTsKIAlib2FyZF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KGh5YjE4bTUxMjE2MGFmNl9zZHJjX3BhcmFtcywgTlVMTCk7CiAJdXNiX211c2JfaW5pdChOVUxMKTsKIAlib2FyZF9zbWM5MXhfaW5pdCgpOwogCWJvYXJkX2ZsYXNoX2luaXQoc2RwX2ZsYXNoX3BhcnRpdGlvbnMsIGNoaXBfc2VsXzM0MzAsIDApOwpAQCAtNzI5LDEwICs3MjMsMTAgQEAKIAogTUFDSElORV9TVEFSVChPTUFQXzM0MzBTRFAsICJPTUFQMzQzMCAzNDMwU0RQIGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBTeWVkIEtoYXNpbSAtIFRleGFzIEluc3RydW1lbnRzIEluYyAqLwotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwXzM0MzBzZHBfaW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNDMwX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfMzQzMHNkcF9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM2MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzYzMHNkcC5jCmluZGV4IGU0ZjM3YjUuLmY1NTIzMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzYzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzYzMHNkcC5jCkBAIC03MCwxMyArNzAsNiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgc2RwX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9zZHBfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhoOG1ieDAwdTBtZXIwZW1fc2RyY19wYXJhbXMsCi0JCQkJICBoOG1ieDAwdTBtZXIwZW1fc2RyY19wYXJhbXMpOwotfQotCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CiAJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKQEAgLTIwNyw2ICsyMDAsOCBAQAogCW9tYXBfYm9hcmRfY29uZmlnID0gc2RwX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShzZHBfY29uZmlnKTsKIAl6b29tX3BlcmlwaGVyYWxzX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChoOG1ieDAwdTBtZXIwZW1fc2RyY19wYXJhbXMsCisJCQkJICBoOG1ieDAwdTBtZXIwZW1fc2RyY19wYXJhbXMpOwogCXpvb21fZGlzcGxheV9pbml0KCk7CiAJYm9hcmRfc21jOTF4X2luaXQoKTsKIAlib2FyZF9mbGFzaF9pbml0KHNkcF9mbGFzaF9wYXJ0aXRpb25zLCBjaGlwX3NlbF9zZHAsIE5BTkRfQlVTV0lEVEhfMTYpOwpAQCAtMjE1LDEwICsyMTAsMTAgQEAKIH0KIAogTUFDSElORV9TVEFSVChPTUFQXzM2MzBTRFAsICJPTUFQIDM2MzBTRFAgYm9hcmQiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwX3NkcF9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM2MzBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9zZHBfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTQ0MzBzZHAuYwppbmRleCBjN2NlZjQ0Li41MTU2NDY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTQ0MzBzZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTQ0MzBzZHAuYwpAQCAtMzgsNiArMzgsOCBAQAogI2luY2x1ZGUgPHBsYXQvbW1jLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwNC1rZXlwYWQuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1ub2tpYS1kc2kuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLXBpY29kbHAuaD4KICNpbmNsdWRlIDxsaW51eC93bDEyeHguaD4KIAogI2luY2x1ZGUgIm11eC5oIgpAQCAtNTIsNiArNTQsOCBAQAogI2RlZmluZSBPTUFQNF9TRkg3NzQxX0VOQUJMRV9HUElPCQkxODgKICNkZWZpbmUgSERNSV9HUElPX0hQRCA2MCAvKiBIb3QgcGx1ZyBwaW4gZm9yIEhETUkgKi8KICNkZWZpbmUgSERNSV9HUElPX0xTX09FIDQxIC8qIExldmVsIHNoaWZ0ZXIgZm9yIEhETUkgKi8KKyNkZWZpbmUgRElTUExBWV9TRUxfR1BJTwk1OQkvKiBMQ0QyL1BpY29ETFAgc3dpdGNoICovCisjZGVmaW5lIERMUF9QT1dFUl9PTl9HUElPCTQwCiAKICNkZWZpbmUgR1BJT19XSUZJX1BNRU5BCQk1NAogI2RlZmluZSBHUElPX1dJRklfSVJRCQk1MwpAQCAtMTI5LDcgKzEzMyw3IEBACiAJS0VZKDcsIDYsIEtFWV9PSyksCiAJS0VZKDcsIDcsIEtFWV9ET1dOKSwKIH07Ci1zdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BhZCBrZXlwYWRfcGFkc1tdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BhZCBrZXlwYWRfcGFkc1tdID0gewogCXsJLm5hbWUgICA9ICJrcGRfY29sMS5rcGRfY29sMSIsCiAJCS5lbmFibGUgPSBPTUFQX1dBS0VVUF9FTiB8IE9NQVBfTVVYX01PREUxLAogCX0sCkBAIC0zNDAsMTEgKzM0NCw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2RwNDQzMF9sY2RfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzZHA0NDMwX2xjZCIsCi0JLmlkCQk9IC0xLAotfTsKLQogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHNkcDQ0MzBfdmJhdF9zdXBwbHlbXSA9IHsKIAlSRUdVTEFUT1JfU1VQUExZKCJ2ZGR2aWJsIiwgInR3bDYwNDAtdmlicmEiKSwKIAlSRUdVTEFUT1JfU1VQUExZKCJ2ZGR2aWJyIiwgInR3bDYwNDAtdmlicmEiKSwKQEAgLTM3NCwyNyArMzczLDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2RwNDQzMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmc2RwNDQzMF9sY2RfZGV2aWNlLAogCSZzZHA0NDMwX2dwaW9fa2V5c19kZXZpY2UsCiAJJnNkcDQ0MzBfbGVkc19ncGlvLAogCSZzZHA0NDMwX2xlZHNfcHdtLAogCSZzZHA0NDMwX3ZiYXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyBzZHA0NDMwX2xjZF9jb25maWcgX19pbml0ZGF0YSA9IHsKLQkuY3RybF9uYW1lCT0gImludGVybmFsIiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIHNkcDQ0MzBfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKLQl7IE9NQVBfVEFHX0xDRCwJCSZzZHA0NDMwX2xjZF9jb25maWcgfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwXzQ0MzBzZHBfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhOVUxMLCBOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBvbWFwX211c2JfYm9hcmRfZGF0YSBtdXNiX2JvYXJkX2RhdGEgPSB7CiAJLmludGVyZmFjZV90eXBlCQk9IE1VU0JfSU5URVJGQUNFX1VUTUksCiAJLm1vZGUJCQk9IE1VU0JfT1RHLApAQCAtNjQ4LDM3ICs2MzIsMjAyIEBACiAJZ3Bpb19mcmVlKEhETUlfR1BJT19IUEQpOwogfQogCitzdGF0aWMgc3RydWN0IG5va2lhX2RzaV9wYW5lbF9kYXRhIGRzaTFfcGFuZWwgPSB7CisJCS5uYW1lCQk9ICJ0YWFsIiwKKwkJLnJlc2V0X2dwaW8JPSAxMDIsCisJCS51c2VfZXh0X3RlCT0gZmFsc2UsCisJCS5leHRfdGVfZ3Bpbwk9IDEwMSwKKwkJLmVzZF9pbnRlcnZhbAk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBzZHA0NDMwX2xjZF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJsY2QiLAorCS5kcml2ZXJfbmFtZQkJPSAidGFhbCIsCisJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RTSSwKKwkuZGF0YQkJCT0gJmRzaTFfcGFuZWwsCisJLnBoeS5kc2kJCT0geworCQkuY2xrX2xhbmUJPSAxLAorCQkuY2xrX3BvbAk9IDAsCisJCS5kYXRhMV9sYW5lCT0gMiwKKwkJLmRhdGExX3BvbAk9IDAsCisJCS5kYXRhMl9sYW5lCT0gMywKKwkJLmRhdGEyX3BvbAk9IDAsCisKKwkJLm1vZHVsZQkJPSAwLAorCX0sCisKKwkuY2xvY2tzID0geworCQkuZGlzcGMgPSB7CisJCQkuY2hhbm5lbCA9IHsKKwkJCQkvKiBMb2dpYyBDbG9jayA9IDE3Mi44IE1IeiAqLworCQkJCS5sY2tfZGl2CT0gMSwKKwkJCQkvKiBQaXhlbCBDbG9jayA9IDM0LjU2IE1IeiAqLworCQkJCS5wY2tfZGl2CT0gNSwKKwkJCQkubGNkX2Nsa19zcmMJPSBPTUFQX0RTU19DTEtfU1JDX0RTSV9QTExfSFNESVZfRElTUEMsCisJCQl9LAorCQkJLmRpc3BjX2ZjbGtfc3JjCT0gT01BUF9EU1NfQ0xLX1NSQ19GQ0ssCisJCX0sCisKKwkJLmRzaSA9IHsKKwkJCS5yZWduCQk9IDE2LAkvKiBGaW50ID0gMi40IE1IeiAqLworCQkJLnJlZ20JCT0gMTgwLAkvKiBERFIgQ2xvY2sgPSAyMTYgTUh6ICovCisJCQkucmVnbV9kaXNwYwk9IDUsCS8qIFBMTDFfQ0xLMSA9IDE3Mi44IE1IeiAqLworCQkJLnJlZ21fZHNpCT0gNSwJLyogUExMMV9DTEsyID0gMTcyLjggTUh6ICovCisKKwkJCS5scF9jbGtfZGl2CT0gMTAsCS8qIExQIENsb2NrID0gOC42NCBNSHogKi8KKwkJCS5kc2lfZmNsa19zcmMJPSBPTUFQX0RTU19DTEtfU1JDX0RTSV9QTExfSFNESVZfRFNJLAorCQl9LAorCX0sCisJLmNoYW5uZWwJCT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QsCit9OworCitzdGF0aWMgc3RydWN0IG5va2lhX2RzaV9wYW5lbF9kYXRhIGRzaTJfcGFuZWwgPSB7CisJCS5uYW1lCQk9ICJ0YWFsIiwKKwkJLnJlc2V0X2dwaW8JPSAxMDQsCisJCS51c2VfZXh0X3RlCT0gZmFsc2UsCisJCS5leHRfdGVfZ3Bpbwk9IDEwMywKKwkJLmVzZF9pbnRlcnZhbAk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBzZHA0NDMwX2xjZDJfZGV2aWNlID0geworCS5uYW1lCQkJPSAibGNkMiIsCisJLmRyaXZlcl9uYW1lCQk9ICJ0YWFsIiwKKwkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFNJLAorCS5kYXRhCQkJPSAmZHNpMl9wYW5lbCwKKwkucGh5LmRzaQkJPSB7CisJCS5jbGtfbGFuZQk9IDEsCisJCS5jbGtfcG9sCT0gMCwKKwkJLmRhdGExX2xhbmUJPSAyLAorCQkuZGF0YTFfcG9sCT0gMCwKKwkJLmRhdGEyX2xhbmUJPSAzLAorCQkuZGF0YTJfcG9sCT0gMCwKKworCQkubW9kdWxlCQk9IDEsCisJfSwKKworCS5jbG9ja3MgPSB7CisJCS5kaXNwYyA9IHsKKwkJCS5jaGFubmVsID0geworCQkJCS8qIExvZ2ljIENsb2NrID0gMTcyLjggTUh6ICovCisJCQkJLmxja19kaXYJPSAxLAorCQkJCS8qIFBpeGVsIENsb2NrID0gMzQuNTYgTUh6ICovCisJCQkJLnBja19kaXYJPSA1LAorCQkJCS5sY2RfY2xrX3NyYwk9IE9NQVBfRFNTX0NMS19TUkNfRFNJMl9QTExfSFNESVZfRElTUEMsCisJCQl9LAorCQkJLmRpc3BjX2ZjbGtfc3JjCT0gT01BUF9EU1NfQ0xLX1NSQ19GQ0ssCisJCX0sCisKKwkJLmRzaSA9IHsKKwkJCS5yZWduCQk9IDE2LAkvKiBGaW50ID0gMi40IE1IeiAqLworCQkJLnJlZ20JCT0gMTgwLAkvKiBERFIgQ2xvY2sgPSAyMTYgTUh6ICovCisJCQkucmVnbV9kaXNwYwk9IDUsCS8qIFBMTDFfQ0xLMSA9IDE3Mi44IE1IeiAqLworCQkJLnJlZ21fZHNpCT0gNSwJLyogUExMMV9DTEsyID0gMTcyLjggTUh6ICovCisKKwkJCS5scF9jbGtfZGl2CT0gMTAsCS8qIExQIENsb2NrID0gOC42NCBNSHogKi8KKwkJCS5kc2lfZmNsa19zcmMJPSBPTUFQX0RTU19DTEtfU1JDX0RTSTJfUExMX0hTRElWX0RTSSwKKwkJfSwKKwl9LAorCS5jaGFubmVsCQk9IE9NQVBfRFNTX0NIQU5ORUxfTENEMiwKK307CisKK3N0YXRpYyB2b2lkIHNkcDQ0MzBfbGNkX2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXIgPSBncGlvX3JlcXVlc3Rfb25lKGRzaTFfcGFuZWwucmVzZXRfZ3BpbywgR1BJT0ZfRElSX09VVCwKKwkJImxjZDFfcmVzZXRfZ3BpbyIpOworCWlmIChyKQorCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgZ2V0IGxjZDFfcmVzZXRfZ3Bpb1xuIiwgX19mdW5jX18pOworCisJciA9IGdwaW9fcmVxdWVzdF9vbmUoZHNpMl9wYW5lbC5yZXNldF9ncGlvLCBHUElPRl9ESVJfT1VULAorCQkibGNkMl9yZXNldF9ncGlvIik7CisJaWYgKHIpCisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgbGNkMl9yZXNldF9ncGlvXG4iLCBfX2Z1bmNfXyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIHNkcDQ0MzBfaGRtaV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiaGRtaSIsCiAJLmRyaXZlcl9uYW1lID0gImhkbWlfcGFuZWwiLAogCS50eXBlID0gT01BUF9ESVNQTEFZX1RZUEVfSERNSSwKLQkuY2xvY2tzCT0gewotCQkuZGlzcGMJPSB7Ci0JCQkuZGlzcGNfZmNsa19zcmMJPSBPTUFQX0RTU19DTEtfU1JDX0ZDSywKLQkJfSwKLQkJLmhkbWkJPSB7Ci0JCQkucmVnbgk9IDE1LAotCQkJLnJlZ20yCT0gMSwKLQkJfSwKLQl9LAogCS5wbGF0Zm9ybV9lbmFibGUgPSBzZHA0NDMwX3BhbmVsX2VuYWJsZV9oZG1pLAogCS5wbGF0Zm9ybV9kaXNhYmxlID0gc2RwNDQzMF9wYW5lbF9kaXNhYmxlX2hkbWksCiAJLmNoYW5uZWwgPSBPTUFQX0RTU19DSEFOTkVMX0RJR0lULAogfTsKIAorc3RhdGljIHN0cnVjdCBwaWNvZGxwX3BhbmVsX2RhdGEgc2RwNDQzMF9waWNvZGxwX3BkYXRhID0geworCS5waWNvZGxwX2FkYXB0ZXJfaWQJPSAyLAorCS5lbXVfZG9uZV9ncGlvCQk9IDQ0LAorCS5wd3Jnb29kX2dwaW8JCT0gNDUsCit9OworCitzdGF0aWMgdm9pZCBzZHA0NDMwX3BpY29kbHBfaW5pdCh2b2lkKQoreworCWludCByOworCWNvbnN0IHN0cnVjdCBncGlvIHBpY29kbHBfZ3Bpb3NbXSA9IHsKKwkJe0RMUF9QT1dFUl9PTl9HUElPLCBHUElPRl9PVVRfSU5JVF9MT1csCisJCQkiRExQIFBPV0VSIE9OIn0sCisJCXtzZHA0NDMwX3BpY29kbHBfcGRhdGEuZW11X2RvbmVfZ3BpbywgR1BJT0ZfSU4sCisJCQkiRExQIEVNVSBET05FIn0sCisJCXtzZHA0NDMwX3BpY29kbHBfcGRhdGEucHdyZ29vZF9ncGlvLCBHUElPRl9PVVRfSU5JVF9MT1csCisJCQkiRExQIFBXUkdPT0QifSwKKwl9OworCisJciA9IGdwaW9fcmVxdWVzdF9hcnJheShwaWNvZGxwX2dwaW9zLCBBUlJBWV9TSVpFKHBpY29kbHBfZ3Bpb3MpKTsKKwlpZiAocikKKwkJcHJfZXJyKCJDYW5ub3QgcmVxdWVzdCBQaWNvRExQIEdQSU9zLCBlcnJvciAlZFxuIiwgcik7Cit9CisKK3N0YXRpYyBpbnQgc2RwNDQzMF9wYW5lbF9lbmFibGVfcGljb2RscChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJZ3Bpb19zZXRfdmFsdWUoRElTUExBWV9TRUxfR1BJTywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoRExQX1BPV0VSX09OX0dQSU8sIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNkcDQ0MzBfcGFuZWxfZGlzYWJsZV9waWNvZGxwKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlncGlvX3NldF92YWx1ZShETFBfUE9XRVJfT05fR1BJTywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoRElTUExBWV9TRUxfR1BJTywgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIHNkcDQ0MzBfcGljb2RscF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJwaWNvZGxwIiwKKwkuZHJpdmVyX25hbWUJCT0gInBpY29kbHBfcGFuZWwiLAorCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCisJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAorCS5jaGFubmVsCQk9IE9NQVBfRFNTX0NIQU5ORUxfTENEMiwKKwkucGxhdGZvcm1fZW5hYmxlCT0gc2RwNDQzMF9wYW5lbF9lbmFibGVfcGljb2RscCwKKwkucGxhdGZvcm1fZGlzYWJsZQk9IHNkcDQ0MzBfcGFuZWxfZGlzYWJsZV9waWNvZGxwLAorCS5kYXRhCQkJPSAmc2RwNDQzMF9waWNvZGxwX3BkYXRhLAorfTsKKwogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKnNkcDQ0MzBfZHNzX2RldmljZXNbXSA9IHsKKwkmc2RwNDQzMF9sY2RfZGV2aWNlLAorCSZzZHA0NDMwX2xjZDJfZGV2aWNlLAogCSZzZHA0NDMwX2hkbWlfZGV2aWNlLAorCSZzZHA0NDMwX3BpY29kbHBfZGV2aWNlLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvIHNkcDQ0MzBfZHNzX2RhdGEgPSB7CiAJLm51bV9kZXZpY2VzCT0gQVJSQVlfU0laRShzZHA0NDMwX2Rzc19kZXZpY2VzKSwKIAkuZGV2aWNlcwk9IHNkcDQ0MzBfZHNzX2RldmljZXMsCi0JLmRlZmF1bHRfZGV2aWNlCT0gJnNkcDQ0MzBfaGRtaV9kZXZpY2UsCisJLmRlZmF1bHRfZGV2aWNlCT0gJnNkcDQ0MzBfbGNkX2RldmljZSwKIH07CiAKLXZvaWQgb21hcF80NDMwc2RwX2Rpc3BsYXlfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgb21hcF80NDMwc2RwX2Rpc3BsYXlfaW5pdCh2b2lkKQogeworCWludCByOworCisJLyogRW5hYmxlIExDRDIgYnkgZGVmYXVsdCAoaW5zdGVhZCBvZiBQaWNvIERMUCkgKi8KKwlyID0gZ3Bpb19yZXF1ZXN0X29uZShESVNQTEFZX1NFTF9HUElPLCBHUElPRl9PVVRfSU5JVF9ISUdILAorCQkJImRpc3BsYXlfc2VsIik7CisJaWYgKHIpCisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgZGlzcGxheV9zZWwgR1BJT1xuIiwgX19mdW5jX18pOworCisJc2RwNDQzMF9sY2RfaW5pdCgpOwogCXNkcDQ0MzBfaGRtaV9tdXhfaW5pdCgpOworCXNkcDQ0MzBfcGljb2RscF9pbml0KCk7CiAJb21hcF9kaXNwbGF5X2luaXQoJnNkcDQ0MzBfZHNzX2RhdGEpOwogfQogCkBAIC04MDIsMTMgKzk1MSwxMSBAQAogCQlwYWNrYWdlID0gT01BUF9QQUNLQUdFX0NCTDsKIAlvbWFwNF9tdXhfaW5pdChib2FyZF9tdXgsIE5VTEwsIHBhY2thZ2UpOwogCi0Jb21hcF9ib2FyZF9jb25maWcgPSBzZHA0NDMwX2NvbmZpZzsKLQlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShzZHA0NDMwX2NvbmZpZyk7Ci0KIAlvbWFwNF9pMmNfaW5pdCgpOwogCW9tYXBfc2ZoNzc0MXByb3hfaW5pdCgpOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNkcDQ0MzBfZGV2aWNlcywgQVJSQVlfU0laRShzZHA0NDMwX2RldmljZXMpKTsKIAlib2FyZF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KE5VTEwsIE5VTEwpOwogCW9tYXA0X3NkcDQ0MzBfd2lmaV9pbml0KCk7CiAJb21hcDRfdHdsNjAzMF9oc21tY19pbml0KG1tYyk7CiAKQEAgLTgzMCwxOCArOTc3LDEyIEBACiAJb21hcF80NDMwc2RwX2Rpc3BsYXlfaW5pdCgpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF80NDMwc2RwX21hcF9pbyh2b2lkKQotewotCW9tYXAyX3NldF9nbG9iYWxzXzQ0M3goKTsKLQlvbWFwNDR4eF9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoT01BUF80NDMwU0RQLCAiT01BUDQ0MzAgNDQzMFNEUCBib2FyZCIpCiAJLyogTWFpbnRhaW5lcjogU2FudG9zaCBTaGlsaW1rYXIgLSBUZXhhcyBJbnN0cnVtZW50cyBJbmMgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5tYXBfaW8JCT0gb21hcF80NDMwc2RwX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfNDQzMHNkcF9pbml0X2Vhcmx5LAorCS5tYXBfaW8JCT0gb21hcDRfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDQ0MzBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBnaWNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfNDQzMHNkcF9pbml0LAogCS50aW1lcgkJPSAmb21hcDRfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2NyYW5lLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2NyYW5lLmMKaW5kZXggOTMzZTkzNS4uNzgzNDUzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdjcmFuZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3Y3JhbmUuYwpAQCAtNDcsMTIgKzQ3LDYgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pbml0IGFtMzUxN19jcmFuZV9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IHVzYmhzX29tYXBfYm9hcmRfZGF0YSB1c2Joc19iZGF0YSBfX2luaXRkYXRhID0gewogCS5wb3J0X21vZGVbMF0gPSBPTUFQX0VIQ0lfUE9SVF9NT0RFX1BIWSwKIAkucG9ydF9tb2RlWzFdID0gT01BUF9VU0JIU19QT1JUX01PREVfVU5VU0VELApAQCAtNzAsNiArNjQsNyBAQAogCiAJb21hcDNfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfQ0JCKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CiAKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IGFtMzUxN19jcmFuZV9jb25maWc7CiAJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoYW0zNTE3X2NyYW5lX2NvbmZpZyk7CkBAIC05OCwxMCArOTMsMTAgQEAKIH0KIAogTUFDSElORV9TVEFSVChDUkFORUJPQVJELCAiQU0zNTE3LzA1IENSQU5FQk9BUkQiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBhbTM1MTdfY3JhbmVfaW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IGFtMzV4eF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBhbTM1MTdfY3JhbmVfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdldm0uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMKaW5kZXggZjMwMDZjMy4uZDMxNGYwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdldm0uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2V2bS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZHZpLmg+CiAKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJjb250cm9sLmgiCkBAIC0zMzMsOCArMzM0LDcgQEAKIAlkdmlfZW5hYmxlZCA9IDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBkdmlfcGFuZWwgPSB7Ci0JLm5hbWUJCQk9ICJnZW5lcmljIiwKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgZHZpX3BhbmVsID0gewogCS5wbGF0Zm9ybV9lbmFibGUJPSBhbTM1MTdfZXZtX3BhbmVsX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUJPSBhbTM1MTdfZXZtX3BhbmVsX2Rpc2FibGVfZHZpLAogfTsKQEAgLTM0Miw3ICszNDIsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgYW0zNTE3X2V2bV9kdmlfZGV2aWNlID0gewogCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCiAJLm5hbWUJCQk9ICJkdmkiLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kcml2ZXJfbmFtZQkJPSAiZHZpIiwKIAkuZGF0YQkJCT0gJmR2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCiB9OwpAQCAtMzYyLDExICszNjIsNiBAQAogLyoKICAqIEJvYXJkIGluaXRpYWxpemF0aW9uCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBhbTM1MTdfZXZtX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7Ci19CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9tdXNiX2JvYXJkX2RhdGEgbXVzYl9ib2FyZF9kYXRhID0gewogCS5pbnRlcmZhY2VfdHlwZSAgICAgICAgID0gTVVTQl9JTlRFUkZBQ0VfVUxQSSwKQEAgLTQ2OSw2ICs0NjQsNyBAQAogCWFtMzUxN19ldm1faTJjX2luaXQoKTsKIAlvbWFwX2Rpc3BsYXlfaW5pdCgmYW0zNTE3X2V2bV9kc3NfZGF0YSk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KE5VTEwsIE5VTEwpOwogCiAJLyogQ29uZmlndXJlIEdQSU8gZm9yIEVIQ0kgcG9ydCAqLwogCW9tYXBfbXV4X2luaXRfZ3Bpbyg1NywgT01BUF9QSU5fT1VUUFVUKTsKQEAgLTQ5MCwxMCArNDg2LDEwIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUDM1MTdFVk0sICJPTUFQMzUxNy9BTTM1MTcgRVZNIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gYW0zNTE3X2V2bV9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gYW0zNXh4X2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGFtMzUxN19ldm1faW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFwb2xsb24uYwppbmRleCA3MDIxMTcwLi5kZTgxMzRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFwb2xsb24uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFwb2xsb24uYwpAQCAtNDAsNiArNDAsOSBAQAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CiAKKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorCiAjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgogCkBAIC0xNDksMTEgKzE1Miw2IEBACiAJLnJlc291cmNlCT0gYXBvbGxvbl9zbWM5MXhfcmVzb3VyY2VzLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXBvbGxvbl9sY2RfZGV2aWNlID0gewotCS5uYW1lCQk9ICJhcG9sbG9uX2xjZCIsCi0JLmlkCQk9IC0xLAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2xlZF9jb25maWcgYXBvbGxvbl9sZWRfY29uZmlnW10gPSB7CiAJewogCQkuY2Rldgk9IHsKQEAgLTE5MSw3ICsxODksNiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFwb2xsb25fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmFwb2xsb25fb25lbmFuZF9kZXZpY2UsCiAJJmFwb2xsb25fc21jOTF4X2RldmljZSwKLQkmYXBvbGxvbl9sY2RfZGV2aWNlLAogCSZhcG9sbG9uX2xlZF9kZXZpY2UsCiB9OwogCkBAIC0yNjUsMTkgKzI2MiwyNyBAQAogCS5waW5zWzBdCT0gNiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnIGFwb2xsb25fbGNkX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5jdHJsX25hbWUJPSAiaW50ZXJuYWwiLAorc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGFwb2xsb25fcGFuZWxfZGF0YSA9IHsKKwkubmFtZQkJCT0gImFwb2xsb24iLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgYXBvbGxvbl9jb25maWdbXSBfX2luaXRkYXRhID0gewotCXsgT01BUF9UQUdfTENELAkJJmFwb2xsb25fbGNkX2NvbmZpZyB9LAorc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgYXBvbGxvbl9sY2RfZGV2aWNlID0geworCS5uYW1lCQkJPSAibGNkIiwKKwkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAorCS5waHkuZHBpLmRhdGFfbGluZXMJPSAxOCwKKwkuZGF0YQkJCT0gJmFwb2xsb25fcGFuZWxfZGF0YSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2Fwb2xsb25faW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhOVUxMLCBOVUxMKTsKLX0KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICphcG9sbG9uX2Rzc19kZXZpY2VzW10gPSB7CisJJmFwb2xsb25fbGNkX2RldmljZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyBhcG9sbG9uX2Rzc19kYXRhID0geworCS5udW1fZGV2aWNlcwk9IEFSUkFZX1NJWkUoYXBvbGxvbl9kc3NfZGV2aWNlcyksCisJLmRldmljZXMJPSBhcG9sbG9uX2Rzc19kZXZpY2VzLAorCS5kZWZhdWx0X2RldmljZQk9ICZhcG9sbG9uX2xjZF9kZXZpY2UsCit9OwogCiBzdGF0aWMgc3RydWN0IGdwaW8gYXBvbGxvbl9ncGlvX2xlZHNbXSBfX2luaXRkYXRhID0gewogCXsgTEVEMF9HUElPMTMsIEdQSU9GX09VVF9JTklUX0xPVywgIkxFRDAiIH0sIC8qIExFRDAgLSBBQTEwICovCkBAIC0zMTQsOCArMzE5LDYgQEAKIAl1MzIgdjsKIAogCW9tYXAyNDIwX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX1pBQyk7Ci0Jb21hcF9ib2FyZF9jb25maWcgPSBhcG9sbG9uX2NvbmZpZzsKLQlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShhcG9sbG9uX2NvbmZpZyk7CiAKIAlhcG9sbG9uX2luaXRfc21jOTF4KCk7CiAJYXBvbGxvbl9sZWRfaW5pdCgpOwpAQCAtMzQwLDIwICszNDMsMTYgQEAKIAkgKi8KIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhcG9sbG9uX2RldmljZXMsIEFSUkFZX1NJWkUoYXBvbGxvbl9kZXZpY2VzKSk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9hcG9sbG9uX21hcF9pbyh2b2lkKQotewotCW9tYXAyX3NldF9nbG9iYWxzXzI0MngoKTsKLQlvbWFwMjQyeF9tYXBfY29tbW9uX2lvKCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CisJb21hcF9kaXNwbGF5X2luaXQoJmFwb2xsb25fZHNzX2RhdGEpOwogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfQVBPTExPTiwgIk9NQVAyNHh4IEFwb2xsb24iKQogCS8qIE1haW50YWluZXI6IEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkubWFwX2lvCQk9IG9tYXBfYXBvbGxvbl9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwX2Fwb2xsb25faW5pdF9lYXJseSwKKwkubWFwX2lvCQk9IG9tYXAyNDJ4X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAyNDIwX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDJfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfYXBvbGxvbl9pbml0LAogCS50aW1lcgkJPSAmb21hcDJfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUuYwppbmRleCAzYWY4YWFiLi5iZDFiY2FjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kdmkuaD4KICNpbmNsdWRlIDxwbGF0L21jc3BpLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0yNDIsOCArMjQzLDcgQEAKIAkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMTgsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgZHZpX3BhbmVsID0gewotCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCitzdGF0aWMgc3RydWN0IHBhbmVsX2R2aV9wbGF0Zm9ybV9kYXRhIGR2aV9wYW5lbCA9IHsKIAkucGxhdGZvcm1fZW5hYmxlCT0gY21fdDM1X3BhbmVsX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUJPSBjbV90MzVfcGFuZWxfZGlzYWJsZV9kdmksCiB9OwpAQCAtMjUxLDcgKzI1MSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBjbV90MzVfZHZpX2RldmljZSA9IHsKIAkubmFtZQkJCT0gImR2aSIsCiAJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLQkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkuZHJpdmVyX25hbWUJCT0gImR2aSIsCiAJLmRhdGEJCQk9ICZkdmlfcGFuZWwsCiAJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAogfTsKQEAgLTQ3MSwxMyArNDcxLDYgQEAKIAlvbWFwM19wbWljX2luaXQoInRwczY1OTMwIiwgJmNtX3QzNV90d2xkYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNtX3QzNV9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCi0JCQkgICAgIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwotfQotCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CiAJLyogbkNTIGFuZCBJUlEgZm9yIENNLVQzNSBldGhlcm5ldCAqLwpAQCAtNjEwLDYgKzYwMyw4IEBACiAJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoY21fdDM1X2NvbmZpZyk7CiAJb21hcDNfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfQ1VTKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKKwkJCSAgICAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7CiAJY21fdDM1X2luaXRfaTJjKCk7CiAJb21hcF9hZHM3ODQ2X2luaXQoMSwgQ01fVDM1X0dQSU9fUEVORE9XTiwgMCwgTlVMTCk7CiAJY21fdDM1X2luaXRfZXRoZXJuZXQoKTsKQEAgLTYzNCwyMCArNjI5LDIwIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ01fVDM1LCAiQ29tcHVsYWIgQ00tVDM1IikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gY21fdDM1X2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBvbWFwMzV4eF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBjbV90MzVfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChDTV9UMzczMCwgIkNvbXB1bGFiIENNLVQzNzMwIikKLQkuYm9vdF9wYXJhbXMgICAgPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5yZXNlcnZlICAgICAgICA9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvICAgICAgICAgPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkgICAgID0gY21fdDM1X2luaXRfZWFybHksCisJLmluaXRfZWFybHkgICAgID0gb21hcDM2MzBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgICAgICAgPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lICAgPSBjbV90MzczMF9pbml0LAogCS50aW1lciAgICAgICAgICA9ICZvbWFwM190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1MTcuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1MTcuYwppbmRleCAwNWM3MmY0Li4zZjRkYzY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNTE3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUxNy5jCkBAIC0yNTEsMTIgKzI1MSw2IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBjbV90MzUxN19jb25maWdbXSBfX2luaXRkYXRhID0gewogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGNtX3QzNTE3X2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7Ci19Ci0KICNpZmRlZiBDT05GSUdfT01BUF9NVVgKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKIAkvKiBHUElPMTg2IC0gR3JlZW4gTEVEICovCkBAIC0yODksNiArMjgzLDcgQEAKIHsKIAlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChOVUxMLCBOVUxMKTsKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IGNtX3QzNTE3X2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShjbV90MzUxN19jb25maWcpOwogCWNtX3QzNTE3X2luaXRfbGVkcygpOwpAQCAtMjk5LDEwICsyOTQsMTAgQEAKIH0KIAogTUFDSElORV9TVEFSVChDTV9UMzUxNywgIkNvbXB1bGFiIENNLVQzNTE3IikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlICAgICAgICA9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IGNtX3QzNTE3X2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBhbTM1eHhfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gY21fdDM1MTdfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1kZXZraXQ4MDAwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWRldmtpdDgwMDAuYwppbmRleCBiNjAwMmVjLi45MDE1NGU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWRldmtpdDgwMDAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWRldmtpdDgwMDAuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZ2VuZXJpYy1kcGkuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWR2aS5oPgogCiAjaW5jbHVkZSA8cGxhdC9tY3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KQEAgLTEzOSw3ICsxNDAsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGxjZF9wYW5lbCA9IHsKLQkubmFtZQkJCT0gImdlbmVyaWMiLAorCS5uYW1lCQkJPSAiaW5ub2x1eF9hdDA3MHRuODMiLAogCS5wbGF0Zm9ybV9lbmFibGUgICAgICAgID0gZGV2a2l0ODAwMF9wYW5lbF9lbmFibGVfbGNkLAogCS5wbGF0Zm9ybV9kaXNhYmxlICAgICAgID0gZGV2a2l0ODAwMF9wYW5lbF9kaXNhYmxlX2xjZCwKIH07CkBAIC0xNTIsOCArMTUzLDcgQEAKIAkucGh5LmRwaS5kYXRhX2xpbmVzICAgICA9IDI0LAogfTsKIAotc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKLQkubmFtZQkJCT0gImdlbmVyaWMiLAorc3RhdGljIHN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YSBkdmlfcGFuZWwgPSB7CiAJLnBsYXRmb3JtX2VuYWJsZSAgICAgICAgPSBkZXZraXQ4MDAwX3BhbmVsX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUgICAgICAgPSBkZXZraXQ4MDAwX3BhbmVsX2Rpc2FibGVfZHZpLAogfTsKQEAgLTE2MSw3ICsxNjEsNyBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgZGV2a2l0ODAwMF9kdmlfZGV2aWNlID0gewogCS5uYW1lICAgICAgICAgICAgICAgICAgID0gImR2aSIsCiAJLnR5cGUgICAgICAgICAgICAgICAgICAgPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCi0JLmRyaXZlcl9uYW1lICAgICAgICAgICAgPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kcml2ZXJfbmFtZSAgICAgICAgICAgID0gImR2aSIsCiAJLmRhdGEJCQk9ICZkdmlfcGFuZWwsCiAJLnBoeS5kcGkuZGF0YV9saW5lcyAgICAgPSAyNCwKIH07CkBAIC0yMjYsNyArMjI2LDYgQEAKIHsKIAlpbnQgcmV0OwogCi0Jb21hcF9tdXhfaW5pdF9ncGlvKDI5LCBPTUFQX1BJTl9JTlBVVCk7CiAJLyogZ3BpbyArIDAgaXMgIm1tYzBfY2QiIChpbnB1dC9JUlEpICovCiAJbW1jWzBdLmdwaW9fY2QgPSBncGlvICsgMDsKIAlvbWFwMl9oc21tY19pbml0KG1tYyk7CkBAIC0yNjcsNyArMjY2LDcgQEAKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGRldmtpdDgwMDBfdnBsbDFfc3VwcGxpZXNbXSA9IHsKIAlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzIiksCi0JUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc2kxIiksCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc2kuMCIpLAogfTsKIAogLyogVk1NQzEgZm9yIE1NQzEgcGlucyBDTUQsIENMSywgREFUMC4uREFUMyAoMjAgbUEsIHBsdXMgY2FyZCA9PSBtYXggMjIwIG1BKSAqLwpAQCAtMzk3LDE5ICszOTYsNiBAQAogCX0sCiB9OwogCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBkZXZraXQ4MDAwX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKLQkJCQkgIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZGV2a2l0ODAwMF9pbml0X2lycSh2b2lkKQotewotCW9tYXAzX2luaXRfaXJxKCk7Ci19Ci0KICNkZWZpbmUgT01BUF9ETTkwMDBfQkFTRQkweDJjMDAwMDAwCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb21hcF9kbTkwMDBfcmVzb3VyY2VzW10gPSB7CkBAIC02NDUsNiArNjMxLDggQEAKIHsKIAlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DVVMpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAorCQkJCSAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7CiAKIAlvbWFwX2RtOTAwMF9pbml0KCk7CiAKQEAgLTY2NywxMSArNjU1LDExIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoREVWS0lUODAwMCwgIk9NQVAzIERldmtpdDgwMDAiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBkZXZraXQ4MDAwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZGV2a2l0ODAwMF9pbml0X2lycSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNXh4X2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGRldmtpdDgwMDBfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3NlY3VyZV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWZsYXNoLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWZsYXNoLmMKaW5kZXggYWExYjBjYi4uMzBhNmY1MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1mbGFzaC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guYwpAQCAtMTQ4LDExICsxNDgsNiBAQAogCWJvYXJkX25hbmRfZGF0YS5ncG1jX2lycSA9IE9NQVBfR1BNQ19JUlFfQkFTRSArIGNzOwogCWdwbWNfbmFuZF9pbml0KCZib2FyZF9uYW5kX2RhdGEpOwogfQotI2Vsc2UKLXZvaWQKLV9faW5pdCBib2FyZF9uYW5kX2luaXQoc3RydWN0IG10ZF9wYXJ0aXRpb24gKm5hbmRfcGFydHMsIHU4IG5yX3BhcnRzLCB1OCBjcywgaW50IG5hbmRfdHlwZSkKLXsKLX0KICNlbmRpZiAvKiBDT05GSUdfTVREX05BTkRfT01BUDIgfHwgQ09ORklHX01URF9OQU5EX09NQVAyX01PRFVMRSAqLwogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guaAppbmRleCBjMjQwYTNmLi5kMjU1MDNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWZsYXNoLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1mbGFzaC5oCkBAIC0yNCw3ICsyNCwyNiBAQAogCWludCBucl9wYXJ0czsKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMikgfHwgXAorCQlkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMl9NT0RVTEUpIHx8IFwKKwkJZGVmaW5lZChDT05GSUdfTVREX09ORU5BTkRfT01BUDIpIHx8IFwKKwkJZGVmaW5lZChDT05GSUdfTVREX09ORU5BTkRfT01BUDJfTU9EVUxFKQogZXh0ZXJuIHZvaWQgYm9hcmRfZmxhc2hfaW5pdChzdHJ1Y3QgZmxhc2hfcGFydGl0aW9ucyBbXSwKIAkJCQljaGFyIGNoaXBfc2VsW11bR1BNQ19DU19OVU1dLCBpbnQgbmFuZF90eXBlKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYm9hcmRfZmxhc2hfaW5pdChzdHJ1Y3QgZmxhc2hfcGFydGl0aW9ucyBwYXJ0W10sCisJCQkJY2hhciBjaGlwX3NlbFtdW0dQTUNfQ1NfTlVNXSwgaW50IG5hbmRfdHlwZSkKK3sKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfT01BUDIpIHx8IFwKKwkJZGVmaW5lZChDT05GSUdfTVREX05BTkRfT01BUDJfTU9EVUxFKQogZXh0ZXJuIHZvaWQgYm9hcmRfbmFuZF9pbml0KHN0cnVjdCBtdGRfcGFydGl0aW9uICpuYW5kX3BhcnRzLAogCQkJCQl1OCBucl9wYXJ0cywgdTggY3MsIGludCBuYW5kX3R5cGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBib2FyZF9uYW5kX2luaXQoc3RydWN0IG10ZF9wYXJ0aXRpb24gKm5hbmRfcGFydHMsCisJCQkJCXU4IG5yX3BhcnRzLCB1OCBjcywgaW50IG5hbmRfdHlwZSkKK3sKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWdlbmVyaWMuYwppbmRleCA1NGRiNDFhLi5mYjU1ZmEzZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKQEAgLTEsNzYgKzEsMTY1IEBACiAvKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKLSAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KICAqIEF1dGhvcjogUGF1bCBNdW5kdCA8cGF1bC5tdW5kdEBub2tpYS5jb20+CiAgKgotICogTW9kaWZpZWQgZnJvbSBtYWNoLW9tYXAvb21hcDEvYm9hcmQtZ2VuZXJpYy5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCiAgKgotICogQ29kZSBmb3IgZ2VuZXJpYyBPTUFQMiBib2FyZC4gU2hvdWxkIHdvcmsgb24gbWFueSBPTUFQMiBzeXN0ZW1zIHdoZXJlCi0gKiB0aGUgYm9vdGxvYWRlciBwYXNzZXMgdGhlIGJvYXJkLXNwZWNpZmljIGRhdGEgdG8gdGhlIGtlcm5lbC4KLSAqIERvIG5vdCBwdXQgYW55IGJvYXJkIHNwZWNpZmljIGNvZGUgdG8gdGhpcyBmaWxlOyBjcmVhdGUgYSBuZXcgbWFjaGluZQotICogdHlwZSBpZiB5b3UgbmVlZCBjdXN0b20gbG93LWxldmVsIGluaXRpYWxpemF0aW9ucy4KKyAqIE1vZGlmaWVkIGZyb20gdGhlIG9yaWdpbmFsIG1hY2gtb21hcC9vbWFwMi9ib2FyZC1nZW5lcmljLmMgZGlkIGJ5IFBhdWwKKyAqIHRvIHN1cHBvcnQgdGhlIE9NQVAyKyBkZXZpY2UgdHJlZSBib2FyZHMgd2l0aCBhbiB1bmlxdWUgYm9hcmQgZmlsZS4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9vbWFwNC1jb21tb24uaD4KKyNpbmNsdWRlICJjb21tb24tYm9hcmQtZGV2aWNlcy5oIgogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBnZW5lcmljX2NvbmZpZ1tdID0geworLyoKKyAqIFhYWDogU3RpbGwgbmVlZGVkIHRvIGJvb3QgdW50aWwgdGhlIGkyYyAmIHR3bCBkcml2ZXIgaXMgYWRhcHRlZCB0bworICogZGV2aWNlLXRyZWUKKyAqLworI2lmZGVmIENPTkZJR19BUkNIX09NQVA0CitzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBzZHA0NDMwX3R3bGRhdGEgPSB7CisJLmlycV9iYXNlCT0gVFdMNjAzMF9JUlFfQkFTRSwKKwkuaXJxX2VuZAk9IFRXTDYwMzBfSVJRX0VORCwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2dlbmVyaWNfaW5pdF9lYXJseSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG9tYXA0X2kyY19pbml0KHZvaWQpCiB7Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOworCW9tYXA0X3BtaWNfaW5pdCgidHdsNjAzMCIsICZzZHA0NDMwX3R3bGRhdGEpOwogfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMworc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgYmVhZ2xlX3R3bGRhdGEgPSB7CisJLmlycV9iYXNlCT0gVFdMNDAzMF9JUlFfQkFTRSwKKwkuaXJxX2VuZAk9IFRXTDQwMzBfSVJRX0VORCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19pMmNfaW5pdCh2b2lkKQoreworCW9tYXAzX3BtaWNfaW5pdCgidHdsNDAzMCIsICZiZWFnbGVfdHdsZGF0YSk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF9kdF9tYXRjaF90YWJsZVtdIF9faW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLG9tYXAtaW5mcmEiLCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgaW50Y19tYXRjaFtdIF9faW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwMy1pbnRjIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTktZ2ljIiwgfSwKKwl7IH0KK307CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2dlbmVyaWNfaW5pdCh2b2lkKQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBpbnRjX21hdGNoKTsKKwlpZiAobm9kZSkKKwkJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5vZGUsIDApOworCiAJb21hcF9zZXJpYWxfaW5pdCgpOwotCW9tYXBfYm9hcmRfY29uZmlnID0gZ2VuZXJpY19jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoZ2VuZXJpY19jb25maWcpOworCW9tYXBfc2RyY19pbml0KE5VTEwsIE5VTEwpOworCisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb21hcF9kdF9tYXRjaF90YWJsZSwgTlVMTCwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2dlbmVyaWNfbWFwX2lvKHZvaWQpCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDQKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwNF9pbml0KHZvaWQpCiB7Ci0JaWYgKGNwdV9pc19vbWFwMjQyeCgpKSB7Ci0JCW9tYXAyX3NldF9nbG9iYWxzXzI0MngoKTsKLQkJb21hcDI0MnhfbWFwX2NvbW1vbl9pbygpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAyNDN4KCkpIHsKLQkJb21hcDJfc2V0X2dsb2JhbHNfMjQzeCgpOwotCQlvbWFwMjQzeF9tYXBfY29tbW9uX2lvKCk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSkgewotCQlvbWFwMl9zZXRfZ2xvYmFsc18zeHh4KCk7Ci0JCW9tYXAzNHh4X21hcF9jb21tb25faW8oKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7Ci0JCW9tYXAyX3NldF9nbG9iYWxzXzQ0M3goKTsKLQkJb21hcDQ0eHhfbWFwX2NvbW1vbl9pbygpOwotCX0KKwlvbWFwNF9pMmNfaW5pdCgpOworCW9tYXBfZ2VuZXJpY19pbml0KCk7CiB9CisjZW5kaWYKIAotLyogWFhYIFRoaXMgbWFjaGluZSBlbnRyeSBuYW1lIHNob3VsZCBiZSB1cGRhdGVkICovCi1NQUNISU5FX1NUQVJUKE9NQVBfR0VORVJJQywgIkdlbmVyaWMgT01BUDI0eHgiKQotCS8qIE1haW50YWluZXI6IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19pbml0KHZvaWQpCit7CisJb21hcDNfaTJjX2luaXQoKTsKKwlvbWFwX2dlbmVyaWNfaW5pdCgpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TT0NfT01BUDI0MjApCitzdGF0aWMgY29uc3QgY2hhciAqb21hcDI0MnhfYm9hcmRzX2NvbXBhdFtdIF9faW5pdGRhdGEgPSB7CisJInRpLG9tYXAyNDIwIiwKKwlOVUxMLAorfTsKKworRFRfTUFDSElORV9TVEFSVChPTUFQMjQyWF9EVCwgIkdlbmVyaWMgT01BUDI0MjAgKEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSkiKQorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5tYXBfaW8JCT0gb21hcF9nZW5lcmljX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfZ2VuZXJpY19pbml0X2Vhcmx5LAorCS5tYXBfaW8JCT0gb21hcDI0MnhfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDI0MjBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9nZW5lcmljX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMl90aW1lciwKKwkuZHRfY29tcGF0CT0gb21hcDI0MnhfYm9hcmRzX2NvbXBhdCwKIE1BQ0hJTkVfRU5ECisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NPQ19PTUFQMjQzMCkKK3N0YXRpYyBjb25zdCBjaGFyICpvbWFwMjQzeF9ib2FyZHNfY29tcGF0W10gX19pbml0ZGF0YSA9IHsKKwkidGksb21hcDI0MzAiLAorCU5VTEwsCit9OworCitEVF9NQUNISU5FX1NUQVJUKE9NQVAyNDNYX0RULCAiR2VuZXJpYyBPTUFQMjQzMCAoRmxhdHRlbmVkIERldmljZSBUcmVlKSIpCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCisJLm1hcF9pbwkJPSBvbWFwMjQzeF9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwMjQzMF9pbml0X2Vhcmx5LAorCS5pbml0X2lycQk9IG9tYXAyX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBvbWFwX2dlbmVyaWNfaW5pdCwKKwkudGltZXIJCT0gJm9tYXAyX3RpbWVyLAorCS5kdF9jb21wYXQJPSBvbWFwMjQzeF9ib2FyZHNfY29tcGF0LAorTUFDSElORV9FTkQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKK3N0YXRpYyBjb25zdCBjaGFyICpvbWFwM19ib2FyZHNfY29tcGF0W10gX19pbml0ZGF0YSA9IHsKKwkidGksb21hcDMiLAorCU5VTEwsCit9OworCitEVF9NQUNISU5FX1NUQVJUKE9NQVAzX0RULCAiR2VuZXJpYyBPTUFQMyAoRmxhdHRlbmVkIERldmljZSBUcmVlKSIpCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCisJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwMzQzMF9pbml0X2Vhcmx5LAorCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBvbWFwM19pbml0LAorCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCisJLmR0X2NvbXBhdAk9IG9tYXAzX2JvYXJkc19jb21wYXQsCitNQUNISU5FX0VORAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA0KQorc3RhdGljIGNvbnN0IGNoYXIgKm9tYXA0X2JvYXJkc19jb21wYXRbXSBfX2luaXRkYXRhID0geworCSJ0aSxvbWFwNCIsCisJTlVMTCwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoT01BUDRfRFQsICJHZW5lcmljIE9NQVA0IChGbGF0dGVuZWQgRGV2aWNlIFRyZWUpIikKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKKwkubWFwX2lvCQk9IG9tYXA0X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXA0NDMwX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gZ2ljX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBvbWFwNF9pbml0LAorCS50aW1lcgkJPSAmb21hcDRfdGltZXIsCisJLmR0X2NvbXBhdAk9IG9tYXA0X2JvYXJkc19jb21wYXQsCitNQUNISU5FX0VORAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMKaW5kZXggNDVkZTJiMy4uOGIzNTFkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYwpAQCAtMTAsNyArMTAsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjUsMjEgKzI1LDIzIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgotI2luY2x1ZGUgPHBsYXQva2V5cGFkLmg+CiAjaW5jbHVkZSA8cGxhdC9tZW5lbGF1cy5oPgogI2luY2x1ZGUgPHBsYXQvZG1hLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CiAKKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorCiAjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgogCkBAIC00OCwxMCArNTAsOCBAQAogCiAjZGVmaW5lIEg0X0VUSFJfR1BJT19JUlEJCTkyCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcm93X2dwaW9zWzZdID0geyA4OCwgODksIDEyNCwgMTEsIDYsIDk2IH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvbF9ncGlvc1s3XSA9IHsgOTAsIDkxLCAxMDAsIDM2LCAxMiwgOTcsIDk4IH07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaDRfa2V5bWFwW10gPSB7CisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfTUFUUklYKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9NQVRSSVhfTU9EVUxFKQorc3RhdGljIGNvbnN0IHVpbnQzMl90IGJvYXJkX21hdHJpeF9rZXlzW10gPSB7CiAJS0VZKDAsIDAsIEtFWV9MRUZUKSwKIAlLRVkoMSwgMCwgS0VZX1JJR0hUKSwKIAlLRVkoMiwgMCwgS0VZX0EpLApAQCAtODQsNiArODQsNzEgQEAKIAlLRVkoNCwgNSwgS0VZX0VOVEVSKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhIGJvYXJkX2tleW1hcF9kYXRhID0geworCS5rZXltYXAJCQk9IGJvYXJkX21hdHJpeF9rZXlzLAorCS5rZXltYXBfc2l6ZQkJPSBBUlJBWV9TSVpFKGJvYXJkX21hdHJpeF9rZXlzKSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm9hcmRfa2V5cGFkX3Jvd19ncGlvc1tdID0geworCTg4LCA4OSwgMTI0LCAxMSwgNiwgOTYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm9hcmRfa2V5cGFkX2NvbF9ncGlvc1tdID0geworCTkwLCA5MSwgMTAwLCAzNiwgMTIsIDk3LCA5OAorfTsKKworc3RhdGljIHN0cnVjdCBtYXRyaXhfa2V5cGFkX3BsYXRmb3JtX2RhdGEgYm9hcmRfa2V5cGFkX3BsYXRmb3JtX2RhdGEgPSB7CisJLmtleW1hcF9kYXRhCT0gJmJvYXJkX2tleW1hcF9kYXRhLAorCS5yb3dfZ3Bpb3MJPSBib2FyZF9rZXlwYWRfcm93X2dwaW9zLAorCS5udW1fcm93X2dwaW9zCT0gQVJSQVlfU0laRShib2FyZF9rZXlwYWRfcm93X2dwaW9zKSwKKwkuY29sX2dwaW9zCT0gYm9hcmRfa2V5cGFkX2NvbF9ncGlvcywKKwkubnVtX2NvbF9ncGlvcwk9IEFSUkFZX1NJWkUoYm9hcmRfa2V5cGFkX2NvbF9ncGlvcyksCisJLmFjdGl2ZV9sb3cJPSAxLAorCisJLmRlYm91bmNlX21zCQk9IDIwLAorCS5jb2xfc2Nhbl9kZWxheV91cwk9IDUsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBib2FyZF9rZXlib2FyZCA9IHsKKwkubmFtZQk9ICJtYXRyaXgta2V5cGFkIiwKKwkuaWQJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZib2FyZF9rZXlwYWRfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKK3N0YXRpYyB2b2lkIF9faW5pdCBib2FyZF9ta3BfaW5pdCh2b2lkKQoreworCW9tYXBfbXV4X2luaXRfZ3Bpbyg4OCwgT01BUF9QVUxMX0VOQSB8IE9NQVBfUFVMTF9VUCk7CisJb21hcF9tdXhfaW5pdF9ncGlvKDg5LCBPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKKwlvbWFwX211eF9pbml0X2dwaW8oMTI0LCBPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgibWNic3AyX2RyLmdwaW9fMTEiLCBPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKKwlpZiAob21hcF9oYXNfbWVuZWxhdXMoKSkgeworCQlvbWFwX211eF9pbml0X3NpZ25hbCgic2RyY19hMTQuZ3BpbzAiLAorCQkJT01BUF9QVUxMX0VOQSB8IE9NQVBfUFVMTF9VUCk7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ2bHlucV9yeDAuZ3Bpb18xNSIsIDApOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb185OCIsIDApOworCQlib2FyZF9rZXlwYWRfcm93X2dwaW9zWzVdID0gMDsKKwkJYm9hcmRfa2V5cGFkX2NvbF9ncGlvc1syXSA9IDE1OworCQlib2FyZF9rZXlwYWRfY29sX2dwaW9zWzZdID0gMTg7CisJfSBlbHNlIHsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fOTYiLCBPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fMTAwIiwgMCk7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzk4IiwgMCk7CisJfQorCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzkwIiwgMCk7CisJb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fOTEiLCAwKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb18zNiIsIDApOworCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJtY2JzcDJfY2xreC5ncGlvXzEyIiwgMCk7CisJb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fOTciLCAwKTsKKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYm9hcmRfa2V5Ym9hcmQpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBib2FyZF9ta3BfaW5pdCh2b2lkKQoreworfQorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBoNF9wYXJ0aXRpb25zW10gPSB7CiAJLyogYm9vdGxvYWRlciAoVS1Cb290LCBldGMpIGluIGZpcnN0IHNlY3RvciAqLwogCXsKQEAgLTEzNSwzOSArMjAwLDMyIEBACiAJLnJlc291cmNlCT0gJmg0X2ZsYXNoX3Jlc291cmNlLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgaDRfa2V5bWFwX2RhdGEgPSB7Ci0JLmtleW1hcAkJPSBoNF9rZXltYXAsCi0JLmtleW1hcF9zaXplCT0gQVJSQVlfU0laRShoNF9rZXltYXApLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2twX3BsYXRmb3JtX2RhdGEgaDRfa3BfZGF0YSA9IHsKLQkucm93cwkJPSA2LAotCS5jb2xzCQk9IDcsCi0JLmtleW1hcF9kYXRhCT0gJmg0X2tleW1hcF9kYXRhLAotCS5yZXAJCT0gdHJ1ZSwKLQkucm93X2dwaW9zIAk9IHJvd19ncGlvcywKLQkuY29sX2dwaW9zIAk9IGNvbF9ncGlvcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGg0X2twX2RldmljZSA9IHsKLQkubmFtZQkJPSAib21hcC1rZXlwYWQiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmaDRfa3BfZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaDRfbGNkX2RldmljZSA9IHsKLQkubmFtZQkJPSAibGNkX2g0IiwKLQkuaWQJCT0gLTEsCi19OwotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaDRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmg0X2ZsYXNoX2RldmljZSwKLQkmaDRfa3BfZGV2aWNlLAorfTsKKworc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGg0X3BhbmVsX2RhdGEgPSB7CisJLm5hbWUJCQk9ICJoNCIsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBoNF9sY2RfZGV2aWNlID0geworCS5uYW1lCQkJPSAibGNkIiwKKwkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAorCS5waHkuZHBpLmRhdGFfbGluZXMJPSAxNiwKKwkuZGF0YQkJCT0gJmg0X3BhbmVsX2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqaDRfZHNzX2RldmljZXNbXSA9IHsKIAkmaDRfbGNkX2RldmljZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyBoNF9kc3NfZGF0YSA9IHsKKwkubnVtX2RldmljZXMJPSBBUlJBWV9TSVpFKGg0X2Rzc19kZXZpY2VzKSwKKwkuZGV2aWNlcwk9IGg0X2Rzc19kZXZpY2VzLAorCS5kZWZhdWx0X2RldmljZQk9ICZoNF9sY2RfZGV2aWNlLAorfTsKKwogLyogMjQyMCBTeXNib290IHNldHVwICgyNDMwIGlzIGRpZmZlcmVudCkgKi8KIHN0YXRpYyB1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKIHsKQEAgLTI3MSwxMCArMzI5LDYgQEAKIAloNF9mbGFzaF9yZXNvdXJjZS5lbmQJPSBiYXNlICsgU1pfNjRNIC0gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb25maWcgaDRfbGNkX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5jdHJsX25hbWUJPSAiaW50ZXJuYWwiLAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgaDRfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewogCS8qIFMxLjEwIE9GRiAtLSB1c2IgImRvd25sb2FkIHBvcnQiCiAJICogdXNiMCBzd2l0Y2hlZCB0byBNaW5pLUIgcG9ydCBhbmQgaXNwMTEwNSB0cmFuc2NlaXZlcjsKQEAgLTI4NiwyMSArMzQwLDYgQEAKIAkuaG1jX21vZGUJPSAweDAwLAkJLyogMDpkZXZ8b3RnIDE6ZGlzYWJsZSAyOmRpc2FibGUgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGg0X2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7Ci0JeyBPTUFQX1RBR19MQ0QsCQkmaDRfbGNkX2NvbmZpZyB9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfaDRfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhOVUxMLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfaDRfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMl9pbml0X2lycSgpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBtMjRjMDEgPSB7CiAJLmJ5dGVfbGVuCT0gU1pfMUsgLyA4LAogCS5wYWdlX3NpemUJPSAxNiwKQEAgLTMzMSw2MiArMzcwLDMyIEBACiB7CiAJb21hcDI0MjBfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfWkFGKTsKIAotCW9tYXBfYm9hcmRfY29uZmlnID0gaDRfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGg0X2NvbmZpZyk7Ci0KIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGUgc2VyaWFsIHBvcnRzIGFyZSBtdXhlZCBvbiBhdCB0aGlzIHBvaW50LgogCSAqIFlvdSBoYXZlIHRvIG11eCB0aGVtIG9mZiBpbiBkZXZpY2UgZHJpdmVycyBsYXRlciBvbgogCSAqIGlmIG5vdCBuZWVkZWQuCiAJICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9PTUFQX01PRFVMRSkKLQlvbWFwX211eF9pbml0X2dwaW8oODgsIE9NQVBfUFVMTF9FTkEgfCBPTUFQX1BVTExfVVApOwotCW9tYXBfbXV4X2luaXRfZ3Bpbyg4OSwgT01BUF9QVUxMX0VOQSB8IE9NQVBfUFVMTF9VUCk7Ci0Jb21hcF9tdXhfaW5pdF9ncGlvKDEyNCwgT01BUF9QVUxMX0VOQSB8IE9NQVBfUFVMTF9VUCk7Ci0Jb21hcF9tdXhfaW5pdF9zaWduYWwoIm1jYnNwMl9kci5ncGlvXzExIiwgT01BUF9QVUxMX0VOQSB8IE9NQVBfUFVMTF9VUCk7Ci0JaWYgKG9tYXBfaGFzX21lbmVsYXVzKCkpIHsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkcmNfYTE0LmdwaW8wIiwKLQkJCU9NQVBfUFVMTF9FTkEgfCBPTUFQX1BVTExfVVApOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidmx5bnFfcngwLmdwaW9fMTUiLCAwKTsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fOTgiLCAwKTsKLQkJcm93X2dwaW9zWzVdID0gMDsKLQkJY29sX2dwaW9zWzJdID0gMTU7Ci0JCWNvbF9ncGlvc1s2XSA9IDE4OwotCX0gZWxzZSB7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzk2IiwgT01BUF9QVUxMX0VOQSB8IE9NQVBfUFVMTF9VUCk7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzEwMCIsIDApOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb185OCIsIDApOwotCX0KLQlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb185MCIsIDApOwotCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzkxIiwgMCk7Ci0Jb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fMzYiLCAwKTsKLQlvbWFwX211eF9pbml0X3NpZ25hbCgibWNic3AyX2Nsa3guZ3Bpb18xMiIsIDApOwotCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzk3IiwgMCk7Ci0jZW5kaWYKLQorCWJvYXJkX21rcF9pbml0KCk7CiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgaDRfaTJjX2JvYXJkX2luZm8sCiAJCQlBUlJBWV9TSVpFKGg0X2kyY19ib2FyZF9pbmZvKSk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhoNF9kZXZpY2VzLCBBUlJBWV9TSVpFKGg0X2RldmljZXMpKTsKIAlvbWFwMl91c2Jmc19pbml0KCZoNF91c2JfY29uZmlnKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CiAJaDRfaW5pdF9mbGFzaCgpOwotfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9oNF9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMl9zZXRfZ2xvYmFsc18yNDJ4KCk7Ci0Jb21hcDI0MnhfbWFwX2NvbW1vbl9pbygpOworCW9tYXBfZGlzcGxheV9pbml0KCZoNF9kc3NfZGF0YSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9INCwgIk9NQVAyNDIwIEg0IGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBQYXVsIE11bmR0IDxwYXVsLm11bmR0QG5va2lhLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5tYXBfaW8JCT0gb21hcF9oNF9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwX2g0X2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcF9oNF9pbml0X2lycSwKKwkubWFwX2lvCQk9IG9tYXAyNDJ4X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAyNDIwX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gb21hcDJfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfaDRfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAyX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMjAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMjAuYwppbmRleCAzNWJlNzc4Li5kMGEzZjc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWlnZXAwMDIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1pZ2VwMDAyMC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+Ci0jaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZHZpLmg+CiAjaW5jbHVkZSA8cGxhdC9vbmVuYW5kLmg+CiAKICNpbmNsdWRlICJtdXguaCIKQEAgLTQ1NSwxNiArNDU1LDE2IEBACiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KElHRVAyX0dQSU9fRFZJX1BVUCwgMCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBkdmlfcGFuZWwgPSB7Ci0JLm5hbWUJCQk9ICJnZW5lcmljIiwKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgZHZpX3BhbmVsID0gewogCS5wbGF0Zm9ybV9lbmFibGUJPSBpZ2VwMl9lbmFibGVfZHZpLAogCS5wbGF0Zm9ybV9kaXNhYmxlCT0gaWdlcDJfZGlzYWJsZV9kdmksCisJLmkyY19idXNfbnVtID0gMywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGlnZXAyX2R2aV9kZXZpY2UgPSB7CiAJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKIAkubmFtZQkJCT0gImR2aSIsCi0JLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRyaXZlcl9uYW1lCQk9ICJkdmkiLAogCS5kYXRhCQkJPSAmZHZpX3BhbmVsLAogCS5waHkuZHBpLmRhdGFfbGluZXMJPSAyNCwKIH07CkBAIC00OTEsMTMgKzQ5MSw2IEBACiAJJmlnZXBfdndsYW5fZGV2aWNlLAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGlnZXBfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhtNjVreHh4eGFtX3NkcmNfcGFyYW1zLAotCQkJCSAgbTY1a3h4eHhhbV9zZHJjX3BhcmFtcyk7Ci19Ci0KIHN0YXRpYyBpbnQgaWdlcDJfa2V5bWFwW10gPSB7CiAJS0VZKDAsIDAsIEtFWV9MRUZUKSwKIAlLRVkoMCwgMSwgS0VZX1JJR0hUKSwKQEAgLTY1MCw2ICs2NDMsOCBAQAogCWlnZXBfaTJjX2luaXQoKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpZ2VwX2RldmljZXMsIEFSUkFZX1NJWkUoaWdlcF9kZXZpY2VzKSk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KG02NWt4eHh4YW1fc2RyY19wYXJhbXMsCisJCQkJICBtNjVreHh4eGFtX3NkcmNfcGFyYW1zKTsKIAl1c2JfbXVzYl9pbml0KE5VTEwpOwogCiAJaWdlcF9mbGFzaF9pbml0KCk7CkBAIC02NzIsMjAgKzY2NywyMCBAQAogfQogCiBNQUNISU5FX1NUQVJUKElHRVAwMDIwLCAiSUdFUCB2MiBib2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IGlnZXBfaW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNXh4X2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGlnZXBfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChJR0VQMDAzMCwgIklHRVAgT01BUDMgbW9kdWxlIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gaWdlcF9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM1eHhfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gaWdlcF9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYwppbmRleCAyMTg3NjRjLi5lMTc5ZGEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3Ntc2M5MTF4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTM0LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KQEAgLTQ0LDYgKzQ0LDkgQEAKICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy1zbXNjOTExeC5oPgogCisjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZ2VuZXJpYy1kcGkuaD4KKwogI2luY2x1ZGUgImJvYXJkLWZsYXNoLmgiCiAjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAiaHNtbWMuaCIKQEAgLTE4MCwyOSArMTgzLDEwMiBAQAogCWdwbWNfc21zYzkxMXhfaW5pdCgmc21zYzkxMXhfY2ZnKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbGRwX2xjZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImxkcF9sY2QiLAotCS5pZAkJPSAtMSwKLX07CisvKiBMQ0QgKi8KIAotc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb25maWcgbGRwX2xjZF9jb25maWcgX19pbml0ZGF0YSA9IHsKLQkuY3RybF9uYW1lCT0gImludGVybmFsIiwKLX07CitzdGF0aWMgaW50IGxkcF9iYWNrbGlnaHRfZ3BpbzsKK3N0YXRpYyBpbnQgbGRwX2xjZF9lbmFibGVfZ3BpbzsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgbGRwX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7Ci0JeyBPTUFQX1RBR19MQ0QsCQkmbGRwX2xjZF9jb25maWcgfSwKLX07CisjZGVmaW5lIExDRF9QQU5FTF9SRVNFVF9HUElPCQk1NQorI2RlZmluZSBMQ0RfUEFORUxfUVZHQV9HUElPCQk1NgogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9sZHBfaW5pdF9lYXJseSh2b2lkKQorc3RhdGljIGludCBsZHBfcGFuZWxfZW5hYmxlX2xjZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOworCWlmIChncGlvX2lzX3ZhbGlkKGxkcF9sY2RfZW5hYmxlX2dwaW8pKQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobGRwX2xjZF9lbmFibGVfZ3BpbywgMSk7CisJaWYgKGdwaW9faXNfdmFsaWQobGRwX2JhY2tsaWdodF9ncGlvKSkKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGxkcF9iYWNrbGlnaHRfZ3BpbywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGRwX3BhbmVsX2Rpc2FibGVfbGNkKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpZiAoZ3Bpb19pc192YWxpZChsZHBfbGNkX2VuYWJsZV9ncGlvKSkKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGxkcF9sY2RfZW5hYmxlX2dwaW8sIDApOworCWlmIChncGlvX2lzX3ZhbGlkKGxkcF9iYWNrbGlnaHRfZ3BpbykpCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChsZHBfYmFja2xpZ2h0X2dwaW8sIDApOworfQorCitzdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgbGRwX3BhbmVsX2RhdGEgPSB7CisJLm5hbWUJCQk9ICJuZWNfbmwyNDMyZHIyMi0xMWIiLAorCS5wbGF0Zm9ybV9lbmFibGUJPSBsZHBfcGFuZWxfZW5hYmxlX2xjZCwKKwkucGxhdGZvcm1fZGlzYWJsZQk9IGxkcF9wYW5lbF9kaXNhYmxlX2xjZCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGxkcF9sY2RfZGV2aWNlID0geworCS5uYW1lCQkJPSAibGNkIiwKKwkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAorCS5waHkuZHBpLmRhdGFfbGluZXMJPSAxOCwKKwkuZGF0YQkJCT0gJmxkcF9wYW5lbF9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmxkcF9kc3NfZGV2aWNlc1tdID0geworCSZsZHBfbGNkX2RldmljZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyBsZHBfZHNzX2RhdGEgPSB7CisJLm51bV9kZXZpY2VzCT0gQVJSQVlfU0laRShsZHBfZHNzX2RldmljZXMpLAorCS5kZXZpY2VzCT0gbGRwX2Rzc19kZXZpY2VzLAorCS5kZWZhdWx0X2RldmljZQk9ICZsZHBfbGNkX2RldmljZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBsZHBfZGlzcGxheV9pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwlzdGF0aWMgc3RydWN0IGdwaW8gZ3Bpb3NbXSBfX2luaXRkYXRhID0geworCQl7TENEX1BBTkVMX1JFU0VUX0dQSU8sIEdQSU9GX09VVF9JTklUX0hJR0gsICJMQ0QgUkVTRVQifSwKKwkJe0xDRF9QQU5FTF9RVkdBX0dQSU8sIEdQSU9GX09VVF9JTklUX0hJR0gsICJMQ0QgUVZHQSJ9LAorCX07CisKKwlyID0gZ3Bpb19yZXF1ZXN0X2FycmF5KGdwaW9zLCBBUlJBWV9TSVpFKGdwaW9zKSk7CisJaWYgKHIpIHsKKwkJcHJfZXJyKCJDYW5ub3QgcmVxdWVzdCBMQ0QgR1BJT3MsIGVycm9yICVkXG4iLCByKTsKKwkJcmV0dXJuOworCX0KKworCW9tYXBfZGlzcGxheV9pbml0KCZsZHBfZHNzX2RhdGEpOworfQorCitzdGF0aWMgaW50IGxkcF90d2xfZ3Bpb19zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIG5ncGlvKQoreworCWludCByOworCisJc3RydWN0IGdwaW8gZ3Bpb3NbXSA9IHsKKwkJe2dwaW8gKyA3ICwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiTENEIEVOQUJMRSJ9LAorCQl7Z3BpbyArIDE1LCBHUElPRl9PVVRfSU5JVF9MT1csICJMQ0QgQkFDS0xJR0hUIn0sCisJfTsKKworCXIgPSBncGlvX3JlcXVlc3RfYXJyYXkoZ3Bpb3MsIEFSUkFZX1NJWkUoZ3Bpb3MpKTsKKwlpZiAocikgeworCQlwcl9lcnIoIkNhbm5vdCByZXF1ZXN0IExDRCBHUElPcywgZXJyb3IgJWRcbiIsIHIpOworCQlsZHBfYmFja2xpZ2h0X2dwaW8gPSAtRUlOVkFMOworCQlsZHBfbGNkX2VuYWJsZV9ncGlvID0gLUVJTlZBTDsKKwkJcmV0dXJuIHI7CisJfQorCisJbGRwX2JhY2tsaWdodF9ncGlvID0gZ3BpbyArIDE1OworCWxkcF9sY2RfZW5hYmxlX2dwaW8gPSBncGlvICsgNzsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfZ3Bpb19wbGF0Zm9ybV9kYXRhIGxkcF9ncGlvX2RhdGEgPSB7CiAJLmdwaW9fYmFzZQk9IE9NQVBfTUFYX0dQSU9fTElORVMsCiAJLmlycV9iYXNlCT0gVFdMNDAzMF9HUElPX0lSUV9CQVNFLAogCS5pcnFfZW5kCT0gVFdMNDAzMF9HUElPX0lSUV9FTkQsCisJLnNldHVwCQk9IGxkcF90d2xfZ3Bpb19zZXR1cCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBsZHBfdm1tYzFfc3VwcGx5W10gPSB7CkBAIC0yNDQsMTAgKzMyMCwzMSBAQAogCS5jb25zdW1lcl9zdXBwbGllcwkJPSBsZHBfdmF1eDFfc3VwcGxpZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbGRwX3ZwbGwyX3N1cHBsaWVzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzcyIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3NfZHNpMSIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxkcF92cGxsMiA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5uYW1lCQkJPSAiVkRWSSIsCisJCS5taW5fdVYJCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCQk9IDE4MDAwMDAsCisJCS5hcHBseV91VgkJPSB0cnVlLAorCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAorCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCisJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKKwkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGxkcF92cGxsMl9zdXBwbGllcyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbGRwX3ZwbGwyX3N1cHBsaWVzLAorfTsKKwogc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgbGRwX3R3bGRhdGEgPSB7CiAJLyogcGxhdGZvcm1fZGF0YSBmb3IgY2hpbGRyZW4gZ29lcyBoZXJlICovCiAJLnZtbWMxCQk9ICZsZHBfdm1tYzEsCiAJLnZhdXgxCQk9ICZsZHBfdmF1eDEsCisJLnZwbGwyCQk9ICZsZHBfdnBsbDIsCiAJLmdwaW8JCT0gJmxkcF9ncGlvX2RhdGEsCiAJLmtleXBhZAkJPSAmbGRwX2twX3R3bDQwMzBfZGF0YSwKIH07CkBAIC0yNzMsNyArMzcwLDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpsZHBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJmxkcF9sY2RfZGV2aWNlLAogCSZsZHBfZ3Bpb19rZXlzX2RldmljZSwKIH07CiAKQEAgLTMxOCwyNSArNDE0LDI1IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9sZHBfaW5pdCh2b2lkKQogewogCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NCQik7Ci0Jb21hcF9ib2FyZF9jb25maWcgPSBsZHBfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGxkcF9jb25maWcpOwogCWxkcF9pbml0X3Ntc2M5MTF4KCk7CiAJb21hcF9pMmNfaW5pdCgpOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGxkcF9kZXZpY2VzLCBBUlJBWV9TSVpFKGxkcF9kZXZpY2VzKSk7CiAJb21hcF9hZHM3ODQ2X2luaXQoMSwgNTQsIDMxMCwgTlVMTCk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KE5VTEwsIE5VTEwpOwogCXVzYl9tdXNiX2luaXQoTlVMTCk7CiAJYm9hcmRfbmFuZF9pbml0KGxkcF9uYW5kX3BhcnRpdGlvbnMsCiAJCUFSUkFZX1NJWkUobGRwX25hbmRfcGFydGl0aW9ucyksIFpPT01fTkFORF9DUywgMCk7CiAKIAlvbWFwMl9oc21tY19pbml0KG1tYyk7CisJbGRwX2Rpc3BsYXlfaW5pdCgpOwogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfTERQLCAiT01BUCBMRFAgYm9hcmQiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwX2xkcF9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM0MzBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9sZHBfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1uOHgwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW44eDAuYwppbmRleCBlMTFmMGM1Li5lOWQ1ZjRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW44eDAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW44eDAuYwpAQCAtNjE2LDE4ICs2MTYsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgbjh4MF9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMl9zZXRfZ2xvYmFsc18yNDJ4KCk7Ci0Jb21hcDI0MnhfbWFwX2NvbW1vbl9pbygpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbjh4MF9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOwotfQotCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CiAJLyogSTJTIGNvZGVjIHBvcnQgcGlucyBmb3IgTWNCU1AgYmxvY2sgKi8KQEAgLTY4OSwzNiArNjc3LDM3IEBACiAJCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDIsIG44MTBfaTJjX2JvYXJkX2luZm9fMiwKIAkJCQkJQVJSQVlfU0laRShuODEwX2kyY19ib2FyZF9pbmZvXzIpKTsKIAlib2FyZF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KE5VTEwsIE5VTEwpOwogCWdwbWNfb25lbmFuZF9pbml0KGJvYXJkX29uZW5hbmRfZGF0YSk7CiAJbjh4MF9tbWNfaW5pdCgpOwogCW44eDBfdXNiX2luaXQoKTsKIH0KIAogTUFDSElORV9TVEFSVChOT0tJQV9OODAwLCAiTm9raWEgTjgwMCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkubWFwX2lvCQk9IG44eDBfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gbjh4MF9pbml0X2Vhcmx5LAorCS5tYXBfaW8JCT0gb21hcDI0MnhfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDI0MjBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbjh4MF9pbml0X21hY2hpbmUsCiAJLnRpbWVyCQk9ICZvbWFwMl90aW1lciwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoTk9LSUFfTjgxMCwgIk5va2lhIE44MTAiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLm1hcF9pbwkJPSBuOHgwX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG44eDBfaW5pdF9lYXJseSwKKwkubWFwX2lvCQk9IG9tYXAyNDJ4X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAyNDIwX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDJfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG44eDBfaW5pdF9tYWNoaW5lLAogCS50aW1lcgkJPSAmb21hcDJfdGltZXIsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKE5PS0lBX044MTBfV0lNQVgsICJOb2tpYSBOODEwIFdpTUFYIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5tYXBfaW8JCT0gbjh4MF9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBuOHgwX2luaXRfZWFybHksCisJLm1hcF9pbwkJPSBvbWFwMjQyeF9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwMjQyMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAyX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBuOHgwX2luaXRfbWFjaGluZSwKIAkudGltZXIJCT0gJm9tYXAyX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCmluZGV4IDNhZTE2YjQuLjRhNzFjYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+Ci0jaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZHZpLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CiAjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KQEAgLTIwMywxNiArMjAzLDE2IEBACiAJCWdwaW9fc2V0X3ZhbHVlKGRzc2Rldi0+cmVzZXRfZ3BpbywgMCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBkdmlfcGFuZWwgPSB7Ci0JLm5hbWUgPSAiZ2VuZXJpYyIsCitzdGF0aWMgc3RydWN0IHBhbmVsX2R2aV9wbGF0Zm9ybV9kYXRhIGR2aV9wYW5lbCA9IHsKIAkucGxhdGZvcm1fZW5hYmxlID0gYmVhZ2xlX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUgPSBiZWFnbGVfZGlzYWJsZV9kdmksCisJLmkyY19idXNfbnVtID0gMywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGJlYWdsZV9kdmlfZGV2aWNlID0gewogCS50eXBlID0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAogCS5uYW1lID0gImR2aSIsCi0JLmRyaXZlcl9uYW1lID0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkuZHJpdmVyX25hbWUgPSAiZHZpIiwKIAkuZGF0YSA9ICZkdmlfcGFuZWwsCiAJLnBoeS5kcGkuZGF0YV9saW5lcyA9IDI0LAogCS5yZXNldF9ncGlvID0gLUVJTlZBTCwKQEAgLTM3OCw3ICszNzgsOCBAQAogc3RhdGljIGludCBfX2luaXQgb21hcDNfYmVhZ2xlX2kyY19pbml0KHZvaWQpCiB7CiAJb21hcDNfcG1pY19nZXRfY29uZmlnKCZiZWFnbGVfdHdsZGF0YSwKLQkJCVRXTF9DT01NT05fUERBVEFfVVNCIHwgVFdMX0NPTU1PTl9QREFUQV9BVURJTywKKwkJCVRXTF9DT01NT05fUERBVEFfVVNCIHwgVFdMX0NPTU1PTl9QREFUQV9NQURDIHwKKwkJCVRXTF9DT01NT05fUERBVEFfQVVESU8sCiAJCQlUV0xfQ09NTU9OX1JFR1VMQVRPUl9WREFDIHwgVFdMX0NPTU1PTl9SRUdVTEFUT1JfVlBMTDIpOwogCiAJYmVhZ2xlX3R3bGRhdGEudnBsbDItPmNvbnN0cmFpbnRzLm5hbWUgPSAiVkRWSSI7CkBAIC00NDQsMjEgKzQ0NSwxNSBAQAogCX0sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfYmVhZ2xlX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKLQkJCQkgIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfYmVhZ2xlX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDNfaW5pdF9pcnEoKTsKLX0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1hZGNfaHdtb24gPSB7CisJLm5hbWUJPSAidHdsNDAzMF9tYWRjX2h3bW9uIiwKKwkuaWQJPSAtMSwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwM19iZWFnbGVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmxlZHNfZ3BpbywKIAkma2V5c19ncGlvLAorCSZtYWRjX2h3bW9uLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2Joc19vbWFwX2JvYXJkX2RhdGEgdXNiaHNfYmRhdGEgX19pbml0Y29uc3QgPSB7CkBAIC00OTMsOCArNDg4LDggQEAKIAlpZiAoY3B1X2lzX29tYXAzNjMwKCkpIHsKIAkJc3RydWN0IGRldmljZSAqbXB1X2RldiwgKml2YV9kZXY7CiAKLQkJbXB1X2RldiA9IG9tYXAyX2dldF9tcHVzc19kZXZpY2UoKTsKLQkJaXZhX2RldiA9IG9tYXAyX2dldF9pdmFfZGV2aWNlKCk7CisJCW1wdV9kZXYgPSBvbWFwX2RldmljZV9nZXRfYnlfaHdtb2RfbmFtZSgibXB1Iik7CisJCWl2YV9kZXYgPSBvbWFwX2RldmljZV9nZXRfYnlfaHdtb2RfbmFtZSgiaXZhIik7CiAKIAkJaWYgKCFtcHVfZGV2IHx8ICFpdmFfZGV2KSB7CiAJCQlwcl9lcnIoIiVzOiBBaWVlLi4gbm8gbXB1L2RzcCBkZXZpY2VzPyAlcCAlcFxuIiwKQEAgLTUzNCw2ICs1MjksOCBAQAogCQkJQVJSQVlfU0laRShvbWFwM19iZWFnbGVfZGV2aWNlcykpOwogCW9tYXBfZGlzcGxheV9pbml0KCZiZWFnbGVfZHNzX2RhdGEpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAorCQkJCSAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7CiAKIAlvbWFwX211eF9pbml0X2dwaW8oMTcwLCBPTUFQX1BJTl9JTlBVVCk7CiAJLyogUkVWSVNJVCBsZWF2ZSBEVkkgcG93ZXJlZCBkb3duIHVudGlsIGl0J3MgbmVlZGVkIC4uLiAqLwpAQCAtNTU3LDExICs1NTQsMTEgQEAKIAogTUFDSElORV9TVEFSVChPTUFQM19CRUFHTEUsICJPTUFQMyBCZWFnbGUgQm9hcmQiKQogCS8qIE1haW50YWluZXI6IFN5ZWQgTW9oYW1tZWQgS2hhc2ltIC0gaHR0cDovL2JlYWdsZWJvYXJkLm9yZyAqLwotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwM19iZWFnbGVfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbWFwM19iZWFnbGVfaW5pdF9pcnEsCisJLmluaXRfZWFybHkJPSBvbWFwM19pbml0X2Vhcmx5LAorCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwM19iZWFnbGVfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3NlY3VyZV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMKaW5kZXggYzQ1MmIzZi4uZWMwMGIyZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2V2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNldm0uYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtNDUsNyArNDYsNyBAQAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC9tY3NwaS5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KLSNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kdmkuaD4KIAogI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgInNkcmFtLW1pY3Jvbi1tdDQ2aDMybTMybGYtNi5oIgpAQCAtMjQ3LDggKzI0OCw3IEBACiAJZHZpX2VuYWJsZWQgPSAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgZHZpX3BhbmVsID0gewotCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCitzdGF0aWMgc3RydWN0IHBhbmVsX2R2aV9wbGF0Zm9ybV9kYXRhIGR2aV9wYW5lbCA9IHsKIAkucGxhdGZvcm1fZW5hYmxlCT0gb21hcDNfZXZtX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUJPSBvbWFwM19ldm1fZGlzYWJsZV9kdmksCiB9OwpAQCAtMjU2LDcgKzI1Niw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBvbWFwM19ldm1fZHZpX2RldmljZSA9IHsKIAkubmFtZQkJCT0gImR2aSIsCiAJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLQkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkuZHJpdmVyX25hbWUJCT0gImR2aSIsCiAJLmRhdGEJCQk9ICZkdmlfcGFuZWwsCiAJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAogfTsKQEAgLTUyMCwxMiArNTIwLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIG9tYXAzX2V2bV9jb25maWdbXSBfX2luaXRkYXRhID0gewogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX2V2bV9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsIE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IHVzYmhzX29tYXBfYm9hcmRfZGF0YSB1c2Joc19iZGF0YSBfX2luaXRkYXRhID0gewogCiAJLnBvcnRfbW9kZVswXSA9IE9NQVBfVVNCSFNfUE9SVF9NT0RFX1VOVVNFRCwKQEAgLTY0MCw2ICs2MzQsNyBAQAogCW9tYXBfZGlzcGxheV9pbml0KCZvbWFwM19ldm1fZHNzX2RhdGEpOwogCiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsIE5VTEwpOwogCiAJLyogT01BUDNFVk0gdXNlcyBJU1AxNTA0IHBoeSBhbmQgc28gcmVnaXN0ZXIgbm9wIHRyYW5zY2VpdmVyICovCiAJdXNiX25vcF94Y2Vpdl9yZWdpc3RlcigpOwpAQCAtNjgxLDEwICs2NzYsMTAgQEAKIAogTUFDSElORV9TVEFSVChPTUFQM0VWTSwgIk9NQVAzIEVWTSIpCiAJLyogTWFpbnRhaW5lcjogU3llZCBNb2hhbW1lZCBLaGFzaW0gLSBUZXhhcyBJbnN0cnVtZW50cyAqLwotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwM19ldm1faW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNXh4X2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXAzX2V2bV9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzbG9naWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNsb2dpYy5jCmluZGV4IDcwM2FlYjUuLjdjMGYxOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNsb2dpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNsb2dpYy5jCkBAIC0xODIsMTIgKzE4Miw2IEBACiAJZ3BtY19zbXNjOTExeF9pbml0KCZib2FyZF9zbXNjOTExeF9kYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXAzbG9naWNfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhOVUxMLCBOVUxMKTsKLX0KLQogI2lmZGVmIENPTkZJR19PTUFQX01VWAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCBib2FyZF9tdXhbXSBfX2luaXRkYXRhID0gewogCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCkBAIC0yMDAsNiArMTk0LDcgQEAKIAlvbWFwM3RvcnBlZG9fZml4X3BiaWFzX3ZvbHRhZ2UoKTsKIAlvbWFwM2xvZ2ljX2kyY19pbml0KCk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KE5VTEwsIE5VTEwpOwogCWJvYXJkX21tY19pbml0KCk7CiAJYm9hcmRfc21zYzkxMXhfaW5pdCgpOwogCkBAIC0yMDksMTggKzIwNCwxOCBAQAogfQogCiBNQUNISU5FX1NUQVJUKE9NQVAzX1RPUlBFRE8sICJMb2dpYyBPTUFQMyBUb3JwZWRvIGJvYXJkIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gb21hcDNsb2dpY19pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM1eHhfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcDNsb2dpY19pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKE9NQVAzNTMwX0xWX1NPTSwgIk9NQVAgTG9naWMgMzUzMCBMViBTT00gYm9hcmQiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwM2xvZ2ljX2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBvbWFwMzV4eF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwM2xvZ2ljX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCmluZGV4IDA4MGQ3YmQuLmY3ODExZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYwpAQCAtMzM1LDcgKzMzNSw3IEBACiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcGFuZG9yYV92ZGRzX3N1cHBsaWVzW10gPSB7CiAJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19zZGkiLCAib21hcGRzcyIpLAogCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3MiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaTEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaS4wIiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcGFuZG9yYV92Y2NfbGNkX3N1cHBseVtdID0gewpAQCAtNTI1LDEzICs1MjUsNiBAQAogCX0KIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM3BhbmRvcmFfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAotCQkJCSAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBwYW5kb3JhX3dsMTI1MV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhIHBhbmRvcmFfd2wxMjUxX3BkYXRhOwpAQCAtNTkzLDYgKzU4Niw4IEBACiAJCQlBUlJBWV9TSVpFKG9tYXAzcGFuZG9yYV9kZXZpY2VzKSk7CiAJb21hcF9kaXNwbGF5X2luaXQoJnBhbmRvcmFfZHNzX2RhdGEpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAorCQkJCSAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7CiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8ob21hcDNwYW5kb3JhX3NwaV9ib2FyZF9pbmZvLAogCQkJQVJSQVlfU0laRShvbWFwM3BhbmRvcmFfc3BpX2JvYXJkX2luZm8pKTsKIAlvbWFwX2Fkczc4NDZfaW5pdCgxLCBPTUFQM19QQU5ET1JBX1RTX0dQSU8sIDAsIE5VTEwpOwpAQCAtNjA2LDEwICs2MDEsMTAgQEAKIH0KIAogTUFDSElORV9TVEFSVChPTUFQM19QQU5ET1JBLCAiUGFuZG9yYSBIYW5kaGVsZCBDb25zb2xlIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gb21hcDNwYW5kb3JhX2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBvbWFwMzV4eF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwM3BhbmRvcmFfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3N0YWxrZXIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNzdGFsa2VyLmMKaW5kZXggOGUxMDQ5OC4uZGRiN2Q2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3N0YWxrZXIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzc3RhbGtlci5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZHZpLmg+CiAKICNpbmNsdWRlIDxwbGF0L21jc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgpAQCAtMTA3LDM5ICsxMDgsNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBvbWFwM19zdGFsa2VyX2VuYWJsZV9sY2Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCWlmIChkdmlfZW5hYmxlZCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBlbmFibGUgTENELCBEVkkgaXMgZW5hYmxlZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlncGlvX3NldF92YWx1ZShEU1NfRU5BQkxFX0dQSU8sIDEpOwotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9CS0xJR0hUX0dQSU8sIDEpOwotCWxjZF9lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgb21hcDNfc3RhbGtlcl9kaXNhYmxlX2xjZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoRFNTX0VOQUJMRV9HUElPLCAwKTsKLQlncGlvX3NldF92YWx1ZShMQ0RfUEFORUxfQktMSUdIVF9HUElPLCAwKTsKLQlsY2RfZW5hYmxlZCA9IDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBsY2RfcGFuZWwgPSB7Ci0JLm5hbWUJCQk9ICJnZW5lcmljIiwKLQkucGxhdGZvcm1fZW5hYmxlCT0gb21hcDNfc3RhbGtlcl9lbmFibGVfbGNkLAotCS5wbGF0Zm9ybV9kaXNhYmxlCT0gb21hcDNfc3RhbGtlcl9kaXNhYmxlX2xjZCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIG9tYXAzX3N0YWxrZXJfbGNkX2RldmljZSA9IHsKLQkubmFtZQkJCT0gImxjZCIsCi0JLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCi0JLmRhdGEJCQk9ICZsY2RfcGFuZWwsCi0JLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAotCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCi19OwotCiBzdGF0aWMgaW50IG9tYXAzX3N0YWxrZXJfZW5hYmxlX3R2KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKIAlyZXR1cm4gMDsKQEAgLTE3OSw4ICsxNDcsNyBAQAogCWR2aV9lbmFibGVkID0gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKLQkubmFtZQkJCT0gImdlbmVyaWMiLAorc3RhdGljIHN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YSBkdmlfcGFuZWwgPSB7CiAJLnBsYXRmb3JtX2VuYWJsZQk9IG9tYXAzX3N0YWxrZXJfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IG9tYXAzX3N0YWxrZXJfZGlzYWJsZV9kdmksCiB9OwpAQCAtMTg4LDEzICsxNTUsMTIgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIG9tYXAzX3N0YWxrZXJfZHZpX2RldmljZSA9IHsKIAkubmFtZQkJCT0gImR2aSIsCiAJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLQkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkuZHJpdmVyX25hbWUJCT0gImR2aSIsCiAJLmRhdGEJCQk9ICZkdmlfcGFuZWwsCiAJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKm9tYXAzX3N0YWxrZXJfZHNzX2RldmljZXNbXSA9IHsKLQkmb21hcDNfc3RhbGtlcl9sY2RfZGV2aWNlLAogCSZvbWFwM19zdGFsa2VyX3R2X2RldmljZSwKIAkmb21hcDNfc3RhbGtlcl9kdmlfZGV2aWNlLAogfTsKQEAgLTQyOCwxNyArMzk0LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIG9tYXAzX3N0YWxrZXJfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19zdGFsa2VyX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19zdGFsa2VyX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDNfaW5pdF9pcnEoKTsKLX0KLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9tYXAzX3N0YWxrZXJfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmtleXNfZ3BpbywKIH07CkBAIC00NzgsNiArNDMzLDcgQEAKIAlvbWFwX2Rpc3BsYXlfaW5pdCgmb21hcDNfc3RhbGtlcl9kc3NfZGF0YSk7CiAKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywgTlVMTCk7CiAJdXNiX211c2JfaW5pdChOVUxMKTsKIAl1c2Joc19pbml0KCZ1c2Joc19iZGF0YSk7CiAJb21hcF9hZHM3ODQ2X2luaXQoMSwgT01BUDNfU1RBTEtFUl9UU19HUElPLCAzMTAsIE5VTEwpOwpAQCAtNDk0LDEwICs0NTAsMTAgQEAKIAogTUFDSElORV9TVEFSVChTQkMzNTMwLCAiT01BUDMgU1RBTEtFUiIpCiAJLyogTWFpbnRhaW5lcjogSmFzb24gTGFtIC1semdAZW1hLXRlY2guY29tICovCi0JLmJvb3RfcGFyYW1zCQk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CQk9IDB4MTAwLAogCS5tYXBfaW8JCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQkJPSBvbWFwM19zdGFsa2VyX2luaXRfZWFybHksCi0JLmluaXRfaXJxCQk9IG9tYXAzX3N0YWxrZXJfaW5pdF9pcnEsCisJLmluaXRfZWFybHkJCT0gb21hcDM1eHhfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQkJPSBvbWFwM19zdGFsa2VyX2luaXQsCiAJLnRpbWVyCQkJPSAmb21hcDNfc2VjdXJlX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYwppbmRleCA4NTJlYTA0Li5hMmQwZDE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzdG91Y2hib29rLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jCkBAIC0xMDQsMTUgKzEwNCw2IEBACiAJe30JLyogVGVybWluYXRvciAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDNfdG91Y2hib29rX2xjZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gIm9tYXAzdG91Y2hib29rX2xjZCIsCi0JLmlkCQk9IC0xLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb25maWcgb21hcDNfdG91Y2hib29rX2xjZF9jb25maWcgX19pbml0ZGF0YSA9IHsKLQkuY3RybF9uYW1lCT0gImludGVybmFsIiwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0b3VjaGJvb2tfdm1tYzFfc3VwcGx5W10gPSB7CiAJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjAiKSwKIH07CkBAIC0xNjUsMTQgKzE1NiwxMiBAQAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHRvdWNoYm9va192ZGFjX3N1cHBseVtdID0gewogewogCS5zdXBwbHkJCT0gInZkYWMiLAotCS5kZXYJCT0gJm9tYXAzX3RvdWNoYm9va19sY2RfZGV2aWNlLmRldiwKIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdG91Y2hib29rX3Zkdmlfc3VwcGx5W10gPSB7CiB7CiAJLnN1cHBseQkJPSAidmR2aSIsCi0JLmRldgkJPSAmb21hcDNfdG91Y2hib29rX2xjZF9kZXZpY2UuZGV2LAogfSwKIH07CiAKQEAgLTMxNiwzMCArMzA1LDEzIEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIG9tYXAzX3RvdWNoYm9va19jb25maWdbXSBfX2luaXRkYXRhID0gewotCXsgT01BUF9UQUdfTENELAkJJm9tYXAzX3RvdWNoYm9va19sY2RfY29uZmlnIH0sCi19OwotCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CiAJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKIH07CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX3RvdWNoYm9va19pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCi0JCQkJICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX3RvdWNoYm9va19pbml0X2lycSh2b2lkKQotewotCW9tYXAzX2luaXRfaXJxKCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwM190b3VjaGJvb2tfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJm9tYXAzX3RvdWNoYm9va19sY2RfZGV2aWNlLAogCSZsZWRzX2dwaW8sCiAJJmtleXNfZ3BpbywKIH07CkBAIC0zNzYsOCArMzQ4LDYgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM190b3VjaGJvb2tfaW5pdCh2b2lkKQogewogCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NCQik7Ci0Jb21hcF9ib2FyZF9jb25maWcgPSBvbWFwM190b3VjaGJvb2tfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKG9tYXAzX3RvdWNoYm9va19jb25maWcpOwogCiAJcG1fcG93ZXJfb2ZmID0gb21hcDNfdG91Y2hib29rX3Bvd2Vyb2ZmOwogCkBAIC0zODUsNiArMzU1LDggQEAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhvbWFwM190b3VjaGJvb2tfZGV2aWNlcywKIAkJCUFSUkFZX1NJWkUob21hcDNfdG91Y2hib29rX2RldmljZXMpKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKKwkJCQkgIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwogCiAJb21hcF9tdXhfaW5pdF9ncGlvKDE3MCwgT01BUF9QSU5fSU5QVVQpOwogCS8qIFJFVklTSVQgbGVhdmUgRFZJIHBvd2VyZWQgZG93biB1bnRpbCBpdCdzIG5lZWRlZCAuLi4gKi8KQEAgLTQwNCwxMSArMzc2LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoVE9VQ0hCT09LLCAiT01BUDMgdG91Y2hib29rIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBHcmVnb2lyZSBHZW50aWwgLSBodHRwOi8vd3d3LmFsd2F5c2lubm92YXRpbmcuY29tICovCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXAzX3RvdWNoYm9va19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXAzX3RvdWNoYm9va19pbml0X2lycSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNDMwX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXAzX3RvdWNoYm9va19pbml0LAogCS50aW1lcgkJPSAmb21hcDNfc2VjdXJlX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDRwYW5kYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMKaW5kZXggOWFhYTk2MC4uYThjMmM0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9tbWMuaD4KLSNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kdmkuaD4KIAogI2luY2x1ZGUgImhzbW1jLmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgpAQCAtOTUsMTIgKzk1LDYgQEAKIAkmd2wxMjcxX2RldmljZSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwNF9wYW5kYV9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYmhzX29tYXBfYm9hcmRfZGF0YSB1c2Joc19iZGF0YSBfX2luaXRjb25zdCA9IHsKIAkucG9ydF9tb2RlWzBdID0gT01BUF9FSENJX1BPUlRfTU9ERV9QSFksCiAJLnBvcnRfbW9kZVsxXSA9IE9NQVBfVVNCSFNfUE9SVF9NT0RFX1VOVVNFRCwKQEAgLTQ1NSwxNiArNDQ5LDE2IEBACiB9CiAKIC8qIFVzaW5nIGdlbmVyaWMgZGlzcGxheSBwYW5lbCAqLwotc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIG9tYXA0X2R2aV9wYW5lbCA9IHsKLQkubmFtZQkJCT0gImdlbmVyaWMiLAorc3RhdGljIHN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YSBvbWFwNF9kdmlfcGFuZWwgPSB7CiAJLnBsYXRmb3JtX2VuYWJsZQk9IG9tYXA0X3BhbmRhX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUJPSBvbWFwNF9wYW5kYV9kaXNhYmxlX2R2aSwKKwkuaTJjX2J1c19udW0gPSAzLAogfTsKIAogc3RydWN0IG9tYXBfZHNzX2RldmljZSBvbWFwNF9wYW5kYV9kdmlfZGV2aWNlID0gewogCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCiAJLm5hbWUJCQk9ICJkdmkiLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kcml2ZXJfbmFtZQkJPSAiZHZpIiwKIAkuZGF0YQkJCT0gJm9tYXA0X2R2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCiAJLnJlc2V0X2dwaW8JCT0gUEFOREFfRFZJX1RGUDQxMF9QT1dFUl9ET1dOX0dQSU8sCkBAIC01NjksMjQgKzU2MywxOSBAQAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBhbmRhX2RldmljZXMsIEFSUkFZX1NJWkUocGFuZGFfZGV2aWNlcykpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcF92d2xhbl9kZXZpY2UpOwogCWJvYXJkX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CiAJb21hcDRfdHdsNjAzMF9oc21tY19pbml0KG1tYyk7CiAJb21hcDRfZWhjaV9pbml0KCk7CiAJdXNiX211c2JfaW5pdCgmbXVzYl9ib2FyZF9kYXRhKTsKIAlvbWFwNF9wYW5kYV9kaXNwbGF5X2luaXQoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXA0X3BhbmRhX21hcF9pbyh2b2lkKQotewotCW9tYXAyX3NldF9nbG9iYWxzXzQ0M3goKTsKLQlvbWFwNDR4eF9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoT01BUDRfUEFOREEsICJPTUFQNCBQYW5kYSBib2FyZCIpCiAJLyogTWFpbnRhaW5lcjogRGF2aWQgQW5kZXJzIC0gVGV4YXMgSW5zdHJ1bWVudHMgSW5jICovCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkubWFwX2lvCQk9IG9tYXA0X3BhbmRhX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXA0X3BhbmRhX2luaXRfZWFybHksCisJLm1hcF9pbwkJPSBvbWFwNF9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwNDQzMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IGdpY19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcDRfcGFuZGFfaW5pdCwKIAkudGltZXIJCT0gJm9tYXA0X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jCmluZGV4IGY5NDlhOTkuLjRjZjdhZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kdmkuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CkBAIC0xODIsMTYgKzE4MywxNiBAQAogCWR2aV9lbmFibGVkID0gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKLQkubmFtZQkJCT0gImdlbmVyaWMiLAorc3RhdGljIHN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YSBkdmlfcGFuZWwgPSB7CiAJLnBsYXRmb3JtX2VuYWJsZQk9IG92ZXJvX3BhbmVsX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUJPSBvdmVyb19wYW5lbF9kaXNhYmxlX2R2aSwKKwkuaTJjX2J1c19udW0JCT0gMywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIG92ZXJvX2R2aV9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJkdmkiLAogCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCi0JLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRyaXZlcl9uYW1lCQk9ICJkdmkiLAogCS5kYXRhCQkJPSAmZHZpX3BhbmVsLAogCS5waHkuZHBpLmRhdGFfbGluZXMJPSAyNCwKIH07CkBAIC00NzgsMTMgKzQ3OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvdmVyb19pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCi0JCQkJICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2Joc19vbWFwX2JvYXJkX2RhdGEgdXNiaHNfYmRhdGEgX19pbml0Y29uc3QgPSB7CiAJLnBvcnRfbW9kZVswXSA9IE9NQVBfVVNCSFNfUE9SVF9NT0RFX1VOVVNFRCwKIAkucG9ydF9tb2RlWzFdID0gT01BUF9FSENJX1BPUlRfTU9ERV9QSFksCkBAIC01MTQsNiArNTA4LDggQEAKIAlvdmVyb19pMmNfaW5pdCgpOwogCW9tYXBfZGlzcGxheV9pbml0KCZvdmVyb19kc3NfZGF0YSk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCisJCQkJICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKIAlvbWFwX25hbmRfZmxhc2hfaW5pdCgwLCBvdmVyb19uYW5kX3BhcnRpdGlvbnMsCiAJCQkgICAgIEFSUkFZX1NJWkUob3Zlcm9fbmFuZF9wYXJ0aXRpb25zKSk7CiAJdXNiX211c2JfaW5pdChOVUxMKTsKQEAgLTU2MSwxMCArNTU3LDEwIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoT1ZFUk8sICJHdW1zdGl4IE92ZXJvIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gb3Zlcm9faW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNXh4X2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG92ZXJvX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcm02ODAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcm02ODAuYwppbmRleCA3ZGZlZDI0Li42MTZmYjM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJtNjgwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1ybTY4MC5jCkBAIC0xMjMsMTUgKzEyMyw2IEBACiAJb21hcDJfaHNtbWNfaW5pdChtbWMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcm02ODBfaW5pdF9lYXJseSh2b2lkKQotewotCXN0cnVjdCBvbWFwX3NkcmNfcGFyYW1zICpzZHJjX3BhcmFtczsKLQotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jc2RyY19wYXJhbXMgPSBub2tpYV9nZXRfc2RyYW1fdGltaW5ncygpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoc2RyY19wYXJhbXMsIHNkcmNfcGFyYW1zKTsKLX0KLQogI2lmZGVmIENPTkZJR19PTUFQX01VWAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCBib2FyZF9tdXhbXSBfX2luaXRkYXRhID0gewogCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCkBAIC0xNDAsMjMgKzEzMSwyMyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgcm02ODBfaW5pdCh2b2lkKQogeworCXN0cnVjdCBvbWFwX3NkcmNfcGFyYW1zICpzZHJjX3BhcmFtczsKKwogCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NCQik7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCisJc2RyY19wYXJhbXMgPSBub2tpYV9nZXRfc2RyYW1fdGltaW5ncygpOworCW9tYXBfc2RyY19pbml0KHNkcmNfcGFyYW1zLCBzZHJjX3BhcmFtcyk7CisKIAl1c2JfbXVzYl9pbml0KE5VTEwpOwogCXJtNjgwX3BlcmlwaGVyYWxzX2luaXQoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHJtNjgwX21hcF9pbyh2b2lkKQotewotCW9tYXAyX3NldF9nbG9iYWxzXzN4eHgoKTsKLQlvbWFwMzR4eF9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoTk9LSUFfUk02ODAsICJOb2tpYSBSTS02ODAgYm9hcmQiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLm1hcF9pbwkJPSBybTY4MF9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBybTY4MF9pbml0X2Vhcmx5LAorCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDM2MzBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gcm02ODBfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwppbmRleCA1YTg4NmNkLi5iYTFhYTA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwpAQCAtOTAwLDcgKzkwMCw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHRwYTYxMzBhMl9wbGF0Zm9ybV9kYXRhIHJ4NTFfdHBhNjEzMGEyX2RhdGEgX19pbml0ZGF0YV9vcl9tb2R1bGUgPSB7Ci0JLmlkCQkJPSBUUEE2MTMwQTIsCiAJLnBvd2VyX2dwaW8JCT0gOTgsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCmluZGV4IDVlYTE0MmYuLjRhZjdjNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCkBAIC03OSwzOCArNzksNiBAQAogCXs3NTA1ICsgMTUyNzQsIDQ4NDMyOSwgMX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyByeDUxX2xjZF9jb25maWcgPSB7Ci0JLmN0cmxfbmFtZQk9ICJpbnRlcm5hbCIsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfZmJtZW1fY29uZmlnIHJ4NTFfZmJtZW0wX2NvbmZpZyA9IHsKLQkuc2l6ZSA9IDc1MiAqIDEwMjQsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfZmJtZW1fY29uZmlnIHJ4NTFfZmJtZW0xX2NvbmZpZyA9IHsKLQkuc2l6ZSA9IDc1MiAqIDEwMjQsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfZmJtZW1fY29uZmlnIHJ4NTFfZmJtZW0yX2NvbmZpZyA9IHsKLQkuc2l6ZSA9IDc1MiAqIDEwMjQsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCByeDUxX2NvbmZpZ1tdID0gewotCXsgT01BUF9UQUdfRkJNRU0sCSZyeDUxX2ZibWVtMF9jb25maWcgfSwKLQl7IE9NQVBfVEFHX0ZCTUVNLAkmcng1MV9mYm1lbTFfY29uZmlnIH0sCi0JeyBPTUFQX1RBR19GQk1FTSwJJnJ4NTFfZmJtZW0yX2NvbmZpZyB9LAotCXsgT01BUF9UQUdfTENELAkJJnJ4NTFfbGNkX2NvbmZpZyB9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHJ4NTFfaW5pdF9lYXJseSh2b2lkKQotewotCXN0cnVjdCBvbWFwX3NkcmNfcGFyYW1zICpzZHJjX3BhcmFtczsKLQotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jc2RyY19wYXJhbXMgPSBub2tpYV9nZXRfc2RyYW1fdGltaW5ncygpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoc2RyY19wYXJhbXMsIHNkcmNfcGFyYW1zKTsKLX0KLQogZXh0ZXJuIHZvaWQgX19pbml0IHJ4NTFfcGVyaXBoZXJhbHNfaW5pdCh2b2lkKTsKIAogI2lmZGVmIENPTkZJR19PTUFQX01VWApAQCAtMTI3LDExICs5NSwxNSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgcng1MV9pbml0KHZvaWQpCiB7CisJc3RydWN0IG9tYXBfc2RyY19wYXJhbXMgKnNkcmNfcGFyYW1zOworCiAJb21hcDNfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfQ0JCKTsKLQlvbWFwX2JvYXJkX2NvbmZpZyA9IHJ4NTFfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHJ4NTFfY29uZmlnKTsKIAlvbWFwM19wbV9pbml0X2NwdWlkbGUocng1MV9jcHVpZGxlX3BhcmFtcyk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCisJc2RyY19wYXJhbXMgPSBub2tpYV9nZXRfc2RyYW1fdGltaW5ncygpOworCW9tYXBfc2RyY19pbml0KHNkcmNfcGFyYW1zLCBzZHJjX3BhcmFtcyk7CisKIAl1c2JfbXVzYl9pbml0KCZtdXNiX2JvYXJkX2RhdGEpOwogCXJ4NTFfcGVyaXBoZXJhbHNfaW5pdCgpOwogCkBAIC0xNDIsMTIgKzExNCw2IEBACiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZsZWRzX2dwaW8pOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcng1MV9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMl9zZXRfZ2xvYmFsc18zeHh4KCk7Ci0Jb21hcDM0eHhfbWFwX2NvbW1vbl9pbygpOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgcng1MV9yZXNlcnZlKHZvaWQpCiB7CiAJcng1MV92aWRlb19tZW1faW5pdCgpOwpAQCAtMTU2LDEwICsxMjIsMTAgQEAKIAogTUFDSElORV9TVEFSVChOT0tJQV9SWDUxLCAiTm9raWEgUlgtNTEgYm9hcmQiKQogCS8qIE1haW50YWluZXI6IExhdXJpIExldWtrdW5lbiA8bGF1cmkubGV1a2t1bmVuQG5va2lhLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gcng1MV9yZXNlcnZlLAotCS5tYXBfaW8JCT0gcng1MV9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSByeDUxX2luaXRfZWFybHksCisJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwMzQzMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSByeDUxX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtdGk4MTY4ZXZtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXRpODE2OGV2bS5jCmluZGV4IGE4NWQ1YjAuLmU2ZWU4ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtdGk4MTY4ZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC10aTgxNjhldm0uYwpAQCAtMjcsMzAgKzI3LDI0IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCB0aTgxNjhfZXZtX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgdGk4MTY4X2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCB0aTgxNjhfZXZtX2luaXQodm9pZCkKIHsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CiAJb21hcF9ib2FyZF9jb25maWcgPSB0aTgxNjhfZXZtX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRSh0aTgxNjhfZXZtX2NvbmZpZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB0aTgxNjhfZXZtX21hcF9pbyh2b2lkKQogewotCW9tYXAyX3NldF9nbG9iYWxzX3RpODE2eCgpOwogCW9tYXB0aTgxNnhfbWFwX2NvbW1vbl9pbygpOwogfQogCiBNQUNISU5FX1NUQVJUKFRJODE2OEVWTSwgInRpODE2OGV2bSIpCiAJLyogTWFpbnRhaW5lcjogVGV4YXMgSW5zdHJ1bWVudHMgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gdGk4MTY4X2V2bV9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSB0aTgxNjhfaW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IHRpODE2eF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IHRpODE2eF9pbml0X2lycSwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSB0aTgxNjhfZXZtX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS5jCmluZGV4IDhhOThjM2MuLmJlNjY4NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS5jCkBAIC0zNCwxNyArMzQsNiBAQAogCiAjZGVmaW5lIFpPT00zX0VIQ0lfUkVTRVRfR1BJTwkJNjQKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfem9vbV9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlpZiAobWFjaGluZV9pc19vbWFwX3pvb20yKCkpCi0JCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKLQkJCQkJICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKLQllbHNlIGlmIChtYWNoaW5lX2lzX29tYXBfem9vbTMoKSkKLQkJb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhoOG1ieDAwdTBtZXIwZW1fc2RyY19wYXJhbXMsCi0JCQkJCSAgaDhtYngwMHUwbWVyMGVtX3NkcmNfcGFyYW1zKTsKLX0KLQogI2lmZGVmIENPTkZJR19PTUFQX01VWAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCBib2FyZF9tdXhbXSBfX2luaXRkYXRhID0gewogCS8qIFdMQU4gSVJRIC0gR1BJTyAxNjIgKi8KQEAgLTEyOSwyNCArMTE4LDMyIEBACiAJCQkJCQlaT09NX05BTkRfQ1MsIE5BTkRfQlVTV0lEVEhfMTYpOwogCXpvb21fZGVidWdib2FyZF9pbml0KCk7CiAJem9vbV9wZXJpcGhlcmFsc19pbml0KCk7CisKKwlpZiAobWFjaGluZV9pc19vbWFwX3pvb20yKCkpCisJCW9tYXBfc2RyY19pbml0KG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCisJCQkJCSAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7CisJZWxzZSBpZiAobWFjaGluZV9pc19vbWFwX3pvb20zKCkpCisJCW9tYXBfc2RyY19pbml0KGg4bWJ4MDB1MG1lcjBlbV9zZHJjX3BhcmFtcywKKwkJCQkJICBoOG1ieDAwdTBtZXIwZW1fc2RyY19wYXJhbXMpOworCiAJem9vbV9kaXNwbGF5X2luaXQoKTsKIH0KIAogTUFDSElORV9TVEFSVChPTUFQX1pPT00yLCAiT01BUCBab29tMiBib2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfem9vbV9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM0MzBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF96b29tX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9aT09NMywgIk9NQVAgWm9vbTMgYm9hcmQiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwX3pvb21faW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNjMwX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfem9vbV9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsa3RfZHBsbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbGt0X2RwbGwuYwppbmRleCBiY2ZmZWUwLi5lMDY5YTliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsa3RfZHBsbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xrdF9kcGxsLmMKQEAgLTQ2LDEwICs0NiwxOSBAQAogCQkJCQkgKERQTExfU0NBTEVfRkFDVE9SIC8gRFBMTF9TQ0FMRV9CQVNFKSkKIAogLyogRFBMTCB2YWxpZCBGaW50IGZyZXF1ZW5jeSBiYW5kIGxpbWl0cyAtIGZyb20gMzR4eCBUUk0gU2VjdGlvbiA0LjcuNi4yICovCi0jZGVmaW5lIERQTExfRklOVF9CQU5EMV9NSU4JCTc1MDAwMAotI2RlZmluZSBEUExMX0ZJTlRfQkFORDFfTUFYCQkyMTAwMDAwCi0jZGVmaW5lIERQTExfRklOVF9CQU5EMl9NSU4JCTc1MDAwMDAKLSNkZWZpbmUgRFBMTF9GSU5UX0JBTkQyX01BWAkJMjEwMDAwMDAKKyNkZWZpbmUgT01BUDM0MzBfRFBMTF9GSU5UX0JBTkQxX01JTgk3NTAwMDAKKyNkZWZpbmUgT01BUDM0MzBfRFBMTF9GSU5UX0JBTkQxX01BWAkyMTAwMDAwCisjZGVmaW5lIE9NQVAzNDMwX0RQTExfRklOVF9CQU5EMl9NSU4JNzUwMDAwMAorI2RlZmluZSBPTUFQMzQzMF9EUExMX0ZJTlRfQkFORDJfTUFYCTIxMDAwMDAwCisKKy8qCisgKiBEUExMIHZhbGlkIEZpbnQgZnJlcXVlbmN5IHJhbmdlIGZvciBPTUFQMzZ4eCBhbmQgT01BUDR4eHguCisgKiBGcm9tIGRldmljZSBkYXRhIG1hbnVhbCBzZWN0aW9uIDQuMyAiRFBMTCBhbmQgRExMIFNwZWNpZmljYXRpb25zIi4KKyAqLworI2RlZmluZSBPTUFQM1BMVVNfRFBMTF9GSU5UX0pUWVBFX01JTgk1MDAwMDAKKyNkZWZpbmUgT01BUDNQTFVTX0RQTExfRklOVF9KVFlQRV9NQVgJMjUwMDAwMAorI2RlZmluZSBPTUFQM1BMVVNfRFBMTF9GSU5UX01JTgkJMzIwMDAKKyNkZWZpbmUgT01BUDNQTFVTX0RQTExfRklOVF9NQVgJCTUyMDAwMDAwCiAKIC8qIF9kcGxsX3Rlc3RfZmludCgpIHJldHVybiBjb2RlcyAqLwogI2RlZmluZSBEUExMX0ZJTlRfVU5ERVJGTE9XCQktMQpAQCAtNzEsMzMgKzgwLDQzIEBACiBzdGF0aWMgaW50IF9kcGxsX3Rlc3RfZmludChzdHJ1Y3QgY2xrICpjbGssIHU4IG4pCiB7CiAJc3RydWN0IGRwbGxfZGF0YSAqZGQ7Ci0JbG9uZyBmaW50OworCWxvbmcgZmludCwgZmludF9taW4sIGZpbnRfbWF4OwogCWludCByZXQgPSAwOwogCiAJZGQgPSBjbGstPmRwbGxfZGF0YTsKIAogCS8qIERQTEwgZGl2aWRlciBtdXN0IHJlc3VsdCBpbiBhIHZhbGlkIGppdHRlciBjb3JyZWN0aW9uIHZhbCAqLwogCWZpbnQgPSBjbGstPnBhcmVudC0+cmF0ZSAvIG47Ci0JaWYgKGZpbnQgPCBEUExMX0ZJTlRfQkFORDFfTUlOKSB7CiAKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKKwkJLyogU2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIE9NQVAyLCBzbyB3YXJuIGlmIGl0IGlzIGNhbGxlZCAqLworCQlXQVJOKDEsICJObyBmaW50IGxpbWl0cyBhdmFpbGFibGUgZm9yIE9NQVAyIVxuIik7CisJCXJldHVybiBEUExMX0ZJTlRfSU5WQUxJRDsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzQzMCgpKSB7CisJCWZpbnRfbWluID0gT01BUDM0MzBfRFBMTF9GSU5UX0JBTkQxX01JTjsKKwkJZmludF9tYXggPSBPTUFQMzQzMF9EUExMX0ZJTlRfQkFORDJfTUFYOworCX0gZWxzZSBpZiAoZGQtPmZsYWdzICYgRFBMTF9KX1RZUEUpIHsKKwkJZmludF9taW4gPSBPTUFQM1BMVVNfRFBMTF9GSU5UX0pUWVBFX01JTjsKKwkJZmludF9tYXggPSBPTUFQM1BMVVNfRFBMTF9GSU5UX0pUWVBFX01BWDsKKwl9IGVsc2UgeworCQlmaW50X21pbiA9IE9NQVAzUExVU19EUExMX0ZJTlRfTUlOOworCQlmaW50X21heCA9IE9NQVAzUExVU19EUExMX0ZJTlRfTUFYOworCX0KKworCWlmIChmaW50IDwgZmludF9taW4pIHsKIAkJcHJfZGVidWcoInJlamVjdGluZyBuPSVkIGR1ZSB0byBGaW50IGZhaWx1cmUsICIKIAkJCSAibG93ZXJpbmcgbWF4X2RpdmlkZXJcbiIsIG4pOwogCQlkZC0+bWF4X2RpdmlkZXIgPSBuOwogCQlyZXQgPSBEUExMX0ZJTlRfVU5ERVJGTE9XOwotCi0JfSBlbHNlIGlmIChmaW50ID4gRFBMTF9GSU5UX0JBTkQxX01BWCAmJgotCQkgICBmaW50IDwgRFBMTF9GSU5UX0JBTkQyX01JTikgewotCi0JCXByX2RlYnVnKCJyZWplY3Rpbmcgbj0lZCBkdWUgdG8gRmludCBmYWlsdXJlXG4iLCBuKTsKLQkJcmV0ID0gRFBMTF9GSU5UX0lOVkFMSUQ7Ci0KLQl9IGVsc2UgaWYgKGZpbnQgPiBEUExMX0ZJTlRfQkFORDJfTUFYKSB7Ci0KKwl9IGVsc2UgaWYgKGZpbnQgPiBmaW50X21heCkgewogCQlwcl9kZWJ1ZygicmVqZWN0aW5nIG49JWQgZHVlIHRvIEZpbnQgZmFpbHVyZSwgIgogCQkJICJib29zdGluZyBtaW5fZGl2aWRlclxuIiwgbik7CiAJCWRkLT5taW5fZGl2aWRlciA9IG47CiAJCXJldCA9IERQTExfRklOVF9JTlZBTElEOwotCisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDM0MzAoKSAmJiBmaW50ID4gT01BUDM0MzBfRFBMTF9GSU5UX0JBTkQxX01BWCAmJgorCQkgICBmaW50IDwgT01BUDM0MzBfRFBMTF9GSU5UX0JBTkQyX01JTikgeworCQlwcl9kZWJ1ZygicmVqZWN0aW5nIG49JWQgZHVlIHRvIEZpbnQgZmFpbHVyZVxuIiwgbik7CisJCXJldCA9IERQTExfRklOVF9JTlZBTElEOwogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmgKaW5kZXggNDhhYzU2OC4uMjMxMWJjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suaApAQCAtNjYsNiArNjYsOCBAQAogaW50IG9tYXA0X2RwbGxteF9nYXRlY3RybF9yZWFkKHN0cnVjdCBjbGsgKmNsayk7CiB2b2lkIG9tYXA0X2RwbGxteF9hbGxvd19nYXRlY3RybChzdHJ1Y3QgY2xrICpjbGspOwogdm9pZCBvbWFwNF9kcGxsbXhfZGVueV9nYXRlY3RybChzdHJ1Y3QgY2xrICpjbGspOworbG9uZyBvbWFwNF9kcGxsX3JlZ200eGVuX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHRhcmdldF9yYXRlKTsKK3Vuc2lnbmVkIGxvbmcgb21hcDRfZHBsbF9yZWdtNHhlbl9yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKIAogI2lmZGVmIENPTkZJR19PTUFQX1JFU0VUX0NMT0NLUwogdm9pZCBvbWFwMl9jbGtfZGlzYWJsZV91bnVzZWQoc3RydWN0IGNsayAqY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNDIwX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNDIwX2RhdGEuYwppbmRleCBkZWJjMDQwLi42MWFkMzg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjQyMF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0MjBfZGF0YS5jCkBAIC0xODk4LDYgKzE4OTgsNDIgQEAKIAlDTEsoTlVMTCwJInBrYV9pY2siLAkmcGthX2ljaywJQ0tfMjQyWCksCiAJQ0xLKE5VTEwsCSJ1c2JfZmNrIiwJJnVzYl9mY2ssCUNLXzI0MlgpLAogCUNMSygibXVzYi1oZHJjIiwJImZjayIsCSZvc2NfY2ssCUNLXzI0MlgpLAorCUNMSygib21hcF90aW1lci4xIiwJIjMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjIiLAkiMzJrX2NrIiwJJmZ1bmNfMzJrX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMyIsCSIzMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci40IiwJIjMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjUiLAkiMzJrX2NrIiwJJmZ1bmNfMzJrX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNiIsCSIzMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci43IiwJIjMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjgiLAkiMzJrX2NrIiwJJmZ1bmNfMzJrX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOSIsCSIzMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMCIsCSIzMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMSIsCSIzMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMiIsCSIzMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4yIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4zIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci40IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci41IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci42IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci43IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci44IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci45IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMCIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTEiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEyIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4yIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4zIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci40IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci41IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci42IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci43IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci44IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci45IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMCIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTEiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEyIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNDMwX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNDMwX2RhdGEuYwppbmRleCA5NmE5NDJlLi4wY2MxMjg3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjQzMF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0MzBfZGF0YS5jCkBAIC0xOTk4LDYgKzE5OTgsNDIgQEAKIAlDTEsoTlVMTCwJIm1kbV9pbnRjX2ljayIsCSZtZG1faW50Y19pY2ssCUNLXzI0M1gpLAogCUNMSygib21hcF9oc21tYy4wIiwgIm1tY2hzZGJfZmNrIiwJJm1tY2hzZGIxX2ZjaywJQ0tfMjQzWCksCiAJQ0xLKCJvbWFwX2hzbW1jLjEiLCAibW1jaHNkYl9mY2siLAkmbW1jaHNkYjJfZmNrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMSIsCSIzMmtfY2siLCAgJmZ1bmNfMzJrX2NrLCAgIENLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4yIiwJIjMya19jayIsICAmZnVuY18zMmtfY2ssICAgQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjMiLAkiMzJrX2NrIiwgICZmdW5jXzMya19jaywgICBDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNCIsCSIzMmtfY2siLCAgJmZ1bmNfMzJrX2NrLCAgIENLXzI0M1gpLAorCUNMSygib21hcF90aW1lci41IiwJIjMya19jayIsICAmZnVuY18zMmtfY2ssICAgQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjYiLAkiMzJrX2NrIiwgICZmdW5jXzMya19jaywgICBDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNyIsCSIzMmtfY2siLCAgJmZ1bmNfMzJrX2NrLCAgIENLXzI0M1gpLAorCUNMSygib21hcF90aW1lci44IiwJIjMya19jayIsICAmZnVuY18zMmtfY2ssICAgQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjkiLAkiMzJrX2NrIiwgICZmdW5jXzMya19jaywgICBDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTAiLAkiMzJrX2NrIiwgICZmdW5jXzMya19jaywgICBDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTEiLAkiMzJrX2NrIiwgICZmdW5jXzMya19jaywgICBDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTIiLAkiMzJrX2NrIiwgICZmdW5jXzMya19jaywgICBDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMSIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMiIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMyIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNCIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNSIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNiIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNyIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOCIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOSIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTAiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjExIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMiIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMSIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMiIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMyIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNCIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNSIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNiIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNyIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOCIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOSIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTAiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjExIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMiIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrM3h4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrM3h4eF9kYXRhLmMKaW5kZXggYjliODQ0Ni4uNWQwMDY0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazN4eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szeHh4X2RhdGEuYwpAQCAtMzQ2NCw2ICszNDY0LDMwIEBACiAJQ0xLKCJtdXNiLWFtMzV4IiwJImZjayIsCQkmaHNvdGd1c2JfZmNrX2FtMzV4eCwJQ0tfQU0zNVhYKSwKIAlDTEsoTlVMTCwJImhlY2NfY2siLAkmaGVjY19jaywJQ0tfQU0zNVhYKSwKIAlDTEsoTlVMTCwJInVhcnQ0X2ljayIsCSZ1YXJ0NF9pY2tfYW0zNXh4LAlDS19BTTM1WFgpLAorCUNMSygib21hcF90aW1lci4xIiwJIjMya19jayIsCSZvbWFwXzMya19mY2ssICBDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuMiIsCSIzMmtfY2siLAkmb21hcF8zMmtfZmNrLCAgQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjMiLAkiMzJrX2NrIiwJJm9tYXBfMzJrX2ZjaywgIENLXzNYWFgpLAorCUNMSygib21hcF90aW1lci40IiwJIjMya19jayIsCSZvbWFwXzMya19mY2ssICBDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuNSIsCSIzMmtfY2siLAkmb21hcF8zMmtfZmNrLCAgQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjYiLAkiMzJrX2NrIiwJJm9tYXBfMzJrX2ZjaywgIENLXzNYWFgpLAorCUNMSygib21hcF90aW1lci43IiwJIjMya19jayIsCSZvbWFwXzMya19mY2ssICBDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuOCIsCSIzMmtfY2siLAkmb21hcF8zMmtfZmNrLCAgQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjkiLAkiMzJrX2NrIiwJJm9tYXBfMzJrX2ZjaywgIENLXzNYWFgpLAorCUNMSygib21hcF90aW1lci4xMCIsCSIzMmtfY2siLAkmb21hcF8zMmtfZmNrLCAgQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjExIiwJIjMya19jayIsCSZvbWFwXzMya19mY2ssICBDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTIiLAkiMzJrX2NrIiwJJm9tYXBfMzJrX2ZjaywgIENLXzNYWFgpLAorCUNMSygib21hcF90aW1lci4xIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci4yIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci4zIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci40IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci41IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci42IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci43IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci44IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci45IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci4xMCIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTEiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEyIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAogfTsKIAogCkBAIC0zNDcyLDcgKzM0OTYsMTYgQEAKIAlzdHJ1Y3Qgb21hcF9jbGsgKmM7CiAJdTMyIGNwdV9jbGtmbGcgPSAwOwogCi0JaWYgKGNwdV9pc19vbWFwMzUxNygpKSB7CisJLyoKKwkgKiAzNTA1IG11c3QgYmUgdGVzdGVkIGJlZm9yZSAzNTE3LCBzaW5jZSAzNTE3IHJldHVybnMgdHJ1ZQorCSAqIGZvciBib3RoIEFNMzUxNyBjaGlwcyBhbmQgQU0zNTE3IGZhbWlseSBjaGlwcywgd2hpY2gKKwkgKiBpbmNsdWRlcyAzNTA1LiAgVW5mb3J0dW5hdGVseSB0aGVyZSdzIG5vIG9idmlvdXMgZmFtaWx5CisJICogdGVzdCBmb3IgMzUxNy8zNTA1IDotKAorCSAqLworCWlmIChjcHVfaXNfb21hcDM1MDUoKSkgeworCQljcHVfbWFzayA9IFJBVEVfSU5fMzRYWDsKKwkJY3B1X2Nsa2ZsZyA9IENLXzM1MDU7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDM1MTcoKSkgewogCQljcHVfbWFzayA9IFJBVEVfSU5fMzRYWDsKIAkJY3B1X2Nsa2ZsZyA9IENLXzM1MTc7CiAJfSBlbHNlIGlmIChjcHVfaXNfb21hcDM1MDUoKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4LmgKaW5kZXggN2NlYjg3MC4uMjg3YTQ2ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrNDR4eC5oCkBAIC04LDYgKzgsMTMgQEAKICNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NMT0NLNDRYWF9ICiAjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9DTE9DSzQ0WFhfSAogCisvKgorICogT01BUDQ0MzBfUkVHTTRYRU5fTVVMVDogSWYgdGhlIENNX0NMS01PREVfRFBMTF9BQkUuRFBMTF9SRUdNNFhFTiBiaXQgaXMKKyAqICAgIHNldCwgdGhlbiB0aGUgRFBMTCdzIGxvY2sgZnJlcXVlbmN5IGlzIG11bHRpcGxpZWQgYnkgNCAoT01BUDQ0MzAgVFJNCisgKiAgICB2ViBTZWN0aW9uIDMuNi4zLjMuMSAiRFBMTHMgT3V0cHV0IENsb2NrcyBQYXJhbWV0ZXJzIikKKyAqLworI2RlZmluZSBPTUFQNDQzMF9SRUdNNFhFTl9NVUxUCTQKKwogaW50IG9tYXA0eHh4X2Nsa19pbml0KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4X2RhdGEuYwppbmRleCBjMGI2ZmJkLi4wNzk4YTgwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrNDR4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHhfZGF0YS5jCkBAIC0yNzAsOCArMjcwLDggQEAKIAkuZHBsbF9kYXRhCT0gJmRwbGxfYWJlX2RkLAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2RwbGxfcGFyZW50LAogCS5vcHMJCT0gJmNsa29wc19vbWFwM19ub25jb3JlX2RwbGxfb3BzLAotCS5yZWNhbGMJCT0gJm9tYXAzX2RwbGxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2RwbGxfcm91bmRfcmF0ZSwKKwkucmVjYWxjCQk9ICZvbWFwNF9kcGxsX3JlZ200eGVuX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwNF9kcGxsX3JlZ200eGVuX3JvdW5kX3JhdGUsCiAJLnNldF9yYXRlCT0gJm9tYXAzX25vbmNvcmVfZHBsbF9zZXRfcmF0ZSwKIH07CiAKQEAgLTExOTUsMTEgKzExOTUsMjUgQEAKIAkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXYyXzJ0bzFfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIG9jcF9hYmVfaWNsa19kaXZbXSA9IHsKKwl7IC5wYXJlbnQgPSAmYWVzc19mY2xrLCAucmF0ZXMgPSBkaXYyXzJ0bzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCiBzdGF0aWMgc3RydWN0IGNsayBvY3BfYWJlX2ljbGsgPSB7CiAJLm5hbWUJCT0gIm9jcF9hYmVfaWNsayIsCiAJLnBhcmVudAkJPSAmYWVzc19mY2xrLAorCS5jbGtzZWwJCT0gb2NwX2FiZV9pY2xrX2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfQUVTU19DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9BRVNTX0ZDTEtfTUFTSywKIAkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBwZXJfYWJlXzI0bV9mY2xrID0gewpAQCAtMTM5OCw5ICsxNDEyLDkgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2M184dG8zMl9yYXRlc1tdID0gewotCXsgLmRpdiA9IDgsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0WFggfSwKLQl7IC5kaXYgPSAxNiwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fNDRYWCB9LAotCXsgLmRpdiA9IDMyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl80NFhYIH0sCisJeyAuZGl2ID0gOCwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fNDQ2MCB9LAorCXsgLmRpdiA9IDE2LCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl80NDYwIH0sCisJeyAuZGl2ID0gMzIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0NjAgfSwKIAl7IC5kaXYgPSAwIH0sCiB9OwogCkBAIC0zMzYzLDYgKzMzNzcsMjggQEAKIAlDTEsoInVzYmhzLW9tYXAuMCIsCSJ1c2Job3N0X2ljayIsCQkmZHVtbXlfY2ssCQlDS180NDNYKSwKIAlDTEsoInVzYmhzLW9tYXAuMCIsCSJ1c2J0bGxfZmNrIiwJCSZkdW1teV9jaywJQ0tfNDQzWCksCiAJQ0xLKCJvbWFwX3dkdCIsCSJpY2siLAkJCQkmZHVtbXlfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci4xIiwJIjMya19jayIsCSZzeXNfMzJrX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMiIsCSIzMmtfY2siLAkmc3lzXzMya19jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjMiLAkiMzJrX2NrIiwJJnN5c18zMmtfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci40IiwJIjMya19jayIsCSZzeXNfMzJrX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNSIsCSIzMmtfY2siLAkmc3lzXzMya19jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjYiLAkiMzJrX2NrIiwJJnN5c18zMmtfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci43IiwJIjMya19jayIsCSZzeXNfMzJrX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOCIsCSIzMmtfY2siLAkmc3lzXzMya19jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjkiLAkiMzJrX2NrIiwJJnN5c18zMmtfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci4xMCIsCSIzMmtfY2siLAkmc3lzXzMya19jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjExIiwJIjMya19jayIsCSZzeXNfMzJrX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMSIsCSJzeXNfY2siLAkmc3lzX2Nsa2luX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMiIsCSJzeXNfY2siLAkmc3lzX2Nsa2luX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMyIsCSJzeXNfY2siLAkmc3lzX2Nsa2luX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNCIsCSJzeXNfY2siLAkmc3lzX2Nsa2luX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOSIsCSJzeXNfY2siLAkmc3lzX2Nsa2luX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTAiLAkic3lzX2NrIiwJJnN5c19jbGtpbl9jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjExIiwJInN5c19jayIsCSZzeXNfY2xraW5fY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci41IiwJInN5c19jayIsCSZzeWNfY2xrX2Rpdl9jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjYiLAkic3lzX2NrIiwJJnN5Y19jbGtfZGl2X2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNyIsCSJzeXNfY2siLAkmc3ljX2Nsa19kaXZfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci44IiwJInN5c19jayIsCSZzeWNfY2xrX2Rpdl9jaywJQ0tfNDQzWCksCiB9OwogCiBpbnQgX19pbml0IG9tYXA0eHh4X2Nsa19pbml0KHZvaWQpCkBAIC0zMzcwLDEyICszNDA2LDEyIEBACiAJc3RydWN0IG9tYXBfY2xrICpjOwogCXUzMiBjcHVfY2xrZmxnOwogCi0JaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7CisJaWYgKGNwdV9pc19vbWFwNDQzeCgpKSB7CiAJCWNwdV9tYXNrID0gUkFURV9JTl80NDMwOwogCQljcHVfY2xrZmxnID0gQ0tfNDQzWDsKIAl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDQ2eCgpKSB7Ci0JCWNwdV9tYXNrID0gUkFURV9JTl80NDYwOwotCQljcHVfY2xrZmxnID0gQ0tfNDQ2WDsKKwkJY3B1X21hc2sgPSBSQVRFX0lOXzQ0NjAgfCBSQVRFX0lOXzQ0MzA7CisJCWNwdV9jbGtmbGcgPSBDS180NDZYIHwgQ0tfNDQzWDsKIAl9IGVsc2UgewogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmMKaW5kZXggOGYwODkwNi4uYWQwNzY4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CkBAIC03Myw5ICs3NCw2IEBACiAJaWYgKCFjbGtkbSB8fCAhY2xrZG0tPm5hbWUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFvbWFwX2NoaXBfaXMoY2xrZG0tPm9tYXBfY2hpcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJcHdyZG0gPSBwd3JkbV9sb29rdXAoY2xrZG0tPnB3cmRtLm5hbWUpOwogCWlmICghcHdyZG0pIHsKIAkJcHJfZXJyKCJjbG9ja2RvbWFpbjogJXM6IHBvd2VyZG9tYWluICVzIGRvZXMgbm90IGV4aXN0XG4iLApAQCAtMTA1LDEzICsxMDMsMTAgQEAKIHsKIAlzdHJ1Y3QgY2xrZG1fZGVwICpjZDsKIAotCWlmICghY2xrZG0gfHwgIWRlcHMgfHwgIW9tYXBfY2hpcF9pcyhjbGtkbS0+b21hcF9jaGlwKSkKKwlpZiAoIWNsa2RtIHx8ICFkZXBzKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWZvciAoY2QgPSBkZXBzOyBjZC0+Y2xrZG1fbmFtZTsgY2QrKykgewotCQlpZiAoIW9tYXBfY2hpcF9pcyhjZC0+b21hcF9jaGlwKSkKLQkJCWNvbnRpbnVlOwotCiAJCWlmICghY2QtPmNsa2RtICYmIGNkLT5jbGtkbV9uYW1lKQogCQkJY2QtPmNsa2RtID0gX2Nsa2RtX2xvb2t1cChjZC0+Y2xrZG1fbmFtZSk7CiAKQEAgLTE0OCw5ICsxNDMsNiBAQAogCWlmICghYXV0b2RlcCkKIAkJcmV0dXJuOwogCi0JaWYgKCFvbWFwX2NoaXBfaXMoYXV0b2RlcC0+b21hcF9jaGlwKSkKLQkJcmV0dXJuOwotCiAJY2xrZG0gPSBjbGtkbV9sb29rdXAoYXV0b2RlcC0+Y2xrZG0ubmFtZSk7CiAJaWYgKCFjbGtkbSkgewogCQlwcl9lcnIoImNsb2NrZG9tYWluOiBhdXRvZGVwczogY2xvY2tkb21haW4gJXMgZG9lcyBub3QgZXhpc3RcbiIsCkBAIC0xODIsOSArMTc0LDYgQEAKIAkJaWYgKElTX0VSUihhdXRvZGVwLT5jbGtkbS5wdHIpKQogCQkJY29udGludWU7CiAKLQkJaWYgKCFvbWFwX2NoaXBfaXMoYXV0b2RlcC0+b21hcF9jaGlwKSkKLQkJCWNvbnRpbnVlOwotCiAJCXByX2RlYnVnKCJjbG9ja2RvbWFpbjogYWRkaW5nICVzIHNsZWVwZGVwL3drZGVwIGZvciAiCiAJCQkgImNsa2RtICVzXG4iLCBhdXRvZGVwLT5jbGtkbS5wdHItPm5hbWUsCiAJCQkgY2xrZG0tPm5hbWUpOwpAQCAtMjE2LDkgKzIwNSw2IEBACiAJCWlmIChJU19FUlIoYXV0b2RlcC0+Y2xrZG0ucHRyKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICghb21hcF9jaGlwX2lzKGF1dG9kZXAtPm9tYXBfY2hpcCkpCi0JCQljb250aW51ZTsKLQogCQlwcl9kZWJ1ZygiY2xvY2tkb21haW46IHJlbW92aW5nICVzIHNsZWVwZGVwL3drZGVwIGZvciAiCiAJCQkgImNsa2RtICVzXG4iLCBhdXRvZGVwLT5jbGtkbS5wdHItPm5hbWUsCiAJCQkgY2xrZG0tPm5hbWUpOwpAQCAtMjQzLDggKzIyOSw2IEBACiAJc3RydWN0IGNsa2RtX2RlcCAqY2Q7CiAKIAlmb3IgKGNkID0gY2xrZG1fZGVwczsgY2QgJiYgY2QtPmNsa2RtX25hbWU7IGNkKyspIHsKLQkJaWYgKCFvbWFwX2NoaXBfaXMoY2QtPm9tYXBfY2hpcCkpCi0JCQljb250aW51ZTsKIAkJaWYgKGNkLT5jbGtkbSkKIAkJCWNvbnRpbnVlOwogCQljZC0+Y2xrZG0gPSBfY2xrZG1fbG9va3VwKGNkLT5jbGtkbV9uYW1lKTsKQEAgLTI1Nyw0MyArMjQxLDExMyBAQAogLyogUHVibGljIGZ1bmN0aW9ucyAqLwogCiAvKioKLSAqIGNsa2RtX2luaXQgLSBzZXQgdXAgdGhlIGNsb2NrZG9tYWluIGxheWVyCi0gKiBAY2xrZG1zOiBvcHRpb25hbCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNsb2NrZG9tYWlucyB0byByZWdpc3RlcgotICogQGluaXRfYXV0b2RlcHM6IG9wdGlvbmFsIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYXV0b2RlcHMgdG8gcmVnaXN0ZXIKLSAqIEBjdXN0b21fZnVuY3M6IGZ1bmMgcG9pbnRlcnMgZm9yIGFyY2ggc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCisgKiBjbGtkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcyAtIHJlZ2lzdGVyIGNsb2NrZG9tYWluIGltcGxlbWVudGF0aW9uIGZucworICogQGNvOiBmdW5jIHBvaW50ZXJzIGZvciBhcmNoIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucwogICoKLSAqIFNldCB1cCBpbnRlcm5hbCBzdGF0ZS4gIElmIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjbG9ja2RvbWFpbnMKLSAqIEBjbGtkbXMgd2FzIHN1cHBsaWVkLCBsb29wIHRocm91Z2ggdGhlIGxpc3Qgb2YgY2xvY2tkb21haW5zLAotICogcmVnaXN0ZXIgYWxsIHRoYXQgYXJlIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybS4gU2ltaWxhcmx5LAotICogaWYgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNsb2NrZG9tYWluIGF1dG9kZXBlbmRlbmNpZXMKLSAqIEBpbml0X2F1dG9kZXBzIHdhcyBwcm92aWRlZCwgcmVnaXN0ZXIgdGhvc2UuICBObyByZXR1cm4gdmFsdWUuCisgKiBSZWdpc3RlciB0aGUgbGlzdCBvZiBmdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGltcGxlbWVudCB0aGUKKyAqIGNsb2NrZG9tYWluIGZ1bmN0aW9ucyBvbiBkaWZmZXJlbnQgT01BUCBTb0NzLiAgU2hvdWxkIGJlIGNhbGxlZAorICogYmVmb3JlIGFueSBvdGhlciBjbGtkbV9yZWdpc3RlciooKSBmdW5jdGlvbi4gIFJldHVybnMgLUVJTlZBTCBpZgorICogQGNvIGlzIG51bGwsIC1FRVhJU1QgaWYgcGxhdGZvcm0gZnVuY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCisgKiByZWdpc3RlcmVkLCBvciAwIHVwb24gc3VjY2Vzcy4KICAqLwotdm9pZCBjbGtkbV9pbml0KHN0cnVjdCBjbG9ja2RvbWFpbiAqKmNsa2RtcywKLQkJc3RydWN0IGNsa2RtX2F1dG9kZXAgKmluaXRfYXV0b2RlcHMsCi0JCXN0cnVjdCBjbGtkbV9vcHMgKmN1c3RvbV9mdW5jcykKK2ludCBjbGtkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcyhzdHJ1Y3QgY2xrZG1fb3BzICpjbykKK3sKKwlpZiAoIWNvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhcmNoX2Nsa2RtKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWFyY2hfY2xrZG0gPSBjbzsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKiBjbGtkbV9yZWdpc3Rlcl9jbGtkbXMgLSByZWdpc3RlciBTb0MgY2xvY2tkb21haW5zCisgKiBAY3M6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3RydWN0IGNsb2NrZG9tYWluIHRvIHJlZ2lzdGVyCisgKgorICogUmVnaXN0ZXIgdGhlIGNsb2NrZG9tYWlucyBhdmFpbGFibGUgb24gYSBwYXJ0aWN1bGFyIE9NQVAgU29DLiAgTXVzdAorICogYmUgY2FsbGVkIGFmdGVyIGNsa2RtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKCkuICBNYXkgYmUgY2FsbGVkCisgKiBtdWx0aXBsZSB0aW1lcy4gIFJldHVybnMgLUVBQ0NFUyBpZiBjYWxsZWQgYmVmb3JlCisgKiBjbGtkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcygpOyAtRUlOVkFMIGlmIHRoZSBhcmd1bWVudCBAY3MgaXMKKyAqIG51bGw7IG9yIDAgdXBvbiBzdWNjZXNzLgorICovCitpbnQgY2xrZG1fcmVnaXN0ZXJfY2xrZG1zKHN0cnVjdCBjbG9ja2RvbWFpbiAqKmNzKQogewogCXN0cnVjdCBjbG9ja2RvbWFpbiAqKmMgPSBOVUxMOwotCXN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG07Ci0Jc3RydWN0IGNsa2RtX2F1dG9kZXAgKmF1dG9kZXAgPSBOVUxMOwogCi0JaWYgKCFjdXN0b21fZnVuY3MpCi0JCVdBUk4oMSwgIk5vIGN1c3RvbSBjbGtkbSBmdW5jdGlvbnMgcmVnaXN0ZXJlZFxuIik7Ci0JZWxzZQotCQlhcmNoX2Nsa2RtID0gY3VzdG9tX2Z1bmNzOworCWlmICghYXJjaF9jbGtkbSkKKwkJcmV0dXJuIC1FQUNDRVM7CiAKLQlpZiAoY2xrZG1zKQotCQlmb3IgKGMgPSBjbGtkbXM7ICpjOyBjKyspCi0JCQlfY2xrZG1fcmVnaXN0ZXIoKmMpOworCWlmICghY3MpCisJCXJldHVybiAtRUlOVkFMOwogCi0JYXV0b2RlcHMgPSBpbml0X2F1dG9kZXBzOworCWZvciAoYyA9IGNzOyAqYzsgYysrKQorCQlfY2xrZG1fcmVnaXN0ZXIoKmMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2xrZG1fcmVnaXN0ZXJfYXV0b2RlcHMgLSByZWdpc3RlciBhdXRvZGVwcyAoaWYgcmVxdWlyZWQpCisgKiBAaWE6IHBvaW50ZXIgdG8gYSBzdGF0aWMgYXJyYXkgb2Ygc3RydWN0IGNsa2RtX2F1dG9kZXAgdG8gcmVnaXN0ZXIKKyAqCisgKiBSZWdpc3RlciBjbG9ja2RvbWFpbiAiYXV0b21hdGljIGRlcGVuZGVuY2llcy4iICBUaGVzZSBhcmUKKyAqIGNsb2NrZG9tYWluIHdha2V1cCBhbmQgc2xlZXAgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkKKyAqIGFkZGVkIHdoZW5ldmVyIHRoZSBmaXJzdCBjbG9jayBpbnNpZGUgYSBjbG9ja2RvbWFpbiBpcyBlbmFibGVkLCBhbmQKKyAqIHJlbW92ZWQgd2hlbmV2ZXIgdGhlIGxhc3QgY2xvY2sgaW5zaWRlIGEgY2xvY2tkb21haW4gaXMgZGlzYWJsZWQuCisgKiBUaGVzZSBhcmUgY3VycmVudGx5IG9ubHkgdXNlZCBvbiBPTUFQMyBkZXZpY2VzLCBhbmQgYXJlIGRlcHJlY2F0ZWQsCisgKiBzaW5jZSB0aGV5IHdhc3RlIGVuZXJneS4gIEhvd2V2ZXIsIHVudGlsIHRoZSBPTUFQMi8zIElQIGJsb2NrCisgKiBlbmFibGUvZGlzYWJsZSBzZXF1ZW5jZSBjYW4gYmUgY29udmVydGVkIHRvIG1hdGNoIHRoZSBPTUFQNAorICogc2VxdWVuY2UsIHRoZXkgYXJlIG5lZWRlZC4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGFsbCBvZiB0aGUgU29DIGNsb2NrZG9tYWlucyBhcmUKKyAqIHJlZ2lzdGVyZWQsIHNpbmNlIHRoZSBmdW5jdGlvbiB3aWxsIHJlc29sdmUgYXV0b2RlcCBjbG9ja2RvbWFpbgorICogbmFtZXMgaW50byBjbG9ja2RvbWFpbiBwb2ludGVycy4KKyAqCisgKiBUaGUgc3RydWN0IGNsa2RtX2F1dG9kZXAgQGlhIGFycmF5IG11c3QgYmUgc3RhdGljLCBhcyB0aGlzIGZ1bmN0aW9uCisgKiBkb2VzIG5vdCBjb3B5IHRoZSBhcnJheSBlbGVtZW50cy4KKyAqCisgKiBSZXR1cm5zIC1FQUNDRVMgaWYgY2FsbGVkIGJlZm9yZSBhbnkgY2xvY2tkb21haW5zIGhhdmUgYmVlbgorICogcmVnaXN0ZXJlZCwgLUVJTlZBTCBpZiBjYWxsZWQgd2l0aCBhIG51bGwgQGlhIGFyZ3VtZW50LCAtRUVYSVNUIGlmCisgKiBhdXRvZGVwcyBoYXZlIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLCBvciAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IGNsa2RtX3JlZ2lzdGVyX2F1dG9kZXBzKHN0cnVjdCBjbGtkbV9hdXRvZGVwICppYSkKK3sKKwlzdHJ1Y3QgY2xrZG1fYXV0b2RlcCAqYSA9IE5VTEw7CisKKwlpZiAobGlzdF9lbXB0eSgmY2xrZG1fbGlzdCkpCisJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKCFpYSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoYXV0b2RlcHMpCi0JCWZvciAoYXV0b2RlcCA9IGF1dG9kZXBzOyBhdXRvZGVwLT5jbGtkbS5wdHI7IGF1dG9kZXArKykKLQkJCV9hdXRvZGVwX2xvb2t1cChhdXRvZGVwKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CiAKLQkvKgotCSAqIFB1dCBhbGwgY2xvY2tkb21haW5zIGludG8gc29mdHdhcmUtc3VwZXJ2aXNlZCBtb2RlOyBQTSBjb2RlCi0JICogc2hvdWxkIGxhdGVyIGVuYWJsZSBoYXJkd2FyZS1zdXBlcnZpc2VkIG1vZGUgYXMgYXBwcm9wcmlhdGUKLQkgKi8KKwlhdXRvZGVwcyA9IGlhOworCWZvciAoYSA9IGF1dG9kZXBzOyBhLT5jbGtkbS5wdHI7IGErKykKKwkJX2F1dG9kZXBfbG9va3VwKGEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2xrZG1fY29tcGxldGVfaW5pdCAtIHNldCB1cCB0aGUgY2xvY2tkb21haW4gbGF5ZXIKKyAqCisgKiBQdXQgYWxsIGNsb2NrZG9tYWlucyBpbnRvIHNvZnR3YXJlLXN1cGVydmlzZWQgbW9kZTsgUE0gY29kZSBzaG91bGQKKyAqIGxhdGVyIGVuYWJsZSBoYXJkd2FyZS1zdXBlcnZpc2VkIG1vZGUgYXMgYXBwcm9wcmlhdGUuICBNdXN0IGJlCisgKiBjYWxsZWQgYWZ0ZXIgY2xrZG1fcmVnaXN0ZXJfY2xrZG1zKCkuICBSZXR1cm5zIC1FQUNDRVMgaWYgY2FsbGVkCisgKiBiZWZvcmUgY2xrZG1fcmVnaXN0ZXJfY2xrZG1zKCksIG9yIDAgdXBvbiBzdWNjZXNzLgorICovCitpbnQgY2xrZG1fY29tcGxldGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG07CisKKwlpZiAobGlzdF9lbXB0eSgmY2xrZG1fbGlzdCkpCisJCXJldHVybiAtRUFDQ0VTOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGtkbSwgJmNsa2RtX2xpc3QsIG5vZGUpIHsKIAkJaWYgKGNsa2RtLT5mbGFncyAmIENMS0RNX0NBTl9GT1JDRV9XQUtFVVApCiAJCQljbGtkbV93YWtldXAoY2xrZG0pOwpAQCAtMzA2LDYgKzM2MCw4IEBACiAJCV9yZXNvbHZlX2Nsa2RtX2RlcHMoY2xrZG0sIGNsa2RtLT5zbGVlcGRlcF9zcmNzKTsKIAkJY2xrZG1fY2xlYXJfYWxsX3NsZWVwZGVwcyhjbGtkbSk7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbi5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbi5oCmluZGV4IDFlNTBjODguLmY3YjU4NjA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbi5oCkBAIC00NSw3ICs0NSw2IEBACiAvKioKICAqIHN0cnVjdCBjbGtkbV9hdXRvZGVwIC0gY2xrZG0gZGVwcyB0byBhZGQgd2hlbiBlbnRlcmluZy9leGl0aW5nIGh3c3VwIG1vZGUKICAqIEBjbGtkbTogY2xvY2tkb21haW4gdG8gYWRkIHdrZGVwK3NsZWVwZGVwIG9uIC0gc2V0IG5hbWUgbWVtYmVyIG9ubHkKLSAqIEBvbWFwX2NoaXA6IE9NQVAgY2hpcCB0eXBlcyB0aGF0IHRoaXMgYXV0b2RlcCBpcyB2YWxpZCBvbgogICoKICAqIEEgY2xvY2tkb21haW4gdGhhdCBzaG91bGQgaGF2ZSB3a2RlcHMgYW5kIHNsZWVwZGVwcyBhZGRlZCB3aGVuIGEKICAqIGNsb2NrZG9tYWluIHNob3VsZCBzdGF5IGFjdGl2ZSBpbiBod3N1cCBtb2RlOyBhbmQgY29udmVyc2VseSwKQEAgLTYwLDE0ICs1OSwxMiBAQAogCQljb25zdCBjaGFyICpuYW1lOwogCQlzdHJ1Y3QgY2xvY2tkb21haW4gKnB0cjsKIAl9IGNsa2RtOwotCWNvbnN0IHN0cnVjdCBvbWFwX2NoaXBfaWQgb21hcF9jaGlwOwogfTsKIAogLyoqCiAgKiBzdHJ1Y3QgY2xrZG1fZGVwIC0gZW5jb2RlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGNsb2NrZG9tYWlucwogICogQGNsa2RtX25hbWU6IGNsb2NrZG9tYWluIG5hbWUKICAqIEBjbGtkbTogcG9pbnRlciB0byB0aGUgc3RydWN0IGNsb2NrZG9tYWluIG9mIEBjbGtkbV9uYW1lCi0gKiBAb21hcF9jaGlwOiBPTUFQIGNoaXAgdHlwZXMgdGhhdCB0aGlzIGRlcGVuZGVuY3kgaXMgdmFsaWQgb24KICAqIEB3a2RlcF91c2Vjb3VudDogTnVtYmVyIG9mIHdha2V1cCBkZXBlbmRlbmNpZXMgY2F1c2luZyB0aGlzIGNsa2RtIHRvIHdha2UKICAqIEBzbGVlcGRlcF91c2Vjb3VudDogTnVtYmVyIG9mIHNsZWVwIGRlcHMgdGhhdCBjb3VsZCBwcmV2ZW50IGNsa2RtIGZyb20gaWRsZQogICoKQEAgLTgxLDcgKzc4LDYgQEAKIAlzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtOwogCWF0b21pY190IHdrZGVwX3VzZWNvdW50OwogCWF0b21pY190IHNsZWVwZGVwX3VzZWNvdW50OwotCWNvbnN0IHN0cnVjdCBvbWFwX2NoaXBfaWQgb21hcF9jaGlwOwogfTsKIAogLyogUG9zc2libGUgZmxhZ3MgZm9yIHN0cnVjdCBjbG9ja2RvbWFpbi5fZmxhZ3MgKi8KQEAgLTEwMSw3ICs5Nyw2IEBACiAgKiBAY2xrZG1fb2ZmczogKE9NQVA0IG9ubHkpIENNIGNsb2NrZG9tYWluIHJlZ2lzdGVyIG9mZnNldAogICogQHdrZGVwX3NyY3M6IENsb2NrZG9tYWlucyB0aGF0IGNhbiBiZSB0b2xkIHRvIHdha2UgdGhpcyBwb3dlcmRvbWFpbiB1cAogICogQHNsZWVwZGVwX3NyY3M6IENsb2NrZG9tYWlucyB0aGF0IGNhbiBiZSB0b2xkIHRvIGtlZXAgdGhpcyBjbGtkbSBmcm9tIGluYWN0Ci0gKiBAb21hcF9jaGlwOiBPTUFQIGNoaXAgdHlwZXMgdGhhdCB0aGlzIGNsb2NrZG9tYWluIGlzIHZhbGlkIG9uCiAgKiBAdXNlY291bnQ6IFVzZWNvdW50IHRyYWNraW5nCiAgKiBAbm9kZTogbGlzdF9oZWFkIHRvIGxpbmsgYWxsIGNsb2NrZG9tYWlucyB0b2dldGhlcgogICoKQEAgLTEyNiw3ICsxMjEsNiBAQAogCWNvbnN0IHUxNiBjbGtkbV9vZmZzOwogCXN0cnVjdCBjbGtkbV9kZXAgKndrZGVwX3NyY3M7CiAJc3RydWN0IGNsa2RtX2RlcCAqc2xlZXBkZXBfc3JjczsKLQljb25zdCBzdHJ1Y3Qgb21hcF9jaGlwX2lkIG9tYXBfY2hpcDsKIAlhdG9taWNfdCB1c2Vjb3VudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJc3BpbmxvY2tfdCBsb2NrOwpAQCAtMTY2LDggKzE2MCwxMSBAQAogCWludAkoKmNsa2RtX2Nsa19kaXNhYmxlKShzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKTsKIH07CiAKLXZvaWQgY2xrZG1faW5pdChzdHJ1Y3QgY2xvY2tkb21haW4gKipjbGtkbXMsIHN0cnVjdCBjbGtkbV9hdXRvZGVwICphdXRvZGVwcywKLQkJCXN0cnVjdCBjbGtkbV9vcHMgKmN1c3RvbV9mdW5jcyk7CitpbnQgY2xrZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3Moc3RydWN0IGNsa2RtX29wcyAqY28pOworaW50IGNsa2RtX3JlZ2lzdGVyX2F1dG9kZXBzKHN0cnVjdCBjbGtkbV9hdXRvZGVwICppYSk7CitpbnQgY2xrZG1fcmVnaXN0ZXJfY2xrZG1zKHN0cnVjdCBjbG9ja2RvbWFpbiAqKmMpOworaW50IGNsa2RtX2NvbXBsZXRlX2luaXQodm9pZCk7CisKIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOwogCiBpbnQgY2xrZG1fZm9yX2VhY2goaW50ICgqZm4pKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0sIHZvaWQgKnVzZXIpLApAQCAtMTk1LDcgKzE5Miw4IEBACiBpbnQgY2xrZG1faHdtb2RfZW5hYmxlKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0sIHN0cnVjdCBvbWFwX2h3bW9kICpvaCk7CiBpbnQgY2xrZG1faHdtb2RfZGlzYWJsZShzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtLCBzdHJ1Y3Qgb21hcF9od21vZCAqb2gpOwogCi1leHRlcm4gdm9pZCBfX2luaXQgb21hcDJ4eHhfY2xvY2tkb21haW5zX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgb21hcDI0MnhfY2xvY2tkb21haW5zX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgb21hcDI0M3hfY2xvY2tkb21haW5zX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgb21hcDN4eHhfY2xvY2tkb21haW5zX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgb21hcDQ0eHhfY2xvY2tkb21haW5zX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBfY2xrZG1fYWRkX2F1dG9kZXBzKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pOwpAQCAtMjA1LDQgKzIwMywxMCBAQAogZXh0ZXJuIHN0cnVjdCBjbGtkbV9vcHMgb21hcDNfY2xrZG1fb3BlcmF0aW9uczsKIGV4dGVybiBzdHJ1Y3QgY2xrZG1fb3BzIG9tYXA0X2Nsa2RtX29wZXJhdGlvbnM7CiAKK2V4dGVybiBzdHJ1Y3QgY2xrZG1fZGVwIGdmeF8yNHh4X3drZGVwc1tdOworZXh0ZXJuIHN0cnVjdCBjbGtkbV9kZXAgZHNwXzI0eHhfd2tkZXBzW107CitleHRlcm4gc3RydWN0IGNsb2NrZG9tYWluIHdrdXBfY29tbW9uX2Nsa2RtOworZXh0ZXJuIHN0cnVjdCBjbG9ja2RvbWFpbiBwcm1fY29tbW9uX2Nsa2RtOworZXh0ZXJuIHN0cnVjdCBjbG9ja2RvbWFpbiBjbV9jb21tb25fY2xrZG07CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbjJ4eHhfM3h4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbjJ4eHhfM3h4eC5jCmluZGV4IGY3NDBlZGIuLmEwZDY4ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4yeHh4XzN4eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluMnh4eF8zeHh4LmMKQEAgLTUyLDggKzUyLDYgQEAKIAl1MzIgbWFzayA9IDA7CiAKIAlmb3IgKGNkID0gY2xrZG0tPndrZGVwX3NyY3M7IGNkICYmIGNkLT5jbGtkbV9uYW1lOyBjZCsrKSB7Ci0JCWlmICghb21hcF9jaGlwX2lzKGNkLT5vbWFwX2NoaXApKQotCQkJY29udGludWU7CiAJCWlmICghY2QtPmNsa2RtKQogCQkJY29udGludWU7IC8qIG9ubHkgaGFwcGVucyBpZiBkYXRhIGlzIGVycm9uZW91cyAqLwogCkBAIC05OCw4ICs5Niw2IEBACiAJdTMyIG1hc2sgPSAwOwogCiAJZm9yIChjZCA9IGNsa2RtLT5zbGVlcGRlcF9zcmNzOyBjZCAmJiBjZC0+Y2xrZG1fbmFtZTsgY2QrKykgewotCQlpZiAoIW9tYXBfY2hpcF9pcyhjZC0+b21hcF9jaGlwKSkKLQkJCWNvbnRpbnVlOwogCQlpZiAoIWNkLT5jbGtkbSkKIAkJCWNvbnRpbnVlOyAvKiBvbmx5IGhhcHBlbnMgaWYgZGF0YSBpcyBlcnJvbmVvdXMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbjQ0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW40NHh4LmMKaW5kZXggYjQzNzA2YS4uOTM1YzdmMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbjQ0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluNDR4eC5jCkBAIC01Miw4ICs1Miw2IEBACiAJdTMyIG1hc2sgPSAwOwogCiAJZm9yIChjZCA9IGNsa2RtLT53a2RlcF9zcmNzOyBjZCAmJiBjZC0+Y2xrZG1fbmFtZTsgY2QrKykgewotCQlpZiAoIW9tYXBfY2hpcF9pcyhjZC0+b21hcF9jaGlwKSkKLQkJCWNvbnRpbnVlOwogCQlpZiAoIWNkLT5jbGtkbSkKIAkJCWNvbnRpbnVlOyAvKiBvbmx5IGhhcHBlbnMgaWYgZGF0YSBpcyBlcnJvbmVvdXMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnMyNDIwX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zMjQyMF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiOGU0NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zMjQyMF9kYXRhLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBPTUFQMjQyMCBjbG9ja2RvbWFpbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQYXVsIFdhbG1zbGV5LCBKb3VuaSBIw7ZnYW5kZXIKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgY2xvY2tkb21haW5zIGFuZCBjbG9ja2RvbWFpbiB3YWtldXAgZGVwZW5kZW5jaWVzCisgKiBmb3IgT01BUDI0MjAgY2hpcHMuICBTb21lIG5vdGVzOgorICoKKyAqIEEgdXNlZnVsIHZhbGlkYXRpb24gcnVsZSBmb3Igc3RydWN0IGNsb2NrZG9tYWluOiBBbnkgY2xvY2tkb21haW4KKyAqIHJlZmVyZW5jZWQgYnkgYSB3a2RlcF9zcmNzIG11c3QgaGF2ZSBhIGRlcF9iaXQgYXNzaWduZWQuICBTbworICogd2tkZXBfc3JjcyBhcmUgcmVhbGx5IGp1c3Qgc29mdHdhcmUtY29udHJvbGxhYmxlIGRlcGVuZGVuY2llcy4KKyAqIE5vbi1zb2Z0d2FyZS1jb250cm9sbGFibGUgZGVwZW5kZW5jaWVzIGRvIGV4aXN0LCBidXQgdGhleSBhcmUgbm90CisgKiBlbmNvZGVkIGJlbG93ICh5ZXQpLgorICoKKyAqIDI0eHggZG9lcyBub3Qgc3VwcG9ydCBwcm9ncmFtbWFibGUgc2xlZXAgZGVwZW5kZW5jaWVzIChTTEVFUERFUCkKKyAqCisgKiBUaGUgb3Zlcmx5LXNwZWNpZmljIGRlcF9iaXQgbmFtZXMgYXJlIGR1ZSB0byBhIGJpdCBuYW1lIGNvbGxpc2lvbgorICogd2l0aCBDTV9GQ0xLRU5fe0RTUCxJVkEyfS4gIFRoZSBEU1AvSVZBMiBQTV9XS0RFUCBhbmQgQ01fU0xFRVBERVAgc2hpZnQKKyAqIHZhbHVlIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHBvd2VyZG9tYWluczogMgorICoKKyAqIFhYWCBzaG91bGQgZGVwX2JpdCBiZSBhIG1hc2ssIHNvIHdlIGNhbiB0ZXN0IHRvIHNlZSBpZiBpdCBpcyAwIGFzIGEKKyAqIHNhbml0eSBjaGVjaz8KKyAqIFhYWCBlbmNvZGUgaGFyZHdhcmUgZml4ZWQgd2FrZXVwIGRlcGVuZGVuY2llcyAtLSBlc3AuIGZvciAzNDMwIENPUkUKKyAqLworCisvKgorICogVG8tRG8gTGlzdAorICogLT4gUG9ydCB0aGUgU2xlZXAvV2FrZXVwIGRlcGVuZGVuY2llcyBmb3IgdGhlIGRvbWFpbnMKKyAqICAgIGZyb20gdGhlIFBvd2VyIGRvbWFpbiBmcmFtZXdvcmsKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgImNsb2NrZG9tYWluLmgiCisjaW5jbHVkZSAicHJtMnh4eF8zeHh4LmgiCisjaW5jbHVkZSAiY20yeHh4XzN4eHguaCIKKyNpbmNsdWRlICJjbS1yZWdiaXRzLTI0eHguaCIKKyNpbmNsdWRlICJwcm0tcmVnYml0cy0yNHh4LmgiCisKKy8qCisgKiBDbG9ja2RvbWFpbiBkZXBlbmRlbmNpZXMgZm9yIHdrZGVwcworICoKKyAqIFhYWCBIYXJkd2FyZSBkZXBlbmRlbmNpZXMgKGUuZy4sIGRlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZQorICogY2hhbmdlZCBpbiBzb2Z0d2FyZSkgYXJlIG5vdCBpbmNsdWRlZCBoZXJlIHlldCwgYnV0IHNob3VsZCBiZS4KKyAqLworCisvKiBXYWtldXAgZGVwZW5kZW5jeSBzb3VyY2UgYXJyYXlzICovCisKKy8qIDI0MjAtc3BlY2lmaWMgcG9zc2libGUgd2FrZXVwIGRlcGVuZGVuY2llcyAqLworCisvKiAyNDIwIFBNX1dLREVQX01QVTogQ09SRSwgRFNQLCBXS1VQICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBtcHVfMjQyMF93a2RlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDNfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiZHNwX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qIDI0MjAgUE1fV0tERVBfQ09SRTogRFNQLCBHRlgsIE1QVSwgV0tVUCAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgY29yZV8yNDIwX3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiZHNwX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiZ2Z4X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qCisgKiAyNDIwLW9ubHkgY2xvY2tkb21haW5zCisgKi8KKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBtcHVfMjQyMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAibXB1X2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJtcHVfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkud2tkZXBfc3Jjcwk9IG1wdV8yNDIwX3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfTVBVX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGl2YTFfMjQyMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiaXZhMV9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiZHNwX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmRlcF9iaXQJPSBPTUFQMjRYWF9QTV9XS0RFUF9NUFVfRU5fRFNQX1NISUZULAorCS53a2RlcF9zcmNzCT0gZHNwXzI0eHhfd2tkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNDIwX0FVVE9TVEFURV9JVkFfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHNwXzI0MjBfY2xrZG0gPSB7CisJLm5hbWUJCT0gImRzcF9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiZHNwX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0RTUF9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBnZnhfMjQyMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZ2Z4X2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJnZnhfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkud2tkZXBfc3Jjcwk9IGdmeF8yNHh4X3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfR0ZYX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNvcmVfbDNfMjQyMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiY29yZV9sM19jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAorCS53a2RlcF9zcmNzCT0gY29yZV8yNDIwX3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfTDNfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sNF8yNDIwX2Nsa2RtID0geworCS5uYW1lCQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCisJLndrZGVwX3NyY3MJPSBjb3JlXzI0MjBfd2tkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9MNF9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkc3NfMjQyMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHNzX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0RTU19NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xvY2tkb21haW5zX29tYXAyNDJ4W10gX19pbml0ZGF0YSA9IHsKKwkmd2t1cF9jb21tb25fY2xrZG0sCisJJmNtX2NvbW1vbl9jbGtkbSwKKwkmcHJtX2NvbW1vbl9jbGtkbSwKKwkmbXB1XzI0MjBfY2xrZG0sCisJJml2YTFfMjQyMF9jbGtkbSwKKwkmZHNwXzI0MjBfY2xrZG0sCisJJmdmeF8yNDIwX2Nsa2RtLAorCSZjb3JlX2wzXzI0MjBfY2xrZG0sCisJJmNvcmVfbDRfMjQyMF9jbGtkbSwKKwkmZHNzXzI0MjBfY2xrZG0sCisJTlVMTCwKK307CisKK3ZvaWQgX19pbml0IG9tYXAyNDJ4X2Nsb2NrZG9tYWluc19pbml0KHZvaWQpCit7CisJaWYgKCFjcHVfaXNfb21hcDI0MngoKSkKKwkJcmV0dXJuOworCisJY2xrZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3MoJm9tYXAyX2Nsa2RtX29wZXJhdGlvbnMpOworCWNsa2RtX3JlZ2lzdGVyX2Nsa2RtcyhjbG9ja2RvbWFpbnNfb21hcDI0MngpOworCWNsa2RtX2NvbXBsZXRlX2luaXQoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zMjQzMF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczI0MzBfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDVlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczI0MzBfZGF0YS5jCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogT01BUDJ4eHggY2xvY2tkb21haW5zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGF1bCBXYWxtc2xleSwgSm91bmkgSMO2Z2FuZGVyCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNsb2NrZG9tYWlucyBhbmQgY2xvY2tkb21haW4gd2FrZXVwIGRlcGVuZGVuY2llcworICogZm9yIE9NQVAyeHh4IGNoaXBzLiAgU29tZSBub3RlczoKKyAqCisgKiBBIHVzZWZ1bCB2YWxpZGF0aW9uIHJ1bGUgZm9yIHN0cnVjdCBjbG9ja2RvbWFpbjogQW55IGNsb2NrZG9tYWluCisgKiByZWZlcmVuY2VkIGJ5IGEgd2tkZXBfc3JjcyBtdXN0IGhhdmUgYSBkZXBfYml0IGFzc2lnbmVkLiAgU28KKyAqIHdrZGVwX3NyY3MgYXJlIHJlYWxseSBqdXN0IHNvZnR3YXJlLWNvbnRyb2xsYWJsZSBkZXBlbmRlbmNpZXMuCisgKiBOb24tc29mdHdhcmUtY29udHJvbGxhYmxlIGRlcGVuZGVuY2llcyBkbyBleGlzdCwgYnV0IHRoZXkgYXJlIG5vdAorICogZW5jb2RlZCBiZWxvdyAoeWV0KS4KKyAqCisgKiAyNHh4IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3JhbW1hYmxlIHNsZWVwIGRlcGVuZGVuY2llcyAoU0xFRVBERVApCisgKgorICogVGhlIG92ZXJseS1zcGVjaWZpYyBkZXBfYml0IG5hbWVzIGFyZSBkdWUgdG8gYSBiaXQgbmFtZSBjb2xsaXNpb24KKyAqIHdpdGggQ01fRkNMS0VOX3tEU1AsSVZBMn0uICBUaGUgRFNQL0lWQTIgUE1fV0tERVAgYW5kIENNX1NMRUVQREVQIHNoaWZ0CisgKiB2YWx1ZSBhcmUgdGhlIHNhbWUgZm9yIGFsbCBwb3dlcmRvbWFpbnM6IDIKKyAqCisgKiBYWFggc2hvdWxkIGRlcF9iaXQgYmUgYSBtYXNrLCBzbyB3ZSBjYW4gdGVzdCB0byBzZWUgaWYgaXQgaXMgMCBhcyBhCisgKiBzYW5pdHkgY2hlY2s/CisgKiBYWFggZW5jb2RlIGhhcmR3YXJlIGZpeGVkIHdha2V1cCBkZXBlbmRlbmNpZXMgLS0gZXNwLiBmb3IgMzQzMCBDT1JFCisgKi8KKworLyoKKyAqIFRvLURvIExpc3QKKyAqIC0+IFBvcnQgdGhlIFNsZWVwL1dha2V1cCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBkb21haW5zCisgKiAgICBmcm9tIHRoZSBQb3dlciBkb21haW4gZnJhbWV3b3JrCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJjbG9ja2RvbWFpbi5oIgorI2luY2x1ZGUgInBybTJ4eHhfM3h4eC5oIgorI2luY2x1ZGUgImNtMnh4eF8zeHh4LmgiCisjaW5jbHVkZSAiY20tcmVnYml0cy0yNHh4LmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMjR4eC5oIgorCisvKgorICogQ2xvY2tkb21haW4gZGVwZW5kZW5jaWVzIGZvciB3a2RlcHMKKyAqCisgKiBYWFggSGFyZHdhcmUgZGVwZW5kZW5jaWVzIChlLmcuLCBkZXBlbmRlbmNpZXMgdGhhdCBjYW5ub3QgYmUKKyAqIGNoYW5nZWQgaW4gc29mdHdhcmUpIGFyZSBub3QgaW5jbHVkZWQgaGVyZSB5ZXQsIGJ1dCBzaG91bGQgYmUuCisgKi8KKworLyogV2FrZXVwIGRlcGVuZGVuY3kgc291cmNlIGFycmF5cyAqLworCisvKiAyNDMwLXNwZWNpZmljIHBvc3NpYmxlIHdha2V1cCBkZXBlbmRlbmNpZXMgKi8KKworLyogMjQzMCBQTV9XS0RFUF9DT1JFOiBEU1AsIEdGWCwgTVBVLCBXS1VQLCBNRE0gKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGNvcmVfMjQzMF93a2RlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gImRzcF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImdmeF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJtZG1fY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAyNDMwIFBNX1dLREVQX01QVTogQ09SRSwgRFNQLCBXS1VQLCBNRE0gKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIG1wdV8yNDMwX3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJkc3BfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibWRtX2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyogMjQzMCBQTV9XS0RFUF9NRE06IENPUkUsIE1QVSwgV0tVUCAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbWRtXzI0MzBfd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sNF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKgorICogMjQzMC1vbmx5IGNsb2NrZG9tYWlucworICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbXB1XzI0MzBfY2xrZG0gPSB7CisJLm5hbWUJCT0gIm1wdV9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAibXB1X3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLndrZGVwX3NyY3MJPSBtcHVfMjQzMF93a2RlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX01QVV9NQVNLLAorfTsKKworLyogQW5vdGhlciBjYXNlIG9mIGJpdCBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXZlcmFsIHJlZ2lzdGVyczogRU5fTURNICovCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG1kbV9jbGtkbSA9IHsKKwkubmFtZQkJPSAibWRtX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJtZG1fcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkuZGVwX2JpdAk9IE9NQVAyNDMwX1BNX1dLREVQX01QVV9FTl9NRE1fU0hJRlQsCisJLndrZGVwX3NyY3MJPSBtZG1fMjQzMF93a2RlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0MzBfQVVUT1NUQVRFX01ETV9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkc3BfMjQzMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHNwX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJkc3BfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkuZGVwX2JpdAk9IE9NQVAyNFhYX1BNX1dLREVQX01QVV9FTl9EU1BfU0hJRlQsCisJLndrZGVwX3NyY3MJPSBkc3BfMjR4eF93a2RlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0RTUF9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBnZnhfMjQzMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZ2Z4X2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJnZnhfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkud2tkZXBfc3Jjcwk9IGdmeF8yNHh4X3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfR0ZYX01BU0ssCit9OworCisvKgorICogWFhYIGFkZCB1c2Vjb3VudGluZyBmb3IgY2xrZG0gZGVwZW5kZW5jaWVzLCBvdGhlcndpc2UgdGhlIHByZXNlbmNlCisgKiBvZiBhIHNpbmdsZSBkZXAgYml0IGZvciBjb3JlX2wzXzI0eHhfY2xrZG0gYW5kIGNvcmVfbDRfMjR4eF9jbGtkbQorICogY291bGQgY2F1c2UgdHJvdWJsZQorICovCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNvcmVfbDNfMjQzMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiY29yZV9sM19jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAorCS5kZXBfYml0CT0gT01BUDI0WFhfRU5fQ09SRV9TSElGVCwKKwkud2tkZXBfc3Jjcwk9IGNvcmVfMjQzMF93a2RlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0wzX01BU0ssCit9OworCisvKgorICogWFhYIGFkZCB1c2Vjb3VudGluZyBmb3IgY2xrZG0gZGVwZW5kZW5jaWVzLCBvdGhlcndpc2UgdGhlIHByZXNlbmNlCisgKiBvZiBhIHNpbmdsZSBkZXAgYml0IGZvciBjb3JlX2wzXzI0eHhfY2xrZG0gYW5kIGNvcmVfbDRfMjR4eF9jbGtkbQorICogY291bGQgY2F1c2UgdHJvdWJsZQorICovCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNvcmVfbDRfMjQzMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiY29yZV9sNF9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAorCS5kZXBfYml0CT0gT01BUDI0WFhfRU5fQ09SRV9TSElGVCwKKwkud2tkZXBfc3Jjcwk9IGNvcmVfMjQzMF93a2RlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0w0X01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzc18yNDMwX2Nsa2RtID0geworCS5uYW1lCQk9ICJkc3NfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfRFNTX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluICpjbG9ja2RvbWFpbnNfb21hcDI0M3hbXSBfX2luaXRkYXRhID0geworCSZ3a3VwX2NvbW1vbl9jbGtkbSwKKwkmY21fY29tbW9uX2Nsa2RtLAorCSZwcm1fY29tbW9uX2Nsa2RtLAorCSZtcHVfMjQzMF9jbGtkbSwKKwkmbWRtX2Nsa2RtLAorCSZkc3BfMjQzMF9jbGtkbSwKKwkmZ2Z4XzI0MzBfY2xrZG0sCisJJmNvcmVfbDNfMjQzMF9jbGtkbSwKKwkmY29yZV9sNF8yNDMwX2Nsa2RtLAorCSZkc3NfMjQzMF9jbGtkbSwKKwlOVUxMLAorfTsKKwordm9pZCBfX2luaXQgb21hcDI0M3hfY2xvY2tkb21haW5zX2luaXQodm9pZCkKK3sKKwlpZiAoIWNwdV9pc19vbWFwMjQzeCgpKQorCQlyZXR1cm47CisKKwljbGtkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcygmb21hcDJfY2xrZG1fb3BlcmF0aW9ucyk7CisJY2xrZG1fcmVnaXN0ZXJfY2xrZG1zKGNsb2NrZG9tYWluc19vbWFwMjQzeCk7CisJY2xrZG1fY29tcGxldGVfaW5pdCgpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczJ4eHhfM3h4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczJ4eHhfM3h4eF9kYXRhLmMKaW5kZXggMTNiZGU5NS4uMGE2YTA0OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnMyeHh4XzN4eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zMnh4eF8zeHh4X2RhdGEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCi0gKiBPTUFQMi8zIGNsb2NrZG9tYWlucworICogT01BUDIvMyBjbG9ja2RvbWFpbiBjb21tb24gZGF0YQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiBQYXVsIFdhbG1zbGV5LCBKb3VuaSBIw7ZnYW5kZXIKQEAgLTUxLDM3NCArNTEsMjggQEAKICAqIGNoYW5nZWQgaW4gc29mdHdhcmUpIGFyZSBub3QgaW5jbHVkZWQgaGVyZSB5ZXQsIGJ1dCBzaG91bGQgYmUuCiAgKi8KIAotLyogT01BUDIvMy1jb21tb24gd2FrZXVwIGRlcGVuZGVuY2llcyAqLwotCi0vKgotICogMjQyMC8yNDMwIFBNX1dLREVQX0dGWDogQ09SRSwgTVBVLCBXS1VQCi0gKiAzNDMwRVMxIFBNX1dLREVQX0dGWDogYWRkcyBJVkEyLCByZW1vdmVzIENPUkUKLSAqIDM0MzBFUzIgUE1fV0tERVBfU0dYOiBhZGRzIElWQTIsIHJlbW92ZXMgQ09SRQotICogVGhlc2UgY2FuIHNoYXJlIGRhdGEgc2luY2UgdGhleSB3aWxsIG5ldmVyIGJlIHByZXNlbnQgc2ltdWx0YW5lb3VzbHkKLSAqIG9uIHRoZSBzYW1lIGRldmljZS4KLSAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZ2Z4X3NneF93a2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImNvcmVfbDNfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sNF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYIHwKLQkJCQkJICAgIENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCB8Ci0JCQkJCSAgICBDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0KLS8qIDI0WFgtc3BlY2lmaWMgcG9zc2libGUgZGVwZW5kZW5jaWVzICovCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMgotCiAvKiBXYWtldXAgZGVwZW5kZW5jeSBzb3VyY2UgYXJyYXlzICovCiAKLS8qIDI0MjAvMjQzMCBQTV9XS0RFUF9EU1A6IENPUkUsIE1QVSwgV0tVUCAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZHNwXzI0eHhfd2tkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAorLyogMnh4eC1zcGVjaWZpYyBwb3NzaWJsZSBkZXBlbmRlbmNpZXMgKi8KKworLyogMnh4eCBQTV9XS0RFUF9HRlg6IENPUkUsIE1QVSwgV0tVUCAqLworc3RydWN0IGNsa2RtX2RlcCBnZnhfMjR4eF93a2RlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDNfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIgfSwKIAl7IE5VTEwgfSwKIH07CiAKLS8qCi0gKiAyNDIwIFBNX1dLREVQX01QVTogQ09SRSwgRFNQLCBXS1VQCi0gKiAyNDMwIGFkZHMgTURNCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIG1wdV8yNHh4X3drZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImRzcF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIm1kbV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQotCX0sCisvKiAyeHh4IFBNX1dLREVQX0RTUDogQ09SRSwgTVBVLCBXS1VQICovCitzdHJ1Y3QgY2xrZG1fZGVwIGRzcF8yNHh4X3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiB9LAogCXsgTlVMTCB9LAogfTsKIAotLyoKLSAqIDI0MjAgUE1fV0tERVBfQ09SRTogRFNQLCBHRlgsIE1QVSwgV0tVUAotICogMjQzMCBhZGRzIE1ETQotICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBjb3JlXzI0eHhfd2tkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJkc3BfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiZ2Z4X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIm1kbV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0jZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDIgKi8KLQotLyogMjQzMC1zcGVjaWZpYyBwb3NzaWJsZSB3YWtldXAgZGVwZW5kZW5jaWVzICovCi0KLSNpZmRlZiBDT05GSUdfU09DX09NQVAyNDMwCi0KLS8qIDI0MzAgUE1fV0tERVBfTURNOiBDT1JFLCBNUFUsIFdLVVAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIG1kbV8yNDMwX3drZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7IE5VTEwgfSwKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfU09DX09NQVAyNDMwICovCi0KLQotLyogT01BUDMtc3BlY2lmaWMgcG9zc2libGUgZGVwZW5kZW5jaWVzICovCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMwotCi0vKiAzNDMwOiBQTV9XS0RFUF9QRVI6IENPUkUsIElWQTIsIE1QVSwgV0tVUCAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgcGVyX3drZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotLyogMzQzMEVTMjogUE1fV0tERVBfVVNCSE9TVDogQ09SRSwgSVZBMiwgTVBVLCBXS1VQICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCB1c2Job3N0X3drZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotLyogMzQzMCBQTV9XS0RFUF9NUFU6IENPUkUsIElWQTIsIERTUywgUEVSICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBtcHVfM3h4eF93a2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImNvcmVfbDNfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sNF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImRzc19jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJwZXJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotLyogMzQzMCBQTV9XS0RFUF9JVkEyOiBDT1JFLCBNUFUsIFdLVVAsIERTUywgUEVSICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBpdmEyX3drZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImRzc19jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJwZXJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotCi0vKiAzNDMwIFBNX1dLREVQX0NBTTogSVZBMiwgTVBVLCBXS1VQICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBjYW1fd2tkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7IE5VTEwgfSwKLX07Ci0KLS8qIDM0MzAgUE1fV0tERVBfRFNTOiBJVkEyLCBNUFUsIFdLVVAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGRzc193a2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotLyogMzQzMDogUE1fV0tERVBfTkVPTjogTVBVICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBuZW9uX3drZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7IE5VTEwgfSwKLX07Ci0KLQotLyogU2xlZXAgZGVwZW5kZW5jeSBzb3VyY2UgYXJyYXlzIGZvciBPTUFQMy1zcGVjaWZpYyBjbGtkbXMgKi8KLQotLyogMzQzMDogQ01fU0xFRVBERVBfRFNTOiBNUFUsIElWQSAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZHNzX3NsZWVwZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotLyogMzQzMDogQ01fU0xFRVBERVBfUEVSOiBNUFUsIElWQSAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgcGVyX3NsZWVwZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotLyogMzQzMEVTMjogQ01fU0xFRVBERVBfVVNCSE9TVDogTVBVLCBJVkEgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIHVzYmhvc3Rfc2xlZXBkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0vKiAzNDMwOiBDTV9TTEVFUERFUF9DQU06IE1QVSAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgY2FtX3NsZWVwZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7IE5VTEwgfSwKLX07Ci0KLS8qCi0gKiAzNDMwRVMxOiBDTV9TTEVFUERFUF9HRlg6IE1QVQotICogMzQzMEVTMjogQ01fU0xFRVBERVBfU0dYOiBNUFUKLSAqIFRoZXNlIGNhbiBzaGFyZSBkYXRhIHNpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSBwcmVzZW50IHNpbXVsdGFuZW91c2x5Ci0gKiBvbiB0aGUgc2FtZSBkZXZpY2UuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGdmeF9zZ3hfc2xlZXBkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAzICovCi0KIAogLyoKICAqIE9NQVAyLzMtY29tbW9uIGNsb2NrZG9tYWlucwpAQCAtNDMwLDQzOSArODQsMTggQEAKICAqLwogCiAvKiBUaGlzIGlzIGFuIGltcGxpY2l0IGNsb2NrZG9tYWluIC0gaXQgaXMgbmV2ZXIgZGVmaW5lZCBhcyBzdWNoIGluIFRSTSAqLwotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiB3a3VwX2Nsa2RtID0geworc3RydWN0IGNsb2NrZG9tYWluIHdrdXBfY29tbW9uX2Nsa2RtID0gewogCS5uYW1lCQk9ICJ3a3VwX2Nsa2RtIiwKIAkucHdyZG0JCT0geyAubmFtZSA9ICJ3a3VwX3B3cmRtIiB9LAogCS5kZXBfYml0CT0gT01BUF9FTl9XS1VQX1NISUZULAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYIHwgQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIHBybV9jbGtkbSA9IHsKK3N0cnVjdCBjbG9ja2RvbWFpbiBwcm1fY29tbW9uX2Nsa2RtID0gewogCS5uYW1lCQk9ICJwcm1fY2xrZG0iLAogCS5wd3JkbQkJPSB7IC5uYW1lID0gIndrdXBfcHdyZG0iIH0sCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFggfCBDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY21fY2xrZG0gPSB7CitzdHJ1Y3QgY2xvY2tkb21haW4gY21fY29tbW9uX2Nsa2RtID0gewogCS5uYW1lCQk9ICJjbV9jbGtkbSIsCiAJLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCB8IENISVBfSVNfT01BUDM0MzApLAogfTsKLQotLyoKLSAqIDI0MjAtb25seSBjbG9ja2RvbWFpbnMKLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX09NQVAyNDIwKQotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG1wdV8yNDIwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJtcHVfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gIm1wdV9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAotCS53a2RlcF9zcmNzCT0gbXB1XzI0eHhfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9NUFVfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGl2YTFfMjQyMF9jbGtkbSA9IHsKLQkubmFtZQkJPSAiaXZhMV9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiZHNwX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLmRlcF9iaXQJPSBPTUFQMjRYWF9QTV9XS0RFUF9NUFVfRU5fRFNQX1NISUZULAotCS53a2RlcF9zcmNzCT0gZHNwXzI0eHhfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNDIwX0FVVE9TVEFURV9JVkFfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzcF8yNDIwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJkc3BfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImRzcF9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9EU1BfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGdmeF8yNDIwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJnZnhfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImdmeF9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS53a2RlcF9zcmNzCT0gZ2Z4X3NneF93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0dGWF9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sM18yNDIwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJjb3JlX2wzX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCi0JLndrZGVwX3NyY3MJPSBjb3JlXzI0eHhfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9MM19NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sNF8yNDIwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCi0JLndrZGVwX3NyY3MJPSBjb3JlXzI0eHhfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9MNF9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHNzXzI0MjBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImRzc19jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9EU1NfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCi19OwotCi0jZW5kaWYgICAvKiBDT05GSUdfU09DX09NQVAyNDIwICovCi0KLQotLyoKLSAqIDI0MzAtb25seSBjbG9ja2RvbWFpbnMKLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX09NQVAyNDMwKQotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG1wdV8yNDMwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJtcHVfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gIm1wdV9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS53a2RlcF9zcmNzCT0gbXB1XzI0eHhfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9NUFVfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCi19OwotCi0vKiBBbm90aGVyIGNhc2Ugb2YgYml0IG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHNldmVyYWwgcmVnaXN0ZXJzOiBFTl9NRE0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbWRtX2Nsa2RtID0gewotCS5uYW1lCQk9ICJtZG1fY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gIm1kbV9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5kZXBfYml0CT0gT01BUDI0MzBfUE1fV0tERVBfTVBVX0VOX01ETV9TSElGVCwKLQkud2tkZXBfc3Jjcwk9IG1kbV8yNDMwX3drZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjQzMF9BVVRPU1RBVEVfTURNX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkc3BfMjQzMF9jbGtkbSA9IHsKLQkubmFtZQkJPSAiZHNwX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJkc3BfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkuZGVwX2JpdAk9IE9NQVAyNFhYX1BNX1dLREVQX01QVV9FTl9EU1BfU0hJRlQsCi0JLndrZGVwX3NyY3MJPSBkc3BfMjR4eF93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0RTUF9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZ2Z4XzI0MzBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImdmeF9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiZ2Z4X3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLndrZGVwX3NyY3MJPSBnZnhfc2d4X3drZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfR0ZYX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAotfTsKLQotLyoKLSAqIFhYWCBhZGQgdXNlY291bnRpbmcgZm9yIGNsa2RtIGRlcGVuZGVuY2llcywgb3RoZXJ3aXNlIHRoZSBwcmVzZW5jZQotICogb2YgYSBzaW5nbGUgZGVwIGJpdCBmb3IgY29yZV9sM18yNHh4X2Nsa2RtIGFuZCBjb3JlX2w0XzI0eHhfY2xrZG0KLSAqIGNvdWxkIGNhdXNlIHRyb3VibGUKLSAqLwotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjb3JlX2wzXzI0MzBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImNvcmVfbDNfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKLQkuZGVwX2JpdAk9IE9NQVAyNFhYX0VOX0NPUkVfU0hJRlQsCi0JLndrZGVwX3NyY3MJPSBjb3JlXzI0eHhfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9MM19NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKLX07Ci0KLS8qCi0gKiBYWFggYWRkIHVzZWNvdW50aW5nIGZvciBjbGtkbSBkZXBlbmRlbmNpZXMsIG90aGVyd2lzZSB0aGUgcHJlc2VuY2UKLSAqIG9mIGEgc2luZ2xlIGRlcCBiaXQgZm9yIGNvcmVfbDNfMjR4eF9jbGtkbSBhbmQgY29yZV9sNF8yNHh4X2Nsa2RtCi0gKiBjb3VsZCBjYXVzZSB0cm91YmxlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sNF8yNDMwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCi0JLmRlcF9iaXQJPSBPTUFQMjRYWF9FTl9DT1JFX1NISUZULAotCS53a2RlcF9zcmNzCT0gY29yZV8yNHh4X3drZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfTDRfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzc18yNDMwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJkc3NfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfRFNTX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAotfTsKLQotI2VuZGlmICAgIC8qIENPTkZJR19TT0NfT01BUDI0MzAgKi8KLQotCi0vKgotICogT01BUDMgY2xvY2tkb21haW5zCi0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCi0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbXB1XzN4eHhfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gIm1wdV9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAibXB1X3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAgfCBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQLAotCS5kZXBfYml0CT0gT01BUDM0MzBfRU5fTVBVX1NISUZULAotCS53a2RlcF9zcmNzCT0gbXB1XzN4eHhfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9NUFVfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG5lb25fY2xrZG0gPSB7Ci0JLm5hbWUJCT0gIm5lb25fY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gIm5lb25fcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkud2tkZXBfc3Jjcwk9IG5lb25fd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9ORU9OX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBpdmEyX2Nsa2RtID0gewotCS5uYW1lCQk9ICJpdmEyX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJpdmEyX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLmRlcF9iaXQJPSBPTUFQMzQzMF9QTV9XS0RFUF9NUFVfRU5fSVZBMl9TSElGVCwKLQkud2tkZXBfc3Jjcwk9IGl2YTJfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9JVkEyX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBnZnhfMzQzMGVzMV9jbGtkbSA9IHsKLQkubmFtZQkJPSAiZ2Z4X2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJnZnhfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkud2tkZXBfc3Jjcwk9IGdmeF9zZ3hfd2tkZXBzLAotCS5zbGVlcGRlcF9zcmNzCT0gZ2Z4X3NneF9zbGVlcGRlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBFUzFfQ0xLVFJDVFJMX0dGWF9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwRVMxKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gc2d4X2Nsa2RtID0gewotCS5uYW1lCQk9ICJzZ3hfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gInNneF9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS53a2RlcF9zcmNzCT0gZ2Z4X3NneF93a2RlcHMsCi0JLnNsZWVwZGVwX3NyY3MJPSBnZnhfc2d4X3NsZWVwZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMEVTMl9DTEtUUkNUUkxfU0dYX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfR0VfT01BUDM0MzBFUzIpLAotfTsKLQotLyoKLSAqIFRoZSBkaWUtdG8tZGllIGNsb2NrZG9tYWluIHdhcyBkb2N1bWVudGVkIGluIHRoZSAzNHh4IEVTMSBUUk0sIGJ1dAotICogdGhlbiB0aGF0IGluZm9ybWF0aW9uIHdhcyByZW1vdmVkIGZyb20gdGhlIDM0eHggRVMyKyBUUk0uICBJdCBpcwotICogdW5jbGVhciB3aGV0aGVyIHRoZSBjb3JlIGlzIHN0aWxsIHRoZXJlLCBidXQgdGhlIGNsb2NrZG9tYWluIGxvZ2ljCi0gKiBpcyB0aGVyZSwgYW5kIG11c3QgYmUgcHJvZ3JhbW1lZCB0byBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBpZiB0aGUKLSAqIENPUkUgY2xvY2tkb21haW4gaXMgdG8gYmVjb21lIGluYWN0aXZlLgotICovCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGQyZF9jbGtkbSA9IHsKLQkubmFtZQkJPSAiZDJkX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBFUzFfQ0xLVFJDVFJMX0QyRF9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKLX07Ci0KLS8qCi0gKiBYWFggYWRkIHVzZWNvdW50aW5nIGZvciBjbGtkbSBkZXBlbmRlbmNpZXMsIG90aGVyd2lzZSB0aGUgcHJlc2VuY2UKLSAqIG9mIGEgc2luZ2xlIGRlcCBiaXQgZm9yIGNvcmVfbDNfM3h4eF9jbGtkbSBhbmQgY29yZV9sNF8zeHh4X2Nsa2RtCi0gKiBjb3VsZCBjYXVzZSB0cm91YmxlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sM18zeHh4X2Nsa2RtID0gewotCS5uYW1lCQk9ICJjb3JlX2wzX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCi0JLmRlcF9iaXQJPSBPTUFQMzQzMF9FTl9DT1JFX1NISUZULAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9MM19NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKLX07Ci0KLS8qCi0gKiBYWFggYWRkIHVzZWNvdW50aW5nIGZvciBjbGtkbSBkZXBlbmRlbmNpZXMsIG90aGVyd2lzZSB0aGUgcHJlc2VuY2UKLSAqIG9mIGEgc2luZ2xlIGRlcCBiaXQgZm9yIGNvcmVfbDNfM3h4eF9jbGtkbSBhbmQgY29yZV9sNF8zeHh4X2Nsa2RtCi0gKiBjb3VsZCBjYXVzZSB0cm91YmxlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sNF8zeHh4X2Nsa2RtID0gewotCS5uYW1lCQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCi0JLmRlcF9iaXQJPSBPTUFQMzQzMF9FTl9DT1JFX1NISUZULAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9MNF9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKLX07Ci0KLS8qIEFub3RoZXIgY2FzZSBvZiBiaXQgbmFtZSBjb2xsaXNpb25zIGJldHdlZW4gc2V2ZXJhbCByZWdpc3RlcnM6IEVOX0RTUyAqLwotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkc3NfM3h4eF9jbGtkbSA9IHsKLQkubmFtZQkJPSAiZHNzX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJkc3NfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkuZGVwX2JpdAk9IE9NQVAzNDMwX1BNX1dLREVQX01QVV9FTl9EU1NfU0hJRlQsCi0JLndrZGVwX3NyY3MJPSBkc3Nfd2tkZXBzLAotCS5zbGVlcGRlcF9zcmNzCT0gZHNzX3NsZWVwZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfRFNTX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjYW1fY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImNhbV9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiY2FtX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLndrZGVwX3NyY3MJPSBjYW1fd2tkZXBzLAotCS5zbGVlcGRlcF9zcmNzCT0gY2FtX3NsZWVwZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfQ0FNX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiB1c2Job3N0X2Nsa2RtID0gewotCS5uYW1lCQk9ICJ1c2Job3N0X2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJ1c2Job3N0X3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLndrZGVwX3NyY3MJPSB1c2Job3N0X3drZGVwcywKLQkuc2xlZXBkZXBfc3Jjcwk9IHVzYmhvc3Rfc2xlZXBkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwRVMyX0NMS1RSQ1RSTF9VU0JIT1NUX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfR0VfT01BUDM0MzBFUzIpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBwZXJfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gInBlcl9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAicGVyX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLmRlcF9iaXQJPSBPTUFQMzQzMF9FTl9QRVJfU0hJRlQsCi0JLndrZGVwX3NyY3MJPSBwZXJfd2tkZXBzLAotCS5zbGVlcGRlcF9zcmNzCT0gcGVyX3NsZWVwZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfUEVSX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotLyoKLSAqIERpc2FibGUgaHcgc3VwZXJ2aXNlZCBtb2RlIGZvciBlbXVfY2xrZG0sIGJlY2F1c2UgZW11X3B3cmRtIGlzCi0gKiBzd2l0Y2hlZCBvZiBldmVuIGlmIHNkdGkgaXMgaW4gdXNlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZW11X2Nsa2RtID0gewotCS5uYW1lCQk9ICJlbXVfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImVtdV9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gLyogQ0xLRE1fQ0FOX0VOQUJMRV9BVVRPIHwgICovQ0xLRE1fQ0FOX1NXU1VQLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9FTVVfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRwbGwxX2Nsa2RtID0gewotCS5uYW1lCQk9ICJkcGxsMV9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiZHBsbDFfcHdyZG0iIH0sCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkcGxsMl9jbGtkbSA9IHsKLQkubmFtZQkJPSAiZHBsbDJfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImRwbGwyX3B3cmRtIiB9LAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHBsbDNfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImRwbGwzX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJkcGxsM19wd3JkbSIgfSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRwbGw0X2Nsa2RtID0gewotCS5uYW1lCQk9ICJkcGxsNF9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiZHBsbDRfcHdyZG0iIH0sCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkcGxsNV9jbGtkbSA9IHsKLQkubmFtZQkJPSAiZHBsbDVfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImRwbGw1X3B3cmRtIiB9LAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0dFX09NQVAzNDMwRVMyKSwKLX07Ci0KLSNlbmRpZiAgIC8qIENPTkZJR19BUkNIX09NQVAzICovCi0KLS8qCi0gKiBDbG9ja2RvbWFpbiBod3N1cCBkZXBlbmRlbmNpZXMgKE9NQVAzIG9ubHkpCi0gKi8KLQotc3RhdGljIHN0cnVjdCBjbGtkbV9hdXRvZGVwIGNsa2RtX2F1dG9kZXBzW10gPSB7Ci0JewotCQkuY2xrZG0JICAgPSB7IC5uYW1lID0gIm1wdV9jbGtkbSIgfSwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbQkgICA9IHsgLm5hbWUgPSAiaXZhMl9jbGtkbSIgfSwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbQkgICA9IHsgLm5hbWUgPSBOVUxMIH0sCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xvY2tkb21haW5zX29tYXAyW10gX19pbml0ZGF0YSA9IHsKLQkmd2t1cF9jbGtkbSwKLQkmY21fY2xrZG0sCi0JJnBybV9jbGtkbSwKLQotI2lmZGVmIENPTkZJR19TT0NfT01BUDI0MjAKLQkmbXB1XzI0MjBfY2xrZG0sCi0JJml2YTFfMjQyMF9jbGtkbSwKLQkmZHNwXzI0MjBfY2xrZG0sCi0JJmdmeF8yNDIwX2Nsa2RtLAotCSZjb3JlX2wzXzI0MjBfY2xrZG0sCi0JJmNvcmVfbDRfMjQyMF9jbGtkbSwKLQkmZHNzXzI0MjBfY2xrZG0sCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TT0NfT01BUDI0MzAKLQkmbXB1XzI0MzBfY2xrZG0sCi0JJm1kbV9jbGtkbSwKLQkmZHNwXzI0MzBfY2xrZG0sCi0JJmdmeF8yNDMwX2Nsa2RtLAotCSZjb3JlX2wzXzI0MzBfY2xrZG0sCi0JJmNvcmVfbDRfMjQzMF9jbGtkbSwKLQkmZHNzXzI0MzBfY2xrZG0sCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCi0JJm1wdV8zeHh4X2Nsa2RtLAotCSZuZW9uX2Nsa2RtLAotCSZpdmEyX2Nsa2RtLAotCSZnZnhfMzQzMGVzMV9jbGtkbSwKLQkmc2d4X2Nsa2RtLAotCSZkMmRfY2xrZG0sCi0JJmNvcmVfbDNfM3h4eF9jbGtkbSwKLQkmY29yZV9sNF8zeHh4X2Nsa2RtLAotCSZkc3NfM3h4eF9jbGtkbSwKLQkmY2FtX2Nsa2RtLAotCSZ1c2Job3N0X2Nsa2RtLAotCSZwZXJfY2xrZG0sCi0JJmVtdV9jbGtkbSwKLQkmZHBsbDFfY2xrZG0sCi0JJmRwbGwyX2Nsa2RtLAotCSZkcGxsM19jbGtkbSwKLQkmZHBsbDRfY2xrZG0sCi0JJmRwbGw1X2Nsa2RtLAotI2VuZGlmCi0JTlVMTCwKLX07Ci0KLXZvaWQgX19pbml0IG9tYXAyeHh4X2Nsb2NrZG9tYWluc19pbml0KHZvaWQpCi17Ci0JY2xrZG1faW5pdChjbG9ja2RvbWFpbnNfb21hcDIsIGNsa2RtX2F1dG9kZXBzLCAmb21hcDJfY2xrZG1fb3BlcmF0aW9ucyk7Ci19Ci0KLXZvaWQgX19pbml0IG9tYXAzeHh4X2Nsb2NrZG9tYWluc19pbml0KHZvaWQpCi17Ci0JY2xrZG1faW5pdChjbG9ja2RvbWFpbnNfb21hcDIsIGNsa2RtX2F1dG9kZXBzLCAmb21hcDNfY2xrZG1fb3BlcmF0aW9ucyk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczN4eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnMzeHh4X2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODRlMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnMzeHh4X2RhdGEuYwpAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIE9NQVAzeHh4IGNsb2NrZG9tYWlucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBhdWwgV2FsbXNsZXksIEpvdW5pIEjDtmdhbmRlcgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjbG9ja2RvbWFpbnMgYW5kIGNsb2NrZG9tYWluIHdha2V1cC9zbGVlcAorICogZGVwZW5kZW5jaWVzIGZvciB0aGUgT01BUDN4eHggY2hpcHMuICBTb21lIG5vdGVzOgorICoKKyAqIEEgdXNlZnVsIHZhbGlkYXRpb24gcnVsZSBmb3Igc3RydWN0IGNsb2NrZG9tYWluOiBBbnkgY2xvY2tkb21haW4KKyAqIHJlZmVyZW5jZWQgYnkgYSB3a2RlcF9zcmNzIG9yIHNsZWVwZGVwX3NyY3MgYXJyYXkgbXVzdCBoYXZlIGEKKyAqIGRlcF9iaXQgYXNzaWduZWQuICBTbyB3a2RlcF9zcmNzL3NsZWVwZGVwX3NyY3MgYXJlIHJlYWxseSBqdXN0CisgKiBzb2Z0d2FyZS1jb250cm9sbGFibGUgZGVwZW5kZW5jaWVzLiAgTm9uLXNvZnR3YXJlLWNvbnRyb2xsYWJsZQorICogZGVwZW5kZW5jaWVzIGRvIGV4aXN0LCBidXQgdGhleSBhcmUgbm90IGVuY29kZWQgYmVsb3cgKHlldCkuCisgKgorICogVGhlIG92ZXJseS1zcGVjaWZpYyBkZXBfYml0IG5hbWVzIGFyZSBkdWUgdG8gYSBiaXQgbmFtZSBjb2xsaXNpb24KKyAqIHdpdGggQ01fRkNMS0VOX3tEU1AsSVZBMn0uICBUaGUgRFNQL0lWQTIgUE1fV0tERVAgYW5kIENNX1NMRUVQREVQIHNoaWZ0CisgKiB2YWx1ZSBhcmUgdGhlIHNhbWUgZm9yIGFsbCBwb3dlcmRvbWFpbnM6IDIKKyAqCisgKiBYWFggc2hvdWxkIGRlcF9iaXQgYmUgYSBtYXNrLCBzbyB3ZSBjYW4gdGVzdCB0byBzZWUgaWYgaXQgaXMgMCBhcyBhCisgKiBzYW5pdHkgY2hlY2s/CisgKiBYWFggZW5jb2RlIGhhcmR3YXJlIGZpeGVkIHdha2V1cCBkZXBlbmRlbmNpZXMgLS0gZXNwLiBmb3IgMzQzMCBDT1JFCisgKi8KKworLyoKKyAqIFRvLURvIExpc3QKKyAqIC0+IFBvcnQgdGhlIFNsZWVwL1dha2V1cCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBkb21haW5zCisgKiAgICBmcm9tIHRoZSBQb3dlciBkb21haW4gZnJhbWV3b3JrCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJjbG9ja2RvbWFpbi5oIgorI2luY2x1ZGUgInBybTJ4eHhfM3h4eC5oIgorI2luY2x1ZGUgImNtMnh4eF8zeHh4LmgiCisjaW5jbHVkZSAiY20tcmVnYml0cy0zNHh4LmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMzR4eC5oIgorCisvKgorICogQ2xvY2tkb21haW4gZGVwZW5kZW5jaWVzIGZvciB3a2RlcHMvc2xlZXBkZXBzCisgKgorICogWFhYIEhhcmR3YXJlIGRlcGVuZGVuY2llcyAoZS5nLiwgZGVwZW5kZW5jaWVzIHRoYXQgY2Fubm90IGJlCisgKiBjaGFuZ2VkIGluIHNvZnR3YXJlKSBhcmUgbm90IGluY2x1ZGVkIGhlcmUgeWV0LCBidXQgc2hvdWxkIGJlLgorICovCisKKy8qIE9NQVAzLXNwZWNpZmljIHBvc3NpYmxlIGRlcGVuZGVuY2llcyAqLworCisvKgorICogMzQzMEVTMSBQTV9XS0RFUF9HRlg6IGFkZHMgSVZBMiwgcmVtb3ZlcyBDT1JFCisgKiAzNDMwRVMyIFBNX1dLREVQX1NHWDogYWRkcyBJVkEyLCByZW1vdmVzIENPUkUKKyAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZ2Z4X3NneF8zeHh4X3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIsIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLCB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIsIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAzNDMwOiBQTV9XS0RFUF9QRVI6IENPUkUsIElWQTIsIE1QVSwgV0tVUCAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgcGVyX3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qIDM0MzBFUzI6IFBNX1dLREVQX1VTQkhPU1Q6IENPUkUsIElWQTIsIE1QVSwgV0tVUCAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgdXNiaG9zdF93a2RlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDNfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAzNDMwIFBNX1dLREVQX01QVTogQ09SRSwgSVZBMiwgRFNTLCBQRVIgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIG1wdV8zeHh4X3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiZHNzX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAicGVyX2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyogMzQzMCBQTV9XS0RFUF9JVkEyOiBDT1JFLCBNUFUsIFdLVVAsIERTUywgUEVSICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBpdmEyX3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiZHNzX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAicGVyX2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyogMzQzMCBQTV9XS0RFUF9DQU06IElWQTIsIE1QVSwgV0tVUCAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgY2FtX3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAzNDMwIFBNX1dLREVQX0RTUzogSVZBMiwgTVBVLCBXS1VQICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBkc3Nfd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qIDM0MzA6IFBNX1dLREVQX05FT046IE1QVSAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbmVvbl93a2RlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qIFNsZWVwIGRlcGVuZGVuY3kgc291cmNlIGFycmF5cyBmb3IgT01BUDMtc3BlY2lmaWMgY2xrZG1zICovCisKKy8qIDM0MzA6IENNX1NMRUVQREVQX0RTUzogTVBVLCBJVkEgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGRzc19zbGVlcGRlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAzNDMwOiBDTV9TTEVFUERFUF9QRVI6IE1QVSwgSVZBICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBwZXJfc2xlZXBkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyogMzQzMEVTMjogQ01fU0xFRVBERVBfVVNCSE9TVDogTVBVLCBJVkEgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIHVzYmhvc3Rfc2xlZXBkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyogMzQzMDogQ01fU0xFRVBERVBfQ0FNOiBNUFUgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGNhbV9zbGVlcGRlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qCisgKiAzNDMwRVMxOiBDTV9TTEVFUERFUF9HRlg6IE1QVQorICogMzQzMEVTMjogQ01fU0xFRVBERVBfU0dYOiBNUFUKKyAqIFRoZXNlIGNhbiBzaGFyZSBkYXRhIHNpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSBwcmVzZW50IHNpbXVsdGFuZW91c2x5CisgKiBvbiB0aGUgc2FtZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGdmeF9zZ3hfc2xlZXBkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKgorICogT01BUDMgY2xvY2tkb21haW5zCisgKi8KKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBtcHVfM3h4eF9jbGtkbSA9IHsKKwkubmFtZQkJPSAibXB1X2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJtcHVfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCB8IENMS0RNX0NBTl9GT1JDRV9XQUtFVVAsCisJLmRlcF9iaXQJPSBPTUFQMzQzMF9FTl9NUFVfU0hJRlQsCisJLndrZGVwX3NyY3MJPSBtcHVfM3h4eF93a2RlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX01QVV9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBuZW9uX2Nsa2RtID0geworCS5uYW1lCQk9ICJuZW9uX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJuZW9uX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLndrZGVwX3NyY3MJPSBuZW9uX3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfTkVPTl9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBpdmEyX2Nsa2RtID0geworCS5uYW1lCQk9ICJpdmEyX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJpdmEyX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmRlcF9iaXQJPSBPTUFQMzQzMF9QTV9XS0RFUF9NUFVfRU5fSVZBMl9TSElGVCwKKwkud2tkZXBfc3Jjcwk9IGl2YTJfd2tkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9JVkEyX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGdmeF8zNDMwZXMxX2Nsa2RtID0geworCS5uYW1lCQk9ICJnZnhfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImdmeF9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS53a2RlcF9zcmNzCT0gZ2Z4X3NneF8zeHh4X3drZGVwcywKKwkuc2xlZXBkZXBfc3Jjcwk9IGdmeF9zZ3hfc2xlZXBkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwRVMxX0NMS1RSQ1RSTF9HRlhfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gc2d4X2Nsa2RtID0geworCS5uYW1lCQk9ICJzZ3hfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gInNneF9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS53a2RlcF9zcmNzCT0gZ2Z4X3NneF8zeHh4X3drZGVwcywKKwkuc2xlZXBkZXBfc3Jjcwk9IGdmeF9zZ3hfc2xlZXBkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwRVMyX0NMS1RSQ1RSTF9TR1hfTUFTSywKK307CisKKy8qCisgKiBUaGUgZGllLXRvLWRpZSBjbG9ja2RvbWFpbiB3YXMgZG9jdW1lbnRlZCBpbiB0aGUgMzR4eCBFUzEgVFJNLCBidXQKKyAqIHRoZW4gdGhhdCBpbmZvcm1hdGlvbiB3YXMgcmVtb3ZlZCBmcm9tIHRoZSAzNHh4IEVTMisgVFJNLiAgSXQgaXMKKyAqIHVuY2xlYXIgd2hldGhlciB0aGUgY29yZSBpcyBzdGlsbCB0aGVyZSwgYnV0IHRoZSBjbG9ja2RvbWFpbiBsb2dpYworICogaXMgdGhlcmUsIGFuZCBtdXN0IGJlIHByb2dyYW1tZWQgdG8gYW4gYXBwcm9wcmlhdGUgc3RhdGUgaWYgdGhlCisgKiBDT1JFIGNsb2NrZG9tYWluIGlzIHRvIGJlY29tZSBpbmFjdGl2ZS4KKyAqLworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkMmRfY2xrZG0gPSB7CisJLm5hbWUJCT0gImQyZF9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwRVMxX0NMS1RSQ1RSTF9EMkRfTUFTSywKK307CisKKy8qCisgKiBYWFggYWRkIHVzZWNvdW50aW5nIGZvciBjbGtkbSBkZXBlbmRlbmNpZXMsIG90aGVyd2lzZSB0aGUgcHJlc2VuY2UKKyAqIG9mIGEgc2luZ2xlIGRlcCBiaXQgZm9yIGNvcmVfbDNfM3h4eF9jbGtkbSBhbmQgY29yZV9sNF8zeHh4X2Nsa2RtCisgKiBjb3VsZCBjYXVzZSB0cm91YmxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sM18zeHh4X2Nsa2RtID0geworCS5uYW1lCQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCisJLmRlcF9iaXQJPSBPTUFQMzQzMF9FTl9DT1JFX1NISUZULAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9MM19NQVNLLAorfTsKKworLyoKKyAqIFhYWCBhZGQgdXNlY291bnRpbmcgZm9yIGNsa2RtIGRlcGVuZGVuY2llcywgb3RoZXJ3aXNlIHRoZSBwcmVzZW5jZQorICogb2YgYSBzaW5nbGUgZGVwIGJpdCBmb3IgY29yZV9sM18zeHh4X2Nsa2RtIGFuZCBjb3JlX2w0XzN4eHhfY2xrZG0KKyAqIGNvdWxkIGNhdXNlIHRyb3VibGUKKyAqLworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjb3JlX2w0XzN4eHhfY2xrZG0gPSB7CisJLm5hbWUJCT0gImNvcmVfbDRfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkuZGVwX2JpdAk9IE9NQVAzNDMwX0VOX0NPUkVfU0hJRlQsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX0w0X01BU0ssCit9OworCisvKiBBbm90aGVyIGNhc2Ugb2YgYml0IG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHNldmVyYWwgcmVnaXN0ZXJzOiBFTl9EU1MgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHNzXzN4eHhfY2xrZG0gPSB7CisJLm5hbWUJCT0gImRzc19jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiZHNzX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmRlcF9iaXQJPSBPTUFQMzQzMF9QTV9XS0RFUF9NUFVfRU5fRFNTX1NISUZULAorCS53a2RlcF9zcmNzCT0gZHNzX3drZGVwcywKKwkuc2xlZXBkZXBfc3Jjcwk9IGRzc19zbGVlcGRlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX0RTU19NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjYW1fY2xrZG0gPSB7CisJLm5hbWUJCT0gImNhbV9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiY2FtX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLndrZGVwX3NyY3MJPSBjYW1fd2tkZXBzLAorCS5zbGVlcGRlcF9zcmNzCT0gY2FtX3NsZWVwZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfQ0FNX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIHVzYmhvc3RfY2xrZG0gPSB7CisJLm5hbWUJCT0gInVzYmhvc3RfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gInVzYmhvc3RfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkud2tkZXBfc3Jjcwk9IHVzYmhvc3Rfd2tkZXBzLAorCS5zbGVlcGRlcF9zcmNzCT0gdXNiaG9zdF9zbGVlcGRlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBFUzJfQ0xLVFJDVFJMX1VTQkhPU1RfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gcGVyX2Nsa2RtID0geworCS5uYW1lCQk9ICJwZXJfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gInBlcl9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS5kZXBfYml0CT0gT01BUDM0MzBfRU5fUEVSX1NISUZULAorCS53a2RlcF9zcmNzCT0gcGVyX3drZGVwcywKKwkuc2xlZXBkZXBfc3Jjcwk9IHBlcl9zbGVlcGRlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX1BFUl9NQVNLLAorfTsKKworLyoKKyAqIERpc2FibGUgaHcgc3VwZXJ2aXNlZCBtb2RlIGZvciBlbXVfY2xrZG0sIGJlY2F1c2UgZW11X3B3cmRtIGlzCisgKiBzd2l0Y2hlZCBvZiBldmVuIGlmIHNkdGkgaXMgaW4gdXNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZW11X2Nsa2RtID0geworCS5uYW1lCQk9ICJlbXVfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImVtdV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gLyogQ0xLRE1fQ0FOX0VOQUJMRV9BVVRPIHwgICovQ0xLRE1fQ0FOX1NXU1VQLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9FTVVfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHBsbDFfY2xrZG0gPSB7CisJLm5hbWUJCT0gImRwbGwxX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJkcGxsMV9wd3JkbSIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHBsbDJfY2xrZG0gPSB7CisJLm5hbWUJCT0gImRwbGwyX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJkcGxsMl9wd3JkbSIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHBsbDNfY2xrZG0gPSB7CisJLm5hbWUJCT0gImRwbGwzX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJkcGxsM19wd3JkbSIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHBsbDRfY2xrZG0gPSB7CisJLm5hbWUJCT0gImRwbGw0X2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJkcGxsNF9wd3JkbSIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHBsbDVfY2xrZG0gPSB7CisJLm5hbWUJCT0gImRwbGw1X2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJkcGxsNV9wd3JkbSIgfSwKK307CisKKy8qCisgKiBDbG9ja2RvbWFpbiBod3N1cCBkZXBlbmRlbmNpZXMKKyAqLworCitzdGF0aWMgc3RydWN0IGNsa2RtX2F1dG9kZXAgY2xrZG1fYXV0b2RlcHNbXSA9IHsKKwl7CisJCS5jbGtkbSA9IHsgLm5hbWUgPSAibXB1X2Nsa2RtIiB9LAorCX0sCisJeworCQkuY2xrZG0gPSB7IC5uYW1lID0gIml2YTJfY2xrZG0iIH0sCisJfSwKKwl7CisJCS5jbGtkbSA9IHsgLm5hbWUgPSBOVUxMIH0sCisJfQorfTsKKworLyoKKyAqCisgKi8KKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xvY2tkb21haW5zX29tYXAzNDMwX2NvbW1vbltdIF9faW5pdGRhdGEgPSB7CisJJndrdXBfY29tbW9uX2Nsa2RtLAorCSZjbV9jb21tb25fY2xrZG0sCisJJnBybV9jb21tb25fY2xrZG0sCisJJm1wdV8zeHh4X2Nsa2RtLAorCSZuZW9uX2Nsa2RtLAorCSZpdmEyX2Nsa2RtLAorCSZkMmRfY2xrZG0sCisJJmNvcmVfbDNfM3h4eF9jbGtkbSwKKwkmY29yZV9sNF8zeHh4X2Nsa2RtLAorCSZkc3NfM3h4eF9jbGtkbSwKKwkmY2FtX2Nsa2RtLAorCSZwZXJfY2xrZG0sCisJJmVtdV9jbGtkbSwKKwkmZHBsbDFfY2xrZG0sCisJJmRwbGwyX2Nsa2RtLAorCSZkcGxsM19jbGtkbSwKKwkmZHBsbDRfY2xrZG0sCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xvY2tkb21haW5zX29tYXAzNDMwZXMxW10gX19pbml0ZGF0YSA9IHsKKwkmZ2Z4XzM0MzBlczFfY2xrZG0sCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gKmNsb2NrZG9tYWluc19vbWFwMzQzMGVzMnBsdXNbXSBfX2luaXRkYXRhID0geworCSZzZ3hfY2xrZG0sCisJJmRwbGw1X2Nsa2RtLAorCSZ1c2Job3N0X2Nsa2RtLAorCU5VTEwsCit9OworCit2b2lkIF9faW5pdCBvbWFwM3h4eF9jbG9ja2RvbWFpbnNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjbG9ja2RvbWFpbiAqKnNjOworCisJaWYgKCFjcHVfaXNfb21hcDM0eHgoKSkKKwkJcmV0dXJuOworCisJY2xrZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3MoJm9tYXAzX2Nsa2RtX29wZXJhdGlvbnMpOworCWNsa2RtX3JlZ2lzdGVyX2Nsa2RtcyhjbG9ja2RvbWFpbnNfb21hcDM0MzBfY29tbW9uKTsKKworCXNjID0gKG9tYXBfcmV2KCkgPT0gT01BUDM0MzBfUkVWX0VTMV8wKSA/IGNsb2NrZG9tYWluc19vbWFwMzQzMGVzMSA6CisJCWNsb2NrZG9tYWluc19vbWFwMzQzMGVzMnBsdXM7CisKKwljbGtkbV9yZWdpc3Rlcl9jbGtkbXMoc2MpOworCisJY2xrZG1fcmVnaXN0ZXJfYXV0b2RlcHMoY2xrZG1fYXV0b2RlcHMpOworCWNsa2RtX2NvbXBsZXRlX2luaXQoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zNDR4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczQ0eHhfZGF0YS5jCmluZGV4IGRjY2M2NTEuLjkyOTlhYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zNDR4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnM0NHh4X2RhdGEuYwpAQCAtMzQsMzUwICszNCwxMjIgQEAKIC8qIFN0YXRpYyBEZXBlbmRlbmNpZXMgZm9yIE9NQVA0IENsb2NrIERvbWFpbnMgKi8KIAogc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZDJkX3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gImFiZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gIml2YWhkX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfaW5pdF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X2NmZ19jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3Blcl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAorCXsgLmNsa2RtX25hbWUgPSAiYWJlX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiaXZhaGRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18xX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2VtaWZfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19pbml0X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfY2ZnX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfcGVyX2Nsa2RtIiB9LAogCXsgTlVMTCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZHVjYXRpX3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gImFiZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gIml2YWhkX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19kc3NfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZ2Z4X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfaW5pdF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X2NmZ19jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3Blcl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3NlY3VyZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3drdXBfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJ0ZXNsYV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAorCXsgLmNsa2RtX25hbWUgPSAiYWJlX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiaXZhaGRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18xX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2Rzc19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2VtaWZfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19nZnhfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19pbml0X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfY2ZnX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfcGVyX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfc2VjdXJlX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfd2t1cF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gInRlc2xhX2Nsa2RtIiB9LAogCXsgTlVMTCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgaXNzX3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gIml2YWhkX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2VtaWZfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YWhkX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2VtaWZfY2xrZG0iIH0sCiAJeyBOVUxMIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBpdmFoZF93a3VwX3NsZWVwX2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM18xX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZW1pZl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2VtaWZfY2xrZG0iIH0sCiAJeyBOVUxMIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBsM19kbWFfd2t1cF9zbGVlcF9kZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZQkgPSAiYWJlX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAiZHVjYXRpX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAiaXZhaGRfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM18xX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZHNzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZW1pZl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2luaXRfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9jZmdfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9wZXJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9zZWN1cmVfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF93a3VwX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCisJeyAuY2xrZG1fbmFtZSA9ICJhYmVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJkdWNhdGlfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmFoZF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzXzFfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19kc3NfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19lbWlmX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfaW5pdF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X2NmZ19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3Blcl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3NlY3VyZV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3drdXBfY2xrZG0iIH0sCiAJeyBOVUxMIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBsM19kc3Nfd2t1cF9zbGVlcF9kZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZQkgPSAiaXZhaGRfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM18yX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZW1pZl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAorCXsgLmNsa2RtX25hbWUgPSAiaXZhaGRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18yX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfZW1pZl9jbGtkbSIgfSwKIAl7IE5VTEwgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGwzX2dmeF93a3VwX3NsZWVwX2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJpdmFoZF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzFfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmFoZF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzXzFfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19lbWlmX2Nsa2RtIiB9LAogCXsgTlVMTCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbDNfaW5pdF93a3VwX3NsZWVwX2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJhYmVfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJpdmFoZF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2VtaWZfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9jZmdfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9wZXJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9zZWN1cmVfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF93a3VwX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCisJeyAuY2xrZG1fbmFtZSA9ICJhYmVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmFoZF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2VtaWZfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF9jZmdfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF9wZXJfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF9zZWN1cmVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF93a3VwX2Nsa2RtIiB9LAogCXsgTlVMTCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbDRfc2VjdXJlX3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzFfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfcGVyX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18xX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfZW1pZl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3Blcl9jbGtkbSIgfSwKIAl7IE5VTEwgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIG1wdV93a3VwX3NsZWVwX2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJhYmVfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJkdWNhdGlfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJpdmFoZF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzFfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM18yX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZHNzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZW1pZl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2dmeF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2luaXRfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9jZmdfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9wZXJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9zZWN1cmVfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF93a3VwX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAidGVzbGFfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKKwl7IC5jbGtkbV9uYW1lID0gImFiZV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImR1Y2F0aV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YWhkX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzXzJfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19kc3NfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19lbWlmX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfZ2Z4X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfaW5pdF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X2NmZ19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3Blcl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3NlY3VyZV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3drdXBfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ0ZXNsYV9jbGtkbSIgfSwKIAl7IE5VTEwgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIHRlc2xhX3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gImFiZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gIml2YWhkX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfaW5pdF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X2NmZ19jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3Blcl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3drdXBfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKKwl7IC5jbGtkbV9uYW1lID0gImFiZV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YWhkX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzXzJfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19lbWlmX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfaW5pdF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X2NmZ19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3Blcl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3drdXBfY2xrZG0iIH0sCiAJeyBOVUxMIH0sCiB9OwogCkBAIC0zODgsNyArMTYwLDYgQEAKIAkuY21faW5zdAkgID0gT01BUDQ0MzBfQ00yX0NFRlVTRV9JTlNULAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9DTTJfQ0VGVVNFX0NFRlVTRV9DRE9GRlMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCB8IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDRfY2ZnXzQ0eHhfY2xrZG0gPSB7CkBAIC0zOTksNyArMTcwLDYgQEAKIAkuY2xrZG1fb2ZmcwkgID0gT01BUDQ0MzBfQ00yX0NPUkVfTDRDRkdfQ0RPRkZTLAogCS5kZXBfYml0CSAgPSBPTUFQNDQzMF9MNENGR19TVEFUREVQX1NISUZULAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gdGVzbGFfNDR4eF9jbGtkbSA9IHsKQEAgLTQxMiw3ICsxODIsNiBAQAogCS53a2RlcF9zcmNzCSAgPSB0ZXNsYV93a3VwX3NsZWVwX2RlcHMsCiAJLnNsZWVwZGVwX3NyY3MJICA9IHRlc2xhX3drdXBfc2xlZXBfZGVwcywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGwzX2dmeF80NHh4X2Nsa2RtID0gewpAQCAtNDI1LDcgKzE5NCw2IEBACiAJLndrZGVwX3NyY3MJICA9IGwzX2dmeF93a3VwX3NsZWVwX2RlcHMsCiAJLnNsZWVwZGVwX3NyY3MJICA9IGwzX2dmeF93a3VwX3NsZWVwX2RlcHMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBpdmFoZF80NHh4X2Nsa2RtID0gewpAQCAtNDM4LDcgKzIwNiw2IEBACiAJLndrZGVwX3NyY3MJICA9IGl2YWhkX3drdXBfc2xlZXBfZGVwcywKIAkuc2xlZXBkZXBfc3JjcwkgID0gaXZhaGRfd2t1cF9zbGVlcF9kZXBzLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDRfc2VjdXJlXzQ0eHhfY2xrZG0gPSB7CkBAIC00NTEsNyArMjE4LDYgQEAKIAkud2tkZXBfc3JjcwkgID0gbDRfc2VjdXJlX3drdXBfc2xlZXBfZGVwcywKIAkuc2xlZXBkZXBfc3JjcwkgID0gbDRfc2VjdXJlX3drdXBfc2xlZXBfZGVwcywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGw0X3Blcl80NHh4X2Nsa2RtID0gewpAQCAtNDYyLDcgKzIyOCw2IEBACiAJLmNsa2RtX29mZnMJICA9IE9NQVA0NDMwX0NNMl9MNFBFUl9MNFBFUl9DRE9GRlMsCiAJLmRlcF9iaXQJICA9IE9NQVA0NDMwX0w0UEVSX1NUQVRERVBfU0hJRlQsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBhYmVfNDR4eF9jbGtkbSA9IHsKQEAgLTQ3Myw3ICsyMzgsNiBAQAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9DTTFfQUJFX0FCRV9DRE9GRlMsCiAJLmRlcF9iaXQJICA9IE9NQVA0NDMwX0FCRV9TVEFUREVQX1NISUZULAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDNfaW5zdHJfNDR4eF9jbGtkbSA9IHsKQEAgLTQ4Miw3ICsyNDYsNiBAQAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfQ00yX1BBUlRJVElPTiwKIAkuY21faW5zdAkgID0gT01BUDQ0MzBfQ00yX0NPUkVfSU5TVCwKIAkuY2xrZG1fb2ZmcwkgID0gT01BUDQ0MzBfQ00yX0NPUkVfTDNJTlNUUl9DRE9GRlMsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGwzX2luaXRfNDR4eF9jbGtkbSA9IHsKQEAgLTQ5NSw3ICsyNTgsNiBAQAogCS53a2RlcF9zcmNzCSAgPSBsM19pbml0X3drdXBfc2xlZXBfZGVwcywKIAkuc2xlZXBkZXBfc3JjcwkgID0gbDNfaW5pdF93a3VwX3NsZWVwX2RlcHMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkMmRfNDR4eF9jbGtkbSA9IHsKQEAgLTUwNyw3ICsyNjksNiBAQAogCS53a2RlcF9zcmNzCSAgPSBkMmRfd2t1cF9zbGVlcF9kZXBzLAogCS5zbGVlcGRlcF9zcmNzCSAgPSBkMmRfd2t1cF9zbGVlcF9kZXBzLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9GT1JDRV9XQUtFVVAgfCBDTEtETV9DQU5fSFdTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG1wdTBfNDR4eF9jbGtkbSA9IHsKQEAgLTUxNyw3ICsyNzgsNiBAQAogCS5jbV9pbnN0CSAgPSBPTUFQNDQzMF9QUkNNX01QVV9DUFUwX0lOU1QsCiAJLmNsa2RtX29mZnMJICA9IE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfQ1BVMF9DRE9GRlMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCB8IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbXB1MV80NHh4X2Nsa2RtID0gewpAQCAtNTI3LDcgKzI4Nyw2IEBACiAJLmNtX2luc3QJICA9IE9NQVA0NDMwX1BSQ01fTVBVX0NQVTFfSU5TVCwKIAkuY2xrZG1fb2ZmcwkgID0gT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMV9DUFUxX0NET0ZGUywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQIHwgQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBsM19lbWlmXzQ0eHhfY2xrZG0gPSB7CkBAIC01MzgsNyArMjk3LDYgQEAKIAkuY2xrZG1fb2ZmcwkgID0gT01BUDQ0MzBfQ00yX0NPUkVfTUVNSUZfQ0RPRkZTLAogCS5kZXBfYml0CSAgPSBPTUFQNDQzMF9NRU1JRl9TVEFUREVQX1NISUZULAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9GT1JDRV9XQUtFVVAgfCBDTEtETV9DQU5fSFdTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGw0X2FvXzQ0eHhfY2xrZG0gPSB7CkBAIC01NDgsNyArMzA2LDYgQEAKIAkuY21faW5zdAkgID0gT01BUDQ0MzBfQ00yX0FMV0FZU19PTl9JTlNULAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9DTTJfQUxXQVlTX09OX0FMV09OX0NET0ZGUywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQIHwgQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkdWNhdGlfNDR4eF9jbGtkbSA9IHsKQEAgLTU2MSw3ICszMTgsNiBAQAogCS53a2RlcF9zcmNzCSAgPSBkdWNhdGlfd2t1cF9zbGVlcF9kZXBzLAogCS5zbGVlcGRlcF9zcmNzCSAgPSBkdWNhdGlfd2t1cF9zbGVlcF9kZXBzLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbXB1XzQ0eHhfY2xrZG0gPSB7CkBAIC01NzMsNyArMzI5LDYgQEAKIAkud2tkZXBfc3JjcwkgID0gbXB1X3drdXBfc2xlZXBfZGVwcywKIAkuc2xlZXBkZXBfc3JjcwkgID0gbXB1X3drdXBfc2xlZXBfZGVwcywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQIHwgQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBsM18yXzQ0eHhfY2xrZG0gPSB7CkBAIC01ODQsNyArMzM5LDYgQEAKIAkuY2xrZG1fb2ZmcwkgID0gT01BUDQ0MzBfQ00yX0NPUkVfTDNfMl9DRE9GRlMsCiAJLmRlcF9iaXQJICA9IE9NQVA0NDMwX0wzXzJfU1RBVERFUF9TSElGVCwKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fSFdTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGwzXzFfNDR4eF9jbGtkbSA9IHsKQEAgLTU5NSw3ICszNDksNiBAQAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9DTTJfQ09SRV9MM18xX0NET0ZGUywKIAkuZGVwX2JpdAkgID0gT01BUDQ0MzBfTDNfMV9TVEFUREVQX1NISUZULAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gaXNzXzQ0eHhfY2xrZG0gPSB7CkBAIC02MDcsNyArMzYwLDYgQEAKIAkud2tkZXBfc3JjcwkgID0gaXNzX3drdXBfc2xlZXBfZGVwcywKIAkuc2xlZXBkZXBfc3JjcwkgID0gaXNzX3drdXBfc2xlZXBfZGVwcywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGwzX2Rzc180NHh4X2Nsa2RtID0gewpAQCAtNjIwLDcgKzM3Miw2IEBACiAJLndrZGVwX3NyY3MJICA9IGwzX2Rzc193a3VwX3NsZWVwX2RlcHMsCiAJLnNsZWVwZGVwX3NyY3MJICA9IGwzX2Rzc193a3VwX3NsZWVwX2RlcHMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBsNF93a3VwXzQ0eHhfY2xrZG0gPSB7CkBAIC02MzEsNyArMzgyLDYgQEAKIAkuY2xrZG1fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX1dLVVBfQ01fV0tVUF9DRE9GRlMsCiAJLmRlcF9iaXQJICA9IE9NQVA0NDMwX0w0V0tVUF9TVEFUREVQX1NISUZULAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZW11X3N5c180NHh4X2Nsa2RtID0gewpAQCAtNjQxLDcgKzM5MSw2IEBACiAJLmNtX2luc3QJICA9IE9NQVA0NDMwX1BSTV9FTVVfQ01fSU5TVCwKIAkuY2xrZG1fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX0VNVV9DTV9FTVVfQ0RPRkZTLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDNfZG1hXzQ0eHhfY2xrZG0gPSB7CkBAIC02NTMsNyArNDAyLDYgQEAKIAkud2tkZXBfc3JjcwkgID0gbDNfZG1hX3drdXBfc2xlZXBfZGVwcywKIAkuc2xlZXBkZXBfc3JjcwkgID0gbDNfZG1hX3drdXBfc2xlZXBfZGVwcywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQIHwgQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogQXMgY2xvY2tkb21haW5zIGFyZSBhZGRlZCBvciByZW1vdmVkIGFib3ZlLCB0aGlzIGxpc3QgbXVzdCBhbHNvIGJlIGNoYW5nZWQgKi8KQEAgLTY4NSw3ICs0MzMsMTAgQEAKIAlOVUxMCiB9OwogCisKIHZvaWQgX19pbml0IG9tYXA0NHh4X2Nsb2NrZG9tYWluc19pbml0KHZvaWQpCiB7Ci0JY2xrZG1faW5pdChjbG9ja2RvbWFpbnNfb21hcDQ0eHgsIE5VTEwsICZvbWFwNF9jbGtkbV9vcGVyYXRpb25zKTsKKwljbGtkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcygmb21hcDRfY2xrZG1fb3BlcmF0aW9ucyk7CisJY2xrZG1fcmVnaXN0ZXJfY2xrZG1zKGNsb2NrZG9tYWluc19vbWFwNDR4eCk7CisJY2xrZG1fY29tcGxldGVfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLmMKaW5kZXggM2YyMGNiYi4uMTEwZTViOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi5jCkBAIC00NSwxNyArNDUsMjIgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9nbG9iYWxzIG9tYXAyNDJ4X2dsb2JhbHMgPSB7CiAJLmNsYXNzCT0gT01BUDI0MlhfQ0xBU1MsCiAJLnRhcAk9IE9NQVAyX0w0X0lPX0FERFJFU1MoMHg0ODAxNDAwMCksCi0JLnNkcmMJPSBPTUFQMjQyMF9TRFJDX0JBU0UsCi0JLnNtcwk9IE9NQVAyNDIwX1NNU19CQVNFLAotCS5jdHJsCT0gT01BUDI0MlhfQ1RSTF9CQVNFLAotCS5wcm0JPSBPTUFQMjQyMF9QUk1fQkFTRSwKLQkuY20JPSBPTUFQMjQyMF9DTV9CQVNFLAorCS5zZHJjCT0gT01BUDJfTDNfSU9fQUREUkVTUyhPTUFQMjQyMF9TRFJDX0JBU0UpLAorCS5zbXMJPSBPTUFQMl9MM19JT19BRERSRVNTKE9NQVAyNDIwX1NNU19CQVNFKSwKKwkuY3RybAk9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDI0MlhfQ1RSTF9CQVNFKSwKKwkucHJtCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMjQyMF9QUk1fQkFTRSksCisJLmNtCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMjQyMF9DTV9CQVNFKSwKIH07CiAKIHZvaWQgX19pbml0IG9tYXAyX3NldF9nbG9iYWxzXzI0Mngodm9pZCkKIHsKIAlfX29tYXAyX3NldF9nbG9iYWxzKCZvbWFwMjQyeF9nbG9iYWxzKTsKIH0KKwordm9pZCBfX2luaXQgb21hcDI0MnhfbWFwX2lvKHZvaWQpCit7CisJb21hcDI0MnhfbWFwX2NvbW1vbl9pbygpOworfQogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TT0NfT01BUDI0MzApCkBAIC02MywxNyArNjgsMjIgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9nbG9iYWxzIG9tYXAyNDN4X2dsb2JhbHMgPSB7CiAJLmNsYXNzCT0gT01BUDI0M1hfQ0xBU1MsCiAJLnRhcAk9IE9NQVAyX0w0X0lPX0FERFJFU1MoMHg0OTAwYTAwMCksCi0JLnNkcmMJPSBPTUFQMjQzWF9TRFJDX0JBU0UsCi0JLnNtcwk9IE9NQVAyNDNYX1NNU19CQVNFLAotCS5jdHJsCT0gT01BUDI0M1hfQ1RSTF9CQVNFLAotCS5wcm0JPSBPTUFQMjQzMF9QUk1fQkFTRSwKLQkuY20JPSBPTUFQMjQzMF9DTV9CQVNFLAorCS5zZHJjCT0gT01BUDJfTDNfSU9fQUREUkVTUyhPTUFQMjQzWF9TRFJDX0JBU0UpLAorCS5zbXMJPSBPTUFQMl9MM19JT19BRERSRVNTKE9NQVAyNDNYX1NNU19CQVNFKSwKKwkuY3RybAk9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDI0M1hfQ1RSTF9CQVNFKSwKKwkucHJtCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMjQzMF9QUk1fQkFTRSksCisJLmNtCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMjQzMF9DTV9CQVNFKSwKIH07CiAKIHZvaWQgX19pbml0IG9tYXAyX3NldF9nbG9iYWxzXzI0M3godm9pZCkKIHsKIAlfX29tYXAyX3NldF9nbG9iYWxzKCZvbWFwMjQzeF9nbG9iYWxzKTsKIH0KKwordm9pZCBfX2luaXQgb21hcDI0M3hfbWFwX2lvKHZvaWQpCit7CisJb21hcDI0M3hfbWFwX2NvbW1vbl9pbygpOworfQogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQpAQCAtODEsMTEgKzkxLDExIEBACiBzdGF0aWMgc3RydWN0IG9tYXBfZ2xvYmFscyBvbWFwM19nbG9iYWxzID0gewogCS5jbGFzcwk9IE9NQVAzNDNYX0NMQVNTLAogCS50YXAJPSBPTUFQMl9MNF9JT19BRERSRVNTKDB4NDgzMEEwMDApLAotCS5zZHJjCT0gT01BUDM0M1hfU0RSQ19CQVNFLAotCS5zbXMJPSBPTUFQMzQzWF9TTVNfQkFTRSwKLQkuY3RybAk9IE9NQVAzNDNYX0NUUkxfQkFTRSwKLQkucHJtCT0gT01BUDM0MzBfUFJNX0JBU0UsCi0JLmNtCT0gT01BUDM0MzBfQ01fQkFTRSwKKwkuc2RyYwk9IE9NQVAyX0wzX0lPX0FERFJFU1MoT01BUDM0M1hfU0RSQ19CQVNFKSwKKwkuc21zCT0gT01BUDJfTDNfSU9fQUREUkVTUyhPTUFQMzQzWF9TTVNfQkFTRSksCisJLmN0cmwJPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVAzNDNYX0NUUkxfQkFTRSksCisJLnBybQk9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDM0MzBfUFJNX0JBU0UpLAorCS5jbQk9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDM0MzBfQ01fQkFTRSksCiB9OwogCiB2b2lkIF9faW5pdCBvbWFwMl9zZXRfZ2xvYmFsc18zeHh4KHZvaWQpCkBAIC05NSw3ICsxMDUsNiBAQAogCiB2b2lkIF9faW5pdCBvbWFwM19tYXBfaW8odm9pZCkKIHsKLQlvbWFwMl9zZXRfZ2xvYmFsc18zeHh4KCk7CiAJb21hcDM0eHhfbWFwX2NvbW1vbl9pbygpOwogfQogCkBAIC0xMTAsOSArMTE5LDkgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9nbG9iYWxzIHRpODE2eF9nbG9iYWxzID0gewogCS5jbGFzcyAgPSBPTUFQMzQzWF9DTEFTUywKIAkudGFwICAgID0gT01BUDJfTDRfSU9fQUREUkVTUyhUSTgxNlhfVEFQX0JBU0UpLAotCS5jdHJsICAgPSBUSTgxNlhfQ1RSTF9CQVNFLAotCS5wcm0gICAgPSBUSTgxNlhfUFJDTV9CQVNFLAotCS5jbSAgICAgPSBUSTgxNlhfUFJDTV9CQVNFLAorCS5jdHJsICAgPSBPTUFQMl9MNF9JT19BRERSRVNTKFRJODE2WF9DVFJMX0JBU0UpLAorCS5wcm0gICAgPSBPTUFQMl9MNF9JT19BRERSRVNTKFRJODE2WF9QUkNNX0JBU0UpLAorCS5jbSAgICAgPSBPTUFQMl9MNF9JT19BRERSRVNTKFRJODE2WF9QUkNNX0JBU0UpLAogfTsKIAogdm9pZCBfX2luaXQgb21hcDJfc2V0X2dsb2JhbHNfdGk4MTZ4KHZvaWQpCkBAIC0xMjUsMTEgKzEzNCwxMSBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2dsb2JhbHMgb21hcDRfZ2xvYmFscyA9IHsKIAkuY2xhc3MJPSBPTUFQNDQzWF9DTEFTUywKIAkudGFwCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQNDQzWF9TQ01fQkFTRSksCi0JLmN0cmwJPSBPTUFQNDQzWF9TQ01fQkFTRSwKLQkuY3RybF9wYWQJPSBPTUFQNDQzWF9DVFJMX0JBU0UsCi0JLnBybQk9IE9NQVA0NDMwX1BSTV9CQVNFLAotCS5jbQk9IE9NQVA0NDMwX0NNX0JBU0UsCi0JLmNtMgk9IE9NQVA0NDMwX0NNMl9CQVNFLAorCS5jdHJsCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQNDQzWF9TQ01fQkFTRSksCisJLmN0cmxfcGFkCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQNDQzWF9DVFJMX0JBU0UpLAorCS5wcm0JPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDMwX1BSTV9CQVNFKSwKKwkuY20JPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDMwX0NNX0JBU0UpLAorCS5jbTIJPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDMwX0NNMl9CQVNFKSwKIH07CiAKIHZvaWQgX19pbml0IG9tYXAyX3NldF9nbG9iYWxzXzQ0M3godm9pZCkKQEAgLTEzOCw1ICsxNDcsMTAgQEAKIAlvbWFwMl9zZXRfZ2xvYmFsc19jb250cm9sKCZvbWFwNF9nbG9iYWxzKTsKIAlvbWFwMl9zZXRfZ2xvYmFsc19wcmNtKCZvbWFwNF9nbG9iYWxzKTsKIH0KKwordm9pZCBfX2luaXQgb21hcDRfbWFwX2lvKHZvaWQpCit7CisJb21hcDQ0eHhfbWFwX2NvbW1vbl9pbygpOworfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY29udHJvbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb250cm9sLmMKaW5kZXggYWFiODg0Zi4uZTM0ZDI3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb250cm9sLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb250cm9sLmMKQEAgLTE0OSwxNyArMTQ5LDExIEBACiAKIHZvaWQgX19pbml0IG9tYXAyX3NldF9nbG9iYWxzX2NvbnRyb2woc3RydWN0IG9tYXBfZ2xvYmFscyAqb21hcDJfZ2xvYmFscykKIHsKLQkvKiBTdGF0aWMgbWFwcGluZywgbmV2ZXIgcmVsZWFzZWQgKi8KLQlpZiAob21hcDJfZ2xvYmFscy0+Y3RybCkgewotCQlvbWFwMl9jdHJsX2Jhc2UgPSBpb3JlbWFwKG9tYXAyX2dsb2JhbHMtPmN0cmwsIFNaXzRLKTsKLQkJV0FSTl9PTighb21hcDJfY3RybF9iYXNlKTsKLQl9CisJaWYgKG9tYXAyX2dsb2JhbHMtPmN0cmwpCisJCW9tYXAyX2N0cmxfYmFzZSA9IG9tYXAyX2dsb2JhbHMtPmN0cmw7CiAKLQkvKiBTdGF0aWMgbWFwcGluZywgbmV2ZXIgcmVsZWFzZWQgKi8KLQlpZiAob21hcDJfZ2xvYmFscy0+Y3RybF9wYWQpIHsKLQkJb21hcDRfY3RybF9wYWRfYmFzZSA9IGlvcmVtYXAob21hcDJfZ2xvYmFscy0+Y3RybF9wYWQsIFNaXzRLKTsKLQkJV0FSTl9PTighb21hcDRfY3RybF9wYWRfYmFzZSk7Ci0JfQorCWlmIChvbWFwMl9nbG9iYWxzLT5jdHJsX3BhZCkKKwkJb21hcDRfY3RybF9wYWRfYmFzZSA9IG9tYXAyX2dsb2JhbHMtPmN0cmxfcGFkOwogfQogCiB2b2lkIF9faW9tZW0gKm9tYXBfY3RybF9iYXNlX2dldCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jcHVpZGxlMzR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jcHVpZGxlMzR4eC5jCmluZGV4IDRiZjZlNmUuLjFmZTM1YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY3B1aWRsZTM0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NwdWlkbGUzNHh4LmMKQEAgLTg4LDE3ICs4OCwyMSBAQAogLyoqCiAgKiBvbWFwM19lbnRlcl9pZGxlIC0gUHJvZ3JhbXMgT01BUDMgdG8gZW50ZXIgdGhlIHNwZWNpZmllZCBzdGF0ZQogICogQGRldjogY3B1aWRsZSBkZXZpY2UKLSAqIEBzdGF0ZTogVGhlIHRhcmdldCBzdGF0ZSB0byBiZSBwcm9ncmFtbWVkCisgKiBAZHJ2OiBjcHVpZGxlIGRyaXZlcgorICogQGluZGV4OiB0aGUgaW5kZXggb2Ygc3RhdGUgdG8gYmUgZW50ZXJlZAogICoKICAqIENhbGxlZCBmcm9tIHRoZSBDUFVpZGxlIGZyYW1ld29yayB0byBwcm9ncmFtIHRoZSBkZXZpY2UgdG8gdGhlCiAgKiBzcGVjaWZpZWQgdGFyZ2V0IHN0YXRlIHNlbGVjdGVkIGJ5IHRoZSBnb3Zlcm5vci4KICAqLwogc3RhdGljIGludCBvbWFwM19lbnRlcl9pZGxlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAotCQkJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKQorCQkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJCWludCBpbmRleCkKIHsKLQlzdHJ1Y3Qgb21hcDNfaWRsZV9zdGF0ZWRhdGEgKmN4ID0gY3B1aWRsZV9nZXRfc3RhdGVkYXRhKHN0YXRlKTsKKwlzdHJ1Y3Qgb21hcDNfaWRsZV9zdGF0ZWRhdGEgKmN4ID0KKwkJCWNwdWlkbGVfZ2V0X3N0YXRlZGF0YSgmZGV2LT5zdGF0ZXNfdXNhZ2VbaW5kZXhdKTsKIAlzdHJ1Y3QgdGltZXNwZWMgdHNfcHJlaWRsZSwgdHNfcG9zdGlkbGUsIHRzX2lkbGU7CiAJdTMyIG1wdV9zdGF0ZSA9IGN4LT5tcHVfc3RhdGUsIGNvcmVfc3RhdGUgPSBjeC0+Y29yZV9zdGF0ZTsKKwlpbnQgaWRsZV90aW1lOwogCiAJLyogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSB0b3RhbCB0aW1lIGluIGlkbGUgKi8KIAlnZXRuc3RpbWVvZmRheSgmdHNfcHJlaWRsZSk7CkBAIC0xMTMsNyArMTE3LDcgQEAKIAkJZ290byByZXR1cm5fc2xlZXBfdGltZTsKIAogCS8qIERlbnkgaWRsZSBmb3IgQzEgKi8KLQlpZiAoc3RhdGUgPT0gJmRldi0+c3RhdGVzWzBdKSB7CisJaWYgKGluZGV4ID09IDApIHsKIAkJcHdyZG1fZm9yX2VhY2hfY2xrZG0obXB1X3BkLCBfY3B1aWRsZV9kZW55X2lkbGUpOwogCQlwd3JkbV9mb3JfZWFjaF9jbGtkbShjb3JlX3BkLCBfY3B1aWRsZV9kZW55X2lkbGUpOwogCX0KQEAgLTEyMiw3ICsxMjYsNyBAQAogCW9tYXBfc3JhbV9pZGxlKCk7CiAKIAkvKiBSZS1hbGxvdyBpZGxlIGZvciBDMSAqLwotCWlmIChzdGF0ZSA9PSAmZGV2LT5zdGF0ZXNbMF0pIHsKKwlpZiAoaW5kZXggPT0gMCkgewogCQlwd3JkbV9mb3JfZWFjaF9jbGtkbShtcHVfcGQsIF9jcHVpZGxlX2FsbG93X2lkbGUpOwogCQlwd3JkbV9mb3JfZWFjaF9jbGtkbShjb3JlX3BkLCBfY3B1aWRsZV9hbGxvd19pZGxlKTsKIAl9CkBAIC0xMzQsMjggKzEzOCwzOCBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlsb2NhbF9maXFfZW5hYmxlKCk7CiAKLQlyZXR1cm4gdHNfaWRsZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQyArIHRzX2lkbGUudHZfc2VjICogVVNFQ19QRVJfU0VDOworCWlkbGVfdGltZSA9IHRzX2lkbGUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUMgKyB0c19pZGxlLnR2X3NlYyAqIFwKKwkJCQkJCQkJVVNFQ19QRVJfU0VDOworCisJLyogVXBkYXRlIGNwdWlkbGUgY291bnRlcnMgKi8KKwlkZXYtPmxhc3RfcmVzaWRlbmN5ID0gaWRsZV90aW1lOworCisJcmV0dXJuIGluZGV4OwogfQogCiAvKioKICAqIG5leHRfdmFsaWRfc3RhdGUgLSBGaW5kIG5leHQgdmFsaWQgQy1zdGF0ZQogICogQGRldjogY3B1aWRsZSBkZXZpY2UKLSAqIEBzdGF0ZTogQ3VycmVudGx5IHNlbGVjdGVkIEMtc3RhdGUKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyCisgKiBAaW5kZXg6IEluZGV4IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBjLXN0YXRlCiAgKgotICogSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgdmFsaWQsIGl0IGlzIHJldHVybmVkIGJhY2sgdG8gdGhlIGNhbGxlci4KLSAqIEVsc2UsIHRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGEgbG93ZXIgYy1zdGF0ZSB3aGljaCBpcyBzdGlsbAotICogdmFsaWQuCisgKiBJZiB0aGUgc3RhdGUgY29ycmVzcG9uZGluZyB0byBpbmRleCBpcyB2YWxpZCwgaW5kZXggaXMgcmV0dXJuZWQgYmFjaworICogdG8gdGhlIGNhbGxlci4gRWxzZSwgdGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYSBsb3dlciBjLXN0YXRlIHdoaWNoIGlzCisgKiBzdGlsbCB2YWxpZCAoYXMgZGVmaW5lZCBpbiBvbWFwM19wb3dlcl9zdGF0ZXNbXSkgYW5kIHJldHVybnMgaXRzIGluZGV4LgogICoKICAqIEEgc3RhdGUgaXMgdmFsaWQgaWYgdGhlICd2YWxpZCcgZmllbGQgaXMgZW5hYmxlZCBhbmQKICAqIGlmIGl0IHNhdGlzZmllcyB0aGUgZW5hYmxlX29mZl9tb2RlIGNvbmRpdGlvbi4KICAqLwotc3RhdGljIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpuZXh0X3ZhbGlkX3N0YXRlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqY3VycikKK3N0YXRpYyBpbnQgbmV4dF92YWxpZF9zdGF0ZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJCWludCBpbmRleCkKIHsKLQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqbmV4dCA9IE5VTEw7Ci0Jc3RydWN0IG9tYXAzX2lkbGVfc3RhdGVkYXRhICpjeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShjdXJyKTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqY3Vycl91c2FnZSA9ICZkZXYtPnN0YXRlc191c2FnZVtpbmRleF07CisJc3RydWN0IGNwdWlkbGVfc3RhdGUgKmN1cnIgPSAmZHJ2LT5zdGF0ZXNbaW5kZXhdOworCXN0cnVjdCBvbWFwM19pZGxlX3N0YXRlZGF0YSAqY3ggPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoY3Vycl91c2FnZSk7CiAJdTMyIG1wdV9kZWVwZXN0X3N0YXRlID0gUFdSRE1fUE9XRVJfUkVUOwogCXUzMiBjb3JlX2RlZXBlc3Rfc3RhdGUgPSBQV1JETV9QT1dFUl9SRVQ7CisJaW50IG5leHRfaW5kZXggPSAtMTsKIAogCWlmIChlbmFibGVfb2ZmX21vZGUpIHsKIAkJbXB1X2RlZXBlc3Rfc3RhdGUgPSBQV1JETV9QT1dFUl9PRkY7CkBAIC0xNzIsMjAgKzE4NiwyMCBAQAogCWlmICgoY3gtPnZhbGlkKSAmJgogCSAgICAoY3gtPm1wdV9zdGF0ZSA+PSBtcHVfZGVlcGVzdF9zdGF0ZSkgJiYKIAkgICAgKGN4LT5jb3JlX3N0YXRlID49IGNvcmVfZGVlcGVzdF9zdGF0ZSkpIHsKLQkJcmV0dXJuIGN1cnI7CisJCXJldHVybiBpbmRleDsKIAl9IGVsc2UgewogCQlpbnQgaWR4ID0gT01BUDNfTlVNX1NUQVRFUyAtIDE7CiAKIAkJLyogUmVhY2ggdGhlIGN1cnJlbnQgc3RhdGUgc3RhcnRpbmcgYXQgaGlnaGVzdCBDLXN0YXRlICovCiAJCWZvciAoOyBpZHggPj0gMDsgaWR4LS0pIHsKLQkJCWlmICgmZGV2LT5zdGF0ZXNbaWR4XSA9PSBjdXJyKSB7Ci0JCQkJbmV4dCA9ICZkZXYtPnN0YXRlc1tpZHhdOworCQkJaWYgKCZkcnYtPnN0YXRlc1tpZHhdID09IGN1cnIpIHsKKwkJCQluZXh0X2luZGV4ID0gaWR4OwogCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKIAkJLyogU2hvdWxkIG5ldmVyIGhpdCB0aGlzIGNvbmRpdGlvbiAqLwotCQlXQVJOX09OKG5leHQgPT0gTlVMTCk7CisJCVdBUk5fT04obmV4dF9pbmRleCA9PSAtMSk7CiAKIAkJLyoKIAkJICogRHJvcCB0byBuZXh0IHZhbGlkIHN0YXRlLgpAQCAtMTkzLDQxICsyMDcsNDQgQEAKIAkJICovCiAJCWlkeC0tOwogCQlmb3IgKDsgaWR4ID49IDA7IGlkeC0tKSB7Ci0JCQljeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YSgmZGV2LT5zdGF0ZXNbaWR4XSk7CisJCQljeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YSgmZGV2LT5zdGF0ZXNfdXNhZ2VbaWR4XSk7CiAJCQlpZiAoKGN4LT52YWxpZCkgJiYKIAkJCSAgICAoY3gtPm1wdV9zdGF0ZSA+PSBtcHVfZGVlcGVzdF9zdGF0ZSkgJiYKIAkJCSAgICAoY3gtPmNvcmVfc3RhdGUgPj0gY29yZV9kZWVwZXN0X3N0YXRlKSkgewotCQkJCW5leHQgPSAmZGV2LT5zdGF0ZXNbaWR4XTsKKwkJCQluZXh0X2luZGV4ID0gaWR4OwogCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJCS8qCiAJCSAqIEMxIGlzIGFsd2F5cyB2YWxpZC4KLQkJICogU28sIG5vIG5lZWQgdG8gY2hlY2sgZm9yICduZXh0PT1OVUxMJyBvdXRzaWRlIHRoaXMgbG9vcC4KKwkJICogU28sIG5vIG5lZWQgdG8gY2hlY2sgZm9yICduZXh0X2luZGV4ID09IC0xJyBvdXRzaWRlCisJCSAqIHRoaXMgbG9vcC4KIAkJICovCiAJfQogCi0JcmV0dXJuIG5leHQ7CisJcmV0dXJuIG5leHRfaW5kZXg7CiB9CiAKIC8qKgogICogb21hcDNfZW50ZXJfaWRsZV9ibSAtIENoZWNrcyBmb3IgYW55IGJ1cyBhY3Rpdml0eQogICogQGRldjogY3B1aWRsZSBkZXZpY2UKLSAqIEBzdGF0ZTogVGhlIHRhcmdldCBzdGF0ZSB0byBiZSBwcm9ncmFtbWVkCisgKiBAZHJ2OiBjcHVpZGxlIGRyaXZlcgorICogQGluZGV4OiBhcnJheSBpbmRleCBvZiB0YXJnZXQgc3RhdGUgdG8gYmUgcHJvZ3JhbW1lZAogICoKICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciBhbnkgcGVuZGluZyBhY3Rpdml0eSBhbmQgdGhlbiBwcm9ncmFtcwogICogdGhlIGRldmljZSB0byB0aGUgc3BlY2lmaWVkIG9yIGEgc2FmZXIgc3RhdGUuCiAgKi8KIHN0YXRpYyBpbnQgb21hcDNfZW50ZXJfaWRsZV9ibShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCisJCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkgICAgICAgaW50IGluZGV4KQogewotCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpuZXdfc3RhdGU7CisJaW50IG5ld19zdGF0ZV9pZHg7CiAJdTMyIGNvcmVfbmV4dF9zdGF0ZSwgcGVyX25leHRfc3RhdGUgPSAwLCBwZXJfc2F2ZWRfc3RhdGUgPSAwLCBjYW1fc3RhdGU7CiAJc3RydWN0IG9tYXAzX2lkbGVfc3RhdGVkYXRhICpjeDsKIAlpbnQgcmV0OwogCiAJaWYgKCFvbWFwM19jYW5fc2xlZXAoKSkgewotCQluZXdfc3RhdGUgPSBkZXYtPnNhZmVfc3RhdGU7CisJCW5ld19zdGF0ZV9pZHggPSBkcnYtPnNhZmVfc3RhdGVfaW5kZXg7CiAJCWdvdG8gc2VsZWN0X3N0YXRlOwogCX0KIApAQCAtMjM3LDcgKzI1NCw3IEBACiAJICovCiAJY2FtX3N0YXRlID0gcHdyZG1fcmVhZF9wd3JzdChjYW1fcGQpOwogCWlmIChjYW1fc3RhdGUgPT0gUFdSRE1fUE9XRVJfT04pIHsKLQkJbmV3X3N0YXRlID0gZGV2LT5zYWZlX3N0YXRlOworCQluZXdfc3RhdGVfaWR4ID0gZHJ2LT5zYWZlX3N0YXRlX2luZGV4OwogCQlnb3RvIHNlbGVjdF9zdGF0ZTsKIAl9CiAKQEAgLTI1Myw3ICsyNzAsNyBAQAogCSAqIFByZXZlbnQgUEVSIG9mZiBpZiBDT1JFIGlzIG5vdCBpbiByZXRlbnRpb24gb3Igb2ZmIGFzIHRoaXMKIAkgKiB3b3VsZCBkaXNhYmxlIFBFUiB3YWtldXBzIGNvbXBsZXRlbHkuCiAJICovCi0JY3ggPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RhdGUpOworCWN4ID0gY3B1aWRsZV9nZXRfc3RhdGVkYXRhKCZkZXYtPnN0YXRlc191c2FnZVtpbmRleF0pOwogCWNvcmVfbmV4dF9zdGF0ZSA9IGN4LT5jb3JlX3N0YXRlOwogCXBlcl9uZXh0X3N0YXRlID0gcGVyX3NhdmVkX3N0YXRlID0gcHdyZG1fcmVhZF9uZXh0X3B3cnN0KHBlcl9wZCk7CiAJaWYgKChwZXJfbmV4dF9zdGF0ZSA9PSBQV1JETV9QT1dFUl9PRkYpICYmCkBAIC0yNjQsMTEgKzI4MSwxMCBAQAogCWlmIChwZXJfbmV4dF9zdGF0ZSAhPSBwZXJfc2F2ZWRfc3RhdGUpCiAJCXB3cmRtX3NldF9uZXh0X3B3cnN0KHBlcl9wZCwgcGVyX25leHRfc3RhdGUpOwogCi0JbmV3X3N0YXRlID0gbmV4dF92YWxpZF9zdGF0ZShkZXYsIHN0YXRlKTsKKwluZXdfc3RhdGVfaWR4ID0gbmV4dF92YWxpZF9zdGF0ZShkZXYsIGRydiwgaW5kZXgpOwogCiBzZWxlY3Rfc3RhdGU6Ci0JZGV2LT5sYXN0X3N0YXRlID0gbmV3X3N0YXRlOwotCXJldCA9IG9tYXAzX2VudGVyX2lkbGUoZGV2LCBuZXdfc3RhdGUpOworCXJldCA9IG9tYXAzX2VudGVyX2lkbGUoZGV2LCBkcnYsIG5ld19zdGF0ZV9pZHgpOwogCiAJLyogUmVzdG9yZSBvcmlnaW5hbCBQRVIgc3RhdGUgaWYgaXQgd2FzIG1vZGlmaWVkICovCiAJaWYgKHBlcl9uZXh0X3N0YXRlICE9IHBlcl9zYXZlZF9zdGF0ZSkKQEAgLTMwMSwyMiArMzE3LDMxIEBACiAJLm93bmVyID0gCVRISVNfTU9EVUxFLAogfTsKIAotLyogSGVscGVyIHRvIGZpbGwgdGhlIEMtc3RhdGUgY29tbW9uIGRhdGEgYW5kIHJlZ2lzdGVyIHRoZSBkcml2ZXJfZGF0YSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgb21hcDNfaWRsZV9zdGF0ZWRhdGEgKl9maWxsX2NzdGF0ZSgKLQkJCQkJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCisvKiBIZWxwZXIgdG8gZmlsbCB0aGUgQy1zdGF0ZSBjb21tb24gZGF0YSovCitzdGF0aWMgaW5saW5lIHZvaWQgX2ZpbGxfY3N0YXRlKHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAogCQkJCQlpbnQgaWR4LCBjb25zdCBjaGFyICpkZXNjcikKIHsKLQlzdHJ1Y3Qgb21hcDNfaWRsZV9zdGF0ZWRhdGEgKmN4ID0gJm9tYXAzX2lkbGVfZGF0YVtpZHhdOwotCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSA9ICZkZXYtPnN0YXRlc1tpZHhdOworCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSA9ICZkcnYtPnN0YXRlc1tpZHhdOwogCiAJc3RhdGUtPmV4aXRfbGF0ZW5jeQk9IGNwdWlkbGVfcGFyYW1zX3RhYmxlW2lkeF0uZXhpdF9sYXRlbmN5OwogCXN0YXRlLT50YXJnZXRfcmVzaWRlbmN5CT0gY3B1aWRsZV9wYXJhbXNfdGFibGVbaWR4XS50YXJnZXRfcmVzaWRlbmN5OwogCXN0YXRlLT5mbGFncwkJPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKIAlzdGF0ZS0+ZW50ZXIJCT0gb21hcDNfZW50ZXJfaWRsZV9ibTsKLQljeC0+dmFsaWQJCT0gY3B1aWRsZV9wYXJhbXNfdGFibGVbaWR4XS52YWxpZDsKIAlzcHJpbnRmKHN0YXRlLT5uYW1lLCAiQyVkIiwgaWR4ICsgMSk7CiAJc3RybmNweShzdGF0ZS0+ZGVzYywgZGVzY3IsIENQVUlETEVfREVTQ19MRU4pOwotCWNwdWlkbGVfc2V0X3N0YXRlZGF0YShzdGF0ZSwgY3gpOworCit9CisKKy8qIEhlbHBlciB0byByZWdpc3RlciB0aGUgZHJpdmVyX2RhdGEgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9tYXAzX2lkbGVfc3RhdGVkYXRhICpfZmlsbF9jc3RhdGVfdXNhZ2UoCisJCQkJCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaWR4KQoreworCXN0cnVjdCBvbWFwM19pZGxlX3N0YXRlZGF0YSAqY3ggPSAmb21hcDNfaWRsZV9kYXRhW2lkeF07CisJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKnN0YXRlX3VzYWdlID0gJmRldi0+c3RhdGVzX3VzYWdlW2lkeF07CisKKwljeC0+dmFsaWQJCT0gY3B1aWRsZV9wYXJhbXNfdGFibGVbaWR4XS52YWxpZDsKKwljcHVpZGxlX3NldF9zdGF0ZWRhdGEoc3RhdGVfdXNhZ2UsIGN4KTsKIAogCXJldHVybiBjeDsKIH0KQEAgLTMzMCw2ICszNTUsNyBAQAogaW50IF9faW5pdCBvbWFwM19pZGxlX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiA9ICZvbWFwM19pZGxlX2RyaXZlcjsKIAlzdHJ1Y3Qgb21hcDNfaWRsZV9zdGF0ZWRhdGEgKmN4OwogCiAJbXB1X3BkID0gcHdyZG1fbG9va3VwKCJtcHVfcHdyZG0iKTsKQEAgLTMzNyw0NCArMzYzLDUyIEBACiAJcGVyX3BkID0gcHdyZG1fbG9va3VwKCJwZXJfcHdyZG0iKTsKIAljYW1fcGQgPSBwd3JkbV9sb29rdXAoImNhbV9wd3JkbSIpOwogCi0JY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJm9tYXAzX2lkbGVfZHJpdmVyKTsKKworCWRydi0+c2FmZV9zdGF0ZV9pbmRleCA9IC0xOwogCWRldiA9ICZwZXJfY3B1KG9tYXAzX2lkbGVfZGV2LCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCiAJLyogQzEgLiBNUFUgV0ZJICsgQ29yZSBhY3RpdmUgKi8KLQljeCA9IF9maWxsX2NzdGF0ZShkZXYsIDAsICJNUFUgT04gKyBDT1JFIE9OIik7Ci0JKCZkZXYtPnN0YXRlc1swXSktPmVudGVyID0gb21hcDNfZW50ZXJfaWRsZTsKLQlkZXYtPnNhZmVfc3RhdGUgPSAmZGV2LT5zdGF0ZXNbMF07CisJX2ZpbGxfY3N0YXRlKGRydiwgMCwgIk1QVSBPTiArIENPUkUgT04iKTsKKwkoJmRydi0+c3RhdGVzWzBdKS0+ZW50ZXIgPSBvbWFwM19lbnRlcl9pZGxlOworCWRydi0+c2FmZV9zdGF0ZV9pbmRleCA9IDA7CisJY3ggPSBfZmlsbF9jc3RhdGVfdXNhZ2UoZGV2LCAwKTsKIAljeC0+dmFsaWQgPSAxOwkvKiBDMSBpcyBhbHdheXMgdmFsaWQgKi8KIAljeC0+bXB1X3N0YXRlID0gUFdSRE1fUE9XRVJfT047CiAJY3gtPmNvcmVfc3RhdGUgPSBQV1JETV9QT1dFUl9PTjsKIAogCS8qIEMyIC4gTVBVIFdGSSArIENvcmUgaW5hY3RpdmUgKi8KLQljeCA9IF9maWxsX2NzdGF0ZShkZXYsIDEsICJNUFUgT04gKyBDT1JFIE9OIik7CisJX2ZpbGxfY3N0YXRlKGRydiwgMSwgIk1QVSBPTiArIENPUkUgT04iKTsKKwljeCA9IF9maWxsX2NzdGF0ZV91c2FnZShkZXYsIDEpOwogCWN4LT5tcHVfc3RhdGUgPSBQV1JETV9QT1dFUl9PTjsKIAljeC0+Y29yZV9zdGF0ZSA9IFBXUkRNX1BPV0VSX09OOwogCiAJLyogQzMgLiBNUFUgQ1NXUiArIENvcmUgaW5hY3RpdmUgKi8KLQljeCA9IF9maWxsX2NzdGF0ZShkZXYsIDIsICJNUFUgUkVUICsgQ09SRSBPTiIpOworCV9maWxsX2NzdGF0ZShkcnYsIDIsICJNUFUgUkVUICsgQ09SRSBPTiIpOworCWN4ID0gX2ZpbGxfY3N0YXRlX3VzYWdlKGRldiwgMik7CiAJY3gtPm1wdV9zdGF0ZSA9IFBXUkRNX1BPV0VSX1JFVDsKIAljeC0+Y29yZV9zdGF0ZSA9IFBXUkRNX1BPV0VSX09OOwogCiAJLyogQzQgLiBNUFUgT0ZGICsgQ29yZSBpbmFjdGl2ZSAqLwotCWN4ID0gX2ZpbGxfY3N0YXRlKGRldiwgMywgIk1QVSBPRkYgKyBDT1JFIE9OIik7CisJX2ZpbGxfY3N0YXRlKGRydiwgMywgIk1QVSBPRkYgKyBDT1JFIE9OIik7CisJY3ggPSBfZmlsbF9jc3RhdGVfdXNhZ2UoZGV2LCAzKTsKIAljeC0+bXB1X3N0YXRlID0gUFdSRE1fUE9XRVJfT0ZGOwogCWN4LT5jb3JlX3N0YXRlID0gUFdSRE1fUE9XRVJfT047CiAKIAkvKiBDNSAuIE1QVSBSRVQgKyBDb3JlIFJFVCAqLwotCWN4ID0gX2ZpbGxfY3N0YXRlKGRldiwgNCwgIk1QVSBSRVQgKyBDT1JFIFJFVCIpOworCV9maWxsX2NzdGF0ZShkcnYsIDQsICJNUFUgUkVUICsgQ09SRSBSRVQiKTsKKwljeCA9IF9maWxsX2NzdGF0ZV91c2FnZShkZXYsIDQpOwogCWN4LT5tcHVfc3RhdGUgPSBQV1JETV9QT1dFUl9SRVQ7CiAJY3gtPmNvcmVfc3RhdGUgPSBQV1JETV9QT1dFUl9SRVQ7CiAKIAkvKiBDNiAuIE1QVSBPRkYgKyBDb3JlIFJFVCAqLwotCWN4ID0gX2ZpbGxfY3N0YXRlKGRldiwgNSwgIk1QVSBPRkYgKyBDT1JFIFJFVCIpOworCV9maWxsX2NzdGF0ZShkcnYsIDUsICJNUFUgT0ZGICsgQ09SRSBSRVQiKTsKKwljeCA9IF9maWxsX2NzdGF0ZV91c2FnZShkZXYsIDUpOwogCWN4LT5tcHVfc3RhdGUgPSBQV1JETV9QT1dFUl9PRkY7CiAJY3gtPmNvcmVfc3RhdGUgPSBQV1JETV9QT1dFUl9SRVQ7CiAKIAkvKiBDNyAuIE1QVSBPRkYgKyBDb3JlIE9GRiAqLwotCWN4ID0gX2ZpbGxfY3N0YXRlKGRldiwgNiwgIk1QVSBPRkYgKyBDT1JFIE9GRiIpOworCV9maWxsX2NzdGF0ZShkcnYsIDYsICJNUFUgT0ZGICsgQ09SRSBPRkYiKTsKKwljeCA9IF9maWxsX2NzdGF0ZV91c2FnZShkZXYsIDYpOwogCS8qCiAJICogRXJyYXR1bSBpNTgzOiBpbXBsZW1lbnRhdGlvbiBmb3IgRVMgcmV2IDwgRXMxLjIgb24gMzYzMC4gV2UgY2Fubm90CiAJICogZW5hYmxlIE9GRiBtb2RlIGluIGEgc3RhYmxlIGZvcm0gZm9yIHByZXZpb3VzIHJldmlzaW9ucy4KQEAgLTM4OCw2ICs0MjIsOSBAQAogCWN4LT5tcHVfc3RhdGUgPSBQV1JETV9QT1dFUl9PRkY7CiAJY3gtPmNvcmVfc3RhdGUgPSBQV1JETV9QT1dFUl9PRkY7CiAKKwlkcnYtPnN0YXRlX2NvdW50ID0gT01BUDNfTlVNX1NUQVRFUzsKKwljcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigmb21hcDNfaWRsZV9kcml2ZXIpOworCiAJZGV2LT5zdGF0ZV9jb3VudCA9IE9NQVAzX05VTV9TVEFURVM7CiAJaWYgKGNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKGRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogQ1BVaWRsZSByZWdpc3RlciBkZXZpY2UgZmFpbGVkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYwppbmRleCAxMDc3YWQ2Li5jMTVjZmFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYwpAQCAtOCw3ICs4LDcgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgpAQCAtMjYsNyArMjcsNiBAQAogI2luY2x1ZGUgPHBsYXQvdGMuaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9tY2JzcC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbW1jLmg+CiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KICNpbmNsdWRlIDxwbGF0L29tYXBfaHdtb2QuaD4KQEAgLTQ0LDcgKzQ0LDcgQEAKIHsKIAlpbnQgbDsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCWNoYXIgb2hfbmFtZVtMM19NT0RVTEVTX01BWF9MRU5dOwogCiAJLyoKQEAgLTYxLDEyICs2MSwxMiBAQAogCWlmICghb2gpCiAJCXByX2VycigiY291bGQgbm90IGxvb2sgdXAgJXNcbiIsIG9oX25hbWUpOwogCi0Jb2QgPSBvbWFwX2RldmljZV9idWlsZCgib21hcF9sM19zbXgiLCAwLCBvaCwgTlVMTCwgMCwKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQoIm9tYXBfbDNfc214IiwgMCwgb2gsIE5VTEwsIDAsCiAJCQkJCQkJICAgTlVMTCwgMCwgMCk7CiAKLQlXQVJOKElTX0VSUihvZCksICJjb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzXG4iLCBvaF9uYW1lKTsKKwlXQVJOKElTX0VSUihwZGV2KSwgImNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXNcbiIsIG9oX25hbWUpOwogCi0JcmV0dXJuIElTX0VSUihvZCkgPyBQVFJfRVJSKG9kKSA6IDA7CisJcmV0dXJuIElTX0VSUihwZGV2KSA/IFBUUl9FUlIocGRldikgOiAwOwogfQogcG9zdGNvcmVfaW5pdGNhbGwob21hcDNfbDNfaW5pdCk7CiAKQEAgLTc0LDkgKzc0LDEzIEBACiB7CiAJaW50IGwsIGk7CiAJc3RydWN0IG9tYXBfaHdtb2QgKm9oWzNdOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAljaGFyIG9oX25hbWVbTDNfTU9EVUxFU19NQVhfTEVOXTsKIAorCS8qIElmIGR0YiBpcyB0aGVyZSwgdGhlIGRldmljZXMgd2lsbCBiZSBjcmVhdGVkIGR5bmFtaWNhbGx5ICovCisJaWYgKG9mX2hhdmVfcG9wdWxhdGVkX2R0KCkpCisJCXJldHVybiAtRU5PREVWOworCiAJLyoKIAkgKiBUbyBhdm9pZCBjb2RlIHJ1bm5pbmcgb24gb3RoZXIgT01BUHMgaW4KIAkgKiBtdWx0aS1vbWFwIGJ1aWxkcwpAQCAtOTIsMTIgKzk2LDEyIEBACiAJCQlwcl9lcnIoImNvdWxkIG5vdCBsb29rIHVwICVzXG4iLCBvaF9uYW1lKTsKIAl9CiAKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkX3NzKCJvbWFwX2wzX25vYyIsIDAsIG9oLCAzLCBOVUxMLAorCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZF9zcygib21hcF9sM19ub2MiLCAwLCBvaCwgMywgTlVMTCwKIAkJCQkJCSAgICAgMCwgTlVMTCwgMCwgMCk7CiAKLQlXQVJOKElTX0VSUihvZCksICJjb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzXG4iLCBvaF9uYW1lKTsKKwlXQVJOKElTX0VSUihwZGV2KSwgImNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXNcbiIsIG9oX25hbWUpOwogCi0JcmV0dXJuIElTX0VSUihvZCkgPyBQVFJfRVJSKG9kKSA6IDA7CisJcmV0dXJuIElTX0VSUihwZGV2KSA/IFBUUl9FUlIocGRldikgOiAwOwogfQogcG9zdGNvcmVfaW5pdGNhbGwob21hcDRfbDNfaW5pdCk7CiAKQEAgLTIyMSwxOCArMjI1LDEwIEBACiAjZW5kaWYKIH0KIAotc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgb21hcF9rZXlib2FyZF9sYXRlbmN5W10gPSB7Ci0JewotCQkuZGVhY3RpdmF0ZV9mdW5jID0gb21hcF9kZXZpY2VfaWRsZV9od21vZHMsCi0JCS5hY3RpdmF0ZV9mdW5jICAgPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MgPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNULAotCX0sCi19OwotCiBpbnQgX19pbml0IG9tYXA0X2tleWJvYXJkX2luaXQoc3RydWN0IG9tYXA0X2tleXBhZF9wbGF0Zm9ybV9kYXRhCiAJCQkqc2RwNDQzMF9rZXlwYWRfZGF0YSwgc3RydWN0IG9tYXBfYm9hcmRfZGF0YSAqYmRhdGEpCiB7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXN0cnVjdCBvbWFwX2h3bW9kICpvaDsKIAlzdHJ1Y3Qgb21hcDRfa2V5cGFkX3BsYXRmb3JtX2RhdGEgKmtleXBhZF9kYXRhOwogCXVuc2lnbmVkIGludCBpZCA9IC0xOwpAQCAtMjQ3LDE1ICsyNDMsMTMgQEAKIAogCWtleXBhZF9kYXRhID0gc2RwNDQzMF9rZXlwYWRfZGF0YTsKIAotCW9kID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgaWQsIG9oLCBrZXlwYWRfZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgb21hcDRfa2V5cGFkX3BsYXRmb3JtX2RhdGEpLAotCQkJb21hcF9rZXlib2FyZF9sYXRlbmN5LAotCQkJQVJSQVlfU0laRShvbWFwX2tleWJvYXJkX2xhdGVuY3kpLCAwKTsKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgaWQsIG9oLCBrZXlwYWRfZGF0YSwKKwkJCXNpemVvZihzdHJ1Y3Qgb21hcDRfa2V5cGFkX3BsYXRmb3JtX2RhdGEpLCBOVUxMLCAwLCAwKTsKIAotCWlmIChJU19FUlIob2QpKSB7CisJaWYgKElTX0VSUihwZGV2KSkgewogCQlXQVJOKDEsICJDYW4ndCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXM6JXMuXG4iLAogCQkJCQkJbmFtZSwgb2gtPm5hbWUpOwotCQlyZXR1cm4gUFRSX0VSUihvZCk7CisJCXJldHVybiBQVFJfRVJSKHBkZXYpOwogCX0KIAlvaC0+bXV4ID0gb21hcF9od21vZF9tdXhfaW5pdChiZGF0YS0+cGFkcywgYmRhdGEtPnBhZHNfY250KTsKIApAQCAtMjYzLDE4ICsyNTcsMTAgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTUJPWF9GV0spIHx8IGRlZmluZWQoQ09ORklHX09NQVBfTUJPWF9GV0tfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG1ib3hfbGF0ZW5jaWVzW10gPSB7Ci0JWzBdID0gewotCQkuYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2VuYWJsZV9od21vZHMsCi0JCS5kZWFjdGl2YXRlX2Z1bmMgPSBvbWFwX2RldmljZV9pZGxlX2h3bW9kcywKLQkJLmZsYWdzID0gT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVCwKLQl9LAotfTsKLQogc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9tYm94KHZvaWQpCiB7CiAJc3RydWN0IG9tYXBfaHdtb2QgKm9oOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAogCW9oID0gb21hcF9od21vZF9sb29rdXAoIm1haWxib3giKTsKIAlpZiAoIW9oKSB7CkBAIC0yODIsMTAgKzI2OCw5IEBACiAJCXJldHVybjsKIAl9CiAKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKCJvbWFwLW1haWxib3giLCAtMSwgb2gsIE5VTEwsIDAsCi0JCQkJbWJveF9sYXRlbmNpZXMsIEFSUkFZX1NJWkUobWJveF9sYXRlbmNpZXMpLCAwKTsKLQlXQVJOKElTX0VSUihvZCksICIlczogY291bGQgbm90IGJ1aWxkIGRldmljZSwgZXJyICVsZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBQVFJfRVJSKG9kKSk7CisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKCJvbWFwLW1haWxib3giLCAtMSwgb2gsIE5VTEwsIDAsIE5VTEwsIDAsIDApOworCVdBUk4oSVNfRVJSKHBkZXYpLCAiJXM6IGNvdWxkIG5vdCBidWlsZCBkZXZpY2UsIGVyciAlbGRcbiIsCisJCQkJCQlfX2Z1bmNfXywgUFRSX0VSUihwZGV2KSk7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9tYm94KHZvaWQpIHsgfQpAQCAtMzMwLDIxICszMTUsMzQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfYXVkaW8odm9pZCkge30KICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX01DUERNKSB8fCBcCisJCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19NQ1BETV9NT0RVTEUpCisKK3N0YXRpYyB2b2lkIG9tYXBfaW5pdF9tY3BkbSh2b2lkKQoreworCXN0cnVjdCBvbWFwX2h3bW9kICpvaDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCisJb2ggPSBvbWFwX2h3bW9kX2xvb2t1cCgibWNwZG0iKTsKKwlpZiAoIW9oKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGxvb2sgdXAgbWNwZG0gaHdfbW9kXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZCgib21hcC1tY3BkbSIsIC0xLCBvaCwgTlVMTCwgMCwgTlVMTCwgMCwgMCk7CisJV0FSTihJU19FUlIocGRldiksICJDYW4ndCBidWlsZCBvbWFwX2RldmljZSBmb3Igb21hcC1tY3BkbS5cbiIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfbWNwZG0odm9pZCkge30KKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX09NQVAyNFhYKSB8fCBkZWZpbmVkKENPTkZJR19TUElfT01BUDI0WFhfTU9EVUxFKQogCiAjaW5jbHVkZSA8cGxhdC9tY3NwaS5oPgogCi1zdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX21jc3BpX2xhdGVuY3lbXSA9IHsKLQlbMF0gPSB7Ci0JCS5kZWFjdGl2YXRlX2Z1bmMgPSBvbWFwX2RldmljZV9pZGxlX2h3bW9kcywKLQkJLmFjdGl2YXRlX2Z1bmMgICA9IG9tYXBfZGV2aWNlX2VuYWJsZV9od21vZHMsCi0JCS5mbGFncwkJID0gT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVCwKLQl9LAotfTsKLQogc3RhdGljIGludCBvbWFwX21jc3BpX2luaXQoc3RydWN0IG9tYXBfaHdtb2QgKm9oLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCWNoYXIgKm5hbWUgPSAib21hcDJfbWNzcGkiOwogCXN0cnVjdCBvbWFwMl9tY3NwaV9wbGF0Zm9ybV9jb25maWcgKnBkYXRhOwogCXN0YXRpYyBpbnQgc3BpX251bTsKQEAgLTM3MSwxMCArMzY5LDkgQEAKIAl9CiAKIAlzcGlfbnVtKys7Ci0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBzcGlfbnVtLCBvaCwgcGRhdGEsCi0JCQkJc2l6ZW9mKCpwZGF0YSksCW9tYXBfbWNzcGlfbGF0ZW5jeSwKLQkJCQlBUlJBWV9TSVpFKG9tYXBfbWNzcGlfbGF0ZW5jeSksIDApOwotCVdBUk4oSVNfRVJSKG9kKSwgIkNhbid0IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczolc1xuIiwKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgc3BpX251bSwgb2gsIHBkYXRhLAorCQkJCXNpemVvZigqcGRhdGEpLAlOVUxMLCAwLCAwKTsKKwlXQVJOKElTX0VSUihwZGV2KSwgIkNhbid0IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczolc1xuIiwKIAkJCQluYW1lLCBvaC0+bmFtZSk7CiAJa2ZyZWUocGRhdGEpOwogCXJldHVybiAwOwpAQCAtNjgzLDYgKzY4MCw3IEBACiAJICogaW4gYWxwaGFiZXRpY2FsIG9yZGVyIHNvIHRoZXkncmUgZWFzaWVyIHRvIHNvcnQgdGhyb3VnaC4KIAkgKi8KIAlvbWFwX2luaXRfYXVkaW8oKTsKKwlvbWFwX2luaXRfbWNwZG0oKTsKIAlvbWFwX2luaXRfY2FtZXJhKCk7CiAJb21hcF9pbml0X21ib3goKTsKIAlvbWFwX2luaXRfbWNzcGkoKTsKQEAgLTY5OCwxOCArNjk2LDEwIEBACiBhcmNoX2luaXRjYWxsKG9tYXAyX2luaXRfZGV2aWNlcyk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX1dBVENIRE9HX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX3dkdF9sYXRlbmN5W10gPSB7Ci0JWzBdID0gewotCQkuZGVhY3RpdmF0ZV9mdW5jID0gb21hcF9kZXZpY2VfaWRsZV9od21vZHMsCi0JCS5hY3RpdmF0ZV9mdW5jICAgPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MJCSA9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IG9tYXBfaW5pdF93ZHQodm9pZCkKIHsKIAlpbnQgaWQgPSAtMTsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IG9tYXBfaHdtb2QgKm9oOwogCWNoYXIgKm9oX25hbWUgPSAid2RfdGltZXIyIjsKIAljaGFyICpkZXZfbmFtZSA9ICJvbWFwX3dkdCI7CkBAIC03MjMsMTAgKzcxMyw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW9kID0gb21hcF9kZXZpY2VfYnVpbGQoZGV2X25hbWUsIGlkLCBvaCwgTlVMTCwgMCwKLQkJCQlvbWFwX3dkdF9sYXRlbmN5LAotCQkJCUFSUkFZX1NJWkUob21hcF93ZHRfbGF0ZW5jeSksIDApOwotCVdBUk4oSVNfRVJSKG9kKSwgIkNhbid0IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczolcy5cbiIsCisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKGRldl9uYW1lLCBpZCwgb2gsIE5VTEwsIDAsIE5VTEwsIDAsIDApOworCVdBUk4oSVNfRVJSKHBkZXYpLCAiQ2FuJ3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiVzLlxuIiwKIAkJCQlkZXZfbmFtZSwgb2gtPm5hbWUpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kaXNwbGF5LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Rpc3BsYXkuYwppbmRleCBhNWI3YTIzLi5hZGIyNzU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Rpc3BsYXkuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Rpc3BsYXkuYwpAQCAtMTUsNiArMTUsNyBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjcsNiArMjgsOCBAQAogI2luY2x1ZGUgPHBsYXQvb21hcF9kZXZpY2UuaD4KICNpbmNsdWRlIDxwbGF0L29tYXAtcG0uaD4KIAorI2luY2x1ZGUgImNvbnRyb2wuaCIKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcF9kaXNwbGF5X2RldmljZSA9IHsKIAkubmFtZSAgICAgICAgICA9ICJvbWFwZHNzIiwKIAkuaWQgICAgICAgICAgICA9IC0xLApAQCAtMzUsMTQgKzM4LDYgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXBfZHNzX2xhdGVuY3lbXSA9IHsKLQlbMF0gPSB7Ci0JCS5kZWFjdGl2YXRlX2Z1bmMgICAgICAgID0gb21hcF9kZXZpY2VfaWRsZV9od21vZHMsCi0JCS5hY3RpdmF0ZV9mdW5jICAgICAgICAgID0gb21hcF9kZXZpY2VfZW5hYmxlX2h3bW9kcywKLQkJLmZsYWdzCQkJPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNULAotCX0sCi19OwotCiBzdHJ1Y3Qgb21hcF9kc3NfaHdtb2RfZGF0YSB7CiAJY29uc3QgY2hhciAqb2hfbmFtZTsKIAljb25zdCBjaGFyICpkZXZfbmFtZTsKQEAgLTYxLDcgKzU2LDcgQEAKIAl7ICJkc3NfZGlzcGMiLCAib21hcGRzc19kaXNwYyIsIC0xIH0sCiAJeyAiZHNzX3JmYmkiLCAib21hcGRzc19yZmJpIiwgLTEgfSwKIAl7ICJkc3NfdmVuYyIsICJvbWFwZHNzX3ZlbmMiLCAtMSB9LAotCXsgImRzc19kc2kxIiwgIm9tYXBkc3NfZHNpMSIsIC0xIH0sCisJeyAiZHNzX2RzaTEiLCAib21hcGRzc19kc2kiLCAwIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfZHNzX2h3bW9kX2RhdGEgb21hcDRfZHNzX2h3bW9kX2RhdGFbXSBfX2luaXRkYXRhID0gewpAQCAtNjksMTYgKzY0LDYzIEBACiAJeyAiZHNzX2Rpc3BjIiwgIm9tYXBkc3NfZGlzcGMiLCAtMSB9LAogCXsgImRzc19yZmJpIiwgIm9tYXBkc3NfcmZiaSIsIC0xIH0sCiAJeyAiZHNzX3ZlbmMiLCAib21hcGRzc192ZW5jIiwgLTEgfSwKLQl7ICJkc3NfZHNpMSIsICJvbWFwZHNzX2RzaTEiLCAtMSB9LAotCXsgImRzc19kc2kyIiwgIm9tYXBkc3NfZHNpMiIsIC0xIH0sCisJeyAiZHNzX2RzaTEiLCAib21hcGRzc19kc2kiLCAwIH0sCisJeyAiZHNzX2RzaTIiLCAib21hcGRzc19kc2kiLCAxIH0sCiAJeyAiZHNzX2hkbWkiLCAib21hcGRzc19oZG1pIiwgLTEgfSwKIH07CiAKK3N0YXRpYyBpbnQgb21hcDRfZHNpX211eF9wYWRzKGludCBkc2lfaWQsIHVuc2lnbmVkIGxhbmVzKQoreworCXUzMiBlbmFibGVfbWFzaywgZW5hYmxlX3NoaWZ0OworCXUzMiBwaXBkX21hc2ssIHBpcGRfc2hpZnQ7CisJdTMyIHJlZzsKKworCWlmIChkc2lfaWQgPT0gMCkgeworCQllbmFibGVfbWFzayA9IE9NQVA0X0RTSTFfTEFORUVOQUJMRV9NQVNLOworCQllbmFibGVfc2hpZnQgPSBPTUFQNF9EU0kxX0xBTkVFTkFCTEVfU0hJRlQ7CisJCXBpcGRfbWFzayA9IE9NQVA0X0RTSTFfUElQRF9NQVNLOworCQlwaXBkX3NoaWZ0ID0gT01BUDRfRFNJMV9QSVBEX1NISUZUOworCX0gZWxzZSBpZiAoZHNpX2lkID09IDEpIHsKKwkJZW5hYmxlX21hc2sgPSBPTUFQNF9EU0kyX0xBTkVFTkFCTEVfTUFTSzsKKwkJZW5hYmxlX3NoaWZ0ID0gT01BUDRfRFNJMl9MQU5FRU5BQkxFX1NISUZUOworCQlwaXBkX21hc2sgPSBPTUFQNF9EU0kyX1BJUERfTUFTSzsKKwkJcGlwZF9zaGlmdCA9IE9NQVA0X0RTSTJfUElQRF9TSElGVDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZWcgPSBvbWFwNF9jdHJsX3BhZF9yZWFkbChPTUFQNF9DVFJMX01PRFVMRV9QQURfQ09SRV9DT05UUk9MX0RTSVBIWSk7CisKKwlyZWcgJj0gfmVuYWJsZV9tYXNrOworCXJlZyAmPSB+cGlwZF9tYXNrOworCisJcmVnIHw9IChsYW5lcyA8PCBlbmFibGVfc2hpZnQpICYgZW5hYmxlX21hc2s7CisJcmVnIHw9IChsYW5lcyA8PCBwaXBkX3NoaWZ0KSAmIHBpcGRfbWFzazsKKworCW9tYXA0X2N0cmxfcGFkX3dyaXRlbChyZWcsIE9NQVA0X0NUUkxfTU9EVUxFX1BBRF9DT1JFX0NPTlRST0xfRFNJUEhZKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfZHNpX2VuYWJsZV9wYWRzKGludCBkc2lfaWQsIHVuc2lnbmVkIGxhbmVfbWFzaykKK3sKKwlpZiAoY3B1X2lzX29tYXA0NHh4KCkpCisJCXJldHVybiBvbWFwNF9kc2lfbXV4X3BhZHMoZHNpX2lkLCBsYW5lX21hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfZHNpX2Rpc2FibGVfcGFkcyhpbnQgZHNpX2lkLCB1bnNpZ25lZCBsYW5lX21hc2spCit7CisJaWYgKGNwdV9pc19vbWFwNDR4eCgpKQorCQlvbWFwNF9kc2lfbXV4X3BhZHMoZHNpX2lkLCAwKTsKK30KKwogaW50IF9faW5pdCBvbWFwX2Rpc3BsYXlfaW5pdChzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyAqYm9hcmRfZGF0YSkKIHsKIAlpbnQgciA9IDA7CiAJc3RydWN0IG9tYXBfaHdtb2QgKm9oOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlpbnQgaSwgb2hfY291bnQ7CiAJc3RydWN0IG9tYXBfZGlzcGxheV9wbGF0Zm9ybV9kYXRhIHBkYXRhOwogCWNvbnN0IHN0cnVjdCBvbWFwX2Rzc19od21vZF9kYXRhICpjdXJyX2Rzc19od21vZDsKQEAgLTk2LDYgKzEzOCwxMSBAQAogCQlvaF9jb3VudCA9IEFSUkFZX1NJWkUob21hcDRfZHNzX2h3bW9kX2RhdGEpOwogCX0KIAorCWlmIChib2FyZF9kYXRhLT5kc2lfZW5hYmxlX3BhZHMgPT0gTlVMTCkKKwkJYm9hcmRfZGF0YS0+ZHNpX2VuYWJsZV9wYWRzID0gb21hcF9kc2lfZW5hYmxlX3BhZHM7CisJaWYgKGJvYXJkX2RhdGEtPmRzaV9kaXNhYmxlX3BhZHMgPT0gTlVMTCkKKwkJYm9hcmRfZGF0YS0+ZHNpX2Rpc2FibGVfcGFkcyA9IG9tYXBfZHNpX2Rpc2FibGVfcGFkczsKKwogCXBkYXRhLmJvYXJkX2RhdGEgPSBib2FyZF9kYXRhOwogCXBkYXRhLmJvYXJkX2RhdGEtPmdldF9jb250ZXh0X2xvc3NfY291bnQgPQogCQlvbWFwX3BtX2dldF9kZXZfY29udGV4dF9sb3NzX2NvdW50OwpAQCAtMTA4LDEzICsxNTUsMTIgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKLQkJb2QgPSBvbWFwX2RldmljZV9idWlsZChjdXJyX2Rzc19od21vZFtpXS5kZXZfbmFtZSwKKwkJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKGN1cnJfZHNzX2h3bW9kW2ldLmRldl9uYW1lLAogCQkJCWN1cnJfZHNzX2h3bW9kW2ldLmlkLCBvaCwgJnBkYXRhLAogCQkJCXNpemVvZihzdHJ1Y3Qgb21hcF9kaXNwbGF5X3BsYXRmb3JtX2RhdGEpLAotCQkJCW9tYXBfZHNzX2xhdGVuY3ksCi0JCQkJQVJSQVlfU0laRShvbWFwX2Rzc19sYXRlbmN5KSwgMCk7CisJCQkJTlVMTCwgMCwgMCk7CiAKLQkJaWYgKFdBUk4oKElTX0VSUihvZCkpLCAiQ291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlc1xuIiwKKwkJaWYgKFdBUk4oKElTX0VSUihwZGV2KSksICJDb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzXG4iLAogCQkJCWN1cnJfZHNzX2h3bW9kW2ldLm9oX25hbWUpKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kbWEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZG1hLmMKaW5kZXggYzlmZjBlNy4uYTU5YTQ1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RtYS5jCkBAIC04NywxNCArODcsNiBAQAogCVtDQ0ROXQkJCT0gMHhkOCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwMl9kbWFfbGF0ZW5jeVtdID0gewotCXsKLQkJLmRlYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAotCQkuYWN0aXZhdGVfZnVuYwkgPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MJCSA9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLX07Ci0KIHN0YXRpYyB2b2lkIF9faW9tZW0gKmRtYV9iYXNlOwogc3RhdGljIGlubGluZSB2b2lkIGRtYV93cml0ZSh1MzIgdmFsLCBpbnQgcmVnLCBpbnQgbGNoKQogewpAQCAtMjI4LDcgKzIyMCw3IEBACiAvKiBPbmUgdGltZSBpbml0aWFsaXphdGlvbnMgKi8KIHN0YXRpYyBpbnQgX19pbml0IG9tYXAyX3N5c3RlbV9kbWFfaW5pdF9kZXYoc3RydWN0IG9tYXBfaHdtb2QgKm9oLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlCQkJKm9kOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCQkqcGRldjsKIAlzdHJ1Y3Qgb21hcF9zeXN0ZW1fZG1hX3BsYXRfaW5mbwkqcDsKIAlzdHJ1Y3QgcmVzb3VyY2UJCQkJKm1lbTsKIAljaGFyCQkJCQkqbmFtZSA9ICJvbWFwX2RtYV9zeXN0ZW0iOwpAQCAtMjU4LDIzICsyNTAsMjIgQEAKIAogCXAtPmVycmF0YQkJPSBjb25maWd1cmVfZG1hX2VycmF0YSgpOwogCi0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCAwLCBvaCwgcCwgc2l6ZW9mKCpwKSwKLQkJCW9tYXAyX2RtYV9sYXRlbmN5LCBBUlJBWV9TSVpFKG9tYXAyX2RtYV9sYXRlbmN5KSwgMCk7CisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIDAsIG9oLCBwLCBzaXplb2YoKnApLCBOVUxMLCAwLCAwKTsKIAlrZnJlZShwKTsKLQlpZiAoSVNfRVJSKG9kKSkgeworCWlmIChJU19FUlIocGRldikpIHsKIAkJcHJfZXJyKCIlczogQ2FuJ3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiVzLlxuIiwKIAkJCV9fZnVuY19fLCBuYW1lLCBvaC0+bmFtZSk7Ci0JCXJldHVybiBQVFJfRVJSKG9kKTsKKwkJcmV0dXJuIFBUUl9FUlIocGRldik7CiAJfQogCi0JbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKCZvZC0+cGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFtZW0pIHsKLQkJZGV2X2Vycigmb2QtPnBkZXYuZGV2LCAiJXM6IG5vIG1lbSByZXNvdXJjZVxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogbm8gbWVtIHJlc291cmNlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlkbWFfYmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKIAlpZiAoIWRtYV9iYXNlKSB7Ci0JCWRldl9lcnIoJm9kLT5wZGV2LmRldiwgIiVzOiBpb3JlbWFwIGZhaWxcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGlvcmVtYXAgZmFpbFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI4Myw3ICsyNzQsNyBAQAogCQkJCQkoZC0+bGNoX2NvdW50KSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWQtPmNoYW4pIHsKLQkJZGV2X2Vycigmb2QtPnBkZXYuZGV2LCAiJXM6IGt6YWxsb2MgZmFpbFxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczoga3phbGxvYyBmYWlsXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvZHBsbDN4eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZHBsbDN4eHguYwppbmRleCBmNzcwMjJiLi5mYzU2NzQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RwbGwzeHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcGxsM3h4eC5jCkBAIC0zOTAsNyArMzkwLDggQEAKIAkgKiBwcm9wYWdhdGluZz8KIAkgKi8KIAlpZiAoIXIpCi0JCWNsay0+cmF0ZSA9IG9tYXAyX2dldF9kcGxsX3JhdGUoY2xrKTsKKwkJY2xrLT5yYXRlID0gKGNsay0+cmVjYWxjKSA/IGNsay0+cmVjYWxjKGNsaykgOgorCQkJb21hcDJfZ2V0X2RwbGxfcmF0ZShjbGspOwogCiAJcmV0dXJuIHI7CiB9CkBAIC00MjQsNiArNDI1LDcgQEAKIGludCBvbWFwM19ub25jb3JlX2RwbGxfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJc3RydWN0IGNsayAqbmV3X3BhcmVudCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBod19yYXRlOwogCXUxNiBmcmVxc2VsID0gMDsKIAlzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKIAlpbnQgcmV0OwpAQCAtNDM1LDcgKzQzNyw4IEBACiAJaWYgKCFkZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAocmF0ZSA9PSBvbWFwMl9nZXRfZHBsbF9yYXRlKGNsaykpCisJaHdfcmF0ZSA9IChjbGstPnJlY2FsYykgPyBjbGstPnJlY2FsYyhjbGspIDogb21hcDJfZ2V0X2RwbGxfcmF0ZShjbGspOworCWlmIChyYXRlID09IGh3X3JhdGUpCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTQ1NSw3ICs0NTgsNyBAQAogCQkJbmV3X3BhcmVudCA9IGRkLT5jbGtfYnlwYXNzOwogCX0gZWxzZSB7CiAJCWlmIChkZC0+bGFzdF9yb3VuZGVkX3JhdGUgIT0gcmF0ZSkKLQkJCW9tYXAyX2RwbGxfcm91bmRfcmF0ZShjbGssIHJhdGUpOworCQkJcmF0ZSA9IGNsay0+cm91bmRfcmF0ZShjbGssIHJhdGUpOwogCiAJCWlmIChkZC0+bGFzdF9yb3VuZGVkX3JhdGUgPT0gMCkKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcGxsNDR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcGxsNDR4eC5jCmluZGV4IDRlNGRhNjEuLjljNmEyOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZHBsbDQ0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RwbGw0NHh4LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgImNsb2NrNDR4eC5oIgogI2luY2x1ZGUgImNtLXJlZ2JpdHMtNDR4eC5oIgogCiAvKiBTdXBwb3J0ZWQgb25seSBvbiBPTUFQNCAqLwpAQCAtODIsMyArODMsNzEgQEAKIAkuZGVueV9pZGxlCT0gb21hcDRfZHBsbG14X2RlbnlfZ2F0ZWN0cmwsCiB9OwogCisvKioKKyAqIG9tYXA0X2RwbGxfcmVnbTR4ZW5fcmVjYWxjIC0gY29tcHV0ZSBEUExMIHJhdGUsIGNvbnNpZGVyaW5nIFJFR000WEVOIGJpdAorICogQGNsazogc3RydWN0IGNsayAqIG9mIHRoZSBEUExMIHRvIGNvbXB1dGUgdGhlIHJhdGUgZm9yCisgKgorICogQ29tcHV0ZSB0aGUgb3V0cHV0IHJhdGUgZm9yIHRoZSBPTUFQNCBEUExMIHJlcHJlc2VudGVkIGJ5IEBjbGsuCisgKiBUYWtlcyB0aGUgUkVHTTRYRU4gYml0IGludG8gY29uc2lkZXJhdGlvbiwgd2hpY2ggaXMgbmVlZGVkIGZvciB0aGUKKyAqIE9NQVA0IEFCRSBEUExMLiAgUmV0dXJucyB0aGUgRFBMTCdzIG91dHB1dCByYXRlIChiZWZvcmUgTS1kaXZpZGVycykKKyAqIHVwb24gc3VjY2Vzcywgb3IgMCB1cG9uIGVycm9yLgorICovCit1bnNpZ25lZCBsb25nIG9tYXA0X2RwbGxfcmVnbTR4ZW5fcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1MzIgdjsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJc3RydWN0IGRwbGxfZGF0YSAqZGQ7CisKKwlpZiAoIWNsayB8fCAhY2xrLT5kcGxsX2RhdGEpCisJCXJldHVybiAwOworCisJZGQgPSBjbGstPmRwbGxfZGF0YTsKKworCXJhdGUgPSBvbWFwMl9nZXRfZHBsbF9yYXRlKGNsayk7CisKKwkvKiByZWdtNHhlbiBhZGRzIGEgbXVsdGlwbGllciBvZiA0IHRvIERQTEwgY2FsY3VsYXRpb25zICovCisJdiA9IF9fcmF3X3JlYWRsKGRkLT5jb250cm9sX3JlZyk7CisJaWYgKHYgJiBPTUFQNDQzMF9EUExMX1JFR000WEVOX01BU0spCisJCXJhdGUgKj0gT01BUDQ0MzBfUkVHTTRYRU5fTVVMVDsKKworCXJldHVybiByYXRlOworfQorCisvKioKKyAqIG9tYXA0X2RwbGxfcmVnbTR4ZW5fcm91bmRfcmF0ZSAtIHJvdW5kIERQTEwgcmF0ZSwgY29uc2lkZXJpbmcgUkVHTTRYRU4gYml0CisgKiBAY2xrOiBzdHJ1Y3QgY2xrICogb2YgdGhlIERQTEwgdG8gcm91bmQgYSByYXRlIGZvcgorICogQHRhcmdldF9yYXRlOiB0aGUgZGVzaXJlZCByYXRlIG9mIHRoZSBEUExMCisgKgorICogQ29tcHV0ZSB0aGUgcmF0ZSB0aGF0IHdvdWxkIGJlIHByb2dyYW1tZWQgaW50byB0aGUgRFBMTCBoYXJkd2FyZQorICogZm9yIEBjbGsgaWYgc2V0X3JhdGUoKSB3ZXJlIHRvIGJlIHByb3ZpZGVkIHdpdGggdGhlIHJhdGUKKyAqIEB0YXJnZXRfcmF0ZS4gIFRha2VzIHRoZSBSRUdNNFhFTiBiaXQgaW50byBjb25zaWRlcmF0aW9uLCB3aGljaCBpcworICogbmVlZGVkIGZvciB0aGUgT01BUDQgQUJFIERQTEwuICBSZXR1cm5zIHRoZSByb3VuZGVkIHJhdGUgKGJlZm9yZQorICogTS1kaXZpZGVycykgdXBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBjbGsgaXMgbnVsbCBvciBub3QgYSBEUExMLCBvcgorICogfjAgaWYgYW4gZXJyb3Igb2NjdXJyZWQgaW4gb21hcDJfZHBsbF9yb3VuZF9yYXRlKCkuCisgKi8KK2xvbmcgb21hcDRfZHBsbF9yZWdtNHhlbl9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyB0YXJnZXRfcmF0ZSkKK3sKKwl1MzIgdjsKKwlzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKKwlsb25nIHI7CisKKwlpZiAoIWNsayB8fCAhY2xrLT5kcGxsX2RhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJZGQgPSBjbGstPmRwbGxfZGF0YTsKKworCS8qIHJlZ200eGVuIGFkZHMgYSBtdWx0aXBsaWVyIG9mIDQgdG8gRFBMTCBjYWxjdWxhdGlvbnMgKi8KKwl2ID0gX19yYXdfcmVhZGwoZGQtPmNvbnRyb2xfcmVnKSAmIE9NQVA0NDMwX0RQTExfUkVHTTRYRU5fTUFTSzsKKworCWlmICh2KQorCQl0YXJnZXRfcmF0ZSA9IHRhcmdldF9yYXRlIC8gT01BUDQ0MzBfUkVHTTRYRU5fTVVMVDsKKworCXIgPSBvbWFwMl9kcGxsX3JvdW5kX3JhdGUoY2xrLCB0YXJnZXRfcmF0ZSk7CisJaWYgKHIgPT0gfjApCisJCXJldHVybiByOworCisJaWYgKHYpCisJCWNsay0+ZHBsbF9kYXRhLT5sYXN0X3JvdW5kZWRfcmF0ZSAqPSBPTUFQNDQzMF9SRUdNNFhFTl9NVUxUOworCisJcmV0dXJuIGNsay0+ZHBsbF9kYXRhLT5sYXN0X3JvdW5kZWRfcmF0ZTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvZHNwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RzcC5jCmluZGV4IDkxMWNkMmUuLjc0ZjE4ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZHNwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kc3AuYwpAQCAtMTgsNiArMTgsNyBAQAogICogb2YgdGhlIE9NQVAgUE0gY29yZSBjb2RlLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlICJjbTJ4eHhfM3h4eC5oIgogI2luY2x1ZGUgInBybTJ4eHhfM3h4eC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwaW8uYwppbmRleCAyNzY1Y2RjLi44Y2JmYmMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwaW8uYwpAQCAtMjQsMTcgKzI0LDkgQEAKICNpbmNsdWRlIDxwbGF0L29tYXBfaHdtb2QuaD4KICNpbmNsdWRlIDxwbGF0L29tYXBfZGV2aWNlLmg+CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX2dwaW9fbGF0ZW5jeVtdID0gewotCVswXSA9IHsKLQkJLmRlYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAotCQkuYWN0aXZhdGVfZnVuYyAgID0gb21hcF9kZXZpY2VfZW5hYmxlX2h3bW9kcywKLQkJLmZsYWdzCQkgPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNULAotCX0sCi19OwotCiBzdGF0aWMgaW50IG9tYXAyX2dwaW9fZGV2X2luaXQoc3RydWN0IG9tYXBfaHdtb2QgKm9oLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXN0cnVjdCBvbWFwX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IG9tYXBfZ3Bpb19kZXZfYXR0ciAqZGV2X2F0dHI7CiAJY2hhciAqbmFtZSA9ICJvbWFwX2dwaW8iOwpAQCAtMTA3LDE5ICs5OSwxNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIGlkIC0gMSwgb2gsIHBkYXRhLAotCQkJCXNpemVvZigqcGRhdGEpLAlvbWFwX2dwaW9fbGF0ZW5jeSwKLQkJCQlBUlJBWV9TSVpFKG9tYXBfZ3Bpb19sYXRlbmN5KSwKLQkJCQlmYWxzZSk7CisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIGlkIC0gMSwgb2gsIHBkYXRhLAorCQkJCXNpemVvZigqcGRhdGEpLAlOVUxMLCAwLCBmYWxzZSk7CiAJa2ZyZWUocGRhdGEpOwogCi0JaWYgKElTX0VSUihvZCkpIHsKKwlpZiAoSVNfRVJSKHBkZXYpKSB7CiAJCVdBUk4oMSwgIkNhbid0IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczolcy5cbiIsCiAJCQkJCW5hbWUsIG9oLT5uYW1lKTsKLQkJcmV0dXJuIFBUUl9FUlIob2QpOworCQlyZXR1cm4gUFRSX0VSUihwZGV2KTsKIAl9CiAKLQlvbWFwX2RldmljZV9kaXNhYmxlX2lkbGVfb25fc3VzcGVuZChvZCk7CisJb21hcF9kZXZpY2VfZGlzYWJsZV9pZGxlX29uX3N1c3BlbmQocGRldik7CiAKIAlncGlvX2JhbmtfY291bnQrKzsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvZ3BtYy1vbmVuYW5kLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMtb25lbmFuZC5jCmluZGV4IGQ3NzZkZWQuLjVjZGNlMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZ3BtYy1vbmVuYW5kLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncG1jLW9uZW5hbmQuYwpAQCAtMTAsNiArMTAsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9vbmVuYW5kX3JlZ3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuYwppbmRleCAwOTdhNDJkLi5mNGExMDIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jCkBAIC0xMjksMTUgKzEyOSwxMSBAQAogCSAqIEFzc3VtZSB3ZSBwb3dlciBib3RoIE9NQVAgVk1NQzEgKGZvciBDTUQsIENMSywgREFUMC4uMykgYW5kIHRoZQogCSAqIGNhcmQgd2l0aCBWY2MgcmVndWxhdG9yIChmcm9tIHR3bDQwMzAgb3Igd2hhdGV2ZXIpLiAgT01BUCBoYXMgYm90aAogCSAqIDEuOFYgYW5kIDMuMFYgbW9kZXMsIGNvbnRyb2xsZWQgYnkgdGhlIFBCSUFTIHJlZ2lzdGVyLgotCSAqCi0JICogSW4gOC1iaXQgbW9kZXMsIE9NQVAgVk1NQzFBIChmb3IgREFUNC4uNykgbmVlZHMgYSBzdXBwbHksIHdoaWNoCi0JICogaXMgbW9zdCBuYXR1cmFsbHkgVFdMIFZTSU07IHRob3NlIHBpbnMgYWxzbyB1c2UgUEJJQVMuCi0JICoKLQkgKiBGSVhNRSBoYW5kbGUgVk1NQzFBIGFzIG5lZWRlZCAuLi4KIAkgKi8KIAlyZWcgPSBvbWFwNF9jdHJsX3BhZF9yZWFkbChjb250cm9sX3BiaWFzX29mZnNldCk7CiAJcmVnICY9IH4oT01BUDRfTU1DMV9QQklBU0xJVEVfUFdSRE5aX01BU0sgfAotCQlPTUFQNF9NTUMxX1BXUkROWl9NQVNLKTsKKwkJT01BUDRfTU1DMV9QV1JETlpfTUFTSyB8CisJCU9NQVA0X01NQzFfUEJJQVNMSVRFX1ZNT0RFX01BU0spOwogCW9tYXA0X2N0cmxfcGFkX3dyaXRlbChyZWcsIGNvbnRyb2xfcGJpYXNfb2Zmc2V0KTsKIH0KIApAQCAtMTcyLDEyICsxNjgsNiBAQAogCQkJcmVnICY9IH4oT01BUDRfTU1DMV9QV1JETlpfTUFTSyk7CiAJCQlvbWFwNF9jdHJsX3BhZF93cml0ZWwocmVnLCBjb250cm9sX3BiaWFzX29mZnNldCk7CiAJCX0KLQl9IGVsc2UgewotCQlyZWcgPSBvbWFwNF9jdHJsX3BhZF9yZWFkbChjb250cm9sX3BiaWFzX29mZnNldCk7Ci0JCXJlZyB8PSAoT01BUDRfTU1DMV9QQklBU0xJVEVfUFdSRE5aX01BU0sgfAotCQkJT01BUDRfTU1DMV9QV1JETlpfTUFTSyB8Ci0JCQlPTUFQNF9NTUMxX1BCSUFTTElURV9WTU9ERV9NQVNLKTsKLQkJb21hcDRfY3RybF9wYWRfd3JpdGVsKHJlZywgY29udHJvbF9wYmlhc19vZmZzZXQpOwogCX0KIH0KIApAQCAtNDA5LDMxICszOTksMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXBfaHNtbWNfbGF0ZW5jeVtdID0gewotCVswXSA9IHsKLQkJLmRlYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAotCQkuYWN0aXZhdGVfZnVuYwkgPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MJCSA9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLQkvKgotCSAqIFhYWCBUaGVyZSBzaG91bGQgYWxzbyBiZSBhbiBlbnRyeSBoZXJlIHRvIHBvd2VyIG9mZi9vbiB0aGUKLQkgKiBNTUMgcmVndWxhdG9ycy9QQklBUyBjZWxscywgZXRjLgotCSAqLwotfTsKLQogI2RlZmluZSBNQVhfT01BUF9NTUNfSFdNT0RfTkFNRV9MRU4JCTE2CiAKIHZvaWQgX19pbml0IG9tYXBfaW5pdF9oc21tYyhzdHJ1Y3Qgb21hcDJfaHNtbWNfaW5mbyAqaHNtbWNpbmZvLCBpbnQgY3RybF9ucikKIHsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSAqb2hsOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJY2hhciBvaF9uYW1lW01BWF9PTUFQX01NQ19IV01PRF9OQU1FX0xFTl07CiAJc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgKm1tY19kYXRhOwogCXN0cnVjdCBvbWFwX21tY19kZXZfYXR0ciAqbW1jX2Rldl9hdHRyOwogCWNoYXIgKm5hbWU7CiAJaW50IGw7Ci0JaW50IG9obF9jbnQgPSAwOwogCiAJbW1jX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghbW1jX2RhdGEpIHsKQEAgLTQ0OCw4ICs0MjQsNiBAQAogCW9tYXBfaHNtbWNfbXV4KG1tY19kYXRhLCAoY3RybF9uciAtIDEpKTsKIAogCW5hbWUgPSAib21hcF9oc21tYyI7Ci0Jb2hsID0gb21hcF9oc21tY19sYXRlbmN5OwotCW9obF9jbnQgPSBBUlJBWV9TSVpFKG9tYXBfaHNtbWNfbGF0ZW5jeSk7CiAKIAlsID0gc25wcmludGYob2hfbmFtZSwgTUFYX09NQVBfTU1DX0hXTU9EX05BTUVfTEVOLAogCQkgICAgICJtbWMlZCIsIGN0cmxfbnIpOwpAQCAtNDY3LDkgKzQ0MSw5IEBACiAJCW1tY19kYXRhLT5jb250cm9sbGVyX2ZsYWdzID0gbW1jX2Rldl9hdHRyLT5mbGFnczsKIAl9CiAKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIGN0cmxfbnIgLSAxLCBvaCwgbW1jX2RhdGEsCi0JCXNpemVvZihzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSksIG9obCwgb2hsX2NudCwgZmFsc2UpOwotCWlmIChJU19FUlIob2QpKSB7CisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIGN0cmxfbnIgLSAxLCBvaCwgbW1jX2RhdGEsCisJCXNpemVvZihzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSksIE5VTEwsIDAsIGZhbHNlKTsKKwlpZiAoSVNfRVJSKHBkZXYpKSB7CiAJCVdBUk4oMSwgIkNhbid0IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczolcy5cbiIsIG5hbWUsIG9oLT5uYW1lKTsKIAkJa2ZyZWUobW1jX2RhdGEtPnNsb3RzWzBdLm5hbWUpOwogCQlnb3RvIGRvbmU7CkBAIC00NzgsNyArNDUyLDcgQEAKIAkgKiByZXR1cm4gZGV2aWNlIGhhbmRsZSB0byBib2FyZCBzZXR1cCBjb2RlCiAJICogcmVxdWlyZWQgdG8gcG9wdWxhdGUgZm9yIHJlZ3VsYXRvciBmcmFtZXdvcmsgc3RydWN0dXJlCiAJICovCi0JaHNtbWNpbmZvLT5kZXYgPSAmb2QtPnBkZXYuZGV2OworCWhzbW1jaW5mby0+ZGV2ID0gJnBkZXYtPmRldjsKIAogZG9uZToKIAlrZnJlZShtbWNfZGF0YSk7CkBAIC01MDUsNyArNDc5LDcgQEAKIAkJCU9NQVA0X1NETU1DMV9QVVNUUkVOR1RIX0dSUDFfTUFTSyk7CiAJCXJlZyAmPSB+KE9NQVA0X1NETU1DMV9QVVNUUkVOR1RIX0dSUDJfTUFTSyB8CiAJCQlPTUFQNF9TRE1NQzFfUFVTVFJFTkdUSF9HUlAzX01BU0spOwotCQlyZWcgfD0gKE9NQVA0X1VTQkMxX0RSMF9TUEVFRENUUkxfTUFTS3wKKwkJcmVnIHw9IChPTUFQNF9TRE1NQzFfRFIwX1NQRUVEQ1RSTF9NQVNLIHwKIAkJCU9NQVA0X1NETU1DMV9EUjFfU1BFRURDVFJMX01BU0sgfAogCQkJT01BUDRfU0RNTUMxX0RSMl9TUEVFRENUUkxfTUFTSyk7CiAJCW9tYXA0X2N0cmxfcGFkX3dyaXRlbChyZWcsIGNvbnRyb2xfbW1jMSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2h3c3BpbmxvY2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaHdzcGlubG9jay5jCmluZGV4IDA2ZDRhODAuLjQ1NGRmY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHdzcGlubG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaHdzcGlubG9jay5jCkBAIC0xOSwyMyArMTksMjAgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaHdzcGlubG9jay5oPgogCiAjaW5jbHVkZSA8cGxhdC9vbWFwX2h3bW9kLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwX2RldmljZS5oPgogCi1zdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX3NwaW5sb2NrX2xhdGVuY3lbXSA9IHsKLQl7Ci0JCS5kZWFjdGl2YXRlX2Z1bmMgPSBvbWFwX2RldmljZV9pZGxlX2h3bW9kcywKLQkJLmFjdGl2YXRlX2Z1bmMgICA9IG9tYXBfZGV2aWNlX2VuYWJsZV9od21vZHMsCi0JCS5mbGFncyA9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfQorc3RhdGljIHN0cnVjdCBod3NwaW5sb2NrX3BkYXRhIG9tYXBfaHdzcGlubG9ja19wZGF0YSBfX2luaXRkYXRhID0geworCS5iYXNlX2lkID0gMCwKIH07CiAKIGludCBfX2luaXQgaHdzcGlubG9ja3NfaW5pdCh2b2lkKQogewogCWludCByZXR2YWwgPSAwOwogCXN0cnVjdCBvbWFwX2h3bW9kICpvaDsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJY29uc3QgY2hhciAqb2hfbmFtZSA9ICJzcGlubG9jayI7CiAJY29uc3QgY2hhciAqZGV2X25hbWUgPSAib21hcF9od3NwaW5sb2NrIjsKIApAQCAtNDgsMTMgKzQ1LDEzIEBACiAJaWYgKG9oID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChkZXZfbmFtZSwgMCwgb2gsIE5VTEwsIDAsCi0JCQkJb21hcF9zcGlubG9ja19sYXRlbmN5LAotCQkJCUFSUkFZX1NJWkUob21hcF9zcGlubG9ja19sYXRlbmN5KSwgZmFsc2UpOwotCWlmIChJU19FUlIob2QpKSB7CisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKGRldl9uYW1lLCAwLCBvaCwgJm9tYXBfaHdzcGlubG9ja19wZGF0YSwKKwkJCQlzaXplb2Yoc3RydWN0IGh3c3BpbmxvY2tfcGRhdGEpLAorCQkJCU5VTEwsIDAsIGZhbHNlKTsKKwlpZiAoSVNfRVJSKHBkZXYpKSB7CiAJCXByX2VycigiQ2FuJ3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiVzXG4iLCBkZXZfbmFtZSwKIAkJCQkJCQkJb2hfbmFtZSk7Ci0JCXJldHZhbCA9IFBUUl9FUlIob2QpOworCQlyZXR2YWwgPSBQVFJfRVJSKHBkZXYpOwogCX0KIAogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lkLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lkLmMKaW5kZXggMzdlZmI4Ni4uN2Y0NzA5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaWQuYwpAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSAiY29udHJvbC5oIgogCi1zdGF0aWMgc3RydWN0IG9tYXBfY2hpcF9pZCBvbWFwX2NoaXA7CiBzdGF0aWMgdW5zaWduZWQgaW50IG9tYXBfcmV2aXNpb247CiAKIHUzMiBvbWFwX2ZlYXR1cmVzOwpAQCAtMzksMTkgKzM4LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wob21hcF9yZXYpOwogCi0vKioKLSAqIG9tYXBfY2hpcF9pcyAtIHRlc3Qgd2hldGhlciBjdXJyZW50bHkgcnVubmluZyBPTUFQIG1hdGNoZXMgYSBjaGlwIHR5cGUKLSAqIEBvYzogb21hcF9jaGlwX3QgdG8gdGVzdCBhZ2FpbnN0Ci0gKgotICogVGVzdCB3aGV0aGVyIHRoZSBjdXJyZW50bHktcnVubmluZyBPTUFQIGNoaXAgbWF0Y2hlcyB0aGUgc3VwcGxpZWQKLSAqIGNoaXAgdHlwZSAnb2MnLiAgUmV0dXJucyAxIHVwb24gYSBtYXRjaDsgMCB1cG9uIGZhaWx1cmUuCi0gKi8KLWludCBvbWFwX2NoaXBfaXMoc3RydWN0IG9tYXBfY2hpcF9pZCBvY2kpCi17Ci0JcmV0dXJuIChvY2kub2MgJiBvbWFwX2NoaXAub2MpID8gMSA6IDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfY2hpcF9pcyk7Ci0KIGludCBvbWFwX3R5cGUodm9pZCkKIHsKIAl1MzIgdmFsID0gMDsKQEAgLTIwMSw4ICsxODcsMTEgQEAKIAlPTUFQM19DSEVDS19GRUFUVVJFKHN0YXR1cywgSVNQKTsKIAlpZiAoY3B1X2lzX29tYXAzNjMwKCkpCiAJCW9tYXBfZmVhdHVyZXMgfD0gT01BUDNfSEFTXzE5Mk1IWl9DTEs7Ci0JaWYgKCFjcHVfaXNfb21hcDM1MDUoKSAmJiAhY3B1X2lzX29tYXAzNTE3KCkpCisJaWYgKGNwdV9pc19vbWFwMzQzMCgpIHx8IGNwdV9pc19vbWFwMzYzMCgpKQogCQlvbWFwX2ZlYXR1cmVzIHw9IE9NQVAzX0hBU19JT19XQUtFVVA7CisJaWYgKGNwdV9pc19vbWFwMzYzMCgpIHx8IG9tYXBfcmV2KCkgPT0gT01BUDM0MzBfUkVWX0VTM18xIHx8CisJICAgIG9tYXBfcmV2KCkgPT0gT01BUDM0MzBfUkVWX0VTM18xXzIpCisJCW9tYXBfZmVhdHVyZXMgfD0gT01BUDNfSEFTX0lPX0NIQUlOX0NUUkw7CiAKIAlvbWFwX2ZlYXR1cmVzIHw9IE9NQVAzX0hBU19TRFJDOwogCkBAIC0yNDIsMTQgKzIzMSwxMiBAQAogCW9tYXBfZmVhdHVyZXMgPSBPTUFQM19IQVNfTkVPTjsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX2NoZWNrX3JldmlzaW9uKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfY2hlY2tfcmV2aXNpb24oY29uc3QgY2hhciAqKmNwdV9yZXYpCiB7CiAJdTMyIGNwdWlkLCBpZGNvZGU7CiAJdTE2IGhhd2tleWU7CiAJdTggcmV2OwogCi0Jb21hcF9jaGlwLm9jID0gQ0hJUF9JU19PTUFQMzQzMDsKLQogCS8qCiAJICogV2UgY2Fubm90IGFjY2VzcyByZXZpc2lvbiByZWdpc3RlcnMgb24gRVMxLjAuCiAJICogSWYgdGhlIHByb2Nlc3NvciB0eXBlIGlzIENvcnRleC1BOCBhbmQgdGhlIHJldmlzaW9uIGlzIDB4MApAQCAtMjU4LDcgKzI0NSw3IEBACiAJY3B1aWQgPSByZWFkX2NwdWlkKENQVUlEX0lEKTsKIAlpZiAoKCgoY3B1aWQgPj4gNCkgJiAweGZmZikgPT0gMHhjMDgpICYmICgoY3B1aWQgJiAweGYpID09IDB4MCkpIHsKIAkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNDMwX1JFVl9FUzFfMDsKLQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDM0MzBFUzE7CisJCSpjcHVfcmV2ID0gIjEuMCI7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI3OSw3NyArMjY2LDg1IEBACiAJCWNhc2UgMDogLyogVGFrZSBjYXJlIG9mIGVhcmx5IHNhbXBsZXMgKi8KIAkJY2FzZSAxOgogCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNDMwX1JFVl9FUzJfMDsKLQkJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAzNDMwRVMyOworCQkJKmNwdV9yZXYgPSAiMi4wIjsKIAkJCWJyZWFrOwogCQljYXNlIDI6CiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDM0MzBfUkVWX0VTMl8xOwotCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDM0MzBFUzI7CisJCQkqY3B1X3JldiA9ICIyLjEiOwogCQkJYnJlYWs7CiAJCWNhc2UgMzoKIAkJCW9tYXBfcmV2aXNpb24gPSBPTUFQMzQzMF9SRVZfRVMzXzA7Ci0JCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMzQzMEVTM18wOworCQkJKmNwdV9yZXYgPSAiMy4wIjsKIAkJCWJyZWFrOwogCQljYXNlIDQ6CiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDM0MzBfUkVWX0VTM18xOwotCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDM0MzBFUzNfMTsKKwkJCSpjcHVfcmV2ID0gIjMuMSI7CiAJCQlicmVhazsKIAkJY2FzZSA3OgogCQkvKiBGQUxMVEhST1VHSCAqLwogCQlkZWZhdWx0OgogCQkJLyogVXNlIHRoZSBsYXRlc3Qga25vd24gcmV2aXNpb24gYXMgZGVmYXVsdCAqLwogCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNDMwX1JFVl9FUzNfMV8yOwotCi0JCQkvKiBSRVZJU0lUOiBBZGQgQ0hJUF9JU19PTUFQMzQzMEVTM18xXzI/ICovCi0JCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMzQzMEVTM18xOworCQkJKmNwdV9yZXYgPSAiMy4xLjIiOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgMHhiODY4OgotCQkvKiBIYW5kbGUgT01BUDM1eHgvQU0zNXh4IGRldmljZXMKKwkJLyoKKwkJICogSGFuZGxlIE9NQVAvQU0gMzUwNS8zNTE3IGRldmljZXMKIAkJICoKLQkJICogU2V0IHRoZSBkZXZpY2UgdG8gYmUgT01BUDM1MDUgaGVyZS4gQWN0dWFsIGRldmljZQorCQkgKiBTZXQgdGhlIGRldmljZSB0byBiZSBPTUFQMzUxNyBoZXJlLiBBY3R1YWwgZGV2aWNlCiAJCSAqIGlzIGlkZW50aWZpZWQgbGF0ZXIgYmFzZWQgb24gdGhlIGZlYXR1cmVzLgotCQkgKgotCQkgKiBSRVZJU0lUOiBBTTM1MDUvQU0zNTE3IHNob3VsZCBoYXZlIHRoZWlyIG93biBDSElQX0lTCiAJCSAqLwotCQlvbWFwX3JldmlzaW9uID0gT01BUDM1MDVfUkVWKHJldik7Ci0JCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAzNDMwRVMzXzE7CisJCXN3aXRjaCAocmV2KSB7CisJCWNhc2UgMDoKKwkJCW9tYXBfcmV2aXNpb24gPSBPTUFQMzUxN19SRVZfRVMxXzA7CisJCQkqY3B1X3JldiA9ICIxLjAiOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZGVmYXVsdDoKKwkJCW9tYXBfcmV2aXNpb24gPSBPTUFQMzUxN19SRVZfRVMxXzE7CisJCQkqY3B1X3JldiA9ICIxLjEiOworCQl9CiAJCWJyZWFrOwogCWNhc2UgMHhiODkxOgogCQkvKiBIYW5kbGUgMzZ4eCBkZXZpY2VzICovCi0JCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAzNjMwRVMxOwogCiAJCXN3aXRjaChyZXYpIHsKIAkJY2FzZSAwOiAvKiBUYWtlIGNhcmUgb2YgZWFybHkgc2FtcGxlcyAqLwogCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNjMwX1JFVl9FUzFfMDsKKwkJCSpjcHVfcmV2ID0gIjEuMCI7CiAJCQlicmVhazsKIAkJY2FzZSAxOgogCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNjMwX1JFVl9FUzFfMTsKLQkJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAzNjMwRVMxXzE7CisJCQkqY3B1X3JldiA9ICIxLjEiOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKKwkJLyogRkFMTFRIUk9VR0ggKi8KIAkJZGVmYXVsdDoKLQkJCW9tYXBfcmV2aXNpb24gPSAgT01BUDM2MzBfUkVWX0VTMV8yOwotCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDM2MzBFUzFfMjsKKwkJCW9tYXBfcmV2aXNpb24gPSBPTUFQMzYzMF9SRVZfRVMxXzI7CisJCQkqY3B1X3JldiA9ICIxLjIiOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgMHhiODFlOgotCQlvbWFwX2NoaXAub2MgPSBDSElQX0lTX1RJODE2WDsKLQogCQlzd2l0Y2ggKHJldikgewogCQljYXNlIDA6CiAJCQlvbWFwX3JldmlzaW9uID0gVEk4MTY4X1JFVl9FUzFfMDsKKwkJCSpjcHVfcmV2ID0gIjEuMCI7CiAJCQlicmVhazsKIAkJY2FzZSAxOgotCQkJb21hcF9yZXZpc2lvbiA9IFRJODE2OF9SRVZfRVMxXzE7Ci0JCQlicmVhazsKKwkJLyogRkFMTFRIUk9VR0ggKi8KIAkJZGVmYXVsdDoKLQkJCW9tYXBfcmV2aXNpb24gPSAgVEk4MTY4X1JFVl9FUzFfMTsKKwkJCW9tYXBfcmV2aXNpb24gPSBUSTgxNjhfUkVWX0VTMV8xOworCQkJKmNwdV9yZXYgPSAiMS4xIjsKKwkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCS8qIFVua25vd24gZGVmYXVsdCB0byBsYXRlc3Qgc2lsaWNvbiByZXYgYXMgZGVmYXVsdCovCi0JCW9tYXBfcmV2aXNpb24gPSAgT01BUDM2MzBfUkVWX0VTMV8yOwotCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMzYzMEVTMV8yOworCQkvKiBVbmtub3duIGRlZmF1bHQgdG8gbGF0ZXN0IHNpbGljb24gcmV2IGFzIGRlZmF1bHQgKi8KKwkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNjMwX1JFVl9FUzFfMjsKKwkJKmNwdV9yZXYgPSAiMS4yIjsKKwkJcHJfd2FybigiV2FybmluZzogdW5rbm93biBjaGlwIHR5cGU7IGFzc3VtaW5nIE9NQVAzNjMwRVMxLjJcbiIpOwogCX0KIH0KIApAQCAtMzgyLDI0ICszNzcsMjAgQEAKIAkJc3dpdGNoIChyZXYpIHsKIAkJY2FzZSAwOgogCQkJb21hcF9yZXZpc2lvbiA9IE9NQVA0NDMwX1JFVl9FUzFfMDsKLQkJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVA0NDMwRVMxOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKIAkJZGVmYXVsdDoKIAkJCW9tYXBfcmV2aXNpb24gPSBPTUFQNDQzMF9SRVZfRVMyXzA7Ci0JCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQNDQzMEVTMjsKIAkJfQogCQlicmVhazsKIAljYXNlIDB4Yjk1YzoKIAkJc3dpdGNoIChyZXYpIHsKIAkJY2FzZSAzOgogCQkJb21hcF9yZXZpc2lvbiA9IE9NQVA0NDMwX1JFVl9FUzJfMTsKLQkJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVA0NDMwRVMyXzE7CiAJCQlicmVhazsKIAkJY2FzZSA0OgogCQlkZWZhdWx0OgogCQkJb21hcF9yZXZpc2lvbiA9IE9NQVA0NDMwX1JFVl9FUzJfMjsKLQkJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVA0NDMwRVMyXzI7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAweGI5NGU6CkBAIC00MDcsMTQgKzM5OCwxMiBAQAogCQljYXNlIDA6CiAJCWRlZmF1bHQ6CiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDQ0NjBfUkVWX0VTMV8wOwotCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDQ0NjBFUzFfMDsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIFVua25vd24gZGVmYXVsdCB0byBsYXRlc3Qgc2lsaWNvbiByZXYgYXMgZGVmYXVsdCAqLwogCQlvbWFwX3JldmlzaW9uID0gT01BUDQ0MzBfUkVWX0VTMl8yOwotCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQNDQzMEVTMl8yOwogCX0KIAogCXByX2luZm8oIk9NQVAlMDR4IEVTJWQuJWRcbiIsIG9tYXBfcmV2KCkgPj4gMTYsCkBAIC00MjUsOTQgKzQxNCwzMyBAQAogCWlmIChvbWFwM19oYXNfICMjZmVhdCgpKQkJXAogCQlwcmludGsoI2ZlYXQiICIpOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfY3B1aW5mbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX2NwdWluZm8oY29uc3QgY2hhciAqY3B1X3JldikKIHsKLQl1OCByZXYgPSBHRVRfT01BUF9SRVZJU0lPTigpOwotCWNoYXIgY3B1X25hbWVbMTZdLCBjcHVfcmV2WzE2XTsKKwljb25zdCBjaGFyICpjcHVfbmFtZTsKIAotCS8qIE9NQVAzNDMwIGFuZCBPTUFQMzUzMCBhcmUgYXNzdW1lZCB0byBiZSBzYW1lLgorCS8qCisJICogT01BUDM0MzAgYW5kIE9NQVAzNTMwIGFyZSBhc3N1bWVkIHRvIGJlIHNhbWUuCiAJICoKIAkgKiBPTUFQMzUyNSwgT01BUDM1MTUgYW5kIE9NQVAzNTAzIGNhbiBiZSBkZXRlY3RlZCBvbmx5IGJhc2VkCiAJICogb24gYXZhaWxhYmxlIGZlYXR1cmVzLiBVcG9uIGRldGVjdGlvbiwgdXBkYXRlIHRoZSBDUFUgaWQKIAkgKiBhbmQgQ1BVIGNsYXNzIGJpdHMuCiAJICovCiAJaWYgKGNwdV9pc19vbWFwMzYzMCgpKSB7Ci0JCXN0cmNweShjcHVfbmFtZSwgIk9NQVAzNjMwIik7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDM1MDUoKSkgewotCQkvKgotCQkgKiBBTTM1eHggZGV2aWNlcwotCQkgKi8KLQkJaWYgKG9tYXAzX2hhc19zZ3goKSkgewotCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNTE3X1JFVihyZXYpOwotCQkJc3RyY3B5KGNwdV9uYW1lLCAiQU0zNTE3Iik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBBbHJlYWR5IHNldCBpbiBvbWFwM19jaGVja19yZXZpc2lvbigpICovCi0JCQlzdHJjcHkoY3B1X25hbWUsICJBTTM1MDUiKTsKLQkJfQorCQljcHVfbmFtZSA9ICJPTUFQMzYzMCI7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDM1MTcoKSkgeworCQkvKiBBTTM1eHggZGV2aWNlcyAqLworCQljcHVfbmFtZSA9IChvbWFwM19oYXNfc2d4KCkpID8gIkFNMzUxNyIgOiAiQU0zNTA1IjsKIAl9IGVsc2UgaWYgKGNwdV9pc190aTgxNngoKSkgewotCQlzdHJjcHkoY3B1X25hbWUsICJUSTgxNlgiKTsKKwkJY3B1X25hbWUgPSAiVEk4MTZYIjsKIAl9IGVsc2UgaWYgKG9tYXAzX2hhc19pdmEoKSAmJiBvbWFwM19oYXNfc2d4KCkpIHsKIAkJLyogT01BUDM0MzAsIE9NQVAzNTI1LCBPTUFQMzUxNSwgT01BUDM1MDMgZGV2aWNlcyAqLwotCQlzdHJjcHkoY3B1X25hbWUsICJPTUFQMzQzMC8zNTMwIik7CisJCWNwdV9uYW1lID0gIk9NQVAzNDMwLzM1MzAiOwogCX0gZWxzZSBpZiAob21hcDNfaGFzX2l2YSgpKSB7Ci0JCW9tYXBfcmV2aXNpb24gPSBPTUFQMzUyNV9SRVYocmV2KTsKLQkJc3RyY3B5KGNwdV9uYW1lLCAiT01BUDM1MjUiKTsKKwkJY3B1X25hbWUgPSAiT01BUDM1MjUiOwogCX0gZWxzZSBpZiAob21hcDNfaGFzX3NneCgpKSB7Ci0JCW9tYXBfcmV2aXNpb24gPSBPTUFQMzUxNV9SRVYocmV2KTsKLQkJc3RyY3B5KGNwdV9uYW1lLCAiT01BUDM1MTUiKTsKKwkJY3B1X25hbWUgPSAiT01BUDM1MTUiOwogCX0gZWxzZSB7Ci0JCW9tYXBfcmV2aXNpb24gPSBPTUFQMzUwM19SRVYocmV2KTsKLQkJc3RyY3B5KGNwdV9uYW1lLCAiT01BUDM1MDMiKTsKLQl9Ci0KLQlpZiAoY3B1X2lzX29tYXAzNjMwKCkgfHwgY3B1X2lzX3RpODE2eCgpKSB7Ci0JCXN3aXRjaCAocmV2KSB7Ci0JCWNhc2UgT01BUF9SRVZCSVRTXzAwOgotCQkJc3RyY3B5KGNwdV9yZXYsICIxLjAiKTsKLQkJCWJyZWFrOwotCQljYXNlIE9NQVBfUkVWQklUU18wMToKLQkJCXN0cmNweShjcHVfcmV2LCAiMS4xIik7Ci0JCQlicmVhazsKLQkJY2FzZSBPTUFQX1JFVkJJVFNfMDI6Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQlkZWZhdWx0OgotCQkJLyogVXNlIHRoZSBsYXRlc3Qga25vd24gcmV2aXNpb24gYXMgZGVmYXVsdCAqLwotCQkJc3RyY3B5KGNwdV9yZXYsICIxLjIiKTsKLQkJfQotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAzNTA1KCkgfHwgY3B1X2lzX29tYXAzNTE3KCkpIHsKLQkJc3dpdGNoIChyZXYpIHsKLQkJY2FzZSBPTUFQX1JFVkJJVFNfMDA6Ci0JCQlzdHJjcHkoY3B1X3JldiwgIjEuMCIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT01BUF9SRVZCSVRTXzAxOgotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJZGVmYXVsdDoKLQkJCS8qIFVzZSB0aGUgbGF0ZXN0IGtub3duIHJldmlzaW9uIGFzIGRlZmF1bHQgKi8KLQkJCXN0cmNweShjcHVfcmV2LCAiMS4xIik7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKHJldikgewotCQljYXNlIE9NQVBfUkVWQklUU18wMDoKLQkJCXN0cmNweShjcHVfcmV2LCAiMS4wIik7Ci0JCQlicmVhazsKLQkJY2FzZSBPTUFQX1JFVkJJVFNfMDE6Ci0JCQlzdHJjcHkoY3B1X3JldiwgIjIuMCIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT01BUF9SRVZCSVRTXzAyOgotCQkJc3RyY3B5KGNwdV9yZXYsICIyLjEiKTsKLQkJCWJyZWFrOwotCQljYXNlIE9NQVBfUkVWQklUU18wMzoKLQkJCXN0cmNweShjcHVfcmV2LCAiMy4wIik7Ci0JCQlicmVhazsKLQkJY2FzZSBPTUFQX1JFVkJJVFNfMDQ6Ci0JCQlzdHJjcHkoY3B1X3JldiwgIjMuMSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT01BUF9SRVZCSVRTXzA1OgotCQkJLyogRkFMTFRIUk9VR0ggKi8KLQkJZGVmYXVsdDoKLQkJCS8qIFVzZSB0aGUgbGF0ZXN0IGtub3duIHJldmlzaW9uIGFzIGRlZmF1bHQgKi8KLQkJCXN0cmNweShjcHVfcmV2LCAiMy4xLjIiKTsKLQkJfQorCQljcHVfbmFtZSA9ICJPTUFQMzUwMyI7CiAJfQogCiAJLyogUHJpbnQgdmVyYm9zZSBpbmZvcm1hdGlvbiAqLwpAQCAtNTMzLDYgKzQ2MSw4IEBACiAgKi8KIHZvaWQgX19pbml0IG9tYXAyX2NoZWNrX3JldmlzaW9uKHZvaWQpCiB7CisJY29uc3QgY2hhciAqY3B1X3JldjsKKwogCS8qCiAJICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFuIGlkZWEgYWJvdXQgdGhlIHByb2Nlc3NvciByZXZpc2lvbiBzZXQKIAkgKiBlYXJsaWVyIHdpdGggb21hcDJfc2V0X2dsb2JhbHNfdGFwKCkuCkBAIC01NDAsNyArNDcwLDcgQEAKIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJb21hcDI0eHhfY2hlY2tfcmV2aXNpb24oKTsKIAl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7Ci0JCW9tYXAzX2NoZWNrX3JldmlzaW9uKCk7CisJCW9tYXAzX2NoZWNrX3JldmlzaW9uKCZjcHVfcmV2KTsKIAogCQkvKiBUSTgxNlggZG9lc24ndCBoYXZlIGZlYXR1cmUgcmVnaXN0ZXIgKi8KIAkJaWYgKCFjcHVfaXNfdGk4MTZ4KCkpCkBAIC01NDgsNyArNDc4LDcgQEAKIAkJZWxzZQogCQkJdGk4MTZ4X2NoZWNrX2ZlYXR1cmVzKCk7CiAKLQkJb21hcDNfY3B1aW5mbygpOworCQlvbWFwM19jcHVpbmZvKGNwdV9yZXYpOwogCQlyZXR1cm47CiAJfSBlbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewogCQlvbWFwNF9jaGVja19yZXZpc2lvbigpOwpAQCAtNTU3LDIyICs0ODcsNiBAQAogCX0gZWxzZSB7CiAJCXByX2VycigiT01BUCByZXZpc2lvbiB1bmtub3duLCBwbGVhc2UgZml4IVxuIik7CiAJfQotCi0JLyoKLQkgKiBPSywgbm93IHdlIGtub3cgdGhlIGV4YWN0IHJldmlzaW9uLiBJbml0aWFsaXplIG9tYXBfY2hpcCBiaXRzCi0JICogZm9yIHBvd2VyZG93bWFpbiBhbmQgY2xvY2tkb21haW4gY29kZS4KLQkgKi8KLQlpZiAoY3B1X2lzX29tYXAyNDN4KCkpIHsKLQkJLyogQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgMjQzMEVTMi4xIGFuZCAyNDMwLWFsbCAqLwotCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMjQzMDsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAyNDJ4KCkpIHsKLQkJLyogQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgMjQyMEVTMi4xLjEgYW5kIDI0MjAtYWxsICovCi0JCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAyNDIwOwotCQlyZXR1cm47Ci0JfQotCi0JcHJfZXJyKCJVbmluaXRpYWxpemVkIG9tYXBfY2hpcCwgcGxlYXNlIGZpeCFcbiIpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvY3RybF9tb2R1bGVfcGFkX2NvcmVfNDR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvY3RybF9tb2R1bGVfcGFkX2NvcmVfNDR4eC5oCmluZGV4IGM4ODQyMGQuLjFlMmQzMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2N0cmxfbW9kdWxlX3BhZF9jb3JlXzQ0eHguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9jdHJsX21vZHVsZV9wYWRfY29yZV80NHh4LmgKQEAgLTk0MSwxMCArOTQxLDEwIEBACiAjZGVmaW5lIE9NQVA0X0RTSTJfTEFORUVOQUJMRV9NQVNLCQkJCSgweDcgPDwgMjkpCiAjZGVmaW5lIE9NQVA0X0RTSTFfTEFORUVOQUJMRV9TSElGVAkJCQkyNAogI2RlZmluZSBPTUFQNF9EU0kxX0xBTkVFTkFCTEVfTUFTSwkJCQkoMHgxZiA8PCAyNCkKLSNkZWZpbmUgT01BUDRfRFNJMV9QSVBEX1NISUZUCQkJCQkxOQotI2RlZmluZSBPTUFQNF9EU0kxX1BJUERfTUFTSwkJCQkJKDB4MWYgPDwgMTkpCi0jZGVmaW5lIE9NQVA0X0RTSTJfUElQRF9TSElGVAkJCQkJMTQKLSNkZWZpbmUgT01BUDRfRFNJMl9QSVBEX01BU0sJCQkJCSgweDFmIDw8IDE0KQorI2RlZmluZSBPTUFQNF9EU0kyX1BJUERfU0hJRlQJCQkJCTE5CisjZGVmaW5lIE9NQVA0X0RTSTJfUElQRF9NQVNLCQkJCQkoMHgxZiA8PCAxOSkKKyNkZWZpbmUgT01BUDRfRFNJMV9QSVBEX1NISUZUCQkJCQkxNAorI2RlZmluZSBPTUFQNF9EU0kxX1BJUERfTUFTSwkJCQkJKDB4MWYgPDwgMTQpCiAKIC8qIENPTlRST0xfTUNCU1BMUCAqLwogI2RlZmluZSBPTUFQNF9BTEJDVFJMUlhfRlNYX1NISUZUCQkJCTMxCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA0OGFkZmU5Li4xM2Y5OGU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTEzLDE1ICsxMywxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogCi0jaW5jbHVkZSA8YXNtL21lbW9yeS5oPgotCiAjaW5jbHVkZSA8cGxhdC9zZXJpYWwuaD4KIAogI2RlZmluZSBVQVJUX09GRlNFVChhZGRyKQkoKGFkZHIpICYgMHgwMGZmZmZmZikKIAotI2RlZmluZSBvbWFwX3VhcnRfdjJwKHgpCSgoeCkgLSBQQUdFX09GRlNFVCArIFBMQVRfUEhZU19PRkZTRVQpCi0jZGVmaW5lIG9tYXBfdWFydF9wMnYoeCkJKCh4KSAtIFBMQVRfUEhZU19PRkZTRVQgKyBQQUdFX09GRlNFVCkKLQogCQkucHVzaHNlY3Rpb24gLmRhdGEKIG9tYXBfdWFydF9waHlzOgkud29yZAkwCiBvbWFwX3VhcnRfdmlydDoJLndvcmQJMApAQCAtMzQsMjYgKzI5LDI1IEBACiAJCSAqIHRoZSBkZXNpcmVkIFVBUlQgcGh5cyBhbmQgdmlydCBhZGRyZXNzZXMgdGVtcG9yYXJpbHkgaW50bwogCQkgKiB0aGUgb21hcF91YXJ0X3BoeXMgYW5kIG9tYXBfdWFydF92aXJ0IGFib3ZlLgogCQkgKi8KLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCiAJCS8qIFVzZSBvbWFwX3VhcnRfcGh5cy92aXJ0IGlmIGFscmVhZHkgY29uZmlndXJlZCAqLwotMTA6CQltcmMJcDE1LCAwLCBccnAsIGMxLCBjMAotCQl0c3QJXHJwLCAjMQkJCUAgTU1VIGVuYWJsZWQ/Ci0JCWxkcmVxCVxycCwgPW9tYXBfdWFydF92MnAob21hcF91YXJ0X3BoeXMpCUAgTU1VIGRpc2FibGVkCi0JCWxkcm5lCVxycCwgPW9tYXBfdWFydF9waHlzCUAgTU1VIGVuYWJsZWQKLQkJYWRkCVxydiwgXHJwLCAjNAkJQCBvbWFwX3VhcnRfdmlydAotCQlsZHIJXHJwLCBbXHJwLCAjMF0KLQkJbGRyCVxydiwgW1xydiwgIzBdCisxMDoJCWFkcglccnAsIDk5ZgkJQCBnZXQgZWZmZWN0aXZlIGFkZHIgb2YgOTlmCisJCWxkcglccnYsIFtccnBdCQlAIGdldCBhYnNvbHV0ZSBhZGRyIG9mIDk5ZgorCQlzdWIJXHJ2LCBccnYsIFxycAkJQCBvZmZzZXQgYmV0d2VlbiB0aGUgdHdvCisJCWxkcglccnAsIFtccnAsICM0XQkJQCBhYnMgYWRkciBvZiBvbWFwX3VhcnRfcGh5cworCQlzdWIJXHRtcCwgXHJwLCBccnYJCUAgbWFrZSBpdCBlZmZlY3RpdmUKKwkJbGRyCVxycCwgW1x0bXAsICMwXQkJQCBvbWFwX3VhcnRfcGh5cworCQlsZHIJXHJ2LCBbXHRtcCwgIzRdCQlAIG9tYXBfdWFydF92aXJ0CiAJCWNtcAlccnAsICMwCQkJQCBpcyBwb3J0IGNvbmZpZ3VyZWQ/CiAJCWNtcG5lCVxydiwgIzAKLQkJYm5lCTk5ZgkJCUAgYWxyZWFkeSBjb25maWd1cmVkCisJCWJuZQkxMDBmCQkJQCBhbHJlYWR5IGNvbmZpZ3VyZWQKIAogCQkvKiBDaGVjayB0aGUgZGVidWcgVUFSVCBjb25maWd1cmF0aW9uIHNldCBpbiB1bmNvbXByZXNzLmggKi8KLQkJbXJjCXAxNSwgMCwgXHJwLCBjMSwgYzAKLQkJdHN0CVxycCwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQlsZHJlcQlccnAsID1PTUFQX1VBUlRfSU5GTwlAIE1NVSBub3QgZW5hYmxlZAotCQlsZHJuZQlccnAsID1vbWFwX3VhcnRfcDJ2KE9NQVBfVUFSVF9JTkZPKQlAIE1NVSBlbmFibGVkCi0JCWxkcglccnAsIFtccnAsICMwXQorCQltb3YJXHJwLCBwYworCQlsZHIJXHJ2LCA9T01BUF9VQVJUX0lORk9fT0ZTCisJCWFuZAlccnAsIFxycCwgIzB4ZmYwMDAwMDAKKwkJbGRyCVxycCwgW1xycCwgXHJ2XQogCiAJCS8qIFNlbGVjdCB0aGUgVUFSVCB0byB1c2UgYmFzZWQgb24gdGhlIFVBUlQxIHNjcmF0Y2hwYWQgdmFsdWUgKi8KIAkJY21wCVxycCwgIzAJCQlAIG5vIHBvcnQgY29uZmlndXJlZD8KQEAgLTEwNiw1MCArMTAwLDQ3IEBACiAJCWIJOThmCiA4MzoJCW1vdglccnAsICNVQVJUX09GRlNFVChUSTgxNlhfVUFSVDNfQkFTRSkKIAkJYgk5OGYKKwogOTU6CQlsZHIJXHJwLCA9Wk9PTV9VQVJUX0JBU0UKLQkJbXJjCXAxNSwgMCwgXHJ2LCBjMSwgYzAKLQkJdHN0CVxydiwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQlsZHJlcQlccnYsID1vbWFwX3VhcnRfdjJwKG9tYXBfdWFydF9waHlzKQlAIE1NVSBkaXNhYmxlZAotCQlsZHJuZQlccnYsID1vbWFwX3VhcnRfcGh5cwlAIE1NVSBlbmFibGVkCi0JCXN0cglccnAsIFtccnYsICMwXQorCQlzdHIJXHJwLCBbXHRtcCwgIzBdCQlAIG9tYXBfdWFydF9waHlzCiAJCWxkcglccnAsID1aT09NX1VBUlRfVklSVAotCQlhZGQJXHJ2LCBccnYsICM0CQlAIG9tYXBfdWFydF92aXJ0Ci0JCXN0cglccnAsIFtccnYsICMwXQorCQlzdHIJXHJwLCBbXHRtcCwgIzRdCQlAIG9tYXBfdWFydF92aXJ0CiAJCW1vdglccnAsICMoVUFSVF9MU1IgPDwgWk9PTV9QT1JUX1NISUZUKQotCQlhZGQJXHJ2LCBccnYsICM0CQlAIG9tYXBfdWFydF9sc3IKLQkJc3RyCVxycCwgW1xydiwgIzBdCisJCXN0cglccnAsIFtcdG1wLCAjOF0JCUAgb21hcF91YXJ0X2xzcgogCQliCTEwYgogCiAJCS8qIFN0b3JlIGJvdGggcGh5cyBhbmQgdmlydCBhZGRyZXNzIGZvciB0aGUgdWFydCAqLwogOTg6CQlhZGQJXHJwLCBccnAsICMweDQ4MDAwMDAwCUAgcGh5cyBiYXNlCi0JCW1yYwlwMTUsIDAsIFxydiwgYzEsIGMwCi0JCXRzdAlccnYsICMxCQkJQCBNTVUgZW5hYmxlZD8KLQkJbGRyZXEJXHJ2LCA9b21hcF91YXJ0X3YycChvbWFwX3VhcnRfcGh5cykJQCBNTVUgZGlzYWJsZWQKLQkJbGRybmUJXHJ2LCA9b21hcF91YXJ0X3BoeXMJQCBNTVUgZW5hYmxlZAotCQlzdHIJXHJwLCBbXHJ2LCAjMF0KKwkJc3RyCVxycCwgW1x0bXAsICMwXQkJQCBvbWFwX3VhcnRfcGh5cwogCQlzdWIJXHJwLCBccnAsICMweDQ4MDAwMDAwCUAgcGh5cyBiYXNlCiAJCWFkZAlccnAsIFxycCwgIzB4ZmEwMDAwMDAJQCB2aXJ0IGJhc2UKLQkJYWRkCVxydiwgXHJ2LCAjNAkJQCBvbWFwX3VhcnRfdmlydAotCQlzdHIJXHJwLCBbXHJ2LCAjMF0KKwkJc3RyCVxycCwgW1x0bXAsICM0XQkJQCBvbWFwX3VhcnRfdmlydAogCQltb3YJXHJwLCAjKFVBUlRfTFNSIDw8IE9NQVBfUE9SVF9TSElGVCkKLQkJYWRkCVxydiwgXHJ2LCAjNAkJQCBvbWFwX3VhcnRfbHNyCi0JCXN0cglccnAsIFtccnYsICMwXQorCQlzdHIJXHJwLCBbXHRtcCwgIzhdCQlAIG9tYXBfdWFydF9sc3IKIAogCQliCTEwYgotOTk6CisKKwkJLmFsaWduCis5OToJCS53b3JkCS4KKwkJLndvcmQJb21hcF91YXJ0X3BoeXMKKwkJLmx0b3JnCisKKzEwMDoJCS8qIFBhc3MgdGhlIFVBUlRfTFNSIHJlZyBhZGRyZXNzICovCisJCWxkcglcdG1wLCBbXHRtcCwgIzhdCUAgb21hcF91YXJ0X2xzcgorCQlhZGQJXHJwLCBccnAsIFx0bXAKKwkJYWRkCVxydiwgXHJ2LCBcdG1wCiAJCS5lbmRtCiAKIAkJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4Ci0JCXN0cmIJXHJkLCBbXHJ4XQorCQlvcnIJXHJkLCBccmQsIFxyeCwgbHNsICMyNAlAIHByZXNlcnZlIExTUiByZWcgb2Zmc2V0CisJCWJpYwlccngsIFxyeCwgIzB4ZmYJCUAgZ2V0IGJhc2UgKFRIUikgcmVnIGFkZHJlc3MKKwkJc3RyYglccmQsIFtccnhdCQlAIHNlbmQgbG93ZXIgYnl0ZSBvZiByZAorCQlvcnIJXHJ4LCBccngsIFxyZCwgbHNyICMyNAlAIHJlc3RvcmUgb3JpZ2luYWwgcnggKExTUikKKwkJYmljCVxyZCwgXHJkLCAjKDB4ZmYgPDwgMjQpCUAgcmVzdG9yZSBvcmlnaW5hbCByZAogCQkuZW5kbQogCiAJCS5tYWNybwlidXN5dWFydCxyZCxyeAotMTAwMToJCW1yYwlwMTUsIDAsIFxyZCwgYzEsIGMwCi0JCXRzdAlccmQsICMxCQkJQCBNTVUgZW5hYmxlZD8KLQkJbGRyZXEJXHJkLCA9b21hcF91YXJ0X3YycChvbWFwX3VhcnRfbHNyKQlAIE1NVSBkaXNhYmxlZAotCQlsZHJuZQlccmQsID1vbWFwX3VhcnRfbHNyCUAgTU1VIGVuYWJsZWQKLQkJbGRyCVxyZCwgW1xyZCwgIzBdCi0JCWxkcmIJXHJkLCBbXHJ4LCBccmRdCisxMDAxOgkJbGRyYglccmQsIFtccnhdCQlAIHJ4IGNvbnRhaW5zIFVBUlRfTFNSIGFkZHJlc3MKIAkJYW5kCVxyZCwgXHJkLCAjKFVBUlRfTFNSX1RFTVQgfCBVQVJUX0xTUl9USFJFKQogCQl0ZXEJXHJkLCAjKFVBUlRfTFNSX1RFTVQgfCBVQVJUX0xTUl9USFJFKQogCQlibmUJMTAwMWIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IGNlYjhiN2UuLmZlYjkwYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtNzgsNyArNzgsNyBAQAogNDQwMToJCWxkciAgICAgXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfSU5UQUNLXQogCQlsZHIgICAgIFx0bXAsID0xMDIxCiAJCWJpYyAgICAgXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAotCQljbXAgICAgIFxpcnFuciwgIzI5CisJCWNtcCAgICAgXGlycW5yLCAjMTUKIAkJY21wY2MgICBcaXJxbnIsIFxpcnFucgogCQljbXBuZSAgIFxpcnFuciwgXHRtcAogCQljbXBjcyAgIFxpcnFuciwgXGlycW5yCkBAIC0xMDEsMTggKzEwMSw2IEBACiAJCWl0CWNzCiAJCWNtcGNzCVxpcnFuciwgXGlycW5yCiAJCS5lbmRtCi0KLQkJLyogQXMgYWJvdmUsIHRoaXMgYXNzdW1lcyB0aGF0IGlycXN0YXQgYW5kIGJhc2UgYXJlIHByZXNlcnZlZCAqLwotCi0JCS5tYWNybyB0ZXN0X2Zvcl9sdGlycSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotCQliaWMJXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAotCQltb3YgCVx0bXAsICMwCi0JCWNtcAlcaXJxbnIsICMyOQotCQlpdHQJZXEKLQkJbW92ZXEJXHRtcCwgIzEKLQkJc3RyZXEJXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfRU9JXQotCQljbXAJXHRtcCwgIzAKLQkJLmVuZG0KICNlbmRpZgkvKiBDT05GSUdfU01QICovCiAKICNlbHNlCS8qIE1VTFRJX09NQVAyICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTZkMzJhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqLwotCi0jaW5jbHVkZSA8cGxhdC9tZW1vcnkuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYwppbmRleCAyY2UxY2U2Li4yNWQyMGNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCkBAIC0xNiw3ICsxNiw2IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTM1LDE0ICszNCwxNiBAQAogI2luY2x1ZGUgImNsb2NrMnh4eC5oIgogI2luY2x1ZGUgImNsb2NrM3h4eC5oIgogI2luY2x1ZGUgImNsb2NrNDR4eC5oIgotI2luY2x1ZGUgImlvLmgiCiAKKyNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHBsYXQvb21hcC1wbS5oPgorI2luY2x1ZGUgInZvbHRhZ2UuaCIKICNpbmNsdWRlICJwb3dlcmRvbWFpbi5oIgogCiAjaW5jbHVkZSAiY2xvY2tkb21haW4uaCIKICNpbmNsdWRlIDxwbGF0L29tYXBfaHdtb2QuaD4KICNpbmNsdWRlIDxwbGF0L211bHRpLmg+CisjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KIAogLyoKICAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgbWF5IHByb3ZpZGUgdGhlIGV4dHJhIG1hcHBpbmcgYmVzaWRlcyB0aGUKQEAgLTIzOSwyNSArMjQwLDExIEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBfb21hcDJfbWFwX2NvbW1vbl9pbyh2b2lkKQotewotCS8qIE5vcm1hbGx5IGRldmljZW1hcHNfaW5pdCgpIHdvdWxkIGZsdXNoIGNhY2hlcyBhbmQgdGxiIGFmdGVyCi0JICogbWRlc2MtPm1hcF9pbygpLCBidXQgd2UgbXVzdCBhbHNvIGRvIGl0IGhlcmUgYmVjYXVzZSBvZiB0aGUgQ1BVCi0JICogcmV2aXNpb24gY2hlY2sgYmVsb3cuCi0JICovCi0JbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwotCWZsdXNoX2NhY2hlX2FsbCgpOwotCi0Jb21hcDJfY2hlY2tfcmV2aXNpb24oKTsKLQlvbWFwX3NyYW1faW5pdCgpOwotfQotCiAjaWZkZWYgQ09ORklHX1NPQ19PTUFQMjQyMAogdm9pZCBfX2luaXQgb21hcDI0MnhfbWFwX2NvbW1vbl9pbyh2b2lkKQogewogCWlvdGFibGVfaW5pdChvbWFwMjR4eF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAyNHh4X2lvX2Rlc2MpKTsKIAlpb3RhYmxlX2luaXQob21hcDI0MnhfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMjQyeF9pb19kZXNjKSk7Ci0JX29tYXAyX21hcF9jb21tb25faW8oKTsKIH0KICNlbmRpZgogCkBAIC0yNjYsNyArMjUzLDYgQEAKIHsKIAlpb3RhYmxlX2luaXQob21hcDI0eHhfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMjR4eF9pb19kZXNjKSk7CiAJaW90YWJsZV9pbml0KG9tYXAyNDN4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDI0M3hfaW9fZGVzYykpOwotCV9vbWFwMl9tYXBfY29tbW9uX2lvKCk7CiB9CiAjZW5kaWYKIApAQCAtMjc0LDcgKzI2MCw2IEBACiB2b2lkIF9faW5pdCBvbWFwMzR4eF9tYXBfY29tbW9uX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KG9tYXAzNHh4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDM0eHhfaW9fZGVzYykpOwotCV9vbWFwMl9tYXBfY29tbW9uX2lvKCk7CiB9CiAjZW5kaWYKIApAQCAtMjgyLDcgKzI2Nyw2IEBACiB2b2lkIF9faW5pdCBvbWFwdGk4MTZ4X21hcF9jb21tb25faW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQob21hcHRpODE2eF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXB0aTgxNnhfaW9fZGVzYykpOwotCV9vbWFwMl9tYXBfY29tbW9uX2lvKCk7CiB9CiAjZW5kaWYKIApAQCAtMjkwLDcgKzI3NCw2IEBACiB2b2lkIF9faW5pdCBvbWFwNDR4eF9tYXBfY29tbW9uX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KG9tYXA0NHh4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDQ0eHhfaW9fZGVzYykpOwotCV9vbWFwMl9tYXBfY29tbW9uX2lvKCk7CiB9CiAjZW5kaWYKIApAQCAtMzM2LDMwICszMTksMTcgQEAKIC8qIFNlZSBpcnEuYywgb21hcDQtY29tbW9uLmMgYW5kIGVudHJ5LW1hY3JvLlMgKi8KIHZvaWQgX19pb21lbSAqb21hcF9pcnFfYmFzZTsKIAotdm9pZCBfX2luaXQgb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2NvbW1vbl9pbml0X2Vhcmx5KHZvaWQpCit7CisJb21hcDJfY2hlY2tfcmV2aXNpb24oKTsKKwlvbWFwX2lvcmVtYXBfaW5pdCgpOworCW9tYXBfaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2h3bW9kX2luaXRfcG9zdHNldHVwKHZvaWQpCiB7CiAJdTggcG9zdHNldHVwX3N0YXRlOwogCi0JaWYgKGNwdV9pc19vbWFwMjQyeCgpKSB7Ci0JCW9tYXAyeHh4X3Bvd2VyZG9tYWluc19pbml0KCk7Ci0JCW9tYXAyeHh4X2Nsb2NrZG9tYWluc19pbml0KCk7Ci0JCW9tYXAyNDIwX2h3bW9kX2luaXQoKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMjQzeCgpKSB7Ci0JCW9tYXAyeHh4X3Bvd2VyZG9tYWluc19pbml0KCk7Ci0JCW9tYXAyeHh4X2Nsb2NrZG9tYWluc19pbml0KCk7Ci0JCW9tYXAyNDMwX2h3bW9kX2luaXQoKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7Ci0JCW9tYXAzeHh4X3Bvd2VyZG9tYWluc19pbml0KCk7Ci0JCW9tYXAzeHh4X2Nsb2NrZG9tYWluc19pbml0KCk7Ci0JCW9tYXAzeHh4X2h3bW9kX2luaXQoKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7Ci0JCW9tYXA0NHh4X3Bvd2VyZG9tYWluc19pbml0KCk7Ci0JCW9tYXA0NHh4X2Nsb2NrZG9tYWluc19pbml0KCk7Ci0JCW9tYXA0NHh4X2h3bW9kX2luaXQoKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBpbml0IGh3bW9kIGRhdGEgLSB1bmtub3duIFNvQ1xuIik7Ci0gICAgICAgIH0KLQogCS8qIFNldCB0aGUgZGVmYXVsdCBwb3N0c2V0dXAgc3RhdGUgZm9yIGFsbCBod21vZHMgKi8KICNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQogCXBvc3RzZXR1cF9zdGF0ZSA9IF9IV01PRF9TVEFURV9JRExFOwpAQCAtMzc2LDcgKzM0Niw3IEBACiAJICogb21hcF9od21vZF9sYXRlX2luaXQoKSwgc28gYm9hcmRzIHRoYXQgZGVzaXJlIGZ1bGwgd2F0Y2hkb2cKIAkgKiBjb3ZlcmFnZSBvZiBrZXJuZWwgaW5pdGlhbGl6YXRpb24gY2FuIHJlcHJvZ3JhbSB0aGUKIAkgKiBwb3N0c2V0dXBfc3RhdGUgYmV0d2VlbiB0aGUgY2FsbHMgdG8KLQkgKiBvbWFwMl9pbml0X2NvbW1vbl9pbmZyYSgpIGFuZCBvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKCkuCisJICogb21hcDJfaW5pdF9jb21tb25faW5mcmEoKSBhbmQgb21hcF9zZHJjX2luaXQoKS4KIAkgKgogCSAqIFhYWCBpZGVhbGx5IHdlIGNvdWxkIGRldGVjdCB3aGV0aGVyIHRoZSBNUFUgV0RUIHdhcyBjdXJyZW50bHkKIAkgKiBlbmFibGVkIGhlcmUgYW5kIG1ha2UgdGhpcyBjb25kaXRpb25hbApAQCAtMzg3LDI3ICszNTcsMTA3IEBACiAJCQkJICAgICAmcG9zdHNldHVwX3N0YXRlKTsKIAogCW9tYXBfcG1faWZfZWFybHlfaW5pdCgpOwotCi0JaWYgKGNwdV9pc19vbWFwMjQyMCgpKQotCQlvbWFwMjQyMF9jbGtfaW5pdCgpOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwMjQzMCgpKQotCQlvbWFwMjQzMF9jbGtfaW5pdCgpOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKQotCQlvbWFwM3h4eF9jbGtfaW5pdCgpOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKQotCQlvbWFwNHh4eF9jbGtfaW5pdCgpOwotCWVsc2UKLQkJcHJfZXJyKCJDb3VsZCBub3QgaW5pdCBjbG9jayBmcmFtZXdvcmsgLSB1bmtub3duIFNvQ1xuIik7CiB9CiAKLXZvaWQgX19pbml0IG9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoc3RydWN0IG9tYXBfc2RyY19wYXJhbXMgKnNkcmNfY3MwLAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAyCit2b2lkIF9faW5pdCBvbWFwMjQyMF9pbml0X2Vhcmx5KHZvaWQpCit7CisJb21hcDJfc2V0X2dsb2JhbHNfMjQyeCgpOworCW9tYXBfY29tbW9uX2luaXRfZWFybHkoKTsKKwlvbWFwMnh4eF92b2x0YWdlZG9tYWluc19pbml0KCk7CisJb21hcDI0MnhfcG93ZXJkb21haW5zX2luaXQoKTsKKwlvbWFwMjQyeF9jbG9ja2RvbWFpbnNfaW5pdCgpOworCW9tYXAyNDIwX2h3bW9kX2luaXQoKTsKKwlvbWFwX2h3bW9kX2luaXRfcG9zdHNldHVwKCk7CisJb21hcDI0MjBfY2xrX2luaXQoKTsKK30KKwordm9pZCBfX2luaXQgb21hcDI0MzBfaW5pdF9lYXJseSh2b2lkKQoreworCW9tYXAyX3NldF9nbG9iYWxzXzI0M3goKTsKKwlvbWFwX2NvbW1vbl9pbml0X2Vhcmx5KCk7CisJb21hcDJ4eHhfdm9sdGFnZWRvbWFpbnNfaW5pdCgpOworCW9tYXAyNDN4X3Bvd2VyZG9tYWluc19pbml0KCk7CisJb21hcDI0M3hfY2xvY2tkb21haW5zX2luaXQoKTsKKwlvbWFwMjQzMF9od21vZF9pbml0KCk7CisJb21hcF9od21vZF9pbml0X3Bvc3RzZXR1cCgpOworCW9tYXAyNDMwX2Nsa19pbml0KCk7Cit9CisjZW5kaWYKKworLyoKKyAqIEN1cnJlbnRseSBvbmx5IGJvYXJkLW9tYXAzYmVhZ2xlLmMgc2hvdWxkIGNhbGwgdGhpcyBiZWNhdXNlIG9mIHRoZQorICogc2FtZSBtYWNoaW5lX2lkIGZvciAzNHh4IGFuZCAzNnh4IGJlYWdsZS4uIFdpbGwgZ2V0IGZpeGVkIHdpdGggRFQuCisgKi8KKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMwordm9pZCBfX2luaXQgb21hcDNfaW5pdF9lYXJseSh2b2lkKQoreworCW9tYXAyX3NldF9nbG9iYWxzXzN4eHgoKTsKKwlvbWFwX2NvbW1vbl9pbml0X2Vhcmx5KCk7CisJb21hcDN4eHhfdm9sdGFnZWRvbWFpbnNfaW5pdCgpOworCW9tYXAzeHh4X3Bvd2VyZG9tYWluc19pbml0KCk7CisJb21hcDN4eHhfY2xvY2tkb21haW5zX2luaXQoKTsKKwlvbWFwM3h4eF9od21vZF9pbml0KCk7CisJb21hcF9od21vZF9pbml0X3Bvc3RzZXR1cCgpOworCW9tYXAzeHh4X2Nsa19pbml0KCk7Cit9CisKK3ZvaWQgX19pbml0IG9tYXAzNDMwX2luaXRfZWFybHkodm9pZCkKK3sKKwlvbWFwM19pbml0X2Vhcmx5KCk7Cit9CisKK3ZvaWQgX19pbml0IG9tYXAzNXh4X2luaXRfZWFybHkodm9pZCkKK3sKKwlvbWFwM19pbml0X2Vhcmx5KCk7Cit9CisKK3ZvaWQgX19pbml0IG9tYXAzNjMwX2luaXRfZWFybHkodm9pZCkKK3sKKwlvbWFwM19pbml0X2Vhcmx5KCk7Cit9CisKK3ZvaWQgX19pbml0IGFtMzV4eF9pbml0X2Vhcmx5KHZvaWQpCit7CisJb21hcDNfaW5pdF9lYXJseSgpOworfQorCit2b2lkIF9faW5pdCB0aTgxNnhfaW5pdF9lYXJseSh2b2lkKQoreworCW9tYXAyX3NldF9nbG9iYWxzX3RpODE2eCgpOworCW9tYXBfY29tbW9uX2luaXRfZWFybHkoKTsKKwlvbWFwM3h4eF92b2x0YWdlZG9tYWluc19pbml0KCk7CisJb21hcDN4eHhfcG93ZXJkb21haW5zX2luaXQoKTsKKwlvbWFwM3h4eF9jbG9ja2RvbWFpbnNfaW5pdCgpOworCW9tYXAzeHh4X2h3bW9kX2luaXQoKTsKKwlvbWFwX2h3bW9kX2luaXRfcG9zdHNldHVwKCk7CisJb21hcDN4eHhfY2xrX2luaXQoKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDQKK3ZvaWQgX19pbml0IG9tYXA0NDMwX2luaXRfZWFybHkodm9pZCkKK3sKKwlvbWFwMl9zZXRfZ2xvYmFsc180NDN4KCk7CisJb21hcF9jb21tb25faW5pdF9lYXJseSgpOworCW9tYXA0NHh4X3ZvbHRhZ2Vkb21haW5zX2luaXQoKTsKKwlvbWFwNDR4eF9wb3dlcmRvbWFpbnNfaW5pdCgpOworCW9tYXA0NHh4X2Nsb2NrZG9tYWluc19pbml0KCk7CisJb21hcDQ0eHhfaHdtb2RfaW5pdCgpOworCW9tYXBfaHdtb2RfaW5pdF9wb3N0c2V0dXAoKTsKKwlvbWFwNHh4eF9jbGtfaW5pdCgpOworfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IG9tYXBfc2RyY19pbml0KHN0cnVjdCBvbWFwX3NkcmNfcGFyYW1zICpzZHJjX2NzMCwKIAkJCQkgICAgICBzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtcyAqc2RyY19jczEpCiB7CisJb21hcF9zcmFtX2luaXQoKTsKKwogCWlmIChjcHVfaXNfb21hcDI0eHgoKSB8fCBvbWFwM19oYXNfc2RyYygpKSB7CiAJCW9tYXAyX3NkcmNfaW5pdChzZHJjX2NzMCwgc2RyY19jczEpOwogCQlfb21hcDJfaW5pdF9yZXByb2dyYW1fc2RyYygpOwogCX0KLQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5oCmluZGV4IGZkMjMwYzYuLmU2OWRlMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmgKQEAgLTEsNyArMCwwIEBACi0KLSNpZm5kZWYgX19NQUNIX09NQVAyX0lPX0hfXwotI2RlZmluZSBfX01BQ0hfT01BUDJfSU9fSF9fCi0KLWV4dGVybiBpbnQgX19pbml0IG9tYXBfc3JhbV9pbml0KHZvaWQpOwotCi0jZW5kaWYgLyogIF9fTUFDSF9PTUFQMl9JT19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW9tbXUyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvbW11Mi5jCmluZGV4IGYyODYwMTIuLmVlZmMzNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW9tbXUyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pb21tdTIuYwpAQCAtNjYsNyArNjYsNyBAQAogCSAoKHBnc3opID09IE1NVV9DQU1fUEdTWl80SykgID8gMHhmZmZmZjAwMCA6IDApCiAKIAotc3RhdGljIHZvaWQgX19pb21tdV9zZXRfdHdsKHN0cnVjdCBpb21tdSAqb2JqLCBib29sIG9uKQorc3RhdGljIHZvaWQgX19pb21tdV9zZXRfdHdsKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIGJvb2wgb24pCiB7CiAJdTMyIGwgPSBpb21tdV9yZWFkX3JlZyhvYmosIE1NVV9DTlRMKTsKIApAQCAtODUsNyArODUsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgb21hcDJfaW9tbXVfZW5hYmxlKHN0cnVjdCBpb21tdSAqb2JqKQorc3RhdGljIGludCBvbWFwMl9pb21tdV9lbmFibGUoc3RydWN0IG9tYXBfaW9tbXUgKm9iaikKIHsKIAl1MzIgbCwgcGE7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwpAQCAtMTI3LDcgKzEyNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG9tYXAyX2lvbW11X2Rpc2FibGUoc3RydWN0IGlvbW11ICpvYmopCitzdGF0aWMgdm9pZCBvbWFwMl9pb21tdV9kaXNhYmxlKHN0cnVjdCBvbWFwX2lvbW11ICpvYmopCiB7CiAJdTMyIGwgPSBpb21tdV9yZWFkX3JlZyhvYmosIE1NVV9DTlRMKTsKIApAQCAtMTM4LDEyICsxMzgsMTIgQEAKIAlkZXZfZGJnKG9iai0+ZGV2LCAiJXMgaXMgc2h1dHRpbmcgZG93blxuIiwgb2JqLT5uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgb21hcDJfaW9tbXVfc2V0X3R3bChzdHJ1Y3QgaW9tbXUgKm9iaiwgYm9vbCBvbikKK3N0YXRpYyB2b2lkIG9tYXAyX2lvbW11X3NldF90d2woc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgYm9vbCBvbikKIHsKIAlfX2lvbW11X3NldF90d2wob2JqLCBmYWxzZSk7CiB9CiAKLXN0YXRpYyB1MzIgb21hcDJfaW9tbXVfZmF1bHRfaXNyKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgKnJhKQorc3RhdGljIHUzMiBvbWFwMl9pb21tdV9mYXVsdF9pc3Ioc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyICpyYSkKIHsKIAl1MzIgc3RhdCwgZGE7CiAJdTMyIGVycnMgPSAwOwpAQCAtMTczLDEzICsxNzMsMTMgQEAKIAlyZXR1cm4gZXJyczsKIH0KIAotc3RhdGljIHZvaWQgb21hcDJfdGxiX3JlYWRfY3Ioc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcikKK3N0YXRpYyB2b2lkIG9tYXAyX3RsYl9yZWFkX2NyKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcikKIHsKIAljci0+Y2FtID0gaW9tbXVfcmVhZF9yZWcob2JqLCBNTVVfUkVBRF9DQU0pOwogCWNyLT5yYW0gPSBpb21tdV9yZWFkX3JlZyhvYmosIE1NVV9SRUFEX1JBTSk7CiB9CiAKLXN0YXRpYyB2b2lkIG9tYXAyX3RsYl9sb2FkX2NyKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IpCitzdGF0aWMgdm9pZCBvbWFwMl90bGJfbG9hZF9jcihzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IpCiB7CiAJaW9tbXVfd3JpdGVfcmVnKG9iaiwgY3ItPmNhbSB8IE1NVV9DQU1fViwgTU1VX0NBTSk7CiAJaW9tbXVfd3JpdGVfcmVnKG9iaiwgY3ItPnJhbSwgTU1VX1JBTSk7CkBAIC0xOTMsNyArMTkzLDggQEAKIAlyZXR1cm4gY3ItPmNhbSAmIG1hc2s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY3JfcmVncyAqb21hcDJfYWxsb2NfY3Ioc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKK3N0YXRpYyBzdHJ1Y3QgY3JfcmVncyAqb21hcDJfYWxsb2NfY3Ioc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwKKwkJCQkJCXN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKIHsKIAlzdHJ1Y3QgY3JfcmVncyAqY3I7CiAKQEAgLTIzMCw3ICsyMzEsOCBAQAogCXJldHVybiBhdHRyOwogfQogCi1zdGF0aWMgc3NpemVfdCBvbWFwMl9kdW1wX2NyKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90CitvbWFwMl9kdW1wX2NyKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjciwgY2hhciAqYnVmKQogewogCWNoYXIgKnAgPSBidWY7CiAKQEAgLTI1NCw3ICsyNTYsOCBAQAogCQkJZ290byBvdXQ7CQkJCQlcCiAJfSB3aGlsZSAoMCkKIAotc3RhdGljIHNzaXplX3Qgb21hcDJfaW9tbXVfZHVtcF9jdHgoc3RydWN0IGlvbW11ICpvYmosIGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4pCitzdGF0aWMgc3NpemVfdAorb21hcDJfaW9tbXVfZHVtcF9jdHgoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGxlbikKIHsKIAljaGFyICpwID0gYnVmOwogCkBAIC0yODAsNyArMjgzLDcgQEAKIAlyZXR1cm4gcCAtIGJ1ZjsKIH0KIAotc3RhdGljIHZvaWQgb21hcDJfaW9tbXVfc2F2ZV9jdHgoc3RydWN0IGlvbW11ICpvYmopCitzdGF0aWMgdm9pZCBvbWFwMl9pb21tdV9zYXZlX2N0eChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKQogewogCWludCBpOwogCXUzMiAqcCA9IG9iai0+Y3R4OwpAQCAtMjkzLDcgKzI5Niw3IEBACiAJQlVHX09OKHBbMF0gIT0gSU9NTVVfQVJDSF9WRVJTSU9OKTsKIH0KIAotc3RhdGljIHZvaWQgb21hcDJfaW9tbXVfcmVzdG9yZV9jdHgoc3RydWN0IGlvbW11ICpvYmopCitzdGF0aWMgdm9pZCBvbWFwMl9pb21tdV9yZXN0b3JlX2N0eChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKQogewogCWludCBpOwogCXUzMiAqcCA9IG9iai0+Y3R4OwpAQCAtMzQzLDEzICszNDYsMTMgQEAKIAogc3RhdGljIGludCBfX2luaXQgb21hcDJfaW9tbXVfaW5pdCh2b2lkKQogewotCXJldHVybiBpbnN0YWxsX2lvbW11X2FyY2goJm9tYXAyX2lvbW11X29wcyk7CisJcmV0dXJuIG9tYXBfaW5zdGFsbF9pb21tdV9hcmNoKCZvbWFwMl9pb21tdV9vcHMpOwogfQogbW9kdWxlX2luaXQob21hcDJfaW9tbXVfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBvbWFwMl9pb21tdV9leGl0KHZvaWQpCiB7Ci0JdW5pbnN0YWxsX2lvbW11X2FyY2goJm9tYXAyX2lvbW11X29wcyk7CisJb21hcF91bmluc3RhbGxfaW9tbXVfYXJjaCgmb21hcDJfaW9tbXVfb3BzKTsKIH0KIG1vZHVsZV9leGl0KG9tYXAyX2lvbW11X2V4aXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pcnEuYwppbmRleCAzYTEyZjc1Li42NWYxYmU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaXJxLmMKQEAgLTE2NSw4ICsxNjUsOCBAQAogCiAJCW9tYXBfaXJxX2JhbmtfaW5pdF9vbmUoYmFuayk7CiAKLQkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBiYW5rLT5ucl9pcnFzOyBpICs9IDMyLCBqICs9IDB4MjApCi0JCQlvbWFwX2FsbG9jX2djKGJhbmstPmJhc2VfcmVnICsgaiwgaSwgMzIpOworCQlmb3IgKGogPSAwOyBqIDwgYmFuay0+bnJfaXJxczsgaiArPSAzMikKKwkJCW9tYXBfYWxsb2NfZ2MoYmFuay0+YmFzZV9yZWcgKyBqLCBqLCAzMik7CiAKIAkJbnJfb2ZfaXJxcyArPSBiYW5rLT5ucl9pcnFzOwogCQlucl9iYW5rcysrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tYWlsYm94LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYwppbmRleCA4NmQ1NjRhLi42MDllYTJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYwpAQCAtMTAsNiArMTAsNyBAQAogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMKaW5kZXggNGE2ZWY2YS4uMjkyZWVlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbWNic3AuYwpAQCAtMjcsNjYgKzI3LDY5IEBACiAKICNpbmNsdWRlICJjb250cm9sLmgiCiAKLS8qIE1jQlNQIGludGVybmFsIHNpZ25hbCBtdXhpbmcgZnVuY3Rpb25zICovCisvKgorICogRklYTUU6IEZpbmQgYSBtZWNoYW5pc20gdG8gZW5hYmxlL2Rpc2FibGUgcnVudGltZSB0aGUgTWNCU1AgSUNMSyBhdXRvaWRsZS4KKyAqIFNpZGV0b25lIG5lZWRzIG5vbi1nYXRlZCBJQ0xLIGFuZCBzaWRldG9uZSBhdXRvaWRsZSBpcyBicm9rZW4uCisgKi8KKyNpbmNsdWRlICJjbTJ4eHhfM3h4eC5oIgorI2luY2x1ZGUgImNtLXJlZ2JpdHMtMzR4eC5oIgogCi12b2lkIG9tYXAyX21jYnNwMV9tdXhfY2xrcl9zcmModTggbXV4KQorLyogTWNCU1AgaW50ZXJuYWwgc2lnbmFsIG11eGluZyBmdW5jdGlvbiAqLworc3RhdGljIGludCBvbWFwMl9tY2JzcDFfbXV4X3J4X2NsayhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnNpZ25hbCwKKwkJCQkgICBjb25zdCBjaGFyICpzcmMpCiB7CiAJdTMyIHY7CiAKIAl2ID0gb21hcF9jdHJsX3JlYWRsKE9NQVAyX0NPTlRST0xfREVWQ09ORjApOwotCWlmIChtdXggPT0gQ0xLUl9TUkNfQ0xLUikKLQkJdiAmPSB+T01BUDJfTUNCU1AxX0NMS1JfTUFTSzsKLQllbHNlIGlmIChtdXggPT0gQ0xLUl9TUkNfQ0xLWCkKLQkJdiB8PSBPTUFQMl9NQ0JTUDFfQ0xLUl9NQVNLOwotCW9tYXBfY3RybF93cml0ZWwodiwgT01BUDJfQ09OVFJPTF9ERVZDT05GMCk7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXAyX21jYnNwMV9tdXhfY2xrcl9zcmMpOwogCi12b2lkIG9tYXAyX21jYnNwMV9tdXhfZnNyX3NyYyh1OCBtdXgpCi17Ci0JdTMyIHY7CisJaWYgKCFzdHJjbXAoc2lnbmFsLCAiY2xrciIpKSB7CisJCWlmICghc3RyY21wKHNyYywgImNsa3IiKSkKKwkJCXYgJj0gfk9NQVAyX01DQlNQMV9DTEtSX01BU0s7CisJCWVsc2UgaWYgKCFzdHJjbXAoc3JjLCAiY2xreCIpKQorCQkJdiB8PSBPTUFQMl9NQ0JTUDFfQ0xLUl9NQVNLOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc2lnbmFsLCAiZnNyIikpIHsKKwkJaWYgKCFzdHJjbXAoc3JjLCAiZnNyIikpCisJCQl2ICY9IH5PTUFQMl9NQ0JTUDFfRlNSX01BU0s7CisJCWVsc2UgaWYgKCFzdHJjbXAoc3JjLCAiZnN4IikpCisJCQl2IHw9IE9NQVAyX01DQlNQMV9GU1JfTUFTSzsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JdiA9IG9tYXBfY3RybF9yZWFkbChPTUFQMl9DT05UUk9MX0RFVkNPTkYwKTsKLQlpZiAobXV4ID09IEZTUl9TUkNfRlNSKQotCQl2ICY9IH5PTUFQMl9NQ0JTUDFfRlNSX01BU0s7Ci0JZWxzZSBpZiAobXV4ID09IEZTUl9TUkNfRlNYKQotCQl2IHw9IE9NQVAyX01DQlNQMV9GU1JfTUFTSzsKIAlvbWFwX2N0cmxfd3JpdGVsKHYsIE9NQVAyX0NPTlRST0xfREVWQ09ORjApOworCisJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKG9tYXAyX21jYnNwMV9tdXhfZnNyX3NyYyk7CiAKIC8qIE1jQlNQIENMS1Mgc291cmNlIHN3aXRjaGluZyBmdW5jdGlvbiAqLwotCi1pbnQgb21hcDJfbWNic3Bfc2V0X2Nsa3Nfc3JjKHU4IGlkLCB1OCBmY2tfc3JjX2lkKQorc3RhdGljIGludCBvbWFwMl9tY2JzcF9zZXRfY2xrX3NyYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjbGsgKmNsaywKKwkJCQkgICBjb25zdCBjaGFyICpzcmMpCiB7Ci0Jc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwogCXN0cnVjdCBjbGsgKmZja19zcmM7CiAJY2hhciAqZmNrX3NyY19uYW1lOwogCWludCByOwogCi0JaWYgKCFvbWFwX21jYnNwX2NoZWNrX3ZhbGlkX2lkKGlkKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGlkICglZClcbiIsIF9fZnVuY19fLCBpZCArIDEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOwotCi0JaWYgKGZja19zcmNfaWQgPT0gTUNCU1BfQ0xLU19QQURfU1JDKQorCWlmICghc3RyY21wKHNyYywgImNsa3NfZXh0IikpCiAJCWZja19zcmNfbmFtZSA9ICJwYWRfZmNrIjsKLQllbHNlIGlmIChmY2tfc3JjX2lkID09IE1DQlNQX0NMS1NfUFJDTV9TUkMpCisJZWxzZSBpZiAoIXN0cmNtcChzcmMsICJjbGtzX2ZjbGsiKSkKIAkJZmNrX3NyY19uYW1lID0gInByY21fZmNrIjsKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZmNrX3NyYyA9IGNsa19nZXQobWNic3AtPmRldiwgZmNrX3NyY19uYW1lKTsKKwlmY2tfc3JjID0gY2xrX2dldChkZXYsIGZja19zcmNfbmFtZSk7CiAJaWYgKElTX0VSUl9PUl9OVUxMKGZja19zcmMpKSB7CiAJCXByX2Vycigib21hcC1tY2JzcDogJXM6IGNvdWxkIG5vdCBjbGtfZ2V0KCkgJXNcbiIsICJjbGtzIiwKIAkJICAgICAgIGZja19zcmNfbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBtX3J1bnRpbWVfcHV0X3N5bmMobWNic3AtPmRldik7CisJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOwogCi0JciA9IGNsa19zZXRfcGFyZW50KG1jYnNwLT5mY2xrLCBmY2tfc3JjKTsKKwlyID0gY2xrX3NldF9wYXJlbnQoY2xrLCBmY2tfc3JjKTsKIAlpZiAoSVNfRVJSX1ZBTFVFKHIpKSB7CiAJCXByX2Vycigib21hcC1tY2JzcDogJXM6IGNvdWxkIG5vdCBjbGtfc2V0X3BhcmVudCgpIHRvICVzXG4iLAogCQkgICAgICAgImNsa3MiLCBmY2tfc3JjX25hbWUpOwpAQCAtOTQsMjEgKzk3LDMwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBtX3J1bnRpbWVfZ2V0X3N5bmMobWNic3AtPmRldik7CisJcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOwogCiAJY2xrX3B1dChmY2tfc3JjKTsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChvbWFwMl9tY2JzcF9zZXRfY2xrc19zcmMpOwogCi1zdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwMl9tY2JzcF9sYXRlbmN5W10gPSB7Ci0JewotCQkuZGVhY3RpdmF0ZV9mdW5jID0gb21hcF9kZXZpY2VfaWRsZV9od21vZHMsCi0JCS5hY3RpdmF0ZV9mdW5jICAgPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MgPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNULAotCX0sCi19Oworc3RhdGljIGludCBvbWFwM19lbmFibGVfc3RfY2xvY2sodW5zaWduZWQgaW50IGlkLCBib29sIGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgdzsKKworCS8qCisJICogU2lkZXRvbmUgdXNlcyBNY0JTUCBJQ0xLIC0gd2hpY2ggbXVzdCBub3QgaWRsZSB3aGVuIHNpZGV0b25lcworCSAqIGFyZSBlbmFibGVkIG9yIHNpZGV0b25lcyBzdGFydCBzb3VuZGluZyB1Z2x5LgorCSAqLworCXcgPSBvbWFwMl9jbV9yZWFkX21vZF9yZWcoT01BUDM0MzBfUEVSX01PRCwgQ01fQVVUT0lETEUpOworCWlmIChlbmFibGUpCisJCXcgJj0gfigxIDw8IChpZCAtIDIpKTsKKwllbHNlCisJCXcgfD0gMSA8PCAoaWQgLSAyKTsKKwlvbWFwMl9jbV93cml0ZV9tb2RfcmVnKHcsIE9NQVAzNDMwX1BFUl9NT0QsIENNX0FVVE9JRExFKTsKKworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IG9tYXBfaW5pdF9tY2JzcChzdHJ1Y3Qgb21hcF9od21vZCAqb2gsIHZvaWQgKnVudXNlZCkKIHsKQEAgLTExNiw3ICsxMjgsNyBAQAogCWNoYXIgKm5hbWUgPSAib21hcC1tY2JzcCI7CiAJc3RydWN0IG9tYXBfaHdtb2QgKm9oX2RldmljZVsyXTsKIAlzdHJ1Y3Qgb21hcF9tY2JzcF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCiAJc3NjYW5mKG9oLT5uYW1lLCAibWNic3AlZCIsICZpZCk7CiAKQEAgLTEyNiw3ICsxMzgsMTMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcGRhdGEtPm1jYnNwX2NvbmZpZ190eXBlID0gb2gtPmNsYXNzLT5yZXY7CisJcGRhdGEtPnJlZ19zdGVwID0gNDsKKwlpZiAob2gtPmNsYXNzLT5yZXYgPCBNQ0JTUF9DT05GSUdfVFlQRTIpIHsKKwkJcGRhdGEtPnJlZ19zaXplID0gMjsKKwl9IGVsc2UgeworCQlwZGF0YS0+cmVnX3NpemUgPSA0OworCQlwZGF0YS0+aGFzX2NjciA9IHRydWU7CisJfQogCiAJaWYgKG9oLT5jbGFzcy0+cmV2ID09IE1DQlNQX0NPTkZJR19UWVBFMykgewogCQlpZiAoaWQgPT0gMikKQEAgLTEzNywyMiArMTU1LDI4IEBACiAJCQlwZGF0YS0+YnVmZmVyX3NpemUgPSAweDgwOwogCX0KIAorCWlmIChvaC0+Y2xhc3MtPnJldiA+PSBNQ0JTUF9DT05GSUdfVFlQRTMpCisJCXBkYXRhLT5oYXNfd2FrZXVwID0gdHJ1ZTsKKwogCW9oX2RldmljZVswXSA9IG9oOwogCiAJaWYgKG9oLT5kZXZfYXR0cikgewogCQlvaF9kZXZpY2VbMV0gPSBvbWFwX2h3bW9kX2xvb2t1cCgoCiAJCShzdHJ1Y3Qgb21hcF9tY2JzcF9kZXZfYXR0ciAqKShvaC0+ZGV2X2F0dHIpKS0+c2lkZXRvbmUpOworCQlwZGF0YS0+ZW5hYmxlX3N0X2Nsb2NrID0gb21hcDNfZW5hYmxlX3N0X2Nsb2NrOwogCQljb3VudCsrOwogCX0KLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkX3NzKG5hbWUsIGlkLCBvaF9kZXZpY2UsIGNvdW50LCBwZGF0YSwKLQkJCQlzaXplb2YoKnBkYXRhKSwgb21hcDJfbWNic3BfbGF0ZW5jeSwKLQkJCQlBUlJBWV9TSVpFKG9tYXAyX21jYnNwX2xhdGVuY3kpLCBmYWxzZSk7CisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkX3NzKG5hbWUsIGlkLCBvaF9kZXZpY2UsIGNvdW50LCBwZGF0YSwKKwkJCQlzaXplb2YoKnBkYXRhKSwgTlVMTCwgMCwgZmFsc2UpOwogCWtmcmVlKHBkYXRhKTsKLQlpZiAoSVNfRVJSKG9kKSkgIHsKKwlpZiAoSVNfRVJSKHBkZXYpKSAgewogCQlwcl9lcnIoIiVzOiBDYW4ndCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXM6JXMuXG4iLCBfX2Z1bmNfXywKIAkJCQkJbmFtZSwgb2gtPm5hbWUpOwotCQlyZXR1cm4gUFRSX0VSUihvZCk7CisJCXJldHVybiBQVFJfRVJSKHBkZXYpOwogCX0KKwlwZGF0YS0+c2V0X2Nsa19zcmMgPSBvbWFwMl9tY2JzcF9zZXRfY2xrX3NyYzsKKwlpZiAoaWQgPT0gMSkKKwkJcGRhdGEtPm11eF9zaWduYWwgPSBvbWFwMl9tY2JzcDFfbXV4X3J4X2NsazsKIAlvbWFwX21jYnNwX2NvdW50Kys7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtaW9tbXUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1pb21tdS5jCmluZGV4IGU2MWZlYWQuLmI4ODIyMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1pb21tdS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1pb21tdS5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxwbGF0L2lvbW11Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtc21wLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtc21wLmMKaW5kZXggODg5NDY0ZC4uNDQxMmRkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1zbXAuYwpAQCAtMTAyLDggKzEwMiwxMSBAQAogewogCXVuc2lnbmVkIGludCBpLCBuY29yZXM7CiAKLQkvKiBOZXZlciByZWxlYXNlZCAqLwotCXNjdV9iYXNlID0gaW9yZW1hcChPTUFQNDRYWF9TQ1VfQkFTRSwgU1pfMjU2KTsKKwkvKgorCSAqIEN1cnJlbnRseSB3ZSBjYW4ndCBjYWxsIGlvcmVtYXAgaGVyZSBiZWNhdXNlCisJICogU29DIGRldGVjdGlvbiB3b24ndCB3b3JrIHVudGlsIGFmdGVyIGluaXRfZWFybHkuCisJICovCisJc2N1X2Jhc2UgPSAgT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQNDRYWF9TQ1VfQkFTRSk7CiAJQlVHX09OKCFzY3VfYmFzZSk7CiAKIAluY29yZXMgPSBzY3VfZ2V0X2NvcmVfY291bnQoc2N1X2Jhc2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYwppbmRleCA4NGNjMGJkLi42YjMwODhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYwpAQCAtMTk1NCw5ICsxOTU0LDYgQEAKIAogCWkgPSAwOwogCWRvIHsKLQkJaWYgKCFvbWFwX2NoaXBfaXMob2hzW2ldLT5vbWFwX2NoaXApKQotCQkJY29udGludWU7Ci0KIAkJciA9IF9yZWdpc3RlcihvaHNbaV0pOwogCQlXQVJOKHIsICJvbWFwX2h3bW9kOiAlczogX3JlZ2lzdGVyIHJldHVybmVkICVkXG4iLCBvaHNbaV0tPm5hbWUsCiAJCSAgICAgcik7CkBAIC0yNjI4LDcgKzI2MjUsNyBAQAogICogUmV0dXJucyB0aGUgY29udGV4dCBsb3NzIGNvdW50IG9mIHRoZSBwb3dlcmRvbWFpbiBhc3NvY2F0ZWQgd2l0aCBAb2gKICAqIHVwb24gc3VjY2Vzcywgb3IgemVybyBpZiBubyBwb3dlcmRvbWFpbiBleGlzdHMgZm9yIEBvaC4KICAqLwotdTMyIG9tYXBfaHdtb2RfZ2V0X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3Qgb21hcF9od21vZCAqb2gpCitpbnQgb21hcF9od21vZF9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBvbWFwX2h3bW9kICpvaCkKIHsKIAlzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtOwogCWludCByZXQgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzI0MjBfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzI0MjBfZGF0YS5jCmluZGV4IGEwMTVjNjkuLjZkNzIwNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yNDIwX2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMjQyMF9kYXRhLmMKQEAgLTEwMCw3ICsxMDAsNiBAQAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbDNfbWFpbl9tYXN0ZXJzKSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX2wzX21haW5fc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9sM19tYWluX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0yMDYsNyArMjA1LDYgQEAKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2w0X2NvcmVfbWFzdGVycyksCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF9sNF9jb3JlX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbDRfY29yZV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMjI3LDcgKzIyNSw2IEBACiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9sNF93a3VwX21hc3RlcnMpLAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfbDRfd2t1cF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2w0X3drdXBfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTI0Myw3ICsyNDAsNiBAQAogCS5tYWluX2Nsawk9ICJtcHVfY2siLAogCS5tYXN0ZXJzCT0gb21hcDI0MjBfbXB1X21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tcHVfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogLyoKQEAgLTI3MSw3ICsyNjcsMTYgQEAKIAkuY2xhc3MJCT0gJml2YV9od21vZF9jbGFzcywKIAkubWFzdGVycwk9IG9tYXAyNDIwX2l2YV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfaXZhX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQorfTsKKworLyogYWx3YXlzLW9uIHRpbWVycyBkZXYgYXR0cmlidXRlICovCitzdGF0aWMgc3RydWN0IG9tYXBfdGltZXJfY2FwYWJpbGl0eV9kZXZfYXR0ciBjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyID0geworCS50aW1lcl9jYXBhYmlsaXR5ICAgICAgID0gT01BUF9USU1FUl9BTFdPTiwKK307CisKKy8qIHB3bSB0aW1lcnMgZGV2IGF0dHJpYnV0ZSAqLworc3RhdGljIHN0cnVjdCBvbWFwX3RpbWVyX2NhcGFiaWxpdHlfZGV2X2F0dHIgY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIgPSB7CisJLnRpbWVyX2NhcGFiaWxpdHkgICAgICAgPSBPTUFQX1RJTUVSX0hBU19QV00sCiB9OwogCiAvKiB0aW1lcjEgKi8KQEAgLTMxNCwxMCArMzE5LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUMV9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXIxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIxX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyMiAqLwpAQCAtMzUxLDEwICszNTYsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQyX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogdGltZXIzICovCkBAIC0zODgsMTAgKzM5MywxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDNfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyM19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjQgKi8KQEAgLTQyNSwxMCArNDMwLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUNF9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXI0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXI0X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyNSAqLwpAQCAtNDYyLDEwICs0NjcsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQ1X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjVfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogCkBAIC01MDAsMTAgKzUwNSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDZfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyNl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyNl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjcgKi8KQEAgLTUzNywxMCArNTQyLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUN19TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXI3X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXI3X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyOCAqLwpAQCAtNTc0LDEwICs1NzksMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQ4X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjhfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjhfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogdGltZXI5ICovCkBAIC02MTEsMTAgKzYxNiwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDlfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjlfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjlfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogdGltZXIxMCAqLwpAQCAtNjQ4LDEwICs2NTMsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQxMF9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyMTBfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjEwX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyMTEgKi8KQEAgLTY4NSwxMCArNjkwLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUMTFfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjExX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIxMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjEyICovCkBAIC03MjIsMTAgKzcyNywxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDEyX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXIxMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyMTJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogbDRfd2t1cCAtPiB3ZF90aW1lcjIgKi8KQEAgLTc2Niw3ICs3NzEsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF93ZF90aW1lcjJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF93ZF90aW1lcjJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBVQVJUMSAqLwpAQCAtNzkyLDcgKzc5Niw2IEBACiAJLnNsYXZlcwkJPSBvbWFwMjQyMF91YXJ0MV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3VhcnQxX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIFVBUlQyICovCkBAIC04MTgsNyArODIxLDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3VhcnQyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdWFydDJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogLyogVUFSVDMgKi8KQEAgLTg0NCw3ICs4NDYsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdWFydDNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF91YXJ0M19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJfdWFydF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBkc3MgKi8KQEAgLTg5OCw3ICs4OTksNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9kc3Nfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXAyNDIwX2Rzc19tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZHNzX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtOTM4LDcgKzkzOCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX2Rzc19kaXNwY19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2Rzc19kaXNwY19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtOTc1LDcgKzk3NCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX2Rzc19yZmJpX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZHNzX3JmYmlfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTEwMTMsNyArMTAxMSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX2Rzc192ZW5jX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZHNzX3ZlbmNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTEwNjQsNyArMTA2MSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2kyYzFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJmkyY19jbGFzcywKIAkuZGV2X2F0dHIJPSAmaTJjX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfMTZCSVRfUkVHLAogfTsKIApAQCAtMTA5Miw3ICsxMDg4LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfaTJjMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmaTJjX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZpMmNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogCS5mbGFncwkJPSBIV01PRF8xNkJJVF9SRUcsCiB9OwogCkBAIC0xMTk3LDcgKzExOTIsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9ncGlvMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBncGlvMiAqLwpAQCAtMTIyMyw3ICsxMjE3LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZ3BpbzJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogLyogZ3BpbzMgKi8KQEAgLTEyNDksNyArMTI0Miw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2dwaW8zX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIGdwaW80ICovCkBAIC0xMjc1LDcgKzEyNjcsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9ncGlvNF9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBkbWEgYXR0cmlidXRlcyAqLwpAQCAtMTMyMiw3ICsxMzEzLDYgQEAKIAkubWFzdGVycwk9IG9tYXAyNDIwX2RtYV9zeXN0ZW1fbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2RtYV9zeXN0ZW1fbWFzdGVycyksCiAJLmRldl9hdHRyCT0gJmRtYV9kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTEzNjMsNyArMTM1Myw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX21haWxib3hfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tYWlsYm94X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogLyogbWNzcGkxICovCkBAIC0xMzkzLDcgKzEzODIsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tY3NwaTFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X21jc3BpX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZvbWFwX21jc3BpMV9kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBtY3NwaTIgKi8KQEAgLTE0MjMsNyArMTQxMSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21jc3BpMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfbWNzcGlfY2xhc3MsCiAJLmRldl9hdHRyCT0gJm9tYXBfbWNzcGkyX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qCkBAIC0xNDczLDcgKzE0NjAsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF9tY2JzcDFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9tY2JzcDFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBtY2JzcDIgKi8KQEAgLTE1MTQsNyArMTUwMCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX21jYnNwMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21jYnNwMl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvbWFwX2h3bW9kICpvbWFwMjQyMF9od21vZHNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yNDMwX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yNDMwX2RhdGEuYwppbmRleCA0MDgxOTNkLi5hMjU4MGQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMjQzMF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzI0MzBfZGF0YS5jCkBAIC0xMTAsNyArMTEwLDYgQEAKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2wzX21haW5fbWFzdGVycyksCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9sM19tYWluX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbDNfbWFpbl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMjUwLDcgKzI0OSw2IEBACiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9sNF9jb3JlX21hc3RlcnMpLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfbDRfY29yZV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2w0X2NvcmVfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTMwMSw3ICsyOTksNiBAQAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbDRfd2t1cF9tYXN0ZXJzKSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX2w0X3drdXBfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9sNF93a3VwX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0zMTcsNyArMzE0LDYgQEAKIAkubWFpbl9jbGsJPSAibXB1X2NrIiwKIAkubWFzdGVycwk9IG9tYXAyNDMwX21wdV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbXB1X21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qCkBAIC0zNDUsNyArMzQxLDE2IEBACiAJLmNsYXNzCQk9ICZpdmFfaHdtb2RfY2xhc3MsCiAJLm1hc3RlcnMJPSBvbWFwMjQzMF9pdmFfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2l2YV9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKK307CisKKy8qIGFsd2F5cy1vbiB0aW1lcnMgZGV2IGF0dHJpYnV0ZSAqLworc3RhdGljIHN0cnVjdCBvbWFwX3RpbWVyX2NhcGFiaWxpdHlfZGV2X2F0dHIgY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciA9IHsKKwkudGltZXJfY2FwYWJpbGl0eSAgICAgICA9IE9NQVBfVElNRVJfQUxXT04sCit9OworCisvKiBwd20gdGltZXJzIGRldiBhdHRyaWJ1dGUgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF90aW1lcl9jYXBhYmlsaXR5X2Rldl9hdHRyIGNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyID0geworCS50aW1lcl9jYXBhYmlsaXR5ICAgICAgID0gT01BUF9USU1FUl9IQVNfUFdNLAogfTsKIAogLyogdGltZXIxICovCkBAIC0zODgsMTAgKzM5MywxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDFfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjIgKi8KQEAgLTQyNSwxMCArNDMwLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUMl9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXIyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyMyAqLwpAQCAtNDYyLDEwICs0NjcsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQzX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjNfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXI0ICovCkBAIC00OTksMTAgKzUwNCwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDRfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyNF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyNF9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjUgKi8KQEAgLTUzNiwxMCArNTQxLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUNV9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXI1X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI1X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyNiAqLwpAQCAtNTczLDEwICs1NzgsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQ2X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjZfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjZfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXI3ICovCkBAIC02MTAsMTAgKzYxNSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDdfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyN19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyN19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjggKi8KQEAgLTY0NywxMCArNjUyLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUOF9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXI4X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI4X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyOSAqLwpAQCAtNjg0LDEwICs2ODksMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQ5X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXI5X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI5X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyMTAgKi8KQEAgLTcyMSwxMCArNzI2LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUMTBfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjEwX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIxMF9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjExICovCkBAIC03NTgsMTAgKzc2MywxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDExX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXIxMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyMTFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXIxMiAqLwpAQCAtNzk1LDEwICs4MDAsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQxMl9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyMTJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjEyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIGw0X3drdXAgLT4gd2RfdGltZXIyICovCkBAIC04MzksNyArODQ0LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfd2RfdGltZXIyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfd2RfdGltZXIyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogVUFSVDEgKi8KQEAgLTg2NSw3ICs4NjksNiBAQAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdWFydDFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF91YXJ0MV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJfdWFydF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBVQVJUMiAqLwpAQCAtODkxLDcgKzg5NCw2IEBACiAJLnNsYXZlcwkJPSBvbWFwMjQzMF91YXJ0Ml9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3VhcnQyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIFVBUlQzICovCkBAIC05MTcsNyArOTE5LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3VhcnQzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdWFydDNfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogZHNzICovCkBAIC05NjUsNyArOTY2LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZHNzX3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwMjQzMF9kc3NfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2Rzc19tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTk5OSw3ICs5OTksNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9kc3NfZGlzcGNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9kc3NfZGlzcGNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTEwMzAsNyArMTAyOSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX2Rzc19yZmJpX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZHNzX3JmYmlfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTEwNjIsNyArMTA2MCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX2Rzc192ZW5jX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZHNzX3ZlbmNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTExMjMsNyArMTEyMCw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2kyYzFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJmkyY19jbGFzcywKIAkuZGV2X2F0dHIJPSAmaTJjX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIEkyQzIgKi8KQEAgLTExNTEsNyArMTE0Nyw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2kyYzJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJmkyY19jbGFzcywKIAkuZGV2X2F0dHIJPSAmaTJjX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIGw0X3drdXAgLT4gZ3BpbzEgKi8KQEAgLTEyNzMsNyArMTI2OCw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2dwaW8xX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIGdwaW8yICovCkBAIC0xMjk5LDcgKzEyOTMsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9ncGlvMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBncGlvMyAqLwpAQCAtMTMyNSw3ICsxMzE4LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZ3BpbzNfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogZ3BpbzQgKi8KQEAgLTEzNTEsNyArMTM0Myw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2dwaW80X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIGdwaW81ICovCkBAIC0xMzgyLDcgKzEzNzMsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9ncGlvNV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBkbWEgYXR0cmlidXRlcyAqLwpAQCAtMTQyOSw3ICsxNDE5LDYgQEAKIAkubWFzdGVycwk9IG9tYXAyNDMwX2RtYV9zeXN0ZW1fbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2RtYV9zeXN0ZW1fbWFzdGVycyksCiAJLmRldl9hdHRyCT0gJmRtYV9kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTE0NjksNyArMTQ1OCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX21haWxib3hfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tYWlsYm94X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogbWNzcGkxICovCkBAIC0xNDk5LDcgKzE0ODcsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY3NwaTFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X21jc3BpX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZvbWFwX21jc3BpMV9kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBtY3NwaTIgKi8KQEAgLTE1MjksNyArMTUxNiw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jc3BpMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfbWNzcGlfY2xhc3MsCiAJLmRldl9hdHRyCT0gJm9tYXBfbWNzcGkyX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIG1jc3BpMyAqLwpAQCAtMTU3Miw3ICsxNTU4LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNzcGkzX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9tY3NwaV9jbGFzcywKIAkuZGV2X2F0dHIJPSAmb21hcF9tY3NwaTNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyoKQEAgLTE2MjgsNyArMTYxMyw2IEBACiAJICovCiAJLmZsYWdzCQk9IEhXTU9EX05PX09DUF9BVVRPSURMRSB8IEhXTU9EX1NXU1VQX1NJRExFCiAJCQkJfCBIV01PRF9TV1NVUF9NU1RBTkRCWSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qCkBAIC0xNjg5LDcgKzE2NzMsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9tY2JzcDFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY2JzcDFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBtY2JzcDIgKi8KQEAgLTE3MzEsNyArMTcxNCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX21jYnNwMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwMl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIG1jYnNwMyAqLwpAQCAtMTc4Myw3ICsxNzY1LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfbWNic3AzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNic3AzX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogbWNic3A0ICovCkBAIC0xODQxLDcgKzE4MjIsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9tY2JzcDRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY2JzcDRfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBtY2JzcDUgKi8KQEAgLTE4OTksNyArMTg3OSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX21jYnNwNV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwNV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIE1NQy9TRC9TRElPIGNvbW1vbiAqLwpAQCAtMTk2Niw3ICsxOTQ1LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX21tYzFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tbWMxX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMjQzMF9tbWNfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogTU1DL1NEL1NESU8yICovCkBAIC0yMDEwLDcgKzE5ODgsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfbW1jMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21tYzJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyNDMwX21tY19jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiBzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3Qgb21hcF9od21vZCAqb21hcDI0MzBfaHdtb2RzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfM3h4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfM3h4eF9kYXRhLmMKaW5kZXggMjViZjQzYi4uYmM5MDM1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzN4eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYwpAQCAtMTU2LDcgKzE1Niw2IEBACiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9sM19tYWluX21hc3RlcnMpLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbDNfbWFpbl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2wzX21haW5fc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTQ1OSw3ICs0NTgsNiBAQAogCS5jbGFzcwkJPSAmbDRfaHdtb2RfY2xhc3MsCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9sNF9jb3JlX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbDRfY29yZV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtNDc0LDcgKzQ3Miw2IEBACiAJLmNsYXNzCQk9ICZsNF9od21vZF9jbGFzcywKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X2w0X3Blcl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2w0X3Blcl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtNDg5LDcgKzQ4Niw2IEBACiAJLmNsYXNzCQk9ICZsNF9od21vZF9jbGFzcywKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X2w0X3drdXBfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9sNF93a3VwX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC01MDUsNyArNTAxLDYgQEAKIAkubWFpbl9jbGsJPSAiYXJtX2ZjayIsCiAJLm1hc3RlcnMJPSBvbWFwM3h4eF9tcHVfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21wdV9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKgpAQCAtNTMzLDcgKzUyOCw2IEBACiAJLmNsYXNzCQk9ICZpdmFfaHdtb2RfY2xhc3MsCiAJLm1hc3RlcnMJPSBvbWFwM3h4eF9pdmFfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2l2YV9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHRpbWVyIGNsYXNzICovCkBAIC01NzAsNiArNTY0LDIxIEBACiAJLnJldiA9ICBPTUFQX1RJTUVSX0lQX1ZFUlNJT05fMSwKIH07CiAKKy8qIHNlY3VyZSB0aW1lcnMgZGV2IGF0dHJpYnV0ZSAqLworc3RhdGljIHN0cnVjdCBvbWFwX3RpbWVyX2NhcGFiaWxpdHlfZGV2X2F0dHIgY2FwYWJpbGl0eV9zZWN1cmVfZGV2X2F0dHIgPSB7CisJLnRpbWVyX2NhcGFiaWxpdHkgICAgICAgPSBPTUFQX1RJTUVSX1NFQ1VSRSwKK307CisKKy8qIGFsd2F5cy1vbiB0aW1lcnMgZGV2IGF0dHJpYnV0ZSAqLworc3RhdGljIHN0cnVjdCBvbWFwX3RpbWVyX2NhcGFiaWxpdHlfZGV2X2F0dHIgY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciA9IHsKKwkudGltZXJfY2FwYWJpbGl0eSAgICAgICA9IE9NQVBfVElNRVJfQUxXT04sCit9OworCisvKiBwd20gdGltZXJzIGRldiBhdHRyaWJ1dGUgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF90aW1lcl9jYXBhYmlsaXR5X2Rldl9hdHRyIGNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyID0geworCS50aW1lcl9jYXBhYmlsaXR5ICAgICAgID0gT01BUF9USU1FUl9IQVNfUFdNLAorfTsKKwogLyogdGltZXIxICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDN4eHhfdGltZXIxX2h3bW9kOwogCkBAIC02MTAsMTAgKzYxOSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAzNDMwX1NUX0dQVDFfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3RpbWVyMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfdGltZXJfMW1zX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogdGltZXIyICovCkBAIC02NTYsMTAgKzY2NSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAzNDMwX1NUX0dQVDJfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3RpbWVyMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfdGltZXJfMW1zX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogdGltZXIzICovCkBAIC03MDIsMTAgKzcxMSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAzNDMwX1NUX0dQVDNfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3RpbWVyM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyM19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCiB9OwogCiAvKiB0aW1lcjQgKi8KQEAgLTc0OCwxMCArNzU3LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDM0MzBfU1RfR1BUNF9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXI0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXI0X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHRpbWVyNSAqLwpAQCAtNzk0LDEwICs4MDMsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMzQzMF9TVF9HUFQ1X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF90aW1lcjVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjVfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogdGltZXI2ICovCkBAIC04NDAsMTAgKzg0OSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAzNDMwX1NUX0dQVDZfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3RpbWVyNl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyNl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCiB9OwogCiAvKiB0aW1lcjcgKi8KQEAgLTg4NiwxMCArODk1LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDM0MzBfU1RfR1BUN19TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXI3X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXI3X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHRpbWVyOCAqLwpAQCAtOTMyLDEwICs5NDEsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMzQzMF9TVF9HUFQ4X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXI4X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXI4X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHRpbWVyOSAqLwpAQCAtOTc4LDEwICs5ODcsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMzQzMF9TVF9HUFQ5X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXI5X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXI5X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHRpbWVyMTAgKi8KQEAgLTEwMTUsMTAgKzEwMjQsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMzQzMF9TVF9HUFQxMF9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3RpbWVyMTBfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjEwX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl8xbXNfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCiB9OwogCiAvKiB0aW1lcjExICovCkBAIC0xMDUyLDEwICsxMDYxLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDM0MzBfU1RfR1BUMTFfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF90aW1lcjExX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXIxMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCiB9OwogCiAvKiB0aW1lcjEyKi8KQEAgLTExMDIsMTAgKzExMTEsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMzQzMF9TVF9HUFQxMl9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3NlY3VyZV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3RpbWVyMTJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjEyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIGw0X3drdXAgLT4gd2RfdGltZXIyICovCkBAIC0xMTgyLDcgKzExOTEsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF93ZF90aW1lcjJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF93ZF90aW1lcjJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiAJLyoKIAkgKiBYWFg6IFVzZSBzb2Z0d2FyZSBzdXBlcnZpc2VkIG1vZGUsIEhXIHN1cGVydmlzZWQgc21hcnRpZGxlIHNlZW1zIHRvCiAJICogYmxvY2sgQ09SRSBwb3dlciBkb21haW4gaWRsZSB0cmFuc2l0aW9ucy4gTWF5YmUgYSBIVyBidWcgaW4gd2R0Mj8KQEAgLTEyMTMsNyArMTIyMSw2IEBACiAJLnNsYXZlcwkJPSBvbWFwM3h4eF91YXJ0MV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3VhcnQxX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIFVBUlQyICovCkBAIC0xMjM5LDcgKzEyNDYsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdWFydDJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF91YXJ0Ml9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJfdWFydF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBVQVJUMyAqLwpAQCAtMTI2NSw3ICsxMjcxLDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3VhcnQzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdWFydDNfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogVUFSVDQgKi8KQEAgLTEzMDIsNyArMTMwNyw2IEBACiAJLnNsYXZlcwkJPSBvbWFwM3h4eF91YXJ0NF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3VhcnQ0X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNjMwRVMxKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBpMmNfY2xhc3MgPSB7CkBAIC0xMzkwLDcgKzEzOTQsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMzQzMGVzMV9kc3Nfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXAzeHh4X2Rzc19tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZHNzX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwRVMxKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMTQxNSw4ICsxNDE4LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZHNzX3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwM3h4eF9kc3NfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2Rzc19tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9HRV9PTUFQMzQzMEVTMiB8Ci0JCQkJQ0hJUF9JU19PTUFQMzYzMEVTMSB8IENISVBfR0VfT01BUDM2MzBFUzFfMSksCiB9OwogCiAvKiBsNF9jb3JlIC0+IGRzc19kaXNwYyAqLwpAQCAtMTQ1NCw5ICsxNDU1LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfZHNzX2Rpc3BjX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZHNzX2Rpc3BjX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzBFUzEgfAotCQkJCUNISVBfR0VfT01BUDM0MzBFUzIgfCBDSElQX0lTX09NQVAzNjMwRVMxIHwKLQkJCQlDSElQX0dFX09NQVAzNjMwRVMxXzEpLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0xNTE4LDkgKzE1MTYsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9kc3NfZHNpMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2Rzc19kc2kxX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzBFUzEgfAotCQkJCUNISVBfR0VfT01BUDM0MzBFUzIgfCBDSElQX0lTX09NQVAzNjMwRVMxIHwKLQkJCQlDSElQX0dFX09NQVAzNjMwRVMxXzEpLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0xNTU4LDkgKzE1NTMsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9kc3NfcmZiaV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2Rzc19yZmJpX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzBFUzEgfAotCQkJCUNISVBfR0VfT01BUDM0MzBFUzIgfCBDSElQX0lTX09NQVAzNjMwRVMxIHwKLQkJCQlDSElQX0dFX09NQVAzNjMwRVMxXzEpLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0xNTk5LDkgKzE1OTEsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9kc3NfdmVuY19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2Rzc192ZW5jX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzBFUzEgfAotCQkJCUNISVBfR0VfT01BUDM0MzBFUzIgfCBDSElQX0lTX09NQVAzNjMwRVMxIHwKLQkJCQlDSElQX0dFX09NQVAzNjMwRVMxXzEpLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0xNjM3LDcgKzE2MjYsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9pMmMxX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZpMmNfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmkyYzFfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogSTJDMiAqLwpAQCAtMTY3Miw3ICsxNjYwLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfaTJjMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmaTJjX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZpMmMyX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIEkyQzMgKi8KQEAgLTE3MTgsNyArMTcwNSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2kyYzNfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJmkyY19jbGFzcywKIAkuZGV2X2F0dHIJPSAmaTJjM19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBsNF93a3VwIC0+IGdwaW8xICovCkBAIC0xODgwLDcgKzE4NjYsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBncGlvMiAqLwpAQCAtMTkxMiw3ICsxODk3LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZ3BpbzJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogZ3BpbzMgKi8KQEAgLTE5NDQsNyArMTkyOCw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2dwaW8zX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIGdwaW80ICovCkBAIC0xOTc2LDcgKzE5NTksNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvNF9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBncGlvNSAqLwpAQCAtMjAxMyw3ICsxOTk1LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZ3BpbzVfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogZ3BpbzYgKi8KQEAgLTIwNTAsNyArMjAzMSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2dwaW82X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIGRtYV9zeXN0ZW0gLT4gTDMgKi8KQEAgLTIxMzQsNyArMjExNCw2IEBACiAJLm1hc3RlcnMJPSBvbWFwM3h4eF9kbWFfc3lzdGVtX21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9kbWFfc3lzdGVtX21hc3RlcnMpLAogCS5kZXZfYXR0cgk9ICZkbWFfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0yMjA3LDcgKzIxODYsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9tY2JzcDFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tY2JzcDFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBtY2JzcDIgKi8KQEAgLTIyNjQsNyArMjI0Miw2IEBACiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9tY2JzcDJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tY2JzcDJfc2xhdmVzKSwKIAkuZGV2X2F0dHIJPSAmb21hcDM0eHhfbWNic3AyX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIG1jYnNwMyAqLwpAQCAtMjMyMSw3ICsyMjk4LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X21jYnNwM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwM19zbGF2ZXMpLAogCS5kZXZfYXR0cgk9ICZvbWFwMzR4eF9tY2JzcDNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogbWNic3A0ICovCkBAIC0yMzc5LDcgKzIzNTUsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9tY2JzcDRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tY2JzcDRfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBtY2JzcDUgKi8KQEAgLTI0MzcsNyArMjQxMiw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X21jYnNwNV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwNV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAvKiAnbWNic3Agc2lkZXRvbmUnIGNsYXNzICovCiAKQEAgLTI0OTgsNyArMjQ3Miw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X21jYnNwMl9zaWRldG9uZV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwMl9zaWRldG9uZV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIG1jYnNwM19zaWRldG9uZSAqLwpAQCAtMjU0Nyw3ICsyNTIwLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbWNic3AzX3NpZGV0b25lX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3AzX3NpZGV0b25lX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogCkBAIC0yNTk3LDcgKzI1NjksNyBAQAogCS5uYW1lCQk9ICJzcjFfaHdtb2QiLAogCS5jbGFzcwkJPSAmb21hcDM0eHhfc21hcnRyZWZsZXhfaHdtb2RfY2xhc3MsCiAJLm1haW5fY2xrCT0gInNyMV9mY2siLAotCS52ZGRfbmFtZQk9ICJtcHUiLAorCS52ZGRfbmFtZQk9ICJtcHVfaXZhIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKIAkJCS5wcmNtX3JlZ19pZCA9IDEsCkBAIC0yNjA5LDkgKzI1ODEsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM19zcjFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM19zcjFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTMiB8Ci0JCQkJCUNISVBfSVNfT01BUDM0MzBFUzNfMCB8Ci0JCQkJCUNISVBfSVNfT01BUDM0MzBFUzNfMSksCiAJLmZsYWdzCQk9IEhXTU9EX1NFVF9ERUZBVUxUX0NMT0NLQUNULAogfTsKIApAQCAtMjYxOSw3ICsyNTg4LDcgQEAKIAkubmFtZQkJPSAic3IxX2h3bW9kIiwKIAkuY2xhc3MJCT0gJm9tYXAzNnh4X3NtYXJ0cmVmbGV4X2h3bW9kX2NsYXNzLAogCS5tYWluX2Nsawk9ICJzcjFfZmNrIiwKLQkudmRkX25hbWUJPSAibXB1IiwKKwkudmRkX25hbWUJPSAibXB1X2l2YSIsCiAJLnByY20JCT0gewogCQkub21hcDIgPSB7CiAJCQkucHJjbV9yZWdfaWQgPSAxLApAQCAtMjYzMSw3ICsyNjAwLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDNfc3IxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDNfc3IxX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM2MzBFUzEpLAogfTsKIAogLyogU1IyICovCkBAIC0yNjU1LDkgKzI2MjMsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM19zcjJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM19zcjJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTMiB8Ci0JCQkJCUNISVBfSVNfT01BUDM0MzBFUzNfMCB8Ci0JCQkJCUNISVBfSVNfT01BUDM0MzBFUzNfMSksCiAJLmZsYWdzCQk9IEhXTU9EX1NFVF9ERUZBVUxUX0NMT0NLQUNULAogfTsKIApAQCAtMjY3Nyw3ICsyNjQyLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDNfc3IyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDNfc3IyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM2MzBFUzEpLAogfTsKIAogLyoKQEAgLTI3NDUsNyArMjcwOSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X21haWxib3hfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tYWlsYm94X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogbDQgY29yZSAtPiBtY3NwaTEgaW50ZXJmYWNlICovCkBAIC0yODQzLDcgKzI4MDYsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzNHh4X21jc3BpX2NsYXNzLAogCS5kZXZfYXR0ciAgICAgICA9ICZvbWFwX21jc3BpMV9kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBtY3NwaTIgKi8KQEAgLTI4NzMsNyArMjgzNSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzNHh4X21jc3BpMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDM0eHhfbWNzcGlfY2xhc3MsCiAJLmRldl9hdHRyICAgICAgID0gJm9tYXBfbWNzcGkyX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIG1jc3BpMyAqLwpAQCAtMjkxNiw3ICsyODc3LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDM0eHhfbWNzcGkzX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMzR4eF9tY3NwaV9jbGFzcywKIAkuZGV2X2F0dHIgICAgICAgPSAmb21hcF9tY3NwaTNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogU1BJNCAqLwpAQCAtMjk1Nyw3ICsyOTE3LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDM0eHhfbWNzcGk0X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMzR4eF9tY3NwaV9jbGFzcywKIAkuZGV2X2F0dHIgICAgICAgPSAmb21hcF9tY3NwaTRfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyoKQEAgLTMwMTQsNyArMjk3Myw2IEBACiAJICovCiAJLmZsYWdzCQk9IEhXTU9EX05PX09DUF9BVVRPSURMRSB8IEhXTU9EX1NXU1VQX1NJRExFCiAJCQkJfCBIV01PRF9TV1NVUF9NU1RBTkRCWSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHVzYl9vdGdfaHMgKi8KQEAgLTMwNDIsNyArMzAwMCw2IEBACiAJLnNsYXZlcwkJPSBhbTM1eHhfdXNiaHNvdGdfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShhbTM1eHhfdXNiaHNvdGdfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJmFtMzV4eF91c2JvdGdfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzBFUzNfMSkKIH07CiAKIC8qIE1NQy9TRC9TRElPIGNvbW1vbiAqLwpAQCAtMzEwOCw3ICszMDY1LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X21tYzFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tbWMxX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMzR4eF9tbWNfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogTU1DL1NEL1NESU8yICovCkBAIC0zMTUxLDcgKzMxMDcsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbW1jMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21tYzJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzNHh4X21tY19jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBNTUMvU0QvU0RJTzMgKi8KQEAgLTMxOTMsNyArMzE0OCw2IEBACiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9tbWMzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbW1jM19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDM0eHhfbW1jX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvbWFwX2h3bW9kICpvbWFwM3h4eF9od21vZHNbXSA9IHsKQEAgLTMyMDUsNyArMzE1OSw2IEBACiAJJm9tYXAzeHh4X21tYzJfaHdtb2QsCiAJJm9tYXAzeHh4X21tYzNfaHdtb2QsCiAJJm9tYXAzeHh4X21wdV9od21vZCwKLQkmb21hcDN4eHhfaXZhX2h3bW9kLAogCiAJJm9tYXAzeHh4X3RpbWVyMV9od21vZCwKIAkmb21hcDN4eHhfdGltZXIyX2h3bW9kLApAQCAtMzIyNCwxMCArMzE3Nyw3IEBACiAJJm9tYXAzeHh4X3VhcnQxX2h3bW9kLAogCSZvbWFwM3h4eF91YXJ0Ml9od21vZCwKIAkmb21hcDN4eHhfdWFydDNfaHdtb2QsCi0JJm9tYXAzeHh4X3VhcnQ0X2h3bW9kLAogCS8qIGRzcyBjbGFzcyAqLwotCSZvbWFwMzQzMGVzMV9kc3NfY29yZV9od21vZCwKLQkmb21hcDN4eHhfZHNzX2NvcmVfaHdtb2QsCiAJJm9tYXAzeHh4X2Rzc19kaXNwY19od21vZCwKIAkmb21hcDN4eHhfZHNzX2RzaTFfaHdtb2QsCiAJJm9tYXAzeHh4X2Rzc19yZmJpX2h3bW9kLApAQCAtMzIzNywxMSArMzE4Nyw2IEBACiAJJm9tYXAzeHh4X2kyYzFfaHdtb2QsCiAJJm9tYXAzeHh4X2kyYzJfaHdtb2QsCiAJJm9tYXAzeHh4X2kyYzNfaHdtb2QsCi0JJm9tYXAzNHh4X3NyMV9od21vZCwKLQkmb21hcDM0eHhfc3IyX2h3bW9kLAotCSZvbWFwMzZ4eF9zcjFfaHdtb2QsCi0JJm9tYXAzNnh4X3NyMl9od21vZCwKLQogCiAJLyogZ3BpbyBjbGFzcyAqLwogCSZvbWFwM3h4eF9ncGlvMV9od21vZCwKQEAgLTMyNjMsOCArMzIwOCw2IEBACiAJJm9tYXAzeHh4X21jYnNwMl9zaWRldG9uZV9od21vZCwKIAkmb21hcDN4eHhfbWNic3AzX3NpZGV0b25lX2h3bW9kLAogCi0JLyogbWFpbGJveCBjbGFzcyAqLwotCSZvbWFwM3h4eF9tYWlsYm94X2h3bW9kLAogCiAJLyogbWNzcGkgY2xhc3MgKi8KIAkmb21hcDM0eHhfbWNzcGkxLApAQCAtMzI3MiwxNiArMzIxNSwxMDQgQEAKIAkmb21hcDM0eHhfbWNzcGkzLAogCSZvbWFwMzR4eF9tY3NwaTQsCiAKLQkvKiB1c2JvdGcgY2xhc3MgKi8KLQkmb21hcDN4eHhfdXNiaHNvdGdfaHdtb2QsCi0KLQkvKiB1c2JvdGcgZm9yIGFtMzV4ICovCi0JJmFtMzV4eF91c2Joc290Z19od21vZCwKLQogCU5VTEwsCiB9OwogCisvKiAzNDMwRVMxLW9ubHkgaHdtb2RzICovCitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3Qgb21hcF9od21vZCAqb21hcDM0MzBlczFfaHdtb2RzW10gPSB7CisJJm9tYXAzeHh4X2l2YV9od21vZCwKKwkmb21hcDM0MzBlczFfZHNzX2NvcmVfaHdtb2QsCisJJm9tYXAzeHh4X21haWxib3hfaHdtb2QsCisJTlVMTAorfTsKKworLyogMzQzMEVTMistb25seSBod21vZHMgKi8KK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvbWFwX2h3bW9kICpvbWFwMzQzMGVzMnBsdXNfaHdtb2RzW10gPSB7CisJJm9tYXAzeHh4X2l2YV9od21vZCwKKwkmb21hcDN4eHhfZHNzX2NvcmVfaHdtb2QsCisJJm9tYXAzeHh4X3VzYmhzb3RnX2h3bW9kLAorCSZvbWFwM3h4eF9tYWlsYm94X2h3bW9kLAorCU5VTEwKK307CisKKy8qIDM0eHgtb25seSBod21vZHMgKGFsbCBFUyByZXZpc2lvbnMpICovCitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3Qgb21hcF9od21vZCAqb21hcDM0eHhfaHdtb2RzW10gPSB7CisJJm9tYXAzeHh4X2l2YV9od21vZCwKKwkmb21hcDM0eHhfc3IxX2h3bW9kLAorCSZvbWFwMzR4eF9zcjJfaHdtb2QsCisJJm9tYXAzeHh4X21haWxib3hfaHdtb2QsCisJTlVMTAorfTsKKworLyogMzZ4eC1vbmx5IGh3bW9kcyAoYWxsIEVTIHJldmlzaW9ucykgKi8KK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvbWFwX2h3bW9kICpvbWFwMzZ4eF9od21vZHNbXSA9IHsKKwkmb21hcDN4eHhfaXZhX2h3bW9kLAorCSZvbWFwM3h4eF91YXJ0NF9od21vZCwKKwkmb21hcDN4eHhfZHNzX2NvcmVfaHdtb2QsCisJJm9tYXAzNnh4X3NyMV9od21vZCwKKwkmb21hcDM2eHhfc3IyX2h3bW9kLAorCSZvbWFwM3h4eF91c2Joc290Z19od21vZCwKKwkmb21hcDN4eHhfbWFpbGJveF9od21vZCwKKwlOVUxMCit9OworCitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3Qgb21hcF9od21vZCAqYW0zNXh4X2h3bW9kc1tdID0geworCSZvbWFwM3h4eF9kc3NfY29yZV9od21vZCwgLyogWFhYID8/PyAqLworCSZhbTM1eHhfdXNiaHNvdGdfaHdtb2QsCisJTlVMTAorfTsKKwogaW50IF9faW5pdCBvbWFwM3h4eF9od21vZF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9tYXBfaHdtb2RfcmVnaXN0ZXIob21hcDN4eHhfaHdtb2RzKTsKKwlpbnQgcjsKKwlzdHJ1Y3Qgb21hcF9od21vZCAqKmggPSBOVUxMOworCXVuc2lnbmVkIGludCByZXY7CisKKwkvKiBSZWdpc3RlciBod21vZHMgY29tbW9uIHRvIGFsbCBPTUFQMyAqLworCXIgPSBvbWFwX2h3bW9kX3JlZ2lzdGVyKG9tYXAzeHh4X2h3bW9kcyk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXJldiA9IG9tYXBfcmV2KCk7CisKKwkvKgorCSAqIFJlZ2lzdGVyIGh3bW9kcyBjb21tb24gdG8gaW5kaXZpZHVhbCBPTUFQMyBmYW1pbGllcywgYWxsCisJICogc2lsaWNvbiByZXZpc2lvbnMgKGUuZy4sIDM0eHgsIG9yIEFNMzUwNS8zNTE3LCBvciAzNnh4KQorCSAqIEFsbCBwb3NzaWJsZSByZXZpc2lvbnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoaXMgY29uZGl0aW9uYWwuCisJICovCisJaWYgKHJldiA9PSBPTUFQMzQzMF9SRVZfRVMxXzAgfHwgcmV2ID09IE9NQVAzNDMwX1JFVl9FUzJfMCB8fAorCSAgICByZXYgPT0gT01BUDM0MzBfUkVWX0VTMl8xIHx8IHJldiA9PSBPTUFQMzQzMF9SRVZfRVMzXzAgfHwKKwkgICAgcmV2ID09IE9NQVAzNDMwX1JFVl9FUzNfMSB8fCByZXYgPT0gT01BUDM0MzBfUkVWX0VTM18xXzIpIHsKKwkJaCA9IG9tYXAzNHh4X2h3bW9kczsKKwl9IGVsc2UgaWYgKHJldiA9PSBPTUFQMzUxN19SRVZfRVMxXzAgfHwgcmV2ID09IE9NQVAzNTE3X1JFVl9FUzFfMSkgeworCQloID0gYW0zNXh4X2h3bW9kczsKKwl9IGVsc2UgaWYgKHJldiA9PSBPTUFQMzYzMF9SRVZfRVMxXzAgfHwgcmV2ID09IE9NQVAzNjMwX1JFVl9FUzFfMSB8fAorCQkgICByZXYgPT0gT01BUDM2MzBfUkVWX0VTMV8yKSB7CisJCWggPSBvbWFwMzZ4eF9od21vZHM7CisJfSBlbHNlIHsKKwkJV0FSTigxLCAiT01BUDMgaHdtb2QgZmFtaWx5IGluaXQ6IHVua25vd24gY2hpcCB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCXIgPSBvbWFwX2h3bW9kX3JlZ2lzdGVyKGgpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwkvKgorCSAqIFJlZ2lzdGVyIGh3bW9kcyBzcGVjaWZpYyB0byBjZXJ0YWluIEVTIGxldmVscyBvZiBhCisJICogcGFydGljdWxhciBmYW1pbHkgb2Ygc2lsaWNvbiAoZS5nLiwgMzR4eCBFUzEuMCkKKwkgKi8KKwloID0gTlVMTDsKKwlpZiAocmV2ID09IE9NQVAzNDMwX1JFVl9FUzFfMCkgeworCQloID0gb21hcDM0MzBlczFfaHdtb2RzOworCX0gZWxzZSBpZiAocmV2ID09IE9NQVAzNDMwX1JFVl9FUzJfMCB8fCByZXYgPT0gT01BUDM0MzBfUkVWX0VTMl8xIHx8CisJCSAgIHJldiA9PSBPTUFQMzQzMF9SRVZfRVMzXzAgfHwgcmV2ID09IE9NQVAzNDMwX1JFVl9FUzNfMSB8fAorCQkgICByZXYgPT0gT01BUDM0MzBfUkVWX0VTM18xXzIpIHsKKwkJaCA9IG9tYXAzNDMwZXMycGx1c19od21vZHM7CisJfTsKKworCWlmIChoKQorCQlyID0gb21hcF9od21vZF9yZWdpc3RlcihoKTsKKworCXJldHVybiByOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzQ0eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzQ0eHhfZGF0YS5jCmluZGV4IDYyMDE0MjJjLi43Njk1ZTVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfNDR4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzQ0eHhfZGF0YS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8cGxhdC9tY2JzcC5oPgogI2luY2x1ZGUgPHBsYXQvbW1jLmg+CiAjaW5jbHVkZSA8cGxhdC9pMmMuaD4KKyNpbmNsdWRlIDxwbGF0L2RtdGltZXIuaD4KIAogI2luY2x1ZGUgIm9tYXBfaHdtb2RfY29tbW9uX2RhdGEuaCIKIApAQCAtMTMzLDcgKzEzNCw2IEBACiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9kbW1fc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kbW1fc2xhdmVzKSwKIAkubXB1X2lycXMJPSBvbWFwNDR4eF9kbW1faXJxcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMTg5LDcgKzE4OSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2VtaWZfZndfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9lbWlmX2Z3X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTIzNiw3ICsyMzUsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9sM19pbnN0cl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2wzX2luc3RyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbDNfbWFpbl8xICovCkBAIC0zMzYsNyArMzM0LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbDNfbWFpbl8xX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbDNfbWFpbl8xX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbDNfbWFpbl8yICovCkBAIC00MzgsNyArNDM1LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbDNfbWFpbl8yX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbDNfbWFpbl8yX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbDNfbWFpbl8zICovCkBAIC00OTYsNyArNDkyLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbDNfbWFpbl8zX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbDNfbWFpbl8zX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTU1OSw3ICs1NTQsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9sNF9hYmVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9sNF9hYmVfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBsNF9jZmcgKi8KQEAgLTU4OCw3ICs1ODIsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9sNF9jZmdfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9sNF9jZmdfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBsNF9wZXIgKi8KQEAgLTYxNyw3ICs2MTAsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9sNF9wZXJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9sNF9wZXJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBsNF93a3VwICovCkBAIC02NDYsNyArNjM4LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbDRfd2t1cF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2w0X3drdXBfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtNjc3LDcgKzY2OCw2IEBACiAJLmNsa2RtX25hbWUJPSAibXB1c3NfY2xrZG0iLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbXB1X3ByaXZhdGVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tcHVfcHJpdmF0ZV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC04MjgsNyArODE4LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfYWVzc19zbGF2ZXMpLAogCS5tYXN0ZXJzCT0gb21hcDQ0eHhfYWVzc19tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfYWVzc19tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtODU2LDcgKzg0NSw2IEBACiAJfSwKIAkub3B0X2Nsa3MJPSBiYW5kZ2FwX29wdF9jbGtzLAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGJhbmRnYXBfb3B0X2Nsa3MpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC05MTcsNyArOTA1LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfY291bnRlcl8zMmtfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9jb3VudGVyXzMya19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0xMDA1LDcgKzk5Miw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2RtYV9zeXN0ZW1fc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X2RtYV9zeXN0ZW1fbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2RtYV9zeXN0ZW1fbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTEwOTgsNyArMTA4NCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2RtaWNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kbWljX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTExNjQsNyArMTE0OSw2IEBACiAJCQkucnN0Y3RybF9vZmZzID0gT01BUDRfUk1fVEVTTEFfUlNUQ1RSTF9PRkZTRVQsCiAJCX0sCiAJfSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfZHNwX2h3bW9kID0gewpAQCAtMTE4Nyw3ICsxMTcxLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNwX3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwNDR4eF9kc3BfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2RzcF9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMTI3OCw3ICsxMjYxLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwNDR4eF9kc3NfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMTM4MSw3ICsxMzYzLDYgQEAKIAkub3B0X2Nsa3NfY250CT0gQVJSQVlfU0laRShkc3NfZGlzcGNfb3B0X2Nsa3MpLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfZHNzX2Rpc3BjX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX2Rpc3BjX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTE0ODAsNyArMTQ2MSw2IEBACiAJLm9wdF9jbGtzX2NudAk9IEFSUkFZX1NJWkUoZHNzX2RzaTFfb3B0X2Nsa3MpLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfZHNzX2RzaTFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfZHNpMV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIGRzc19kc2kyICovCkBAIC0xNTU4LDcgKzE1MzgsNiBAQAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGRzc19kc2kyX29wdF9jbGtzKSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2Rzc19kc2kyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX2RzaTJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMTY1Niw3ICsxNjM1LDYgQEAKIAkub3B0X2Nsa3NfY250CT0gQVJSQVlfU0laRShkc3NfaGRtaV9vcHRfY2xrcyksCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9kc3NfaGRtaV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19oZG1pX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTE3NDgsNyArMTcyNiw2IEBACiAJLm9wdF9jbGtzX2NudAk9IEFSUkFZX1NJWkUoZHNzX3JmYmlfb3B0X2Nsa3MpLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfZHNzX3JmYmlfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfcmZiaV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0xODE3LDcgKzE3OTQsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9kc3NfdmVuY19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc192ZW5jX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTE5MDEsNyArMTg3Nyw2IEBACiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9ncGlvMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW8xX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogZ3BpbzIgKi8KQEAgLTE5NTcsNyArMTkzMiw2IEBACiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9ncGlvMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW8yX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogZ3BpbzMgKi8KQEAgLTIwMTMsNyArMTk4Nyw2IEBACiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9ncGlvM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW8zX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogZ3BpbzQgKi8KQEAgLTIwNjksNyArMjA0Miw2IEBACiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9ncGlvNF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW80X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogZ3BpbzUgKi8KQEAgLTIxMjUsNyArMjA5Nyw2IEBACiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9ncGlvNV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW81X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogZ3BpbzYgKi8KQEAgLTIxODEsNyArMjE1Miw2IEBACiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9ncGlvNl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2dwaW82X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTIyNjEsNyArMjIzMSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2hzaV9zbGF2ZXMpLAogCS5tYXN0ZXJzCT0gb21hcDQ0eHhfaHNpX21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9oc2lfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTIzNDUsNyArMjMxNCw2IEBACiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9pMmMxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaTJjMV9zbGF2ZXMpLAogCS5kZXZfYXR0cgk9ICZpMmNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogaTJjMiAqLwpAQCAtMjQwMiw3ICsyMzcwLDYgQEAKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2kyYzJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pMmMyX3NsYXZlcyksCiAJLmRldl9hdHRyCT0gJmkyY19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBpMmMzICovCkBAIC0yNDU5LDcgKzI0MjYsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfaTJjM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2kyYzNfc2xhdmVzKSwKIAkuZGV2X2F0dHIJPSAmaTJjX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIGkyYzQgKi8KQEAgLTI1MTYsNyArMjQ4Miw2IEBACiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9pMmM0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaTJjNF9zbGF2ZXMpLAogCS5kZXZfYXR0cgk9ICZpMmNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTI1NzcsNyArMjU0Miw2IEBACiAJCQkucnN0Y3RybF9vZmZzID0gT01BUDRfUk1fRFVDQVRJX1JTVENUUkxfT0ZGU0VULAogCQl9LAogCX0sCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogUHNldWRvIGh3bW9kIGZvciByZXNldCBjb250cm9sIHB1cnBvc2Ugb25seSAqLwpAQCAtMjU5Myw3ICsyNTU3LDYgQEAKIAkJCS5yc3RjdHJsX29mZnMgPSBPTUFQNF9STV9EVUNBVElfUlNUQ1RSTF9PRkZTRVQsCiAJCX0sCiAJfSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfaXB1X2h3bW9kID0gewpAQCAtMjYxNiw3ICsyNTc5LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaXB1X3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwNDR4eF9pcHVfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2lwdV9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMjcwNiw3ICsyNjY4LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaXNzX3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwNDR4eF9pc3NfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2lzc19tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMjc4MSw3ICsyNzQyLDYgQEAKIAkJCS5yc3RjdHJsX29mZnMgPSBPTUFQNF9STV9JVkFIRF9SU1RDVFJMX09GRlNFVCwKIAkJfSwKIAl9LAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIFBzZXVkbyBod21vZCBmb3IgcmVzZXQgY29udHJvbCBwdXJwb3NlIG9ubHkgKi8KQEAgLTI3OTcsNyArMjc1Nyw2IEBACiAJCQkucnN0Y3RybF9vZmZzID0gT01BUDRfUk1fSVZBSERfUlNUQ1RSTF9PRkZTRVQsCiAJCX0sCiAJfSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2Qgb21hcDQ0eHhfaXZhX2h3bW9kID0gewpAQCAtMjgyMCw3ICsyNzc5LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaXZhX3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwNDR4eF9pdmFfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2l2YV9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMjg5MCw3ICsyODQ4LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfa2JkX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfa2JkX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTI5NTYsNyArMjkxMyw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21haWxib3hfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tYWlsYm94X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTMwNTEsNyArMzAwNyw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21jYnNwMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jYnNwMV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIG1jYnNwMiAqLwpAQCAtMzEyNyw3ICszMDgyLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbWNic3AyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNic3AyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbWNic3AzICovCkBAIC0zMjAzLDcgKzMxNTcsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9tY2JzcDNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY2JzcDNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBtY2JzcDQgKi8KQEAgLTMyNTgsNyArMzIxMSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21jYnNwNF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jYnNwNF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0zMzUzLDcgKzMzMDUsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9tY3BkbV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jcGRtX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTM0NDIsNyArMzM5Myw2IEBACiAJLmRldl9hdHRyCT0gJm1jc3BpMV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21jc3BpMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jc3BpMV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIG1jc3BpMiAqLwpAQCAtMzUwNSw3ICszNDU1LDYgQEAKIAkuZGV2X2F0dHIJPSAmbWNzcGkyX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbWNzcGkyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNzcGkyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbWNzcGkzICovCkBAIC0zNTY4LDcgKzM1MTcsNiBAQAogCS5kZXZfYXR0cgk9ICZtY3NwaTNfZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9tY3NwaTNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBtY3NwaTQgKi8KQEAgLTM2MjksNyArMzU3Nyw2IEBACiAJLmRldl9hdHRyCT0gJm1jc3BpNF9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21jc3BpNF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jc3BpNF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0zNzE4LDcgKzM2NjUsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWMxX3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwNDR4eF9tbWMxX21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWMxX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIG1tYzIgKi8KQEAgLTM3NzksNyArMzcyNSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21tYzJfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X21tYzJfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21tYzJfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbW1jMyAqLwpAQCAtMzgzNCw3ICszNzc5LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbW1jM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21tYzNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBtbWM0ICovCkBAIC0zODkwLDcgKzM4MzQsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9tbWM0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jNF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIG1tYzUgKi8KQEAgLTM5NDUsNyArMzg4OCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21tYzVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWM1X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTM5ODcsNyArMzkyOSw2IEBACiAJfSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X21wdV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbXB1X21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC00MDYzLDcgKzQwMDQsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9zbWFydHJlZmxleF9jb3JlX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfc21hcnRyZWZsZXhfY29yZV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHNtYXJ0cmVmbGV4X2l2YSAqLwpAQCAtNDExMiw3ICs0MDUyLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfc21hcnRyZWZsZXhfaXZhX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfc21hcnRyZWZsZXhfaXZhX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogc21hcnRyZWZsZXhfbXB1ICovCkBAIC00MTYxLDcgKzQxMDAsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9zbWFydHJlZmxleF9tcHVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9zbWFydHJlZmxleF9tcHVfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtNDIyNCw3ICs0MTYyLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfc3BpbmxvY2tfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9zcGlubG9ja19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC00MjY1LDYgKzQyMDIsMTYgQEAKIAkuc3lzYwk9ICZvbWFwNDR4eF90aW1lcl9zeXNjLAogfTsKIAorLyogYWx3YXlzLW9uIHRpbWVycyBkZXYgYXR0cmlidXRlICovCitzdGF0aWMgc3RydWN0IG9tYXBfdGltZXJfY2FwYWJpbGl0eV9kZXZfYXR0ciBjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyID0geworCS50aW1lcl9jYXBhYmlsaXR5CT0gT01BUF9USU1FUl9BTFdPTiwKK307CisKKy8qIHB3bSB0aW1lcnMgZGV2IGF0dHJpYnV0ZSAqLworc3RhdGljIHN0cnVjdCBvbWFwX3RpbWVyX2NhcGFiaWxpdHlfZGV2X2F0dHIgY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIgPSB7CisJLnRpbWVyX2NhcGFiaWxpdHkJPSBPTUFQX1RJTUVSX0hBU19QV00sCit9OworCiAvKiB0aW1lcjEgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF90aW1lcjFfaHdtb2Q7CiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDQ0eHhfdGltZXIxX2lycXNbXSA9IHsKQEAgLTQzMDgsOSArNDI1NSw5IEBACiAJCQkubW9kdWxlbW9kZSAgID0gTU9EVUxFTU9ERV9TV0NUUkwsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3RpbWVyMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyMV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHRpbWVyMiAqLwpAQCAtNDM1Niw5ICs0MzAzLDkgQEAKIAkJCS5tb2R1bGVtb2RlICAgPSBNT0RVTEVNT0RFX1NXQ1RSTCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdGltZXIyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXIyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdGltZXIzICovCkBAIC00NDA0LDkgKzQzNTEsOSBAQAogCQkJLm1vZHVsZW1vZGUgICA9IE1PRFVMRU1PREVfU1dDVFJMLAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF90aW1lcjNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiB0aW1lcjQgKi8KQEAgLTQ0NTIsOSArNDM5OSw5IEBACiAJCQkubW9kdWxlbW9kZSAgID0gTU9EVUxFTU9ERV9TV0NUUkwsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3RpbWVyNF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyNF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHRpbWVyNSAqLwpAQCAtNDUxOSw5ICs0NDY2LDkgQEAKIAkJCS5tb2R1bGVtb2RlICAgPSBNT0RVTEVNT0RFX1NXQ1RSTCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdGltZXI1X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI1X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdGltZXI2ICovCkBAIC00NTg3LDkgKzQ1MzQsOSBAQAogCQkJLm1vZHVsZW1vZGUgICA9IE1PRFVMRU1PREVfU1dDVFJMLAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF90aW1lcjZfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjZfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiB0aW1lcjcgKi8KQEAgLTQ2NTQsOSArNDYwMSw5IEBACiAJCQkubW9kdWxlbW9kZSAgID0gTU9EVUxFTU9ERV9TV0NUUkwsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3RpbWVyN19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyN19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHRpbWVyOCAqLwpAQCAtNDcyMSw5ICs0NjY4LDkgQEAKIAkJCS5tb2R1bGVtb2RlICAgPSBNT0RVTEVNT0RFX1NXQ1RSTCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3RpbWVyOF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyOF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHRpbWVyOSAqLwpAQCAtNDc2OSw5ICs0NzE2LDkgQEAKIAkJCS5tb2R1bGVtb2RlICAgPSBNT0RVTEVNT0RFX1NXQ1RSTCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3RpbWVyOV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyOV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHRpbWVyMTAgKi8KQEAgLTQ4MTcsOSArNDc2NCw5IEBACiAJCQkubW9kdWxlbW9kZSAgID0gTU9EVUxFTU9ERV9TV0NUUkwsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF90aW1lcjEwX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXIxMF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHRpbWVyMTEgKi8KQEAgLTQ4NjUsOSArNDgxMiw5IEBACiAJCQkubW9kdWxlbW9kZSAgID0gTU9EVUxFTU9ERV9TV0NUUkwsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF90aW1lcjExX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXIxMV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC00OTQ0LDcgKzQ4OTEsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF91YXJ0MV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3VhcnQxX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdWFydDIgKi8KQEAgLTQ5OTksNyArNDk0NSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3VhcnQyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdWFydDJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiB1YXJ0MyAqLwpAQCAtNTA1NSw3ICs1MDAwLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdWFydDNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF91YXJ0M19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHVhcnQ0ICovCkBAIC01MTEwLDcgKzUwNTQsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF91YXJ0NF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3VhcnQ0X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTUxOTUsNyArNTEzOCw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3VzYl9vdGdfaHNfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X3VzYl9vdGdfaHNfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3VzYl9vdGdfaHNfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTUyNjYsNyArNTIwOCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3dkX3RpbWVyMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3dkX3RpbWVyMl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHdkX3RpbWVyMyAqLwpAQCAtNTMzMyw3ICs1Mjc0LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfd2RfdGltZXIzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfd2RfdGltZXIzX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9tYXBfaHdtb2QgKm9tYXA0NHh4X2h3bW9kc1tdID0gewpAQCAtNTQzMCw3ICs1MzcwLDcgQEAKIAkmb21hcDQ0eHhfbWNic3A0X2h3bW9kLAogCiAJLyogbWNwZG0gY2xhc3MgKi8KLS8qCSZvbWFwNDR4eF9tY3BkbV9od21vZCwgKi8KKwkmb21hcDQ0eHhfbWNwZG1faHdtb2QsCiAKIAkvKiBtY3NwaSBjbGFzcyAqLwogCSZvbWFwNDR4eF9tY3NwaTFfaHdtb2QsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfbm9jLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfbm9jLmMKaW5kZXggN2I5ZjE5MC4uNmE2NmFhNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2wzX25vYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19ub2MuYwpAQCAtMSwyNSArMSwyNiBAQAogLyoKLSAgKiBPTUFQNFhYWCBMMyBJbnRlcmNvbm5lY3QgZXJyb3IgaGFuZGxpbmcgZHJpdmVyCi0gICoKLSAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgQ29ycG9yYXRpb24KLSAgKglTYW50b3NoIFNoaWxpbWthciA8c2FudG9zaC5zaGlsaW1rYXJAdGkuY29tPgotICAqCVNyaWNoYXJhbiA8ci5zcmljaGFyYW5AdGkuY29tPgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICoKLSAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNwotICAqIFVTQQotICAqLworICogT01BUDRYWFggTDMgSW50ZXJjb25uZWN0IGVycm9yIGhhbmRsaW5nIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBDb3Jwb3JhdGlvbgorICoJU2FudG9zaCBTaGlsaW1rYXIgPHNhbnRvc2guc2hpbGlta2FyQHRpLmNvbT4KKyAqCVNyaWNoYXJhbiA8ci5zcmljaGFyYW5AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC01NSwxMiArNTYsMTIgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBsM19pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfbDMpCiB7CiAKLQlzdHJ1Y3Qgb21hcDRfbDMJCSpsMyA9IF9sMzsKLQlpbnQgaW50dHlwZSwgaSwgajsKKwlzdHJ1Y3Qgb21hcDRfbDMgKmwzID0gX2wzOworCWludCBpbnR0eXBlLCBpLCBrOwogCWludCBlcnJfc3JjID0gMDsKLQl1MzIgc3RkX2Vycl9tYWluX2FkZHIsIHN0ZF9lcnJfbWFpbiwgZXJyX3JlZzsKLQl1MzIgYmFzZSwgc2xhdmVfYWRkciwgY2xlYXI7Ci0JY2hhciAqc291cmNlX25hbWU7CisJdTMyIHN0ZF9lcnJfbWFpbiwgZXJyX3JlZywgY2xlYXIsIG1hc3RlcmlkOworCXZvaWQgX19pb21lbSAqYmFzZSwgKmwzX3RhcmdfYmFzZTsKKwljaGFyICp0YXJnZXRfbmFtZSwgKm1hc3Rlcl9uYW1lID0gIlVOIElERU5USUZJRUQiOwogCiAJLyogR2V0IHRoZSBUeXBlIG9mIGludGVycnVwdCAqLwogCWludHR5cGUgPSBpcnEgPT0gbDMtPmFwcF9pcnEgPyBMM19BUFBMSUNBVElPTl9FUlJPUiA6IEwzX0RFQlVHX0VSUk9SOwpAQCAtNzAsNDMgKzcxLDUwIEBACiAJCSAqIFJlYWQgdGhlIHJlZ2VyciByZWdpc3RlciBvZiB0aGUgY2xvY2sgZG9tYWluCiAJCSAqIHRvIGRldGVybWluZSB0aGUgc291cmNlCiAJCSAqLwotCQliYXNlID0gKHUzMilsMy0+bDNfYmFzZVtpXTsKLQkJZXJyX3JlZyA9ICByZWFkbChiYXNlICsgbDNfZmxhZ211eFtpXSArIChpbnR0eXBlIDw8IDMpKTsKKwkJYmFzZSA9IGwzLT5sM19iYXNlW2ldOworCQllcnJfcmVnID0gX19yYXdfcmVhZGwoYmFzZSArIGwzX2ZsYWdtdXhbaV0gKworCQkJCQkrIEwzX0ZMQUdNVVhfUkVHRVJSMCArIChpbnR0eXBlIDw8IDMpKTsKIAogCQkvKiBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgZXJyb3IgYW5kIGFuYWx5c2UgKi8KIAkJaWYgKGVycl9yZWcpIHsKIAkJCS8qIElkZW50aWZ5IHRoZSBzb3VyY2UgZnJvbSBjb250cm9sIHN0YXR1cyByZWdpc3RlciAqLwotCQkJZm9yIChqID0gMDsgIShlcnJfcmVnICYgKDEgPDwgaikpOyBqKyspCi0JCQkJCQkJCQk7CisJCQllcnJfc3JjID0gX19mZnMoZXJyX3JlZyk7CiAKLQkJCWVycl9zcmMgPSBqOwogCQkJLyogUmVhZCB0aGUgc3RkZXJybG9nX21haW5fc291cmNlIGZyb20gY2xrIGRvbWFpbiAqLwotCQkJc3RkX2Vycl9tYWluX2FkZHIgPSBiYXNlICsgKihsM190YXJnW2ldICsgZXJyX3NyYyk7Ci0JCQlzdGRfZXJyX21haW4gPSByZWFkbChzdGRfZXJyX21haW5fYWRkcik7CisJCQlsM190YXJnX2Jhc2UgPSBiYXNlICsgKihsM190YXJnW2ldICsgZXJyX3NyYyk7CisJCQlzdGRfZXJyX21haW4gPSAgX19yYXdfcmVhZGwobDNfdGFyZ19iYXNlICsKKwkJCQkJTDNfVEFSR19TVERFUlJMT0dfTUFJTik7CisJCQltYXN0ZXJpZCA9IF9fcmF3X3JlYWRsKGwzX3RhcmdfYmFzZSArCisJCQkJCUwzX1RBUkdfU1RERVJSTE9HX01TVEFERFIpOwogCiAJCQlzd2l0Y2ggKHN0ZF9lcnJfbWFpbiAmIENVU1RPTV9FUlJPUikgewogCQkJY2FzZSBTVEFOREFSRF9FUlJPUjoKLQkJCQlzb3VyY2VfbmFtZSA9Ci0JCQkJbDNfdGFyZ19zdGRlcnJsb2dfbWFpbl9uYW1lW2ldW2Vycl9zcmNdOwotCi0JCQkJc2xhdmVfYWRkciA9IHN0ZF9lcnJfbWFpbl9hZGRyICsKLQkJCQkJCUwzX1NMQVZFX0FERFJFU1NfT0ZGU0VUOwotCQkJCVdBUk4odHJ1ZSwgIkwzIHN0YW5kYXJkIGVycm9yOiBTT1VSQ0U6JXMgYXQgYWRkcmVzcyAweCV4XG4iLAotCQkJCQlzb3VyY2VfbmFtZSwgcmVhZGwoc2xhdmVfYWRkcikpOworCQkJCXRhcmdldF9uYW1lID0KKwkJCQkJbDNfdGFyZ19pbnN0X25hbWVbaV1bZXJyX3NyY107CisJCQkJV0FSTih0cnVlLCAiTDMgc3RhbmRhcmQgZXJyb3I6IFRBUkdFVDolcyBhdCBhZGRyZXNzIDB4JXhcbiIsCisJCQkJCXRhcmdldF9uYW1lLAorCQkJCQlfX3Jhd19yZWFkbChsM190YXJnX2Jhc2UgKworCQkJCQkJTDNfVEFSR19TVERFUlJMT0dfU0xWT0ZTTFNCKSk7CiAJCQkJLyogY2xlYXIgdGhlIHN0ZCBlcnJvciBsb2cqLwogCQkJCWNsZWFyID0gc3RkX2Vycl9tYWluIHwgQ0xFQVJfU1RERVJSX0xPRzsKLQkJCQl3cml0ZWwoY2xlYXIsIHN0ZF9lcnJfbWFpbl9hZGRyKTsKKwkJCQl3cml0ZWwoY2xlYXIsIGwzX3RhcmdfYmFzZSArCisJCQkJCUwzX1RBUkdfU1RERVJSTE9HX01BSU4pOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIENVU1RPTV9FUlJPUjoKLQkJCQlzb3VyY2VfbmFtZSA9Ci0JCQkJbDNfdGFyZ19zdGRlcnJsb2dfbWFpbl9uYW1lW2ldW2Vycl9zcmNdOwotCi0JCQkJV0FSTih0cnVlLCAiQ1VTVE9NIFNSRVNQIGVycm9yIHdpdGggU09VUkNFOiVzXG4iLAotCQkJCQkJCXNvdXJjZV9uYW1lKTsKKwkJCQl0YXJnZXRfbmFtZSA9CisJCQkJCWwzX3RhcmdfaW5zdF9uYW1lW2ldW2Vycl9zcmNdOworCQkJCWZvciAoayA9IDA7IGsgPCBOVU1fT0ZfTDNfTUFTVEVSUzsgaysrKSB7CisJCQkJCWlmIChtYXN0ZXJpZCA9PSBsM19tYXN0ZXJzW2tdLmlkKQorCQkJCQkJbWFzdGVyX25hbWUgPQorCQkJCQkJCWwzX21hc3RlcnNba10ubmFtZTsKKwkJCQl9CisJCQkJV0FSTih0cnVlLCAiTDMgY3VzdG9tIGVycm9yOiBNQVNURVI6JXMgVEFSR0VUOiVzXG4iLAorCQkJCQltYXN0ZXJfbmFtZSwgdGFyZ2V0X25hbWUpOwogCQkJCS8qIGNsZWFyIHRoZSBzdGQgZXJyb3IgbG9nKi8KIAkJCQljbGVhciA9IHN0ZF9lcnJfbWFpbiB8IENMRUFSX1NUREVSUl9MT0c7Ci0JCQkJd3JpdGVsKGNsZWFyLCBzdGRfZXJyX21haW5fYWRkcik7CisJCQkJd3JpdGVsKGNsZWFyLCBsM190YXJnX2Jhc2UgKworCQkJCQlMM19UQVJHX1NUREVSUkxPR19NQUlOKTsKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKQEAgLTEyMCwxMiArMTI4LDExIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwNF9sM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgb21hcDRfbDNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdGF0aWMgc3RydWN0IG9tYXA0X2wzCQkqbDM7Ci0Jc3RydWN0IHJlc291cmNlCQkqcmVzOwotCWludAkJCXJldDsKLQlpbnQJCQlpcnE7CisJc3RhdGljIHN0cnVjdCBvbWFwNF9sMyAqbDM7CisJc3RydWN0IHJlc291cmNlCSpyZXM7CisJaW50IHJldDsKIAogCWwzID0ga3phbGxvYyhzaXplb2YoKmwzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsMykKQEAgLTE3NywyNyArMTg0LDI1IEBACiAJLyoKIAkgKiBTZXR1cCBpbnRlcnJ1cHQgSGFuZGxlcnMKIAkgKi8KLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwKKwlsMy0+ZGVidWdfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlyZXQgPSByZXF1ZXN0X2lycShsMy0+ZGVidWdfaXJxLAogCQkJbDNfaW50ZXJydXB0X2hhbmRsZXIsCiAJCQlJUlFGX0RJU0FCTEVELCAibDMtZGJnLWlycSIsIGwzKTsKIAlpZiAocmV0KSB7CiAJCXByX2NyaXQoIkwzOiByZXF1ZXN0X2lycSBmYWlsZWQgdG8gcmVnaXN0ZXIgZm9yIDB4JXhcbiIsCi0JCQkJCSBPTUFQNDRYWF9JUlFfTDNfREJHKTsKKwkJCQkJCU9NQVA0NFhYX0lSUV9MM19EQkcpOwogCQlnb3RvIGVycjM7CiAJfQotCWwzLT5kZWJ1Z19pcnEgPSBpcnE7CiAKLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOwotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwKKwlsMy0+YXBwX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CisJcmV0ID0gcmVxdWVzdF9pcnEobDMtPmFwcF9pcnEsCiAJCQlsM19pbnRlcnJ1cHRfaGFuZGxlciwKIAkJCUlSUUZfRElTQUJMRUQsICJsMy1hcHAtaXJxIiwgbDMpOwogCWlmIChyZXQpIHsKIAkJcHJfY3JpdCgiTDM6IHJlcXVlc3RfaXJxIGZhaWxlZCB0byByZWdpc3RlciBmb3IgMHgleFxuIiwKLQkJCQkJIE9NQVA0NFhYX0lSUV9MM19BUFApOworCQkJCQkJT01BUDQ0WFhfSVJRX0wzX0FQUCk7CiAJCWdvdG8gZXJyNDsKIAl9Ci0JbDMtPmFwcF9pcnEgPSBpcnE7CiAKIAlyZXR1cm4gMDsKIApAQCAtMjE0LDkgKzIxOSw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2V4aXQgb21hcDRfbDNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBvbWFwNF9sM19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3Qgb21hcDRfbDMgICAgICAgICAqbDMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb21hcDRfbDMgKmwzID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlmcmVlX2lycShsMy0+YXBwX2lycSwgbDMpOwogCWZyZWVfaXJxKGwzLT5kZWJ1Z19pcnEsIGwzKTsKQEAgLTIyOCwxNiArMjMzLDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19PRikKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGwzX25vY19tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC1sMy1ub2MiLCB9LAorCXt9LAorfQorTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbDNfbm9jX21hdGNoKTsKKyNlbHNlCisjZGVmaW5lIGwzX25vY19tYXRjaCBOVUxMCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcDRfbDNfZHJpdmVyID0gewotCS5yZW1vdmUJCT0gX19leGl0X3Aob21hcDRfbDNfcmVtb3ZlKSwKKwkucHJvYmUJCT0gb21hcDRfbDNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvbWFwNF9sM19yZW1vdmUpLAogCS5kcml2ZXIJCT0gewotCS5uYW1lCQk9ICJvbWFwX2wzX25vYyIsCisJCS5uYW1lCQk9ICJvbWFwX2wzX25vYyIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbDNfbm9jX21hdGNoLAogCX0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwNF9sM19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmb21hcDRfbDNfZHJpdmVyLCBvbWFwNF9sM19wcm9iZSk7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcDRfbDNfZHJpdmVyKTsKIH0KIHBvc3Rjb3JlX2luaXRjYWxsX3N5bmMob21hcDRfbDNfaW5pdCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19ub2MuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19ub2MuaAppbmRleCAzNTliODMzLi45MGI1MDk4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfbm9jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2wzX25vYy5oCkBAIC0xLDEzMiArMSwxNjIgQEAKLSAvKgotICAqIE9NQVA0WFhYIEwzIEludGVyY29ubmVjdCAgZXJyb3IgaGFuZGxpbmcgZHJpdmVyIGhlYWRlcgotICAqCi0gICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIENvcnBvcmF0aW9uCi0gICoJU2FudG9zaCBTaGlsaW1rYXIgPHNhbnRvc2guc2hpbGlta2FyQHRpLmNvbT4KLSAgKglzcmljaGFyYW4gPHIuc3JpY2hhcmFuQHRpLmNvbT4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAqCi0gICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKLSAgKiBVU0EKLSAgKi8KKy8qCisgKiBPTUFQNFhYWCBMMyBJbnRlcmNvbm5lY3QgIGVycm9yIGhhbmRsaW5nIGRyaXZlciBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgQ29ycG9yYXRpb24KKyAqCVNhbnRvc2ggU2hpbGlta2FyIDxzYW50b3NoLnNoaWxpbWthckB0aS5jb20+CisgKglzcmljaGFyYW4gPHIuc3JpY2hhcmFuQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKiBVU0EKKyAqLwogI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfTDNfSU5URVJDT05ORUNUXzNYWFhfSAogI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfTDNfSU5URVJDT05ORUNUXzNYWFhfSAogCi0vKgotICogTDMgcmVnaXN0ZXIgb2Zmc2V0cwotICovCiAjZGVmaW5lIEwzX01PRFVMRVMJCQkzCiAjZGVmaW5lIENMRUFSX1NUREVSUl9MT0cJCSgxIDw8IDMxKQogI2RlZmluZSBDVVNUT01fRVJST1IJCQkweDIKICNkZWZpbmUgU1RBTkRBUkRfRVJST1IJCQkweDAKICNkZWZpbmUgSU5CQU5EX0VSUk9SCQkJMHgwCi0jZGVmaW5lIEVNSUZfS0VSUkxPR19PRkZTRVQJCTB4MTAKLSNkZWZpbmUgTDNfU0xBVkVfQUREUkVTU19PRkZTRVQJCTB4MTQKLSNkZWZpbmUgTE9HSUNBTF9BRERSX0VSUk9STE9HCQkweDQKICNkZWZpbmUgTDNfQVBQTElDQVRJT05fRVJST1IJCTB4MAogI2RlZmluZSBMM19ERUJVR19FUlJPUgkJCTB4MQogCi11MzIgbDNfZmxhZ211eFtMM19NT0RVTEVTXSA9IHsKLQkweDUwQywKLQkweDEwMEMsCi0JMFgwMjBDCisvKiBMMyBUQVJHIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgTDNfVEFSR19TVERFUlJMT0dfTUFJTgkJMHg0OAorI2RlZmluZSBMM19UQVJHX1NUREVSUkxPR19TTFZPRlNMU0IJMHg1YworI2RlZmluZSBMM19UQVJHX1NUREVSUkxPR19NU1RBRERSCTB4NjgKKyNkZWZpbmUgTDNfRkxBR01VWF9SRUdFUlIwCQkweGMKKworI2RlZmluZSBOVU1fT0ZfTDNfTUFTVEVSUwkoc2l6ZW9mKGwzX21hc3RlcnMpL3NpemVvZihsM19tYXN0ZXJzWzBdKSkKKworc3RhdGljIHUzMiBsM19mbGFnbXV4W0wzX01PRFVMRVNdID0geworCTB4NTAwLAorCTB4MTAwMCwKKwkwWDAyMDAKIH07CiAKLS8qCi0gKiBMMyBUYXJnZXQgc3RhbmRhcmQgRXJyb3IgcmVnaXN0ZXIgb2Zmc2V0cwotICovCi11MzIgbDNfdGFyZ19zdGRlcnJsb2dfbWFpbl9jbGsxW10gPSB7Ci0JMHgxNDgsIC8qIERNTTEgKi8KLQkweDI0OCwgLyogRE1NMiAqLwotCTB4MzQ4LCAvKiBBQkUgKi8KLQkweDQ0OCwgLyogTDRDRkcgKi8KLQkweDY0OCAgLyogQ0xLMiBQV1IgRElTQyAqLworLyogTDMgVGFyZ2V0IHN0YW5kYXJkIEVycm9yIHJlZ2lzdGVyIG9mZnNldHMgKi8KK3N0YXRpYyB1MzIgbDNfdGFyZ19pbnN0X2NsazFbXSA9IHsKKwkweDEwMCwgLyogRE1NMSAqLworCTB4MjAwLCAvKiBETU0yICovCisJMHgzMDAsIC8qIEFCRSAqLworCTB4NDAwLCAvKiBMNENGRyAqLworCTB4NjAwICAvKiBDTEsyIFBXUiBESVNDICovCiB9OwogCi11MzIgbDNfdGFyZ19zdGRlcnJsb2dfbWFpbl9jbGsyW10gPSB7Ci0JMHg1NDgsCQkvKiBDT1JURVggTTMgKi8KLQkweDM0OCwJCS8qIERTUyAqLwotCTB4MTQ4LAkJLyogR1BNQyAqLwotCTB4NDQ4LAkJLyogSVNTICovCi0JMHg3NDgsCQkvKiBJVkFIRCAqLwotCTB4RDQ4LAkJLyogbWlzc2luZyBpbiBUUk0gIGNvcnJlc3BvbmRzIHRvIEFFUzEqLwotCTB4OTQ4LAkJLyogTDQgUEVSMCovCi0JMHgyNDgsCQkvKiBPQ01SQU0gKi8KLQkweDE0OCwJCS8qIG1pc3NpbmcgaW4gVFJNIGNvcnJlc3BvbmRzIHRvIEdQTUMgc0VSUk9SKi8KLQkweDY0OCwJCS8qIFNHWCAqLwotCTB4ODQ4LAkJLyogU0wyICovCi0JMHgxNjQ4LAkJLyogQzJDICovCi0JMHgxMTQ4LAkJLyogbWlzc2luZyBpbiBUUk0gY29ycmVzcG9uZHMgUFdSIERJU0MgQ0xLMSovCi0JMHhGNDgsCQkvKiBtaXNzaW5nIGluIFRSTSBjb3Jyc3BvbmRzIHRvIFNIQTEqLwotCTB4RTQ4LAkJLyogbWlzc2luZyBpbiBUUk0gY29ycmVzcG9uZHMgdG8gQUVTMiovCi0JMHhDNDgsCQkvKiBMNCBQRVIzICovCi0JMHhBNDgsCQkvKiBMNCBQRVIxKi8KLQkweEI0OAkJLyogTDQgUEVSMiovCitzdGF0aWMgdTMyIGwzX3RhcmdfaW5zdF9jbGsyW10gPSB7CisJMHg1MDAsIC8qIENPUlRFWCBNMyAqLworCTB4MzAwLCAvKiBEU1MgKi8KKwkweDEwMCwgLyogR1BNQyAqLworCTB4NDAwLCAvKiBJU1MgKi8KKwkweDcwMCwgLyogSVZBSEQgKi8KKwkweEQwMCwgLyogbWlzc2luZyBpbiBUUk0gIGNvcnJlc3BvbmRzIHRvIEFFUzEqLworCTB4OTAwLCAvKiBMNCBQRVIwKi8KKwkweDIwMCwgLyogT0NNUkFNICovCisJMHgxMDAsIC8qIG1pc3NpbmcgaW4gVFJNIGNvcnJlc3BvbmRzIHRvIEdQTUMgc0VSUk9SKi8KKwkweDYwMCwgLyogU0dYICovCisJMHg4MDAsIC8qIFNMMiAqLworCTB4MTYwMCwgLyogQzJDICovCisJMHgxMTAwLAkvKiBtaXNzaW5nIGluIFRSTSBjb3JyZXNwb25kcyBQV1IgRElTQyBDTEsxKi8KKwkweEYwMCwgLyogbWlzc2luZyBpbiBUUk0gY29ycnNwb25kcyB0byBTSEExKi8KKwkweEUwMCwgLyogbWlzc2luZyBpbiBUUk0gY29ycmVzcG9uZHMgdG8gQUVTMiovCisJMHhDMDAsIC8qIEw0IFBFUjMgKi8KKwkweEEwMCwgLyogTDQgUEVSMSovCisJMHhCMDAgLyogTDQgUEVSMiovCiB9OwogCi11MzIgbDNfdGFyZ19zdGRlcnJsb2dfbWFpbl9jbGszW10gPSB7Ci0JMHgwMTQ4CS8qIEVNVVNTICovCitzdGF0aWMgdTMyIGwzX3RhcmdfaW5zdF9jbGszW10gPSB7CisJMHgwMTAwCS8qIEVNVVNTICovCiB9OwogCi1jaGFyICpsM190YXJnX3N0ZGVycmxvZ19tYWluX25hbWVbTDNfTU9EVUxFU11bMThdID0geworc3RhdGljIHN0cnVjdCBsM19tYXN0ZXJzX2RhdGEgeworCXUzMiBpZDsKKwljaGFyIG5hbWVbMTBdOworfSBsM19tYXN0ZXJzW10gPSB7CisJeyAweDAgLCAiTVBVIn0sCisJeyAweDEwLCAiQ1NfQURQIn0sCisJeyAweDE0LCAieHh4In0sCisJeyAweDIwLCAiRFNQIn0sCisJeyAweDMwLCAiSVZBSEQifSwKKwl7IDB4NDAsICJJU1MifSwKKwl7IDB4NDQsICJEdWNhdGlNMyJ9LAorCXsgMHg0OCwgIkZhY2VEZXRlY3QifSwKKwl7IDB4NTAsICJTRE1BX1JkIn0sCisJeyAweDU0LCAiU0RNQV9XciJ9LAorCXsgMHg1OCwgInh4eCJ9LAorCXsgMHg1QywgInh4eCJ9LAorCXsgMHg2MCwgIlNHWCJ9LAorCXsgMHg3MCwgIkRTUyJ9LAorCXsgMHg4MCwgIkMyQyJ9LAorCXsgMHg4OCwgInh4eCJ9LAorCXsgMHg4QywgInh4eCJ9LAorCXsgMHg5MCwgIkhTSSJ9LAorCXsgMHhBMCwgIk1NQzEifSwKKwl7IDB4QTQsICJNTUMyIn0sCisJeyAweEE4LCAiTU1DNiJ9LAorCXsgMHhCMCwgIlVOSVBSTzEifSwKKwl7IDB4QzAsICJVU0JIT1NUSFMifSwKKwl7IDB4QzQsICJVU0JPVEdIUyJ9LAorCXsgMHhDOCwgIlVTQkhPU1RGUyJ9Cit9OworCitzdGF0aWMgY2hhciAqbDNfdGFyZ19pbnN0X25hbWVbTDNfTU9EVUxFU11bMThdID0gewogCXsKLQkiRE1NMSIsCi0JIkRNTTIiLAotCSJBQkUiLAotCSJMNENGRyIsCi0JIkNMSzIgUFdSIERJU0MiLAorCQkiRE1NMSIsCisJCSJETU0yIiwKKwkJIkFCRSIsCisJCSJMNENGRyIsCisJCSJDTEsyIFBXUiBESVNDIiwKIAl9LAogCXsKLQkiQ09SVEVYIE0zIiAsCi0JIkRTUyAiLAotCSJHUE1DICIsCi0JIklTUyAiLAotCSJJVkFIRCAiLAotCSJBRVMxIiwKLQkiTDQgUEVSMCIsCi0JIk9DTVJBTSAiLAotCSJHUE1DIHNFUlJPUiIsCi0JIlNHWCAiLAotCSJTTDIgIiwKLQkiQzJDICIsCi0JIlBXUiBESVNDIENMSzEiLAotCSJTSEExIiwKLQkiQUVTMiIsCi0JIkw0IFBFUjMiLAotCSJMNCBQRVIxIiwKLQkiTDQgUEVSMiIsCisJCSJDT1JURVggTTMiICwKKwkJIkRTUyAiLAorCQkiR1BNQyAiLAorCQkiSVNTICIsCisJCSJJVkFIRCAiLAorCQkiQUVTMSIsCisJCSJMNCBQRVIwIiwKKwkJIk9DTVJBTSAiLAorCQkiR1BNQyBzRVJST1IiLAorCQkiU0dYICIsCisJCSJTTDIgIiwKKwkJIkMyQyAiLAorCQkiUFdSIERJU0MgQ0xLMSIsCisJCSJTSEExIiwKKwkJIkFFUzIiLAorCQkiTDQgUEVSMyIsCisJCSJMNCBQRVIxIiwKKwkJIkw0IFBFUjIiLAogCX0sCiAJewotCSJFTVVTUyIsCisJCSJFTVVTUyIsCiAJfSwKIH07CiAKLXUzMiAqbDNfdGFyZ1tMM19NT0RVTEVTXSA9IHsKLQlsM190YXJnX3N0ZGVycmxvZ19tYWluX2NsazEsCi0JbDNfdGFyZ19zdGRlcnJsb2dfbWFpbl9jbGsyLAotCWwzX3Rhcmdfc3RkZXJybG9nX21haW5fY2xrMywKK3N0YXRpYyB1MzIgKmwzX3RhcmdbTDNfTU9EVUxFU10gPSB7CisJbDNfdGFyZ19pbnN0X2NsazEsCisJbDNfdGFyZ19pbnN0X2NsazIsCisJbDNfdGFyZ19pbnN0X2NsazMsCiB9OwogCiBzdHJ1Y3Qgb21hcDRfbDMgewotCXN0cnVjdCBkZXZpY2UJKmRldjsKLQlzdHJ1Y3QgY2xrCSppY2s7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBjbGsgKmljazsKIAogCS8qIG1lbW9yeSBiYXNlICovCi0Jdm9pZCBfX2lvbWVtICpsM19iYXNlWzRdOworCXZvaWQgX19pb21lbSAqbDNfYmFzZVtMM19NT0RVTEVTXTsKIAotCWludAkJZGVidWdfaXJxOwotCWludAkJYXBwX2lycTsKKwlpbnQgZGVidWdfaXJxOworCWludCBhcHBfaXJxOwogfTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfc214LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfc214LmMKaW5kZXggODczYzBlMy4uYTA1YTYyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2wzX3NteC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19zbXguYwpAQCAtMSwyNiArMSwyNiBAQAotIC8qCi0gICogT01BUDNYWFggTDMgSW50ZXJjb25uZWN0IERyaXZlcgotICAqCi0gICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIENvcnBvcmF0aW9uCi0gICoJRmVsaXBlIEJhbGJpIDxiYWxiaUB0aS5jb20+Ci0gICoJU2FudG9zaCBTaGlsaW1rYXIgPHNhbnRvc2guc2hpbGlta2FyQHRpLmNvbT4KLSAgKglTcmljaGFyYW4gPHIuc3JpY2hhcmFuQHRpLmNvbT4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAqCi0gICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKLSAgKiBVU0EKLSAgKi8KKy8qCisgKiBPTUFQM1hYWCBMMyBJbnRlcmNvbm5lY3QgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIENvcnBvcmF0aW9uCisgKglGZWxpcGUgQmFsYmkgPGJhbGJpQHRpLmNvbT4KKyAqCVNhbnRvc2ggU2hpbGlta2FyIDxzYW50b3NoLnNoaWxpbWthckB0aS5jb20+CisgKglTcmljaGFyYW4gPHIuc3JpY2hhcmFuQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKiBVU0EKKyAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTM1LDcgKzEzNSw3IEBACiAJfQogfQogCi0vKioKKy8qCiAgKiBvbWFwM19sM19ibG9ja19pcnEgLSBoYW5kbGVzIGEgcmVnaXN0ZXIgYmxvY2sncyBpcnEKICAqIEBsMzogc3RydWN0IG9tYXAzX2wzICoKICAqIEBiYXNlOiByZWdpc3RlciBibG9jayBiYXNlIGFkZHJlc3MKQEAgLTE1MCwzMCArMTUwLDI5IEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcDNfbDNfYmxvY2tfaXJxKHN0cnVjdCBvbWFwM19sMyAqbDMsCiAJCQkJCXU2NCBlcnJvciwgaW50IGVycm9yX2FkZHIpCiB7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgY29kZSA9IG9tYXAzX2wzX2RlY29kZV9lcnJvcl9jb2RlKGVycm9yKTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICBpbml0aWQgPSBvbWFwM19sM19kZWNvZGVfaW5pdGlkKGVycm9yKTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICBtdWx0aSA9IGVycm9yICYgTDNfRVJST1JfTE9HX01VTFRJOwotCXUzMgkJCWFkZHJlc3MgPSBvbWFwM19sM19kZWNvZGVfYWRkcihlcnJvcl9hZGRyKTsKKwl1OCBjb2RlID0gb21hcDNfbDNfZGVjb2RlX2Vycm9yX2NvZGUoZXJyb3IpOworCXU4IGluaXRpZCA9IG9tYXAzX2wzX2RlY29kZV9pbml0aWQoZXJyb3IpOworCXU4IG11bHRpID0gZXJyb3IgJiBMM19FUlJPUl9MT0dfTVVMVEk7CisJdTMyIGFkZHJlc3MgPSBvbWFwM19sM19kZWNvZGVfYWRkcihlcnJvcl9hZGRyKTsKIAogCVdBUk4odHJ1ZSwgIiVzIHNlZW4gYnkgJXMgJXMgYXQgYWRkcmVzcyAleFxuIiwKLQkJCQkgb21hcDNfbDNfY29kZV9zdHJpbmcoY29kZSksCi0JCQkgIG9tYXAzX2wzX2luaXRpYXRvcl9zdHJpbmcoaW5pdGlkKSwKLQkJCSAgICAgbXVsdGkgPyAiTXVsdGlwbGUgRXJyb3JzIiA6ICIiLAotCQkJCQkJICAgYWRkcmVzcyk7CisJCQlvbWFwM19sM19jb2RlX3N0cmluZyhjb2RlKSwKKwkJCW9tYXAzX2wzX2luaXRpYXRvcl9zdHJpbmcoaW5pdGlkKSwKKwkJCW11bHRpID8gIk11bHRpcGxlIEVycm9ycyIgOiAiIiwgYWRkcmVzcyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwM19sM19hcHBfaXJxKGludCBpcnEsIHZvaWQgKl9sMykKIHsKLQlzdHJ1Y3Qgb21hcDNfbDMgICAgICAgICAqbDMgPSBfbDM7Ci0JdTY0ICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbGVhcjsKLQl1NjQgICAgICAgICAgICAgICAgICAgICBlcnJvcjsKLQl1NjQJCQllcnJvcl9hZGRyOwotCXU2NAkJCWVycl9zb3VyY2UgPSAwOwotCXZvaWQJCQlfX2lvbWVtICpiYXNlOwotCWludAkJCWludF90eXBlOwotCWlycXJldHVybl90ICAgICAgICAgICAgIHJldCA9IElSUV9OT05FOworCXN0cnVjdCBvbWFwM19sMyAqbDMgPSBfbDM7CisJdTY0IHN0YXR1cywgY2xlYXI7CisJdTY0IGVycm9yOworCXU2NCBlcnJvcl9hZGRyOworCXU2NCBlcnJfc291cmNlID0gMDsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IGludF90eXBlOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwogCiAJaW50X3R5cGUgPSBpcnEgPT0gbDMtPmFwcF9pcnEgPyBMM19BUFBMSUNBVElPTl9FUlJPUiA6IEwzX0RFQlVHX0VSUk9SOwogCWlmICghaW50X3R5cGUpIHsKQEAgLTE5MSwxNCArMTkwLDEyIEBACiAJfQogCiAJLyogaWRlbnRpZnkgdGhlIGVycm9yIHNvdXJjZSAqLwotCWZvciAoZXJyX3NvdXJjZSA9IDA7ICEoc3RhdHVzICYgKDEgPDwgZXJyX3NvdXJjZSkpOyBlcnJfc291cmNlKyspCi0JCQkJCQkJCQk7CisJZXJyX3NvdXJjZSA9IF9fZmZzKHN0YXR1cyk7CiAKLQliYXNlID0gbDMtPnJ0ICsgKihvbWFwM19sM19iYXNlc1tpbnRfdHlwZV0gKyBlcnJfc291cmNlKTsKKwliYXNlID0gbDMtPnJ0ICsgb21hcDNfbDNfYmFzZXNbaW50X3R5cGVdW2Vycl9zb3VyY2VdOwogCWVycm9yID0gb21hcDNfbDNfcmVhZGxsKGJhc2UsIEwzX0VSUk9SX0xPRyk7CiAJaWYgKGVycm9yKSB7CiAJCWVycm9yX2FkZHIgPSBvbWFwM19sM19yZWFkbGwoYmFzZSwgTDNfRVJST1JfTE9HX0FERFIpOwotCiAJCXJldCB8PSBvbWFwM19sM19ibG9ja19pcnEobDMsIGVycm9yLCBlcnJvcl9hZGRyKTsKIAl9CiAKQEAgLTIxNSw5ICsyMTIsOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwM19sM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBvbWFwM19sMyAgICAgICAgICpsMzsKLQlzdHJ1Y3QgcmVzb3VyY2UgICAgICAgICAqcmVzOwotCWludCAgICAgICAgICAgICAgICAgICAgIHJldDsKKwlzdHJ1Y3Qgb21hcDNfbDMgKmwzOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CiAKIAlsMyA9IGt6YWxsb2Moc2l6ZW9mKCpsMyksIEdGUF9LRVJORUwpOwogCWlmICghbDMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfc214LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfc214LmgKaW5kZXggYmEyZWQ5YS4uNGYzY2ViYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2wzX3NteC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19zbXguaApAQCAtMSwyNiArMSwyNiBAQAotIC8qCi0gICogT01BUDNYWFggTDMgSW50ZXJjb25uZWN0IERyaXZlciBoZWFkZXIKLSAgKgotICAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBDb3Jwb3JhdGlvbgotICAqCUZlbGlwZSBCYWxiaSA8YmFsYmlAdGkuY29tPgotICAqCVNhbnRvc2ggU2hpbGlta2FyIDxzYW50b3NoLnNoaWxpbWthckB0aS5jb20+Ci0gICoJc3JpY2hhcmFuIDxyLnNyaWNoYXJhbkB0aS5jb20+Ci0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgKgotICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3Ci0gICogVVNBCi0gICovCisvKgorICogT01BUDNYWFggTDMgSW50ZXJjb25uZWN0IERyaXZlciBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgQ29ycG9yYXRpb24KKyAqCUZlbGlwZSBCYWxiaSA8YmFsYmlAdGkuY29tPgorICoJU2FudG9zaCBTaGlsaW1rYXIgPHNhbnRvc2guc2hpbGlta2FyQHRpLmNvbT4KKyAqCXNyaWNoYXJhbiA8ci5zcmljaGFyYW5AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqIFVTQQorICovCiAjaWZuZGVmIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9MM19JTlRFUkNPTk5FQ1RfM1hYWF9ICiAjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9MM19JTlRFUkNPTk5FQ1RfM1hYWF9ICiAKQEAgLTQwLDcgKzQwLDcgQEAKICNkZWZpbmUgTDNfU0lfQ09OVFJPTAkJCTB4MDIwCiAjZGVmaW5lIEwzX1NJX0ZMQUdfU1RBVFVTXzAJCTB4NTEwCiAKLWNvbnN0IHU2NCBzaGlmdCA9IDE7CitzdGF0aWMgY29uc3QgdTY0IHNoaWZ0ID0gMTsKIAogI2RlZmluZSBMM19TVEFUVVNfMF9NUFVJQV9CUlNUCQkoc2hpZnQgPDwgMCkKICNkZWZpbmUgTDNfU1RBVFVTXzBfTVBVSUFfUlNQCQkoc2hpZnQgPDwgMSkKQEAgLTc4LDMyICs3OCwzMiBAQAogI2RlZmluZSBMM19TVEFUVVNfMF9MNEVNVVRBX1JFUQkJKHNoaWZ0IDw8IDYwKQogI2RlZmluZSBMM19TVEFUVVNfMF9NQUQyRFRBX1JFUQkJKHNoaWZ0IDw8IDYxKQogCi0jZGVmaW5lIEwzX1NUQVRVU18wX1RJTUVPVVRfTUFTSwkoTDNfU1RBVFVTXzBfTVBVSUFfQlJTVCAgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9NUFVJQV9SU1AgICAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfSVZBSUFfQlJTVCAgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0lWQUlBX1JTUCAgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9TR1hJQV9CUlNUICAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfU0dYSUFfUlNQICAgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0NBTUlBX0JSU1QgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9DQU1JQV9SU1AgICAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfRElTUElBX0JSU1QgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0RJU1BJQV9SU1AgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9ETUFSRElBX0JSU1QgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfRE1BUkRJQV9SU1AgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0RNQVdSSUFfQlJTVCAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9ETUFXUklBX1JTUCAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfVVNCT1RHSUFfQlJTVCAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX1VTQk9UR0lBX1JTUCAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9VU0JIT1NUSUFfQlJTVCAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfU01TVEFfUkVRICAgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0dQTUNUQV9SRVEgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9PQ01SQU1UQV9SRVEgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfT0NNUk9NVEFfUkVRICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0lWQVRBX1JFUSAgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9TR1hUQV9SRVEgICAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfTDRDT1JFVEFfUkVRICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0w0UEVSVEFfUkVRICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9MNEVNVVRBX1JFUSAgICAgICBcCisjZGVmaW5lIEwzX1NUQVRVU18wX1RJTUVPVVRfTUFTSwkoTDNfU1RBVFVTXzBfTVBVSUFfQlJTVAkJXAorCQkJCQl8IEwzX1NUQVRVU18wX01QVUlBX1JTUAkJXAorCQkJCQl8IEwzX1NUQVRVU18wX0lWQUlBX0JSU1QJXAorCQkJCQl8IEwzX1NUQVRVU18wX0lWQUlBX1JTUAkJXAorCQkJCQl8IEwzX1NUQVRVU18wX1NHWElBX0JSU1QJXAorCQkJCQl8IEwzX1NUQVRVU18wX1NHWElBX1JTUAkJXAorCQkJCQl8IEwzX1NUQVRVU18wX0NBTUlBX0JSU1QJXAorCQkJCQl8IEwzX1NUQVRVU18wX0NBTUlBX1JTUAkJXAorCQkJCQl8IEwzX1NUQVRVU18wX0RJU1BJQV9CUlNUCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9ESVNQSUFfUlNQCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9ETUFSRElBX0JSU1QJXAorCQkJCQl8IEwzX1NUQVRVU18wX0RNQVJESUFfUlNQCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9ETUFXUklBX0JSU1QJXAorCQkJCQl8IEwzX1NUQVRVU18wX0RNQVdSSUFfUlNQCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9VU0JPVEdJQV9CUlNUCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9VU0JPVEdJQV9SU1AJXAorCQkJCQl8IEwzX1NUQVRVU18wX1VTQkhPU1RJQV9CUlNUCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9TTVNUQV9SRVEJCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9HUE1DVEFfUkVRCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9PQ01SQU1UQV9SRVEJXAorCQkJCQl8IEwzX1NUQVRVU18wX09DTVJPTVRBX1JFUQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfSVZBVEFfUkVRCQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfU0dYVEFfUkVRCQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfTDRDT1JFVEFfUkVRCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9MNFBFUlRBX1JFUQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfTDRFTVVUQV9SRVEJXAogCQkJCQl8IEwzX1NUQVRVU18wX01BRDJEVEFfUkVRKQogCiAjZGVmaW5lIEwzX1NJX0ZMQUdfU1RBVFVTXzEJCTB4NTMwCkBAIC0xMzcsMTkgKzEzNywxOSBAQAogCiBlbnVtIG9tYXAzX2wzX2luaXRpYXRvcl9pZCB7CiAJLyogTENEIGhhcyAxIElEICovCi0JT01BUF9MM19MQ0QJICAgICAgICA9IDI5LAorCU9NQVBfTDNfTENEID0gMjksCiAJLyogU0FEMkQgaGFzIDEgSUQgKi8KLQlPTUFQX0wzX1NBRDJECQk9IDI4LAorCU9NQVBfTDNfU0FEMkQgPSAyOCwKIAkvKiBNUFUgaGFzIDUgSURzICovCi0JT01BUF9MM19JQV9NUFVfU1NfMSAgICAgPSAyNywKLQlPTUFQX0wzX0lBX01QVV9TU18yICAgICA9IDI2LAotCU9NQVBfTDNfSUFfTVBVX1NTXzMgICAgID0gMjUsCi0JT01BUF9MM19JQV9NUFVfU1NfNCAgICAgPSAyNCwKLQlPTUFQX0wzX0lBX01QVV9TU181ICAgICA9IDIzLAorCU9NQVBfTDNfSUFfTVBVX1NTXzEgPSAyNywKKwlPTUFQX0wzX0lBX01QVV9TU18yID0gMjYsCisJT01BUF9MM19JQV9NUFVfU1NfMyA9IDI1LAorCU9NQVBfTDNfSUFfTVBVX1NTXzQgPSAyNCwKKwlPTUFQX0wzX0lBX01QVV9TU181ID0gMjMsCiAJLyogSVZBMi4yIFNTIGhhcyAzIElEcyovCi0JT01BUF9MM19JQV9JVkFfU1NfMSAgICAgPSAyMiwKLQlPTUFQX0wzX0lBX0lWQV9TU18yICAgICA9IDIxLAotCU9NQVBfTDNfSUFfSVZBX1NTXzMgICAgID0gMjAsCisJT01BUF9MM19JQV9JVkFfU1NfMSA9IDIyLAorCU9NQVBfTDNfSUFfSVZBX1NTXzIgPSAyMSwKKwlPTUFQX0wzX0lBX0lWQV9TU18zID0gMjAsCiAJLyogSVZBIDIuMiBTUyBETUEgaGFzIDYgSURTICovCiAJT01BUF9MM19JQV9JVkFfU1NfRE1BXzEgPSAxOSwKIAlPTUFQX0wzX0lBX0lWQV9TU19ETUFfMiA9IDE4LApAQCAtMTU4LDI1ICsxNTgsMjUgQEAKIAlPTUFQX0wzX0lBX0lWQV9TU19ETUFfNSA9IDE1LAogCU9NQVBfTDNfSUFfSVZBX1NTX0RNQV82ID0gMTQsCiAJLyogU0dYIGhhcyAxIElEICovCi0JT01BUF9MM19JQV9TR1gJCT0gMTMsCisJT01BUF9MM19JQV9TR1ggPSAxMywKIAkvKiBDQU0gaGFzIDMgSUQgKi8KLQlPTUFQX0wzX0lBX0NBTV8xCT0gMTIsCi0JT01BUF9MM19JQV9DQU1fMgk9IDExLAotCU9NQVBfTDNfSUFfQ0FNXzMJPSAxMCwKKwlPTUFQX0wzX0lBX0NBTV8xID0gMTIsCisJT01BUF9MM19JQV9DQU1fMiA9IDExLAorCU9NQVBfTDNfSUFfQ0FNXzMgPSAxMCwKIAkvKiBEQVAgaGFzIDEgSUQgKi8KLQlPTUFQX0wzX0lBX0RBUAkJPSA5LAorCU9NQVBfTDNfSUFfREFQID0gOSwKIAkvKiBTRE1BIFdSIGhhcyAyIElEcyAqLwotCU9NQVBfTDNfU0RNQV9XUl8xCT0gOCwKLQlPTUFQX0wzX1NETUFfV1JfMgk9IDcsCisJT01BUF9MM19TRE1BX1dSXzEgPSA4LAorCU9NQVBfTDNfU0RNQV9XUl8yID0gNywKIAkvKiBTRE1BIFJEIGhhcyA0IElEcyAqLwotCU9NQVBfTDNfU0RNQV9SRF8xCT0gNiwKLQlPTUFQX0wzX1NETUFfUkRfMgk9IDUsCi0JT01BUF9MM19TRE1BX1JEXzMJPSA0LAotCU9NQVBfTDNfU0RNQV9SRF80CT0gMywKKwlPTUFQX0wzX1NETUFfUkRfMSA9IDYsCisJT01BUF9MM19TRE1BX1JEXzIgPSA1LAorCU9NQVBfTDNfU0RNQV9SRF8zID0gNCwKKwlPTUFQX0wzX1NETUFfUkRfNCA9IDMsCiAJLyogSFNVU0IgT1RHIGhhcyAxIElEICovCi0JT01BUF9MM19VU0JPVEcJCT0gMiwKKwlPTUFQX0wzX1VTQk9URyA9IDIsCiAJLyogSFNVU0IgSE9TVCBoYXMgMSBJRCAqLwotCU9NQVBfTDNfVVNCSE9TVAkJPSAxLAorCU9NQVBfTDNfVVNCSE9TVCA9IDEsCiB9OwogCiBlbnVtIG9tYXAzX2wzX2NvZGUgewpAQCAtMTkyLDIxICsxOTIsMjEgQEAKIH07CiAKIHN0cnVjdCBvbWFwM19sMyB7Ci0Jc3RydWN0IGRldmljZSAgICpkZXY7Ci0Jc3RydWN0IGNsayAgICAgICppY2s7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBjbGsgKmljazsKIAogCS8qIG1lbW9yeSBiYXNlKi8KLQl2b2lkIF9faW9tZW0gICAgKnJ0OworCXZvaWQgX19pb21lbSAqcnQ7CiAKLQlpbnQgICAgICAgICAgICAgZGVidWdfaXJxOwotCWludCAgICAgICAgICAgICBhcHBfaXJxOworCWludCBkZWJ1Z19pcnE7CisJaW50IGFwcF9pcnE7CiAKIAkvKiB0cnVlIHdoZW4gYW5kIGluYmFuZCBmdW5jdGlvbmFsIGVycm9yIG9jY3VycyAqLwotCXVuc2lnbmVkICAgICAgICBpbmJhbmQ6MTsKKwl1bnNpZ25lZCBpbmJhbmQ6MTsKIH07CiAKIC8qIG9mZnNldHMgZm9yIGwzIGFnZW50cyBpbiBvcmRlciB3aXRoIHRoZSBGbGFnIHN0YXR1cyByZWdpc3RlciAqLwotdW5zaWduZWQgaW50IF9faW9tZW0gb21hcDNfbDNfYXBwX2Jhc2VzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgaW50IG9tYXAzX2wzX2FwcF9iYXNlc1tdID0gewogCS8qIE1QVSBJQSAqLwogCTB4MTQwMCwKIAkweDE0MDAsCkBAIC0zMDUsNyArMzA1LDcgQEAKIAkwLAogfTsKIAotdW5zaWduZWQgaW50IF9faW9tZW0gb21hcDNfbDNfZGVidWdfYmFzZXNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb21hcDNfbDNfZGVidWdfYmFzZXNbXSA9IHsKIAkvKiBNUFUgREFUQSBJQSAqLwogCTB4MTQwMCwKIAkvKiBSRVNFUlZFRCAqLwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJLyogUkVTVCBSRVNFUlZFRCAqLwogfTsKIAotdTMyICpvbWFwM19sM19iYXNlc1tdID0geworc3RhdGljIHUzMiAqb21hcDNfbDNfYmFzZXNbXSA9IHsKIAlvbWFwM19sM19hcHBfYmFzZXMsCiAJb21hcDNfbDNfZGVidWdfYmFzZXMsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3R3bC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3R3bC5jCmluZGV4IDA3ZDYxNDAuLmY1MTVhMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF90d2wuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfdHdsLmMKQEAgLTQyLDggKzQyLDExIEBACiAKICNkZWZpbmUgT01BUDRfU1JJMkNfU0xBVkVfQUREUgkJMHgxMgogI2RlZmluZSBPTUFQNF9WRERfTVBVX1NSX1ZPTFRfUkVHCTB4NTUKKyNkZWZpbmUgT01BUDRfVkREX01QVV9TUl9DTURfUkVHCTB4NTYKICNkZWZpbmUgT01BUDRfVkREX0lWQV9TUl9WT0xUX1JFRwkweDVCCisjZGVmaW5lIE9NQVA0X1ZERF9JVkFfU1JfQ01EX1JFRwkweDVDCiAjZGVmaW5lIE9NQVA0X1ZERF9DT1JFX1NSX1ZPTFRfUkVHCTB4NjEKKyNkZWZpbmUgT01BUDRfVkREX0NPUkVfU1JfQ01EX1JFRwkweDYyCiAKICNkZWZpbmUgT01BUDRfVlBfQ09ORklHX0VSUk9ST0ZGU0VUCTB4MDAKICNkZWZpbmUgT01BUDRfVlBfVlNURVBNSU5fVlNURVBNSU4JMHgwMQpAQCAtOTUsNiArOTgsOCBAQAogCQlpc19vZmZzZXRfdmFsaWQgPSB0cnVlOwogCX0KIAorCWlmICghdnNlbCkKKwkJcmV0dXJuIDA7CiAJLyoKIAkgKiBUaGVyZSBpcyBubyBzcGVjaWZpYyBmb3JtdWxhIGZvciB2b2x0YWdlIHRvIHZzZWwKIAkgKiBjb252ZXJzaW9uIGFib3ZlIDEuM1YuIFRoZXJlIGFyZSBzcGVjaWFsIGhhcmRjb2RlZApAQCAtMTA2LDkgKzExMSw5IEBACiAJCXJldHVybiAxMzUwMDAwOwogCiAJaWYgKHNtcHNfb2Zmc2V0ICYgMHg4KQotCQlyZXR1cm4gKCgoKHZzZWwgLSAxKSAqIDEyNSkgKyA3MDAwKSkgKiAxMDA7CisJCXJldHVybiAoKCgodnNlbCAtIDEpICogMTI2NikgKyA3MDkwMCkpICogMTA7CiAJZWxzZQotCQlyZXR1cm4gKCgoKHZzZWwgLSAxKSAqIDEyNSkgKyA2MDAwKSkgKiAxMDA7CisJCXJldHVybiAoKCgodnNlbCAtIDEpICogMTI2NikgKyA2MDc3MCkpICogMTA7CiB9CiAKIHN0YXRpYyB1OCB0d2w2MDMwX3V2X3RvX3ZzZWwodW5zaWduZWQgbG9uZyB1dikKQEAgLTEyNyw2ICsxMzIsOCBAQAogCQlpc19vZmZzZXRfdmFsaWQgPSB0cnVlOwogCX0KIAorCWlmICghdXYpCisJCXJldHVybiAweDAwOwogCS8qCiAJICogVGhlcmUgaXMgbm8gc3BlY2lmaWMgZm9ybXVsYSBmb3Igdm9sdGFnZSB0byB2c2VsCiAJICogY29udmVyc2lvbiBhYm92ZSAxLjNWLiBUaGVyZSBhcmUgc3BlY2lhbCBoYXJkY29kZWQKQEAgLTEzNCwxNiArMTQxLDIxIEBACiAJICogaGFyZGNvZGluZyBvbmx5IGZvciAxLjM1IFYgd2hpY2ggaXMgdXNlZCBmb3IgMUdIIE9QUCBmb3IKIAkgKiBPTUFQNDQzMC4KIAkgKi8KLQlpZiAodXYgPT0gMTM1MDAwMCkKKwlpZiAodXYgPiB0d2w2MDMwX3ZzZWxfdG9fdXYoMHgzOSkpIHsKKwkJaWYgKHV2ID09IDEzNTAwMDApCisJCQlyZXR1cm4gMHgzQTsKKwkJcHJfZXJyKCIlczpPVVQgT0YgUkFOR0UhIG5vbiBtYXBwZWQgdnNlbCBmb3IgJWxkIFZzIG1heCAlbGRcbiIsCisJCQlfX2Z1bmNfXywgdXYsIHR3bDYwMzBfdnNlbF90b191digweDM5KSk7CiAJCXJldHVybiAweDNBOworCX0KIAogCWlmIChzbXBzX29mZnNldCAmIDB4OCkKLQkJcmV0dXJuIERJVl9ST1VORF9VUCh1diAtIDcwMDAwMCwgMTI1MDApICsgMTsKKwkJcmV0dXJuIERJVl9ST1VORF9VUCh1diAtIDcwOTAwMCwgMTI2NjApICsgMTsKIAllbHNlCi0JCXJldHVybiBESVZfUk9VTkRfVVAodXYgLSA2MDAwMDAsIDEyNTAwKSArIDE7CisJCXJldHVybiBESVZfUk9VTkRfVVAodXYgLSA2MDc3MDAsIDEyNjYwKSArIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyBvbWFwM19tcHVfdm9sdF9pbmZvID0geworc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRkbV9wbWljIG9tYXAzX21wdV9wbWljID0gewogCS5zbGV3X3JhdGUJCT0gNDAwMCwKIAkuc3RlcF9zaXplCQk9IDEyNTAwLAogCS5vbl92b2x0CQk9IDEyMDAwMDAsCkBAIC0xNTgsMTIgKzE3MCwxMyBAQAogCS52cF92ZGRtYXgJCT0gT01BUDM0MzBfVlAxX1ZMSU1JVFRPX1ZERE1BWCwKIAkudnBfdGltZW91dF91cwkJPSBPTUFQM19WUF9WTElNSVRUT19USU1FT1VUX1VTLAogCS5pMmNfc2xhdmVfYWRkcgkJPSBPTUFQM19TUkkyQ19TTEFWRV9BRERSLAotCS5wbWljX3JlZwkJPSBPTUFQM19WRERfTVBVX1NSX0NPTlRST0xfUkVHLAorCS52b2x0X3JlZ19hZGRyCQk9IE9NQVAzX1ZERF9NUFVfU1JfQ09OVFJPTF9SRUcsCisJLmkyY19oaWdoX3NwZWVkCQk9IHRydWUsCiAJLnZzZWxfdG9fdXYJCT0gdHdsNDAzMF92c2VsX3RvX3V2LAogCS51dl90b192c2VsCQk9IHR3bDQwMzBfdXZfdG9fdnNlbCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyBvbWFwM19jb3JlX3ZvbHRfaW5mbyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF92b2x0ZG1fcG1pYyBvbWFwM19jb3JlX3BtaWMgPSB7CiAJLnNsZXdfcmF0ZQkJPSA0MDAwLAogCS5zdGVwX3NpemUJCT0gMTI1MDAsCiAJLm9uX3ZvbHQgICAgICAgICAgICAgICAgPSAxMjAwMDAwLApAQCAtMTc4LDE4ICsxOTEsMTkgQEAKIAkudnBfdmRkbWF4CQk9IE9NQVAzNDMwX1ZQMl9WTElNSVRUT19WRERNQVgsCiAJLnZwX3RpbWVvdXRfdXMJCT0gT01BUDNfVlBfVkxJTUlUVE9fVElNRU9VVF9VUywKIAkuaTJjX3NsYXZlX2FkZHIJCT0gT01BUDNfU1JJMkNfU0xBVkVfQUREUiwKLQkucG1pY19yZWcJCT0gT01BUDNfVkREX0NPUkVfU1JfQ09OVFJPTF9SRUcsCisJLnZvbHRfcmVnX2FkZHIJCT0gT01BUDNfVkREX0NPUkVfU1JfQ09OVFJPTF9SRUcsCisJLmkyY19oaWdoX3NwZWVkCQk9IHRydWUsCiAJLnZzZWxfdG9fdXYJCT0gdHdsNDAzMF92c2VsX3RvX3V2LAogCS51dl90b192c2VsCQk9IHR3bDQwMzBfdXZfdG9fdnNlbCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyBvbWFwNF9tcHVfdm9sdF9pbmZvID0geworc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRkbV9wbWljIG9tYXA0X21wdV9wbWljID0gewogCS5zbGV3X3JhdGUJCT0gNDAwMCwKLQkuc3RlcF9zaXplCQk9IDEyNTAwLAotCS5vbl92b2x0CQk9IDEzNTAwMDAsCi0JLm9ubHBfdm9sdAkJPSAxMzUwMDAwLAotCS5yZXRfdm9sdAkJPSA4Mzc1MDAsCi0JLm9mZl92b2x0CQk9IDYwMDAwMCwKKwkuc3RlcF9zaXplCQk9IDEyNjYwLAorCS5vbl92b2x0CQk9IDEzNzUwMDAsCisJLm9ubHBfdm9sdAkJPSAxMzc1MDAwLAorCS5yZXRfdm9sdAkJPSA4MzAwMDAsCisJLm9mZl92b2x0CQk9IDAsCiAJLnZvbHRfc2V0dXBfdGltZQk9IDAsCiAJLnZwX2Vycm9yb2Zmc2V0CQk9IE9NQVA0X1ZQX0NPTkZJR19FUlJPUk9GRlNFVCwKIAkudnBfdnN0ZXBtaW4JCT0gT01BUDRfVlBfVlNURVBNSU5fVlNURVBNSU4sCkBAIC0xOTgsMTggKzIxMiwyMCBAQAogCS52cF92ZGRtYXgJCT0gT01BUDRfVlBfTVBVX1ZMSU1JVFRPX1ZERE1BWCwKIAkudnBfdGltZW91dF91cwkJPSBPTUFQNF9WUF9WTElNSVRUT19USU1FT1VUX1VTLAogCS5pMmNfc2xhdmVfYWRkcgkJPSBPTUFQNF9TUkkyQ19TTEFWRV9BRERSLAotCS5wbWljX3JlZwkJPSBPTUFQNF9WRERfTVBVX1NSX1ZPTFRfUkVHLAorCS52b2x0X3JlZ19hZGRyCQk9IE9NQVA0X1ZERF9NUFVfU1JfVk9MVF9SRUcsCisJLmNtZF9yZWdfYWRkcgkJPSBPTUFQNF9WRERfTVBVX1NSX0NNRF9SRUcsCisJLmkyY19oaWdoX3NwZWVkCQk9IHRydWUsCiAJLnZzZWxfdG9fdXYJCT0gdHdsNjAzMF92c2VsX3RvX3V2LAogCS51dl90b192c2VsCQk9IHR3bDYwMzBfdXZfdG9fdnNlbCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyBvbWFwNF9pdmFfdm9sdF9pbmZvID0geworc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRkbV9wbWljIG9tYXA0X2l2YV9wbWljID0gewogCS5zbGV3X3JhdGUJCT0gNDAwMCwKLQkuc3RlcF9zaXplCQk9IDEyNTAwLAotCS5vbl92b2x0CQk9IDExMDAwMDAsCi0JLm9ubHBfdm9sdAkJPSAxMTAwMDAwLAotCS5yZXRfdm9sdAkJPSA4Mzc1MDAsCi0JLm9mZl92b2x0CQk9IDYwMDAwMCwKKwkuc3RlcF9zaXplCQk9IDEyNjYwLAorCS5vbl92b2x0CQk9IDExODgwMDAsCisJLm9ubHBfdm9sdAkJPSAxMTg4MDAwLAorCS5yZXRfdm9sdAkJPSA4MzAwMDAsCisJLm9mZl92b2x0CQk9IDAsCiAJLnZvbHRfc2V0dXBfdGltZQk9IDAsCiAJLnZwX2Vycm9yb2Zmc2V0CQk9IE9NQVA0X1ZQX0NPTkZJR19FUlJPUk9GRlNFVCwKIAkudnBfdnN0ZXBtaW4JCT0gT01BUDRfVlBfVlNURVBNSU5fVlNURVBNSU4sCkBAIC0yMTgsMTggKzIzNCwyMCBAQAogCS52cF92ZGRtYXgJCT0gT01BUDRfVlBfSVZBX1ZMSU1JVFRPX1ZERE1BWCwKIAkudnBfdGltZW91dF91cwkJPSBPTUFQNF9WUF9WTElNSVRUT19USU1FT1VUX1VTLAogCS5pMmNfc2xhdmVfYWRkcgkJPSBPTUFQNF9TUkkyQ19TTEFWRV9BRERSLAotCS5wbWljX3JlZwkJPSBPTUFQNF9WRERfSVZBX1NSX1ZPTFRfUkVHLAorCS52b2x0X3JlZ19hZGRyCQk9IE9NQVA0X1ZERF9JVkFfU1JfVk9MVF9SRUcsCisJLmNtZF9yZWdfYWRkcgkJPSBPTUFQNF9WRERfSVZBX1NSX0NNRF9SRUcsCisJLmkyY19oaWdoX3NwZWVkCQk9IHRydWUsCiAJLnZzZWxfdG9fdXYJCT0gdHdsNjAzMF92c2VsX3RvX3V2LAogCS51dl90b192c2VsCQk9IHR3bDYwMzBfdXZfdG9fdnNlbCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyBvbWFwNF9jb3JlX3ZvbHRfaW5mbyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF92b2x0ZG1fcG1pYyBvbWFwNF9jb3JlX3BtaWMgPSB7CiAJLnNsZXdfcmF0ZQkJPSA0MDAwLAotCS5zdGVwX3NpemUJCT0gMTI1MDAsCi0JLm9uX3ZvbHQJCT0gMTEwMDAwMCwKLQkub25scF92b2x0CQk9IDExMDAwMDAsCi0JLnJldF92b2x0CQk9IDgzNzUwMCwKLQkub2ZmX3ZvbHQJCT0gNjAwMDAwLAorCS5zdGVwX3NpemUJCT0gMTI2NjAsCisJLm9uX3ZvbHQJCT0gMTIwMDAwMCwKKwkub25scF92b2x0CQk9IDEyMDAwMDAsCisJLnJldF92b2x0CQk9IDgzMDAwMCwKKwkub2ZmX3ZvbHQJCT0gMCwKIAkudm9sdF9zZXR1cF90aW1lCT0gMCwKIAkudnBfZXJyb3JvZmZzZXQJCT0gT01BUDRfVlBfQ09ORklHX0VSUk9ST0ZGU0VULAogCS52cF92c3RlcG1pbgkJPSBPTUFQNF9WUF9WU1RFUE1JTl9WU1RFUE1JTiwKQEAgLTIzOCw3ICsyNTYsOCBAQAogCS52cF92ZGRtYXgJCT0gT01BUDRfVlBfQ09SRV9WTElNSVRUT19WRERNQVgsCiAJLnZwX3RpbWVvdXRfdXMJCT0gT01BUDRfVlBfVkxJTUlUVE9fVElNRU9VVF9VUywKIAkuaTJjX3NsYXZlX2FkZHIJCT0gT01BUDRfU1JJMkNfU0xBVkVfQUREUiwKLQkucG1pY19yZWcJCT0gT01BUDRfVkREX0NPUkVfU1JfVk9MVF9SRUcsCisJLnZvbHRfcmVnX2FkZHIJCT0gT01BUDRfVkREX0NPUkVfU1JfVk9MVF9SRUcsCisJLmNtZF9yZWdfYWRkcgkJPSBPTUFQNF9WRERfQ09SRV9TUl9DTURfUkVHLAogCS52c2VsX3RvX3V2CQk9IHR3bDYwMzBfdnNlbF90b191diwKIAkudXZfdG9fdnNlbAkJPSB0d2w2MDMwX3V2X3RvX3ZzZWwsCiB9OwpAQCAtMjUwLDE0ICsyNjksMTQgQEAKIAlpZiAoIWNwdV9pc19vbWFwNDR4eCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXZvbHRkbSA9IG9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKCJtcHUiKTsKLQlvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyh2b2x0ZG0sICZvbWFwNF9tcHVfdm9sdF9pbmZvKTsKKwl2b2x0ZG0gPSB2b2x0ZG1fbG9va3VwKCJtcHUiKTsKKwlvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyh2b2x0ZG0sICZvbWFwNF9tcHVfcG1pYyk7CiAKLQl2b2x0ZG0gPSBvbWFwX3ZvbHRhZ2VfZG9tYWluX2xvb2t1cCgiaXZhIik7Ci0Jb21hcF92b2x0YWdlX3JlZ2lzdGVyX3BtaWModm9sdGRtLCAmb21hcDRfaXZhX3ZvbHRfaW5mbyk7CisJdm9sdGRtID0gdm9sdGRtX2xvb2t1cCgiaXZhIik7CisJb21hcF92b2x0YWdlX3JlZ2lzdGVyX3BtaWModm9sdGRtLCAmb21hcDRfaXZhX3BtaWMpOwogCi0Jdm9sdGRtID0gb21hcF92b2x0YWdlX2RvbWFpbl9sb29rdXAoImNvcmUiKTsKLQlvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyh2b2x0ZG0sICZvbWFwNF9jb3JlX3ZvbHRfaW5mbyk7CisJdm9sdGRtID0gdm9sdGRtX2xvb2t1cCgiY29yZSIpOworCW9tYXBfdm9sdGFnZV9yZWdpc3Rlcl9wbWljKHZvbHRkbSwgJm9tYXA0X2NvcmVfcG1pYyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI3MCwxMCArMjg5LDEwIEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKGNwdV9pc19vbWFwMzYzMCgpKSB7Ci0JCW9tYXAzX21wdV92b2x0X2luZm8udnBfdmRkbWluID0gT01BUDM2MzBfVlAxX1ZMSU1JVFRPX1ZERE1JTjsKLQkJb21hcDNfbXB1X3ZvbHRfaW5mby52cF92ZGRtYXggPSBPTUFQMzYzMF9WUDFfVkxJTUlUVE9fVkRETUFYOwotCQlvbWFwM19jb3JlX3ZvbHRfaW5mby52cF92ZGRtaW4gPSBPTUFQMzYzMF9WUDJfVkxJTUlUVE9fVkRETUlOOwotCQlvbWFwM19jb3JlX3ZvbHRfaW5mby52cF92ZGRtYXggPSBPTUFQMzYzMF9WUDJfVkxJTUlUVE9fVkRETUFYOworCQlvbWFwM19tcHVfcG1pYy52cF92ZGRtaW4gPSBPTUFQMzYzMF9WUDFfVkxJTUlUVE9fVkRETUlOOworCQlvbWFwM19tcHVfcG1pYy52cF92ZGRtYXggPSBPTUFQMzYzMF9WUDFfVkxJTUlUVE9fVkRETUFYOworCQlvbWFwM19jb3JlX3BtaWMudnBfdmRkbWluID0gT01BUDM2MzBfVlAyX1ZMSU1JVFRPX1ZERE1JTjsKKwkJb21hcDNfY29yZV9wbWljLnZwX3ZkZG1heCA9IE9NQVAzNjMwX1ZQMl9WTElNSVRUT19WRERNQVg7CiAJfQogCiAJLyoKQEAgLTI4OCwxMSArMzA3LDExIEBACiAJaWYgKCF0d2xfc3JfZW5hYmxlX2F1dG9pbml0KQogCQlvbWFwM190d2xfc2V0X3NyX2JpdCh0cnVlKTsKIAotCXZvbHRkbSA9IG9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKCJtcHUiKTsKLQlvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyh2b2x0ZG0sICZvbWFwM19tcHVfdm9sdF9pbmZvKTsKKwl2b2x0ZG0gPSB2b2x0ZG1fbG9va3VwKCJtcHVfaXZhIik7CisJb21hcF92b2x0YWdlX3JlZ2lzdGVyX3BtaWModm9sdGRtLCAmb21hcDNfbXB1X3BtaWMpOwogCi0Jdm9sdGRtID0gb21hcF92b2x0YWdlX2RvbWFpbl9sb29rdXAoImNvcmUiKTsKLQlvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyh2b2x0ZG0sICZvbWFwM19jb3JlX3ZvbHRfaW5mbyk7CisJdm9sdGRtID0gdm9sdGRtX2xvb2t1cCgiY29yZSIpOworCW9tYXBfdm9sdGFnZV9yZWdpc3Rlcl9wbWljKHZvbHRkbSwgJm9tYXAzX2NvcmVfcG1pYyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb3BwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29wcC5jCmluZGV4IGFiOGIzNWIuLjkyNjJhNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb3BwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vcHAuYwpAQCAtNjksNyArNjksNyBAQAogCQkJCW9wcF9kZWYtPmh3bW9kX25hbWUsIGkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJZGV2ID0gJm9oLT5vZC0+cGRldi5kZXY7CisJCWRldiA9ICZvaC0+b2QtPnBkZXYtPmRldjsKIAogCQlyID0gb3BwX2FkZChkZXYsIG9wcF9kZWYtPmZyZXEsIG9wcF9kZWYtPnVfdm9sdCk7CiAJCWlmIChyKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLmMKaW5kZXggNDcyYmYyMi4uMWU3OWJkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0uYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvb3BwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxwbGF0L29tYXAtcG0uaD4KICNpbmNsdWRlIDxwbGF0L29tYXBfZGV2aWNlLmg+CkBAIC0yNiw1NCArMjcsMjEgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5ICpwbV9sYXRzOwogCi1zdGF0aWMgc3RydWN0IGRldmljZSAqbXB1X2RldjsKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICppdmFfZGV2Owotc3RhdGljIHN0cnVjdCBkZXZpY2UgKmwzX2RldjsKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpkc3BfZGV2OwotCi1zdHJ1Y3QgZGV2aWNlICpvbWFwMl9nZXRfbXB1c3NfZGV2aWNlKHZvaWQpCi17Ci0JV0FSTl9PTl9PTkNFKCFtcHVfZGV2KTsKLQlyZXR1cm4gbXB1X2RldjsKLX0KLQotc3RydWN0IGRldmljZSAqb21hcDJfZ2V0X2l2YV9kZXZpY2Uodm9pZCkKLXsKLQlXQVJOX09OX09OQ0UoIWl2YV9kZXYpOwotCXJldHVybiBpdmFfZGV2OwotfQotCi1zdHJ1Y3QgZGV2aWNlICpvbWFwMl9nZXRfbDNfZGV2aWNlKHZvaWQpCi17Ci0JV0FSTl9PTl9PTkNFKCFsM19kZXYpOwotCXJldHVybiBsM19kZXY7Ci19Ci0KLXN0cnVjdCBkZXZpY2UgKm9tYXA0X2dldF9kc3BfZGV2aWNlKHZvaWQpCi17Ci0JV0FSTl9PTl9PTkNFKCFkc3BfZGV2KTsKLQlyZXR1cm4gZHNwX2RldjsKLX0KLUVYUE9SVF9TWU1CT0wob21hcDRfZ2V0X2RzcF9kZXZpY2UpOwotCi0vKiBzdGF0aWMgaW50IF9pbml0X29tYXBfZGV2aWNlKHN0cnVjdCBvbWFwX2h3bW9kICpvaCwgdm9pZCAqdXNlcikgKi8KLXN0YXRpYyBpbnQgX2luaXRfb21hcF9kZXZpY2UoY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqKm5ld19kZXYpCitzdGF0aWMgaW50IF9pbml0X29tYXBfZGV2aWNlKGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IG9tYXBfaHdtb2QgKm9oOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAogCW9oID0gb21hcF9od21vZF9sb29rdXAobmFtZSk7CiAJaWYgKFdBUk4oIW9oLCAiJXM6IGNvdWxkIG5vdCBmaW5kIG9tYXBfaHdtb2QgZm9yICVzXG4iLAogCQkgX19mdW5jX18sIG5hbWUpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW9kID0gb21hcF9kZXZpY2VfYnVpbGQob2gtPm5hbWUsIDAsIG9oLCBOVUxMLCAwLCBwbV9sYXRzLCAwLCBmYWxzZSk7Ci0JaWYgKFdBUk4oSVNfRVJSKG9kKSwgIiVzOiBjb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzXG4iLAorCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZChvaC0+bmFtZSwgMCwgb2gsIE5VTEwsIDAsIHBtX2xhdHMsIDAsIGZhbHNlKTsKKwlpZiAoV0FSTihJU19FUlIocGRldiksICIlczogY291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlc1xuIiwKIAkJIF9fZnVuY19fLCBuYW1lKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkqbmV3X2RldiA9ICZvZC0+cGRldi5kZXY7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODIsMTYgKzUwLDE2IEBACiAgKi8KIHN0YXRpYyB2b2lkIG9tYXAyX2luaXRfcHJvY2Vzc29yX2RldmljZXModm9pZCkKIHsKLQlfaW5pdF9vbWFwX2RldmljZSgibXB1IiwgJm1wdV9kZXYpOworCV9pbml0X29tYXBfZGV2aWNlKCJtcHUiKTsKIAlpZiAob21hcDNfaGFzX2l2YSgpKQotCQlfaW5pdF9vbWFwX2RldmljZSgiaXZhIiwgJml2YV9kZXYpOworCQlfaW5pdF9vbWFwX2RldmljZSgiaXZhIik7CiAKIAlpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJX2luaXRfb21hcF9kZXZpY2UoImwzX21haW5fMSIsICZsM19kZXYpOwotCQlfaW5pdF9vbWFwX2RldmljZSgiZHNwIiwgJmRzcF9kZXYpOwotCQlfaW5pdF9vbWFwX2RldmljZSgiaXZhIiwgJml2YV9kZXYpOworCQlfaW5pdF9vbWFwX2RldmljZSgibDNfbWFpbl8xIik7CisJCV9pbml0X29tYXBfZGV2aWNlKCJkc3AiKTsKKwkJX2luaXRfb21hcF9kZXZpY2UoIml2YSIpOwogCX0gZWxzZSB7Ci0JCV9pbml0X29tYXBfZGV2aWNlKCJsM19tYWluIiwgJmwzX2Rldik7CisJCV9pbml0X29tYXBfZGV2aWNlKCJsM19tYWluIik7CiAJfQogfQogCkBAIC0xMzYsOCArMTA0LDggQEAKIAogCXJldCA9IHB3cmRtX3NldF9uZXh0X3B3cnN0KHB3cmRtLCBzdGF0ZSk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBzZXQgc3RhdGUgb2YgcG93ZXJkb21haW46ICVzXG4iLAotCQkgICAgICAgcHdyZG0tPm5hbWUpOworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gc2V0IHN0YXRlIG9mIHBvd2VyZG9tYWluOiAlc1xuIiwKKwkJICAgICAgIF9fZnVuY19fLCBwd3JkbS0+bmFtZSk7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMTYxLDM3ICsxMjksNDQgQEAKIH0KIAogLyoKLSAqIFRoaXMgQVBJIGlzIHRvIGJlIGNhbGxlZCBkdXJpbmcgaW5pdCB0byBwdXQgdGhlIHZhcmlvdXMgdm9sdGFnZQorICogVGhpcyBBUEkgaXMgdG8gYmUgY2FsbGVkIGR1cmluZyBpbml0IHRvIHNldCB0aGUgdmFyaW91cyB2b2x0YWdlCiAgKiBkb21haW5zIHRvIHRoZSB2b2x0YWdlIGFzIHBlciB0aGUgb3BwIHRhYmxlLiBUeXBpY2FsbHkgd2UgYm9vdCB1cAogICogYXQgdGhlIG5vbWluYWwgdm9sdGFnZS4gU28gdGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgdGhlIHJhdGUgb2YKICAqIHRoZSBjbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHZvbHRhZ2UgZG9tYWluLCBmaW5kcyBvdXQgdGhlIGNvcnJlY3QKLSAqIG9wcCBlbnRyeSBhbmQgcHV0cyB0aGUgdm9sdGFnZSBkb21haW4gdG8gdGhlIHZvbHRhZ2Ugc3BlY2lmaWVzCisgKiBvcHAgZW50cnkgYW5kIHNldHMgdGhlIHZvbHRhZ2UgZG9tYWluIHRvIHRoZSB2b2x0YWdlIHNwZWNpZmllZAogICogaW4gdGhlIG9wcCBlbnRyeQogICovCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9zZXRfaW5pdF92b2x0YWdlKGNoYXIgKnZkZF9uYW1lLCBjaGFyICpjbGtfbmFtZSwKLQkJCQkJCXN0cnVjdCBkZXZpY2UgKmRldikKKwkJCQkJIGNvbnN0IGNoYXIgKm9oX25hbWUpCiB7CiAJc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbTsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IG9wcCAqb3BwOwogCXVuc2lnbmVkIGxvbmcgZnJlcSwgYm9vdHVwX3ZvbHQ7CisJc3RydWN0IGRldmljZSAqZGV2OwogCi0JaWYgKCF2ZGRfbmFtZSB8fCAhY2xrX25hbWUgfHwgIWRldikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMhXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCF2ZGRfbmFtZSB8fCAhY2xrX25hbWUgfHwgIW9oX25hbWUpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbWV0ZXJzXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQl2b2x0ZG0gPSBvbWFwX3ZvbHRhZ2VfZG9tYWluX2xvb2t1cCh2ZGRfbmFtZSk7CisJZGV2ID0gb21hcF9kZXZpY2VfZ2V0X2J5X2h3bW9kX25hbWUob2hfbmFtZSk7CisJaWYgKElTX0VSUihkZXYpKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgZGV2IHBvaW50ZXIgZm9yIGh3bW9kICVzXG4iLAorCQkJX19mdW5jX18sIG9oX25hbWUpOworCQlnb3RvIGV4aXQ7CisJfQorCisJdm9sdGRtID0gdm9sdGRtX2xvb2t1cCh2ZGRfbmFtZSk7CiAJaWYgKElTX0VSUih2b2x0ZG0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBnZXQgdmRkIHBvaW50ZXIgZm9yIHZkZF8lc1xuIiwKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGdldCB2ZGQgcG9pbnRlciBmb3IgdmRkXyVzXG4iLAogCQkJX19mdW5jX18sIHZkZF9uYW1lKTsKIAkJZ290byBleGl0OwogCX0KIAogCWNsayA9ICBjbGtfZ2V0KE5VTEwsIGNsa19uYW1lKTsKIAlpZiAoSVNfRVJSKGNsaykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBjbGsgJXNcbiIsCi0JCQlfX2Z1bmNfXywgY2xrX25hbWUpOworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZ2V0IGNsayAlc1xuIiwgX19mdW5jX18sIGNsa19uYW1lKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjAwLDI0ICsxNzUsMjMgQEAKIAogCW9wcCA9IG9wcF9maW5kX2ZyZXFfY2VpbChkZXYsICZmcmVxKTsKIAlpZiAoSVNfRVJSKG9wcCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGZpbmQgYm9vdCB1cCBPUFAgZm9yIHZkZF8lc1xuIiwKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGZpbmQgYm9vdCB1cCBPUFAgZm9yIHZkZF8lc1xuIiwKIAkJCV9fZnVuY19fLCB2ZGRfbmFtZSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlib290dXBfdm9sdCA9IG9wcF9nZXRfdm9sdGFnZShvcHApOwogCWlmICghYm9vdHVwX3ZvbHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGZpbmQgdm9sdGFnZSBjb3JyZXNwb25kaW5nIgorCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZmluZCB2b2x0YWdlIGNvcnJlc3BvbmRpbmcgIgogCQkJInRvIHRoZSBib290dXAgT1BQIGZvciB2ZGRfJXNcbiIsIF9fZnVuY19fLCB2ZGRfbmFtZSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlvbWFwX3ZvbHRhZ2Vfc2NhbGVfdmRkKHZvbHRkbSwgYm9vdHVwX3ZvbHQpOworCXZvbHRkbV9zY2FsZSh2b2x0ZG0sIGJvb3R1cF92b2x0KTsKIAlyZXR1cm4gMDsKIAogZXhpdDoKLQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gcHV0IHZkZF8lcyB0byBpdHMgaW5pdCB2b2x0YWdlXG5cbiIsCi0JCV9fZnVuY19fLCB2ZGRfbmFtZSk7CisJcHJfZXJyKCIlczogdW5hYmxlIHRvIHNldCB2ZGRfJXNcbiIsIF9fZnVuY19fLCB2ZGRfbmFtZSk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTIyNiw4ICsyMDAsOCBAQAogCWlmICghY3B1X2lzX29tYXAzNHh4KCkpCiAJCXJldHVybjsKIAotCW9tYXAyX3NldF9pbml0X3ZvbHRhZ2UoIm1wdSIsICJkcGxsMV9jayIsIG1wdV9kZXYpOwotCW9tYXAyX3NldF9pbml0X3ZvbHRhZ2UoImNvcmUiLCAibDNfaWNrIiwgbDNfZGV2KTsKKwlvbWFwMl9zZXRfaW5pdF92b2x0YWdlKCJtcHVfaXZhIiwgImRwbGwxX2NrIiwgIm1wdSIpOworCW9tYXAyX3NldF9pbml0X3ZvbHRhZ2UoImNvcmUiLCAibDNfaWNrIiwgImwzX21haW4iKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXA0X2luaXRfdm9sdGFnZXModm9pZCkKQEAgLTIzNSwxNCArMjA5LDE1IEBACiAJaWYgKCFjcHVfaXNfb21hcDQ0eHgoKSkKIAkJcmV0dXJuOwogCi0Jb21hcDJfc2V0X2luaXRfdm9sdGFnZSgibXB1IiwgImRwbGxfbXB1X2NrIiwgbXB1X2Rldik7Ci0Jb21hcDJfc2V0X2luaXRfdm9sdGFnZSgiY29yZSIsICJsM19kaXZfY2siLCBsM19kZXYpOwotCW9tYXAyX3NldF9pbml0X3ZvbHRhZ2UoIml2YSIsICJkcGxsX2l2YV9tNXgyX2NrIiwgaXZhX2Rldik7CisJb21hcDJfc2V0X2luaXRfdm9sdGFnZSgibXB1IiwgImRwbGxfbXB1X2NrIiwgIm1wdSIpOworCW9tYXAyX3NldF9pbml0X3ZvbHRhZ2UoImNvcmUiLCAibDNfZGl2X2NrIiwgImwzX21haW5fMSIpOworCW9tYXAyX3NldF9pbml0X3ZvbHRhZ2UoIml2YSIsICJkcGxsX2l2YV9tNXgyX2NrIiwgIml2YSIpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9jb21tb25fcG1faW5pdCh2b2lkKQogewotCW9tYXAyX2luaXRfcHJvY2Vzc29yX2RldmljZXMoKTsKKwlpZiAoIW9mX2hhdmVfcG9wdWxhdGVkX2R0KCkpCisJCW9tYXAyX2luaXRfcHJvY2Vzc29yX2RldmljZXMoKTsKIAlvbWFwX3BtX2lmX2luaXQoKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTI0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0yNHh4LmMKaW5kZXggYmYwODllNy4uY2YwYzIxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTI0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMjR4eC5jCkBAIC01Myw4ICs1Myw2IEBACiAjaW5jbHVkZSAicG93ZXJkb21haW4uaCIKICNpbmNsdWRlICJjbG9ja2RvbWFpbi5oIgogCi1zdGF0aWMgaW50IG9tYXAyX3BtX2RlYnVnOwotCiAjaWZkZWYgQ09ORklHX1NVU1BFTkQKIHN0YXRpYyBzdXNwZW5kX3N0YXRlX3Qgc3VzcGVuZF9zdGF0ZSA9IFBNX1NVU1BFTkRfT047CiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfc3VzcGVuZGluZyh2b2lkKQpAQCAtOTYsNyArOTQsNiBAQAogc3RhdGljIHZvaWQgb21hcDJfZW50ZXJfZnVsbF9yZXRlbnRpb24odm9pZCkKIHsKIAl1MzIgbDsKLQlzdHJ1Y3QgdGltZXNwZWMgdHNfcHJlaWRsZSwgdHNfcG9zdGlkbGUsIHRzX2lkbGU7CiAKIAkvKiBUaGVyZSBpcyAxIHJlZmVyZW5jZSBob2xkIGZvciBhbGwgY2hpbGRyZW4gb2YgdGhlIG9zY2lsbGF0b3IKIAkgKiBjbG9jaywgdGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBpdC4gSWYgbm8gb25lIGVsc2UgdXNlcyB0aGUKQEAgLTEyNCwxMCArMTIxLDYgQEAKIAogCW9tYXAyX2dwaW9fcHJlcGFyZV9mb3JfaWRsZSgwKTsKIAotCWlmIChvbWFwMl9wbV9kZWJ1ZykgewotCQlnZXRuc3RpbWVvZmRheSgmdHNfcHJlaWRsZSk7Ci0JfQotCiAJLyogT25lIGxhc3QgY2hlY2sgZm9yIHBlbmRpbmcgSVJRcyB0byBhdm9pZCBleHRyYSBsYXRlbmN5IGR1ZQogCSAqIHRvIHNsZWVwaW5nIHVubmVjZXNzYXJpbHkuICovCiAJaWYgKG9tYXBfaXJxX3BlbmRpbmcoKSkKQEAgLTE1NSwxMyArMTQ4LDYgQEAKIAkJY29uc29sZV91bmxvY2soKTsKIAogbm9fc2xlZXA6Ci0JaWYgKG9tYXAyX3BtX2RlYnVnKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXA7Ci0KLQkJZ2V0bnN0aW1lb2ZkYXkoJnRzX3Bvc3RpZGxlKTsKLQkJdHNfaWRsZSA9IHRpbWVzcGVjX3N1Yih0c19wb3N0aWRsZSwgdHNfcHJlaWRsZSk7Ci0JCXRtcCA9IHRpbWVzcGVjX3RvX25zKCZ0c19pZGxlKSAqIE5TRUNfUEVSX1VTRUM7Ci0JfQogCW9tYXAyX2dwaW9fcmVzdW1lX2FmdGVyX2lkbGUoKTsKIAogCWNsa19lbmFibGUob3NjX2NrKTsKQEAgLTIxOSw3ICsyMDUsNiBAQAogc3RhdGljIHZvaWQgb21hcDJfZW50ZXJfbXB1X3JldGVudGlvbih2b2lkKQogewogCWludCBvbmx5X2lkbGUgPSAwOwotCXN0cnVjdCB0aW1lc3BlYyB0c19wcmVpZGxlLCB0c19wb3N0aWRsZSwgdHNfaWRsZTsKIAogCS8qIFB1dHRpbmcgTVBVIGludG8gdGhlIFdGSSBzdGF0ZSB3aGlsZSBhIHRyYW5zZmVyIGlzIGFjdGl2ZQogCSAqIHNlZW1zIHRvIGNhdXNlIHRoZSBJMkMgYmxvY2sgdG8gdGltZW91dC4gV2h5PyBHb29kIHF1ZXN0aW9uLiAqLwpAQCAtMjQ2LDE5ICsyMzEsNyBAQAogCQlvbmx5X2lkbGUgPSAxOwogCX0KIAotCWlmIChvbWFwMl9wbV9kZWJ1ZykgewotCQlnZXRuc3RpbWVvZmRheSgmdHNfcHJlaWRsZSk7Ci0JfQotCiAJb21hcDJfc3JhbV9pZGxlKCk7Ci0KLQlpZiAob21hcDJfcG1fZGVidWcpIHsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHRtcDsKLQotCQlnZXRuc3RpbWVvZmRheSgmdHNfcG9zdGlkbGUpOwotCQl0c19pZGxlID0gdGltZXNwZWNfc3ViKHRzX3Bvc3RpZGxlLCB0c19wcmVpZGxlKTsKLQkJdG1wID0gdGltZXNwZWNfdG9fbnMoJnRzX2lkbGUpICogTlNFQ19QRVJfVVNFQzsKLQl9CiB9CiAKIHN0YXRpYyBpbnQgb21hcDJfY2FuX3NsZWVwKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTM0eHguYwppbmRleCA3MjU1ZDliLi5lZmE2NjQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmMKQEAgLTU1LDcgKzU1LDcgQEAKIHN0YXRpYyBzdXNwZW5kX3N0YXRlX3Qgc3VzcGVuZF9zdGF0ZSA9IFBNX1NVU1BFTkRfT047CiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfc3VzcGVuZGluZyh2b2lkKQogewotCXJldHVybiAoc3VzcGVuZF9zdGF0ZSAhPSBQTV9TVVNQRU5EX09OKTsKKwlyZXR1cm4gKHN1c3BlbmRfc3RhdGUgIT0gUE1fU1VTUEVORF9PTikgJiYgY29uc29sZV9zdXNwZW5kX2VuYWJsZWQ7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSBib29sIGlzX3N1c3BlbmRpbmcodm9pZCkKQEAgLTk5LDMxICs5OSwyNyBAQAogewogCWludCB0aW1lb3V0ID0gMDsKIAotCWlmIChvbWFwX3JldigpID49IE9NQVAzNDMwX1JFVl9FUzNfMSkgewotCQlvbWFwMl9wcm1fc2V0X21vZF9yZWdfYml0cyhPTUFQMzQzMF9FTl9JT19DSEFJTl9NQVNLLCBXS1VQX01PRCwKLQkJCQkgICAgIFBNX1dLRU4pOwotCQkvKiBEbyBhIHJlYWRiYWNrIHRvIGFzc3VyZSB3cml0ZSBoYXMgYmVlbiBkb25lICovCi0JCW9tYXAyX3BybV9yZWFkX21vZF9yZWcoV0tVUF9NT0QsIFBNX1dLRU4pOworCW9tYXAyX3BybV9zZXRfbW9kX3JlZ19iaXRzKE9NQVAzNDMwX0VOX0lPX0NIQUlOX01BU0ssIFdLVVBfTU9ELAorCQkJCSAgIFBNX1dLRU4pOworCS8qIERvIGEgcmVhZGJhY2sgdG8gYXNzdXJlIHdyaXRlIGhhcyBiZWVuIGRvbmUgKi8KKwlvbWFwMl9wcm1fcmVhZF9tb2RfcmVnKFdLVVBfTU9ELCBQTV9XS0VOKTsKIAotCQl3aGlsZSAoIShvbWFwMl9wcm1fcmVhZF9tb2RfcmVnKFdLVVBfTU9ELCBQTV9XS0VOKSAmCi0JCQkgT01BUDM0MzBfU1RfSU9fQ0hBSU5fTUFTSykpIHsKLQkJCXRpbWVvdXQrKzsKLQkJCWlmICh0aW1lb3V0ID4gMTAwMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiV2FrZSB1cCBkYWlzeSBjaGFpbiAiCi0JCQkJICAgICAgICJhY3RpdmF0aW9uIGZhaWxlZC5cbiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCW9tYXAyX3BybV9zZXRfbW9kX3JlZ19iaXRzKE9NQVAzNDMwX1NUX0lPX0NIQUlOX01BU0ssCi0JCQkJCSAgICAgV0tVUF9NT0QsIFBNX1dLRU4pOworCXdoaWxlICghKG9tYXAyX3BybV9yZWFkX21vZF9yZWcoV0tVUF9NT0QsIFBNX1dLRU4pICYKKwkJIE9NQVAzNDMwX1NUX0lPX0NIQUlOX01BU0spKSB7CisJCXRpbWVvdXQrKzsKKwkJaWYgKHRpbWVvdXQgPiAxMDAwKSB7CisJCQlwcl9lcnIoIldha2UgdXAgZGFpc3kgY2hhaW4gYWN0aXZhdGlvbiBmYWlsZWQuXG4iKTsKKwkJCXJldHVybjsKIAkJfQorCQlvbWFwMl9wcm1fc2V0X21vZF9yZWdfYml0cyhPTUFQMzQzMF9TVF9JT19DSEFJTl9NQVNLLAorCQkJCQkgICBXS1VQX01PRCwgUE1fV0tFTik7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBvbWFwM19kaXNhYmxlX2lvX2NoYWluKHZvaWQpCiB7Ci0JaWYgKG9tYXBfcmV2KCkgPj0gT01BUDM0MzBfUkVWX0VTM18xKQotCQlvbWFwMl9wcm1fY2xlYXJfbW9kX3JlZ19iaXRzKE9NQVAzNDMwX0VOX0lPX0NIQUlOX01BU0ssIFdLVVBfTU9ELAotCQkJCSAgICAgICBQTV9XS0VOKTsKKwlvbWFwMl9wcm1fY2xlYXJfbW9kX3JlZ19iaXRzKE9NQVAzNDMwX0VOX0lPX0NIQUlOX01BU0ssIFdLVVBfTU9ELAorCQkJCSAgICAgUE1fV0tFTik7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXAzX2NvcmVfc2F2ZV9jb250ZXh0KHZvaWQpCkBAIC0zNjMsNyArMzU5LDYgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIG1wdSBzdGF0ZSBpbiBzcmFtX2lkbGVcbiIpOwogCQlyZXR1cm47CiAJfQotCXB3cmRtX3ByZV90cmFuc2l0aW9uKCk7CiAKIAkvKiBORU9OIGNvbnRyb2wgKi8KIAlpZiAocHdyZG1fcmVhZF9wd3JzdChuZW9uX3B3cmRtKSA9PSBQV1JETV9QT1dFUl9PTikKQEAgLTM3Niw3ICszNzEsOCBAQAogCSAgICAocGVyX25leHRfc3RhdGUgPCBQV1JETV9QT1dFUl9PTiB8fAogCSAgICAgY29yZV9uZXh0X3N0YXRlIDwgUFdSRE1fUE9XRVJfT04pKSB7CiAJCW9tYXAyX3BybV9zZXRfbW9kX3JlZ19iaXRzKE9NQVAzNDMwX0VOX0lPX01BU0ssIFdLVVBfTU9ELCBQTV9XS0VOKTsKLQkJb21hcDNfZW5hYmxlX2lvX2NoYWluKCk7CisJCWlmIChvbWFwM19oYXNfaW9fY2hhaW5fY3RybCgpKQorCQkJb21hcDNfZW5hYmxlX2lvX2NoYWluKCk7CiAJfQogCiAJLyogQmxvY2sgY29uc29sZSBvdXRwdXQgaW4gY2FzZSBpdCBpcyBvbiBvbmUgb2YgdGhlIE9NQVAgVUFSVHMgKi8KQEAgLTM4Niw2ICszODIsOCBAQAogCQkJaWYgKCFjb25zb2xlX3RyeWxvY2soKSkKIAkJCQlnb3RvIGNvbnNvbGVfc3RpbGxfYWN0aXZlOwogCisJcHdyZG1fcHJlX3RyYW5zaXRpb24oKTsKKwogCS8qIFBFUiAqLwogCWlmIChwZXJfbmV4dF9zdGF0ZSA8IFBXUkRNX1BPV0VSX09OKSB7CiAJCXBlcl9nb2luZ19vZmYgPSAocGVyX25leHRfc3RhdGUgPT0gUFdSRE1fUE9XRVJfT0ZGKSA/IDEgOiAwOwpAQCAtNDA5LDEzICs0MDcsMTQgQEAKIAlvbWFwM19pbnRjX3ByZXBhcmVfaWRsZSgpOwogCiAJLyoKLQkqIE9uIEVNVS9IUyBkZXZpY2VzIFJPTSBjb2RlIHJlc3RvcmVzIGEgU1JEQyB2YWx1ZQotCSogZnJvbSBzY3JhdGNocGFkIHdoaWNoIGhhcyBhdXRvbWF0aWMgc2VsZiByZWZyZXNoIG9uIHRpbWVvdXQKLQkqIG9mIEFVVE9fQ05UID0gMSBlbmFibGVkLiBUaGlzIHRha2VzIGNhcmUgb2YgZXJyYXR1bSBJRCBpNDQzLgotCSogSGVuY2Ugc3RvcmUvcmVzdG9yZSB0aGUgU0RSQ19QT1dFUiByZWdpc3RlciBoZXJlLgotCSovCi0JaWYgKG9tYXBfcmV2KCkgPj0gT01BUDM0MzBfUkVWX0VTM18wICYmCi0JICAgIG9tYXBfdHlwZSgpICE9IE9NQVAyX0RFVklDRV9UWVBFX0dQICYmCisJICogT24gRU1VL0hTIGRldmljZXMgUk9NIGNvZGUgcmVzdG9yZXMgYSBTUkRDIHZhbHVlCisJICogZnJvbSBzY3JhdGNocGFkIHdoaWNoIGhhcyBhdXRvbWF0aWMgc2VsZiByZWZyZXNoIG9uIHRpbWVvdXQKKwkgKiBvZiBBVVRPX0NOVCA9IDEgZW5hYmxlZC4gVGhpcyB0YWtlcyBjYXJlIG9mIGVycmF0dW0gSUQgaTQ0My4KKwkgKiBIZW5jZSBzdG9yZS9yZXN0b3JlIHRoZSBTRFJDX1BPV0VSIHJlZ2lzdGVyIGhlcmUuCisJICovCisJaWYgKGNwdV9pc19vbWFwMzQzMCgpICYmIG9tYXBfcmV2KCkgPj0gT01BUDM0MzBfUkVWX0VTM18wICYmCisJICAgIChvbWFwX3R5cGUoKSA9PSBPTUFQMl9ERVZJQ0VfVFlQRV9FTVUgfHwKKwkgICAgIG9tYXBfdHlwZSgpID09IE9NQVAyX0RFVklDRV9UWVBFX1NFQykgJiYKIAkgICAgY29yZV9uZXh0X3N0YXRlID09IFBXUkRNX1BPV0VSX09GRikKIAkJc2RyY19wd3IgPSBzZHJjX3JlYWRfcmVnKFNEUkNfUE9XRVIpOwogCkBAIC00MzIsOCArNDMxLDkgQEAKIAkJb21hcDM0eHhfZG9fc3JhbV9pZGxlKHNhdmVfc3RhdGUpOwogCiAJLyogUmVzdG9yZSBub3JtYWwgU0RSQyBQT1dFUiBzZXR0aW5ncyAqLwotCWlmIChvbWFwX3JldigpID49IE9NQVAzNDMwX1JFVl9FUzNfMCAmJgotCSAgICBvbWFwX3R5cGUoKSAhPSBPTUFQMl9ERVZJQ0VfVFlQRV9HUCAmJgorCWlmIChjcHVfaXNfb21hcDM0MzAoKSAmJiBvbWFwX3JldigpID49IE9NQVAzNDMwX1JFVl9FUzNfMCAmJgorCSAgICAob21hcF90eXBlKCkgPT0gT01BUDJfREVWSUNFX1RZUEVfRU1VIHx8CisJICAgICBvbWFwX3R5cGUoKSA9PSBPTUFQMl9ERVZJQ0VfVFlQRV9TRUMpICYmCiAJICAgIGNvcmVfbmV4dF9zdGF0ZSA9PSBQV1JETV9QT1dFUl9PRkYpCiAJCXNkcmNfd3JpdGVfcmVnKHNkcmNfcHdyLCBTRFJDX1BPV0VSKTsKIApAQCAtNDU1LDYgKzQ1NSw4IEBACiAJfQogCW9tYXAzX2ludGNfcmVzdW1lX2lkbGUoKTsKIAorCXB3cmRtX3Bvc3RfdHJhbnNpdGlvbigpOworCiAJLyogUEVSICovCiAJaWYgKHBlcl9uZXh0X3N0YXRlIDwgUFdSRE1fUE9XRVJfT04pIHsKIAkJcGVyX3ByZXZfc3RhdGUgPSBwd3JkbV9yZWFkX3ByZXZfcHdyc3QocGVyX3B3cmRtKTsKQEAgLTQ3NSwxMSArNDc3LDEwIEBACiAJICAgICBjb3JlX25leHRfc3RhdGUgPCBQV1JETV9QT1dFUl9PTikpIHsKIAkJb21hcDJfcHJtX2NsZWFyX21vZF9yZWdfYml0cyhPTUFQMzQzMF9FTl9JT19NQVNLLCBXS1VQX01PRCwKIAkJCQkJICAgICBQTV9XS0VOKTsKLQkJb21hcDNfZGlzYWJsZV9pb19jaGFpbigpOworCQlpZiAob21hcDNfaGFzX2lvX2NoYWluX2N0cmwoKSkKKwkJCW9tYXAzX2Rpc2FibGVfaW9fY2hhaW4oKTsKIAl9CiAKLQlwd3JkbV9wb3N0X3RyYW5zaXRpb24oKTsKLQogCWNsa2RtX2FsbG93X2lkbGUobXB1X3B3cmRtLT5wd3JkbV9jbGtkbXNbMF0pOwogfQogCkBAIC04NzAsNiArODcxLDkgQEAKIAlpZiAoIWNwdV9pc19vbWFwMzR4eCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmICghb21hcDNfaGFzX2lvX2NoYWluX2N0cmwoKSkKKwkJcHJfd2FybmluZygiUE06IG5vIHNvZnR3YXJlIEkvTyBjaGFpbiBjb250cm9sOyBzb21lIHdha2V1cHMgbWF5IGJlIGxvc3RcbiIpOworCiAJcG1fZXJyYXRhX2NvbmZpZ3VyZSgpOwogCiAJLyogWFhYIHByY21fc2V0dXBfcmVncyBuZWVkcyB0byBiZSBiZWZvcmUgZW5hYmxpbmcgaHcKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4tY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLWNvbW1vbi5jCmluZGV4IDE3MWZjY2QuLmY5N2FmZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4tY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi1jb21tb24uYwpAQCAtMSw5ICsxLDggQEAKIC8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi1jb21tb24uYwotICogIENvbnRhaW5zIGNvbW1vbiBwb3dlcmRvbWFpbiBmcmFtZXdvcmsgZnVuY3Rpb25zCisgKiBDb21tb24gcG93ZXJkb21haW4gZnJhbWV3b3JrIGZ1bmN0aW9ucwogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiBEZXJpdmVkIGZyb20gbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi5jIHdyaXR0ZW4gYnkgUGF1bCBXYWxtc2xleQogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4uYwppbmRleCBlZjcxZmRkLi44YTE4ZDFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIE9NQVAgcG93ZXJkb21haW4gY29udHJvbAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCwgMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiBXcml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkKQEAgLTc3LDEzICs3NywxMSBAQAogc3RhdGljIGludCBfcHdyZG1fcmVnaXN0ZXIoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkKIHsKIAlpbnQgaTsKKwlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtOwogCiAJaWYgKCFwd3JkbSB8fCAhcHdyZG0tPm5hbWUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFvbWFwX2NoaXBfaXMocHdyZG0tPm9tYXBfY2hpcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKGNwdV9pc19vbWFwNDR4eCgpICYmCiAJICAgIHB3cmRtLT5wcmNtX3BhcnRpdGlvbiA9PSBPTUFQNDQzMF9JTlZBTElEX1BSQ01fUEFSVElUSU9OKSB7CiAJCXByX2VycigicG93ZXJkb21haW46ICVzOiBtaXNzaW5nIE9NQVA0IFBSQ00gcGFydGl0aW9uIElEXG4iLApAQCAtOTQsNiArOTIsMTYgQEAKIAlpZiAoX3B3cmRtX2xvb2t1cChwd3JkbS0+bmFtZSkpCiAJCXJldHVybiAtRUVYSVNUOwogCisJdm9sdGRtID0gdm9sdGRtX2xvb2t1cChwd3JkbS0+dm9sdGRtLm5hbWUpOworCWlmICghdm9sdGRtKSB7CisJCXByX2VycigicG93ZXJkb21haW46ICVzOiB2b2x0YWdlZG9tYWluICVzIGRvZXMgbm90IGV4aXN0XG4iLAorCQkgICAgICAgcHdyZG0tPm5hbWUsIHB3cmRtLT52b2x0ZG0ubmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwd3JkbS0+dm9sdGRtLnB0ciA9IHZvbHRkbTsKKwlJTklUX0xJU1RfSEVBRCgmcHdyZG0tPnZvbHRkbV9ub2RlKTsKKwl2b2x0ZG1fYWRkX3B3cmRtKHZvbHRkbSwgcHdyZG0pOworCiAJbGlzdF9hZGQoJnB3cmRtLT5ub2RlLCAmcHdyZG1fbGlzdCk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBwb3dlcmRvbWFpbidzIHN0YXRlIGNvdW50ZXIgKi8KQEAgLTE5NCwzNiArMjAyLDc2IEBACiAvKiBQdWJsaWMgZnVuY3Rpb25zICovCiAKIC8qKgotICogcHdyZG1faW5pdCAtIHNldCB1cCB0aGUgcG93ZXJkb21haW4gbGF5ZXIKLSAqIEBwd3JkbXM6IGFycmF5IG9mIHN0cnVjdCBwb3dlcmRvbWFpbiBwb2ludGVycyB0byByZWdpc3RlcgotICogQGN1c3RvbV9mdW5jczogZnVuYyBwb2ludGVycyBmb3IgYXJjaCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMKKyAqIHB3cmRtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzIC0gcmVnaXN0ZXIgcG93ZXJkb21haW4gaW1wbGVtZW50YXRpb24gZm5zCisgKiBAcG86IGZ1bmMgcG9pbnRlcnMgZm9yIGFyY2ggc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCiAgKgotICogTG9vcCB0aHJvdWdoIHRoZSBhcnJheSBvZiBwb3dlcmRvbWFpbnMgQHB3cmRtcywgcmVnaXN0ZXJpbmcgYWxsCi0gKiB0aGF0IGFyZSBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgQ1BVLiAgQWxzbywgcHJvZ3JhbSBhbGwKLSAqIHBvd2VyZG9tYWluIHRhcmdldCBzdGF0ZSBhcyBPTjsgdGhpcyBpcyB0byBwcmV2ZW50IGRvbWFpbnMgZnJvbQotICogaGl0dGluZyBsb3cgcG93ZXIgc3RhdGVzIChpZiBib290bG9hZGVyIGhhcyB0YXJnZXQgc3RhdGVzIHNldCB0bwotICogc29tZXRoaW5nIG90aGVyIHRoYW4gT04pIGFuZCBwb3RlbnRpYWxseSBldmVuIGxvc2luZyBjb250ZXh0IHdoaWxlCi0gKiBQTSBpcyBub3QgZnVsbHkgaW5pdGlhbGl6ZWQuICBUaGUgUE0gbGF0ZSBpbml0IGNvZGUgY2FuIHRoZW4gcHJvZ3JhbQotICogdGhlIGRlc2lyZWQgdGFyZ2V0IHN0YXRlIGZvciBhbGwgdGhlIHBvd2VyIGRvbWFpbnMuICBObyByZXR1cm4KLSAqIHZhbHVlLgorICogUmVnaXN0ZXIgdGhlIGxpc3Qgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdXNlZCB0byBpbXBsZW1lbnQgdGhlCisgKiBwb3dlcmRvbWFpbiBmdW5jdGlvbnMgb24gZGlmZmVyZW50IE9NQVAgU29Dcy4gIFNob3VsZCBiZSBjYWxsZWQKKyAqIGJlZm9yZSBhbnkgb3RoZXIgcHdyZG1fcmVnaXN0ZXIqKCkgZnVuY3Rpb24uICBSZXR1cm5zIC1FSU5WQUwgaWYKKyAqIEBwbyBpcyBudWxsLCAtRUVYSVNUIGlmIHBsYXRmb3JtIGZ1bmN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbgorICogcmVnaXN0ZXJlZCwgb3IgMCB1cG9uIHN1Y2Nlc3MuCiAgKi8KLXZvaWQgcHdyZG1faW5pdChzdHJ1Y3QgcG93ZXJkb21haW4gKipwd3JkbXMsIHN0cnVjdCBwd3JkbV9vcHMgKmN1c3RvbV9mdW5jcykKK2ludCBwd3JkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcyhzdHJ1Y3QgcHdyZG1fb3BzICpwbykKK3sKKwlpZiAoIXBvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhcmNoX3B3cmRtKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWFyY2hfcHdyZG0gPSBwbzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHB3cmRtX3JlZ2lzdGVyX3B3cmRtcyAtIHJlZ2lzdGVyIFNvQyBwb3dlcmRvbWFpbnMKKyAqIEBwczogcG9pbnRlciB0byBhbiBhcnJheSBvZiBzdHJ1Y3QgcG93ZXJkb21haW4gdG8gcmVnaXN0ZXIKKyAqCisgKiBSZWdpc3RlciB0aGUgcG93ZXJkb21haW5zIGF2YWlsYWJsZSBvbiBhIHBhcnRpY3VsYXIgT01BUCBTb0MuICBNdXN0CisgKiBiZSBjYWxsZWQgYWZ0ZXIgcHdyZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3MoKS4gIE1heSBiZSBjYWxsZWQKKyAqIG11bHRpcGxlIHRpbWVzLiAgUmV0dXJucyAtRUFDQ0VTIGlmIGNhbGxlZCBiZWZvcmUKKyAqIHB3cmRtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKCk7IC1FSU5WQUwgaWYgdGhlIGFyZ3VtZW50IEBwcyBpcworICogbnVsbDsgb3IgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9yZWdpc3Rlcl9wd3JkbXMoc3RydWN0IHBvd2VyZG9tYWluICoqcHMpCiB7CiAJc3RydWN0IHBvd2VyZG9tYWluICoqcCA9IE5VTEw7CisKKwlpZiAoIWFyY2hfcHdyZG0pCisJCXJldHVybiAtRUVYSVNUOworCisJaWYgKCFwcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKHAgPSBwczsgKnA7IHArKykKKwkJX3B3cmRtX3JlZ2lzdGVyKCpwKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHB3cmRtX2NvbXBsZXRlX2luaXQgLSBzZXQgdXAgdGhlIHBvd2VyZG9tYWluIGxheWVyCisgKgorICogRG8gd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IHRvIGluaXRpYWxpemUgcmVnaXN0ZXJlZCBwb3dlcmRvbWFpbnMgYW5kCisgKiBwb3dlcmRvbWFpbiBjb2RlLiAgQ3VycmVudGx5LCB0aGlzIHByb2dyYW1zIHRoZSBuZXh0IHBvd2VyIHN0YXRlCisgKiBmb3IgZWFjaCBwb3dlcmRvbWFpbiB0byBPTi4gIFRoaXMgcHJldmVudHMgcG93ZXJkb21haW5zIGZyb20KKyAqIHVuZXhwZWN0ZWRseSBsb3NpbmcgY29udGV4dCBvciBlbnRlcmluZyBoaWdoIHdha2V1cCBsYXRlbmN5IG1vZGVzCisgKiB3aXRoIG5vbi1wb3dlci1tYW5hZ2VtZW50LWVuYWJsZWQga2VybmVscy4gIE11c3QgYmUgY2FsbGVkIGFmdGVyCisgKiBwd3JkbV9yZWdpc3Rlcl9wd3JkbXMoKS4gIFJldHVybnMgLUVBQ0NFUyBpZiBjYWxsZWQgYmVmb3JlCisgKiBwd3JkbV9yZWdpc3Rlcl9wd3JkbXMoKSwgb3IgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9jb21wbGV0ZV9pbml0KHZvaWQpCit7CiAJc3RydWN0IHBvd2VyZG9tYWluICp0ZW1wX3A7CiAKLQlpZiAoIWN1c3RvbV9mdW5jcykKLQkJV0FSTigxLCAicG93ZXJkb21haW46IE5vIGN1c3RvbSBwd3JkbSBmdW5jdGlvbnMgcmVnaXN0ZXJlZFxuIik7Ci0JZWxzZQotCQlhcmNoX3B3cmRtID0gY3VzdG9tX2Z1bmNzOwotCi0JaWYgKHB3cmRtcykgewotCQlmb3IgKHAgPSBwd3JkbXM7ICpwOyBwKyspCi0JCQlfcHdyZG1fcmVnaXN0ZXIoKnApOwotCX0KKwlpZiAobGlzdF9lbXB0eSgmcHdyZG1fbGlzdCkpCisJCXJldHVybiAtRUFDQ0VTOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wX3AsICZwd3JkbV9saXN0LCBub2RlKQogCQlwd3JkbV9zZXRfbmV4dF9wd3JzdCh0ZW1wX3AsIFBXUkRNX1BPV0VSX09OKTsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTM5MCw2ICs0MzgsMTggQEAKIH0KIAogLyoqCisgKiBwd3JkbV9nZXRfdm9sdGRtIC0gcmV0dXJuIGEgcHRyIHRvIHRoZSB2b2x0ZG0gdGhhdCB0aGlzIHB3cmRtIHJlc2lkZXMgaW4KKyAqIEBwd3JkbTogc3RydWN0IHBvd2VyZG9tYWluICoKKyAqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3Qgdm9sdGFnZW9tYWluIHRoYXQgdGhlIHNwZWNpZmllZCBwb3dlcmRvbWFpbgorICogQHB3cmRtIGV4aXN0cyBpbi4KKyAqLworc3RydWN0IHZvbHRhZ2Vkb21haW4gKnB3cmRtX2dldF92b2x0ZG0oc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkKK3sKKwlyZXR1cm4gcHdyZG0tPnZvbHRkbS5wdHI7Cit9CisKKy8qKgogICogcHdyZG1fZ2V0X21lbV9iYW5rX2NvdW50IC0gZ2V0IG51bWJlciBvZiBtZW1vcnkgYmFua3MgaW4gdGhpcyBwb3dlcmRvbWFpbgogICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKgogICoKQEAgLTk0MiwxNiArMTAwMiwxNiBAQAogICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKiB0byB3YWl0IGZvcgogICoKICAqIENvbnRleHQgbG9zcyBjb3VudCBpcyB0aGUgc3VtIG9mIHBvd2VyZG9tYWluIG9mZi1tb2RlIGNvdW50ZXIsIHRoZQotICogbG9naWMgb2ZmIGNvdW50ZXIgYW5kIHRoZSBwZXItYmFuayBtZW1vcnkgb2ZmIGNvdW50ZXIuICBSZXR1cm5zIDAKKyAqIGxvZ2ljIG9mZiBjb3VudGVyIGFuZCB0aGUgcGVyLWJhbmsgbWVtb3J5IG9mZiBjb3VudGVyLiAgUmV0dXJucyBuZWdhdGl2ZQogICogKGFuZCBXQVJOcykgdXBvbiBlcnJvciwgb3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBjb250ZXh0IGxvc3MgY291bnQuCiAgKi8KLXUzMiBwd3JkbV9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pCitpbnQgcHdyZG1fZ2V0X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKQogewogCWludCBpLCBjb3VudDsKIAogCWlmICghcHdyZG0pIHsKIAkJV0FSTigxLCAicG93ZXJkb21haW46ICVzOiBwd3JkbSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAljb3VudCA9IHB3cmRtLT5zdGF0ZV9jb3VudGVyW1BXUkRNX1BPV0VSX09GRl07CkBAIC05NjAsNyArMTAyMCwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBwd3JkbS0+YmFua3M7IGkrKykKIAkJY291bnQgKz0gcHdyZG0tPnJldF9tZW1fb2ZmX2NvdW50ZXJbaV07CiAKLQlwcl9kZWJ1ZygicG93ZXJkb21haW46ICVzOiBjb250ZXh0IGxvc3MgY291bnQgPSAldVxuIiwKKwkvKgorCSAqIENvbnRleHQgbG9zcyBjb3VudCBoYXMgdG8gYmUgYSBub24tbmVnYXRpdmUgdmFsdWUuIENsZWFyIHRoZSBzaWduCisJICogYml0IHRvIGdldCBhIHZhbHVlIHJhbmdlIGZyb20gMCB0byBJTlRfTUFYLgorCSAqLworCWNvdW50ICY9IElOVF9NQVg7CisKKwlwcl9kZWJ1ZygicG93ZXJkb21haW46ICVzOiBjb250ZXh0IGxvc3MgY291bnQgPSAlZFxuIiwKIAkJIHB3cmRtLT5uYW1lLCBjb3VudCk7CiAKIAlyZXR1cm4gY291bnQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmgKaW5kZXggZDIzZDk3OS4uMGQ3MmE4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4uaApAQCAtMjQsNiArMjQsOCBAQAogCiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAorI2luY2x1ZGUgInZvbHRhZ2UuaCIKKwogLyogUG93ZXJkb21haW4gYmFzaWMgcG93ZXIgc3RhdGVzICovCiAjZGVmaW5lIFBXUkRNX1BPV0VSX09GRgkJMHgwCiAjZGVmaW5lIFBXUkRNX1BPV0VSX1JFVAkJMHgxCkBAIC03OCw3ICs4MCw3IEBACiAvKioKICAqIHN0cnVjdCBwb3dlcmRvbWFpbiAtIE9NQVAgcG93ZXJkb21haW4KICAqIEBuYW1lOiBQb3dlcmRvbWFpbiBuYW1lCi0gKiBAb21hcF9jaGlwOiByZXByZXNlbnRzIHRoZSBPTUFQIGNoaXAgdHlwZXMgY29udGFpbmluZyB0aGlzIHB3cmRtCisgKiBAdm9sdGRtOiB2b2x0YWdlZG9tYWluIGNvbnRhaW5pbmcgdGhpcyBwb3dlcmRvbWFpbgogICogQHByY21fb2ZmczogdGhlIGFkZHJlc3Mgb2Zmc2V0IGZyb20gQ01fQkFTRS9QUk1fQkFTRQogICogQHByY21fcGFydGl0aW9uOiAoT01BUDQgb25seSkgdGhlIFBSQ00gcGFydGl0aW9uIElEIGNvbnRhaW5pbmcgQHByY21fb2ZmcwogICogQHB3cnN0czogUG9zc2libGUgcG93ZXJkb21haW4gcG93ZXIgc3RhdGVzCkBAIC04OSw2ICs5MSw3IEBACiAgKiBAcHdyc3RzX21lbV9vbjogUG9zc2libGUgbWVtb3J5IGJhbmsgcHdyc3RhdGVzIHdoZW4gcHdyZG0gaW4gT04KICAqIEBwd3JkbV9jbGtkbXM6IENsb2NrZG9tYWlucyBpbiB0aGlzIHBvd2VyZG9tYWluCiAgKiBAbm9kZTogbGlzdF9oZWFkIGxpbmtpbmcgYWxsIHBvd2VyZG9tYWlucworICogQHZvbHRkbV9ub2RlOiBsaXN0X2hlYWQgbGlua2luZyBhbGwgcG93ZXJkb21haW5zIGluIGEgdm9sdGFnZWRvbWFpbgogICogQHN0YXRlOgogICogQHN0YXRlX2NvdW50ZXI6CiAgKiBAdGltZXI6CkBAIC05OCw3ICsxMDEsMTAgQEAKICAqLwogc3RydWN0IHBvd2VyZG9tYWluIHsKIAljb25zdCBjaGFyICpuYW1lOwotCWNvbnN0IHN0cnVjdCBvbWFwX2NoaXBfaWQgb21hcF9jaGlwOworCXVuaW9uIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJc3RydWN0IHZvbHRhZ2Vkb21haW4gKnB0cjsKKwl9IHZvbHRkbTsKIAljb25zdCBzMTYgcHJjbV9vZmZzOwogCWNvbnN0IHU4IHB3cnN0czsKIAljb25zdCB1OCBwd3JzdHNfbG9naWNfcmV0OwpAQCAtMTA5LDYgKzExNSw3IEBACiAJY29uc3QgdTggcHJjbV9wYXJ0aXRpb247CiAJc3RydWN0IGNsb2NrZG9tYWluICpwd3JkbV9jbGtkbXNbUFdSRE1fTUFYX0NMS0RNU107CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgdm9sdGRtX25vZGU7CiAJaW50IHN0YXRlOwogCXVuc2lnbmVkIHN0YXRlX2NvdW50ZXJbUFdSRE1fTUFYX1BXUlNUU107CiAJdW5zaWduZWQgcmV0X2xvZ2ljX29mZl9jb3VudGVyOwpAQCAtMTYyLDcgKzE2OSw5IEBACiAJaW50CSgqcHdyZG1fd2FpdF90cmFuc2l0aW9uKShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKTsKIH07CiAKLXZvaWQgcHdyZG1faW5pdChzdHJ1Y3QgcG93ZXJkb21haW4gKipwd3JkbV9saXN0LCBzdHJ1Y3QgcHdyZG1fb3BzICpjdXN0b21fZnVuY3MpOworaW50IHB3cmRtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKHN0cnVjdCBwd3JkbV9vcHMgKmN1c3RvbV9mdW5jcyk7CitpbnQgcHdyZG1fcmVnaXN0ZXJfcHdyZG1zKHN0cnVjdCBwb3dlcmRvbWFpbiAqKnB3cmRtX2xpc3QpOworaW50IHB3cmRtX2NvbXBsZXRlX2luaXQodm9pZCk7CiAKIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOwogCkBAIC0xNzYsNiArMTg1LDcgQEAKIGludCBwd3JkbV9mb3JfZWFjaF9jbGtkbShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLAogCQkJIGludCAoKmZuKShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLAogCQkJCSAgIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pKTsKK3N0cnVjdCB2b2x0YWdlZG9tYWluICpwd3JkbV9nZXRfdm9sdGRtKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOwogCiBpbnQgcHdyZG1fZ2V0X21lbV9iYW5rX2NvdW50KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOwogCkBAIC0yMDcsMTAgKzIxNywxMSBAQAogaW50IHB3cmRtX3ByZV90cmFuc2l0aW9uKHZvaWQpOwogaW50IHB3cmRtX3Bvc3RfdHJhbnNpdGlvbih2b2lkKTsKIGludCBwd3JkbV9zZXRfbG93cHdyc3RjaGFuZ2Uoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSk7Ci11MzIgcHdyZG1fZ2V0X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKTsKK2ludCBwd3JkbV9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOwogYm9vbCBwd3JkbV9jYW5fZXZlcl9sb3NlX2NvbnRleHQoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSk7CiAKLWV4dGVybiB2b2lkIG9tYXAyeHh4X3Bvd2VyZG9tYWluc19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcDI0MnhfcG93ZXJkb21haW5zX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwMjQzeF9wb3dlcmRvbWFpbnNfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIG9tYXAzeHh4X3Bvd2VyZG9tYWluc19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcDQ0eHhfcG93ZXJkb21haW5zX2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4yeHh4XzN4eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4yeHh4XzN4eHguYwppbmRleCBjZjYwMGUyLi42YTE3ZTRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluMnh4eF8zeHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbjJ4eHhfM3h4eC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIE9NQVAyIGFuZCBPTUFQMyBwb3dlcmRvbWFpbiBjb250cm9sCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgogICoKICAqIERlcml2ZWQgZnJvbSBtYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmMgd3JpdHRlbiBieSBQYXVsIFdhbG1zbGV5CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczJ4eHhfM3h4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczJ4eHhfM3h4eF9kYXRhLmMKaW5kZXggNDIxMGMzMy4uZDNhNTM5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMyeHh4XzN4eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zMnh4eF8zeHh4X2RhdGEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBPTUFQMi8zIGNvbW1vbiBwb3dlcmRvbWFpbiBkZWZpbml0aW9ucwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCwgMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiBQYXVsIFdhbG1zbGV5LCBKb3VuaSBIw7ZnYW5kZXIKQEAgLTEyLDIwICsxMiw2IEBACiAgKi8KIAogLyoKLSAqIFRvIERvIExpc3QKLSAqIC0+IE1vdmUgdGhlIFNsZWVwL1dha2V1cCBkZXBlbmRlbmNpZXMgZnJvbSBQb3dlciBEb21haW4gZnJhbWV3b3JrIHRvCi0gKiAgICBDbG9jayBEb21haW4gRnJhbWV3b3JrCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgb2YgdGhlIHBvd2VyZG9tYWlucyB0aGF0IGhhdmUgc29tZSBlbGVtZW50Ci0gKiBvZiBzb2Z0d2FyZSBjb250cm9sIGZvciB0aGUgT01BUDI0eHggYW5kIE9NQVAzNHh4IGNoaXBzLgotICoKLSAqIFRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdGluZyBvZiBwb3dlcmRvbWFpbnMgb24gdGhlIGNoaXBzOyBvbmx5Ci0gKiBwb3dlcmRvbWFpbnMgdGhhdCBjYW4gYmUgY29udHJvbGxlZCBpbiBzb2Z0d2FyZS4KLSAqLwotCi0vKgogICogVGhlIG5hbWVzIGZvciB0aGUgRFNQL0lWQTIgcG93ZXJkb21haW5zIGFyZSBjb25mdXNpbmcuCiAgKgogICogTW9zdCBPTUFQIGNoaXBzIGhhdmUgYW4gb24tYm9hcmQgRFNQLgpAQCAtNTksOCArNDUsNiBAQAogc3RydWN0IHBvd2VyZG9tYWluIGdmeF9vbWFwMl9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJnZnhfcHdyZG0iLAogCS5wcmNtX29mZnMJICA9IEdGWF9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCB8Ci0JCQkJCSAgIENISVBfSVNfT01BUDM0MzBFUzEpLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19SRVQsCiAJLmJhbmtzCQkgID0gMSwKQEAgLTcwLDExICs1NCwxMiBAQAogCS5wd3JzdHNfbWVtX29uCSAgPSB7CiAJCVswXSA9IFBXUlNUU19PTiwgIC8qIE1FTU9OU1RBVEUgKi8KIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RydWN0IHBvd2VyZG9tYWluIHdrdXBfb21hcDJfcHdyZG0gPSB7CiAJLm5hbWUJCT0gIndrdXBfcHdyZG0iLAogCS5wcmNtX29mZnMJPSBXS1VQX01PRCwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCB8IENISVBfSVNfT01BUDM0MzApLAogCS5wd3JzdHMJCT0gUFdSU1RTX09OLAorCS52b2x0ZG0gICAgICAgICA9IHsgLm5hbWUgPSAid2FrZXVwIiB9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zMnh4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczJ4eHhfZGF0YS5jCmluZGV4IGNjMzg5ZmIuLjIzODVjMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zMnh4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMyeHh4X2RhdGEuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBPTUFQMlhYWCBwb3dlcmRvbWFpbiBkZWZpbml0aW9ucwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCwgMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiBQYXVsIFdhbG1zbGV5LCBKb3VuaSBIw7ZnYW5kZXIKQEAgLTI4LDcgKzI4LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gZHNwX3B3cmRtID0gewogCS5uYW1lCQkgID0gImRzcF9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gT01BUDI0WFhfRFNQX01PRCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfUkVULAogCS5iYW5rcwkJICA9IDEsCkBAIC0zOCwxMiArMzcsMTIgQEAKIAkucHdyc3RzX21lbV9vbgkgID0gewogCQlbMF0gPSBQV1JTVFNfT04sCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gbXB1XzI0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAibXB1X3B3cmRtIiwKIAkucHJjbV9vZmZzCSAgPSBNUFVfTU9ELAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5iYW5rcwkJICA9IDEsCkBAIC01MywxMiArNTIsMTIgQEAKIAkucHdyc3RzX21lbV9vbgkgID0gewogCQlbMF0gPSBQV1JTVFNfT04sCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gY29yZV8yNHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImNvcmVfcHdyZG0iLAogCS5wcmNtX29mZnMJICA9IENPUkVfTU9ELAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkuYmFua3MJCSAgPSAzLAogCS5wd3JzdHNfbWVtX3JldAkgID0gewpAQCAtNzEsNiArNzAsNyBAQAogCQlbMV0gPSBQV1JTVFNfT0ZGX1JFVF9PTiwgLyogTUVNMk9OU1RBVEUgKi8KIAkJWzJdID0gUFdSU1RTX09GRl9SRVRfT04sIC8qIE1FTTNPTlNUQVRFICovCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIApAQCAtNzgsMTQgKzc4LDExIEBACiAgKiAyNDMwLXNwZWNpZmljIHBvd2VyZG9tYWlucwogICovCiAKLSNpZmRlZiBDT05GSUdfU09DX09NQVAyNDMwCi0KIC8qIFhYWCAyNDMwIEtJTExET01BSU5XS1VQIGJpdD8gIE5vIGN1cnJlbnQgdXNlcnMgYXBwYXJlbnRseSAqLwogCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIG1kbV9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJtZG1fcHdyZG0iLAogCS5wcmNtX29mZnMJICA9IE9NQVAyNDMwX01ETV9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX1JFVCwKIAkuYmFua3MJCSAgPSAxLApAQCAtOTUsMjkgKzkyLDQ0IEBACiAJLnB3cnN0c19tZW1fb24JICA9IHsKIAkJWzBdID0gUFdSU1RTX09OLCAgLyogTUVNT05TVEFURSAqLwogCX0sCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiB9OwogCi0jZW5kaWYgICAgIC8qIENPTkZJR19TT0NfT01BUDI0MzAgKi8KKy8qCisgKgorICovCiAKLS8qIEFzIHBvd2VyZG9tYWlucyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBhYm92ZSwgdGhpcyBsaXN0IG11c3QgYWxzbyBiZSBjaGFuZ2VkICovCi1zdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluICpwb3dlcmRvbWFpbnNfb21hcDJ4eHhbXSBfX2luaXRkYXRhID0gewotCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluICpwb3dlcmRvbWFpbnNfb21hcDI0eHhbXSBfX2luaXRkYXRhID0gewogCSZ3a3VwX29tYXAyX3B3cmRtLAogCSZnZnhfb21hcDJfcHdyZG0sCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMgogCSZkc3BfcHdyZG0sCiAJJm1wdV8yNHh4X3B3cmRtLAogCSZjb3JlXzI0eHhfcHdyZG0sCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TT0NfT01BUDI0MzAKLQkmbWRtX3B3cmRtLAotI2VuZGlmCiAJTlVMTAogfTsKIAotdm9pZCBfX2luaXQgb21hcDJ4eHhfcG93ZXJkb21haW5zX2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKnBvd2VyZG9tYWluc19vbWFwMjQzMFtdIF9faW5pdGRhdGEgPSB7CisJJm1kbV9wd3JkbSwKKwlOVUxMCit9OworCit2b2lkIF9faW5pdCBvbWFwMjQyeF9wb3dlcmRvbWFpbnNfaW5pdCh2b2lkKQogewotCXB3cmRtX2luaXQocG93ZXJkb21haW5zX29tYXAyeHh4LCAmb21hcDJfcHdyZG1fb3BlcmF0aW9ucyk7CisJaWYgKCFjcHVfaXNfb21hcDI0MjAoKSkKKwkJcmV0dXJuOworCisJcHdyZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3MoJm9tYXAyX3B3cmRtX29wZXJhdGlvbnMpOworCXB3cmRtX3JlZ2lzdGVyX3B3cmRtcyhwb3dlcmRvbWFpbnNfb21hcDI0eHgpOworCXB3cmRtX2NvbXBsZXRlX2luaXQoKTsKK30KKwordm9pZCBfX2luaXQgb21hcDI0M3hfcG93ZXJkb21haW5zX2luaXQodm9pZCkKK3sKKwlpZiAoIWNwdV9pc19vbWFwMjQzMCgpKQorCQlyZXR1cm47CisKKwlwd3JkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcygmb21hcDJfcHdyZG1fb3BlcmF0aW9ucyk7CisJcHdyZG1fcmVnaXN0ZXJfcHdyZG1zKHBvd2VyZG9tYWluc19vbWFwMjR4eCk7CisJcHdyZG1fcmVnaXN0ZXJfcHdyZG1zKHBvd2VyZG9tYWluc19vbWFwMjQzMCk7CisJcHdyZG1fY29tcGxldGVfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMzeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zM3h4eF9kYXRhLmMKaW5kZXggNDY5YTkyMC4uOGVmMjZkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMzeHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczN4eHhfZGF0YS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIE9NQVAzIHBvd2VyZG9tYWluIGRlZmluaXRpb25zCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4LCAyMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgogICoKICAqIFBhdWwgV2FsbXNsZXksIEpvdW5pIEjDtmdhbmRlcgpAQCAtMTQsNiArMTQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisKICNpbmNsdWRlICJwb3dlcmRvbWFpbi5oIgogI2luY2x1ZGUgInBvd2VyZG9tYWluczJ4eHhfM3h4eF9kYXRhLmgiCiAKQEAgLTI3LDggKzI5LDYgQEAKICAqIDM0WFgtc3BlY2lmaWMgcG93ZXJkb21haW5zLCBkZXBlbmRlbmNpZXMKICAqLwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKLQogLyoKICAqIFBvd2VyZG9tYWlucwogICovCkBAIC0zNiw3ICszNiw2IEBACiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGl2YTJfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiaXZhMl9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gT01BUDM0MzBfSVZBMl9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLmJhbmtzCQkgID0gNCwKQEAgLTUyLDEyICs1MSwxMiBAQAogCQlbMl0gPSBQV1JTVFNfT0ZGX09OLAogCQlbM10gPSBQV1JTVFNfT04sCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAibXB1X2l2YSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gbXB1XzN4eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAibXB1X3B3cmRtIiwKIAkucHJjbV9vZmZzCSAgPSBNUFVfTU9ELAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5mbGFncwkJICA9IFBXUkRNX0hBU19NUFVfUVVJUkssCkBAIC02OCw2ICs2Nyw3IEBACiAJLnB3cnN0c19tZW1fb24JICA9IHsKIAkJWzBdID0gUFdSU1RTX09GRl9PTiwKIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJtcHVfaXZhIiB9LAogfTsKIAogLyoKQEAgLTgzLDEwICs4Myw2IEBACiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGNvcmVfM3h4eF9wcmVfZXMzXzFfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiY29yZV9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gQ09SRV9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTMSB8Ci0JCQkJCSAgIENISVBfSVNfT01BUDM0MzBFUzIgfAotCQkJCQkgICBDSElQX0lTX09NQVAzNDMwRVMzXzAgfAotCQkJCQkgICBDSElQX0lTX09NQVAzNjMwRVMxKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfT0ZGX1JFVCwKIAkuYmFua3MJCSAgPSAyLApAQCAtOTgsMTMgKzk0LDEyIEBACiAJCVswXSA9IFBXUlNUU19PRkZfUkVUX09OLCAvKiBNRU0xT05TVEFURSAqLwogCQlbMV0gPSBQV1JTVFNfT0ZGX1JFVF9PTiwgLyogTUVNMk9OU1RBVEUgKi8KIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBjb3JlXzN4eHhfZXMzXzFfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiY29yZV9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gQ09SRV9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTM18xIHwKLQkJCQkJICBDSElQX0dFX09NQVAzNjMwRVMxXzEpLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS8qCkBAIC0xMjEsMTEgKzExNiwxMSBAQAogCQlbMF0gPSBQV1JTVFNfT0ZGX1JFVF9PTiwgLyogTUVNMU9OU1RBVEUgKi8KIAkJWzFdID0gUFdSU1RTX09GRl9SRVRfT04sIC8qIE1FTTJPTlNUQVRFICovCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gZHNzX3B3cmRtID0gewogCS5uYW1lCQkgID0gImRzc19wd3JkbSIsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiAJLnByY21fb2ZmcwkgID0gT01BUDM0MzBfRFNTX01PRCwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfUkVULApAQCAtMTM2LDYgKzEzMSw3IEBACiAJLnB3cnN0c19tZW1fb24JICA9IHsKIAkJWzBdID0gUFdSU1RTX09OLCAgLyogTUVNT05TVEFURSAqLwogCX0sCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiB9OwogCiAvKgpAQCAtMTQ2LDcgKzE0Miw2IEBACiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIHNneF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJzZ3hfcHdyZG0iLAogCS5wcmNtX29mZnMJICA9IE9NQVAzNDMwRVMyX1NHWF9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9HRV9PTUFQMzQzMEVTMiksCiAJLyogWFhYIFRoaXMgaXMgYWNjdXJhdGUgZm9yIDM0MzAgU0dYLCBidXQgd2hhdCBhYm91dCBHRlg/ICovCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfUkVULApAQCAtMTU3LDExICsxNTIsMTEgQEAKIAkucHdyc3RzX21lbV9vbgkgID0gewogCQlbMF0gPSBQV1JTVFNfT04sICAvKiBNRU1PTlNUQVRFICovCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gY2FtX3B3cmRtID0gewogCS5uYW1lCQkgID0gImNhbV9wd3JkbSIsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiAJLnByY21fb2ZmcwkgID0gT01BUDM0MzBfQ0FNX01PRCwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfUkVULApAQCAtMTcyLDEyICsxNjcsMTIgQEAKIAkucHdyc3RzX21lbV9vbgkgID0gewogCQlbMF0gPSBQV1JTVFNfT04sICAvKiBNRU1PTlNUQVRFICovCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gcGVyX3B3cmRtID0gewogCS5uYW1lCQkgID0gInBlcl9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gT01BUDM0MzBfUEVSX01PRCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfT0ZGX1JFVCwKIAkuYmFua3MJCSAgPSAxLApAQCAtMTg3LDI2ICsxODIsMjYgQEAKIAkucHdyc3RzX21lbV9vbgkgID0gewogCQlbMF0gPSBQV1JTVFNfT04sICAvKiBNRU1PTlNUQVRFICovCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gZW11X3B3cmRtID0gewogCS5uYW1lCQk9ICJlbXVfcHdyZG0iLAogCS5wcmNtX29mZnMJPSBPTUFQMzQzMF9FTVVfTU9ELAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gbmVvbl9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJuZW9uX3B3cmRtIiwKIAkucHJjbV9vZmZzCSAgPSBPTUFQMzQzMF9ORU9OX01PRCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfUkVULAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJtcHVfaXZhIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiB1c2Job3N0X3B3cmRtID0gewogCS5uYW1lCQkgID0gInVzYmhvc3RfcHdyZG0iLAogCS5wcmNtX29mZnMJICA9IE9NQVAzNDMwRVMyX1VTQkhPU1RfTU9ELAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfR0VfT01BUDM0MzBFUzIpLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19SRVQsCiAJLyoKQEAgLTIyMyw2NSArMjE4LDEwMyBAQAogCS5wd3JzdHNfbWVtX29uCSAgPSB7CiAJCVswXSA9IFBXUlNUU19PTiwgIC8qIE1FTU9OU1RBVEUgKi8KIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBkcGxsMV9wd3JkbSA9IHsKIAkubmFtZQkJPSAiZHBsbDFfcHdyZG0iLAogCS5wcmNtX29mZnMJPSBNUFVfTU9ELAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAibXB1X2l2YSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gZHBsbDJfcHdyZG0gPSB7CiAJLm5hbWUJCT0gImRwbGwyX3B3cmRtIiwKIAkucHJjbV9vZmZzCT0gT01BUDM0MzBfSVZBMl9NT0QsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJtcHVfaXZhIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBkcGxsM19wd3JkbSA9IHsKIAkubmFtZQkJPSAiZHBsbDNfcHdyZG0iLAogCS5wcmNtX29mZnMJPSBQTExfTU9ELAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gZHBsbDRfcHdyZG0gPSB7CiAJLm5hbWUJCT0gImRwbGw0X3B3cmRtIiwKIAkucHJjbV9vZmZzCT0gUExMX01PRCwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGRwbGw1X3B3cmRtID0gewogCS5uYW1lCQk9ICJkcGxsNV9wd3JkbSIsCiAJLnByY21fb2Zmcwk9IFBMTF9NT0QsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfR0VfT01BUDM0MzBFUzIpLAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogLyogQXMgcG93ZXJkb21haW5zIGFyZSBhZGRlZCBvciByZW1vdmVkIGFib3ZlLCB0aGlzIGxpc3QgbXVzdCBhbHNvIGJlIGNoYW5nZWQgKi8KLXN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKnBvd2VyZG9tYWluc19vbWFwM3h4eFtdIF9faW5pdGRhdGEgPSB7Ci0KK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKnBvd2VyZG9tYWluc19vbWFwMzQzMF9jb21tb25bXSBfX2luaXRkYXRhID0gewogCSZ3a3VwX29tYXAyX3B3cmRtLAotCSZnZnhfb21hcDJfcHdyZG0sCiAJJml2YTJfcHdyZG0sCiAJJm1wdV8zeHh4X3B3cmRtLAogCSZuZW9uX3B3cmRtLAotCSZjb3JlXzN4eHhfcHJlX2VzM18xX3B3cmRtLAotCSZjb3JlXzN4eHhfZXMzXzFfcHdyZG0sCiAJJmNhbV9wd3JkbSwKIAkmZHNzX3B3cmRtLAogCSZwZXJfcHdyZG0sCiAJJmVtdV9wd3JkbSwKLQkmc2d4X3B3cmRtLAotCSZ1c2Job3N0X3B3cmRtLAogCSZkcGxsMV9wd3JkbSwKIAkmZHBsbDJfcHdyZG0sCiAJJmRwbGwzX3B3cmRtLAogCSZkcGxsNF9wd3JkbSwKLQkmZHBsbDVfcHdyZG0sCi0jZW5kaWYKIAlOVUxMCiB9OwogCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluICpwb3dlcmRvbWFpbnNfb21hcDM0MzBlczFbXSBfX2luaXRkYXRhID0geworCSZnZnhfb21hcDJfcHdyZG0sCisJJmNvcmVfM3h4eF9wcmVfZXMzXzFfcHdyZG0sCisJTlVMTAorfTsKKworLyogYWxzbyBpbmNsdWRlcyAzNjMwRVMxLjAgKi8KK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKnBvd2VyZG9tYWluc19vbWFwMzQzMGVzMl9lczNfMFtdIF9faW5pdGRhdGEgPSB7CisJJmNvcmVfM3h4eF9wcmVfZXMzXzFfcHdyZG0sCisJJnNneF9wd3JkbSwKKwkmdXNiaG9zdF9wd3JkbSwKKwkmZHBsbDVfcHdyZG0sCisJTlVMTAorfTsKKworLyogYWxzbyBpbmNsdWRlcyAzNjMwRVMxLjErICovCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluICpwb3dlcmRvbWFpbnNfb21hcDM0MzBlczNfMXBsdXNbXSBfX2luaXRkYXRhID0geworCSZjb3JlXzN4eHhfZXMzXzFfcHdyZG0sCisJJnNneF9wd3JkbSwKKwkmdXNiaG9zdF9wd3JkbSwKKwkmZHBsbDVfcHdyZG0sCisJTlVMTAorfTsKIAogdm9pZCBfX2luaXQgb21hcDN4eHhfcG93ZXJkb21haW5zX2luaXQodm9pZCkKIHsKLQlwd3JkbV9pbml0KHBvd2VyZG9tYWluc19vbWFwM3h4eCwgJm9tYXAzX3B3cmRtX29wZXJhdGlvbnMpOworCXVuc2lnbmVkIGludCByZXY7CisKKwlpZiAoIWNwdV9pc19vbWFwMzR4eCgpKQorCQlyZXR1cm47CisKKwlwd3JkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcygmb21hcDNfcHdyZG1fb3BlcmF0aW9ucyk7CisJcHdyZG1fcmVnaXN0ZXJfcHdyZG1zKHBvd2VyZG9tYWluc19vbWFwMzQzMF9jb21tb24pOworCisJcmV2ID0gb21hcF9yZXYoKTsKKworCWlmIChyZXYgPT0gT01BUDM0MzBfUkVWX0VTMV8wKQorCQlwd3JkbV9yZWdpc3Rlcl9wd3JkbXMocG93ZXJkb21haW5zX29tYXAzNDMwZXMxKTsKKwllbHNlIGlmIChyZXYgPT0gT01BUDM0MzBfUkVWX0VTMl8wIHx8IHJldiA9PSBPTUFQMzQzMF9SRVZfRVMyXzEgfHwKKwkJIHJldiA9PSBPTUFQMzQzMF9SRVZfRVMzXzAgfHwgcmV2ID09IE9NQVAzNjMwX1JFVl9FUzFfMCkKKwkJcHdyZG1fcmVnaXN0ZXJfcHdyZG1zKHBvd2VyZG9tYWluc19vbWFwMzQzMGVzMl9lczNfMCk7CisJZWxzZSBpZiAocmV2ID09IE9NQVAzNDMwX1JFVl9FUzNfMSB8fCByZXYgPT0gT01BUDM0MzBfUkVWX0VTM18xXzIgfHwKKwkJIHJldiA9PSBPTUFQMzUxN19SRVZfRVMxXzAgfHwgcmV2ID09IE9NQVAzNTE3X1JFVl9FUzFfMSB8fAorCQkgcmV2ID09IE9NQVAzNjMwX1JFVl9FUzFfMSB8fCByZXYgPT0gT01BUDM2MzBfUkVWX0VTMV8yKQorCQlwd3JkbV9yZWdpc3Rlcl9wd3JkbXMocG93ZXJkb21haW5zX29tYXAzNDMwZXMzXzFwbHVzKTsKKwllbHNlCisJCVdBUk4oMSwgIk9NQVAzIHBvd2VyZG9tYWluIGluaXQ6IHVua25vd24gY2hpcCB0eXBlXG4iKTsKKworCXB3cmRtX2NvbXBsZXRlX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zNDR4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczQ0eHhfZGF0YS5jCmluZGV4IDI0N2U3OTQuLjcwNDY2NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zNDR4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnM0NHh4X2RhdGEuYwpAQCAtMzMsOSArMzMsOSBAQAogLyogY29yZV80NHh4X3B3cmRtOiBDT1JFIHBvd2VyIGRvbWFpbiAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBjb3JlXzQ0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiY29yZV9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fQ09SRV9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5iYW5rcwkJICA9IDUsCkBAIC01OSw5ICs1OSw5IEBACiAvKiBnZnhfNDR4eF9wd3JkbTogM0QgYWNjZWxlcmF0b3IgcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGdmeF80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImdmeF9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fR0ZYX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX09OLAogCS5iYW5rcwkJICA9IDEsCiAJLnB3cnN0c19tZW1fcmV0CT0gewpAQCAtNzYsOSArNzYsOSBAQAogLyogYWJlXzQ0eHhfcHdyZG06IEF1ZGlvIGJhY2sgZW5kIHBvd2VyIGRvbWFpbiAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBhYmVfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJhYmVfcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gIml2YSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fQUJFX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkYsCiAJLmJhbmtzCQkgID0gMiwKQEAgLTk2LDkgKzk2LDkgQEAKIC8qIGRzc180NHh4X3B3cmRtOiBEaXNwbGF5IHN1YnN5c3RlbSBwb3dlciBkb21haW4gKi8KIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gZHNzXzQ0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiZHNzX3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJjb3JlIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9EU1NfSU5TVCwKIAkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRiwKIAkuYmFua3MJCSAgPSAxLApAQCAtMTE0LDkgKzExNCw5IEBACiAvKiB0ZXNsYV80NHh4X3B3cmRtOiBUZXNsYSBwcm9jZXNzb3IgcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIHRlc2xhXzQ0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAidGVzbGFfcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gIml2YSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fVEVTTEFfSU5TVCwKIAkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLmJhbmtzCQkgID0gMywKQEAgLTEzNiw5ICsxMzYsOSBAQAogLyogd2t1cF80NHh4X3B3cmRtOiBXYWtlLXVwIHBvd2VyIGRvbWFpbiAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiB3a3VwXzQ0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAid2t1cF9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAid2FrZXVwIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9XS1VQX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT04sCiAJLmJhbmtzCQkgID0gMSwKIAkucHdyc3RzX21lbV9yZXQJPSB7CkBAIC0xNTIsOSArMTUyLDkgQEAKIC8qIGNwdTBfNDR4eF9wd3JkbTogTVBVMCBwcm9jZXNzb3IgYW5kIE5lb24gY29wcm9jZXNzb3IgcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGNwdTBfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJjcHUwX3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJtcHUiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMF9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJDTV9NUFVfUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5iYW5rcwkJICA9IDEsCkBAIC0xNjksOSArMTY5LDkgQEAKIC8qIGNwdTFfNDR4eF9wd3JkbTogTVBVMSBwcm9jZXNzb3IgYW5kIE5lb24gY29wcm9jZXNzb3IgcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGNwdTFfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJjcHUxX3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJtcHUiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMV9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJDTV9NUFVfUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5iYW5rcwkJICA9IDEsCkBAIC0xODYsOSArMTg2LDkgQEAKIC8qIGVtdV80NHh4X3B3cmRtOiBFbXVsYXRpb24gcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGVtdV80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImVtdV9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAid2FrZXVwIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9FTVVfSU5TVCwKIAkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfT04sCiAJLmJhbmtzCQkgID0gMSwKIAkucHdyc3RzX21lbV9yZXQJPSB7CkBAIC0yMDIsOSArMjAyLDkgQEAKIC8qIG1wdV80NHh4X3B3cmRtOiBNb2RlbmEgcHJvY2Vzc29yIGFuZCB0aGUgTmVvbiBjb3Byb2Nlc3NvciBwb3dlciBkb21haW4gKi8KIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gbXB1XzQ0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAibXB1X3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJtcHUiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX01QVV9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5iYW5rcwkJICA9IDMsCkBAIC0yMjMsOSArMjIzLDkgQEAKIC8qIGl2YWhkXzQ0eHhfcHdyZG06IElWQS1IRCBwb3dlciBkb21haW4gKi8KIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gaXZhaGRfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJpdmFoZF9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAiaXZhIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9JVkFIRF9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfT0ZGLAogCS5iYW5rcwkJICA9IDQsCkBAIC0yNDcsOSArMjQ3LDkgQEAKIC8qIGNhbV80NHh4X3B3cmRtOiBDYW1lcmEgc3Vic3lzdGVtIHBvd2VyIGRvbWFpbiAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBjYW1fNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJjYW1fcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX0NBTV9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9PTiwKIAkuYmFua3MJCSAgPSAxLAogCS5wd3JzdHNfbWVtX3JldAk9IHsKQEAgLTI2NCw5ICsyNjQsOSBAQAogLyogbDNpbml0XzQ0eHhfcHdyZG06IEwzIGluaXRhdG9ycyBwaGVyaXBoZXJhbHMgcG93ZXIgZG9tYWluICAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBsM2luaXRfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJsM2luaXRfcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX0wzSU5JVF9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5iYW5rcwkJICA9IDEsCkBAIC0yODIsOSArMjgyLDkgQEAKIC8qIGw0cGVyXzQ0eHhfcHdyZG06IFRhcmdldCBwZXJpcGhlcmFscyBwb3dlciBkb21haW4gKi8KIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gbDRwZXJfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJsNHBlcl9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fTDRQRVJfSU5TVCwKIAkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfT0ZGX1JFVCwKIAkuYmFua3MJCSAgPSAyLApAQCAtMzA1LDE4ICszMDUsMTggQEAKICAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBhbHdheXNfb25fY29yZV80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImFsd2F5c19vbl9jb3JlX3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJjb3JlIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9BTFdBWVNfT05fSU5TVCwKIAkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PTiwKIH07CiAKIC8qIGNlZnVzZV80NHh4X3B3cmRtOiBDdXN0b21lciBlZnVzZSBjb250cm9sbGVyIHBvd2VyIGRvbWFpbiAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBjZWZ1c2VfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJjZWZ1c2VfcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX0NFRlVTRV9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9PTiwKIAkuZmxhZ3MJCSAgPSBQV1JETV9IQVNfTE9XUE9XRVJTVEFURUNIQU5HRSwKIH07CkBAIC0zNTIsNSArMzUyLDcgQEAKIAogdm9pZCBfX2luaXQgb21hcDQ0eHhfcG93ZXJkb21haW5zX2luaXQodm9pZCkKIHsKLQlwd3JkbV9pbml0KHBvd2VyZG9tYWluc19vbWFwNDR4eCwgJm9tYXA0X3B3cmRtX29wZXJhdGlvbnMpOworCXB3cmRtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKCZvbWFwNF9wd3JkbV9vcGVyYXRpb25zKTsKKwlwd3JkbV9yZWdpc3Rlcl9wd3JkbXMocG93ZXJkb21haW5zX29tYXA0NHh4KTsKKwlwd3JkbV9jb21wbGV0ZV9pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ByY20uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJjbS5jCmluZGV4IDJlNDBhNWMuLjU5N2UyZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJjbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJjbS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWFjaC9zeXN0ZW0uaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgpAQCAtMTUxLDE3ICsxNTIsMTAgQEAKIAogdm9pZCBfX2luaXQgb21hcDJfc2V0X2dsb2JhbHNfcHJjbShzdHJ1Y3Qgb21hcF9nbG9iYWxzICpvbWFwMl9nbG9iYWxzKQogewotCS8qIFN0YXRpYyBtYXBwaW5nLCBuZXZlciByZWxlYXNlZCAqLwotCWlmIChvbWFwMl9nbG9iYWxzLT5wcm0pIHsKLQkJcHJtX2Jhc2UgPSBpb3JlbWFwKG9tYXAyX2dsb2JhbHMtPnBybSwgU1pfOEspOwotCQlXQVJOX09OKCFwcm1fYmFzZSk7Ci0JfQotCWlmIChvbWFwMl9nbG9iYWxzLT5jbSkgewotCQljbV9iYXNlID0gaW9yZW1hcChvbWFwMl9nbG9iYWxzLT5jbSwgU1pfOEspOwotCQlXQVJOX09OKCFjbV9iYXNlKTsKLQl9Ci0JaWYgKG9tYXAyX2dsb2JhbHMtPmNtMikgewotCQljbTJfYmFzZSA9IGlvcmVtYXAob21hcDJfZ2xvYmFscy0+Y20yLCBTWl84Syk7Ci0JCVdBUk5fT04oIWNtMl9iYXNlKTsKLQl9CisJaWYgKG9tYXAyX2dsb2JhbHMtPnBybSkKKwkJcHJtX2Jhc2UgPSBvbWFwMl9nbG9iYWxzLT5wcm07CisJaWYgKG9tYXAyX2dsb2JhbHMtPmNtKQorCQljbV9iYXNlID0gb21hcDJfZ2xvYmFscy0+Y207CisJaWYgKG9tYXAyX2dsb2JhbHMtPmNtMikKKwkJY20yX2Jhc2UgPSBvbWFwMl9nbG9iYWxzLT5jbTI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTJ4eHhfM3h4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0yeHh4XzN4eHguYwppbmRleCAwNTEyMTNmLi5mMDJkODdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTJ4eHhfM3h4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtMnh4eF8zeHh4LmMKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvcHJjbS5oPgogCisjaW5jbHVkZSAidnAuaCIKKwogI2luY2x1ZGUgInBybTJ4eHhfM3h4eC5oIgogI2luY2x1ZGUgImNtMnh4eF8zeHh4LmgiCiAjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMjR4eC5oIgpAQCAtMTU2LDMgKzE1OCw1NyBAQAogCiAJcmV0dXJuIChjID09IE1BWF9NT0RVTEVfSEFSRFJFU0VUX1dBSVQpID8gLUVCVVNZIDogMDsKIH0KKworLyogUFJNIFZQICovCisKKy8qCisgKiBzdHJ1Y3Qgb21hcDNfdnAgLSBPTUFQMyBWUCByZWdpc3RlciBhY2Nlc3MgZGVzY3JpcHRpb24uCisgKiBAdHJhbnhkb25lX3N0YXR1czogVlBfVFJBTlhET05FX1NUIGJpdG1hc2sgaW4gUFJNX0lSUVNUQVRVU19NUFUgcmVnCisgKi8KK3N0cnVjdCBvbWFwM192cCB7CisJdTMyIHRyYW54ZG9uZV9zdGF0dXM7Cit9OworCitzdGF0aWMgc3RydWN0IG9tYXAzX3ZwIG9tYXAzX3ZwW10gPSB7CisJW09NQVAzX1ZQX1ZERF9NUFVfSURdID0geworCQkudHJhbnhkb25lX3N0YXR1cyA9IE9NQVAzNDMwX1ZQMV9UUkFOWERPTkVfU1RfTUFTSywKKwl9LAorCVtPTUFQM19WUF9WRERfQ09SRV9JRF0gPSB7CisJCS50cmFueGRvbmVfc3RhdHVzID0gT01BUDM0MzBfVlAyX1RSQU5YRE9ORV9TVF9NQVNLLAorCX0sCit9OworCisjZGVmaW5lIE1BWF9WUF9JRCBBUlJBWV9TSVpFKG9tYXAzX3ZwKTsKKwordTMyIG9tYXAzX3BybV92cF9jaGVja190eGRvbmUodTggdnBfaWQpCit7CisJc3RydWN0IG9tYXAzX3ZwICp2cCA9ICZvbWFwM192cFt2cF9pZF07CisJdTMyIGlycXN0YXR1czsKKworCWlycXN0YXR1cyA9IG9tYXAyX3BybV9yZWFkX21vZF9yZWcoT0NQX01PRCwKKwkJCQkJICAgT01BUDNfUFJNX0lSUVNUQVRVU19NUFVfT0ZGU0VUKTsKKwlyZXR1cm4gaXJxc3RhdHVzICYgdnAtPnRyYW54ZG9uZV9zdGF0dXM7Cit9CisKK3ZvaWQgb21hcDNfcHJtX3ZwX2NsZWFyX3R4ZG9uZSh1OCB2cF9pZCkKK3sKKwlzdHJ1Y3Qgb21hcDNfdnAgKnZwID0gJm9tYXAzX3ZwW3ZwX2lkXTsKKworCW9tYXAyX3BybV93cml0ZV9tb2RfcmVnKHZwLT50cmFueGRvbmVfc3RhdHVzLAorCQkJCU9DUF9NT0QsIE9NQVAzX1BSTV9JUlFTVEFUVVNfTVBVX09GRlNFVCk7Cit9CisKK3UzMiBvbWFwM19wcm1fdmN2cF9yZWFkKHU4IG9mZnNldCkKK3sKKwlyZXR1cm4gb21hcDJfcHJtX3JlYWRfbW9kX3JlZyhPTUFQMzQzMF9HUl9NT0QsIG9mZnNldCk7Cit9CisKK3ZvaWQgb21hcDNfcHJtX3ZjdnBfd3JpdGUodTMyIHZhbCwgdTggb2Zmc2V0KQoreworCW9tYXAyX3BybV93cml0ZV9tb2RfcmVnKHZhbCwgT01BUDM0MzBfR1JfTU9ELCBvZmZzZXQpOworfQorCit1MzIgb21hcDNfcHJtX3ZjdnBfcm13KHUzMiBtYXNrLCB1MzIgYml0cywgdTggb2Zmc2V0KQoreworCXJldHVybiBvbWFwMl9wcm1fcm13X21vZF9yZWdfYml0cyhtYXNrLCBiaXRzLCBPTUFQMzQzMF9HUl9NT0QsIG9mZnNldCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTJ4eHhfM3h4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0yeHh4XzN4eHguaAppbmRleCBhMWZjNjJhLi5jZWY1MzNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTJ4eHhfM3h4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtMnh4eF8zeHh4LmgKQEAgLTMwMyw3ICszMDMsMTkgQEAKIGV4dGVybiBpbnQgb21hcDJfcHJtX2Fzc2VydF9oYXJkcmVzZXQoczE2IHBybV9tb2QsIHU4IHNoaWZ0KTsKIGV4dGVybiBpbnQgb21hcDJfcHJtX2RlYXNzZXJ0X2hhcmRyZXNldChzMTYgcHJtX21vZCwgdTggcnN0X3NoaWZ0LCB1OCBzdF9zaGlmdCk7CiAKKy8qIE9NQVAzLXNwZWNpZmljIFZQIGZ1bmN0aW9ucyAqLwordTMyIG9tYXAzX3BybV92cF9jaGVja190eGRvbmUodTggdnBfaWQpOwordm9pZCBvbWFwM19wcm1fdnBfY2xlYXJfdHhkb25lKHU4IHZwX2lkKTsKKworLyoKKyAqIE9NQVAzIGFjY2VzcyBmdW5jdGlvbnMgZm9yIHZvbHRhZ2UgY29udHJvbGxlciAoVkMpIGFuZAorICogdm9sdGFnZSBwcm9jY2Vzc29yIChWUCkgaW4gdGhlIFBSTS4KKyAqLworZXh0ZXJuIHUzMiBvbWFwM19wcm1fdmN2cF9yZWFkKHU4IG9mZnNldCk7CitleHRlcm4gdm9pZCBvbWFwM19wcm1fdmN2cF93cml0ZSh1MzIgdmFsLCB1OCBvZmZzZXQpOworZXh0ZXJuIHUzMiBvbWFwM19wcm1fdmN2cF9ybXcodTMyIG1hc2ssIHUzMiBiaXRzLCB1OCBvZmZzZXQpOwogI2VuZGlmCS8qIENPTkZJR19BUkNIX09NQVA0ICovCisKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm00NHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTQ0eHguYwppbmRleCAwMDE2NTU1Li40OTVhMzFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTQ0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTQ0eHguYwpAQCAtMjEsOCArMjEsMTEgQEAKICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvcHJjbS5oPgogCisjaW5jbHVkZSAidnAuaCIKICNpbmNsdWRlICJwcm00NHh4LmgiCiAjaW5jbHVkZSAicHJtLXJlZ2JpdHMtNDR4eC5oIgorI2luY2x1ZGUgInByY200NHh4LmgiCisjaW5jbHVkZSAicHJtaW5zdDQ0eHguaCIKIAogLyogUFJNIGxvdy1sZXZlbCBmdW5jdGlvbnMgKi8KIApAQCAtNTAsMyArNTMsNzEgQEAKIAogCXJldHVybiB2OwogfQorCisvKiBQUk0gVlAgKi8KKworLyoKKyAqIHN0cnVjdCBvbWFwNF92cCAtIE9NQVA0IFZQIHJlZ2lzdGVyIGFjY2VzcyBkZXNjcmlwdGlvbi4KKyAqIEBpcnFzdGF0dXNfbXB1OiBvZmZzZXQgdG8gSVJRU1RBVFVTX01QVSByZWdpc3RlciBmb3IgVlAKKyAqIEB0cmFueGRvbmVfc3RhdHVzOiBWUF9UUkFOWERPTkVfU1QgYml0bWFzayBpbiBQUk1fSVJRU1RBVFVTX01QVSByZWcKKyAqLworc3RydWN0IG9tYXA0X3ZwIHsKKwl1MzIgaXJxc3RhdHVzX21wdTsKKwl1MzIgdHJhbnhkb25lX3N0YXR1czsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcDRfdnAgb21hcDRfdnBbXSA9IHsKKwlbT01BUDRfVlBfVkREX01QVV9JRF0gPSB7CisJCS5pcnFzdGF0dXNfbXB1ID0gT01BUDRfUFJNX0lSUVNUQVRVU19NUFVfMl9PRkZTRVQsCisJCS50cmFueGRvbmVfc3RhdHVzID0gT01BUDQ0MzBfVlBfTVBVX1RSQU5YRE9ORV9TVF9NQVNLLAorCX0sCisJW09NQVA0X1ZQX1ZERF9JVkFfSURdID0geworCQkuaXJxc3RhdHVzX21wdSA9IE9NQVA0X1BSTV9JUlFTVEFUVVNfTVBVX09GRlNFVCwKKwkJLnRyYW54ZG9uZV9zdGF0dXMgPSBPTUFQNDQzMF9WUF9JVkFfVFJBTlhET05FX1NUX01BU0ssCisJfSwKKwlbT01BUDRfVlBfVkREX0NPUkVfSURdID0geworCQkuaXJxc3RhdHVzX21wdSA9IE9NQVA0X1BSTV9JUlFTVEFUVVNfTVBVX09GRlNFVCwKKwkJLnRyYW54ZG9uZV9zdGF0dXMgPSBPTUFQNDQzMF9WUF9DT1JFX1RSQU5YRE9ORV9TVF9NQVNLLAorCX0sCit9OworCit1MzIgb21hcDRfcHJtX3ZwX2NoZWNrX3R4ZG9uZSh1OCB2cF9pZCkKK3sKKwlzdHJ1Y3Qgb21hcDRfdnAgKnZwID0gJm9tYXA0X3ZwW3ZwX2lkXTsKKwl1MzIgaXJxc3RhdHVzOworCisJaXJxc3RhdHVzID0gb21hcDRfcHJtaW5zdF9yZWFkX2luc3RfcmVnKE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCisJCQkJCQlPTUFQNDQzMF9QUk1fT0NQX1NPQ0tFVF9JTlNULAorCQkJCQkJdnAtPmlycXN0YXR1c19tcHUpOworCXJldHVybiBpcnFzdGF0dXMgJiB2cC0+dHJhbnhkb25lX3N0YXR1czsKK30KKwordm9pZCBvbWFwNF9wcm1fdnBfY2xlYXJfdHhkb25lKHU4IHZwX2lkKQoreworCXN0cnVjdCBvbWFwNF92cCAqdnAgPSAmb21hcDRfdnBbdnBfaWRdOworCisJb21hcDRfcHJtaW5zdF93cml0ZV9pbnN0X3JlZyh2cC0+dHJhbnhkb25lX3N0YXR1cywKKwkJCQkgICAgIE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCisJCQkJICAgICBPTUFQNDQzMF9QUk1fT0NQX1NPQ0tFVF9JTlNULAorCQkJCSAgICAgdnAtPmlycXN0YXR1c19tcHUpOworfTsKKwordTMyIG9tYXA0X3BybV92Y3ZwX3JlYWQodTggb2Zmc2V0KQoreworCXJldHVybiBvbWFwNF9wcm1pbnN0X3JlYWRfaW5zdF9yZWcoT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKKwkJCQkJICAgT01BUDQ0MzBfUFJNX0RFVklDRV9JTlNULCBvZmZzZXQpOworfQorCit2b2lkIG9tYXA0X3BybV92Y3ZwX3dyaXRlKHUzMiB2YWwsIHU4IG9mZnNldCkKK3sKKwlvbWFwNF9wcm1pbnN0X3dyaXRlX2luc3RfcmVnKHZhbCwgT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKKwkJCQkgICAgIE9NQVA0NDMwX1BSTV9ERVZJQ0VfSU5TVCwgb2Zmc2V0KTsKK30KKwordTMyIG9tYXA0X3BybV92Y3ZwX3Jtdyh1MzIgbWFzaywgdTMyIGJpdHMsIHU4IG9mZnNldCkKK3sKKwlyZXR1cm4gb21hcDRfcHJtaW5zdF9ybXdfaW5zdF9yZWdfYml0cyhtYXNrLCBiaXRzLAorCQkJCQkgICAgICAgT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKKwkJCQkJICAgICAgIE9NQVA0NDMwX1BSTV9ERVZJQ0VfSU5TVCwKKwkJCQkJICAgICAgIG9mZnNldCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTQ0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtNDR4eC5oCmluZGV4IDdkZmEzNzkuLjNkNjZjY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtNDR4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtNDR4eC5oCkBAIC03NTEsNiArNzUxLDE4IEBACiBleHRlcm4gdm9pZCBvbWFwNF9wcm1fd3JpdGVfaW5zdF9yZWcodTMyIHZhbCwgczE2IGluc3QsIHUxNiBpZHgpOwogZXh0ZXJuIHUzMiBvbWFwNF9wcm1fcm13X2luc3RfcmVnX2JpdHModTMyIG1hc2ssIHUzMiBiaXRzLCBzMTYgaW5zdCwgczE2IGlkeCk7CiAKKy8qIE9NQVA0LXNwZWNpZmljIFZQIGZ1bmN0aW9ucyAqLwordTMyIG9tYXA0X3BybV92cF9jaGVja190eGRvbmUodTggdnBfaWQpOwordm9pZCBvbWFwNF9wcm1fdnBfY2xlYXJfdHhkb25lKHU4IHZwX2lkKTsKKworLyoKKyAqIE9NQVA0IGFjY2VzcyBmdW5jdGlvbnMgZm9yIHZvbHRhZ2UgY29udHJvbGxlciAoVkMpIGFuZAorICogdm9sdGFnZSBwcm9jY2Vzc29yIChWUCkgaW4gdGhlIFBSTS4KKyAqLworZXh0ZXJuIHUzMiBvbWFwNF9wcm1fdmN2cF9yZWFkKHU4IG9mZnNldCk7CitleHRlcm4gdm9pZCBvbWFwNF9wcm1fdmN2cF93cml0ZSh1MzIgdmFsLCB1OCBvZmZzZXQpOworZXh0ZXJuIHUzMiBvbWFwNF9wcm1fdmN2cF9ybXcodTMyIG1hc2ssIHUzMiBiaXRzLCB1OCBvZmZzZXQpOworCiAjIGVuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZHJjLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NkcmMuYwppbmRleCBkYTZmM2E2Li44ZjI3ODI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NkcmMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NkcmMuYwpAQCAtMTE3LDE1ICsxMTcsMTAgQEAKIAogdm9pZCBfX2luaXQgb21hcDJfc2V0X2dsb2JhbHNfc2RyYyhzdHJ1Y3Qgb21hcF9nbG9iYWxzICpvbWFwMl9nbG9iYWxzKQogewotCS8qIFN0YXRpYyBtYXBwaW5nLCBuZXZlciByZWxlYXNlZCAqLwotCWlmIChvbWFwMl9nbG9iYWxzLT5zZHJjKSB7Ci0JCW9tYXAyX3NkcmNfYmFzZSA9IGlvcmVtYXAob21hcDJfZ2xvYmFscy0+c2RyYywgU1pfNjRLKTsKLQkJV0FSTl9PTighb21hcDJfc2RyY19iYXNlKTsKLQl9Ci0JaWYgKG9tYXAyX2dsb2JhbHMtPnNtcykgewotCQlvbWFwMl9zbXNfYmFzZSA9IGlvcmVtYXAob21hcDJfZ2xvYmFscy0+c21zLCBTWl82NEspOwotCQlXQVJOX09OKCFvbWFwMl9zbXNfYmFzZSk7Ci0JfQorCWlmIChvbWFwMl9nbG9iYWxzLT5zZHJjKQorCQlvbWFwMl9zZHJjX2Jhc2UgPSBvbWFwMl9nbG9iYWxzLT5zZHJjOworCWlmIChvbWFwMl9nbG9iYWxzLT5zbXMpCisJCW9tYXAyX3Ntc19iYXNlID0gb21hcDJfZ2xvYmFscy0+c21zOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jCmluZGV4IDQ2NmZjNzIyLi45OTkyZGJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMKQEAgLTEwNywyOCArMTA3LDYgQEAKIHN0YXRpYyBMSVNUX0hFQUQodWFydF9saXN0KTsKIHN0YXRpYyB1OCBudW1fdWFydHM7CiAKLXN0YXRpYyBpbnQgdWFydF9pZGxlX2h3bW9kKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpCi17Ci0Jb21hcF9od21vZF9pZGxlKG9kLT5od21vZHNbMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdWFydF9lbmFibGVfaHdtb2Qoc3RydWN0IG9tYXBfZGV2aWNlICpvZCkKLXsKLQlvbWFwX2h3bW9kX2VuYWJsZShvZC0+aHdtb2RzWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgb21hcF91YXJ0X2xhdGVuY3lbXSA9IHsKLQl7Ci0JCS5kZWFjdGl2YXRlX2Z1bmMgPSB1YXJ0X2lkbGVfaHdtb2QsCi0JCS5hY3RpdmF0ZV9mdW5jCSA9IHVhcnRfZW5hYmxlX2h3bW9kLAotCQkuZmxhZ3MgPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNULAotCX0sCi19OwotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX3NlcmlhbF9yZWFkX3JlZyhzdHJ1Y3QgdWFydF9wb3J0ICp1cCwKIAkJCQkJICAgICBpbnQgb2Zmc2V0KQogewpAQCAtNzExLDcgKzY4OSw3IEBACiB7CiAJc3RydWN0IG9tYXBfdWFydF9zdGF0ZSAqdWFydDsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXZvaWQgKnBkYXRhID0gTlVMTDsKIAl1MzIgcGRhdGFfc2l6ZSA9IDA7CiAJY2hhciAqbmFtZTsKQEAgLTc5OSwyMCArNzc3LDE5IEBACiAJaWYgKFdBUk5fT04oIW9oKSkKIAkJcmV0dXJuOwogCi0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCB1YXJ0LT5udW0sIG9oLCBwZGF0YSwgcGRhdGFfc2l6ZSwKLQkJCSAgICAgICBvbWFwX3VhcnRfbGF0ZW5jeSwKLQkJCSAgICAgICBBUlJBWV9TSVpFKG9tYXBfdWFydF9sYXRlbmN5KSwgZmFsc2UpOwotCVdBUk4oSVNfRVJSKG9kKSwgIkNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXM6ICVzLlxuIiwKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgdWFydC0+bnVtLCBvaCwgcGRhdGEsIHBkYXRhX3NpemUsCisJCQkJIE5VTEwsIDAsIGZhbHNlKTsKKwlXQVJOKElTX0VSUihwZGV2KSwgIkNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXM6ICVzLlxuIiwKIAkgICAgIG5hbWUsIG9oLT5uYW1lKTsKIAotCW9tYXBfZGV2aWNlX2Rpc2FibGVfaWRsZV9vbl9zdXNwZW5kKG9kKTsKKwlvbWFwX2RldmljZV9kaXNhYmxlX2lkbGVfb25fc3VzcGVuZChwZGV2KTsKIAlvaC0+bXV4ID0gb21hcF9od21vZF9tdXhfaW5pdChiZGF0YS0+cGFkcywgYmRhdGEtPnBhZHNfY250KTsKIAogCXVhcnQtPmlycSA9IG9oLT5tcHVfaXJxc1swXS5pcnE7CiAJdWFydC0+cmVnc2hpZnQgPSAyOwogCXVhcnQtPm1hcGJhc2UgPSBvaC0+c2xhdmVzWzBdLT5hZGRyLT5wYV9zdGFydDsKIAl1YXJ0LT5tZW1iYXNlID0gb21hcF9od21vZF9nZXRfbXB1X3J0X3ZhKG9oKTsKLQl1YXJ0LT5wZGV2ID0gJm9kLT5wZGV2OworCXVhcnQtPnBkZXYgPSBwZGV2OwogCiAJb2gtPmRldl9hdHRyID0gdWFydDsKIApAQCAtODQ2LDggKzgyMyw4IEBACiAKIAlpZiAoKGNwdV9pc19vbWFwMzR4eCgpICYmIHVhcnQtPnBhZGNvbmYpIHx8CiAJICAgICh1YXJ0LT53a19lbiAmJiB1YXJ0LT53a19tYXNrKSkgewotCQlkZXZpY2VfaW5pdF93YWtldXAoJm9kLT5wZGV2LmRldiwgdHJ1ZSk7Ci0JCURFVl9DUkVBVEVfRklMRSgmb2QtPnBkZXYuZGV2LCAmZGV2X2F0dHJfc2xlZXBfdGltZW91dCk7CisJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCB0cnVlKTsKKwkJREVWX0NSRUFURV9GSUxFKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9zbGVlcF90aW1lb3V0KTsKIAl9CiAKIAkvKiBFbmFibGUgdGhlIE1EUjEgZXJyYXRhIGZvciBPTUFQMyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbWFydHJlZmxleC1jbGFzczMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc21hcnRyZWZsZXgtY2xhc3MzLmMKaW5kZXggZjQzOGNmNC4uNTNkOWQwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbWFydHJlZmxleC1jbGFzczMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NtYXJ0cmVmbGV4LWNsYXNzMy5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIHN0YXRpYyBpbnQgc3JfY2xhc3MzX2VuYWJsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQogewotCXVuc2lnbmVkIGxvbmcgdm9sdCA9IG9tYXBfdm9sdGFnZV9nZXRfbm9tX3ZvbHQodm9sdGRtKTsKKwl1bnNpZ25lZCBsb25nIHZvbHQgPSB2b2x0ZG1fZ2V0X3ZvbHRhZ2Uodm9sdGRtKTsKIAogCWlmICghdm9sdCkgewogCQlwcl93YXJuaW5nKCIlczogQ3VyciB2b2x0YWdlIHVua25vd24uIENhbm5vdCBlbmFibGUgc3JfJXNcbiIsCkBAIC0zMiw3ICszMiw3IEBACiAJb21hcF92cF9kaXNhYmxlKHZvbHRkbSk7CiAJc3JfZGlzYWJsZSh2b2x0ZG0pOwogCWlmIChpc192b2x0X3Jlc2V0KQotCQlvbWFwX3ZvbHRhZ2VfcmVzZXQodm9sdGRtKTsKKwkJdm9sdGRtX3Jlc2V0KHZvbHRkbSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvc21hcnRyZWZsZXguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc21hcnRyZWZsZXguYwppbmRleCBmNDk4MDRmLi42YTRmNjgzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NtYXJ0cmVmbGV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbWFydHJlZmxleC5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTYyLDYgKzYzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX3NyX2NsYXNzX2RhdGEgKnNyX2NsYXNzOwogc3RhdGljIHN0cnVjdCBvbWFwX3NyX3BtaWNfZGF0YSAqc3JfcG1pY19kYXRhOworc3RhdGljIHN0cnVjdCBkZW50cnkJCSpzcl9kYmdfZGlyOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3Jfd3JpdGVfcmVnKHN0cnVjdCBvbWFwX3NyICpzciwgdW5zaWduZWQgb2Zmc2V0LCB1MzIgdmFsdWUpCiB7CkBAIC04MjYsOSArODI4LDEwIEBACiAJc3RydWN0IG9tYXBfc3IgKnNyX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9zciksIEdGUF9LRVJORUwpOwogCXN0cnVjdCBvbWFwX3NyX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHJlc291cmNlICptZW0sICppcnE7Ci0Jc3RydWN0IGRlbnRyeSAqdmRkX2RiZ19kaXIsICpudmFsdWVfZGlyOworCXN0cnVjdCBkZW50cnkgKm52YWx1ZV9kaXI7CiAJc3RydWN0IG9tYXBfdm9sdF9kYXRhICp2b2x0X2RhdGE7CiAJaW50IGksIHJldCA9IDA7CisJY2hhciAqbmFtZTsKIAogCWlmICghc3JfaW5mbykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIHNyX2luZm9cbiIsCkBAIC04OTksMTggKzkwMiwyNSBAQAogCX0KIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogU21hcnRSZWZsZXggZHJpdmVyIGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKgotCSAqIElmIHRoZSB2b2x0YWdlIGRvbWFpbiBkZWJ1Z2ZzIGRpcmVjdG9yeSBpcyBub3QgY3JlYXRlZCwgZG8KLQkgKiBub3QgdHJ5IHRvIGNyZWF0ZSByZXN0IG9mIHRoZSBkZWJ1Z2ZzIGVudHJpZXMuCi0JICovCi0JdmRkX2RiZ19kaXIgPSBvbWFwX3ZvbHRhZ2VfZ2V0X2RiZ2Rpcihzcl9pbmZvLT52b2x0ZG0pOwotCWlmICghdmRkX2RiZ19kaXIpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfaW91bm1hcDsKKwlpZiAoIXNyX2RiZ19kaXIpIHsKKwkJc3JfZGJnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2Rpcigic21hcnRyZWZsZXgiLCBOVUxMKTsKKwkJaWYgKCFzcl9kYmdfZGlyKSB7CisJCQlyZXQgPSBQVFJfRVJSKHNyX2RiZ19kaXIpOworCQkJcHJfZXJyKCIlczpzciBkZWJ1Z2ZzIGRpciBjcmVhdGlvbiBmYWlsZWQoJWQpXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlcnJfaW91bm1hcDsKKwkJfQogCX0KIAotCXNyX2luZm8tPmRiZ19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInNtYXJ0cmVmbGV4IiwgdmRkX2RiZ19kaXIpOworCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgInNyXyVzIiwgc3JfaW5mby0+dm9sdGRtLT5uYW1lKTsKKwlpZiAoIW5hbWUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFVuYWJsZSB0byBhbGxvYyBkZWJ1Z2ZzIG5hbWVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvdW5tYXA7CisJfQorCXNyX2luZm8tPmRiZ19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgc3JfZGJnX2Rpcik7CisJa2ZyZWUobmFtZSk7CiAJaWYgKElTX0VSUihzcl9pbmZvLT5kYmdfZGlyKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogVW5hYmxlIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIiwKIAkJCV9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvc3JfZGV2aWNlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NyX2RldmljZS5jCmluZGV4IDEwZDNjNWUuLjlmNDNmY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc3JfZGV2aWNlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zcl9kZXZpY2UuYwpAQCAtMzEsMTQgKzMxLDYgQEAKIAogc3RhdGljIGJvb2wgc3JfZW5hYmxlX29uX2luaXQ7CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX3NyX2xhdGVuY3lbXSA9IHsKLQl7Ci0JCS5kZWFjdGl2YXRlX2Z1bmMgPSBvbWFwX2RldmljZV9pZGxlX2h3bW9kcywKLQkJLmFjdGl2YXRlX2Z1bmMJID0gb21hcF9kZXZpY2VfZW5hYmxlX2h3bW9kcywKLQkJLmZsYWdzID0gT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVAotCX0sCi19OwotCiAvKiBSZWFkIEVGVVNFIHZhbHVlcyBmcm9tIGNvbnRyb2wgcmVnaXN0ZXJzIGZvciBPTUFQMzQzMCAqLwogc3RhdGljIHZvaWQgX19pbml0IHNyX3NldF9udmFsdWVzKHN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAqdm9sdF9kYXRhLAogCQkJCXN0cnVjdCBvbWFwX3NyX2RhdGEgKnNyX2RhdGEpCkBAIC04MCw3ICs3Miw3IEBACiBzdGF0aWMgaW50IHNyX2Rldl9pbml0KHN0cnVjdCBvbWFwX2h3bW9kICpvaCwgdm9pZCAqdXNlcikKIHsKIAlzdHJ1Y3Qgb21hcF9zcl9kYXRhICpzcl9kYXRhOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3Qgb21hcF92b2x0X2RhdGEgKnZvbHRfZGF0YTsKIAljaGFyICpuYW1lID0gInNtYXJ0cmVmbGV4IjsKIAlzdGF0aWMgaW50IGk7CkBAIC0xMDIsNyArOTQsNyBAQAogCXNyX2RhdGEtPnNlbm5fbW9kID0gMHgxOwogCXNyX2RhdGEtPnNlbnBfbW9kID0gMHgxOwogCi0Jc3JfZGF0YS0+dm9sdGRtID0gb21hcF92b2x0YWdlX2RvbWFpbl9sb29rdXAob2gtPnZkZF9uYW1lKTsKKwlzcl9kYXRhLT52b2x0ZG0gPSB2b2x0ZG1fbG9va3VwKG9oLT52ZGRfbmFtZSk7CiAJaWYgKElTX0VSUihzcl9kYXRhLT52b2x0ZG0pKSB7CiAJCXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgdm9sdGFnZSBkb21haW4gcG9pbnRlciBmb3IgVkREICVzXG4iLAogCQkJX19mdW5jX18sIG9oLT52ZGRfbmFtZSk7CkBAIC0xMjAsMTAgKzExMiw5IEBACiAKIAlzcl9kYXRhLT5lbmFibGVfb25faW5pdCA9IHNyX2VuYWJsZV9vbl9pbml0OwogCi0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBpLCBvaCwgc3JfZGF0YSwgc2l6ZW9mKCpzcl9kYXRhKSwKLQkJCSAgICAgICBvbWFwX3NyX2xhdGVuY3ksCi0JCQkgICAgICAgQVJSQVlfU0laRShvbWFwX3NyX2xhdGVuY3kpLCAwKTsKLQlpZiAoSVNfRVJSKG9kKSkKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgaSwgb2gsIHNyX2RhdGEsIHNpemVvZigqc3JfZGF0YSksCisJCQkJIE5VTEwsIDAsIDApOworCWlmIChJU19FUlIocGRldikpCiAJCXByX3dhcm5pbmcoIiVzOiBDb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiAlcy5cblxuIiwKIAkJCV9fZnVuY19fLCBuYW1lLCBvaC0+bmFtZSk7CiBleGl0OgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi90aW1lci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi90aW1lci5jCmluZGV4IGNmMWRlN2QuLjAzN2IwZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8cGxhdC9kbXRpbWVyLmg+CkBAIC00Miw2ICs0MywxMCBAQAogI2luY2x1ZGUgPGFzbS9zY2hlZF9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwX2h3bW9kLmg+CisjaW5jbHVkZSA8cGxhdC9vbWFwX2RldmljZS5oPgorI2luY2x1ZGUgPHBsYXQvb21hcC1wbS5oPgorCisjaW5jbHVkZSAicG93ZXJkb21haW4uaCIKIAogLyogUGFyZW50IGNsb2NrcywgZXZlbnR1YWxseSB0aGVzZSB3aWxsIGNvbWUgZnJvbSB0aGUgY2xvY2sgZnJhbWV3b3JrICovCiAKQEAgLTY3LDcgKzcyLDcgQEAKIC8qIE1BWF9HUFRJTUVSX0lEOiBudW1iZXIgb2YgR1BUSU1FUnMgb24gdGhlIGNoaXAgKi8KICNkZWZpbmUgTUFYX0dQVElNRVJfSUQJCTEyCiAKLXUzMiBzeXNfdGltZXJfcmVzZXJ2ZWQ7CitzdGF0aWMgdTMyIHN5c190aW1lcl9yZXNlcnZlZDsKIAogLyogQ2xvY2tldmVudCBjb2RlICovCiAKQEAgLTc4LDcgKzgzLDcgQEAKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmY2xvY2tldmVudF9ncHQ7CiAKLQlfX29tYXBfZG1fdGltZXJfd3JpdGVfc3RhdHVzKGNsa2V2LmlvX2Jhc2UsIE9NQVBfVElNRVJfSU5UX09WRVJGTE9XKTsKKwlfX29tYXBfZG1fdGltZXJfd3JpdGVfc3RhdHVzKCZjbGtldiwgT01BUF9USU1FUl9JTlRfT1ZFUkZMT1cpOwogCiAJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtOTMsNyArOTgsNyBAQAogc3RhdGljIGludCBvbWFwMl9ncF90aW1lcl9zZXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGN5Y2xlcywKIAkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKLQlfX29tYXBfZG1fdGltZXJfbG9hZF9zdGFydChjbGtldi5pb19iYXNlLCBPTUFQX1RJTUVSX0NUUkxfU1QsCisJX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQoJmNsa2V2LCBPTUFQX1RJTUVSX0NUUkxfU1QsCiAJCQkJCQkweGZmZmZmZmZmIC0gY3ljbGVzLCAxKTsKIAogCXJldHVybiAwOwpAQCAtMTA0LDE2ICsxMDksMTYgQEAKIHsKIAl1MzIgcGVyaW9kOwogCi0JX19vbWFwX2RtX3RpbWVyX3N0b3AoY2xrZXYuaW9fYmFzZSwgMSwgY2xrZXYucmF0ZSk7CisJX19vbWFwX2RtX3RpbWVyX3N0b3AoJmNsa2V2LCAxLCBjbGtldi5yYXRlKTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CiAJCXBlcmlvZCA9IGNsa2V2LnJhdGUgLyBIWjsKIAkJcGVyaW9kIC09IDE7CiAJCS8qIExvb2tzIGxpa2Ugd2UgbmVlZCB0byBmaXJzdCBzZXQgdGhlIGxvYWQgdmFsdWUgc2VwYXJhdGVseSAqLwotCQlfX29tYXBfZG1fdGltZXJfd3JpdGUoY2xrZXYuaW9fYmFzZSwgT01BUF9USU1FUl9MT0FEX1JFRywKKwkJX19vbWFwX2RtX3RpbWVyX3dyaXRlKCZjbGtldiwgT01BUF9USU1FUl9MT0FEX1JFRywKIAkJCQkJMHhmZmZmZmZmZiAtIHBlcmlvZCwgMSk7Ci0JCV9fb21hcF9kbV90aW1lcl9sb2FkX3N0YXJ0KGNsa2V2LmlvX2Jhc2UsCisJCV9fb21hcF9kbV90aW1lcl9sb2FkX3N0YXJ0KCZjbGtldiwKIAkJCQkJT01BUF9USU1FUl9DVFJMX0FSIHwgT01BUF9USU1FUl9DVFJMX1NULAogCQkJCQkJMHhmZmZmZmZmZiAtIHBlcmlvZCwgMSk7CiAJCWJyZWFrOwpAQCAtMTg5LDcgKzE5NCw4IEBACiAJCQljbGtfcHV0KHNyYyk7CiAJCX0KIAl9Ci0JX19vbWFwX2RtX3RpbWVyX3Jlc2V0KHRpbWVyLT5pb19iYXNlLCAxLCAxKTsKKwlfX29tYXBfZG1fdGltZXJfaW5pdF9yZWdzKHRpbWVyKTsKKwlfX29tYXBfZG1fdGltZXJfcmVzZXQodGltZXIsIDEsIDEpOwogCXRpbWVyLT5wb3N0ZWQgPSAxOwogCiAJdGltZXItPnJhdGUgPSBjbGtfZ2V0X3JhdGUodGltZXItPmZjbGspOwpAQCAtMjEwLDcgKzIxNiw3IEBACiAJb21hcDJfZ3BfdGltZXJfaXJxLmRldl9pZCA9ICh2b2lkICopJmNsa2V2OwogCXNldHVwX2lycShjbGtldi5pcnEsICZvbWFwMl9ncF90aW1lcl9pcnEpOwogCi0JX19vbWFwX2RtX3RpbWVyX2ludF9lbmFibGUoY2xrZXYuaW9fYmFzZSwgT01BUF9USU1FUl9JTlRfT1ZFUkZMT1cpOworCV9fb21hcF9kbV90aW1lcl9pbnRfZW5hYmxlKCZjbGtldiwgT01BUF9USU1FUl9JTlRfT1ZFUkZMT1cpOwogCiAJY2xvY2tldmVudF9ncHQubXVsdCA9IGRpdl9zYyhjbGtldi5yYXRlLCBOU0VDX1BFUl9TRUMsCiAJCQkJICAgICBjbG9ja2V2ZW50X2dwdC5zaGlmdCk7CkBAIC0yNTEsNyArMjU3LDcgQEAKIHN0YXRpYyBERUZJTkVfQ0xPQ0tfREFUQShjZCk7CiBzdGF0aWMgY3ljbGVfdCBjbG9ja3NvdXJjZV9yZWFkX2N5Y2xlcyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQogewotCXJldHVybiAoY3ljbGVfdClfX29tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKGNsa3NyYy5pb19iYXNlLCAxKTsKKwlyZXR1cm4gKGN5Y2xlX3QpX19vbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcigmY2xrc3JjLCAxKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9ncHQgPSB7CkBAIC0yNjYsNyArMjcyLDcgQEAKIHsKIAl1MzIgY3ljOwogCi0JY3ljID0gX19vbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcihjbGtzcmMuaW9fYmFzZSwgMSk7CisJY3ljID0gX19vbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcigmY2xrc3JjLCAxKTsKIAogCXVwZGF0ZV9zY2hlZF9jbG9jaygmY2QsIGN5YywgKHUzMil+MCk7CiB9CkBAIC0yNzYsNyArMjgyLDcgQEAKIAl1MzIgY3ljID0gMDsKIAogCWlmIChjbGtzcmMucmVzZXJ2ZWQpCi0JCWN5YyA9IF9fb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoY2xrc3JjLmlvX2Jhc2UsIDEpOworCQljeWMgPSBfX29tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKCZjbGtzcmMsIDEpOwogCiAJcmV0dXJuIGN5Y190b19zY2hlZF9jbG9jaygmY2QsIGN5YywgKHUzMil+MCk7CiB9CkBAIC0yOTMsNyArMjk5LDcgQEAKIAlwcl9pbmZvKCJPTUFQIGNsb2Nrc291cmNlOiBHUFRJTUVSJWQgYXQgJWx1IEh6XG4iLAogCQlncHRpbWVyX2lkLCBjbGtzcmMucmF0ZSk7CiAKLQlfX29tYXBfZG1fdGltZXJfbG9hZF9zdGFydChjbGtzcmMuaW9fYmFzZSwKKwlfX29tYXBfZG1fdGltZXJfbG9hZF9zdGFydCgmY2xrc3JjLAogCQkJT01BUF9USU1FUl9DVFJMX1NUIHwgT01BUF9USU1FUl9DVFJMX0FSLCAwLCAxKTsKIAlpbml0X3NjaGVkX2Nsb2NrKCZjZCwgZG10aW1lcl91cGRhdGVfc2NoZWRfY2xvY2ssIDMyLCBjbGtzcmMucmF0ZSk7CiAKQEAgLTM0MSwzICszNDcsMTU3IEBACiB9CiBPTUFQX1NZU19USU1FUig0KQogI2VuZGlmCisKKy8qKgorICogb21hcDJfZG1fdGltZXJfc2V0X3NyYyAtIGNoYW5nZSB0aGUgdGltZXIgaW5wdXQgY2xvY2sgc291cmNlCisgKiBAcGRldjoJdGltZXIgcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKKyAqIEBzb3VyY2U6CWFycmF5IGluZGV4IG9mIHBhcmVudCBjbG9jayBzb3VyY2UKKyAqLworc3RhdGljIGludCBvbWFwMl9kbV90aW1lcl9zZXRfc3JjKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBzb3VyY2UpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZG10aW1lcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBjbGsgKmZjbGssICpwYXJlbnQ7CisJY2hhciAqcGFyZW50X25hbWUgPSBOVUxMOworCisJZmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImZjayIpOworCWlmIChJU19FUlJfT1JfTlVMTChmY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogJWQ6IGNsa19nZXQoKSBGQUlMRURcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChzb3VyY2UpIHsKKwljYXNlIE9NQVBfVElNRVJfU1JDX1NZU19DTEs6CisJCXBhcmVudF9uYW1lID0gInN5c19jayI7CisJCWJyZWFrOworCisJY2FzZSBPTUFQX1RJTUVSX1NSQ18zMl9LSFo6CisJCXBhcmVudF9uYW1lID0gIjMya19jayI7CisJCWJyZWFrOworCisJY2FzZSBPTUFQX1RJTUVSX1NSQ19FWFRfQ0xLOgorCQlpZiAocGRhdGEtPnRpbWVyX2lwX3ZlcnNpb24gPT0gT01BUF9USU1FUl9JUF9WRVJTSU9OXzEpIHsKKwkJCXBhcmVudF9uYW1lID0gImFsdF9jayI7CisJCQlicmVhazsKKwkJfQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogJWQ6IGludmFsaWQgY2xrIHNyYy5cbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQljbGtfcHV0KGZjbGspOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwYXJlbnQgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIHBhcmVudF9uYW1lKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocGFyZW50KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogJWQ6IGNsa19nZXQoKSAlcyBGQUlMRURcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBhcmVudF9uYW1lKTsKKwkJY2xrX3B1dChmY2xrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gY2xrX3NldF9wYXJlbnQoZmNsaywgcGFyZW50KTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGNsa19zZXRfcGFyZW50KCkgdG8gJXMgRkFJTEVEXG4iLAorCQkJX19mdW5jX18sIHBhcmVudF9uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwljbGtfcHV0KHBhcmVudCk7CisJY2xrX3B1dChmY2xrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogb21hcF90aW1lcl9pbml0IC0gYnVpbGQgYW5kIHJlZ2lzdGVyIHRpbWVyIGRldmljZSB3aXRoIGFuCisgKiBhc3NvY2lhdGVkIHRpbWVyIGh3bW9kCisgKiBAb2g6CXRpbWVyIGh3bW9kIHBvaW50ZXIgdG8gYmUgdXNlZCB0byBidWlsZCB0aW1lciBkZXZpY2UKKyAqIEB1c2VyOglwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgcGFzc2VkIGZyb20gY2FsbGluZyBod21vZCBBUEkKKyAqCisgKiBDYWxsZWQgYnkgb21hcF9od21vZF9mb3JfZWFjaF9ieV9jbGFzcyB0byByZWdpc3RlciBlYWNoIG9mIHRoZSB0aW1lcgorICogZGV2aWNlcyBwcmVzZW50IGluIHRoZSBzeXN0ZW0uIFRoZSBudW1iZXIgb2YgdGltZXIgZGV2aWNlcyBpcyBrbm93bgorICogYnkgcGFyc2luZyB0aHJvdWdoIHRoZSBod21vZCBkYXRhYmFzZSBmb3IgYSBnaXZlbiBjbGFzcyBuYW1lLiBBdCB0aGUKKyAqIGVuZCBvZiBmdW5jdGlvbiBjYWxsIG1lbW9yeSBpcyBhbGxvY2F0ZWQgZm9yIHRpbWVyIGRldmljZSBhbmQgaXQgaXMKKyAqIHJlZ2lzdGVyZWQgdG8gdGhlIGZyYW1ld29yayByZWFkeSB0byBiZSBwcm92ZWQgYnkgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGludCBfX2luaXQgb21hcF90aW1lcl9pbml0KHN0cnVjdCBvbWFwX2h3bW9kICpvaCwgdm9pZCAqdW51c2VkKQoreworCWludCBpZDsKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpuYW1lID0gIm9tYXBfdGltZXIiOworCXN0cnVjdCBkbXRpbWVyX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IG9tYXBfdGltZXJfY2FwYWJpbGl0eV9kZXZfYXR0ciAqdGltZXJfZGV2X2F0dHI7CisJc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTsKKworCXByX2RlYnVnKCIlczogJXNcbiIsIF9fZnVuY19fLCBvaC0+bmFtZSk7CisKKwkvKiBvbiBzZWN1cmUgZGV2aWNlLCBkbyBub3QgcmVnaXN0ZXIgc2VjdXJlIHRpbWVyICovCisJdGltZXJfZGV2X2F0dHIgPSBvaC0+ZGV2X2F0dHI7CisJaWYgKG9tYXBfdHlwZSgpICE9IE9NQVAyX0RFVklDRV9UWVBFX0dQICYmIHRpbWVyX2Rldl9hdHRyKQorCQlpZiAodGltZXJfZGV2X2F0dHItPnRpbWVyX2NhcGFiaWxpdHkgPT0gT01BUF9USU1FUl9TRUNVUkUpCisJCQlyZXR1cm4gcmV0OworCisJcGRhdGEgPSBremFsbG9jKHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKSB7CisJCXByX2VycigiJXM6IE5vIG1lbW9yeSBmb3IgWyVzXVxuIiwgX19mdW5jX18sIG9oLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBFeHRyYWN0IHRoZSBJRHMgZnJvbSBuYW1lIGZpZWxkIGluIGh3bW9kIGRhdGFiYXNlCisJICogYW5kIHVzZSB0aGUgc2FtZSBmb3IgY29uc3RydWN0aW5nIGlkcycgZm9yIHRoZQorCSAqIHRpbWVyIGRldmljZXMuIEluIGEgd2F5LCB3ZSBhcmUgYXZvaWRpbmcgdXNhZ2Ugb2YKKwkgKiBzdGF0aWMgdmFyaWFibGUgd2l0aW4gdGhlIGZ1bmN0aW9uIHRvIGRvIHRoZSBzYW1lLgorCSAqIENBVVRJT046IFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBhbmQgbWFrZSBzdXJlIHRoZQorCSAqIG5hbWUgaW4gaHdtb2QgZGF0YWJhc2UgZG9lcyBub3QgY2hhbmdlIGluIHdoaWNoIGNhc2UKKwkgKiB3ZSBtaWdodCBlaXRoZXIgbWFrZSBjb3JyZXNwb25kaW5nIGNoYW5nZSBoZXJlIG9yCisJICogc3dpdGNoIGJhY2sgc3RhdGljIHZhcmlhYmxlIG1lY2hhbmlzbS4KKwkgKi8KKwlzc2NhbmYob2gtPm5hbWUsICJ0aW1lciUyZCIsICZpZCk7CisKKwlwZGF0YS0+c2V0X3RpbWVyX3NyYyA9IG9tYXAyX2RtX3RpbWVyX3NldF9zcmM7CisJcGRhdGEtPnRpbWVyX2lwX3ZlcnNpb24gPSBvaC0+Y2xhc3MtPnJldjsKKworCS8qIE1hcmsgY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQgdGltZXJzIGFzIHJlc2VydmVkICovCisJaWYgKChzeXNfdGltZXJfcmVzZXJ2ZWQgPj4gKGlkIC0gMSkpICYgMHgxKQorCQlwZGF0YS0+cmVzZXJ2ZWQgPSAxOworCisJcHdyZG0gPSBvbWFwX2h3bW9kX2dldF9wd3JkbShvaCk7CisJcGRhdGEtPmxvc2VzX2NvbnRleHQgPSBwd3JkbV9jYW5fZXZlcl9sb3NlX2NvbnRleHQocHdyZG0pOworI2lmZGVmIENPTkZJR19QTQorCXBkYXRhLT5nZXRfY29udGV4dF9sb3NzX2NvdW50ID0gb21hcF9wbV9nZXRfZGV2X2NvbnRleHRfbG9zc19jb3VudDsKKyNlbmRpZgorCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBpZCwgb2gsIHBkYXRhLCBzaXplb2YoKnBkYXRhKSwKKwkJCQkgTlVMTCwgMCwgMCk7CisKKwlpZiAoSVNfRVJSKHBkZXYpKSB7CisJCXByX2VycigiJXM6IENhbid0IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczogJXMuXG4iLAorCQkJX19mdW5jX18sIG5hbWUsIG9oLT5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlrZnJlZShwZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG9tYXAyX2RtX3RpbWVyX2luaXQgLSB0b3AgbGV2ZWwgcmVndWxhciBkZXZpY2UgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBVc2VzIGRlZGljYXRlZCBod21vZCBhcGkgdG8gcGFyc2UgdGhyb3VnaCBod21vZCBkYXRhYmFzZSBmb3IKKyAqIGdpdmVuIGNsYXNzIG5hbWUgYW5kIHRoZW4gYnVpbGQgYW5kIHJlZ2lzdGVyIHRoZSB0aW1lciBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG9tYXAyX2RtX3RpbWVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gb21hcF9od21vZF9mb3JfZWFjaF9ieV9jbGFzcygidGltZXIiLCBvbWFwX3RpbWVyX2luaXQsIE5VTEwpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigiJXM6IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwob21hcDJfZG1fdGltZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3R3bC1jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdHdsLWNvbW1vbi5jCmluZGV4IGRhYTA1NmUuLjUyMjQzNTc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3R3bC1jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3R3bC1jb21tb24uYwpAQCAtOTksNyArOTksNyBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDNfdnBsbDJfc3VwcGxpZXNbXSA9IHsKIAlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzIiksCi0JUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc2kxIiksCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc2kuMCIpLAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXAzX3ZwbGwyX2lkYXRhID0gewpAQCAtMjM1LDYgKzIzNSwxMiBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgb21hcDRfdmN4aW9fc3VwcGx5W10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc3MiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaS4wIiksCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc2kuMSIpLAorfTsKKwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXA0X3ZjeGlvX2lkYXRhID0gewogCS5jb25zdHJhaW50cyA9IHsKIAkJLm1pbl91VgkJCT0gMTgwMDAwMCwKQEAgLTI0Myw3ICsyNDksMTAgQEAKIAkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAogCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCiAJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5hbHdheXNfb24JCT0gdHJ1ZSwKIAl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG9tYXA0X3ZjeGlvX3N1cHBseSksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gb21hcDRfdmN4aW9fc3VwcGx5LAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG9tYXA0X3Z1c2JfaWRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi1tdXNiLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi1tdXNiLmMKaW5kZXggMTllNGRhYy4uMjY3OTc1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi91c2ItbXVzYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLW11c2IuYwpAQCAtNjAsNTIgKzYwLDYgQEAKIAogc3RhdGljIHU2NCBtdXNiX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1zdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgb21hcF9tdXNiX2xhdGVuY3lbXSA9IHsKLQl7Ci0JCS5kZWFjdGl2YXRlX2Z1bmMJPSBvbWFwX2RldmljZV9pZGxlX2h3bW9kcywKLQkJLmFjdGl2YXRlX2Z1bmMJCT0gb21hcF9kZXZpY2VfZW5hYmxlX2h3bW9kcywKLQkJLmZsYWdzCQkJPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNULAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCB1c2JfbXVzYl9tdXhfaW5pdChzdHJ1Y3Qgb21hcF9tdXNiX2JvYXJkX2RhdGEgKmJvYXJkX2RhdGEpCi17Ci0Jc3dpdGNoIChib2FyZF9kYXRhLT5pbnRlcmZhY2VfdHlwZSkgewotCWNhc2UgTVVTQl9JTlRFUkZBQ0VfVVRNSToKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInVzYmEwX290Z19kcCIsIE9NQVBfUElOX0lOUFVUKTsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInVzYmEwX290Z19kbSIsIE9NQVBfUElOX0lOUFVUKTsKLQkJYnJlYWs7Ci0JY2FzZSBNVVNCX0lOVEVSRkFDRV9VTFBJOgotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9jbGsiLAotCQkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9zdHAiLAotCQkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9kaXIiLAotCQkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9ueHQiLAotCQkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9kYXQwIiwKLQkJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInVzYmEwX3VscGlwaHlfZGF0MSIsCi0JCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ1c2JhMF91bHBpcGh5X2RhdDIiLAotCQkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9kYXQzIiwKLQkJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInVzYmEwX3VscGlwaHlfZGF0NCIsCi0JCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ1c2JhMF91bHBpcGh5X2RhdDUiLAotCQkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9kYXQ2IiwKLQkJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInVzYmEwX3VscGlwaHlfZGF0NyIsCi0JCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQogc3RhdGljIHN0cnVjdCBvbWFwX211c2JfYm9hcmRfZGF0YSBtdXNiX2RlZmF1bHRfYm9hcmRfZGF0YSA9IHsKIAkuaW50ZXJmYWNlX3R5cGUJCT0gTVVTQl9JTlRFUkZBQ0VfVUxQSSwKIAkubW9kZQkJCT0gTVVTQl9PVEcsCkBAIC0xMTUsNyArNjksNiBAQAogdm9pZCBfX2luaXQgdXNiX211c2JfaW5pdChzdHJ1Y3Qgb21hcF9tdXNiX2JvYXJkX2RhdGEgKm11c2JfYm9hcmRfZGF0YSkKIHsKIAlzdHJ1Y3Qgb21hcF9od21vZAkJKm9oOwotCXN0cnVjdCBvbWFwX2RldmljZQkJKm9kOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OwogCXN0cnVjdCBkZXZpY2UJCQkqZGV2OwogCWludAkJCQlidXNfaWQgPSAtMTsKQEAgLTE0NSwyMiArOTgsMTkgQEAKIAkJbmFtZSA9ICJtdXNiLW9tYXAyNDMwIjsKIAl9CiAKLQlvaCA9IG9tYXBfaHdtb2RfbG9va3VwKG9oX25hbWUpOwotCWlmICghb2gpIHsKLQkJcHJfZXJyKCJDb3VsZCBub3QgbG9vayB1cCAlc1xuIiwgb2hfbmFtZSk7Ci0JCXJldHVybjsKLQl9CisgICAgICAgIG9oID0gb21hcF9od21vZF9sb29rdXAob2hfbmFtZSk7CisgICAgICAgIGlmIChXQVJOKCFvaCwgIiVzOiBjb3VsZCBub3QgZmluZCBvbWFwX2h3bW9kIGZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIG9oX25hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKIAotCW9kID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgYnVzX2lkLCBvaCwgJm11c2JfcGxhdCwKLQkJCSAgICAgICBzaXplb2YobXVzYl9wbGF0KSwgb21hcF9tdXNiX2xhdGVuY3ksCi0JCQkgICAgICAgQVJSQVlfU0laRShvbWFwX211c2JfbGF0ZW5jeSksIGZhbHNlKTsKLQlpZiAoSVNfRVJSKG9kKSkgeworCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBidXNfaWQsIG9oLCAmbXVzYl9wbGF0LAorCQkJICAgICAgIHNpemVvZihtdXNiX3BsYXQpLCBOVUxMLCAwLCBmYWxzZSk7CisJaWYgKElTX0VSUihwZGV2KSkgewogCQlwcl9lcnIoIkNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXMgJXNcbiIsCiAJCQkJCQluYW1lLCBvaF9uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAotCXBkZXYgPSAmb2QtPnBkZXY7CiAJZGV2ID0gJnBkZXYtPmRldjsKIAlnZXRfZGV2aWNlKGRldik7CiAJZGV2LT5kbWFfbWFzayA9ICZtdXNiX2RtYW1hc2s7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi10dXNiNjAxMC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi91c2ItdHVzYjYwMTAuYwppbmRleCA4ZGQyNmI3Li45OTRkOGY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi10dXNiNjAxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLXR1c2I2MDEwLmMKQEAgLTgsMTEgKzgsMTMgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC91c2IvbXVzYi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxZDExNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdmMuYwpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIE9NQVAgVm9sdGFnZSBDb250cm9sbGVyIChWQykgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKworI2luY2x1ZGUgInZvbHRhZ2UuaCIKKyNpbmNsdWRlICJ2Yy5oIgorI2luY2x1ZGUgInBybS1yZWdiaXRzLTM0eHguaCIKKyNpbmNsdWRlICJwcm0tcmVnYml0cy00NHh4LmgiCisjaW5jbHVkZSAicHJtNDR4eC5oIgorCisvKioKKyAqIHN0cnVjdCBvbWFwX3ZjX2NoYW5uZWxfY2ZnIC0gZGVzY3JpYmUgdGhlIGNmZ19jaGFubmVsIGJpdGZpZWxkCisgKiBAc2E6IGJpdCBmb3Igc2xhdmUgYWRkcmVzcworICogQHJhdjogYml0IGZvciB2b2x0YWdlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAqIEByYWM6IGJpdCBmb3IgY29tbWFuZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKiBAcmFjZW46IGVuYWJsZSBiaXQgZm9yIFJBQworICogQGNtZDogYml0IGZvciBjb21tYW5kIHZhbHVlIHNldCBzZWxlY3Rpb24KKyAqCisgKiBDaGFubmVsIGNvbmZpZ3VyYXRpb24gYml0cywgY29tbW9uIGZvciBPTUFQMysKKyAqIE9NQVAzIHJlZ2lzdGVyOiBQUk1fVkNfQ0hfQ09ORgorICogT01BUDQgcmVnaXN0ZXI6IFBSTV9WQ19DRkdfQ0hBTk5FTAorICogT01BUDUgcmVnaXN0ZXI6IFBSTV9WQ19TTVBTXzx2b2x0ZG0+X0NPTkZJRworICovCitzdHJ1Y3Qgb21hcF92Y19jaGFubmVsX2NmZyB7CisJdTggc2E7CisJdTggcmF2OworCXU4IHJhYzsKKwl1OCByYWNlbjsKKwl1OCBjbWQ7Cit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfdmNfY2hhbm5lbF9jZmcgdmNfZGVmYXVsdF9jaGFubmVsX2NmZyA9IHsKKwkuc2EgICAgPSBCSVQoMCksCisJLnJhdiAgID0gQklUKDEpLAorCS5yYWMgICA9IEJJVCgyKSwKKwkucmFjZW4gPSBCSVQoMyksCisJLmNtZCAgID0gQklUKDQpLAorfTsKKworLyoKKyAqIE9uIE9NQVAzKywgYWxsIFZDIGNoYW5uZWxzIGhhdmUgdGhlIGFib3ZlIGRlZmF1bHQgYml0ZmllbGQKKyAqIGNvbmZpZ3VyYXRpb24sIGV4Y2VwdCB0aGUgT01BUDQgTVBVIGNoYW5uZWwuICBUaGlzIGFwcGVhcnMKKyAqIHRvIGJlIGEgZnJlYWsgYWNjaWRlbnQgYXMgZXZlcnkgb3RoZXIgVkMgY2hhbm5lbCBoYXMgdGhlCisgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIHRodXMgY3JlYXRpbmcgYSBtdXRhbnQgY2hhbm5lbCBjb25maWcuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF92Y19jaGFubmVsX2NmZyB2Y19tdXRhbnRfY2hhbm5lbF9jZmcgPSB7CisJLnNhICAgID0gQklUKDApLAorCS5yYXYgICA9IEJJVCgyKSwKKwkucmFjICAgPSBCSVQoMyksCisJLnJhY2VuID0gQklUKDQpLAorCS5jbWQgICA9IEJJVCgxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF92Y19jaGFubmVsX2NmZyAqdmNfY2ZnX2JpdHM7CisjZGVmaW5lIENGR19DSEFOTkVMX01BU0sgMHgxZgorCisvKioKKyAqIG9tYXBfdmNfY29uZmlnX2NoYW5uZWwgLSBjb25maWd1cmUgVkMgY2hhbm5lbCB0byBQTUlDIG1hcHBpbmdzCisgKiBAdm9sdGRtOiBwb2ludGVyIHRvIHZvbHRhZ2RvbWFpbiBkZWZpbmluZyB0aGUgZGVzaXJlZCBWQyBjaGFubmVsCisgKgorICogQ29uZmlndXJlcyB0aGUgVkMgY2hhbm5lbCB0byBQTUlDIG1hcHBpbmdzIGZvciB0aGUgZm9sbG93aW5nCisgKiBQTUlDIHNldHRpbmdzCisgKiAtIGkyYyBzbGF2ZSBhZGRyZXNzIChTQSkKKyAqIC0gdm9sdGFnZSBjb25maWd1cmF0aW9uIGFkZHJlc3MgKFJBVikKKyAqIC0gY29tbWFuZCBjb25maWd1cmF0aW9uIGFkZHJlc3MgKFJBQykgYW5kIGVuYWJsZSBiaXQgKFJBQ0VOKQorICogLSBjb21tYW5kIHZhbHVlcyBmb3IgT04sIE9OTFAsIFJFVCBhbmQgT0ZGIChDTUQpCisgKgorICogVGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgb25seSBhbGxvd3MgZmxleGlibGUgY29uZmlndXJhdGlvbiBvZiB0aGUKKyAqIG5vbi1kZWZhdWx0IGNoYW5uZWwuICBTdGFydGluZyB3aXRoIE9NQVA0LCB0aGVyZSBhcmUgbW9yZSB0aGFuIDIKKyAqIGNoYW5uZWxzLCB3aXRoIG9uZSBkZWZpbmVkIGFzIHRoZSBkZWZhdWx0IChvbiBPTUFQNCwgaXQncyBNUFUuKQorICogT25seSB0aGUgbm9uLWRlZmF1bHQgY2hhbm5lbCBjYW4gYmUgY29uZmlndXJlZC4KKyAqLworc3RhdGljIGludCBvbWFwX3ZjX2NvbmZpZ19jaGFubmVsKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCit7CisJc3RydWN0IG9tYXBfdmNfY2hhbm5lbCAqdmMgPSB2b2x0ZG0tPnZjOworCisJLyoKKwkgKiBGb3IgZGVmYXVsdCBjaGFubmVsLCB0aGUgb25seSBjb25maWd1cmFibGUgYml0IGlzIFJBQ0VOLgorCSAqIEFsbCBvdGhlcnMgbXVzdCBzdGF5IGF0IHplcm8gKHNlZSBmdW5jdGlvbiBjb21tZW50IGFib3ZlLikKKwkgKi8KKwlpZiAodmMtPmZsYWdzICYgT01BUF9WQ19DSEFOTkVMX0RFRkFVTFQpCisJCXZjLT5jZmdfY2hhbm5lbCAmPSB2Y19jZmdfYml0cy0+cmFjZW47CisKKwl2b2x0ZG0tPnJtdyhDRkdfQ0hBTk5FTF9NQVNLIDw8IHZjLT5jZmdfY2hhbm5lbF9zYV9zaGlmdCwKKwkJICAgIHZjLT5jZmdfY2hhbm5lbCA8PCB2Yy0+Y2ZnX2NoYW5uZWxfc2Ffc2hpZnQsCisJCSAgICB2Yy0+Y2ZnX2NoYW5uZWxfcmVnKTsKKworCXJldHVybiAwOworfQorCisvKiBWb2x0YWdlIHNjYWxlIGFuZCBhY2Nlc3NvcnkgQVBJcyAqLworaW50IG9tYXBfdmNfcHJlX3NjYWxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQsCisJCSAgICAgIHU4ICp0YXJnZXRfdnNlbCwgdTggKmN1cnJlbnRfdnNlbCkKK3sKKwlzdHJ1Y3Qgb21hcF92Y19jaGFubmVsICp2YyA9IHZvbHRkbS0+dmM7CisJdTMyIHZjX2NtZHZhbDsKKworCS8qIENoZWNrIGlmIHN1ZmZpY2llbnQgcG1pYyBpbmZvIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB2ZGQgKi8KKwlpZiAoIXZvbHRkbS0+cG1pYykgeworCQlwcl9lcnIoIiVzOiBJbnN1ZmZpY2llbnQgcG1pYyBpbmZvIHRvIHNjYWxlIHRoZSB2ZGRfJXNcbiIsCisJCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCF2b2x0ZG0tPnBtaWMtPnV2X3RvX3ZzZWwpIHsKKwkJcHJfZXJyKCIlczogUE1JQyBmdW5jdGlvbiB0byBjb252ZXJ0IHZvbHRhZ2UgaW4gdVYgdG8iCisJCQkidnNlbCBub3QgcmVnaXN0ZXJlZC4gSGVuY2UgdW5hYmxlIHRvIHNjYWxlIHZvbHRhZ2UiCisJCQkiZm9yIHZkZF8lc1xuIiwgX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisJCXJldHVybiAtRU5PREFUQTsKKwl9CisKKwlpZiAoIXZvbHRkbS0+cmVhZCB8fCAhdm9sdGRtLT53cml0ZSkgeworCQlwcl9lcnIoIiVzOiBObyByZWFkL3dyaXRlIEFQSSBmb3IgYWNjZXNzaW5nIHZkZF8lcyByZWdzXG4iLAorCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSp0YXJnZXRfdnNlbCA9IHZvbHRkbS0+cG1pYy0+dXZfdG9fdnNlbCh0YXJnZXRfdm9sdCk7CisJKmN1cnJlbnRfdnNlbCA9IHZvbHRkbS0+cG1pYy0+dXZfdG9fdnNlbCh2b2x0ZG0tPm5vbWluYWxfdm9sdCk7CisKKwkvKiBTZXR0aW5nIHRoZSBPTiB2b2x0YWdlIHRvIHRoZSBuZXcgdGFyZ2V0IHZvbHRhZ2UgKi8KKwl2Y19jbWR2YWwgPSB2b2x0ZG0tPnJlYWQodmMtPmNtZHZhbF9yZWcpOworCXZjX2NtZHZhbCAmPSB+dmMtPmNvbW1vbi0+Y21kX29uX21hc2s7CisJdmNfY21kdmFsIHw9ICgqdGFyZ2V0X3ZzZWwgPDwgdmMtPmNvbW1vbi0+Y21kX29uX3NoaWZ0KTsKKwl2b2x0ZG0tPndyaXRlKHZjX2NtZHZhbCwgdmMtPmNtZHZhbF9yZWcpOworCisJb21hcF92cF91cGRhdGVfZXJyb3JnYWluKHZvbHRkbSwgdGFyZ2V0X3ZvbHQpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21hcF92Y19wb3N0X3NjYWxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0LAorCQkJdTggdGFyZ2V0X3ZzZWwsIHU4IGN1cnJlbnRfdnNlbCkKK3sKKwl1MzIgc21wc19zdGVwcyA9IDAsIHNtcHNfZGVsYXkgPSAwOworCisJc21wc19zdGVwcyA9IGFicyh0YXJnZXRfdnNlbCAtIGN1cnJlbnRfdnNlbCk7CisJLyogU01QUyBzbGV3IHJhdGUgLyBzdGVwIHNpemUuIDJ1cyBhZGRlZCBhcyBidWZmZXIuICovCisJc21wc19kZWxheSA9ICgoc21wc19zdGVwcyAqIHZvbHRkbS0+cG1pYy0+c3RlcF9zaXplKSAvCisJCQl2b2x0ZG0tPnBtaWMtPnNsZXdfcmF0ZSkgKyAyOworCXVkZWxheShzbXBzX2RlbGF5KTsKK30KKworLyogdmNfYnlwYXNzX3NjYWxlIC0gVkMgYnlwYXNzIG1ldGhvZCBvZiB2b2x0YWdlIHNjYWxpbmcgKi8KK2ludCBvbWFwX3ZjX2J5cGFzc19zY2FsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkJIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpCit7CisJc3RydWN0IG9tYXBfdmNfY2hhbm5lbCAqdmMgPSB2b2x0ZG0tPnZjOworCXUzMiBsb29wX2NudCA9IDAsIHJldHJpZXNfY250ID0gMDsKKwl1MzIgdmNfdmFsaWQsIHZjX2J5cGFzc192YWxfcmVnLCB2Y19ieXBhc3NfdmFsdWU7CisJdTggdGFyZ2V0X3ZzZWwsIGN1cnJlbnRfdnNlbDsKKwlpbnQgcmV0OworCisJcmV0ID0gb21hcF92Y19wcmVfc2NhbGUodm9sdGRtLCB0YXJnZXRfdm9sdCwgJnRhcmdldF92c2VsLCAmY3VycmVudF92c2VsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdmNfdmFsaWQgPSB2Yy0+Y29tbW9uLT52YWxpZDsKKwl2Y19ieXBhc3NfdmFsX3JlZyA9IHZjLT5jb21tb24tPmJ5cGFzc192YWxfcmVnOworCXZjX2J5cGFzc192YWx1ZSA9ICh0YXJnZXRfdnNlbCA8PCB2Yy0+Y29tbW9uLT5kYXRhX3NoaWZ0KSB8CisJCSh2Yy0+dm9sdF9yZWdfYWRkciA8PCB2Yy0+Y29tbW9uLT5yZWdhZGRyX3NoaWZ0KSB8CisJCSh2Yy0+aTJjX3NsYXZlX2FkZHIgPDwgdmMtPmNvbW1vbi0+c2xhdmVhZGRyX3NoaWZ0KTsKKworCXZvbHRkbS0+d3JpdGUodmNfYnlwYXNzX3ZhbHVlLCB2Y19ieXBhc3NfdmFsX3JlZyk7CisJdm9sdGRtLT53cml0ZSh2Y19ieXBhc3NfdmFsdWUgfCB2Y192YWxpZCwgdmNfYnlwYXNzX3ZhbF9yZWcpOworCisJdmNfYnlwYXNzX3ZhbHVlID0gdm9sdGRtLT5yZWFkKHZjX2J5cGFzc192YWxfcmVnKTsKKwkvKgorCSAqIExvb3AgdGlsbCB0aGUgYnlwYXNzIGNvbW1hbmQgaXMgYWNrbm93bGVkZ2VkIGZyb20gdGhlIFNNUFMuCisJICogTk9URTogVGhpcyBpcyBsZWdhY3kgY29kZS4gVGhlIGxvb3AgY291bnQgYW5kIHJldHJ5IGNvdW50IG5lZWRzCisJICogdG8gYmUgcmV2aXNpdGVkLgorCSAqLworCXdoaWxlICghKHZjX2J5cGFzc192YWx1ZSAmIHZjX3ZhbGlkKSkgeworCQlsb29wX2NudCsrOworCisJCWlmIChyZXRyaWVzX2NudCA+IDEwKSB7CisJCQlwcl93YXJuaW5nKCIlczogUmV0cnkgY291bnQgZXhjZWVkZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJaWYgKGxvb3BfY250ID4gNTApIHsKKwkJCXJldHJpZXNfY250Kys7CisJCQlsb29wX2NudCA9IDA7CisJCQl1ZGVsYXkoMTApOworCQl9CisJCXZjX2J5cGFzc192YWx1ZSA9IHZvbHRkbS0+cmVhZCh2Y19ieXBhc3NfdmFsX3JlZyk7CisJfQorCisJb21hcF92Y19wb3N0X3NjYWxlKHZvbHRkbSwgdGFyZ2V0X3ZvbHQsIHRhcmdldF92c2VsLCBjdXJyZW50X3ZzZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfdmZzbV9pbml0KHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCit7CisJLyoKKwkgKiBWb2x0YWdlIE1hbmFnZXIgRlNNIHBhcmFtZXRlcnMgaW5pdAorCSAqIFhYWCBUaGlzIGRhdGEgc2hvdWxkIGJlIHBhc3NlZCBpbiBmcm9tIHRoZSBib2FyZCBmaWxlCisJICovCisJdm9sdGRtLT53cml0ZShPTUFQM19DTEtTRVRVUCwgT01BUDNfUFJNX0NMS1NFVFVQX09GRlNFVCk7CisJdm9sdGRtLT53cml0ZShPTUFQM19WT0xUT0ZGU0VULCBPTUFQM19QUk1fVk9MVE9GRlNFVF9PRkZTRVQpOworCXZvbHRkbS0+d3JpdGUoT01BUDNfVk9MVFNFVFVQMiwgT01BUDNfUFJNX1ZPTFRTRVRVUDJfT0ZGU0VUKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX3ZjX2luaXRfY2hhbm5lbChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQoreworCXN0YXRpYyBib29sIGlzX2luaXRpYWxpemVkOworCisJaWYgKGlzX2luaXRpYWxpemVkKQorCQlyZXR1cm47CisKKwlvbWFwM192ZnNtX2luaXQodm9sdGRtKTsKKworCWlzX2luaXRpYWxpemVkID0gdHJ1ZTsKK30KKworCisvKiBPTUFQNCBzcGVjaWZpYyB2b2x0YWdlIGluaXQgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDRfdmNfaW5pdF9jaGFubmVsKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCit7CisJc3RhdGljIGJvb2wgaXNfaW5pdGlhbGl6ZWQ7CisJdTMyIHZjX3ZhbDsKKworCWlmIChpc19pbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJLyogWFhYIFRoZXNlIGFyZSBtYWdpYyBudW1iZXJzIGFuZCBkbyBub3QgYmVsb25nISAqLworCXZjX3ZhbCA9ICgweDYwIDw8IE9NQVA0NDMwX1NDTExfU0hJRlQgfCAweDI2IDw8IE9NQVA0NDMwX1NDTEhfU0hJRlQpOworCXZvbHRkbS0+d3JpdGUodmNfdmFsLCBPTUFQNF9QUk1fVkNfQ0ZHX0kyQ19DTEtfT0ZGU0VUKTsKKworCWlzX2luaXRpYWxpemVkID0gdHJ1ZTsKK30KKworLyoqCisgKiBvbWFwX3ZjX2kyY19pbml0IC0gaW5pdGlhbGl6ZSBJMkMgaW50ZXJmYWNlIHRvIFBNSUMKKyAqIEB2b2x0ZG06IHZvbHRhZ2UgZG9tYWluIGNvbnRhaW5pbmcgVkMgZGF0YQorICoKKyAqIFVzZSBQTUlDIHN1cHBsaWVkIHNlZXRpbmdzIGZvciBJMkMgaGlnaC1zcGVlZCBtb2RlIGFuZAorICogbWFzdGVyIGNvZGUgKGlmIHNldCkgYW5kIHByb2dyYW0gdGhlIFZDIEkyQyBjb25maWd1cmF0aW9uCisgKiByZWdpc3Rlci4KKyAqCisgKiBUaGUgVkMgSTJDIGNvbmZpZ3VyYXRpb24gaXMgY29tbW9uIHRvIGFsbCBWQyBjaGFubmVscywKKyAqIHNvIHRoaXMgZnVuY3Rpb24gb25seSBjb25maWd1cmVzIEkyQyBmb3IgdGhlIGZpcnN0IFZDCisgKiBjaGFubmVsIHJlZ2lzdGVycy4gIEFsbCBvdGhlciBWQyBjaGFubmVscyB3aWxsIHVzZSB0aGUKKyAqIHNhbWUgY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfdmNfaTJjX2luaXQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3sKKwlzdHJ1Y3Qgb21hcF92Y19jaGFubmVsICp2YyA9IHZvbHRkbS0+dmM7CisJc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQ7CisJc3RhdGljIGJvb2wgaTJjX2hpZ2hfc3BlZWQ7CisJdTggbWNvZGU7CisKKwlpZiAoaW5pdGlhbGl6ZWQpIHsKKwkJaWYgKHZvbHRkbS0+cG1pYy0+aTJjX2hpZ2hfc3BlZWQgIT0gaTJjX2hpZ2hfc3BlZWQpCisJCQlwcl93YXJuKCIlczogSTJDIGNvbmZpZyBmb3IgYWxsIGNoYW5uZWxzIG11c3QgbWF0Y2guIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpMmNfaGlnaF9zcGVlZCA9IHZvbHRkbS0+cG1pYy0+aTJjX2hpZ2hfc3BlZWQ7CisJaWYgKGkyY19oaWdoX3NwZWVkKQorCQl2b2x0ZG0tPnJtdyh2Yy0+Y29tbW9uLT5pMmNfY2ZnX2hzZW5fbWFzaywKKwkJCSAgICB2Yy0+Y29tbW9uLT5pMmNfY2ZnX2hzZW5fbWFzaywKKwkJCSAgICB2Yy0+Y29tbW9uLT5pMmNfY2ZnX3JlZyk7CisKKwltY29kZSA9IHZvbHRkbS0+cG1pYy0+aTJjX21jb2RlOworCWlmIChtY29kZSkKKwkJdm9sdGRtLT5ybXcodmMtPmNvbW1vbi0+aTJjX21jb2RlX21hc2ssCisJCQkgICAgbWNvZGUgPDwgX19mZnModmMtPmNvbW1vbi0+aTJjX21jb2RlX21hc2spLAorCQkJICAgIHZjLT5jb21tb24tPmkyY19jZmdfcmVnKTsKKworCWluaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordm9pZCBfX2luaXQgb21hcF92Y19pbml0X2NoYW5uZWwoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3sKKwlzdHJ1Y3Qgb21hcF92Y19jaGFubmVsICp2YyA9IHZvbHRkbS0+dmM7CisJdTggb25fdnNlbCwgb25scF92c2VsLCByZXRfdnNlbCwgb2ZmX3ZzZWw7CisJdTMyIHZhbDsKKworCWlmICghdm9sdGRtLT5wbWljIHx8ICF2b2x0ZG0tPnBtaWMtPnV2X3RvX3ZzZWwpIHsKKwkJcHJfZXJyKCIlczogUE1JQyBpbmZvIHJlcXVyaWVkIHRvIGNvbmZpZ3VyZSB2YyBmb3IiCisJCQkidmRkXyVzIG5vdCBwb3B1bGF0ZWQuSGVuY2UgY2Fubm90IGluaXRpYWxpemUgdmNcbiIsCisJCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghdm9sdGRtLT5yZWFkIHx8ICF2b2x0ZG0tPndyaXRlKSB7CisJCXByX2VycigiJXM6IE5vIHJlYWQvd3JpdGUgQVBJIGZvciBhY2Nlc3NpbmcgdmRkXyVzIHJlZ3NcbiIsCisJCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXZjLT5jZmdfY2hhbm5lbCA9IDA7CisJaWYgKHZjLT5mbGFncyAmIE9NQVBfVkNfQ0hBTk5FTF9DRkdfTVVUQU5UKQorCQl2Y19jZmdfYml0cyA9ICZ2Y19tdXRhbnRfY2hhbm5lbF9jZmc7CisJZWxzZQorCQl2Y19jZmdfYml0cyA9ICZ2Y19kZWZhdWx0X2NoYW5uZWxfY2ZnOworCisJLyogZ2V0IFBNSUMvYm9hcmQgc3BlY2lmaWMgc2V0dGluZ3MgKi8KKwl2Yy0+aTJjX3NsYXZlX2FkZHIgPSB2b2x0ZG0tPnBtaWMtPmkyY19zbGF2ZV9hZGRyOworCXZjLT52b2x0X3JlZ19hZGRyID0gdm9sdGRtLT5wbWljLT52b2x0X3JlZ19hZGRyOworCXZjLT5jbWRfcmVnX2FkZHIgPSB2b2x0ZG0tPnBtaWMtPmNtZF9yZWdfYWRkcjsKKwl2Yy0+c2V0dXBfdGltZSA9IHZvbHRkbS0+cG1pYy0+dm9sdF9zZXR1cF90aW1lOworCisJLyogQ29uZmlndXJlIHRoZSBpMmMgc2xhdmUgYWRkcmVzcyBmb3IgdGhpcyBWQyAqLworCXZvbHRkbS0+cm13KHZjLT5zbXBzX3NhX21hc2ssCisJCSAgICB2Yy0+aTJjX3NsYXZlX2FkZHIgPDwgX19mZnModmMtPnNtcHNfc2FfbWFzayksCisJCSAgICB2Yy0+c21wc19zYV9yZWcpOworCXZjLT5jZmdfY2hhbm5lbCB8PSB2Y19jZmdfYml0cy0+c2E7CisKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgUE1JQyByZWdpc3RlciBhZGRyZXNzZXMuCisJICovCisJdm9sdGRtLT5ybXcodmMtPnNtcHNfdm9scmFfbWFzaywKKwkJICAgIHZjLT52b2x0X3JlZ19hZGRyIDw8IF9fZmZzKHZjLT5zbXBzX3ZvbHJhX21hc2spLAorCQkgICAgdmMtPnNtcHNfdm9scmFfcmVnKTsKKwl2Yy0+Y2ZnX2NoYW5uZWwgfD0gdmNfY2ZnX2JpdHMtPnJhdjsKKworCWlmICh2Yy0+Y21kX3JlZ19hZGRyKSB7CisJCXZvbHRkbS0+cm13KHZjLT5zbXBzX2NtZHJhX21hc2ssCisJCQkgICAgdmMtPmNtZF9yZWdfYWRkciA8PCBfX2Zmcyh2Yy0+c21wc19jbWRyYV9tYXNrKSwKKwkJCSAgICB2Yy0+c21wc19jbWRyYV9yZWcpOworCQl2Yy0+Y2ZnX2NoYW5uZWwgfD0gdmNfY2ZnX2JpdHMtPnJhYyB8IHZjX2NmZ19iaXRzLT5yYWNlbjsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIG9uLCBpbmFjdGl2ZSwgcmV0ZW50aW9uIGFuZCBvZmYgdm9sdGFnZSAqLworCW9uX3ZzZWwgPSB2b2x0ZG0tPnBtaWMtPnV2X3RvX3ZzZWwodm9sdGRtLT5wbWljLT5vbl92b2x0KTsKKwlvbmxwX3ZzZWwgPSB2b2x0ZG0tPnBtaWMtPnV2X3RvX3ZzZWwodm9sdGRtLT5wbWljLT5vbmxwX3ZvbHQpOworCXJldF92c2VsID0gdm9sdGRtLT5wbWljLT51dl90b192c2VsKHZvbHRkbS0+cG1pYy0+cmV0X3ZvbHQpOworCW9mZl92c2VsID0gdm9sdGRtLT5wbWljLT51dl90b192c2VsKHZvbHRkbS0+cG1pYy0+b2ZmX3ZvbHQpOworCXZhbCA9ICgob25fdnNlbCA8PCB2Yy0+Y29tbW9uLT5jbWRfb25fc2hpZnQpIHwKKwkgICAgICAgKG9ubHBfdnNlbCA8PCB2Yy0+Y29tbW9uLT5jbWRfb25scF9zaGlmdCkgfAorCSAgICAgICAocmV0X3ZzZWwgPDwgdmMtPmNvbW1vbi0+Y21kX3JldF9zaGlmdCkgfAorCSAgICAgICAob2ZmX3ZzZWwgPDwgdmMtPmNvbW1vbi0+Y21kX29mZl9zaGlmdCkpOworCXZvbHRkbS0+d3JpdGUodmFsLCB2Yy0+Y21kdmFsX3JlZyk7CisJdmMtPmNmZ19jaGFubmVsIHw9IHZjX2NmZ19iaXRzLT5jbWQ7CisKKwkvKiBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKwlvbWFwX3ZjX2NvbmZpZ19jaGFubmVsKHZvbHRkbSk7CisKKwkvKiBDb25maWd1cmUgdGhlIHNldHVwIHRpbWVzICovCisJdm9sdGRtLT5ybXcodm9sdGRtLT52ZnNtLT52b2x0c2V0dXBfbWFzaywKKwkJICAgIHZjLT5zZXR1cF90aW1lIDw8IF9fZmZzKHZvbHRkbS0+dmZzbS0+dm9sdHNldHVwX21hc2spLAorCQkgICAgdm9sdGRtLT52ZnNtLT52b2x0c2V0dXBfcmVnKTsKKworCW9tYXBfdmNfaTJjX2luaXQodm9sdGRtKTsKKworCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKKwkJb21hcDNfdmNfaW5pdF9jaGFubmVsKHZvbHRkbSk7CisJZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpCisJCW9tYXA0X3ZjX2luaXRfY2hhbm5lbCh2b2x0ZG0pOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjLmgKaW5kZXggZTc3Njc3Ny4uNDc4YmY2YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdmMuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjLmgKQEAgLTE5LDEyICsxOSwxMiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKK3N0cnVjdCB2b2x0YWdlZG9tYWluOworCiAvKioKLSAqIHN0cnVjdCBvbWFwX3ZjX2NvbW1vbl9kYXRhIC0gcGVyLVZDIHJlZ2lzdGVyL2JpdGZpZWxkIGRhdGEKKyAqIHN0cnVjdCBvbWFwX3ZjX2NvbW1vbiAtIHBlci1WQyByZWdpc3Rlci9iaXRmaWVsZCBkYXRhCiAgKiBAY21kX29uX21hc2s6IE9OIGJpdG1hc2sgaW4gUFJNX1ZDX0NNRF9WQUwqIHJlZ2lzdGVyCiAgKiBAdmFsaWQ6IFZBTElEIGJpdG1hc2sgaW4gUFJNX1ZDX0JZUEFTU19WQUwgcmVnaXN0ZXIKLSAqIEBzbXBzX3NhX3JlZzogT2Zmc2V0IG9mIFBSTV9WQ19TTVBTX1NBIHJlZyBmcm9tIFBSTSBzdGFydAotICogQHNtcHNfdm9scmFfcmVnOiBPZmZzZXQgb2YgUFJNX1ZDX1NNUFNfVk9MX1JBIHJlZyBmcm9tIFBSTSBzdGFydAogICogQGJ5cGFzc192YWxfcmVnOiBPZmZzZXQgb2YgUFJNX1ZDX0JZUEFTU19WQUwgcmVnIGZyb20gUFJNIHN0YXJ0CiAgKiBAZGF0YV9zaGlmdDogREFUQSBmaWVsZCBzaGlmdCBpbiBQUk1fVkNfQllQQVNTX1ZBTCByZWdpc3RlcgogICogQHNsYXZlYWRkcl9zaGlmdDogU0xBVkVBRERSIGZpZWxkIHNoaWZ0IGluIFBSTV9WQ19CWVBBU1NfVkFMIHJlZ2lzdGVyCkBAIC0zMywxNSArMzMsMTYgQEAKICAqIEBjbWRfb25scF9zaGlmdDogT05MUCBmaWVsZCBzaGlmdCBpbiBQUk1fVkNfQ01EX1ZBTF8qIHJlZ2lzdGVyCiAgKiBAY21kX3JldF9zaGlmdDogUkVUIGZpZWxkIHNoaWZ0IGluIFBSTV9WQ19DTURfVkFMXyogcmVnaXN0ZXIKICAqIEBjbWRfb2ZmX3NoaWZ0OiBPRkYgZmllbGQgc2hpZnQgaW4gUFJNX1ZDX0NNRF9WQUxfKiByZWdpc3RlcgorICogQGkyY19jZmdfcmVnOiBJMkMgY29uZmlndXJhdGlvbiByZWdpc3RlciBvZmZzZXQKKyAqIEBpMmNfY2ZnX2hzZW5fbWFzazogaGlnaC1zcGVlZCBtb2RlIGJpdCBmaWVsZCBtYXNrIGluIEkyQyBjb25maWcgcmVnaXN0ZXIKKyAqIEBpMmNfbWNvZGVfbWFzazogTUNPREUgZmllbGQgbWFzayBmb3IgSTJDIGNvbmZpZyByZWdpc3RlcgogICoKICAqIFhYWCBPbmUgb2YgY21kX29uX21hc2sgYW5kIGNtZF9vbl9zaGlmdCBhcmUgbm90IG5lZWRlZAogICogWFhYIFZBTElEIHNob3VsZCBwcm9iYWJseSBiZSBhIHNoaWZ0LCBub3QgYSBtYXNrCiAgKi8KLXN0cnVjdCBvbWFwX3ZjX2NvbW1vbl9kYXRhIHsKK3N0cnVjdCBvbWFwX3ZjX2NvbW1vbiB7CiAJdTMyIGNtZF9vbl9tYXNrOwogCXUzMiB2YWxpZDsKLQl1OCBzbXBzX3NhX3JlZzsKLQl1OCBzbXBzX3ZvbHJhX3JlZzsKIAl1OCBieXBhc3NfdmFsX3JlZzsKIAl1OCBkYXRhX3NoaWZ0OwogCXU4IHNsYXZlYWRkcl9zaGlmdDsKQEAgLTUwLDM0ICs1MSw3NSBAQAogCXU4IGNtZF9vbmxwX3NoaWZ0OwogCXU4IGNtZF9yZXRfc2hpZnQ7CiAJdTggY21kX29mZl9zaGlmdDsKKwl1OCBpMmNfY2ZnX3JlZzsKKwl1OCBpMmNfY2ZnX2hzZW5fbWFzazsKKwl1OCBpMmNfbWNvZGVfbWFzazsKIH07CiAKKy8qIG9tYXBfdmNfY2hhbm5lbC5mbGFncyB2YWx1ZXMgKi8KKyNkZWZpbmUgT01BUF9WQ19DSEFOTkVMX0RFRkFVTFQgQklUKDApCisjZGVmaW5lIE9NQVBfVkNfQ0hBTk5FTF9DRkdfTVVUQU5UIEJJVCgxKQorCiAvKioKLSAqIHN0cnVjdCBvbWFwX3ZjX2luc3RhbmNlX2RhdGEgLSBWQyBwZXItaW5zdGFuY2UgZGF0YQotICogQHZjX2NvbW1vbjogcG9pbnRlciB0byBWQyBjb21tb24gZGF0YSBmb3IgdGhpcyBwbGF0Zm9ybQotICogQHNtcHNfc2FfbWFzazogU0EqIGJpdG1hc2sgaW4gdGhlIFBSTV9WQ19TTVBTX1NBIHJlZ2lzdGVyCi0gKiBAc21wc192b2xyYV9tYXNrOiBWT0xSQSogYml0bWFzayBpbiB0aGUgUFJNX1ZDX1ZPTF9SQSByZWdpc3RlcgotICogQHNtcHNfc2Ffc2hpZnQ6IFNBKiBmaWVsZCBzaGlmdCBpbiB0aGUgUFJNX1ZDX1NNUFNfU0EgcmVnaXN0ZXIKLSAqIEBzbXBzX3ZvbHJhX3NoaWZ0OiBWT0xSQSogZmllbGQgc2hpZnQgaW4gdGhlIFBSTV9WQ19WT0xfUkEgcmVnaXN0ZXIKKyAqIHN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgLSBWQyBwZXItaW5zdGFuY2UgZGF0YQorICogQGkyY19zbGF2ZV9hZGRyOiBJMkMgc2xhdmUgYWRkcmVzcyBvZiBQTUlDIGZvciB0aGlzIFZDIGNoYW5uZWwKKyAqIEB2b2x0X3JlZ19hZGRyOiB2b2x0YWdlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYWRkcmVzcworICogQGNtZF9yZWdfYWRkcjogY29tbWFuZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBzZXR1cF90aW1lOiBzZXR1cCB0aW1lIChpbiBzeXNfY2xrIGN5Y2xlcykgb2YgcmVndWxhdG9yIGZvciB0aGlzIGNoYW5uZWwKKyAqIEBjZmdfY2hhbm5lbDogY3VycmVudCB2YWx1ZSBvZiBWQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAqIEBpMmNfaGlnaF9zcGVlZDogd2hldGhlciBvciBub3QgdG8gdXNlIEkyQyBoaWdoLXNwZWVkIG1vZGUKICAqCi0gKiBYWFggSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBoYXZlIGJvdGggYSAqX21hc2sgYW5kIGEgKl9zaGlmdCAtCi0gKiAgICAgcmVtb3ZlIG9uZQorICogQGNvbW1vbjogcG9pbnRlciB0byBWQyBjb21tb24gZGF0YSBmb3IgdGhpcyBwbGF0Zm9ybQorICogQHNtcHNfc2FfbWFzazogaTJjIHNsYXZlIGFkZHJlc3MgYml0bWFzayBpbiB0aGUgUFJNX1ZDX1NNUFNfU0EgcmVnaXN0ZXIKKyAqIEBzbXBzX3ZvbHJhX21hc2s6IFZPTFJBKiBiaXRtYXNrIGluIHRoZSBQUk1fVkNfVk9MX1JBIHJlZ2lzdGVyCisgKiBAc21wc19jbWRyYV9tYXNrOiBDTURSQSogYml0bWFzayBpbiB0aGUgUFJNX1ZDX0NNRF9SQSByZWdpc3RlcgorICogQGNtZHZhbF9yZWc6IHJlZ2lzdGVyIGZvciBvbi9yZXQvb2ZmIHZvbHRhZ2UgbGV2ZWwgdmFsdWVzIGZvciB0aGlzIGNoYW5uZWwKKyAqIEBzbXBzX3NhX3JlZzogT2Zmc2V0IG9mIFBSTV9WQ19TTVBTX1NBIHJlZyBmcm9tIFBSTSBzdGFydAorICogQHNtcHNfdm9scmFfcmVnOiBPZmZzZXQgb2YgUFJNX1ZDX1NNUFNfVk9MX1JBIHJlZyBmcm9tIFBSTSBzdGFydAorICogQHNtcHNfY21kcmFfcmVnOiBPZmZzZXQgb2YgUFJNX1ZDX1NNUFNfQ01EX1JBIHJlZyBmcm9tIFBSTSBzdGFydAorICogQGNmZ19jaGFubmVsX3JlZzogVkMgY2hhbm5lbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKiBAY2ZnX2NoYW5uZWxfc2Ffc2hpZnQ6IGJpdCBzaGlmdCBmb3Igc2xhdmUgYWRkcmVzcyBjZmdfY2hhbm5lbCByZWdpc3RlcgorICogQGZsYWdzOiBWQyBjaGFubmVsLXNwZWNpZmljIGZsYWdzIChvcHRpb25hbCkKICAqLwotc3RydWN0IG9tYXBfdmNfaW5zdGFuY2VfZGF0YSB7Ci0JY29uc3Qgc3RydWN0IG9tYXBfdmNfY29tbW9uX2RhdGEgKnZjX2NvbW1vbjsKK3N0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgeworCS8qIGNoYW5uZWwgc3RhdGUgKi8KKwl1MTYgaTJjX3NsYXZlX2FkZHI7CisJdTE2IHZvbHRfcmVnX2FkZHI7CisJdTE2IGNtZF9yZWdfYWRkcjsKKwl1MTYgc2V0dXBfdGltZTsKKwl1OCBjZmdfY2hhbm5lbDsKKwlib29sIGkyY19oaWdoX3NwZWVkOworCisJLyogcmVnaXN0ZXIgYWNjZXNzIGRhdGEgKi8KKwljb25zdCBzdHJ1Y3Qgb21hcF92Y19jb21tb24gKmNvbW1vbjsKIAl1MzIgc21wc19zYV9tYXNrOwogCXUzMiBzbXBzX3ZvbHJhX21hc2s7CisJdTMyIHNtcHNfY21kcmFfbWFzazsKIAl1OCBjbWR2YWxfcmVnOwotCXU4IHNtcHNfc2Ffc2hpZnQ7Ci0JdTggc21wc192b2xyYV9zaGlmdDsKKwl1OCBzbXBzX3NhX3JlZzsKKwl1OCBzbXBzX3ZvbHJhX3JlZzsKKwl1OCBzbXBzX2NtZHJhX3JlZzsKKwl1OCBjZmdfY2hhbm5lbF9yZWc7CisJdTggY2ZnX2NoYW5uZWxfc2Ffc2hpZnQ7CisJdTggZmxhZ3M7CiB9OwogCi1leHRlcm4gc3RydWN0IG9tYXBfdmNfaW5zdGFuY2VfZGF0YSBvbWFwM192YzFfZGF0YTsKLWV4dGVybiBzdHJ1Y3Qgb21hcF92Y19pbnN0YW5jZV9kYXRhIG9tYXAzX3ZjMl9kYXRhOworZXh0ZXJuIHN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgb21hcDNfdmNfbXB1OworZXh0ZXJuIHN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgb21hcDNfdmNfY29yZTsKIAotZXh0ZXJuIHN0cnVjdCBvbWFwX3ZjX2luc3RhbmNlX2RhdGEgb21hcDRfdmNfbXB1X2RhdGE7Ci1leHRlcm4gc3RydWN0IG9tYXBfdmNfaW5zdGFuY2VfZGF0YSBvbWFwNF92Y19pdmFfZGF0YTsKLWV4dGVybiBzdHJ1Y3Qgb21hcF92Y19pbnN0YW5jZV9kYXRhIG9tYXA0X3ZjX2NvcmVfZGF0YTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF92Y19jaGFubmVsIG9tYXA0X3ZjX21wdTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF92Y19jaGFubmVsIG9tYXA0X3ZjX2l2YTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF92Y19jaGFubmVsIG9tYXA0X3ZjX2NvcmU7CisKK3ZvaWQgb21hcF92Y19pbml0X2NoYW5uZWwoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSk7CitpbnQgb21hcF92Y19wcmVfc2NhbGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCwKKwkJICAgICAgdTggKnRhcmdldF92c2VsLCB1OCAqY3VycmVudF92c2VsKTsKK3ZvaWQgb21hcF92Y19wb3N0X3NjYWxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0LAorCQkJdTggdGFyZ2V0X3ZzZWwsIHU4IGN1cnJlbnRfdnNlbCk7CitpbnQgb21hcF92Y19ieXBhc3Nfc2NhbGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKKwkJCSB1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdmMzeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdmMzeHh4X2RhdGEuYwppbmRleCBmMzdkYzRiLi5jZmUzNDhlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92YzN4eHhfZGF0YS5jCkBAIC0yOSw5ICsyOSw3IEBACiAgKiBWQyBkYXRhIGNvbW1vbiB0byAzNHh4LzM2eHggY2hpcHMKICAqIFhYWCBUaGlzIHN0dWZmIHByZXN1bWFibHkgYmVsb25ncyBpbiB0aGUgdmMzeHh4LmMgb3IgdmMuYyBmaWxlLgogICovCi1zdGF0aWMgc3RydWN0IG9tYXBfdmNfY29tbW9uX2RhdGEgb21hcDNfdmNfY29tbW9uID0gewotCS5zbXBzX3NhX3JlZwkgPSBPTUFQM19QUk1fVkNfU01QU19TQV9PRkZTRVQsCi0JLnNtcHNfdm9scmFfcmVnCSA9IE9NQVAzX1BSTV9WQ19TTVBTX1ZPTF9SQV9PRkZTRVQsCitzdGF0aWMgc3RydWN0IG9tYXBfdmNfY29tbW9uIG9tYXAzX3ZjX2NvbW1vbiA9IHsKIAkuYnlwYXNzX3ZhbF9yZWcJID0gT01BUDNfUFJNX1ZDX0JZUEFTU19WQUxfT0ZGU0VULAogCS5kYXRhX3NoaWZ0CSA9IE9NQVAzNDMwX0RBVEFfU0hJRlQsCiAJLnNsYXZlYWRkcl9zaGlmdCA9IE9NQVAzNDMwX1NMQVZFQUREUl9TSElGVCwKQEAgLTQyLDIyICs0MCwzMyBAQAogCS5jbWRfb25scF9zaGlmdAkgPSBPTUFQMzQzMF9WQ19DTURfT05MUF9TSElGVCwKIAkuY21kX3JldF9zaGlmdAkgPSBPTUFQMzQzMF9WQ19DTURfUkVUX1NISUZULAogCS5jbWRfb2ZmX3NoaWZ0CSA9IE9NQVAzNDMwX1ZDX0NNRF9PRkZfU0hJRlQsCisJLmkyY19jZmdfaHNlbl9tYXNrID0gT01BUDM0MzBfSFNFTl9NQVNLLAorCS5pMmNfY2ZnX3JlZwkgPSBPTUFQM19QUk1fVkNfSTJDX0NGR19PRkZTRVQsCisJLmkyY19tY29kZV9tYXNrCSA9IE9NQVAzNDMwX01DT0RFX01BU0ssCiB9OwogCi1zdHJ1Y3Qgb21hcF92Y19pbnN0YW5jZV9kYXRhIG9tYXAzX3ZjMV9kYXRhID0gewotCS52Y19jb21tb24gPSAmb21hcDNfdmNfY29tbW9uLAorc3RydWN0IG9tYXBfdmNfY2hhbm5lbCBvbWFwM192Y19tcHUgPSB7CisJLmNvbW1vbiA9ICZvbWFwM192Y19jb21tb24sCisJLnNtcHNfc2FfcmVnCSA9IE9NQVAzX1BSTV9WQ19TTVBTX1NBX09GRlNFVCwKKwkuc21wc192b2xyYV9yZWcJID0gT01BUDNfUFJNX1ZDX1NNUFNfVk9MX1JBX09GRlNFVCwKKwkuc21wc19jbWRyYV9yZWcJID0gT01BUDNfUFJNX1ZDX1NNUFNfQ01EX1JBX09GRlNFVCwKKwkuY2ZnX2NoYW5uZWxfcmVnID0gT01BUDNfUFJNX1ZDX0NIX0NPTkZfT0ZGU0VULAogCS5jbWR2YWxfcmVnID0gT01BUDNfUFJNX1ZDX0NNRF9WQUxfMF9PRkZTRVQsCi0JLnNtcHNfc2Ffc2hpZnQgPSBPTUFQMzQzMF9QUk1fVkNfU01QU19TQV9TQTBfU0hJRlQsCiAJLnNtcHNfc2FfbWFzayA9IE9NQVAzNDMwX1BSTV9WQ19TTVBTX1NBX1NBMF9NQVNLLAotCS5zbXBzX3ZvbHJhX3NoaWZ0ID0gT01BUDM0MzBfVk9MUkEwX1NISUZULAogCS5zbXBzX3ZvbHJhX21hc2sgPSBPTUFQMzQzMF9WT0xSQTBfTUFTSywKKwkuc21wc19jbWRyYV9tYXNrID0gT01BUDM0MzBfQ01EUkEwX01BU0ssCisJLmNmZ19jaGFubmVsX3NhX3NoaWZ0ID0gT01BUDM0MzBfUFJNX1ZDX1NNUFNfU0FfU0EwX1NISUZULAogfTsKIAotc3RydWN0IG9tYXBfdmNfaW5zdGFuY2VfZGF0YSBvbWFwM192YzJfZGF0YSA9IHsKLQkudmNfY29tbW9uID0gJm9tYXAzX3ZjX2NvbW1vbiwKK3N0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgb21hcDNfdmNfY29yZSA9IHsKKwkuY29tbW9uID0gJm9tYXAzX3ZjX2NvbW1vbiwKKwkuc21wc19zYV9yZWcJID0gT01BUDNfUFJNX1ZDX1NNUFNfU0FfT0ZGU0VULAorCS5zbXBzX3ZvbHJhX3JlZwkgPSBPTUFQM19QUk1fVkNfU01QU19WT0xfUkFfT0ZGU0VULAorCS5zbXBzX2NtZHJhX3JlZwkgPSBPTUFQM19QUk1fVkNfU01QU19DTURfUkFfT0ZGU0VULAorCS5jZmdfY2hhbm5lbF9yZWcgPSBPTUFQM19QUk1fVkNfQ0hfQ09ORl9PRkZTRVQsCiAJLmNtZHZhbF9yZWcgPSBPTUFQM19QUk1fVkNfQ01EX1ZBTF8xX09GRlNFVCwKLQkuc21wc19zYV9zaGlmdCA9IE9NQVAzNDMwX1BSTV9WQ19TTVBTX1NBX1NBMV9TSElGVCwKIAkuc21wc19zYV9tYXNrID0gT01BUDM0MzBfUFJNX1ZDX1NNUFNfU0FfU0ExX01BU0ssCi0JLnNtcHNfdm9scmFfc2hpZnQgPSBPTUFQMzQzMF9WT0xSQTFfU0hJRlQsCiAJLnNtcHNfdm9scmFfbWFzayA9IE9NQVAzNDMwX1ZPTFJBMV9NQVNLLAorCS5zbXBzX2NtZHJhX21hc2sgPSBPTUFQMzQzMF9DTURSQTFfTUFTSywKKwkuY2ZnX2NoYW5uZWxfc2Ffc2hpZnQgPSBPTUFQMzQzMF9QUk1fVkNfU01QU19TQV9TQTFfU0hJRlQsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92YzQ0eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92YzQ0eHhfZGF0YS5jCmluZGV4IGE5OGRhOGQuLjI3NDBhOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdmM0NHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjNDR4eF9kYXRhLmMKQEAgLTMwLDkgKzMwLDcgQEAKICAqIFZDIGRhdGEgY29tbW9uIHRvIDQ0eHggY2hpcHMKICAqIFhYWCBUaGlzIHN0dWZmIHByZXN1bWFibHkgYmVsb25ncyBpbiB0aGUgdmMzeHh4LmMgb3IgdmMuYyBmaWxlLgogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdmNfY29tbW9uX2RhdGEgb21hcDRfdmNfY29tbW9uID0gewotCS5zbXBzX3NhX3JlZyA9IE9NQVA0X1BSTV9WQ19TTVBTX1NBX09GRlNFVCwKLQkuc21wc192b2xyYV9yZWcgPSBPTUFQNF9QUk1fVkNfVkFMX1NNUFNfUkFfVk9MX09GRlNFVCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92Y19jb21tb24gb21hcDRfdmNfY29tbW9uID0gewogCS5ieXBhc3NfdmFsX3JlZyA9IE9NQVA0X1BSTV9WQ19WQUxfQllQQVNTX09GRlNFVCwKIAkuZGF0YV9zaGlmdCA9IE9NQVA0NDMwX0RBVEFfU0hJRlQsCiAJLnNsYXZlYWRkcl9zaGlmdCA9IE9NQVA0NDMwX1NMQVZFQUREUl9TSElGVCwKQEAgLTQzLDMzICs0MSw0OSBAQAogCS5jbWRfb25scF9zaGlmdCA9IE9NQVA0NDMwX09OTFBfU0hJRlQsCiAJLmNtZF9yZXRfc2hpZnQgPSBPTUFQNDQzMF9SRVRfU0hJRlQsCiAJLmNtZF9vZmZfc2hpZnQgPSBPTUFQNDQzMF9PRkZfU0hJRlQsCisJLmkyY19jZmdfcmVnID0gT01BUDRfUFJNX1ZDX0NGR19JMkNfTU9ERV9PRkZTRVQsCisJLmkyY19jZmdfaHNlbl9tYXNrID0gT01BUDQ0MzBfSFNNT0RFRU5fTUFTSywKKwkuaTJjX21jb2RlX21hc2sJID0gT01BUDQ0MzBfSFNNQ09ERV9NQVNLLAogfTsKIAogLyogVkMgaW5zdGFuY2UgZGF0YSBmb3IgZWFjaCBjb250cm9sbGFibGUgdm9sdGFnZSBsaW5lICovCi1zdHJ1Y3Qgb21hcF92Y19pbnN0YW5jZV9kYXRhIG9tYXA0X3ZjX21wdV9kYXRhID0gewotCS52Y19jb21tb24gPSAmb21hcDRfdmNfY29tbW9uLAorc3RydWN0IG9tYXBfdmNfY2hhbm5lbCBvbWFwNF92Y19tcHUgPSB7CisJLmZsYWdzID0gT01BUF9WQ19DSEFOTkVMX0RFRkFVTFQgfCBPTUFQX1ZDX0NIQU5ORUxfQ0ZHX01VVEFOVCwKKwkuY29tbW9uID0gJm9tYXA0X3ZjX2NvbW1vbiwKKwkuc21wc19zYV9yZWcgPSBPTUFQNF9QUk1fVkNfU01QU19TQV9PRkZTRVQsCisJLnNtcHNfdm9scmFfcmVnID0gT01BUDRfUFJNX1ZDX1ZBTF9TTVBTX1JBX1ZPTF9PRkZTRVQsCisJLnNtcHNfY21kcmFfcmVnID0gT01BUDRfUFJNX1ZDX1ZBTF9TTVBTX1JBX0NNRF9PRkZTRVQsCisJLmNmZ19jaGFubmVsX3JlZyA9IE9NQVA0X1BSTV9WQ19DRkdfQ0hBTk5FTF9PRkZTRVQsCiAJLmNtZHZhbF9yZWcgPSBPTUFQNF9QUk1fVkNfVkFMX0NNRF9WRERfTVBVX0xfT0ZGU0VULAotCS5zbXBzX3NhX3NoaWZ0ID0gT01BUDQ0MzBfU0FfVkREX01QVV9MX1BSTV9WQ19TTVBTX1NBX1NISUZULAogCS5zbXBzX3NhX21hc2sgPSBPTUFQNDQzMF9TQV9WRERfTVBVX0xfUFJNX1ZDX1NNUFNfU0FfTUFTSywKLQkuc21wc192b2xyYV9zaGlmdCA9IE9NQVA0NDMwX1ZPTFJBX1ZERF9NUFVfTF9TSElGVCwKIAkuc21wc192b2xyYV9tYXNrID0gT01BUDQ0MzBfVk9MUkFfVkREX01QVV9MX01BU0ssCisJLnNtcHNfY21kcmFfbWFzayA9IE9NQVA0NDMwX0NNRFJBX1ZERF9NUFVfTF9NQVNLLAorCS5jZmdfY2hhbm5lbF9zYV9zaGlmdCA9IE9NQVA0NDMwX1NBX1ZERF9NUFVfTF9TSElGVCwKIH07CiAKLXN0cnVjdCBvbWFwX3ZjX2luc3RhbmNlX2RhdGEgb21hcDRfdmNfaXZhX2RhdGEgPSB7Ci0JLnZjX2NvbW1vbiA9ICZvbWFwNF92Y19jb21tb24sCitzdHJ1Y3Qgb21hcF92Y19jaGFubmVsIG9tYXA0X3ZjX2l2YSA9IHsKKwkuY29tbW9uID0gJm9tYXA0X3ZjX2NvbW1vbiwKKwkuc21wc19zYV9yZWcgPSBPTUFQNF9QUk1fVkNfU01QU19TQV9PRkZTRVQsCisJLnNtcHNfdm9scmFfcmVnID0gT01BUDRfUFJNX1ZDX1ZBTF9TTVBTX1JBX1ZPTF9PRkZTRVQsCisJLnNtcHNfY21kcmFfcmVnID0gT01BUDRfUFJNX1ZDX1ZBTF9TTVBTX1JBX0NNRF9PRkZTRVQsCisJLmNmZ19jaGFubmVsX3JlZyA9IE9NQVA0X1BSTV9WQ19DRkdfQ0hBTk5FTF9PRkZTRVQsCiAJLmNtZHZhbF9yZWcgPSBPTUFQNF9QUk1fVkNfVkFMX0NNRF9WRERfSVZBX0xfT0ZGU0VULAotCS5zbXBzX3NhX3NoaWZ0ID0gT01BUDQ0MzBfU0FfVkREX0lWQV9MX1BSTV9WQ19TTVBTX1NBX1NISUZULAogCS5zbXBzX3NhX21hc2sgPSBPTUFQNDQzMF9TQV9WRERfSVZBX0xfUFJNX1ZDX1NNUFNfU0FfTUFTSywKLQkuc21wc192b2xyYV9zaGlmdCA9IE9NQVA0NDMwX1ZPTFJBX1ZERF9JVkFfTF9TSElGVCwKIAkuc21wc192b2xyYV9tYXNrID0gT01BUDQ0MzBfVk9MUkFfVkREX0lWQV9MX01BU0ssCisJLnNtcHNfY21kcmFfbWFzayA9IE9NQVA0NDMwX0NNRFJBX1ZERF9JVkFfTF9NQVNLLAorCS5jZmdfY2hhbm5lbF9zYV9zaGlmdCA9IE9NQVA0NDMwX1NBX1ZERF9JVkFfTF9TSElGVCwKIH07CiAKLXN0cnVjdCBvbWFwX3ZjX2luc3RhbmNlX2RhdGEgb21hcDRfdmNfY29yZV9kYXRhID0gewotCS52Y19jb21tb24gPSAmb21hcDRfdmNfY29tbW9uLAorc3RydWN0IG9tYXBfdmNfY2hhbm5lbCBvbWFwNF92Y19jb3JlID0geworCS5jb21tb24gPSAmb21hcDRfdmNfY29tbW9uLAorCS5zbXBzX3NhX3JlZyA9IE9NQVA0X1BSTV9WQ19TTVBTX1NBX09GRlNFVCwKKwkuc21wc192b2xyYV9yZWcgPSBPTUFQNF9QUk1fVkNfVkFMX1NNUFNfUkFfVk9MX09GRlNFVCwKKwkuc21wc19jbWRyYV9yZWcgPSBPTUFQNF9QUk1fVkNfVkFMX1NNUFNfUkFfQ01EX09GRlNFVCwKKwkuY2ZnX2NoYW5uZWxfcmVnID0gT01BUDRfUFJNX1ZDX0NGR19DSEFOTkVMX09GRlNFVCwKIAkuY21kdmFsX3JlZyA9IE9NQVA0X1BSTV9WQ19WQUxfQ01EX1ZERF9DT1JFX0xfT0ZGU0VULAotCS5zbXBzX3NhX3NoaWZ0ID0gT01BUDQ0MzBfU0FfVkREX0NPUkVfTF8wXzZfU0hJRlQsCiAJLnNtcHNfc2FfbWFzayA9IE9NQVA0NDMwX1NBX1ZERF9DT1JFX0xfMF82X01BU0ssCi0JLnNtcHNfdm9scmFfc2hpZnQgPSBPTUFQNDQzMF9WT0xSQV9WRERfQ09SRV9MX1NISUZULAogCS5zbXBzX3ZvbHJhX21hc2sgPSBPTUFQNDQzMF9WT0xSQV9WRERfQ09SRV9MX01BU0ssCisJLnNtcHNfY21kcmFfbWFzayA9IE9NQVA0NDMwX0NNRFJBX1ZERF9DT1JFX0xfTUFTSywKKwkuY2ZnX2NoYW5uZWxfc2Ffc2hpZnQgPSBPTUFQNDQzMF9TQV9WRERfQ09SRV9MX1NISUZULAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2UuYwppbmRleCA5ZWYzNzg5Li4xZjhmZGY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2UuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2UuYwpAQCAtMjEsMTAgKzIxLDExIEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAKQEAgLTM2LDgzOSArMzcsODggQEAKICNpbmNsdWRlICJjb250cm9sLmgiCiAKICNpbmNsdWRlICJ2b2x0YWdlLmgiCisjaW5jbHVkZSAicG93ZXJkb21haW4uaCIKIAogI2luY2x1ZGUgInZjLmgiCiAjaW5jbHVkZSAidnAuaCIKIAotI2RlZmluZSBWT0xUQUdFX0RJUl9TSVpFCTE2Ci0KLQotc3RhdGljIHN0cnVjdCBvbWFwX3ZkZF9pbmZvICoqdmRkX2luZm87Ci0KLS8qCi0gKiBOdW1iZXIgb2Ygc2NhbGFibGUgdm9sdGFnZSBkb21haW5zLgotICovCi1zdGF0aWMgaW50IG5yX3NjYWxhYmxlX3ZkZDsKLQotLyogWFhYIGRvY3VtZW50ICovCi1zdGF0aWMgczE2IHBybV9tb2Rfb2ZmczsKLXN0YXRpYyBzMTYgcHJtX2lycXN0X29jcF9tb2Rfb2ZmczsKLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKnZvbHRhZ2VfZGlyOwotCi0vKiBJbml0IGZ1bmN0aW9uIHBvaW50ZXJzICovCi1zdGF0aWMgaW50IHZwX2ZvcmNldXBkYXRlX3NjYWxlX3ZvbHRhZ2Uoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCwKLQkJCQkJdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCk7Ci0KLXN0YXRpYyB1MzIgb21hcDNfdm9sdGFnZV9yZWFkX3JlZyh1MTYgbW9kLCB1OCBvZmZzZXQpCi17Ci0JcmV0dXJuIG9tYXAyX3BybV9yZWFkX21vZF9yZWcobW9kLCBvZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwM192b2x0YWdlX3dyaXRlX3JlZyh1MzIgdmFsLCB1MTYgbW9kLCB1OCBvZmZzZXQpCi17Ci0Jb21hcDJfcHJtX3dyaXRlX21vZF9yZWcodmFsLCBtb2QsIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB1MzIgb21hcDRfdm9sdGFnZV9yZWFkX3JlZyh1MTYgbW9kLCB1OCBvZmZzZXQpCi17Ci0JcmV0dXJuIG9tYXA0X3BybWluc3RfcmVhZF9pbnN0X3JlZyhPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCQkJCQltb2QsIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXA0X3ZvbHRhZ2Vfd3JpdGVfcmVnKHUzMiB2YWwsIHUxNiBtb2QsIHU4IG9mZnNldCkKLXsKLQlvbWFwNF9wcm1pbnN0X3dyaXRlX2luc3RfcmVnKHZhbCwgT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwgbW9kLCBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBfY29uZmlnX2NvbW1vbl92ZGRfZGF0YShzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkKQotewotCWNoYXIgKnN5c19ja19uYW1lOwotCXN0cnVjdCBjbGsgKnN5c19jazsKLQl1MzIgc3lzX2Nsa19zcGVlZCwgdGltZW91dF92YWwsIHdhaXR0aW1lOwotCi0JLyoKLQkgKiBYWFggQ2xvY2tmdyBzaG91bGQgaGFuZGxlIHRoaXMsIG9yIHRoaXMgc2hvdWxkIGJlIGluIGEKLQkgKiBzdHJ1Y3QgcmVjb3JkCi0JICovCi0JaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpKQotCQlzeXNfY2tfbmFtZSA9ICJzeXNfY2siOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKQotCQlzeXNfY2tfbmFtZSA9ICJzeXNfY2xraW5fY2siOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKgotCSAqIFN5cyBjbGsgcmF0ZSBpcyByZXF1aXJlIHRvIGNhbGN1bGF0ZSB2cCB0aW1lb3V0IHZhbHVlIGFuZAotCSAqIHNtcHN3YWl0dGltZW1pbiBhbmQgc21wc3dhaXR0aW1lbWF4LgotCSAqLwotCXN5c19jayA9IGNsa19nZXQoTlVMTCwgc3lzX2NrX25hbWUpOwotCWlmIChJU19FUlIoc3lzX2NrKSkgewotCQlwcl93YXJuaW5nKCIlczogQ291bGQgbm90IGdldCB0aGUgc3lzIGNsayB0byBjYWxjdWxhdGUiCi0JCQkidmFyaW91cyB2ZGRfJXMgcGFyYW1zXG4iLCBfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlzeXNfY2xrX3NwZWVkID0gY2xrX2dldF9yYXRlKHN5c19jayk7Ci0JY2xrX3B1dChzeXNfY2spOwotCS8qIERpdmlkZSB0byBhdm9pZCBvdmVyZmxvdyAqLwotCXN5c19jbGtfc3BlZWQgLz0gMTAwMDsKLQotCS8qIEdlbmVyaWMgdm9sdGFnZSBwYXJhbWV0ZXJzICovCi0JdmRkLT52b2x0X3NjYWxlID0gdnBfZm9yY2V1cGRhdGVfc2NhbGVfdm9sdGFnZTsKLQl2ZGQtPnZwX2VuYWJsZWQgPSBmYWxzZTsKLQotCXZkZC0+dnBfcnRfZGF0YS52cGNvbmZpZ19lcnJvcm9mZnNldCA9Ci0JCSh2ZGQtPnBtaWNfaW5mby0+dnBfZXJyb3JvZmZzZXQgPDwKLQkJIHZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ19lcnJvcm9mZnNldF9zaGlmdCk7Ci0KLQl0aW1lb3V0X3ZhbCA9IChzeXNfY2xrX3NwZWVkICogdmRkLT5wbWljX2luZm8tPnZwX3RpbWVvdXRfdXMpIC8gMTAwMDsKLQl2ZGQtPnZwX3J0X2RhdGEudmxpbWl0dG9fdGltZW91dCA9IHRpbWVvdXRfdmFsOwotCXZkZC0+dnBfcnRfZGF0YS52bGltaXR0b192ZGRtaW4gPSB2ZGQtPnBtaWNfaW5mby0+dnBfdmRkbWluOwotCXZkZC0+dnBfcnRfZGF0YS52bGltaXR0b192ZGRtYXggPSB2ZGQtPnBtaWNfaW5mby0+dnBfdmRkbWF4OwotCi0Jd2FpdHRpbWUgPSAoKHZkZC0+cG1pY19pbmZvLT5zdGVwX3NpemUgLyB2ZGQtPnBtaWNfaW5mby0+c2xld19yYXRlKSAqCi0JCQkJc3lzX2Nsa19zcGVlZCkgLyAxMDAwOwotCXZkZC0+dnBfcnRfZGF0YS52c3RlcG1pbl9zbXBzd2FpdHRpbWVtaW4gPSB3YWl0dGltZTsKLQl2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtYXhfc21wc3dhaXR0aW1lbWF4ID0gd2FpdHRpbWU7Ci0JdmRkLT52cF9ydF9kYXRhLnZzdGVwbWluX3N0ZXBtaW4gPSB2ZGQtPnBtaWNfaW5mby0+dnBfdnN0ZXBtaW47Ci0JdmRkLT52cF9ydF9kYXRhLnZzdGVwbWF4X3N0ZXBtYXggPSB2ZGQtPnBtaWNfaW5mby0+dnBfdnN0ZXBtYXg7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVm9sdGFnZSBkZWJ1Z2ZzIHN1cHBvcnQgKi8KLXN0YXRpYyBpbnQgdnBfdm9sdF9kZWJ1Z19nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCi17Ci0Jc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCA9IChzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqKSBkYXRhOwotCXU4IHZzZWw7Ci0KLQlpZiAoIXZkZCkgewotCQlwcl93YXJuaW5nKCJXcm9uZyBwYXJhbWF0ZXIgcGFzc2VkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdnNlbCA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZvbHRhZ2UpOwotCi0JaWYgKCF2ZGQtPnBtaWNfaW5mby0+dnNlbF90b191dikgewotCQlwcl93YXJuaW5nKCJQTUlDIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdnNlbCB0byB2b2x0YWdlIgotCQkJImluIHVWIG5vdCByZWdpc3RlcmRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkqdmFsID0gdmRkLT5wbWljX2luZm8tPnZzZWxfdG9fdXYodnNlbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbm9tX3ZvbHRfZGVidWdfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQotewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQgPSAoc3RydWN0IG9tYXBfdmRkX2luZm8gKikgZGF0YTsKLQotCWlmICghdmRkKSB7Ci0JCXByX3dhcm5pbmcoIldyb25nIHBhcmFtYXRlciBwYXNzZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkqdmFsID0gb21hcF92b2x0YWdlX2dldF9ub21fdm9sdCgmdmRkLT52b2x0ZG0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLURFRklORV9TSU1QTEVfQVRUUklCVVRFKHZwX3ZvbHRfZGVidWdfZm9wcywgdnBfdm9sdF9kZWJ1Z19nZXQsIE5VTEwsICIlbGx1XG4iKTsKLURFRklORV9TSU1QTEVfQVRUUklCVVRFKG5vbV92b2x0X2RlYnVnX2ZvcHMsIG5vbV92b2x0X2RlYnVnX2dldCwgTlVMTCwKLQkJCQkJCQkJIiVsbHVcbiIpOwotc3RhdGljIHZvaWQgdnBfbGF0Y2hfdnNlbChzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkKQotewotCXUzMiB2cGNvbmZpZzsKLQl1bnNpZ25lZCBsb25nIHV2ZGM7Ci0JY2hhciB2c2VsOwotCi0JdXZkYyA9IG9tYXBfdm9sdGFnZV9nZXRfbm9tX3ZvbHQoJnZkZC0+dm9sdGRtKTsKLQlpZiAoIXV2ZGMpIHsKLQkJcHJfd2FybmluZygiJXM6IHVuYWJsZSB0byBmaW5kIGN1cnJlbnQgdm9sdGFnZSBmb3IgdmRkXyVzXG4iLAotCQkJX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCF2ZGQtPnBtaWNfaW5mbyB8fCAhdmRkLT5wbWljX2luZm8tPnV2X3RvX3ZzZWwpIHsKLQkJcHJfd2FybmluZygiJXM6IFBNSUMgZnVuY3Rpb24gdG8gY29udmVydCB2b2x0YWdlIGluIHVWIHRvIgotCQkJIiB2c2VsIG5vdCByZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQl2c2VsID0gdmRkLT5wbWljX2luZm8tPnV2X3RvX3ZzZWwodXZkYyk7Ci0KLQl2cGNvbmZpZyA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQl2cGNvbmZpZyAmPSB+KHZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ19pbml0dm9sdGFnZV9tYXNrIHwKLQkJCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ19pbml0dmRkKTsKLQl2cGNvbmZpZyB8PSB2c2VsIDw8IHZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ19pbml0dm9sdGFnZV9zaGlmdDsKLQotCXZkZC0+d3JpdGVfcmVnKHZwY29uZmlnLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCi0JLyogVHJpZ2dlciBpbml0VkREIHZhbHVlIGNvcHkgdG8gdm9sdGFnZSBwcm9jZXNzb3IgKi8KLQl2ZGQtPndyaXRlX3JlZygodnBjb25maWcgfCB2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfaW5pdHZkZCksCi0JCSAgICAgICBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCi0JLyogQ2xlYXIgaW5pdFZERCBjb3B5IHRyaWdnZXIgYml0ICovCi0JdmRkLT53cml0ZV9yZWcodnBjb25maWcsIHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci19Ci0KLS8qIEdlbmVyaWMgdm9sdGFnZSBpbml0IGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgX19pbml0IHZwX2luaXQoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCkKLXsKLQl1MzIgdnBfdmFsOwotCi0JaWYgKCF2ZGQtPnJlYWRfcmVnIHx8ICF2ZGQtPndyaXRlX3JlZykgewotCQlwcl9lcnIoIiVzOiBObyByZWFkL3dyaXRlIEFQSSBmb3IgYWNjZXNzaW5nIHZkZF8lcyByZWdzXG4iLAotCQkJX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JdnBfdmFsID0gdmRkLT52cF9ydF9kYXRhLnZwY29uZmlnX2Vycm9yb2Zmc2V0IHwKLQkJKHZkZC0+dnBfcnRfZGF0YS52cGNvbmZpZ19lcnJvcmdhaW4gPDwKLQkJdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2Vycm9yZ2Fpbl9zaGlmdCkgfAotCQl2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfdGltZW91dGVuOwotCXZkZC0+d3JpdGVfcmVnKHZwX3ZhbCwgcHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQotCXZwX3ZhbCA9ICgodmRkLT52cF9ydF9kYXRhLnZzdGVwbWluX3NtcHN3YWl0dGltZW1pbiA8PAotCQl2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnN0ZXBtaW5fc21wc3dhaXR0aW1lbWluX3NoaWZ0KSB8Ci0JCSh2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtaW5fc3RlcG1pbiA8PAotCQl2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnN0ZXBtaW5fc3RlcG1pbl9zaGlmdCkpOwotCXZkZC0+d3JpdGVfcmVnKHZwX3ZhbCwgcHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZzdGVwbWluKTsKLQotCXZwX3ZhbCA9ICgodmRkLT52cF9ydF9kYXRhLnZzdGVwbWF4X3NtcHN3YWl0dGltZW1heCA8PAotCQl2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnN0ZXBtYXhfc21wc3dhaXR0aW1lbWF4X3NoaWZ0KSB8Ci0JCSh2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtYXhfc3RlcG1heCA8PAotCQl2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnN0ZXBtYXhfc3RlcG1heF9zaGlmdCkpOwotCXZkZC0+d3JpdGVfcmVnKHZwX3ZhbCwgcHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZzdGVwbWF4KTsKLQotCXZwX3ZhbCA9ICgodmRkLT52cF9ydF9kYXRhLnZsaW1pdHRvX3ZkZG1heCA8PAotCQl2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dmxpbWl0dG9fdmRkbWF4X3NoaWZ0KSB8Ci0JCSh2ZGQtPnZwX3J0X2RhdGEudmxpbWl0dG9fdmRkbWluIDw8Ci0JCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52bGltaXR0b192ZGRtaW5fc2hpZnQpIHwKLQkJKHZkZC0+dnBfcnRfZGF0YS52bGltaXR0b190aW1lb3V0IDw8Ci0JCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52bGltaXR0b190aW1lb3V0X3NoaWZ0KSk7Ci0JdmRkLT53cml0ZV9yZWcodnBfdmFsLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dmxpbWl0dG8pOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgdmRkX2RlYnVnZnNfaW5pdChzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkKQotewotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0ga3phbGxvYyhWT0xUQUdFX0RJUl9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5hbWUpIHsKLQkJcHJfd2FybmluZygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRlYnVnZnMiCi0JCQkiIGRpcmVjdG9yeSBuYW1lIGZvciB2ZGRfJXMiLAotCQkJX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCXN0cmNweShuYW1lLCAidmRkXyIpOwotCXN0cmNhdChuYW1lLCB2ZGQtPnZvbHRkbS5uYW1lKTsKLQotCXZkZC0+ZGVidWdfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHZvbHRhZ2VfZGlyKTsKLQlrZnJlZShuYW1lKTsKLQlpZiAoSVNfRVJSKHZkZC0+ZGVidWdfZGlyKSkgewotCQlwcl93YXJuaW5nKCIlczogVW5hYmxlIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeSBmb3IiCi0JCQkiIHZkZF8lc1xuIiwgX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUpOwotCQl2ZGQtPmRlYnVnX2RpciA9IE5VTEw7Ci0JCXJldHVybjsKLQl9Ci0KLQkodm9pZCkgZGVidWdmc19jcmVhdGVfeDE2KCJ2cF9lcnJvcmdhaW4iLCBTX0lSVUdPLCB2ZGQtPmRlYnVnX2RpciwKLQkJCQkmKHZkZC0+dnBfcnRfZGF0YS52cGNvbmZpZ19lcnJvcmdhaW4pKTsKLQkodm9pZCkgZGVidWdmc19jcmVhdGVfeDE2KCJ2cF9zbXBzd2FpdHRpbWVtaW4iLCBTX0lSVUdPLAotCQkJCXZkZC0+ZGVidWdfZGlyLAotCQkJCSYodmRkLT52cF9ydF9kYXRhLnZzdGVwbWluX3NtcHN3YWl0dGltZW1pbikpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV94OCgidnBfc3RlcG1pbiIsIFNfSVJVR08sIHZkZC0+ZGVidWdfZGlyLAotCQkJCSYodmRkLT52cF9ydF9kYXRhLnZzdGVwbWluX3N0ZXBtaW4pKTsKLQkodm9pZCkgZGVidWdmc19jcmVhdGVfeDE2KCJ2cF9zbXBzd2FpdHRpbWVtYXgiLCBTX0lSVUdPLAotCQkJCXZkZC0+ZGVidWdfZGlyLAotCQkJCSYodmRkLT52cF9ydF9kYXRhLnZzdGVwbWF4X3NtcHN3YWl0dGltZW1heCkpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV94OCgidnBfc3RlcG1heCIsIFNfSVJVR08sIHZkZC0+ZGVidWdfZGlyLAotCQkJCSYodmRkLT52cF9ydF9kYXRhLnZzdGVwbWF4X3N0ZXBtYXgpKTsKLQkodm9pZCkgZGVidWdmc19jcmVhdGVfeDgoInZwX3ZkZG1heCIsIFNfSVJVR08sIHZkZC0+ZGVidWdfZGlyLAotCQkJCSYodmRkLT52cF9ydF9kYXRhLnZsaW1pdHRvX3ZkZG1heCkpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV94OCgidnBfdmRkbWluIiwgU19JUlVHTywgdmRkLT5kZWJ1Z19kaXIsCi0JCQkJJih2ZGQtPnZwX3J0X2RhdGEudmxpbWl0dG9fdmRkbWluKSk7Ci0JKHZvaWQpIGRlYnVnZnNfY3JlYXRlX3gxNigidnBfdGltZW91dCIsIFNfSVJVR08sIHZkZC0+ZGVidWdfZGlyLAotCQkJCSYodmRkLT52cF9ydF9kYXRhLnZsaW1pdHRvX3RpbWVvdXQpKTsKLQkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZSgiY3Vycl92cF92b2x0IiwgU19JUlVHTywgdmRkLT5kZWJ1Z19kaXIsCi0JCQkJKHZvaWQgKikgdmRkLCAmdnBfdm9sdF9kZWJ1Z19mb3BzKTsKLQkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZSgiY3Vycl9ub21pbmFsX3ZvbHQiLCBTX0lSVUdPLAotCQkJCXZkZC0+ZGVidWdfZGlyLCAodm9pZCAqKSB2ZGQsCi0JCQkJJm5vbV92b2x0X2RlYnVnX2ZvcHMpOwotfQotCi0vKiBWb2x0YWdlIHNjYWxlIGFuZCBhY2Nlc3NvcnkgQVBJcyAqLwotc3RhdGljIGludCBfcHJlX3ZvbHRfc2NhbGUoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCwKLQkJdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCwgdTggKnRhcmdldF92c2VsLCB1OCAqY3VycmVudF92c2VsKQotewotCXN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAqdm9sdF9kYXRhOwotCWNvbnN0IHN0cnVjdCBvbWFwX3ZjX2NvbW1vbl9kYXRhICp2Y19jb21tb247Ci0JY29uc3Qgc3RydWN0IG9tYXBfdnBfY29tbW9uX2RhdGEgKnZwX2NvbW1vbjsKLQl1MzIgdmNfY21kdmFsLCB2cF9lcnJnYWluX3ZhbDsKLQotCXZjX2NvbW1vbiA9IHZkZC0+dmNfZGF0YS0+dmNfY29tbW9uOwotCXZwX2NvbW1vbiA9IHZkZC0+dnBfZGF0YS0+dnBfY29tbW9uOwotCi0JLyogQ2hlY2sgaWYgc3VmZmllY2llbnQgcG1pYyBpbmZvIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyB2ZGQgKi8KLQlpZiAoIXZkZC0+cG1pY19pbmZvKSB7Ci0JCXByX2VycigiJXM6IEluc3VmZmljaWVudCBwbWljIGluZm8gdG8gc2NhbGUgdGhlIHZkZF8lc1xuIiwKLQkJCV9fZnVuY19fLCB2ZGQtPnZvbHRkbS5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCF2ZGQtPnBtaWNfaW5mby0+dXZfdG9fdnNlbCkgewotCQlwcl9lcnIoIiVzOiBQTUlDIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdm9sdGFnZSBpbiB1ViB0byIKLQkJCSJ2c2VsIG5vdCByZWdpc3RlcmVkLiBIZW5jZSB1bmFibGUgdG8gc2NhbGUgdm9sdGFnZSIKLQkJCSJmb3IgdmRkXyVzXG4iLCBfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXJldHVybiAtRU5PREFUQTsKLQl9Ci0KLQlpZiAoIXZkZC0+cmVhZF9yZWcgfHwgIXZkZC0+d3JpdGVfcmVnKSB7Ci0JCXByX2VycigiJXM6IE5vIHJlYWQvd3JpdGUgQVBJIGZvciBhY2Nlc3NpbmcgdmRkXyVzIHJlZ3NcbiIsCi0JCQlfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIEdldCB2b2x0X2RhdGEgY29ycmVzcG9uZGluZyB0byB0YXJnZXRfdm9sdCAqLwotCXZvbHRfZGF0YSA9IG9tYXBfdm9sdGFnZV9nZXRfdm9sdGRhdGEoJnZkZC0+dm9sdGRtLCB0YXJnZXRfdm9sdCk7Ci0JaWYgKElTX0VSUih2b2x0X2RhdGEpKQotCQl2b2x0X2RhdGEgPSBOVUxMOwotCi0JKnRhcmdldF92c2VsID0gdmRkLT5wbWljX2luZm8tPnV2X3RvX3ZzZWwodGFyZ2V0X3ZvbHQpOwotCSpjdXJyZW50X3ZzZWwgPSB2ZGQtPnJlYWRfcmVnKHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52b2x0YWdlKTsKLQotCS8qIFNldHRpbmcgdGhlIE9OIHZvbHRhZ2UgdG8gdGhlIG5ldyB0YXJnZXQgdm9sdGFnZSAqLwotCXZjX2NtZHZhbCA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2ZGQtPnZjX2RhdGEtPmNtZHZhbF9yZWcpOwotCXZjX2NtZHZhbCAmPSB+dmNfY29tbW9uLT5jbWRfb25fbWFzazsKLQl2Y19jbWR2YWwgfD0gKCp0YXJnZXRfdnNlbCA8PCB2Y19jb21tb24tPmNtZF9vbl9zaGlmdCk7Ci0JdmRkLT53cml0ZV9yZWcodmNfY21kdmFsLCBwcm1fbW9kX29mZnMsIHZkZC0+dmNfZGF0YS0+Y21kdmFsX3JlZyk7Ci0KLQkvKiBTZXR0aW5nIHZwIGVycm9yZ2FpbiBiYXNlZCBvbiB0aGUgdm9sdGFnZSAqLwotCWlmICh2b2x0X2RhdGEpIHsKLQkJdnBfZXJyZ2Fpbl92YWwgPSB2ZGQtPnJlYWRfcmVnKHBybV9tb2Rfb2ZmcywKLQkJCQkJICAgICAgIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCQl2ZGQtPnZwX3J0X2RhdGEudnBjb25maWdfZXJyb3JnYWluID0gdm9sdF9kYXRhLT52cF9lcnJnYWluOwotCQl2cF9lcnJnYWluX3ZhbCAmPSB+dnBfY29tbW9uLT52cGNvbmZpZ19lcnJvcmdhaW5fbWFzazsKLQkJdnBfZXJyZ2Fpbl92YWwgfD0gdmRkLT52cF9ydF9kYXRhLnZwY29uZmlnX2Vycm9yZ2FpbiA8PAotCQkJdnBfY29tbW9uLT52cGNvbmZpZ19lcnJvcmdhaW5fc2hpZnQ7Ci0JCXZkZC0+d3JpdGVfcmVnKHZwX2VycmdhaW5fdmFsLCBwcm1fbW9kX29mZnMsCi0JCQkgICAgICAgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9wb3N0X3ZvbHRfc2NhbGUoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCwKLQkJdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCwgdTggdGFyZ2V0X3ZzZWwsIHU4IGN1cnJlbnRfdnNlbCkKLXsKLQl1MzIgc21wc19zdGVwcyA9IDAsIHNtcHNfZGVsYXkgPSAwOwotCi0Jc21wc19zdGVwcyA9IGFicyh0YXJnZXRfdnNlbCAtIGN1cnJlbnRfdnNlbCk7Ci0JLyogU01QUyBzbGV3IHJhdGUgLyBzdGVwIHNpemUuIDJ1cyBhZGRlZCBhcyBidWZmZXIuICovCi0Jc21wc19kZWxheSA9ICgoc21wc19zdGVwcyAqIHZkZC0+cG1pY19pbmZvLT5zdGVwX3NpemUpIC8KLQkJCXZkZC0+cG1pY19pbmZvLT5zbGV3X3JhdGUpICsgMjsKLQl1ZGVsYXkoc21wc19kZWxheSk7Ci0KLQl2ZGQtPmN1cnJfdm9sdCA9IHRhcmdldF92b2x0OwotfQotCi0vKiB2Y19ieXBhc3Nfc2NhbGVfdm9sdGFnZSAtIFZDIGJ5cGFzcyBtZXRob2Qgb2Ygdm9sdGFnZSBzY2FsaW5nICovCi1zdGF0aWMgaW50IHZjX2J5cGFzc19zY2FsZV92b2x0YWdlKHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQsCi0JCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpCi17Ci0JdTMyIGxvb3BfY250ID0gMCwgcmV0cmllc19jbnQgPSAwOwotCXUzMiB2Y192YWxpZCwgdmNfYnlwYXNzX3ZhbF9yZWcsIHZjX2J5cGFzc192YWx1ZTsKLQl1OCB0YXJnZXRfdnNlbCwgY3VycmVudF92c2VsOwotCWludCByZXQ7Ci0KLQlyZXQgPSBfcHJlX3ZvbHRfc2NhbGUodmRkLCB0YXJnZXRfdm9sdCwgJnRhcmdldF92c2VsLCAmY3VycmVudF92c2VsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JdmNfdmFsaWQgPSB2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+dmFsaWQ7Ci0JdmNfYnlwYXNzX3ZhbF9yZWcgPSB2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+YnlwYXNzX3ZhbF9yZWc7Ci0JdmNfYnlwYXNzX3ZhbHVlID0gKHRhcmdldF92c2VsIDw8IHZkZC0+dmNfZGF0YS0+dmNfY29tbW9uLT5kYXRhX3NoaWZ0KSB8Ci0JCQkodmRkLT5wbWljX2luZm8tPnBtaWNfcmVnIDw8Ci0JCQl2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+cmVnYWRkcl9zaGlmdCkgfAotCQkJKHZkZC0+cG1pY19pbmZvLT5pMmNfc2xhdmVfYWRkciA8PAotCQkJdmRkLT52Y19kYXRhLT52Y19jb21tb24tPnNsYXZlYWRkcl9zaGlmdCk7Ci0KLQl2ZGQtPndyaXRlX3JlZyh2Y19ieXBhc3NfdmFsdWUsIHBybV9tb2Rfb2ZmcywgdmNfYnlwYXNzX3ZhbF9yZWcpOwotCXZkZC0+d3JpdGVfcmVnKHZjX2J5cGFzc192YWx1ZSB8IHZjX3ZhbGlkLCBwcm1fbW9kX29mZnMsCi0JCSAgICAgICB2Y19ieXBhc3NfdmFsX3JlZyk7Ci0KLQl2Y19ieXBhc3NfdmFsdWUgPSB2ZGQtPnJlYWRfcmVnKHBybV9tb2Rfb2ZmcywgdmNfYnlwYXNzX3ZhbF9yZWcpOwotCS8qCi0JICogTG9vcCB0aWxsIHRoZSBieXBhc3MgY29tbWFuZCBpcyBhY2tub3dsZWRnZWQgZnJvbSB0aGUgU01QUy4KLQkgKiBOT1RFOiBUaGlzIGlzIGxlZ2FjeSBjb2RlLiBUaGUgbG9vcCBjb3VudCBhbmQgcmV0cnkgY291bnQgbmVlZHMKLQkgKiB0byBiZSByZXZpc2l0ZWQuCi0JICovCi0Jd2hpbGUgKCEodmNfYnlwYXNzX3ZhbHVlICYgdmNfdmFsaWQpKSB7Ci0JCWxvb3BfY250Kys7Ci0KLQkJaWYgKHJldHJpZXNfY250ID4gMTApIHsKLQkJCXByX3dhcm5pbmcoIiVzOiBSZXRyeSBjb3VudCBleGNlZWRlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQotCQlpZiAobG9vcF9jbnQgPiA1MCkgewotCQkJcmV0cmllc19jbnQrKzsKLQkJCWxvb3BfY250ID0gMDsKLQkJCXVkZWxheSgxMCk7Ci0JCX0KLQkJdmNfYnlwYXNzX3ZhbHVlID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsCi0JCQkJCQl2Y19ieXBhc3NfdmFsX3JlZyk7Ci0JfQotCi0JX3Bvc3Rfdm9sdF9zY2FsZSh2ZGQsIHRhcmdldF92b2x0LCB0YXJnZXRfdnNlbCwgY3VycmVudF92c2VsKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogVlAgZm9yY2UgdXBkYXRlIG1ldGhvZCBvZiB2b2x0YWdlIHNjYWxpbmcgKi8KLXN0YXRpYyBpbnQgdnBfZm9yY2V1cGRhdGVfc2NhbGVfdm9sdGFnZShzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkLAotCQl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KQotewotCXUzMiB2cGNvbmZpZzsKLQl1OCB0YXJnZXRfdnNlbCwgY3VycmVudF92c2VsLCBwcm1faXJxc3RfcmVnOwotCWludCByZXQsIHRpbWVvdXQgPSAwOwotCi0JcmV0ID0gX3ByZV92b2x0X3NjYWxlKHZkZCwgdGFyZ2V0X3ZvbHQsICZ0YXJnZXRfdnNlbCwgJmN1cnJlbnRfdnNlbCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXBybV9pcnFzdF9yZWcgPSB2ZGQtPnZwX2RhdGEtPnBybV9pcnFzdF9kYXRhLT5wcm1faXJxc3RfcmVnOwotCi0JLyoKLQkgKiBDbGVhciBhbGwgcGVuZGluZyBUcmFuc2FjdGlvbkRvbmUgaW50ZXJydXB0L3N0YXR1cy4gVHlwaWNhbCBsYXRlbmN5Ci0JICogaXMgPDN1cwotCSAqLwotCXdoaWxlICh0aW1lb3V0KysgPCBWUF9UUkFOWERPTkVfVElNRU9VVCkgewotCQl2ZGQtPndyaXRlX3JlZyh2ZGQtPnZwX2RhdGEtPnBybV9pcnFzdF9kYXRhLT50cmFueGRvbmVfc3RhdHVzLAotCQkJICAgICAgIHBybV9pcnFzdF9vY3BfbW9kX29mZnMsIHBybV9pcnFzdF9yZWcpOwotCQlpZiAoISh2ZGQtPnJlYWRfcmVnKHBybV9pcnFzdF9vY3BfbW9kX29mZnMsIHBybV9pcnFzdF9yZWcpICYKLQkJICAgICAgdmRkLT52cF9kYXRhLT5wcm1faXJxc3RfZGF0YS0+dHJhbnhkb25lX3N0YXR1cykpCi0JCQlicmVhazsKLQkJdWRlbGF5KDEpOwotCX0KLQlpZiAodGltZW91dCA+PSBWUF9UUkFOWERPTkVfVElNRU9VVCkgewotCQlwcl93YXJuaW5nKCIlczogdmRkXyVzIFRSQU5YRE9ORSB0aW1lb3V0IGV4Y2VlZGVkLiIKLQkJCSJWb2x0YWdlIGNoYW5nZSBhYm9ydGVkIiwgX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUpOwotCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9Ci0KLQkvKiBDb25maWd1cmUgZm9yIFZQLUZvcmNlIFVwZGF0ZSAqLwotCXZwY29uZmlnID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCXZwY29uZmlnICY9IH4odmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2luaXR2ZGQgfAotCQkJdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2ZvcmNldXBkYXRlIHwKLQkJCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ19pbml0dm9sdGFnZV9tYXNrKTsKLQl2cGNvbmZpZyB8PSAoKHRhcmdldF92c2VsIDw8Ci0JCQl2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfaW5pdHZvbHRhZ2Vfc2hpZnQpKTsKLQl2ZGQtPndyaXRlX3JlZyh2cGNvbmZpZywgcHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQotCS8qIFRyaWdnZXIgaW5pdFZERCB2YWx1ZSBjb3B5IHRvIHZvbHRhZ2UgcHJvY2Vzc29yICovCi0JdnBjb25maWcgfD0gdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2luaXR2ZGQ7Ci0JdmRkLT53cml0ZV9yZWcodnBjb25maWcsIHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0KLQkvKiBGb3JjZSB1cGRhdGUgb2Ygdm9sdGFnZSAqLwotCXZwY29uZmlnIHw9IHZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ19mb3JjZXVwZGF0ZTsKLQl2ZGQtPndyaXRlX3JlZyh2cGNvbmZpZywgcHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQotCS8qCi0JICogV2FpdCBmb3IgVHJhbnNhY3Rpb25Eb25lLiBUeXBpY2FsIGxhdGVuY3kgaXMgPDIwMHVzLgotCSAqIERlcGVuZHMgb24gU01QU1dBSVRUSU1FTUlOL01BWCBhbmQgdm9sdGFnZSBjaGFuZ2UKLQkgKi8KLQl0aW1lb3V0ID0gMDsKLQlvbWFwX3Rlc3RfdGltZW91dCgodmRkLT5yZWFkX3JlZyhwcm1faXJxc3Rfb2NwX21vZF9vZmZzLCBwcm1faXJxc3RfcmVnKSAmCi0JCQkgICB2ZGQtPnZwX2RhdGEtPnBybV9pcnFzdF9kYXRhLT50cmFueGRvbmVfc3RhdHVzKSwKLQkJCSAgVlBfVFJBTlhET05FX1RJTUVPVVQsIHRpbWVvdXQpOwotCWlmICh0aW1lb3V0ID49IFZQX1RSQU5YRE9ORV9USU1FT1VUKQotCQlwcl9lcnIoIiVzOiB2ZGRfJXMgVFJBTlhET05FIHRpbWVvdXQgZXhjZWVkZWQuIgotCQkJIlRSQU5YRE9ORSBuZXZlciBnb3Qgc2V0IGFmdGVyIHRoZSB2b2x0YWdlIHVwZGF0ZVxuIiwKLQkJCV9fZnVuY19fLCB2ZGQtPnZvbHRkbS5uYW1lKTsKLQotCV9wb3N0X3ZvbHRfc2NhbGUodmRkLCB0YXJnZXRfdm9sdCwgdGFyZ2V0X3ZzZWwsIGN1cnJlbnRfdnNlbCk7Ci0KLQkvKgotCSAqIERpc2FibGUgVHJhbnNhY3Rpb25Eb25lIGludGVycnVwdCAsIGNsZWFyIGFsbCBzdGF0dXMsIGNsZWFyCi0JICogY29udHJvbCByZWdpc3RlcnMKLQkgKi8KLQl0aW1lb3V0ID0gMDsKLQl3aGlsZSAodGltZW91dCsrIDwgVlBfVFJBTlhET05FX1RJTUVPVVQpIHsKLQkJdmRkLT53cml0ZV9yZWcodmRkLT52cF9kYXRhLT5wcm1faXJxc3RfZGF0YS0+dHJhbnhkb25lX3N0YXR1cywKLQkJCSAgICAgICBwcm1faXJxc3Rfb2NwX21vZF9vZmZzLCBwcm1faXJxc3RfcmVnKTsKLQkJaWYgKCEodmRkLT5yZWFkX3JlZyhwcm1faXJxc3Rfb2NwX21vZF9vZmZzLCBwcm1faXJxc3RfcmVnKSAmCi0JCSAgICAgIHZkZC0+dnBfZGF0YS0+cHJtX2lycXN0X2RhdGEtPnRyYW54ZG9uZV9zdGF0dXMpKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxKTsKLQl9Ci0KLQlpZiAodGltZW91dCA+PSBWUF9UUkFOWERPTkVfVElNRU9VVCkKLQkJcHJfd2FybmluZygiJXM6IHZkZF8lcyBUUkFOWERPTkUgdGltZW91dCBleGNlZWRlZCB3aGlsZSB0cnlpbmciCi0JCQkidG8gY2xlYXIgdGhlIFRSQU5YRE9ORSBzdGF0dXNcbiIsCi0JCQlfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0KLQl2cGNvbmZpZyA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQkvKiBDbGVhciBpbml0VkREIGNvcHkgdHJpZ2dlciBiaXQgKi8KLQl2cGNvbmZpZyAmPSB+dmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2luaXR2ZGQ7Ci0JdmRkLT53cml0ZV9yZWcodnBjb25maWcsIHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0JLyogQ2xlYXIgZm9yY2UgYml0ICovCi0JdnBjb25maWcgJj0gfnZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ19mb3JjZXVwZGF0ZTsKLQl2ZGQtPndyaXRlX3JlZyh2cGNvbmZpZywgcHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfdmZzbV9pbml0KHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQpCi17Ci0JLyoKLQkgKiBWb2x0YWdlIE1hbmFnZXIgRlNNIHBhcmFtZXRlcnMgaW5pdAotCSAqIFhYWCBUaGlzIGRhdGEgc2hvdWxkIGJlIHBhc3NlZCBpbiBmcm9tIHRoZSBib2FyZCBmaWxlCi0JICovCi0JdmRkLT53cml0ZV9yZWcoT01BUDNfQ0xLU0VUVVAsIHBybV9tb2Rfb2ZmcywgT01BUDNfUFJNX0NMS1NFVFVQX09GRlNFVCk7Ci0JdmRkLT53cml0ZV9yZWcoT01BUDNfVk9MVE9GRlNFVCwgcHJtX21vZF9vZmZzLAotCQkgICAgICAgT01BUDNfUFJNX1ZPTFRPRkZTRVRfT0ZGU0VUKTsKLQl2ZGQtPndyaXRlX3JlZyhPTUFQM19WT0xUU0VUVVAyLCBwcm1fbW9kX29mZnMsCi0JCSAgICAgICBPTUFQM19QUk1fVk9MVFNFVFVQMl9PRkZTRVQpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfdmNfaW5pdChzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkKQotewotCXN0YXRpYyBib29sIGlzX2luaXRpYWxpemVkOwotCXU4IG9uX3ZzZWwsIG9ubHBfdnNlbCwgcmV0X3ZzZWwsIG9mZl92c2VsOwotCXUzMiB2Y192YWw7Ci0KLQlpZiAoaXNfaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQotCS8qIFNldCB1cCB0aGUgb24sIGluYWN0aXZlLCByZXRlbnRpb24gYW5kIG9mZiB2b2x0YWdlICovCi0Jb25fdnNlbCA9IHZkZC0+cG1pY19pbmZvLT51dl90b192c2VsKHZkZC0+cG1pY19pbmZvLT5vbl92b2x0KTsKLQlvbmxwX3ZzZWwgPSB2ZGQtPnBtaWNfaW5mby0+dXZfdG9fdnNlbCh2ZGQtPnBtaWNfaW5mby0+b25scF92b2x0KTsKLQlyZXRfdnNlbCA9IHZkZC0+cG1pY19pbmZvLT51dl90b192c2VsKHZkZC0+cG1pY19pbmZvLT5yZXRfdm9sdCk7Ci0Jb2ZmX3ZzZWwgPSB2ZGQtPnBtaWNfaW5mby0+dXZfdG9fdnNlbCh2ZGQtPnBtaWNfaW5mby0+b2ZmX3ZvbHQpOwotCXZjX3ZhbAk9ICgob25fdnNlbCA8PCB2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+Y21kX29uX3NoaWZ0KSB8Ci0JCShvbmxwX3ZzZWwgPDwgdmRkLT52Y19kYXRhLT52Y19jb21tb24tPmNtZF9vbmxwX3NoaWZ0KSB8Ci0JCShyZXRfdnNlbCA8PCB2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+Y21kX3JldF9zaGlmdCkgfAotCQkob2ZmX3ZzZWwgPDwgdmRkLT52Y19kYXRhLT52Y19jb21tb24tPmNtZF9vZmZfc2hpZnQpKTsKLQl2ZGQtPndyaXRlX3JlZyh2Y192YWwsIHBybV9tb2Rfb2ZmcywgdmRkLT52Y19kYXRhLT5jbWR2YWxfcmVnKTsKLQotCS8qCi0JICogR2VuZXJpYyBWQyBwYXJhbWV0ZXJzIGluaXQKLQkgKiBYWFggVGhpcyBkYXRhIHNob3VsZCBiZSBhYnN0cmFjdGVkIG91dAotCSAqLwotCXZkZC0+d3JpdGVfcmVnKE9NQVAzNDMwX0NNRDFfTUFTSyB8IE9NQVAzNDMwX1JBVjFfTUFTSywgcHJtX21vZF9vZmZzLAotCQkJT01BUDNfUFJNX1ZDX0NIX0NPTkZfT0ZGU0VUKTsKLQl2ZGQtPndyaXRlX3JlZyhPTUFQMzQzMF9NQ09ERV9TSElGVCB8IE9NQVAzNDMwX0hTRU5fTUFTSywgcHJtX21vZF9vZmZzLAotCQkJT01BUDNfUFJNX1ZDX0kyQ19DRkdfT0ZGU0VUKTsKLQotCW9tYXAzX3Zmc21faW5pdCh2ZGQpOwotCi0JaXNfaW5pdGlhbGl6ZWQgPSB0cnVlOwotfQotCi0KLS8qIE9NQVA0IHNwZWNpZmljIHZvbHRhZ2UgaW5pdCBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwNF92Y19pbml0KHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQpCi17Ci0Jc3RhdGljIGJvb2wgaXNfaW5pdGlhbGl6ZWQ7Ci0JdTMyIHZjX3ZhbDsKLQotCWlmIChpc19pbml0aWFsaXplZCkKLQkJcmV0dXJuOwotCi0JLyogVE9ETzogQ29uZmlndXJlIHNldHVwIHRpbWVzIGFuZCBDTURfVkFMIHZhbHVlcyovCi0KLQkvKgotCSAqIEdlbmVyaWMgVkMgcGFyYW1ldGVycyBpbml0Ci0JICogWFhYIFRoaXMgZGF0YSBzaG91bGQgYmUgYWJzdHJhY3RlZCBvdXQKLQkgKi8KLQl2Y192YWwgPSAoT01BUDQ0MzBfUkFWX1ZERF9NUFVfTF9NQVNLIHwgT01BUDQ0MzBfQ01EX1ZERF9NUFVfTF9NQVNLIHwKLQkJICBPTUFQNDQzMF9SQVZfVkREX0lWQV9MX01BU0sgfCBPTUFQNDQzMF9DTURfVkREX0lWQV9MX01BU0sgfAotCQkgIE9NQVA0NDMwX1JBVl9WRERfQ09SRV9MX01BU0sgfCBPTUFQNDQzMF9DTURfVkREX0NPUkVfTF9NQVNLKTsKLQl2ZGQtPndyaXRlX3JlZyh2Y192YWwsIHBybV9tb2Rfb2ZmcywgT01BUDRfUFJNX1ZDX0NGR19DSEFOTkVMX09GRlNFVCk7Ci0KLQkvKiBYWFggVGhlc2UgYXJlIG1hZ2ljIG51bWJlcnMgYW5kIGRvIG5vdCBiZWxvbmchICovCi0JdmNfdmFsID0gKDB4NjAgPDwgT01BUDQ0MzBfU0NMTF9TSElGVCB8IDB4MjYgPDwgT01BUDQ0MzBfU0NMSF9TSElGVCk7Ci0JdmRkLT53cml0ZV9yZWcodmNfdmFsLCBwcm1fbW9kX29mZnMsIE9NQVA0X1BSTV9WQ19DRkdfSTJDX0NMS19PRkZTRVQpOwotCi0JaXNfaW5pdGlhbGl6ZWQgPSB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF92Y19pbml0KHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQpCi17Ci0JdTMyIHZjX3ZhbDsKLQotCWlmICghdmRkLT5wbWljX2luZm8gfHwgIXZkZC0+cG1pY19pbmZvLT51dl90b192c2VsKSB7Ci0JCXByX2VycigiJXM6IFBNSUMgaW5mbyByZXF1cmllZCB0byBjb25maWd1cmUgdmMgZm9yIgotCQkJInZkZF8lcyBub3QgcG9wdWxhdGVkLkhlbmNlIGNhbm5vdCBpbml0aWFsaXplIHZjXG4iLAotCQkJX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCF2ZGQtPnJlYWRfcmVnIHx8ICF2ZGQtPndyaXRlX3JlZykgewotCQlwcl9lcnIoIiVzOiBObyByZWFkL3dyaXRlIEFQSSBmb3IgYWNjZXNzaW5nIHZkZF8lcyByZWdzXG4iLAotCQkJX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogU2V0IHVwIHRoZSBTTVBTX1NBKGkyYyBzbGF2ZSBhZGRyZXNzIGluIFZDICovCi0JdmNfdmFsID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsCi0JCQkgICAgICAgdmRkLT52Y19kYXRhLT52Y19jb21tb24tPnNtcHNfc2FfcmVnKTsKLQl2Y192YWwgJj0gfnZkZC0+dmNfZGF0YS0+c21wc19zYV9tYXNrOwotCXZjX3ZhbCB8PSB2ZGQtPnBtaWNfaW5mby0+aTJjX3NsYXZlX2FkZHIgPDwgdmRkLT52Y19kYXRhLT5zbXBzX3NhX3NoaWZ0OwotCXZkZC0+d3JpdGVfcmVnKHZjX3ZhbCwgcHJtX21vZF9vZmZzLAotCQkgICAgICAgdmRkLT52Y19kYXRhLT52Y19jb21tb24tPnNtcHNfc2FfcmVnKTsKLQotCS8qIFNldHVwIHRoZSBWT0xSQShwbWljIHJlZyBhZGRyKSBpbiBWQyAqLwotCXZjX3ZhbCA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLAotCQkJICAgICAgIHZkZC0+dmNfZGF0YS0+dmNfY29tbW9uLT5zbXBzX3ZvbHJhX3JlZyk7Ci0JdmNfdmFsICY9IH52ZGQtPnZjX2RhdGEtPnNtcHNfdm9scmFfbWFzazsKLQl2Y192YWwgfD0gdmRkLT5wbWljX2luZm8tPnBtaWNfcmVnIDw8IHZkZC0+dmNfZGF0YS0+c21wc192b2xyYV9zaGlmdDsKLQl2ZGQtPndyaXRlX3JlZyh2Y192YWwsIHBybV9tb2Rfb2ZmcywKLQkJICAgICAgIHZkZC0+dmNfZGF0YS0+dmNfY29tbW9uLT5zbXBzX3ZvbHJhX3JlZyk7Ci0KLQkvKiBDb25maWd1cmUgdGhlIHNldHVwIHRpbWVzICovCi0JdmNfdmFsID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsIHZkZC0+dmZzbS0+dm9sdHNldHVwX3JlZyk7Ci0JdmNfdmFsICY9IH52ZGQtPnZmc20tPnZvbHRzZXR1cF9tYXNrOwotCXZjX3ZhbCB8PSB2ZGQtPnBtaWNfaW5mby0+dm9sdF9zZXR1cF90aW1lIDw8Ci0JCQl2ZGQtPnZmc20tPnZvbHRzZXR1cF9zaGlmdDsKLQl2ZGQtPndyaXRlX3JlZyh2Y192YWwsIHBybV9tb2Rfb2ZmcywgdmRkLT52ZnNtLT52b2x0c2V0dXBfcmVnKTsKLQotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKLQkJb21hcDNfdmNfaW5pdCh2ZGQpOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKQotCQlvbWFwNF92Y19pbml0KHZkZCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfdmRkX2RhdGFfY29uZmlndXJlKHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAoIXZkZC0+cG1pY19pbmZvKSB7Ci0JCXByX2VycigiJXM6IFBNSUMgaW5mbyByZXF1cmllZCB0byBjb25maWd1cmUgdmRkXyVzIG5vdCIKLQkJCSJwb3B1bGF0ZWQuSGVuY2UgY2Fubm90IGluaXRpYWxpemUgdmRkXyVzXG4iLAotCQkJX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUsIHZkZC0+dm9sdGRtLm5hbWUpOwotCQlnb3RvIG92ZGNfb3V0OwotCX0KLQotCWlmIChJU19FUlJfVkFMVUUoX2NvbmZpZ19jb21tb25fdmRkX2RhdGEodmRkKSkpCi0JCWdvdG8gb3ZkY19vdXQ7Ci0KLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJdmRkLT5yZWFkX3JlZyA9IG9tYXAzX3ZvbHRhZ2VfcmVhZF9yZWc7Ci0JCXZkZC0+d3JpdGVfcmVnID0gb21hcDNfdm9sdGFnZV93cml0ZV9yZWc7Ci0JCXJldCA9IDA7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQl2ZGQtPnJlYWRfcmVnID0gb21hcDRfdm9sdGFnZV9yZWFkX3JlZzsKLQkJdmRkLT53cml0ZV9yZWcgPSBvbWFwNF92b2x0YWdlX3dyaXRlX3JlZzsKLQkJcmV0ID0gMDsKLQl9Ci0KLW92ZGNfb3V0OgotCXJldHVybiByZXQ7Ci19CitzdGF0aWMgTElTVF9IRUFEKHZvbHRkbV9saXN0KTsKIAogLyogUHVibGljIGZ1bmN0aW9ucyAqLwogLyoqCi0gKiBvbWFwX3ZvbHRhZ2VfZ2V0X25vbV92b2x0KCkgLSBHZXRzIHRoZSBjdXJyZW50IG5vbi1hdXRvLWNvbXBlbnNhdGVkIHZvbHRhZ2UKLSAqIEB2b2x0ZG06CXBvaW50ZXIgdG8gdGhlIFZERCBmb3Igd2hpY2ggY3VycmVudCB2b2x0YWdlIGluZm8gaXMgbmVlZGVkCisgKiB2b2x0ZG1fZ2V0X3ZvbHRhZ2UoKSAtIEdldHMgdGhlIGN1cnJlbnQgbm9uLWF1dG8tY29tcGVuc2F0ZWQgdm9sdGFnZQorICogQHZvbHRkbToJcG9pbnRlciB0byB0aGUgdm9sdGRtIGZvciB3aGljaCBjdXJyZW50IHZvbHRhZ2UgaW5mbyBpcyBuZWVkZWQKICAqCi0gKiBBUEkgdG8gZ2V0IHRoZSBjdXJyZW50IG5vbi1hdXRvLWNvbXBlbnNhdGVkIHZvbHRhZ2UgZm9yIGEgVkRELgotICogUmV0dXJucyAwIGluIGNhc2Ugb2YgZXJyb3IgZWxzZSByZXR1cm5zIHRoZSBjdXJyZW50IHZvbHRhZ2UgZm9yIHRoZSBWREQuCisgKiBBUEkgdG8gZ2V0IHRoZSBjdXJyZW50IG5vbi1hdXRvLWNvbXBlbnNhdGVkIHZvbHRhZ2UgZm9yIGEgdm9sdGFnZSBkb21haW4uCisgKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBlcnJvciBlbHNlIHJldHVybnMgdGhlIGN1cnJlbnQgdm9sdGFnZS4KICAqLwotdW5zaWduZWQgbG9uZyBvbWFwX3ZvbHRhZ2VfZ2V0X25vbV92b2x0KHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCit1bnNpZ25lZCBsb25nIHZvbHRkbV9nZXRfdm9sdGFnZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQogewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQ7Ci0KIAlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewogCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JdmRkID0gY29udGFpbmVyX29mKHZvbHRkbSwgc3RydWN0IG9tYXBfdmRkX2luZm8sIHZvbHRkbSk7Ci0KLQlyZXR1cm4gdmRkLT5jdXJyX3ZvbHQ7CisJcmV0dXJuIHZvbHRkbS0+bm9taW5hbF92b2x0OwogfQogCiAvKioKLSAqIG9tYXBfdnBfZ2V0X2N1cnJfdm9sdCgpIC0gQVBJIHRvIGdldCB0aGUgY3VycmVudCB2cCB2b2x0YWdlLgotICogQHZvbHRkbToJcG9pbnRlciB0byB0aGUgVkRELgotICoKLSAqIFRoaXMgQVBJIHJldHVybnMgdGhlIGN1cnJlbnQgdm9sdGFnZSBmb3IgdGhlIHNwZWNpZmllZCB2b2x0YWdlIHByb2Nlc3NvcgotICovCi11bnNpZ25lZCBsb25nIG9tYXBfdnBfZ2V0X2N1cnJfdm9sdChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQotewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQ7Ci0JdTggY3Vycl92c2VsOwotCi0JaWYgKCF2b2x0ZG0gfHwgSVNfRVJSKHZvbHRkbSkpIHsKLQkJcHJfd2FybmluZygiJXM6IFZERCBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXZkZCA9IGNvbnRhaW5lcl9vZih2b2x0ZG0sIHN0cnVjdCBvbWFwX3ZkZF9pbmZvLCB2b2x0ZG0pOwotCWlmICghdmRkLT5yZWFkX3JlZykgewotCQlwcl9lcnIoIiVzOiBObyByZWFkIEFQSSBmb3IgcmVhZGluZyB2ZGRfJXMgcmVnc1xuIiwKLQkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljdXJyX3ZzZWwgPSB2ZGQtPnJlYWRfcmVnKHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52b2x0YWdlKTsKLQotCWlmICghdmRkLT5wbWljX2luZm8gfHwgIXZkZC0+cG1pY19pbmZvLT52c2VsX3RvX3V2KSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBQTUlDIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdnNlbCB0byB2b2x0YWdlIgotCQkJImluIHVWIG5vdCByZWdpc3RlcmRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIHZkZC0+cG1pY19pbmZvLT52c2VsX3RvX3V2KGN1cnJfdnNlbCk7Ci19Ci0KLS8qKgotICogb21hcF92cF9lbmFibGUoKSAtIEFQSSB0byBlbmFibGUgYSBwYXJ0aWN1bGFyIFZQCi0gKiBAdm9sdGRtOglwb2ludGVyIHRvIHRoZSBWREQgd2hvc2UgVlAgaXMgdG8gYmUgZW5hYmxlZC4KLSAqCi0gKiBUaGlzIEFQSSBlbmFibGVzIGEgcGFydGljdWxhciB2b2x0YWdlIHByb2Nlc3Nvci4gTmVlZGVkIGJ5IHRoZSBzbWFydHJlZmxleAotICogY2xhc3MgZHJpdmVycy4KLSAqLwotdm9pZCBvbWFwX3ZwX2VuYWJsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQotewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQ7Ci0JdTMyIHZwY29uZmlnOwotCi0JaWYgKCF2b2x0ZG0gfHwgSVNfRVJSKHZvbHRkbSkpIHsKLQkJcHJfd2FybmluZygiJXM6IFZERCBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQl2ZGQgPSBjb250YWluZXJfb2Yodm9sdGRtLCBzdHJ1Y3Qgb21hcF92ZGRfaW5mbywgdm9sdGRtKTsKLQlpZiAoIXZkZC0+cmVhZF9yZWcgfHwgIXZkZC0+d3JpdGVfcmVnKSB7Ci0JCXByX2VycigiJXM6IE5vIHJlYWQvd3JpdGUgQVBJIGZvciBhY2Nlc3NpbmcgdmRkXyVzIHJlZ3NcbiIsCi0JCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIElmIFZQIGlzIGFscmVhZHkgZW5hYmxlZCwgZG8gbm90aGluZy4gUmV0dXJuICovCi0JaWYgKHZkZC0+dnBfZW5hYmxlZCkKLQkJcmV0dXJuOwotCi0JdnBfbGF0Y2hfdnNlbCh2ZGQpOwotCi0JLyogRW5hYmxlIFZQICovCi0JdnBjb25maWcgPSB2ZGQtPnJlYWRfcmVnKHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0JdnBjb25maWcgfD0gdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX3ZwZW5hYmxlOwotCXZkZC0+d3JpdGVfcmVnKHZwY29uZmlnLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCXZkZC0+dnBfZW5hYmxlZCA9IHRydWU7Ci19Ci0KLS8qKgotICogb21hcF92cF9kaXNhYmxlKCkgLSBBUEkgdG8gZGlzYWJsZSBhIHBhcnRpY3VsYXIgVlAKLSAqIEB2b2x0ZG06CXBvaW50ZXIgdG8gdGhlIFZERCB3aG9zZSBWUCBpcyB0byBiZSBkaXNhYmxlZC4KLSAqCi0gKiBUaGlzIEFQSSBkaXNhYmxlcyBhIHBhcnRpY3VsYXIgdm9sdGFnZSBwcm9jZXNzb3IuIE5lZWRlZCBieSB0aGUgc21hcnRyZWZsZXgKLSAqIGNsYXNzIGRyaXZlcnMuCi0gKi8KLXZvaWQgb21hcF92cF9kaXNhYmxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCi17Ci0Jc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZDsKLQl1MzIgdnBjb25maWc7Ci0JaW50IHRpbWVvdXQ7Ci0KLQlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewotCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXZkZCA9IGNvbnRhaW5lcl9vZih2b2x0ZG0sIHN0cnVjdCBvbWFwX3ZkZF9pbmZvLCB2b2x0ZG0pOwotCWlmICghdmRkLT5yZWFkX3JlZyB8fCAhdmRkLT53cml0ZV9yZWcpIHsKLQkJcHJfZXJyKCIlczogTm8gcmVhZC93cml0ZSBBUEkgZm9yIGFjY2Vzc2luZyB2ZGRfJXMgcmVnc1xuIiwKLQkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSWYgVlAgaXMgYWxyZWFkeSBkaXNhYmxlZCwgZG8gbm90aGluZy4gUmV0dXJuICovCi0JaWYgKCF2ZGQtPnZwX2VuYWJsZWQpIHsKLQkJcHJfd2FybmluZygiJXM6IFRyeWluZyB0byBkaXNhYmxlIFZQIGZvciB2ZGRfJXMgd2hlbiIKLQkJCSJpdCBpcyBhbHJlYWR5IGRpc2FibGVkXG4iLCBfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIERpc2FibGUgVlAgKi8KLQl2cGNvbmZpZyA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQl2cGNvbmZpZyAmPSB+dmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX3ZwZW5hYmxlOwotCXZkZC0+d3JpdGVfcmVnKHZwY29uZmlnLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCi0JLyoKLQkgKiBXYWl0IGZvciBWUCBpZGxlIFR5cGljYWwgbGF0ZW5jeSBpcyA8MnVzLiBNYXhpbXVtIGxhdGVuY3kgaXMgfjEwMHVzCi0JICovCi0Jb21hcF90ZXN0X3RpbWVvdXQoKHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZzdGF0dXMpKSwKLQkJCQlWUF9JRExFX1RJTUVPVVQsIHRpbWVvdXQpOwotCi0JaWYgKHRpbWVvdXQgPj0gVlBfSURMRV9USU1FT1VUKQotCQlwcl93YXJuaW5nKCIlczogdmRkXyVzIGlkbGUgdGltZWRvdXRcbiIsCi0JCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKLQotCXZkZC0+dnBfZW5hYmxlZCA9IGZhbHNlOwotCi0JcmV0dXJuOwotfQotCi0vKioKLSAqIG9tYXBfdm9sdGFnZV9zY2FsZV92ZGQoKSAtIEFQSSB0byBzY2FsZSB2b2x0YWdlIG9mIGEgcGFydGljdWxhcgotICoJCQkJdm9sdGFnZSBkb21haW4uCi0gKiBAdm9sdGRtOglwb2ludGVyIHRvIHRoZSBWREQgd2hpY2ggaXMgdG8gYmUgc2NhbGVkLgotICogQHRhcmdldF92b2x0OglUaGUgdGFyZ2V0IHZvbHRhZ2Ugb2YgdGhlIHZvbHRhZ2UgZG9tYWluCisgKiB2b2x0ZG1fc2NhbGUoKSAtIEFQSSB0byBzY2FsZSB2b2x0YWdlIG9mIGEgcGFydGljdWxhciB2b2x0YWdlIGRvbWFpbi4KKyAqIEB2b2x0ZG06IHBvaW50ZXIgdG8gdGhlIHZvbHRhZ2UgZG9tYWluIHdoaWNoIGlzIHRvIGJlIHNjYWxlZC4KKyAqIEB0YXJnZXRfdm9sdDogVGhlIHRhcmdldCB2b2x0YWdlIG9mIHRoZSB2b2x0YWdlIGRvbWFpbgogICoKICAqIFRoaXMgQVBJIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGtlcm5lbCB0byBkbyB0aGUgdm9sdGFnZSBzY2FsaW5nCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHZvbHRhZ2UgZG9tYWluIGR1cmluZyBkdmZzIG9yIGFueSBvdGhlciBzaXR1YXRpb24uCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHZvbHRhZ2UgZG9tYWluIGR1cmluZyBEVkZTLgogICovCi1pbnQgb21hcF92b2x0YWdlX3NjYWxlX3ZkZChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAotCQl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KQoraW50IHZvbHRkbV9zY2FsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkgdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCkKIHsKLQlzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkOworCWludCByZXQ7CiAKIAlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewogCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JdmRkID0gY29udGFpbmVyX29mKHZvbHRkbSwgc3RydWN0IG9tYXBfdmRkX2luZm8sIHZvbHRkbSk7Ci0KLQlpZiAoIXZkZC0+dm9sdF9zY2FsZSkgeworCWlmICghdm9sdGRtLT5zY2FsZSkgewogCQlwcl9lcnIoIiVzOiBObyB2b2x0YWdlIHNjYWxlIEFQSSByZWdpc3RlcmVkIGZvciB2ZGRfJXNcbiIsCiAJCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKIAkJcmV0dXJuIC1FTk9EQVRBOwogCX0KIAotCXJldHVybiB2ZGQtPnZvbHRfc2NhbGUodmRkLCB0YXJnZXRfdm9sdCk7CisJcmV0ID0gdm9sdGRtLT5zY2FsZSh2b2x0ZG0sIHRhcmdldF92b2x0KTsKKwlpZiAoIXJldCkKKwkJdm9sdGRtLT5ub21pbmFsX3ZvbHQgPSB0YXJnZXRfdm9sdDsKKworCXJldHVybiByZXQ7CiB9CiAKIC8qKgotICogb21hcF92b2x0YWdlX3Jlc2V0KCkgLSBSZXNldHMgdGhlIHZvbHRhZ2Ugb2YgYSBwYXJ0aWN1bGFyIHZvbHRhZ2UgZG9tYWluCi0gKgkJCXRvIHRoYXQgb2YgdGhlIGN1cnJlbnQgT1BQLgotICogQHZvbHRkbToJcG9pbnRlciB0byB0aGUgVkREIHdob3NlIHZvbHRhZ2UgaXMgdG8gYmUgcmVzZXQuCisgKiB2b2x0ZG1fcmVzZXQoKSAtIFJlc2V0cyB0aGUgdm9sdGFnZSBvZiBhIHBhcnRpY3VsYXIgdm9sdGFnZSBkb21haW4KKyAqCQkgICAgdG8gdGhhdCBvZiB0aGUgY3VycmVudCBPUFAuCisgKiBAdm9sdGRtOiBwb2ludGVyIHRvIHRoZSB2b2x0YWdlIGRvbWFpbiB3aG9zZSB2b2x0YWdlIGlzIHRvIGJlIHJlc2V0LgogICoKICAqIFRoaXMgQVBJIGZpbmRzIG91dCB0aGUgY29ycmVjdCB2b2x0YWdlIHRoZSB2b2x0YWdlIGRvbWFpbiBpcyBzdXBwb3NlZAogICogdG8gYmUgYXQgYW5kIHJlc2V0cyB0aGUgdm9sdGFnZSB0byB0aGF0IGxldmVsLiBTaG91bGQgYmUgdXNlZCBlc3BlY2lhbGx5CiAgKiB3aGlsZSBkaXNhYmxpbmcgYW55IHZvbHRhZ2UgY29tcGVuc2F0aW9uIG1vZHVsZXMuCiAgKi8KLXZvaWQgb21hcF92b2x0YWdlX3Jlc2V0KHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCit2b2lkIHZvbHRkbV9yZXNldChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQogewotCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X3V2ZGM7CisJdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdDsKIAogCWlmICghdm9sdGRtIHx8IElTX0VSUih2b2x0ZG0pKSB7CiAJCXByX3dhcm5pbmcoIiVzOiBWREQgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0IVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCi0JdGFyZ2V0X3V2ZGMgPSBvbWFwX3ZvbHRhZ2VfZ2V0X25vbV92b2x0KHZvbHRkbSk7Ci0JaWYgKCF0YXJnZXRfdXZkYykgeworCXRhcmdldF92b2x0ID0gdm9sdGRtX2dldF92b2x0YWdlKHZvbHRkbSk7CisJaWYgKCF0YXJnZXRfdm9sdCkgewogCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZmluZCBjdXJyZW50IHZvbHRhZ2UgZm9yIHZkZF8lc1xuIiwKIAkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOwogCQlyZXR1cm47CiAJfQogCi0Jb21hcF92b2x0YWdlX3NjYWxlX3ZkZCh2b2x0ZG0sIHRhcmdldF91dmRjKTsKKwl2b2x0ZG1fc2NhbGUodm9sdGRtLCB0YXJnZXRfdm9sdCk7CiB9CiAKIC8qKgpAQCAtODg0LDE4ICsxMzQsMTQgQEAKICAqCiAgKi8KIHZvaWQgb21hcF92b2x0YWdlX2dldF92b2x0dGFibGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKLQkJc3RydWN0IG9tYXBfdm9sdF9kYXRhICoqdm9sdF9kYXRhKQorCQkJCXN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAqKnZvbHRfZGF0YSkKIHsKLQlzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkOwotCiAJaWYgKCF2b2x0ZG0gfHwgSVNfRVJSKHZvbHRkbSkpIHsKIAkJcHJfd2FybmluZygiJXM6IFZERCBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKLQl2ZGQgPSBjb250YWluZXJfb2Yodm9sdGRtLCBzdHJ1Y3Qgb21hcF92ZGRfaW5mbywgdm9sdGRtKTsKLQotCSp2b2x0X2RhdGEgPSB2ZGQtPnZvbHRfZGF0YTsKKwkqdm9sdF9kYXRhID0gdm9sdGRtLT52b2x0X2RhdGE7CiB9CiAKIC8qKgpAQCAtOTE0LDkgKzE2MCw4IEBACiAgKiBkb21haW4gb3IgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgZW50cnkuCiAgKi8KIHN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAqb21hcF92b2x0YWdlX2dldF92b2x0ZGF0YShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAotCQl1bnNpZ25lZCBsb25nIHZvbHQpCisJCQkJCQkgdW5zaWduZWQgbG9uZyB2b2x0KQogewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQ7CiAJaW50IGk7CiAKIAlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewpAQCAtOTI0LDE3ICsxNjksMTUgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCi0JdmRkID0gY29udGFpbmVyX29mKHZvbHRkbSwgc3RydWN0IG9tYXBfdmRkX2luZm8sIHZvbHRkbSk7Ci0KLQlpZiAoIXZkZC0+dm9sdF9kYXRhKSB7CisJaWYgKCF2b2x0ZG0tPnZvbHRfZGF0YSkgewogCQlwcl93YXJuaW5nKCIlczogdm9sdGFnZSB0YWJsZSBkb2VzIG5vdCBleGlzdCBmb3IgdmRkXyVzXG4iLAogCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyB2ZGQtPnZvbHRfZGF0YVtpXS52b2x0X25vbWluYWwgIT0gMDsgaSsrKSB7Ci0JCWlmICh2ZGQtPnZvbHRfZGF0YVtpXS52b2x0X25vbWluYWwgPT0gdm9sdCkKLQkJCXJldHVybiAmdmRkLT52b2x0X2RhdGFbaV07CisJZm9yIChpID0gMDsgdm9sdGRtLT52b2x0X2RhdGFbaV0udm9sdF9ub21pbmFsICE9IDA7IGkrKykgeworCQlpZiAodm9sdGRtLT52b2x0X2RhdGFbaV0udm9sdF9ub21pbmFsID09IHZvbHQpCisJCQlyZXR1cm4gJnZvbHRkbS0+dm9sdF9kYXRhW2ldOwogCX0KIAogCXByX25vdGljZSgiJXM6IFVuYWJsZSB0byBtYXRjaCB0aGUgY3VycmVudCB2b2x0YWdlIHdpdGggdGhlIHZvbHRhZ2UiCkBAIC05NDcsNTQgKzE5MCwyNSBAQAogICogb21hcF92b2x0YWdlX3JlZ2lzdGVyX3BtaWMoKSAtIEFQSSB0byByZWdpc3RlciBQTUlDIHNwZWNpZmljIGRhdGEKICAqIEB2b2x0ZG06CXBvaW50ZXIgdG8gdGhlIFZERCBmb3Igd2hpY2ggdGhlIFBNSUMgc3BlY2lmaWMgZGF0YSBpcwogICoJCXRvIGJlIHJlZ2lzdGVyZWQKLSAqIEBwbWljX2luZm86CXRoZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBwbWljIGluZm8KKyAqIEBwbWljOgl0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG1pYyBpbmZvCiAgKgogICogVGhpcyBBUEkgaXMgdG8gYmUgY2FsbGVkIGJ5IHRoZSBTT0MvUE1JQyBmaWxlIHRvIHNwZWNpZnkgdGhlCi0gKiBwbWljIHNwZWNpZmljIGluZm8gYXMgcHJlc2VudCBpbiBvbWFwX3ZvbHRfcG1pY19pbmZvIHN0cnVjdHVyZS4KKyAqIHBtaWMgc3BlY2lmaWMgaW5mbyBhcyBwcmVzZW50IGluIG9tYXBfdm9sdGRtX3BtaWMgc3RydWN0dXJlLgogICovCiBpbnQgb21hcF92b2x0YWdlX3JlZ2lzdGVyX3BtaWMoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKLQkJc3RydWN0IG9tYXBfdm9sdF9wbWljX2luZm8gKnBtaWNfaW5mbykKKwkJCSAgICAgICBzdHJ1Y3Qgb21hcF92b2x0ZG1fcG1pYyAqcG1pYykKIHsKLQlzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkOwotCiAJaWYgKCF2b2x0ZG0gfHwgSVNfRVJSKHZvbHRkbSkpIHsKIAkJcHJfd2FybmluZygiJXM6IFZERCBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXZkZCA9IGNvbnRhaW5lcl9vZih2b2x0ZG0sIHN0cnVjdCBvbWFwX3ZkZF9pbmZvLCB2b2x0ZG0pOwotCi0JdmRkLT5wbWljX2luZm8gPSBwbWljX2luZm87CisJdm9sdGRtLT5wbWljID0gcG1pYzsKIAogCXJldHVybiAwOwogfQogCiAvKioKLSAqIG9tYXBfdm9sdGFnZV9nZXRfZGJnZGlyKCkgLSBBUEkgdG8gZ2V0IHBvaW50ZXIgdG8gdGhlIGRlYnVnZnMgZGlyZWN0b3J5Ci0gKgkJCQljb3JyZXNwb25kaW5nIHRvIGEgdm9sdGFnZSBkb21haW4uCi0gKgotICogQHZvbHRkbToJcG9pbnRlciB0byB0aGUgVkREIHdob3NlIGRlYnVnIGRpcmVjdG9yeSBpcyByZXF1aXJlZC4KLSAqCi0gKiBUaGlzIEFQSSByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGRlYnVnZnMgZGlyZWN0b3J5IGNvcnJlc3BvbmRpbmcKLSAqIHRvIHRoZSB2b2x0YWdlIGRvbWFpbi4gU2hvdWxkIGJlIHVzZWQgYnkgZHJpdmVycyByZXF1aXJpbmcgdG8KLSAqIGFkZCBhbnkgZGVidWcgZW50cnkgZm9yIGEgcGFydGljdWxhciB2b2x0YWdlIGRvbWFpbi4gUmV0dXJucyBOVUxMCi0gKiBpbiBjYXNlIG9mIGVycm9yLgotICovCi1zdHJ1Y3QgZGVudHJ5ICpvbWFwX3ZvbHRhZ2VfZ2V0X2RiZ2RpcihzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQotewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQ7Ci0KLQlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewotCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JdmRkID0gY29udGFpbmVyX29mKHZvbHRkbSwgc3RydWN0IG9tYXBfdmRkX2luZm8sIHZvbHRkbSk7Ci0KLQlyZXR1cm4gdmRkLT5kZWJ1Z19kaXI7Ci19Ci0KLS8qKgogICogb21hcF9jaGFuZ2Vfdm9sdHNjYWxlX21ldGhvZCgpIC0gQVBJIHRvIGNoYW5nZSB0aGUgdm9sdGFnZSBzY2FsaW5nIG1ldGhvZC4KICAqIEB2b2x0ZG06CXBvaW50ZXIgdG8gdGhlIFZERCB3aG9zZSB2b2x0YWdlIHNjYWxpbmcgbWV0aG9kCiAgKgkJaGFzIHRvIGJlIGNoYW5nZWQuCkBAIC0xMDA1LDIzICsyMTksMTkgQEAKICAqIGRlZmluZWQgaW4gdm9sdGFnZS5oCiAgKi8KIHZvaWQgb21hcF9jaGFuZ2Vfdm9sdHNjYWxlX21ldGhvZChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAotCQlpbnQgdm9sdHNjYWxlX21ldGhvZCkKKwkJCQkgIGludCB2b2x0c2NhbGVfbWV0aG9kKQogewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQ7Ci0KIAlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewogCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAotCXZkZCA9IGNvbnRhaW5lcl9vZih2b2x0ZG0sIHN0cnVjdCBvbWFwX3ZkZF9pbmZvLCB2b2x0ZG0pOwotCiAJc3dpdGNoICh2b2x0c2NhbGVfbWV0aG9kKSB7CiAJY2FzZSBWT0xUU0NBTEVfVlBGT1JDRVVQREFURToKLQkJdmRkLT52b2x0X3NjYWxlID0gdnBfZm9yY2V1cGRhdGVfc2NhbGVfdm9sdGFnZTsKKwkJdm9sdGRtLT5zY2FsZSA9IG9tYXBfdnBfZm9yY2V1cGRhdGVfc2NhbGU7CiAJCXJldHVybjsKIAljYXNlIFZPTFRTQ0FMRV9WQ0JZUEFTUzoKLQkJdmRkLT52b2x0X3NjYWxlID0gdmNfYnlwYXNzX3NjYWxlX3ZvbHRhZ2U7CisJCXZvbHRkbS0+c2NhbGUgPSBvbWFwX3ZjX2J5cGFzc19zY2FsZTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCXByX3dhcm5pbmcoIiVzOiBUcnlpbmcgdG8gY2hhbmdlIHRoZSBtZXRob2Qgb2Ygdm9sdGFnZSBzY2FsaW5nIgpAQCAtMTAzMCwzOCArMjQwLDYgQEAKIH0KIAogLyoqCi0gKiBvbWFwX3ZvbHRhZ2VfZG9tYWluX2xvb2t1cCgpIC0gQVBJIHRvIGdldCB0aGUgdm9sdGFnZSBkb21haW4gcG9pbnRlcgotICogQG5hbWU6CU5hbWUgb2YgdGhlIHZvbHRhZ2UgZG9tYWluCi0gKgotICogVGhpcyBBUEkgbG9va3MgdXAgaW4gdGhlIGdsb2JhbCB2ZGRfaW5mbyBzdHJ1Y3QgZm9yIHRoZQotICogZXhpc3RlbmNlIG9mIHZvbHRhZ2UgZG9tYWluIDxuYW1lPi4gSWYgaXQgZXhpc3RzLCB0aGUgQVBJIHJldHVybnMKLSAqIGEgcG9pbnRlciB0byB0aGUgdm9sdGFnZSBkb21haW4gc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gKiBWREQ8bmFtZT4uIEVsc2UgcmV0dW5zIGVycm9yIHBvaW50ZXIuCi0gKi8KLXN0cnVjdCB2b2x0YWdlZG9tYWluICpvbWFwX3ZvbHRhZ2VfZG9tYWluX2xvb2t1cChjaGFyICpuYW1lKQotewotCWludCBpOwotCi0JaWYgKCF2ZGRfaW5mbykgewotCQlwcl9lcnIoIiVzOiBWb2x0YWdlIGRyaXZlciBpbml0IG5vdCB5ZXQgaGFwcGVuZWQuRmF1bHRpbmchXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQl9Ci0KLQlpZiAoIW5hbWUpIHsKLQkJcHJfZXJyKCIlczogTm8gbmFtZSB0byBnZXQgdGhlIHZvdGFnZSBkb21haW4hXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBucl9zY2FsYWJsZV92ZGQ7IGkrKykgewotCQlpZiAoIShzdHJjbXAobmFtZSwgdmRkX2luZm9baV0tPnZvbHRkbS5uYW1lKSkpCi0JCQlyZXR1cm4gJnZkZF9pbmZvW2ldLT52b2x0ZG07Ci0JfQotCi0JcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci19Ci0KLS8qKgogICogb21hcF92b2x0YWdlX2xhdGVfaW5pdCgpIC0gSW5pdCB0aGUgdmFyaW91cyB2b2x0YWdlIHBhcmFtZXRlcnMKICAqCiAgKiBUaGlzIEFQSSBpcyB0byBiZSBjYWxsZWQgaW4gdGhlIGxhdGVyIHN0YWdlcyBvZiB0aGUKQEAgLTEwNzAsMzcgKzI0OCwxODQgQEAKICAqLwogaW50IF9faW5pdCBvbWFwX3ZvbHRhZ2VfbGF0ZV9pbml0KHZvaWQpCiB7Ci0JaW50IGk7CisJc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbTsKIAotCWlmICghdmRkX2luZm8pIHsKKwlpZiAobGlzdF9lbXB0eSgmdm9sdGRtX2xpc3QpKSB7CiAJCXByX2VycigiJXM6IFZvbHRhZ2UgZHJpdmVyIHN1cHBvcnQgbm90IGFkZGVkXG4iLAogCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl2b2x0YWdlX2RpciA9IGRlYnVnZnNfY3JlYXRlX2Rpcigidm9sdGFnZSIsIE5VTEwpOwotCWlmIChJU19FUlIodm9sdGFnZV9kaXIpKQotCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gY3JlYXRlIHZvbHRhZ2UgZGVidWdmcyBtYWluIGRpclxuIiwKLQkJCV9fZnVuY19fKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnJfc2NhbGFibGVfdmRkOyBpKyspIHsKLQkJaWYgKG9tYXBfdmRkX2RhdGFfY29uZmlndXJlKHZkZF9pbmZvW2ldKSkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZvbHRkbSwgJnZvbHRkbV9saXN0LCBub2RlKSB7CisJCXN0cnVjdCBjbGsgKnN5c19jazsKKworCQlpZiAoIXZvbHRkbS0+c2NhbGFibGUpCiAJCQljb250aW51ZTsKLQkJb21hcF92Y19pbml0KHZkZF9pbmZvW2ldKTsKLQkJdnBfaW5pdCh2ZGRfaW5mb1tpXSk7Ci0JCXZkZF9kZWJ1Z2ZzX2luaXQodmRkX2luZm9baV0pOworCisJCXN5c19jayA9IGNsa19nZXQoTlVMTCwgdm9sdGRtLT5zeXNfY2xrLm5hbWUpOworCQlpZiAoSVNfRVJSKHN5c19jaykpIHsKKwkJCXByX3dhcm5pbmcoIiVzOiBDb3VsZCBub3QgZ2V0IHN5cyBjbGsuXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl2b2x0ZG0tPnN5c19jbGsucmF0ZSA9IGNsa19nZXRfcmF0ZShzeXNfY2spOworCQlXQVJOX09OKCF2b2x0ZG0tPnN5c19jbGsucmF0ZSk7CisJCWNsa19wdXQoc3lzX2NrKTsKKworCQlpZiAodm9sdGRtLT52YykgeworCQkJdm9sdGRtLT5zY2FsZSA9IG9tYXBfdmNfYnlwYXNzX3NjYWxlOworCQkJb21hcF92Y19pbml0X2NoYW5uZWwodm9sdGRtKTsKKwkJfQorCisJCWlmICh2b2x0ZG0tPnZwKSB7CisJCQl2b2x0ZG0tPnNjYWxlID0gb21hcF92cF9mb3JjZXVwZGF0ZV9zY2FsZTsKKwkJCW9tYXBfdnBfaW5pdCh2b2x0ZG0pOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLS8qIFhYWCBkb2N1bWVudCAqLwotaW50IF9faW5pdCBvbWFwX3ZvbHRhZ2VfZWFybHlfaW5pdChzMTYgcHJtX21vZCwgczE2IHBybV9pcnFzdF9vY3BfbW9kLAotCQkJCSAgIHN0cnVjdCBvbWFwX3ZkZF9pbmZvICpvbWFwX3ZkZF9hcnJheVtdLAotCQkJCSAgIHU4IG9tYXBfdmRkX2NvdW50KQorc3RhdGljIHN0cnVjdCB2b2x0YWdlZG9tYWluICpfdm9sdGRtX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQogewotCXBybV9tb2Rfb2ZmcyA9IHBybV9tb2Q7Ci0JcHJtX2lycXN0X29jcF9tb2Rfb2ZmcyA9IHBybV9pcnFzdF9vY3BfbW9kOwotCXZkZF9pbmZvID0gb21hcF92ZGRfYXJyYXk7Ci0JbnJfc2NhbGFibGVfdmRkID0gb21hcF92ZGRfY291bnQ7CisJc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwgKnRlbXBfdm9sdGRtOworCisJdm9sdGRtID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcF92b2x0ZG0sICZ2b2x0ZG1fbGlzdCwgbm9kZSkgeworCQlpZiAoIXN0cmNtcChuYW1lLCB0ZW1wX3ZvbHRkbS0+bmFtZSkpIHsKKwkJCXZvbHRkbSA9IHRlbXBfdm9sdGRtOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gdm9sdGRtOworfQorCisvKioKKyAqIHZvbHRkbV9hZGRfcHdyZG0gLSBhZGQgYSBwb3dlcmRvbWFpbiB0byBhIHZvbHRhZ2Vkb21haW4KKyAqIEB2b2x0ZG06IHN0cnVjdCB2b2x0YWdlZG9tYWluICogdG8gYWRkIHRoZSBwb3dlcmRvbWFpbiB0bworICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKiB0byBhc3NvY2lhdGUgd2l0aCBhIHZvbHRhZ2Vkb21haW4KKyAqCisgKiBBc3NvY2lhdGUgdGhlIHBvd2VyZG9tYWluIEBwd3JkbSB3aXRoIGEgdm9sdGFnZWRvbWFpbiBAdm9sdGRtLiAgVGhpcworICogZW5hYmxlcyB0aGUgdXNlIG9mIHZvbHRkbV9mb3JfZWFjaF9wd3JkbSgpLiAgUmV0dXJucyAtRUlOVkFMIGlmCisgKiBwcmVzZW50ZWQgd2l0aCBpbnZhbGlkIHBvaW50ZXJzOyAtRU5PTUVNIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkOworICogb3IgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCB2b2x0ZG1fYWRkX3B3cmRtKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pCit7CisJaWYgKCF2b2x0ZG0gfHwgIXB3cmRtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByX2RlYnVnKCJ2b2x0YWdlZG9tYWluOiBhc3NvY2lhdGluZyBwb3dlcmRvbWFpbiAlcyB3aXRoIHZvbHRhZ2Vkb21haW4gIgorCQkgIiVzXG4iLCBwd3JkbS0+bmFtZSwgdm9sdGRtLT5uYW1lKTsKKworCWxpc3RfYWRkKCZwd3JkbS0+dm9sdGRtX25vZGUsICZ2b2x0ZG0tPnB3cmRtX2xpc3QpOworCiAJcmV0dXJuIDA7CiB9CisKKy8qKgorICogdm9sdGRtX2Zvcl9lYWNoX3B3cmRtIC0gY2FsbCBmdW5jdGlvbiBmb3IgZWFjaCBwd3JkbSBpbiBhIHZvbHRkbQorICogQHZvbHRkbTogc3RydWN0IHZvbHRhZ2Vkb21haW4gKiB0byBpdGVyYXRlIG92ZXIKKyAqIEBmbjogY2FsbGJhY2sgZnVuY3Rpb24gKgorICoKKyAqIENhbGwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIEBmbiBmb3IgZWFjaCBwb3dlcmRvbWFpbiBpbiB0aGUKKyAqIHZvbHRhZ2Vkb21haW4gQHZvbHRkbS4gIFJldHVybnMgLUVJTlZBTCBpZiBwcmVzZW50ZWQgd2l0aCBpbnZhbGlkCisgKiBwb2ludGVyczsgb3IgcGFzc2VzIGFsb25nIHRoZSBsYXN0IHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sKKyAqIGZ1bmN0aW9uLCB3aGljaCBzaG91bGQgYmUgMCBmb3Igc3VjY2VzcyBvciBhbnl0aGluZyBlbHNlIHRvCisgKiBpbmRpY2F0ZSBmYWlsdXJlLgorICovCitpbnQgdm9sdGRtX2Zvcl9lYWNoX3B3cmRtKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQkgIGludCAoKmZuKShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkJCSAgICBzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKSkKK3sKKwlzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtOworCWludCByZXQgPSAwOworCisJaWYgKCFmbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB3cmRtLCAmdm9sdGRtLT5wd3JkbV9saXN0LCB2b2x0ZG1fbm9kZSkKKwkJcmV0ID0gKCpmbikodm9sdGRtLCBwd3JkbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHZvbHRkbV9mb3JfZWFjaCAtIGNhbGwgZnVuY3Rpb24gb24gZWFjaCByZWdpc3RlcmVkIHZvbHRhZ2Vkb21haW4KKyAqIEBmbjogY2FsbGJhY2sgZnVuY3Rpb24gKgorICoKKyAqIENhbGwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIEBmbiBmb3IgZWFjaCByZWdpc3RlcmVkIHZvbHRhZ2Vkb21haW4uCisgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gQGZuIGNhbiByZXR1cm4gYW55dGhpbmcgYnV0IDAgdG8gYmFpbCBvdXQKKyAqIGVhcmx5IGZyb20gdGhlIGl0ZXJhdG9yLiAgUmV0dXJucyB0aGUgbGFzdCByZXR1cm4gdmFsdWUgb2YgdGhlCisgKiBjYWxsYmFjayBmdW5jdGlvbiwgd2hpY2ggc2hvdWxkIGJlIDAgZm9yIHN1Y2Nlc3Mgb3IgYW55dGhpbmcgZWxzZQorICogdG8gaW5kaWNhdGUgZmFpbHVyZTsgb3IgLUVJTlZBTCBpZiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpcyBudWxsLgorICovCitpbnQgdm9sdGRtX2Zvcl9lYWNoKGludCAoKmZuKShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLCB2b2lkICp1c2VyKSwKKwkJICAgIHZvaWQgKnVzZXIpCit7CisJc3RydWN0IHZvbHRhZ2Vkb21haW4gKnRlbXBfdm9sdGRtOworCWludCByZXQgPSAwOworCisJaWYgKCFmbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlbXBfdm9sdGRtLCAmdm9sdGRtX2xpc3QsIG5vZGUpIHsKKwkJcmV0ID0gKCpmbikodGVtcF92b2x0ZG0sIHVzZXIpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfdm9sdGRtX3JlZ2lzdGVyKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCit7CisJaWYgKCF2b2x0ZG0gfHwgIXZvbHRkbS0+bmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlJTklUX0xJU1RfSEVBRCgmdm9sdGRtLT5wd3JkbV9saXN0KTsKKwlsaXN0X2FkZCgmdm9sdGRtLT5ub2RlLCAmdm9sdGRtX2xpc3QpOworCisJcHJfZGVidWcoInZvbHRhZ2Vkb21haW46IHJlZ2lzdGVyZWQgJXNcbiIsIHZvbHRkbS0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2b2x0ZG1fbG9va3VwIC0gbG9vayB1cCBhIHZvbHRhZ2Vkb21haW4gYnkgbmFtZSwgcmV0dXJuIGEgcG9pbnRlcgorICogQG5hbWU6IG5hbWUgb2Ygdm9sdGFnZWRvbWFpbgorICoKKyAqIEZpbmQgYSByZWdpc3RlcmVkIHZvbHRhZ2Vkb21haW4gYnkgaXRzIG5hbWUgQG5hbWUuICBSZXR1cm5zIGEgcG9pbnRlcgorICogdG8gdGhlIHN0cnVjdCB2b2x0YWdlZG9tYWluIGlmIGZvdW5kLCBvciBOVUxMIG90aGVyd2lzZS4KKyAqLworc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtIDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwl2b2x0ZG0gPSBfdm9sdGRtX2xvb2t1cChuYW1lKTsKKworCXJldHVybiB2b2x0ZG07Cit9CisKKy8qKgorICogdm9sdGRtX2luaXQgLSBzZXQgdXAgdGhlIHZvbHRhZ2Vkb21haW4gbGF5ZXIKKyAqIEB2b2x0ZG1fbGlzdDogYXJyYXkgb2Ygc3RydWN0IHZvbHRhZ2Vkb21haW4gcG9pbnRlcnMgdG8gcmVnaXN0ZXIKKyAqCisgKiBMb29wIHRocm91Z2ggdGhlIGFycmF5IG9mIHZvbHRhZ2Vkb21haW5zIEB2b2x0ZG1fbGlzdCwgcmVnaXN0ZXJpbmcgYWxsCisgKiB0aGF0IGFyZSBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgQ1BVLiBJZiB2b2x0ZG1fbGlzdCBpcyBzdXBwbGllZAorICogYW5kIG5vdCBudWxsLCBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgdm9sdGFnZWRvbWFpbnMgd2lsbCBiZQorICogcmVnaXN0ZXJlZC4gIE5vIHJldHVybiB2YWx1ZS4KKyAqLwordm9pZCB2b2x0ZG1faW5pdChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqKnZvbHRkbXMpCit7CisJc3RydWN0IHZvbHRhZ2Vkb21haW4gKip2OworCisJaWYgKHZvbHRkbXMpIHsKKwkJZm9yICh2ID0gdm9sdGRtczsgKnY7IHYrKykKKwkJCV92b2x0ZG1fcmVnaXN0ZXIoKnYpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZS5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlLmgKaW5kZXggZTlmNTQwOC4uMTZhMWIwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlLmgKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlICJ2Yy5oIgogI2luY2x1ZGUgInZwLmgiCiAKK3N0cnVjdCBwb3dlcmRvbWFpbjsKKwogLyogWFhYIGRvY3VtZW50ICovCiAjZGVmaW5lIFZPTFRTQ0FMRV9WUEZPUkNFVVBEQVRFCQkxCiAjZGVmaW5lIFZPTFRTQ0FMRV9WQ0JZUEFTUwkJMgpAQCAtMzIsMjkgKzM0LDYwIEBACiAjZGVmaW5lIE9NQVAzX1ZPTFRTRVRVUDIJMHhmZgogCiAvKioKLSAqIHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2VfZGF0YSAtIHBlci12b2x0YWdlIG1hbmFnZXIgRlNNIHJlZ2lzdGVyL2JpdGZpZWxkCisgKiBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlIC0gcGVyLXZvbHRhZ2UgbWFuYWdlciBGU00gcmVnaXN0ZXIvYml0ZmllbGQKICAqIGRhdGEKICAqIEB2b2x0c2V0dXBfbWFzazogU0VUVVBfVElNRSogYml0bWFzayBpbiB0aGUgUFJNX1ZPTFRTRVRVUCogcmVnaXN0ZXIKICAqIEB2b2x0c2V0dXBfcmVnOiByZWdpc3RlciBvZmZzZXQgb2YgUFJNX1ZPTFRTRVRVUCBmcm9tIFBSTSBiYXNlCi0gKiBAdm9sdHNldHVwX3NoaWZ0OiBTRVRVUF9USU1FKiBmaWVsZCBzaGlmdCBpbiB0aGUgUFJNX1ZPTFRTRVRVUCogcmVnaXN0ZXIKICAqCiAgKiBYWFggV2hhdCBhYm91dCBWT0xUT0ZGU0VUL1ZPTFRDVFJMPwotICogWFhYIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gaGF2ZSBib3RoIGEgX21hc2sgYW5kIGEgX3NoaWZ0IGZvciB0aGUgc2FtZQotICogICAgIGJpdGZpZWxkIC0gcmVtb3ZlIG9uZSEKICAqLwotc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZV9kYXRhIHsKK3N0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2UgewogCXUzMiB2b2x0c2V0dXBfbWFzazsKIAl1OCB2b2x0c2V0dXBfcmVnOwotCXU4IHZvbHRzZXR1cF9zaGlmdDsKIH07CiAKIC8qKgogICogc3RydWN0IHZvbHRhZ2Vkb21haW4gLSBvbWFwIHZvbHRhZ2UgZG9tYWluIGdsb2JhbCBzdHJ1Y3R1cmUuCi0gKiBAbmFtZToJTmFtZSBvZiB0aGUgdm9sdGFnZSBkb21haW4gd2hpY2ggY2FuIGJlIHVzZWQgYXMgYSB1bmlxdWUKLSAqCQlpZGVudGlmaWVyLgorICogQG5hbWU6IE5hbWUgb2YgdGhlIHZvbHRhZ2UgZG9tYWluIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIuCisgKiBAc2NhbGFibGU6IFdoZXRoZXIgb3Igbm90IHRoaXMgdm9sdGFnZSBkb21haW4gaXMgc2NhbGFibGUKKyAqIEBub2RlOiBsaXN0X2hlYWQgbGlua2luZyBhbGwgdm9sdGFnZSBkb21haW5zCisgKiBAcHdyZG1fbGlzdDogbGlzdF9oZWFkIGxpbmtpbmcgYWxsIHBvd2VyZG9tYWlucyBpbiB0aGlzIHZvbHRhZ2Vkb21haW4KKyAqIEB2YzogcG9pbnRlciB0byBWQyBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZvbHRhZ2Vkb21haW4KKyAqIEB2cDogcG9pbnRlciB0byBWUCBhc3NvY2lhdGVkIHdpdGggdGhpcyB2b2x0YWdlZG9tYWluCisgKiBAcmVhZDogcmVhZCBhIFZDL1ZQIHJlZ2lzdGVyCisgKiBAd3JpdGU6IHdyaXRlIGEgVkMvVlAgcmVnaXN0ZXIKKyAqIEByZWFkOiByZWFkLW1vZGlmeS13cml0ZSBhIFZDL1ZQIHJlZ2lzdGVyCisgKiBAc3lzX2Nsazogc3lzdGVtIGNsb2NrIG5hbWUvZnJlcXVlbmN5LCB1c2VkIGZvciB2YXJpb3VzIHRpbWluZyBjYWxjdWxhdGlvbnMKKyAqIEBzY2FsZTogZnVuY3Rpb24gdXNlZCB0byBzY2FsZSB0aGUgdm9sdGFnZSBvZiB0aGUgdm9sdGFnZWRvbWFpbgorICogQG5vbWluYWxfdm9sdDogY3VycmVudCBub21pbmFsIHZvbHRhZ2UgZm9yIHRoaXMgdm9sdGFnZSBkb21haW4KKyAqIEB2b2x0X2RhdGE6IHZvbHRhZ2UgdGFibGUgaGF2aW5nIHRoZSBkaXN0aW5jdCB2b2x0YWdlcyBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgIGJ5IHRoZSBkb21haW4gYW5kIG90aGVyIGFzc29jaWF0ZWQgcGVyIHZvbHRhZ2UgZGF0YS4KICAqLwogc3RydWN0IHZvbHRhZ2Vkb21haW4gewogCWNoYXIgKm5hbWU7CisJYm9vbCBzY2FsYWJsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCBwd3JkbV9saXN0OworCXN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgKnZjOworCWNvbnN0IHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2UgKnZmc207CisJc3RydWN0IG9tYXBfdnBfaW5zdGFuY2UgKnZwOworCXN0cnVjdCBvbWFwX3ZvbHRkbV9wbWljICpwbWljOworCisJLyogVkMvVlAgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9uczogU29DIHNwZWNpZmljICovCisJdTMyICgqcmVhZCkgKHU4IG9mZnNldCk7CisJdm9pZCAoKndyaXRlKSAodTMyIHZhbCwgdTggb2Zmc2V0KTsKKwl1MzIgKCpybXcpKHUzMiBtYXNrLCB1MzIgYml0cywgdTggb2Zmc2V0KTsKKworCXVuaW9uIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJdTMyIHJhdGU7CisJfSBzeXNfY2xrOworCisJaW50ICgqc2NhbGUpIChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KTsKKworCXUzMiBub21pbmFsX3ZvbHQ7CisJc3RydWN0IG9tYXBfdm9sdF9kYXRhICp2b2x0X2RhdGE7CiB9OwogCiAvKioKQEAgLTc3LDEzICsxMTAsMTggQEAKIH07CiAKIC8qKgotICogc3RydWN0IG9tYXBfdm9sdF9wbWljX2luZm8gLSBQTUlDIHNwZWNpZmljIGRhdGEgcmVxdWlyZWQgYnkgdm9sdGFnZSBkcml2ZXIuCisgKiBzdHJ1Y3Qgb21hcF92b2x0ZG1fcG1pYyAtIFBNSUMgc3BlY2lmaWMgZGF0YSByZXF1aXJlZCBieSB2b2x0YWdlIGRyaXZlci4KICAqIEBzbGV3X3JhdGU6CVBNSUMgc2xldyByYXRlIChpbiB1di91cykKICAqIEBzdGVwX3NpemU6CVBNSUMgdm9sdGFnZSBzdGVwIHNpemUgKGluIHV2KQorICogQGkyY19zbGF2ZV9hZGRyOiBJMkMgc2xhdmUgYWRkcmVzcyBvZiBQTUlDCisgKiBAdm9sdF9yZWdfYWRkcjogdm9sdGFnZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBjbWRfcmVnX2FkZHI6IGNvbW1hbmQgKG9uLCBvbi1MUCwgcmV0LCBvZmYpIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYWRkcmVzcworICogQGkyY19oaWdoX3NwZWVkOiB3aGV0aGVyIFZDIHVzZXMgSTJDIGhpZ2gtc3BlZWQgbW9kZSB0byBQTUlDCisgKiBAaTJjX21jb2RlOiBtYXN0ZXIgY29kZSB2YWx1ZSBmb3IgSTJDIGhpZ2gtc3BlZWQgcHJlYW1ibGUgdHJhbnNtaXNzaW9uCiAgKiBAdnNlbF90b191djoJUE1JQyBBUEkgdG8gY29udmVydCB2c2VsIHZhbHVlIHRvIGFjdHVhbCB2b2x0YWdlIGluIHVWLgogICogQHV2X3RvX3ZzZWw6CVBNSUMgQVBJIHRvIGNvbnZlcnQgdm9sdGFnZSBpbiB1ViB0byB2c2VsIHZhbHVlLgogICovCi1zdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyB7CitzdHJ1Y3Qgb21hcF92b2x0ZG1fcG1pYyB7CiAJaW50IHNsZXdfcmF0ZTsKIAlpbnQgc3RlcF9zaXplOwogCXUzMiBvbl92b2x0OwpAQCAtOTEsOTQgKzEyOSw0NCBAQAogCXUzMiByZXRfdm9sdDsKIAl1MzIgb2ZmX3ZvbHQ7CiAJdTE2IHZvbHRfc2V0dXBfdGltZTsKKwl1MTYgaTJjX3NsYXZlX2FkZHI7CisJdTE2IHZvbHRfcmVnX2FkZHI7CisJdTE2IGNtZF9yZWdfYWRkcjsKIAl1OCB2cF9lcnJvcm9mZnNldDsKIAl1OCB2cF92c3RlcG1pbjsKIAl1OCB2cF92c3RlcG1heDsKIAl1OCB2cF92ZGRtaW47CiAJdTggdnBfdmRkbWF4OwogCXU4IHZwX3RpbWVvdXRfdXM7Ci0JdTggaTJjX3NsYXZlX2FkZHI7Ci0JdTggcG1pY19yZWc7CisJYm9vbCBpMmNfaGlnaF9zcGVlZDsKKwl1OCBpMmNfbWNvZGU7CiAJdW5zaWduZWQgbG9uZyAoKnZzZWxfdG9fdXYpIChjb25zdCB1OCB2c2VsKTsKIAl1OCAoKnV2X3RvX3ZzZWwpICh1bnNpZ25lZCBsb25nIHVWKTsKIH07CiAKLS8qKgotICogb21hcF92ZGRfaW5mbyAtIFBlciBWb2x0YWdlIERvbWFpbiBpbmZvCi0gKgotICogQHZvbHRfZGF0YQkJOiB2b2x0YWdlIHRhYmxlIGhhdmluZyB0aGUgZGlzdGluY3Qgdm9sdGFnZXMgc3VwcG9ydGVkCi0gKgkJCSAgYnkgdGhlIGRvbWFpbiBhbmQgb3RoZXIgYXNzb2NpYXRlZCBwZXIgdm9sdGFnZSBkYXRhLgotICogQHBtaWNfaW5mbwkJOiBwbWljIHNwZWNpZmljIHBhcmFtZXRlcnMgd2hpY2ggc2hvdWxkIGJlIHBvcHVsdGVkIGJ5Ci0gKgkJCSAgdGhlIHBtaWMgZHJpdmVycy4KLSAqIEB2cF9kYXRhCQk6IHRoZSByZWdpc3RlciB2YWx1ZXMsIHNoaWZ0cywgbWFza3MgZm9yIHZhcmlvdXMKLSAqCQkJICB2cCByZWdpc3RlcnMKLSAqIEB2cF9ydF9kYXRhICAgICAgICAgIDogVlAgZGF0YSBkZXJpdmVkIGF0IHJ1bnRpbWUsIG5vdCBwcmVkZWZpbmVkCi0gKiBAdmNfZGF0YQkJOiBzdHJ1Y3R1cmUgY29udGFpbmluZyB2YXJpb3VzIHZhcmlvdXMgdmMgcmVnaXN0ZXJzLAotICoJCQkgIHNoaWZ0cywgbWFza3MgZXRjLgotICogQHZmc20gICAgICAgICAgICAgICAgOiB2b2x0YWdlIG1hbmFnZXIgRlNNIGRhdGEKLSAqIEB2b2x0ZG0JCTogcG9pbnRlciB0byB0aGUgdm9sdGFnZSBkb21haW4gc3RydWN0dXJlCi0gKiBAZGVidWdfZGlyCQk6IGRlYnVnIGRpcmVjdG9yeSBmb3IgdGhpcyB2b2x0YWdlIGRvbWFpbi4KLSAqIEBjdXJyX3ZvbHQJCTogY3VycmVudCB2b2x0YWdlIGZvciB0aGlzIHZkZC4KLSAqIEB2cF9lbmFibGVkCQk6IGZsYWcgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHZwIGlzIGVuYWJsZWQgb3Igbm90Ci0gKiBAdm9sdF9zY2FsZQkJOiBBUEkgdG8gc2NhbGUgdGhlIHZvbHRhZ2Ugb2YgdGhlIHZkZC4KLSAqLwotc3RydWN0IG9tYXBfdmRkX2luZm8gewotCXN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAqdm9sdF9kYXRhOwotCXN0cnVjdCBvbWFwX3ZvbHRfcG1pY19pbmZvICpwbWljX2luZm87Ci0Jc3RydWN0IG9tYXBfdnBfaW5zdGFuY2VfZGF0YSAqdnBfZGF0YTsKLQlzdHJ1Y3Qgb21hcF92cF9ydW50aW1lX2RhdGEgdnBfcnRfZGF0YTsKLQlzdHJ1Y3Qgb21hcF92Y19pbnN0YW5jZV9kYXRhICp2Y19kYXRhOwotCWNvbnN0IHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2VfZGF0YSAqdmZzbTsKLQlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiB2b2x0ZG07Ci0Jc3RydWN0IGRlbnRyeSAqZGVidWdfZGlyOwotCXUzMiBjdXJyX3ZvbHQ7Ci0JYm9vbCB2cF9lbmFibGVkOwotCXUzMiAoKnJlYWRfcmVnKSAodTE2IG1vZCwgdTggb2Zmc2V0KTsKLQl2b2lkICgqd3JpdGVfcmVnKSAodTMyIHZhbCwgdTE2IG1vZCwgdTggb2Zmc2V0KTsKLQlpbnQgKCp2b2x0X3NjYWxlKSAoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCwKLQkJdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCk7Ci19OwotCi11bnNpZ25lZCBsb25nIG9tYXBfdnBfZ2V0X2N1cnJfdm9sdChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKLXZvaWQgb21hcF92cF9lbmFibGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSk7Ci12b2lkIG9tYXBfdnBfZGlzYWJsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKLWludCBvbWFwX3ZvbHRhZ2Vfc2NhbGVfdmRkKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCi0JCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpOwotdm9pZCBvbWFwX3ZvbHRhZ2VfcmVzZXQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSk7CiB2b2lkIG9tYXBfdm9sdGFnZV9nZXRfdm9sdHRhYmxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCiAJCXN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAqKnZvbHRfZGF0YSk7CiBzdHJ1Y3Qgb21hcF92b2x0X2RhdGEgKm9tYXBfdm9sdGFnZV9nZXRfdm9sdGRhdGEoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKIAkJdW5zaWduZWQgbG9uZyB2b2x0KTsKLXVuc2lnbmVkIGxvbmcgb21hcF92b2x0YWdlX2dldF9ub21fdm9sdChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKLXN0cnVjdCBkZW50cnkgKm9tYXBfdm9sdGFnZV9nZXRfZGJnZGlyKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pOwotaW50IF9faW5pdCBvbWFwX3ZvbHRhZ2VfZWFybHlfaW5pdChzMTYgcHJtX21vZCwgczE2IHBybV9pcnFzdF9tb2QsCi0JCQkJICAgc3RydWN0IG9tYXBfdmRkX2luZm8gKm9tYXBfdmRkX2FycmF5W10sCi0JCQkJICAgdTggb21hcF92ZGRfY291bnQpOwotI2lmZGVmIENPTkZJR19QTQogaW50IG9tYXBfdm9sdGFnZV9yZWdpc3Rlcl9wbWljKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCi0JCXN0cnVjdCBvbWFwX3ZvbHRfcG1pY19pbmZvICpwbWljX2luZm8pOworCQkJICAgICAgIHN0cnVjdCBvbWFwX3ZvbHRkbV9wbWljICpwbWljKTsKIHZvaWQgb21hcF9jaGFuZ2Vfdm9sdHNjYWxlX21ldGhvZChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAogCQlpbnQgdm9sdHNjYWxlX21ldGhvZCk7Ci0vKiBBUEkgdG8gZ2V0IHRoZSB2b2x0YWdlZG9tYWluIHBvaW50ZXIgKi8KLXN0cnVjdCB2b2x0YWdlZG9tYWluICpvbWFwX3ZvbHRhZ2VfZG9tYWluX2xvb2t1cChjaGFyICpuYW1lKTsKLQogaW50IG9tYXBfdm9sdGFnZV9sYXRlX2luaXQodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgb21hcF92b2x0YWdlX3JlZ2lzdGVyX3BtaWMoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKLQkJc3RydWN0IG9tYXBfdm9sdF9wbWljX2luZm8gKnBtaWNfaW5mbykKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLXN0YXRpYyBpbmxpbmUgIHZvaWQgb21hcF9jaGFuZ2Vfdm9sdHNjYWxlX21ldGhvZChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAotCQlpbnQgdm9sdHNjYWxlX21ldGhvZCkge30KLXN0YXRpYyBpbmxpbmUgaW50IG9tYXBfdm9sdGFnZV9sYXRlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZvbHRhZ2Vkb21haW4gKm9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci19Ci0jZW5kaWYKIAorZXh0ZXJuIHZvaWQgb21hcDJ4eHhfdm9sdGFnZWRvbWFpbnNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9tYXAzeHh4X3ZvbHRhZ2Vkb21haW5zX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwNDR4eF92b2x0YWdlZG9tYWluc19pbml0KHZvaWQpOworCitzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgdm9sdGRtX2luaXQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKip2b2x0ZG1fbGlzdCk7CitpbnQgdm9sdGRtX2FkZF9wd3JkbShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLCBzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKTsKK2ludCB2b2x0ZG1fZm9yX2VhY2goaW50ICgqZm4pKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sIHZvaWQgKnVzZXIpLAorCQkgICAgdm9pZCAqdXNlcik7CitpbnQgdm9sdGRtX2Zvcl9lYWNoX3B3cmRtKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQkgIGludCAoKmZuKShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkJCSAgICBzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKSk7CitpbnQgdm9sdGRtX3NjYWxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpOwordm9pZCB2b2x0ZG1fcmVzZXQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSk7Cit1bnNpZ25lZCBsb25nIHZvbHRkbV9nZXRfdm9sdGFnZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlZG9tYWluczJ4eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlZG9tYWluczJ4eHhfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDEzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2Vkb21haW5zMnh4eF9kYXRhLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIE9NQVAzIHZvbHRhZ2UgZG9tYWluIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAidm9sdGFnZS5oIgorCitzdGF0aWMgc3RydWN0IHZvbHRhZ2Vkb21haW4gb21hcDJfdm9sdGRtX2NvcmUgPSB7CisJLm5hbWUgPSAiY29yZSIsCit9OworCitzdGF0aWMgc3RydWN0IHZvbHRhZ2Vkb21haW4gb21hcDJfdm9sdGRtX3drdXAgPSB7CisJLm5hbWUgPSAid2FrZXVwIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGFnZWRvbWFpbnNfb21hcDJbXSBfX2luaXRkYXRhID0geworCSZvbWFwMl92b2x0ZG1fY29yZSwKKwkmb21hcDJfdm9sdGRtX3drdXAsCisJTlVMTCwKK307CisKK3ZvaWQgX19pbml0IG9tYXAyeHh4X3ZvbHRhZ2Vkb21haW5zX2luaXQodm9pZCkKK3sKKwl2b2x0ZG1faW5pdCh2b2x0YWdlZG9tYWluc19vbWFwMik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2Vkb21haW5zM3h4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2Vkb21haW5zM3h4eF9kYXRhLmMKaW5kZXggZGVmMjMwZi4uMDcxMTAxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlZG9tYWluczN4eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZWRvbWFpbnMzeHh4X2RhdGEuYwpAQCAtMzEsNjUgKzMxLDcwIEBACiAgKiBWREQgZGF0YQogICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlX2RhdGEgb21hcDNfdmRkMV92ZnNtX2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZSBvbWFwM192ZGQxX3Zmc20gPSB7CiAJLnZvbHRzZXR1cF9yZWcgPSBPTUFQM19QUk1fVk9MVFNFVFVQMV9PRkZTRVQsCi0JLnZvbHRzZXR1cF9zaGlmdCA9IE9NQVAzNDMwX1NFVFVQX1RJTUUxX1NISUZULAogCS52b2x0c2V0dXBfbWFzayA9IE9NQVAzNDMwX1NFVFVQX1RJTUUxX01BU0ssCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfdmRkX2luZm8gb21hcDNfdmRkMV9pbmZvID0gewotCS52cF9kYXRhID0gJm9tYXAzX3ZwMV9kYXRhLAotCS52Y19kYXRhID0gJm9tYXAzX3ZjMV9kYXRhLAotCS52ZnNtID0gJm9tYXAzX3ZkZDFfdmZzbV9kYXRhLAotCS52b2x0ZG0gPSB7Ci0JCS5uYW1lID0gIm1wdSIsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlX2RhdGEgb21hcDNfdmRkMl92ZnNtX2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZSBvbWFwM192ZGQyX3Zmc20gPSB7CiAJLnZvbHRzZXR1cF9yZWcgPSBPTUFQM19QUk1fVk9MVFNFVFVQMV9PRkZTRVQsCi0JLnZvbHRzZXR1cF9zaGlmdCA9IE9NQVAzNDMwX1NFVFVQX1RJTUUyX1NISUZULAogCS52b2x0c2V0dXBfbWFzayA9IE9NQVAzNDMwX1NFVFVQX1RJTUUyX01BU0ssCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfdmRkX2luZm8gb21hcDNfdmRkMl9pbmZvID0gewotCS52cF9kYXRhID0gJm9tYXAzX3ZwMl9kYXRhLAotCS52Y19kYXRhID0gJm9tYXAzX3ZjMl9kYXRhLAotCS52ZnNtID0gJm9tYXAzX3ZkZDJfdmZzbV9kYXRhLAotCS52b2x0ZG0gPSB7Ci0JCS5uYW1lID0gImNvcmUiLAotCX0sCitzdGF0aWMgc3RydWN0IHZvbHRhZ2Vkb21haW4gb21hcDNfdm9sdGRtX21wdSA9IHsKKwkubmFtZSA9ICJtcHVfaXZhIiwKKwkuc2NhbGFibGUgPSB0cnVlLAorCS5yZWFkID0gb21hcDNfcHJtX3ZjdnBfcmVhZCwKKwkud3JpdGUgPSBvbWFwM19wcm1fdmN2cF93cml0ZSwKKwkucm13ID0gb21hcDNfcHJtX3ZjdnBfcm13LAorCS52YyA9ICZvbWFwM192Y19tcHUsCisJLnZmc20gPSAmb21hcDNfdmRkMV92ZnNtLAorCS52cCA9ICZvbWFwM192cF9tcHUsCiB9OwogCi0vKiBPTUFQMyBWREQgc3RydWN0dXJlcyAqLwotc3RhdGljIHN0cnVjdCBvbWFwX3ZkZF9pbmZvICpvbWFwM192ZGRfaW5mb1tdID0gewotCSZvbWFwM192ZGQxX2luZm8sCi0JJm9tYXAzX3ZkZDJfaW5mbywKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiBvbWFwM192b2x0ZG1fY29yZSA9IHsKKwkubmFtZSA9ICJjb3JlIiwKKwkuc2NhbGFibGUgPSB0cnVlLAorCS5yZWFkID0gb21hcDNfcHJtX3ZjdnBfcmVhZCwKKwkud3JpdGUgPSBvbWFwM19wcm1fdmN2cF93cml0ZSwKKwkucm13ID0gb21hcDNfcHJtX3ZjdnBfcm13LAorCS52YyA9ICZvbWFwM192Y19jb3JlLAorCS52ZnNtID0gJm9tYXAzX3ZkZDJfdmZzbSwKKwkudnAgPSAmb21hcDNfdnBfY29yZSwKIH07CiAKLS8qIE9NQVAzIHNwZWNpZmljIHZvbHRhZ2UgaW5pdCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgX19pbml0IG9tYXAzeHh4X3ZvbHRhZ2VfZWFybHlfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCB2b2x0YWdlZG9tYWluIG9tYXAzX3ZvbHRkbV93a3VwID0geworCS5uYW1lID0gIndha2V1cCIsCit9OworCitzdGF0aWMgc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRhZ2Vkb21haW5zX29tYXAzW10gX19pbml0ZGF0YSA9IHsKKwkmb21hcDNfdm9sdGRtX21wdSwKKwkmb21hcDNfdm9sdGRtX2NvcmUsCisJJm9tYXAzX3ZvbHRkbV93a3VwLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqc3lzX2Nsa19uYW1lIF9faW5pdGRhdGEgPSAic3lzX2NrIjsKKwordm9pZCBfX2luaXQgb21hcDN4eHhfdm9sdGFnZWRvbWFpbnNfaW5pdCh2b2lkKQogewotCXMxNiBwcm1fbW9kID0gT01BUDM0MzBfR1JfTU9EOwotCXMxNiBwcm1faXJxc3Rfb2NwX21vZCA9IE9DUF9NT0Q7Ci0KLQlpZiAoIWNwdV9pc19vbWFwMzR4eCgpKQotCQlyZXR1cm4gMDsKKwlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtOworCWludCBpOwogCiAJLyoKIAkgKiBYWFggV2lsbCBkZXBlbmQgb24gdGhlIHByb2Nlc3MsIHZhbGlkYXRpb24sIGFuZCBiaW5uaW5nCiAJICogZm9yIHRoZSBjdXJyZW50bHktcnVubmluZyBJQwogCSAqLwogCWlmIChjcHVfaXNfb21hcDM2MzAoKSkgewotCQlvbWFwM192ZGQxX2luZm8udm9sdF9kYXRhID0gb21hcDM2eHhfdmRkbXB1X3ZvbHRfZGF0YTsKLQkJb21hcDNfdmRkMl9pbmZvLnZvbHRfZGF0YSA9IG9tYXAzNnh4X3ZkZGNvcmVfdm9sdF9kYXRhOworCQlvbWFwM192b2x0ZG1fbXB1LnZvbHRfZGF0YSA9IG9tYXAzNnh4X3ZkZG1wdV92b2x0X2RhdGE7CisJCW9tYXAzX3ZvbHRkbV9jb3JlLnZvbHRfZGF0YSA9IG9tYXAzNnh4X3ZkZGNvcmVfdm9sdF9kYXRhOwogCX0gZWxzZSB7Ci0JCW9tYXAzX3ZkZDFfaW5mby52b2x0X2RhdGEgPSBvbWFwMzR4eF92ZGRtcHVfdm9sdF9kYXRhOwotCQlvbWFwM192ZGQyX2luZm8udm9sdF9kYXRhID0gb21hcDM0eHhfdmRkY29yZV92b2x0X2RhdGE7CisJCW9tYXAzX3ZvbHRkbV9tcHUudm9sdF9kYXRhID0gb21hcDM0eHhfdmRkbXB1X3ZvbHRfZGF0YTsKKwkJb21hcDNfdm9sdGRtX2NvcmUudm9sdF9kYXRhID0gb21hcDM0eHhfdmRkY29yZV92b2x0X2RhdGE7CiAJfQogCi0JcmV0dXJuIG9tYXBfdm9sdGFnZV9lYXJseV9pbml0KHBybV9tb2QsIHBybV9pcnFzdF9vY3BfbW9kLAotCQkJCSAgICAgICBvbWFwM192ZGRfaW5mbywKLQkJCQkgICAgICAgQVJSQVlfU0laRShvbWFwM192ZGRfaW5mbykpOworCWZvciAoaSA9IDA7IHZvbHRkbSA9IHZvbHRhZ2Vkb21haW5zX29tYXAzW2ldLCB2b2x0ZG07IGkrKykKKwkJdm9sdGRtLT5zeXNfY2xrLm5hbWUgPSBzeXNfY2xrX25hbWU7CisKKwl2b2x0ZG1faW5pdCh2b2x0YWdlZG9tYWluc19vbWFwMyk7CiB9OwotY29yZV9pbml0Y2FsbChvbWFwM3h4eF92b2x0YWdlX2Vhcmx5X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlZG9tYWluczQ0eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlZG9tYWluczQ0eHhfZGF0YS5jCmluZGV4IGNiNjQ5OTYuLmM0NTg0ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZWRvbWFpbnM0NHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2Vkb21haW5zNDR4eF9kYXRhLmMKQEAgLTMyLDcxICszMiw4MCBAQAogI2luY2x1ZGUgInZjLmgiCiAjaW5jbHVkZSAidnAuaCIKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2VfZGF0YSBvbWFwNF92ZGRfbXB1X3Zmc21fZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlIG9tYXA0X3ZkZF9tcHVfdmZzbSA9IHsKIAkudm9sdHNldHVwX3JlZyA9IE9NQVA0X1BSTV9WT0xUU0VUVVBfTVBVX1JFVF9TTEVFUF9PRkZTRVQsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfdmRkX2luZm8gb21hcDRfdmRkX21wdV9pbmZvID0gewotCS52cF9kYXRhID0gJm9tYXA0X3ZwX21wdV9kYXRhLAotCS52Y19kYXRhID0gJm9tYXA0X3ZjX21wdV9kYXRhLAotCS52ZnNtID0gJm9tYXA0X3ZkZF9tcHVfdmZzbV9kYXRhLAotCS52b2x0ZG0gPSB7Ci0JCS5uYW1lID0gIm1wdSIsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlX2RhdGEgb21hcDRfdmRkX2l2YV92ZnNtX2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZSBvbWFwNF92ZGRfaXZhX3Zmc20gPSB7CiAJLnZvbHRzZXR1cF9yZWcgPSBPTUFQNF9QUk1fVk9MVFNFVFVQX0lWQV9SRVRfU0xFRVBfT0ZGU0VULAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX3ZkZF9pbmZvIG9tYXA0X3ZkZF9pdmFfaW5mbyA9IHsKLQkudnBfZGF0YSA9ICZvbWFwNF92cF9pdmFfZGF0YSwKLQkudmNfZGF0YSA9ICZvbWFwNF92Y19pdmFfZGF0YSwKLQkudmZzbSA9ICZvbWFwNF92ZGRfaXZhX3Zmc21fZGF0YSwKLQkudm9sdGRtID0gewotCQkubmFtZSA9ICJpdmEiLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZV9kYXRhIG9tYXA0X3ZkZF9jb3JlX3Zmc21fZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlIG9tYXA0X3ZkZF9jb3JlX3Zmc20gPSB7CiAJLnZvbHRzZXR1cF9yZWcgPSBPTUFQNF9QUk1fVk9MVFNFVFVQX0NPUkVfUkVUX1NMRUVQX09GRlNFVCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF92ZGRfaW5mbyBvbWFwNF92ZGRfY29yZV9pbmZvID0gewotCS52cF9kYXRhID0gJm9tYXA0X3ZwX2NvcmVfZGF0YSwKLQkudmNfZGF0YSA9ICZvbWFwNF92Y19jb3JlX2RhdGEsCi0JLnZmc20gPSAmb21hcDRfdmRkX2NvcmVfdmZzbV9kYXRhLAotCS52b2x0ZG0gPSB7Ci0JCS5uYW1lID0gImNvcmUiLAotCX0sCitzdGF0aWMgc3RydWN0IHZvbHRhZ2Vkb21haW4gb21hcDRfdm9sdGRtX21wdSA9IHsKKwkubmFtZSA9ICJtcHUiLAorCS5zY2FsYWJsZSA9IHRydWUsCisJLnJlYWQgPSBvbWFwNF9wcm1fdmN2cF9yZWFkLAorCS53cml0ZSA9IG9tYXA0X3BybV92Y3ZwX3dyaXRlLAorCS5ybXcgPSBvbWFwNF9wcm1fdmN2cF9ybXcsCisJLnZjID0gJm9tYXA0X3ZjX21wdSwKKwkudmZzbSA9ICZvbWFwNF92ZGRfbXB1X3Zmc20sCisJLnZwID0gJm9tYXA0X3ZwX21wdSwKIH07CiAKLS8qIE9NQVA0IFZERCBzdHJ1Y3R1cmVzICovCi1zdGF0aWMgc3RydWN0IG9tYXBfdmRkX2luZm8gKm9tYXA0X3ZkZF9pbmZvW10gPSB7Ci0JJm9tYXA0X3ZkZF9tcHVfaW5mbywKLQkmb21hcDRfdmRkX2l2YV9pbmZvLAotCSZvbWFwNF92ZGRfY29yZV9pbmZvLAorc3RhdGljIHN0cnVjdCB2b2x0YWdlZG9tYWluIG9tYXA0X3ZvbHRkbV9pdmEgPSB7CisJLm5hbWUgPSAiaXZhIiwKKwkuc2NhbGFibGUgPSB0cnVlLAorCS5yZWFkID0gb21hcDRfcHJtX3ZjdnBfcmVhZCwKKwkud3JpdGUgPSBvbWFwNF9wcm1fdmN2cF93cml0ZSwKKwkucm13ID0gb21hcDRfcHJtX3ZjdnBfcm13LAorCS52YyA9ICZvbWFwNF92Y19pdmEsCisJLnZmc20gPSAmb21hcDRfdmRkX2l2YV92ZnNtLAorCS52cCA9ICZvbWFwNF92cF9pdmEsCiB9OwogCi0vKiBPTUFQNCBzcGVjaWZpYyB2b2x0YWdlIGluaXQgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwNDR4eF92b2x0YWdlX2Vhcmx5X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiBvbWFwNF92b2x0ZG1fY29yZSA9IHsKKwkubmFtZSA9ICJjb3JlIiwKKwkuc2NhbGFibGUgPSB0cnVlLAorCS5yZWFkID0gb21hcDRfcHJtX3ZjdnBfcmVhZCwKKwkud3JpdGUgPSBvbWFwNF9wcm1fdmN2cF93cml0ZSwKKwkucm13ID0gb21hcDRfcHJtX3ZjdnBfcm13LAorCS52YyA9ICZvbWFwNF92Y19jb3JlLAorCS52ZnNtID0gJm9tYXA0X3ZkZF9jb3JlX3Zmc20sCisJLnZwID0gJm9tYXA0X3ZwX2NvcmUsCit9OworCitzdGF0aWMgc3RydWN0IHZvbHRhZ2Vkb21haW4gb21hcDRfdm9sdGRtX3drdXAgPSB7CisJLm5hbWUgPSAid2FrZXVwIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGFnZWRvbWFpbnNfb21hcDRbXSBfX2luaXRkYXRhID0geworCSZvbWFwNF92b2x0ZG1fbXB1LAorCSZvbWFwNF92b2x0ZG1faXZhLAorCSZvbWFwNF92b2x0ZG1fY29yZSwKKwkmb21hcDRfdm9sdGRtX3drdXAsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpzeXNfY2xrX25hbWUgX19pbml0ZGF0YSA9ICJzeXNfY2xraW5fY2siOworCit2b2lkIF9faW5pdCBvbWFwNDR4eF92b2x0YWdlZG9tYWluc19pbml0KHZvaWQpCiB7Ci0JczE2IHBybV9tb2QgPSBPTUFQNDQzMF9QUk1fREVWSUNFX0lOU1Q7Ci0JczE2IHBybV9pcnFzdF9vY3BfbW9kID0gT01BUDQ0MzBfUFJNX09DUF9TT0NLRVRfSU5TVDsKLQotCWlmICghY3B1X2lzX29tYXA0NHh4KCkpCi0JCXJldHVybiAwOworCXN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG07CisJaW50IGk7CiAKIAkvKgogCSAqIFhYWCBXaWxsIGRlcGVuZCBvbiB0aGUgcHJvY2VzcywgdmFsaWRhdGlvbiwgYW5kIGJpbm5pbmcKIAkgKiBmb3IgdGhlIGN1cnJlbnRseS1ydW5uaW5nIElDCiAJICovCi0Jb21hcDRfdmRkX21wdV9pbmZvLnZvbHRfZGF0YSA9IG9tYXA0NHh4X3ZkZF9tcHVfdm9sdF9kYXRhOwotCW9tYXA0X3ZkZF9pdmFfaW5mby52b2x0X2RhdGEgPSBvbWFwNDR4eF92ZGRfaXZhX3ZvbHRfZGF0YTsKLQlvbWFwNF92ZGRfY29yZV9pbmZvLnZvbHRfZGF0YSA9IG9tYXA0NHh4X3ZkZF9jb3JlX3ZvbHRfZGF0YTsKKwlvbWFwNF92b2x0ZG1fbXB1LnZvbHRfZGF0YSA9IG9tYXA0NHh4X3ZkZF9tcHVfdm9sdF9kYXRhOworCW9tYXA0X3ZvbHRkbV9pdmEudm9sdF9kYXRhID0gb21hcDQ0eHhfdmRkX2l2YV92b2x0X2RhdGE7CisJb21hcDRfdm9sdGRtX2NvcmUudm9sdF9kYXRhID0gb21hcDQ0eHhfdmRkX2NvcmVfdm9sdF9kYXRhOwogCi0JcmV0dXJuIG9tYXBfdm9sdGFnZV9lYXJseV9pbml0KHBybV9tb2QsIHBybV9pcnFzdF9vY3BfbW9kLAotCQkJCSAgICAgICBvbWFwNF92ZGRfaW5mbywKLQkJCQkgICAgICAgQVJSQVlfU0laRShvbWFwNF92ZGRfaW5mbykpOworCWZvciAoaSA9IDA7IHZvbHRkbSA9IHZvbHRhZ2Vkb21haW5zX29tYXA0W2ldLCB2b2x0ZG07IGkrKykKKwkJdm9sdGRtLT5zeXNfY2xrLm5hbWUgPSBzeXNfY2xrX25hbWU7CisKKwl2b2x0ZG1faW5pdCh2b2x0YWdlZG9tYWluc19vbWFwNCk7CiB9OwotY29yZV9pbml0Y2FsbChvbWFwNDR4eF92b2x0YWdlX2Vhcmx5X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92cC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YmQ3MDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwLmMKQEAgLTAsMCArMSwyNzggQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgorCisjaW5jbHVkZSAidm9sdGFnZS5oIgorI2luY2x1ZGUgInZwLmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMzR4eC5oIgorI2luY2x1ZGUgInBybS1yZWdiaXRzLTQ0eHguaCIKKyNpbmNsdWRlICJwcm00NHh4LmgiCisKK3N0YXRpYyB1MzIgX3ZwX3NldF9pbml0X3ZvbHRhZ2Uoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwgdTMyIHZvbHQpCit7CisJc3RydWN0IG9tYXBfdnBfaW5zdGFuY2UgKnZwID0gdm9sdGRtLT52cDsKKwl1MzIgdnBjb25maWc7CisJY2hhciB2c2VsOworCisJdnNlbCA9IHZvbHRkbS0+cG1pYy0+dXZfdG9fdnNlbCh2b2x0KTsKKworCXZwY29uZmlnID0gdm9sdGRtLT5yZWFkKHZwLT52cGNvbmZpZyk7CisJdnBjb25maWcgJj0gfih2cC0+Y29tbW9uLT52cGNvbmZpZ19pbml0dm9sdGFnZV9tYXNrIHwKKwkJICAgICAgdnAtPmNvbW1vbi0+dnBjb25maWdfZm9yY2V1cGRhdGUgfAorCQkgICAgICB2cC0+Y29tbW9uLT52cGNvbmZpZ19pbml0dmRkKTsKKwl2cGNvbmZpZyB8PSB2c2VsIDw8IF9fZmZzKHZwLT5jb21tb24tPnZwY29uZmlnX2luaXR2b2x0YWdlX21hc2spOworCXZvbHRkbS0+d3JpdGUodnBjb25maWcsIHZwLT52cGNvbmZpZyk7CisKKwkvKiBUcmlnZ2VyIGluaXRWREQgdmFsdWUgY29weSB0byB2b2x0YWdlIHByb2Nlc3NvciAqLworCXZvbHRkbS0+d3JpdGUoKHZwY29uZmlnIHwgdnAtPmNvbW1vbi0+dnBjb25maWdfaW5pdHZkZCksCisJCSAgICAgICB2cC0+dnBjb25maWcpOworCisJLyogQ2xlYXIgaW5pdFZERCBjb3B5IHRyaWdnZXIgYml0ICovCisJdm9sdGRtLT53cml0ZSh2cGNvbmZpZywgdnAtPnZwY29uZmlnKTsKKworCXJldHVybiB2cGNvbmZpZzsKK30KKworLyogR2VuZXJpYyB2b2x0YWdlIGluaXQgZnVuY3Rpb25zICovCit2b2lkIF9faW5pdCBvbWFwX3ZwX2luaXQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3sKKwlzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSAqdnAgPSB2b2x0ZG0tPnZwOworCXUzMiB2YWwsIHN5c19jbGtfcmF0ZSwgdGltZW91dCwgd2FpdHRpbWU7CisJdTMyIHZkZG1pbiwgdmRkbWF4LCB2c3RlcG1pbiwgdnN0ZXBtYXg7CisKKwlpZiAoIXZvbHRkbS0+cmVhZCB8fCAhdm9sdGRtLT53cml0ZSkgeworCQlwcl9lcnIoIiVzOiBObyByZWFkL3dyaXRlIEFQSSBmb3IgYWNjZXNzaW5nIHZkZF8lcyByZWdzXG4iLAorCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwl2cC0+ZW5hYmxlZCA9IGZhbHNlOworCisJLyogRGl2aWRlIHRvIGF2b2lkIG92ZXJmbG93ICovCisJc3lzX2Nsa19yYXRlID0gdm9sdGRtLT5zeXNfY2xrLnJhdGUgLyAxMDAwOworCisJdGltZW91dCA9IChzeXNfY2xrX3JhdGUgKiB2b2x0ZG0tPnBtaWMtPnZwX3RpbWVvdXRfdXMpIC8gMTAwMDsKKwl2ZGRtaW4gPSB2b2x0ZG0tPnBtaWMtPnZwX3ZkZG1pbjsKKwl2ZGRtYXggPSB2b2x0ZG0tPnBtaWMtPnZwX3ZkZG1heDsKKworCXdhaXR0aW1lID0gKCh2b2x0ZG0tPnBtaWMtPnN0ZXBfc2l6ZSAvIHZvbHRkbS0+cG1pYy0+c2xld19yYXRlKSAqCisJCSAgICBzeXNfY2xrX3JhdGUpIC8gMTAwMDsKKwl2c3RlcG1pbiA9IHZvbHRkbS0+cG1pYy0+dnBfdnN0ZXBtaW47CisJdnN0ZXBtYXggPSB2b2x0ZG0tPnBtaWMtPnZwX3ZzdGVwbWF4OworCisJLyoKKwkgKiBWUF9DT05GSUc6IGVycm9yIGdhaW4gaXMgbm90IHNldCBoZXJlLCBpdCB3aWxsIGJlIHVwZGF0ZWQKKwkgKiBvbiBlYWNoIHNjYWxlLCBiYXNlZCBvbiBPUFAuCisJICovCisJdmFsID0gKHZvbHRkbS0+cG1pYy0+dnBfZXJyb3JvZmZzZXQgPDwKKwkgICAgICAgX19mZnModm9sdGRtLT52cC0+Y29tbW9uLT52cGNvbmZpZ19lcnJvcm9mZnNldF9tYXNrKSkgfAorCQl2cC0+Y29tbW9uLT52cGNvbmZpZ190aW1lb3V0ZW47CisJdm9sdGRtLT53cml0ZSh2YWwsIHZwLT52cGNvbmZpZyk7CisKKwkvKiBWU1RFUE1JTiAqLworCXZhbCA9ICh3YWl0dGltZSA8PCB2cC0+Y29tbW9uLT52c3RlcG1pbl9zbXBzd2FpdHRpbWVtaW5fc2hpZnQpIHwKKwkJKHZzdGVwbWluIDw8ICB2cC0+Y29tbW9uLT52c3RlcG1pbl9zdGVwbWluX3NoaWZ0KTsKKwl2b2x0ZG0tPndyaXRlKHZhbCwgdnAtPnZzdGVwbWluKTsKKworCS8qIFZTVEVQTUFYICovCisJdmFsID0gKHZzdGVwbWF4IDw8IHZwLT5jb21tb24tPnZzdGVwbWF4X3N0ZXBtYXhfc2hpZnQpIHwKKwkJKHdhaXR0aW1lIDw8IHZwLT5jb21tb24tPnZzdGVwbWF4X3NtcHN3YWl0dGltZW1heF9zaGlmdCk7CisJdm9sdGRtLT53cml0ZSh2YWwsIHZwLT52c3RlcG1heCk7CisKKwkvKiBWTElNSVRUTyAqLworCXZhbCA9ICh2ZGRtYXggPDwgdnAtPmNvbW1vbi0+dmxpbWl0dG9fdmRkbWF4X3NoaWZ0KSB8CisJCSh2ZGRtaW4gPDwgdnAtPmNvbW1vbi0+dmxpbWl0dG9fdmRkbWluX3NoaWZ0KSB8CisJCSh0aW1lb3V0IDw8ICB2cC0+Y29tbW9uLT52bGltaXR0b190aW1lb3V0X3NoaWZ0KTsKKwl2b2x0ZG0tPndyaXRlKHZhbCwgdnAtPnZsaW1pdHRvKTsKK30KKworaW50IG9tYXBfdnBfdXBkYXRlX2Vycm9yZ2FpbihzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KQoreworCXN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAqdm9sdF9kYXRhOworCisJaWYgKCF2b2x0ZG0tPnZwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEdldCB2b2x0X2RhdGEgY29ycmVzcG9uZGluZyB0byB0YXJnZXRfdm9sdCAqLworCXZvbHRfZGF0YSA9IG9tYXBfdm9sdGFnZV9nZXRfdm9sdGRhdGEodm9sdGRtLCB0YXJnZXRfdm9sdCk7CisJaWYgKElTX0VSUih2b2x0X2RhdGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNldHRpbmcgdnAgZXJyb3JnYWluIGJhc2VkIG9uIHRoZSB2b2x0YWdlICovCisJdm9sdGRtLT5ybXcodm9sdGRtLT52cC0+Y29tbW9uLT52cGNvbmZpZ19lcnJvcmdhaW5fbWFzaywKKwkJICAgIHZvbHRfZGF0YS0+dnBfZXJyZ2FpbiA8PAorCQkgICAgX19mZnModm9sdGRtLT52cC0+Y29tbW9uLT52cGNvbmZpZ19lcnJvcmdhaW5fbWFzayksCisJCSAgICB2b2x0ZG0tPnZwLT52cGNvbmZpZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVlAgZm9yY2UgdXBkYXRlIG1ldGhvZCBvZiB2b2x0YWdlIHNjYWxpbmcgKi8KK2ludCBvbWFwX3ZwX2ZvcmNldXBkYXRlX3NjYWxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KQoreworCXN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlICp2cCA9IHZvbHRkbS0+dnA7CisJdTMyIHZwY29uZmlnOworCXU4IHRhcmdldF92c2VsLCBjdXJyZW50X3ZzZWw7CisJaW50IHJldCwgdGltZW91dCA9IDA7CisKKwlyZXQgPSBvbWFwX3ZjX3ByZV9zY2FsZSh2b2x0ZG0sIHRhcmdldF92b2x0LCAmdGFyZ2V0X3ZzZWwsICZjdXJyZW50X3ZzZWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIENsZWFyIGFsbCBwZW5kaW5nIFRyYW5zYWN0aW9uRG9uZSBpbnRlcnJ1cHQvc3RhdHVzLiBUeXBpY2FsIGxhdGVuY3kKKwkgKiBpcyA8M3VzCisJICovCisJd2hpbGUgKHRpbWVvdXQrKyA8IFZQX1RSQU5YRE9ORV9USU1FT1VUKSB7CisJCXZwLT5jb21tb24tPm9wcy0+Y2xlYXJfdHhkb25lKHZwLT5pZCk7CisJCWlmICghdnAtPmNvbW1vbi0+b3BzLT5jaGVja190eGRvbmUodnAtPmlkKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCWlmICh0aW1lb3V0ID49IFZQX1RSQU5YRE9ORV9USU1FT1VUKSB7CisJCXByX3dhcm5pbmcoIiVzOiB2ZGRfJXMgVFJBTlhET05FIHRpbWVvdXQgZXhjZWVkZWQuIgorCQkJIlZvbHRhZ2UgY2hhbmdlIGFib3J0ZWQiLCBfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJdnBjb25maWcgPSBfdnBfc2V0X2luaXRfdm9sdGFnZSh2b2x0ZG0sIHRhcmdldF92b2x0KTsKKworCS8qIEZvcmNlIHVwZGF0ZSBvZiB2b2x0YWdlICovCisJdm9sdGRtLT53cml0ZSh2cGNvbmZpZyB8IHZwLT5jb21tb24tPnZwY29uZmlnX2ZvcmNldXBkYXRlLAorCQkgICAgICB2b2x0ZG0tPnZwLT52cGNvbmZpZyk7CisKKwkvKgorCSAqIFdhaXQgZm9yIFRyYW5zYWN0aW9uRG9uZS4gVHlwaWNhbCBsYXRlbmN5IGlzIDwyMDB1cy4KKwkgKiBEZXBlbmRzIG9uIFNNUFNXQUlUVElNRU1JTi9NQVggYW5kIHZvbHRhZ2UgY2hhbmdlCisJICovCisJdGltZW91dCA9IDA7CisJb21hcF90ZXN0X3RpbWVvdXQodnAtPmNvbW1vbi0+b3BzLT5jaGVja190eGRvbmUodnAtPmlkKSwKKwkJCSAgVlBfVFJBTlhET05FX1RJTUVPVVQsIHRpbWVvdXQpOworCWlmICh0aW1lb3V0ID49IFZQX1RSQU5YRE9ORV9USU1FT1VUKQorCQlwcl9lcnIoIiVzOiB2ZGRfJXMgVFJBTlhET05FIHRpbWVvdXQgZXhjZWVkZWQuIgorCQkJIlRSQU5YRE9ORSBuZXZlciBnb3Qgc2V0IGFmdGVyIHRoZSB2b2x0YWdlIHVwZGF0ZVxuIiwKKwkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOworCisJb21hcF92Y19wb3N0X3NjYWxlKHZvbHRkbSwgdGFyZ2V0X3ZvbHQsIHRhcmdldF92c2VsLCBjdXJyZW50X3ZzZWwpOworCisJLyoKKwkgKiBEaXNhYmxlIFRyYW5zYWN0aW9uRG9uZSBpbnRlcnJ1cHQgLCBjbGVhciBhbGwgc3RhdHVzLCBjbGVhcgorCSAqIGNvbnRyb2wgcmVnaXN0ZXJzCisJICovCisJdGltZW91dCA9IDA7CisJd2hpbGUgKHRpbWVvdXQrKyA8IFZQX1RSQU5YRE9ORV9USU1FT1VUKSB7CisJCXZwLT5jb21tb24tPm9wcy0+Y2xlYXJfdHhkb25lKHZwLT5pZCk7CisJCWlmICghdnAtPmNvbW1vbi0+b3BzLT5jaGVja190eGRvbmUodnAtPmlkKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCisJaWYgKHRpbWVvdXQgPj0gVlBfVFJBTlhET05FX1RJTUVPVVQpCisJCXByX3dhcm5pbmcoIiVzOiB2ZGRfJXMgVFJBTlhET05FIHRpbWVvdXQgZXhjZWVkZWQgd2hpbGUgdHJ5aW5nIgorCQkJInRvIGNsZWFyIHRoZSBUUkFOWERPTkUgc3RhdHVzXG4iLAorCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisKKwkvKiBDbGVhciBmb3JjZSBiaXQgKi8KKwl2b2x0ZG0tPndyaXRlKHZwY29uZmlnLCB2cC0+dnBjb25maWcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogb21hcF92cF9lbmFibGUoKSAtIEFQSSB0byBlbmFibGUgYSBwYXJ0aWN1bGFyIFZQCisgKiBAdm9sdGRtOglwb2ludGVyIHRvIHRoZSBWREQgd2hvc2UgVlAgaXMgdG8gYmUgZW5hYmxlZC4KKyAqCisgKiBUaGlzIEFQSSBlbmFibGVzIGEgcGFydGljdWxhciB2b2x0YWdlIHByb2Nlc3Nvci4gTmVlZGVkIGJ5IHRoZSBzbWFydHJlZmxleAorICogY2xhc3MgZHJpdmVycy4KKyAqLwordm9pZCBvbWFwX3ZwX2VuYWJsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQoreworCXN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlICp2cDsKKwl1MzIgdnBjb25maWcsIHZvbHQ7CisKKwlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgeworCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXZwID0gdm9sdGRtLT52cDsKKwlpZiAoIXZvbHRkbS0+cmVhZCB8fCAhdm9sdGRtLT53cml0ZSkgeworCQlwcl9lcnIoIiVzOiBObyByZWFkL3dyaXRlIEFQSSBmb3IgYWNjZXNzaW5nIHZkZF8lcyByZWdzXG4iLAorCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBWUCBpcyBhbHJlYWR5IGVuYWJsZWQsIGRvIG5vdGhpbmcuIFJldHVybiAqLworCWlmICh2cC0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJdm9sdCA9IHZvbHRkbV9nZXRfdm9sdGFnZSh2b2x0ZG0pOworCWlmICghdm9sdCkgeworCQlwcl93YXJuaW5nKCIlczogdW5hYmxlIHRvIGZpbmQgY3VycmVudCB2b2x0YWdlIGZvciAlc1xuIiwKKwkJCSAgIF9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJdnBjb25maWcgPSBfdnBfc2V0X2luaXRfdm9sdGFnZSh2b2x0ZG0sIHZvbHQpOworCisJLyogRW5hYmxlIFZQICovCisJdnBjb25maWcgfD0gdnAtPmNvbW1vbi0+dnBjb25maWdfdnBlbmFibGU7CisJdm9sdGRtLT53cml0ZSh2cGNvbmZpZywgdnAtPnZwY29uZmlnKTsKKworCXZwLT5lbmFibGVkID0gdHJ1ZTsKK30KKworLyoqCisgKiBvbWFwX3ZwX2Rpc2FibGUoKSAtIEFQSSB0byBkaXNhYmxlIGEgcGFydGljdWxhciBWUAorICogQHZvbHRkbToJcG9pbnRlciB0byB0aGUgVkREIHdob3NlIFZQIGlzIHRvIGJlIGRpc2FibGVkLgorICoKKyAqIFRoaXMgQVBJIGRpc2FibGVzIGEgcGFydGljdWxhciB2b2x0YWdlIHByb2Nlc3Nvci4gTmVlZGVkIGJ5IHRoZSBzbWFydHJlZmxleAorICogY2xhc3MgZHJpdmVycy4KKyAqLwordm9pZCBvbWFwX3ZwX2Rpc2FibGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3sKKwlzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSAqdnA7CisJdTMyIHZwY29uZmlnOworCWludCB0aW1lb3V0OworCisJaWYgKCF2b2x0ZG0gfHwgSVNfRVJSKHZvbHRkbSkpIHsKKwkJcHJfd2FybmluZygiJXM6IFZERCBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl2cCA9IHZvbHRkbS0+dnA7CisJaWYgKCF2b2x0ZG0tPnJlYWQgfHwgIXZvbHRkbS0+d3JpdGUpIHsKKwkJcHJfZXJyKCIlczogTm8gcmVhZC93cml0ZSBBUEkgZm9yIGFjY2Vzc2luZyB2ZGRfJXMgcmVnc1xuIiwKKwkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJLyogSWYgVlAgaXMgYWxyZWFkeSBkaXNhYmxlZCwgZG8gbm90aGluZy4gUmV0dXJuICovCisJaWYgKCF2cC0+ZW5hYmxlZCkgeworCQlwcl93YXJuaW5nKCIlczogVHJ5aW5nIHRvIGRpc2FibGUgVlAgZm9yIHZkZF8lcyB3aGVuIgorCQkJIml0IGlzIGFscmVhZHkgZGlzYWJsZWRcbiIsIF9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJLyogRGlzYWJsZSBWUCAqLworCXZwY29uZmlnID0gdm9sdGRtLT5yZWFkKHZwLT52cGNvbmZpZyk7CisJdnBjb25maWcgJj0gfnZwLT5jb21tb24tPnZwY29uZmlnX3ZwZW5hYmxlOworCXZvbHRkbS0+d3JpdGUodnBjb25maWcsIHZwLT52cGNvbmZpZyk7CisKKwkvKgorCSAqIFdhaXQgZm9yIFZQIGlkbGUgVHlwaWNhbCBsYXRlbmN5IGlzIDwydXMuIE1heGltdW0gbGF0ZW5jeSBpcyB+MTAwdXMKKwkgKi8KKwlvbWFwX3Rlc3RfdGltZW91dCgodm9sdGRtLT5yZWFkKHZwLT52c3RhdHVzKSksCisJCQkgIFZQX0lETEVfVElNRU9VVCwgdGltZW91dCk7CisKKwlpZiAodGltZW91dCA+PSBWUF9JRExFX1RJTUVPVVQpCisJCXByX3dhcm5pbmcoIiVzOiB2ZGRfJXMgaWRsZSB0aW1lZG91dFxuIiwKKwkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOworCisJdnAtPmVuYWJsZWQgPSBmYWxzZTsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdnAuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvdnAuaAppbmRleCA3Y2UxMzRmLi43YzE1NWQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92cC5oCkBAIC0xOSw0NCArMTksNjAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogCitzdHJ1Y3Qgdm9sdGFnZWRvbWFpbjsKKworLyoKKyAqIFZvbHRhZ2UgUHJvY2Vzc29yIChWUCkgaWRlbnRpZmllcnMKKyAqLworI2RlZmluZSBPTUFQM19WUF9WRERfTVBVX0lEIDAKKyNkZWZpbmUgT01BUDNfVlBfVkREX0NPUkVfSUQgMQorI2RlZmluZSBPTUFQNF9WUF9WRERfQ09SRV9JRCAwCisjZGVmaW5lIE9NQVA0X1ZQX1ZERF9JVkFfSUQgMQorI2RlZmluZSBPTUFQNF9WUF9WRERfTVBVX0lEIDIKKwogLyogWFhYIGRvY3VtZW50ICovCiAjZGVmaW5lIFZQX0lETEVfVElNRU9VVAkJMjAwCiAjZGVmaW5lIFZQX1RSQU5YRE9ORV9USU1FT1VUCTMwMAogCisvKioKKyAqIHN0cnVjdCBvbWFwX3ZwX29wcyAtIHBlci1WUCBvcGVyYXRpb25zCisgKiBAY2hlY2tfdHhkb25lOiBjaGVjayBmb3IgVlAgdHJhbnNhY3Rpb24gZG9uZQorICogQGNsZWFyX3R4ZG9uZTogY2xlYXIgVlAgdHJhbnNhY3Rpb24gZG9uZSBzdGF0dXMKKyAqLworc3RydWN0IG9tYXBfdnBfb3BzIHsKKwl1MzIgKCpjaGVja190eGRvbmUpKHU4IHZwX2lkKTsKKwl2b2lkICgqY2xlYXJfdHhkb25lKSh1OCB2cF9pZCk7Cit9OwogCiAvKioKLSAqIHN0cnVjdCBvbWFwX3ZwX2NvbW1vbl9kYXRhIC0gcmVnaXN0ZXIgZGF0YSBjb21tb24gdG8gYWxsIFZERHMKKyAqIHN0cnVjdCBvbWFwX3ZwX2NvbW1vbiAtIHJlZ2lzdGVyIGRhdGEgY29tbW9uIHRvIGFsbCBWRERzCisgKiBAdnBjb25maWdfZXJyb3JvZmZzZXRfbWFzazogRVJST1JPRkZTRVQgYml0bWFzayBpbiB0aGUgUFJNX1ZQKl9DT05GSUcgcmVnCiAgKiBAdnBjb25maWdfZXJyb3JnYWluX21hc2s6IEVSUk9SR0FJTiBiaXRtYXNrIGluIHRoZSBQUk1fVlAqX0NPTkZJRyByZWcKICAqIEB2cGNvbmZpZ19pbml0dm9sdGFnZV9tYXNrOiBJTklUVk9MVEFHRSBiaXRtYXNrIGluIHRoZSBQUk1fVlAqX0NPTkZJRyByZWcKLSAqIEB2cGNvbmZpZ190aW1lb3V0ZW5fbWFzazogVElNRU9VVCBiaXRtYXNrIGluIHRoZSBQUk1fVlAqX0NPTkZJRyByZWcKKyAqIEB2cGNvbmZpZ190aW1lb3V0ZW46IFRJTUVPVVQgYml0bWFzayBpbiB0aGUgUFJNX1ZQKl9DT05GSUcgcmVnCiAgKiBAdnBjb25maWdfaW5pdHZkZDogSU5JVFZERCBiaXRtYXNrIGluIHRoZSBQUk1fVlAqX0NPTkZJRyByZWcKICAqIEB2cGNvbmZpZ19mb3JjZXVwZGF0ZTogRk9SQ0VVUERBVEUgYml0bWFzayBpbiB0aGUgUFJNX1ZQKl9DT05GSUcgcmVnCiAgKiBAdnBjb25maWdfdnBlbmFibGU6IFZQRU5BQkxFIGJpdG1hc2sgaW4gdGhlIFBSTV9WUCpfQ09ORklHIHJlZwogICogQHZwY29uZmlnX2Vycm9yb2Zmc2V0X3NoaWZ0OiBFUlJPUk9GRlNFVCBmaWVsZCBzaGlmdCBpbiBQUk1fVlAqX0NPTkZJRyByZWcKICAqIEB2cGNvbmZpZ19lcnJvcmdhaW5fc2hpZnQ6IEVSUk9SR0FJTiBmaWVsZCBzaGlmdCBpbiBQUk1fVlAqX0NPTkZJRyByZWcKICAqIEB2cGNvbmZpZ19pbml0dm9sdGFnZV9zaGlmdDogSU5JVFZPTFRBR0UgZmllbGQgc2hpZnQgaW4gUFJNX1ZQKl9DT05GSUcgcmVnCi0gKiBAdnBjb25maWdfc3RlcG1pbl9zaGlmdDogVlNURVBNSU4gZmllbGQgc2hpZnQgaW4gdGhlIFBSTV9WUCpfVlNURVBNSU4gcmVnCi0gKiBAdnBjb25maWdfc21wc3dhaXR0aW1lbWluX3NoaWZ0OiBTTVBTV0FJVFRJTUVNSU4gZmllbGQgc2hpZnQgaW4gUFJNX1ZQKl9WU1RFUE1JTiByZWcKLSAqIEB2cGNvbmZpZ19zdGVwbWF4X3NoaWZ0OiBWU1RFUE1BWCBmaWVsZCBzaGlmdCBpbiB0aGUgUFJNX1ZQKl9WU1RFUE1BWCByZWcKLSAqIEB2cGNvbmZpZ19zbXBzd2FpdHRpbWVtYXhfc2hpZnQ6IFNNUFNXQUlUVElNRU1BWCBmaWVsZCBzaGlmdCBpbiBQUk1fVlAqX1ZTVEVQTUFYIHJlZwotICogQHZwY29uZmlnX3ZsaW1pdHRvX3ZkZG1pbl9zaGlmdDogVkRETUlOIGZpZWxkIHNoaWZ0IGluIFBSTV9WUCpfVkxJTUlUVE8gcmVnCi0gKiBAdnBjb25maWdfdmxpbWl0dG9fdmRkbWF4X3NoaWZ0OiBWRERNQVggZmllbGQgc2hpZnQgaW4gUFJNX1ZQKl9WTElNSVRUTyByZWcKLSAqIEB2cGNvbmZpZ192bGltaXR0b190aW1lb3V0X3NoaWZ0OiBUSU1FT1VUIGZpZWxkIHNoaWZ0IGluIFBSTV9WUCpfVkxJTUlUVE8gcmVnCi0gKgotICogWFhYIEl0IGl0IG5vdCBuZWNlc3NhcnkgdG8gaGF2ZSBib3RoIGEgbWFzayBhbmQgYSBzaGlmdCBmb3IgdGhlIHNhbWUKLSAqICAgICBiaXRmaWVsZCAtIHJlbW92ZSBvbmUKLSAqIFhYWCBNYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgd3JvbmdseSBuYW1lZCAtLSBlLmcuLCB2cGNvbmZpZ19zbXBzKiAtLSBmaXghCisgKiBAdnN0ZXBtaW5fc3RlcG1pbl9zaGlmdDogVlNURVBNSU4gZmllbGQgc2hpZnQgaW4gdGhlIFBSTV9WUCpfVlNURVBNSU4gcmVnCisgKiBAdnN0ZXBtaW5fc21wc3dhaXR0aW1lbWluX3NoaWZ0OiBTTVBTV0FJVFRJTUVNSU4gZmllbGQgc2hpZnQgaW4gUFJNX1ZQKl9WU1RFUE1JTiByZWcKKyAqIEB2c3RlcG1heF9zdGVwbWF4X3NoaWZ0OiBWU1RFUE1BWCBmaWVsZCBzaGlmdCBpbiB0aGUgUFJNX1ZQKl9WU1RFUE1BWCByZWcKKyAqIEB2c3RlcG1heF9zbXBzd2FpdHRpbWVtYXhfc2hpZnQ6IFNNUFNXQUlUVElNRU1BWCBmaWVsZCBzaGlmdCBpbiBQUk1fVlAqX1ZTVEVQTUFYIHJlZworICogQHZsaW1pdHRvX3ZkZG1pbl9zaGlmdDogVkRETUlOIGZpZWxkIHNoaWZ0IGluIFBSTV9WUCpfVkxJTUlUVE8gcmVnCisgKiBAdmxpbWl0dG9fdmRkbWF4X3NoaWZ0OiBWRERNQVggZmllbGQgc2hpZnQgaW4gUFJNX1ZQKl9WTElNSVRUTyByZWcKKyAqIEB2bGltaXR0b190aW1lb3V0X3NoaWZ0OiBUSU1FT1VUIGZpZWxkIHNoaWZ0IGluIFBSTV9WUCpfVkxJTUlUVE8gcmVnCisgKiBAdnB2b2x0YWdlX21hc2s6IFZQVk9MVEFHRSBmaWVsZCBtYXNrIGluIFBSTV9WUCpfVk9MVEFHRSByZWcKICAqLwotc3RydWN0IG9tYXBfdnBfY29tbW9uX2RhdGEgeworc3RydWN0IG9tYXBfdnBfY29tbW9uIHsKKwl1MzIgdnBjb25maWdfZXJyb3JvZmZzZXRfbWFzazsKIAl1MzIgdnBjb25maWdfZXJyb3JnYWluX21hc2s7CiAJdTMyIHZwY29uZmlnX2luaXR2b2x0YWdlX21hc2s7Ci0JdTMyIHZwY29uZmlnX3RpbWVvdXRlbjsKLQl1MzIgdnBjb25maWdfaW5pdHZkZDsKLQl1MzIgdnBjb25maWdfZm9yY2V1cGRhdGU7Ci0JdTMyIHZwY29uZmlnX3ZwZW5hYmxlOwotCXU4IHZwY29uZmlnX2Vycm9yb2Zmc2V0X3NoaWZ0OwotCXU4IHZwY29uZmlnX2Vycm9yZ2Fpbl9zaGlmdDsKLQl1OCB2cGNvbmZpZ19pbml0dm9sdGFnZV9zaGlmdDsKKwl1OCB2cGNvbmZpZ190aW1lb3V0ZW47CisJdTggdnBjb25maWdfaW5pdHZkZDsKKwl1OCB2cGNvbmZpZ19mb3JjZXVwZGF0ZTsKKwl1OCB2cGNvbmZpZ192cGVuYWJsZTsKIAl1OCB2c3RlcG1pbl9zdGVwbWluX3NoaWZ0OwogCXU4IHZzdGVwbWluX3NtcHN3YWl0dGltZW1pbl9zaGlmdDsKIAl1OCB2c3RlcG1heF9zdGVwbWF4X3NoaWZ0OwpAQCAtNjQsODAgKzgwLDQ5IEBACiAJdTggdmxpbWl0dG9fdmRkbWluX3NoaWZ0OwogCXU4IHZsaW1pdHRvX3ZkZG1heF9zaGlmdDsKIAl1OCB2bGltaXR0b190aW1lb3V0X3NoaWZ0OworCXU4IHZwdm9sdGFnZV9tYXNrOworCisJY29uc3Qgc3RydWN0IG9tYXBfdnBfb3BzICpvcHM7CiB9OwogCiAvKioKLSAqIHN0cnVjdCBvbWFwX3ZwX3BybV9pcnFzdF9kYXRhIC0gUFJNX0lSUVNUQVRVU19NUFUuVlBfVFJBTlhET05FX1NUIGRhdGEKLSAqIEBwcm1faXJxc3RfcmVnOiByZWcgb2Zmc2V0IGZvciBQUk1fSVJRU1RBVFVTX01QVSBmcm9tIHRvcCBvZiBQUk0KLSAqIEB0cmFueGRvbmVfc3RhdHVzOiBWUF9UUkFOWERPTkVfU1QgYml0bWFzayBpbiBQUk1fSVJRU1RBVFVTX01QVSByZWcKLSAqCi0gKiBYWFggcHJtX2lycXN0X3JlZyBkb2VzIG5vdCBiZWxvbmcgaGVyZQotICogWFhYIE5vdGUgdGhhdCBvbiBPTUFQMywgVlBfVFJBTlhET05FIGludGVycnVwdCBtYXkgbm90IHdvcmsgZHVlIHRvIGEKLSAqICAgICBoYXJkd2FyZSBidWcKLSAqIFhYWCBUaGlzIHN0cnVjdHVyZSBpcyBwcm9iYWJseSBub3QgbmVlZGVkCi0gKi8KLXN0cnVjdCBvbWFwX3ZwX3BybV9pcnFzdF9kYXRhIHsKLQl1OCBwcm1faXJxc3RfcmVnOwotCXUzMiB0cmFueGRvbmVfc3RhdHVzOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhIC0gVlAgcmVnaXN0ZXIgb2Zmc2V0cyAocGVyLVZERCkKLSAqIEB2cF9jb21tb246IHBvaW50ZXIgdG8gc3RydWN0IG9tYXBfdnBfY29tbW9uX2RhdGEgKiBmb3IgdGhpcyBTb0MKLSAqIEBwcm1faXJxc3RfZGF0YTogcG9pbnRlciB0byBzdHJ1Y3Qgb21hcF92cF9wcm1faXJxc3RfZGF0YSBmb3IgdGhpcyBWREQKKyAqIHN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlIC0gVlAgcmVnaXN0ZXIgb2Zmc2V0cyAocGVyLVZERCkKKyAqIEBjb21tb246IHBvaW50ZXIgdG8gc3RydWN0IG9tYXBfdnBfY29tbW9uICogZm9yIHRoaXMgU29DCiAgKiBAdnBjb25maWc6IFBSTV9WUCpfQ09ORklHIHJlZyBvZmZzZXQgZnJvbSBQUk0gc3RhcnQKICAqIEB2c3RlcG1pbjogUFJNX1ZQKl9WU1RFUE1JTiByZWcgb2Zmc2V0IGZyb20gUFJNIHN0YXJ0CiAgKiBAdmxpbWl0dG86IFBSTV9WUCpfVkxJTUlUVE8gcmVnIG9mZnNldCBmcm9tIFBSTSBzdGFydAogICogQHZzdGF0dXM6IFBSTV9WUCpfVlNUQVRVUyByZWcgb2Zmc2V0IGZyb20gUFJNIHN0YXJ0CiAgKiBAdm9sdGFnZTogUFJNX1ZQKl9WT0xUQUdFIHJlZyBvZmZzZXQgZnJvbSBQUk0gc3RhcnQKKyAqIEBpZDogVW5pcXVlIGlkZW50aWZpZXIgZm9yIFZQIGluc3RhbmNlLgorICogQGVuYWJsZWQ6IGZsYWcgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHZwIGlzIGVuYWJsZWQgb3Igbm90CiAgKgogICogWFhYIHZwX2NvbW1vbiBpcyBwcm9iYWJseSBub3QgbmVlZGVkIHNpbmNlIGl0IGlzIHBlci1Tb0MKICAqLwotc3RydWN0IG9tYXBfdnBfaW5zdGFuY2VfZGF0YSB7Ci0JY29uc3Qgc3RydWN0IG9tYXBfdnBfY29tbW9uX2RhdGEgKnZwX2NvbW1vbjsKLQljb25zdCBzdHJ1Y3Qgb21hcF92cF9wcm1faXJxc3RfZGF0YSAqcHJtX2lycXN0X2RhdGE7CitzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSB7CisJY29uc3Qgc3RydWN0IG9tYXBfdnBfY29tbW9uICpjb21tb247CiAJdTggdnBjb25maWc7CiAJdTggdnN0ZXBtaW47CiAJdTggdnN0ZXBtYXg7CiAJdTggdmxpbWl0dG87CiAJdTggdnN0YXR1czsKIAl1OCB2b2x0YWdlOworCXU4IGlkOworCWJvb2wgZW5hYmxlZDsKIH07CiAKLS8qKgotICogc3RydWN0IG9tYXBfdnBfcnVudGltZV9kYXRhIC0gVlAgZGF0YSBwb3B1bGF0ZWQgYXQgcnVudGltZSBieSBjb2RlCi0gKiBAdnBjb25maWdfZXJyb3JvZmZzZXQ6IHZhbHVlIG9mIEVSUk9ST0ZGU0VUIGJpdGZpZWxkIGluIFBSTV9WUCpfQ09ORklHCi0gKiBAdnBjb25maWdfZXJyb3JnYWluOiB2YWx1ZSBvZiBFUlJPUkdBSU4gYml0ZmllbGQgaW4gUFJNX1ZQKl9DT05GSUcKLSAqIEB2c3RlcG1pbl9zbXBzd2FpdHRpbWVtaW46IHZhbHVlIG9mIFNNUFNXQUlUVElNRU1JTiBiaXRmaWVsZCBpbiBQUk1fVlAqX1ZTVEVQTUlOCi0gKiBAdnN0ZXBtYXhfc21wc3dhaXR0aW1lbWF4OiB2YWx1ZSBvZiBTTVBTV0FJVFRJTUVNQVggYml0ZmllbGQgaW4gUFJNX1ZQKl9WU1RFUE1BWAotICogQHZsaW1pdHRvX3RpbWVvdXQ6IHZhbHVlIG9mIFRJTUVPVVQgYml0ZmllbGQgaW4gUFJNX1ZQKl9WTElNSVRUTwotICogQHZzdGVwbWluX3N0ZXBtaW46IHZhbHVlIG9mIFZTVEVQTUlOIGJpdGZpZWxkIGluIFBSTV9WUCpfVlNURVBNSU4KLSAqIEB2c3RlcG1heF9zdGVwbWF4OiB2YWx1ZSBvZiBWU1RFUE1BWCBiaXRmaWVsZCBpbiBQUk1fVlAqX1ZTVEVQTUFYCi0gKiBAdmxpbWl0dG9fdmRkbWluOiB2YWx1ZSBvZiBWRERNSU4gYml0ZmllbGQgaW4gUFJNX1ZQKl9WTElNSVRUTwotICogQHZsaW1pdHRvX3ZkZG1heDogdmFsdWUgb2YgVkRETUFYIGJpdGZpZWxkIGluIFBSTV9WUCpfVkxJTUlUVE8KLSAqCi0gKiBYWFggSXMgdGhpcyBzdHJ1Y3R1cmUgcmVhbGx5IG5lZWRlZD8gIFdoeSBub3QganVzdCBwcm9ncmFtIHRoZQotICogZGV2aWNlIGRpcmVjdGx5PyAgVGhleSBhcmUgaW4gUFJNIHNwYWNlLCB0aGVyZWZvcmUgaW4gdGhlIFdLVVAKLSAqIHBvd2VyZG9tYWluLCBzbyByZWdpc3RlciBjb250ZW50cyBzaG91bGQgbm90IGJlIGxvc3QgaW4gb2ZmLW1vZGUuCi0gKiBYWFggU29tZSBvZiB0aGVzZSBmaWVsZHMgYXJlIGluY29ycmVjdGx5IG5hbWVkLCBlLmcuLCB2c3RlcCoKLSAqLwotc3RydWN0IG9tYXBfdnBfcnVudGltZV9kYXRhIHsKLQl1MzIgdnBjb25maWdfZXJyb3JvZmZzZXQ7Ci0JdTE2IHZwY29uZmlnX2Vycm9yZ2FpbjsKLQl1MTYgdnN0ZXBtaW5fc21wc3dhaXR0aW1lbWluOwotCXUxNiB2c3RlcG1heF9zbXBzd2FpdHRpbWVtYXg7Ci0JdTE2IHZsaW1pdHRvX3RpbWVvdXQ7Ci0JdTggdnN0ZXBtaW5fc3RlcG1pbjsKLQl1OCB2c3RlcG1heF9zdGVwbWF4OwotCXU4IHZsaW1pdHRvX3ZkZG1pbjsKLQl1OCB2bGltaXR0b192ZGRtYXg7Ci19OworZXh0ZXJuIHN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlIG9tYXAzX3ZwX21wdTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSBvbWFwM192cF9jb3JlOwogCi1leHRlcm4gc3RydWN0IG9tYXBfdnBfaW5zdGFuY2VfZGF0YSBvbWFwM192cDFfZGF0YTsKLWV4dGVybiBzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhIG9tYXAzX3ZwMl9kYXRhOworZXh0ZXJuIHN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlIG9tYXA0X3ZwX21wdTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSBvbWFwNF92cF9pdmE7CitleHRlcm4gc3RydWN0IG9tYXBfdnBfaW5zdGFuY2Ugb21hcDRfdnBfY29yZTsKIAotZXh0ZXJuIHN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlX2RhdGEgb21hcDRfdnBfbXB1X2RhdGE7Ci1leHRlcm4gc3RydWN0IG9tYXBfdnBfaW5zdGFuY2VfZGF0YSBvbWFwNF92cF9pdmFfZGF0YTsKLWV4dGVybiBzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhIG9tYXA0X3ZwX2NvcmVfZGF0YTsKK3ZvaWQgb21hcF92cF9pbml0KHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pOwordm9pZCBvbWFwX3ZwX2VuYWJsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKK3ZvaWQgb21hcF92cF9kaXNhYmxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pOworaW50IG9tYXBfdnBfZm9yY2V1cGRhdGVfc2NhbGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpOworaW50IG9tYXBfdnBfdXBkYXRlX2Vycm9yZ2FpbihzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwM3h4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwM3h4eF9kYXRhLmMKaW5kZXggNjQ1MjE3MC4uMjYwYzU1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92cDN4eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdnAzeHh4X2RhdGEuYwpAQCAtMjUsMTYgKzI1LDIwIEBACiAjaW5jbHVkZSAidm9sdGFnZS5oIgogCiAjaW5jbHVkZSAidnAuaCIKKyNpbmNsdWRlICJwcm0yeHh4XzN4eHguaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3ZwX29wcyBvbWFwM192cF9vcHMgPSB7CisJLmNoZWNrX3R4ZG9uZSA9IG9tYXAzX3BybV92cF9jaGVja190eGRvbmUsCisJLmNsZWFyX3R4ZG9uZSA9IG9tYXAzX3BybV92cF9jbGVhcl90eGRvbmUsCit9OwogCiAvKgogICogVlAgZGF0YSBjb21tb24gdG8gMzR4eC8zNnh4IGNoaXBzCiAgKiBYWFggVGhpcyBzdHVmZiBwcmVzdW1hYmx5IGJlbG9uZ3MgaW4gdGhlIHZwM3h4eC5jIG9yIHZwLmMgZmlsZS4KICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3ZwX2NvbW1vbl9kYXRhIG9tYXAzX3ZwX2NvbW1vbiA9IHsKLQkudnBjb25maWdfZXJyb3JvZmZzZXRfc2hpZnQgPSBPTUFQMzQzMF9FUlJPUk9GRlNFVF9TSElGVCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92cF9jb21tb24gb21hcDNfdnBfY29tbW9uID0geworCS52cGNvbmZpZ19lcnJvcm9mZnNldF9tYXNrID0gT01BUDM0MzBfRVJST1JPRkZTRVRfTUFTSywKIAkudnBjb25maWdfZXJyb3JnYWluX21hc2sgPSBPTUFQMzQzMF9FUlJPUkdBSU5fTUFTSywKLQkudnBjb25maWdfZXJyb3JnYWluX3NoaWZ0ID0gT01BUDM0MzBfRVJST1JHQUlOX1NISUZULAotCS52cGNvbmZpZ19pbml0dm9sdGFnZV9zaGlmdCA9IE9NQVAzNDMwX0lOSVRWT0xUQUdFX1NISUZULAogCS52cGNvbmZpZ19pbml0dm9sdGFnZV9tYXNrID0gT01BUDM0MzBfSU5JVFZPTFRBR0VfTUFTSywKIAkudnBjb25maWdfdGltZW91dGVuID0gT01BUDM0MzBfVElNRU9VVEVOX01BU0ssCiAJLnZwY29uZmlnX2luaXR2ZGQgPSBPTUFQMzQzMF9JTklUVkREX01BU0ssCkBAIC00NywzNiArNTEsMjkgQEAKIAkudmxpbWl0dG9fdmRkbWluX3NoaWZ0ID0gT01BUDM0MzBfVkRETUlOX1NISUZULAogCS52bGltaXR0b192ZGRtYXhfc2hpZnQgPSBPTUFQMzQzMF9WRERNQVhfU0hJRlQsCiAJLnZsaW1pdHRvX3RpbWVvdXRfc2hpZnQgPSBPTUFQMzQzMF9USU1FT1VUX1NISUZULAorCS52cHZvbHRhZ2VfbWFzayA9IE9NQVAzNDMwX1ZQVk9MVEFHRV9NQVNLLAorCisJLm9wcyA9ICZvbWFwM192cF9vcHMsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdnBfcHJtX2lycXN0X2RhdGEgb21hcDNfdnAxX3BybV9pcnFzdF9kYXRhID0gewotCS5wcm1faXJxc3RfcmVnID0gT01BUDNfUFJNX0lSUVNUQVRVU19NUFVfT0ZGU0VULAotCS50cmFueGRvbmVfc3RhdHVzID0gT01BUDM0MzBfVlAxX1RSQU5YRE9ORV9TVF9NQVNLLAotfTsKLQotc3RydWN0IG9tYXBfdnBfaW5zdGFuY2VfZGF0YSBvbWFwM192cDFfZGF0YSA9IHsKLQkudnBfY29tbW9uID0gJm9tYXAzX3ZwX2NvbW1vbiwKK3N0cnVjdCBvbWFwX3ZwX2luc3RhbmNlIG9tYXAzX3ZwX21wdSA9IHsKKwkuaWQgPSBPTUFQM19WUF9WRERfTVBVX0lELAorCS5jb21tb24gPSAmb21hcDNfdnBfY29tbW9uLAogCS52cGNvbmZpZyA9IE9NQVAzX1BSTV9WUDFfQ09ORklHX09GRlNFVCwKIAkudnN0ZXBtaW4gPSBPTUFQM19QUk1fVlAxX1ZTVEVQTUlOX09GRlNFVCwKIAkudnN0ZXBtYXggPSBPTUFQM19QUk1fVlAxX1ZTVEVQTUFYX09GRlNFVCwKIAkudmxpbWl0dG8gPSBPTUFQM19QUk1fVlAxX1ZMSU1JVFRPX09GRlNFVCwKIAkudnN0YXR1cyA9IE9NQVAzX1BSTV9WUDFfU1RBVFVTX09GRlNFVCwKIAkudm9sdGFnZSA9IE9NQVAzX1BSTV9WUDFfVk9MVEFHRV9PRkZTRVQsCi0JLnBybV9pcnFzdF9kYXRhID0gJm9tYXAzX3ZwMV9wcm1faXJxc3RfZGF0YSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92cF9wcm1faXJxc3RfZGF0YSBvbWFwM192cDJfcHJtX2lycXN0X2RhdGEgPSB7Ci0JLnBybV9pcnFzdF9yZWcgPSBPTUFQM19QUk1fSVJRU1RBVFVTX01QVV9PRkZTRVQsCi0JLnRyYW54ZG9uZV9zdGF0dXMgPSBPTUFQMzQzMF9WUDJfVFJBTlhET05FX1NUX01BU0ssCi19OwotCi1zdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhIG9tYXAzX3ZwMl9kYXRhID0gewotCS52cF9jb21tb24gPSAmb21hcDNfdnBfY29tbW9uLAorc3RydWN0IG9tYXBfdnBfaW5zdGFuY2Ugb21hcDNfdnBfY29yZSA9IHsKKwkuaWQgPSBPTUFQM19WUF9WRERfQ09SRV9JRCwKKwkuY29tbW9uID0gJm9tYXAzX3ZwX2NvbW1vbiwKIAkudnBjb25maWcgPSBPTUFQM19QUk1fVlAyX0NPTkZJR19PRkZTRVQsCiAJLnZzdGVwbWluID0gT01BUDNfUFJNX1ZQMl9WU1RFUE1JTl9PRkZTRVQsCiAJLnZzdGVwbWF4ID0gT01BUDNfUFJNX1ZQMl9WU1RFUE1BWF9PRkZTRVQsCiAJLnZsaW1pdHRvID0gT01BUDNfUFJNX1ZQMl9WTElNSVRUT19PRkZTRVQsCiAJLnZzdGF0dXMgPSBPTUFQM19QUk1fVlAyX1NUQVRVU19PRkZTRVQsCiAJLnZvbHRhZ2UgPSBPTUFQM19QUk1fVlAyX1ZPTFRBR0VfT0ZGU0VULAotCS5wcm1faXJxc3RfZGF0YSA9ICZvbWFwM192cDJfcHJtX2lycXN0X2RhdGEsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92cDQ0eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92cDQ0eHhfZGF0YS5jCmluZGV4IDY1ZDFhZDYuLmI0ZTc3MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdnA0NHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwNDR4eF9kYXRhLmMKQEAgLTI3LDE1ICsyNywxOCBAQAogCiAjaW5jbHVkZSAidnAuaCIKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3ZwX29wcyBvbWFwNF92cF9vcHMgPSB7CisJLmNoZWNrX3R4ZG9uZSA9IG9tYXA0X3BybV92cF9jaGVja190eGRvbmUsCisJLmNsZWFyX3R4ZG9uZSA9IG9tYXA0X3BybV92cF9jbGVhcl90eGRvbmUsCit9OworCiAvKgogICogVlAgZGF0YSBjb21tb24gdG8gNDR4eCBjaGlwcwogICogWFhYIFRoaXMgc3R1ZmYgcHJlc3VtYWJseSBiZWxvbmdzIGluIHRoZSB2cDQ0eHguYyBvciB2cC5jIGZpbGUuCiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92cF9jb21tb25fZGF0YSBvbWFwNF92cF9jb21tb24gPSB7Ci0JLnZwY29uZmlnX2Vycm9yb2Zmc2V0X3NoaWZ0ID0gT01BUDQ0MzBfRVJST1JPRkZTRVRfU0hJRlQsCitzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdnBfY29tbW9uIG9tYXA0X3ZwX2NvbW1vbiA9IHsKKwkudnBjb25maWdfZXJyb3JvZmZzZXRfbWFzayA9IE9NQVA0NDMwX0VSUk9ST0ZGU0VUX01BU0ssCiAJLnZwY29uZmlnX2Vycm9yZ2Fpbl9tYXNrID0gT01BUDQ0MzBfRVJST1JHQUlOX01BU0ssCi0JLnZwY29uZmlnX2Vycm9yZ2Fpbl9zaGlmdCA9IE9NQVA0NDMwX0VSUk9SR0FJTl9TSElGVCwKLQkudnBjb25maWdfaW5pdHZvbHRhZ2Vfc2hpZnQgPSBPTUFQNDQzMF9JTklUVk9MVEFHRV9TSElGVCwKIAkudnBjb25maWdfaW5pdHZvbHRhZ2VfbWFzayA9IE9NQVA0NDMwX0lOSVRWT0xUQUdFX01BU0ssCiAJLnZwY29uZmlnX3RpbWVvdXRlbiA9IE9NQVA0NDMwX1RJTUVPVVRFTl9NQVNLLAogCS52cGNvbmZpZ19pbml0dmRkID0gT01BUDQ0MzBfSU5JVFZERF9NQVNLLApAQCAtNDgsNTMgKzUxLDM5IEBACiAJLnZsaW1pdHRvX3ZkZG1pbl9zaGlmdCA9IE9NQVA0NDMwX1ZERE1JTl9TSElGVCwKIAkudmxpbWl0dG9fdmRkbWF4X3NoaWZ0ID0gT01BUDQ0MzBfVkRETUFYX1NISUZULAogCS52bGltaXR0b190aW1lb3V0X3NoaWZ0ID0gT01BUDQ0MzBfVElNRU9VVF9TSElGVCwKKwkudnB2b2x0YWdlX21hc2sgPSBPTUFQNDQzMF9WUFZPTFRBR0VfTUFTSywKKwkub3BzID0gJm9tYXA0X3ZwX29wcywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92cF9wcm1faXJxc3RfZGF0YSBvbWFwNF92cF9tcHVfcHJtX2lycXN0X2RhdGEgPSB7Ci0JLnBybV9pcnFzdF9yZWcgPSBPTUFQNF9QUk1fSVJRU1RBVFVTX01QVV8yX09GRlNFVCwKLQkudHJhbnhkb25lX3N0YXR1cyA9IE9NQVA0NDMwX1ZQX01QVV9UUkFOWERPTkVfU1RfTUFTSywKLX07Ci0KLXN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlX2RhdGEgb21hcDRfdnBfbXB1X2RhdGEgPSB7Ci0JLnZwX2NvbW1vbiA9ICZvbWFwNF92cF9jb21tb24sCitzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSBvbWFwNF92cF9tcHUgPSB7CisJLmlkID0gT01BUDRfVlBfVkREX01QVV9JRCwKKwkuY29tbW9uID0gJm9tYXA0X3ZwX2NvbW1vbiwKIAkudnBjb25maWcgPSBPTUFQNF9QUk1fVlBfTVBVX0NPTkZJR19PRkZTRVQsCiAJLnZzdGVwbWluID0gT01BUDRfUFJNX1ZQX01QVV9WU1RFUE1JTl9PRkZTRVQsCiAJLnZzdGVwbWF4ID0gT01BUDRfUFJNX1ZQX01QVV9WU1RFUE1BWF9PRkZTRVQsCiAJLnZsaW1pdHRvID0gT01BUDRfUFJNX1ZQX01QVV9WTElNSVRUT19PRkZTRVQsCiAJLnZzdGF0dXMgPSBPTUFQNF9QUk1fVlBfTVBVX1NUQVRVU19PRkZTRVQsCiAJLnZvbHRhZ2UgPSBPTUFQNF9QUk1fVlBfTVBVX1ZPTFRBR0VfT0ZGU0VULAotCS5wcm1faXJxc3RfZGF0YSA9ICZvbWFwNF92cF9tcHVfcHJtX2lycXN0X2RhdGEsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdnBfcHJtX2lycXN0X2RhdGEgb21hcDRfdnBfaXZhX3BybV9pcnFzdF9kYXRhID0gewotCS5wcm1faXJxc3RfcmVnID0gT01BUDRfUFJNX0lSUVNUQVRVU19NUFVfT0ZGU0VULAotCS50cmFueGRvbmVfc3RhdHVzID0gT01BUDQ0MzBfVlBfSVZBX1RSQU5YRE9ORV9TVF9NQVNLLAotfTsKLQotc3RydWN0IG9tYXBfdnBfaW5zdGFuY2VfZGF0YSBvbWFwNF92cF9pdmFfZGF0YSA9IHsKLQkudnBfY29tbW9uID0gJm9tYXA0X3ZwX2NvbW1vbiwKK3N0cnVjdCBvbWFwX3ZwX2luc3RhbmNlIG9tYXA0X3ZwX2l2YSA9IHsKKwkuaWQgPSBPTUFQNF9WUF9WRERfSVZBX0lELAorCS5jb21tb24gPSAmb21hcDRfdnBfY29tbW9uLAogCS52cGNvbmZpZyA9IE9NQVA0X1BSTV9WUF9JVkFfQ09ORklHX09GRlNFVCwKIAkudnN0ZXBtaW4gPSBPTUFQNF9QUk1fVlBfSVZBX1ZTVEVQTUlOX09GRlNFVCwKIAkudnN0ZXBtYXggPSBPTUFQNF9QUk1fVlBfSVZBX1ZTVEVQTUFYX09GRlNFVCwKIAkudmxpbWl0dG8gPSBPTUFQNF9QUk1fVlBfSVZBX1ZMSU1JVFRPX09GRlNFVCwKIAkudnN0YXR1cyA9IE9NQVA0X1BSTV9WUF9JVkFfU1RBVFVTX09GRlNFVCwKIAkudm9sdGFnZSA9IE9NQVA0X1BSTV9WUF9JVkFfVk9MVEFHRV9PRkZTRVQsCi0JLnBybV9pcnFzdF9kYXRhID0gJm9tYXA0X3ZwX2l2YV9wcm1faXJxc3RfZGF0YSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92cF9wcm1faXJxc3RfZGF0YSBvbWFwNF92cF9jb3JlX3BybV9pcnFzdF9kYXRhID0gewotCS5wcm1faXJxc3RfcmVnID0gT01BUDRfUFJNX0lSUVNUQVRVU19NUFVfT0ZGU0VULAotCS50cmFueGRvbmVfc3RhdHVzID0gT01BUDQ0MzBfVlBfQ09SRV9UUkFOWERPTkVfU1RfTUFTSywKLX07Ci0KLXN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlX2RhdGEgb21hcDRfdnBfY29yZV9kYXRhID0gewotCS52cF9jb21tb24gPSAmb21hcDRfdnBfY29tbW9uLAorc3RydWN0IG9tYXBfdnBfaW5zdGFuY2Ugb21hcDRfdnBfY29yZSA9IHsKKwkuaWQgPSBPTUFQNF9WUF9WRERfQ09SRV9JRCwKKwkuY29tbW9uID0gJm9tYXA0X3ZwX2NvbW1vbiwKIAkudnBjb25maWcgPSBPTUFQNF9QUk1fVlBfQ09SRV9DT05GSUdfT0ZGU0VULAogCS52c3RlcG1pbiA9IE9NQVA0X1BSTV9WUF9DT1JFX1ZTVEVQTUlOX09GRlNFVCwKIAkudnN0ZXBtYXggPSBPTUFQNF9QUk1fVlBfQ09SRV9WU1RFUE1BWF9PRkZTRVQsCiAJLnZsaW1pdHRvID0gT01BUDRfUFJNX1ZQX0NPUkVfVkxJTUlUVE9fT0ZGU0VULAogCS52c3RhdHVzID0gT01BUDRfUFJNX1ZQX0NPUkVfU1RBVFVTX09GRlNFVCwKIAkudm9sdGFnZSA9IE9NQVA0X1BSTV9WUF9DT1JFX1ZPTFRBR0VfT0ZGU0VULAotCS5wcm1faXJxc3RfZGF0YSA9ICZvbWFwNF92cF9jb3JlX3BybV9pcnFzdF9kYXRhLAogfTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2QybmV0LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZDJuZXQtc2V0dXAuYwppbmRleCAxOWNmNWJmLi44YzgzMDA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZDJuZXQtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZDJuZXQtc2V0dXAuYwpAQCAtMzM2LDcgKzMzNiw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9EMk5FVAogTUFDSElORV9TVEFSVChEMk5FVCwgIkxhQ2llIGQyIE5ldHdvcmsiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGQybmV0X2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKQEAgLTM0OCw3ICszNDgsNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfQklHRElTSwogTUFDSElORV9TVEFSVChCSUdESVNLLCAiTGFDaWUgQmlnIERpc2sgTmV0d29yayIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZDJuZXRfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RiODhmNTI4MS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RiODhmNTI4MS1zZXR1cC5jCmluZGV4IGEzZTNlOWUuLjRiNzlhODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kYjg4ZjUyODEtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZGI4OGY1MjgxLXNldHVwLmMKQEAgLTksNyArOSw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbXY2NDN4eF9ldGguaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPG1hY2gvb3Jpb241eC5oPgpAQCAtMzU5LDcgKzM1OCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoREI4OEY1MjgxLCAiTWFydmVsbCBPcmlvbi0yIERldmVsb3BtZW50IEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBUemFjaGkgUGVyZWxzdGVpbiA8dHphY2hpQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGRiODhmNTI4MV9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMKaW5kZXggYzEwNTU1Ni4uMzQzZjYwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYwpAQCAtMTMsNyArMTMsNyBAQAogICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9tYXJ2ZWxsX3BoeS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9vcmlvbjV4Lmg+CkBAIC03MzAsNyArNzI5LDcgQEAKIC8qIFdhcm5pbmc6IEQtTGluayB1c2VzIGEgd3JvbmcgbWFjaC10eXBlICg9NTI2KSBpbiB0aGVpciBib290bG9hZGVyICovCiBNQUNISU5FX1NUQVJUKEROUzMyMywgIkQtTGluayBETlMtMzIzIikKIAkvKiBNYWludGFpbmVyOiBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBkbnMzMjNfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2VkbWluaV92Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2VkbWluaV92Mi1zZXR1cC5jCmluZGV4IGI2N2NmZjAuLjcwYTRlOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9lZG1pbmlfdjItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZWRtaW5pX3YyLXNldHVwLmMKQEAgLTI1MSw3ICsyNTEsNyBAQAogLyogV2FybmluZzogTGFDaWUgdXNlIGEgd3JvbmcgbWFjaC10eXBlICgweDIwZT01MjYpIGluIHRoZWlyIGJvb3Rsb2FkZXIuICovCiBNQUNISU5FX1NUQVJUKEVETUlOSV9WMiwgIkxhQ2llIEV0aGVybmV0IERpc2sgbWluaSBWMiIpCiAJLyogTWFpbnRhaW5lcjogQ2hyaXN0b3BoZXIgTW9vcmUgPG1vb3JlQGZyZWUuZnI+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZWRtaW5pX3YyX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA1ZTNiZjViLi5mMzQwZWQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMCw3ICsxMCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL29yaW9uNXguaD4KIAotCS5tYWNybyAgYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybyAgYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJbGRyCVxycCwgPU9SSU9ONVhfUkVHU19QSFlTX0JBU0UKIAlsZHIJXHJ2LCA9T1JJT041WF9SRUdTX1ZJUlRfQkFTRQogCW9ycglccnAsIFxycCwgIzB4MDAwMTIwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzY5OTE3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIE1hcnZlbGwgT3Jpb24gbWVtb3J5IGRlZmluaXRpb25zCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2lycS5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2lycS5jCmluZGV4IDQzY2Y4YmMuLmIxYjQ1ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaXJxLmMKQEAgLTksMTIgKzksMTEgQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9icmlkZ2UtcmVncy5oPgogI2luY2x1ZGUgPHBsYXQvaXJxLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgva3Vyb2JveF9wcm8tc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9rdXJvYm94X3Byby1zZXR1cC5jCmluZGV4IDAwMzgxMjQuLmQzY2QzZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9rdXJvYm94X3Byby1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9rdXJvYm94X3Byby1zZXR1cC5jCkBAIC03LDcgKzcsNyBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPG1hY2gvb3Jpb241eC5oPgpAQCAtMzgwLDcgKzM3OSw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfS1VST0JPWF9QUk8KIE1BQ0hJTkVfU1RBUlQoS1VST0JPWF9QUk8sICJCdWZmYWxvL1Jldm9nZWFyIEt1cm9ib3ggUHJvIikKIAkvKiBNYWludGFpbmVyOiBSb25lbiBTaGl0cml0IDxyc2hpdHJpdEBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBrdXJvYm94X3Byb19pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCkBAIC0zOTMsNyArMzkyLDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9MSU5LU1RBVElPTl9QUk8KIE1BQ0hJTkVfU1RBUlQoTElOS1NUQVRJT05fUFJPLCAiQnVmZmFsbyBMaW5rc3RhdGlvbiBQcm8vTGl2ZSIpCiAJLyogTWFpbnRhaW5lcjogQnlyb24gQnJhZGxleSA8Ynlyb24uYmJyYWRsZXlAZ21haWwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGt1cm9ib3hfcHJvX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9scy1jaGwtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9scy1jaGwtc2V0dXAuYwppbmRleCA1MDY1ODAzLi45NTAzZmZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbHMtY2hsLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzLWNobC1zZXR1cC5jCkBAIC0zMTgsNyArMzE4LDcgQEAKIAogTUFDSElORV9TVEFSVChMSU5LU1RBVElPTl9MU0NITCwgIkJ1ZmZhbG8gTGlua3N0YXRpb24gTGl2ZVYzIChMUy1DSEwpIikKIAkvKiBNYWludGFpbmVyOiBBc2ggSHVnaGVzIDxhc2hsZXkuaHVnaGVzQGJsdWV5b25kZXIuY28udWs+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gbHNjaGxfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzX2hnbC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzX2hnbC1zZXR1cC5jCmluZGV4IDg1MDNkMGEuLmVkNmQ3NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9sc19oZ2wtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbHNfaGdsLXNldHVwLmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogCiBNQUNISU5FX1NUQVJUKExJTktTVEFUSU9OX0xTX0hHTCwgIkJ1ZmZhbG8gTGlua3N0YXRpb24gTFMtSEdMIikKIAkvKiBNYWludGFpbmVyOiBaaHUgUWluZ3NlbiA8emh1cXNAY24uZnVqaXN0dS5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gbHNfaGdsX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9sc21pbmktc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9sc21pbmktc2V0dXAuYwppbmRleCA5YzgyNzIzLi43NDNmN2YxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbHNtaW5pLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzbWluaS1zZXR1cC5jCkBAIC0yNjcsNyArMjY3LDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9MSU5LU1RBVElPTl9NSU5JCiBNQUNISU5FX1NUQVJUKExJTktTVEFUSU9OX01JTkksICJCdWZmYWxvIExpbmtzdGF0aW9uIE1pbmkiKQogCS8qIE1haW50YWluZXI6IEFsZXhleSBLb3B5dGtvIDxhbGV4ZXlAa29weXRrby5ydT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBsc21pbmlfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tc3MyLXNldHVwLmMKaW5kZXggZWYzYmI4ZS4uNjAyMGUyNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tc3MyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYwpAQCAtMjYxLDcgKzI2MSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTVNTMiwgIk1heHRvciBTaGFyZWQgU3RvcmFnZSBJSSIpCiAJLyogTWFpbnRhaW5lcjogU3lsdmVyIEJydW5lYXUgPHN5bHZlci5icnVuZWF1QGdvb2dsZW1haWwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG1zczJfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L212MjEyMC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L212MjEyMC1zZXR1cC5jCmluZGV4IDYzZmYxMGMuLjIwMWFlMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tdjIxMjAtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXYyMTIwLXNldHVwLmMKQEAgLTcsNyArNyw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKICAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxtYWNoL29yaW9uNXguaD4KICNpbmNsdWRlICJjb21tb24uaCIKQEAgLTIyOSw3ICsyMjgsNyBAQAogLyogV2FybmluZzogSFAgdXNlcyBhIHdyb25nIG1hY2gtdHlwZSAoPTUyNikgaW4gdGhlaXIgYm9vdGxvYWRlciAqLwogTUFDSElORV9TVEFSVChNVjIxMjAsICJIUCBNZWRpYSBWYXVsdCBtdjIxMjAiKQogCS8qIE1haW50YWluZXI6IE1hcnRpbiBNaWNobG1heXIgPHRibUBjeXJpdXMuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG12MjEyMF9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbmV0MmJpZy1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L25ldDJiaWctc2V0dXAuYwppbmRleCBlNDNiMzljLi42MTk3Yzc5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbmV0MmJpZy1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9uZXQyYmlnLXNldHVwLmMKQEAgLTQxOSw3ICs0MTksNyBAQAogCiAvKiBXYXJuaW5nOiBMYUNpZSB1c2UgYSB3cm9uZyBtYWNoLXR5cGUgKDB4MjBlPTUyNikgaW4gdGhlaXIgYm9vdGxvYWRlci4gKi8KIE1BQ0hJTkVfU1RBUlQoTkVUMkJJRywgIkxhQ2llIDJCaWcgTmV0d29yayIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gbmV0MmJpZ19pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1meG8tc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCmluZGV4IDI5MWQyMmIuLmViZDY3NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCkBAIC03LDcgKzcsNyBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxuZXQvZHNhLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgpAQCAtMTY5LDcgKzE2OCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUkQ4OEY1MTgxTF9GWE8sICJNYXJ2ZWxsIE9yaW9uLVZvSVAgRlhPIFJlZmVyZW5jZSBEZXNpZ24iKQogCS8qIE1haW50YWluZXI6IE5pY29sYXMgUGl0cmUgPG5pY29AbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcmQ4OGY1MTgxbF9meG9faW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZ2Utc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWdlLXNldHVwLmMKaW5kZXggM2YwMjM2Mi4uMDVkYjJkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZ2Utc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jCkBAIC03LDcgKzcsNyBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPG5ldC9kc2EuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CkBAIC0xODEsNyArMTgwLDcgQEAKIAogTUFDSElORV9TVEFSVChSRDg4RjUxODFMX0dFLCAiTWFydmVsbCBPcmlvbi1Wb0lQIEdFIFJlZmVyZW5jZSBEZXNpZ24iKQogCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHJkODhmNTE4MWxfZ2VfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jCmluZGV4IDI3ZmQzOGUuLmU0N2ZhMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgyLXNldHVwLmMKQEAgLTksNyArOSw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgpAQCAtMzA2LDcgKzMwNSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUkQ4OEY1MTgyLCAiTWFydmVsbCBPcmlvbi1OQVMgUmVmZXJlbmNlIERlc2lnbiIpCiAJLyogTWFpbnRhaW5lcjogUm9uZW4gU2hpdHJpdCA8cnNoaXRyaXRAbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcmQ4OGY1MTgyX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjYxODNhcC1nZS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNjE4M2FwLWdlLXNldHVwLmMKaW5kZXggYWQyZWJhOS4uNjQzMTcyNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNjE4M2FwLWdlLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNjE4M2FwLWdlLXNldHVwLmMKQEAgLTcsNyArNyw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPG5ldC9kc2EuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CkBAIC0xMjIsNyArMTIxLDcgQEAKIAogTUFDSElORV9TVEFSVChSRDg4RjYxODNBUF9HRSwgIk1hcnZlbGwgT3Jpb24tMS05MCBBUCBHRSBSZWZlcmVuY2UgRGVzaWduIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSByZDg4ZjYxODNhcF9nZV9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdGVyYXN0YXRpb25fcHJvMi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RlcmFzdGF0aW9uX3BybzItc2V0dXAuYwppbmRleCBhMzRlNGZhLi4yOWYxNTI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdGVyYXN0YXRpb25fcHJvMi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90ZXJhc3RhdGlvbl9wcm8yLXNldHVwLmMKQEAgLTgsNyArOCw3IEBACiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9vcmlvbjV4Lmg+CkBAIC0zNTgsNyArMzU3LDcgQEAKIAogTUFDSElORV9TVEFSVChURVJBU1RBVElPTl9QUk8yLCAiQnVmZmFsbyBUZXJhc3RhdGlvbiBQcm8gSUkvTGl2ZSIpCiAJLyogTWFpbnRhaW5lcjogIFN5bHZlciBCcnVuZWF1IDxzeWx2ZXIuYnJ1bmVhdUBnb29nbGVtYWlsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSB0c3AyX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czIwOS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzMjA5LXNldHVwLmMKaW5kZXggYzk4MzE2MS4uMzFlNTFmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzMjA5LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzMjA5LXNldHVwLmMKQEAgLTgsNyArOCw3IEBACiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YV9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9vcmlvbjV4Lmg+CkBAIC0zMjMsNyArMzIyLDcgQEAKIAogTUFDSElORV9TVEFSVChUUzIwOSwgIlFOQVAgVFMtMTA5L1RTLTIwOSIpCiAJLyogTWFpbnRhaW5lcjogQnlyb24gQnJhZGxleSA8Ynlyb24uYmJyYWRsZXlAZ21haWwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHFuYXBfdHMyMDlfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzNDA5LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM0MDktc2V0dXAuYwppbmRleCBjYzMzYjIyLi4wZmJjYzE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM0MDktc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM0MDktc2V0dXAuYwpAQCAtMTEsNyArMTEsNyBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPG1hY2gvb3Jpb241eC5oPgpAQCAtMzEyLDcgKzMxMSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVFM0MDksICJRTkFQIFRTLTQwOSIpCiAJLyogTWFpbnRhaW5lcjogIFN5bHZlciBCcnVuZWF1IDxzeWx2ZXIuYnJ1bmVhdUBnbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcW5hcF90czQwOV9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM3OHh4LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM3OHh4LXNldHVwLmMKaW5kZXggNmI3YjU0MS4uYjM1ZTIwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzNzh4eC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czc4eHgtc2V0dXAuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJCS5wYXJ0aXRpb25zCQk9IHRzNzh4eF90c19uYW5kX3BhcnRzLAogCQkubnJfcGFydGl0aW9ucwkJPSBBUlJBWV9TSVpFKHRzNzh4eF90c19uYW5kX3BhcnRzKSwKIAkJLmNoaXBfZGVsYXkJCT0gMTUsCi0JCS5vcHRpb25zCQk9IE5BTkRfVVNFX0ZMQVNIX0JCVCwKKwkJLmJidF9vcHRpb25zCQk9IE5BTkRfQkJUX1VTRV9GTEFTSCwKIAl9LAogCS5jdHJsCT0gewogCQkvKgpAQCAtNjIxLDcgKzYyMSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVFM3OFhYLCAiVGVjaG5vbG9naWMgU3lzdGVtcyBUUy03OHh4IFNCQyIpCiAJLyogTWFpbnRhaW5lcjogQWxleGFuZGVyIENsb3V0ZXIgPGFsZXhAZGlncml6Lm9yZy51az4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSB0czc4eHhfaW5pdCwKIAkubWFwX2lvCQk9IHRzNzh4eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd25yODU0dC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3ducjg1NHQtc2V0dXAuYwppbmRleCAyNjUzNTk1Li5iOGJlN2Q4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd25yODU0dC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC93bnI4NTR0LXNldHVwLmMKQEAgLTUsNyArNSw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPG5ldC9kc2EuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPG1hY2gvb3Jpb241eC5oPgpAQCAtMTczLDcgKzE3Miw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoV05SODU0VCwgIk5ldGdlYXIgV05SODU0VCIpCiAJLyogTWFpbnRhaW5lcjogSW1yZSBLYWxveiA8a2Fsb3pAb3BlbndydC5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gd25yODU0dF9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd3J0MzUwbi12Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3dydDM1MG4tdjItc2V0dXAuYwppbmRleCAyNTFlZjE1Li5mYWY4MWEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd3J0MzUwbi12Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC93cnQzNTBuLXYyLXNldHVwLmMKQEAgLTUsNyArNSw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxuZXQvZHNhLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxtYWNoL29yaW9uNXguaD4KQEAgLTI2MSw3ICsyNjAsNyBAQAogCiBNQUNISU5FX1NUQVJUKFdSVDM1ME5fVjIsICJMaW5rc3lzIFdSVDM1ME4gdjIiKQogCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHdydDM1MG5fdjJfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTUwYjYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitvYmoteQk6PSBjb21tb24ubworb2JqLXkJKz0gdGltZS5vCitvYmoteQkrPSBpby5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI3MTc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxIEBACit6cmVsYWRkci15IDo9IDB4MDAwMDgwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkMDgzNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2NvbW1vbi5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQWxsIGVucXVpcmllcyB0byBzdXBwb3J0QHBpY29jaGlwLmNvbQorICovCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvdmljLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvcGljb3hjZWxsX3NvYy5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwaWNveGNlbGxfaW5pdF9tYWNoaW5lKHZvaWQpCit7CisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb2ZfZGVmYXVsdF9idXNfbWF0Y2hfdGFibGUsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGljb3hjZWxsX2R0X21hdGNoW10gPSB7CisJInBpY29jaGlwLHBjM3gyIiwKKwkicGljb2NoaXAscGMzeDMiLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZpY19vZl9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiYXJtLHBsMTkyLXZpYyIgfSwKKwl7IC8qIFNlbnRpbmVsICovIH0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwaWNveGNlbGxfaW5pdF9pcnEodm9pZCkKK3sKKwl2aWNfaW5pdChJT19BRERSRVNTKFBJQ09YQ0VMTF9WSUMwX0JBU0UpLCAwLCB+MCwgMCk7CisJdmljX2luaXQoSU9fQUREUkVTUyhQSUNPWENFTExfVklDMV9CQVNFKSwgMzIsIH4wLCAwKTsKKwlpcnFfZG9tYWluX2dlbmVyYXRlX3NpbXBsZSh2aWNfb2ZfbWF0Y2gsIFBJQ09YQ0VMTF9WSUMwX0JBU0UsIDApOworCWlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKHZpY19vZl9tYXRjaCwgUElDT1hDRUxMX1ZJQzFfQkFTRSwgMzIpOworfQorCitEVF9NQUNISU5FX1NUQVJUKFBJQ09YQ0VMTCwgIlBpY29jaGlwIHBpY29YY2VsbCIpCisJLm1hcF9pbwkJPSBwaWNveGNlbGxfbWFwX2lvLAorCS5ucl9pcnFzCT0gQVJDSF9OUl9JUlFTLAorCS5pbml0X2lycQk9IHBpY294Y2VsbF9pbml0X2lycSwKKwkudGltZXIJCT0gJnBpY294Y2VsbF90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gcGljb3hjZWxsX2luaXRfbWFjaGluZSwKKwkuZHRfY29tcGF0CT0gcGljb3hjZWxsX2R0X21hdGNoLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2M2YwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2NvbW1vbi5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQWxsIGVucXVpcmllcyB0byBzdXBwb3J0QHBpY29jaGlwLmNvbQorICovCisjaWZuZGVmIF9fUElDT1hDRUxMX0NPTU1PTl9IX18KKyNkZWZpbmUgX19QSUNPWENFTExfQ09NTU9OX0hfXworCisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCitleHRlcm4gc3RydWN0IHN5c190aW1lciBwaWNveGNlbGxfdGltZXI7CitleHRlcm4gdm9pZCBwaWNveGNlbGxfbWFwX2lvKHZvaWQpOworCisjZW5kaWYgLyogX19QSUNPWENFTExfQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQ0ZWUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEZXJpdmVkIGZyb20gYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIHRvIHVzZSAzMi1iaXQKKyAqIGFjY2Vzc2VzIHRvIHRoZSA4MjUwLgorICovCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjZGVmaW5lIFVBUlRfU0hJRlQgMgorCisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKKwkJbGRyCVxydiwgPVBIWVNfVE9fSU8oUElDT1hDRUxMX1VBUlQxX0JBU0UpCisJCWxkcglccnAsID1QSUNPWENFTExfVUFSVDFfQkFTRQorCQkuZW5kbQorCisJCS5tYWNybwlzZW5kdWFydCxyZCxyeAorCQlzdHIJXHJkLCBbXHJ4LCAjVUFSVF9UWCA8PCBVQVJUX1NISUZUXQorCQkuZW5kbQorCisJCS5tYWNybwlidXN5dWFydCxyZCxyeAorMTAwMjoJCWxkcglccmQsIFtccngsICNVQVJUX0xTUiA8PCBVQVJUX1NISUZUXQorCQlhbmQJXHJkLCBccmQsICNVQVJUX0xTUl9URU1UIHwgVUFSVF9MU1JfVEhSRQorCQl0ZXEJXHJkLCAjVUFSVF9MU1JfVEVNVCB8IFVBUlRfTFNSX1RIUkUKKwkJYm5lCTEwMDJiCisJCS5lbmRtCisKKwkJLyogVGhlIFVBUlQncyBkb24ndCBoYXZlIGFueSBmbG93IGNvbnRyb2wgSU8ncyB3aXJlZCB1cC4gKi8KKwkJLm1hY3JvCXdhaXR1YXJ0LHJkLHJ4CisJCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YjA5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMCwwICsxLDE5IEBACisvKgorICogZW50cnktbWFjcm8uUworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogTG93LWxldmVsIElSUSBoZWxwZXIgbWFjcm9zIGZvciBwaWNvWGNlbGwgcGxhdGZvcm1zCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworI2RlZmluZSBWQV9WSUMwCQlJT19BRERSRVNTKFBJQ09YQ0VMTF9WSUMwX0JBU0UpCisjZGVmaW5lIFZBX1ZJQzEJCUlPX0FERFJFU1MoUElDT1hDRUxMX1ZJQzFfQkFTRSkKKworI2luY2x1ZGUgPGFzbS9lbnRyeS1tYWNyby12aWMyLlM+CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2dwaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vZnRyYWNlLmgKY29weSB0byBhcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvZ3Bpby5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZmY1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFBpY29jaGlwIEx0ZC4sIEphbWllIElsZXMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGhhcmR3YXJlIGRlZmluaXRpb25zIG9mIHRoZSBwaWNvWGNlbGwgU29DIGRldmljZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAorI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKKworI2luY2x1ZGUgPG1hY2gvcGljb3hjZWxsX3NvYy5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3M2VjNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9pby5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0FTTV9BUk1fQVJDSF9JT19ICisjZGVmaW5lIF9fQVNNX0FSTV9BUkNIX0lPX0gKKworLyogTm8gaW9wb3J0cywgYnV0IG5lZWRlZCBmb3IgZHJpdmVyIGNvbXBhdGliaWxpdHkuICovCisjZGVmaW5lIF9faW8oYSkJCQlfX3R5cGVzYWZlX2lvKGEpCisvKiBObyBQQ0kgcG9zc2libGUgb24gcGljb3hjZWxsLiAqLworI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQorCisjZW5kaWYgLyogX19BU01fQVJNX0FSQ0hfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9pcnFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxM2VkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFyZHdhcmUgZGVmaW5pdGlvbnMgb2YgdGhlIHBpY29YY2VsbCBTb0MgZGV2aWNlcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19NQUNIX0lSUVNfSAorI2RlZmluZSBfX01BQ0hfSVJRU19ICisKKyNkZWZpbmUgQVJDSF9OUl9JUlFTCQkJNjQKKyNkZWZpbmUgTlJfSVJRUwkJCQkoMTI4ICsgQVJDSF9OUl9JUlFTKQorCisjZGVmaW5lIElSUV9WSUMwX0JBU0UJCQkwCisjZGVmaW5lIElSUV9WSUMxX0JBU0UJCQkzMgorCisjZW5kaWYgLyogX19NQUNIX0lSUVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmFmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvbWFwLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fUElDT1hDRUxMX01BUF9IX18KKyNkZWZpbmUgX19QSUNPWENFTExfTUFQX0hfXworCisjZGVmaW5lIFBIWVNfVE9fSU8oeCkJCSgoKHgpICYgMHgwMGZmZmZmZikgfCAweGZlMDAwMDAwKQorCisjaWZkZWYgX19BU1NFTUJMWV9fCisjZGVmaW5lIElPX0FERFJFU1MoeCkJCVBIWVNfVE9fSU8oKHgpKQorI2Vsc2UKKyNkZWZpbmUgSU9fQUREUkVTUyh4KQkJKHZvaWQgX19pb21lbSBfX2ZvcmNlICopKFBIWVNfVE9fSU8oKHgpKSkKKyNlbmRpZgorCisjZW5kaWYgLyogX19QSUNPWENFTExfTUFQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vZnRyYWNlLmgKY29weSB0byBhcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9waWNveGNlbGxfc29jLmggYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvcGljb3hjZWxsX3NvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjZmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvcGljb3hjZWxsX3NvYy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFyZHdhcmUgZGVmaW5pdGlvbnMgb2YgdGhlIHBpY29YY2VsbCBTb0MgZGV2aWNlcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19QSUNPWENFTExfU09DX0hfXworI2RlZmluZSBfX1BJQ09YQ0VMTF9TT0NfSF9fCisKKyNkZWZpbmUgUElDT1hDRUxMX1VBUlQxX0JBU0UJCTB4ODAyMzAwMDAKKyNkZWZpbmUgUElDT1hDRUxMX1BFUklQSF9CQVNFCQkweDgwMDAwMDAwCisjZGVmaW5lIFBJQ09YQ0VMTF9QRVJJUEhfTEVOR1RICQlTWl80TQorI2RlZmluZSBQSUNPWENFTExfVklDMF9CQVNFCQkweDgwMDYwMDAwCisjZGVmaW5lIFBJQ09YQ0VMTF9WSUMxX0JBU0UJCTB4ODAwNjQwMDAKKworI2VuZGlmIC8qIF9fUElDT1hDRUxMX1NPQ19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2M1ODliCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQoreworCS8qCisJICogVGhpcyBzaG91bGQgZG8gYWxsIHRoZSBjbG9jayBzd2l0Y2hpbmcgYW5kIHdhaXQgZm9yIGludGVycnVwdAorCSAqIHRyaWNrcy4KKwkgKi8KKwljcHVfZG9faWRsZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZXNldChpbnQgbW9kZSwgY29uc3QgY2hhciAqY21kKQoreworCS8qIFdhdGNoZG9nIHJlc2V0IHRvIGdvIGhlcmUuICovCit9CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvdGltZXguaCBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC90aW1leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNTQwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvdGltZXguaApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFBpY29jaGlwIEx0ZC4sIEphbWllIElsZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19USU1FWF9IX18KKyNkZWZpbmUgX19USU1FWF9IX18KKworLyogQm9ndXMgdmFsdWUgdG8gYWxsb3cgdGhlIGtlcm5lbCB0byBjb21waWxlLiAqLworI2RlZmluZSBDTE9DS19USUNLX1JBVEUJCTEwMDAwMDAKKworI2VuZGlmIC8qIF9fVElNRVhfSF9fICovCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGIxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2RlZmluZSBwdXRjKGMpCisjZGVmaW5lIGZsdXNoKCkKKyNkZWZpbmUgYXJjaF9kZWNvbXBfc2V0dXAoKQorI2RlZmluZSBhcmNoX2RlY29tcF93ZG9nKCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC92bWFsbG9jLmggYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMTZjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2RlZmluZSBWTUFMTE9DX0VORAkweGZlMDAwMDAwVUwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2lvLmMgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTliOWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pby5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQWxsIGVucXVpcmllcyB0byBzdXBwb3J0QHBpY29jaGlwLmNvbQorICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9waWNveGNlbGxfc29jLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKwordm9pZCBfX2luaXQgcGljb3hjZWxsX21hcF9pbyh2b2lkKQoreworCXN0cnVjdCBtYXBfZGVzYyBpb19tYXAgPSB7CisJCS52aXJ0dWFsCT0gUEhZU19UT19JTyhQSUNPWENFTExfUEVSSVBIX0JBU0UpLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oUElDT1hDRUxMX1BFUklQSF9CQVNFKSwKKwkJLmxlbmd0aAkJPSBQSUNPWENFTExfUEVSSVBIX0xFTkdUSCwKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX07CisKKwlpb3RhYmxlX2luaXQoJmlvX21hcCwgMSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhNTU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL3RpbWUuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbGwgZW5xdWlyaWVzIHRvIHN1cHBvcnRAcGljb2NoaXAuY29tCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kd19hcGJfdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9zY2hlZF9jbG9jay5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHRpbWVyX2dldF9iYXNlX2FuZF9yYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgIHZvaWQgX19pb21lbSAqKmJhc2UsIHUzMiAqcmF0ZSkKK3sKKwkqYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKworCWlmICghKmJhc2UpCisJCXBhbmljKCJVbmFibGUgdG8gbWFwIHJlZ3MgZm9yICVzIiwgbnAtPm5hbWUpOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2xvY2stZnJlcSIsIHJhdGUpKQorCQlwYW5pYygiTm8gY2xvY2stZnJlcSBwcm9wZXJ0eSBmb3IgJXMiLCBucC0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBpY294Y2VsbF9hZGRfY2xvY2tldmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmV2ZW50X3RpbWVyKQoreworCXZvaWQgX19pb21lbSAqaW9iYXNlOworCXN0cnVjdCBkd19hcGJfY2xvY2tfZXZlbnRfZGV2aWNlICpjZWQ7CisJdTMyIGlycSwgcmF0ZTsKKworCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGV2ZW50X3RpbWVyLCAwKTsKKwlpZiAoaXJxID09IE5PX0lSUSkKKwkJcGFuaWMoIk5vIElSUSBmb3IgY2xvY2sgZXZlbnQgdGltZXIiKTsKKworCXRpbWVyX2dldF9iYXNlX2FuZF9yYXRlKGV2ZW50X3RpbWVyLCAmaW9iYXNlLCAmcmF0ZSk7CisKKwljZWQgPSBkd19hcGJfY2xvY2tldmVudF9pbml0KDAsIGV2ZW50X3RpbWVyLT5uYW1lLCAzMDAsIGlvYmFzZSwgaXJxLAorCQkJCSAgICAgcmF0ZSk7CisJaWYgKCFjZWQpCisJCXBhbmljKCJVbmFibGUgdG8gaW5pdGlhbGlzZSBjbG9ja2V2ZW50IGRldmljZSIpOworCisJZHdfYXBiX2Nsb2NrZXZlbnRfcmVnaXN0ZXIoY2VkKTsKK30KKworc3RhdGljIHZvaWQgcGljb3hjZWxsX2FkZF9jbG9ja3NvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvdXJjZV90aW1lcikKK3sKKwl2b2lkIF9faW9tZW0gKmlvYmFzZTsKKwlzdHJ1Y3QgZHdfYXBiX2Nsb2Nrc291cmNlICpjczsKKwl1MzIgcmF0ZTsKKworCXRpbWVyX2dldF9iYXNlX2FuZF9yYXRlKHNvdXJjZV90aW1lciwgJmlvYmFzZSwgJnJhdGUpOworCisJY3MgPSBkd19hcGJfY2xvY2tzb3VyY2VfaW5pdCgzMDAsIHNvdXJjZV90aW1lci0+bmFtZSwgaW9iYXNlLCByYXRlKTsKKwlpZiAoIWNzKQorCQlwYW5pYygiVW5hYmxlIHRvIGluaXRpYWxpc2UgY2xvY2tzb3VyY2UgZGV2aWNlIik7CisKKwlkd19hcGJfY2xvY2tzb3VyY2Vfc3RhcnQoY3MpOworCWR3X2FwYl9jbG9ja3NvdXJjZV9yZWdpc3Rlcihjcyk7Cit9CisKK3N0YXRpYyBERUZJTkVfQ0xPQ0tfREFUQShjZCk7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpzY2hlZF9pb19iYXNlOworCit1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBzY2hlZF9jbG9jayh2b2lkKQoreworCWN5Y2xlX3QgY3ljID0gc2NoZWRfaW9fYmFzZSA/IF9fcmF3X3JlYWRsKHNjaGVkX2lvX2Jhc2UpIDogMDsKKworCXJldHVybiBjeWNfdG9fc2NoZWRfY2xvY2soJmNkLCBjeWMsICh1MzIpfjApOworfQorCitzdGF0aWMgdm9pZCBub3RyYWNlIHBpY294Y2VsbF91cGRhdGVfc2NoZWRfY2xvY2sodm9pZCkKK3sKKwljeWNsZV90IGN5YyA9IHNjaGVkX2lvX2Jhc2UgPyBfX3Jhd19yZWFkbChzY2hlZF9pb19iYXNlKSA6IDA7CisKKwl1cGRhdGVfc2NoZWRfY2xvY2soJmNkLCBjeWMsICh1MzIpfjApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwaWNveGNlbGxfcnRjX2lkc1tdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItcnRjIiB9LAorCXsgLyogU2VudGluZWwgKi8gfSwKK307CisKK3N0YXRpYyB2b2lkIHBpY294Y2VsbF9pbml0X3NjaGVkX2Nsb2NrKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzY2hlZF90aW1lcjsKKwl1MzIgcmF0ZTsKKworCXNjaGVkX3RpbWVyID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIHBpY294Y2VsbF9ydGNfaWRzKTsKKwlpZiAoIXNjaGVkX3RpbWVyKQorCQlwYW5pYygiTm8gUlRDIGZvciBzY2hlZCBjbG9jayB0byB1c2UiKTsKKworCXRpbWVyX2dldF9iYXNlX2FuZF9yYXRlKHNjaGVkX3RpbWVyLCAmc2NoZWRfaW9fYmFzZSwgJnJhdGUpOworCW9mX25vZGVfcHV0KHNjaGVkX3RpbWVyKTsKKworCWluaXRfc2NoZWRfY2xvY2soJmNkLCBwaWNveGNlbGxfdXBkYXRlX3NjaGVkX2Nsb2NrLCAzMiwgcmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBpY294Y2VsbF90aW1lcl9pZHNbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gyLXRpbWVyIiB9LAorCXt9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHBpY294Y2VsbF90aW1lcl9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpldmVudF90aW1lciwgKnNvdXJjZV90aW1lcjsKKworCWV2ZW50X3RpbWVyID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIHBpY294Y2VsbF90aW1lcl9pZHMpOworCWlmICghZXZlbnRfdGltZXIpCisJCXBhbmljKCJObyB0aW1lciBmb3IgY2xvY2tldmVudCIpOworCXBpY294Y2VsbF9hZGRfY2xvY2tldmVudChldmVudF90aW1lcik7CisKKwlzb3VyY2VfdGltZXIgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoZXZlbnRfdGltZXIsIHBpY294Y2VsbF90aW1lcl9pZHMpOworCWlmICghc291cmNlX3RpbWVyKQorCQlwYW5pYygiTm8gdGltZXIgZm9yIGNsb2Nrc291cmNlIik7CisJcGljb3hjZWxsX2FkZF9jbG9ja3NvdXJjZShzb3VyY2VfdGltZXIpOworCisJb2Zfbm9kZV9wdXQoc291cmNlX3RpbWVyKTsKKworCXBpY294Y2VsbF9pbml0X3NjaGVkX2Nsb2NrKCk7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgcGljb3hjZWxsX3RpbWVyID0geworCS5pbml0ID0gcGljb3hjZWxsX3RpbWVyX2luaXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9jb3JlLmMKaW5kZXggNjMzOTk3NTUuLmNkYjk1ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2NvcmUuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUE5YNDAwOCwgIlBoaWxpcHMgUE5YNDAwOCIpCiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuICovCi0JLmJvb3RfcGFyYW1zCQk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CQk9IDB4MTAwLAogCS5tYXBfaW8gCQk9IHBueDQwMDhfbWFwX2lvLAogCS5pbml0X2lycSAJCT0gcG54NDAwOF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lIAkJPSBwbng0MDA4X2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2dwaW8uYwppbmRleCBmMjE5OTE0Li5kM2U3MWQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9ncGlvLmMKQEAgLTEzLDE0ICsxMywxMyBAQAogICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCiAgKiBvciBpbXBsaWVkLgogICovCi0KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tcG54NDAwOC5oPgogCiAvKiByZWdpc3RlciBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBQSU9fVkFfQkFTRQlJT19BRERSRVNTKFBOWDQwMDhfUElPX0JBU0UpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggOTMxYWZlYi4uNDY5ZDYwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHgwMDA5MDAwMAogCQlhZGQJXHJ2LCBccnAsICMweGY0MDAwMDAwCUAgdmlydHVhbAogCQlhZGQJXHJwLCBccnAsICMweDQwMDAwMDAwCUAgcGh5c2ljYWwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZ3Bpby1wbng0MDA4LmggYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2dwaW8tcG54NDAwOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDI3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2dwaW8tcG54NDAwOC5oCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9ncGlvLXBueDQwMDguaAorICoKKyAqIFBOWDQwMDggR1BJTyBkcml2ZXIgLSBoZWFkZXIgZmlsZQorICoKKyAqIEF1dGhvcjogRG1pdHJ5IENoaWdpcmV2IDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiBCYXNlZCBvbiByZWZlcmVuY2UgY29kZSBieSBJd28gTWVyZ2xlciBhbmQgWi5UYWJhYWxvdXRlIGZyb20gUGhpbGlwczoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBLb25pbmtsaWprZSBQaGlsaXBzIEVsZWN0cm9uaWNzIE4uVi4KKyAqCisgKiAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX1BOWDQwMDhfR1BJT19IXworI2RlZmluZSBfUE5YNDAwOF9HUElPX0hfCisKKworLyogQmxvY2sgbnVtYmVycyAqLworI2RlZmluZSBHUElPX0lOCQkoMCkKKyNkZWZpbmUgR1BJT19PVVQJCSgweDEwMCkKKyNkZWZpbmUgR1BJT19CSUQJCSgweDIwMCkKKyNkZWZpbmUgR1BJT19SQU0JCSgweDMwMCkKKyNkZWZpbmUgR1BJT19NVVgJCSgweDQwMCkKKworI2RlZmluZSBHUElPX1RZUEVfTUFTSyhLKSAoKEspICYgMHg3MDApCisKKy8qIElOUFVUIEdQSU9zICovCisvKiBHUEkgKi8KKyNkZWZpbmUgR1BJXzAwCQkoR1BJT19JTiB8IDApCisjZGVmaW5lIEdQSV8wMQkJKEdQSU9fSU4gfCAxKQorI2RlZmluZSBHUElfMDIgICAJKEdQSU9fSU4gfCAyKQorI2RlZmluZSBHUElfMDMgCSAJKEdQSU9fSU4gfCAzKQorI2RlZmluZSBHUElfMDQgICAJKEdQSU9fSU4gfCA0KQorI2RlZmluZSBHUElfMDUgICAJKEdQSU9fSU4gfCA1KQorI2RlZmluZSBHUElfMDYgICAJKEdQSU9fSU4gfCA2KQorI2RlZmluZSBHUElfMDcgICAJKEdQSU9fSU4gfCA3KQorI2RlZmluZSBHUElfMDggICAJKEdQSU9fSU4gfCA4KQorI2RlZmluZSBHUElfMDkgICAJKEdQSU9fSU4gfCA5KQorI2RlZmluZSBVMV9SWCAJCShHUElPX0lOIHwgMTUpCisjZGVmaW5lIFUyX0hUQ1MgCShHUElPX0lOIHwgMTYpCisjZGVmaW5lIFUyX1JYCSAJKEdQSU9fSU4gfCAxNykKKyNkZWZpbmUgVTNfUlgJCShHUElPX0lOIHwgMTgpCisjZGVmaW5lIFU0X1JYCQkoR1BJT19JTiB8IDE5KQorI2RlZmluZSBVNV9SWAkJKEdQSU9fSU4gfCAyMCkKKyNkZWZpbmUgVTZfSVJSWCAJKEdQSU9fSU4gfCAyMSkKKyNkZWZpbmUgVTdfSENUUyAJKEdQSU9fSU4gfCAyMikKKyNkZWZpbmUgVTdfUlgJCShHUElPX0lOIHwgMjMpCisvKiBNSVNDIElOICovCisjZGVmaW5lIFNQSTFfREFUSU4JKEdQSU9fSU4gfCAyNSkKKyNkZWZpbmUgRElTUF9TWU5DCShHUElPX0lOIHwgMjYpCisjZGVmaW5lIFNQSTJfREFUSU4JKEdQSU9fSU4gfCAyNykKKyNkZWZpbmUgR1BJXzExICAJKEdQSU9fSU4gfCAyOCkKKworI2RlZmluZSBHUElPX0lOX01BU0sgICAweDFlZmY4M2ZmCisKKy8qIE9VVFBVVCBHUElPcyAqLworLyogR1BPICovCisjZGVmaW5lIEdQT18wMAkJKEdQSU9fT1VUIHwgMCkKKyNkZWZpbmUgR1BPXzAxICAgCShHUElPX09VVCB8IDEpCisjZGVmaW5lIEdQT18wMiAgIAkoR1BJT19PVVQgfCAyKQorI2RlZmluZSBHUE9fMDMgCSAJKEdQSU9fT1VUIHwgMykKKyNkZWZpbmUgR1BPXzA0ICAgCShHUElPX09VVCB8IDQpCisjZGVmaW5lIEdQT18wNSAgIAkoR1BJT19PVVQgfCA1KQorI2RlZmluZSBHUE9fMDYgICAJKEdQSU9fT1VUIHwgNikKKyNkZWZpbmUgR1BPXzA3ICAgCShHUElPX09VVCB8IDcpCisjZGVmaW5lIEdQT18wOAkJKEdQSU9fT1VUIHwgOCkKKyNkZWZpbmUgR1BPXzA5ICAgCShHUElPX09VVCB8IDkpCisjZGVmaW5lIEdQT18xMCAgIAkoR1BJT19PVVQgfCAxMCkKKyNkZWZpbmUgR1BPXzExIAkgCShHUElPX09VVCB8IDExKQorI2RlZmluZSBHUE9fMTIgICAJKEdQSU9fT1VUIHwgMTIpCisjZGVmaW5lIEdQT18xMyAgIAkoR1BJT19PVVQgfCAxMykKKyNkZWZpbmUgR1BPXzE0ICAgCShHUElPX09VVCB8IDE0KQorI2RlZmluZSBHUE9fMTUgICAJKEdQSU9fT1VUIHwgMTUpCisjZGVmaW5lIEdQT18xNiAgCShHUElPX09VVCB8IDE2KQorI2RlZmluZSBHUE9fMTcgCSAJKEdQSU9fT1VUIHwgMTcpCisjZGVmaW5lIEdQT18xOCAgIAkoR1BJT19PVVQgfCAxOCkKKyNkZWZpbmUgR1BPXzE5ICAgCShHUElPX09VVCB8IDE5KQorI2RlZmluZSBHUE9fMjAgICAJKEdQSU9fT1VUIHwgMjApCisjZGVmaW5lIEdQT18yMSAgIAkoR1BJT19PVVQgfCAyMSkKKyNkZWZpbmUgR1BPXzIyICAgCShHUElPX09VVCB8IDIyKQorI2RlZmluZSBHUE9fMjMgICAJKEdQSU9fT1VUIHwgMjMpCisKKyNkZWZpbmUgR1BJT19PVVRfTUFTSyAgIDB4ZmZmZmZmCisKKy8qIEJJRElSRUNUSU9OQUwgR1BJT3MgKi8KKy8qIFJBTSBwaW5zICovCisjZGVmaW5lIFJBTV9EMTkJCShHUElPX1JBTSB8IDApCisjZGVmaW5lIFJBTV9EMjAgIAkoR1BJT19SQU0gfCAxKQorI2RlZmluZSBSQU1fRDIxICAJKEdQSU9fUkFNIHwgMikKKyNkZWZpbmUgUkFNX0QyMiAJKEdQSU9fUkFNIHwgMykKKyNkZWZpbmUgUkFNX0QyMyAgCShHUElPX1JBTSB8IDQpCisjZGVmaW5lIFJBTV9EMjQgIAkoR1BJT19SQU0gfCA1KQorI2RlZmluZSBSQU1fRDI1ICAJKEdQSU9fUkFNIHwgNikKKyNkZWZpbmUgUkFNX0QyNiAgCShHUElPX1JBTSB8IDcpCisjZGVmaW5lIFJBTV9EMjcJCShHUElPX1JBTSB8IDgpCisjZGVmaW5lIFJBTV9EMjggIAkoR1BJT19SQU0gfCA5KQorI2RlZmluZSBSQU1fRDI5ICAJKEdQSU9fUkFNIHwgMTApCisjZGVmaW5lIFJBTV9EMzAgCShHUElPX1JBTSB8IDExKQorI2RlZmluZSBSQU1fRDMxICAJKEdQSU9fUkFNIHwgMTIpCisKKyNkZWZpbmUgR1BJT19SQU1fTUFTSyAgIDB4MWZmZgorCisvKiBJL08gcGlucyAqLworI2RlZmluZSBHUElPXzAwICAJKEdQSU9fQklEIHwgMjUpCisjZGVmaW5lIEdQSU9fMDEgCShHUElPX0JJRCB8IDI2KQorI2RlZmluZSBHUElPXzAyICAJKEdQSU9fQklEIHwgMjcpCisjZGVmaW5lIEdQSU9fMDMgIAkoR1BJT19CSUQgfCAyOCkKKyNkZWZpbmUgR1BJT18wNCAJKEdQSU9fQklEIHwgMjkpCisjZGVmaW5lIEdQSU9fMDUgIAkoR1BJT19CSUQgfCAzMCkKKworI2RlZmluZSBHUElPX0JJRF9NQVNLICAgMHg3ZTAwMDAwMAorCisvKiBOb24tR1BJTyBtdWx0aXBsZXhlZCBQSU9zLiBGb3IgbXVsdGlwbGV4aW5nIHdpdGggR1BJTywgcGxlYXNlIHVzZSBHUElPIG1hY3JvcyAqLworI2RlZmluZSBHUElPX1NEUkFNX1NFTCAJKEdQSU9fTVVYIHwgMykKKworI2RlZmluZSBHUElPX01VWF9NQVNLICAgMHg4CisKKy8qIEV4dHJhY3Rpb24vYXNzZW1ibHkgbWFjcm9zICovCisjZGVmaW5lIEdQSU9fQklUX01BU0soSykgKChLKSAmIDB4MUYpCisjZGVmaW5lIEdQSU9fQklUKEspICgxIDw8IEdQSU9fQklUX01BU0soSykpCisjZGVmaW5lIEdQSU9fSVNNVVgoSykgKChHUElPX1RZUEVfTUFTSyhLKSA9PSBHUElPX01VWCkgJiYgKEdQSU9fQklUKEspICYgR1BJT19NVVhfTUFTSykpCisjZGVmaW5lIEdQSU9fSVNSQU0oSykgKChHUElPX1RZUEVfTUFTSyhLKSA9PSBHUElPX1JBTSkgJiYgKEdQSU9fQklUKEspICYgR1BJT19SQU1fTUFTSykpCisjZGVmaW5lIEdQSU9fSVNCSUQoSykgKChHUElPX1RZUEVfTUFTSyhLKSA9PSBHUElPX0JJRCkgJiYgKEdQSU9fQklUKEspICYgR1BJT19CSURfTUFTSykpCisjZGVmaW5lIEdQSU9fSVNPVVQoSykgKChHUElPX1RZUEVfTUFTSyhLKSA9PSBHUElPX09VVCkgJiYgKEdQSU9fQklUKEspICYgR1BJT19PVVRfTUFTSykpCisjZGVmaW5lIEdQSU9fSVNJTihLKSAgKChHUElPX1RZUEVfTUFTSyhLKSA9PSBHUElPX0lOKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX0lOX01BU0spKQorCisvKiBTdGFydCBFbmFibGUgUGluIEludGVycnVwdHMgLSB0YWJsZSA1OCBwYWdlIDY2ICovCisKKyNkZWZpbmUgU0VfUElOX0JBU0VfSU5UICAgMzIKKworI2RlZmluZSBTRV9VN19SWF9JTlQgICAgICAgICAgICA2MworI2RlZmluZSBTRV9VN19IQ1RTX0lOVCAgICAgICAgICA2MgorI2RlZmluZSBTRV9CVF9DTEtSRVFfSU5UICAgICAgICA2MQorI2RlZmluZSBTRV9VNl9JUlJYX0lOVCAgICAgICAgICA2MAorLyo1OSB1bnVzZWQqLworI2RlZmluZSBTRV9VNV9SWF9JTlQgICAgICAgICAgICA1OAorI2RlZmluZSBTRV9HUElfMTFfSU5UICAgICAgICAgICA1NworI2RlZmluZSBTRV9VM19SWF9JTlQgICAgICAgICAgICA1NgorI2RlZmluZSBTRV9VMl9IQ1RTX0lOVCAgICAgICAgICA1NQorI2RlZmluZSBTRV9VMl9SWF9JTlQgICAgICAgICAgICA1NAorI2RlZmluZSBTRV9VMV9SWF9JTlQgICAgICAgICAgICA1MworI2RlZmluZSBTRV9ESVNQX1NZTkNfSU5UICAgICAgICA1MgorLyo1MSB1bnVzZWQqLworI2RlZmluZSBTRV9TRElPX0lOVF9OICAgICAgICAgICA1MAorI2RlZmluZSBTRV9NU0RJT19TVEFSVF9JTlQgICAgICA0OQorI2RlZmluZSBTRV9HUElfMDZfSU5UICAgICAgICAgICA0OAorI2RlZmluZSBTRV9HUElfMDVfSU5UICAgICAgICAgICA0NworI2RlZmluZSBTRV9HUElfMDRfSU5UICAgICAgICAgICA0NgorI2RlZmluZSBTRV9HUElfMDNfSU5UICAgICAgICAgICA0NQorI2RlZmluZSBTRV9HUElfMDJfSU5UICAgICAgICAgICA0NAorI2RlZmluZSBTRV9HUElfMDFfSU5UICAgICAgICAgICA0MworI2RlZmluZSBTRV9HUElfMDBfSU5UICAgICAgICAgICA0MgorI2RlZmluZSBTRV9TWVNDTEtFTl9QSU5fSU5UICAgICA0MQorI2RlZmluZSBTRV9TUEkxX0RBVEFJTl9JTlQgICAgICA0MAorI2RlZmluZSBTRV9HUElfMDdfSU5UICAgICAgICAgICAzOQorI2RlZmluZSBTRV9TUEkyX0RBVEFJTl9JTlQgICAgICAzOAorI2RlZmluZSBTRV9HUElfMTBfSU5UICAgICAgICAgICAzNworI2RlZmluZSBTRV9HUElfMDlfSU5UICAgICAgICAgICAzNgorI2RlZmluZSBTRV9HUElfMDhfSU5UICAgICAgICAgICAzNQorLyozNC0zMiB1bnVzZWQqLworCisvKiBTdGFydCBFbmFibGUgSW50ZXJuYWwgSW50ZXJydXB0cyAtIHRhYmxlIDU3IHBhZ2UgNjUgKi8KKworI2RlZmluZSBTRV9JTlRfQkFTRV9JTlQgICAwCisKKyNkZWZpbmUgU0VfVFNfSVJRICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgU0VfVFNfUF9JTlQgICAgICAgICAgICAgMzAKKyNkZWZpbmUgU0VfVFNfQVVYX0lOVCAgICAgICAgICAgMjkKKy8qMjctMjggdW51c2VkKi8KKyNkZWZpbmUgU0VfVVNCX0FIQl9ORUVEX0NMS19JTlQgMjYKKyNkZWZpbmUgU0VfTVNUSU1FUl9JTlQgICAgICAgICAgMjUKKyNkZWZpbmUgU0VfUlRDX0lOVCAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgU0VfVVNCX05FRURfQ0xLX0lOVCAgICAgMjMKKyNkZWZpbmUgU0VfVVNCX0lOVCAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgU0VfVVNCX0kyQ19JTlQgICAgICAgICAgMjEKKyNkZWZpbmUgU0VfVVNCX09UR19USU1FUl9JTlQgICAgMjAKKyNkZWZpbmUgU0VfVVNCX09UR19BVFhfSU5UX04gICAgMTkKKy8qMTggdW51c2VkKi8KKyNkZWZpbmUgU0VfRFNQX0dQSU80X0lOVCAgICAgICAgMTcKKyNkZWZpbmUgU0VfS0VZX0lSUSAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgU0VfRFNQX1NMQVZFUE9SVF9JTlQgICAgMTUKKyNkZWZpbmUgU0VfRFNQX0dQSU8xX0lOVCAgICAgICAgMTQKKyNkZWZpbmUgU0VfRFNQX0dQSU8wX0lOVCAgICAgICAgMTMKKyNkZWZpbmUgU0VfRFNQX0FIQl9JTlQgICAgICAgICAgMTIKKy8qMTEtNiB1bnVzZWQqLworI2RlZmluZSBTRV9HUElPXzA1X0lOVCAgICAgICAgICA1CisjZGVmaW5lIFNFX0dQSU9fMDRfSU5UICAgICAgICAgIDQKKyNkZWZpbmUgU0VfR1BJT18wM19JTlQgICAgICAgICAgMworI2RlZmluZSBTRV9HUElPXzAyX0lOVCAgICAgICAgICAyCisjZGVmaW5lIFNFX0dQSU9fMDFfSU5UICAgICAgICAgIDEKKyNkZWZpbmUgU0VfR1BJT18wMF9JTlQgICAgICAgICAgMAorCisjZGVmaW5lIFNUQVJUX0lOVF9SRUdfQklUKGlycSkgKDE8PCgoaXJxKSYweDFGKSkKKworI2RlZmluZSBTVEFSVF9JTlRfRVJfUkVHKGlycSkgICAgIElPX0FERFJFU1MoKFBOWDQwMDhfUFdSTUFOX0JBU0UgKyAweDIwICsgKCgoaXJxKSYoMHgxPDw1KSk+PjEpKSkKKyNkZWZpbmUgU1RBUlRfSU5UX1JTUl9SRUcoaXJxKSAgICBJT19BRERSRVNTKChQTlg0MDA4X1BXUk1BTl9CQVNFICsgMHgyNCArICgoKGlycSkmKDB4MTw8NSkpPj4xKSkpCisjZGVmaW5lIFNUQVJUX0lOVF9TUl9SRUcoaXJxKSAgICAgSU9fQUREUkVTUygoUE5YNDAwOF9QV1JNQU5fQkFTRSArIDB4MjggKyAoKChpcnEpJigweDE8PDUpKT4+MSkpKQorI2RlZmluZSBTVEFSVF9JTlRfQVBSX1JFRyhpcnEpICAgIElPX0FERFJFU1MoKFBOWDQwMDhfUFdSTUFOX0JBU0UgKyAweDJDICsgKCgoaXJxKSYoMHgxPDw1KSk+PjEpKSkKKworZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fcmVnaXN0ZXJfcGluKHVuc2lnbmVkIHNob3J0IHBpbik7CitleHRlcm4gaW50IHBueDQwMDhfZ3Bpb191bnJlZ2lzdGVyX3Bpbih1bnNpZ25lZCBzaG9ydCBwaW4pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcG54NDAwOF9ncGlvX3JlYWRfcGluKHVuc2lnbmVkIHNob3J0IHBpbik7CitleHRlcm4gaW50IHBueDQwMDhfZ3Bpb193cml0ZV9waW4odW5zaWduZWQgc2hvcnQgcGluLCBpbnQgb3V0cHV0KTsKK2V4dGVybiBpbnQgcG54NDAwOF9ncGlvX3NldF9waW5fZGlyZWN0aW9uKHVuc2lnbmVkIHNob3J0IHBpbiwgaW50IG91dHB1dCk7CitleHRlcm4gaW50IHBueDQwMDhfZ3Bpb19yZWFkX3Bpbl9kaXJlY3Rpb24odW5zaWduZWQgc2hvcnQgcGluKTsKK2V4dGVybiBpbnQgcG54NDAwOF9ncGlvX3NldF9waW5fbXV4KHVuc2lnbmVkIHNob3J0IHBpbiwgaW50IG91dHB1dCk7CitleHRlcm4gaW50IHBueDQwMDhfZ3Bpb19yZWFkX3Bpbl9tdXgodW5zaWduZWQgc2hvcnQgcGluKTsKKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF91bWFzayh1OCBpcnEpCit7CisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFNUQVJUX0lOVF9FUl9SRUcoaXJxKSkgfAorCQkgICAgIFNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9FUl9SRUcoaXJxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfbWFzayh1OCBpcnEpCit7CisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFNUQVJUX0lOVF9FUl9SRUcoaXJxKSkgJgorCQkgICAgIH5TVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfRVJfUkVHKGlycSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X2Fjayh1OCBpcnEpCit7CisJX19yYXdfd3JpdGVsKFNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9SU1JfUkVHKGlycSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X3NldF9mYWxsaW5nX2VkZ2UodTggaXJxKQoreworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTVEFSVF9JTlRfQVBSX1JFRyhpcnEpKSAmCisJCSAgICAgflNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9BUFJfUkVHKGlycSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X3NldF9yaXNpbmdfZWRnZSh1OCBpcnEpCit7CisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFNUQVJUX0lOVF9BUFJfUkVHKGlycSkpIHwKKwkJICAgICBTVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfQVBSX1JFRyhpcnEpKTsKK30KKworI2VuZGlmCQkJCS8qIF9QTlg0MDA4X0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9ncGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OTE0NjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZ3Bpby5oCi0gKgotICogUE5YNDAwOCBHUElPIGRyaXZlciAtIGhlYWRlciBmaWxlCi0gKgotICogQXV0aG9yOiBEbWl0cnkgQ2hpZ2lyZXYgPHNvdXJjZUBtdmlzdGEuY29tPgotICoKLSAqIEJhc2VkIG9uIHJlZmVyZW5jZSBjb2RlIGJ5IEl3byBNZXJnbGVyIGFuZCBaLlRhYmFhbG91dGUgZnJvbSBQaGlsaXBzOgotICogQ29weXJpZ2h0IChjKSAyMDA1IEtvbmlua2xpamtlIFBoaWxpcHMgRWxlY3Ryb25pY3MgTi5WLgotICoKLSAqIDIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfUE5YNDAwOF9HUElPX0hfCi0jZGVmaW5lIF9QTlg0MDA4X0dQSU9fSF8KLQotCi0vKiBCbG9jayBudW1iZXJzICovCi0jZGVmaW5lIEdQSU9fSU4JCSgwKQotI2RlZmluZSBHUElPX09VVAkJKDB4MTAwKQotI2RlZmluZSBHUElPX0JJRAkJKDB4MjAwKQotI2RlZmluZSBHUElPX1JBTQkJKDB4MzAwKQotI2RlZmluZSBHUElPX01VWAkJKDB4NDAwKQotCi0jZGVmaW5lIEdQSU9fVFlQRV9NQVNLKEspICgoSykgJiAweDcwMCkKLQotLyogSU5QVVQgR1BJT3MgKi8KLS8qIEdQSSAqLwotI2RlZmluZSBHUElfMDAJCShHUElPX0lOIHwgMCkKLSNkZWZpbmUgR1BJXzAxCQkoR1BJT19JTiB8IDEpCi0jZGVmaW5lIEdQSV8wMiAgIAkoR1BJT19JTiB8IDIpCi0jZGVmaW5lIEdQSV8wMyAJIAkoR1BJT19JTiB8IDMpCi0jZGVmaW5lIEdQSV8wNCAgIAkoR1BJT19JTiB8IDQpCi0jZGVmaW5lIEdQSV8wNSAgIAkoR1BJT19JTiB8IDUpCi0jZGVmaW5lIEdQSV8wNiAgIAkoR1BJT19JTiB8IDYpCi0jZGVmaW5lIEdQSV8wNyAgIAkoR1BJT19JTiB8IDcpCi0jZGVmaW5lIEdQSV8wOCAgIAkoR1BJT19JTiB8IDgpCi0jZGVmaW5lIEdQSV8wOSAgIAkoR1BJT19JTiB8IDkpCi0jZGVmaW5lIFUxX1JYIAkJKEdQSU9fSU4gfCAxNSkKLSNkZWZpbmUgVTJfSFRDUyAJKEdQSU9fSU4gfCAxNikKLSNkZWZpbmUgVTJfUlgJIAkoR1BJT19JTiB8IDE3KQotI2RlZmluZSBVM19SWAkJKEdQSU9fSU4gfCAxOCkKLSNkZWZpbmUgVTRfUlgJCShHUElPX0lOIHwgMTkpCi0jZGVmaW5lIFU1X1JYCQkoR1BJT19JTiB8IDIwKQotI2RlZmluZSBVNl9JUlJYIAkoR1BJT19JTiB8IDIxKQotI2RlZmluZSBVN19IQ1RTIAkoR1BJT19JTiB8IDIyKQotI2RlZmluZSBVN19SWAkJKEdQSU9fSU4gfCAyMykKLS8qIE1JU0MgSU4gKi8KLSNkZWZpbmUgU1BJMV9EQVRJTgkoR1BJT19JTiB8IDI1KQotI2RlZmluZSBESVNQX1NZTkMJKEdQSU9fSU4gfCAyNikKLSNkZWZpbmUgU1BJMl9EQVRJTgkoR1BJT19JTiB8IDI3KQotI2RlZmluZSBHUElfMTEgIAkoR1BJT19JTiB8IDI4KQotCi0jZGVmaW5lIEdQSU9fSU5fTUFTSyAgIDB4MWVmZjgzZmYKLQotLyogT1VUUFVUIEdQSU9zICovCi0vKiBHUE8gKi8KLSNkZWZpbmUgR1BPXzAwCQkoR1BJT19PVVQgfCAwKQotI2RlZmluZSBHUE9fMDEgICAJKEdQSU9fT1VUIHwgMSkKLSNkZWZpbmUgR1BPXzAyICAgCShHUElPX09VVCB8IDIpCi0jZGVmaW5lIEdQT18wMyAJIAkoR1BJT19PVVQgfCAzKQotI2RlZmluZSBHUE9fMDQgICAJKEdQSU9fT1VUIHwgNCkKLSNkZWZpbmUgR1BPXzA1ICAgCShHUElPX09VVCB8IDUpCi0jZGVmaW5lIEdQT18wNiAgIAkoR1BJT19PVVQgfCA2KQotI2RlZmluZSBHUE9fMDcgICAJKEdQSU9fT1VUIHwgNykKLSNkZWZpbmUgR1BPXzA4CQkoR1BJT19PVVQgfCA4KQotI2RlZmluZSBHUE9fMDkgICAJKEdQSU9fT1VUIHwgOSkKLSNkZWZpbmUgR1BPXzEwICAgCShHUElPX09VVCB8IDEwKQotI2RlZmluZSBHUE9fMTEgCSAJKEdQSU9fT1VUIHwgMTEpCi0jZGVmaW5lIEdQT18xMiAgIAkoR1BJT19PVVQgfCAxMikKLSNkZWZpbmUgR1BPXzEzICAgCShHUElPX09VVCB8IDEzKQotI2RlZmluZSBHUE9fMTQgICAJKEdQSU9fT1VUIHwgMTQpCi0jZGVmaW5lIEdQT18xNSAgIAkoR1BJT19PVVQgfCAxNSkKLSNkZWZpbmUgR1BPXzE2ICAJKEdQSU9fT1VUIHwgMTYpCi0jZGVmaW5lIEdQT18xNyAJIAkoR1BJT19PVVQgfCAxNykKLSNkZWZpbmUgR1BPXzE4ICAgCShHUElPX09VVCB8IDE4KQotI2RlZmluZSBHUE9fMTkgICAJKEdQSU9fT1VUIHwgMTkpCi0jZGVmaW5lIEdQT18yMCAgIAkoR1BJT19PVVQgfCAyMCkKLSNkZWZpbmUgR1BPXzIxICAgCShHUElPX09VVCB8IDIxKQotI2RlZmluZSBHUE9fMjIgICAJKEdQSU9fT1VUIHwgMjIpCi0jZGVmaW5lIEdQT18yMyAgIAkoR1BJT19PVVQgfCAyMykKLQotI2RlZmluZSBHUElPX09VVF9NQVNLICAgMHhmZmZmZmYKLQotLyogQklESVJFQ1RJT05BTCBHUElPcyAqLwotLyogUkFNIHBpbnMgKi8KLSNkZWZpbmUgUkFNX0QxOQkJKEdQSU9fUkFNIHwgMCkKLSNkZWZpbmUgUkFNX0QyMCAgCShHUElPX1JBTSB8IDEpCi0jZGVmaW5lIFJBTV9EMjEgIAkoR1BJT19SQU0gfCAyKQotI2RlZmluZSBSQU1fRDIyIAkoR1BJT19SQU0gfCAzKQotI2RlZmluZSBSQU1fRDIzICAJKEdQSU9fUkFNIHwgNCkKLSNkZWZpbmUgUkFNX0QyNCAgCShHUElPX1JBTSB8IDUpCi0jZGVmaW5lIFJBTV9EMjUgIAkoR1BJT19SQU0gfCA2KQotI2RlZmluZSBSQU1fRDI2ICAJKEdQSU9fUkFNIHwgNykKLSNkZWZpbmUgUkFNX0QyNwkJKEdQSU9fUkFNIHwgOCkKLSNkZWZpbmUgUkFNX0QyOCAgCShHUElPX1JBTSB8IDkpCi0jZGVmaW5lIFJBTV9EMjkgIAkoR1BJT19SQU0gfCAxMCkKLSNkZWZpbmUgUkFNX0QzMCAJKEdQSU9fUkFNIHwgMTEpCi0jZGVmaW5lIFJBTV9EMzEgIAkoR1BJT19SQU0gfCAxMikKLQotI2RlZmluZSBHUElPX1JBTV9NQVNLICAgMHgxZmZmCi0KLS8qIEkvTyBwaW5zICovCi0jZGVmaW5lIEdQSU9fMDAgIAkoR1BJT19CSUQgfCAyNSkKLSNkZWZpbmUgR1BJT18wMSAJKEdQSU9fQklEIHwgMjYpCi0jZGVmaW5lIEdQSU9fMDIgIAkoR1BJT19CSUQgfCAyNykKLSNkZWZpbmUgR1BJT18wMyAgCShHUElPX0JJRCB8IDI4KQotI2RlZmluZSBHUElPXzA0IAkoR1BJT19CSUQgfCAyOSkKLSNkZWZpbmUgR1BJT18wNSAgCShHUElPX0JJRCB8IDMwKQotCi0jZGVmaW5lIEdQSU9fQklEX01BU0sgICAweDdlMDAwMDAwCi0KLS8qIE5vbi1HUElPIG11bHRpcGxleGVkIFBJT3MuIEZvciBtdWx0aXBsZXhpbmcgd2l0aCBHUElPLCBwbGVhc2UgdXNlIEdQSU8gbWFjcm9zICovCi0jZGVmaW5lIEdQSU9fU0RSQU1fU0VMIAkoR1BJT19NVVggfCAzKQotCi0jZGVmaW5lIEdQSU9fTVVYX01BU0sgICAweDgKLQotLyogRXh0cmFjdGlvbi9hc3NlbWJseSBtYWNyb3MgKi8KLSNkZWZpbmUgR1BJT19CSVRfTUFTSyhLKSAoKEspICYgMHgxRikKLSNkZWZpbmUgR1BJT19CSVQoSykgKDEgPDwgR1BJT19CSVRfTUFTSyhLKSkKLSNkZWZpbmUgR1BJT19JU01VWChLKSAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fTVVYKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX01VWF9NQVNLKSkKLSNkZWZpbmUgR1BJT19JU1JBTShLKSAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fUkFNKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX1JBTV9NQVNLKSkKLSNkZWZpbmUgR1BJT19JU0JJRChLKSAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fQklEKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX0JJRF9NQVNLKSkKLSNkZWZpbmUgR1BJT19JU09VVChLKSAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fT1VUKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX09VVF9NQVNLKSkKLSNkZWZpbmUgR1BJT19JU0lOKEspICAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fSU4pICYmIChHUElPX0JJVChLKSAmIEdQSU9fSU5fTUFTSykpCi0KLS8qIFN0YXJ0IEVuYWJsZSBQaW4gSW50ZXJydXB0cyAtIHRhYmxlIDU4IHBhZ2UgNjYgKi8KLQotI2RlZmluZSBTRV9QSU5fQkFTRV9JTlQgICAzMgotCi0jZGVmaW5lIFNFX1U3X1JYX0lOVCAgICAgICAgICAgIDYzCi0jZGVmaW5lIFNFX1U3X0hDVFNfSU5UICAgICAgICAgIDYyCi0jZGVmaW5lIFNFX0JUX0NMS1JFUV9JTlQgICAgICAgIDYxCi0jZGVmaW5lIFNFX1U2X0lSUlhfSU5UICAgICAgICAgIDYwCi0vKjU5IHVudXNlZCovCi0jZGVmaW5lIFNFX1U1X1JYX0lOVCAgICAgICAgICAgIDU4Ci0jZGVmaW5lIFNFX0dQSV8xMV9JTlQgICAgICAgICAgIDU3Ci0jZGVmaW5lIFNFX1UzX1JYX0lOVCAgICAgICAgICAgIDU2Ci0jZGVmaW5lIFNFX1UyX0hDVFNfSU5UICAgICAgICAgIDU1Ci0jZGVmaW5lIFNFX1UyX1JYX0lOVCAgICAgICAgICAgIDU0Ci0jZGVmaW5lIFNFX1UxX1JYX0lOVCAgICAgICAgICAgIDUzCi0jZGVmaW5lIFNFX0RJU1BfU1lOQ19JTlQgICAgICAgIDUyCi0vKjUxIHVudXNlZCovCi0jZGVmaW5lIFNFX1NESU9fSU5UX04gICAgICAgICAgIDUwCi0jZGVmaW5lIFNFX01TRElPX1NUQVJUX0lOVCAgICAgIDQ5Ci0jZGVmaW5lIFNFX0dQSV8wNl9JTlQgICAgICAgICAgIDQ4Ci0jZGVmaW5lIFNFX0dQSV8wNV9JTlQgICAgICAgICAgIDQ3Ci0jZGVmaW5lIFNFX0dQSV8wNF9JTlQgICAgICAgICAgIDQ2Ci0jZGVmaW5lIFNFX0dQSV8wM19JTlQgICAgICAgICAgIDQ1Ci0jZGVmaW5lIFNFX0dQSV8wMl9JTlQgICAgICAgICAgIDQ0Ci0jZGVmaW5lIFNFX0dQSV8wMV9JTlQgICAgICAgICAgIDQzCi0jZGVmaW5lIFNFX0dQSV8wMF9JTlQgICAgICAgICAgIDQyCi0jZGVmaW5lIFNFX1NZU0NMS0VOX1BJTl9JTlQgICAgIDQxCi0jZGVmaW5lIFNFX1NQSTFfREFUQUlOX0lOVCAgICAgIDQwCi0jZGVmaW5lIFNFX0dQSV8wN19JTlQgICAgICAgICAgIDM5Ci0jZGVmaW5lIFNFX1NQSTJfREFUQUlOX0lOVCAgICAgIDM4Ci0jZGVmaW5lIFNFX0dQSV8xMF9JTlQgICAgICAgICAgIDM3Ci0jZGVmaW5lIFNFX0dQSV8wOV9JTlQgICAgICAgICAgIDM2Ci0jZGVmaW5lIFNFX0dQSV8wOF9JTlQgICAgICAgICAgIDM1Ci0vKjM0LTMyIHVudXNlZCovCi0KLS8qIFN0YXJ0IEVuYWJsZSBJbnRlcm5hbCBJbnRlcnJ1cHRzIC0gdGFibGUgNTcgcGFnZSA2NSAqLwotCi0jZGVmaW5lIFNFX0lOVF9CQVNFX0lOVCAgIDAKLQotI2RlZmluZSBTRV9UU19JUlEgICAgICAgICAgICAgICAzMQotI2RlZmluZSBTRV9UU19QX0lOVCAgICAgICAgICAgICAzMAotI2RlZmluZSBTRV9UU19BVVhfSU5UICAgICAgICAgICAyOQotLyoyNy0yOCB1bnVzZWQqLwotI2RlZmluZSBTRV9VU0JfQUhCX05FRURfQ0xLX0lOVCAyNgotI2RlZmluZSBTRV9NU1RJTUVSX0lOVCAgICAgICAgICAyNQotI2RlZmluZSBTRV9SVENfSU5UICAgICAgICAgICAgICAyNAotI2RlZmluZSBTRV9VU0JfTkVFRF9DTEtfSU5UICAgICAyMwotI2RlZmluZSBTRV9VU0JfSU5UICAgICAgICAgICAgICAyMgotI2RlZmluZSBTRV9VU0JfSTJDX0lOVCAgICAgICAgICAyMQotI2RlZmluZSBTRV9VU0JfT1RHX1RJTUVSX0lOVCAgICAyMAotI2RlZmluZSBTRV9VU0JfT1RHX0FUWF9JTlRfTiAgICAxOQotLyoxOCB1bnVzZWQqLwotI2RlZmluZSBTRV9EU1BfR1BJTzRfSU5UICAgICAgICAxNwotI2RlZmluZSBTRV9LRVlfSVJRICAgICAgICAgICAgICAxNgotI2RlZmluZSBTRV9EU1BfU0xBVkVQT1JUX0lOVCAgICAxNQotI2RlZmluZSBTRV9EU1BfR1BJTzFfSU5UICAgICAgICAxNAotI2RlZmluZSBTRV9EU1BfR1BJTzBfSU5UICAgICAgICAxMwotI2RlZmluZSBTRV9EU1BfQUhCX0lOVCAgICAgICAgICAxMgotLyoxMS02IHVudXNlZCovCi0jZGVmaW5lIFNFX0dQSU9fMDVfSU5UICAgICAgICAgIDUKLSNkZWZpbmUgU0VfR1BJT18wNF9JTlQgICAgICAgICAgNAotI2RlZmluZSBTRV9HUElPXzAzX0lOVCAgICAgICAgICAzCi0jZGVmaW5lIFNFX0dQSU9fMDJfSU5UICAgICAgICAgIDIKLSNkZWZpbmUgU0VfR1BJT18wMV9JTlQgICAgICAgICAgMQotI2RlZmluZSBTRV9HUElPXzAwX0lOVCAgICAgICAgICAwCi0KLSNkZWZpbmUgU1RBUlRfSU5UX1JFR19CSVQoaXJxKSAoMTw8KChpcnEpJjB4MUYpKQotCi0jZGVmaW5lIFNUQVJUX0lOVF9FUl9SRUcoaXJxKSAgICAgSU9fQUREUkVTUygoUE5YNDAwOF9QV1JNQU5fQkFTRSArIDB4MjAgKyAoKChpcnEpJigweDE8PDUpKT4+MSkpKQotI2RlZmluZSBTVEFSVF9JTlRfUlNSX1JFRyhpcnEpICAgIElPX0FERFJFU1MoKFBOWDQwMDhfUFdSTUFOX0JBU0UgKyAweDI0ICsgKCgoaXJxKSYoMHgxPDw1KSk+PjEpKSkKLSNkZWZpbmUgU1RBUlRfSU5UX1NSX1JFRyhpcnEpICAgICBJT19BRERSRVNTKChQTlg0MDA4X1BXUk1BTl9CQVNFICsgMHgyOCArICgoKGlycSkmKDB4MTw8NSkpPj4xKSkpCi0jZGVmaW5lIFNUQVJUX0lOVF9BUFJfUkVHKGlycSkgICAgSU9fQUREUkVTUygoUE5YNDAwOF9QV1JNQU5fQkFTRSArIDB4MkMgKyAoKChpcnEpJigweDE8PDUpKT4+MSkpKQotCi1leHRlcm4gaW50IHBueDQwMDhfZ3Bpb19yZWdpc3Rlcl9waW4odW5zaWduZWQgc2hvcnQgcGluKTsKLWV4dGVybiBpbnQgcG54NDAwOF9ncGlvX3VucmVnaXN0ZXJfcGluKHVuc2lnbmVkIHNob3J0IHBpbik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBwbng0MDA4X2dwaW9fcmVhZF9waW4odW5zaWduZWQgc2hvcnQgcGluKTsKLWV4dGVybiBpbnQgcG54NDAwOF9ncGlvX3dyaXRlX3Bpbih1bnNpZ25lZCBzaG9ydCBwaW4sIGludCBvdXRwdXQpOwotZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fc2V0X3Bpbl9kaXJlY3Rpb24odW5zaWduZWQgc2hvcnQgcGluLCBpbnQgb3V0cHV0KTsKLWV4dGVybiBpbnQgcG54NDAwOF9ncGlvX3JlYWRfcGluX2RpcmVjdGlvbih1bnNpZ25lZCBzaG9ydCBwaW4pOwotZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fc2V0X3Bpbl9tdXgodW5zaWduZWQgc2hvcnQgcGluLCBpbnQgb3V0cHV0KTsKLWV4dGVybiBpbnQgcG54NDAwOF9ncGlvX3JlYWRfcGluX211eCh1bnNpZ25lZCBzaG9ydCBwaW4pOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X3VtYXNrKHU4IGlycSkKLXsKLQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoU1RBUlRfSU5UX0VSX1JFRyhpcnEpKSB8Ci0JCSAgICAgU1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX0VSX1JFRyhpcnEpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF9tYXNrKHU4IGlycSkKLXsKLQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoU1RBUlRfSU5UX0VSX1JFRyhpcnEpKSAmCi0JCSAgICAgflNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9FUl9SRUcoaXJxKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfYWNrKHU4IGlycSkKLXsKLQlfX3Jhd193cml0ZWwoU1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX1JTUl9SRUcoaXJxKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfc2V0X2ZhbGxpbmdfZWRnZSh1OCBpcnEpCi17Ci0JX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFNUQVJUX0lOVF9BUFJfUkVHKGlycSkpICYKLQkJICAgICB+U1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX0FQUl9SRUcoaXJxKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfc2V0X3Jpc2luZ19lZGdlKHU4IGlycSkKLXsKLQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoU1RBUlRfSU5UX0FQUl9SRUcoaXJxKSkgfAotCQkgICAgIFNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9BUFJfUkVHKGlycSkpOwotfQotCi0jZW5kaWYJCQkJLyogX1BOWDQwMDhfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzVkYjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFBoaWxpcHMgU2VtaWNvbmR1Y3RvcnMKLSAqIENvcHlyaWdodCAoYykgMjAwNSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHg4MDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvc2VyaWFsLmMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvc2VyaWFsLmMKaW5kZXggZjQwOTYxZS4uMzc0YzEzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9zZXJpYWwuYwpAQCAtOSw3ICs5LDYgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0xOSw4ICsxOCw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAorI2luY2x1ZGUgPG1hY2gvZ3Bpby1wbng0MDA4Lmg+CiAjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogCiAjZGVmaW5lIFVBUlRfMwkJMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9NYWtlZmlsZQppbmRleCA3YWY3ZmMwLi4xM2RkMTYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXByaW1hMi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9NYWtlZmlsZQpAQCAtMyw1ICszLDcgQEAKIG9iai15ICs9IGNsb2NrLm8KIG9iai15ICs9IHJzdGMubwogb2JqLXkgKz0gcHJpbWEyLm8KK29iai15ICs9IHJ0Y2lvYnJnLm8KIG9iai0kKENPTkZJR19ERUJVR19MTCkgKz0gbGx1YXJ0Lm8KIG9iai0kKENPTkZJR19DQUNIRV9MMlgwKSArPSBsMngwLm8KK29iai0kKENPTkZJR19TVVNQRU5EKSArPSBwbS5vIHNsZWVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9jbG9jay5jCmluZGV4IDYxNWE0ZTcuLmFlYmFkN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvY2xvY2suYwpAQCAtMzUwLDEwICszNTAsMTAgQEAKIAkJLmNsayA9ICZjbGtfbWVtLAogCX0sIHsKIAkJLmRldl9pZCA9ICJzeXMiLAotCQkJLmNsayA9ICZjbGtfc3lzLAorCQkuY2xrID0gJmNsa19zeXMsCiAJfSwgewogCQkuZGV2X2lkID0gImlvIiwKLQkJCS5jbGsgPSAmY2xrX2lvLAorCQkuY2xrID0gJmNsa19pbywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBiZjc1MTA2Li5jZDk3NDkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXByaW1hMi9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC91YXJ0Lmg+CiAKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAlsZHIJXHJwLCA9U0lSRlNPQ19VQVJUMV9QQV9CQVNFCQlAIHBoeXNpY2FsCiAJbGRyCVxydiwgPVNJUkZTT0NfVUFSVDFfVkFfQkFTRQkJQCB2aXJ0dWFsCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4Y2Q1YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXByaW1hMi9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1wcmltYTIvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIOKAkyAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVCAgICAgICAgVUwoMHgwMDAwMDAwMCkKLQotLyoKLSAqIFJlc3RyaWN0IERNQS1hYmxlIHJlZ2lvbiB0byB3b3JrYXJvdW5kIHNpbGljb24gbGltaXRhdGlvbi4KLSAqIFRoZSBsaW1pdGF0aW9uIHJlc3RyaWN0cyBidWZmZXJzIGF2YWlsYWJsZSBmb3IgRE1BIHRvIFNEL01NQwotICogaGFyZHdhcmUgdG8gYmUgYmVsb3cgMjU2TUIKLSAqLwotI2RlZmluZSBBUk1fRE1BX1pPTkVfU0laRQkoU1pfMjU2TSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXByaW1hMi9pcnEuYyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL2lycS5jCmluZGV4IDdhZjI1NGQuLmQ5M2NlZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL2lycS5jCkBAIC0xMyw2ICsxMyw4IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2RlZmluZSBTSVJGU09DX0lOVF9SSVNDX01BU0swICAgICAgICAgIDB4MDAxOAogI2RlZmluZSBTSVJGU09DX0lOVF9SSVNDX01BU0sxICAgICAgICAgIDB4MDAxQwpAQCAtNjYsNyArNjgsNDggQEAKIAlpZiAoIXNpcmZzb2NfaW50Y19iYXNlKQogCQlwYW5pYygidW5hYmxlIHRvIG1hcCBpbnRjIGNwdSByZWdpc3RlcnNcbiIpOwogCisJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5wLCAwKTsKKwogCW9mX25vZGVfcHV0KG5wKTsKIAogCXNpcmZzb2NfaXJxX2luaXQoKTsKIH0KKworc3RydWN0IHNpcmZzb2NfaXJxX3N0YXR1cyB7CisJdTMyIG1hc2swOworCXUzMiBtYXNrMTsKKwl1MzIgbGV2ZWwwOworCXUzMiBsZXZlbDE7Cit9OworCitzdGF0aWMgc3RydWN0IHNpcmZzb2NfaXJxX3N0YXR1cyBzaXJmc29jX2lycV9zdDsKKworc3RhdGljIGludCBzaXJmc29jX2lycV9zdXNwZW5kKHZvaWQpCit7CisJc2lyZnNvY19pcnFfc3QubWFzazAgPSByZWFkbF9yZWxheGVkKHNpcmZzb2NfaW50Y19iYXNlICsgU0lSRlNPQ19JTlRfUklTQ19NQVNLMCk7CisJc2lyZnNvY19pcnFfc3QubWFzazEgPSByZWFkbF9yZWxheGVkKHNpcmZzb2NfaW50Y19iYXNlICsgU0lSRlNPQ19JTlRfUklTQ19NQVNLMSk7CisJc2lyZnNvY19pcnFfc3QubGV2ZWwwID0gcmVhZGxfcmVsYXhlZChzaXJmc29jX2ludGNfYmFzZSArIFNJUkZTT0NfSU5UX1JJU0NfTEVWRUwwKTsKKwlzaXJmc29jX2lycV9zdC5sZXZlbDEgPSByZWFkbF9yZWxheGVkKHNpcmZzb2NfaW50Y19iYXNlICsgU0lSRlNPQ19JTlRfUklTQ19MRVZFTDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpcmZzb2NfaXJxX3Jlc3VtZSh2b2lkKQoreworCXdyaXRlbF9yZWxheGVkKHNpcmZzb2NfaXJxX3N0Lm1hc2swLCBzaXJmc29jX2ludGNfYmFzZSArIFNJUkZTT0NfSU5UX1JJU0NfTUFTSzApOworCXdyaXRlbF9yZWxheGVkKHNpcmZzb2NfaXJxX3N0Lm1hc2sxLCBzaXJmc29jX2ludGNfYmFzZSArIFNJUkZTT0NfSU5UX1JJU0NfTUFTSzEpOworCXdyaXRlbF9yZWxheGVkKHNpcmZzb2NfaXJxX3N0LmxldmVsMCwgc2lyZnNvY19pbnRjX2Jhc2UgKyBTSVJGU09DX0lOVF9SSVNDX0xFVkVMMCk7CisJd3JpdGVsX3JlbGF4ZWQoc2lyZnNvY19pcnFfc3QubGV2ZWwxLCBzaXJmc29jX2ludGNfYmFzZSArIFNJUkZTT0NfSU5UX1JJU0NfTEVWRUwxKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBzaXJmc29jX2lycV9zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZAk9IHNpcmZzb2NfaXJxX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzaXJmc29jX2lycV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaXJmc29jX2lycV9wbV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnNpcmZzb2NfaXJxX3N5c2NvcmVfb3BzKTsKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChzaXJmc29jX2lycV9wbV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL2wyeDAuYyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL2wyeDAuYwppbmRleCA5Y2RhMjA1Li5jOTk4Mzc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXByaW1hMi9sMngwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvbDJ4MC5jCkBAIC04LDUyICs4LDI0IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KIAotI2RlZmluZSBMMlgwX0FERFJfRklMVEVSSU5HX1NUQVJUICAgICAgIDB4QzAwCi0jZGVmaW5lIEwyWDBfQUREUl9GSUxURVJJTkdfRU5EICAgICAgICAgMHhDMDQKLQotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbDJ4X2lkc1tdICA9IHsKLQl7IC5jb21wYXRpYmxlID0gImFybSxwbDMxMC1jYWNoZSIgfSwKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHByaW1hMl9sMngwX2lkc1tdICA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNpcmYscHJpbWEyLXBsMzEwLWNhY2hlIiB9LAorCXt9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2lyZnNvY19vZl9sMnhfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgc2lyZnNvY19sMngwX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXZvaWQgX19pb21lbSAqc2lyZnNvY19sMnhfYmFzZTsKIAotCW5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIGwyeF9pZHMpOwotCWlmICghbnApCi0JCXBhbmljKCJ1bmFibGUgdG8gZmluZCBjb21wYXRpYmxlIGwyeCBub2RlIGluIGR0YlxuIik7Ci0KLQlzaXJmc29jX2wyeF9iYXNlID0gb2ZfaW9tYXAobnAsIDApOwotCWlmICghc2lyZnNvY19sMnhfYmFzZSkKLQkJcGFuaWMoInVuYWJsZSB0byBtYXAgbDJ4IGNwdSByZWdpc3RlcnNcbiIpOwotCi0Jb2Zfbm9kZV9wdXQobnApOwotCi0JaWYgKCEocmVhZGxfcmVsYXhlZChzaXJmc29jX2wyeF9iYXNlICsgTDJYMF9DVFJMKSAmIDEpKSB7Ci0JCS8qCi0JCSAqIHNldCB0aGUgcGh5c2ljYWwgbWVtb3J5IHdpbmRvd3MgTDIgY2FjaGUgd2lsbCBjb3ZlcgotCQkgKi8KLQkJd3JpdGVsX3JlbGF4ZWQoUExBVF9QSFlTX09GRlNFVCArIDEwMjQgKiAxMDI0ICogMTAyNCwKLQkJCXNpcmZzb2NfbDJ4X2Jhc2UgKyBMMlgwX0FERFJfRklMVEVSSU5HX0VORCk7Ci0JCXdyaXRlbF9yZWxheGVkKFBMQVRfUEhZU19PRkZTRVQgfCAweDEsCi0JCQlzaXJmc29jX2wyeF9iYXNlICsgTDJYMF9BRERSX0ZJTFRFUklOR19TVEFSVCk7Ci0KLQkJd3JpdGVsX3JlbGF4ZWQoMCwKLQkJCXNpcmZzb2NfbDJ4X2Jhc2UgKyBMMlgwX1RBR19MQVRFTkNZX0NUUkwpOwotCQl3cml0ZWxfcmVsYXhlZCgwLAotCQkJc2lyZnNvY19sMnhfYmFzZSArIEwyWDBfREFUQV9MQVRFTkNZX0NUUkwpOworCW5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIHByaW1hMl9sMngwX2lkcyk7CisJaWYgKG5wKSB7CisJCXByX2luZm8oIkluaXRpYWxpemluZyBwcmltYTIgTDIgY2FjaGVcbiIpOworCQlyZXR1cm4gbDJ4MF9vZl9pbml0KDB4NDAwMDAsIDApOwogCX0KLQlsMngwX2luaXQoKHZvaWQgX19pb21lbSAqKXNpcmZzb2NfbDJ4X2Jhc2UsIDB4MDAwNDAwMDAsCi0JCTB4MDAwMDAwMDApOwogCiAJcmV0dXJuIDA7CiB9Ci1lYXJseV9pbml0Y2FsbChzaXJmc29jX29mX2wyeF9pbml0KTsKK2Vhcmx5X2luaXRjYWxsKHNpcmZzb2NfbDJ4MF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL3BtLmMgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNTMxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9wbS5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogcG93ZXIgbWFuYWdlbWVudCBlbnRyeSBmb3IgQ1NSIFNpUkZwcmltYUlJCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMvc2lyZnNvY19ydGNpb2JyZy5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKworI2luY2x1ZGUgInBtLmgiCisKKy8qCisgKiBzdXNwZW5kIGFzbSBjb2RlcyB3aWxsIGFjY2VzcyB0aGVzZSB0byBtYWtlIERSQU0gYmVjb21lIHNlbGYtcmVmcmVzaCBhbmQKKyAqIHN5c3RlbSBzbGVlcAorICovCit1MzIgc2lyZnNvY19wd3JjX2Jhc2U7Cit2b2lkIF9faW9tZW0gKnNpcmZzb2NfbWVtY19iYXNlOworCitzdGF0aWMgdm9pZCBzaXJmc29jX3NldF93YWtldXBfc291cmNlKHZvaWQpCit7CisJdTMyIHB3cl90cmlnZ2VyX2VuX3JlZzsKKwlwd3JfdHJpZ2dlcl9lbl9yZWcgPSBzaXJmc29jX3J0Y19pb2JyZ19yZWFkbChzaXJmc29jX3B3cmNfYmFzZSArCisJCVNJUkZTT0NfUFdSQ19UUklHR0VSX0VOKTsKKyNkZWZpbmUgWF9PTl9LRVlfQiAoMSA8PCAwKQorCXNpcmZzb2NfcnRjX2lvYnJnX3dyaXRlbChwd3JfdHJpZ2dlcl9lbl9yZWcgfCBYX09OX0tFWV9CLAorCQlzaXJmc29jX3B3cmNfYmFzZSArIFNJUkZTT0NfUFdSQ19UUklHR0VSX0VOKTsKK30KKworc3RhdGljIHZvaWQgc2lyZnNvY19zZXRfc2xlZXBfbW9kZSh1MzIgbW9kZSkKK3sKKwl1MzIgc2xlZXBfbW9kZSA9IHNpcmZzb2NfcnRjX2lvYnJnX3JlYWRsKHNpcmZzb2NfcHdyY19iYXNlICsKKwkJU0lSRlNPQ19QV1JDX1BETl9DVFJMKTsKKwlzbGVlcF9tb2RlICY9IH4oU0lSRlNPQ19TTEVFUF9NT0RFX01BU0sgPDwgMSk7CisJc2xlZXBfbW9kZSB8PSBtb2RlIDw8IDE7CisJc2lyZnNvY19ydGNfaW9icmdfd3JpdGVsKHNsZWVwX21vZGUsIHNpcmZzb2NfcHdyY19iYXNlICsKKwkJU0lSRlNPQ19QV1JDX1BETl9DVFJMKTsKK30KKworc3RhdGljIGludCBzaXJmc29jX3ByZV9zdXNwZW5kX3Bvd2VyX29mZih2b2lkKQoreworCXUzMiB3YWtldXBfZW50cnkgPSB2aXJ0X3RvX3BoeXMoY3B1X3Jlc3VtZSk7CisKKwlzaXJmc29jX3J0Y19pb2JyZ193cml0ZWwod2FrZXVwX2VudHJ5LCBzaXJmc29jX3B3cmNfYmFzZSArCisJCVNJUkZTT0NfUFdSQ19TQ1JBVENIX1BBRDEpOworCisJc2lyZnNvY19zZXRfd2FrZXVwX3NvdXJjZSgpOworCisJc2lyZnNvY19zZXRfc2xlZXBfbW9kZShTSVJGU09DX0RFRVBfU0xFRVBfTU9ERSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaXJmc29jX3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBQTV9TVVNQRU5EX01FTToKKwkJc2lyZnNvY19wcmVfc3VzcGVuZF9wb3dlcl9vZmYoKTsKKworCQlvdXRlcl9mbHVzaF9hbGwoKTsKKwkJb3V0ZXJfZGlzYWJsZSgpOworCQkvKiBnbyB6enogKi8KKwkJY3B1X3N1c3BlbmQoMCwgc2lyZnNvY19maW5pc2hfc3VzcGVuZCk7CisJCW91dGVyX3Jlc3VtZSgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgc2lyZnNvY19wbV9vcHMgPSB7CisJLmVudGVyID0gc2lyZnNvY19wbV9lbnRlciwKKwkudmFsaWQgPSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2lyZnNvY19wbV9pbml0KHZvaWQpCit7CisJc3VzcGVuZF9zZXRfb3BzKCZzaXJmc29jX3BtX29wcyk7CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHNpcmZzb2NfcG1faW5pdCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHB3cmNfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzaXJmLHByaW1hMi1wd3JjIiB9LAorCXt9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaXJmc29jX29mX3B3cmNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBwd3JjX2lkcyk7CisJaWYgKCFucCkKKwkJcGFuaWMoInVuYWJsZSB0byBmaW5kIGNvbXBhdGlibGUgcHdyYyBub2RlIGluIGR0YlxuIik7CisKKwkvKgorCSAqIHB3cmMgYmVoaW5kIHJ0Y2lvYnJnIGlzIG5vdCBsb2NhdGVkIGluIG1lbW9yeSBzcGFjZQorCSAqIHRob3VnaCB0aGUgcHJvcGVydHkgaXMgbmFtZWQgcmVnLiByZWcgb25seSBtZWFucyBiYXNlCisJICogb2Zmc2V0IGZvciBwd3JjLiB0aGVuIG9mX2lvbWFwIGlzIG5vdCBzdWl0YWJsZSBoZXJlLgorCSAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlZyIsICZzaXJmc29jX3B3cmNfYmFzZSkpCisJCXBhbmljKCJ1bmFibGUgdG8gZmluZCBiYXNlIGFkZHJlc3Mgb2YgcHdyYyBub2RlIGluIGR0YlxuIik7CisKKwlvZl9ub2RlX3B1dChucCk7CisKKwlyZXR1cm4gMDsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKHNpcmZzb2Nfb2ZfcHdyY19pbml0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWVtY19pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNpcmYscHJpbWEyLW1lbWMiIH0sCisJe30KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpcmZzb2NfbWVtY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb3AtPmRldi5vZl9ub2RlOworCisJc2lyZnNvY19tZW1jX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCFzaXJmc29jX21lbWNfYmFzZSkKKwkJcGFuaWMoInVuYWJsZSB0byBtYXAgbWVtYyByZWdpc3RlcnNcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNpcmZzb2NfbWVtY19kcml2ZXIgPSB7CisJLnByb2JlCQk9IHNpcmZzb2NfbWVtY19wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzaXJmc29jLW1lbWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gbWVtY19pZHMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNpcmZzb2NfbWVtY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2lyZnNvY19tZW1jX2RyaXZlcik7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChzaXJmc29jX21lbWNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXByaW1hMi9wbS5oIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvcG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWU2ZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvcG0uaApAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1wcmltYTIvcG0uaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9NQUNIX1BSSU1BMl9QTV9IXworI2RlZmluZSBfTUFDSF9QUklNQTJfUE1fSF8KKworI2RlZmluZSBTSVJGU09DX1BXUl9TTEVFUEZPUkNFCQkweDAxCisKKyNkZWZpbmUgU0lSRlNPQ19TTEVFUF9NT0RFX01BU0sgICAgICAgICAweDMKKyNkZWZpbmUgU0lSRlNPQ19ERUVQX1NMRUVQX01PREUgICAgICAgICAweDEKKworI2RlZmluZSBTSVJGU09DX1BXUkNfUEROX0NUUkwgICAgICAgICAgIDB4MAorI2RlZmluZSBTSVJGU09DX1BXUkNfUE9OX09GRiAgICAgICAgICAgIDB4NAorI2RlZmluZSBTSVJGU09DX1BXUkNfVFJJR0dFUl9FTiAgICAgICAgIDB4OAorI2RlZmluZSBTSVJGU09DX1BXUkNfUElOX1NUQVRVUyAgICAgICAgIDB4MTQKKyNkZWZpbmUgU0lSRlNPQ19QV1JDX1NDUkFUQ0hfUEFEMSAgICAgICAweDE4CisjZGVmaW5lIFNJUkZTT0NfUFdSQ19TQ1JBVENIX1BBRDIgICAgICAgMHgxQworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIGludCBzaXJmc29jX2ZpbmlzaF9zdXNwZW5kKHVuc2lnbmVkIGxvbmcpOworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXByaW1hMi9wcmltYTIuYyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3ByaW1hMi5jCmluZGV4IGY1NzEyNGIuLmVmNTU1YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL3ByaW1hMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3ByaW1hMi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIERlZmluZXMgbWFjaGluZXMgZm9yIENTUiBTaVJGcHJpbWFJSSAKKyAqIERlZmluZXMgbWFjaGluZXMgZm9yIENTUiBTaVJGcHJpbWFJSQogICoKICAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KICAqCkBAIC0zMSwxMSArMzEsMTIgQEAKIAogTUFDSElORV9TVEFSVChQUklNQTJfRVZCLCAicHJpbWEyY2IiKQogCS8qIE1haW50YWluZXI6IEJhcnJ5IFNvbmcgPGJhb2h1YS5zb25nQGNzci5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9lYXJseSAgICAgPSBzaXJmc29jX29mX2Nsa19pbml0LAogCS5tYXBfaW8gICAgICAgICA9IHNpcmZzb2NfbWFwX2xsdWFydCwKIAkuaW5pdF9pcnEJPSBzaXJmc29jX29mX2lycV9pbml0LAogCS50aW1lcgkJPSAmc2lyZnNvY190aW1lciwKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzI1Nk0sCiAJLmluaXRfbWFjaGluZQk9IHNpcmZzb2NfbWFjaF9pbml0LAogCS5kdF9jb21wYXQgICAgICA9IHByaW1hMmNiX2R0X21hdGNoLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL3J0Y2lvYnJnLmMgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9ydGNpb2JyZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkODBmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9ydGNpb2JyZy5jCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogUlRDIEkvTyBCcmlkZ2UgaW50ZXJmYWNlcyBmb3IgQ1NSIFNpUkZwcmltYUlJCisgKiBBUk0gYWNjZXNzIHRoZSByZWdpc3RlcnMgb2YgU1lTUlRDLCBHUFNSVEMgYW5kIFBXUkMgdGhyb3VnaCB0aGlzIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjZGVmaW5lIFNJUkZTT0NfQ1BVSU9CUkdfQ1RSTCAgICAgICAgICAgMHgwMAorI2RlZmluZSBTSVJGU09DX0NQVUlPQlJHX1dSQkUgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU0lSRlNPQ19DUFVJT0JSR19BRERSICAgICAgICAgICAweDA4CisjZGVmaW5lIFNJUkZTT0NfQ1BVSU9CUkdfREFUQSAgICAgICAgICAgMHgwYworCisvKgorICogc3VzcGVuZCBhc20gY29kZXMgd2lsbCBhY2Nlc3MgdGhpcyBhZGRyZXNzIHRvIG1ha2Ugc3lzdGVtIGRlZXBzbGVlcAorICogYWZ0ZXIgRFJBTSBiZWNvbWVzIHNlbGYtcmVmcmVzaAorICovCit2b2lkIF9faW9tZW0gKnNpcmZzb2NfcnRjaW9icmdfYmFzZTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnRjaW9icmdfbG9jayk7CisKKy8qCisgKiBzeW1ib2xzIHdpdGhvdXQgbG9jayBhcmUgb25seSB1c2VkIGJ5IHN1c3BlbmQgYXNtIGNvZGVzCisgKiBhbmQgdGhlc2Ugc3ltYm9scyBhcmUgbm90IGV4cG9ydGVkIHRvbworICovCit2b2lkIHNpcmZzb2NfcnRjX2lvYnJnX3dhaXRfc3luYyh2b2lkKQoreworCXdoaWxlIChyZWFkbF9yZWxheGVkKHNpcmZzb2NfcnRjaW9icmdfYmFzZSArIFNJUkZTT0NfQ1BVSU9CUkdfQ1RSTCkpCisJCWNwdV9yZWxheCgpOworfQorCit2b2lkIHNpcmZzb2NfcnRjX2lvYnJnX2Jlc3luY2luZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjaW9icmdfbG9jaywgZmxhZ3MpOworCisJc2lyZnNvY19ydGNfaW9icmdfd2FpdF9zeW5jKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNpb2JyZ19sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzaXJmc29jX3J0Y19pb2JyZ19iZXN5bmNpbmcpOworCit1MzIgX19zaXJmc29jX3J0Y19pb2JyZ19yZWFkbCh1MzIgYWRkcikKK3sKKwlzaXJmc29jX3J0Y19pb2JyZ193YWl0X3N5bmMoKTsKKworCXdyaXRlbF9yZWxheGVkKDB4MDAsIHNpcmZzb2NfcnRjaW9icmdfYmFzZSArIFNJUkZTT0NfQ1BVSU9CUkdfV1JCRSk7CisJd3JpdGVsX3JlbGF4ZWQoYWRkciwgc2lyZnNvY19ydGNpb2JyZ19iYXNlICsgU0lSRlNPQ19DUFVJT0JSR19BRERSKTsKKwl3cml0ZWxfcmVsYXhlZCgweDAxLCBzaXJmc29jX3J0Y2lvYnJnX2Jhc2UgKyBTSVJGU09DX0NQVUlPQlJHX0NUUkwpOworCisJc2lyZnNvY19ydGNfaW9icmdfd2FpdF9zeW5jKCk7CisKKwlyZXR1cm4gcmVhZGxfcmVsYXhlZChzaXJmc29jX3J0Y2lvYnJnX2Jhc2UgKyBTSVJGU09DX0NQVUlPQlJHX0RBVEEpOworfQorCit1MzIgc2lyZnNvY19ydGNfaW9icmdfcmVhZGwodTMyIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y2lvYnJnX2xvY2ssIGZsYWdzKTsKKworCXZhbCA9IF9fc2lyZnNvY19ydGNfaW9icmdfcmVhZGwoYWRkcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNpb2JyZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2lyZnNvY19ydGNfaW9icmdfcmVhZGwpOworCit2b2lkIHNpcmZzb2NfcnRjX2lvYnJnX3ByZV93cml0ZWwodTMyIHZhbCwgdTMyIGFkZHIpCit7CisJc2lyZnNvY19ydGNfaW9icmdfd2FpdF9zeW5jKCk7CisKKwl3cml0ZWxfcmVsYXhlZCgweGYxLCBzaXJmc29jX3J0Y2lvYnJnX2Jhc2UgKyBTSVJGU09DX0NQVUlPQlJHX1dSQkUpOworCXdyaXRlbF9yZWxheGVkKGFkZHIsIHNpcmZzb2NfcnRjaW9icmdfYmFzZSArIFNJUkZTT0NfQ1BVSU9CUkdfQUREUik7CisKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIHNpcmZzb2NfcnRjaW9icmdfYmFzZSArIFNJUkZTT0NfQ1BVSU9CUkdfREFUQSk7Cit9CisKK3ZvaWQgc2lyZnNvY19ydGNfaW9icmdfd3JpdGVsKHUzMiB2YWwsIHUzMiBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjaW9icmdfbG9jaywgZmxhZ3MpOworCisJc2lyZnNvY19ydGNfaW9icmdfcHJlX3dyaXRlbCh2YWwsIGFkZHIpOworCisJd3JpdGVsX3JlbGF4ZWQoMHgwMSwgc2lyZnNvY19ydGNpb2JyZ19iYXNlICsgU0lSRlNPQ19DUFVJT0JSR19DVFJMKTsKKworCXNpcmZzb2NfcnRjX2lvYnJnX3dhaXRfc3luYygpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjaW9icmdfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2lyZnNvY19ydGNfaW9icmdfd3JpdGVsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnRjaW9icmdfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzaXJmLHByaW1hMi1ydGNpb2JnIiB9LAorCXt9Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaXJmc29jX3J0Y2lvYnJnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvcC0+ZGV2Lm9mX25vZGU7CisKKwlzaXJmc29jX3J0Y2lvYnJnX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCFzaXJmc29jX3J0Y2lvYnJnX2Jhc2UpCisJCXBhbmljKCJ1bmFibGUgdG8gbWFwIHJ0YyBpb2JyZyByZWdpc3RlcnNcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNpcmZzb2NfcnRjaW9icmdfZHJpdmVyID0geworCS5wcm9iZQkJPSBzaXJmc29jX3J0Y2lvYnJnX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInNpcmZzb2MtcnRjaW9icmciLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gcnRjaW9icmdfaWRzLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaXJmc29jX3J0Y2lvYnJnX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaXJmc29jX3J0Y2lvYnJnX2RyaXZlcik7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChzaXJmc29jX3J0Y2lvYnJnX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJaaGl3dSBTb25nIDx6aGl3dS5zb25nQGNzci5jb20+LCAiCisJCSJCYXJyeSBTb25nIDxiYW9odWEuc29uZ0Bjc3IuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDU1IgU2lSRnByaW1hSUkgcnRjIGlvIGJyaWRnZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3NsZWVwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0NWFiYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3NsZWVwLlMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIHNsZWVwIG1vZGUgZm9yIENTUiBTaVJGcHJpbWFJSQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAgY29tcGFueS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKKyNpbmNsdWRlICJwbS5oIgorCisjZGVmaW5lIERFTkFMSV9DVExfMjJfT0ZGCTB4NTgKKyNkZWZpbmUgREVOQUxJX0NUTF8xMTJfT0ZGCTB4MWMwCisKKwkudGV4dAorCitFTlRSWShzaXJmc29jX2ZpbmlzaF9zdXNwZW5kKQorCUAgcjU6IAltZW0gY29udHJvbGxlcgorCWxkciAgICAgcjAsID1zaXJmc29jX21lbWNfYmFzZQorCWxkcglyNSwgW3IwXQorCUAgcjY6IAlwd3JjIGJhc2Ugb2Zmc2V0CisJbGRyICAgICByMCwgPXNpcmZzb2NfcHdyY19iYXNlCisJbGRyCXI2LCBbcjBdCisJQCByNzogCXJ0YyBpb2JyZyBjb250cm9sbGVyCisJbGRyICAgICByMCwgPXNpcmZzb2NfcnRjaW9icmdfYmFzZQorCWxkcglyNywgW3IwXQorCisJQCBSZWFkIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyIGFuZCBzZXQgdGhlCisJQCBzbGVlcCBmb3JjZSBiaXQuCisJYWRkCXIwLCByNiwgI1NJUkZTT0NfUFdSQ19QRE5fQ1RSTAorCWJsCV9fc2lyZnNvY19ydGNfaW9icmdfcmVhZGwKKwlvcnIJcjAscjAsI1NJUkZTT0NfUFdSX1NMRUVQRk9SQ0UKKwlhZGQJcjEsIHI2LCAjU0lSRlNPQ19QV1JDX1BETl9DVFJMCisJYmwJc2lyZnNvY19ydGNfaW9icmdfcHJlX3dyaXRlbAorCW1vdglyMSwgIzB4MQorCisJQCByZWFkIHRoZSBNRU0gY3RsIHJlZ2lzdGVyIGFuZCBzZXQgdGhlIHNlbGYKKwlAIHJlZnJlc2ggYml0CisKKwlsZHIJcjIsIFtyNSwgI0RFTkFMSV9DVExfMjJfT0ZGXQorCW9ycglyMiwgcjIsICMweDEKKworCUAgRm9sbG93aW5nIGNvZGUgaGFzIHRvIHJ1biBmcm9tIGNhY2hlIHNpbmNlCisJQCB0aGUgUkFNIGlzIGdvaW5nIHRvIHNlbGYgcmVmcmVzaCBtb2RlCisJLmFsaWduIDUKKwlzdHIJcjIsIFtyNSwgI0RFTkFMSV9DVExfMjJfT0ZGXQorCisxOgorCWxkcglyNCwgW3I1LCAjREVOQUxJX0NUTF8xMTJfT0ZGXQorCXRzdAlyNCwgIzB4MQorCWJuZQkxYgorCisJQCB3cml0ZSBTTEVFUEZPUkNFIHRocm91Z2ggcnRjIGlvYnJpZGdlCisKKwlzdHIJcjEsIFtyN10KKwlAIHdhaXQgcnRjIGlvIGJyaWRnZSBzeW5jCisxOgorCWxkcglyMywgW3I3XQorCXRzdAlyMywgIzB4MDEKKwlibmUJMWIKKwliIC4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLXByaW1hMi90aW1lci5jCmluZGV4IGVkN2VjNDguLmI3YTYwOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL3RpbWVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvdGltZXIuYwpAQCAtNDAsNiArNDAsMTcgQEAKIAogI2RlZmluZSBTSVJGU09DX1RJTUVSX0xBVENIX0JJVAkgQklUKDApCiAKKyNkZWZpbmUgU0lSRlNPQ19USU1FUl9SRUdfQ05UIDExCisKK3N0YXRpYyBjb25zdCB1MzIgc2lyZnNvY190aW1lcl9yZWdfbGlzdFtTSVJGU09DX1RJTUVSX1JFR19DTlRdID0geworCVNJUkZTT0NfVElNRVJfTUFUQ0hfMCwgU0lSRlNPQ19USU1FUl9NQVRDSF8xLCBTSVJGU09DX1RJTUVSX01BVENIXzIsCisJU0lSRlNPQ19USU1FUl9NQVRDSF8zLCBTSVJGU09DX1RJTUVSX01BVENIXzQsIFNJUkZTT0NfVElNRVJfTUFUQ0hfNSwKKwlTSVJGU09DX1RJTUVSX0lOVF9FTiwgU0lSRlNPQ19USU1FUl9XQVRDSERPR19FTiwgU0lSRlNPQ19USU1FUl9ESVYsCisJU0lSRlNPQ19USU1FUl9MQVRDSEVEX0xPLCBTSVJGU09DX1RJTUVSX0xBVENIRURfSEksCit9OworCitzdGF0aWMgdTMyIHNpcmZzb2NfdGltZXJfcmVnX3ZhbFtTSVJGU09DX1RJTUVSX1JFR19DTlRdOworCiBzdGF0aWMgdm9pZCBfX2lvbWVtICpzaXJmc29jX3RpbWVyX2Jhc2U7CiBzdGF0aWMgdm9pZCBfX2luaXQgc2lyZnNvY19vZl90aW1lcl9tYXAodm9pZCk7CiAKQEAgLTEwNiw2ICsxMTcsMjcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHNpcmZzb2NfY2xvY2tzb3VyY2Vfc3VzcGVuZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCWludCBpOworCisJd3JpdGVsX3JlbGF4ZWQoU0lSRlNPQ19USU1FUl9MQVRDSF9CSVQsIHNpcmZzb2NfdGltZXJfYmFzZSArIFNJUkZTT0NfVElNRVJfTEFUQ0gpOworCisJZm9yIChpID0gMDsgaSA8IFNJUkZTT0NfVElNRVJfUkVHX0NOVDsgaSsrKQorCQlzaXJmc29jX3RpbWVyX3JlZ192YWxbaV0gPSByZWFkbF9yZWxheGVkKHNpcmZzb2NfdGltZXJfYmFzZSArIHNpcmZzb2NfdGltZXJfcmVnX2xpc3RbaV0pOworfQorCitzdGF0aWMgdm9pZCBzaXJmc29jX2Nsb2Nrc291cmNlX3Jlc3VtZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNJUkZTT0NfVElNRVJfUkVHX0NOVDsgaSsrKQorCQl3cml0ZWxfcmVsYXhlZChzaXJmc29jX3RpbWVyX3JlZ192YWxbaV0sIHNpcmZzb2NfdGltZXJfYmFzZSArIHNpcmZzb2NfdGltZXJfcmVnX2xpc3RbaV0pOworCisJd3JpdGVsX3JlbGF4ZWQoc2lyZnNvY190aW1lcl9yZWdfdmFsW2kgLSAyXSwgc2lyZnNvY190aW1lcl9iYXNlICsgU0lSRlNPQ19USU1FUl9DT1VOVEVSX0xPKTsKKwl3cml0ZWxfcmVsYXhlZChzaXJmc29jX3RpbWVyX3JlZ192YWxbaSAtIDFdLCBzaXJmc29jX3RpbWVyX2Jhc2UgKyBTSVJGU09DX1RJTUVSX0NPVU5URVJfSEkpOworfQorCiBzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBzaXJmc29jX2Nsb2NrZXZlbnQgPSB7CiAJLm5hbWUgPSAic2lyZnNvY19jbG9ja2V2ZW50IiwKIAkucmF0aW5nID0gMjAwLApAQCAtMTIwLDYgKzE1Miw4IEBACiAJLm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKIAkuZmxhZ3MgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIAkucmVhZCA9IHNpcmZzb2NfdGltZXJfcmVhZCwKKwkuc3VzcGVuZCA9IHNpcmZzb2NfY2xvY2tzb3VyY2Vfc3VzcGVuZCwKKwkucmVzdW1lID0gc2lyZnNvY19jbG9ja3NvdXJjZV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBzaXJmc29jX3RpbWVyX2lycSA9IHsKQEAgLTEzMywxNCArMTY3LDE0IEBACiAvKiBPdmVyd3JpdGUgd2VhayBkZWZhdWx0IHNjaGVkX2Nsb2NrIHdpdGggbW9yZSBwcmVjaXNlIG9uZSAqLwogdW5zaWduZWQgbG9uZyBsb25nIG5vdHJhY2Ugc2NoZWRfY2xvY2sodm9pZCkKIHsKLQlzdGF0aWMgaW50IGlzX21hcHBlZCA9IDA7CisJc3RhdGljIGludCBpc19tYXBwZWQ7CiAKIAkvKgogCSAqIHNjaGVkX2Nsb2NrIGlzIGNhbGxlZCBlYXJsaWVyIHRoYW4gLmluaXQgb2Ygc3lzX3RpbWVyCiAJICogaWYgd2UgbWFwIHRpbWVyIG1lbW9yeSBpbiAuaW5pdCBvZiBzeXNfdGltZXIsIHN5c3RlbQogCSAqIHdpbGwgcGFuaWMgZHVlIHRvIGlsbGVnYWwgbWVtb3J5IGFjY2VzcwogCSAqLwotCWlmKCFpc19tYXBwZWQpIHsKKwlpZiAoIWlzX21hcHBlZCkgewogCQlzaXJmc29jX29mX3RpbWVyX21hcCgpOwogCQlpc19tYXBwZWQgPSAxOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnCmluZGV4IGNkMTkzMDkuLjYxZDNjNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZwpAQCAtMiw2ICsyLDI3IEBACiAKIG1lbnUgIkludGVsIFBYQTJ4eC9QWEEzeHggSW1wbGVtZW50YXRpb25zIgogCitjb25maWcgQVJDSF9QWEFfVjcKKwlib29sICJBUk12NyAoUFhBOTV4KSBiYXNlZCBzeXN0ZW1zIgorCitpZiBBUkNIX1BYQV9WNworY29tbWVudCAiTWFydmVsbCBEZXYgUGxhdGZvcm1zIChzb3J0ZWQgYnkgaGFyZHdhcmUgcmVsZWFzZSB0aW1lKSIKK2NvbmZpZyBNQUNIX1RBVk9SRVZCMworCWJvb2wgIlBYQTk1eCBEZXZlbG9wbWVudCBQbGF0Zm9ybSAoYWthIFRhdm9yRVZCIElJSSkiCisJc2VsZWN0IENQVV9QWEE5NTUKKworY29uZmlnIE1BQ0hfU0FBUkIKKwlib29sICJQWEE5NTUgSGFuZGhlbGQgUGxhdGZvcm0gKGFrYSBTQUFSQikiCisJc2VsZWN0IENQVV9QWEE5NTUKK2VuZGlmCisKK2NvbmZpZyBQWEFfVjdfTUFDSF9BVVRPCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gQVJDSF9QWEFfVjcKKwlkZXBlbmRzIG9uICFNQUNIX1NBQVJCCisJc2VsZWN0IE1BQ0hfVEFWT1JFVkIzCisKK2lmICFBUkNIX1BYQV9WNwogY29tbWVudCAiSW50ZWwvTWFydmVsbCBEZXYgUGxhdGZvcm1zIChzb3J0ZWQgYnkgaGFyZHdhcmUgcmVsZWFzZSB0aW1lKSIKIAogY29uZmlnIEFSQ0hfTFVCQk9DSwpAQCAtNDEsMTkgKzYyLDExIEBACiAJc2VsZWN0IFBYQTN4eAogCXNlbGVjdCBDUFVfUFhBOTMwCiAKLWNvbmZpZyBNQUNIX1RBVk9SRVZCMwotCWJvb2wgIlBYQTk1eCBEZXZlbG9wbWVudCBQbGF0Zm9ybSAoYWthIFRhdm9yRVZCIElJSSkiCi0Jc2VsZWN0IENQVV9QWEE5NTAKLQogY29uZmlnIE1BQ0hfU0FBUgogCWJvb2wgIlBYQTkzMCBIYW5kaGVsZCBQbGF0Zm9ybSAoYWthIFNBQVIpIgogCXNlbGVjdCBQWEEzeHgKIAlzZWxlY3QgQ1BVX1BYQTkzMAogCi1jb25maWcgTUFDSF9TQUFSQgotCWJvb2wgIlBYQTk1NSBIYW5kaGVsZCBQbGF0Zm9ybSAoYWthIFNBQVJCKSIKLQlzZWxlY3QgQ1BVX1BYQTk1NQotCiBjb21tZW50ICJUaGlyZCBQYXJ0eSBEZXYgUGxhdGZvcm1zIChzb3J0ZWQgYnkgdmVuZG9yIG5hbWUpIgogCiBjb25maWcgQVJDSF9QWEFfSURQCkBAIC00MTQsNiArNDI3LDcgQEAKIAlib29sICJQYWxtIENlbnRybyA2ODUgKEdTTSkiCiAJZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiBBUkNIX1BYQV9QQUxNCisJc2VsZWN0IE1BQ0hfUEFMTTI3WAogCXNlbGVjdCBQWEEyN3gKIAlzZWxlY3QgSVdNTVhUCiAJc2VsZWN0IFBBTE1fVFJFTwpAQCAtNDI1LDYgKzQzOSw3IEBACiAJYm9vbCAiUGFsbSBUcmVvIDY4MCIKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIEFSQ0hfUFhBX1BBTE0KKwlzZWxlY3QgTUFDSF9QQUxNMjdYCiAJc2VsZWN0IFBYQTI3eAogCXNlbGVjdCBJV01NWFQKIAlzZWxlY3QgUEFMTV9UUkVPCkBAIC00MzYsMTUgKzQ1MSwxOCBAQAogCWJvb2wgIlJhdW1mZWxkIENvbnRyb2xsZXIiCiAJc2VsZWN0IFBYQTN4eAogCXNlbGVjdCBDUFVfUFhBMzAwCisJc2VsZWN0IFBPV0VSX1NVUFBMWQogCXNlbGVjdCBIQVZFX1BXTQogCiBjb25maWcgTUFDSF9SQVVNRkVMRF9DT05ORUNUT1IKIAlib29sICJSYXVtZmVsZCBDb25uZWN0b3IiCisJc2VsZWN0IFBPV0VSX1NVUFBMWQogCXNlbGVjdCBQWEEzeHgKIAlzZWxlY3QgQ1BVX1BYQTMwMAogCiBjb25maWcgTUFDSF9SQVVNRkVMRF9TUEVBS0VSCiAJYm9vbCAiUmF1bWZlbGQgU3BlYWtlciIKKwlzZWxlY3QgUE9XRVJfU1VQUExZCiAJc2VsZWN0IFBYQTN4eAogCXNlbGVjdCBDUFVfUFhBMzAwCiAKQEAgLTU5OCw3ICs2MTYsNyBAQAogCWJvb2wgIlppcGl0IFoyIEhhbmRoZWxkIgogCXNlbGVjdCBQWEEyN3gKIAlzZWxlY3QgSEFWRV9QV00KLQorZW5kaWYKIGVuZG1lbnUKIAogY29uZmlnIFBYQTI1eApAQCAtNjg4LDYgKzcwNiw4IEBACiBjb25maWcgU0hBUlBTTF9QTV9NQVgxMTExCiAJYm9vbAogCXNlbGVjdCBIV01PTgorCXNlbGVjdCBTUEkKKwlzZWxlY3QgU1BJX01BU1RFUgogCXNlbGVjdCBTRU5TT1JTX01BWDExMTEKIAogY29uZmlnIFBYQV9IQVZFX0lTQV9JUlFTCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCmluZGV4IGNjMzlkMTcuLmJlMGY3ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCkBAIC0xOSw3ICsxOSw3IEBACiBvYmotJChDT05GSUdfUFhBMjV4KQkJKz0gbWZwLXB4YTJ4eC5vIGNsb2NrLXB4YTJ4eC5vIHB4YTJ4eC5vIHB4YTI1eC5vCiBvYmotJChDT05GSUdfUFhBMjd4KQkJKz0gbWZwLXB4YTJ4eC5vIGNsb2NrLXB4YTJ4eC5vIHB4YTJ4eC5vIHB4YTI3eC5vCiBvYmotJChDT05GSUdfUFhBM3h4KQkJKz0gbWZwLXB4YTN4eC5vIGNsb2NrLXB4YTN4eC5vIHB4YTN4eC5vIHNtZW1jLm8gcHhhM3h4LXVscGkubwotb2JqLSQoQ09ORklHX1BYQTk1eCkJCSs9IG1mcC1weGEzeHgubyBjbG9jay1weGEzeHgubyBweGE5NXgubyBzbWVtYy5vCitvYmotJChDT05GSUdfUFhBOTV4KQkJKz0gbWZwLXB4YTN4eC5vIGNsb2NrLXB4YTN4eC5vIHB4YTN4eC5vIHB4YTk1eC5vIHNtZW1jLm8KIG9iai0kKENPTkZJR19DUFVfUFhBMzAwKQkrPSBweGEzMDAubwogb2JqLSQoQ09ORklHX0NQVV9QWEEzMjApCSs9IHB4YTMyMC5vCiBvYmotJChDT05GSUdfQ1BVX1BYQTkzMCkJKz0gcHhhOTMwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2JhbGxvb24zLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9iYWxsb29uMy5jCmluZGV4IGVmM2U4YjEuLmZjMGI4NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2JhbGxvb24zLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvYmFsbG9vbjMuYwpAQCAtNTkxLDcgKzU5MSw3IEBACiAJCQkJQkFMTE9PTjNfTkFORF9DT05UUk9MX1JFRyk7CiAJCWlmIChiYWxsb29uM19jdGxfc2V0KQogCQkJX19yYXdfd3JpdGVsKGJhbGxvb24zX2N0bF9zZXQsCi0JCQkJQkFMTE9PTjNfTkFORF9DT05UUk9MX1JFRyB8CisJCQkJQkFMTE9PTjNfTkFORF9DT05UUk9MX1JFRyArCiAJCQkJQkFMTE9PTjNfRlBHQV9TRVRuQ0xSKTsKIAl9CiAKQEAgLTYwOCw3ICs2MDgsNyBAQAogCV9fcmF3X3dyaXRldygKIAkJQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMQ0UwIHwgQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMQ0UxIHwKIAkJQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMQ0UyIHwgQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMQ0UzLAotCQlCQUxMT09OM19OQU5EX0NPTlRST0xfUkVHIHwgQkFMTE9PTjNfRlBHQV9TRVRuQ0xSKTsKKwkJQkFMTE9PTjNfTkFORF9DT05UUk9MX1JFRyArIEJBTExPT04zX0ZQR0FfU0VUbkNMUik7CiAKIAkvKiBEZWFzc2VydCBjb3JyZWN0IG5DRSBsaW5lICovCiAJX19yYXdfd3JpdGV3KEJBTExPT04zX05BTkRfQ09OVFJPTF9GTENFMCA8PCBjaGlwLApAQCAtNjI2LDcgKzYyNiw3IEBACiAJaW50IHJldDsKIAogCV9fcmF3X3dyaXRldyhCQUxMT09OM19OQU5EX0NPTlRST0wyXzE2QklULAotCQlCQUxMT09OM19OQU5EX0NPTlRST0wyX1JFRyB8IEJBTExPT04zX0ZQR0FfU0VUbkNMUik7CisJCUJBTExPT04zX05BTkRfQ09OVFJPTDJfUkVHICsgQkFMTE9PTjNfRlBHQV9TRVRuQ0xSKTsKIAogCXZlciA9IF9fcmF3X3JlYWR3KEJBTExPT04zX0ZQR0FfVkVSKTsKIAlpZiAodmVyIDwgMHg0ZjA4KQpAQCAtNjQ5LDcgKzY0OSw3IEBACiAJCUJBTExPT04zX05BTkRfQ09OVFJPTF9GTENFMCB8IEJBTExPT04zX05BTkRfQ09OVFJPTF9GTENFMSB8CiAJCUJBTExPT04zX05BTkRfQ09OVFJPTF9GTENFMiB8IEJBTExPT04zX05BTkRfQ09OVFJPTF9GTENFMyB8CiAJCUJBTExPT04zX05BTkRfQ09OVFJPTF9GTFdQLAotCQlCQUxMT09OM19OQU5EX0NPTlRST0xfUkVHIHwgQkFMTE9PTjNfRlBHQV9TRVRuQ0xSKTsKKwkJQkFMTE9PTjNfTkFORF9DT05UUk9MX1JFRyArIEJBTExPT04zX0ZQR0FfU0VUbkNMUik7CiAJcmV0dXJuIDA7CiAKIGVycjI6CkBAIC04MDcsNyArODA3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBiYWxsb29uM19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7CS8qIENQTEQvRlBHQSAqLwotCQkudmlydHVhbAk9ICBCQUxMT09OM19GUEdBX1ZJUlQsCisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpQkFMTE9PTjNfRlBHQV9WSVJULAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oQkFMTE9PTjNfRlBHQV9QSFlTKSwKIAkJLmxlbmd0aAkJPSBCQUxMT09OM19GUEdBX0xFTkdUSCwKIAkJLnR5cGUJCT0gTVRfREVWSUNFLApAQCAtODI4LDUgKzgyOCw1IEBACiAJLmhhbmRsZV9pcnEJPSBweGEyN3hfaGFuZGxlX2lycSwKIAkudGltZXIJCT0gJnB4YV90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gYmFsbG9vbjNfaW5pdCwKLQkuYm9vdF9wYXJhbXMJPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY2FwYzcxMTcuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NhcGM3MTE3LmMKaW5kZXggNjQ4YjBhYi4uNGVmYzE2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY2FwYzcxMTcuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jYXBjNzExNy5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogTUFDSElORV9TVEFSVChDQVBDNzExNywKIAkgICAgICAiRW1iZWRpYW4gQ0FQQy03MTE3IGV2YWx1YXRpb24ga2l0IGJhc2VkIG9uIHRoZSBNWE0tOHgxMCBDb00iKQotCS5ib290X3BhcmFtcyA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IHB4YTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxID0gcHhhM3h4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxID0gcHhhM3h4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14MjU1LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14MjU1LmMKaW5kZXggOTNmNTlmOC4uYmU3NTE0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDI1NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNTUuYwpAQCAtMTEsNyArMTEsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC1ncGlvLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuYwppbmRleCA2YmY0NzlkLi5lYmQ5MjU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHgtcGNpLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pdDgxNTIuaD4KIAotdW5zaWduZWQgbG9uZyBpdDgxNTJfYmFzZV9hZGRyZXNzOwordm9pZCBfX2lvbWVtICppdDgxNTJfYmFzZV9hZGRyZXNzOwogc3RhdGljIGludCBjbXgyeHhfaXQ4MTUyX2lycV9ncGlvOwogCiBzdGF0aWMgdm9pZCBjbXgyeHhfaXQ4MTUyX2lycV9kZW11eCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LmMKaW5kZXggMTNjZjUxOC4uZjJlNDE5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHguYwpAQCAtMzksNyArMzksNyBAQAogI2RlZmluZSBDTVgyWFhfTlJfSVJRUwkJKElSUV9CT0FSRF9TVEFSVCArIDQwKQogCiAvKiB2aXJ0dWFsIGFkZHJlc3NlcyBmb3Igc3RhdGljYWxseSBtYXBwZWQgcmVnaW9ucyAqLwotI2RlZmluZSBDTVgyWFhfVklSVF9CQVNFCSgweGU4MDAwMDAwKQorI2RlZmluZSBDTVgyWFhfVklSVF9CQVNFCSh2b2lkIF9faW9tZW0gKikoMHhlODAwMDAwMCkKICNkZWZpbmUgQ01YMlhYX0lUODE1Ml9WSVJUCShDTVgyWFhfVklSVF9CQVNFKQogCiAvKiBwaHlzaWNhbCBhZGRyZXNzIGlmIGxvY2FsLWJ1cyBhdHRhY2hlZCBkZXZpY2VzICovCkBAIC00ODIsNyArNDgyLDcgQEAKIC8qIE1hcCBQQ0kgY29tcGFuaW9uIHN0YXRpY2FsbHkgKi8KIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgY214Mnh4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogCVswXSA9IHsgLyogUENJIGJyaWRnZSAqLwotCQkudmlydHVhbAk9IENNWDJYWF9JVDgxNTJfVklSVCwKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylDTVgyWFhfSVQ4MTUyX1ZJUlQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihQWEFfQ1M0X1BIWVMpLAogCQkubGVuZ3RoCQk9IFNaXzY0TSwKIAkJLnR5cGUJCT0gTVRfREVWSUNFCkBAIC01MTMsNyArNTEzLDcgQEAKICNlbmRpZgogCiBNQUNISU5FX1NUQVJUKEFSTUNPUkUsICJDb21wdWxhYiBDTS1YMlhYIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gY214Mnh4X21hcF9pbywKIAkubnJfaXJxcwk9IENNWDJYWF9OUl9JUlFTLAogCS5pbml0X2lycQk9IGNteDJ4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYwppbmRleCBkOTQwZThhLi5lMDk2YmJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14MzAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDMwMC5jCkBAIC00MjQsOCArNDI0LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfcGxhdGZvcm1fZGF0YSBjbV94MzAwX25hbmRfaW5mbyA9IHsKIAkuZW5hYmxlX2FyYml0ZXIJPSAxLAogCS5rZWVwX2NvbmZpZwk9IDEsCi0JLnBhcnRzCQk9IGNtX3gzMDBfbmFuZF9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoY21feDMwMF9uYW5kX3BhcnRpdGlvbnMpLAorCS5udW1fY3MJCT0gMSwKKwkucGFydHNbMF0JPSBjbV94MzAwX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHNbMF0JPSBBUlJBWV9TSVpFKGNtX3gzMDBfbmFuZF9wYXJ0aXRpb25zKSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjbV94MzAwX2luaXRfbmFuZCh2b2lkKQpAQCAtNzc1LDcgKzc3Niw2IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjbV94MzAwX2luaXRfd2kyd2kodm9pZCkKIHsKLQlpbnQgYnRfcmVzZXQsIHdsYW5fZW47CiAJaW50IGVycjsKIAogCWlmIChzeXN0ZW1fcmV2IDwgMTMwKSB7CkBAIC03OTEsMTIgKzc5MSwxMSBAQAogCX0KIAogCXVkZWxheSgxMCk7Ci0JZ3Bpb19zZXRfdmFsdWUoYnRfcmVzZXQsIDApOworCWdwaW9fc2V0X3ZhbHVlKGNtX3gzMDBfd2kyd2lfZ3Bpb3NbMV0uZ3BpbywgMCk7CiAJdWRlbGF5KDEwKTsKLQlncGlvX3NldF92YWx1ZShidF9yZXNldCwgMSk7CisJZ3Bpb19zZXRfdmFsdWUoY21feDMwMF93aTJ3aV9ncGlvc1sxXS5ncGlvLCAxKTsKIAotCWdwaW9fZnJlZSh3bGFuX2VuKTsKLQlncGlvX2ZyZWUoYnRfcmVzZXQpOworCWdwaW9fZnJlZV9hcnJheShBUlJBWV9BTkRfU0laRShjbV94MzAwX3dpMndpX2dwaW9zKSk7CiB9CiAKIC8qIE1GUCAqLwpAQCAtODUyLDcgKzg1MSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ01fWDMwMCwgIkNNLVgzMDAgbW9kdWxlIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhM3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBweGEzeHhfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEJPSBweGEzeHhfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTI3MC5jCmluZGV4IDg3MDkyMDkuLjA1YmZhMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMjcwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEyNzAuYwpAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CkBAIC0zMDYsNyArMzA3LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChDT0xJQlJJLCAiVG9yYWRleCBDb2xpYnJpIFBYQTI3MCIpCi0JLmJvb3RfcGFyYW1zCT0gQ09MSUJSSV9TRFJBTV9CQVNFICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGNvbGlicmlfcHhhMjcwX2luaXQsCiAJLm1hcF9pbwkJPSBweGEyN3hfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKQEAgLTMxNSw3ICszMTYsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChJTkNPTUUsICJJbmNvbWUgcy5yLm8uIFNILURtYXN0ZXIgUFhBMjcwIFNCQyIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gY29saWJyaV9weGEyNzBfaW5jb21lX2luaXQsCiAJLm1hcF9pbwkJPSBweGEyN3hfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMzAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTMwMC5jCmluZGV4IDYwYTY3ODEuLmM4MjVlOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMzAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzMDAuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ09MSUJSSTMwMCwgIlRvcmFkZXggQ29saWJyaSBQWEEzMDAiKQotCS5ib290X3BhcmFtcwk9IENPTElCUklfU0RSQU1fQkFTRSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBjb2xpYnJpX3B4YTMwMF9pbml0LAogCS5tYXBfaW8JCT0gcHhhM3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBweGEzeHhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTMyMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzMjAuYwppbmRleCBkMmM2NjMxLi42OTJlMWZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTMyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMzIwLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKENPTElCUkkzMjAsICJUb3JhZGV4IENvbGlicmkgUFhBMzIwIikKLQkuYm9vdF9wYXJhbXMJPSBDT0xJQlJJX1NEUkFNX0JBU0UgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gY29saWJyaV9weGEzMjBfaW5pdCwKIAkubWFwX2lvCQk9IHB4YTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhM3h4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhM3h4LmMKaW5kZXggM2Y5YmU0MS4uMmI4Y2EwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzeHguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTN4eC5jCkBAIC0xMzksOCArMTM5LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfcGxhdGZvcm1fZGF0YSBjb2xpYnJpX25hbmRfaW5mbyA9IHsKIAkuZW5hYmxlX2FyYml0ZXIJPSAxLAogCS5rZWVwX2NvbmZpZwk9IDEsCi0JLnBhcnRzCQk9IGNvbGlicmlfbmFuZF9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoY29saWJyaV9uYW5kX3BhcnRpdGlvbnMpLAorCS5udW1fY3MJCT0gMSwKKwkucGFydHNbMF0JPSBjb2xpYnJpX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHNbMF0JPSBBUlJBWV9TSVpFKGNvbGlicmlfbmFuZF9wYXJ0aXRpb25zKSwKIH07CiAKIHZvaWQgX19pbml0IGNvbGlicmlfcHhhM3h4X2luaXRfbmFuZCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKaW5kZXggM2U5NDgzYi4uNTQ5NDY4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3B4YTJ4eF9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvc2hhcnBzbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY3NiNzI2LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jc2I3MjYuYwppbmRleCBmZTgxMmVhLi41ZTJjZjM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jc2I3MjYuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jc2I3MjYuYwpAQCAtMjcyLDcgKzI3Miw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ1NCNzI2LCAiQ29nZW50IENTQjcyNiIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGEyN3hfbWFwX2lvLAogCS5pbml0X2lycSAgICAgICA9IHB4YTI3eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycSAgICAgICA9IHB4YTI3eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZW0teDI3MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZW0teDI3MC5jCmluZGV4IDJlMzdlYTUuLjk0YWNjMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2VtLXgyNzAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lbS14MjcwLmMKQEAgLTEyOTksNyArMTI5OSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoRU1fWDI3MCwgIkNvbXB1bGFiIEVNLVgyNzAiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEyN3hfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHB4YTI3eF9oYW5kbGVfaXJxLApAQCAtMTMwOCw3ICsxMzA4LDcgQEAKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoRVhFREEsICJDb21wdWxhYiBlWGVkYSIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI3eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjd4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmMKaW5kZXggZTRhMWY0ZC4uZDgyYjdhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJSU5JVF9DTEtSRUcoJnRtaW9fZHVtbXlfY2xrLCBOVUxMLCAiQ0xLX0NLMzJLIiksCiB9OwogCi12b2lkIGVzZXJpZXNfcmVnaXN0ZXJfY2xrcyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGVzZXJpZXNfcmVnaXN0ZXJfY2xrcyh2b2lkKQogewogCWNsa2Rldl9hZGRfdGFibGUoZXNlcmllc19jbGtyZWdzLCBBUlJBWV9TSVpFKGVzZXJpZXNfY2xrcmVncykpOwogfQpAQCAtMTg4LDcgKzE4OCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoRTMzMCwgIlRvc2hpYmEgZTMzMCIpCiAJLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhMjV4X21hcF9pbywKIAkubnJfaXJxcwk9IEVTRVJJRVNfTlJfSVJRUywKIAkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCkBAIC0yMzgsNyArMjM4LDcgQEAKIAogTUFDSElORV9TVEFSVChFMzUwLCAiVG9zaGliYSBlMzUwIikKIAkvKiBNYWludGFpbmVyOiBJYW4gTW9sdG9uIChzcHlyb0BmMnMuY29tKSAqLwotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEyNXhfbWFwX2lvLAogCS5ucl9pcnFzCT0gRVNFUklFU19OUl9JUlFTLAogCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKQEAgLTM2MSw3ICszNjEsNyBAQAogCiBNQUNISU5FX1NUQVJUKEU0MDAsICJUb3NoaWJhIGU0MDAiKQogCS8qIE1haW50YWluZXI6IElhbiBNb2x0b24gKHNweXJvQGYycy5jb20pICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI1eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBFU0VSSUVTX05SX0lSUVMsCiAJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLApAQCAtNTUwLDcgKzU1MCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoRTc0MCwgIlRvc2hpYmEgZTc0MCIpCiAJLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhMjV4X21hcF9pbywKIAkubnJfaXJxcwk9IEVTRVJJRVNfTlJfSVJRUywKIAkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCkBAIC03NDIsNyArNzQyLDcgQEAKIAogTUFDSElORV9TVEFSVChFNzUwLCAiVG9zaGliYSBlNzUwIikKIAkvKiBNYWludGFpbmVyOiBJYW4gTW9sdG9uIChzcHlyb0BmMnMuY29tKSAqLwotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEyNXhfbWFwX2lvLAogCS5ucl9pcnFzCT0gRVNFUklFU19OUl9JUlFTLAogCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKQEAgLTk0Nyw3ICs5NDcsNyBAQAogCiBNQUNISU5FX1NUQVJUKEU4MDAsICJUb3NoaWJhIGU4MDAiKQogCS8qIE1haW50YWluZXI6IElhbiBNb2x0b24gKHNweXJvQGYycy5jb20pICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI1eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBFU0VSSUVTX05SX0lSUVMsCiAJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5oCmluZGV4IGJlOTIxOTYuLmI5Njk0OWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmgKQEAgLTExLDUgKzExLDQgQEAKIGV4dGVybiB2b2lkIGVzZXJpZXNfZ2V0X3RtaW9fZ3Bpb3Modm9pZCk7CiBleHRlcm4gc3RydWN0IHJlc291cmNlIGVzZXJpZXNfdG1pb19yZXNvdXJjZXNbXTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGUzMDBfdGM2Mzg3eGJfZGV2aWNlOwotZXh0ZXJuIHZvaWQgZXNlcmllc19yZWdpc3Rlcl9jbGtzKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lenguYyBiL2FyY2gvYXJtL21hY2gtcHhhL2V6eC5jCmluZGV4IGI3M2VhZGIuLjgzMDhlZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2V6eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2V6eC5jCkBAIC03OTcsNyArNzk3LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChFWlhfQTc4MCwgIk1vdG9yb2xhIEVaWCBBNzgwIikKLQkuYm9vdF9wYXJhbXMgICAgPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHB4YTI3eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBFWlhfTlJfSVJRUywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCkBAIC04NjMsNyArODYzLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChFWlhfRTY4MCwgIk1vdG9yb2xhIEVaWCBFNjgwIikKLQkuYm9vdF9wYXJhbXMgICAgPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHB4YTI3eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBFWlhfTlJfSVJRUywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCkBAIC05MjksNyArOTI5LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChFWlhfQTEyMDAsICJNb3Rvcm9sYSBFWlggQTEyMDAiKQotCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhMjd4X21hcF9pbywKIAkubnJfaXJxcwk9IEVaWF9OUl9JUlFTLAogCS5pbml0X2lycSAgICAgICA9IHB4YTI3eF9pbml0X2lycSwKQEAgLTExMjAsNyArMTEyMCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoRVpYX0E5MTAsICJNb3Rvcm9sYSBFWlggQTkxMCIpCi0JLmJvb3RfcGFyYW1zICAgID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGEyN3hfbWFwX2lvLAogCS5ucl9pcnFzCT0gRVpYX05SX0lSUVMsCiAJLmluaXRfaXJxICAgICAgID0gcHhhMjd4X2luaXRfaXJxLApAQCAtMTE4Niw3ICsxMTg2LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChFWlhfRTYsICJNb3Rvcm9sYSBFWlggRTYiKQotCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhMjd4X21hcF9pbywKIAkubnJfaXJxcwk9IEVaWF9OUl9JUlFTLAogCS5pbml0X2lycSAgICAgICA9IHB4YTI3eF9pbml0X2lycSwKQEAgLTEyMjYsNyArMTIyNiw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoRVpYX0UyLCAiTW90b3JvbGEgRVpYIEUyIikKLQkuYm9vdF9wYXJhbXMgICAgPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHB4YTI3eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBFWlhfTlJfSVJRUywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmMKaW5kZXggZjVkOTFlZi4uNTQzMmVjYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYwpAQCAtMTYsNiArMTYsNyBAQAogICogaW5pdGlhbGl6YXRpb24gc3R1ZmYgZm9yIFBYQSBtYWNoaW5lcyB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBsYXRlciBpZgogICogbmVlZCBiZS4KICAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yNiw3ICsyNyw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3NtZW1jLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEzeHgtcmVncy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9ndW1zdGl4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9ndW1zdGl4LmMKaW5kZXggZGVhYTExMS4uOWM4MjA4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZ3Vtc3RpeC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2d1bXN0aXguYwpAQCAtMjMzLDcgKzIzMyw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoR1VNU1RJWCwgIkd1bXN0aXgiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsIC8qIG1hdGNoIHUtYm9vdCBiaV9ib290X3BhcmFtcyAqLworCS5hdGFnX29mZnNldAk9IDB4MTAwLCAvKiBtYXRjaCB1LWJvb3QgYmlfYm9vdF9wYXJhbXMgKi8KIAkubWFwX2lvCQk9IHB4YTI1eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjV4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9oNTAwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaDUwMDAuYwppbmRleCAwYTIzNTEyOC4uNGI1ZTExMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaDUwMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9oNTAwMC5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChINTQwMCwgIkhQIGlQQVEgSDUwMDAiKQotCS5ib290X3BhcmFtcyA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IHB4YTI1eF9tYXBfaW8sCiAJLmluaXRfaXJxID0gcHhhMjV4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxID0gcHhhMjV4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9oaW1hbGF5YS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaGltYWxheWEuYwppbmRleCBhOTk3ZDBhYi4uZjJjMzI0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaGltYWxheWEuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9oaW1hbGF5YS5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIAogCiBNQUNISU5FX1NUQVJUKEhJTUFMQVlBLCAiSFRDIEhpbWFsYXlhIikKLQkuYm9vdF9wYXJhbXMgPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBweGEyNXhfbWFwX2lvLAogCS5pbml0X2lycSA9IHB4YTI1eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycSA9IHB4YTI1eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaHg0NzAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9oeDQ3MDAuYwppbmRleCBjNzQ4YTQ3Li42ZjYzNjhlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9oeDQ3MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9oeDQ3MDAuYwpAQCAtODM4LDcgKzgzOCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSDQ3MDAsICJIUCBpUEFRIEhYNDcwMCIpCi0JLmJvb3RfcGFyYW1zICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgPSBweGEyN3hfbWFwX2lvLAogCS5ucl9pcnFzICAgICAgPSBIWDQ3MDBfTlJfSVJRUywKIAkuaW5pdF9pcnEgICAgID0gcHhhMjd4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaWNvbnRyb2wuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2ljb250cm9sLmMKaW5kZXggZDQyNzQyOS4uZjc4ZDVkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaWNvbnRyb2wuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pY29udHJvbC5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChJQ09OVFJPTCwgImlDb250cm9sL1NhZmVUY2FtIGJvYXJkcyB1c2luZyBFbWJlZGlhbiBNWE0tOHgxMCBDb00iKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTN4eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHB4YTN4eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2FkZHItbWFwLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvYWRkci1tYXAuaAppbmRleCBmNGMwMzY1Li5iYmY5ZGYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvYWRkci1tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvYWRkci1tYXAuaApAQCAtMjAsNyArMjAsNyBAQAogICogUGVyaXBoZXJhbCBCdXMKICAqLwogI2RlZmluZSBQRVJJUEhfUEhZUwkJMHg0MDAwMDAwMAotI2RlZmluZSBQRVJJUEhfVklSVAkJMHhmMjAwMDAwMAorI2RlZmluZSBQRVJJUEhfVklSVAkJSU9NRU0oMHhmMjAwMDAwMCkKICNkZWZpbmUgUEVSSVBIX1NJWkUJCTB4MDIwMDAwMDAKIAogLyoKQEAgLTI4LDIxICsyOCwyMSBAQAogICovCiAjZGVmaW5lIFBYQTJYWF9TTUVNQ19QSFlTCTB4NDgwMDAwMDAKICNkZWZpbmUgUFhBM1hYX1NNRU1DX1BIWVMJMHg0YTAwMDAwMAotI2RlZmluZSBTTUVNQ19WSVJUCQkweGY2MDAwMDAwCisjZGVmaW5lIFNNRU1DX1ZJUlQJCUlPTUVNKDB4ZjYwMDAwMDApCiAjZGVmaW5lIFNNRU1DX1NJWkUJCTB4MDAxMDAwMDAKIAogLyoKICAqIER5bmFtaWMgTWVtb3J5IENvbnRyb2xsZXIgKG9ubHkgb24gUFhBM3h4KQogICovCiAjZGVmaW5lIERNRU1DX1BIWVMJCTB4NDgxMDAwMDAKLSNkZWZpbmUgRE1FTUNfVklSVAkJMHhmNjEwMDAwMAorI2RlZmluZSBETUVNQ19WSVJUCQlJT01FTSgweGY2MTAwMDAwKQogI2RlZmluZSBETUVNQ19TSVpFCQkweDAwMTAwMDAwCiAKIC8qCiAgKiBJbnRlcm5hbCBNZW1vcnkgQ29udHJvbGxlciAoUFhBMjd4IGFuZCBsYXRlcikKICAqLwogI2RlZmluZSBJTUVNQ19QSFlTCQkweDU4MDAwMDAwCi0jZGVmaW5lIElNRU1DX1ZJUlQJCTB4ZmUwMDAwMDAKKyNkZWZpbmUgSU1FTUNfVklSVAkJSU9NRU0oMHhmZTAwMDAwMCkKICNkZWZpbmUgSU1FTUNfU0laRQkJMHgwMDEwMDAwMAogCiAjZW5kaWYgLyogX19BU01fTUFDSF9BRERSX01BUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvYmFsbG9vbjMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9iYWxsb29uMy5oCmluZGV4IDcwNzRlNzYuLjZkN2VhYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9iYWxsb29uMy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9iYWxsb29uMy5oCkBAIC0yMyw3ICsyMyw3IEBACiB9OwogCiAjZGVmaW5lIEJBTExPT04zX0ZQR0FfUEhZUwlQWEFfQ1M0X1BIWVMKLSNkZWZpbmUgQkFMTE9PTjNfRlBHQV9WSVJUCSgweGYxMDAwMDAwKQkvKiBhcyBwZXIgYmFsbG9vbjIgKi8KKyNkZWZpbmUgQkFMTE9PTjNfRlBHQV9WSVJUCUlPTUVNKDB4ZjEwMDAwMDApCS8qIGFzIHBlciBiYWxsb29uMiAqLwogI2RlZmluZSBCQUxMT09OM19GUEdBX0xFTkdUSAkweDAxMDAwMDAwCiAKICNkZWZpbmUJQkFMTE9PTjNfRlBHQV9TRVRuQ0xSCQkoMHgxMDAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA3ZDVjNzUxLi43MGIxMTJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTMsNyArMTMsNyBAQAogCiAjaW5jbHVkZSAiaGFyZHdhcmUuaCIKIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweDAwMTAwMDAwCiAJCW9ycglccnYsIFxycCwgI2lvX3AydigweDQwMDAwMDAwKQlAIHZpcnR1YWwKIAkJb3JyCVxycCwgXHJwLCAjMHg0MDAwMDAwMAkJQCBwaHlzaWNhbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2dwaW8tcHhhLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZ3Bpby1weGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI0YzkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2dwaW8tcHhhLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBXcml0dGVuIGJ5IFBoaWxpcHAgWmFiZWwgPHBoaWxpcHAuemFiZWxAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKyNpZm5kZWYgX19NQUNIX1BYQV9HUElPX1BYQV9ICisjZGVmaW5lIF9fTUFDSF9QWEFfR1BJT19QWEFfSAorCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisjZGVmaW5lIEdQSU9fUkVHU19WSVJUCWlvX3AydigweDQwRTAwMDAwKQorCisjZGVmaW5lIEJBTktfT0ZGKG4pCSgoKG4pIDwgMykgPyAobikgPDwgMiA6IDB4MTAwICsgKCgobikgLSAzKSA8PCAyKSkKKyNkZWZpbmUgR1BJT19SRUcoeCkJKCoodm9sYXRpbGUgdTMyICopKEdQSU9fUkVHU19WSVJUICsgKHgpKSkKKworLyogR1BJTyBQaW4gTGV2ZWwgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdQTFIwCQlHUElPX1JFRyhCQU5LX09GRigwKSArIDB4MDApCisjZGVmaW5lIEdQTFIxCQlHUElPX1JFRyhCQU5LX09GRigxKSArIDB4MDApCisjZGVmaW5lIEdQTFIyCQlHUElPX1JFRyhCQU5LX09GRigyKSArIDB4MDApCisjZGVmaW5lIEdQTFIzCQlHUElPX1JFRyhCQU5LX09GRigzKSArIDB4MDApCisKKy8qIEdQSU8gUGluIERpcmVjdGlvbiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1BEUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHgwYykKKyNkZWZpbmUgR1BEUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHgwYykKKyNkZWZpbmUgR1BEUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHgwYykKKyNkZWZpbmUgR1BEUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHgwYykKKworLyogR1BJTyBQaW4gT3V0cHV0IFNldCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1BTUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHgxOCkKKyNkZWZpbmUgR1BTUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHgxOCkKKyNkZWZpbmUgR1BTUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHgxOCkKKyNkZWZpbmUgR1BTUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHgxOCkKKworLyogR1BJTyBQaW4gT3V0cHV0IENsZWFyIFJlZ2lzdGVycyAqLworI2RlZmluZSBHUENSMAkJR1BJT19SRUcoQkFOS19PRkYoMCkgKyAweDI0KQorI2RlZmluZSBHUENSMQkJR1BJT19SRUcoQkFOS19PRkYoMSkgKyAweDI0KQorI2RlZmluZSBHUENSMgkJR1BJT19SRUcoQkFOS19PRkYoMikgKyAweDI0KQorI2RlZmluZSBHUENSMwkJR1BJT19SRUcoQkFOS19PRkYoMykgKyAweDI0KQorCisvKiBHUElPIFJpc2luZyBFZGdlIERldGVjdCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1JFUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHgzMCkKKyNkZWZpbmUgR1JFUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHgzMCkKKyNkZWZpbmUgR1JFUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHgzMCkKKyNkZWZpbmUgR1JFUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHgzMCkKKworLyogR1BJTyBGYWxsaW5nIEVkZ2UgRGV0ZWN0IFJlZ2lzdGVycyAqLworI2RlZmluZSBHRkVSMAkJR1BJT19SRUcoQkFOS19PRkYoMCkgKyAweDNjKQorI2RlZmluZSBHRkVSMQkJR1BJT19SRUcoQkFOS19PRkYoMSkgKyAweDNjKQorI2RlZmluZSBHRkVSMgkJR1BJT19SRUcoQkFOS19PRkYoMikgKyAweDNjKQorI2RlZmluZSBHRkVSMwkJR1BJT19SRUcoQkFOS19PRkYoMykgKyAweDNjKQorCisvKiBHUElPIEVkZ2UgRGV0ZWN0IFN0YXR1cyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR0VEUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHg0OCkKKyNkZWZpbmUgR0VEUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHg0OCkKKyNkZWZpbmUgR0VEUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHg0OCkKKyNkZWZpbmUgR0VEUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHg0OCkKKworLyogR1BJTyBBbHRlcm5hdGUgRnVuY3Rpb24gU2VsZWN0IFJlZ2lzdGVycyAqLworI2RlZmluZSBHQUZSMF9MCQlHUElPX1JFRygweDAwNTQpCisjZGVmaW5lIEdBRlIwX1UJCUdQSU9fUkVHKDB4MDA1OCkKKyNkZWZpbmUgR0FGUjFfTAkJR1BJT19SRUcoMHgwMDVDKQorI2RlZmluZSBHQUZSMV9VCQlHUElPX1JFRygweDAwNjApCisjZGVmaW5lIEdBRlIyX0wJCUdQSU9fUkVHKDB4MDA2NCkKKyNkZWZpbmUgR0FGUjJfVQkJR1BJT19SRUcoMHgwMDY4KQorI2RlZmluZSBHQUZSM19MCQlHUElPX1JFRygweDAwNkMpCisjZGVmaW5lIEdBRlIzX1UJCUdQSU9fUkVHKDB4MDA3MCkKKworLyogTW9yZSBoYW5keSBtYWNyb3MuICBUaGUgYXJndW1lbnQgaXMgYSBsaXRlcmFsIEdQSU8gbnVtYmVyLiAqLworCisjZGVmaW5lIEdQSU9fYml0KHgpCSgxIDw8ICgoeCkgJiAweDFmKSkKKworI2RlZmluZSBHUExSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDAwKQorI2RlZmluZSBHUERSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDBjKQorI2RlZmluZSBHUFNSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDE4KQorI2RlZmluZSBHUENSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDI0KQorI2RlZmluZSBHUkVSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDMwKQorI2RlZmluZSBHRkVSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDNjKQorI2RlZmluZSBHRURSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDQ4KQorI2RlZmluZSBHQUZSKHgpCQlHUElPX1JFRygweDU0ICsgKCgoeCkgJiAweDcwKSA+PiAyKSkKKworCisjZGVmaW5lIE5SX0JVSUxUSU5fR1BJTwkJUFhBX0dQSU9fSVJRX05VTQorCisjZGVmaW5lIGdwaW9fdG9fYmFuayhncGlvKQkoKGdwaW8pID4+IDUpCisKKyNpZmRlZiBDT05GSUdfQ1BVX1BYQTI2eAorLyogR1BJTzg2Lzg3Lzg4Lzg5IG9uIFBYQTI2eCBoYXZlIHRoZWlyIGRpcmVjdGlvbiBiaXRzIGluIEdQRFIyIGludmVydGVkLAorICogYXMgd2VsbCBhcyB0aGVpciBBbHRlcm5hdGUgRnVuY3Rpb24gdmFsdWUgYmVpbmcgJzEnIGZvciBHUElPIGluIEdBRlJ4LgorICovCitzdGF0aWMgaW5saW5lIGludCBfX2dwaW9faXNfaW52ZXJ0ZWQodW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gY3B1X2lzX3B4YTI1eCgpICYmIGdwaW8gPiA4NTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBfX2dwaW9faXNfaW52ZXJ0ZWQodW5zaWduZWQgZ3BpbykgeyByZXR1cm4gMDsgfQorI2VuZGlmCisKKy8qCisgKiBPbiBQWEEyNXggYW5kIFBYQTI3eCwgR0FGUnggYW5kIEdQRFJ4IHRvZ2V0aGVyIGRlY2lkZSB0aGUgYWx0ZXJuYXRlCisgKiBmdW5jdGlvbiBvZiBhIEdQSU8sIGFuZCBHUERSeCBjYW5ub3QgYmUgYWx0ZXJlZCBvbmNlIGNvbmZpZ3VyZWQuIEl0CisgKiBpcyBhdHRyaWJ1dGVkIGFzICJvY2N1cGllZCIgaGVyZSAoSSBrbm93IHRoaXMgdGVybWlub2xvZ3kgaXNuJ3QKKyAqIGFjY3VyYXRlLCB5b3UgYXJlIHdlbGNvbWUgdG8gcHJvcG9zZSBhIGJldHRlciBvbmUgOi0pCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fZ3Bpb19pc19vY2N1cGllZCh1bnNpZ25lZCBncGlvKQoreworCWlmIChjcHVfaXNfcHhhMjd4KCkgfHwgY3B1X2lzX3B4YTI1eCgpKSB7CisJCWludCBhZiA9IChHQUZSKGdwaW8pID4+ICgoZ3BpbyAmIDB4ZikgKiAyKSkgJiAweDM7CisJCWludCBkaXIgPSBHUERSKGdwaW8pICYgR1BJT19iaXQoZ3Bpbyk7CisKKwkJaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChncGlvKSkKKwkJCXJldHVybiBhZiAhPSAxIHx8IGRpciA9PSAwOworCQllbHNlCisJCQlyZXR1cm4gYWYgIT0gMCB8fCBkaXIgIT0gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIEdQRFIoZ3BpbykgJiBHUElPX2JpdChncGlvKTsKK30KKworI2luY2x1ZGUgPHBsYXQvZ3Bpby1weGEuaD4KKyNlbmRpZiAvKiBfX01BQ0hfUFhBX0dQSU9fUFhBX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGM0NjM5NTAuLjAwNGNhZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMjQsODQgKzI0LDEwIEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfUFhBX0dQSU9fSAogI2RlZmluZSBfX0FTTV9BUkNIX1BYQV9HUElPX0gKIAotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CisvKiBUaGUgZGVmaW5lcyBmb3IgdGhlIGRyaXZlciBhcmUgbmVlZGVkIGZvciB0aGUgYWNjZWxlcmF0ZWQgYWNjZXNzb3JzICovCisjaW5jbHVkZSAiZ3Bpby1weGEuaCIKIAotI2RlZmluZSBHUElPX1JFR1NfVklSVAlpb19wMnYoMHg0MEUwMDAwMCkKLQotI2RlZmluZSBCQU5LX09GRihuKQkoKChuKSA8IDMpID8gKG4pIDw8IDIgOiAweDEwMCArICgoKG4pIC0gMykgPDwgMikpCi0jZGVmaW5lIEdQSU9fUkVHKHgpCSgqKHZvbGF0aWxlIHUzMiAqKShHUElPX1JFR1NfVklSVCArICh4KSkpCi0KLS8qIEdQSU8gUGluIExldmVsIFJlZ2lzdGVycyAqLwotI2RlZmluZSBHUExSMAkJR1BJT19SRUcoQkFOS19PRkYoMCkgKyAweDAwKQotI2RlZmluZSBHUExSMQkJR1BJT19SRUcoQkFOS19PRkYoMSkgKyAweDAwKQotI2RlZmluZSBHUExSMgkJR1BJT19SRUcoQkFOS19PRkYoMikgKyAweDAwKQotI2RlZmluZSBHUExSMwkJR1BJT19SRUcoQkFOS19PRkYoMykgKyAweDAwKQotCi0vKiBHUElPIFBpbiBEaXJlY3Rpb24gUmVnaXN0ZXJzICovCi0jZGVmaW5lIEdQRFIwCQlHUElPX1JFRyhCQU5LX09GRigwKSArIDB4MGMpCi0jZGVmaW5lIEdQRFIxCQlHUElPX1JFRyhCQU5LX09GRigxKSArIDB4MGMpCi0jZGVmaW5lIEdQRFIyCQlHUElPX1JFRyhCQU5LX09GRigyKSArIDB4MGMpCi0jZGVmaW5lIEdQRFIzCQlHUElPX1JFRyhCQU5LX09GRigzKSArIDB4MGMpCi0KLS8qIEdQSU8gUGluIE91dHB1dCBTZXQgUmVnaXN0ZXJzICovCi0jZGVmaW5lIEdQU1IwCQlHUElPX1JFRyhCQU5LX09GRigwKSArIDB4MTgpCi0jZGVmaW5lIEdQU1IxCQlHUElPX1JFRyhCQU5LX09GRigxKSArIDB4MTgpCi0jZGVmaW5lIEdQU1IyCQlHUElPX1JFRyhCQU5LX09GRigyKSArIDB4MTgpCi0jZGVmaW5lIEdQU1IzCQlHUElPX1JFRyhCQU5LX09GRigzKSArIDB4MTgpCi0KLS8qIEdQSU8gUGluIE91dHB1dCBDbGVhciBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgR1BDUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHgyNCkKLSNkZWZpbmUgR1BDUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHgyNCkKLSNkZWZpbmUgR1BDUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHgyNCkKLSNkZWZpbmUgR1BDUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHgyNCkKLQotLyogR1BJTyBSaXNpbmcgRWRnZSBEZXRlY3QgUmVnaXN0ZXJzICovCi0jZGVmaW5lIEdSRVIwCQlHUElPX1JFRyhCQU5LX09GRigwKSArIDB4MzApCi0jZGVmaW5lIEdSRVIxCQlHUElPX1JFRyhCQU5LX09GRigxKSArIDB4MzApCi0jZGVmaW5lIEdSRVIyCQlHUElPX1JFRyhCQU5LX09GRigyKSArIDB4MzApCi0jZGVmaW5lIEdSRVIzCQlHUElPX1JFRyhCQU5LX09GRigzKSArIDB4MzApCi0KLS8qIEdQSU8gRmFsbGluZyBFZGdlIERldGVjdCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgR0ZFUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHgzYykKLSNkZWZpbmUgR0ZFUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHgzYykKLSNkZWZpbmUgR0ZFUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHgzYykKLSNkZWZpbmUgR0ZFUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHgzYykKLQotLyogR1BJTyBFZGdlIERldGVjdCBTdGF0dXMgUmVnaXN0ZXJzICovCi0jZGVmaW5lIEdFRFIwCQlHUElPX1JFRyhCQU5LX09GRigwKSArIDB4NDgpCi0jZGVmaW5lIEdFRFIxCQlHUElPX1JFRyhCQU5LX09GRigxKSArIDB4NDgpCi0jZGVmaW5lIEdFRFIyCQlHUElPX1JFRyhCQU5LX09GRigyKSArIDB4NDgpCi0jZGVmaW5lIEdFRFIzCQlHUElPX1JFRyhCQU5LX09GRigzKSArIDB4NDgpCi0KLS8qIEdQSU8gQWx0ZXJuYXRlIEZ1bmN0aW9uIFNlbGVjdCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgR0FGUjBfTAkJR1BJT19SRUcoMHgwMDU0KQotI2RlZmluZSBHQUZSMF9VCQlHUElPX1JFRygweDAwNTgpCi0jZGVmaW5lIEdBRlIxX0wJCUdQSU9fUkVHKDB4MDA1QykKLSNkZWZpbmUgR0FGUjFfVQkJR1BJT19SRUcoMHgwMDYwKQotI2RlZmluZSBHQUZSMl9MCQlHUElPX1JFRygweDAwNjQpCi0jZGVmaW5lIEdBRlIyX1UJCUdQSU9fUkVHKDB4MDA2OCkKLSNkZWZpbmUgR0FGUjNfTAkJR1BJT19SRUcoMHgwMDZDKQotI2RlZmluZSBHQUZSM19VCQlHUElPX1JFRygweDAwNzApCi0KLS8qIE1vcmUgaGFuZHkgbWFjcm9zLiAgVGhlIGFyZ3VtZW50IGlzIGEgbGl0ZXJhbCBHUElPIG51bWJlci4gKi8KLQotI2RlZmluZSBHUElPX2JpdCh4KQkoMSA8PCAoKHgpICYgMHgxZikpCi0KLSNkZWZpbmUgR1BMUih4KQkJR1BJT19SRUcoQkFOS19PRkYoKHgpID4+IDUpICsgMHgwMCkKLSNkZWZpbmUgR1BEUih4KQkJR1BJT19SRUcoQkFOS19PRkYoKHgpID4+IDUpICsgMHgwYykKLSNkZWZpbmUgR1BTUih4KQkJR1BJT19SRUcoQkFOS19PRkYoKHgpID4+IDUpICsgMHgxOCkKLSNkZWZpbmUgR1BDUih4KQkJR1BJT19SRUcoQkFOS19PRkYoKHgpID4+IDUpICsgMHgyNCkKLSNkZWZpbmUgR1JFUih4KQkJR1BJT19SRUcoQkFOS19PRkYoKHgpID4+IDUpICsgMHgzMCkKLSNkZWZpbmUgR0ZFUih4KQkJR1BJT19SRUcoQkFOS19PRkYoKHgpID4+IDUpICsgMHgzYykKLSNkZWZpbmUgR0VEUih4KQkJR1BJT19SRUcoQkFOS19PRkYoKHgpID4+IDUpICsgMHg0OCkKLSNkZWZpbmUgR0FGUih4KQkJR1BJT19SRUcoMHg1NCArICgoKHgpICYgMHg3MCkgPj4gMikpCi0KLQotI2RlZmluZSBOUl9CVUlMVElOX0dQSU8JCVBYQV9HUElPX0lSUV9OVU0KLQotI2RlZmluZSBncGlvX3RvX2JhbmsoZ3BpbykJKChncGlvKSA+PiA1KQogI2RlZmluZSBncGlvX3RvX2lycShncGlvKQlJUlFfR1BJTyhncGlvKQogCiBzdGF0aWMgaW5saW5lIGludCBpcnFfdG9fZ3Bpbyh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMTE4LDM3ICs0NCw1IEBACiAJcmV0dXJuIC0xOwogfQogCi0jaWZkZWYgQ09ORklHX0NQVV9QWEEyNngKLS8qIEdQSU84Ni84Ny84OC84OSBvbiBQWEEyNnggaGF2ZSB0aGVpciBkaXJlY3Rpb24gYml0cyBpbiBHUERSMiBpbnZlcnRlZCwKLSAqIGFzIHdlbGwgYXMgdGhlaXIgQWx0ZXJuYXRlIEZ1bmN0aW9uIHZhbHVlIGJlaW5nICcxJyBmb3IgR1BJTyBpbiBHQUZSeC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19ncGlvX2lzX2ludmVydGVkKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIGNwdV9pc19weGEyNXgoKSAmJiBncGlvID4gODU7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgX19ncGlvX2lzX2ludmVydGVkKHVuc2lnbmVkIGdwaW8pIHsgcmV0dXJuIDA7IH0KLSNlbmRpZgotCi0vKgotICogT24gUFhBMjV4IGFuZCBQWEEyN3gsIEdBRlJ4IGFuZCBHUERSeCB0b2dldGhlciBkZWNpZGUgdGhlIGFsdGVybmF0ZQotICogZnVuY3Rpb24gb2YgYSBHUElPLCBhbmQgR1BEUnggY2Fubm90IGJlIGFsdGVyZWQgb25jZSBjb25maWd1cmVkLiBJdAotICogaXMgYXR0cmlidXRlZCBhcyAib2NjdXBpZWQiIGhlcmUgKEkga25vdyB0aGlzIHRlcm1pbm9sb2d5IGlzbid0Ci0gKiBhY2N1cmF0ZSwgeW91IGFyZSB3ZWxjb21lIHRvIHByb3Bvc2UgYSBiZXR0ZXIgb25lIDotKQotICovCi1zdGF0aWMgaW5saW5lIGludCBfX2dwaW9faXNfb2NjdXBpZWQodW5zaWduZWQgZ3BpbykKLXsKLQlpZiAoY3B1X2lzX3B4YTI3eCgpIHx8IGNwdV9pc19weGEyNXgoKSkgewotCQlpbnQgYWYgPSAoR0FGUihncGlvKSA+PiAoKGdwaW8gJiAweGYpICogMikpICYgMHgzOwotCQlpbnQgZGlyID0gR1BEUihncGlvKSAmIEdQSU9fYml0KGdwaW8pOwotCi0JCWlmIChfX2dwaW9faXNfaW52ZXJ0ZWQoZ3BpbykpCi0JCQlyZXR1cm4gYWYgIT0gMSB8fCBkaXIgPT0gMDsKLQkJZWxzZQotCQkJcmV0dXJuIGFmICE9IDAgfHwgZGlyICE9IDA7Ci0JfSBlbHNlCi0JCXJldHVybiBHUERSKGdwaW8pICYgR1BJT19iaXQoZ3Bpbyk7Ci19Ci0KICNpbmNsdWRlIDxwbGF0L2dwaW8uaD4KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCBkZTYzY2EzLi44MTg0NjY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMzYsMjIgKzM2LDIzIEBACiAgKiBOb3RlIHRoYXQgbm90IGFsbCBQWEEyeHggY2hpcHMgaW1wbGVtZW50IGFsbCB0aG9zZSBhZGRyZXNzZXMsIGFuZCB0aGUKICAqIGtlcm5lbCBvbmx5IG1hcHMgdGhlIG1pbmltdW0gbmVlZGVkIHJhbmdlIG9mIHRoaXMgbWFwcGluZy4KICAqLwotI2RlZmluZSBpb19wMnYoeCkgKDB4ZjIwMDAwMDAgKyAoKHgpICYgMHgwMWZmZmZmZikgKyAoKCh4KSAmIDB4MWMwMDAwMDApID4+IDEpKQogI2RlZmluZSBpb192MnAoeCkgKDB4M2MwMDAwMDAgKyAoKHgpICYgMHgwMWZmZmZmZikgKyAoKCh4KSAmIDB4MGUwMDAwMDApIDw8IDEpKQorI2RlZmluZSBpb19wMnYoeCkgSU9NRU0oMHhmMjAwMDAwMCArICgoeCkgJiAweDAxZmZmZmZmKSArICgoKHgpICYgMHgxYzAwMDAwMCkgPj4gMSkpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLSMgZGVmaW5lIF9fUkVHKHgpCSgqKCh2b2xhdGlsZSB1MzIgKilpb19wMnYoeCkpKQorIyBkZWZpbmUgSU9NRU0oeCkgKCh2b2lkIF9faW9tZW0gKikoeCkpCisjIGRlZmluZSBfX1JFRyh4KQkoKigodm9sYXRpbGUgdTMyIF9faW9tZW0gKilpb19wMnYoeCkpKQogCiAvKiBXaXRoIGluZGV4ZWQgcmVncyB3ZSBkb24ndCB3YW50IHRvIGZlZWQgdGhlIGluZGV4IHRocm91Z2ggaW9fcDJ2KCkKICAgIGVzcGVjaWFsbHkgaWYgaXQgaXMgYSB2YXJpYWJsZSwgb3RoZXJ3aXNlIGhvcnJpYmxlIGNvZGUgd2lsbCByZXN1bHQuICovCiAjIGRlZmluZSBfX1JFRzIoeCx5KQlcCi0JKCoodm9sYXRpbGUgdTMyICopKCh1MzIpJl9fUkVHKHgpICsgKHkpKSkKKwkoKih2b2xhdGlsZSB1MzIgX19pb21lbSopKCh1MzIpJl9fUkVHKHgpICsgKHkpKSkKIAogIyBkZWZpbmUgX19QUkVHKHgpCShpb192MnAoKHUzMikmKHgpKSkKIAogI2Vsc2UKIAorIyBkZWZpbmUgSU9NRU0oeCkJeCAKICMgZGVmaW5lIF9fUkVHKHgpCWlvX3Aydih4KQogIyBkZWZpbmUgX19QUkVHKHgpCWlvX3YycCh4KQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbGl0dGxldG9uLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbGl0dGxldG9uLmgKaW5kZXggMmE1NzI2Yy4uYjYyMzhjYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2xpdHRsZXRvbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9saXR0bGV0b24uaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19BU01fQVJDSF9MSVRUTEVUT05fSAogI2RlZmluZSBfX0FTTV9BUkNIX0xJVFRMRVRPTl9ICiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tcHhhLmg+CiAKICNkZWZpbmUgTElUVExFVE9OX0VUSF9QSFlTCTB4MzAwMDAwMDAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2xwZDI3MC5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2xwZDI3MC5oCmluZGV4IGNkMDcwMDkuLjRlZGM3MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9scGQyNzAuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbHBkMjcwLmgKQEAgLTEzLDEzICsxMywxMyBAQAogI2RlZmluZSBfX0FTTV9BUkNIX0xQRDI3MF9ICiAKICNkZWZpbmUgTFBEMjcwX0NQTERfUEhZUwlQWEFfQ1MyX1BIWVMKLSNkZWZpbmUgTFBEMjcwX0NQTERfVklSVAkweGYwMDAwMDAwCisjZGVmaW5lIExQRDI3MF9DUExEX1ZJUlQJSU9NRU0oMHhmMDAwMDAwMCkKICNkZWZpbmUgTFBEMjcwX0NQTERfU0laRQkweDAwMTAwMDAwCiAKICNkZWZpbmUgTFBEMjcwX0VUSF9QSFlTCQkoUFhBX0NTMl9QSFlTICsgMHgwMTAwMDAwMCkKIAogLyogQ1BMRCByZWdpc3RlcnMgICovCi0jZGVmaW5lIExQRDI3MF9DUExEX1JFRyh4KQkoKHVuc2lnbmVkIGxvbmcpKExQRDI3MF9DUExEX1ZJUlQgKyAoeCkpKQorI2RlZmluZSBMUEQyNzBfQ1BMRF9SRUcoeCkJKExQRDI3MF9DUExEX1ZJUlQgKyAoeCkpCiAjZGVmaW5lIExQRDI3MF9DT05UUk9MCQlMUEQyNzBfQ1BMRF9SRUcoMHgwMCkKICNkZWZpbmUgTFBEMjcwX1BFUklQSEVSQUwwCUxQRDI3MF9DUExEX1JFRygweDA0KQogI2RlZmluZSBMUEQyNzBfUEVSSVBIRVJBTDEJTFBEMjcwX0NQTERfUkVHKDB4MDgpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWE1OTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqICBhcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKLSAqIENvcHlyaWdodDoJKEMpIDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0vKgotICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCi0gKi8KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweGEwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tdGQteGlwLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbXRkLXhpcC5oCmluZGV4IDI5NzM4N2UuLjk5MGQyYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tdGQteGlwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL210ZC14aXAuaApAQCAtMTYsNyArMTYsNiBAQAogI2RlZmluZSBfX0FSQ0hfUFhBX01URF9YSVBfSF9fCiAKICNpbmNsdWRlIDxtYWNoL3JlZ3Mtb3N0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWludGMuaD4KIAogI2RlZmluZSB4aXBfaXJxcGVuZGluZygpCShJQ0lQICYgSUNNUikKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG0yN3guaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtMjd4LmgKaW5kZXggMGE1ZTVlYS4uZjgwYmJlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG0yN3guaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbTI3eC5oCkBAIC0zNCw3ICszNCw3IEBACiBleHRlcm4gdm9pZCBfX2luaXQgcGFsbTI3eF9sY2RfaW5pdChpbnQgcG93ZXIsCiAJCQkJCXN0cnVjdCBweGFmYl9tb2RlX2luZm8gKm1vZGUpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWxtMjd4X2xjZF9pbml0KGludCBwb3dlciwgc3RydWN0IHB4YWZiX21vZGVfaW5mbyAqbW9kZSkge30KKyNkZWZpbmUgcGFsbTI3eF9sY2RfaW5pdChwb3dlciwgbW9kZSkJZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKIAogI2lmCWRlZmluZWQoQ09ORklHX1VTQl9HQURHRVRfUFhBMjdYKSB8fCBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXR4LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXR4LmgKaW5kZXggMTBhYmM0Zi4uNzA3NGE2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtdHguaApAQCAtNzEsNyArNzEsNyBAQAogCiAvKiBWYXJpb3VzIGFkZHJlc3NlcyAgKi8KICNkZWZpbmUgUEFMTVRYX1BDTUNJQV9QSFlTCTB4MjgwMDAwMDAKLSNkZWZpbmUgUEFMTVRYX1BDTUNJQV9WSVJUCTB4ZjAwMDAwMDAKKyNkZWZpbmUgUEFMTVRYX1BDTUNJQV9WSVJUCUlPTUVNKDB4ZjAwMDAwMDApCiAjZGVmaW5lIFBBTE1UWF9QQ01DSUFfU0laRQkweDEwMDAwMAogCiAjZGVmaW5lIFBBTE1UWF9QSFlTX1JBTV9TVEFSVAkweGEwMDAwMDAwCkBAIC04NCw4ICs4NCw4IEBACiAKICNkZWZpbmUgUEFMTVRYX05BTkRfQUxFX1BIWVMJKFBBTE1UWF9QSFlTX05BTkRfU1RBUlQgfCAoMSA8PCAyNCkpCiAjZGVmaW5lIFBBTE1UWF9OQU5EX0NMRV9QSFlTCShQQUxNVFhfUEhZU19OQU5EX1NUQVJUIHwgKDEgPDwgMjUpKQotI2RlZmluZSBQQUxNVFhfTkFORF9BTEVfVklSVAkweGZmMTAwMDAwCi0jZGVmaW5lIFBBTE1UWF9OQU5EX0NMRV9WSVJUCTB4ZmYyMDAwMDAKKyNkZWZpbmUgUEFMTVRYX05BTkRfQUxFX1ZJUlQJSU9NRU0oMHhmZjEwMDAwMCkKKyNkZWZpbmUgUEFMTVRYX05BTkRfQ0xFX1ZJUlQJSU9NRU0oMHhmZjIwMDAwMCkKIAogLyogVE9VQ0hTQ1JFRU4gKi8KICNkZWZpbmUgQUM5N19MSU5LX0ZSQU1FCQkJMjEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyN3guaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyN3guaAppbmRleCBiOWIxYmRjLi43Y2ZmNjQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhMjd4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTI3eC5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfX01BQ0hfUFhBMjd4X0gKICNkZWZpbmUgX19NQUNIX1BYQTI3eF9ICiAKKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGEyN3guaD4KQEAgLTIxLDYgKzIyLDcgQEAKIGV4dGVybiB2b2lkIF9faW5pdCBweGEyN3hfbWFwX2lvKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHB4YTI3eF9pbml0X2lycSh2b2lkKTsKIGV4dGVybiBpbnQgX19pbml0IHB4YTI3eF9zZXRfcHdybW9kZSh1bnNpZ25lZCBpbnQgbW9kZSk7CitleHRlcm4gdm9pZCBweGEyN3hfY3B1X3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSk7CiAKICNkZWZpbmUgcHhhMjd4X2hhbmRsZV9pcnEJaWNocF9oYW5kbGVfaXJxCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGE5NXguaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGE5NXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmIwOTdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTk1eC5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX01BQ0hfUFhBOTVYX0gKKyNkZWZpbmUgX19NQUNIX1BYQTk1WF9ICisKKyNpbmNsdWRlIDxtYWNoL3B4YTN4eC5oPgorI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTkzMC5oPgorCisjZW5kaWYgLyogX19NQUNIX1BYQTk1WF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhZmIuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGFmYi5oCmluZGV4IDAxYTQ1YWM0Li40ODZiNGM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhZmIuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhZmIuaApAQCAtMTU4LDUgKzE1OCwxOCBAQAogdm9pZCBweGFfc2V0X2ZiX2luZm8oc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvICopOwogdW5zaWduZWQgbG9uZyBweGFmYl9nZXRfaHN5bmNfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCisjaWZkZWYgQ09ORklHX0ZCX1BYQV9TTUFSVFBBTkVMCiBleHRlcm4gaW50IHB4YWZiX3NtYXJ0X3F1ZXVlKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1aW50MTZfdCAqY21kcywgaW50KTsKIGV4dGVybiBpbnQgcHhhZmJfc21hcnRfZmx1c2goc3RydWN0IGZiX2luZm8gKmluZm8pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHB4YWZiX3NtYXJ0X3F1ZXVlKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCSAgICB1aW50MTZfdCAqY21kcywgaW50IG4pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB4YWZiX3NtYXJ0X2ZsdXNoKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvc21lbWMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9zbWVtYy5oCmluZGV4IDY1NGFkYzkuLmI3ZGU0NzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9zbWVtYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9zbWVtYy5oCkBAIC0xMyw3ICsxMyw3IEBACiAKICNkZWZpbmUgUFhBMlhYX1NNRU1DX0JBU0UJMHg0ODAwMDAwMAogI2RlZmluZSBQWEEzWFhfU01FTUNfQkFTRQkweDRhMDAwMDAwCi0jZGVmaW5lIFNNRU1DX1ZJUlQJCTB4ZjYwMDAwMDAKKyNkZWZpbmUgU01FTUNfVklSVAkJSU9NRU0oMHhmNjAwMDAwMCkKIAogI2RlZmluZSBNRENORkcJCShTTUVNQ19WSVJUICsgMHgwMCkgIC8qIFNEUkFNIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAqLwogI2RlZmluZSBNRFJFRlIJCShTTUVNQ19WSVJUICsgMHgwNCkgIC8qIFNEUkFNIFJlZnJlc2ggQ29udHJvbCBSZWdpc3RlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3pldXMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC96ZXVzLmgKaW5kZXggMDY0MWYzMS4uNTYwMjRmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3pldXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvemV1cy5oCkBAIC02OCw3ICs2OCw3IEBACiAgKiBCZSBnZW50bGUsIGFuZCByZW1hcCB0aGF0IG92ZXIgMzJrQi4uLgogICovCiAKLSNkZWZpbmUgWkVVU19DUExECQkoMHhmMDAwMDAwMCkKKyNkZWZpbmUgWkVVU19DUExECQlJT01FTSgweGYwMDAwMDAwKQogI2RlZmluZSBaRVVTX0NQTERfVkVSU0lPTgkoWkVVU19DUExEICsgMHgwMDAwKQogI2RlZmluZSBaRVVTX0NQTERfSVNBX0lSUQkoWkVVU19DUExEICsgMHgxMDAwKQogI2RlZmluZSBaRVVTX0NQTERfQ09OVFJPTAkoWkVVU19DUExEICsgMHgyMDAwKQpAQCAtNzYsNyArNzYsNyBAQAogLyogQ1BMRCByZWdpc3RlciBiaXRzICovCiAjZGVmaW5lIFpFVVNfQ1BMRF9DT05UUk9MX0NGX1JTVCAgICAgICAgMHgwMQogCi0jZGVmaW5lIFpFVVNfUEMxMDRJTwkJKDB4ZjEwMDAwMDApCisjZGVmaW5lIFpFVVNfUEMxMDRJTwkJSU9NRU0oMHhmMTAwMDAwMCkKIAogI2RlZmluZSBaRVVTX1NSQU1fU0laRQkJKDI1NiAqIDEwMjQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC96eWxvbml0ZS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3p5bG9uaXRlLmgKaW5kZXggZWEyNDk5OC4uZWNjYTk3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3p5bG9uaXRlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3p5bG9uaXRlLmgKQEAgLTE5LDcgKzE5LDcgQEAKIGV4dGVybiBpbnQgbGNkX2lkOwogZXh0ZXJuIGludCBsY2Rfb3JpZW50YXRpb247CiAKLSNpZmRlZiBDT05GSUdfQ1BVX1BYQTMwMAorI2lmZGVmIENPTkZJR19NQUNIX1pZTE9OSVRFMzAwCiBleHRlcm4gdm9pZCB6eWxvbml0ZV9weGEzMDBfaW5pdCh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgenlsb25pdGVfcHhhMzAwX2luaXQodm9pZCkKQEAgLTI5LDcgKzI5LDcgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0NQVV9QWEEzMjAKKyNpZmRlZiBDT05GSUdfTUFDSF9aWUxPTklURTMyMAogZXh0ZXJuIHZvaWQgenlsb25pdGVfcHhhMzIwX2luaXQodm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHp5bG9uaXRlX3B4YTMyMF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCmluZGV4IGNhNjA3NTcuLjUzMmM1ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jCkBAIC0xMSw3ICsxMSw2IEBACiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMjMsMTEgKzIyLDExIEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLXB4YS5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCi0jZGVmaW5lIElSUV9CQVNFCQkodm9pZCBfX2lvbWVtICopaW9fcDJ2KDB4NDBkMDAwMDApCisjZGVmaW5lIElSUV9CQVNFCQlpb19wMnYoMHg0MGQwMDAwMCkKIAogI2RlZmluZSBJQ0lQCQkJKDB4MDAwKQogI2RlZmluZSBJQ01SCQkJKDB4MDA0KQpAQCAtNjUsNyArNjQsNyBAQAogCQkweDQwZDAwMTMwLAogCX07CiAKLQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKWlvX3AydihwaHlzX2Jhc2VbaV0pOworCXJldHVybiBpb19wMnYocGh5c19iYXNlW2ldKTsKIH0KIAogdm9pZCBweGFfbWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbGl0dGxldG9uLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9saXR0bGV0b24uYwppbmRleCA4Zjk3ZTE1Li43YjMyNGVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9saXR0bGV0b24uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9saXR0bGV0b24uYwpAQCAtMzI1LDggKzMyNSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfcGxhdGZvcm1fZGF0YSBsaXR0bGV0b25fbmFuZF9pbmZvID0gewogCS5lbmFibGVfYXJiaXRlcgk9IDEsCi0JLnBhcnRzCQk9IGxpdHRsZXRvbl9uYW5kX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShsaXR0bGV0b25fbmFuZF9wYXJ0aXRpb25zKSwKKwkubnVtX2NzCQk9IDEsCisJLnBhcnRzWzBdCT0gbGl0dGxldG9uX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHNbMF0JPSBBUlJBWV9TSVpFKGxpdHRsZXRvbl9uYW5kX3BhcnRpdGlvbnMpLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGxpdHRsZXRvbl9pbml0X25hbmQodm9pZCkKQEAgLTQzNyw3ICs0MzgsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKExJVFRMRVRPTiwgIk1hcnZlbGwgRm9ybSBGYWN0b3IgRGV2ZWxvcG1lbnQgUGxhdGZvcm0gKGFrYSBMaXR0bGV0b24pIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhM3h4X21hcF9pbywKIAkubnJfaXJxcwk9IExJVFRMRVRPTl9OUl9JUlFTLAogCS5pbml0X2lycQk9IHB4YTN4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2xwZDI3MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMKaW5kZXggYzE3MWQ2ZS4uMWRkNTMwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAKICNpbmNsdWRlIDxtYWNoL3B4YTI3eC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvbHBkMjcwLmg+CiAjaW5jbHVkZSA8bWFjaC9hdWRpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KQEAgLTQ4MCw3ICs0NzksNyBAQAogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGxwZDI3MF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7Ci0JCS52aXJ0dWFsCT0gTFBEMjcwX0NQTERfVklSVCwKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylMUEQyNzBfQ1BMRF9WSVJULAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oTFBEMjcwX0NQTERfUEhZUyksCiAJCS5sZW5ndGgJCT0gTFBEMjcwX0NQTERfU0laRSwKIAkJLnR5cGUJCT0gTVRfREVWSUNFLApAQCAtNDk5LDcgKzQ5OCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTE9HSUNQRF9QWEEyNzAsICJMb2dpY1BEIFBYQTI3MCBDYXJkIEVuZ2luZSIpCiAJLyogTWFpbnRhaW5lcjogUGV0ZXIgQmFyYWRhICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGxwZDI3MF9tYXBfaW8sCiAJLm5yX2lycXMJPSBMUEQyNzBfTlJfSVJRUywKIAkuaW5pdF9pcnEJPSBscGQyNzBfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKaW5kZXggYThjNjk2Yi4uYzQ4Y2U2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYwpAQCAtMTEsNiArMTEsNyBAQAogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNDIsNyArNDMsNiBAQAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KIAogI2luY2x1ZGUgPG1hY2gvcHhhMjV4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdWRpby5oPgogI2luY2x1ZGUgPG1hY2gvbHViYm9jay5oPgogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYwppbmRleCA1ZmU1YmNkLi40Yjc5NmMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMKQEAgLTc1Myw3ICs3NTMsNyBAQAogCiAKIE1BQ0hJTkVfU1RBUlQoTUFHSUNJQU4sICJIVEMgTWFnaWNpYW4iKQotCS5ib290X3BhcmFtcyA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IHB4YTI3eF9tYXBfaW8sCiAJLm5yX2lycXMgPSBNQUdJQ0lBTl9OUl9JUlFTLAogCS5pbml0X2lycSA9IHB4YTI3eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKaW5kZXggNDYyMmViNy4uMDU2N2QzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAogI2luY2x1ZGUgPG1hY2gvcHhhMjd4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9tYWluc3RvbmUuaD4KICNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgpAQCAtNjE2LDcgKzYxNSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTUFJTlNUT05FLCAiSW50ZWwgSENEREJCVkEwIERldmVsb3BtZW50IFBsYXRmb3JtIChha2EgTWFpbnN0b25lKSIpCiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwJLyogQkxPQiBib290IHBhcmFtZXRlciBzZXR0aW5nICovCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCS8qIEJMT0IgYm9vdCBwYXJhbWV0ZXIgc2V0dGluZyAqLwogCS5tYXBfaW8JCT0gbWFpbnN0b25lX21hcF9pbywKIAkubnJfaXJxcwk9IE1BSU5TVE9ORV9OUl9JUlFTLAogCS5pbml0X2lycQk9IG1haW5zdG9uZV9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYwppbmRleCBiMjc1NDRiLi40M2E1ZjY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCkBAIC0xMiwxNSArMTIsMTUgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMnh4Lmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLXB4YS5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxLmMKaW5kZXggNjQ4MTBmOS4uYjkzOGZjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbWlvYTcwMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDEuYwpAQCAtNzUxLDcgKzc1MSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTUlPQTcwMSwgIk1JTyBBNzAxIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gJnB4YTI3eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gJnB4YTI3eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9ICZweGEyN3hfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21wOTAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tcDkwMC5jCmluZGV4IGZiNDA4ODYxLi40YWY1ZDUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tcDkwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21wOTAwLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAogLyogTWFpbnRhaW5lciAtIE1pY2hhZWwgUGV0Y2hrb3Zza3kgPG1rcGV0Y2hAaW50ZXJub2RlLm9uLm5ldD4gKi8KIE1BQ0hJTkVfU1RBUlQoTkVDX01QOTAwLCAiTW9iaWxlUHJvOTAwL0MiKQotCS5ib290X3BhcmFtcwk9IDB4YTAyMjAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgyMjAxMDAsCiAJLnRpbWVyCQk9ICZweGFfdGltZXIsCiAJLm1hcF9pbwkJPSBweGEyNXhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL214bTh4MTAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL214bTh4MTAuYwppbmRleCBiNWE4ZmQzLi45MDkyOGQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9teG04eDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbXhtOHgxMC5jCkBAIC0zODksMTAgKzM4OSwxMSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhIG14bV84eDEwX25hbmRfaW5mbyA9IHsKLQkuZW5hYmxlX2FyYml0ZXIgPSAxLAotCS5rZWVwX2NvbmZpZyA9IDEsCi0JLnBhcnRzID0gbXhtXzh4MTBfbmFuZF9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cyA9IEFSUkFZX1NJWkUobXhtXzh4MTBfbmFuZF9wYXJ0aXRpb25zKQorCS5lbmFibGVfYXJiaXRlcgk9IDEsCisJLmtlZXBfY29uZmlnCT0gMSwKKwkubnVtX2NzCQk9IDEsCisJLnBhcnRzWzBdCT0gbXhtXzh4MTBfbmFuZF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0c1swXQk9IEFSUkFZX1NJWkUobXhtXzh4MTBfbmFuZF9wYXJ0aXRpb25zKQogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IG14bV84eDEwX25hbmRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbWxkLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtbGQuYwppbmRleCA2Yjc3MzY1Li4zZDRhMjgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtbGQuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtbGQuYwpAQCAtMzQyLDcgKzM0Miw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUEFMTUxELCAiUGFsbSBMaWZlRHJpdmUiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBwYWxtbGRfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHB4YTI3eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXQ1LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdDUuYwppbmRleCA5YmQzZTQ3Li45OWQ2YmNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdDUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdDUuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUEFMTVQ1LCAiUGFsbSBUdW5nc3RlbnxUNSIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI3eF9tYXBfaW8sCiAJLnJlc2VydmUJPSBwYWxtdDVfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBweGEyN3hfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdGMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10Yy5jCmluZGV4IDZhZDRhNmMuLjZlYzdjYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10Yy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10Yy5jCkBAIC01MzcsNyArNTM3LDcgQEAKIH07CiAKIE1BQ0hJTkVfU1RBUlQoUEFMTVRDLCAiUGFsbSBUdW5nc3RlbnxDIikKLQkuYm9vdF9wYXJhbXMgCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgCT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEyNXhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHB4YTI1eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRlMi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRlMi5jCmluZGV4IDY2NDIzMmYuLjkzNzZkYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10ZTIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdGUyLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFBBTE1URTIsICJQYWxtIFR1bmdzdGVufEUyIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhMjV4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEJPSBweGEyNXhfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10cmVvLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdHJlby5jCmluZGV4IGJiMjdkNGIuLjk0ZTk3MDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10cmVvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRyZW8uYwpAQCAtNDIzLDYgKzQyMyw3IEBACiAJcGFsbXRyZW9fbGVkc19pbml0KCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfTUFDSF9UUkVPNjgwCiBzdGF0aWMgdm9pZCBfX2luaXQgdHJlbzY4MF9pbml0KHZvaWQpCiB7CiAJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUodHJlbzY4MF9waW5fY29uZmlnKSk7CkBAIC00MzAsNyArNDMxLDkgQEAKIAlwYWxtMjd4X21tY19pbml0KEdQSU9fTlJfVFJFT19TRF9ERVRFQ1RfTiwgR1BJT19OUl9UUkVPNjgwX1NEX1JFQURPTkxZLAogCQkJR1BJT19OUl9UUkVPNjgwX1NEX1BPV0VSLCAwKTsKIH0KKyNlbmRpZgogCisjaWZkZWYgQ09ORklHX01BQ0hfQ0VOVFJPCiBzdGF0aWMgdm9pZCBfX2luaXQgY2VudHJvX2luaXQodm9pZCkKIHsKIAlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShjZW50cm82ODVfcGluX2NvbmZpZykpOwpAQCAtNDM4LDkgKzQ0MSwxMSBAQAogCXBhbG0yN3hfbW1jX2luaXQoR1BJT19OUl9UUkVPX1NEX0RFVEVDVF9OLCAtMSwKIAkJCUdQSU9fTlJfQ0VOVFJPX1NEX1BPV0VSLCAxKTsKIH0KKyNlbmRpZgogCisjaWZkZWYgQ09ORklHX01BQ0hfVFJFTzY4MAogTUFDSElORV9TVEFSVChUUkVPNjgwLCAiUGFsbSBUcmVvIDY4MCIpCi0JLmJvb3RfcGFyYW1zICAgID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGEyN3hfbWFwX2lvLAogCS5yZXNlcnZlCT0gdHJlb19yZXNlcnZlLAogCS5pbml0X2lycSAgICAgICA9IHB4YTI3eF9pbml0X2lycSwKQEAgLTQ0OCw5ICs0NTMsMTEgQEAKIAkudGltZXIgICAgICAgICAgPSAmcHhhX3RpbWVyLAogCS5pbml0X21hY2hpbmUgICA9IHRyZW82ODBfaW5pdCwKIE1BQ0hJTkVfRU5ECisjZW5kaWYKIAorI2lmZGVmIENPTkZJR19NQUNIX0NFTlRSTwogTUFDSElORV9TVEFSVChDRU5UUk8sICJQYWxtIENlbnRybyA2ODUiKQotCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhMjd4X21hcF9pbywKIAkucmVzZXJ2ZQk9IHRyZW9fcmVzZXJ2ZSwKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCkBAIC00NTgsMyArNDY1LDQgQEAKIAkudGltZXIgICAgICAgICAgPSAmcHhhX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBjZW50cm9faW5pdCwKIE1BQ0hJTkVfRU5ECisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXR4LmMKaW5kZXggZmM0Mjg1NTguLjRlM2U0NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10eC5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJCQkgdW5zaWduZWQgaW50IGN0cmwpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIG5hbmRhZGRyID0gKHVuc2lnbmVkIGxvbmcpdGhpcy0+SU9fQUREUl9XOworCWNoYXIgX19pb21lbSAqbmFuZGFkZHIgPSB0aGlzLT5JT19BRERSX1c7CiAKIAlpZiAoY21kID09IE5BTkRfQ01EX05PTkUpCiAJCXJldHVybjsKQEAgLTMxNSwxNyArMzE1LDE3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBwYWxtdHhfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CiB7Ci0JLnZpcnR1YWwJPSBQQUxNVFhfUENNQ0lBX1ZJUlQsCisJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylQQUxNVFhfUENNQ0lBX1ZJUlQsCiAJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFBBTE1UWF9QQ01DSUFfUEhZUyksCiAJLmxlbmd0aAkJPSBQQUxNVFhfUENNQ0lBX1NJWkUsCiAJLnR5cGUJCT0gTVRfREVWSUNFLAogfSwgewotCS52aXJ0dWFsCT0gUEFMTVRYX05BTkRfQUxFX1ZJUlQsCisJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylQQUxNVFhfTkFORF9BTEVfVklSVCwKIAkucGZuCQk9IF9fcGh5c190b19wZm4oUEFMTVRYX05BTkRfQUxFX1BIWVMpLAogCS5sZW5ndGgJCT0gU1pfMU0sCiAJLnR5cGUJCT0gTVRfREVWSUNFLAogfSwgewotCS52aXJ0dWFsCT0gUEFMTVRYX05BTkRfQ0xFX1ZJUlQsCisJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylQQUxNVFhfTkFORF9DTEVfVklSVCwKIAkucGZuCQk9IF9fcGh5c190b19wZm4oUEFMTVRYX05BTkRfQ0xFX1BIWVMpLAogCS5sZW5ndGgJCT0gU1pfMU0sCiAJLnR5cGUJCT0gTVRfREVWSUNFLApAQCAtMzY0LDcgKzM2NCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUEFMTVRYLCAiUGFsbSBUfFgiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBwYWxtdHhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHB4YTI3eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXo3Mi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXo3Mi5jCmluZGV4IGU2MWMxY2MuLjY4ZTE4YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG16NzIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtejcyLmMKQEAgLTM5OSw3ICszOTksNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFBBTE1aNzIsICJQYWxtIFppcmU3MiIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI3eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjd4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wY20wMjcuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BjbTAyNy5jCmluZGV4IGZmYTY1ZGYuLjBiODI1YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BjbTAyNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BjbTAyNy5jCkBAIC0yNTgsNyArMjU4LDcgQEAKIAogTUFDSElORV9TVEFSVChQQ00wMjcsICJQaHl0ZWMgTWVzc3RlY2huaWsgR21iSCBwaHlDT1JFLVBYQTI3MCIpCiAJLyogTWFpbnRhaW5lcjogUGVuZ3V0cm9uaXggKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcGNtMDI3X21hcF9pbywKIAkubnJfaXJxcwk9IFBDTTAyN19OUl9JUlFTLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BjbTk5MC1iYXNlYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BjbTk5MC1iYXNlYm9hcmQuYwppbmRleCA2ZDViN2UwLi42ZDM4YzY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wY205OTAtYmFzZWJvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGNtOTkwLWJhc2Vib2FyZC5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgogCi0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMjd4Lmg+CkBAIC0zOTUsOSArMzk0LDkgQEAKIAl9CiAKIAlpZiAoZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfOCkKLQkJZ3Bpb19zZXRfdmFsdWUoZ3Bpb19idXNfc3dpdGNoLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZ3Bpb19idXNfc3dpdGNoLCAxKTsKIAllbHNlCi0JCWdwaW9fc2V0X3ZhbHVlKGdwaW9fYnVzX3N3aXRjaCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGdwaW9fYnVzX3N3aXRjaCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKaW5kZXggOTQ4Y2UzZS4uNTBjODMzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEyNXguYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jCmluZGV4IDljNDM0ZDIuLmYwNWY5NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKiBpbml0aWFsaXphdGlvbiBzdHVmZiBmb3IgUFhBIG1hY2hpbmVzIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGxhdGVyIGlmCiAgKiBuZWVkIGJlLgogICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTIzLDEyICsyNCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMjV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgogI2luY2x1ZGUgPG1hY2gvcG0uaD4KQEAgLTMyNCw3ICszMjUsNyBAQAogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHB4YTI1eF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7CS8qIE1lbSBDdGwgKi8KLQkJLnZpcnR1YWwJPSBTTUVNQ19WSVJULAorCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVNNRU1DX1ZJUlQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihQWEEyWFhfU01FTUNfQkFTRSksCiAJCS5sZW5ndGgJCT0gMHgwMDIwMDAwMCwKIAkJLnR5cGUJCT0gTVRfREVWSUNFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEyN3guYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCmluZGV4IDlkMjQwMGIuLmJjNWE5OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjAsMTMgKzIxLDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvcHhhLWkyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3B4YTI3eC5oPgogI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KICNpbmNsdWRlIDxtYWNoL29oY2kuaD4KQEAgLTM5MCw3ICszOTEsNyBAQAogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHB4YTI3eF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7CS8qIE1lbSBDdGwgKi8KLQkJLnZpcnR1YWwJPSBTTUVNQ19WSVJULAorCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVNNRU1DX1ZJUlQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihQWEEyWFhfU01FTUNfQkFTRSksCiAJCS5sZW5ndGgJCT0gMHgwMDIwMDAwMCwKIAkJLnR5cGUJCT0gTVRfREVWSUNFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHgtdWxwaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LXVscGkuYwppbmRleCBjZTcxNjhiLi5lMjhkZmI4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LXVscGkuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHgtdWxwaS5jCkBAIC0yNjUsNiArMjY1LDcgQEAKIAogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChweGEzeHhfdTJkX3N0YXJ0X2hjKTsKIAogdm9pZCBweGEzeHhfdTJkX3N0b3BfaGMoc3RydWN0IHVzYl9idXMgKmhvc3QpCiB7CkBAIC0yNzcsNiArMjc4LDcgQEAKIAogCWNsa19kaXNhYmxlKHUyZC0+Y2xrKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHB4YTN4eF91MmRfc3RvcF9oYyk7CiAKIHN0YXRpYyBpbnQgcHhhM3h4X3UyZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHguYwppbmRleCBiNWNkOWU1Li4wNzM3YzU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHguYwpAQCAtMTIsNyArMTIsNiBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yNiw3ICsyNSw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLXB4YS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhM3h4LXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CiAjaW5jbHVkZSA8bWFjaC9vaGNpLmg+CkBAIC0zOTQsNyArMzkzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBweGEzeHhfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJewkvKiBNZW0gQ3RsICovCi0JCS52aXJ0dWFsCT0gU01FTUNfVklSVCwKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTTUVNQ19WSVJULAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oUFhBM1hYX1NNRU1DX0JBU0UpLAogCQkubGVuZ3RoCQk9IDB4MDAyMDAwMDAsCiAJCS50eXBlCQk9IE1UX0RFVklDRQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhOTV4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9weGE5NXguYwppbmRleCAwZWUxNjZiLi41MTM3MWIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9weGE5NXguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9weGE5NXguYwpAQCAtOSw3ICs5LDYgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjEsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLXB4YS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhM3h4LXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL3B4YTkzMC5oPgogI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9yYXVtZmVsZC5jCmluZGV4IGJiY2Q5MDUuLmYwYzA1ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcmF1bWZlbGQuYwpAQCAtMzQ2LDggKzM0Niw5IEBACiBzdGF0aWMgc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgcmF1bWZlbGRfbmFuZF9pbmZvID0gewogCS5lbmFibGVfYXJiaXRlcgk9IDEsCiAJLmtlZXBfY29uZmlnCT0gMSwKLQkucGFydHMJCT0gcmF1bWZlbGRfbmFuZF9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUocmF1bWZlbGRfbmFuZF9wYXJ0aXRpb25zKSwKKwkubnVtX2NzCQk9IDEsCisJLnBhcnRzWzBdCT0gcmF1bWZlbGRfbmFuZF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0c1swXQk9IEFSUkFZX1NJWkUocmF1bWZlbGRfbmFuZF9wYXJ0aXRpb25zKSwKIH07CiAKIC8qKgpAQCAtMTA4Niw3ICsxMDg3LDcgQEAKIAogI2lmZGVmIENPTkZJR19NQUNIX1JBVU1GRUxEX1JDCiBNQUNISU5FX1NUQVJUKFJBVU1GRUxEX1JDLCAiUmF1bWZlbGQgQ29udHJvbGxlciIpCi0JLmJvb3RfcGFyYW1zCT0gUkFVTUZFTERfU0RSQU1fQkFTRSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSByYXVtZmVsZF9jb250cm9sbGVyX2luaXQsCiAJLm1hcF9pbwkJPSBweGEzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTN4eF9pbml0X2lycSwKQEAgLTEwOTcsNyArMTA5OCw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9SQVVNRkVMRF9DT05ORUNUT1IKIE1BQ0hJTkVfU1RBUlQoUkFVTUZFTERfQ09OTkVDVE9SLCAiUmF1bWZlbGQgQ29ubmVjdG9yIikKLQkuYm9vdF9wYXJhbXMJPSBSQVVNRkVMRF9TRFJBTV9CQVNFICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHJhdW1mZWxkX2Nvbm5lY3Rvcl9pbml0LAogCS5tYXBfaW8JCT0gcHhhM3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBweGEzeHhfaW5pdF9pcnEsCkBAIC0xMTA4LDcgKzExMDksNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfUkFVTUZFTERfU1BFQUtFUgogTUFDSElORV9TVEFSVChSQVVNRkVMRF9TUEVBS0VSLCAiUmF1bWZlbGQgU3BlYWtlciIpCi0JLmJvb3RfcGFyYW1zCT0gUkFVTUZFTERfU0RSQU1fQkFTRSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSByYXVtZmVsZF9zcGVha2VyX2luaXQsCiAJLm1hcF9pbwkJPSBweGEzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTN4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NhYXIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NhYXIuYwppbmRleCA3MjAwMWVjLi5mYzJjMWUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zYWFyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc2Fhci5jCkBAIC01OTYsNyArNTk2LDcgQEAKIAogTUFDSElORV9TVEFSVChTQUFSLCAiUFhBOTMwIEhhbmRoZWxkIFBsYXRmb3JtIChha2EgU0FBUikiKQogCS8qIE1haW50YWluZXI6IEVyaWMgTWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhM3h4X21hcF9pbywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEzeHhfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEgICAgICAgPSBweGEzeHhfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NhYXJiLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9zYWFyYi5jCmluZGV4IGViZDYzNzkuLjNlOTk5ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3NhYXJiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc2FhcmIuYwpAQCAtOSwxMiArOSwxMyBAQAogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiAgcHVibGlzaGhlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9weGEtaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkLzg4cG04NjB4Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0yMyw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbWZwLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhOTMwLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9weGE5NXguaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApAQCAtMTAzLDcgKzEwNCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoU0FBUkIsICJQWEE5NTUgSGFuZGhlbGQgUGxhdGZvcm0gKGFrYSBTQUFSQikiKQotCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhM3h4X21hcF9pbywKIAkubnJfaXJxcwk9IFNBQVJCX05SX0lSUVMsCiAJLmluaXRfaXJxICAgICAgID0gcHhhOTV4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHouYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMKaW5kZXggZDhkZWM5MS4uOTUzYTkxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHouYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zdGFyZ2F0ZTIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3N0YXJnYXRlMi5jCmluZGV4IDNmOGQwYWYuLjRjOWE0OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3N0YXJnYXRlMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3N0YXJnYXRlMi5jCkBAIC0xMDA0LDcgKzEwMDQsNyBAQAogCS5oYW5kbGVfaXJxCT0gcHhhMjd4X2hhbmRsZV9pcnEsCiAJLnRpbWVyCQk9ICZweGFfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IGltb3RlMl9pbml0LAotCS5ib290X3BhcmFtcwk9IDB4QTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKQEAgLTEwMTYsNiArMTAxNiw2IEBACiAJLmhhbmRsZV9pcnEgPSBweGEyN3hfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmcHhhX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBzdGFyZ2F0ZTJfaW5pdCwKLQkuYm9vdF9wYXJhbXMgPSAweEEwMDAwMTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogTUFDSElORV9FTkQKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdGF2b3JldmIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rhdm9yZXZiLmMKaW5kZXggMzJmYjU4ZS4uYWQ0N2JiOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdGF2b3JldmIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS90YXZvcmV2Yi5jCkBAIC00ODksNyArNDg5LDcgQEAKIAogTUFDSElORV9TVEFSVChUQVZPUkVWQiwgIlBYQTkzMCBFdmFsdWF0aW9uIEJvYXJkIChha2EgVGF2b3JFVkIpIikKIAkvKiBNYWludGFpbmVyOiBFcmljIE1pYW8gPGVyaWMubWlhb0BtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMgICAgPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHB4YTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxICAgICAgID0gcHhhM3h4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxICAgICAgID0gcHhhM3h4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90YXZvcmV2YjMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rhdm9yZXZiMy5jCmluZGV4IGZkNWE4ZWEuLmZkNTY5MTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3Rhdm9yZXZiMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rhdm9yZXZiMy5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChUQVZPUkVWQjMsICJQWEE5NTAgRXZhbHVhdGlvbiBCb2FyZCAoYWthIFRhdm9yRVZCMykiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhM3h4X21hcF9pbywKIAkubnJfaXJxcwk9IFRBVk9SRVZCM19OUl9JUlFTLAogCS5pbml0X2lycSAgICAgICA9IHB4YTN4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3RyaXplcHM0LmMgYi9hcmNoL2FybS9tYWNoLXB4YS90cml6ZXBzNC5jCmluZGV4IGMwNDE3NTAuLjFhYWVkMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3RyaXplcHM0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdHJpemVwczQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KQEAgLTU1NCw3ICs1NTUsNyBAQAogCiBNQUNISU5FX1NUQVJUKFRSSVpFUFM0LCAiS2VpdGggdW5kIEtvZXAgVHJpemVwcyBJViBtb2R1bGUiKQogCS8qIE1BSU5UQUlORVIoIkrDvHJnZW4gU2NoaW5kZWxlIikgKi8KLQkuYm9vdF9wYXJhbXMJPSBUUklaRVBTNF9TRFJBTV9CQVNFICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHRyaXplcHM0X2luaXQsCiAJLm1hcF9pbwkJPSB0cml6ZXBzNF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLApAQCAtNTY0LDcgKzU2NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVFJJWkVQUzRXTCwgIktlaXRoIHVuZCBLb2VwIFRyaXplcHMgSVYtV0wgbW9kdWxlIikKIAkvKiBNQUlOVEFJTkVSKCJKw7xyZ2VuIFNjaGluZGVsZSIpICovCi0JLmJvb3RfcGFyYW1zCT0gVFJJWkVQUzRfU0RSQU1fQkFTRSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSB0cml6ZXBzNF9pbml0LAogCS5tYXBfaW8JCT0gdHJpemVwczRfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3ZpcGVyLmMgYi9hcmNoL2FybS9tYWNoLXB4YS92aXBlci5jCmluZGV4IGQ0YTNkYzcuLjI0MmRkYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3ZpcGVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYwpAQCAtOTkyLDcgKzk5Miw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVklQRVIsICJBcmNvbS9FdXJvdGVjaCBWSVBFUiBTQkMiKQogCS8qIE1haW50YWluZXI6IE1hcmMgWnluZ2llciA8bWF6QG1pc3RlcmpvbmVzLm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gdmlwZXJfbWFwX2lvLAogCS5pbml0X2lycQk9IHZpcGVyX2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjV4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS92cGFjMjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS92cGFjMjcwLmMKaW5kZXggNWY4NDkwYS4uYTc1MzlhNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdnBhYzI3MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3ZwYWMyNzAuYwpAQCAtNzE2LDcgKzcxNiw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoVlBBQzI3MCwgIlZvaXBhYyBQWEEyNzAiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEyN3hfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHB4YTI3eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEveGNlcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEveGNlcC5jCmluZGV4IDkzN2M0MjguLjcwZTE3MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3hjZXAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS94Y2VwLmMKQEAgLTE3OSw3ICsxNzksNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFhDRVAsICJJc2tyYXRlbCBYQ0VQIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSB4Y2VwX2luaXQsCiAJLm1hcF9pbwkJPSBweGEyNXhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3oyLmMgYi9hcmNoL2FybS9tYWNoLXB4YS96Mi5jCmluZGV4IDZjOTI3NWEuLmVhZDMyYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3oyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvejIuYwpAQCAtNjg2LDcgKzY4Niw4IEBACiAJICovCiAJUFNQUiA9IDB4MDsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXB4YTI3eF9jcHVfc3VzcGVuZChQV1JNT0RFX0RFRVBTTEVFUCwgUExBVF9QSFlTX09GRlNFVCAtIFBBR0VfT0ZGU0VUKTsKKwlweGEyN3hfc2V0X3B3cm1vZGUoUFdSTU9ERV9ERUVQU0xFRVApOworCXB4YTI3eF9jcHVfcG1fZW50ZXIoUE1fU1VTUEVORF9NRU0pOwogfQogI2Vsc2UKICNkZWZpbmUgejJfcG93ZXJfb2ZmICAgTlVMTApAQCAtNzE4LDcgKzcxOSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoWklQSVQyLCAiWmlwaXQgWjIiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEyN3hfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHB4YTI3eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvemV1cy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvemV1cy5jCmluZGV4IDk5YzQ5YmMuLjQ5OGI4M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3pldXMuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS96ZXVzLmMKQEAgLTg2MCwyNSArODYwLDI1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgemV1c19pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7Ci0JCS52aXJ0dWFsID0gWkVVU19DUExEX1ZFUlNJT04sCisJCS52aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpWkVVU19DUExEX1ZFUlNJT04sCiAJCS5wZm4gICAgID0gX19waHlzX3RvX3BmbihaRVVTX0NQTERfVkVSU0lPTl9QSFlTKSwKIAkJLmxlbmd0aCAgPSAweDEwMDAsCiAJCS50eXBlICAgID0gTVRfREVWSUNFLAogCX0sCiAJewotCQkudmlydHVhbCA9IFpFVVNfQ1BMRF9JU0FfSVJRLAorCQkudmlydHVhbCA9ICh1bnNpZ25lZCBsb25nKVpFVVNfQ1BMRF9JU0FfSVJRLAogCQkucGZuICAgICA9IF9fcGh5c190b19wZm4oWkVVU19DUExEX0lTQV9JUlFfUEhZUyksCiAJCS5sZW5ndGggID0gMHgxMDAwLAogCQkudHlwZSAgICA9IE1UX0RFVklDRSwKIAl9LAogCXsKLQkJLnZpcnR1YWwgPSBaRVVTX0NQTERfQ09OVFJPTCwKKwkJLnZpcnR1YWwgPSAodW5zaWduZWQgbG9uZylaRVVTX0NQTERfQ09OVFJPTCwKIAkJLnBmbiAgICAgPSBfX3BoeXNfdG9fcGZuKFpFVVNfQ1BMRF9DT05UUk9MX1BIWVMpLAogCQkubGVuZ3RoICA9IDB4MTAwMCwKIAkJLnR5cGUgICAgPSBNVF9ERVZJQ0UsCiAJfSwKIAl7Ci0JCS52aXJ0dWFsID0gWkVVU19QQzEwNElPLAorCQkudmlydHVhbCA9ICh1bnNpZ25lZCBsb25nKVpFVVNfUEMxMDRJTywKIAkJLnBmbiAgICAgPSBfX3BoeXNfdG9fcGZuKFpFVVNfUEMxMDRJT19QSFlTKSwKIAkJLmxlbmd0aCAgPSAweDAwODAwMDAwLAogCQkudHlwZSAgICA9IE1UX0RFVklDRSwKQEAgLTkwNCw3ICs5MDQsNyBAQAogCiBNQUNISU5FX1NUQVJUKEFSQ09NX1pFVVMsICJBcmNvbS9FdXJvdGVjaCBaRVVTIikKIAkvKiBNYWludGFpbmVyOiBNYXJjIFp5bmdpZXIgPG1hekBtaXN0ZXJqb25lcy5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHpldXNfbWFwX2lvLAogCS5ucl9pcnFzCT0gWkVVU19OUl9JUlFTLAogCS5pbml0X2lycQk9IHpldXNfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvenlsb25pdGUuYwppbmRleCAxNWVjNjZiLi42YzM5YzMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlLmMKQEAgLTM2Niw4ICszNjYsOSBAQAogCiBzdGF0aWMgc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgenlsb25pdGVfbmFuZF9pbmZvID0gewogCS5lbmFibGVfYXJiaXRlcgk9IDEsCi0JLnBhcnRzCQk9IHp5bG9uaXRlX25hbmRfcGFydGl0aW9ucywKLQkubnJfcGFydHMJPSBBUlJBWV9TSVpFKHp5bG9uaXRlX25hbmRfcGFydGl0aW9ucyksCisJLm51bV9jcwkJPSAxLAorCS5wYXJ0c1swXQk9IHp5bG9uaXRlX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHNbMF0JPSBBUlJBWV9TSVpFKHp5bG9uaXRlX25hbmRfcGFydGl0aW9ucyksCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgenlsb25pdGVfaW5pdF9uYW5kKHZvaWQpCkBAIC00MjIsNyArNDIzLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChaWUxPTklURSwgIlBYQTN4eCBQbGF0Zm9ybSBEZXZlbG9wbWVudCBLaXQgKGFrYSBaeWxvbml0ZSkiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEzeHhfbWFwX2lvLAogCS5ucl9pcnFzCT0gWllMT05JVEVfTlJfSVJRUywKIAkuaW5pdF9pcnEJPSBweGEzeHhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5jCmluZGV4IGE4NzUyM2QuLmFjMWFlZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5jCkBAIC02OSw3ICs2OSw3IEBACiAJCSAgICA6CiAJCSAgICA6ICJtZW1vcnkiLCAiY2MiKTsKIAotCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1KSB7CisJCWlmIChwZW5fcmVsZWFzZSA9PSBjcHVfbG9naWNhbF9tYXAoY3B1KSkgewogCQkJLyoKIAkJCSAqIE9LLCBwcm9wZXIgd2FrZXVwLCB3ZSdyZSBkb25lCiAJCQkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDkwYjY4N2MuLjhjYzM3MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTAsMzAgKzEwLDE3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUFDSF9SRUFMVklFV19FQikgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX01BQ0hfUkVBTFZJRVdfUEIxMU1QKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTUFDSF9SRUFMVklFV19QQkE4KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTUFDSF9SRUFMVklFV19QQlgpCi0jaWZuZGVmIERFQlVHX0xMX1VBUlRfT0ZGU0VUCisjaWZkZWYgQ09ORklHX0RFQlVHX1JFQUxWSUVXX1NURF9QT1JUCiAjZGVmaW5lIERFQlVHX0xMX1VBUlRfT0ZGU0VUCTB4MDAwMDkwMDAKLSNlbGlmIERFQlVHX0xMX1VBUlRfT0ZGU0VUICE9IDB4MDAwMDkwMDAKLSN3YXJuaW5nICJERUJVR19MTF9VQVJUX09GRlNFVCBhbHJlYWR5IGRlZmluZWQgdG8gYSBkaWZmZXJlbnQgdmFsdWUiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01BQ0hfUkVBTFZJRVdfUEIxMTc2Ci0jaWZuZGVmIERFQlVHX0xMX1VBUlRfT0ZGU0VUCisjZWxpZiBkZWZpbmVkKENPTkZJR19ERUJVR19SRUFMVklFV19QQjExNzZfUE9SVCkKICNkZWZpbmUgREVCVUdfTExfVUFSVF9PRkZTRVQJMHgwMDEwYzAwMAotI2VsaWYgREVCVUdfTExfVUFSVF9PRkZTRVQgIT0gMHgwMDEwYzAwMAotI3dhcm5pbmcgIkRFQlVHX0xMX1VBUlRfT0ZGU0VUIGFscmVhZHkgZGVmaW5lZCB0byBhIGRpZmZlcmVudCB2YWx1ZSIKLSNlbmRpZgogI2VuZGlmCiAKICNpZm5kZWYgREVCVUdfTExfVUFSVF9PRkZTRVQKICNlcnJvciAiVW5rbm93biBSZWFsVmlldyBwbGF0Zm9ybSIKICNlbmRpZgogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbW92CVxycCwgI0RFQlVHX0xMX1VBUlRfT0ZGU0VUCiAJCW9ycglccnYsIFxycCwgIzB4ZmIwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKIAkJb3JyCVxycCwgXHJwLCAjMHgxMDAwMDAwMAlAIHBoeXNpY2FsIGJhc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA5NGZmMjc2Li40MGE4YzE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xLDYgKzEgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCi0jZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKKy8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKaW5kZXggN2E0ZTNiMS4uMDI2YzY2YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUkVBTFZJRVdfRUIsICJBUk0tUmVhbFZpZXcgRUIiKQogCS8qIE1haW50YWluZXI6IEFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQgKi8KLQkuYm9vdF9wYXJhbXMJPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuZml4dXAJCT0gcmVhbHZpZXdfZml4dXAsCiAJLm1hcF9pbwkJPSByZWFsdmlld19lYl9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSByZWFsdmlld19pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMKaW5kZXggODY1ZDQ0MC4uYzA1NzU0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jCkBAIC0zODYsNyArMzg2LDcgQEAKIAogTUFDSElORV9TVEFSVChSRUFMVklFV19QQjExNzYsICJBUk0tUmVhbFZpZXcgUEIxMTc2IikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmJvb3RfcGFyYW1zCT0gUExBVF9QSFlTX09GRlNFVCArIDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmZpeHVwCQk9IHJlYWx2aWV3X3BiMTE3Nl9maXh1cCwKIAkubWFwX2lvCQk9IHJlYWx2aWV3X3BiMTE3Nl9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSByZWFsdmlld19pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMKaW5kZXggYjQzNjQ0Yi4uNjcxYWQ2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTFtcC5jCkBAIC0zNjAsNyArMzYwLDcgQEAKIAogTUFDSElORV9TVEFSVChSRUFMVklFV19QQjExTVAsICJBUk0tUmVhbFZpZXcgUEIxMU1QQ29yZSIpCiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSByZWFsdmlld19maXh1cCwKIAkubWFwX2lvCQk9IHJlYWx2aWV3X3BiMTFtcF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSByZWFsdmlld19pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYmE4LmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiYTguYwppbmRleCA3NjNlOGYzLi5jYmYyMmRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiYTguYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiYTguYwpAQCAtMzEwLDcgKzMxMCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUkVBTFZJRVdfUEJBOCwgIkFSTS1SZWFsVmlldyBQQi1BOCIpCiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSByZWFsdmlld19maXh1cCwKIAkubWFwX2lvCQk9IHJlYWx2aWV3X3BiYThfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gcmVhbHZpZXdfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJ4LmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BieC5jCmluZGV4IDNlMWViMmUuLjYzYzQxMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJ4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYwpAQCAtMzkzLDcgKzM5Myw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUkVBTFZJRVdfUEJYLCAiQVJNLVJlYWxWaWV3IFBCWCIpCiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSByZWFsdmlld19wYnhfZml4dXAsCiAJLm1hcF9pbwkJPSByZWFsdmlld19wYnhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gcmVhbHZpZXdfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggODVlZmZmZi4uNmQyOGNjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTExLDcgKzExLDcgQEAKICAqCiAqLwogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbW92CVxycCwgIzB4MDAwMTAwMDAKIAkJb3JyCVxycCwgXHJwLCAjMHgwMDAwMGZlMAogCQlvcnIJXHJ2LCBccnAsICMweGUwMDAwMDAwCUAgdmlydHVhbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMgYi9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYwppbmRleCAxZTBlNjBkLi44NTU5NTk4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYworKysgYi9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUklTQ1BDLCAiQWNvcm4tUmlzY1BDIikKIAkvKiBNYWludGFpbmVyOiBSdXNzZWxsIEtpbmcgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlX2xwMAk9IDEsCiAJLnJlc2VydmVfbHAxCT0gMSwKIAkubWFwX2lvCQk9IHJwY19tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzMzY3MC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1zM2MyNDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICogIGZyb20gYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogIENvcHlyaWdodCAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcwotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk2LDE5OTcsMTk5OCBSdXNzZWxsIEtpbmcuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDBDMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKaW5kZXggNzI0NWE1NS4uNTI2MWE3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKQEAgLTYsOSArNiw3IEBACiAJYm9vbAogCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwCiAJc2VsZWN0IENQVV9BUk05MjBUCi0Jc2VsZWN0IFMzQ19HUElPX1BVTExfVVAKIAlzZWxlY3QgUzNDMjQxMF9DTE9DSwotCXNlbGVjdCBTM0MyNDEwX0dQSU8KIAlzZWxlY3QgQ1BVX0xMU0VSSUFMX1MzQzI0MTAKIAlzZWxlY3QgUzNDMjQxMF9QTSBpZiBQTQogCXNlbGVjdCBTM0MyNDEwX0NQVUZSRVEgaWYgQ1BVX0ZSRVFfUzNDMjRYWApAQCAtMjgsMTEgKzI2LDYgQEAKIAloZWxwCiAJICBQb3dlciBNYW5hZ2VtZW50IGNvZGUgY29tbW9uIHRvIFMzQzI0MTAgYW5kIGJldHRlcgogCi1jb25maWcgUzNDMjQxMF9HUElPCi0JYm9vbAotCWhlbHAKLQkgIEdQSU8gY29kZSBmb3IgUzNDMjQxMCBhbmQgc2ltaWxhciBwcm9jZXNzb3JzCi0KIGNvbmZpZyBTSU1URUNfTk9SCiAJYm9vbAogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQppbmRleCA4MTY5NTM1Li43ODJmZDgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw2IEBACiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTBfRE1BKQkrPSBkbWEubwogb2JqLSQoQ09ORklHX0NQVV9TM0MyNDEwX0RNQSkJKz0gZG1hLm8KIG9iai0kKENPTkZJR19TM0MyNDEwX1BNKQkrPSBwbS5vIHNsZWVwLm8KLW9iai0kKENPTkZJR19TM0MyNDEwX0dQSU8pCSs9IGdwaW8ubwogb2JqLSQoQ09ORklHX1MzQzI0MTBfQ1BVRlJFUSkJKz0gY3B1LWZyZXEubwogb2JqLSQoQ09ORklHX1MzQzI0MTBfUExMVEFCTEUpCSs9IHBsbC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kbWEuYwppbmRleCAwZDhlMDQzLi5kYmU0M2RmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jCkBAIC00NywzOCArNDcsMjYgQEAKIAkJLmNoYW5uZWxzWzBdCT0gUzNDMjQxMF9EQ09OX0NIMF9TREkgfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1syXQk9IFMzQzI0MTBfRENPTl9DSDJfU0RJIHwgRE1BX0NIX1ZBTElELAogCQkuY2hhbm5lbHNbM10JPSBTM0MyNDEwX0RDT05fQ0gzX1NESSB8IERNQV9DSF9WQUxJRCwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX0lJUyArIFMzQzI0MTBfSUlTRklGTywKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAogCX0sCiAJW0RNQUNIX1NQSTBdID0gewogCQkubmFtZQkJPSAic3BpMCIsCiAJCS5jaGFubmVsc1sxXQk9IFMzQzI0MTBfRENPTl9DSDFfU1BJIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMF9TUFREQVQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1NQSSArIFMzQzI0MTBfU1BSREFULAogCX0sCiAJW0RNQUNIX1NQSTFdID0gewogCQkubmFtZQkJPSAic3BpMSIsCiAJCS5jaGFubmVsc1szXQk9IFMzQzI0MTBfRENPTl9DSDNfU1BJIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfU1BJICsgMHgyMCArIFMzQzI0MTBfU1BUREFULAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9TUEkgKyAweDIwICsgUzNDMjQxMF9TUFJEQVQsCiAJfSwKIAlbRE1BQ0hfVUFSVDBdID0gewogCQkubmFtZQkJPSAidWFydDAiLAogCQkuY2hhbm5lbHNbMF0JPSBTM0MyNDEwX0RDT05fQ0gwX1VBUlQwIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDAgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQwICsgUzNDMjQxMF9VUlhILAogCX0sCiAJW0RNQUNIX1VBUlQxXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQxIiwKIAkJLmNoYW5uZWxzWzFdCT0gUzNDMjQxMF9EQ09OX0NIMV9VQVJUMSB8IERNQV9DSF9WQUxJRCwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQxICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMSArIFMzQzI0MTBfVVJYSCwKIAl9LAogICAgICAgCVtETUFDSF9VQVJUMl0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MiIsCiAJCS5jaGFubmVsc1szXQk9IFMzQzI0MTBfRENPTl9DSDNfVUFSVDIgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDIgKyBTM0MyNDEwX1VSWEgsCiAJfSwKIAlbRE1BQ0hfVElNRVJdID0gewogCQkubmFtZQkJPSAidGltZXIiLApAQCAtOTAsMTIgKzc4LDEwIEBACiAJCS5uYW1lCQk9ICJpMnMtc2RpIiwKIAkJLmNoYW5uZWxzWzFdCT0gUzNDMjQxMF9EQ09OX0NIMV9JMlNTREkgfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1syXQk9IFMzQzI0MTBfRENPTl9DSDJfSTJTU0RJIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9JSVMgKyBTM0MyNDEwX0lJU0ZJRk8sCiAJfSwKIAlbRE1BQ0hfSTJTX09VVF0gPSB7CiAJCS5uYW1lCQk9ICJpMnMtc2RvIiwKIAkJLmNoYW5uZWxzWzJdCT0gUzNDMjQxMF9EQ09OX0NIMl9JMlNTRE8gfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9JSVMgKyBTM0MyNDEwX0lJU0ZJRk8sCiAJfSwKIAlbRE1BQ0hfVVNCX0VQMV0gPSB7CiAJCS5uYW1lCQk9ICJ1c2ItZXAxIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjY0ZTAxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZ3Bpby5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogUzNDMjQxMCBHUElPIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby1mbnMuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotCi1pbnQgczNjMjQxMF9ncGlvX2lycWZpbHRlcih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgb24sCi0JCQkgICB1bnNpZ25lZCBpbnQgY29uZmlnKQotewotCXZvaWQgX19pb21lbSAqcmVnID0gUzNDMjRYWF9FSU5GTFQwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0KLQlpZiAocGluIDwgUzNDMjQxMF9HUEcoOCkgfHwgcGluID4gUzNDMjQxMF9HUEcoMTUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNvbmZpZyAmPSAweGZmOwotCi0JcGluIC09IFMzQzI0MTBfR1BHKDgpOwotCXJlZyArPSBwaW4gJiB+MzsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCS8qIHVwZGF0ZSBmaWx0ZXIgd2lkdGggYW5kIGNsb2NrIHNvdXJjZSAqLwotCi0JdmFsID0gX19yYXdfcmVhZGwocmVnKTsKLQl2YWwgJj0gfigweGZmIDw8ICgocGluICYgMykgKiA4KSk7Ci0JdmFsIHw9IGNvbmZpZyA8PCAoKHBpbiAmIDMpICogOCk7Ci0JX19yYXdfd3JpdGVsKHZhbCwgcmVnKTsKLQotCS8qIHVwZGF0ZSBmaWx0ZXIgZW5hYmxlICovCi0KLQl2YWwgPSBfX3Jhd19yZWFkbChTM0MyNFhYX0VYVElOVDIpOwotCXZhbCAmPSB+KDEgPDwgKChwaW4gKiA0KSArIDMpKTsKLQl2YWwgfD0gb24gPDwgKChwaW4gKiA0KSArIDMpOwotCV9fcmF3X3dyaXRlbCh2YWwsIFMzQzI0WFhfRVhUSU5UMik7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9faXJxZmlsdGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA1ODgyZGVhLi40MTM1ZGU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xOSw3ICsxOSw3IEBACiAjZGVmaW5lIFMzQzI0MTBfVUFSVDFfT0ZGICgweDQwMDApCiAjZGVmaW5lIFNISUZUXzI0NDBUWEYgKDE0LTkpCiAKLQkubWFjcm8gYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbGRyCVxycCwgPSBTM0MyNFhYX1BBX1VBUlQKIAkJbGRyCVxydiwgPSBTM0MyNFhYX1ZBX1VBUlQKICNpZiBDT05GSUdfREVCVUdfUzNDX1VBUlQgIT0gMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggYjJiMmE1Yi4uYWU4ZTQ4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0xMyw3ICsxMyw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfRE1BX0gKICNkZWZpbmUgX19BU01fQVJDSF9ETUFfSCBfX0ZJTEVfXwogCi0jaW5jbHVkZSA8cGxhdC9kbWEuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KIAogI2RlZmluZSBNQVhfRE1BX1RSQU5TRkVSX1NJWkUgICAweDEwMDAwMCAvKiBEYXRhIFVuaXQgaXMgaGFsZiB3b3JkICAqLwpAQCAtNTEsNiArNTAsMTggQEAKIAlETUFDSF9NQVgsCQkvKiB0aGUgZW5kIGVudHJ5ICovCiB9OwogCitzdGF0aWMgaW5saW5lIGJvb2wgc2Ftc3VuZ19kbWFfaGFzX2NpcmN1bGFyKHZvaWQpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc2Ftc3VuZ19kbWFfaXNfZG1hZGV2KHZvaWQpCit7CisJcmV0dXJuIGZhbHNlOworfQorCisjaW5jbHVkZSA8cGxhdC9kbWEuaD4KKwogI2RlZmluZSBETUFDSF9MT1dfTEVWRUwJKDE8PDI4KQkvKiB1c2UgdGhpcyB0byBzcGVjaWZpeSBoYXJkd2FyZSBjaCBubyAqLwogCiAvKiB3ZSBoYXZlIDQgZG1hIGNoYW5uZWxzICovCkBAIC0xNjMsNyArMTc0LDcgQEAKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQ7CiAKIAkvKiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KLQllbnVtIHMzYzI0MTBfZG1hc3JjCSBzb3VyY2U7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24JIHNvdXJjZTsKIAllbnVtIGRtYV9jaAkJIHJlcV9jaDsKIAl1bnNpZ25lZCBsb25nCQkgZGV2X2FkZHI7CiAJdW5zaWduZWQgbG9uZwkJIGxvYWRfdGltZW91dDsKQEAgLTE5Niw5ICsyMDcsNCBAQAogCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZG1hX2RldmljZV90OwogCi1zdGF0aWMgaW5saW5lIGJvb2wgczNjX2RtYV9oYXNfY2lyY3VsYXIodm9pZCkKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KICNlbmRpZiAvKiBfX0FTTV9BUkNIX0RNQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2ZiLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2ZiLmgKaW5kZXggZWVlMDY1NC4uYTk1N2JjOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZmIuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2ZiLmgKQEAgLTEsNzQgKzEgQEAKLS8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZmIuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgotICoKLSAqIEluc3BpcmVkIGJ5IHB4YWZiLmgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUk1fRkJfSAotI2RlZmluZSBfX0FTTV9BUk1fRkJfSAotCi0jaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgotCi1zdHJ1Y3QgczNjMjQxMGZiX2h3IHsKLQl1bnNpZ25lZCBsb25nCWxjZGNvbjE7Ci0JdW5zaWduZWQgbG9uZwlsY2Rjb24yOwotCXVuc2lnbmVkIGxvbmcJbGNkY29uMzsKLQl1bnNpZ25lZCBsb25nCWxjZGNvbjQ7Ci0JdW5zaWduZWQgbG9uZwlsY2Rjb241OwotfTsKLQotLyogTENEIGRlc2NyaXB0aW9uICovCi1zdHJ1Y3QgczNjMjQxMGZiX2Rpc3BsYXkgewotCS8qIExDRCB0eXBlICovCi0JdW5zaWduZWQgdHlwZTsKLQotCS8qIFNjcmVlbiBzaXplICovCi0JdW5zaWduZWQgc2hvcnQgd2lkdGg7Ci0JdW5zaWduZWQgc2hvcnQgaGVpZ2h0OwotCi0JLyogU2NyZWVuIGluZm8gKi8KLQl1bnNpZ25lZCBzaG9ydCB4cmVzOwotCXVuc2lnbmVkIHNob3J0IHlyZXM7Ci0JdW5zaWduZWQgc2hvcnQgYnBwOwotCi0JdW5zaWduZWQgcGl4Y2xvY2s7CQkvKiBwaXhjbG9jayBpbiBwaWNvc2Vjb25kcyAqLwotCXVuc2lnbmVkIHNob3J0IGxlZnRfbWFyZ2luOyAgLyogdmFsdWUgaW4gcGl4ZWxzIChURlQpIG9yIEhDTEtzIChTVE4pICovCi0JdW5zaWduZWQgc2hvcnQgcmlnaHRfbWFyZ2luOyAvKiB2YWx1ZSBpbiBwaXhlbHMgKFRGVCkgb3IgSENMS3MgKFNUTikgKi8KLQl1bnNpZ25lZCBzaG9ydCBoc3luY19sZW47ICAgIC8qIHZhbHVlIGluIHBpeGVscyAoVEZUKSBvciBIQ0xLcyAoU1ROKSAqLwotCXVuc2lnbmVkIHNob3J0IHVwcGVyX21hcmdpbjsJLyogdmFsdWUgaW4gbGluZXMgKFRGVCkgb3IgMCAoU1ROKSAqLwotCXVuc2lnbmVkIHNob3J0IGxvd2VyX21hcmdpbjsJLyogdmFsdWUgaW4gbGluZXMgKFRGVCkgb3IgMCAoU1ROKSAqLwotCXVuc2lnbmVkIHNob3J0IHZzeW5jX2xlbjsJLyogdmFsdWUgaW4gbGluZXMgKFRGVCkgb3IgMCAoU1ROKSAqLwotCi0JLyogbGNkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCi0JdW5zaWduZWQgbG9uZwlsY2Rjb241OwotfTsKLQotc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gewotCi0Jc3RydWN0IHMzYzI0MTBmYl9kaXNwbGF5ICpkaXNwbGF5czsJLyogYXR0YWNoZWQgZGlwbGF5cyBpbmZvICovCi0JdW5zaWduZWQgbnVtX2Rpc3BsYXlzOwkJCS8qIG51bWJlciBvZiBkZWZpbmVkIGRpc3BsYXlzICovCi0JdW5zaWduZWQgZGVmYXVsdF9kaXNwbGF5OwotCi0JLyogR1BJT3MgKi8KLQotCXVuc2lnbmVkIGxvbmcJZ3BjdXA7Ci0JdW5zaWduZWQgbG9uZwlncGN1cF9tYXNrOwotCXVuc2lnbmVkIGxvbmcJZ3BjY29uOwotCXVuc2lnbmVkIGxvbmcJZ3BjY29uX21hc2s7Ci0JdW5zaWduZWQgbG9uZwlncGR1cDsKLQl1bnNpZ25lZCBsb25nCWdwZHVwX21hc2s7Ci0JdW5zaWduZWQgbG9uZwlncGRjb247Ci0JdW5zaWduZWQgbG9uZwlncGRjb25fbWFzazsKLQotCS8qIGxwYzM2MDAgY29udHJvbCByZWdpc3RlciAqLwotCXVuc2lnbmVkIGxvbmcJbHBjc2VsOwotfTsKLQotZXh0ZXJuIHZvaWQgX19pbml0IHMzYzI0eHhfZmJfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvICopOwotCi0jZW5kaWYgLyogX19BU01fQVJNX0ZCX0ggKi8KKyNpbmNsdWRlIDxwbGF0L2ZiLXMzYzI0MTAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1mbnMuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1mbnMuaAppbmRleCBiYWIxMzkyLi5jNTNhZDM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tZm5zLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLWZucy5oCkBAIC0xLDk4ICsxIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tZm5zLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBTM0MyNDEwIC0gaGFyZHdhcmUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX01BQ0hfR1BJT19GTlNfSAotI2RlZmluZSBfX01BQ0hfR1BJT19GTlNfSCBfX0ZJTEVfXwotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGluIHRoZSB0by1iZS1yZW1vdmVkIGNhdGVnb3J5IGFuZCBpdCBpcyBzdHJvbmdseQotICogZW5jb3VyYWdlZCBub3QgdG8gdXNlIHRoZXNlIGluIG5ldyBjb2RlLiBUaGV5IHdpbGwgYmUgbWFya2VkIGRlcHJlY2F0ZWQKLSAqIHZlcnkgc29vbi4KLSAqCi0gKiBNb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBlaXRoZXIgcmVwbGFjZWQgYnkgdGhlIGdwaW9jZmcgY2FsbHMKLSAqIGZvciB0aGUgczNjIHBsYXRmb3JtIG9yIGJ5IHRoZSBnZW5lcmljIEdQSU9saWIgQVBJLgotICoKLSAqIEFzIG9mIDIuNi4zNS1yYywgdGhlc2Ugd2lsbCBiZSByZW1vdmVkLCB3aXRoIHRoZSBmZXcgZHJpdmVycyB1c2luZyB0aGVtCi0gKiBlaXRoZXIgcmVwbGFjZWQgb3IgZ2l2ZW4gYSB3cmFwcGVyIHVudGlsIHRoZSBjYWxscyBjYW4gYmUgcmVtb3ZlZC4KLSovCi0KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX2dwaW9fY2ZncGluKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBjZmcpCi17Ci0JLyogMToxIG1hcHBpbmcgYmV0d2VlbiBjZmdwaW4gYW5kIHNldGNmZyBjYWxscyBhdCB0aGUgbW9tZW50ICovCi0JczNjX2dwaW9fY2ZncGluKHBpbiwgY2ZnKTsKLX0KLQotLyogZXh0ZXJuYWwgZnVuY3Rpb25zIGZvciBHUElPIHN1cHBvcnQKLSAqCi0gKiBUaGVzZSBhbGxvdyB2YXJpb3VzIGRpZmZlcmVudCBjbGllbnRzIHRvIGFjY2VzcyB0aGUgc2FtZSBHUElPCi0gKiByZWdpc3RlcnMgd2l0aG91dCBjb25mbGljdGluZy4gSWYgeW91ciBkcml2ZXIgb25seSBvd25zIHRoZSBlbnRpcmUKLSAqIEdQSU8gcmVnaXN0ZXIsIHRoZW4gaXQgaXMgc2FmZSB0byBpb3JlbWFwL19fcmF3X3tyZWFkfHdyaXRlfSB0byBpdC4KLSovCi0KLWV4dGVybiB1bnNpZ25lZCBpbnQgczNjMjQxMF9ncGlvX2dldGNmZyh1bnNpZ25lZCBpbnQgcGluKTsKLQotLyogczNjMjQxMF9ncGlvX2dldGlycQotICoKLSAqIHR1cm4gdGhlIGdpdmVuIHBpbiBudW1iZXIgaW50byB0aGUgY29ycmVzcG9uZGluZyBJUlEgbnVtYmVyCi0gKgotICogcmV0dXJuczoKLSAqCTwgMCA9IG5vIGludGVycnVwdCBmb3IgdGhpcyBwaW4KLSAqCT49MCA9IGludGVycnVwdCBudW1iZXIgZm9yIHRoZSBwaW4KLSovCi0KLWV4dGVybiBpbnQgczNjMjQxMF9ncGlvX2dldGlycSh1bnNpZ25lZCBpbnQgcGluKTsKLQotLyogczNjMjQxMF9ncGlvX2lycWZpbHRlcgotICoKLSAqIHNldCB0aGUgaXJxIGZpbHRlcmluZyBvbiB0aGUgZ2l2ZW4gcGluCi0gKgotICogb24gPSAwID0+IGRpc2FibGUgZmlsdGVyaW5nCi0gKiAgICAgIDEgPT4gZW5hYmxlIGZpbHRlcmluZwotICoKLSAqIGNvbmZpZyA9IFMzQzI0MTBfRUlOVEZMVF9QQ0xLIG9yIFMzQzI0MTBfRUlOVEZMVF9FWFRDTEsgb3JyZWQgd2l0aAotICogICAgICAgICAgd2lkdGggb2YgZmlsdGVyICgwIHRocm91Z2ggNjMpCi0gKgotICoKLSovCi0KLWV4dGVybiBpbnQgczNjMjQxMF9ncGlvX2lycWZpbHRlcih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgb24sCi0JCQkJICB1bnNpZ25lZCBpbnQgY29uZmlnKTsKLQotLyogczNjMjQxMF9ncGlvX3B1bGx1cAotICoKLSAqIFRoaXMgY2FsbCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBzM2NfZ3Bpb19zZXRwdWxsKCkuCi0gKgotICogQXMgYSBub3RlLCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gZGlzdGluY3Rpb24gYmV0d2VlbiBwdWxsLXVwIGFuZCBwdWxsLWRvd24KLSAqIGluIHRoZSBzM2MyNHh4IHNlcmllcyBkZXZpY2VzIHdpdGggb25seSBhbiBvbi9vZmYgY29uZmlndXJhdGlvbi4KLSAqLwotCi0vKiBzM2MyNDEwX2dwaW9fcHVsbHVwCi0gKgotICogY29uZmlndXJlIHRoZSBwdWxsLXVwIGNvbnRyb2wgb24gdGhlIGdpdmVuIHBpbgotICoKLSAqIHRvID0gMSA9PiBkaXNhYmxlIHRoZSBwdWxsLXVwCi0gKiAgICAgIDAgPT4gZW5hYmxlIHRoZSBwdWxsLXVwCi0gKgotICogZWc7Ci0gKgotICogICBzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BCKDApLCAwKTsKLSAqICAgczNjMjQxMF9ncGlvX3B1bGx1cChTM0MyNDEwX0dQRSg4KSwgMCk7Ci0qLwotCi1leHRlcm4gdm9pZCBzM2MyNDEwX2dwaW9fcHVsbHVwKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCB0byk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0MTBfZ3Bpb19zZXRwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBzM2MyNDEwX2dwaW9fZ2V0cGluKHVuc2lnbmVkIGludCBwaW4pOwotCi0jZW5kaWYgLyogX19NQUNIX0dQSU9fRk5TX0ggKi8KKyNpbmNsdWRlIDxwbGF0L2dwaW8tZm5zLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tbnJzLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tbnJzLmgKaW5kZXggNGY3YmYzMi4uMDE5ZWE4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLW5ycy5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1ucnMuaApAQCAtNTMsNyArNTMsNyBAQAogI2RlZmluZSBTM0MyNDEwX0dQSU9fTV9OUgkoMzIpCS8qIHRlY2huaWNhbGx5IDIuICovCiAKICNpZiBDT05GSUdfUzNDX0dQSU9fU1BBQ0UgIT0gMAotI2Vycm9yIENPTkZJR19TM0NfR1BJT19TUEFDRSBjYW5ub3QgYmUgemVybyBhdCB0aGUgbW9tZW50CisjZXJyb3IgQ09ORklHX1MzQ19HUElPX1NQQUNFIGNhbm5vdCBiZSBub256ZXJvIGF0IHRoZSBtb21lbnQKICNlbmRpZgogCiAjZGVmaW5lIFMzQzI0MTBfR1BJT19ORVhUKF9fZ3BpbykgXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLXRyYWNrLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tdHJhY2suaAppbmRleCBkNjc4MTlkLi5jNDEwYTA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tdHJhY2suaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tdHJhY2suaApAQCAtMTcsMTEgKzE3LDExIEBACiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCi1leHRlcm4gc3RydWN0IHMzY19ncGlvX2NoaXAgczNjMjR4eF9ncGlvc1tdOworZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzM2MyNHh4X2dwaW9zW107CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHMzY19ncGlvX2NoaXAgKnMzY19ncGlvbGliX2dldGNoaXAodW5zaWduZWQgaW50IHBpbikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcCh1bnNpZ25lZCBpbnQgcGluKQogewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwOworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcDsKIAogCWlmIChwaW4gPiBTM0NfR1BJT19FTkQpCiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBmN2Y2YjA3Li42ZmFjNzBmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTEsMTEgKzExLDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KIAotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEJX19ncGlvX3RvX2lycQotCiAvKiBzb21lIGJvYXJkcyByZXF1aXJlIGV4dHJhIGdwaW8gY2FwYWNpdHkgdG8gc3VwcG9ydCBleHRlcm5hbAogICogZGV2aWNlcyB0aGF0IG5lZWQgR1BJTy4KICAqLwpAQCAtMjgsNyArMjMsNiBAQAogI2RlZmluZSBBUkNIX05SX0dQSU9TCSgyNTYgKyBDT05GSUdfUzNDMjRYWF9HUElPX0VYVFJBKQogI2VuZGlmCiAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLW5ycy5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby1mbnMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9oMTk0MC1sYXRjaC5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9oMTk0MC1sYXRjaC5oCmluZGV4IDk3ZTQyYmYuLmZjODk3ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaDE5NDAtbGF0Y2guaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2gxOTQwLWxhdGNoLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNpZm5kZWYgX19BU01fQVJDSF9IMTk0MF9MQVRDSF9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSDE5NDBfTEFUQ0hfSAogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2RlZmluZSBIMTk0MF9MQVRDSF9HUElPKHgpCQkoUzNDX0dQSU9fRU5EICsgKHgpKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IGU1YTY4ZWEuLmU1M2IyMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0xOTEsOSArMTkxLDkgQEAKICNkZWZpbmUgSVJRX0xDRF9TWVNURU0JCUlSUV9TM0MyNDQzX0xDRDIKIAogI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MAotI2RlZmluZSBJUlFfUzNDMjQ0eF9BQzk3IElSUV9TM0MyNDQwX0FDOTcKKyNkZWZpbmUgSVJRX1MzQzI0NFhfQUM5NyBJUlFfUzNDMjQ0MF9BQzk3CiAjZWxzZQotI2RlZmluZSBJUlFfUzNDMjQ0eF9BQzk3IElSUV9TM0MyNDQzX0FDOTcKKyNkZWZpbmUgSVJRX1MzQzI0NFhfQUM5NyBJUlFfUzNDMjQ0M19BQzk3CiAjZW5kaWYKIAogLyogT3VyIEZJUXMgYXJlIHJvdXRhYmxlIGZyb20gSVJRX0VJTlQwIHRvIElSUV9BRENQQVJFTlQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvbWFwLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21hcC5oCmluZGV4IDQyNTU1MmQuLjc4YWU4MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvbWFwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tYXAuaApAQCAtMTQsOSArMTQsNTMgQEAKICNkZWZpbmUgX19BU01fQVJDSF9NQVBfSAogCiAjaW5jbHVkZSA8cGxhdC9tYXAtYmFzZS5oPgotI2luY2x1ZGUgPHBsYXQvbWFwLmg+CiAKLSNkZWZpbmUgUzNDMjQxMF9BRERSKHgpCQlTM0NfQUREUih4KQorLyoKKyAqIFMzQzI0MTAgVUFSVCBvZmZzZXQgaXMgMHg0MDAwIGJ1dCB0aGUgb3RoZXIgU29DcyBhcmUgMHg0MDAuCisgKiBTbyBuZWVkIHRvIGRlZmluZSBpdCwgYW5kIGhlcmUgaXMgdG8gYXZvaWQgcmVkZWZpbml0aW9uIHdhcm5pbmcuCisgKi8KKyNkZWZpbmUgUzNDX1VBUlRfT0ZGU0VUCQkoMHg0MDAwKQorCisjaW5jbHVkZSA8cGxhdC9tYXAtczNjLmg+CisKKy8qCisgKiBpbnRlcnJ1cHQgY29udHJvbGxlciBpcyB0aGUgZmlyc3QgdGhpbmcgd2UgcHV0IGluLCB0byBtYWtlCisgKiB0aGUgYXNzZW1ibHkgY29kZSBmb3IgdGhlIGlycSBkZXRlY3Rpb24gZWFzaWVyCisgKi8KKyNkZWZpbmUgUzNDMjQxMF9QQV9JUlEJCSgweDRBMDAwMDAwKQorI2RlZmluZSBTM0MyNFhYX1NaX0lSUQkJU1pfMU0KKworLyogbWVtb3J5IGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIFMzQzI0MTBfUEFfTUVNQ1RSTAkoMHg0ODAwMDAwMCkKKyNkZWZpbmUgUzNDMjRYWF9TWl9NRU1DVFJMCVNaXzFNCisKKy8qIFVBUlRzICovCisjZGVmaW5lIFMzQ19WQV9VQVJUeCh1YXJ0KQkoUzNDX1ZBX1VBUlQgKyAoKHVhcnQgKiBTM0NfVUFSVF9PRkZTRVQpKSkKKworLyogVGltZXJzICovCisjZGVmaW5lIFMzQzI0MTBfUEFfVElNRVIJKDB4NTEwMDAwMDApCisjZGVmaW5lIFMzQzI0WFhfU1pfVElNRVIJU1pfMU0KKworLyogQ2xvY2sgYW5kIFBvd2VyIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgUzNDMjRYWF9TWl9DTEtQV1IJU1pfMU0KKworLyogVVNCIERldmljZSBwb3J0ICovCisjZGVmaW5lIFMzQzI0MTBfUEFfVVNCREVWCSgweDUyMDAwMDAwKQorI2RlZmluZSBTM0MyNFhYX1NaX1VTQkRFVglTWl8xTQorCisvKiBXYXRjaGRvZyAqLworI2RlZmluZSBTM0MyNDEwX1BBX1dBVENIRE9HCSgweDUzMDAwMDAwKQorI2RlZmluZSBTM0MyNFhYX1NaX1dBVENIRE9HCVNaXzFNCisKKy8qIFN0YW5kYXJkIHNpemUgZGVmaW5pdGlvbnMgZm9yIHBlcmlwaGVyYWwgYmxvY2tzLiAqLworCisjZGVmaW5lIFMzQzI0WFhfU1pfVUFSVAkJU1pfMU0KKyNkZWZpbmUgUzNDMjRYWF9TWl9JSVMJCVNaXzFNCisjZGVmaW5lIFMzQzI0WFhfU1pfQURDCQlTWl8xTQorI2RlZmluZSBTM0MyNFhYX1NaX1NQSQkJU1pfMU0KKyNkZWZpbmUgUzNDMjRYWF9TWl9TREkJCVNaXzFNCisjZGVmaW5lIFMzQzI0WFhfU1pfTkFORAkJU1pfMU0KKyNkZWZpbmUgUzNDMjRYWF9TWl9HUElPCQlTWl8xTQogCiAvKiBVU0IgaG9zdCBjb250cm9sbGVyICovCiAjZGVmaW5lIFMzQzI0MTBfUEFfVVNCSE9TVCAoMHg0OTAwMDAwMCkKQEAgLTc1LDEwICsxMTksOCBAQAogCiAvKiBTM0MyNDEyIG1lbW9yeSBhbmQgSU8gY29udHJvbHMgKi8KICNkZWZpbmUgUzNDMjQxMl9QQV9TU01DCSgweDRGMDAwMDAwKQotI2RlZmluZSBTM0MyNDEyX1ZBX1NTTUMJUzNDX0FERFJfQ1BVKDB4MDAwMDAwMDApCiAKICNkZWZpbmUgUzNDMjQxMl9QQV9FQkkJKDB4NDg4MDAwMDApCi0jZGVmaW5lIFMzQzI0MTJfVkFfRUJJCVMzQ19BRERSX0NQVSgweDAwMDEwMDAwKQogCiAvKiBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgYWxsIHRoZSBjaGlwLXNlbGVjdCBhcmVhcyAqLwogCkBAIC0xMDAsMTUgKzE0MiwxNCBAQAogI2RlZmluZSBTM0MyNFhYX1BBX0RNQSAgICAgIFMzQzI0MTBfUEFfRE1BCiAjZGVmaW5lIFMzQzI0WFhfUEFfQ0xLUFdSICAgUzNDMjQxMF9QQV9DTEtQV1IKICNkZWZpbmUgUzNDMjRYWF9QQV9MQ0QgICAgICBTM0MyNDEwX1BBX0xDRAotI2RlZmluZSBTM0MyNFhYX1BBX1VBUlQgICAgIFMzQzI0MTBfUEFfVUFSVAogI2RlZmluZSBTM0MyNFhYX1BBX1RJTUVSICAgIFMzQzI0MTBfUEFfVElNRVIKICNkZWZpbmUgUzNDMjRYWF9QQV9VU0JERVYgICBTM0MyNDEwX1BBX1VTQkRFVgogI2RlZmluZSBTM0MyNFhYX1BBX1dBVENIRE9HIFMzQzI0MTBfUEFfV0FUQ0hET0cKICNkZWZpbmUgUzNDMjRYWF9QQV9JSVMgICAgICBTM0MyNDEwX1BBX0lJUwotI2RlZmluZSBTM0MyNFhYX1BBX0dQSU8gICAgIFMzQzI0MTBfUEFfR1BJTwogI2RlZmluZSBTM0MyNFhYX1BBX1JUQyAgICAgIFMzQzI0MTBfUEFfUlRDCiAjZGVmaW5lIFMzQzI0WFhfUEFfQURDICAgICAgUzNDMjQxMF9QQV9BREMKICNkZWZpbmUgUzNDMjRYWF9QQV9TUEkgICAgICBTM0MyNDEwX1BBX1NQSQorI2RlZmluZSBTM0MyNFhYX1BBX1NQSTEJCShTM0MyNDEwX1BBX1NQSSArIFMzQzI0MTBfU1BJMSkKICNkZWZpbmUgUzNDMjRYWF9QQV9TREkgICAgICBTM0MyNDEwX1BBX1NESQogI2RlZmluZSBTM0MyNFhYX1BBX05BTkQJICAgIFMzQzI0MTBfUEFfTkFORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyYjk3Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICogIGZyb20gYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5NiwxOTk3LDE5OTggUnVzc2VsbCBLaW5nLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgzMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCmluZGV4IDQ1ZWVhNTIuLjJlZWY3ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCkBAIC02NCw0ICs2NCw0IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fcmVzdG9yZWRfZ3Bpb3Modm9pZCkgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX3NhdmVkX2dwaW9zKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHNhbXN1bmdfcG1fc2F2ZWRfZ3Bpb3Modm9pZCkgeyB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtczNjMjQ0My1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9yZWdzLXMzYzI0NDMtY2xvY2suaAppbmRleCA1ZTA2YzcyLi5jM2ZlZmYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtczNjMjQ0My1jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1zM2MyNDQzLWNsb2NrLmgKQEAgLTY1LDYgKzY1LDcgQEAKICNkZWZpbmUgUzNDMjQ0M19DTEtESVYwX1BSRURJVl9NQVNLCSgzPDw0KQogI2RlZmluZSBTM0MyNDQzX0NMS0RJVjBfUFJFRElWX1NISUZUCSg0KQogCisjZGVmaW5lIFMzQzI0MTZfQ0xLRElWMF9BUk1ESVZfTUFTSwkoNyA8PCA5KQogI2RlZmluZSBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX01BU0sJKDE1PDw5KQogI2RlZmluZSBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX1NISUZUCSg5KQogI2RlZmluZSBTM0MyNDQzX0NMS0RJVjBfQVJNRElWXzEJKDA8PDkpCkBAIC0xMDIsNiArMTAzLDcgQEAKICNkZWZpbmUgUzNDMjQ0M19QQ0xLQ09OX1VBUlQzCQkoMTw8MykKICNkZWZpbmUgUzNDMjQ0M19QQ0xLQ09OX0lJQwkJKDE8PDQpCiAjZGVmaW5lIFMzQzI0NDNfUENMS0NPTl9TREkJCSgxPDw1KQorI2RlZmluZSBTM0MyNDQzX1BDTEtDT05fSFNTUEkJCSgxPDw2KQogI2RlZmluZSBTM0MyNDQzX1BDTEtDT05fQURDCQkoMTw8NykKICNkZWZpbmUgUzNDMjQ0M19QQ0xLQ09OX0FDOTcJCSgxPDw4KQogI2RlZmluZSBTM0MyNDQzX1BDTEtDT05fSUlTCQkoMTw8OSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWFtbG01OTAwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbWxtNTkwMC5jCmluZGV4IGRhYmMxNDEuLjc5ODM4OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWFtbG01OTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW1sbTU5MDAuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQU1MX001OTAwLCAiQU1MX001OTAwIikKLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBhbWxtNTkwMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gYW1sbTU5MDBfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYwppbmRleCAxZTJkNTM2Li5hMjBhZTFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCkBAIC02NTcsNyArNjU3LDcgQEAKIAogTUFDSElORV9TVEFSVChCQVNULCAiU2ltdGVjLUJBU1QiKQogCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBiYXN0X21hcF9pbywKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBiYXN0X2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwppbmRleCAyYTJmYTA2Li4wNWE3ZDE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC02OTYsOSArNjk3LDkgQEAKIAkJCSAgICAgIFMzQzI0MTBfTUlTQ0NSX1VTQlNVU1BORDAgfAogCQkJICAgICAgUzNDMjQxMF9NSVNDQ1JfVVNCU1VTUE5EMSwgMHgwKTsKIAotCXRtcCA9ICAgKDB4NzggPDwgUzNDMjRYWF9QTExDT05fTURJVlNISUZUKQotCSAgICAgIHwgKDB4MDIgPDwgUzNDMjRYWF9QTExDT05fUERJVlNISUZUKQotCSAgICAgIHwgKDB4MDMgPDwgUzNDMjRYWF9QTExDT05fU0RJVlNISUZUKTsKKwl0bXAgPSAgICgweDc4IDw8IFMzQzI0WFhfUExMX01ESVZfU0hJRlQpCisJICAgICAgfCAoMHgwMiA8PCBTM0MyNFhYX1BMTF9QRElWX1NISUZUKQorCSAgICAgIHwgKDB4MDMgPDwgUzNDMjRYWF9QTExfU0RJVl9TSElGVCk7CiAJd3JpdGVsKHRtcCwgUzNDMjQxMF9VUExMQ09OKTsKIAogCWdwaW9fcmVxdWVzdChTM0MyNDEwX0dQQygwKSwgIkxDRCBwb3dlciIpOwpAQCAtNzQ0LDcgKzc0NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSDE5NDAsICJJUEFRLUgxOTQwIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaDE5NDBfbWFwX2lvLAogCS5yZXNlcnZlCT0gaDE5NDBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSBoMTk0MF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKaW5kZXggMDc5ZGNhYS4uMWRjM2UzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKQEAgLTU4Niw3ICs1ODYsNyBAQAogCS8qIE1haW50YWluZXI6IENocmlzdGVyIFdlaW5pZ2VsIDxjaHJpc3RlckB3ZWluaWdlbC5zZT4sCiAJCQkJQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPgogCSovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gbjMwX2luaXQsCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKQEAgLTU5Niw3ICs1OTYsNyBAQAogTUFDSElORV9TVEFSVChOMzUsICJBY2VyLU4zNSIpCiAJLyogTWFpbnRhaW5lcjogQ2hyaXN0ZXIgV2VpbmlnZWwgPGNocmlzdGVyQHdlaW5pZ2VsLnNlPgogCSovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gbjMwX2luaXQsCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYwppbmRleCAwYWExNmNkLi5mMDNmM2ZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogTUFDSElORV9TVEFSVChPVE9NLCAiTmV4IFZpc2lvbiAtIE90b20gMS4xIikKIAkvKiBNYWludGFpbmVyOiBHdWlsbGF1bWUgR09VUkFUIDxndWlsbGF1bWUuZ291cmF0QG5leHZpc2lvbi50dj4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBvdG9tMTFfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBvdG9tMTFfaW5pdCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcXQyNDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYwppbmRleCBmNDRmNzc1Li40NTE4NTIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYwpAQCAtNDksNiArNDksNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2xlZHMtZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1sY2QuaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgpAQCAtMzQ0LDcgKzM0NSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUVQyNDEwLCAiUVQyNDEwIikKLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBxdDI0MTBfbWFwX2lvLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IHF0MjQxMF9tYWNoaW5lX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYwppbmRleCBlMTdmMDMzLi45OWM5ZGZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogTUFDSElORV9TVEFSVChTTURLMjQxMCwgIlNNREsyNDEwIikgLyogQFRPRE86IHJlcXVlc3QgYSBuZXcgaWRlbnRpZmllciBhbmQgc3dpdGNoCiAJCQkJICAgICogdG8gU01ESzI0MTAgKi8KIAkvKiBNYWludGFpbmVyOiBKb25hcyBEaWV0c2NoZSAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHNtZGsyNDEwX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBzbWRrMjQxMF9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdGN0X2hhbW1lci5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdGN0X2hhbW1lci5jCmluZGV4IDQzYzJiODMuLmUwZDBiNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXRjdF9oYW1tZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC10Y3RfaGFtbWVyLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFRDVF9IQU1NRVIsICJUQ1RfSEFNTUVSIikKLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSB0Y3RfaGFtbWVyX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSB0Y3RfaGFtbWVyX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCmluZGV4IDZjY2NlNWEuLmRmNDdlOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jCkBAIC00MDAsNyArNDAwLDcgQEAKIAogTUFDSElORV9TVEFSVChWUjEwMDAsICJUaG9yY29tLVZSMTAwMCIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHZyMTAwMF9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IHZyMTAwMF9pbml0LAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYwppbmRleCAzNDNhNTQwLi4zZDdlYmM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmMKQEAgLTcyLDggKzcyLDggQEAKIAogdm9pZCBfX2luaXQgczNjMjQxMF9tYXBfaW8odm9pZCkKIHsKLQlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5zZXRfcHVsbCA9IHMzY19ncGlvX3NldHB1bGxfMXVwOwotCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LmdldF9wdWxsID0gczNjX2dwaW9fZ2V0cHVsbF8xdXA7CisJczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuc2V0X3B1bGwgPSBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xdXA7CisJczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuZ2V0X3B1bGwgPSBzM2MyNHh4X2dwaW9fZ2V0cHVsbF8xdXA7CiAKIAlpb3RhYmxlX2luaXQoczNjMjQxMF9pb2Rlc2MsIEFSUkFZX1NJWkUoczNjMjQxMF9pb2Rlc2MpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKaW5kZXggYzJjZjRlNS4uYjhiOTAyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKQEAgLTksNyArOSw2IEBACiAJc2VsZWN0IENQVV9MTFNFUklBTF9TM0MyNDQwCiAJc2VsZWN0IFMzQzI0MTJfUE0gaWYgUE0KIAlzZWxlY3QgUzNDMjQxMl9ETUEgaWYgUzNDMjQxMF9ETUEKLQlzZWxlY3QgUzNDMjQxMF9HUElPCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIFMzQzI0MTIgYW5kIFMzQzI0MTMgU29DcyBmcm9tIHRoZSBTM0MyNFhYIGxpbmUKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL01ha2VmaWxlCmluZGV4IDZjNDhhOTEuLjdlNGQ5NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvTWFrZWZpbGUKQEAgLTEyLDcgKzEyLDYgQEAKIG9iai0kKENPTkZJR19DUFVfUzNDMjQxMikJKz0gczNjMjQxMi5vCiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTIpCSs9IGlycS5vCiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTIpCSs9IGNsb2NrLm8KLW9iai0kKENPTkZJR19DUFVfUzNDMjQxMikJKz0gZ3Bpby5vCiBvYmotJChDT05GSUdfUzNDMjQxMl9ETUEpCSs9IGRtYS5vCiBvYmotJChDT05GSUdfUzNDMjQxMl9QTSkJKz0gcG0ubwogb2JqLSQoQ09ORklHX1MzQzI0MTJfUE1fU0xFRVApCSs9IHNsZWVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9kbWEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9kbWEuYwppbmRleCA3YWJlY2ZjLi5kMmE3ZDVlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9kbWEuYwpAQCAtNTAsNjQgKzUwLDQ2IEBACiAJCS5uYW1lCQk9ICJzZGkiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfU0RJKSwKIAkJLmNoYW5uZWxzX3J4CT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1NESSksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9TREkgKyBTM0MyNDEwX1NESURBVEEsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1NESSArIFMzQzI0MTBfU0RJREFUQSwKIAl9LAogCVtETUFDSF9TUEkwXSA9IHsKIAkJLm5hbWUJCT0gInNwaTAiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfU1BJMFRYKSwKIAkJLmNoYW5uZWxzX3J4CT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1NQSTBSWCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9TUEkgKyBTM0MyNDEwX1NQVERBVCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMF9TUFJEQVQsCiAJfSwKIAlbRE1BQ0hfU1BJMV0gPSB7CiAJCS5uYW1lCQk9ICJzcGkxIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1NQSTFUWCksCiAJCS5jaGFubmVsc19yeAk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9TUEkxUlgpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMl9TUEkxICsgUzNDMjQxMF9TUFREQVQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1NQSSArIFMzQzI0MTJfU1BJMSAgKyBTM0MyNDEwX1NQUkRBVCwKIAl9LAogCVtETUFDSF9VQVJUMF0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MCIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMF8wKSwKIAkJLmNoYW5uZWxzX3J4CT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQwXzApLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDAgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQwICsgUzNDMjQxMF9VUlhILAogCX0sCiAJW0RNQUNIX1VBUlQxXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQxIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQxXzApLAogCQkuY2hhbm5lbHNfcngJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDFfMCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMSArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDEgKyBTM0MyNDEwX1VSWEgsCiAJfSwKICAgICAgIAlbRE1BQ0hfVUFSVDJdID0gewogCQkubmFtZQkJPSAidWFydDIiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDJfMCksCiAJCS5jaGFubmVsc19yeAk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMl8wKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQyICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVJYSCwKIAl9LAogCVtETUFDSF9VQVJUMF9TUkMyXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQwIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQwXzEpLAogCQkuY2hhbm5lbHNfcngJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDBfMSksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMCArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDAgKyBTM0MyNDEwX1VSWEgsCiAJfSwKIAlbRE1BQ0hfVUFSVDFfU1JDMl0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MSIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMV8xKSwKIAkJLmNoYW5uZWxzX3J4CT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQxXzEpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDEgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQxICsgUzNDMjQxMF9VUlhILAogCX0sCiAgICAgICAJW0RNQUNIX1VBUlQyX1NSQzJdID0gewogCQkubmFtZQkJPSAidWFydDIiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDJfMSksCiAJCS5jaGFubmVsc19yeAk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMl8xKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQyICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVJYSCwKIAl9LAogCVtETUFDSF9USU1FUl0gPSB7CiAJCS5uYW1lCQk9ICJ0aW1lciIsCkBAIC0xNDgsMTEgKzEzMCwxMSBAQAogCiBzdGF0aWMgdm9pZCBzM2MyNDEyX2RtYV9kaXJlY3Rpb24oc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4sCiAJCQkJICBzdHJ1Y3QgczNjMjR4eF9kbWFfbWFwICptYXAsCi0JCQkJICBlbnVtIHMzYzI0MTBfZG1hc3JjIGRpcikKKwkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKIAl1bnNpZ25lZCBsb25nIGNoc2VsOwogCi0JaWYgKGRpciA9PSBTM0MyNDEwX0RNQVNSQ19IVykKKwlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKIAkJY2hzZWwgPSBtYXAtPmNoYW5uZWxzX3J4WzBdOwogCWVsc2UKIAkJY2hzZWwgPSBtYXAtPmNoYW5uZWxzWzBdOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9ncGlvLmMKaW5kZXggMzQwNGE4Ny4uNDUyNmY2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvZ3Bpby5jCkBAIC0yOCw3ICsyOCw3IEBACiAKIGludCBzM2MyNDEyX2dwaW9fc2V0X3NsZWVwY2ZnKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IHMzY19ncGlvbGliX2dldGNoaXAocGluKTsKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAgPSBzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcChwaW4pOwogCXVuc2lnbmVkIGxvbmcgb2ZmcyA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgc2xwY29uOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jCmluZGV4IDVlZWI0NzUuLjI4NmVmMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLWppdmUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1qaXZlLmMKQEAgLTY1NSw3ICs2NTUsNyBAQAogCiBNQUNISU5FX1NUQVJUKEpJVkUsICJKSVZFIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKIAkubWFwX2lvCQk9IGppdmVfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtc21kazI0MTMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXNtZGsyNDEzLmMKaW5kZXggMzM5MTcxMy4uZjFlZWMxYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtc21kazI0MTMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1zbWRrMjQxMy5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogTUFDSElORV9TVEFSVChTM0MyNDEzLCAiUzNDMjQxMyIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAogCS5maXh1cAkJPSBzbWRrMjQxM19maXh1cCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApAQCAtMTM4LDcgKzEzOCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoU01ESzI0MTIsICJTTURLMjQxMiIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAogCS5maXh1cAkJPSBzbWRrMjQxM19maXh1cCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApAQCAtMTQ5LDcgKzE0OSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoU01ESzI0MTMsICJTTURLMjQxMyIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAogCS5maXh1cAkJPSBzbWRrMjQxM19maXh1cCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtdnN0bXMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXZzdG1zLmMKaW5kZXggYjZlZDQ1Ny4uMWJiYjFlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtdnN0bXMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC12c3Rtcy5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChWU1RNUywgIlZTVE1TIikKLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAKIAkuZml4dXAJCT0gdnN0bXNfZml4dXAsCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxNi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L0tjb25maWcKaW5kZXggNjliNDhhNy4uODRjN2IwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L0tjb25maWcKQEAgLTEzLDcgKzEzLDYgQEAKIAlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgUzNDMjQxNl9ETUEgaWYgUzNDMjQxMF9ETUEKIAlzZWxlY3QgQ1BVX0xMU0VSSUFMX1MzQzI0NDAKLQlzZWxlY3QgUzNDX0dQSU9fUFVMTF9VUERPV04KIAlzZWxlY3QgU0FNU1VOR19DTEtTUkMKIAlzZWxlY3QgUzNDMjQ0M19DTE9DSwogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxNi9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L2Nsb2NrLmMKaW5kZXggMjFhNWU4MS4uYWZiYmU4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L2Nsb2NrLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiAjaW5jbHVkZSA8cGxhdC9jcHUtZnJlcS5oPgotI2luY2x1ZGUgPHBsYXQvcGxsNjU1M3guaD4KICNpbmNsdWRlIDxwbGF0L3BsbC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0yOSw2ICsyOCwxNCBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1zM2MyNDQzLWNsb2NrLmg+CiAKKy8qIGFybWRpdgorICoKKyAqIHRoaXMgY2xvY2sgaXMgc291cmNlZCBmcm9tIG1zeXNjbGsgYW5kIGNhbiBoYXZlIGEgbnVtYmVyIG9mCisgKiBkaXZpZGVyIHZhbHVlcyBhcHBsaWVkIHRvIGl0IHRvIHRoZW4gYmUgZmVkIGludG8gYXJtY2xrLgorICogVGhlIHJlYWwgY2xvY2sgZGVmaW5pdGlvbiBpcyBkb25lIGluIHMzYzI0NDMtY2xvY2suYywKKyAqIG9ubHkgdGhlIGFybWRpdiBkaXZpc29yIHRhYmxlIG11c3QgYmUgZGVmaW5lZCBoZXJlLgorKi8KKwogc3RhdGljIHVuc2lnbmVkIGludCBhcm1kaXZbOF0gPSB7CiAJWzBdID0gMSwKIAlbMV0gPSAyLApAQCAtMzgsNiArNDUsMzIgQEAKIAlbN10gPSA4LAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGhzc3BpX2VwbGxkaXYgPSB7CisJLmNsayA9IHsKKwkJLm5hbWUJPSAiaHNzcGktZXBsbGRpdiIsCisJCS5wYXJlbnQJPSAmY2xrX2VzeXNjbGsuY2xrLAorCQkuY3RybGJpdCA9ICgxIDw8IDE0KSwKKwkJLmVuYWJsZSA9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9zLAorCX0sCisJLnJlZ19kaXYgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS0RJVjEsIC5zaXplID0gMiwgLnNoaWZ0ID0gMjQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpoc3NwaV9zb3VyY2VzW10gPSB7CisJWzBdID0gJmhzc3BpX2VwbGxkaXYuY2xrLAorCVsxXSA9IE5VTEwsIC8qIHRvIGZpeCAqLworfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGhzc3BpX211eCA9IHsKKwkuY2xrCT0geworCQkubmFtZQk9ICJoc3NwaS1pZiIsCisJfSwKKwkuc291cmNlcyA9ICYoc3RydWN0IGNsa3NyY19zb3VyY2VzKSB7CisJCS5zb3VyY2VzID0gaHNzcGlfc291cmNlcywKKwkJLm5yX3NvdXJjZXMgPSBBUlJBWV9TSVpFKGhzc3BpX3NvdXJjZXMpLAorCX0sCisJLnJlZ19zcmMgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS1NSQywgLnNpemUgPSAxLCAuc2hpZnQgPSAxOCB9LAorfTsKKwogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGhzbW1jX2RpdltdID0gewogCVswXSA9IHsKIAkJLmNsayA9IHsKQEAgLTEwMCwyMCArMTMzLDE1IEBACiAJLmN0cmxiaXQJPSBTM0MyNDE2X0hDTEtDT05fSFNNTUMwLAogfTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgczNjMjQxNl9mY2xrX2Rpdih1bnNpZ25lZCBsb25nIGNsa2NvbjApCi17Ci0JY2xrY29uMCAmPSA3IDw8IFMzQzI0NDNfQ0xLRElWMF9BUk1ESVZfU0hJRlQ7Ci0KLQlyZXR1cm4gYXJtZGl2W2Nsa2NvbjAgPj4gUzNDMjQ0M19DTEtESVYwX0FSTURJVl9TSElGVF07Ci19Ci0KIHZvaWQgX19pbml0X29yX2NwdWZyZXEgczNjMjQxNl9zZXR1cF9jbG9ja3Modm9pZCkKIHsKLQlzM2MyNDQzX2NvbW1vbl9zZXR1cF9jbG9ja3MoczNjMjQxNl9nZXRfcGxsLCBzM2MyNDE2X2ZjbGtfZGl2KTsKKwlzM2MyNDQzX2NvbW1vbl9zZXR1cF9jbG9ja3MoczNjMjQxNl9nZXRfcGxsKTsKIH0KIAogCiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgKmNsa3NyY3NbXSBfX2luaXRkYXRhID0geworCSZoc3NwaV9lcGxsZGl2LAorCSZoc3NwaV9tdXgsCiAJJmhzbW1jX2RpdlswXSwKIAkmaHNtbWNfZGl2WzFdLAogCSZoc21tY19tdXhbMF0sCkBAIC0xMzEsNyArMTU5LDkgQEAKIAogCWNsa19lcGxsLnBhcmVudCA9ICZjbGtfZXBsbHJlZi5jbGs7CiAKLQlzM2MyNDQzX2NvbW1vbl9pbml0X2Nsb2Nrcyh4dGFsLCBzM2MyNDE2X2dldF9wbGwsIHMzYzI0MTZfZmNsa19kaXYpOworCXMzYzI0NDNfY29tbW9uX2luaXRfY2xvY2tzKHh0YWwsIHMzYzI0MTZfZ2V0X3BsbCwKKwkJCQkgICBhcm1kaXYsIEFSUkFZX1NJWkUoYXJtZGl2KSwKKwkJCQkgICBTM0MyNDE2X0NMS0RJVjBfQVJNRElWX01BU0spOwogCiAJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGNsa3NyY3MpOyBwdHIrKykKIAkJczNjX3JlZ2lzdGVyX2Nsa3NyYyhjbGtzcmNzW3B0cl0sIDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L21hY2gtc21kazI0MTYuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxNi9tYWNoLXNtZGsyNDE2LmMKaW5kZXggYWMyN2ViYi4uYTllZWU1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L21hY2gtc21kazI0MTYuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvbWFjaC1zbWRrMjQxNi5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAogTUFDSElORV9TVEFSVChTTURLMjQxNiwgIlNNREsyNDE2IikKIAkvKiBNYWludGFpbmVyOiBZYXVoZW4gS2hhcnV6aHkgPGpla2hvckBnbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtZGsyNDE2X21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxNi9zM2MyNDE2LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvczNjMjQxNi5jCmluZGV4IDIwYjNmZGZiLi5lZTIxNGJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTYvczNjMjQxNi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxNi9zM2MyNDE2LmMKQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlIDxwbGF0L2lpYy1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9mYi1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9uYW5kLWNvcmUuaD4KKyNpbmNsdWRlIDxwbGF0L2FkYy1jb3JlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgczNjMjQxNl9pb2Rlc2NbXSBfX2luaXRkYXRhID0gewogCUlPREVTQ19FTlQoV0FUQ0hET0cpLApAQCAtOTcsNiArOTgsOCBAQAogCiAJczNjX2ZiX3NldG5hbWUoInMzYzI0NDMtZmIiKTsKIAorCXMzY19hZGNfc2V0bmFtZSgiczNjMjQxNi1hZGMiKTsKKwogI2lmZGVmIENPTkZJR19QTQogCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZzM2MyNDE2X3BtX3N5c2NvcmVfb3BzKTsKICNlbmRpZgpAQCAtMTIwLDggKzEyMyw4IEBACiAKIHZvaWQgX19pbml0IHMzYzI0MTZfbWFwX2lvKHZvaWQpCiB7Ci0JczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuc2V0X3B1bGwgPSBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93bjsKLQlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5nZXRfcHVsbCA9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duOworCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LnNldF9wdWxsID0gc2Ftc3VuZ19ncGlvX3NldHB1bGxfdXBkb3duOworCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LmdldF9wdWxsID0gc2Ftc3VuZ19ncGlvX2dldHB1bGxfdXBkb3duOwogCiAJLyogaW5pdGlhbGl6ZSBkZXZpY2UgaW5mb3JtYXRpb24gZWFybHkgKi8KIAlzM2MyNDE2X2RlZmF1bHRfc2RoY2kwKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTYvc2V0dXAtc2RoY2kuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxNi9zZXR1cC1zZGhjaS5jCmluZGV4IGVkMzRmYWQuLmNlZTUzOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxNi9zZXR1cC1zZGhjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxNi9zZXR1cC1zZGhjaS5jCkBAIC0xMiwxNyArMTIsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNkaGNpLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgogCiAvKiBjbG9jayBzb3VyY2VzIGZvciB0aGUgbW1jIGJ1cyBjbG9jaywgb3JkZXIgYXMgZm9yIHRoZSBjdHJsMls1Li40XSAqLwogCkBAIC0zMiwzMCArMjIsMyBAQAogCVsyXSA9ICJoc21tYy1pZiIsCiAJLyogWzNdID0gIjQ4bSIsIC0gbm90ZSBub3Qgc3VjY2Vzc2Z1bGx5IHVzZWQgeWV0ICovCiB9OwotCi12b2lkIHMzYzI0MTZfc2V0dXBfc2RoY2lfY2ZnX2NhcmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAotCQkJCSAgdm9pZCBfX2lvbWVtICpyLAotCQkJCSAgc3RydWN0IG1tY19pb3MgKmlvcywKLQkJCQkgIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKLXsKLQl1MzIgY3RybDIsIGN0cmwzOwotCi0JY3RybDIgPSBfX3Jhd19yZWFkbChyICsgUzNDX1NESENJX0NPTlRST0wyKTsKLQljdHJsMiAmPSBTM0NfU0RIQ0lfQ1RSTDJfU0VMQkFTRUNMS19NQVNLOwotCWN0cmwyIHw9IChTM0M2NFhYX1NESENJX0NUUkwyX0VOU1RBQVNZTkNDTFIgfAotCQkgIFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5DTURDTkZNU0sgfAotCQkgIFMzQ19TREhDSV9DVFJMMl9FTkZCQ0xLUlggfAotCQkgIFMzQ19TREhDSV9DVFJMMl9ERkNOVF9OT05FIHwKLQkJICBTM0NfU0RIQ0lfQ1RSTDJfRU5DTEtPVVRIT0xEKTsKLQotCWlmIChpb3MtPmNsb2NrIDwgMjUgKiAxMDAwMDAwKQotCQljdHJsMyA9IChTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwzIHwKLQkJCSBTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwyIHwKLQkJCSBTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwxIHwKLQkJCSBTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwwKTsKLQllbHNlCi0JCWN0cmwzID0gKFMzQ19TREhDSV9DVFJMM19GQ1NFTDEgfCBTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwwKTsKLQotCV9fcmF3X3dyaXRlbChjdHJsMiwgciArIFMzQ19TREhDSV9DT05UUk9MMik7Ci0JX19yYXdfd3JpdGVsKGN0cmwzLCByICsgUzNDX1NESENJX0NPTlRST0wzKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcKaW5kZXggNTA4MjVhMy4uOTE0ZTYyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcKQEAgLTUsMTAgKzUsOCBAQAogY29uZmlnIENQVV9TM0MyNDQwCiAJYm9vbAogCXNlbGVjdCBDUFVfQVJNOTIwVAotCXNlbGVjdCBTM0NfR1BJT19QVUxMX1VQCiAJc2VsZWN0IFMzQzI0MTBfQ0xPQ0sKIAlzZWxlY3QgUzNDMjQxMF9QTSBpZiBQTQotCXNlbGVjdCBTM0MyNDEwX0dQSU8KIAlzZWxlY3QgUzNDMjQ0MF9ETUEgaWYgUzNDMjQxMF9ETUEKIAlzZWxlY3QgQ1BVX1MzQzI0NFgKIAlzZWxlY3QgQ1BVX0xMU0VSSUFMX1MzQzI0NDAKQEAgLTE4LDkgKzE2LDcgQEAKIGNvbmZpZyBDUFVfUzNDMjQ0MgogCWJvb2wKIAlzZWxlY3QgQ1BVX0FSTTkyMFQKLQlzZWxlY3QgUzNDX0dQSU9fUFVMTF9ET1dOCiAJc2VsZWN0IFMzQzI0MTBfQ0xPQ0sKLQlzZWxlY3QgUzNDMjQxMF9HUElPCiAJc2VsZWN0IFMzQzI0MTBfUE0gaWYgUE0KIAlzZWxlY3QgQ1BVX1MzQzI0NFgKIAlzZWxlY3QgQ1BVX0xMU0VSSUFMX1MzQzI0NDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9kbWEuYwppbmRleCAzYjA1MjlmLi4wZTczZjhmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2RtYS5jCkBAIC00OCwzOCArNDgsMjYgQEAKIAkJLmNoYW5uZWxzWzFdCT0gUzNDMjQ0MF9EQ09OX0NIMV9TREkgfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1syXQk9IFMzQzI0MTBfRENPTl9DSDJfU0RJIHwgRE1BX0NIX1ZBTElELAogCQkuY2hhbm5lbHNbM10JPSBTM0MyNDEwX0RDT05fQ0gzX1NESSB8IERNQV9DSF9WQUxJRCwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX0lJUyArIFMzQzI0MTBfSUlTRklGTywKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAogCX0sCiAJW0RNQUNIX1NQSTBdID0gewogCQkubmFtZQkJPSAic3BpMCIsCiAJCS5jaGFubmVsc1sxXQk9IFMzQzI0MTBfRENPTl9DSDFfU1BJIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMF9TUFREQVQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1NQSSArIFMzQzI0MTBfU1BSREFULAogCX0sCiAJW0RNQUNIX1NQSTFdID0gewogCQkubmFtZQkJPSAic3BpMSIsCiAJCS5jaGFubmVsc1szXQk9IFMzQzI0MTBfRENPTl9DSDNfU1BJIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfU1BJICsgMHgyMCArIFMzQzI0MTBfU1BUREFULAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9TUEkgKyAweDIwICsgUzNDMjQxMF9TUFJEQVQsCiAJfSwKIAlbRE1BQ0hfVUFSVDBdID0gewogCQkubmFtZQkJPSAidWFydDAiLAogCQkuY2hhbm5lbHNbMF0JPSBTM0MyNDEwX0RDT05fQ0gwX1VBUlQwIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDAgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQwICsgUzNDMjQxMF9VUlhILAogCX0sCiAJW0RNQUNIX1VBUlQxXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQxIiwKIAkJLmNoYW5uZWxzWzFdCT0gUzNDMjQxMF9EQ09OX0NIMV9VQVJUMSB8IERNQV9DSF9WQUxJRCwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQxICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMSArIFMzQzI0MTBfVVJYSCwKIAl9LAogICAgICAgCVtETUFDSF9VQVJUMl0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MiIsCiAJCS5jaGFubmVsc1szXQk9IFMzQzI0MTBfRENPTl9DSDNfVUFSVDIgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDIgKyBTM0MyNDEwX1VSWEgsCiAJfSwKIAlbRE1BQ0hfVElNRVJdID0gewogCQkubmFtZQkJPSAidGltZXIiLApAQCAtOTEsMzEgKzc5LDI2IEBACiAJCS5uYW1lCQk9ICJpMnMtc2RpIiwKIAkJLmNoYW5uZWxzWzFdCT0gUzNDMjQxMF9EQ09OX0NIMV9JMlNTREkgfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1syXQk9IFMzQzI0MTBfRENPTl9DSDJfSTJTU0RJIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9JSVMgKyBTM0MyNDEwX0lJU0ZJRk8sCiAJfSwKIAlbRE1BQ0hfSTJTX09VVF0gPSB7CiAJCS5uYW1lCQk9ICJpMnMtc2RvIiwKIAkJLmNoYW5uZWxzWzBdCT0gUzNDMjQ0MF9EQ09OX0NIMF9JMlNTRE8gfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1syXQk9IFMzQzI0MTBfRENPTl9DSDJfSTJTU0RPIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAogCX0sCiAJW0RNQUNIX1BDTV9JTl0gPSB7CiAJCS5uYW1lCQk9ICJwY20taW4iLAogCQkuY2hhbm5lbHNbMF0JPSBTM0MyNDQwX0RDT05fQ0gwX1BDTUlOIHwgRE1BX0NIX1ZBTElELAogCQkuY2hhbm5lbHNbMl0JPSBTM0MyNDQwX0RDT05fQ0gyX1BDTUlOIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQ0MF9QQV9BQzk3ICsgUzNDX0FDOTdfUENNX0RBVEEsCiAJfSwKIAlbRE1BQ0hfUENNX09VVF0gPSB7CiAJCS5uYW1lCQk9ICJwY20tb3V0IiwKIAkJLmNoYW5uZWxzWzFdCT0gUzNDMjQ0MF9EQ09OX0NIMV9QQ01PVVQgfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1szXQk9IFMzQzI0NDBfRENPTl9DSDNfUENNT1VUIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0NDBfUEFfQUM5NyArIFMzQ19BQzk3X1BDTV9EQVRBLAogCX0sCiAJW0RNQUNIX01JQ19JTl0gPSB7CiAJCS5uYW1lCQk9ICJtaWMtaW4iLAogCQkuY2hhbm5lbHNbMl0JPSBTM0MyNDQwX0RDT05fQ0gyX01JQ0lOIHwgRE1BX0NIX1ZBTElELAogCQkuY2hhbm5lbHNbM10JPSBTM0MyNDQwX0RDT05fQ0gzX01JQ0lOIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQ0MF9QQV9BQzk3ICsgUzNDX0FDOTdfTUlDX0RBVEEsCiAJfSwKIAlbRE1BQ0hfVVNCX0VQMV0gPSB7CiAJCS5uYW1lCQk9ICJ1c2ItZXAxIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWFudWJpcy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYW51YmlzLmMKaW5kZXggZDcwODY3OC4uNzRmOTJmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYW51YmlzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYW51YmlzLmMKQEAgLTQ5OCw3ICs0OTgsNyBAQAogCiBNQUNISU5FX1NUQVJUKEFOVUJJUywgIlNpbXRlYy1BbnViaXMiKQogCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBhbnViaXNfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBhbnViaXNfaW5pdCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYXQyNDQwZXZiLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYwppbmRleCA2Yzk4Yjc4Li4zODg4N2VlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAKIAogTUFDSElORV9TVEFSVChBVDI0NDBFVkIsICJBVDI0NDBFVkIiKQotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGF0MjQ0MGV2Yl9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IGF0MjQ0MGV2Yl9pbml0LAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1ndGEwMi5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtZ3RhMDIuYwppbmRleCBjMTBkZGY0Li5kZTFlMGZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1ndGEwMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWd0YTAyLmMKQEAgLTU5NSw3ICs1OTUsNyBAQAogCiBNQUNISU5FX1NUQVJUKE5FTzE5NzNfR1RBMDIsICJHVEEwMiIpCiAJLyogTWFpbnRhaW5lcjogTmVsc29uIENhc3RpbGxvIDxhcmh1YWNvQGZyZWFrcy11bmlkb3MubmV0PiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGd0YTAyX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBndGEwMl9tYWNoaW5lX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1taW5pMjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbWluaTI0NDAuYwppbmRleCBmYzJkYzBiLi45MWZlMGI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1taW5pMjQ0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW1pbmkyNDQwLmMKQEAgLTY3Niw3ICs2NzYsNyBAQAogCiBNQUNISU5FX1NUQVJUKE1JTkkyNDQwLCAiTUlOSTI0NDAiKQogCS8qIE1haW50YWluZXI6IE1pY2hlbCBQb2xsZXQgPGJ1c2Vycm9yQGdtYWlsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBtaW5pMjQ0MF9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IG1pbmkyNDQwX2luaXQsCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW5leGNvZGVyLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1uZXhjb2Rlci5jCmluZGV4IDM3ZGQzMDYuLjYxYzBiZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW5leGNvZGVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbmV4Y29kZXIuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTkVYQ09ERVJfMjQ0MCwgIk5leFZpc2lvbiAtIE5leGNvZGVyIDI0NDAiKQogCS8qIE1haW50YWluZXI6IEd1aWxsYXVtZSBHT1VSQVQgPGd1aWxsYXVtZS5nb3VyYXRAbmV4dmlzaW9uLnR2PiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG5leGNvZGVyX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gbmV4Y29kZXJfaW5pdCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtb3NpcmlzLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1vc2lyaXMuYwppbmRleCBkODg1MzYzLi5kYzE0MmViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1vc2lyaXMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1vc2lyaXMuYwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoT1NJUklTLCAiU2ltdGVjLU9TSVJJUyIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG9zaXJpc19tYXBfaW8sCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb3NpcmlzX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDE5NTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXJ4MTk1MC5jCmluZGV4IDI3ZWE5NTAuLjBkMzQ1M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXJ4MTk1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXJ4MTk1MC5jCkBAIC00Myw2ICs0Myw3IEBACiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvai5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1sY2QuaD4KICNpbmNsdWRlIDxtYWNoL2gxOTQwLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogCkBAIC04MjUsNyArODI2LDcgQEAKIAogTUFDSElORV9TVEFSVChSWDE5NTAsICJIUCBpUEFRIFJYMTk1MCIpCiAgICAgLyogTWFpbnRhaW5lcnM6IFZhc2lseSBLaG9ydXpoaWNrICovCi0JLmJvb3RfcGFyYW1zID0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSByeDE5NTBfbWFwX2lvLAogCS5yZXNlcnZlCT0gcngxOTUwX3Jlc2VydmUsCiAJLmluaXRfaXJxID0gczNjMjR4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXJ4MzcxNS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMKaW5kZXggMTQ3MmIxYS4uZTE5NDk5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCiBNQUNISU5FX1NUQVJUKFJYMzcxNSwgIklQQVEtUlgzNzE1IikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcngzNzE1X21hcF9pbywKIAkucmVzZXJ2ZQk9IHJ4MzcxNV9yZXNlcnZlLAogCS5pbml0X2lycQk9IHJ4MzcxNV9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXNtZGsyNDQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1zbWRrMjQ0MC5jCmluZGV4IGVlZGZlMGYuLjM2ZWViNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXNtZGsyNDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtc21kazI0NDAuYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUzNDMjQ0MCwgIlNNREsyNDQwIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtZGsyNDQwX21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0MC5jCmluZGV4IDIyNzBkMzMuLjM3ZjhjYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NDAuYwpAQCAtNzAsNiArNzAsNiBAQAogewogCXMzYzI0NHhfbWFwX2lvKCk7CiAKLQlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5zZXRfcHVsbCA9IHMzY19ncGlvX3NldHB1bGxfMXVwOwotCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LmdldF9wdWxsID0gczNjX2dwaW9fZ2V0cHVsbF8xdXA7CisJczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuc2V0X3B1bGwgPSBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xdXA7CisJczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuZ2V0X3B1bGwgPSBzM2MyNHh4X2dwaW9fZ2V0cHVsbF8xdXA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0Mi5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NDIuYwppbmRleCA2ZjJiNjVlLi4yYzgyMmUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQyLmMKQEAgLTE4Miw2ICsxODIsNiBAQAogewogCXMzYzI0NHhfbWFwX2lvKCk7CiAKLQlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5zZXRfcHVsbCA9IHMzY19ncGlvX3NldHB1bGxfMWRvd247Ci0JczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuZ2V0X3B1bGwgPSBzM2NfZ3Bpb19nZXRwdWxsXzFkb3duOworCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LnNldF9wdWxsID0gczNjMjR4eF9ncGlvX3NldHB1bGxfMWRvd247CisJczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuZ2V0X3B1bGwgPSBzM2MyNHh4X2dwaW9fZ2V0cHVsbF8xZG93bjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL0tjb25maWcKaW5kZXggZDhlYjg2OC4uODgxNDAzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL0tjb25maWcKQEAgLTEwLDcgKzEwLDYgQEAKIAlzZWxlY3QgQ1BVX0xMU0VSSUFMX1MzQzI0NDAKIAlzZWxlY3QgU0FNU1VOR19DTEtTUkMKIAlzZWxlY3QgUzNDMjQ0M19DTE9DSwotCXNlbGVjdCBTM0NfR1BJT19QVUxMX1MzQzI0NDMKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgUzNDMjQ0MyBTb0MgZnJvbSB0aGUgUzNDMjRYWCBsaW5lCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMKaW5kZXggMzgwNThhZi4uMWMyYzA4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMKQEAgLTU3LDE4ICs1NywxNCBAQAogCiAvKiBjbG9jayBzZWxlY3Rpb25zICovCiAKLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19pMnNfZXh0ID0gewotCS5uYW1lCQk9ICJpMnMtZXh0IiwKLX07Ci0KIC8qIGFybWRpdgogICoKICAqIHRoaXMgY2xvY2sgaXMgc291cmNlZCBmcm9tIG1zeXNjbGsgYW5kIGNhbiBoYXZlIGEgbnVtYmVyIG9mCiAgKiBkaXZpZGVyIHZhbHVlcyBhcHBsaWVkIHRvIGl0IHRvIHRoZW4gYmUgZmVkIGludG8gYXJtY2xrLgorICogVGhlIHJlYWwgY2xvY2sgZGVmaW5pdGlvbiBpcyBkb25lIGluIHMzYzI0NDMtY2xvY2suYywKKyAqIG9ubHkgdGhlIGFybWRpdiBkaXZpc29yIHRhYmxlIG11c3QgYmUgZGVmaW5lZCBoZXJlLgogKi8KIAotLyogYXJtZGl2IGRpdmlzb3IgdGFibGUgKi8KLQogc3RhdGljIHVuc2lnbmVkIGludCBhcm1kaXZbMTZdID0gewogCVtTM0MyNDQzX0NMS0RJVjBfQVJNRElWXzEgPj4gUzNDMjQ0M19DTEtESVYwX0FSTURJVl9TSElGVF0JPSAxLAogCVtTM0MyNDQzX0NMS0RJVjBfQVJNRElWXzIgPj4gUzNDMjQ0M19DTEtESVYwX0FSTURJVl9TSElGVF0JPSAyLApAQCAtODAsOTIgKzc2LDYgQEAKIAlbUzNDMjQ0M19DTEtESVYwX0FSTURJVl8xNiA+PiBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX1NISUZUXQk9IDE2LAogfTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgczNjMjQ0M19mY2xrX2Rpdih1bnNpZ25lZCBsb25nIGNsa2NvbjApCi17Ci0JY2xrY29uMCAmPSBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX01BU0s7Ci0KLQlyZXR1cm4gYXJtZGl2W2Nsa2NvbjAgPj4gUzNDMjQ0M19DTEtESVYwX0FSTURJVl9TSElGVF07Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzI0NDNfYXJtY2xrX3JvdW5kcmF0ZShzdHJ1Y3QgY2xrICpjbGssCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHBhcmVudCA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7Ci0JdW5zaWduZWQgbG9uZyBjYWxjOwotCXVuc2lnbmVkIGJlc3QgPSAyNTY7IC8qIGJpZ2dlciB0aGFuIGFueSB2YWx1ZSAqLwotCXVuc2lnbmVkIGRpdjsKLQlpbnQgcHRyOwotCi0JZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGFybWRpdik7IHB0cisrKSB7Ci0JCWRpdiA9IGFybWRpdltwdHJdOwotCQljYWxjID0gcGFyZW50IC8gZGl2OwotCQlpZiAoY2FsYyA8PSByYXRlICYmIGRpdiA8IGJlc3QpCi0JCQliZXN0ID0gZGl2OwotCX0KLQotCXJldHVybiBwYXJlbnQgLyBiZXN0OwotfQotCi1zdGF0aWMgaW50IHMzYzI0NDNfYXJtY2xrX3NldHJhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBwYXJlbnQgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwotCXVuc2lnbmVkIGxvbmcgY2FsYzsKLQl1bnNpZ25lZCBkaXY7Ci0JdW5zaWduZWQgYmVzdCA9IDI1NjsgLyogYmlnZ2VyIHRoYW4gYW55IHZhbHVlICovCi0JaW50IHB0cjsKLQlpbnQgdmFsID0gLTE7Ci0KLQlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoYXJtZGl2KTsgcHRyKyspIHsKLQkJZGl2ID0gYXJtZGl2W3B0cl07Ci0JCWNhbGMgPSBwYXJlbnQgLyBkaXY7Ci0JCWlmIChjYWxjIDw9IHJhdGUgJiYgZGl2IDwgYmVzdCkgewotCQkJYmVzdCA9IGRpdjsKLQkJCXZhbCA9IHB0cjsKLQkJfQotCX0KLQotCWlmICh2YWwgPj0gMCkgewotCQl1bnNpZ25lZCBsb25nIGNsa2NvbjA7Ci0KLQkJY2xrY29uMCA9IF9fcmF3X3JlYWRsKFMzQzI0NDNfQ0xLRElWMCk7Ci0JCWNsa2NvbjAgJj0gflMzQzI0NDNfQ0xLRElWMF9BUk1ESVZfTUFTSzsKLQkJY2xrY29uMCB8PSB2YWwgPDwgUzNDMjQ0M19DTEtESVYwX0FSTURJVl9TSElGVDsKLQkJX19yYXdfd3JpdGVsKGNsa2NvbjAsIFMzQzI0NDNfQ0xLRElWMCk7Ci0JfQotCi0JcmV0dXJuICh2YWwgPT0gLTEpID8gLUVJTlZBTCA6IDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19hcm1kaXYgPSB7Ci0JLm5hbWUJCT0gImFybWRpdiIsCi0JLnBhcmVudAkJPSAmY2xrX21zeXNjbGsuY2xrLAotCS5vcHMJCT0gJihzdHJ1Y3QgY2xrX29wcykgewotCQkucm91bmRfcmF0ZSA9IHMzYzI0NDNfYXJtY2xrX3JvdW5kcmF0ZSwKLQkJLnNldF9yYXRlID0gczNjMjQ0M19hcm1jbGtfc2V0cmF0ZSwKLQl9LAotfTsKLQotLyogYXJtY2xrCi0gKgotICogdGhpcyBpcyB0aGUgY2xvY2sgZmVkIGludG8gdGhlIEFSTSBjb3JlIGl0c2VsZiwgZnJvbSBhcm1kaXYgb3IgZnJvbSBoY2xrLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfYXJtX3NvdXJjZXNbXSA9IHsKLQlbMF0gPSAmY2xrX2FybWRpdiwKLQlbMV0gPSAmY2xrX2gsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FybSA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAiYXJtY2xrIiwKLQl9LAotCS5zb3VyY2VzID0gJihzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMpIHsKLQkJLnNvdXJjZXMgPSBjbGtfYXJtX3NvdXJjZXMsCi0JCS5ucl9zb3VyY2VzID0gQVJSQVlfU0laRShjbGtfYXJtX3NvdXJjZXMpLAotCX0sCi0JLnJlZ19zcmMgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS0RJVjAsIC5zaXplID0gMSwgLnNoaWZ0ID0gMTMgfSwKLX07Ci0KIC8qIGhzc3BpCiAgKgogICogaGlnaC1zcGVlZCBzcGkgY2xvY2ssIHNvdXJjZWQgZnJvbSBlc3lzY2xrCkBAIC0xNzMsNyArODMsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2hzc3BpID0gewogCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJoc3NwaSIsCisJCS5uYW1lCQk9ICJoc3NwaS1pZiIsCiAJCS5wYXJlbnQJCT0gJmNsa19lc3lzY2xrLmNsaywKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX1NDTEtDT05fSFNTUElDTEssCiAJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3MsCkBAIC0yMzUsNDggKzE0NSw2IEBACiAJfSwKIH07CiAKLS8qIGkyc19lcGxsZGl2Ci0gKgotICogVGhpcyBjbG9jayBpcyB0aGUgb3V0cHV0IGZyb20gdGhlIEkyUyBkaXZpc29yIG9mIEVTWVNDTEssIGFuZCBpcyBzZXBhcmF0ZQotICogZnJvbSB0aGUgbXV4IHRoYXQgY29tZXMgYWZ0ZXIgaXQgKGNhbm5vdCBtZXJnZSBpbnRvIG9uZSBzaW5nbGUgY2xvY2spCi0qLwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2kyc19lcGxsZGl2ID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJpMnMtZXBsbGRpdiIsCi0JCS5wYXJlbnQJCT0gJmNsa19lc3lzY2xrLmNsaywKLQl9LAotCS5yZWdfZGl2ID0geyAucmVnID0gUzNDMjQ0M19DTEtESVYxLCAuc2l6ZSA9IDQsIC5zaGlmdCA9IDEyLCB9LAotfTsKLQotLyogaTJzLXJlZgotICoKLSAqIGkycyBidXMgcmVmZXJlbmNlIGNsb2NrLCBzZWxlY3RhYmxlIGZyb20gZXh0ZXJuYWwsIGVzeXNjbGsgb3IgZXBsbHJlZgotICoKLSAqIE5vdGUsIHRoaXMgdXNlZCB0byBiZSB0d28gY2xvY2tzLCBidXQgd2FzIGNvbXByZXNzZWQgaW50byBvbmUuCi0qLwotCi1zdHJ1Y3QgY2xrICpjbGtfaTJzX3NyY2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX2kyc19lcGxsZGl2LmNsaywKLQlbMV0gPSAmY2xrX2kyc19leHQsCi0JWzJdID0gJmNsa19lcGxscmVmLmNsaywKLQlbM10gPSAmY2xrX2VwbGxyZWYuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19pMnMgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImkycy1pZiIsCi0JCS5jdHJsYml0CT0gUzNDMjQ0M19TQ0xLQ09OX0kyU0NMSywKLQkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcywKLQotCX0sCi0JLnNvdXJjZXMgPSAmKHN0cnVjdCBjbGtzcmNfc291cmNlcykgewotCQkuc291cmNlcyA9IGNsa19pMnNfc3JjbGlzdCwKLQkJLm5yX3NvdXJjZXMgPSBBUlJBWV9TSVpFKGNsa19pMnNfc3JjbGlzdCksCi0JfSwKLQkucmVnX3NyYyA9IHsgLnJlZyA9IFMzQzI0NDNfQ0xLU1JDLCAuc2l6ZSA9IDIsIC5zaGlmdCA9IDE0IH0sCi19OwotCiAvKiBzdGFuZGFyZCBjbG9jayBkZWZpbml0aW9ucyAqLwogCiBzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc19vZmZbXSA9IHsKQEAgLTI4NiwxMSArMTU0LDYgQEAKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX1BDTEtDT05fU0RJLAogCX0sIHsKLQkJLm5hbWUJCT0gImlpcyIsCi0JCS5wYXJlbnQJCT0gJmNsa19wLAotCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLAotCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9JSVMsCi0JfSwgewogCQkubmFtZQkJPSAic3BpIiwKIAkJLmRldm5hbWUJPSAiczNjMjQxMC1zcGkuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLApAQCAtMzA1LDI3ICsxNjgsMjAgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc1tdID0gewotfTsKLQogLyogY2xvY2tzIHRvIGFkZCBzdHJhaWdodCBhd2F5ICovCiAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayAqY2xrc3Jjc1tdIF9faW5pdGRhdGEgPSB7Ci0JJmNsa19hcm0sCi0JJmNsa19pMnNfZXBsbGRpdiwKLQkmY2xrX2kycywKIAkmY2xrX2hzc3BpLAogCSZjbGtfaHNtbWNfZGl2LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NbXSBfX2luaXRkYXRhID0gewogCSZjbGtfaHNtbWMsCi0JJmNsa19hcm1kaXYsCiB9OwogCiB2b2lkIF9faW5pdF9vcl9jcHVmcmVxIHMzYzI0NDNfc2V0dXBfY2xvY2tzKHZvaWQpCiB7Ci0JczNjMjQ0M19jb21tb25fc2V0dXBfY2xvY2tzKHMzYzI0NDNfZ2V0X21wbGwsIHMzYzI0NDNfZmNsa19kaXYpOworCXMzYzI0NDNfY29tbW9uX3NldHVwX2Nsb2NrcyhzM2MyNDQzX2dldF9tcGxsKTsKIH0KIAogdm9pZCBfX2luaXQgczNjMjQ0M19pbml0X2Nsb2NrcyhpbnQgeHRhbCkKQEAgLTMzNiw3ICsxOTIsOSBAQAogCWNsa19lcGxsLnJhdGUgPSBzM2MyNDQzX2dldF9lcGxsKGVwbGxjb24sIHh0YWwpOwogCWNsa19lcGxsLnBhcmVudCA9ICZjbGtfZXBsbHJlZi5jbGs7CiAKLQlzM2MyNDQzX2NvbW1vbl9pbml0X2Nsb2Nrcyh4dGFsLCBzM2MyNDQzX2dldF9tcGxsLCBzM2MyNDQzX2ZjbGtfZGl2KTsKKwlzM2MyNDQzX2NvbW1vbl9pbml0X2Nsb2Nrcyh4dGFsLCBzM2MyNDQzX2dldF9tcGxsLAorCQkJCSAgIGFybWRpdiwgQVJSQVlfU0laRShhcm1kaXYpLAorCQkJCSAgIFMzQzI0NDNfQ0xLRElWMF9BUk1ESVZfTUFTSyk7CiAKIAlzM2MyNDQzX3NldHVwX2Nsb2NrcygpOwogCkBAIC0zNDUsMTAgKzIwMyw2IEBACiAJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGNsa3NyY3MpOyBwdHIrKykKIAkJczNjX3JlZ2lzdGVyX2Nsa3NyYyhjbGtzcmNzW3B0cl0sIDEpOwogCi0JLyogcmVnaXN0ZXIgY2xvY2tzIGZyb20gY2xvY2sgYXJyYXkgKi8KLQotCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3MsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3MpKTsKLQogCS8qIFdlIG11c3QgYmUgY2FyZWZ1bCBkaXNhYmxpbmcgdGhlIGNsb2NrcyB3ZSBhcmUgbm90IGludGVuZGluZyB0bwogCSAqIGJlIHVzaW5nIGF0IGJvb3QgdGltZSwgYXMgc3Vic3lzdGVtcyBzdWNoIGFzIHRoZSBMQ0Qgd2hpY2ggZG8KIAkgKiB0aGVpciBvd24gRE1BIHJlcXVlc3RzIHRvIHRoZSBidXMgY2FuIGNhdXNlIHRoZSBzeXN0ZW0gdG8gbG9ja3VwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvZG1hLmMKaW5kZXggM2Y2NTg2OC4uZmU1MjE1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9kbWEuYwpAQCAtNTQsNjggKzU0LDQ2IEBACiAJW0RNQUNIX1NESV0gPSB7CiAJCS5uYW1lCQk9ICJzZGkiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfU0RJKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX0lJUyArIFMzQzI0MTBfSUlTRklGTywKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAogCX0sCiAJW0RNQUNIX1NQSTBdID0gewogCQkubmFtZQkJPSAic3BpMCIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9TUEkwVFgpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMF9TUFREQVQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1NQSSArIFMzQzI0MTBfU1BSREFULAogCX0sCiAJW0RNQUNIX1NQSTFdID0gewogCQkubmFtZQkJPSAic3BpMSIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9TUEkxVFgpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfU1BJICsgMHgyMCArIFMzQzI0MTBfU1BUREFULAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9TUEkgKyAweDIwICsgUzNDMjQxMF9TUFJEQVQsCiAJfSwKIAlbRE1BQ0hfVUFSVDBdID0gewogCQkubmFtZQkJPSAidWFydDAiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDBfMCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMCArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDAgKyBTM0MyNDEwX1VSWEgsCiAJfSwKIAlbRE1BQ0hfVUFSVDFdID0gewogCQkubmFtZQkJPSAidWFydDEiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDFfMCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMSArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDEgKyBTM0MyNDEwX1VSWEgsCiAJfSwKICAgICAgIAlbRE1BQ0hfVUFSVDJdID0gewogCQkubmFtZQkJPSAidWFydDIiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDJfMCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDIgKyBTM0MyNDEwX1VSWEgsCiAJfSwKICAgICAgIAlbRE1BQ0hfVUFSVDNdID0gewogCQkubmFtZQkJPSAidWFydDMiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDNfMCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQ0M19QQV9VQVJUMyArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0NDNfUEFfVUFSVDMgKyBTM0MyNDEwX1VSWEgsCiAJfSwKIAlbRE1BQ0hfVUFSVDBfU1JDMl0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MCIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMF8xKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQwICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMCArIFMzQzI0MTBfVVJYSCwKIAl9LAogCVtETUFDSF9VQVJUMV9TUkMyXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQxIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQxXzEpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDEgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQxICsgUzNDMjQxMF9VUlhILAogCX0sCiAgICAgICAJW0RNQUNIX1VBUlQyX1NSQzJdID0gewogCQkubmFtZQkJPSAidWFydDIiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDJfMSksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDIgKyBTM0MyNDEwX1VSWEgsCiAJfSwKICAgICAgIAlbRE1BQ0hfVUFSVDNfU1JDMl0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MyIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9VQVJUM18xKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDQzX1BBX1VBUlQzICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQ0M19QQV9VQVJUMyArIFMzQzI0MTBfVVJYSCwKIAl9LAogCVtETUFDSF9USU1FUl0gPSB7CiAJCS5uYW1lCQk9ICJ0aW1lciIsCkBAIC0xMjQsMjcgKzEwMiwyMiBAQAogCVtETUFDSF9JMlNfSU5dID0gewogCQkubmFtZQkJPSAiaTJzLXNkaSIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9JMlNSWCksCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX0lJUyArIFMzQzI0MTBfSUlTRklGTywKIAl9LAogCVtETUFDSF9JMlNfT1VUXSA9IHsKIAkJLm5hbWUJCT0gImkycy1zZG8iLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfSTJTVFgpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAogCX0sCiAJW0RNQUNIX1BDTV9JTl0gPSB7CiAJCS5uYW1lCQk9ICJwY20taW4iLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfUENNSU4pLAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQ0MF9QQV9BQzk3ICsgUzNDX0FDOTdfUENNX0RBVEEsCiAJfSwKIAlbRE1BQ0hfUENNX09VVF0gPSB7CiAJCS5uYW1lCQk9ICJwY20tb3V0IiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0NDNfRE1BUkVRU0VMX1BDTU9VVCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQ0MF9QQV9BQzk3ICsgUzNDX0FDOTdfUENNX0RBVEEsCiAJfSwKIAlbRE1BQ0hfTUlDX0lOXSA9IHsKIAkJLm5hbWUJCT0gIm1pYy1pbiIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9NSUNJTiksCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDQwX1BBX0FDOTcgKyBTM0NfQUM5N19NSUNfREFUQSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL21hY2gtc21kazI0NDMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9tYWNoLXNtZGsyNDQzLmMKaW5kZXggNTE0Mjc1ZS4uYmVjMTA3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL21hY2gtc21kazI0NDMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvbWFjaC1zbWRrMjQ0My5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAogTUFDSElORV9TVEFSVChTTURLMjQ0MywgIlNNREsyNDQzIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtZGsyNDQzX21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9zM2MyNDQzLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvczNjMjQ0My5jCmluZGV4IGU2YTI4YmEuLmEyMmI3NzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9zM2MyNDQzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL3MzYzI0NDMuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9mYi1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9uYW5kLWNvcmUuaD4KKyNpbmNsdWRlIDxwbGF0L2FkYy1jb3JlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgczNjMjQ0M19pb2Rlc2NbXSBfX2luaXRkYXRhID0gewogCUlPREVTQ19FTlQoV0FUQ0hET0cpLApAQCAtNzAsNiArNzEsOCBAQAogCXMzY19uYW5kX3NldG5hbWUoInMzYzI0MTItbmFuZCIpOwogCXMzY19mYl9zZXRuYW1lKCJzM2MyNDQzLWZiIik7CiAKKwlzM2NfYWRjX3NldG5hbWUoInMzYzI0NDMtYWRjIik7CisKIAkvKiBjaGFuZ2UgV0RUIElSUSBudW1iZXIgKi8KIAlzM2NfZGV2aWNlX3dkdC5yZXNvdXJjZVsxXS5zdGFydCA9IElSUV9TM0MyNDQzX1dEVDsKIAlzM2NfZGV2aWNlX3dkdC5yZXNvdXJjZVsxXS5lbmQgICA9IElSUV9TM0MyNDQzX1dEVDsKQEAgLTkwLDggKzkzLDggQEAKIAogdm9pZCBfX2luaXQgczNjMjQ0M19tYXBfaW8odm9pZCkKIHsKLQlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5zZXRfcHVsbCA9IHMzY19ncGlvX3NldHB1bGxfczNjMjQ0MzsKLQlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5nZXRfcHVsbCA9IHMzY19ncGlvX2dldHB1bGxfczNjMjQ0MzsKKwlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5zZXRfcHVsbCA9IHMzYzI0NDNfZ3Bpb19zZXRwdWxsOworCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LmdldF9wdWxsID0gczNjMjQ0M19ncGlvX2dldHB1bGw7CiAKIAlpb3RhYmxlX2luaXQoczNjMjQ0M19pb2Rlc2MsIEFSUkFZX1NJWkUoczNjMjQ0M19pb2Rlc2MpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L0tjb25maWcKaW5kZXggZjA1N2I2YS4uNTU1MmUwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L0tjb25maWcKQEAgLTI4OCw1ICsyODgsNiBAQAogCXNlbGVjdCBTM0NfREVWX1JUQwogCXNlbGVjdCBTM0M2NFhYX0RFVl9TUEkKIAlzZWxlY3QgUzNDMjRYWF9HUElPX0VYVFJBMTI4CisJc2VsZWN0IEkyQwogCWhlbHAKIAkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgdGhlIFdvbGZzb24gQ3JhZ2dhbm1vcmUgUzNDNjQxMCB2YXJpYW50LgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L01ha2VmaWxlCmluZGV4IDYxYjQwMzQuLmNmYzBiOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDYgQEAKICMgQ29yZSBmaWxlcwogb2JqLXkJCQkJKz0gY3B1Lm8KIG9iai15CQkJCSs9IGNsb2NrLm8KLW9iai15CQkJCSs9IGdwaW9saWIubwogCiAjIENvcmUgc3VwcG9ydCBmb3IgUzNDNjQwMCBzeXN0ZW0KIApAQCAtNTUsMTIgKzU0LDEwIEBACiBvYmotJChDT05GSUdfTUFDSF9TTUFSVFEpCSs9IG1hY2gtc21hcnRxLm8KIG9iai0kKENPTkZJR19NQUNIX1NNQVJUUTUpCSs9IG1hY2gtc21hcnRxNS5vCiBvYmotJChDT05GSUdfTUFDSF9TTUFSVFE3KQkrPSBtYWNoLXNtYXJ0cTcubwotb2JqLSQoQ09ORklHX01BQ0hfV0xGX0NSQUdHXzY0MTApICs9IG1hY2gtY3JhZzY0MTAubworb2JqLSQoQ09ORklHX01BQ0hfV0xGX0NSQUdHXzY0MTApICs9IG1hY2gtY3JhZzY0MTAubyBtYWNoLWNyYWc2NDEwLW1vZHVsZS5vCiAKICMgZGV2aWNlIHN1cHBvcnQKIAogb2JqLXkJCQkJKz0gZGV2LXVhcnQubwogb2JqLXkJCQkJKz0gZGV2LWF1ZGlvLm8KIG9iai0kKENPTkZJR19TM0M2NFhYX0RFVl9TUEkpCSs9IGRldi1zcGkubwotb2JqLSQoQ09ORklHX1MzQzY0WFhfREVWX1RTKQkrPSBkZXYtdHMubwotb2JqLSQoQ09ORklHX1MzQzY0WFhfREVWX09ORU5BTkQxKQkrPSBkZXYtb25lbmFuZDEubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYwppbmRleCA4Y2YzOWUzLi4zOWMyMzhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYwpAQCAtMjUsMTMgKzI1LDEzIEBACiAKICNpbmNsdWRlIDxtYWNoL3JlZ3Mtc3lzLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+Ci0jaW5jbHVkZSA8bWFjaC9wbGwuaD4KIAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUtZnJlcS5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLWNsa3NyYy5oPgorI2luY2x1ZGUgPHBsYXQvcGxsLmg+CiAKIC8qIGZpbl9hcGxsLCBmaW5fbXBsbCBhbmQgZmluX2VwbGwgYXJlIGFsbCB0aGUgc2FtZSBjbG9jaywgd2hpY2ggd2UgY2FsbAogICogZXh0X3h0YWxfbXV4IGZvciB3YW50IG9mIGFuIGFjdHVhbCBuYW1lIGZyb20gdGhlIG1hbnVhbC4KQEAgLTczNSw3ICs3MzUsOCBAQAogCS8qIEZvciBub3cgYXNzdW1lIHRoZSBtdXggYWx3YXlzIHNlbGVjdHMgdGhlIGNyeXN0YWwgKi8KIAljbGtfZXh0X3h0YWxfbXV4LnBhcmVudCA9IHh0YWxfY2xrOwogCi0JZXBsbCA9IHMzYzY0MDBfZ2V0X2VwbGwoeHRhbCk7CisJZXBsbCA9IHMzY19nZXRfcGxsNjU1M3goeHRhbCwgX19yYXdfcmVhZGwoUzNDX0VQTExfQ09OMCksCisJCQkJX19yYXdfcmVhZGwoUzNDX0VQTExfQ09OMSkpOwogCW1wbGwgPSBzM2M2NDAwX2dldF9wbGwoeHRhbCwgX19yYXdfcmVhZGwoUzNDX01QTExfQ09OKSk7CiAJYXBsbCA9IHMzYzY0MDBfZ2V0X3BsbCh4dGFsLCBfX3Jhd19yZWFkbChTM0NfQVBMTF9DT04pKTsKIApAQCAtNzQ0LDcgKzc0NSwxMyBAQAogCXByaW50ayhLRVJOX0lORk8gIlMzQzY0WFg6IFBMTCBzZXR0aW5ncywgQT0lbGQsIE09JWxkLCBFPSVsZFxuIiwKIAkgICAgICAgYXBsbCwgbXBsbCwgZXBsbCk7CiAKLQloY2xrMiA9IG1wbGwgLyBHRVRfRElWKGNsa2RpdjAsIFMzQzY0MDBfQ0xLRElWMF9IQ0xLMik7CisJaWYoX19yYXdfcmVhZGwoUzNDNjRYWF9PVEhFUlMpICYgUzNDNjRYWF9PVEhFUlNfU1lOQ01VWFNFTCkKKwkJLyogU3luY2hyb25vdXMgbW9kZSAqLworCQloY2xrMiA9IGFwbGwgLyBHRVRfRElWKGNsa2RpdjAsIFMzQzY0MDBfQ0xLRElWMF9IQ0xLMik7CisJZWxzZQorCQkvKiBBc3luY2hyb25vdXMgbW9kZSAqLworCQloY2xrMiA9IG1wbGwgLyBHRVRfRElWKGNsa2RpdjAsIFMzQzY0MDBfQ0xLRElWMF9IQ0xLMik7CisKIAloY2xrID0gaGNsazIgLyBHRVRfRElWKGNsa2RpdjAsIFMzQzY0MDBfQ0xLRElWMF9IQ0xLKTsKIAlwY2xrID0gaGNsazIgLyBHRVRfRElWKGNsa2RpdjAsIFMzQzY0MDBfQ0xLRElWMF9QQ0xLKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2NwdS5jCmluZGV4IDM3NGU0NWUuLmRlMDg1YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9jcHUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY3B1LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgpAQCAtMzMsOCArMzQsOCBAQAogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KIAotI2luY2x1ZGUgPG1hY2gvczNjNjQwMC5oPgotI2luY2x1ZGUgPG1hY2gvczNjNjQxMC5oPgorI2luY2x1ZGUgPHBsYXQvczNjNjQwMC5oPgorI2luY2x1ZGUgPHBsYXQvczNjNjQxMC5oPgogCiAvKiB0YWJsZSBvZiBzdXBwb3J0ZWQgQ1BVcyAqLwogCkBAIC00MywxNiArNDQsMTYgQEAKIAogc3RhdGljIHN0cnVjdCBjcHVfdGFibGUgY3B1X2lkc1tdIF9faW5pdGRhdGEgPSB7CiAJewotCQkuaWRjb2RlCQk9IDB4MzY0MDAwMDAsCi0JCS5pZG1hc2sJCT0gMHhmZmZmZjAwMCwKKwkJLmlkY29kZQkJPSBTM0M2NDAwX0NQVV9JRCwKKwkJLmlkbWFzawkJPSBTM0M2NFhYX0NQVV9NQVNLLAogCQkubWFwX2lvCQk9IHMzYzY0MDBfbWFwX2lvLAogCQkuaW5pdF9jbG9ja3MJPSBzM2M2NDAwX2luaXRfY2xvY2tzLAogCQkuaW5pdF91YXJ0cwk9IHMzYzY0MDBfaW5pdF91YXJ0cywKIAkJLmluaXQJCT0gczNjNjQwMF9pbml0LAogCQkubmFtZQkJPSBuYW1lX3MzYzY0MDAsCiAJfSwgewotCQkuaWRjb2RlCQk9IDB4MzY0MTAxMDAsCi0JCS5pZG1hc2sJCT0gMHhmZmZmZmYwMCwKKwkJLmlkY29kZQkJPSBTM0M2NDEwX0NQVV9JRCwKKwkJLmlkbWFzawkJPSBTM0M2NFhYX0NQVV9NQVNLLAogCQkubWFwX2lvCQk9IHMzYzY0MTBfbWFwX2lvLAogCQkuaW5pdF9jbG9ja3MJPSBzM2M2NDEwX2luaXRfY2xvY2tzLAogCQkuaW5pdF91YXJ0cwk9IHMzYzY0MTBfaW5pdF91YXJ0cywKQEAgLTE0MCwyMiArMTQxLDE1IEBACiAKIHZvaWQgX19pbml0IHMzYzY0eHhfaW5pdF9pbyhzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywgaW50IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBpZGNvZGU7Ci0KIAkvKiBpbml0aWFsaXNlIHRoZSBpbyBkZXNjcmlwdG9ycyB3ZSBuZWVkIGZvciBpbml0aWFsaXNhdGlvbiAqLwogCWlvdGFibGVfaW5pdChzM2NfaW9kZXNjLCBBUlJBWV9TSVpFKHMzY19pb2Rlc2MpKTsKIAlpb3RhYmxlX2luaXQobWFjaF9kZXNjLCBzaXplKTsKKwlpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoU1pfOE0pOwogCi0JaWRjb2RlID0gX19yYXdfcmVhZGwoUzNDX1ZBX1NZUyArIDB4MTE4KTsKLQlpZiAoIWlkY29kZSkgewotCQkvKiBTM0M2NDAwIGhhcyB0aGUgSUQgcmVnaXN0ZXIgaW4gYSBkaWZmZXJlbnQgcGxhY2UsCi0JCSAqIGFuZCBuZWVkcyBhIHdyaXRlIGJlZm9yZSBpdCBjYW4gYmUgcmVhZC4gKi8KKwkvKiBkZXRlY3QgY3B1IGlkICovCisJczNjNjR4eF9pbml0X2NwdSgpOwogCi0JCV9fcmF3X3dyaXRlbCgweDAsIFMzQ19WQV9TWVMgKyAweEExQyk7Ci0JCWlkY29kZSA9IF9fcmF3X3JlYWRsKFMzQ19WQV9TWVMgKyAweEExQyk7Ci0JfQotCi0JczNjX2luaXRfY3B1KGlkY29kZSwgY3B1X2lkcywgQVJSQVlfU0laRShjcHVfaWRzKSk7CisJczNjX2luaXRfY3B1KHNhbXN1bmdfY3B1X2lkLCBjcHVfaWRzLCBBUlJBWV9TSVpFKGNwdV9pZHMpKTsKIH0KIAogc3RhdGljIF9faW5pdCBpbnQgczNjNjR4eF9zeXNkZXZfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1hdWRpby5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1hdWRpby5jCmluZGV4IGNhZDY3MDIuLjkzNDcwYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtYXVkaW8uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LWF1ZGlvLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LW9uZW5hbmQxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LW9uZW5hbmQxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OWY5ZTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1vbmVuYW5kMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtb25lbmFuZDEuYwotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCi0gKiAgS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4KLSAqCi0gKiBTM0M2NFhYIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgT25lTkFORCBkZXZpY2VzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9vbmVuYW5kLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjNjR4eF9vbmVuYW5kMV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFMzQzY0WFhfUEFfT05FTkFORDEsCi0JCS5lbmQJPSBTM0M2NFhYX1BBX09ORU5BTkQxICsgMHg0MDAgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gUzNDNjRYWF9QQV9PTkVOQU5EMV9CVUYsCi0JCS5lbmQJPSBTM0M2NFhYX1BBX09ORU5BTkQxX0JVRiArIFMzQzY0WFhfU1pfT05FTkFORDFfQlVGIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMl0gPSB7Ci0JCS5zdGFydAk9IElSUV9PTkVOQU5EMSwKLQkJLmVuZAk9IElSUV9PTkVOQU5EMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2Vfb25lbmFuZDEgPSB7Ci0JLm5hbWUJCT0gInNhbXN1bmctb25lbmFuZCIsCi0JLmlkCQk9IDEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzYzY0eHhfb25lbmFuZDFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBzM2M2NHh4X29uZW5hbmQxX3Jlc291cmNlcywKLX07Ci0KLXZvaWQgczNjNjR4eF9vbmVuYW5kMV9zZXRfcGxhdGRhdGEoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCi17Ci0JczNjX3NldF9wbGF0ZGF0YShwZGF0YSwgc2l6ZW9mKHN0cnVjdCBvbmVuYW5kX3BsYXRmb3JtX2RhdGEpLAotCQkJICZzM2M2NHh4X2RldmljZV9vbmVuYW5kMSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZG1hLmMKaW5kZXggMjA0YmZhZi4uMTdkNjJmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kbWEuYwpAQCAtMTQ3LDE0ICsxNDcsMTQgQEAKIAl1MzIgY29udHJvbDAsIGNvbnRyb2wxOwogCiAJc3dpdGNoIChjaGFuLT5zb3VyY2UpIHsKLQljYXNlIFMzQzI0MTBfRE1BU1JDX0hXOgorCWNhc2UgRE1BX0ZST01fREVWSUNFOgogCQlzcmMgPSBjaGFuLT5kZXZfYWRkcjsKIAkJZHN0ID0gZGF0YTsKIAkJY29udHJvbDAgPSBQTDA4MF9DT05UUk9MX1NSQ19BSEIyOwogCQljb250cm9sMCB8PSBQTDA4MF9DT05UUk9MX0RTVF9JTkNSOwogCQlicmVhazsKIAotCWNhc2UgUzNDMjQxMF9ETUFTUkNfTUVNOgorCWNhc2UgRE1BX1RPX0RFVklDRToKIAkJc3JjID0gZGF0YTsKIAkJZHN0ID0gY2hhbi0+ZGV2X2FkZHI7CiAJCWNvbnRyb2wwID0gUEwwODBfQ09OVFJPTF9EU1RfQUhCMjsKQEAgLTQxNiw3ICs0MTYsNyBAQAogCiAKIGludCBzM2MyNDEwX2RtYV9kZXZjb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwKLQkJCSAgZW51bSBzM2MyNDEwX2RtYXNyYyBzb3VyY2UsCisJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIHNvdXJjZSwKIAkJCSAgdW5zaWduZWQgbG9uZyBkZXZhZGRyKQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKQEAgLTQzNywxMSArNDM3LDExIEBACiAJcHJfZGVidWcoIiVzOiBwZXJpcGhlcmFsICVkXG4iLCBfX2Z1bmNfXywgcGVyaXBoZXJhbCk7CiAKIAlzd2l0Y2ggKHNvdXJjZSkgewotCWNhc2UgUzNDMjQxMF9ETUFTUkNfSFc6CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CiAJCWNvbmZpZyA9IDIgPDwgUEwwODBfQ09ORklHX0ZMT1dfQ09OVFJPTF9TSElGVDsKIAkJY29uZmlnIHw9IHBlcmlwaGVyYWwgPDwgUEwwODBfQ09ORklHX1NSQ19TRUxfU0hJRlQ7CiAJCWJyZWFrOwotCWNhc2UgUzNDMjQxMF9ETUFTUkNfTUVNOgorCWNhc2UgRE1BX1RPX0RFVklDRToKIAkJY29uZmlnID0gMSA8PCBQTDA4MF9DT05GSUdfRkxPV19DT05UUk9MX1NISUZUOwogCQljb25maWcgfD0gcGVyaXBoZXJhbCA8PCBQTDA4MF9DT05GSUdfRFNUX1NFTF9TSElGVDsKIAkJYnJlYWs7CkBAIC03NDAsNyArNzQwLDcgQEAKIAl9CiAKIAkvKiBTZXQgYWxsIERNQSBjb25maWd1cmF0aW9uIHRvIGJlIERNQSwgbm90IFNETUEgKi8KLQl3cml0ZWwoMHhmZmZmZmYsIFMzQ19TWVNSRUcoMHgxMTApKTsKKwl3cml0ZWwoMHhmZmZmZmYsIFMzQzY0WFhfU0RNQV9TRUwpOwogCiAJLyogUmVnaXN0ZXIgc3RhbmRhcmQgRE1BIGNvbnRyb2xsZXJzICovCiAJczNjNjR4eF9kbWFfaW5pdDEoMCwgRE1BQ0hfVUFSVDAsIElSUV9ETUEwLCAweDc1MDAwMDAwKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9ncGlvbGliLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZ3Bpb2xpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmIwOTA4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9ncGlvbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyogYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2dwaW9saWIuYwotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFMzQzY0WFggLSBHUElPbGliIHN1cHBvcnQgCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy1oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KLQotLyogR1BJTyBiYW5rIHN1bW1hcnk6Ci0gKgotICogQmFuawlHUElPcwlTdHlsZQlTbHBDb24JRXh0SW50IEdyb3VwCi0gKiBBCTgJNEJpdAlZZXMJMQotICogQgk3CTRCaXQJWWVzCTEKLSAqIEMJOAk0Qml0CVllcwkyCi0gKiBECTUJNEJpdAlZZXMJMwotICogRQk1CTRCaXQJWWVzCU5vbmUKLSAqIEYJMTYJMkJpdAlZZXMJNCBbMV0KLSAqIEcJNwk0Qml0CVllcwk1Ci0gKiBICTEwCTRCaXRbMl0JWWVzCTYKLSAqIEkJMTYJMkJpdAlZZXMJTm9uZQotICogSgkxMgkyQml0CVllcwlOb25lCi0gKiBLCTE2CTRCaXRbMl0JTm8JTm9uZQotICogTAkxNQk0Qml0WzJdIE5vCU5vbmUKLSAqIE0JNgk0Qml0CU5vCUlSUV9FSU5UCi0gKiBOCTE2CTJCaXQJTm8JSVJRX0VJTlQKLSAqIE8JMTYJMkJpdAlZZXMJNwotICogUAkxNQkyQml0CVllcwk4Ci0gKiBRCTkJMkJpdAlZZXMJOQotICoKLSAqIFsxXSBCQU5LRiBwaW5zIDE0LDE1IGRvIG5vdCBmb3JtIHBhcnQgb2YgdGhlIGV4dGVybmFsIGludGVycnVwdCBzb3VyY2VzCi0gKiBbMl0gQkFOSyBoYXMgdHdvIGNvbnRyb2wgcmVnaXN0ZXJzLCBHUHhDT04wIGFuZCBHUHhDT04xCi0gKi8KLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb180Yml0X2NmZ19ub2ludCA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLmdldF9jb25maWcJPSBzM2NfZ3Bpb19nZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb180Yml0X2NmZ19laW50MDExMSA9IHsKLQkuY2ZnX2VpbnQJPSA3LAotCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdCwKLQkuZ2V0X2NvbmZpZwk9IHMzY19ncGlvX2dldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvXzRiaXRfY2ZnX2VpbnQwMDExID0gewotCS5jZmdfZWludAk9IDMsCi0JLmdldF9jb25maWcJPSBzM2NfZ3Bpb19nZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdCwKLQkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93biwKLQkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93biwKLX07Ci0KLXN0YXRpYyBpbnQgczNjNjR4eF9ncGlvMmludF9ncG0oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQotewotCXJldHVybiBwaW4gPCA1ID8gSVJRX0VJTlQoMjMpICsgcGluIDogLUVOWElPOwotfQotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NoaXAgZ3Bpb180Yml0W10gPSB7Ci0JewotCQkuYmFzZQk9IFMzQzY0WFhfR1BBX0JBU0UsCi0JCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19laW50MDExMSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BBKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0FfTlIsCi0JCQkubGFiZWwJPSAiR1BBIiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUEJfQkFTRSwKLQkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMTExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUEIoMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fQl9OUiwKLQkJCS5sYWJlbAk9ICJHUEIiLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQQ19CQVNFLAotCQkuY29uZmlnCT0gJmdwaW9fNGJpdF9jZmdfZWludDAxMTEsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTM0M2NFhYX0dQQygwKSwKLQkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19DX05SLAotCQkJLmxhYmVsCT0gIkdQQyIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzY0WFhfR1BEX0JBU0UsCi0JCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19laW50MDExMSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BEKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0RfTlIsCi0JCQkubGFiZWwJPSAiR1BEIiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUEVfQkFTRSwKLQkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUEUoMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fRV9OUiwKLQkJCS5sYWJlbAk9ICJHUEUiLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQR19CQVNFLAotCQkuY29uZmlnCT0gJmdwaW9fNGJpdF9jZmdfZWludDAxMTEsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTM0M2NFhYX0dQRygwKSwKLQkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19HX05SLAotCQkJLmxhYmVsCT0gIkdQRyIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzY0WFhfR1BNX0JBU0UsCi0JCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19laW50MDAxMSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BNKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX01fTlIsCi0JCQkubGFiZWwJPSAiR1BNIiwKLQkJCS50b19pcnEgPSBzM2M2NHh4X2dwaW8yaW50X2dwbSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIGludCBzM2M2NHh4X2dwaW8yaW50X2dwbChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4pCi17Ci0JcmV0dXJuIHBpbiA+PSA4ID8gSVJRX0VJTlQoMTYpICsgcGluIC0gOCA6IC1FTlhJTzsKLX0KLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jaGlwIGdwaW9fNGJpdDJbXSA9IHsKLQl7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUEhfQkFTRSArIDB4NCwKLQkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMTExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUEgoMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fSF9OUiwKLQkJCS5sYWJlbAk9ICJHUEgiLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQS19CQVNFICsgMHg0LAotCQkuY29uZmlnCT0gJmdwaW9fNGJpdF9jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTM0M2NFhYX0dQSygwKSwKLQkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19LX05SLAotCQkJLmxhYmVsCT0gIkdQSyIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzY0WFhfR1BMX0JBU0UgKyAweDQsCi0JCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19laW50MDAxMSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BMKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0xfTlIsCi0JCQkubGFiZWwJPSAiR1BMIiwKLQkJCS50b19pcnEgPSBzM2M2NHh4X2dwaW8yaW50X2dwbCwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb18yYml0X2NmZ19ub2ludCA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2MyNHh4LAotCS5nZXRfY29uZmlnCT0gczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHgsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvXzJiaXRfY2ZnX2VpbnQxMCA9IHsKLQkuY2ZnX2VpbnQJPSAyLAotCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHgsCi0JLmdldF9jb25maWcJPSBzM2NfZ3Bpb19nZXRjZmdfczNjMjR4eCwKLQkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93biwKLQkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2ZnIGdwaW9fMmJpdF9jZmdfZWludDExID0gewotCS5jZmdfZWludAk9IDMsCi0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eCwKLQkuZ2V0X2NvbmZpZwk9IHMzY19ncGlvX2dldGNmZ19zM2MyNHh4LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jaGlwIGdwaW9fMmJpdFtdID0gewotCXsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQRl9CQVNFLAotCQkuY29uZmlnCT0gJmdwaW9fMmJpdF9jZmdfZWludDExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUEYoMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fRl9OUiwKLQkJCS5sYWJlbAk9ICJHUEYiLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQSV9CQVNFLAotCQkuY29uZmlnCT0gJmdwaW9fMmJpdF9jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTM0M2NFhYX0dQSSgwKSwKLQkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19JX05SLAotCQkJLmxhYmVsCT0gIkdQSSIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzY0WFhfR1BKX0JBU0UsCi0JCS5jb25maWcJPSAmZ3Bpb18yYml0X2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BKKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0pfTlIsCi0JCQkubGFiZWwJPSAiR1BKIiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUE5fQkFTRSwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoMCksCi0JCS5jb25maWcJPSAmZ3Bpb18yYml0X2NmZ19laW50MTAsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTM0M2NFhYX0dQTigwKSwKLQkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19OX05SLAotCQkJLmxhYmVsCT0gIkdQTiIsCi0JCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUE9fQkFTRSwKLQkJLmNvbmZpZwk9ICZncGlvXzJiaXRfY2ZnX2VpbnQxMSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BPKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX09fTlIsCi0JCQkubGFiZWwJPSAiR1BPIiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUFBfQkFTRSwKLQkJLmNvbmZpZwk9ICZncGlvXzJiaXRfY2ZnX2VpbnQxMSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BQKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX1BfTlIsCi0JCQkubGFiZWwJPSAiR1BQIiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUFFfQkFTRSwKLQkJLmNvbmZpZwk9ICZncGlvXzJiaXRfY2ZnX2VpbnQxMSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BRKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX1FfTlIsCi0JCQkubGFiZWwJPSAiR1BRIiwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIF9faW5pdCB2b2lkIHMzYzY0eHhfZ3Bpb2xpYl9hZGRfMmJpdChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkKLXsKLQljaGlwLT5wbSA9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCk7Ci19Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCBzM2M2NHh4X2dwaW9saWJfYWRkKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwcywKLQkJCQkgICAgICAgaW50IG5yX2NoaXBzLAotCQkJCSAgICAgICB2b2lkICgqZm4pKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICopKQotewotCWZvciAoOyBucl9jaGlwcyA+IDA7IG5yX2NoaXBzLS0sIGNoaXBzKyspIHsKLQkJaWYgKGZuKQotCQkJKGZuKShjaGlwcyk7Ci0JCXMzY19ncGlvbGliX2FkZChjaGlwcyk7Ci0JfQotfQotCi1zdGF0aWMgX19pbml0IGludCBzM2M2NHh4X2dwaW9saWJfaW5pdCh2b2lkKQotewotCXMzYzY0eHhfZ3Bpb2xpYl9hZGQoZ3Bpb180Yml0LCBBUlJBWV9TSVpFKGdwaW9fNGJpdCksCi0JCQkgICAgc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0KTsKLQotCXMzYzY0eHhfZ3Bpb2xpYl9hZGQoZ3Bpb180Yml0MiwgQVJSQVlfU0laRShncGlvXzRiaXQyKSwKLQkJCSAgICBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQyKTsKLQotCXMzYzY0eHhfZ3Bpb2xpYl9hZGQoZ3Bpb18yYml0LCBBUlJBWV9TSVpFKGdwaW9fMmJpdCksCi0JCQkgICAgczNjNjR4eF9ncGlvbGliX2FkZF8yYml0KTsKLQotCXJldHVybiAwOwotfQotCi1jb3JlX2luaXRjYWxsKHMzYzY0eHhfZ3Bpb2xpYl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZmYTgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19NQUNIX0NMS0RFVl9IX18KLSNkZWZpbmUgX19NQUNIX0NMS0RFVl9IX18KLQotI2RlZmluZSBfX2Nsa19nZXQoY2xrKSAoeyAxOyB9KQotI2RlZmluZSBfX2Nsa19wdXQoY2xrKSBkbyB7fSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2NyYWc2NDEwLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2NyYWc2NDEwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5MDc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvY3JhZzY0MTAuaApAQCAtMCwwICsxLDIzIEBACisvKiBDcmFnZ2FubW9yZSA2NDEwIHNoYXJlZCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDExIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBwbGMKKyAqCU1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBNQUNIX0NSQUc2NDEwX0gKKyNkZWZpbmUgTUFDSF9DUkFHNjQxMF9ICisKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNkZWZpbmUgQkFORkZfUE1JQ19JUlFfQkFTRQkJSVJRX0JPQVJEX1NUQVJUCisjZGVmaW5lIEdMRU5GQVJDTEFTX1BNSUNfSVJRX0JBU0UJKElSUV9CT0FSRF9TVEFSVCArIDY0KQorCisjZGVmaW5lIFBDQTkzNVhfR1BJT19CQVNFCQlHUElPX0JPQVJEX1NUQVJUCisjZGVmaW5lIENPREVDX0dQSU9fQkFTRQkJKEdQSU9fQk9BUkRfU1RBUlQgKyA4KQorI2RlZmluZSBHTEVORkFSQ0xBU19QTUlDX0dQSU9fQkFTRQkoR1BJT19CT0FSRF9TVEFSVCArIDE2KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBhMjllNzA1Li5jMGMwNzZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0yMSw3ICsyMSw3IEBACiAJICogYWxpZ25lZCBhbmQgYWRkIGluIHRoZSBvZmZzZXQgd2hlbiB3ZSBsb2FkIHRoZSB2YWx1ZSBoZXJlLgogCSAqLwogCi0JLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8gYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCWxkcglccnAsID0gUzNDX1BBX1VBUlQKIAkJbGRyCVxydiwgPSAoUzNDX1ZBX1VBUlQgKyBTM0NfUEFfVUFSVCAmIDB4ZmZmZmYpCiAjaWYgQ09ORklHX0RFQlVHX1MzQ19VQVJUICE9IDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDBhNWQ5MjYuLmZlMWE5OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtNTgsMTEgKzU4LDE1IEBACiAJRE1BQ0hfTUFYCQkvKiB0aGUgZW5kICovCiB9OwogCi1zdGF0aWMgX19pbmxpbmVfXyBib29sIHMzY19kbWFfaGFzX2NpcmN1bGFyKHZvaWQpCitzdGF0aWMgaW5saW5lIGJvb2wgc2Ftc3VuZ19kbWFfaGFzX2NpcmN1bGFyKHZvaWQpCiB7CiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBzYW1zdW5nX2RtYV9pc19kbWFkZXYodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CiAjZGVmaW5lIFMzQzI0MTBfRE1BRl9DSVJDVUxBUgkJKDEgPDwgMCkKIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+CkBAIC05NSw3ICs5OSw3IEBACiAJdW5zaWduZWQgY2hhcgkJIHBlcmlwaGVyYWw7CiAKIAl1bnNpZ25lZCBpbnQJCSBmbGFnczsKLQllbnVtIHMzYzI0MTBfZG1hc3JjCSBzb3VyY2U7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24JIHNvdXJjZTsKIAogCiAJZG1hX2FkZHJfdAkJZGV2X2FkZHI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDBkNDZlOTkuLjZlMzRjMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xMiwxMSArMTIsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCi0KIC8qIEdQSU8gYmFuayBzaXplcyAqLwogI2RlZmluZSBTM0M2NFhYX0dQSU9fQV9OUgkoOCkKICNkZWZpbmUgUzNDNjRYWF9HUElPX0JfTlIJKDcpCkBAIC05Niw1ICs5MSwzIEBACiAjZGVmaW5lIEJPQVJEX05SX0dQSU9TIDE2CiAKICNkZWZpbmUgQVJDSF9OUl9HUElPUwkoR1BJT19CT0FSRF9TVEFSVCArIEJPQVJEX05SX0dQSU9TKQotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9tYXAuaCBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvbWFwLmgKaW5kZXggYTFmMTNmMC4uMjNhMWQ3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL21hcC5oCkBAIC0xNiw2ICsxNiw3IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfTUFQX0ggX19GSUxFX18KIAogI2luY2x1ZGUgPHBsYXQvbWFwLWJhc2UuaD4KKyNpbmNsdWRlIDxwbGF0L21hcC1zM2MuaD4KIAogLyoKICAqIFBvc3QtbXV4IENoaXAgU2VsZWN0IFJlZ2lvbnMgWG0wQ1NuXwpAQCAtODMsNyArODQsNiBAQAogI2RlZmluZSBTM0M2NFhYX1BBX0lJQzEJCSgweDdGMDBGMDAwKQogCiAjZGVmaW5lIFMzQzY0WFhfUEFfR1BJTwkJKDB4N0YwMDgwMDApCi0jZGVmaW5lIFMzQzY0WFhfVkFfR1BJTwkJUzNDX0FERFJfQ1BVKDB4MDAwMDAwMDApCiAjZGVmaW5lIFMzQzY0WFhfU1pfR1BJTwkJU1pfNEsKIAogI2RlZmluZSBTM0M2NFhYX1BBX1NEUkFNCSgweDUwMDAwMDAwKQpAQCAtOTQsMTYgKzk0LDEwIEBACiAjZGVmaW5lIFMzQzY0WFhfUEFfVklDMQkJKDB4NzEzMDAwMDApCiAKICNkZWZpbmUgUzNDNjRYWF9QQV9NT0RFTQkoMHg3NDEwODAwMCkKLSNkZWZpbmUgUzNDNjRYWF9WQV9NT0RFTQlTM0NfQUREUl9DUFUoMHgwMDEwMDAwMCkKIAogI2RlZmluZSBTM0M2NFhYX1BBX1VTQkhPU1QJKDB4NzQzMDAwMDApCiAKICNkZWZpbmUgUzNDNjRYWF9QQV9VU0JfSFNQSFkJKDB4N0MxMDAwMDApCi0jZGVmaW5lIFMzQzY0WFhfVkFfVVNCX0hTUEhZCVMzQ19BRERSX0NQVSgweDAwMjAwMDAwKQotCi0vKiBwbGFjZSBWSUNzIGNsb3NlIHRvZ2V0aGVyICovCi0jZGVmaW5lIFZBX1ZJQzAJCQkoUzNDX1ZBX0lSUSArIDB4MDApCi0jZGVmaW5lIFZBX1ZJQzEJCQkoUzNDX1ZBX0lSUSArIDB4MTAwMDApCiAKIC8qIGNvbXBhdGliaWx0aXkgZGVmaW5lcy4gKi8KICNkZWZpbmUgUzNDX1BBX1RJTUVSCQlTM0M2NFhYX1BBX1RJTUVSCkBAIC0xMTksNyArMTEzLDYgQEAKICNkZWZpbmUgUzNDX1BBX0ZCCQlTM0M2NFhYX1BBX0ZCCiAjZGVmaW5lIFMzQ19QQV9VU0JIT1NUCQlTM0M2NFhYX1BBX1VTQkhPU1QKICNkZWZpbmUgUzNDX1BBX1VTQl9IU09URwlTM0M2NFhYX1BBX1VTQl9IU09URwotI2RlZmluZSBTM0NfVkFfVVNCX0hTUEhZCVMzQzY0WFhfVkFfVVNCX0hTUEhZCiAjZGVmaW5lIFMzQ19QQV9SVEMJCVMzQzY0WFhfUEFfUlRDCiAjZGVmaW5lIFMzQ19QQV9XRFQJCVMzQzY0WFhfUEFfV0FUQ0hET0cKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjBjZGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUICAgICBVTCgweDUwMDAwMDAwKQotCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUJU1pfOE0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3BsbC5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9wbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmMGJiNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3BsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9wbGwuaAotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDNjRYWCBQTEwgY29kZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jZGVmaW5lIFMzQzY0MDBfUExMX01ESVZfTUFTSwkoKDEgPDwgKDI1LTE2KzEpKSAtIDEpCi0jZGVmaW5lIFMzQzY0MDBfUExMX1BESVZfTUFTSwkoKDEgPDwgKDEzLTgrMSkpIC0gMSkKLSNkZWZpbmUgUzNDNjQwMF9QTExfU0RJVl9NQVNLCSgoMSA8PCAoMi0wKzEpKSAtIDEpCi0jZGVmaW5lIFMzQzY0MDBfUExMX01ESVZfU0hJRlQJKDE2KQotI2RlZmluZSBTM0M2NDAwX1BMTF9QRElWX1NISUZUCSg4KQotI2RlZmluZSBTM0M2NDAwX1BMTF9TRElWX1NISUZUCSgwKQotCi0jaW5jbHVkZSA8YXNtL2RpdjY0Lmg+Ci0jaW5jbHVkZSA8cGxhdC9wbGw2NTUzeC5oPgotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczNjNjQwMF9nZXRfcGxsKHVuc2lnbmVkIGxvbmcgYmFzZWNsaywKLQkJCQkJICAgIHUzMiBwbGxjb24pCi17Ci0JdTMyIG1kaXYsIHBkaXYsIHNkaXY7Ci0JdTY0IGZ2Y28gPSBiYXNlY2xrOwotCi0JbWRpdiA9IChwbGxjb24gPj4gUzNDNjQwMF9QTExfTURJVl9TSElGVCkgJiBTM0M2NDAwX1BMTF9NRElWX01BU0s7Ci0JcGRpdiA9IChwbGxjb24gPj4gUzNDNjQwMF9QTExfUERJVl9TSElGVCkgJiBTM0M2NDAwX1BMTF9QRElWX01BU0s7Ci0Jc2RpdiA9IChwbGxjb24gPj4gUzNDNjQwMF9QTExfU0RJVl9TSElGVCkgJiBTM0M2NDAwX1BMTF9TRElWX01BU0s7Ci0KLQlmdmNvICo9IG1kaXY7Ci0JZG9fZGl2KGZ2Y28sIChwZGl2IDw8IHNkaXYpKTsKLQotCXJldHVybiAodW5zaWduZWQgbG9uZylmdmNvOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczNjNjQwMF9nZXRfZXBsbCh1bnNpZ25lZCBsb25nIGJhc2VjbGspCi17Ci0JcmV0dXJuIHMzY19nZXRfcGxsNjU1M3goYmFzZWNsaywgX19yYXdfcmVhZGwoUzNDX0VQTExfQ09OMCksCi0JCQkJX19yYXdfcmVhZGwoUzNDX0VQTExfQ09OMSkpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9wbS1jb3JlLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaAppbmRleCAzODY1OWJlLi5mY2YzZGNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaApAQCAtMTA0LDcgKzEwNCw3IEBACiAJX19yYXdfd3JpdGVsKDAsIFMzQzY0WFhfU0xQRU4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX3NhdmVkX2dwaW9zKHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgc2Ftc3VuZ19wbV9zYXZlZF9ncGlvcyh2b2lkKQogewogCS8qIHR1cm4gb24gdGhlIHNsZWVwIG1vZGUgYW5kIGtlZXAgaXQgdGhlcmUsIGFzIGl0IHNlZW1zIHRoYXQgZHVyaW5nCiAJICogc3VzcGVuZCB0aGUgeENPTiByZWdpc3RlcnMgZ2V0IHJlLXNldCBhbmQgdGh1cyB5b3UgY2FuIGVuZCB1cCB3aXRoCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1YmVkZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFMzQzY0eHggLSBwd20gY2xvY2sgYW5kIHRpbWVyIHN1cHBvcnQKLSAqLwotCi0vKioKLSAqIHB3bV9jZmdfc3JjX2lzX3RjbGsoKSAtIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtdXggY29uZmlnIGlzIGEgdGNsawotICogQHRjZmc6IFRoZSB0aW1lciBUQ0ZHMSByZWdpc3RlciBiaXRzIHNoaWZ0ZWQgZG93biB0byAwLgotICoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZyb20gVENGRzEgaXMgYSBUQ0xLIGluc3RlYWQKLSAqIGFueSBvZiB0aGUgVERJViBjbG9ja3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB3bV9jZmdfc3JjX2lzX3RjbGsodW5zaWduZWQgbG9uZyB0Y2ZnKQotewotCXJldHVybiB0Y2ZnID49IFMzQzY0WFhfVENGRzFfTVVYX1RDTEs7Ci19Ci0KLS8qKgotICogdGNmZ190b19kaXZpc29yKCkgLSBjb252ZXJ0IHRjZmcxIHNldHRpbmcgdG8gYSBkaXZpc29yCi0gKiBAdGNmZzE6IFRoZSB0Y2ZnMSBzZXR0aW5nLCBzaGlmdGVkIGRvd24uCi0gKgotICogR2V0IHRoZSBkaXZpc29yIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdGNmZzEgc2V0dGluZy4gV2UgYXNzdW1lIHRoZQotICogY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdG8gc2VlIGlmIHRoaXMgaXMgbm90IGEgVENMSyBzb3VyY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0Y2ZnX3RvX2Rpdmlzb3IodW5zaWduZWQgbG9uZyB0Y2ZnMSkKLXsKLQlyZXR1cm4gMSA8PCB0Y2ZnMTsKLX0KLQotLyoqCi0gKiBwd21fdGRpdl9oYXNfZGl2MSgpIC0gZG9lcyB0aGUgdGRpdiBzZXR0aW5nIGhhdmUgYSAvMQotICoKLSAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgYSAvMSBpbiB0aGUgdGRpdiBzZXR0aW5nLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwd21fdGRpdl9oYXNfZGl2MSh2b2lkKQotewotCXJldHVybiAxOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2Rpdl9iaXRzKCkgLSBjYWxjdWxhdGUgVENGRzEgZGl2aXNvciB2YWx1ZS4KLSAqIEBkaXY6IFRoZSBkaXZpc29yIHRvIGNhbGN1bGF0ZSB0aGUgYml0IGluZm9ybWF0aW9uIGZvci4KLSAqCi0gKiBUdXJuIGEgZGl2aXNvciBpbnRvIHRoZSBuZWNlc3NhcnkgYml0IGZpZWxkIGZvciBUQ0ZHMS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB3bV90ZGl2X2Rpdl9iaXRzKHVuc2lnbmVkIGludCBkaXYpCi17Ci0JcmV0dXJuIGlsb2cyKGRpdik7Ci19Ci0KLSNkZWZpbmUgUzNDX1RDRkcxX01VWF9UQ0xLIFMzQzY0WFhfVENGRzFfTVVYX1RDTEsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcmVncy1zeXMuaCBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcmVncy1zeXMuaAppbmRleCA2OWI3OGQ5Li5iOTFlMDIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3JlZ3Mtc3lzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9yZWdzLXN5cy5oCkBAIC0yMSw4ICsyMSwxMSBAQAogI2RlZmluZSBTM0M2NFhYX0FIQl9DT04xCVMzQ19TWVNSRUcoMHgxMDQpCiAjZGVmaW5lIFMzQzY0WFhfQUhCX0NPTjIJUzNDX1NZU1JFRygweDEwOCkKIAorI2RlZmluZSBTM0M2NFhYX1NETUFfU0VMCVMzQ19TWVNSRUcoMHgxMTApCisKICNkZWZpbmUgUzNDNjRYWF9PVEhFUlMJCVMzQ19TWVNSRUcoMHg5MDApCiAKICNkZWZpbmUgUzNDNjRYWF9PVEhFUlNfVVNCTUFTSwkoMSA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9PVEhFUlNfU1lOQ01VWFNFTAkoMSA8PCA2KQogCiAjZW5kaWYgLyogX1BMQVRfUkVHU19TWVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9zM2M2NDAwLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3MzYzY0MDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2OTU4ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3MzYzY0MDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2h0L3MzYzY0MDAuaAotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIHMzYzY0MDAgY3B1IHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotLyogQ29tbW9uIGluaXQgY29kZSBmb3IgUzNDNjQwMCByZWxhdGVkIFNvQ3MgKi8KLQotZXh0ZXJuIHZvaWQgczNjNjQwMF9jb21tb25faW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7Ci1leHRlcm4gdm9pZCBzM2M2NDAwX3NldHVwX2Nsb2Nrcyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjNjR4eF9yZWdpc3Rlcl9jbG9ja3ModW5zaWduZWQgbG9uZyB4dGFsLCB1bnNpZ25lZCBhcm1jbGtfbGltaXQpOwotCi0jaWZkZWYgQ09ORklHX0NQVV9TM0M2NDAwCi0KLWV4dGVybiAgaW50IHMzYzY0MDBfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHMzYzY0MDBfaW5pdF9pcnEodm9pZCk7Ci1leHRlcm4gdm9pZCBzM2M2NDAwX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIHMzYzY0MDBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOwotCi0jZGVmaW5lIHMzYzY0MDBfaW5pdF91YXJ0cyBzM2M2NDAwX2NvbW1vbl9pbml0X3VhcnRzCi0KLSNlbHNlCi0jZGVmaW5lIHMzYzY0MDBfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzM2M2NDAwX2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBzM2M2NDAwX21hcF9pbyBOVUxMCi0jZGVmaW5lIHMzYzY0MDBfaW5pdCBOVUxMCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvczNjNjQxMC5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9zM2M2NDEwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZjExNDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9zM2M2NDEwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3MzYzY0MTAuaAotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCAgSW5jLgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIEhlYWRlciBmaWxlIGZvciBzM2M2NDEwIGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzY0MTAKLQotZXh0ZXJuICBpbnQgczNjNjQxMF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgczNjNjQxMF9pbml0X2lycSh2b2lkKTsKLWV4dGVybiB2b2lkIHMzYzY0MTBfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgczNjNjQxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLSNkZWZpbmUgczNjNjQxMF9pbml0X3VhcnRzIHMzYzY0MDBfY29tbW9uX2luaXRfdWFydHMKLQotI2Vsc2UKLSNkZWZpbmUgczNjNjQxMF9pbml0X2Nsb2NrcyBOVUxMCi0jZGVmaW5lIHMzYzY0MTBfaW5pdF91YXJ0cyBOVUxMCi0jZGVmaW5lIHMzYzY0MTBfbWFwX2lvIE5VTEwKLSNkZWZpbmUgczNjNjQxMF9pbml0IE5VTEwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtYW53NjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtYW53NjQxMC5jCmluZGV4IGNiODg2NDMuLjhlYmE4OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLWFudzY0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1hbnc2NDEwLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICNpbmNsdWRlIDxwbGF0L2ZiLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CiAKLSNpbmNsdWRlIDxtYWNoL3MzYzY0MTAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KQEAgLTIzMyw3ICsyMzMsNyBAQAogCiBNQUNISU5FX1NUQVJUKEFOVzY0MTAsICJBJlc2NDEwIikKIAkvKiBNYWludGFpbmVyOiBLd2FuZ3dvbyBMZWUgPGt3YW5nd29vLmxlZUBnbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmluaXRfaXJxCT0gczNjNjQxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IGFudzY0MTBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtY3JhZzY0MTAtbW9kdWxlLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1jcmFnNjQxMC1tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY2ODU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtY3JhZzY0MTAtbW9kdWxlLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qIFNwZXlzaWRlIG1vZHVsZXMgZm9yIENyYWdnYW5tb3JlIC0gYm9hcmQgZGF0YSBwcm9iaW5nCisgKgorICogQ29weXJpZ2h0IDIwMTEgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoJTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8c291bmQvd204OTk2Lmg+CisjaW5jbHVkZSA8c291bmQvd204OTYyLmg+CisjaW5jbHVkZSA8c291bmQvd205MDgxLmg+CisKKyNpbmNsdWRlIDxtYWNoL2NyYWc2NDEwLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgd204OTk2X3JldHVuZV9tb2JpbGVfY29uZmlnIHdtODk5Nl9yZXR1bmVbXSA9IHsKKwl7CisJCS5uYW1lID0gIlN1YiBMUEYiLAorCQkucmF0ZSA9IDQ4MDAwLAorCQkucmVncyA9IHsKKwkJCTB4NjMxOCwgMHg2MzAwLCAweDEwMDAsIDB4MDAwMCwgMHgwMDA0LCAweDIwMDAsIDB4RjAwMCwKKwkJCTB4MDAwMCwgMHgwMDA0LCAweDIwMDAsIDB4RjAwMCwgMHgwMDAwLCAweDAwMDQsIDB4MjAwMCwKKwkJCTB4RjAwMCwgMHgwMDAwLCAweDAwMDQsIDB4MTAwMCwgMHgwODAwLCAweDQwMDAKKwkJfSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU3ViIEhQRiIsCisJCS5yYXRlID0gNDgwMDAsCisJCS5yZWdzID0geworCQkJMHgwMDBBLCAweDYzMDAsIDB4MTAwMCwgMHgwMDAwLCAweDAwMDQsIDB4MjAwMCwgMHhGMDAwLAorCQkJMHgwMDAwLCAweDAwMDQsIDB4MjAwMCwgMHhGMDAwLCAweDAwMDAsIDB4MDAwNCwgMHgyMDAwLAorCQkJMHhGMDAwLCAweDAwMDAsIDB4MDAwNCwgMHgxMDAwLCAweDA4MDAsIDB4NDAwMAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHdtODk5Nl9wZGF0YSB3bTg5OTZfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkubGRvX2VuYSA9IFMzQzY0WFhfR1BOKDcpLAorCS5ncGlvX2Jhc2UgPSBDT0RFQ19HUElPX0JBU0UsCisJLm1pY2RldF9kZWYgPSAxLAorCS5pbmxfbW9kZSA9IFdNODk5Nl9ESUZGRVJSRU5USUFMXzEsCisJLmlucl9tb2RlID0gV004OTk2X0RJRkZFUlJFTlRJQUxfMSwKKworCS5pcnFfZmxhZ3MgPSBJUlFGX1RSSUdHRVJfUklTSU5HLAorCisJLmdwaW9fZGVmYXVsdCA9IHsKKwkJMHg4MDAxLCAvKiBHUElPMSA9PSBBRENMUkNMSzEgKi8KKwkJMHg4MDAxLCAvKiBHUElPMiA9PSBBRENMUkNMSzIsIGlucHV0IGR1ZSB0byBDUFUgKi8KKwkJMHgwMTQxLCAvKiBHUElPMyA9PSBIUF9TRUwgKi8KKwkJMHgwMDAyLCAvKiBHUElPNCA9PSBJUlEgKi8KKwkJMHgwMjBlLCAvKiBHUElPNSA9PSBDTEtPVVQgKi8KKwl9LAorCisJLnJldHVuZV9tb2JpbGVfY2ZncyA9IHdtODk5Nl9yZXR1bmUsCisJLm51bV9yZXR1bmVfbW9iaWxlX2NmZ3MgPSBBUlJBWV9TSVpFKHdtODk5Nl9yZXR1bmUpLAorfTsKKworc3RhdGljIHN0cnVjdCB3bTg5NjJfcGRhdGEgd204OTYyX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmdwaW9faW5pdCA9IHsKKwkJMCwKKwkJV004OTYyX0dQSU9fRk5fT1BDTEssCisJCVdNODk2Ml9HUElPX0ZOX0RNSUNDTEssCisJCTAsCisJCTB4ODAwMCB8IFdNODk2Ml9HUElPX0ZOX0RNSUNEQVQsCisJCVdNODk2Ml9HUElPX0ZOX0lSUSwgICAgLyogT3BlbiBkcmFpbiBtb2RlICovCisJfSwKKwkuaXJxX2FjdGl2ZV9sb3cgPSB0cnVlLAorfTsKKworc3RhdGljIHN0cnVjdCB3bTkwODFfcGRhdGEgd205MDgxX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmlycV9oaWdoID0gZmFsc2UsCisJLmlycV9jbW9zID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19ib2FyZF9pbmZvIHdtMTI1NF9kZXZzW10gPSB7CisJeyBJMkNfQk9BUkRfSU5GTygid204OTk2IiwgMHgxYSksCisJICAucGxhdGZvcm1fZGF0YSA9ICZ3bTg5OTZfcGRhdGEsCisJICAuaXJxID0gR0xFTkZBUkNMQVNfUE1JQ19JUlFfQkFTRSArIFdNODMxWF9JUlFfR1BJT18yLAorCX0sCisJeyBJMkNfQk9BUkRfSU5GTygid205MDgxIiwgMHg2YyksCisJICAucGxhdGZvcm1fZGF0YSA9ICZ3bTkwODFfcGRhdGEsIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19ib2FyZF9pbmZvIHdtMTI1NV9kZXZzW10gPSB7CisJeyBJMkNfQk9BUkRfSU5GTygid201MTAwIiwgMHgxYSksCisJICAuaXJxID0gR0xFTkZBUkNMQVNfUE1JQ19JUlFfQkFTRSArIFdNODMxWF9JUlFfR1BJT18yLAorCX0sCisJeyBJMkNfQk9BUkRfSU5GTygid205MDgxIiwgMHg2YyksCisJICAucGxhdGZvcm1fZGF0YSA9ICZ3bTkwODFfcGRhdGEsIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19ib2FyZF9pbmZvIHdtMTI1OV9kZXZzW10gPSB7CisJeyBJMkNfQk9BUkRfSU5GTygid204OTYyIiwgMHgxYSksCisJICAucGxhdGZvcm1fZGF0YSA9ICZ3bTg5NjJfcGRhdGEsCisJICAuaXJxID0gR0xFTkZBUkNMQVNfUE1JQ19JUlFfQkFTRSArIFdNODMxWF9JUlFfR1BJT18yLAorCX0sCit9OworCisKK3N0YXRpYyBfX2RldmluaXRkYXRhIGNvbnN0IHN0cnVjdCB7CisJdTggaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmkyY19kZXZzOworCWludCBudW1faTJjX2RldnM7Cit9IGdmX21vZHNbXSA9IHsKKwl7IC5pZCA9IDB4MDEsIC5uYW1lID0gIjEyNTAtRVYxIFNwcmluZ2JhbmsiIH0sCisJeyAuaWQgPSAweDAyLCAubmFtZSA9ICIxMjUxLUVWMSBKdXJhIiB9LAorCXsgLmlkID0gMHgwMywgLm5hbWUgPSAiMTI1Mi1FVjEgR2xlbmxpdmV0IiB9LAorCXsgLmlkID0gMHgxMSwgLm5hbWUgPSAiNjI0OS1FVjIgR2xlbmZhcmNsYXMiLCB9LAorCXsgLmlkID0gMHgyMSwgLm5hbWUgPSAiMTI3NS1FVjEgTW9ydGxhY2giIH0sCisJeyAuaWQgPSAweDI1LCAubmFtZSA9ICIxMjc0LUVWMSBHbGVuY2FkYW0iIH0sCisJeyAuaWQgPSAweDMxLCAubmFtZSA9ICIxMjUzLUVWMSBUb21hdGluIiwgfSwKKwl7IC5pZCA9IDB4MzksIC5uYW1lID0gIjEyNTQtRVYxIERhbGxhcyBEaHUiLAorCSAgLmkyY19kZXZzID0gd20xMjU0X2RldnMsIC5udW1faTJjX2RldnMgPSBBUlJBWV9TSVpFKHdtMTI1NF9kZXZzKSB9LAorCXsgLmlkID0gMHgzYSwgLm5hbWUgPSAiMTI1OS1FVjEgVG9iZXJtb3J5IiwKKwkgIC5pMmNfZGV2cyA9IHdtMTI1OV9kZXZzLCAubnVtX2kyY19kZXZzID0gQVJSQVlfU0laRSh3bTEyNTlfZGV2cykgfSwKKwl7IC5pZCA9IDB4M2IsIC5uYW1lID0gIjEyNTUtRVYxIEtpbGNob21hbiIsCisJICAuaTJjX2RldnMgPSB3bTEyNTVfZGV2cywgLm51bV9pMmNfZGV2cyA9IEFSUkFZX1NJWkUod20xMjU1X2RldnMpIH0sCisJeyAuaWQgPSAweDNjLCAubmFtZSA9ICIxMjczLUVWMSBMb25nbW9ybiIgfSwKK307CisKK3N0YXRpYyBfX2RldmluaXQgaW50IHdsZl9nZl9tb2R1bGVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppMmNfaWQpCit7CisJaW50IHJldCwgaSwgaiwgaWQsIHJldjsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShpMmMsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgSUQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlkID0gKHJldCAmIDB4ZmUpID4+IDI7CisJcmV2ID0gcmV0ICYgMHgzOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdmX21vZHMpOyBpKyspCisJCWlmIChpZCA9PSBnZl9tb2RzW2ldLmlkKQorCQkJYnJlYWs7CisKKwlpZiAoaSA8IEFSUkFZX1NJWkUoZ2ZfbW9kcykpIHsKKwkJZGV2X2luZm8oJmkyYy0+ZGV2LCAiJXMgcmV2aXNpb24gJWRcbiIsCisJCQkgZ2ZfbW9kc1tpXS5uYW1lLCByZXYgKyAxKTsKKwkJZm9yIChqID0gMDsgaiA8IGdmX21vZHNbaV0ubnVtX2kyY19kZXZzOyBqKyspIHsKKwkJCWlmICghaTJjX25ld19kZXZpY2UoaTJjLT5hZGFwdGVyLAorCQkJCQkgICAgJihnZl9tb2RzW2ldLmkyY19kZXZzW2pdKSkpCisJCQkJZGV2X2VycigmaTJjLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgZGV2OiAlZFxuIiwgcmV0KTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl93YXJuKCZpMmMtPmRldiwgIlVua25vd24gbW9kdWxlIElEICVkIHJldmlzaW9uICVkXG4iLAorCQkJIGlkLCByZXYpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgd2xmX2dmX21vZHVsZV9pZFtdID0geworCXsgIndsZi1nZi1tb2R1bGUiLCAwIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd2xmX2dmX21vZHVsZV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid2xmLWdmLW1vZHVsZSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gd2xmX2dmX21vZHVsZV9wcm9iZSwKKwkuaWRfdGFibGUgPSB3bGZfZ2ZfbW9kdWxlX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd2xmX2dmX21vZHVsZV9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmd2xmX2dmX21vZHVsZV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQod2xmX2dmX21vZHVsZV9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1jcmFnNjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtY3JhZzY0MTAuYwppbmRleCBhZjBjMmZlLi5kMDRiNjU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1jcmFnNjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLWNyYWc2NDEwLmMKQEAgLTQzLDEzICs0MywxNCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXN5cy5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLW1vZGVtLmg+CisjaW5jbHVkZSA8bWFjaC9jcmFnNjQxMC5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8tbWVtcG9ydC5oPgogCisjaW5jbHVkZSA8cGxhdC9zM2M2NDEwLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgogI2luY2x1ZGUgPHBsYXQvZmIuaD4KQEAgLTY1LDE3ICs2Niw2IEBACiAjaW5jbHVkZSA8cGxhdC9paWMuaD4KICNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKLSNpbmNsdWRlIDxzb3VuZC93bTg5OTYuaD4KLSNpbmNsdWRlIDxzb3VuZC93bTg5NjIuaD4KLSNpbmNsdWRlIDxzb3VuZC93bTkwODEuaD4KLQotI2RlZmluZSBCQU5GRl9QTUlDX0lSUV9CQVNFCQlJUlFfQk9BUkRfU1RBUlQKLSNkZWZpbmUgR0xFTkZBUkNMQVNfUE1JQ19JUlFfQkFTRQkoSVJRX0JPQVJEX1NUQVJUICsgNjQpCi0KLSNkZWZpbmUgUENBOTM1WF9HUElPX0JBU0UJCUdQSU9fQk9BUkRfU1RBUlQKLSNkZWZpbmUgQ09ERUNfR1BJT19CQVNFCQkoR1BJT19CT0FSRF9TVEFSVCArIDgpCi0jZGVmaW5lIEdMRU5GQVJDTEFTX1BNSUNfR1BJT19CQVNFCShHUElPX0JPQVJEX1NUQVJUICsgMTYpCi0KIC8qIHNlcmlhbCBwb3J0IHNldHVwICovCiAKICNkZWZpbmUgVUNPTiAoUzNDMjQxMF9VQ09OX0RFRkFVTFQgfCBTM0MyNDEwX1VDT05fVUNMSykKQEAgLTI4Nyw2ICsyNzcsMTEgQEAKIAkuaWQJCT0gLTEsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsb3dsYW5kX2RldmljZSA9IHsKKwkubmFtZQkJPSAibG93bGFuZCIsCisJLmlkCQk9IC0xLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3BleXNpZGVfd204OTYyX2RldmljZSA9IHsKIAkubmFtZQkJPSAic3BleXNpZGUtd204OTYyIiwKIAkuaWQJCT0gLTEsCkBAIC0yOTUsNiArMjkwLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB3YWxsdmRkX2NvbnN1bWVyc1tdID0gewogCVJFR1VMQVRPUl9TVVBQTFkoIlNQS1ZERDEiLCAiMS0wMDFhIiksCiAJUkVHVUxBVE9SX1NVUFBMWSgiU1BLVkREMiIsICIxLTAwMWEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJTUEtWRERMIiwgIjEtMDAxYSIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIlNQS1ZERFIiLCAiMS0wMDFhIiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgd2FsbHZkZF9kYXRhID0gewpAQCAtMzI5LDkgKzMyNiw2IEBACiAJJnMzY19kZXZpY2VfZmIsCiAJJnMzY19kZXZpY2Vfb2hjaSwKIAkmczNjX2RldmljZV91c2JfaHNvdGcsCi0JJnMzY19kZXZpY2VfYWRjLAotCSZzM2NfZGV2aWNlX3J0YywKLQkmczNjX2RldmljZV90cywKIAkmczNjX2RldmljZV90aW1lclswXSwKIAkmczNjNjR4eF9kZXZpY2VfaWlzMCwKIAkmczNjNjR4eF9kZXZpY2VfaWlzMSwKQEAgLTM0NSw2ICszMzksNyBAQAogCSZjcmFnNjQxMF9iYWNrbGlnaHRfZGV2aWNlLAogCSZzcGV5c2lkZV9kZXZpY2UsCiAJJnNwZXlzaWRlX3dtODk2Ml9kZXZpY2UsCisJJmxvd2xhbmRfZGV2aWNlLAogCSZ3YWxsdmRkX2RldmljZSwKIH07CiAKQEAgLTM1Myw2ICszNDgsMTIgQEAKIAkuaXJxX2Jhc2UJPSAwLAogfTsKIAorLyogVkREQVJNIGlzIGNvbnRyb2xsZWQgYnkgRFZTMSBjb25uZWN0ZWQgdG8gR1BLKDApICovCitzdGF0aWMgc3RydWN0IHdtODMxeF9idWNrdl9wZGF0YSB2ZGRhcm1fcGRhdGEgPSB7CisJLmR2c19jb250cm9sX3NyYyA9IDEsCisJLmR2c19ncGlvID0gUzNDNjRYWF9HUEsoMCksCit9OworCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdmRkYXJtX2NvbnN1bWVyc1tdIF9faW5pdGRhdGEgPSB7CiAJUkVHVUxBVE9SX1NVUFBMWSgidmRkYXJtIiwgTlVMTCksCiB9OwpAQCAtMzY4LDYgKzM2OSw3IEBACiAJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUodmRkYXJtX2NvbnN1bWVycyksCiAJLmNvbnN1bWVyX3N1cHBsaWVzID0gdmRkYXJtX2NvbnN1bWVycywKIAkuc3VwcGx5X3JlZ3VsYXRvciA9ICJXQUxMVkREIiwKKwkuZHJpdmVyX2RhdGEgPSAmdmRkYXJtX3BkYXRhLAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHZkZGludCBfX2luaXRkYXRhID0gewpAQCAtNTAzLDYgKzUwNSw4IEBACiAJLmJhY2t1cCA9ICZiYW5mZl9iYWNrdXBfcGRhdGEsCiAKIAkuZ3Bpb19kZWZhdWx0cyA9IHsKKwkJLyogR1BJTzU6IERWUzFfUkVRIC0gQ01PUywgREJWREQsIGFjdGl2ZSBoaWdoICovCisJCVs0XSA9IFdNODMxWF9HUE5fRElSIHwgV004MzFYX0dQTl9QT0wgfCBXTTgzMVhfR1BOX0VOQSB8IDB4OCwKIAkJLyogR1BJTzExOiBUb3VjaHNjcmVlbiBkYXRhIC0gQ01PUywgREJWREQsIGFjdGl2ZSBoaWdoKi8KIAkJWzEwXSA9IFdNODMxWF9HUE5fUE9MIHwgV004MzFYX0dQTl9FTkEgfCAweDYsCiAJCS8qIEdQSU8xMjogVG91Y2hzY3JlZW4gcGVuIGRvd24gLSBDTU9TLCBEQlZERCwgYWN0aXZlIGhpZ2gqLwpAQCAtNTYwLDggKzU2NCwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHB2ZGRfMXY4X2NvbnN1bWVyc1tdIF9faW5pdGRhdGEgPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiTERPVkREIiwgIjEtMDAxYSIpLAogCVJFR1VMQVRPUl9TVVBQTFkoIlBMTFZERCIsICIxLTAwMWEiKSwKIAlSRUdVTEFUT1JfU1VQUExZKCJEQlZERCIsICIxLTAwMWEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJEQlZERDEiLCAiMS0wMDFhIiksCisJUkVHVUxBVE9SX1NVUFBMWSgiREJWREQyIiwgIjEtMDAxYSIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIkRCVkREMyIsICIxLTAwMWEiKSwKIAlSRUdVTEFUT1JfU1VQUExZKCJDUFZERCIsICIxLTAwMWEiKSwKIAlSRUdVTEFUT1JfU1VQUExZKCJBVkREMiIsICIxLTAwMWEiKSwKIAlSRUdVTEFUT1JfU1VQUExZKCJEQ1ZERCIsICIxLTAwMWEiKSwKQEAgLTYxNCw4MSArNjIyLDE2IEBACiAJLmRpc2FibGVfdG91Y2ggPSB0cnVlLAogfTsKIAotc3RhdGljIHN0cnVjdCB3bTg5OTZfcmV0dW5lX21vYmlsZV9jb25maWcgd204OTk2X3JldHVuZVtdID0gewotCXsKLQkJLm5hbWUgPSAiU3ViIExQRiIsCi0JCS5yYXRlID0gNDgwMDAsCi0JCS5yZWdzID0gewotCQkJMHg2MzE4LCAweDYzMDAsIDB4MTAwMCwgMHgwMDAwLCAweDAwMDQsIDB4MjAwMCwgMHhGMDAwLAotCQkJMHgwMDAwLCAweDAwMDQsIDB4MjAwMCwgMHhGMDAwLCAweDAwMDAsIDB4MDAwNCwgMHgyMDAwLAotCQkJMHhGMDAwLCAweDAwMDAsIDB4MDAwNCwgMHgxMDAwLCAweDA4MDAsIDB4NDAwMAotCQl9LAotCX0sCi0JewotCQkubmFtZSA9ICJTdWIgSFBGIiwKLQkJLnJhdGUgPSA0ODAwMCwKLQkJLnJlZ3MgPSB7Ci0JCQkweDAwMEEsIDB4NjMwMCwgMHgxMDAwLCAweDAwMDAsIDB4MDAwNCwgMHgyMDAwLCAweEYwMDAsCi0JCQkweDAwMDAsIDB4MDAwNCwgMHgyMDAwLCAweEYwMDAsIDB4MDAwMCwgMHgwMDA0LCAweDIwMDAsCi0JCQkweEYwMDAsIDB4MDAwMCwgMHgwMDA0LCAweDEwMDAsIDB4MDgwMCwgMHg0MDAwCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgd204OTk2X3BkYXRhIHdtODk5Nl9wZGF0YSBfX2luaXRkYXRhID0gewotCS5sZG9fZW5hID0gUzNDNjRYWF9HUE4oNyksCi0JLmdwaW9fYmFzZSA9IENPREVDX0dQSU9fQkFTRSwKLQkubWljZGV0X2RlZiA9IDEsCi0JLmlubF9tb2RlID0gV004OTk2X0RJRkZFUlJFTlRJQUxfMSwKLQkuaW5yX21vZGUgPSBXTTg5OTZfRElGRkVSUkVOVElBTF8xLAotCi0JLmlycV9mbGFncyA9IElSUUZfVFJJR0dFUl9SSVNJTkcsCi0KLQkuZ3Bpb19kZWZhdWx0ID0gewotCQkweDgwMDEsIC8qIEdQSU8xID09IEFEQ0xSQ0xLMSAqLwotCQkweDgwMDEsIC8qIEdQSU8yID09IEFEQ0xSQ0xLMiwgaW5wdXQgZHVlIHRvIENQVSAqLwotCQkweDAxNDEsIC8qIEdQSU8zID09IEhQX1NFTCAqLwotCQkweDAwMDIsIC8qIEdQSU80ID09IElSUSAqLwotCQkweDAyMGUsIC8qIEdQSU81ID09IENMS09VVCAqLwotCX0sCi0KLQkucmV0dW5lX21vYmlsZV9jZmdzID0gd204OTk2X3JldHVuZSwKLQkubnVtX3JldHVuZV9tb2JpbGVfY2ZncyA9IEFSUkFZX1NJWkUod204OTk2X3JldHVuZSksCi19OwotCi1zdGF0aWMgc3RydWN0IHdtODk2Ml9wZGF0YSB3bTg5NjJfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuZ3Bpb19pbml0ID0gewotCQkwLAotCQlXTTg5NjJfR1BJT19GTl9PUENMSywKLQkJV004OTYyX0dQSU9fRk5fRE1JQ0NMSywKLQkJMCwKLQkJMHg4MDAwIHwgV004OTYyX0dQSU9fRk5fRE1JQ0RBVCwKLQkJV004OTYyX0dQSU9fRk5fSVJRLCAgICAvKiBPcGVuIGRyYWluIG1vZGUgKi8KLQl9LAotCS5pcnFfYWN0aXZlX2xvdyA9IHRydWUsCi19OwotCi1zdGF0aWMgc3RydWN0IHdtOTA4MV9wZGF0YSB3bTkwODFfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuaXJxX2hpZ2ggPSBmYWxzZSwKLQkuaXJxX2Ntb3MgPSBmYWxzZSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjX2RldnMxW10gX19pbml0ZGF0YSA9IHsKIAl7IEkyQ19CT0FSRF9JTkZPKCJ3bTgzMTEiLCAweDM0KSwKIAkgIC5pcnEgPSBTM0NfRUlOVCgwKSwKIAkgIC5wbGF0Zm9ybV9kYXRhID0gJmdsZW5mYXJjbGFzX3BtaWNfcGRhdGEgfSwKIAorCXsgSTJDX0JPQVJEX0lORk8oIndsZi1nZi1tb2R1bGUiLCAweDI0KSB9LAorCXsgSTJDX0JPQVJEX0lORk8oIndsZi1nZi1tb2R1bGUiLCAweDI1KSB9LAorCXsgSTJDX0JPQVJEX0lORk8oIndsZi1nZi1tb2R1bGUiLCAweDI2KSB9LAorCiAJeyBJMkNfQk9BUkRfSU5GTygid20xMjUwLWV2MSIsIDB4MjcpIH0sCi0JeyBJMkNfQk9BUkRfSU5GTygid204OTk2IiwgMHgxYSksCi0JICAucGxhdGZvcm1fZGF0YSA9ICZ3bTg5OTZfcGRhdGEsCi0JICAuaXJxID0gR0xFTkZBUkNMQVNfUE1JQ19JUlFfQkFTRSArIFdNODMxWF9JUlFfR1BJT18yLAotCX0sCi0JeyBJMkNfQk9BUkRfSU5GTygid205MDgxIiwgMHg2YyksCi0JICAucGxhdGZvcm1fZGF0YSA9ICZ3bTkwODFfcGRhdGEsIH0sCi0JeyBJMkNfQk9BUkRfSU5GTygid204OTYyIiwgMHgxYSksCi0JICAucGxhdGZvcm1fZGF0YSA9ICZ3bTg5NjJfcGRhdGEsCi0JICAuaXJxID0gR0xFTkZBUkNMQVNfUE1JQ19JUlFfQkFTRSArIFdNODMxWF9JUlFfR1BJT18yLAotCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgY3JhZzY0MTBfbWFwX2lvKHZvaWQpCkBAIC03NjYsNyArNzA5LDcgQEAKIAogTUFDSElORV9TVEFSVChXTEZfQ1JBR0dfNjQxMCwgIldvbGZzb24gQ3JhZ2dhbm1vcmUgNjQxMCIpCiAJLyogTWFpbnRhaW5lcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X2lycQk9IHMzYzY0MTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBjcmFnNjQxMF9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IGNyYWc2NDEwX21hY2hpbmVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLWhtdC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtaG10LmMKaW5kZXggYjNkOTNjYy4uOTUyZjc1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtaG10LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtaG10LmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxwbGF0L2ZiLmg+CiAjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CiAKLSNpbmNsdWRlIDxtYWNoL3MzYzY0MTAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KQEAgLTI2NSw3ICsyNjUsNyBAQAogCiBNQUNISU5FX1NUQVJUKEhNVCwgIkFpcmdvby1ITVQiKQogCS8qIE1haW50YWluZXI6IFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X2lycQk9IHMzYzY0MTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBobXRfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBobXRfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtbWluaTY0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLW1pbmk2NDEwLmMKaW5kZXggNTI3ZjQ5Yi4uMWJjODVjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtbWluaTY0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1taW5pNjQxMC5jCkBAIC0zMiw4ICszMiw4IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbW9kZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3Mtc3JvbS5oPgotI2luY2x1ZGUgPG1hY2gvczNjNjQxMC5oPgogCisjaW5jbHVkZSA8cGxhdC9zM2M2NDEwLmg+CiAjaW5jbHVkZSA8cGxhdC9hZGMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgpAQCAtMjA1LDEyICsyMDUsNiBAQAogCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZtaW5pNjQxMF9sY2RfcG93ZXJfZGF0YSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gczNjX3RzX3BsYXRmb3JtIF9faW5pdGRhdGEgPSB7Ci0JLmRlbGF5CQkJPSAxMDAwMCwKLQkucHJlc2MJCQk9IDQ5LAotCS5vdmVyc2FtcGxpbmdfc2hpZnQJPSAyLAotfTsKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1pbmk2NDEwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZtaW5pNjQxMF9kZXZpY2VfZXRoLAogCSZzM2NfZGV2aWNlX2hzbW1jMCwKQEAgLTMxOSw3ICszMTMsNyBAQAogCiAJczNjX25hbmRfc2V0X3BsYXRkYXRhKCZtaW5pNjQxMF9uYW5kX2luZm8pOwogCXMzY19mYl9zZXRfcGxhdGRhdGEoJm1pbmk2NDEwX2xjZF9wZGF0YSk7Ci0JczNjMjR4eF90c19zZXRfcGxhdGRhdGEoJnMzY190c19wbGF0Zm9ybSk7CisJczNjMjR4eF90c19zZXRfcGxhdGRhdGEoTlVMTCk7CiAKIAkvKiBjb25maWd1cmUgbkNTMSB3aWR0aCB0byAxNiBiaXRzICovCiAKQEAgLTM0OSw3ICszNDMsNyBAQAogCiBNQUNISU5FX1NUQVJUKE1JTkk2NDEwLCAiTUlOSTY0MTAiKQogCS8qIE1haW50YWluZXI6IERhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X2lycQk9IHMzYzY0MTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBtaW5pNjQxMF9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IG1pbmk2NDEwX21hY2hpbmVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLW5jcC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtbmNwLmMKaW5kZXggMDFjNjg1Ny4uY2IxM2NiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtbmNwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtbmNwLmMKQEAgLTM5LDcgKzM5LDcgQEAKICNpbmNsdWRlIDxwbGF0L2lpYy5oPgogI2luY2x1ZGUgPHBsYXQvZmIuaD4KIAotI2luY2x1ZGUgPG1hY2gvczNjNjQxMC5oPgorI2luY2x1ZGUgPHBsYXQvczNjNjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgpAQCAtOTcsNyArOTcsNyBAQAogCiBNQUNISU5FX1NUQVJUKE5DUCwgIk5DUCIpCiAJLyogTWFpbnRhaW5lcjogU2Ftc3VuZyBFbGVjdHJvbmljcyAqLwotCS5ib290X3BhcmFtcwk9IFMzQzY0WFhfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9pcnEJPSBzM2M2NDEwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gbmNwX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gbmNwX21hY2hpbmVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXJlYWw2NDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1yZWFsNjQxMC5jCmluZGV4IDk1YjA0YjEuLjg3MjgxZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXJlYWw2NDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtcmVhbDY0MTAuYwpAQCAtMzMsOCArMzMsOCBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLW1vZGVtLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXNyb20uaD4KLSNpbmNsdWRlIDxtYWNoL3MzYzY0MTAuaD4KIAorI2luY2x1ZGUgPHBsYXQvczNjNjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvYWRjLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KQEAgLTE5OCwxMiArMTk4LDYgQEAKIAkmczNjX2RldmljZV9vaGNpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyBzM2NfdHNfcGxhdGZvcm0gX19pbml0ZGF0YSA9IHsKLQkuZGVsYXkJCQk9IDEwMDAwLAotCS5wcmVzYwkJCT0gNDksCi0JLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCi19OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgcmVhbDY0MTBfbWFwX2lvKHZvaWQpCiB7CiAJdTMyIHRtcDsKQEAgLTMwMCw3ICsyOTQsNyBAQAogCiAJczNjX2ZiX3NldF9wbGF0ZGF0YSgmcmVhbDY0MTBfbGNkX3BkYXRhKTsKIAlzM2NfbmFuZF9zZXRfcGxhdGRhdGEoJnJlYWw2NDEwX25hbmRfaW5mbyk7Ci0JczNjMjR4eF90c19zZXRfcGxhdGRhdGEoJnMzY190c19wbGF0Zm9ybSk7CisJczNjMjR4eF90c19zZXRfcGxhdGRhdGEoTlVMTCk7CiAKIAkvKiBjb25maWd1cmUgbkNTMSB3aWR0aCB0byAxNiBiaXRzICovCiAKQEAgLTMyOSw3ICszMjMsNyBAQAogCiBNQUNISU5FX1NUQVJUKFJFQUw2NDEwLCAiUkVBTDY0MTAiKQogCS8qIE1haW50YWluZXI6IERhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmluaXRfaXJxCT0gczNjNjQxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHJlYWw2NDEwX21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtYXJ0cTUuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtYXJ0cTUuYwppbmRleCAzNDJlOGRmLi45NGM4MzFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWFydHE1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNS5jCkBAIC0yMiw4ICsyMiw4IEBACiAKICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CiAKKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvZmIuaD4KQEAgLTE0Niw3ICsxNDYsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNNQVJUUTUsICJTbWFydFEgNSIpCiAJLyogTWFpbnRhaW5lcjogTWF1cnVzIEN1ZWxlbmFlcmUgPG1jdWVsZW5hZXJlIEFUIGdtYWlsIERPVCBjb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X2lycQk9IHMzYzY0MTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBzbWFydHFfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBzbWFydHE1X21hY2hpbmVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtYXJ0cTcuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtYXJ0cTcuYwppbmRleCA1Nzk2Mzk3Li5mMTEyNTQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWFydHE3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNy5jCkBAIC0yMiw4ICsyMiw4IEBACiAKICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CiAKKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvZmIuaD4KQEAgLTE2Miw3ICsxNjIsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNNQVJUUTcsICJTbWFydFEgNyIpCiAJLyogTWFpbnRhaW5lcjogTWF1cnVzIEN1ZWxlbmFlcmUgPG1jdWVsZW5hZXJlIEFUIGdtYWlsIERPVCBjb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X2lycQk9IHMzYzY0MTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBzbWFydHFfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBzbWFydHE3X21hY2hpbmVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtZGs2NDAwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWRrNjQwMC5jCmluZGV4IDNjY2E2NDIuLjczNDUwYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtZGs2NDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21kazY0MDAuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogCi0jaW5jbHVkZSA8bWFjaC9zM2M2NDAwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDAwLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CkBAIC04NSw3ICs4NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoU01ESzY0MDAsICJTTURLNjQwMCIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzY0WFhfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAogCS5pbml0X2lycQk9IHMzYzY0MDBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBzbWRrNjQwMF9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWRrNjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21kazY0MTAuYwppbmRleCBhOWYzMTgzLi44YmM4ZWRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWRrNjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtZGs2NDEwLmMKQEAgLTYzLDcgKzYzLDcgQEAKICNpbmNsdWRlIDxwbGF0L2ZiLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgogCi0jaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDEwLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CkBAIC02MTksMTIgKzYxOSw2IEBACiAJeyBJMkNfQk9BUkRfSU5GTygiMjRjMTI4IiwgMHg1NyksIH0sCS8qIFNhbXN1bmcgUzUyNEFEMFhEMSAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyBzM2NfdHNfcGxhdGZvcm0gX19pbml0ZGF0YSA9IHsKLQkuZGVsYXkJCQk9IDEwMDAwLAotCS5wcmVzYwkJCT0gNDksCi0JLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCi19OwotCiAvKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21kazY0MTBfYmxfZ3Bpb19pbmZvID0gewogCS5ubyA9IFMzQzY0WFhfR1BGKDE1KSwKQEAgLTY2Niw3ICs2NjAsNyBAQAogCiAJc2Ftc3VuZ19rZXlwYWRfc2V0X3BsYXRkYXRhKCZzbWRrNjQxMF9rZXlwYWRfZGF0YSk7CiAKLQlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YSgmczNjX3RzX3BsYXRmb3JtKTsKKwlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShOVUxMKTsKIAogCS8qIGNvbmZpZ3VyZSBuQ1MxIHdpZHRoIHRvIDE2IGJpdHMgKi8KIApAQCAtNzAzLDcgKzY5Nyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoU01ESzY0MTAsICJTTURLNjQxMCIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzY0WFhfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAogCS5pbml0X2lycQk9IHMzYzY0MTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBzbWRrNjQxMF9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvcG0uYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9wbS5jCmluZGV4IDA1NWUyODUuLmIzNzVjZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9wbS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXN5c2Nvbi1wb3dlci5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLW1lbXBvcnQuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtbW9kZW0uaD4KIAogI2lmZGVmIENPTkZJR19TM0NfUE1fREVCVUdfTEVEX1NNREsKIHZvaWQgczNjX3BtX2RlYnVnX3NtZGtsZWQodTMyIHNldCwgdTMyIGNsZWFyKQpAQCAtODUsNiArODYsOSBAQAogCVNBVkVfSVRFTShTM0M2NFhYX01FTTBDT05TTFAwKSwKIAlTQVZFX0lURU0oUzNDNjRYWF9NRU0wQ09OU0xQMSksCiAJU0FWRV9JVEVNKFMzQzY0WFhfTUVNMUNPTlNMUCksCisKKwlTQVZFX0lURU0oUzNDNjRYWF9TRE1BX1NFTCksCisJU0FWRV9JVEVNKFMzQzY0WFhfTU9ERU1fTUlGUENPTiksCiB9OwogCiB2b2lkIHMzY19wbV9jb25maWd1cmVfZXh0aW50KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvczNjNjQwMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3MzYzY0MDAuYwppbmRleCA1ZTkzZmUzLi43YTNiYzMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvczNjNjQwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zM2M2NDAwLmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CiAjaW5jbHVkZSA8cGxhdC9paWMtY29yZS5oPgogI2luY2x1ZGUgPHBsYXQvb25lbmFuZC1jb3JlLmg+Ci0jaW5jbHVkZSA8bWFjaC9zM2M2NDAwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDAwLmg+CiAKIHZvaWQgX19pbml0IHMzYzY0MDBfbWFwX2lvKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvczNjNjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3MzYzY0MTAuYwppbmRleCAzMTJhYTZiLi40MTE3MDAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvczNjNjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zM2M2NDEwLmMKQEAgLTQxLDggKzQxLDggQEAKICNpbmNsdWRlIDxwbGF0L2FkYy1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9paWMtY29yZS5oPgogI2luY2x1ZGUgPHBsYXQvb25lbmFuZC1jb3JlLmg+Ci0jaW5jbHVkZSA8bWFjaC9zM2M2NDAwLmg+Ci0jaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDAwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDEwLmg+CiAKIHZvaWQgX19pbml0IHMzYzY0MTBfbWFwX2lvKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvc2V0dXAtc2RoY2kuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zZXR1cC1zZGhjaS5jCmluZGV4IGYzNDRhMjIuLmM3NWE3MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zZXR1cC1zZGhjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zZXR1cC1zZGhjaS5jCkBAIC0xMiwxNyArMTIsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNkaGNpLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgogCiAvKiBjbG9jayBzb3VyY2VzIGZvciB0aGUgbW1jIGJ1cyBjbG9jaywgb3JkZXIgYXMgZm9yIHRoZSBjdHJsMls1Li40XSAqLwogCkBAIC0zMiw0MSArMjIsMyBAQAogCVsyXSA9ICJtbWNfYnVzIiwKIAkvKiBbM10gPSAiNDhtIiwgLSBub3RlIG5vdCBzdWNjZXNzZnVsbHkgdXNlZCB5ZXQgKi8KIH07Ci0KLXZvaWQgczNjNjQwMF9zZXR1cF9zZGhjaV9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCQkJICB2b2lkIF9faW9tZW0gKnIsCi0JCQkJICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCSAgc3RydWN0IG1tY19jYXJkICpjYXJkKQotewotCXUzMiBjdHJsMiwgY3RybDM7Ci0KLQljdHJsMiA9IHJlYWRsKHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwotCWN0cmwyICY9IFMzQ19TREhDSV9DVFJMMl9TRUxCQVNFQ0xLX01BU0s7Ci0JY3RybDIgfD0gKFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5TVEFBU1lOQ0NMUiB8Ci0JCSAgUzNDNjRYWF9TREhDSV9DVFJMMl9FTkNNRENORk1TSyB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0VORkJDTEtSWCB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0RGQ05UX05PTkUgfAotCQkgIFMzQ19TREhDSV9DVFJMMl9FTkNMS09VVEhPTEQpOwotCi0JaWYgKGlvcy0+Y2xvY2sgPCAyNSAqIDEwMDAwMDApCi0JCWN0cmwzID0gKFMzQ19TREhDSV9DVFJMM19GQ1NFTDMgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDIgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDEgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCWVsc2UKLQkJY3RybDMgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8IFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCi0JcHJfZGVidWcoIiVzOiBDVFJMIDI9JTA4eCwgMz0lMDh4XG4iLCBfX2Z1bmNfXywgY3RybDIsIGN0cmwzKTsKLQl3cml0ZWwoY3RybDIsIHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwotCXdyaXRlbChjdHJsMywgciArIFMzQ19TREhDSV9DT05UUk9MMyk7Ci19Ci0KLXZvaWQgczNjNjQxMF9zZXR1cF9zZGhjaV9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCQkJICB2b2lkIF9faW9tZW0gKnIsCi0JCQkJICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCSAgc3RydWN0IG1tY19jYXJkICpjYXJkKQotewotCXdyaXRlbChTM0M2NFhYX1NESENJX0NPTlRST0w0X0RSSVZFXzltQSwgciArIFMzQzY0WFhfU0RIQ0lfQ09OVFJPTDQpOwotCi0JczNjNjQwMF9zZXR1cF9zZGhjaV9jZmdfY2FyZChkZXYsIHIsIGlvcywgY2FyZCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9LY29uZmlnCmluZGV4IDY1Yzc1MTguLjE4NjkwYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9LY29uZmlnCkBAIC05LDE4ICs5LDI4IEBACiAKIGNvbmZpZyBDUFVfUzVQNjQ0MAogCWJvb2wKLQlzZWxlY3QgUzNDX1BMMzMwX0RNQQorCXNlbGVjdCBTQU1TVU5HX0RNQURFVgogCXNlbGVjdCBTNVBfSFJUCisJc2VsZWN0IFM1UF9TTEVFUCBpZiBQTQorCXNlbGVjdCBTQU1TVU5HX1dBS0VNQVNLIGlmIFBNCiAJaGVscAogCSAgRW5hYmxlIFM1UDY0NDAgQ1BVIHN1cHBvcnQKIAogY29uZmlnIENQVV9TNVA2NDUwCiAJYm9vbAotCXNlbGVjdCBTM0NfUEwzMzBfRE1BCisJc2VsZWN0IFNBTVNVTkdfRE1BREVWCiAJc2VsZWN0IFM1UF9IUlQKKwlzZWxlY3QgUzVQX1NMRUVQIGlmIFBNCisJc2VsZWN0IFNBTVNVTkdfV0FLRU1BU0sgaWYgUE0KIAloZWxwCiAJICBFbmFibGUgUzVQNjQ1MCBDUFUgc3VwcG9ydAogCitjb25maWcgUzVQNjRYMF9TRVRVUF9GQl8yNEJQUAorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgUzVQNjRYMCBiYXNlZCBib2FyZHMgd2l0aCBhIExDRCBkaXNwbGF5CisJICB0aHJvdWdoIFJHQiBpbnRlcmZhY2UuCisKIGNvbmZpZyBTNVA2NFgwX1NFVFVQX0kyQzEKIAlib29sCiAJaGVscApAQCAtMzEsNiArNDEsNyBAQAogY29uZmlnIE1BQ0hfU01ESzY0NDAKIAlib29sICJTTURLNjQ0MCIKIAlzZWxlY3QgQ1BVX1M1UDY0NDAKKwlzZWxlY3QgUzNDX0RFVl9GQgogCXNlbGVjdCBTM0NfREVWX0kyQzEKIAlzZWxlY3QgUzNDX0RFVl9SVEMKIAlzZWxlY3QgUzNDX0RFVl9XRFQKQEAgLTM5LDYgKzUwLDcgQEAKIAlzZWxlY3QgU0FNU1VOR19ERVZfQkFDS0xJR0hUCiAJc2VsZWN0IFNBTVNVTkdfREVWX1BXTQogCXNlbGVjdCBTQU1TVU5HX0RFVl9UUworCXNlbGVjdCBTNVA2NFgwX1NFVFVQX0ZCXzI0QlBQCiAJc2VsZWN0IFM1UDY0WDBfU0VUVVBfSTJDMQogCWhlbHAKIAkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgdGhlIFNhbXN1bmcgU01ESzY0NDAKQEAgLTQ2LDYgKzU4LDcgQEAKIGNvbmZpZyBNQUNIX1NNREs2NDUwCiAJYm9vbCAiU01ESzY0NTAiCiAJc2VsZWN0IENQVV9TNVA2NDUwCisJc2VsZWN0IFMzQ19ERVZfRkIKIAlzZWxlY3QgUzNDX0RFVl9JMkMxCiAJc2VsZWN0IFMzQ19ERVZfUlRDCiAJc2VsZWN0IFMzQ19ERVZfV0RUCkBAIC01NCw2ICs2Nyw3IEBACiAJc2VsZWN0IFNBTVNVTkdfREVWX0JBQ0tMSUdIVAogCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KIAlzZWxlY3QgU0FNU1VOR19ERVZfVFMKKwlzZWxlY3QgUzVQNjRYMF9TRVRVUF9GQl8yNEJQUAogCXNlbGVjdCBTNVA2NFgwX1NFVFVQX0kyQzEKIAloZWxwCiAJICBNYWNoaW5lIHN1cHBvcnQgZm9yIHRoZSBTYW1zdW5nIFNNREs2NDUwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvTWFrZWZpbGUKaW5kZXggNWY2YWZkZi4uYTEzMjRkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9NYWtlZmlsZQpAQCAtMTIsMTAgKzEyLDExIEBACiAKICMgQ29yZSBzdXBwb3J0IGZvciBTNVA2NFgwIHN5c3RlbQogCi1vYmotJChDT05GSUdfQVJDSF9TNVA2NFgwKQkrPSBjcHUubyBpbml0Lm8gY2xvY2subyBkbWEubyBncGlvbGliLm8KK29iai0kKENPTkZJR19BUkNIX1M1UDY0WDApCSs9IGNwdS5vIGluaXQubyBjbG9jay5vIGRtYS5vCiBvYmotJChDT05GSUdfQVJDSF9TNVA2NFgwKQkrPSBzZXR1cC1pMmMwLm8gaXJxLWVpbnQubwogb2JqLSQoQ09ORklHX0NQVV9TNVA2NDQwKQkrPSBjbG9jay1zNXA2NDQwLm8KIG9iai0kKENPTkZJR19DUFVfUzVQNjQ1MCkJKz0gY2xvY2stczVwNjQ1MC5vCitvYmotJChDT05GSUdfUE0pCQkrPSBwbS5vIGlycS1wbS5vCiAKICMgbWFjaGluZSBzdXBwb3J0CiAKQEAgLTI4LDMgKzI5LDQgQEAKIG9iai0kKENPTkZJR19TM0M2NFhYX0RFVl9TUEkpCSs9IGRldi1zcGkubwogCiBvYmotJChDT05GSUdfUzVQNjRYMF9TRVRVUF9JMkMxKQkrPSBzZXR1cC1pMmMxLm8KK29iai0kKENPTkZJR19TNVA2NFgwX1NFVFVQX0ZCXzI0QlBQKQkrPSBzZXR1cC1mYi0yNGJwcC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NDAuYwppbmRleCAwZTljZDMwLi5jNTRjNjVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDQwLmMKQEAgLTE0Niw3ICsxNDYsOCBAQAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfaGNsazBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKIAl9LCB7Ci0JCS5uYW1lCQk9ICJwZG1hIiwKKwkJLm5hbWUJCT0gImRtYSIsCisJCS5kZXZuYW1lCT0gImRtYS1wbDMzMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKQEAgLTQ5OSw2ICs1MDAsMTEgQEAKIAkmY2xrX3BjbGtfbG93LAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgZHVtbXlfYXBiX3BjbGsgPSB7CisJLm5hbWUJCT0gImFwYl9wY2xrIiwKKwkuaWQJCT0gLTEsCit9OworCiB2b2lkIF9faW5pdF9vcl9jcHVmcmVxIHM1cDY0NDBfc2V0dXBfY2xvY2tzKHZvaWQpCiB7CiAJc3RydWN0IGNsayAqeHRhbF9jbGs7CkBAIC01ODEsNSArNTg3LDcgQEAKIAlzM2NfcmVnaXN0ZXJfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKIAlzM2NfZGlzYWJsZV9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOwogCisJczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmZHVtbXlfYXBiX3BjbGspOworCiAJczNjX3B3bWNsa19pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ1MC5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NTAuYwppbmRleCBkOWRjMTZjLi4yZDA0YWJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDUwLmMKQEAgLTE3OSw3ICsxNzksOCBAQAogCQkuZW5hYmxlCQk9IHM1cDY0eDBfaGNsazBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKIAl9LCB7Ci0JCS5uYW1lCQk9ICJwZG1hIiwKKwkJLm5hbWUJCT0gImRtYSIsCisJCS5kZXZuYW1lCT0gImRtYS1wbDMzMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKQEAgLTU1Myw2ICs1NTQsMTEgQEAKIAkmY2xrX3NjbGtfYXVkaW8wLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgZHVtbXlfYXBiX3BjbGsgPSB7CisJLm5hbWUJCT0gImFwYl9wY2xrIiwKKwkuaWQJCT0gLTEsCit9OworCiB2b2lkIF9faW5pdF9vcl9jcHVmcmVxIHM1cDY0NTBfc2V0dXBfY2xvY2tzKHZvaWQpCiB7CiAJc3RydWN0IGNsayAqeHRhbF9jbGs7CkBAIC02MzIsNSArNjM4LDcgQEAKIAlzM2NfcmVnaXN0ZXJfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKIAlzM2NfZGlzYWJsZV9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOwogCisJczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmZHVtbXlfYXBiX3BjbGspOworCiAJczNjX3B3bWNsa19pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY3B1LmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY3B1LmMKaW5kZXggYTVjMDA5NS4uZWNhYjQwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2NwdS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jcHUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpAQCAtMzgsNiArMzksNyBAQAogI2luY2x1ZGUgPHBsYXQvczVwNjQ0MC5oPgogI2luY2x1ZGUgPHBsYXQvczVwNjQ1MC5oPgogI2luY2x1ZGUgPHBsYXQvYWRjLWNvcmUuaD4KKyNpbmNsdWRlIDxwbGF0L2ZiLWNvcmUuaD4KIAogLyogSW5pdGlhbCBJTyBtYXBwaW5ncyAqLwogCkBAIC0xMDgsMTggKzExMCwyMiBAQAogewogCS8qIGluaXRpYWxpemUgYW55IGRldmljZSBpbmZvcm1hdGlvbiBlYXJseSAqLwogCXMzY19hZGNfc2V0bmFtZSgiczNjNjR4eC1hZGMiKTsKKwlzM2NfZmJfc2V0bmFtZSgiczVwNjR4MC1mYiIpOwogCiAJaW90YWJsZV9pbml0KHM1cDY0eDBfaW9kZXNjLCBBUlJBWV9TSVpFKHM1cDY0eDBfaW9kZXNjKSk7CiAJaW90YWJsZV9pbml0KHM1cDY0NDBfaW9kZXNjLCBBUlJBWV9TSVpFKHM1cDY0NDBfaW9kZXNjKSk7CisJaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKFNaXzhNKTsKIH0KIAogdm9pZCBfX2luaXQgczVwNjQ1MF9tYXBfaW8odm9pZCkKIHsKIAkvKiBpbml0aWFsaXplIGFueSBkZXZpY2UgaW5mb3JtYXRpb24gZWFybHkgKi8KIAlzM2NfYWRjX3NldG5hbWUoInMzYzY0eHgtYWRjIik7CisJczNjX2ZiX3NldG5hbWUoInM1cDY0eDAtZmIiKTsKIAogCWlvdGFibGVfaW5pdChzNXA2NHgwX2lvZGVzYywgQVJSQVlfU0laRShzNXA2NHgwX2lvZGVzYykpOwogCWlvdGFibGVfaW5pdChzNXA2NDUwX2lvZGVzYywgQVJSQVlfU0laRShzNXA2NDUwX2lvZGVzYykpOworCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZShTWl84TSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZGV2LXNwaS5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Rldi1zcGkuYwppbmRleCBhYzgyNWU4Li4xZmQ5Yzc5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZGV2LXNwaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kZXYtc3BpLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL3NwaS1jbG9ja3MuaD4KIAorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9zM2M2NHh4LXNwaS5oPgogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KIApAQCAtMTg1LDExICsxODYsOCBAQAogCiB2b2lkIF9faW5pdCBzNXA2NHgwX3NwaV9zZXRfaW5mbyhpbnQgY250cmxyLCBpbnQgc3JjX2Nsa19uciwgaW50IG51bV9jcykKIHsKLQl1bnNpZ25lZCBpbnQgaWQ7CiAJc3RydWN0IHMzYzY0eHhfc3BpX2luZm8gKnBkOwogCi0JaWQgPSBfX3Jhd19yZWFkbChTNVA2NFgwX1NZU19JRCkgJiAweEZGMDAwOwotCiAJLyogUmVqZWN0IGludmFsaWQgY29uZmlndXJhdGlvbiAqLwogCWlmICghbnVtX2NzIHx8IHNyY19jbGtfbnIgPCAwCiAJCQl8fCBzcmNfY2xrX25yID4gUzVQNjRYMF9TUElfU1JDQ0xLX1NDTEspIHsKQEAgLTE5OSw3ICsxOTcsNyBAQAogCiAJc3dpdGNoIChjbnRybHIpIHsKIAljYXNlIDA6Ci0JCWlmIChpZCA9PSAweDUwMDAwKQorCQlpZiAoc29jX2lzX3M1cDY0NTAoKSkKIAkJCXBkID0gJnM1cDY0NTBfc3BpMF9wZGF0YTsKIAkJZWxzZQogCQkJcGQgPSAmczVwNjQ0MF9zcGkwX3BkYXRhOwpAQCAtMjA3LDcgKzIwNSw3IEBACiAJCXM1cDY0eDBfZGV2aWNlX3NwaTAuZGV2LnBsYXRmb3JtX2RhdGEgPSBwZDsKIAkJYnJlYWs7CiAJY2FzZSAxOgotCQlpZiAoaWQgPT0gMHg1MDAwMCkKKwkJaWYgKHNvY19pc19zNXA2NDUwKCkpCiAJCQlwZCA9ICZzNXA2NDUwX3NwaTFfcGRhdGE7CiAJCWVsc2UKIAkJCXBkID0gJnM1cDY0NDBfc3BpMV9wZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kbWEuYwppbmRleCBkN2FkOTQ0Li40NDJkZDRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2RtYS5jCkBAIC0yMSwxMjggKzIxLDIxOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwzMzAuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9zM2MtcGwzMzAtcGRhdGEuaD4KKyNpbmNsdWRlIDxwbGF0L2lycXMuaD4KIAogc3RhdGljIHU2NCBkbWFfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwNjR4MF9wZG1hX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTNVA2NFgwX1BBX1BETUEsCi0JCS5lbmQJPSBTNVA2NFgwX1BBX1BETUEgKyBTWl80SywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9ETUEwLAotCQkuZW5kCT0gSVJRX0RNQTAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorc3RydWN0IGRtYV9wbDMzMF9wZXJpIHM1cDY0NDBfcGRtYV9wZXJpWzIyXSA9IHsKKwl7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUM19UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSBETUFDSF9NQVgsCisJfSwgeworCQkucGVyaV9pZCA9IERNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2NfcGwzMzBfcGxhdGRhdGEgczVwNjQ0MF9wZG1hX3BkYXRhID0gewotCS5wZXJpID0gewotCQlbMF0gPSBETUFDSF9VQVJUMF9SWCwKLQkJWzFdID0gRE1BQ0hfVUFSVDBfVFgsCi0JCVsyXSA9IERNQUNIX1VBUlQxX1JYLAotCQlbM10gPSBETUFDSF9VQVJUMV9UWCwKLQkJWzRdID0gRE1BQ0hfVUFSVDJfUlgsCi0JCVs1XSA9IERNQUNIX1VBUlQyX1RYLAotCQlbNl0gPSBETUFDSF9VQVJUM19SWCwKLQkJWzddID0gRE1BQ0hfVUFSVDNfVFgsCi0JCVs4XSA9IERNQUNIX01BWCwKLQkJWzldID0gRE1BQ0hfTUFYLAotCQlbMTBdID0gRE1BQ0hfUENNMF9UWCwKLQkJWzExXSA9IERNQUNIX1BDTTBfUlgsCi0JCVsxMl0gPSBETUFDSF9JMlMwX1RYLAotCQlbMTNdID0gRE1BQ0hfSTJTMF9SWCwKLQkJWzE0XSA9IERNQUNIX1NQSTBfVFgsCi0JCVsxNV0gPSBETUFDSF9TUEkwX1JYLAotCQlbMTZdID0gRE1BQ0hfTUFYLAotCQlbMTddID0gRE1BQ0hfTUFYLAotCQlbMThdID0gRE1BQ0hfTUFYLAotCQlbMTldID0gRE1BQ0hfTUFYLAotCQlbMjBdID0gRE1BQ0hfU1BJMV9UWCwKLQkJWzIxXSA9IERNQUNIX1NQSTFfUlgsCi0JCVsyMl0gPSBETUFDSF9NQVgsCi0JCVsyM10gPSBETUFDSF9NQVgsCi0JCVsyNF0gPSBETUFDSF9NQVgsCi0JCVsyNV0gPSBETUFDSF9NQVgsCi0JCVsyNl0gPSBETUFDSF9NQVgsCi0JCVsyN10gPSBETUFDSF9NQVgsCi0JCVsyOF0gPSBETUFDSF9NQVgsCi0JCVsyOV0gPSBETUFDSF9QV00sCi0JCVszMF0gPSBETUFDSF9NQVgsCi0JCVszMV0gPSBETUFDSF9NQVgsCitzdHJ1Y3QgZG1hX3BsMzMwX3BsYXRkYXRhIHM1cDY0NDBfcGRtYV9wZGF0YSA9IHsKKwkubnJfdmFsaWRfcGVyaSA9IEFSUkFZX1NJWkUoczVwNjQ0MF9wZG1hX3BlcmkpLAorCS5wZXJpID0gczVwNjQ0MF9wZG1hX3BlcmksCit9OworCitzdHJ1Y3QgZG1hX3BsMzMwX3BlcmkgczVwNjQ1MF9wZG1hX3BlcmlbMzJdID0geworCXsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUNF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDRfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VTSV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVVNJX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NQVgsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMyX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QV00sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUNV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDVfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2NfcGwzMzBfcGxhdGRhdGEgczVwNjQ1MF9wZG1hX3BkYXRhID0gewotCS5wZXJpID0gewotCQlbMF0gPSBETUFDSF9VQVJUMF9SWCwKLQkJWzFdID0gRE1BQ0hfVUFSVDBfVFgsCi0JCVsyXSA9IERNQUNIX1VBUlQxX1JYLAotCQlbM10gPSBETUFDSF9VQVJUMV9UWCwKLQkJWzRdID0gRE1BQ0hfVUFSVDJfUlgsCi0JCVs1XSA9IERNQUNIX1VBUlQyX1RYLAotCQlbNl0gPSBETUFDSF9VQVJUM19SWCwKLQkJWzddID0gRE1BQ0hfVUFSVDNfVFgsCi0JCVs4XSA9IERNQUNIX1VBUlQ0X1JYLAotCQlbOV0gPSBETUFDSF9VQVJUNF9UWCwKLQkJWzEwXSA9IERNQUNIX1BDTTBfVFgsCi0JCVsxMV0gPSBETUFDSF9QQ00wX1JYLAotCQlbMTJdID0gRE1BQ0hfSTJTMF9UWCwKLQkJWzEzXSA9IERNQUNIX0kyUzBfUlgsCi0JCVsxNF0gPSBETUFDSF9TUEkwX1RYLAotCQlbMTVdID0gRE1BQ0hfU1BJMF9SWCwKLQkJWzE2XSA9IERNQUNIX1BDTTFfVFgsCi0JCVsxN10gPSBETUFDSF9QQ00xX1JYLAotCQlbMThdID0gRE1BQ0hfUENNMl9UWCwKLQkJWzE5XSA9IERNQUNIX1BDTTJfUlgsCi0JCVsyMF0gPSBETUFDSF9TUEkxX1RYLAotCQlbMjFdID0gRE1BQ0hfU1BJMV9SWCwKLQkJWzIyXSA9IERNQUNIX1VTSV9UWCwKLQkJWzIzXSA9IERNQUNIX1VTSV9SWCwKLQkJWzI0XSA9IERNQUNIX01BWCwKLQkJWzI1XSA9IERNQUNIX0kyUzFfVFgsCi0JCVsyNl0gPSBETUFDSF9JMlMxX1JYLAotCQlbMjddID0gRE1BQ0hfSTJTMl9UWCwKLQkJWzI4XSA9IERNQUNIX0kyUzJfUlgsCi0JCVsyOV0gPSBETUFDSF9QV00sCi0JCVszMF0gPSBETUFDSF9VQVJUNV9SWCwKLQkJWzMxXSA9IERNQUNIX1VBUlQ1X1RYLAotCX0sCitzdHJ1Y3QgZG1hX3BsMzMwX3BsYXRkYXRhIHM1cDY0NTBfcGRtYV9wZGF0YSA9IHsKKwkubnJfdmFsaWRfcGVyaSA9IEFSUkFZX1NJWkUoczVwNjQ1MF9wZG1hX3BlcmkpLAorCS5wZXJpID0gczVwNjQ1MF9wZG1hX3BlcmksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NHgwX2RldmljZV9wZG1hID0gewotCS5uYW1lCQk9ICJzM2MtcGwzMzAiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwNjR4MF9wZG1hX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzNXA2NHgwX3BkbWFfcmVzb3VyY2UsCi0JLmRldgkJPSB7CitzdHJ1Y3QgYW1iYV9kZXZpY2UgczVwNjR4MF9kZXZpY2VfcGRtYSA9IHsKKwkuZGV2ID0geworCQkuaW5pdF9uYW1lID0gImRtYS1wbDMzMCIsCiAJCS5kbWFfbWFzayA9ICZkbWFfZG1hbWFzaywKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKIAl9LAorCS5yZXMgPSB7CisJCS5zdGFydCA9IFM1UDY0WDBfUEFfUERNQSwKKwkJLmVuZCA9IFM1UDY0WDBfUEFfUERNQSArIFNaXzRLLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCS5pcnEgPSB7SVJRX0RNQTAsIE5PX0lSUX0sCisJLnBlcmlwaGlkID0gMHgwMDA0MTMzMCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHM1cDY0eDBfZG1hX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQlpZCA9IF9fcmF3X3JlYWRsKFM1UDY0WDBfU1lTX0lEKSAmIDB4RkYwMDA7Ci0KLQlpZiAoaWQgPT0gMHg1MDAwMCkKKwlpZiAoc29jX2lzX3M1cDY0NTAoKSkKIAkJczVwNjR4MF9kZXZpY2VfcGRtYS5kZXYucGxhdGZvcm1fZGF0YSA9ICZzNXA2NDUwX3BkbWFfcGRhdGE7CiAJZWxzZQogCQlzNXA2NHgwX2RldmljZV9wZG1hLmRldi5wbGF0Zm9ybV9kYXRhID0gJnM1cDY0NDBfcGRtYV9wZGF0YTsKIAotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmczVwNjR4MF9kZXZpY2VfcGRtYSk7CisJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoJnM1cDY0eDBfZGV2aWNlX3BkbWEsICZpb21lbV9yZXNvdXJjZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9ncGlvbGliLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZ3Bpb2xpYi5jCmluZGV4IGU3ZmIzYjAuLjcwMGRhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9ncGlvbGliLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2dwaW9saWIuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmctaGVscGVycy5oPgpAQCAtNDczLDE0ICs0NzQsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgczVwNjR4MF9ncGlvbGliX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgY2hpcGlkOwotCi0JY2hpcGlkID0gX19yYXdfcmVhZGwoUzVQNjRYMF9TWVNfSUQpOwotCiAJczVwNjR4MF9ncGlvbGliX3NldF9jZmcoczVwNjR4MF9ncGlvX2NmZ3MsCiAJCQkJQVJSQVlfU0laRShzNXA2NHgwX2dwaW9fY2ZncykpOwogCi0JaWYgKChjaGlwaWQgJiAweGZmMDAwKSA9PSAweDUwMDAwKSB7CisJaWYgKHNvY19pc19zNXA2NDUwKCkpIHsKIAkJc2Ftc3VuZ19ncGlvbGliX2FkZF8yYml0X2NoaXBzKHM1cDY0NTBfZ3Bpb18yYml0LAogCQkJCQlBUlJBWV9TSVpFKHM1cDY0NTBfZ3Bpb18yYml0KSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZmYTgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19NQUNIX0NMS0RFVl9IX18KLSNkZWZpbmUgX19NQUNIX0NMS0RFVl9IX18KLQotI2RlZmluZSBfX2Nsa19nZXQoY2xrKSAoeyAxOyB9KQotI2RlZmluZSBfX2Nsa19wdXQoY2xrKSBkbyB7fSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggNzliMDRlNi4uZTgwYmEzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTUsNyArMTUsNyBAQAogCiAjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogCi0JLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8gYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweEUwMDAwMDAwCiAJCW9ycglccnAsIFxycCwgIzB4MDAxMDAwMDAKIAkJbGRyCVxycCwgW1xycCwgIzB4MTE4IF0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDgxMjA5ZWIuLjVhNjIyYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMjAsNyArMjAsNyBAQAogI2lmbmRlZiBfX01BQ0hfRE1BX0gKICNkZWZpbmUgX19NQUNIX0RNQV9ICiAKLS8qIFRoaXMgcGxhdGZvcm0gdXNlcyB0aGUgY29tbW9uIFMzQyBETUEgQVBJIGRyaXZlciBmb3IgUEwzMzAgKi8KLSNpbmNsdWRlIDxwbGF0L3MzYy1kbWEtcGwzMzAuaD4KKy8qIFRoaXMgcGxhdGZvcm0gdXNlcyB0aGUgY29tbW9uIGNvbW1vbiBETUEgQVBJIGRyaXZlciBmb3IgUEwzMzAgKi8KKyNpbmNsdWRlIDxwbGF0L2RtYS1wbDMzMC5oPgogCiAjZW5kaWYgLyogX19NQUNIX0RNQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGFkYjVmMjkuLjA2Y2QzYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xMywxMSArMTMsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSAogI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSCBfX0ZJTEVfXwogCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCi0KIC8qIEdQSU8gYmFuayBzaXplcyAqLwogCiAjZGVmaW5lIFM1UDY0NDBfR1BJT19BX05SCSg2KQpAQCAtMTM0LDYgKzEyOSw0IEBACiAKICNkZWZpbmUgQVJDSF9OUl9HUElPUwkJKFM1UDY0WDBfR1BJT19FTkQgKyBDT05GSUdfU0FNU1VOR19HUElPX0VYVFJBKQogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCiAjZW5kaWYgLyogX19BU01fQVJDSF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggNTgzN2EzNi4uNTM5ODJkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTg3LDYgKzg3LDEwIEBACiAKICNkZWZpbmUgSVJRX0kyUzAJCUlSUV9JMlNWNDAKIAorI2RlZmluZSBJUlFfTENEX0ZJRk8JCUlSUV9ESVNQQ09OMAorI2RlZmluZSBJUlFfTENEX1ZTWU5DCQlJUlFfRElTUENPTjEKKyNkZWZpbmUgSVJRX0xDRF9TWVNURU0JCUlSUV9ESVNQQ09OMgorCiAvKiBTNVA2NDUwIEVJTlQgZmVhdHVyZSB3aWxsIGJlIGFkZGVkICovCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9tYXAuaAppbmRleCA5NWM5MTI1Li40ZDNhYzhhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL21hcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvbWFwLmgKQEAgLTQ3LDYgKzQ3LDggQEAKIAogI2RlZmluZSBTNVA2NFgwX1BBX0hTTU1DKHgpCSgweEVEODAwMDAwICsgKCh4KSAqIDB4MTAwMDAwKSkKIAorI2RlZmluZSBTNVA2NFgwX1BBX0ZCCQkweEVFMDAwMDAwCisKICNkZWZpbmUgUzVQNjRYMF9QQV9JMlMJCTB4RjIwMDAwMDAKICNkZWZpbmUgUzVQNjQ1MF9QQV9JMlMxCQkweEYyODAwMDAwCiAjZGVmaW5lIFM1UDY0NTBfUEFfSTJTMgkJMHhGMjkwMDAwMApAQCAtNjQsNiArNjYsNyBAQAogI2RlZmluZSBTM0NfUEFfSUlDMQkJUzVQNjQ0MF9QQV9JSUMxCiAjZGVmaW5lIFMzQ19QQV9SVEMJCVM1UDY0WDBfUEFfUlRDCiAjZGVmaW5lIFMzQ19QQV9XRFQJCVM1UDY0WDBfUEFfV0RUCisjZGVmaW5lIFMzQ19QQV9GQgkJUzVQNjRYMF9QQV9GQgogCiAjZGVmaW5lIFM1UF9QQV9DSElQSUQJCVM1UDY0WDBfUEFfQ0hJUElECiAjZGVmaW5lIFM1UF9QQV9TUk9NQwkJUzVQNjRYMF9QQV9TUk9NQwpAQCAtODUsNSArODgsNiBAQAogI2RlZmluZSBTNVBfUEFfVUFSVDUJCVM1UDY0NTBfUEFfVUFSVCg1KQogCiAjZGVmaW5lIFM1UF9TWl9VQVJUCQlTWl8yNTYKKyNkZWZpbmUgUzNDX1ZBX1VBUlR4KHgpCQkoUzNDX1ZBX1VBUlQgKyAoKHgpICogUzNDX1VBUlRfT0ZGU0VUKSkKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjVhNmViLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogUzVQNjRYMCAtIE1lbW9yeSBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSCBfX0ZJTEVfXwotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MjAwMDAwMDApCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUJU1pfOE0KLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTUVNT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvcG0tY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9wbS1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyZjc1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBTNVA2NFgwIC0gUE0gY29yZSBzdXBwb3J0IGZvciBhcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0uYworICoKKyAqIEJhc2VkIG9uIFBNIGNvcmUgc3VwcG9ydCBmb3IgUzNDNjRYWCBieSBCZW4gRG9va3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2RlYnVnX2luaXRfdWFydCh2b2lkKQoreworCXUzMiB0bXAgPSBfX3Jhd19yZWFkbChTNVA2NFgwX0NMS19HQVRFX1BDTEspOworCisJLyoKKwkgKiBBcyBhIG5vdGUsIHNpbmNlIHRoZSBTNVA2NFgwIFVBUlRzIGdlbmVyYWxseSBoYXZlIG11bHRpcGxlCisJICogY2xvY2sgc291cmNlcywgd2Ugc2ltcGx5IGVuYWJsZSBQQ0xLIGF0IHRoZSBtb21lbnQgYW5kIGhvcGUKKwkgKiB0aGF0IHRoZSByZXN1bWUgc2V0dGluZ3MgZm9yIHRoZSBVQVJUIGFyZSBzdWl0YWJsZSBmb3IgdGhlCisJICogdXNlIHdpdGggUENMSy4KKwkgKi8KKwl0bXAgfD0gUzVQNjRYMF9DTEtfR0FURV9QQ0xLX1VBUlQwOworCXRtcCB8PSBTNVA2NFgwX0NMS19HQVRFX1BDTEtfVUFSVDE7CisJdG1wIHw9IFM1UDY0WDBfQ0xLX0dBVEVfUENMS19VQVJUMjsKKwl0bXAgfD0gUzVQNjRYMF9DTEtfR0FURV9QQ0xLX1VBUlQzOworCisJX19yYXdfd3JpdGVsKHRtcCwgUzVQNjRYMF9DTEtfR0FURV9QQ0xLKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2FyY2hfcHJlcGFyZV9pcnFzKHZvaWQpCit7CisJLyogVklDIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mICovCisKKwkvKiBjbGVhciBhbnkgcGVuZGluZyBFSU5UMCBpbnRlcnJ1cHRzICovCisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFM1UDY0WDBfRUlOVDBQRU5EKSwgUzVQNjRYMF9FSU5UMFBFTkQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2FyY2hfc3RvcF9jbG9ja3Modm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2FyY2hfc2hvd19yZXN1bWVfaXJxcyh2b2lkKSB7IH0KKworLyoKKyAqIG1ha2UgdGhlc2UgZGVmaW5lcywgd2UgY3VycmVudGx5IGRvIG5vdCBoYXZlIGFueSBuZWVkIHRvIGNoYW5nZQorICogdGhlIElSUSB3YWtlIGNvbnRyb2xzIGRlcGVuZGluZyBvbiB0aGUgQ1BVIHdlIGFyZSBydW5uaW5nIG9uCisgKi8KKyNkZWZpbmUgczNjX2lycXdha2VfZWludGFsbG93CSgoMSA8PCAxNikgLSAxKQorI2RlZmluZSBzM2NfaXJxd2FrZV9pbnRhbGxvdwkofjApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF91cGRhdGVfdWFydCh2b2lkIF9faW9tZW0gKnJlZ3MsCisJCQkJCXN0cnVjdCBwbV91YXJ0X3NhdmUgKnNhdmUpCit7CisJdTMyIHVjb24gPSBfX3Jhd19yZWFkbChyZWdzICsgUzNDMjQxMF9VQ09OKTsKKwl1MzIgdWNvbl9jbGsgPSB1Y29uICYgUzNDNjQwMF9VQ09OX0NMS01BU0s7CisJdTMyIHNhdmVfY2xrID0gc2F2ZS0+dWNvbiAmIFMzQzY0MDBfVUNPTl9DTEtNQVNLOworCXUzMiBuZXdfdWNvbjsKKwl1MzIgZGVsdGE7CisKKwkvKgorCSAqIFM1UDY0WDAgVUFSVCBibG9ja3Mgb25seSBzdXBwb3J0IGxldmVsIGludGVycnVwdHMsIHNvIGVuc3VyZSB0aGF0CisJICogd2hlbiB3ZSByZXN0b3JlIHVudXNlZCBVQVJUIGJsb2NrcyB3ZSBmb3JjZSB0aGUgbGV2ZWwgaW50ZXJydXB0CisJICogc2V0dGluZ3MuCisJICovCisJc2F2ZS0+dWNvbiB8PSBTM0MyNDEwX1VDT05fVFhJTEVWRUwgfCBTM0MyNDEwX1VDT05fUlhJTEVWRUw7CisKKwkvKgorCSAqIFdlIGhhdmUgYSBjb25zdHJhaW50IG9uIGNoYW5naW5nIHRoZSBjbG9jayB0eXBlIG9mIHRoZSBVQVJUCisJICogYmV0d2VlbiBVQ0xLeCBhbmQgUENMSywgc28gZW5zdXJlIHRoYXQgd2hlbiB3ZSByZXN0b3JlIFVDT04KKwkgKiB0aGF0IHRoZSBDTEsgZmllbGQgaXMgY29ycmVjdGx5IG1vZGlmaWVkIGlmIHRoZSBib290bG9hZGVyCisJICogaGFzIGNoYW5nZWQgYW55dGhpbmcuCisJICovCisJaWYgKHVjb25fY2xrICE9IHNhdmVfY2xrKSB7CisJCW5ld191Y29uID0gc2F2ZS0+dWNvbjsKKwkJZGVsdGEgPSB1Y29uX2NsayBeIHNhdmVfY2xrOworCisJCS8qCisJCSAqIGNoYW5nZSBmcm9tIFVDTEt4ID0+IHdyb25nIFBDTEssCisJCSAqIGVpdGhlciBVQ0xLIGNhbiBiZSB0ZXN0ZWQgZm9yIGJ5IGEgYml0LXRlc3QKKwkJICogd2l0aCBVQ0xLMAorCQkgKi8KKwkJaWYgKHVjb25fY2xrICYgUzNDNjQwMF9VQ09OX1VDTEswICYmCisJCSEoc2F2ZV9jbGsgJiBTM0M2NDAwX1VDT05fVUNMSzApICYmCisJCWRlbHRhICYgUzNDNjQwMF9VQ09OX1BDTEsyKSB7CisJCQluZXdfdWNvbiAmPSB+UzNDNjQwMF9VQ09OX1VDTEswOworCQl9IGVsc2UgaWYgKGRlbHRhID09IFMzQzY0MDBfVUNPTl9QQ0xLMikgeworCQkJLyoKKwkJCSAqIGFzIGEgcHJlY2F1dGlvbiwgZG9uJ3QgY2hhbmdlIGZyb20KKwkJCSAqIFBDTEsyID0+IFBDTEsgb3IgdmljZS12ZXJzYQorCQkJICovCisJCQluZXdfdWNvbiBePSBTM0M2NDAwX1VDT05fUENMSzI7CisJCX0KKworCQlTM0NfUE1EQkcoInVjb24gY2hhbmdlICUwNHggPT4gJTA0eCAoc2F2ZT0lMDR4KVxuIiwKKwkJCXVjb24sIG5ld191Y29uLCBzYXZlLT51Y29uKTsKKwkJc2F2ZS0+dWNvbiA9IG5ld191Y29uOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9yZXN0b3JlZF9ncGlvcyh2b2lkKQoreworCS8qIGVuc3VyZSBzbGVlcCBtb2RlIGhhcyBiZWVuIGNsZWFyZWQgZnJvbSB0aGUgc3lzdGVtICovCisJX19yYXdfd3JpdGVsKDAsIFM1UDY0WDBfU0xQRU4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2Ftc3VuZ19wbV9zYXZlZF9ncGlvcyh2b2lkKQoreworCS8qCisJICogdHVybiBvbiB0aGUgc2xlZXAgbW9kZSBhbmQga2VlcCBpdCB0aGVyZSwgYXMgaXQgc2VlbXMgdGhhdCBkdXJpbmcKKwkgKiBzdXNwZW5kIHRoZSB4Q09OIHJlZ2lzdGVycyBnZXQgcmUtc2V0IGFuZCB0aHVzIHlvdSBjYW4gZW5kIHVwIHdpdGgKKwkgKiBwcm9ibGVtcyBiZXR3ZWVuIGdvaW5nIHRvIHNsZWVwIGFuZCByZXN1bWluZy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoUzVQNjRYMF9TTFBFTl9VU0VfeFNMUCwgUzVQNjRYMF9TTFBFTik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmZmY4YjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBTNVA2NFgwIC0gcHdtIGNsb2NrIGFuZCB0aW1lciBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9QV01DTEtfSAotI2RlZmluZSBfX0FTTV9BUkNIX1BXTUNMS19IIF9fRklMRV9fCi0KLS8qKgotICogcHdtX2NmZ19zcmNfaXNfdGNsaygpIC0gcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG11eCBjb25maWcgaXMgYSB0Y2xrCi0gKiBAdGNmZzogVGhlIHRpbWVyIFRDRkcxIHJlZ2lzdGVyIGJpdHMgc2hpZnRlZCBkb3duIHRvIDAuCi0gKgotICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZnJvbSBUQ0ZHMSBpcyBhIFRDTEsgaW5zdGVhZAotICogYW55IG9mIHRoZSBURElWIGNsb2Nrcy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHdtX2NmZ19zcmNfaXNfdGNsayh1bnNpZ25lZCBsb25nIHRjZmcpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogdGNmZ190b19kaXZpc29yKCkgLSBjb252ZXJ0IHRjZmcxIHNldHRpbmcgdG8gYSBkaXZpc29yCi0gKiBAdGNmZzE6IFRoZSB0Y2ZnMSBzZXR0aW5nLCBzaGlmdGVkIGRvd24uCi0gKgotICogR2V0IHRoZSBkaXZpc29yIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdGNmZzEgc2V0dGluZy4gV2UgYXNzdW1lIHRoZQotICogY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdG8gc2VlIGlmIHRoaXMgaXMgbm90IGEgVENMSyBzb3VyY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0Y2ZnX3RvX2Rpdmlzb3IodW5zaWduZWQgbG9uZyB0Y2ZnMSkKLXsKLQlyZXR1cm4gMSA8PCB0Y2ZnMTsKLX0KLQotLyoqCi0gKiBwd21fdGRpdl9oYXNfZGl2MSgpIC0gZG9lcyB0aGUgdGRpdiBzZXR0aW5nIGhhdmUgYSAvMQotICoKLSAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgYSAvMSBpbiB0aGUgdGRpdiBzZXR0aW5nLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwd21fdGRpdl9oYXNfZGl2MSh2b2lkKQotewotCXJldHVybiAxOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2Rpdl9iaXRzKCkgLSBjYWxjdWxhdGUgVENGRzEgZGl2aXNvciB2YWx1ZS4KLSAqIEBkaXY6IFRoZSBkaXZpc29yIHRvIGNhbGN1bGF0ZSB0aGUgYml0IGluZm9ybWF0aW9uIGZvci4KLSAqCi0gKiBUdXJuIGEgZGl2aXNvciBpbnRvIHRoZSBuZWNlc3NhcnkgYml0IGZpZWxkIGZvciBUQ0ZHMS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB3bV90ZGl2X2Rpdl9iaXRzKHVuc2lnbmVkIGludCBkaXYpCi17Ci0JcmV0dXJuIGlsb2cyKGRpdik7Ci19Ci0KLSNkZWZpbmUgUzNDX1RDRkcxX01VWF9UQ0xLIDAKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUFdNQ0xLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKaW5kZXggYTEzM2YyMi4uYmQ5MTExMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKQEAgLTQxLDE3ICs0MSw1MCBAQAogI2RlZmluZSBTNVA2NDUwX0RQTExfQ09OCQlTNVBfQ0xLUkVHKDB4NTApCiAjZGVmaW5lIFM1UDY0NTBfRFBMTF9DT05fSwkJUzVQX0NMS1JFRygweDU0KQogCisjZGVmaW5lIFM1UDY0WDBfQUhCX0NPTjAJCVM1UF9DTEtSRUcoMHgxMDApCiAjZGVmaW5lIFM1UDY0WDBfQ0xLX1NSQzEJCVM1UF9DTEtSRUcoMHgxMEMpCiAKICNkZWZpbmUgUzVQNjRYMF9TWVNfSUQJCQlTNVBfQ0xLUkVHKDB4MTE4KQogI2RlZmluZSBTNVA2NFgwX1NZU19PVEhFUlMJCVM1UF9DTEtSRUcoMHgxMUMpCiAKICNkZWZpbmUgUzVQNjRYMF9QV1JfQ0ZHCQkJUzVQX0NMS1JFRygweDgwNCkKKyNkZWZpbmUgUzVQNjRYMF9FSU5UX1dBS0VVUF9NQVNLCVM1UF9DTEtSRUcoMHg4MDgpCisjZGVmaW5lIFM1UDY0WDBfU0xFRVBfQ0ZHCQlTNVBfQ0xLUkVHKDB4ODE4KQorI2RlZmluZSBTNVA2NFgwX1BXUl9TVEFCTEUJCVM1UF9DTEtSRUcoMHg4MjgpCisKICNkZWZpbmUgUzVQNjRYMF9PVEhFUlMJCQlTNVBfQ0xLUkVHKDB4OTAwKQorI2RlZmluZSBTNVA2NFgwX1dBS0VVUF9TVEFUCQlTNVBfQ0xLUkVHKDB4OTA4KQorCisjZGVmaW5lIFM1UDY0WDBfSU5GT1JNMAkJCVM1UF9DTEtSRUcoMHhBMDApCiAKICNkZWZpbmUgUzVQNjRYMF9DTEtESVYwX0hDTEtfU0hJRlQJKDgpCiAjZGVmaW5lIFM1UDY0WDBfQ0xLRElWMF9IQ0xLX01BU0sJKDB4RiA8PCBTNVA2NFgwX0NMS0RJVjBfSENMS19TSElGVCkKIAorLyogSENMSyBHQVRFIFJlZ2lzdGVycyAqLworI2RlZmluZSBTNVA2NFgwX0NMS19HQVRFX0hDTEsxX0ZJTUdWRwkoMSA8PCAyKQorI2RlZmluZSBTNVA2NFgwX0NMS19HQVRFX1NDTEsxX0ZJTUdWRwkoMSA8PCAyKQorCisvKiBQQ0xLIEdBVEUgUmVnaXN0ZXJzICovCisjZGVmaW5lIFM1UDY0WDBfQ0xLX0dBVEVfUENMS19VQVJUMwkoMSA8PCA0KQorI2RlZmluZSBTNVA2NFgwX0NMS19HQVRFX1BDTEtfVUFSVDIJKDEgPDwgMykKKyNkZWZpbmUgUzVQNjRYMF9DTEtfR0FURV9QQ0xLX1VBUlQxCSgxIDw8IDIpCisjZGVmaW5lIFM1UDY0WDBfQ0xLX0dBVEVfUENMS19VQVJUMAkoMSA8PCAxKQorCisjZGVmaW5lIFM1UDY0WDBfUFdSX0NGR19NTUMxX0RJU0FCTEUJCSgxIDw8IDE1KQorI2RlZmluZSBTNVA2NFgwX1BXUl9DRkdfTU1DMF9ESVNBQkxFCQkoMSA8PCAxNCkKKyNkZWZpbmUgUzVQNjRYMF9QV1JfQ0ZHX1JUQ19USUNLX0RJU0FCTEUJKDEgPDwgMTEpCisjZGVmaW5lIFM1UDY0WDBfUFdSX0NGR19SVENfQUxSTV9ESVNBQkxFCSgxIDw8IDEwKQorI2RlZmluZSBTNVA2NFgwX1BXUl9DRkdfV0ZJX01BU0sJCSgzIDw8IDUpCisjZGVmaW5lIFM1UDY0WDBfUFdSX0NGR19XRklfU0xFRVAJCSgzIDw8IDUpCisKKyNkZWZpbmUgUzVQNjRYMF9TTEVFUF9DRkdfT1NDX0VOCSgxIDw8IDApCisKKyNkZWZpbmUgUzVQNjRYMF9QV1JfU1RBQkxFX1BXUl9DTlRfVkFMNAkoNCA8PCAwKQorCisjZGVmaW5lIFM1UDY0NTBfT1RIRVJTX0RJU0FCTEVfSU5UCSgxIDw8IDMxKQorI2RlZmluZSBTNVA2NFgwX09USEVSU19SRVRfVUFSVAkJKDEgPDwgMjYpCisjZGVmaW5lIFM1UDY0WDBfT1RIRVJTX1JFVF9NTUMxCQkoMSA8PCAyNSkKKyNkZWZpbmUgUzVQNjRYMF9PVEhFUlNfUkVUX01NQzAJCSgxIDw8IDI0KQogI2RlZmluZSBTNVA2NFgwX09USEVSU19VU0JfU0lHX01BU0sJKDEgPDwgMTYpCiAKIC8qIENvbXBhdGliaWxpdHkgZGVmaW5lcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaCBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvcmVncy1ncGlvLmgKaW5kZXggNmNlMjU0Ny4uY2ZkZmE0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3JlZ3MtZ3Bpby5oCkBAIC0zNCwxNCArMzQsMzUgQEAKICNkZWZpbmUgUzVQNjQ1MF9HUFFfQkFTRQkJKFM1UF9WQV9HUElPICsgMHgwMTgwKQogI2RlZmluZSBTNVA2NDUwX0dQU19CQVNFCQkoUzVQX1ZBX0dQSU8gKyAweDAzMDApCiAKKyNkZWZpbmUgUzVQNjRYMF9TUENPTjAJCQkoUzVQX1ZBX0dQSU8gKyAweDFBMCkKKyNkZWZpbmUgUzVQNjRYMF9TUENPTjBfTENEX1NFTF9NQVNLCSgweDMgPDwgMCkKKyNkZWZpbmUgUzVQNjRYMF9TUENPTjBfTENEX1NFTF9SR0IJKDB4MSA8PCAwKQorI2RlZmluZSBTNVA2NFgwX1NQQ09OMQkJCShTNVBfVkFfR1BJTyArIDB4MkIwKQorCisjZGVmaW5lIFM1UDY0WDBfTUVNMENPTlNMUDAJCShTNVBfVkFfR1BJTyArIDB4MUMwKQorI2RlZmluZSBTNVA2NFgwX01FTTBDT05TTFAxCQkoUzVQX1ZBX0dQSU8gKyAweDFDNCkKKyNkZWZpbmUgUzVQNjRYMF9NRU0wRFJWQ09OCQkoUzVQX1ZBX0dQSU8gKyAweDFEMCkKKyNkZWZpbmUgUzVQNjRYMF9NRU0xRFJWQ09OCQkoUzVQX1ZBX0dQSU8gKyAweDFENCkKKworI2RlZmluZSBTNVA2NFgwX0VJTlQxMkNPTgkJKFM1UF9WQV9HUElPICsgMHgyMDApCisjZGVmaW5lIFM1UDY0WDBfRUlOVDEyRkxUQ09OCQkoUzVQX1ZBX0dQSU8gKyAweDIyMCkKKyNkZWZpbmUgUzVQNjRYMF9FSU5UMTJNQVNLCQkoUzVQX1ZBX0dQSU8gKyAweDI0MCkKKwogLyogRXh0ZXJuYWwgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXJzIGZvciBncm91cDAgKi8KIAogI2RlZmluZSBFSU5UMENPTjBfT0ZGU0VUCQkoMHg5MDApCisjZGVmaW5lIEVJTlQwRkxUQ09OMF9PRkZTRVQJCSgweDkxMCkKKyNkZWZpbmUgRUlOVDBGTFRDT04xX09GRlNFVAkJKDB4OTE0KQogI2RlZmluZSBFSU5UME1BU0tfT0ZGU0VUCQkoMHg5MjApCiAjZGVmaW5lIEVJTlQwUEVORF9PRkZTRVQJCSgweDkyNCkKIAogI2RlZmluZSBTNVA2NFgwX0VJTlQwQ09OMAkJKFM1UF9WQV9HUElPICsgRUlOVDBDT04wX09GRlNFVCkKKyNkZWZpbmUgUzVQNjRYMF9FSU5UMEZMVENPTjAJCShTNVBfVkFfR1BJTyArIEVJTlQwRkxUQ09OMF9PRkZTRVQpCisjZGVmaW5lIFM1UDY0WDBfRUlOVDBGTFRDT04xCQkoUzVQX1ZBX0dQSU8gKyBFSU5UMEZMVENPTjFfT0ZGU0VUKQogI2RlZmluZSBTNVA2NFgwX0VJTlQwTUFTSwkJKFM1UF9WQV9HUElPICsgRUlOVDBNQVNLX09GRlNFVCkKICNkZWZpbmUgUzVQNjRYMF9FSU5UMFBFTkQJCShTNVBfVkFfR1BJTyArIEVJTlQwUEVORF9PRkZTRVQpCiAKKyNkZWZpbmUgUzVQNjRYMF9TTFBFTgkJCShTNVBfVkFfR1BJTyArIDB4OTMwKQorI2RlZmluZSBTNVA2NFgwX1NMUEVOX1VTRV94U0xQCQkoMSA8PCAwKQorCiAjZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2lycS1laW50LmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaXJxLWVpbnQuYwppbmRleCBmZTczODBmLi4yNzVkYzc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaXJxLWVpbnQuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaXJxLWVpbnQuYwpAQCAtMTcsOCArMTcsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3MtaXJxdHlwZS5oPgogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgpAQCAtNjcsNyArNjksNyBAQAogCV9fcmF3X3dyaXRlbChjdHJsLCBTNVA2NFgwX0VJTlQwQ09OMCk7CiAKIAkvKiBDb25maWd1cmUgdGhlIEdQSU8gcGluIGZvciA2NDUwIG9yIDY0NDAgYmFzZWQgb24gQ1BVIElEICovCi0JaWYgKDB4NTAwMDAgPT0gKF9fcmF3X3JlYWRsKFM1UDY0WDBfU1lTX0lEKSAmIDB4RkYwMDApKQorCWlmIChzb2NfaXNfczVwNjQ1MCgpKQogCQlzM2NfZ3Bpb19jZmdwaW4oUzVQNjQ1MF9HUE4ob2ZmcyksIFMzQ19HUElPX1NGTigyKSk7CiAJZWxzZQogCQlzM2NfZ3Bpb19jZmdwaW4oUzVQNjQ0MF9HUE4ob2ZmcyksIFMzQ19HUElPX1NGTigyKSk7CkBAIC0xMzMsNiArMTM1LDcgQEAKIAljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CiAJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CiAJY3QtPmNoaXAuaXJxX3NldF90eXBlID0gczVwNjR4MF9pcnFfZWludF9zZXRfdHlwZTsKKwljdC0+Y2hpcC5pcnFfc2V0X3dha2UgPSBzM2NfaXJxZXh0X3dha2U7CiAJY3QtPnJlZ3MuYWNrID0gRUlOVDBQRU5EX09GRlNFVDsKIAljdC0+cmVncy5tYXNrID0gRUlOVDBNQVNLX09GRlNFVDsKIAlpcnFfc2V0dXBfZ2VuZXJpY19jaGlwKGdjLCBJUlFfTVNLKDE2KSwgSVJRX0dDX0lOSVRfTUFTS19DQUNIRSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pcnEtcG0uYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pcnEtcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTZmMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2lycS1wbS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwNjR4MC9pcnEtcG0uYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBTNVA2NFgwIC0gSW50ZXJydXB0IGhhbmRsaW5nIFBvd2VyIE1hbmFnZW1lbnQKKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzY0eHgvaXJxLXBtLmMgYnkgQmVuIERvb2tzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgorCisjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGlycV9zYXZlW10gPSB7CisJU0FWRV9JVEVNKFM1UDY0WDBfRUlOVDBDT04wKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9FSU5UMEZMVENPTjApLAorCVNBVkVfSVRFTShTNVA2NFgwX0VJTlQwRkxUQ09OMSksCisJU0FWRV9JVEVNKFM1UDY0WDBfRUlOVDBNQVNLKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2dycF9zYXZlIHsKKwl1MzIJY29uOworCXUzMglmbHRjb247CisJdTMyCW1hc2s7Cit9IGVpbnRfZ3JwX3NhdmVbNF07CisKK3N0YXRpYyB1MzIgaXJxX3VhcnRfbWFza1tDT05GSUdfU0VSSUFMX1NBTVNVTkdfVUFSVFNdOworCitzdGF0aWMgaW50IHM1cDY0eDBfaXJxX3BtX3N1c3BlbmQodm9pZCkKK3sKKwlzdHJ1Y3QgaXJxX2dycF9zYXZlICpncnAgPSBlaW50X2dycF9zYXZlOworCWludCBpOworCisJUzNDX1BNREJHKCIlczogc3VzcGVuZGluZyBJUlFzXG4iLCBfX2Z1bmNfXyk7CisKKwlzM2NfcG1fZG9fc2F2ZShpcnFfc2F2ZSwgQVJSQVlfU0laRShpcnFfc2F2ZSkpOworCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19TRVJJQUxfU0FNU1VOR19VQVJUUzsgaSsrKQorCQlpcnFfdWFydF9tYXNrW2ldID0gX19yYXdfcmVhZGwoUzNDX1ZBX1VBUlR4KGkpICsgUzNDNjRYWF9VSU5UTSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlaW50X2dycF9zYXZlKTsgaSsrLCBncnArKykgeworCQlncnAtPmNvbiA9IF9fcmF3X3JlYWRsKFM1UDY0WDBfRUlOVDEyQ09OICsgKGkgKiA0KSk7CisJCWdycC0+bWFzayA9IF9fcmF3X3JlYWRsKFM1UDY0WDBfRUlOVDEyTUFTSyArIChpICogNCkpOworCQlncnAtPmZsdGNvbiA9IF9fcmF3X3JlYWRsKFM1UDY0WDBfRUlOVDEyRkxUQ09OICsgKGkgKiA0KSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHM1cDY0eDBfaXJxX3BtX3Jlc3VtZSh2b2lkKQoreworCXN0cnVjdCBpcnFfZ3JwX3NhdmUgKmdycCA9IGVpbnRfZ3JwX3NhdmU7CisJaW50IGk7CisKKwlTM0NfUE1EQkcoIiVzOiByZXN1bWluZyBJUlFzXG4iLCBfX2Z1bmNfXyk7CisKKwlzM2NfcG1fZG9fcmVzdG9yZShpcnFfc2F2ZSwgQVJSQVlfU0laRShpcnFfc2F2ZSkpOworCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19TRVJJQUxfU0FNU1VOR19VQVJUUzsgaSsrKQorCQlfX3Jhd193cml0ZWwoaXJxX3VhcnRfbWFza1tpXSwgUzNDX1ZBX1VBUlR4KGkpICsgUzNDNjRYWF9VSU5UTSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlaW50X2dycF9zYXZlKTsgaSsrLCBncnArKykgeworCQlfX3Jhd193cml0ZWwoZ3JwLT5jb24sIFM1UDY0WDBfRUlOVDEyQ09OICsgKGkgKiA0KSk7CisJCV9fcmF3X3dyaXRlbChncnAtPm1hc2ssIFM1UDY0WDBfRUlOVDEyTUFTSyArIChpICogNCkpOworCQlfX3Jhd193cml0ZWwoZ3JwLT5mbHRjb24sIFM1UDY0WDBfRUlOVDEyRkxUQ09OICsgKGkgKiA0KSk7CisJfQorCisJUzNDX1BNREJHKCIlczogSVJRIGNvbmZpZ3VyYXRpb24gcmVzdG9yZWRcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBzNXA2NHgwX2lycV9zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZCA9IHM1cDY0eDBfaXJxX3BtX3N1c3BlbmQsCisJLnJlc3VtZSAgPSBzNXA2NHgwX2lycV9wbV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzNXA2NHgwX3N5c2NvcmVfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZzNXA2NHgwX2lycV9zeXNjb3JlX29wcyk7CisKKwlyZXR1cm4gMDsKK30KK2NvcmVfaW5pdGNhbGwoczVwNjR4MF9zeXNjb3JlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL21hY2gtc21kazY0NDAuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9tYWNoLXNtZGs2NDQwLmMKaW5kZXggMzQ2ZjhkZi4uNGExMjUwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL21hY2gtc21kazY0NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvbWFjaC1zbWRrNjQ0MC5jCkBAIC0yMyw2ICsyMyw5IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8dmlkZW8vcGxhdGZvcm1fbGNkLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC00Nyw2ICs1MCw4IEBACiAjaW5jbHVkZSA8cGxhdC90cy5oPgogI2luY2x1ZGUgPHBsYXQvczVwLXRpbWUuaD4KICNpbmNsdWRlIDxwbGF0L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPHBsYXQvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtZmIuaD4KIAogI2RlZmluZSBTTURLNjQ0MF9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKIAkJCQlTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAkJXApAQCAtOTIsNiArOTcsNTkgQEAKIAl9LAogfTsKIAorLyogRnJhbWUgQnVmZmVyICovCitzdGF0aWMgc3RydWN0IHMzY19mYl9wZF93aW4gc21kazY0NDBfZmJfd2luMCA9IHsKKwkud2luX21vZGUgPSB7CisJCS5sZWZ0X21hcmdpbgk9IDgsCisJCS5yaWdodF9tYXJnaW4JPSAxMywKKwkJLnVwcGVyX21hcmdpbgk9IDcsCisJCS5sb3dlcl9tYXJnaW4JPSA1LAorCQkuaHN5bmNfbGVuCT0gMywKKwkJLnZzeW5jX2xlbgk9IDEsCisJCS54cmVzCQk9IDgwMCwKKwkJLnlyZXMJCT0gNDgwLAorCX0sCisJLm1heF9icHAJPSAzMiwKKwkuZGVmYXVsdF9icHAJPSAyNCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhIHNtZGs2NDQwX2xjZF9wZGF0YSBfX2luaXRkYXRhID0geworCS53aW5bMF0JCT0gJnNtZGs2NDQwX2ZiX3dpbjAsCisJLnZpZGNvbjAJPSBWSURDT04wX1ZJRE9VVF9SR0IgfCBWSURDT04wX1BOUk1PREVfUkdCLAorCS52aWRjb24xCT0gVklEQ09OMV9JTlZfSFNZTkMgfCBWSURDT04xX0lOVl9WU1lOQywKKwkuc2V0dXBfZ3Bpbwk9IHM1cDY0eDBfZmJfZ3Bpb19zZXR1cF8yNGJwcCwKK307CisKKy8qIExDRCBwb3dlciBjb250cm9sbGVyICovCitzdGF0aWMgdm9pZCBzbWRrNjQ0MF9sdGU0ODBfcmVzZXRfcG93ZXIoc3RydWN0IHBsYXRfbGNkX2RhdGEgKnBkLAorCQkJCQkgdW5zaWduZWQgaW50IHBvd2VyKQoreworCWludCBlcnI7CisKKwlpZiAocG93ZXIpIHsKKwkJZXJyID0gZ3Bpb19yZXF1ZXN0KFM1UDY0NDBfR1BOKDUpLCAiR1BOIik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlcXVlc3QgR1BOIGZvciBsY2QgcmVzZXRcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFM1UDY0NDBfR1BOKDUpLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWUoUzVQNjQ0MF9HUE4oNSksIDApOworCQlncGlvX3NldF92YWx1ZShTNVA2NDQwX0dQTig1KSwgMSk7CisJCWdwaW9fZnJlZShTNVA2NDQwX0dQTig1KSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgc21kazY0NDBfbGNkX3Bvd2VyX2RhdGEgPSB7CisJLnNldF9wb3dlcgk9IHNtZGs2NDQwX2x0ZTQ4MF9yZXNldF9wb3dlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtZGs2NDQwX2xjZF9sdGU0ODB3diA9IHsKKwkubmFtZQkJCT0gInBsYXRmb3JtLWxjZCIsCisJLmRldi5wYXJlbnQJCT0gJnMzY19kZXZpY2VfZmIuZGV2LAorCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZzbWRrNjQ0MF9sY2RfcG93ZXJfZGF0YSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbWRrNjQ0MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmczNjX2RldmljZV9hZGMsCiAJJnMzY19kZXZpY2VfcnRjLApAQCAtMTAxLDYgKzE1OSw4IEBACiAJJnMzY19kZXZpY2Vfd2R0LAogCSZzYW1zdW5nX2Fzb2NfZG1hLAogCSZzNXA2NDQwX2RldmljZV9paXMsCisJJnMzY19kZXZpY2VfZmIsCisJJnNtZGs2NDQwX2xjZF9sdGU0ODB3diwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgczVwNjQ0MF9pMmMwX2RhdGEgX19pbml0ZGF0YSA9IHsKQEAgLTEyOSwxMiArMTg5LDYgQEAKIAkvKiBUbyBiZSBwb3B1bGF0ZWQgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gczNjX3RzX3BsYXRmb3JtIF9faW5pdGRhdGEgPSB7Ci0JLmRlbGF5CQkJPSAxMDAwMCwKLQkucHJlc2MJCQk9IDQ5LAotCS5vdmVyc2FtcGxpbmdfc2hpZnQJPSAyLAotfTsKLQogLyogTENEIEJhY2tsaWdodCBkYXRhICovCiBzdGF0aWMgc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvIHNtZGs2NDQwX2JsX2dwaW9faW5mbyA9IHsKIAkubm8gPSBTNVA2NDQwX0dQRigxNSksCkBAIC0xNTMsOSArMjA3LDIwIEBACiAJczVwX3NldF90aW1lcl9zb3VyY2UoUzVQX1BXTTMsIFM1UF9QV000KTsKIH0KIAorc3RhdGljIHZvaWQgczVwNjQ0MF9zZXRfbGNkX2ludGVyZmFjZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBjZmc7CisKKwkvKiBzZWxlY3QgVEZUIExDRCB0eXBlIChSR0IgSS9GKSAqLworCWNmZyA9IF9fcmF3X3JlYWRsKFM1UDY0WDBfU1BDT04wKTsKKwljZmcgJj0gflM1UDY0WDBfU1BDT04wX0xDRF9TRUxfTUFTSzsKKwljZmcgfD0gUzVQNjRYMF9TUENPTjBfTENEX1NFTF9SR0I7CisJX19yYXdfd3JpdGVsKGNmZywgUzVQNjRYMF9TUENPTjApOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgc21kazY0NDBfbWFjaGluZV9pbml0KHZvaWQpCiB7Ci0JczNjMjR4eF90c19zZXRfcGxhdGRhdGEoJnMzY190c19wbGF0Zm9ybSk7CisJczNjMjR4eF90c19zZXRfcGxhdGRhdGEoTlVMTCk7CiAKIAlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoJnM1cDY0NDBfaTJjMF9kYXRhKTsKIAlzM2NfaTJjMV9zZXRfcGxhdGRhdGEoJnM1cDY0NDBfaTJjMV9kYXRhKTsKQEAgLTE2NiwxMiArMjMxLDE1IEBACiAKIAlzYW1zdW5nX2JsX3NldCgmc21kazY0NDBfYmxfZ3Bpb19pbmZvLCAmc21kazY0NDBfYmxfZGF0YSk7CiAKKwlzNXA2NDQwX3NldF9sY2RfaW50ZXJmYWNlKCk7CisJczNjX2ZiX3NldF9wbGF0ZGF0YSgmc21kazY0NDBfbGNkX3BkYXRhKTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNtZGs2NDQwX2RldmljZXMsIEFSUkFZX1NJWkUoc21kazY0NDBfZGV2aWNlcykpOwogfQogCiBNQUNISU5FX1NUQVJUKFNNREs2NDQwLCAiU01ESzY0NDAiKQogCS8qIE1haW50YWluZXI6IEt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVA2NFgwX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAKIAkuaW5pdF9pcnEJPSBzNXA2NDQwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gc21kazY0NDBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL21hY2gtc21kazY0NTAuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9tYWNoLXNtZGs2NDUwLmMKaW5kZXggMzNmMmFkZi4uMGFiMTI5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL21hY2gtc21kazY0NTAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvbWFjaC1zbWRrNjQ1MC5jCkBAIC0yMyw2ICsyMyw5IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8dmlkZW8vcGxhdGZvcm1fbGNkLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC00Nyw2ICs1MCw4IEBACiAjaW5jbHVkZSA8cGxhdC90cy5oPgogI2luY2x1ZGUgPHBsYXQvczVwLXRpbWUuaD4KICNpbmNsdWRlIDxwbGF0L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPHBsYXQvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtZmIuaD4KIAogI2RlZmluZSBTTURLNjQ1MF9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKIAkJCQlTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAkJXApAQCAtMTEwLDYgKzExNSw1OSBAQAogI2VuZGlmCiB9OwogCisvKiBGcmFtZSBCdWZmZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BkX3dpbiBzbWRrNjQ1MF9mYl93aW4wID0geworCS53aW5fbW9kZQk9IHsKKwkJLmxlZnRfbWFyZ2luCT0gOCwKKwkJLnJpZ2h0X21hcmdpbgk9IDEzLAorCQkudXBwZXJfbWFyZ2luCT0gNywKKwkJLmxvd2VyX21hcmdpbgk9IDUsCisJCS5oc3luY19sZW4JPSAzLAorCQkudnN5bmNfbGVuCT0gMSwKKwkJLnhyZXMJCT0gODAwLAorCQkueXJlcwkJPSA0ODAsCisJfSwKKwkubWF4X2JwcAk9IDMyLAorCS5kZWZhdWx0X2JwcAk9IDI0LAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgc21kazY0NTBfbGNkX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLndpblswXQkJPSAmc21kazY0NTBfZmJfd2luMCwKKwkudmlkY29uMAk9IFZJRENPTjBfVklET1VUX1JHQiB8IFZJRENPTjBfUE5STU9ERV9SR0IsCisJLnZpZGNvbjEJPSBWSURDT04xX0lOVl9IU1lOQyB8IFZJRENPTjFfSU5WX1ZTWU5DLAorCS5zZXR1cF9ncGlvCT0gczVwNjR4MF9mYl9ncGlvX3NldHVwXzI0YnBwLAorfTsKKworLyogTENEIHBvd2VyIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyB2b2lkIHNtZGs2NDUwX2x0ZTQ4MF9yZXNldF9wb3dlcihzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsCisJCQkJCSB1bnNpZ25lZCBpbnQgcG93ZXIpCit7CisJaW50IGVycjsKKworCWlmIChwb3dlcikgeworCQllcnIgPSBncGlvX3JlcXVlc3QoUzVQNjQ1MF9HUE4oNSksICJHUE4iKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVxdWVzdCBHUE4gZm9yIGxjZCByZXNldFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoUzVQNjQ1MF9HUE4oNSksIDEpOworCQlncGlvX3NldF92YWx1ZShTNVA2NDUwX0dQTig1KSwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKFM1UDY0NTBfR1BOKDUpLCAxKTsKKwkJZ3Bpb19mcmVlKFM1UDY0NTBfR1BOKDUpKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9sY2RfZGF0YSBzbWRrNjQ1MF9sY2RfcG93ZXJfZGF0YSA9IHsKKwkuc2V0X3Bvd2VyCT0gc21kazY0NTBfbHRlNDgwX3Jlc2V0X3Bvd2VyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21kazY0NTBfbGNkX2x0ZTQ4MHd2ID0geworCS5uYW1lCQkJPSAicGxhdGZvcm0tbGNkIiwKKwkuZGV2LnBhcmVudAkJPSAmczNjX2RldmljZV9mYi5kZXYsCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJnNtZGs2NDUwX2xjZF9wb3dlcl9kYXRhLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtZGs2NDUwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzM2NfZGV2aWNlX2FkYywKIAkmczNjX2RldmljZV9ydGMsCkBAIC0xMTksNiArMTc3LDkgQEAKIAkmczNjX2RldmljZV93ZHQsCiAJJnNhbXN1bmdfYXNvY19kbWEsCiAJJnM1cDY0NTBfZGV2aWNlX2lpczAsCisJJnMzY19kZXZpY2VfZmIsCisJJnNtZGs2NDUwX2xjZF9sdGU0ODB3diwKKwogCS8qIHM1cDY0NTBfZGV2aWNlX3NwaTAgd2lsbCBiZSBhZGRlZCAqLwogfTsKIApAQCAtMTQ4LDEyICsyMDksNiBAQAogCXsgSTJDX0JPQVJEX0lORk8oIjI0YzEyOCIsIDB4NTcpLCB9LC8qIFNhbXN1bmcgUzUyNEFEMFhEMSBFRVBST00gKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gczNjX3RzX3BsYXRmb3JtIF9faW5pdGRhdGEgPSB7Ci0JLmRlbGF5CQkJPSAxMDAwMCwKLQkucHJlc2MJCQk9IDQ5LAotCS5vdmVyc2FtcGxpbmdfc2hpZnQJPSAyLAotfTsKLQogLyogTENEIEJhY2tsaWdodCBkYXRhICovCiBzdGF0aWMgc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvIHNtZGs2NDUwX2JsX2dwaW9faW5mbyA9IHsKIAkubm8gPSBTNVA2NDUwX0dQRigxNSksCkBAIC0xNzIsOSArMjI3LDIwIEBACiAJczVwX3NldF90aW1lcl9zb3VyY2UoUzVQX1BXTTMsIFM1UF9QV000KTsKIH0KIAorc3RhdGljIHZvaWQgczVwNjQ1MF9zZXRfbGNkX2ludGVyZmFjZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBjZmc7CisKKwkvKiBzZWxlY3QgVEZUIExDRCB0eXBlIChSR0IgSS9GKSAqLworCWNmZyA9IF9fcmF3X3JlYWRsKFM1UDY0WDBfU1BDT04wKTsKKwljZmcgJj0gflM1UDY0WDBfU1BDT04wX0xDRF9TRUxfTUFTSzsKKwljZmcgfD0gUzVQNjRYMF9TUENPTjBfTENEX1NFTF9SR0I7CisJX19yYXdfd3JpdGVsKGNmZywgUzVQNjRYMF9TUENPTjApOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgc21kazY0NTBfbWFjaGluZV9pbml0KHZvaWQpCiB7Ci0JczNjMjR4eF90c19zZXRfcGxhdGRhdGEoJnMzY190c19wbGF0Zm9ybSk7CisJczNjMjR4eF90c19zZXRfcGxhdGRhdGEoTlVMTCk7CiAKIAlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoJnM1cDY0NTBfaTJjMF9kYXRhKTsKIAlzM2NfaTJjMV9zZXRfcGxhdGRhdGEoJnM1cDY0NTBfaTJjMV9kYXRhKTsKQEAgLTE4NSwxMiArMjUxLDE1IEBACiAKIAlzYW1zdW5nX2JsX3NldCgmc21kazY0NTBfYmxfZ3Bpb19pbmZvLCAmc21kazY0NTBfYmxfZGF0YSk7CiAKKwlzNXA2NDUwX3NldF9sY2RfaW50ZXJmYWNlKCk7CisJczNjX2ZiX3NldF9wbGF0ZGF0YSgmc21kazY0NTBfbGNkX3BkYXRhKTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNtZGs2NDUwX2RldmljZXMsIEFSUkFZX1NJWkUoc21kazY0NTBfZGV2aWNlcykpOwogfQogCiBNQUNISU5FX1NUQVJUKFNNREs2NDUwLCAiU01ESzY0NTAiKQogCS8qIE1haW50YWluZXI6IEt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVA2NFgwX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAKIAkuaW5pdF9pcnEJPSBzNXA2NDUwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gc21kazY0NTBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL3BtLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTkyNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL3BtLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwNjR4MC9wbS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFM1UDY0WDAgUG93ZXIgTWFuYWdlbWVudCBTdXBwb3J0CisgKgorICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3BtLmMgYnkgQmVuIERvb2tzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXRpbWVyLmg+CisjaW5jbHVkZSA8cGxhdC93YWtldXAtbWFzay5oPgorCisjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIHM1cDY0eDBfY29yZV9zYXZlW10gPSB7CisJU0FWRV9JVEVNKFM1UDY0WDBfQVBMTF9DT04pLAorCVNBVkVfSVRFTShTNVA2NFgwX01QTExfQ09OKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9FUExMX0NPTiksCisJU0FWRV9JVEVNKFM1UDY0WDBfRVBMTF9DT05fSyksCisJU0FWRV9JVEVNKFM1UDY0WDBfQ0xLX1NSQzApLAorCVNBVkVfSVRFTShTNVA2NFgwX0NMS19TUkMxKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9DTEtfRElWMCksCisJU0FWRV9JVEVNKFM1UDY0WDBfQ0xLX0RJVjEpLAorCVNBVkVfSVRFTShTNVA2NFgwX0NMS19ESVYyKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9DTEtfRElWMyksCisJU0FWRV9JVEVNKFM1UDY0WDBfQ0xLX0dBVEVfTUVNMCksCisJU0FWRV9JVEVNKFM1UDY0WDBfQ0xLX0dBVEVfSENMSzEpLAorCVNBVkVfSVRFTShTNVA2NFgwX0NMS19HQVRFX1NDTEsxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBzNXA2NHgwX21pc2Nfc2F2ZVtdID0geworCVNBVkVfSVRFTShTNVA2NFgwX0FIQl9DT04wKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9TUENPTjApLAorCVNBVkVfSVRFTShTNVA2NFgwX1NQQ09OMSksCisJU0FWRV9JVEVNKFM1UDY0WDBfTUVNMENPTlNMUDApLAorCVNBVkVfSVRFTShTNVA2NFgwX01FTTBDT05TTFAxKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9NRU0wRFJWQ09OKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9NRU0xRFJWQ09OKSwKKworCVNBVkVfSVRFTShTM0M2NFhYX1RJTlRfQ1NUQVQpLAorfTsKKworLyogRFBMTCBpcyBwcmVzZW50IG9ubHkgaW4gUzVQNjQ1MCAqLworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIHM1cDY0NTBfY29yZV9zYXZlW10gPSB7CisJU0FWRV9JVEVNKFM1UDY0NTBfRFBMTF9DT04pLAorCVNBVkVfSVRFTShTNVA2NDUwX0RQTExfQ09OX0spLAorfTsKKwordm9pZCBzM2NfcG1fY29uZmlndXJlX2V4dGludCh2b2lkKQoreworCV9fcmF3X3dyaXRlbChzM2NfaXJxd2FrZV9laW50bWFzaywgUzVQNjRYMF9FSU5UX1dBS0VVUF9NQVNLKTsKK30KKwordm9pZCBzM2NfcG1fcmVzdG9yZV9jb3JlKHZvaWQpCit7CisJX19yYXdfd3JpdGVsKDAsIFM1UDY0WDBfRUlOVF9XQUtFVVBfTUFTSyk7CisKKwlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKHM1cDY0eDBfY29yZV9zYXZlLAorCQkJCUFSUkFZX1NJWkUoczVwNjR4MF9jb3JlX3NhdmUpKTsKKworCWlmIChzb2NfaXNfczVwNjQ1MCgpKQorCQlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKHM1cDY0NTBfY29yZV9zYXZlLAorCQkJCUFSUkFZX1NJWkUoczVwNjQ1MF9jb3JlX3NhdmUpKTsKKworCXMzY19wbV9kb19yZXN0b3JlKHM1cDY0eDBfbWlzY19zYXZlLCBBUlJBWV9TSVpFKHM1cDY0eDBfbWlzY19zYXZlKSk7Cit9CisKK3ZvaWQgczNjX3BtX3NhdmVfY29yZSh2b2lkKQoreworCXMzY19wbV9kb19zYXZlKHM1cDY0eDBfbWlzY19zYXZlLCBBUlJBWV9TSVpFKHM1cDY0eDBfbWlzY19zYXZlKSk7CisKKwlpZiAoc29jX2lzX3M1cDY0NTAoKSkKKwkJczNjX3BtX2RvX3NhdmUoczVwNjQ1MF9jb3JlX3NhdmUsCisJCQkJQVJSQVlfU0laRShzNXA2NDUwX2NvcmVfc2F2ZSkpOworCisJczNjX3BtX2RvX3NhdmUoczVwNjR4MF9jb3JlX3NhdmUsIEFSUkFZX1NJWkUoczVwNjR4MF9jb3JlX3NhdmUpKTsKK30KKworc3RhdGljIGludCBzNXA2NHgwX2NwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKKworCS8qCisJICogSXNzdWUgdGhlIHN0YW5kYnkgc2lnbmFsIGludG8gdGhlIHBtIHVuaXQuIE5vdGUsIHdlCisJICogaXNzdWUgYSB3cml0ZS1idWZmZXIgZHJhaW4ganVzdCBpbiBjYXNlLgorCSAqLworCWFzbSgiYiAxZlxuXHQiCisJICAgICIuYWxpZ24gNVxuXHQiCisJICAgICIxOlxuXHQiCisJICAgICJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxMCwgNVxuXHQiCisJICAgICJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxMCwgNFxuXHQiCisJICAgICJtY3IgcDE1LCAwLCAlMCwgYzcsIGMwLCA0IiA6IDogInIiICh0bXApKTsKKworCS8qIHdlIHNob3VsZCBuZXZlciBnZXQgcGFzdCBoZXJlICovCisJcGFuaWMoInNsZWVwIHJlc3VtZWQgdG8gb3JpZ2luYXRvcj8iKTsKK30KKworLyogbWFwcGluZyBvZiBpbnRlcnJ1cHRzIHRvIHBhcnRzIG9mIHRoZSB3YWtldXAgbWFzayAqLworc3RhdGljIHN0cnVjdCBzYW1zdW5nX3dha2V1cF9tYXNrIHM1cDY0eDBfd2FrZV9pcnFzW10gPSB7CisJeyAuaXJxID0gSVJRX1JUQ19BTEFSTSwJLmJpdCA9IFM1UDY0WDBfUFdSX0NGR19SVENfQUxSTV9ESVNBQkxFLCB9LAorCXsgLmlycSA9IElSUV9SVENfVElDLAkuYml0ID0gUzVQNjRYMF9QV1JfQ0ZHX1JUQ19USUNLX0RJU0FCTEUsIH0sCisJeyAuaXJxID0gSVJRX0hTTU1DMCwJLmJpdCA9IFM1UDY0WDBfUFdSX0NGR19NTUMwX0RJU0FCTEUsIH0sCisJeyAuaXJxID0gSVJRX0hTTU1DMSwJLmJpdCA9IFM1UDY0WDBfUFdSX0NGR19NTUMxX0RJU0FCTEUsIH0sCit9OworCitzdGF0aWMgdm9pZCBzNXA2NHgwX3BtX3ByZXBhcmUodm9pZCkKK3sKKwl1MzIgdG1wOworCisJc2Ftc3VuZ19zeW5jX3dha2VtYXNrKFM1UDY0WDBfUFdSX0NGRywKKwkJCXM1cDY0eDBfd2FrZV9pcnFzLCBBUlJBWV9TSVpFKHM1cDY0eDBfd2FrZV9pcnFzKSk7CisKKwkvKiBzdG9yZSB0aGUgcmVzdW1lIGFkZHJlc3MgaW4gSU5GT1JNMCByZWdpc3RlciAqLworCV9fcmF3X3dyaXRlbCh2aXJ0X3RvX3BoeXMoczNjX2NwdV9yZXN1bWUpLCBTNVA2NFgwX0lORk9STTApOworCisJLyogc2V0dXAgY2xvY2sgZ2F0aW5nIGZvciBGSU1HVkcgYmxvY2sgKi8KKwlfX3Jhd193cml0ZWwoKF9fcmF3X3JlYWRsKFM1UDY0WDBfQ0xLX0dBVEVfSENMSzEpIHwgXAorCQkoUzVQNjRYMF9DTEtfR0FURV9IQ0xLMV9GSU1HVkcpKSwgUzVQNjRYMF9DTEtfR0FURV9IQ0xLMSk7CisJX19yYXdfd3JpdGVsKChfX3Jhd19yZWFkbChTNVA2NFgwX0NMS19HQVRFX1NDTEsxKSB8IFwKKwkJKFM1UDY0WDBfQ0xLX0dBVEVfU0NMSzFfRklNR1ZHKSksIFM1UDY0WDBfQ0xLX0dBVEVfU0NMSzEpOworCisJLyogQ29uZmlndXJlIHRoZSBzdGFiaWxpemF0aW9uIGNvdW50ZXIgd2l0aCB3YWl0IHRpbWUgcmVxdWlyZWQgKi8KKwlfX3Jhd193cml0ZWwoUzVQNjRYMF9QV1JfU1RBQkxFX1BXUl9DTlRfVkFMNCwgUzVQNjRYMF9QV1JfU1RBQkxFKTsKKworCS8qIHNldCBXRkkgdG8gU0xFRVAgbW9kZSBjb25maWd1cmF0aW9uICovCisJdG1wID0gX19yYXdfcmVhZGwoUzVQNjRYMF9TTEVFUF9DRkcpOworCXRtcCAmPSB+KFM1UDY0WDBfU0xFRVBfQ0ZHX09TQ19FTik7CisJX19yYXdfd3JpdGVsKHRtcCwgUzVQNjRYMF9TTEVFUF9DRkcpOworCisJdG1wID0gX19yYXdfcmVhZGwoUzVQNjRYMF9QV1JfQ0ZHKTsKKwl0bXAgJj0gfihTNVA2NFgwX1BXUl9DRkdfV0ZJX01BU0spOworCXRtcCB8PSBTNVA2NFgwX1BXUl9DRkdfV0ZJX1NMRUVQOworCV9fcmF3X3dyaXRlbCh0bXAsIFM1UDY0WDBfUFdSX0NGRyk7CisKKwkvKgorCSAqIHNldCBPVEhFUlMgcmVnaXN0ZXIgdG8gZGlzYWJsZSBpbnRlcnJ1cHQgYmVmb3JlIGdvaW5nIHRvCisJICogc2xlZXAuIFRoaXMgYml0IGlzIHByZXNlbnQgb25seSBpbiBTNVA2NDUwLCBpdCBpcyByZXNlcnZlZAorCSAqIGluIFM1UDY0NDAuCisJICovCisJaWYgKHNvY19pc19zNXA2NDUwKCkpIHsKKwkJdG1wID0gX19yYXdfcmVhZGwoUzVQNjRYMF9PVEhFUlMpOworCQl0bXAgfD0gUzVQNjQ1MF9PVEhFUlNfRElTQUJMRV9JTlQ7CisJCV9fcmF3X3dyaXRlbCh0bXAsIFM1UDY0WDBfT1RIRVJTKTsKKwl9CisKKwkvKiBlbnN1cmUgcHJldmlvdXMgd2FrZXVwIHN0YXRlIGlzIGNsZWFyZWQgYmVmb3JlIHNsZWVwaW5nICovCisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFM1UDY0WDBfV0FLRVVQX1NUQVQpLCBTNVA2NFgwX1dBS0VVUF9TVEFUKTsKKworfQorCitzdGF0aWMgaW50IHM1cDY0eDBfcG1fYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCit7CisJcG1fY3B1X3ByZXAgPSBzNXA2NHgwX3BtX3ByZXBhcmU7CisJcG1fY3B1X3NsZWVwID0gczVwNjR4MF9jcHVfc3VzcGVuZDsKKwlwbV91YXJ0X3VkaXZzbG90ID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgczVwNjR4MF9wbV9kcml2ZXIgPSB7CisJLmFkZAkJPSBzNXA2NHgwX3BtX2FkZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHM1cDY0eDBfcG1fZHJ2aW5pdCh2b2lkKQoreworCXMzY19wbV9pbml0KCk7CisKKwlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmczVwNjR4MF9zeXNjbGFzcywgJnM1cDY0eDBfcG1fZHJpdmVyKTsKK30KK2FyY2hfaW5pdGNhbGwoczVwNjR4MF9wbV9kcnZpbml0KTsKKworc3RhdGljIHZvaWQgczVwNjR4MF9wbV9yZXN1bWUodm9pZCkKK3sKKwl1MzIgdG1wOworCisJdG1wID0gX19yYXdfcmVhZGwoUzVQNjRYMF9PVEhFUlMpOworCXRtcCB8PSAoUzVQNjRYMF9PVEhFUlNfUkVUX01NQzAgfCBTNVA2NFgwX09USEVSU19SRVRfTU1DMSB8IFwKKwkJCVM1UDY0WDBfT1RIRVJTX1JFVF9VQVJUKTsKKwlfX3Jhd193cml0ZWwodG1wICwgUzVQNjRYMF9PVEhFUlMpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHM1cDY0eDBfcG1fc3lzY29yZV9vcHMgPSB7CisJLnJlc3VtZQkJPSBzNXA2NHgwX3BtX3Jlc3VtZSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHM1cDY0eDBfcG1fc3lzY29yZV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnM1cDY0eDBfcG1fc3lzY29yZV9vcHMpOworCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKHM1cDY0eDBfcG1fc3lzY29yZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9zZXR1cC1mYi0yNGJwcC5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL3NldHVwLWZiLTI0YnBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0NmVlNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9zZXR1cC1mYi0yNGJwcC5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwNjR4MC9zZXR1cC1mYi0yNGJwcC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiAgICAgICAgICAgICBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIEJhc2UgUzVQNjRYMCBHUElPIHNldHVwIGluZm9ybWF0aW9uIGZvciBMQ0QgZnJhbWVidWZmZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2ZiLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorCit2b2lkIHM1cDY0eDBfZmJfZ3Bpb19zZXR1cF8yNGJwcCh2b2lkKQoreworCWlmIChzb2NfaXNfczVwNjQ0MCgpKSB7CisJCXMzY19ncGlvX2NmZ3JhbmdlX25vcHVsbChTNVA2NDQwX0dQSSgwKSwgMTYsIFMzQ19HUElPX1NGTigyKSk7CisJCXMzY19ncGlvX2NmZ3JhbmdlX25vcHVsbChTNVA2NDQwX0dQSigwKSwgMTIsIFMzQ19HUElPX1NGTigyKSk7CisJfSBlbHNlIGlmIChzb2NfaXNfczVwNjQ1MCgpKSB7CisJCXMzY19ncGlvX2NmZ3JhbmdlX25vcHVsbChTNVA2NDUwX0dQSSgwKSwgMTYsIFMzQ19HUElPX1NGTigyKSk7CisJCXMzY19ncGlvX2NmZ3JhbmdlX25vcHVsbChTNVA2NDUwX0dQSigwKSwgMTIsIFMzQ19HUElPX1NGTigyKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvS2NvbmZpZwppbmRleCBlOGEzM2M0Li5lNTM4YTRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvS2NvbmZpZwpAQCAtMTAsNyArMTAsNyBAQAogY29uZmlnIENQVV9TNVBDMTAwCiAJYm9vbAogCXNlbGVjdCBTNVBfRVhUX0lOVAotCXNlbGVjdCBTM0NfUEwzMzBfRE1BCisJc2VsZWN0IFNBTVNVTkdfRE1BREVWCiAJaGVscAogCSAgRW5hYmxlIFM1UEMxMDAgQ1BVIHN1cHBvcnQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvY2xvY2suYwppbmRleCBmZjVjYmIzLi44ZDQ3NzA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvY2xvY2suYwpAQCAtMzMsNiArMzMsMTEgQEAKIAkubmFtZQkJPSAib3RnX3BoeSIsCiB9OwogCitzdGF0aWMgc3RydWN0IGNsayBkdW1teV9hcGJfcGNsayA9IHsKKwkubmFtZQkJPSAiYXBiX3BjbGsiLAorCS5pZAkJPSAtMSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfc3JjX21vdXRfaHJlZl9saXN0W10gPSB7CiAJWzBdID0gJnM1cF9jbGtfMjdtLAogCVsxXSA9ICZjbGtfZmluX2hwbGwsCkBAIC00NTQsMTQgKzQ1OSwxNCBAQAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDIpLAogCX0sIHsKLQkJLm5hbWUJCT0gInBkbWEiLAotCQkuZGV2bmFtZQk9ICJzM2MtcGwzMzAuMSIsCisJCS5uYW1lCQk9ICJkbWEiLAorCQkuZGV2bmFtZQk9ICJkbWEtcGwzMzAuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKIAl9LCB7Ci0JCS5uYW1lCQk9ICJwZG1hIiwKLQkJLmRldm5hbWUJPSAiczNjLXBsMzMwLjAiLAorCQkubmFtZQkJPSAiZG1hIiwKKwkJLmRldm5hbWUJPSAiZG1hLXBsMzMwLjAiLAogCQkucGFyZW50CQk9ICZjbGtfZGl2X2QxX2J1cy5jbGssCiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8wX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMCksCkBAIC0xMjc2LDUgKzEyODEsNyBAQAogCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOwogCXMzY19kaXNhYmxlX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7CiAKKwlzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZkdW1teV9hcGJfcGNsayk7CisKIAlzM2NfcHdtY2xrX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9kbWEuYwppbmRleCBiZjRjZDBmLi4wNjVhMDg3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2RtYS5jCkBAIC0xLDQgKzEsOCBAQAotLyoKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwYzEwMC9kbWEuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkLgogICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgogICoKQEAgLTE3LDE1MCArMjEsMjQ2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwzMzAuaD4KIAorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2lycXMuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3MzYy1wbDMzMC1wZGF0YS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAKIHN0YXRpYyB1NjQgZG1hX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cGMxMDBfcGRtYTBfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCAgPSBTNVBDMTAwX1BBX1BETUEwLAotCQkuZW5kICAgID0gUzVQQzEwMF9QQV9QRE1BMCArIFNaXzRLLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1BETUEwLAotCQkuZW5kCT0gSVJRX1BETUEwLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKK3N0cnVjdCBkbWFfcGwzMzBfcGVyaSBwZG1hMF9wZXJpWzMwXSA9IHsKKwl7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUM19UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSBETUFDSF9JUkRBLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMFNfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0FDOTdfTUlDSU4sCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0FDOTdfUENNSU4sCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0FDOTdfUENNT1VULAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9FWFRFUk5BTCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BXTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQRElGLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9IU0lfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0hTSV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9wbGF0ZGF0YSBzNXBjMTAwX3BkbWEwX3BkYXRhID0gewotCS5wZXJpID0gewotCQlbMF0gPSBETUFDSF9VQVJUMF9SWCwKLQkJWzFdID0gRE1BQ0hfVUFSVDBfVFgsCi0JCVsyXSA9IERNQUNIX1VBUlQxX1JYLAotCQlbM10gPSBETUFDSF9VQVJUMV9UWCwKLQkJWzRdID0gRE1BQ0hfVUFSVDJfUlgsCi0JCVs1XSA9IERNQUNIX1VBUlQyX1RYLAotCQlbNl0gPSBETUFDSF9VQVJUM19SWCwKLQkJWzddID0gRE1BQ0hfVUFSVDNfVFgsCi0JCVs4XSA9IERNQUNIX0lSREEsCi0JCVs5XSA9IERNQUNIX0kyUzBfUlgsCi0JCVsxMF0gPSBETUFDSF9JMlMwX1RYLAotCQlbMTFdID0gRE1BQ0hfSTJTMFNfVFgsCi0JCVsxMl0gPSBETUFDSF9JMlMxX1JYLAotCQlbMTNdID0gRE1BQ0hfSTJTMV9UWCwKLQkJWzE0XSA9IERNQUNIX0kyUzJfUlgsCi0JCVsxNV0gPSBETUFDSF9JMlMyX1RYLAotCQlbMTZdID0gRE1BQ0hfU1BJMF9SWCwKLQkJWzE3XSA9IERNQUNIX1NQSTBfVFgsCi0JCVsxOF0gPSBETUFDSF9TUEkxX1JYLAotCQlbMTldID0gRE1BQ0hfU1BJMV9UWCwKLQkJWzIwXSA9IERNQUNIX1NQSTJfUlgsCi0JCVsyMV0gPSBETUFDSF9TUEkyX1RYLAotCQlbMjJdID0gRE1BQ0hfQUM5N19NSUNJTiwKLQkJWzIzXSA9IERNQUNIX0FDOTdfUENNSU4sCi0JCVsyNF0gPSBETUFDSF9BQzk3X1BDTU9VVCwKLQkJWzI1XSA9IERNQUNIX0VYVEVSTkFMLAotCQlbMjZdID0gRE1BQ0hfUFdNLAotCQlbMjddID0gRE1BQ0hfU1BESUYsCi0JCVsyOF0gPSBETUFDSF9IU0lfUlgsCi0JCVsyOV0gPSBETUFDSF9IU0lfVFgsCi0JCVszMF0gPSBETUFDSF9NQVgsCi0JCVszMV0gPSBETUFDSF9NQVgsCi0JfSwKK3N0cnVjdCBkbWFfcGwzMzBfcGxhdGRhdGEgczVwYzEwMF9wZG1hMF9wZGF0YSA9IHsKKwkubnJfdmFsaWRfcGVyaSA9IEFSUkFZX1NJWkUocGRtYTBfcGVyaSksCisJLnBlcmkgPSBwZG1hMF9wZXJpLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfcGRtYTAgPSB7Ci0JLm5hbWUJCT0gInMzYy1wbDMzMCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cGMxMDBfcGRtYTBfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cGMxMDBfcGRtYTBfcmVzb3VyY2UsCi0JLmRldgkJPSB7CitzdHJ1Y3QgYW1iYV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfcGRtYTAgPSB7CisJLmRldiA9IHsKKwkJLmluaXRfbmFtZSA9ICJkbWEtcGwzMzAuMCIsCiAJCS5kbWFfbWFzayA9ICZkbWFfZG1hbWFzaywKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmczVwYzEwMF9wZG1hMF9wZGF0YSwKIAl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBjMTAwX3BkbWExX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgID0gUzVQQzEwMF9QQV9QRE1BMSwKLQkJLmVuZCAgICA9IFM1UEMxMDBfUEFfUERNQTEgKyBTWl80SywKKwkucmVzID0geworCQkuc3RhcnQgPSBTNVBDMTAwX1BBX1BETUEwLAorCQkuZW5kID0gUzVQQzEwMF9QQV9QRE1BMCArIFNaXzRLLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1BETUExLAotCQkuZW5kCT0gSVJRX1BETUExLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkuaXJxID0ge0lSUV9QRE1BMCwgTk9fSVJRfSwKKwkucGVyaXBoaWQgPSAweDAwMDQxMzMwLAorfTsKKworc3RydWN0IGRtYV9wbDMzMF9wZXJpIHBkbWExX3BlcmlbMzBdID0geworCXsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9IERNQUNIX0lSREEsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwU19UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTVNNX1JFUTAsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NU01fUkVRMSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01TTV9SRVEyLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTVNNX1JFUTMsCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX3BsMzMwX3BsYXRkYXRhIHM1cGMxMDBfcGRtYTFfcGRhdGEgPSB7Ci0JLnBlcmkgPSB7Ci0JCVswXSA9IERNQUNIX1VBUlQwX1JYLAotCQlbMV0gPSBETUFDSF9VQVJUMF9UWCwKLQkJWzJdID0gRE1BQ0hfVUFSVDFfUlgsCi0JCVszXSA9IERNQUNIX1VBUlQxX1RYLAotCQlbNF0gPSBETUFDSF9VQVJUMl9SWCwKLQkJWzVdID0gRE1BQ0hfVUFSVDJfVFgsCi0JCVs2XSA9IERNQUNIX1VBUlQzX1JYLAotCQlbN10gPSBETUFDSF9VQVJUM19UWCwKLQkJWzhdID0gRE1BQ0hfSVJEQSwKLQkJWzldID0gRE1BQ0hfSTJTMF9SWCwKLQkJWzEwXSA9IERNQUNIX0kyUzBfVFgsCi0JCVsxMV0gPSBETUFDSF9JMlMwU19UWCwKLQkJWzEyXSA9IERNQUNIX0kyUzFfUlgsCi0JCVsxM10gPSBETUFDSF9JMlMxX1RYLAotCQlbMTRdID0gRE1BQ0hfSTJTMl9SWCwKLQkJWzE1XSA9IERNQUNIX0kyUzJfVFgsCi0JCVsxNl0gPSBETUFDSF9TUEkwX1JYLAotCQlbMTddID0gRE1BQ0hfU1BJMF9UWCwKLQkJWzE4XSA9IERNQUNIX1NQSTFfUlgsCi0JCVsxOV0gPSBETUFDSF9TUEkxX1RYLAotCQlbMjBdID0gRE1BQ0hfU1BJMl9SWCwKLQkJWzIxXSA9IERNQUNIX1NQSTJfVFgsCi0JCVsyMl0gPSBETUFDSF9QQ00wX1JYLAotCQlbMjNdID0gRE1BQ0hfUENNMF9UWCwKLQkJWzI0XSA9IERNQUNIX1BDTTFfUlgsCi0JCVsyNV0gPSBETUFDSF9QQ00xX1RYLAotCQlbMjZdID0gRE1BQ0hfTVNNX1JFUTAsCi0JCVsyN10gPSBETUFDSF9NU01fUkVRMSwKLQkJWzI4XSA9IERNQUNIX01TTV9SRVEyLAotCQlbMjldID0gRE1BQ0hfTVNNX1JFUTMsCi0JCVszMF0gPSBETUFDSF9NQVgsCi0JCVszMV0gPSBETUFDSF9NQVgsCi0JfSwKK3N0cnVjdCBkbWFfcGwzMzBfcGxhdGRhdGEgczVwYzEwMF9wZG1hMV9wZGF0YSA9IHsKKwkubnJfdmFsaWRfcGVyaSA9IEFSUkFZX1NJWkUocGRtYTFfcGVyaSksCisJLnBlcmkgPSBwZG1hMV9wZXJpLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfcGRtYTEgPSB7Ci0JLm5hbWUJCT0gInMzYy1wbDMzMCIsCi0JLmlkCQk9IDEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cGMxMDBfcGRtYTFfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cGMxMDBfcGRtYTFfcmVzb3VyY2UsCi0JLmRldgkJPSB7CitzdHJ1Y3QgYW1iYV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfcGRtYTEgPSB7CisJLmRldiA9IHsKKwkJLmluaXRfbmFtZSA9ICJkbWEtcGwzMzAuMSIsCiAJCS5kbWFfbWFzayA9ICZkbWFfZG1hbWFzaywKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmczVwYzEwMF9wZG1hMV9wZGF0YSwKIAl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnM1cGMxMDBfZG1hY3NbXSBfX2luaXRkYXRhID0gewotCSZzNXBjMTAwX2RldmljZV9wZG1hMCwKLQkmczVwYzEwMF9kZXZpY2VfcGRtYTEsCisJLnJlcyA9IHsKKwkJLnN0YXJ0ID0gUzVQQzEwMF9QQV9QRE1BMSwKKwkJLmVuZCA9IFM1UEMxMDBfUEFfUERNQTEgKyBTWl80SywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkuaXJxID0ge0lSUV9QRE1BMSwgTk9fSVJRfSwKKwkucGVyaXBoaWQgPSAweDAwMDQxMzMwLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgczVwYzEwMF9kbWFfaW5pdCh2b2lkKQogewotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHM1cGMxMDBfZG1hY3MsIEFSUkFZX1NJWkUoczVwYzEwMF9kbWFjcykpOworCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKCZzNXBjMTAwX2RldmljZV9wZG1hMCwgJmlvbWVtX3Jlc291cmNlKTsKKwlhbWJhX2RldmljZV9yZWdpc3RlcigmczVwYzEwMF9kZXZpY2VfcGRtYTEsICZpb21lbV9yZXNvdXJjZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZmYTgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19NQUNIX0NMS0RFVl9IX18KLSNkZWZpbmUgX19NQUNIX0NMS0RFVl9IX18KLQotI2RlZmluZSBfX2Nsa19nZXQoY2xrKSAoeyAxOyB9KQotI2RlZmluZSBfX2Nsa19wdXQoY2xrKSBkbyB7fSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggYjJiYTk1ZC4uNjk0Zjc1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMjIsNyArMjIsNyBAQAogCSAqIGFsaWduZWQgYW5kIGFkZCBpbiB0aGUgb2Zmc2V0IHdoZW4gd2UgbG9hZCB0aGUgdmFsdWUgaGVyZS4KIAkgKi8KIAotCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQlsZHIJXHJwLCA9IFMzQ19QQV9VQVJUCiAJCWxkcglccnYsID0gUzNDX1ZBX1VBUlQKICNpZiBDT05GSUdfREVCVUdfUzNDX1VBUlQgIT0gMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggODEyMDllYi4uMjAxODQyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaWZuZGVmIF9fTUFDSF9ETUFfSAogI2RlZmluZSBfX01BQ0hfRE1BX0gKIAotLyogVGhpcyBwbGF0Zm9ybSB1c2VzIHRoZSBjb21tb24gUzNDIERNQSBBUEkgZHJpdmVyIGZvciBQTDMzMCAqLwotI2luY2x1ZGUgPHBsYXQvczNjLWRtYS1wbDMzMC5oPgorLyogVGhpcyBwbGF0Zm9ybSB1c2VzIHRoZSBjb21tb24gRE1BIEFQSSBkcml2ZXIgZm9yIFBMMzMwICovCisjaW5jbHVkZSA8cGxhdC9kbWEtcGwzMzAuaD4KIAogI2VuZGlmIC8qIF9fTUFDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAyOWE4YTEyLi41ZTFhOTI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTUsMTEgKzE1LDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9HUElPX0gKICNkZWZpbmUgX19BU01fQVJDSF9HUElPX0ggX19GSUxFX18KIAotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEJX19ncGlvX3RvX2lycQotCiAvKiBHUElPIGJhbmsgc2l6ZXMgKi8KICNkZWZpbmUgUzVQQzEwMF9HUElPX0EwX05SCSg4KQogI2RlZmluZSBTNVBDMTAwX0dQSU9fQTFfTlIJKDUpCkBAIC0xNDYsNiArMTQxLDQgQEAKIC8qIGRlZmluZSB0aGUgbnVtYmVyIG9mIGdwaW9zIHdlIG5lZWQgdG8gdGhlIG9uZSBhZnRlciB0aGUgTVAwNCgpIHJhbmdlICovCiAjZGVmaW5lIEFSQ0hfTlJfR1BJT1MJCShTNVBDMTAwX0dQSU9fRU5EICsgMSkKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhNGU3OS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIENvcHlyaWdodCAyMDA4IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uCi0gKiAgICAgIEJ5dW5naG8gTWluIDxiaG1pbkBzYW1zdW5nLmNvbT4KLSAqCi0gKiBCYXNlZCBvbiBtYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVCAgICAgCVVMKDB4MjAwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNGQyZjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLgotICogICAgICBCeXVuZ2hvIE1pbiA8YmhtaW5Ac2Ftc3VuZy5jb20+Ci0gKgotICogUzVQQzEwMCAtIHB3bSBjbG9jayBhbmQgdGltZXIgc3VwcG9ydAotICoKLSAqIEJhc2VkIG9uIG1hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKLSAqLwotCi0vKioKLSAqIHB3bV9jZmdfc3JjX2lzX3RjbGsoKSAtIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtdXggY29uZmlnIGlzIGEgdGNsawotICogQHRjZmc6IFRoZSB0aW1lciBUQ0ZHMSByZWdpc3RlciBiaXRzIHNoaWZ0ZWQgZG93biB0byAwLgotICoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZyb20gVENGRzEgaXMgYSBUQ0xLIGluc3RlYWQKLSAqIGFueSBvZiB0aGUgVERJViBjbG9ja3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB3bV9jZmdfc3JjX2lzX3RjbGsodW5zaWduZWQgbG9uZyB0Y2ZnKQotewotCXJldHVybiB0Y2ZnID49IFMzQzY0WFhfVENGRzFfTVVYX1RDTEs7Ci19Ci0KLS8qKgotICogdGNmZ190b19kaXZpc29yKCkgLSBjb252ZXJ0IHRjZmcxIHNldHRpbmcgdG8gYSBkaXZpc29yCi0gKiBAdGNmZzE6IFRoZSB0Y2ZnMSBzZXR0aW5nLCBzaGlmdGVkIGRvd24uCi0gKgotICogR2V0IHRoZSBkaXZpc29yIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdGNmZzEgc2V0dGluZy4gV2UgYXNzdW1lIHRoZQotICogY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdG8gc2VlIGlmIHRoaXMgaXMgbm90IGEgVENMSyBzb3VyY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0Y2ZnX3RvX2Rpdmlzb3IodW5zaWduZWQgbG9uZyB0Y2ZnMSkKLXsKLQlyZXR1cm4gMSA8PCB0Y2ZnMTsKLX0KLQotLyoqCi0gKiBwd21fdGRpdl9oYXNfZGl2MSgpIC0gZG9lcyB0aGUgdGRpdiBzZXR0aW5nIGhhdmUgYSAvMQotICoKLSAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgYSAvMSBpbiB0aGUgdGRpdiBzZXR0aW5nLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwd21fdGRpdl9oYXNfZGl2MSh2b2lkKQotewotCXJldHVybiAxOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2Rpdl9iaXRzKCkgLSBjYWxjdWxhdGUgVENGRzEgZGl2aXNvciB2YWx1ZS4KLSAqIEBkaXY6IFRoZSBkaXZpc29yIHRvIGNhbGN1bGF0ZSB0aGUgYml0IGluZm9ybWF0aW9uIGZvci4KLSAqCi0gKiBUdXJuIGEgZGl2aXNvciBpbnRvIHRoZSBuZWNlc3NhcnkgYml0IGZpZWxkIGZvciBUQ0ZHMS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB3bV90ZGl2X2Rpdl9iaXRzKHVuc2lnbmVkIGludCBkaXYpCi17Ci0JcmV0dXJuIGlsb2cyKGRpdik7Ci19Ci0KLSNkZWZpbmUgUzNDX1RDRkcxX01VWF9UQ0xLIFMzQzY0WFhfVENGRzFfTVVYX1RDTEsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9tYWNoLXNtZGtjMTAwLmMgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvbWFjaC1zbWRrYzEwMC5jCmluZGV4IDIyN2Q4OTAuLjI2ZjVjOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9tYWNoLXNtZGtjMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL21hY2gtc21ka2MxMDAuYwpAQCAtMjAzLDEyICsyMDMsNiBAQAogCSZzNXBjMTAwX2RldmljZV9zcGRpZiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gczNjX3RzX3BsYXRmb3JtIF9faW5pdGRhdGEgPSB7Ci0JLmRlbGF5CQkJPSAxMDAwMCwKLQkucHJlc2MJCQk9IDQ5LAotCS5vdmVyc2FtcGxpbmdfc2hpZnQJPSAyLAotfTsKLQogLyogTENEIEJhY2tsaWdodCBkYXRhICovCiBzdGF0aWMgc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvIHNtZGtjMTAwX2JsX2dwaW9faW5mbyA9IHsKIAkubm8gPSBTNVBDMTAwX0dQRCgwKSwKQEAgLTIyOCw3ICsyMjIsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgc21ka2MxMDBfbWFjaGluZV9pbml0KHZvaWQpCiB7Ci0JczNjMjR4eF90c19zZXRfcGxhdGRhdGEoJnMzY190c19wbGF0Zm9ybSk7CisJczNjMjR4eF90c19zZXRfcGxhdGRhdGEoTlVMTCk7CiAKIAkvKiBJMkMgKi8KIAlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoTlVMTCk7CkBAIC0yNTQsNyArMjQ4LDcgQEAKIAogTUFDSElORV9TVEFSVChTTURLQzEwMCwgIlNNREtDMTAwIikKIAkvKiBNYWludGFpbmVyOiBCeXVuZ2hvIE1pbiA8YmhtaW5Ac2Ftc3VuZy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzVQX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfaXJxCT0gczVwYzEwMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtZGtjMTAwX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gc21ka2MxMDBfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL3NldHVwLXNkaGNpLmMgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvc2V0dXAtc2RoY2kuYwppbmRleCBiZTI1ODc5Li42NDE4YzZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvc2V0dXAtc2RoY2kuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvc2V0dXAtc2RoY2kuYwpAQCAtMTEsMTcgKzExLDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1zZGhjaS5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KIAogLyogY2xvY2sgc291cmNlcyBmb3IgdGhlIG1tYyBidXMgY2xvY2ssIG9yZGVyIGFzIGZvciB0aGUgY3RybDJbNS4uNF0gKi8KIApAQCAtMzEsMzUgKzIxLDMgQEAKIAlbMl0gPSAic2Nsa19tbWMiLAkvKiBtbWNfYnVzICovCiAJLyogWzNdID0gIjQ4bSIsCQktIG5vdGUgbm90IHN1Y2Nlc3NmdWxseSB1c2VkIHlldCAqLwogfTsKLQotCi12b2lkIHM1cGMxMDBfc2V0dXBfc2RoY2kwX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkgICAgdm9pZCBfX2lvbWVtICpyLAotCQkJCSAgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCSAgICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCi17Ci0JdTMyIGN0cmwyLCBjdHJsMzsKLQotCS8qIGRvbid0IG5lZWQgdG8gYWx0ZXIgYW55dGhpbmcgYWNjb3JkaW5nIHRvIGNhcmQtdHlwZSAqLwotCi0Jd3JpdGVsKFMzQzY0WFhfU0RIQ0lfQ09OVFJPTDRfRFJJVkVfOW1BLCByICsgUzNDNjRYWF9TREhDSV9DT05UUk9MNCk7Ci0KLQljdHJsMiA9IHJlYWRsKHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwotCWN0cmwyICY9IFMzQ19TREhDSV9DVFJMMl9TRUxCQVNFQ0xLX01BU0s7Ci0JY3RybDIgfD0gKFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5TVEFBU1lOQ0NMUiB8Ci0JCSAgUzNDNjRYWF9TREhDSV9DVFJMMl9FTkNNRENORk1TSyB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0VORkJDTEtSWCB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0RGQ05UX05PTkUgfAotCQkgIFMzQ19TREhDSV9DVFJMMl9FTkNMS09VVEhPTEQpOwotCi0JaWYgKGlvcy0+Y2xvY2sgPCAyNSAqIDEwMDAwMDApCi0JCWN0cmwzID0gKFMzQ19TREhDSV9DVFJMM19GQ1NFTDMgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDIgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDEgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCWVsc2UKLQkJY3RybDMgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8IFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCi0Jd3JpdGVsKGN0cmwyLCByICsgUzNDX1NESENJX0NPTlRST0wyKTsKLQl3cml0ZWwoY3RybDMsIHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDMpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvS2NvbmZpZwppbmRleCA2OWRkODdjLi42NDYwNTdhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvS2NvbmZpZwpAQCAtMTEsMTAgKzExLDExIEBACiAKIGNvbmZpZyBDUFVfUzVQVjIxMAogCWJvb2wKLQlzZWxlY3QgUzNDX1BMMzMwX0RNQQorCXNlbGVjdCBTQU1TVU5HX0RNQURFVgogCXNlbGVjdCBTNVBfRVhUX0lOVAogCXNlbGVjdCBTNVBfSFJUCi0Jc2VsZWN0IFM1UFYyMTBfUE0gaWYgUE0KKwlzZWxlY3QgUzVQX1BNIGlmIFBNCisJc2VsZWN0IFM1UF9TTEVFUCBpZiBQTQogCWhlbHAKIAkgIEVuYWJsZSBTNVBWMjEwIENQVSBzdXBwb3J0CiAKQEAgLTk0LDExICs5NSwxMyBAQAogCXNlbGVjdCBTM0NfREVWX1VTQl9IU09URwogCXNlbGVjdCBTNVBfREVWX09ORU5BTkQKIAlzZWxlY3QgU0FNU1VOR19ERVZfS0VZUEFECisJc2VsZWN0IFM1UF9ERVZfVFYKIAlzZWxlY3QgUzVQVjIxMF9TRVRVUF9GQl8yNEJQUAogCXNlbGVjdCBTNVBWMjEwX1NFVFVQX0kyQzEKIAlzZWxlY3QgUzVQVjIxMF9TRVRVUF9JMkMyCiAJc2VsZWN0IFM1UFYyMTBfU0VUVVBfS0VZUEFECiAJc2VsZWN0IFM1UFYyMTBfU0VUVVBfU0RIQ0kKKwlzZWxlY3QgUzVQVjIxMF9TRVRVUF9GSU1DCiAJaGVscAogCSAgTWFjaGluZSBzdXBwb3J0IGZvciBTYW1zdW5nIEdPTkkgYm9hcmQKIAkgIFM1UEMxMTAoTUNQKSBpcyBvbmUgb2YgcGFja2FnZSBvcHRpb24gb2YgUzVQVjIxMApAQCAtMTY5LDkgKzE3Miw0IEBACiAKIGVuZG1lbnUKIAotY29uZmlnIFM1UFYyMTBfUE0KLQlib29sCi0JaGVscAotCSAgUG93ZXIgTWFuYWdlbWVudCBjb2RlIGNvbW1vbiB0byBTNVBWMjEwCi0KIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvTWFrZWZpbGUKaW5kZXggNTk5YTNjMC4uMDA5ZmJlNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9NYWtlZmlsZQpAQCAtMTQsNyArMTQsNyBAQAogCiBvYmotJChDT05GSUdfQ1BVX1M1UFYyMTApCSs9IGNwdS5vIGluaXQubyBjbG9jay5vIGRtYS5vCiBvYmotJChDT05GSUdfQ1BVX1M1UFYyMTApCSs9IHNldHVwLWkyYzAubwotb2JqLSQoQ09ORklHX1M1UFYyMTBfUE0pCSs9IHBtLm8gc2xlZXAubworb2JqLSQoQ09ORklHX1BNKQkJKz0gcG0ubwogCiAjIG1hY2hpbmUgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jCmluZGV4IGY1ZjhmYTguLjRjNWFjN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jCkBAIC0xNzQsNiArMTc0LDE2IEBACiAJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLX1NSQ19NQVNLMSwgY2xrLCBlbmFibGUpOwogfQogCitzdGF0aWMgaW50IGV4eW5vczRfY2xrX2hkbWlwaHlfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfSERNSV9QSFlfQ09OVFJPTCwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrX2RhY19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9EQUNfUEhZX0NPTlRST0wsIGNsaywgZW5hYmxlKTsKK30KKwogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3NjbGtfaGRtaTI3bSA9IHsKIAkubmFtZQkJPSAic2Nsa19oZG1pMjdtIiwKIAkucmF0ZQkJPSAyNzAwMDAwMCwKQEAgLTIwMyw2ICsyMTMsMTEgQEAKIAkubmFtZQkJPSAicGNtY2RjbGsiLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgZHVtbXlfYXBiX3BjbGsgPSB7CisJLm5hbWUJCT0gImFwYl9wY2xrIiwKKwkuaWQJCT0gLTEsCit9OworCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X3ZwbGxzcmNfbGlzdFtdID0gewogCVswXSA9ICZjbGtfZmluX3ZwbGwsCiAJWzFdID0gJmNsa19zY2xrX2hkbWkyN20sCkBAIC0yODksMTQgKzMwNCwxNCBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc19vZmZbXSA9IHsKIAl7Ci0JCS5uYW1lCQk9ICJwZG1hIiwKLQkJLmRldm5hbWUJPSAiczNjLXBsMzMwLjAiLAorCQkubmFtZQkJPSAiZG1hIiwKKwkJLmRldm5hbWUJPSAiZG1hLXBsMzMwLjAiLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKIAl9LCB7Ci0JCS5uYW1lCQk9ICJwZG1hIiwKLQkJLmRldm5hbWUJPSAiczNjLXBsMzMwLjEiLAorCQkubmFtZQkJPSAiZG1hIiwKKwkJLmRldm5hbWUJPSAiZG1hLXBsMzMwLjEiLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKQEAgLTMzMCw2ICszNDUsNDAgQEAKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAxNiksCiAJfSwgeworCQkubmFtZQkJPSAiZGFjIiwKKwkJLmRldm5hbWUJPSAiczVwLXNkbyIsCisJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2RzeXMuY2xrLAorCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJtaXhlciIsCisJCS5kZXZuYW1lCT0gInM1cC1taXhlciIsCisJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2RzeXMuY2xrLAorCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDkpLAorCX0sIHsKKwkJLm5hbWUJCT0gInZwIiwKKwkJLmRldm5hbWUJPSAiczVwLW1peGVyIiwKKwkJLnBhcmVudAkJPSAmY2xrX2hjbGtfZHN5cy5jbGssCisJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAxX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgOCksCisJfSwgeworCQkubmFtZQkJPSAiaGRtaSIsCisJCS5kZXZuYW1lCT0gInM1cHYyMTAtaGRtaSIsCisJCS5wYXJlbnQJCT0gJmNsa19oY2xrX2RzeXMuY2xrLAorCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDExKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJoZG1pcGh5IiwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC1oZG1pIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19oZG1pcGh5X2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwgeworCQkubmFtZQkJPSAiZGFjcGh5IiwKKwkJLmRldm5hbWUJPSAiczVwLXNkbyIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfZGFjX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwgewogCQkubmFtZQkJPSAib3RnIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfcHN5cy5jbGssCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAxX2N0cmwsCkBAIC00MDcsNiArNDU2LDEyIEBACiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDkpLAogCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaGRtaXBoeS1pMmMiLAorCQkucGFyZW50CQk9ICZjbGtfcGNsa19wc3lzLmNsaywKKwkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMSksCisJfSwgewogCQkubmFtZQkJPSAic3BpIiwKIAkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX3BzeXMuY2xrLApAQCAtNTk0LDYgKzY0OSwyMyBAQAogCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfc2Nsa19taXhlcl9saXN0KSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa19taXhlciA9IHsKKwkuY2xrCQk9IHsKKwkJLm5hbWUJCT0gInNjbGtfbWl4ZXIiLAorCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2swX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMSksCisJfSwKKwkuc291cmNlcyA9ICZjbGtzZXRfc2Nsa19taXhlciwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtfU1JDMSwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgKnNjbGtfdHZbXSA9IHsKKwkmY2xrX3NjbGtfZGFjLAorCSZjbGtfc2Nsa19waXhlbCwKKwkmY2xrX3NjbGtfaGRtaSwKKwkmY2xrX3NjbGtfbWl4ZXIsCit9OworCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X3NjbGtfYXVkaW8wX2xpc3RbXSA9IHsKIAlbMF0gPSAmY2xrX2V4dF94dGFsX211eCwKIAlbMV0gPSAmY2xrX3BjbWNkY2xrMCwKQEAgLTc3NywxNCArODQ5LDYgQEAKIAkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLX0RJVjQsIC5zaGlmdCA9IDI4LCAuc2l6ZSA9IDQgfSwKIAl9LCB7CiAJCS5jbGsJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19taXhlciIsCi0JCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2swX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDEpLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfc2Nsa19taXhlciwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLX1NSQzEsIC5zaGlmdCA9IDQsIC5zaXplID0gMSB9LAotCX0sIHsKLQkJLmNsawk9IHsKIAkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAogCQkJLmRldm5hbWUJPSAiczVwdjIxMC1maW1jLjAiLAogCQkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19tYXNrMV9jdHJsLApAQCAtOTczLDkgKzEwMzcsNiBAQAogCSZjbGtfcGNsa19wc3lzLAogCSZjbGtfdnBsbHNyYywKIAkmY2xrX3NjbGtfdnBsbCwKLQkmY2xrX3NjbGtfZGFjLAotCSZjbGtfc2Nsa19waXhlbCwKLQkmY2xrX3NjbGtfaGRtaSwKIAkmY2xrX21vdXRfZG1jMCwKIAkmY2xrX3NjbGtfZG1jMCwKIAkmY2xrX3NjbGtfYXVkaW8wLApAQCAtMTA2MCw2ICsxMTIxLDYxIEBACiAJLmdldF9yYXRlID0gczVwX2VwbGxfZ2V0X3JhdGUsCiB9OwogCitzdGF0aWMgdTMyIHZwbGxfZGl2W11bNV0gPSB7CisJeyAgNTQwMDAwMDAsIDMsIDUzLCAzLCAwIH0sCisJeyAxMDgwMDAwMDAsIDMsIDUzLCAyLCAwIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzNXB2MjEwX3ZwbGxfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGstPnJhdGU7Cit9CisKK3N0YXRpYyBpbnQgczVwdjIxMF92cGxsX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGludCB2cGxsX2NvbjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFJldHVybiBpZiBub3RoaW5nIGNoYW5nZWQgKi8KKwlpZiAoY2xrLT5yYXRlID09IHJhdGUpCisJCXJldHVybiAwOworCisJdnBsbF9jb24gPSBfX3Jhd19yZWFkbChTNVBfVlBMTF9DT04pOworCXZwbGxfY29uICY9IH4oMHgxIDw8IDI3IHwJCQkJCVwKKwkJCVBMTDkwWFhfTURJVl9NQVNLIDw8IFBMTDkwWFhfTURJVl9TSElGVCB8CVwKKwkJCVBMTDkwWFhfUERJVl9NQVNLIDw8IFBMTDkwWFhfUERJVl9TSElGVCB8CVwKKwkJCVBMTDkwWFhfU0RJVl9NQVNLIDw8IFBMTDkwWFhfU0RJVl9TSElGVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2cGxsX2Rpdik7IGkrKykgeworCQlpZiAodnBsbF9kaXZbaV1bMF0gPT0gcmF0ZSkgeworCQkJdnBsbF9jb24gfD0gdnBsbF9kaXZbaV1bMV0gPDwgUExMOTBYWF9QRElWX1NISUZUOworCQkJdnBsbF9jb24gfD0gdnBsbF9kaXZbaV1bMl0gPDwgUExMOTBYWF9NRElWX1NISUZUOworCQkJdnBsbF9jb24gfD0gdnBsbF9kaXZbaV1bM10gPDwgUExMOTBYWF9TRElWX1NISUZUOworCQkJdnBsbF9jb24gfD0gdnBsbF9kaXZbaV1bNF0gPDwgMjc7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IEFSUkFZX1NJWkUodnBsbF9kaXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgQ2xvY2sgVlBMTCBGcmVxdWVuY3lcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlfX3Jhd193cml0ZWwodnBsbF9jb24sIFM1UF9WUExMX0NPTik7CisKKwkvKiBXYWl0IGZvciBWUExMIGxvY2sgKi8KKwl3aGlsZSAoIShfX3Jhd19yZWFkbChTNVBfVlBMTF9DT04pICYgKDEgPDwgUExMOTBYWF9MT0NLRURfU0hJRlQpKSkKKwkJY29udGludWU7CisKKwljbGstPnJhdGUgPSByYXRlOworCXJldHVybiAwOworfQorc3RhdGljIHN0cnVjdCBjbGtfb3BzIHM1cHYyMTBfdnBsbF9vcHMgPSB7CisJLmdldF9yYXRlID0gczVwdjIxMF92cGxsX2dldF9yYXRlLAorCS5zZXRfcmF0ZSA9IHM1cHYyMTBfdnBsbF9zZXRfcmF0ZSwKK307CisKIHZvaWQgX19pbml0X29yX2NwdWZyZXEgczVwdjIxMF9zZXR1cF9jbG9ja3Modm9pZCkKIHsKIAlzdHJ1Y3QgY2xrICp4dGFsX2NsazsKQEAgLTExMDgsNiArMTIyNCw3IEBACiAJY2xrX2ZvdXRfYXBsbC5vcHMgPSAmY2xrX2ZvdXRfYXBsbF9vcHM7CiAJY2xrX2ZvdXRfbXBsbC5yYXRlID0gbXBsbDsKIAljbGtfZm91dF9lcGxsLnJhdGUgPSBlcGxsOworCWNsa19mb3V0X3ZwbGwub3BzID0gJnM1cHYyMTBfdnBsbF9vcHM7CiAJY2xrX2ZvdXRfdnBsbC5yYXRlID0gdnBsbDsKIAogCXByaW50ayhLRVJOX0lORk8gIlM1UFYyMTA6IFBMTCBzZXR0aW5ncywgQT0lbGQsIE09JWxkLCBFPSVsZCBWPSVsZCIsCkBAIC0xMTUzLDExICsxMjcwLDE1IEBACiAJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKHN5c2Nsa3MpOyBwdHIrKykKIAkJczNjX3JlZ2lzdGVyX2Nsa3NyYyhzeXNjbGtzW3B0cl0sIDEpOwogCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKHNjbGtfdHYpOyBwdHIrKykKKwkJczNjX3JlZ2lzdGVyX2Nsa3NyYyhzY2xrX3R2W3B0cl0sIDEpOworCiAJczNjX3JlZ2lzdGVyX2Nsa3NyYyhjbGtzcmNzLCBBUlJBWV9TSVpFKGNsa3NyY3MpKTsKIAlzM2NfcmVnaXN0ZXJfY2xvY2tzKGluaXRfY2xvY2tzLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzKSk7CiAKIAlzM2NfcmVnaXN0ZXJfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKIAlzM2NfZGlzYWJsZV9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOwogCisJczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmZHVtbXlfYXBiX3BjbGspOwogCXMzY19wd21jbGtfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2NwdS5jCmluZGV4IDc5OTA3ZWMuLjg0ZWM3NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jcHUuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY3B1LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC00MSw2ICs0Miw3IEBACiAjaW5jbHVkZSA8cGxhdC9rZXlwYWQtY29yZS5oPgogI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KICNpbmNsdWRlIDxwbGF0L3Jlc2V0Lmg+CisjaW5jbHVkZSA8cGxhdC90di1jb3JlLmg+CiAKIC8qIEluaXRpYWwgSU8gbWFwcGluZ3MgKi8KIApAQCAtMTE5LDYgKzEyMSw3IEBACiB2b2lkIF9faW5pdCBzNXB2MjEwX21hcF9pbyh2b2lkKQogewogCWlvdGFibGVfaW5pdChzNXB2MjEwX2lvZGVzYywgQVJSQVlfU0laRShzNXB2MjEwX2lvZGVzYykpOworCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZSgxNCA8PCAyMCk7CiAKIAkvKiBpbml0aWFsaXNlIGRldmljZSBpbmZvcm1hdGlvbiBlYXJseSAqLwogCXM1cHYyMTBfZGVmYXVsdF9zZGhjaTAoKTsKQEAgLTE0Myw2ICsxNDYsOSBAQAogCiAJLyogVXNlIHM1cHYyMTAta2V5cGFkIGluc3RlYWQgb2Ygc2Ftc3VuZy1rZXlwYWQgKi8KIAlzYW1zdW5nX2tleXBhZF9zZXRuYW1lKCJzNXB2MjEwLWtleXBhZCIpOworCisJLyogc2V0dXAgVFYgZGV2aWNlcyAqLworCXM1cF9oZG1pX3NldG5hbWUoInM1cHYyMTAtaGRtaSIpOwogfQogCiB2b2lkIF9faW5pdCBzNXB2MjEwX2luaXRfY2xvY2tzKGludCB4dGFsKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2RtYS5jCmluZGV4IDQ5N2QzNDMuLjg2Yjc0OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZG1hLmMKQEAgLTEsNCArMSw4IEBACi0vKgorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2RtYS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKICAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQuCiAgKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+CiAgKgpAQCAtMTcsMTUxICsyMSwyNDAgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDMzMC5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvaXJxcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLQotI2luY2x1ZGUgPHBsYXQvczNjLXBsMzMwLXBkYXRhLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAogc3RhdGljIHU2NCBkbWFfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwdjIxMF9wZG1hMF9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ICA9IFM1UFYyMTBfUEFfUERNQTAsCi0JCS5lbmQgICAgPSBTNVBWMjEwX1BBX1BETUEwICsgU1pfNEssCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfUERNQTAsCi0JCS5lbmQJPSBJUlFfUERNQTAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorc3RydWN0IGRtYV9wbDMzMF9wZXJpIHBkbWEwX3BlcmlbMjhdID0geworCXsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9IERNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBTX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NQVgsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NQVgsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NQVgsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NQVgsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9BQzk3X01JQ0lOLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9BQzk3X1BDTUlOLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9BQzk3X1BDTU9VVCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTUFYLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUFdNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BESUYsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2NfcGwzMzBfcGxhdGRhdGEgczVwdjIxMF9wZG1hMF9wZGF0YSA9IHsKLQkucGVyaSA9IHsKLQkJWzBdID0gRE1BQ0hfVUFSVDBfUlgsCi0JCVsxXSA9IERNQUNIX1VBUlQwX1RYLAotCQlbMl0gPSBETUFDSF9VQVJUMV9SWCwKLQkJWzNdID0gRE1BQ0hfVUFSVDFfVFgsCi0JCVs0XSA9IERNQUNIX1VBUlQyX1JYLAotCQlbNV0gPSBETUFDSF9VQVJUMl9UWCwKLQkJWzZdID0gRE1BQ0hfVUFSVDNfUlgsCi0JCVs3XSA9IERNQUNIX1VBUlQzX1RYLAotCQlbOF0gPSBETUFDSF9NQVgsCi0JCVs5XSA9IERNQUNIX0kyUzBfUlgsCi0JCVsxMF0gPSBETUFDSF9JMlMwX1RYLAotCQlbMTFdID0gRE1BQ0hfSTJTMFNfVFgsCi0JCVsxMl0gPSBETUFDSF9JMlMxX1JYLAotCQlbMTNdID0gRE1BQ0hfSTJTMV9UWCwKLQkJWzE0XSA9IERNQUNIX01BWCwKLQkJWzE1XSA9IERNQUNIX01BWCwKLQkJWzE2XSA9IERNQUNIX1NQSTBfUlgsCi0JCVsxN10gPSBETUFDSF9TUEkwX1RYLAotCQlbMThdID0gRE1BQ0hfU1BJMV9SWCwKLQkJWzE5XSA9IERNQUNIX1NQSTFfVFgsCi0JCVsyMF0gPSBETUFDSF9NQVgsCi0JCVsyMV0gPSBETUFDSF9NQVgsCi0JCVsyMl0gPSBETUFDSF9BQzk3X01JQ0lOLAotCQlbMjNdID0gRE1BQ0hfQUM5N19QQ01JTiwKLQkJWzI0XSA9IERNQUNIX0FDOTdfUENNT1VULAotCQlbMjVdID0gRE1BQ0hfTUFYLAotCQlbMjZdID0gRE1BQ0hfUFdNLAotCQlbMjddID0gRE1BQ0hfU1BESUYsCi0JCVsyOF0gPSBETUFDSF9NQVgsCi0JCVsyOV0gPSBETUFDSF9NQVgsCi0JCVszMF0gPSBETUFDSF9NQVgsCi0JCVszMV0gPSBETUFDSF9NQVgsCi0JfSwKK3N0cnVjdCBkbWFfcGwzMzBfcGxhdGRhdGEgczVwdjIxMF9wZG1hMF9wZGF0YSA9IHsKKwkubnJfdmFsaWRfcGVyaSA9IEFSUkFZX1NJWkUocGRtYTBfcGVyaSksCisJLnBlcmkgPSBwZG1hMF9wZXJpLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfcGRtYTAgPSB7Ci0JLm5hbWUJCT0gInMzYy1wbDMzMCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cHYyMTBfcGRtYTBfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cHYyMTBfcGRtYTBfcmVzb3VyY2UsCi0JLmRldgkJPSB7CitzdHJ1Y3QgYW1iYV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfcGRtYTAgPSB7CisJLmRldiA9IHsKKwkJLmluaXRfbmFtZSA9ICJkbWEtcGwzMzAuMCIsCiAJCS5kbWFfbWFzayA9ICZkbWFfZG1hbWFzaywKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmczVwdjIxMF9wZG1hMF9wZGF0YSwKIAl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXB2MjEwX3BkbWExX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgID0gUzVQVjIxMF9QQV9QRE1BMSwKLQkJLmVuZCAgICA9IFM1UFYyMTBfUEFfUERNQTEgKyBTWl80SywKKwkucmVzID0geworCQkuc3RhcnQgPSBTNVBWMjEwX1BBX1BETUEwLAorCQkuZW5kID0gUzVQVjIxMF9QQV9QRE1BMCArIFNaXzRLLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1BETUExLAotCQkuZW5kCT0gSVJRX1BETUExLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkuaXJxID0ge0lSUV9QRE1BMCwgTk9fSVJRfSwKKwkucGVyaXBoaWQgPSAweDAwMDQxMzMwLAorfTsKKworc3RydWN0IGRtYV9wbDMzMF9wZXJpIHBkbWExX3BlcmlbMzJdID0geworCXsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9IERNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBTX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMyX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NQVgsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NQVgsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QQ00wX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QQ00wX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QQ00xX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QQ00xX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NU01fUkVRMCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01TTV9SRVExLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTVNNX1JFUTIsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NU01fUkVRMywKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2NfcGwzMzBfcGxhdGRhdGEgczVwdjIxMF9wZG1hMV9wZGF0YSA9IHsKLQkucGVyaSA9IHsKLQkJWzBdID0gRE1BQ0hfVUFSVDBfUlgsCi0JCVsxXSA9IERNQUNIX1VBUlQwX1RYLAotCQlbMl0gPSBETUFDSF9VQVJUMV9SWCwKLQkJWzNdID0gRE1BQ0hfVUFSVDFfVFgsCi0JCVs0XSA9IERNQUNIX1VBUlQyX1JYLAotCQlbNV0gPSBETUFDSF9VQVJUMl9UWCwKLQkJWzZdID0gRE1BQ0hfVUFSVDNfUlgsCi0JCVs3XSA9IERNQUNIX1VBUlQzX1RYLAotCQlbOF0gPSBETUFDSF9NQVgsCi0JCVs5XSA9IERNQUNIX0kyUzBfUlgsCi0JCVsxMF0gPSBETUFDSF9JMlMwX1RYLAotCQlbMTFdID0gRE1BQ0hfSTJTMFNfVFgsCi0JCVsxMl0gPSBETUFDSF9JMlMxX1JYLAotCQlbMTNdID0gRE1BQ0hfSTJTMV9UWCwKLQkJWzE0XSA9IERNQUNIX0kyUzJfUlgsCi0JCVsxNV0gPSBETUFDSF9JMlMyX1RYLAotCQlbMTZdID0gRE1BQ0hfU1BJMF9SWCwKLQkJWzE3XSA9IERNQUNIX1NQSTBfVFgsCi0JCVsxOF0gPSBETUFDSF9TUEkxX1JYLAotCQlbMTldID0gRE1BQ0hfU1BJMV9UWCwKLQkJWzIwXSA9IERNQUNIX01BWCwKLQkJWzIxXSA9IERNQUNIX01BWCwKLQkJWzIyXSA9IERNQUNIX1BDTTBfUlgsCi0JCVsyM10gPSBETUFDSF9QQ00wX1RYLAotCQlbMjRdID0gRE1BQ0hfUENNMV9SWCwKLQkJWzI1XSA9IERNQUNIX1BDTTFfVFgsCi0JCVsyNl0gPSBETUFDSF9NU01fUkVRMCwKLQkJWzI3XSA9IERNQUNIX01TTV9SRVExLAotCQlbMjhdID0gRE1BQ0hfTVNNX1JFUTIsCi0JCVsyOV0gPSBETUFDSF9NU01fUkVRMywKLQkJWzMwXSA9IERNQUNIX1BDTTJfUlgsCi0JCVszMV0gPSBETUFDSF9QQ00yX1RYLAotCX0sCitzdHJ1Y3QgZG1hX3BsMzMwX3BsYXRkYXRhIHM1cHYyMTBfcGRtYTFfcGRhdGEgPSB7CisJLm5yX3ZhbGlkX3BlcmkgPSBBUlJBWV9TSVpFKHBkbWExX3BlcmkpLAorCS5wZXJpID0gcGRtYTFfcGVyaSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3BkbWExID0gewotCS5uYW1lCQk9ICJzM2MtcGwzMzAiLAotCS5pZAkJPSAxLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXB2MjEwX3BkbWExX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzNXB2MjEwX3BkbWExX3Jlc291cmNlLAotCS5kZXYJCT0geworc3RydWN0IGFtYmFfZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3BkbWExID0geworCS5kZXYgPSB7CisJCS5pbml0X25hbWUgPSAiZG1hLXBsMzMwLjEiLAogCQkuZG1hX21hc2sgPSAmZG1hX2RtYW1hc2ssCiAJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCiAJCS5wbGF0Zm9ybV9kYXRhID0gJnM1cHYyMTBfcGRtYTFfcGRhdGEsCiAJfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzNXB2MjEwX2RtYWNzW10gX19pbml0ZGF0YSA9IHsKLQkmczVwdjIxMF9kZXZpY2VfcGRtYTAsCi0JJnM1cHYyMTBfZGV2aWNlX3BkbWExLAorCS5yZXMgPSB7CisJCS5zdGFydCA9IFM1UFYyMTBfUEFfUERNQTEsCisJCS5lbmQgPSBTNVBWMjEwX1BBX1BETUExICsgU1pfNEssCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLmlycSA9IHtJUlFfUERNQTEsIE5PX0lSUX0sCisJLnBlcmlwaGlkID0gMHgwMDA0MTMzMCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHM1cHYyMTBfZG1hX2luaXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzNXB2MjEwX2RtYWNzLCBBUlJBWV9TSVpFKHM1cHYyMTBfZG1hY3MpKTsKKwlhbWJhX2RldmljZV9yZWdpc3RlcigmczVwdjIxMF9kZXZpY2VfcGRtYTAsICZpb21lbV9yZXNvdXJjZSk7CisJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoJnM1cHYyMTBfZGV2aWNlX3BkbWExLCAmaW9tZW1fcmVzb3VyY2UpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9jbGtkZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmZmE4My4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaWZuZGVmIF9fTUFDSF9DTEtERVZfSF9fCi0jZGVmaW5lIF9fTUFDSF9DTEtERVZfSF9fCi0KLSNkZWZpbmUgX19jbGtfZ2V0KGNsaykgKHsgMTsgfSkKLSNkZWZpbmUgX19jbGtfcHV0KGNsaykgZG8ge30gd2hpbGUgKDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDE2OWZlNjUuLjc5ZTU1NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTIxLDcgKzIxLDcgQEAKIAkgKiBhbGlnbmVkIGFuZCBhZGQgaW4gdGhlIG9mZnNldCB3aGVuIHdlIGxvYWQgdGhlIHZhbHVlIGhlcmUuCiAJICovCiAKLQkubWFjcm8gYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbGRyCVxycCwgPSBTM0NfUEFfVUFSVAogCQlsZHIJXHJ2LCA9IFMzQ19WQV9VQVJUCiAjaWYgQ09ORklHX0RFQlVHX1MzQ19VQVJUICE9IDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDgxMjA5ZWIuLjIwMTg0MmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMjAsNyArMjAsNyBAQAogI2lmbmRlZiBfX01BQ0hfRE1BX0gKICNkZWZpbmUgX19NQUNIX0RNQV9ICiAKLS8qIFRoaXMgcGxhdGZvcm0gdXNlcyB0aGUgY29tbW9uIFMzQyBETUEgQVBJIGRyaXZlciBmb3IgUEwzMzAgKi8KLSNpbmNsdWRlIDxwbGF0L3MzYy1kbWEtcGwzMzAuaD4KKy8qIFRoaXMgcGxhdGZvcm0gdXNlcyB0aGUgY29tbW9uIERNQSBBUEkgZHJpdmVyIGZvciBQTDMzMCAqLworI2luY2x1ZGUgPHBsYXQvZG1hLXBsMzMwLmg+CiAKICNlbmRpZiAvKiBfX01BQ0hfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggYTVhMWUzMy4uNmM4YjkwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEzLDExICsxMyw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfR1BJT19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfR1BJT19IIF9fRklMRV9fCiAKLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCi0jZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKLQogLyogUHJhY3RpY2FsbHksIEdQSU8gYmFua3MgdXAgdG8gTVAwMyBhcmUgdGhlIGNvbmZpZ3VyYWJsZSBncGlvIGJhbmtzICovCiAKIC8qIEdQSU8gYmFuayBzaXplcyAqLwpAQCAtMTQyLDYgKzEzNyw0IEBACiAjZGVmaW5lIEFSQ0hfTlJfR1BJT1MJCShTNVBWMjEwX01QMDUoUzVQVjIxMF9HUElPX01QMDVfTlIpICsJXAogCQkJCSBDT05GSUdfU0FNU1VOR19HUElPX0VYVFJBICsgMSkKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IGI5ZjllYzMuLjVlMGRlM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC01Niw3ICs1Niw3IEBACiAjZGVmaW5lIElSUV9TUEkyCQlTNVBfSVJRX1ZJQzEoMTcpCiAjZGVmaW5lIElSUV9JUkRBCQlTNVBfSVJRX1ZJQzEoMTgpCiAjZGVmaW5lIElSUV9JSUMyCQlTNVBfSVJRX1ZJQzEoMTkpCi0jZGVmaW5lIElSUV9JSUMzCQlTNVBfSVJRX1ZJQzEoMjApCisjZGVmaW5lIElSUV9JSUNfSERNSVBIWQkJUzVQX0lSUV9WSUMxKDIwKQogI2RlZmluZSBJUlFfSFNJUlgJCVM1UF9JUlFfVklDMSgyMSkKICNkZWZpbmUgSVJRX0hTSVRYCQlTNVBfSVJRX1ZJQzEoMjIpCiAjZGVmaW5lIElSUV9VSE9TVAkJUzVQX0lSUV9WSUMxKDIzKQpAQCAtODYsNyArODYsNyBAQAogI2RlZmluZSBJUlFfSERNSQkJUzVQX0lSUV9WSUMyKDEyKQogI2RlZmluZSBJUlFfSUlDMQkJUzVQX0lSUV9WSUMyKDEzKQogI2RlZmluZSBJUlFfTUZDCQkJUzVQX0lSUV9WSUMyKDE0KQotI2RlZmluZSBJUlFfVFZFTkMJCVM1UF9JUlFfVklDMigxNSkKKyNkZWZpbmUgSVJRX1NETwkJCVM1UF9JUlFfVklDMigxNSkKICNkZWZpbmUgSVJRX0kyUzAJCVM1UF9JUlFfVklDMigxNikKICNkZWZpbmUgSVJRX0kyUzEJCVM1UF9JUlFfVklDMigxNykKICNkZWZpbmUgSVJRX0kyUzIJCVM1UF9JUlFfVklDMigxOCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvbWFwLmggYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL21hcC5oCmluZGV4IGFhYzM0M2MuLjdmZjYwOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvbWFwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9tYXAuaApAQCAtOTAsNiArOTAsMTIgQEAKICNkZWZpbmUgUzVQVjIxMF9QQV9GSU1DMQkJMHhGQjMwMDAwMAogI2RlZmluZSBTNVBWMjEwX1BBX0ZJTUMyCQkweEZCNDAwMDAwCiAKKyNkZWZpbmUgUzVQVjIxMF9QQV9TRE8JCQkweEY5MDAwMDAwCisjZGVmaW5lIFM1UFYyMTBfUEFfVlAJCQkweEY5MTAwMDAwCisjZGVmaW5lIFM1UFYyMTBfUEFfTUlYRVIJCTB4RjkyMDAwMDAKKyNkZWZpbmUgUzVQVjIxMF9QQV9IRE1JCQkJMHhGQTEwMDAwMAorI2RlZmluZSBTNVBWMjEwX1BBX0lJQ19IRE1JUEhZCQkweEZBOTAwMDAwCisKIC8qIENvbXBhdGliaWx0aXkgRGVmaW5lcyAqLwogCiAjZGVmaW5lIFMzQ19QQV9GQgkJCVM1UFYyMTBfUEFfRkIKQEAgLTExMCw2ICsxMTYsMTMgQEAKICNkZWZpbmUgUzVQX1BBX0ZJTUMyCQkJUzVQVjIxMF9QQV9GSU1DMgogI2RlZmluZSBTNVBfUEFfTUlQSV9DU0lTMAkJUzVQVjIxMF9QQV9NSVBJX0NTSVMKICNkZWZpbmUgUzVQX1BBX01GQwkJCVM1UFYyMTBfUEFfTUZDCisjZGVmaW5lIFM1UF9QQV9JSUNfSERNSVBIWQkJUzVQVjIxMF9QQV9JSUNfSERNSVBIWQorCisjZGVmaW5lIFM1UF9QQV9TRE8JCQlTNVBWMjEwX1BBX1NETworI2RlZmluZSBTNVBfUEFfVlAJCQlTNVBWMjEwX1BBX1ZQCisjZGVmaW5lIFM1UF9QQV9NSVhFUgkJCVM1UFYyMTBfUEFfTUlYRVIKKyNkZWZpbmUgUzVQX1BBX0hETUkJCQlTNVBWMjEwX1BBX0hETUkKKwogI2RlZmluZSBTNVBfUEFfT05FTkFORAkJCVM1UEMxMTBfUEFfT05FTkFORAogI2RlZmluZSBTNVBfUEFfT05FTkFORF9ETUEJCVM1UEMxMTBfUEFfT05FTkFORF9ETUEKICNkZWZpbmUgUzVQX1BBX1NEUkFNCQkJUzVQVjIxMF9QQV9TRFJBTQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggN2I1ZmNmMC4uMmQzY2ZhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xNCw3ICsxNCw2IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKIAogI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDIwMDAwMDAwKQotI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFCShTWl84TSArIFNaXzRNICsgU1pfMk0pCiAKIC8qCiAgKiBTcGFyc2VtZW0gc3VwcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9wbS1jb3JlLmggYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaAppbmRleCAzZTIyMTA5Li5lYmE4YWVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaApAQCAtNDMsNCArNDMsNCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX3Jlc3RvcmVkX2dwaW9zKHZvaWQpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9zYXZlZF9ncGlvcyh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzYW1zdW5nX3BtX3NhdmVkX2dwaW9zKHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTlmMWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKLSAqCi0gKiBTNVBWMjEwIC0gcHdtIGNsb2NrIGFuZCB0aW1lciBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9QV01DTEtfSAotI2RlZmluZSBfX0FTTV9BUkNIX1BXTUNMS19IIF9fRklMRV9fCi0KLS8qKgotICogcHdtX2NmZ19zcmNfaXNfdGNsaygpIC0gcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG11eCBjb25maWcgaXMgYSB0Y2xrCi0gKiBAdGNmZzogVGhlIHRpbWVyIFRDRkcxIHJlZ2lzdGVyIGJpdHMgc2hpZnRlZCBkb3duIHRvIDAuCi0gKgotICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZnJvbSBUQ0ZHMSBpcyBhIFRDTEsgaW5zdGVhZAotICogYW55IG9mIHRoZSBURElWIGNsb2Nrcy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHdtX2NmZ19zcmNfaXNfdGNsayh1bnNpZ25lZCBsb25nIHRjZmcpCi17Ci0JcmV0dXJuIHRjZmcgPT0gUzNDNjRYWF9UQ0ZHMV9NVVhfVENMSzsKLX0KLQotLyoqCi0gKiB0Y2ZnX3RvX2Rpdmlzb3IoKSAtIGNvbnZlcnQgdGNmZzEgc2V0dGluZyB0byBhIGRpdmlzb3IKLSAqIEB0Y2ZnMTogVGhlIHRjZmcxIHNldHRpbmcsIHNoaWZ0ZWQgZG93bi4KLSAqCi0gKiBHZXQgdGhlIGRpdmlzb3IgdmFsdWUgZm9yIHRoZSBnaXZlbiB0Y2ZnMSBzZXR0aW5nLiBXZSBhc3N1bWUgdGhlCi0gKiBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0byBzZWUgaWYgdGhpcyBpcyBub3QgYSBUQ0xLIHNvdXJjZS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRjZmdfdG9fZGl2aXNvcih1bnNpZ25lZCBsb25nIHRjZmcxKQotewotCXJldHVybiAxIDw8IHRjZmcxOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2hhc19kaXYxKCkgLSBkb2VzIHRoZSB0ZGl2IHNldHRpbmcgaGF2ZSBhIC8xCi0gKgotICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhIC8xIGluIHRoZSB0ZGl2IHNldHRpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHB3bV90ZGl2X2hhc19kaXYxKHZvaWQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogcHdtX3RkaXZfZGl2X2JpdHMoKSAtIGNhbGN1bGF0ZSBUQ0ZHMSBkaXZpc29yIHZhbHVlLgotICogQGRpdjogVGhlIGRpdmlzb3IgdG8gY2FsY3VsYXRlIHRoZSBiaXQgaW5mb3JtYXRpb24gZm9yLgotICoKLSAqIFR1cm4gYSBkaXZpc29yIGludG8gdGhlIG5lY2Vzc2FyeSBiaXQgZmllbGQgZm9yIFRDRkcxLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHdtX3RkaXZfZGl2X2JpdHModW5zaWduZWQgaW50IGRpdikKLXsKLQlyZXR1cm4gaWxvZzIoZGl2KTsKLX0KLQotI2RlZmluZSBTM0NfVENGRzFfTVVYX1RDTEsgUzNDNjRYWF9UQ0ZHMV9NVVhfVENMSwotCi0jZW5kaWYgLyogX19BU01fQVJDSF9QV01DTEtfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmggYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaAppbmRleCA3ODkyNWM1Li4wMzJkZTY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaApAQCAtMTQ0LDggKzE0NCw5IEBACiAKICNkZWZpbmUgUzVQX09USEVSUwkJUzVQX0NMS1JFRygweEUwMDApCiAjZGVmaW5lIFM1UF9PTV9TVEFUCQlTNVBfQ0xLUkVHKDB4RTEwMCkKKyNkZWZpbmUgUzVQX0hETUlfUEhZX0NPTlRST0wJUzVQX0NMS1JFRygweEU4MDQpCiAjZGVmaW5lIFM1UF9VU0JfUEhZX0NPTlRST0wJUzVQX0NMS1JFRygweEU4MEMpCi0jZGVmaW5lIFM1UF9EQUNfQ09OVFJPTAkJUzVQX0NMS1JFRygweEU4MTApCisjZGVmaW5lIFM1UF9EQUNfUEhZX0NPTlRST0wJUzVQX0NMS1JFRygweEU4MTApCiAjZGVmaW5lIFM1UF9NSVBJX0RQSFlfQ09OVFJPTCh4KSBTNVBfQ0xLUkVHKDB4RTgxNCkKICNkZWZpbmUgUzVQX01JUElfRFBIWV9FTkFCTEUJKDEgPDwgMCkKICNkZWZpbmUgUzVQX01JUElfRFBIWV9TUkVTRVROCSgxIDw8IDEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1hcXVpbGEuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWFxdWlsYS5jCmluZGV4IDUwOTYyN2YuLjU4MTFhOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWFxdWlsYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWFxdWlsYS5jCkBAIC02NzgsNyArNjc4LDcgQEAKIAkvKiBNYWludGFpbmVyczoKIAkgICBNYXJlayBTenlwcm93c2tpIDxtLnN6eXByb3dza2lAc2Ftc3VuZy5jb20+CiAJICAgS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9pcnEJPSBzNXB2MjEwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gYXF1aWxhX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gYXF1aWxhX21hY2hpbmVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWdvbmkuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWdvbmkuYwppbmRleCA4NWMyZDUxLi4xNWVkY2FlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1nb25pLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtZ29uaS5jCkBAIC00OCw2ICs0OCwxMSBAQAogI2luY2x1ZGUgPHBsYXQvczVwLXRpbWUuaD4KICNpbmNsdWRlIDxwbGF0L21mYy5oPgogI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgorI2luY2x1ZGUgPHBsYXQvY2FtcG9ydC5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgorI2luY2x1ZGUgPG1lZGlhL3M1cF9maW1jLmg+CisjaW5jbHVkZSA8bWVkaWEvbm9vbjAxMHBjMzAuaD4KIAogLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEdPTklfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCkBAIC0yNzIsNiArMjc3LDE0IEBACiAJaTJjMl9kZXZzWzBdLmlycSA9IGdwaW9fdG9faXJxKGdwaW8pOwogfQogCitzdGF0aWMgdm9pZCBnb25pX2NhbWVyYV9pbml0KHZvaWQpCit7CisJczVwdjIxMF9maW1jX3NldHVwX2dwaW8oUzVQX0NBTVBPUlRfQSk7CisKKwkvKiBTZXQgbWF4IGRyaXZlciBzdHJlbmd0aCBvbiBDQU1fQV9DTEtPVVQgcGluLiAqLworCXM1cF9ncGlvX3NldF9kcnZzdHIoUzVQVjIxMF9HUEUxKDMpLCBTNVBfR1BJT19EUlZTVFJfTFY0KTsKK30KKwogLyogTUFYODk5OCByZWd1bGF0b3JzICovCiAjaWYgZGVmaW5lZChDT05GSUdfUkVHVUxBVE9SX01BWDg5OTgpIHx8IGRlZmluZWQoQ09ORklHX1JFR1VMQVRPUl9NQVg4OTk4X01PRFVMRSkKIApAQCAtMjg1LDYgKzI5OCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBnb25pX2xkbzhfY29uc3VtZXJzW10gPSB7CiAJUkVHVUxBVE9SX1NVUFBMWSgidnVzYl9kIiwgInMzYy1oc290ZyIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZkZDMzYV9kYWMiLCAiczVwLXNkbyIpLAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGdvbmlfbGRvMTFfY29uc3VtZXJzW10gPSB7CkBAIC00NzUsNiArNDg5LDEwIEBACiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgYnVjazJfY29uc3VtZXIgPQogCVJFR1VMQVRPUl9TVVBQTFkoInZkZGludCIsIE5VTEwpOwogCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgYnVjazNfY29uc3VtZXIgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZkZXQiLCAiczVwLXNkbyIpOworCisKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBnb25pX2J1Y2sxX2RhdGEgPSB7CiAJLmNvbnN0cmFpbnRzCT0gewogCQkubmFtZQkJPSAiVkFSTV8xLjJWIiwKQEAgLTUxMSw2ICs1MjksOCBAQAogCQkJLmVuYWJsZWQgPSAxLAogCQl9LAogCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmJ1Y2szX2NvbnN1bWVyLAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGdvbmlfYnVjazRfZGF0YSA9IHsKQEAgLTgwMSw2ICs4MjEsMzQgQEAKIAlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmZ29uaV9oc21tYzJfZGF0YSk7CiB9OwogCitzdGF0aWMgc3RydWN0IG5vb24wMTBwYzMwX3BsYXRmb3JtX2RhdGEgbm9vbjAxMHBjMzBfcGxkYXRhID0geworCS5jbGtfcmF0ZQk9IDE2MDAwMDAwVUwsCisJLmdwaW9fbnJlc2V0CT0gUzVQVjIxMF9HUEIoMiksIC8qIENBTV9DSUZfTlJTVCAqLworCS5ncGlvX25zdGJ5CT0gUzVQVjIxMF9HUEIoMCksIC8qIENBTV9DSUZfTlNUQlkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbm9vbjAxMHBjMzBfYm9hcmRfaW5mbyA9IHsKKwlJMkNfQk9BUkRfSU5GTygiTk9PTjAxMFBDMzAiLCAweDYwID4+IDEpLAorCS5wbGF0Zm9ybV9kYXRhID0gJm5vb24wMTBwYzMwX3BsZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczVwX2ZpbWNfaXNwX2luZm8gZ29uaV9jYW1lcmFfc2Vuc29yc1tdID0geworCXsKKwkJLm11eF9pZAkJPSAwLAorCQkuZmxhZ3MJCT0gVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcgfAorCQkJCSAgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1csCisJCS5idXNfdHlwZQk9IEZJTUNfSVRVXzYwMSwKKwkJLmJvYXJkX2luZm8JPSAmbm9vbjAxMHBjMzBfYm9hcmRfaW5mbywKKwkJLmkyY19idXNfbnVtCT0gMCwKKwkJLmNsa19mcmVxdWVuY3kJPSAxNjAwMDAwMFVMLAorCX0sCit9OworCitzdHJ1Y3QgczVwX3BsYXRmb3JtX2ZpbWMgZ29uaV9maW1jX21kX3BsYXRkYXRhIF9faW5pdGRhdGEgPSB7CisJLmlzcF9pbmZvCT0gZ29uaV9jYW1lcmFfc2Vuc29ycywKKwkubnVtX2NsaWVudHMJPSBBUlJBWV9TSVpFKGdvbmlfY2FtZXJhX3NlbnNvcnMpLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmdvbmlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnMzY19kZXZpY2VfZmIsCiAJJnM1cF9kZXZpY2Vfb25lbmFuZCwKQEAgLTgxMiwxMCArODYwLDEzIEBACiAJJnM1cF9kZXZpY2VfbWZjLAogCSZzNXBfZGV2aWNlX21mY19sLAogCSZzNXBfZGV2aWNlX21mY19yLAorCSZzNXBfZGV2aWNlX21peGVyLAorCSZzNXBfZGV2aWNlX3NkbywKIAkmczNjX2RldmljZV9pMmMwLAogCSZzNXBfZGV2aWNlX2ZpbWMwLAogCSZzNXBfZGV2aWNlX2ZpbWMxLAogCSZzNXBfZGV2aWNlX2ZpbWMyLAorCSZzNXBfZGV2aWNlX2ZpbWNfbWQsCiAJJnMzY19kZXZpY2VfaHNtbWMwLAogCSZzM2NfZGV2aWNlX2hzbW1jMSwKIAkmczNjX2RldmljZV9oc21tYzIsCkBAIC04ODQsNiArOTM1LDEyIEBACiAJLyogRkIgKi8KIAlzM2NfZmJfc2V0X3BsYXRkYXRhKCZnb25pX2xjZF9wZGF0YSk7CiAKKwkvKiBGSU1DICovCisJczNjX3NldF9wbGF0ZGF0YSgmZ29uaV9maW1jX21kX3BsYXRkYXRhLCBzaXplb2YoZ29uaV9maW1jX21kX3BsYXRkYXRhKSwKKwkJCSAmczVwX2RldmljZV9maW1jX21kKTsKKworCWdvbmlfY2FtZXJhX2luaXQoKTsKKwogCS8qIFNQSSAqLwogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHNwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaV9ib2FyZF9pbmZvKSk7CiAKQEAgLTg5Nyw3ICs5NTQsNyBAQAogCiBNQUNISU5FX1NUQVJUKEdPTkksICJHT05JIikKIAkvKiBNYWludGFpbmVyczogS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9pcnEJPSBzNXB2MjEwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gZ29uaV9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IGdvbmlfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtc21ka2MxMTAuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLXNtZGtjMTEwLmMKaW5kZXggNmM0MTJjOC4uZjcyNjZiYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtc21ka2MxMTAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1zbWRrYzExMC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAogTUFDSElORV9TVEFSVChTTURLQzExMCwgIlNNREtDMTEwIikKIAkvKiBNYWludGFpbmVyOiBLdWtqaW4gS2ltIDxrZ2VuZS5raW1Ac2Ftc3VuZy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzVQX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfaXJxCT0gczVwdjIxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtZGtjMTEwX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gc21ka2MxMTBfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtc21ka3YyMTAuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLXNtZGt2MjEwLmMKaW5kZXggNWUwMTFmYy4uYTkxMDZjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtc21ka3YyMTAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1zbWRrdjIxMC5jCkBAIC0yNjUsMTIgKzI2NSw2IEBACiAJLyogVG8gQmUgVXBkYXRlZCAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyBzM2NfdHNfcGxhdGZvcm0gX19pbml0ZGF0YSA9IHsKLQkuZGVsYXkJCQk9IDEwMDAwLAotCS5wcmVzYwkJCT0gNDksCi0JLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCi19OwotCiAvKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21ka3YyMTBfYmxfZ3Bpb19pbmZvID0gewogCS5ubyA9IFM1UFYyMTBfR1BEMCgzKSwKQEAgLTI5Niw3ICsyOTAsNyBAQAogCXNtZGt2MjEwX2RtOTAwMF9pbml0KCk7CiAKIAlzYW1zdW5nX2tleXBhZF9zZXRfcGxhdGRhdGEoJnNtZGt2MjEwX2tleXBhZF9kYXRhKTsKLQlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YSgmczNjX3RzX3BsYXRmb3JtKTsKKwlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShOVUxMKTsKIAogCXMzY19pMmMwX3NldF9wbGF0ZGF0YShOVUxMKTsKIAlzM2NfaTJjMV9zZXRfcGxhdGRhdGEoTlVMTCk7CkBAIC0zMTksNyArMzEzLDcgQEAKIAogTUFDSElORV9TVEFSVChTTURLVjIxMCwgIlNNREtWMjEwIikKIAkvKiBNYWludGFpbmVyOiBLdWtqaW4gS2ltIDxrZ2VuZS5raW1Ac2Ftc3VuZy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzVQX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfaXJxCT0gczVwdjIxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtZGt2MjEwX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gc21ka3YyMTBfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtdG9yYnJlY2suYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLXRvcmJyZWNrLmMKaW5kZXggOTI1ZmMwZC4uOTdjYzA2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtdG9yYnJlY2suYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC10b3JicmVjay5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAogTUFDSElORV9TVEFSVChUT1JCUkVDSywgIlRPUkJSRUNLIikKIAkvKiBNYWludGFpbmVyOiBIeXVuY2h1bCBLbyA8Z2hjc3RvcEBnbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzVQX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfaXJxCT0gczVwdjIxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHRvcmJyZWNrX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gdG9yYnJlY2tfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3NldHVwLXNkaGNpLmMgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvc2V0dXAtc2RoY2kuYwppbmRleCBhODNiNmM5Li42YjhjY2M0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvc2V0dXAtc2RoY2kuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvc2V0dXAtc2RoY2kuYwpAQCAtMTAsMTcgKzEwLDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1zZGhjaS5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KIAogLyogY2xvY2sgc291cmNlcyBmb3IgdGhlIG1tYyBidXMgY2xvY2ssIG9yZGVyIGFzIGZvciB0aGUgY3RybDJbNS4uNF0gKi8KIApAQCAtMzAsMzQgKzIwLDMgQEAKIAlbMl0gPSAic2Nsa19tbWMiLAkvKiBtbWNfYnVzICovCiAJLyogWzNdID0gTlVMTCwJCS0gcmVzZXJ2ZWQgKi8KIH07Ci0KLXZvaWQgczVwdjIxMF9zZXR1cF9zZGhjaV9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCQkJICAgIHZvaWQgX19pb21lbSAqciwKLQkJCQkgICAgc3RydWN0IG1tY19pb3MgKmlvcywKLQkJCQkgICAgc3RydWN0IG1tY19jYXJkICpjYXJkKQotewotCXUzMiBjdHJsMiwgY3RybDM7Ci0KLQkvKiBkb24ndCBuZWVkIHRvIGFsdGVyIGFueXRoaW5nIGFjY29yZGluZyB0byBjYXJkLXR5cGUgKi8KLQotCXdyaXRlbChTM0M2NFhYX1NESENJX0NPTlRST0w0X0RSSVZFXzltQSwgciArIFMzQzY0WFhfU0RIQ0lfQ09OVFJPTDQpOwotCi0JY3RybDIgPSByZWFkbChyICsgUzNDX1NESENJX0NPTlRST0wyKTsKLQljdHJsMiAmPSBTM0NfU0RIQ0lfQ1RSTDJfU0VMQkFTRUNMS19NQVNLOwotCWN0cmwyIHw9IChTM0M2NFhYX1NESENJX0NUUkwyX0VOU1RBQVNZTkNDTFIgfAotCQkgIFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5DTURDTkZNU0sgfAotCQkgIFMzQ19TREhDSV9DVFJMMl9FTkZCQ0xLUlggfAotCQkgIFMzQ19TREhDSV9DVFJMMl9ERkNOVF9OT05FIHwKLQkJICBTM0NfU0RIQ0lfQ1RSTDJfRU5DTEtPVVRIT0xEKTsKLQotCWlmIChpb3MtPmNsb2NrIDwgMjUgKiAxMDAwMDAwKQotCQljdHJsMyA9IChTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwzIHwKLQkJCSBTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwyIHwKLQkJCSBTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwxIHwKLQkJCSBTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwwKTsKLQllbHNlCi0JCWN0cmwzID0gKFMzQ19TREhDSV9DVFJMM19GQ1NFTDEgfCBTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwwKTsKLQotCXdyaXRlbChjdHJsMiwgciArIFMzQ19TREhDSV9DT05UUk9MMik7Ci0Jd3JpdGVsKGN0cmwzLCByICsgUzNDX1NESENJX0NPTlRST0wzKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zbGVlcC5TIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3NsZWVwLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDUyY2MuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3NsZWVwLlMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXM1cC9zbGVlcC5TCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIFM1UFYyMTAgcG93ZXIgTWFuYWdlciAoU3VzcGVuZC1Uby1SQU0pIHN1cHBvcnQKLSAqIEJhc2VkIG9uIFMzQzI0MTAgc2xlZXAgY29kZSBieToKLSAqIAlCZW4gRG9va3MsIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcwotICoKLSAqIEJhc2VkIG9uIFBYQS9TQTExMDAgc2xlZXAgY29kZSBieToKLSAqCU5pY29sYXMgUGl0cmUsIChjKSAyMDAyIE1vbnRhIFZpc3RhIFNvZnR3YXJlIEluYwotICoJQ2xpZmYgQnJha2UsIChjKSAyMDAxCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL21lbW9yeS5oPgotCi0JLnRleHQKLQotCS8qIHNsZWVwIG1hZ2ljLCB0byBhbGxvdyB0aGUgYm9vdGxvYWRlciB0byBjaGVjayBmb3IgYW4gdmFsaWQKLQkgKiBpbWFnZSB0byByZXN1bWUgdG8uIE11c3QgYmUgdGhlIGZpcnN0IHdvcmQgYmVmb3JlIHRoZQotCSAqIHMzY19jcHVfcmVzdW1lIGVudHJ5LgotCSovCi0KLQkud29yZAkweDJiZWRmMDBkCi0KLQkvKiBzM2NfY3B1X3Jlc3VtZQotCSAqCi0JICogcmVzdW1lIGNvZGUgZW50cnkgZm9yIGJvb3Rsb2FkZXIgdG8gY2FsbAotCSAqCi0JICogd2UgbXVzdCBwdXQgdGhpcyBjb2RlIGhlcmUgaW4gdGhlIGRhdGEgc2VnbWVudCBhcyB3ZSBoYXZlIG5vCi0JICogb3RoZXIgd2F5IG9mIHJlc3RvcmluZyB0aGUgc3RhY2sgcG9pbnRlciBhZnRlciBzbGVlcCwgYW5kIHdlCi0JICogbXVzdCBub3Qgd3JpdGUgdG8gdGhlIGNvZGUgc2VnbWVudCAoY29kZSBpcyByZWFkLW9ubHkpCi0JKi8KLQotRU5UUlkoczNjX2NwdV9yZXN1bWUpCi0JYgljcHVfcmVzdW1lCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL01ha2VmaWxlCmluZGV4IDAwNjMxNzguLmVkNzQwOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiAjIENvbW1vbiBzdXBwb3J0Ci1vYmoteSA6PSBjbG9jay5vIGdlbmVyaWMubyBncGlvLm8gaXJxLm8gZG1hLm8gdGltZS5vICNubWktb29wc2VyLm8KK29iai15IDo9IGNsb2NrLm8gZ2VuZXJpYy5vIGlycS5vIGRtYS5vIHRpbWUubyAjbm1pLW9vcHNlci5vCiBvYmotbSA6PQogb2JqLW4gOj0KIG9iai0gIDo9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9hc3NhYmV0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9hc3NhYmV0LmMKaW5kZXggNjI5MGNlMi4uM2RkMTMzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvYXNzYWJldC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKIAogTUFDSElORV9TVEFSVChBU1NBQkVULCAiSW50ZWwtQXNzYWJldCIpCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuZml4dXAJCT0gZml4dXBfYXNzYWJldCwKIAkubWFwX2lvCQk9IGFzc2FiZXRfbWFwX2lvLAogCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2JhZGdlNC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMKaW5kZXggYjQzMTFiMC4uYmRhODNlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMKQEAgLTMwMiw3ICszMDIsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEJBREdFNCwgIkhld2xldHQtUGFja2FyZCBMYWJvcmF0b3JpZXMgQmFkZ2VQQUQgNCIpCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGJhZGdlNF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY29sbGllLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYwppbmRleCBiZDNlMWJmLi4yOTY1Y2M5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPG1hY2gvY29sbGllLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYwppbmRleCBlMjFmMzQ3Li41ZmE1YWUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCkBAIC05LDYgKzksNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTI0LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzgyOWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL2dwaW8uYwotICoKLSAqIEdlbmVyaWMgU0EtMTEwMCBHUElPIGhhbmRsaW5nCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSAiZ2VuZXJpYy5oIgotCi1zdGF0aWMgaW50IHNhMTEwMF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIEdQTFIgJiBHUElPX0dQSU8ob2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgc2ExMTAwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCWlmICh2YWx1ZSkKLQkJR1BTUiA9IEdQSU9fR1BJTyhvZmZzZXQpOwotCWVsc2UKLQkJR1BDUiA9IEdQSU9fR1BJTyhvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IHNhMTEwMF9kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JR1BEUiAmPSB+R1BJT19HUElPKG9mZnNldCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhMTEwMF9kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jc2ExMTAwX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCUdQRFIgfD0gR1BJT19HUElPKG9mZnNldCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBzYTExMDBfZ3Bpb19jaGlwID0gewotCS5sYWJlbAkJCT0gImdwaW8iLAotCS5kaXJlY3Rpb25faW5wdXQJPSBzYTExMDBfZGlyZWN0aW9uX2lucHV0LAotCS5kaXJlY3Rpb25fb3V0cHV0CT0gc2ExMTAwX2RpcmVjdGlvbl9vdXRwdXQsCi0JLnNldAkJCT0gc2ExMTAwX2dwaW9fc2V0LAotCS5nZXQJCQk9IHNhMTEwMF9ncGlvX2dldCwKLQkuYmFzZQkJCT0gMCwKLQkubmdwaW8JCQk9IEdQSU9fTUFYICsgMSwKLX07Ci0KLXZvaWQgX19pbml0IHNhMTEwMF9pbml0X2dwaW8odm9pZCkKLXsKLQlncGlvY2hpcF9hZGQoJnNhMTEwMF9ncGlvX2NoaXApOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDMxMDAuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzMTAwLmMKaW5kZXggMDNkNzM3Ni4uYjMwNzMzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDMxMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzEwMC5jCkBAIC04NCw3ICs4NCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSDMxMDAsICJDb21wYXEgaVBBUSBIMzEwMCIpCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGgzMTAwX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzYwMC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDM2MDAuYwppbmRleCA5NjVmNjRhLi42ZmQzMjRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzYwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEgzNjAwLCAiQ29tcGFxIGlQQVEgSDM2MDAiKQotCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBoMzYwMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaGFja2tpdC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaGFja2tpdC5jCmluZGV4IGRiNWU0MzQuLjMwZjRhNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2hhY2traXQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oYWNra2l0LmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogICovCiAKIE1BQ0hJTkVfU1RBUlQoSEFDS0tJVCwgIkhhY2tLaXQgQ3B1IEJvYXJkIikKLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaGFja2tpdF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCAwY2QwZmM5Li41MzA3NzJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTIsNyArMTIsNyBAQAogKi8KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltcmMJcDE1LCAwLCBccnAsIGMxLCBjMAogCQl0c3QJXHJwLCAjMQkJCUAgTU1VIGVuYWJsZWQ/CiAJCW1vdmVxCVxycCwgIzB4ODAwMDAwMDAJQCBwaHlzaWNhbCBiYXNlIGFkZHJlc3MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDdiZWZjMTAuLjcwMzYzMTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CiAKKyNkZWZpbmUgX19BUk1fR1BJT0xJQl9DT01QTEVYCisKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCiB7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKGdwaW8pICYmIChncGlvIDw9IEdQSU9fTUFYKSkKQEAgLTUxLDcgKzUzLDUgQEAKIAogI2RlZmluZSBncGlvX3RvX2lycShncGlvKQkoKGdwaW8gPCAxMSkgPyAoSVJRX0dQSU8wICsgZ3BpbykgOiBcCiAJCQkJCShJUlFfR1BJTzExIC0gMTEgKyBncGlvKSkKLSNkZWZpbmUgaXJxX3RvX2dwaW8oaXJxKQkoKGlycSA8IElSUV9HUElPMTFfMjcpID8gKGlycSAtIElSUV9HUElPMCkgOiBcCi0JCQkJCShpcnEgLSBJUlFfR1BJTzExICsgMTEpKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYwppbmRleCAxNzZjMDY2Li43NzE5OGZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTM2NCw3ICszNjUsNyBAQAogCiBNQUNISU5FX1NUQVJUKEpPUk5BREE3MjAsICJIUCBKb3JuYWRhIDcyMCIpCiAJLyogTWFpbnRhaW5lcjogS3Jpc3RvZmZlciBFcmljc29uIDxLcmlzdG9mZmVyLkVyaWNzb25AZ21haWwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBqb3JuYWRhNzIwX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9sYXJ0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sYXJ0LmMKaW5kZXggN2I5NTU2Yi4uNWJjNTlkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGFydC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xhcnQuYwpAQCAtNjEsNyArNjEsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKExBUlQsICJMQVJUIikKLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gbGFydF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBsYXJ0X2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9uYW5vZW5naW5lLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9uYW5vZW5naW5lLmMKaW5kZXggNzIwODdmMC4uMDMyZjM4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvbmFub2VuZ2luZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL25hbm9lbmdpbmUuYwpAQCAtMTExLDcgKzExMSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTkFOT0VOR0lORSwgIkJTRSBuYW5vRW5naW5lIikKLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMDAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gbmFub2VuZ2luZV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2hhbm5vbi5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2hhbm5vbi5jCmluZGV4IDc5MTdiMjQuLjFjY2NiZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NoYW5ub24uYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMKQEAgLTgyLDcgKzgyLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChTSEFOTk9OLCAiU2hhbm5vbiAoQUtBOiBUdXhzY3JlZW4pIikKLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gc2hhbm5vbl9tYXBfaW8sCiAJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2ltcGFkLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYwppbmRleCAzNDY1OWYzLi40NzkwZjNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYwpAQCAtMzkyLDcgKzM5Miw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoU0lNUEFELCAiU2ltcGFkIikKIAkvKiBNYWludGFpbmVyOiBIb2xnZXIgRnJleXRoZXIgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gc2ltcGFkX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jCmluZGV4IGFjMjg3M2MuLmZlZGEzY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAogTUFDSElORV9TVEFSVChTSEFSSywgIlNoYXJrIikKIAkvKiBNYWludGFpbmVyOiBBbGV4YW5kZXIgU2NodWx6ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwODAwMzAwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDMwMDAsCiAJLm1hcF9pbwkJPSBzaGFya19tYXBfaW8sCiAJLmluaXRfaXJxCT0gc2hhcmtfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzaGFya190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGE0NzNmNTUuLjIwZWIyYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHhlMDAwMDAwMAogCQlvcnIJXHJwLCBccnAsICMweDAwMDAwM2Y4CiAJCW1vdglccnYsIFxycApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnCmluZGV4IDBjOGY2Y2YuLjA4MjhmYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcKQEAgLTI2LDYgKzI2LDcgQEAKIAlzZWxlY3QgU0hfQ0xLX0NQRwogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBBUk1fR0lDCisJc2VsZWN0IEkyQwogCiBjb21tZW50ICJTSC1Nb2JpbGUgQm9hcmQgVHlwZSIKIApAQCAtNjksNiArNzAsMTEgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfU0g3MzcyCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAKK2NvbmZpZyBNQUNIX0tPVEEyCisJYm9vbCAiS09UQTIgYm9hcmQiCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJZGVwZW5kcyBvbiBBUkNIX1NINzNBMAorCiBjb21tZW50ICJTSC1Nb2JpbGUgU3lzdGVtIENvbmZpZ3VyYXRpb24iCiAKIG1lbnUgIk1lbW9yeSBjb25maWd1cmF0aW9uIgpAQCAtNzgsNiArODQsNyBAQAogCWRlZmF1bHQgIjB4NTAwMDAwMDAiIGlmIE1BQ0hfRzNFVk0KIAlkZWZhdWx0ICIweDQwMDAwMDAwIiBpZiBNQUNIX0c0RVZNIHx8IE1BQ0hfQVA0RVZCIHx8IE1BQ0hfQUc1RVZNIHx8IFwKIAkJCQlNQUNIX01BQ0tFUkVMCisJZGVmYXVsdCAiMHg0MTAwMDAwMCIgaWYgTUFDSF9LT1RBMgogCWRlZmF1bHQgIjB4MDAwMDAwMDAiCiAJLS0taGVscC0tLQogCSAgVHdlYWsgdGhpcyBvbmx5IHdoZW4gcG9ydGluZyB0byBhIG5ldyBtYWNoaW5lIHdoaWNoIGRvZXMgbm90CkBAIC04OSw2ICs5Niw3IEBACiAJZGVmYXVsdCAiMHgwODAwMDAwMCIgaWYgTUFDSF9HM0VWTQogCWRlZmF1bHQgIjB4MDgwMDAwMDAiIGlmIE1BQ0hfRzRFVk0KIAlkZWZhdWx0ICIweDIwMDAwMDAwIiBpZiBNQUNIX0FHNUVWTQorCWRlZmF1bHQgIjB4MWUwMDAwMDAiIGlmIE1BQ0hfS09UQTIKIAlkZWZhdWx0ICIweDEwMDAwMDAwIiBpZiBNQUNIX0FQNEVWQiB8fCBNQUNIX01BQ0tFUkVMCiAJZGVmYXVsdCAiMHgwNDAwMDAwMCIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9NYWtlZmlsZQppbmRleCA2MTJiMjcwLi43MzdiZGM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiAjCiAKICMgQ29tbW9uIG9iamVjdHMKLW9iai15CQkJCTo9IHRpbWVyLm8gY29uc29sZS5vIGNsb2NrLm8gcG1fcnVudGltZS5vCitvYmoteQkJCQk6PSB0aW1lci5vIGNvbnNvbGUubyBjbG9jay5vCiAKICMgQ1BVIG9iamVjdHMKIG9iai0kKENPTkZJR19BUkNIX1NINzM2NykJKz0gc2V0dXAtc2g3MzY3Lm8gY2xvY2stc2g3MzY3Lm8gaW50Yy1zaDczNjcubwpAQCAtNDEsNiArNDEsNyBAQAogb2JqLSQoQ09ORklHX01BQ0hfQVA0RVZCKQkrPSBib2FyZC1hcDRldmIubwogb2JqLSQoQ09ORklHX01BQ0hfQUc1RVZNKQkrPSBib2FyZC1hZzVldm0ubwogb2JqLSQoQ09ORklHX01BQ0hfTUFDS0VSRUwpCSs9IGJvYXJkLW1hY2tlcmVsLm8KK29iai0kKENPTkZJR19NQUNIX0tPVEEyKQkrPSBib2FyZC1rb3RhMi5vCiAKICMgRnJhbWV3b3JrIHN1cHBvcnQKIG9iai0kKENPTkZJR19TTVApCQkrPSAkKHNtcC15KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYWc1ZXZtLmMKaW5kZXggY2RmZGQ2Mi4uYjg2MmU5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFnNWV2bS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3RtaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zaF9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CiAjaW5jbHVkZSA8dmlkZW8vc2hfbWlwaV9kc2kuaD4KICNpbmNsdWRlIDxzb3VuZC9zaF9mc2kuaD4KQEAgLTU4LDcgKzU5LDcgQEAKIAkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewotCQkuc3RhcnQJCT0gZ2ljX3NwaSgzMyksIC8qIFBJTlQxICovCisJCS5zdGFydAkJPSBTSDczQTBfUElOVDBfSVJRKDIpLCAvKiBQSU5UQTIgKi8KIAkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiB9OwpAQCAtMzM4LDYgKzMzOSwxOCBAQAogCX0sCiB9OwogCisvKiBTREhJMCAqLworc3RhdGljIGlycXJldHVybl90IGFnNWV2bV9zZGhpMF9ncGlvX2NkKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcmc7CisJc3RydWN0IHNoX21vYmlsZV9zZGhpX2luZm8gKmluZm8gPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gaW5mby0+cGRhdGE7CisKKwl0bWlvX21tY19jZF93YWtldXAocGRhdGEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiBzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9zZGhpX2luZm8gc2RoaTBfaW5mbyA9IHsKIAkuZG1hX3NsYXZlX3R4CT0gU0hETUFfU0xBVkVfU0RISTBfVFgsCiAJLmRtYV9zbGF2ZV9yeAk9IFNIRE1BX1NMQVZFX1NESEkwX1JYLApAQCAtMzU0LDE0ICszNjcsMTcgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX0NBUkRfREVURUNULAogCQkuc3RhcnQJPSBnaWNfc3BpKDgzKSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAlbMl0gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX1NEQ0FSRCwKIAkJLnN0YXJ0CT0gZ2ljX3NwaSg4NCksCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJWzNdID0geworCQkubmFtZQk9IFNIX01PQklMRV9TREhJX0lSUV9TRElPLAogCQkuc3RhcnQJPSBnaWNfc3BpKDg1KSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKQEAgLTM5NywxNCArNDEzLDE3IEBACiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0geworCQkubmFtZQk9IFNIX01PQklMRV9TREhJX0lSUV9DQVJEX0RFVEVDVCwKIAkJLnN0YXJ0CT0gZ2ljX3NwaSg4NyksCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJWzJdID0geworCQkubmFtZQk9IFNIX01PQklMRV9TREhJX0lSUV9TRENBUkQsCiAJCS5zdGFydAk9IGdpY19zcGkoODgpLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCVszXSA9IHsKKwkJLm5hbWUJPSBTSF9NT0JJTEVfU0RISV9JUlFfU0RJTywKIAkJLnN0YXJ0CT0gZ2ljX3NwaSg4OSksCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCX0sCkBAIC00NDcsMjUgKzQ2NiwxNCBAQAogc3RhdGljIHZvaWQgX19pbml0IGFnNWV2bV9tYXBfaW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQoYWc1ZXZtX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYWc1ZXZtX2lvX2Rlc2MpKTsKKwkvKiBETUEgbWVtb3J5IGF0IDB4ZjYwMDAwMDAgLSAweGZmZGZmZmZmICovCisJaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKDE1OCA8PCAyMCk7CiAKIAkvKiBzZXR1cCBlYXJseSBkZXZpY2VzIGFuZCBjb25zb2xlIGhlcmUgYXMgd2VsbCAqLwogCXNoNzNhMF9hZGRfZWFybHlfZGV2aWNlcygpOwogCXNobW9iaWxlX3NldHVwX2NvbnNvbGUoKTsKIH0KIAotI2RlZmluZSBQSU5UQ19BRERSCTB4ZTY5MDAwMDAKLSNkZWZpbmUgUElOVEVSMEEJKFBJTlRDX0FERFIgKyAweGEwKQotI2RlZmluZSBQSU5UQ1IwQQkoUElOVENfQUREUiArIDB4YjApCi0KLXZvaWQgX19pbml0IGFnNWV2bV9pbml0X2lycSh2b2lkKQotewotCXNoNzNhMF9pbml0X2lycSgpOwotCi0JLyogc2V0dXAgUElOVDogZW5hYmxlIFBJTlRBMiBhcyBhY3RpdmUgbG93ICovCi0JX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFBJTlRFUjBBKSB8ICgxPDwyOSksIFBJTlRFUjBBKTsKLQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUElOVENSMEEpIHwgKDI8PDEwKSwgUElOVENSMEEpOwotfQotCiAjZGVmaW5lIERTSTBQSFlDUgkweGU2MTUwMDZjCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBhZzVldm1faW5pdCh2b2lkKQpAQCAtNTA3LDE0ICs1MTUsMTQgQEAKIAkvKiBlbmFibGUgTU1DSUYgKi8KIAlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNDTEswLCBOVUxMKTsKIAlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNDTUQwX1BVLCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8wLCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8xLCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8yLCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8zLCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF80LCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF81LCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF82LCBOVUxMKTsKLQlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF83LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8wX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8xX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8yX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8zX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF80X1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF81X1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF82X1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF83X1BVLCBOVUxMKTsKIAlncGlvX3JlcXVlc3QoR1BJT19QT1JUMjA4LCBOVUxMKTsgLyogUmVzZXQgKi8KIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QT1JUMjA4LCAxKTsKIApAQCAtNTYxLDYgKzU2OSwxMyBAQAogCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMF8xLCBOVUxMKTsKIAlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDBfMCwgTlVMTCk7CiAKKwlpZiAoIXJlcXVlc3RfaXJxKGludGNzX2V2dDJpcnEoMHgzYzApLCBhZzVldm1fc2RoaTBfZ3Bpb19jZCwKKwkJCSBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkgInNkaGkwIGNkIiwgJnNkaGkwX2RldmljZS5kZXYpKQorCQlzZGhpMF9pbmZvLnRtaW9fZmxhZ3MgfD0gVE1JT19NTUNfSEFTX0NPTERfQ0Q7CisJZWxzZQorCQlwcl93YXJuKCJVbmFibGUgdG8gc2V0dXAgU0RISTAgR1BJTyBJUlFcbiIpOworCiAJLyogZW5hYmxlIFNESEkxIG9uIENONCBbV0xBTiBJL0ZdICovCiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUNMSzEsIE5VTEwpOwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElDTUQxX1BVLCBOVUxMKTsKQEAgLTU5Miw3ICs2MDcsNyBAQAogCiBNQUNISU5FX1NUQVJUKEFHNUVWTSwgImFnNWV2bSIpCiAJLm1hcF9pbwkJPSBhZzVldm1fbWFwX2lvLAotCS5pbml0X2lycQk9IGFnNWV2bV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBzaDczYTBfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEJPSBzaG1vYmlsZV9oYW5kbGVfaXJxX2dpYywKIAkuaW5pdF9tYWNoaW5lCT0gYWc1ZXZtX2luaXQsCiAJLnRpbWVyCQk9ICZhZzVldm1fdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYwppbmRleCA3ZTkwZDA2Li40Yzg2NWVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zaF9rZXlzYy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9yOGE2NjU5Ny5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX2Nsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3NoX21vYmlsZV9jZXUuaD4KICNpbmNsdWRlIDxtZWRpYS9zaF9tb2JpbGVfY3NpMi5oPgpAQCAtMTk5LDggKzIwMCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugbm9yX2ZsYXNoX3Jlc291cmNlc1tdID0gewogCVswXQk9IHsKLQkJLnN0YXJ0CT0gMHgwMDAwMDAwMCwKLQkJLmVuZAk9IDB4MDgwMDAwMDAgLSAxLAorCQkuc3RhcnQJPSAweDIwMDAwMDAwLCAvKiBDUzAgc2hhZG93IGluc3RlYWQgb2YgcmVndWxhciBDUzAgKi8KKwkJLmVuZAk9IDB4MjgwMDAwMDAgLSAxLCAvKiBuZWVkZWQgYnkgVVNCIE1BU0sgUk9NIGJvb3QgKi8KIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfQogfTsKQEAgLTkzMiw3ICs5MzMsNyBAQAogc3RhdGljIHN0cnVjdCBzaF9jc2kyX2NsaWVudF9jb25maWcgY3NpMl9jbGllbnRzW10gPSB7CiAJewogCQkucGh5CQk9IFNIX0NTSTJfUEhZX01BSU4sCi0JCS5sYW5lcwkJPSAzLAorCQkubGFuZXMJCT0gMCwJCS8qIGRlZmF1bHQ6IDIgbGFuZXMgKi8KIAkJLmNoYW5uZWwJPSAwLAogCQkucGRldgkJPSAmYXA0ZXZiX2NhbWVyYSwKIAl9LApAQCAtMTE3MSw2ICsxMTcyLDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBhcDRldmJfbWFwX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KGFwNGV2Yl9pb19kZXNjLCBBUlJBWV9TSVpFKGFwNGV2Yl9pb19kZXNjKSk7CisJLyogRE1BIG1lbW9yeSBhdCAweGY2MDAwMDAwIC0gMHhmZmRmZmZmZiAqLworCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZSgxNTggPDwgMjApOwogCiAJLyogc2V0dXAgZWFybHkgZGV2aWNlcyBhbmQgY29uc29sZSBoZXJlIGFzIHdlbGwgKi8KIAlzaDczNzJfYWRkX2Vhcmx5X2RldmljZXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtZzNldm0uYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtZzNldm0uYwppbmRleCBlZjQ2MTNiLi44YjYyMGJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWczZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1nM2V2bS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvc2hfa2V5c2MuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPG1hY2gvc2g3MzY3Lmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMjYwLDYgKzI2MSw4IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZzNldm1fbWFwX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KGczZXZtX2lvX2Rlc2MsIEFSUkFZX1NJWkUoZzNldm1faW9fZGVzYykpOworCS8qIERNQSBtZW1vcnkgYXQgMHhmNjAwMDAwMCAtIDB4ZmZkZmZmZmYgKi8KKwlpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoMTU4IDw8IDIwKTsKIAogCS8qIHNldHVwIGVhcmx5IGRldmljZXMgYW5kIGNvbnNvbGUgaGVyZSBhcyB3ZWxsICovCiAJc2g3MzY3X2FkZF9lYXJseV9kZXZpY2VzKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWc0ZXZtLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWc0ZXZtLmMKaW5kZXggOGUzYzU1NS4uNzcxOWRkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1nNGV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtZzRldm0uYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWFjaC9zaDczNzcuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0yNzQsNiArMjc1LDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBnNGV2bV9tYXBfaW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQoZzRldm1faW9fZGVzYywgQVJSQVlfU0laRShnNGV2bV9pb19kZXNjKSk7CisJLyogRE1BIG1lbW9yeSBhdCAweGY2MDAwMDAwIC0gMHhmZmRmZmZmZiAqLworCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZSgxNTggPDwgMjApOwogCiAJLyogc2V0dXAgZWFybHkgZGV2aWNlcyBhbmQgY29uc29sZSBoZXJlIGFzIHdlbGwgKi8KIAlzaDczNzdfYWRkX2Vhcmx5X2RldmljZXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQta290YTIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQta290YTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDlhNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1rb3RhMi5jCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICoga290YTIgYm9hcmQgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSAgTWFnbnVzIERhbW0KKyAqIENvcHlyaWdodCAoQykgMjAxMCAgVGFrYXNoaSBZb3NoaWkgPHlvc2hpaS50YWthc2hpLnpqQHJlbmVzYXMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBZb3NoaWhpcm8gU2hpbW9kYSA8c2hpbW9kYS55b3NoaWhpcm9AcmVuZXNhcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9zaF9rZXlzYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9zaF9tbWNpZi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90bWlvLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvc2g3M2EwLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisKKy8qIFNNU0MgOTIyMCAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbXNjOTIyMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAkJPSAweDE0MDAwMDAwLCAvKiBDUzVBICovCisJCS5lbmQJCT0gMHgxNDAwMDBmZiwgLyogQTEtPkE3ICovCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CQk9IGdpY19zcGkoMzMpLCAvKiBQSU5UQTIgQCBQT1JUMTQ0ICovCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbXNjOTExeF9wbGF0Zm9ybV9jb25maWcgc21zYzkyMjBfcGxhdGRhdGEgPSB7CisJLmZsYWdzCQk9IFNNU0M5MTFYX1VTRV8zMkJJVCwgLyogMzItYml0IFNXIG9uIDE2LWJpdCBIVyBidXMgKi8KKwkucGh5X2ludGVyZmFjZQk9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCisJLmlycV9wb2xhcml0eQk9IFNNU0M5MTFYX0lSUV9QT0xBUklUWV9BQ1RJVkVfTE9XLAorCS5pcnFfdHlwZQk9IFNNU0M5MTFYX0lSUV9UWVBFX1BVU0hfUFVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV0aF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtc2M5MTF4IiwKKwkuaWQJCT0gMCwKKwkuZGV2ICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc21zYzkyMjBfcGxhdGRhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBzbXNjOTIyMF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtc2M5MjIwX3Jlc291cmNlcyksCit9OworCisvKiBLRVlTQyAqLworc3RhdGljIHN0cnVjdCBzaF9rZXlzY19pbmZvIGtleXNjX3BsYXRkYXRhID0geworCS5tb2RlCQk9IFNIX0tFWVNDX01PREVfNiwKKwkuc2Nhbl90aW1pbmcJPSAzLAorCS5kZWxheQkJPSAxMDAsCisJLmtleWNvZGVzCT0geworCQlLRVlfTlVNRVJJQ19TVEFSLCBLRVlfTlVNRVJJQ18wLCBLRVlfTlVNRVJJQ19QT1VORCwKKwkJMCwgMCwgMCwgMCwgMCwKKwkJS0VZX05VTUVSSUNfNywgS0VZX05VTUVSSUNfOCwgS0VZX05VTUVSSUNfOSwKKwkJMCwgS0VZX0RPV04sIDAsIDAsIDAsCisJCUtFWV9OVU1FUklDXzQsIEtFWV9OVU1FUklDXzUsIEtFWV9OVU1FUklDXzYsCisJCUtFWV9MRUZULCBLRVlfRU5URVIsIEtFWV9SSUdIVCwgMCwgMCwKKwkJS0VZX05VTUVSSUNfMSwgS0VZX05VTUVSSUNfMiwgS0VZX05VTUVSSUNfMywKKwkJMCwgS0VZX1VQLCAwLCAwLCAwLAorCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGtleXNjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiS0VZU0MiLAorCQkuc3RhcnQJPSAweGU2MWIwMDAwLAorCQkuZW5kCT0gMHhlNjFiMDA5OCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBnaWNfc3BpKDcxKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGtleXNjX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfa2V5c2MiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShrZXlzY19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGtleXNjX3Jlc291cmNlcywKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAma2V5c2NfcGxhdGRhdGEsCisJfSwKK307CisKKy8qIEdQSU8gS0VZICovCisjZGVmaW5lIEdQSU9fS0VZKGMsIGcsIGQpIHsgLmNvZGUgPSBjLCAuZ3BpbyA9IGcsIC5kZXNjID0gZCwgLmFjdGl2ZV9sb3cgPSAxIH0KKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGdwaW9fYnV0dG9uc1tdID0geworCUdQSU9fS0VZKEtFWV9WT0xVTUVVUCwgR1BJT19QT1JUNTYsICIrIiksIC8qIFMyOiBWT0wrIFtJUlE5XSAqLworCUdQSU9fS0VZKEtFWV9WT0xVTUVET1dOLCBHUElPX1BPUlQ1NCwgIi0iKSwgLyogUzM6IFZPTC0gW0lSUTEwXSAqLworCUdQSU9fS0VZKEtFWV9NRU5VLCBHUElPX1BPUlQyNywgIk1lbnUiKSwgLyogUzQ6IE1FTlUgW0lSUTMwXSAqLworCUdQSU9fS0VZKEtFWV9IT01FUEFHRSwgR1BJT19QT1JUMjYsICJIb21lIiksIC8qIFM1OiBIT01FIFtJUlEzMV0gKi8KKwlHUElPX0tFWShLRVlfQkFDSywgR1BJT19QT1JUMTEsICJCYWNrIiksIC8qIFM2OiBCQUNLIFtJUlEwXSAqLworCUdQSU9fS0VZKEtFWV9QSE9ORSwgR1BJT19QT1JUMjM4LCAiVGVsIiksIC8qIFM3OiBURUwgW0lSUTExXSAqLworCUdQSU9fS0VZKEtFWV9QT1dFUiwgR1BJT19QT1JUMjM5LCAiQzEiKSwgLyogUzg6IENBTSBbSVJRMTNdICovCisJR1BJT19LRVkoS0VZX01BSUwsIEdQSU9fUE9SVDIyNCwgIk1haWwiKSwgLyogUzk6IE1BSUwgW0lSUTNdICovCisJLyogT21pdHRlZCBidXR0b24gIkMzPyI6IEdQSU9fUE9SVDIyMyAtIFMxMDogQ1VTVCBbSVJROF0gKi8KKwlHUElPX0tFWShLRVlfQ0FNRVJBLCBHUElPX1BPUlQxNjQsICJDMiIpLCAvKiBTMTE6IENBTV9IQUxGIFtJUlEyNV0gKi8KKwkvKiBPbWl0dGVkIGJ1dHRvbiAiPyI6IEdQSU9fUE9SVDE1MiAtIFMxMjogQ0FNX0ZVTEwgW05vIElSUV0gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgZ3Bpb19rZXlfaW5mbyA9IHsKKwkuYnV0dG9ucyAgICAgICAgPSBncGlvX2J1dHRvbnMsCisJLm5idXR0b25zICAgICAgID0gQVJSQVlfU0laRShncGlvX2J1dHRvbnMpLAorCS5wb2xsX2ludGVydmFsICA9IDI1MCwgLyogcG9sbGVkIGZvciBub3cgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGdwaW9fa2V5c19kZXZpY2UgPSB7CisJLm5hbWUgICA9ICJncGlvLWtleXMtcG9sbGVkIiwgLyogcG9sbGVkIGZvciBub3cgKi8KKwkuaWQgICAgID0gLTEsCisJLmRldiAgICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJmdwaW9fa2V5X2luZm8sCisJfSwKK307CisKKy8qIEdQSU8gTEVEICovCisjZGVmaW5lIEdQSU9fTEVEKG4sIGcpIHsgLm5hbWUgPSBuLCAuZ3BpbyA9IGcgfQorCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGdwaW9fbGVkc1tdID0geworCUdQSU9fTEVEKCJWMjUxMyIsIEdQSU9fUE9SVDE1MyksIC8qIFBPUlQxNTMgW1RQVTFUMDJdIC0+IFYyNTEzICovCisJR1BJT19MRUQoIlYyNTE0IiwgR1BJT19QT1JUMTk5KSwgLyogUE9SVDE5OSBbVFBVNFRPMV0gLT4gVjI1MTQgKi8KKwlHUElPX0xFRCgiVjI1MTUiLCBHUElPX1BPUlQxOTcpLCAvKiBQT1JUMTk3IFtUUFUyVE8xXSAtPiBWMjUxNSAqLworCUdQSU9fTEVEKCJLRVlMRUQiLCBHUElPX1BPUlQxNjMpLCAvKiBQT1JUMTYzIFtUUFUzVE8wXSAtPiBLRVlMRUQgKi8KKwlHUElPX0xFRCgiRyIsIEdQSU9fUE9SVDIwKSwgLyogUE9SVDIwIFtHUE8wXSAtPiBMRUQ3IC0+ICJHIiAqLworCUdQSU9fTEVEKCJIIiwgR1BJT19QT1JUMjEpLCAvKiBQT1JUMjEgW0dQTzFdIC0+IExFRDggLT4gIkgiICovCisJR1BJT19MRUQoIkoiLCBHUElPX1BPUlQyMiksIC8qIFBPUlQyMiBbR1BPMl0gLT4gTEVEOSAtPiAiSiIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBncGlvX2xlZHNfaW5mbyA9IHsKKwkubGVkcwkJPSBncGlvX2xlZHMsCisJLm51bV9sZWRzCT0gQVJSQVlfU0laRShncGlvX2xlZHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZ3Bpb19sZWRzX2RldmljZSA9IHsKKwkubmFtZSAgID0gImxlZHMtZ3BpbyIsCisJLmlkICAgICA9IC0xLAorCS5kZXYgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZncGlvX2xlZHNfaW5mbywKKwl9LAorfTsKKworLyogTU1DSUYgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW1jaWZfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZSAgID0gIk1NQ0lGIiwKKwkJLnN0YXJ0ICA9IDB4ZTZiZDAwMDAsCisJCS5lbmQgICAgPSAweGU2YmQwMGZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBnaWNfc3BpKDE0MCksCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0ICA9IGdpY19zcGkoMTQxKSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNoX21tY2lmX3BsYXRfZGF0YSBtbWNpZl9pbmZvID0geworCS5vY3IgICAgICAgICAgICA9IE1NQ19WRERfMTY1XzE5NSwKKwkuY2FwcyAgICAgICAgICAgPSBNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQX05PTlJFTU9WQUJMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1tY2lmX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAic2hfbW1jaWYiLAorCS5pZCAgICAgICAgICAgICA9IDAsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgICAgICAgICA9ICZtbWNpZl9pbmZvLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShtbWNpZl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IG1tY2lmX3Jlc291cmNlcywKK307CisKKy8qIFNESEkwICovCitzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9zZGhpX2luZm8gc2RoaTBfaW5mbyA9IHsKKwkudG1pb19jYXBzICAgICAgPSBNTUNfQ0FQX1NEX0hJR0hTUEVFRCwKKwkudG1pb19mbGFncyAgICAgPSBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSB8IFRNSU9fTU1DX0hBU19JRExFX1dBSVQsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNkaGkwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUgICA9ICJTREhJMCIsCisJCS5zdGFydCAgPSAweGVlMTAwMDAwLAorCQkuZW5kICAgID0gMHhlZTEwMDBmZiwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gZ2ljX3NwaSg4MyksCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0ICA9IGdpY19zcGkoODQpLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbM10gPSB7CisJCS5zdGFydAk9IGdpY19zcGkoODUpLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2RoaTBfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJzaF9tb2JpbGVfc2RoaSIsCisJLmlkICAgICAgICAgICAgID0gMCwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHNkaGkwX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gc2RoaTBfcmVzb3VyY2VzLAorCS5kZXYgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZzZGhpMF9pbmZvLAorCX0sCit9OworCisvKiBTREhJMSAqLworc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNkaGkxX2luZm8gPSB7CisJLnRtaW9fY2FwcyAgICAgID0gTU1DX0NBUF9OT05SRU1PVkFCTEUgfCBNTUNfQ0FQX1NESU9fSVJRLAorCS50bWlvX2ZsYWdzICAgICA9IFRNSU9fTU1DX1dSUFJPVEVDVF9ESVNBQkxFIHwgVE1JT19NTUNfSEFTX0lETEVfV0FJVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RoaTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZSAgID0gIlNESEkxIiwKKwkJLnN0YXJ0ICA9IDB4ZWUxMjAwMDAsCisJCS5lbmQgICAgPSAweGVlMTIwMGZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBnaWNfc3BpKDg3KSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQgID0gZ2ljX3NwaSg4OCksCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9IHsKKwkJLnN0YXJ0CT0gZ2ljX3NwaSg4OSksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZGhpMV9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gInNoX21vYmlsZV9zZGhpIiwKKwkuaWQgICAgICAgICAgICAgPSAxLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoc2RoaTFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBzZGhpMV9yZXNvdXJjZXMsCisJLmRldiAgICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJnNkaGkxX2luZm8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICprb3RhMl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZXRoX2RldmljZSwKKwkma2V5c2NfZGV2aWNlLAorCSZncGlvX2tleXNfZGV2aWNlLAorCSZncGlvX2xlZHNfZGV2aWNlLAorCSZtbWNpZl9kZXZpY2UsCisJJnNkaGkwX2RldmljZSwKKwkmc2RoaTFfZGV2aWNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBrb3RhMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwkvKiBjcmVhdGUgYSAxOjEgZW50aXR5IG1hcCBmb3IgMHhlNnh4eHh4eAorCSAqIHVzZWQgYnkgQ1BHQSwgSU5UQyBhbmQgUEZDLgorCSAqLworCXsKKwkJLnZpcnR1YWwJPSAweGU2MDAwMDAwLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oMHhlNjAwMDAwMCksCisJCS5sZW5ndGgJCT0gMjU2IDw8IDIwLAorCQkudHlwZQkJPSBNVF9ERVZJQ0VfTk9OU0hBUkVECisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBrb3RhMl9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQoa290YTJfaW9fZGVzYywgQVJSQVlfU0laRShrb3RhMl9pb19kZXNjKSk7CisKKwkvKiBzZXR1cCBlYXJseSBkZXZpY2VzIGFuZCBjb25zb2xlIGhlcmUgYXMgd2VsbCAqLworCXNoNzNhMF9hZGRfZWFybHlfZGV2aWNlcygpOworCXNobW9iaWxlX3NldHVwX2NvbnNvbGUoKTsKK30KKworI2RlZmluZSBQSU5URVIwQQkweGU2OTAwMGEwCisjZGVmaW5lIFBJTlRDUjBBCTB4ZTY5MDAwYjAKKwordm9pZCBfX2luaXQga290YTJfaW5pdF9pcnEodm9pZCkKK3sKKwlzaDczYTBfaW5pdF9pcnEoKTsKKworCS8qIHNldHVwIFBJTlQ6IGVuYWJsZSBQSU5UQTIgYXMgYWN0aXZlIGxvdyAqLworCV9fcmF3X3dyaXRlbCgxIDw8IDI5LCBQSU5URVIwQSk7CisJX19yYXdfd3JpdGV3KDIgPDwgMTAsIFBJTlRDUjBBKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGtvdGEyX2luaXQodm9pZCkKK3sKKwlzaDczYTBfcGlubXV4X2luaXQoKTsKKworCS8qIFNDSUZBMiAoVUFSVDIpICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRkEyX1RYRDEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUZBMl9SWEQxLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TQ0lGQTJfUlRTMV8sIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUZBMl9DVFMxXywgTlVMTCk7CisKKwkvKiBTQ0lGQTQgKFVBUlQxKSAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUZBNF9UWEQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUZBNF9SWEQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUZBNF9SVFNfLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TQ0lGQTRfQ1RTXywgTlVMTCk7CisKKwkvKiBTTVNDOTExWCAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0QwX05BRjAsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0QxX05BRjEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0QyX05BRjIsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0QzX05BRjMsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0Q0X05BRjQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0Q1X05BRjUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0Q2X05BRjYsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0Q3X05BRjcsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0Q4X05BRjgsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0Q5X05BRjksIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0QxMF9OQUYxMCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDExX05BRjExLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9EMTJfTkFGMTIsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0QxM19OQUYxMywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDE0X05BRjE0LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9EMTVfTkFGMTUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0NTNUFfLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9XRTBfX0ZXRSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fUE9SVDE0NCwgTlVMTCk7IC8qIFBJTlRBMiAqLworCWdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU9fUE9SVDE0NCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fUE9SVDE0NSwgTlVMTCk7IC8qIFJFU0VUICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUE9SVDE0NSwgMSk7CisKKwkvKiBLRVlTQyAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWUlOMF9QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZSU4xX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlJTjJfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWUlOM19QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZSU40X1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlJTjVfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWUlONl9QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZSU43X1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlPVVQwLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlPVVQxLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlPVVQyLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlPVVQzLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlPVVQ0LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlPVVQ1LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9QT1JUNTlfS0VZT1VUNiwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fUE9SVDU4X0tFWU9VVDcsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDgsIE5VTEwpOworCisJLyogTU1DSUYgKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNDTEswLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8wLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8xLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8yLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF8zLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF80LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF81LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF82LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNEMF83LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9NTUNDTUQwLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19QT1JUMjA4LCBOVUxMKTsgLyogUmVzZXQgKi8KKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QT1JUMjA4LCAxKTsKKworCS8qIFNESEkwIChtaWNyb1NEKSAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElDRDBfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElDTUQwX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJQ0xLMCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQwXzNfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMF8yX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDBfMV9QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQwXzBfUFUsIE5VTEwpOworCisJLyogU0NJRkIgKEJUKSAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1BPUlQxNTlfU0NJRkJfU0NLLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9QT1JUMTYwX1NDSUZCX1RYRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fUE9SVDE2MV9TQ0lGQl9DVFNfLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9QT1JUMTYyX1NDSUZCX1JYRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fUE9SVDE2M19TQ0lGQl9SVFNfLCBOVUxMKTsKKworCS8qIFNESEkxIChCQ000MzMwKSAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElDTEsxLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJQ01EMV9QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQxXzNfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMV8yX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDFfMV9QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQxXzBfUFUsIE5VTEwpOworCisjaWZkZWYgQ09ORklHX0NBQ0hFX0wyWDAKKwkvKiBFYXJseSBCUkVTUCBlbmFibGUsIFNoYXJlZCBhdHRyaWJ1dGUgb3ZlcnJpZGUgZW5hYmxlLCA2NEsqOHdheSAqLworCWwyeDBfaW5pdChfX2lvKDB4ZjAxMDAwMDApLCAweDQwNDYwMDAwLCAweDgyMDAwZmZmKTsKKyNlbmRpZgorCXNoNzNhMF9hZGRfc3RhbmRhcmRfZGV2aWNlcygpOworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGtvdGEyX2RldmljZXMsIEFSUkFZX1NJWkUoa290YTJfZGV2aWNlcykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQga290YTJfdGltZXJfaW5pdCh2b2lkKQoreworCXNoNzNhMF9jbG9ja19pbml0KCk7CisJc2htb2JpbGVfdGltZXIuaW5pdCgpOworCXJldHVybjsKK30KKworc3RydWN0IHN5c190aW1lciBrb3RhMl90aW1lciA9IHsKKwkuaW5pdAk9IGtvdGEyX3RpbWVyX2luaXQsCit9OworCitNQUNISU5FX1NUQVJUKEtPVEEyLCAia290YTIiKQorCS5tYXBfaW8JCT0ga290YTJfbWFwX2lvLAorCS5pbml0X2lycQk9IGtvdGEyX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxCT0gc2htb2JpbGVfaGFuZGxlX2lycV9naWMsCisJLmluaXRfbWFjaGluZQk9IGtvdGEyX2luaXQsCisJLnRpbWVyCQk9ICZrb3RhMl90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKaW5kZXggMDAyNzNkYS4uOWM1ZTU5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RjYTY0MTZfa2V5cGFkLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3I4YTY2NTk3Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3JlbmVzYXNfdXNiaHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8dmlkZW8vc2hfbW9iaWxlX2hkbWkuaD4KICNpbmNsdWRlIDx2aWRlby9zaF9tb2JpbGVfbGNkYy5oPgpAQCAtMjcyLDggKzI3Myw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugbm9yX2ZsYXNoX3Jlc291cmNlc1tdID0gewogCVswXQk9IHsKLQkJLnN0YXJ0CT0gMHgwMDAwMDAwMCwKLQkJLmVuZAk9IDB4MDgwMDAwMDAgLSAxLAorCQkuc3RhcnQJPSAweDIwMDAwMDAwLCAvKiBDUzAgc2hhZG93IGluc3RlYWQgb2YgcmVndWxhciBDUzAgKi8KKwkJLmVuZAk9IDB4MjgwMDAwMDAgLSAxLCAvKiBuZWVkZWQgYnkgVVNCIE1BU0sgUk9NIGJvb3QgKi8KIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfQogfTsKQEAgLTEwNzEsMTQgKzEwNzIsMTcgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX0NBUkRfREVURUNULAogCQkuc3RhcnQJPSBldnQyaXJxKDB4MGU4MCksIC8qIFNESEkxX1NESEkxSTAgKi8KIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAlbMl0gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX1NEQ0FSRCwKIAkJLnN0YXJ0CT0gZXZ0MmlycSgweDBlYTApLCAvKiBTREhJMV9TREhJMUkxICovCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJWzNdID0geworCQkubmFtZQk9IFNIX01PQklMRV9TREhJX0lSUV9TRElPLAogCQkuc3RhcnQJPSBldnQyaXJxKDB4MGVjMCksIC8qIFNESEkxX1NESEkxSTIgKi8KIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKQEAgLTExMjIsMTQgKzExMjYsMTcgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX0NBUkRfREVURUNULAogCQkuc3RhcnQJPSBldnQyaXJxKDB4MTIwMCksIC8qIFNESEkyX1NESEkySTAgKi8KIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAlbMl0gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX1NEQ0FSRCwKIAkJLnN0YXJ0CT0gZXZ0MmlycSgweDEyMjApLCAvKiBTREhJMl9TREhJMkkxICovCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJWzNdID0geworCQkubmFtZQk9IFNIX01PQklMRV9TREhJX0lSUV9TRElPLAogCQkuc3RhcnQJPSBldnQyaXJxKDB4MTI0MCksIC8qIFNESEkyX1NESEkySTIgKi8KIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKQEAgLTEyMTYsOSArMTIyMywxMCBAQAogCQkud2lkdGggPSA2NDAsCiAJCS5oZWlnaHQgPSA0ODAsCiAJfSwKLQkuYnVzX3BhcmFtID0gU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAotCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fTUFTVEVSIHwgU09DQU1fREFUQVdJRFRIXzggfAotCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0gsCisJLm1idXNfcGFyYW0gPSBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX01BU1RFUiB8CisJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwKKwlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCwKKwkubWJ1c190eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMLAogCS5zZXRfY2FwdHVyZSA9IGNhbWVyYV9zZXRfY2FwdHVyZSwKIH07CiAKQEAgLTEzODIsNiArMTM5MCw4IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbWFja2VyZWxfbWFwX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KG1hY2tlcmVsX2lvX2Rlc2MsIEFSUkFZX1NJWkUobWFja2VyZWxfaW9fZGVzYykpOworCS8qIERNQSBtZW1vcnkgYXQgMHhmNjAwMDAwMCAtIDB4ZmZkZmZmZmYgKi8KKwlpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoMTU4IDw8IDIwKTsKIAogCS8qIHNldHVwIGVhcmx5IGRldmljZXMgYW5kIGNvbnNvbGUgaGVyZSBhcyB3ZWxsICovCiAJc2g3MzcyX2FkZF9lYXJseV9kZXZpY2VzKCk7CkBAIC0xNTg4LDYgKzE1OTgsNyBAQAogCiAJc2g3MzcyX2FkZF9kZXZpY2VfdG9fZG9tYWluKCZzaDczNzJfYTRsYywgJmxjZGNfZGV2aWNlKTsKIAlzaDczNzJfYWRkX2RldmljZV90b19kb21haW4oJnNoNzM3Ml9hNGxjLCAmaGRtaV9sY2RjX2RldmljZSk7CisJc2g3MzcyX2FkZF9kZXZpY2VfdG9fZG9tYWluKCZzaDczNzJfYTRsYywgJm1lcmFtX2RldmljZSk7CiAJc2g3MzcyX2FkZF9kZXZpY2VfdG9fZG9tYWluKCZzaDczNzJfYTRtcCwgJmZzaV9kZXZpY2UpOwogCXNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbigmc2g3MzcyX2Ezc3AsICZ1c2JoczBfZGV2aWNlKTsKIAlzaDczNzJfYWRkX2RldmljZV90b19kb21haW4oJnNoNzM3Ml9hM3NwLCAmdXNiaHMxX2RldmljZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYwppbmRleCA2Njk3NTkyLi45OTVhOWMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMKQEAgLTQ3Niw3ICs0NzYsNyBAQAogCS5kaXNhYmxlCT0gZnNpZGl2X2Rpc2FibGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsa19tYXBwaW5nIHNoNzM3Ml9mc2lkaXZhX2Nsa19tYXBwaW5nID0geworc3RhdGljIHN0cnVjdCBjbGtfbWFwcGluZyBmc2lkaXZhX2Nsa19tYXBwaW5nID0gewogCS5waHlzCT0gRlNJRElWQSwKIAkubGVuCT0gOCwKIH07CkBAIC00ODQsMTAgKzQ4NCwxMCBAQAogc3RydWN0IGNsayBzaDczNzJfZnNpZGl2YV9jbGsgPSB7CiAJLm9wcwkJPSAmZnNpZGl2X2Nsa19vcHMsCiAJLnBhcmVudAkJPSAmZGl2Nl9yZXBhcmVudF9jbGtzW0RJVjZfRlNJQV0sIC8qIGxhdGUgaW5zdGFsbCAqLwotCS5tYXBwaW5nCT0gJnNoNzM3Ml9mc2lkaXZhX2Nsa19tYXBwaW5nLAorCS5tYXBwaW5nCT0gJmZzaWRpdmFfY2xrX21hcHBpbmcsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsa19tYXBwaW5nIHNoNzM3Ml9mc2lkaXZiX2Nsa19tYXBwaW5nID0geworc3RhdGljIHN0cnVjdCBjbGtfbWFwcGluZyBmc2lkaXZiX2Nsa19tYXBwaW5nID0gewogCS5waHlzCT0gRlNJRElWQiwKIAkubGVuCT0gOCwKIH07CkBAIC00OTUsNyArNDk1LDcgQEAKIHN0cnVjdCBjbGsgc2g3MzcyX2ZzaWRpdmJfY2xrID0gewogCS5vcHMJCT0gJmZzaWRpdl9jbGtfb3BzLAogCS5wYXJlbnQJCT0gJmRpdjZfcmVwYXJlbnRfY2xrc1tESVY2X0ZTSUJdLCAgLyogbGF0ZSBpbnN0YWxsICovCi0JLm1hcHBpbmcJPSAmc2g3MzcyX2ZzaWRpdmJfY2xrX21hcHBpbmcsCisJLm1hcHBpbmcJPSAmZnNpZGl2Yl9jbGtfbWFwcGluZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICpsYXRlX21haW5fY2xrc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay5jCmluZGV4IDZiN2M3YzQuLjMxNjU0ZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2hfY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIGludCBfX2luaXQgY2xrX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY3B1aWRsZS5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jcHVpZGxlLmMKaW5kZXggMmU0NGYxMS4uMWIyMzM0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jcHVpZGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jcHVpZGxlLmMKQEAgLTI2LDY1ICsyNiw1OSBAQAogfTsKIAogc3RhdGljIGludCBzaG1vYmlsZV9jcHVpZGxlX2VudGVyKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKQorCQkJCSAgc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkJICBpbnQgaW5kZXgpCiB7CiAJa3RpbWVfdCBiZWZvcmUsIGFmdGVyOwotCWludCByZXF1ZXN0ZWRfc3RhdGUgPSBzdGF0ZSAtICZkZXYtPnN0YXRlc1swXTsKIAotCWRldi0+bGFzdF9zdGF0ZSA9ICZkZXYtPnN0YXRlc1tyZXF1ZXN0ZWRfc3RhdGVdOwogCWJlZm9yZSA9IGt0aW1lX2dldCgpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlsb2NhbF9maXFfZGlzYWJsZSgpOwogCi0Jc2htb2JpbGVfY3B1aWRsZV9tb2Rlc1tyZXF1ZXN0ZWRfc3RhdGVdKCk7CisJc2htb2JpbGVfY3B1aWRsZV9tb2Rlc1tpbmRleF0oKTsKIAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlsb2NhbF9maXFfZW5hYmxlKCk7CiAKIAlhZnRlciA9IGt0aW1lX2dldCgpOwotCXJldHVybiBrdGltZV90b19ucyhrdGltZV9zdWIoYWZ0ZXIsIGJlZm9yZSkpID4+IDEwOworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSBrdGltZV90b19ucyhrdGltZV9zdWIoYWZ0ZXIsIGJlZm9yZSkpID4+IDEwOworCisJcmV0dXJuIGluZGV4OwogfQogCiBzdGF0aWMgc3RydWN0IGNwdWlkbGVfZGV2aWNlIHNobW9iaWxlX2NwdWlkbGVfZGV2Owogc3RhdGljIHN0cnVjdCBjcHVpZGxlX2RyaXZlciBzaG1vYmlsZV9jcHVpZGxlX2RyaXZlciA9IHsKIAkubmFtZSA9CQkic2htb2JpbGVfY3B1aWRsZSIsCiAJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnN0YXRlc1swXSA9IHsKKwkJLm5hbWUgPSAiQzEiLAorCQkuZGVzYyA9ICJXRkkiLAorCQkuZXhpdF9sYXRlbmN5ID0gMSwKKwkJLnRhcmdldF9yZXNpZGVuY3kgPSAxICogMiwKKwkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCisJfSwKKwkuc2FmZV9zdGF0ZV9pbmRleCA9IDAsIC8qIEMxICovCisJLnN0YXRlX2NvdW50ID0gMSwKIH07CiAKLXZvaWQgKCpzaG1vYmlsZV9jcHVpZGxlX3NldHVwKShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldik7Cit2b2lkICgqc2htb2JpbGVfY3B1aWRsZV9zZXR1cCkoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYpOwogCiBzdGF0aWMgaW50IHNobW9iaWxlX2NwdWlkbGVfaW5pdCh2b2lkKQogewogCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0gJnNobW9iaWxlX2NwdWlkbGVfZGV2OwotCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiA9ICZzaG1vYmlsZV9jcHVpZGxlX2RyaXZlcjsKIAlpbnQgaTsKIAotCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZzaG1vYmlsZV9jcHVpZGxlX2RyaXZlcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQ1BVSURMRV9TVEFURV9NQVg7IGkrKykgewotCQlkZXYtPnN0YXRlc1tpXS5uYW1lWzBdID0gJ1wwJzsKLQkJZGV2LT5zdGF0ZXNbaV0uZGVzY1swXSA9ICdcMCc7Ci0JCWRldi0+c3RhdGVzW2ldLmVudGVyID0gc2htb2JpbGVfY3B1aWRsZV9lbnRlcjsKLQl9Ci0KLQlpID0gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQ7Ci0KLQlzdGF0ZSA9ICZkZXYtPnN0YXRlc1tpKytdOwotCXNucHJpbnRmKHN0YXRlLT5uYW1lLCBDUFVJRExFX05BTUVfTEVOLCAiQzEiKTsKLQlzdHJuY3B5KHN0YXRlLT5kZXNjLCAiV0ZJIiwgQ1BVSURMRV9ERVNDX0xFTik7Ci0Jc3RhdGUtPmV4aXRfbGF0ZW5jeSA9IDE7Ci0Jc3RhdGUtPnRhcmdldF9yZXNpZGVuY3kgPSAxICogMjsKLQlzdGF0ZS0+cG93ZXJfdXNhZ2UgPSAzOwotCXN0YXRlLT5mbGFncyA9IDA7Ci0Jc3RhdGUtPmZsYWdzIHw9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOwotCi0JZGV2LT5zYWZlX3N0YXRlID0gc3RhdGU7Ci0JZGV2LT5zdGF0ZV9jb3VudCA9IGk7CisJZm9yIChpID0gMDsgaSA8IENQVUlETEVfU1RBVEVfTUFYOyBpKyspCisJCWRydi0+c3RhdGVzW2ldLmVudGVyID0gc2htb2JpbGVfY3B1aWRsZV9lbnRlcjsKIAogCWlmIChzaG1vYmlsZV9jcHVpZGxlX3NldHVwKQotCQlzaG1vYmlsZV9jcHVpZGxlX3NldHVwKGRldik7CisJCXNobW9iaWxlX2NwdWlkbGVfc2V0dXAoZHJ2KTsKIAorCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKGRydik7CisKKwlkZXYtPnN0YXRlX2NvdW50ID0gZHJ2LT5zdGF0ZV9jb3VudDsKIAljcHVpZGxlX3JlZ2lzdGVyX2RldmljZShkZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2VudHJ5LWludGMuUyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvZW50cnktaW50Yy5TCmluZGV4IGNhYzBhN2EuLjFhMWMwMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvZW50cnktaW50Yy5TCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvZW50cnktaW50Yy5TCkBAIC01MSw3ICs1MSw0IEBACiAJLm1hY3JvICB0ZXN0X2Zvcl9pcGksIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKIAkuZW5kbQogCi0JLm1hY3JvICB0ZXN0X2Zvcl9sdGlycSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotCS5lbmRtCi0KIAlhcmNoX2lycV9oYW5kbGVyIHNobW9iaWxlX2hhbmRsZV9pcnFfaW50YwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9jb21tb24uaAppbmRleCBjMGNkYmY5Li44MzRiZDZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9jb21tb24uaApAQCAtOSw5ICs5LDkgQEAKIGV4dGVybiB2b2lkIHNobW9iaWxlX2hhbmRsZV9pcnFfaW50YyhzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiB2b2lkIHNobW9iaWxlX2hhbmRsZV9pcnFfZ2ljKHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBzaG1vYmlsZV9zdXNwZW5kX29wczsKLXN0cnVjdCBjcHVpZGxlX2RldmljZTsKK3N0cnVjdCBjcHVpZGxlX2RyaXZlcjsKIGV4dGVybiB2b2lkICgqc2htb2JpbGVfY3B1aWRsZV9tb2Rlc1tdKSh2b2lkKTsKLWV4dGVybiB2b2lkICgqc2htb2JpbGVfY3B1aWRsZV9zZXR1cCkoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgKCpzaG1vYmlsZV9jcHVpZGxlX3NldHVwKShzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydik7CiAKIGV4dGVybiB2b2lkIHNoNzM2N19pbml0X2lycSh2b2lkKTsKIGV4dGVybiB2b2lkIHNoNzM2N19hZGRfZWFybHlfZGV2aWNlcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IGQ3OTFmMTAuLjhkNGE0MTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMjcsOCArMjcsNSBAQAogCS5tYWNybyAgdGVzdF9mb3JfaXBpLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCiAJLmVuZG0KIAotCS5tYWNybyAgdGVzdF9mb3JfbHRpcnEsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQkuZW5kbQotCiAJLm1hY3JvICBhcmNoX3JldF90b191c2VyLCB0bXAxLCB0bXAyCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAyYjFiYjllLi43YmYwODkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xOCwzMSArMTgsMTUgQEAKIAogI2lmZGVmIENPTkZJR19HUElPTElCCiAKLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIF9fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCi17Ci0JX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fY2Fuc2xlZXAodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gX19ncGlvX2NhbnNsZWVwKGdwaW8pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBfX2dwaW9fdG9faXJxKGdwaW8pOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBpcnFfdG9fZ3Bpbyh1bnNpZ25lZCBpbnQgaXJxKQogewogCXJldHVybiAtRU5PU1lTOwogfQogCisjZWxzZQorCisjZGVmaW5lIF9fQVJNX0dQSU9MSUJfQ09NUExFWAorCiAjZW5kaWYgLyogQ09ORklHX0dQSU9MSUIgKi8KIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9pbnRjLmggYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9pbnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyMjI1OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2ludGMuaApAQCAtMCwwICsxLDI0NiBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0lOVENfSAorI2RlZmluZSBfX0FTTV9NQUNIX0lOVENfSAorI2luY2x1ZGUgPGxpbnV4L3NoX2ludGMuaD4KKworI2RlZmluZSBJTlRDX0lSUV9QSU5TX0VOVU1fMTZMKHApCQkJCVwKKwlwICMjIF9JUlEwLCBwICMjIF9JUlExLCBwICMjIF9JUlEyLCBwICMjIF9JUlEzLAkJXAorCXAgIyMgX0lSUTQsIHAgIyMgX0lSUTUsIHAgIyMgX0lSUTYsIHAgIyMgX0lSUTcsCQlcCisJcCAjIyBfSVJROCwgcCAjIyBfSVJROSwgcCAjIyBfSVJRMTAsIHAgIyMgX0lSUTExLAlcCisJcCAjIyBfSVJRMTIsIHAgIyMgX0lSUTEzLCBwICMjIF9JUlExNCwgcCAjIyBfSVJRMTUKKworI2RlZmluZSBJTlRDX0lSUV9QSU5TX0VOVU1fMTZIKHApCQkJCVwKKwlwICMjIF9JUlExNiwgcCAjIyBfSVJRMTcsIHAgIyMgX0lSUTE4LCBwICMjIF9JUlExOSwJXAorCXAgIyMgX0lSUTIwLCBwICMjIF9JUlEyMSwgcCAjIyBfSVJRMjIsIHAgIyMgX0lSUTIzLAlcCisJcCAjIyBfSVJRMjQsIHAgIyMgX0lSUTI1LCBwICMjIF9JUlEyNiwgcCAjIyBfSVJRMjcsCVwKKwlwICMjIF9JUlEyOCwgcCAjIyBfSVJRMjksIHAgIyMgX0lSUTMwLCBwICMjIF9JUlEzMQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfVkVDVF8xNkwocCwgdmVjdCkJCQkJXAorCXZlY3QocCAjIyBfSVJRMCwgMHgwMjAwKSwgdmVjdChwICMjIF9JUlExLCAweDAyMjApLAlcCisJdmVjdChwICMjIF9JUlEyLCAweDAyNDApLCB2ZWN0KHAgIyMgX0lSUTMsIDB4MDI2MCksCVwKKwl2ZWN0KHAgIyMgX0lSUTQsIDB4MDI4MCksIHZlY3QocCAjIyBfSVJRNSwgMHgwMmEwKSwJXAorCXZlY3QocCAjIyBfSVJRNiwgMHgwMmMwKSwgdmVjdChwICMjIF9JUlE3LCAweDAyZTApLAlcCisJdmVjdChwICMjIF9JUlE4LCAweDAzMDApLCB2ZWN0KHAgIyMgX0lSUTksIDB4MDMyMCksCVwKKwl2ZWN0KHAgIyMgX0lSUTEwLCAweDAzNDApLCB2ZWN0KHAgIyMgX0lSUTExLCAweDAzNjApLAlcCisJdmVjdChwICMjIF9JUlExMiwgMHgwMzgwKSwgdmVjdChwICMjIF9JUlExMywgMHgwM2EwKSwJXAorCXZlY3QocCAjIyBfSVJRMTQsIDB4MDNjMCksIHZlY3QocCAjIyBfSVJRMTUsIDB4MDNlMCkKKworI2RlZmluZSBJTlRDX0lSUV9QSU5TX1ZFQ1RfMTZIKHAsIHZlY3QpCQkJCVwKKwl2ZWN0KHAgIyMgX0lSUTE2LCAweDMyMDApLCB2ZWN0KHAgIyMgX0lSUTE3LCAweDMyMjApLAlcCisJdmVjdChwICMjIF9JUlExOCwgMHgzMjQwKSwgdmVjdChwICMjIF9JUlExOSwgMHgzMjYwKSwJXAorCXZlY3QocCAjIyBfSVJRMjAsIDB4MzI4MCksIHZlY3QocCAjIyBfSVJRMjEsIDB4MzJhMCksCVwKKwl2ZWN0KHAgIyMgX0lSUTIyLCAweDMyYzApLCB2ZWN0KHAgIyMgX0lSUTIzLCAweDMyZTApLAlcCisJdmVjdChwICMjIF9JUlEyNCwgMHgzMzAwKSwgdmVjdChwICMjIF9JUlEyNSwgMHgzMzIwKSwJXAorCXZlY3QocCAjIyBfSVJRMjYsIDB4MzM0MCksIHZlY3QocCAjIyBfSVJRMjcsIDB4MzM2MCksCVwKKwl2ZWN0KHAgIyMgX0lSUTI4LCAweDMzODApLCB2ZWN0KHAgIyMgX0lSUTI5LCAweDMzYTApLAlcCisJdmVjdChwICMjIF9JUlEzMCwgMHgzM2MwKSwgdmVjdChwICMjIF9JUlEzMSwgMHgzM2UwKQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfTUFTS18xNkwocCwgYmFzZSkJCQkJCVwKKwl7IGJhc2UgKyAweDQwLCBiYXNlICsgMHg2MCwgOCwgLyogSU5UTVNLMDBBIC8gSU5UTVNLQ0xSMDBBICovCVwKKwkgIHsgcCAjIyBfSVJRMCwgcCAjIyBfSVJRMSwgcCAjIyBfSVJRMiwgcCAjIyBfSVJRMywJCVwKKwkgICAgcCAjIyBfSVJRNCwgcCAjIyBfSVJRNSwgcCAjIyBfSVJRNiwgcCAjIyBfSVJRNyB9IH0sCQlcCisJeyBiYXNlICsgMHg0NCwgYmFzZSArIDB4NjQsIDgsIC8qIElOVE1TSzEwQSAvIElOVE1TS0NMUjEwQSAqLwlcCisJICB7IHAgIyMgX0lSUTgsIHAgIyMgX0lSUTksIHAgIyMgX0lSUTEwLCBwICMjIF9JUlExMSwJCVwKKwkgICAgcCAjIyBfSVJRMTIsIHAgIyMgX0lSUTEzLCBwICMjIF9JUlExNCwgcCAjIyBfSVJRMTUgfSB9CisKKyNkZWZpbmUgSU5UQ19JUlFfUElOU19NQVNLXzE2SChwLCBiYXNlKQkJCQkJXAorCXsgYmFzZSArIDB4NDgsIGJhc2UgKyAweDY4LCA4LCAvKiBJTlRNU0syMEEgLyBJTlRNU0tDTFIyMEEgKi8JXAorCSAgeyBwICMjIF9JUlExNiwgcCAjIyBfSVJRMTcsIHAgIyMgX0lSUTE4LCBwICMjIF9JUlExOSwJCVwKKwkgICAgcCAjIyBfSVJRMjAsIHAgIyMgX0lSUTIxLCBwICMjIF9JUlEyMiwgcCAjIyBfSVJRMjMgfSB9LAlcCisJeyBiYXNlICsgMHg0YywgYmFzZSArIDB4NmMsIDgsIC8qIElOVE1TSzMwQSAvIElOVE1TS0NMUjMwQSAqLwlcCisJICB7IHAgIyMgX0lSUTI0LCBwICMjIF9JUlEyNSwgcCAjIyBfSVJRMjYsIHAgIyMgX0lSUTI3LAkJXAorCSAgICBwICMjIF9JUlEyOCwgcCAjIyBfSVJRMjksIHAgIyMgX0lSUTMwLCBwICMjIF9JUlEzMSB9IH0KKworI2RlZmluZSBJTlRDX0lSUV9QSU5TX1BSSU9fMTZMKHAsIGJhc2UpCQkJCQlcCisJeyBiYXNlICsgMHgxMCwgMCwgMzIsIDQsIC8qIElOVFBSSTAwQSAqLwkJCVwKKwkgIHsgcCAjIyBfSVJRMCwgcCAjIyBfSVJRMSwgcCAjIyBfSVJRMiwgcCAjIyBfSVJRMywJCVwKKwkgICAgcCAjIyBfSVJRNCwgcCAjIyBfSVJRNSwgcCAjIyBfSVJRNiwgcCAjIyBfSVJRNyB9IH0sCQlcCisJeyBiYXNlICsgMHgxNCwgMCwgMzIsIDQsIC8qIElOVFBSSTEwQSAqLwkJCVwKKwkgIHsgcCAjIyBfSVJROCwgcCAjIyBfSVJROSwgcCAjIyBfSVJRMTAsIHAgIyMgX0lSUTExLAkJXAorCSAgICBwICMjIF9JUlExMiwgcCAjIyBfSVJRMTMsIHAgIyMgX0lSUTE0LCBwICMjIF9JUlExNSB9IH0KKworI2RlZmluZSBJTlRDX0lSUV9QSU5TX1BSSU9fMTZIKHAsIGJhc2UpCQkJCQlcCisJeyBiYXNlICsgMHgxOCwgMCwgMzIsIDQsIC8qIElOVFBSSTIwQSAqLwkJCVwKKwkgIHsgcCAjIyBfSVJRMTYsIHAgIyMgX0lSUTE3LCBwICMjIF9JUlExOCwgcCAjIyBfSVJRMTksCQlcCisJICAgIHAgIyMgX0lSUTIwLCBwICMjIF9JUlEyMSwgcCAjIyBfSVJRMjIsIHAgIyMgX0lSUTIzIH0gfSwJXAorCXsgYmFzZSArIDB4MWMsIDAsIDMyLCA0LCAvKiBJTlRQUkkzMEEgKi8JCQlcCisJICB7IHAgIyMgX0lSUTI0LCBwICMjIF9JUlEyNSwgcCAjIyBfSVJRMjYsIHAgIyMgX0lSUTI3LAkJXAorCSAgICBwICMjIF9JUlEyOCwgcCAjIyBfSVJRMjksIHAgIyMgX0lSUTMwLCBwICMjIF9JUlEzMSB9IH0KKworI2RlZmluZSBJTlRDX0lSUV9QSU5TX1NFTlNFXzE2TChwLCBiYXNlKQkJCQlcCisJeyBiYXNlICsgMHgwMCwgMzIsIDQsIC8qIElDUjFBICovCQkJCVwKKwkgIHsgcCAjIyBfSVJRMCwgcCAjIyBfSVJRMSwgcCAjIyBfSVJRMiwgcCAjIyBfSVJRMywJCVwKKwkgICAgcCAjIyBfSVJRNCwgcCAjIyBfSVJRNSwgcCAjIyBfSVJRNiwgcCAjIyBfSVJRNyB9IH0sCQlcCisJeyBiYXNlICsgMHgwNCwgMzIsIDQsIC8qIElDUjJBICovCQkJCVwKKwkgIHsgcCAjIyBfSVJROCwgcCAjIyBfSVJROSwgcCAjIyBfSVJRMTAsIHAgIyMgX0lSUTExLAkJXAorCSAgICBwICMjIF9JUlExMiwgcCAjIyBfSVJRMTMsIHAgIyMgX0lSUTE0LCBwICMjIF9JUlExNSB9IH0KKworI2RlZmluZSBJTlRDX0lSUV9QSU5TX1NFTlNFXzE2SChwLCBiYXNlKQkJCQlcCisJeyBiYXNlICsgMHgwOCwgMzIsIDQsIC8qIElDUjNBICovCQkJCVwKKwkgIHsgcCAjIyBfSVJRMTYsIHAgIyMgX0lSUTE3LCBwICMjIF9JUlExOCwgcCAjIyBfSVJRMTksCQlcCisJICAgIHAgIyMgX0lSUTIwLCBwICMjIF9JUlEyMSwgcCAjIyBfSVJRMjIsIHAgIyMgX0lSUTIzIH0gfSwJXAorCXsgYmFzZSArIDB4MGMsIDMyLCA0LCAvKiBJQ1I0QSAqLwkJCQlcCisJICB7IHAgIyMgX0lSUTI0LCBwICMjIF9JUlEyNSwgcCAjIyBfSVJRMjYsIHAgIyMgX0lSUTI3LAkJXAorCSAgICBwICMjIF9JUlEyOCwgcCAjIyBfSVJRMjksIHAgIyMgX0lSUTMwLCBwICMjIF9JUlEzMSB9IH0KKworI2RlZmluZSBJTlRDX0lSUV9QSU5TX0FDS18xNkwocCwgYmFzZSkJCQkJCVwKKwl7IGJhc2UgKyAweDIwLCAwLCA4LCAvKiBJTlRSRVEwMEEgKi8JCQkJXAorCSAgeyBwICMjIF9JUlEwLCBwICMjIF9JUlExLCBwICMjIF9JUlEyLCBwICMjIF9JUlEzLAkJXAorCSAgICBwICMjIF9JUlE0LCBwICMjIF9JUlE1LCBwICMjIF9JUlE2LCBwICMjIF9JUlE3IH0gfSwJCVwKKwl7IGJhc2UgKyAweDI0LCAwLCA4LCAvKiBJTlRSRVExMEEgKi8JCQkJXAorCSAgeyBwICMjIF9JUlE4LCBwICMjIF9JUlE5LCBwICMjIF9JUlExMCwgcCAjIyBfSVJRMTEsCQlcCisJICAgIHAgIyMgX0lSUTEyLCBwICMjIF9JUlExMywgcCAjIyBfSVJRMTQsIHAgIyMgX0lSUTE1IH0gfQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfQUNLXzE2SChwLCBiYXNlKQkJCQkJXAorCXsgYmFzZSArIDB4MjgsIDAsIDgsIC8qIElOVFJFUTIwQSAqLwkJCQlcCisJICB7IHAgIyMgX0lSUTE2LCBwICMjIF9JUlExNywgcCAjIyBfSVJRMTgsIHAgIyMgX0lSUTE5LAkJXAorCSAgICBwICMjIF9JUlEyMCwgcCAjIyBfSVJRMjEsIHAgIyMgX0lSUTIyLCBwICMjIF9JUlEyMyB9IH0sCVwKKwl7IGJhc2UgKyAweDJjLCAwLCA4LCAvKiBJTlRSRVEzMEEgKi8JCQkJXAorCSAgeyBwICMjIF9JUlEyNCwgcCAjIyBfSVJRMjUsIHAgIyMgX0lSUTI2LCBwICMjIF9JUlEyNywJCVwKKwkgICAgcCAjIyBfSVJRMjgsIHAgIyMgX0lSUTI5LCBwICMjIF9JUlEzMCwgcCAjIyBfSVJRMzEgfSB9CisKKyNkZWZpbmUgSU5UQ19JUlFfUElOU18xNihwLCBiYXNlLCB2ZWN0LCBzdHIpCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcCAjIyBfcmVzb3VyY2VzW10gX19pbml0ZGF0YSA9IHsJCQlcCisJWzBdID0gewkJCQkJCQkJXAorCQkuc3RhcnQJPSBiYXNlLAkJCQkJCVwKKwkJLmVuZAk9IGJhc2UgKyAweDY0LAkJCQkJXAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJCQkJXAorCX0sCQkJCQkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK2VudW0gewkJCQkJCQkJCVwKKwlwICMjIF9VTlVTRUQgPSAwLAkJCQkJCVwKKwlJTlRDX0lSUV9QSU5TX0VOVU1fMTZMKHApLAkJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfdmVjdCBwICMjIF92ZWN0b3JzW10gX19pbml0ZGF0YSA9IHsJCQlcCisJSU5UQ19JUlFfUElOU19WRUNUXzE2TChwLCB2ZWN0KSwJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfbWFza19yZWcgcCAjIyBfbWFza19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewlcCisJSU5UQ19JUlFfUElOU19NQVNLXzE2TChwLCBiYXNlKSwJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfcHJpb19yZWcgcCAjIyBfcHJpb19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewlcCisJSU5UQ19JUlFfUElOU19QUklPXzE2TChwLCBiYXNlKSwJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfc2Vuc2VfcmVnIHAgIyMgX3NlbnNlX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CVwKKwlJTlRDX0lSUV9QSU5TX1NFTlNFXzE2TChwLCBiYXNlKSwJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfbWFza19yZWcgcCAjIyBfYWNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CVwKKwlJTlRDX0lSUV9QSU5TX0FDS18xNkwocCwgYmFzZSksCQkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19kZXNjIHAgIyMgX2Rlc2MgX19pbml0ZGF0YSA9IHsJCQlcCisJLm5hbWUgPSBzdHIsCQkJCQkJCVwKKwkucmVzb3VyY2UgPSBwICMjIF9yZXNvdXJjZXMsCQkJCQlcCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHAgIyMgX3Jlc291cmNlcyksCQkJXAorCS5odyA9IElOVENfSFdfREVTQyhwICMjIF92ZWN0b3JzLCBOVUxMLAkJCQlcCisJCQkgICAgIHAgIyMgX21hc2tfcmVnaXN0ZXJzLCBwICMjIF9wcmlvX3JlZ2lzdGVycywgXAorCQkJICAgICBwICMjIF9zZW5zZV9yZWdpc3RlcnMsIHAgIyMgX2Fja19yZWdpc3RlcnMpIFwKK30KKworI2RlZmluZSBJTlRDX0lSUV9QSU5TXzMyKHAsIGJhc2UsIHZlY3QsIHN0cikJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwICMjIF9yZXNvdXJjZXNbXSBfX2luaXRkYXRhID0gewkJCVwKKwlbMF0gPSB7CQkJCQkJCQlcCisJCS5zdGFydAk9IGJhc2UsCQkJCQkJXAorCQkuZW5kCT0gYmFzZSArIDB4NmMsCQkJCQlcCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAkJCQlcCisJfSwJCQkJCQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorZW51bSB7CQkJCQkJCQkJXAorCXAgIyMgX1VOVVNFRCA9IDAsCQkJCQkJXAorCUlOVENfSVJRX1BJTlNfRU5VTV8xNkwocCksCQkJCQlcCisJSU5UQ19JUlFfUElOU19FTlVNXzE2SChwKSwJCQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBpbnRjX3ZlY3QgcCAjIyBfdmVjdG9yc1tdIF9faW5pdGRhdGEgPSB7CQkJXAorCUlOVENfSVJRX1BJTlNfVkVDVF8xNkwocCwgdmVjdCksCQkJCVwKKwlJTlRDX0lSUV9QSU5TX1ZFQ1RfMTZIKHAsIHZlY3QpLAkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBwICMjIF9tYXNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CVwKKwlJTlRDX0lSUV9QSU5TX01BU0tfMTZMKHAsIGJhc2UpLAkJCQlcCisJSU5UQ19JUlFfUElOU19NQVNLXzE2SChwLCBiYXNlKSwJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfcHJpb19yZWcgcCAjIyBfcHJpb19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewlcCisJSU5UQ19JUlFfUElOU19QUklPXzE2TChwLCBiYXNlKSwJCQkJXAorCUlOVENfSVJRX1BJTlNfUFJJT18xNkgocCwgYmFzZSksCQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBpbnRjX3NlbnNlX3JlZyBwICMjIF9zZW5zZV9yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewlcCisJSU5UQ19JUlFfUElOU19TRU5TRV8xNkwocCwgYmFzZSksCQkJCVwKKwlJTlRDX0lSUV9QSU5TX1NFTlNFXzE2SChwLCBiYXNlKSwJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfbWFza19yZWcgcCAjIyBfYWNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CVwKKwlJTlRDX0lSUV9QSU5TX0FDS18xNkwocCwgYmFzZSksCQkJCQlcCisJSU5UQ19JUlFfUElOU19BQ0tfMTZIKHAsIGJhc2UpLAkJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfZGVzYyBwICMjIF9kZXNjIF9faW5pdGRhdGEgPSB7CQkJXAorCS5uYW1lID0gc3RyLAkJCQkJCQlcCisJLnJlc291cmNlID0gcCAjIyBfcmVzb3VyY2VzLAkJCQkJXAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShwICMjIF9yZXNvdXJjZXMpLAkJCVwKKwkuaHcgPSBJTlRDX0hXX0RFU0MocCAjIyBfdmVjdG9ycywgTlVMTCwJCQkJXAorCQkJICAgICBwICMjIF9tYXNrX3JlZ2lzdGVycywgcCAjIyBfcHJpb19yZWdpc3RlcnMsIFwKKwkJCSAgICAgcCAjIyBfc2Vuc2VfcmVnaXN0ZXJzLCBwICMjIF9hY2tfcmVnaXN0ZXJzKSBcCit9CisKKyNkZWZpbmUgSU5UQ19QSU5UX0VfRU1QVFkKKyNkZWZpbmUgSU5UQ19QSU5UX0VfTk9ORSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorI2RlZmluZSBJTlRDX1BJTlRfRShwKQkJCQkJCQlcCisJUElOVCAjIyBwICMjIDAsIFBJTlQgIyMgcCAjIyAxLCBQSU5UICMjIHAgIyMgMiwgUElOVCAjIyBwICMjIDMsCVwKKwlQSU5UICMjIHAgIyMgNCwgUElOVCAjIyBwICMjIDUsIFBJTlQgIyMgcCAjIyA2LCBQSU5UICMjIHAgIyMgNywKKworI2RlZmluZSBJTlRDX1BJTlRfVl9OT05FCisjZGVmaW5lIElOVENfUElOVF9WKHAsIHZlY3QpCQkJCQlcCisJdmVjdChQSU5UICMjIHAgIyMgMCwgMCksIHZlY3QoUElOVCAjIyBwICMjIDEsIDEpLAlcCisJdmVjdChQSU5UICMjIHAgIyMgMiwgMiksIHZlY3QoUElOVCAjIyBwICMjIDMsIDMpLAlcCisJdmVjdChQSU5UICMjIHAgIyMgNCwgNCksIHZlY3QoUElOVCAjIyBwICMjIDUsIDUpLAlcCisJdmVjdChQSU5UICMjIHAgIyMgNiwgNiksIHZlY3QoUElOVCAjIyBwICMjIDcsIDcpLAorCisjZGVmaW5lIElOVENfUElOVChwLCBtYXNrX3JlZywgc2Vuc2VfYmFzZSwgc3RyLAkJCQlcCisJZW51bXNfMSwgZW51bXNfMiwgZW51bXNfMywgZW51bXNfNCwJCQkJXAorCXZlY3RfMSwgdmVjdF8yLCB2ZWN0XzMsIHZlY3RfNCwJCQkJCVwKKwltYXNrX2EsIG1hc2tfYiwgbWFza19jLCBtYXNrX2QsCQkJCQlcCisJc2Vuc2VfYSwgc2Vuc2VfYiwgc2Vuc2VfYywgc2Vuc2VfZCkJCQkJXAorCQkJCQkJCQkJXAorZW51bSB7CQkJCQkJCQkJXAorCVBJTlQgIyMgcCAjIyBfVU5VU0VEID0gMCwJCQkJCVwKKwllbnVtc18xIGVudW1zXzIgZW51bXNfMyBlbnVtc180IAkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHAgIyMgX3ZlY3RvcnNbXSBfX2luaXRkYXRhID0gewkJCVwKKwl2ZWN0XzEgdmVjdF8yIHZlY3RfMyB2ZWN0XzQJCQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIHAgIyMgX21hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsJXAorCXsgbWFza19yZWcsIDAsIDMyLCAvKiBQSU5URVIgKi8JCQkJCVwKKwkgIHsgbWFza19hIG1hc2tfYiBtYXNrX2MgbWFza19kIH0gfQkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19zZW5zZV9yZWcgcCAjIyBfc2Vuc2VfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsJXAorCXsgc2Vuc2VfYmFzZSArIDB4MDAsIDE2LCAyLCAvKiBQSU5UQ1IgKi8JCQlcCisJICB7IHNlbnNlX2EgfSB9LAkJCQkJCVwKKwl7IHNlbnNlX2Jhc2UgKyAweDA0LCAxNiwgMiwgLyogUElOVENSICovCQkJXAorCSAgeyBzZW5zZV9iIH0gfSwJCQkJCQlcCisJeyBzZW5zZV9iYXNlICsgMHgwOCwgMTYsIDIsIC8qIFBJTlRDUiAqLwkJCVwKKwkgIHsgc2Vuc2VfYyB9IH0sCQkJCQkJXAorCXsgc2Vuc2VfYmFzZSArIDB4MGMsIDE2LCAyLCAvKiBQSU5UQ1IgKi8JCQlcCisJICB7IHNlbnNlX2QgfSB9LAkJCQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBpbnRjX2Rlc2MgcCAjIyBfZGVzYyBfX2luaXRkYXRhID0gewkJCVwKKwkubmFtZSA9IHN0ciwJCQkJCQkJXAorCS5odyA9IElOVENfSFdfREVTQyhwICMjIF92ZWN0b3JzLCBOVUxMLAkJCQlcCisJCQkgICAgIHAgIyMgX21hc2tfcmVnaXN0ZXJzLCBOVUxMLAkJXAorCQkJICAgICBwICMjIF9zZW5zZV9yZWdpc3RlcnMsIE5VTEwpLAkJXAorfQorCisjZW5kaWYgIC8qIF9fQVNNX01BQ0hfSU5UQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGFkMDBjM2MuLjBmZmJlODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC00LDcgKzQsNCBAQAogI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKENPTkZJR19NRU1PUllfU1RBUlQpCiAjZGVmaW5lIE1FTV9TSVpFCVVMKENPTkZJR19NRU1PUllfU0laRSkKIAotLyogRE1BIG1lbW9yeSBhdCAweGY2MDAwMDAwIC0gMHhmZmRmZmZmZiAqLwotI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFICgxNTggPDwgMjApCi0KICNlbmRpZiAvKiBfX0FTTV9NQUNIX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9zaDczYTAuaCBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL3NoNzNhMC5oCmluZGV4IDIxNmMzZDYuLjg4MWQ1MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL3NoNzNhMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL3NoNzNhMC5oCkBAIC00NTEsMTggKzQ1MSwzOSBAQAogCUdQSU9fRk5fS0VZSU41X1BVLAogCUdQSU9fRk5fS0VZSU42X1BVLAogCUdQSU9fRk5fS0VZSU43X1BVLAorCUdQSU9fRk5fU0RISUNEMF9QVSwKKwlHUElPX0ZOX1NESElEMF8wX1BVLAorCUdQSU9fRk5fU0RISUQwXzFfUFUsCisJR1BJT19GTl9TREhJRDBfMl9QVSwKKwlHUElPX0ZOX1NESElEMF8zX1BVLAorCUdQSU9fRk5fU0RISUNNRDBfUFUsCisJR1BJT19GTl9TREhJV1AwX1BVLAogCUdQSU9fRk5fU0RISUQxXzBfUFUsCiAJR1BJT19GTl9TREhJRDFfMV9QVSwKIAlHUElPX0ZOX1NESElEMV8yX1BVLAogCUdQSU9fRk5fU0RISUQxXzNfUFUsCiAJR1BJT19GTl9TREhJQ01EMV9QVSwKKwlHUElPX0ZOX1NESElEMl8wX1BVLAorCUdQSU9fRk5fU0RISUQyXzFfUFUsCisJR1BJT19GTl9TREhJRDJfMl9QVSwKKwlHUElPX0ZOX1NESElEMl8zX1BVLAorCUdQSU9fRk5fU0RISUNNRDJfUFUsCiAJR1BJT19GTl9NTUNDTUQwX1BVLAogCUdQSU9fRk5fTU1DQ01EMV9QVSwKKwlHUElPX0ZOX01NQ0QwXzBfUFUsCisJR1BJT19GTl9NTUNEMF8xX1BVLAorCUdQSU9fRk5fTU1DRDBfMl9QVSwKKwlHUElPX0ZOX01NQ0QwXzNfUFUsCisJR1BJT19GTl9NTUNEMF80X1BVLAorCUdQSU9fRk5fTU1DRDBfNV9QVSwKKwlHUElPX0ZOX01NQ0QwXzZfUFUsCisJR1BJT19GTl9NTUNEMF83X1BVLAogCUdQSU9fRk5fRlNJQUNLX1BVLAogCUdQSU9fRk5fRlNJQUlMUl9QVSwKIAlHUElPX0ZOX0ZTSUFJQlRfUFUsCiAJR1BJT19GTl9GU0lBSVNMRF9QVSwKIH07CisKIC8qIERNQSBzbGF2ZSBJRHMgKi8KIGVudW0gewogCVNIRE1BX1NMQVZFX0lOVkFMSUQsCkBAIC00OTQsNCArNTE1LDggQEAKIAlTSERNQV9TTEFWRV9NTUNJRl9SWCwKIH07CiAKKy8qIFBJTlQgaW50ZXJydXB0cyBhcmUgbG9jYXRlZCBhdCBMaW51eCBJUlEgNzY4IGFuZCB1cCAqLworI2RlZmluZSBTSDczQTBfUElOVDBfSVJRKGlycSkgKChpcnEpICsgNzY4KQorI2RlZmluZSBTSDczQTBfUElOVDFfSVJRKGlycSkgKChpcnEpICsgODAwKQorCiAjZW5kaWYgLyogX19BU01fU0g3M0EwX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM2Ny5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM2Ny5jCmluZGV4IGNjNDQyZDEuLmNmZGU5YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNjcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3MzY3LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2ludGMuaD4KKyNpbmNsdWRlIDxtYWNoL2ludGMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIApAQCAtMzEsOCArMzIsNiBAQAogCURJU0FCTEVELAogCiAJLyogaW50ZXJydXB0IHNvdXJjZXMgSU5UQ0EgKi8KLQlJUlEwQSwgSVJRMUEsIElSUTJBLCBJUlEzQSwgSVJRNEEsIElSUTVBLCBJUlE2QSwgSVJRN0EsCi0JSVJROEEsIElSUTlBLCBJUlExMEEsIElSUTExQSwgSVJRMTJBLCBJUlExM0EsIElSUTE0QSwgSVJRMTVBLAogCURJUkMsCiAJQ1JZUFQxX0VSUiwgQ1JZUFQyX1NURCwKIAlJSUMxX0FMSTEsIElJQzFfVEFDS0kxLCBJSUMxX1dBSVRJMSwgSUlDMV9EVEVJMSwKQEAgLTc2LDE0ICs3NSw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGludGNfdmVjdCBpbnRjYV92ZWN0b3JzW10gX19pbml0ZGF0YSA9IHsKLQlJTlRDX1ZFQ1QoSVJRMEEsIDB4MDIwMCksIElOVENfVkVDVChJUlExQSwgMHgwMjIwKSwKLQlJTlRDX1ZFQ1QoSVJRMkEsIDB4MDI0MCksIElOVENfVkVDVChJUlEzQSwgMHgwMjYwKSwKLQlJTlRDX1ZFQ1QoSVJRNEEsIDB4MDI4MCksIElOVENfVkVDVChJUlE1QSwgMHgwMmEwKSwKLQlJTlRDX1ZFQ1QoSVJRNkEsIDB4MDJjMCksIElOVENfVkVDVChJUlE3QSwgMHgwMmUwKSwKLQlJTlRDX1ZFQ1QoSVJROEEsIDB4MDMwMCksIElOVENfVkVDVChJUlE5QSwgMHgwMzIwKSwKLQlJTlRDX1ZFQ1QoSVJRMTBBLCAweDAzNDApLCBJTlRDX1ZFQ1QoSVJRMTFBLCAweDAzNjApLAotCUlOVENfVkVDVChJUlExMkEsIDB4MDM4MCksIElOVENfVkVDVChJUlExM0EsIDB4MDNhMCksCi0JSU5UQ19WRUNUKElSUTE0QSwgMHgwM2MwKSwgSU5UQ19WRUNUKElSUTE1QSwgMHgwM2UwKSwKIAlJTlRDX1ZFQ1QoRElSQywgMHgwNTYwKSwKIAlJTlRDX1ZFQ1QoQ1JZUFQxX0VSUiwgMHgwNWUwKSwKIAlJTlRDX1ZFQ1QoQ1JZUFQyX1NURCwgMHgwNzAwKSwKQEAgLTE2MywxMCArMTU0LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBpbnRjYV9tYXNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGU2OTAwMDQwLCAweGU2OTAwMDYwLCA4LCAvKiBJTlRNU0swMEEgLyBJTlRNU0tDTFIwMEEgKi8KLQkgIHsgSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBIH0gfSwKLQl7IDB4ZTY5MDAwNDQsIDB4ZTY5MDAwNjQsIDgsIC8qIElOVE1TSzEwQSAvIElOVE1TS0NMUjEwQSAqLwotCSAgeyBJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEgfSB9LAogCXsgMHhlNjk0MDA4MCwgMHhlNjk0MDBjMCwgOCwgLyogSU1SMEEgLyBJTUNSMEEgKi8KIAkgIHsgRE1BQzJfMV9ERUkzLCBETUFDMl8xX0RFSTIsIERNQUMyXzFfREVJMSwgRE1BQzJfMV9ERUkwLAogCSAgICBBUk0xMV9JUlFQTVUsIDAsIEFSTTExX0NPTU1UWCwgQVJNMTFfQ09NTVJYIH0gfSwKQEAgLTIxMiwxMSArMTk5LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19wcmlvX3JlZyBpbnRjYV9wcmlvX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGU2OTAwMDEwLCAwLCAzMiwgNCwgLyogSU5UUFJJMDBBICovCi0JICB7IElSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSB9IH0sCi0JeyAweGU2OTAwMDE0LCAwLCAzMiwgNCwgLyogSU5UUFJJMTBBICovCi0JICB7IElSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSB9IH0sCi0KIAl7IDB4ZTY5NDAwMDAsIDAsIDE2LCA0LCAvKiBJUFJBQSAqLyB7IERNQUMzXzEsIERNQUMzXzIsIENNVDIsIExDUkMgfSB9LAogCXsgMHhlNjk0MDAwNCwgMCwgMTYsIDQsIC8qIElQUkJBICovIHsgSVJEQSwgRVRNMTEsIEJCSUYxLCBCQklGMiB9IH0sCiAJeyAweGU2OTQwMDA4LCAwLCAxNiwgNCwgLyogSVBSQ0EgKi8geyBDUllQVDFfRVJSLCBDUllQVDJfU1RELApAQCAtMjQwLDI5ICsyMjIsMTggQEAKIAl7IDB4ZTY5NDAwMzgsIDAsIDE2LCA0LCAvKiBJUFJPQSAqLyB7IDAsIDAsIERJUkMsIFNESEkyIH0gfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW50Y19zZW5zZV9yZWcgaW50Y2Ffc2Vuc2VfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKLQl7IDB4ZTY5MDAwMDAsIDE2LCAyLCAvKiBJQ1IxQSAqLwotCSAgeyBJUlEwQSwgSVJRMUEsIElSUTJBLCBJUlEzQSwgSVJRNEEsIElSUTVBLCBJUlE2QSwgSVJRN0EgfSB9LAotCXsgMHhlNjkwMDAwNCwgMTYsIDIsIC8qIElDUjJBICovCi0JICB7IElSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSB9IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGludGNfbWFza19yZWcgaW50Y2FfYWNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGU2OTAwMDIwLCAwLCA4LCAvKiBJTlRSRVEwMEEgKi8KLQkgIHsgSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBIH0gfSwKLQl7IDB4ZTY5MDAwMjQsIDAsIDgsIC8qIElOVFJFUTEwQSAqLwotCSAgeyBJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEgfSB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBpbnRjX2Rlc2MgaW50Y2FfZGVzYyBfX2luaXRkYXRhID0gewogCS5uYW1lID0gInNoNzM2Ny1pbnRjYSIsCiAJLmZvcmNlX2VuYWJsZSA9IEVOQUJMRUQsCiAJLmZvcmNlX2Rpc2FibGUgPSBESVNBQkxFRCwKIAkuaHcgPSBJTlRDX0hXX0RFU0MoaW50Y2FfdmVjdG9ycywgaW50Y2FfZ3JvdXBzLAogCQkJICAgaW50Y2FfbWFza19yZWdpc3RlcnMsIGludGNhX3ByaW9fcmVnaXN0ZXJzLAotCQkJICAgaW50Y2Ffc2Vuc2VfcmVnaXN0ZXJzLCBpbnRjYV9hY2tfcmVnaXN0ZXJzKSwKKwkJCSAgIE5VTEwsIE5VTEwpLAogfTsKIAorSU5UQ19JUlFfUElOU18xNihpbnRjYV9pcnFfcGlucywgMHhlNjkwMDAwMCwKKwkJIElOVENfVkVDVCwgInNoNzM2Ny1pbnRjYS1pcnEtcGlucyIpOworCiBlbnVtIHsKIAlVTlVTRURfSU5UQ1MgPSAwLAogCkBAIC00MzIsNiArNDAzLDcgQEAKIAl2b2lkIF9faW9tZW0gKmludGV2dHNhID0gaW9yZW1hcF9ub2NhY2hlKDB4ZmZkMjAxMDAsIFBBR0VfU0laRSk7CiAKIAlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNhX2Rlc2MpOworCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y2FfaXJxX3BpbnNfZGVzYyk7CiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjc19kZXNjKTsKIAogCS8qIGRlbXV4IHVzaW5nIElOVEVWVFNBICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3MzcyLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3MzcyLmMKaW5kZXggMjljZGMwNS4uMmQ4ODU2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM3Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzIuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfaW50Yy5oPgorI2luY2x1ZGUgPG1hY2gvaW50Yy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCkBAIC0yOSwxMCArMzAsNiBAQAogCVVOVVNFRF9JTlRDQSA9IDAsCiAKIAkvKiBpbnRlcnJ1cHQgc291cmNlcyBJTlRDQSAqLwotCUlSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSwKLQlJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEsCi0JSVJRMTZBLCBJUlExN0EsIElSUTE4QSwgSVJRMTlBLCBJUlEyMEEsIElSUTIxQSwgSVJRMjJBLCBJUlEyM0EsCi0JSVJRMjRBLCBJUlEyNUEsIElSUTI2QSwgSVJRMjdBLCBJUlEyOEEsIElSUTI5QSwgSVJRMzBBLCBJUlEzMUEsCiAJRElSQywKIAlDUllQVF9TVEQsCiAJSUlDMV9BTEkxLCBJSUMxX1RBQ0tJMSwgSUlDMV9XQUlUSTEsIElJQzFfRFRFSTEsCkBAIC04NiwyMiArODMsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRjX3ZlY3QgaW50Y2FfdmVjdG9yc1tdIF9faW5pdGRhdGEgPSB7Ci0JSU5UQ19WRUNUKElSUTBBLCAweDAyMDApLCBJTlRDX1ZFQ1QoSVJRMUEsIDB4MDIyMCksCi0JSU5UQ19WRUNUKElSUTJBLCAweDAyNDApLCBJTlRDX1ZFQ1QoSVJRM0EsIDB4MDI2MCksCi0JSU5UQ19WRUNUKElSUTRBLCAweDAyODApLCBJTlRDX1ZFQ1QoSVJRNUEsIDB4MDJhMCksCi0JSU5UQ19WRUNUKElSUTZBLCAweDAyYzApLCBJTlRDX1ZFQ1QoSVJRN0EsIDB4MDJlMCksCi0JSU5UQ19WRUNUKElSUThBLCAweDAzMDApLCBJTlRDX1ZFQ1QoSVJROUEsIDB4MDMyMCksCi0JSU5UQ19WRUNUKElSUTEwQSwgMHgwMzQwKSwgSU5UQ19WRUNUKElSUTExQSwgMHgwMzYwKSwKLQlJTlRDX1ZFQ1QoSVJRMTJBLCAweDAzODApLCBJTlRDX1ZFQ1QoSVJRMTNBLCAweDAzYTApLAotCUlOVENfVkVDVChJUlExNEEsIDB4MDNjMCksIElOVENfVkVDVChJUlExNUEsIDB4MDNlMCksCi0JSU5UQ19WRUNUKElSUTE2QSwgMHgzMjAwKSwgSU5UQ19WRUNUKElSUTE3QSwgMHgzMjIwKSwKLQlJTlRDX1ZFQ1QoSVJRMThBLCAweDMyNDApLCBJTlRDX1ZFQ1QoSVJRMTlBLCAweDMyNjApLAotCUlOVENfVkVDVChJUlEyMEEsIDB4MzI4MCksIElOVENfVkVDVChJUlEyMUEsIDB4MzJhMCksCi0JSU5UQ19WRUNUKElSUTIyQSwgMHgzMmMwKSwgSU5UQ19WRUNUKElSUTIzQSwgMHgzMmUwKSwKLQlJTlRDX1ZFQ1QoSVJRMjRBLCAweDMzMDApLCBJTlRDX1ZFQ1QoSVJRMjVBLCAweDMzMjApLAotCUlOVENfVkVDVChJUlEyNkEsIDB4MzM0MCksIElOVENfVkVDVChJUlEyN0EsIDB4MzM2MCksCi0JSU5UQ19WRUNUKElSUTI4QSwgMHgzMzgwKSwgSU5UQ19WRUNUKElSUTI5QSwgMHgzM2EwKSwKLQlJTlRDX1ZFQ1QoSVJRMzBBLCAweDMzYzApLCBJTlRDX1ZFQ1QoSVJRMzFBLCAweDMzZTApLAogCUlOVENfVkVDVChESVJDLCAweDA1NjApLAogCUlOVENfVkVDVChDUllQVF9TVEQsIDB4MDcwMCksCiAJSU5UQ19WRUNUKElJQzFfQUxJMSwgMHgwNzgwKSwgSU5UQ19WRUNUKElJQzFfVEFDS0kxLCAweDA3YTApLApAQCAtMjAzLDE1ICsxODQsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIGludGNhX21hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKLQl7IDB4ZTY5MDAwNDAsIDB4ZTY5MDAwNjAsIDgsIC8qIElOVE1TSzAwQSAvIElOVE1TS0NMUjAwQSAqLwotCSAgeyBJUlEwQSwgSVJRMUEsIElSUTJBLCBJUlEzQSwgSVJRNEEsIElSUTVBLCBJUlE2QSwgSVJRN0EgfSB9LAotCXsgMHhlNjkwMDA0NCwgMHhlNjkwMDA2NCwgOCwgLyogSU5UTVNLMTBBIC8gSU5UTVNLQ0xSMTBBICovCi0JICB7IElSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSB9IH0sCi0JeyAweGU2OTAwMDQ4LCAweGU2OTAwMDY4LCA4LCAvKiBJTlRNU0syMEEgLyBJTlRNU0tDTFIyMEEgKi8KLQkgIHsgSVJRMTZBLCBJUlExN0EsIElSUTE4QSwgSVJRMTlBLCBJUlEyMEEsIElSUTIxQSwgSVJRMjJBLCBJUlEyM0EgfSB9LAotCXsgMHhlNjkwMDA0YywgMHhlNjkwMDA2YywgOCwgLyogSU5UTVNLMzBBIC8gSU5UTVNLQ0xSMzBBICovCi0JICB7IElSUTI0QSwgSVJRMjVBLCBJUlEyNkEsIElSUTI3QSwgSVJRMjhBLCBJUlEyOUEsIElSUTMwQSwgSVJRMzFBIH0gfSwKLQogCXsgMHhlNjk0MDA4MCwgMHhlNjk0MDBjMCwgOCwgLyogSU1SMEEgLyBJTUNSMEEgKi8KIAkgIHsgRE1BQzJfMV9ERUkzLCBETUFDMl8xX0RFSTIsIERNQUMyXzFfREVJMSwgRE1BQzJfMV9ERUkwLAogCSAgICBBUF9BUk1fSVJRUE1VLCAwLCBBUF9BUk1fQ09NTVRYLCBBUF9BUk1fQ09NTVJYIH0gfSwKQEAgLTI4MiwxNSArMjU0LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19wcmlvX3JlZyBpbnRjYV9wcmlvX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGU2OTAwMDEwLCAwLCAzMiwgNCwgLyogSU5UUFJJMDBBICovCi0JICB7IElSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSB9IH0sCi0JeyAweGU2OTAwMDE0LCAwLCAzMiwgNCwgLyogSU5UUFJJMTBBICovCi0JICB7IElSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSB9IH0sCi0JeyAweGU2OTAwMDE4LCAwLCAzMiwgNCwgLyogSU5UUFJJMjBBICovCi0JICB7IElSUTE2QSwgSVJRMTdBLCBJUlExOEEsIElSUTE5QSwgSVJRMjBBLCBJUlEyMUEsIElSUTIyQSwgSVJRMjNBIH0gfSwKLQl7IDB4ZTY5MDAwMWMsIDAsIDMyLCA0LCAvKiBJTlRQUkkzMEEgKi8KLQkgIHsgSVJRMjRBLCBJUlEyNUEsIElSUTI2QSwgSVJRMjdBLCBJUlEyOEEsIElSUTI5QSwgSVJRMzBBLCBJUlEzMUEgfSB9LAotCiAJeyAweGU2OTQwMDAwLCAwLCAxNiwgNCwgLyogSVBSQUEgKi8geyBETUFDM18xLCBETUFDM18yLCBDTVQyLCAwIH0gfSwKIAl7IDB4ZTY5NDAwMDQsIDAsIDE2LCA0LCAvKiBJUFJCQSAqLyB7IElSREEsIDAsIEJCSUYxLCBCQklGMiB9IH0sCiAJeyAweGU2OTQwMDA4LCAwLCAxNiwgNCwgLyogSVBSQ0EgKi8geyAwLCBDUllQVF9TVEQsCkBAIC0zMzYsMzMgKzI5OSwxMyBAQAogCXsgMHhlNjk1MDA1MCwgMCwgMTYsIDQsIC8qIElQUlVBMyAqLyB7IFVTQkhTRE1BQzFfVVNIRE1JLCAwLCAwLCAwIH0gfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW50Y19zZW5zZV9yZWcgaW50Y2Ffc2Vuc2VfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKLQl7IDB4ZTY5MDAwMDAsIDMyLCA0LCAvKiBJQ1IxQSAqLwotCSAgeyBJUlEwQSwgSVJRMUEsIElSUTJBLCBJUlEzQSwgSVJRNEEsIElSUTVBLCBJUlE2QSwgSVJRN0EgfSB9LAotCXsgMHhlNjkwMDAwNCwgMzIsIDQsIC8qIElDUjJBICovCi0JICB7IElSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSB9IH0sCi0JeyAweGU2OTAwMDA4LCAzMiwgNCwgLyogSUNSM0EgKi8KLQkgIHsgSVJRMTZBLCBJUlExN0EsIElSUTE4QSwgSVJRMTlBLCBJUlEyMEEsIElSUTIxQSwgSVJRMjJBLCBJUlEyM0EgfSB9LAotCXsgMHhlNjkwMDAwYywgMzIsIDQsIC8qIElDUjRBICovCi0JICB7IElSUTI0QSwgSVJRMjVBLCBJUlEyNkEsIElSUTI3QSwgSVJRMjhBLCBJUlEyOUEsIElSUTMwQSwgSVJRMzFBIH0gfSwKLX07CitzdGF0aWMgREVDTEFSRV9JTlRDX0RFU0MoaW50Y2FfZGVzYywgInNoNzM3Mi1pbnRjYSIsCisJCQkgaW50Y2FfdmVjdG9ycywgaW50Y2FfZ3JvdXBzLAorCQkJIGludGNhX21hc2tfcmVnaXN0ZXJzLCBpbnRjYV9wcmlvX3JlZ2lzdGVycywKKwkJCSBOVUxMKTsKIAotc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIGludGNhX2Fja19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewotCXsgMHhlNjkwMDAyMCwgMCwgOCwgLyogSU5UUkVRMDBBICovCi0JICB7IElSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSB9IH0sCi0JeyAweGU2OTAwMDI0LCAwLCA4LCAvKiBJTlRSRVExMEEgKi8KLQkgIHsgSVJROEEsIElSUTlBLCBJUlExMEEsIElSUTExQSwgSVJRMTJBLCBJUlExM0EsIElSUTE0QSwgSVJRMTVBIH0gfSwKLQl7IDB4ZTY5MDAwMjgsIDAsIDgsIC8qIElOVFJFUTIwQSAqLwotCSAgeyBJUlExNkEsIElSUTE3QSwgSVJRMThBLCBJUlExOUEsIElSUTIwQSwgSVJRMjFBLCBJUlEyMkEsIElSUTIzQSB9IH0sCi0JeyAweGU2OTAwMDJjLCAwLCA4LCAvKiBJTlRSRVEzMEEgKi8KLQkgIHsgSVJRMjRBLCBJUlEyNUEsIElSUTI2QSwgSVJRMjdBLCBJUlEyOEEsIElSUTI5QSwgSVJRMzBBLCBJUlEzMUEgfSB9LAotfTsKLQotc3RhdGljIERFQ0xBUkVfSU5UQ19ERVNDX0FDSyhpbnRjYV9kZXNjLCAic2g3MzcyLWludGNhIiwKLQkJCSAgICAgaW50Y2FfdmVjdG9ycywgaW50Y2FfZ3JvdXBzLAotCQkJICAgICBpbnRjYV9tYXNrX3JlZ2lzdGVycywgaW50Y2FfcHJpb19yZWdpc3RlcnMsCi0JCQkgICAgIGludGNhX3NlbnNlX3JlZ2lzdGVycywgaW50Y2FfYWNrX3JlZ2lzdGVycyk7Ci0KK0lOVENfSVJRX1BJTlNfMzIoaW50Y2FfaXJxX3BpbnMsIDB4ZTY5MDAwMDAsCisJCSBJTlRDX1ZFQ1QsICJzaDczNzItaW50Y2EtaXJxLXBpbnMiKTsKIGVudW0gewogCVVOVVNFRF9JTlRDUyA9IDAsCiAJRU5BQkxFRF9JTlRDUywKQEAgLTYxOCw2ICs1NjEsNyBAQAogCWludGNzX2ZmZDUgPSBpb3JlbWFwX25vY2FjaGUoMHhmZmQ1MDAwMCwgUEFHRV9TSVpFKTsKIAogCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y2FfZGVzYyk7CisJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjYV9pcnFfcGluc19kZXNjKTsKIAlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNzX2Rlc2MpOwogCiAJLyogZGVtdXggdXNpbmcgSU5URVZUU0EgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzcuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzcuYwppbmRleCBmZTQ1MTU0Li4yYWY0ZTZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3Mzc3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM3Ny5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zaF9pbnRjLmg+CisjaW5jbHVkZSA8bWFjaC9pbnRjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAKQEAgLTMxLDEwICszMiw2IEBACiAJRElTQUJMRUQsCiAKIAkvKiBpbnRlcnJ1cHQgc291cmNlcyBJTlRDQSAqLwotCUlSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSwKLQlJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEsCi0JSVJRMTZBLCBJUlExN0EsIElSUTE4QSwgSVJRMTlBLCBJUlEyMEEsIElSUTIxQSwgSVJRMjJBLCBJUlEyM0EsCi0JSVJRMjRBLCBJUlEyNUEsIElSUTI2QSwgSVJRMjdBLCBJUlEyOEEsIElSUTI5QSwgSVJRMzBBLCBJUlEzMUEsCiAJRElSQywKIAlfMkRHLAogCUNSWVBUX1NURCwKQEAgLTkxLDIyICs4OCw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGludGNfdmVjdCBpbnRjYV92ZWN0b3JzW10gX19pbml0ZGF0YSA9IHsKLQlJTlRDX1ZFQ1QoSVJRMEEsIDB4MDIwMCksIElOVENfVkVDVChJUlExQSwgMHgwMjIwKSwKLQlJTlRDX1ZFQ1QoSVJRMkEsIDB4MDI0MCksIElOVENfVkVDVChJUlEzQSwgMHgwMjYwKSwKLQlJTlRDX1ZFQ1QoSVJRNEEsIDB4MDI4MCksIElOVENfVkVDVChJUlE1QSwgMHgwMmEwKSwKLQlJTlRDX1ZFQ1QoSVJRNkEsIDB4MDJjMCksIElOVENfVkVDVChJUlE3QSwgMHgwMmUwKSwKLQlJTlRDX1ZFQ1QoSVJROEEsIDB4MDMwMCksIElOVENfVkVDVChJUlE5QSwgMHgwMzIwKSwKLQlJTlRDX1ZFQ1QoSVJRMTBBLCAweDAzNDApLCBJTlRDX1ZFQ1QoSVJRMTFBLCAweDAzNjApLAotCUlOVENfVkVDVChJUlExMkEsIDB4MDM4MCksIElOVENfVkVDVChJUlExM0EsIDB4MDNhMCksCi0JSU5UQ19WRUNUKElSUTE0QSwgMHgwM2MwKSwgSU5UQ19WRUNUKElSUTE1QSwgMHgwM2UwKSwKLQlJTlRDX1ZFQ1QoSVJRMTZBLCAweDMyMDApLCBJTlRDX1ZFQ1QoSVJRMTdBLCAweDMyMjApLAotCUlOVENfVkVDVChJUlExOEEsIDB4MzI0MCksIElOVENfVkVDVChJUlExOUEsIDB4MzI2MCksCi0JSU5UQ19WRUNUKElSUTIwQSwgMHgzMjgwKSwgSU5UQ19WRUNUKElSUTMxQSwgMHgzMmEwKSwKLQlJTlRDX1ZFQ1QoSVJRMjJBLCAweDMyYzApLCBJTlRDX1ZFQ1QoSVJRMjNBLCAweDMyZTApLAotCUlOVENfVkVDVChJUlEyNEEsIDB4MzMwMCksIElOVENfVkVDVChJUlEyNUEsIDB4MzMyMCksCi0JSU5UQ19WRUNUKElSUTI2QSwgMHgzMzQwKSwgSU5UQ19WRUNUKElSUTI3QSwgMHgzMzYwKSwKLQlJTlRDX1ZFQ1QoSVJRMjhBLCAweDMzODApLCBJTlRDX1ZFQ1QoSVJRMjlBLCAweDMzYTApLAotCUlOVENfVkVDVChJUlEzMEEsIDB4MzNjMCksIElOVENfVkVDVChJUlEzMUEsIDB4MzNlMCksCiAJSU5UQ19WRUNUKERJUkMsIDB4MDU2MCksCiAJSU5UQ19WRUNUKF8yREcsIDB4MDVlMCksCiAJSU5UQ19WRUNUKENSWVBUX1NURCwgMHgwNzAwKSwKQEAgLTIwMywxNSArMTg0LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBpbnRjYV9tYXNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGU2OTAwMDQwLCAweGU2OTAwMDYwLCA4LCAvKiBJTlRNU0swMEEgLyBJTlRNU0tDTFIwMEEgKi8KLQkgIHsgSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBIH0gfSwKLQl7IDB4ZTY5MDAwNDQsIDB4ZTY5MDAwNjQsIDgsIC8qIElOVE1TSzEwQSAvIElOVE1TS0NMUjEwQSAqLwotCSAgeyBJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEgfSB9LAotCXsgMHhlNjkwMDA0OCwgMHhlNjkwMDA2OCwgOCwgLyogSU5UTVNLMjBBIC8gSU5UTVNLQ0xSMjBBICovCi0JICB7IElSUTE2QSwgSVJRMTdBLCBJUlExOEEsIElSUTE5QSwgSVJRMjBBLCBJUlEyMUEsIElSUTIyQSwgSVJRMjNBIH0gfSwKLQl7IDB4ZTY5MDAwNGMsIDB4ZTY5MDAwNmMsIDgsIC8qIElOVE1TSzMwQSAvIElOVE1TS0NMUjMwQSAqLwotCSAgeyBJUlEyNEEsIElSUTI1QSwgSVJRMjZBLCBJUlEyN0EsIElSUTI4QSwgSVJRMjlBLCBJUlEzMEEsIElSUTMxQSB9IH0sCi0KIAl7IDB4ZTY5NDAwODAsIDB4ZTY5NDAwYzAsIDgsIC8qIElNUjBBIC8gSU1DUjBBICovCiAJICB7IERNQUMyXzFfREVJMywgRE1BQzJfMV9ERUkyLCBETUFDMl8xX0RFSTEsIERNQUMyXzFfREVJMCwKIAkgICAgQVBfQVJNX0lSUVBNVSwgMCwgQVBfQVJNX0NPTU1UWCwgQVBfQVJNX0NPTU1SWCB9IH0sCkBAIC0yNzMsMTUgKzI0NSw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGludGNfcHJpb19yZWcgaW50Y2FfcHJpb19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewotCXsgMHhlNjkwMDAxMCwgMCwgMzIsIDQsIC8qIElOVFBSSTAwQSAqLwotCSAgeyBJUlEwQSwgSVJRMUEsIElSUTJBLCBJUlEzQSwgSVJRNEEsIElSUTVBLCBJUlE2QSwgSVJRN0EgfSB9LAotCXsgMHhlNjkwMDAxNCwgMCwgMzIsIDQsIC8qIElOVFBSSTEwQSAqLwotCSAgeyBJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEgfSB9LAotCXsgMHhlNjkwMDAxOCwgMCwgMzIsIDQsIC8qIElOVFBSSTEwQSAqLwotCSAgeyBJUlExNkEsIElSUTE3QSwgSVJRMThBLCBJUlExOUEsIElSUTIwQSwgSVJRMjFBLCBJUlEyMkEsIElSUTIzQSB9IH0sCi0JeyAweGU2OTAwMDFjLCAwLCAzMiwgNCwgLyogSU5UUFJJMzBBICovCi0JICB7IElSUTI0QSwgSVJRMjVBLCBJUlEyNkEsIElSUTI3QSwgSVJRMjhBLCBJUlEyOUEsIElSUTMwQSwgSVJRMzFBIH0gfSwKLQogCXsgMHhlNjk0MDAwMCwgMCwgMTYsIDQsIC8qIElQUkFBICovIHsgRE1BQzNfMSwgRE1BQzNfMiwgQ01UMiwgTENSQyB9IH0sCiAJeyAweGU2OTQwMDA0LCAwLCAxNiwgNCwgLyogSVBSQkEgKi8geyBJUkRBLCAwLCBCQklGMSwgQkJJRjIgfSB9LAogCXsgMHhlNjk0MDAwOCwgMCwgMTYsIDQsIC8qIElQUkNBICovIHsgXzJERywgQ1JZUFRfU1RELApAQCAtMzE1LDM3ICsyNzgsMTggQEAKIAl7IDB4ZTY5NDAwM2MsIDAsIDE2LCA0LCAvKiBJUFJQQTMgKi8geyBTQ0lGQTYsIDAsIDAsIDAgfSB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpbnRjX3NlbnNlX3JlZyBpbnRjYV9zZW5zZV9yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewotCXsgMHhlNjkwMDAwMCwgMTYsIDIsIC8qIElDUjFBICovCi0JICB7IElSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSB9IH0sCi0JeyAweGU2OTAwMDA0LCAxNiwgMiwgLyogSUNSMkEgKi8KLQkgIHsgSVJROEEsIElSUTlBLCBJUlExMEEsIElSUTExQSwgSVJRMTJBLCBJUlExM0EsIElSUTE0QSwgSVJRMTVBIH0gfSwKLQl7IDB4ZTY5MDAwMDgsIDE2LCAyLCAvKiBJQ1IzQSAqLwotCSAgeyBJUlExNkEsIElSUTE3QSwgSVJRMThBLCBJUlExOUEsIElSUTIwQSwgSVJRMjFBLCBJUlEyMkEsIElSUTIzQSB9IH0sCi0JeyAweGU2OTAwMDBjLCAxNiwgMiwgLyogSUNSNEEgKi8KLQkgIHsgSVJRMjRBLCBJUlEyNUEsIElSUTI2QSwgSVJRMjdBLCBJUlEyOEEsIElSUTI5QSwgSVJRMzBBLCBJUlEzMUEgfSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIGludGNhX2Fja19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewotCXsgMHhlNjkwMDAyMCwgMCwgOCwgLyogSU5UUkVRMDBBICovCi0JICB7IElSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSB9IH0sCi0JeyAweGU2OTAwMDI0LCAwLCA4LCAvKiBJTlRSRVExMEEgKi8KLQkgIHsgSVJROEEsIElSUTlBLCBJUlExMEEsIElSUTExQSwgSVJRMTJBLCBJUlExM0EsIElSUTE0QSwgSVJRMTVBIH0gfSwKLQl7IDB4ZTY5MDAwMjgsIDAsIDgsIC8qIElOVFJFUTIwQSAqLwotCSAgeyBJUlExNkEsIElSUTE3QSwgSVJRMThBLCBJUlExOUEsIElSUTIwQSwgSVJRMjFBLCBJUlEyMkEsIElSUTIzQSB9IH0sCi0JeyAweGU2OTAwMDJjLCAwLCA4LCAvKiBJTlRSRVEzMEEgKi8KLQkgIHsgSVJRMjRBLCBJUlEyNUEsIElSUTI2QSwgSVJRMjdBLCBJUlEyOEEsIElSUTI5QSwgSVJRMzBBLCBJUlEzMUEgfSB9LAotfTsKLQogc3RhdGljIHN0cnVjdCBpbnRjX2Rlc2MgaW50Y2FfZGVzYyBfX2luaXRkYXRhID0gewogCS5uYW1lID0gInNoNzM3Ny1pbnRjYSIsCiAJLmZvcmNlX2VuYWJsZSA9IEVOQUJMRUQsCiAJLmZvcmNlX2Rpc2FibGUgPSBESVNBQkxFRCwKIAkuaHcgPSBJTlRDX0hXX0RFU0MoaW50Y2FfdmVjdG9ycywgaW50Y2FfZ3JvdXBzLAogCQkJICAgaW50Y2FfbWFza19yZWdpc3RlcnMsIGludGNhX3ByaW9fcmVnaXN0ZXJzLAotCQkJICAgaW50Y2Ffc2Vuc2VfcmVnaXN0ZXJzLCBpbnRjYV9hY2tfcmVnaXN0ZXJzKSwKKwkJCSAgIE5VTEwsIE5VTEwpLAogfTsKIAorSU5UQ19JUlFfUElOU18zMihpbnRjYV9pcnFfcGlucywgMHhlNjkwMDAwMCwKKwkJIElOVENfVkVDVCwgInNoNzM3Ny1pbnRjYS1pcnEtcGlucyIpOworCiAvKiB0aGlzIG1hY3JvIGlnbm9yZSBlbnRyeSB3aGljaCBpcyBhbHNvIGluIElOVENBICovCiAjZGVmaW5lIF9fSUdOT1JFKGEuLi4pCiAjZGVmaW5lIF9fSUdOT1JFMChhLi4uKSAwCkBAIC02MzgsNiArNTgyLDcgQEAKIAl2b2lkIF9faW9tZW0gKmludGV2dHNhID0gaW9yZW1hcF9ub2NhY2hlKElOVEVWVFNBLCBQQUdFX1NJWkUpOwogCiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjYV9kZXNjKTsKKwlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNhX2lycV9waW5zX2Rlc2MpOwogCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y3NfZGVzYyk7CiAKIAkvKiBkZW11eCB1c2luZyBJTlRFVlRTQSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzNhMC5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzNhMC5jCmluZGV4IGE5MTFhNjAuLjFlZGE2YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczYTAuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3M2EwLmMKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2ludGMuaD4KKyNpbmNsdWRlIDxtYWNoL2ludGMuaD4KKyNpbmNsdWRlIDxtYWNoL3NoNzNhMC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTI1NSwyMCArMjU3LDIwNSBAQAogCXJldHVybiAwOyAvKiBhbHdheXMgYWxsb3cgd2FrZXVwICovCiB9CiAKKyNkZWZpbmUgUkVMT0NfQkFTRSAweDEwMDAKKworLyogSU5UQ0EgSVJRIHBpbnMgYXQgSU5UQ1MgKyAweDEwMDAgdG8gbWFrZSBzcGFjZSBmb3IgR0lDK0lOVEMgaGFuZGxpbmcgKi8KKyNkZWZpbmUgSU5UQ1NfVkVDVF9SRUxPQyhuLCB2ZWN0KSBJTlRDU19WRUNUKChuKSwgKHZlY3QpICsgUkVMT0NfQkFTRSkKKworSU5UQ19JUlFfUElOU18zMihpbnRjYV9pcnFfcGlucywgMHhlNjkwMDAwMCwKKwkJIElOVENTX1ZFQ1RfUkVMT0MsICJzaDczYTAtaW50Y2EtaXJxLXBpbnMiKTsKKworc3RhdGljIGludCB0b19naWNfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgdmVjdCA9IGlycTJldnQoZGF0YS0+aXJxKSAtIElOVENTX1ZFQ1RfQkFTRTsKKworCWlmICh2ZWN0ID49IDB4MzIwMCkKKwkJdmVjdCAtPSAweDMwMDA7CisJZWxzZQorCQl2ZWN0IC09IDB4MDIwMDsKKworCXJldHVybiBnaWNfc3BpKCh2ZWN0ID4+IDUpICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgdG9faW50Y2FfcmVsb2NfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gZGF0YS0+aXJxICsgKFJFTE9DX0JBU0UgPj4gNSk7Cit9CisKKyNkZWZpbmUgaXJxX2NiKGNiLCBpcnEpIGlycV9nZXRfY2hpcChpcnEpLT5jYihpcnFfZ2V0X2lycV9kYXRhKGlycSkpCisjZGVmaW5lIGlycV9jYnAoY2IsIGlycSwgcC4uLikgaXJxX2dldF9jaGlwKGlycSktPmNiKGlycV9nZXRfaXJxX2RhdGEoaXJxKSwgcCkKKworc3RhdGljIHZvaWQgaW50Y2FfZ2ljX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJaXJxX2NiKGlycV91bm1hc2ssIHRvX2ludGNhX3JlbG9jX2lycShkYXRhKSk7CisJaXJxX2NiKGlycV91bm1hc2ssIHRvX2dpY19pcnEoZGF0YSkpOworfQorCitzdGF0aWMgdm9pZCBpbnRjYV9naWNfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJaXJxX2NiKGlycV9tYXNrLCB0b19naWNfaXJxKGRhdGEpKTsKKwlpcnFfY2IoaXJxX21hc2ssIHRvX2ludGNhX3JlbG9jX2lycShkYXRhKSk7Cit9CisKK3N0YXRpYyB2b2lkIGludGNhX2dpY19tYXNrX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJaXJxX2NiKGlycV9tYXNrLCB0b19naWNfaXJxKGRhdGEpKTsKKwlpcnFfY2IoaXJxX21hc2tfYWNrLCB0b19pbnRjYV9yZWxvY19pcnEoZGF0YSkpOworfQorCitzdGF0aWMgdm9pZCBpbnRjYV9naWNfZW9pKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlpcnFfY2IoaXJxX2VvaSwgdG9fZ2ljX2lycShkYXRhKSk7Cit9CisKK3N0YXRpYyBpbnQgaW50Y2FfZ2ljX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJcmV0dXJuIGlycV9jYnAoaXJxX3NldF90eXBlLCB0b19pbnRjYV9yZWxvY19pcnEoZGF0YSksIHR5cGUpOworfQorCitzdGF0aWMgaW50IGludGNhX2dpY19zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBvbikKK3sKKwlyZXR1cm4gaXJxX2NicChpcnFfc2V0X3dha2UsIHRvX2ludGNhX3JlbG9jX2lycShkYXRhKSwgb24pOworfQorCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIGludCBpbnRjYV9naWNfc2V0X2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLAorCQkJCSAgYm9vbCBmb3JjZSkKK3sKKwlyZXR1cm4gaXJxX2NicChpcnFfc2V0X2FmZmluaXR5LCB0b19naWNfaXJxKGRhdGEpLCBjcHVtYXNrLCBmb3JjZSk7Cit9CisjZW5kaWYKKworc3RydWN0IGlycV9jaGlwIGludGNhX2dpY19pcnFfY2hpcCA9IHsKKwkubmFtZQkJCT0gIklOVENBLUdJQyIsCisJLmlycV9tYXNrCQk9IGludGNhX2dpY19kaXNhYmxlLAorCS5pcnFfdW5tYXNrCQk9IGludGNhX2dpY19lbmFibGUsCisJLmlycV9tYXNrX2FjawkJPSBpbnRjYV9naWNfbWFza19hY2ssCisJLmlycV9lb2kJCT0gaW50Y2FfZ2ljX2VvaSwKKwkuaXJxX2VuYWJsZQkJPSBpbnRjYV9naWNfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQkJPSBpbnRjYV9naWNfZGlzYWJsZSwKKwkuaXJxX3NodXRkb3duCQk9IGludGNhX2dpY19kaXNhYmxlLAorCS5pcnFfc2V0X3R5cGUJCT0gaW50Y2FfZ2ljX3NldF90eXBlLAorCS5pcnFfc2V0X3dha2UJCT0gaW50Y2FfZ2ljX3NldF93YWtlLAorI2lmZGVmIENPTkZJR19TTVAKKwkuaXJxX3NldF9hZmZpbml0eQk9IGludGNhX2dpY19zZXRfYWZmaW5pdHksCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgdG9faW50Y192ZWN0KGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IGlycV9waW4gPSBpcnEgLSBnaWNfc3BpKDEpOworCXVuc2lnbmVkIGludCBvZmZzOworCisJaWYgKGlycV9waW4gPCAxNikKKwkJb2ZmcyA9IDB4MDIwMDsKKwllbHNlCisJCW9mZnMgPSAweDMwMDA7CisKKwlyZXR1cm4gb2ZmcyArIChpcnFfcGluIDw8IDUpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2g3M2EwX2lycV9waW5fZGVtdXgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWdlbmVyaWNfaGFuZGxlX2lycShpbnRjc19ldnQyaXJxKHRvX2ludGNfdmVjdChpcnEpKSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBzaDczYTBfaXJxX3Bpbl9jYXNjYWRlWzMyXTsKKworI2RlZmluZSBQSU5URVIwIDB4ZTY5MDAwYTAKKyNkZWZpbmUgUElOVEVSMSAweGU2OTAwMGE0CisjZGVmaW5lIFBJTlRSUjAgMHhlNjkwMDBkMAorI2RlZmluZSBQSU5UUlIxIDB4ZTY5MDAwZDQKKworI2RlZmluZSBQSU5UMEFfSVJRKG4sIGlycSkgSU5UQ19JUlEoKG4pLCBTSDczQTBfUElOVDBfSVJRKGlycSkpCisjZGVmaW5lIFBJTlQwQl9JUlEobiwgaXJxKSBJTlRDX0lSUSgobiksIFNINzNBMF9QSU5UMF9JUlEoaXJxICsgOCkpCisjZGVmaW5lIFBJTlQwQ19JUlEobiwgaXJxKSBJTlRDX0lSUSgobiksIFNINzNBMF9QSU5UMF9JUlEoaXJxICsgMTYpKQorI2RlZmluZSBQSU5UMERfSVJRKG4sIGlycSkgSU5UQ19JUlEoKG4pLCBTSDczQTBfUElOVDBfSVJRKGlycSArIDI0KSkKKyNkZWZpbmUgUElOVDFFX0lSUShuLCBpcnEpIElOVENfSVJRKChuKSwgU0g3M0EwX1BJTlQxX0lSUShpcnEpKQorCitJTlRDX1BJTlQoaW50Y19waW50MCwgUElOVEVSMCwgMHhlNjkwMDBiMCwgInNoNzNhMC1waW50MCIsCQlcCisgIElOVENfUElOVF9FKEEpLCBJTlRDX1BJTlRfRShCKSwgSU5UQ19QSU5UX0UoQyksIElOVENfUElOVF9FKEQpLAlcCisgIElOVENfUElOVF9WKEEsIFBJTlQwQV9JUlEpLCBJTlRDX1BJTlRfVihCLCBQSU5UMEJfSVJRKSwJCVwKKyAgSU5UQ19QSU5UX1YoQywgUElOVDBDX0lSUSksIElOVENfUElOVF9WKEQsIFBJTlQwRF9JUlEpLAkJXAorICBJTlRDX1BJTlRfRShBKSwgSU5UQ19QSU5UX0UoQiksIElOVENfUElOVF9FKEMpLCBJTlRDX1BJTlRfRShEKSwJXAorICBJTlRDX1BJTlRfRShBKSwgSU5UQ19QSU5UX0UoQiksIElOVENfUElOVF9FKEMpLCBJTlRDX1BJTlRfRShEKSk7CisKK0lOVENfUElOVChpbnRjX3BpbnQxLCBQSU5URVIxLCAweGU2OTAwMGMwLCAic2g3M2EwLXBpbnQxIiwJCVwKKyAgSU5UQ19QSU5UX0UoRSksIElOVENfUElOVF9FX0VNUFRZLCBJTlRDX1BJTlRfRV9FTVBUWSwgSU5UQ19QSU5UX0VfRU1QVFksIFwKKyAgSU5UQ19QSU5UX1YoRSwgUElOVDFFX0lSUSksIElOVENfUElOVF9WX05PTkUsCQkJCVwKKyAgSU5UQ19QSU5UX1ZfTk9ORSwgSU5UQ19QSU5UX1ZfTk9ORSwJCQkJCVwKKyAgSU5UQ19QSU5UX0VfTk9ORSwgSU5UQ19QSU5UX0VfTk9ORSwgSU5UQ19QSU5UX0VfTk9ORSwgSU5UQ19QSU5UX0UoRSksIFwKKyAgSU5UQ19QSU5UX0UoRSksIElOVENfUElOVF9FX05PTkUsIElOVENfUElOVF9FX05PTkUsIElOVENfUElOVF9FX05PTkUpOworCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBzaDczYTBfcGludDBfY2FzY2FkZTsKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHNoNzNhMF9waW50MV9jYXNjYWRlOworCitzdGF0aWMgdm9pZCBwaW50X2RlbXV4KHVuc2lnbmVkIGxvbmcgcnIsIHVuc2lnbmVkIGxvbmcgZXIsIGludCBiYXNlX2lycSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlID0gIGlvcmVhZDMyKHJyKSAmIGlvcmVhZDMyKGVyKTsKKwlpbnQgazsKKworCWZvciAoayA9IDA7IGsgPCAzMjsgaysrKSB7CisJCWlmICh2YWx1ZSAmICgxIDw8ICgzMSAtIGspKSkgeworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGJhc2VfaXJxICsgayk7CisJCQlpb3dyaXRlMzIofigxIDw8ICgzMSAtIGspKSwgcnIpOworCQl9CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2g3M2EwX3BpbnQwX2RlbXV4KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlwaW50X2RlbXV4KFBJTlRSUjAsIFBJTlRFUjAsIFNINzNBMF9QSU5UMF9JUlEoMCkpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNoNzNhMF9waW50MV9kZW11eChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJcGludF9kZW11eChQSU5UUlIxLCBQSU5URVIxLCBTSDczQTBfUElOVDFfSVJRKDApKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIHZvaWQgX19pbml0IHNoNzNhMF9pbml0X2lycSh2b2lkKQogewogCXZvaWQgX19pb21lbSAqZ2ljX2Rpc3RfYmFzZSA9IF9faW8oMHhmMDAwMTAwMCk7CiAJdm9pZCBfX2lvbWVtICpnaWNfY3B1X2Jhc2UgPSBfX2lvKDB4ZjAwMDAxMDApOwogCXZvaWQgX19pb21lbSAqaW50ZXZ0c2EgPSBpb3JlbWFwX25vY2FjaGUoMHhmZmQyMDEwMCwgUEFHRV9TSVpFKTsKKwlpbnQgaywgbjsKIAogCWdpY19pbml0KDAsIDI5LCBnaWNfZGlzdF9iYXNlLCBnaWNfY3B1X2Jhc2UpOwogCWdpY19hcmNoX2V4dG4uaXJxX3NldF93YWtlID0gc2g3M2EwX3NldF93YWtlOwogCiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjc19kZXNjKTsKKwlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNhX2lycV9waW5zX2Rlc2MpOworCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y19waW50MF9kZXNjKTsKKwlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNfcGludDFfZGVzYyk7CiAKIAkvKiBkZW11eCB1c2luZyBJTlRFVlRTQSAqLwogCXNoNzNhMF9pbnRjc19jYXNjYWRlLm5hbWUgPSAiSU5UQ1MgY2FzY2FkZSI7CiAJc2g3M2EwX2ludGNzX2Nhc2NhZGUuaGFuZGxlciA9IHNoNzNhMF9pbnRjc19kZW11eDsKIAlzaDczYTBfaW50Y3NfY2FzY2FkZS5kZXZfaWQgPSBpbnRldnRzYTsKIAlzZXR1cF9pcnEoZ2ljX3NwaSg1MCksICZzaDczYTBfaW50Y3NfY2FzY2FkZSk7CisKKwkvKiBJUlEgcGlucyByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgdGhyb3VnaCBJTlRDQSBhbmQgR0lDICovCisJZm9yIChrID0gMDsgayA8IDMyOyBrKyspIHsKKwkJc2g3M2EwX2lycV9waW5fY2FzY2FkZVtrXS5uYW1lID0gIklOVENBLUdJQyBjYXNjYWRlIjsKKwkJc2g3M2EwX2lycV9waW5fY2FzY2FkZVtrXS5oYW5kbGVyID0gc2g3M2EwX2lycV9waW5fZGVtdXg7CisJCXNldHVwX2lycShnaWNfc3BpKDEgKyBrKSwgJnNoNzNhMF9pcnFfcGluX2Nhc2NhZGVba10pOworCisJCW4gPSBpbnRjc19ldnQyaXJxKHRvX2ludGNfdmVjdChnaWNfc3BpKDEgKyBrKSkpOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXJfbmFtZShuLCAmaW50Y2FfZ2ljX2lycV9jaGlwLAorCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKKwkJc2V0X2lycV9mbGFncyhuLCBJUlFGX1ZBTElEKTsgLyogeXVjayAqLworCX0KKworCS8qIFBJTlQgcGlucyBhcmUgc2FuZWx5IHRpZWQgdG8gdGhlIEdJQyBhcyBTUEkgKi8KKwlzaDczYTBfcGludDBfY2FzY2FkZS5uYW1lID0gIlBJTlQwIGNhc2NhZGUiOworCXNoNzNhMF9waW50MF9jYXNjYWRlLmhhbmRsZXIgPSBzaDczYTBfcGludDBfZGVtdXg7CisJc2V0dXBfaXJxKGdpY19zcGkoMzMpLCAmc2g3M2EwX3BpbnQwX2Nhc2NhZGUpOworCisJc2g3M2EwX3BpbnQxX2Nhc2NhZGUubmFtZSA9ICJQSU5UMSBjYXNjYWRlIjsKKwlzaDczYTBfcGludDFfY2FzY2FkZS5oYW5kbGVyID0gc2g3M2EwX3BpbnQxX2RlbXV4OworCXNldHVwX2lycShnaWNfc3BpKDM0KSwgJnNoNzNhMF9waW50MV9jYXNjYWRlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGZjLXNoNzM2Ny5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3MzY3LmMKaW5kZXggMTI4NTU1ZS4uZTZlNTI0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3MzY3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3MzY3LmMKQEAgLTIxLDY4ICsyMSw0OSBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3NoNzM2Ny5oPgogCi0jZGVmaW5lIF8xKGZuLCBwZngsIHNmeCkgZm4ocGZ4LCBzZngpCi0KLSNkZWZpbmUgXzEwKGZuLCBwZngsIHNmeCkJCQkJXAotCV8xKGZuLCBwZngjIzAsIHNmeCksIF8xKGZuLCBwZngjIzEsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMyLCBzZngpLCBfMShmbiwgcGZ4IyMzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjNCwgc2Z4KSwgXzEoZm4sIHBmeCMjNSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzYsIHNmeCksIF8xKGZuLCBwZngjIzcsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyM4LCBzZngpLCBfMShmbiwgcGZ4IyM5LCBzZngpCi0KLSNkZWZpbmUgXzkwKGZuLCBwZngsIHNmeCkJCQkJXAotCV8xMChmbiwgcGZ4IyMxLCBzZngpLCBfMTAoZm4sIHBmeCMjMiwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMzLCBzZngpLCBfMTAoZm4sIHBmeCMjNCwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM1LCBzZngpLCBfMTAoZm4sIHBmeCMjNiwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM3LCBzZngpLCBfMTAoZm4sIHBmeCMjOCwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM5LCBzZngpCi0KLSNkZWZpbmUgXzI3MyhmbiwgcGZ4LCBzZngpCQlcCi0JXzEwKGZuLCBwZngsIHNmeCksIF85MChmbiwgcGZ4LCBzZngpLAkJXAotCV8xMChmbiwgcGZ4IyMxMCwgc2Z4KSwgXzkwKGZuLCBwZngjIzEsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMjAsIHNmeCksIF8xMChmbiwgcGZ4IyMyMSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyMiwgc2Z4KSwgXzEwKGZuLCBwZngjIzIzLCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzI0LCBzZngpLCBfMTAoZm4sIHBmeCMjMjUsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMjYsIHNmeCksIF8xKGZuLCBwZngjIzI3MCwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzI3MSwgc2Z4KSwgXzEoZm4sIHBmeCMjMjcyLCBzZngpCi0KLSNkZWZpbmUgX1BPUlQocGZ4LCBzZngpIHBmeCMjXyMjc2Z4Ci0jZGVmaW5lIFBPUlRfMjczKHN0cikgXzI3MyhfUE9SVCwgUE9SVCwgc3RyKQorI2RlZmluZSBDUFVfQUxMX1BPUlQoZm4sIHBmeCwgc2Z4KQkJCQlcCisJUE9SVF8xMChmbiwgcGZ4LCBzZngpLCBQT1JUXzkwKGZuLCBwZngsIHNmeCksCQlcCisJUE9SVF8xMChmbiwgcGZ4IyMxMCwgc2Z4KSwgUE9SVF85MChmbiwgcGZ4IyMxLCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyMCwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMyMSwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMjIsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjMjMsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzI0LCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzI1LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyNiwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzI3MCwgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMyNzEsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMyNzIsIHNmeCkKIAogZW51bSB7CiAJUElOTVVYX1JFU0VSVkVEID0gMCwKIAogCVBJTk1VWF9EQVRBX0JFR0lOLAotCVBPUlRfMjczKERBVEEpLCAvKiBQT1JUMF9EQVRBIC0+IFBPUlQyNzJfREFUQSAqLworCVBPUlRfQUxMKERBVEEpLCAvKiBQT1JUMF9EQVRBIC0+IFBPUlQyNzJfREFUQSAqLwogCVBJTk1VWF9EQVRBX0VORCwKIAogCVBJTk1VWF9JTlBVVF9CRUdJTiwKLQlQT1JUXzI3MyhJTiksIC8qIFBPUlQwX0lOIC0+IFBPUlQyNzJfSU4gKi8KKwlQT1JUX0FMTChJTiksIC8qIFBPUlQwX0lOIC0+IFBPUlQyNzJfSU4gKi8KIAlQSU5NVVhfSU5QVVRfRU5ELAogCiAJUElOTVVYX0lOUFVUX1BVTExVUF9CRUdJTiwKLQlQT1JUXzI3MyhJTl9QVSksIC8qIFBPUlQwX0lOX1BVIC0+IFBPUlQyNzJfSU5fUFUgKi8KKwlQT1JUX0FMTChJTl9QVSksIC8qIFBPUlQwX0lOX1BVIC0+IFBPUlQyNzJfSU5fUFUgKi8KIAlQSU5NVVhfSU5QVVRfUFVMTFVQX0VORCwKIAogCVBJTk1VWF9JTlBVVF9QVUxMRE9XTl9CRUdJTiwKLQlQT1JUXzI3MyhJTl9QRCksIC8qIFBPUlQwX0lOX1BEIC0+IFBPUlQyNzJfSU5fUEQgKi8KKwlQT1JUX0FMTChJTl9QRCksIC8qIFBPUlQwX0lOX1BEIC0+IFBPUlQyNzJfSU5fUEQgKi8KIAlQSU5NVVhfSU5QVVRfUFVMTERPV05fRU5ELAogCiAJUElOTVVYX09VVFBVVF9CRUdJTiwKLQlQT1JUXzI3MyhPVVQpLCAvKiBQT1JUMF9PVVQgLT4gUE9SVDI3Ml9PVVQgKi8KKwlQT1JUX0FMTChPVVQpLCAvKiBQT1JUMF9PVVQgLT4gUE9SVDI3Ml9PVVQgKi8KIAlQSU5NVVhfT1VUUFVUX0VORCwKIAogCVBJTk1VWF9GVU5DVElPTl9CRUdJTiwKLQlQT1JUXzI3MyhGTl9JTiksIC8qIFBPUlQwX0ZOX0lOIC0+IFBPUlQyNzJfRk5fSU4gKi8KLQlQT1JUXzI3MyhGTl9PVVQpLCAvKiBQT1JUMF9GTl9PVVQgLT4gUE9SVDI3Ml9GTl9PVVQgKi8KLQlQT1JUXzI3MyhGTjApLCAvKiBQT1JUMF9GTjAgLT4gUE9SVDI3Ml9GTjAgKi8KLQlQT1JUXzI3MyhGTjEpLCAvKiBQT1JUMF9GTjEgLT4gUE9SVDI3Ml9GTjEgKi8KLQlQT1JUXzI3MyhGTjIpLCAvKiBQT1JUMF9GTjIgLT4gUE9SVDI3Ml9GTjIgKi8KLQlQT1JUXzI3MyhGTjMpLCAvKiBQT1JUMF9GTjMgLT4gUE9SVDI3Ml9GTjMgKi8KLQlQT1JUXzI3MyhGTjQpLCAvKiBQT1JUMF9GTjQgLT4gUE9SVDI3Ml9GTjQgKi8KLQlQT1JUXzI3MyhGTjUpLCAvKiBQT1JUMF9GTjUgLT4gUE9SVDI3Ml9GTjUgKi8KLQlQT1JUXzI3MyhGTjYpLCAvKiBQT1JUMF9GTjYgLT4gUE9SVDI3Ml9GTjYgKi8KLQlQT1JUXzI3MyhGTjcpLCAvKiBQT1JUMF9GTjcgLT4gUE9SVDI3Ml9GTjcgKi8KKwlQT1JUX0FMTChGTl9JTiksIC8qIFBPUlQwX0ZOX0lOIC0+IFBPUlQyNzJfRk5fSU4gKi8KKwlQT1JUX0FMTChGTl9PVVQpLCAvKiBQT1JUMF9GTl9PVVQgLT4gUE9SVDI3Ml9GTl9PVVQgKi8KKwlQT1JUX0FMTChGTjApLCAvKiBQT1JUMF9GTjAgLT4gUE9SVDI3Ml9GTjAgKi8KKwlQT1JUX0FMTChGTjEpLCAvKiBQT1JUMF9GTjEgLT4gUE9SVDI3Ml9GTjEgKi8KKwlQT1JUX0FMTChGTjIpLCAvKiBQT1JUMF9GTjIgLT4gUE9SVDI3Ml9GTjIgKi8KKwlQT1JUX0FMTChGTjMpLCAvKiBQT1JUMF9GTjMgLT4gUE9SVDI3Ml9GTjMgKi8KKwlQT1JUX0FMTChGTjQpLCAvKiBQT1JUMF9GTjQgLT4gUE9SVDI3Ml9GTjQgKi8KKwlQT1JUX0FMTChGTjUpLCAvKiBQT1JUMF9GTjUgLT4gUE9SVDI3Ml9GTjUgKi8KKwlQT1JUX0FMTChGTjYpLCAvKiBQT1JUMF9GTjYgLT4gUE9SVDI3Ml9GTjYgKi8KKwlQT1JUX0FMTChGTjcpLCAvKiBQT1JUMF9GTjcgLT4gUE9SVDI3Ml9GTjcgKi8KIAogCU1TRUxCQ1JfTVNFTDJfMSwgTVNFTEJDUl9NU0VMMl8wLAogCVBJTk1VWF9GVU5DVElPTl9FTkQsCkBAIC0zMjcsNDEgKzMwOCw2IEBACiAJUElOTVVYX01BUktfRU5ELAogfTsKIAotI2RlZmluZSBQT1JUX0RBVEFfSShucikgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfSU4pCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lfUEQobnIpIFwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BEKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JX1BVKG5yKSBcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgXAotCQkgICAgUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QVSkKLQotI2RlZmluZSBQT1JUX0RBVEFfSV9QVV9QRChucikgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFwKLQkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQsIFBPUlQjI25yIyNfSU5fUFUpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX08obnIpIFwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX09VVCkKLQotI2RlZmluZSBQT1JUX0RBVEFfSU8obnIpIFwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX09VVCwgXAotCQkgICAgUE9SVCMjbnIjI19JTikKLQotI2RlZmluZSBQT1JUX0RBVEFfSU9fUEQobnIpIFwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX09VVCwgXAotCQkgICAgUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCkKLQotI2RlZmluZSBQT1JUX0RBVEFfSU9fUFUobnIpIFwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX09VVCwgXAotCQkgICAgUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QVSkKLQotI2RlZmluZSBQT1JUX0RBVEFfSU9fUFVfUEQobnIpIFwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX09VVCwgXAotCQkgICAgUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCwgUE9SVCMjbnIjI19JTl9QVSkKLQotCiBzdGF0aWMgcGlubXV4X2VudW1fdCBwaW5tdXhfZGF0YVtdID0gewogCiAJLyogc3BlY2lmeSB2YWxpZCBwaW4gc3RhdGVzIGZvciBlYWNoIHBpbiBpbiBHUElPIG1vZGUgKi8KQEAgLTEwOTgsMTMgKzEwNDQsOSBAQAogCVBJTk1VWF9EQVRBKERJVkxPQ0tfTUFSSywgUE9SVDI3Ml9GTjEpLAogfTsKIAotI2RlZmluZSBfR1BJT19QT1JUKHBmeCwgc2Z4KSBQSU5NVVhfR1BJTyhHUElPX1BPUlQjI3BmeCwgUE9SVCMjcGZ4IyNfREFUQSkKLSNkZWZpbmUgR1BJT19QT1JUXzI3MygpIF8yNzMoX0dQSU9fUE9SVCwgLCB1bnVzZWQpCi0jZGVmaW5lIEdQSU9fRk4oc3RyKSBQSU5NVVhfR1BJTyhHUElPX0ZOXyMjc3RyLCBzdHIjI19NQVJLKQotCiBzdGF0aWMgc3RydWN0IHBpbm11eF9ncGlvIHBpbm11eF9ncGlvc1tdID0gewogCS8qIDQ5LTEgLT4gNDktNiAoR1BJTykgKi8KLQlHUElPX1BPUlRfMjczKCksCisJR1BJT19QT1JUX0FMTCgpLAogCiAJLyogU3BlY2lhbCBQdWxsLXVwIC8gUHVsbC1kb3duIEZ1bmN0aW9ucyAqLwogCUdQSU9fRk4oUE9SVDQ4X0tFWUlOMF9QVSksIEdQSU9fRk4oUE9SVDQ5X0tFWUlOMV9QVSksCkBAIC0xMzQ1LDIyICsxMjg3LDYgQEAKIAlHUElPX0ZOKERJVkxPQ0spLAogfTsKIAotLyogaGVscGVyIGZvciB0b3AgNCBiaXRzIGluIFBPUlRuQ1IgKi8KLSNkZWZpbmUgUENSSChpbiwgaW5fcGQsIGluX3B1LCBvdXQpCQlcCi0JMCwgKG91dCksIChpbiksIDAsCQkJXAotCTAsIDAsIDAsIDAsCQkJCVwKLQkwLCAwLCAoaW5fcGQpLCAwLAkJCVwKLQkwLCAwLCAoaW5fcHUpLCAwCi0KLSNkZWZpbmUgUE9SVENSKG5yLCByZWcpCQkJCQkJXAotCXsgUElOTVVYX0NGR19SRUcoIlBPUlQiIG5yICJDUiIsIHJlZywgOCwgNCkgewkJXAotCQlQQ1JIKFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQsCQlcCi0JCSAgICAgUE9SVCMjbnIjI19JTl9QVSwgUE9SVCMjbnIjI19PVVQpLAkJXAotCQlQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19GTjEsIFBPUlQjI25yIyNfRk4yLAlcCi0JCVBPUlQjI25yIyNfRk4zLAlQT1JUIyNuciMjX0ZONCwgUE9SVCMjbnIjI19GTjUsCVwKLQkJUE9SVCMjbnIjI19GTjYsIFBPUlQjI25yIyNfRk43IH0JCVwKLQl9Ci0KIHN0YXRpYyBzdHJ1Y3QgcGlubXV4X2NmZ19yZWcgcGlubXV4X2NvbmZpZ19yZWdzW10gPSB7CiAJUE9SVENSKDAsIDB4ZTYwNTAwMDApLCAvKiBQT1JUMENSICovCiAJUE9SVENSKDEsIDB4ZTYwNTAwMDEpLCAvKiBQT1JUMUNSICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczNzIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGZjLXNoNzM3Mi5jCmluZGV4IDljMjY1ZGEuLjFiZDY1ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGZjLXNoNzM3Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGZjLXNoNzM3Mi5jCkBAIC0yNSwyNyArMjUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9zaDczNzIuaD4KIAotI2RlZmluZSBfMShmbiwgcGZ4LCBzZngpIGZuKHBmeCwgc2Z4KQotCi0jZGVmaW5lIF8xMChmbiwgcGZ4LCBzZngpCQkJCVwKLQlfMShmbiwgcGZ4IyMwLCBzZngpLCBfMShmbiwgcGZ4IyMxLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMiwgc2Z4KSwgXzEoZm4sIHBmeCMjMywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzQsIHNmeCksIF8xKGZuLCBwZngjIzUsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyM2LCBzZngpLCBfMShmbiwgcGZ4IyM3LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjOCwgc2Z4KSwgXzEoZm4sIHBmeCMjOSwgc2Z4KQotCi0jZGVmaW5lIF84MChmbiwgcGZ4LCBzZngpCQkJCVwKLQlfMTAoZm4sIHBmeCMjMSwgc2Z4KSwJXzEwKGZuLCBwZngjIzIsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMywgc2Z4KSwJXzEwKGZuLCBwZngjIzQsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjNSwgc2Z4KSwJXzEwKGZuLCBwZngjIzYsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjNywgc2Z4KSwJXzEwKGZuLCBwZngjIzgsIHNmeCkKLQotI2RlZmluZSBfMTkwKGZuLCBwZngsIHNmeCkgXAotCV8xMChmbiwgcGZ4LCBzZngpLCBfODAoZm4sIHBmeCwgc2Z4KSwgXzEwKGZuLCBwZngjIzksIHNmeCksIFwKLQlfMTAoZm4sIHBmeCMjMTAsIHNmeCksIF84MChmbiwgcGZ4IyMxLCBzZngpLCBfMShmbiwgcGZ4IyMxOTAsIHNmeCkKLQotI2RlZmluZSBfUE9SVChwZngsIHNmeCkgcGZ4IyNfIyNzZngKLSNkZWZpbmUgUE9SVF9BTEwoc3RyKSBfMTkwKF9QT1JULCBQT1JULCBzdHIpCisjZGVmaW5lIENQVV9BTExfUE9SVChmbiwgcGZ4LCBzZngpIFwKKwlQT1JUXzEwKGZuLCBwZngsIHNmeCksCQlQT1JUXzkwKGZuLCBwZngsIHNmeCksIFwKKwlQT1JUXzEwKGZuLCBwZngjIzEwLCBzZngpLAlQT1JUXzEwKGZuLCBwZngjIzExLCBzZngpLCBcCisJUE9SVF8xMChmbiwgcGZ4IyMxMiwgc2Z4KSwJUE9SVF8xMChmbiwgcGZ4IyMxMywgc2Z4KSwgXAorCVBPUlRfMTAoZm4sIHBmeCMjMTQsIHNmeCksCVBPUlRfMTAoZm4sIHBmeCMjMTUsIHNmeCksIFwKKwlQT1JUXzEwKGZuLCBwZngjIzE2LCBzZngpLAlQT1JUXzEwKGZuLCBwZngjIzE3LCBzZngpLCBcCisJUE9SVF8xMChmbiwgcGZ4IyMxOCwgc2Z4KSwJUE9SVF8xKGZuLCBwZngjIzE5MCwgc2Z4KQogCiBlbnVtIHsKIAlQSU5NVVhfUkVTRVJWRUQgPSAwLApAQCAtMzgxLDEwOCArMzY3LDEyNCBAQAogCVBJTk1VWF9NQVJLX0VORCwKIH07CiAKLS8qIFBPUlRfREFUQV9JX1BEKG5yKSAqLwotI2RlZmluZSBfSV9fX0QobnIpCQkJICAgICBcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgXAotCQkgICAgUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCkKLQotLyogUE9SVF9EQVRBX0lfUFUobnIpICovCi0jZGVmaW5lIF9JX19VXyhucikJCQkgICAgIFwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BVKQotCi0vKiBQT1JUX0RBVEFfSV9QVV9QRChucikgKi8KLSNkZWZpbmUgX0lfX1VEKG5yKQkJCSAgICAgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFwKLQkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQsIFBPUlQjI25yIyNfSU5fUFUpCi0KLS8qIFBPUlRfREFUQV9PKG5yKSAqLwotI2RlZmluZSBfX09fX18obnIpCQkJCQkJCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX09VVCkKLQotLyogUE9SVF9EQVRBX0lPKG5yKSAqLwotI2RlZmluZSBfSU9fX18obnIpCQkJCSAgICAgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VULCBcCi0JCSAgICBQT1JUIyNuciMjX0lOKQotCi0vKiBQT1JUX0RBVEFfSU9fUEQobnIpICovCi0jZGVmaW5lIF9JT19fRChucikJCQkJCSAgICAgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VULCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BEKQotCi0vKiBQT1JUX0RBVEFfSU9fUFUobnIpICovCi0jZGVmaW5lIF9JT19VXyhucikJCQkJCSAgICAgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VULCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BVKQotCi0vKiBQT1JUX0RBVEFfSU9fUFVfUEQobnIpICovCi0jZGVmaW5lIF9JT19VRChucikJCQkJCSAgICAgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VULCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BELCBQT1JUIyNuciMjX0lOX1BVKQotCi0KIHN0YXRpYyBwaW5tdXhfZW51bV90IHBpbm11eF9kYXRhW10gPSB7CiAKIAkvKiBzcGVjaWZ5IHZhbGlkIHBpbiBzdGF0ZXMgZm9yIGVhY2ggcGluIGluIEdQSU8gbW9kZSAqLworCVBPUlRfREFUQV9JT19QRCgwKSwJCVBPUlRfREFUQV9JT19QRCgxKSwKKwlQT1JUX0RBVEFfTygyKSwJCQlQT1JUX0RBVEFfSV9QRCgzKSwKKwlQT1JUX0RBVEFfSV9QRCg0KSwJCVBPUlRfREFUQV9JX1BEKDUpLAorCVBPUlRfREFUQV9JT19QVV9QRCg2KSwJCVBPUlRfREFUQV9JX1BEKDcpLAorCVBPUlRfREFUQV9JT19QRCg4KSwJCVBPUlRfREFUQV9PKDkpLAogCi0JX0lPX19EKDApLCBfSU9fX0QoMSksIF9fT19fXygyKSwgX0lfX19EKDMpLCBfSV9fX0QoNCksCi0JX0lfX19EKDUpLCBfSU9fVUQoNiksIF9JX19fRCg3KSwgX0lPX19EKDgpLCBfX09fX18oOSksCisJUE9SVF9EQVRBX08oMTApLAkJUE9SVF9EQVRBX08oMTEpLAorCVBPUlRfREFUQV9JT19QVV9QRCgxMiksCQlQT1JUX0RBVEFfSU9fUEQoMTMpLAorCVBPUlRfREFUQV9JT19QRCgxNCksCQlQT1JUX0RBVEFfTygxNSksCisJUE9SVF9EQVRBX0lPX1BEKDE2KSwJCVBPUlRfREFUQV9JT19QRCgxNyksCisJUE9SVF9EQVRBX0lfUEQoMTgpLAkJUE9SVF9EQVRBX0lPKDE5KSwKIAotCV9fT19fXygxMCksIF9fT19fXygxMSksIF9JT19VRCgxMiksIF9JT19fRCgxMyksIF9JT19fRCgxNCksCi0JX19PX19fKDE1KSwgX0lPX19EKDE2KSwgX0lPX19EKDE3KSwgX0lfX19EKDE4KSwgX0lPX19fKDE5KSwKKwlQT1JUX0RBVEFfSU8oMjApLAkJUE9SVF9EQVRBX0lPKDIxKSwKKwlQT1JUX0RBVEFfSU8oMjIpLAkJUE9SVF9EQVRBX0lPKDIzKSwKKwlQT1JUX0RBVEFfSU8oMjQpLAkJUE9SVF9EQVRBX0lPKDI1KSwKKwlQT1JUX0RBVEFfSU8oMjYpLAkJUE9SVF9EQVRBX0lPKDI3KSwKKwlQT1JUX0RBVEFfSU8oMjgpLAkJUE9SVF9EQVRBX0lPKDI5KSwKIAotCV9JT19fXygyMCksIF9JT19fXygyMSksIF9JT19fXygyMiksIF9JT19fXygyMyksIF9JT19fXygyNCksCi0JX0lPX19fKDI1KSwgX0lPX19fKDI2KSwgX0lPX19fKDI3KSwgX0lPX19fKDI4KSwgX0lPX19fKDI5KSwKKwlQT1JUX0RBVEFfSU8oMzApLAkJUE9SVF9EQVRBX0lPKDMxKSwKKwlQT1JUX0RBVEFfSU8oMzIpLAkJUE9SVF9EQVRBX0lPKDMzKSwKKwlQT1JUX0RBVEFfSU8oMzQpLAkJUE9SVF9EQVRBX0lPKDM1KSwKKwlQT1JUX0RBVEFfSU8oMzYpLAkJUE9SVF9EQVRBX0lPKDM3KSwKKwlQT1JUX0RBVEFfSU8oMzgpLAkJUE9SVF9EQVRBX0lPKDM5KSwKIAotCV9JT19fXygzMCksIF9JT19fXygzMSksIF9JT19fXygzMiksIF9JT19fXygzMyksIF9JT19fXygzNCksCi0JX0lPX19fKDM1KSwgX0lPX19fKDM2KSwgX0lPX19fKDM3KSwgX0lPX19fKDM4KSwgX0lPX19fKDM5KSwKKwlQT1JUX0RBVEFfSU8oNDApLAkJUE9SVF9EQVRBX0lPKDQxKSwKKwlQT1JUX0RBVEFfSU8oNDIpLAkJUE9SVF9EQVRBX0lPKDQzKSwKKwlQT1JUX0RBVEFfSU8oNDQpLAkJUE9SVF9EQVRBX0lPKDQ1KSwKKwlQT1JUX0RBVEFfSU9fUFUoNDYpLAkJUE9SVF9EQVRBX0lPX1BVKDQ3KSwKKwlQT1JUX0RBVEFfSU9fUFUoNDgpLAkJUE9SVF9EQVRBX0lPX1BVKDQ5KSwKIAotCV9JT19fXyg0MCksIF9JT19fXyg0MSksIF9JT19fXyg0MiksIF9JT19fXyg0MyksIF9JT19fXyg0NCksCi0JX0lPX19fKDQ1KSwgX0lPX1VfKDQ2KSwgX0lPX1VfKDQ3KSwgX0lPX1VfKDQ4KSwgX0lPX1VfKDQ5KSwKKwlQT1JUX0RBVEFfSU9fUFUoNTApLAkJUE9SVF9EQVRBX0lPX1BVKDUxKSwKKwlQT1JUX0RBVEFfSU9fUFUoNTIpLAkJUE9SVF9EQVRBX0lPX1BVKDUzKSwKKwlQT1JUX0RBVEFfSU9fUFUoNTQpLAkJUE9SVF9EQVRBX0lPX1BVKDU1KSwKKwlQT1JUX0RBVEFfSU9fUFUoNTYpLAkJUE9SVF9EQVRBX0lPX1BVKDU3KSwKKwlQT1JUX0RBVEFfSU9fUFUoNTgpLAkJUE9SVF9EQVRBX0lPX1BVKDU5KSwKIAotCV9JT19VXyg1MCksIF9JT19VXyg1MSksIF9JT19VXyg1MiksIF9JT19VXyg1MyksIF9JT19VXyg1NCksCi0JX0lPX1VfKDU1KSwgX0lPX1VfKDU2KSwgX0lPX1VfKDU3KSwgX0lPX1VfKDU4KSwgX0lPX1VfKDU5KSwKKwlQT1JUX0RBVEFfSU9fUFUoNjApLAkJUE9SVF9EQVRBX0lPX1BVKDYxKSwKKwlQT1JUX0RBVEFfSU8oNjIpLAkJUE9SVF9EQVRBX08oNjMpLAorCVBPUlRfREFUQV9PKDY0KSwJCVBPUlRfREFUQV9JT19QVSg2NSksCisJUE9SVF9EQVRBX08oNjYpLAkJUE9SVF9EQVRBX0lPX1BVKDY3KSwgIC8qNjY/Ki8KKwlQT1JUX0RBVEFfTyg2OCksCQlQT1JUX0RBVEFfSU8oNjkpLAogCi0JX0lPX1VfKDYwKSwgX0lPX1VfKDYxKSwgX0lPX19fKDYyKSwgX19PX19fKDYzKSwgX19PX19fKDY0KSwKLQlfSU9fVV8oNjUpLCBfX09fX18oNjYpLCBfSU9fVV8oNjcpLCBfX09fX18oNjgpLCBfSU9fX18oNjkpLCAvKjY2PyovCisJUE9SVF9EQVRBX0lPKDcwKSwJCVBPUlRfREFUQV9JTyg3MSksCisJUE9SVF9EQVRBX08oNzIpLAkJUE9SVF9EQVRBX0lfUFUoNzMpLAorCVBPUlRfREFUQV9JX1BVX1BEKDc0KSwJCVBPUlRfREFUQV9JT19QVV9QRCg3NSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDc2KSwJCVBPUlRfREFUQV9JT19QVV9QRCg3NyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDc4KSwJCVBPUlRfREFUQV9JT19QVV9QRCg3OSksCiAKLQlfSU9fX18oNzApLCBfSU9fX18oNzEpLCBfX09fX18oNzIpLCBfSV9fVV8oNzMpLCBfSV9fVUQoNzQpLAotCV9JT19VRCg3NSksIF9JT19VRCg3NiksIF9JT19VRCg3NyksIF9JT19VRCg3OCksIF9JT19VRCg3OSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDgwKSwJCVBPUlRfREFUQV9JT19QVV9QRCg4MSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDgyKSwJCVBPUlRfREFUQV9JT19QVV9QRCg4MyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDg0KSwJCVBPUlRfREFUQV9JT19QVV9QRCg4NSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDg2KSwJCVBPUlRfREFUQV9JT19QVV9QRCg4NyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDg4KSwJCVBPUlRfREFUQV9JT19QVV9QRCg4OSksCiAKLQlfSU9fVUQoODApLCBfSU9fVUQoODEpLCBfSU9fVUQoODIpLCBfSU9fVUQoODMpLCBfSU9fVUQoODQpLAotCV9JT19VRCg4NSksIF9JT19VRCg4NiksIF9JT19VRCg4NyksIF9JT19VRCg4OCksIF9JT19VRCg4OSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDkwKSwJCVBPUlRfREFUQV9JT19QVV9QRCg5MSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDkyKSwJCVBPUlRfREFUQV9JT19QVV9QRCg5MyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDk0KSwJCVBPUlRfREFUQV9JT19QVV9QRCg5NSksCisJUE9SVF9EQVRBX0lPX1BVKDk2KSwJCVBPUlRfREFUQV9JT19QVV9QRCg5NyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDk4KSwJCVBPUlRfREFUQV9PKDk5KSwgLyo5OT8qLwogCi0JX0lPX1VEKDkwKSwgX0lPX1VEKDkxKSwgX0lPX1VEKDkyKSwgX0lPX1VEKDkzKSwgX0lPX1VEKDk0KSwKLQlfSU9fVUQoOTUpLCBfSU9fVV8oOTYpLCBfSU9fVUQoOTcpLCBfSU9fVUQoOTgpLCBfX09fX18oOTkpLCAvKjk5PyovCisJUE9SVF9EQVRBX0lPX1BEKDEwMCksCQlQT1JUX0RBVEFfSU9fUEQoMTAxKSwKKwlQT1JUX0RBVEFfSU9fUEQoMTAyKSwJCVBPUlRfREFUQV9JT19QRCgxMDMpLAorCVBPUlRfREFUQV9JT19QRCgxMDQpLAkJUE9SVF9EQVRBX0lPX1BEKDEwNSksCisJUE9SVF9EQVRBX0lPX1BVKDEwNiksCQlQT1JUX0RBVEFfSU9fUFUoMTA3KSwKKwlQT1JUX0RBVEFfSU9fUFUoMTA4KSwJCVBPUlRfREFUQV9JT19QVSgxMDkpLAogCi0JX0lPX19EKDEwMCksIF9JT19fRCgxMDEpLCBfSU9fX0QoMTAyKSwgX0lPX19EKDEwMyksIF9JT19fRCgxMDQpLAotCV9JT19fRCgxMDUpLCBfSU9fVV8oMTA2KSwgX0lPX1VfKDEwNyksIF9JT19VXygxMDgpLCBfSU9fVV8oMTA5KSwKKwlQT1JUX0RBVEFfSU9fUFUoMTEwKSwJCVBPUlRfREFUQV9JT19QVSgxMTEpLAorCVBPUlRfREFUQV9JT19QRCgxMTIpLAkJUE9SVF9EQVRBX0lPX1BEKDExMyksCisJUE9SVF9EQVRBX0lPX1BVKDExNCksCQlQT1JUX0RBVEFfSU9fUFUoMTE1KSwKKwlQT1JUX0RBVEFfSU9fUFUoMTE2KSwJCVBPUlRfREFUQV9JT19QVSgxMTcpLAorCVBPUlRfREFUQV9JT19QVSgxMTgpLAkJUE9SVF9EQVRBX0lPX1BVKDExOSksCiAKLQlfSU9fVV8oMTEwKSwgX0lPX1VfKDExMSksIF9JT19fRCgxMTIpLCBfSU9fX0QoMTEzKSwgX0lPX1VfKDExNCksCi0JX0lPX1VfKDExNSksIF9JT19VXygxMTYpLCBfSU9fVV8oMTE3KSwgX0lPX1VfKDExOCksIF9JT19VXygxMTkpLAorCVBPUlRfREFUQV9JT19QVSgxMjApLAkJUE9SVF9EQVRBX0lPX1BEKDEyMSksCisJUE9SVF9EQVRBX0lPX1BEKDEyMiksCQlQT1JUX0RBVEFfSU9fUEQoMTIzKSwKKwlQT1JUX0RBVEFfSU9fUEQoMTI0KSwJCVBPUlRfREFUQV9JT19QRCgxMjUpLAorCVBPUlRfREFUQV9JT19QRCgxMjYpLAkJUE9SVF9EQVRBX0lPX1BEKDEyNyksCisJUE9SVF9EQVRBX0lPX1BEKDEyOCksCQlQT1JUX0RBVEFfSU9fUFVfUEQoMTI5KSwKIAotCV9JT19VXygxMjApLCBfSU9fX0QoMTIxKSwgX0lPX19EKDEyMiksIF9JT19fRCgxMjMpLCBfSU9fX0QoMTI0KSwKLQlfSU9fX0QoMTI1KSwgX0lPX19EKDEyNiksIF9JT19fRCgxMjcpLCBfSU9fX0QoMTI4KSwgX0lPX1VEKDEyOSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDEzMCksCVBPUlRfREFUQV9JT19QVV9QRCgxMzEpLAorCVBPUlRfREFUQV9JT19QVV9QRCgxMzIpLAlQT1JUX0RBVEFfSU9fUFVfUEQoMTMzKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTM0KSwJUE9SVF9EQVRBX0lPX1BVX1BEKDEzNSksCisJUE9SVF9EQVRBX0lPX1BEKDEzNiksCQlQT1JUX0RBVEFfSU9fUEQoMTM3KSwKKwlQT1JUX0RBVEFfSU9fUEQoMTM4KSwJCVBPUlRfREFUQV9JT19QRCgxMzkpLAogCi0JX0lPX1VEKDEzMCksIF9JT19VRCgxMzEpLCBfSU9fVUQoMTMyKSwgX0lPX1VEKDEzMyksIF9JT19VRCgxMzQpLAotCV9JT19VRCgxMzUpLCBfSU9fX0QoMTM2KSwgX0lPX19EKDEzNyksIF9JT19fRCgxMzgpLCBfSU9fX0QoMTM5KSwKKwlQT1JUX0RBVEFfSU9fUEQoMTQwKSwJCVBPUlRfREFUQV9JT19QRCgxNDEpLAorCVBPUlRfREFUQV9JT19QRCgxNDIpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDE0MyksCisJUE9SVF9EQVRBX0lPX1BEKDE0NCksCQlQT1JUX0RBVEFfSU9fUEQoMTQ1KSwKKwlQT1JUX0RBVEFfSU9fUEQoMTQ2KSwJCVBPUlRfREFUQV9JT19QRCgxNDcpLAorCVBPUlRfREFUQV9JT19QRCgxNDgpLAkJUE9SVF9EQVRBX0lPX1BEKDE0OSksCiAKLQlfSU9fX0QoMTQwKSwgX0lPX19EKDE0MSksIF9JT19fRCgxNDIpLCBfSU9fVUQoMTQzKSwgX0lPX19EKDE0NCksCi0JX0lPX19EKDE0NSksIF9JT19fRCgxNDYpLCBfSU9fX0QoMTQ3KSwgX0lPX19EKDE0OCksIF9JT19fRCgxNDkpLAorCVBPUlRfREFUQV9JT19QRCgxNTApLAkJUE9SVF9EQVRBX0lPX1BEKDE1MSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDE1MiksCVBPUlRfREFUQV9JX1BEKDE1MyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDE1NCksCVBPUlRfREFUQV9JX1BEKDE1NSksCisJUE9SVF9EQVRBX0lPX1BEKDE1NiksCQlQT1JUX0RBVEFfSU9fUEQoMTU3KSwKKwlQT1JUX0RBVEFfSV9QRCgxNTgpLAkJUE9SVF9EQVRBX0lPX1BEKDE1OSksCiAKLQlfSU9fX0QoMTUwKSwgX0lPX19EKDE1MSksIF9JT19VRCgxNTIpLCBfSV9fX0QoMTUzKSwgX0lPX1VEKDE1NCksCi0JX0lfX19EKDE1NSksIF9JT19fRCgxNTYpLCBfSU9fX0QoMTU3KSwgX0lfX19EKDE1OCksIF9JT19fRCgxNTkpLAorCVBPUlRfREFUQV9PKDE2MCksCQlQT1JUX0RBVEFfSU9fUEQoMTYxKSwKKwlQT1JUX0RBVEFfSU9fUEQoMTYyKSwJCVBPUlRfREFUQV9JT19QRCgxNjMpLAorCVBPUlRfREFUQV9JX1BEKDE2NCksCQlQT1JUX0RBVEFfSU9fUEQoMTY1KSwKKwlQT1JUX0RBVEFfSV9QRCgxNjYpLAkJUE9SVF9EQVRBX0lfUEQoMTY3KSwKKwlQT1JUX0RBVEFfSV9QRCgxNjgpLAkJUE9SVF9EQVRBX0lfUEQoMTY5KSwKIAotCV9fT19fXygxNjApLCBfSU9fX0QoMTYxKSwgX0lPX19EKDE2MiksIF9JT19fRCgxNjMpLCBfSV9fX0QoMTY0KSwKLQlfSU9fX0QoMTY1KSwgX0lfX19EKDE2NiksIF9JX19fRCgxNjcpLCBfSV9fX0QoMTY4KSwgX0lfX19EKDE2OSksCisJUE9SVF9EQVRBX0lfUEQoMTcwKSwJCVBPUlRfREFUQV9PKDE3MSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDE3MiksCVBPUlRfREFUQV9JT19QVV9QRCgxNzMpLAorCVBPUlRfREFUQV9JT19QVV9QRCgxNzQpLAlQT1JUX0RBVEFfSU9fUFVfUEQoMTc1KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTc2KSwJUE9SVF9EQVRBX0lPX1BVX1BEKDE3NyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDE3OCksCVBPUlRfREFUQV9PKDE3OSksCiAKLQlfSV9fX0QoMTcwKSwgX19PX19fKDE3MSksIF9JT19VRCgxNzIpLCBfSU9fVUQoMTczKSwgX0lPX1VEKDE3NCksCi0JX0lPX1VEKDE3NSksIF9JT19VRCgxNzYpLCBfSU9fVUQoMTc3KSwgX0lPX1VEKDE3OCksIF9fT19fXygxNzkpLAorCVBPUlRfREFUQV9JT19QVV9QRCgxODApLAlQT1JUX0RBVEFfSU9fUFVfUEQoMTgxKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTgyKSwJUE9SVF9EQVRBX0lPX1BVX1BEKDE4MyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDE4NCksCVBPUlRfREFUQV9PKDE4NSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDE4NiksCVBPUlRfREFUQV9JT19QVV9QRCgxODcpLAorCVBPUlRfREFUQV9JT19QVV9QRCgxODgpLAlQT1JUX0RBVEFfSU9fUFVfUEQoMTg5KSwKIAotCV9JT19VRCgxODApLCBfSU9fVUQoMTgxKSwgX0lPX1VEKDE4MiksIF9JT19VRCgxODMpLCBfSU9fVUQoMTg0KSwKLQlfX09fX18oMTg1KSwgX0lPX1VEKDE4NiksIF9JT19VRCgxODcpLCBfSU9fVUQoMTg4KSwgX0lPX1VEKDE4OSksCi0KLQlfSU9fVUQoMTkwKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTkwKSwKIAogCS8qIElSUSAqLwogCVBJTk1VWF9EQVRBKElSUTBfNl9NQVJLLAlQT1JUNl9GTjAsIAlNU0VMMUNSXzBfMCksCkBAIC05MjYsMTAgKzkyOCw2IEBACiAJUElOTVVYX0RBVEEoTUZJdjRfTUFSSywJCU1TRUw0Q1JfNl8xKSwKIH07CiAKLSNkZWZpbmUgX0dQSU9fUE9SVChwZngsIHNmeCkgUElOTVVYX0dQSU8oR1BJT19QT1JUIyNwZngsIFBPUlQjI3BmeCMjX0RBVEEpCi0jZGVmaW5lIEdQSU9fUE9SVF9BTEwoKSBfMTkwKF9HUElPX1BPUlQsICwgdW51c2VkKQotI2RlZmluZSBHUElPX0ZOKHN0cikgUElOTVVYX0dQSU8oR1BJT19GTl8jI3N0ciwgc3RyIyNfTUFSSykKLQogc3RhdGljIHN0cnVjdCBwaW5tdXhfZ3BpbyBwaW5tdXhfZ3Bpb3NbXSA9IHsKIAogCS8qIFBPUlQgKi8KQEAgLTEyMDEsMjIgKzExOTksNiBAQAogCUdQSU9fRk4oU0RFTkNfRFZfQ0xLSSksCiB9OwogCi0vKiBoZWxwZXIgZm9yIHRvcCA0IGJpdHMgaW4gUE9SVG5DUiAqLwotI2RlZmluZSBQQ1JIKGluLCBpbl9wZCwgaW5fcHUsIG91dCkJCVwKLQkwLCAob3V0KSwgKGluKSwgMCwJCQlcCi0JMCwgMCwgMCwgMCwJCQkJXAotCTAsIDAsIChpbl9wZCksIDAsCQkJXAotCTAsIDAsIChpbl9wdSksIDAKLQotI2RlZmluZSBQT1JUQ1IobnIsIHJlZykJCQkJCQlcCi0JeyBQSU5NVVhfQ0ZHX1JFRygiUE9SVCIgbnIgIkNSIiwgcmVnLCA4LCA0KSB7CQlcCi0JCVBDUkgoUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCwJCVwKLQkJICAgICBQT1JUIyNuciMjX0lOX1BVLCBQT1JUIyNuciMjX09VVCksCQlcCi0JCVBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX0ZOMSwgUE9SVCMjbnIjI19GTjIsCVwKLQkJUE9SVCMjbnIjI19GTjMsCVBPUlQjI25yIyNfRk40LCBQT1JUIyNuciMjX0ZONSwJXAotCQlQT1JUIyNuciMjX0ZONiwgUE9SVCMjbnIjI19GTjcgfQkJXAotCX0KLQogc3RhdGljIHN0cnVjdCBwaW5tdXhfY2ZnX3JlZyBwaW5tdXhfY29uZmlnX3JlZ3NbXSA9IHsKIAlQT1JUQ1IoMCwJMHhFNjA1MTAwMCksIC8qIFBPUlQwQ1IgKi8KIAlQT1JUQ1IoMSwJMHhFNjA1MTAwMSksIC8qIFBPUlQxQ1IgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGZjLXNoNzM3Ny5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3Mzc3LmMKaW5kZXggNjEzZTY4NC4uMmYxMDUxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3Mzc3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3Mzc3LmMKQEAgLTIyLDg0ICsyMiw2NSBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3NoNzM3Ny5oPgogCi0jZGVmaW5lIF8xKGZuLCBwZngsIHNmeCkgZm4ocGZ4LCBzZngpCi0KLSNkZWZpbmUgXzEwKGZuLCBwZngsIHNmeCkJCQkJXAotCV8xKGZuLCBwZngjIzAsIHNmeCksIF8xKGZuLCBwZngjIzEsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMyLCBzZngpLCBfMShmbiwgcGZ4IyMzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjNCwgc2Z4KSwgXzEoZm4sIHBmeCMjNSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzYsIHNmeCksIF8xKGZuLCBwZngjIzcsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyM4LCBzZngpLCBfMShmbiwgcGZ4IyM5LCBzZngpCi0KLSNkZWZpbmUgXzkwKGZuLCBwZngsIHNmeCkJCQkJXAotCV8xMChmbiwgcGZ4IyMxLCBzZngpLCBfMTAoZm4sIHBmeCMjMiwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMzLCBzZngpLCBfMTAoZm4sIHBmeCMjNCwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM1LCBzZngpLCBfMTAoZm4sIHBmeCMjNiwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM3LCBzZngpLCBfMTAoZm4sIHBmeCMjOCwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM5LCBzZngpCi0KLSNkZWZpbmUgXzI2NShmbiwgcGZ4LCBzZngpCQkJCVwKLQlfMTAoZm4sIHBmeCwgc2Z4KSwgXzkwKGZuLCBwZngsIHNmeCksCQlcCi0JXzEwKGZuLCBwZngjIzEwLCBzZngpLAkJCQlcCi0JXzEoZm4sIHBmeCMjMTEwLCBzZngpLCBfMShmbiwgcGZ4IyMxMTEsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxMTIsIHNmeCksIF8xKGZuLCBwZngjIzExMywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzExNCwgc2Z4KSwgXzEoZm4sIHBmeCMjMTE1LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTE2LCBzZngpLCBfMShmbiwgcGZ4IyMxMTcsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxMTgsIHNmeCksCQkJCVwKLQlfMShmbiwgcGZ4IyMxMjgsIHNmeCksIF8xKGZuLCBwZngjIzEyOSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMxMywgc2Z4KSwgXzEwKGZuLCBwZngjIzE0LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzE1LCBzZngpLAkJCQlcCi0JXzEoZm4sIHBmeCMjMTYwLCBzZngpLCBfMShmbiwgcGZ4IyMxNjEsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxNjIsIHNmeCksIF8xKGZuLCBwZngjIzE2Mywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzE2NCwgc2Z4KSwJCQkJXAotCV8xKGZuLCBwZngjIzE5Miwgc2Z4KSwgXzEoZm4sIHBmeCMjMTkzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTk0LCBzZngpLCBfMShmbiwgcGZ4IyMxOTUsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxOTYsIHNmeCksIF8xKGZuLCBwZngjIzE5Nywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzE5OCwgc2Z4KSwgXzEoZm4sIHBmeCMjMTk5LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzIwLCBzZngpLCBfMTAoZm4sIHBmeCMjMjEsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMjIsIHNmeCksIF8xMChmbiwgcGZ4IyMyMywgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyNCwgc2Z4KSwgXzEwKGZuLCBwZngjIzI1LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMjYwLCBzZngpLCBfMShmbiwgcGZ4IyMyNjEsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMyNjIsIHNmeCksIF8xKGZuLCBwZngjIzI2Mywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzI2NCwgc2Z4KQotCi0jZGVmaW5lIF9QT1JUKHBmeCwgc2Z4KSBwZngjI18jI3NmeAotI2RlZmluZSBQT1JUXzI2NShzdHIpIF8yNjUoX1BPUlQsIFBPUlQsIHN0cikKKyNkZWZpbmUgQ1BVX0FMTF9QT1JUKGZuLCBwZngsIHNmeCkJCQkJXAorCVBPUlRfMTAoZm4sIHBmeCwgc2Z4KSwgUE9SVF85MChmbiwgcGZ4LCBzZngpLAkJXAorCVBPUlRfMTAoZm4sIHBmeCMjMTAsIHNmeCksCQkJCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTEwLCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTExLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzExMiwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzExMywgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxMTQsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxMTUsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTE2LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTE3LCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzExOCwgc2Z4KSwJCQkJXAorCVBPUlRfMShmbiwgcGZ4IyMxMjgsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxMjksIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzEzLCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzE0LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMxNSwgc2Z4KSwJCQkJXAorCVBPUlRfMShmbiwgcGZ4IyMxNjAsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxNjEsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTYyLCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTYzLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzE2NCwgc2Z4KSwJCQkJXAorCVBPUlRfMShmbiwgcGZ4IyMxOTIsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxOTMsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTk0LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTk1LCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzE5Niwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzE5Nywgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxOTgsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxOTksIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzIwLCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzIxLCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyMiwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMyMywgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMjQsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjMjUsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMjYwLCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMjYxLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzI2Miwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzI2Mywgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMyNjQsIHNmeCkKIAogZW51bSB7CiAJUElOTVVYX1JFU0VSVkVEID0gMCwKIAogCVBJTk1VWF9EQVRBX0JFR0lOLAotCVBPUlRfMjY1KERBVEEpLCAvKiBQT1JUMF9EQVRBIC0+IFBPUlQyNjRfREFUQSAqLworCVBPUlRfQUxMKERBVEEpLCAvKiBQT1JUMF9EQVRBIC0+IFBPUlQyNjRfREFUQSAqLwogCVBJTk1VWF9EQVRBX0VORCwKIAogCVBJTk1VWF9JTlBVVF9CRUdJTiwKLQlQT1JUXzI2NShJTiksIC8qIFBPUlQwX0lOIC0+IFBPUlQyNjRfSU4gKi8KKwlQT1JUX0FMTChJTiksIC8qIFBPUlQwX0lOIC0+IFBPUlQyNjRfSU4gKi8KIAlQSU5NVVhfSU5QVVRfRU5ELAogCiAJUElOTVVYX0lOUFVUX1BVTExVUF9CRUdJTiwKLQlQT1JUXzI2NShJTl9QVSksIC8qIFBPUlQwX0lOX1BVIC0+IFBPUlQyNjRfSU5fUFUgKi8KKwlQT1JUX0FMTChJTl9QVSksIC8qIFBPUlQwX0lOX1BVIC0+IFBPUlQyNjRfSU5fUFUgKi8KIAlQSU5NVVhfSU5QVVRfUFVMTFVQX0VORCwKIAogCVBJTk1VWF9JTlBVVF9QVUxMRE9XTl9CRUdJTiwKLQlQT1JUXzI2NShJTl9QRCksIC8qIFBPUlQwX0lOX1BEIC0+IFBPUlQyNjRfSU5fUEQgKi8KKwlQT1JUX0FMTChJTl9QRCksIC8qIFBPUlQwX0lOX1BEIC0+IFBPUlQyNjRfSU5fUEQgKi8KIAlQSU5NVVhfSU5QVVRfUFVMTERPV05fRU5ELAogCiAJUElOTVVYX09VVFBVVF9CRUdJTiwKLQlQT1JUXzI2NShPVVQpLCAvKiBQT1JUMF9PVVQgLT4gUE9SVDI2NF9PVVQgKi8KKwlQT1JUX0FMTChPVVQpLCAvKiBQT1JUMF9PVVQgLT4gUE9SVDI2NF9PVVQgKi8KIAlQSU5NVVhfT1VUUFVUX0VORCwKIAogCVBJTk1VWF9GVU5DVElPTl9CRUdJTiwKLQlQT1JUXzI2NShGTl9JTiksIC8qIFBPUlQwX0ZOX0lOIC0+IFBPUlQyNjRfRk5fSU4gKi8KLQlQT1JUXzI2NShGTl9PVVQpLCAvKiBQT1JUMF9GTl9PVVQgLT4gUE9SVDI2NF9GTl9PVVQgKi8KLQlQT1JUXzI2NShGTjApLCAvKiBQT1JUMF9GTjAgLT4gUE9SVDI2NF9GTjAgKi8KLQlQT1JUXzI2NShGTjEpLCAvKiBQT1JUMF9GTjEgLT4gUE9SVDI2NF9GTjEgKi8KLQlQT1JUXzI2NShGTjIpLCAvKiBQT1JUMF9GTjIgLT4gUE9SVDI2NF9GTjIgKi8KLQlQT1JUXzI2NShGTjMpLCAvKiBQT1JUMF9GTjMgLT4gUE9SVDI2NF9GTjMgKi8KLQlQT1JUXzI2NShGTjQpLCAvKiBQT1JUMF9GTjQgLT4gUE9SVDI2NF9GTjQgKi8KLQlQT1JUXzI2NShGTjUpLCAvKiBQT1JUMF9GTjUgLT4gUE9SVDI2NF9GTjUgKi8KLQlQT1JUXzI2NShGTjYpLCAvKiBQT1JUMF9GTjYgLT4gUE9SVDI2NF9GTjYgKi8KLQlQT1JUXzI2NShGTjcpLCAvKiBQT1JUMF9GTjcgLT4gUE9SVDI2NF9GTjcgKi8KKwlQT1JUX0FMTChGTl9JTiksIC8qIFBPUlQwX0ZOX0lOIC0+IFBPUlQyNjRfRk5fSU4gKi8KKwlQT1JUX0FMTChGTl9PVVQpLCAvKiBQT1JUMF9GTl9PVVQgLT4gUE9SVDI2NF9GTl9PVVQgKi8KKwlQT1JUX0FMTChGTjApLCAvKiBQT1JUMF9GTjAgLT4gUE9SVDI2NF9GTjAgKi8KKwlQT1JUX0FMTChGTjEpLCAvKiBQT1JUMF9GTjEgLT4gUE9SVDI2NF9GTjEgKi8KKwlQT1JUX0FMTChGTjIpLCAvKiBQT1JUMF9GTjIgLT4gUE9SVDI2NF9GTjIgKi8KKwlQT1JUX0FMTChGTjMpLCAvKiBQT1JUMF9GTjMgLT4gUE9SVDI2NF9GTjMgKi8KKwlQT1JUX0FMTChGTjQpLCAvKiBQT1JUMF9GTjQgLT4gUE9SVDI2NF9GTjQgKi8KKwlQT1JUX0FMTChGTjUpLCAvKiBQT1JUMF9GTjUgLT4gUE9SVDI2NF9GTjUgKi8KKwlQT1JUX0FMTChGTjYpLCAvKiBQT1JUMF9GTjYgLT4gUE9SVDI2NF9GTjYgKi8KKwlQT1JUX0FMTChGTjcpLCAvKiBQT1JUMF9GTjcgLT4gUE9SVDI2NF9GTjcgKi8KIAogCU1TRUxCQ1JfTVNFTDE3XzEsIE1TRUxCQ1JfTVNFTDE3XzAsCiAJTVNFTEJDUl9NU0VMMTZfMSwgTVNFTEJDUl9NU0VMMTZfMCwKQEAgLTM2MCw0NSArMzQxLDYgQEAKIAlQSU5NVVhfTUFSS19FTkQsCiB9OwogCi0jZGVmaW5lIFBPUlRfREFUQV9JKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19JTikKLQotI2RlZmluZSBQT1JUX0RBVEFfSV9QRChucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BEKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JX1BVKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUFUpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lfUFVfUEQobnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAlcCi0JCQkJUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCwJXAotCQkJCVBPUlQjI25yIyNfSU5fUFUpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX08obnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAlcCi0JCQkJUE9SVCMjbnIjI19PVVQpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lPKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfT1VULCBQT1JUIyNuciMjX0lOKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JT19QRChucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX09VVCwgUE9SVCMjbnIjI19JTiwJCVwKLQkJCQlQT1JUIyNuciMjX0lOX1BEKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JT19QVShucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX09VVCwgUE9SVCMjbnIjI19JTiwJCVwKLQkJCQlQT1JUIyNuciMjX0lOX1BVKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JT19QVV9QRChucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX09VVCwgUE9SVCMjbnIjI19JTiwJCVwKLQkJCQlQT1JUIyNuciMjX0lOX1BELCBQT1JUIyNuciMjX0lOX1BVKQotCiBzdGF0aWMgcGlubXV4X2VudW1fdCBwaW5tdXhfZGF0YVtdID0gewogCS8qIHNwZWNpZnkgdmFsaWQgcGluIHN0YXRlcyBmb3IgZWFjaCBwaW4gaW4gR1BJTyBtb2RlICovCiAJLyogNTUtMSAoR1BJTykgKi8KQEAgLTEwNzgsMTMgKzEwMjAsOSBAQAogCVBJTk1VWF9EQVRBKFJFU0VUT1VUU19NQVJLLCBQT1JUMjY0X0ZOMSksCiB9OwogCi0jZGVmaW5lIF9HUElPX1BPUlQocGZ4LCBzZngpIFBJTk1VWF9HUElPKEdQSU9fUE9SVCMjcGZ4LCBQT1JUIyNwZngjI19EQVRBKQotI2RlZmluZSBHUElPX1BPUlRfMjY1KCkgXzI2NShfR1BJT19QT1JULCAsIHVudXNlZCkKLSNkZWZpbmUgR1BJT19GTihzdHIpIFBJTk1VWF9HUElPKEdQSU9fRk5fIyNzdHIsIHN0ciMjX01BUkspCi0KIHN0YXRpYyBzdHJ1Y3QgcGlubXV4X2dwaW8gcGlubXV4X2dwaW9zW10gPSB7CiAJLyogNTUtMSAtPiA1NS01IChHUElPKSAqLwotCUdQSU9fUE9SVF8yNjUoKSwKKwlHUElPX1BPUlRfQUxMKCksCiAKIAkvKiBTcGVjaWFsIFB1bGwtdXAgLyBQdWxsLWRvd24gRnVuY3Rpb25zICovCiAJR1BJT19GTihQT1JUNjZfS0VZSU4wX1BVKSwgR1BJT19GTihQT1JUNjdfS0VZSU4xX1BVKSwKQEAgLTEzNjIsMjMgKzEzMDAsNiBAQAogCUdQSU9fRk4oUkVTRVRPVVRTKSwKIH07CiAKLS8qIGhlbHBlciBmb3IgdG9wIDQgYml0cyBpbiBQT1JUbkNSICovCi0jZGVmaW5lIFBDUkgoaW4sIGluX3BkLCBpbl9wdSwgb3V0KQlcCi0JMCwgKG91dCksIChpbiksIDAsCVwKLQkJMCwgMCwgMCwgMCwJXAotCQkwLCAwLCAoaW5fcGQpLCAwLAlcCi0JCTAsIDAsIChpbl9wdSksIDAKLQotI2RlZmluZSBQT1JUQ1IobnIsIHJlZykJXAotCXsgUElOTVVYX0NGR19SRUcoIlBPUlQiIG5yICJDUiIsIHJlZywgOCwgNCkgewlcCi0JCQlQQ1JIKFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQsCVwKLQkJCQkgUE9SVCMjbnIjI19JTl9QVSwgUE9SVCMjbnIjI19PVVQpLAlcCi0JCQkJUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfRk4xLAlcCi0JCQkJUE9SVCMjbnIjI19GTjIsIFBPUlQjI25yIyNfRk4zLAlcCi0JCQkJUE9SVCMjbnIjI19GTjQsIFBPUlQjI25yIyNfRk41LAlcCi0JCQkJUE9SVCMjbnIjI19GTjYsIFBPUlQjI25yIyNfRk43IH0JXAotCX0KLQogc3RhdGljIHN0cnVjdCBwaW5tdXhfY2ZnX3JlZyBwaW5tdXhfY29uZmlnX3JlZ3NbXSA9IHsKIAlQT1JUQ1IoMCwgMHhlNjA1MDAwMCksIC8qIFBPUlQwQ1IgKi8KIAlQT1JUQ1IoMSwgMHhlNjA1MDAwMSksIC8qIFBPUlQxQ1IgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGZjLXNoNzNhMC5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3M2EwLmMKaW5kZXggM2VlZDQ0ZS4uZTA1NjM0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3M2EwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3M2EwLmMKQEAgLTIyLDg0ICsyMiw3MyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3NoNzNhMC5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCi0jZGVmaW5lIF8xKGZuLCBwZngsIHNmeCkgZm4ocGZ4LCBzZngpCi0KLSNkZWZpbmUgXzEwKGZuLCBwZngsIHNmeCkJCQkJXAotCV8xKGZuLCBwZngjIzAsIHNmeCksIF8xKGZuLCBwZngjIzEsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMyLCBzZngpLCBfMShmbiwgcGZ4IyMzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjNCwgc2Z4KSwgXzEoZm4sIHBmeCMjNSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzYsIHNmeCksIF8xKGZuLCBwZngjIzcsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyM4LCBzZngpLCBfMShmbiwgcGZ4IyM5LCBzZngpCi0KLSNkZWZpbmUgXzMxMChmbiwgcGZ4LCBzZngpCQkJCVwKLQlfMTAoZm4sIHBmeCwgICAgc2Z4KSwgXzEwKGZuLCBwZngjIzEsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMiwgc2Z4KSwgXzEwKGZuLCBwZngjIzMsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjNCwgc2Z4KSwgXzEwKGZuLCBwZngjIzUsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjNiwgc2Z4KSwgXzEwKGZuLCBwZngjIzcsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjOCwgc2Z4KSwgXzEwKGZuLCBwZngjIzksIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMTAsIHNmeCksCQkJCVwKLQlfMShmbiwgcGZ4IyMxMTAsIHNmeCksIF8xKGZuLCBwZngjIzExMSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzExMiwgc2Z4KSwgXzEoZm4sIHBmeCMjMTEzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTE0LCBzZngpLCBfMShmbiwgcGZ4IyMxMTUsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxMTYsIHNmeCksIF8xKGZuLCBwZngjIzExNywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzExOCwgc2Z4KSwJCQkJXAotCV8xKGZuLCBwZngjIzEyOCwgc2Z4KSwgXzEoZm4sIHBmeCMjMTI5LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzEzLCBzZngpLCBfMTAoZm4sIHBmeCMjMTQsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMTUsIHNmeCksCQkJCVwKLQlfMShmbiwgcGZ4IyMxNjAsIHNmeCksIF8xKGZuLCBwZngjIzE2MSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzE2Miwgc2Z4KSwgXzEoZm4sIHBmeCMjMTYzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTY0LCBzZngpLAkJCQlcCi0JXzEoZm4sIHBmeCMjMTkyLCBzZngpLCBfMShmbiwgcGZ4IyMxOTMsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxOTQsIHNmeCksIF8xKGZuLCBwZngjIzE5NSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzE5Niwgc2Z4KSwgXzEoZm4sIHBmeCMjMTk3LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTk4LCBzZngpLCBfMShmbiwgcGZ4IyMxOTksIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMjAsIHNmeCksIF8xMChmbiwgcGZ4IyMyMSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyMiwgc2Z4KSwgXzEwKGZuLCBwZngjIzIzLCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzI0LCBzZngpLCBfMTAoZm4sIHBmeCMjMjUsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMjYsIHNmeCksIF8xMChmbiwgcGZ4IyMyNywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzI4MCwgc2Z4KSwgXzEoZm4sIHBmeCMjMjgxLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMjgyLCBzZngpLAkJCQlcCi0JXzEoZm4sIHBmeCMjMjg4LCBzZngpLCBfMShmbiwgcGZ4IyMyODksIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMjksIHNmeCksIF8xMChmbiwgcGZ4IyMzMCwgc2Z4KQotCi0jZGVmaW5lIF9QT1JUKHBmeCwgc2Z4KSBwZngjI18jI3NmeAotI2RlZmluZSBQT1JUXzMxMChzdHIpIF8zMTAoX1BPUlQsIFBPUlQsIHN0cikKKyNkZWZpbmUgQ1BVX0FMTF9QT1JUKGZuLCBwZngsIHNmeCkJCQkJXAorCVBPUlRfMTAoZm4sIHBmeCwgICAgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMxLCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyLCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzMsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzQsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjNSwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjNiwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyM3LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyM4LCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzksIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzEwLCBzZngpLAkJCQlcCisJUE9SVF8xKGZuLCBwZngjIzExMCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzExMSwgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxMTIsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxMTMsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTE0LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTE1LCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzExNiwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzExNywgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxMTgsIHNmeCksCQkJCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTI4LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTI5LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMxMywgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMxNCwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMTUsIHNmeCksCQkJCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTYwLCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTYxLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzE2Miwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzE2Mywgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxNjQsIHNmeCksCQkJCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTkyLCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTkzLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzE5NCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzE5NSwgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxOTYsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxOTcsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTk4LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTk5LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyMCwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMyMSwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMjIsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjMjMsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzI0LCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzI1LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyNiwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMyNywgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMyODAsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMyODEsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMjgyLCBzZngpLAkJCQlcCisJUE9SVF8xKGZuLCBwZngjIzI4OCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzI4OSwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMjksIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjMzAsIHNmeCkKIAogZW51bSB7CiAJUElOTVVYX1JFU0VSVkVEID0gMCwKIAogCVBJTk1VWF9EQVRBX0JFR0lOLAotCVBPUlRfMzEwKERBVEEpLAkJCS8qIFBPUlQwX0RBVEEgLT4gUE9SVDMwOV9EQVRBICovCisJUE9SVF9BTEwoREFUQSksCQkJLyogUE9SVDBfREFUQSAtPiBQT1JUMzA5X0RBVEEgKi8KIAlQSU5NVVhfREFUQV9FTkQsCiAKIAlQSU5NVVhfSU5QVVRfQkVHSU4sCi0JUE9SVF8zMTAoSU4pLAkJCS8qIFBPUlQwX0lOIC0+IFBPUlQzMDlfSU4gKi8KKwlQT1JUX0FMTChJTiksCQkJLyogUE9SVDBfSU4gLT4gUE9SVDMwOV9JTiAqLwogCVBJTk1VWF9JTlBVVF9FTkQsCiAKIAlQSU5NVVhfSU5QVVRfUFVMTFVQX0JFR0lOLAotCVBPUlRfMzEwKElOX1BVKSwJCS8qIFBPUlQwX0lOX1BVIC0+IFBPUlQzMDlfSU5fUFUgKi8KKwlQT1JUX0FMTChJTl9QVSksCQkvKiBQT1JUMF9JTl9QVSAtPiBQT1JUMzA5X0lOX1BVICovCiAJUElOTVVYX0lOUFVUX1BVTExVUF9FTkQsCiAKIAlQSU5NVVhfSU5QVVRfUFVMTERPV05fQkVHSU4sCi0JUE9SVF8zMTAoSU5fUEQpLAkJLyogUE9SVDBfSU5fUEQgLT4gUE9SVDMwOV9JTl9QRCAqLworCVBPUlRfQUxMKElOX1BEKSwJCS8qIFBPUlQwX0lOX1BEIC0+IFBPUlQzMDlfSU5fUEQgKi8KIAlQSU5NVVhfSU5QVVRfUFVMTERPV05fRU5ELAogCiAJUElOTVVYX09VVFBVVF9CRUdJTiwKLQlQT1JUXzMxMChPVVQpLAkJCS8qIFBPUlQwX09VVCAtPiBQT1JUMzA5X09VVCAqLworCVBPUlRfQUxMKE9VVCksCQkJLyogUE9SVDBfT1VUIC0+IFBPUlQzMDlfT1VUICovCiAJUElOTVVYX09VVFBVVF9FTkQsCiAKIAlQSU5NVVhfRlVOQ1RJT05fQkVHSU4sCi0JUE9SVF8zMTAoRk5fSU4pLAkJLyogUE9SVDBfRk5fSU4gLT4gUE9SVDMwOV9GTl9JTiAqLwotCVBPUlRfMzEwKEZOX09VVCksCQkvKiBQT1JUMF9GTl9PVVQgLT4gUE9SVDMwOV9GTl9PVVQgKi8KLQlQT1JUXzMxMChGTjApLAkJCS8qIFBPUlQwX0ZOMCAtPiBQT1JUMzA5X0ZOMCAqLwotCVBPUlRfMzEwKEZOMSksCQkJLyogUE9SVDBfRk4xIC0+IFBPUlQzMDlfRk4xICovCi0JUE9SVF8zMTAoRk4yKSwJCQkvKiBQT1JUMF9GTjIgLT4gUE9SVDMwOV9GTjIgKi8KLQlQT1JUXzMxMChGTjMpLAkJCS8qIFBPUlQwX0ZOMyAtPiBQT1JUMzA5X0ZOMyAqLwotCVBPUlRfMzEwKEZONCksCQkJLyogUE9SVDBfRk40IC0+IFBPUlQzMDlfRk40ICovCi0JUE9SVF8zMTAoRk41KSwJCQkvKiBQT1JUMF9GTjUgLT4gUE9SVDMwOV9GTjUgKi8KLQlQT1JUXzMxMChGTjYpLAkJCS8qIFBPUlQwX0ZONiAtPiBQT1JUMzA5X0ZONiAqLwotCVBPUlRfMzEwKEZONyksCQkJLyogUE9SVDBfRk43IC0+IFBPUlQzMDlfRk43ICovCisJUE9SVF9BTEwoRk5fSU4pLAkJLyogUE9SVDBfRk5fSU4gLT4gUE9SVDMwOV9GTl9JTiAqLworCVBPUlRfQUxMKEZOX09VVCksCQkvKiBQT1JUMF9GTl9PVVQgLT4gUE9SVDMwOV9GTl9PVVQgKi8KKwlQT1JUX0FMTChGTjApLAkJCS8qIFBPUlQwX0ZOMCAtPiBQT1JUMzA5X0ZOMCAqLworCVBPUlRfQUxMKEZOMSksCQkJLyogUE9SVDBfRk4xIC0+IFBPUlQzMDlfRk4xICovCisJUE9SVF9BTEwoRk4yKSwJCQkvKiBQT1JUMF9GTjIgLT4gUE9SVDMwOV9GTjIgKi8KKwlQT1JUX0FMTChGTjMpLAkJCS8qIFBPUlQwX0ZOMyAtPiBQT1JUMzA5X0ZOMyAqLworCVBPUlRfQUxMKEZONCksCQkJLyogUE9SVDBfRk40IC0+IFBPUlQzMDlfRk40ICovCisJUE9SVF9BTEwoRk41KSwJCQkvKiBQT1JUMF9GTjUgLT4gUE9SVDMwOV9GTjUgKi8KKwlQT1JUX0FMTChGTjYpLAkJCS8qIFBPUlQwX0ZONiAtPiBQT1JUMzA5X0ZONiAqLworCVBPUlRfQUxMKEZONyksCQkJLyogUE9SVDBfRk43IC0+IFBPUlQzMDlfRk43ICovCiAKIAlNU0VMMkNSX01TRUwxOV8wLCBNU0VMMkNSX01TRUwxOV8xLAogCU1TRUwyQ1JfTVNFTDE4XzAsIE1TRUwyQ1JfTVNFTDE4XzEsCkBAIC00ODgsMTMgKzQ3NywzNCBAQAogCUtFWUlONV9QVV9NQVJLLAogCUtFWUlONl9QVV9NQVJLLAogCUtFWUlON19QVV9NQVJLLAorCVNESElDRDBfUFVfTUFSSywKKwlTREhJRDBfMF9QVV9NQVJLLAorCVNESElEMF8xX1BVX01BUkssCisJU0RISUQwXzJfUFVfTUFSSywKKwlTREhJRDBfM19QVV9NQVJLLAorCVNESElDTUQwX1BVX01BUkssCisJU0RISVdQMF9QVV9NQVJLLAogCVNESElEMV8wX1BVX01BUkssCiAJU0RISUQxXzFfUFVfTUFSSywKIAlTREhJRDFfMl9QVV9NQVJLLAogCVNESElEMV8zX1BVX01BUkssCiAJU0RISUNNRDFfUFVfTUFSSywKKwlTREhJRDJfMF9QVV9NQVJLLAorCVNESElEMl8xX1BVX01BUkssCisJU0RISUQyXzJfUFVfTUFSSywKKwlTREhJRDJfM19QVV9NQVJLLAorCVNESElDTUQyX1BVX01BUkssCiAJTU1DQ01EMF9QVV9NQVJLLAogCU1NQ0NNRDFfUFVfTUFSSywKKwlNTUNEMF8wX1BVX01BUkssCisJTU1DRDBfMV9QVV9NQVJLLAorCU1NQ0QwXzJfUFVfTUFSSywKKwlNTUNEMF8zX1BVX01BUkssCisJTU1DRDBfNF9QVV9NQVJLLAorCU1NQ0QwXzVfUFVfTUFSSywKKwlNTUNEMF82X1BVX01BUkssCisJTU1DRDBfN19QVV9NQVJLLAorCUZTSUJJU0xEX1BVX01BUkssCiAJRlNJQUNLX1BVX01BUkssCiAJRlNJQUlMUl9QVV9NQVJLLAogCUZTSUFJQlRfUFVfTUFSSywKQEAgLTUwMyw0NSArNTEzLDYgQEAKIAlQSU5NVVhfTUFSS19FTkQsCiB9OwogCi0jZGVmaW5lIFBPUlRfREFUQV9JKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19JTikKLQotI2RlZmluZSBQT1JUX0RBVEFfSV9QRChucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BEKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JX1BVKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUFUpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lfUFVfUEQobnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAlcCi0JCQkJUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCwJXAotCQkJCVBPUlQjI25yIyNfSU5fUFUpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX08obnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAlcCi0JCQkJUE9SVCMjbnIjI19PVVQpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lPKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfT1VULCBQT1JUIyNuciMjX0lOKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JT19QRChucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX09VVCwgUE9SVCMjbnIjI19JTiwJCVwKLQkJCQlQT1JUIyNuciMjX0lOX1BEKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JT19QVShucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX09VVCwgUE9SVCMjbnIjI19JTiwJCVwKLQkJCQlQT1JUIyNuciMjX0lOX1BVKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JT19QVV9QRChucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX09VVCwgUE9SVCMjbnIjI19JTiwJCVwKLQkJCQlQT1JUIyNuciMjX0lOX1BELCBQT1JUIyNuciMjX0lOX1BVKQotCiBzdGF0aWMgcGlubXV4X2VudW1fdCBwaW5tdXhfZGF0YVtdID0gewogCS8qIHNwZWNpZnkgdmFsaWQgcGluIHN0YXRlcyBmb3IgZWFjaCBwaW4gaW4gR1BJTyBtb2RlICovCiAKQEAgLTEzODcsMTkgKzEzNTgsMjggQEAKIAlQSU5NVVhfREFUQShUU19TQ0s0X01BUkssIFBPUlQyNjhfRk4zKSwKIAlQSU5NVVhfREFUQShTREhJQ01EMl9NQVJLLCBQT1JUMjY5X0ZOMSksCiAJUElOTVVYX0RBVEEoTU1DQ0xLMF9NQVJLLCBQT1JUMjcwX0ZOMSwgTVNFTDRDUl9NU0VMMTVfMCksCi0JUElOTVVYX0RBVEEoTU1DRDBfMF9NQVJLLCBQT1JUMjcxX0ZOMSwgTVNFTDRDUl9NU0VMMTVfMCksCi0JUElOTVVYX0RBVEEoTU1DRDBfMV9NQVJLLCBQT1JUMjcyX0ZOMSwgTVNFTDRDUl9NU0VMMTVfMCksCi0JUElOTVVYX0RBVEEoTU1DRDBfMl9NQVJLLCBQT1JUMjczX0ZOMSwgTVNFTDRDUl9NU0VMMTVfMCksCi0JUElOTVVYX0RBVEEoTU1DRDBfM19NQVJLLCBQT1JUMjc0X0ZOMSwgTVNFTDRDUl9NU0VMMTVfMCksCi0JUElOTVVYX0RBVEEoTU1DRDBfNF9NQVJLLCBQT1JUMjc1X0ZOMSwgTVNFTDRDUl9NU0VMMTVfMCksIFwKKwlQSU5NVVhfREFUQShNTUNEMF8wX01BUkssIFBPUlQyNzFfRk4xLCBQT1JUMjcxX0lOX1BVLAorCQlNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNEMF8xX01BUkssIFBPUlQyNzJfRk4xLCBQT1JUMjcyX0lOX1BVLAorCQlNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNEMF8yX01BUkssIFBPUlQyNzNfRk4xLCBQT1JUMjczX0lOX1BVLAorCQlNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNEMF8zX01BUkssIFBPUlQyNzRfRk4xLCBQT1JUMjc0X0lOX1BVLAorCQlNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNEMF80X01BUkssIFBPUlQyNzVfRk4xLCBQT1JUMjc1X0lOX1BVLAorCQlNU0VMNENSX01TRUwxNV8wKSwgXAogCVBJTk1VWF9EQVRBKFRTX1NQU1lOQzVfTUFSSywgUE9SVDI3NV9GTjMpLAotCVBJTk1VWF9EQVRBKE1NQ0QwXzVfTUFSSywgUE9SVDI3Nl9GTjEsIE1TRUw0Q1JfTVNFTDE1XzApLCBcCisJUElOTVVYX0RBVEEoTU1DRDBfNV9NQVJLLCBQT1JUMjc2X0ZOMSwgUE9SVDI3Nl9JTl9QVSwKKwkJTVNFTDRDUl9NU0VMMTVfMCksIFwKIAlQSU5NVVhfREFUQShUU19TREFUNV9NQVJLLCBQT1JUMjc2X0ZOMyksCi0JUElOTVVYX0RBVEEoTU1DRDBfNl9NQVJLLCBQT1JUMjc3X0ZOMSwgTVNFTDRDUl9NU0VMMTVfMCksIFwKKwlQSU5NVVhfREFUQShNTUNEMF82X01BUkssIFBPUlQyNzdfRk4xLCBQT1JUMjc3X0lOX1BVLAorCQlNU0VMNENSX01TRUwxNV8wKSwgXAogCVBJTk1VWF9EQVRBKFRTX1NERU41X01BUkssIFBPUlQyNzdfRk4zKSwKLQlQSU5NVVhfREFUQShNTUNEMF83X01BUkssIFBPUlQyNzhfRk4xLCBNU0VMNENSX01TRUwxNV8wKSwgXAorCVBJTk1VWF9EQVRBKE1NQ0QwXzdfTUFSSywgUE9SVDI3OF9GTjEsIFBPUlQyNzhfSU5fUFUsCisJCU1TRUw0Q1JfTVNFTDE1XzApLCBcCiAJUElOTVVYX0RBVEEoVFNfU0NLNV9NQVJLLCBQT1JUMjc4X0ZOMyksCi0JUElOTVVYX0RBVEEoTU1DQ01EMF9NQVJLLCBQT1JUMjc5X0ZOMSwgTVNFTDRDUl9NU0VMMTVfMCksCisJUElOTVVYX0RBVEEoTU1DQ01EMF9NQVJLLCBQT1JUMjc5X0ZOMSwgUE9SVDI3OV9JTl9QVSwKKwkJTVNFTDRDUl9NU0VMMTVfMCksCiAJUElOTVVYX0RBVEEoUkVTRVRPVVRTX19NQVJLLCBQT1JUMjgxX0ZOMSksIFwKIAlQSU5NVVhfREFUQShFWFRBTDJPVVRfTUFSSywgUE9SVDI4MV9GTjIpLAogCVBJTk1VWF9EQVRBKE1DUF9XQUlUX19NQ1BfRlJCX01BUkssIFBPUlQyODhfRk4xKSwKQEAgLTE1MTYsMjggKzE0OTYsNTUgQEAKIAlQSU5NVVhfREFUQShLRVlJTjZfUFVfTUFSSywgUE9SVDcyX0ZOMiwgUE9SVDcyX0lOX1BVKSwKIAlQSU5NVVhfREFUQShLRVlJTjdfUFVfTUFSSywgUE9SVDczX0ZOMiwgUE9SVDczX0lOX1BVKSwKIAotCVBJTk1VWF9EQVRBKFNESElEMV8wX1BVX01BUkssIFBPUlQyNTlfSU5fUFUsIFBPUlQyNTlfRk4xKSwKLQlQSU5NVVhfREFUQShTREhJRDFfMV9QVV9NQVJLLCBQT1JUMjYwX0lOX1BVLCBQT1JUMjYwX0ZOMSksCi0JUElOTVVYX0RBVEEoU0RISUQxXzJfUFVfTUFSSywgUE9SVDI2MV9JTl9QVSwgUE9SVDI2MV9GTjEpLAotCVBJTk1VWF9EQVRBKFNESElEMV8zX1BVX01BUkssIFBPUlQyNjJfSU5fUFUsIFBPUlQyNjJfRk4xKSwKLQlQSU5NVVhfREFUQShTREhJQ01EMV9QVV9NQVJLLCBQT1JUMjYzX0lOX1BVLCBQT1JUMjYzX0ZOMSksCisJUElOTVVYX0RBVEEoU0RISUNEMF9QVV9NQVJLLCAgUE9SVDI1MV9GTjEsIFBPUlQyNTFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElEMF8wX1BVX01BUkssIFBPUlQyNTJfRk4xLCBQT1JUMjUyX0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJRDBfMV9QVV9NQVJLLCBQT1JUMjUzX0ZOMSwgUE9SVDI1M19JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUQwXzJfUFVfTUFSSywgUE9SVDI1NF9GTjEsIFBPUlQyNTRfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElEMF8zX1BVX01BUkssIFBPUlQyNTVfRk4xLCBQT1JUMjU1X0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJQ01EMF9QVV9NQVJLLCBQT1JUMjU2X0ZOMSwgUE9SVDI1Nl9JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISVdQMF9QVV9NQVJLLCAgUE9SVDI1N19GTjEsIFBPUlQyNTZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElEMV8wX1BVX01BUkssIFBPUlQyNTlfRk4xLCBQT1JUMjU5X0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJRDFfMV9QVV9NQVJLLCBQT1JUMjYwX0ZOMSwgUE9SVDI2MF9JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUQxXzJfUFVfTUFSSywgUE9SVDI2MV9GTjEsIFBPUlQyNjFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElEMV8zX1BVX01BUkssIFBPUlQyNjJfRk4xLCBQT1JUMjYyX0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJQ01EMV9QVV9NQVJLLCBQT1JUMjYzX0ZOMSwgUE9SVDI2M19JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUQyXzBfUFVfTUFSSywgUE9SVDI2NV9GTjEsIFBPUlQyNjVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElEMl8xX1BVX01BUkssIFBPUlQyNjZfRk4xLCBQT1JUMjY2X0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJRDJfMl9QVV9NQVJLLCBQT1JUMjY3X0ZOMSwgUE9SVDI2N19JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUQyXzNfUFVfTUFSSywgUE9SVDI2OF9GTjEsIFBPUlQyNjhfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElDTUQyX1BVX01BUkssIFBPUlQyNjlfRk4xLCBQT1JUMjY5X0lOX1BVKSwKIAogCVBJTk1VWF9EQVRBKE1NQ0NNRDBfUFVfTUFSSywgUE9SVDI3OV9GTjEsIFBPUlQyNzlfSU5fUFUsCiAJCU1TRUw0Q1JfTVNFTDE1XzApLAotCVBJTk1VWF9EQVRBKE1NQ0NNRDFfUFVfTUFSSywgUE9SVDI5N19GTjIsIFBPUlQyNzlfSU5fUFUsCisJUElOTVVYX0RBVEEoTU1DQ01EMV9QVV9NQVJLLCBQT1JUMjk3X0ZOMiwgUE9SVDI5N19JTl9QVSwKIAkJTVNFTDRDUl9NU0VMMTVfMSksCisKKwlQSU5NVVhfREFUQShNTUNEMF8wX1BVX01BUkssCisJCSAgICBQT1JUMjcxX0ZOMSwgUE9SVDI3MV9JTl9QVSwgTVNFTDRDUl9NU0VMMTVfMCksCisJUElOTVVYX0RBVEEoTU1DRDBfMV9QVV9NQVJLLAorCQkgICAgUE9SVDI3Ml9GTjEsIFBPUlQyNzJfSU5fUFUsIE1TRUw0Q1JfTVNFTDE1XzApLAorCVBJTk1VWF9EQVRBKE1NQ0QwXzJfUFVfTUFSSywKKwkJICAgIFBPUlQyNzNfRk4xLCBQT1JUMjczX0lOX1BVLCBNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNEMF8zX1BVX01BUkssCisJCSAgICBQT1JUMjc0X0ZOMSwgUE9SVDI3NF9JTl9QVSwgTVNFTDRDUl9NU0VMMTVfMCksCisJUElOTVVYX0RBVEEoTU1DRDBfNF9QVV9NQVJLLAorCQkgICAgUE9SVDI3NV9GTjEsIFBPUlQyNzVfSU5fUFUsIE1TRUw0Q1JfTVNFTDE1XzApLAorCVBJTk1VWF9EQVRBKE1NQ0QwXzVfUFVfTUFSSywKKwkJICAgIFBPUlQyNzZfRk4xLCBQT1JUMjc2X0lOX1BVLCBNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNEMF82X1BVX01BUkssCisJCSAgICBQT1JUMjc3X0ZOMSwgUE9SVDI3N19JTl9QVSwgTVNFTDRDUl9NU0VMMTVfMCksCisJUElOTVVYX0RBVEEoTU1DRDBfN19QVV9NQVJLLAorCQkgICAgUE9SVDI3OF9GTjEsIFBPUlQyNzhfSU5fUFUsIE1TRUw0Q1JfTVNFTDE1XzApLAorCisJUElOTVVYX0RBVEEoRlNJQklTTERfUFVfTUFSSywgUE9SVDM5X0ZOMSwgUE9SVDM5X0lOX1BVKSwKIAlQSU5NVVhfREFUQShGU0lBQ0tfUFVfTUFSSywgUE9SVDQ5X0ZOMSwgUE9SVDQ5X0lOX1BVKSwKIAlQSU5NVVhfREFUQShGU0lBSUxSX1BVX01BUkssIFBPUlQ1MF9GTjUsIFBPUlQ1MF9JTl9QVSksCiAJUElOTVVYX0RBVEEoRlNJQUlCVF9QVV9NQVJLLCBQT1JUNTFfRk41LCBQT1JUNTFfSU5fUFUpLAogCVBJTk1VWF9EQVRBKEZTSUFJU0xEX1BVX01BUkssIFBPUlQ1NV9GTjEsIFBPUlQ1NV9JTl9QVSksCiB9OwogCi0jZGVmaW5lIF9HUElPX1BPUlQocGZ4LCBzZngpIFBJTk1VWF9HUElPKEdQSU9fUE9SVCMjcGZ4LCBQT1JUIyNwZngjI19EQVRBKQotI2RlZmluZSBHUElPX1BPUlRfMzEwKCkgXzMxMChfR1BJT19QT1JULCAsIHVudXNlZCkKLSNkZWZpbmUgR1BJT19GTihzdHIpIFBJTk1VWF9HUElPKEdQSU9fRk5fIyNzdHIsIHN0ciMjX01BUkspCi0KIHN0YXRpYyBzdHJ1Y3QgcGlubXV4X2dwaW8gcGlubXV4X2dwaW9zW10gPSB7Ci0JR1BJT19QT1JUXzMxMCgpLAorCUdQSU9fUE9SVF9BTEwoKSwKIAogCS8qIFRhYmxlIDI1LTEgKEZ1bmN0aW9ucyAwLTcpICovCiAJR1BJT19GTihWQlVTXzApLApAQCAtMjE4MSwzMSArMjE4OCwzOSBAQAogCUdQSU9fRk4oS0VZSU41X1BVKSwKIAlHUElPX0ZOKEtFWUlONl9QVSksCiAJR1BJT19GTihLRVlJTjdfUFUpLAorCUdQSU9fRk4oU0RISUNEMF9QVSksCisJR1BJT19GTihTREhJRDBfMF9QVSksCisJR1BJT19GTihTREhJRDBfMV9QVSksCisJR1BJT19GTihTREhJRDBfMl9QVSksCisJR1BJT19GTihTREhJRDBfM19QVSksCisJR1BJT19GTihTREhJQ01EMF9QVSksCisJR1BJT19GTihTREhJV1AwX1BVKSwKIAlHUElPX0ZOKFNESElEMV8wX1BVKSwKIAlHUElPX0ZOKFNESElEMV8xX1BVKSwKIAlHUElPX0ZOKFNESElEMV8yX1BVKSwKIAlHUElPX0ZOKFNESElEMV8zX1BVKSwKIAlHUElPX0ZOKFNESElDTUQxX1BVKSwKKwlHUElPX0ZOKFNESElEMl8wX1BVKSwKKwlHUElPX0ZOKFNESElEMl8xX1BVKSwKKwlHUElPX0ZOKFNESElEMl8yX1BVKSwKKwlHUElPX0ZOKFNESElEMl8zX1BVKSwKKwlHUElPX0ZOKFNESElDTUQyX1BVKSwKIAlHUElPX0ZOKE1NQ0NNRDBfUFUpLAogCUdQSU9fRk4oTU1DQ01EMV9QVSksCisJR1BJT19GTihNTUNEMF8wX1BVKSwKKwlHUElPX0ZOKE1NQ0QwXzFfUFUpLAorCUdQSU9fRk4oTU1DRDBfMl9QVSksCisJR1BJT19GTihNTUNEMF8zX1BVKSwKKwlHUElPX0ZOKE1NQ0QwXzRfUFUpLAorCUdQSU9fRk4oTU1DRDBfNV9QVSksCisJR1BJT19GTihNTUNEMF82X1BVKSwKKwlHUElPX0ZOKE1NQ0QwXzdfUFUpLAogCUdQSU9fRk4oRlNJQUNLX1BVKSwKIAlHUElPX0ZOKEZTSUFJTFJfUFUpLAogCUdQSU9fRk4oRlNJQUlCVF9QVSksCiAJR1BJT19GTihGU0lBSVNMRF9QVSksCiB9OwogCi0jZGVmaW5lIFBPUlRDUihuciwgcmVnKQlcCi0JeyBQSU5NVVhfQ0ZHX1JFRygiUE9SVCIgbnIgIkNSIiwgcmVnLCA4LCA0KSB7IFwKLQkJMCwgXAotCQkvKjAwMDEqLyBQT1JUIyNuciMjX09VVCAsIFwKLQkJLyowMDEwKi8gUE9SVCMjbnIjI19JTiAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwKLQkJLyoxMDEwKi8gUE9SVCMjbnIjI19JTl9QRCwgMCwgMCwgMCwgXAotCQkvKjExMTAqLyBQT1JUIyNuciMjX0lOX1BVLCAwLCBcCi0JCVBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX0ZOMSwJUE9SVCMjbnIjI19GTjIsIFwKLQkJUE9SVCMjbnIjI19GTjMsCVBPUlQjI25yIyNfRk40LCBQT1JUIyNuciMjX0ZONSwgXAotCQlQT1JUIyNuciMjX0ZONiwgUE9SVCMjbnIjI19GTjcsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSBcCi0JfQotCiBzdGF0aWMgc3RydWN0IHBpbm11eF9jZmdfcmVnIHBpbm11eF9jb25maWdfcmVnc1tdID0gewogCVBPUlRDUigwLCAweGU2MDUwMDAwKSwgLyogUE9SVDBDUiAqLwogCVBPUlRDUigxLCAweGU2MDUwMDAxKSwgLyogUE9SVDFDUiAqLwpAQCAtMjcxOCw2ICsyNzMzLDQ1IEBACiAJeyB9LAogfTsKIAorLyogSVJRIHBpbnMgdGhyb3VnaCBJTlRDUyB3aXRoIElSUTAtPjE1IGZyb20gMHgyMDAgYW5kIElSUTE2LTMxIGZyb20gMHgzMjAwICovCisjZGVmaW5lIEVYVF9JUlExNkwobikgaW50Y3NfZXZ0MmlycSgweDIwMCArICgobikgPDwgNSkpCisjZGVmaW5lIEVYVF9JUlExNkgobikgaW50Y3NfZXZ0MmlycSgweDMyMDAgKyAoKG4gLSAxNikgPDwgNSkpCisKK3N0YXRpYyBzdHJ1Y3QgcGlubXV4X2lycSBwaW5tdXhfaXJxc1tdID0geworCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgxOSksIFBPUlQ5X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDEpLCBQT1JUMTBfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkwoMCksIFBPUlQxMV9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgxOCksIFBPUlQxM19GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgyMCksIFBPUlQxNF9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgyMSksIFBPUlQxNV9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgzMSksIFBPUlQyNl9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgzMCksIFBPUlQyN19GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgyOSksIFBPUlQyOF9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgyMiksIFBPUlQ0MF9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgyMyksIFBPUlQ1M19GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCgxMCksIFBPUlQ1NF9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCg5KSwgUE9SVDU2X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDI2KSwgUE9SVDExNV9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgyNyksIFBPUlQxMTZfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkgoMjgpLCBQT1JUMTE3X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDI0KSwgUE9SVDExOF9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCg2KSwgUE9SVDE0N19GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCgyKSwgUE9SVDE0OV9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCg3KSwgUE9SVDE1MF9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCgxMiksIFBPUlQxNTZfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkwoNCksIFBPUlQxNTlfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkgoMjUpLCBQT1JUMTY0X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDgpLCBQT1JUMjIzX0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDMpLCBQT1JUMjI0X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDUpLCBQT1JUMjI3X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDE3KSwgUE9SVDIzNF9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCgxMSksIFBPUlQyMzhfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkwoMTMpLCBQT1JUMjM5X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDE2KSwgUE9SVDI0OV9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCgxNCksIFBPUlQyNTFfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkwoOSksIFBPUlQzMDhfRk4wKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGlubXV4X2luZm8gc2g3M2EwX3Bpbm11eF9pbmZvID0gewogCS5uYW1lID0gInNoNzNhMF9wZmMiLAogCS5yZXNlcnZlZF9pZCA9IFBJTk1VWF9SRVNFUlZFRCwKQEAgLTI3MzgsNiArMjc5Miw5IEBACiAKIAkuZ3Bpb19kYXRhID0gcGlubXV4X2RhdGEsCiAJLmdwaW9fZGF0YV9zaXplID0gQVJSQVlfU0laRShwaW5tdXhfZGF0YSksCisKKwkuZ3Bpb19pcnEgPSBwaW5tdXhfaXJxcywKKwkuZ3Bpb19pcnFfc2l6ZSA9IEFSUkFZX1NJWkUocGlubXV4X2lycXMpLAogfTsKIAogdm9pZCBzaDczYTBfcGlubXV4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLmMKaW5kZXggZTRlNDg1Zi4uYzQ5YTgzMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLmMKQEAgLTIxLDkgKzIxLDExIEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogCisjZGVmaW5lIGlzX3NoNzNhMCgpIChtYWNoaW5lX2lzX2FnNWV2bSgpIHx8IG1hY2hpbmVfaXNfa290YTIoKSkKKwogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgc2htb2JpbGVfc21wX2dldF9jb3JlX2NvdW50KHZvaWQpCiB7Ci0JaWYgKG1hY2hpbmVfaXNfYWc1ZXZtKCkpCisJaWYgKGlzX3NoNzNhMCgpKQogCQlyZXR1cm4gc2g3M2EwX2dldF9jb3JlX2NvdW50KCk7CiAKIAlyZXR1cm4gMTsKQEAgLTMxLDcgKzMzLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHNobW9iaWxlX3NtcF9wcmVwYXJlX2NwdXModm9pZCkKIHsKLQlpZiAobWFjaGluZV9pc19hZzVldm0oKSkKKwlpZiAoaXNfc2g3M2EwKCkpCiAJCXNoNzNhMF9zbXBfcHJlcGFyZV9jcHVzKCk7CiB9CiAKQEAgLTM5LDEzICs0MSwxMyBAQAogewogCXRyYWNlX2hhcmRpcnFzX29mZigpOwogCi0JaWYgKG1hY2hpbmVfaXNfYWc1ZXZtKCkpCisJaWYgKGlzX3NoNzNhMCgpKQogCQlzaDczYTBfc2Vjb25kYXJ5X2luaXQoY3B1KTsKIH0KIAogaW50IF9fY3B1aW5pdCBib290X3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCiB7Ci0JaWYgKG1hY2hpbmVfaXNfYWc1ZXZtKCkpCisJaWYgKGlzX3NoNzNhMCgpKQogCQlyZXR1cm4gc2g3M2EwX2Jvb3Rfc2Vjb25kYXJ5KGNwdSk7CiAKIAlyZXR1cm4gLUVOT1NZUzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcG0tc2g3MzcyLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BtLXNoNzM3Mi5jCmluZGV4IDc5NjEyNzMuLjBhNWIyMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcG0tc2g3MzcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbS1zaDczNzIuYwpAQCAtNDAyLDIyICs0MDIsMTggQEAKIAogI2lmZGVmIENPTkZJR19DUFVfSURMRQogCi1zdGF0aWMgdm9pZCBzaDczNzJfY3B1aWRsZV9zZXR1cChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHNoNzM3Ml9jcHVpZGxlX3NldHVwKHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZTsKLQlpbnQgaSA9IGRldi0+c3RhdGVfY291bnQ7CisJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlID0gJmRydi0+c3RhdGVzW2Rydi0+c3RhdGVfY291bnRdOwogCi0Jc3RhdGUgPSAmZGV2LT5zdGF0ZXNbaV07CiAJc25wcmludGYoc3RhdGUtPm5hbWUsIENQVUlETEVfTkFNRV9MRU4sICJDMiIpOwogCXN0cm5jcHkoc3RhdGUtPmRlc2MsICJDb3JlIFN0YW5kYnkgTW9kZSIsIENQVUlETEVfREVTQ19MRU4pOwogCXN0YXRlLT5leGl0X2xhdGVuY3kgPSAxMDsKIAlzdGF0ZS0+dGFyZ2V0X3Jlc2lkZW5jeSA9IDIwICsgMTA7Ci0Jc3RhdGUtPnBvd2VyX3VzYWdlID0gMTsgLyogcGVyaGFwcyBub3QgKi8KLQlzdGF0ZS0+ZmxhZ3MgPSAwOwotCXN0YXRlLT5mbGFncyB8PSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKLQlzaG1vYmlsZV9jcHVpZGxlX21vZGVzW2ldID0gc2g3MzcyX2VudGVyX2NvcmVfc3RhbmRieTsKKwlzdGF0ZS0+ZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKKwlzaG1vYmlsZV9jcHVpZGxlX21vZGVzW2Rydi0+c3RhdGVfY291bnRdID0gc2g3MzcyX2VudGVyX2NvcmVfc3RhbmRieTsKIAotCWRldi0+c3RhdGVfY291bnQgPSBpICsgMTsKKwlkcnYtPnN0YXRlX2NvdW50Kys7CiB9CiAKIHN0YXRpYyB2b2lkIHNoNzM3Ml9jcHVpZGxlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcG1fcnVudGltZS5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbV9ydW50aW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNWM2YTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbV9ydW50aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbV9ydW50aW1lLmMKLSAqCi0gKiBSdW50aW1lIFBNIHN1cHBvcnQgY29kZSBmb3IgU3VwZXJIIE1vYmlsZSBBUk0KLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWFnbnVzIERhbW0KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX2Nsb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvc2hfY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0bWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKLQotc3RhdGljIGludCBkZWZhdWx0X3BsYXRmb3JtX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JLyogc3VzcGVuZCBzeW5jaHJvbm91c2x5IHRvIGRpc2FibGUgY2xvY2tzIGltbWVkaWF0ZWx5ICovCi0JcmV0dXJuIHBtX3J1bnRpbWVfc3VzcGVuZChkZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGRldl9wbV9kb21haW4gZGVmYXVsdF9wbV9kb21haW4gPSB7Ci0JLm9wcyA9IHsKLQkJLnJ1bnRpbWVfc3VzcGVuZCA9IHBtX2Nsa19zdXNwZW5kLAotCQkucnVudGltZV9yZXN1bWUgPSBwbV9jbGtfcmVzdW1lLAotCQkucnVudGltZV9pZGxlID0gZGVmYXVsdF9wbGF0Zm9ybV9ydW50aW1lX2lkbGUsCi0JCVVTRV9QTEFURk9STV9QTV9TTEVFUF9PUFMKLQl9LAotfTsKLQotI2RlZmluZSBERUZBVUxUX1BNX0RPTUFJTl9QVFIJKCZkZWZhdWx0X3BtX2RvbWFpbikKLQotI2Vsc2UKLQotI2RlZmluZSBERUZBVUxUX1BNX0RPTUFJTl9QVFIJTlVMTAotCi0jZW5kaWYgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KLQotc3RhdGljIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgcGxhdGZvcm1fYnVzX25vdGlmaWVyID0gewotCS5wbV9kb21haW4gPSBERUZBVUxUX1BNX0RPTUFJTl9QVFIsCi0JLmNvbl9pZHMgPSB7IE5VTEwsIH0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzaF9wbV9ydW50aW1lX2luaXQodm9pZCkKLXsKLQlwbV9jbGtfYWRkX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJnBsYXRmb3JtX2J1c19ub3RpZmllcik7Ci0JcmV0dXJuIDA7Ci19Ci1jb3JlX2luaXRjYWxsKHNoX3BtX3J1bnRpbWVfaW5pdCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNoX3BtX3J1bnRpbWVfbGF0ZV9pbml0KHZvaWQpCi17Ci0JcG1fZ2VucGRfcG93ZXJvZmZfdW51c2VkKCk7Ci0JcmV0dXJuIDA7Ci19Ci1sYXRlX2luaXRjYWxsKHNoX3BtX3J1bnRpbWVfbGF0ZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc21wLXNoNzNhMC5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zbXAtc2g3M2EwLmMKaW5kZXggM2ZmZGJjOS4uYmUxYWRlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zbXAtc2g3M2EwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zbXAtc2g3M2EwLmMKQEAgLTc0LDYgKzc0LDggQEAKIAogaW50IF9fY3B1aW5pdCBzaDczYTBfYm9vdF9zZWNvbmRhcnkodW5zaWduZWQgaW50IGNwdSkKIHsKKwljcHUgPSBjcHVfbG9naWNhbF9tYXAoY3B1KTsKKwogCS8qIGVuYWJsZSBjYWNoZSBjb2hlcmVuY3kgKi8KIAltb2RpZnlfc2N1X2NwdV9wc3IoMCwgMyA8PCAoY3B1ICogOCkpOwogCkBAIC04Nyw2ICs4OSw4IEBACiAKIHZvaWQgX19pbml0IHNoNzNhMF9zbXBfcHJlcGFyZV9jcHVzKHZvaWQpCiB7CisJaW50IGNwdSA9IGNwdV9sb2dpY2FsX21hcCgwKTsKKwogCXNjdV9lbmFibGUoc2N1X2Jhc2VfYWRkcigpKTsKIAogCS8qIE1hcCB0aGUgcmVzZXQgdmVjdG9yIChpbiBoZWFkc21wLlMpICovCkBAIC05NCw1ICs5OCw1IEBACiAJX19yYXdfd3JpdGVsKF9fcGEoc2htb2JpbGVfc2Vjb25kYXJ5X3ZlY3RvciksIF9faW8oU0JBUikpOwogCiAJLyogZW5hYmxlIGNhY2hlIGNvaGVyZW5jeSBvbiBDUFUwICovCi0JbW9kaWZ5X3NjdV9jcHVfcHNyKDAsIDMgPDwgKDAgKiA4KSk7CisJbW9kaWZ5X3NjdV9jcHVfcHNyKDAsIDMgPDwgKGNwdSAqIDgpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzM1MjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBNZW1vcnkgbWFwIGZvciBTUEVBcjN4eCBtYWNoaW5lIGZhbWlseQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBTVCBNaWNyb2VsZWN0cm9uaWNzCi0gKiBWaXJlc2ggS3VtYXI8dmlyZXNoLmt1bWFyQHN0LmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpZm5kZWYgX19NQUNIX01FTU9SWV9ICi0jZGVmaW5lIF9fTUFDSF9NRU1PUllfSAotCi0jaW5jbHVkZSA8cGxhdC9tZW1vcnkuaD4KLQotI2VuZGlmIC8qIF9fTUFDSF9NRU1PUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMwMF9ldmIuYyBiL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMDBfZXZiLmMKaW5kZXggNjkwMDZmNi4uYTVmZjk4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMwMF9ldmIuYworKysgYi9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzAwX2V2Yi5jCkBAIC02NCw3ICs2NCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoU1BFQVIzMDAsICJTVC1TUEVBUjMwMC1FVkIiKQotCS5ib290X3BhcmFtcwk9CTB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0JMHgxMDAsCiAJLm1hcF9pbwkJPQlzcGVhcjN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0Jc3BlYXIzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9CSZzcGVhcjN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMTBfZXZiLmMgYi9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzEwX2V2Yi5jCmluZGV4IGM4Njg0Y2UuLjQ1ZDE4MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMTBfZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMxMF9ldmIuYwpAQCAtNzAsNyArNzAsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFNQRUFSMzEwLCAiU1QtU1BFQVIzMTAtRVZCIikKLQkuYm9vdF9wYXJhbXMJPQkweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9CTB4MTAwLAogCS5tYXBfaW8JCT0Jc3BlYXIzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9CXNwZWFyM3h4X2luaXRfaXJxLAogCS50aW1lcgkJPQkmc3BlYXIzeHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzIwX2V2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMyMF9ldmIuYwppbmRleCBhMTJiMzUzLi4yMjg3OTg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzIwX2V2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMjBfZXZiLmMKQEAgLTY4LDcgKzY4LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChTUEVBUjMyMCwgIlNULVNQRUFSMzIwLUVWQiIpCi0JLmJvb3RfcGFyYW1zCT0JMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPQkweDEwMCwKIAkubWFwX2lvCQk9CXNwZWFyM3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPQlzcGVhcjN4eF9pbml0X2lycSwKIAkudGltZXIJCT0JJnNwZWFyM3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zcGVhcjZ4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXNwZWFyNnh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxZjA4OC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXNwZWFyNnh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLXNwZWFyNnh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIE1lbW9yeSBtYXAgZm9yIFNQRUFyNnh4IG1hY2hpbmUgZmFtaWx5Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFNUIE1pY3JvZWxlY3Ryb25pY3MKLSAqIFJhamVldiBLdW1hcjxyYWplZXYtZGxoLmt1bWFyQHN0LmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpZm5kZWYgX19NQUNIX01FTU9SWV9ICi0jZGVmaW5lIF9fTUFDSF9NRU1PUllfSAotCi0jaW5jbHVkZSA8cGxhdC9tZW1vcnkuaD4KLQotI2VuZGlmCS8qIF9fTUFDSF9NRU1PUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zcGVhcjZ4eC9zcGVhcjYwMF9ldmIuYyBiL2FyY2gvYXJtL21hY2gtc3BlYXI2eHgvc3BlYXI2MDBfZXZiLmMKaW5kZXggZjE5Y2VmZS4uODIzOGZlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zcGVhcjZ4eC9zcGVhcjYwMF9ldmIuYworKysgYi9hcmNoL2FybS9tYWNoLXNwZWFyNnh4L3NwZWFyNjAwX2V2Yi5jCkBAIC00Myw3ICs0Myw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoU1BFQVI2MDAsICJTVC1TUEVBUjYwMC1FVkIiKQotCS5ib290X3BhcmFtcwk9CTB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0JMHgxMDAsCiAJLm1hcF9pbwkJPQlzcGVhcjZ4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0Jc3BlYXI2eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9CSZzcGVhcjZ4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGNjOGsvYm9hcmQtdGNjODAwMC1zZGsuYyBiL2FyY2gvYXJtL21hY2gtdGNjOGsvYm9hcmQtdGNjODAwMC1zZGsuYwppbmRleCA0Y2IzYzJkLi43NzdhNWJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRjYzhrL2JvYXJkLXRjYzgwMDAtc2RrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10Y2M4ay9ib2FyZC10Y2M4MDAwLXNkay5jCkBAIC03Myw3ICs3Myw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoVENDODAwMF9TREssICJUZWxlY2hpcHMgVENDODAwMC1TREsgRGVtbyBCb2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gUExBVF9QSFlTX09GRlNFVCArIDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSB0Y2M4a19tYXBfaW8sCiAJLmluaXRfaXJxCT0gdGNjOGtfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IHRjYzhrX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcKaW5kZXggZDgyZWJhYi4uOTFhZmY3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZwpAQCAtNjksNiArNjksMTIgQEAKICAgICAgICBoZWxwCiAgICAgICAgICBTdXBwb3J0IGZvciB0aGUgV2FyaW8gdmVyc2lvbiBvZiBTZWFib2FyZAogCitjb25maWcgTUFDSF9WRU5UQU5BCisgICAgICAgYm9vbCAiVmVudGFuYSBib2FyZCIKKyAgICAgICBzZWxlY3QgTUFDSF9URUdSQV9EVAorICAgICAgIGhlbHAKKyAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBuVmlkaWEgVmVudGFuYSBkZXZlbG9wbWVudCBwbGF0Zm9ybQorCiBjaG9pY2UKICAgICAgICAgcHJvbXB0ICJMb3ctbGV2ZWwgZGVidWcgY29uc29sZSBVQVJUIgogICAgICAgICBkZWZhdWx0IFRFR1JBX0RFQlVHX1VBUlRfTk9ORQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUKaW5kZXggZjExYjkxMC4uOTFhMDdlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlCkBAIC0zMSw2ICszMSw3IEBACiAKIG9iai0ke0NPTkZJR19NQUNIX1RFR1JBX0RUfSAgICAgICAgICAgICArPSBib2FyZC1kdC5vCiBvYmotJHtDT05GSUdfTUFDSF9URUdSQV9EVH0gICAgICAgICAgICAgKz0gYm9hcmQtaGFybW9ueS1waW5tdXgubworb2JqLSR7Q09ORklHX01BQ0hfVEVHUkFfRFR9ICAgICAgICAgICAgICs9IGJvYXJkLXNlYWJvYXJkLXBpbm11eC5vCiAKIG9iai0ke0NPTkZJR19NQUNIX1RSSU1TTElDRX0gICAgICAgICAgICArPSBib2FyZC10cmltc2xpY2Uubwogb2JqLSR7Q09ORklHX01BQ0hfVFJJTVNMSUNFfSAgICAgICAgICAgICs9IGJvYXJkLXRyaW1zbGljZS1waW5tdXgubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZS5ib290CmluZGV4IDVlODcwZDIuLmJkMTJjOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUuYm9vdAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlLmJvb3QKQEAgLTQsMyArNCw0IEBACiAKIGR0Yi0kKENPTkZJR19NQUNIX0hBUk1PTlkpICs9IHRlZ3JhLWhhcm1vbnkuZHRiCiBkdGItJChDT05GSUdfTUFDSF9TRUFCT0FSRCkgKz0gdGVncmEtc2VhYm9hcmQuZHRiCitkdGItJChDT05GSUdfTUFDSF9WRU5UQU5BKSArPSB0ZWdyYS12ZW50YW5hLmR0YgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1kdC5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1kdC5jCmluZGV4IDlmNDdlMDQuLjc0NzQzYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtZHQuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWR0LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogdm9pZCBoYXJtb255X3Bpbm11eF9pbml0KHZvaWQpOwogdm9pZCBzZWFib2FyZF9waW5tdXhfaW5pdCh2b2lkKTsKLQordm9pZCB2ZW50YW5hX3Bpbm11eF9pbml0KHZvaWQpOwogCiBzdHJ1Y3Qgb2ZfZGV2X2F1eGRhdGEgdGVncmEyMF9hdXhkYXRhX2xvb2t1cFtdIF9faW5pdGRhdGEgPSB7CiAJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLXNkaGNpIiwgVEVHUkFfU0RNTUMxX0JBU0UsICJzZGhjaS10ZWdyYS4wIiwgTlVMTCksCkBAIC04MCw5ICs4MCwxOSBAQAogCXt9CiB9OwogCitzdGF0aWMgc3RydWN0IHsKKwljaGFyICptYWNoaW5lOworCXZvaWQgKCppbml0KSh2b2lkKTsKK30gcGlubXV4X2NvbmZpZ3NbXSA9IHsKKwl7ICJudmlkaWEsaGFybW9ueSIsIGhhcm1vbnlfcGlubXV4X2luaXQgfSwKKwl7ICJudmlkaWEsc2VhYm9hcmQiLCBzZWFib2FyZF9waW5tdXhfaW5pdCB9LAorCXsgIm52aWRpYSx2ZW50YW5hIiwgdmVudGFuYV9waW5tdXhfaW5pdCB9LAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IHRlZ3JhX2R0X2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJaW50IGk7CiAKIAlub2RlID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlX2J5X2FkZHJlc3MoTlVMTCwgdGVncmFfZHRfZ2ljX21hdGNoLAogCQkJCQkJVEVHUkFfQVJNX0lOVF9ESVNUX0JBU0UpOwpAQCAtOTEsMjEgKzEwMSwyOCBAQAogCiAJdGVncmFfY2xrX2luaXRfZnJvbV90YWJsZSh0ZWdyYV9kdF9jbGtfaW5pdF90YWJsZSk7CiAKLQlpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJudmlkaWEsaGFybW9ueSIpKQotCQloYXJtb255X3Bpbm11eF9pbml0KCk7Ci0JZWxzZSBpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJudmlkaWEsc2VhYm9hcmQiKSkKLQkJc2VhYm9hcmRfcGlubXV4X2luaXQoKTsKLQogCS8qCiAJICogRmluaXNoZWQgd2l0aCB0aGUgc3RhdGljIHJlZ2lzdHJhdGlvbnMgbm93OyBmaWxsIGluIHRoZSBtaXNzaW5nCiAJICogZGV2aWNlcwogCSAqLwotCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIHRlZ3JhX2R0X21hdGNoX3RhYmxlLCB0ZWdyYTIwX2F1eGRhdGFfbG9va3VwLCBOVUxMKTsKKwlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShOVUxMLCB0ZWdyYV9kdF9tYXRjaF90YWJsZSwKKwkJCQl0ZWdyYTIwX2F1eGRhdGFfbG9va3VwLCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBpbm11eF9jb25maWdzKTsgaSsrKSB7CisJCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUocGlubXV4X2NvbmZpZ3NbaV0ubWFjaGluZSkpIHsKKwkJCXBpbm11eF9jb25maWdzW2ldLmluaXQoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJV0FSTihpID09IEFSUkFZX1NJWkUocGlubXV4X2NvbmZpZ3MpLAorCQkiVW5rbm93biBwbGF0Zm9ybSEgUGlubXV4aW5nIG5vdCBpbml0aWFsaXplZFxuIik7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogdGVncmFfZHRfYm9hcmRfY29tcGF0W10gPSB7CiAJIm52aWRpYSxoYXJtb255IiwKIAkibnZpZGlhLHNlYWJvYXJkIiwKKwkibnZpZGlhLHZlbnRhbmEiLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS1wY2llLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcGNpZS5jCmluZGV4IDljMjdiOTUuLjZkYjdkNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS1wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBjaWUuYwpAQCAtMjQsMTIgKzI0LDEwIEBACiAKICNpbmNsdWRlIDxtYWNoL3Bpbm11eC5oPgogI2luY2x1ZGUgImJvYXJkLmgiCisjaW5jbHVkZSAiYm9hcmQtaGFybW9ueS5oIgogCiAjaWZkZWYgQ09ORklHX1RFR1JBX1BDSQogCi0vKiBHUElPIDMgb2YgdGhlIFBNSUMgKi8KLSNkZWZpbmUgRU5fVkREXzFWMDVfR1BJTwkoVEVHUkFfTlJfR1BJT1MgKyAyKQotCiBzdGF0aWMgaW50IF9faW5pdCBoYXJtb255X3BjaWVfaW5pdCh2b2lkKQogewogCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciA9IE5VTEw7CkBAIC0zOCwxMSArMzYsMTEgQEAKIAlpZiAoIW1hY2hpbmVfaXNfaGFybW9ueSgpKQogCQlyZXR1cm4gMDsKIAotCWVyciA9IGdwaW9fcmVxdWVzdChFTl9WRERfMVYwNV9HUElPLCAiRU5fVkREXzFWMDUiKTsKKwllcnIgPSBncGlvX3JlcXVlc3QoVEVHUkFfR1BJT19FTl9WRERfMVYwNV9HUElPLCAiRU5fVkREXzFWMDUiKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEVOX1ZERF8xVjA1X0dQSU8sIDEpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChURUdSQV9HUElPX0VOX1ZERF8xVjA1X0dQSU8sIDEpOwogCiAJcmVndWxhdG9yID0gcmVndWxhdG9yX2dldChOVUxMLCAicGV4X2NsayIpOwogCWlmIChJU19FUlJfT1JfTlVMTChyZWd1bGF0b3IpKQpAQCAtNjgsNyArNjYsNyBAQAogCXJlZ3VsYXRvcl9kaXNhYmxlKHJlZ3VsYXRvcik7CiAJcmVndWxhdG9yX3B1dChyZWd1bGF0b3IpOwogZXJyX3JlZzoKLQlncGlvX2ZyZWUoRU5fVkREXzFWMDVfR1BJTyk7CisJZ3Bpb19mcmVlKFRFR1JBX0dQSU9fRU5fVkREXzFWMDVfR1BJTyk7CiAKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBpbm11eC5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBpbm11eC5jCmluZGV4IDRkNjNlMmUuLjdhNGEyNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS1waW5tdXguYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcGlubXV4LmMKQEAgLTE2LDEwICsxNiwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisKICNpbmNsdWRlIDxtYWNoL3Bpbm11eC5oPgogCiAjaW5jbHVkZSAiZ3Bpby1uYW1lcy5oIgogI2luY2x1ZGUgImJvYXJkLWhhcm1vbnkuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgdGVncmFfcGluZ3JvdXBfY29uZmlnIGhhcm1vbnlfcGlubXV4W10gPSB7CiAJe1RFR1JBX1BJTkdST1VQX0FUQSwgICBURUdSQV9NVVhfSURFLCAgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LApAQCAtMTQwLDYgKzE0MywxMSBAQAogCXtURUdSQV9QSU5HUk9VUF9YTTJELCAgVEVHUkFfTVVYX05PTkUsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwaW5tdXhfZGV2aWNlc1tdID0geworCSZ0ZWdyYV9ncGlvX2RldmljZSwKKwkmdGVncmFfcGlubXV4X2RldmljZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdGVncmFfZ3Bpb190YWJsZSBncGlvX3RhYmxlW10gPSB7CiAJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fU0QyX0NELAkJLmVuYWJsZSA9IHRydWUJfSwKIAl7IC5ncGlvID0gVEVHUkFfR1BJT19TRDJfV1AsCQkuZW5hYmxlID0gdHJ1ZQl9LApAQCAtMTU1LDYgKzE2MywxMCBAQAogCiB2b2lkIGhhcm1vbnlfcGlubXV4X2luaXQodm9pZCkKIHsKKwlpZiAoIW9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgibnZpZGlhLHRlZ3JhMjAiKSkKKwkJcGxhdGZvcm1fYWRkX2RldmljZXMocGlubXV4X2RldmljZXMsCisJCQkJCUFSUkFZX1NJWkUocGlubXV4X2RldmljZXMpKTsKKwogCXRlZ3JhX3Bpbm11eF9jb25maWdfdGFibGUoaGFybW9ueV9waW5tdXgsIEFSUkFZX1NJWkUoaGFybW9ueV9waW5tdXgpKTsKIAogCXRlZ3JhX2dwaW9fY29uZmlnKGdwaW9fdGFibGUsIEFSUkFZX1NJWkUoZ3Bpb190YWJsZSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBvd2VyLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcG93ZXIuYwppbmRleCA1YWQ4YjJmLi4yMWQxMjg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcG93ZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcG93ZXIuYwpAQCAtMTgsMTAgKzE4LDExIEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC90cHM2NTg2eC5oPgogCisjaW5jbHVkZSA8bWFjaC9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSAiYm9hcmQtaGFybW9ueS5oIgpAQCAtMTEzLDYgKzExNCwxNiBAQAogCiBpbnQgX19pbml0IGhhcm1vbnlfcmVndWxhdG9yX2luaXQodm9pZCkKIHsKKwl2b2lkIF9faW9tZW0gKnBtYyA9IElPX0FERFJFU1MoVEVHUkFfUE1DX0JBU0UpOworCXUzMiBwbWNfY3RybDsKKworCS8qCisJICogQ29uZmlndXJlIHRoZSBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2xsZXIgdG8gdHJpZ2dlciBQTVUKKwkgKiBpbnRlcnJ1cHRzIHdoZW4gbG93CisJICovCisJcG1jX2N0cmwgPSByZWFkbChwbWMgKyBQTUNfQ1RSTCk7CisJd3JpdGVsKHBtY19jdHJsIHwgUE1DX0NUUkxfSU5UUl9MT1csIHBtYyArIFBNQ19DVFJMKTsKKwogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDMsIGhhcm1vbnlfcmVndWxhdG9ycywgMSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LmMKaW5kZXggYzc4Y2U0MS4uZjBiZGM1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LmMKQEAgLTQ5LDcgKzQ5LDggQEAKIAkJLm1lbWJhc2UJPSBJT19BRERSRVNTKFRFR1JBX1VBUlREX0JBU0UpLAogCQkubWFwYmFzZQk9IFRFR1JBX1VBUlREX0JBU0UsCiAJCS5pcnEJCT0gSU5UX1VBUlRELAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9GSVhFRF9UWVBFLAorCQkudHlwZQkJPSBQT1JUX1RFR1JBLAogCQkuaW90eXBlCQk9IFVQSU9fTUVNLAogCQkucmVnc2hpZnQJPSAyLAogCQkudWFydGNsawk9IDIxNjAwMDAwMCwKQEAgLTExNyw2ICsxMTgsNyBAQAogCSZ0ZWdyYV9zZGhjaV9kZXZpY2UxLAogCSZ0ZWdyYV9zZGhjaV9kZXZpY2UyLAogCSZ0ZWdyYV9zZGhjaV9kZXZpY2U0LAorCSZ0ZWdyYV9laGNpM19kZXZpY2UsCiAJJnRlZ3JhX2kyc19kZXZpY2UxLAogCSZ0ZWdyYV9kYXNfZGV2aWNlLAogCSZ0ZWdyYV9wY21fZGV2aWNlLApAQCAtMTQwLDYgKzE0Miw3IEBACiAJeyAicGxsX2Ffb3V0MCIsCSJwbGxfYSIsCTExMjg5NjAwLAl0cnVlIH0sCiAJeyAiY2RldjEiLAlOVUxMLAkJMCwJCXRydWUgfSwKIAl7ICJpMnMxIiwJInBsbF9hX291dDAiLAkxMTI4OTYwMCwJZmFsc2V9LAorCXsgInVzYjMiLAkiY2xrX20iLAkxMjAwMDAwMCwJdHJ1ZSB9LAogCXsgTlVMTCwJCU5VTEwsCQkwLAkJMH0sCiB9OwogCkBAIC0xNzksNyArMTgyLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChIQVJNT05ZLCAiaGFybW9ueSIpCi0JLmJvb3RfcGFyYW1zICA9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmZpeHVwCQk9IHRlZ3JhX2hhcm1vbnlfZml4dXAsCiAJLm1hcF9pbyAgICAgICAgID0gdGVncmFfbWFwX2NvbW1vbl9pbywKIAkuaW5pdF9lYXJseQk9IHRlZ3JhX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnkuaCBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS5oCmluZGV4IGQ4NTE0MmUuLjEzOWQ5NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIF9NQUNIX1RFR1JBX0JPQVJEX0hBUk1PTllfSAogI2RlZmluZSBfTUFDSF9URUdSQV9CT0FSRF9IQVJNT05ZX0gKIAorI2luY2x1ZGUgPG1hY2gvZ3Bpby10ZWdyYS5oPgorCiAjZGVmaW5lIEhBUk1PTllfR1BJT19UUFM2NTg2WChfeF8pCShURUdSQV9OUl9HUElPUyArIChfeF8pKQogI2RlZmluZSBIQVJNT05ZX0dQSU9fV004OTAzKF94XykJKEhBUk1PTllfR1BJT19UUFM2NTg2WCg0KSArIChfeF8pKQogCkBAIC0zMSw2ICszMyw3IEBACiAjZGVmaW5lIFRFR1JBX0dQSU9fSFBfREVUCQlURUdSQV9HUElPX1BXMgogI2RlZmluZSBURUdSQV9HUElPX0lOVF9NSUNfRU4JCVRFR1JBX0dQSU9fUFgwCiAjZGVmaW5lIFRFR1JBX0dQSU9fRVhUX01JQ19FTgkJVEVHUkFfR1BJT19QWDEKKyNkZWZpbmUgVEVHUkFfR1BJT19FTl9WRERfMVYwNV9HUElPCUhBUk1PTllfR1BJT19UUFM2NTg2WCgyKQogCiB2b2lkIGhhcm1vbnlfcGlubXV4X2luaXQodm9pZCk7CiBpbnQgaGFybW9ueV9yZWd1bGF0b3JfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAtcGlubXV4LmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXBhejAwLXBpbm11eC5jCmluZGV4IGJkZDI2MjcuLmJlMzBlMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAtcGlubXV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC1waW5tdXguYwpAQCAtMTYsMTAgKzE2LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKwogI2luY2x1ZGUgPG1hY2gvcGlubXV4Lmg+CiAKICNpbmNsdWRlICJncGlvLW5hbWVzLmgiCiAjaW5jbHVkZSAiYm9hcmQtcGF6MDAuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgdGVncmFfcGluZ3JvdXBfY29uZmlnIHBhejAwX3Bpbm11eFtdID0gewogCXtURUdSQV9QSU5HUk9VUF9BVEEsICAgVEVHUkFfTVVYX0dNSSwgICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKQEAgLTE0MCwxNSArMTQzLDI3IEBACiAJe1RFR1JBX1BJTkdST1VQX1hNMkQsICBURUdSQV9NVVhfTk9ORSwgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBpbm11eF9kZXZpY2VzW10gPSB7CisJJnRlZ3JhX2dwaW9fZGV2aWNlLAorCSZ0ZWdyYV9waW5tdXhfZGV2aWNlLAorfTsKKwogc3RhdGljIHN0cnVjdCB0ZWdyYV9ncGlvX3RhYmxlIGdwaW9fdGFibGVbXSA9IHsKIAl7IC5ncGlvID0gVEVHUkFfR1BJT19TRDFfQ0QsCS5lbmFibGUgPSB0cnVlIH0sCiAJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fU0QxX1dQLAkuZW5hYmxlID0gdHJ1ZSB9LAogCXsgLmdwaW8gPSBURUdSQV9HUElPX1NEMV9QT1dFUiwJLmVuYWJsZSA9IHRydWUgfSwKIAl7IC5ncGlvID0gVEVHUkFfVUxQSV9SU1QsCS5lbmFibGUgPSB0cnVlIH0sCisJeyAuZ3BpbyA9IFRFR1JBX1dJRklfUFdSTiwJLmVuYWJsZSA9IHRydWUgfSwKKwl7IC5ncGlvID0gVEVHUkFfV0lGSV9SU1QsCS5lbmFibGUgPSB0cnVlIH0sCisJeyAuZ3BpbyA9IFRFR1JBX1dJRklfTEVELAkuZW5hYmxlID0gdHJ1ZSB9LAogfTsKIAogdm9pZCBwYXowMF9waW5tdXhfaW5pdCh2b2lkKQogeworCWlmICghb2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJudmlkaWEsdGVncmEyMCIpKQorCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwaW5tdXhfZGV2aWNlcywKKwkJCQkJQVJSQVlfU0laRShwaW5tdXhfZGV2aWNlcykpOworCiAJdGVncmFfcGlubXV4X2NvbmZpZ190YWJsZShwYXowMF9waW5tdXgsIEFSUkFZX1NJWkUocGF6MDBfcGlubXV4KSk7CiAKIAl0ZWdyYV9ncGlvX2NvbmZpZyhncGlvX3RhYmxlLCBBUlJBWV9TSVpFKGdwaW9fdGFibGUpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAuYwppbmRleCA1ZTZiYzc3Li41NWM1NWJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXBhejAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC5jCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bGludXgvcGRhX3Bvd2VyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLWdwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMzUsNyArMzcsNiBAQAogI2luY2x1ZGUgPG1hY2gvaW9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL3NkaGNpLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKICNpbmNsdWRlICJib2FyZC5oIgogI2luY2x1ZGUgImJvYXJkLXBhejAwLmgiCkBAIC00NSwxMCArNDYsMjIgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBkZWJ1Z191YXJ0X3BsYXRmb3JtX2RhdGFbXSA9IHsKIAl7CisJCS8qIHNlcmlhbCBwb3J0IG9uIEpQMSAqLworCQkubWVtYmFzZQk9IElPX0FERFJFU1MoVEVHUkFfVUFSVEFfQkFTRSksCisJCS5tYXBiYXNlCT0gVEVHUkFfVUFSVEFfQkFTRSwKKwkJLmlycQkJPSBJTlRfVUFSVEEsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9GSVhFRF9UWVBFLAorCQkudHlwZQkJPSBQT1JUX1RFR1JBLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAyLAorCQkudWFydGNsawk9IDIxNjAwMDAwMCwKKwl9LCB7CisJCS8qIHNlcmlhbCBwb3J0IG9uIG1pbmktcGNpZSAqLwogCQkubWVtYmFzZQk9IElPX0FERFJFU1MoVEVHUkFfVUFSVERfQkFTRSksCiAJCS5tYXBiYXNlCT0gVEVHUkFfVUFSVERfQkFTRSwKIAkJLmlycQkJPSBJTlRfVUFSVEQsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0ZJWEVEX1RZUEUsCisJCS50eXBlCQk9IFBPUlRfVEVHUkEsCiAJCS5pb3R5cGUJCT0gVVBJT19NRU0sCiAJCS5yZWdzaGlmdAk9IDIsCiAJCS51YXJ0Y2xrCT0gMjE2MDAwMDAwLApAQCAtNjUsMTAgKzc4LDQ4IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsX2dwaW9fcGxhdGZvcm1fZGF0YSB3aWZpX3Jma2lsbF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lCQk9ICJ3aWZpX3Jma2lsbCIsCisJLnJlc2V0X2dwaW8JPSBURUdSQV9XSUZJX1JTVCwKKwkuc2h1dGRvd25fZ3Bpbwk9IFRFR1JBX1dJRklfUFdSTiwKKwkudHlwZQk9IFJGS0lMTF9UWVBFX1dMQU4sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB3aWZpX3Jma2lsbF9kZXZpY2UgPSB7CisJLm5hbWUJPSAicmZraWxsX2dwaW8iLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJndpZmlfcmZraWxsX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZ3Bpb19sZWRzW10gPSB7CisJeworCQkubmFtZQkJCT0gIndpZmktbGVkIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJyZmtpbGwwIiwKKwkJLmdwaW8JCQk9IFRFR1JBX1dJRklfTEVELAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZ3Bpb19sZWRfaW5mbyA9IHsKKwkubGVkcwkJPSBncGlvX2xlZHMsCisJLm51bV9sZWRzCT0gQVJSQVlfU0laRShncGlvX2xlZHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbGVkc19ncGlvID0geworCS5uYW1lCT0gImxlZHMtZ3BpbyIsCisJLmlkCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZ3Bpb19sZWRfaW5mbywKKyAgICAgICAgfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwYXowMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmZGVidWdfdWFydCwKLQkmdGVncmFfc2RoY2lfZGV2aWNlMSwKIAkmdGVncmFfc2RoY2lfZGV2aWNlNCwKKwkmdGVncmFfc2RoY2lfZGV2aWNlMSwKKwkmd2lmaV9yZmtpbGxfZGV2aWNlLAorCSZsZWRzX2dwaW8sCiB9OwogCiBzdGF0aWMgdm9pZCBwYXowMF9pMmNfaW5pdCh2b2lkKQpAQCAtOTQsNyArMTQ1LDE0IEBACiAKIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCB0ZWdyYV9jbGtfaW5pdF90YWJsZSBwYXowMF9jbGtfaW5pdF90YWJsZVtdID0gewogCS8qIG5hbWUJCXBhcmVudAkJcmF0ZQkJZW5hYmxlZCAqLworCXsgInVhcnRhIiwJInBsbF9wIiwJMjE2MDAwMDAwLAl0cnVlIH0sCiAJeyAidWFydGQiLAkicGxsX3AiLAkyMTYwMDAwMDAsCXRydWUgfSwKKworCXsgInBsbF9wX291dDQiLAkicGxsX3AiLAkyNDAwMDAwMCwJdHJ1ZSB9LAorCXsgInVzYmQiLAkiY2xrX20iLAkxMjAwMDAwMCwJZmFsc2UgfSwKKwl7ICJ1c2IyIiwJImNsa19tIiwJMTIwMDAwMDAsCWZhbHNlIH0sCisJeyAidXNiMyIsCSJjbGtfbSIsCTEyMDAwMDAwLAlmYWxzZSB9LAorCiAJeyBOVUxMLAkJTlVMTCwJCTAsCQkwfSwKIH07CiAKQEAgLTEyNyw3ICsxODUsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFBBWjAwLCAiVG9zaGliYSBBQzEwMCAvIER5bmFib29rIEFaIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSB0ZWdyYV9wYXowMF9maXh1cCwKIAkubWFwX2lvICAgICAgICAgPSB0ZWdyYV9tYXBfY29tbW9uX2lvLAogCS5pbml0X2Vhcmx5CT0gdGVncmFfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAuaCBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAuaAppbmRleCBkNGZmMzlkLi44YWZmMDZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXBhejAwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC5oCkBAIC0xNywxMSArMTcsMjEgQEAKICNpZm5kZWYgX01BQ0hfVEVHUkFfQk9BUkRfUEFaMDBfSAogI2RlZmluZSBfTUFDSF9URUdSQV9CT0FSRF9QQVowMF9ICiAKKyNpbmNsdWRlIDxtYWNoL2dwaW8tdGVncmEuaD4KKworLyogU0RDQVJEICovCiAjZGVmaW5lIFRFR1JBX0dQSU9fU0QxX0NECQlURUdSQV9HUElPX1BWNQogI2RlZmluZSBURUdSQV9HUElPX1NEMV9XUAkJVEVHUkFfR1BJT19QSDEKICNkZWZpbmUgVEVHUkFfR1BJT19TRDFfUE9XRVIJCVRFR1JBX0dQSU9fUFQzCisKKy8qIFVMUEkgKi8KICNkZWZpbmUgVEVHUkFfVUxQSV9SU1QJCQlURUdSQV9HUElPX1BWMAogCisvKiBXSUZJICovCisjZGVmaW5lIFRFR1JBX1dJRklfUFdSTgkJCVRFR1JBX0dQSU9fUEs1CisjZGVmaW5lIFRFR1JBX1dJRklfUlNUCQkJVEVHUkFfR1BJT19QRDEKKyNkZWZpbmUgVEVHUkFfV0lGSV9MRUQJCQlURUdSQV9HUElPX1BEMAorCiB2b2lkIHBhejAwX3Bpbm11eF9pbml0KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtc2VhYm9hcmQtcGlubXV4LmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLXBpbm11eC5jCmluZGV4IDBiZGE0OTUuLmIxYzI5NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtc2VhYm9hcmQtcGlubXV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1zZWFib2FyZC1waW5tdXguYwpAQCAtMSw1ICsxLDYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgTlZJRElBIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsMjAxMSBOVklESUEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUsIEluYy4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZApAQCAtMTUsMTIgKzE2LDE0IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjaW5jbHVkZSA8bWFjaC9waW5tdXguaD4KICNpbmNsdWRlIDxtYWNoL3Bpbm11eC10Mi5oPgogCiAjaW5jbHVkZSAiZ3Bpby1uYW1lcy5oIgogI2luY2x1ZGUgImJvYXJkLXNlYWJvYXJkLmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgogCiAjZGVmaW5lIERFRkFVTFRfRFJJVkUoX25hbWUpCQkJCQlcCiAJewkJCQkJCQlcCkBAIC00OSw3ICs1Miw3IEBACiAJe1RFR1JBX1BJTkdST1VQX0NSVFAsICBURUdSQV9NVVhfQ1JULCAgICAgICAgICAgVEVHUkFfUFVQRF9QVUxMX1VQLCAgIFRFR1JBX1RSSV9UUklTVEFURX0sCiAJe1RFR1JBX1BJTkdST1VQX0NTVVMsICBURUdSQV9NVVhfVklfU0VOU09SX0NMSywgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9UUklTVEFURX0sCiAJe1RFR1JBX1BJTkdST1VQX0RBUDEsICBURUdSQV9NVVhfREFQMSwgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LAotCXtURUdSQV9QSU5HUk9VUF9EQVAyLCAgVEVHUkFfTVVYX0RBUDIsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAorCXtURUdSQV9QSU5HUk9VUF9EQVAyLCAgVEVHUkFfTVVYX0RBUDIsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKIAl7VEVHUkFfUElOR1JPVVBfREFQMywgIFRFR1JBX01VWF9EQVAzLCAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKIAl7VEVHUkFfUElOR1JPVVBfREFQNCwgIFRFR1JBX01VWF9EQVA0LCAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCiAJe1RFR1JBX1BJTkdST1VQX0REQywgICBURUdSQV9NVVhfUlNWRDIsICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9UUklTVEFURX0sCkBAIC0xMzMsNyArMTM2LDcgQEAKIAl7VEVHUkFfUElOR1JPVVBfU1BETywgIFRFR1JBX01VWF9SU1ZEMiwgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCiAJe1RFR1JBX1BJTkdST1VQX1NQSUEsICBURUdSQV9NVVhfR01JLCAgICAgICAgICAgVEVHUkFfUFVQRF9QVUxMX1VQLCAgIFRFR1JBX1RSSV9UUklTVEFURX0sCiAJe1RFR1JBX1BJTkdST1VQX1NQSUIsICBURUdSQV9NVVhfR01JLCAgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9UUklTVEFURX0sCi0Je1RFR1JBX1BJTkdST1VQX1NQSUMsICBURUdSQV9NVVhfR01JLCAgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9UUklTVEFURX0sCisJe1RFR1JBX1BJTkdST1VQX1NQSUMsICBURUdSQV9NVVhfR01JLCAgICAgICAgICAgVEVHUkFfUFVQRF9QVUxMX1VQLCAgIFRFR1JBX1RSSV9OT1JNQUx9LAogCXtURUdSQV9QSU5HUk9VUF9TUElELCAgVEVHUkFfTVVYX1NQSTEsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAogCXtURUdSQV9QSU5HUk9VUF9TUElFLCAgVEVHUkFfTVVYX1NQSTEsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAogCXtURUdSQV9QSU5HUk9VUF9TUElGLCAgVEVHUkFfTVVYX1NQSTEsICAgICAgICAgIFRFR1JBX1BVUERfUFVMTF9ET1dOLCBURUdSQV9UUklfVFJJU1RBVEV9LApAQCAtMTU3LDI0ICsxNjAsODYgQEAKIAl7VEVHUkFfUElOR1JPVVBfWE0yRCwgIFRFR1JBX01VWF9OT05FLCAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCiB9OwogCitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgdGVncmFfcGluZ3JvdXBfY29uZmlnIHZlbnRhbmFfcGlubXV4W10gPSB7CisJe1RFR1JBX1BJTkdST1VQX0RBUDMsIFRFR1JBX01VWF9EQVAzLCAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9UUklTVEFURX0sCisJe1RFR1JBX1BJTkdST1VQX0REQywgIFRFR1JBX01VWF9SU1ZEMiwgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LAorCXtURUdSQV9QSU5HUk9VUF9EVEEsICBURUdSQV9NVVhfVkksICAgICAgIFRFR1JBX1BVUERfUFVMTF9ET1dOLCBURUdSQV9UUklfTk9STUFMfSwKKwl7VEVHUkFfUElOR1JPVVBfRFRCLCAgVEVHUkFfTVVYX1ZJLCAgICAgICBURUdSQV9QVVBEX1BVTExfRE9XTiwgVEVHUkFfVFJJX05PUk1BTH0sCisJe1RFR1JBX1BJTkdST1VQX0RUQywgIFRFR1JBX01VWF9WSSwgICAgICAgVEVHUkFfUFVQRF9QVUxMX0RPV04sIFRFR1JBX1RSSV9OT1JNQUx9LAorCXtURUdSQV9QSU5HUk9VUF9EVEQsICBURUdSQV9NVVhfVkksICAgICAgIFRFR1JBX1BVUERfUFVMTF9ET1dOLCBURUdSQV9UUklfTk9STUFMfSwKKwl7VEVHUkFfUElOR1JPVVBfR01ELCAgVEVHUkFfTVVYX1NGTEFTSCwgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKKwl7VEVHUkFfUElOR1JPVVBfTFBXMCwgVEVHUkFfTVVYX1JTVkQ0LCAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCisJe1RFR1JBX1BJTkdST1VQX0xQVzIsIFRFR1JBX01VWF9SU1ZENCwgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LAorCXtURUdSQV9QSU5HUk9VUF9MU0MxLCBURUdSQV9NVVhfUlNWRDQsICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKKwl7VEVHUkFfUElOR1JPVVBfTFNDSywgVEVHUkFfTVVYX1JTVkQ0LCAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKKwl7VEVHUkFfUElOR1JPVVBfTFNEQSwgVEVHUkFfTVVYX1JTVkQ0LCAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKKwl7VEVHUkFfUElOR1JPVVBfUFRBLCAgVEVHUkFfTVVYX1JTVkQyLCAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCisJe1RFR1JBX1BJTkdST1VQX1NMWEMsIFRFR1JBX01VWF9TRElPMywgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LAorCXtURUdSQV9QSU5HUk9VUF9TTFhLLCBURUdSQV9NVVhfU0RJTzMsICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKKwl7VEVHUkFfUElOR1JPVVBfU1BJQSwgVEVHUkFfTVVYX0dNSSwgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKKwl7VEVHUkFfUElOR1JPVVBfU1BJQywgVEVHUkFfTVVYX0dNSSwgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKKwl7VEVHUkFfUElOR1JPVVBfU1BJRywgVEVHUkFfTVVYX1NQSTJfQUxULCBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKK307CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwaW5tdXhfZGV2aWNlc1tdID0geworCSZ0ZWdyYV9ncGlvX2RldmljZSwKKwkmdGVncmFfcGlubXV4X2RldmljZSwKK307CiAKLQotc3RhdGljIHN0cnVjdCB0ZWdyYV9ncGlvX3RhYmxlIGdwaW9fdGFibGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdGVncmFfZ3Bpb190YWJsZSBjb21tb25fZ3Bpb190YWJsZVtdID0gewogCXsgLmdwaW8gPSBURUdSQV9HUElPX1NEMl9DRCwJCS5lbmFibGUgPSB0cnVlIH0sCiAJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fU0QyX1dQLAkJLmVuYWJsZSA9IHRydWUgfSwKIAl7IC5ncGlvID0gVEVHUkFfR1BJT19TRDJfUE9XRVIsCQkuZW5hYmxlID0gdHJ1ZSB9LAogCXsgLmdwaW8gPSBURUdSQV9HUElPX0xJRFNXSVRDSCwJCS5lbmFibGUgPSB0cnVlIH0sCiAJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fUE9XRVJLRVksCQkuZW5hYmxlID0gdHJ1ZSB9LAorCXsgLmdwaW8gPSBURUdSQV9HUElPX0hQX0RFVCwJCS5lbmFibGUgPSB0cnVlIH0sCiAJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fSVNMMjkwMThfSVJRLAkuZW5hYmxlID0gdHJ1ZSB9LAorCXsgLmdwaW8gPSBURUdSQV9HUElPX0NEQ19JUlEsCQkuZW5hYmxlID0gdHJ1ZSB9LAorCXsgLmdwaW8gPSBURUdSQV9HUElPX1VTQjEsCQkuZW5hYmxlID0gdHJ1ZSB9LAogfTsKIAotdm9pZCBfX2luaXQgc2VhYm9hcmRfcGlubXV4X2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCB1cGRhdGVfcGlubXV4KHN0cnVjdCB0ZWdyYV9waW5ncm91cF9jb25maWcgKm5ld3RibCwgaW50IHNpemUpCiB7CisJaW50IGksIGo7CisJc3RydWN0IHRlZ3JhX3Bpbmdyb3VwX2NvbmZpZyAqbmV3X3Bpbmdyb3VwLCAqYmFzZV9waW5ncm91cDsKKworCS8qIFVwZGF0ZSBiYXNlIHNlYWJvYXJkIHBpbm11eCB0YWJsZSB3aXRoIHNlY29uZGFyeSBib2FyZAorCSAqIHNwZWNpZmljIHBpbm11eCB0YWJsZSB0YWJsZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCW5ld19waW5ncm91cCA9ICZuZXd0YmxbaV07CisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHNlYWJvYXJkX3Bpbm11eCk7IGorKykgeworCQkJYmFzZV9waW5ncm91cCA9ICZzZWFib2FyZF9waW5tdXhbal07CisJCQlpZiAobmV3X3Bpbmdyb3VwLT5waW5ncm91cCA9PSBiYXNlX3Bpbmdyb3VwLT5waW5ncm91cCkgeworCQkJCSpiYXNlX3Bpbmdyb3VwID0gKm5ld19waW5ncm91cDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBfX2luaXQgc2VhYm9hcmRfY29tbW9uX3Bpbm11eF9pbml0KHZvaWQpCit7CisJaWYgKCFvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIm52aWRpYSx0ZWdyYTIwIikpCisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBpbm11eF9kZXZpY2VzLAorCQkJCQlBUlJBWV9TSVpFKHBpbm11eF9kZXZpY2VzKSk7CisKIAl0ZWdyYV9waW5tdXhfY29uZmlnX3RhYmxlKHNlYWJvYXJkX3Bpbm11eCwgQVJSQVlfU0laRShzZWFib2FyZF9waW5tdXgpKTsKIAogCXRlZ3JhX2RyaXZlX3Bpbm11eF9jb25maWdfdGFibGUoc2VhYm9hcmRfZHJpdmVfcGlubXV4LAogCQkJCQlBUlJBWV9TSVpFKHNlYWJvYXJkX2RyaXZlX3Bpbm11eCkpOwogCi0JdGVncmFfZ3Bpb19jb25maWcoZ3Bpb190YWJsZSwgQVJSQVlfU0laRShncGlvX3RhYmxlKSk7CisJdGVncmFfZ3Bpb19jb25maWcoY29tbW9uX2dwaW9fdGFibGUsIEFSUkFZX1NJWkUoY29tbW9uX2dwaW9fdGFibGUpKTsKIH0KKwordm9pZCBfX2luaXQgc2VhYm9hcmRfcGlubXV4X2luaXQodm9pZCkKK3sKKwlzZWFib2FyZF9jb21tb25fcGlubXV4X2luaXQoKTsKK30KKwordm9pZCBfX2luaXQgdmVudGFuYV9waW5tdXhfaW5pdCh2b2lkKQoreworCXVwZGF0ZV9waW5tdXgodmVudGFuYV9waW5tdXgsIEFSUkFZX1NJWkUodmVudGFuYV9waW5tdXgpKTsKKwlzZWFib2FyZF9jb21tb25fcGlubXV4X2luaXQoKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1zZWFib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1zZWFib2FyZC5jCmluZGV4IDU2Y2JhYmYuLmJmMTNlYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtc2VhYm9hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLmMKQEAgLTI1LDkgKzI1LDEyIEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogCisjaW5jbHVkZSA8c291bmQvd204OTAzLmg+CisKICNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9zZGhjaS5oPgorI2luY2x1ZGUgPG1hY2gvdGVncmFfd204OTAzX3BkYXRhLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTQxLDcgKzQ0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgZGVidWdfdWFydF9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkvKiBNZW1vcnkgYW5kIElSUSBmaWxsZWQgaW4gYmVmb3JlIHJlZ2lzdHJhdGlvbiAqLwotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9GSVhFRF9UWVBFLAorCQkudHlwZQkJPSBQT1JUX1RFR1JBLAogCQkuaW90eXBlCQk9IFVQSU9fTUVNLAogCQkucmVnc2hpZnQJPSAyLAogCQkudWFydGNsawk9IDIxNjAwMDAwMCwKQEAgLTYyLDYgKzY2LDEyIEBACiAJLyogbmFtZQkJcGFyZW50CQlyYXRlCQllbmFibGVkICovCiAJeyAidWFydGIiLAkicGxsX3AiLAkyMTYwMDAwMDAsCXRydWV9LAogCXsgInVhcnRkIiwJInBsbF9wIiwJMjE2MDAwMDAwLAl0cnVlfSwKKwl7ICJwbGxfYSIsCSJwbGxfcF9vdXQxIiwJNTY0NDgwMDAsCXRydWUgfSwKKwl7ICJwbGxfYV9vdXQwIiwJInBsbF9hIiwJMTEyODk2MDAsCXRydWUgfSwKKwl7ICJjZGV2MSIsCU5VTEwsCQkwLAkJdHJ1ZSB9LAorCXsgImkyczEiLAkicGxsX2Ffb3V0MCIsCTExMjg5NjAwLAlmYWxzZX0sCisJeyAidXNiZCIsCSJjbGtfbSIsCTEyMDAwMDAwLAl0cnVlfSwKKwl7ICJ1c2IzIiwJImNsa19tIiwJMTIwMDAwMDAsCXRydWV9LAogCXsgTlVMTCwJCU5VTEwsCQkwLAkJMH0sCiB9OwogCkBAIC0xMTcsNiArMTI3LDIyIEBACiAJLmlzXzhiaXQJPSAxLAogfTsKIAorc3RhdGljIHN0cnVjdCB0ZWdyYV93bTg5MDNfcGxhdGZvcm1fZGF0YSBzZWFib2FyZF9hdWRpb19wZGF0YSA9IHsKKwkuZ3Bpb19zcGtyX2VuCQk9IFRFR1JBX0dQSU9fU1BLUl9FTiwKKwkuZ3Bpb19ocF9kZXQJCT0gVEVHUkFfR1BJT19IUF9ERVQsCisJLmdwaW9faHBfbXV0ZQkJPSAtMSwKKwkuZ3Bpb19pbnRfbWljX2VuCT0gLTEsCisJLmdwaW9fZXh0X21pY19lbgk9IC0xLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VhYm9hcmRfYXVkaW9fZGV2aWNlID0geworCS5uYW1lCT0gInRlZ3JhLXNuZC13bTg5MDMiLAorCS5pZAk9IDAsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJnNlYWJvYXJkX2F1ZGlvX3BkYXRhLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2VhYm9hcmRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmRlYnVnX3VhcnQsCiAJJnRlZ3JhX3BtdV9kZXZpY2UsCkBAIC0xMjQsNiArMTUwLDEwIEBACiAJJnRlZ3JhX3NkaGNpX2RldmljZTMsCiAJJnRlZ3JhX3NkaGNpX2RldmljZTEsCiAJJnNlYWJvYXJkX2dwaW9fa2V5c19kZXZpY2UsCisJJnRlZ3JhX2kyc19kZXZpY2UxLAorCSZ0ZWdyYV9kYXNfZGV2aWNlLAorCSZ0ZWdyYV9wY21fZGV2aWNlLAorCSZzZWFib2FyZF9hdWRpb19kZXZpY2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgaXNsMjkwMThfZGV2aWNlID0gewpAQCAtMTM1LDEyICsxNjUsNTYgQEAKIAlJMkNfQk9BUkRfSU5GTygiYWR0NzQ2MSIsIDB4NGMpLAogfTsKIAorc3RhdGljIHN0cnVjdCB3bTg5MDNfcGxhdGZvcm1fZGF0YSB3bTg5MDNfcGRhdGEgPSB7CisJLmlycV9hY3RpdmVfbG93ID0gMCwKKwkubWljZGV0X2NmZyA9IDAsCisJLm1pY2RldF9kZWxheSA9IDEwMCwKKwkuZ3Bpb19iYXNlID0gU0VBQk9BUkRfR1BJT19XTTg5MDMoMCksCisJLmdwaW9fY2ZnID0geworCQlXTTg5MDNfR1BJT19OT19DT05GSUcsCisJCVdNODkwM19HUElPX05PX0NPTkZJRywKKwkJMCwKKwkJV004OTAzX0dQSU9fTk9fQ09ORklHLAorCQlXTTg5MDNfR1BJT19OT19DT05GSUcsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSB3bTg5MDNfZGV2aWNlID0geworCUkyQ19CT0FSRF9JTkZPKCJ3bTg5MDMiLCAweDFhKSwKKwkucGxhdGZvcm1fZGF0YSA9ICZ3bTg5MDNfcGRhdGEsCisJLmlycSA9IFRFR1JBX0dQSU9fVE9fSVJRKFRFR1JBX0dQSU9fQ0RDX0lSUSksCit9OworCitzdGF0aWMgaW50IHNlYWJvYXJkX2VoY2lfaW5pdCh2b2lkKQoreworCWludCBncGlvX3N0YXR1czsKKworCWdwaW9fc3RhdHVzID0gZ3Bpb19yZXF1ZXN0KFRFR1JBX0dQSU9fVVNCMSwgIlZCVVNfVVNCMSIpOworCWlmIChncGlvX3N0YXR1cyA8IDApIHsKKwkJcHJfZXJyKCJWQlVTX1VTQjEgcmVxdWVzdCBHUElPIEZBSUxFRFxuIik7CisJCVdBUk5fT04oMSk7CisJfQorCisJZ3Bpb19zdGF0dXMgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoVEVHUkFfR1BJT19VU0IxLCAxKTsKKwlpZiAoZ3Bpb19zdGF0dXMgPCAwKSB7CisJCXByX2VycigiVkJVU19VU0IxIHJlcXVlc3QgR1BJTyBESVJFQ1RJT04gRkFJTEVEXG4iKTsKKwkJV0FSTl9PTigxKTsKKwl9CisJZ3Bpb19zZXRfdmFsdWUoVEVHUkFfR1BJT19VU0IxLCAxKTsKKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdGVncmFfZWhjaTFfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnRlZ3JhX2VoY2kzX2RldmljZSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IHNlYWJvYXJkX2kyY19pbml0KHZvaWQpCiB7CiAJZ3Bpb19yZXF1ZXN0KFRFR1JBX0dQSU9fSVNMMjkwMThfSVJRLCAiaXNsMjkwMTgiKTsKIAlncGlvX2RpcmVjdGlvbl9pbnB1dChURUdSQV9HUElPX0lTTDI5MDE4X0lSUSk7CiAKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCAmaXNsMjkwMThfZGV2aWNlLCAxKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCAmd204OTAzX2RldmljZSwgMSk7CiAKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygzLCAmYWR0NzQ2MV9kZXZpY2UsIDEpOwogCkBAIC0xNjEsNiArMjM1LDggQEAKIAl0ZWdyYV9zZGhjaV9kZXZpY2U0LmRldi5wbGF0Zm9ybV9kYXRhID0gJnNkaGNpX3BkYXRhNDsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNlYWJvYXJkX2RldmljZXMsIEFSUkFZX1NJWkUoc2VhYm9hcmRfZGV2aWNlcykpOworCisJc2VhYm9hcmRfZWhjaV9pbml0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB0ZWdyYV9zZWFib2FyZF9pbml0KHZvaWQpCkBAIC0xODIsNiArMjU4LDkgQEAKIAlkZWJ1Z191YXJ0X3BsYXRmb3JtX2RhdGFbMF0ubWFwYmFzZSA9IFRFR1JBX1VBUlRCX0JBU0U7CiAJZGVidWdfdWFydF9wbGF0Zm9ybV9kYXRhWzBdLmlycSA9IElOVF9VQVJUQjsKIAorCXNlYWJvYXJkX2F1ZGlvX3BkYXRhLmdwaW9faHBfbXV0ZSA9IFRFR1JBX0dQSU9fS0FFTl9IUF9NVVRFOworCXRlZ3JhX2dwaW9fZW5hYmxlKFRFR1JBX0dQSU9fS0FFTl9IUF9NVVRFKTsKKwogCXNlYWJvYXJkX2NvbW1vbl9pbml0KCk7CiAKIAlzZWFib2FyZF9pMmNfaW5pdCgpOwpAQCAtMjAxLDcgKzI4MCw3IEBACiAKIAogTUFDSElORV9TVEFSVChTRUFCT0FSRCwgInNlYWJvYXJkIikKLQkuYm9vdF9wYXJhbXMgICAgPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHRlZ3JhX21hcF9jb21tb25faW8sCiAJLmluaXRfZWFybHkgICAgID0gdGVncmFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgICAgICAgPSB0ZWdyYV9pbml0X2lycSwKQEAgLTIxMCw3ICsyODksNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChLQUVOLCAia2FlbiIpCi0JLmJvb3RfcGFyYW1zICAgID0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSB0ZWdyYV9tYXBfY29tbW9uX2lvLAogCS5pbml0X2Vhcmx5ICAgICA9IHRlZ3JhX2luaXRfZWFybHksCiAJLmluaXRfaXJxICAgICAgID0gdGVncmFfaW5pdF9pcnEsCkBAIC0yMTksNyArMjk4LDcgQEAKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoV0FSSU8sICJ3YXJpbyIpCi0JLmJvb3RfcGFyYW1zICAgID0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSB0ZWdyYV9tYXBfY29tbW9uX2lvLAogCS5pbml0X2Vhcmx5ICAgICA9IHRlZ3JhX2luaXRfZWFybHksCiAJLmluaXRfaXJxICAgICAgID0gdGVncmFfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLmggYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLmgKaW5kZXggZDg0MTVlMS4uNGM0NWQ0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1zZWFib2FyZC5oCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtc2VhYm9hcmQuaApAQCAtMTcsNiArMTcsMTEgQEAKICNpZm5kZWYgX01BQ0hfVEVHUkFfQk9BUkRfU0VBQk9BUkRfSAogI2RlZmluZSBfTUFDSF9URUdSQV9CT0FSRF9TRUFCT0FSRF9ICiAKKyNpbmNsdWRlIDxtYWNoL2dwaW8tdGVncmEuaD4KKworI2RlZmluZSBTRUFCT0FSRF9HUElPX1RQUzY1ODZYKF94XykJKFRFR1JBX05SX0dQSU9TICsgKF94XykpCisjZGVmaW5lIFNFQUJPQVJEX0dQSU9fV004OTAzKF94XykJKFNFQUJPQVJEX0dQSU9fVFBTNjU4NlgoNCkgKyAoX3hfKSkKKwogI2RlZmluZSBURUdSQV9HUElPX1NEMl9DRAkJVEVHUkFfR1BJT19QSTUKICNkZWZpbmUgVEVHUkFfR1BJT19TRDJfV1AJCVRFR1JBX0dQSU9fUEgxCiAjZGVmaW5lIFRFR1JBX0dQSU9fU0QyX1BPV0VSCQlURUdSQV9HUElPX1BJNgpAQCAtMzEsMTAgKzM2LDExIEBACiAjZGVmaW5lIFRFR1JBX0dQSU9fTUFHTkVUT01FVEVSCQlURUdSQV9HUElPX1BONQogI2RlZmluZSBURUdSQV9HUElPX0lTTDI5MDE4X0lSUQkJVEVHUkFfR1BJT19QWjIKICNkZWZpbmUgVEVHUkFfR1BJT19BQ19PTkxJTkUJCVRFR1JBX0dQSU9fUFYzCi0KLSNkZWZpbmUgVFBTX0dQSU9fQkFTRQkJCVRFR1JBX05SX0dQSU9TCi0KLSNkZWZpbmUgVFBTX0dQSU9fV1dBTl9QV1IJCShUUFNfR1BJT19CQVNFICsgMikKKyNkZWZpbmUgVEVHUkFfR1BJT19XV0FOX1BXUgkJU0VBQk9BUkRfR1BJT19UUFM2NTg2WCgyKQorI2RlZmluZSBURUdSQV9HUElPX0NEQ19JUlEJCVRFR1JBX0dQSU9fUFgzCisjZGVmaW5lIFRFR1JBX0dQSU9fU1BLUl9FTgkJU0VBQk9BUkRfR1BJT19XTTg5MDMoMikKKyNkZWZpbmUgVEVHUkFfR1BJT19IUF9ERVQJCVRFR1JBX0dQSU9fUFgxCisjZGVmaW5lIFRFR1JBX0dQSU9fS0FFTl9IUF9NVVRFCQlURUdSQV9HUElPX1BBNQogCiB2b2lkIHNlYWJvYXJkX3Bpbm11eF9pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXRyaW1zbGljZS1waW5tdXguYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLXBpbm11eC5jCmluZGV4IDQ3YzU5NmMuLjdhYjcxOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLXBpbm11eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLXBpbm11eC5jCkBAIC0xMywxNSArMTMsMTYgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNpbmNsdWRlIDxtYWNoL3Bpbm11eC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiZ3Bpby1uYW1lcy5oIgogI2luY2x1ZGUgImJvYXJkLXRyaW1zbGljZS5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKIAogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IHRlZ3JhX3Bpbmdyb3VwX2NvbmZpZyB0cmltc2xpY2VfcGlubXV4W10gPSB7CiAJe1RFR1JBX1BJTkdST1VQX0FUQSwgICBURUdSQV9NVVhfSURFLCAgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsCVRFR1JBX1RSSV9UUklTVEFURX0sCkBAIC0xNDIsNiArMTQzLDExIEBACiAJe1RFR1JBX1BJTkdST1VQX1hNMkQsICBURUdSQV9NVVhfTk9ORSwgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgICAgVEVHUkFfVFJJX05PUk1BTH0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGlubXV4X2RldmljZXNbXSA9IHsKKwkmdGVncmFfZ3Bpb19kZXZpY2UsCisJJnRlZ3JhX3Bpbm11eF9kZXZpY2UsCit9OworCiBzdGF0aWMgc3RydWN0IHRlZ3JhX2dwaW9fdGFibGUgZ3Bpb190YWJsZVtdID0gewogCXsgLmdwaW8gPSBUUklNU0xJQ0VfR1BJT19TRDRfQ0QsIC5lbmFibGUgPSB0cnVlCX0sIC8qIG1tYzQgY2QgKi8KIAl7IC5ncGlvID0gVFJJTVNMSUNFX0dQSU9fU0Q0X1dQLCAuZW5hYmxlID0gdHJ1ZQl9LCAvKiBtbWM0IHdwICovCkBAIC0xNTIsNiArMTU4LDkgQEAKIAogdm9pZCBfX2luaXQgdHJpbXNsaWNlX3Bpbm11eF9pbml0KHZvaWQpCiB7CisJaWYgKCFvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIm52aWRpYSx0ZWdyYTIwIikpCisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBpbm11eF9kZXZpY2VzLAorCQkJCQlBUlJBWV9TSVpFKHBpbm11eF9kZXZpY2VzKSk7CiAJdGVncmFfcGlubXV4X2NvbmZpZ190YWJsZSh0cmltc2xpY2VfcGlubXV4LCBBUlJBWV9TSVpFKHRyaW1zbGljZV9waW5tdXgpKTsKIAl0ZWdyYV9ncGlvX2NvbmZpZyhncGlvX3RhYmxlLCBBUlJBWV9TSVpFKGdwaW9fdGFibGUpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXRyaW1zbGljZS5jCmluZGV4IDY1MmMzNDAuLjFhNjYxN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC10cmltc2xpY2UuYwpAQCAtMzIsNyArMzIsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvc2RoY2kuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2luY2x1ZGUgImJvYXJkLmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKQEAgLTQ2LDcgKzQ1LDggQEAKIAkJLm1lbWJhc2UJPSBJT19BRERSRVNTKFRFR1JBX1VBUlRBX0JBU0UpLAogCQkubWFwYmFzZQk9IFRFR1JBX1VBUlRBX0JBU0UsCiAJCS5pcnEJCT0gSU5UX1VBUlRBLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9GSVhFRF9UWVBFLAorCQkudHlwZQkJPSBQT1JUX1RFR1JBLAogCQkuaW90eXBlCQk9IFVQSU9fTUVNLAogCQkucmVnc2hpZnQJPSAyLAogCQkudWFydGNsawk9IDIxNjAwMDAwMCwKQEAgLTE3MSw3ICsxNzEsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFRSSU1TTElDRSwgInRyaW1zbGljZSIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuZml4dXAJCT0gdGVncmFfdHJpbXNsaWNlX2ZpeHVwLAogCS5tYXBfaW8gICAgICAgICA9IHRlZ3JhX21hcF9jb21tb25faW8sCiAJLmluaXRfZWFybHkJPSB0ZWdyYV9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC10cmltc2xpY2UuaCBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLmgKaW5kZXggN2E3ZGVlOC4uNTBmMTI4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC10cmltc2xpY2UuaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXRyaW1zbGljZS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIF9NQUNIX1RFR1JBX0JPQVJEX1RSSU1TTElDRV9ICiAjZGVmaW5lIF9NQUNIX1RFR1JBX0JPQVJEX1RSSU1TTElDRV9ICiAKKyNpbmNsdWRlIDxtYWNoL2dwaW8tdGVncmEuaD4KKwogI2RlZmluZSBUUklNU0xJQ0VfR1BJT19TRDRfQ0QJVEVHUkFfR1BJT19QUDEJLyogbW1jNCBjZCAqLwogI2RlZmluZSBUUklNU0xJQ0VfR1BJT19TRDRfV1AJVEVHUkFfR1BJT19QUDIJLyogbW1jNCB3cCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9jb21tb24uYwppbmRleCBkNWUzZjg5Li42OTBiODg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvY29tbW9uLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAl7IE5VTEwsCQlOVUxMLAkJMCwJCTB9LAogfTsKIAotdm9pZCBfX2luaXQgdGVncmFfaW5pdF9jYWNoZSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHRlZ3JhX2luaXRfY2FjaGUodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAogCXZvaWQgX19pb21lbSAqcCA9IElPX0FERFJFU1MoVEVHUkFfQVJNX1BFUklGX0JBU0UpICsgMHgzMDAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9jcHUtdGVncmEuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvY3B1LXRlZ3JhLmMKaW5kZXggMGUwZmQ0ZC4uYmI1Y2UzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9jcHUtdGVncmEuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2NwdS10ZWdyYS5jCkBAIC01NiwxMiArNTYsMTIgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgodGVncmFfY3B1X2xvY2spOwogc3RhdGljIGJvb2wgaXNfc3VzcGVuZGVkOwogCi1pbnQgdGVncmFfdmVyaWZ5X3NwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQorc3RhdGljIGludCB0ZWdyYV92ZXJpZnlfc3BlZWQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIGZyZXFfdGFibGUpOwogfQogCi11bnNpZ25lZCBpbnQgdGVncmFfZ2V0c3BlZWQodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVncmFfZ2V0c3BlZWQodW5zaWduZWQgaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIHJhdGU7CiAKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAogCQkgICAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQogewotCWludCBpZHg7CisJdW5zaWduZWQgaW50IGlkeDsKIAl1bnNpZ25lZCBpbnQgZnJlcTsKIAlpbnQgcmV0ID0gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2RldmljZXMuYwppbmRleCA1N2UzNWQyLi43YTJhMDJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2RldmljZXMuYwpAQCAtMjksNyArMjksOTMgQEAKICNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL3VzYl9waHkuaD4KKwogI2luY2x1ZGUgImdwaW8tbmFtZXMuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ3Bpb19yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gVEVHUkFfR1BJT19CQVNFLAorCQkuZW5kCT0gVEVHUkFfR1BJT19CQVNFICsgVEVHUkFfR1BJT19TSVpFLTEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJTlRfR1BJTzEsCisJCS5lbmQJPSBJTlRfR1BJTzEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBJTlRfR1BJTzIsCisJCS5lbmQJPSBJTlRfR1BJTzIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBJTlRfR1BJTzMsCisJCS5lbmQJPSBJTlRfR1BJTzMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzRdID0geworCQkuc3RhcnQJPSBJTlRfR1BJTzQsCisJCS5lbmQJPSBJTlRfR1BJTzQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzVdID0geworCQkuc3RhcnQJPSBJTlRfR1BJTzUsCisJCS5lbmQJPSBJTlRfR1BJTzUsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzZdID0geworCQkuc3RhcnQJPSBJTlRfR1BJTzYsCisJCS5lbmQJPSBJTlRfR1BJTzYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzddID0geworCQkuc3RhcnQJPSBJTlRfR1BJTzcsCisJCS5lbmQJPSBJTlRfR1BJTzcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRlZ3JhX2dwaW9fZGV2aWNlID0geworCS5uYW1lCQk9ICJ0ZWdyYS1ncGlvIiwKKwkuaWQJCT0gLTEsCisJLnJlc291cmNlCT0gZ3Bpb19yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZ3Bpb19yZXNvdXJjZSksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBpbm11eF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLyogVHJpLXN0YXRlIHJlZ2lzdGVycyAqLworCQkuc3RhcnQJPSBURUdSQV9BUEJfTUlTQ19CQVNFICsgMHgxNCwKKwkJLmVuZAk9IFRFR1JBX0FQQl9NSVNDX0JBU0UgKyAweDIwICsgMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS8qIE11eCByZWdpc3RlcnMgKi8KKwkJLnN0YXJ0CT0gVEVHUkFfQVBCX01JU0NfQkFTRSArIDB4ODAsCisJCS5lbmQJPSBURUdSQV9BUEJfTUlTQ19CQVNFICsgMHg5YyArIDMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzJdID0geworCQkvKiBQdWxsLXVwL2Rvd24gcmVnaXN0ZXJzICovCisJCS5zdGFydAk9IFRFR1JBX0FQQl9NSVNDX0JBU0UgKyAweGEwLAorCQkuZW5kCT0gVEVHUkFfQVBCX01JU0NfQkFTRSArIDB4YjAgKyAzLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVszXSA9IHsKKwkJLyogUGFkIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJCS5zdGFydAk9IFRFR1JBX0FQQl9NSVNDX0JBU0UgKyAweDg2OCwKKwkJLmVuZAk9IFRFR1JBX0FQQl9NSVNDX0JBU0UgKyAweDkwYyArIDMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRlZ3JhX3Bpbm11eF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInRlZ3JhLXBpbm11eCIsCisJLmlkCQk9IC0xLAorCS5yZXNvdXJjZQk9IHBpbm11eF9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocGlubXV4X3Jlc291cmNlKSwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaTJjX3Jlc291cmNlMVtdID0gewogCVswXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvZGV2aWNlcy5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9kZXZpY2VzLmgKaW5kZXggNGE3ZGMwYS4uODczZWNiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9kZXZpY2VzLmgKQEAgLTIxLDYgKzIxLDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSB0ZWdyYV9ncGlvX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRlZ3JhX3Bpbm11eF9kZXZpY2U7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSB0ZWdyYV9zZGhjaV9kZXZpY2UxOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdGVncmFfc2RoY2lfZGV2aWNlMjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRlZ3JhX3NkaGNpX2RldmljZTM7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9kbWEuYwppbmRleCBmNGVmNWViLi5jMGNmOTY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvZG1hLmMKQEAgLTEwNSwxMyArMTA1LDE3IEBACiAKICNkZWZpbmUgTlZfRE1BX01BWF9UUkFTRkVSX1NJWkUgMHgxMDAwMAogCi1jb25zdCB1bnNpZ25lZCBpbnQgYWhiX2FkZHJfd3JhcF90YWJsZVs4XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWhiX2FkZHJfd3JhcF90YWJsZVs4XSA9IHsKIAkwLCAzMiwgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgKIH07CiAKLWNvbnN0IHVuc2lnbmVkIGludCBhcGJfYWRkcl93cmFwX3RhYmxlWzhdID0gezAsIDEsIDIsIDQsIDgsIDE2LCAzMiwgNjR9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhcGJfYWRkcl93cmFwX3RhYmxlWzhdID0geworCTAsIDEsIDIsIDQsIDgsIDE2LCAzMiwgNjQKK307CiAKLWNvbnN0IHVuc2lnbmVkIGludCBidXNfd2lkdGhfdGFibGVbNV0gPSB7OCwgMTYsIDMyLCA2NCwgMTI4fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYnVzX3dpZHRoX3RhYmxlWzVdID0geworCTgsIDE2LCAzMiwgNjQsIDEyOAorfTsKIAogI2RlZmluZSBURUdSQV9ETUFfTkFNRV9TSVpFIDE2CiBzdHJ1Y3QgdGVncmFfZG1hX2NoYW5uZWwgewpAQCAtMTU3LDcgKzE2MSw3IEBACiAJcmV0dXJuOwogfQogCi12b2lkIHRlZ3JhX2RtYV9zdG9wKHN0cnVjdCB0ZWdyYV9kbWFfY2hhbm5lbCAqY2gpCitzdGF0aWMgdm9pZCB0ZWdyYV9kbWFfc3RvcChzdHJ1Y3QgdGVncmFfZG1hX2NoYW5uZWwgKmNoKQogewogCXUzMiBjc3I7CiAJdTMyIHN0YXR1czsKQEAgLTE3NCw3ICsxNzgsNyBAQAogCQl3cml0ZWwoc3RhdHVzLCBjaC0+YWRkciArIEFQQl9ETUFfQ0hBTl9TVEEpOwogfQogCi1pbnQgdGVncmFfZG1hX2NhbmNlbChzdHJ1Y3QgdGVncmFfZG1hX2NoYW5uZWwgKmNoKQorc3RhdGljIGludCB0ZWdyYV9kbWFfY2FuY2VsKHN0cnVjdCB0ZWdyYV9kbWFfY2hhbm5lbCAqY2gpCiB7CiAJdTMyIGNzcjsKIAl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGUwZWJlNjUuLjYxOWFiYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPG1hY2gvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+CiAKLQkubWFjcm8gIGFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8gIGFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogICAgICAgICBsZHIgICAgIFxycCwgPUlPX0FQQl9QSFlTICAgICAgIEAgcGh5c2ljYWwKICAgICAgICAgbGRyICAgICBccnYsID1JT19BUEJfVklSVCAgICAgICAgQCB2aXJ0dWFsCiAJb3JyCVxycCwgXHJwLCAjKFRFR1JBX0RFQlVHX1VBUlRfQkFTRSAmIDB4RkYpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9ncGlvLXRlZ3JhLmggYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9ncGlvLXRlZ3JhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkMzdmZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2dwaW8tdGVncmEuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvZ3Bpby5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSwgSW5jLgorICoKKyAqIEF1dGhvcjoKKyAqCUVyaWsgR2lsbGluZyA8a29ua2Vyc0Bnb29nbGUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19NQUNIX1RFR1JBX0dQSU9fVEVHUkFfSAorI2RlZmluZSBfX01BQ0hfVEVHUkFfR1BJT19URUdSQV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCisjZGVmaW5lIFRFR1JBX05SX0dQSU9TCQlJTlRfR1BJT19OUgorCisjZGVmaW5lIFRFR1JBX0dQSU9fVE9fSVJRKGdwaW8pIChJTlRfR1BJT19CQVNFICsgKGdwaW8pKQorCitzdHJ1Y3QgdGVncmFfZ3Bpb190YWJsZSB7CisJaW50CWdwaW87CS8qIEdQSU8gbnVtYmVyICovCisJYm9vbAllbmFibGU7CS8qIEVuYWJsZSBmb3IgR1BJTyBhdCBpbml0PyAqLworfTsKKwordm9pZCB0ZWdyYV9ncGlvX2NvbmZpZyhzdHJ1Y3QgdGVncmFfZ3Bpb190YWJsZSAqdGFibGUsIGludCBudW0pOwordm9pZCB0ZWdyYV9ncGlvX2VuYWJsZShpbnQgZ3Bpbyk7Cit2b2lkIHRlZ3JhX2dwaW9fZGlzYWJsZShpbnQgZ3Bpbyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDE5NmYxMTQuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEsNjAgKzEgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9ncGlvLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlLCBJbmMuCi0gKgotICogQXV0aG9yOgotICoJRXJpayBHaWxsaW5nIDxrb25rZXJzQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfVEVHUkFfR1BJT19ICi0jZGVmaW5lIF9fTUFDSF9URUdSQV9HUElPX0gKLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLQotI2RlZmluZSBURUdSQV9OUl9HUElPUwkJSU5UX0dQSU9fTlIKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotI2RlZmluZSBncGlvX2dldF92YWx1ZQkJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQkJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCQlfX2dwaW9fY2Fuc2xlZXAKLQotI2RlZmluZSBURUdSQV9HUElPX1RPX0lSUShncGlvKSAoSU5UX0dQSU9fQkFTRSArIChncGlvKSkKLSNkZWZpbmUgVEVHUkFfSVJRX1RPX0dQSU8oaXJxKSAoKGlycSkgLSBJTlRfR1BJT19CQVNFKQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBpbnQgZ3BpbykKLXsKLQlpZiAoZ3BpbyA8IFRFR1JBX05SX0dQSU9TKQotCQlyZXR1cm4gSU5UX0dQSU9fQkFTRSArIGdwaW87Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKChpcnEgPj0gSU5UX0dQSU9fQkFTRSkgJiYgKGlycSA8IElOVF9HUElPX0JBU0UgKyBJTlRfR1BJT19OUikpCi0JCXJldHVybiBpcnEgLSBJTlRfR1BJT19CQVNFOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdHJ1Y3QgdGVncmFfZ3Bpb190YWJsZSB7Ci0JaW50CWdwaW87CS8qIEdQSU8gbnVtYmVyICovCi0JYm9vbAllbmFibGU7CS8qIEVuYWJsZSBmb3IgR1BJTyBhdCBpbml0PyAqLwotfTsKLQotdm9pZCB0ZWdyYV9ncGlvX2NvbmZpZyhzdHJ1Y3QgdGVncmFfZ3Bpb190YWJsZSAqdGFibGUsIGludCBudW0pOwotdm9pZCB0ZWdyYV9ncGlvX2VuYWJsZShpbnQgZ3Bpbyk7Ci12b2lkIHRlZ3JhX2dwaW9fZGlzYWJsZShpbnQgZ3Bpbyk7Ci0KLSNlbmRpZgorLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IDRjZWEyMjMuLjM1YTAxMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvaW8uaApAQCAtMzMsMjAgKzMzLDI2IEBACiAgKgogICovCiAKKyNpZmRlZiBfX0FTU0VNQkxZX18KKyNkZWZpbmUgSU9NRU0oeCkJKHgpCisjZWxzZQorI2RlZmluZSBJT01FTSh4KQkoKHZvaWQgX19mb3JjZSBfX2lvbWVtICopKHgpKQorI2VuZGlmCisKICNkZWZpbmUgSU9fSVJBTV9QSFlTCTB4NDAwMDAwMDAKLSNkZWZpbmUgSU9fSVJBTV9WSVJUCTB4RkU0MDAwMDAKKyNkZWZpbmUgSU9fSVJBTV9WSVJUCUlPTUVNKDB4RkU0MDAwMDApCiAjZGVmaW5lIElPX0lSQU1fU0laRQlTWl8yNTZLCiAKICNkZWZpbmUgSU9fQ1BVX1BIWVMgICAgIDB4NTAwNDAwMDAKLSNkZWZpbmUgSU9fQ1BVX1ZJUlQgICAgIDB4RkUwMDAwMDAKKyNkZWZpbmUgSU9fQ1BVX1ZJUlQgICAgIElPTUVNKDB4RkUwMDAwMDApCiAjZGVmaW5lIElPX0NQVV9TSVpFCVNaXzE2SwogCiAjZGVmaW5lIElPX1BQU0JfUEhZUwkweDYwMDAwMDAwCi0jZGVmaW5lIElPX1BQU0JfVklSVAkweEZFMjAwMDAwCisjZGVmaW5lIElPX1BQU0JfVklSVAlJT01FTSgweEZFMjAwMDAwKQogI2RlZmluZSBJT19QUFNCX1NJWkUJU1pfMU0KIAogI2RlZmluZSBJT19BUEJfUEhZUwkweDcwMDAwMDAwCi0jZGVmaW5lIElPX0FQQl9WSVJUCTB4RkUzMDAwMDAKKyNkZWZpbmUgSU9fQVBCX1ZJUlQJSU9NRU0oMHhGRTMwMDAwMCkKICNkZWZpbmUgSU9fQVBCX1NJWkUJU1pfMU0KIAogI2RlZmluZSBJT19UT19WSVJUX0JFVFdFRU4ocCwgc3QsIHN6KQkoKHApID49IChzdCkgJiYgKHApIDwgKChzdCkgKyAoc3opKSkKQEAgLTYxLDcgKzY3LDcgQEAKIAkJSU9fVE9fVklSVF9YTEFURSgobiksIElPX0NQVV9QSFlTLCBJT19DUFVfVklSVCkgOglcCiAJSU9fVE9fVklSVF9CRVRXRUVOKChuKSwgSU9fSVJBTV9QSFlTLCBJT19JUkFNX1NJWkUpID8JCVwKIAkJSU9fVE9fVklSVF9YTEFURSgobiksIElPX0lSQU1fUEhZUywgSU9fSVJBTV9WSVJUKSA6CVwKLQkwKQorCU5VTEwpCiAKICNpZm5kZWYgX19BU1NFTUJMRVJfXwogCkBAIC03MSw3ICs3Nyw3IEBACiB2b2lkIF9faW9tZW0gKnRlZ3JhX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHR5cGUpOwogdm9pZCB0ZWdyYV9pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CiAKLSNkZWZpbmUgSU9fQUREUkVTUyhuKSAoKHZvaWQgX19pb21lbSAqKSBJT19UT19WSVJUKG4pKQorI2RlZmluZSBJT19BRERSRVNTKG4pIChJT19UT19WSVJUKG4pKQogCiAjaWZkZWYgQ09ORklHX1RFR1JBX1BDSQogZXh0ZXJuIHZvaWQgX19pb21lbSAqdGVncmFfcGNpZV9pb19iYXNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3ZGIzYWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlLCBJbmMuCi0gKgotICogQXV0aG9yOgotICoJQ29saW4gQ3Jvc3MgPGNjcm9zc0Bnb29nbGUuY29tPgotICoJRXJpayBHaWxsaW5nIDxrb25rZXJzQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfVEVHUkFfTUVNT1JZX0gKLSNkZWZpbmUgX19NQUNIX1RFR1JBX01FTU9SWV9ICi0KLS8qIHBoeXNpY2FsIG9mZnNldCBvZiBSQU0gKi8KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMCkKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL3Bpbm11eC5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvcGlubXV4LmgKaW5kZXggZGVmZDg3Ny4uYmI3ZGZkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvcGlubXV4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvcGlubXV4LmgKQEAgLTE5OSw2ICsxOTksNyBAQAogCiBzdHJ1Y3QgdGVncmFfZHJpdmVfcGluZ3JvdXBfZGVzYyB7CiAJY29uc3QgY2hhciAqbmFtZTsKKwlzMTYgcmVnX2Jhbms7CiAJczE2IHJlZzsKIH07CiAKQEAgLTIwNyw2ICsyMDgsOSBAQAogCWludCBmdW5jc1s0XTsKIAlpbnQgZnVuY19zYWZlOwogCWludCB2ZGRpbzsKKwlzMTYgdHJpX2Jhbms7CS8qIFJlZ2lzdGVyIGJhbmsgdGhlIHRyaV9yZWcgZXhpc3RzIHdpdGhpbiAqLworCXMxNiBtdXhfYmFuazsJLyogUmVnaXN0ZXIgYmFuayB0aGUgbXV4X3JlZyBleGlzdHMgd2l0aGluICovCisJczE2IHB1cGRfYmFuazsJLyogUmVnaXN0ZXIgYmFuayB0aGUgcHVwZF9yZWcgZXhpc3RzIHdpdGhpbiAqLwogCXMxNiB0cmlfcmVnOyAJLyogb2Zmc2V0IGludG8gdGhlIFRSSVNUQVRFX1JFR18qIHJlZ2lzdGVyIGJhbmsgKi8KIAlzMTYgbXV4X3JlZzsJLyogb2Zmc2V0IGludG8gdGhlIFBJTl9NVVhfQ1RMXyogcmVnaXN0ZXIgYmFuayAqLwogCXMxNiBwdXBkX3JlZzsJLyogb2Zmc2V0IGludG8gdGhlIFBVTExfVVBET1dOX1JFR18qIHJlZ2lzdGVyIGJhbmsgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL3Bvd2VyZ2F0ZS5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvcG93ZXJnYXRlLmgKaW5kZXggNDAxZDFiNy4uMzljMzk2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvcG93ZXJnYXRlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvcG93ZXJnYXRlLmgKQEAgLTMxLDcgKzMxLDYgQEAKIAogaW50IHRlZ3JhX3Bvd2VyZ2F0ZV9wb3dlcl9vbihpbnQgaWQpOwogaW50IHRlZ3JhX3Bvd2VyZ2F0ZV9wb3dlcl9vZmYoaW50IGlkKTsKLWJvb2wgdGVncmFfcG93ZXJnYXRlX2lzX3Bvd2VyZWQoaW50IGlkKTsKIGludCB0ZWdyYV9wb3dlcmdhdGVfcmVtb3ZlX2NsYW1waW5nKGludCBpZCk7CiAKIC8qIE11c3QgYmUgY2FsbGVkIHdpdGggY2xrIGRpc2FibGVkLCBhbmQgcmV0dXJucyB3aXRoIGNsayBlbmFibGVkICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2lvLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2lvLmMKaW5kZXggZWE1MGZlMi4uNTQ4OWY4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pby5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvaW8uYwpAQCAtMzEsMjUgKzMxLDI1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdGVncmFfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJewotCQkudmlydHVhbCA9IElPX1BQU0JfVklSVCwKKwkJLnZpcnR1YWwgPSAodW5zaWduZWQgbG9uZylJT19QUFNCX1ZJUlQsCiAJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKElPX1BQU0JfUEhZUyksCiAJCS5sZW5ndGggPSBJT19QUFNCX1NJWkUsCiAJCS50eXBlID0gTVRfREVWSUNFLAogCX0sCiAJewotCQkudmlydHVhbCA9IElPX0FQQl9WSVJULAorCQkudmlydHVhbCA9ICh1bnNpZ25lZCBsb25nKUlPX0FQQl9WSVJULAogCQkucGZuID0gX19waHlzX3RvX3BmbihJT19BUEJfUEhZUyksCiAJCS5sZW5ndGggPSBJT19BUEJfU0laRSwKIAkJLnR5cGUgPSBNVF9ERVZJQ0UsCiAJfSwKIAl7Ci0JCS52aXJ0dWFsID0gSU9fQ1BVX1ZJUlQsCisJCS52aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpSU9fQ1BVX1ZJUlQsCiAJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKElPX0NQVV9QSFlTKSwKIAkJLmxlbmd0aCA9IElPX0NQVV9TSVpFLAogCQkudHlwZSA9IE1UX0RFVklDRSwKIAl9LAogCXsKLQkJLnZpcnR1YWwgPSBJT19JUkFNX1ZJUlQsCisJCS52aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpSU9fSVJBTV9WSVJULAogCQkucGZuID0gX19waHlzX3RvX3BmbihJT19JUkFNX1BIWVMpLAogCQkubGVuZ3RoID0gSU9fSVJBTV9TSVpFLAogCQkudHlwZSA9IE1UX0RFVklDRSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMKaW5kZXggZjFmNjk5ZC4uOTdlZjNlNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CkBAIC00MSw2ICs0Miw4IEBACiAjaW5jbHVkZSA8bWFjaC9jbGsuaD4KICNpbmNsdWRlIDxtYWNoL3Bvd2VyZ2F0ZS5oPgogCisjaW5jbHVkZSAiYm9hcmQuaCIKKwogLyogcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgQUZJX09GRlNFVAkweDM4MDAKICNkZWZpbmUgUEFEU19PRkZTRVQJMHgzMDAwCkBAIC0xNTAsOSArMTUzLDkgQEAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnJlZ19wbWNfYmFzZSA9IElPX0FERFJFU1MoVEVHUkFfUE1DX0JBU0UpOwogCiAjZGVmaW5lIHBtY193cml0ZWwodmFsdWUsIHJlZykgXAotCV9fcmF3X3dyaXRlbCh2YWx1ZSwgKHUzMilyZWdfcG1jX2Jhc2UgKyAocmVnKSkKKwlfX3Jhd193cml0ZWwodmFsdWUsIHJlZ19wbWNfYmFzZSArIChyZWcpKQogI2RlZmluZSBwbWNfcmVhZGwocmVnKSBcCi0JX19yYXdfcmVhZGwoKHUzMilyZWdfcG1jX2Jhc2UgKyAocmVnKSkKKwlfX3Jhd19yZWFkbChyZWdfcG1jX2Jhc2UgKyAocmVnKSkKIAogLyoKICAqIFRlZ3JhMiBkZWZpbmVzIDFHQiBpbiB0aGUgQVhJIGFkZHJlc3MgbWFwIGZvciBQQ0llLgpAQCAtNDYwLDcgKzQ2Myw3IEBACiAJc3RydWN0IHRlZ3JhX3BjaWVfcG9ydCAqcHA7CiAKIAlpZiAobnIgPj0gdGVncmFfcGNpZS5udW1fcG9ydHMpCi0JCXJldHVybiAwOworCQlyZXR1cm4gTlVMTDsKIAogCXBwID0gdGVncmFfcGNpZS5wb3J0ICsgbnI7CiAJcHAtPnJvb3RfYnVzX25yID0gc3lzLT5idXNucjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvcGlubXV4LXQyLXRhYmxlcy5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9waW5tdXgtdDItdGFibGVzLmMKaW5kZXggYTQ3NTM2Ny4uYTBkYzJiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9waW5tdXgtdDItdGFibGVzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9waW5tdXgtdDItdGFibGVzLmMKQEAgLTMxLDEwICszMSwxNiBAQAogI2luY2x1ZGUgPG1hY2gvcGlubXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9zdXNwZW5kLmg+CiAKKyNkZWZpbmUgVFJJU1RBVEVfUkVHX0EJCTB4MTQKKyNkZWZpbmUgUElOX01VWF9DVExfUkVHX0EJMHg4MAorI2RlZmluZSBQVUxMVVBET1dOX1JFR19BCTB4YTAKKyNkZWZpbmUgUElOR1JPVVBfUkVHX0EJCTB4ODY4CisKICNkZWZpbmUgRFJJVkVfUElOR1JPVVAocGdfbmFtZSwgcikJCQkJXAogCVtURUdSQV9EUklWRV9QSU5HUk9VUF8gIyMgcGdfbmFtZV0gPSB7CQkJXAogCQkubmFtZSA9ICNwZ19uYW1lLAkJCQlcCi0JCS5yZWcgPSByCQkJCQlcCisJCS5yZWdfYmFuayA9IDMsCQkJCQlcCisJCS5yZWcgPSAoKHIpIC0gUElOR1JPVVBfUkVHX0EpCQkJXAogCX0KIAogY29uc3Qgc3RydWN0IHRlZ3JhX2RyaXZlX3Bpbmdyb3VwX2Rlc2MgdGVncmFfc29jX2RyaXZlX3Bpbmdyb3Vwc1tURUdSQV9NQVhfRFJJVkVfUElOR1JPVVBdID0gewpAQCAtOTAsMTEgKzk2LDE0IEBACiAJCQlURUdSQV9NVVhfICMjIGYzLAkJCVwKIAkJfSwJCQkJCQlcCiAJCS5mdW5jX3NhZmUgPSBURUdSQV9NVVhfICMjIGZfc2FmZSwJCVwKLQkJLnRyaV9yZWcgPSB0cmlfciwJCQkJXAorCQkudHJpX2JhbmsgPSAwLAkJCQkJXAorCQkudHJpX3JlZyA9ICgodHJpX3IpIC0gVFJJU1RBVEVfUkVHX0EpLAkJXAogCQkudHJpX2JpdCA9IHRyaV9iLAkJCQlcCi0JCS5tdXhfcmVnID0gbXV4X3IsCQkJCVwKKwkJLm11eF9iYW5rID0gMSwJCQkJCVwKKwkJLm11eF9yZWcgPSAoKG11eF9yKSAtIFBJTl9NVVhfQ1RMX1JFR19BKSwJXAogCQkubXV4X2JpdCA9IG11eF9iLAkJCQlcCi0JCS5wdXBkX3JlZyA9IHB1cGRfciwJCQkJXAorCQkucHVwZF9iYW5rID0gMiwJCQkJXAorCQkucHVwZF9yZWcgPSAoKHB1cGRfcikgLSBQVUxMVVBET1dOX1JFR19BKSwJXAogCQkucHVwZF9iaXQgPSBwdXBkX2IsCQkJCVwKIAl9CiAKQEAgLTIxNyw2MiArMjI2LDMgQEAKIAlQSU5HUk9VUChYTTJDLCAgRERSLCAgIFJTVkQsICAgICAgUlNWRCwgICAgICBSU1ZELCAgICAgIFJTVkQsICAgICAgICAgIFJTVkQsICAgICAgLTEsICAgLTEsIC0xLCAgIC0xLCAweEE4LCAzMCksCiAJUElOR1JPVVAoWE0yRCwgIEREUiwgICBSU1ZELCAgICAgIFJTVkQsICAgICAgUlNWRCwgICAgICBSU1ZELCAgICAgICAgICBSU1ZELCAgICAgIC0xLCAgIC0xLCAtMSwgICAtMSwgMHhBOCwgMjgpLAogfTsKLQotI2lmZGVmIENPTkZJR19QTQotI2RlZmluZSBUUklTVEFURV9SRUdfQSAgICAgICAgIDB4MTQKLSNkZWZpbmUgVFJJU1RBVEVfUkVHX05VTSAgICAgICA0Ci0jZGVmaW5lIFBJTl9NVVhfQ1RMX1JFR19BICAgICAgMHg4MAotI2RlZmluZSBQSU5fTVVYX0NUTF9SRUdfTlVNICAgIDgKLSNkZWZpbmUgUFVMTFVQRE9XTl9SRUdfQSAgICAgICAweGEwCi0jZGVmaW5lIFBVTExVUERPV05fUkVHX05VTSAgICAgNQotCi1zdGF0aWMgdTMyIHBpbm11eF9yZWdbVFJJU1RBVEVfUkVHX05VTSArIFBJTl9NVVhfQ1RMX1JFR19OVU0gKwotCQkgICAgICBQVUxMVVBET1dOX1JFR19OVU0gKwotCQkgICAgICBBUlJBWV9TSVpFKHRlZ3JhX3NvY19kcml2ZV9waW5ncm91cHMpXTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBnX3JlYWRsKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotCXJldHVybiByZWFkbChJT19UT19WSVJUKFRFR1JBX0FQQl9NSVNDX0JBU0UgKyBvZmZzZXQpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBnX3dyaXRlbCh1bnNpZ25lZCBsb25nIHZhbHVlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQl3cml0ZWwodmFsdWUsIElPX1RPX1ZJUlQoVEVHUkFfQVBCX01JU0NfQkFTRSArIG9mZnNldCkpOwotfQotCi12b2lkIHRlZ3JhX3Bpbm11eF9zdXNwZW5kKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTMyICpjdHggPSBwaW5tdXhfcmVnOwotCi0JZm9yIChpID0gMDsgaSA8IFBJTl9NVVhfQ1RMX1JFR19OVU07IGkrKykKLQkJKmN0eCsrID0gcGdfcmVhZGwoUElOX01VWF9DVExfUkVHX0EgKyBpKjQpOwotCi0JZm9yIChpID0gMDsgaSA8IFBVTExVUERPV05fUkVHX05VTTsgaSsrKQotCQkqY3R4KysgPSBwZ19yZWFkbChQVUxMVVBET1dOX1JFR19BICsgaSo0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBUUklTVEFURV9SRUdfTlVNOyBpKyspCi0JCSpjdHgrKyA9IHBnX3JlYWRsKFRSSVNUQVRFX1JFR19BICsgaSo0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlZ3JhX3NvY19kcml2ZV9waW5ncm91cHMpOyBpKyspCi0JCSpjdHgrKyA9IHBnX3JlYWRsKHRlZ3JhX3NvY19kcml2ZV9waW5ncm91cHNbaV0ucmVnKTsKLX0KLQotdm9pZCB0ZWdyYV9waW5tdXhfcmVzdW1lKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTMyICpjdHggPSBwaW5tdXhfcmVnOwotCi0JZm9yIChpID0gMDsgaSA8IFBJTl9NVVhfQ1RMX1JFR19OVU07IGkrKykKLQkJcGdfd3JpdGVsKCpjdHgrKywgUElOX01VWF9DVExfUkVHX0EgKyBpKjQpOwotCi0JZm9yIChpID0gMDsgaSA8IFBVTExVUERPV05fUkVHX05VTTsgaSsrKQotCQlwZ193cml0ZWwoKmN0eCsrLCBQVUxMVVBET1dOX1JFR19BICsgaSo0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBUUklTVEFURV9SRUdfTlVNOyBpKyspCi0JCXBnX3dyaXRlbCgqY3R4KyssIFRSSVNUQVRFX1JFR19BICsgaSo0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlZ3JhX3NvY19kcml2ZV9waW5ncm91cHMpOyBpKyspCi0JCXBnX3dyaXRlbCgqY3R4KyssIHRlZ3JhX3NvY19kcml2ZV9waW5ncm91cHNbaV0ucmVnKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9waW5tdXguYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvcGlubXV4LmMKaW5kZXggZjgwZDUwNy4uMWQyMDE2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9waW5tdXguYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3Bpbm11eC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9waW5tdXguaD4KQEAgLTE2OSwxNSArMTcwLDE3IEBACiAJfQogfQogCitzdGF0aWMgaW50IG5iYW5rczsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKipyZWdzOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGdfcmVhZGwodW5zaWduZWQgbG9uZyBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHUzMiBwZ19yZWFkbCh1MzIgYmFuaywgdTMyIHJlZykKIHsKLQlyZXR1cm4gcmVhZGwoSU9fVE9fVklSVChURUdSQV9BUEJfTUlTQ19CQVNFICsgb2Zmc2V0KSk7CisJcmV0dXJuIHJlYWRsKHJlZ3NbYmFua10gKyByZWcpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGdfd3JpdGVsKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQorc3RhdGljIGlubGluZSB2b2lkIHBnX3dyaXRlbCh1MzIgdmFsLCB1MzIgYmFuaywgdTMyIHJlZykKIHsKLQl3cml0ZWwodmFsdWUsIElPX1RPX1ZJUlQoVEVHUkFfQVBCX01JU0NfQkFTRSArIG9mZnNldCkpOworCXdyaXRlbCh2YWwsIHJlZ3NbYmFua10gKyByZWcpOwogfQogCiBzdGF0aWMgaW50IHRlZ3JhX3Bpbm11eF9zZXRfZnVuYyhjb25zdCBzdHJ1Y3QgdGVncmFfcGluZ3JvdXBfY29uZmlnICpjb25maWcpCkBAIC0yMTcsMTAgKzIyMCwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9sb2NrLCBmbGFncyk7CiAKLQlyZWcgPSBwZ19yZWFkbChwaW5ncm91cHNbcGddLm11eF9yZWcpOworCXJlZyA9IHBnX3JlYWRsKHBpbmdyb3Vwc1twZ10ubXV4X2JhbmssIHBpbmdyb3Vwc1twZ10ubXV4X3JlZyk7CiAJcmVnICY9IH4oMHgzIDw8IHBpbmdyb3Vwc1twZ10ubXV4X2JpdCk7CiAJcmVnIHw9IG11eCA8PCBwaW5ncm91cHNbcGddLm11eF9iaXQ7Ci0JcGdfd3JpdGVsKHJlZywgcGluZ3JvdXBzW3BnXS5tdXhfcmVnKTsKKwlwZ193cml0ZWwocmVnLCBwaW5ncm91cHNbcGddLm11eF9iYW5rLCBwaW5ncm91cHNbcGddLm11eF9yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X2xvY2ssIGZsYWdzKTsKIApAQCAtMjQxLDExICsyNDQsMTEgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfbG9jaywgZmxhZ3MpOwogCi0JcmVnID0gcGdfcmVhZGwocGluZ3JvdXBzW3BnXS50cmlfcmVnKTsKKwlyZWcgPSBwZ19yZWFkbChwaW5ncm91cHNbcGddLnRyaV9iYW5rLCBwaW5ncm91cHNbcGddLnRyaV9yZWcpOwogCXJlZyAmPSB+KDB4MSA8PCBwaW5ncm91cHNbcGddLnRyaV9iaXQpOwogCWlmICh0cmlzdGF0ZSkKIAkJcmVnIHw9IDEgPDwgcGluZ3JvdXBzW3BnXS50cmlfYml0OwotCXBnX3dyaXRlbChyZWcsIHBpbmdyb3Vwc1twZ10udHJpX3JlZyk7CisJcGdfd3JpdGVsKHJlZywgcGluZ3JvdXBzW3BnXS50cmlfYmFuaywgcGluZ3JvdXBzW3BnXS50cmlfcmVnKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9sb2NrLCBmbGFncyk7CiAKQEAgLTI3MiwxMCArMjc1LDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXV4X2xvY2ssIGZsYWdzKTsKIAotCXJlZyA9IHBnX3JlYWRsKHBpbmdyb3Vwc1twZ10ucHVwZF9yZWcpOworCXJlZyA9IHBnX3JlYWRsKHBpbmdyb3Vwc1twZ10ucHVwZF9iYW5rLCBwaW5ncm91cHNbcGddLnB1cGRfcmVnKTsKIAlyZWcgJj0gfigweDMgPDwgcGluZ3JvdXBzW3BnXS5wdXBkX2JpdCk7CiAJcmVnIHw9IHB1cGQgPDwgcGluZ3JvdXBzW3BnXS5wdXBkX2JpdDsKLQlwZ193cml0ZWwocmVnLCBwaW5ncm91cHNbcGddLnB1cGRfcmVnKTsKKwlwZ193cml0ZWwocmVnLCBwaW5ncm91cHNbcGddLnB1cGRfYmFuaywgcGluZ3JvdXBzW3BnXS5wdXBkX3JlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXhfbG9jaywgZmxhZ3MpOwogCkBAIC0zNjIsMTIgKzM2NSwxMiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9sb2NrLCBmbGFncyk7CiAKLQlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCWlmIChoc20gPT0gVEVHUkFfSFNNX0VOQUJMRSkKIAkJcmVnIHw9ICgxIDw8IDIpOwogCWVsc2UKIAkJcmVnICY9IH4oMSA8PCAyKTsKLQlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcGdfd3JpdGVsKHJlZywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X2xvY2ssIGZsYWdzKTsKIApAQCAtMzg3LDEyICszOTAsMTIgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfbG9jaywgZmxhZ3MpOwogCi0JcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOworCXJlZyA9IHBnX3JlYWRsKGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnX2JhbmssIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKIAlpZiAoc2NobWl0dCA9PSBURUdSQV9TQ0hNSVRUX0VOQUJMRSkKIAkJcmVnIHw9ICgxIDw8IDMpOwogCWVsc2UKIAkJcmVnICY9IH4oMSA8PCAzKTsKLQlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcGdfd3JpdGVsKHJlZywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X2xvY2ssIGZsYWdzKTsKIApAQCAtNDEyLDEwICs0MTUsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfbG9jaywgZmxhZ3MpOwogCi0JcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOworCXJlZyA9IHBnX3JlYWRsKGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnX2JhbmssIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKIAlyZWcgJj0gfigweDMgPDwgNCk7CiAJcmVnIHw9IGRyaXZlIDw8IDQ7Ci0JcGdfd3JpdGVsKHJlZywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOworCXBnX3dyaXRlbChyZWcsIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnX2JhbmssIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9sb2NrLCBmbGFncyk7CiAKQEAgLTQzNSwxMCArNDM4LDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXV4X2xvY2ssIGZsYWdzKTsKIAotCXJlZyA9IHBnX3JlYWRsKGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKKwlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbcGddLnJlZ19iYW5rLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CiAJcmVnICY9IH4oMHgxZiA8PCAxMik7CiAJcmVnIHw9IHB1bGxfZG93biA8PCAxMjsKLQlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcGdfd3JpdGVsKHJlZywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X2xvY2ssIGZsYWdzKTsKIApAQCAtNDU4LDEwICs0NjEsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfbG9jaywgZmxhZ3MpOwogCi0JcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOworCXJlZyA9IHBnX3JlYWRsKGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnX2JhbmssIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKIAlyZWcgJj0gfigweDFmIDw8IDEyKTsKIAlyZWcgfD0gcHVsbF91cCA8PCAxMjsKLQlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcGdfd3JpdGVsKHJlZywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X2xvY2ssIGZsYWdzKTsKIApAQCAtNDgxLDEwICs0ODQsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfbG9jaywgZmxhZ3MpOwogCi0JcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOworCXJlZyA9IHBnX3JlYWRsKGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnX2JhbmssIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKIAlyZWcgJj0gfigweDMgPDwgMjgpOwogCXJlZyB8PSBzbGV3X3Jpc2luZyA8PCAyODsKLQlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcGdfd3JpdGVsKHJlZywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X2xvY2ssIGZsYWdzKTsKIApAQCAtNTA0LDEwICs1MDcsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfbG9jaywgZmxhZ3MpOwogCi0JcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOworCXJlZyA9IHBnX3JlYWRsKGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnX2JhbmssIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKIAlyZWcgJj0gfigweDMgPDwgMzApOwogCXJlZyB8PSBzbGV3X2ZhbGxpbmcgPDwgMzA7Ci0JcGdfd3JpdGVsKHJlZywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOworCXBnX3dyaXRlbChyZWcsIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnX2JhbmssIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9sb2NrLCBmbGFncyk7CiAKQEAgLTY2NSw2ICs2NjgsOTkgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRlZ3JhX3Bpbm11eF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpOworCWludCBjb25maWdfYmFkID0gMDsKKworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgaSk7CisJCWlmICghcmVzKQorCQkJYnJlYWs7CisJfQorCW5iYW5rcyA9IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVEVHUkFfTUFYX1BJTkdST1VQOyBpKyspIHsKKwkJaWYgKHBpbmdyb3Vwc1tpXS50cmlfYmFuayA+PSBuYmFua3MpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgInBpbmdyb3VwICVkOiBiYWQgdHJpX2JhbmtcbiIsIGkpOworCQkJY29uZmlnX2JhZCA9IDE7CisJCX0KKworCQlpZiAocGluZ3JvdXBzW2ldLm11eF9iYW5rID49IG5iYW5rcykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGluZ3JvdXAgJWQ6IGJhZCBtdXhfYmFua1xuIiwgaSk7CisJCQljb25maWdfYmFkID0gMTsKKwkJfQorCisJCWlmIChwaW5ncm91cHNbaV0ucHVwZF9iYW5rID49IG5iYW5rcykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGluZ3JvdXAgJWQ6IGJhZCBwdXBkX2JhbmtcbiIsIGkpOworCQkJY29uZmlnX2JhZCA9IDE7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVEVHUkFfTUFYX0RSSVZFX1BJTkdST1VQOyBpKyspIHsKKwkJaWYgKGRyaXZlX3Bpbmdyb3Vwc1tpXS5yZWdfYmFuayA+PSBuYmFua3MpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiZHJpdmUgcGluZ3JvdXAgJWQ6IGJhZCByZWdfYmFua1xuIiwgaSk7CisJCQljb25maWdfYmFkID0gMTsKKwkJfQorCX0KKworCWlmIChjb25maWdfYmFkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJlZ3MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgbmJhbmtzICogc2l6ZW9mKCpyZWdzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGFsbG9jIHJlZ3MgcG9pbnRlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuYmFua3M7IGkrKykgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIGkpOworCQlpZiAoIXJlcykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBNRU0gcmVzb3VyY2VcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJCSAgICByZXNvdXJjZV9zaXplKHJlcyksCisJCQkJCSAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiQ291bGRuJ3QgcmVxdWVzdCBNRU0gcmVzb3VyY2UgJWRcbiIsIGkpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlyZWdzW2ldID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJCXJlc291cmNlX3NpemUocmVzKSk7CisJCWlmICghcmVncykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgaW9yZW1hcCByZWdzICVkXG4iLCBpKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRlZ3JhX3Bpbm11eF9vZl9tYXRjaFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1waW5tdXgiLCB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX3Bpbm11eF9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInRlZ3JhLXBpbm11eCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB0ZWdyYV9waW5tdXhfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUJCT0gdGVncmFfcGlubXV4X3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGVncmFfcGlubXV4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0ZWdyYV9waW5tdXhfZHJpdmVyKTsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKHRlZ3JhX3Bpbm11eF9pbml0KTsKKwogI2lmZGVmCUNPTkZJR19ERUJVR19GUwogCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgpAQCAtNjg0LDYgKzc4MCw3IEBACiAJaW50IGxlbjsKIAogCWZvciAoaSA9IDA7IGkgPCBURUdSQV9NQVhfUElOR1JPVVA7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHJlZzsKIAkJdW5zaWduZWQgbG9uZyB0cmk7CiAJCXVuc2lnbmVkIGxvbmcgbXV4OwogCQl1bnNpZ25lZCBsb25nIHB1cGQ7CkBAIC02OTYsOCArNzkzLDkgQEAKIAkJCXNlcV9wcmludGYocywgIlRFR1JBX01VWF9OT05FIik7CiAJCQlsZW4gPSBzdHJsZW4oIk5PTkUiKTsKIAkJfSBlbHNlIHsKLQkJCW11eCA9IChwZ19yZWFkbChwaW5ncm91cHNbaV0ubXV4X3JlZykgPj4KLQkJCSAgICAgICBwaW5ncm91cHNbaV0ubXV4X2JpdCkgJiAweDM7CisJCQlyZWcgPSBwZ19yZWFkbChwaW5ncm91cHNbaV0ubXV4X2JhbmssCisJCQkJCXBpbmdyb3Vwc1tpXS5tdXhfcmVnKTsKKwkJCW11eCA9IChyZWcgPj4gcGluZ3JvdXBzW2ldLm11eF9iaXQpICYgMHgzOwogCQkJaWYgKHBpbmdyb3Vwc1tpXS5mdW5jc1ttdXhdID09IFRFR1JBX01VWF9SU1ZEKSB7CiAJCQkJc2VxX3ByaW50ZihzLCAiVEVHUkFfTVVYX1JTVkQlMWx1IiwgbXV4KzEpOwogCQkJCWxlbiA9IDU7CkBAIC03MTMsOCArODExLDkgQEAKIAkJCXNlcV9wcmludGYocywgIlRFR1JBX1BVUERfTk9STUFMIik7CiAJCQlsZW4gPSBzdHJsZW4oIk5PUk1BTCIpOwogCQl9IGVsc2UgewotCQkJcHVwZCA9IChwZ19yZWFkbChwaW5ncm91cHNbaV0ucHVwZF9yZWcpID4+Ci0JCQkJcGluZ3JvdXBzW2ldLnB1cGRfYml0KSAmIDB4MzsKKwkJCXJlZyA9IHBnX3JlYWRsKHBpbmdyb3Vwc1tpXS5wdXBkX2JhbmssCisJCQkJCXBpbmdyb3Vwc1tpXS5wdXBkX3JlZyk7CisJCQlwdXBkID0gKHJlZyA+PiBwaW5ncm91cHNbaV0ucHVwZF9iaXQpICYgMHgzOwogCQkJc2VxX3ByaW50ZihzLCAiVEVHUkFfUFVQRF8lcyIsIHB1cGRfbmFtZShwdXBkKSk7CiAJCQlsZW4gPSBzdHJsZW4ocHVwZF9uYW1lKHB1cGQpKTsKIAkJfQpAQCAtNzIzLDggKzgyMiw5IEBACiAJCWlmIChwaW5ncm91cHNbaV0udHJpX3JlZyA8IDApIHsKIAkJCXNlcV9wcmludGYocywgIlRFR1JBX1RSSV9OT1JNQUwiKTsKIAkJfSBlbHNlIHsKLQkJCXRyaSA9IChwZ19yZWFkbChwaW5ncm91cHNbaV0udHJpX3JlZykgPj4KLQkJCSAgICAgICBwaW5ncm91cHNbaV0udHJpX2JpdCkgJiAweDE7CisJCQlyZWcgPSBwZ19yZWFkbChwaW5ncm91cHNbaV0udHJpX2JhbmssCisJCQkJCXBpbmdyb3Vwc1tpXS50cmlfcmVnKTsKKwkJCXRyaSA9IChyZWcgPj4gcGluZ3JvdXBzW2ldLnRyaV9iaXQpICYgMHgxOwogCiAJCQlzZXFfcHJpbnRmKHMsICJURUdSQV9UUklfJXMiLCB0cmlfbmFtZSh0cmkpKTsKIAkJfQpAQCAtNzU5LDcgKzg1OSw4IEBACiAJCWRiZ19wYWRfZmllbGQocywgNyAtIGxlbik7CiAKIAotCQlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbaV0ucmVnKTsKKwkJcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW2ldLnJlZ19iYW5rLAorCQkJCWRyaXZlX3Bpbmdyb3Vwc1tpXS5yZWcpOwogCQlpZiAoSFNNX0VOKHJlZykpIHsKIAkJCXNlcV9wcmludGYocywgIlRFR1JBX0hTTV9FTkFCTEUiKTsKIAkJCWxlbiA9IDE2OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9wb3dlcmdhdGUuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvcG93ZXJnYXRlLmMKaW5kZXggM2NlZTlhYS4uOTQ4MzA2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9wb3dlcmdhdGUuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3Bvd2VyZ2F0ZS5jCkBAIC04OSwxMiArODksMTEgQEAKIAlyZXR1cm4gdGVncmFfcG93ZXJnYXRlX3NldChpZCwgZmFsc2UpOwogfQogCi1ib29sIHRlZ3JhX3Bvd2VyZ2F0ZV9pc19wb3dlcmVkKGludCBpZCkKK3N0YXRpYyBib29sIHRlZ3JhX3Bvd2VyZ2F0ZV9pc19wb3dlcmVkKGludCBpZCkKIHsKIAl1MzIgc3RhdHVzOwogCi0JaWYgKGlkIDwgMCB8fCBpZCA+PSBURUdSQV9OVU1fUE9XRVJHQVRFKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlXQVJOX09OKGlkIDwgMCB8fCBpZCA+PSBURUdSQV9OVU1fUE9XRVJHQVRFKTsKIAogCXN0YXR1cyA9IHBtY19yZWFkKFBXUkdBVEVfU1RBVFVTKSAmICgxIDw8IGlkKTsKIAlyZXR1cm4gISFzdGF0dXM7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3RlZ3JhMl9jbG9ja3MuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvdGVncmEyX2Nsb2Nrcy5jCmluZGV4IDBmZTliM2UuLjM3MTg2OWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvdGVncmEyX2Nsb2Nrcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvdGVncmEyX2Nsb2Nrcy5jCkBAIC0xNjYsMTMgKzE2NiwxMyBAQAogc3RhdGljIGludCB0ZWdyYV9wZXJpcGhfY2xrX2VuYWJsZV9yZWZjb3VudFszICogMzJdOwogCiAjZGVmaW5lIGNsa193cml0ZWwodmFsdWUsIHJlZykgXAotCV9fcmF3X3dyaXRlbCh2YWx1ZSwgKHUzMilyZWdfY2xrX2Jhc2UgKyAocmVnKSkKKwlfX3Jhd193cml0ZWwodmFsdWUsIHJlZ19jbGtfYmFzZSArIChyZWcpKQogI2RlZmluZSBjbGtfcmVhZGwocmVnKSBcCi0JX19yYXdfcmVhZGwoKHUzMilyZWdfY2xrX2Jhc2UgKyAocmVnKSkKKwlfX3Jhd19yZWFkbChyZWdfY2xrX2Jhc2UgKyAocmVnKSkKICNkZWZpbmUgcG1jX3dyaXRlbCh2YWx1ZSwgcmVnKSBcCi0JX19yYXdfd3JpdGVsKHZhbHVlLCAodTMyKXJlZ19wbWNfYmFzZSArIChyZWcpKQorCV9fcmF3X3dyaXRlbCh2YWx1ZSwgcmVnX3BtY19iYXNlICsgKHJlZykpCiAjZGVmaW5lIHBtY19yZWFkbChyZWcpIFwKLQlfX3Jhd19yZWFkbCgodTMyKXJlZ19wbWNfYmFzZSArIChyZWcpKQorCV9fcmF3X3JlYWRsKHJlZ19wbWNfYmFzZSArIChyZWcpKQogCiB1bnNpZ25lZCBsb25nIGNsa19tZWFzdXJlX2lucHV0X2ZyZXEodm9pZCkKIHsKQEAgLTkxOCw3ICs5MTgsNyBAQAogc3RhdGljIHZvaWQgdGVncmEyX3BlcmlwaF9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjKQogewogCXUzMiB2YWwgPSBjbGtfcmVhZGwoYy0+cmVnKTsKLQljb25zdCBzdHJ1Y3QgY2xrX211eF9zZWwgKm11eCA9IDA7CisJY29uc3Qgc3RydWN0IGNsa19tdXhfc2VsICptdXggPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBjbGtfbXV4X3NlbCAqc2VsOwogCWlmIChjLT5mbGFncyAmIE1VWCkgewogCQlmb3IgKHNlbCA9IGMtPmlucHV0czsgc2VsLT5pbnB1dCAhPSBOVUxMOyBzZWwrKykgewpAQCAtMTQ1OSw3ICsxNDU5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgdGVncmFfY2xrX21fc2VsW10gPSB7CiAJeyAuaW5wdXQgPSAmdGVncmFfY2xrXzMyaywgLnZhbHVlID0gMH0sCiAJeyAuaW5wdXQgPSAmdGVncmFfcGxsX3MsICAudmFsdWUgPSAxfSwKLQl7IDAsIDB9LAorCXsgTlVMTCAsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgdGVncmFfY2xrX20gPSB7CkBAIC0xODYxLDcgKzE4NjEsNyBAQAogCXsgLm5hbWUgPSAiZXh0X2F1ZGlvX2NsazEiLCAudmFsdWUgPSA2IH0sCiAJeyAubmFtZSA9ICJleHRfdmltY2xrIiwgLnZhbHVlID0gNyB9LAogI2VuZGlmCi0JeyAwLCAwIH0KKwl7IE5VTEwsIDAgfQogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgdGVncmFfY2xrX2F1ZGlvID0gewpAQCAtMTg4NSw3ICsxODg1LDcgQEAKIAl9LAogfTsKIAotc3RydWN0IGNsa19sb29rdXAgdGVncmFfYXVkaW9fY2xrX2xvb2t1cHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCB0ZWdyYV9hdWRpb19jbGtfbG9va3Vwc1tdID0gewogCXsgLmNvbl9pZCA9ICJhdWRpbyIsIC5jbGsgPSAmdGVncmFfY2xrX2F1ZGlvIH0sCiAJeyAuY29uX2lkID0gImF1ZGlvXzJ4IiwgLmNsayA9ICZ0ZWdyYV9jbGtfYXVkaW9fMnggfQogfTsKQEAgLTE5MjYsNyArMTkyNiw3IEBACiAJeyAuaW5wdXQgPSAmdGVncmFfcGxsX3Bfb3V0MywJLnZhbHVlID0gNn0sCiAJeyAuaW5wdXQgPSAmdGVncmFfY2xrX2QsCS52YWx1ZSA9IDd9LAogCXsgLmlucHV0ID0gJnRlZ3JhX3BsbF94LAkudmFsdWUgPSA4fSwKLQl7IDAsIDB9LAorCXsgTlVMTCwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19tdXhfc2VsIG11eF9zY2xrW10gPSB7CkBAIC0xOTM4LDcgKzE5MzgsNyBAQAogCXsgLmlucHV0ID0gJnRlZ3JhX2Nsa19kLAkudmFsdWUgPSA1fSwKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9jbGtfMzJrLAkudmFsdWUgPSA2fSwKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9wbGxfbV9vdXQxLAkudmFsdWUgPSA3fSwKLQl7IDAsIDB9LAorCXsgTlVMTCwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB0ZWdyYV9jbGtfY2NsayA9IHsKQEAgLTIwMDksNyArMjAwOSw3IEBACiAJeyAuaW5wdXQgPSAmdGVncmFfcGxsX2MsIC52YWx1ZSA9IDF9LAogCXsgLmlucHV0ID0gJnRlZ3JhX3BsbF9wLCAudmFsdWUgPSAyfSwKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9wbGxfYV9vdXQwLCAudmFsdWUgPSAzfSwKLQl7IDAsIDB9LAorCXsgTlVMTCwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19tdXhfc2VsIG11eF9wbGxtX3BsbGNfcGxscF9jbGttW10gPSB7CkBAIC0yMDE3LDcgKzIwMTcsNyBAQAogCXsgLmlucHV0ID0gJnRlZ3JhX3BsbF9jLCAudmFsdWUgPSAxfSwKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9wbGxfcCwgLnZhbHVlID0gMn0sCiAJeyAuaW5wdXQgPSAmdGVncmFfY2xrX20sIC52YWx1ZSA9IDN9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X3BsbHBfcGxsY19wbGxtX2Nsa21bXSA9IHsKQEAgLTIwMjUsNyArMjAyNSw3IEBACiAJeyAuaW5wdXQgPSAmdGVncmFfcGxsX2MsIC52YWx1ZSA9IDF9LAogCXsgLmlucHV0ID0gJnRlZ3JhX3BsbF9tLCAudmFsdWUgPSAyfSwKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9jbGtfbSwgLnZhbHVlID0gM30sCi0JeyAwLCAwfSwKKwl7IE5VTEwsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbXV4X3NlbCBtdXhfcGxsYW91dDBfYXVkaW8yeF9wbGxwX2Nsa21bXSA9IHsKQEAgLTIwMzMsNyArMjAzMyw3IEBACiAJey5pbnB1dCA9ICZ0ZWdyYV9jbGtfYXVkaW9fMngsIC52YWx1ZSA9IDF9LAogCXsuaW5wdXQgPSAmdGVncmFfcGxsX3AsIC52YWx1ZSA9IDJ9LAogCXsuaW5wdXQgPSAmdGVncmFfY2xrX20sIC52YWx1ZSA9IDN9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X3BsbHBfcGxsZF9wbGxjX2Nsa21bXSA9IHsKQEAgLTIwNDEsNyArMjA0MSw3IEBACiAJey5pbnB1dCA9ICZ0ZWdyYV9wbGxfZF9vdXQwLCAudmFsdWUgPSAxfSwKIAl7LmlucHV0ID0gJnRlZ3JhX3BsbF9jLCAudmFsdWUgPSAyfSwKIAl7LmlucHV0ID0gJnRlZ3JhX2Nsa19tLCAudmFsdWUgPSAzfSwKLQl7IDAsIDB9LAorCXsgTlVMTCwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19tdXhfc2VsIG11eF9wbGxwX3BsbGNfYXVkaW9fY2xrbV9jbGszMltdID0gewpAQCAtMjA1MCwzOSArMjA1MCwzOSBAQAogCXsuaW5wdXQgPSAmdGVncmFfY2xrX2F1ZGlvLCAgICAgLnZhbHVlID0gMn0sCiAJey5pbnB1dCA9ICZ0ZWdyYV9jbGtfbSwgICAgIC52YWx1ZSA9IDN9LAogCXsuaW5wdXQgPSAmdGVncmFfY2xrXzMyaywgICAudmFsdWUgPSA0fSwKLQl7IDAsIDB9LAorCXsgTlVMTCwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19tdXhfc2VsIG11eF9wbGxwX3BsbGNfcGxsbVtdID0gewogCXsuaW5wdXQgPSAmdGVncmFfcGxsX3AsICAgICAudmFsdWUgPSAwfSwKIAl7LmlucHV0ID0gJnRlZ3JhX3BsbF9jLCAgICAgLnZhbHVlID0gMX0sCiAJey5pbnB1dCA9ICZ0ZWdyYV9wbGxfbSwgICAgIC52YWx1ZSA9IDJ9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X2Nsa19tW10gPSB7CiAJeyAuaW5wdXQgPSAmdGVncmFfY2xrX20sIC52YWx1ZSA9IDB9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X3BsbHBfb3V0M1tdID0gewogCXsgLmlucHV0ID0gJnRlZ3JhX3BsbF9wX291dDMsIC52YWx1ZSA9IDB9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X3BsbGRbXSA9IHsKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9wbGxfZCwgLnZhbHVlID0gMH0sCi0JeyAwLCAwfSwKKwl7IE5VTEwsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbXV4X3NlbCBtdXhfY2xrXzMya1tdID0gewogCXsgLmlucHV0ID0gJnRlZ3JhX2Nsa18zMmssIC52YWx1ZSA9IDB9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X3BjbGtbXSA9IHsKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9jbGtfcGNsaywgLnZhbHVlID0gMH0sCi0JeyAwLCAwfSwKKwl7IE5VTEwsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgdGVncmFfY2xrX2VtYyA9IHsKQEAgLTIxMjUsNyArMjEyNSw3IEBACiAJCS5wYXJlbnQgPSBfcGFyZW50LAkJCVwKIAl9CiAKLXN0cnVjdCBjbGsgdGVncmFfbGlzdF9jbGtzW10gPSB7CitzdGF0aWMgc3RydWN0IGNsayB0ZWdyYV9saXN0X2Nsa3NbXSA9IHsKIAlQRVJJUEhfQ0xLKCJhcGJkbWEiLAkidGVncmEtZG1hIiwJCU5VTEwsCTM0LAkwLAkxMDgwMDAwMDAsIG11eF9wY2xrLAkJCTApLAogCVBFUklQSF9DTEsoInJ0YyIsCSJydGMtdGVncmEiLAkJTlVMTCwJNCwJMCwJMzI3NjgsICAgICBtdXhfY2xrXzMyaywJCQlQRVJJUEhfTk9fUkVTRVQpLAogCVBFUklQSF9DTEsoInRpbWVyIiwJInRpbWVyIiwJCU5VTEwsCTUsCTAsCTI2MDAwMDAwLCAgbXV4X2Nsa19tLAkJCTApLApAQCAtMjIyMSw3ICsyMjIxLDcgQEAKICAqIGNvbmZpZ3VyYXRpb24uICBMaXN0IHRob3NlIGhlcmUgdG8gcmVnaXN0ZXIgdGhlbSB0d2ljZSBpbiB0aGUgY2xvY2sgbG9va3VwCiAgKiB0YWJsZSB1bmRlciB0d28gbmFtZXMuCiAgKi8KLXN0cnVjdCBjbGtfZHVwbGljYXRlIHRlZ3JhX2Nsa19kdXBsaWNhdGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGNsa19kdXBsaWNhdGUgdGVncmFfY2xrX2R1cGxpY2F0ZXNbXSA9IHsKIAlDTEtfRFVQTElDQVRFKCJ1YXJ0YSIsCSJ0ZWdyYV91YXJ0LjAiLAlOVUxMKSwKIAlDTEtfRFVQTElDQVRFKCJ1YXJ0YiIsCSJ0ZWdyYV91YXJ0LjEiLAlOVUxMKSwKIAlDTEtfRFVQTElDQVRFKCJ1YXJ0YyIsCSJ0ZWdyYV91YXJ0LjIiLAlOVUxMKSwKQEAgLTIyNTIsNyArMjI1Miw3IEBACiAJCS5jbGsgPSBjaywJXAogCX0KIAotc3RydWN0IGNsayAqdGVncmFfcHRyX2Nsa3NbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY2xrICp0ZWdyYV9wdHJfY2xrc1tdID0gewogCSZ0ZWdyYV9jbGtfMzJrLAogCSZ0ZWdyYV9wbGxfcywKIAkmdGVncmFfY2xrX20sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3RpbWVyLmMKaW5kZXggOTAzNTA0Mi4uZTIyNzJkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS90aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvdGltZXIuYwpAQCAtNjIsOSArNjIsOSBAQAogc3RhdGljIHU2NCBwZXJzaXN0ZW50X21zLCBsYXN0X3BlcnNpc3RlbnRfbXM7CiAKICNkZWZpbmUgdGltZXJfd3JpdGVsKHZhbHVlLCByZWcpIFwKLQlfX3Jhd193cml0ZWwodmFsdWUsICh1MzIpdGltZXJfcmVnX2Jhc2UgKyAocmVnKSkKKwlfX3Jhd193cml0ZWwodmFsdWUsIHRpbWVyX3JlZ19iYXNlICsgKHJlZykpCiAjZGVmaW5lIHRpbWVyX3JlYWRsKHJlZykgXAotCV9fcmF3X3JlYWRsKCh1MzIpdGltZXJfcmVnX2Jhc2UgKyAocmVnKSkKKwlfX3Jhd19yZWFkbCh0aW1lcl9yZWdfYmFzZSArIChyZWcpKQogCiBzdGF0aWMgaW50IHRlZ3JhX3RpbWVyX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAogCQkJCQkgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQpAQCAtMTMzLDcgKzEzMyw3IEBACiAgKiB0ZWdyYV9ydGMgZHJpdmVyIGNvdWxkIGJlIGV4ZWN1dGluZyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMKICAqIG9uIHRoZSBSVEMgc2hhZG93IHJlZ2lzdGVyCiAgKi8KLXU2NCB0ZWdyYV9ydGNfcmVhZF9tcyh2b2lkKQorc3RhdGljIHU2NCB0ZWdyYV9ydGNfcmVhZF9tcyh2b2lkKQogewogCXUzMiBtcyA9IHJlYWRsKHJ0Y19iYXNlICsgUlRDX01JTExJU0VDT05EUyk7CiAJdTMyIHMgPSByZWFkbChydGNfYmFzZSArIFJUQ19TSEFET1dfU0VDT05EUyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3VzYl9waHkuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvdXNiX3BoeS5jCmluZGV4IDg4MDgxYmIuLjM3NTc2YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvdXNiX3BoeS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvdXNiX3BoeS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi91bHBpLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tdGVncmEuaD4KICNpbmNsdWRlIDxtYWNoL3VzYl9waHkuaD4KICNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC11MzAwL0tjb25maWcKaW5kZXggNDQ5ZmQ2YS4uMWNiY2Q0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL0tjb25maWcKQEAgLTgsNiArOCw3IEBACiAJYm9vbCAiVTMwMCIKIAlzZWxlY3QgUElOQ1RSTAogCXNlbGVjdCBQSU5NVVhfVTMwMAorCXNlbGVjdCBHUElPX1UzMDAKIAogY29tbWVudCAiU1QtRXJpY3Nzb24gVTMwMC9VMzMwL1UzMzUvVTM2NSBGZWF0dXJlIFNlbGVjdGlvbnMiCiAKQEAgLTUwLDM5ICs1MSwxMiBAQAogCiBlbmRjaG9pY2UKIAotY2hvaWNlCi0JcHJvbXB0ICJNZW1vcnkgY29uZmlndXJhdGlvbiIKLQlkZWZhdWx0IE1BQ0hfVTMwMF9TSU5HTEVfUkFNCi0JLS0taGVscC0tLQotCVlvdSBoYXZlIHRvIGNvbmZpZyB0aGUga2VybmVsIGFjY29yZGluZyB0byB0aGUgcGh5c2ljYWwgbWVtb3J5Ci0JY29uZmlndXJhdGlvbi4KLQotY29uZmlnIE1BQ0hfVTMwMF9TSU5HTEVfUkFNCi0JYm9vbCAiU2luZ2xlIFJBTSIKLQloZWxwCi0JCVNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIFNpbmdsZSBSQU0gcGhvbmVzLgotCi1jb25maWcgTUFDSF9VMzAwX0RVQUxfUkFNCi0JYm9vbCAiRHVhbCBSQU0iCi0JaGVscAotCQlTZWxlY3QgdGhpcyBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBEdWFsIFJBTSBwaG9uZXMuCi0JCVRoaXMgaXMgdHdvIFJBTSBtZW1vcmllcyBvbiBkaWZmZXJlbnQgRU1JRnMuCi1lbmRjaG9pY2UKLQogY29uZmlnIFUzMDBfREVCVUcKIAlib29sICJEZWJ1ZyBzdXBwb3J0IGZvciBVMzAwIgogCWRlcGVuZHMgb24gUE0KIAloZWxwCiAJCURlYnVnIHN1cHBvcnQgZm9yIFUzMDAgaW4gc3lzZnMsIHByb2NmcyBldGMuCiAKLWNvbmZpZyBNQUNIX1UzMDBfU0VNSV9JU19TSEFSRUQKLQlib29sICJUaGUgU0VNSSBpcyB1c2VkIGJ5IGJvdGggdGhlIGFjY2VzcyBhbmQgYXBwbGljYXRpb24gc2lkZSIKLQlkZXBlbmRzIG9uIE1BQ0hfVTMwMAotCWhlbHAKLQkJVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIFNFTUkgKFNoYXJlZCBFeHRlcm5hbAotCQlNZW1vcnkgSW50ZXJmYWNlKSBmcm9tIGJvdGggZnJvbSBhY2Nlc3MgYW5kIGFwcGxpY2F0aW9uCi0JCXNpZGUuCi0KIGNvbmZpZyBNQUNIX1UzMDBfU1BJRFVNTVkKIAlib29sICJTU1AvU1BJIGR1bW15IGNoaXAiCiAJc2VsZWN0IFNQSQpAQCAtOTUsMjUgKzY5LDYgQEAKIAkJeW91IGRvbid0IG5lZWQgaXQuIFNlbGVjdGluZyB0aGlzIHdpbGwgYWN0aXZhdGUgdGhlCiAJCVNQSSBmcmFtZXdvcmsgYW5kIEFSTSBQTDAyMiBzdXBwb3J0LgogCi1jb21tZW50ICJBbGwgdGhlIHNldHRpbmdzIGJlbG93IG11c3QgbWF0Y2ggdGhlIGJvb3Rsb2FkZXIncyBzZXR0aW5ncyIKLQotY29uZmlnIE1BQ0hfVTMwMF9BQ0NFU1NfTUVNX1NJWkUKLSAgICAgICBpbnQgIkFjY2VzcyBDUFUgbWVtb3J5IGFsbG9jYXRpb24iCi0gICAgICAgcmFuZ2UgNyAyNQotICAgICAgIGRlcGVuZHMgb24gTUFDSF9VMzAwX1NJTkdMRV9SQU0KLSAgICAgICBkZWZhdWx0IDEzCi0gICAgICAgaGVscAotCQlIb3cgbXVjaCBtZW1vcnkgaW4gTWlCIHRoYXQgdGhlIEFjY2VzcyBzaWRlIENQVSBoYXMgYWxsb2NhdGVkCi0KLWNvbmZpZyBNQUNIX1UzMDBfMk1CX0FMSUdOTUVOVF9GSVgKLSAgICAgICBib29sICIyTWlCIGFsaWdubWVudCBmaXgiCi0gICAgICAgZGVwZW5kcyBvbiBNQUNIX1UzMDBfU0lOR0xFX1JBTQotICAgICAgIGRlZmF1bHQgeQotICAgICAgIGhlbHAKLQkJSWYgeWVzIGFuZCB0aGUgQWNjZXNzIHNpZGUgQ1BVIGhhcyBhbGxvY2F0ZWQgYW4gb2RkIHNpemUgaW4KLQkJTWlCLCB0aGlzIGZpeCBnaXZlcyB5b3Ugb25lIE1pQiBleHRyYSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZQotCQlsb3N0IGR1ZSB0byBMaW51eCAyIE1pQiBhbGlnbm1lbnQgcG9saWN5LgotCiBlbmRtZW51CiAKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtdTMwMC9NYWtlZmlsZS5ib290CmluZGV4IDY5MzU3YWYuLjg3ODExZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9NYWtlZmlsZS5ib290CisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9NYWtlZmlsZS5ib290CkBAIC0xLDE1ICsxLDQgQEAKLSMgTm90ZTogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIG11c3QgYWx3YXlzIGJlIHRydWU6Ci0jICAgWlJFTEFERFIgPT0gdmlydF90b19waHlzKFRFWFRBRERSKQotIyAgIFBBUkFNU19QSFlTIG11c3QgYmUgd2l0aGluIDRNQiBvZiBaUkVMQUREUgotIyAgIElOSVRSRF9QSFlTIG11c3QgYmUgaW4gUkFNCi0KLWlmZGVmIENPTkZJR19NQUNIX1UzMDBfU0lOR0xFX1JBTQotICAgICB6cmVsYWRkci15CSs9IDB4MjhFMDgwMDAKLSAgcGFyYW1zX3BoeXMteQk6PSAweDI4RTAwMTAwCi1lbHNlCi0gICAgIHpyZWxhZGRyLXkJKz0gMHg0ODAwODAwMAotICBwYXJhbXNfcGh5cy15CTo9IDB4NDgwMDAxMDAKLWVuZGlmCi0KKyAgIHpyZWxhZGRyLXkJKz0gMHg0ODAwODAwMAorcGFyYW1zX3BoeXMteQk6PSAweDQ4MDAwMTAwCiAjIFRoaXMgaXNuJ3QgdXNlZC4KLSNpbml0cmRfcGh5cy15CTo9IDB4Mjk4MDAwMDAKKyNpbml0cmRfcGh5cy15CTo9IDB4NDg4MDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvY29yZS5jCmluZGV4IDJmNTkyOWIuLmFjMDc5MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2NvcmUuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9mc21jLmg+CiAjaW5jbHVkZSA8bGludXgvcGluY3RybC9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC0zOSw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc3lzY29uLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWFfY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tdTMwMC5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKICNpbmNsdWRlICJtbWMuaCIKQEAgLTcwLDMwICs3MiwxMyBAQAogCQkubGVuZ3RoCQk9IFNaXzMySywKIAkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sCi0JewotCQkudmlydHVhbAk9IDB4ZmZmZjIwMDAsIC8qIFRDTSBtZW1vcnkgKi8KLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKDB4ZmZmZjIwMDApLAotCQkubGVuZ3RoCQk9IFNaXzE2SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi0KLQkvKgotCSAqIFRoaXMgb3ZlcmxhcHMgd2l0aCB0aGUgSVJRIHZlY3RvcnMgZXRjIGF0IDB4ZmZmZjAwMDAsIHNvIHRoZXNlCi0JICogbWF5IGhhdmUgdG8gYmUgbW92ZWQgdG8gMHgwMDAwMDAwMCBpbiBvcmRlciB0byB1c2UgdGhlIFJPTS4KLQkgKi8KLQkvKgotCXsKLQkJLnZpcnR1YWwJPSBVMzAwX0JPT1RST01fVklSVF9CQVNFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oVTMwMF9CT09UUk9NX1BIWVNfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNjRLLAotCQkudHlwZQkJPSBNVF9ST00sCi0JfSwKLQkqLwogfTsKIAogdm9pZCBfX2luaXQgdTMwMF9tYXBfaW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQodTMwMF9pb19kZXNjLCBBUlJBWV9TSVpFKHUzMDBfaW9fZGVzYykpOworCS8qIFdlIGVuYWJsZSBhIHJlYWwgYmlnIERNQSBidWZmZXIgaWYgbmVlZCBiZS4gKi8KKwlpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoU1pfNE0pOwogfQogCiAvKgpAQCAtMjQxLDcgKzIyNiw3IEBACiAJCS5lbmQgICA9IElSUV9VMzAwX0dQSU9fUE9SVDIsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCi0jaWZkZWYgVTMwMF9DT0g5MDE1NzFfMworI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzM2NSkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzM1KQogCXsKIAkJLm5hbWUgID0gImdwaW8zIiwKIAkJLnN0YXJ0ID0gSVJRX1UzMDBfR1BJT19QT1JUMywKQEAgLTI1NCw2ICsyMzksNyBAQAogCQkuZW5kICAgPSBJUlFfVTMwMF9HUElPX1BPUlQ0LAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAorI2VuZGlmCiAjaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9CUzMzNQogCXsKIAkJLm5hbWUgID0gImdwaW81IiwKQEAgLTI2OCw3ICsyNTQsNiBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogI2VuZGlmIC8qIENPTkZJR19NQUNIX1UzMDBfQlMzMzUgKi8KLSNlbmRpZiAvKiBVMzAwX0NPSDkwMTU3MV8zICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGtleXBhZF9yZXNvdXJjZXNbXSA9IHsKQEAgLTM2Myw1MSArMzQ4LDYgQEAKIAl9CiB9OwogCi0vKiBUT0RPOiBUaGVzZSBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IHN1aXRhYmxlICNpZmRlZidzICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF2ZV9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5uYW1lICA9ICJBVkUzZSBJL08gQXJlYSIsCi0JCS5zdGFydCA9IFUzMDBfVklERU9FTkNfQkFTRSwKLQkJLmVuZCAgID0gVTMwMF9WSURFT0VOQ19CQVNFICsgU1pfNTEySyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JewotCQkubmFtZSAgPSAiQVZFM2UgSVJRMCIsCi0JCS5zdGFydCA9IElSUV9VMzAwX1ZJREVPX0VOQ18wLAotCQkuZW5kICAgPSBJUlFfVTMwMF9WSURFT19FTkNfMCwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQl7Ci0JCS5uYW1lICA9ICJBVkUzZSBJUlExIiwKLQkJLnN0YXJ0ID0gSVJRX1UzMDBfVklERU9fRU5DXzEsCi0JCS5lbmQgICA9IElSUV9VMzAwX1ZJREVPX0VOQ18xLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCXsKLQkJLm5hbWUgID0gIkFWRTNlIFBoeXNtZW0gQXJlYSIsCi0JCS5zdGFydCA9IDAsIC8qIDAgd2lsbCBiZSByZW1hcHBlZCB0byByZXNlcnZlZCBtZW1vcnkgKi8KLQkJLmVuZCAgID0gU1pfMU0gLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCS8qCi0JICogVGhlIEFWRTNlIHJlcXVpcmVzIHR3byByZWdpb25zIG9mIDI1Nk1CIHRoYXQgaXQgY29uc2lkZXJzCi0JICogImludmlzaWJsZSIuIFRoZSBoYXJkd2FyZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGFjY2VzcyB0aGVzZQotCSAqIGFkZHJlc3Nlcywgc28gdGhleSBzaG91bGQgbmV2ZXIgcG9pbnQgdG8gc3lzdGVtIFJBTS4KLQkgKi8KLQl7Ci0JCS5uYW1lICA9ICJBVkUzZSBSZXNlcnZlZCAwIiwKLQkJLnN0YXJ0ID0gMHhkMDAwMDAwMCwKLQkJLmVuZCAgID0gMHhkMDAwMDAwMCArIFNaXzI1Nk0gLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCXsKLQkJLm5hbWUgID0gIkFWRTNlIFJlc2VydmVkIDEiLAotCQkuc3RhcnQgPSAweGUwMDAwMDAwLAotCQkuZW5kICAgPSAweGUwMDAwMDAwICsgU1pfMjU2TSAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRtYV9yZXNvdXJjZVtdID0gewogCXsKIAkJLnN0YXJ0ID0gVTMwMF9ETUFDX0JBU0UsCkBAIC0xNTY2LDExICsxNTA2LDM1IEBACiAJLnJlc291cmNlID0gaTJjMV9yZXNvdXJjZXMsCiB9OwogCisvKgorICogVGhlIGRpZmZlcmVudCB2YXJpYW50cyBoYXZlIGEgZmV3IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKKyAqIEdQSU8gYmxvY2ssIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBwb3J0cy4KKyAqLworc3RhdGljIHN0cnVjdCB1MzAwX2dwaW9fcGxhdGZvcm0gdTMwMF9ncGlvX3BsYXQgPSB7CisjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMlgpIHx8IGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzMzMCkKKwkudmFyaWFudCA9IFUzMDBfR1BJT19DT0g5MDEzMzUsCisJLnBvcnRzID0gMywKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMzMzUKKwkudmFyaWFudCA9IFUzMDBfR1BJT19DT0g5MDE1NzFfM19CUzMzNSwKKwkucG9ydHMgPSA3LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9CUzM2NQorCS52YXJpYW50ID0gVTMwMF9HUElPX0NPSDkwMTU3MV8zX0JTMzY1LAorCS5wb3J0cyA9IDUsCisjZW5kaWYKKwkuZ3Bpb19iYXNlID0gMCwKKwkuZ3Bpb19pcnFfYmFzZSA9IElSUV9VMzAwX0dQSU9fQkFTRSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGdwaW9fZGV2aWNlID0gewogCS5uYW1lID0gInUzMDAtZ3BpbyIsCiAJLmlkID0gLTEsCiAJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGdwaW9fcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UgPSBncGlvX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZ1MzAwX2dwaW9fcGxhdCwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Uga2V5cGFkX2RldmljZSA9IHsKQEAgLTE2MjIsMTMgKzE1ODYsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdmVfZGV2aWNlID0gewotCS5uYW1lID0gInZpZGVvX2VuYyIsCi0JLmlkID0gLTEsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGF2ZV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGF2ZV9yZXNvdXJjZXMsCi19OwotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkbWFfZGV2aWNlID0gewogCS5uYW1lCQk9ICJjb2g5MDEzMTgiLAogCS5pZAkJPSAtMSwKQEAgLTE3MTksNyArMTY3Niw2IEBACiAJJmdwaW9fZGV2aWNlLAogCSZuYW5kX2RldmljZSwKIAkmd2RvZ19kZXZpY2UsCi0JJmF2ZV9kZXZpY2UsCiAJJnBpbm11eF9kZXZpY2UsCiB9OwogCkBAIC0xNzQyLDcgKzE2OTgsNyBAQAogCUJVR19PTihJU19FUlIoY2xrKSk7CiAJY2xrX2VuYWJsZShjbGspOwogCi0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgVTMwMF9WSUNfSVJRU19FTkQ7IGkrKykKIAkJc2V0X2JpdChpLCAodW5zaWduZWQgbG9uZyAqKSAmbWFza1swXSk7CiAJdmljX2luaXQoKHZvaWQgX19pb21lbSAqKSBVMzAwX0lOVENPTjBfVkJBU0UsIDAsIG1hc2tbMF0sIG1hc2tbMF0pOwogCXZpY19pbml0KCh2b2lkIF9faW9tZW0gKikgVTMwMF9JTlRDT04xX1ZCQVNFLCAzMiwgbWFza1sxXSwgbWFza1sxXSk7CkBAIC0xOTE3LDE3ICsxODczLDEwIEBACiAJLyogUmVnaXN0ZXIgc3ViZGV2aWNlcyBvbiB0aGUgU1BJIGJ1cyAqLwogCXUzMDBfc3BpX3JlZ2lzdGVyX2JvYXJkX2RldmljZXMoKTsKIAotI2lmbmRlZiBDT05GSUdfTUFDSF9VMzAwX1NFTUlfSVNfU0hBUkVECi0JLyoKLQkgKiBFbmFibGUgU0VNSSBzZWxmIHJlZnJlc2guIFNlbGYtcmVmcmVzaCBvZiB0aGUgU0RSQU0gaXMgZW50ZXJlZCB3aGVuCi0JICogYm90aCBzdWJzeXN0ZW1zIGFyZSByZXF1ZXN0aW5nIHRoaXMgbW9kZS4KLQkgKiBJZiB3ZSBub3Qgc2hhcmUgdGhlIEFjYyBTRFJBTSwgdGhpcyBpcyBuZXZlciB0aGUgY2FzZS4gVGhlcmVmb3JlCi0JICogZW5hYmxlIGl0IGhlcmUgZnJvbSB0aGUgQXBwIHNpZGUuCi0JICovCisJLyogRW5hYmxlIFNFTUkgc2VsZiByZWZyZXNoICovCiAJdmFsID0gcmVhZHcoVTMwMF9TWVNDT05fVkJBU0UgKyBVMzAwX1NZU0NPTl9TTUNSKSB8CiAJCVUzMDBfU1lTQ09OX1NNQ1JfU0VNSV9TUkVGUkVRX0VOQUJMRTsKIAl3cml0ZXcodmFsLCBVMzAwX1NZU0NPTl9WQkFTRSArIFUzMDBfU1lTQ09OX1NNQ1IpOwotI2VuZGlmIC8qIENPTkZJR19NQUNIX1UzMDBfU0VNSV9JU19TSEFSRUQgKi8KIH0KIAogc3RhdGljIGludCBjb3JlX21vZHVsZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaTJjLmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvaTJjLmMKaW5kZXggZjAzOTRiYS4uNTE0MGRlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL2kyYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pMmMuYwpAQCAtMjU2LDU3ICsyNTYsOCBAQAogfTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0FCMzU1MF9DT1JFCi1zdGF0aWMgc3RydWN0IGFieDUwMF9pbml0X3NldHRpbmdzIGFiMzU1MF9pbml0X3NldHRpbmdzW10gPSB7Ci0JewotCQkuYmFuayA9IDAsCi0JCS5yZWcgPSBBQjM1NTBfSU1SMSwKLQkJLnNldHRpbmcgPSAweGZmCi0JfSwKLQl7Ci0JCS5iYW5rID0gMCwKLQkJLnJlZyA9IEFCMzU1MF9JTVIyLAotCQkuc2V0dGluZyA9IDB4ZmYKLQl9LAotCXsKLQkJLmJhbmsgPSAwLAotCQkucmVnID0gQUIzNTUwX0lNUjMsCi0JCS5zZXR0aW5nID0gMHhmZgotCX0sCi0JewotCQkuYmFuayA9IDAsCi0JCS5yZWcgPSBBQjM1NTBfSU1SNCwKLQkJLnNldHRpbmcgPSAweGZmCi0JfSwKLQl7Ci0JCS5iYW5rID0gMCwKLQkJLnJlZyA9IEFCMzU1MF9JTVI1LAotCQkvKiBUaGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgbm90IHVzZWQgKi8KLQkJLnNldHRpbmcgPSAweDNmCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWIzNTUwX3BsYXRmb3JtX2RhdGEgYWIzNTUwX3BsZl9kYXRhID0gewotCS5pcnEgPSB7Ci0JCS5iYXNlID0gSVJRX0FCMzU1MF9CQVNFLAotCQkuY291bnQgPSAoSVJRX0FCMzU1MF9FTkQgLSBJUlFfQUIzNTUwX0JBU0UgKyAxKSwKLQl9LAotCS5kZXZfZGF0YSA9IHsKLQl9LAotCS5pbml0X3NldHRpbmdzID0gYWIzNTUwX2luaXRfc2V0dGluZ3MsCi0JLmluaXRfc2V0dGluZ3Nfc3ogPSBBUlJBWV9TSVpFKGFiMzU1MF9pbml0X3NldHRpbmdzKSwKLX07Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGJ1czBfaTJjX2JvYXJkX2luZm9bXSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19BQjM1NTBfQ09SRSkKLQl7Ci0JCS50eXBlID0gImFiMzU1MCIsCi0JCS5hZGRyID0gMHg0QSwKLQkJLmlycSA9IElSUV9VMzAwX0lSUTBfRVhULAotCQkucGxhdGZvcm1fZGF0YSA9ICZhYjM1NTBfcGxmX2RhdGEsCi0JfSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FCMzEwMF9DT1JFKQorI2lmZGVmIENPTkZJR19BQjMxMDBfQ09SRQogCXsKIAkJLnR5cGUgPSAiYWIzMTAwIiwKIAkJLmFkZHIgPSAweDQ4LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGRmNzE1NzAuLjhhZThlNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTEwLDcgKzEwLDcgQEAKICAqLwogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCS8qIElmIHdlIG1vdmUgdGhlIGFkZHJlc3MgdXNpbmcgTU1VLCB1c2UgdGhpcy4gKi8KIAlsZHIJXHJwLAkgID0gVTMwMF9TTE9XX1BFUl9QSFlTX0JBU0UgQCBNTVUgb2ZmLCBwaHlzaWNhbCBhZGRyZXNzCiAJbGRyCVxydiwJICA9IFUzMDBfU0xPV19QRVJfVklSVF9CQVNFIEAgTU1VIG9uLCB2aXJ0dWFsIGFkZHJlc3MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvZ3Bpby11MzAwLmggYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8tdTMwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMmIyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8tdTMwMC5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgU1QtRXJpY3Nzb24gQUIKKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICogR1BJTyBibG9jayByZXNnaXN0ZXIgZGVmaW5pdGlvbnMgYW5kIGlubGluZSBtYWNyb3MgZm9yCisgKiBVMzAwIEdQSU8gQ09IIDkwMSAzMzUgb3IgQ09IIDkwMSA1NzEvMworICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgorICovCisKKyNpZm5kZWYgX19NQUNIX1UzMDBfR1BJT19VMzAwX0gKKyNkZWZpbmUgX19NQUNIX1UzMDBfR1BJT19VMzAwX0gKKworLyoKKyAqIEluZGl2aWR1YWwgcGluIGFzc2lnbm1lbnRzIGZvciB0aGUgQjI2L1MyNi4gTm90aWNlIHRoYXQgdGhlCisgKiBhY3R1YWwgdXNhZ2Ugb2YgdGhlc2UgcGlucyBkZXBlbmRzIG9uIHRoZSBQQUQgTVVYIHNldHRpbmdzLCB0aGF0CisgKiBpcyB3aHkgdGhlIHNhbWUgbnVtYmVyIGNhbiBwb3RlbnRpYWxseSBhcHBlYXIgc2V2ZXJhbCB0aW1lcy4KKyAqIEluIHRoZSByZWZlcmVuY2UgZGVzaWduIGVhY2ggcGluIGlzIG9ubHkgdXNlZCBmb3Igb25lIHB1cnBvc2UuCisgKiBUaGVzZSB3ZXJlIGRldGVybWluZWQgYnkgaW5zcGVjdGluZyB0aGUgQjI2L1MyNiBzY2hlbWF0aWM6CisgKiAyLzE5MTEtUk9BIDEyOCAxNjAzCisgKi8KKyNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX0JTMlgKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9VQVJUX1JYCQkwCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fVUFSVF9UWAkJMQorI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wMgkJMiAgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDMJCTMgIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fQ0FNX1NMRUVQCQk0CisjZGVmaW5lIFUzMDBfR1BJT19QSU5fQ0FNX1JFR19FTgk1CisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA2CQk2ICAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wNwkJNyAgLyogVW5yb3V0ZWQgKi8KKworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wOAkJOCAgLyogU2VydmljZSBwb2ludCBTUDIzMjEgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDkJCTkgIC8qIFNlcnZpY2UgcG9pbnQgU1AyMzIyICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fUEhGU0VOU0UJCTEwIC8qIEhlYWRwaG9uZSBqYWNrIHNlbnNpbmcgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9NTUNfQ0xLUkVUCTExIC8qIENsb2NrIHJldHVybiBmcm9tIE1NQy9TRCBjYXJkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fTU1DX0NECQkxMiAvKiBNTUMgQ2FyZCBpbnNlcnRpb24gZGV0ZWN0aW9uICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fRkxJUFNFTlNFCQkxMyAvKiBNZWNoYW5pY2FsIGZsaXAgc2Vuc2luZyAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xNAkJMTQgLyogRFNQIEpUQUcgUG9ydCBSVENLICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE1CQkxNSAvKiBVbnJvdXRlZCAqLworCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE2CQkxNiAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xNwkJMTcgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTgJCTE4IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE5CQkxOSAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMAkJMjAgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjEJCTIxIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIyCQkyMiAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMwkJMjMgLyogVW5yb3V0ZWQgKi8KKyNlbmRpZgorCisvKgorICogSW5kaXZpZHVhbCBwaW4gYXNzaWdubWVudHMgZm9yIHRoZSBCMzMwL1MzMzAgYW5kIEIzNjUvUzM2NS4KKyAqIE5vdGljZSB0aGF0IHRoZSBhY3R1YWwgdXNhZ2Ugb2YgdGhlc2UgcGlucyBkZXBlbmRzIG9uIHRoZQorICogUEFEIE1VWCBzZXR0aW5ncywgdGhhdCBpcyB3aHkgdGhlIHNhbWUgbnVtYmVyIGNhbiBwb3RlbnRpYWxseQorICogYXBwZWFyIHNldmVyYWwgdGltZXMuIEluIHRoZSByZWZlcmVuY2UgZGVzaWduIGVhY2ggcGluIGlzIG9ubHkKKyAqIHVzZWQgZm9yIG9uZSBwdXJwb3NlLiBUaGVzZSB3ZXJlIGRldGVybWluZWQgYnkgaW5zcGVjdGluZyB0aGUKKyAqIFMzNjUgc2NoZW1hdGljLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzMwKSB8fCBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMzNjUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMzMzUpCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fVUFSVF9SWAkJMAorI2RlZmluZSBVMzAwX0dQSU9fUElOX1VBUlRfVFgJCTEKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9VQVJUX0NUUwkJMgorI2RlZmluZSBVMzAwX0dQSU9fUElOX1VBUlRfUlRTCQkzCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fQ0FNX01BSU5fU1RBTkRCWQk0IC8qIENhbWVyYSBNQUlOIHN0YW5kYnkgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDUJCTUgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9NU19DRAkJNiAvKiBNZW1vcnkgU3RpY2sgQ2FyZCBpbnNlcnRpb24gKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDcJCTcgLyogVGVzdCBwb2ludCBUUDI0MzAgKi8KKworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wOAkJOCAvKiBUZXN0IHBvaW50IFRQMjQzNyAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wOQkJOSAvKiBUZXN0IHBvaW50IFRQMjQzMSAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xMAkJMTAgLyogVGVzdCBwb2ludCBUUDI0MzIgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9NTUNfQ0xLUkVUCTExIC8qIENsb2NrIHJldHVybiBmcm9tIE1NQy9TRCBjYXJkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fTU1DX0NECQkxMiAvKiBNTUMgQ2FyZCBpbnNlcnRpb24gZGV0ZWN0aW9uICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fQ0FNX1NVQl9TVEFOREJZCTEzIC8qIENhbWVyYSBTVUIgc3RhbmRieSAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xNAkJMTQgLyogVGVzdCBwb2ludCBUUDI0MzYgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTUJCTE1IC8qIFVucm91dGVkICovCisKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTYJCTE2IC8qIFRlc3QgcG9pbnQgVFAyNDM4ICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fUEhGU0VOU0UJCTE3IC8qIEhlYWRwaG9uZSBqYWNrIHNlbnNpbmcgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTgJCTE4IC8qIFRlc3QgcG9pbnQgVFAyNDM5ICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE5CQkxOSAvKiBSb3V0ZWQgc29tZXdoZXJlICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIwCQkyMCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMQkJMjEgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjIJCTIyIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIzCQkyMyAvKiBVbnJvdXRlZCAqLworCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzI0CQkyNCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yNQkJMjUgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjYJCTI2IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzI3CQkyNyAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yOAkJMjggLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjkJCTI5IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzMwCQkzMCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zMQkJMzEgLyogVW5yb3V0ZWQgKi8KKworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zMgkJMzIgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzMJCTMzIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzM0CQkzNCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zNQkJMzUgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzYJCTM2IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzM3CQkzNyAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zOAkJMzggLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzkJCTM5IC8qIFVucm91dGVkICovCisKKyNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX0JTMzM1CisKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDAJCTQwIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQxCQk0MSAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80MgkJNDIgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDMJCTQzIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQ0CQk0NCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80NQkJNDUgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDYJCTQ2IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQ3CQk0NyAvKiBVbnJvdXRlZCAqLworCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQ4CQk0OCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80OQkJNDkgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNTAJCTUwIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzUxCQk1MSAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU81MgkJNTIgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNTMJCTUzIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzU0CQk1NCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU81NQkJNTUgLyogVW5yb3V0ZWQgKi8KKyNlbmRpZgorCisjZW5kaWYKKworLyoqCisgKiBlbnVtIHUzMDBfZ3Bpb192YXJpYW50IC0gdGhlIHR5cGUgb2YgVTMwMCBHUElPIGVtcGxveWVkCisgKi8KK2VudW0gdTMwMF9ncGlvX3ZhcmlhbnQgeworCVUzMDBfR1BJT19DT0g5MDEzMzUsCisJVTMwMF9HUElPX0NPSDkwMTU3MV8zX0JTMzM1LAorCVUzMDBfR1BJT19DT0g5MDE1NzFfM19CUzM2NSwKK307CisKKy8qKgorICogc3RydWN0IHUzMDBfZ3Bpb19wbGF0Zm9ybSAtIFUzMDAgR1BJTyBwbGF0Zm9ybSBkYXRhCisgKiBAdmFyaWFudDogSVAgYmxvY2sgdmFyaWFudAorICogQHBvcnRzOiBudW1iZXIgb2YgR1BJTyBibG9jayBwb3J0cworICogQGdwaW9fYmFzZTogZmlyc3QgR1BJTyBudW1iZXIgZm9yIHRoaXMgYmxvY2sgKHVzZSBhIGZyZWUgcmFuZ2UpCisgKiBAZ3Bpb19pcnFfYmFzZTogZmlyc3QgR1BJTyBJUlEgbnVtYmVyIGZvciB0aGlzIGJsb2NrICh1c2UgYSBmcmVlIHJhbmdlKQorICovCitzdHJ1Y3QgdTMwMF9ncGlvX3BsYXRmb3JtIHsKKwllbnVtIHUzMDBfZ3Bpb192YXJpYW50IHZhcmlhbnQ7CisJdTggcG9ydHM7CisJaW50IGdwaW9fYmFzZTsKKwlpbnQgZ3Bpb19pcnFfYmFzZTsKK307CisKKyNlbmRpZiAvKiBfX01BQ0hfVTMwMF9HUElPX1UzMDBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBkNWE3MWFiLi40MGE4YzE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSwyOTQgKzEgQEAKLS8qCi0gKgotICogYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKLSAqCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU1QtRXJpY3Nzb24gQUIKLSAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgotICogR1BJTyBibG9jayByZXNnaXN0ZXIgZGVmaW5pdGlvbnMgYW5kIGlubGluZSBtYWNyb3MgZm9yCi0gKiBVMzAwIEdQSU8gQ09IIDkwMSAzMzUgb3IgQ09IIDkwMSA1NzEvMwotICogQXV0aG9yOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgotICovCi0KLSNpZm5kZWYgX19NQUNIX1UzMDBfR1BJT19ICi0jZGVmaW5lIF9fTUFDSF9VMzAwX0dQSU9fSAotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0vKiBTd2l0Y2ggdHlwZSBkZXBlbmRpbmcgb24gcGxhdGZvcm0vY2hpcCB2YXJpYW50ICovCi0jaWYgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMlgpIHx8IGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzMzMCkKLSNkZWZpbmUgVTMwMF9DT0g5MDEzMzUKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzM2NSkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzM1KQotI2RlZmluZSBVMzAwX0NPSDkwMTU3MV8zCi0jZW5kaWYKLQotLyogR2V0IGJhc2UgYWRkcmVzcyBmb3IgcmVncyBoZXJlICovCi0jaW5jbHVkZSAidTMwMC1yZWdzLmgiCi0vKiBJUlEgbnVtYmVycyAqLwotI2luY2x1ZGUgImlycXMuaCIKLQotLyoKLSAqIFRoaXMgaXMgdGhlIEdQSU8gYmxvY2sgZGVmaW5pdGlvbnMuIEdQSU8gKEdlbmVyYWwgUHVycG9zZSBJL08pIGNhbiBiZQotICogdXNlZCBmb3IgYW55dGhpbmcsIGFuZCBvZnRlbiBpcy4gVGhlIGV2ZW50L2VuYWJsZSBldGMgZmlndXJlcyBhcmUgZm9yCi0gKiB0aGUgbG93ZXJtb3N0IHBpbiAocGluIDAgb24gZWFjaCBwb3J0KSwgc2hpZnQgdGhpcyBsZWZ0IHRvIG1hdGNoIHlvdXIKLSAqIHBpbiBpZiB5b3UncmUgZ29ubmEgdXNlIHRoZXNlIHZhbHVlcy4KLSAqLwotI2lmZGVmIFUzMDBfQ09IOTAxMzM1Ci0jZGVmaW5lIFUzMDBfR1BJT19QT1JUWF9TUEFDSU5HCQkJCSgweDFDKQotLyogUG9ydCBYIFBpbiBEYXRhIFJlZ2lzdGVyIDMyYml0LCB0aGlzIGlzIGJvdGggaW5wdXQgYW5kIG91dHB1dCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUFhQRElSCQkJCSgweDAwKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQRE9SCQkJCSgweDAwKQotLyogUG9ydCBYIFBpbiBDb25maWcgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYUENSCQkJCQkoMHgwNCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUENSX0FMTF9QSU5TX01PREVfTUFTSwkJKDB4MDAwMEZGRkZVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX01BU0sJCQkoMHgwMDAwMDAwM1VMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfU0hJRlQJCQkoMHgwMDAwMDAwMlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfSU5QVVQJCQkoMHgwMDAwMDAwMFVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfT1VUUFVUX1BVU0hfUFVMTAkoMHgwMDAwMDAwMVVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfT1VUUFVUX09QRU5fRFJBSU4JKDB4MDAwMDAwMDJVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9PUEVOX1NPVVJDRQkoMHgwMDAwMDAwM1VMKQotLyogUG9ydCBYIEludGVycnVwdCBFdmVudCBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUFhJRVYJCQkJCSgweDA4KQotI2RlZmluZSBVMzAwX0dQSU9fUFhJRVZfQUxMX0lSUV9FVkVOVF9NQVNLCQkoMHgwMDAwMDBGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJRVZfSVJRX0VWRU5UCQkJKDB4MDAwMDAwMDFVTCkKLS8qIFBvcnQgWCBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWElFTgkJCQkJKDB4MEMpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElFTl9BTExfSVJRX0VOQUJMRV9NQVNLCQkoMHgwMDAwMDBGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJRU5fSVJRX0VOQUJMRQkJCSgweDAwMDAwMDAxVUwpCi0vKiBQb3J0IFggSW50ZXJydXB0IEZvcmNlIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWElGUgkJCQkJKDB4MTApCi0jZGVmaW5lIFUzMDBfR1BJT19QWElGUl9BTExfSVJRX0ZPUkNFX01BU0sJCSgweDAwMDAwMEZGVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElGUl9JUlFfRk9SQ0UJCQkoMHgwMDAwMDAwMVVMKQotLyogUG9ydCBYIEludGVycnVwdCBDb25maWcgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYSUNSCQkJCQkoMHgxNCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUNSX0FMTF9JUlFfQ09ORklHX01BU0sJCSgweDAwMDAwMEZGVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElDUl9JUlFfQ09ORklHX01BU0sJCQkoMHgwMDAwMDAwMVVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJQ1JfSVJRX0NPTkZJR19GQUxMSU5HX0VER0UJCSgweDAwMDAwMDAwVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElDUl9JUlFfQ09ORklHX1JJU0lOR19FREdFCQkoMHgwMDAwMDAwMVVMKQotLyogUG9ydCBYIFB1bGwtdXAgRW5hYmxlIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBFUgkJCQkJKDB4MTgpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBFUl9BTExfUFVMTF9VUF9ESVNBQkxFX01BU0sJKDB4MDAwMDAwRkZVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUEVSX1BVTExfVVBfRElTQUJMRQkJCSgweDAwMDAwMDAxVUwpCi0vKiBDb250cm9sIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19DUgkJCQkJKDB4NTQpCi0jZGVmaW5lIFUzMDBfR1BJT19DUl9CTE9DS19DTE9DS19FTkFCTEUJCQkoMHgwMDAwMDAwMVVMKQotLyogdGhyZWUgcG9ydHMgb2YgOCBiaXRzIGVhY2ggPSBHUElPIHBpbnMgMC4uMjMgKi8KLSNkZWZpbmUgVTMwMF9HUElPX05VTV9QT1JUUyAzCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5TX1BFUl9QT1JUIDgKLSNkZWZpbmUgVTMwMF9HUElPX01BWAkoVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQgKiBVMzAwX0dQSU9fTlVNX1BPUlRTIC0gMSkKLSNlbmRpZgotCi0jaWZkZWYgVTMwMF9DT0g5MDE1NzFfMwotLyoKLSAqIENvbnRyb2wgUmVnaXN0ZXIgMzJiaXQgKFIvVykKLSAqIGJpdCAxNS05IChtYXNrIDB4MDAwMEZFMDApIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgY29yZXMuIDgqY29yZXMKLSAqIGdpdmVzIHRoZSBudW1iZXIgb2YgR1BJTyBwaW5zLgotICogYml0IDgtMiAgKG1hc2sgMHgwMDAwMDFGQykgY29udGFpbnMgdGhlIGNvcmUgdmVyc2lvbiBJRC4KLSAqLwotI2RlZmluZSBVMzAwX0dQSU9fQ1IJCQkJCSgweDAwKQotI2RlZmluZSBVMzAwX0dQSU9fQ1JfU1lOQ19TRUxfRU5BQkxFCQkJKDB4MDAwMDAwMDJVTCkKLSNkZWZpbmUgVTMwMF9HUElPX0NSX0JMT0NLX0NMS1JRX0VOQUJMRQkJCSgweDAwMDAwMDAxVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QT1JUWF9TUEFDSU5HCQkJCSgweDMwKQotLyogUG9ydCBYIFBpbiBEYXRhIElOUFVUIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBESVIJCQkJKDB4MDQpCi0vKiBQb3J0IFggUGluIERhdGEgT1VUUFVUIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBET1IJCQkJKDB4MDgpCi0vKiBQb3J0IFggUGluIENvbmZpZyBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1IJCQkJCSgweDBDKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfQUxMX1BJTlNfTU9ERV9NQVNLCQkoMHgwMDAwRkZGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSwkJCSgweDAwMDAwMDAzVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9TSElGVAkJCSgweDAwMDAwMDAyVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9JTlBVVAkJCSgweDAwMDAwMDAwVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfUFVTSF9QVUxMCSgweDAwMDAwMDAxVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfT1BFTl9EUkFJTgkoMHgwMDAwMDAwMlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfT1VUUFVUX09QRU5fU09VUkNFCSgweDAwMDAwMDAzVUwpCi0vKiBQb3J0IFggUHVsbC11cCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYUEVSCQkJCQkoMHgxMCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUEVSX0FMTF9QVUxMX1VQX0RJU0FCTEVfTUFTSwkoMHgwMDAwMDBGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQRVJfUFVMTF9VUF9ESVNBQkxFCQkJKDB4MDAwMDAwMDFVTCkKLS8qIFBvcnQgWCBJbnRlcnJ1cHQgRXZlbnQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYSUVWCQkJCQkoMHgxNCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUVWX0FMTF9JUlFfRVZFTlRfTUFTSwkJKDB4MDAwMDAwRkZVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUVWX0lSUV9FVkVOVAkJCSgweDAwMDAwMDAxVUwpCi0vKiBQb3J0IFggSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUFhJRU4JCQkJCSgweDE4KQotI2RlZmluZSBVMzAwX0dQSU9fUFhJRU5fQUxMX0lSUV9FTkFCTEVfTUFTSwkJKDB4MDAwMDAwRkZVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUVOX0lSUV9FTkFCTEUJCQkoMHgwMDAwMDAwMVVMKQotLyogUG9ydCBYIEludGVycnVwdCBGb3JjZSBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUFhJRlIJCQkJCSgweDFDKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJRlJfQUxMX0lSUV9GT1JDRV9NQVNLCQkoMHgwMDAwMDBGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJRlJfSVJRX0ZPUkNFCQkJKDB4MDAwMDAwMDFVTCkKLS8qIFBvcnQgWCBJbnRlcnJ1cHQgQ29uZmlnIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWElDUgkJCQkJKDB4MjApCi0jZGVmaW5lIFUzMDBfR1BJT19QWElDUl9BTExfSVJRX0NPTkZJR19NQVNLCQkoMHgwMDAwMDBGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJQ1JfSVJRX0NPTkZJR19NQVNLCQkJKDB4MDAwMDAwMDFVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUNSX0lSUV9DT05GSUdfRkFMTElOR19FREdFCQkoMHgwMDAwMDAwMFVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJQ1JfSVJRX0NPTkZJR19SSVNJTkdfRURHRQkJKDB4MDAwMDAwMDFVTCkKLSNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX0JTMzM1Ci0vKiBzZXZlbiBwb3J0cyBvZiA4IGJpdHMgZWFjaCA9IEdQSU8gcGlucyAwLi41NSAqLwotI2RlZmluZSBVMzAwX0dQSU9fTlVNX1BPUlRTIDcKLSNlbHNlCi0vKiBmaXZlIHBvcnRzIG9mIDggYml0cyBlYWNoID0gR1BJTyBwaW5zIDAuLjM5ICovCi0jZGVmaW5lIFUzMDBfR1BJT19OVU1fUE9SVFMgNQotI2VuZGlmCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5TX1BFUl9QT1JUIDgKLSNkZWZpbmUgVTMwMF9HUElPX01BWCAoVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQgKiBVMzAwX0dQSU9fTlVNX1BPUlRTIC0gMSkKLSNlbmRpZgotCi0vKgotICogSW5kaXZpZHVhbCBwaW4gYXNzaWdubWVudHMgZm9yIHRoZSBCMjYvUzI2LiBOb3RpY2UgdGhhdCB0aGUKLSAqIGFjdHVhbCB1c2FnZSBvZiB0aGVzZSBwaW5zIGRlcGVuZHMgb24gdGhlIFBBRCBNVVggc2V0dGluZ3MsIHRoYXQKLSAqIGlzIHdoeSB0aGUgc2FtZSBudW1iZXIgY2FuIHBvdGVudGlhbGx5IGFwcGVhciBzZXZlcmFsIHRpbWVzLgotICogSW4gdGhlIHJlZmVyZW5jZSBkZXNpZ24gZWFjaCBwaW4gaXMgb25seSB1c2VkIGZvciBvbmUgcHVycG9zZS4KLSAqIFRoZXNlIHdlcmUgZGV0ZXJtaW5lZCBieSBpbnNwZWN0aW5nIHRoZSBCMjYvUzI2IHNjaGVtYXRpYzoKLSAqIDIvMTkxMS1ST0EgMTI4IDE2MDMKLSAqLwotI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMyWAotI2RlZmluZSBVMzAwX0dQSU9fUElOX1VBUlRfUlgJCTAKLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9VQVJUX1RYCQkxCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzAyCQkyICAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wMwkJMyAgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9DQU1fU0xFRVAJCTQKLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9DQU1fUkVHX0VOCTUKLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDYJCTYgIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA3CQk3ICAvKiBVbnJvdXRlZCAqLwotCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA4CQk4ICAvKiBTZXJ2aWNlIHBvaW50IFNQMjMyMSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wOQkJOSAgLyogU2VydmljZSBwb2ludCBTUDIzMjIgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9QSEZTRU5TRQkJMTAgLyogSGVhZHBob25lIGphY2sgc2Vuc2luZyAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX01NQ19DTEtSRVQJMTEgLyogQ2xvY2sgcmV0dXJuIGZyb20gTU1DL1NEIGNhcmQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9NTUNfQ0QJCTEyIC8qIE1NQyBDYXJkIGluc2VydGlvbiBkZXRlY3Rpb24gKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9GTElQU0VOU0UJCTEzIC8qIE1lY2hhbmljYWwgZmxpcCBzZW5zaW5nICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE0CQkxNCAvKiBEU1AgSlRBRyBQb3J0IFJUQ0sgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTUJCTE1IC8qIFVucm91dGVkICovCi0KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTYJCTE2IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE3CQkxNyAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xOAkJMTggLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTkJCTE5IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIwCQkyMCAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMQkJMjEgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjIJCTIyIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIzCQkyMyAvKiBVbnJvdXRlZCAqLwotI2VuZGlmCi0KLS8qCi0gKiBJbmRpdmlkdWFsIHBpbiBhc3NpZ25tZW50cyBmb3IgdGhlIEIzMzAvUzMzMCBhbmQgQjM2NS9TMzY1LgotICogTm90aWNlIHRoYXQgdGhlIGFjdHVhbCB1c2FnZSBvZiB0aGVzZSBwaW5zIGRlcGVuZHMgb24gdGhlCi0gKiBQQUQgTVVYIHNldHRpbmdzLCB0aGF0IGlzIHdoeSB0aGUgc2FtZSBudW1iZXIgY2FuIHBvdGVudGlhbGx5Ci0gKiBhcHBlYXIgc2V2ZXJhbCB0aW1lcy4gSW4gdGhlIHJlZmVyZW5jZSBkZXNpZ24gZWFjaCBwaW4gaXMgb25seQotICogdXNlZCBmb3Igb25lIHB1cnBvc2UuIFRoZXNlIHdlcmUgZGV0ZXJtaW5lZCBieSBpbnNwZWN0aW5nIHRoZQotICogUzM2NSBzY2hlbWF0aWMuCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMzMzApIHx8IGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzM2NSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzMzNSkKLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9VQVJUX1JYCQkwCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fVUFSVF9UWAkJMQotI2RlZmluZSBVMzAwX0dQSU9fUElOX1VBUlRfQ1RTCQkyCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fVUFSVF9SVFMJCTMKLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9DQU1fTUFJTl9TVEFOREJZCTQgLyogQ2FtZXJhIE1BSU4gc3RhbmRieSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wNQkJNSAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX01TX0NECQk2IC8qIE1lbW9yeSBTdGljayBDYXJkIGluc2VydGlvbiAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wNwkJNyAvKiBUZXN0IHBvaW50IFRQMjQzMCAqLwotCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA4CQk4IC8qIFRlc3QgcG9pbnQgVFAyNDM3ICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA5CQk5IC8qIFRlc3QgcG9pbnQgVFAyNDMxICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzEwCQkxMCAvKiBUZXN0IHBvaW50IFRQMjQzMiAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX01NQ19DTEtSRVQJMTEgLyogQ2xvY2sgcmV0dXJuIGZyb20gTU1DL1NEIGNhcmQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9NTUNfQ0QJCTEyIC8qIE1NQyBDYXJkIGluc2VydGlvbiBkZXRlY3Rpb24gKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9DQU1fU1VCX1NUQU5EQlkJMTMgLyogQ2FtZXJhIFNVQiBzdGFuZGJ5ICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE0CQkxNCAvKiBUZXN0IHBvaW50IFRQMjQzNiAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xNQkJMTUgLyogVW5yb3V0ZWQgKi8KLQotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xNgkJMTYgLyogVGVzdCBwb2ludCBUUDI0MzggKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9QSEZTRU5TRQkJMTcgLyogSGVhZHBob25lIGphY2sgc2Vuc2luZyAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xOAkJMTggLyogVGVzdCBwb2ludCBUUDI0MzkgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTkJCTE5IC8qIFJvdXRlZCBzb21ld2hlcmUgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjAJCTIwIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIxCQkyMSAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMgkJMjIgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjMJCTIzIC8qIFVucm91dGVkICovCi0KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjQJCTI0IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzI1CQkyNSAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yNgkJMjYgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjcJCTI3IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzI4CQkyOCAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yOQkJMjkgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzAJCTMwIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzMxCQkzMSAvKiBVbnJvdXRlZCAqLwotCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzMyCQkzMiAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zMwkJMzMgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzQJCTM0IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzM1CQkzNSAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zNgkJMzYgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzcJCTM3IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzM4CQkzOCAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zOQkJMzkgLyogVW5yb3V0ZWQgKi8KLQotI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMzMzUKLQotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80MAkJNDAgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDEJCTQxIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQyCQk0MiAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80MwkJNDMgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDQJCTQ0IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQ1CQk0NSAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80NgkJNDYgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDcJCTQ3IC8qIFVucm91dGVkICovCi0KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDgJCTQ4IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQ5CQk0OSAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU81MAkJNTAgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNTEJCTUxIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzUyCQk1MiAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU81MwkJNTMgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNTQJCTU0IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzU1CQk1NSAvKiBVbnJvdXRlZCAqLwotI2VuZGlmCi0KLSNlbmRpZgotCi0vKiB0cmFuc2xhdGVzIGEgcGluIG51bWJlciB0byBhIHBvcnQgbnVtYmVyICovCi0jZGVmaW5lIFBJTl9UT19QT1JUKHZhbCkgKHZhbCA+PiAzKQotCi0vKiBUaGVzZSBjYW4gYmUgZm91bmQgaW4gYXJjaC9hcm0vbWFjaC11MzAwL2dwaW8uYyAqLwotZXh0ZXJuIGludCBncGlvX2lzX3ZhbGlkKGludCBudW1iZXIpOwotZXh0ZXJuIGludCBncGlvX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqbGFiZWwpOwotZXh0ZXJuIHZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pOwotZXh0ZXJuIGludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKTsKLWV4dGVybiBpbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IGdwaW9fcmVnaXN0ZXJfY2FsbGJhY2sodW5zaWduZWQgZ3BpbywKLQkJCQkgIGludCAoKmZ1bmMpKHZvaWQgKmFyZyksCi0JCQkJICB2b2lkICopOwotZXh0ZXJuIGludCBncGlvX3VucmVnaXN0ZXJfY2FsbGJhY2sodW5zaWduZWQgZ3Bpbyk7Ci1leHRlcm4gdm9pZCBlbmFibGVfaXJxX29uX2dwaW9fcGluKHVuc2lnbmVkIGdwaW8sIGludCBlZGdlKTsKLWV4dGVybiB2b2lkIGRpc2FibGVfaXJxX29uX2dwaW9fcGluKHVuc2lnbmVkIGdwaW8pOwotZXh0ZXJuIHZvaWQgZ3Bpb19wdWxsdXAodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3Bpbyk7Ci1leHRlcm4gdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpOwotCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwIGdwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwIGdwaW9fc2V0X3ZhbHVlCi0KLS8qIHdyYXBwZXJzIHRvIHNsZWVwLWVuYWJsZSB0aGUgcHJldmlvdXMgdHdvIGZ1bmN0aW9ucyAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBQSU5fVE9fUE9SVChncGlvKSArIElSUV9VMzAwX0dQSU9fUE9SVDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQotewotCS8qCi0JICogRklYTUU6IFRoaXMgaXMgbm8gMS0xIG1hcHBpbmcgYXQgYWxsLCBpdCBwb2ludHMgdG8gdGhlCi0JICogd2hvbGUgYmxvY2sgb2YgOCBwaW5zLgotCSAqLwotCXJldHVybiAoaXJxIC0gSVJRX1UzMDBfR1BJT19QT1JUMCkgPDwgMzsKLX0KLQotI2VuZGlmCisvKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCAwOWIxYjI4Zi4uZGIzZmJmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTcyLDcgKzcyLDcgQEAKIAogLyogREIzMTUwIGFuZCBEQjMyMDAgaGF2ZSBvbmx5IDQ1IElSUXMgKi8KICNpZiBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMyWCkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzMwKQotI2RlZmluZSBVMzAwX05SX0lSUVMJCQk0NQorI2RlZmluZSBVMzAwX1ZJQ19JUlFTX0VORAkJNDUKICNlbmRpZgogCiAvKiBUaGUgREIzMzUwLXNwZWNpZmljIGludGVycnVwdCBsaW5lcyAqLwpAQCAtODgsNyArODgsNyBAQAogI2RlZmluZSBJUlFfVTMwMF9HUElPX1BPUlQ0CQk1MwogI2RlZmluZSBJUlFfVTMwMF9HUElPX1BPUlQ1CQk1NAogI2RlZmluZSBJUlFfVTMwMF9HUElPX1BPUlQ2CQk1NQotI2RlZmluZSBVMzAwX05SX0lSUVMJCQk1NgorI2RlZmluZSBVMzAwX1ZJQ19JUlFTX0VORAkJNTYKICNlbmRpZgogCiAvKiBUaGUgREIzMjEwLXNwZWNpZmljIGludGVycnVwdCBsaW5lcyAqLwpAQCAtMTA2LDE2ICsxMDYsMTcgQEAKICNkZWZpbmUgSVJRX1UzMDBfTkZJRgkJCTQ1CiAjZGVmaW5lIElSUV9VMzAwX05GSUYyCQkJNDYKICNkZWZpbmUgSVJRX1UzMDBfU1lTQ09OX1BMTF9MT0NLCTQ3Ci0jZGVmaW5lIFUzMDBfTlJfSVJRUwkJCTQ4CisjZGVmaW5lIFUzMDBfVklDX0lSUVNfRU5ECQk0OAogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQUIzNTUwX0NPUkUKLSNkZWZpbmUgSVJRX0FCMzU1MF9CQVNFCQkJKFUzMDBfTlJfSVJRUykKLSNkZWZpbmUgSVJRX0FCMzU1MF9FTkQJCQkoSVJRX0FCMzU1MF9CQVNFICsgMzcpCi0KLSNkZWZpbmUgTlJfSVJRUwkJCQkoSVJRX0FCMzU1MF9FTkQgKyAxKQorLyogTWF4aW11bSA4KjcgR1BJTyBsaW5lcyAqLworI2lmZGVmIENPTkZJR19HUElPX1UzMDAKKyNkZWZpbmUgSVJRX1UzMDBfR1BJT19CQVNFCQkoVTMwMF9WSUNfSVJRU19FTkQpCisjZGVmaW5lIElSUV9VMzAwX0dQSU9fRU5ECQkoSVJRX1UzMDBfR1BJT19CQVNFICsgNTYpCiAjZWxzZQotI2RlZmluZSBOUl9JUlFTIFUzMDBfTlJfSVJRUworI2RlZmluZSBJUlFfVTMwMF9HUElPX0VORAkJKFUzMDBfVklDX0lSUVNfRU5EKQogI2VuZGlmCiAKKyNkZWZpbmUgTlJfSVJRUwkJCQkoSVJRX1UzMDBfR1BJT19FTkQpCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggODg4ZTJlMy4uYzgwOGYzNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xMywzMCArMTMsNyBAQAogI2lmbmRlZiBfX01BQ0hfTUVNT1JZX0gKICNkZWZpbmUgX19NQUNIX01FTU9SWV9ICiAKLSNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX0RVQUxfUkFNCi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHg0ODAwMDAwMCkKLSNkZWZpbmUgQk9PVF9QQVJBTVNfT0ZGU0VUCShQSFlTX09GRlNFVCArIDB4MTAwKQotCi0jZWxzZQotCi0jaWZkZWYgQ09ORklHX01BQ0hfVTMwMF8yTUJfQUxJR05NRU5UX0ZJWAotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUICgweDI4MDAwMDAwICsgXAotCSAgICAgKENPTkZJR19NQUNIX1UzMDBfQUNDRVNTX01FTV9TSVpFIC0gXAotCSAgICAgKENPTkZJR19NQUNIX1UzMDBfQUNDRVNTX01FTV9TSVpFICYgMSkpKjEwMjQqMTAyNCkKLSNlbHNlCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQgKDB4MjgwMDAwMDAgKyBcCi0JICAgICAoQ09ORklHX01BQ0hfVTMwMF9BQ0NFU1NfTUVNX1NJWkUgKwlcCi0JICAgICAoQ09ORklHX01BQ0hfVTMwMF9BQ0NFU1NfTUVNX1NJWkUgJiAxKSkqMTAyNCoxMDI0KQotI2VuZGlmCi0jZGVmaW5lIEJPT1RfUEFSQU1TX09GRlNFVCAoMHgyODAwMDAwMCArIFwKLQkgICAgKENPTkZJR19NQUNIX1UzMDBfQUNDRVNTX01FTV9TSVpFICsJCVwKLQkgICAgKENPTkZJR19NQUNIX1UzMDBfQUNDRVNTX01FTV9TSVpFICYgMSkpKjEwMjQqMTAyNCArIDB4MTAwKQotI2VuZGlmCi0KLS8qCi0gKiBXZSBlbmFibGUgYSByZWFsIGJpZyBETUEgYnVmZmVyIGlmIG5lZWQgYmUuCi0gKi8KLSNkZWZpbmUgQ09OU0lTVEVOVF9ETUFfU0laRSBTWl80TQorI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4NDgwMDAwMDApCisjZGVmaW5lIEJPT1RfUEFSQU1TX09GRlNFVAkweDEwMAogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9tbWMuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC9tbWMuYwppbmRleCBkNWU0YTk4Li40ZDQ4MmFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvbW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL21tYy5jCkBAIC0xMywxMiArMTMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxtYWNoL2NvaDkwMTMxOC5oPgogI2luY2x1ZGUgPG1hY2gvZG1hX2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLXUzMDAuaD4KIAogI2luY2x1ZGUgIm1tYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvdTMwMC5jIGIvYXJjaC9hcm0vbWFjaC11MzAwL3UzMDAuYwppbmRleCA0OGIzYjdmLi44OTQyMmVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvdTMwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC91MzAwLmMKQEAgLTIzLDIxICsyMyw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KIAotc3RhdGljIHZvaWQgX19pbml0IHUzMDBfcmVzZXJ2ZSh2b2lkKQotewotCS8qCi0JICogVTMwMCAtIFRoaXMgcGxhdGZvcm0gZmFtaWx5IGNhbiBzaGFyZSBwaHlzaWNhbCBtZW1vcnkKLQkgKiBiZXR3ZWVuIHR3byBBUk0gY3B1cywgb25lIHJ1bm5pbmcgTGludXggYW5kIHRoZSBvdGhlcgotCSAqIHJ1bm5pbmcgYW5vdGhlciBPUy4KLQkgKi8KLSNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX1NJTkdMRV9SQU0KLSNpZiAoKENPTkZJR19NQUNIX1UzMDBfQUNDRVNTX01FTV9TSVpFICYgMSkgPT0gMSkgJiYgXAotCUNPTkZJR19NQUNIX1UzMDBfMk1CX0FMSUdOTUVOVF9GSVgKLSAgICAgICAgbWVtYmxvY2tfcmVzZXJ2ZShQSFlTX09GRlNFVCwgMHgwMDEwMDAwMCk7Ci0jZW5kaWYKLSNlbmRpZgotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgdTMwMF9pbml0X21hY2hpbmUodm9pZCkKIHsKIAl1MzAwX2luaXRfZGV2aWNlcygpOwpAQCAtNjEsOSArNDYsOCBAQAogCiBNQUNISU5FX1NUQVJUKFUzMDAsIE1BQ0hfVTMwMF9TVFJJTkcpCiAJLyogTWFpbnRhaW5lcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBCT09UX1BBUkFNU19PRkZTRVQsCisJLmF0YWdfb2Zmc2V0CT0gQk9PVF9QQVJBTVNfT0ZGU0VULAogCS5tYXBfaW8JCT0gdTMwMF9tYXBfaW8sCi0JLnJlc2VydmUJPSB1MzAwX3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gdTMwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnUzMDBfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IHUzMDBfaW5pdF9tYWNoaW5lLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtdXg1MDAvTWFrZWZpbGUKaW5kZXggMTY5NDkxNi4uNmJkMmY0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL01ha2VmaWxlCkBAIC0zLDcgKzMsOCBAQAogIwogCiBvYmoteQkJCQk6PSBjbG9jay5vIGNwdS5vIGRldmljZXMubyBkZXZpY2VzLWNvbW1vbi5vIFwKLQkJCQkgICBpZC5vIHVzYi5vCisJCQkJICAgaWQubyB1c2IubyB0aW1lci5vCitvYmotJChDT05GSUdfQ0FDSEVfTDJYMCkJKz0gY2FjaGUtbDJ4MC5vCiBvYmotJChDT05GSUdfVVg1MDBfU09DX0RCNTUwMCkJKz0gY3B1LWRiNTUwMC5vIGRtYS1kYjU1MDAubwogb2JqLSQoQ09ORklHX1VYNTAwX1NPQ19EQjg1MDApCSs9IGNwdS1kYjg1MDAubyBkZXZpY2VzLWRiODUwMC5vCiBvYmotJChDT05GSUdfTUFDSF9VODUwMCkJKz0gYm9hcmQtbW9wNTAwLm8gYm9hcmQtbW9wNTAwLXNkaS5vIFwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXBpbnMuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXBpbnMuYwppbmRleCBmMjZmZDc2Li43NGJmY2ZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1waW5zLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcGlucy5jCkBAIC02LDEwICs2LDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxwbGF0L3BpbmNmZy5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1ub21hZGlrLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiAjaW5jbHVkZSAicGlucy1kYjg1MDAuaCIKQEAgLTE1Myw3ICsxNTMsNyBAQAogCUdQSU83X1UxX1JUU24JfCBQSU5fT1VUUFVUX0hJR0gsCiB9OwogCi1zdGF0aWMgcGluX2NmZ190IG1vcDUwMF9waW5zX2hyZWZ2NjBbXSA9IHsKK3N0YXRpYyBwaW5fY2ZnX3QgaHJlZnY2MF9waW5zW10gPSB7CiAJLyogV0xBTiAqLwogCUdQSU80X0dQSU8JCXwgUElOX0lOUFVUX1BVTExVUCwvKiBXTEFOX0lSUSAqLwogCUdQSU84NV9HUElPCQl8IFBJTl9PVVRQVVRfTE9XLC8qIFdMQU5fRU5BICovCkBAIC0yNzksMTQgKzI3OSwyNiBAQAogdm9pZCBfX2luaXQgbW9wNTAwX3BpbnNfaW5pdCh2b2lkKQogewogCW5ta19jb25maWdfcGlucyhtb3A1MDBfcGluc19jb21tb24sCi0JCQkJQVJSQVlfU0laRShtb3A1MDBfcGluc19jb21tb24pKTsKLQlpZiAobWFjaGluZV9pc19ocmVmdjYwKCkpCi0JCW5ta19jb25maWdfcGlucyhtb3A1MDBfcGluc19ocmVmdjYwLAotCQkJCUFSUkFZX1NJWkUobW9wNTAwX3BpbnNfaHJlZnY2MCkpOwotCWVsc2UgaWYgKG1hY2hpbmVfaXNfc25vd2JhbGwoKSkKLQkJbm1rX2NvbmZpZ19waW5zKHNub3diYWxsX3BpbnMsCi0JCQkJQVJSQVlfU0laRShzbm93YmFsbF9waW5zKSk7Ci0JZWxzZQotCQlubWtfY29uZmlnX3BpbnMobW9wNTAwX3BpbnNfZGVmYXVsdCwKLQkJCQlBUlJBWV9TSVpFKG1vcDUwMF9waW5zX2RlZmF1bHQpKTsKKwkJCUFSUkFZX1NJWkUobW9wNTAwX3BpbnNfY29tbW9uKSk7CisKKwlubWtfY29uZmlnX3BpbnMobW9wNTAwX3BpbnNfZGVmYXVsdCwKKwkJCUFSUkFZX1NJWkUobW9wNTAwX3BpbnNfZGVmYXVsdCkpOworfQorCit2b2lkIF9faW5pdCBzbm93YmFsbF9waW5zX2luaXQodm9pZCkKK3sKKwlubWtfY29uZmlnX3BpbnMobW9wNTAwX3BpbnNfY29tbW9uLAorCQkJQVJSQVlfU0laRShtb3A1MDBfcGluc19jb21tb24pKTsKKworCW5ta19jb25maWdfcGlucyhzbm93YmFsbF9waW5zLAorCQkJQVJSQVlfU0laRShzbm93YmFsbF9waW5zKSk7Cit9CisKK3ZvaWQgX19pbml0IGhyZWZ2NjBfcGluc19pbml0KHZvaWQpCit7CisJbm1rX2NvbmZpZ19waW5zKG1vcDUwMF9waW5zX2NvbW1vbiwKKwkJCUFSUkFZX1NJWkUobW9wNTAwX3BpbnNfY29tbW9uKSk7CisKKwlubWtfY29uZmlnX3BpbnMoaHJlZnY2MF9waW5zLAorCQkJQVJSQVlfU0laRShocmVmdjYwX3BpbnMpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXNkaS5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtc2RpLmMKaW5kZXggZDBjYjllNS4uNjgyNmZhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtc2RpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtc2RpLmMKQEAgLTIxNiwzMCArMjE2LDQ4IEBACiAJLyogUG9QOmVkIGVNTUMgb24gdG9wIG9mIERCODUwMCB2MS4wIGhhcyBwcm9ibGVtcyB3aXRoIGhpZ2ggc3BlZWQgKi8KIAlpZiAoIWNwdV9pc191ODUwMHYxMCgpKQogCQltb3A1MDBfc2RpMl9kYXRhLmNhcGFiaWxpdGllcyB8PSBNTUNfQ0FQX01NQ19ISUdIU1BFRUQ7Ci0JLyogc2RpMiBvbiBzbm93YmFsbCBpcyBpbiBBVExfQiBtb2RlIGZvciBGU01DIChMQU4pICovCi0JaWYgKCFtYWNoaW5lX2lzX3Nub3diYWxsKCkpCi0JCWRiODUwMF9hZGRfc2RpMigmbW9wNTAwX3NkaTJfZGF0YSwgcGVyaXBoaWQpOworCisJZGI4NTAwX2FkZF9zZGkyKCZtb3A1MDBfc2RpMl9kYXRhLCBwZXJpcGhpZCk7CiAKIAkvKiBPbi1ib2FyZCBlTU1DICovCiAJZGI4NTAwX2FkZF9zZGk0KCZtb3A1MDBfc2RpNF9kYXRhLCBwZXJpcGhpZCk7CiAKLQlpZiAobWFjaGluZV9pc19ocmVmdjYwKCkgfHwgbWFjaGluZV9pc19zbm93YmFsbCgpKSB7Ci0JCWlmIChtYWNoaW5lX2lzX2hyZWZ2NjAoKSkgewotCQkJbW9wNTAwX3NkaTBfZGF0YS5ncGlvX2NkID0gSFJFRlY2MF9TRE1NQ19DRF9HUElPOwotCQkJc2RpMF9lbiA9IEhSRUZWNjBfU0RNTUNfRU5fR1BJTzsKLQkJCXNkaTBfdnNlbCA9IEhSRUZWNjBfU0RNTUNfMVY4XzNWX0dQSU87Ci0JCX0gZWxzZSBpZiAobWFjaGluZV9pc19zbm93YmFsbCgpKSB7Ci0JCQltb3A1MDBfc2RpMF9kYXRhLmdwaW9fY2QgPSBTTk9XQkFMTF9TRE1NQ19DRF9HUElPOwotCQkJbW9wNTAwX3NkaTBfZGF0YS5jZF9pbnZlcnQgPSB0cnVlOwotCQkJc2RpMF9lbiA9IFNOT1dCQUxMX1NETU1DX0VOX0dQSU87Ci0JCQlzZGkwX3ZzZWwgPSBTTk9XQkFMTF9TRE1NQ18xVjhfM1ZfR1BJTzsKLQkJfQotCQlzZGkwX2NvbmZpZ3VyZSgpOwotCX0KLQogCS8qCiAJICogT24gYm9hcmRzIHdpdGggdGhlIFRDMzU4OTIgR1BJTyBleHBhbmRlciwgc2RpMCB3aWxsIGZpbmFsbHkKIAkgKiBiZSBhZGRlZCB3aGVuIHRoZSBUQzM1ODkyIGluaXRpYWxpemVzIGFuZCBjYWxscwogCSAqIG1vcDUwMF9zZGlfdGMzNTg5Ml9pbml0KCkgYWJvdmUuCiAJICovCiB9CisKK3ZvaWQgX19pbml0IHNub3diYWxsX3NkaV9pbml0KHZvaWQpCit7CisJdTMyIHBlcmlwaGlkID0gMHgxMDQ4MDE4MDsKKworCW1vcDUwMF9zZGkyX2RhdGEuY2FwYWJpbGl0aWVzIHw9IE1NQ19DQVBfTU1DX0hJR0hTUEVFRDsKKworCS8qIE9uLWJvYXJkIGVNTUMgKi8KKwlkYjg1MDBfYWRkX3NkaTQoJm1vcDUwMF9zZGk0X2RhdGEsIHBlcmlwaGlkKTsKKworCW1vcDUwMF9zZGkwX2RhdGEuZ3Bpb19jZCA9IFNOT1dCQUxMX1NETU1DX0NEX0dQSU87CisJbW9wNTAwX3NkaTBfZGF0YS5jZF9pbnZlcnQgPSB0cnVlOworCXNkaTBfZW4gPSBTTk9XQkFMTF9TRE1NQ19FTl9HUElPOworCXNkaTBfdnNlbCA9IFNOT1dCQUxMX1NETU1DXzFWOF8zVl9HUElPOworCXNkaTBfY29uZmlndXJlKCk7Cit9CisKK3ZvaWQgX19pbml0IGhyZWZ2NjBfc2RpX2luaXQodm9pZCkKK3sKKwl1MzIgcGVyaXBoaWQgPSAweDEwNDgwMTgwOworCisJbW9wNTAwX3NkaTJfZGF0YS5jYXBhYmlsaXRpZXMgfD0gTU1DX0NBUF9NTUNfSElHSFNQRUVEOworCisJZGI4NTAwX2FkZF9zZGkyKCZtb3A1MDBfc2RpMl9kYXRhLCBwZXJpcGhpZCk7CisKKwkvKiBPbi1ib2FyZCBlTU1DICovCisJZGI4NTAwX2FkZF9zZGk0KCZtb3A1MDBfc2RpNF9kYXRhLCBwZXJpcGhpZCk7CisKKwltb3A1MDBfc2RpMF9kYXRhLmdwaW9fY2QgPSBIUkVGVjYwX1NETU1DX0NEX0dQSU87CisJc2RpMF9lbiA9IEhSRUZWNjBfU0RNTUNfRU5fR1BJTzsKKwlzZGkwX3ZzZWwgPSBIUkVGVjYwX1NETU1DXzFWOF8zVl9HUElPOworCXNkaTBfY29uZmlndXJlKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC11ODUwMHVpYi5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtdTg1MDB1aWIuYwppbmRleCA4Y2U0NmMwLi5mZWI1NzQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC11ODUwMHVpYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXU4NTAwdWliLmMKQEAgLTQsNyArNCw3IEBACiAgKiBCb2FyZCBkYXRhIGZvciB0aGUgVTg1MDAgVUlCLCBhbHNvIGtub3duIGFzIHRoZSBOZXcgVUlCCiAgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdmVyc2lvbiAyCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3RjMzU4OXguaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogI2luY2x1ZGUgImJvYXJkLW1vcDUwMC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMKaW5kZXggY2Q1NGFiYS4uYmRkN2I4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8cGxhdC9pMmMuaD4KICNpbmNsdWRlIDxwbGF0L3N0ZV9kbWE0MC5oPgogI2luY2x1ZGUgPHBsYXQvcGluY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLW5vbWFkaWsuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3NldHVwLmg+CkBAIC02MDMsMjggKzYwNCwxNCBAQAogewogCWludCBpMmMwX2RldnM7CiAKLQkvKgotCSAqIFRoZSBIUkVGdjYwIGJvYXJkIHJlbW92ZWQgYSBHUElPIGV4cGFuZGVyIGFuZCByb3V0ZWQKLQkgKiBhbGwgdGhlc2UgR1BJTyBwaW5zIHRvIHRoZSBpbnRlcm5hbCBHUElPIGNvbnRyb2xsZXIKLQkgKiBpbnN0ZWFkLgotCSAqLwotCWlmICghbWFjaGluZV9pc19zbm93YmFsbCgpKSB7Ci0JCWlmIChtYWNoaW5lX2lzX2hyZWZ2NjAoKSkKLQkJCW1vcDUwMF9ncGlvX2tleXNbMF0uZ3BpbyA9IEhSRUZWNjBfUFJPWF9TRU5TRV9HUElPOwotCQllbHNlCi0JCQltb3A1MDBfZ3Bpb19rZXlzWzBdLmdwaW8gPSBHUElPX1BST1hfU0VOU09SOwotCX0KKwltb3A1MDBfZ3Bpb19rZXlzWzBdLmdwaW8gPSBHUElPX1BST1hfU0VOU09SOwogCiAJdTg1MDBfaW5pdF9kZXZpY2VzKCk7CiAKIAltb3A1MDBfcGluc19pbml0KCk7CiAKLQlpZiAobWFjaGluZV9pc19zbm93YmFsbCgpKQotCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbm93YmFsbF9wbGF0Zm9ybV9kZXZzLAotCQkJCQlBUlJBWV9TSVpFKHNub3diYWxsX3BsYXRmb3JtX2RldnMpKTsKLQllbHNlCi0JCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG1vcDUwMF9wbGF0Zm9ybV9kZXZzLAotCQkJCQlBUlJBWV9TSVpFKG1vcDUwMF9wbGF0Zm9ybV9kZXZzKSk7CisJcGxhdGZvcm1fYWRkX2RldmljZXMobW9wNTAwX3BsYXRmb3JtX2RldnMsCisJCQlBUlJBWV9TSVpFKG1vcDUwMF9wbGF0Zm9ybV9kZXZzKSk7CiAKIAltb3A1MDBfaTJjX2luaXQoKTsKIAltb3A1MDBfc2RpX2luaXQoKTsKQEAgLTYzMiw4ICs2MTksNjYgQEAKIAltb3A1MDBfdWFydF9pbml0KCk7CiAKIAlpMmMwX2RldnMgPSBBUlJBWV9TSVpFKG1vcDUwMF9pMmMwX2RldmljZXMpOwotCWlmIChtYWNoaW5lX2lzX2hyZWZ2NjAoKSkKLQkJaTJjMF9kZXZzIC09IE5VTV9QUkVfVjYwX0kyQzBfREVWSUNFUzsKKworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIG1vcDUwMF9pMmMwX2RldmljZXMsIGkyYzBfZGV2cyk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMiwgbW9wNTAwX2kyYzJfZGV2aWNlcywKKwkJCQlBUlJBWV9TSVpFKG1vcDUwMF9pMmMyX2RldmljZXMpKTsKKworCS8qIFRoaXMgYm9hcmQgaGFzIGZ1bGwgcmVndWxhdG9yIGNvbnN0cmFpbnRzICovCisJcmVndWxhdG9yX2hhc19mdWxsX2NvbnN0cmFpbnRzKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbm93YmFsbF9pbml0X21hY2hpbmUodm9pZCkKK3sKKwlpbnQgaTJjMF9kZXZzOworCisJdTg1MDBfaW5pdF9kZXZpY2VzKCk7CisKKwlzbm93YmFsbF9waW5zX2luaXQoKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNub3diYWxsX3BsYXRmb3JtX2RldnMsCisJCQlBUlJBWV9TSVpFKHNub3diYWxsX3BsYXRmb3JtX2RldnMpKTsKKworCW1vcDUwMF9pMmNfaW5pdCgpOworCXNub3diYWxsX3NkaV9pbml0KCk7CisJbW9wNTAwX3NwaV9pbml0KCk7CisJbW9wNTAwX3VhcnRfaW5pdCgpOworCisJaTJjMF9kZXZzID0gQVJSQVlfU0laRShtb3A1MDBfaTJjMF9kZXZpY2VzKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBtb3A1MDBfaTJjMF9kZXZpY2VzLCBpMmMwX2RldnMpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDIsIG1vcDUwMF9pMmMyX2RldmljZXMsCisJCQkJQVJSQVlfU0laRShtb3A1MDBfaTJjMl9kZXZpY2VzKSk7CisKKwkvKiBUaGlzIGJvYXJkIGhhcyBmdWxsIHJlZ3VsYXRvciBjb25zdHJhaW50cyAqLworCXJlZ3VsYXRvcl9oYXNfZnVsbF9jb25zdHJhaW50cygpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaHJlZnY2MF9pbml0X21hY2hpbmUodm9pZCkKK3sKKwlpbnQgaTJjMF9kZXZzOworCisJLyoKKwkgKiBUaGUgSFJFRnY2MCBib2FyZCByZW1vdmVkIGEgR1BJTyBleHBhbmRlciBhbmQgcm91dGVkCisJICogYWxsIHRoZXNlIEdQSU8gcGlucyB0byB0aGUgaW50ZXJuYWwgR1BJTyBjb250cm9sbGVyCisJICogaW5zdGVhZC4KKwkgKi8KKwltb3A1MDBfZ3Bpb19rZXlzWzBdLmdwaW8gPSBIUkVGVjYwX1BST1hfU0VOU0VfR1BJTzsKKworCXU4NTAwX2luaXRfZGV2aWNlcygpOworCisJaHJlZnY2MF9waW5zX2luaXQoKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG1vcDUwMF9wbGF0Zm9ybV9kZXZzLAorCQkJQVJSQVlfU0laRShtb3A1MDBfcGxhdGZvcm1fZGV2cykpOworCisJbW9wNTAwX2kyY19pbml0KCk7CisJbW9wNTAwX3NkaV9pbml0KCk7CisJbW9wNTAwX3NwaV9pbml0KCk7CisJbW9wNTAwX3VhcnRfaW5pdCgpOworCisJaTJjMF9kZXZzID0gQVJSQVlfU0laRShtb3A1MDBfaTJjMF9kZXZpY2VzKTsKKworCWkyYzBfZGV2cyAtPSBOVU1fUFJFX1Y2MF9JMkMwX0RFVklDRVM7CiAKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBtb3A1MDBfaTJjMF9kZXZpY2VzLCBpMmMwX2RldnMpOwogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDIsIG1vcDUwMF9pMmMyX2RldmljZXMsCkBAIC02NDUsNyArNjkwLDcgQEAKIAogTUFDSElORV9TVEFSVChVODUwMCwgIlNULUVyaWNzc29uIE1PUDUwMCBwbGF0Zm9ybSIpCiAJLyogTWFpbnRhaW5lcjogU3JpbmlkaGkgS2FzYWdhciA8c3JpbmlkaGkua2FzYWdhckBzdGVyaWNzc29uLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHU4NTAwX21hcF9pbywKIAkuaW5pdF9pcnEJPSB1eDUwMF9pbml0X2lycSwKIAkvKiB3ZSByZS11c2Ugbm9tYWRpayB0aW1lciBoZXJlICovCkBAIC02NTQsMTggKzY5OSwxOCBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChIUkVGVjYwLCAiU1QtRXJpY3Nzb24gVTg1MDAgUGxhdGZvcm0gSFJFRnY2MCsiKQotCS5ib290X3BhcmFtcwk9IDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gdTg1MDBfbWFwX2lvLAogCS5pbml0X2lycQk9IHV4NTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmdXg1MDBfdGltZXIsCi0JLmluaXRfbWFjaGluZQk9IG1vcDUwMF9pbml0X21hY2hpbmUsCisJLmluaXRfbWFjaGluZQk9IGhyZWZ2NjBfaW5pdF9tYWNoaW5lLAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChTTk9XQkFMTCwgIkNhbGFvIFN5c3RlbXMgU25vd2JhbGwgcGxhdGZvcm0iKQotCS5ib290X3BhcmFtcwk9IDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gdTg1MDBfbWFwX2lvLAogCS5pbml0X2lycQk9IHV4NTAwX2luaXRfaXJxLAogCS8qIHdlIHJlLXVzZSBub21hZGlrIHRpbWVyIGhlcmUgKi8KIAkudGltZXIJCT0gJnV4NTAwX3RpbWVyLAotCS5pbml0X21hY2hpbmUJPSBtb3A1MDBfaW5pdF9tYWNoaW5lLAorCS5pbml0X21hY2hpbmUJPSBzbm93YmFsbF9pbml0X21hY2hpbmUsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmgKaW5kZXggZWU3N2E4OS4uZGUxOGEyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuaAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5oCkBAIC00MCwxMCArNDAsMTMgQEAKIHN0cnVjdCBpMmNfYm9hcmRfaW5mbzsKIAogZXh0ZXJuIHZvaWQgbW9wNTAwX3NkaV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgc25vd2JhbGxfc2RpX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBtb3A1MDBfc2RpX3RjMzU4OTJfaW5pdCh2b2lkKTsKIHZvaWQgX19pbml0IG1vcDUwMF91ODUwMHVpYl9pbml0KHZvaWQpOwogdm9pZCBfX2luaXQgbW9wNTAwX3N0dWliX2luaXQodm9pZCk7CiB2b2lkIF9faW5pdCBtb3A1MDBfcGluc19pbml0KHZvaWQpOwordm9pZCBfX2luaXQgaHJlZnY2MF9waW5zX2luaXQodm9pZCk7Cit2b2lkIF9faW5pdCBzbm93YmFsbF9waW5zX2luaXQodm9pZCk7CiAKIHZvaWQgbW9wNTAwX3VpYl9pMmNfYWRkKGludCBidXNudW0sIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbywKIAkJdW5zaWduZWQgbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLXU1NTAwLXNkaS5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC11NTUwMC1zZGkuYwppbmRleCA3MzlmYjRjLi42M2MzZjgwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLXU1NTAwLXNkaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtdTU1MDAtc2RpLmMKQEAgLTcsOSArNyw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9hbWJhL21tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPHBsYXQvcGluY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLW5vbWFkaWsuaD4KICNpbmNsdWRlIDxtYWNoL2RiNTUwMC1yZWdzLmg+CiAjaW5jbHVkZSA8cGxhdC9zdGVfZG1hNDAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC11NTUwMC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC11NTUwMC5jCmluZGV4IGU1OGYwZjUuLjgyMDI1YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtdTU1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLXU1NTAwLmMKQEAgLTgsMTUgKzgsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FiNTUwMC9hYjU1MDAuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8cGxhdC9waW5jZmcuaD4KICNpbmNsdWRlIDxwbGF0L2kyYy5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1ub21hZGlrLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+CkBAIC04Nyw3ICs4OCw2IEBACiAJLmJydF92YWwgPSAweDdGLAkvKiBNYXggYnJpZ2h0bmVzcyAqLwogfTsKIAotCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgdTU1MDBfaTJjMl9kZXZpY2VzW10gPSB7CiAJewogCQkvKiBCYWNrbGlnaHQgKi8KQEAgLTEwMSw2ICsxMDEsMzAgQEAKIAlkYjU1MDBfYWRkX2kyYzIoJnU1NTAwX2kyYzJfZGF0YSk7CiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMiwgQVJSQVlfQU5EX1NJWkUodTU1MDBfaTJjMl9kZXZpY2VzKSk7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgYWI1NTAwX3BsYXRmb3JtX2RhdGEgYWI1NTAwX3BsZl9kYXRhID0geworCS5pcnEgPSB7CisJCS5iYXNlID0gMCwKKwkJLmNvdW50ID0gMCwKKwl9LAorCS5pbml0X3NldHRpbmdzID0gTlVMTCwKKwkuaW5pdF9zZXR0aW5nc19zeiA9IDAsCisJLnBtX3Bvd2VyX29mZiA9IGZhbHNlLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYWI1NTAwX2RldmljZSA9IHsKKwkubmFtZSA9ICJhYjU1MDAtY29yZSIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZhYjU1MDBfcGxmX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdTU1MDBfcGxhdGZvcm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmFiNTUwMF9kZXZpY2UsCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgdTU1MDBfdWFydF9pbml0KHZvaWQpCiB7CiAJZGI1NTAwX2FkZF91YXJ0MChOVUxMKTsKQEAgLTExNSwxMCArMTM5LDEzIEBACiAJdTU1MDBfaTJjX2luaXQoKTsKIAl1NTUwMF9zZGlfaW5pdCgpOwogCXU1NTAwX3VhcnRfaW5pdCgpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXModTU1MDBfcGxhdGZvcm1fZGV2aWNlcywKKwkJQVJSQVlfU0laRSh1NTUwMF9wbGF0Zm9ybV9kZXZpY2VzKSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoVTU1MDAsICJTVC1Fcmljc3NvbiBVNTUwMCBQbGF0Zm9ybSIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHU1NTAwX21hcF9pbywKIAkuaW5pdF9pcnEJPSB1eDUwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnV4NTAwX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jYWNoZS1sMngwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NhY2hlLWwyeDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjJkZGRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jYWNoZS1sMngwLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gU0EgMjAxMQorICoKKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9pZC5oPgorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpsMngwX2Jhc2U7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1eDUwMF9jYWNoZV93YWl0KHZvaWQgX19pb21lbSAqcmVnLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJLyogd2FpdCBmb3IgdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZSAqLworCXdoaWxlIChyZWFkbF9yZWxheGVkKHJlZykgJiBtYXNrKQorCQljcHVfcmVsYXgoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHV4NTAwX2NhY2hlX3N5bmModm9pZCkKK3sKKwl3cml0ZWxfcmVsYXhlZCgwLCBsMngwX2Jhc2UgKyBMMlgwX0NBQ0hFX1NZTkMpOworCXV4NTAwX2NhY2hlX3dhaXQobDJ4MF9iYXNlICsgTDJYMF9DQUNIRV9TWU5DLCAxKTsKK30KKworLyoKKyAqIFRoZSBMMiBjYWNoZSBjYW5ub3QgYmUgdHVybmVkIG9mZiBpbiB0aGUgbm9uLXNlY3VyZSB3b3JsZC4KKyAqIER1bW15IHVudGlsIGEgc2VjdXJlIHNlcnZpY2UgaXMgaW4gcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIHV4NTAwX2wyeDBfZGlzYWJsZSh2b2lkKQoreworfQorCisvKgorICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIGRvaW5nIGEga2V4ZWMsIGp1c3QgYWZ0ZXIgdHVybmluZyBvZmYgdGhlIEwyCisgKiBhbmQgTDEgY2FjaGUsIGFuZCBpdCBpcyBzdXJyb3VuZGVkIGJ5IGEgc3BpbmxvY2sgaW4gdGhlIGdlbmVyaWMgdmVyc2lvbi4KKyAqIEhvd2V2ZXIsIHdlJ3JlIG5vdCByZWFsbHkgdHVybmluZyBvZmYgdGhlIEwyIGNhY2hlIHJpZ2h0IG5vdyBhbmQgdGhlCisgKiBQTDMxMCBkb2VzIG5vdCBzdXBwb3J0IGV4Y2x1c2l2ZSBhY2Nlc3NlcyAodXNlZCB0byBpbXBsZW1lbnQgdGhlIHNwaW5sb2NrKS4KKyAqIFNvLCB0aGUgaW52YWxpZGF0aW9uIG5lZWRzIHRvIGJlIGRvbmUgd2l0aG91dCB0aGUgc3BpbmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIHV4NTAwX2wyeDBfaW52X2FsbCh2b2lkKQoreworCXVpbnQzMl90IGwyeDBfd2F5X21hc2sgPSAoMTw8MTYpIC0gMTsJLyogQml0bWFzayBvZiBhY3RpdmUgd2F5cyAqLworCisJLyogaW52YWxpZGF0ZSBhbGwgd2F5cyAqLworCXdyaXRlbF9yZWxheGVkKGwyeDBfd2F5X21hc2ssIGwyeDBfYmFzZSArIEwyWDBfSU5WX1dBWSk7CisJdXg1MDBfY2FjaGVfd2FpdChsMngwX2Jhc2UgKyBMMlgwX0lOVl9XQVksIGwyeDBfd2F5X21hc2spOworCXV4NTAwX2NhY2hlX3N5bmMoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdXg1MDBfbDJ4MF91bmxvY2sodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogVW5sb2NrIERhdGEgYW5kIEluc3RydWN0aW9uIExvY2sgaWYgbG9ja2VkLiBVeDUwMCBVLUJvb3QgdmVyc2lvbnMKKwkgKiBhcHBhcmVudGx5IGxvY2tzIGJvdGggY2FjaGVzIGJlZm9yZSBqdW1waW5nIHRvIHRoZSBrZXJuZWwuIFRoZQorCSAqIGwyeDAgY29yZSB3aWxsIG5vdCB0b3VjaCB0aGUgdW5sb2NrIHJlZ2lzdGVycyBpZiB0aGUgbDJ4MCBpcworCSAqIGFscmVhZHkgZW5hYmxlZCwgc28gd2UgZG8gaXQgcmlnaHQgaGVyZSBpbnN0ZWFkLiBUaGUgUEwzMTAgaGFzCisJICogOCBzZXRzIG9mIHJlZ2lzdGVycywgb25lIHBlciBwb3NzaWJsZSBDUFUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl3cml0ZWxfcmVsYXhlZCgweDAsIGwyeDBfYmFzZSArIEwyWDBfTE9DS0RPV05fV0FZX0RfQkFTRSArCisJCQkgICAgICAgaSAqIEwyWDBfTE9DS0RPV05fU1RSSURFKTsKKwkJd3JpdGVsX3JlbGF4ZWQoMHgwLCBsMngwX2Jhc2UgKyBMMlgwX0xPQ0tET1dOX1dBWV9JX0JBU0UgKworCQkJICAgICAgIGkgKiBMMlgwX0xPQ0tET1dOX1NUUklERSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB1eDUwMF9sMngwX2luaXQodm9pZCkKK3sKKwlpZiAoY3B1X2lzX3U1NTAwKCkpCisJCWwyeDBfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9MMkNDX0JBU0UpOworCWVsc2UgaWYgKGNwdV9pc191ODUwMCgpKQorCQlsMngwX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfTDJDQ19CQVNFKTsKKwllbHNlCisJCXV4NTAwX3Vua25vd25fc29jKCk7CisKKwkvKiBVbmxvY2sgYmVmb3JlIGluaXQgKi8KKwl1eDUwMF9sMngwX3VubG9jaygpOworCisJLyogNjRLQiB3YXkgc2l6ZSwgOCB3YXkgYXNzb2NpYXRpdml0eSwgZm9yY2UgV0EgKi8KKwlsMngwX2luaXQobDJ4MF9iYXNlLCAweDNlMDYwMDAwLCAweGMwMDAwZmZmKTsKKworCS8qIE92ZXJyaWRlIGludmFsaWRhdGUgZnVuY3Rpb24gKi8KKwlvdXRlcl9jYWNoZS5kaXNhYmxlID0gdXg1MDBfbDJ4MF9kaXNhYmxlOworCW91dGVyX2NhY2hlLmludl9hbGwgPSB1eDUwMF9sMngwX2ludl9hbGw7CisKKwlyZXR1cm4gMDsKK30KKworZWFybHlfaW5pdGNhbGwodXg1MDBfbDJ4MF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiNTUwMC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMKaW5kZXggMjI3MDVkMi4uOWRlMWFmMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vcG11Lmg+CiAKLSNpbmNsdWRlIDxwbGF0L2dwaW8uaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tbm9tYWRpay5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI4NTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYwppbmRleCA0NTk4YjA2Li4xM2U4ODkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYwpAQCAtMTQsMTIgKzE0LDEyIEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9wbXUuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tbm9tYWRpay5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3NldHVwLmg+CiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUuYwppbmRleCAxZGEyM2JiLi5mNDE4NTc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LmMKQEAgLTEwLDE0ICsxMCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9kYjg1MDAtcHJjbXUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvZGI1NTAwLXByY211Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrc3JjLWRieDUwMC1wcmNtdS5oPgogCi0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbG9jYWx0aW1lci5oPgogCi0jaW5jbHVkZSA8cGxhdC9tdHUuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9zZXR1cC5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgpAQCAtMjYsMTAgKzI0LDYgQEAKIAogdm9pZCBfX2lvbWVtICpfUFJDTVVfQkFTRTsKIAotI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpsMngwX2Jhc2U7Ci0jZW5kaWYKLQogdm9pZCBfX2luaXQgdXg1MDBfaW5pdF9pcnEodm9pZCkKIHsKIAl2b2lkIF9faW9tZW0gKmRpc3RfYmFzZTsKQEAgLTUzLDk2ICs0Nyw2IEBACiAJaWYgKGNwdV9pc191NTUwMCgpKQogCQlkYjU1MDBfcHJjbXVfZWFybHlfaW5pdCgpOwogCWlmIChjcHVfaXNfdTg1MDAoKSkKLQkJcHJjbXVfZWFybHlfaW5pdCgpOworCQlkYjg1MDBfcHJjbXVfZWFybHlfaW5pdCgpOwogCWNsa19pbml0KCk7CiB9Ci0KLSNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAotc3RhdGljIGlubGluZSB2b2lkIHV4NTAwX2NhY2hlX3dhaXQodm9pZCBfX2lvbWVtICpyZWcsIHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLQkvKiB3YWl0IGZvciB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlICovCi0Jd2hpbGUgKHJlYWRsX3JlbGF4ZWQocmVnKSAmIG1hc2spCi0JCTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHV4NTAwX2NhY2hlX3N5bmModm9pZCkKLXsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBsMngwX2Jhc2U7Ci0KLQl3cml0ZWxfcmVsYXhlZCgwLCBiYXNlICsgTDJYMF9DQUNIRV9TWU5DKTsKLQl1eDUwMF9jYWNoZV93YWl0KGJhc2UgKyBMMlgwX0NBQ0hFX1NZTkMsIDEpOwotfQotCi0vKgotICogVGhlIEwyIGNhY2hlIGNhbm5vdCBiZSB0dXJuZWQgb2ZmIGluIHRoZSBub24tc2VjdXJlIHdvcmxkLgotICogRHVtbXkgdW50aWwgYSBzZWN1cmUgc2VydmljZSBpcyBpbiBwbGFjZS4KLSAqLwotc3RhdGljIHZvaWQgdXg1MDBfbDJ4MF9kaXNhYmxlKHZvaWQpCi17Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gZG9pbmcgYSBrZXhlYywganVzdCBhZnRlciB0dXJuaW5nIG9mZiB0aGUgTDIKLSAqIGFuZCBMMSBjYWNoZSwgYW5kIGl0IGlzIHN1cnJvdW5kZWQgYnkgYSBzcGlubG9jayBpbiB0aGUgZ2VuZXJpYyB2ZXJzaW9uLgotICogSG93ZXZlciwgd2UncmUgbm90IHJlYWxseSB0dXJuaW5nIG9mZiB0aGUgTDIgY2FjaGUgcmlnaHQgbm93IGFuZCB0aGUKLSAqIFBMMzEwIGRvZXMgbm90IHN1cHBvcnQgZXhjbHVzaXZlIGFjY2Vzc2VzICh1c2VkIHRvIGltcGxlbWVudCB0aGUgc3BpbmxvY2spLgotICogU28sIHRoZSBpbnZhbGlkYXRpb24gbmVlZHMgdG8gYmUgZG9uZSB3aXRob3V0IHRoZSBzcGlubG9jay4KLSAqLwotc3RhdGljIHZvaWQgdXg1MDBfbDJ4MF9pbnZfYWxsKHZvaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gbDJ4MF9iYXNlOwotCXVpbnQzMl90IGwyeDBfd2F5X21hc2sgPSAoMTw8MTYpIC0gMTsJLyogQml0bWFzayBvZiBhY3RpdmUgd2F5cyAqLwotCi0JLyogaW52YWxpZGF0ZSBhbGwgd2F5cyAqLwotCXdyaXRlbF9yZWxheGVkKGwyeDBfd2F5X21hc2ssIGJhc2UgKyBMMlgwX0lOVl9XQVkpOwotCXV4NTAwX2NhY2hlX3dhaXQoYmFzZSArIEwyWDBfSU5WX1dBWSwgbDJ4MF93YXlfbWFzayk7Ci0JdXg1MDBfY2FjaGVfc3luYygpOwotfQotCi1zdGF0aWMgaW50IHV4NTAwX2wyeDBfaW5pdCh2b2lkKQotewotCWlmIChjcHVfaXNfdTU1MDAoKSkKLQkJbDJ4MF9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX0wyQ0NfQkFTRSk7Ci0JZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCi0JCWwyeDBfYmFzZSA9IF9faW9fYWRkcmVzcyhVODUwMF9MMkNDX0JBU0UpOwotCWVsc2UKLQkJdXg1MDBfdW5rbm93bl9zb2MoKTsKLQotCS8qIDY0S0Igd2F5IHNpemUsIDggd2F5IGFzc29jaWF0aXZpdHksIGZvcmNlIFdBICovCi0JbDJ4MF9pbml0KGwyeDBfYmFzZSwgMHgzZTA2MDAwMCwgMHhjMDAwMGZmZik7Ci0KLQkvKiBPdmVycmlkZSBpbnZhbGlkYXRlIGZ1bmN0aW9uICovCi0Jb3V0ZXJfY2FjaGUuZGlzYWJsZSA9IHV4NTAwX2wyeDBfZGlzYWJsZTsKLQlvdXRlcl9jYWNoZS5pbnZfYWxsID0gdXg1MDBfbDJ4MF9pbnZfYWxsOwotCi0JcmV0dXJuIDA7Ci19Ci1lYXJseV9pbml0Y2FsbCh1eDUwMF9sMngwX2luaXQpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9faW5pdCB1eDUwMF90aW1lcl9pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotCS8qIFNldHVwIHRoZSBsb2NhbCB0aW1lciBiYXNlICovCi0JaWYgKGNwdV9pc191NTUwMCgpKQotCQl0d2RfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9UV0RfQkFTRSk7Ci0JZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCi0JCXR3ZF9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX1RXRF9CQVNFKTsKLQllbHNlCi0JCXV4NTAwX3Vua25vd25fc29jKCk7Ci0jZW5kaWYKLQlpZiAoY3B1X2lzX3U1NTAwKCkpCi0JCW10dV9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX01UVTBfQkFTRSk7Ci0JZWxzZSBpZiAoY3B1X2lzX3U4NTAwZWQoKSkKLQkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfTVRVMF9CQVNFX0VEKTsKLQllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKLQkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfTVRVMF9CQVNFKTsKLQllbHNlCi0JCXV4NTAwX3Vua25vd25fc29jKCk7Ci0KLQlubWRrX3RpbWVyX2luaXQoKTsKLX0KLQotc3RydWN0IHN5c190aW1lciB1eDUwMF90aW1lciA9IHsKLQkuaW5pdAk9IHV4NTAwX3RpbWVyX2luaXQsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9kZXZpY2VzLWNvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9kZXZpY2VzLWNvbW1vbi5jCmluZGV4IDEzYTRjZTAuLmM1NjNlNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvZGV2aWNlcy1jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2RldmljZXMtY29tbW9uLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogCi0jaW5jbHVkZSA8cGxhdC9ncGlvLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLW5vbWFkaWsuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ob3RwbHVnLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2hvdHBsdWcuYwppbmRleCBkZDgwMzdlLi41NzIwMTVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2hvdHBsdWcuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2hvdHBsdWcuYwpAQCAtMjQsNyArMjQsNyBAQAogCWZvciAoOzspIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oImRzYlxuXHQiICJ3Zmlcblx0IgogCQkJCTogOiA6ICJtZW1vcnkiKTsKLQkJaWYgKHBlbl9yZWxlYXNlID09IGNwdSkgeworCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1X2xvZ2ljYWxfbWFwKGNwdSkpIHsKIAkJCS8qCiAJCQkgKiBPSywgcHJvcGVyIHdha2V1cCwgd2UncmUgZG9uZQogCQkJICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kYjU1MDAtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGI1NTAwLXJlZ3MuaAppbmRleCA2YWQ5ODMyLi45OTRiNWZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kYjU1MDAtcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RiNTUwMC1yZWdzLmgKQEAgLTYxLDYgKzYxLDggQEAKICNkZWZpbmUgVTU1MDBfU0NSX0JBU0UJCShVNTUwMF9QRVI0X0JBU0UgKyAweDUwMDApCiAjZGVmaW5lIFU1NTAwX0RNQ19CQVNFCQkoVTU1MDBfUEVSNF9CQVNFICsgMHg2MDAwKQogI2RlZmluZSBVNTUwMF9QUkNNVV9CQVNFCShVNTUwMF9QRVI0X0JBU0UgKyAweDcwMDApCisjZGVmaW5lIFU1NTAwX1BSQ01VX1RJTUVSXzNfQkFTRSAoVTU1MDBfUEVSNF9CQVNFICsgMHgwNzMzOCkKKyNkZWZpbmUgVTU1MDBfUFJDTVVfVElNRVJfNF9CQVNFIChVNTUwMF9QRVI0X0JBU0UgKyAweDA3NDUwKQogI2RlZmluZSBVNTUwMF9NU1AxX0JBU0UJCShVNTUwMF9QRVI0X0JBU0UgKyAweDkwMDApCiAjZGVmaW5lIFU1NTAwX0dQSU8yX0JBU0UJKFU1NTAwX1BFUjRfQkFTRSArIDB4QTAwMCkKICNkZWZpbmUgVTU1MDBfQ0RFVEVDVF9CQVNFCShVNTUwMF9QRVI0X0JBU0UgKyAweEYwMDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kYjg1MDAtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGI4NTAwLXJlZ3MuaAppbmRleCAwNDk5OTcxLi43NTFiMGU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kYjg1MDAtcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RiODUwMC1yZWdzLmgKQEAgLTEwMiwxMCArMTAyLDEzIEBACiAjZGVmaW5lIFU4NTAwX1NDUl9CQVNFCQkoVTg1MDBfUEVSNF9CQVNFICsgMHgwNTAwMCkKICNkZWZpbmUgVTg1MDBfRE1DX0JBU0UJCShVODUwMF9QRVI0X0JBU0UgKyAweDA2MDAwKQogI2RlZmluZSBVODUwMF9QUkNNVV9CQVNFCShVODUwMF9QRVI0X0JBU0UgKyAweDA3MDAwKQorI2RlZmluZSBVODUwMF9QUkNNVV9USU1FUl8zX0JBU0UgKFU4NTAwX1BFUjRfQkFTRSArIDB4MDczMzgpCisjZGVmaW5lIFU4NTAwX1BSQ01VX1RJTUVSXzRfQkFTRSAoVTg1MDBfUEVSNF9CQVNFICsgMHgwNzQ1MCkKICNkZWZpbmUgVTg1MDBfUFJDTVVfVENETV9CQVNFX1YxIChVODUwMF9QRVI0X0JBU0UgKyAweDBmMDAwKQogI2RlZmluZSBVODUwMF9QUkNNVV9UQ0RNX0JBU0UJKFU4NTAwX1BFUjRfQkFTRSArIDB4NjgwMDApCiAjZGVmaW5lIFU4NTAwX1BSQ01VX1RDUE1fQkFTRSAgIChVODUwMF9QRVI0X0JBU0UgKyAweDYwMDAwKQogCisKIC8qIHBlcjMgYmFzZSBhZGRyZXNzZXMgKi8KICNkZWZpbmUgVTg1MDBfRlNNQ19CQVNFCQkoVTg1MDBfUEVSM19CQVNFICsgMHgwMDAwKQogI2RlZmluZSBVODUwMF9TU1AwX0JBU0UJCShVODUwMF9QRVIzX0JBU0UgKyAweDIwMDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA3MDBmYjA1Li44ZDc0ZDkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgVVg1MDBfVUFSVChuKQlfX1VYNTAwX1VBUlQobikKICNkZWZpbmUgVUFSVF9CQVNFCVVYNTAwX1VBUlQoQ09ORklHX1VYNTAwX0RFQlVHX1VBUlQpCiAKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAlsZHIJXHJwLCA9VUFSVF9CQVNFCQkJCUAgbm8sIHBoeXNpY2FsIGFkZHJlc3MKIAlsZHIJXHJ2LCA9SU9fQUREUkVTUyhVQVJUX0JBU0UpCQlAIHllcywgdmlydHVhbCBhZGRyZXNzCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAzYzRjZDMxLi43Mzg5ZGY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC03LDYgKzcsNCBAQAogICovCiAjZGVmaW5lIEFSQ0hfTlJfR1BJT1MJMzUwCiAKLSNpbmNsdWRlIDxwbGF0L2dwaW8uaD4KLQogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWY2OTdhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBTVC1Fcmljc3NvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLS8qCi0gKiBQaHlzaWNhbCBEUkFNIG9mZnNldC4KLSAqLwotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCi0jZGVmaW5lIEJVU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKaW5kZXggN2RkMDgwNy4uNmZiM2M0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtNTEsMTUgKzUxLDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2RlY29tcF9zZXR1cCh2b2lkKQogewogCS8qIENoZWNrIGluIHJ1biB0aW1lIGlmIHdlIHJ1biBvbiBhbiBVODUwMCBvciBVNTUwMCAqLwotCWlmIChtYWNoaW5lX2lzX3U4NTAwKCkgfHwKLQkgICAgbWFjaGluZV9pc19zdnA4NTAwdjEoKSB8fAotCSAgICBtYWNoaW5lX2lzX3N2cDg1MDB2MigpIHx8Ci0JICAgIG1hY2hpbmVfaXNfaHJlZnY2MCgpICAgfHwKLQkgICAgbWFjaGluZV9pc19zbm93YmFsbCgpKQotCQl1eDUwMF91YXJ0X2Jhc2UgPSBVODUwMF9VQVJUMl9CQVNFOwotCWVsc2UgaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQogCQl1eDUwMF91YXJ0X2Jhc2UgPSBVNTUwMF9VQVJUMF9CQVNFOwotCWVsc2UgLyogbm90IG11Y2ggY2FuIGJlIGRvbmUgdG8gaGVscCBoZXJlICovCisJZWxzZQogCQl1eDUwMF91YXJ0X2Jhc2UgPSBVODUwMF9VQVJUMl9CQVNFOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL3BpbnMtZGI4NTAwLmggYi9hcmNoL2FybS9tYWNoLXV4NTAwL3BpbnMtZGI4NTAwLmgKaW5kZXggZjkyMzc2NC4uOGIxZDFhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9waW5zLWRiODUwMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvcGlucy1kYjg1MDAuaApAQCAtMzUsNDAgKzM1LDQwIEBACiAKICNkZWZpbmUgR1BJTzRfR1BJTwkJUElOX0NGRyg0LCBHUElPKQogI2RlZmluZSBHUElPNF9VMV9SWEQJCVBJTl9DRkcoNCwgQUxUX0EpCi0jZGVmaW5lIEdQSU80X0kyQzRfU0NMCQlQSU5fQ0ZHX1BVTEwoNCwgQUxUX0IsIFVQKQorI2RlZmluZSBHUElPNF9JMkM0X1NDTAkJUElOX0NGR19JTlBVVCg0LCBBTFRfQiwgUFVMTFVQKQogI2RlZmluZSBHUElPNF9JUF9UUlNUbgkJUElOX0NGRyg0LCBBTFRfQykKIAogI2RlZmluZSBHUElPNV9HUElPCQlQSU5fQ0ZHKDUsIEdQSU8pCiAjZGVmaW5lIEdQSU81X1UxX1RYRAkJUElOX0NGRyg1LCBBTFRfQSkKLSNkZWZpbmUgR1BJTzVfSTJDNF9TREEJCVBJTl9DRkdfUFVMTCg1LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU81X0kyQzRfU0RBCQlQSU5fQ0ZHX0lOUFVUKDUsIEFMVF9CLCBQVUxMVVApCiAjZGVmaW5lIEdQSU81X0lQX0dQSU82CQlQSU5fQ0ZHKDUsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU82X0dQSU8JCVBJTl9DRkcoNiwgR1BJTykKICNkZWZpbmUgR1BJTzZfVTFfQ1RTbgkJUElOX0NGRyg2LCBBTFRfQSkKLSNkZWZpbmUgR1BJTzZfSTJDMV9TQ0wJCVBJTl9DRkdfUFVMTCg2LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU82X0kyQzFfU0NMCQlQSU5fQ0ZHX0lOUFVUKDYsIEFMVF9CLCBQVUxMVVApCiAjZGVmaW5lIEdQSU82X0lQX0dQSU8wCQlQSU5fQ0ZHKDYsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU83X0dQSU8JCVBJTl9DRkcoNywgR1BJTykKICNkZWZpbmUgR1BJTzdfVTFfUlRTbgkJUElOX0NGRyg3LCBBTFRfQSkKLSNkZWZpbmUgR1BJTzdfSTJDMV9TREEJCVBJTl9DRkdfUFVMTCg3LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU83X0kyQzFfU0RBCQlQSU5fQ0ZHX0lOUFVUKDcsIEFMVF9CLCBQVUxMVVApCiAjZGVmaW5lIEdQSU83X0lQX0dQSU8xCQlQSU5fQ0ZHKDcsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU84X0dQSU8JCVBJTl9DRkcoOCwgR1BJTykKLSNkZWZpbmUgR1BJTzhfSVBJMkNfU0RBCQlQSU5fQ0ZHX1BVTEwoOCwgQUxUX0EsIFVQKQotI2RlZmluZSBHUElPOF9JMkMyX1NEQQkJUElOX0NGR19QVUxMKDgsIEFMVF9CLCBVUCkKKyNkZWZpbmUgR1BJTzhfSVBJMkNfU0RBCQlQSU5fQ0ZHX0lOUFVUKDgsIEFMVF9BLCBQVUxMVVApCisjZGVmaW5lIEdQSU84X0kyQzJfU0RBCQlQSU5fQ0ZHX0lOUFVUKDgsIEFMVF9CLCBQVUxMVVApCiAKICNkZWZpbmUgR1BJTzlfR1BJTwkJUElOX0NGRyg5LCBHUElPKQotI2RlZmluZSBHUElPOV9JUEkyQ19TQ0wJCVBJTl9DRkdfUFVMTCg5LCBBTFRfQSwgVVApCi0jZGVmaW5lIEdQSU85X0kyQzJfU0NMCQlQSU5fQ0ZHX1BVTEwoOSwgQUxUX0IsIFVQKQorI2RlZmluZSBHUElPOV9JUEkyQ19TQ0wJCVBJTl9DRkdfSU5QVVQoOSwgQUxUX0EsIFBVTExVUCkKKyNkZWZpbmUgR1BJTzlfSTJDMl9TQ0wJCVBJTl9DRkdfSU5QVVQoOSwgQUxUX0IsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMTBfR1BJTwkJUElOX0NGRygxMCwgR1BJTykKLSNkZWZpbmUgR1BJTzEwX0lQSTJDX1NEQQlQSU5fQ0ZHX1BVTEwoMTAsIEFMVF9BLCBVUCkKLSNkZWZpbmUgR1BJTzEwX0kyQzJfU0RBCQlQSU5fQ0ZHX1BVTEwoMTAsIEFMVF9CLCBVUCkKKyNkZWZpbmUgR1BJTzEwX0lQSTJDX1NEQQlQSU5fQ0ZHX0lOUFVUKDEwLCBBTFRfQSwgUFVMTFVQKQorI2RlZmluZSBHUElPMTBfSTJDMl9TREEJCVBJTl9DRkdfSU5QVVQoMTAsIEFMVF9CLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMF9JUF9HUElPMwkJUElOX0NGRygxMCwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzExX0dQSU8JCVBJTl9DRkcoMTEsIEdQSU8pCi0jZGVmaW5lIEdQSU8xMV9JUEkyQ19TQ0wJUElOX0NGR19QVUxMKDExLCBBTFRfQSwgVVApCi0jZGVmaW5lIEdQSU8xMV9JMkMyX1NDTAkJUElOX0NGR19QVUxMKDExLCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU8xMV9JUEkyQ19TQ0wJUElOX0NGR19JTlBVVCgxMSwgQUxUX0EsIFBVTExVUCkKKyNkZWZpbmUgR1BJTzExX0kyQzJfU0NMCQlQSU5fQ0ZHX0lOUFVUKDExLCBBTFRfQiwgUFVMTFVQKQogI2RlZmluZSBHUElPMTFfSVBfR1BJTzIJCVBJTl9DRkcoMTEsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xMl9HUElPCQlQSU5fQ0ZHKDEyLCBHUElPKQpAQCAtODcsNjYgKzg3LDY2IEBACiAKICNkZWZpbmUgR1BJTzE2X0dQSU8JCVBJTl9DRkcoMTYsIEdQSU8pCiAjZGVmaW5lIEdQSU8xNl9NU1AwX1JGUwkJUElOX0NGRygxNiwgQUxUX0EpCi0jZGVmaW5lIEdQSU8xNl9JMkMxX1NDTAkJUElOX0NGR19QVUxMKDE2LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU8xNl9JMkMxX1NDTAkJUElOX0NGR19JTlBVVCgxNiwgQUxUX0IsIFBVTExVUCkKICNkZWZpbmUgR1BJTzE2X1NMSU0wX0RBVAlQSU5fQ0ZHKDE2LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTdfR1BJTwkJUElOX0NGRygxNywgR1BJTykKICNkZWZpbmUgR1BJTzE3X01TUDBfUkNLCQlQSU5fQ0ZHKDE3LCBBTFRfQSkKLSNkZWZpbmUgR1BJTzE3X0kyQzFfU0RBCQlQSU5fQ0ZHX1BVTEwoMTcsIEFMVF9CLCBVUCkKKyNkZWZpbmUgR1BJTzE3X0kyQzFfU0RBCQlQSU5fQ0ZHX0lOUFVUKDE3LCBBTFRfQiwgUFVMTFVQKQogI2RlZmluZSBHUElPMTdfU0xJTTBfQ0xLCVBJTl9DRkcoMTcsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xOF9HUElPCQlQSU5fQ0ZHKDE4LCBHUElPKQotI2RlZmluZSBHUElPMThfTUMwX0NNRERJUglQSU5fQ0ZHX1BVTEwoMTgsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE4X01DMF9DTURESVIJUElOX0NGR19JTlBVVCgxOCwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzE4X1UyX1JYRAkJUElOX0NGRygxOCwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xOF9NU19JRVAJCVBJTl9DRkcoMTgsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xOV9HUElPCQlQSU5fQ0ZHKDE5LCBHUElPKQotI2RlZmluZSBHUElPMTlfTUMwX0RBVDBESVIJUElOX0NGR19QVUxMKDE5LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xOV9NQzBfREFUMERJUglQSU5fQ0ZHX0lOUFVUKDE5LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTlfVTJfVFhECQlQSU5fQ0ZHKDE5LCBBTFRfQikKICNkZWZpbmUgR1BJTzE5X01TX0RBVDBESVIJUElOX0NGRygxOSwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzIwX0dQSU8JCVBJTl9DRkcoMjAsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMF9NQzBfREFUMkRJUglQSU5fQ0ZHX1BVTEwoMjAsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIwX01DMF9EQVQyRElSCVBJTl9DRkdfSU5QVVQoMjAsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8yMF9VQVJUTU9EX1RYRAlQSU5fQ0ZHKDIwLCBBTFRfQikKICNkZWZpbmUgR1BJTzIwX0lQX1RSSUdPVVQJUElOX0NGRygyMCwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzIxX0dQSU8JCVBJTl9DRkcoMjEsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMV9NQzBfREFUMzFESVIJUElOX0NGR19QVUxMKDIxLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8yMV9NQzBfREFUMzFESVIJUElOX0NGR19JTlBVVCgyMSwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzIxX01TUDBfU0NLCQlQSU5fQ0ZHKDIxLCBBTFRfQikKICNkZWZpbmUgR1BJTzIxX01TX0RBVDMxRElSCVBJTl9DRkcoMjEsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8yMl9HUElPCQlQSU5fQ0ZHKDIyLCBHUElPKQotI2RlZmluZSBHUElPMjJfTUMwX0ZCQ0xLCVBJTl9DRkdfUFVMTCgyMiwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjJfTUMwX0ZCQ0xLCVBJTl9DRkdfSU5QVVQoMjIsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8yMl9VQVJUTU9EX1JYRAlQSU5fQ0ZHKDIyLCBBTFRfQikKICNkZWZpbmUgR1BJTzIyX01TX0ZCQ0xLCQlQSU5fQ0ZHKDIyLCBBTFRfQykKIAogI2RlZmluZSBHUElPMjNfR1BJTwkJUElOX0NGRygyMywgR1BJTykKLSNkZWZpbmUgR1BJTzIzX01DMF9DTEsJCVBJTl9DRkdfUFVMTCgyMywgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjNfTUMwX0NMSwkJUElOX0NGR19JTlBVVCgyMywgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzIzX1NUTU1PRF9DTEsJUElOX0NGRygyMywgQUxUX0IpCiAjZGVmaW5lIEdQSU8yM19NU19DTEsJCVBJTl9DRkcoMjMsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8yNF9HUElPCQlQSU5fQ0ZHKDI0LCBHUElPKQotI2RlZmluZSBHUElPMjRfTUMwX0NNRAkJUElOX0NGR19QVUxMKDI0LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8yNF9NQzBfQ01ECQlQSU5fQ0ZHX0lOUFVUKDI0LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMjRfVUFSVE1PRF9SWEQJUElOX0NGRygyNCwgQUxUX0IpCiAjZGVmaW5lIEdQSU8yNF9NU19CUwkJUElOX0NGRygyNCwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzI1X0dQSU8JCVBJTl9DRkcoMjUsIEdQSU8pCi0jZGVmaW5lIEdQSU8yNV9NQzBfREFUMAkJUElOX0NGR19QVUxMKDI1LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8yNV9NQzBfREFUMAkJUElOX0NGR19JTlBVVCgyNSwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzI1X1NUTU1PRF9EQVQwCVBJTl9DRkcoMjUsIEFMVF9CKQogI2RlZmluZSBHUElPMjVfTVNfREFUMAkJUElOX0NGRygyNSwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzI2X0dQSU8JCVBJTl9DRkcoMjYsIEdQSU8pCi0jZGVmaW5lIEdQSU8yNl9NQzBfREFUMQkJUElOX0NGR19QVUxMKDI2LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8yNl9NQzBfREFUMQkJUElOX0NGR19JTlBVVCgyNiwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzI2X1NUTU1PRF9EQVQxCVBJTl9DRkcoMjYsIEFMVF9CKQogI2RlZmluZSBHUElPMjZfTVNfREFUMQkJUElOX0NGRygyNiwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzI3X0dQSU8JCVBJTl9DRkcoMjcsIEdQSU8pCi0jZGVmaW5lIEdQSU8yN19NQzBfREFUMgkJUElOX0NGR19QVUxMKDI3LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8yN19NQzBfREFUMgkJUElOX0NGR19JTlBVVCgyNywgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzI3X1NUTU1PRF9EQVQyCVBJTl9DRkcoMjcsIEFMVF9CKQogI2RlZmluZSBHUElPMjdfTVNfREFUMgkJUElOX0NGRygyNywgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzI4X0dQSU8JCVBJTl9DRkcoMjgsIEdQSU8pCi0jZGVmaW5lIEdQSU8yOF9NQzBfREFUMwkJUElOX0NGR19QVUxMKDI4LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8yOF9NQzBfREFUMwkJUElOX0NGR19JTlBVVCgyOCwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzI4X1NUTU1PRF9EQVQzCVBJTl9DRkcoMjgsIEFMVF9CKQogI2RlZmluZSBHUElPMjhfTVNfREFUMwkJUElOX0NGRygyOCwgQUxUX0MpCiAKQEAgLTM1Nyw0OCArMzU3LDQ4IEBACiAjZGVmaW5lIEdQSU85N19NQzVfREFUNwkJUElOX0NGRyg5NywgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzEyOF9HUElPCQlQSU5fQ0ZHKDEyOCwgR1BJTykKLSNkZWZpbmUgR1BJTzEyOF9NQzJfQ0xLCQlQSU5fQ0ZHX1BVTEwoMTI4LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMjhfTUMyX0NMSwkJUElOX0NGR19JTlBVVCgxMjgsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMjhfU01fQ0tPCQlQSU5fQ0ZHKDEyOCwgQUxUX0IpCiAKICNkZWZpbmUgR1BJTzEyOV9HUElPCQlQSU5fQ0ZHKDEyOSwgR1BJTykKLSNkZWZpbmUgR1BJTzEyOV9NQzJfQ01ECQlQSU5fQ0ZHX1BVTEwoMTI5LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMjlfTUMyX0NNRAkJUElOX0NGR19JTlBVVCgxMjksIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMjlfU01fV0FJVDBuCVBJTl9DRkcoMTI5LCBBTFRfQikKIAogI2RlZmluZSBHUElPMTMwX0dQSU8JCVBJTl9DRkcoMTMwLCBHUElPKQotI2RlZmluZSBHUElPMTMwX01DMl9GQkNMSwlQSU5fQ0ZHX1BVTEwoMTMwLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMzBfTUMyX0ZCQ0xLCVBJTl9DRkdfSU5QVVQoMTMwLCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTMwX1NNX0ZCQ0xLCVBJTl9DRkcoMTMwLCBBTFRfQikKICNkZWZpbmUgR1BJTzEzMF9NQzJfUlNUTglQSU5fQ0ZHKDEzMCwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzEzMV9HUElPCQlQSU5fQ0ZHKDEzMSwgR1BJTykKLSNkZWZpbmUgR1BJTzEzMV9NQzJfREFUMAlQSU5fQ0ZHX1BVTEwoMTMxLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMzFfTUMyX0RBVDAJUElOX0NGR19JTlBVVCgxMzEsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMzFfU01fQURROAkJUElOX0NGRygxMzEsIEFMVF9CKQogCiAjZGVmaW5lIEdQSU8xMzJfR1BJTwkJUElOX0NGRygxMzIsIEdQSU8pCi0jZGVmaW5lIEdQSU8xMzJfTUMyX0RBVDEJUElOX0NGR19QVUxMKDEzMiwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTMyX01DMl9EQVQxCVBJTl9DRkdfSU5QVVQoMTMyLCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTMyX1NNX0FEUTkJCVBJTl9DRkcoMTMyLCBBTFRfQikKIAogI2RlZmluZSBHUElPMTMzX0dQSU8JCVBJTl9DRkcoMTMzLCBHUElPKQotI2RlZmluZSBHUElPMTMzX01DMl9EQVQyCVBJTl9DRkdfUFVMTCgxMzMsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzEzM19NQzJfREFUMglQSU5fQ0ZHX0lOUFVUKDEzMywgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzEzM19TTV9BRFExMAlQSU5fQ0ZHKDEzMywgQUxUX0IpCiAKICNkZWZpbmUgR1BJTzEzNF9HUElPCQlQSU5fQ0ZHKDEzNCwgR1BJTykKLSNkZWZpbmUgR1BJTzEzNF9NQzJfREFUMwlQSU5fQ0ZHX1BVTEwoMTM0LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMzRfTUMyX0RBVDMJUElOX0NGR19JTlBVVCgxMzQsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMzRfU01fQURRMTEJUElOX0NGRygxMzQsIEFMVF9CKQogCiAjZGVmaW5lIEdQSU8xMzVfR1BJTwkJUElOX0NGRygxMzUsIEdQSU8pCi0jZGVmaW5lIEdQSU8xMzVfTUMyX0RBVDQJUElOX0NGR19QVUxMKDEzNSwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTM1X01DMl9EQVQ0CVBJTl9DRkdfSU5QVVQoMTM1LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTM1X1NNX0FEUTEyCVBJTl9DRkcoMTM1LCBBTFRfQikKIAogI2RlZmluZSBHUElPMTM2X0dQSU8JCVBJTl9DRkcoMTM2LCBHUElPKQotI2RlZmluZSBHUElPMTM2X01DMl9EQVQ1CVBJTl9DRkdfUFVMTCgxMzYsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzEzNl9NQzJfREFUNQlQSU5fQ0ZHX0lOUFVUKDEzNiwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzEzNl9TTV9BRFExMwlQSU5fQ0ZHKDEzNiwgQUxUX0IpCiAKICNkZWZpbmUgR1BJTzEzN19HUElPCQlQSU5fQ0ZHKDEzNywgR1BJTykKLSNkZWZpbmUgR1BJTzEzN19NQzJfREFUNglQSU5fQ0ZHX1BVTEwoMTM3LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMzdfTUMyX0RBVDYJUElOX0NGR19JTlBVVCgxMzcsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMzdfU01fQURRMTQJUElOX0NGRygxMzcsIEFMVF9CKQogCiAjZGVmaW5lIEdQSU8xMzhfR1BJTwkJUElOX0NGRygxMzgsIEdQSU8pCi0jZGVmaW5lIEdQSU8xMzhfTUMyX0RBVDcJUElOX0NGR19QVUxMKDEzOCwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTM4X01DMl9EQVQ3CVBJTl9DRkdfSU5QVVQoMTM4LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTM4X1NNX0FEUTE1CVBJTl9DRkcoMTM4LCBBTFRfQikKIAogI2RlZmluZSBHUElPMTM5X0dQSU8JCVBJTl9DRkcoMTM5LCBHUElPKQpAQCAtNDM0LDEwICs0MzQsMTAgQEAKICNkZWZpbmUgR1BJTzE0Nl9TU1AwX1RYRAlQSU5fQ0ZHKDE0NiwgQUxUX0EpCiAKICNkZWZpbmUgR1BJTzE0N19HUElPCQlQSU5fQ0ZHKDE0NywgR1BJTykKLSNkZWZpbmUgR1BJTzE0N19JMkMwX1NDTAlQSU5fQ0ZHX1BVTEwoMTQ3LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xNDdfSTJDMF9TQ0wJUElOX0NGR19JTlBVVCgxNDcsIEFMVF9BLCBQVUxMVVApCiAKICNkZWZpbmUgR1BJTzE0OF9HUElPCQlQSU5fQ0ZHKDE0OCwgR1BJTykKLSNkZWZpbmUgR1BJTzE0OF9JMkMwX1NEQQlQSU5fQ0ZHX1BVTEwoMTQ4LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xNDhfSTJDMF9TREEJUElOX0NGR19JTlBVVCgxNDgsIEFMVF9BLCBQVUxMVVApCiAKICNkZWZpbmUgR1BJTzE0OV9HUElPCQlQSU5fQ0ZHKDE0OSwgR1BJTykKICNkZWZpbmUgR1BJTzE0OV9JUF9HUElPMAlQSU5fQ0ZHKDE0OSwgQUxUX0EpCkBAIC00NTksODIgKzQ1OSw4MiBAQAogI2RlZmluZSBHUElPMTUyX0tQX085CQlQSU5fQ0ZHKDE1MiwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE1M19HUElPCQlQSU5fQ0ZHKDE1MywgR1BJTykKLSNkZWZpbmUgR1BJTzE1M19LUF9JNwkJUElOX0NGR19QVUxMKDE1MywgQUxUX0EsIERPV04pCisjZGVmaW5lIEdQSU8xNTNfS1BfSTcJCVBJTl9DRkdfSU5QVVQoMTUzLCBBTFRfQSwgUFVMTERPV04pCiAjZGVmaW5lIEdQSU8xNTNfTENEX0QyNAkJUElOX0NGRygxNTMsIEFMVF9CKQogI2RlZmluZSBHUElPMTUzX1UyX1JYRAkJUElOX0NGRygxNTMsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNTRfR1BJTwkJUElOX0NGRygxNTQsIEdQSU8pCi0jZGVmaW5lIEdQSU8xNTRfS1BfSTYJCVBJTl9DRkdfUFVMTCgxNTQsIEFMVF9BLCBET1dOKQorI2RlZmluZSBHUElPMTU0X0tQX0k2CQlQSU5fQ0ZHX0lOUFVUKDE1NCwgQUxUX0EsIFBVTExET1dOKQogI2RlZmluZSBHUElPMTU0X0xDRF9EMjUJCVBJTl9DRkcoMTU0LCBBTFRfQikKICNkZWZpbmUgR1BJTzE1NF9VMl9UWEQJCVBJTl9DRkcoMTU0LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTU1X0dQSU8JCVBJTl9DRkcoMTU1LCBHUElPKQotI2RlZmluZSBHUElPMTU1X0tQX0k1CQlQSU5fQ0ZHX1BVTEwoMTU1LCBBTFRfQSwgRE9XTikKKyNkZWZpbmUgR1BJTzE1NV9LUF9JNQkJUElOX0NGR19JTlBVVCgxNTUsIEFMVF9BLCBQVUxMRE9XTikKICNkZWZpbmUgR1BJTzE1NV9MQ0RfRDI2CQlQSU5fQ0ZHKDE1NSwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNTVfU1RNQVBFX0NMSwlQSU5fQ0ZHKDE1NSwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE1Nl9HUElPCQlQSU5fQ0ZHKDE1NiwgR1BJTykKLSNkZWZpbmUgR1BJTzE1Nl9LUF9JNAkJUElOX0NGR19QVUxMKDE1NiwgQUxUX0EsIERPV04pCisjZGVmaW5lIEdQSU8xNTZfS1BfSTQJCVBJTl9DRkdfSU5QVVQoMTU2LCBBTFRfQSwgUFVMTERPV04pCiAjZGVmaW5lIEdQSU8xNTZfTENEX0QyNwkJUElOX0NGRygxNTYsIEFMVF9CKQogI2RlZmluZSBHUElPMTU2X1NUTUFQRV9EQVQzCVBJTl9DRkcoMTU2LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTU3X0dQSU8JCVBJTl9DRkcoMTU3LCBHUElPKQotI2RlZmluZSBHUElPMTU3X0tQX083CQlQSU5fQ0ZHX1BVTEwoMTU3LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xNTdfS1BfTzcJCVBJTl9DRkdfSU5QVVQoMTU3LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTU3X0xDRF9EMjgJCVBJTl9DRkcoMTU3LCBBTFRfQikKICNkZWZpbmUgR1BJTzE1N19TVE1BUEVfREFUMglQSU5fQ0ZHKDE1NywgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE1OF9HUElPCQlQSU5fQ0ZHKDE1OCwgR1BJTykKLSNkZWZpbmUgR1BJTzE1OF9LUF9PNgkJUElOX0NGR19QVUxMKDE1OCwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTU4X0tQX082CQlQSU5fQ0ZHX0lOUFVUKDE1OCwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzE1OF9MQ0RfRDI5CQlQSU5fQ0ZHKDE1OCwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNThfU1RNQVBFX0RBVDEJUElOX0NGRygxNTgsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNTlfR1BJTwkJUElOX0NGRygxNTksIEdQSU8pCi0jZGVmaW5lIEdQSU8xNTlfS1BfTzUJCVBJTl9DRkdfUFVMTCgxNTksIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE1OV9LUF9PNQkJUElOX0NGR19JTlBVVCgxNTksIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xNTlfTENEX0QzMAkJUElOX0NGRygxNTksIEFMVF9CKQogI2RlZmluZSBHUElPMTU5X1NUTUFQRV9EQVQwCVBJTl9DRkcoMTU5LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTYwX0dQSU8JCVBJTl9DRkcoMTYwLCBHUElPKQotI2RlZmluZSBHUElPMTYwX0tQX080CQlQSU5fQ0ZHX1BVTEwoMTYwLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xNjBfS1BfTzQJCVBJTl9DRkdfSU5QVVQoMTYwLCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTYwX0xDRF9EMzEJCVBJTl9DRkcoMTYwLCBBTFRfQikKICNkZWZpbmUgR1BJTzE2MF9OT05FCQlQSU5fQ0ZHKDE2MCwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE2MV9HUElPCQlQSU5fQ0ZHKDE2MSwgR1BJTykKLSNkZWZpbmUgR1BJTzE2MV9LUF9JMwkJUElOX0NGR19QVUxMKDE2MSwgQUxUX0EsIERPV04pCisjZGVmaW5lIEdQSU8xNjFfS1BfSTMJCVBJTl9DRkdfSU5QVVQoMTYxLCBBTFRfQSwgUFVMTERPV04pCiAjZGVmaW5lIEdQSU8xNjFfTENEX0QzMgkJUElOX0NGRygxNjEsIEFMVF9CKQogI2RlZmluZSBHUElPMTYxX1VBUlRNT0RfUlhECVBJTl9DRkcoMTYxLCBBTFRfQykKIAogI2RlZmluZSBHUElPMTYyX0dQSU8JCVBJTl9DRkcoMTYyLCBHUElPKQotI2RlZmluZSBHUElPMTYyX0tQX0kyCQlQSU5fQ0ZHX1BVTEwoMTYyLCBBTFRfQSwgRE9XTikKKyNkZWZpbmUgR1BJTzE2Ml9LUF9JMgkJUElOX0NGR19JTlBVVCgxNjIsIEFMVF9BLCBQVUxMRE9XTikKICNkZWZpbmUgR1BJTzE2Ml9MQ0RfRDMzCQlQSU5fQ0ZHKDE2MiwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNjJfVUFSVE1PRF9UWEQJUElOX0NGRygxNjIsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNjNfR1BJTwkJUElOX0NGRygxNjMsIEdQSU8pCi0jZGVmaW5lIEdQSU8xNjNfS1BfSTEJCVBJTl9DRkdfUFVMTCgxNjMsIEFMVF9BLCBET1dOKQorI2RlZmluZSBHUElPMTYzX0tQX0kxCQlQSU5fQ0ZHX0lOUFVUKDE2MywgQUxUX0EsIFBVTExET1dOKQogI2RlZmluZSBHUElPMTYzX0xDRF9EMzQJCVBJTl9DRkcoMTYzLCBBTFRfQikKICNkZWZpbmUgR1BJTzE2M19TVE1NT0RfQ0xLCVBJTl9DRkcoMTYzLCBBTFRfQykKIAogI2RlZmluZSBHUElPMTY0X0dQSU8JCVBJTl9DRkcoMTY0LCBHUElPKQotI2RlZmluZSBHUElPMTY0X0tQX0kwCQlQSU5fQ0ZHX1BVTEwoMTY0LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xNjRfS1BfSTAJCVBJTl9DRkdfSU5QVVQoMTY0LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTY0X0xDRF9EMzUJCVBJTl9DRkcoMTY0LCBBTFRfQikKICNkZWZpbmUgR1BJTzE2NF9TVE1NT0RfREFUMwlQSU5fQ0ZHKDE2NCwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE2NV9HUElPCQlQSU5fQ0ZHKDE2NSwgR1BJTykKLSNkZWZpbmUgR1BJTzE2NV9LUF9PMwkJUElOX0NGR19QVUxMKDE2NSwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTY1X0tQX08zCQlQSU5fQ0ZHX0lOUFVUKDE2NSwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzE2NV9MQ0RfRDM2CQlQSU5fQ0ZHKDE2NSwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNjVfU1RNTU9EX0RBVDIJUElOX0NGRygxNjUsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNjZfR1BJTwkJUElOX0NGRygxNjYsIEdQSU8pCi0jZGVmaW5lIEdQSU8xNjZfS1BfTzIJCVBJTl9DRkdfUFVMTCgxNjYsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE2Nl9LUF9PMgkJUElOX0NGR19JTlBVVCgxNjYsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xNjZfTENEX0QzNwkJUElOX0NGRygxNjYsIEFMVF9CKQogI2RlZmluZSBHUElPMTY2X1NUTU1PRF9EQVQxCVBJTl9DRkcoMTY2LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTY3X0dQSU8JCVBJTl9DRkcoMTY3LCBHUElPKQotI2RlZmluZSBHUElPMTY3X0tQX08xCQlQSU5fQ0ZHX1BVTEwoMTY3LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xNjdfS1BfTzEJCVBJTl9DRkdfSU5QVVQoMTY3LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTY3X0xDRF9EMzgJCVBJTl9DRkcoMTY3LCBBTFRfQikKICNkZWZpbmUgR1BJTzE2N19TVE1NT0RfREFUMAlQSU5fQ0ZHKDE2NywgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE2OF9HUElPCQlQSU5fQ0ZHKDE2OCwgR1BJTykKLSNkZWZpbmUgR1BJTzE2OF9LUF9PMAkJUElOX0NGR19QVUxMKDE2OCwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTY4X0tQX08wCQlQSU5fQ0ZHX0lOUFVUKDE2OCwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzE2OF9MQ0RfRDM5CQlQSU5fQ0ZHKDE2OCwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNjhfTk9ORQkJUElOX0NGRygxNjgsIEFMVF9DKQogCkBAIC01NjksMzkgKzU2OSwzOSBAQAogI2RlZmluZSBHUElPMTk2X01TUDJfUlhECVBJTl9DRkcoMTk2LCBBTFRfQSkKIAogI2RlZmluZSBHUElPMTk3X0dQSU8JCVBJTl9DRkcoMTk3LCBHUElPKQotI2RlZmluZSBHUElPMTk3X01DNF9EQVQzCVBJTl9DRkdfUFVMTCgxOTcsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE5N19NQzRfREFUMwlQSU5fQ0ZHX0lOUFVUKDE5NywgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMTk4X0dQSU8JCVBJTl9DRkcoMTk4LCBHUElPKQotI2RlZmluZSBHUElPMTk4X01DNF9EQVQyCVBJTl9DRkdfUFVMTCgxOTgsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE5OF9NQzRfREFUMglQSU5fQ0ZHX0lOUFVUKDE5OCwgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMTk5X0dQSU8JCVBJTl9DRkcoMTk5LCBHUElPKQotI2RlZmluZSBHUElPMTk5X01DNF9EQVQxCVBJTl9DRkdfUFVMTCgxOTksIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE5OV9NQzRfREFUMQlQSU5fQ0ZHX0lOUFVUKDE5OSwgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjAwX0dQSU8JCVBJTl9DRkcoMjAwLCBHUElPKQotI2RlZmluZSBHUElPMjAwX01DNF9EQVQwCVBJTl9DRkdfUFVMTCgyMDAsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIwMF9NQzRfREFUMAlQSU5fQ0ZHX0lOUFVUKDIwMCwgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjAxX0dQSU8JCVBJTl9DRkcoMjAxLCBHUElPKQotI2RlZmluZSBHUElPMjAxX01DNF9DTUQJCVBJTl9DRkdfUFVMTCgyMDEsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIwMV9NQzRfQ01ECQlQSU5fQ0ZHX0lOUFVUKDIwMSwgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjAyX0dQSU8JCVBJTl9DRkcoMjAyLCBHUElPKQotI2RlZmluZSBHUElPMjAyX01DNF9GQkNMSwlQSU5fQ0ZHX1BVTEwoMjAyLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8yMDJfTUM0X0ZCQ0xLCVBJTl9DRkdfSU5QVVQoMjAyLCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMjAyX1BXTAkJUElOX0NGRygyMDIsIEFMVF9CKQogI2RlZmluZSBHUElPMjAyX01DNF9SU1ROCVBJTl9DRkcoMjAyLCBBTFRfQykKIAogI2RlZmluZSBHUElPMjAzX0dQSU8JCVBJTl9DRkcoMjAzLCBHUElPKQotI2RlZmluZSBHUElPMjAzX01DNF9DTEsJCVBJTl9DRkdfUFVMTCgyMDMsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIwM19NQzRfQ0xLCQlQSU5fQ0ZHX0lOUFVUKDIwMywgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjA0X0dQSU8JCVBJTl9DRkcoMjA0LCBHUElPKQotI2RlZmluZSBHUElPMjA0X01DNF9EQVQ3CVBJTl9DRkdfUFVMTCgyMDQsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIwNF9NQzRfREFUNwlQSU5fQ0ZHX0lOUFVUKDIwNCwgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjA1X0dQSU8JCVBJTl9DRkcoMjA1LCBHUElPKQotI2RlZmluZSBHUElPMjA1X01DNF9EQVQ2CVBJTl9DRkdfUFVMTCgyMDUsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIwNV9NQzRfREFUNglQSU5fQ0ZHX0lOUFVUKDIwNSwgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjA2X0dQSU8JCVBJTl9DRkcoMjA2LCBHUElPKQotI2RlZmluZSBHUElPMjA2X01DNF9EQVQ1CVBJTl9DRkdfUFVMTCgyMDYsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIwNl9NQzRfREFUNQlQSU5fQ0ZHX0lOUFVUKDIwNiwgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjA3X0dQSU8JCVBJTl9DRkcoMjA3LCBHUElPKQotI2RlZmluZSBHUElPMjA3X01DNF9EQVQ0CVBJTl9DRkdfUFVMTCgyMDcsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIwN19NQzRfREFUNAlQSU5fQ0ZHX0lOUFVUKDIwNywgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjA4X0dQSU8JCVBJTl9DRkcoMjA4LCBHUElPKQogI2RlZmluZSBHUElPMjA4X01DMV9DTEsJCVBJTl9DRkcoMjA4LCBBTFRfQSkKQEAgLTYzMiwyMSArNjMyLDI1IEBACiAjZGVmaW5lIEdQSU8yMTVfTUMxX0NNRERJUglQSU5fQ0ZHKDIxNSwgQUxUX0EpCiAjZGVmaW5lIEdQSU8yMTVfTUMzX0RBVDJESVIJUElOX0NGRygyMTUsIEFMVF9CKQogI2RlZmluZSBHUElPMjE1X0NMS09VVDEJCVBJTl9DRkcoMjE1LCBBTFRfQykKKyNkZWZpbmUgR1BJTzIxNV9TUEkyX1RYRAlQSU5fQ0ZHKDIxNSwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzIxNl9HUElPCQlQSU5fQ0ZHKDIxNiwgR1BJTykKICNkZWZpbmUgR1BJTzIxNl9NQzFfREFUMkRJUglQSU5fQ0ZHKDIxNiwgQUxUX0EpCiAjZGVmaW5lIEdQSU8yMTZfTUMzX0NNRERJUglQSU5fQ0ZHKDIxNiwgQUxUX0IpCi0jZGVmaW5lIEdQSU8yMTZfSTJDM19TREEJUElOX0NGR19QVUxMKDIxNiwgQUxUX0MsIFVQKQorI2RlZmluZSBHUElPMjE2X0kyQzNfU0RBCVBJTl9DRkdfSU5QVVQoMjE2LCBBTFRfQywgUFVMTFVQKQorI2RlZmluZSBHUElPMjE2X1NQSTJfRlJNCVBJTl9DRkcoMjE2LCBBTFRfQykKIAogI2RlZmluZSBHUElPMjE3X0dQSU8JCVBJTl9DRkcoMjE3LCBHUElPKQogI2RlZmluZSBHUElPMjE3X01DMV9EQVQwRElSCVBJTl9DRkcoMjE3LCBBTFRfQSkKICNkZWZpbmUgR1BJTzIxN19NQzNfREFUMzFESVIJUElOX0NGRygyMTcsIEFMVF9CKQogI2RlZmluZSBHUElPMjE3X0NMS09VVDIJCVBJTl9DRkcoMjE3LCBBTFRfQykKKyNkZWZpbmUgR1BJTzIxN19TUEkyX0NMSwlQSU5fQ0ZHKDIxNywgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzIxOF9HUElPCQlQSU5fQ0ZHKDIxOCwgR1BJTykKICNkZWZpbmUgR1BJTzIxOF9NQzFfREFUMzFESVIJUElOX0NGRygyMTgsIEFMVF9BKQogI2RlZmluZSBHUElPMjE4X01DM19EQVQwRElSCVBJTl9DRkcoMjE4LCBBTFRfQikKLSNkZWZpbmUgR1BJTzIxOF9JMkMzX1NDTAlQSU5fQ0ZHX1BVTEwoMjE4LCBBTFRfQywgVVApCisjZGVmaW5lIEdQSU8yMThfSTJDM19TQ0wJUElOX0NGR19JTlBVVCgyMTgsIEFMVF9DLCBQVUxMVVApCisjZGVmaW5lIEdQSU8yMThfU1BJMl9SWEQJUElOX0NGRygyMTgsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8yMTlfR1BJTwkJUElOX0NGRygyMTksIEdQSU8pCiAjZGVmaW5lIEdQSU8yMTlfSFNJUl9GTEEwCVBJTl9DRkcoMjE5LCBBTFRfQSkKQEAgLTY5NCwxMiArNjk4LDEyIEBACiAjZGVmaW5lIEdQSU8yMjlfR1BJTwkJUElOX0NGRygyMjksIEdQSU8pCiAjZGVmaW5lIEdQSU8yMjlfQ0xLT1VUMQkJUElOX0NGRygyMjksIEFMVF9BKQogI2RlZmluZSBHUElPMjI5X1BXTAkJUElOX0NGRygyMjksIEFMVF9CKQotI2RlZmluZSBHUElPMjI5X0kyQzNfU0RBCVBJTl9DRkdfUFVMTCgyMjksIEFMVF9DLCBVUCkKKyNkZWZpbmUgR1BJTzIyOV9JMkMzX1NEQQlQSU5fQ0ZHX0lOUFVUKDIyOSwgQUxUX0MsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjMwX0dQSU8JCVBJTl9DRkcoMjMwLCBHUElPKQogI2RlZmluZSBHUElPMjMwX0NMS09VVDIJCVBJTl9DRkcoMjMwLCBBTFRfQSkKICNkZWZpbmUgR1BJTzIzMF9QV0wJCVBJTl9DRkcoMjMwLCBBTFRfQikKLSNkZWZpbmUgR1BJTzIzMF9JMkMzX1NDTAlQSU5fQ0ZHX1BVTEwoMjMwLCBBTFRfQywgVVApCisjZGVmaW5lIEdQSU8yMzBfSTJDM19TQ0wJUElOX0NGR19JTlBVVCgyMzAsIEFMVF9DLCBQVUxMVVApCiAKICNkZWZpbmUgR1BJTzI1Nl9HUElPCQlQSU5fQ0ZHKDI1NiwgR1BJTykKICNkZWZpbmUgR1BJTzI1Nl9VU0JfTlhUCQlQSU5fQ0ZHKDI1NiwgQUxUX0EpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvcGxhdHNtcC5jCmluZGV4IGViNTE5OTEuLmExOWUzOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvcGxhdHNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvcGxhdHNtcC5jCkBAIC05Niw3ICs5Niw3IEBACiAJICogdGhlIGhvbGRpbmcgcGVuIC0gcmVsZWFzZSBpdCwgdGhlbiB3YWl0IGZvciBpdCB0byBmbGFnCiAJICogdGhhdCBpdCBoYXMgYmVlbiByZWxlYXNlZCBieSByZXNldHRpbmcgcGVuX3JlbGVhc2UuCiAJICovCi0Jd3JpdGVfcGVuX3JlbGVhc2UoY3B1KTsKKwl3cml0ZV9wZW5fcmVsZWFzZShjcHVfbG9naWNhbF9tYXAoY3B1KSk7CiAKIAlnaWNfcmFpc2Vfc29mdGlycShjcHVtYXNrX29mKGNwdSksIDEpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhNDY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvdGltZXIuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDExCisgKgorICogTGljZW5zZSBUZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIKKyAqIEF1dGhvcjogTWF0dGlhcyBXYWxsaW4gPG1hdHRpYXMud2FsbGluQHN0ZXJpY3Nzb24uY29tPiBmb3IgU1QtRXJpY3Nzb24KKyAqLworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGtzcmMtZGJ4NTAwLXByY211Lmg+CisKKyNpbmNsdWRlIDxhc20vbG9jYWx0aW1lci5oPgorCisjaW5jbHVkZSA8cGxhdC9tdHUuaD4KKworI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKK3N0YXRpYyB2b2lkIF9faW5pdCB1eDUwMF90aW1lcl9pbml0KHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpwcmNtdV90aW1lcl9iYXNlOworCisJaWYgKGNwdV9pc191NTUwMCgpKSB7CisjaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUworCQl0d2RfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9UV0RfQkFTRSk7CisjZW5kaWYKKwkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTU1MDBfTVRVMF9CQVNFKTsKKwkJcHJjbXVfdGltZXJfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9QUkNNVV9USU1FUl8zX0JBU0UpOworCX0gZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpIHsKKyNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCisJCXR3ZF9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX1RXRF9CQVNFKTsKKyNlbmRpZgorCQltdHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVODUwMF9NVFUwX0JBU0UpOworCQlwcmNtdV90aW1lcl9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX1BSQ01VX1RJTUVSXzRfQkFTRSk7CisJfSBlbHNlIHsKKwkJdXg1MDBfdW5rbm93bl9zb2MoKTsKKwl9CisKKwkvKgorCSAqIEhlcmUgd2UgcmVnaXN0ZXIgdGhlIHRpbWVyYmxvY2tzIGFjdGl2ZSBpbiB0aGUgc3lzdGVtLgorCSAqIExvY2FsdGltZXJzICh0d2QpIGlzIHN0YXJ0ZWQgd2hlbiBib3RoIGNwdSBpcyB1cCBhbmQgcnVubmluZy4KKwkgKiBNVFUgcmVnaXN0ZXIgYSBjbG9ja3NvdXJjZSwgY2xvY2tldmVudCBhbmQgc2NoZWRfY2xvY2suCisJICogU2luY2UgdGhlIE1UVSBpcyBsb2NhdGVkIGluIHRoZSBWQVBFIHBvd2VyIGRvbWFpbgorCSAqIGl0IHdpbGwgYmUgY2xlYXJlZCBpbiBzbGVlcCB3aGljaCBtYWtlcyBpdCB1bnN1aXRhYmxlLgorCSAqIFdlIGhvd2V2ZXIgbmVlZCBpdCBhcyBhIHRpbWVyIHRpY2sgKGNsb2NrZXZlbnQpCisJICogZHVyaW5nIGJvb3QgdG8gY2FsaWJyYXRlIGRlbGF5IHVudGlsIHR3ZCBpcyBzdGFydGVkLgorCSAqIFJUQy1SVFQgaGF2ZSBwcm9ibGVtcyBhcyB0aW1lciB0aWNrIGR1cmluZyBib290IHNpbmNlIGl0IGlzCisJICogZGVwZW5kaW5nIG9uIGRlbGF5IHdoaWNoIGlzIG5vdCB5ZXQgY2FsaWJyYXRlZC4gUlRDLVJUVCBpcyBpbiB0aGUKKwkgKiBhbHdheXMtb24gcG93ZXJkb21haW4gYW5kIGlzIHVzZWQgYXMgY2xvY2tldmVudCBpbnN0ZWFkIG9mIHR3ZCB3aGVuCisJICogc2xlZXBpbmcuCisJICogVGhlIFBSQ01VIHRpbWVyIDQoMyBmb3IgREI1NTAwKSByZWdpc3RlciBhIGNsb2Nrc291cmNlIGFuZAorCSAqIHNjaGVkX2Nsb2NrIHdpdGggaGlnaGVyIHJhdGluZyB0aGVuIE1UVSBzaW5jZSBpcyBhbHdheXMtb24uCisJICoKKwkgKi8KKworCW5tZGtfdGltZXJfaW5pdCgpOworCWNsa3NyY19kYng1MDBfcHJjbXVfaW5pdChwcmNtdV90aW1lcl9iYXNlKTsKK30KKworc3RhdGljIHZvaWQgdXg1MDBfdGltZXJfcmVzZXQodm9pZCkKK3sKKwlubWRrX2Nsa2V2dF9yZXNldCgpOworCW5tZGtfY2xrc3JjX3Jlc2V0KCk7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgdXg1MDBfdGltZXIgPSB7CisJLmluaXQJCT0gdXg1MDBfdGltZXJfaW5pdCwKKwkucmVzdW1lCQk9IHV4NTAwX3RpbWVyX3Jlc2V0LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZWIyY2Y3ZC4uZDBmYmQ3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTExLDcgKzExLDcgQEAKICAqCiAqLwogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbW92CVxycCwgICAgICAjMHgwMDFGMDAwMAogCQlvcnIJXHJwLCBccnAsICMweDAwMDAxMDAwCiAJCW9ycglccnYsIFxycCwgIzB4ZjEwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDk0ZmYyNzYuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSw2ICsxIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCisvKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWNjOWQ4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiAgYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMyBBUk0gTGltaXRlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfYWIuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCmluZGV4IGY4YWU2NGIuLmZkYTQ4NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCkBAIC0zNSw3ICszNSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVkVSU0FUSUxFX0FCLCAiQVJNLVZlcnNhdGlsZSBBQiIpCiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSB2ZXJzYXRpbGVfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gdmVyc2F0aWxlX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gdmVyc2F0aWxlX2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfcGIuYwppbmRleCAzN2MyM2RmLi5mZWFmOWNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfcGIuYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfcGIuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVkVSU0FUSUxFX1BCLCAiQVJNLVZlcnNhdGlsZSBQQiIpCiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSB2ZXJzYXRpbGVfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gdmVyc2F0aWxlX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gdmVyc2F0aWxlX2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9ob3RwbHVnLmMgYi9hcmNoL2FybS9tYWNoLXZleHByZXNzL2hvdHBsdWcuYwppbmRleCAzNjY4Y2Y5Li44MTNlZTA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL2hvdHBsdWcuYworKysgYi9hcmNoL2FybS9tYWNoLXZleHByZXNzL2hvdHBsdWcuYwpAQCAtNjUsNyArNjUsNyBAQAogCWZvciAoOzspIHsKIAkJd2ZpKCk7CiAKLQkJaWYgKHBlbl9yZWxlYXNlID09IGNwdSkgeworCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1X2xvZ2ljYWxfbWFwKGNwdSkpIHsKIAkJCS8qCiAJCQkgKiBPSywgcHJvcGVyIHdha2V1cCwgd2UncmUgZG9uZQogCQkJICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCAwNTBkNjVlLi5mZDllNmM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTEyLDcgKzEyLDcgQEAKIAogI2RlZmluZSBERUJVR19MTF9VQVJUX09GRlNFVAkweDAwMDA5MDAwCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LHJwLHJ2CisJCS5tYWNybwlhZGRydWFydCxycCxydix0bXAKIAkJbW92CVxycCwgI0RFQlVHX0xMX1VBUlRfT0ZGU0VUCiAJCW9ycglccnYsIFxycCwgIzB4ZjgwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKIAkJb3JyCVxycCwgXHJwLCAjMHgxMDAwMDAwMAlAIHBoeXNpY2FsIGJhc2UKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vZnRyYWNlLmggYi9hcmNoL2FybS9tYWNoLXZleHByZXNzL2luY2x1ZGUvbWFjaC9ncGlvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBhcmNoL3VtL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCmNvcHkgdG8gYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9pbmNsdWRlL21hY2gvZ3Bpby5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjdmY2Q0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqICBhcmNoL2FybS9tYWNoLXZleHByZXNzL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMgQVJNIExpbWl0ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHg2MDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL3YybS5jIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy92Mm0uYwppbmRleCBkMGQyNjdhLi4xZmFmYzMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL3YybS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvdjJtLmMKQEAgLTQ0Myw3ICs0NDMsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFZFWFBSRVNTLCAiQVJNLVZlcnNhdGlsZSBFeHByZXNzIikKLQkuYm9vdF9wYXJhbXMJPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHYybV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSB2Mm1faW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSB2Mm1faW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZ0ODUwMC9idjA3LmMgYi9hcmNoL2FybS9tYWNoLXZ0ODUwMC9idjA3LmMKaW5kZXggOTRhMjYxZC4uYTQ2NGM3NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12dDg1MDAvYnYwNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2J2MDcuYwpAQCAtNjgsNyArNjgsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEJWMDcsICJCZW5pZ24gQlYwNyBNaW5pIE5ldGJvb2siKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSB2dDg1MDBfcmVzZXJ2ZV9tZW0sCiAJLm1hcF9pbwkJPSB2dDg1MDBfbWFwX2lvLAogCS5pbml0X2lycQk9IHZ0ODUwMF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZjExOTE2Mi4uY2EyOTJmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12dDg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTExLDcgKzExLDcgQEAKICAqCiAqLwogCi0JLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJbW92CVxycCwgICAgICAjMHgwMDIwMDAwMAogCW9ycglccnYsIFxycCwgIzB4ZjgwMDAwMDAKIAlvcnIJXHJwLCBccnAsICMweGQ4MDAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA5NGZmMjc2Li40MGE4YzE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEsNiArMSBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEJX19ncGlvX3RvX2lycQorLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1ZjkxNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogIGFyY2gvYXJtL21hY2gtdnQ4NTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMgQVJNIExpbWl0ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLS8qCi0gKiBQaHlzaWNhbCBEUkFNIG9mZnNldC4KLSAqLwotI2RlZmluZSBQSFlTX09GRlNFVAlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL3dtODUwNV83aW4uYyBiL2FyY2gvYXJtL21hY2gtdnQ4NTAwL3dtODUwNV83aW4uYwppbmRleCBlNzNhYWRiLi5jZjkxMGE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZ0ODUwMC93bTg1MDVfN2luLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvd204NTA1Xzdpbi5jCkBAIC02OCw3ICs2OCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoV004NTA1XzdJTl9ORVRCT09LLCAiV004NTA1IDctaW5jaCBnZW5lcmljIG5ldGJvb2siKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSB3bTg1MDVfcmVzZXJ2ZV9tZW0sCiAJLm1hcF9pbwkJPSB3bTg1MDVfbWFwX2lvLAogCS5pbml0X2lycQk9IHdtODUwNV9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggMDM0ZGEzZS4uNTM4NWE0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTE1LDE2ICsxNSwxMiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCiAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCiB7CiAJcmV0dXJuIGdwaW87CiB9CisjZGVmaW5lIGdwaW9fdG9faXJxIGdwaW9fdG9faXJxCiAKIHN0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGlycSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDI5MDViLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbWFjaC1udWM5MTBldmIuYyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51YzkxMGV2Yi5jCmluZGV4IDMwZmNjZGUuLjMxYzEwOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51YzkxMGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51YzkxMGV2Yi5jCkBAIC0zNCw3ICszNCw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoVzkwUDkxMEVWQiwgIlc5MFA5MTBFVkIiKQogCS8qIE1haW50YWluZXI6IFdhbiBab25nU2h1biAqLwotCS5ib290X3BhcmFtcwk9IDAsCiAJLm1hcF9pbwkJPSBudWM5MTBldmJfbWFwX2lvLAogCS5pbml0X2lycQk9IG51YzkwMF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbnVjOTEwZXZiX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbWFjaC1udWM5NTBldmIuYyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk1MGV2Yi5jCmluZGV4IDU5MGM5OWIuLjQwNjJlNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk1MGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk1MGV2Yi5jCkBAIC0zNyw3ICszNyw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoVzkwUDk1MEVWQiwgIlc5MFA5NTBFVkIiKQogCS8qIE1haW50YWluZXI6IFdhbiBab25nU2h1biAqLwotCS5ib290X3BhcmFtcwk9IDAsCiAJLm1hcF9pbwkJPSBudWM5NTBldmJfbWFwX2lvLAogCS5pbml0X2lycQk9IG51YzkwMF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbnVjOTUwZXZiX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbWFjaC1udWM5NjBldmIuYyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk2MGV2Yi5jCmluZGV4IGUwOWM2NDUuLjBhYjk5OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk2MGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk2MGV2Yi5jCkBAIC0zNCw3ICszNCw2IEBACiAKIE1BQ0hJTkVfU1RBUlQoVzkwTjk2MEVWQiwgIlc5ME45NjBFVkIiKQogCS8qIE1haW50YWluZXI6IFdhbiBab25nU2h1biAqLwotCS5ib290X3BhcmFtcwk9IDAsCiAJLm1hcF9pbwkJPSBudWM5NjBldmJfbWFwX2lvLAogCS5pbml0X2lycQk9IG51YzkwMF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbnVjOTYwZXZiX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXp5bnEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXp5bnEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggOWY2NjRkNS4uM2FiMGJlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC16eW5xL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtenlucS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPG1hY2gvenlucV9zb2MuaD4KICNpbmNsdWRlIDxtYWNoL3VhcnQuaD4KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCWxkcglccnAsID1MTF9VQVJUX1BBRERSCUAgcGh5c2ljYWwKIAkJbGRyCVxydiwgPUxMX1VBUlRfVkFERFIJQCB2aXJ0dWFsCiAJCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXp5bnEvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC16eW5xL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhOTI2My4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXp5bnEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC16eW5xL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTEgWGlsaW54Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9NRU1PUllfSF9fCi0jZGVmaW5lIF9fTUFDSF9NRU1PUllfSF9fCi0KLSNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4MCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9LY29uZmlnIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwppbmRleCA4ODYzM2ZlLi42N2Y3NWEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21tL0tjb25maWcKQEAgLTgxOSwxMCArODE5LDEwIEBACiBjb25maWcgQ0FDSEVfTDJYMAogCWJvb2wgIkVuYWJsZSB0aGUgTDJ4MCBvdXRlciBjYWNoZSBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gUkVBTFZJRVdfRUJfQVJNMTFNUCB8fCBNQUNIX1JFQUxWSUVXX1BCMTFNUCB8fCBNQUNIX1JFQUxWSUVXX1BCMTE3NiB8fCBcCi0JCSAgIFJFQUxWSUVXX0VCX0E5TVAgfHwgU09DX0lNWDM1IHx8IFNPQ19JTVgzMSB8fCBNQUNIX1JFQUxWSUVXX1BCWCB8fCBcCisJCSAgIFJFQUxWSUVXX0VCX0E5TVAgfHwgQVJDSF9JTVhfVjZfVjcgfHwgTUFDSF9SRUFMVklFV19QQlggfHwgXAogCQkgICBBUkNIX05PTUFESUsgfHwgQVJDSF9PTUFQNCB8fCBBUkNIX0VYWU5PUzQgfHwgQVJDSF9URUdSQSB8fCBcCiAJCSAgIEFSQ0hfVTg1MDAgfHwgQVJDSF9WRVhQUkVTU19DQTlYNCB8fCBBUkNIX1NITU9CSUxFIHx8IFwKLQkJICAgQVJDSF9QUklNQTIgfHwgQVJDSF9aWU5RIHx8IEFSQ0hfQ05TM1hYWAorCQkgICBBUkNIX1BSSU1BMiB8fCBBUkNIX1pZTlEgfHwgQVJDSF9DTlMzWFhYIHx8IEFSQ0hfSElHSEJBTksKIAlkZWZhdWx0IHkKIAlzZWxlY3QgT1VURVJfQ0FDSEUKIAlzZWxlY3QgT1VURVJfQ0FDSEVfU1lOQwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKaW5kZXggMjM1ZWI3Ny4uZTRlN2Y2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCkBAIC0xOCwxMiArMTgsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAjaW5jbHVkZSA8YXNtL2hpZ2htZW0uaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAogI2luY2x1ZGUgIm1tLmgiCiAKQEAgLTExNywyNiArMTE5LDM2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfTU1VCi0vKiBTYW5pdHkgY2hlY2sgc2l6ZSAqLwotI2lmIChDT05TSVNURU5UX0RNQV9TSVpFICUgU1pfMk0pCi0jZXJyb3IgIkNPTlNJU1RFTlRfRE1BX1NJWkUgbXVzdCBiZSBtdWx0aXBsZSBvZiAyTWlCIgotI2VuZGlmCiAKLSNkZWZpbmUgQ09OU0lTVEVOVF9PRkZTRVQoeCkJKCgodW5zaWduZWQgbG9uZykoeCkgLSBDT05TSVNURU5UX0JBU0UpID4+IFBBR0VfU0hJRlQpCi0jZGVmaW5lIENPTlNJU1RFTlRfUFRFX0lOREVYKHgpICgoKHVuc2lnbmVkIGxvbmcpKHgpIC0gQ09OU0lTVEVOVF9CQVNFKSA+PiBQTURfU0hJRlQpCi0jZGVmaW5lIE5VTV9DT05TSVNURU5UX1BURVMgKENPTlNJU1RFTlRfRE1BX1NJWkUgPj4gUE1EX1NISUZUKQorI2RlZmluZSBDT05TSVNURU5UX09GRlNFVCh4KQkoKCh1bnNpZ25lZCBsb25nKSh4KSAtIGNvbnNpc3RlbnRfYmFzZSkgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgQ09OU0lTVEVOVF9QVEVfSU5ERVgoeCkgKCgodW5zaWduZWQgbG9uZykoeCkgLSBjb25zaXN0ZW50X2Jhc2UpID4+IFBNRF9TSElGVCkKIAogLyoKICAqIFRoZXNlIGFyZSB0aGUgcGFnZSB0YWJsZXMgKDJNQiBlYWNoKSBjb3ZlcmluZyB1bmNhY2hlZCwgRE1BIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnMKICAqLwotc3RhdGljIHB0ZV90ICpjb25zaXN0ZW50X3B0ZVtOVU1fQ09OU0lTVEVOVF9QVEVTXTsKK3N0YXRpYyBwdGVfdCAqKmNvbnNpc3RlbnRfcHRlOworCisjZGVmaW5lIERFRkFVTFRfQ09OU0lTVEVOVF9ETUFfU0laRSBTWl8yTQorCit1bnNpZ25lZCBsb25nIGNvbnNpc3RlbnRfYmFzZSA9IENPTlNJU1RFTlRfRU5EIC0gREVGQVVMVF9DT05TSVNURU5UX0RNQV9TSVpFOworCit2b2lkIF9faW5pdCBpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUodW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IENPTlNJU1RFTlRfRU5EIC0gQUxJR04oc2l6ZSwgU1pfMk0pOworCisJQlVHX09OKGNvbnNpc3RlbnRfcHRlKTsgLyogQ2hlY2sgd2UncmUgY2FsbGVkIGJlZm9yZSBETUEgcmVnaW9uIGluaXQgKi8KKwlCVUdfT04oYmFzZSA8IFZNQUxMT0NfRU5EKTsKKworCS8qIEdyb3cgcmVnaW9uIHRvIGFjY29tbW9kYXRlIHNwZWNpZmllZCBzaXplICAqLworCWlmIChiYXNlIDwgY29uc2lzdGVudF9iYXNlKQorCQljb25zaXN0ZW50X2Jhc2UgPSBiYXNlOworfQogCiAjaW5jbHVkZSAidm1yZWdpb24uaCIKIAogc3RhdGljIHN0cnVjdCBhcm1fdm1yZWdpb25faGVhZCBjb25zaXN0ZW50X2hlYWQgPSB7CiAJLnZtX2xvY2sJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRCgmY29uc2lzdGVudF9oZWFkLnZtX2xvY2spLAogCS52bV9saXN0CT0gTElTVF9IRUFEX0lOSVQoY29uc2lzdGVudF9oZWFkLnZtX2xpc3QpLAotCS52bV9zdGFydAk9IENPTlNJU1RFTlRfQkFTRSwKIAkudm1fZW5kCQk9IENPTlNJU1RFTlRfRU5ELAogfTsKIApAQCAtMTU1LDcgKzE2NywxNyBAQAogCXBtZF90ICpwbWQ7CiAJcHRlX3QgKnB0ZTsKIAlpbnQgaSA9IDA7Ci0JdTMyIGJhc2UgPSBDT05TSVNURU5UX0JBU0U7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gY29uc2lzdGVudF9iYXNlOworCXVuc2lnbmVkIGxvbmcgbnVtX3B0ZXMgPSAoQ09OU0lTVEVOVF9FTkQgLSBiYXNlKSA+PiBQR0RJUl9TSElGVDsKKworCWNvbnNpc3RlbnRfcHRlID0ga21hbGxvYyhudW1fcHRlcyAqIHNpemVvZihwdGVfdCksIEdGUF9LRVJORUwpOworCWlmICghY29uc2lzdGVudF9wdGUpIHsKKwkJcHJfZXJyKCIlczogbm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByX2RlYnVnKCJETUEgbWVtb3J5OiAweCUwOGx4IC0gMHglMDhseDpcbiIsIGJhc2UsIENPTlNJU1RFTlRfRU5EKTsKKwljb25zaXN0ZW50X2hlYWQudm1fc3RhcnQgPSBiYXNlOwogCiAJZG8gewogCQlwZ2QgPSBwZ2Rfb2Zmc2V0KCZpbml0X21tLCBiYXNlKTsKQEAgLTE5OCw3ICsyMjAsNyBAQAogCXNpemVfdCBhbGlnbjsKIAlpbnQgYml0OwogCi0JaWYgKCFjb25zaXN0ZW50X3B0ZVswXSkgeworCWlmICghY29uc2lzdGVudF9wdGUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogbm90IGluaXRpYWxpc2VkXG4iLCBfX2Z1bmNfXyk7CiAJCWR1bXBfc3RhY2soKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mYXVsdC1hcm12LmMgYi9hcmNoL2FybS9tbS9mYXVsdC1hcm12LmMKaW5kZXggN2NhYjc5MS4uNzU5OWUyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQtYXJtdi5jCisrKyBiL2FyY2gvYXJtL21tL2ZhdWx0LWFybXYuYwpAQCAtOCw3ICs4LDYgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCBmODAzN2JhLi5mYmRkMTJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KQEAgLTY2MCw5ICs2NjEsNiBAQAogCQkJIiAgICBJVENNICAgIDogMHglMDhseCAtIDB4JTA4bHggICAoJTRsZCBrQilcbiIKICNlbmRpZgogCQkJIiAgICBmaXhtYXAgIDogMHglMDhseCAtIDB4JTA4bHggICAoJTRsZCBrQilcbiIKLSNpZmRlZiBDT05GSUdfTU1VCi0JCQkiICAgIERNQSAgICAgOiAweCUwOGx4IC0gMHglMDhseCAgICglNGxkIE1CKVxuIgotI2VuZGlmCiAJCQkiICAgIHZtYWxsb2MgOiAweCUwOGx4IC0gMHglMDhseCAgICglNGxkIE1CKVxuIgogCQkJIiAgICBsb3dtZW0gIDogMHglMDhseCAtIDB4JTA4bHggICAoJTRsZCBNQilcbiIKICNpZmRlZiBDT05GSUdfSElHSE1FTQpAQCAtNjgxLDkgKzY3OSw2IEBACiAJCQlNTEsoSVRDTV9PRkZTRVQsICh1bnNpZ25lZCBsb25nKSBpdGNtX2VuZCksCiAjZW5kaWYKIAkJCU1MSyhGSVhBRERSX1NUQVJULCBGSVhBRERSX1RPUCksCi0jaWZkZWYgQ09ORklHX01NVQotCQkJTUxNKENPTlNJU1RFTlRfQkFTRSwgQ09OU0lTVEVOVF9FTkQpLAotI2VuZGlmCiAJCQlNTE0oVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQpLAogCQkJTUxNKFBBR0VfT0ZGU0VULCAodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSksCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KQEAgLTcwNiw5ICs3MDEsNiBAQAogCSAqIGJlIGRldGVjdGVkIGF0IGJ1aWxkIHRpbWUgYWxyZWFkeS4KIAkgKi8KICNpZmRlZiBDT05GSUdfTU1VCi0JQlVJTERfQlVHX09OKFZNQUxMT0NfRU5ECQkJPiBDT05TSVNURU5UX0JBU0UpOwotCUJVR19PTihWTUFMTE9DX0VORAkJCQk+IENPTlNJU1RFTlRfQkFTRSk7Ci0KIAlCVUlMRF9CVUdfT04oVEFTS19TSVpFCQkJCT4gTU9EVUxFU19WQUREUik7CiAJQlVHX09OKFRBU0tfU0laRSAJCQkJPiBNT0RVTEVTX1ZBRERSKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW11LmMgYi9hcmNoL2FybS9tbS9tbXUuYwppbmRleCAyMjZmMTgwLi5kYzhjNTUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbXUuYworKysgYi9hcmNoL2FybS9tbS9tbXUuYwpAQCAtMjczLDYgKzI3MywxNCBAQAogCQkucHJvdF9sMSAgID0gUE1EX1RZUEVfVEFCTEUsCiAJCS5kb21haW4gICAgPSBET01BSU5fS0VSTkVMLAogCX0sCisJW01UX01FTU9SWV9TT10gPSB7CisJCS5wcm90X3B0ZSAgPSBMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9ESVJUWSB8CisJCQkJTF9QVEVfTVRfVU5DQUNIRUQsCisJCS5wcm90X2wxICAgPSBQTURfVFlQRV9UQUJMRSwKKwkJLnByb3Rfc2VjdCA9IFBNRF9UWVBFX1NFQ1QgfCBQTURfU0VDVF9BUF9XUklURSB8IFBNRF9TRUNUX1MgfAorCQkJCVBNRF9TRUNUX1VOQ0FDSEVEIHwgUE1EX1NFQ1RfWE4sCisJCS5kb21haW4gICAgPSBET01BSU5fS0VSTkVMLAorCX0sCiB9OwogCiBjb25zdCBzdHJ1Y3QgbWVtX3R5cGUgKmdldF9tZW1fdHlwZSh1bnNpZ25lZCBpbnQgdHlwZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TCmluZGV4IDJlNjg0OWIuLjg4ZmIzZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUwpAQCAtMzc5LDMxICszNzksMjYgQEAKIAogLyogU3VzcGVuZC9yZXN1bWUgc3VwcG9ydDogdGFrZW4gZnJvbSBhcmNoL2FybS9wbGF0LXMzYzI0eHgvc2xlZXAuUyAqLwogLmdsb2JsCWNwdV9hcm05MjBfc3VzcGVuZF9zaXplCi0uZXF1CWNwdV9hcm05MjBfc3VzcGVuZF9zaXplLCA0ICogNAorLmVxdQljcHVfYXJtOTIwX3N1c3BlbmRfc2l6ZSwgNCAqIDMKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIEVOVFJZKGNwdV9hcm05MjBfZG9fc3VzcGVuZCkKLQlzdG1mZAlzcCEsIHtyNCAtIHI3LCBscn0KKwlzdG1mZAlzcCEsIHtyNCAtIHI2LCBscn0KIAltcmMJcDE1LCAwLCByNCwgYzEzLCBjMCwgMAlAIFBJRAogCW1yYwlwMTUsIDAsIHI1LCBjMywgYzAsIDAJQCBEb21haW4gSUQKLQltcmMJcDE1LCAwLCByNiwgYzIsIGMwLCAwCUAgVFRCIGFkZHJlc3MKLQltcmMJcDE1LCAwLCByNywgYzEsIGMwLCAwCUAgQ29udHJvbCByZWdpc3RlcgotCXN0bWlhCXIwLCB7cjQgLSByN30KLQlsZG1mZAlzcCEsIHtyNCAtIHI3LCBwY30KKwltcmMJcDE1LCAwLCByNiwgYzEsIGMwLCAwCUAgQ29udHJvbCByZWdpc3RlcgorCXN0bWlhCXIwLCB7cjQgLSByNn0KKwlsZG1mZAlzcCEsIHtyNCAtIHI2LCBwY30KIEVORFBST0MoY3B1X2FybTkyMF9kb19zdXNwZW5kKQogCiBFTlRSWShjcHVfYXJtOTIwX2RvX3Jlc3VtZSkKIAltb3YJaXAsICMwCiAJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAlAIGludmFsaWRhdGUgSStEIFRMQnMKIAltY3IJcDE1LCAwLCBpcCwgYzcsIGM3LCAwCUAgaW52YWxpZGF0ZSBJK0QgY2FjaGVzCi0JbGRtaWEJcjAsIHtyNCAtIHI3fQorCWxkbWlhCXIwLCB7cjQgLSByNn0KIAltY3IJcDE1LCAwLCByNCwgYzEzLCBjMCwgMAlAIFBJRAogCW1jcglwMTUsIDAsIHI1LCBjMywgYzAsIDAJQCBEb21haW4gSUQKLQltY3IJcDE1LCAwLCByNiwgYzIsIGMwLCAwCUAgVFRCIGFkZHJlc3MKLQltb3YJcjAsIHI3CQkJQCBjb250cm9sIHJlZ2lzdGVyCi0JbW92CXIyLCByNiwgbHNyICMxNAkJQCBnZXQgVFRCMCBiYXNlCi0JbW92CXIyLCByMiwgbHNsICMxNAotCWxkcglyMywgPVBNRF9UWVBFX1NFQ1QgfCBQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQkgICAgIFBNRF9TRUNUX0NBQ0hFQUJMRSB8IFBNRF9CSVQ0IHwgUE1EX1NFQ1RfQVBfV1JJVEUKKwltY3IJcDE1LCAwLCByMSwgYzIsIGMwLCAwCUAgVFRCIGFkZHJlc3MKKwltb3YJcjAsIHI2CQkJQCBjb250cm9sIHJlZ2lzdGVyCiAJYgljcHVfcmVzdW1lX21tdQogRU5EUFJPQyhjcHVfYXJtOTIwX2RvX3Jlc3VtZSkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMKaW5kZXggY2Q4Zjc5Yy4uOWY4ZmQ5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCkBAIC0zOTQsMzEgKzM5NCwyNiBAQAogCiAvKiBTdXNwZW5kL3Jlc3VtZSBzdXBwb3J0OiB0YWtlbiBmcm9tIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9zbGVlcC5TICovCiAuZ2xvYmwJY3B1X2FybTkyNl9zdXNwZW5kX3NpemUKLS5lcXUJY3B1X2FybTkyNl9zdXNwZW5kX3NpemUsIDQgKiA0CisuZXF1CWNwdV9hcm05MjZfc3VzcGVuZF9zaXplLCA0ICogMwogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogRU5UUlkoY3B1X2FybTkyNl9kb19zdXNwZW5kKQotCXN0bWZkCXNwISwge3I0IC0gcjcsIGxyfQorCXN0bWZkCXNwISwge3I0IC0gcjYsIGxyfQogCW1yYwlwMTUsIDAsIHI0LCBjMTMsIGMwLCAwCUAgUElECiAJbXJjCXAxNSwgMCwgcjUsIGMzLCBjMCwgMAlAIERvbWFpbiBJRAotCW1yYwlwMTUsIDAsIHI2LCBjMiwgYzAsIDAJQCBUVEIgYWRkcmVzcwotCW1yYwlwMTUsIDAsIHI3LCBjMSwgYzAsIDAJQCBDb250cm9sIHJlZ2lzdGVyCi0Jc3RtaWEJcjAsIHtyNCAtIHI3fQotCWxkbWZkCXNwISwge3I0IC0gcjcsIHBjfQorCW1yYwlwMTUsIDAsIHI2LCBjMSwgYzAsIDAJQCBDb250cm9sIHJlZ2lzdGVyCisJc3RtaWEJcjAsIHtyNCAtIHI2fQorCWxkbWZkCXNwISwge3I0IC0gcjYsIHBjfQogRU5EUFJPQyhjcHVfYXJtOTI2X2RvX3N1c3BlbmQpCiAKIEVOVFJZKGNwdV9hcm05MjZfZG9fcmVzdW1lKQogCW1vdglpcCwgIzAKIAltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCUAgaW52YWxpZGF0ZSBJK0QgVExCcwogCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJQCBpbnZhbGlkYXRlIEkrRCBjYWNoZXMKLQlsZG1pYQlyMCwge3I0IC0gcjd9CisJbGRtaWEJcjAsIHtyNCAtIHI2fQogCW1jcglwMTUsIDAsIHI0LCBjMTMsIGMwLCAwCUAgUElECiAJbWNyCXAxNSwgMCwgcjUsIGMzLCBjMCwgMAlAIERvbWFpbiBJRAotCW1jcglwMTUsIDAsIHI2LCBjMiwgYzAsIDAJQCBUVEIgYWRkcmVzcwotCW1vdglyMCwgcjcJCQlAIGNvbnRyb2wgcmVnaXN0ZXIKLQltb3YJcjIsIHI2LCBsc3IgIzE0CQlAIGdldCBUVEIwIGJhc2UKLQltb3YJcjIsIHIyLCBsc2wgIzE0Ci0JbGRyCXIzLCA9UE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCi0JCSAgICAgUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgUE1EX0JJVDQgfCBQTURfU0VDVF9BUF9XUklURQorCW1jcglwMTUsIDAsIHIxLCBjMiwgYzAsIDAJQCBUVEIgYWRkcmVzcworCW1vdglyMCwgcjYJCQlAIGNvbnRyb2wgcmVnaXN0ZXIKIAliCWNwdV9yZXN1bWVfbW11CiBFTkRQUk9DKGNwdV9hcm05MjZfZG9fcmVzdW1lKQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwppbmRleCA2OWU3ZjJlLi43ZDkxNTQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKQEAgLTE2OCwyMCArMTY4LDE5IEBACiAJbW92CXBjLCBscgogCiAuZ2xvYmwJY3B1X3NhMTEwMF9zdXNwZW5kX3NpemUKLS5lcXUJY3B1X3NhMTEwMF9zdXNwZW5kX3NpemUsIDQqNAorLmVxdQljcHVfc2ExMTAwX3N1c3BlbmRfc2l6ZSwgNCAqIDMKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIEVOVFJZKGNwdV9zYTExMDBfZG9fc3VzcGVuZCkKLQlzdG1mZAlzcCEsIHtyNCAtIHI3LCBscn0KKwlzdG1mZAlzcCEsIHtyNCAtIHI2LCBscn0KIAltcmMJcDE1LCAwLCByNCwgYzMsIGMwLCAwCQlAIGRvbWFpbiBJRAotCW1yYwlwMTUsIDAsIHI1LCBjMiwgYzAsIDAJCUAgdHJhbnNsYXRpb24gdGFibGUgYmFzZSBhZGRyCi0JbXJjCXAxNSwgMCwgcjYsIGMxMywgYzAsIDAJCUAgUElECi0JbXJjCXAxNSwgMCwgcjcsIGMxLCBjMCwgMAkJQCBjb250cm9sIHJlZwotCXN0bWlhCXIwLCB7cjQgLSByN30JCQlAIHN0b3JlIGNwIHJlZ3MKLQlsZG1mZAlzcCEsIHtyNCAtIHI3LCBwY30KKwltcmMJcDE1LCAwLCByNSwgYzEzLCBjMCwgMAkJQCBQSUQKKwltcmMJcDE1LCAwLCByNiwgYzEsIGMwLCAwCQlAIGNvbnRyb2wgcmVnCisJc3RtaWEJcjAsIHtyNCAtIHI2fQkJCUAgc3RvcmUgY3AgcmVncworCWxkbWZkCXNwISwge3I0IC0gcjYsIHBjfQogRU5EUFJPQyhjcHVfc2ExMTAwX2RvX3N1c3BlbmQpCiAKIEVOVFJZKGNwdV9zYTExMDBfZG9fcmVzdW1lKQotCWxkbWlhCXIwLCB7cjQgLSByN30JCQlAIGxvYWQgY3AgcmVncworCWxkbWlhCXIwLCB7cjQgLSByNn0JCQlAIGxvYWQgY3AgcmVncwogCW1vdglpcCwgIzAKIAltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCQlAIGZsdXNoIEkrRCBUTEJzCiAJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNywgMAkJQCBmbHVzaCBJJkQgY2FjaGUKQEAgLTE4OSwxMyArMTg4LDkgQEAKIAltY3IJcDE1LCAwLCBpcCwgYzksIGMwLCA1CQlAIGFsbG93IHVzZXIgc3BhY2UgdG8gdXNlIFJCCiAKIAltY3IJcDE1LCAwLCByNCwgYzMsIGMwLCAwCQlAIGRvbWFpbiBJRAotCW1jcglwMTUsIDAsIHI1LCBjMiwgYzAsIDAJCUAgdHJhbnNsYXRpb24gdGFibGUgYmFzZSBhZGRyCi0JbWNyCXAxNSwgMCwgcjYsIGMxMywgYzAsIDAJCUAgUElECi0JbW92CXIwLCByNwkJCQlAIGNvbnRyb2wgcmVnaXN0ZXIKLQltb3YJcjIsIHI1LCBsc3IgIzE0CQkJQCBnZXQgVFRCMCBiYXNlCi0JbW92CXIyLCByMiwgbHNsICMxNAotCWxkcglyMywgPVBNRF9UWVBFX1NFQ1QgfCBQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQkgICAgIFBNRF9TRUNUX0NBQ0hFQUJMRSB8IFBNRF9TRUNUX0FQX1dSSVRFCisJbWNyCXAxNSwgMCwgcjEsIGMyLCBjMCwgMAkJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKKwltY3IJcDE1LCAwLCByNSwgYzEzLCBjMCwgMAkJQCBQSUQKKwltb3YJcjAsIHI2CQkJCUAgY29udHJvbCByZWdpc3RlcgogCWIJY3B1X3Jlc3VtZV9tbXUKIEVORFBST0MoY3B1X3NhMTEwMF9kb19yZXN1bWUpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjYuUwppbmRleCBhOTIzYWEwLi5kMDYxZDJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCkBAIC0xMjgsMjAgKzEyOCwxOCBAQAogCiAvKiBTdXNwZW5kL3Jlc3VtZSBzdXBwb3J0OiB0YWtlbiBmcm9tIGFyY2gvYXJtL21hY2gtczNjNjR4eC9zbGVlcC5TICovCiAuZ2xvYmwJY3B1X3Y2X3N1c3BlbmRfc2l6ZQotLmVxdQljcHVfdjZfc3VzcGVuZF9zaXplLCA0ICogOAorLmVxdQljcHVfdjZfc3VzcGVuZF9zaXplLCA0ICogNgogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogRU5UUlkoY3B1X3Y2X2RvX3N1c3BlbmQpCi0Jc3RtZmQJc3AhLCB7cjQgLSByMTEsIGxyfQorCXN0bWZkCXNwISwge3I0IC0gcjksIGxyfQogCW1yYwlwMTUsIDAsIHI0LCBjMTMsIGMwLCAwCUAgRkNTRS9QSUQKLQltcmMJcDE1LCAwLCByNSwgYzEzLCBjMCwgMQlAIENvbnRleHQgSUQKLQltcmMJcDE1LCAwLCByNiwgYzMsIGMwLCAwCUAgRG9tYWluIElECi0JbXJjCXAxNSwgMCwgcjcsIGMyLCBjMCwgMAlAIFRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgMAotCW1yYwlwMTUsIDAsIHI4LCBjMiwgYzAsIDEJQCBUcmFuc2xhdGlvbiB0YWJsZSBiYXNlIDEKLQltcmMJcDE1LCAwLCByOSwgYzEsIGMwLCAxCUAgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIKLQltcmMJcDE1LCAwLCByMTAsIGMxLCBjMCwgMglAIGNvLXByb2Nlc3NvciBhY2Nlc3MgY29udHJvbAotCW1yYwlwMTUsIDAsIHIxMSwgYzEsIGMwLCAwCUAgY29udHJvbCByZWdpc3RlcgotCXN0bWlhCXIwLCB7cjQgLSByMTF9Ci0JbGRtZmQJc3AhLCB7cjQtIHIxMSwgcGN9CisJbXJjCXAxNSwgMCwgcjUsIGMzLCBjMCwgMAlAIERvbWFpbiBJRAorCW1yYwlwMTUsIDAsIHI2LCBjMiwgYzAsIDEJQCBUcmFuc2xhdGlvbiB0YWJsZSBiYXNlIDEKKwltcmMJcDE1LCAwLCByNywgYzEsIGMwLCAxCUAgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIKKwltcmMJcDE1LCAwLCByOCwgYzEsIGMwLCAyCUAgY28tcHJvY2Vzc29yIGFjY2VzcyBjb250cm9sCisJbXJjCXAxNSwgMCwgcjksIGMxLCBjMCwgMAlAIGNvbnRyb2wgcmVnaXN0ZXIKKwlzdG1pYQlyMCwge3I0IC0gcjl9CisJbGRtZmQJc3AhLCB7cjQtIHI5LCBwY30KIEVORFBST0MoY3B1X3Y2X2RvX3N1c3BlbmQpCiAKIEVOVFJZKGNwdV92Nl9kb19yZXN1bWUpCkBAIC0xNTAsMjUgKzE0OCwyMSBAQAogCW1jcglwMTUsIDAsIGlwLCBjNywgYzUsIDAJQCBpbnZhbGlkYXRlIEkgY2FjaGUKIAltY3IJcDE1LCAwLCBpcCwgYzcsIGMxNSwgMAlAIGNsZWFuK2ludmFsaWRhdGUgY2FjaGUKIAltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAlAIGRyYWluIHdyaXRlIGJ1ZmZlcgotCWxkbWlhCXIwLCB7cjQgLSByMTF9CisJbWNyCXAxNSwgMCwgaXAsIGMxMywgYzAsIDEJQCBzZXQgcmVzZXJ2ZWQgY29udGV4dCBJRAorCWxkbWlhCXIwLCB7cjQgLSByOX0KIAltY3IJcDE1LCAwLCByNCwgYzEzLCBjMCwgMAlAIEZDU0UvUElECi0JbWNyCXAxNSwgMCwgcjUsIGMxMywgYzAsIDEJQCBDb250ZXh0IElECi0JbWNyCXAxNSwgMCwgcjYsIGMzLCBjMCwgMAlAIERvbWFpbiBJRAotCW1jcglwMTUsIDAsIHI3LCBjMiwgYzAsIDAJQCBUcmFuc2xhdGlvbiB0YWJsZSBiYXNlIDAKLQltY3IJcDE1LCAwLCByOCwgYzIsIGMwLCAxCUAgVHJhbnNsYXRpb24gdGFibGUgYmFzZSAxCi0JbWNyCXAxNSwgMCwgcjksIGMxLCBjMCwgMQlAIGF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyCi0JbWNyCXAxNSwgMCwgcjEwLCBjMSwgYzAsIDIJQCBjby1wcm9jZXNzb3IgYWNjZXNzIGNvbnRyb2wKKwltY3IJcDE1LCAwLCByNSwgYzMsIGMwLCAwCUAgRG9tYWluIElECisJQUxUX1NNUChvcnIJcjEsIHIxLCAjVFRCX0ZMQUdTX1NNUCkKKwlBTFRfVVAob3JyCXIxLCByMSwgI1RUQl9GTEFHU19VUCkKKwltY3IJcDE1LCAwLCByMSwgYzIsIGMwLCAwCUAgVHJhbnNsYXRpb24gdGFibGUgYmFzZSAwCisJbWNyCXAxNSwgMCwgcjYsIGMyLCBjMCwgMQlAIFRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgMQorCW1jcglwMTUsIDAsIHI3LCBjMSwgYzAsIDEJQCBhdXhpbGlhcnkgY29udHJvbCByZWdpc3RlcgorCW1jcglwMTUsIDAsIHI4LCBjMSwgYzAsIDIJQCBjby1wcm9jZXNzb3IgYWNjZXNzIGNvbnRyb2wKIAltY3IJcDE1LCAwLCBpcCwgYzIsIGMwLCAyCUAgVFRCIGNvbnRyb2wgcmVnaXN0ZXIKIAltY3IJcDE1LCAwLCBpcCwgYzcsIGM1LCA0CUAgSVNCCi0JbW92CXIwLCByMTEJCQlAIGNvbnRyb2wgcmVnaXN0ZXIKLQltb3YJcjIsIHI3LCBsc3IgIzE0CQlAIGdldCBUVEIwIGJhc2UKLQltb3YJcjIsIHIyLCBsc2wgIzE0Ci0JbGRyCXIzLCBjcHVfcmVzdW1lX2wxX2ZsYWdzCisJbW92CXIwLCByOQkJCUAgY29udHJvbCByZWdpc3RlcgogCWIJY3B1X3Jlc3VtZV9tbXUKIEVORFBST0MoY3B1X3Y2X2RvX3Jlc3VtZSkKLWNwdV9yZXN1bWVfbDFfZmxhZ3M6Ci0JQUxUX1NNUCgubG9uZyBQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfRkxBR1NfU01QKQotCUFMVF9VUCgubG9uZyAgUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0FQX1dSSVRFIHwgUE1EX0ZMQUdTX1VQKQogI2VuZGlmCiAKIAlzdHJpbmcJY3B1X3Y2X25hbWUsICJBUk12Ni1jb21wYXRpYmxlIHByb2Nlc3NvciIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwppbmRleCA5NTkxYzhlLi4yYzU1OWFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCkBAIC0yMTcsNTYgKzIxNyw1MCBAQAogCiAvKiBTdXNwZW5kL3Jlc3VtZSBzdXBwb3J0OiBkZXJpdmVkIGZyb20gYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3NsZWVwLlMgKi8KIC5nbG9ibAljcHVfdjdfc3VzcGVuZF9zaXplCi0uZXF1CWNwdV92N19zdXNwZW5kX3NpemUsIDQgKiA5CisuZXF1CWNwdV92N19zdXNwZW5kX3NpemUsIDQgKiA3CiAjaWZkZWYgQ09ORklHX0FSTV9DUFVfU1VTUEVORAogRU5UUlkoY3B1X3Y3X2RvX3N1c3BlbmQpCi0Jc3RtZmQJc3AhLCB7cjQgLSByMTEsIGxyfQorCXN0bWZkCXNwISwge3I0IC0gcjEwLCBscn0KIAltcmMJcDE1LCAwLCByNCwgYzEzLCBjMCwgMAlAIEZDU0UvUElECi0JbXJjCXAxNSwgMCwgcjUsIGMxMywgYzAsIDEJQCBDb250ZXh0IElECi0JbXJjCXAxNSwgMCwgcjYsIGMxMywgYzAsIDMJQCBVc2VyIHIvbyB0aHJlYWQgSUQKLQlzdG1pYQlyMCEsIHtyNCAtIHI2fQorCW1yYwlwMTUsIDAsIHI1LCBjMTMsIGMwLCAzCUAgVXNlciByL28gdGhyZWFkIElECisJc3RtaWEJcjAhLCB7cjQgLSByNX0KIAltcmMJcDE1LCAwLCByNiwgYzMsIGMwLCAwCUAgRG9tYWluIElECi0JbXJjCXAxNSwgMCwgcjcsIGMyLCBjMCwgMAlAIFRUQiAwCi0JbXJjCXAxNSwgMCwgcjgsIGMyLCBjMCwgMQlAIFRUQiAxCi0JbXJjCXAxNSwgMCwgcjksIGMxLCBjMCwgMAlAIENvbnRyb2wgcmVnaXN0ZXIKLQltcmMJcDE1LCAwLCByMTAsIGMxLCBjMCwgMQlAIEF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyCi0JbXJjCXAxNSwgMCwgcjExLCBjMSwgYzAsIDIJQCBDby1wcm9jZXNzb3IgYWNjZXNzIGNvbnRyb2wKLQlzdG1pYQlyMCwge3I2IC0gcjExfQotCWxkbWZkCXNwISwge3I0IC0gcjExLCBwY30KKwltcmMJcDE1LCAwLCByNywgYzIsIGMwLCAxCUAgVFRCIDEKKwltcmMJcDE1LCAwLCByOCwgYzEsIGMwLCAwCUAgQ29udHJvbCByZWdpc3RlcgorCW1yYwlwMTUsIDAsIHI5LCBjMSwgYzAsIDEJQCBBdXhpbGlhcnkgY29udHJvbCByZWdpc3RlcgorCW1yYwlwMTUsIDAsIHIxMCwgYzEsIGMwLCAyCUAgQ28tcHJvY2Vzc29yIGFjY2VzcyBjb250cm9sCisJc3RtaWEJcjAsIHtyNiAtIHIxMH0KKwlsZG1mZAlzcCEsIHtyNCAtIHIxMCwgcGN9CiBFTkRQUk9DKGNwdV92N19kb19zdXNwZW5kKQogCiBFTlRSWShjcHVfdjdfZG9fcmVzdW1lKQogCW1vdglpcCwgIzAKIAltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCUAgaW52YWxpZGF0ZSBUTEJzCiAJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAlAIGludmFsaWRhdGUgSSBjYWNoZQotCWxkbWlhCXIwISwge3I0IC0gcjZ9CisJbWNyCXAxNSwgMCwgaXAsIGMxMywgYzAsIDEJQCBzZXQgcmVzZXJ2ZWQgY29udGV4dCBJRAorCWxkbWlhCXIwISwge3I0IC0gcjV9CiAJbWNyCXAxNSwgMCwgcjQsIGMxMywgYzAsIDAJQCBGQ1NFL1BJRAotCW1jcglwMTUsIDAsIHI1LCBjMTMsIGMwLCAxCUAgQ29udGV4dCBJRAotCW1jcglwMTUsIDAsIHI2LCBjMTMsIGMwLCAzCUAgVXNlciByL28gdGhyZWFkIElECi0JbGRtaWEJcjAsIHtyNiAtIHIxMX0KKwltY3IJcDE1LCAwLCByNSwgYzEzLCBjMCwgMwlAIFVzZXIgci9vIHRocmVhZCBJRAorCWxkbWlhCXIwLCB7cjYgLSByMTB9CiAJbWNyCXAxNSwgMCwgcjYsIGMzLCBjMCwgMAlAIERvbWFpbiBJRAotCW1jcglwMTUsIDAsIHI3LCBjMiwgYzAsIDAJQCBUVEIgMAotCW1jcglwMTUsIDAsIHI4LCBjMiwgYzAsIDEJQCBUVEIgMQorCUFMVF9TTVAob3JyCXIxLCByMSwgI1RUQl9GTEFHU19TTVApCisJQUxUX1VQKG9ycglyMSwgcjEsICNUVEJfRkxBR1NfVVApCisJbWNyCXAxNSwgMCwgcjEsIGMyLCBjMCwgMAlAIFRUQiAwCisJbWNyCXAxNSwgMCwgcjcsIGMyLCBjMCwgMQlAIFRUQiAxCiAJbWNyCXAxNSwgMCwgaXAsIGMyLCBjMCwgMglAIFRUQiBjb250cm9sIHJlZ2lzdGVyCiAJbXJjCXAxNSwgMCwgcjQsIGMxLCBjMCwgMQlAIFJlYWQgQXV4aWxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIKLQl0ZXEJcjQsIHIxMAkJCUAgSXMgaXQgYWxyZWFkeSBzZXQ/Ci0JbWNybmUJcDE1LCAwLCByMTAsIGMxLCBjMCwgMQlAIE5vLCBzbyB3cml0ZSBpdAotCW1jcglwMTUsIDAsIHIxMSwgYzEsIGMwLCAyCUAgQ28tcHJvY2Vzc29yIGFjY2VzcyBjb250cm9sCisJdGVxCXI0LCByOQkJCUAgSXMgaXQgYWxyZWFkeSBzZXQ/CisJbWNybmUJcDE1LCAwLCByOSwgYzEsIGMwLCAxCUAgTm8sIHNvIHdyaXRlIGl0CisJbWNyCXAxNSwgMCwgcjEwLCBjMSwgYzAsIDIJQCBDby1wcm9jZXNzb3IgYWNjZXNzIGNvbnRyb2wKIAlsZHIJcjQsID1QUlJSCQlAIFBSUlIKIAlsZHIJcjUsID1OTVJSCQlAIE5NUlIKIAltY3IJcDE1LCAwLCByNCwgYzEwLCBjMiwgMAlAIHdyaXRlIFBSUlIKIAltY3IJcDE1LCAwLCByNSwgYzEwLCBjMiwgMQlAIHdyaXRlIE5NUlIKIAlpc2IKIAlkc2IKLQltb3YJcjAsIHI5CQkJQCBjb250cm9sIHJlZ2lzdGVyCi0JbW92CXIyLCByNywgbHNyICMxNAkJQCBnZXQgVFRCMCBiYXNlCi0JbW92CXIyLCByMiwgbHNsICMxNAotCWxkcglyMywgY3B1X3Jlc3VtZV9sMV9mbGFncworCW1vdglyMCwgcjgJCQlAIGNvbnRyb2wgcmVnaXN0ZXIKIAliCWNwdV9yZXN1bWVfbW11CiBFTkRQUk9DKGNwdV92N19kb19yZXN1bWUpCi1jcHVfcmVzdW1lX2wxX2ZsYWdzOgotCUFMVF9TTVAoLmxvbmcgUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0FQX1dSSVRFIHwgUE1EX0ZMQUdTX1NNUCkKLQlBTFRfVVAoLmxvbmcgIFBNRF9UWVBFX1NFQ1QgfCBQTURfU0VDVF9BUF9XUklURSB8IFBNRF9GTEFHU19VUCkKICNlbmRpZgogCiAJX19DUFVJTklUCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUyBiL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCmluZGV4IDc1NWUxYmYuLmFiZjA1MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCkBAIC00MDYsMjQgKzQwNiwyMyBAQAogCS5hbGlnbgogCiAuZ2xvYmwJY3B1X3hzYzNfc3VzcGVuZF9zaXplCi0uZXF1CWNwdV94c2MzX3N1c3BlbmRfc2l6ZSwgNCAqIDcKKy5lcXUJY3B1X3hzYzNfc3VzcGVuZF9zaXplLCA0ICogNgogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogRU5UUlkoY3B1X3hzYzNfZG9fc3VzcGVuZCkKLQlzdG1mZAlzcCEsIHtyNCAtIHIxMCwgbHJ9CisJc3RtZmQJc3AhLCB7cjQgLSByOSwgbHJ9CiAJbXJjCXAxNCwgMCwgcjQsIGM2LCBjMCwgMAlAIGNsb2NrIGNvbmZpZ3VyYXRpb24sIGZvciB0dXJibyBtb2RlCiAJbXJjCXAxNSwgMCwgcjUsIGMxNSwgYzEsIDAJQCBDUCBhY2Nlc3MgcmVnCiAJbXJjCXAxNSwgMCwgcjYsIGMxMywgYzAsIDAJQCBQSUQKIAltcmMgCXAxNSwgMCwgcjcsIGMzLCBjMCwgMAlAIGRvbWFpbiBJRAotCW1yYyAJcDE1LCAwLCByOCwgYzIsIGMwLCAwCUAgdHJhbnNsYXRpb24gdGFibGUgYmFzZSBhZGRyCi0JbXJjCXAxNSwgMCwgcjksIGMxLCBjMCwgMQlAIGF1eGlsaWFyeSBjb250cm9sIHJlZwotCW1yYyAJcDE1LCAwLCByMTAsIGMxLCBjMCwgMAlAIGNvbnRyb2wgcmVnCisJbXJjCXAxNSwgMCwgcjgsIGMxLCBjMCwgMQlAIGF1eGlsaWFyeSBjb250cm9sIHJlZworCW1yYyAJcDE1LCAwLCByOSwgYzEsIGMwLCAwCUAgY29udHJvbCByZWcKIAliaWMJcjQsIHI0LCAjMgkJQCBjbGVhciBmcmVxdWVuY3kgY2hhbmdlIGJpdAotCXN0bWlhCXIwLCB7cjQgLSByMTB9CQlAIHN0b3JlIGNwIHJlZ3MKLQlsZG1pYQlzcCEsIHtyNCAtIHIxMCwgcGN9CisJc3RtaWEJcjAsIHtyNCAtIHI5fQkJQCBzdG9yZSBjcCByZWdzCisJbGRtaWEJc3AhLCB7cjQgLSByOSwgcGN9CiBFTkRQUk9DKGNwdV94c2MzX2RvX3N1c3BlbmQpCiAKIEVOVFJZKGNwdV94c2MzX2RvX3Jlc3VtZSkKLQlsZG1pYQlyMCwge3I0IC0gcjEwfQkJQCBsb2FkIGNwIHJlZ3MKKwlsZG1pYQlyMCwge3I0IC0gcjl9CQlAIGxvYWQgY3AgcmVncwogCW1vdglpcCwgIzAKIAltY3IJcDE1LCAwLCBpcCwgYzcsIGM3LCAwCUAgaW52YWxpZGF0ZSBJICYgRCBjYWNoZXMsIEJUQgogCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CUAgZHJhaW4gd3JpdGUgKCZmaWxsKSBidWZmZXIKQEAgLTQzMywxNSArNDMyLDEwIEBACiAJbWNyCXAxNSwgMCwgcjUsIGMxNSwgYzEsIDAJQCBDUCBhY2Nlc3MgcmVnCiAJbWNyCXAxNSwgMCwgcjYsIGMxMywgYzAsIDAJQCBQSUQKIAltY3IJcDE1LCAwLCByNywgYzMsIGMwLCAwCUAgZG9tYWluIElECi0JbWNyCXAxNSwgMCwgcjgsIGMyLCBjMCwgMAlAIHRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgYWRkcgotCW1jcglwMTUsIDAsIHI5LCBjMSwgYzAsIDEJQCBhdXhpbGlhcnkgY29udHJvbCByZWcKLQotCUAgdGVtcG9yYXJpbHkgbWFwIHJlc3VtZV90dXJuX29uX21tdSBpbnRvIHRoZSBwYWdlIHRhYmxlLAotCUAgb3RoZXJ3aXNlIHByZWZldGNoIGFib3J0IG9jY3VycyBhZnRlciBNTVUgaXMgdHVybmVkIG9uCi0JbW92CXIwLCByMTAJCQlAIGNvbnRyb2wgcmVnaXN0ZXIKLQltb3YJcjIsIHI4LCBsc3IgIzE0CQlAIGdldCBUVEIwIGJhc2UKLQltb3YJcjIsIHIyLCBsc2wgIzE0Ci0JbGRyCXIzLCA9MHg1NDJlCQlAIHNlY3Rpb24gZmxhZ3MKKwlvcnIJcjEsIHIxLCAjMHgxOAkJQCBjYWNoZSB0aGUgcGFnZSB0YWJsZSBpbiBMMgorCW1jcglwMTUsIDAsIHIxLCBjMiwgYzAsIDAJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKKwltY3IJcDE1LCAwLCByOCwgYzEsIGMwLCAxCUAgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnCisJbW92CXIwLCByOQkJCUAgY29udHJvbCByZWdpc3RlcgogCWIJY3B1X3Jlc3VtZV9tbXUKIEVORFBST0MoY3B1X3hzYzNfZG9fcmVzdW1lKQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TIGIvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUwppbmRleCBmYmMwNmU1Li4zMjc3OTA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKQEAgLTUyMCwyNCArNTIwLDIzIEBACiAJLmFsaWduCiAKIC5nbG9ibAljcHVfeHNjYWxlX3N1c3BlbmRfc2l6ZQotLmVxdQljcHVfeHNjYWxlX3N1c3BlbmRfc2l6ZSwgNCAqIDcKKy5lcXUJY3B1X3hzY2FsZV9zdXNwZW5kX3NpemUsIDQgKiA2CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBFTlRSWShjcHVfeHNjYWxlX2RvX3N1c3BlbmQpCi0Jc3RtZmQJc3AhLCB7cjQgLSByMTAsIGxyfQorCXN0bWZkCXNwISwge3I0IC0gcjksIGxyfQogCW1yYwlwMTQsIDAsIHI0LCBjNiwgYzAsIDAJQCBjbG9jayBjb25maWd1cmF0aW9uLCBmb3IgdHVyYm8gbW9kZQogCW1yYwlwMTUsIDAsIHI1LCBjMTUsIGMxLCAwCUAgQ1AgYWNjZXNzIHJlZwogCW1yYwlwMTUsIDAsIHI2LCBjMTMsIGMwLCAwCUAgUElECiAJbXJjCXAxNSwgMCwgcjcsIGMzLCBjMCwgMAlAIGRvbWFpbiBJRAotCW1yYwlwMTUsIDAsIHI4LCBjMiwgYzAsIDAJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKLQltcmMJcDE1LCAwLCByOSwgYzEsIGMxLCAwCUAgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnCi0JbXJjCXAxNSwgMCwgcjEwLCBjMSwgYzAsIDAJQCBjb250cm9sIHJlZworCW1yYwlwMTUsIDAsIHI4LCBjMSwgYzEsIDAJQCBhdXhpbGlhcnkgY29udHJvbCByZWcKKwltcmMJcDE1LCAwLCByOSwgYzEsIGMwLCAwCUAgY29udHJvbCByZWcKIAliaWMJcjQsIHI0LCAjMgkJQCBjbGVhciBmcmVxdWVuY3kgY2hhbmdlIGJpdAotCXN0bWlhCXIwLCB7cjQgLSByMTB9CQlAIHN0b3JlIGNwIHJlZ3MKLQlsZG1mZAlzcCEsIHtyNCAtIHIxMCwgcGN9CisJc3RtaWEJcjAsIHtyNCAtIHI5fQkJQCBzdG9yZSBjcCByZWdzCisJbGRtZmQJc3AhLCB7cjQgLSByOSwgcGN9CiBFTkRQUk9DKGNwdV94c2NhbGVfZG9fc3VzcGVuZCkKIAogRU5UUlkoY3B1X3hzY2FsZV9kb19yZXN1bWUpCi0JbGRtaWEJcjAsIHtyNCAtIHIxMH0JCUAgbG9hZCBjcCByZWdzCisJbGRtaWEJcjAsIHtyNCAtIHI5fQkJQCBsb2FkIGNwIHJlZ3MKIAltb3YJaXAsICMwCiAJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAlAIGludmFsaWRhdGUgSSAmIEQgVExCcwogCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJQCBpbnZhbGlkYXRlIEkgJiBEIGNhY2hlcywgQlRCCkBAIC01NDUsMTMgKzU0NCw5IEBACiAJbWNyCXAxNSwgMCwgcjUsIGMxNSwgYzEsIDAJQCBDUCBhY2Nlc3MgcmVnCiAJbWNyCXAxNSwgMCwgcjYsIGMxMywgYzAsIDAJQCBQSUQKIAltY3IJcDE1LCAwLCByNywgYzMsIGMwLCAwCUAgZG9tYWluIElECi0JbWNyCXAxNSwgMCwgcjgsIGMyLCBjMCwgMAlAIHRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgYWRkcgotCW1jcglwMTUsIDAsIHI5LCBjMSwgYzEsIDAJQCBhdXhpbGlhcnkgY29udHJvbCByZWcKLQltb3YJcjAsIHIxMAkJCUAgY29udHJvbCByZWdpc3RlcgotCW1vdglyMiwgcjgsIGxzciAjMTQJCUAgZ2V0IFRUQjAgYmFzZQotCW1vdglyMiwgcjIsIGxzbCAjMTQKLQlsZHIJcjMsID1QTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKLQkJICAgICBQTURfU0VDVF9DQUNIRUFCTEUgfCBQTURfU0VDVF9BUF9XUklURQorCW1jcglwMTUsIDAsIHIxLCBjMiwgYzAsIDAJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKKwltY3IJcDE1LCAwLCByOCwgYzEsIGMxLCAwCUAgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnCisJbW92CXIwLCByOQkJCUAgY29udHJvbCByZWdpc3RlcgogCWIJY3B1X3Jlc3VtZV9tbXUKIEVORFBST0MoY3B1X3hzY2FsZV9kb19yZXN1bWUpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtaW9wL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtaW9wL2dwaW8uYwppbmRleCA2NDBlNDk4Li5lNGRlOWJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LWlvcC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1pb3AvZ3Bpby5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9wM3h4Lmg+CiAKIHZvaWQgZ3Bpb19saW5lX2NvbmZpZyhpbnQgbGluZSwgaW50IGRpcmVjdGlvbikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtaW9wL3RpbWUuYyBiL2FyY2gvYXJtL3BsYXQtaW9wL3RpbWUuYwppbmRleCA3Y2RjNTE2Li41NjhkZDAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LWlvcC90aW1lLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1pb3AvdGltZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zY2hlZF9jbG9jay5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtbXhjL0tjb25maWcKaW5kZXggNGM4ZmRiYy4uYjNhMWYyYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvS2NvbmZpZwpAQCAtNCw1MCArNCwzNCBAQAogCiBtZW51ICJGcmVlc2NhbGUgTVhDIEltcGxlbWVudGF0aW9ucyIKIAotY29uZmlnIEFSQ0hfTVg1MF9TVVBQT1JURUQKLQlib29sCi0KLWNvbmZpZyBBUkNIX01YNTNfU1VQUE9SVEVECi0JYm9vbAotCiBjaG9pY2UKIAlwcm9tcHQgIkZyZWVzY2FsZSBDUFUgZmFtaWx5OiIKLQlkZWZhdWx0IEFSQ0hfTVgzCisJZGVmYXVsdCBBUkNIX0lNWF9WNl9WNwogCi1jb25maWcgQVJDSF9NWDEKLQlib29sICJNWDEtYmFzZWQiCitjb25maWcgQVJDSF9JTVhfVjRfVjUKKwlib29sICJpLk1YMSwgaS5NWDIxLCBpLk1YMjUsIGkuTVgyNyIKKwlzZWxlY3QgQVVUT19aUkVMQUREUiBpZiAhWkJPT1RfUk9NCisJc2VsZWN0IEFSTV9QQVRDSF9QSFlTX1ZJUlQKIAloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgRnJlZXNjYWxlIGkuTVgxIGZhbWlseQorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIEZyZWVzY2FsZSBpLk1YIEFSTXY0CisJICBhbmQgQVJNdjUgU29DcwogCi1jb25maWcgQVJDSF9NWDIKLQlib29sICJNWDItYmFzZWQiCitjb25maWcgQVJDSF9JTVhfVjZfVjcKKwlib29sICJpLk1YMywgaS5NWDYiCisJc2VsZWN0IEFVVE9fWlJFTEFERFIgaWYgIVpCT09UX1JPTQorCXNlbGVjdCBBUk1fUEFUQ0hfUEhZU19WSVJUCiAJaGVscAotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIEZyZWVzY2FsZSBpLk1YMiBmYW1pbHkKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBGcmVlc2NhbGUgaS5NWDMgYW5kIGkuTVg2CisJICBmYW1pbHkuCiAKLWNvbmZpZyBBUkNIX01YMjUKLQlib29sICJNWDI1LWJhc2VkIgotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBGcmVlc2NhbGUgaS5NWDI1IGZhbWlseQotCi1jb25maWcgQVJDSF9NWDMKLQlib29sICJNWDMtYmFzZWQiCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIEZyZWVzY2FsZSBpLk1YMyBmYW1pbHkKLQotY29uZmlnIEFSQ0hfTVg1MDMKLQlib29sICJpLk1YNTAgKyBpLk1YNTMiCi0Jc2VsZWN0IEFSQ0hfTVg1MF9TVVBQT1JURUQKLQlzZWxlY3QgQVJDSF9NWDUzX1NVUFBPUlRFRAorY29uZmlnIEFSQ0hfTVg1CisJYm9vbCAiaS5NWDUwLCBpLk1YNTEsIGkuTVg1MyIKKwlzZWxlY3QgQVVUT19aUkVMQUREUiBpZiAhWkJPT1RfUk9NCisJc2VsZWN0IEFSTV9QQVRDSF9QSFlTX1ZJUlQKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgbWFjaGluZXMgdXNpbmcgRnJlZXNjYWxlJ3MgaS5NWDUwIGFuZCBpLk1YNTMKIAkgIHByb2Nlc3NvcnMuCiAKLWNvbmZpZyBBUkNIX01YNTEKLQlib29sICJpLk1YNTEiCi0Jc2VsZWN0IEFSQ0hfTVg1MV9TVVBQT1JURUQKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgRnJlZXNjYWxlIGkuTVg1MSBmYW1pbHkKLQogZW5kY2hvaWNlCiAKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUKaW5kZXggZDUzYzM1Zi4uYjlmMGY1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUKQEAgLTUsNyArNSw3IEBACiAjIENvbW1vbiBzdXBwb3J0CiBvYmoteSA6PSBjbG9jay5vIHRpbWUubyBkZXZpY2VzLm8gY3B1Lm8gc3lzdGVtLm8gaXJxLWNvbW1vbi5vCiAKLSMgTVg1MSB1c2VzIHRoZSBUWklDIGludGVycnVwdCBjb250cm9sbGVyLCBvbGRlciBwbGF0Zm9ybXMgdXNlIEFWSUMKK29iai0kKENPTkZJR19BUk1fR0lDKSArPSBnaWMubwogb2JqLSQoQ09ORklHX01YQ19UWklDKSArPSB0emljLm8KIG9iai0kKENPTkZJR19NWENfQVZJQykgKz0gYXZpYy5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2F1ZG11eC12Mi5jIGIvYXJjaC9hcm0vcGxhdC1teGMvYXVkbXV4LXYyLmMKaW5kZXggMTc1ZTM2NC4uOGNjZWQzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvYXVkbXV4LXYyLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvYXVkbXV4LXYyLmMKQEAgLTE4NywxOCArMTg3LDExIEBACiBzdGF0aWMgaW50IG14Y19hdWRtdXhfdjJfaW5pdCh2b2lkKQogewogCWludCByZXQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NWDUpCiAJaWYgKGNwdV9pc19teDUxKCkpIHsKIAkJYXVkbXV4X2Jhc2UgPSBNWDUxX0lPX0FERFJFU1MoTVg1MV9BVURNVVhfQkFTRV9BRERSKTsKLQkJcmV0ID0gMDsKLQkJcmV0dXJuIHJldDsKLQl9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX01YMykKLQlpZiAoY3B1X2lzX214MzEoKSkKKwl9IGVsc2UgaWYgKGNwdV9pc19teDMxKCkpIHsKIAkJYXVkbXV4X2Jhc2UgPSBNWDMxX0lPX0FERFJFU1MoTVgzMV9BVURNVVhfQkFTRV9BRERSKTsKLQotCWVsc2UgaWYgKGNwdV9pc19teDM1KCkpIHsKKwl9IGVsc2UgaWYgKGNwdV9pc19teDM1KCkpIHsKIAkJYXVkbXV4X2NsayA9IGNsa19nZXQoTlVMTCwgImF1ZG11eCIpOwogCQlpZiAoSVNfRVJSKGF1ZG11eF9jbGspKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGF1ZG11eF9jbGspOwpAQCAtMjA3LDEwICsyMDAsNyBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCQlhdWRtdXhfYmFzZSA9IE1YMzVfSU9fQUREUkVTUyhNWDM1X0FVRE1VWF9CQVNFX0FERFIpOwotCX0KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19JTVgyNSkKLQlpZiAoY3B1X2lzX214MjUoKSkgeworCX0gZWxzZSBpZiAoY3B1X2lzX214MjUoKSkgewogCQlhdWRtdXhfY2xrID0gY2xrX2dldChOVUxMLCAiYXVkbXV4Iik7CiAJCWlmIChJU19FUlIoYXVkbXV4X2NsaykpIHsKIAkJCXJldCA9IFBUUl9FUlIoYXVkbXV4X2Nsayk7CkBAIC0yMjAsNyArMjEwLDcgQEAKIAkJfQogCQlhdWRtdXhfYmFzZSA9IE1YMjVfSU9fQUREUkVTUyhNWDI1X0FVRE1VWF9CQVNFX0FERFIpOwogCX0KLSNlbmRpZiAvKiBpZiBkZWZpbmVkKENPTkZJR19TT0NfSU1YMjUpICovCisKIAlhdWRtdXhfZGVidWdmc19pbml0KCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2F2aWMuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2F2aWMuYwppbmRleCA1NWQyNTM0Li41NWYxNTY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9hdmljLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvYXZpYy5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb24uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKICNpbmNsdWRlICJpcnEtY29tbW9uLmgiCkBAIC01MCw2ICs1MSw4IEBACiAKIHZvaWQgX19pb21lbSAqYXZpY19iYXNlOwogCitzdGF0aWMgdTMyIGF2aWNfc2F2ZWRfbWFza19yZWdbMl07CisKICNpZmRlZiBDT05GSUdfTVhDX0lSUV9QUklPUgogc3RhdGljIGludCBhdmljX2lycV9zZXRfcHJpb3JpdHkodW5zaWduZWQgY2hhciBpcnEsIHVuc2lnbmVkIGNoYXIgcHJpbykKIHsKQEAgLTkwLDI0ICs5Myw4IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0ZJUSAqLwogCi0vKiBEaXNhYmxlIGludGVycnVwdCBudW1iZXIgImlycSIgaW4gdGhlIEFWSUMgKi8KLXN0YXRpYyB2b2lkIG14Y19tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JX19yYXdfd3JpdGVsKGQtPmlycSwgYXZpY19iYXNlICsgQVZJQ19JTlRESVNOVU0pOwotfQogCi0vKiBFbmFibGUgaW50ZXJydXB0IG51bWJlciAiaXJxIiBpbiB0aGUgQVZJQyAqLwotc3RhdGljIHZvaWQgbXhjX3VubWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCV9fcmF3X3dyaXRlbChkLT5pcnEsIGF2aWNfYmFzZSArIEFWSUNfSU5URU5OVU0pOwotfQotCi1zdGF0aWMgc3RydWN0IG14Y19pcnFfY2hpcCBteGNfYXZpY19jaGlwID0gewotCS5iYXNlID0gewotCQkuaXJxX2FjayA9IG14Y19tYXNrX2lycSwKLQkJLmlycV9tYXNrID0gbXhjX21hc2tfaXJxLAotCQkuaXJxX3VubWFzayA9IG14Y191bm1hc2tfaXJxLAotCX0sCitzdGF0aWMgc3RydWN0IG14Y19leHRyYV9pcnEgYXZpY19leHRyYV9pcnEgPSB7CiAjaWZkZWYgQ09ORklHX01YQ19JUlFfUFJJT1IKIAkuc2V0X3ByaW9yaXR5ID0gYXZpY19pcnFfc2V0X3ByaW9yaXR5LAogI2VuZGlmCkBAIC0xMTYsNiArMTAzLDY4IEBACiAjZW5kaWYKIH07CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyB2b2lkIGF2aWNfaXJxX3N1c3BlbmQoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdCA9IGdjLT5jaGlwX3R5cGVzOworCWludCBpZHggPSBnYy0+aXJxX2Jhc2UgPj4gNTsKKworCWF2aWNfc2F2ZWRfbWFza19yZWdbaWR4XSA9IF9fcmF3X3JlYWRsKGF2aWNfYmFzZSArIGN0LT5yZWdzLm1hc2spOworCV9fcmF3X3dyaXRlbChnYy0+d2FrZV9hY3RpdmUsIGF2aWNfYmFzZSArIGN0LT5yZWdzLm1hc2spOworfQorCitzdGF0aWMgdm9pZCBhdmljX2lycV9yZXN1bWUoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdCA9IGdjLT5jaGlwX3R5cGVzOworCWludCBpZHggPSBnYy0+aXJxX2Jhc2UgPj4gNTsKKworCV9fcmF3X3dyaXRlbChhdmljX3NhdmVkX21hc2tfcmVnW2lkeF0sIGF2aWNfYmFzZSArIGN0LT5yZWdzLm1hc2spOworfQorCisjZWxzZQorI2RlZmluZSBhdmljX2lycV9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgYXZpY19pcnFfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgX19pbml0IHZvaWQgYXZpY19pbml0X2djKHVuc2lnbmVkIGludCBpcnFfc3RhcnQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdDsKKwlpbnQgaWR4ID0gaXJxX3N0YXJ0ID4+IDU7CisKKwlnYyA9IGlycV9hbGxvY19nZW5lcmljX2NoaXAoIm14Yy1hdmljIiwgMSwgaXJxX3N0YXJ0LCBhdmljX2Jhc2UsCisJCQkJICAgIGhhbmRsZV9sZXZlbF9pcnEpOworCWdjLT5wcml2YXRlID0gJmF2aWNfZXh0cmFfaXJxOworCWdjLT53YWtlX2VuYWJsZWQgPSBJUlFfTVNLKDMyKTsKKworCWN0ID0gZ2MtPmNoaXBfdHlwZXM7CisJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OworCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OworCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OworCWN0LT5jaGlwLmlycV9zZXRfd2FrZSA9IGlycV9nY19zZXRfd2FrZTsKKwljdC0+Y2hpcC5pcnFfc3VzcGVuZCA9IGF2aWNfaXJxX3N1c3BlbmQ7CisJY3QtPmNoaXAuaXJxX3Jlc3VtZSA9IGF2aWNfaXJxX3Jlc3VtZTsKKwljdC0+cmVncy5tYXNrID0gIWlkeCA/IEFWSUNfSU5URU5BQkxFTCA6IEFWSUNfSU5URU5BQkxFSDsKKwljdC0+cmVncy5hY2sgPSBjdC0+cmVncy5tYXNrOworCisJaXJxX3NldHVwX2dlbmVyaWNfY2hpcChnYywgSVJRX01TSygzMiksIDAsIElSUV9OT1JFUVVFU1QsIDApOworfQorCithc21saW5rYWdlIHZvaWQgX19leGNlcHRpb25faXJxX2VudHJ5IGF2aWNfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgbml2ZWN0b3I7CisKKwlkbyB7CisJCW5pdmVjdG9yID0gX19yYXdfcmVhZGwoYXZpY19iYXNlICsgQVZJQ19OSVZFQ1NSKSA+PiAxNjsKKwkJaWYgKG5pdmVjdG9yID09IDB4ZmZmZikKKwkJCWJyZWFrOworCisJCWhhbmRsZV9JUlEobml2ZWN0b3IsIHJlZ3MpOworCX0gd2hpbGUgKDEpOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgQVZJQyBoYXJkd2FyZSBhbmQgZGlzYWJsZXMgYWxsIHRoZQogICogaW50ZXJydXB0cy4gSXQgcmVnaXN0ZXJzIHRoZSBpbnRlcnJ1cHQgZW5hYmxlIGFuZCBkaXNhYmxlIGZ1bmN0aW9ucwpAQCAtMTQwLDExICsxODksOSBAQAogCS8qIGFsbCBJUlEgbm8gRklRICovCiAJX19yYXdfd3JpdGVsKDAsIGF2aWNfYmFzZSArIEFWSUNfSU5UVFlQRUgpOwogCV9fcmF3X3dyaXRlbCgwLCBhdmljX2Jhc2UgKyBBVklDX0lOVFRZUEVMKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVZJQ19OVU1fSVJRUzsgaSsrKSB7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpLCAmbXhjX2F2aWNfY2hpcC5iYXNlLAotCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7Ci0JCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7Ci0JfQorCisJZm9yIChpID0gMDsgaSA8IEFWSUNfTlVNX0lSUVM7IGkgKz0gMzIpCisJCWF2aWNfaW5pdF9nYyhpKTsKIAogCS8qIFNldCBkZWZhdWx0IHByaW9yaXR5IHZhbHVlICgwKSBmb3IgYWxsIElSUSdzICovCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKQEAgLTE1Nyw0ICsyMDQsMyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTVhDIElSUSBpbml0aWFsaXplZFxuIik7CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2NwdS5jIGIvYXJjaC9hcm0vcGxhdC1teGMvY3B1LmMKaW5kZXggMzg2ZTBkNS4uZjViN2UwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvY3B1LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvY3B1LmMKQEAgLTEsNSArMSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKIHVuc2lnbmVkIGludCBfX214Y19jcHVfdHlwZTsKIEVYUE9SVF9TWU1CT0woX19teGNfY3B1X3R5cGUpOwpAQCAtOSwzICsxMCwxMSBAQAogCV9fbXhjX2NwdV90eXBlID0gdHlwZTsKIH0KIAordm9pZCBpbXhfcHJpbnRfc2lsaWNvbl9yZXYoY29uc3QgY2hhciAqY3B1LCBpbnQgc3JldikKK3sKKwlpZiAoc3JldiA9PSBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOKQorCQlwcl9pbmZvKCJDUFUgaWRlbnRpZmllZCBhcyAlcywgdW5rbm93biByZXZpc2lvblxuIiwgY3B1KTsKKwllbHNlCisJCXByX2luZm8oIkNQVSBpZGVudGlmaWVkIGFzICVzLCBzaWxpY29uIHJldiAlZC4lZFxuIiwKKwkJCQljcHUsIChzcmV2ID4+IDQpICYgMHhmLCBzcmV2ICYgMHhmKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMuYwppbmRleCBhMzRiMmFlLi40ZDU1YTdhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy5jCkBAIC0yMywyMCArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAKLWludCBfX2luaXQgbXhjX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB2b2lkICpkYXRhKQotewotCWludCByZXQ7Ci0KLQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IGRhdGE7Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIocGRldik7Ci0JaWYgKHJldCkKLQkJcHJfZGVidWcoIlVuYWJsZSB0byByZWdpc3RlciBwbGF0Zm9ybSBkZXZpY2UgJyVzJzogJWRcbiIsCi0JCQkgcGRldi0+bmFtZSwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0cnVjdCBkZXZpY2UgbXhjX2FpcHNfYnVzID0gewogCS5pbml0X25hbWUJPSAibXhjX2FpcHMiLAogCS5wYXJlbnQJCT0gJnBsYXRmb3JtX2J1cywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvS2NvbmZpZwppbmRleCBiZDI5NGFkLi5jYjNlM2VlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIElNWF9IQVZFX1BMQVRGT1JNX0ZFQwogCWJvb2wKLQlkZWZhdWx0IHkgaWYgQVJDSF9NWDI1IHx8IFNPQ19JTVgyNyB8fCBTT0NfSU1YMzUgfHwgU09DX0lNWDUxIHx8IFNPQ19JTVg1MworCWRlZmF1bHQgeSBpZiBBUkNIX01YMjUgfHwgU09DX0lNWDI3IHx8IFNPQ19JTVgzNSB8fCBTT0NfSU1YNTAgfHwgU09DX0lNWDUxIHx8IFNPQ19JTVg1MwogCiBjb25maWcgSU1YX0hBVkVfUExBVEZPUk1fRkxFWENBTgogCXNlbGVjdCBIQVZFX0NBTl9GTEVYQ0FOIGlmIENBTgpAQCAtMzEsNiArMzEsOSBAQAogY29uZmlnIElNWF9IQVZFX1BMQVRGT1JNX0lNWF9LRVlQQUQKIAlib29sCiAKK2NvbmZpZyBJTVhfSEFWRV9QTEFURk9STV9QQVRBX0lNWAorCWJvb2wKKwogY29uZmlnIElNWF9IQVZFX1BMQVRGT1JNX0lNWF9TU0kKIAlib29sCiAKQEAgLTc2LDMgKzc5LDcgQEAKIAogY29uZmlnIElNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgKIAlib29sCisKK2NvbmZpZyBJTVhfSEFWRV9QTEFURk9STV9BSENJCisJYm9vbAorCWRlZmF1bHQgeSBpZiBBUkNIX01YNTMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL01ha2VmaWxlCmluZGV4IGI0MWJmOTcuLmMxMWFjODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX0lNWF9GQikgKz0gcGxhdGZvcm0taW14LWZiLm8KIG9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9JTVhfSTJDKSArPSBwbGF0Zm9ybS1pbXgtaTJjLm8KIG9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9JTVhfS0VZUEFEKSArPSBwbGF0Zm9ybS1pbXgta2V5cGFkLm8KK29iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9QQVRBX0lNWCkgKz0gcGxhdGZvcm0tcGF0YV9pbXgubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX0lNWF9TU0kpICs9IHBsYXRmb3JtLWlteC1zc2kubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUKSArPSBwbGF0Zm9ybS1pbXgtdWFydC5vCiBvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VEQykgKz0gcGxhdGZvcm0taW14X3VkYy5vCkBAIC0yNSwzICsyNiw0IEBACiBvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fTVhDX1cxKSArPSBwbGF0Zm9ybS1teGNfdzEubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX1NESENJX0VTREhDX0lNWCkgKz0gcGxhdGZvcm0tc2RoY2ktZXNkaGMtaW14Lm8KIG9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9TUElfSU1YKSArPSAgcGxhdGZvcm0tc3BpX2lteC5vCitvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fQUhDSSkgKz0gIHBsYXRmb3JtLWFoY2ktaW14Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tYWhjaS1pbXguYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tYWhjaS1pbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGE1NmFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1haGNpLWlteC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CisKKyNkZWZpbmUgaW14X2FoY2lfaW14X2RhdGFfZW50cnlfc2luZ2xlKHNvYywgX2RldmlkKQkJXAorCXsJCQkJCQkJCVwKKwkJLmRldmlkID0gX2RldmlkLAkJCQkJXAorCQkuaW9iYXNlID0gc29jICMjIF9TQVRBX0JBU0VfQUREUiwJCQlcCisJCS5pcnEgPSBzb2MgIyMgX0lOVF9TQVRBLAkJCQlcCisJfQorCisjaWZkZWYgQ09ORklHX1NPQ19JTVg1MworY29uc3Qgc3RydWN0IGlteF9haGNpX2lteF9kYXRhIGlteDUzX2FoY2lfaW14X2RhdGEgX19pbml0Y29uc3QgPQorCWlteF9haGNpX2lteF9kYXRhX2VudHJ5X3NpbmdsZShNWDUzLCAiaW14NTMtYWhjaSIpOworI2VuZGlmCisKK2VudW0geworCUhPU1RfQ0FQID0gMHgwMCwKKwlIT1NUX0NBUF9TU1MgPSAoMSA8PCAyNyksIC8qIFN0YWdnZXJlZCBTcGluLXVwICovCisJSE9TVF9QT1JUU19JTVBMCT0gMHgwYywKKwlIT1NUX1RJTUVSMU1TID0gMHhlMCwgLyogVGltZXIgMS1tcyAqLworfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKnNhdGFfY2xrLCAqc2F0YV9yZWZfY2xrOworCisvKiBBSENJIG1vZHVsZSBJbml0aWFsaXphdGlvbiwgaWYgcmV0dXJuIDAsIGluaXRpYWxpemF0aW9uIGlzIHN1Y2Nlc3NmdWwuICovCitzdGF0aWMgaW50IGlteF9zYXRhX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTMyIHRtcGRhdGE7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNsayAqY2xrOworCisJc2F0YV9jbGsgPSBjbGtfZ2V0KGRldiwgImFoY2kiKTsKKwlpZiAoSVNfRVJSKHNhdGFfY2xrKSkgeworCQlkZXZfZXJyKGRldiwgIm5vIHNhdGEgY2xvY2suXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9jbGspOworCX0KKwlyZXQgPSBjbGtfZW5hYmxlKHNhdGFfY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgZW5hYmxlIHNhdGEgY2xvY2suXG4iKTsKKwkJZ290byBwdXRfc2F0YV9jbGs7CisJfQorCisJLyogR2V0IHRoZSBBSENJIFNBVEEgUEhZIENMSyAqLworCXNhdGFfcmVmX2NsayA9IGNsa19nZXQoZGV2LCAiYWhjaV9waHkiKTsKKwlpZiAoSVNfRVJSKHNhdGFfcmVmX2NsaykpIHsKKwkJZGV2X2VycihkZXYsICJubyBzYXRhIHJlZiBjbG9jay5cbiIpOworCQlyZXQgPSBQVFJfRVJSKHNhdGFfcmVmX2Nsayk7CisJCWdvdG8gcmVsZWFzZV9zYXRhX2NsazsKKwl9CisJcmV0ID0gY2xrX2VuYWJsZShzYXRhX3JlZl9jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBlbmFibGUgc2F0YSByZWYgY2xvY2suXG4iKTsKKwkJZ290byBwdXRfc2F0YV9yZWZfY2xrOworCX0KKworCS8qIEdldCB0aGUgQUhCIGNsb2NrIHJhdGUsIGFuZCBjb25maWd1cmUgdGhlIFRJTUVSMU1TIHJlZyBsYXRlciAqLworCWNsayA9IGNsa19nZXQoZGV2LCAiYWhjaV9kbWEiKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJZGV2X2VycihkZXYsICJubyBkbWEgY2xvY2suXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihjbGspOworCQlnb3RvIHJlbGVhc2Vfc2F0YV9yZWZfY2xrOworCX0KKwl0bXBkYXRhID0gY2xrX2dldF9yYXRlKGNsaykgLyAxMDAwOworCWNsa19wdXQoY2xrKTsKKworCXdyaXRlbCh0bXBkYXRhLCBhZGRyICsgSE9TVF9USU1FUjFNUyk7CisKKwl0bXBkYXRhID0gcmVhZGwoYWRkciArIEhPU1RfQ0FQKTsKKwlpZiAoISh0bXBkYXRhICYgSE9TVF9DQVBfU1NTKSkgeworCQl0bXBkYXRhIHw9IEhPU1RfQ0FQX1NTUzsKKwkJd3JpdGVsKHRtcGRhdGEsIGFkZHIgKyBIT1NUX0NBUCk7CisJfQorCisJaWYgKCEocmVhZGwoYWRkciArIEhPU1RfUE9SVFNfSU1QTCkgJiAweDEpKQorCQl3cml0ZWwoKHJlYWRsKGFkZHIgKyBIT1NUX1BPUlRTX0lNUEwpIHwgMHgxKSwKKwkJCWFkZHIgKyBIT1NUX1BPUlRTX0lNUEwpOworCisJcmV0dXJuIDA7CisKK3JlbGVhc2Vfc2F0YV9yZWZfY2xrOgorCWNsa19kaXNhYmxlKHNhdGFfcmVmX2Nsayk7CitwdXRfc2F0YV9yZWZfY2xrOgorCWNsa19wdXQoc2F0YV9yZWZfY2xrKTsKK3JlbGVhc2Vfc2F0YV9jbGs6CisJY2xrX2Rpc2FibGUoc2F0YV9jbGspOworcHV0X3NhdGFfY2xrOgorCWNsa19wdXQoc2F0YV9jbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW14X3NhdGFfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY2xrX2Rpc2FibGUoc2F0YV9yZWZfY2xrKTsKKwljbGtfcHV0KHNhdGFfcmVmX2Nsayk7CisKKwljbGtfZGlzYWJsZShzYXRhX2Nsayk7CisJY2xrX3B1dChzYXRhX2Nsayk7CisKK30KK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX2FoY2lfaW14KAorCQljb25zdCBzdHJ1Y3QgaW14X2FoY2lfaW14X2RhdGEgKmRhdGEsCisJCWNvbnN0IHN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCByZXNvdXJjZSByZXNbXSA9IHsKKwkJeworCQkJLnN0YXJ0ID0gZGF0YS0+aW9iYXNlLAorCQkJLmVuZCA9IGRhdGEtPmlvYmFzZSArIFNaXzRLIC0gMSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LCB7CisJCQkuc3RhcnQgPSBkYXRhLT5pcnEsCisJCQkuZW5kID0gZGF0YS0+aXJxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCisJfTsKKworCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZV9kbWFtYXNrKGRhdGEtPmRldmlkLCAwLAorCQkJcmVzLCBBUlJBWV9TSVpFKHJlcyksCisJCQlwZGF0YSwgc2l6ZW9mKCpwZGF0YSksICBETUFfQklUX01BU0soMzIpKTsKK30KKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteDUzX2FkZF9haGNpX2lteCh2b2lkKQoreworCXN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgcGRhdGEgPSB7CisJCS5pbml0ID0gaW14X3NhdGFfaW5pdCwKKwkJLmV4aXQgPSBpbXhfc2F0YV9leGl0LAorCX07CisKKwlyZXR1cm4gaW14X2FkZF9haGNpX2lteCgmaW14NTNfYWhjaV9pbXhfZGF0YSwgJnBkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZnNsLXVzYjItdWRjLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWZzbC11c2IyLXVkYy5jCmluZGV4IDIzY2UwOGUuLjg0ODAzOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZnNsLXVzYjItdWRjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mc2wtdXNiMi11ZGMuYwpAQCAtMzYsNiArMzYsMTEgQEAKIAlpbXhfZnNsX3VzYjJfdWRjX2RhdGFfZW50cnlfc2luZ2xlKE1YMzUpOwogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YMzUgKi8KIAorI2lmZGVmIENPTkZJR19TT0NfSU1YNTEKK2NvbnN0IHN0cnVjdCBpbXhfZnNsX3VzYjJfdWRjX2RhdGEgaW14NTFfZnNsX3VzYjJfdWRjX2RhdGEgX19pbml0Y29uc3QgPQorCWlteF9mc2xfdXNiMl91ZGNfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MSk7CisjZW5kaWYKKwogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfZnNsX3VzYjJfdWRjKAogCQljb25zdCBzdHJ1Y3QgaW14X2ZzbF91c2IyX3VkY19kYXRhICpkYXRhLAogCQljb25zdCBzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC1pMmMuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWkyYy5jCmluZGV4IGFmZTYwZjcuLjE5YWQ1ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWkyYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWkyYy5jCkBAIC04NSw2ICs4NSwxMiBAQAogCWlteF9pbXhfaTJjX2RhdGFfZW50cnkoTVg1MSwgX2lkLCBfaHdpZCwgU1pfNEspCiAJaW14NTFfaW14X2kyY19kYXRhX2VudHJ5KDAsIDEpLAogCWlteDUxX2lteF9pMmNfZGF0YV9lbnRyeSgxLCAyKSwKKwl7CisJCS5pZCA9IDIsCisJCS5pb2Jhc2UgPSBNWDUxX0hTSTJDX0RNQV9CQVNFX0FERFIsCisJCS5pb3NpemUgPSBTWl8xNkssCisJCS5pcnEgPSBNWDUxX0lOVF9IU19JMkMsCisJfSwKIH07CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVg1MSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLW14Yy1laGNpLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLW14Yy1laGNpLmMKaW5kZXggZTE3NjNlMC4uMzU4NTFkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1teGMtZWhjaS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tbXhjLWVoY2kuYwpAQCAtNDksNiArNDksMTUgQEAKIAlpbXhfbXhjX2VoY2lfZGF0YV9lbnRyeV9zaW5nbGUoTVgzNSwgMSwgSFMpOwogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YMzUgKi8KIAorI2lmZGVmIENPTkZJR19TT0NfSU1YNTEKK2NvbnN0IHN0cnVjdCBpbXhfbXhjX2VoY2lfZGF0YSBpbXg1MV9teGNfZWhjaV9vdGdfZGF0YSBfX2luaXRjb25zdCA9CisJaW14X214Y19laGNpX2RhdGFfZW50cnlfc2luZ2xlKE1YNTEsIDAsIE9URyk7Citjb25zdCBzdHJ1Y3QgaW14X214Y19laGNpX2RhdGEgaW14NTFfbXhjX2VoY2lfaHNfZGF0YVtdIF9faW5pdGNvbnN0ID0geworCWlteF9teGNfZWhjaV9kYXRhX2VudHJ5X3NpbmdsZShNWDUxLCAxLCBIUzEpLAorCWlteF9teGNfZWhjaV9kYXRhX2VudHJ5X3NpbmdsZShNWDUxLCAyLCBIUzIpLAorfTsKKyNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDUxICovCisKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX214Y19laGNpKAogCQljb25zdCBzdHJ1Y3QgaW14X214Y19laGNpX2RhdGEgKmRhdGEsCiAJCWNvbnN0IHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tcGF0YV9pbXguYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tcGF0YV9pbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGUyZjJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1wYXRhX2lteC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KKworI2RlZmluZSBpbXhfcGF0YV9pbXhfZGF0YV9lbnRyeV9zaW5nbGUoc29jLCBfc2l6ZSkJCQlcCisJewkJCQkJCQkJXAorCQkuaW9iYXNlID0gc29jICMjIF9BVEFfQkFTRV9BRERSLAkJCVwKKwkJLmlvc2l6ZSA9IF9zaXplLAkJCQkJXAorCQkuaXJxID0gc29jICMjIF9JTlRfQVRBLAkJCQkJXAorCX0KKworI2lmZGVmIENPTkZJR19TT0NfSU1YMjcKK2NvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSBpbXgyN19wYXRhX2lteF9kYXRhIF9faW5pdGNvbnN0ID0KKwlpbXhfcGF0YV9pbXhfZGF0YV9lbnRyeV9zaW5nbGUoTVgyNywgU1pfNEspOworI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YMjcgKi8KKworI2lmZGVmIENPTkZJR19TT0NfSU1YMzEKK2NvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSBpbXgzMV9wYXRhX2lteF9kYXRhIF9faW5pdGNvbnN0ID0KKwlpbXhfcGF0YV9pbXhfZGF0YV9lbnRyeV9zaW5nbGUoTVgzMSwgU1pfMTZLKTsKKyNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDMxICovCisKKyNpZmRlZiBDT05GSUdfU09DX0lNWDM1Citjb25zdCBzdHJ1Y3QgaW14X3BhdGFfaW14X2RhdGEgaW14MzVfcGF0YV9pbXhfZGF0YSBfX2luaXRjb25zdCA9CisJaW14X3BhdGFfaW14X2RhdGFfZW50cnlfc2luZ2xlKE1YMzUsIFNaXzE2Syk7CisjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgzNSAqLworCisjaWZkZWYgQ09ORklHX1NPQ19JTVg1MQorY29uc3Qgc3RydWN0IGlteF9wYXRhX2lteF9kYXRhIGlteDUxX3BhdGFfaW14X2RhdGEgX19pbml0Y29uc3QgPQorCWlteF9wYXRhX2lteF9kYXRhX2VudHJ5X3NpbmdsZShNWDUxLCBTWl8xNkspOworI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YNTEgKi8KKworI2lmZGVmIENPTkZJR19TT0NfSU1YNTMKK2NvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSBpbXg1M19wYXRhX2lteF9kYXRhIF9faW5pdGNvbnN0ID0KKwlpbXhfcGF0YV9pbXhfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MywgU1pfMTZLKTsKKyNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDUzICovCisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX3BhdGFfaW14KAorCQljb25zdCBzdHJ1Y3QgaW14X3BhdGFfaW14X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHJlc291cmNlIHJlc1tdID0geworCQl7CisJCQkuc3RhcnQgPSBkYXRhLT5pb2Jhc2UsCisJCQkuZW5kID0gZGF0YS0+aW9iYXNlICsgZGF0YS0+aW9zaXplIC0gMSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LAorCQl7CisJCQkuc3RhcnQgPSBkYXRhLT5pcnEsCisJCQkuZW5kID0gZGF0YS0+aXJxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCisJfTsKKwlyZXR1cm4gaW14X2FkZF9wbGF0Zm9ybV9kZXZpY2UoInBhdGFfaW14IiwgLTEsCisJCQlyZXMsIEFSUkFZX1NJWkUocmVzKSwgTlVMTCwgMCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2dpYy5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZ2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmOGY4MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2dpYy5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb24uaD4KKyNpbmNsdWRlIDxhc20vbG9jYWx0aW1lci5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpZmRlZiBDT05GSUdfU01QCisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2VuZGlmCisKK2FzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgZ2ljX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIGlycXN0YXQsIGlycW5yOworCisJZG8geworCQlpcnFzdGF0ID0gcmVhZGxfcmVsYXhlZChnaWNfY3B1X2Jhc2VfYWRkciArIEdJQ19DUFVfSU5UQUNLKTsKKwkJaXJxbnIgPSBpcnFzdGF0ICYgMHgzZmY7CisJCWlmIChpcnFuciA9PSAxMDIzKQorCQkJYnJlYWs7CisKKwkJaWYgKGlycW5yID4gMTUgJiYgaXJxbnIgPCAxMDIxKQorCQkJaGFuZGxlX0lSUShpcnFuciwgcmVncyk7CisjaWZkZWYgQ09ORklHX1NNUAorCQllbHNlIHsKKwkJCXdyaXRlbF9yZWxheGVkKGlycXN0YXQsIGdpY19jcHVfYmFzZV9hZGRyICsKKwkJCQkJCUdJQ19DUFVfRU9JKTsKKwkJCWhhbmRsZV9JUEkoaXJxbnIsIHJlZ3MpOworCQl9CisjZW5kaWYKKwl9IHdoaWxlICgxKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9jb21tb24uaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9jb21tb24uaAppbmRleCA0ZTNkOTc4Li44M2I3NDVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCkBAIC0xMyw2ICsxMyw3IEBACiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CiBzdHJ1Y3QgY2xrOworZW51bSBteGNfY3B1X3B3cl9tb2RlOwogCiBleHRlcm4gdm9pZCBteDFfbWFwX2lvKHZvaWQpOwogZXh0ZXJuIHZvaWQgbXgyMV9tYXBfaW8odm9pZCk7CkBAIC02NCwxMiArNjUsNzIgQEAKIAkJCXVuc2lnbmVkIGxvbmcgY2tpaDEsIHVuc2lnbmVkIGxvbmcgY2tpaDIpOwogZXh0ZXJuIGludCBteDUzX2Nsb2Nrc19pbml0KHVuc2lnbmVkIGxvbmcgY2tpbCwgdW5zaWduZWQgbG9uZyBvc2MsCiAJCQl1bnNpZ25lZCBsb25nIGNraWgxLCB1bnNpZ25lZCBsb25nIGNraWgyKTsKK2V4dGVybiBpbnQgbXg1MV9jbG9ja3NfaW5pdF9kdCh2b2lkKTsKK2V4dGVybiBpbnQgbXg1M19jbG9ja3NfaW5pdF9kdCh2b2lkKTsKK2V4dGVybiBpbnQgbXg2cV9jbG9ja3NfaW5pdCh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpteGNfcmVnaXN0ZXJfZ3BpbyhjaGFyICpuYW1lLCBpbnQgaWQsCiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZSwgaW50IGlycSwgaW50IGlycV9oaWdoKTsKLWV4dGVybiBpbnQgbXhjX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB2b2lkICpkYXRhKTsKIGV4dGVybiB2b2lkIG14Y19zZXRfY3B1X3R5cGUodW5zaWduZWQgaW50IHR5cGUpOwogZXh0ZXJuIHZvaWQgbXhjX2FyY2hfcmVzZXRfaW5pdCh2b2lkIF9faW9tZW0gKik7CiBleHRlcm4gdm9pZCBteDUxX2VmaWthbXhfcmVzZXQodm9pZCk7CiBleHRlcm4gaW50IG14NTNfcmV2aXNpb24odm9pZCk7CiBleHRlcm4gaW50IG14NTNfZGlzcGxheV9yZXZpc2lvbih2b2lkKTsKKworZW51bSBteGNfY3B1X3B3cl9tb2RlIHsKKwlXQUlUX0NMT0NLRUQsCQkvKiB3Zmkgb25seSAqLworCVdBSVRfVU5DTE9DS0VELAkJLyogV0FJVCAqLworCVdBSVRfVU5DTE9DS0VEX1BPV0VSX09GRiwJLyogV0FJVCArIFNSUEcgKi8KKwlTVE9QX1BPV0VSX09OLAkJLyoganVzdCBTVE9QICovCisJU1RPUF9QT1dFUl9PRkYsCQkvKiBTVE9QICsgU1JQRyAqLworfTsKKworZXh0ZXJuIHZvaWQgbXg1X2NwdV9scF9zZXQoZW51bSBteGNfY3B1X3B3cl9tb2RlIG1vZGUpOworZXh0ZXJuIHZvaWQgKCppbXhfaWRsZSkodm9pZCk7CitleHRlcm4gdm9pZCBpbXhfcHJpbnRfc2lsaWNvbl9yZXYoY29uc3QgY2hhciAqY3B1LCBpbnQgc3Jldik7CisKK3ZvaWQgYXZpY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICopOwordm9pZCB0emljX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKik7Cit2b2lkIGdpY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICopOworCisjZGVmaW5lIGlteDFfaGFuZGxlX2lycSBhdmljX2hhbmRsZV9pcnEKKyNkZWZpbmUgaW14MjFfaGFuZGxlX2lycSBhdmljX2hhbmRsZV9pcnEKKyNkZWZpbmUgaW14MjVfaGFuZGxlX2lycSBhdmljX2hhbmRsZV9pcnEKKyNkZWZpbmUgaW14MjdfaGFuZGxlX2lycSBhdmljX2hhbmRsZV9pcnEKKyNkZWZpbmUgaW14MzFfaGFuZGxlX2lycSBhdmljX2hhbmRsZV9pcnEKKyNkZWZpbmUgaW14MzVfaGFuZGxlX2lycSBhdmljX2hhbmRsZV9pcnEKKyNkZWZpbmUgaW14NTBfaGFuZGxlX2lycSB0emljX2hhbmRsZV9pcnEKKyNkZWZpbmUgaW14NTFfaGFuZGxlX2lycSB0emljX2hhbmRsZV9pcnEKKyNkZWZpbmUgaW14NTNfaGFuZGxlX2lycSB0emljX2hhbmRsZV9pcnEKKyNkZWZpbmUgaW14NnFfaGFuZGxlX2lycSBnaWNfaGFuZGxlX2lycQorCitleHRlcm4gdm9pZCBpbXhfZW5hYmxlX2NwdShpbnQgY3B1LCBib29sIGVuYWJsZSk7CitleHRlcm4gdm9pZCBpbXhfc2V0X2NwdV9qdW1wKGludCBjcHUsIHZvaWQgKmp1bXBfYWRkcik7CisjaWZkZWYgQ09ORklHX0RFQlVHX0xMCitleHRlcm4gdm9pZCBpbXhfbGx1YXJ0X21hcF9pbyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgaW14X2xsdWFydF9tYXBfaW8odm9pZCkge30KKyNlbmRpZgorZXh0ZXJuIHZvaWQgdjdfY3B1X3Jlc3VtZSh2b2lkKTsKK2V4dGVybiB1MzIgKnBsMzEwX2dldF9zYXZlX3B0cih2b2lkKTsKKyNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdm9pZCB2N19zZWNvbmRhcnlfc3RhcnR1cCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteF9zY3VfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgaW14X3NtcF9wcmVwYXJlKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbXhfc2N1X21hcF9pbyh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGlteF9zbXBfcHJlcGFyZSh2b2lkKSB7fQorI2VuZGlmCitleHRlcm4gdm9pZCBpbXhfZW5hYmxlX2NwdShpbnQgY3B1LCBib29sIGVuYWJsZSk7CitleHRlcm4gdm9pZCBpbXhfc2V0X2NwdV9qdW1wKGludCBjcHUsIHZvaWQgKmp1bXBfYWRkcik7CitleHRlcm4gdm9pZCBpbXhfc3JjX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbXhfZ3BjX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbXhfZ3BjX3ByZV9zdXNwZW5kKHZvaWQpOworZXh0ZXJuIHZvaWQgaW14X2dwY19wb3N0X3Jlc3VtZSh2b2lkKTsKK2V4dGVybiB2b2lkIGlteDUxX2JhYmJhZ2VfY29tbW9uX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbXg1M19hcmRfY29tbW9uX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbXg1M19ldmtfY29tbW9uX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbXg1M19xc2JfY29tbW9uX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbXg1M19zbWRfY29tbW9uX2luaXQodm9pZCk7CitleHRlcm4gaW50IGlteDZxX3NldF9scG0oZW51bSBteGNfY3B1X3B3cl9tb2RlIG1vZGUpOworZXh0ZXJuIHZvaWQgaW14NnFfcG1faW5pdCh2b2lkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBlNGRkZTkxLi42ZTE5MmM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTIsNDkgKzEyLDI1IEBACiAgKi8KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKLSNpZmRlZiBDT05GSUdfU09DX0lNWDEKKyNpZmRlZiBDT05GSUdfREVCVUdfSU1YMV9VQVJUCiAjZGVmaW5lIFVBUlRfUEFERFIJTVgxX1VBUlQxX0JBU0VfQUREUgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU09DX0lNWDI1Ci0jaWZkZWYgVUFSVF9QQUREUgotI2Vycm9yICJDT05GSUdfREVCVUdfTEwgaXMgaW5jb21wYXRpYmxlIHdpdGggbXVsdGlwbGUgYXJjaHMiCi0jZW5kaWYKKyNlbGlmIGRlZmluZWQgKENPTkZJR19ERUJVR19JTVgyNV9VQVJUKQogI2RlZmluZSBVQVJUX1BBRERSCU1YMjVfVUFSVDFfQkFTRV9BRERSCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19JTVgyMSkgfHwgZGVmaW5lZCAoQ09ORklHX1NPQ19JTVgyNykKLSNpZmRlZiBVQVJUX1BBRERSCi0jZXJyb3IgIkNPTkZJR19ERUJVR19MTCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBhcmNocyIKLSNlbmRpZgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX0RFQlVHX0lNWDIxX0lNWDI3X1VBUlQpCiAjZGVmaW5lIFVBUlRfUEFERFIJTVgyeF9VQVJUMV9CQVNFX0FERFIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0lNWDMxKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfSU1YMzUpCi0jaWZkZWYgVUFSVF9QQUREUgotI2Vycm9yICJDT05GSUdfREVCVUdfTEwgaXMgaW5jb21wYXRpYmxlIHdpdGggbXVsdGlwbGUgYXJjaHMiCi0jZW5kaWYKKyNlbGlmIGRlZmluZWQgKENPTkZJR19ERUJVR19JTVgzMV9JTVgzNV9VQVJUKQogI2RlZmluZSBVQVJUX1BBRERSCU1YM3hfVUFSVDFfQkFTRV9BRERSCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TT0NfSU1YNTEKLSNpZmRlZiBVQVJUX1BBRERSCi0jZXJyb3IgIkNPTkZJR19ERUJVR19MTCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBhcmNocyIKLSNlbmRpZgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX0RFQlVHX0lNWDUxX1VBUlQpCiAjZGVmaW5lIFVBUlRfUEFERFIJTVg1MV9VQVJUMV9CQVNFX0FERFIKLSNlbmRpZgotCi0vKiBpTVg1MC81MyBoYXZlIHNhbWUgYWRkcmVzc2VzLCBidXQgbm90IGlNWDUxICovCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0lNWDUwKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfSU1YNTMpCi0jaWZkZWYgVUFSVF9QQUREUgotI2Vycm9yICJDT05GSUdfREVCVUdfTEwgaXMgaW5jb21wYXRpYmxlIHdpdGggbXVsdGlwbGUgYXJjaHMiCi0jZW5kaWYKKyNlbGlmIGRlZmluZWQgKENPTkZJR19ERUJVR19JTVg1MF9JTVg1M19VQVJUKQogI2RlZmluZSBVQVJUX1BBRERSCU1YNTNfVUFSVDFfQkFTRV9BRERSCisjZWxpZiBkZWZpbmVkIChDT05GSUdfREVCVUdfSU1YNlFfVUFSVCkKKyNkZWZpbmUgVUFSVF9QQUREUglNWDZRX1VBUlQ0X0JBU0VfQUREUgogI2VuZGlmCiAKICNkZWZpbmUgVUFSVF9WQUREUglJTVhfSU9fQUREUkVTUyhVQVJUX1BBRERSKQogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbGRyCVxycCwgPVVBUlRfUEFERFIJQCBwaHlzaWNhbAogCQlsZHIJXHJ2LCA9VUFSVF9WQUREUglAIHZpcnR1YWwKIAkJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZXZpY2VzLWNvbW1vbi5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKaW5kZXggNTQzNTI1ZC4uZGVmOWJhNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKQEAgLTI2Myw2ICsyNjMsMTQgQEAKIAkJY29uc3Qgc3RydWN0IGlteF9teGNfbmFuZF9kYXRhICpkYXRhLAogCQljb25zdCBzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOwogCitzdHJ1Y3QgaW14X3BhdGFfaW14X2RhdGEgeworCXJlc291cmNlX3NpemVfdCBpb2Jhc2U7CisJcmVzb3VyY2Vfc2l6ZV90IGlvc2l6ZTsKKwlyZXNvdXJjZV9zaXplX3QgaXJxOworfTsKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX3BhdGFfaW14KAorCQljb25zdCBzdHJ1Y3QgaW14X3BhdGFfaW14X2RhdGEgKmRhdGEpOworCiBzdHJ1Y3QgaW14X214Y19wd21fZGF0YSB7CiAJaW50IGlkOwogCXJlc291cmNlX3NpemVfdCBpb2Jhc2U7CkBAIC0zMTMsMyArMzIxLDEzIEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbXhfYWRkX2lteF9kbWEodm9pZCk7CiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbXhfYWRkX2lteF9zZG1hKGNoYXIgKm5hbWUsCiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgaW50IGlycSwgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOworCisjaW5jbHVkZSA8bGludXgvYWhjaV9wbGF0Zm9ybS5oPgorc3RydWN0IGlteF9haGNpX2lteF9kYXRhIHsKKwljb25zdCBjaGFyICpkZXZpZDsKKwlyZXNvdXJjZV9zaXplX3QgaW9iYXNlOworCXJlc291cmNlX3NpemVfdCBpcnE7Cit9Oworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfYWhjaV9pbXgoCisJCWNvbnN0IHN0cnVjdCBpbXhfYWhjaV9pbXhfZGF0YSAqZGF0YSwKKwkJY29uc3Qgc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwppbmRleCAwNjZkNDY0Li5jYTVjZjI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtOSw3MiArOSwxOSBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKy8qIFVudXNlZCwgd2UgdXNlIENPTkZJR19NVUxUSV9JUlFfSEFORExFUiAqLwogCi0jZGVmaW5lIEFWSUNfTklNQVNLCTB4MDQKLQotCUAgdGhpcyBtYWNybyBkaXNhYmxlcyBmYXN0IGlycSAobm90IGltcGxlbWVudGVkKQogCS5tYWNybwlkaXNhYmxlX2ZpcQogCS5lbmRtCiAKIAkubWFjcm8gIGdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgdG1wCi0jaWZuZGVmIENPTkZJR19NWENfVFpJQwotCWxkcglcYmFzZSwgPWF2aWNfYmFzZQotCWxkcglcYmFzZSwgW1xiYXNlXQotI2lmZGVmIENPTkZJR19NWENfSVJRX1BSSU9SCi0JbGRyCXI0LCBbXGJhc2UsICNBVklDX05JTUFTS10KLSNlbmRpZgotI2VsaWYgZGVmaW5lZCBDT05GSUdfTVhDX1RaSUMKLQlsZHIJXGJhc2UsID10emljX2Jhc2UKLQlsZHIJXGJhc2UsIFtcYmFzZV0KLSNlbmRpZiAvKiBDT05GSUdfTVhDX1RaSUMgKi8KIAkuZW5kbQogCiAJLm1hY3JvICBhcmNoX3JldF90b191c2VyLCB0bXAxLCB0bXAyCiAJLmVuZG0KIAotCUAgdGhpcyBtYWNybyBjaGVja3Mgd2hpY2ggaW50ZXJydXB0IG9jY3VycmVkCi0JQCBhbmQgcmV0dXJucyBpdHMgbnVtYmVyIGluIGlycW5yCi0JQCBhbmQgcmV0dXJucyBpZiBhbiBpbnRlcnJ1cHQgb2NjdXJyZWQgaW4gaXJxc3RhdAogCS5tYWNybwlnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLSNpZm5kZWYgQ09ORklHX01YQ19UWklDCi0JQCBMb2FkIG9mZnNldCAmIHByaW9yaXR5IG9mIHRoZSBoaWdoZXN0IHByaW9yaXR5Ci0JQCBpbnRlcnJ1cHQgcGVuZGluZyBmcm9tIEFWSUNfTklWRUNTUgotCWxkcglcaXJxc3RhdCwgW1xiYXNlLCAjMHg0MF0KLQlAIFNoaWZ0IHRvIGdldCB0aGUgZGVjb2RlZCBJUlEgbnVtYmVyLCB1c2luZyBBU1Igc28KLQlAICdubyBpbnRlcnJ1cHQgcGVuZGluZycgYmVjb21lcyAweGZmZmZmZmZmCi0JbW92CVxpcnFuciwgXGlycXN0YXQsIGFzciAjMTYKLQlAIHNldCB6ZXJvIGZsYWcgaWYgSVJRICsgMSA9PSAwCi0JYWRkcwlcdG1wLCBcaXJxbnIsICMxCi0jaWZkZWYgQ09ORklHX01YQ19JUlFfUFJJT1IKLQliaWNuZQlcdG1wLCBcaXJxc3RhdCwgIzB4RkZGRkZGRTAKLQlzdHJuZQlcdG1wLCBbXGJhc2UsICNBVklDX05JTUFTS10KLQlzdHJlcQlyNCwgW1xiYXNlLCAjQVZJQ19OSU1BU0tdCi0jZW5kaWYKLSNlbGlmIGRlZmluZWQgQ09ORklHX01YQ19UWklDCi0JQCBMb2FkIG9mZnNldCAmIHByaW9yaXR5IG9mIHRoZSBoaWdoZXN0IHByaW9yaXR5Ci0JQCBpbnRlcnJ1cHQgcGVuZGluZy4KLQlAIDB4MDgwIGlzIElOVFNFQzAgcmVnaXN0ZXIKLQlAIDB4RDgwIGlzIEhJUE5EMCByZWdpc3RlcgotCW1vdiAgICAgXGlycW5yLCAjMAotMTAwMDoJYWRkCVxpcnFzdGF0LCBcYmFzZSwgXGlycW5yLCBsc3IgIzMKLQlsZHIJXHRtcCwgW1xpcnFzdGF0LCAjMHhkODBdCi0JbGRyCVxpcnFzdGF0LCBbXGlycXN0YXQsICMweDA4MF0KLQlhbmRzCVx0bXAsIFx0bXAsIFxpcnFzdGF0Ci0JYm5lCTEwMDFmCi0JYWRkCVxpcnFuciwgXGlycW5yLCAjMzIKLQljbXAgICAgIFxpcnFuciwgIzEyOAotCWJsbyAgICAgMTAwMGIKLQliICAgICAgIDIwMDFmCi0xMDAxOgltb3YgICAgIFxpcnFzdGF0LCAjMQotMTAwMjoJdHN0ICAgICBcdG1wLCBcaXJxc3RhdAotCWJuZSAgICAgMjAwMmYKLQltb3ZzICAgIFx0bXAsIFx0bXAsIGxzciAjMQotCWFkZG5lICAgXGlycW5yLCBcaXJxbnIsICMxCi0JYm5lICAgICAxMDAyYgotMjAwMToKLQltb3YgIFxpcnFuciwgIzAKLTIwMDI6Ci0JbW92cyBcaXJxbnIsIFxpcnFucgotI2VuZGlmCisJLmVuZG0KKworCS5tYWNybyB0ZXN0X2Zvcl9pcGksIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggMzFjODIwYy4uNDBhOGMxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xLDM5ICsxIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIENvcHlyaWdodCAyMDA4IEp1ZXJnZW4gQmVpc2VydCwga2VybmVsQHBlbmd1dHJvbml4LmRlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19HUElPX0hfXwotI2RlZmluZSBfX0FTTV9BUkNIX01YQ19HUElPX0hfXwotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0KLS8qIFRoZXJlJ3MgYSBvZmYtYnktb25lIGJldHdlZW0gdGhlIGdwaW8gYmFuayBudW1iZXIgYW5kIHRoZSBncGlvY2hpcCAqLwotLyogcmFuZ2UgZS5nLiBHUElPXzFfNSBpcyBncGlvIDUgdW5kZXIgbGludXggKi8KLSNkZWZpbmUgSU1YX0dQSU9fTlIoYmFuaywgbnIpCQkoKChiYW5rKSAtIDEpICogMzIgKyAobnIpKQotCi0vKiB1c2UgZ3Bpb2xpYiBkaXNwYXRjaGVycyAqLwotI2RlZmluZSBncGlvX2dldF92YWx1ZQkJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQkJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCQlfX2dwaW9fY2Fuc2xlZXAKLQotI2RlZmluZSBncGlvX3RvX2lycShncGlvKQkoTVhDX0dQSU9fSVJRX1NUQVJUICsgKGdwaW8pKQotI2RlZmluZSBpcnFfdG9fZ3BpbyhpcnEpCSgoaXJxKSAtIE1YQ19HUElPX0lSUV9TVEFSVCkKLQotI2VuZGlmCisvKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCBhOGJmZDU2Li5hNTk5ZjAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtODEsMTEgKzgxLDIxIEBACiAgKglBSVBTMQkweDUzZjAwMDAwKzB4MTAwMDAwCS0+CTB4ZjU3MDAwMDArMHgxMDAwMDAKICAqCUFJUFMyCTB4NjNmMDAwMDArMHgxMDAwMDAJLT4JMHhmNTMwMDAwMCsweDEwMDAwMAogICogbXg1MToKKyAqCVRaSUMJMHhlMDAwMDAwMCsweDAwNDAwMAktPgkweGY1MDAwMDAwKzB4MDA0MDAwCiAgKglJUkFNCTB4MWZmZTAwMDArMHgwMjAwMDAJLT4JMHhmNGZlMDAwMCsweDAyMDAwMAotICoJREVCVUcJMHg2MDAwMDAwMCsweDEwMDAwMAktPgkweGY1MDAwMDAwKzB4MTAwMDAwCiAgKglTUEJBMAkweDcwMDAwMDAwKzB4MTAwMDAwCS0+CTB4ZjU0MDAwMDArMHgxMDAwMDAKICAqCUFJUFMxCTB4NzNmMDAwMDArMHgxMDAwMDAJLT4JMHhmNTcwMDAwMCsweDEwMDAwMAogICoJQUlQUzIJMHg4M2YwMDAwMCsweDEwMDAwMAktPgkweGY0MzAwMDAwKzB4MTAwMDAwCisgKiBteDUzOgorICoJVFpJQwkweDBmZmZjMDAwKzB4MDA0MDAwCS0+CTB4ZjRiZmMwMDArMHgwMDQwMDAKKyAqCVNQQkEwCTB4NTAwMDAwMDArMHgxMDAwMDAJLT4JMHhmNTQwMDAwMCsweDEwMDAwMAorICoJQUlQUzEJMHg1M2YwMDAwMCsweDEwMDAwMAktPgkweGY1NzAwMDAwKzB4MTAwMDAwCisgKglBSVBTMgkweDYzZjAwMDAwKzB4MTAwMDAwCS0+CTB4ZjUzMDAwMDArMHgxMDAwMDAKKyAqIG14NnE6CisgKglTQ1UJMHgwMGEwMDAwMCsweDAwMTAwMAktPgkweGY0MDAwMDAwKzB4MDAxMDAwCisgKglDQ00JMHgwMjBjNDAwMCsweDAwNDAwMAktPgkweGY0MmM0MDAwKzB4MDA0MDAwCisgKglBTkFUT1AJMHgwMjBjODAwMCsweDAwMTAwMAktPgkweGY0MmM4MDAwKzB4MDAxMDAwCisgKglVQVJUNAkweDAyMWYwMDAwKzB4MDA0MDAwCS0+CTB4ZjQyZjAwMDArMHgwMDQwMDAKICAqLwogI2RlZmluZSBJTVhfSU9fUDJWKHgpCSgJCQkJCQlcCiAJCQkweGY0MDAwMDAwICsJCQkJCVwKQEAgLTk3LDYgKzEwNyw3IEBACiAKICNpbmNsdWRlIDxtYWNoL214Yy5oPgogCisjaW5jbHVkZSA8bWFjaC9teDZxLmg+CiAjaW5jbHVkZSA8bWFjaC9teDUwLmg+CiAjaW5jbHVkZSA8bWFjaC9teDUxLmg+CiAjaW5jbHVkZSA8bWFjaC9teDUzLmg+CkBAIC0xMTYsNCArMTI3LDEwIEBACiAJLnR5cGUgPSBfdHlwZSwJCQkJCQkJXAogfQogCisvKiBUaGVyZSdzIGEgb2ZmLWJ5LW9uZSBiZXR3ZWVtIHRoZSBncGlvIGJhbmsgbnVtYmVyIGFuZCB0aGUgZ3Bpb2NoaXAgKi8KKy8qIHJhbmdlIGUuZy4gR1BJT18xXzUgaXMgZ3BpbyA1IHVuZGVyIGxpbnV4ICovCisjZGVmaW5lIElNWF9HUElPX05SKGJhbmssIG5yKQkJKCgoYmFuaykgLSAxKSAqIDMyICsgKG5yKSkKKworI2RlZmluZSBJTVhfR1BJT19UT19JUlEoZ3BpbykJKE1YQ19HUElPX0lSUV9TVEFSVCArIChncGlvKSkKKwogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTVhDX0hBUkRXQVJFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2kyYy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2kyYy5oCmluZGV4IDRhNWRjNWMuLjM3NWNkZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pMmMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaTJjLmgKQEAgLTExLDE0ICsxMSwxMCBAQAogCiAvKioKICAqIHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSAtIHN0cnVjdHVyZSBvZiBwbGF0Zm9ybSBkYXRhIGZvciBNWEMgSTJDIGRyaXZlcgotICogQGluaXQ6CUluaXRpYWxpc2UgZ3BpbydzIGFuZCBvdGhlciBib2FyZCBzcGVjaWZpYyB0aGluZ3MKLSAqIEBleGl0OglGcmVlIGV2ZXJ5dGhpbmcgaW5pdGlhbGlzZWQgYnkgQGluaXQKICAqIEBiaXRyYXRlOglCdXMgc3BlZWQgbWVhc3VyZWQgaW4gSHoKICAqCiAgKiovCiBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgewotCWludCAoKmluaXQpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmV4aXQpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJaW50IGJpdHJhdGU7CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IDQzNDdhODcuLjMzODMwMGIxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTE0LDMyICsxNCwyMiBAQAogLyogQWxsb3cgSU8gc3BhY2UgdG8gYmUgYW55d2hlcmUgaW4gdGhlIG1lbW9yeSAqLwogI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmZmZmZmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfSU1YMzEpIHx8IGRlZmluZWQoQ09ORklHX1NPQ19JTVgzNSkKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KICNkZWZpbmUgX19hcmNoX2lvcmVtYXAgX19pbXhfaW9yZW1hcAogI2RlZmluZSBfX2FyY2hfaW91bm1hcCBfX2lvdW5tYXAKIAogI2RlZmluZSBhZGRyX2luX21vZHVsZShhZGRyLCBtb2QpIFwKIAkoKHVuc2lnbmVkIGxvbmcpKGFkZHIpIC0gbW9kICMjIF9CQVNFX0FERFIgPCBtb2QgIyMgX1NJWkUpCiAKK2V4dGVybiB2b2lkIF9faW9tZW0gKigqaW14X2lvcmVtYXApKHVuc2lnbmVkIGxvbmcsIHNpemVfdCwgdW5zaWduZWQgaW50KTsKKwogc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKgogX19pbXhfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBtdHlwZSkKIHsKLQlpZiAobXR5cGUgPT0gTVRfREVWSUNFICYmIChjcHVfaXNfbXgzMSgpIHx8IGNwdV9pc19teDM1KCkpKSB7Ci0JCS8qCi0JCSAqIEFjY2VzcyBhbGwgcGVyaXBoZXJhbHMgYmVsb3cgMHg4MDAwMDAwMCBhcyBub25zaGFyZWQgZGV2aWNlCi0JCSAqIG9uIG14MywgYnV0IGxlYXZlIGwyY2MgYWxvbmUuICBPdGhlcndpc2UgY2FjaGUgY29ycnVwdGlvbnMKLQkJICogY2FuIG9jY3VyLgotCQkgKi8KLQkJaWYgKHBoeXNfYWRkciA8IDB4ODAwMDAwMDAgJiYKLQkJCQkhYWRkcl9pbl9tb2R1bGUocGh5c19hZGRyLCBNWDN4X0wyQ0MpKQotCQkJbXR5cGUgPSBNVF9ERVZJQ0VfTk9OU0hBUkVEOwotCX0KLQotCXJldHVybiBfX2FybV9pb3JlbWFwKHBoeXNfYWRkciwgc2l6ZSwgbXR5cGUpOworCWlmIChpbXhfaW9yZW1hcCAhPSBOVUxMKQorCQlyZXR1cm4gaW14X2lvcmVtYXAocGh5c19hZGRyLCBzaXplLCBtdHlwZSk7CisJZWxzZQorCQlyZXR1cm4gX19hcm1faW9yZW1hcChwaHlzX2FkZHIsIHNpemUsIG10eXBlKTsKIH0KLSNlbmRpZgogCiAvKiBpbyBhZGRyZXNzIG1hcHBpbmcgbWFjcm8gKi8KICNkZWZpbmUgX19pbyhhKQkJX190eXBlc2FmZV9pbyhhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14My5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14My5oCmluZGV4IGM5MmYwYjEuLjYzZjIyYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgzLmgKQEAgLTczNSw2ICs3MzUsNyBAQAogI2RlZmluZSBNWDMxX1BJTl9LRVlfQ09MNV9LRVlfQ09MNQlJT01VWF9NT0RFKE1YMzFfUElOX0tFWV9DT0w1LCBJT01VWF9DT05GSUdfRlVOQykKICNkZWZpbmUgTVgzMV9QSU5fS0VZX0NPTDZfS0VZX0NPTDYJSU9NVVhfTU9ERShNWDMxX1BJTl9LRVlfQ09MNiwgSU9NVVhfQ09ORklHX0ZVTkMpCiAjZGVmaW5lIE1YMzFfUElOX0tFWV9DT0w3X0tFWV9DT0w3CUlPTVVYX01PREUoTVgzMV9QSU5fS0VZX0NPTDcsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9XQVRDSERPR19SU1RfX1dBVENIRE9HX1JTVAlJT01VWF9NT0RFKE1YMzFfUElOX1dBVENIRE9HX1JTVCwgSU9NVVhfQ09ORklHX0ZVTkMpCiAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDUxLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXg1MS5oCmluZGV4IGRmNmFjYzAuLmM3ZjUxNjlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXg1MS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDUxLmgKQEAgLTE0LDYgKzE0LDggQEAKICNkZWZpbmUgX19NQUNIX0lPTVVYX01YNTFfSF9fCiAKICNpbmNsdWRlIDxtYWNoL2lvbXV4LXYzLmg+CisjZGVmaW5lIF9fTkFfCTB4MDAwCisKIAogLyogUGFkIGNvbnRyb2wgZ3JvdXBpbmdzICovCiAjZGVmaW5lIE1YNTFfVUFSVF9QQURfQ1RSTAkoUEFEX0NUTF9QS0UgfCBQQURfQ1RMX1BVRSB8IFBBRF9DVExfRFNFX0hJR0ggfCBcCkBAIC00NywxNTIxICs0OSw3NjUgQEAKIAogLyogUmF3IHBpbiBtb2RlcyB3aXRob3V0IHBhZCBjb250cm9sICovCiAvKgkJCQkJCQkgIFBBRCAgICBNVVggQUxUIElOUFNFIFBBVEggUEFEQ1RSTCAqLwotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxNl9fQVVENF9SWEZTCQlJT01VWF9QQUQoMHgzZjAsIDB4NWMsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTZfX0FVRDVfVFhECQlJT01VWF9QQUQoMHgzZjAsIDB4NWMsIDcsIDB4MDhkOCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTZfX0VJTV9EMTYJCUlPTVVYX1BBRCgweDNmMCwgMHg1YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxNl9fR1BJTzJfMAkJSU9NVVhfUEFEKDB4M2YwLCAweDVjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE2X19JMkMxX1NEQQkJSU9NVVhfUEFEKDB4M2YwLCAweDVjLCAweDE0LCAweDA5YjQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE2X19VQVJUMl9DVFMJCUlPTVVYX1BBRCgweDNmMCwgMHg1YywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxNl9fVVNCSDJfREFUQTAJCUlPTVVYX1BBRCgweDNmMCwgMHg1YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxN19fQVVENV9SWEQJCUlPTVVYX1BBRCgweDNmNCwgMHg2MCwgNywgMHgwOGQ0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxN19fRUlNX0QxNwkJSU9NVVhfUEFEKDB4M2Y0LCAweDYwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE3X19HUElPMl8xCQlJT01VWF9QQUQoMHgzZjQsIDB4NjAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTdfX1VBUlQyX1JYRAkJSU9NVVhfUEFEKDB4M2Y0LCAweDYwLCAzLCAweDA5ZWMsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE3X19VQVJUM19DVFMJCUlPTVVYX1BBRCgweDNmNCwgMHg2MCwgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxN19fVVNCSDJfREFUQTEJCUlPTVVYX1BBRCgweDNmNCwgMHg2MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxOF9fQVVENV9UWEMJCUlPTVVYX1BBRCgweDNmOCwgMHg2NCwgNywgMHgwOGU0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxOF9fRUlNX0QxOAkJSU9NVVhfUEFEKDB4M2Y4LCAweDY0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE4X19HUElPMl8yCQlJT01VWF9QQUQoMHgzZjgsIDB4NjQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMThfX1VBUlQyX1RYRAkJSU9NVVhfUEFEKDB4M2Y4LCAweDY0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE4X19VQVJUM19SVFMJCUlPTVVYX1BBRCgweDNmOCwgMHg2NCwgNCwgMHgwOWYwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxOF9fVVNCSDJfREFUQTIJCUlPTVVYX1BBRCgweDNmOCwgMHg2NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxOV9fQVVENF9SWEMJCUlPTVVYX1BBRCgweDNmYywgMHg2OCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxOV9fQVVENV9UWEZTCQlJT01VWF9QQUQoMHgzZmMsIDB4NjgsIDcsIDB4MDhlOCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTlfX0VJTV9EMTkJCUlPTVVYX1BBRCgweDNmYywgMHg2OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxOV9fR1BJTzJfMwkJSU9NVVhfUEFEKDB4M2ZjLCAweDY4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE5X19JMkMxX1NDTAkJSU9NVVhfUEFEKDB4M2ZjLCAweDY4LCAweDE0LCAweDA5YjAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE5X19VQVJUMl9SVFMJCUlPTVVYX1BBRCgweDNmYywgMHg2OCwgMywgMHgwOWU4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxOV9fVVNCSDJfREFUQTMJCUlPTVVYX1BBRCgweDNmYywgMHg2OCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMF9fQVVENF9UWEQJCUlPTVVYX1BBRCgweDQwMCwgMHg2YywgNSwgMHgwOGM4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMF9fRUlNX0QyMAkJSU9NVVhfUEFEKDB4NDAwLCAweDZjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIwX19HUElPMl80CQlJT01VWF9QQUQoMHg0MDAsIDB4NmMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjBfX1NSVENfQUxBUk1fREVCCUlPTVVYX1BBRCgweDQwMCwgMHg2YywgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMF9fVVNCSDJfREFUQTQJCUlPTVVYX1BBRCgweDQwMCwgMHg2YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMV9fQVVENF9SWEQJCUlPTVVYX1BBRCgweDQwNCwgMHg3MCwgNSwgMHgwOGM0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMV9fRUlNX0QyMQkJSU9NVVhfUEFEKDB4NDA0LCAweDcwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIxX19HUElPMl81CQlJT01VWF9QQUQoMHg0MDQsIDB4NzAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjFfX1NSVENfQUxBUk1fREVCCUlPTVVYX1BBRCgweDQwNCwgMHg3MCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMV9fVVNCSDJfREFUQTUJCUlPTVVYX1BBRCgweDQwNCwgMHg3MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMl9fQVVENF9UWEMJCUlPTVVYX1BBRCgweDQwOCwgMHg3NCwgNSwgMHgwOGNjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMl9fRUlNX0QyMgkJSU9NVVhfUEFEKDB4NDA4LCAweDc0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIyX19HUElPMl82CQlJT01VWF9QQUQoMHg0MDgsIDB4NzQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjJfX1VTQkgyX0RBVEE2CQlJT01VWF9QQUQoMHg0MDgsIDB4NzQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjNfX0FVRDRfVFhGUwkJSU9NVVhfUEFEKDB4NDBjLCAweDc4LCA1LCAweDA4ZDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIzX19FSU1fRDIzCQlJT01VWF9QQUQoMHg0MGMsIDB4NzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjNfX0dQSU8yXzcJCUlPTVVYX1BBRCgweDQwYywgMHg3OCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyM19fU1BESUZfT1VUMQkJSU9NVVhfUEFEKDB4NDBjLCAweDc4LCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIzX19VU0JIMl9EQVRBNwkJSU9NVVhfUEFEKDB4NDBjLCAweDc4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI0X19BVUQ2X1JYRlMJCUlPTVVYX1BBRCgweDQxMCwgMHg3YywgNSwgMHgwOGY4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyNF9fRUlNX0QyNAkJSU9NVVhfUEFEKDB4NDEwLCAweDdjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI0X19HUElPMl84CQlJT01VWF9QQUQoMHg0MTAsIDB4N2MsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjRfX0kyQzJfU0RBCQlJT01VWF9QQUQoMHg0MTAsIDB4N2MsIDB4MTQsIDB4MDliYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjRfX1VBUlQzX0NUUwkJSU9NVVhfUEFEKDB4NDEwLCAweDdjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI0X19VU0JPVEdfREFUQTAJCUlPTVVYX1BBRCgweDQxMCwgMHg3YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyNV9fRUlNX0QyNQkJSU9NVVhfUEFEKDB4NDE0LCAweDgwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI1X19LRVlfQ09MNgkJSU9NVVhfUEFEKDB4NDE0LCAweDgwLCAxLCAweDA5YzgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI1X19VQVJUMl9DVFMJCUlPTVVYX1BBRCgweDQxNCwgMHg4MCwgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyNV9fVUFSVDNfUlhECQlJT01VWF9QQUQoMHg0MTQsIDB4ODAsIDMsIDB4MDlmNCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjVfX1VTQk9UR19EQVRBMQkJSU9NVVhfUEFEKDB4NDE0LCAweDgwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI2X19FSU1fRDI2CQlJT01VWF9QQUQoMHg0MTgsIDB4ODQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjZfX0tFWV9DT0w3CQlJT01VWF9QQUQoMHg0MTgsIDB4ODQsIDEsIDB4MDljYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjZfX1VBUlQyX1JUUwkJSU9NVVhfUEFEKDB4NDE4LCAweDg0LCA0LCAweDA5ZTgsIDMsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI2X19VQVJUM19UWEQJCUlPTVVYX1BBRCgweDQxOCwgMHg4NCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyNl9fVVNCT1RHX0RBVEEyCQlJT01VWF9QQUQoMHg0MTgsIDB4ODQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjdfX0FVRDZfUlhDCQlJT01VWF9QQUQoMHg0MWMsIDB4ODgsIDUsIDB4MDhmNCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjdfX0VJTV9EMjcJCUlPTVVYX1BBRCgweDQxYywgMHg4OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyN19fR1BJTzJfOQkJSU9NVVhfUEFEKDB4NDFjLCAweDg4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI3X19JMkMyX1NDTAkJSU9NVVhfUEFEKDB4NDFjLCAweDg4LCAweDE0LCAweDA5YjgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI3X19VQVJUM19SVFMJCUlPTVVYX1BBRCgweDQxYywgMHg4OCwgMywgMHgwOWYwLCAzLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyN19fVVNCT1RHX0RBVEEzCQlJT01VWF9QQUQoMHg0MWMsIDB4ODgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjhfX0FVRDZfVFhECQlJT01VWF9QQUQoMHg0MjAsIDB4OGMsIDUsIDB4MDhmMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjhfX0VJTV9EMjgJCUlPTVVYX1BBRCgweDQyMCwgMHg4YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyOF9fS0VZX1JPVzQJCUlPTVVYX1BBRCgweDQyMCwgMHg4YywgMSwgMHgwOWQwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyOF9fVVNCT1RHX0RBVEE0CQlJT01VWF9QQUQoMHg0MjAsIDB4OGMsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjlfX0FVRDZfUlhECQlJT01VWF9QQUQoMHg0MjQsIDB4OTAsIDUsIDB4MDhlYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjlfX0VJTV9EMjkJCUlPTVVYX1BBRCgweDQyNCwgMHg5MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyOV9fS0VZX1JPVzUJCUlPTVVYX1BBRCgweDQyNCwgMHg5MCwgMSwgMHgwOWQ0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyOV9fVVNCT1RHX0RBVEE1CQlJT01VWF9QQUQoMHg0MjQsIDB4OTAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMzBfX0FVRDZfVFhDCQlJT01VWF9QQUQoMHg0MjgsIDB4OTQsIDUsIDB4MDhmYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMzBfX0VJTV9EMzAJCUlPTVVYX1BBRCgweDQyOCwgMHg5NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QzMF9fS0VZX1JPVzYJCUlPTVVYX1BBRCgweDQyOCwgMHg5NCwgMSwgMHgwOWQ4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QzMF9fVVNCT1RHX0RBVEE2CQlJT01VWF9QQUQoMHg0MjgsIDB4OTQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMzFfX0FVRDZfVFhGUwkJSU9NVVhfUEFEKDB4NDJjLCAweDk4LCA1LCAweDA5MDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDMxX19FSU1fRDMxCQlJT01VWF9QQUQoMHg0MmMsIDB4OTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMzFfX0tFWV9ST1c3CQlJT01VWF9QQUQoMHg0MmMsIDB4OTgsIDEsIDB4MDlkYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMzFfX1VTQk9UR19EQVRBNwkJSU9NVVhfUEFEKDB4NDJjLCAweDk4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTE2X19FSU1fQTE2CQlJT01VWF9QQUQoMHg0MzAsIDB4OWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMTZfX0dQSU8yXzEwCQlJT01VWF9QQUQoMHg0MzAsIDB4OWMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMTZfX09TQ19GUkVRX1NFTDAJSU9NVVhfUEFEKDB4NDMwLCAweDljLCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTE3X19FSU1fQTE3CQlJT01VWF9QQUQoMHg0MzQsIDB4YTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMTdfX0dQSU8yXzExCQlJT01VWF9QQUQoMHg0MzQsIDB4YTAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMTdfX09TQ19GUkVRX1NFTDEJSU9NVVhfUEFEKDB4NDM0LCAweGEwLCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTE4X19CT09UX0xQQjAJCUlPTVVYX1BBRCgweDQzOCwgMHhhNCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0ExOF9fRUlNX0ExOAkJSU9NVVhfUEFEKDB4NDM4LCAweGE0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTE4X19HUElPMl8xMgkJSU9NVVhfUEFEKDB4NDM4LCAweGE0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTE5X19CT09UX0xQQjEJCUlPTVVYX1BBRCgweDQzYywgMHhhOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0ExOV9fRUlNX0ExOQkJSU9NVVhfUEFEKDB4NDNjLCAweGE4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTE5X19HUElPMl8xMwkJSU9NVVhfUEFEKDB4NDNjLCAweGE4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTIwX19CT09UX1VBUlRfU1JDMAlJT01VWF9QQUQoMHg0NDAsIDB4YWMsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjBfX0VJTV9BMjAJCUlPTVVYX1BBRCgweDQ0MCwgMHhhYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyMF9fR1BJTzJfMTQJCUlPTVVYX1BBRCgweDQ0MCwgMHhhYywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyMV9fQk9PVF9VQVJUX1NSQzEJSU9NVVhfUEFEKDB4NDQ0LCAweGIwLCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTIxX19FSU1fQTIxCQlJT01VWF9QQUQoMHg0NDQsIDB4YjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjFfX0dQSU8yXzE1CQlJT01VWF9QQUQoMHg0NDQsIDB4YjAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjJfX0VJTV9BMjIJCUlPTVVYX1BBRCgweDQ0OCwgMHhiNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyMl9fR1BJTzJfMTYJCUlPTVVYX1BBRCgweDQ0OCwgMHhiNCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyM19fQk9PVF9IUE5fRU4JCUlPTVVYX1BBRCgweDQ0YywgMHhiOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyM19fRUlNX0EyMwkJSU9NVVhfUEFEKDB4NDRjLCAweGI4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTIzX19HUElPMl8xNwkJSU9NVVhfUEFEKDB4NDRjLCAweGI4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI0X19FSU1fQTI0CQlJT01VWF9QQUQoMHg0NTAsIDB4YmMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjRfX0dQSU8yXzE4CQlJT01VWF9QQUQoMHg0NTAsIDB4YmMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjRfX1VTQkgyX0NMSwkJSU9NVVhfUEFEKDB4NDUwLCAweGJjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI1X19ESVNQMV9QSU40CQlJT01VWF9QQUQoMHg0NTQsIDB4YzAsIDYsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjVfX0VJTV9BMjUJCUlPTVVYX1BBRCgweDQ1NCwgMHhjMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyNV9fR1BJTzJfMTkJCUlPTVVYX1BBRCgweDQ1NCwgMHhjMCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyNV9fVVNCSDJfRElSCQlJT01VWF9QQUQoMHg0NTQsIDB4YzAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjZfX0NTSTFfREFUQV9FTgkJSU9NVVhfUEFEKDB4NDU4LCAweGM0LCA1LCAweDA5YTAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI2X19ESVNQMl9FWFRfQ0xLCUlPTVVYX1BBRCgweDQ1OCwgMHhjNCwgNiwgMHgwOTA4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyNl9fRUlNX0EyNgkJSU9NVVhfUEFEKDB4NDU4LCAweGM0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI2X19HUElPMl8yMAkJSU9NVVhfUEFEKDB4NDU4LCAweGM0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI2X19VU0JIMl9TVFAJCUlPTVVYX1BBRCgweDQ1OCwgMHhjNCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyN19fQ1NJMl9EQVRBX0VOCQlJT01VWF9QQUQoMHg0NWMsIDB4YzgsIDUsIDB4MDk5YywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjdfX0RJU1AxX1BJTjEJCUlPTVVYX1BBRCgweDQ1YywgMHhjOCwgNiwgMHgwOWE0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyN19fRUlNX0EyNwkJSU9NVVhfUEFEKDB4NDVjLCAweGM4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI3X19HUElPMl8yMQkJSU9NVVhfUEFEKDB4NDVjLCAweGM4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI3X19VU0JIMl9OWFQJCUlPTVVYX1BBRCgweDQ1YywgMHhjOCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCMF9fRUlNX0VCMAkJSU9NVVhfUEFEKDB4NDYwLCAweGNjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIxX19FSU1fRUIxCQlJT01VWF9QQUQoMHg0NjQsIDB4ZDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9FQjJfX0FVRDVfUlhGUwkJSU9NVVhfUEFEKDB4NDY4LCAweGQ0LCA2LCAweDA4ZTAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIyX19DU0kxX0QyCQlJT01VWF9QQUQoMHg0NjgsIDB4ZDQsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9FQjJfX0VJTV9FQjIJCUlPTVVYX1BBRCgweDQ2OCwgMHhkNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCMl9fRkVDX01ESU8JCUlPTVVYX1BBRCgweDQ2OCwgMHhkNCwgMywgMHgwOTU0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCMl9fR1BJTzJfMjIJCUlPTVVYX1BBRCgweDQ2OCwgMHhkNCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCMl9fR1BUX0NNUE9VVDEJCUlPTVVYX1BBRCgweDQ2OCwgMHhkNCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCM19fQVVENV9SWEMJCUlPTVVYX1BBRCgweDQ2YywgMHhkOCwgNiwgMHgwOGRjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCM19fQ1NJMV9EMwkJSU9NVVhfUEFEKDB4NDZjLCAweGQ4LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIzX19FSU1fRUIzCQlJT01VWF9QQUQoMHg0NmMsIDB4ZDgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9FQjNfX0ZFQ19SREFUQTEJCUlPTVVYX1BBRCgweDQ2YywgMHhkOCwgMywgMHgwOTVjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCM19fR1BJTzJfMjMJCUlPTVVYX1BBRCgweDQ2YywgMHhkOCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCM19fR1BUX0NNUE9VVDIJCUlPTVVYX1BBRCgweDQ2YywgMHhkOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX09FX19FSU1fT0UJCUlPTVVYX1BBRCgweDQ3MCwgMHhkYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX09FX19HUElPMl8yNAkJSU9NVVhfUEFEKDB4NDcwLCAweGRjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MwX19FSU1fQ1MwCQlJT01VWF9QQUQoMHg0NzQsIDB4ZTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzBfX0dQSU8yXzI1CQlJT01VWF9QQUQoMHg0NzQsIDB4ZTAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzFfX0VJTV9DUzEJCUlPTVVYX1BBRCgweDQ3OCwgMHhlNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTMV9fR1BJTzJfMjYJCUlPTVVYX1BBRCgweDQ3OCwgMHhlNCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTMl9fQVVENV9UWEQJCUlPTVVYX1BBRCgweDQ3YywgMHhlOCwgNiwgMHgwOGQ4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTMl9fQ1NJMV9ENAkJSU9NVVhfUEFEKDB4NDdjLCAweGU4LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MyX19FSU1fQ1MyCQlJT01VWF9QQUQoMHg0N2MsIDB4ZTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzJfX0ZFQ19SREFUQTIJCUlPTVVYX1BBRCgweDQ3YywgMHhlOCwgMywgMHgwOTYwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTMl9fR1BJTzJfMjcJCUlPTVVYX1BBRCgweDQ3YywgMHhlOCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTMl9fVVNCT1RHX1NUUAkJSU9NVVhfUEFEKDB4NDdjLCAweGU4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MzX19BVUQ1X1JYRAkJSU9NVVhfUEFEKDB4NDgwLCAweGVjLCA2LCAweDA4ZDQsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MzX19DU0kxX0Q1CQlJT01VWF9QQUQoMHg0ODAsIDB4ZWMsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzNfX0VJTV9DUzMJCUlPTVVYX1BBRCgweDQ4MCwgMHhlYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTM19fRkVDX1JEQVRBMwkJSU9NVVhfUEFEKDB4NDgwLCAweGVjLCAzLCAweDA5NjQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MzX19HUElPMl8yOAkJSU9NVVhfUEFEKDB4NDgwLCAweGVjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MzX19VU0JPVEdfTlhUCQlJT01VWF9QQUQoMHg0ODAsIDB4ZWMsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzRfX0FVRDVfVFhDCQlJT01VWF9QQUQoMHg0ODQsIDB4ZjAsIDYsIDB4MDhlNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzRfX0NTSTFfRDYJCUlPTVVYX1BBRCgweDQ4NCwgMHhmMCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTNF9fRUlNX0NTNAkJSU9NVVhfUEFEKDB4NDg0LCAweGYwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1M0X19GRUNfUlhfRVIJCUlPTVVYX1BBRCgweDQ4NCwgMHhmMCwgMywgMHgwOTcwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTNF9fR1BJTzJfMjkJCUlPTVVYX1BBRCgweDQ4NCwgMHhmMCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTNF9fVVNCT1RHX0NMSwkJSU9NVVhfUEFEKDB4NDg0LCAweGYwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1M1X19BVUQ1X1RYRlMJCUlPTVVYX1BBRCgweDQ4OCwgMHhmNCwgNiwgMHgwOGU4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTNV9fQ1NJMV9ENwkJSU9NVVhfUEFEKDB4NDg4LCAweGY0LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1M1X19ESVNQMV9FWFRfQ0xLCUlPTVVYX1BBRCgweDQ4OCwgMHhmNCwgNCwgMHgwOTA0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTNV9fRUlNX0NTNQkJSU9NVVhfUEFEKDB4NDg4LCAweGY0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1M1X19GRUNfQ1JTCQlJT01VWF9QQUQoMHg0ODgsIDB4ZjQsIDMsIDB4MDk1MCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzVfX0dQSU8yXzMwCQlJT01VWF9QQUQoMHg0ODgsIDB4ZjQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzVfX1VTQk9UR19ESVIJCUlPTVVYX1BBRCgweDQ4OCwgMHhmNCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RUQUNLX19FSU1fRFRBQ0sJCUlPTVVYX1BBRCgweDQ4YywgMHhmOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RUQUNLX19HUElPMl8zMQkJSU9NVVhfUEFEKDB4NDhjLCAweGY4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fTEJBX19FSU1fTEJBCQlJT01VWF9QQUQoMHg0OTQsIDB4ZmMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9MQkFfX0dQSU8zXzEJCUlPTVVYX1BBRCgweDQ5NCwgMHhmYywgMSwgMHgwOTc4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NSRV9fRUlNX0NSRQkJSU9NVVhfUEFEKDB4NGEwLCAweDEwMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NSRV9fR1BJTzNfMgkJSU9NVVhfUEFEKDB4NGEwLCAweDEwMCwgMSwgMHgwOTdjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRFJBTV9DUzFfX0RSQU1fQ1MxCQlJT01VWF9QQUQoMHg0ZDAsIDB4MTA0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9XRV9CX19HUElPM18zCQlJT01VWF9QQUQoMHg0ZTQsIDB4MTA4LCAzLCAweDA5ODAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9XRV9CX19OQU5ERl9XRV9CCUlPTVVYX1BBRCgweDRlNCwgMHgxMDgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1dFX0JfX1BBVEFfRElPVwkJSU9NVVhfUEFEKDB4NGU0LCAweDEwOCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfV0VfQl9fU0QzX0RBVEEwCQlJT01VWF9QQUQoMHg0ZTQsIDB4MTA4LCAyLCAweDA5M2MsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SRV9CX19HUElPM180CQlJT01VWF9QQUQoMHg0ZTgsIDB4MTBjLCAzLCAweDA5ODQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SRV9CX19OQU5ERl9SRV9CCUlPTVVYX1BBRCgweDRlOCwgMHgxMGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JFX0JfX1BBVEFfRElPUgkJSU9NVVhfUEFEKDB4NGU4LCAweDEwYywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkVfQl9fU0QzX0RBVEExCQlJT01VWF9QQUQoMHg0ZTgsIDB4MTBjLCAyLCAweDA5NDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9BTEVfX0dQSU8zXzUJCUlPTVVYX1BBRCgweDRlYywgMHgxMTAsIDMsIDB4MDk4OCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0FMRV9fTkFOREZfQUxFCQlJT01VWF9QQUQoMHg0ZWMsIDB4MTEwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9BTEVfX1BBVEFfQlVGRkVSX0VOCUlPTVVYX1BBRCgweDRlYywgMHgxMTAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NMRV9fR1BJTzNfNgkJSU9NVVhfUEFEKDB4NGYwLCAweDExNCwgMywgMHgwOThjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ0xFX19OQU5ERl9DTEUJCUlPTVVYX1BBRCgweDRmMCwgMHgxMTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NMRV9fUEFUQV9SRVNFVF9CCUlPTVVYX1BBRCgweDRmMCwgMHgxMTQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1dQX0JfX0dQSU8zXzcJCUlPTVVYX1BBRCgweDRmNCwgMHgxMTgsIDMsIDB4MDk5MCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1dQX0JfX05BTkRGX1dQX0IJSU9NVVhfUEFEKDB4NGY0LCAweDExOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfV1BfQl9fUEFUQV9ETUFDSwlJT01VWF9QQUQoMHg0ZjQsIDB4MTE4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9XUF9CX19TRDNfREFUQTIJCUlPTVVYX1BBRCgweDRmNCwgMHgxMTgsIDIsIDB4MDk0NCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMF9fRUNTUEkyX1NTMQkJSU9NVVhfUEFEKDB4NGY4LCAweDExYywgNSwgMHgwOTMwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIwX19HUElPM184CQlJT01VWF9QQUQoMHg0ZjgsIDB4MTFjLCAzLCAweDA5OTQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjBfX05BTkRGX1JCMAkJSU9NVVhfUEFEKDB4NGY4LCAweDExYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIwX19QQVRBX0RNQVJRCQlJT01VWF9QQUQoMHg0ZjgsIDB4MTFjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjBfX1NEM19EQVRBMwkJSU9NVVhfUEFEKDB4NGY4LCAweDExYywgMiwgMHgwOTQ4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIxX19DU1BJX01PU0kJCUlPTVVYX1BBRCgweDRmYywgMHgxMjAsIDYsIDB4MDkxYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMV9fRUNTUEkyX1JEWQkJSU9NVVhfUEFEKDB4NGZjLCAweDEyMCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIxX19HUElPM185CQlJT01VWF9QQUQoMHg0ZmMsIDB4MTIwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjFfX05BTkRGX1JCMQkJSU9NVVhfUEFEKDB4NGZjLCAweDEyMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIxX19QQVRBX0lPUkRZCQlJT01VWF9QQUQoMHg0ZmMsIDB4MTIwLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjFfX1NENF9DTUQJCUlPTVVYX1BBRCgweDRmYywgMHgxMjAsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMl9fRElTUDJfV0FJVAkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgNSwgMHgwOWE4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIyX19FQ1NQSTJfU0NMSwlJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjJfX0ZFQ19DT0wJCUlPTVVYX1BBRCgweDUwMCwgMHgxMjQsIDEsIDB4MDk0YywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMl9fR1BJTzNfMTAJCUlPTVVYX1BBRCgweDUwMCwgMHgxMjQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMl9fTkFOREZfUkIyCQlJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjJfX1VTQkgzX0gzX0RQCUlPTVVYX1BBRCgweDUwMCwgMHgxMjQsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMl9fVVNCSDNfTlhUCQlJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCA2LCAweDBhMjAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjNfX0RJU1AxX1dBSVQJCUlPTVVYX1BBRCgweDUwNCwgMHgxMjgsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCM19fRUNTUEkyX01JU08JSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIzX19GRUNfUlhfQ0xLCQlJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCAxLCAweDA5NjgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjNfX0dQSU8zXzExCQlJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjNfX05BTkRGX1JCMwkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIzX19VU0JIM19DTEsJCUlPTVVYX1BBRCgweDUwNCwgMHgxMjgsIDYsIDB4MDlmOCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCM19fVVNCSDNfSDNfRE0JSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJT19OQU5EX19HUElPX05BTkQJCUlPTVVYX1BBRCgweDUxNCwgMHgxMmMsIDAsIDB4MDk5OCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU9fTkFORF9fUEFUQV9JTlRSUQkJSU9NVVhfUEFEKDB4NTE0LCAweDEyYywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MwX19HUElPM18xNgkJSU9NVVhfUEFEKDB4NTE4LCAweDEzMCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MwX19OQU5ERl9DUzAJCUlPTVVYX1BBRCgweDUxOCwgMHgxMzAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTMV9fR1BJTzNfMTcJCUlPTVVYX1BBRCgweDUxYywgMHgxMzQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTMV9fTkFOREZfQ1MxCQlJT01VWF9QQUQoMHg1MWMsIDB4MTM0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzJfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4NTIwLCAweDEzOCwgNiwgMHgwOTE0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MyX19GRUNfVFhfRVIJCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTMl9fR1BJTzNfMTgJCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTMl9fTkFOREZfQ1MyCQlJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzJfX1BBVEFfQ1NfMAkJSU9NVVhfUEFEKDB4NTIwLCAweDEzOCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MyX19TRDRfQ0xLCQlJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzJfX1VTQkgzX0gxX0RQCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTM19fRkVDX01EQwkJSU9NVVhfUEFEKDB4NTI0LCAweDEzYywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MzX19HUElPM18xOQkJSU9NVVhfUEFEKDB4NTI0LCAweDEzYywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MzX19OQU5ERl9DUzMJCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTM19fUEFUQV9DU18xCQlJT01VWF9QQUQoMHg1MjQsIDB4MTNjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzNfX1NENF9EQVQwCQlJT01VWF9QQUQoMHg1MjQsIDB4MTNjLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzNfX1VTQkgzX0gxX0RNCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNF9fRkVDX1REQVRBMQkJSU9NVVhfUEFEKDB4NTI4LCAweDE0MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M0X19HUElPM18yMAkJSU9NVVhfUEFEKDB4NTI4LCAweDE0MCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M0X19OQU5ERl9DUzQJCUlPTVVYX1BBRCgweDUyOCwgMHgxNDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNF9fUEFUQV9EQV8wCQlJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzRfX1NENF9EQVQxCQlJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzRfX1VTQkgzX1NUUAkJSU9NVVhfUEFEKDB4NTI4LCAweDE0MCwgNywgMHgwYTI0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M1X19GRUNfVERBVEEyCQlJT01VWF9QQUQoMHg1MmMsIDB4MTQ0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzVfX0dQSU8zXzIxCQlJT01VWF9QQUQoMHg1MmMsIDB4MTQ0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzVfX05BTkRGX0NTNQkJSU9NVVhfUEFEKDB4NTJjLCAweDE0NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M1X19QQVRBX0RBXzEJCUlPTVVYX1BBRCgweDUyYywgMHgxNDQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNV9fU0Q0X0RBVDIJCUlPTVVYX1BBRCgweDUyYywgMHgxNDQsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNV9fVVNCSDNfRElSCQlJT01VWF9QQUQoMHg1MmMsIDB4MTQ0LCA3LCAweDBhMWMsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzZfX0NTUElfU1MzCQlJT01VWF9QQUQoMHg1MzAsIDB4MTQ4LCA3LCAweDA5MjgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzZfX0ZFQ19UREFUQTMJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNl9fR1BJTzNfMjIJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNl9fTkFOREZfQ1M2CQlJT01VWF9QQUQoMHg1MzAsIDB4MTQ4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzZfX1BBVEFfREFfMgkJSU9NVVhfUEFEKDB4NTMwLCAweDE0OCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M2X19TRDRfREFUMwkJSU9NVVhfUEFEKDB4NTMwLCAweDE0OCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M3X19GRUNfVFhfRU4JCUlPTVVYX1BBRCgweDUzNCwgMHgxNGMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTN19fR1BJTzNfMjMJCUlPTVVYX1BBRCgweDUzNCwgMHgxNGMsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTN19fTkFOREZfQ1M3CQlJT01VWF9QQUQoMHg1MzQsIDB4MTRjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzdfX1NEM19DTEsJCUlPTVVYX1BBRCgweDUzNCwgMHgxNGMsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0VDU1BJMl9TUzAJSU9NVVhfUEFEKDB4NTM4LCAweDE1MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fRkVDX1RYX0NMSwlJT01VWF9QQUQoMHg1MzgsIDB4MTUwLCAxLCAweDA5NzQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19HUElPM18yNAlJT01VWF9QQUQoMHg1MzgsIDB4MTUwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19OQU5ERl9SRFlfSU5UCUlPTVVYX1BBRCgweDUzOCwgMHgxNTAsIDAsIDB4MDkzOCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JEWV9JTlRfX1NEM19DTUQJSU9NVVhfUEFEKDB4NTM4LCAweDE1MCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDE1X19FQ1NQSTJfTU9TSQlJT01VWF9QQUQoMHg1M2MsIDB4MTU0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTVfX0dQSU8zXzI1CQlJT01VWF9QQUQoMHg1M2MsIDB4MTU0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTVfX05BTkRGX0QxNQkJSU9NVVhfUEFEKDB4NTNjLCAweDE1NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDE1X19QQVRBX0RBVEExNQlJT01VWF9QQUQoMHg1M2MsIDB4MTU0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTVfX1NEM19EQVQ3CQlJT01VWF9QQUQoMHg1M2MsIDB4MTU0LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTRfX0VDU1BJMl9TUzMJCUlPTVVYX1BBRCgweDU0MCwgMHgxNTgsIDIsIDB4MDkzNCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxNF9fR1BJTzNfMjYJCUlPTVVYX1BBRCgweDU0MCwgMHgxNTgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxNF9fTkFOREZfRDE0CQlJT01VWF9QQUQoMHg1NDAsIDB4MTU4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTRfX1BBVEFfREFUQTE0CUlPTVVYX1BBRCgweDU0MCwgMHgxNTgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxNF9fU0QzX0RBVDYJCUlPTVVYX1BBRCgweDU0MCwgMHgxNTgsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxM19fRUNTUEkyX1NTMgkJSU9NVVhfUEFEKDB4NTQ0LCAweDE1YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEzX19HUElPM18yNwkJSU9NVVhfUEFEKDB4NTQ0LCAweDE1YywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEzX19OQU5ERl9EMTMJCUlPTVVYX1BBRCgweDU0NCwgMHgxNWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxM19fUEFUQV9EQVRBMTMJSU9NVVhfUEFEKDB4NTQ0LCAweDE1YywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEzX19TRDNfREFUNQkJSU9NVVhfUEFEKDB4NTQ0LCAweDE1YywgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEyX19FQ1NQSTJfU1MxCQlJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCAyLCAweDA5MzAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTJfX0dQSU8zXzI4CQlJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTJfX05BTkRGX0QxMgkJSU9NVVhfUEFEKDB4NTQ4LCAweDE2MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEyX19QQVRBX0RBVEExMglJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTJfX1NEM19EQVQ0CQlJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTFfX0ZFQ19SWF9EVgkJSU9NVVhfUEFEKDB4NTRjLCAweDE2NCwgMiwgMHgwOTZjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDExX19HUElPM18yOQkJSU9NVVhfUEFEKDB4NTRjLCAweDE2NCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDExX19OQU5ERl9EMTEJCUlPTVVYX1BBRCgweDU0YywgMHgxNjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxMV9fUEFUQV9EQVRBMTEJSU9NVVhfUEFEKDB4NTRjLCAweDE2NCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDExX19TRDNfREFUQTMJCUlPTVVYX1BBRCgweDU0YywgMHgxNjQsIDUsIDB4MDk0OCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxMF9fR1BJTzNfMzAJCUlPTVVYX1BBRCgweDU1MCwgMHgxNjgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxMF9fTkFOREZfRDEwCQlJT01VWF9QQUQoMHg1NTAsIDB4MTY4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTBfX1BBVEFfREFUQTEwCUlPTVVYX1BBRCgweDU1MCwgMHgxNjgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxMF9fU0QzX0RBVEEyCQlJT01VWF9QQUQoMHg1NTAsIDB4MTY4LCA1LCAweDA5NDQsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EOV9fRkVDX1JEQVRBMAkJSU9NVVhfUEFEKDB4NTU0LCAweDE2YywgMHgxMiwgMHgwOTU4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDlfX0dQSU8zXzMxCQlJT01VWF9QQUQoMHg1NTQsIDB4MTZjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EOV9fTkFOREZfRDkJCUlPTVVYX1BBRCgweDU1NCwgMHgxNmMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q5X19QQVRBX0RBVEE5CQlJT01VWF9QQUQoMHg1NTQsIDB4MTZjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EOV9fU0QzX0RBVEExCQlJT01VWF9QQUQoMHg1NTQsIDB4MTZjLCA1LCAweDA5NDAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EOF9fRkVDX1REQVRBMAkJSU9NVVhfUEFEKDB4NTU4LCAweDE3MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDhfX0dQSU80XzAJCUlPTVVYX1BBRCgweDU1OCwgMHgxNzAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q4X19OQU5ERl9EOAkJSU9NVVhfUEFEKDB4NTU4LCAweDE3MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDhfX1BBVEFfREFUQTgJCUlPTVVYX1BBRCgweDU1OCwgMHgxNzAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q4X19TRDNfREFUQTAJCUlPTVVYX1BBRCgweDU1OCwgMHgxNzAsIDUsIDB4MDkzYywgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q3X19HUElPNF8xCQlJT01VWF9QQUQoMHg1NWMsIDB4MTc0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EN19fTkFOREZfRDcJCUlPTVVYX1BBRCgweDU1YywgMHgxNzQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q3X19QQVRBX0RBVEE3CQlJT01VWF9QQUQoMHg1NWMsIDB4MTc0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EN19fVVNCSDNfREFUQTAJCUlPTVVYX1BBRCgweDU1YywgMHgxNzQsIDUsIDB4MDlmYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q2X19HUElPNF8yCQlJT01VWF9QQUQoMHg1NjAsIDB4MTc4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9ENl9fTkFOREZfRDYJCUlPTVVYX1BBRCgweDU2MCwgMHgxNzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q2X19QQVRBX0RBVEE2CQlJT01VWF9QQUQoMHg1NjAsIDB4MTc4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9ENl9fU0Q0X0xDVEwJCUlPTVVYX1BBRCgweDU2MCwgMHgxNzgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q2X19VU0JIM19EQVRBMQkJSU9NVVhfUEFEKDB4NTYwLCAweDE3OCwgNSwgMHgwYTAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDVfX0dQSU80XzMJCUlPTVVYX1BBRCgweDU2NCwgMHgxN2MsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q1X19OQU5ERl9ENQkJSU9NVVhfUEFEKDB4NTY0LCAweDE3YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDVfX1BBVEFfREFUQTUJCUlPTVVYX1BBRCgweDU2NCwgMHgxN2MsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q1X19TRDRfV1AJCUlPTVVYX1BBRCgweDU2NCwgMHgxN2MsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q1X19VU0JIM19EQVRBMgkJSU9NVVhfUEFEKDB4NTY0LCAweDE3YywgNSwgMHgwYTA0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDRfX0dQSU80XzQJCUlPTVVYX1BBRCgweDU2OCwgMHgxODAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q0X19OQU5ERl9ENAkJSU9NVVhfUEFEKDB4NTY4LCAweDE4MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDRfX1BBVEFfREFUQTQJCUlPTVVYX1BBRCgweDU2OCwgMHgxODAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q0X19TRDRfQ0QJCUlPTVVYX1BBRCgweDU2OCwgMHgxODAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q0X19VU0JIM19EQVRBMwkJSU9NVVhfUEFEKDB4NTY4LCAweDE4MCwgNSwgMHgwYTA4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDNfX0dQSU80XzUJCUlPTVVYX1BBRCgweDU2YywgMHgxODQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QzX19OQU5ERl9EMwkJSU9NVVhfUEFEKDB4NTZjLCAweDE4NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDNfX1BBVEFfREFUQTMJCUlPTVVYX1BBRCgweDU2YywgMHgxODQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QzX19TRDRfREFUNAkJSU9NVVhfUEFEKDB4NTZjLCAweDE4NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDNfX1VTQkgzX0RBVEE0CQlJT01VWF9QQUQoMHg1NmMsIDB4MTg0LCA1LCAweDBhMGMsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMl9fR1BJTzRfNgkJSU9NVVhfUEFEKDB4NTcwLCAweDE4OCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDJfX05BTkRGX0QyCQlJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMl9fUEFUQV9EQVRBMgkJSU9NVVhfUEFEKDB4NTcwLCAweDE4OCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDJfX1NENF9EQVQ1CQlJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMl9fVVNCSDNfREFUQTUJCUlPTVVYX1BBRCgweDU3MCwgMHgxODgsIDUsIDB4MGExMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxX19HUElPNF83CQlJT01VWF9QQUQoMHg1NzQsIDB4MThjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMV9fTkFOREZfRDEJCUlPTVVYX1BBRCgweDU3NCwgMHgxOGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxX19QQVRBX0RBVEExCQlJT01VWF9QQUQoMHg1NzQsIDB4MThjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMV9fU0Q0X0RBVDYJCUlPTVVYX1BBRCgweDU3NCwgMHgxOGMsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxX19VU0JIM19EQVRBNgkJSU9NVVhfUEFEKDB4NTc0LCAweDE4YywgNSwgMHgwYTE0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDBfX0dQSU80XzgJCUlPTVVYX1BBRCgweDU3OCwgMHgxOTAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QwX19OQU5ERl9EMAkJSU9NVVhfUEFEKDB4NTc4LCAweDE5MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDBfX1BBVEFfREFUQTAJCUlPTVVYX1BBRCgweDU3OCwgMHgxOTAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QwX19TRDRfREFUNwkJSU9NVVhfUEFEKDB4NTc4LCAweDE5MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDBfX1VTQkgzX0RBVEE3CQlJT01VWF9QQUQoMHg1NzgsIDB4MTkwLCA1LCAweDBhMTgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0Q4X19DU0kxX0Q4CQlJT01VWF9QQUQoMHg1N2MsIDB4MTk0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0Q4X19HUElPM18xMgkJSU9NVVhfUEFEKDB4NTdjLCAweDE5NCwgMywgMHgwOTk4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9EOV9fQ1NJMV9EOQkJSU9NVVhfUEFEKDB4NTgwLCAweDE5OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9EOV9fR1BJTzNfMTMJCUlPTVVYX1BBRCgweDU4MCwgMHgxOTgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfRDEwX19DU0kxX0QxMAkJSU9NVVhfUEFEKDB4NTg0LCAweDE5YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9EMTFfX0NTSTFfRDExCQlJT01VWF9QQUQoMHg1ODgsIDB4MWEwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0QxMl9fQ1NJMV9EMTIJCUlPTVVYX1BBRCgweDU4YywgMHgxYTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfRDEzX19DU0kxX0QxMwkJSU9NVVhfUEFEKDB4NTkwLCAweDFhOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9EMTRfX0NTSTFfRDE0CQlJT01VWF9QQUQoMHg1OTQsIDB4MWFjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0QxNV9fQ1NJMV9EMTUJCUlPTVVYX1BBRCgweDU5OCwgMHgxYjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfRDE2X19DU0kxX0QxNgkJSU9NVVhfUEFEKDB4NTljLCAweDFiNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9EMTdfX0NTSTFfRDE3CQlJT01VWF9QQUQoMHg1YTAsIDB4MWI4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0QxOF9fQ1NJMV9EMTgJCUlPTVVYX1BBRCgweDVhNCwgMHgxYmMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfRDE5X19DU0kxX0QxOQkJSU9NVVhfUEFEKDB4NWE4LCAweDFjMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9WU1lOQ19fQ1NJMV9WU1lOQwlJT01VWF9QQUQoMHg1YWMsIDB4MWM0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX1ZTWU5DX19HUElPM18xNAkJSU9NVVhfUEFEKDB4NWFjLCAweDFjNCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9IU1lOQ19fQ1NJMV9IU1lOQwlJT01VWF9QQUQoMHg1YjAsIDB4MWM4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0hTWU5DX19HUElPM18xNQkJSU9NVVhfUEFEKDB4NWIwLCAweDFjOCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9QSVhDTEtfX0NTSTFfUElYQ0xLCUlPTVVYX1BBRCgweDViNCwgMHgwMDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfTUNMS19fQ1NJMV9NQ0xLCQlJT01VWF9QQUQoMHg1YjgsIDB4MDAwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX0QxMl9fQ1NJMl9EMTIJCUlPTVVYX1BBRCgweDViYywgMHgxY2MsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfRDEyX19HUElPNF85CQlJT01VWF9QQUQoMHg1YmMsIDB4MWNjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX0QxM19fQ1NJMl9EMTMJCUlPTVVYX1BBRCgweDVjMCwgMHgxZDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfRDEzX19HUElPNF8xMAkJSU9NVVhfUEFEKDB4NWMwLCAweDFkMCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9EMTRfX0NTSTJfRDE0CQlJT01VWF9QQUQoMHg1YzQsIDB4MWQ0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX0QxNV9fQ1NJMl9EMTUJCUlPTVVYX1BBRCgweDVjOCwgMHgxZDgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfRDE2X19DU0kyX0QxNgkJSU9NVVhfUEFEKDB4NWNjLCAweDFkYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9EMTdfX0NTSTJfRDE3CQlJT01VWF9QQUQoMHg1ZDAsIDB4MWUwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX0QxOF9fQ1NJMl9EMTgJCUlPTVVYX1BBRCgweDVkNCwgMHgxZTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfRDE4X19HUElPNF8xMQkJSU9NVVhfUEFEKDB4NWQ0LCAweDFlNCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9EMTlfX0NTSTJfRDE5CQlJT01VWF9QQUQoMHg1ZDgsIDB4MWU4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX0QxOV9fR1BJTzRfMTIJCUlPTVVYX1BBRCgweDVkOCwgMHgxZTgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfVlNZTkNfX0NTSTJfVlNZTkMJSU9NVVhfUEFEKDB4NWRjLCAweDFlYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9WU1lOQ19fR1BJTzRfMTMJCUlPTVVYX1BBRCgweDVkYywgMHgxZWMsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfSFNZTkNfX0NTSTJfSFNZTkMJSU9NVVhfUEFEKDB4NWUwLCAweDFmMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9IU1lOQ19fR1BJTzRfMTQJCUlPTVVYX1BBRCgweDVlMCwgMHgxZjAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfUElYQ0xLX19DU0kyX1BJWENMSwlJT01VWF9QQUQoMHg1ZTQsIDB4MWY0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX1BJWENMS19fR1BJTzRfMTUJCUlPTVVYX1BBRCgweDVlNCwgMHgxZjQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0kyQzFfQ0xLX19HUElPNF8xNgkJSU9NVVhfUEFEKDB4NWU4LCAweDFmOCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfSTJDMV9DTEtfX0kyQzFfQ0xLCQlJT01VWF9QQUQoMHg1ZTgsIDB4MWY4LCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9JMkMxX0RBVF9fR1BJTzRfMTcJCUlPTVVYX1BBRCgweDVlYywgMHgxZmMsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0kyQzFfREFUX19JMkMxX0RBVAkJSU9NVVhfUEFEKDB4NWVjLCAweDFmYywgMHgxMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQVVEM19CQl9UWERfX0FVRDNfVFhECQlJT01VWF9QQUQoMHg1ZjAsIDB4MjAwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9BVUQzX0JCX1RYRF9fR1BJTzRfMTgJCUlPTVVYX1BBRCgweDVmMCwgMHgyMDAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0FVRDNfQkJfUlhEX19BVUQzX1JYRAkJSU9NVVhfUEFEKDB4NWY0LCAweDIwNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQVVEM19CQl9SWERfX0dQSU80XzE5CQlJT01VWF9QQUQoMHg1ZjQsIDB4MjA0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9BVUQzX0JCX1JYRF9fVUFSVDNfUlhECUlPTVVYX1BBRCgweDVmNCwgMHgyMDQsIDEsIDB4MDlmNCwgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0FVRDNfQkJfQ0tfX0FVRDNfVFhDCQlJT01VWF9QQUQoMHg1ZjgsIDB4MjA4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9BVUQzX0JCX0NLX19HUElPNF8yMAkJSU9NVVhfUEFEKDB4NWY4LCAweDIwOCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQVVEM19CQl9GU19fQVVEM19UWEZTCQlJT01VWF9QQUQoMHg1ZmMsIDB4MjBjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9BVUQzX0JCX0ZTX19HUElPNF8yMQkJSU9NVVhfUEFEKDB4NWZjLCAweDIwYywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQVVEM19CQl9GU19fVUFSVDNfVFhECQlJT01VWF9QQUQoMHg1ZmMsIDB4MjBjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9NT1NJX19FQ1NQSTFfTU9TSQlJT01VWF9QQUQoMHg2MDAsIDB4MjEwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9NT1NJX19HUElPNF8yMgkJSU9NVVhfUEFEKDB4NjAwLCAweDIxMCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NQSTFfTU9TSV9fSTJDMV9TREEJCUlPTVVYX1BBRCgweDYwMCwgMHgyMTAsIDB4MTEsIDB4MDliNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX01JU09fX0FVRDRfUlhECQlJT01VWF9QQUQoMHg2MDQsIDB4MjE0LCAxLCAweDA4YzQsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9NSVNPX19FQ1NQSTFfTUlTTwlJT01VWF9QQUQoMHg2MDQsIDB4MjE0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9NSVNPX19HUElPNF8yMwkJSU9NVVhfUEFEKDB4NjA0LCAweDIxNCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NQSTFfU1MwX19BVUQ0X1RYQwkJSU9NVVhfUEFEKDB4NjA4LCAweDIxOCwgMSwgMHgwOGNjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NQSTFfU1MwX19FQ1NQSTFfU1MwCQlJT01VWF9QQUQoMHg2MDgsIDB4MjE4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9TUzBfX0dQSU80XzI0CQlJT01VWF9QQUQoMHg2MDgsIDB4MjE4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9TUzFfX0FVRDRfVFhECQlJT01VWF9QQUQoMHg2MGMsIDB4MjFjLCAxLCAweDA4YzgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9TUzFfX0VDU1BJMV9TUzEJCUlPTVVYX1BBRCgweDYwYywgMHgyMWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1NTMV9fR1BJTzRfMjUJCUlPTVVYX1BBRCgweDYwYywgMHgyMWMsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1JEWV9fQVVENF9UWEZTCQlJT01VWF9QQUQoMHg2MTAsIDB4MjIwLCAxLCAweDA4ZDAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9SRFlfX0VDU1BJMV9SRFkJCUlPTVVYX1BBRCgweDYxMCwgMHgyMjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1JEWV9fR1BJTzRfMjYJCUlPTVVYX1BBRCgweDYxMCwgMHgyMjAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1NDTEtfX0VDU1BJMV9TQ0xLCUlPTVVYX1BBRCgweDYxNCwgMHgyMjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1NDTEtfX0dQSU80XzI3CQlJT01VWF9QQUQoMHg2MTQsIDB4MjI0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9TQ0xLX19JMkMxX1NDTAkJSU9NVVhfUEFEKDB4NjE0LCAweDIyNCwgMHgxMSwgMHgwOWIwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDFfUlhEX19HUElPNF8yOAkJSU9NVVhfUEFEKDB4NjE4LCAweDIyOCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDFfUlhEX19VQVJUMV9SWEQJCUlPTVVYX1BBRCgweDYxOCwgMHgyMjgsIDAsIDB4MDllNCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQxX1RYRF9fR1BJTzRfMjkJCUlPTVVYX1BBRCgweDYxYywgMHgyMmMsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQxX1RYRF9fUFdNMl9QV01PCQlJT01VWF9QQUQoMHg2MWMsIDB4MjJjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMV9UWERfX1VBUlQxX1RYRAkJSU9NVVhfUEFEKDB4NjFjLCAweDIyYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDFfUlRTX19HUElPNF8zMAkJSU9NVVhfUEFEKDB4NjIwLCAweDIzMCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDFfUlRTX19VQVJUMV9SVFMJCUlPTVVYX1BBRCgweDYyMCwgMHgyMzAsIDAsIDB4MDllMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQxX0NUU19fR1BJTzRfMzEJCUlPTVVYX1BBRCgweDYyNCwgMHgyMzQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQxX0NUU19fVUFSVDFfQ1RTCQlJT01VWF9QQUQoMHg2MjQsIDB4MjM0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMl9SWERfX0ZJUklfVFhECQlJT01VWF9QQUQoMHg2MjgsIDB4MjM4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMl9SWERfX0dQSU8xXzIwCQlJT01VWF9QQUQoMHg2MjgsIDB4MjM4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMl9SWERfX1VBUlQyX1JYRAkJSU9NVVhfUEFEKDB4NjI4LCAweDIzOCwgMCwgMHgwOWVjLCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDJfVFhEX19GSVJJX1JYRAkJSU9NVVhfUEFEKDB4NjJjLCAweDIzYywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDJfVFhEX19HUElPMV8yMQkJSU9NVVhfUEFEKDB4NjJjLCAweDIzYywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDJfVFhEX19VQVJUMl9UWEQJCUlPTVVYX1BBRCgweDYyYywgMHgyM2MsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQzX1JYRF9fQ1NJMV9EMAkJSU9NVVhfUEFEKDB4NjMwLCAweDI0MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDNfUlhEX19HUElPMV8yMgkJSU9NVVhfUEFEKDB4NjMwLCAweDI0MCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDNfUlhEX19VQVJUMV9EVFIJCUlPTVVYX1BBRCgweDYzMCwgMHgyNDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQzX1JYRF9fVUFSVDNfUlhECQlJT01VWF9QQUQoMHg2MzAsIDB4MjQwLCAxLCAweDA5ZjQsIDQsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUM19UWERfX0NTSTFfRDEJCUlPTVVYX1BBRCgweDYzNCwgMHgyNDQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQzX1RYRF9fR1BJTzFfMjMJCUlPTVVYX1BBRCgweDYzNCwgMHgyNDQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQzX1RYRF9fVUFSVDFfRFNSCQlJT01VWF9QQUQoMHg2MzQsIDB4MjQ0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUM19UWERfX1VBUlQzX1RYRAkJSU9NVVhfUEFEKDB4NjM0LCAweDI0NCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfT1dJUkVfTElORV9fR1BJTzFfMjQJCUlPTVVYX1BBRCgweDYzOCwgMHgyNDgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX09XSVJFX0xJTkVfX09XSVJFX0xJTkUJSU9NVVhfUEFEKDB4NjM4LCAweDI0OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfT1dJUkVfTElORV9fU1BESUZfT1VUCQlJT01VWF9QQUQoMHg2MzgsIDB4MjQ4LCA2LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfUk9XMF9fS0VZX1JPVzAJCUlPTVVYX1BBRCgweDYzYywgMHgyNGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9ST1cxX19LRVlfUk9XMQkJSU9NVVhfUEFEKDB4NjQwLCAweDI1MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX1JPVzJfX0tFWV9ST1cyCQlJT01VWF9QQUQoMHg2NDQsIDB4MjU0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfUk9XM19fS0VZX1JPVzMJCUlPTVVYX1BBRCgweDY0OCwgMHgyNTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0wwX19LRVlfQ09MMAkJSU9NVVhfUEFEKDB4NjRjLCAweDI1YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDBfX1BMTDFfQllQCQlJT01VWF9QQUQoMHg2NGMsIDB4MjVjLCA3LCAweDA5MGMsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MMV9fS0VZX0NPTDEJCUlPTVVYX1BBRCgweDY1MCwgMHgyNjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0wxX19QTEwyX0JZUAkJSU9NVVhfUEFEKDB4NjUwLCAweDI2MCwgNywgMHgwOTEwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDJfX0tFWV9DT0wyCQlJT01VWF9QQUQoMHg2NTQsIDB4MjY0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MMl9fUExMM19CWVAJCUlPTVVYX1BBRCgweDY1NCwgMHgyNjQsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0wzX19LRVlfQ09MMwkJSU9NVVhfUEFEKDB4NjU4LCAweDI2OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDRfX0kyQzJfU0NMCQlJT01VWF9QQUQoMHg2NWMsIDB4MjZjLCAweDEzLCAweDA5YjgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MNF9fS0VZX0NPTDQJCUlPTVVYX1BBRCgweDY1YywgMHgyNmMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0w0X19TUERJRl9PVVQxCQlJT01VWF9QQUQoMHg2NWMsIDB4MjZjLCA2LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MNF9fVUFSVDFfUkkJCUlPTVVYX1BBRCgweDY1YywgMHgyNmMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0w0X19VQVJUM19SVFMJCUlPTVVYX1BBRCgweDY1YywgMHgyNmMsIDIsIDB4MDlmMCwgNCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0w1X19JMkMyX1NEQQkJSU9NVVhfUEFEKDB4NjYwLCAweDI3MCwgMHgxMywgMHgwOWJjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDVfX0tFWV9DT0w1CQlJT01VWF9QQUQoMHg2NjAsIDB4MjcwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MNV9fVUFSVDFfRENECQlJT01VWF9QQUQoMHg2NjAsIDB4MjcwLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MNV9fVUFSVDNfQ1RTCQlJT01VWF9QQUQoMHg2NjAsIDB4MjcwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9DTEtfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4Njc4LCAweDI3OCwgMSwgMHgwOTE0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfQ0xLX19HUElPMV8yNQkJSU9NVVhfUEFEKDB4Njc4LCAweDI3OCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfQ0xLX19JMkMyX1NDTAkJSU9NVVhfUEFEKDB4Njc4LCAweDI3OCwgMHgxNSwgMHgwOWI4LCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfQ0xLX19VU0JIMV9DTEsJCUlPTVVYX1BBRCgweDY3OCwgMHgyNzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RJUl9fQ1NQSV9NT1NJCQlJT01VWF9QQUQoMHg2N2MsIDB4MjdjLCAxLCAweDA5MWMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9ESVJfX0dQSU8xXzI2CQlJT01VWF9QQUQoMHg2N2MsIDB4MjdjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9ESVJfX0kyQzJfU0RBCQlJT01VWF9QQUQoMHg2N2MsIDB4MjdjLCAweDE1LCAweDA5YmMsIDIsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9ESVJfX1VTQkgxX0RJUgkJSU9NVVhfUEFEKDB4NjdjLCAweDI3YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfU1RQX19DU1BJX1JEWQkJSU9NVVhfUEFEKDB4NjgwLCAweDI4MCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfU1RQX19HUElPMV8yNwkJSU9NVVhfUEFEKDB4NjgwLCAweDI4MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfU1RQX19VQVJUM19SWEQJCUlPTVVYX1BBRCgweDY4MCwgMHgyODAsIDUsIDB4MDlmNCwgNiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX1NUUF9fVVNCSDFfU1RQCQlJT01VWF9QQUQoMHg2ODAsIDB4MjgwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9OWFRfX0NTUElfTUlTTwkJSU9NVVhfUEFEKDB4Njg0LCAweDI4NCwgMSwgMHgwOTE4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfTlhUX19HUElPMV8yOAkJSU9NVVhfUEFEKDB4Njg0LCAweDI4NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfTlhUX19VQVJUM19UWEQJCUlPTVVYX1BBRCgweDY4NCwgMHgyODQsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX05YVF9fVVNCSDFfTlhUCQlJT01VWF9QQUQoMHg2ODQsIDB4Mjg0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBMF9fR1BJTzFfMTEJCUlPTVVYX1BBRCgweDY4OCwgMHgyODgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEEwX19VQVJUMl9DVFMJSU9NVVhfUEFEKDB4Njg4LCAweDI4OCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTBfX1VTQkgxX0RBVEEwCUlPTVVYX1BBRCgweDY4OCwgMHgyODgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEExX19HUElPMV8xMgkJSU9NVVhfUEFEKDB4NjhjLCAweDI4YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTFfX1VBUlQyX1JYRAlJT01VWF9QQUQoMHg2OGMsIDB4MjhjLCAxLCAweDA5ZWMsIDQsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBMV9fVVNCSDFfREFUQTEJSU9NVVhfUEFEKDB4NjhjLCAweDI4YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTJfX0dQSU8xXzEzCQlJT01VWF9QQUQoMHg2OTAsIDB4MjkwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBMl9fVUFSVDJfVFhECUlPTVVYX1BBRCgweDY5MCwgMHgyOTAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEEyX19VU0JIMV9EQVRBMglJT01VWF9QQUQoMHg2OTAsIDB4MjkwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBM19fR1BJTzFfMTQJCUlPTVVYX1BBRCgweDY5NCwgMHgyOTQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEEzX19VQVJUMl9SVFMJSU9NVVhfUEFEKDB4Njk0LCAweDI5NCwgMSwgMHgwOWU4LCA1LCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTNfX1VTQkgxX0RBVEEzCUlPTVVYX1BBRCgweDY5NCwgMHgyOTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEE0X19DU1BJX1NTMAkJSU9NVVhfUEFEKDB4Njk4LCAweDI5OCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTRfX0dQSU8xXzE1CQlJT01VWF9QQUQoMHg2OTgsIDB4Mjk4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBNF9fVVNCSDFfREFUQTQJSU9NVVhfUEFEKDB4Njk4LCAweDI5OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTVfX0NTUElfU1MxCQlJT01VWF9QQUQoMHg2OWMsIDB4MjljLCAxLCAweDA5MjAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBNV9fR1BJTzFfMTYJCUlPTVVYX1BBRCgweDY5YywgMHgyOWMsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEE1X19VU0JIMV9EQVRBNQlJT01VWF9QQUQoMHg2OWMsIDB4MjljLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBNl9fQ1NQSV9TUzMJCUlPTVVYX1BBRCgweDZhMCwgMHgyYTAsIDEsIDB4MDkyOCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEE2X19HUElPMV8xNwkJSU9NVVhfUEFEKDB4NmEwLCAweDJhMCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTZfX1VTQkgxX0RBVEE2CUlPTVVYX1BBRCgweDZhMCwgMHgyYTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEE3X19FQ1NQSTFfU1MzCUlPTVVYX1BBRCgweDZhNCwgMHgyYTQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEE3X19FQ1NQSTJfU1MzCUlPTVVYX1BBRCgweDZhNCwgMHgyYTQsIDUsIDB4MDkzNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEE3X19HUElPMV8xOAkJSU9NVVhfUEFEKDB4NmE0LCAweDJhNCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTdfX1VTQkgxX0RBVEE3CUlPTVVYX1BBRCgweDZhNCwgMHgyYTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMV9QSU4xMV9fREkxX1BJTjExCQlJT01VWF9QQUQoMHg2YTgsIDB4MmE4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTFfUElOMTFfX0VDU1BJMV9TUzIJCUlPTVVYX1BBRCgweDZhOCwgMHgyYTgsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMV9QSU4xMV9fR1BJTzNfMAkJSU9NVVhfUEFEKDB4NmE4LCAweDJhOCwgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX1BJTjEyX19ESTFfUElOMTIJCUlPTVVYX1BBRCgweDZhYywgMHgyYWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMV9QSU4xMl9fR1BJTzNfMQkJSU9NVVhfUEFEKDB4NmFjLCAweDJhYywgNCwgMHgwOTc4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX1BJTjEzX19ESTFfUElOMTMJCUlPTVVYX1BBRCgweDZiMCwgMHgyYjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMV9QSU4xM19fR1BJTzNfMgkJSU9NVVhfUEFEKDB4NmIwLCAweDJiMCwgNCwgMHgwOTdjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX0QwX0NTX19ESTFfRDBfQ1MJCUlPTVVYX1BBRCgweDZiNCwgMHgyYjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMV9EMF9DU19fR1BJTzNfMwkJSU9NVVhfUEFEKDB4NmI0LCAweDJiNCwgNCwgMHgwOTgwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX0QxX0NTX19ESTFfRDFfQ1MJCUlPTVVYX1BBRCgweDZiOCwgMHgyYjgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMV9EMV9DU19fRElTUDFfUElOMTQJSU9NVVhfUEFEKDB4NmI4LCAweDJiOCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX0QxX0NTX19ESVNQMV9QSU41CQlJT01VWF9QQUQoMHg2YjgsIDB4MmI4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTFfRDFfQ1NfX0dQSU8zXzQJCUlPTVVYX1BBRCgweDZiOCwgMHgyYjgsIDQsIDB4MDk4NCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfRElOX19ESVNQMV9QSU4xCUlPTVVYX1BBRCgweDZiYywgMHgyYmMsIDIsIDB4MDlhNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfRElOX19ESVNQQjJfU0VSX0RJTglJT01VWF9QQUQoMHg2YmMsIDB4MmJjLCAwLCAweDA5YzQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQQjJfU0VSX0RJTl9fR1BJTzNfNQlJT01VWF9QQUQoMHg2YmMsIDB4MmJjLCA0LCAweDA5ODgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fRElTUDFfUElONglJT01VWF9QQUQoMHg2YzAsIDB4MmMwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fRElTUEIyX1NFUl9ESU8JSU9NVVhfUEFEKDB4NmMwLCAweDJjMCwgMCwgMHgwOWM0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9ESU9fX0dQSU8zXzYJSU9NVVhfUEFEKDB4NmMwLCAweDJjMCwgNCwgMHgwOThjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0RJU1AxX1BJTjE3CUlPTVVYX1BBRCgweDZjNCwgMHgyYzQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19ESVNQMV9QSU43CUlPTVVYX1BBRCgweDZjNCwgMHgyYzQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19ESVNQQjJfU0VSX0NMSwlJT01VWF9QQUQoMHg2YzQsIDB4MmM0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fR1BJTzNfNwlJT01VWF9QQUQoMHg2YzQsIDB4MmM0LCA0LCAweDA5OTAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQMV9FWFRfQ0xLCUlPTVVYX1BBRCgweDZjOCwgMHgyYzgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX1BJTjE2CUlPTVVYX1BBRCgweDZjOCwgMHgyYzgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX1BJTjgJSU9NVVhfUEFEKDB4NmM4LCAweDJjOCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUEIyX1NFUl9SUwlJT01VWF9QQUQoMHg2YzgsIDB4MmM4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQQjJfU0VSX1JTCUlPTVVYX1BBRCgweDZjOCwgMHgyYzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0dQSU8zXzgJSU9NVVhfUEFEKDB4NmM4LCAweDJjOCwgNCwgMHgwOTk0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMF9fRElTUDFfREFUMAlJT01VWF9QQUQoMHg2Y2MsIDB4MmNjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxX19ESVNQMV9EQVQxCUlPTVVYX1BBRCgweDZkMCwgMHgyZDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDJfX0RJU1AxX0RBVDIJSU9NVVhfUEFEKDB4NmQ0LCAweDJkNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUM19fRElTUDFfREFUMwlJT01VWF9QQUQoMHg2ZDgsIDB4MmQ4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQ0X19ESVNQMV9EQVQ0CUlPTVVYX1BBRCgweDZkYywgMHgyZGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDVfX0RJU1AxX0RBVDUJSU9NVVhfUEFEKDB4NmUwLCAweDJlMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUNl9fQk9PVF9VU0JfU1JDCUlPTVVYX1BBRCgweDZlNCwgMHgyZTQsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDZfX0RJU1AxX0RBVDYJSU9NVVhfUEFEKDB4NmU0LCAweDJlNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUN19fQk9PVF9FRVBST01fQ0ZHCUlPTVVYX1BBRCgweDZlOCwgMHgyZTgsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDdfX0RJU1AxX0RBVDcJSU9NVVhfUEFEKDB4NmU4LCAweDJlOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUOF9fQk9PVF9TUkMwCQlJT01VWF9QQUQoMHg2ZWMsIDB4MmVjLCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQ4X19ESVNQMV9EQVQ4CUlPTVVYX1BBRCgweDZlYywgMHgyZWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDlfX0JPT1RfU1JDMQkJSU9NVVhfUEFEKDB4NmYwLCAweDJmMCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUOV9fRElTUDFfREFUOQlJT01VWF9QQUQoMHg2ZjAsIDB4MmYwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxMF9fQk9PVF9TUEFSRV9TSVpFCUlPTVVYX1BBRCgweDZmNCwgMHgyZjQsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDEwX19ESVNQMV9EQVQxMAlJT01VWF9QQUQoMHg2ZjQsIDB4MmY0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxMV9fQk9PVF9MUEJfRlJFUTIJSU9NVVhfUEFEKDB4NmY4LCAweDJmOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTFfX0RJU1AxX0RBVDExCUlPTVVYX1BBRCgweDZmOCwgMHgyZjgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDEyX19CT09UX01MQ19TRUwJSU9NVVhfUEFEKDB4NmZjLCAweDJmYywgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTJfX0RJU1AxX0RBVDEyCUlPTVVYX1BBRCgweDZmYywgMHgyZmMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDEzX19CT09UX01FTV9DVEwwCUlPTVVYX1BBRCgweDcwMCwgMHgzMDAsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDEzX19ESVNQMV9EQVQxMwlJT01VWF9QQUQoMHg3MDAsIDB4MzAwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxNF9fQk9PVF9NRU1fQ1RMMQlJT01VWF9QQUQoMHg3MDQsIDB4MzA0LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxNF9fRElTUDFfREFUMTQJSU9NVVhfUEFEKDB4NzA0LCAweDMwNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTVfX0JPT1RfQlVTX1dJRFRICUlPTVVYX1BBRCgweDcwOCwgMHgzMDgsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE1X19ESVNQMV9EQVQxNQlJT01VWF9QQUQoMHg3MDgsIDB4MzA4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxNl9fQk9PVF9QQUdFX1NJWkUwCUlPTVVYX1BBRCgweDcwYywgMHgzMGMsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE2X19ESVNQMV9EQVQxNglJT01VWF9QQUQoMHg3MGMsIDB4MzBjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxN19fQk9PVF9QQUdFX1NJWkUxCUlPTVVYX1BBRCgweDcxMCwgMHgzMTAsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE3X19ESVNQMV9EQVQxNwlJT01VWF9QQUQoMHg3MTAsIDB4MzEwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxOF9fQk9PVF9XRUlNX01VWEVEMAlJT01VWF9QQUQoMHg3MTQsIDB4MzE0LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDFfREFUMTgJSU9NVVhfUEFEKDB4NzE0LCAweDMxNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMThfX0RJU1AyX1BJTjExCUlPTVVYX1BBRCgweDcxNCwgMHgzMTQsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE4X19ESVNQMl9QSU41CUlPTVVYX1BBRCgweDcxNCwgMHgzMTQsIDQsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE5X19CT09UX1dFSU1fTVVYRUQxCUlPTVVYX1BBRCgweDcxOCwgMHgzMTgsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMV9EQVQxOQlJT01VWF9QQUQoMHg3MTgsIDB4MzE4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxOV9fRElTUDJfUElOMTIJSU9NVVhfUEFEKDB4NzE4LCAweDMxOCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AyX1BJTjYJSU9NVVhfUEFEKDB4NzE4LCAweDMxOCwgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjBfX0JPT1RfTUVNX1RZUEUwCUlPTVVYX1BBRCgweDcxYywgMHgzMWMsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIwX19ESVNQMV9EQVQyMAlJT01VWF9QQUQoMHg3MWMsIDB4MzFjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDJfUElOMTMJSU9NVVhfUEFEKDB4NzFjLCAweDMxYywgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjBfX0RJU1AyX1BJTjcJSU9NVVhfUEFEKDB4NzFjLCAweDMxYywgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjFfX0JPT1RfTUVNX1RZUEUxCUlPTVVYX1BBRCgweDcyMCwgMHgzMjAsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIxX19ESVNQMV9EQVQyMQlJT01VWF9QQUQoMHg3MjAsIDB4MzIwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDJfUElOMTQJSU9NVVhfUEFEKDB4NzIwLCAweDMyMCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjFfX0RJU1AyX1BJTjgJSU9NVVhfUEFEKDB4NzIwLCAweDMyMCwgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjJfX0JPT1RfTFBCX0ZSRVEwCUlPTVVYX1BBRCgweDcyNCwgMHgzMjQsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMV9EQVQyMglJT01VWF9QQUQoMHg3MjQsIDB4MzI0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyMl9fRElTUDJfRDBfQ1MJSU9NVVhfUEFEKDB4NzI0LCAweDMyNCwgNiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AyX0RBVDE2CUlPTVVYX1BBRCgweDcyNCwgMHgzMjQsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIzX19CT09UX0xQQl9GUkVRMQlJT01VWF9QQUQoMHg3MjgsIDB4MzI4LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyM19fRElTUDFfREFUMjMJSU9NVVhfUEFEKDB4NzI4LCAweDMyOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX0QxX0NTCUlPTVVYX1BBRCgweDcyOCwgMHgzMjgsIDYsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9EQVQxNwlJT01VWF9QQUQoMHg3MjgsIDB4MzI4LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyM19fRElTUDJfU0VSX0NTCUlPTVVYX1BBRCgweDcyOCwgMHgzMjgsIDQsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMV9QSU4zX19ESTFfUElOMwkJSU9NVVhfUEFEKDB4NzJjLCAweDMyYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX1BJTjJfX0RJMV9QSU4yCQlJT01VWF9QQUQoMHg3MzQsIDB4MzMwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESV9HUDJfX0RJU1AxX1NFUl9DTEsJCUlPTVVYX1BBRCgweDc0MCwgMHgzMzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJX0dQMl9fRElTUDJfV0FJVAkJSU9NVVhfUEFEKDB4NzQwLCAweDMzOCwgMiwgMHgwOWE4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElfR1AzX19DU0kxX0RBVEFfRU4JCUlPTVVYX1BBRCgweDc0NCwgMHgzM2MsIDMsIDB4MDlhMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJX0dQM19fRElTUDFfU0VSX0RJTwkJSU9NVVhfUEFEKDB4NzQ0LCAweDMzYywgMCwgMHgwOWMwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElfR1AzX19GRUNfVFhfRVIJCUlPTVVYX1BBRCgweDc0NCwgMHgzM2MsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMl9QSU40X19DU0kyX0RBVEFfRU4JSU9NVVhfUEFEKDB4NzQ4LCAweDM0MCwgMywgMHgwOTljLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkyX1BJTjRfX0RJMl9QSU40CQlJT01VWF9QQUQoMHg3NDgsIDB4MzQwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTJfUElONF9fRkVDX0NSUwkJSU9NVVhfUEFEKDB4NzQ4LCAweDM0MCwgMiwgMHgwOTUwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkyX1BJTjJfX0RJMl9QSU4yCQlJT01VWF9QQUQoMHg3NGMsIDB4MzQ0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTJfUElOMl9fRkVDX01EQwkJSU9NVVhfUEFEKDB4NzRjLCAweDM0NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkyX1BJTjNfX0RJMl9QSU4zCQlJT01VWF9QQUQoMHg3NTAsIDB4MzQ4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTJfUElOM19fRkVDX01ESU8JCUlPTVVYX1BBRCgweDc1MCwgMHgzNDgsIDIsIDB4MDk1NCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMl9ESVNQX0NMS19fREkyX0RJU1BfQ0xLCUlPTVVYX1BBRCgweDc1NCwgMHgzNGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMl9ESVNQX0NMS19fRkVDX1JEQVRBMQlJT01VWF9QQUQoMHg3NTQsIDB4MzRjLCAyLCAweDA5NWMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESV9HUDRfX0RJMl9QSU4xNQkJSU9NVVhfUEFEKDB4NzU4LCAweDM1MCwgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElfR1A0X19ESVNQMV9TRVJfRElOCQlJT01VWF9QQUQoMHg3NTgsIDB4MzUwLCAwLCAweDA5YzAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESV9HUDRfX0RJU1AyX1BJTjEJCUlPTVVYX1BBRCgweDc1OCwgMHgzNTAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJX0dQNF9fRkVDX1JEQVRBMgkJSU9NVVhfUEFEKDB4NzU4LCAweDM1MCwgMiwgMHgwOTYwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMF9fRElTUDJfREFUMAlJT01VWF9QQUQoMHg3NWMsIDB4MzU0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQwX19GRUNfUkRBVEEzCUlPTVVYX1BBRCgweDc1YywgMHgzNTQsIDIsIDB4MDk2NCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDBfX0tFWV9DT0w2CQlJT01VWF9QQUQoMHg3NWMsIDB4MzU0LCA0LCAweDA5YzgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQwX19VQVJUM19SWEQJCUlPTVVYX1BBRCgweDc1YywgMHgzNTQsIDUsIDB4MDlmNCwgOCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDBfX1VTQkgzX0NMSwkJSU9NVVhfUEFEKDB4NzVjLCAweDM1NCwgMywgMHgwOWY4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMV9fRElTUDJfREFUMQlJT01VWF9QQUQoMHg3NjAsIDB4MzU4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxX19GRUNfUlhfRVIJCUlPTVVYX1BBRCgweDc2MCwgMHgzNTgsIDIsIDB4MDk3MCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDFfX0tFWV9DT0w3CQlJT01VWF9QQUQoMHg3NjAsIDB4MzU4LCA0LCAweDA5Y2MsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxX19VQVJUM19UWEQJCUlPTVVYX1BBRCgweDc2MCwgMHgzNTgsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDFfX1VTQkgzX0RJUgkJSU9NVVhfUEFEKDB4NzYwLCAweDM1OCwgMywgMHgwYTFjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMl9fRElTUDJfREFUMglJT01VWF9QQUQoMHg3NjQsIDB4MzVjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQzX19ESVNQMl9EQVQzCUlPTVVYX1BBRCgweDc2OCwgMHgzNjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDRfX0RJU1AyX0RBVDQJSU9NVVhfUEFEKDB4NzZjLCAweDM2NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUNV9fRElTUDJfREFUNQlJT01VWF9QQUQoMHg3NzAsIDB4MzY4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ2X19ESVNQMl9EQVQ2CUlPTVVYX1BBRCgweDc3NCwgMHgzNmMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDZfX0ZFQ19UREFUQTEJSU9NVVhfUEFEKDB4Nzc0LCAweDM2YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUNl9fR1BJTzFfMTkJCUlPTVVYX1BBRCgweDc3NCwgMHgzNmMsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDZfX0tFWV9ST1c0CQlJT01VWF9QQUQoMHg3NzQsIDB4MzZjLCA0LCAweDA5ZDAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ2X19VU0JIM19TVFAJCUlPTVVYX1BBRCgweDc3NCwgMHgzNmMsIDMsIDB4MGEyNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDdfX0RJU1AyX0RBVDcJSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUN19fRkVDX1REQVRBMglJT01VWF9QQUQoMHg3NzgsIDB4MzcwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ3X19HUElPMV8yOQkJSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUN19fS0VZX1JPVzUJCUlPTVVYX1BBRCgweDc3OCwgMHgzNzAsIDQsIDB4MDlkNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDdfX1VTQkgzX05YVAkJSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgMywgMHgwYTIwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUOF9fRElTUDJfREFUOAlJT01VWF9QQUQoMHg3N2MsIDB4Mzc0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ4X19GRUNfVERBVEEzCUlPTVVYX1BBRCgweDc3YywgMHgzNzQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDhfX0dQSU8xXzMwCQlJT01VWF9QQUQoMHg3N2MsIDB4Mzc0LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ4X19LRVlfUk9XNgkJSU9NVVhfUEFEKDB4NzdjLCAweDM3NCwgNCwgMHgwOWQ4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUOF9fVVNCSDNfREFUQTAJSU9NVVhfUEFEKDB4NzdjLCAweDM3NCwgMywgMHgwOWZjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUOV9fQVVENl9SWEMJCUlPTVVYX1BBRCgweDc4MCwgMHgzNzgsIDQsIDB4MDhmNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDlfX0RJU1AyX0RBVDkJSU9NVVhfUEFEKDB4NzgwLCAweDM3OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUOV9fRkVDX1RYX0VOCQlJT01VWF9QQUQoMHg3ODAsIDB4Mzc4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ5X19HUElPMV8zMQkJSU9NVVhfUEFEKDB4NzgwLCAweDM3OCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUOV9fVVNCSDNfREFUQTEJSU9NVVhfUEFEKDB4NzgwLCAweDM3OCwgMywgMHgwYTAwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTBfX0RJU1AyX0RBVDEwCUlPTVVYX1BBRCgweDc4NCwgMHgzN2MsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDEwX19ESVNQMl9TRVJfQ1MJSU9NVVhfUEFEKDB4Nzg0LCAweDM3YywgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTBfX0ZFQ19DT0wJCUlPTVVYX1BBRCgweDc4NCwgMHgzN2MsIDIsIDB4MDk0YywgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDEwX19LRVlfUk9XNwkJSU9NVVhfUEFEKDB4Nzg0LCAweDM3YywgNCwgMHgwOWRjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTBfX1VTQkgzX0RBVEEyCUlPTVVYX1BBRCgweDc4NCwgMHgzN2MsIDMsIDB4MGEwNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDExX19BVUQ2X1RYRAkJSU9NVVhfUEFEKDB4Nzg4LCAweDM4MCwgNCwgMHgwOGYwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTFfX0RJU1AyX0RBVDExCUlPTVVYX1BBRCgweDc4OCwgMHgzODAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDExX19GRUNfUlhfQ0xLCUlPTVVYX1BBRCgweDc4OCwgMHgzODAsIDIsIDB4MDk2OCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDExX19HUElPMV8xMAkJSU9NVVhfUEFEKDB4Nzg4LCAweDM4MCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTFfX1VTQkgzX0RBVEEzCUlPTVVYX1BBRCgweDc4OCwgMHgzODAsIDMsIDB4MGEwOCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDEyX19BVUQ2X1JYRAkJSU9NVVhfUEFEKDB4NzhjLCAweDM4NCwgNCwgMHgwOGVjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTJfX0RJU1AyX0RBVDEyCUlPTVVYX1BBRCgweDc4YywgMHgzODQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDEyX19GRUNfUlhfRFYJSU9NVVhfUEFEKDB4NzhjLCAweDM4NCwgMiwgMHgwOTZjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTJfX1VTQkgzX0RBVEE0CUlPTVVYX1BBRCgweDc4YywgMHgzODQsIDMsIDB4MGEwYywgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDEzX19BVUQ2X1RYQwkJSU9NVVhfUEFEKDB4NzkwLCAweDM4OCwgNCwgMHgwOGZjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTNfX0RJU1AyX0RBVDEzCUlPTVVYX1BBRCgweDc5MCwgMHgzODgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDEzX19GRUNfVFhfQ0xLCUlPTVVYX1BBRCgweDc5MCwgMHgzODgsIDIsIDB4MDk3NCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDEzX19VU0JIM19EQVRBNQlJT01VWF9QQUQoMHg3OTAsIDB4Mzg4LCAzLCAweDBhMTAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxNF9fQVVENl9UWEZTCUlPTVVYX1BBRCgweDc5NCwgMHgzOGMsIDQsIDB4MDkwMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDE0X19ESVNQMl9EQVQxNAlJT01VWF9QQUQoMHg3OTQsIDB4MzhjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxNF9fRkVDX1JEQVRBMAlJT01VWF9QQUQoMHg3OTQsIDB4MzhjLCAyLCAweDA5NTgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxNF9fVVNCSDNfREFUQTYJSU9NVVhfUEFEKDB4Nzk0LCAweDM4YywgMywgMHgwYTE0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTVfX0FVRDZfUlhGUwlJT01VWF9QQUQoMHg3OTgsIDB4MzkwLCA0LCAweDA4ZjgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxNV9fRElTUDFfU0VSX0NTCUlPTVVYX1BBRCgweDc5OCwgMHgzOTAsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDE1X19ESVNQMl9EQVQxNQlJT01VWF9QQUQoMHg3OTgsIDB4MzkwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxNV9fRkVDX1REQVRBMAlJT01VWF9QQUQoMHg3OTgsIDB4MzkwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxNV9fVVNCSDNfREFUQTcJSU9NVVhfUEFEKDB4Nzk4LCAweDM5MCwgMywgMHgwYTE4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0NNRF9fQVVENV9SWEZTCQlJT01VWF9QQUQoMHg3OWMsIDB4Mzk0LCAxLCAweDA4ZTAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDFfQ01EX19DU1BJX01PU0kJCUlPTVVYX1BBRCgweDc5YywgMHgzOTQsIDIsIDB4MDkxYywgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9DTURfX1NEMV9DTUQJCUlPTVVYX1BBRCgweDc5YywgMHgzOTQsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9DTEtfX0FVRDVfUlhDCQlJT01VWF9QQUQoMHg3YTAsIDB4Mzk4LCAxLCAweDA4ZGMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDFfQ0xLX19DU1BJX1NDTEsJCUlPTVVYX1BBRCgweDdhMCwgMHgzOTgsIDIsIDB4MDkxNCwgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9DTEtfX1NEMV9DTEsJCUlPTVVYX1BBRCgweDdhMCwgMHgzOTgsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9EQVRBMF9fQVVENV9UWEQJCUlPTVVYX1BBRCgweDdhNCwgMHgzOWMsIDEsIDB4MDhkOCwgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9EQVRBMF9fQ1NQSV9NSVNPCQlJT01VWF9QQUQoMHg3YTQsIDB4MzljLCAyLCAweDA5MTgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDFfREFUQTBfX1NEMV9EQVRBMAkJSU9NVVhfUEFEKDB4N2E0LCAweDM5YywgMHgxMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBMF9fRUlNX0RBMAkJSU9NVVhfUEFEKDB4MDAwLCAweDAxYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBMV9fRUlNX0RBMQkJSU9NVVhfUEFEKDB4MDAwLCAweDAyMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBMl9fRUlNX0RBMgkJSU9NVVhfUEFEKDB4MDAwLCAweDAyNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBM19fRUlNX0RBMwkJSU9NVVhfUEFEKDB4MDAwLCAweDAyOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0RBVEExX19BVUQ1X1JYRAkJSU9NVVhfUEFEKDB4N2E4LCAweDNhMCwgMSwgMHgwOGQ0LCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0RBVEExX19TRDFfREFUQTEJCUlPTVVYX1BBRCgweDdhOCwgMHgzYTAsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EQTRfX0VJTV9EQTQJCUlPTVVYX1BBRCgweDAwMCwgMHgwMmMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EQTVfX0VJTV9EQTUJCUlPTVVYX1BBRCgweDAwMCwgMHgwMzAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EQTZfX0VJTV9EQTYJCUlPTVVYX1BBRCgweDAwMCwgMHgwMzQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EQTdfX0VJTV9EQTcJCUlPTVVYX1BBRCgweDAwMCwgMHgwMzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9EQVRBMl9fQVVENV9UWEMJCUlPTVVYX1BBRCgweDdhYywgMHgzYTQsIDEsIDB4MDhlNCwgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9EQVRBMl9fU0QxX0RBVEEyCQlJT01VWF9QQUQoMHg3YWMsIDB4M2E0LCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREExMF9fRUlNX0RBMTAJCUlPTVVYX1BBRCgweDAwMCwgMHgwNDQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EQTExX19FSU1fREExMQkJSU9NVVhfUEFEKDB4MDAwLCAweDA0OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBOF9fRUlNX0RBOAkJSU9NVVhfUEFEKDB4MDAwLCAweDAzYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBOV9fRUlNX0RBOQkJSU9NVVhfUEFEKDB4MDAwLCAweDA0MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0RBVEEzX19BVUQ1X1RYRlMJCUlPTVVYX1BBRCgweDdiMCwgMHgzYTgsIDEsIDB4MDhlOCwgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9EQVRBM19fQ1NQSV9TUzEJCUlPTVVYX1BBRCgweDdiMCwgMHgzYTgsIDIsIDB4MDkyMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9EQVRBM19fU0QxX0RBVEEzCQlJT01VWF9QQUQoMHg3YjAsIDB4M2E4LCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8wX19DU1BJX1NTMgkJSU9NVVhfUEFEKDB4N2I0LCAweDNhYywgMiwgMHgwOTI0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfMF9fR1BJTzFfMAkJSU9NVVhfUEFEKDB4N2I0LCAweDNhYywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfMF9fU0QxX0NECQlJT01VWF9QQUQoMHg3YjQsIDB4M2FjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8xX19DU1BJX01JU08JCUlPTVVYX1BBRCgweDdiOCwgMHgzYjAsIDIsIDB4MDkxOCwgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzFfX0dQSU8xXzEJCUlPTVVYX1BBRCgweDdiOCwgMHgzYjAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzFfX1NEMV9XUAkJSU9NVVhfUEFEKDB4N2I4LCAweDNiMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBMTJfX0VJTV9EQTEyCQlJT01VWF9QQUQoMHgwMDAsIDB4MDRjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREExM19fRUlNX0RBMTMJCUlPTVVYX1BBRCgweDAwMCwgMHgwNTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EQTE0X19FSU1fREExNAkJSU9NVVhfUEFEKDB4MDAwLCAweDA1NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBMTVfX0VJTV9EQTE1CQlJT01VWF9QQUQoMHgwMDAsIDB4MDU4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDJfQ01EX19DU1BJX01PU0kJCUlPTVVYX1BBRCgweDAwMCwgMHgzYjQsIDIsIDB4MDkxYywgMywgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9DTURfX0kyQzFfU0NMCQlJT01VWF9QQUQoMHg3YmMsIDB4M2I0LCAweDExLCAweDA5YjAsIDIsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDJfQ01EX19TRDJfQ01ECQlJT01VWF9QQUQoMHg3YmMsIDB4M2I0LCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDJfQ0xLX19DU1BJX1NDTEsJCUlPTVVYX1BBRCgweDdjMCwgMHgzYjgsIDIsIDB4MDkxNCwgMywgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9DTEtfX0kyQzFfU0RBCQlJT01VWF9QQUQoMHg3YzAsIDB4M2I4LCAweDExLCAweDA5YjQsIDIsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDJfQ0xLX19TRDJfQ0xLCQlJT01VWF9QQUQoMHg3YzAsIDB4M2I4LCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDJfREFUQTBfX0NTUElfTUlTTwkJSU9NVVhfUEFEKDB4N2M0LCAweDNiYywgMiwgMHgwOTE4LCAzLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0RBVEEwX19TRDFfREFUNAkJSU9NVVhfUEFEKDB4N2M0LCAweDNiYywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0RBVEEwX19TRDJfREFUQTAJCUlPTVVYX1BBRCgweDdjNCwgMHgzYmMsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBMV9fU0QxX0RBVDUJCUlPTVVYX1BBRCgweDdjOCwgMHgzYzAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBMV9fU0QyX0RBVEExCQlJT01VWF9QQUQoMHg3YzgsIDB4M2MwLCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDJfREFUQTFfX1VTQkgzX0gyX0RQCUlPTVVYX1BBRCgweDdjOCwgMHgzYzAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBMl9fU0QxX0RBVDYJCUlPTVVYX1BBRCgweDdjYywgMHgzYzQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBMl9fU0QyX0RBVEEyCQlJT01VWF9QQUQoMHg3Y2MsIDB4M2M0LCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDJfREFUQTJfX1VTQkgzX0gyX0RNCUlPTVVYX1BBRCgweDdjYywgMHgzYzQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBM19fQ1NQSV9TUzIJCUlPTVVYX1BBRCgweDdkMCwgMHgzYzgsIDIsIDB4MDkyNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBM19fU0QxX0RBVDcJCUlPTVVYX1BBRCgweDdkMCwgMHgzYzgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBM19fU0QyX0RBVEEzCQlJT01VWF9QQUQoMHg3ZDAsIDB4M2M4LCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8yX19DQ01fT1VUXzIJCUlPTVVYX1BBRCgweDdkNCwgMHgzY2MsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzJfX0dQSU8xXzIJCUlPTVVYX1BBRCgweDdkNCwgMHgzY2MsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzJfX0kyQzJfU0NMCQlJT01VWF9QQUQoMHg3ZDQsIDB4M2NjLCAweDEyLCAweDA5YjgsIDMsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8yX19QTEwxX0JZUAkJSU9NVVhfUEFEKDB4N2Q0LCAweDNjYywgNywgMHgwOTBjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfMl9fUFdNMV9QV01PCQlJT01VWF9QQUQoMHg3ZDQsIDB4M2NjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8zX19HUElPMV8zCQlJT01VWF9QQUQoMHg3ZDgsIDB4M2QwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8zX19JMkMyX1NEQQkJSU9NVVhfUEFEKDB4N2Q4LCAweDNkMCwgMHgxMiwgMHgwOWJjLCAzLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfM19fUExMMl9CWVAJCUlPTVVYX1BBRCgweDdkOCwgMHgzZDAsIDcsIDB4MDkxMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzNfX1BXTTJfUFdNTwkJSU9NVVhfUEFEKDB4N2Q4LCAweDNkMCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfUE1JQ19JTlRfUkVRX19QTUlDX0lOVF9SRVEJSU9NVVhfUEFEKDB4N2ZjLCAweDNkNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfUE1JQ19JTlRfUkVRX19QTUlDX1BNVV9JUlFfQglJT01VWF9QQUQoMHg3ZmMsIDB4M2Q0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV80X19ESVNQMl9FWFRfQ0xLCUlPTVVYX1BBRCgweDgwNCwgMHgzZDgsIDQsIDB4MDkwOCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzRfX0VJTV9SRFkJCUlPTVVYX1BBRCgweDgwNCwgMHgzZDgsIDMsIDB4MDkzOCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzRfX0dQSU8xXzQJCUlPTVVYX1BBRCgweDgwNCwgMHgzZDgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzRfX1dET0cxX1dET0dfQgkJSU9NVVhfUEFEKDB4ODA0LCAweDNkOCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfNV9fQ1NJMl9NQ0xLCQlJT01VWF9QQUQoMHg4MDgsIDB4M2RjLCA2LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV81X19ESVNQMl9QSU4xNgkJSU9NVVhfUEFEKDB4ODA4LCAweDNkYywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfNV9fR1BJTzFfNQkJSU9NVVhfUEFEKDB4ODA4LCAweDNkYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfNV9fV0RPRzJfV0RPR19CCQlJT01VWF9QQUQoMHg4MDgsIDB4M2RjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV82X19ESVNQMl9QSU4xNwkJSU9NVVhfUEFEKDB4ODBjLCAweDNlMCwgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfNl9fR1BJTzFfNgkJSU9NVVhfUEFEKDB4ODBjLCAweDNlMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfNl9fUkVGX0VOX0IJCUlPTVVYX1BBRCgweDgwYywgMHgzZTAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzdfX0NDTV9PVVRfMAkJSU9NVVhfUEFEKDB4ODEwLCAweDNlNCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfN19fR1BJTzFfNwkJSU9NVVhfUEFEKDB4ODEwLCAweDNlNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfN19fU0QyX1dQCQlJT01VWF9QQUQoMHg4MTAsIDB4M2U0LCA2LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV83X19TUERJRl9PVVQxCQlJT01VWF9QQUQoMHg4MTAsIDB4M2U0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV84X19DU0kyX0RBVEFfRU4JCUlPTVVYX1BBRCgweDgxNCwgMHgzZTgsIDIsIDB4MDk5YywgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzhfX0dQSU8xXzgJCUlPTVVYX1BBRCgweDgxNCwgMHgzZTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzhfX1NEMl9DRAkJSU9NVVhfUEFEKDB4ODE0LCAweDNlOCwgNiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfOF9fVVNCSDNfUFdSCQlJT01VWF9QQUQoMHg4MTQsIDB4M2U4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV85X19DQ01fT1VUXzEJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzlfX0RJU1AyX0QxX0NTCQlJT01VWF9QQUQoMHg4MTgsIDB4M2VjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV85X19ESVNQMl9TRVJfQ1MJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzlfX0dQSU8xXzkJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzlfX1NEMl9MQ1RMCQlJT01VWF9QQUQoMHg4MTgsIDB4M2VjLCA2LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV85X19VU0JIM19PQwkJSU9NVVhfUEFEKDB4ODE4LCAweDNlYywgMSwgMHgwMDAwLCAwLCAwKQogCiAvKiBUaGUgc2FtZSBwaW5zIGFzIGFib3ZlIGJ1dCB3aXRoIHRoZSBkZWZhdWx0IHBhZCBjb250cm9sIHZhbHVlcyBhcHBsaWVkICovCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0FVRDRfUlhGUwkJKF9NWDUxX1BBRF9FSU1fRDE2X19BVUQ0X1JYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE2X19BVUQ1X1RYRAkJKF9NWDUxX1BBRF9FSU1fRDE2X19BVUQ1X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0VJTV9EMTYJCShfTVg1MV9QQURfRUlNX0QxNl9fRUlNX0QxNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0dQSU8yXzAJCShfTVg1MV9QQURfRUlNX0QxNl9fR1BJTzJfMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE2X19JMkMxX1NEQQkJKF9NWDUxX1BBRF9FSU1fRDE2X19JMkMxX1NEQSB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX1VBUlQyX0NUUwkJKF9NWDUxX1BBRF9FSU1fRDE2X19VQVJUMl9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxNl9fVVNCSDJfREFUQTAJCShfTVg1MV9QQURfRUlNX0QxNl9fVVNCSDJfREFUQTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE3X19BVUQ1X1JYRAkJKF9NWDUxX1BBRF9FSU1fRDE3X19BVUQ1X1JYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX0VJTV9EMTcJCShfTVg1MV9QQURfRUlNX0QxN19fRUlNX0QxNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX0dQSU8yXzEJCShfTVg1MV9QQURfRUlNX0QxN19fR1BJTzJfMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE3X19VQVJUMl9SWEQJCShfTVg1MV9QQURfRUlNX0QxN19fVUFSVDJfUlhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX1VBUlQzX0NUUwkJKF9NWDUxX1BBRF9FSU1fRDE3X19VQVJUM19DVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxN19fVVNCSDJfREFUQTEJCShfTVg1MV9QQURfRUlNX0QxN19fVVNCSDJfREFUQTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE4X19BVUQ1X1RYQwkJKF9NWDUxX1BBRF9FSU1fRDE4X19BVUQ1X1RYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX0VJTV9EMTgJCShfTVg1MV9QQURfRUlNX0QxOF9fRUlNX0QxOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX0dQSU8yXzIJCShfTVg1MV9QQURfRUlNX0QxOF9fR1BJTzJfMiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE4X19VQVJUMl9UWEQJCShfTVg1MV9QQURfRUlNX0QxOF9fVUFSVDJfVFhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX1VBUlQzX1JUUwkJKF9NWDUxX1BBRF9FSU1fRDE4X19VQVJUM19SVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOF9fVVNCSDJfREFUQTIJCShfTVg1MV9QQURfRUlNX0QxOF9fVVNCSDJfREFUQTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE5X19BVUQ0X1JYQwkJKF9NWDUxX1BBRF9FSU1fRDE5X19BVUQ0X1JYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0FVRDVfVFhGUwkJKF9NWDUxX1BBRF9FSU1fRDE5X19BVUQ1X1RYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE5X19FSU1fRDE5CQkoX01YNTFfUEFEX0VJTV9EMTlfX0VJTV9EMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE5X19HUElPMl8zCQkoX01YNTFfUEFEX0VJTV9EMTlfX0dQSU8yXzMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOV9fSTJDMV9TQ0wJCShfTVg1MV9QQURfRUlNX0QxOV9fSTJDMV9TQ0wgfCBNVVhfUEFEX0NUUkwoTVg1MV9JMkNfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE5X19VQVJUMl9SVFMJCShfTVg1MV9QQURfRUlNX0QxOV9fVUFSVDJfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX1VTQkgyX0RBVEEzCQkoX01YNTFfUEFEX0VJTV9EMTlfX1VTQkgyX0RBVEEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMF9fQVVENF9UWEQJCShfTVg1MV9QQURfRUlNX0QyMF9fQVVENF9UWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIwX19FSU1fRDIwCQkoX01YNTFfUEFEX0VJTV9EMjBfX0VJTV9EMjAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIwX19HUElPMl80CQkoX01YNTFfUEFEX0VJTV9EMjBfX0dQSU8yXzQgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMF9fU1JUQ19BTEFSTV9ERUIJKF9NWDUxX1BBRF9FSU1fRDIwX19TUlRDX0FMQVJNX0RFQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjBfX1VTQkgyX0RBVEE0CQkoX01YNTFfUEFEX0VJTV9EMjBfX1VTQkgyX0RBVEE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMV9fQVVENF9SWEQJCShfTVg1MV9QQURfRUlNX0QyMV9fQVVENF9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIxX19FSU1fRDIxCQkoX01YNTFfUEFEX0VJTV9EMjFfX0VJTV9EMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIxX19HUElPMl81CQkoX01YNTFfUEFEX0VJTV9EMjFfX0dQSU8yXzUgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMV9fU1JUQ19BTEFSTV9ERUIJKF9NWDUxX1BBRF9FSU1fRDIxX19TUlRDX0FMQVJNX0RFQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjFfX1VTQkgyX0RBVEE1CQkoX01YNTFfUEFEX0VJTV9EMjFfX1VTQkgyX0RBVEE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMl9fQVVENF9UWEMJCShfTVg1MV9QQURfRUlNX0QyMl9fQVVENF9UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIyX19FSU1fRDIyCQkoX01YNTFfUEFEX0VJTV9EMjJfX0VJTV9EMjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIyX19HUElPMl82CQkoX01YNTFfUEFEX0VJTV9EMjJfX0dQSU8yXzYgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMl9fVVNCSDJfREFUQTYJCShfTVg1MV9QQURfRUlNX0QyMl9fVVNCSDJfREFUQTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIzX19BVUQ0X1RYRlMJCShfTVg1MV9QQURfRUlNX0QyM19fQVVENF9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyM19fRUlNX0QyMwkJKF9NWDUxX1BBRF9FSU1fRDIzX19FSU1fRDIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyM19fR1BJTzJfNwkJKF9NWDUxX1BBRF9FSU1fRDIzX19HUElPMl83IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjNfX1NQRElGX09VVDEJCShfTVg1MV9QQURfRUlNX0QyM19fU1BESUZfT1VUMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjNfX1VTQkgyX0RBVEE3CQkoX01YNTFfUEFEX0VJTV9EMjNfX1VTQkgyX0RBVEE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fQVVENl9SWEZTCQkoX01YNTFfUEFEX0VJTV9EMjRfX0FVRDZfUlhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjRfX0VJTV9EMjQJCShfTVg1MV9QQURfRUlNX0QyNF9fRUlNX0QyNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjRfX0dQSU8yXzgJCShfTVg1MV9QQURfRUlNX0QyNF9fR1BJTzJfOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI0X19JMkMyX1NEQQkJKF9NWDUxX1BBRF9FSU1fRDI0X19JMkMyX1NEQSB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjRfX1VBUlQzX0NUUwkJKF9NWDUxX1BBRF9FSU1fRDI0X19VQVJUM19DVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fVVNCT1RHX0RBVEEwCQkoX01YNTFfUEFEX0VJTV9EMjRfX1VTQk9UR19EQVRBMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjVfX0VJTV9EMjUJCShfTVg1MV9QQURfRUlNX0QyNV9fRUlNX0QyNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjVfX0tFWV9DT0w2CQkoX01YNTFfUEFEX0VJTV9EMjVfX0tFWV9DT0w2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNV9fVUFSVDJfQ1RTCQkoX01YNTFfUEFEX0VJTV9EMjVfX1VBUlQyX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI1X19VQVJUM19SWEQJCShfTVg1MV9QQURfRUlNX0QyNV9fVUFSVDNfUlhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjVfX1VTQk9UR19EQVRBMQkJKF9NWDUxX1BBRF9FSU1fRDI1X19VU0JPVEdfREFUQTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI2X19FSU1fRDI2CQkoX01YNTFfUEFEX0VJTV9EMjZfX0VJTV9EMjYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI2X19LRVlfQ09MNwkJKF9NWDUxX1BBRF9FSU1fRDI2X19LRVlfQ09MNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjZfX1VBUlQyX1JUUwkJKF9NWDUxX1BBRF9FSU1fRDI2X19VQVJUMl9SVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNl9fVUFSVDNfVFhECQkoX01YNTFfUEFEX0VJTV9EMjZfX1VBUlQzX1RYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI2X19VU0JPVEdfREFUQTIJCShfTVg1MV9QQURfRUlNX0QyNl9fVVNCT1RHX0RBVEEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyN19fQVVENl9SWEMJCShfTVg1MV9QQURfRUlNX0QyN19fQVVENl9SWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19FSU1fRDI3CQkoX01YNTFfUEFEX0VJTV9EMjdfX0VJTV9EMjcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19HUElPMl85CQkoX01YNTFfUEFEX0VJTV9EMjdfX0dQSU8yXzkgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyN19fSTJDMl9TQ0wJCShfTVg1MV9QQURfRUlNX0QyN19fSTJDMl9TQ0wgfCBNVVhfUEFEX0NUUkwoTVg1MV9JMkNfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19VQVJUM19SVFMJCShfTVg1MV9QQURfRUlNX0QyN19fVUFSVDNfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjdfX1VTQk9UR19EQVRBMwkJKF9NWDUxX1BBRF9FSU1fRDI3X19VU0JPVEdfREFUQTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI4X19BVUQ2X1RYRAkJKF9NWDUxX1BBRF9FSU1fRDI4X19BVUQ2X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjhfX0VJTV9EMjgJCShfTVg1MV9QQURfRUlNX0QyOF9fRUlNX0QyOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjhfX0tFWV9ST1c0CQkoX01YNTFfUEFEX0VJTV9EMjhfX0tFWV9ST1c0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOF9fVVNCT1RHX0RBVEE0CQkoX01YNTFfUEFEX0VJTV9EMjhfX1VTQk9UR19EQVRBNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjlfX0FVRDZfUlhECQkoX01YNTFfUEFEX0VJTV9EMjlfX0FVRDZfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOV9fRUlNX0QyOQkJKF9NWDUxX1BBRF9FSU1fRDI5X19FSU1fRDI5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOV9fS0VZX1JPVzUJCShfTVg1MV9QQURfRUlNX0QyOV9fS0VZX1JPVzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI5X19VU0JPVEdfREFUQTUJCShfTVg1MV9QQURfRUlNX0QyOV9fVVNCT1RHX0RBVEE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMF9fQVVENl9UWEMJCShfTVg1MV9QQURfRUlNX0QzMF9fQVVENl9UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMwX19FSU1fRDMwCQkoX01YNTFfUEFEX0VJTV9EMzBfX0VJTV9EMzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMwX19LRVlfUk9XNgkJKF9NWDUxX1BBRF9FSU1fRDMwX19LRVlfUk9XNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzBfX1VTQk9UR19EQVRBNgkJKF9NWDUxX1BBRF9FSU1fRDMwX19VU0JPVEdfREFUQTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMxX19BVUQ2X1RYRlMJCShfTVg1MV9QQURfRUlNX0QzMV9fQVVENl9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMV9fRUlNX0QzMQkJKF9NWDUxX1BBRF9FSU1fRDMxX19FSU1fRDMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMV9fS0VZX1JPVzcJCShfTVg1MV9QQURfRUlNX0QzMV9fS0VZX1JPVzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMxX19VU0JPVEdfREFUQTcJCShfTVg1MV9QQURfRUlNX0QzMV9fVVNCT1RHX0RBVEE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExNl9fRUlNX0ExNgkJKF9NWDUxX1BBRF9FSU1fQTE2X19FSU1fQTE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExNl9fR1BJTzJfMTAJCShfTVg1MV9QQURfRUlNX0ExNl9fR1BJTzJfMTAgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExNl9fT1NDX0ZSRVFfU0VMMAkJKF9NWDUxX1BBRF9FSU1fQTE2X19PU0NfRlJFUV9TRUwwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExN19fRUlNX0ExNwkJKF9NWDUxX1BBRF9FSU1fQTE3X19FSU1fQTE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExN19fR1BJTzJfMTEJCShfTVg1MV9QQURfRUlNX0ExN19fR1BJTzJfMTEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExN19fT1NDX0ZSRVFfU0VMMQkJKF9NWDUxX1BBRF9FSU1fQTE3X19PU0NfRlJFUV9TRUwxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExOF9fQk9PVF9MUEIwCQkoX01YNTFfUEFEX0VJTV9BMThfX0JPT1RfTFBCMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMThfX0VJTV9BMTgJCShfTVg1MV9QQURfRUlNX0ExOF9fRUlNX0ExOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMThfX0dQSU8yXzEyCQkoX01YNTFfUEFEX0VJTV9BMThfX0dQSU8yXzEyIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTlfX0JPT1RfTFBCMQkJKF9NWDUxX1BBRF9FSU1fQTE5X19CT09UX0xQQjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE5X19FSU1fQTE5CQkoX01YNTFfUEFEX0VJTV9BMTlfX0VJTV9BMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE5X19HUElPMl8xMwkJKF9NWDUxX1BBRF9FSU1fQTE5X19HUElPMl8xMyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIwX19CT09UX1VBUlRfU1JDMAkoX01YNTFfUEFEX0VJTV9BMjBfX0JPT1RfVUFSVF9TUkMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMF9fRUlNX0EyMAkJKF9NWDUxX1BBRF9FSU1fQTIwX19FSU1fQTIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMF9fR1BJTzJfMTQJCShfTVg1MV9QQURfRUlNX0EyMF9fR1BJTzJfMTQgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMV9fQk9PVF9VQVJUX1NSQzEJKF9NWDUxX1BBRF9FSU1fQTIxX19CT09UX1VBUlRfU1JDMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjFfX0VJTV9BMjEJCShfTVg1MV9QQURfRUlNX0EyMV9fRUlNX0EyMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjFfX0dQSU8yXzE1CQkoX01YNTFfUEFEX0VJTV9BMjFfX0dQSU8yXzE1IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjJfX0VJTV9BMjIJCShfTVg1MV9QQURfRUlNX0EyMl9fRUlNX0EyMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjJfX0dQSU8yXzE2CQkoX01YNTFfUEFEX0VJTV9BMjJfX0dQSU8yXzE2IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjNfX0JPT1RfSFBOX0VOCQkoX01YNTFfUEFEX0VJTV9BMjNfX0JPT1RfSFBOX0VOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyM19fRUlNX0EyMwkJKF9NWDUxX1BBRF9FSU1fQTIzX19FSU1fQTIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyM19fR1BJTzJfMTcJCShfTVg1MV9QQURfRUlNX0EyM19fR1BJTzJfMTcgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNF9fRUlNX0EyNAkJKF9NWDUxX1BBRF9FSU1fQTI0X19FSU1fQTI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNF9fR1BJTzJfMTgJCShfTVg1MV9QQURfRUlNX0EyNF9fR1BJTzJfMTggfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNF9fVVNCSDJfQ0xLCQkoX01YNTFfUEFEX0VJTV9BMjRfX1VTQkgyX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjVfX0RJU1AxX1BJTjQJCShfTVg1MV9QQURfRUlNX0EyNV9fRElTUDFfUElONCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjVfX0VJTV9BMjUJCShfTVg1MV9QQURfRUlNX0EyNV9fRUlNX0EyNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjVfX0dQSU8yXzE5CQkoX01YNTFfUEFEX0VJTV9BMjVfX0dQSU8yXzE5IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjVfX1VTQkgyX0RJUgkJKF9NWDUxX1BBRF9FSU1fQTI1X19VU0JIMl9ESVIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI2X19DU0kxX0RBVEFfRU4JCShfTVg1MV9QQURfRUlNX0EyNl9fQ1NJMV9EQVRBX0VOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNl9fRElTUDJfRVhUX0NMSwkJKF9NWDUxX1BBRF9FSU1fQTI2X19ESVNQMl9FWFRfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNl9fRUlNX0EyNgkJKF9NWDUxX1BBRF9FSU1fQTI2X19FSU1fQTI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNl9fR1BJTzJfMjAJCShfTVg1MV9QQURfRUlNX0EyNl9fR1BJTzJfMjAgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNl9fVVNCSDJfU1RQCQkoX01YNTFfUEFEX0VJTV9BMjZfX1VTQkgyX1NUUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX0NTSTJfREFUQV9FTgkJKF9NWDUxX1BBRF9FSU1fQTI3X19DU0kyX0RBVEFfRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI3X19ESVNQMV9QSU4xCQkoX01YNTFfUEFEX0VJTV9BMjdfX0RJU1AxX1BJTjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI3X19FSU1fQTI3CQkoX01YNTFfUEFEX0VJTV9BMjdfX0VJTV9BMjcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI3X19HUElPMl8yMQkJKF9NWDUxX1BBRF9FSU1fQTI3X19HUElPMl8yMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI3X19VU0JIMl9OWFQJCShfTVg1MV9QQURfRUlNX0EyN19fVVNCSDJfTlhUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMF9fRUlNX0VCMAkJKF9NWDUxX1BBRF9FSU1fRUIwX19FSU1fRUIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMV9fRUlNX0VCMQkJKF9NWDUxX1BBRF9FSU1fRUIxX19FSU1fRUIxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fQVVENV9SWEZTCQkoX01YNTFfUEFEX0VJTV9FQjJfX0FVRDVfUlhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjJfX0NTSTFfRDIJCShfTVg1MV9QQURfRUlNX0VCMl9fQ1NJMV9EMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjJfX0VJTV9FQjIJCShfTVg1MV9QQURfRUlNX0VCMl9fRUlNX0VCMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjJfX0ZFQ19NRElPCQkoX01YNTFfUEFEX0VJTV9FQjJfX0ZFQ19NRElPIHwgXAorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE2X19BVUQ0X1JYRlMJCUlPTVVYX1BBRCgweDNmMCwgMHgwNWMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxNl9fQVVENV9UWEQJCUlPTVVYX1BBRCgweDNmMCwgMHgwNWMsIDcsIDB4OGQ4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxNl9fRUlNX0QxNgkJSU9NVVhfUEFEKDB4M2YwLCAweDA1YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE2X19HUElPMl8wCQlJT01VWF9QQUQoMHgzZjAsIDB4MDVjLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE2X19JMkMxX1NEQQkJSU9NVVhfUEFEKDB4M2YwLCAweDA1YywgMHgxNCwgMHg5YjQsIDAsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE2X19VQVJUMl9DVFMJCUlPTVVYX1BBRCgweDNmMCwgMHgwNWMsIDMsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX1VTQkgyX0RBVEEwCQlJT01VWF9QQUQoMHgzZjAsIDB4MDVjLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX0FVRDVfUlhECQlJT01VWF9QQUQoMHgzZjQsIDB4MDYwLCA3LCAweDhkNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX0VJTV9EMTcJCUlPTVVYX1BBRCgweDNmNCwgMHgwNjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxN19fR1BJTzJfMQkJSU9NVVhfUEFEKDB4M2Y0LCAweDA2MCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxN19fVUFSVDJfUlhECQlJT01VWF9QQUQoMHgzZjQsIDB4MDYwLCAzLCAweDllYywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE3X19VQVJUM19DVFMJCUlPTVVYX1BBRCgweDNmNCwgMHgwNjAsIDQsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX1VTQkgyX0RBVEExCQlJT01VWF9QQUQoMHgzZjQsIDB4MDYwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX0FVRDVfVFhDCQlJT01VWF9QQUQoMHgzZjgsIDB4MDY0LCA3LCAweDhlNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX0VJTV9EMTgJCUlPTVVYX1BBRCgweDNmOCwgMHgwNjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOF9fR1BJTzJfMgkJSU9NVVhfUEFEKDB4M2Y4LCAweDA2NCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOF9fVUFSVDJfVFhECQlJT01VWF9QQUQoMHgzZjgsIDB4MDY0LCAzLCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE4X19VQVJUM19SVFMJCUlPTVVYX1BBRCgweDNmOCwgMHgwNjQsIDQsIDB4OWYwLCAxLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX1VTQkgyX0RBVEEyCQlJT01VWF9QQUQoMHgzZjgsIDB4MDY0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0FVRDRfUlhDCQlJT01VWF9QQUQoMHgzZmMsIDB4MDY4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0FVRDVfVFhGUwkJSU9NVVhfUEFEKDB4M2ZjLCAweDA2OCwgNywgMHg4ZTgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE5X19FSU1fRDE5CQlJT01VWF9QQUQoMHgzZmMsIDB4MDY4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0dQSU8yXzMJCUlPTVVYX1BBRCgweDNmYywgMHgwNjgsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0kyQzFfU0NMCQlJT01VWF9QQUQoMHgzZmMsIDB4MDY4LCAweDE0LCAweDliMCwgMCwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX1VBUlQyX1JUUwkJSU9NVVhfUEFEKDB4M2ZjLCAweDA2OCwgMywgMHg5ZTgsIDEsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOV9fVVNCSDJfREFUQTMJCUlPTVVYX1BBRCgweDNmYywgMHgwNjgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMF9fQVVENF9UWEQJCUlPTVVYX1BBRCgweDQwMCwgMHgwNmMsIDUsIDB4OGM4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMF9fRUlNX0QyMAkJSU9NVVhfUEFEKDB4NDAwLCAweDA2YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIwX19HUElPMl80CQlJT01VWF9QQUQoMHg0MDAsIDB4MDZjLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIwX19TUlRDX0FMQVJNX0RFQglJT01VWF9QQUQoMHg0MDAsIDB4MDZjLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjBfX1VTQkgyX0RBVEE0CQlJT01VWF9QQUQoMHg0MDAsIDB4MDZjLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjFfX0FVRDRfUlhECQlJT01VWF9QQUQoMHg0MDQsIDB4MDcwLCA1LCAweDhjNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjFfX0VJTV9EMjEJCUlPTVVYX1BBRCgweDQwNCwgMHgwNzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMV9fR1BJTzJfNQkJSU9NVVhfUEFEKDB4NDA0LCAweDA3MCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMV9fU1JUQ19BTEFSTV9ERUIJSU9NVVhfUEFEKDB4NDA0LCAweDA3MCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIxX19VU0JIMl9EQVRBNQkJSU9NVVhfUEFEKDB4NDA0LCAweDA3MCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIyX19BVUQ0X1RYQwkJSU9NVVhfUEFEKDB4NDA4LCAweDA3NCwgNSwgMHg4Y2MsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIyX19FSU1fRDIyCQlJT01VWF9QQUQoMHg0MDgsIDB4MDc0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjJfX0dQSU8yXzYJCUlPTVVYX1BBRCgweDQwOCwgMHgwNzQsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjJfX1VTQkgyX0RBVEE2CQlJT01VWF9QQUQoMHg0MDgsIDB4MDc0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjNfX0FVRDRfVFhGUwkJSU9NVVhfUEFEKDB4NDBjLCAweDA3OCwgNSwgMHg4ZDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIzX19FSU1fRDIzCQlJT01VWF9QQUQoMHg0MGMsIDB4MDc4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjNfX0dQSU8yXzcJCUlPTVVYX1BBRCgweDQwYywgMHgwNzgsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjNfX1NQRElGX09VVDEJCUlPTVVYX1BBRCgweDQwYywgMHgwNzgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyM19fVVNCSDJfREFUQTcJCUlPTVVYX1BBRCgweDQwYywgMHgwNzgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fQVVENl9SWEZTCQlJT01VWF9QQUQoMHg0MTAsIDB4MDdjLCA1LCAweDhmOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjRfX0VJTV9EMjQJCUlPTVVYX1BBRCgweDQxMCwgMHgwN2MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fR1BJTzJfOAkJSU9NVVhfUEFEKDB4NDEwLCAweDA3YywgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fSTJDMl9TREEJCUlPTVVYX1BBRCgweDQxMCwgMHgwN2MsIDB4MTQsIDB4OWJjLCAwLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fVUFSVDNfQ1RTCQlJT01VWF9QQUQoMHg0MTAsIDB4MDdjLCAzLCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI0X19VU0JPVEdfREFUQTAJCUlPTVVYX1BBRCgweDQxMCwgMHgwN2MsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNV9fRUlNX0QyNQkJSU9NVVhfUEFEKDB4NDE0LCAweDA4MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI1X19LRVlfQ09MNgkJSU9NVVhfUEFEKDB4NDE0LCAweDA4MCwgMSwgMHg5YzgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI1X19VQVJUMl9DVFMJCUlPTVVYX1BBRCgweDQxNCwgMHgwODAsIDQsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjVfX1VBUlQzX1JYRAkJSU9NVVhfUEFEKDB4NDE0LCAweDA4MCwgMywgMHg5ZjQsIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNV9fVVNCT1RHX0RBVEExCQlJT01VWF9QQUQoMHg0MTQsIDB4MDgwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjZfX0VJTV9EMjYJCUlPTVVYX1BBRCgweDQxOCwgMHgwODQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNl9fS0VZX0NPTDcJCUlPTVVYX1BBRCgweDQxOCwgMHgwODQsIDEsIDB4OWNjLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNl9fVUFSVDJfUlRTCQlJT01VWF9QQUQoMHg0MTgsIDB4MDg0LCA0LCAweDllOCwgMywgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI2X19VQVJUM19UWEQJCUlPTVVYX1BBRCgweDQxOCwgMHgwODQsIDMsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjZfX1VTQk9UR19EQVRBMgkJSU9NVVhfUEFEKDB4NDE4LCAweDA4NCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19BVUQ2X1JYQwkJSU9NVVhfUEFEKDB4NDFjLCAweDA4OCwgNSwgMHg4ZjQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19FSU1fRDI3CQlJT01VWF9QQUQoMHg0MWMsIDB4MDg4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjdfX0dQSU8yXzkJCUlPTVVYX1BBRCgweDQxYywgMHgwODgsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjdfX0kyQzJfU0NMCQlJT01VWF9QQUQoMHg0MWMsIDB4MDg4LCAweDE0LCAweDliOCwgMCwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjdfX1VBUlQzX1JUUwkJSU9NVVhfUEFEKDB4NDFjLCAweDA4OCwgMywgMHg5ZjAsIDMsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyN19fVVNCT1RHX0RBVEEzCQlJT01VWF9QQUQoMHg0MWMsIDB4MDg4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjhfX0FVRDZfVFhECQlJT01VWF9QQUQoMHg0MjAsIDB4MDhjLCA1LCAweDhmMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjhfX0VJTV9EMjgJCUlPTVVYX1BBRCgweDQyMCwgMHgwOGMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOF9fS0VZX1JPVzQJCUlPTVVYX1BBRCgweDQyMCwgMHgwOGMsIDEsIDB4OWQwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOF9fVVNCT1RHX0RBVEE0CQlJT01VWF9QQUQoMHg0MjAsIDB4MDhjLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjlfX0FVRDZfUlhECQlJT01VWF9QQUQoMHg0MjQsIDB4MDkwLCA1LCAweDhlYywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjlfX0VJTV9EMjkJCUlPTVVYX1BBRCgweDQyNCwgMHgwOTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOV9fS0VZX1JPVzUJCUlPTVVYX1BBRCgweDQyNCwgMHgwOTAsIDEsIDB4OWQ0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOV9fVVNCT1RHX0RBVEE1CQlJT01VWF9QQUQoMHg0MjQsIDB4MDkwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzBfX0FVRDZfVFhDCQlJT01VWF9QQUQoMHg0MjgsIDB4MDk0LCA1LCAweDhmYywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzBfX0VJTV9EMzAJCUlPTVVYX1BBRCgweDQyOCwgMHgwOTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMF9fS0VZX1JPVzYJCUlPTVVYX1BBRCgweDQyOCwgMHgwOTQsIDEsIDB4OWQ4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMF9fVVNCT1RHX0RBVEE2CQlJT01VWF9QQUQoMHg0MjgsIDB4MDk0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzFfX0FVRDZfVFhGUwkJSU9NVVhfUEFEKDB4NDJjLCAweDA5OCwgNSwgMHg5MDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMxX19FSU1fRDMxCQlJT01VWF9QQUQoMHg0MmMsIDB4MDk4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzFfX0tFWV9ST1c3CQlJT01VWF9QQUQoMHg0MmMsIDB4MDk4LCAxLCAweDlkYywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzFfX1VTQk9UR19EQVRBNwkJSU9NVVhfUEFEKDB4NDJjLCAweDA5OCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE2X19FSU1fQTE2CQlJT01VWF9QQUQoMHg0MzAsIDB4MDljLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTZfX0dQSU8yXzEwCQlJT01VWF9QQUQoMHg0MzAsIDB4MDljLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE2X19PU0NfRlJFUV9TRUwwCQlJT01VWF9QQUQoMHg0MzAsIDB4MDljLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTdfX0VJTV9BMTcJCUlPTVVYX1BBRCgweDQzNCwgMHgwYTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0ExN19fR1BJTzJfMTEJCUlPTVVYX1BBRCgweDQzNCwgMHgwYTAsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTdfX09TQ19GUkVRX1NFTDEJCUlPTVVYX1BBRCgweDQzNCwgMHgwYTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0ExOF9fQk9PVF9MUEIwCQlJT01VWF9QQUQoMHg0MzgsIDB4MGE0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMThfX0VJTV9BMTgJCUlPTVVYX1BBRCgweDQzOCwgMHgwYTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0ExOF9fR1BJTzJfMTIJCUlPTVVYX1BBRCgweDQzOCwgMHgwYTQsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTlfX0JPT1RfTFBCMQkJSU9NVVhfUEFEKDB4NDNjLCAweDBhOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE5X19FSU1fQTE5CQlJT01VWF9QQUQoMHg0M2MsIDB4MGE4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTlfX0dQSU8yXzEzCQlJT01VWF9QQUQoMHg0M2MsIDB4MGE4LCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIwX19CT09UX1VBUlRfU1JDMAlJT01VWF9QQUQoMHg0NDAsIDB4MGFjLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjBfX0VJTV9BMjAJCUlPTVVYX1BBRCgweDQ0MCwgMHgwYWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMF9fR1BJTzJfMTQJCUlPTVVYX1BBRCgweDQ0MCwgMHgwYWMsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjFfX0JPT1RfVUFSVF9TUkMxCUlPTVVYX1BBRCgweDQ0NCwgMHgwYjAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMV9fRUlNX0EyMQkJSU9NVVhfUEFEKDB4NDQ0LCAweDBiMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIxX19HUElPMl8xNQkJSU9NVVhfUEFEKDB4NDQ0LCAweDBiMCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMl9fRUlNX0EyMgkJSU9NVVhfUEFEKDB4NDQ4LCAweDBiNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIyX19HUElPMl8xNgkJSU9NVVhfUEFEKDB4NDQ4LCAweDBiNCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyM19fQk9PVF9IUE5fRU4JCUlPTVVYX1BBRCgweDQ0YywgMHgwYjgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyM19fRUlNX0EyMwkJSU9NVVhfUEFEKDB4NDRjLCAweDBiOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIzX19HUElPMl8xNwkJSU9NVVhfUEFEKDB4NDRjLCAweDBiOCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNF9fRUlNX0EyNAkJSU9NVVhfUEFEKDB4NDUwLCAweDBiYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI0X19HUElPMl8xOAkJSU9NVVhfUEFEKDB4NDUwLCAweDBiYywgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNF9fVVNCSDJfQ0xLCQlJT01VWF9QQUQoMHg0NTAsIDB4MGJjLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjVfX0RJU1AxX1BJTjQJCUlPTVVYX1BBRCgweDQ1NCwgMHgwYzAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNV9fRUlNX0EyNQkJSU9NVVhfUEFEKDB4NDU0LCAweDBjMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI1X19HUElPMl8xOQkJSU9NVVhfUEFEKDB4NDU0LCAweDBjMCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNV9fVVNCSDJfRElSCQlJT01VWF9QQUQoMHg0NTQsIDB4MGMwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjZfX0NTSTFfREFUQV9FTgkJSU9NVVhfUEFEKDB4NDU4LCAweDBjNCwgNSwgMHg5YTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI2X19ESVNQMl9FWFRfQ0xLCQlJT01VWF9QQUQoMHg0NTgsIDB4MGM0LCA2LCAweDkwOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjZfX0VJTV9BMjYJCUlPTVVYX1BBRCgweDQ1OCwgMHgwYzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNl9fR1BJTzJfMjAJCUlPTVVYX1BBRCgweDQ1OCwgMHgwYzQsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjZfX1VTQkgyX1NUUAkJSU9NVVhfUEFEKDB4NDU4LCAweDBjNCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI3X19DU0kyX0RBVEFfRU4JCUlPTVVYX1BBRCgweDQ1YywgMHgwYzgsIDUsIDB4OTljLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyN19fRElTUDFfUElOMQkJSU9NVVhfUEFEKDB4NDVjLCAweDBjOCwgNiwgMHg5YTQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI3X19FSU1fQTI3CQlJT01VWF9QQUQoMHg0NWMsIDB4MGM4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX0dQSU8yXzIxCQlJT01VWF9QQUQoMHg0NWMsIDB4MGM4LCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI3X19VU0JIMl9OWFQJCUlPTVVYX1BBRCgweDQ1YywgMHgwYzgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMF9fRUlNX0VCMAkJSU9NVVhfUEFEKDB4NDYwLCAweDBjYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIxX19FSU1fRUIxCQlJT01VWF9QQUQoMHg0NjQsIDB4MGQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjJfX0FVRDVfUlhGUwkJSU9NVVhfUEFEKDB4NDY4LCAweDBkNCwgNiwgMHg4ZTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIyX19DU0kxX0QyCQlJT01VWF9QQUQoMHg0NjgsIDB4MGQ0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjJfX0VJTV9FQjIJCUlPTVVYX1BBRCgweDQ2OCwgMHgwZDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fRkVDX01ESU8JCShJT01VWF9QQUQoMHg0NjgsIDB4MGQ0LCAzLCAweDk1NCwgMCwgMCkgfCBcCiAJCU1VWF9QQURfQ1RSTChQQURfQ1RMX1BVU18yMktfVVAgfCBQQURfQ1RMX1BLRSB8IFBBRF9DVExfU1JFX0ZBU1QgfCBcCiAJCVBBRF9DVExfRFNFX0hJR0ggfCBQQURfQ1RMX1BVRSB8IFBBRF9DVExfSFlTKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fR1BJTzJfMjIJCShfTVg1MV9QQURfRUlNX0VCMl9fR1BJTzJfMjIgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fR1BUX0NNUE9VVDEJCShfTVg1MV9QQURfRUlNX0VCMl9fR1BUX0NNUE9VVDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIzX19BVUQ1X1JYQwkJKF9NWDUxX1BBRF9FSU1fRUIzX19BVUQ1X1JYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0NTSTFfRDMJCShfTVg1MV9QQURfRUlNX0VCM19fQ1NJMV9EMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0VJTV9FQjMJCShfTVg1MV9QQURfRUlNX0VCM19fRUlNX0VCMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0ZFQ19SREFUQTEJCShfTVg1MV9QQURfRUlNX0VCM19fRkVDX1JEQVRBMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0dQSU8yXzIzCQkoX01YNTFfUEFEX0VJTV9FQjNfX0dQSU8yXzIzIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0dQVF9DTVBPVVQyCQkoX01YNTFfUEFEX0VJTV9FQjNfX0dQVF9DTVBPVVQyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX09FX19FSU1fT0UJCQkoX01YNTFfUEFEX0VJTV9PRV9fRUlNX09FIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX09FX19HUElPMl8yNAkJKF9NWDUxX1BBRF9FSU1fT0VfX0dQSU8yXzI0IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzBfX0VJTV9DUzAJCShfTVg1MV9QQURfRUlNX0NTMF9fRUlNX0NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzBfX0dQSU8yXzI1CQkoX01YNTFfUEFEX0VJTV9DUzBfX0dQSU8yXzI1IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzFfX0VJTV9DUzEJCShfTVg1MV9QQURfRUlNX0NTMV9fRUlNX0NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzFfX0dQSU8yXzI2CQkoX01YNTFfUEFEX0VJTV9DUzFfX0dQSU8yXzI2IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzJfX0FVRDVfVFhECQkoX01YNTFfUEFEX0VJTV9DUzJfX0FVRDVfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMl9fQ1NJMV9ENAkJKF9NWDUxX1BBRF9FSU1fQ1MyX19DU0kxX0Q0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMl9fRUlNX0NTMgkJKF9NWDUxX1BBRF9FSU1fQ1MyX19FSU1fQ1MyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMl9fRkVDX1JEQVRBMgkJKF9NWDUxX1BBRF9FSU1fQ1MyX19GRUNfUkRBVEEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMl9fR1BJTzJfMjcJCShfTVg1MV9QQURfRUlNX0NTMl9fR1BJTzJfMjcgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMl9fVVNCT1RHX1NUUAkJKF9NWDUxX1BBRF9FSU1fQ1MyX19VU0JPVEdfU1RQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTM19fQVVENV9SWEQJCShfTVg1MV9QQURfRUlNX0NTM19fQVVENV9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19DU0kxX0Q1CQkoX01YNTFfUEFEX0VJTV9DUzNfX0NTSTFfRDUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19FSU1fQ1MzCQkoX01YNTFfUEFEX0VJTV9DUzNfX0VJTV9DUzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19GRUNfUkRBVEEzCQkoX01YNTFfUEFEX0VJTV9DUzNfX0ZFQ19SREFUQTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19HUElPMl8yOAkJKF9NWDUxX1BBRF9FSU1fQ1MzX19HUElPMl8yOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19VU0JPVEdfTlhUCQkoX01YNTFfUEFEX0VJTV9DUzNfX1VTQk9UR19OWFQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M0X19BVUQ1X1RYQwkJKF9NWDUxX1BBRF9FSU1fQ1M0X19BVUQ1X1RYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzRfX0NTSTFfRDYJCShfTVg1MV9QQURfRUlNX0NTNF9fQ1NJMV9ENiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzRfX0VJTV9DUzQJCShfTVg1MV9QQURfRUlNX0NTNF9fRUlNX0NTNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzRfX0ZFQ19SWF9FUgkJKF9NWDUxX1BBRF9FSU1fQ1M0X19GRUNfUlhfRVIgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF8yKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNF9fR1BJTzJfMjkJCShfTVg1MV9QQURfRUlNX0NTNF9fR1BJTzJfMjkgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNF9fVVNCT1RHX0NMSwkJKF9NWDUxX1BBRF9FSU1fQ1M0X19VU0JPVEdfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fQVVENV9UWEZTCQkoX01YNTFfUEFEX0VJTV9DUzVfX0FVRDVfVFhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX0NTSTFfRDcJCShfTVg1MV9QQURfRUlNX0NTNV9fQ1NJMV9ENyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX0RJU1AxX0VYVF9DTEsJCShfTVg1MV9QQURfRUlNX0NTNV9fRElTUDFfRVhUX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX0VJTV9DUzUJCShfTVg1MV9QQURfRUlNX0NTNV9fRUlNX0NTNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX0ZFQ19DUlMJCShfTVg1MV9QQURfRUlNX0NTNV9fRkVDX0NSUyB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzIpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M1X19HUElPMl8zMAkJKF9NWDUxX1BBRF9FSU1fQ1M1X19HUElPMl8zMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M1X19VU0JPVEdfRElSCQkoX01YNTFfUEFEX0VJTV9DUzVfX1VTQk9UR19ESVIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRFRBQ0tfX0VJTV9EVEFDSwkJKF9NWDUxX1BBRF9FSU1fRFRBQ0tfX0VJTV9EVEFDSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EVEFDS19fR1BJTzJfMzEJCShfTVg1MV9QQURfRUlNX0RUQUNLX19HUElPMl8zMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fTEJBX19FSU1fTEJBCQkoX01YNTFfUEFEX0VJTV9MQkFfX0VJTV9MQkEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fTEJBX19HUElPM18xCQkoX01YNTFfUEFEX0VJTV9MQkFfX0dQSU8zXzEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NSRV9fRUlNX0NSRQkJKF9NWDUxX1BBRF9FSU1fQ1JFX19FSU1fQ1JFIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NSRV9fR1BJTzNfMgkJKF9NWDUxX1BBRF9FSU1fQ1JFX19HUElPM18yIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RSQU1fQ1MxX19EUkFNX0NTMQkJKF9NWDUxX1BBRF9EUkFNX0NTMV9fRFJBTV9DUzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XRV9CX19HUElPM18zCQkoX01YNTFfUEFEX05BTkRGX1dFX0JfX0dQSU8zXzMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfV0VfQl9fTkFOREZfV0VfQgkJKF9NWDUxX1BBRF9OQU5ERl9XRV9CX19OQU5ERl9XRV9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfV0VfQl9fUEFUQV9ESU9XCQkoX01YNTFfUEFEX05BTkRGX1dFX0JfX1BBVEFfRElPVyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dFX0JfX1NEM19EQVRBMAkJKF9NWDUxX1BBRF9OQU5ERl9XRV9CX19TRDNfREFUQTAgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JFX0JfX0dQSU8zXzQJCShfTVg1MV9QQURfTkFOREZfUkVfQl9fR1BJTzNfNCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRV9CX19OQU5ERl9SRV9CCQkoX01YNTFfUEFEX05BTkRGX1JFX0JfX05BTkRGX1JFX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRV9CX19QQVRBX0RJT1IJCShfTVg1MV9QQURfTkFOREZfUkVfQl9fUEFUQV9ESU9SIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkVfQl9fU0QzX0RBVEExCQkoX01YNTFfUEFEX05BTkRGX1JFX0JfX1NEM19EQVRBMSB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQUxFX19HUElPM181CQkoX01YNTFfUEFEX05BTkRGX0FMRV9fR1BJTzNfNSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9BTEVfX05BTkRGX0FMRQkJKF9NWDUxX1BBRF9OQU5ERl9BTEVfX05BTkRGX0FMRSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0FMRV9fUEFUQV9CVUZGRVJfRU4JKF9NWDUxX1BBRF9OQU5ERl9BTEVfX1BBVEFfQlVGRkVSX0VOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ0xFX19HUElPM182CQkoX01YNTFfUEFEX05BTkRGX0NMRV9fR1BJTzNfNiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DTEVfX05BTkRGX0NMRQkJKF9NWDUxX1BBRF9OQU5ERl9DTEVfX05BTkRGX0NMRSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NMRV9fUEFUQV9SRVNFVF9CCShfTVg1MV9QQURfTkFOREZfQ0xFX19QQVRBX1JFU0VUX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XUF9CX19HUElPM183CQkoX01YNTFfUEFEX05BTkRGX1dQX0JfX0dQSU8zXzcgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfV1BfQl9fTkFOREZfV1BfQgkJKF9NWDUxX1BBRF9OQU5ERl9XUF9CX19OQU5ERl9XUF9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfV1BfQl9fUEFUQV9ETUFDSwkJKF9NWDUxX1BBRF9OQU5ERl9XUF9CX19QQVRBX0RNQUNLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfV1BfQl9fU0QzX0RBVEEyCQkoX01YNTFfUEFEX05BTkRGX1dQX0JfX1NEM19EQVRBMiB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIwX19FQ1NQSTJfU1MxCQkoX01YNTFfUEFEX05BTkRGX1JCMF9fRUNTUEkyX1NTMSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIwX19HUElPM184CQkoX01YNTFfUEFEX05BTkRGX1JCMF9fR1BJTzNfOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjBfX05BTkRGX1JCMAkJKF9NWDUxX1BBRF9OQU5ERl9SQjBfX05BTkRGX1JCMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMF9fUEFUQV9ETUFSUQkJKF9NWDUxX1BBRF9OQU5ERl9SQjBfX1BBVEFfRE1BUlEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjBfX1NEM19EQVRBMwkJKF9NWDUxX1BBRF9OQU5ERl9SQjBfX1NEM19EQVRBMyB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIxX19DU1BJX01PU0kJCShfTVg1MV9QQURfTkFOREZfUkIxX19DU1BJX01PU0kgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMV9fRUNTUEkyX1JEWQkJKF9NWDUxX1BBRF9OQU5ERl9SQjFfX0VDU1BJMl9SRFkgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMV9fR1BJTzNfOQkJKF9NWDUxX1BBRF9OQU5ERl9SQjFfX0dQSU8zXzkgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIxX19OQU5ERl9SQjEJCShfTVg1MV9QQURfTkFOREZfUkIxX19OQU5ERl9SQjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjFfX1BBVEFfSU9SRFkJCShfTVg1MV9QQURfTkFOREZfUkIxX19QQVRBX0lPUkRZIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIxX19TRDRfQ01ECQkoX01YNTFfUEFEX05BTkRGX1JCMV9fU0Q0X0NNRCB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIyX19ESVNQMl9XQUlUCQkoX01YNTFfUEFEX05BTkRGX1JCMl9fRElTUDJfV0FJVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMl9fRUNTUEkyX1NDTEsJCShfTVg1MV9QQURfTkFOREZfUkIyX19FQ1NQSTJfU0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIyX19GRUNfQ09MCQkoX01YNTFfUEFEX05BTkRGX1JCMl9fRkVDX0NPTCB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzIpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX0dQSU8zXzEwCQkoX01YNTFfUEFEX05BTkRGX1JCMl9fR1BJTzNfMTAgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIyX19OQU5ERl9SQjIJCShfTVg1MV9QQURfTkFOREZfUkIyX19OQU5ERl9SQjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX1VTQkgzX0gzX0RQCQkoX01YNTFfUEFEX05BTkRGX1JCMl9fVVNCSDNfSDNfRFAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX1VTQkgzX05YVAkJKF9NWDUxX1BBRF9OQU5ERl9SQjJfX1VTQkgzX05YVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCM19fRElTUDFfV0FJVAkJKF9NWDUxX1BBRF9OQU5ERl9SQjNfX0RJU1AxX1dBSVQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX0VDU1BJMl9NSVNPCQkoX01YNTFfUEFEX05BTkRGX1JCM19fRUNTUEkyX01JU08gfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCM19fRkVDX1JYX0NMSwkJKF9NWDUxX1BBRF9OQU5ERl9SQjNfX0ZFQ19SWF9DTEsgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF8yKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19HUElPM18xMQkJKF9NWDUxX1BBRF9OQU5ERl9SQjNfX0dQSU8zXzExIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCM19fTkFOREZfUkIzCQkoX01YNTFfUEFEX05BTkRGX1JCM19fTkFOREZfUkIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19VU0JIM19DTEsJCShfTVg1MV9QQURfTkFOREZfUkIzX19VU0JIM19DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX1VTQkgzX0gzX0RNCQkoX01YNTFfUEFEX05BTkRGX1JCM19fVVNCSDNfSDNfRE0gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPX05BTkRfX0dQSU9fTkFORAkJKF9NWDUxX1BBRF9HUElPX05BTkRfX0dQSU9fTkFORCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPX05BTkRfX1BBVEFfSU5UUlEJCShfTVg1MV9QQURfR1BJT19OQU5EX19QQVRBX0lOVFJRIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MwX19HUElPM18xNgkJKF9NWDUxX1BBRF9OQU5ERl9DUzBfX0dQSU8zXzE2IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMF9fTkFOREZfQ1MwCQkoX01YNTFfUEFEX05BTkRGX0NTMF9fTkFOREZfQ1MwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MxX19HUElPM18xNwkJKF9NWDUxX1BBRF9OQU5ERl9DUzFfX0dQSU8zXzE3IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMV9fTkFOREZfQ1MxCQkoX01YNTFfUEFEX05BTkRGX0NTMV9fTkFOREZfQ1MxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19DU1BJX1NDTEsJCShfTVg1MV9QQURfTkFOREZfQ1MyX19DU1BJX1NDTEsgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fRkVDX1RYX0VSCQkoX01YNTFfUEFEX05BTkRGX0NTMl9fRkVDX1RYX0VSIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fR1BJTzNfMTgJCShfTVg1MV9QQURfTkFOREZfQ1MyX19HUElPM18xOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzJfX05BTkRGX0NTMgkJKF9NWDUxX1BBRF9OQU5ERl9DUzJfX05BTkRGX0NTMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fUEFUQV9DU18wCQkoX01YNTFfUEFEX05BTkRGX0NTMl9fUEFUQV9DU18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19TRDRfQ0xLCQkoX01YNTFfUEFEX05BTkRGX0NTMl9fU0Q0X0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMIHwgUEFEX0NUTF9IWVMpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzJfX1VTQkgzX0gxX0RQCQkoX01YNTFfUEFEX05BTkRGX0NTMl9fVVNCSDNfSDFfRFAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzNfX0ZFQ19NREMJCShfTVg1MV9QQURfTkFOREZfQ1MzX19GRUNfTURDIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fR1BJTzNfMTkJCShfTVg1MV9QQURfTkFOREZfQ1MzX19HUElPM18xOSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzNfX05BTkRGX0NTMwkJKF9NWDUxX1BBRF9OQU5ERl9DUzNfX05BTkRGX0NTMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fUEFUQV9DU18xCQkoX01YNTFfUEFEX05BTkRGX0NTM19fUEFUQV9DU18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MzX19TRDRfREFUMAkJKF9NWDUxX1BBRF9OQU5ERl9DUzNfX1NENF9EQVQwIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzNfX1VTQkgzX0gxX0RNCQkoX01YNTFfUEFEX05BTkRGX0NTM19fVVNCSDNfSDFfRE0gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzRfX0ZFQ19UREFUQTEJCShfTVg1MV9QQURfTkFOREZfQ1M0X19GRUNfVERBVEExIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNF9fR1BJTzNfMjAJCShfTVg1MV9QQURfTkFOREZfQ1M0X19HUElPM18yMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzRfX05BTkRGX0NTNAkJKF9NWDUxX1BBRF9OQU5ERl9DUzRfX05BTkRGX0NTNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNF9fUEFUQV9EQV8wCQkoX01YNTFfUEFEX05BTkRGX0NTNF9fUEFUQV9EQV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M0X19TRDRfREFUMQkJKF9NWDUxX1BBRF9OQU5ERl9DUzRfX1NENF9EQVQxIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzRfX1VTQkgzX1NUUAkJKF9NWDUxX1BBRF9OQU5ERl9DUzRfX1VTQkgzX1NUUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNV9fRkVDX1REQVRBMgkJKF9NWDUxX1BBRF9OQU5ERl9DUzVfX0ZFQ19UREFUQTIgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF81KSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19HUElPM18yMQkJKF9NWDUxX1BBRF9OQU5ERl9DUzVfX0dQSU8zXzIxIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNV9fTkFOREZfQ1M1CQkoX01YNTFfUEFEX05BTkRGX0NTNV9fTkFOREZfQ1M1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19QQVRBX0RBXzEJCShfTVg1MV9QQURfTkFOREZfQ1M1X19QQVRBX0RBXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzVfX1NENF9EQVQyCQkoX01YNTFfUEFEX05BTkRGX0NTNV9fU0Q0X0RBVDIgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNV9fVVNCSDNfRElSCQkoX01YNTFfUEFEX05BTkRGX0NTNV9fVVNCSDNfRElSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M2X19DU1BJX1NTMwkJKF9NWDUxX1BBRF9OQU5ERl9DUzZfX0NTUElfU1MzIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzZfX0ZFQ19UREFUQTMJCShfTVg1MV9QQURfTkFOREZfQ1M2X19GRUNfVERBVEEzIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fR1BJTzNfMjIJCShfTVg1MV9QQURfTkFOREZfQ1M2X19HUElPM18yMiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzZfX05BTkRGX0NTNgkJKF9NWDUxX1BBRF9OQU5ERl9DUzZfX05BTkRGX0NTNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fUEFUQV9EQV8yCQkoX01YNTFfUEFEX05BTkRGX0NTNl9fUEFUQV9EQV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M2X19TRDRfREFUMwkJKF9NWDUxX1BBRF9OQU5ERl9DUzZfX1NENF9EQVQzIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzdfX0ZFQ19UWF9FTgkJKF9NWDUxX1BBRF9OQU5ERl9DUzdfX0ZFQ19UWF9FTiB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzUpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzdfX0dQSU8zXzIzCQkoX01YNTFfUEFEX05BTkRGX0NTN19fR1BJTzNfMjMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M3X19OQU5ERl9DUzcJCShfTVg1MV9QQURfTkFOREZfQ1M3X19OQU5ERl9DUzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzdfX1NEM19DTEsJCShfTVg1MV9QQURfTkFOREZfQ1M3X19TRDNfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwgfCBQQURfQ1RMX0hZUykpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0VDU1BJMl9TUzAJKF9NWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19FQ1NQSTJfU1MwIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19GRUNfVFhfQ0xLCShfTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fRkVDX1RYX0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzQpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19HUElPM18yNAkoX01YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0dQSU8zXzI0IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX05BTkRGX1JEWV9JTlQJKF9NWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19OQU5ERl9SRFlfSU5UIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fU0QzX0NNRAkJKF9NWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19TRDNfQ01EIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTVfX0VDU1BJMl9NT1NJCQkoX01YNTFfUEFEX05BTkRGX0QxNV9fRUNTUEkyX01PU0kgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNV9fR1BJTzNfMjUJCShfTVg1MV9QQURfTkFOREZfRDE1X19HUElPM18yNSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTVfX05BTkRGX0QxNQkJKF9NWDUxX1BBRF9OQU5ERl9EMTVfX05BTkRGX0QxNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNV9fUEFUQV9EQVRBMTUJCShfTVg1MV9QQURfTkFOREZfRDE1X19QQVRBX0RBVEExNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNV9fU0QzX0RBVDcJCShfTVg1MV9QQURfTkFOREZfRDE1X19TRDNfREFUNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fRUNTUEkyX1NTMwkJKF9NWDUxX1BBRF9OQU5ERl9EMTRfX0VDU1BJMl9TUzMgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fR1BJTzNfMjYJCShfTVg1MV9QQURfTkFOREZfRDE0X19HUElPM18yNiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTRfX05BTkRGX0QxNAkJKF9NWDUxX1BBRF9OQU5ERl9EMTRfX05BTkRGX0QxNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fUEFUQV9EQVRBMTQJCShfTVg1MV9QQURfTkFOREZfRDE0X19QQVRBX0RBVEExNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fU0QzX0RBVDYJCShfTVg1MV9QQURfTkFOREZfRDE0X19TRDNfREFUNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxM19fRUNTUEkyX1NTMgkJKF9NWDUxX1BBRF9OQU5ERl9EMTNfX0VDU1BJMl9TUzIgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxM19fR1BJTzNfMjcJCShfTVg1MV9QQURfTkFOREZfRDEzX19HUElPM18yNyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTNfX05BTkRGX0QxMwkJKF9NWDUxX1BBRF9OQU5ERl9EMTNfX05BTkRGX0QxMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxM19fUEFUQV9EQVRBMTMJCShfTVg1MV9QQURfTkFOREZfRDEzX19QQVRBX0RBVEExMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxM19fU0QzX0RBVDUJCShfTVg1MV9QQURfTkFOREZfRDEzX19TRDNfREFUNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fRUNTUEkyX1NTMQkJKF9NWDUxX1BBRF9OQU5ERl9EMTJfX0VDU1BJMl9TUzEgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fR1BJTzNfMjgJCShfTVg1MV9QQURfTkFOREZfRDEyX19HUElPM18yOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTJfX05BTkRGX0QxMgkJKF9NWDUxX1BBRF9OQU5ERl9EMTJfX05BTkRGX0QxMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fUEFUQV9EQVRBMTIJCShfTVg1MV9QQURfTkFOREZfRDEyX19QQVRBX0RBVEExMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fU0QzX0RBVDQJCShfTVg1MV9QQURfTkFOREZfRDEyX19TRDNfREFUNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMV9fRkVDX1JYX0RWCQkoX01YNTFfUEFEX05BTkRGX0QxMV9fRkVDX1JYX0RWIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDExX19HUElPM18yOQkJKF9NWDUxX1BBRF9OQU5ERl9EMTFfX0dQSU8zXzI5IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMV9fTkFOREZfRDExCQkoX01YNTFfUEFEX05BTkRGX0QxMV9fTkFOREZfRDExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDExX19QQVRBX0RBVEExMQkJKF9NWDUxX1BBRF9OQU5ERl9EMTFfX1BBVEFfREFUQTExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDExX19TRDNfREFUQTMJCShfTVg1MV9QQURfTkFOREZfRDExX19TRDNfREFUQTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTBfX0dQSU8zXzMwCQkoX01YNTFfUEFEX05BTkRGX0QxMF9fR1BJTzNfMzAgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEwX19OQU5ERl9EMTAJCShfTVg1MV9QQURfTkFOREZfRDEwX19OQU5ERl9EMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTBfX1BBVEFfREFUQTEwCQkoX01YNTFfUEFEX05BTkRGX0QxMF9fUEFUQV9EQVRBMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTBfX1NEM19EQVRBMgkJKF9NWDUxX1BBRF9OQU5ERl9EMTBfX1NEM19EQVRBMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q5X19GRUNfUkRBVEEwCQkoX01YNTFfUEFEX05BTkRGX0Q5X19GRUNfUkRBVEEwIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q5X19HUElPM18zMQkJKF9NWDUxX1BBRF9OQU5ERl9EOV9fR1BJTzNfMzEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX05BTkRGX0Q5CQkoX01YNTFfUEFEX05BTkRGX0Q5X19OQU5ERl9EOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q5X19QQVRBX0RBVEE5CQkoX01YNTFfUEFEX05BTkRGX0Q5X19QQVRBX0RBVEE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX1NEM19EQVRBMQkJKF9NWDUxX1BBRF9OQU5ERl9EOV9fU0QzX0RBVEExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDhfX0ZFQ19UREFUQTAJCShfTVg1MV9QQURfTkFOREZfRDhfX0ZFQ19UREFUQTAgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF81KSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDhfX0dQSU80XzAJCShfTVg1MV9QQURfTkFOREZfRDhfX0dQSU80XzAgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDhfX05BTkRGX0Q4CQkoX01YNTFfUEFEX05BTkRGX0Q4X19OQU5ERl9EOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q4X19QQVRBX0RBVEE4CQkoX01YNTFfUEFEX05BTkRGX0Q4X19QQVRBX0RBVEE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDhfX1NEM19EQVRBMAkJKF9NWDUxX1BBRF9OQU5ERl9EOF9fU0QzX0RBVEEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDdfX0dQSU80XzEJCShfTVg1MV9QQURfTkFOREZfRDdfX0dQSU80XzEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDdfX05BTkRGX0Q3CQkoX01YNTFfUEFEX05BTkRGX0Q3X19OQU5ERl9ENyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q3X19QQVRBX0RBVEE3CQkoX01YNTFfUEFEX05BTkRGX0Q3X19QQVRBX0RBVEE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDdfX1VTQkgzX0RBVEEwCQkoX01YNTFfUEFEX05BTkRGX0Q3X19VU0JIM19EQVRBMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19HUElPNF8yCQkoX01YNTFfUEFEX05BTkRGX0Q2X19HUElPNF8yIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19OQU5ERl9ENgkJKF9NWDUxX1BBRF9OQU5ERl9ENl9fTkFOREZfRDYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENl9fUEFUQV9EQVRBNgkJKF9NWDUxX1BBRF9OQU5ERl9ENl9fUEFUQV9EQVRBNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19TRDRfTENUTAkJKF9NWDUxX1BBRF9OQU5ERl9ENl9fU0Q0X0xDVEwgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENl9fVVNCSDNfREFUQTEJCShfTVg1MV9QQURfTkFOREZfRDZfX1VTQkgzX0RBVEExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDVfX0dQSU80XzMJCShfTVg1MV9QQURfTkFOREZfRDVfX0dQSU80XzMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDVfX05BTkRGX0Q1CQkoX01YNTFfUEFEX05BTkRGX0Q1X19OQU5ERl9ENSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q1X19QQVRBX0RBVEE1CQkoX01YNTFfUEFEX05BTkRGX0Q1X19QQVRBX0RBVEE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDVfX1NENF9XUAkJKF9NWDUxX1BBRF9OQU5ERl9ENV9fU0Q0X1dQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDVfX1VTQkgzX0RBVEEyCQkoX01YNTFfUEFEX05BTkRGX0Q1X19VU0JIM19EQVRBMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q0X19HUElPNF80CQkoX01YNTFfUEFEX05BTkRGX0Q0X19HUElPNF80IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q0X19OQU5ERl9ENAkJKF9NWDUxX1BBRF9OQU5ERl9ENF9fTkFOREZfRDQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENF9fUEFUQV9EQVRBNAkJKF9NWDUxX1BBRF9OQU5ERl9ENF9fUEFUQV9EQVRBNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q0X19TRDRfQ0QJCShfTVg1MV9QQURfTkFOREZfRDRfX1NENF9DRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q0X19VU0JIM19EQVRBMwkJKF9NWDUxX1BBRF9OQU5ERl9ENF9fVVNCSDNfREFUQTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EM19fR1BJTzRfNQkJKF9NWDUxX1BBRF9OQU5ERl9EM19fR1BJTzRfNSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EM19fTkFOREZfRDMJCShfTVg1MV9QQURfTkFOREZfRDNfX05BTkRGX0QzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDNfX1BBVEFfREFUQTMJCShfTVg1MV9QQURfTkFOREZfRDNfX1BBVEFfREFUQTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EM19fU0Q0X0RBVDQJCShfTVg1MV9QQURfTkFOREZfRDNfX1NENF9EQVQ0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDNfX1VTQkgzX0RBVEE0CQkoX01YNTFfUEFEX05BTkRGX0QzX19VU0JIM19EQVRBNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19HUElPNF82CQkoX01YNTFfUEFEX05BTkRGX0QyX19HUElPNF82IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19OQU5ERl9EMgkJKF9NWDUxX1BBRF9OQU5ERl9EMl9fTkFOREZfRDIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMl9fUEFUQV9EQVRBMgkJKF9NWDUxX1BBRF9OQU5ERl9EMl9fUEFUQV9EQVRBMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19TRDRfREFUNQkJKF9NWDUxX1BBRF9OQU5ERl9EMl9fU0Q0X0RBVDUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMl9fVVNCSDNfREFUQTUJCShfTVg1MV9QQURfTkFOREZfRDJfX1VTQkgzX0RBVEE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDFfX0dQSU80XzcJCShfTVg1MV9QQURfTkFOREZfRDFfX0dQSU80XzcgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDFfX05BTkRGX0QxCQkoX01YNTFfUEFEX05BTkRGX0QxX19OQU5ERl9EMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxX19QQVRBX0RBVEExCQkoX01YNTFfUEFEX05BTkRGX0QxX19QQVRBX0RBVEExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDFfX1NENF9EQVQ2CQkoX01YNTFfUEFEX05BTkRGX0QxX19TRDRfREFUNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxX19VU0JIM19EQVRBNgkJKF9NWDUxX1BBRF9OQU5ERl9EMV9fVVNCSDNfREFUQTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMF9fR1BJTzRfOAkJKF9NWDUxX1BBRF9OQU5ERl9EMF9fR1BJTzRfOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMF9fTkFOREZfRDAJCShfTVg1MV9QQURfTkFOREZfRDBfX05BTkRGX0QwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDBfX1BBVEFfREFUQTAJCShfTVg1MV9QQURfTkFOREZfRDBfX1BBVEFfREFUQTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMF9fU0Q0X0RBVDcJCShfTVg1MV9QQURfTkFOREZfRDBfX1NENF9EQVQ3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDBfX1VTQkgzX0RBVEE3CQkoX01YNTFfUEFEX05BTkRGX0QwX19VU0JIM19EQVRBNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDhfX0NTSTFfRDgJCShfTVg1MV9QQURfQ1NJMV9EOF9fQ1NJMV9EOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDhfX0dQSU8zXzEyCQkoX01YNTFfUEFEX0NTSTFfRDhfX0dQSU8zXzEyIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDlfX0NTSTFfRDkJCShfTVg1MV9QQURfQ1NJMV9EOV9fQ1NJMV9EOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDlfX0dQSU8zXzEzCQkoX01YNTFfUEFEX0NTSTFfRDlfX0dQSU8zXzEzIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDEwX19DU0kxX0QxMAkJKF9NWDUxX1BBRF9DU0kxX0QxMF9fQ1NJMV9EMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxMV9fQ1NJMV9EMTEJCShfTVg1MV9QQURfQ1NJMV9EMTFfX0NTSTFfRDExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTJfX0NTSTFfRDEyCQkoX01YNTFfUEFEX0NTSTFfRDEyX19DU0kxX0QxMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDEzX19DU0kxX0QxMwkJKF9NWDUxX1BBRF9DU0kxX0QxM19fQ1NJMV9EMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxNF9fQ1NJMV9EMTQJCShfTVg1MV9QQURfQ1NJMV9EMTRfX0NTSTFfRDE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTVfX0NTSTFfRDE1CQkoX01YNTFfUEFEX0NTSTFfRDE1X19DU0kxX0QxNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE2X19DU0kxX0QxNgkJKF9NWDUxX1BBRF9DU0kxX0QxNl9fQ1NJMV9EMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxN19fQ1NJMV9EMTcJCShfTVg1MV9QQURfQ1NJMV9EMTdfX0NTSTFfRDE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMThfX0NTSTFfRDE4CQkoX01YNTFfUEFEX0NTSTFfRDE4X19DU0kxX0QxOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE5X19DU0kxX0QxOQkJKF9NWDUxX1BBRF9DU0kxX0QxOV9fQ1NJMV9EMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX1ZTWU5DX19DU0kxX1ZTWU5DCQkoX01YNTFfUEFEX0NTSTFfVlNZTkNfX0NTSTFfVlNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX1ZTWU5DX19HUElPM18xNAkJKF9NWDUxX1BBRF9DU0kxX1ZTWU5DX19HUElPM18xNCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0hTWU5DX19DU0kxX0hTWU5DCQkoX01YNTFfUEFEX0NTSTFfSFNZTkNfX0NTSTFfSFNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0hTWU5DX19HUElPM18xNQkJKF9NWDUxX1BBRF9DU0kxX0hTWU5DX19HUElPM18xNSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX1BJWENMS19fQ1NJMV9QSVhDTEsJKF9NWDUxX1BBRF9DU0kxX1BJWENMS19fQ1NJMV9QSVhDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX01DTEtfX0NTSTFfTUNMSwkJKF9NWDUxX1BBRF9DU0kxX01DTEtfX0NTSTFfTUNMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDEyX19DU0kyX0QxMgkJKF9NWDUxX1BBRF9DU0kyX0QxMl9fQ1NJMl9EMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxMl9fR1BJTzRfOQkJKF9NWDUxX1BBRF9DU0kyX0QxMl9fR1BJTzRfOSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxM19fQ1NJMl9EMTMJCShfTVg1MV9QQURfQ1NJMl9EMTNfX0NTSTJfRDEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTNfX0dQSU80XzEwCQkoX01YNTFfUEFEX0NTSTJfRDEzX19HUElPNF8xMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxNF9fQ1NJMl9EMTQJCShfTVg1MV9QQURfQ1NJMl9EMTRfX0NTSTJfRDE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTVfX0NTSTJfRDE1CQkoX01YNTFfUEFEX0NTSTJfRDE1X19DU0kyX0QxNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE2X19DU0kyX0QxNgkJKF9NWDUxX1BBRF9DU0kyX0QxNl9fQ1NJMl9EMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxN19fQ1NJMl9EMTcJCShfTVg1MV9QQURfQ1NJMl9EMTdfX0NTSTJfRDE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMThfX0NTSTJfRDE4CQkoX01YNTFfUEFEX0NTSTJfRDE4X19DU0kyX0QxOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE4X19HUElPNF8xMQkJKF9NWDUxX1BBRF9DU0kyX0QxOF9fR1BJTzRfMTEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTlfX0NTSTJfRDE5CQkoX01YNTFfUEFEX0NTSTJfRDE5X19DU0kyX0QxOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE5X19HUElPNF8xMgkJKF9NWDUxX1BBRF9DU0kyX0QxOV9fR1BJTzRfMTIgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9WU1lOQ19fQ1NJMl9WU1lOQwkJKF9NWDUxX1BBRF9DU0kyX1ZTWU5DX19DU0kyX1ZTWU5DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9WU1lOQ19fR1BJTzRfMTMJCShfTVg1MV9QQURfQ1NJMl9WU1lOQ19fR1BJTzRfMTMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9IU1lOQ19fQ1NJMl9IU1lOQwkJKF9NWDUxX1BBRF9DU0kyX0hTWU5DX19DU0kyX0hTWU5DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9IU1lOQ19fR1BJTzRfMTQJCShfTVg1MV9QQURfQ1NJMl9IU1lOQ19fR1BJTzRfMTQgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9QSVhDTEtfX0NTSTJfUElYQ0xLCShfTVg1MV9QQURfQ1NJMl9QSVhDTEtfX0NTSTJfUElYQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9QSVhDTEtfX0dQSU80XzE1CQkoX01YNTFfUEFEX0NTSTJfUElYQ0xLX19HUElPNF8xNSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9JMkMxX0NMS19fR1BJTzRfMTYJCShfTVg1MV9QQURfSTJDMV9DTEtfX0dQSU80XzE2IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0kyQzFfQ0xLX19JMkMxX0NMSwkJKF9NWDUxX1BBRF9JMkMxX0NMS19fSTJDMV9DTEsgfCBNVVhfUEFEX0NUUkwoTVg1MV9JMkNfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9JMkMxX0RBVF9fR1BJTzRfMTcJCShfTVg1MV9QQURfSTJDMV9EQVRfX0dQSU80XzE3IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0kyQzFfREFUX19JMkMxX0RBVAkJKF9NWDUxX1BBRF9JMkMxX0RBVF9fSTJDMV9EQVQgfCBNVVhfUEFEX0NUUkwoTVg1MV9JMkNfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1RYRF9fQVVEM19UWEQJCShfTVg1MV9QQURfQVVEM19CQl9UWERfX0FVRDNfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQVVEM19CQl9UWERfX0dQSU80XzE4CQkoX01YNTFfUEFEX0FVRDNfQkJfVFhEX19HUElPNF8xOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1JYRF9fQVVEM19SWEQJCShfTVg1MV9QQURfQVVEM19CQl9SWERfX0FVRDNfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQVVEM19CQl9SWERfX0dQSU80XzE5CQkoX01YNTFfUEFEX0FVRDNfQkJfUlhEX19HUElPNF8xOSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1JYRF9fVUFSVDNfUlhECQkoX01YNTFfUEFEX0FVRDNfQkJfUlhEX19VQVJUM19SWEQgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQVVEM19CQl9DS19fQVVEM19UWEMJCShfTVg1MV9QQURfQVVEM19CQl9DS19fQVVEM19UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0NLX19HUElPNF8yMAkJKF9NWDUxX1BBRF9BVUQzX0JCX0NLX19HUElPNF8yMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0ZTX19BVUQzX1RYRlMJCShfTVg1MV9QQURfQVVEM19CQl9GU19fQVVEM19UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQVVEM19CQl9GU19fR1BJTzRfMjEJCShfTVg1MV9QQURfQVVEM19CQl9GU19fR1BJTzRfMjEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQVVEM19CQl9GU19fVUFSVDNfVFhECQkoX01YNTFfUEFEX0FVRDNfQkJfRlNfX1VBUlQzX1RYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NT1NJX19FQ1NQSTFfTU9TSQkoX01YNTFfUEFEX0NTUEkxX01PU0lfX0VDU1BJMV9NT1NJIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NT1NJX19HUElPNF8yMgkJKF9NWDUxX1BBRF9DU1BJMV9NT1NJX19HUElPNF8yMiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NT1NJX19JMkMxX1NEQQkJKF9NWDUxX1BBRF9DU1BJMV9NT1NJX19JMkMxX1NEQSB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX01JU09fX0FVRDRfUlhECQkoX01YNTFfUEFEX0NTUEkxX01JU09fX0FVRDRfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfTUlTT19fRUNTUEkxX01JU08JKF9NWDUxX1BBRF9DU1BJMV9NSVNPX19FQ1NQSTFfTUlTTyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfTUlTT19fR1BJTzRfMjMJCShfTVg1MV9QQURfQ1NQSTFfTUlTT19fR1BJTzRfMjMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MwX19BVUQ0X1RYQwkJKF9NWDUxX1BBRF9DU1BJMV9TUzBfX0FVRDRfVFhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MwX19FQ1NQSTFfU1MwCQkoX01YNTFfUEFEX0NTUEkxX1NTMF9fRUNTUEkxX1NTMCB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MwX19HUElPNF8yNAkJKF9NWDUxX1BBRF9DU1BJMV9TUzBfX0dQSU80XzI0IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NTMV9fQVVENF9UWEQJCShfTVg1MV9QQURfQ1NQSTFfU1MxX19BVUQ0X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NTMV9fRUNTUEkxX1NTMQkJKF9NWDUxX1BBRF9DU1BJMV9TUzFfX0VDU1BJMV9TUzEgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NTMV9fR1BJTzRfMjUJCShfTVg1MV9QQURfQ1NQSTFfU1MxX19HUElPNF8yNSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9SRFlfX0FVRDRfVFhGUwkJKF9NWDUxX1BBRF9DU1BJMV9SRFlfX0FVRDRfVFhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1JEWV9fRUNTUEkxX1JEWQkJKF9NWDUxX1BBRF9DU1BJMV9SRFlfX0VDU1BJMV9SRFkgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1JEWV9fR1BJTzRfMjYJCShfTVg1MV9QQURfQ1NQSTFfUkRZX19HUElPNF8yNiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TQ0xLX19FQ1NQSTFfU0NMSwkoX01YNTFfUEFEX0NTUEkxX1NDTEtfX0VDU1BJMV9TQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TQ0xLX19HUElPNF8yNwkJKF9NWDUxX1BBRF9DU1BJMV9TQ0xLX19HUElPNF8yNyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TQ0xLX19JMkMxX1NDTAkJKF9NWDUxX1BBRF9DU1BJMV9TQ0xLX19JMkMxX1NDTCB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQxX1JYRF9fR1BJTzRfMjgJCShfTVg1MV9QQURfVUFSVDFfUlhEX19HUElPNF8yOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9SWERfX1VBUlQxX1JYRAkJKF9NWDUxX1BBRF9VQVJUMV9SWERfX1VBUlQxX1JYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9UWERfX0dQSU80XzI5CQkoX01YNTFfUEFEX1VBUlQxX1RYRF9fR1BJTzRfMjkgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDFfVFhEX19QV00yX1BXTU8JCShfTVg1MV9QQURfVUFSVDFfVFhEX19QV00yX1BXTU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9UWERfX1VBUlQxX1RYRAkJKF9NWDUxX1BBRF9VQVJUMV9UWERfX1VBUlQxX1RYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9SVFNfX0dQSU80XzMwCQkoX01YNTFfUEFEX1VBUlQxX1JUU19fR1BJTzRfMzAgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDFfUlRTX19VQVJUMV9SVFMJCShfTVg1MV9QQURfVUFSVDFfUlRTX19VQVJUMV9SVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDFfQ1RTX19HUElPNF8zMQkJKF9NWDUxX1BBRF9VQVJUMV9DVFNfX0dQSU80XzMxIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQxX0NUU19fVUFSVDFfQ1RTCQkoX01YNTFfUEFEX1VBUlQxX0NUU19fVUFSVDFfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1JYRF9fRklSSV9UWEQJCShfTVg1MV9QQURfVUFSVDJfUlhEX19GSVJJX1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1JYRF9fR1BJTzFfMjAJCShfTVg1MV9QQURfVUFSVDJfUlhEX19HUElPMV8yMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9SWERfX1VBUlQyX1JYRAkJKF9NWDUxX1BBRF9VQVJUMl9SWERfX1VBUlQyX1JYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9UWERfX0ZJUklfUlhECQkoX01YNTFfUEFEX1VBUlQyX1RYRF9fRklSSV9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9UWERfX0dQSU8xXzIxCQkoX01YNTFfUEFEX1VBUlQyX1RYRF9fR1BJTzFfMjEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDJfVFhEX19VQVJUMl9UWEQJCShfTVg1MV9QQURfVUFSVDJfVFhEX19VQVJUMl9UWEQgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDNfUlhEX19DU0kxX0QwCQkoX01YNTFfUEFEX1VBUlQzX1JYRF9fQ1NJMV9EMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1JYRF9fR1BJTzFfMjIJCShfTVg1MV9QQURfVUFSVDNfUlhEX19HUElPMV8yMiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUM19SWERfX1VBUlQxX0RUUgkJKF9NWDUxX1BBRF9VQVJUM19SWERfX1VBUlQxX0RUUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1JYRF9fVUFSVDNfUlhECQkoX01YNTFfUEFEX1VBUlQzX1JYRF9fVUFSVDNfUlhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1RYRF9fQ1NJMV9EMQkJKF9NWDUxX1BBRF9VQVJUM19UWERfX0NTSTFfRDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUM19UWERfX0dQSU8xXzIzCQkoX01YNTFfUEFEX1VBUlQzX1RYRF9fR1BJTzFfMjMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDNfVFhEX19VQVJUMV9EU1IJCShfTVg1MV9QQURfVUFSVDNfVFhEX19VQVJUMV9EU1IgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDNfVFhEX19VQVJUM19UWEQJCShfTVg1MV9QQURfVUFSVDNfVFhEX19VQVJUM19UWEQgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfT1dJUkVfTElORV9fR1BJTzFfMjQJCShfTVg1MV9QQURfT1dJUkVfTElORV9fR1BJTzFfMjQgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfT1dJUkVfTElORV9fT1dJUkVfTElORQkJKF9NWDUxX1BBRF9PV0lSRV9MSU5FX19PV0lSRV9MSU5FIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfT1dJUkVfTElORV9fU1BESUZfT1VUCQkoX01YNTFfUEFEX09XSVJFX0xJTkVfX1NQRElGX09VVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9ST1cwX19LRVlfUk9XMAkJKF9NWDUxX1BBRF9LRVlfUk9XMF9fS0VZX1JPVzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XMV9fS0VZX1JPVzEJCShfTVg1MV9QQURfS0VZX1JPVzFfX0tFWV9ST1cxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX1JPVzJfX0tFWV9ST1cyCQkoX01YNTFfUEFEX0tFWV9ST1cyX19LRVlfUk9XMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9ST1czX19LRVlfUk9XMwkJKF9NWDUxX1BBRF9LRVlfUk9XM19fS0VZX1JPVzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMF9fS0VZX0NPTDAJCShfTVg1MV9QQURfS0VZX0NPTDBfX0tFWV9DT0wwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDBfX1BMTDFfQllQCQkoX01YNTFfUEFEX0tFWV9DT0wwX19QTEwxX0JZUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wxX19LRVlfQ09MMQkJKF9NWDUxX1BBRF9LRVlfQ09MMV9fS0VZX0NPTDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMV9fUExMMl9CWVAJCShfTVg1MV9QQURfS0VZX0NPTDFfX1BMTDJfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDJfX0tFWV9DT0wyCQkoX01YNTFfUEFEX0tFWV9DT0wyX19LRVlfQ09MMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wyX19QTEwzX0JZUAkJKF9NWDUxX1BBRF9LRVlfQ09MMl9fUExMM19CWVAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MM19fS0VZX0NPTDMJCShfTVg1MV9QQURfS0VZX0NPTDNfX0tFWV9DT0wzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDRfX0kyQzJfU0NMCQkoX01YNTFfUEFEX0tFWV9DT0w0X19JMkMyX1NDTCB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w0X19LRVlfQ09MNAkJKF9NWDUxX1BBRF9LRVlfQ09MNF9fS0VZX0NPTDQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNF9fU1BESUZfT1VUMQkJKF9NWDUxX1BBRF9LRVlfQ09MNF9fU1BESUZfT1VUMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w0X19VQVJUMV9SSQkJKF9NWDUxX1BBRF9LRVlfQ09MNF9fVUFSVDFfUkkgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDRfX1VBUlQzX1JUUwkJKF9NWDUxX1BBRF9LRVlfQ09MNF9fVUFSVDNfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w1X19JMkMyX1NEQQkJKF9NWDUxX1BBRF9LRVlfQ09MNV9fSTJDMl9TREEgfCBNVVhfUEFEX0NUUkwoTVg1MV9JMkNfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNV9fS0VZX0NPTDUJCShfTVg1MV9QQURfS0VZX0NPTDVfX0tFWV9DT0w1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDVfX1VBUlQxX0RDRAkJKF9NWDUxX1BBRF9LRVlfQ09MNV9fVUFSVDFfRENEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w1X19VQVJUM19DVFMJCShfTVg1MV9QQURfS0VZX0NPTDVfX1VBUlQzX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9DTEtfX0NTUElfU0NMSwkJKF9NWDUxX1BBRF9VU0JIMV9DTEtfX0NTUElfU0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfQ0xLX19HUElPMV8yNQkJKF9NWDUxX1BBRF9VU0JIMV9DTEtfX0dQSU8xXzI1IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0NMS19fSTJDMl9TQ0wJCShfTVg1MV9QQURfVVNCSDFfQ0xLX19JMkMyX1NDTCB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0NMS19fVVNCSDFfQ0xLCQkoX01YNTFfUEFEX1VTQkgxX0NMS19fVVNCSDFfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9ESVJfX0NTUElfTU9TSQkJKF9NWDUxX1BBRF9VU0JIMV9ESVJfX0NTUElfTU9TSSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfRElSX19HUElPMV8yNgkJKF9NWDUxX1BBRF9VU0JIMV9ESVJfX0dQSU8xXzI2IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RJUl9fSTJDMl9TREEJCShfTVg1MV9QQURfVVNCSDFfRElSX19JMkMyX1NEQSB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RJUl9fVVNCSDFfRElSCQkoX01YNTFfUEFEX1VTQkgxX0RJUl9fVVNCSDFfRElSIHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9TVFBfX0NTUElfUkRZCQkoX01YNTFfUEFEX1VTQkgxX1NUUF9fQ1NQSV9SRFkgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX1NUUF9fR1BJTzFfMjcJCShfTVg1MV9QQURfVVNCSDFfU1RQX19HUElPMV8yNyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9TVFBfX1VBUlQzX1JYRAkJKF9NWDUxX1BBRF9VU0JIMV9TVFBfX1VBUlQzX1JYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9TVFBfX1VTQkgxX1NUUAkJKF9NWDUxX1BBRF9VU0JIMV9TVFBfX1VTQkgxX1NUUCB8IE1VWF9QQURfQ1RSTChNWDUxX1VTQkgxX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfTlhUX19DU1BJX01JU08JCShfTVg1MV9QQURfVVNCSDFfTlhUX19DU1BJX01JU08gfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX05YVF9fR1BJTzFfMjgJCShfTVg1MV9QQURfVVNCSDFfTlhUX19HUElPMV8yOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9OWFRfX1VBUlQzX1RYRAkJKF9NWDUxX1BBRF9VU0JIMV9OWFRfX1VBUlQzX1RYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9OWFRfX1VTQkgxX05YVAkJKF9NWDUxX1BBRF9VU0JIMV9OWFRfX1VTQkgxX05YVCB8IE1VWF9QQURfQ1RSTChNWDUxX1VTQkgxX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTBfX0dQSU8xXzExCQkoX01YNTFfUEFEX1VTQkgxX0RBVEEwX19HUElPMV8xMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMF9fVUFSVDJfQ1RTCQkoX01YNTFfUEFEX1VTQkgxX0RBVEEwX19VQVJUMl9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTBfX1VTQkgxX0RBVEEwCShfTVg1MV9QQURfVVNCSDFfREFUQTBfX1VTQkgxX0RBVEEwIHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMV9fR1BJTzFfMTIJCShfTVg1MV9QQURfVVNCSDFfREFUQTFfX0dQSU8xXzEyIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEExX19VQVJUMl9SWEQJCShfTVg1MV9QQURfVVNCSDFfREFUQTFfX1VBUlQyX1JYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMV9fVVNCSDFfREFUQTEJKF9NWDUxX1BBRF9VU0JIMV9EQVRBMV9fVVNCSDFfREFUQTEgfCBNVVhfUEFEX0NUUkwoTVg1MV9VU0JIMV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEyX19HUElPMV8xMwkJKF9NWDUxX1BBRF9VU0JIMV9EQVRBMl9fR1BJTzFfMTMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTJfX1VBUlQyX1RYRAkJKF9NWDUxX1BBRF9VU0JIMV9EQVRBMl9fVUFSVDJfVFhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEyX19VU0JIMV9EQVRBMgkoX01YNTFfUEFEX1VTQkgxX0RBVEEyX19VU0JIMV9EQVRBMiB8IE1VWF9QQURfQ1RSTChNWDUxX1VTQkgxX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTNfX0dQSU8xXzE0CQkoX01YNTFfUEFEX1VTQkgxX0RBVEEzX19HUElPMV8xNCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBM19fVUFSVDJfUlRTCQkoX01YNTFfUEFEX1VTQkgxX0RBVEEzX19VQVJUMl9SVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTNfX1VTQkgxX0RBVEEzCShfTVg1MV9QQURfVVNCSDFfREFUQTNfX1VTQkgxX0RBVEEzIHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNF9fQ1NQSV9TUzAJCShfTVg1MV9QQURfVVNCSDFfREFUQTRfX0NTUElfU1MwIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNF9fR1BJTzFfMTUJCShfTVg1MV9QQURfVVNCSDFfREFUQTRfX0dQSU8xXzE1IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE0X19VU0JIMV9EQVRBNAkoX01YNTFfUEFEX1VTQkgxX0RBVEE0X19VU0JIMV9EQVRBNCB8IE1VWF9QQURfQ1RSTChNWDUxX1VTQkgxX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTVfX0NTUElfU1MxCQkoX01YNTFfUEFEX1VTQkgxX0RBVEE1X19DU1BJX1NTMSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTVfX0dQSU8xXzE2CQkoX01YNTFfUEFEX1VTQkgxX0RBVEE1X19HUElPMV8xNiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNV9fVVNCSDFfREFUQTUJKF9NWDUxX1BBRF9VU0JIMV9EQVRBNV9fVVNCSDFfREFUQTUgfCBNVVhfUEFEX0NUUkwoTVg1MV9VU0JIMV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE2X19DU1BJX1NTMwkJKF9NWDUxX1BBRF9VU0JIMV9EQVRBNl9fQ1NQSV9TUzMgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE2X19HUElPMV8xNwkJKF9NWDUxX1BBRF9VU0JIMV9EQVRBNl9fR1BJTzFfMTcgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTZfX1VTQkgxX0RBVEE2CShfTVg1MV9QQURfVVNCSDFfREFUQTZfX1VTQkgxX0RBVEE2IHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBN19fRUNTUEkxX1NTMwkoX01YNTFfUEFEX1VTQkgxX0RBVEE3X19FQ1NQSTFfU1MzIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBN19fRUNTUEkyX1NTMwkoX01YNTFfUEFEX1VTQkgxX0RBVEE3X19FQ1NQSTJfU1MzIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBN19fR1BJTzFfMTgJCShfTVg1MV9QQURfVVNCSDFfREFUQTdfX0dQSU8xXzE4IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE3X19VU0JIMV9EQVRBNwkoX01YNTFfUEFEX1VTQkgxX0RBVEE3X19VU0JIMV9EQVRBNyB8IE1VWF9QQURfQ1RSTChNWDUxX1VTQkgxX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjExX19ESTFfUElOMTEJCShfTVg1MV9QQURfREkxX1BJTjExX19ESTFfUElOMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTFfX0VDU1BJMV9TUzIJCShfTVg1MV9QQURfREkxX1BJTjExX19FQ1NQSTFfU1MyIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTFfX0dQSU8zXzAJCShfTVg1MV9QQURfREkxX1BJTjExX19HUElPM18wIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4xMl9fREkxX1BJTjEyCQkoX01YNTFfUEFEX0RJMV9QSU4xMl9fREkxX1BJTjEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjEyX19HUElPM18xCQkoX01YNTFfUEFEX0RJMV9QSU4xMl9fR1BJTzNfMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTNfX0RJMV9QSU4xMwkJKF9NWDUxX1BBRF9ESTFfUElOMTNfX0RJMV9QSU4xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4xM19fR1BJTzNfMgkJKF9NWDUxX1BBRF9ESTFfUElOMTNfX0dQSU8zXzIgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX0QwX0NTX19ESTFfRDBfQ1MJCShfTVg1MV9QQURfREkxX0QwX0NTX19ESTFfRDBfQ1MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfRDBfQ1NfX0dQSU8zXzMJCShfTVg1MV9QQURfREkxX0QwX0NTX19HUElPM18zIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMV9EMV9DU19fREkxX0QxX0NTCQkoX01YNTFfUEFEX0RJMV9EMV9DU19fREkxX0QxX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX0QxX0NTX19ESVNQMV9QSU4xNAkJKF9NWDUxX1BBRF9ESTFfRDFfQ1NfX0RJU1AxX1BJTjE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX0QxX0NTX19ESVNQMV9QSU41CQkoX01YNTFfUEFEX0RJMV9EMV9DU19fRElTUDFfUElONSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMV9EMV9DU19fR1BJTzNfNAkJKF9NWDUxX1BBRF9ESTFfRDFfQ1NfX0dQSU8zXzQgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0RJU1AxX1BJTjEJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX0RJTl9fRElTUDFfUElOMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfRElOX19ESVNQQjJfU0VSX0RJTgkoX01YNTFfUEFEX0RJU1BCMl9TRVJfRElOX19ESVNQQjJfU0VSX0RJTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfRElOX19HUElPM181CShfTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0dQSU8zXzUgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU9fX0RJU1AxX1BJTjYJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fRElTUDFfUElONiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfRElPX19ESVNQQjJfU0VSX0RJTwkoX01YNTFfUEFEX0RJU1BCMl9TRVJfRElPX19ESVNQQjJfU0VSX0RJTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfRElPX19HUElPM182CShfTVg1MV9QQURfRElTUEIyX1NFUl9ESU9fX0dQSU8zXzYgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0RJU1AxX1BJTjE3CShfTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0RJU1AxX1BJTjE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0RJU1AxX1BJTjcJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fRElTUDFfUElONyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19ESVNQQjJfU0VSX0NMSwkoX01YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19ESVNQQjJfU0VSX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19HUElPM183CShfTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0dQSU8zXzcgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUDFfRVhUX0NMSwkoX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX0VYVF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQMV9QSU4xNgkoX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX1BJTjE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUDFfUElOOAkoX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX1BJTjggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQQjJfU0VSX1JTCShfTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUEIyX1NFUl9SUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1BCMl9TRVJfUlMJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQQjJfU0VSX1JTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9SU19fR1BJTzNfOAkJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19HUElPM184IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDBfX0RJU1AxX0RBVDAJCShfTVg1MV9QQURfRElTUDFfREFUMF9fRElTUDFfREFUMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDFfX0RJU1AxX0RBVDEJCShfTVg1MV9QQURfRElTUDFfREFUMV9fRElTUDFfREFUMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDJfX0RJU1AxX0RBVDIJCShfTVg1MV9QQURfRElTUDFfREFUMl9fRElTUDFfREFUMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDNfX0RJU1AxX0RBVDMJCShfTVg1MV9QQURfRElTUDFfREFUM19fRElTUDFfREFUMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDRfX0RJU1AxX0RBVDQJCShfTVg1MV9QQURfRElTUDFfREFUNF9fRElTUDFfREFUNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDVfX0RJU1AxX0RBVDUJCShfTVg1MV9QQURfRElTUDFfREFUNV9fRElTUDFfREFUNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDZfX0JPT1RfVVNCX1NSQwkoX01YNTFfUEFEX0RJU1AxX0RBVDZfX0JPT1RfVVNCX1NSQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDZfX0RJU1AxX0RBVDYJCShfTVg1MV9QQURfRElTUDFfREFUNl9fRElTUDFfREFUNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDdfX0JPT1RfRUVQUk9NX0NGRwkoX01YNTFfUEFEX0RJU1AxX0RBVDdfX0JPT1RfRUVQUk9NX0NGRyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDdfX0RJU1AxX0RBVDcJCShfTVg1MV9QQURfRElTUDFfREFUN19fRElTUDFfREFUNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDhfX0JPT1RfU1JDMAkJKF9NWDUxX1BBRF9ESVNQMV9EQVQ4X19CT09UX1NSQzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ4X19ESVNQMV9EQVQ4CQkoX01YNTFfUEFEX0RJU1AxX0RBVDhfX0RJU1AxX0RBVDggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ5X19CT09UX1NSQzEJCShfTVg1MV9QQURfRElTUDFfREFUOV9fQk9PVF9TUkMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUOV9fRElTUDFfREFUOQkJKF9NWDUxX1BBRF9ESVNQMV9EQVQ5X19ESVNQMV9EQVQ5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTBfX0JPT1RfU1BBUkVfU0laRQkoX01YNTFfUEFEX0RJU1AxX0RBVDEwX19CT09UX1NQQVJFX1NJWkUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMF9fRElTUDFfREFUMTAJKF9NWDUxX1BBRF9ESVNQMV9EQVQxMF9fRElTUDFfREFUMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMV9fQk9PVF9MUEJfRlJFUTIJKF9NWDUxX1BBRF9ESVNQMV9EQVQxMV9fQk9PVF9MUEJfRlJFUTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMV9fRElTUDFfREFUMTEJKF9NWDUxX1BBRF9ESVNQMV9EQVQxMV9fRElTUDFfREFUMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMl9fQk9PVF9NTENfU0VMCShfTVg1MV9QQURfRElTUDFfREFUMTJfX0JPT1RfTUxDX1NFTCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDEyX19ESVNQMV9EQVQxMgkoX01YNTFfUEFEX0RJU1AxX0RBVDEyX19ESVNQMV9EQVQxMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDEzX19CT09UX01FTV9DVEwwCShfTVg1MV9QQURfRElTUDFfREFUMTNfX0JPT1RfTUVNX0NUTDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxM19fRElTUDFfREFUMTMJKF9NWDUxX1BBRF9ESVNQMV9EQVQxM19fRElTUDFfREFUMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNF9fQk9PVF9NRU1fQ1RMMQkoX01YNTFfUEFEX0RJU1AxX0RBVDE0X19CT09UX01FTV9DVEwxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTRfX0RJU1AxX0RBVDE0CShfTVg1MV9QQURfRElTUDFfREFUMTRfX0RJU1AxX0RBVDE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTVfX0JPT1RfQlVTX1dJRFRICShfTVg1MV9QQURfRElTUDFfREFUMTVfX0JPT1RfQlVTX1dJRFRIIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTVfX0RJU1AxX0RBVDE1CShfTVg1MV9QQURfRElTUDFfREFUMTVfX0RJU1AxX0RBVDE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTZfX0JPT1RfUEFHRV9TSVpFMAkoX01YNTFfUEFEX0RJU1AxX0RBVDE2X19CT09UX1BBR0VfU0laRTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNl9fRElTUDFfREFUMTYJKF9NWDUxX1BBRF9ESVNQMV9EQVQxNl9fRElTUDFfREFUMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxN19fQk9PVF9QQUdFX1NJWkUxCShfTVg1MV9QQURfRElTUDFfREFUMTdfX0JPT1RfUEFHRV9TSVpFMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE3X19ESVNQMV9EQVQxNwkoX01YNTFfUEFEX0RJU1AxX0RBVDE3X19ESVNQMV9EQVQxNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE4X19CT09UX1dFSU1fTVVYRUQwCShfTVg1MV9QQURfRElTUDFfREFUMThfX0JPT1RfV0VJTV9NVVhFRDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDFfREFUMTgJKF9NWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDFfREFUMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDJfUElOMTEJKF9NWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDJfUElOMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDJfUElONQkoX01YNTFfUEFEX0RJU1AxX0RBVDE4X19ESVNQMl9QSU41IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTlfX0JPT1RfV0VJTV9NVVhFRDEJKF9NWDUxX1BBRF9ESVNQMV9EQVQxOV9fQk9PVF9XRUlNX01VWEVEMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMV9EQVQxOQkoX01YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMV9EQVQxOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMl9QSU4xMgkoX01YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMl9QSU4xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMl9QSU42CShfTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AyX1BJTjYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMF9fQk9PVF9NRU1fVFlQRTAJKF9NWDUxX1BBRF9ESVNQMV9EQVQyMF9fQk9PVF9NRU1fVFlQRTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDFfREFUMjAJKF9NWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDFfREFUMjAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDJfUElOMTMJKF9NWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDJfUElOMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDJfUElONwkoX01YNTFfUEFEX0RJU1AxX0RBVDIwX19ESVNQMl9QSU43IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjFfX0JPT1RfTUVNX1RZUEUxCShfTVg1MV9QQURfRElTUDFfREFUMjFfX0JPT1RfTUVNX1RZUEUxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjFfX0RJU1AxX0RBVDIxCShfTVg1MV9QQURfRElTUDFfREFUMjFfX0RJU1AxX0RBVDIxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjFfX0RJU1AyX1BJTjE0CShfTVg1MV9QQURfRElTUDFfREFUMjFfX0RJU1AyX1BJTjE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjFfX0RJU1AyX1BJTjgJKF9NWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDJfUElOOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIyX19CT09UX0xQQl9GUkVRMAkoX01YNTFfUEFEX0RJU1AxX0RBVDIyX19CT09UX0xQQl9GUkVRMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMV9EQVQyMgkoX01YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMV9EQVQyMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMl9EMF9DUwkoX01YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMl9EMF9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMl9EQVQxNgkoX01YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMl9EQVQxNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19CT09UX0xQQl9GUkVRMQkoX01YNTFfUEFEX0RJU1AxX0RBVDIzX19CT09UX0xQQl9GUkVRMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMV9EQVQyMwkoX01YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMV9EQVQyMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9EMV9DUwkoX01YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9EMV9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9EQVQxNwkoX01YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9EQVQxNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9TRVJfQ1MJKF9NWDUxX1BBRF9ESVNQMV9EQVQyM19fRElTUDJfU0VSX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjNfX0RJMV9QSU4zCQkoX01YNTFfUEFEX0RJMV9QSU4zX19ESTFfUElOMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4yX19ESTFfUElOMgkJKF9NWDUxX1BBRF9ESTFfUElOMl9fREkxX1BJTjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESV9HUDJfX0RJU1AxX1NFUl9DTEsJCShfTVg1MV9QQURfRElfR1AyX19ESVNQMV9TRVJfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElfR1AyX19ESVNQMl9XQUlUCQkoX01YNTFfUEFEX0RJX0dQMl9fRElTUDJfV0FJVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQM19fQ1NJMV9EQVRBX0VOCQkoX01YNTFfUEFEX0RJX0dQM19fQ1NJMV9EQVRBX0VOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElfR1AzX19ESVNQMV9TRVJfRElPCQkoX01YNTFfUEFEX0RJX0dQM19fRElTUDFfU0VSX0RJTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQM19fRkVDX1RYX0VSCQkoX01YNTFfUEFEX0RJX0dQM19fRkVDX1RYX0VSIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU40X19DU0kyX0RBVEFfRU4JCShfTVg1MV9QQURfREkyX1BJTjRfX0NTSTJfREFUQV9FTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU40X19ESTJfUElONAkJKF9NWDUxX1BBRF9ESTJfUElONF9fREkyX1BJTjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTJfUElONF9fRkVDX0NSUwkJKF9NWDUxX1BBRF9ESTJfUElONF9fRkVDX0NSUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU4yX19ESTJfUElOMgkJKF9NWDUxX1BBRF9ESTJfUElOMl9fREkyX1BJTjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTJfUElOMl9fRkVDX01EQwkJKF9NWDUxX1BBRF9ESTJfUElOMl9fRkVDX01EQyB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzUpKQotI2RlZmluZSBNWDUxX1BBRF9ESTJfUElOM19fREkyX1BJTjMJCShfTVg1MV9QQURfREkyX1BJTjNfX0RJMl9QSU4zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkyX1BJTjNfX0ZFQ19NRElPCQkoX01YNTFfUEFEX0RJMl9QSU4zX19GRUNfTURJTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9ESVNQX0NMS19fREkyX0RJU1BfQ0xLCShfTVg1MV9QQURfREkyX0RJU1BfQ0xLX19ESTJfRElTUF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTJfRElTUF9DTEtfX0ZFQ19SREFUQTEJKF9NWDUxX1BBRF9ESTJfRElTUF9DTEtfX0ZFQ19SREFUQTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESV9HUDRfX0RJMl9QSU4xNQkJKF9NWDUxX1BBRF9ESV9HUDRfX0RJMl9QSU4xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQNF9fRElTUDFfU0VSX0RJTgkJKF9NWDUxX1BBRF9ESV9HUDRfX0RJU1AxX1NFUl9ESU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESV9HUDRfX0RJU1AyX1BJTjEJCShfTVg1MV9QQURfRElfR1A0X19ESVNQMl9QSU4xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElfR1A0X19GRUNfUkRBVEEyCQkoX01YNTFfUEFEX0RJX0dQNF9fRkVDX1JEQVRBMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDBfX0RJU1AyX0RBVDAJCShfTVg1MV9QQURfRElTUDJfREFUMF9fRElTUDJfREFUMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDBfX0ZFQ19SREFUQTMJCShfTVg1MV9QQURfRElTUDJfREFUMF9fRkVDX1JEQVRBMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDBfX0tFWV9DT0w2CQkoX01YNTFfUEFEX0RJU1AyX0RBVDBfX0tFWV9DT0w2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMF9fVUFSVDNfUlhECQkoX01YNTFfUEFEX0RJU1AyX0RBVDBfX1VBUlQzX1JYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQwX19VU0JIM19DTEsJCShfTVg1MV9QQURfRElTUDJfREFUMF9fVVNCSDNfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDFfX0RJU1AyX0RBVDEJCShfTVg1MV9QQURfRElTUDJfREFUMV9fRElTUDJfREFUMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDFfX0ZFQ19SWF9FUgkJKF9NWDUxX1BBRF9ESVNQMl9EQVQxX19GRUNfUlhfRVIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxX19LRVlfQ09MNwkJKF9NWDUxX1BBRF9ESVNQMl9EQVQxX19LRVlfQ09MNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDFfX1VBUlQzX1RYRAkJKF9NWDUxX1BBRF9ESVNQMl9EQVQxX19VQVJUM19UWEQgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fVVNCSDNfRElSCQkoX01YNTFfUEFEX0RJU1AyX0RBVDFfX1VTQkgzX0RJUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDJfX0RJU1AyX0RBVDIJCShfTVg1MV9QQURfRElTUDJfREFUMl9fRElTUDJfREFUMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDNfX0RJU1AyX0RBVDMJCShfTVg1MV9QQURfRElTUDJfREFUM19fRElTUDJfREFUMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDRfX0RJU1AyX0RBVDQJCShfTVg1MV9QQURfRElTUDJfREFUNF9fRElTUDJfREFUNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDVfX0RJU1AyX0RBVDUJCShfTVg1MV9QQURfRElTUDJfREFUNV9fRElTUDJfREFUNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDZfX0RJU1AyX0RBVDYJCShfTVg1MV9QQURfRElTUDJfREFUNl9fRElTUDJfREFUNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDZfX0ZFQ19UREFUQTEJCShfTVg1MV9QQURfRElTUDJfREFUNl9fRkVDX1REQVRBMSB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzUpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ2X19HUElPMV8xOQkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ2X19HUElPMV8xOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDZfX0tFWV9ST1c0CQkoX01YNTFfUEFEX0RJU1AyX0RBVDZfX0tFWV9ST1c0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUNl9fVVNCSDNfU1RQCQkoX01YNTFfUEFEX0RJU1AyX0RBVDZfX1VTQkgzX1NUUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDdfX0RJU1AyX0RBVDcJCShfTVg1MV9QQURfRElTUDJfREFUN19fRElTUDJfREFUNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDdfX0ZFQ19UREFUQTIJCShfTVg1MV9QQURfRElTUDJfREFUN19fRkVDX1REQVRBMiB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzUpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ3X19HUElPMV8yOQkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ3X19HUElPMV8yOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDdfX0tFWV9ST1c1CQkoX01YNTFfUEFEX0RJU1AyX0RBVDdfX0tFWV9ST1c1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUN19fVVNCSDNfTlhUCQkoX01YNTFfUEFEX0RJU1AyX0RBVDdfX1VTQkgzX05YVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDhfX0RJU1AyX0RBVDgJCShfTVg1MV9QQURfRElTUDJfREFUOF9fRElTUDJfREFUOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDhfX0ZFQ19UREFUQTMJCShfTVg1MV9QQURfRElTUDJfREFUOF9fRkVDX1REQVRBMyB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzUpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ4X19HUElPMV8zMAkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ4X19HUElPMV8zMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDhfX0tFWV9ST1c2CQkoX01YNTFfUEFEX0RJU1AyX0RBVDhfX0tFWV9ST1c2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOF9fVVNCSDNfREFUQTAJKF9NWDUxX1BBRF9ESVNQMl9EQVQ4X19VU0JIM19EQVRBMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDlfX0FVRDZfUlhDCQkoX01YNTFfUEFEX0RJU1AyX0RBVDlfX0FVRDZfUlhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOV9fRElTUDJfREFUOQkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ5X19ESVNQMl9EQVQ5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOV9fRkVDX1RYX0VOCQkoX01YNTFfUEFEX0RJU1AyX0RBVDlfX0ZFQ19UWF9FTiB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzUpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ5X19HUElPMV8zMQkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ5X19HUElPMV8zMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDlfX1VTQkgzX0RBVEExCShfTVg1MV9QQURfRElTUDJfREFUOV9fVVNCSDNfREFUQTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMF9fRElTUDJfREFUMTAJKF9NWDUxX1BBRF9ESVNQMl9EQVQxMF9fRElTUDJfREFUMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMF9fRElTUDJfU0VSX0NTCShfTVg1MV9QQURfRElTUDJfREFUMTBfX0RJU1AyX1NFUl9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEwX19GRUNfQ09MCQkoX01YNTFfUEFEX0RJU1AyX0RBVDEwX19GRUNfQ09MIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTBfX0tFWV9ST1c3CQkoX01YNTFfUEFEX0RJU1AyX0RBVDEwX19LRVlfUk9XNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEwX19VU0JIM19EQVRBMgkoX01YNTFfUEFEX0RJU1AyX0RBVDEwX19VU0JIM19EQVRBMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDExX19BVUQ2X1RYRAkJKF9NWDUxX1BBRF9ESVNQMl9EQVQxMV9fQVVENl9UWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMV9fRElTUDJfREFUMTEJKF9NWDUxX1BBRF9ESVNQMl9EQVQxMV9fRElTUDJfREFUMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMV9fRkVDX1JYX0NMSwkoX01YNTFfUEFEX0RJU1AyX0RBVDExX19GRUNfUlhfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTFfX0dQSU8xXzEwCQkoX01YNTFfUEFEX0RJU1AyX0RBVDExX19HUElPMV8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDExX19VU0JIM19EQVRBMwkoX01YNTFfUEFEX0RJU1AyX0RBVDExX19VU0JIM19EQVRBMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEyX19BVUQ2X1JYRAkJKF9NWDUxX1BBRF9ESVNQMl9EQVQxMl9fQVVENl9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMl9fRElTUDJfREFUMTIJKF9NWDUxX1BBRF9ESVNQMl9EQVQxMl9fRElTUDJfREFUMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMl9fRkVDX1JYX0RWCQkoX01YNTFfUEFEX0RJU1AyX0RBVDEyX19GRUNfUlhfRFYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMl9fVVNCSDNfREFUQTQJKF9NWDUxX1BBRF9ESVNQMl9EQVQxMl9fVVNCSDNfREFUQTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxM19fQVVENl9UWEMJCShfTVg1MV9QQURfRElTUDJfREFUMTNfX0FVRDZfVFhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTNfX0RJU1AyX0RBVDEzCShfTVg1MV9QQURfRElTUDJfREFUMTNfX0RJU1AyX0RBVDEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTNfX0ZFQ19UWF9DTEsJKF9NWDUxX1BBRF9ESVNQMl9EQVQxM19fRkVDX1RYX0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzQpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxM19fVVNCSDNfREFUQTUJKF9NWDUxX1BBRF9ESVNQMl9EQVQxM19fVVNCSDNfREFUQTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNF9fQVVENl9UWEZTCQkoX01YNTFfUEFEX0RJU1AyX0RBVDE0X19BVUQ2X1RYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNF9fRElTUDJfREFUMTQJKF9NWDUxX1BBRF9ESVNQMl9EQVQxNF9fRElTUDJfREFUMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNF9fRkVDX1JEQVRBMAkoX01YNTFfUEFEX0RJU1AyX0RBVDE0X19GRUNfUkRBVEEwIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE0X19VU0JIM19EQVRBNgkoX01YNTFfUEFEX0RJU1AyX0RBVDE0X19VU0JIM19EQVRBNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE1X19BVUQ2X1JYRlMJCShfTVg1MV9QQURfRElTUDJfREFUMTVfX0FVRDZfUlhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE1X19ESVNQMV9TRVJfQ1MJKF9NWDUxX1BBRF9ESVNQMl9EQVQxNV9fRElTUDFfU0VSX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTVfX0RJU1AyX0RBVDE1CShfTVg1MV9QQURfRElTUDJfREFUMTVfX0RJU1AyX0RBVDE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTVfX0ZFQ19UREFUQTAJKF9NWDUxX1BBRF9ESVNQMl9EQVQxNV9fRkVDX1REQVRBMCB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzUpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNV9fVVNCSDNfREFUQTcJKF9NWDUxX1BBRF9ESVNQMl9EQVQxNV9fVVNCSDNfREFUQTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfQ01EX19BVUQ1X1JYRlMJCShfTVg1MV9QQURfU0QxX0NNRF9fQVVENV9SWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0NNRF9fQ1NQSV9NT1NJCQkoX01YNTFfUEFEX1NEMV9DTURfX0NTUElfTU9TSSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9DTURfX1NEMV9DTUQJCShfTVg1MV9QQURfU0QxX0NNRF9fU0QxX0NNRCB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0NMS19fQVVENV9SWEMJCShfTVg1MV9QQURfU0QxX0NMS19fQVVENV9SWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfQ0xLX19DU1BJX1NDTEsJCShfTVg1MV9QQURfU0QxX0NMS19fQ1NQSV9TQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0NMS19fU0QxX0NMSwkJKF9NWDUxX1BBRF9TRDFfQ0xLX19TRDFfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwgfCBQQURfQ1RMX0hZUykpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBMF9fQVVENV9UWEQJCShfTVg1MV9QQURfU0QxX0RBVEEwX19BVUQ1X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBMF9fQ1NQSV9NSVNPCQkoX01YNTFfUEFEX1NEMV9EQVRBMF9fQ1NQSV9NSVNPIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTBfX1NEMV9EQVRBMAkJKF9NWDUxX1BBRF9TRDFfREFUQTBfX1NEMV9EQVRBMCB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMF9fRUlNX0RBMAkJKF9NWDUxX1BBRF9FSU1fREEwX19FSU1fREEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMV9fRUlNX0RBMQkJKF9NWDUxX1BBRF9FSU1fREExX19FSU1fREExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMl9fRUlNX0RBMgkJKF9NWDUxX1BBRF9FSU1fREEyX19FSU1fREEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBM19fRUlNX0RBMwkJKF9NWDUxX1BBRF9FSU1fREEzX19FSU1fREEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEExX19BVUQ1X1JYRAkJKF9NWDUxX1BBRF9TRDFfREFUQTFfX0FVRDVfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEExX19TRDFfREFUQTEJCShfTVg1MV9QQURfU0QxX0RBVEExX19TRDFfREFUQTEgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTRfX0VJTV9EQTQJCShfTVg1MV9QQURfRUlNX0RBNF9fRUlNX0RBNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTVfX0VJTV9EQTUJCShfTVg1MV9QQURfRUlNX0RBNV9fRUlNX0RBNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTZfX0VJTV9EQTYJCShfTVg1MV9QQURfRUlNX0RBNl9fRUlNX0RBNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTdfX0VJTV9EQTcJCShfTVg1MV9QQURfRUlNX0RBN19fRUlNX0RBNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBMl9fQVVENV9UWEMJCShfTVg1MV9QQURfU0QxX0RBVEEyX19BVUQ1X1RYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBMl9fU0QxX0RBVEEyCQkoX01YNTFfUEFEX1NEMV9EQVRBMl9fU0QxX0RBVEEyIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExMF9fRUlNX0RBMTAJCShfTVg1MV9QQURfRUlNX0RBMTBfX0VJTV9EQTEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMTFfX0VJTV9EQTExCQkoX01YNTFfUEFEX0VJTV9EQTExX19FSU1fREExMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQThfX0VJTV9EQTgJCShfTVg1MV9QQURfRUlNX0RBOF9fRUlNX0RBOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTlfX0VJTV9EQTkJCShfTVg1MV9QQURfRUlNX0RBOV9fRUlNX0RBOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBM19fQVVENV9UWEZTCQkoX01YNTFfUEFEX1NEMV9EQVRBM19fQVVENV9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEzX19DU1BJX1NTMQkJKF9NWDUxX1BBRF9TRDFfREFUQTNfX0NTUElfU1MxIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTNfX1NEMV9EQVRBMwkJKF9NWDUxX1BBRF9TRDFfREFUQTNfX1NEMV9EQVRBMyB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMF9fQ1NQSV9TUzIJCShfTVg1MV9QQURfR1BJTzFfMF9fQ1NQSV9TUzIgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzBfX0dQSU8xXzAJCShfTVg1MV9QQURfR1BJTzFfMF9fR1BJTzFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzBfX1NEMV9DRAkJKF9NWDUxX1BBRF9HUElPMV8wX19TRDFfQ0QgfCBNVVhfUEFEX0NUUkwoTVg1MV9FU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzFfX0NTUElfTUlTTwkJKF9NWDUxX1BBRF9HUElPMV8xX19DU1BJX01JU08gfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzFfX0dQSU8xXzEJCShfTVg1MV9QQURfR1BJTzFfMV9fR1BJTzFfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzFfX1NEMV9XUAkJKF9NWDUxX1BBRF9HUElPMV8xX19TRDFfV1AgfCBNVVhfUEFEX0NUUkwoTVg1MV9FU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTEyX19FSU1fREExMgkJKF9NWDUxX1BBRF9FSU1fREExMl9fRUlNX0RBMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExM19fRUlNX0RBMTMJCShfTVg1MV9QQURfRUlNX0RBMTNfX0VJTV9EQTEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMTRfX0VJTV9EQTE0CQkoX01YNTFfUEFEX0VJTV9EQTE0X19FSU1fREExNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTE1X19FSU1fREExNQkJKF9NWDUxX1BBRF9FSU1fREExNV9fRUlNX0RBMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfQ01EX19DU1BJX01PU0kJCShfTVg1MV9QQURfU0QyX0NNRF9fQ1NQSV9NT1NJIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfQ01EX19JMkMxX1NDTAkJKF9NWDUxX1BBRF9TRDJfQ01EX19JMkMxX1NDTCB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9DTURfX1NEMl9DTUQJCShfTVg1MV9QQURfU0QyX0NNRF9fU0QyX0NNRCB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0NMS19fQ1NQSV9TQ0xLCQkoX01YNTFfUEFEX1NEMl9DTEtfX0NTUElfU0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0NMS19fSTJDMV9TREEJCShfTVg1MV9QQURfU0QyX0NMS19fSTJDMV9TREEgfCBNVVhfUEFEX0NUUkwoTVg1MV9JMkNfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfQ0xLX19TRDJfQ0xLCQkoX01YNTFfUEFEX1NEMl9DTEtfX1NEMl9DTEsgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCB8IFBBRF9DVExfSFlTKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEwX19DU1BJX01JU08JCShfTVg1MV9QQURfU0QyX0RBVEEwX19DU1BJX01JU08gfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMF9fU0QxX0RBVDQJCShfTVg1MV9QQURfU0QyX0RBVEEwX19TRDFfREFUNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMF9fU0QyX0RBVEEwCQkoX01YNTFfUEFEX1NEMl9EQVRBMF9fU0QyX0RBVEEwIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTFfX1NEMV9EQVQ1CQkoX01YNTFfUEFEX1NEMl9EQVRBMV9fU0QxX0RBVDUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTFfX1NEMl9EQVRBMQkJKF9NWDUxX1BBRF9TRDJfREFUQTFfX1NEMl9EQVRBMSB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEExX19VU0JIM19IMl9EUAkJKF9NWDUxX1BBRF9TRDJfREFUQTFfX1VTQkgzX0gyX0RQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEyX19TRDFfREFUNgkJKF9NWDUxX1BBRF9TRDJfREFUQTJfX1NEMV9EQVQ2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEyX19TRDJfREFUQTIJCShfTVg1MV9QQURfU0QyX0RBVEEyX19TRDJfREFUQTIgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMl9fVVNCSDNfSDJfRE0JCShfTVg1MV9QQURfU0QyX0RBVEEyX19VU0JIM19IMl9ETSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBM19fQ1NQSV9TUzIJCShfTVg1MV9QQURfU0QyX0RBVEEzX19DU1BJX1NTMiB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEzX19TRDFfREFUNwkJKF9NWDUxX1BBRF9TRDJfREFUQTNfX1NEMV9EQVQ3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEzX19TRDJfREFUQTMJCShfTVg1MV9QQURfU0QyX0RBVEEzX19TRDJfREFUQTMgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzJfX0NDTV9PVVRfMgkJKF9NWDUxX1BBRF9HUElPMV8yX19DQ01fT1VUXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV8yX19HUElPMV8yCQkoX01YNTFfUEFEX0dQSU8xXzJfX0dQSU8xXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV8yX19JMkMyX1NDTAkJKF9NWDUxX1BBRF9HUElPMV8yX19JMkMyX1NDTCB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzJfX1BMTDFfQllQCQkoX01YNTFfUEFEX0dQSU8xXzJfX1BMTDFfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMl9fUFdNMV9QV01PCQkoX01YNTFfUEFEX0dQSU8xXzJfX1BXTTFfUFdNTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzNfX0dQSU8xXzMJCShfTVg1MV9QQURfR1BJTzFfM19fR1BJTzFfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzNfX0kyQzJfU0RBCQkoX01YNTFfUEFEX0dQSU8xXzNfX0kyQzJfU0RBIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfM19fUExMMl9CWVAJCShfTVg1MV9QQURfR1BJTzFfM19fUExMMl9CWVAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV8zX19QV00yX1BXTU8JCShfTVg1MV9QQURfR1BJTzFfM19fUFdNMl9QV01PIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfUE1JQ19JTlRfUkVRX19QTUlDX0lOVF9SRVEJKF9NWDUxX1BBRF9QTUlDX0lOVF9SRVFfX1BNSUNfSU5UX1JFUSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1BNSUNfSU5UX1JFUV9fUE1JQ19QTVVfSVJRX0IJKF9NWDUxX1BBRF9QTUlDX0lOVF9SRVFfX1BNSUNfUE1VX0lSUV9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNF9fRElTUDJfRVhUX0NMSwkJKF9NWDUxX1BBRF9HUElPMV80X19ESVNQMl9FWFRfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNF9fRUlNX1JEWQkJKF9NWDUxX1BBRF9HUElPMV80X19FSU1fUkRZIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNF9fR1BJTzFfNAkJKF9NWDUxX1BBRF9HUElPMV80X19HUElPMV80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNF9fV0RPRzFfV0RPR19CCQkoX01YNTFfUEFEX0dQSU8xXzRfX1dET0cxX1dET0dfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzVfX0NTSTJfTUNMSwkJKF9NWDUxX1BBRF9HUElPMV81X19DU0kyX01DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV81X19ESVNQMl9QSU4xNgkJKF9NWDUxX1BBRF9HUElPMV81X19ESVNQMl9QSU4xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzVfX0dQSU8xXzUJCShfTVg1MV9QQURfR1BJTzFfNV9fR1BJTzFfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzVfX1dET0cyX1dET0dfQgkJKF9NWDUxX1BBRF9HUElPMV81X19XRE9HMl9XRE9HX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV82X19ESVNQMl9QSU4xNwkJKF9NWDUxX1BBRF9HUElPMV82X19ESVNQMl9QSU4xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzZfX0dQSU8xXzYJCShfTVg1MV9QQURfR1BJTzFfNl9fR1BJTzFfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzZfX1JFRl9FTl9CCQkoX01YNTFfUEFEX0dQSU8xXzZfX1JFRl9FTl9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfN19fQ0NNX09VVF8wCQkoX01YNTFfUEFEX0dQSU8xXzdfX0NDTV9PVVRfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzdfX0dQSU8xXzcJCShfTVg1MV9QQURfR1BJTzFfN19fR1BJTzFfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzdfX1NEMl9XUAkJKF9NWDUxX1BBRF9HUElPMV83X19TRDJfV1AgfCBNVVhfUEFEX0NUUkwoTVg1MV9FU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzdfX1NQRElGX09VVDEJCShfTVg1MV9QQURfR1BJTzFfN19fU1BESUZfT1VUMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzhfX0NTSTJfREFUQV9FTgkJKF9NWDUxX1BBRF9HUElPMV84X19DU0kyX0RBVEFfRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV84X19HUElPMV84CQkoX01YNTFfUEFEX0dQSU8xXzhfX0dQSU8xXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV84X19TRDJfQ0QJCShfTVg1MV9QQURfR1BJTzFfOF9fU0QyX0NEIHwgTVVYX1BBRF9DVFJMKE1YNTFfRVNESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV84X19VU0JIM19QV1IJCShfTVg1MV9QQURfR1BJTzFfOF9fVVNCSDNfUFdSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fQ0NNX09VVF8xCQkoX01YNTFfUEFEX0dQSU8xXzlfX0NDTV9PVVRfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzlfX0RJU1AyX0QxX0NTCQkoX01YNTFfUEFEX0dQSU8xXzlfX0RJU1AyX0QxX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fRElTUDJfU0VSX0NTCQkoX01YNTFfUEFEX0dQSU8xXzlfX0RJU1AyX1NFUl9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzlfX0dQSU8xXzkJCShfTVg1MV9QQURfR1BJTzFfOV9fR1BJTzFfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzlfX1NEMl9MQ1RMCQkoX01YNTFfUEFEX0dQSU8xXzlfX1NEMl9MQ1RMIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fVVNCSDNfT0MJCShfTVg1MV9QQURfR1BJTzFfOV9fVVNCSDNfT0MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIyX19HUElPMl8yMgkJSU9NVVhfUEFEKDB4NDY4LCAweDBkNCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fR1BUX0NNUE9VVDEJCUlPTVVYX1BBRCgweDQ2OCwgMHgwZDQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fQVVENV9SWEMJCUlPTVVYX1BBRCgweDQ2YywgMHgwZDgsIDYsIDB4OGRjLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fQ1NJMV9EMwkJSU9NVVhfUEFEKDB4NDZjLCAweDBkOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIzX19FSU1fRUIzCQlJT01VWF9QQUQoMHg0NmMsIDB4MGQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0ZFQ19SREFUQTEJCUlPTVVYX1BBRCgweDQ2YywgMHgwZDgsIDMsIDB4OTVjLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fR1BJTzJfMjMJCUlPTVVYX1BBRCgweDQ2YywgMHgwZDgsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0dQVF9DTVBPVVQyCQlJT01VWF9QQUQoMHg0NmMsIDB4MGQ4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9PRV9fRUlNX09FCQkJSU9NVVhfUEFEKDB4NDcwLCAweDBkYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fT0VfX0dQSU8yXzI0CQlJT01VWF9QQUQoMHg0NzAsIDB4MGRjLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MwX19FSU1fQ1MwCQlJT01VWF9QQUQoMHg0NzQsIDB4MGUwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzBfX0dQSU8yXzI1CQlJT01VWF9QQUQoMHg0NzQsIDB4MGUwLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MxX19FSU1fQ1MxCQlJT01VWF9QQUQoMHg0NzgsIDB4MGU0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzFfX0dQSU8yXzI2CQlJT01VWF9QQUQoMHg0NzgsIDB4MGU0LCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19BVUQ1X1RYRAkJSU9NVVhfUEFEKDB4NDdjLCAweDBlOCwgNiwgMHg4ZDgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19DU0kxX0Q0CQlJT01VWF9QQUQoMHg0N2MsIDB4MGU4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzJfX0VJTV9DUzIJCUlPTVVYX1BBRCgweDQ3YywgMHgwZTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMl9fRkVDX1JEQVRBMgkJSU9NVVhfUEFEKDB4NDdjLCAweDBlOCwgMywgMHg5NjAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19HUElPMl8yNwkJSU9NVVhfUEFEKDB4NDdjLCAweDBlOCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMl9fVVNCT1RHX1NUUAkJSU9NVVhfUEFEKDB4NDdjLCAweDBlOCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19BVUQ1X1JYRAkJSU9NVVhfUEFEKDB4NDgwLCAweDBlYywgNiwgMHg4ZDQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19DU0kxX0Q1CQlJT01VWF9QQUQoMHg0ODAsIDB4MGVjLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX0VJTV9DUzMJCUlPTVVYX1BBRCgweDQ4MCwgMHgwZWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTM19fRkVDX1JEQVRBMwkJSU9NVVhfUEFEKDB4NDgwLCAweDBlYywgMywgMHg5NjQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19HUElPMl8yOAkJSU9NVVhfUEFEKDB4NDgwLCAweDBlYywgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTM19fVVNCT1RHX05YVAkJSU9NVVhfUEFEKDB4NDgwLCAweDBlYywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M0X19BVUQ1X1RYQwkJSU9NVVhfUEFEKDB4NDg0LCAweDBmMCwgNiwgMHg4ZTQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M0X19DU0kxX0Q2CQlJT01VWF9QQUQoMHg0ODQsIDB4MGYwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzRfX0VJTV9DUzQJCUlPTVVYX1BBRCgweDQ4NCwgMHgwZjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNF9fRkVDX1JYX0VSCQlJT01VWF9QQUQoMHg0ODQsIDB4MGYwLCAzLCAweDk3MCwgMCwgTVg1MV9QQURfQ1RSTF8yKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M0X19HUElPMl8yOQkJSU9NVVhfUEFEKDB4NDg0LCAweDBmMCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNF9fVVNCT1RHX0NMSwkJSU9NVVhfUEFEKDB4NDg0LCAweDBmMCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M1X19BVUQ1X1RYRlMJCUlPTVVYX1BBRCgweDQ4OCwgMHgwZjQsIDYsIDB4OGU4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fQ1NJMV9ENwkJSU9NVVhfUEFEKDB4NDg4LCAweDBmNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M1X19ESVNQMV9FWFRfQ0xLCQlJT01VWF9QQUQoMHg0ODgsIDB4MGY0LCA0LCAweDkwNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX0VJTV9DUzUJCUlPTVVYX1BBRCgweDQ4OCwgMHgwZjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fRkVDX0NSUwkJSU9NVVhfUEFEKDB4NDg4LCAweDBmNCwgMywgMHg5NTAsIDAsIE1YNTFfUEFEX0NUUkxfMikKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fR1BJTzJfMzAJCUlPTVVYX1BBRCgweDQ4OCwgMHgwZjQsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX1VTQk9UR19ESVIJCUlPTVVYX1BBRCgweDQ4OCwgMHgwZjQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RUQUNLX19FSU1fRFRBQ0sJCUlPTVVYX1BBRCgweDQ4YywgMHgwZjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RUQUNLX19HUElPMl8zMQkJSU9NVVhfUEFEKDB4NDhjLCAweDBmOCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0xCQV9fRUlNX0xCQQkJSU9NVVhfUEFEKDB4NDk0LCAweDBmYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fTEJBX19HUElPM18xCQlJT01VWF9QQUQoMHg0OTQsIDB4MGZjLCAxLCAweDk3OCwgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1JFX19FSU1fQ1JFCQlJT01VWF9QQUQoMHg0YTAsIDB4MTAwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUkVfX0dQSU8zXzIJCUlPTVVYX1BBRCgweDRhMCwgMHgxMDAsIDEsIDB4OTdjLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RSQU1fQ1MxX19EUkFNX0NTMQkJSU9NVVhfUEFEKDB4NGQwLCAweDEwNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XRV9CX19HUElPM18zCQlJT01VWF9QQUQoMHg0ZTQsIDB4MTA4LCAzLCAweDk4MCwgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XRV9CX19OQU5ERl9XRV9CCQlJT01VWF9QQUQoMHg0ZTQsIDB4MTA4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dFX0JfX1BBVEFfRElPVwkJSU9NVVhfUEFEKDB4NGU0LCAweDEwOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XRV9CX19TRDNfREFUQTAJCUlPTVVYX1BBRCgweDRlNCwgMHgxMDgsIDIsIDB4OTNjLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRV9CX19HUElPM180CQlJT01VWF9QQUQoMHg0ZTgsIDB4MTBjLCAzLCAweDk4NCwgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRV9CX19OQU5ERl9SRV9CCQlJT01VWF9QQUQoMHg0ZTgsIDB4MTBjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JFX0JfX1BBVEFfRElPUgkJSU9NVVhfUEFEKDB4NGU4LCAweDEwYywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRV9CX19TRDNfREFUQTEJCUlPTVVYX1BBRCgweDRlOCwgMHgxMGMsIDIsIDB4OTQwLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9BTEVfX0dQSU8zXzUJCUlPTVVYX1BBRCgweDRlYywgMHgxMTAsIDMsIDB4OTg4LCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0FMRV9fTkFOREZfQUxFCQlJT01VWF9QQUQoMHg0ZWMsIDB4MTEwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0FMRV9fUEFUQV9CVUZGRVJfRU4JSU9NVVhfUEFEKDB4NGVjLCAweDExMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DTEVfX0dQSU8zXzYJCUlPTVVYX1BBRCgweDRmMCwgMHgxMTQsIDMsIDB4OThjLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NMRV9fTkFOREZfQ0xFCQlJT01VWF9QQUQoMHg0ZjAsIDB4MTE0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NMRV9fUEFUQV9SRVNFVF9CCUlPTVVYX1BBRCgweDRmMCwgMHgxMTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfV1BfQl9fR1BJTzNfNwkJSU9NVVhfUEFEKDB4NGY0LCAweDExOCwgMywgMHg5OTAsIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfV1BfQl9fTkFOREZfV1BfQgkJSU9NVVhfUEFEKDB4NGY0LCAweDExOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XUF9CX19QQVRBX0RNQUNLCQlJT01VWF9QQUQoMHg0ZjQsIDB4MTE4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dQX0JfX1NEM19EQVRBMgkJSU9NVVhfUEFEKDB4NGY0LCAweDExOCwgMiwgMHg5NDQsIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMF9fRUNTUEkyX1NTMQkJSU9NVVhfUEFEKDB4NGY4LCAweDExYywgNSwgMHg5MzAsIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMF9fR1BJTzNfOAkJSU9NVVhfUEFEKDB4NGY4LCAweDExYywgMywgMHg5OTQsIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIwX19OQU5ERl9SQjAJCUlPTVVYX1BBRCgweDRmOCwgMHgxMWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIwX19QQVRBX0RNQVJRCQlJT01VWF9QQUQoMHg0ZjgsIDB4MTFjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMF9fU0QzX0RBVEEzCQlJT01VWF9QQUQoMHg0ZjgsIDB4MTFjLCAyLCAweDk0OCwgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIxX19DU1BJX01PU0kJCUlPTVVYX1BBRCgweDRmYywgMHgxMjAsIDYsIDB4OTFjLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjFfX0VDU1BJMl9SRFkJCUlPTVVYX1BBRCgweDRmYywgMHgxMjAsIDIsIF9fTkFfLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjFfX0dQSU8zXzkJCUlPTVVYX1BBRCgweDRmYywgMHgxMjAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMV9fTkFOREZfUkIxCQlJT01VWF9QQUQoMHg0ZmMsIDB4MTIwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMV9fUEFUQV9JT1JEWQkJSU9NVVhfUEFEKDB4NGZjLCAweDEyMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjFfX1NENF9DTUQJCUlPTVVYX1BBRCgweDRmYywgMHgxMjAsIDUsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX0RJU1AyX1dBSVQJCUlPTVVYX1BBRCgweDUwMCwgMHgxMjQsIDUsIDB4OWE4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIyX19FQ1NQSTJfU0NMSwkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgMiwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMl9fRkVDX0NPTAkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgMSwgMHg5NGMsIDAsIE1YNTFfUEFEX0NUUkxfMikKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIyX19HUElPM18xMAkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIyX19OQU5ERl9SQjIJCUlPTVVYX1BBRCgweDUwMCwgMHgxMjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIyX19VU0JIM19IM19EUAkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX1VTQkgzX05YVAkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgNiwgMHhhMjAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX0RJU1AxX1dBSVQJCUlPTVVYX1BBRCgweDUwNCwgMHgxMjgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19FQ1NQSTJfTUlTTwkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgMiwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCM19fRkVDX1JYX0NMSwkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgMSwgMHg5NjgsIDAsIE1YNTFfUEFEX0NUUkxfMikKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19HUElPM18xMQkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19OQU5ERl9SQjMJCUlPTVVYX1BBRCgweDUwNCwgMHgxMjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19VU0JIM19DTEsJCUlPTVVYX1BBRCgweDUwNCwgMHgxMjgsIDYsIDB4OWY4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19VU0JIM19IM19ETQkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPX05BTkRfX0dQSU9fTkFORAkJSU9NVVhfUEFEKDB4NTE0LCAweDEyYywgMCwgMHg5OTgsIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJT19OQU5EX19QQVRBX0lOVFJRCQlJT01VWF9QQUQoMHg1MTQsIDB4MTJjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMF9fR1BJTzNfMTYJCUlPTVVYX1BBRCgweDUxOCwgMHgxMzAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMF9fTkFOREZfQ1MwCQlJT01VWF9QQUQoMHg1MTgsIDB4MTMwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMV9fR1BJTzNfMTcJCUlPTVVYX1BBRCgweDUxYywgMHgxMzQsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMV9fTkFOREZfQ1MxCQlJT01VWF9QQUQoMHg1MWMsIDB4MTM0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fQ1NQSV9TQ0xLCQlJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCA2LCAweDkxNCwgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19GRUNfVFhfRVIJCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fR1BJTzNfMTgJCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fTkFOREZfQ1MyCQlJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fUEFUQV9DU18wCQlJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fU0Q0X0NMSwkJSU9NVVhfUEFEKDB4NTIwLCAweDEzOCwgNSwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwgfCBQQURfQ1RMX0hZUykKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19VU0JIM19IMV9EUAkJSU9NVVhfUEFEKDB4NTIwLCAweDEzOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzNfX0ZFQ19NREMJCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fR1BJTzNfMTkJCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fTkFOREZfQ1MzCQlJT01VWF9QQUQoMHg1MjQsIDB4MTNjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fUEFUQV9DU18xCQlJT01VWF9QQUQoMHg1MjQsIDB4MTNjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fU0Q0X0RBVDAJCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDUsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzNfX1VTQkgzX0gxX0RNCQlJT01VWF9QQUQoMHg1MjQsIDB4MTNjLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNF9fRkVDX1REQVRBMQkJSU9NVVhfUEFEKDB4NTI4LCAweDE0MCwgMiwgX19OQV8sIDAsIE1YNTFfUEFEX0NUUkxfNSkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M0X19HUElPM18yMAkJSU9NVVhfUEFEKDB4NTI4LCAweDE0MCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M0X19OQU5ERl9DUzQJCUlPTVVYX1BBRCgweDUyOCwgMHgxNDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M0X19QQVRBX0RBXzAJCUlPTVVYX1BBRCgweDUyOCwgMHgxNDAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M0X19TRDRfREFUMQkJSU9NVVhfUEFEKDB4NTI4LCAweDE0MCwgNSwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNF9fVVNCSDNfU1RQCQlJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCA3LCAweGEyNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNV9fRkVDX1REQVRBMgkJSU9NVVhfUEFEKDB4NTJjLCAweDE0NCwgMiwgX19OQV8sIDAsIE1YNTFfUEFEX0NUUkxfNSkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19HUElPM18yMQkJSU9NVVhfUEFEKDB4NTJjLCAweDE0NCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19OQU5ERl9DUzUJCUlPTVVYX1BBRCgweDUyYywgMHgxNDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19QQVRBX0RBXzEJCUlPTVVYX1BBRCgweDUyYywgMHgxNDQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19TRDRfREFUMgkJSU9NVVhfUEFEKDB4NTJjLCAweDE0NCwgNSwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNV9fVVNCSDNfRElSCQlJT01VWF9QQUQoMHg1MmMsIDB4MTQ0LCA3LCAweGExYywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fQ1NQSV9TUzMJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDcsIDB4OTI4LCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzZfX0ZFQ19UREFUQTMJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fR1BJTzNfMjIJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fTkFOREZfQ1M2CQlJT01VWF9QQUQoMHg1MzAsIDB4MTQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fUEFUQV9EQV8yCQlJT01VWF9QQUQoMHg1MzAsIDB4MTQ4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fU0Q0X0RBVDMJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDUsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzdfX0ZFQ19UWF9FTgkJSU9NVVhfUEFEKDB4NTM0LCAweDE0YywgMSwgX19OQV8sIDAsIE1YNTFfUEFEX0NUUkxfNSkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M3X19HUElPM18yMwkJSU9NVVhfUEFEKDB4NTM0LCAweDE0YywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M3X19OQU5ERl9DUzcJCUlPTVVYX1BBRCgweDUzNCwgMHgxNGMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M3X19TRDNfQ0xLCQlJT01VWF9QQUQoMHg1MzQsIDB4MTRjLCA1LCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCB8IFBBRF9DVExfSFlTKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19FQ1NQSTJfU1MwCUlPTVVYX1BBRCgweDUzOCwgMHgxNTAsIDIsIF9fTkFfLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19GRUNfVFhfQ0xLCUlPTVVYX1BBRCgweDUzOCwgMHgxNTAsIDEsIDB4OTc0LCAwLCBNWDUxX1BBRF9DVFJMXzQpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0dQSU8zXzI0CUlPTVVYX1BBRCgweDUzOCwgMHgxNTAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX05BTkRGX1JEWV9JTlQJSU9NVVhfUEFEKDB4NTM4LCAweDE1MCwgMCwgMHg5MzgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19TRDNfQ01ECQlJT01VWF9QQUQoMHg1MzgsIDB4MTUwLCA1LCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE1X19FQ1NQSTJfTU9TSQkJSU9NVVhfUEFEKDB4NTNjLCAweDE1NCwgMiwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNV9fR1BJTzNfMjUJCUlPTVVYX1BBRCgweDUzYywgMHgxNTQsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNV9fTkFOREZfRDE1CQlJT01VWF9QQUQoMHg1M2MsIDB4MTU0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNV9fUEFUQV9EQVRBMTUJCUlPTVVYX1BBRCgweDUzYywgMHgxNTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE1X19TRDNfREFUNwkJSU9NVVhfUEFEKDB4NTNjLCAweDE1NCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTRfX0VDU1BJMl9TUzMJCUlPTVVYX1BBRCgweDU0MCwgMHgxNTgsIDIsIDB4OTM0LCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTRfX0dQSU8zXzI2CQlJT01VWF9QQUQoMHg1NDAsIDB4MTU4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTRfX05BTkRGX0QxNAkJSU9NVVhfUEFEKDB4NTQwLCAweDE1OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTRfX1BBVEFfREFUQTE0CQlJT01VWF9QQUQoMHg1NDAsIDB4MTU4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fU0QzX0RBVDYJCUlPTVVYX1BBRCgweDU0MCwgMHgxNTgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEzX19FQ1NQSTJfU1MyCQlJT01VWF9QQUQoMHg1NDQsIDB4MTVjLCAyLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEzX19HUElPM18yNwkJSU9NVVhfUEFEKDB4NTQ0LCAweDE1YywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEzX19OQU5ERl9EMTMJCUlPTVVYX1BBRCgweDU0NCwgMHgxNWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEzX19QQVRBX0RBVEExMwkJSU9NVVhfUEFEKDB4NTQ0LCAweDE1YywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTNfX1NEM19EQVQ1CQlJT01VWF9QQUQoMHg1NDQsIDB4MTVjLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fRUNTUEkyX1NTMQkJSU9NVVhfUEFEKDB4NTQ4LCAweDE2MCwgMiwgMHg5MzAsIDEsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fR1BJTzNfMjgJCUlPTVVYX1BBRCgweDU0OCwgMHgxNjAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fTkFOREZfRDEyCQlJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fUEFUQV9EQVRBMTIJCUlPTVVYX1BBRCgweDU0OCwgMHgxNjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEyX19TRDNfREFUNAkJSU9NVVhfUEFEKDB4NTQ4LCAweDE2MCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTFfX0ZFQ19SWF9EVgkJSU9NVVhfUEFEKDB4NTRjLCAweDE2NCwgMiwgMHg5NmMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTFfX0dQSU8zXzI5CQlJT01VWF9QQUQoMHg1NGMsIDB4MTY0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTFfX05BTkRGX0QxMQkJSU9NVVhfUEFEKDB4NTRjLCAweDE2NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTFfX1BBVEFfREFUQTExCQlJT01VWF9QQUQoMHg1NGMsIDB4MTY0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMV9fU0QzX0RBVEEzCQlJT01VWF9QQUQoMHg1NGMsIDB4MTY0LCA1LCAweDk0OCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMF9fR1BJTzNfMzAJCUlPTVVYX1BBRCgweDU1MCwgMHgxNjgsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMF9fTkFOREZfRDEwCQlJT01VWF9QQUQoMHg1NTAsIDB4MTY4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMF9fUEFUQV9EQVRBMTAJCUlPTVVYX1BBRCgweDU1MCwgMHgxNjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEwX19TRDNfREFUQTIJCUlPTVVYX1BBRCgweDU1MCwgMHgxNjgsIDUsIDB4OTQ0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX0ZFQ19SREFUQTAJCUlPTVVYX1BBRCgweDU1NCwgMHgxNmMsIDB4MTIsIDB4OTU4LCAwLCBNWDUxX1BBRF9DVFJMXzQpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q5X19HUElPM18zMQkJSU9NVVhfUEFEKDB4NTU0LCAweDE2YywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX05BTkRGX0Q5CQlJT01VWF9QQUQoMHg1NTQsIDB4MTZjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q5X19QQVRBX0RBVEE5CQlJT01VWF9QQUQoMHg1NTQsIDB4MTZjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q5X19TRDNfREFUQTEJCUlPTVVYX1BBRCgweDU1NCwgMHgxNmMsIDUsIDB4OTQwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDhfX0ZFQ19UREFUQTAJCUlPTVVYX1BBRCgweDU1OCwgMHgxNzAsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q4X19HUElPNF8wCQlJT01VWF9QQUQoMHg1NTgsIDB4MTcwLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOF9fTkFOREZfRDgJCUlPTVVYX1BBRCgweDU1OCwgMHgxNzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDhfX1BBVEFfREFUQTgJCUlPTVVYX1BBRCgweDU1OCwgMHgxNzAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDhfX1NEM19EQVRBMAkJSU9NVVhfUEFEKDB4NTU4LCAweDE3MCwgNSwgMHg5M2MsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EN19fR1BJTzRfMQkJSU9NVVhfUEFEKDB4NTVjLCAweDE3NCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDdfX05BTkRGX0Q3CQlJT01VWF9QQUQoMHg1NWMsIDB4MTc0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q3X19QQVRBX0RBVEE3CQlJT01VWF9QQUQoMHg1NWMsIDB4MTc0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q3X19VU0JIM19EQVRBMAkJSU9NVVhfUEFEKDB4NTVjLCAweDE3NCwgNSwgMHg5ZmMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENl9fR1BJTzRfMgkJSU9NVVhfUEFEKDB4NTYwLCAweDE3OCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDZfX05BTkRGX0Q2CQlJT01VWF9QQUQoMHg1NjAsIDB4MTc4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19QQVRBX0RBVEE2CQlJT01VWF9QQUQoMHg1NjAsIDB4MTc4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19TRDRfTENUTAkJSU9NVVhfUEFEKDB4NTYwLCAweDE3OCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENl9fVVNCSDNfREFUQTEJCUlPTVVYX1BBRCgweDU2MCwgMHgxNzgsIDUsIDB4YTAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDVfX0dQSU80XzMJCUlPTVVYX1BBRCgweDU2NCwgMHgxN2MsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q1X19OQU5ERl9ENQkJSU9NVVhfUEFEKDB4NTY0LCAweDE3YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENV9fUEFUQV9EQVRBNQkJSU9NVVhfUEFEKDB4NTY0LCAweDE3YywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENV9fU0Q0X1dQCQlJT01VWF9QQUQoMHg1NjQsIDB4MTdjLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q1X19VU0JIM19EQVRBMgkJSU9NVVhfUEFEKDB4NTY0LCAweDE3YywgNSwgMHhhMDQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENF9fR1BJTzRfNAkJSU9NVVhfUEFEKDB4NTY4LCAweDE4MCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDRfX05BTkRGX0Q0CQlJT01VWF9QQUQoMHg1NjgsIDB4MTgwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q0X19QQVRBX0RBVEE0CQlJT01VWF9QQUQoMHg1NjgsIDB4MTgwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q0X19TRDRfQ0QJCUlPTVVYX1BBRCgweDU2OCwgMHgxODAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDRfX1VTQkgzX0RBVEEzCQlJT01VWF9QQUQoMHg1NjgsIDB4MTgwLCA1LCAweGEwOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QzX19HUElPNF81CQlJT01VWF9QQUQoMHg1NmMsIDB4MTg0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EM19fTkFOREZfRDMJCUlPTVVYX1BBRCgweDU2YywgMHgxODQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDNfX1BBVEFfREFUQTMJCUlPTVVYX1BBRCgweDU2YywgMHgxODQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDNfX1NENF9EQVQ0CQlJT01VWF9QQUQoMHg1NmMsIDB4MTg0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QzX19VU0JIM19EQVRBNAkJSU9NVVhfUEFEKDB4NTZjLCAweDE4NCwgNSwgMHhhMGMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMl9fR1BJTzRfNgkJSU9NVVhfUEFEKDB4NTcwLCAweDE4OCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDJfX05BTkRGX0QyCQlJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19QQVRBX0RBVEEyCQlJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19TRDRfREFUNQkJSU9NVVhfUEFEKDB4NTcwLCAweDE4OCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMl9fVVNCSDNfREFUQTUJCUlPTVVYX1BBRCgweDU3MCwgMHgxODgsIDUsIDB4YTEwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDFfX0dQSU80XzcJCUlPTVVYX1BBRCgweDU3NCwgMHgxOGMsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxX19OQU5ERl9EMQkJSU9NVVhfUEFEKDB4NTc0LCAweDE4YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMV9fUEFUQV9EQVRBMQkJSU9NVVhfUEFEKDB4NTc0LCAweDE4YywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMV9fU0Q0X0RBVDYJCUlPTVVYX1BBRCgweDU3NCwgMHgxOGMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDFfX1VTQkgzX0RBVEE2CQlJT01VWF9QQUQoMHg1NzQsIDB4MThjLCA1LCAweGExNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QwX19HUElPNF84CQlJT01VWF9QQUQoMHg1NzgsIDB4MTkwLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMF9fTkFOREZfRDAJCUlPTVVYX1BBRCgweDU3OCwgMHgxOTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDBfX1BBVEFfREFUQTAJCUlPTVVYX1BBRCgweDU3OCwgMHgxOTAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDBfX1NENF9EQVQ3CQlJT01VWF9QQUQoMHg1NzgsIDB4MTkwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QwX19VU0JIM19EQVRBNwkJSU9NVVhfUEFEKDB4NTc4LCAweDE5MCwgNSwgMHhhMTgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0Q4X19DU0kxX0Q4CQlJT01VWF9QQUQoMHg1N2MsIDB4MTk0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDhfX0dQSU8zXzEyCQlJT01VWF9QQUQoMHg1N2MsIDB4MTk0LCAzLCAweDk5OCwgMSwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0Q5X19DU0kxX0Q5CQlJT01VWF9QQUQoMHg1ODAsIDB4MTk4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDlfX0dQSU8zXzEzCQlJT01VWF9QQUQoMHg1ODAsIDB4MTk4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxMF9fQ1NJMV9EMTAJCUlPTVVYX1BBRCgweDU4NCwgMHgxOWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTFfX0NTSTFfRDExCQlJT01VWF9QQUQoMHg1ODgsIDB4MWEwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDEyX19DU0kxX0QxMgkJSU9NVVhfUEFEKDB4NThjLCAweDFhNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxM19fQ1NJMV9EMTMJCUlPTVVYX1BBRCgweDU5MCwgMHgxYTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTRfX0NTSTFfRDE0CQlJT01VWF9QQUQoMHg1OTQsIDB4MWFjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE1X19DU0kxX0QxNQkJSU9NVVhfUEFEKDB4NTk4LCAweDFiMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxNl9fQ1NJMV9EMTYJCUlPTVVYX1BBRCgweDU5YywgMHgxYjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTdfX0NTSTFfRDE3CQlJT01VWF9QQUQoMHg1YTAsIDB4MWI4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE4X19DU0kxX0QxOAkJSU9NVVhfUEFEKDB4NWE0LCAweDFiYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxOV9fQ1NJMV9EMTkJCUlPTVVYX1BBRCgweDVhOCwgMHgxYzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9WU1lOQ19fQ1NJMV9WU1lOQwkJSU9NVVhfUEFEKDB4NWFjLCAweDFjNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX1ZTWU5DX19HUElPM18xNAkJSU9NVVhfUEFEKDB4NWFjLCAweDFjNCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9IU1lOQ19fQ1NJMV9IU1lOQwkJSU9NVVhfUEFEKDB4NWIwLCAweDFjOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0hTWU5DX19HUElPM18xNQkJSU9NVVhfUEFEKDB4NWIwLCAweDFjOCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9QSVhDTEtfX0NTSTFfUElYQ0xLCUlPTVVYX1BBRCgweDViNCwgX19OQV8sIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9NQ0xLX19DU0kxX01DTEsJCUlPTVVYX1BBRCgweDViOCwgX19OQV8sIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTJfX0NTSTJfRDEyCQlJT01VWF9QQUQoMHg1YmMsIDB4MWNjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDEyX19HUElPNF85CQlJT01VWF9QQUQoMHg1YmMsIDB4MWNjLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxM19fQ1NJMl9EMTMJCUlPTVVYX1BBRCgweDVjMCwgMHgxZDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTNfX0dQSU80XzEwCQlJT01VWF9QQUQoMHg1YzAsIDB4MWQwLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxNF9fQ1NJMl9EMTQJCUlPTVVYX1BBRCgweDVjNCwgMHgxZDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTVfX0NTSTJfRDE1CQlJT01VWF9QQUQoMHg1YzgsIDB4MWQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE2X19DU0kyX0QxNgkJSU9NVVhfUEFEKDB4NWNjLCAweDFkYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxN19fQ1NJMl9EMTcJCUlPTVVYX1BBRCgweDVkMCwgMHgxZTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMThfX0NTSTJfRDE4CQlJT01VWF9QQUQoMHg1ZDQsIDB4MWU0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE4X19HUElPNF8xMQkJSU9NVVhfUEFEKDB4NWQ0LCAweDFlNCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTlfX0NTSTJfRDE5CQlJT01VWF9QQUQoMHg1ZDgsIDB4MWU4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE5X19HUElPNF8xMgkJSU9NVVhfUEFEKDB4NWQ4LCAweDFlOCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9WU1lOQ19fQ1NJMl9WU1lOQwkJSU9NVVhfUEFEKDB4NWRjLCAweDFlYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX1ZTWU5DX19HUElPNF8xMwkJSU9NVVhfUEFEKDB4NWRjLCAweDFlYywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9IU1lOQ19fQ1NJMl9IU1lOQwkJSU9NVVhfUEFEKDB4NWUwLCAweDFmMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0hTWU5DX19HUElPNF8xNAkJSU9NVVhfUEFEKDB4NWUwLCAweDFmMCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9QSVhDTEtfX0NTSTJfUElYQ0xLCUlPTVVYX1BBRCgweDVlNCwgMHgxZjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9QSVhDTEtfX0dQSU80XzE1CQlJT01VWF9QQUQoMHg1ZTQsIDB4MWY0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9JMkMxX0NMS19fR1BJTzRfMTYJCUlPTVVYX1BBRCgweDVlOCwgMHgxZjgsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0kyQzFfQ0xLX19JMkMxX0NMSwkJSU9NVVhfUEFEKDB4NWU4LCAweDFmOCwgMHgxMCwgX19OQV8sIDAsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9JMkMxX0RBVF9fR1BJTzRfMTcJCUlPTVVYX1BBRCgweDVlYywgMHgxZmMsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0kyQzFfREFUX19JMkMxX0RBVAkJSU9NVVhfUEFEKDB4NWVjLCAweDFmYywgMHgxMCwgX19OQV8sIDAsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1RYRF9fQVVEM19UWEQJCUlPTVVYX1BBRCgweDVmMCwgMHgyMDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQVVEM19CQl9UWERfX0dQSU80XzE4CQlJT01VWF9QQUQoMHg1ZjAsIDB4MjAwLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1JYRF9fQVVEM19SWEQJCUlPTVVYX1BBRCgweDVmNCwgMHgyMDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQVVEM19CQl9SWERfX0dQSU80XzE5CQlJT01VWF9QQUQoMHg1ZjQsIDB4MjA0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1JYRF9fVUFSVDNfUlhECQlJT01VWF9QQUQoMHg1ZjQsIDB4MjA0LCAxLCAweDlmNCwgMiwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0NLX19BVUQzX1RYQwkJSU9NVVhfUEFEKDB4NWY4LCAweDIwOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0NLX19HUElPNF8yMAkJSU9NVVhfUEFEKDB4NWY4LCAweDIwOCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQVVEM19CQl9GU19fQVVEM19UWEZTCQlJT01VWF9QQUQoMHg1ZmMsIDB4MjBjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfRlNfX0dQSU80XzIxCQlJT01VWF9QQUQoMHg1ZmMsIDB4MjBjLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0ZTX19VQVJUM19UWEQJCUlPTVVYX1BBRCgweDVmYywgMHgyMGMsIDEsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTUEkxX01PU0lfX0VDU1BJMV9NT1NJCUlPTVVYX1BBRCgweDYwMCwgMHgyMTAsIDAsIF9fTkFfLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NT1NJX19HUElPNF8yMgkJSU9NVVhfUEFEKDB4NjAwLCAweDIxMCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfTU9TSV9fSTJDMV9TREEJCUlPTVVYX1BBRCgweDYwMCwgMHgyMTAsIDB4MTEsIDB4OWI0LCAxLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfTUlTT19fQVVENF9SWEQJCUlPTVVYX1BBRCgweDYwNCwgMHgyMTQsIDEsIDB4OGM0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfTUlTT19fRUNTUEkxX01JU08JSU9NVVhfUEFEKDB4NjA0LCAweDIxNCwgMCwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTUEkxX01JU09fX0dQSU80XzIzCQlJT01VWF9QQUQoMHg2MDQsIDB4MjE0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TUzBfX0FVRDRfVFhDCQlJT01VWF9QQUQoMHg2MDgsIDB4MjE4LCAxLCAweDhjYywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NTMF9fRUNTUEkxX1NTMAkJSU9NVVhfUEFEKDB4NjA4LCAweDIxOCwgMCwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NTMF9fR1BJTzRfMjQJCUlPTVVYX1BBRCgweDYwOCwgMHgyMTgsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NTMV9fQVVENF9UWEQJCUlPTVVYX1BBRCgweDYwYywgMHgyMWMsIDEsIDB4OGM4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MxX19FQ1NQSTFfU1MxCQlJT01VWF9QQUQoMHg2MGMsIDB4MjFjLCAwLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MxX19HUElPNF8yNQkJSU9NVVhfUEFEKDB4NjBjLCAweDIxYywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfUkRZX19BVUQ0X1RYRlMJCUlPTVVYX1BBRCgweDYxMCwgMHgyMjAsIDEsIDB4OGQwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfUkRZX19FQ1NQSTFfUkRZCQlJT01VWF9QQUQoMHg2MTAsIDB4MjIwLCAwLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfUkRZX19HUElPNF8yNgkJSU9NVVhfUEFEKDB4NjEwLCAweDIyMCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU0NMS19fRUNTUEkxX1NDTEsJSU9NVVhfUEFEKDB4NjE0LCAweDIyNCwgMCwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NDTEtfX0dQSU80XzI3CQlJT01VWF9QQUQoMHg2MTQsIDB4MjI0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TQ0xLX19JMkMxX1NDTAkJSU9NVVhfUEFEKDB4NjE0LCAweDIyNCwgMHgxMSwgMHg5YjAsIDEsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9SWERfX0dQSU80XzI4CQlJT01VWF9QQUQoMHg2MTgsIDB4MjI4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9SWERfX1VBUlQxX1JYRAkJSU9NVVhfUEFEKDB4NjE4LCAweDIyOCwgMCwgMHg5ZTQsIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDFfVFhEX19HUElPNF8yOQkJSU9NVVhfUEFEKDB4NjFjLCAweDIyYywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDFfVFhEX19QV00yX1BXTU8JCUlPTVVYX1BBRCgweDYxYywgMHgyMmMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDFfVFhEX19VQVJUMV9UWEQJCUlPTVVYX1BBRCgweDYxYywgMHgyMmMsIDAsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQxX1JUU19fR1BJTzRfMzAJCUlPTVVYX1BBRCgweDYyMCwgMHgyMzAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQxX1JUU19fVUFSVDFfUlRTCQlJT01VWF9QQUQoMHg2MjAsIDB4MjMwLCAwLCAweDllMCwgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9DVFNfX0dQSU80XzMxCQlJT01VWF9QQUQoMHg2MjQsIDB4MjM0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9DVFNfX1VBUlQxX0NUUwkJSU9NVVhfUEFEKDB4NjI0LCAweDIzNCwgMCwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDJfUlhEX19GSVJJX1RYRAkJSU9NVVhfUEFEKDB4NjI4LCAweDIzOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9SWERfX0dQSU8xXzIwCQlJT01VWF9QQUQoMHg2MjgsIDB4MjM4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9SWERfX1VBUlQyX1JYRAkJSU9NVVhfUEFEKDB4NjI4LCAweDIzOCwgMCwgMHg5ZWMsIDIsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDJfVFhEX19GSVJJX1JYRAkJSU9NVVhfUEFEKDB4NjJjLCAweDIzYywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9UWERfX0dQSU8xXzIxCQlJT01VWF9QQUQoMHg2MmMsIDB4MjNjLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9UWERfX1VBUlQyX1RYRAkJSU9NVVhfUEFEKDB4NjJjLCAweDIzYywgMCwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDNfUlhEX19DU0kxX0QwCQlJT01VWF9QQUQoMHg2MzAsIDB4MjQwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1JYRF9fR1BJTzFfMjIJCUlPTVVYX1BBRCgweDYzMCwgMHgyNDAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1JYRF9fVUFSVDFfRFRSCQlJT01VWF9QQUQoMHg2MzAsIDB4MjQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1JYRF9fVUFSVDNfUlhECQlJT01VWF9QQUQoMHg2MzAsIDB4MjQwLCAxLCAweDlmNCwgNCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUM19UWERfX0NTSTFfRDEJCUlPTVVYX1BBRCgweDYzNCwgMHgyNDQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDNfVFhEX19HUElPMV8yMwkJSU9NVVhfUEFEKDB4NjM0LCAweDI0NCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDNfVFhEX19VQVJUMV9EU1IJCUlPTVVYX1BBRCgweDYzNCwgMHgyNDQsIDAsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1RYRF9fVUFSVDNfVFhECQlJT01VWF9QQUQoMHg2MzQsIDB4MjQ0LCAxLCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9PV0lSRV9MSU5FX19HUElPMV8yNAkJSU9NVVhfUEFEKDB4NjM4LCAweDI0OCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfT1dJUkVfTElORV9fT1dJUkVfTElORQkJSU9NVVhfUEFEKDB4NjM4LCAweDI0OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9PV0lSRV9MSU5FX19TUERJRl9PVVQJCUlPTVVYX1BBRCgweDYzOCwgMHgyNDgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX1JPVzBfX0tFWV9ST1cwCQlJT01VWF9QQUQoMHg2M2MsIDB4MjRjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9ST1cxX19LRVlfUk9XMQkJSU9NVVhfUEFEKDB4NjQwLCAweDI1MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XMl9fS0VZX1JPVzIJCUlPTVVYX1BBRCgweDY0NCwgMHgyNTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX1JPVzNfX0tFWV9ST1czCQlJT01VWF9QQUQoMHg2NDgsIDB4MjU4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wwX19LRVlfQ09MMAkJSU9NVVhfUEFEKDB4NjRjLCAweDI1YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMF9fUExMMV9CWVAJCUlPTVVYX1BBRCgweDY0YywgMHgyNWMsIDcsIDB4OTBjLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDFfX0tFWV9DT0wxCQlJT01VWF9QQUQoMHg2NTAsIDB4MjYwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wxX19QTEwyX0JZUAkJSU9NVVhfUEFEKDB4NjUwLCAweDI2MCwgNywgMHg5MTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMl9fS0VZX0NPTDIJCUlPTVVYX1BBRCgweDY1NCwgMHgyNjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDJfX1BMTDNfQllQCQlJT01VWF9QQUQoMHg2NTQsIDB4MjY0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wzX19LRVlfQ09MMwkJSU9NVVhfUEFEKDB4NjU4LCAweDI2OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNF9fSTJDMl9TQ0wJCUlPTVVYX1BBRCgweDY1YywgMHgyNmMsIDB4MTMsIDB4OWI4LCAxLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDRfX0tFWV9DT0w0CQlJT01VWF9QQUQoMHg2NWMsIDB4MjZjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w0X19TUERJRl9PVVQxCQlJT01VWF9QQUQoMHg2NWMsIDB4MjZjLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w0X19VQVJUMV9SSQkJSU9NVVhfUEFEKDB4NjVjLCAweDI2YywgMSwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDRfX1VBUlQzX1JUUwkJSU9NVVhfUEFEKDB4NjVjLCAweDI2YywgMiwgMHg5ZjAsIDQsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDVfX0kyQzJfU0RBCQlJT01VWF9QQUQoMHg2NjAsIDB4MjcwLCAweDEzLCAweDliYywgMSwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w1X19LRVlfQ09MNQkJSU9NVVhfUEFEKDB4NjYwLCAweDI3MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNV9fVUFSVDFfRENECQlJT01VWF9QQUQoMHg2NjAsIDB4MjcwLCAxLCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNV9fVUFSVDNfQ1RTCQlJT01VWF9QQUQoMHg2NjAsIDB4MjcwLCAyLCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9DTEtfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4Njc4LCAweDI3OCwgMSwgMHg5MTQsIDEsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0NMS19fR1BJTzFfMjUJCUlPTVVYX1BBRCgweDY3OCwgMHgyNzgsIDIsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0NMS19fSTJDMl9TQ0wJCUlPTVVYX1BBRCgweDY3OCwgMHgyNzgsIDB4MTUsIDB4OWI4LCAyLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfQ0xLX19VU0JIMV9DTEsJCUlPTVVYX1BBRCgweDY3OCwgMHgyNzgsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9ESVJfX0NTUElfTU9TSQkJSU9NVVhfUEFEKDB4NjdjLCAweDI3YywgMSwgMHg5MWMsIDEsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RJUl9fR1BJTzFfMjYJCUlPTVVYX1BBRCgweDY3YywgMHgyN2MsIDIsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RJUl9fSTJDMl9TREEJCUlPTVVYX1BBRCgweDY3YywgMHgyN2MsIDB4MTUsIDB4OWJjLCAyLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfRElSX19VU0JIMV9ESVIJCUlPTVVYX1BBRCgweDY3YywgMHgyN2MsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9TVFBfX0NTUElfUkRZCQlJT01VWF9QQUQoMHg2ODAsIDB4MjgwLCAxLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfU1RQX19HUElPMV8yNwkJSU9NVVhfUEFEKDB4NjgwLCAweDI4MCwgMiwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfU1RQX19VQVJUM19SWEQJCUlPTVVYX1BBRCgweDY4MCwgMHgyODAsIDUsIDB4OWY0LCA2LCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX1NUUF9fVVNCSDFfU1RQCQlJT01VWF9QQUQoMHg2ODAsIDB4MjgwLCAwLCBfX05BXywgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfTlhUX19DU1BJX01JU08JCUlPTVVYX1BBRCgweDY4NCwgMHgyODQsIDEsIDB4OTE4LCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9OWFRfX0dQSU8xXzI4CQlJT01VWF9QQUQoMHg2ODQsIDB4Mjg0LCAyLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9OWFRfX1VBUlQzX1RYRAkJSU9NVVhfUEFEKDB4Njg0LCAweDI4NCwgNSwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfTlhUX19VU0JIMV9OWFQJCUlPTVVYX1BBRCgweDY4NCwgMHgyODQsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMF9fR1BJTzFfMTEJCUlPTVVYX1BBRCgweDY4OCwgMHgyODgsIDIsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEwX19VQVJUMl9DVFMJCUlPTVVYX1BBRCgweDY4OCwgMHgyODgsIDEsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEwX19VU0JIMV9EQVRBMAlJT01VWF9QQUQoMHg2ODgsIDB4Mjg4LCAwLCBfX05BXywgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTFfX0dQSU8xXzEyCQlJT01VWF9QQUQoMHg2OGMsIDB4MjhjLCAyLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMV9fVUFSVDJfUlhECQlJT01VWF9QQUQoMHg2OGMsIDB4MjhjLCAxLCAweDllYywgNCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMV9fVVNCSDFfREFUQTEJSU9NVVhfUEFEKDB4NjhjLCAweDI4YywgMCwgX19OQV8sIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEyX19HUElPMV8xMwkJSU9NVVhfUEFEKDB4NjkwLCAweDI5MCwgMiwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTJfX1VBUlQyX1RYRAkJSU9NVVhfUEFEKDB4NjkwLCAweDI5MCwgMSwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTJfX1VTQkgxX0RBVEEyCUlPTVVYX1BBRCgweDY5MCwgMHgyOTAsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBM19fR1BJTzFfMTQJCUlPTVVYX1BBRCgweDY5NCwgMHgyOTQsIDIsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEzX19VQVJUMl9SVFMJCUlPTVVYX1BBRCgweDY5NCwgMHgyOTQsIDEsIDB4OWU4LCA1LCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEzX19VU0JIMV9EQVRBMwlJT01VWF9QQUQoMHg2OTQsIDB4Mjk0LCAwLCBfX05BXywgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTRfX0NTUElfU1MwCQlJT01VWF9QQUQoMHg2OTgsIDB4Mjk4LCAxLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTRfX0dQSU8xXzE1CQlJT01VWF9QQUQoMHg2OTgsIDB4Mjk4LCAyLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNF9fVVNCSDFfREFUQTQJSU9NVVhfUEFEKDB4Njk4LCAweDI5OCwgMCwgX19OQV8sIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE1X19DU1BJX1NTMQkJSU9NVVhfUEFEKDB4NjljLCAweDI5YywgMSwgMHg5MjAsIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE1X19HUElPMV8xNgkJSU9NVVhfUEFEKDB4NjljLCAweDI5YywgMiwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTVfX1VTQkgxX0RBVEE1CUlPTVVYX1BBRCgweDY5YywgMHgyOWMsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNl9fQ1NQSV9TUzMJCUlPTVVYX1BBRCgweDZhMCwgMHgyYTAsIDEsIDB4OTI4LCAxLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNl9fR1BJTzFfMTcJCUlPTVVYX1BBRCgweDZhMCwgMHgyYTAsIDIsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE2X19VU0JIMV9EQVRBNglJT01VWF9QQUQoMHg2YTAsIDB4MmEwLCAwLCBfX05BXywgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTdfX0VDU1BJMV9TUzMJSU9NVVhfUEFEKDB4NmE0LCAweDJhNCwgMSwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE3X19FQ1NQSTJfU1MzCUlPTVVYX1BBRCgweDZhNCwgMHgyYTQsIDUsIDB4OTM0LCAxLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBN19fR1BJTzFfMTgJCUlPTVVYX1BBRCgweDZhNCwgMHgyYTQsIDIsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE3X19VU0JIMV9EQVRBNwlJT01VWF9QQUQoMHg2YTQsIDB4MmE0LCAwLCBfX05BXywgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjExX19ESTFfUElOMTEJCUlPTVVYX1BBRCgweDZhOCwgMHgyYTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjExX19FQ1NQSTFfU1MyCQlJT01VWF9QQUQoMHg2YTgsIDB4MmE4LCA3LCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjExX19HUElPM18wCQlJT01VWF9QQUQoMHg2YTgsIDB4MmE4LCA0LCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTJfX0RJMV9QSU4xMgkJSU9NVVhfUEFEKDB4NmFjLCAweDJhYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTJfX0dQSU8zXzEJCUlPTVVYX1BBRCgweDZhYywgMHgyYWMsIDQsIDB4OTc4LCAxLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4xM19fREkxX1BJTjEzCQlJT01VWF9QQUQoMHg2YjAsIDB4MmIwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4xM19fR1BJTzNfMgkJSU9NVVhfUEFEKDB4NmIwLCAweDJiMCwgNCwgMHg5N2MsIDEsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkxX0QwX0NTX19ESTFfRDBfQ1MJCUlPTVVYX1BBRCgweDZiNCwgMHgyYjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkxX0QwX0NTX19HUElPM18zCQlJT01VWF9QQUQoMHg2YjQsIDB4MmI0LCA0LCAweDk4MCwgMSwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfRDFfQ1NfX0RJMV9EMV9DUwkJSU9NVVhfUEFEKDB4NmI4LCAweDJiOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfRDFfQ1NfX0RJU1AxX1BJTjE0CQlJT01VWF9QQUQoMHg2YjgsIDB4MmI4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMV9EMV9DU19fRElTUDFfUElONQkJSU9NVVhfUEFEKDB4NmI4LCAweDJiOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfRDFfQ1NfX0dQSU8zXzQJCUlPTVVYX1BBRCgweDZiOCwgMHgyYjgsIDQsIDB4OTg0LCAxLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfRElOX19ESVNQMV9QSU4xCUlPTVVYX1BBRCgweDZiYywgMHgyYmMsIDIsIDB4OWE0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0RJU1BCMl9TRVJfRElOCUlPTVVYX1BBRCgweDZiYywgMHgyYmMsIDAsIDB4OWM0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0dQSU8zXzUJSU9NVVhfUEFEKDB4NmJjLCAweDJiYywgNCwgMHg5ODgsIDEsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU9fX0RJU1AxX1BJTjYJSU9NVVhfUEFEKDB4NmMwLCAweDJjMCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fRElTUEIyX1NFUl9ESU8JSU9NVVhfUEFEKDB4NmMwLCAweDJjMCwgMCwgMHg5YzQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fR1BJTzNfNglJT01VWF9QQUQoMHg2YzAsIDB4MmMwLCA0LCAweDk4YywgMSwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fRElTUDFfUElOMTcJSU9NVVhfUEFEKDB4NmM0LCAweDJjNCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fRElTUDFfUElONwlJT01VWF9QQUQoMHg2YzQsIDB4MmM0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19ESVNQQjJfU0VSX0NMSwlJT01VWF9QQUQoMHg2YzQsIDB4MmM0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19HUElPM183CUlPTVVYX1BBRCgweDZjNCwgMHgyYzQsIDQsIDB4OTkwLCAxLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX0VYVF9DTEsJSU9NVVhfUEFEKDB4NmM4LCAweDJjOCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQMV9QSU4xNglJT01VWF9QQUQoMHg2YzgsIDB4MmM4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX1BJTjgJSU9NVVhfUEFEKDB4NmM4LCAweDJjOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQQjJfU0VSX1JTCUlPTVVYX1BBRCgweDZjOCwgMHgyYzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUEIyX1NFUl9SUwlJT01VWF9QQUQoMHg2YzgsIDB4MmM4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0dQSU8zXzgJCUlPTVVYX1BBRCgweDZjOCwgMHgyYzgsIDQsIDB4OTk0LCAxLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDBfX0RJU1AxX0RBVDAJCUlPTVVYX1BBRCgweDZjYywgMHgyY2MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMV9fRElTUDFfREFUMQkJSU9NVVhfUEFEKDB4NmQwLCAweDJkMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyX19ESVNQMV9EQVQyCQlJT01VWF9QQUQoMHg2ZDQsIDB4MmQ0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDNfX0RJU1AxX0RBVDMJCUlPTVVYX1BBRCgweDZkOCwgMHgyZDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUNF9fRElTUDFfREFUNAkJSU9NVVhfUEFEKDB4NmRjLCAweDJkYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ1X19ESVNQMV9EQVQ1CQlJT01VWF9QQUQoMHg2ZTAsIDB4MmUwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDZfX0JPT1RfVVNCX1NSQwlJT01VWF9QQUQoMHg2ZTQsIDB4MmU0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDZfX0RJU1AxX0RBVDYJCUlPTVVYX1BBRCgweDZlNCwgMHgyZTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUN19fQk9PVF9FRVBST01fQ0ZHCUlPTVVYX1BBRCgweDZlOCwgMHgyZTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUN19fRElTUDFfREFUNwkJSU9NVVhfUEFEKDB4NmU4LCAweDJlOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ4X19CT09UX1NSQzAJCUlPTVVYX1BBRCgweDZlYywgMHgyZWMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUOF9fRElTUDFfREFUOAkJSU9NVVhfUEFEKDB4NmVjLCAweDJlYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ5X19CT09UX1NSQzEJCUlPTVVYX1BBRCgweDZmMCwgMHgyZjAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUOV9fRElTUDFfREFUOQkJSU9NVVhfUEFEKDB4NmYwLCAweDJmMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMF9fQk9PVF9TUEFSRV9TSVpFCUlPTVVYX1BBRCgweDZmNCwgMHgyZjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTBfX0RJU1AxX0RBVDEwCUlPTVVYX1BBRCgweDZmNCwgMHgyZjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTFfX0JPT1RfTFBCX0ZSRVEyCUlPTVVYX1BBRCgweDZmOCwgMHgyZjgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTFfX0RJU1AxX0RBVDExCUlPTVVYX1BBRCgweDZmOCwgMHgyZjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTJfX0JPT1RfTUxDX1NFTAlJT01VWF9QQUQoMHg2ZmMsIDB4MmZjLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDEyX19ESVNQMV9EQVQxMglJT01VWF9QQUQoMHg2ZmMsIDB4MmZjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDEzX19CT09UX01FTV9DVEwwCUlPTVVYX1BBRCgweDcwMCwgMHgzMDAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTNfX0RJU1AxX0RBVDEzCUlPTVVYX1BBRCgweDcwMCwgMHgzMDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTRfX0JPT1RfTUVNX0NUTDEJSU9NVVhfUEFEKDB4NzA0LCAweDMwNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNF9fRElTUDFfREFUMTQJSU9NVVhfUEFEKDB4NzA0LCAweDMwNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNV9fQk9PVF9CVVNfV0lEVEgJSU9NVVhfUEFEKDB4NzA4LCAweDMwOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNV9fRElTUDFfREFUMTUJSU9NVVhfUEFEKDB4NzA4LCAweDMwOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNl9fQk9PVF9QQUdFX1NJWkUwCUlPTVVYX1BBRCgweDcwYywgMHgzMGMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTZfX0RJU1AxX0RBVDE2CUlPTVVYX1BBRCgweDcwYywgMHgzMGMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTdfX0JPT1RfUEFHRV9TSVpFMQlJT01VWF9QQUQoMHg3MTAsIDB4MzEwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE3X19ESVNQMV9EQVQxNwlJT01VWF9QQUQoMHg3MTAsIDB4MzEwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE4X19CT09UX1dFSU1fTVVYRUQwCUlPTVVYX1BBRCgweDcxNCwgMHgzMTQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMThfX0RJU1AxX0RBVDE4CUlPTVVYX1BBRCgweDcxNCwgMHgzMTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMThfX0RJU1AyX1BJTjExCUlPTVVYX1BBRCgweDcxNCwgMHgzMTQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMThfX0RJU1AyX1BJTjUJSU9NVVhfUEFEKDB4NzE0LCAweDMxNCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOV9fQk9PVF9XRUlNX01VWEVEMQlJT01VWF9QQUQoMHg3MTgsIDB4MzE4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMV9EQVQxOQlJT01VWF9QQUQoMHg3MTgsIDB4MzE4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMl9QSU4xMglJT01VWF9QQUQoMHg3MTgsIDB4MzE4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMl9QSU42CUlPTVVYX1BBRCgweDcxOCwgMHgzMTgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjBfX0JPT1RfTUVNX1RZUEUwCUlPTVVYX1BBRCgweDcxYywgMHgzMWMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjBfX0RJU1AxX0RBVDIwCUlPTVVYX1BBRCgweDcxYywgMHgzMWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjBfX0RJU1AyX1BJTjEzCUlPTVVYX1BBRCgweDcxYywgMHgzMWMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjBfX0RJU1AyX1BJTjcJSU9NVVhfUEFEKDB4NzFjLCAweDMxYywgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fQk9PVF9NRU1fVFlQRTEJSU9NVVhfUEFEKDB4NzIwLCAweDMyMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDFfREFUMjEJSU9NVVhfUEFEKDB4NzIwLCAweDMyMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDJfUElOMTQJSU9NVVhfUEFEKDB4NzIwLCAweDMyMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDJfUElOOAlJT01VWF9QQUQoMHg3MjAsIDB4MzIwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIyX19CT09UX0xQQl9GUkVRMAlJT01VWF9QQUQoMHg3MjQsIDB4MzI0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMV9EQVQyMglJT01VWF9QQUQoMHg3MjQsIDB4MzI0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMl9EMF9DUwlJT01VWF9QQUQoMHg3MjQsIDB4MzI0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMl9EQVQxNglJT01VWF9QQUQoMHg3MjQsIDB4MzI0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19CT09UX0xQQl9GUkVRMQlJT01VWF9QQUQoMHg3MjgsIDB4MzI4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMV9EQVQyMwlJT01VWF9QQUQoMHg3MjgsIDB4MzI4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9EMV9DUwlJT01VWF9QQUQoMHg3MjgsIDB4MzI4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9EQVQxNwlJT01VWF9QQUQoMHg3MjgsIDB4MzI4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9TRVJfQ1MJSU9NVVhfUEFEKDB4NzI4LCAweDMyOCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOM19fREkxX1BJTjMJCUlPTVVYX1BBRCgweDcyYywgMHgzMmMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjJfX0RJMV9QSU4yCQlJT01VWF9QQUQoMHg3MzQsIDB4MzMwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJX0dQMl9fRElTUDFfU0VSX0NMSwkJSU9NVVhfUEFEKDB4NzQwLCAweDMzOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDJfX0RJU1AyX1dBSVQJCUlPTVVYX1BBRCgweDc0MCwgMHgzMzgsIDIsIDB4OWE4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElfR1AzX19DU0kxX0RBVEFfRU4JCUlPTVVYX1BBRCgweDc0NCwgMHgzM2MsIDMsIDB4OWEwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElfR1AzX19ESVNQMV9TRVJfRElPCQlJT01VWF9QQUQoMHg3NDQsIDB4MzNjLCAwLCAweDljMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJX0dQM19fRkVDX1RYX0VSCQlJT01VWF9QQUQoMHg3NDQsIDB4MzNjLCAyLCBfX05BXywgMCwgTVg1MV9QQURfQ1RSTF81KQorI2RlZmluZSBNWDUxX1BBRF9ESTJfUElONF9fQ1NJMl9EQVRBX0VOCQlJT01VWF9QQUQoMHg3NDgsIDB4MzQwLCAzLCAweDk5YywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU40X19ESTJfUElONAkJSU9NVVhfUEFEKDB4NzQ4LCAweDM0MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfUElONF9fRkVDX0NSUwkJSU9NVVhfUEFEKDB4NzQ4LCAweDM0MCwgMiwgMHg5NTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfUElOMl9fREkyX1BJTjIJCUlPTVVYX1BBRCgweDc0YywgMHgzNDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkyX1BJTjJfX0ZFQ19NREMJCUlPTVVYX1BBRCgweDc0YywgMHgzNDQsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU4zX19ESTJfUElOMwkJSU9NVVhfUEFEKDB4NzUwLCAweDM0OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfUElOM19fRkVDX01ESU8JCUlPTVVYX1BBRCgweDc1MCwgMHgzNDgsIDIsIDB4OTU0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkyX0RJU1BfQ0xLX19ESTJfRElTUF9DTEsJSU9NVVhfUEFEKDB4NzU0LCAweDM0YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfRElTUF9DTEtfX0ZFQ19SREFUQTEJSU9NVVhfUEFEKDB4NzU0LCAweDM0YywgMiwgMHg5NWMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDRfX0RJMl9QSU4xNQkJSU9NVVhfUEFEKDB4NzU4LCAweDM1MCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDRfX0RJU1AxX1NFUl9ESU4JCUlPTVVYX1BBRCgweDc1OCwgMHgzNTAsIDAsIDB4OWMwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElfR1A0X19ESVNQMl9QSU4xCQlJT01VWF9QQUQoMHg3NTgsIDB4MzUwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJX0dQNF9fRkVDX1JEQVRBMgkJSU9NVVhfUEFEKDB4NzU4LCAweDM1MCwgMiwgMHg5NjAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQwX19ESVNQMl9EQVQwCQlJT01VWF9QQUQoMHg3NWMsIDB4MzU0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDBfX0ZFQ19SREFUQTMJCUlPTVVYX1BBRCgweDc1YywgMHgzNTQsIDIsIDB4OTY0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMF9fS0VZX0NPTDYJCUlPTVVYX1BBRCgweDc1YywgMHgzNTQsIDQsIDB4OWM4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMF9fVUFSVDNfUlhECQlJT01VWF9QQUQoMHg3NWMsIDB4MzU0LCA1LCAweDlmNCwgOCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQwX19VU0JIM19DTEsJCUlPTVVYX1BBRCgweDc1YywgMHgzNTQsIDMsIDB4OWY4LCAxLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDFfX0RJU1AyX0RBVDEJCUlPTVVYX1BBRCgweDc2MCwgMHgzNTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fRkVDX1JYX0VSCQlJT01VWF9QQUQoMHg3NjAsIDB4MzU4LCAyLCAweDk3MCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDFfX0tFWV9DT0w3CQlJT01VWF9QQUQoMHg3NjAsIDB4MzU4LCA0LCAweDljYywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDFfX1VBUlQzX1RYRAkJSU9NVVhfUEFEKDB4NzYwLCAweDM1OCwgNSwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fVVNCSDNfRElSCQlJT01VWF9QQUQoMHg3NjAsIDB4MzU4LCAzLCAweGExYywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDJfX0RJU1AyX0RBVDIJCUlPTVVYX1BBRCgweDc2NCwgMHgzNWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUM19fRElTUDJfREFUMwkJSU9NVVhfUEFEKDB4NzY4LCAweDM2MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ0X19ESVNQMl9EQVQ0CQlJT01VWF9QQUQoMHg3NmMsIDB4MzY0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDVfX0RJU1AyX0RBVDUJCUlPTVVYX1BBRCgweDc3MCwgMHgzNjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUNl9fRElTUDJfREFUNgkJSU9NVVhfUEFEKDB4Nzc0LCAweDM2YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ2X19GRUNfVERBVEExCQlJT01VWF9QQUQoMHg3NzQsIDB4MzZjLCAyLCBfX05BXywgMCwgTVg1MV9QQURfQ1RSTF81KQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ2X19HUElPMV8xOQkJSU9NVVhfUEFEKDB4Nzc0LCAweDM2YywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ2X19LRVlfUk9XNAkJSU9NVVhfUEFEKDB4Nzc0LCAweDM2YywgNCwgMHg5ZDAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ2X19VU0JIM19TVFAJCUlPTVVYX1BBRCgweDc3NCwgMHgzNmMsIDMsIDB4YTI0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUN19fRElTUDJfREFUNwkJSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ3X19GRUNfVERBVEEyCQlJT01VWF9QQUQoMHg3NzgsIDB4MzcwLCAyLCBfX05BXywgMCwgTVg1MV9QQURfQ1RSTF81KQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ3X19HUElPMV8yOQkJSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ3X19LRVlfUk9XNQkJSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgNCwgMHg5ZDQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ3X19VU0JIM19OWFQJCUlPTVVYX1BBRCgweDc3OCwgMHgzNzAsIDMsIDB4YTIwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOF9fRElTUDJfREFUOAkJSU9NVVhfUEFEKDB4NzdjLCAweDM3NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ4X19GRUNfVERBVEEzCQlJT01VWF9QQUQoMHg3N2MsIDB4Mzc0LCAyLCBfX05BXywgMCwgTVg1MV9QQURfQ1RSTF81KQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ4X19HUElPMV8zMAkJSU9NVVhfUEFEKDB4NzdjLCAweDM3NCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ4X19LRVlfUk9XNgkJSU9NVVhfUEFEKDB4NzdjLCAweDM3NCwgNCwgMHg5ZDgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ4X19VU0JIM19EQVRBMAlJT01VWF9QQUQoMHg3N2MsIDB4Mzc0LCAzLCAweDlmYywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDlfX0FVRDZfUlhDCQlJT01VWF9QQUQoMHg3ODAsIDB4Mzc4LCA0LCAweDhmNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDlfX0RJU1AyX0RBVDkJCUlPTVVYX1BBRCgweDc4MCwgMHgzNzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOV9fRkVDX1RYX0VOCQlJT01VWF9QQUQoMHg3ODAsIDB4Mzc4LCAyLCBfX05BXywgMCwgTVg1MV9QQURfQ1RSTF81KQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ5X19HUElPMV8zMQkJSU9NVVhfUEFEKDB4NzgwLCAweDM3OCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ5X19VU0JIM19EQVRBMQlJT01VWF9QQUQoMHg3ODAsIDB4Mzc4LCAzLCAweGEwMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEwX19ESVNQMl9EQVQxMAlJT01VWF9QQUQoMHg3ODQsIDB4MzdjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEwX19ESVNQMl9TRVJfQ1MJSU9NVVhfUEFEKDB4Nzg0LCAweDM3YywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMF9fRkVDX0NPTAkJSU9NVVhfUEFEKDB4Nzg0LCAweDM3YywgMiwgMHg5NGMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMF9fS0VZX1JPVzcJCUlPTVVYX1BBRCgweDc4NCwgMHgzN2MsIDQsIDB4OWRjLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTBfX1VTQkgzX0RBVEEyCUlPTVVYX1BBRCgweDc4NCwgMHgzN2MsIDMsIDB4YTA0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTFfX0FVRDZfVFhECQlJT01VWF9QQUQoMHg3ODgsIDB4MzgwLCA0LCAweDhmMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDExX19ESVNQMl9EQVQxMQlJT01VWF9QQUQoMHg3ODgsIDB4MzgwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDExX19GRUNfUlhfQ0xLCUlPTVVYX1BBRCgweDc4OCwgMHgzODAsIDIsIDB4OTY4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTFfX0dQSU8xXzEwCQlJT01VWF9QQUQoMHg3ODgsIDB4MzgwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDExX19VU0JIM19EQVRBMwlJT01VWF9QQUQoMHg3ODgsIDB4MzgwLCAzLCAweGEwOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEyX19BVUQ2X1JYRAkJSU9NVVhfUEFEKDB4NzhjLCAweDM4NCwgNCwgMHg4ZWMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMl9fRElTUDJfREFUMTIJSU9NVVhfUEFEKDB4NzhjLCAweDM4NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMl9fRkVDX1JYX0RWCQlJT01VWF9QQUQoMHg3OGMsIDB4Mzg0LCAyLCAweDk2YywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEyX19VU0JIM19EQVRBNAlJT01VWF9QQUQoMHg3OGMsIDB4Mzg0LCAzLCAweGEwYywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEzX19BVUQ2X1RYQwkJSU9NVVhfUEFEKDB4NzkwLCAweDM4OCwgNCwgMHg4ZmMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxM19fRElTUDJfREFUMTMJSU9NVVhfUEFEKDB4NzkwLCAweDM4OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxM19fRkVDX1RYX0NMSwlJT01VWF9QQUQoMHg3OTAsIDB4Mzg4LCAyLCAweDk3NCwgMSwgTVg1MV9QQURfQ1RSTF80KQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxM19fVVNCSDNfREFUQTUJSU9NVVhfUEFEKDB4NzkwLCAweDM4OCwgMywgMHhhMTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNF9fQVVENl9UWEZTCQlJT01VWF9QQUQoMHg3OTQsIDB4MzhjLCA0LCAweDkwMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE0X19ESVNQMl9EQVQxNAlJT01VWF9QQUQoMHg3OTQsIDB4MzhjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE0X19GRUNfUkRBVEEwCUlPTVVYX1BBRCgweDc5NCwgMHgzOGMsIDIsIDB4OTU4LCAxLCBNWDUxX1BBRF9DVFJMXzQpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE0X19VU0JIM19EQVRBNglJT01VWF9QQUQoMHg3OTQsIDB4MzhjLCAzLCAweGExNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE1X19BVUQ2X1JYRlMJCUlPTVVYX1BBRCgweDc5OCwgMHgzOTAsIDQsIDB4OGY4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTVfX0RJU1AxX1NFUl9DUwlJT01VWF9QQUQoMHg3OTgsIDB4MzkwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE1X19ESVNQMl9EQVQxNQlJT01VWF9QQUQoMHg3OTgsIDB4MzkwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE1X19GRUNfVERBVEEwCUlPTVVYX1BBRCgweDc5OCwgMHgzOTAsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE1X19VU0JIM19EQVRBNwlJT01VWF9QQUQoMHg3OTgsIDB4MzkwLCAzLCAweGExOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9DTURfX0FVRDVfUlhGUwkJSU9NVVhfUEFEKDB4NzljLCAweDM5NCwgMSwgMHg4ZTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfQ01EX19DU1BJX01PU0kJCUlPTVVYX1BBRCgweDc5YywgMHgzOTQsIDIsIDB4OTFjLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0NNRF9fU0QxX0NNRAkJSU9NVVhfUEFEKDB4NzljLCAweDM5NCwgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9DTEtfX0FVRDVfUlhDCQlJT01VWF9QQUQoMHg3YTAsIDB4Mzk4LCAxLCAweDhkYywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9DTEtfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4N2EwLCAweDM5OCwgMiwgMHg5MTQsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfQ0xLX19TRDFfQ0xLCQlJT01VWF9QQUQoMHg3YTAsIDB4Mzk4LCAweDEwLCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCB8IFBBRF9DVExfSFlTKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTBfX0FVRDVfVFhECQlJT01VWF9QQUQoMHg3YTQsIDB4MzljLCAxLCAweDhkOCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBMF9fQ1NQSV9NSVNPCQlJT01VWF9QQUQoMHg3YTQsIDB4MzljLCAyLCAweDkxOCwgMSwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEwX19TRDFfREFUQTAJCUlPTVVYX1BBRCgweDdhNCwgMHgzOWMsIDB4MTAsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREEwX19FSU1fREEwCQlJT01VWF9QQUQoX19OQV8sIDB4MDFjLCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTFfX0VJTV9EQTEJCUlPTVVYX1BBRChfX05BXywgMHgwMjAsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMl9fRUlNX0RBMgkJSU9NVVhfUEFEKF9fTkFfLCAweDAyNCwgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREEzX19FSU1fREEzCQlJT01VWF9QQUQoX19OQV8sIDB4MDI4LCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBMV9fQVVENV9SWEQJCUlPTVVYX1BBRCgweDdhOCwgMHgzYTAsIDEsIDB4OGQ0LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEExX19TRDFfREFUQTEJCUlPTVVYX1BBRCgweDdhOCwgMHgzYTAsIDB4MTAsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREE0X19FSU1fREE0CQlJT01VWF9QQUQoX19OQV8sIDB4MDJjLCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTVfX0VJTV9EQTUJCUlPTVVYX1BBRChfX05BXywgMHgwMzAsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBNl9fRUlNX0RBNgkJSU9NVVhfUEFEKF9fTkFfLCAweDAzNCwgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREE3X19FSU1fREE3CQlJT01VWF9QQUQoX19OQV8sIDB4MDM4LCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBMl9fQVVENV9UWEMJCUlPTVVYX1BBRCgweDdhYywgMHgzYTQsIDEsIDB4OGU0LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEyX19TRDFfREFUQTIJCUlPTVVYX1BBRCgweDdhYywgMHgzYTQsIDB4MTAsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREExMF9fRUlNX0RBMTAJCUlPTVVYX1BBRChfX05BXywgMHgwNDQsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMTFfX0VJTV9EQTExCQlJT01VWF9QQUQoX19OQV8sIDB4MDQ4LCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQThfX0VJTV9EQTgJCUlPTVVYX1BBRChfX05BXywgMHgwM2MsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBOV9fRUlNX0RBOQkJSU9NVVhfUEFEKF9fTkFfLCAweDA0MCwgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTNfX0FVRDVfVFhGUwkJSU9NVVhfUEFEKDB4N2IwLCAweDNhOCwgMSwgMHg4ZTgsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTNfX0NTUElfU1MxCQlJT01VWF9QQUQoMHg3YjAsIDB4M2E4LCAyLCAweDkyMCwgMSwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEzX19TRDFfREFUQTMJCUlPTVVYX1BBRCgweDdiMCwgMHgzYTgsIDB4MTAsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8wX19DU1BJX1NTMgkJSU9NVVhfUEFEKDB4N2I0LCAweDNhYywgMiwgMHg5MjQsIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzBfX0dQSU8xXzAJCUlPTVVYX1BBRCgweDdiNCwgMHgzYWMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMF9fU0QxX0NECQlJT01VWF9QQUQoMHg3YjQsIDB4M2FjLCAwLCBfX05BXywgMCwgTVg1MV9FU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMV9fQ1NQSV9NSVNPCQlJT01VWF9QQUQoMHg3YjgsIDB4M2IwLCAyLCAweDkxOCwgMiwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMV9fR1BJTzFfMQkJSU9NVVhfUEFEKDB4N2I4LCAweDNiMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8xX19TRDFfV1AJCUlPTVVYX1BBRCgweDdiOCwgMHgzYjAsIDAsIF9fTkFfLCAwLCBNWDUxX0VTREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREExMl9fRUlNX0RBMTIJCUlPTVVYX1BBRChfX05BXywgMHgwNGMsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMTNfX0VJTV9EQTEzCQlJT01VWF9QQUQoX19OQV8sIDB4MDUwLCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTE0X19FSU1fREExNAkJSU9NVVhfUEFEKF9fTkFfLCAweDA1NCwgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREExNV9fRUlNX0RBMTUJCUlPTVVYX1BBRChfX05BXywgMHgwNTgsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0NNRF9fQ1NQSV9NT1NJCQlJT01VWF9QQUQoX19OQV8sIDB4M2I0LCAyLCAweDkxYywgMywgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0NNRF9fSTJDMV9TQ0wJCUlPTVVYX1BBRCgweDdiYywgMHgzYjQsIDB4MTEsIDB4OWIwLCAyLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0NNRF9fU0QyX0NNRAkJSU9NVVhfUEFEKDB4N2JjLCAweDNiNCwgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9DTEtfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4N2MwLCAweDNiOCwgMiwgMHg5MTQsIDMsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9DTEtfX0kyQzFfU0RBCQlJT01VWF9QQUQoMHg3YzAsIDB4M2I4LCAweDExLCAweDliNCwgMiwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9DTEtfX1NEMl9DTEsJCUlPTVVYX1BBRCgweDdjMCwgMHgzYjgsIDB4MTAsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMIHwgUEFEX0NUTF9IWVMpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMF9fQ1NQSV9NSVNPCQlJT01VWF9QQUQoMHg3YzQsIDB4M2JjLCAyLCAweDkxOCwgMywgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEwX19TRDFfREFUNAkJSU9NVVhfUEFEKDB4N2M0LCAweDNiYywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTBfX1NEMl9EQVRBMAkJSU9NVVhfUEFEKDB4N2M0LCAweDNiYywgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMV9fU0QxX0RBVDUJCUlPTVVYX1BBRCgweDdjOCwgMHgzYzAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEExX19TRDJfREFUQTEJCUlPTVVYX1BBRCgweDdjOCwgMHgzYzAsIDB4MTAsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTFfX1VTQkgzX0gyX0RQCQlJT01VWF9QQUQoMHg3YzgsIDB4M2MwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMl9fU0QxX0RBVDYJCUlPTVVYX1BBRCgweDdjYywgMHgzYzQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEyX19TRDJfREFUQTIJCUlPTVVYX1BBRCgweDdjYywgMHgzYzQsIDB4MTAsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTJfX1VTQkgzX0gyX0RNCQlJT01VWF9QQUQoMHg3Y2MsIDB4M2M0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBM19fQ1NQSV9TUzIJCUlPTVVYX1BBRCgweDdkMCwgMHgzYzgsIDIsIDB4OTI0LCAxLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTNfX1NEMV9EQVQ3CQlJT01VWF9QQUQoMHg3ZDAsIDB4M2M4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBM19fU0QyX0RBVEEzCQlJT01VWF9QQUQoMHg3ZDAsIDB4M2M4LCAweDEwLCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMl9fQ0NNX09VVF8yCQlJT01VWF9QQUQoMHg3ZDQsIDB4M2NjLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzJfX0dQSU8xXzIJCUlPTVVYX1BBRCgweDdkNCwgMHgzY2MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMl9fSTJDMl9TQ0wJCUlPTVVYX1BBRCgweDdkNCwgMHgzY2MsIDB4MTIsIDB4OWI4LCAzLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMl9fUExMMV9CWVAJCUlPTVVYX1BBRCgweDdkNCwgMHgzY2MsIDcsIDB4OTBjLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMl9fUFdNMV9QV01PCQlJT01VWF9QQUQoMHg3ZDQsIDB4M2NjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzNfX0dQSU8xXzMJCUlPTVVYX1BBRCgweDdkOCwgMHgzZDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfM19fSTJDMl9TREEJCUlPTVVYX1BBRCgweDdkOCwgMHgzZDAsIDB4MTIsIDB4OWJjLCAzLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfM19fUExMMl9CWVAJCUlPTVVYX1BBRCgweDdkOCwgMHgzZDAsIDcsIDB4OTEwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfM19fUFdNMl9QV01PCQlJT01VWF9QQUQoMHg3ZDgsIDB4M2QwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1BNSUNfSU5UX1JFUV9fUE1JQ19JTlRfUkVRCUlPTVVYX1BBRCgweDdmYywgMHgzZDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfUE1JQ19JTlRfUkVRX19QTUlDX1BNVV9JUlFfQglJT01VWF9QQUQoMHg3ZmMsIDB4M2Q0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzRfX0RJU1AyX0VYVF9DTEsJCUlPTVVYX1BBRCgweDgwNCwgMHgzZDgsIDQsIDB4OTA4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNF9fRUlNX1JEWQkJSU9NVVhfUEFEKDB4ODA0LCAweDNkOCwgMywgMHg5MzgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV80X19HUElPMV80CQlJT01VWF9QQUQoMHg4MDQsIDB4M2Q4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzRfX1dET0cxX1dET0dfQgkJSU9NVVhfUEFEKDB4ODA0LCAweDNkOCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV81X19DU0kyX01DTEsJCUlPTVVYX1BBRCgweDgwOCwgMHgzZGMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNV9fRElTUDJfUElOMTYJCUlPTVVYX1BBRCgweDgwOCwgMHgzZGMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNV9fR1BJTzFfNQkJSU9NVVhfUEFEKDB4ODA4LCAweDNkYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV81X19XRE9HMl9XRE9HX0IJCUlPTVVYX1BBRCgweDgwOCwgMHgzZGMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNl9fRElTUDJfUElOMTcJCUlPTVVYX1BBRCgweDgwYywgMHgzZTAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNl9fR1BJTzFfNgkJSU9NVVhfUEFEKDB4ODBjLCAweDNlMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV82X19SRUZfRU5fQgkJSU9NVVhfUEFEKDB4ODBjLCAweDNlMCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV83X19DQ01fT1VUXzAJCUlPTVVYX1BBRCgweDgxMCwgMHgzZTQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfN19fR1BJTzFfNwkJSU9NVVhfUEFEKDB4ODEwLCAweDNlNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV83X19TRDJfV1AJCUlPTVVYX1BBRCgweDgxMCwgMHgzZTQsIDYsIF9fTkFfLCAwLCBNWDUxX0VTREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV83X19TUERJRl9PVVQxCQlJT01VWF9QQUQoMHg4MTAsIDB4M2U0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzhfX0NTSTJfREFUQV9FTgkJSU9NVVhfUEFEKDB4ODE0LCAweDNlOCwgMiwgMHg5OWMsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV84X19HUElPMV84CQlJT01VWF9QQUQoMHg4MTQsIDB4M2U4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzhfX1NEMl9DRAkJSU9NVVhfUEFEKDB4ODE0LCAweDNlOCwgNiwgX19OQV8sIDAsIE1YNTFfRVNESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzhfX1VTQkgzX1BXUgkJSU9NVVhfUEFEKDB4ODE0LCAweDNlOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV85X19DQ01fT1VUXzEJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fRElTUDJfRDFfQ1MJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fRElTUDJfU0VSX0NTCQlJT01VWF9QQUQoMHg4MTgsIDB4M2VjLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzlfX0dQSU8xXzkJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fU0QyX0xDVEwJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fVVNCSDNfT0MJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKIAogI2VuZGlmIC8qIF9fTUFDSF9JT01VWF9NWDUxX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14NTMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDUzLmgKaW5kZXggNTQwOGZkMS4uNTI3ZjhmZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14NTMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXg1My5oCkBAIC0yMywyMzU5ICsyMywxMTk3IEBACiAKIC8qIFRoZXNlIDIgZGVmaW5lcyBhcmUgZm9yIHBpbnMgdGhhdCBtYXkgbm90IGhhdmUgYSBtdXggcmVnaXN0ZXIsIGJ1dCBjb3VsZAogICogaGF2ZSBhIHBhZCBzZXR0aW5nIHJlZ2lzdGVyLCBhbmQgdmljZS12ZXJzYS4gKi8KLSNkZWZpbmUgTk9OX1BBRF9JCTB4MDAKKyNkZWZpbmUgX19OQV8JMHgwMAogCiAjZGVmaW5lIE1YNTNfVUFSVF9QQURfQ1RSTAkJKFBBRF9DVExfUEtFIHwgUEFEX0NUTF9QVUUgfAlcCiAJCVBBRF9DVExfRFNFX0hJR0ggfCBQQURfQ1RMX1NSRV9GQVNUIHwgUEFEX0NUTF9IWVMpCiAjZGVmaW5lIE1YNTNfU0RIQ19QQURfQ1RSTCAJKFBBRF9DVExfSFlTIHwgUEFEX0NUTF9QS0UgfCBQQURfQ1RMX1BVRSB8IFwKIAkJCQlQQURfQ1RMX1BVU180N0tfVVAgfCBQQURfQ1RMX0RTRV9ISUdIIHwgXAogCQkJCVBBRF9DVExfU1JFX0ZBU1QpCi0jZGVmaW5lIFBBRF9DVFJMX0kyQwkoUEFEX0NUTF9TUkVfRkFTVCB8IFBBRF9DVExfT0RFIHwgUEFEX0NUTF9QS0UgfCBcCi0JCQlQQURfQ1RMX1BVRSB8IFBBRF9DVExfRFNFX0hJR0ggfCBQQURfQ1RMX1BVU18xMDBLX1VQIFwKLQkJCXwgUEFEX0NUTF9IWVMpCiAKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTlfX0tQUF9DT0xfNQkJSU9NVVhfUEFEKDB4MzQ4LCAweDIwLCAwLCAweDg0MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTlfX0dQSU80XzUJCUlPTVVYX1BBRCgweDM0OCwgMHgyMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOV9fQ0NNX0NMS08JCUlPTVVYX1BBRCgweDM0OCwgMHgyMCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOV9fU1BESUZfT1VUMQlJT01VWF9QQUQoMHgzNDgsIDB4MjAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTlfX1JUQ19DRV9SVENfRVhUX1RSSUcyCUlPTVVYX1BBRCgweDM0OCwgMHgyMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOV9fRUNTUEkxX1JEWQlJT01VWF9QQUQoMHgzNDgsIDB4MjAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTlfX0ZFQ19UREFUQV8zCUlPTVVYX1BBRCgweDM0OCwgMHgyMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOV9fU1JDX0lOVF9CT09UCUlPTVVYX1BBRCgweDM0OCwgMHgyMCw3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMF9fS1BQX0NPTF8wCUlPTVVYX1BBRCgweDM0QywgMHgyNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDBfX0dQSU80XzYJCUlPTVVYX1BBRCgweDM0QywgMHgyNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDBfX0FVRE1VWF9BVUQ1X1RYQwlJT01VWF9QQUQoMHgzNEMsIDB4MjQsIDIsIDB4NzU4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDBfX1VBUlQ0X1RYRF9NVVgJSU9NVVhfUEFEKDB4MzRDLCAweDI0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMF9fRUNTUEkxX1NDTEsJSU9NVVhfUEFEKDB4MzRDLCAweDI0LCA1LCAweDc5QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wwX19GRUNfUkRBVEFfMwlJT01VWF9QQUQoMHgzNEMsIDB4MjQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wwX19TUkNfQU5ZX1BVX1JTVAlJT01VWF9QQUQoMHgzNEMsIDB4MjQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cwX19LUFBfUk9XXzAJSU9NVVhfUEFEKDB4MzUwLCAweDI4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMF9fR1BJTzRfNwkJSU9NVVhfUEFEKDB4MzUwLCAweDI4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMF9fQVVETVVYX0FVRDVfVFhECUlPTVVYX1BBRCgweDM1MCwgMHgyOCwgMiwgMHg3NEMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMF9fVUFSVDRfUlhEX01VWAlJT01VWF9QQUQoMHgzNTAsIDB4MjgsIDQsIDB4ODkwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzBfX0VDU1BJMV9NT1NJCUlPTVVYX1BBRCgweDM1MCwgMHgyOCwgNSwgMHg3QTQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMF9fRkVDX1RYX0VSCUlPTVVYX1BBRCgweDM1MCwgMHgyOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDFfX0tQUF9DT0xfMQlJT01VWF9QQUQoMHgzNTQsIDB4MkMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wxX19HUElPNF84CQlJT01VWF9QQUQoMHgzNTQsIDB4MkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wxX19BVURNVVhfQVVENV9UWEZTCUlPTVVYX1BBRCgweDM1NCwgMHgyQywgMiwgMHg3NUMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMV9fVUFSVDVfVFhEX01VWAlJT01VWF9QQUQoMHgzNTQsIDB4MkMsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wxX19FQ1NQSTFfTUlTTwlJT01VWF9QQUQoMHgzNTQsIDB4MkMsIDUsIDB4N0EwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDFfX0ZFQ19SWF9DTEsJSU9NVVhfUEFEKDB4MzU0LCAweDJDLCA2LCAweDgwOCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wxX19VU0JQSFkxX1RYUkVBRFkJSU9NVVhfUEFEKDB4MzU0LCAweDJDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMV9fS1BQX1JPV18xCUlPTVVYX1BBRCgweDM1OCwgMHgzMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzFfX0dQSU80XzkJCUlPTVVYX1BBRCgweDM1OCwgMHgzMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzFfX0FVRE1VWF9BVUQ1X1JYRAlJT01VWF9QQUQoMHgzNTgsIDB4MzAsIDIsIDB4NzQ4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzFfX1VBUlQ1X1JYRF9NVVgJSU9NVVhfUEFEKDB4MzU4LCAweDMwLCA0LCAweDg5OCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cxX19FQ1NQSTFfU1MwCUlPTVVYX1BBRCgweDM1OCwgMHgzMCwgNSwgMHg3QTgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMV9fRkVDX0NPTAkJSU9NVVhfUEFEKDB4MzU4LCAweDMwLCA2LCAweDgwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cxX19VU0JQSFkxX1JYVkFMSUQJSU9NVVhfUEFEKDB4MzU4LCAweDMwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMl9fS1BQX0NPTF8yCUlPTVVYX1BBRCgweDM1QywgMHgzNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDJfX0dQSU80XzEwCQlJT01VWF9QQUQoMHgzNUMsIDB4MzQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wyX19DQU4xX1RYQ0FOCUlPTVVYX1BBRCgweDM1QywgMHgzNCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDJfX0ZFQ19NRElPCQlJT01VWF9QQUQoMHgzNUMsIDB4MzQsIDQsIDB4ODA0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDJfX0VDU1BJMV9TUzEJSU9NVVhfUEFEKDB4MzVDLCAweDM0LCA1LCAweDdBQywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wyX19GRUNfUkRBVEFfMglJT01VWF9QQUQoMHgzNUMsIDB4MzQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wyX19VU0JQSFkxX1JYQUNUSVZFCUlPTVVYX1BBRCgweDM1QywgMHgzNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzJfX0tQUF9ST1dfMglJT01VWF9QQUQoMHgzNjAsIDB4MzgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cyX19HUElPNF8xMQlJT01VWF9QQUQoMHgzNjAsIDB4MzgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cyX19DQU4xX1JYQ0FOCUlPTVVYX1BBRCgweDM2MCwgMHgzOCwgMiwgMHg3NjAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMl9fRkVDX01EQwkJSU9NVVhfUEFEKDB4MzYwLCAweDM4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMl9fRUNTUEkxX1NTMglJT01VWF9QQUQoMHgzNjAsIDB4MzgsIDUsIDB4N0IwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzJfX0ZFQ19UREFUQV8yCUlPTVVYX1BBRCgweDM2MCwgMHgzOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzJfX1VTQlBIWTFfUlhFUlJPUglJT01VWF9QQUQoMHgzNjAsIDB4MzgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wzX19LUFBfQ09MXzMJSU9NVVhfUEFEKDB4MzY0LCAweDNDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MM19fR1BJTzRfMTIJCUlPTVVYX1BBRCgweDM2NCwgMHgzQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDNfX1VTQk9IM19IMl9EUAlJT01VWF9QQUQoMHgzNjQsIDB4M0MsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wzX19TUERJRl9JTjEJSU9NVVhfUEFEKDB4MzY0LCAweDNDLCAzLCAweDg3MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wzX19JMkMyX1NDTAkJSU9NVVhfUEFEKDB4MzY0LCAweDNDLCA0IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODFDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDNfX0VDU1BJMV9TUzMJSU9NVVhfUEFEKDB4MzY0LCAweDNDLCA1LCAweDdCNCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wzX19GRUNfQ1JTCQlJT01VWF9QQUQoMHgzNjQsIDB4M0MsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wzX19VU0JQSFkxX1NJRUNMT0NLCUlPTVVYX1BBRCgweDM2NCwgMHgzQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzNfX0tQUF9ST1dfMwlJT01VWF9QQUQoMHgzNjgsIDB4NDAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1czX19HUElPNF8xMwlJT01VWF9QQUQoMHgzNjgsIDB4NDAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1czX19VU0JPSDNfSDJfRE0JSU9NVVhfUEFEKDB4MzY4LCAweDQwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XM19fQ0NNX0FTUkNfRVhUX0NMSwlJT01VWF9QQUQoMHgzNjgsIDB4NDAsIDMsIDB4NzY4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzNfX0kyQzJfU0RBCUlPTVVYX1BBRCgweDM2OCwgMHg0MCwgNCB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyMCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1czX19PU0MzMktfMzJLX09VVAlJT01VWF9QQUQoMHgzNjgsIDB4NDAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1czX19DQ01fUExMNF9CWVAJSU9NVVhfUEFEKDB4MzY4LCAweDQwLCA2LCAweDc3QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1czX19VU0JQSFkxX0xJTkVTVEFURV8wCUlPTVVYX1BBRCgweDM2OCwgMHg0MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDRfX0tQUF9DT0xfNAlJT01VWF9QQUQoMHgzNkMsIDB4NDQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0w0X19HUElPNF8xNAkJSU9NVVhfUEFEKDB4MzZDLCAweDQ0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MNF9fQ0FOMl9UWENBTglJT01VWF9QQUQoMHgzNkMsIDB4NDQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0w0X19JUFVfU0lTR180CUlPTVVYX1BBRCgweDM2QywgMHg0NCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDRfX1VBUlQ1X1JUUwlJT01VWF9QQUQoMHgzNkMsIDB4NDQsIDQsIDB4ODk0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDRfX1VTQk9IM19VU0JPVEdfT0MJSU9NVVhfUEFEKDB4MzZDLCAweDQ0LCA1LCAweDg5QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0w0X19VU0JQSFkxX0xJTkVTVEFURV8xCUlPTVVYX1BBRCgweDM2QywgMHg0NCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzRfX0tQUF9ST1dfNAlJT01VWF9QQUQoMHgzNzAsIDB4NDgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19HUElPNF8xNQlJT01VWF9QQUQoMHgzNzAsIDB4NDgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19DQU4yX1JYQ0FOCUlPTVVYX1BBRCgweDM3MCwgMHg0OCwgMiwgMHg3NjQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XNF9fSVBVX1NJU0dfNQlJT01VWF9QQUQoMHgzNzAsIDB4NDgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19VQVJUNV9DVFMJSU9NVVhfUEFEKDB4MzcwLCAweDQ4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XNF9fVVNCT0gzX1VTQk9UR19QV1IJSU9NVVhfUEFEKDB4MzcwLCAweDQ4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XNF9fVVNCUEhZMV9WQlVTVkFMSUQJSU9NVVhfUEFEKDB4MzcwLCAweDQ4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfRElTUF9DTEtfX0lQVV9ESTBfRElTUF9DTEsJSU9NVVhfUEFEKDB4Mzc4LCAweDRDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfRElTUF9DTEtfX0dQSU80XzE2CQlJT01VWF9QQUQoMHgzNzgsIDB4NEMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fVVNCT0gzX1VTQkgyX0RJUglJT01VWF9QQUQoMHgzNzgsIDB4NEMsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fU0RNQV9ERUJVR19DT1JFX1NUQVRFXzAJSU9NVVhfUEFEKDB4Mzc4LCAweDRDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfRElTUF9DTEtfX0VNSV9FTUlfREVCVUdfMAlJT01VWF9QQUQoMHgzNzgsIDB4NEMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fVVNCUEhZMV9BVkFMSUQJSU9NVVhfUEFEKDB4Mzc4LCAweDRDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOMTVfX0lQVV9ESTBfUElOMTUJCUlPTVVYX1BBRCgweDM3QywgMHg1MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjE1X19HUElPNF8xNwkJSU9NVVhfUEFEKDB4MzdDLCAweDUwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOMTVfX0FVRE1VWF9BVUQ2X1RYQwlJT01VWF9QQUQoMHgzN0MsIDB4NTAsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4xNV9fU0RNQV9ERUJVR19DT1JFX1NUQVRFXzEJSU9NVVhfUEFEKDB4MzdDLCAweDUwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOMTVfX0VNSV9FTUlfREVCVUdfMQlJT01VWF9QQUQoMHgzN0MsIDB4NTAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4xNV9fVVNCUEhZMV9CVkFMSUQJCUlPTVVYX1BBRCgweDM3QywgMHg1MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjJfX0lQVV9ESTBfUElOMgkJSU9NVVhfUEFEKDB4MzgwLCAweDU0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOMl9fR1BJTzRfMTgJCQlJT01VWF9QQUQoMHgzODAsIDB4NTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4yX19BVURNVVhfQVVENl9UWEQJSU9NVVhfUEFEKDB4MzgwLCAweDU0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOMl9fU0RNQV9ERUJVR19DT1JFX1NUQVRFXzIJSU9NVVhfUEFEKDB4MzgwLCAweDU0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOMl9fRU1JX0VNSV9ERUJVR18yCQlJT01VWF9QQUQoMHgzODAsIDB4NTQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4yX19VU0JQSFkxX0VORFNFU1NJT04JSU9NVVhfUEFEKDB4MzgwLCAweDU0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOM19fSVBVX0RJMF9QSU4zCQlJT01VWF9QQUQoMHgzODQsIDB4NTgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4zX19HUElPNF8xOQkJCUlPTVVYX1BBRCgweDM4NCwgMHg1OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjNfX0FVRE1VWF9BVUQ2X1RYRlMJSU9NVVhfUEFEKDB4Mzg0LCAweDU4LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOM19fU0RNQV9ERUJVR19DT1JFX1NUQVRFXzMJSU9NVVhfUEFEKDB4Mzg0LCAweDU4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOM19fRU1JX0VNSV9ERUJVR18zCQlJT01VWF9QQUQoMHgzODQsIDB4NTgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4zX19VU0JQSFkxX0lERElHCQlJT01VWF9QQUQoMHgzODQsIDB4NTgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU40X19JUFVfREkwX1BJTjQJCUlPTVVYX1BBRCgweDM4OCwgMHg1QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjRfX0dQSU80XzIwCQkJSU9NVVhfUEFEKDB4Mzg4LCAweDVDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElONF9fQVVETVVYX0FVRDZfUlhECUlPTVVYX1BBRCgweDM4OCwgMHg1QywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjRfX0VTREhDMV9XUAkJSU9NVVhfUEFEKDB4Mzg4LCAweDVDLCAzLCAweDdGQywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU40X19TRE1BX0RFQlVHX1lJRUxECUlPTVVYX1BBRCgweDM4OCwgMHg1QywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjRfX0VNSV9FTUlfREVCVUdfNAkJSU9NVVhfUEFEKDB4Mzg4LCAweDVDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElONF9fVVNCUEhZMV9IT1NURElTQ09OTkVDVAlJT01VWF9QQUQoMHgzODgsIDB4NUMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDBfX0lQVV9ESVNQMF9EQVRfMAlJT01VWF9QQUQoMHgzOEMsIDB4NjAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDBfX0dQSU80XzIxCQlJT01VWF9QQUQoMHgzOEMsIDB4NjAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDBfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4MzhDLCAweDYwLCAyLCAweDc4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDBfX1VTQk9IM19VU0JIMl9EQVRBXzAJSU9NVVhfUEFEKDB4MzhDLCAweDYwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQwX19TRE1BX0RFQlVHX0NPUkVfUlVOCUlPTVVYX1BBRCgweDM4QywgMHg2MCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMF9fRU1JX0VNSV9ERUJVR181CUlPTVVYX1BBRCgweDM4QywgMHg2MCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMF9fVVNCUEhZMl9UWFJFQURZCUlPTVVYX1BBRCgweDM4QywgMHg2MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMV9fSVBVX0RJU1AwX0RBVF8xCUlPTVVYX1BBRCgweDM5MCwgMHg2NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMV9fR1BJTzRfMjIJCUlPTVVYX1BBRCgweDM5MCwgMHg2NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMV9fQ1NQSV9NT1NJCQlJT01VWF9QQUQoMHgzOTAsIDB4NjQsIDIsIDB4Nzg4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMV9fVVNCT0gzX1VTQkgyX0RBVEFfMQlJT01VWF9QQUQoMHgzOTAsIDB4NjQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDFfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF9TRUwJSU9NVVhfUEFEKDB4MzkwLCAweDY0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxX19FTUlfRU1JX0RFQlVHXzYJSU9NVVhfUEFEKDB4MzkwLCAweDY0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxX19VU0JQSFkyX1JYVkFMSUQJSU9NVVhfUEFEKDB4MzkwLCAweDY0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyX19JUFVfRElTUDBfREFUXzIJSU9NVVhfUEFEKDB4Mzk0LCAweDY4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyX19HUElPNF8yMwkJSU9NVVhfUEFEKDB4Mzk0LCAweDY4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyX19DU1BJX01JU08JCUlPTVVYX1BBRCgweDM5NCwgMHg2OCwgMiwgMHg3ODQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyX19VU0JPSDNfVVNCSDJfREFUQV8yCUlPTVVYX1BBRCgweDM5NCwgMHg2OCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMl9fU0RNQV9ERUJVR19NT0RFCUlPTVVYX1BBRCgweDM5NCwgMHg2OCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMl9fRU1JX0VNSV9ERUJVR183CUlPTVVYX1BBRCgweDM5NCwgMHg2OCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMl9fVVNCUEhZMl9SWEFDVElWRQlJT01VWF9QQUQoMHgzOTQsIDB4NjgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDNfX0lQVV9ESVNQMF9EQVRfMwlJT01VWF9QQUQoMHgzOTgsIDB4NkMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDNfX0dQSU80XzI0CQlJT01VWF9QQUQoMHgzOTgsIDB4NkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDNfX0NTUElfU1MwCQlJT01VWF9QQUQoMHgzOTgsIDB4NkMsIDIsIDB4NzhDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUM19fVVNCT0gzX1VTQkgyX0RBVEFfMwlJT01VWF9QQUQoMHgzOTgsIDB4NkMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDNfX1NETUFfREVCVUdfQlVTX0VSUk9SCUlPTVVYX1BBRCgweDM5OCwgMHg2QywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUM19fRU1JX0VNSV9ERUJVR184CUlPTVVYX1BBRCgweDM5OCwgMHg2QywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUM19fVVNCUEhZMl9SWEVSUk9SCUlPTVVYX1BBRCgweDM5OCwgMHg2QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNF9fSVBVX0RJU1AwX0RBVF80CUlPTVVYX1BBRCgweDM5QywgMHg3MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNF9fR1BJTzRfMjUJCUlPTVVYX1BBRCgweDM5QywgMHg3MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNF9fQ1NQSV9TUzEJCUlPTVVYX1BBRCgweDM5QywgMHg3MCwgMiwgMHg3OTAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19VU0JPSDNfVVNCSDJfREFUQV80CUlPTVVYX1BBRCgweDM5QywgMHg3MCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNF9fU0RNQV9ERUJVR19CVVNfUldCCUlPTVVYX1BBRCgweDM5QywgMHg3MCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNF9fRU1JX0VNSV9ERUJVR185CUlPTVVYX1BBRCgweDM5QywgMHg3MCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNF9fVVNCUEhZMl9TSUVDTE9DSwlJT01VWF9QQUQoMHgzOUMsIDB4NzAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDVfX0lQVV9ESVNQMF9EQVRfNQlJT01VWF9QQUQoMHgzQTAsIDB4NzQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDVfX0dQSU80XzI2CQlJT01VWF9QQUQoMHgzQTAsIDB4NzQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDVfX0NTUElfU1MyCQlJT01VWF9QQUQoMHgzQTAsIDB4NzQsIDIsIDB4Nzk0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNV9fVVNCT0gzX1VTQkgyX0RBVEFfNQlJT01VWF9QQUQoMHgzQTAsIDB4NzQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDVfX1NETUFfREVCVUdfTUFUQ0hFRF9ETUJVUwlJT01VWF9QQUQoMHgzQTAsIDB4NzQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDVfX0VNSV9FTUlfREVCVUdfMTAJSU9NVVhfUEFEKDB4M0EwLCAweDc0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ1X19VU0JQSFkyX0xJTkVTVEFURV8wCUlPTVVYX1BBRCgweDNBMCwgMHg3NCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNl9fSVBVX0RJU1AwX0RBVF82CUlPTVVYX1BBRCgweDNBNCwgMHg3OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNl9fR1BJTzRfMjcJCUlPTVVYX1BBRCgweDNBNCwgMHg3OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNl9fQ1NQSV9TUzMJCUlPTVVYX1BBRCgweDNBNCwgMHg3OCwgMiwgMHg3OTgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19VU0JPSDNfVVNCSDJfREFUQV82CUlPTVVYX1BBRCgweDNBNCwgMHg3OCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNl9fU0RNQV9ERUJVR19SVEJVRkZFUl9XUklURQlJT01VWF9QQUQoMHgzQTQsIDB4NzgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDZfX0VNSV9FTUlfREVCVUdfMTEJSU9NVVhfUEFEKDB4M0E0LCAweDc4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19VU0JQSFkyX0xJTkVTVEFURV8xCUlPTVVYX1BBRCgweDNBNCwgMHg3OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUN19fSVBVX0RJU1AwX0RBVF83CUlPTVVYX1BBRCgweDNBOCwgMHg3QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUN19fR1BJTzRfMjgJCUlPTVVYX1BBRCgweDNBOCwgMHg3QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUN19fQ1NQSV9SRFkJCUlPTVVYX1BBRCgweDNBOCwgMHg3QywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUN19fVVNCT0gzX1VTQkgyX0RBVEFfNwlJT01VWF9QQUQoMHgzQTgsIDB4N0MsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDdfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8wCUlPTVVYX1BBRCgweDNBOCwgMHg3QywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUN19fRU1JX0VNSV9ERUJVR18xMglJT01VWF9QQUQoMHgzQTgsIDB4N0MsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDdfX1VTQlBIWTJfVkJVU1ZBTElECUlPTVVYX1BBRCgweDNBOCwgMHg3QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOF9fSVBVX0RJU1AwX0RBVF84CUlPTVVYX1BBRCgweDNBQywgMHg4MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOF9fR1BJTzRfMjkJCUlPTVVYX1BBRCgweDNBQywgMHg4MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOF9fUFdNMV9QV01PCQlJT01VWF9QQUQoMHgzQUMsIDB4ODAsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDhfX1dET0cxX1dET0dfQglJT01VWF9QQUQoMHgzQUMsIDB4ODAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDhfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8xCUlPTVVYX1BBRCgweDNBQywgMHg4MCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOF9fRU1JX0VNSV9ERUJVR18xMwlJT01VWF9QQUQoMHgzQUMsIDB4ODAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDhfX1VTQlBIWTJfQVZBTElECUlPTVVYX1BBRCgweDNBQywgMHg4MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOV9fSVBVX0RJU1AwX0RBVF85CUlPTVVYX1BBRCgweDNCMCwgMHg4NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOV9fR1BJTzRfMzAJCUlPTVVYX1BBRCgweDNCMCwgMHg4NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOV9fUFdNMl9QV01PCQlJT01VWF9QQUQoMHgzQjAsIDB4ODQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDlfX1dET0cyX1dET0dfQglJT01VWF9QQUQoMHgzQjAsIDB4ODQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDlfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8yCQlJT01VWF9QQUQoMHgzQjAsIDB4ODQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDlfX0VNSV9FTUlfREVCVUdfMTQJSU9NVVhfUEFEKDB4M0IwLCAweDg0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ5X19VU0JQSFkyX1ZTVEFUVVNfMAlJT01VWF9QQUQoMHgzQjAsIDB4ODQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEwX19JUFVfRElTUDBfREFUXzEwCUlPTVVYX1BBRCgweDNCNCwgMHg4OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTBfX0dQSU80XzMxCQlJT01VWF9QQUQoMHgzQjQsIDB4ODgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEwX19VU0JPSDNfVVNCSDJfU1RQCUlPTVVYX1BBRCgweDNCNCwgMHg4OCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTBfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8zCUlPTVVYX1BBRCgweDNCNCwgMHg4OCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTBfX0VNSV9FTUlfREVCVUdfMTUJSU9NVVhfUEFEKDB4M0I0LCAweDg4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fVVNCUEhZMl9WU1RBVFVTXzEJSU9NVVhfUEFEKDB4M0I0LCAweDg4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMV9fSVBVX0RJU1AwX0RBVF8xMQlJT01VWF9QQUQoMHgzQjgsIDB4OEMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDExX19HUElPNV81CQlJT01VWF9QQUQoMHgzQjgsIDB4OEMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDExX19VU0JPSDNfVVNCSDJfTlhUCUlPTVVYX1BBRCgweDNCOCwgMHg4QywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTFfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF80CUlPTVVYX1BBRCgweDNCOCwgMHg4QywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTFfX0VNSV9FTUlfREVCVUdfMTYJSU9NVVhfUEFEKDB4M0I4LCAweDhDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMV9fVVNCUEhZMl9WU1RBVFVTXzIJSU9NVVhfUEFEKDB4M0I4LCAweDhDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMl9fSVBVX0RJU1AwX0RBVF8xMglJT01VWF9QQUQoMHgzQkMsIDB4OTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEyX19HUElPNV82CQlJT01VWF9QQUQoMHgzQkMsIDB4OTAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEyX19VU0JPSDNfVVNCSDJfQ0xLCUlPTVVYX1BBRCgweDNCQywgMHg5MCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTJfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF81CUlPTVVYX1BBRCgweDNCQywgMHg5MCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTJfX0VNSV9FTUlfREVCVUdfMTcJSU9NVVhfUEFEKDB4M0JDLCAweDkwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMl9fVVNCUEhZMl9WU1RBVFVTXzMJSU9NVVhfUEFEKDB4M0JDLCAweDkwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxM19fSVBVX0RJU1AwX0RBVF8xMwlJT01VWF9QQUQoMHgzQzAsIDB4OTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEzX19HUElPNV83CQlJT01VWF9QQUQoMHgzQzAsIDB4OTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEzX19BVURNVVhfQVVENV9SWEZTCUlPTVVYX1BBRCgweDNDMCwgMHg5NCwgMywgMHg3NTQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxM19fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzAJSU9NVVhfUEFEKDB4M0MwLCAweDk0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxM19fRU1JX0VNSV9ERUJVR18xOAlJT01VWF9QQUQoMHgzQzAsIDB4OTQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEzX19VU0JQSFkyX1ZTVEFUVVNfNAlJT01VWF9QQUQoMHgzQzAsIDB4OTQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE0X19JUFVfRElTUDBfREFUXzE0CUlPTVVYX1BBRCgweDNDNCwgMHg5OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTRfX0dQSU81XzgJCUlPTVVYX1BBRCgweDNDNCwgMHg5OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTRfX0FVRE1VWF9BVUQ1X1JYQwlJT01VWF9QQUQoMHgzQzQsIDB4OTgsIDMsIDB4NzUwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTRfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU18xCUlPTVVYX1BBRCgweDNDNCwgMHg5OCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTRfX0VNSV9FTUlfREVCVUdfMTkJSU9NVVhfUEFEKDB4M0M0LCAweDk4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fVVNCUEhZMl9WU1RBVFVTXzUJSU9NVVhfUEFEKDB4M0M0LCAweDk4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fSVBVX0RJU1AwX0RBVF8xNQlJT01VWF9QQUQoMHgzQzgsIDB4OUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE1X19HUElPNV85CQlJT01VWF9QQUQoMHgzQzgsIDB4OUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE1X19FQ1NQSTFfU1MxCQlJT01VWF9QQUQoMHgzQzgsIDB4OUMsIDIsIDB4N0FDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTVfX0VDU1BJMl9TUzEJCUlPTVVYX1BBRCgweDNDOCwgMHg5QywgMywgMHg3QzgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzIJSU9NVVhfUEFEKDB4M0M4LCAweDlDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fRU1JX0VNSV9ERUJVR18yMAlJT01VWF9QQUQoMHgzQzgsIDB4OUMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE1X19VU0JQSFkyX1ZTVEFUVVNfNglJT01VWF9QQUQoMHgzQzgsIDB4OUMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE2X19JUFVfRElTUDBfREFUXzE2CUlPTVVYX1BBRCgweDNDQywgMHhBMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTZfX0dQSU81XzEwCQlJT01VWF9QQUQoMHgzQ0MsIDB4QTAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE2X19FQ1NQSTJfTU9TSQkJSU9NVVhfUEFEKDB4M0NDLCAweEEwLCAyLCAweDdDMCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE2X19BVURNVVhfQVVENV9UWEMJSU9NVVhfUEFEKDB4M0NDLCAweEEwLCAzLCAweDc1OCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE2X19TRE1BX0VYVF9FVkVOVF8wCUlPTVVYX1BBRCgweDNDQywgMHhBMCwgNCwgMHg4NjgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzMJSU9NVVhfUEFEKDB4M0NDLCAweEEwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fRU1JX0VNSV9ERUJVR18yMQlJT01VWF9QQUQoMHgzQ0MsIDB4QTAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE2X19VU0JQSFkyX1ZTVEFUVVNfNwlJT01VWF9QQUQoMHgzQ0MsIDB4QTAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE3X19JUFVfRElTUDBfREFUXzE3CUlPTVVYX1BBRCgweDNEMCwgMHhBNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTdfX0dQSU81XzExCQlJT01VWF9QQUQoMHgzRDAsIDB4QTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE3X19FQ1NQSTJfTUlTTwkJSU9NVVhfUEFEKDB4M0QwLCAweEE0LCAyLCAweDdCQywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE3X19BVURNVVhfQVVENV9UWEQJSU9NVVhfUEFEKDB4M0QwLCAweEE0LCAzLCAweDc0QywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE3X19TRE1BX0VYVF9FVkVOVF8xCUlPTVVYX1BBRCgweDNEMCwgMHhBNCwgNCwgMHg4NkMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxN19fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzQJSU9NVVhfUEFEKDB4M0QwLCAweEE0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxN19fRU1JX0VNSV9ERUJVR18yMglJT01VWF9QQUQoMHgzRDAsIDB4QTQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE4X19JUFVfRElTUDBfREFUXzE4CUlPTVVYX1BBRCgweDNENCwgMHhBOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMThfX0dQSU81XzEyCQlJT01VWF9QQUQoMHgzRDQsIDB4QTgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE4X19FQ1NQSTJfU1MwCQlJT01VWF9QQUQoMHgzRDQsIDB4QTgsIDIsIDB4N0M0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMThfX0FVRE1VWF9BVUQ1X1RYRlMJSU9NVVhfUEFEKDB4M0Q0LCAweEE4LCAzLCAweDc1QywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE4X19BVURNVVhfQVVENF9SWEZTCUlPTVVYX1BBRCgweDNENCwgMHhBOCwgNCwgMHg3M0MsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOF9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzUJSU9NVVhfUEFEKDB4M0Q0LCAweEE4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOF9fRU1JX0VNSV9ERUJVR18yMwlJT01VWF9QQUQoMHgzRDQsIDB4QTgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE4X19FTUlfV0VJTV9DU18yCUlPTVVYX1BBRCgweDNENCwgMHhBOCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTlfX0lQVV9ESVNQMF9EQVRfMTkJSU9NVVhfUEFEKDB4M0Q4LCAweEFDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fR1BJTzVfMTMJCUlPTVVYX1BBRCgweDNEOCwgMHhBQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTlfX0VDU1BJMl9TQ0xLCQlJT01VWF9QQUQoMHgzRDgsIDB4QUMsIDIsIDB4N0I4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTlfX0FVRE1VWF9BVUQ1X1JYRAlJT01VWF9QQUQoMHgzRDgsIDB4QUMsIDMsIDB4NzQ4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTlfX0FVRE1VWF9BVUQ0X1JYQwlJT01VWF9QQUQoMHgzRDgsIDB4QUMsIDQsIDB4NzM4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTlfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU182CUlPTVVYX1BBRCgweDNEOCwgMHhBQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTlfX0VNSV9FTUlfREVCVUdfMjQJSU9NVVhfUEFEKDB4M0Q4LCAweEFDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fRU1JX1dFSU1fQ1NfMwlJT01VWF9QQUQoMHgzRDgsIDB4QUMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIwX19JUFVfRElTUDBfREFUXzIwCUlPTVVYX1BBRCgweDNEQywgMHhCMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjBfX0dQSU81XzE0CQlJT01VWF9QQUQoMHgzREMsIDB4QjAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIwX19FQ1NQSTFfU0NMSwkJSU9NVVhfUEFEKDB4M0RDLCAweEIwLCAyLCAweDc5QywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIwX19BVURNVVhfQVVENF9UWEMJSU9NVVhfUEFEKDB4M0RDLCAweEIwLCAzLCAweDc0MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIwX19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfNwlJT01VWF9QQUQoMHgzREMsIDB4QjAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIwX19FTUlfRU1JX0RFQlVHXzI1CUlPTVVYX1BBRCgweDNEQywgMHhCMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjBfX1NBVEFfUEhZX1RESQkJSU9NVVhfUEFEKDB4M0RDLCAweEIwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fSVBVX0RJU1AwX0RBVF8yMQlJT01VWF9QQUQoMHgzRTAsIDB4QjQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIxX19HUElPNV8xNQkJSU9NVVhfUEFEKDB4M0UwLCAweEI0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fRUNTUEkxX01PU0kJCUlPTVVYX1BBRCgweDNFMCwgMHhCNCwgMiwgMHg3QTQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fQVVETVVYX0FVRDRfVFhECUlPTVVYX1BBRCgweDNFMCwgMHhCNCwgMywgMHg3MzQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fU0RNQV9ERUJVR19CVVNfREVWSUNFXzAJSU9NVVhfUEFEKDB4M0UwLCAweEI0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fRU1JX0VNSV9ERUJVR18yNglJT01VWF9QQUQoMHgzRTAsIDB4QjQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIxX19TQVRBX1BIWV9URE8JSU9NVVhfUEFEKDB4M0UwLCAweEI0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fSVBVX0RJU1AwX0RBVF8yMglJT01VWF9QQUQoMHgzRTQsIDB4QjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIyX19HUElPNV8xNgkJSU9NVVhfUEFEKDB4M0U0LCAweEI4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fRUNTUEkxX01JU08JCUlPTVVYX1BBRCgweDNFNCwgMHhCOCwgMiwgMHg3QTAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fQVVETVVYX0FVRDRfVFhGUwlJT01VWF9QQUQoMHgzRTQsIDB4QjgsIDMsIDB4NzQ0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjJfX1NETUFfREVCVUdfQlVTX0RFVklDRV8xCUlPTVVYX1BBRCgweDNFNCwgMHhCOCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjJfX0VNSV9FTUlfREVCVUdfMjcJSU9NVVhfUEFEKDB4M0U0LCAweEI4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fU0FUQV9QSFlfVENLCUlPTVVYX1BBRCgweDNFNCwgMHhCOCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjNfX0lQVV9ESVNQMF9EQVRfMjMJSU9NVVhfUEFEKDB4M0U4LCAweEJDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyM19fR1BJTzVfMTcJCUlPTVVYX1BBRCgweDNFOCwgMHhCQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjNfX0VDU1BJMV9TUzAJCUlPTVVYX1BBRCgweDNFOCwgMHhCQywgMiwgMHg3QTgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyM19fQVVETVVYX0FVRDRfUlhECUlPTVVYX1BBRCgweDNFOCwgMHhCQywgMywgMHg3MzAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyM19fU0RNQV9ERUJVR19CVVNfREVWSUNFXzIJSU9NVVhfUEFEKDB4M0U4LCAweEJDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyM19fRU1JX0VNSV9ERUJVR18yOAlJT01VWF9QQUQoMHgzRTgsIDB4QkMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIzX19TQVRBX1BIWV9UTVMJSU9NVVhfUEFEKDB4M0U4LCAweEJDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX1BJWENMS19fSVBVX0NTSTBfUElYQ0xLCUlPTVVYX1BBRCgweDNFQywgMHhDMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9QSVhDTEtfX0dQSU81XzE4CQlJT01VWF9QQUQoMHgzRUMsIDB4QzAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfUElYQ0xLX19TRE1BX0RFQlVHX1BDXzAJSU9NVVhfUEFEKDB4M0VDLCAweEMwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX1BJWENMS19fRU1JX0VNSV9ERUJVR18yOQlJT01VWF9QQUQoMHgzRUMsIDB4QzAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfTUNMS19fSVBVX0NTSTBfSFNZTkMJCUlPTVVYX1BBRCgweDNGMCwgMHhDNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9NQ0xLX19HUElPNV8xOQkJSU9NVVhfUEFEKDB4M0YwLCAweEM0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX01DTEtfX0NDTV9DU0kwX01DTEsJCUlPTVVYX1BBRCgweDNGMCwgMHhDNCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9NQ0xLX19TRE1BX0RFQlVHX1BDXzEJSU9NVVhfUEFEKDB4M0YwLCAweEM0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX01DTEtfX0VNSV9FTUlfREVCVUdfMzAJSU9NVVhfUEFEKDB4M0YwLCAweEM0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX01DTEtfX1RQSVVfVFJDVEwJCUlPTVVYX1BBRCgweDNGMCwgMHhDNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVRBX0VOX19JUFVfQ1NJMF9EQVRBX0VOCUlPTVVYX1BBRCgweDNGNCwgMHhDOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVRBX0VOX19HUElPNV8yMAkJSU9NVVhfUEFEKDB4M0Y0LCAweEM4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVEFfRU5fX1NETUFfREVCVUdfUENfMglJT01VWF9QQUQoMHgzRjQsIDB4QzgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUQV9FTl9fRU1JX0VNSV9ERUJVR18zMQlJT01VWF9QQUQoMHgzRjQsIDB4QzgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUQV9FTl9fVFBJVV9UUkNMSwkJSU9NVVhfUEFEKDB4M0Y0LCAweEM4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX1ZTWU5DX19JUFVfQ1NJMF9WU1lOQwlJT01VWF9QQUQoMHgzRjgsIDB4Q0MsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfVlNZTkNfX0dQSU81XzIxCQlJT01VWF9QQUQoMHgzRjgsIDB4Q0MsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfVlNZTkNfX1NETUFfREVCVUdfUENfMwlJT01VWF9QQUQoMHgzRjgsIDB4Q0MsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfVlNZTkNfX0VNSV9FTUlfREVCVUdfMzIJSU9NVVhfUEFEKDB4M0Y4LCAweENDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX1ZTWU5DX19UUElVX1RSQUNFXzAJCUlPTVVYX1BBRCgweDNGOCwgMHhDQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ0X19JUFVfQ1NJMF9EXzQJCUlPTVVYX1BBRCgweDNGQywgMHhEMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ0X19HUElPNV8yMgkJSU9NVVhfUEFEKDB4M0ZDLCAweEQwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDRfX0tQUF9DT0xfNQkJSU9NVVhfUEFEKDB4M0ZDLCAweEQwLCAyLCAweDg0MCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNF9fRUNTUEkxX1NDTEsJCUlPTVVYX1BBRCgweDNGQywgMHhEMCwgMywgMHg3OUMsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDRfX1VTQk9IM19VU0JIM19TVFAJSU9NVVhfUEFEKDB4M0ZDLCAweEQwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDRfX0FVRE1VWF9BVUQzX1RYQwlJT01VWF9QQUQoMHgzRkMsIDB4RDAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNF9fRU1JX0VNSV9ERUJVR18zMwlJT01VWF9QQUQoMHgzRkMsIDB4RDAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNF9fVFBJVV9UUkFDRV8xCQlJT01VWF9QQUQoMHgzRkMsIDB4RDAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNV9fSVBVX0NTSTBfRF81CQlJT01VWF9QQUQoMHg0MDAsIDB4RDQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNV9fR1BJTzVfMjMJCUlPTVVYX1BBRCgweDQwMCwgMHhENCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ1X19LUFBfUk9XXzUJCUlPTVVYX1BBRCgweDQwMCwgMHhENCwgMiwgMHg4NEMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDVfX0VDU1BJMV9NT1NJCQlJT01VWF9QQUQoMHg0MDAsIDB4RDQsIDMsIDB4N0E0LCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ1X19VU0JPSDNfVVNCSDNfTlhUCUlPTVVYX1BBRCgweDQwMCwgMHhENCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ1X19BVURNVVhfQVVEM19UWEQJSU9NVVhfUEFEKDB4NDAwLCAweEQ0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDVfX0VNSV9FTUlfREVCVUdfMzQJSU9NVVhfUEFEKDB4NDAwLCAweEQ0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDVfX1RQSVVfVFJBQ0VfMgkJSU9NVVhfUEFEKDB4NDAwLCAweEQ0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDZfX0lQVV9DU0kwX0RfNgkJSU9NVVhfUEFEKDB4NDA0LCAweEQ4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDZfX0dQSU81XzI0CQlJT01VWF9QQUQoMHg0MDQsIDB4RDgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNl9fS1BQX0NPTF82CQlJT01VWF9QQUQoMHg0MDQsIDB4RDgsIDIsIDB4ODQ0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ2X19FQ1NQSTFfTUlTTwkJSU9NVVhfUEFEKDB4NDA0LCAweEQ4LCAzLCAweDdBMCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNl9fVVNCT0gzX1VTQkgzX0NMSwlJT01VWF9QQUQoMHg0MDQsIDB4RDgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNl9fQVVETVVYX0FVRDNfVFhGUwlJT01VWF9QQUQoMHg0MDQsIDB4RDgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNl9fRU1JX0VNSV9ERUJVR18zNQlJT01VWF9QQUQoMHg0MDQsIDB4RDgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNl9fVFBJVV9UUkFDRV8zCQlJT01VWF9QQUQoMHg0MDQsIDB4RDgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUN19fSVBVX0NTSTBfRF83CQlJT01VWF9QQUQoMHg0MDgsIDB4REMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUN19fR1BJTzVfMjUJCUlPTVVYX1BBRCgweDQwOCwgMHhEQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ3X19LUFBfUk9XXzYJCUlPTVVYX1BBRCgweDQwOCwgMHhEQywgMiwgMHg4NTAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDdfX0VDU1BJMV9TUzAJCUlPTVVYX1BBRCgweDQwOCwgMHhEQywgMywgMHg3QTgsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDdfX1VTQk9IM19VU0JIM19ESVIJSU9NVVhfUEFEKDB4NDA4LCAweERDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDdfX0FVRE1VWF9BVUQzX1JYRAlJT01VWF9QQUQoMHg0MDgsIDB4REMsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUN19fRU1JX0VNSV9ERUJVR18zNglJT01VWF9QQUQoMHg0MDgsIDB4REMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUN19fVFBJVV9UUkFDRV80CQlJT01VWF9QQUQoMHg0MDgsIDB4REMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOF9fSVBVX0NTSTBfRF84CQlJT01VWF9QQUQoMHg0MEMsIDB4RTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOF9fR1BJTzVfMjYJCUlPTVVYX1BBRCgweDQwQywgMHhFMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ4X19LUFBfQ09MXzcJCUlPTVVYX1BBRCgweDQwQywgMHhFMCwgMiwgMHg4NDgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDhfX0VDU1BJMl9TQ0xLCQlJT01VWF9QQUQoMHg0MEMsIDB4RTAsIDMsIDB4N0I4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ4X19VU0JPSDNfVVNCSDNfT0MJSU9NVVhfUEFEKDB4NDBDLCAweEUwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDhfX0kyQzFfU0RBCQlJT01VWF9QQUQoMHg0MEMsIDB4RTAsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MTgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDhfX0VNSV9FTUlfREVCVUdfMzcJSU9NVVhfUEFEKDB4NDBDLCAweEUwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDhfX1RQSVVfVFJBQ0VfNQkJSU9NVVhfUEFEKDB4NDBDLCAweEUwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDlfX0lQVV9DU0kwX0RfOQkJSU9NVVhfUEFEKDB4NDEwLCAweEU0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDlfX0dQSU81XzI3CQlJT01VWF9QQUQoMHg0MTAsIDB4RTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOV9fS1BQX1JPV183CQlJT01VWF9QQUQoMHg0MTAsIDB4RTQsIDIsIDB4ODU0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ5X19FQ1NQSTJfTU9TSQkJSU9NVVhfUEFEKDB4NDEwLCAweEU0LCAzLCAweDdDMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOV9fVVNCT0gzX1VTQkgzX1BXUglJT01VWF9QQUQoMHg0MTAsIDB4RTQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOV9fSTJDMV9TQ0wJCUlPTVVYX1BBRCgweDQxMCwgMHhFNCwgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgxNCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOV9fRU1JX0VNSV9ERUJVR18zOAlJT01VWF9QQUQoMHg0MTAsIDB4RTQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOV9fVFBJVV9UUkFDRV82CQlJT01VWF9QQUQoMHg0MTAsIDB4RTQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTBfX0lQVV9DU0kwX0RfMTAJCUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fR1BJTzVfMjgJCUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fVUFSVDFfVFhEX01VWAlJT01VWF9QQUQoMHg0MTQsIDB4RTgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTBfX0VDU1BJMl9NSVNPCQlJT01VWF9QQUQoMHg0MTQsIDB4RTgsIDMsIDB4N0JDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fQVVETVVYX0FVRDNfUlhDCUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fU0RNQV9ERUJVR19QQ180CUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fRU1JX0VNSV9ERUJVR18zOQlJT01VWF9QQUQoMHg0MTQsIDB4RTgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTBfX1RQSVVfVFJBQ0VfNwkJSU9NVVhfUEFEKDB4NDE0LCAweEU4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDExX19JUFVfQ1NJMF9EXzExCQlJT01VWF9QQUQoMHg0MTgsIDB4RUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTFfX0dQSU81XzI5CQlJT01VWF9QQUQoMHg0MTgsIDB4RUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTFfX1VBUlQxX1JYRF9NVVgJSU9NVVhfUEFEKDB4NDE4LCAweEVDLCAyLCAweDg3OCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTFfX0VDU1BJMl9TUzAJCUlPTVVYX1BBRCgweDQxOCwgMHhFQywgMywgMHg3QzQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDExX19BVURNVVhfQVVEM19SWEZTCUlPTVVYX1BBRCgweDQxOCwgMHhFQywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMV9fU0RNQV9ERUJVR19QQ181CUlPTVVYX1BBRCgweDQxOCwgMHhFQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMV9fRU1JX0VNSV9ERUJVR180MAlJT01VWF9QQUQoMHg0MTgsIDB4RUMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTFfX1RQSVVfVFJBQ0VfOAkJSU9NVVhfUEFEKDB4NDE4LCAweEVDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEyX19JUFVfQ1NJMF9EXzEyCQlJT01VWF9QQUQoMHg0MUMsIDB4RjAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTJfX0dQSU81XzMwCQlJT01VWF9QQUQoMHg0MUMsIDB4RjAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTJfX1VBUlQ0X1RYRF9NVVgJSU9NVVhfUEFEKDB4NDFDLCAweEYwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEyX19VU0JPSDNfVVNCSDNfREFUQV8wCUlPTVVYX1BBRCgweDQxQywgMHhGMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMl9fU0RNQV9ERUJVR19QQ182CUlPTVVYX1BBRCgweDQxQywgMHhGMCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMl9fRU1JX0VNSV9ERUJVR180MQlJT01VWF9QQUQoMHg0MUMsIDB4RjAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTJfX1RQSVVfVFJBQ0VfOQkJSU9NVVhfUEFEKDB4NDFDLCAweEYwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEzX19JUFVfQ1NJMF9EXzEzCQlJT01VWF9QQUQoMHg0MjAsIDB4RjQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTNfX0dQSU81XzMxCQlJT01VWF9QQUQoMHg0MjAsIDB4RjQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTNfX1VBUlQ0X1JYRF9NVVgJSU9NVVhfUEFEKDB4NDIwLCAweEY0LCAyLCAweDg5MCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTNfX1VTQk9IM19VU0JIM19EQVRBXzEJSU9NVVhfUEFEKDB4NDIwLCAweEY0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEzX19TRE1BX0RFQlVHX1BDXzcJSU9NVVhfUEFEKDB4NDIwLCAweEY0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEzX19FTUlfRU1JX0RFQlVHXzQyCUlPTVVYX1BBRCgweDQyMCwgMHhGNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxM19fVFBJVV9UUkFDRV8xMAkJSU9NVVhfUEFEKDB4NDIwLCAweEY0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE0X19JUFVfQ1NJMF9EXzE0CQlJT01VWF9QQUQoMHg0MjQsIDB4RjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTRfX0dQSU82XzAJCUlPTVVYX1BBRCgweDQyNCwgMHhGOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNF9fVUFSVDVfVFhEX01VWAlJT01VWF9QQUQoMHg0MjQsIDB4RjgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTRfX1VTQk9IM19VU0JIM19EQVRBXzIJSU9NVVhfUEFEKDB4NDI0LCAweEY4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE0X19TRE1BX0RFQlVHX1BDXzgJSU9NVVhfUEFEKDB4NDI0LCAweEY4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE0X19FTUlfRU1JX0RFQlVHXzQzCUlPTVVYX1BBRCgweDQyNCwgMHhGOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNF9fVFBJVV9UUkFDRV8xMQkJSU9NVVhfUEFEKDB4NDI0LCAweEY4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE1X19JUFVfQ1NJMF9EXzE1CQlJT01VWF9QQUQoMHg0MjgsIDB4RkMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTVfX0dQSU82XzEJCUlPTVVYX1BBRCgweDQyOCwgMHhGQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNV9fVUFSVDVfUlhEX01VWAlJT01VWF9QQUQoMHg0MjgsIDB4RkMsIDIsIDB4ODk4LCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNV9fVVNCT0gzX1VTQkgzX0RBVEFfMwlJT01VWF9QQUQoMHg0MjgsIDB4RkMsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTVfX1NETUFfREVCVUdfUENfOQlJT01VWF9QQUQoMHg0MjgsIDB4RkMsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTVfX0VNSV9FTUlfREVCVUdfNDQJSU9NVVhfUEFEKDB4NDI4LCAweEZDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE1X19UUElVX1RSQUNFXzEyCQlJT01VWF9QQUQoMHg0MjgsIDB4RkMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTZfX0lQVV9DU0kwX0RfMTYJCUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTZfX0dQSU82XzIJCUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTZfX1VBUlQ0X1JUUwkJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgMiwgMHg4OEMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE2X19VU0JPSDNfVVNCSDNfREFUQV80CUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTZfX1NETUFfREVCVUdfUENfMTAJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNl9fRU1JX0VNSV9ERUJVR180NQlJT01VWF9QQUQoMHg0MkMsIDB4MTAwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE2X19UUElVX1RSQUNFXzEzCQlJT01VWF9QQUQoMHg0MkMsIDB4MTAwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE3X19JUFVfQ1NJMF9EXzE3CQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE3X19HUElPNl8zCQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE3X19VQVJUNF9DVFMJCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTdfX1VTQk9IM19VU0JIM19EQVRBXzUJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxN19fU0RNQV9ERUJVR19QQ18xMQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE3X19FTUlfRU1JX0RFQlVHXzQ2CUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTdfX1RQSVVfVFJBQ0VfMTQJCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMThfX0lQVV9DU0kwX0RfMTgJCUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMThfX0dQSU82XzQJCUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMThfX1VBUlQ1X1JUUwkJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgMiwgMHg4OTQsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE4X19VU0JPSDNfVVNCSDNfREFUQV82CUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMThfX1NETUFfREVCVUdfUENfMTIJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOF9fRU1JX0VNSV9ERUJVR180NwlJT01VWF9QQUQoMHg0MzQsIDB4MTA4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE4X19UUElVX1RSQUNFXzE1CQlJT01VWF9QQUQoMHg0MzQsIDB4MTA4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE5X19JUFVfQ1NJMF9EXzE5CQlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE5X19HUElPNl81CQlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE5X19VQVJUNV9DVFMJCUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTlfX1VTQk9IM19VU0JIM19EQVRBXzcJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOV9fU0RNQV9ERUJVR19QQ18xMwlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE5X19FTUlfRU1JX0RFQlVHXzQ4CUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTlfX1VTQlBIWTJfQklTVE9LCUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjVfX0VNSV9XRUlNX0FfMjUJCUlPTVVYX1BBRCgweDQ1OCwgMHgxMTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjVfX0dQSU81XzIJCQlJT01VWF9QQUQoMHg0NTgsIDB4MTEwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTI1X19FQ1NQSTJfUkRZCQlJT01VWF9QQUQoMHg0NTgsIDB4MTEwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTI1X19JUFVfREkxX1BJTjEyCQlJT01VWF9QQUQoMHg0NTgsIDB4MTEwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTI1X19DU1BJX1NTMQkJCUlPTVVYX1BBRCgweDQ1OCwgMHgxMTAsIDQsIDB4NzkwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyNV9fSVBVX0RJMF9EMV9DUwkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyNV9fVVNCUEhZMV9CSVNUT0sJCUlPTVVYX1BBRCgweDQ1OCwgMHgxMTAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjJfX0VNSV9XRUlNX0VCXzIJCUlPTVVYX1BBRCgweDQ1QywgMHgxMTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjJfX0dQSU8yXzMwCQkJSU9NVVhfUEFEKDB4NDVDLCAweDExNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMl9fQ0NNX0RJMV9FWFRfQ0xLCQlJT01VWF9QQUQoMHg0NUMsIDB4MTE0LCAyLCAweDc2QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjJfX0lQVV9TRVJfRElTUDFfQ1MJCUlPTVVYX1BBRCgweDQ1QywgMHgxMTQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjJfX0VDU1BJMV9TUzAJCUlPTVVYX1BBRCgweDQ1QywgMHgxMTQsIDQsIDB4N0E4LCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMl9fSTJDMl9TQ0wJCQlJT01VWF9QQUQoMHg0NUMsIDB4MTE0LCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODFDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxNl9fRU1JX1dFSU1fRF8xNgkJSU9NVVhfUEFEKDB4NDYwLCAweDExOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxNl9fR1BJTzNfMTYJCQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE2X19JUFVfREkwX1BJTjUJCUlPTVVYX1BBRCgweDQ2MCwgMHgxMTgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTZfX0lQVV9ESVNQQjFfU0VSX0NMSwlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE2X19FQ1NQSTFfU0NMSwkJSU9NVVhfUEFEKDB4NDYwLCAweDExOCwgNCwgMHg3OUMsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE2X19JMkMyX1NEQQkJCUlPTVVYX1BBRCgweDQ2MCwgMHgxMTgsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MjAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE3X19FTUlfV0VJTV9EXzE3CQlJT01VWF9QQUQoMHg0NjQsIDB4MTFDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE3X19HUElPM18xNwkJCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTdfX0lQVV9ESTBfUElONgkJSU9NVVhfUEFEKDB4NDY0LCAweDExQywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxN19fSVBVX0RJU1BCMV9TRVJfRElOCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDMsIDB4ODMwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxN19fRUNTUEkxX01JU08JCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDQsIDB4N0EwLCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxN19fSTJDM19TQ0wJCQlJT01VWF9QQUQoMHg0NjQsIDB4MTFDLCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOF9fRU1JX1dFSU1fRF8xOAkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOF9fR1BJTzNfMTgJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE4X19JUFVfREkwX1BJTjcJCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMThfX0lQVV9ESVNQQjFfU0VSX0RJTwlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCAzLCAweDgzMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMThfX0VDU1BJMV9NT1NJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCA0LCAweDdBNCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMThfX0kyQzNfU0RBCQkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyOCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMThfX0lQVV9ESTFfRDBfQ1MJCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTlfX0VNSV9XRUlNX0RfMTkJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTlfX0dQSU8zXzE5CQkJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOV9fSVBVX0RJMF9QSU44CQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19JUFVfRElTUEIxX1NFUl9SUwlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19FQ1NQSTFfU1MxCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCA0LCAweDdBQywgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTlfX0VQSVQxX0VQSVRPCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19VQVJUMV9DVFMJCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19VU0JPSDNfVVNCSDJfT0MJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDcsIDB4OEE0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMF9fRU1JX1dFSU1fRF8yMAkJSU9NVVhfUEFEKDB4NDcwLCAweDEyOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMF9fR1BJTzNfMjAJCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIwX19JUFVfREkwX1BJTjE2CQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIwX19JUFVfU0VSX0RJU1AwX0NTCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIwX19DU1BJX1NTMAkJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDQsIDB4NzhDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMF9fRVBJVDJfRVBJVE8JCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjBfX1VBUlQxX1JUUwkJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDYsIDB4ODc0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMF9fVVNCT0gzX1VTQkgyX1BXUglJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIxX19FTUlfV0VJTV9EXzIxCQlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIxX19HUElPM18yMQkJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX0lQVV9ESTBfUElOMTcJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX0lQVV9ESVNQQjBfU0VSX0NMSwlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIxX19DU1BJX1NDTEsJCQlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCA0LCAweDc4MCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX0kyQzFfU0NMCQkJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgxNCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX1VTQk9IM19VU0JPVEdfT0MJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgNiwgMHg4OUMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIyX19FTUlfV0VJTV9EXzIyCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIyX19HUElPM18yMgkJCUlPTVVYX1BBRCgweDQ3OCwgMHgxMzAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjJfX0lQVV9ESTBfUElOMQkJSU9NVVhfUEFEKDB4NDc4LCAweDEzMCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMl9fSVBVX0RJU1BCMF9TRVJfRElOCUlPTVVYX1BBRCgweDQ3OCwgMHgxMzAsIDMsIDB4ODJDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMl9fQ1NQSV9NSVNPCQkJSU9NVVhfUEFEKDB4NDc4LCAweDEzMCwgNCwgMHg3ODQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIyX19VU0JPSDNfVVNCT1RHX1BXUglJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIzX19FTUlfV0VJTV9EXzIzCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIzX19HUElPM18yMwkJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX1VBUlQzX0NUUwkJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX1VBUlQxX0RDRAkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyM19fSVBVX0RJMF9EMF9DUwkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyM19fSVBVX0RJMV9QSU4yCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIzX19JUFVfQ1NJMV9EQVRBX0VOCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCA2LCAweDgzNCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTFfUElOMTQJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjNfX0VNSV9XRUlNX0VCXzMJCUlPTVVYX1BBRCgweDQ4MCwgMHgxMzgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjNfX0dQSU8yXzMxCQkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCM19fVUFSVDNfUlRTCQkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgMiwgMHg4ODQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIzX19VQVJUMV9SSQkJCUlPTVVYX1BBRCgweDQ4MCwgMHgxMzgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjNfX0lQVV9ESTFfUElOMwkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCM19fSVBVX0NTSTFfSFNZTkMJCUlPTVVYX1BBRCgweDQ4MCwgMHgxMzgsIDYsIDB4ODM4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCM19fSVBVX0RJMV9QSU4xNgkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNF9fRU1JX1dFSU1fRF8yNAkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNF9fR1BJTzNfMjQJCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19VQVJUM19UWERfTVVYCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19FQ1NQSTFfU1MyCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCAzLCAweDdCMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjRfX0NTUElfU1MyCQkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgNCwgMHg3OTQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19BVURNVVhfQVVENV9SWEZTCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDUsIDB4NzU0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNF9fRUNTUEkyX1NTMgkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNF9fVUFSVDFfRFRSCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI1X19FTUlfV0VJTV9EXzI1CQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI1X19HUElPM18yNQkJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjVfX1VBUlQzX1JYRF9NVVgJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDIsIDB4ODg4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNV9fRUNTUEkxX1NTMwkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgMywgMHg3QjQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI1X19DU1BJX1NTMwkJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDQsIDB4Nzk4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNV9fQVVETVVYX0FVRDVfUlhDCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCA1LCAweDc1MCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjVfX0VDU1BJMl9TUzMJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjVfX1VBUlQxX0RTUgkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNl9fRU1JX1dFSU1fRF8yNgkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNl9fR1BJTzNfMjYJCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19VQVJUMl9UWERfTVVYCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19GSVJJX1JYRAkJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDMsIDB4ODBDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNl9fSVBVX0NTSTBfRF8xCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19JUFVfREkxX1BJTjExCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19JUFVfU0lTR18yCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19JUFVfRElTUDFfREFUXzIyCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI3X19FTUlfV0VJTV9EXzI3CQlJT01VWF9QQUQoMHg0OTAsIDB4MTQ4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI3X19HUElPM18yNwkJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjdfX1VBUlQyX1JYRF9NVVgJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDIsIDB4ODgwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyN19fRklSSV9UWEQJCQlJT01VWF9QQUQoMHg0OTAsIDB4MTQ4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI3X19JUFVfQ1NJMF9EXzAJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjdfX0lQVV9ESTFfUElOMTMJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjdfX0lQVV9TSVNHXzMJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjdfX0lQVV9ESVNQMV9EQVRfMjMJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjhfX0VNSV9XRUlNX0RfMjgJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjhfX0dQSU8zXzI4CQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOF9fVUFSVDJfQ1RTCQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOF9fSVBVX0RJU1BCMF9TRVJfRElPCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDMsIDB4ODJDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOF9fQ1NQSV9NT1NJCQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgNCwgMHg3ODgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19JMkMxX1NEQQkJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MTgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19JUFVfRVhUX1RSSUcJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjhfX0lQVV9ESTBfUElOMTMJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjlfX0VNSV9XRUlNX0RfMjkJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjlfX0dQSU8zXzI5CQkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOV9fVUFSVDJfUlRTCQkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgMiwgMHg4N0MsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI5X19JUFVfRElTUEIwX1NFUl9SUwlJT01VWF9QQUQoMHg0OTgsIDB4MTUwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI5X19DU1BJX1NTMAkJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDQsIDB4NzhDLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMV9QSU4xNQkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOV9fSVBVX0NTSTFfVlNZTkMJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDYsIDB4ODNDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMF9QSU4xNAkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMF9fRU1JX1dFSU1fRF8zMAkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMF9fR1BJTzNfMzAJCQlJT01VWF9QQUQoMHg0OUMsIDB4MTU0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMwX19VQVJUM19DVFMJCQlJT01VWF9QQUQoMHg0OUMsIDB4MTU0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMwX19JUFVfQ1NJMF9EXzMJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzBfX0lQVV9ESTBfUElOMTEJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzBfX0lQVV9ESVNQMV9EQVRfMjEJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzBfX1VTQk9IM19VU0JIMV9PQwkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgNiwgMHg4QTAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMwX19VU0JPSDNfVVNCSDJfT0MJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDcsIDB4OEE0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMV9fRU1JX1dFSU1fRF8zMQkJSU9NVVhfUEFEKDB4NEEwLCAweDE1OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMV9fR1BJTzNfMzEJCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMxX19VQVJUM19SVFMJCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCAyLCAweDg4NCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzFfX0lQVV9DU0kwX0RfMgkJSU9NVVhfUEFEKDB4NEEwLCAweDE1OCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMV9fSVBVX0RJMF9QSU4xMgkJSU9NVVhfUEFEKDB4NEEwLCAweDE1OCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMV9fSVBVX0RJU1AxX0RBVF8yMAkJSU9NVVhfUEFEKDB4NEEwLCAweDE1OCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMV9fVVNCT0gzX1VTQkgxX1BXUglJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMxX19VU0JPSDNfVVNCSDJfUFdSCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjRfX0VNSV9XRUlNX0FfMjQJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjRfX0dQSU81XzQJCQlJT01VWF9QQUQoMHg0QTgsIDB4MTVDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTI0X19JUFVfRElTUDFfREFUXzE5CQlJT01VWF9QQUQoMHg0QTgsIDB4MTVDLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTI0X19JUFVfQ1NJMV9EXzE5CQlJT01VWF9QQUQoMHg0QTgsIDB4MTVDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTI0X19JUFVfU0lTR18yCQlJT01VWF9QQUQoMHg0QTgsIDB4MTVDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTI0X19VU0JQSFkyX0JWQUxJRAkJSU9NVVhfUEFEKDB4NEE4LCAweDE1QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyM19fRU1JX1dFSU1fQV8yMwkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyM19fR1BJTzZfNgkJCUlPTVVYX1BBRCgweDRBQywgMHgxNjAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjNfX0lQVV9ESVNQMV9EQVRfMTgJCUlPTVVYX1BBRCgweDRBQywgMHgxNjAsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjNfX0lQVV9DU0kxX0RfMTgJCUlPTVVYX1BBRCgweDRBQywgMHgxNjAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjNfX0lQVV9TSVNHXzMJCUlPTVVYX1BBRCgweDRBQywgMHgxNjAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjNfX1VTQlBIWTJfRU5EU0VTU0lPTglJT01VWF9QQUQoMHg0QUMsIDB4MTYwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIyX19FTUlfV0VJTV9BXzIyCQlJT01VWF9QQUQoMHg0QjAsIDB4MTY0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIyX19HUElPMl8xNgkJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjJfX0lQVV9ESVNQMV9EQVRfMTcJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjJfX0lQVV9DU0kxX0RfMTcJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjJfX1NSQ19CVF9DRkcxXzcJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjFfX0VNSV9XRUlNX0FfMjEJCUlPTVVYX1BBRCgweDRCNCwgMHgxNjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjFfX0dQSU8yXzE3CQkJSU9NVVhfUEFEKDB4NEI0LCAweDE2OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMV9fSVBVX0RJU1AxX0RBVF8xNgkJSU9NVVhfUEFEKDB4NEI0LCAweDE2OCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMV9fSVBVX0NTSTFfRF8xNgkJSU9NVVhfUEFEKDB4NEI0LCAweDE2OCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMV9fU1JDX0JUX0NGRzFfNgkJSU9NVVhfUEFEKDB4NEI0LCAweDE2OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMF9fRU1JX1dFSU1fQV8yMAkJSU9NVVhfUEFEKDB4NEI4LCAweDE2QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMF9fR1BJTzJfMTgJCQlJT01VWF9QQUQoMHg0QjgsIDB4MTZDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIwX19JUFVfRElTUDFfREFUXzE1CQlJT01VWF9QQUQoMHg0QjgsIDB4MTZDLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIwX19JUFVfQ1NJMV9EXzE1CQlJT01VWF9QQUQoMHg0QjgsIDB4MTZDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIwX19TUkNfQlRfQ0ZHMV81CQlJT01VWF9QQUQoMHg0QjgsIDB4MTZDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE5X19FTUlfV0VJTV9BXzE5CQlJT01VWF9QQUQoMHg0QkMsIDB4MTcwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE5X19HUElPMl8xOQkJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTlfX0lQVV9ESVNQMV9EQVRfMTQJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTlfX0lQVV9DU0kxX0RfMTQJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTlfX1NSQ19CVF9DRkcxXzQJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMThfX0VNSV9XRUlNX0FfMTgJCUlPTVVYX1BBRCgweDRDMCwgMHgxNzQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMThfX0dQSU8yXzIwCQkJSU9NVVhfUEFEKDB4NEMwLCAweDE3NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExOF9fSVBVX0RJU1AxX0RBVF8xMwkJSU9NVVhfUEFEKDB4NEMwLCAweDE3NCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExOF9fSVBVX0NTSTFfRF8xMwkJSU9NVVhfUEFEKDB4NEMwLCAweDE3NCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExOF9fU1JDX0JUX0NGRzFfMwkJSU9NVVhfUEFEKDB4NEMwLCAweDE3NCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExN19fRU1JX1dFSU1fQV8xNwkJSU9NVVhfUEFEKDB4NEM0LCAweDE3OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExN19fR1BJTzJfMjEJCQlJT01VWF9QQUQoMHg0QzQsIDB4MTc4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE3X19JUFVfRElTUDFfREFUXzEyCQlJT01VWF9QQUQoMHg0QzQsIDB4MTc4LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE3X19JUFVfQ1NJMV9EXzEyCQlJT01VWF9QQUQoMHg0QzQsIDB4MTc4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE3X19TUkNfQlRfQ0ZHMV8yCQlJT01VWF9QQUQoMHg0QzQsIDB4MTc4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE2X19FTUlfV0VJTV9BXzE2CQlJT01VWF9QQUQoMHg0QzgsIDB4MTdDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE2X19HUElPMl8yMgkJCUlPTVVYX1BBRCgweDRDOCwgMHgxN0MsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTZfX0lQVV9ESTFfRElTUF9DTEsJCUlPTVVYX1BBRCgweDRDOCwgMHgxN0MsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTZfX0lQVV9DU0kxX1BJWENMSwkJSU9NVVhfUEFEKDB4NEM4LCAweDE3QywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExNl9fU1JDX0JUX0NGRzFfMQkJSU9NVVhfUEFEKDB4NEM4LCAweDE3QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0NTMF9fRU1JX1dFSU1fQ1NfMAkJSU9NVVhfUEFEKDB4NENDLCAweDE4MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0NTMF9fR1BJTzJfMjMJCQlJT01VWF9QQUQoMHg0Q0MsIDB4MTgwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQ1MwX19FQ1NQSTJfU0NMSwkJSU9NVVhfUEFEKDB4NENDLCAweDE4MCwgMiwgMHg3QjgsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQ1MwX19JUFVfREkxX1BJTjUJCUlPTVVYX1BBRCgweDRDQywgMHgxODAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9DUzFfX0VNSV9XRUlNX0NTXzEJCUlPTVVYX1BBRCgweDREMCwgMHgxODQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9DUzFfX0dQSU8yXzI0CQkJSU9NVVhfUEFEKDB4NEQwLCAweDE4NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0NTMV9fRUNTUEkyX01PU0kJCUlPTVVYX1BBRCgweDREMCwgMHgxODQsIDIsIDB4N0MwLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0NTMV9fSVBVX0RJMV9QSU42CQlJT01VWF9QQUQoMHg0RDAsIDB4MTg0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fT0VfX0VNSV9XRUlNX09FCQlJT01VWF9QQUQoMHg0RDQsIDB4MTg4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fT0VfX0dQSU8yXzI1CQkJSU9NVVhfUEFEKDB4NEQ0LCAweDE4OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX09FX19FQ1NQSTJfTUlTTwkJSU9NVVhfUEFEKDB4NEQ0LCAweDE4OCwgMiwgMHg3QkMsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fT0VfX0lQVV9ESTFfUElONwkJSU9NVVhfUEFEKDB4NEQ0LCAweDE4OCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX09FX19VU0JQSFkyX0lERElHCQlJT01VWF9QQUQoMHg0RDQsIDB4MTg4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fUldfX0VNSV9XRUlNX1JXCQlJT01VWF9QQUQoMHg0RDgsIDB4MThDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fUldfX0dQSU8yXzI2CQkJSU9NVVhfUEFEKDB4NEQ4LCAweDE4QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX1JXX19FQ1NQSTJfU1MwCQkJSU9NVVhfUEFEKDB4NEQ4LCAweDE4QywgMiwgMHg3QzQsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fUldfX0lQVV9ESTFfUElOOAkJSU9NVVhfUEFEKDB4NEQ4LCAweDE4QywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX1JXX19VU0JQSFkyX0hPU1RESVNDT05ORUNUCUlPTVVYX1BBRCgweDREOCwgMHgxOEMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9MQkFfX0VNSV9XRUlNX0xCQQkJSU9NVVhfUEFEKDB4NERDLCAweDE5MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0xCQV9fR1BJTzJfMjcJCQlJT01VWF9QQUQoMHg0REMsIDB4MTkwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fTEJBX19FQ1NQSTJfU1MxCQlJT01VWF9QQUQoMHg0REMsIDB4MTkwLCAyLCAweDdDOCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9MQkFfX0lQVV9ESTFfUElOMTcJCUlPTVVYX1BBRCgweDREQywgMHgxOTAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9MQkFfX1NSQ19CVF9DRkcxXzAJCUlPTVVYX1BBRCgweDREQywgMHgxOTAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjBfX0VNSV9XRUlNX0VCXzAJCUlPTVVYX1BBRCgweDRFNCwgMHgxOTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjBfX0dQSU8yXzI4CQkJSU9NVVhfUEFEKDB4NEU0LCAweDE5NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMF9fSVBVX0RJU1AxX0RBVF8xMQkJSU9NVVhfUEFEKDB4NEU0LCAweDE5NCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMF9fSVBVX0NTSTFfRF8xMQkJSU9NVVhfUEFEKDB4NEU0LCAweDE5NCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMF9fR1BDX1BNSUNfUkRZCQlJT01VWF9QQUQoMHg0RTQsIDB4MTk0LCA1LCAweDgxMCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjBfX1NSQ19CVF9DRkcyXzcJCUlPTVVYX1BBRCgweDRFNCwgMHgxOTQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjFfX0VNSV9XRUlNX0VCXzEJCUlPTVVYX1BBRCgweDRFOCwgMHgxOTgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjFfX0dQSU8yXzI5CQkJSU9NVVhfUEFEKDB4NEU4LCAweDE5OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMV9fSVBVX0RJU1AxX0RBVF8xMAkJSU9NVVhfUEFEKDB4NEU4LCAweDE5OCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMV9fSVBVX0NTSTFfRF8xMAkJSU9NVVhfUEFEKDB4NEU4LCAweDE5OCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMV9fU1JDX0JUX0NGRzJfNgkJSU9NVVhfUEFEKDB4NEU4LCAweDE5OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMF9fRU1JX05BTkRfV0VJTV9EQV8wCUlPTVVYX1BBRCgweDRFQywgMHgxOUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTBfX0dQSU8zXzAJCQlJT01VWF9QQUQoMHg0RUMsIDB4MTlDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREEwX19JUFVfRElTUDFfREFUXzkJCUlPTVVYX1BBRCgweDRFQywgMHgxOUMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTBfX0lQVV9DU0kxX0RfOQkJSU9NVVhfUEFEKDB4NEVDLCAweDE5QywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMF9fU1JDX0JUX0NGRzJfNQkJSU9NVVhfUEFEKDB4NEVDLCAweDE5QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMV9fRU1JX05BTkRfV0VJTV9EQV8xCUlPTVVYX1BBRCgweDRGMCwgMHgxQTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTFfX0dQSU8zXzEJCQlJT01VWF9QQUQoMHg0RjAsIDB4MUEwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExX19JUFVfRElTUDFfREFUXzgJCUlPTVVYX1BBRCgweDRGMCwgMHgxQTAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTFfX0lQVV9DU0kxX0RfOAkJSU9NVVhfUEFEKDB4NEYwLCAweDFBMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMV9fU1JDX0JUX0NGRzJfNAkJSU9NVVhfUEFEKDB4NEYwLCAweDFBMCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMl9fRU1JX05BTkRfV0VJTV9EQV8yCUlPTVVYX1BBRCgweDRGNCwgMHgxQTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTJfX0dQSU8zXzIJCQlJT01VWF9QQUQoMHg0RjQsIDB4MUE0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREEyX19JUFVfRElTUDFfREFUXzcJCUlPTVVYX1BBRCgweDRGNCwgMHgxQTQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTJfX0lQVV9DU0kxX0RfNwkJSU9NVVhfUEFEKDB4NEY0LCAweDFBNCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMl9fU1JDX0JUX0NGRzJfMwkJSU9NVVhfUEFEKDB4NEY0LCAweDFBNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBM19fRU1JX05BTkRfV0VJTV9EQV8zCUlPTVVYX1BBRCgweDRGOCwgMHgxQTgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTNfX0dQSU8zXzMJCQlJT01VWF9QQUQoMHg0RjgsIDB4MUE4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREEzX19JUFVfRElTUDFfREFUXzYJCUlPTVVYX1BBRCgweDRGOCwgMHgxQTgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTNfX0lQVV9DU0kxX0RfNgkJSU9NVVhfUEFEKDB4NEY4LCAweDFBOCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBM19fU1JDX0JUX0NGRzJfMgkJSU9NVVhfUEFEKDB4NEY4LCAweDFBOCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNF9fRU1JX05BTkRfV0VJTV9EQV80CUlPTVVYX1BBRCgweDRGQywgMHgxQUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTRfX0dQSU8zXzQJCQlJT01VWF9QQUQoMHg0RkMsIDB4MUFDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE0X19JUFVfRElTUDFfREFUXzUJCUlPTVVYX1BBRCgweDRGQywgMHgxQUMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTRfX0lQVV9DU0kxX0RfNQkJSU9NVVhfUEFEKDB4NEZDLCAweDFBQywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNF9fU1JDX0JUX0NGRzNfNwkJSU9NVVhfUEFEKDB4NEZDLCAweDFBQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNV9fRU1JX05BTkRfV0VJTV9EQV81CUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTVfX0dQSU8zXzUJCQlJT01VWF9QQUQoMHg1MDAsIDB4MUIwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE1X19JUFVfRElTUDFfREFUXzQJCUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTVfX0lQVV9DU0kxX0RfNAkJSU9NVVhfUEFEKDB4NTAwLCAweDFCMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNV9fU1JDX0JUX0NGRzNfNgkJSU9NVVhfUEFEKDB4NTAwLCAweDFCMCwgNyB8IElPTVVYX0NPTkZJR19TSU9OLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE2X19FTUlfTkFORF9XRUlNX0RBXzYJSU9NVVhfUEFEKDB4NTA0LCAweDFCNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNl9fR1BJTzNfNgkJCUlPTVVYX1BBRCgweDUwNCwgMHgxQjQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTZfX0lQVV9ESVNQMV9EQVRfMwkJSU9NVVhfUEFEKDB4NTA0LCAweDFCNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNl9fSVBVX0NTSTFfRF8zCQlJT01VWF9QQUQoMHg1MDQsIDB4MUI0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE2X19TUkNfQlRfQ0ZHM181CQlJT01VWF9QQUQoMHg1MDQsIDB4MUI0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE3X19FTUlfTkFORF9XRUlNX0RBXzcJSU9NVVhfUEFEKDB4NTA4LCAweDFCOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBN19fR1BJTzNfNwkJCUlPTVVYX1BBRCgweDUwOCwgMHgxQjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTdfX0lQVV9ESVNQMV9EQVRfMgkJSU9NVVhfUEFEKDB4NTA4LCAweDFCOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBN19fSVBVX0NTSTFfRF8yCQlJT01VWF9QQUQoMHg1MDgsIDB4MUI4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE3X19TUkNfQlRfQ0ZHM180CQlJT01VWF9QQUQoMHg1MDgsIDB4MUI4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE4X19FTUlfTkFORF9XRUlNX0RBXzgJSU9NVVhfUEFEKDB4NTBDLCAweDFCQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBOF9fR1BJTzNfOAkJCUlPTVVYX1BBRCgweDUwQywgMHgxQkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQThfX0lQVV9ESVNQMV9EQVRfMQkJSU9NVVhfUEFEKDB4NTBDLCAweDFCQywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBOF9fSVBVX0NTSTFfRF8xCQlJT01VWF9QQUQoMHg1MEMsIDB4MUJDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE4X19TUkNfQlRfQ0ZHM18zCQlJT01VWF9QQUQoMHg1MEMsIDB4MUJDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE5X19FTUlfTkFORF9XRUlNX0RBXzkJSU9NVVhfUEFEKDB4NTEwLCAweDFDMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBOV9fR1BJTzNfOQkJCUlPTVVYX1BBRCgweDUxMCwgMHgxQzAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTlfX0lQVV9ESVNQMV9EQVRfMAkJSU9NVVhfUEFEKDB4NTEwLCAweDFDMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBOV9fSVBVX0NTSTFfRF8wCQlJT01VWF9QQUQoMHg1MTAsIDB4MUMwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE5X19TUkNfQlRfQ0ZHM18yCQlJT01VWF9QQUQoMHg1MTAsIDB4MUMwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExMF9fRU1JX05BTkRfV0VJTV9EQV8xMAlJT01VWF9QQUQoMHg1MTQsIDB4MUM0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExMF9fR1BJTzNfMTAJCQlJT01VWF9QQUQoMHg1MTQsIDB4MUM0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExMF9fSVBVX0RJMV9QSU4xNQkJSU9NVVhfUEFEKDB4NTE0LCAweDFDNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTBfX0lQVV9DU0kxX0RBVEFfRU4JSU9NVVhfUEFEKDB4NTE0LCAweDFDNCwgNCwgMHg4MzQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExMF9fU1JDX0JUX0NGRzNfMQkJSU9NVVhfUEFEKDB4NTE0LCAweDFDNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTFfX0VNSV9OQU5EX1dFSU1fREFfMTEJSU9NVVhfUEFEKDB4NTE4LCAweDFDOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTFfX0dQSU8zXzExCQkJSU9NVVhfUEFEKDB4NTE4LCAweDFDOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTFfX0lQVV9ESTFfUElOMgkJSU9NVVhfUEFEKDB4NTE4LCAweDFDOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTFfX0lQVV9DU0kxX0hTWU5DCQlJT01VWF9QQUQoMHg1MTgsIDB4MUM4LCA0LCAweDgzOCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEyX19FTUlfTkFORF9XRUlNX0RBXzEyCUlPTVVYX1BBRCgweDUxQywgMHgxQ0MsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEyX19HUElPM18xMgkJCUlPTVVYX1BBRCgweDUxQywgMHgxQ0MsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEyX19JUFVfREkxX1BJTjMJCUlPTVVYX1BBRCgweDUxQywgMHgxQ0MsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEyX19JUFVfQ1NJMV9WU1lOQwkJSU9NVVhfUEFEKDB4NTFDLCAweDFDQywgNCwgMHg4M0MsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExM19fRU1JX05BTkRfV0VJTV9EQV8xMwlJT01VWF9QQUQoMHg1MjAsIDB4MUQwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExM19fR1BJTzNfMTMJCQlJT01VWF9QQUQoMHg1MjAsIDB4MUQwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExM19fSVBVX0RJMV9EMF9DUwkJSU9NVVhfUEFEKDB4NTIwLCAweDFEMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTNfX0NDTV9ESTFfRVhUX0NMSwkJSU9NVVhfUEFEKDB4NTIwLCAweDFEMCwgNCwgMHg3NkMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExNF9fRU1JX05BTkRfV0VJTV9EQV8xNAlJT01VWF9QQUQoMHg1MjQsIDB4MUQ0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExNF9fR1BJTzNfMTQJCQlJT01VWF9QQUQoMHg1MjQsIDB4MUQ0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExNF9fSVBVX0RJMV9EMV9DUwkJSU9NVVhfUEFEKDB4NTI0LCAweDFENCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTRfX0NDTV9ESTBfRVhUX0NMSwkJSU9NVVhfUEFEKDB4NTI0LCAweDFENCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTVfX0VNSV9OQU5EX1dFSU1fREFfMTUJSU9NVVhfUEFEKDB4NTI4LCAweDFEOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTVfX0dQSU8zXzE1CQkJSU9NVVhfUEFEKDB4NTI4LCAweDFEOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTVfX0lQVV9ESTFfUElOMQkJSU9NVVhfUEFEKDB4NTI4LCAweDFEOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTVfX0lQVV9ESTFfUElONAkJSU9NVVhfUEFEKDB4NTI4LCAweDFEOCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfV0VfQl9fRU1JX05BTkRGX1dFX0IJSU9NVVhfUEFEKDB4NTJDLCAweDFEQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfV0VfQl9fR1BJTzZfMTIJCUlPTVVYX1BBRCgweDUyQywgMHgxREMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX1JFX0JfX0VNSV9OQU5ERl9SRV9CCUlPTVVYX1BBRCgweDUzMCwgMHgxRTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX1JFX0JfX0dQSU82XzEzCQlJT01VWF9QQUQoMHg1MzAsIDB4MUUwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fV0FJVF9fRU1JX1dFSU1fV0FJVAkJSU9NVVhfUEFEKDB4NTM0LCAweDFFNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX1dBSVRfX0dQSU81XzAJCQlJT01VWF9QQUQoMHg1MzQsIDB4MUU0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fV0FJVF9fRU1JX1dFSU1fRFRBQ0tfQglJT01VWF9QQUQoMHg1MzQsIDB4MUU0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMV9UWDNfUF9fR1BJTzZfMjIJCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MUVDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMV9UWDNfUF9fTERCX0xWRFMxX1RYMwlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDFFQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzFfVFgyX1BfX0dQSU82XzI0CQlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDFGMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzFfVFgyX1BfX0xEQl9MVkRTMV9UWDIJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgxRjAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMxX0NMS19QX19HUElPNl8yNgkJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgxRjQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMxX0NMS19QX19MREJfTFZEUzFfQ0xLCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MUY0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMV9UWDFfUF9fR1BJTzZfMjgJCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MUY4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMV9UWDFfUF9fTERCX0xWRFMxX1RYMQlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDFGOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzFfVFgwX1BfX0dQSU82XzMwCQlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDFGQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzFfVFgwX1BfX0xEQl9MVkRTMV9UWDAJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgxRkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMwX1RYM19QX19HUElPN18yMgkJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgyMDAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMwX1RYM19QX19MREJfTFZEUzBfVFgzCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MjAwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMF9DTEtfUF9fR1BJTzdfMjQJCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MjA0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMF9DTEtfUF9fTERCX0xWRFMwX0NMSwlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDIwNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzBfVFgyX1BfX0dQSU83XzI2CQlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDIwOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzBfVFgyX1BfX0xEQl9MVkRTMF9UWDIJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgyMDgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMwX1RYMV9QX19HUElPN18yOAkJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgyMEMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMwX1RYMV9QX19MREJfTFZEUzBfVFgxCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MjBDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMF9UWDBfUF9fR1BJTzdfMzAJCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MjEwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMF9UWDBfUF9fTERCX0xWRFMwX1RYMAlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDIxMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xMF9fR1BJTzRfMAkJCUlPTVVYX1BBRCgweDU0MCwgMHgyMTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTBfX09TQzMya18zMktfT1VUCQlJT01VWF9QQUQoMHg1NDAsIDB4MjE0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzExX19HUElPNF8xCQkJSU9NVVhfUEFEKDB4NTQ0LCAweDIxOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xMl9fR1BJTzRfMgkJCUlPTVVYX1BBRCgweDU0OCwgMHgyMUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTNfX0dQSU80XzMJCQlJT01VWF9QQUQoMHg1NEMsIDB4MjIwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE0X19HUElPNF80CQkJSU9NVVhfUEFEKDB4NTUwLCAweDIyNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ0xFX19FTUlfTkFOREZfQ0xFCQlJT01VWF9QQUQoMHg1QTAsIDB4MjI4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DTEVfX0dQSU82XzcJCQlJT01VWF9QQUQoMHg1QTAsIDB4MjI4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DTEVfX1VTQlBIWTFfVlNUQVRVU18wCUlPTVVYX1BBRCgweDVBMCwgMHgyMjgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0FMRV9fRU1JX05BTkRGX0FMRQkJSU9NVVhfUEFEKDB4NUE0LCAweDIyQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQUxFX19HUElPNl84CQlJT01VWF9QQUQoMHg1QTQsIDB4MjJDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9BTEVfX1VTQlBIWTFfVlNUQVRVU18xCUlPTVVYX1BBRCgweDVBNCwgMHgyMkMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX1dQX0JfX0VNSV9OQU5ERl9XUF9CCUlPTVVYX1BBRCgweDVBOCwgMHgyMzAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX1dQX0JfX0dQSU82XzkJCUlPTVVYX1BBRCgweDVBOCwgMHgyMzAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX1dQX0JfX1VTQlBIWTFfVlNUQVRVU18yCUlPTVVYX1BBRCgweDVBOCwgMHgyMzAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX1JCMF9fRU1JX05BTkRGX1JCXzAJSU9NVVhfUEFEKDB4NUFDLCAweDIzNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfUkIwX19HUElPNl8xMAkJSU9NVVhfUEFEKDB4NUFDLCAweDIzNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfUkIwX19VU0JQSFkxX1ZTVEFUVVNfMwlJT01VWF9QQUQoMHg1QUMsIDB4MjM0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzBfX0VNSV9OQU5ERl9DU18wCUlPTVVYX1BBRCgweDVCMCwgMHgyMzgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMF9fR1BJTzZfMTEJCUlPTVVYX1BBRCgweDVCMCwgMHgyMzgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMF9fVVNCUEhZMV9WU1RBVFVTXzQJSU9NVVhfUEFEKDB4NUIwLCAweDIzOCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MxX19FTUlfTkFOREZfQ1NfMQlJT01VWF9QQUQoMHg1QjQsIDB4MjNDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzFfX0dQSU82XzE0CQlJT01VWF9QQUQoMHg1QjQsIDB4MjNDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzFfX01MQl9NTEJDTEsJCUlPTVVYX1BBRCgweDVCNCwgMHgyM0MsIDYsIDB4ODU4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MxX19VU0JQSFkxX1ZTVEFUVVNfNQlJT01VWF9QQUQoMHg1QjQsIDB4MjNDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzJfX0VNSV9OQU5ERl9DU18yCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMl9fR1BJTzZfMTUJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMl9fSVBVX1NJU0dfMAkJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MyX19FU0FJMV9UWDAJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDMsIDB4N0U0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MyX19FTUlfV0VJTV9DUkUJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMl9fQ0NNX0NTSTBfTUNMSwkJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MyX19NTEJfTUxCU0lHCQlJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCA2LCAweDg2MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMl9fVVNCUEhZMV9WU1RBVFVTXzYJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MzX19FTUlfTkFOREZfQ1NfMwlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzNfX0dQSU82XzE2CQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzNfX0lQVV9TSVNHXzEJCUlPTVVYX1BBRCgweDVCQywgMHgyNDQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTM19fRVNBSTFfVFgxCQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCAzLCAweDdFOCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTM19fRU1JX1dFSU1fQV8yNgkJSU9NVVhfUEFEKDB4NUJDLCAweDI0NCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MzX19NTEJfTUxCREFUCQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCA2LCAweDg1QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTM19fVVNCUEhZMV9WU1RBVFVTXzcJSU9NVVhfUEFEKDB4NUJDLCAweDI0NCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01ESU9fX0ZFQ19NRElPCQlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCAwLCAweDgwNCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRElPX19HUElPMV8yMgkJCUlPTVVYX1BBRCgweDVDNCwgMHgyNDgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRElPX19FU0FJMV9TQ0tSCQlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCAyLCAweDdEQywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRElPX19GRUNfQ09MCQkJSU9NVVhfUEFEKDB4NUM0LCAweDI0OCwgMywgMHg4MDAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfTURJT19fUlRDX0NFX1JUQ19QUzIJCUlPTVVYX1BBRCgweDVDNCwgMHgyNDgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRElPX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMwlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfTURJT19fRU1JX0VNSV9ERUJVR180OQlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUkVGX0NMS19fRkVDX1RYX0NMSwkJSU9NVVhfUEFEKDB4NUM4LCAweDI0QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JFRl9DTEtfX0dQSU8xXzIzCQlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUkVGX0NMS19fRVNBSTFfRlNSCQlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCAyLCAweDdDQywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SRUZfQ0xLX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfNAlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUkVGX0NMS19fRU1JX0VNSV9ERUJVR181MAlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhfRVJfX0ZFQ19SWF9FUgkJSU9NVVhfUEFEKDB4NUNDLCAweDI1MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYX0VSX19HUElPMV8yNAkJSU9NVVhfUEFEKDB4NUNDLCAweDI1MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYX0VSX19FU0FJMV9IQ0tSCQlJT01VWF9QQUQoMHg1Q0MsIDB4MjUwLCAyLCAweDdENCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SWF9FUl9fRkVDX1JYX0NMSwkJSU9NVVhfUEFEKDB4NUNDLCAweDI1MCwgMywgMHg4MDgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhfRVJfX1JUQ19DRV9SVENfUFMzCQlJT01VWF9QQUQoMHg1Q0MsIDB4MjUwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfQ1JTX0RWX19GRUNfUlhfRFYJCUlPTVVYX1BBRCgweDVEMCwgMHgyNTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19DUlNfRFZfX0dQSU8xXzI1CQlJT01VWF9QQUQoMHg1RDAsIDB4MjU0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfQ1JTX0RWX19FU0FJMV9TQ0tUCQlJT01VWF9QQUQoMHg1RDAsIDB4MjU0LCAyLCAweDdFMCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SWEQxX19GRUNfUkRBVEFfMQkJSU9NVVhfUEFEKDB4NUQ0LCAweDI1OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYRDFfX0dQSU8xXzI2CQkJSU9NVVhfUEFEKDB4NUQ0LCAweDI1OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYRDFfX0VTQUkxX0ZTVAkJSU9NVVhfUEFEKDB4NUQ0LCAweDI1OCwgMiwgMHg3RDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhEMV9fTUxCX01MQlNJRwkJSU9NVVhfUEFEKDB4NUQ0LCAweDI1OCwgMywgMHg4NjAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhEMV9fUlRDX0NFX1JUQ19QUzEJCUlPTVVYX1BBRCgweDVENCwgMHgyNTgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SWEQwX19GRUNfUkRBVEFfMAkJSU9NVVhfUEFEKDB4NUQ4LCAweDI1QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYRDBfX0dQSU8xXzI3CQkJSU9NVVhfUEFEKDB4NUQ4LCAweDI1QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYRDBfX0VTQUkxX0hDS1QJCUlPTVVYX1BBRCgweDVEOCwgMHgyNUMsIDIsIDB4N0Q4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYRDBfX09TQzMya18zMktfT1VUCQlJT01VWF9QQUQoMHg1RDgsIDB4MjVDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhfRU5fX0ZFQ19UWF9FTgkJSU9NVVhfUEFEKDB4NURDLCAweDI2MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1RYX0VOX19HUElPMV8yOAkJSU9NVVhfUEFEKDB4NURDLCAweDI2MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1RYX0VOX19FU0FJMV9UWDNfUlgyCQlJT01VWF9QQUQoMHg1REMsIDB4MjYwLCAyLCAweDdGMCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19UWEQxX19GRUNfVERBVEFfMQkJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1RYRDFfX0dQSU8xXzI5CQkJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1RYRDFfX0VTQUkxX1RYMl9SWDMJCUlPTVVYX1BBRCgweDVFMCwgMHgyNjQsIDIsIDB4N0VDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1RYRDFfX01MQl9NTEJDTEsJCUlPTVVYX1BBRCgweDVFMCwgMHgyNjQsIDMsIDB4ODU4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1RYRDFfX1JUQ19DRV9SVENfUFJTQ19DTEsJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1RYRDBfX0ZFQ19UREFUQV8wCQlJT01VWF9QQUQoMHg1RTQsIDB4MjY4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhEMF9fR1BJTzFfMzAJCQlJT01VWF9QQUQoMHg1RTQsIDB4MjY4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhEMF9fRVNBSTFfVFg0X1JYMQkJSU9NVVhfUEFEKDB4NUU0LCAweDI2OCwgMiwgMHg3RjQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhEMF9fVVNCUEhZMl9EQVRBT1VUXzAJSU9NVVhfUEFEKDB4NUU0LCAweDI2OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01EQ19fRkVDX01EQwkJCUlPTVVYX1BBRCgweDVFOCwgMHgyNkMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRENfX0dQSU8xXzMxCQkJSU9NVVhfUEFEKDB4NUU4LCAweDI2QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01EQ19fRVNBSTFfVFg1X1JYMAkJSU9NVVhfUEFEKDB4NUU4LCAweDI2QywgMiwgMHg3RjgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfTURDX19NTEJfTUxCREFUCQlJT01VWF9QQUQoMHg1RTgsIDB4MjZDLCAzLCAweDg1QywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRENfX1JUQ19DRV9SVENfQUxBUk0xX1RSSUcJSU9NVVhfUEFEKDB4NUU4LCAweDI2QywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01EQ19fVVNCUEhZMl9EQVRBT1VUXzEJSU9NVVhfUEFEKDB4NUU4LCAweDI2QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ESU9XX19QQVRBX0RJT1cJCUlPTVVYX1BBRCgweDVGMCwgMHgyNzAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRElPV19fR1BJTzZfMTcJCUlPTVVYX1BBRCgweDVGMCwgMHgyNzAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRElPV19fVUFSVDFfVFhEX01VWAlJT01VWF9QQUQoMHg1RjAsIDB4MjcwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RJT1dfX1VTQlBIWTJfREFUQU9VVF8yCUlPTVVYX1BBRCgweDVGMCwgMHgyNzAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRE1BQ0tfX1BBVEFfRE1BQ0sJCUlPTVVYX1BBRCgweDVGNCwgMHgyNzQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRE1BQ0tfX0dQSU82XzE4CQlJT01VWF9QQUQoMHg1RjQsIDB4Mjc0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQUNLX19VQVJUMV9SWERfTVVYCUlPTVVYX1BBRCgweDVGNCwgMHgyNzQsIDMsIDB4ODc4LCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ETUFDS19fVVNCUEhZMl9EQVRBT1VUXzMJSU9NVVhfUEFEKDB4NUY0LCAweDI3NCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ETUFSUV9fUEFUQV9ETUFSUQkJSU9NVVhfUEFEKDB4NUY4LCAweDI3OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ETUFSUV9fR1BJTzdfMAkJSU9NVVhfUEFEKDB4NUY4LCAweDI3OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ETUFSUV9fVUFSVDJfVFhEX01VWAlJT01VWF9QQUQoMHg1RjgsIDB4Mjc4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQVJRX19DQ01fQ0NNX09VVF8wCUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRE1BUlFfX1VTQlBIWTJfREFUQU9VVF80CUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19QQVRBX0JVRkZFUl9FTglJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fR1BJTzdfMQkJSU9NVVhfUEFEKDB4NUZDLCAweDI3QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX1VBUlQyX1JYRF9NVVgJSU9NVVhfUEFEKDB4NUZDLCAweDI3QywgMywgMHg4ODAsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fQ0NNX0NDTV9PVVRfMQlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fVVNCUEhZMl9EQVRBT1VUXzUJSU9NVVhfUEFEKDB4NUZDLCAweDI3QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9JTlRSUV9fUEFUQV9JTlRSUQkJSU9NVVhfUEFEKDB4NjAwLCAweDI4MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9JTlRSUV9fR1BJTzdfMgkJSU9NVVhfUEFEKDB4NjAwLCAweDI4MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9JTlRSUV9fVUFSVDJfQ1RTCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19DQU4xX1RYQ0FOCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19DQ01fQ0NNX09VVF8yCUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU5UUlFfX1VTQlBIWTJfREFUQU9VVF82CUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRElPUl9fUEFUQV9ESU9SCQlJT01VWF9QQUQoMHg2MDQsIDB4Mjg0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RJT1JfX0dQSU83XzMJCQlJT01VWF9QQUQoMHg2MDQsIDB4Mjg0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RJT1JfX1VBUlQyX1JUUwkJSU9NVVhfUEFEKDB4NjA0LCAweDI4NCwgMywgMHg4N0MsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RJT1JfX0NBTjFfUlhDQU4JCUlPTVVYX1BBRCgweDYwNCwgMHgyODQsIDQsIDB4NzYwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ESU9SX19VU0JQSFkyX0RBVEFPVVRfNwlJT01VWF9QQUQoMHg2MDQsIDB4Mjg0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1BBVEFfUEFUQV9SRVNFVF9CCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fR1BJTzdfNAkJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9SRVNFVF9CX19FU0RIQzNfQ01ECQlJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VBUlQxX0NUUwkJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9SRVNFVF9CX19DQU4yX1RYQ0FOCQlJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VTQlBIWTFfREFUQU9VVF8wCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU9SRFlfX1BBVEFfSU9SRFkJCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU9SRFlfX0dQSU83XzUJCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU9SRFlfX0VTREhDM19DTEsJCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU9SRFlfX1VBUlQxX1JUUwkJSU9NVVhfUEFEKDB4NjBDLCAweDI4QywgMywgMHg4NzQsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lPUkRZX19DQU4yX1JYQ0FOCQlJT01VWF9QQUQoMHg2MEMsIDB4MjhDLCA0LCAweDc2NCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU9SRFlfX1VTQlBIWTFfREFUQU9VVF8xCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMF9fUEFUQV9EQV8wCQlJT01VWF9QQUQoMHg2MTAsIDB4MjkwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzBfX0dQSU83XzYJCUlPTVVYX1BBRCgweDYxMCwgMHgyOTAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMF9fRVNESEMzX1JTVAkJSU9NVVhfUEFEKDB4NjEwLCAweDI5MCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8wX19PV0lSRV9MSU5FCQlJT01VWF9QQUQoMHg2MTAsIDB4MjkwLCA0LCAweDg2NCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMF9fVVNCUEhZMV9EQVRBT1VUXzIJSU9NVVhfUEFEKDB4NjEwLCAweDI5MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8xX19QQVRBX0RBXzEJCUlPTVVYX1BBRCgweDYxNCwgMHgyOTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMV9fR1BJTzdfNwkJSU9NVVhfUEFEKDB4NjE0LCAweDI5NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8xX19FU0RIQzRfQ01ECQlJT01VWF9QQUQoMHg2MTQsIDB4Mjk0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzFfX1VBUlQzX0NUUwkJSU9NVVhfUEFEKDB4NjE0LCAweDI5NCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8xX19VU0JQSFkxX0RBVEFPVVRfMwlJT01VWF9QQUQoMHg2MTQsIDB4Mjk0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzJfX1BBVEFfREFfMgkJSU9NVVhfUEFEKDB4NjE4LCAweDI5OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8yX19HUElPN184CQlJT01VWF9QQUQoMHg2MTgsIDB4Mjk4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzJfX0VTREhDNF9DTEsJCUlPTVVYX1BBRCgweDYxOCwgMHgyOTgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMl9fVUFSVDNfUlRTCQlJT01VWF9QQUQoMHg2MTgsIDB4Mjk4LCA0LCAweDg4NCwgNSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMl9fVVNCUEhZMV9EQVRBT1VUXzQJSU9NVVhfUEFEKDB4NjE4LCAweDI5OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9DU18wX19QQVRBX0NTXzAJCUlPTVVYX1BBRCgweDYxQywgMHgyOUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQ1NfMF9fR1BJTzdfOQkJCUlPTVVYX1BBRCgweDYxQywgMHgyOUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQ1NfMF9fVUFSVDNfVFhEX01VWAkJSU9NVVhfUEFEKDB4NjFDLCAweDI5QywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9DU18wX19VU0JQSFkxX0RBVEFPVVRfNQlJT01VWF9QQUQoMHg2MUMsIDB4MjlDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0NTXzFfX1BBVEFfQ1NfMQkJSU9NVVhfUEFEKDB4NjIwLCAweDJBMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9DU18xX19HUElPN18xMAkJSU9NVVhfUEFEKDB4NjIwLCAweDJBMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9DU18xX19VQVJUM19SWERfTVVYCQlJT01VWF9QQUQoMHg2MjAsIDB4MkEwLCA0LCAweDg4OCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQ1NfMV9fVVNCUEhZMV9EQVRBT1VUXzYJSU9NVVhfUEFEKDB4NjIwLCAweDJBMCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMF9fUEFUQV9EQVRBXzAJCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTBfX0dQSU8yXzAJCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTBfX0VNSV9OQU5ERl9EXzAJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMF9fRVNESEMzX0RBVDQJCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTBfX0dQVTNkX0dQVV9ERUJVR19PVVRfMAlJT01VWF9QQUQoMHg2MjgsIDB4MkE0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEwX19JUFVfRElBR19CVVNfMAlJT01VWF9QQUQoMHg2MjgsIDB4MkE0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEwX19VU0JQSFkxX0RBVEFPVVRfNwlJT01VWF9QQUQoMHg2MjgsIDB4MkE0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExX19QQVRBX0RBVEFfMQkJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMV9fR1BJTzJfMQkJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMV9fRU1JX05BTkRGX0RfMQlJT01VWF9QQUQoMHg2MkMsIDB4MkE4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExX19FU0RIQzNfREFUNQkJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xCUlPTVVYX1BBRCgweDYyQywgMHgyQTgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTFfX0lQVV9ESUFHX0JVU18xCUlPTVVYX1BBRCgweDYyQywgMHgyQTgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTJfX1BBVEFfREFUQV8yCQlJT01VWF9QQUQoMHg2MzAsIDB4MkFDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEyX19HUElPMl8yCQlJT01VWF9QQUQoMHg2MzAsIDB4MkFDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEyX19FTUlfTkFOREZfRF8yCUlPTVVYX1BBRCgweDYzMCwgMHgyQUMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTJfX0VTREhDM19EQVQ2CQlJT01VWF9QQUQoMHg2MzAsIDB4MkFDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEyX19HUFUzZF9HUFVfREVCVUdfT1VUXzIJSU9NVVhfUEFEKDB4NjMwLCAweDJBQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMl9fSVBVX0RJQUdfQlVTXzIJSU9NVVhfUEFEKDB4NjMwLCAweDJBQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBM19fUEFUQV9EQVRBXzMJCUlPTVVYX1BBRCgweDYzNCwgMHgyQjAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTNfX0dQSU8yXzMJCUlPTVVYX1BBRCgweDYzNCwgMHgyQjAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTNfX0VNSV9OQU5ERl9EXzMJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBM19fRVNESEMzX0RBVDcJCUlPTVVYX1BBRCgweDYzNCwgMHgyQjAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTNfX0dQVTNkX0dQVV9ERUJVR19PVVRfMwlJT01VWF9QQUQoMHg2MzQsIDB4MkIwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEzX19JUFVfRElBR19CVVNfMwlJT01VWF9QQUQoMHg2MzQsIDB4MkIwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE0X19QQVRBX0RBVEFfNAkJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNF9fR1BJTzJfNAkJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNF9fRU1JX05BTkRGX0RfNAlJT01VWF9QQUQoMHg2MzgsIDB4MkI0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE0X19FU0RIQzRfREFUNAkJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNF9fR1BVM2RfR1BVX0RFQlVHX09VVF80CUlPTVVYX1BBRCgweDYzOCwgMHgyQjQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTRfX0lQVV9ESUFHX0JVU180CUlPTVVYX1BBRCgweDYzOCwgMHgyQjQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTVfX1BBVEFfREFUQV81CUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTVfX0dQSU8yXzUJCUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTVfX0VNSV9OQU5ERl9EXzUJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNV9fRVNESEM0X0RBVDUJCUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTVfX0dQVTNkX0dQVV9ERUJVR19PVVRfNQlJT01VWF9QQUQoMHg2M0MsIDB4MkI4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE1X19JUFVfRElBR19CVVNfNQlJT01VWF9QQUQoMHg2M0MsIDB4MkI4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19QQVRBX0RBVEFfNglJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19HUElPMl82CQlJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19FTUlfTkFOREZfRF82CUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTZfX0VTREhDNF9EQVQ2CQlJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19HUFUzZF9HUFVfREVCVUdfT1VUXzYJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNl9fSVBVX0RJQUdfQlVTXzYJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBN19fUEFUQV9EQVRBXzcJCUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTdfX0dQSU8yXzcJCUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTdfX0VNSV9OQU5ERl9EXzcJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBN19fRVNESEM0X0RBVDcJCUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTdfX0dQVTNkX0dQVV9ERUJVR19PVVRfNwlJT01VWF9QQUQoMHg2NDQsIDB4MkMwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE3X19JUFVfRElBR19CVVNfNwlJT01VWF9QQUQoMHg2NDQsIDB4MkMwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE4X19QQVRBX0RBVEFfOAkJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOF9fR1BJTzJfOAkJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOF9fRVNESEMxX0RBVDQJCUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQThfX0VNSV9OQU5ERl9EXzgJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOF9fRVNESEMzX0RBVDAJCUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQThfX0dQVTNkX0dQVV9ERUJVR19PVVRfOAlJT01VWF9QQUQoMHg2NDgsIDB4MkM0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE4X19JUFVfRElBR19CVVNfOAlJT01VWF9QQUQoMHg2NDgsIDB4MkM0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE5X19QQVRBX0RBVEFfOQkJSU9NVVhfUEFEKDB4NjRDLCAweDJDOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOV9fR1BJTzJfOQkJSU9NVVhfUEFEKDB4NjRDLCAweDJDOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOV9fRVNESEMxX0RBVDUJCUlPTVVYX1BBRCgweDY0QywgMHgyQzgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTlfX0VNSV9OQU5ERl9EXzkJSU9NVVhfUEFEKDB4NjRDLCAweDJDOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOV9fRVNESEMzX0RBVDEJCUlPTVVYX1BBRCgweDY0QywgMHgyQzgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTlfX0dQVTNkX0dQVV9ERUJVR19PVVRfOQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE5X19JUFVfRElBR19CVVNfOQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fUEFUQV9EQVRBXzEwCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEwX19HUElPMl8xMAkJSU9NVVhfUEFEKDB4NjUwLCAweDJDQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTBfX0VTREhDMV9EQVQ2CQlJT01VWF9QQUQoMHg2NTAsIDB4MkNDLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fRU1JX05BTkRGX0RfMTAJSU9NVVhfUEFEKDB4NjUwLCAweDJDQywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTBfX0VTREhDM19EQVQyCQlJT01VWF9QQUQoMHg2NTAsIDB4MkNDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fR1BVM2RfR1BVX0RFQlVHX09VVF8xMAlJT01VWF9QQUQoMHg2NTAsIDB4MkNDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fSVBVX0RJQUdfQlVTXzEwCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTExX19QQVRBX0RBVEFfMTEJSU9NVVhfUEFEKDB4NjU0LCAweDJEMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTFfX0dQSU8yXzExCQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMV9fRVNESEMxX0RBVDcJCUlPTVVYX1BBRCgweDY1NCwgMHgyRDAsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTExX19FTUlfTkFOREZfRF8xMQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMV9fRVNESEMzX0RBVDMJCUlPTVVYX1BBRCgweDY1NCwgMHgyRDAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTExX19HUFUzZF9HUFVfREVCVUdfT1VUXzExCUlPTVVYX1BBRCgweDY1NCwgMHgyRDAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTExX19JUFVfRElBR19CVVNfMTEJSU9NVVhfUEFEKDB4NjU0LCAweDJEMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTJfX1BBVEFfREFUQV8xMglJT01VWF9QQUQoMHg2NTgsIDB4MkQ0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMl9fR1BJTzJfMTIJCUlPTVVYX1BBRCgweDY1OCwgMHgyRDQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEyX19FU0RIQzJfREFUNAkJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTJfX0VNSV9OQU5ERl9EXzEyCUlPTVVYX1BBRCgweDY1OCwgMHgyRDQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEyX19FU0RIQzRfREFUMAkJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTJfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTIJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTJfX0lQVV9ESUFHX0JVU18xMglJT01VWF9QQUQoMHg2NTgsIDB4MkQ0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExM19fUEFUQV9EQVRBXzEzCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEzX19HUElPMl8xMwkJSU9NVVhfUEFEKDB4NjVDLCAweDJEOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTNfX0VTREhDMl9EQVQ1CQlJT01VWF9QQUQoMHg2NUMsIDB4MkQ4LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExM19fRU1JX05BTkRGX0RfMTMJSU9NVVhfUEFEKDB4NjVDLCAweDJEOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTNfX0VTREhDNF9EQVQxCQlJT01VWF9QQUQoMHg2NUMsIDB4MkQ4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExM19fR1BVM2RfR1BVX0RFQlVHX09VVF8xMwlJT01VWF9QQUQoMHg2NUMsIDB4MkQ4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExM19fSVBVX0RJQUdfQlVTXzEzCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTE0X19QQVRBX0RBVEFfMTQJSU9NVVhfUEFEKDB4NjYwLCAweDJEQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTRfX0dQSU8yXzE0CQlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExNF9fRVNESEMyX0RBVDYJCUlPTVVYX1BBRCgweDY2MCwgMHgyREMsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTE0X19FTUlfTkFOREZfRF8xNAlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExNF9fRVNESEM0X0RBVDIJCUlPTVVYX1BBRCgweDY2MCwgMHgyREMsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTE0X19HUFUzZF9HUFVfREVCVUdfT1VUXzE0CUlPTVVYX1BBRCgweDY2MCwgMHgyREMsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTE0X19JUFVfRElBR19CVVNfMTQJSU9NVVhfUEFEKDB4NjYwLCAweDJEQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTVfX1BBVEFfREFUQV8xNQlJT01VWF9QQUQoMHg2NjQsIDB4MkUwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExNV9fR1BJTzJfMTUJCUlPTVVYX1BBRCgweDY2NCwgMHgyRTAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTE1X19FU0RIQzJfREFUNwkJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTVfX0VNSV9OQU5ERl9EXzE1CUlPTVVYX1BBRCgweDY2NCwgMHgyRTAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTE1X19FU0RIQzRfREFUMwkJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTVfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTUJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTVfX0lQVV9ESUFHX0JVU18xNQlJT01VWF9QQUQoMHg2NjQsIDB4MkUwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTBfX0VTREhDMV9EQVQwCUlPTVVYX1BBRCgweDY2QywgMHgyRTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMF9fR1BJTzFfMTYJSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEwX19HUFRfQ0FQSU4xCUlPTVVYX1BBRCgweDY2QywgMHgyRTQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMF9fQ1NQSV9NSVNPCUlPTVVYX1BBRCgweDY2QywgMHgyRTQsIDUsIDB4Nzg0LCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEwX19DQ01fUExMM19CWVAJSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgNywgMHg3NzgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTFfX0VTREhDMV9EQVQxCUlPTVVYX1BBRCgweDY3MCwgMHgyRTgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMV9fR1BJTzFfMTcJSU9NVVhfUEFEKDB4NjcwLCAweDJFOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEExX19HUFRfQ0FQSU4yCUlPTVVYX1BBRCgweDY3MCwgMHgyRTgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMV9fQ1NQSV9TUzAJSU9NVVhfUEFEKDB4NjcwLCAweDJFOCwgNSwgMHg3OEMsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTFfX0NDTV9QTEw0X0JZUAlJT01VWF9QQUQoMHg2NzAsIDB4MkU4LCA3LCAweDc3QywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9DTURfX0VTREhDMV9DTUQJSU9NVVhfUEFEKDB4Njc0LCAweDJFQywgSU9NVVhfQ09ORklHX1NJT04sIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9DTURfX0dQSU8xXzE4CQlJT01VWF9QQUQoMHg2NzQsIDB4MkVDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfQ01EX19HUFRfQ01QT1VUMQlJT01VWF9QQUQoMHg2NzQsIDB4MkVDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfQ01EX19DU1BJX01PU0kJCUlPTVVYX1BBRCgweDY3NCwgMHgyRUMsIDUsIDB4Nzg4LCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0NNRF9fQ0NNX1BMTDFfQllQCUlPTVVYX1BBRCgweDY3NCwgMHgyRUMsIDcsIDB4NzcwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEyX19FU0RIQzFfREFUMgkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEyX19HUElPMV8xOQkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEyX19HUFRfQ01QT1VUMgkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEyX19QV00yX1BXTU8JCUlPTVVYX1BBRCgweDY3OCwgMHgyRjAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMl9fV0RPRzFfV0RPR19CCQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTJfX0NTUElfU1MxCQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCA1LCAweDc5MCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMl9fV0RPRzFfV0RPR19SU1RfQl9ERUIJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEyX19DQ01fUExMMl9CWVAJCUlPTVVYX1BBRCgweDY3OCwgMHgyRjAsIDcsIDB4Nzc0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0NMS19fRVNESEMxX0NMSwlJT01VWF9QQUQoMHg2N0MsIDB4MkY0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfQ0xLX19HUElPMV8yMAkJSU9NVVhfUEFEKDB4NjdDLCAweDJGNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0NMS19fT1NDMzJrXzMyS19PVVQJSU9NVVhfUEFEKDB4NjdDLCAweDJGNCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0NMS19fR1BUX0NMS0lOCQlJT01VWF9QQUQoMHg2N0MsIDB4MkY0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfQ0xLX19DU1BJX1NDTEsJCUlPTVVYX1BBRCgweDY3QywgMHgyRjQsIDUsIDB4NzgwLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0NMS19fU0FUQV9QSFlfRFRCXzAJSU9NVVhfUEFEKDB4NjdDLCAweDJGNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEzX19FU0RIQzFfREFUMwlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTNfX0dQSU8xXzIxCUlPTVVYX1BBRCgweDY4MCwgMHgyRjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBM19fR1BUX0NNUE9VVDMJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEzX19QV00xX1BXTU8JSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEzX19XRE9HMl9XRE9HX0IJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEzX19DU1BJX1NTMglJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCA1LCAweDc5NCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBM19fV0RPRzJfV0RPR19SU1RfQl9ERUIJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEzX19TQVRBX1BIWV9EVEJfMQlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfQ0xLX19FU0RIQzJfQ0xLCUlPTVVYX1BBRCgweDY4OCwgMHgyRkMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9DTEtfX0dQSU8xXzEwCQlJT01VWF9QQUQoMHg2ODgsIDB4MkZDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfQ0xLX19LUFBfQ09MXzUJCUlPTVVYX1BBRCgweDY4OCwgMHgyRkMsIDIsIDB4ODQwLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0NMS19fQVVETVVYX0FVRDRfUlhGUwlJT01VWF9QQUQoMHg2ODgsIDB4MkZDLCAzLCAweDczQywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9DTEtfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4Njg4LCAweDJGQywgNSwgMHg3ODAsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfQ0xLX19TQ0NfUkFORE9NX1YJSU9NVVhfUEFEKDB4Njg4LCAweDJGQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0NNRF9fRVNESEMyX0NNRAlJT01VWF9QQUQoMHg2OEMsIDB4MzAwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfQ01EX19HUElPMV8xMQkJSU9NVVhfUEFEKDB4NjhDLCAweDMwMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0NNRF9fS1BQX1JPV181CUlPTVVYX1BBRCgweDY4QywgMHgzMDAsIDIsIDB4ODRDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0NNRF9fQVVETVVYX0FVRDRfUlhDCUlPTVVYX1BBRCgweDY4QywgMHgzMDAsIDMsIDB4NzM4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0NNRF9fQ1NQSV9NT1NJCQlJT01VWF9QQUQoMHg2OEMsIDB4MzAwLCA1LCAweDc4OCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9DTURfX1NDQ19SQU5ET00JSU9NVVhfUEFEKDB4NjhDLCAweDMwMCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEzX19FU0RIQzJfREFUMwlJT01VWF9QQUQoMHg2OTAsIDB4MzA0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTNfX0dQSU8xXzEyCUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBM19fS1BQX0NPTF82CUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDIsIDB4ODQ0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEzX19BVURNVVhfQVVENF9UWEMJSU9NVVhfUEFEKDB4NjkwLCAweDMwNCwgMywgMHg3NDAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTNfX0NTUElfU1MyCUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDUsIDB4Nzk0LCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEzX19TSkNfRE9ORQlJT01VWF9QQUQoMHg2OTAsIDB4MzA0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTJfX0VTREhDMl9EQVQyCUlPTVVYX1BBRCgweDY5NCwgMHgzMDgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMl9fR1BJTzFfMTMJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEyX19LUFBfUk9XXzYJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgMiwgMHg4NTAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTJfX0FVRE1VWF9BVUQ0X1RYRAlJT01VWF9QQUQoMHg2OTQsIDB4MzA4LCAzLCAweDczNCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMl9fQ1NQSV9TUzEJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgNSwgMHg3OTAsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTJfX1NKQ19GQUlMCUlPTVVYX1BBRCgweDY5NCwgMHgzMDgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMV9fRVNESEMyX0RBVDEJSU9NVVhfUEFEKDB4Njk4LCAweDMwQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEExX19HUElPMV8xNAlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTFfX0tQUF9DT0xfNwlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCAyLCAweDg0OCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMV9fQVVETVVYX0FVRDRfVFhGUwlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCAzLCAweDc0NCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMV9fQ1NQSV9TUzAJSU9NVVhfUEFEKDB4Njk4LCAweDMwQywgNSwgMHg3OEMsIDQsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTFfX1JUSUNfU0VDX1ZJTwlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTBfX0VTREhDMl9EQVQwCUlPTVVYX1BBRCgweDY5QywgMHgzMTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMF9fR1BJTzFfMTUJSU9NVVhfUEFEKDB4NjlDLCAweDMxMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEwX19LUFBfUk9XXzcJSU9NVVhfUEFEKDB4NjlDLCAweDMxMCwgMiwgMHg4NTQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTBfX0FVRE1VWF9BVUQ0X1JYRAlJT01VWF9QQUQoMHg2OUMsIDB4MzEwLCAzLCAweDczMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMF9fQ1NQSV9NSVNPCUlPTVVYX1BBRCgweDY5QywgMHgzMTAsIDUsIDB4Nzg0LCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEwX19SVElDX0RPTkVfSU5UCUlPTVVYX1BBRCgweDY5QywgMHgzMTAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMF9fQ0NNX0NMS08JCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMF9fR1BJTzFfMAkJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18wX19LUFBfQ09MXzUJCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDIsIDB4ODQwLCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18wX19DQ01fU1NJX0VYVDFfQ0xLCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMF9fRVBJVDFfRVBJVE8JSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18wX19TUlRDX0FMQVJNX0RFQglJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzBfX1VTQk9IM19VU0JIMV9QV1IJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18wX19DU1VfVEQJCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMV9fRVNBSTFfU0NLUgkJSU9NVVhfUEFEKDB4NkE4LCAweDMxOCwgMCwgMHg3REMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzFfX0dQSU8xXzEJCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMV9fS1BQX1JPV181CQlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCAyLCAweDg0QywgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMV9fQ0NNX1NTSV9FWFQyX0NMSwlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzFfX1BXTTJfUFdNTwlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzFfX1dET0cyX1dET0dfQglJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzFfX0VTREhDMV9DRAkJSU9NVVhfUEFEKDB4NkE4LCAweDMxOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xX19TUkNfVEVTVEVSX0FDSwlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzlfX0VTQUkxX0ZTUgkJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgMCwgMHg3Q0MsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzlfX0dQSU8xXzkJCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOV9fS1BQX0NPTF82CQlJT01VWF9QQUQoMHg2QUMsIDB4MzFDLCAyLCAweDg0NCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOV9fQ0NNX1JFRl9FTl9CCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOV9fUFdNMV9QV01PCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOV9fV0RPRzFfV0RPR19CCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOV9fRVNESEMxX1dQCQlJT01VWF9QQUQoMHg2QUMsIDB4MzFDLCA2LCAweDdGQywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOV9fU0NDX0ZBSUxfU1RBVEUJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18zX19FU0FJMV9IQ0tSCQlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCAwLCAweDdENCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fM19fR1BJTzFfMwkJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18zX19JMkMzX1NDTAkJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgMiB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyNCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fM19fRFBMTElQMV9UT0dfRU4JSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18zX19DQ01fQ0xLTzIJCUlPTVVYX1BBRCgweDZCMCwgMHgzMjAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fM19fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDAJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18zX19VU0JPSDNfVVNCSDFfT0MJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgNiwgMHg4QTAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzNfX01MQl9NTEJDTEsJCUlPTVVYX1BBRCgweDZCMCwgMHgzMjAsIDcsIDB4ODU4LCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT182X19FU0FJMV9TQ0tUCQlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCAwLCAweDdFMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNl9fR1BJTzFfNgkJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT182X19JMkMzX1NEQQkJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgMiB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyOCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNl9fQ0NNX0NDTV9PVVRfMAlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzZfX0NTVV9DU1VfSU5UX0RFQglJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzZfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQxCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNl9fRVNESEMyX0xDVEwJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT182X19NTEJfTUxCU0lHCQlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCA3LCAweDg2MCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMl9fRVNBSTFfRlNUCQlJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCAwLCAweDdEMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMl9fR1BJTzFfMgkJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18yX19LUFBfUk9XXzYJCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDIsIDB4ODUwLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18yX19DQ01fQ0NNX09VVF8xCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMl9fQ1NVX0NTVV9BTEFSTV9BVVRfMAlJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzJfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQyCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMl9fRVNESEMyX1dQCQlJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzJfX01MQl9NTEJEQVQJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgNywgMHg4NUMsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzRfX0VTQUkxX0hDS1QJCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDAsIDB4N0Q4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT180X19HUElPMV80CQlJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzRfX0tQUF9DT0xfNwkJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgMiwgMHg4NDgsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzRfX0NDTV9DQ01fT1VUXzIJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT180X19DU1VfQ1NVX0FMQVJNX0FVVF8xCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNF9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDMJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT180X19FU0RIQzJfQ0QJCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNF9fU0NDX1NFQ19TVEFURQlJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzVfX0VTQUkxX1RYMl9SWDMJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgMCwgMHg3RUMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzVfX0dQSU8xXzUJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fS1BQX1JPV183CQlJT01VWF9QQUQoMHg2QzAsIDB4MzMwLCAyLCAweDg1NCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fQ0NNX0NMS08JCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fQ1NVX0NTVV9BTEFSTV9BVVRfMglJT01VWF9QQUQoMHg2QzAsIDB4MzMwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzVfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQ0CUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fSTJDM19TQ0wJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDYgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MjQsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzVfX0NDTV9QTEwxX0JZUAlJT01VWF9QQUQoMHg2QzAsIDB4MzMwLCA3LCAweDc3MCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fN19fRVNBSTFfVFg0X1JYMQlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCAwLCAweDdGNCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fN19fR1BJTzFfNwkJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT183X19FUElUMV9FUElUTwlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzdfX0NBTjFfVFhDQU4JSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT183X19VQVJUMl9UWERfTVVYCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fN19fRklSSV9SWEQJCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDUsIDB4ODBDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT183X19TUERJRl9QTE9DSwlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzdfX0NDTV9QTEwyX0JZUAlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCA3LCAweDc3NCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOF9fRVNBSTFfVFg1X1JYMAlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCAwLCAweDdGOCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOF9fR1BJTzFfOAkJSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT184X19FUElUMl9FUElUTwlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzhfX0NBTjFfUlhDQU4JSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgMywgMHg3NjAsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzhfX1VBUlQyX1JYRF9NVVgJSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgNCwgMHg4ODAsIDUsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzhfX0ZJUklfVFhECQlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzhfX1NQRElGX1NSQ0xLCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOF9fQ0NNX1BMTDNfQllQCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDcsIDB4Nzc4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xNl9fRVNBSTFfVFgzX1JYMglJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCAwLCAweDdGMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTZfX0dQSU83XzExCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE2X19UWklDX1BXUkZBSUxfSU5UCUlPTVVYX1BBRCgweDZDQywgMHgzM0MsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTZfX1JUQ19DRV9SVENfRVhUX1RSSUcxCUlPTVVYX1BBRCgweDZDQywgMHgzM0MsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTZfX1NQRElGX0lOMQkJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgNSwgMHg4NzAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE2X19JMkMzX1NEQQkJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgNiB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyOCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTZfX1NKQ19ERV9CCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE3X19FU0FJMV9UWDAJCUlPTVVYX1BBRCgweDZEMCwgMHgzNDAsIDAsIDB4N0U0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xN19fR1BJTzdfMTIJCUlPTVVYX1BBRCgweDZEMCwgMHgzNDAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTdfX1NETUFfRVhUX0VWRU5UXzAJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgMiwgMHg4NjgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE3X19HUENfUE1JQ19SRFkJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgMywgMHg4MTAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE3X19SVENfQ0VfUlRDX0ZTVl9UUklHCUlPTVVYX1BBRCgweDZEMCwgMHgzNDAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTdfX1NQRElGX09VVDEJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xN19fSVBVX1NOT09QMglJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE3X19TSkNfSlRBR19BQ1QJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOF9fRVNBSTFfVFgxCQlJT01VWF9QQUQoMHg2RDQsIDB4MzQ0LCAwLCAweDdFOCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMThfX0dQSU83XzEzCQlJT01VWF9QQUQoMHg2RDQsIDB4MzQ0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE4X19TRE1BX0VYVF9FVkVOVF8xCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDIsIDB4ODZDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOF9fT1dJUkVfTElORQlJT01VWF9QQUQoMHg2RDQsIDB4MzQ0LCAzLCAweDg2NCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMThfX1JUQ19DRV9SVENfQUxBUk0yX1RSSUcJSU9NVVhfUEFEKDB4NkQ0LCAweDM0NCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOF9fQ0NNX0FTUkNfRVhUX0NMSwlJT01VWF9QQUQoMHg2RDQsIDB4MzQ0LCA1LCAweDc2OCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMThfX0VTREhDMV9MQ1RMCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMThfX1NSQ19TWVNURU1fUlNUCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDcsIDB4MCwgMCwgMCkKIAotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE5X19LUFBfQ09MXzUJCShfTVg1M19QQURfR1BJT18xOV9fS1BQX0NPTF81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fR1BJTzRfNQkJKF9NWDUzX1BBRF9HUElPXzE5X19HUElPNF81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fQ0NNX0NMS08JCShfTVg1M19QQURfR1BJT18xOV9fQ0NNX0NMS08gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE5X19TUERJRl9PVVQxCQkoX01YNTNfUEFEX0dQSU9fMTlfX1NQRElGX09VVDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE5X19SVENfQ0VfUlRDX0VYVF9UUklHMgkJKF9NWDUzX1BBRF9HUElPXzE5X19SVENfQ0VfUlRDX0VYVF9UUklHMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX0VDU1BJMV9SRFkJCShfTVg1M19QQURfR1BJT18xOV9fRUNTUEkxX1JEWSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX0ZFQ19UREFUQV8zCQkoX01YNTNfUEFEX0dQSU9fMTlfX0ZFQ19UREFUQV8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fU1JDX0lOVF9CT09UCQkoX01YNTNfUEFEX0dQSU9fMTlfX1NSQ19JTlRfQk9PVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19LUFBfQ09MXzAJCShfTVg1M19QQURfS0VZX0NPTDBfX0tQUF9DT0xfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19HUElPNF82CQkoX01YNTNfUEFEX0tFWV9DT0wwX19HUElPNF82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX0FVRE1VWF9BVUQ1X1RYQwkJKF9NWDUzX1BBRF9LRVlfQ09MMF9fQVVETVVYX0FVRDVfVFhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX1VBUlQ0X1RYRF9NVVgJCShfTVg1M19QQURfS0VZX0NPTDBfX1VBUlQ0X1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX0VDU1BJMV9TQ0xLCQkoX01YNTNfUEFEX0tFWV9DT0wwX19FQ1NQSTFfU0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19GRUNfUkRBVEFfMwkJKF9NWDUzX1BBRF9LRVlfQ09MMF9fRkVDX1JEQVRBXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fU1JDX0FOWV9QVV9SU1QJCShfTVg1M19QQURfS0VZX0NPTDBfX1NSQ19BTllfUFVfUlNUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzBfX0tQUF9ST1dfMAkJKF9NWDUzX1BBRF9LRVlfUk9XMF9fS1BQX1JPV18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzBfX0dQSU80XzcJCShfTVg1M19QQURfS0VZX1JPVzBfX0dQSU80XzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fQVVETVVYX0FVRDVfVFhECQkoX01YNTNfUEFEX0tFWV9ST1cwX19BVURNVVhfQVVENV9UWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fVUFSVDRfUlhEX01VWAkJKF9NWDUzX1BBRF9LRVlfUk9XMF9fVUFSVDRfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fRUNTUEkxX01PU0kJCShfTVg1M19QQURfS0VZX1JPVzBfX0VDU1BJMV9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzBfX0ZFQ19UWF9FUgkJKF9NWDUzX1BBRF9LRVlfUk9XMF9fRkVDX1RYX0VSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX0tQUF9DT0xfMQkJKF9NWDUzX1BBRF9LRVlfQ09MMV9fS1BQX0NPTF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX0dQSU80XzgJCShfTVg1M19QQURfS0VZX0NPTDFfX0dQSU80XzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fQVVETVVYX0FVRDVfVFhGUwkJKF9NWDUzX1BBRF9LRVlfQ09MMV9fQVVETVVYX0FVRDVfVFhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19VQVJUNV9UWERfTVVYCQkoX01YNTNfUEFEX0tFWV9DT0wxX19VQVJUNV9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19FQ1NQSTFfTUlTTwkJKF9NWDUzX1BBRF9LRVlfQ09MMV9fRUNTUEkxX01JU08gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fRkVDX1JYX0NMSwkJKF9NWDUzX1BBRF9LRVlfQ09MMV9fRkVDX1JYX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19VU0JQSFkxX1RYUkVBRFkJCShfTVg1M19QQURfS0VZX0NPTDFfX1VTQlBIWTFfVFhSRUFEWSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19LUFBfUk9XXzEJCShfTVg1M19QQURfS0VZX1JPVzFfX0tQUF9ST1dfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19HUElPNF85CQkoX01YNTNfUEFEX0tFWV9ST1cxX19HUElPNF85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX0FVRE1VWF9BVUQ1X1JYRAkJKF9NWDUzX1BBRF9LRVlfUk9XMV9fQVVETVVYX0FVRDVfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX1VBUlQ1X1JYRF9NVVgJCShfTVg1M19QQURfS0VZX1JPVzFfX1VBUlQ1X1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX0VDU1BJMV9TUzAJCShfTVg1M19QQURfS0VZX1JPVzFfX0VDU1BJMV9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fRkVDX0NPTAkJKF9NWDUzX1BBRF9LRVlfUk9XMV9fRkVDX0NPTCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19VU0JQSFkxX1JYVkFMSUQJCShfTVg1M19QQURfS0VZX1JPVzFfX1VTQlBIWTFfUlhWQUxJRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19LUFBfQ09MXzIJCShfTVg1M19QQURfS0VZX0NPTDJfX0tQUF9DT0xfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19HUElPNF8xMAkJKF9NWDUzX1BBRF9LRVlfQ09MMl9fR1BJTzRfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMl9fQ0FOMV9UWENBTgkJKF9NWDUzX1BBRF9LRVlfQ09MMl9fQ0FOMV9UWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19GRUNfTURJTwkJKF9NWDUzX1BBRF9LRVlfQ09MMl9fRkVDX01ESU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMl9fRUNTUEkxX1NTMQkJKF9NWDUzX1BBRF9LRVlfQ09MMl9fRUNTUEkxX1NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19GRUNfUkRBVEFfMgkJKF9NWDUzX1BBRF9LRVlfQ09MMl9fRkVDX1JEQVRBXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMl9fVVNCUEhZMV9SWEFDVElWRQkJKF9NWDUzX1BBRF9LRVlfQ09MMl9fVVNCUEhZMV9SWEFDVElWRSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cyX19LUFBfUk9XXzIJCShfTVg1M19QQURfS0VZX1JPVzJfX0tQUF9ST1dfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cyX19HUElPNF8xMQkJKF9NWDUzX1BBRF9LRVlfUk9XMl9fR1BJTzRfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMl9fQ0FOMV9SWENBTgkJKF9NWDUzX1BBRF9LRVlfUk9XMl9fQ0FOMV9SWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cyX19GRUNfTURDCQkoX01YNTNfUEFEX0tFWV9ST1cyX19GRUNfTURDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX0VDU1BJMV9TUzIJCShfTVg1M19QQURfS0VZX1JPVzJfX0VDU1BJMV9TUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMl9fRkVDX1REQVRBXzIJCShfTVg1M19QQURfS0VZX1JPVzJfX0ZFQ19UREFUQV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX1VTQlBIWTFfUlhFUlJPUgkJKF9NWDUzX1BBRF9LRVlfUk9XMl9fVVNCUEhZMV9SWEVSUk9SIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX0tQUF9DT0xfMwkJKF9NWDUzX1BBRF9LRVlfQ09MM19fS1BQX0NPTF8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX0dQSU80XzEyCQkoX01YNTNfUEFEX0tFWV9DT0wzX19HUElPNF8xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19VU0JPSDNfSDJfRFAJCShfTVg1M19QQURfS0VZX0NPTDNfX1VTQk9IM19IMl9EUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19TUERJRl9JTjEJCShfTVg1M19QQURfS0VZX0NPTDNfX1NQRElGX0lOMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19JMkMyX1NDTAkJKF9NWDUzX1BBRF9LRVlfQ09MM19fSTJDMl9TQ0wgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX0VDU1BJMV9TUzMJCShfTVg1M19QQURfS0VZX0NPTDNfX0VDU1BJMV9TUzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fRkVDX0NSUwkJKF9NWDUzX1BBRF9LRVlfQ09MM19fRkVDX0NSUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19VU0JQSFkxX1NJRUNMT0NLCQkoX01YNTNfUEFEX0tFWV9DT0wzX19VU0JQSFkxX1NJRUNMT0NLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX0tQUF9ST1dfMwkJKF9NWDUzX1BBRF9LRVlfUk9XM19fS1BQX1JPV18zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX0dQSU80XzEzCQkoX01YNTNfUEFEX0tFWV9ST1czX19HUElPNF8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1czX19VU0JPSDNfSDJfRE0JCShfTVg1M19QQURfS0VZX1JPVzNfX1VTQk9IM19IMl9ETSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1czX19DQ01fQVNSQ19FWFRfQ0xLCQkoX01YNTNfUEFEX0tFWV9ST1czX19DQ01fQVNSQ19FWFRfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX0kyQzJfU0RBCQkoX01YNTNfUEFEX0tFWV9ST1czX19JMkMyX1NEQSB8IE1VWF9QQURfQ1RSTChQQURfQ1RSTF9JMkMpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fT1NDMzJLXzMyS19PVVQJCShfTVg1M19QQURfS0VZX1JPVzNfX09TQzMyS18zMktfT1VUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX0NDTV9QTEw0X0JZUAkJKF9NWDUzX1BBRF9LRVlfUk9XM19fQ0NNX1BMTDRfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX1VTQlBIWTFfTElORVNUQVRFXzAJCShfTVg1M19QQURfS0VZX1JPVzNfX1VTQlBIWTFfTElORVNUQVRFXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fS1BQX0NPTF80CQkoX01YNTNfUEFEX0tFWV9DT0w0X19LUFBfQ09MXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fR1BJTzRfMTQJCShfTVg1M19QQURfS0VZX0NPTDRfX0dQSU80XzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX0NBTjJfVFhDQU4JCShfTVg1M19QQURfS0VZX0NPTDRfX0NBTjJfVFhDQU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fSVBVX1NJU0dfNAkJKF9NWDUzX1BBRF9LRVlfQ09MNF9fSVBVX1NJU0dfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19VQVJUNV9SVFMJCShfTVg1M19QQURfS0VZX0NPTDRfX1VBUlQ1X1JUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fVVNCT0gzX1VTQk9UR19PQwkJKF9NWDUzX1BBRF9LRVlfQ09MNF9fVVNCT0gzX1VTQk9UR19PQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19VU0JQSFkxX0xJTkVTVEFURV8xCQkoX01YNTNfUEFEX0tFWV9DT0w0X19VU0JQSFkxX0xJTkVTVEFURV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX0tQUF9ST1dfNAkJKF9NWDUzX1BBRF9LRVlfUk9XNF9fS1BQX1JPV180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX0dQSU80XzE1CQkoX01YNTNfUEFEX0tFWV9ST1c0X19HUElPNF8xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19DQU4yX1JYQ0FOCQkoX01YNTNfUEFEX0tFWV9ST1c0X19DQU4yX1JYQ0FOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX0lQVV9TSVNHXzUJCShfTVg1M19QQURfS0VZX1JPVzRfX0lQVV9TSVNHXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fVUFSVDVfQ1RTCQkoX01YNTNfUEFEX0tFWV9ST1c0X19VQVJUNV9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX1VTQk9IM19VU0JPVEdfUFdSCQkoX01YNTNfUEFEX0tFWV9ST1c0X19VU0JPSDNfVVNCT1RHX1BXUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19VU0JQSFkxX1ZCVVNWQUxJRAkJKF9NWDUzX1BBRF9LRVlfUk9XNF9fVVNCUEhZMV9WQlVTVkFMSUQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfRElTUF9DTEtfX0lQVV9ESTBfRElTUF9DTEsJCShfTVg1M19QQURfREkwX0RJU1BfQ0xLX19JUFVfREkwX0RJU1BfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19HUElPNF8xNgkJKF9NWDUzX1BBRF9ESTBfRElTUF9DTEtfX0dQSU80XzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19VU0JPSDNfVVNCSDJfRElSCQkoX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fVVNCT0gzX1VTQkgyX0RJUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9ESVNQX0NMS19fU0RNQV9ERUJVR19DT1JFX1NUQVRFXzAJCShfTVg1M19QQURfREkwX0RJU1BfQ0xLX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9ESVNQX0NMS19fRU1JX0VNSV9ERUJVR18wCQkoX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fRU1JX0VNSV9ERUJVR18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19VU0JQSFkxX0FWQUxJRAkJKF9NWDUzX1BBRF9ESTBfRElTUF9DTEtfX1VTQlBIWTFfQVZBTElEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19JUFVfREkwX1BJTjE1CQkoX01YNTNfUEFEX0RJMF9QSU4xNV9fSVBVX0RJMF9QSU4xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4xNV9fR1BJTzRfMTcJCShfTVg1M19QQURfREkwX1BJTjE1X19HUElPNF8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4xNV9fQVVETVVYX0FVRDZfVFhDCQkoX01YNTNfUEFEX0RJMF9QSU4xNV9fQVVETVVYX0FVRDZfVFhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMQkJKF9NWDUzX1BBRF9ESTBfUElOMTVfX1NETUFfREVCVUdfQ09SRV9TVEFURV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19FTUlfRU1JX0RFQlVHXzEJCShfTVg1M19QQURfREkwX1BJTjE1X19FTUlfRU1JX0RFQlVHXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMTVfX1VTQlBIWTFfQlZBTElECQkoX01YNTNfUEFEX0RJMF9QSU4xNV9fVVNCUEhZMV9CVkFMSUQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMl9fSVBVX0RJMF9QSU4yCQkoX01YNTNfUEFEX0RJMF9QSU4yX19JUFVfREkwX1BJTjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMl9fR1BJTzRfMTgJCShfTVg1M19QQURfREkwX1BJTjJfX0dQSU80XzE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjJfX0FVRE1VWF9BVUQ2X1RYRAkJKF9NWDUzX1BBRF9ESTBfUElOMl9fQVVETVVYX0FVRDZfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjJfX1NETUFfREVCVUdfQ09SRV9TVEFURV8yCQkoX01YNTNfUEFEX0RJMF9QSU4yX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4yX19FTUlfRU1JX0RFQlVHXzIJCShfTVg1M19QQURfREkwX1BJTjJfX0VNSV9FTUlfREVCVUdfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4yX19VU0JQSFkxX0VORFNFU1NJT04JCShfTVg1M19QQURfREkwX1BJTjJfX1VTQlBIWTFfRU5EU0VTU0lPTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19JUFVfREkwX1BJTjMJCShfTVg1M19QQURfREkwX1BJTjNfX0lQVV9ESTBfUElOMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19HUElPNF8xOQkJKF9NWDUzX1BBRF9ESTBfUElOM19fR1BJTzRfMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOM19fQVVETVVYX0FVRDZfVFhGUwkJKF9NWDUzX1BBRF9ESTBfUElOM19fQVVETVVYX0FVRDZfVFhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMwkJKF9NWDUzX1BBRF9ESTBfUElOM19fU0RNQV9ERUJVR19DT1JFX1NUQVRFXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOM19fRU1JX0VNSV9ERUJVR18zCQkoX01YNTNfUEFEX0RJMF9QSU4zX19FTUlfRU1JX0RFQlVHXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOM19fVVNCUEhZMV9JRERJRwkJKF9NWDUzX1BBRF9ESTBfUElOM19fVVNCUEhZMV9JRERJRyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19JUFVfREkwX1BJTjQJCShfTVg1M19QQURfREkwX1BJTjRfX0lQVV9ESTBfUElONCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19HUElPNF8yMAkJKF9NWDUzX1BBRF9ESTBfUElONF9fR1BJTzRfMjAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElONF9fQVVETVVYX0FVRDZfUlhECQkoX01YNTNfUEFEX0RJMF9QSU40X19BVURNVVhfQVVENl9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElONF9fRVNESEMxX1dQCQkoX01YNTNfUEFEX0RJMF9QSU40X19FU0RIQzFfV1AgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElONF9fU0RNQV9ERUJVR19ZSUVMRAkJKF9NWDUzX1BBRF9ESTBfUElONF9fU0RNQV9ERUJVR19ZSUVMRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19FTUlfRU1JX0RFQlVHXzQJCShfTVg1M19QQURfREkwX1BJTjRfX0VNSV9FTUlfREVCVUdfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19VU0JQSFkxX0hPU1RESVNDT05ORUNUCQkoX01YNTNfUEFEX0RJMF9QSU40X19VU0JQSFkxX0hPU1RESVNDT05ORUNUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fSVBVX0RJU1AwX0RBVF8wCQkoX01YNTNfUEFEX0RJU1AwX0RBVDBfX0lQVV9ESVNQMF9EQVRfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDBfX0dQSU80XzIxCQkoX01YNTNfUEFEX0RJU1AwX0RBVDBfX0dQSU80XzIxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fQ1NQSV9TQ0xLCQkoX01YNTNfUEFEX0RJU1AwX0RBVDBfX0NTUElfU0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDBfX1VTQk9IM19VU0JIMl9EQVRBXzAJCShfTVg1M19QQURfRElTUDBfREFUMF9fVVNCT0gzX1VTQkgyX0RBVEFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDBfX1NETUFfREVCVUdfQ09SRV9SVU4JCShfTVg1M19QQURfRElTUDBfREFUMF9fU0RNQV9ERUJVR19DT1JFX1JVTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDBfX0VNSV9FTUlfREVCVUdfNQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQwX19FTUlfRU1JX0RFQlVHXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQwX19VU0JQSFkyX1RYUkVBRFkJCShfTVg1M19QQURfRElTUDBfREFUMF9fVVNCUEhZMl9UWFJFQURZIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fSVBVX0RJU1AwX0RBVF8xCQkoX01YNTNfUEFEX0RJU1AwX0RBVDFfX0lQVV9ESVNQMF9EQVRfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDFfX0dQSU80XzIyCQkoX01YNTNfUEFEX0RJU1AwX0RBVDFfX0dQSU80XzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fQ1NQSV9NT1NJCQkoX01YNTNfUEFEX0RJU1AwX0RBVDFfX0NTUElfTU9TSSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDFfX1VTQk9IM19VU0JIMl9EQVRBXzEJCShfTVg1M19QQURfRElTUDBfREFUMV9fVVNCT0gzX1VTQkgyX0RBVEFfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDFfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF9TRUwJCShfTVg1M19QQURfRElTUDBfREFUMV9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMX1NFTCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDFfX0VNSV9FTUlfREVCVUdfNgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxX19FTUlfRU1JX0RFQlVHXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxX19VU0JQSFkyX1JYVkFMSUQJCShfTVg1M19QQURfRElTUDBfREFUMV9fVVNCUEhZMl9SWFZBTElEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fSVBVX0RJU1AwX0RBVF8yCQkoX01YNTNfUEFEX0RJU1AwX0RBVDJfX0lQVV9ESVNQMF9EQVRfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDJfX0dQSU80XzIzCQkoX01YNTNfUEFEX0RJU1AwX0RBVDJfX0dQSU80XzIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fQ1NQSV9NSVNPCQkoX01YNTNfUEFEX0RJU1AwX0RBVDJfX0NTUElfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDJfX1VTQk9IM19VU0JIMl9EQVRBXzIJCShfTVg1M19QQURfRElTUDBfREFUMl9fVVNCT0gzX1VTQkgyX0RBVEFfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDJfX1NETUFfREVCVUdfTU9ERQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyX19TRE1BX0RFQlVHX01PREUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyX19FTUlfRU1JX0RFQlVHXzcJCShfTVg1M19QQURfRElTUDBfREFUMl9fRU1JX0VNSV9ERUJVR183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fVVNCUEhZMl9SWEFDVElWRQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyX19VU0JQSFkyX1JYQUNUSVZFIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUM19fSVBVX0RJU1AwX0RBVF8zCQkoX01YNTNfUEFEX0RJU1AwX0RBVDNfX0lQVV9ESVNQMF9EQVRfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX0dQSU80XzI0CQkoX01YNTNfUEFEX0RJU1AwX0RBVDNfX0dQSU80XzI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUM19fQ1NQSV9TUzAJCShfTVg1M19QQURfRElTUDBfREFUM19fQ1NQSV9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQzX19VU0JPSDNfVVNCSDJfREFUQV8zCQkoX01YNTNfUEFEX0RJU1AwX0RBVDNfX1VTQk9IM19VU0JIMl9EQVRBXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQzX19TRE1BX0RFQlVHX0JVU19FUlJPUgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQzX19TRE1BX0RFQlVHX0JVU19FUlJPUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX0VNSV9FTUlfREVCVUdfOAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQzX19FTUlfRU1JX0RFQlVHXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQzX19VU0JQSFkyX1JYRVJST1IJCShfTVg1M19QQURfRElTUDBfREFUM19fVVNCUEhZMl9SWEVSUk9SIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fSVBVX0RJU1AwX0RBVF80CQkoX01YNTNfUEFEX0RJU1AwX0RBVDRfX0lQVV9ESVNQMF9EQVRfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDRfX0dQSU80XzI1CQkoX01YNTNfUEFEX0RJU1AwX0RBVDRfX0dQSU80XzI1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fQ1NQSV9TUzEJCShfTVg1M19QQURfRElTUDBfREFUNF9fQ1NQSV9TUzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19VU0JPSDNfVVNCSDJfREFUQV80CQkoX01YNTNfUEFEX0RJU1AwX0RBVDRfX1VTQk9IM19VU0JIMl9EQVRBXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19TRE1BX0RFQlVHX0JVU19SV0IJCShfTVg1M19QQURfRElTUDBfREFUNF9fU0RNQV9ERUJVR19CVVNfUldCIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fRU1JX0VNSV9ERUJVR185CQkoX01YNTNfUEFEX0RJU1AwX0RBVDRfX0VNSV9FTUlfREVCVUdfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDRfX1VTQlBIWTJfU0lFQ0xPQ0sJCShfTVg1M19QQURfRElTUDBfREFUNF9fVVNCUEhZMl9TSUVDTE9DSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDVfX0lQVV9ESVNQMF9EQVRfNQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ1X19JUFVfRElTUDBfREFUXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ1X19HUElPNF8yNgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ1X19HUElPNF8yNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDVfX0NTUElfU1MyCQkoX01YNTNfUEFEX0RJU1AwX0RBVDVfX0NTUElfU1MyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fVVNCT0gzX1VTQkgyX0RBVEFfNQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ1X19VU0JPSDNfVVNCSDJfREFUQV81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fU0RNQV9ERUJVR19NQVRDSEVEX0RNQlVTCQkoX01YNTNfUEFEX0RJU1AwX0RBVDVfX1NETUFfREVCVUdfTUFUQ0hFRF9ETUJVUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDVfX0VNSV9FTUlfREVCVUdfMTAJCShfTVg1M19QQURfRElTUDBfREFUNV9fRU1JX0VNSV9ERUJVR18xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDVfX1VTQlBIWTJfTElORVNUQVRFXzAJCShfTVg1M19QQURfRElTUDBfREFUNV9fVVNCUEhZMl9MSU5FU1RBVEVfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDZfX0lQVV9ESVNQMF9EQVRfNgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19JUFVfRElTUDBfREFUXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ2X19HUElPNF8yNwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19HUElPNF8yNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDZfX0NTUElfU1MzCQkoX01YNTNfUEFEX0RJU1AwX0RBVDZfX0NTUElfU1MzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fVVNCT0gzX1VTQkgyX0RBVEFfNgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19VU0JPSDNfVVNCSDJfREFUQV82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fU0RNQV9ERUJVR19SVEJVRkZFUl9XUklURQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19TRE1BX0RFQlVHX1JUQlVGRkVSX1dSSVRFIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fRU1JX0VNSV9ERUJVR18xMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19FTUlfRU1JX0RFQlVHXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fVVNCUEhZMl9MSU5FU1RBVEVfMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19VU0JQSFkyX0xJTkVTVEFURV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUN19fSVBVX0RJU1AwX0RBVF83CQkoX01YNTNfUEFEX0RJU1AwX0RBVDdfX0lQVV9ESVNQMF9EQVRfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX0dQSU80XzI4CQkoX01YNTNfUEFEX0RJU1AwX0RBVDdfX0dQSU80XzI4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUN19fQ1NQSV9SRFkJCShfTVg1M19QQURfRElTUDBfREFUN19fQ1NQSV9SRFkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ3X19VU0JPSDNfVVNCSDJfREFUQV83CQkoX01YNTNfUEFEX0RJU1AwX0RBVDdfX1VTQk9IM19VU0JIMl9EQVRBXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ3X19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ3X19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX0VNSV9FTUlfREVCVUdfMTIJCShfTVg1M19QQURfRElTUDBfREFUN19fRU1JX0VNSV9ERUJVR18xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX1VTQlBIWTJfVkJVU1ZBTElECQkoX01YNTNfUEFEX0RJU1AwX0RBVDdfX1VTQlBIWTJfVkJVU1ZBTElEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fSVBVX0RJU1AwX0RBVF84CQkoX01YNTNfUEFEX0RJU1AwX0RBVDhfX0lQVV9ESVNQMF9EQVRfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX0dQSU80XzI5CQkoX01YNTNfUEFEX0RJU1AwX0RBVDhfX0dQSU80XzI5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fUFdNMV9QV01PCQkoX01YNTNfUEFEX0RJU1AwX0RBVDhfX1BXTTFfUFdNTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX1dET0cxX1dET0dfQgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ4X19XRE9HMV9XRE9HX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ4X19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ4X19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX0VNSV9FTUlfREVCVUdfMTMJCShfTVg1M19QQURfRElTUDBfREFUOF9fRU1JX0VNSV9ERUJVR18xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX1VTQlBIWTJfQVZBTElECQkoX01YNTNfUEFEX0RJU1AwX0RBVDhfX1VTQlBIWTJfQVZBTElEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fSVBVX0RJU1AwX0RBVF85CQkoX01YNTNfUEFEX0RJU1AwX0RBVDlfX0lQVV9ESVNQMF9EQVRfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX0dQSU80XzMwCQkoX01YNTNfUEFEX0RJU1AwX0RBVDlfX0dQSU80XzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fUFdNMl9QV01PCQkoX01YNTNfUEFEX0RJU1AwX0RBVDlfX1BXTTJfUFdNTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX1dET0cyX1dET0dfQgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ5X19XRE9HMl9XRE9HX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ5X19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ5X19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX0VNSV9FTUlfREVCVUdfMTQJCShfTVg1M19QQURfRElTUDBfREFUOV9fRU1JX0VNSV9ERUJVR18xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX1VTQlBIWTJfVlNUQVRVU18wCQkoX01YNTNfUEFEX0RJU1AwX0RBVDlfX1VTQlBIWTJfVlNUQVRVU18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTBfX0lQVV9ESVNQMF9EQVRfMTAJCShfTVg1M19QQURfRElTUDBfREFUMTBfX0lQVV9ESVNQMF9EQVRfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMF9fR1BJTzRfMzEJCShfTVg1M19QQURfRElTUDBfREFUMTBfX0dQSU80XzMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTBfX1VTQk9IM19VU0JIMl9TVFAJCShfTVg1M19QQURfRElTUDBfREFUMTBfX1VTQk9IM19VU0JIMl9TVFAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMF9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzMJCShfTVg1M19QQURfRElTUDBfREFUMTBfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTBfX0VNSV9FTUlfREVCVUdfMTUJCShfTVg1M19QQURfRElTUDBfREFUMTBfX0VNSV9FTUlfREVCVUdfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMF9fVVNCUEhZMl9WU1RBVFVTXzEJCShfTVg1M19QQURfRElTUDBfREFUMTBfX1VTQlBIWTJfVlNUQVRVU18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTFfX0lQVV9ESVNQMF9EQVRfMTEJCShfTVg1M19QQURfRElTUDBfREFUMTFfX0lQVV9ESVNQMF9EQVRfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMV9fR1BJTzVfNQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMV9fR1BJTzVfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDExX19VU0JPSDNfVVNCSDJfTlhUCQkoX01YNTNfUEFEX0RJU1AwX0RBVDExX19VU0JPSDNfVVNCSDJfTlhUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTFfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF80CQkoX01YNTNfUEFEX0RJU1AwX0RBVDExX19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDExX19FTUlfRU1JX0RFQlVHXzE2CQkoX01YNTNfUEFEX0RJU1AwX0RBVDExX19FTUlfRU1JX0RFQlVHXzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTFfX1VTQlBIWTJfVlNUQVRVU18yCQkoX01YNTNfUEFEX0RJU1AwX0RBVDExX19VU0JQSFkyX1ZTVEFUVVNfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEyX19JUFVfRElTUDBfREFUXzEyCQkoX01YNTNfUEFEX0RJU1AwX0RBVDEyX19JUFVfRElTUDBfREFUXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTJfX0dQSU81XzYJCShfTVg1M19QQURfRElTUDBfREFUMTJfX0dQSU81XzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMl9fVVNCT0gzX1VTQkgyX0NMSwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMl9fVVNCT0gzX1VTQkgyX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEyX19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfNQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMl9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMl9fRU1JX0VNSV9ERUJVR18xNwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMl9fRU1JX0VNSV9ERUJVR18xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEyX19VU0JQSFkyX1ZTVEFUVVNfMwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMl9fVVNCUEhZMl9WU1RBVFVTXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxM19fSVBVX0RJU1AwX0RBVF8xMwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxM19fSVBVX0RJU1AwX0RBVF8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEzX19HUElPNV83CQkoX01YNTNfUEFEX0RJU1AwX0RBVDEzX19HUElPNV83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTNfX0FVRE1VWF9BVUQ1X1JYRlMJCShfTVg1M19QQURfRElTUDBfREFUMTNfX0FVRE1VWF9BVUQ1X1JYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxM19fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzAJCShfTVg1M19QQURfRElTUDBfREFUMTNfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTNfX0VNSV9FTUlfREVCVUdfMTgJCShfTVg1M19QQURfRElTUDBfREFUMTNfX0VNSV9FTUlfREVCVUdfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxM19fVVNCUEhZMl9WU1RBVFVTXzQJCShfTVg1M19QQURfRElTUDBfREFUMTNfX1VTQlBIWTJfVlNUQVRVU180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTRfX0lQVV9ESVNQMF9EQVRfMTQJCShfTVg1M19QQURfRElTUDBfREFUMTRfX0lQVV9ESVNQMF9EQVRfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNF9fR1BJTzVfOAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fR1BJTzVfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE0X19BVURNVVhfQVVENV9SWEMJCShfTVg1M19QQURfRElTUDBfREFUMTRfX0FVRE1VWF9BVUQ1X1JYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE0X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNF9fRU1JX0VNSV9ERUJVR18xOQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fRU1JX0VNSV9ERUJVR18xOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE0X19VU0JQSFkyX1ZTVEFUVVNfNQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fVVNCUEhZMl9WU1RBVFVTXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNV9fSVBVX0RJU1AwX0RBVF8xNQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fSVBVX0RJU1AwX0RBVF8xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19HUElPNV85CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE1X19HUElPNV85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTVfX0VDU1BJMV9TUzEJCShfTVg1M19QQURfRElTUDBfREFUMTVfX0VDU1BJMV9TUzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNV9fRUNTUEkyX1NTMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fRUNTUEkyX1NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNV9fRU1JX0VNSV9ERUJVR18yMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fRU1JX0VNSV9ERUJVR18yMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19VU0JQSFkyX1ZTVEFUVVNfNgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fVVNCUEhZMl9WU1RBVFVTXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fSVBVX0RJU1AwX0RBVF8xNgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fSVBVX0RJU1AwX0RBVF8xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19HUElPNV8xMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fR1BJTzVfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fRUNTUEkyX01PU0kJCShfTVg1M19QQURfRElTUDBfREFUMTZfX0VDU1BJMl9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX0FVRE1VWF9BVUQ1X1RYQwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fQVVETVVYX0FVRDVfVFhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX1NETUFfRVhUX0VWRU5UXzAJCShfTVg1M19QQURfRElTUDBfREFUMTZfX1NETUFfRVhUX0VWRU5UXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzMJCShfTVg1M19QQURfRElTUDBfREFUMTZfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU18zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX0VNSV9FTUlfREVCVUdfMjEJCShfTVg1M19QQURfRElTUDBfREFUMTZfX0VNSV9FTUlfREVCVUdfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fVVNCUEhZMl9WU1RBVFVTXzcJCShfTVg1M19QQURfRElTUDBfREFUMTZfX1VTQlBIWTJfVlNUQVRVU183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTdfX0lQVV9ESVNQMF9EQVRfMTcJCShfTVg1M19QQURfRElTUDBfREFUMTdfX0lQVV9ESVNQMF9EQVRfMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxN19fR1BJTzVfMTEJCShfTVg1M19QQURfRElTUDBfREFUMTdfX0dQSU81XzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTdfX0VDU1BJMl9NSVNPCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE3X19FQ1NQSTJfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19BVURNVVhfQVVENV9UWEQJCShfTVg1M19QQURfRElTUDBfREFUMTdfX0FVRE1VWF9BVUQ1X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19TRE1BX0VYVF9FVkVOVF8xCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE3X19TRE1BX0VYVF9FVkVOVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTdfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU180CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE3X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19FTUlfRU1JX0RFQlVHXzIyCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE3X19FTUlfRU1JX0RFQlVHXzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX0lQVV9ESVNQMF9EQVRfMTgJCShfTVg1M19QQURfRElTUDBfREFUMThfX0lQVV9ESVNQMF9EQVRfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fR1BJTzVfMTIJCShfTVg1M19QQURfRElTUDBfREFUMThfX0dQSU81XzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX0VDU1BJMl9TUzAJCShfTVg1M19QQURfRElTUDBfREFUMThfX0VDU1BJMl9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fQVVETVVYX0FVRDVfVFhGUwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOF9fQVVETVVYX0FVRDVfVFhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19BVURNVVhfQVVENF9SWEZTCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE4X19BVURNVVhfQVVENF9SWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU181CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE4X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19FTUlfRU1JX0RFQlVHXzIzCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE4X19FTUlfRU1JX0RFQlVHXzIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX0VNSV9XRUlNX0NTXzIJCShfTVg1M19QQURfRElTUDBfREFUMThfX0VNSV9XRUlNX0NTXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fSVBVX0RJU1AwX0RBVF8xOQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fSVBVX0RJU1AwX0RBVF8xOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19HUElPNV8xMwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fR1BJTzVfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fRUNTUEkyX1NDTEsJCShfTVg1M19QQURfRElTUDBfREFUMTlfX0VDU1BJMl9TQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX0FVRE1VWF9BVUQ1X1JYRAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fQVVETVVYX0FVRDVfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX0FVRE1VWF9BVUQ0X1JYQwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fQVVETVVYX0FVRDRfUlhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU182CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE5X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19FTUlfRU1JX0RFQlVHXzI0CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE5X19FTUlfRU1JX0RFQlVHXzI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX0VNSV9XRUlNX0NTXzMJCShfTVg1M19QQURfRElTUDBfREFUMTlfX0VNSV9XRUlNX0NTXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMF9fSVBVX0RJU1AwX0RBVF8yMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMF9fSVBVX0RJU1AwX0RBVF8yMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIwX19HUElPNV8xNAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMF9fR1BJTzVfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMF9fRUNTUEkxX1NDTEsJCShfTVg1M19QQURfRElTUDBfREFUMjBfX0VDU1BJMV9TQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX0FVRE1VWF9BVUQ0X1RYQwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMF9fQVVETVVYX0FVRDRfVFhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU183CQkoX01YNTNfUEFEX0RJU1AwX0RBVDIwX19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIwX19FTUlfRU1JX0RFQlVHXzI1CQkoX01YNTNfUEFEX0RJU1AwX0RBVDIwX19FTUlfRU1JX0RFQlVHXzI1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX1NBVEFfUEhZX1RESQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMF9fU0FUQV9QSFlfVERJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjFfX0lQVV9ESVNQMF9EQVRfMjEJCShfTVg1M19QQURfRElTUDBfREFUMjFfX0lQVV9ESVNQMF9EQVRfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fR1BJTzVfMTUJCShfTVg1M19QQURfRElTUDBfREFUMjFfX0dQSU81XzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjFfX0VDU1BJMV9NT1NJCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIxX19FQ1NQSTFfTU9TSSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIxX19BVURNVVhfQVVENF9UWEQJCShfTVg1M19QQURfRElTUDBfREFUMjFfX0FVRE1VWF9BVUQ0X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIxX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fU0RNQV9ERUJVR19CVVNfREVWSUNFXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fRU1JX0VNSV9ERUJVR18yNgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fRU1JX0VNSV9ERUJVR18yNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIxX19TQVRBX1BIWV9URE8JCShfTVg1M19QQURfRElTUDBfREFUMjFfX1NBVEFfUEhZX1RETyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19JUFVfRElTUDBfREFUXzIyCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIyX19JUFVfRElTUDBfREFUXzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX0dQSU81XzE2CQkoX01YNTNfUEFEX0RJU1AwX0RBVDIyX19HUElPNV8xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19FQ1NQSTFfTUlTTwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fRUNTUEkxX01JU08gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMl9fQVVETVVYX0FVRDRfVFhGUwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fQVVETVVYX0FVRDRfVFhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fU0RNQV9ERUJVR19CVVNfREVWSUNFXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMl9fRU1JX0VNSV9ERUJVR18yNwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fRU1JX0VNSV9ERUJVR18yNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19TQVRBX1BIWV9UQ0sJCShfTVg1M19QQURfRElTUDBfREFUMjJfX1NBVEFfUEhZX1RDSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIzX19JUFVfRElTUDBfREFUXzIzCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIzX19JUFVfRElTUDBfREFUXzIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX0dQSU81XzE3CQkoX01YNTNfUEFEX0RJU1AwX0RBVDIzX19HUElPNV8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIzX19FQ1NQSTFfU1MwCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIzX19FQ1NQSTFfU1MwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX0FVRE1VWF9BVUQ0X1JYRAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyM19fQVVETVVYX0FVRDRfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX1NETUFfREVCVUdfQlVTX0RFVklDRV8yCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIzX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIzX19FTUlfRU1JX0RFQlVHXzI4CQkoX01YNTNfUEFEX0RJU1AwX0RBVDIzX19FTUlfRU1JX0RFQlVHXzI4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX1NBVEFfUEhZX1RNUwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyM19fU0FUQV9QSFlfVE1TIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9QSVhDTEtfX0lQVV9DU0kwX1BJWENMSwkJKF9NWDUzX1BBRF9DU0kwX1BJWENMS19fSVBVX0NTSTBfUElYQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9QSVhDTEtfX0dQSU81XzE4CQkoX01YNTNfUEFEX0NTSTBfUElYQ0xLX19HUElPNV8xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfUElYQ0xLX19TRE1BX0RFQlVHX1BDXzAJCShfTVg1M19QQURfQ1NJMF9QSVhDTEtfX1NETUFfREVCVUdfUENfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfUElYQ0xLX19FTUlfRU1JX0RFQlVHXzI5CQkoX01YNTNfUEFEX0NTSTBfUElYQ0xLX19FTUlfRU1JX0RFQlVHXzI5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19JUFVfQ1NJMF9IU1lOQwkJKF9NWDUzX1BBRF9DU0kwX01DTEtfX0lQVV9DU0kwX0hTWU5DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19HUElPNV8xOQkJKF9NWDUzX1BBRF9DU0kwX01DTEtfX0dQSU81XzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19DQ01fQ1NJMF9NQ0xLCQkoX01YNTNfUEFEX0NTSTBfTUNMS19fQ0NNX0NTSTBfTUNMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfTUNMS19fU0RNQV9ERUJVR19QQ18xCQkoX01YNTNfUEFEX0NTSTBfTUNMS19fU0RNQV9ERUJVR19QQ18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19FTUlfRU1JX0RFQlVHXzMwCQkoX01YNTNfUEFEX0NTSTBfTUNMS19fRU1JX0VNSV9ERUJVR18zMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfTUNMS19fVFBJVV9UUkNUTAkJKF9NWDUzX1BBRF9DU0kwX01DTEtfX1RQSVVfVFJDVEwgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVEFfRU5fX0lQVV9DU0kwX0RBVEFfRU4JCShfTVg1M19QQURfQ1NJMF9EQVRBX0VOX19JUFVfQ1NJMF9EQVRBX0VOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVRBX0VOX19HUElPNV8yMAkJKF9NWDUzX1BBRF9DU0kwX0RBVEFfRU5fX0dQSU81XzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVRBX0VOX19TRE1BX0RFQlVHX1BDXzIJCShfTVg1M19QQURfQ1NJMF9EQVRBX0VOX19TRE1BX0RFQlVHX1BDXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVEFfRU5fX0VNSV9FTUlfREVCVUdfMzEJCShfTVg1M19QQURfQ1NJMF9EQVRBX0VOX19FTUlfRU1JX0RFQlVHXzMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVRBX0VOX19UUElVX1RSQ0xLCQkoX01YNTNfUEFEX0NTSTBfREFUQV9FTl9fVFBJVV9UUkNMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfVlNZTkNfX0lQVV9DU0kwX1ZTWU5DCQkoX01YNTNfUEFEX0NTSTBfVlNZTkNfX0lQVV9DU0kwX1ZTWU5DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9WU1lOQ19fR1BJTzVfMjEJCShfTVg1M19QQURfQ1NJMF9WU1lOQ19fR1BJTzVfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX1ZTWU5DX19TRE1BX0RFQlVHX1BDXzMJCShfTVg1M19QQURfQ1NJMF9WU1lOQ19fU0RNQV9ERUJVR19QQ18zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9WU1lOQ19fRU1JX0VNSV9ERUJVR18zMgkJKF9NWDUzX1BBRF9DU0kwX1ZTWU5DX19FTUlfRU1JX0RFQlVHXzMyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9WU1lOQ19fVFBJVV9UUkFDRV8wCQkoX01YNTNfUEFEX0NTSTBfVlNZTkNfX1RQSVVfVFJBQ0VfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fSVBVX0NTSTBfRF80CQkoX01YNTNfUEFEX0NTSTBfREFUNF9fSVBVX0NTSTBfRF80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ0X19HUElPNV8yMgkJKF9NWDUzX1BBRF9DU0kwX0RBVDRfX0dQSU81XzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ0X19LUFBfQ09MXzUJCShfTVg1M19QQURfQ1NJMF9EQVQ0X19LUFBfQ09MXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX0VDU1BJMV9TQ0xLCQkoX01YNTNfUEFEX0NTSTBfREFUNF9fRUNTUEkxX1NDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX1VTQk9IM19VU0JIM19TVFAJCShfTVg1M19QQURfQ1NJMF9EQVQ0X19VU0JPSDNfVVNCSDNfU1RQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ0X19BVURNVVhfQVVEM19UWEMJCShfTVg1M19QQURfQ1NJMF9EQVQ0X19BVURNVVhfQVVEM19UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX0VNSV9FTUlfREVCVUdfMzMJCShfTVg1M19QQURfQ1NJMF9EQVQ0X19FTUlfRU1JX0RFQlVHXzMzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ0X19UUElVX1RSQUNFXzEJCShfTVg1M19QQURfQ1NJMF9EQVQ0X19UUElVX1RSQUNFXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX0lQVV9DU0kwX0RfNQkJKF9NWDUzX1BBRF9DU0kwX0RBVDVfX0lQVV9DU0kwX0RfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fR1BJTzVfMjMJCShfTVg1M19QQURfQ1NJMF9EQVQ1X19HUElPNV8yMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fS1BQX1JPV181CQkoX01YNTNfUEFEX0NTSTBfREFUNV9fS1BQX1JPV181IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19FQ1NQSTFfTU9TSQkJKF9NWDUzX1BBRF9DU0kwX0RBVDVfX0VDU1BJMV9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19VU0JPSDNfVVNCSDNfTlhUCQkoX01YNTNfUEFEX0NTSTBfREFUNV9fVVNCT0gzX1VTQkgzX05YVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fQVVETVVYX0FVRDNfVFhECQkoX01YNTNfUEFEX0NTSTBfREFUNV9fQVVETVVYX0FVRDNfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19FTUlfRU1JX0RFQlVHXzM0CQkoX01YNTNfUEFEX0NTSTBfREFUNV9fRU1JX0VNSV9ERUJVR18zNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fVFBJVV9UUkFDRV8yCQkoX01YNTNfUEFEX0NTSTBfREFUNV9fVFBJVV9UUkFDRV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ2X19JUFVfQ1NJMF9EXzYJCShfTVg1M19QQURfQ1NJMF9EQVQ2X19JUFVfQ1NJMF9EXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0dQSU81XzI0CQkoX01YNTNfUEFEX0NTSTBfREFUNl9fR1BJTzVfMjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0tQUF9DT0xfNgkJKF9NWDUzX1BBRF9DU0kwX0RBVDZfX0tQUF9DT0xfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fRUNTUEkxX01JU08JCShfTVg1M19QQURfQ1NJMF9EQVQ2X19FQ1NQSTFfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fVVNCT0gzX1VTQkgzX0NMSwkJKF9NWDUzX1BBRF9DU0kwX0RBVDZfX1VTQk9IM19VU0JIM19DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0FVRE1VWF9BVUQzX1RYRlMJCShfTVg1M19QQURfQ1NJMF9EQVQ2X19BVURNVVhfQVVEM19UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ2X19FTUlfRU1JX0RFQlVHXzM1CQkoX01YNTNfUEFEX0NTSTBfREFUNl9fRU1JX0VNSV9ERUJVR18zNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fVFBJVV9UUkFDRV8zCQkoX01YNTNfUEFEX0NTSTBfREFUNl9fVFBJVV9UUkFDRV8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19JUFVfQ1NJMF9EXzcJCShfTVg1M19QQURfQ1NJMF9EQVQ3X19JUFVfQ1NJMF9EXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX0dQSU81XzI1CQkoX01YNTNfUEFEX0NTSTBfREFUN19fR1BJTzVfMjUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX0tQUF9ST1dfNgkJKF9NWDUzX1BBRF9DU0kwX0RBVDdfX0tQUF9ST1dfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUN19fRUNTUEkxX1NTMAkJKF9NWDUzX1BBRF9DU0kwX0RBVDdfX0VDU1BJMV9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX1VTQk9IM19VU0JIM19ESVIJCShfTVg1M19QQURfQ1NJMF9EQVQ3X19VU0JPSDNfVVNCSDNfRElSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19BVURNVVhfQVVEM19SWEQJCShfTVg1M19QQURfQ1NJMF9EQVQ3X19BVURNVVhfQVVEM19SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX0VNSV9FTUlfREVCVUdfMzYJCShfTVg1M19QQURfQ1NJMF9EQVQ3X19FTUlfRU1JX0RFQlVHXzM2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19UUElVX1RSQUNFXzQJCShfTVg1M19QQURfQ1NJMF9EQVQ3X19UUElVX1RSQUNFXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0lQVV9DU0kwX0RfOAkJKF9NWDUzX1BBRF9DU0kwX0RBVDhfX0lQVV9DU0kwX0RfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOF9fR1BJTzVfMjYJCShfTVg1M19QQURfQ1NJMF9EQVQ4X19HUElPNV8yNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOF9fS1BQX0NPTF83CQkoX01YNTNfUEFEX0NTSTBfREFUOF9fS1BQX0NPTF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19FQ1NQSTJfU0NMSwkJKF9NWDUzX1BBRF9DU0kwX0RBVDhfX0VDU1BJMl9TQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19VU0JPSDNfVVNCSDNfT0MJCShfTVg1M19QQURfQ1NJMF9EQVQ4X19VU0JPSDNfVVNCSDNfT0MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0kyQzFfU0RBCQkoX01YNTNfUEFEX0NTSTBfREFUOF9fSTJDMV9TREEgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19FTUlfRU1JX0RFQlVHXzM3CQkoX01YNTNfUEFEX0NTSTBfREFUOF9fRU1JX0VNSV9ERUJVR18zNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOF9fVFBJVV9UUkFDRV81CQkoX01YNTNfUEFEX0NTSTBfREFUOF9fVFBJVV9UUkFDRV81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19JUFVfQ1NJMF9EXzkJCShfTVg1M19QQURfQ1NJMF9EQVQ5X19JUFVfQ1NJMF9EXzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX0dQSU81XzI3CQkoX01YNTNfUEFEX0NTSTBfREFUOV9fR1BJTzVfMjcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX0tQUF9ST1dfNwkJKF9NWDUzX1BBRF9DU0kwX0RBVDlfX0tQUF9ST1dfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fRUNTUEkyX01PU0kJCShfTVg1M19QQURfQ1NJMF9EQVQ5X19FQ1NQSTJfTU9TSSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fVVNCT0gzX1VTQkgzX1BXUgkJKF9NWDUzX1BBRF9DU0kwX0RBVDlfX1VTQk9IM19VU0JIM19QV1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX0kyQzFfU0NMCQkoX01YNTNfUEFEX0NTSTBfREFUOV9fSTJDMV9TQ0wgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19FTUlfRU1JX0RFQlVHXzM4CQkoX01YNTNfUEFEX0NTSTBfREFUOV9fRU1JX0VNSV9ERUJVR18zOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fVFBJVV9UUkFDRV82CQkoX01YNTNfUEFEX0NTSTBfREFUOV9fVFBJVV9UUkFDRV82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fSVBVX0NTSTBfRF8xMAkJKF9NWDUzX1BBRF9DU0kwX0RBVDEwX19JUFVfQ1NJMF9EXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fR1BJTzVfMjgJCShfTVg1M19QQURfQ1NJMF9EQVQxMF9fR1BJTzVfMjggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19VQVJUMV9UWERfTVVYCQkoX01YNTNfUEFEX0NTSTBfREFUMTBfX1VBUlQxX1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fRUNTUEkyX01JU08JCShfTVg1M19QQURfQ1NJMF9EQVQxMF9fRUNTUEkyX01JU08gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19BVURNVVhfQVVEM19SWEMJCShfTVg1M19QQURfQ1NJMF9EQVQxMF9fQVVETVVYX0FVRDNfUlhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fU0RNQV9ERUJVR19QQ180CQkoX01YNTNfUEFEX0NTSTBfREFUMTBfX1NETUFfREVCVUdfUENfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX0VNSV9FTUlfREVCVUdfMzkJCShfTVg1M19QQURfQ1NJMF9EQVQxMF9fRU1JX0VNSV9ERUJVR18zOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX1RQSVVfVFJBQ0VfNwkJKF9NWDUzX1BBRF9DU0kwX0RBVDEwX19UUElVX1RSQUNFXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19JUFVfQ1NJMF9EXzExCQkoX01YNTNfUEFEX0NTSTBfREFUMTFfX0lQVV9DU0kwX0RfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19HUElPNV8yOQkJKF9NWDUzX1BBRF9DU0kwX0RBVDExX19HUElPNV8yOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX1VBUlQxX1JYRF9NVVgJCShfTVg1M19QQURfQ1NJMF9EQVQxMV9fVUFSVDFfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19FQ1NQSTJfU1MwCQkoX01YNTNfUEFEX0NTSTBfREFUMTFfX0VDU1BJMl9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19BVURNVVhfQVVEM19SWEZTCQkoX01YNTNfUEFEX0NTSTBfREFUMTFfX0FVRE1VWF9BVUQzX1JYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19TRE1BX0RFQlVHX1BDXzUJCShfTVg1M19QQURfQ1NJMF9EQVQxMV9fU0RNQV9ERUJVR19QQ181IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fRU1JX0VNSV9ERUJVR180MAkJKF9NWDUzX1BBRF9DU0kwX0RBVDExX19FTUlfRU1JX0RFQlVHXzQwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fVFBJVV9UUkFDRV84CQkoX01YNTNfUEFEX0NTSTBfREFUMTFfX1RQSVVfVFJBQ0VfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX0lQVV9DU0kwX0RfMTIJCShfTVg1M19QQURfQ1NJMF9EQVQxMl9fSVBVX0NTSTBfRF8xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX0dQSU81XzMwCQkoX01YNTNfUEFEX0NTSTBfREFUMTJfX0dQSU81XzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fVUFSVDRfVFhEX01VWAkJKF9NWDUzX1BBRF9DU0kwX0RBVDEyX19VQVJUNF9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX1VTQk9IM19VU0JIM19EQVRBXzAJCShfTVg1M19QQURfQ1NJMF9EQVQxMl9fVVNCT0gzX1VTQkgzX0RBVEFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX1NETUFfREVCVUdfUENfNgkJKF9NWDUzX1BBRF9DU0kwX0RBVDEyX19TRE1BX0RFQlVHX1BDXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEyX19FTUlfRU1JX0RFQlVHXzQxCQkoX01YNTNfUEFEX0NTSTBfREFUMTJfX0VNSV9FTUlfREVCVUdfNDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEyX19UUElVX1RSQUNFXzkJCShfTVg1M19QQURfQ1NJMF9EQVQxMl9fVFBJVV9UUkFDRV85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fSVBVX0NTSTBfRF8xMwkJKF9NWDUzX1BBRF9DU0kwX0RBVDEzX19JUFVfQ1NJMF9EXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fR1BJTzVfMzEJCShfTVg1M19QQURfQ1NJMF9EQVQxM19fR1BJTzVfMzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19VQVJUNF9SWERfTVVYCQkoX01YNTNfUEFEX0NTSTBfREFUMTNfX1VBUlQ0X1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fVVNCT0gzX1VTQkgzX0RBVEFfMQkJKF9NWDUzX1BBRF9DU0kwX0RBVDEzX19VU0JPSDNfVVNCSDNfREFUQV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fU0RNQV9ERUJVR19QQ183CQkoX01YNTNfUEFEX0NTSTBfREFUMTNfX1NETUFfREVCVUdfUENfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTNfX0VNSV9FTUlfREVCVUdfNDIJCShfTVg1M19QQURfQ1NJMF9EQVQxM19fRU1JX0VNSV9ERUJVR180MiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTNfX1RQSVVfVFJBQ0VfMTAJCShfTVg1M19QQURfQ1NJMF9EQVQxM19fVFBJVV9UUkFDRV8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX0lQVV9DU0kwX0RfMTQJCShfTVg1M19QQURfQ1NJMF9EQVQxNF9fSVBVX0NTSTBfRF8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX0dQSU82XzAJCShfTVg1M19QQURfQ1NJMF9EQVQxNF9fR1BJTzZfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX1VBUlQ1X1RYRF9NVVgJCShfTVg1M19QQURfQ1NJMF9EQVQxNF9fVUFSVDVfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19VU0JPSDNfVVNCSDNfREFUQV8yCQkoX01YNTNfUEFEX0NTSTBfREFUMTRfX1VTQk9IM19VU0JIM19EQVRBXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19TRE1BX0RFQlVHX1BDXzgJCShfTVg1M19QQURfQ1NJMF9EQVQxNF9fU0RNQV9ERUJVR19QQ184IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fRU1JX0VNSV9ERUJVR180MwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19FTUlfRU1JX0RFQlVHXzQzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fVFBJVV9UUkFDRV8xMQkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19UUElVX1RSQUNFXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fSVBVX0NTSTBfRF8xNQkJKF9NWDUzX1BBRF9DU0kwX0RBVDE1X19JUFVfQ1NJMF9EXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fR1BJTzZfMQkJKF9NWDUzX1BBRF9DU0kwX0RBVDE1X19HUElPNl8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fVUFSVDVfUlhEX01VWAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE1X19VQVJUNV9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX1VTQk9IM19VU0JIM19EQVRBXzMJCShfTVg1M19QQURfQ1NJMF9EQVQxNV9fVVNCT0gzX1VTQkgzX0RBVEFfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX1NETUFfREVCVUdfUENfOQkJKF9NWDUzX1BBRF9DU0kwX0RBVDE1X19TRE1BX0RFQlVHX1BDXzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19FTUlfRU1JX0RFQlVHXzQ0CQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX0VNSV9FTUlfREVCVUdfNDQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19UUElVX1RSQUNFXzEyCQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX1RQSVVfVFJBQ0VfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE2X19JUFVfQ1NJMF9EXzE2CQkoX01YNTNfUEFEX0NTSTBfREFUMTZfX0lQVV9DU0kwX0RfMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE2X19HUElPNl8yCQkoX01YNTNfUEFEX0NTSTBfREFUMTZfX0dQSU82XzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE2X19VQVJUNF9SVFMJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fVUFSVDRfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1VTQk9IM19VU0JIM19EQVRBXzQJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fVVNCT0gzX1VTQkgzX0RBVEFfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1NETUFfREVCVUdfUENfMTAJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fU0RNQV9ERUJVR19QQ18xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX0VNSV9FTUlfREVCVUdfNDUJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fRU1JX0VNSV9ERUJVR180NSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1RQSVVfVFJBQ0VfMTMJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fVFBJVV9UUkFDRV8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX0lQVV9DU0kwX0RfMTcJCShfTVg1M19QQURfQ1NJMF9EQVQxN19fSVBVX0NTSTBfRF8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX0dQSU82XzMJCShfTVg1M19QQURfQ1NJMF9EQVQxN19fR1BJTzZfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX1VBUlQ0X0NUUwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE3X19VQVJUNF9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fVVNCT0gzX1VTQkgzX0RBVEFfNQkJKF9NWDUzX1BBRF9DU0kwX0RBVDE3X19VU0JPSDNfVVNCSDNfREFUQV81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fU0RNQV9ERUJVR19QQ18xMQkJKF9NWDUzX1BBRF9DU0kwX0RBVDE3X19TRE1BX0RFQlVHX1BDXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fRU1JX0VNSV9ERUJVR180NgkJKF9NWDUzX1BBRF9DU0kwX0RBVDE3X19FTUlfRU1JX0RFQlVHXzQ2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fVFBJVV9UUkFDRV8xNAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE3X19UUElVX1RSQUNFXzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOF9fSVBVX0NTSTBfRF8xOAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE4X19JUFVfQ1NJMF9EXzE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOF9fR1BJTzZfNAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE4X19HUElPNl80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOF9fVUFSVDVfUlRTCQkoX01YNTNfUEFEX0NTSTBfREFUMThfX1VBUlQ1X1JUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19VU0JPSDNfVVNCSDNfREFUQV82CQkoX01YNTNfUEFEX0NTSTBfREFUMThfX1VTQk9IM19VU0JIM19EQVRBXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19TRE1BX0RFQlVHX1BDXzEyCQkoX01YNTNfUEFEX0NTSTBfREFUMThfX1NETUFfREVCVUdfUENfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19FTUlfRU1JX0RFQlVHXzQ3CQkoX01YNTNfUEFEX0NTSTBfREFUMThfX0VNSV9FTUlfREVCVUdfNDcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19UUElVX1RSQUNFXzE1CQkoX01YNTNfUEFEX0NTSTBfREFUMThfX1RQSVVfVFJBQ0VfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE5X19JUFVfQ1NJMF9EXzE5CQkoX01YNTNfUEFEX0NTSTBfREFUMTlfX0lQVV9DU0kwX0RfMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE5X19HUElPNl81CQkoX01YNTNfUEFEX0NTSTBfREFUMTlfX0dQSU82XzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE5X19VQVJUNV9DVFMJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fVUFSVDVfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX1VTQk9IM19VU0JIM19EQVRBXzcJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fVVNCT0gzX1VTQkgzX0RBVEFfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX1NETUFfREVCVUdfUENfMTMJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fU0RNQV9ERUJVR19QQ18xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX0VNSV9FTUlfREVCVUdfNDgJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fRU1JX0VNSV9ERUJVR180OCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX1VTQlBIWTJfQklTVE9LCQkoX01YNTNfUEFEX0NTSTBfREFUMTlfX1VTQlBIWTJfQklTVE9LIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNV9fRU1JX1dFSU1fQV8yNQkJKF9NWDUzX1BBRF9FSU1fQTI1X19FTUlfV0VJTV9BXzI1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNV9fR1BJTzVfMgkJKF9NWDUzX1BBRF9FSU1fQTI1X19HUElPNV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNV9fRUNTUEkyX1JEWQkJKF9NWDUzX1BBRF9FSU1fQTI1X19FQ1NQSTJfUkRZIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNV9fSVBVX0RJMV9QSU4xMgkJKF9NWDUzX1BBRF9FSU1fQTI1X19JUFVfREkxX1BJTjEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNV9fQ1NQSV9TUzEJCShfTVg1M19QQURfRUlNX0EyNV9fQ1NQSV9TUzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19JUFVfREkwX0QxX0NTCQkoX01YNTNfUEFEX0VJTV9BMjVfX0lQVV9ESTBfRDFfQ1MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19VU0JQSFkxX0JJU1RPSwkJKF9NWDUzX1BBRF9FSU1fQTI1X19VU0JQSFkxX0JJU1RPSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjJfX0VNSV9XRUlNX0VCXzIJCShfTVg1M19QQURfRUlNX0VCMl9fRU1JX1dFSU1fRUJfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjJfX0dQSU8yXzMwCQkoX01YNTNfUEFEX0VJTV9FQjJfX0dQSU8yXzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fQ0NNX0RJMV9FWFRfQ0xLCQkoX01YNTNfUEFEX0VJTV9FQjJfX0NDTV9ESTFfRVhUX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjJfX0lQVV9TRVJfRElTUDFfQ1MJCShfTVg1M19QQURfRUlNX0VCMl9fSVBVX1NFUl9ESVNQMV9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjJfX0VDU1BJMV9TUzAJCShfTVg1M19QQURfRUlNX0VCMl9fRUNTUEkxX1NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjJfX0kyQzJfU0NMCQkoX01YNTNfUEFEX0VJTV9FQjJfX0kyQzJfU0NMIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0VNSV9XRUlNX0RfMTYJCShfTVg1M19QQURfRUlNX0QxNl9fRU1JX1dFSU1fRF8xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0dQSU8zXzE2CQkoX01YNTNfUEFEX0VJTV9EMTZfX0dQSU8zXzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxNl9fSVBVX0RJMF9QSU41CQkoX01YNTNfUEFEX0VJTV9EMTZfX0lQVV9ESTBfUElONSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0lQVV9ESVNQQjFfU0VSX0NMSwkJKF9NWDUzX1BBRF9FSU1fRDE2X19JUFVfRElTUEIxX1NFUl9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE2X19FQ1NQSTFfU0NMSwkJKF9NWDUzX1BBRF9FSU1fRDE2X19FQ1NQSTFfU0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0kyQzJfU0RBCQkoX01YNTNfUEFEX0VJTV9EMTZfX0kyQzJfU0RBIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTdfX0VNSV9XRUlNX0RfMTcJCShfTVg1M19QQURfRUlNX0QxN19fRU1JX1dFSU1fRF8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTdfX0dQSU8zXzE3CQkoX01YNTNfUEFEX0VJTV9EMTdfX0dQSU8zXzE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fSVBVX0RJMF9QSU42CQkoX01YNTNfUEFEX0VJTV9EMTdfX0lQVV9ESTBfUElONiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTdfX0lQVV9ESVNQQjFfU0VSX0RJTgkJKF9NWDUzX1BBRF9FSU1fRDE3X19JUFVfRElTUEIxX1NFUl9ESU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE3X19FQ1NQSTFfTUlTTwkJKF9NWDUzX1BBRF9FSU1fRDE3X19FQ1NQSTFfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTdfX0kyQzNfU0NMCQkoX01YNTNfUEFEX0VJTV9EMTdfX0kyQzNfU0NMIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0VNSV9XRUlNX0RfMTgJCShfTVg1M19QQURfRUlNX0QxOF9fRU1JX1dFSU1fRF8xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0dQSU8zXzE4CQkoX01YNTNfUEFEX0VJTV9EMThfX0dQSU8zXzE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fSVBVX0RJMF9QSU43CQkoX01YNTNfUEFEX0VJTV9EMThfX0lQVV9ESTBfUElONyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0lQVV9ESVNQQjFfU0VSX0RJTwkJKF9NWDUzX1BBRF9FSU1fRDE4X19JUFVfRElTUEIxX1NFUl9ESU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE4X19FQ1NQSTFfTU9TSQkJKF9NWDUzX1BBRF9FSU1fRDE4X19FQ1NQSTFfTU9TSSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0kyQzNfU0RBCQkoX01YNTNfUEFEX0VJTV9EMThfX0kyQzNfU0RBIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0lQVV9ESTFfRDBfQ1MJCShfTVg1M19QQURfRUlNX0QxOF9fSVBVX0RJMV9EMF9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0VNSV9XRUlNX0RfMTkJCShfTVg1M19QQURfRUlNX0QxOV9fRU1JX1dFSU1fRF8xOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0dQSU8zXzE5CQkoX01YNTNfUEFEX0VJTV9EMTlfX0dQSU8zXzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fSVBVX0RJMF9QSU44CQkoX01YNTNfUEFEX0VJTV9EMTlfX0lQVV9ESTBfUElOOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0lQVV9ESVNQQjFfU0VSX1JTCQkoX01YNTNfUEFEX0VJTV9EMTlfX0lQVV9ESVNQQjFfU0VSX1JTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fRUNTUEkxX1NTMQkJKF9NWDUzX1BBRF9FSU1fRDE5X19FQ1NQSTFfU1MxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fRVBJVDFfRVBJVE8JCShfTVg1M19QQURfRUlNX0QxOV9fRVBJVDFfRVBJVE8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE5X19VQVJUMV9DVFMJCShfTVg1M19QQURfRUlNX0QxOV9fVUFSVDFfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX1VTQk9IM19VU0JIMl9PQwkJKF9NWDUzX1BBRF9FSU1fRDE5X19VU0JPSDNfVVNCSDJfT0MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19FTUlfV0VJTV9EXzIwCQkoX01YNTNfUEFEX0VJTV9EMjBfX0VNSV9XRUlNX0RfMjAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19HUElPM18yMAkJKF9NWDUzX1BBRF9FSU1fRDIwX19HUElPM18yMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0lQVV9ESTBfUElOMTYJCShfTVg1M19QQURfRUlNX0QyMF9fSVBVX0RJMF9QSU4xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0lQVV9TRVJfRElTUDBfQ1MJCShfTVg1M19QQURfRUlNX0QyMF9fSVBVX1NFUl9ESVNQMF9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0NTUElfU1MwCQkoX01YNTNfUEFEX0VJTV9EMjBfX0NTUElfU1MwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fRVBJVDJfRVBJVE8JCShfTVg1M19QQURfRUlNX0QyMF9fRVBJVDJfRVBJVE8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19VQVJUMV9SVFMJCShfTVg1M19QQURfRUlNX0QyMF9fVUFSVDFfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX1VTQk9IM19VU0JIMl9QV1IJCShfTVg1M19QQURfRUlNX0QyMF9fVVNCT0gzX1VTQkgyX1BXUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX0VNSV9XRUlNX0RfMjEJCShfTVg1M19QQURfRUlNX0QyMV9fRU1JX1dFSU1fRF8yMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX0dQSU8zXzIxCQkoX01YNTNfUEFEX0VJTV9EMjFfX0dQSU8zXzIxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMV9fSVBVX0RJMF9QSU4xNwkJKF9NWDUzX1BBRF9FSU1fRDIxX19JUFVfREkwX1BJTjE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMV9fSVBVX0RJU1BCMF9TRVJfQ0xLCQkoX01YNTNfUEFEX0VJTV9EMjFfX0lQVV9ESVNQQjBfU0VSX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX0NTUElfU0NMSwkJKF9NWDUzX1BBRF9FSU1fRDIxX19DU1BJX1NDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19JMkMxX1NDTAkJKF9NWDUzX1BBRF9FSU1fRDIxX19JMkMxX1NDTCB8IE1VWF9QQURfQ1RSTChQQURfQ1RSTF9JMkMpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19VU0JPSDNfVVNCT1RHX09DCQkoX01YNTNfUEFEX0VJTV9EMjFfX1VTQk9IM19VU0JPVEdfT0MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIyX19FTUlfV0VJTV9EXzIyCQkoX01YNTNfUEFEX0VJTV9EMjJfX0VNSV9XRUlNX0RfMjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIyX19HUElPM18yMgkJKF9NWDUzX1BBRF9FSU1fRDIyX19HUElPM18yMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX0lQVV9ESTBfUElOMQkJKF9NWDUzX1BBRF9FSU1fRDIyX19JUFVfREkwX1BJTjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIyX19JUFVfRElTUEIwX1NFUl9ESU4JCShfTVg1M19QQURfRUlNX0QyMl9fSVBVX0RJU1BCMF9TRVJfRElOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMl9fQ1NQSV9NSVNPCQkoX01YNTNfUEFEX0VJTV9EMjJfX0NTUElfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX1VTQk9IM19VU0JPVEdfUFdSCQkoX01YNTNfUEFEX0VJTV9EMjJfX1VTQk9IM19VU0JPVEdfUFdSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fRU1JX1dFSU1fRF8yMwkJKF9NWDUzX1BBRF9FSU1fRDIzX19FTUlfV0VJTV9EXzIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fR1BJTzNfMjMJCShfTVg1M19QQURfRUlNX0QyM19fR1BJTzNfMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19VQVJUM19DVFMJCShfTVg1M19QQURfRUlNX0QyM19fVUFSVDNfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX1VBUlQxX0RDRAkJKF9NWDUzX1BBRF9FSU1fRDIzX19VQVJUMV9EQ0QgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19JUFVfREkwX0QwX0NTCQkoX01YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTBfRDBfQ1MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19JUFVfREkxX1BJTjIJCShfTVg1M19QQURfRUlNX0QyM19fSVBVX0RJMV9QSU4yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fSVBVX0NTSTFfREFUQV9FTgkJKF9NWDUzX1BBRF9FSU1fRDIzX19JUFVfQ1NJMV9EQVRBX0VOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fSVBVX0RJMV9QSU4xNAkJKF9NWDUzX1BBRF9FSU1fRDIzX19JUFVfREkxX1BJTjE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fRU1JX1dFSU1fRUJfMwkJKF9NWDUzX1BBRF9FSU1fRUIzX19FTUlfV0VJTV9FQl8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fR1BJTzJfMzEJCShfTVg1M19QQURfRUlNX0VCM19fR1BJTzJfMzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19VQVJUM19SVFMJCShfTVg1M19QQURfRUlNX0VCM19fVUFSVDNfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjNfX1VBUlQxX1JJCQkoX01YNTNfUEFEX0VJTV9FQjNfX1VBUlQxX1JJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fSVBVX0RJMV9QSU4zCQkoX01YNTNfUEFEX0VJTV9FQjNfX0lQVV9ESTFfUElOMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjNfX0lQVV9DU0kxX0hTWU5DCQkoX01YNTNfUEFEX0VJTV9FQjNfX0lQVV9DU0kxX0hTWU5DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fSVBVX0RJMV9QSU4xNgkJKF9NWDUzX1BBRF9FSU1fRUIzX19JUFVfREkxX1BJTjE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fRU1JX1dFSU1fRF8yNAkJKF9NWDUzX1BBRF9FSU1fRDI0X19FTUlfV0VJTV9EXzI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fR1BJTzNfMjQJCShfTVg1M19QQURfRUlNX0QyNF9fR1BJTzNfMjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19VQVJUM19UWERfTVVYCQkoX01YNTNfUEFEX0VJTV9EMjRfX1VBUlQzX1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fRUNTUEkxX1NTMgkJKF9NWDUzX1BBRF9FSU1fRDI0X19FQ1NQSTFfU1MyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fQ1NQSV9TUzIJCShfTVg1M19QQURfRUlNX0QyNF9fQ1NQSV9TUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19BVURNVVhfQVVENV9SWEZTCQkoX01YNTNfUEFEX0VJTV9EMjRfX0FVRE1VWF9BVUQ1X1JYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19FQ1NQSTJfU1MyCQkoX01YNTNfUEFEX0VJTV9EMjRfX0VDU1BJMl9TUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19VQVJUMV9EVFIJCShfTVg1M19QQURfRUlNX0QyNF9fVUFSVDFfRFRSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fRU1JX1dFSU1fRF8yNQkJKF9NWDUzX1BBRF9FSU1fRDI1X19FTUlfV0VJTV9EXzI1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fR1BJTzNfMjUJCShfTVg1M19QQURfRUlNX0QyNV9fR1BJTzNfMjUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19VQVJUM19SWERfTVVYCQkoX01YNTNfUEFEX0VJTV9EMjVfX1VBUlQzX1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fRUNTUEkxX1NTMwkJKF9NWDUzX1BBRF9FSU1fRDI1X19FQ1NQSTFfU1MzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fQ1NQSV9TUzMJCShfTVg1M19QQURfRUlNX0QyNV9fQ1NQSV9TUzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19BVURNVVhfQVVENV9SWEMJCShfTVg1M19QQURfRUlNX0QyNV9fQVVETVVYX0FVRDVfUlhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fRUNTUEkyX1NTMwkJKF9NWDUzX1BBRF9FSU1fRDI1X19FQ1NQSTJfU1MzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fVUFSVDFfRFNSCQkoX01YNTNfUEFEX0VJTV9EMjVfX1VBUlQxX0RTUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0VNSV9XRUlNX0RfMjYJCShfTVg1M19QQURfRUlNX0QyNl9fRU1JX1dFSU1fRF8yNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0dQSU8zXzI2CQkoX01YNTNfUEFEX0VJTV9EMjZfX0dQSU8zXzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fVUFSVDJfVFhEX01VWAkJKF9NWDUzX1BBRF9FSU1fRDI2X19VQVJUMl9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0ZJUklfUlhECQkoX01YNTNfUEFEX0VJTV9EMjZfX0ZJUklfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fSVBVX0NTSTBfRF8xCQkoX01YNTNfUEFEX0VJTV9EMjZfX0lQVV9DU0kwX0RfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0lQVV9ESTFfUElOMTEJCShfTVg1M19QQURfRUlNX0QyNl9fSVBVX0RJMV9QSU4xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0lQVV9TSVNHXzIJCShfTVg1M19QQURfRUlNX0QyNl9fSVBVX1NJU0dfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0lQVV9ESVNQMV9EQVRfMjIJCShfTVg1M19QQURfRUlNX0QyNl9fSVBVX0RJU1AxX0RBVF8yMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0VNSV9XRUlNX0RfMjcJCShfTVg1M19QQURfRUlNX0QyN19fRU1JX1dFSU1fRF8yNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0dQSU8zXzI3CQkoX01YNTNfUEFEX0VJTV9EMjdfX0dQSU8zXzI3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fVUFSVDJfUlhEX01VWAkJKF9NWDUzX1BBRF9FSU1fRDI3X19VQVJUMl9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0ZJUklfVFhECQkoX01YNTNfUEFEX0VJTV9EMjdfX0ZJUklfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fSVBVX0NTSTBfRF8wCQkoX01YNTNfUEFEX0VJTV9EMjdfX0lQVV9DU0kwX0RfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0lQVV9ESTFfUElOMTMJCShfTVg1M19QQURfRUlNX0QyN19fSVBVX0RJMV9QSU4xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0lQVV9TSVNHXzMJCShfTVg1M19QQURfRUlNX0QyN19fSVBVX1NJU0dfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0lQVV9ESVNQMV9EQVRfMjMJCShfTVg1M19QQURfRUlNX0QyN19fSVBVX0RJU1AxX0RBVF8yMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0VNSV9XRUlNX0RfMjgJCShfTVg1M19QQURfRUlNX0QyOF9fRU1JX1dFSU1fRF8yOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0dQSU8zXzI4CQkoX01YNTNfUEFEX0VJTV9EMjhfX0dQSU8zXzI4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fVUFSVDJfQ1RTCQkoX01YNTNfUEFEX0VJTV9EMjhfX1VBUlQyX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19JUFVfRElTUEIwX1NFUl9ESU8JCShfTVg1M19QQURfRUlNX0QyOF9fSVBVX0RJU1BCMF9TRVJfRElPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fQ1NQSV9NT1NJCQkoX01YNTNfUEFEX0VJTV9EMjhfX0NTUElfTU9TSSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0kyQzFfU0RBCQkoX01YNTNfUEFEX0VJTV9EMjhfX0kyQzFfU0RBIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0lQVV9FWFRfVFJJRwkJKF9NWDUzX1BBRF9FSU1fRDI4X19JUFVfRVhUX1RSSUcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19JUFVfREkwX1BJTjEzCQkoX01YNTNfUEFEX0VJTV9EMjhfX0lQVV9ESTBfUElOMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19FTUlfV0VJTV9EXzI5CQkoX01YNTNfUEFEX0VJTV9EMjlfX0VNSV9XRUlNX0RfMjkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19HUElPM18yOQkJKF9NWDUzX1BBRF9FSU1fRDI5X19HUElPM18yOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX1VBUlQyX1JUUwkJKF9NWDUzX1BBRF9FSU1fRDI5X19VQVJUMl9SVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJU1BCMF9TRVJfUlMJCShfTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJU1BCMF9TRVJfUlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19DU1BJX1NTMAkJKF9NWDUzX1BBRF9FSU1fRDI5X19DU1BJX1NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0lQVV9ESTFfUElOMTUJCShfTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMV9QSU4xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0lQVV9DU0kxX1ZTWU5DCQkoX01YNTNfUEFEX0VJTV9EMjlfX0lQVV9DU0kxX1ZTWU5DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMF9QSU4xNAkJKF9NWDUzX1BBRF9FSU1fRDI5X19JUFVfREkwX1BJTjE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fRU1JX1dFSU1fRF8zMAkJKF9NWDUzX1BBRF9FSU1fRDMwX19FTUlfV0VJTV9EXzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fR1BJTzNfMzAJCShfTVg1M19QQURfRUlNX0QzMF9fR1BJTzNfMzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19VQVJUM19DVFMJCShfTVg1M19QQURfRUlNX0QzMF9fVUFSVDNfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX0lQVV9DU0kwX0RfMwkJKF9NWDUzX1BBRF9FSU1fRDMwX19JUFVfQ1NJMF9EXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19JUFVfREkwX1BJTjExCQkoX01YNTNfUEFEX0VJTV9EMzBfX0lQVV9ESTBfUElOMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19JUFVfRElTUDFfREFUXzIxCQkoX01YNTNfUEFEX0VJTV9EMzBfX0lQVV9ESVNQMV9EQVRfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19VU0JPSDNfVVNCSDFfT0MJCShfTVg1M19QQURfRUlNX0QzMF9fVVNCT0gzX1VTQkgxX09DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fVVNCT0gzX1VTQkgyX09DCQkoX01YNTNfUEFEX0VJTV9EMzBfX1VTQk9IM19VU0JIMl9PQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX0VNSV9XRUlNX0RfMzEJCShfTVg1M19QQURfRUlNX0QzMV9fRU1JX1dFSU1fRF8zMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX0dQSU8zXzMxCQkoX01YNTNfUEFEX0VJTV9EMzFfX0dQSU8zXzMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fVUFSVDNfUlRTCQkoX01YNTNfUEFEX0VJTV9EMzFfX1VBUlQzX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19JUFVfQ1NJMF9EXzIJCShfTVg1M19QQURfRUlNX0QzMV9fSVBVX0NTSTBfRF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fSVBVX0RJMF9QSU4xMgkJKF9NWDUzX1BBRF9FSU1fRDMxX19JUFVfREkwX1BJTjEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fSVBVX0RJU1AxX0RBVF8yMAkJKF9NWDUzX1BBRF9FSU1fRDMxX19JUFVfRElTUDFfREFUXzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fVVNCT0gzX1VTQkgxX1BXUgkJKF9NWDUzX1BBRF9FSU1fRDMxX19VU0JPSDNfVVNCSDFfUFdSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fVVNCT0gzX1VTQkgyX1BXUgkJKF9NWDUzX1BBRF9FSU1fRDMxX19VU0JPSDNfVVNCSDJfUFdSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fRU1JX1dFSU1fQV8yNAkJKF9NWDUzX1BBRF9FSU1fQTI0X19FTUlfV0VJTV9BXzI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fR1BJTzVfNAkJKF9NWDUzX1BBRF9FSU1fQTI0X19HUElPNV80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fSVBVX0RJU1AxX0RBVF8xOQkJKF9NWDUzX1BBRF9FSU1fQTI0X19JUFVfRElTUDFfREFUXzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fSVBVX0NTSTFfRF8xOQkJKF9NWDUzX1BBRF9FSU1fQTI0X19JUFVfQ1NJMV9EXzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fSVBVX1NJU0dfMgkJKF9NWDUzX1BBRF9FSU1fQTI0X19JUFVfU0lTR18yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fVVNCUEhZMl9CVkFMSUQJCShfTVg1M19QQURfRUlNX0EyNF9fVVNCUEhZMl9CVkFMSUQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19FTUlfV0VJTV9BXzIzCQkoX01YNTNfUEFEX0VJTV9BMjNfX0VNSV9XRUlNX0FfMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19HUElPNl82CQkoX01YNTNfUEFEX0VJTV9BMjNfX0dQSU82XzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19JUFVfRElTUDFfREFUXzE4CQkoX01YNTNfUEFEX0VJTV9BMjNfX0lQVV9ESVNQMV9EQVRfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19JUFVfQ1NJMV9EXzE4CQkoX01YNTNfUEFEX0VJTV9BMjNfX0lQVV9DU0kxX0RfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19JUFVfU0lTR18zCQkoX01YNTNfUEFEX0VJTV9BMjNfX0lQVV9TSVNHXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19VU0JQSFkyX0VORFNFU1NJT04JCShfTVg1M19QQURfRUlNX0EyM19fVVNCUEhZMl9FTkRTRVNTSU9OIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMl9fRU1JX1dFSU1fQV8yMgkJKF9NWDUzX1BBRF9FSU1fQTIyX19FTUlfV0VJTV9BXzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMl9fR1BJTzJfMTYJCShfTVg1M19QQURfRUlNX0EyMl9fR1BJTzJfMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIyX19JUFVfRElTUDFfREFUXzE3CQkoX01YNTNfUEFEX0VJTV9BMjJfX0lQVV9ESVNQMV9EQVRfMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIyX19JUFVfQ1NJMV9EXzE3CQkoX01YNTNfUEFEX0VJTV9BMjJfX0lQVV9DU0kxX0RfMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIyX19TUkNfQlRfQ0ZHMV83CQkoX01YNTNfUEFEX0VJTV9BMjJfX1NSQ19CVF9DRkcxXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIxX19FTUlfV0VJTV9BXzIxCQkoX01YNTNfUEFEX0VJTV9BMjFfX0VNSV9XRUlNX0FfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIxX19HUElPMl8xNwkJKF9NWDUzX1BBRF9FSU1fQTIxX19HUElPMl8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjFfX0lQVV9ESVNQMV9EQVRfMTYJCShfTVg1M19QQURfRUlNX0EyMV9fSVBVX0RJU1AxX0RBVF8xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjFfX0lQVV9DU0kxX0RfMTYJCShfTVg1M19QQURfRUlNX0EyMV9fSVBVX0NTSTFfRF8xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjFfX1NSQ19CVF9DRkcxXzYJCShfTVg1M19QQURfRUlNX0EyMV9fU1JDX0JUX0NGRzFfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjBfX0VNSV9XRUlNX0FfMjAJCShfTVg1M19QQURfRUlNX0EyMF9fRU1JX1dFSU1fQV8yMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjBfX0dQSU8yXzE4CQkoX01YNTNfUEFEX0VJTV9BMjBfX0dQSU8yXzE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fSVBVX0RJU1AxX0RBVF8xNQkJKF9NWDUzX1BBRF9FSU1fQTIwX19JUFVfRElTUDFfREFUXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fSVBVX0NTSTFfRF8xNQkJKF9NWDUzX1BBRF9FSU1fQTIwX19JUFVfQ1NJMV9EXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fU1JDX0JUX0NGRzFfNQkJKF9NWDUzX1BBRF9FSU1fQTIwX19TUkNfQlRfQ0ZHMV81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExOV9fRU1JX1dFSU1fQV8xOQkJKF9NWDUzX1BBRF9FSU1fQTE5X19FTUlfV0VJTV9BXzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExOV9fR1BJTzJfMTkJCShfTVg1M19QQURfRUlNX0ExOV9fR1BJTzJfMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE5X19JUFVfRElTUDFfREFUXzE0CQkoX01YNTNfUEFEX0VJTV9BMTlfX0lQVV9ESVNQMV9EQVRfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE5X19JUFVfQ1NJMV9EXzE0CQkoX01YNTNfUEFEX0VJTV9BMTlfX0lQVV9DU0kxX0RfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE5X19TUkNfQlRfQ0ZHMV80CQkoX01YNTNfUEFEX0VJTV9BMTlfX1NSQ19CVF9DRkcxXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE4X19FTUlfV0VJTV9BXzE4CQkoX01YNTNfUEFEX0VJTV9BMThfX0VNSV9XRUlNX0FfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE4X19HUElPMl8yMAkJKF9NWDUzX1BBRF9FSU1fQTE4X19HUElPMl8yMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMThfX0lQVV9ESVNQMV9EQVRfMTMJCShfTVg1M19QQURfRUlNX0ExOF9fSVBVX0RJU1AxX0RBVF8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMThfX0lQVV9DU0kxX0RfMTMJCShfTVg1M19QQURfRUlNX0ExOF9fSVBVX0NTSTFfRF8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMThfX1NSQ19CVF9DRkcxXzMJCShfTVg1M19QQURfRUlNX0ExOF9fU1JDX0JUX0NGRzFfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTdfX0VNSV9XRUlNX0FfMTcJCShfTVg1M19QQURfRUlNX0ExN19fRU1JX1dFSU1fQV8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTdfX0dQSU8yXzIxCQkoX01YNTNfUEFEX0VJTV9BMTdfX0dQSU8yXzIxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fSVBVX0RJU1AxX0RBVF8xMgkJKF9NWDUzX1BBRF9FSU1fQTE3X19JUFVfRElTUDFfREFUXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fSVBVX0NTSTFfRF8xMgkJKF9NWDUzX1BBRF9FSU1fQTE3X19JUFVfQ1NJMV9EXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fU1JDX0JUX0NGRzFfMgkJKF9NWDUzX1BBRF9FSU1fQTE3X19TUkNfQlRfQ0ZHMV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExNl9fRU1JX1dFSU1fQV8xNgkJKF9NWDUzX1BBRF9FSU1fQTE2X19FTUlfV0VJTV9BXzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExNl9fR1BJTzJfMjIJCShfTVg1M19QQURfRUlNX0ExNl9fR1BJTzJfMjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE2X19JUFVfREkxX0RJU1BfQ0xLCQkoX01YNTNfUEFEX0VJTV9BMTZfX0lQVV9ESTFfRElTUF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE2X19JUFVfQ1NJMV9QSVhDTEsJCShfTVg1M19QQURfRUlNX0ExNl9fSVBVX0NTSTFfUElYQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExNl9fU1JDX0JUX0NGRzFfMQkJKF9NWDUzX1BBRF9FSU1fQTE2X19TUkNfQlRfQ0ZHMV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0NTMF9fRU1JX1dFSU1fQ1NfMAkJKF9NWDUzX1BBRF9FSU1fQ1MwX19FTUlfV0VJTV9DU18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0NTMF9fR1BJTzJfMjMJCShfTVg1M19QQURfRUlNX0NTMF9fR1BJTzJfMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MwX19FQ1NQSTJfU0NMSwkJKF9NWDUzX1BBRF9FSU1fQ1MwX19FQ1NQSTJfU0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzBfX0lQVV9ESTFfUElONQkJKF9NWDUzX1BBRF9FSU1fQ1MwX19JUFVfREkxX1BJTjUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MxX19FTUlfV0VJTV9DU18xCQkoX01YNTNfUEFEX0VJTV9DUzFfX0VNSV9XRUlNX0NTXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MxX19HUElPMl8yNAkJKF9NWDUzX1BBRF9FSU1fQ1MxX19HUElPMl8yNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzFfX0VDU1BJMl9NT1NJCQkoX01YNTNfUEFEX0VJTV9DUzFfX0VDU1BJMl9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0NTMV9fSVBVX0RJMV9QSU42CQkoX01YNTNfUEFEX0VJTV9DUzFfX0lQVV9ESTFfUElONiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9PRV9fRU1JX1dFSU1fT0UJCShfTVg1M19QQURfRUlNX09FX19FTUlfV0VJTV9PRSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9PRV9fR1BJTzJfMjUJCShfTVg1M19QQURfRUlNX09FX19HUElPMl8yNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9PRV9fRUNTUEkyX01JU08JCShfTVg1M19QQURfRUlNX09FX19FQ1NQSTJfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9PRV9fSVBVX0RJMV9QSU43CQkoX01YNTNfUEFEX0VJTV9PRV9fSVBVX0RJMV9QSU43IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX09FX19VU0JQSFkyX0lERElHCQkoX01YNTNfUEFEX0VJTV9PRV9fVVNCUEhZMl9JRERJRyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9SV19fRU1JX1dFSU1fUlcJCShfTVg1M19QQURfRUlNX1JXX19FTUlfV0VJTV9SVyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9SV19fR1BJTzJfMjYJCShfTVg1M19QQURfRUlNX1JXX19HUElPMl8yNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9SV19fRUNTUEkyX1NTMAkJKF9NWDUzX1BBRF9FSU1fUldfX0VDU1BJMl9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fUldfX0lQVV9ESTFfUElOOAkJKF9NWDUzX1BBRF9FSU1fUldfX0lQVV9ESTFfUElOOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9SV19fVVNCUEhZMl9IT1NURElTQ09OTkVDVAkJKF9NWDUzX1BBRF9FSU1fUldfX1VTQlBIWTJfSE9TVERJU0NPTk5FQ1QgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fTEJBX19FTUlfV0VJTV9MQkEJCShfTVg1M19QQURfRUlNX0xCQV9fRU1JX1dFSU1fTEJBIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0xCQV9fR1BJTzJfMjcJCShfTVg1M19QQURfRUlNX0xCQV9fR1BJTzJfMjcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fTEJBX19FQ1NQSTJfU1MxCQkoX01YNTNfUEFEX0VJTV9MQkFfX0VDU1BJMl9TUzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fTEJBX19JUFVfREkxX1BJTjE3CQkoX01YNTNfUEFEX0VJTV9MQkFfX0lQVV9ESTFfUElOMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fTEJBX19TUkNfQlRfQ0ZHMV8wCQkoX01YNTNfUEFEX0VJTV9MQkFfX1NSQ19CVF9DRkcxXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIwX19FTUlfV0VJTV9FQl8wCQkoX01YNTNfUEFEX0VJTV9FQjBfX0VNSV9XRUlNX0VCXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIwX19HUElPMl8yOAkJKF9NWDUzX1BBRF9FSU1fRUIwX19HUElPMl8yOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0lQVV9ESVNQMV9EQVRfMTEJCShfTVg1M19QQURfRUlNX0VCMF9fSVBVX0RJU1AxX0RBVF8xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0lQVV9DU0kxX0RfMTEJCShfTVg1M19QQURfRUlNX0VCMF9fSVBVX0NTSTFfRF8xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0dQQ19QTUlDX1JEWQkJKF9NWDUzX1BBRF9FSU1fRUIwX19HUENfUE1JQ19SRFkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIwX19TUkNfQlRfQ0ZHMl83CQkoX01YNTNfUEFEX0VJTV9FQjBfX1NSQ19CVF9DRkcyXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIxX19FTUlfV0VJTV9FQl8xCQkoX01YNTNfUEFEX0VJTV9FQjFfX0VNSV9XRUlNX0VCXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIxX19HUElPMl8yOQkJKF9NWDUzX1BBRF9FSU1fRUIxX19HUElPMl8yOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjFfX0lQVV9ESVNQMV9EQVRfMTAJCShfTVg1M19QQURfRUlNX0VCMV9fSVBVX0RJU1AxX0RBVF8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjFfX0lQVV9DU0kxX0RfMTAJCShfTVg1M19QQURfRUlNX0VCMV9fSVBVX0NTSTFfRF8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjFfX1NSQ19CVF9DRkcyXzYJCShfTVg1M19QQURfRUlNX0VCMV9fU1JDX0JUX0NGRzJfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTBfX0VNSV9OQU5EX1dFSU1fREFfMAkJKF9NWDUzX1BBRF9FSU1fREEwX19FTUlfTkFORF9XRUlNX0RBXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREEwX19HUElPM18wCQkoX01YNTNfUEFEX0VJTV9EQTBfX0dQSU8zXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREEwX19JUFVfRElTUDFfREFUXzkJCShfTVg1M19QQURfRUlNX0RBMF9fSVBVX0RJU1AxX0RBVF85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMF9fSVBVX0NTSTFfRF85CQkoX01YNTNfUEFEX0VJTV9EQTBfX0lQVV9DU0kxX0RfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTBfX1NSQ19CVF9DRkcyXzUJCShfTVg1M19QQURfRUlNX0RBMF9fU1JDX0JUX0NGRzJfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTFfX0VNSV9OQU5EX1dFSU1fREFfMQkJKF9NWDUzX1BBRF9FSU1fREExX19FTUlfTkFORF9XRUlNX0RBXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExX19HUElPM18xCQkoX01YNTNfUEFEX0VJTV9EQTFfX0dQSU8zXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExX19JUFVfRElTUDFfREFUXzgJCShfTVg1M19QQURfRUlNX0RBMV9fSVBVX0RJU1AxX0RBVF84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMV9fSVBVX0NTSTFfRF84CQkoX01YNTNfUEFEX0VJTV9EQTFfX0lQVV9DU0kxX0RfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTFfX1NSQ19CVF9DRkcyXzQJCShfTVg1M19QQURfRUlNX0RBMV9fU1JDX0JUX0NGRzJfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTJfX0VNSV9OQU5EX1dFSU1fREFfMgkJKF9NWDUzX1BBRF9FSU1fREEyX19FTUlfTkFORF9XRUlNX0RBXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREEyX19HUElPM18yCQkoX01YNTNfUEFEX0VJTV9EQTJfX0dQSU8zXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREEyX19JUFVfRElTUDFfREFUXzcJCShfTVg1M19QQURfRUlNX0RBMl9fSVBVX0RJU1AxX0RBVF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMl9fSVBVX0NTSTFfRF83CQkoX01YNTNfUEFEX0VJTV9EQTJfX0lQVV9DU0kxX0RfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTJfX1NSQ19CVF9DRkcyXzMJCShfTVg1M19QQURfRUlNX0RBMl9fU1JDX0JUX0NGRzJfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTNfX0VNSV9OQU5EX1dFSU1fREFfMwkJKF9NWDUzX1BBRF9FSU1fREEzX19FTUlfTkFORF9XRUlNX0RBXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREEzX19HUElPM18zCQkoX01YNTNfUEFEX0VJTV9EQTNfX0dQSU8zXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREEzX19JUFVfRElTUDFfREFUXzYJCShfTVg1M19QQURfRUlNX0RBM19fSVBVX0RJU1AxX0RBVF82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBM19fSVBVX0NTSTFfRF82CQkoX01YNTNfUEFEX0VJTV9EQTNfX0lQVV9DU0kxX0RfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTNfX1NSQ19CVF9DRkcyXzIJCShfTVg1M19QQURfRUlNX0RBM19fU1JDX0JUX0NGRzJfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTRfX0VNSV9OQU5EX1dFSU1fREFfNAkJKF9NWDUzX1BBRF9FSU1fREE0X19FTUlfTkFORF9XRUlNX0RBXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE0X19HUElPM180CQkoX01YNTNfUEFEX0VJTV9EQTRfX0dQSU8zXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE0X19JUFVfRElTUDFfREFUXzUJCShfTVg1M19QQURfRUlNX0RBNF9fSVBVX0RJU1AxX0RBVF81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBNF9fSVBVX0NTSTFfRF81CQkoX01YNTNfUEFEX0VJTV9EQTRfX0lQVV9DU0kxX0RfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTRfX1NSQ19CVF9DRkczXzcJCShfTVg1M19QQURfRUlNX0RBNF9fU1JDX0JUX0NGRzNfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTVfX0VNSV9OQU5EX1dFSU1fREFfNQkJKF9NWDUzX1BBRF9FSU1fREE1X19FTUlfTkFORF9XRUlNX0RBXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE1X19HUElPM181CQkoX01YNTNfUEFEX0VJTV9EQTVfX0dQSU8zXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE1X19JUFVfRElTUDFfREFUXzQJCShfTVg1M19QQURfRUlNX0RBNV9fSVBVX0RJU1AxX0RBVF80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBNV9fSVBVX0NTSTFfRF80CQkoX01YNTNfUEFEX0VJTV9EQTVfX0lQVV9DU0kxX0RfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTVfX1NSQ19CVF9DRkczXzYJCShfTVg1M19QQURfRUlNX0RBNV9fU1JDX0JUX0NGRzNfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTZfX0VNSV9OQU5EX1dFSU1fREFfNgkJKF9NWDUzX1BBRF9FSU1fREE2X19FTUlfTkFORF9XRUlNX0RBXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE2X19HUElPM182CQkoX01YNTNfUEFEX0VJTV9EQTZfX0dQSU8zXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE2X19JUFVfRElTUDFfREFUXzMJCShfTVg1M19QQURfRUlNX0RBNl9fSVBVX0RJU1AxX0RBVF8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBNl9fSVBVX0NTSTFfRF8zCQkoX01YNTNfUEFEX0VJTV9EQTZfX0lQVV9DU0kxX0RfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTZfX1NSQ19CVF9DRkczXzUJCShfTVg1M19QQURfRUlNX0RBNl9fU1JDX0JUX0NGRzNfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTdfX0VNSV9OQU5EX1dFSU1fREFfNwkJKF9NWDUzX1BBRF9FSU1fREE3X19FTUlfTkFORF9XRUlNX0RBXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE3X19HUElPM183CQkoX01YNTNfUEFEX0VJTV9EQTdfX0dQSU8zXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE3X19JUFVfRElTUDFfREFUXzIJCShfTVg1M19QQURfRUlNX0RBN19fSVBVX0RJU1AxX0RBVF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBN19fSVBVX0NTSTFfRF8yCQkoX01YNTNfUEFEX0VJTV9EQTdfX0lQVV9DU0kxX0RfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTdfX1NSQ19CVF9DRkczXzQJCShfTVg1M19QQURfRUlNX0RBN19fU1JDX0JUX0NGRzNfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQThfX0VNSV9OQU5EX1dFSU1fREFfOAkJKF9NWDUzX1BBRF9FSU1fREE4X19FTUlfTkFORF9XRUlNX0RBXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE4X19HUElPM184CQkoX01YNTNfUEFEX0VJTV9EQThfX0dQSU8zXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE4X19JUFVfRElTUDFfREFUXzEJCShfTVg1M19QQURfRUlNX0RBOF9fSVBVX0RJU1AxX0RBVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBOF9fSVBVX0NTSTFfRF8xCQkoX01YNTNfUEFEX0VJTV9EQThfX0lQVV9DU0kxX0RfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQThfX1NSQ19CVF9DRkczXzMJCShfTVg1M19QQURfRUlNX0RBOF9fU1JDX0JUX0NGRzNfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTlfX0VNSV9OQU5EX1dFSU1fREFfOQkJKF9NWDUzX1BBRF9FSU1fREE5X19FTUlfTkFORF9XRUlNX0RBXzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE5X19HUElPM185CQkoX01YNTNfUEFEX0VJTV9EQTlfX0dQSU8zXzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE5X19JUFVfRElTUDFfREFUXzAJCShfTVg1M19QQURfRUlNX0RBOV9fSVBVX0RJU1AxX0RBVF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBOV9fSVBVX0NTSTFfRF8wCQkoX01YNTNfUEFEX0VJTV9EQTlfX0lQVV9DU0kxX0RfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTlfX1NSQ19CVF9DRkczXzIJCShfTVg1M19QQURfRUlNX0RBOV9fU1JDX0JUX0NGRzNfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEwX19FTUlfTkFORF9XRUlNX0RBXzEwCQkoX01YNTNfUEFEX0VJTV9EQTEwX19FTUlfTkFORF9XRUlNX0RBXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTBfX0dQSU8zXzEwCQkoX01YNTNfUEFEX0VJTV9EQTEwX19HUElPM18xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEwX19JUFVfREkxX1BJTjE1CQkoX01YNTNfUEFEX0VJTV9EQTEwX19JUFVfREkxX1BJTjE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTBfX0lQVV9DU0kxX0RBVEFfRU4JCShfTVg1M19QQURfRUlNX0RBMTBfX0lQVV9DU0kxX0RBVEFfRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMF9fU1JDX0JUX0NGRzNfMQkJKF9NWDUzX1BBRF9FSU1fREExMF9fU1JDX0JUX0NGRzNfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTExX19FTUlfTkFORF9XRUlNX0RBXzExCQkoX01YNTNfUEFEX0VJTV9EQTExX19FTUlfTkFORF9XRUlNX0RBXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTFfX0dQSU8zXzExCQkoX01YNTNfUEFEX0VJTV9EQTExX19HUElPM18xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTExX19JUFVfREkxX1BJTjIJCShfTVg1M19QQURfRUlNX0RBMTFfX0lQVV9ESTFfUElOMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTExX19JUFVfQ1NJMV9IU1lOQwkJKF9NWDUzX1BBRF9FSU1fREExMV9fSVBVX0NTSTFfSFNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMl9fRU1JX05BTkRfV0VJTV9EQV8xMgkJKF9NWDUzX1BBRF9FSU1fREExMl9fRU1JX05BTkRfV0VJTV9EQV8xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEyX19HUElPM18xMgkJKF9NWDUzX1BBRF9FSU1fREExMl9fR1BJTzNfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMl9fSVBVX0RJMV9QSU4zCQkoX01YNTNfUEFEX0VJTV9EQTEyX19JUFVfREkxX1BJTjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMl9fSVBVX0NTSTFfVlNZTkMJCShfTVg1M19QQURfRUlNX0RBMTJfX0lQVV9DU0kxX1ZTWU5DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTNfX0VNSV9OQU5EX1dFSU1fREFfMTMJCShfTVg1M19QQURfRUlNX0RBMTNfX0VNSV9OQU5EX1dFSU1fREFfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExM19fR1BJTzNfMTMJCShfTVg1M19QQURfRUlNX0RBMTNfX0dQSU8zXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTNfX0lQVV9ESTFfRDBfQ1MJCShfTVg1M19QQURfRUlNX0RBMTNfX0lQVV9ESTFfRDBfQ1MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExM19fQ0NNX0RJMV9FWFRfQ0xLCQkoX01YNTNfUEFEX0VJTV9EQTEzX19DQ01fREkxX0VYVF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExNF9fRU1JX05BTkRfV0VJTV9EQV8xNAkJKF9NWDUzX1BBRF9FSU1fREExNF9fRU1JX05BTkRfV0VJTV9EQV8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE0X19HUElPM18xNAkJKF9NWDUzX1BBRF9FSU1fREExNF9fR1BJTzNfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExNF9fSVBVX0RJMV9EMV9DUwkJKF9NWDUzX1BBRF9FSU1fREExNF9fSVBVX0RJMV9EMV9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE0X19DQ01fREkwX0VYVF9DTEsJCShfTVg1M19QQURfRUlNX0RBMTRfX0NDTV9ESTBfRVhUX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE1X19FTUlfTkFORF9XRUlNX0RBXzE1CQkoX01YNTNfUEFEX0VJTV9EQTE1X19FTUlfTkFORF9XRUlNX0RBXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTVfX0dQSU8zXzE1CQkoX01YNTNfUEFEX0VJTV9EQTE1X19HUElPM18xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE1X19JUFVfREkxX1BJTjEJCShfTVg1M19QQURfRUlNX0RBMTVfX0lQVV9ESTFfUElOMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE1X19JUFVfREkxX1BJTjQJCShfTVg1M19QQURfRUlNX0RBMTVfX0lQVV9ESTFfUElONCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX1dFX0JfX0VNSV9OQU5ERl9XRV9CCQkoX01YNTNfUEFEX05BTkRGX1dFX0JfX0VNSV9OQU5ERl9XRV9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfV0VfQl9fR1BJTzZfMTIJCShfTVg1M19QQURfTkFOREZfV0VfQl9fR1BJTzZfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9SRV9CX19FTUlfTkFOREZfUkVfQgkJKF9NWDUzX1BBRF9OQU5ERl9SRV9CX19FTUlfTkFOREZfUkVfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX1JFX0JfX0dQSU82XzEzCQkoX01YNTNfUEFEX05BTkRGX1JFX0JfX0dQSU82XzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX1dBSVRfX0VNSV9XRUlNX1dBSVQJCShfTVg1M19QQURfRUlNX1dBSVRfX0VNSV9XRUlNX1dBSVQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fV0FJVF9fR1BJTzVfMAkJKF9NWDUzX1BBRF9FSU1fV0FJVF9fR1BJTzVfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9XQUlUX19FTUlfV0VJTV9EVEFDS19CCQkoX01YNTNfUEFEX0VJTV9XQUlUX19FTUlfV0VJTV9EVEFDS19CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgzX1BfX0dQSU82XzIyCQkoX01YNTNfUEFEX0xWRFMxX1RYM19QX19HUElPNl8yMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYM19QX19MREJfTFZEUzFfVFgzCQkoX01YNTNfUEFEX0xWRFMxX1RYM19QX19MREJfTFZEUzFfVFgzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgyX1BfX0dQSU82XzI0CQkoX01YNTNfUEFEX0xWRFMxX1RYMl9QX19HUElPNl8yNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYMl9QX19MREJfTFZEUzFfVFgyCQkoX01YNTNfUEFEX0xWRFMxX1RYMl9QX19MREJfTFZEUzFfVFgyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfQ0xLX1BfX0dQSU82XzI2CQkoX01YNTNfUEFEX0xWRFMxX0NMS19QX19HUElPNl8yNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMxX0NMS19QX19MREJfTFZEUzFfQ0xLCQkoX01YNTNfUEFEX0xWRFMxX0NMS19QX19MREJfTFZEUzFfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgxX1BfX0dQSU82XzI4CQkoX01YNTNfUEFEX0xWRFMxX1RYMV9QX19HUElPNl8yOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYMV9QX19MREJfTFZEUzFfVFgxCQkoX01YNTNfUEFEX0xWRFMxX1RYMV9QX19MREJfTFZEUzFfVFgxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgwX1BfX0dQSU82XzMwCQkoX01YNTNfUEFEX0xWRFMxX1RYMF9QX19HUElPNl8zMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYMF9QX19MREJfTFZEUzFfVFgwCQkoX01YNTNfUEFEX0xWRFMxX1RYMF9QX19MREJfTFZEUzFfVFgwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgzX1BfX0dQSU83XzIyCQkoX01YNTNfUEFEX0xWRFMwX1RYM19QX19HUElPN18yMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMwX1RYM19QX19MREJfTFZEUzBfVFgzCQkoX01YNTNfUEFEX0xWRFMwX1RYM19QX19MREJfTFZEUzBfVFgzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfQ0xLX1BfX0dQSU83XzI0CQkoX01YNTNfUEFEX0xWRFMwX0NMS19QX19HUElPN18yNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMwX0NMS19QX19MREJfTFZEUzBfQ0xLCQkoX01YNTNfUEFEX0xWRFMwX0NMS19QX19MREJfTFZEUzBfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgyX1BfX0dQSU83XzI2CQkoX01YNTNfUEFEX0xWRFMwX1RYMl9QX19HUElPN18yNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMwX1RYMl9QX19MREJfTFZEUzBfVFgyCQkoX01YNTNfUEFEX0xWRFMwX1RYMl9QX19MREJfTFZEUzBfVFgyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgxX1BfX0dQSU83XzI4CQkoX01YNTNfUEFEX0xWRFMwX1RYMV9QX19HUElPN18yOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMwX1RYMV9QX19MREJfTFZEUzBfVFgxCQkoX01YNTNfUEFEX0xWRFMwX1RYMV9QX19MREJfTFZEUzBfVFgxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgwX1BfX0dQSU83XzMwCQkoX01YNTNfUEFEX0xWRFMwX1RYMF9QX19HUElPN18zMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0xWRFMwX1RYMF9QX19MREJfTFZEUzBfVFgwCQkoX01YNTNfUEFEX0xWRFMwX1RYMF9QX19MREJfTFZEUzBfVFgwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xMF9fR1BJTzRfMAkJKF9NWDUzX1BBRF9HUElPXzEwX19HUElPNF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xMF9fT1NDMzJrXzMyS19PVVQJCShfTVg1M19QQURfR1BJT18xMF9fT1NDMzJrXzMyS19PVVQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzExX19HUElPNF8xCQkoX01YNTNfUEFEX0dQSU9fMTFfX0dQSU80XzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzEyX19HUElPNF8yCQkoX01YNTNfUEFEX0dQSU9fMTJfX0dQSU80XzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzEzX19HUElPNF8zCQkoX01YNTNfUEFEX0dQSU9fMTNfX0dQSU80XzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE0X19HUElPNF80CQkoX01YNTNfUEFEX0dQSU9fMTRfX0dQSU80XzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DTEVfX0VNSV9OQU5ERl9DTEUJCShfTVg1M19QQURfTkFOREZfQ0xFX19FTUlfTkFOREZfQ0xFIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ0xFX19HUElPNl83CQkoX01YNTNfUEFEX05BTkRGX0NMRV9fR1BJTzZfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NMRV9fVVNCUEhZMV9WU1RBVFVTXzAJCShfTVg1M19QQURfTkFOREZfQ0xFX19VU0JQSFkxX1ZTVEFUVVNfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0FMRV9fRU1JX05BTkRGX0FMRQkJKF9NWDUzX1BBRF9OQU5ERl9BTEVfX0VNSV9OQU5ERl9BTEUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9BTEVfX0dQSU82XzgJCShfTVg1M19QQURfTkFOREZfQUxFX19HUElPNl84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQUxFX19VU0JQSFkxX1ZTVEFUVVNfMQkJKF9NWDUzX1BBRF9OQU5ERl9BTEVfX1VTQlBIWTFfVlNUQVRVU18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfV1BfQl9fRU1JX05BTkRGX1dQX0IJCShfTVg1M19QQURfTkFOREZfV1BfQl9fRU1JX05BTkRGX1dQX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9XUF9CX19HUElPNl85CQkoX01YNTNfUEFEX05BTkRGX1dQX0JfX0dQSU82XzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9XUF9CX19VU0JQSFkxX1ZTVEFUVVNfMgkJKF9NWDUzX1BBRF9OQU5ERl9XUF9CX19VU0JQSFkxX1ZTVEFUVVNfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX1JCMF9fRU1JX05BTkRGX1JCXzAJCShfTVg1M19QQURfTkFOREZfUkIwX19FTUlfTkFOREZfUkJfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX1JCMF9fR1BJTzZfMTAJCShfTVg1M19QQURfTkFOREZfUkIwX19HUElPNl8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX1JCMF9fVVNCUEhZMV9WU1RBVFVTXzMJCShfTVg1M19QQURfTkFOREZfUkIwX19VU0JQSFkxX1ZTVEFUVVNfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMF9fRU1JX05BTkRGX0NTXzAJCShfTVg1M19QQURfTkFOREZfQ1MwX19FTUlfTkFOREZfQ1NfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMF9fR1BJTzZfMTEJCShfTVg1M19QQURfTkFOREZfQ1MwX19HUElPNl8xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMF9fVVNCUEhZMV9WU1RBVFVTXzQJCShfTVg1M19QQURfTkFOREZfQ1MwX19VU0JQSFkxX1ZTVEFUVVNfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMV9fRU1JX05BTkRGX0NTXzEJCShfTVg1M19QQURfTkFOREZfQ1MxX19FTUlfTkFOREZfQ1NfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMV9fR1BJTzZfMTQJCShfTVg1M19QQURfTkFOREZfQ1MxX19HUElPNl8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMV9fTUxCX01MQkNMSwkJKF9NWDUzX1BBRF9OQU5ERl9DUzFfX01MQl9NTEJDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzFfX1VTQlBIWTFfVlNUQVRVU181CQkoX01YNTNfUEFEX05BTkRGX0NTMV9fVVNCUEhZMV9WU1RBVFVTXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX0VNSV9OQU5ERl9DU18yCQkoX01YNTNfUEFEX05BTkRGX0NTMl9fRU1JX05BTkRGX0NTXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX0dQSU82XzE1CQkoX01YNTNfUEFEX05BTkRGX0NTMl9fR1BJTzZfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX0lQVV9TSVNHXzAJCShfTVg1M19QQURfTkFOREZfQ1MyX19JUFVfU0lTR18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MyX19FU0FJMV9UWDAJCShfTVg1M19QQURfTkFOREZfQ1MyX19FU0FJMV9UWDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX0VNSV9XRUlNX0NSRQkJKF9NWDUzX1BBRF9OQU5ERl9DUzJfX0VNSV9XRUlNX0NSRSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fQ0NNX0NTSTBfTUNMSwkJKF9NWDUzX1BBRF9OQU5ERl9DUzJfX0NDTV9DU0kwX01DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX01MQl9NTEJTSUcJCShfTVg1M19QQURfTkFOREZfQ1MyX19NTEJfTUxCU0lHIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MyX19VU0JQSFkxX1ZTVEFUVVNfNgkJKF9NWDUzX1BBRF9OQU5ERl9DUzJfX1VTQlBIWTFfVlNUQVRVU182IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MzX19FTUlfTkFOREZfQ1NfMwkJKF9NWDUzX1BBRF9OQU5ERl9DUzNfX0VNSV9OQU5ERl9DU18zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MzX19HUElPNl8xNgkJKF9NWDUzX1BBRF9OQU5ERl9DUzNfX0dQSU82XzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MzX19JUFVfU0lTR18xCQkoX01YNTNfUEFEX05BTkRGX0NTM19fSVBVX1NJU0dfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTM19fRVNBSTFfVFgxCQkoX01YNTNfUEFEX05BTkRGX0NTM19fRVNBSTFfVFgxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MzX19FTUlfV0VJTV9BXzI2CQkoX01YNTNfUEFEX05BTkRGX0NTM19fRU1JX1dFSU1fQV8yNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTM19fTUxCX01MQkRBVAkJKF9NWDUzX1BBRF9OQU5ERl9DUzNfX01MQl9NTEJEQVQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX1VTQlBIWTFfVlNUQVRVU183CQkoX01YNTNfUEFEX05BTkRGX0NTM19fVVNCUEhZMV9WU1RBVFVTXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fRkVDX01ESU8JCShfTVg1M19QQURfRkVDX01ESU9fX0ZFQ19NRElPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX01ESU9fX0dQSU8xXzIyCQkoX01YNTNfUEFEX0ZFQ19NRElPX19HUElPMV8yMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRElPX19FU0FJMV9TQ0tSCQkoX01YNTNfUEFEX0ZFQ19NRElPX19FU0FJMV9TQ0tSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX01ESU9fX0ZFQ19DT0wJCShfTVg1M19QQURfRkVDX01ESU9fX0ZFQ19DT0wgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fUlRDX0NFX1JUQ19QUzIJCShfTVg1M19QQURfRkVDX01ESU9fX1JUQ19DRV9SVENfUFMyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX01ESU9fX1NETUFfREVCVUdfQlVTX0RFVklDRV8zCQkoX01YNTNfUEFEX0ZFQ19NRElPX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRElPX19FTUlfRU1JX0RFQlVHXzQ5CQkoX01YNTNfUEFEX0ZFQ19NRElPX19FTUlfRU1JX0RFQlVHXzQ5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JFRl9DTEtfX0ZFQ19UWF9DTEsJCShfTVg1M19QQURfRkVDX1JFRl9DTEtfX0ZFQ19UWF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUkVGX0NMS19fR1BJTzFfMjMJCShfTVg1M19QQURfRkVDX1JFRl9DTEtfX0dQSU8xXzIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JFRl9DTEtfX0VTQUkxX0ZTUgkJKF9NWDUzX1BBRF9GRUNfUkVGX0NMS19fRVNBSTFfRlNSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JFRl9DTEtfX1NETUFfREVCVUdfQlVTX0RFVklDRV80CQkoX01YNTNfUEFEX0ZFQ19SRUZfQ0xLX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SRUZfQ0xLX19FTUlfRU1JX0RFQlVHXzUwCQkoX01YNTNfUEFEX0ZFQ19SRUZfQ0xLX19FTUlfRU1JX0RFQlVHXzUwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JYX0VSX19GRUNfUlhfRVIJCShfTVg1M19QQURfRkVDX1JYX0VSX19GRUNfUlhfRVIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhfRVJfX0dQSU8xXzI0CQkoX01YNTNfUEFEX0ZFQ19SWF9FUl9fR1BJTzFfMjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhfRVJfX0VTQUkxX0hDS1IJCShfTVg1M19QQURfRkVDX1JYX0VSX19FU0FJMV9IQ0tSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JYX0VSX19GRUNfUlhfQ0xLCQkoX01YNTNfUEFEX0ZFQ19SWF9FUl9fRkVDX1JYX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWF9FUl9fUlRDX0NFX1JUQ19QUzMJCShfTVg1M19QQURfRkVDX1JYX0VSX19SVENfQ0VfUlRDX1BTMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19DUlNfRFZfX0ZFQ19SWF9EVgkJKF9NWDUzX1BBRF9GRUNfQ1JTX0RWX19GRUNfUlhfRFYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfQ1JTX0RWX19HUElPMV8yNQkJKF9NWDUzX1BBRF9GRUNfQ1JTX0RWX19HUElPMV8yNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19DUlNfRFZfX0VTQUkxX1NDS1QJCShfTVg1M19QQURfRkVDX0NSU19EVl9fRVNBSTFfU0NLVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQxX19GRUNfUkRBVEFfMQkJKF9NWDUzX1BBRF9GRUNfUlhEMV9fRkVDX1JEQVRBXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMV9fR1BJTzFfMjYJCShfTVg1M19QQURfRkVDX1JYRDFfX0dQSU8xXzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDFfX0VTQUkxX0ZTVAkJKF9NWDUzX1BBRF9GRUNfUlhEMV9fRVNBSTFfRlNUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDFfX01MQl9NTEJTSUcJCShfTVg1M19QQURfRkVDX1JYRDFfX01MQl9NTEJTSUcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMV9fUlRDX0NFX1JUQ19QUzEJCShfTVg1M19QQURfRkVDX1JYRDFfX1JUQ19DRV9SVENfUFMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDBfX0ZFQ19SREFUQV8wCQkoX01YNTNfUEFEX0ZFQ19SWEQwX19GRUNfUkRBVEFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQwX19HUElPMV8yNwkJKF9NWDUzX1BBRF9GRUNfUlhEMF9fR1BJTzFfMjcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMF9fRVNBSTFfSENLVAkJKF9NWDUzX1BBRF9GRUNfUlhEMF9fRVNBSTFfSENLVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQwX19PU0MzMmtfMzJLX09VVAkJKF9NWDUzX1BBRF9GRUNfUlhEMF9fT1NDMzJrXzMyS19PVVQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhfRU5fX0ZFQ19UWF9FTgkJKF9NWDUzX1BBRF9GRUNfVFhfRU5fX0ZFQ19UWF9FTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWF9FTl9fR1BJTzFfMjgJCShfTVg1M19QQURfRkVDX1RYX0VOX19HUElPMV8yOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWF9FTl9fRVNBSTFfVFgzX1JYMgkJKF9NWDUzX1BBRF9GRUNfVFhfRU5fX0VTQUkxX1RYM19SWDIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMV9fRkVDX1REQVRBXzEJCShfTVg1M19QQURfRkVDX1RYRDFfX0ZFQ19UREFUQV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDFfX0dQSU8xXzI5CQkoX01YNTNfUEFEX0ZFQ19UWEQxX19HUElPMV8yOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQxX19FU0FJMV9UWDJfUlgzCQkoX01YNTNfUEFEX0ZFQ19UWEQxX19FU0FJMV9UWDJfUlgzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDFfX01MQl9NTEJDTEsJCShfTVg1M19QQURfRkVDX1RYRDFfX01MQl9NTEJDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMV9fUlRDX0NFX1JUQ19QUlNDX0NMSwkJKF9NWDUzX1BBRF9GRUNfVFhEMV9fUlRDX0NFX1JUQ19QUlNDX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQwX19GRUNfVERBVEFfMAkJKF9NWDUzX1BBRF9GRUNfVFhEMF9fRkVDX1REQVRBXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMF9fR1BJTzFfMzAJCShfTVg1M19QQURfRkVDX1RYRDBfX0dQSU8xXzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDBfX0VTQUkxX1RYNF9SWDEJCShfTVg1M19QQURfRkVDX1RYRDBfX0VTQUkxX1RYNF9SWDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMF9fVVNCUEhZMl9EQVRBT1VUXzAJCShfTVg1M19QQURfRkVDX1RYRDBfX1VTQlBIWTJfREFUQU9VVF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX01EQ19fRkVDX01EQwkJKF9NWDUzX1BBRF9GRUNfTURDX19GRUNfTURDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX01EQ19fR1BJTzFfMzEJCShfTVg1M19QQURfRkVDX01EQ19fR1BJTzFfMzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19FU0FJMV9UWDVfUlgwCQkoX01YNTNfUEFEX0ZFQ19NRENfX0VTQUkxX1RYNV9SWDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19NTEJfTUxCREFUCQkoX01YNTNfUEFEX0ZFQ19NRENfX01MQl9NTEJEQVQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19SVENfQ0VfUlRDX0FMQVJNMV9UUklHCQkoX01YNTNfUEFEX0ZFQ19NRENfX1JUQ19DRV9SVENfQUxBUk0xX1RSSUcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19VU0JQSFkyX0RBVEFPVVRfMQkJKF9NWDUzX1BBRF9GRUNfTURDX19VU0JQSFkyX0RBVEFPVVRfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPV19fUEFUQV9ESU9XCQkoX01YNTNfUEFEX1BBVEFfRElPV19fUEFUQV9ESU9XIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9XX19HUElPNl8xNwkJKF9NWDUzX1BBRF9QQVRBX0RJT1dfX0dQSU82XzE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9XX19VQVJUMV9UWERfTVVYCQkoX01YNTNfUEFEX1BBVEFfRElPV19fVUFSVDFfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1dfX1VTQlBIWTJfREFUQU9VVF8yCQkoX01YNTNfUEFEX1BBVEFfRElPV19fVVNCUEhZMl9EQVRBT1VUXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RNQUNLX19QQVRBX0RNQUNLCQkoX01YNTNfUEFEX1BBVEFfRE1BQ0tfX1BBVEFfRE1BQ0sgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RNQUNLX19HUElPNl8xOAkJKF9NWDUzX1BBRF9QQVRBX0RNQUNLX19HUElPNl8xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BQ0tfX1VBUlQxX1JYRF9NVVgJCShfTVg1M19QQURfUEFUQV9ETUFDS19fVUFSVDFfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RNQUNLX19VU0JQSFkyX0RBVEFPVVRfMwkJKF9NWDUzX1BBRF9QQVRBX0RNQUNLX19VU0JQSFkyX0RBVEFPVVRfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BUlFfX1BBVEFfRE1BUlEJCShfTVg1M19QQURfUEFUQV9ETUFSUV9fUEFUQV9ETUFSUSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BUlFfX0dQSU83XzAJCShfTVg1M19QQURfUEFUQV9ETUFSUV9fR1BJTzdfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BUlFfX1VBUlQyX1RYRF9NVVgJCShfTVg1M19QQURfUEFUQV9ETUFSUV9fVUFSVDJfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RNQVJRX19DQ01fQ0NNX09VVF8wCQkoX01YNTNfUEFEX1BBVEFfRE1BUlFfX0NDTV9DQ01fT1VUXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RNQVJRX19VU0JQSFkyX0RBVEFPVVRfNAkJKF9NWDUzX1BBRF9QQVRBX0RNQVJRX19VU0JQSFkyX0RBVEFPVVRfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19QQVRBX0JVRkZFUl9FTgkJKF9NWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fUEFUQV9CVUZGRVJfRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fR1BJTzdfMQkJKF9NWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fR1BJTzdfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19VQVJUMl9SWERfTVVYCQkoX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19VQVJUMl9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19DQ01fQ0NNX09VVF8xCQkoX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19DQ01fQ0NNX09VVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX1VTQlBIWTJfREFUQU9VVF81CQkoX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19VU0JQSFkyX0RBVEFPVVRfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU5UUlFfX1BBVEFfSU5UUlEJCShfTVg1M19QQURfUEFUQV9JTlRSUV9fUEFUQV9JTlRSUSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU5UUlFfX0dQSU83XzIJCShfTVg1M19QQURfUEFUQV9JTlRSUV9fR1BJTzdfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU5UUlFfX1VBUlQyX0NUUwkJKF9NWDUzX1BBRF9QQVRBX0lOVFJRX19VQVJUMl9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JTlRSUV9fQ0FOMV9UWENBTgkJKF9NWDUzX1BBRF9QQVRBX0lOVFJRX19DQU4xX1RYQ0FOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JTlRSUV9fQ0NNX0NDTV9PVVRfMgkJKF9NWDUzX1BBRF9QQVRBX0lOVFJRX19DQ01fQ0NNX09VVF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JTlRSUV9fVVNCUEhZMl9EQVRBT1VUXzYJCShfTVg1M19QQURfUEFUQV9JTlRSUV9fVVNCUEhZMl9EQVRBT1VUXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1JfX1BBVEFfRElPUgkJKF9NWDUzX1BBRF9QQVRBX0RJT1JfX1BBVEFfRElPUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPUl9fR1BJTzdfMwkJKF9NWDUzX1BBRF9QQVRBX0RJT1JfX0dQSU83XzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1JfX1VBUlQyX1JUUwkJKF9NWDUzX1BBRF9QQVRBX0RJT1JfX1VBUlQyX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1JfX0NBTjFfUlhDQU4JCShfTVg1M19QQURfUEFUQV9ESU9SX19DQU4xX1JYQ0FOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9SX19VU0JQSFkyX0RBVEFPVVRfNwkJKF9NWDUzX1BBRF9QQVRBX0RJT1JfX1VTQlBIWTJfREFUQU9VVF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19QQVRBX1BBVEFfUkVTRVRfQgkJKF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1BBVEFfUEFUQV9SRVNFVF9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19HUElPN180CQkoX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fR1BJTzdfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfUkVTRVRfQl9fRVNESEMzX0NNRAkJKF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX0VTREhDM19DTUQgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19VQVJUMV9DVFMJCShfTVg1M19QQURfUEFUQV9SRVNFVF9CX19VQVJUMV9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19DQU4yX1RYQ0FOCQkoX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fQ0FOMl9UWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfUkVTRVRfQl9fVVNCUEhZMV9EQVRBT1VUXzAJCShfTVg1M19QQURfUEFUQV9SRVNFVF9CX19VU0JQSFkxX0RBVEFPVVRfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX1BBVEFfSU9SRFkJCShfTVg1M19QQURfUEFUQV9JT1JEWV9fUEFUQV9JT1JEWSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX0dQSU83XzUJCShfTVg1M19QQURfUEFUQV9JT1JEWV9fR1BJTzdfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX0VTREhDM19DTEsJCShfTVg1M19QQURfUEFUQV9JT1JEWV9fRVNESEMzX0NMSyB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lPUkRZX19VQVJUMV9SVFMJCShfTVg1M19QQURfUEFUQV9JT1JEWV9fVUFSVDFfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX0NBTjJfUlhDQU4JCShfTVg1M19QQURfUEFUQV9JT1JEWV9fQ0FOMl9SWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX1VTQlBIWTFfREFUQU9VVF8xCQkoX01YNTNfUEFEX1BBVEFfSU9SRFlfX1VTQlBIWTFfREFUQU9VVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8wX19QQVRBX0RBXzAJCShfTVg1M19QQURfUEFUQV9EQV8wX19QQVRBX0RBXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzBfX0dQSU83XzYJCShfTVg1M19QQURfUEFUQV9EQV8wX19HUElPN182IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8wX19FU0RIQzNfUlNUCQkoX01YNTNfUEFEX1BBVEFfREFfMF9fRVNESEMzX1JTVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMF9fT1dJUkVfTElORQkJKF9NWDUzX1BBRF9QQVRBX0RBXzBfX09XSVJFX0xJTkUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzBfX1VTQlBIWTFfREFUQU9VVF8yCQkoX01YNTNfUEFEX1BBVEFfREFfMF9fVVNCUEhZMV9EQVRBT1VUXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzFfX1BBVEFfREFfMQkJKF9NWDUzX1BBRF9QQVRBX0RBXzFfX1BBVEFfREFfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMV9fR1BJTzdfNwkJKF9NWDUzX1BBRF9QQVRBX0RBXzFfX0dQSU83XzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzFfX0VTREhDNF9DTUQJCShfTVg1M19QQURfUEFUQV9EQV8xX19FU0RIQzRfQ01EIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMV9fVUFSVDNfQ1RTCQkoX01YNTNfUEFEX1BBVEFfREFfMV9fVUFSVDNfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMV9fVVNCUEhZMV9EQVRBT1VUXzMJCShfTVg1M19QQURfUEFUQV9EQV8xX19VU0JQSFkxX0RBVEFPVVRfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMl9fUEFUQV9EQV8yCQkoX01YNTNfUEFEX1BBVEFfREFfMl9fUEFUQV9EQV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8yX19HUElPN184CQkoX01YNTNfUEFEX1BBVEFfREFfMl9fR1BJTzdfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMl9fRVNESEM0X0NMSwkJKF9NWDUzX1BBRF9QQVRBX0RBXzJfX0VTREhDNF9DTEsgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8yX19VQVJUM19SVFMJCShfTVg1M19QQURfUEFUQV9EQV8yX19VQVJUM19SVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8yX19VU0JQSFkxX0RBVEFPVVRfNAkJKF9NWDUzX1BBRF9QQVRBX0RBXzJfX1VTQlBIWTFfREFUQU9VVF80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18wX19QQVRBX0NTXzAJCShfTVg1M19QQURfUEFUQV9DU18wX19QQVRBX0NTXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzBfX0dQSU83XzkJCShfTVg1M19QQURfUEFUQV9DU18wX19HUElPN185IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18wX19VQVJUM19UWERfTVVYCQkoX01YNTNfUEFEX1BBVEFfQ1NfMF9fVUFSVDNfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzBfX1VTQlBIWTFfREFUQU9VVF81CQkoX01YNTNfUEFEX1BBVEFfQ1NfMF9fVVNCUEhZMV9EQVRBT1VUXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzFfX1BBVEFfQ1NfMQkJKF9NWDUzX1BBRF9QQVRBX0NTXzFfX1BBVEFfQ1NfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMV9fR1BJTzdfMTAJCShfTVg1M19QQURfUEFUQV9DU18xX19HUElPN18xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMV9fVUFSVDNfUlhEX01VWAkJKF9NWDUzX1BBRF9QQVRBX0NTXzFfX1VBUlQzX1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18xX19VU0JQSFkxX0RBVEFPVVRfNgkJKF9NWDUzX1BBRF9QQVRBX0NTXzFfX1VTQlBIWTFfREFUQU9VVF82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMF9fUEFUQV9EQVRBXzAJCShfTVg1M19QQURfUEFUQV9EQVRBMF9fUEFUQV9EQVRBXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19HUElPMl8wCQkoX01YNTNfUEFEX1BBVEFfREFUQTBfX0dQSU8yXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19FTUlfTkFOREZfRF8wCQkoX01YNTNfUEFEX1BBVEFfREFUQTBfX0VNSV9OQU5ERl9EXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19FU0RIQzNfREFUNAkJKF9NWDUzX1BBRF9QQVRBX0RBVEEwX19FU0RIQzNfREFUNCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19HUFUzZF9HUFVfREVCVUdfT1VUXzAJCShfTVg1M19QQURfUEFUQV9EQVRBMF9fR1BVM2RfR1BVX0RFQlVHX09VVF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMF9fSVBVX0RJQUdfQlVTXzAJCShfTVg1M19QQURfUEFUQV9EQVRBMF9fSVBVX0RJQUdfQlVTXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19VU0JQSFkxX0RBVEFPVVRfNwkJKF9NWDUzX1BBRF9QQVRBX0RBVEEwX19VU0JQSFkxX0RBVEFPVVRfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTFfX1BBVEFfREFUQV8xCQkoX01YNTNfUEFEX1BBVEFfREFUQTFfX1BBVEFfREFUQV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fR1BJTzJfMQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExX19HUElPMl8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fRU1JX05BTkRGX0RfMQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExX19FTUlfTkFOREZfRF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fRVNESEMzX0RBVDUJCShfTVg1M19QQURfUEFUQV9EQVRBMV9fRVNESEMzX0RBVDUgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xCQkoX01YNTNfUEFEX1BBVEFfREFUQTFfX0dQVTNkX0dQVV9ERUJVR19PVVRfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTFfX0lQVV9ESUFHX0JVU18xCQkoX01YNTNfUEFEX1BBVEFfREFUQTFfX0lQVV9ESUFHX0JVU18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMl9fUEFUQV9EQVRBXzIJCShfTVg1M19QQURfUEFUQV9EQVRBMl9fUEFUQV9EQVRBXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19HUElPMl8yCQkoX01YNTNfUEFEX1BBVEFfREFUQTJfX0dQSU8yXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19FTUlfTkFOREZfRF8yCQkoX01YNTNfUEFEX1BBVEFfREFUQTJfX0VNSV9OQU5ERl9EXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19FU0RIQzNfREFUNgkJKF9NWDUzX1BBRF9QQVRBX0RBVEEyX19FU0RIQzNfREFUNiB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19HUFUzZF9HUFVfREVCVUdfT1VUXzIJCShfTVg1M19QQURfUEFUQV9EQVRBMl9fR1BVM2RfR1BVX0RFQlVHX09VVF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMl9fSVBVX0RJQUdfQlVTXzIJCShfTVg1M19QQURfUEFUQV9EQVRBMl9fSVBVX0RJQUdfQlVTXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEzX19QQVRBX0RBVEFfMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEEzX19QQVRBX0RBVEFfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTNfX0dQSU8yXzMJCShfTVg1M19QQURfUEFUQV9EQVRBM19fR1BJTzJfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTNfX0VNSV9OQU5ERl9EXzMJCShfTVg1M19QQURfUEFUQV9EQVRBM19fRU1JX05BTkRGX0RfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTNfX0VTREhDM19EQVQ3CQkoX01YNTNfUEFEX1BBVEFfREFUQTNfX0VTREhDM19EQVQ3IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTNfX0dQVTNkX0dQVV9ERUJVR19PVVRfMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEEzX19HUFUzZF9HUFVfREVCVUdfT1VUXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEzX19JUFVfRElBR19CVVNfMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEEzX19JUFVfRElBR19CVVNfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTRfX1BBVEFfREFUQV80CQkoX01YNTNfUEFEX1BBVEFfREFUQTRfX1BBVEFfREFUQV80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fR1BJTzJfNAkJKF9NWDUzX1BBRF9QQVRBX0RBVEE0X19HUElPMl80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fRU1JX05BTkRGX0RfNAkJKF9NWDUzX1BBRF9QQVRBX0RBVEE0X19FTUlfTkFOREZfRF80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fRVNESEM0X0RBVDQJCShfTVg1M19QQURfUEFUQV9EQVRBNF9fRVNESEM0X0RBVDQgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fR1BVM2RfR1BVX0RFQlVHX09VVF80CQkoX01YNTNfUEFEX1BBVEFfREFUQTRfX0dQVTNkX0dQVV9ERUJVR19PVVRfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTRfX0lQVV9ESUFHX0JVU180CQkoX01YNTNfUEFEX1BBVEFfREFUQTRfX0lQVV9ESUFHX0JVU180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNV9fUEFUQV9EQVRBXzUJCShfTVg1M19QQURfUEFUQV9EQVRBNV9fUEFUQV9EQVRBXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19HUElPMl81CQkoX01YNTNfUEFEX1BBVEFfREFUQTVfX0dQSU8yXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19FTUlfTkFOREZfRF81CQkoX01YNTNfUEFEX1BBVEFfREFUQTVfX0VNSV9OQU5ERl9EXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19FU0RIQzRfREFUNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEE1X19FU0RIQzRfREFUNSB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19HUFUzZF9HUFVfREVCVUdfT1VUXzUJCShfTVg1M19QQURfUEFUQV9EQVRBNV9fR1BVM2RfR1BVX0RFQlVHX09VVF81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNV9fSVBVX0RJQUdfQlVTXzUJCShfTVg1M19QQURfUEFUQV9EQVRBNV9fSVBVX0RJQUdfQlVTXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE2X19QQVRBX0RBVEFfNgkJKF9NWDUzX1BBRF9QQVRBX0RBVEE2X19QQVRBX0RBVEFfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTZfX0dQSU8yXzYJCShfTVg1M19QQURfUEFUQV9EQVRBNl9fR1BJTzJfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTZfX0VNSV9OQU5ERl9EXzYJCShfTVg1M19QQURfUEFUQV9EQVRBNl9fRU1JX05BTkRGX0RfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTZfX0VTREhDNF9EQVQ2CQkoX01YNTNfUEFEX1BBVEFfREFUQTZfX0VTREhDNF9EQVQ2IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTZfX0dQVTNkX0dQVV9ERUJVR19PVVRfNgkJKF9NWDUzX1BBRF9QQVRBX0RBVEE2X19HUFUzZF9HUFVfREVCVUdfT1VUXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE2X19JUFVfRElBR19CVVNfNgkJKF9NWDUzX1BBRF9QQVRBX0RBVEE2X19JUFVfRElBR19CVVNfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTdfX1BBVEFfREFUQV83CQkoX01YNTNfUEFEX1BBVEFfREFUQTdfX1BBVEFfREFUQV83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fR1BJTzJfNwkJKF9NWDUzX1BBRF9QQVRBX0RBVEE3X19HUElPMl83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fRU1JX05BTkRGX0RfNwkJKF9NWDUzX1BBRF9QQVRBX0RBVEE3X19FTUlfTkFOREZfRF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fRVNESEM0X0RBVDcJCShfTVg1M19QQURfUEFUQV9EQVRBN19fRVNESEM0X0RBVDcgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fR1BVM2RfR1BVX0RFQlVHX09VVF83CQkoX01YNTNfUEFEX1BBVEFfREFUQTdfX0dQVTNkX0dQVV9ERUJVR19PVVRfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTdfX0lQVV9ESUFHX0JVU183CQkoX01YNTNfUEFEX1BBVEFfREFUQTdfX0lQVV9ESUFHX0JVU183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOF9fUEFUQV9EQVRBXzgJCShfTVg1M19QQURfUEFUQV9EQVRBOF9fUEFUQV9EQVRBXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19HUElPMl84CQkoX01YNTNfUEFEX1BBVEFfREFUQThfX0dQSU8yXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19FU0RIQzFfREFUNAkJKF9NWDUzX1BBRF9QQVRBX0RBVEE4X19FU0RIQzFfREFUNCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19FTUlfTkFOREZfRF84CQkoX01YNTNfUEFEX1BBVEFfREFUQThfX0VNSV9OQU5ERl9EXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19FU0RIQzNfREFUMAkJKF9NWDUzX1BBRF9QQVRBX0RBVEE4X19FU0RIQzNfREFUMCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19HUFUzZF9HUFVfREVCVUdfT1VUXzgJCShfTVg1M19QQURfUEFUQV9EQVRBOF9fR1BVM2RfR1BVX0RFQlVHX09VVF84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOF9fSVBVX0RJQUdfQlVTXzgJCShfTVg1M19QQURfUEFUQV9EQVRBOF9fSVBVX0RJQUdfQlVTXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE5X19QQVRBX0RBVEFfOQkJKF9NWDUzX1BBRF9QQVRBX0RBVEE5X19QQVRBX0RBVEFfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0dQSU8yXzkJCShfTVg1M19QQURfUEFUQV9EQVRBOV9fR1BJTzJfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0VTREhDMV9EQVQ1CQkoX01YNTNfUEFEX1BBVEFfREFUQTlfX0VTREhDMV9EQVQ1IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0VNSV9OQU5ERl9EXzkJCShfTVg1M19QQURfUEFUQV9EQVRBOV9fRU1JX05BTkRGX0RfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0VTREhDM19EQVQxCQkoX01YNTNfUEFEX1BBVEFfREFUQTlfX0VTREhDM19EQVQxIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0dQVTNkX0dQVV9ERUJVR19PVVRfOQkJKF9NWDUzX1BBRF9QQVRBX0RBVEE5X19HUFUzZF9HUFVfREVCVUdfT1VUXzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE5X19JUFVfRElBR19CVVNfOQkJKF9NWDUzX1BBRF9QQVRBX0RBVEE5X19JUFVfRElBR19CVVNfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19QQVRBX0RBVEFfMTAJCShfTVg1M19QQURfUEFUQV9EQVRBMTBfX1BBVEFfREFUQV8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19HUElPMl8xMAkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fR1BJTzJfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMF9fRVNESEMxX0RBVDYJCShfTVg1M19QQURfUEFUQV9EQVRBMTBfX0VTREhDMV9EQVQ2IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19FTUlfTkFOREZfRF8xMAkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fRU1JX05BTkRGX0RfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMF9fRVNESEMzX0RBVDIJCShfTVg1M19QQURfUEFUQV9EQVRBMTBfX0VTREhDM19EQVQyIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19HUFUzZF9HUFVfREVCVUdfT1VUXzEwCQkoX01YNTNfUEFEX1BBVEFfREFUQTEwX19HUFUzZF9HUFVfREVCVUdfT1VUXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTBfX0lQVV9ESUFHX0JVU18xMAkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fSVBVX0RJQUdfQlVTXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX1BBVEFfREFUQV8xMQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMV9fUEFUQV9EQVRBXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX0dQSU8yXzExCQkoX01YNTNfUEFEX1BBVEFfREFUQTExX19HUElPMl8xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTExX19FU0RIQzFfREFUNwkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMV9fRVNESEMxX0RBVDcgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX0VNSV9OQU5ERl9EXzExCQkoX01YNTNfUEFEX1BBVEFfREFUQTExX19FTUlfTkFOREZfRF8xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTExX19FU0RIQzNfREFUMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMV9fRVNESEMzX0RBVDMgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTEJCShfTVg1M19QQURfUEFUQV9EQVRBMTFfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fSVBVX0RJQUdfQlVTXzExCQkoX01YNTNfUEFEX1BBVEFfREFUQTExX19JUFVfRElBR19CVVNfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fUEFUQV9EQVRBXzEyCQkoX01YNTNfUEFEX1BBVEFfREFUQTEyX19QQVRBX0RBVEFfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fR1BJTzJfMTIJCShfTVg1M19QQURfUEFUQV9EQVRBMTJfX0dQSU8yXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTJfX0VTREhDMl9EQVQ0CQkoX01YNTNfUEFEX1BBVEFfREFUQTEyX19FU0RIQzJfREFUNCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fRU1JX05BTkRGX0RfMTIJCShfTVg1M19QQURfUEFUQV9EQVRBMTJfX0VNSV9OQU5ERl9EXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTJfX0VTREhDNF9EQVQwCQkoX01YNTNfUEFEX1BBVEFfREFUQTEyX19FU0RIQzRfREFUMCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fR1BVM2RfR1BVX0RFQlVHX09VVF8xMgkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMl9fR1BVM2RfR1BVX0RFQlVHX09VVF8xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19JUFVfRElBR19CVVNfMTIJCShfTVg1M19QQURfUEFUQV9EQVRBMTJfX0lQVV9ESUFHX0JVU18xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19QQVRBX0RBVEFfMTMJCShfTVg1M19QQURfUEFUQV9EQVRBMTNfX1BBVEFfREFUQV8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19HUElPMl8xMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEExM19fR1BJTzJfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExM19fRVNESEMyX0RBVDUJCShfTVg1M19QQURfUEFUQV9EQVRBMTNfX0VTREhDMl9EQVQ1IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19FTUlfTkFOREZfRF8xMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEExM19fRU1JX05BTkRGX0RfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExM19fRVNESEM0X0RBVDEJCShfTVg1M19QQURfUEFUQV9EQVRBMTNfX0VTREhDNF9EQVQxIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19HUFUzZF9HUFVfREVCVUdfT1VUXzEzCQkoX01YNTNfUEFEX1BBVEFfREFUQTEzX19HUFUzZF9HUFVfREVCVUdfT1VUXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTNfX0lQVV9ESUFHX0JVU18xMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEExM19fSVBVX0RJQUdfQlVTXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX1BBVEFfREFUQV8xNAkJKF9NWDUzX1BBRF9QQVRBX0RBVEExNF9fUEFUQV9EQVRBXzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX0dQSU8yXzE0CQkoX01YNTNfUEFEX1BBVEFfREFUQTE0X19HUElPMl8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE0X19FU0RIQzJfREFUNgkJKF9NWDUzX1BBRF9QQVRBX0RBVEExNF9fRVNESEMyX0RBVDYgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX0VNSV9OQU5ERl9EXzE0CQkoX01YNTNfUEFEX1BBVEFfREFUQTE0X19FTUlfTkFOREZfRF8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE0X19FU0RIQzRfREFUMgkJKF9NWDUzX1BBRF9QQVRBX0RBVEExNF9fRVNESEM0X0RBVDIgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTQJCShfTVg1M19QQURfUEFUQV9EQVRBMTRfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fSVBVX0RJQUdfQlVTXzE0CQkoX01YNTNfUEFEX1BBVEFfREFUQTE0X19JUFVfRElBR19CVVNfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fUEFUQV9EQVRBXzE1CQkoX01YNTNfUEFEX1BBVEFfREFUQTE1X19QQVRBX0RBVEFfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fR1BJTzJfMTUJCShfTVg1M19QQURfUEFUQV9EQVRBMTVfX0dQSU8yXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTVfX0VTREhDMl9EQVQ3CQkoX01YNTNfUEFEX1BBVEFfREFUQTE1X19FU0RIQzJfREFUNyB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fRU1JX05BTkRGX0RfMTUJCShfTVg1M19QQURfUEFUQV9EQVRBMTVfX0VNSV9OQU5ERl9EXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTVfX0VTREhDNF9EQVQzCQkoX01YNTNfUEFEX1BBVEFfREFUQTE1X19FU0RIQzRfREFUMyB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExNV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19JUFVfRElBR19CVVNfMTUJCShfTVg1M19QQURfUEFUQV9EQVRBMTVfX0lQVV9ESUFHX0JVU18xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMF9fRVNESEMxX0RBVDAJCShfTVg1M19QQURfU0QxX0RBVEEwX19FU0RIQzFfREFUMCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTBfX0dQSU8xXzE2CQkoX01YNTNfUEFEX1NEMV9EQVRBMF9fR1BJTzFfMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTBfX0dQVF9DQVBJTjEJCShfTVg1M19QQURfU0QxX0RBVEEwX19HUFRfQ0FQSU4xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEwX19DU1BJX01JU08JCShfTVg1M19QQURfU0QxX0RBVEEwX19DU1BJX01JU08gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTBfX0NDTV9QTEwzX0JZUAkJKF9NWDUzX1BBRF9TRDFfREFUQTBfX0NDTV9QTEwzX0JZUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMV9fRVNESEMxX0RBVDEJCShfTVg1M19QQURfU0QxX0RBVEExX19FU0RIQzFfREFUMSB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTFfX0dQSU8xXzE3CQkoX01YNTNfUEFEX1NEMV9EQVRBMV9fR1BJTzFfMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTFfX0dQVF9DQVBJTjIJCShfTVg1M19QQURfU0QxX0RBVEExX19HUFRfQ0FQSU4yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEExX19DU1BJX1NTMAkJKF9NWDUzX1BBRF9TRDFfREFUQTFfX0NTUElfU1MwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEExX19DQ01fUExMNF9CWVAJCShfTVg1M19QQURfU0QxX0RBVEExX19DQ01fUExMNF9CWVAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfQ01EX19FU0RIQzFfQ01ECQkoX01YNTNfUEFEX1NEMV9DTURfX0VTREhDMV9DTUQgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0NNRF9fR1BJTzFfMTgJCShfTVg1M19QQURfU0QxX0NNRF9fR1BJTzFfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfQ01EX19HUFRfQ01QT1VUMQkJKF9NWDUzX1BBRF9TRDFfQ01EX19HUFRfQ01QT1VUMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9DTURfX0NTUElfTU9TSQkJKF9NWDUzX1BBRF9TRDFfQ01EX19DU1BJX01PU0kgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfQ01EX19DQ01fUExMMV9CWVAJCShfTVg1M19QQURfU0QxX0NNRF9fQ0NNX1BMTDFfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19FU0RIQzFfREFUMgkJKF9NWDUzX1BBRF9TRDFfREFUQTJfX0VTREhDMV9EQVQyIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fR1BJTzFfMTkJCShfTVg1M19QQURfU0QxX0RBVEEyX19HUElPMV8xOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fR1BUX0NNUE9VVDIJCShfTVg1M19QQURfU0QxX0RBVEEyX19HUFRfQ01QT1VUMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fUFdNMl9QV01PCQkoX01YNTNfUEFEX1NEMV9EQVRBMl9fUFdNMl9QV01PIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19XRE9HMV9XRE9HX0IJCShfTVg1M19QQURfU0QxX0RBVEEyX19XRE9HMV9XRE9HX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX0NTUElfU1MxCQkoX01YNTNfUEFEX1NEMV9EQVRBMl9fQ1NQSV9TUzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX1dET0cxX1dET0dfUlNUX0JfREVCCQkoX01YNTNfUEFEX1NEMV9EQVRBMl9fV0RPRzFfV0RPR19SU1RfQl9ERUIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX0NDTV9QTEwyX0JZUAkJKF9NWDUzX1BBRF9TRDFfREFUQTJfX0NDTV9QTEwyX0JZUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9DTEtfX0VTREhDMV9DTEsJCShfTVg1M19QQURfU0QxX0NMS19fRVNESEMxX0NMSyB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfQ0xLX19HUElPMV8yMAkJKF9NWDUzX1BBRF9TRDFfQ0xLX19HUElPMV8yMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9DTEtfX09TQzMya18zMktfT1VUCQkoX01YNTNfUEFEX1NEMV9DTEtfX09TQzMya18zMktfT1VUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0NMS19fR1BUX0NMS0lOCQkoX01YNTNfUEFEX1NEMV9DTEtfX0dQVF9DTEtJTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9DTEtfX0NTUElfU0NMSwkJKF9NWDUzX1BBRF9TRDFfQ0xLX19DU1BJX1NDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfQ0xLX19TQVRBX1BIWV9EVEJfMAkJKF9NWDUzX1BBRF9TRDFfQ0xLX19TQVRBX1BIWV9EVEJfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fRVNESEMxX0RBVDMJCShfTVg1M19QQURfU0QxX0RBVEEzX19FU0RIQzFfREFUMyB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX0dQSU8xXzIxCQkoX01YNTNfUEFEX1NEMV9EQVRBM19fR1BJTzFfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX0dQVF9DTVBPVVQzCQkoX01YNTNfUEFEX1NEMV9EQVRBM19fR1BUX0NNUE9VVDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX1BXTTFfUFdNTwkJKF9NWDUzX1BBRF9TRDFfREFUQTNfX1BXTTFfUFdNTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fV0RPRzJfV0RPR19CCQkoX01YNTNfUEFEX1NEMV9EQVRBM19fV0RPRzJfV0RPR19CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19DU1BJX1NTMgkJKF9NWDUzX1BBRF9TRDFfREFUQTNfX0NTUElfU1MyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19XRE9HMl9XRE9HX1JTVF9CX0RFQgkJKF9NWDUzX1BBRF9TRDFfREFUQTNfX1dET0cyX1dET0dfUlNUX0JfREVCIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19TQVRBX1BIWV9EVEJfMQkJKF9NWDUzX1BBRF9TRDFfREFUQTNfX1NBVEFfUEhZX0RUQl8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NMS19fRVNESEMyX0NMSwkJKF9NWDUzX1BBRF9TRDJfQ0xLX19FU0RIQzJfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9DTEtfX0dQSU8xXzEwCQkoX01YNTNfUEFEX1NEMl9DTEtfX0dQSU8xXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NMS19fS1BQX0NPTF81CQkoX01YNTNfUEFEX1NEMl9DTEtfX0tQUF9DT0xfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9DTEtfX0FVRE1VWF9BVUQ0X1JYRlMJCShfTVg1M19QQURfU0QyX0NMS19fQVVETVVYX0FVRDRfUlhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9DTEtfX0NTUElfU0NMSwkJKF9NWDUzX1BBRF9TRDJfQ0xLX19DU1BJX1NDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfQ0xLX19TQ0NfUkFORE9NX1YJCShfTVg1M19QQURfU0QyX0NMS19fU0NDX1JBTkRPTV9WIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NNRF9fRVNESEMyX0NNRAkJKF9NWDUzX1BBRF9TRDJfQ01EX19FU0RIQzJfQ01EIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9DTURfX0dQSU8xXzExCQkoX01YNTNfUEFEX1NEMl9DTURfX0dQSU8xXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NNRF9fS1BQX1JPV181CQkoX01YNTNfUEFEX1NEMl9DTURfX0tQUF9ST1dfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9DTURfX0FVRE1VWF9BVUQ0X1JYQwkJKF9NWDUzX1BBRF9TRDJfQ01EX19BVURNVVhfQVVENF9SWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfQ01EX19DU1BJX01PU0kJCShfTVg1M19QQURfU0QyX0NNRF9fQ1NQSV9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NNRF9fU0NDX1JBTkRPTQkJKF9NWDUzX1BBRF9TRDJfQ01EX19TQ0NfUkFORE9NIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEzX19FU0RIQzJfREFUMwkJKF9NWDUzX1BBRF9TRDJfREFUQTNfX0VTREhDMl9EQVQzIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBM19fR1BJTzFfMTIJCShfTVg1M19QQURfU0QyX0RBVEEzX19HUElPMV8xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBM19fS1BQX0NPTF82CQkoX01YNTNfUEFEX1NEMl9EQVRBM19fS1BQX0NPTF82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEzX19BVURNVVhfQVVENF9UWEMJCShfTVg1M19QQURfU0QyX0RBVEEzX19BVURNVVhfQVVENF9UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTNfX0NTUElfU1MyCQkoX01YNTNfUEFEX1NEMl9EQVRBM19fQ1NQSV9TUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTNfX1NKQ19ET05FCQkoX01YNTNfUEFEX1NEMl9EQVRBM19fU0pDX0RPTkUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTJfX0VTREhDMl9EQVQyCQkoX01YNTNfUEFEX1NEMl9EQVRBMl9fRVNESEMyX0RBVDIgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEyX19HUElPMV8xMwkJKF9NWDUzX1BBRF9TRDJfREFUQTJfX0dQSU8xXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEyX19LUFBfUk9XXzYJCShfTVg1M19QQURfU0QyX0RBVEEyX19LUFBfUk9XXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTJfX0FVRE1VWF9BVUQ0X1RYRAkJKF9NWDUzX1BBRF9TRDJfREFUQTJfX0FVRE1VWF9BVUQ0X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMl9fQ1NQSV9TUzEJCShfTVg1M19QQURfU0QyX0RBVEEyX19DU1BJX1NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMl9fU0pDX0ZBSUwJCShfTVg1M19QQURfU0QyX0RBVEEyX19TSkNfRkFJTCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fRVNESEMyX0RBVDEJCShfTVg1M19QQURfU0QyX0RBVEExX19FU0RIQzJfREFUMSB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTFfX0dQSU8xXzE0CQkoX01YNTNfUEFEX1NEMl9EQVRBMV9fR1BJTzFfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTFfX0tQUF9DT0xfNwkJKF9NWDUzX1BBRF9TRDJfREFUQTFfX0tQUF9DT0xfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fQVVETVVYX0FVRDRfVFhGUwkJKF9NWDUzX1BBRF9TRDJfREFUQTFfX0FVRE1VWF9BVUQ0X1RYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTFfX0NTUElfU1MwCQkoX01YNTNfUEFEX1NEMl9EQVRBMV9fQ1NQSV9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTFfX1JUSUNfU0VDX1ZJTwkJKF9NWDUzX1BBRF9TRDJfREFUQTFfX1JUSUNfU0VDX1ZJTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMF9fRVNESEMyX0RBVDAJCShfTVg1M19QQURfU0QyX0RBVEEwX19FU0RIQzJfREFUMCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTBfX0dQSU8xXzE1CQkoX01YNTNfUEFEX1NEMl9EQVRBMF9fR1BJTzFfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTBfX0tQUF9ST1dfNwkJKF9NWDUzX1BBRF9TRDJfREFUQTBfX0tQUF9ST1dfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMF9fQVVETVVYX0FVRDRfUlhECQkoX01YNTNfUEFEX1NEMl9EQVRBMF9fQVVETVVYX0FVRDRfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEwX19DU1BJX01JU08JCShfTVg1M19QQURfU0QyX0RBVEEwX19DU1BJX01JU08gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTBfX1JUSUNfRE9ORV9JTlQJCShfTVg1M19QQURfU0QyX0RBVEEwX19SVElDX0RPTkVfSU5UIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18wX19DQ01fQ0xLTwkJKF9NWDUzX1BBRF9HUElPXzBfX0NDTV9DTEtPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18wX19HUElPMV8wCQkoX01YNTNfUEFEX0dQSU9fMF9fR1BJTzFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fS1BQX0NPTF81CQkoX01YNTNfUEFEX0dQSU9fMF9fS1BQX0NPTF81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18wX19DQ01fU1NJX0VYVDFfQ0xLCQkoX01YNTNfUEFEX0dQSU9fMF9fQ0NNX1NTSV9FWFQxX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fRVBJVDFfRVBJVE8JCShfTVg1M19QQURfR1BJT18wX19FUElUMV9FUElUTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fU1JUQ19BTEFSTV9ERUIJCShfTVg1M19QQURfR1BJT18wX19TUlRDX0FMQVJNX0RFQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fVVNCT0gzX1VTQkgxX1BXUgkJKF9NWDUzX1BBRF9HUElPXzBfX1VTQk9IM19VU0JIMV9QV1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzBfX0NTVV9URAkJKF9NWDUzX1BBRF9HUElPXzBfX0NTVV9URCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fRVNBSTFfU0NLUgkJKF9NWDUzX1BBRF9HUElPXzFfX0VTQUkxX1NDS1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX0dQSU8xXzEJCShfTVg1M19QQURfR1BJT18xX19HUElPMV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xX19LUFBfUk9XXzUJCShfTVg1M19QQURfR1BJT18xX19LUFBfUk9XXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX0NDTV9TU0lfRVhUMl9DTEsJCShfTVg1M19QQURfR1BJT18xX19DQ01fU1NJX0VYVDJfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xX19QV00yX1BXTU8JCShfTVg1M19QQURfR1BJT18xX19QV00yX1BXTU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX1dET0cyX1dET0dfQgkJKF9NWDUzX1BBRF9HUElPXzFfX1dET0cyX1dET0dfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fRVNESEMxX0NECQkoX01YNTNfUEFEX0dQSU9fMV9fRVNESEMxX0NEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xX19TUkNfVEVTVEVSX0FDSwkJKF9NWDUzX1BBRF9HUElPXzFfX1NSQ19URVNURVJfQUNLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT185X19FU0FJMV9GU1IJCShfTVg1M19QQURfR1BJT185X19FU0FJMV9GU1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX0dQSU8xXzkJCShfTVg1M19QQURfR1BJT185X19HUElPMV85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT185X19LUFBfQ09MXzYJCShfTVg1M19QQURfR1BJT185X19LUFBfQ09MXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX0NDTV9SRUZfRU5fQgkJKF9NWDUzX1BBRF9HUElPXzlfX0NDTV9SRUZfRU5fQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fUFdNMV9QV01PCQkoX01YNTNfUEFEX0dQSU9fOV9fUFdNMV9QV01PIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT185X19XRE9HMV9XRE9HX0IJCShfTVg1M19QQURfR1BJT185X19XRE9HMV9XRE9HX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX0VTREhDMV9XUAkJKF9NWDUzX1BBRF9HUElPXzlfX0VTREhDMV9XUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fU0NDX0ZBSUxfU1RBVEUJCShfTVg1M19QQURfR1BJT185X19TQ0NfRkFJTF9TVEFURSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fRVNBSTFfSENLUgkJKF9NWDUzX1BBRF9HUElPXzNfX0VTQUkxX0hDS1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX0dQSU8xXzMJCShfTVg1M19QQURfR1BJT18zX19HUElPMV8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18zX19JMkMzX1NDTAkJKF9NWDUzX1BBRF9HUElPXzNfX0kyQzNfU0NMIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fRFBMTElQMV9UT0dfRU4JCShfTVg1M19QQURfR1BJT18zX19EUExMSVAxX1RPR19FTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fQ0NNX0NMS08yCQkoX01YNTNfUEFEX0dQSU9fM19fQ0NNX0NMS08yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18zX19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMAkJKF9NWDUzX1BBRF9HUElPXzNfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18zX19VU0JPSDNfVVNCSDFfT0MJCShfTVg1M19QQURfR1BJT18zX19VU0JPSDNfVVNCSDFfT0MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX01MQl9NTEJDTEsJCShfTVg1M19QQURfR1BJT18zX19NTEJfTUxCQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT182X19FU0FJMV9TQ0tUCQkoX01YNTNfUEFEX0dQSU9fNl9fRVNBSTFfU0NLVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNl9fR1BJTzFfNgkJKF9NWDUzX1BBRF9HUElPXzZfX0dQSU8xXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX0kyQzNfU0RBCQkoX01YNTNfUEFEX0dQSU9fNl9fSTJDM19TREEgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT182X19DQ01fQ0NNX09VVF8wCQkoX01YNTNfUEFEX0dQSU9fNl9fQ0NNX0NDTV9PVVRfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNl9fQ1NVX0NTVV9JTlRfREVCCQkoX01YNTNfUEFEX0dQSU9fNl9fQ1NVX0NTVV9JTlRfREVCIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT182X19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMQkJKF9NWDUzX1BBRF9HUElPXzZfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT182X19FU0RIQzJfTENUTAkJKF9NWDUzX1BBRF9HUElPXzZfX0VTREhDMl9MQ1RMIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT182X19NTEJfTUxCU0lHCQkoX01YNTNfUEFEX0dQSU9fNl9fTUxCX01MQlNJRyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fRVNBSTFfRlNUCQkoX01YNTNfUEFEX0dQSU9fMl9fRVNBSTFfRlNUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18yX19HUElPMV8yCQkoX01YNTNfUEFEX0dQSU9fMl9fR1BJTzFfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fS1BQX1JPV182CQkoX01YNTNfUEFEX0dQSU9fMl9fS1BQX1JPV182IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18yX19DQ01fQ0NNX09VVF8xCQkoX01YNTNfUEFEX0dQSU9fMl9fQ0NNX0NDTV9PVVRfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fQ1NVX0NTVV9BTEFSTV9BVVRfMAkJKF9NWDUzX1BBRF9HUElPXzJfX0NTVV9DU1VfQUxBUk1fQVVUXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzJfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQyCQkoX01YNTNfUEFEX0dQSU9fMl9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzJfX0VTREhDMl9XUAkJKF9NWDUzX1BBRF9HUElPXzJfX0VTREhDMl9XUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fTUxCX01MQkRBVAkJKF9NWDUzX1BBRF9HUElPXzJfX01MQl9NTEJEQVQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX0VTQUkxX0hDS1QJCShfTVg1M19QQURfR1BJT180X19FU0FJMV9IQ0tUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT180X19HUElPMV80CQkoX01YNTNfUEFEX0dQSU9fNF9fR1BJTzFfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fS1BQX0NPTF83CQkoX01YNTNfUEFEX0dQSU9fNF9fS1BQX0NPTF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT180X19DQ01fQ0NNX09VVF8yCQkoX01YNTNfUEFEX0dQSU9fNF9fQ0NNX0NDTV9PVVRfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fQ1NVX0NTVV9BTEFSTV9BVVRfMQkJKF9NWDUzX1BBRF9HUElPXzRfX0NTVV9DU1VfQUxBUk1fQVVUXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQzCQkoX01YNTNfUEFEX0dQSU9fNF9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX0VTREhDMl9DRAkJKF9NWDUzX1BBRF9HUElPXzRfX0VTREhDMl9DRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fU0NDX1NFQ19TVEFURQkJKF9NWDUzX1BBRF9HUElPXzRfX1NDQ19TRUNfU1RBVEUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX0VTQUkxX1RYMl9SWDMJCShfTVg1M19QQURfR1BJT181X19FU0FJMV9UWDJfUlgzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT181X19HUElPMV81CQkoX01YNTNfUEFEX0dQSU9fNV9fR1BJTzFfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fS1BQX1JPV183CQkoX01YNTNfUEFEX0dQSU9fNV9fS1BQX1JPV183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT181X19DQ01fQ0xLTwkJKF9NWDUzX1BBRF9HUElPXzVfX0NDTV9DTEtPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT181X19DU1VfQ1NVX0FMQVJNX0FVVF8yCQkoX01YNTNfUEFEX0dQSU9fNV9fQ1NVX0NTVV9BTEFSTV9BVVRfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDQJCShfTVg1M19QQURfR1BJT181X19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fSTJDM19TQ0wJCShfTVg1M19QQURfR1BJT181X19JMkMzX1NDTCB8IE1VWF9QQURfQ1RSTChQQURfQ1RSTF9JMkMpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX0NDTV9QTEwxX0JZUAkJKF9NWDUzX1BBRF9HUElPXzVfX0NDTV9QTEwxX0JZUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fN19fRVNBSTFfVFg0X1JYMQkJKF9NWDUzX1BBRF9HUElPXzdfX0VTQUkxX1RYNF9SWDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0dQSU8xXzcJCShfTVg1M19QQURfR1BJT183X19HUElPMV83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT183X19FUElUMV9FUElUTwkJKF9NWDUzX1BBRF9HUElPXzdfX0VQSVQxX0VQSVRPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT183X19DQU4xX1RYQ0FOCQkoX01YNTNfUEFEX0dQSU9fN19fQ0FOMV9UWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fN19fVUFSVDJfVFhEX01VWAkJKF9NWDUzX1BBRF9HUElPXzdfX1VBUlQyX1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT183X19GSVJJX1JYRAkJKF9NWDUzX1BBRF9HUElPXzdfX0ZJUklfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT183X19TUERJRl9QTE9DSwkJKF9NWDUzX1BBRF9HUElPXzdfX1NQRElGX1BMT0NLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT183X19DQ01fUExMMl9CWVAJCShfTVg1M19QQURfR1BJT183X19DQ01fUExMMl9CWVAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzhfX0VTQUkxX1RYNV9SWDAJCShfTVg1M19QQURfR1BJT184X19FU0FJMV9UWDVfUlgwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT184X19HUElPMV84CQkoX01YNTNfUEFEX0dQSU9fOF9fR1BJTzFfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fRVBJVDJfRVBJVE8JCShfTVg1M19QQURfR1BJT184X19FUElUMl9FUElUTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fQ0FOMV9SWENBTgkJKF9NWDUzX1BBRF9HUElPXzhfX0NBTjFfUlhDQU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzhfX1VBUlQyX1JYRF9NVVgJCShfTVg1M19QQURfR1BJT184X19VQVJUMl9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fRklSSV9UWEQJCShfTVg1M19QQURfR1BJT184X19GSVJJX1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fU1BESUZfU1JDTEsJCShfTVg1M19QQURfR1BJT184X19TUERJRl9TUkNMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fQ0NNX1BMTDNfQllQCQkoX01YNTNfUEFEX0dQSU9fOF9fQ0NNX1BMTDNfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xNl9fRVNBSTFfVFgzX1JYMgkJKF9NWDUzX1BBRF9HUElPXzE2X19FU0FJMV9UWDNfUlgyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xNl9fR1BJTzdfMTEJCShfTVg1M19QQURfR1BJT18xNl9fR1BJTzdfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19UWklDX1BXUkZBSUxfSU5UCQkoX01YNTNfUEFEX0dQSU9fMTZfX1RaSUNfUFdSRkFJTF9JTlQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19SVENfQ0VfUlRDX0VYVF9UUklHMQkJKF9NWDUzX1BBRF9HUElPXzE2X19SVENfQ0VfUlRDX0VYVF9UUklHMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX1NQRElGX0lOMQkJKF9NWDUzX1BBRF9HUElPXzE2X19TUERJRl9JTjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19JMkMzX1NEQQkJKF9NWDUzX1BBRF9HUElPXzE2X19JMkMzX1NEQSB8IE1VWF9QQURfQ1RSTChQQURfQ1RSTF9JMkMpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19TSkNfREVfQgkJKF9NWDUzX1BBRF9HUElPXzE2X19TSkNfREVfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX0VTQUkxX1RYMAkJKF9NWDUzX1BBRF9HUElPXzE3X19FU0FJMV9UWDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19HUElPN18xMgkJKF9NWDUzX1BBRF9HUElPXzE3X19HUElPN18xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX1NETUFfRVhUX0VWRU5UXzAJCShfTVg1M19QQURfR1BJT18xN19fU0RNQV9FWFRfRVZFTlRfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX0dQQ19QTUlDX1JEWQkJKF9NWDUzX1BBRF9HUElPXzE3X19HUENfUE1JQ19SRFkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19SVENfQ0VfUlRDX0ZTVl9UUklHCQkoX01YNTNfUEFEX0dQSU9fMTdfX1JUQ19DRV9SVENfRlNWX1RSSUcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19TUERJRl9PVVQxCQkoX01YNTNfUEFEX0dQSU9fMTdfX1NQRElGX09VVDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19JUFVfU05PT1AyCQkoX01YNTNfUEFEX0dQSU9fMTdfX0lQVV9TTk9PUDIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19TSkNfSlRBR19BQ1QJCShfTVg1M19QQURfR1BJT18xN19fU0pDX0pUQUdfQUNUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fRVNBSTFfVFgxCQkoX01YNTNfUEFEX0dQSU9fMThfX0VTQUkxX1RYMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMThfX0dQSU83XzEzCQkoX01YNTNfUEFEX0dQSU9fMThfX0dQSU83XzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fU0RNQV9FWFRfRVZFTlRfMQkJKF9NWDUzX1BBRF9HUElPXzE4X19TRE1BX0VYVF9FVkVOVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fT1dJUkVfTElORQkJKF9NWDUzX1BBRF9HUElPXzE4X19PV0lSRV9MSU5FIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fUlRDX0NFX1JUQ19BTEFSTTJfVFJJRwkJKF9NWDUzX1BBRF9HUElPXzE4X19SVENfQ0VfUlRDX0FMQVJNMl9UUklHIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fQ0NNX0FTUkNfRVhUX0NMSwkJKF9NWDUzX1BBRF9HUElPXzE4X19DQ01fQVNSQ19FWFRfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fRVNESEMxX0xDVEwJCShfTVg1M19QQURfR1BJT18xOF9fRVNESEMxX0xDVEwgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19TUkNfU1lTVEVNX1JTVAkJKF9NWDUzX1BBRF9HUElPXzE4X19TUkNfU1lTVEVNX1JTVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX0tQUF9DT0xfNQkJCUlPTVVYX1BBRCgweDM0OCwgMHgwMjAsIDAsIDB4ODQwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fR1BJTzRfNQkJCUlPTVVYX1BBRCgweDM0OCwgMHgwMjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fQ0NNX0NMS08JCQlJT01VWF9QQUQoMHgzNDgsIDB4MDIwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX1NQRElGX09VVDEJCQlJT01VWF9QQUQoMHgzNDgsIDB4MDIwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX1JUQ19DRV9SVENfRVhUX1RSSUcyCQlJT01VWF9QQUQoMHgzNDgsIDB4MDIwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX0VDU1BJMV9SRFkJCQlJT01VWF9QQUQoMHgzNDgsIDB4MDIwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX0ZFQ19UREFUQV8zCQkJSU9NVVhfUEFEKDB4MzQ4LCAweDAyMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE5X19TUkNfSU5UX0JPT1QJCQlJT01VWF9QQUQoMHgzNDgsIDB4MDIwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19LUFBfQ09MXzAJCQlJT01VWF9QQUQoMHgzNEMsIDB4MDI0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19HUElPNF82CQkJSU9NVVhfUEFEKDB4MzRDLCAweDAyNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fQVVETVVYX0FVRDVfVFhDCQlJT01VWF9QQUQoMHgzNEMsIDB4MDI0LCAyLCAweDc1OCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19VQVJUNF9UWERfTVVYCQlJT01VWF9QQUQoMHgzNEMsIDB4MDI0LCA0LCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fRUNTUEkxX1NDTEsJCQlJT01VWF9QQUQoMHgzNEMsIDB4MDI0LCA1LCAweDc5QywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19GRUNfUkRBVEFfMwkJCUlPTVVYX1BBRCgweDM0QywgMHgwMjQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX1NSQ19BTllfUFVfUlNUCQlJT01VWF9QQUQoMHgzNEMsIDB4MDI0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19LUFBfUk9XXzAJCQlJT01VWF9QQUQoMHgzNTAsIDB4MDI4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19HUElPNF83CQkJSU9NVVhfUEFEKDB4MzUwLCAweDAyOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fQVVETVVYX0FVRDVfVFhECQlJT01VWF9QQUQoMHgzNTAsIDB4MDI4LCAyLCAweDc0QywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19VQVJUNF9SWERfTVVYCQlJT01VWF9QQUQoMHgzNTAsIDB4MDI4LCA0LCAweDg5MCwgMSwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fRUNTUEkxX01PU0kJCQlJT01VWF9QQUQoMHgzNTAsIDB4MDI4LCA1LCAweDdBNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19GRUNfVFhfRVIJCQlJT01VWF9QQUQoMHgzNTAsIDB4MDI4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19LUFBfQ09MXzEJCQlJT01VWF9QQUQoMHgzNTQsIDB4MDJDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19HUElPNF84CQkJSU9NVVhfUEFEKDB4MzU0LCAweDAyQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fQVVETVVYX0FVRDVfVFhGUwkJSU9NVVhfUEFEKDB4MzU0LCAweDAyQywgMiwgMHg3NUMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fVUFSVDVfVFhEX01VWAkJSU9NVVhfUEFEKDB4MzU0LCAweDAyQywgNCwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX0VDU1BJMV9NSVNPCQkJSU9NVVhfUEFEKDB4MzU0LCAweDAyQywgNSwgMHg3QTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fRkVDX1JYX0NMSwkJCUlPTVVYX1BBRCgweDM1NCwgMHgwMkMsIDYsIDB4ODA4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX1VTQlBIWTFfVFhSRUFEWQkJSU9NVVhfUEFEKDB4MzU0LCAweDAyQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fS1BQX1JPV18xCQkJSU9NVVhfUEFEKDB4MzU4LCAweDAzMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fR1BJTzRfOQkJCUlPTVVYX1BBRCgweDM1OCwgMHgwMzAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX0FVRE1VWF9BVUQ1X1JYRAkJSU9NVVhfUEFEKDB4MzU4LCAweDAzMCwgMiwgMHg3NDgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fVUFSVDVfUlhEX01VWAkJSU9NVVhfUEFEKDB4MzU4LCAweDAzMCwgNCwgMHg4OTgsIDEsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX0VDU1BJMV9TUzAJCQlJT01VWF9QQUQoMHgzNTgsIDB4MDMwLCA1LCAweDdBOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19GRUNfQ09MCQkJSU9NVVhfUEFEKDB4MzU4LCAweDAzMCwgNiwgMHg4MDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fVVNCUEhZMV9SWFZBTElECQlJT01VWF9QQUQoMHgzNTgsIDB4MDMwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19LUFBfQ09MXzIJCQlJT01VWF9QQUQoMHgzNUMsIDB4MDM0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19HUElPNF8xMAkJCUlPTVVYX1BBRCgweDM1QywgMHgwMzQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0NBTjFfVFhDQU4JCQlJT01VWF9QQUQoMHgzNUMsIDB4MDM0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19GRUNfTURJTwkJCUlPTVVYX1BBRCgweDM1QywgMHgwMzQsIDQsIDB4ODA0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0VDU1BJMV9TUzEJCQlJT01VWF9QQUQoMHgzNUMsIDB4MDM0LCA1LCAweDdBQywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19GRUNfUkRBVEFfMgkJCUlPTVVYX1BBRCgweDM1QywgMHgwMzQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX1VTQlBIWTFfUlhBQ1RJVkUJCUlPTVVYX1BBRCgweDM1QywgMHgwMzQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX0tQUF9ST1dfMgkJCUlPTVVYX1BBRCgweDM2MCwgMHgwMzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX0dQSU80XzExCQkJSU9NVVhfUEFEKDB4MzYwLCAweDAzOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMl9fQ0FOMV9SWENBTgkJCUlPTVVYX1BBRCgweDM2MCwgMHgwMzgsIDIsIDB4NzYwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX0ZFQ19NREMJCQlJT01VWF9QQUQoMHgzNjAsIDB4MDM4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cyX19FQ1NQSTFfU1MyCQkJSU9NVVhfUEFEKDB4MzYwLCAweDAzOCwgNSwgMHg3QjAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMl9fRkVDX1REQVRBXzIJCQlJT01VWF9QQUQoMHgzNjAsIDB4MDM4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cyX19VU0JQSFkxX1JYRVJST1IJCUlPTVVYX1BBRCgweDM2MCwgMHgwMzgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX0tQUF9DT0xfMwkJCUlPTVVYX1BBRCgweDM2NCwgMHgwM0MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX0dQSU80XzEyCQkJSU9NVVhfUEFEKDB4MzY0LCAweDAzQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fVVNCT0gzX0gyX0RQCQkJSU9NVVhfUEFEKDB4MzY0LCAweDAzQywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fU1BESUZfSU4xCQkJSU9NVVhfUEFEKDB4MzY0LCAweDAzQywgMywgMHg4NzAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fSTJDMl9TQ0wJCQlJT01VWF9QQUQoMHgzNjQsIDB4MDNDLCA0IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODFDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX0VDU1BJMV9TUzMJCQlJT01VWF9QQUQoMHgzNjQsIDB4MDNDLCA1LCAweDdCNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19GRUNfQ1JTCQkJSU9NVVhfUEFEKDB4MzY0LCAweDAzQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fVVNCUEhZMV9TSUVDTE9DSwkJSU9NVVhfUEFEKDB4MzY0LCAweDAzQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fS1BQX1JPV18zCQkJSU9NVVhfUEFEKDB4MzY4LCAweDA0MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fR1BJTzRfMTMJCQlJT01VWF9QQUQoMHgzNjgsIDB4MDQwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1czX19VU0JPSDNfSDJfRE0JCQlJT01VWF9QQUQoMHgzNjgsIDB4MDQwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1czX19DQ01fQVNSQ19FWFRfQ0xLCQlJT01VWF9QQUQoMHgzNjgsIDB4MDQwLCAzLCAweDc2OCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1czX19JMkMyX1NEQQkJCUlPTVVYX1BBRCgweDM2OCwgMHgwNDAsIDQgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MjAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fT1NDMzJLXzMyS19PVVQJCUlPTVVYX1BBRCgweDM2OCwgMHgwNDAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX0NDTV9QTEw0X0JZUAkJCUlPTVVYX1BBRCgweDM2OCwgMHgwNDAsIDYsIDB4NzdDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX1VTQlBIWTFfTElORVNUQVRFXzAJCUlPTVVYX1BBRCgweDM2OCwgMHgwNDAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX0tQUF9DT0xfNAkJCUlPTVVYX1BBRCgweDM2QywgMHgwNDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX0dQSU80XzE0CQkJSU9NVVhfUEFEKDB4MzZDLCAweDA0NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fQ0FOMl9UWENBTgkJCUlPTVVYX1BBRCgweDM2QywgMHgwNDQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX0lQVV9TSVNHXzQJCQlJT01VWF9QQUQoMHgzNkMsIDB4MDQ0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19VQVJUNV9SVFMJCQlJT01VWF9QQUQoMHgzNkMsIDB4MDQ0LCA0LCAweDg5NCwgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fVVNCT0gzX1VTQk9UR19PQwkJSU9NVVhfUEFEKDB4MzZDLCAweDA0NCwgNSwgMHg4OUMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fVVNCUEhZMV9MSU5FU1RBVEVfMQkJSU9NVVhfUEFEKDB4MzZDLCAweDA0NCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fS1BQX1JPV180CQkJSU9NVVhfUEFEKDB4MzcwLCAweDA0OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fR1BJTzRfMTUJCQlJT01VWF9QQUQoMHgzNzAsIDB4MDQ4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19DQU4yX1JYQ0FOCQkJSU9NVVhfUEFEKDB4MzcwLCAweDA0OCwgMiwgMHg3NjQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fSVBVX1NJU0dfNQkJCUlPTVVYX1BBRCgweDM3MCwgMHgwNDgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX1VBUlQ1X0NUUwkJCUlPTVVYX1BBRCgweDM3MCwgMHgwNDgsIDQsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19VU0JPSDNfVVNCT1RHX1BXUgkJSU9NVVhfUEFEKDB4MzcwLCAweDA0OCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fVVNCUEhZMV9WQlVTVkFMSUQJCUlPTVVYX1BBRCgweDM3MCwgMHgwNDgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19JUFVfREkwX0RJU1BfQ0xLCQlJT01VWF9QQUQoMHgzNzgsIDB4MDRDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9ESVNQX0NMS19fR1BJTzRfMTYJCQlJT01VWF9QQUQoMHgzNzgsIDB4MDRDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9ESVNQX0NMS19fVVNCT0gzX1VTQkgyX0RJUgkJSU9NVVhfUEFEKDB4Mzc4LCAweDA0QywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfRElTUF9DTEtfX1NETUFfREVCVUdfQ09SRV9TVEFURV8wCUlPTVVYX1BBRCgweDM3OCwgMHgwNEMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19FTUlfRU1JX0RFQlVHXzAJCUlPTVVYX1BBRCgweDM3OCwgMHgwNEMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19VU0JQSFkxX0FWQUxJRAkJSU9NVVhfUEFEKDB4Mzc4LCAweDA0QywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMTVfX0lQVV9ESTBfUElOMTUJCUlPTVVYX1BBRCgweDM3QywgMHgwNTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19HUElPNF8xNwkJCUlPTVVYX1BBRCgweDM3QywgMHgwNTAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19BVURNVVhfQVVENl9UWEMJCUlPTVVYX1BBRCgweDM3QywgMHgwNTAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMQlJT01VWF9QQUQoMHgzN0MsIDB4MDUwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4xNV9fRU1JX0VNSV9ERUJVR18xCQlJT01VWF9QQUQoMHgzN0MsIDB4MDUwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4xNV9fVVNCUEhZMV9CVkFMSUQJCUlPTVVYX1BBRCgweDM3QywgMHgwNTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjJfX0lQVV9ESTBfUElOMgkJCUlPTVVYX1BBRCgweDM4MCwgMHgwNTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjJfX0dQSU80XzE4CQkJSU9NVVhfUEFEKDB4MzgwLCAweDA1NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMl9fQVVETVVYX0FVRDZfVFhECQlJT01VWF9QQUQoMHgzODAsIDB4MDU0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4yX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMglJT01VWF9QQUQoMHgzODAsIDB4MDU0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4yX19FTUlfRU1JX0RFQlVHXzIJCUlPTVVYX1BBRCgweDM4MCwgMHgwNTQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjJfX1VTQlBIWTFfRU5EU0VTU0lPTgkJSU9NVVhfUEFEKDB4MzgwLCAweDA1NCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOM19fSVBVX0RJMF9QSU4zCQkJSU9NVVhfUEFEKDB4Mzg0LCAweDA1OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOM19fR1BJTzRfMTkJCQlJT01VWF9QQUQoMHgzODQsIDB4MDU4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19BVURNVVhfQVVENl9UWEZTCQlJT01VWF9QQUQoMHgzODQsIDB4MDU4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMwlJT01VWF9QQUQoMHgzODQsIDB4MDU4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19FTUlfRU1JX0RFQlVHXzMJCUlPTVVYX1BBRCgweDM4NCwgMHgwNTgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjNfX1VTQlBIWTFfSURESUcJCUlPTVVYX1BBRCgweDM4NCwgMHgwNTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX0lQVV9ESTBfUElONAkJCUlPTVVYX1BBRCgweDM4OCwgMHgwNUMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX0dQSU80XzIwCQkJSU9NVVhfUEFEKDB4Mzg4LCAweDA1QywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElONF9fQVVETVVYX0FVRDZfUlhECQlJT01VWF9QQUQoMHgzODgsIDB4MDVDLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19FU0RIQzFfV1AJCQlJT01VWF9QQUQoMHgzODgsIDB4MDVDLCAzLCAweDdGQywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19TRE1BX0RFQlVHX1lJRUxECQlJT01VWF9QQUQoMHgzODgsIDB4MDVDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19FTUlfRU1JX0RFQlVHXzQJCUlPTVVYX1BBRCgweDM4OCwgMHgwNUMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX1VTQlBIWTFfSE9TVERJU0NPTk5FQ1QJSU9NVVhfUEFEKDB4Mzg4LCAweDA1QywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQwX19JUFVfRElTUDBfREFUXzAJCUlPTVVYX1BBRCgweDM4QywgMHgwNjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fR1BJTzRfMjEJCQlJT01VWF9QQUQoMHgzOEMsIDB4MDYwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDBfX0NTUElfU0NMSwkJCUlPTVVYX1BBRCgweDM4QywgMHgwNjAsIDIsIDB4NzgwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fVVNCT0gzX1VTQkgyX0RBVEFfMAlJT01VWF9QQUQoMHgzOEMsIDB4MDYwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDBfX1NETUFfREVCVUdfQ09SRV9SVU4JSU9NVVhfUEFEKDB4MzhDLCAweDA2MCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQwX19FTUlfRU1JX0RFQlVHXzUJCUlPTVVYX1BBRCgweDM4QywgMHgwNjAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fVVNCUEhZMl9UWFJFQURZCQlJT01VWF9QQUQoMHgzOEMsIDB4MDYwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDFfX0lQVV9ESVNQMF9EQVRfMQkJSU9NVVhfUEFEKDB4MzkwLCAweDA2NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxX19HUElPNF8yMgkJCUlPTVVYX1BBRCgweDM5MCwgMHgwNjQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fQ1NQSV9NT1NJCQkJSU9NVVhfUEFEKDB4MzkwLCAweDA2NCwgMiwgMHg3ODgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxX19VU0JPSDNfVVNCSDJfREFUQV8xCUlPTVVYX1BBRCgweDM5MCwgMHgwNjQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMX1NFTAlcCisJCQkJCQkJSU9NVVhfUEFEKDB4MzkwLCAweDA2NCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxX19FTUlfRU1JX0RFQlVHXzYJCUlPTVVYX1BBRCgweDM5MCwgMHgwNjQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fVVNCUEhZMl9SWFZBTElECQlJT01VWF9QQUQoMHgzOTAsIDB4MDY0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDJfX0lQVV9ESVNQMF9EQVRfMgkJSU9NVVhfUEFEKDB4Mzk0LCAweDA2OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyX19HUElPNF8yMwkJCUlPTVVYX1BBRCgweDM5NCwgMHgwNjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fQ1NQSV9NSVNPCQkJSU9NVVhfUEFEKDB4Mzk0LCAweDA2OCwgMiwgMHg3ODQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyX19VU0JPSDNfVVNCSDJfREFUQV8yCUlPTVVYX1BBRCgweDM5NCwgMHgwNjgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fU0RNQV9ERUJVR19NT0RFCQlJT01VWF9QQUQoMHgzOTQsIDB4MDY4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDJfX0VNSV9FTUlfREVCVUdfNwkJSU9NVVhfUEFEKDB4Mzk0LCAweDA2OCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyX19VU0JQSFkyX1JYQUNUSVZFCQlJT01VWF9QQUQoMHgzOTQsIDB4MDY4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX0lQVV9ESVNQMF9EQVRfMwkJSU9NVVhfUEFEKDB4Mzk4LCAweDA2QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQzX19HUElPNF8yNAkJCUlPTVVYX1BBRCgweDM5OCwgMHgwNkMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUM19fQ1NQSV9TUzAJCQlJT01VWF9QQUQoMHgzOTgsIDB4MDZDLCAyLCAweDc4QywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX1VTQk9IM19VU0JIMl9EQVRBXzMJSU9NVVhfUEFEKDB4Mzk4LCAweDA2QywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQzX19TRE1BX0RFQlVHX0JVU19FUlJPUglJT01VWF9QQUQoMHgzOTgsIDB4MDZDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX0VNSV9FTUlfREVCVUdfOAkJSU9NVVhfUEFEKDB4Mzk4LCAweDA2QywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQzX19VU0JQSFkyX1JYRVJST1IJCUlPTVVYX1BBRCgweDM5OCwgMHgwNkMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fSVBVX0RJU1AwX0RBVF80CQlJT01VWF9QQUQoMHgzOUMsIDB4MDcwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDRfX0dQSU80XzI1CQkJSU9NVVhfUEFEKDB4MzlDLCAweDA3MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19DU1BJX1NTMQkJCUlPTVVYX1BBRCgweDM5QywgMHgwNzAsIDIsIDB4NzkwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fVVNCT0gzX1VTQkgyX0RBVEFfNAlJT01VWF9QQUQoMHgzOUMsIDB4MDcwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDRfX1NETUFfREVCVUdfQlVTX1JXQgkJSU9NVVhfUEFEKDB4MzlDLCAweDA3MCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19FTUlfRU1JX0RFQlVHXzkJCUlPTVVYX1BBRCgweDM5QywgMHgwNzAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fVVNCUEhZMl9TSUVDTE9DSwkJSU9NVVhfUEFEKDB4MzlDLCAweDA3MCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ1X19JUFVfRElTUDBfREFUXzUJCUlPTVVYX1BBRCgweDNBMCwgMHgwNzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fR1BJTzRfMjYJCQlJT01VWF9QQUQoMHgzQTAsIDB4MDc0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDVfX0NTUElfU1MyCQkJSU9NVVhfUEFEKDB4M0EwLCAweDA3NCwgMiwgMHg3OTQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ1X19VU0JPSDNfVVNCSDJfREFUQV81CUlPTVVYX1BBRCgweDNBMCwgMHgwNzQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fU0RNQV9ERUJVR19NQVRDSEVEX0RNQlVTCUlPTVVYX1BBRCgweDNBMCwgMHgwNzQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fRU1JX0VNSV9ERUJVR18xMAkJSU9NVVhfUEFEKDB4M0EwLCAweDA3NCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ1X19VU0JQSFkyX0xJTkVTVEFURV8wCUlPTVVYX1BBRCgweDNBMCwgMHgwNzQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fSVBVX0RJU1AwX0RBVF82CQlJT01VWF9QQUQoMHgzQTQsIDB4MDc4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDZfX0dQSU80XzI3CQkJSU9NVVhfUEFEKDB4M0E0LCAweDA3OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ2X19DU1BJX1NTMwkJCUlPTVVYX1BBRCgweDNBNCwgMHgwNzgsIDIsIDB4Nzk4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fVVNCT0gzX1VTQkgyX0RBVEFfNglJT01VWF9QQUQoMHgzQTQsIDB4MDc4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDZfX1NETUFfREVCVUdfUlRCVUZGRVJfV1JJVEUJSU9NVVhfUEFEKDB4M0E0LCAweDA3OCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ2X19FTUlfRU1JX0RFQlVHXzExCQlJT01VWF9QQUQoMHgzQTQsIDB4MDc4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDZfX1VTQlBIWTJfTElORVNUQVRFXzEJSU9NVVhfUEFEKDB4M0E0LCAweDA3OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ3X19JUFVfRElTUDBfREFUXzcJCUlPTVVYX1BBRCgweDNBOCwgMHgwN0MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUN19fR1BJTzRfMjgJCQlJT01VWF9QQUQoMHgzQTgsIDB4MDdDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX0NTUElfUkRZCQkJSU9NVVhfUEFEKDB4M0E4LCAweDA3QywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ3X19VU0JPSDNfVVNCSDJfREFUQV83CUlPTVVYX1BBRCgweDNBOCwgMHgwN0MsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUN19fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzAJSU9NVVhfUEFEKDB4M0E4LCAweDA3QywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ3X19FTUlfRU1JX0RFQlVHXzEyCQlJT01VWF9QQUQoMHgzQTgsIDB4MDdDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX1VTQlBIWTJfVkJVU1ZBTElECQlJT01VWF9QQUQoMHgzQTgsIDB4MDdDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX0lQVV9ESVNQMF9EQVRfOAkJSU9NVVhfUEFEKDB4M0FDLCAweDA4MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ4X19HUElPNF8yOQkJCUlPTVVYX1BBRCgweDNBQywgMHgwODAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fUFdNMV9QV01PCQkJSU9NVVhfUEFEKDB4M0FDLCAweDA4MCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ4X19XRE9HMV9XRE9HX0IJCUlPTVVYX1BBRCgweDNBQywgMHgwODAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzEJSU9NVVhfUEFEKDB4M0FDLCAweDA4MCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ4X19FTUlfRU1JX0RFQlVHXzEzCQlJT01VWF9QQUQoMHgzQUMsIDB4MDgwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX1VTQlBIWTJfQVZBTElECQlJT01VWF9QQUQoMHgzQUMsIDB4MDgwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX0lQVV9ESVNQMF9EQVRfOQkJSU9NVVhfUEFEKDB4M0IwLCAweDA4NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ5X19HUElPNF8zMAkJCUlPTVVYX1BBRCgweDNCMCwgMHgwODQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fUFdNMl9QV01PCQkJSU9NVVhfUEFEKDB4M0IwLCAweDA4NCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ5X19XRE9HMl9XRE9HX0IJCUlPTVVYX1BBRCgweDNCMCwgMHgwODQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzIJSU9NVVhfUEFEKDB4M0IwLCAweDA4NCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ5X19FTUlfRU1JX0RFQlVHXzE0CQlJT01VWF9QQUQoMHgzQjAsIDB4MDg0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX1VTQlBIWTJfVlNUQVRVU18wCQlJT01VWF9QQUQoMHgzQjAsIDB4MDg0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEwX19JUFVfRElTUDBfREFUXzEwCQlJT01VWF9QQUQoMHgzQjQsIDB4MDg4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEwX19HUElPNF8zMQkJCUlPTVVYX1BBRCgweDNCNCwgMHgwODgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTBfX1VTQk9IM19VU0JIMl9TVFAJCUlPTVVYX1BBRCgweDNCNCwgMHgwODgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTBfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8zCVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzQjQsIDB4MDg4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEwX19FTUlfRU1JX0RFQlVHXzE1CQlJT01VWF9QQUQoMHgzQjQsIDB4MDg4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEwX19VU0JQSFkyX1ZTVEFUVVNfMQkJSU9NVVhfUEFEKDB4M0I0LCAweDA4OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMV9fSVBVX0RJU1AwX0RBVF8xMQkJSU9NVVhfUEFEKDB4M0I4LCAweDA4QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMV9fR1BJTzVfNQkJCUlPTVVYX1BBRCgweDNCOCwgMHgwOEMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTFfX1VTQk9IM19VU0JIMl9OWFQJCUlPTVVYX1BBRCgweDNCOCwgMHgwOEMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTFfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF80CVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzQjgsIDB4MDhDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDExX19FTUlfRU1JX0RFQlVHXzE2CQlJT01VWF9QQUQoMHgzQjgsIDB4MDhDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDExX19VU0JQSFkyX1ZTVEFUVVNfMgkJSU9NVVhfUEFEKDB4M0I4LCAweDA4QywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMl9fSVBVX0RJU1AwX0RBVF8xMgkJSU9NVVhfUEFEKDB4M0JDLCAweDA5MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMl9fR1BJTzVfNgkJCUlPTVVYX1BBRCgweDNCQywgMHgwOTAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTJfX1VTQk9IM19VU0JIMl9DTEsJCUlPTVVYX1BBRCgweDNCQywgMHgwOTAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTJfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF81CVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzQkMsIDB4MDkwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEyX19FTUlfRU1JX0RFQlVHXzE3CQlJT01VWF9QQUQoMHgzQkMsIDB4MDkwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEyX19VU0JQSFkyX1ZTVEFUVVNfMwkJSU9NVVhfUEFEKDB4M0JDLCAweDA5MCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxM19fSVBVX0RJU1AwX0RBVF8xMwkJSU9NVVhfUEFEKDB4M0MwLCAweDA5NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxM19fR1BJTzVfNwkJCUlPTVVYX1BBRCgweDNDMCwgMHgwOTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTNfX0FVRE1VWF9BVUQ1X1JYRlMJCUlPTVVYX1BBRCgweDNDMCwgMHgwOTQsIDMsIDB4NzU0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTNfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU18wCVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzQzAsIDB4MDk0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEzX19FTUlfRU1JX0RFQlVHXzE4CQlJT01VWF9QQUQoMHgzQzAsIDB4MDk0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEzX19VU0JQSFkyX1ZTVEFUVVNfNAkJSU9NVVhfUEFEKDB4M0MwLCAweDA5NCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNF9fSVBVX0RJU1AwX0RBVF8xNAkJSU9NVVhfUEFEKDB4M0M0LCAweDA5OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNF9fR1BJTzVfOAkJCUlPTVVYX1BBRCgweDNDNCwgMHgwOTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTRfX0FVRE1VWF9BVUQ1X1JYQwkJSU9NVVhfUEFEKDB4M0M0LCAweDA5OCwgMywgMHg3NTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNF9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzEJXAorCQkJCQkJCUlPTVVYX1BBRCgweDNDNCwgMHgwOTgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTRfX0VNSV9FTUlfREVCVUdfMTkJCUlPTVVYX1BBRCgweDNDNCwgMHgwOTgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTRfX1VTQlBIWTJfVlNUQVRVU181CQlJT01VWF9QQUQoMHgzQzQsIDB4MDk4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19JUFVfRElTUDBfREFUXzE1CQlJT01VWF9QQUQoMHgzQzgsIDB4MDlDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19HUElPNV85CQkJSU9NVVhfUEFEKDB4M0M4LCAweDA5QywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNV9fRUNTUEkxX1NTMQkJSU9NVVhfUEFEKDB4M0M4LCAweDA5QywgMiwgMHg3QUMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNV9fRUNTUEkyX1NTMQkJSU9NVVhfUEFEKDB4M0M4LCAweDA5QywgMywgMHg3QzgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNV9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzIJXAorCQkJCQkJCUlPTVVYX1BBRCgweDNDOCwgMHgwOUMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTVfX0VNSV9FTUlfREVCVUdfMjAJCUlPTVVYX1BBRCgweDNDOCwgMHgwOUMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTVfX1VTQlBIWTJfVlNUQVRVU182CQlJT01VWF9QQUQoMHgzQzgsIDB4MDlDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19JUFVfRElTUDBfREFUXzE2CQlJT01VWF9QQUQoMHgzQ0MsIDB4MEEwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19HUElPNV8xMAkJCUlPTVVYX1BBRCgweDNDQywgMHgwQTAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX0VDU1BJMl9NT1NJCQlJT01VWF9QQUQoMHgzQ0MsIDB4MEEwLCAyLCAweDdDMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19BVURNVVhfQVVENV9UWEMJCUlPTVVYX1BBRCgweDNDQywgMHgwQTAsIDMsIDB4NzU4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX1NETUFfRVhUX0VWRU5UXzAJCUlPTVVYX1BBRCgweDNDQywgMHgwQTAsIDQsIDB4ODY4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU18zCVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzQ0MsIDB4MEEwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19FTUlfRU1JX0RFQlVHXzIxCQlJT01VWF9QQUQoMHgzQ0MsIDB4MEEwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19VU0JQSFkyX1ZTVEFUVVNfNwkJSU9NVVhfUEFEKDB4M0NDLCAweDBBMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxN19fSVBVX0RJU1AwX0RBVF8xNwkJSU9NVVhfUEFEKDB4M0QwLCAweDBBNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxN19fR1BJTzVfMTEJCQlJT01VWF9QQUQoMHgzRDAsIDB4MEE0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19FQ1NQSTJfTUlTTwkJSU9NVVhfUEFEKDB4M0QwLCAweDBBNCwgMiwgMHg3QkMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxN19fQVVETVVYX0FVRDVfVFhECQlJT01VWF9QQUQoMHgzRDAsIDB4MEE0LCAzLCAweDc0QywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19TRE1BX0VYVF9FVkVOVF8xCQlJT01VWF9QQUQoMHgzRDAsIDB4MEE0LCA0LCAweDg2QywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfNAlcCisJCQkJCQkJSU9NVVhfUEFEKDB4M0QwLCAweDBBNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxN19fRU1JX0VNSV9ERUJVR18yMgkJSU9NVVhfUEFEKDB4M0QwLCAweDBBNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fSVBVX0RJU1AwX0RBVF8xOAkJSU9NVVhfUEFEKDB4M0Q0LCAweDBBOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fR1BJTzVfMTIJCQlJT01VWF9QQUQoMHgzRDQsIDB4MEE4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19FQ1NQSTJfU1MwCQlJT01VWF9QQUQoMHgzRDQsIDB4MEE4LCAyLCAweDdDNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19BVURNVVhfQVVENV9UWEZTCQlJT01VWF9QQUQoMHgzRDQsIDB4MEE4LCAzLCAweDc1QywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19BVURNVVhfQVVENF9SWEZTCQlJT01VWF9QQUQoMHgzRDQsIDB4MEE4LCA0LCAweDczQywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfNQlcCisJCQkJCQkJSU9NVVhfUEFEKDB4M0Q0LCAweDBBOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fRU1JX0VNSV9ERUJVR18yMwkJSU9NVVhfUEFEKDB4M0Q0LCAweDBBOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fRU1JX1dFSU1fQ1NfMgkJSU9NVVhfUEFEKDB4M0Q0LCAweDBBOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fSVBVX0RJU1AwX0RBVF8xOQkJSU9NVVhfUEFEKDB4M0Q4LCAweDBBQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fR1BJTzVfMTMJCQlJT01VWF9QQUQoMHgzRDgsIDB4MEFDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19FQ1NQSTJfU0NMSwkJSU9NVVhfUEFEKDB4M0Q4LCAweDBBQywgMiwgMHg3QjgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fQVVETVVYX0FVRDVfUlhECQlJT01VWF9QQUQoMHgzRDgsIDB4MEFDLCAzLCAweDc0OCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19BVURNVVhfQVVENF9SWEMJCUlPTVVYX1BBRCgweDNEOCwgMHgwQUMsIDQsIDB4NzM4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU182CVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzRDgsIDB4MEFDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19FTUlfRU1JX0RFQlVHXzI0CQlJT01VWF9QQUQoMHgzRDgsIDB4MEFDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19FTUlfV0VJTV9DU18zCQlJT01VWF9QQUQoMHgzRDgsIDB4MEFDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIwX19JUFVfRElTUDBfREFUXzIwCQlJT01VWF9QQUQoMHgzREMsIDB4MEIwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIwX19HUElPNV8xNAkJCUlPTVVYX1BBRCgweDNEQywgMHgwQjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX0VDU1BJMV9TQ0xLCQlJT01VWF9QQUQoMHgzREMsIDB4MEIwLCAyLCAweDc5QywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIwX19BVURNVVhfQVVENF9UWEMJCUlPTVVYX1BBRCgweDNEQywgMHgwQjAsIDMsIDB4NzQwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU183CVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzREMsIDB4MEIwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIwX19FTUlfRU1JX0RFQlVHXzI1CQlJT01VWF9QQUQoMHgzREMsIDB4MEIwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIwX19TQVRBX1BIWV9UREkJCUlPTVVYX1BBRCgweDNEQywgMHgwQjAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjFfX0lQVV9ESVNQMF9EQVRfMjEJCUlPTVVYX1BBRCgweDNFMCwgMHgwQjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjFfX0dQSU81XzE1CQkJSU9NVVhfUEFEKDB4M0UwLCAweDBCNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fRUNTUEkxX01PU0kJCUlPTVVYX1BBRCgweDNFMCwgMHgwQjQsIDIsIDB4N0E0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjFfX0FVRE1VWF9BVUQ0X1RYRAkJSU9NVVhfUEFEKDB4M0UwLCAweDBCNCwgMywgMHg3MzQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fU0RNQV9ERUJVR19CVVNfREVWSUNFXzAJSU9NVVhfUEFEKDB4M0UwLCAweDBCNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fRU1JX0VNSV9ERUJVR18yNgkJSU9NVVhfUEFEKDB4M0UwLCAweDBCNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fU0FUQV9QSFlfVERPCQlJT01VWF9QQUQoMHgzRTAsIDB4MEI0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19JUFVfRElTUDBfREFUXzIyCQlJT01VWF9QQUQoMHgzRTQsIDB4MEI4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19HUElPNV8xNgkJCUlPTVVYX1BBRCgweDNFNCwgMHgwQjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX0VDU1BJMV9NSVNPCQlJT01VWF9QQUQoMHgzRTQsIDB4MEI4LCAyLCAweDdBMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19BVURNVVhfQVVENF9UWEZTCQlJT01VWF9QQUQoMHgzRTQsIDB4MEI4LCAzLCAweDc0NCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMQlJT01VWF9QQUQoMHgzRTQsIDB4MEI4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19FTUlfRU1JX0RFQlVHXzI3CQlJT01VWF9QQUQoMHgzRTQsIDB4MEI4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19TQVRBX1BIWV9UQ0sJCUlPTVVYX1BBRCgweDNFNCwgMHgwQjgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX0lQVV9ESVNQMF9EQVRfMjMJCUlPTVVYX1BBRCgweDNFOCwgMHgwQkMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX0dQSU81XzE3CQkJSU9NVVhfUEFEKDB4M0U4LCAweDBCQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyM19fRUNTUEkxX1NTMAkJSU9NVVhfUEFEKDB4M0U4LCAweDBCQywgMiwgMHg3QTgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyM19fQVVETVVYX0FVRDRfUlhECQlJT01VWF9QQUQoMHgzRTgsIDB4MEJDLCAzLCAweDczMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIzX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMglJT01VWF9QQUQoMHgzRTgsIDB4MEJDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIzX19FTUlfRU1JX0RFQlVHXzI4CQlJT01VWF9QQUQoMHgzRTgsIDB4MEJDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIzX19TQVRBX1BIWV9UTVMJCUlPTVVYX1BBRCgweDNFOCwgMHgwQkMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9QSVhDTEtfX0lQVV9DU0kwX1BJWENMSwkJSU9NVVhfUEFEKDB4M0VDLCAweDBDMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX1BJWENMS19fR1BJTzVfMTgJCQlJT01VWF9QQUQoMHgzRUMsIDB4MEMwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfUElYQ0xLX19TRE1BX0RFQlVHX1BDXzAJCUlPTVVYX1BBRCgweDNFQywgMHgwQzAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9QSVhDTEtfX0VNSV9FTUlfREVCVUdfMjkJCUlPTVVYX1BBRCgweDNFQywgMHgwQzAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19JUFVfQ1NJMF9IU1lOQwkJSU9NVVhfUEFEKDB4M0YwLCAweDBDNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX01DTEtfX0dQSU81XzE5CQkJSU9NVVhfUEFEKDB4M0YwLCAweDBDNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX01DTEtfX0NDTV9DU0kwX01DTEsJCUlPTVVYX1BBRCgweDNGMCwgMHgwQzQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19TRE1BX0RFQlVHX1BDXzEJCUlPTVVYX1BBRCgweDNGMCwgMHgwQzQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19FTUlfRU1JX0RFQlVHXzMwCQlJT01VWF9QQUQoMHgzRjAsIDB4MEM0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfTUNMS19fVFBJVV9UUkNUTAkJCUlPTVVYX1BBRCgweDNGMCwgMHgwQzQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVRBX0VOX19JUFVfQ1NJMF9EQVRBX0VOCQlJT01VWF9QQUQoMHgzRjQsIDB4MEM4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUQV9FTl9fR1BJTzVfMjAJCQlJT01VWF9QQUQoMHgzRjQsIDB4MEM4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUQV9FTl9fU0RNQV9ERUJVR19QQ18yCQlJT01VWF9QQUQoMHgzRjQsIDB4MEM4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUQV9FTl9fRU1JX0VNSV9ERUJVR18zMQkJSU9NVVhfUEFEKDB4M0Y0LCAweDBDOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVEFfRU5fX1RQSVVfVFJDTEsJCUlPTVVYX1BBRCgweDNGNCwgMHgwQzgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9WU1lOQ19fSVBVX0NTSTBfVlNZTkMJCUlPTVVYX1BBRCgweDNGOCwgMHgwQ0MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9WU1lOQ19fR1BJTzVfMjEJCQlJT01VWF9QQUQoMHgzRjgsIDB4MENDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfVlNZTkNfX1NETUFfREVCVUdfUENfMwkJSU9NVVhfUEFEKDB4M0Y4LCAweDBDQywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX1ZTWU5DX19FTUlfRU1JX0RFQlVHXzMyCQlJT01VWF9QQUQoMHgzRjgsIDB4MENDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfVlNZTkNfX1RQSVVfVFJBQ0VfMAkJSU9NVVhfUEFEKDB4M0Y4LCAweDBDQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX0lQVV9DU0kwX0RfNAkJSU9NVVhfUEFEKDB4M0ZDLCAweDBEMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX0dQSU81XzIyCQkJSU9NVVhfUEFEKDB4M0ZDLCAweDBEMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX0tQUF9DT0xfNQkJCUlPTVVYX1BBRCgweDNGQywgMHgwRDAsIDIsIDB4ODQwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ0X19FQ1NQSTFfU0NMSwkJCUlPTVVYX1BBRCgweDNGQywgMHgwRDAsIDMsIDB4NzlDLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ0X19VU0JPSDNfVVNCSDNfU1RQCQlJT01VWF9QQUQoMHgzRkMsIDB4MEQwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fQVVETVVYX0FVRDNfVFhDCQlJT01VWF9QQUQoMHgzRkMsIDB4MEQwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fRU1JX0VNSV9ERUJVR18zMwkJSU9NVVhfUEFEKDB4M0ZDLCAweDBEMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX1RQSVVfVFJBQ0VfMQkJSU9NVVhfUEFEKDB4M0ZDLCAweDBEMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX0lQVV9DU0kwX0RfNQkJSU9NVVhfUEFEKDB4NDAwLCAweDBENCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX0dQSU81XzIzCQkJSU9NVVhfUEFEKDB4NDAwLCAweDBENCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX0tQUF9ST1dfNQkJCUlPTVVYX1BBRCgweDQwMCwgMHgwRDQsIDIsIDB4ODRDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19FQ1NQSTFfTU9TSQkJCUlPTVVYX1BBRCgweDQwMCwgMHgwRDQsIDMsIDB4N0E0LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19VU0JPSDNfVVNCSDNfTlhUCQlJT01VWF9QQUQoMHg0MDAsIDB4MEQ0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fQVVETVVYX0FVRDNfVFhECQlJT01VWF9QQUQoMHg0MDAsIDB4MEQ0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fRU1JX0VNSV9ERUJVR18zNAkJSU9NVVhfUEFEKDB4NDAwLCAweDBENCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX1RQSVVfVFJBQ0VfMgkJSU9NVVhfUEFEKDB4NDAwLCAweDBENCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0lQVV9DU0kwX0RfNgkJSU9NVVhfUEFEKDB4NDA0LCAweDBEOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0dQSU81XzI0CQkJSU9NVVhfUEFEKDB4NDA0LCAweDBEOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0tQUF9DT0xfNgkJCUlPTVVYX1BBRCgweDQwNCwgMHgwRDgsIDIsIDB4ODQ0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ2X19FQ1NQSTFfTUlTTwkJCUlPTVVYX1BBRCgweDQwNCwgMHgwRDgsIDMsIDB4N0EwLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ2X19VU0JPSDNfVVNCSDNfQ0xLCQlJT01VWF9QQUQoMHg0MDQsIDB4MEQ4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fQVVETVVYX0FVRDNfVFhGUwkJSU9NVVhfUEFEKDB4NDA0LCAweDBEOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0VNSV9FTUlfREVCVUdfMzUJCUlPTVVYX1BBRCgweDQwNCwgMHgwRDgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ2X19UUElVX1RSQUNFXzMJCUlPTVVYX1BBRCgweDQwNCwgMHgwRDgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19JUFVfQ1NJMF9EXzcJCUlPTVVYX1BBRCgweDQwOCwgMHgwREMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19HUElPNV8yNQkJCUlPTVVYX1BBRCgweDQwOCwgMHgwREMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19LUFBfUk9XXzYJCQlJT01VWF9QQUQoMHg0MDgsIDB4MERDLCAyLCAweDg1MCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUN19fRUNTUEkxX1NTMAkJCUlPTVVYX1BBRCgweDQwOCwgMHgwREMsIDMsIDB4N0E4LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19VU0JPSDNfVVNCSDNfRElSCQlJT01VWF9QQUQoMHg0MDgsIDB4MERDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUN19fQVVETVVYX0FVRDNfUlhECQlJT01VWF9QQUQoMHg0MDgsIDB4MERDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUN19fRU1JX0VNSV9ERUJVR18zNgkJSU9NVVhfUEFEKDB4NDA4LCAweDBEQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX1RQSVVfVFJBQ0VfNAkJSU9NVVhfUEFEKDB4NDA4LCAweDBEQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0lQVV9DU0kwX0RfOAkJSU9NVVhfUEFEKDB4NDBDLCAweDBFMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0dQSU81XzI2CQkJSU9NVVhfUEFEKDB4NDBDLCAweDBFMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0tQUF9DT0xfNwkJCUlPTVVYX1BBRCgweDQwQywgMHgwRTAsIDIsIDB4ODQ4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19FQ1NQSTJfU0NMSwkJCUlPTVVYX1BBRCgweDQwQywgMHgwRTAsIDMsIDB4N0I4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19VU0JPSDNfVVNCSDNfT0MJCUlPTVVYX1BBRCgweDQwQywgMHgwRTAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19JMkMxX1NEQQkJCUlPTVVYX1BBRCgweDQwQywgMHgwRTAsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MTgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0VNSV9FTUlfREVCVUdfMzcJCUlPTVVYX1BBRCgweDQwQywgMHgwRTAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19UUElVX1RSQUNFXzUJCUlPTVVYX1BBRCgweDQwQywgMHgwRTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19JUFVfQ1NJMF9EXzkJCUlPTVVYX1BBRCgweDQxMCwgMHgwRTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19HUElPNV8yNwkJCUlPTVVYX1BBRCgweDQxMCwgMHgwRTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19LUFBfUk9XXzcJCQlJT01VWF9QQUQoMHg0MTAsIDB4MEU0LCAyLCAweDg1NCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fRUNTUEkyX01PU0kJCQlJT01VWF9QQUQoMHg0MTAsIDB4MEU0LCAzLCAweDdDMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fVVNCT0gzX1VTQkgzX1BXUgkJSU9NVVhfUEFEKDB4NDEwLCAweDBFNCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX0kyQzFfU0NMCQkJSU9NVVhfUEFEKDB4NDEwLCAweDBFNCwgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgxNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fRU1JX0VNSV9ERUJVR18zOAkJSU9NVVhfUEFEKDB4NDEwLCAweDBFNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX1RQSVVfVFJBQ0VfNgkJSU9NVVhfUEFEKDB4NDEwLCAweDBFNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19JUFVfQ1NJMF9EXzEwCQlJT01VWF9QQUQoMHg0MTQsIDB4MEU4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX0dQSU81XzI4CQkJSU9NVVhfUEFEKDB4NDE0LCAweDBFOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19VQVJUMV9UWERfTVVYCQlJT01VWF9QQUQoMHg0MTQsIDB4MEU4LCAyLCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19FQ1NQSTJfTUlTTwkJSU9NVVhfUEFEKDB4NDE0LCAweDBFOCwgMywgMHg3QkMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19BVURNVVhfQVVEM19SWEMJCUlPTVVYX1BBRCgweDQxNCwgMHgwRTgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fU0RNQV9ERUJVR19QQ180CQlJT01VWF9QQUQoMHg0MTQsIDB4MEU4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX0VNSV9FTUlfREVCVUdfMzkJCUlPTVVYX1BBRCgweDQxNCwgMHgwRTgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fVFBJVV9UUkFDRV83CQlJT01VWF9QQUQoMHg0MTQsIDB4MEU4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX0lQVV9DU0kwX0RfMTEJCUlPTVVYX1BBRCgweDQxOCwgMHgwRUMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fR1BJTzVfMjkJCQlJT01VWF9QQUQoMHg0MTgsIDB4MEVDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX1VBUlQxX1JYRF9NVVgJCUlPTVVYX1BBRCgweDQxOCwgMHgwRUMsIDIsIDB4ODc4LCAxLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX0VDU1BJMl9TUzAJCQlJT01VWF9QQUQoMHg0MTgsIDB4MEVDLCAzLCAweDdDNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX0FVRE1VWF9BVUQzX1JYRlMJCUlPTVVYX1BBRCgweDQxOCwgMHgwRUMsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fU0RNQV9ERUJVR19QQ181CQlJT01VWF9QQUQoMHg0MTgsIDB4MEVDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX0VNSV9FTUlfREVCVUdfNDAJCUlPTVVYX1BBRCgweDQxOCwgMHgwRUMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fVFBJVV9UUkFDRV84CQlJT01VWF9QQUQoMHg0MTgsIDB4MEVDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX0lQVV9DU0kwX0RfMTIJCUlPTVVYX1BBRCgweDQxQywgMHgwRjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fR1BJTzVfMzAJCQlJT01VWF9QQUQoMHg0MUMsIDB4MEYwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX1VBUlQ0X1RYRF9NVVgJCUlPTVVYX1BBRCgweDQxQywgMHgwRjAsIDIsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX1VTQk9IM19VU0JIM19EQVRBXzAJSU9NVVhfUEFEKDB4NDFDLCAweDBGMCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEyX19TRE1BX0RFQlVHX1BDXzYJCUlPTVVYX1BBRCgweDQxQywgMHgwRjAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fRU1JX0VNSV9ERUJVR180MQkJSU9NVVhfUEFEKDB4NDFDLCAweDBGMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEyX19UUElVX1RSQUNFXzkJCUlPTVVYX1BBRCgweDQxQywgMHgwRjAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fSVBVX0NTSTBfRF8xMwkJSU9NVVhfUEFEKDB4NDIwLCAweDBGNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19HUElPNV8zMQkJCUlPTVVYX1BBRCgweDQyMCwgMHgwRjQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fVUFSVDRfUlhEX01VWAkJSU9NVVhfUEFEKDB4NDIwLCAweDBGNCwgMiwgMHg4OTAsIDMsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fVVNCT0gzX1VTQkgzX0RBVEFfMQlJT01VWF9QQUQoMHg0MjAsIDB4MEY0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTNfX1NETUFfREVCVUdfUENfNwkJSU9NVVhfUEFEKDB4NDIwLCAweDBGNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19FTUlfRU1JX0RFQlVHXzQyCQlJT01VWF9QQUQoMHg0MjAsIDB4MEY0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTNfX1RQSVVfVFJBQ0VfMTAJCUlPTVVYX1BBRCgweDQyMCwgMHgwRjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fSVBVX0NTSTBfRF8xNAkJSU9NVVhfUEFEKDB4NDI0LCAweDBGOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19HUElPNl8wCQkJSU9NVVhfUEFEKDB4NDI0LCAweDBGOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19VQVJUNV9UWERfTVVYCQlJT01VWF9QQUQoMHg0MjQsIDB4MEY4LCAyLCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19VU0JPSDNfVVNCSDNfREFUQV8yCUlPTVVYX1BBRCgweDQyNCwgMHgwRjgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fU0RNQV9ERUJVR19QQ184CQlJT01VWF9QQUQoMHg0MjQsIDB4MEY4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX0VNSV9FTUlfREVCVUdfNDMJCUlPTVVYX1BBRCgweDQyNCwgMHgwRjgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fVFBJVV9UUkFDRV8xMQkJSU9NVVhfUEFEKDB4NDI0LCAweDBGOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19JUFVfQ1NJMF9EXzE1CQlJT01VWF9QQUQoMHg0MjgsIDB4MEZDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX0dQSU82XzEJCQlJT01VWF9QQUQoMHg0MjgsIDB4MEZDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX1VBUlQ1X1JYRF9NVVgJCUlPTVVYX1BBRCgweDQyOCwgMHgwRkMsIDIsIDB4ODk4LCAzLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX1VTQk9IM19VU0JIM19EQVRBXzMJSU9NVVhfUEFEKDB4NDI4LCAweDBGQywgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19TRE1BX0RFQlVHX1BDXzkJCUlPTVVYX1BBRCgweDQyOCwgMHgwRkMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fRU1JX0VNSV9ERUJVR180NAkJSU9NVVhfUEFEKDB4NDI4LCAweDBGQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19UUElVX1RSQUNFXzEyCQlJT01VWF9QQUQoMHg0MjgsIDB4MEZDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX0lQVV9DU0kwX0RfMTYJCUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fR1BJTzZfMgkJCUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fVUFSVDRfUlRTCQkJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgMiwgMHg4OEMsIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fVVNCT0gzX1VTQkgzX0RBVEFfNAlJT01VWF9QQUQoMHg0MkMsIDB4MTAwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1NETUFfREVCVUdfUENfMTAJCUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fRU1JX0VNSV9ERUJVR180NQkJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE2X19UUElVX1RSQUNFXzEzCQlJT01VWF9QQUQoMHg0MkMsIDB4MTAwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX0lQVV9DU0kwX0RfMTcJCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fR1BJTzZfMwkJCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fVUFSVDRfQ1RTCQkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgMiwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fVVNCT0gzX1VTQkgzX0RBVEFfNQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX1NETUFfREVCVUdfUENfMTEJCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fRU1JX0VNSV9ERUJVR180NgkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19UUElVX1RSQUNFXzE0CQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX0lQVV9DU0kwX0RfMTgJCUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOF9fR1BJTzZfNAkJCUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOF9fVUFSVDVfUlRTCQkJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgMiwgMHg4OTQsIDIsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOF9fVVNCT0gzX1VTQkgzX0RBVEFfNglJT01VWF9QQUQoMHg0MzQsIDB4MTA4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX1NETUFfREVCVUdfUENfMTIJCUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOF9fRU1JX0VNSV9ERUJVR180NwkJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19UUElVX1RSQUNFXzE1CQlJT01VWF9QQUQoMHg0MzQsIDB4MTA4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX0lQVV9DU0kwX0RfMTkJCUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fR1BJTzZfNQkJCUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fVUFSVDVfQ1RTCQkJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgMiwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fVVNCT0gzX1VTQkgzX0RBVEFfNwlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX1NETUFfREVCVUdfUENfMTMJCUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fRU1JX0VNSV9ERUJVR180OAkJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE5X19VU0JQSFkyX0JJU1RPSwkJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19FTUlfV0VJTV9BXzI1CQkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19HUElPNV8yCQkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19FQ1NQSTJfUkRZCQkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19JUFVfREkxX1BJTjEyCQkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19DU1BJX1NTMQkJCUlPTVVYX1BBRCgweDQ1OCwgMHgxMTAsIDQsIDB4NzkwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyNV9fSVBVX0RJMF9EMV9DUwkJCUlPTVVYX1BBRCgweDQ1OCwgMHgxMTAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyNV9fVVNCUEhZMV9CSVNUT0sJCUlPTVVYX1BBRCgweDQ1OCwgMHgxMTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fRU1JX1dFSU1fRUJfMgkJCUlPTVVYX1BBRCgweDQ1QywgMHgxMTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fR1BJTzJfMzAJCQlJT01VWF9QQUQoMHg0NUMsIDB4MTE0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjJfX0NDTV9ESTFfRVhUX0NMSwkJSU9NVVhfUEFEKDB4NDVDLCAweDExNCwgMiwgMHg3NkMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIyX19JUFVfU0VSX0RJU1AxX0NTCQlJT01VWF9QQUQoMHg0NUMsIDB4MTE0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjJfX0VDU1BJMV9TUzAJCQlJT01VWF9QQUQoMHg0NUMsIDB4MTE0LCA0LCAweDdBOCwgMywgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjJfX0kyQzJfU0NMCQkJSU9NVVhfUEFEKDB4NDVDLCAweDExNCwgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgxQywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0VNSV9XRUlNX0RfMTYJCQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0dQSU8zXzE2CQkJSU9NVVhfUEFEKDB4NDYwLCAweDExOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE2X19JUFVfREkwX1BJTjUJCQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0lQVV9ESVNQQjFfU0VSX0NMSwkJSU9NVVhfUEFEKDB4NDYwLCAweDExOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE2X19FQ1NQSTFfU0NMSwkJCUlPTVVYX1BBRCgweDQ2MCwgMHgxMTgsIDQsIDB4NzlDLCAzLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxNl9fSTJDMl9TREEJCQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODIwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fRU1JX1dFSU1fRF8xNwkJCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fR1BJTzNfMTcJCQlJT01VWF9QQUQoMHg0NjQsIDB4MTFDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTdfX0lQVV9ESTBfUElONgkJCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fSVBVX0RJU1BCMV9TRVJfRElOCQlJT01VWF9QQUQoMHg0NjQsIDB4MTFDLCAzLCAweDgzMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTdfX0VDU1BJMV9NSVNPCQkJSU9NVVhfUEFEKDB4NDY0LCAweDExQywgNCwgMHg3QTAsIDMsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE3X19JMkMzX1NDTAkJCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MjQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE4X19FTUlfV0VJTV9EXzE4CQkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE4X19HUElPM18xOAkJCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fSVBVX0RJMF9QSU43CQkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE4X19JUFVfRElTUEIxX1NFUl9ESU8JCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDMsIDB4ODMwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fRUNTUEkxX01PU0kJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCA0LCAweDdBNCwgMywgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0kyQzNfU0RBCQkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0lQVV9ESTFfRDBfQ1MJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0VNSV9XRUlNX0RfMTkJCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0dQSU8zXzE5CQkJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE5X19JUFVfREkwX1BJTjgJCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0lQVV9ESVNQQjFfU0VSX1JTCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0VDU1BJMV9TUzEJCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCA0LCAweDdBQywgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0VQSVQxX0VQSVRPCQkJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE5X19VQVJUMV9DVFMJCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCA2LCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE5X19VU0JPSDNfVVNCSDJfT0MJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDcsIDB4OEE0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fRU1JX1dFSU1fRF8yMAkJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fR1BJTzNfMjAJCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0lQVV9ESTBfUElOMTYJCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0lQVV9TRVJfRElTUDBfQ1MJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fQ1NQSV9TUzAJCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCA0LCAweDc4QywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0VQSVQyX0VQSVRPCQkJSU9NVVhfUEFEKDB4NDcwLCAweDEyOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19VQVJUMV9SVFMJCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCA2LCAweDg3NCwgMSwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19VU0JPSDNfVVNCSDJfUFdSCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX0VNSV9XRUlNX0RfMjEJCQlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX0dQSU8zXzIxCQkJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19JUFVfREkwX1BJTjE3CQkJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19JUFVfRElTUEIwX1NFUl9DTEsJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMV9fQ1NQSV9TQ0xLCQkJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgNCwgMHg3ODAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19JMkMxX1NDTAkJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MTQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19VU0JPSDNfVVNCT1RHX09DCQlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCA2LCAweDg5QywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX0VNSV9XRUlNX0RfMjIJCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX0dQSU8zXzIyCQkJSU9NVVhfUEFEKDB4NDc4LCAweDEzMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIyX19JUFVfREkwX1BJTjEJCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX0lQVV9ESVNQQjBfU0VSX0RJTgkJSU9NVVhfUEFEKDB4NDc4LCAweDEzMCwgMywgMHg4MkMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIyX19DU1BJX01JU08JCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCA0LCAweDc4NCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX1VTQk9IM19VU0JPVEdfUFdSCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0VNSV9XRUlNX0RfMjMJCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0dQSU8zXzIzCQkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19VQVJUM19DVFMJCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCAyLCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19VQVJUMV9EQ0QJCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTBfRDBfQ1MJCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTFfUElOMgkJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fSVBVX0NTSTFfREFUQV9FTgkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgNiwgMHg4MzQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19JUFVfREkxX1BJTjE0CQkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19FTUlfV0VJTV9FQl8zCQkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19HUElPMl8zMQkJCUlPTVVYX1BBRCgweDQ4MCwgMHgxMzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fVUFSVDNfUlRTCQkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgMiwgMHg4ODQsIDEsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fVUFSVDFfUkkJCQlJT01VWF9QQUQoMHg0ODAsIDB4MTM4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjNfX0lQVV9ESTFfUElOMwkJCUlPTVVYX1BBRCgweDQ4MCwgMHgxMzgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fSVBVX0NTSTFfSFNZTkMJCUlPTVVYX1BBRCgweDQ4MCwgMHgxMzgsIDYsIDB4ODM4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fSVBVX0RJMV9QSU4xNgkJCUlPTVVYX1BBRCgweDQ4MCwgMHgxMzgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fRU1JX1dFSU1fRF8yNAkJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fR1BJTzNfMjQJCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjRfX1VBUlQzX1RYRF9NVVgJCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCAyLCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19FQ1NQSTFfU1MyCQkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgMywgMHg3QjAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19DU1BJX1NTMgkJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDQsIDB4Nzk0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fQVVETVVYX0FVRDVfUlhGUwkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgNSwgMHg3NTQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19FQ1NQSTJfU1MyCQkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19VQVJUMV9EVFIJCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX0VNSV9XRUlNX0RfMjUJCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX0dQSU8zXzI1CQkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19VQVJUM19SWERfTVVYCQkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgMiwgMHg4ODgsIDEsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fRUNTUEkxX1NTMwkJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDMsIDB4N0I0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fQ1NQSV9TUzMJCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCA0LCAweDc5OCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX0FVRE1VWF9BVUQ1X1JYQwkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgNSwgMHg3NTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19FQ1NQSTJfU1MzCQkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19VQVJUMV9EU1IJCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0VNSV9XRUlNX0RfMjYJCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0dQSU8zXzI2CQkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19VQVJUMl9UWERfTVVYCQkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgMiwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fRklSSV9SWEQJCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCAzLCAweDgwQywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX0lQVV9DU0kwX0RfMQkJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fSVBVX0RJMV9QSU4xMQkJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fSVBVX1NJU0dfMgkJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fSVBVX0RJU1AxX0RBVF8yMgkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI3X19FTUlfV0VJTV9EXzI3CQkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI3X19HUElPM18yNwkJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fVUFSVDJfUlhEX01VWAkJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDIsIDB4ODgwLCAxLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0ZJUklfVFhECQkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI3X19JUFVfQ1NJMF9EXzAJCQlJT01VWF9QQUQoMHg0OTAsIDB4MTQ4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0lQVV9ESTFfUElOMTMJCQlJT01VWF9QQUQoMHg0OTAsIDB4MTQ4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0lQVV9TSVNHXzMJCQlJT01VWF9QQUQoMHg0OTAsIDB4MTQ4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0lQVV9ESVNQMV9EQVRfMjMJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fRU1JX1dFSU1fRF8yOAkJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fR1BJTzNfMjgJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX1VBUlQyX0NUUwkJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDIsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0lQVV9ESVNQQjBfU0VSX0RJTwkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMywgMHg4MkMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19DU1BJX01PU0kJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCA0LCAweDc4OCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0kyQzFfU0RBCQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgxOCwgMSwgUEFEX0NUUkxfSTJDKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19JUFVfRVhUX1RSSUcJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0lQVV9ESTBfUElOMTMJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0VNSV9XRUlNX0RfMjkJCQlJT01VWF9QQUQoMHg0OTgsIDB4MTUwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0dQSU8zXzI5CQkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19VQVJUMl9SVFMJCQlJT01VWF9QQUQoMHg0OTgsIDB4MTUwLCAyLCAweDg3QywgMSwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19JUFVfRElTUEIwX1NFUl9SUwkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19DU1BJX1NTMAkJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDQsIDB4NzhDLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMV9QSU4xNQkJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fSVBVX0NTSTFfVlNZTkMJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDYsIDB4ODNDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMF9QSU4xNAkJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fRU1JX1dFSU1fRF8zMAkJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fR1BJTzNfMzAJCQlJT01VWF9QQUQoMHg0OUMsIDB4MTU0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX1VBUlQzX0NUUwkJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDIsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX0lQVV9DU0kwX0RfMwkJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJMF9QSU4xMQkJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJU1AxX0RBVF8yMQkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19VU0JPSDNfVVNCSDFfT0MJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDYsIDB4OEEwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fVVNCT0gzX1VTQkgyX09DCQlJT01VWF9QQUQoMHg0OUMsIDB4MTU0LCA3LCAweDhBNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX0VNSV9XRUlNX0RfMzEJCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX0dQSU8zXzMxCQkJSU9NVVhfUEFEKDB4NEEwLCAweDE1OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19VQVJUM19SVFMJCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCAyLCAweDg4NCwgMywgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19JUFVfQ1NJMF9EXzIJCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX0lQVV9ESTBfUElOMTIJCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX0lQVV9ESVNQMV9EQVRfMjAJCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fVVNCT0gzX1VTQkgxX1BXUgkJSU9NVVhfUEFEKDB4NEEwLCAweDE1OCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19VU0JPSDNfVVNCSDJfUFdSCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjRfX0VNSV9XRUlNX0FfMjQJCQlJT01VWF9QQUQoMHg0QTgsIDB4MTVDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjRfX0dQSU81XzQJCQlJT01VWF9QQUQoMHg0QTgsIDB4MTVDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjRfX0lQVV9ESVNQMV9EQVRfMTkJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fSVBVX0NTSTFfRF8xOQkJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fSVBVX1NJU0dfMgkJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fVVNCUEhZMl9CVkFMSUQJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyM19fRU1JX1dFSU1fQV8yMwkJCUlPTVVYX1BBRCgweDRBQywgMHgxNjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyM19fR1BJTzZfNgkJCUlPTVVYX1BBRCgweDRBQywgMHgxNjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyM19fSVBVX0RJU1AxX0RBVF8xOAkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19JUFVfQ1NJMV9EXzE4CQkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19JUFVfU0lTR18zCQkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19VU0JQSFkyX0VORFNFU1NJT04JCUlPTVVYX1BBRCgweDRBQywgMHgxNjAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMl9fRU1JX1dFSU1fQV8yMgkJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMl9fR1BJTzJfMTYJCQlJT01VWF9QQUQoMHg0QjAsIDB4MTY0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjJfX0lQVV9ESVNQMV9EQVRfMTcJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMl9fSVBVX0NTSTFfRF8xNwkJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMl9fU1JDX0JUX0NGRzFfNwkJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMV9fRU1JX1dFSU1fQV8yMQkJCUlPTVVYX1BBRCgweDRCNCwgMHgxNjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMV9fR1BJTzJfMTcJCQlJT01VWF9QQUQoMHg0QjQsIDB4MTY4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjFfX0lQVV9ESVNQMV9EQVRfMTYJCUlPTVVYX1BBRCgweDRCNCwgMHgxNjgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMV9fSVBVX0NTSTFfRF8xNgkJCUlPTVVYX1BBRCgweDRCNCwgMHgxNjgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMV9fU1JDX0JUX0NGRzFfNgkJCUlPTVVYX1BBRCgweDRCNCwgMHgxNjgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fRU1JX1dFSU1fQV8yMAkJCUlPTVVYX1BBRCgweDRCOCwgMHgxNkMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fR1BJTzJfMTgJCQlJT01VWF9QQUQoMHg0QjgsIDB4MTZDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjBfX0lQVV9ESVNQMV9EQVRfMTUJCUlPTVVYX1BBRCgweDRCOCwgMHgxNkMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fSVBVX0NTSTFfRF8xNQkJCUlPTVVYX1BBRCgweDRCOCwgMHgxNkMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fU1JDX0JUX0NGRzFfNQkJCUlPTVVYX1BBRCgweDRCOCwgMHgxNkMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOV9fRU1JX1dFSU1fQV8xOQkJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOV9fR1BJTzJfMTkJCQlJT01VWF9QQUQoMHg0QkMsIDB4MTcwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTlfX0lQVV9ESVNQMV9EQVRfMTQJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOV9fSVBVX0NTSTFfRF8xNAkJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOV9fU1JDX0JUX0NGRzFfNAkJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOF9fRU1JX1dFSU1fQV8xOAkJCUlPTVVYX1BBRCgweDRDMCwgMHgxNzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOF9fR1BJTzJfMjAJCQlJT01VWF9QQUQoMHg0QzAsIDB4MTc0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMThfX0lQVV9ESVNQMV9EQVRfMTMJCUlPTVVYX1BBRCgweDRDMCwgMHgxNzQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOF9fSVBVX0NTSTFfRF8xMwkJCUlPTVVYX1BBRCgweDRDMCwgMHgxNzQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOF9fU1JDX0JUX0NGRzFfMwkJCUlPTVVYX1BBRCgweDRDMCwgMHgxNzQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fRU1JX1dFSU1fQV8xNwkJCUlPTVVYX1BBRCgweDRDNCwgMHgxNzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fR1BJTzJfMjEJCQlJT01VWF9QQUQoMHg0QzQsIDB4MTc4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTdfX0lQVV9ESVNQMV9EQVRfMTIJCUlPTVVYX1BBRCgweDRDNCwgMHgxNzgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fSVBVX0NTSTFfRF8xMgkJCUlPTVVYX1BBRCgweDRDNCwgMHgxNzgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fU1JDX0JUX0NGRzFfMgkJCUlPTVVYX1BBRCgweDRDNCwgMHgxNzgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExNl9fRU1JX1dFSU1fQV8xNgkJCUlPTVVYX1BBRCgweDRDOCwgMHgxN0MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExNl9fR1BJTzJfMjIJCQlJT01VWF9QQUQoMHg0QzgsIDB4MTdDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTZfX0lQVV9ESTFfRElTUF9DTEsJCUlPTVVYX1BBRCgweDRDOCwgMHgxN0MsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExNl9fSVBVX0NTSTFfUElYQ0xLCQlJT01VWF9QQUQoMHg0QzgsIDB4MTdDLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTZfX1NSQ19CVF9DRkcxXzEJCQlJT01VWF9QQUQoMHg0QzgsIDB4MTdDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzBfX0VNSV9XRUlNX0NTXzAJCQlJT01VWF9QQUQoMHg0Q0MsIDB4MTgwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzBfX0dQSU8yXzIzCQkJSU9NVVhfUEFEKDB4NENDLCAweDE4MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MwX19FQ1NQSTJfU0NMSwkJCUlPTVVYX1BBRCgweDRDQywgMHgxODAsIDIsIDB4N0I4LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0NTMF9fSVBVX0RJMV9QSU41CQkJSU9NVVhfUEFEKDB4NENDLCAweDE4MCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MxX19FTUlfV0VJTV9DU18xCQkJSU9NVVhfUEFEKDB4NEQwLCAweDE4NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MxX19HUElPMl8yNAkJCUlPTVVYX1BBRCgweDREMCwgMHgxODQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0NTMV9fRUNTUEkyX01PU0kJCQlJT01VWF9QQUQoMHg0RDAsIDB4MTg0LCAyLCAweDdDMCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzFfX0lQVV9ESTFfUElONgkJCUlPTVVYX1BBRCgweDREMCwgMHgxODQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX09FX19FTUlfV0VJTV9PRQkJCUlPTVVYX1BBRCgweDRENCwgMHgxODgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX09FX19HUElPMl8yNQkJCUlPTVVYX1BBRCgweDRENCwgMHgxODgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX09FX19FQ1NQSTJfTUlTTwkJCUlPTVVYX1BBRCgweDRENCwgMHgxODgsIDIsIDB4N0JDLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX09FX19JUFVfREkxX1BJTjcJCQlJT01VWF9QQUQoMHg0RDQsIDB4MTg4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9PRV9fVVNCUEhZMl9JRERJRwkJCUlPTVVYX1BBRCgweDRENCwgMHgxODgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX1JXX19FTUlfV0VJTV9SVwkJCUlPTVVYX1BBRCgweDREOCwgMHgxOEMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX1JXX19HUElPMl8yNgkJCUlPTVVYX1BBRCgweDREOCwgMHgxOEMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX1JXX19FQ1NQSTJfU1MwCQkJSU9NVVhfUEFEKDB4NEQ4LCAweDE4QywgMiwgMHg3QzQsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fUldfX0lQVV9ESTFfUElOOAkJCUlPTVVYX1BBRCgweDREOCwgMHgxOEMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX1JXX19VU0JQSFkyX0hPU1RESVNDT05ORUNUCQlJT01VWF9QQUQoMHg0RDgsIDB4MThDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9MQkFfX0VNSV9XRUlNX0xCQQkJCUlPTVVYX1BBRCgweDREQywgMHgxOTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0xCQV9fR1BJTzJfMjcJCQlJT01VWF9QQUQoMHg0REMsIDB4MTkwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9MQkFfX0VDU1BJMl9TUzEJCQlJT01VWF9QQUQoMHg0REMsIDB4MTkwLCAyLCAweDdDOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9MQkFfX0lQVV9ESTFfUElOMTcJCQlJT01VWF9QQUQoMHg0REMsIDB4MTkwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9MQkFfX1NSQ19CVF9DRkcxXzAJCQlJT01VWF9QQUQoMHg0REMsIDB4MTkwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0VNSV9XRUlNX0VCXzAJCQlJT01VWF9QQUQoMHg0RTQsIDB4MTk0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0dQSU8yXzI4CQkJSU9NVVhfUEFEKDB4NEU0LCAweDE5NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIwX19JUFVfRElTUDFfREFUXzExCQlJT01VWF9QQUQoMHg0RTQsIDB4MTk0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0lQVV9DU0kxX0RfMTEJCQlJT01VWF9QQUQoMHg0RTQsIDB4MTk0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0dQQ19QTUlDX1JEWQkJCUlPTVVYX1BBRCgweDRFNCwgMHgxOTQsIDUsIDB4ODEwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMF9fU1JDX0JUX0NGRzJfNwkJCUlPTVVYX1BBRCgweDRFNCwgMHgxOTQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMV9fRU1JX1dFSU1fRUJfMQkJCUlPTVVYX1BBRCgweDRFOCwgMHgxOTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMV9fR1BJTzJfMjkJCQlJT01VWF9QQUQoMHg0RTgsIDB4MTk4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjFfX0lQVV9ESVNQMV9EQVRfMTAJCUlPTVVYX1BBRCgweDRFOCwgMHgxOTgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMV9fSVBVX0NTSTFfRF8xMAkJCUlPTVVYX1BBRCgweDRFOCwgMHgxOTgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMV9fU1JDX0JUX0NGRzJfNgkJCUlPTVVYX1BBRCgweDRFOCwgMHgxOTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMF9fRU1JX05BTkRfV0VJTV9EQV8wCQlJT01VWF9QQUQoMHg0RUMsIDB4MTlDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTBfX0dQSU8zXzAJCQlJT01VWF9QQUQoMHg0RUMsIDB4MTlDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTBfX0lQVV9ESVNQMV9EQVRfOQkJSU9NVVhfUEFEKDB4NEVDLCAweDE5QywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREEwX19JUFVfQ1NJMV9EXzkJCQlJT01VWF9QQUQoMHg0RUMsIDB4MTlDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTBfX1NSQ19CVF9DRkcyXzUJCQlJT01VWF9QQUQoMHg0RUMsIDB4MTlDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTFfX0VNSV9OQU5EX1dFSU1fREFfMQkJSU9NVVhfUEFEKDB4NEYwLCAweDFBMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExX19HUElPM18xCQkJSU9NVVhfUEFEKDB4NEYwLCAweDFBMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExX19JUFVfRElTUDFfREFUXzgJCUlPTVVYX1BBRCgweDRGMCwgMHgxQTAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMV9fSVBVX0NTSTFfRF84CQkJSU9NVVhfUEFEKDB4NEYwLCAweDFBMCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExX19TUkNfQlRfQ0ZHMl80CQkJSU9NVVhfUEFEKDB4NEYwLCAweDFBMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREEyX19FTUlfTkFORF9XRUlNX0RBXzIJCUlPTVVYX1BBRCgweDRGNCwgMHgxQTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMl9fR1BJTzNfMgkJCUlPTVVYX1BBRCgweDRGNCwgMHgxQTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMl9fSVBVX0RJU1AxX0RBVF83CQlJT01VWF9QQUQoMHg0RjQsIDB4MUE0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTJfX0lQVV9DU0kxX0RfNwkJCUlPTVVYX1BBRCgweDRGNCwgMHgxQTQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMl9fU1JDX0JUX0NGRzJfMwkJCUlPTVVYX1BBRCgweDRGNCwgMHgxQTQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBM19fRU1JX05BTkRfV0VJTV9EQV8zCQlJT01VWF9QQUQoMHg0RjgsIDB4MUE4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTNfX0dQSU8zXzMJCQlJT01VWF9QQUQoMHg0RjgsIDB4MUE4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTNfX0lQVV9ESVNQMV9EQVRfNgkJSU9NVVhfUEFEKDB4NEY4LCAweDFBOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREEzX19JUFVfQ1NJMV9EXzYJCQlJT01VWF9QQUQoMHg0RjgsIDB4MUE4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTNfX1NSQ19CVF9DRkcyXzIJCQlJT01VWF9QQUQoMHg0RjgsIDB4MUE4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTRfX0VNSV9OQU5EX1dFSU1fREFfNAkJSU9NVVhfUEFEKDB4NEZDLCAweDFBQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE0X19HUElPM180CQkJSU9NVVhfUEFEKDB4NEZDLCAweDFBQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE0X19JUFVfRElTUDFfREFUXzUJCUlPTVVYX1BBRCgweDRGQywgMHgxQUMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNF9fSVBVX0NTSTFfRF81CQkJSU9NVVhfUEFEKDB4NEZDLCAweDFBQywgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE0X19TUkNfQlRfQ0ZHM183CQkJSU9NVVhfUEFEKDB4NEZDLCAweDFBQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE1X19FTUlfTkFORF9XRUlNX0RBXzUJCUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNV9fR1BJTzNfNQkJCUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNV9fSVBVX0RJU1AxX0RBVF80CQlJT01VWF9QQUQoMHg1MDAsIDB4MUIwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTVfX0lQVV9DU0kxX0RfNAkJCUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNV9fU1JDX0JUX0NGRzNfNgkJCUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDcgfCBJT01VWF9DT05GSUdfU0lPTiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE2X19FTUlfTkFORF9XRUlNX0RBXzYJCUlPTVVYX1BBRCgweDUwNCwgMHgxQjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNl9fR1BJTzNfNgkJCUlPTVVYX1BBRCgweDUwNCwgMHgxQjQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNl9fSVBVX0RJU1AxX0RBVF8zCQlJT01VWF9QQUQoMHg1MDQsIDB4MUI0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTZfX0lQVV9DU0kxX0RfMwkJCUlPTVVYX1BBRCgweDUwNCwgMHgxQjQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNl9fU1JDX0JUX0NGRzNfNQkJCUlPTVVYX1BBRCgweDUwNCwgMHgxQjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBN19fRU1JX05BTkRfV0VJTV9EQV83CQlJT01VWF9QQUQoMHg1MDgsIDB4MUI4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTdfX0dQSU8zXzcJCQlJT01VWF9QQUQoMHg1MDgsIDB4MUI4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTdfX0lQVV9ESVNQMV9EQVRfMgkJSU9NVVhfUEFEKDB4NTA4LCAweDFCOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE3X19JUFVfQ1NJMV9EXzIJCQlJT01VWF9QQUQoMHg1MDgsIDB4MUI4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTdfX1NSQ19CVF9DRkczXzQJCQlJT01VWF9QQUQoMHg1MDgsIDB4MUI4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQThfX0VNSV9OQU5EX1dFSU1fREFfOAkJSU9NVVhfUEFEKDB4NTBDLCAweDFCQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE4X19HUElPM184CQkJSU9NVVhfUEFEKDB4NTBDLCAweDFCQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE4X19JUFVfRElTUDFfREFUXzEJCUlPTVVYX1BBRCgweDUwQywgMHgxQkMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBOF9fSVBVX0NTSTFfRF8xCQkJSU9NVVhfUEFEKDB4NTBDLCAweDFCQywgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE4X19TUkNfQlRfQ0ZHM18zCQkJSU9NVVhfUEFEKDB4NTBDLCAweDFCQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE5X19FTUlfTkFORF9XRUlNX0RBXzkJCUlPTVVYX1BBRCgweDUxMCwgMHgxQzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBOV9fR1BJTzNfOQkJCUlPTVVYX1BBRCgweDUxMCwgMHgxQzAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBOV9fSVBVX0RJU1AxX0RBVF8wCQlJT01VWF9QQUQoMHg1MTAsIDB4MUMwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTlfX0lQVV9DU0kxX0RfMAkJCUlPTVVYX1BBRCgweDUxMCwgMHgxQzAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBOV9fU1JDX0JUX0NGRzNfMgkJCUlPTVVYX1BBRCgweDUxMCwgMHgxQzAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTBfX0VNSV9OQU5EX1dFSU1fREFfMTAJCUlPTVVYX1BBRCgweDUxNCwgMHgxQzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTBfX0dQSU8zXzEwCQkJSU9NVVhfUEFEKDB4NTE0LCAweDFDNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMF9fSVBVX0RJMV9QSU4xNQkJSU9NVVhfUEFEKDB4NTE0LCAweDFDNCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMF9fSVBVX0NTSTFfREFUQV9FTgkJSU9NVVhfUEFEKDB4NTE0LCAweDFDNCwgNCwgMHg4MzQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMF9fU1JDX0JUX0NGRzNfMQkJSU9NVVhfUEFEKDB4NTE0LCAweDFDNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMV9fRU1JX05BTkRfV0VJTV9EQV8xMQkJSU9NVVhfUEFEKDB4NTE4LCAweDFDOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMV9fR1BJTzNfMTEJCQlJT01VWF9QQUQoMHg1MTgsIDB4MUM4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTExX19JUFVfREkxX1BJTjIJCQlJT01VWF9QQUQoMHg1MTgsIDB4MUM4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTExX19JUFVfQ1NJMV9IU1lOQwkJSU9NVVhfUEFEKDB4NTE4LCAweDFDOCwgNCwgMHg4MzgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMl9fRU1JX05BTkRfV0VJTV9EQV8xMgkJSU9NVVhfUEFEKDB4NTFDLCAweDFDQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMl9fR1BJTzNfMTIJCQlJT01VWF9QQUQoMHg1MUMsIDB4MUNDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEyX19JUFVfREkxX1BJTjMJCQlJT01VWF9QQUQoMHg1MUMsIDB4MUNDLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEyX19JUFVfQ1NJMV9WU1lOQwkJSU9NVVhfUEFEKDB4NTFDLCAweDFDQywgNCwgMHg4M0MsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExM19fRU1JX05BTkRfV0VJTV9EQV8xMwkJSU9NVVhfUEFEKDB4NTIwLCAweDFEMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExM19fR1BJTzNfMTMJCQlJT01VWF9QQUQoMHg1MjAsIDB4MUQwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEzX19JUFVfREkxX0QwX0NTCQlJT01VWF9QQUQoMHg1MjAsIDB4MUQwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEzX19DQ01fREkxX0VYVF9DTEsJCUlPTVVYX1BBRCgweDUyMCwgMHgxRDAsIDQsIDB4NzZDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTRfX0VNSV9OQU5EX1dFSU1fREFfMTQJCUlPTVVYX1BBRCgweDUyNCwgMHgxRDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTRfX0dQSU8zXzE0CQkJSU9NVVhfUEFEKDB4NTI0LCAweDFENCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExNF9fSVBVX0RJMV9EMV9DUwkJSU9NVVhfUEFEKDB4NTI0LCAweDFENCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExNF9fQ0NNX0RJMF9FWFRfQ0xLCQlJT01VWF9QQUQoMHg1MjQsIDB4MUQ0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE1X19FTUlfTkFORF9XRUlNX0RBXzE1CQlJT01VWF9QQUQoMHg1MjgsIDB4MUQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE1X19HUElPM18xNQkJCUlPTVVYX1BBRCgweDUyOCwgMHgxRDgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTVfX0lQVV9ESTFfUElOMQkJCUlPTVVYX1BBRCgweDUyOCwgMHgxRDgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTVfX0lQVV9ESTFfUElONAkJCUlPTVVYX1BBRCgweDUyOCwgMHgxRDgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfV0VfQl9fRU1JX05BTkRGX1dFX0IJCUlPTVVYX1BBRCgweDUyQywgMHgxREMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfV0VfQl9fR1BJTzZfMTIJCQlJT01VWF9QQUQoMHg1MkMsIDB4MURDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX1JFX0JfX0VNSV9OQU5ERl9SRV9CCQlJT01VWF9QQUQoMHg1MzAsIDB4MUUwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX1JFX0JfX0dQSU82XzEzCQkJSU9NVVhfUEFEKDB4NTMwLCAweDFFMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fV0FJVF9fRU1JX1dFSU1fV0FJVAkJSU9NVVhfUEFEKDB4NTM0LCAweDFFNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fV0FJVF9fR1BJTzVfMAkJCUlPTVVYX1BBRCgweDUzNCwgMHgxRTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX1dBSVRfX0VNSV9XRUlNX0RUQUNLX0IJCUlPTVVYX1BBRCgweDUzNCwgMHgxRTQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgzX1BfX0dQSU82XzIyCQkJSU9NVVhfUEFEKF9fTkFfLCAweDFFQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDNfUF9fTERCX0xWRFMxX1RYMwkJSU9NVVhfUEFEKF9fTkFfLCAweDFFQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDJfUF9fR1BJTzZfMjQJCQlJT01VWF9QQUQoX19OQV8sIDB4MUYwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYMl9QX19MREJfTFZEUzFfVFgyCQlJT01VWF9QQUQoX19OQV8sIDB4MUYwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMxX0NMS19QX19HUElPNl8yNgkJCUlPTVVYX1BBRChfX05BXywgMHgxRjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzFfQ0xLX1BfX0xEQl9MVkRTMV9DTEsJCUlPTVVYX1BBRChfX05BXywgMHgxRjQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgxX1BfX0dQSU82XzI4CQkJSU9NVVhfUEFEKF9fTkFfLCAweDFGOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDFfUF9fTERCX0xWRFMxX1RYMQkJSU9NVVhfUEFEKF9fTkFfLCAweDFGOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDBfUF9fR1BJTzZfMzAJCQlJT01VWF9QQUQoX19OQV8sIDB4MUZDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYMF9QX19MREJfTFZEUzFfVFgwCQlJT01VWF9QQUQoX19OQV8sIDB4MUZDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMwX1RYM19QX19HUElPN18yMgkJCUlPTVVYX1BBRChfX05BXywgMHgyMDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgzX1BfX0xEQl9MVkRTMF9UWDMJCUlPTVVYX1BBRChfX05BXywgMHgyMDAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzBfQ0xLX1BfX0dQSU83XzI0CQkJSU9NVVhfUEFEKF9fTkFfLCAweDIwNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9DTEtfUF9fTERCX0xWRFMwX0NMSwkJSU9NVVhfUEFEKF9fTkFfLCAweDIwNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9UWDJfUF9fR1BJTzdfMjYJCQlJT01VWF9QQUQoX19OQV8sIDB4MjA4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMwX1RYMl9QX19MREJfTFZEUzBfVFgyCQlJT01VWF9QQUQoX19OQV8sIDB4MjA4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMwX1RYMV9QX19HUElPN18yOAkJCUlPTVVYX1BBRChfX05BXywgMHgyMEMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgxX1BfX0xEQl9MVkRTMF9UWDEJCUlPTVVYX1BBRChfX05BXywgMHgyMEMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgwX1BfX0dQSU83XzMwCQkJSU9NVVhfUEFEKF9fTkFfLCAweDIxMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9UWDBfUF9fTERCX0xWRFMwX1RYMAkJSU9NVVhfUEFEKF9fTkFfLCAweDIxMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzEwX19HUElPNF8wCQkJSU9NVVhfUEFEKDB4NTQwLCAweDIxNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzEwX19PU0MzMmtfMzJLX09VVAkJSU9NVVhfUEFEKDB4NTQwLCAweDIxNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzExX19HUElPNF8xCQkJSU9NVVhfUEFEKDB4NTQ0LCAweDIxOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzEyX19HUElPNF8yCQkJSU9NVVhfUEFEKDB4NTQ4LCAweDIxQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzEzX19HUElPNF8zCQkJSU9NVVhfUEFEKDB4NTRDLCAweDIyMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE0X19HUElPNF80CQkJSU9NVVhfUEFEKDB4NTUwLCAweDIyNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DTEVfX0VNSV9OQU5ERl9DTEUJCUlPTVVYX1BBRCgweDVBMCwgMHgyMjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ0xFX19HUElPNl83CQkJSU9NVVhfUEFEKDB4NUEwLCAweDIyOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DTEVfX1VTQlBIWTFfVlNUQVRVU18wCQlJT01VWF9QQUQoMHg1QTAsIDB4MjI4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0FMRV9fRU1JX05BTkRGX0FMRQkJSU9NVVhfUEFEKDB4NUE0LCAweDIyQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9BTEVfX0dQSU82XzgJCQlJT01VWF9QQUQoMHg1QTQsIDB4MjJDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0FMRV9fVVNCUEhZMV9WU1RBVFVTXzEJCUlPTVVYX1BBRCgweDVBNCwgMHgyMkMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfV1BfQl9fRU1JX05BTkRGX1dQX0IJCUlPTVVYX1BBRCgweDVBOCwgMHgyMzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfV1BfQl9fR1BJTzZfOQkJCUlPTVVYX1BBRCgweDVBOCwgMHgyMzAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfV1BfQl9fVVNCUEhZMV9WU1RBVFVTXzIJCUlPTVVYX1BBRCgweDVBOCwgMHgyMzAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfUkIwX19FTUlfTkFOREZfUkJfMAkJSU9NVVhfUEFEKDB4NUFDLCAweDIzNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9SQjBfX0dQSU82XzEwCQkJSU9NVVhfUEFEKDB4NUFDLCAweDIzNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9SQjBfX1VTQlBIWTFfVlNUQVRVU18zCQlJT01VWF9QQUQoMHg1QUMsIDB4MjM0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMF9fRU1JX05BTkRGX0NTXzAJCUlPTVVYX1BBRCgweDVCMCwgMHgyMzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MwX19HUElPNl8xMQkJCUlPTVVYX1BBRCgweDVCMCwgMHgyMzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MwX19VU0JQSFkxX1ZTVEFUVVNfNAkJSU9NVVhfUEFEKDB4NUIwLCAweDIzOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzFfX0VNSV9OQU5ERl9DU18xCQlJT01VWF9QQUQoMHg1QjQsIDB4MjNDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMV9fR1BJTzZfMTQJCQlJT01VWF9QQUQoMHg1QjQsIDB4MjNDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMV9fTUxCX01MQkNMSwkJCUlPTVVYX1BBRCgweDVCNCwgMHgyM0MsIDYsIDB4ODU4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MxX19VU0JQSFkxX1ZTVEFUVVNfNQkJSU9NVVhfUEFEKDB4NUI0LCAweDIzQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX0VNSV9OQU5ERl9DU18yCQlJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fR1BJTzZfMTUJCQlJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fSVBVX1NJU0dfMAkJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MyX19FU0FJMV9UWDAJCQlJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCAzLCAweDdFNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fRU1JX1dFSU1fQ1JFCQlJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fQ0NNX0NTSTBfTUNMSwkJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX01MQl9NTEJTSUcJCQlJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCA2LCAweDg2MCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fVVNCUEhZMV9WU1RBVFVTXzYJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MzX19FTUlfTkFOREZfQ1NfMwkJSU9NVVhfUEFEKDB4NUJDLCAweDI0NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX0dQSU82XzE2CQkJSU9NVVhfUEFEKDB4NUJDLCAweDI0NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX0lQVV9TSVNHXzEJCQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTM19fRVNBSTFfVFgxCQkJSU9NVVhfUEFEKDB4NUJDLCAweDI0NCwgMywgMHg3RTgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX0VNSV9XRUlNX0FfMjYJCUlPTVVYX1BBRCgweDVCQywgMHgyNDQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MzX19NTEJfTUxCREFUCQkJSU9NVVhfUEFEKDB4NUJDLCAweDI0NCwgNiwgMHg4NUMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX1VTQlBIWTFfVlNUQVRVU183CQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRElPX19GRUNfTURJTwkJCUlPTVVYX1BBRCgweDVDNCwgMHgyNDgsIDAsIDB4ODA0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX01ESU9fX0dQSU8xXzIyCQkJSU9NVVhfUEFEKDB4NUM0LCAweDI0OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fRVNBSTFfU0NLUgkJCUlPTVVYX1BBRCgweDVDNCwgMHgyNDgsIDIsIDB4N0RDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX01ESU9fX0ZFQ19DT0wJCQlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCAzLCAweDgwMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRElPX19SVENfQ0VfUlRDX1BTMgkJSU9NVVhfUEFEKDB4NUM0LCAweDI0OCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fU0RNQV9ERUJVR19CVVNfREVWSUNFXzMJSU9NVVhfUEFEKDB4NUM0LCAweDI0OCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fRU1JX0VNSV9ERUJVR180OQkJSU9NVVhfUEFEKDB4NUM0LCAweDI0OCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUkVGX0NMS19fRkVDX1RYX0NMSwkJSU9NVVhfUEFEKDB4NUM4LCAweDI0QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUkVGX0NMS19fR1BJTzFfMjMJCQlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SRUZfQ0xLX19FU0FJMV9GU1IJCQlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCAyLCAweDdDQywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SRUZfQ0xLX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfNAlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SRUZfQ0xLX19FTUlfRU1JX0RFQlVHXzUwCQlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWF9FUl9fRkVDX1JYX0VSCQkJSU9NVVhfUEFEKDB4NUNDLCAweDI1MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhfRVJfX0dQSU8xXzI0CQkJSU9NVVhfUEFEKDB4NUNDLCAweDI1MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhfRVJfX0VTQUkxX0hDS1IJCQlJT01VWF9QQUQoMHg1Q0MsIDB4MjUwLCAyLCAweDdENCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWF9FUl9fRkVDX1JYX0NMSwkJCUlPTVVYX1BBRCgweDVDQywgMHgyNTAsIDMsIDB4ODA4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYX0VSX19SVENfQ0VfUlRDX1BTMwkJSU9NVVhfUEFEKDB4NUNDLCAweDI1MCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfQ1JTX0RWX19GRUNfUlhfRFYJCQlJT01VWF9QQUQoMHg1RDAsIDB4MjU0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19DUlNfRFZfX0dQSU8xXzI1CQkJSU9NVVhfUEFEKDB4NUQwLCAweDI1NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfQ1JTX0RWX19FU0FJMV9TQ0tUCQkJSU9NVVhfUEFEKDB4NUQwLCAweDI1NCwgMiwgMHg3RTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMV9fRkVDX1JEQVRBXzEJCQlJT01VWF9QQUQoMHg1RDQsIDB4MjU4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQxX19HUElPMV8yNgkJCUlPTVVYX1BBRCgweDVENCwgMHgyNTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDFfX0VTQUkxX0ZTVAkJCUlPTVVYX1BBRCgweDVENCwgMHgyNTgsIDIsIDB4N0QwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDFfX01MQl9NTEJTSUcJCQlJT01VWF9QQUQoMHg1RDQsIDB4MjU4LCAzLCAweDg2MCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQxX19SVENfQ0VfUlRDX1BTMQkJSU9NVVhfUEFEKDB4NUQ0LCAweDI1OCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMF9fRkVDX1JEQVRBXzAJCQlJT01VWF9QQUQoMHg1RDgsIDB4MjVDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQwX19HUElPMV8yNwkJCUlPTVVYX1BBRCgweDVEOCwgMHgyNUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDBfX0VTQUkxX0hDS1QJCQlJT01VWF9QQUQoMHg1RDgsIDB4MjVDLCAyLCAweDdEOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQwX19PU0MzMmtfMzJLX09VVAkJSU9NVVhfUEFEKDB4NUQ4LCAweDI1QywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhfRU5fX0ZFQ19UWF9FTgkJCUlPTVVYX1BBRCgweDVEQywgMHgyNjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1RYX0VOX19HUElPMV8yOAkJCUlPTVVYX1BBRCgweDVEQywgMHgyNjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1RYX0VOX19FU0FJMV9UWDNfUlgyCQlJT01VWF9QQUQoMHg1REMsIDB4MjYwLCAyLCAweDdGMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQxX19GRUNfVERBVEFfMQkJCUlPTVVYX1BBRCgweDVFMCwgMHgyNjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDFfX0dQSU8xXzI5CQkJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMV9fRVNBSTFfVFgyX1JYMwkJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgMiwgMHg3RUMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMV9fTUxCX01MQkNMSwkJCUlPTVVYX1BBRCgweDVFMCwgMHgyNjQsIDMsIDB4ODU4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDFfX1JUQ19DRV9SVENfUFJTQ19DTEsJCUlPTVVYX1BBRCgweDVFMCwgMHgyNjQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDBfX0ZFQ19UREFUQV8wCQkJSU9NVVhfUEFEKDB4NUU0LCAweDI2OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMF9fR1BJTzFfMzAJCQlJT01VWF9QQUQoMHg1RTQsIDB4MjY4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQwX19FU0FJMV9UWDRfUlgxCQlJT01VWF9QQUQoMHg1RTQsIDB4MjY4LCAyLCAweDdGNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQwX19VU0JQSFkyX0RBVEFPVVRfMAkJSU9NVVhfUEFEKDB4NUU0LCAweDI2OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19GRUNfTURDCQkJSU9NVVhfUEFEKDB4NUU4LCAweDI2QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19HUElPMV8zMQkJCUlPTVVYX1BBRCgweDVFOCwgMHgyNkMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX01EQ19fRVNBSTFfVFg1X1JYMAkJCUlPTVVYX1BBRCgweDVFOCwgMHgyNkMsIDIsIDB4N0Y4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX01EQ19fTUxCX01MQkRBVAkJCUlPTVVYX1BBRCgweDVFOCwgMHgyNkMsIDMsIDB4ODVDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX01EQ19fUlRDX0NFX1JUQ19BTEFSTTFfVFJJRwlJT01VWF9QQUQoMHg1RTgsIDB4MjZDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRENfX1VTQlBIWTJfREFUQU9VVF8xCQlJT01VWF9QQUQoMHg1RTgsIDB4MjZDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPV19fUEFUQV9ESU9XCQkJSU9NVVhfUEFEKDB4NUYwLCAweDI3MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1dfX0dQSU82XzE3CQkJSU9NVVhfUEFEKDB4NUYwLCAweDI3MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1dfX1VBUlQxX1RYRF9NVVgJCUlPTVVYX1BBRCgweDVGMCwgMHgyNzAsIDMsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPV19fVVNCUEhZMl9EQVRBT1VUXzIJCUlPTVVYX1BBRCgweDVGMCwgMHgyNzAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFDS19fUEFUQV9ETUFDSwkJCUlPTVVYX1BBRCgweDVGNCwgMHgyNzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFDS19fR1BJTzZfMTgJCQlJT01VWF9QQUQoMHg1RjQsIDB4Mjc0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BQ0tfX1VBUlQxX1JYRF9NVVgJCUlPTVVYX1BBRCgweDVGNCwgMHgyNzQsIDMsIDB4ODc4LCAzLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BQ0tfX1VTQlBIWTJfREFUQU9VVF8zCQlJT01VWF9QQUQoMHg1RjQsIDB4Mjc0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BUlFfX1BBVEFfRE1BUlEJCQlJT01VWF9QQUQoMHg1RjgsIDB4Mjc4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BUlFfX0dQSU83XzAJCQlJT01VWF9QQUQoMHg1RjgsIDB4Mjc4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BUlFfX1VBUlQyX1RYRF9NVVgJCUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDMsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BUlFfX0NDTV9DQ01fT1VUXzAJCUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFSUV9fVVNCUEhZMl9EQVRBT1VUXzQJCUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX1BBVEFfQlVGRkVSX0VOCQlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19HUElPN18xCQlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19VQVJUMl9SWERfTVVYCQlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCAzLCAweDg4MCwgMywgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fQ0NNX0NDTV9PVVRfMQkJSU9NVVhfUEFEKDB4NUZDLCAweDI3QywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fVVNCUEhZMl9EQVRBT1VUXzUJSU9NVVhfUEFEKDB4NUZDLCAweDI3QywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lOVFJRX19QQVRBX0lOVFJRCQkJSU9NVVhfUEFEKDB4NjAwLCAweDI4MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lOVFJRX19HUElPN18yCQkJSU9NVVhfUEFEKDB4NjAwLCAweDI4MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lOVFJRX19VQVJUMl9DVFMJCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCAzLCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lOVFJRX19DQU4xX1RYQ0FOCQkJSU9NVVhfUEFEKDB4NjAwLCAweDI4MCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lOVFJRX19DQ01fQ0NNX09VVF8yCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU5UUlFfX1VTQlBIWTJfREFUQU9VVF82CQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPUl9fUEFUQV9ESU9SCQkJSU9NVVhfUEFEKDB4NjA0LCAweDI4NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1JfX0dQSU83XzMJCQlJT01VWF9QQUQoMHg2MDQsIDB4Mjg0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPUl9fVUFSVDJfUlRTCQkJSU9NVVhfUEFEKDB4NjA0LCAweDI4NCwgMywgMHg4N0MsIDMsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9SX19DQU4xX1JYQ0FOCQkJSU9NVVhfUEFEKDB4NjA0LCAweDI4NCwgNCwgMHg3NjAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1JfX1VTQlBIWTJfREFUQU9VVF83CQlJT01VWF9QQUQoMHg2MDQsIDB4Mjg0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfUkVTRVRfQl9fUEFUQV9QQVRBX1JFU0VUX0IJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX1JFU0VUX0JfX0dQSU83XzQJCQlJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfUkVTRVRfQl9fRVNESEMzX0NNRAkJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgMiwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19VQVJUMV9DVFMJCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDMsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfUkVTRVRfQl9fQ0FOMl9UWENBTgkJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VTQlBIWTFfREFUQU9VVF8wCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fUEFUQV9JT1JEWQkJCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fR1BJTzdfNQkJCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fRVNESEMzX0NMSwkJCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDIsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX1VBUlQxX1JUUwkJCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDMsIDB4ODc0LCAzLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX0NBTjJfUlhDQU4JCQlJT01VWF9QQUQoMHg2MEMsIDB4MjhDLCA0LCAweDc2NCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX1VTQlBIWTFfREFUQU9VVF8xCQlJT01VWF9QQUQoMHg2MEMsIDB4MjhDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMF9fUEFUQV9EQV8wCQkJSU9NVVhfUEFEKDB4NjEwLCAweDI5MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzBfX0dQSU83XzYJCQlJT01VWF9QQUQoMHg2MTAsIDB4MjkwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMF9fRVNESEMzX1JTVAkJCUlPTVVYX1BBRCgweDYxMCwgMHgyOTAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8wX19PV0lSRV9MSU5FCQkJSU9NVVhfUEFEKDB4NjEwLCAweDI5MCwgNCwgMHg4NjQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzBfX1VTQlBIWTFfREFUQU9VVF8yCQlJT01VWF9QQUQoMHg2MTAsIDB4MjkwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMV9fUEFUQV9EQV8xCQkJSU9NVVhfUEFEKDB4NjE0LCAweDI5NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzFfX0dQSU83XzcJCQlJT01VWF9QQUQoMHg2MTQsIDB4Mjk0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMV9fRVNESEM0X0NNRAkJCUlPTVVYX1BBRCgweDYxNCwgMHgyOTQsIDIsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMV9fVUFSVDNfQ1RTCQkJSU9NVVhfUEFEKDB4NjE0LCAweDI5NCwgNCwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8xX19VU0JQSFkxX0RBVEFPVVRfMwkJSU9NVVhfUEFEKDB4NjE0LCAweDI5NCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzJfX1BBVEFfREFfMgkJCUlPTVVYX1BBRCgweDYxOCwgMHgyOTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8yX19HUElPN184CQkJSU9NVVhfUEFEKDB4NjE4LCAweDI5OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzJfX0VTREhDNF9DTEsJCQlJT01VWF9QQUQoMHg2MTgsIDB4Mjk4LCAyLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzJfX1VBUlQzX1JUUwkJCUlPTVVYX1BBRCgweDYxOCwgMHgyOTgsIDQsIDB4ODg0LCA1LCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMl9fVVNCUEhZMV9EQVRBT1VUXzQJCUlPTVVYX1BBRCgweDYxOCwgMHgyOTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18wX19QQVRBX0NTXzAJCQlJT01VWF9QQUQoMHg2MUMsIDB4MjlDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMF9fR1BJTzdfOQkJCUlPTVVYX1BBRCgweDYxQywgMHgyOUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18wX19VQVJUM19UWERfTVVYCQlJT01VWF9QQUQoMHg2MUMsIDB4MjlDLCA0LCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzBfX1VTQlBIWTFfREFUQU9VVF81CQlJT01VWF9QQUQoMHg2MUMsIDB4MjlDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMV9fUEFUQV9DU18xCQkJSU9NVVhfUEFEKDB4NjIwLCAweDJBMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzFfX0dQSU83XzEwCQkJSU9NVVhfUEFEKDB4NjIwLCAweDJBMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzFfX1VBUlQzX1JYRF9NVVgJCUlPTVVYX1BBRCgweDYyMCwgMHgyQTAsIDQsIDB4ODg4LCAzLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMV9fVVNCUEhZMV9EQVRBT1VUXzYJCUlPTVVYX1BBRCgweDYyMCwgMHgyQTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMF9fUEFUQV9EQVRBXzAJCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMF9fR1BJTzJfMAkJCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMF9fRU1JX05BTkRGX0RfMAkJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19FU0RIQzNfREFUNAkJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMF9fR1BVM2RfR1BVX0RFQlVHX09VVF8wCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMF9fSVBVX0RJQUdfQlVTXzAJCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMF9fVVNCUEhZMV9EQVRBT1VUXzcJCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fUEFUQV9EQVRBXzEJCUlPTVVYX1BBRCgweDYyQywgMHgyQTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fR1BJTzJfMQkJCUlPTVVYX1BBRCgweDYyQywgMHgyQTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fRU1JX05BTkRGX0RfMQkJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19FU0RIQzNfREFUNQkJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xCUlPTVVYX1BBRCgweDYyQywgMHgyQTgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fSVBVX0RJQUdfQlVTXzEJCUlPTVVYX1BBRCgweDYyQywgMHgyQTgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMl9fUEFUQV9EQVRBXzIJCUlPTVVYX1BBRCgweDYzMCwgMHgyQUMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMl9fR1BJTzJfMgkJCUlPTVVYX1BBRCgweDYzMCwgMHgyQUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMl9fRU1JX05BTkRGX0RfMgkJSU9NVVhfUEFEKDB4NjMwLCAweDJBQywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19FU0RIQzNfREFUNgkJSU9NVVhfUEFEKDB4NjMwLCAweDJBQywgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMl9fR1BVM2RfR1BVX0RFQlVHX09VVF8yCUlPTVVYX1BBRCgweDYzMCwgMHgyQUMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMl9fSVBVX0RJQUdfQlVTXzIJCUlPTVVYX1BBRCgweDYzMCwgMHgyQUMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBM19fUEFUQV9EQVRBXzMJCUlPTVVYX1BBRCgweDYzNCwgMHgyQjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBM19fR1BJTzJfMwkJCUlPTVVYX1BBRCgweDYzNCwgMHgyQjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBM19fRU1JX05BTkRGX0RfMwkJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEzX19FU0RIQzNfREFUNwkJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBM19fR1BVM2RfR1BVX0RFQlVHX09VVF8zCUlPTVVYX1BBRCgweDYzNCwgMHgyQjAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBM19fSVBVX0RJQUdfQlVTXzMJCUlPTVVYX1BBRCgweDYzNCwgMHgyQjAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fUEFUQV9EQVRBXzQJCUlPTVVYX1BBRCgweDYzOCwgMHgyQjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fR1BJTzJfNAkJCUlPTVVYX1BBRCgweDYzOCwgMHgyQjQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fRU1JX05BTkRGX0RfNAkJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19FU0RIQzRfREFUNAkJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fR1BVM2RfR1BVX0RFQlVHX09VVF80CUlPTVVYX1BBRCgweDYzOCwgMHgyQjQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fSVBVX0RJQUdfQlVTXzQJCUlPTVVYX1BBRCgweDYzOCwgMHgyQjQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNV9fUEFUQV9EQVRBXzUJCUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNV9fR1BJTzJfNQkJCUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNV9fRU1JX05BTkRGX0RfNQkJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19FU0RIQzRfREFUNQkJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNV9fR1BVM2RfR1BVX0RFQlVHX09VVF81CUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNV9fSVBVX0RJQUdfQlVTXzUJCUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNl9fUEFUQV9EQVRBXzYJCUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNl9fR1BJTzJfNgkJCUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNl9fRU1JX05BTkRGX0RfNgkJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE2X19FU0RIQzRfREFUNgkJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNl9fR1BVM2RfR1BVX0RFQlVHX09VVF82CUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNl9fSVBVX0RJQUdfQlVTXzYJCUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fUEFUQV9EQVRBXzcJCUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fR1BJTzJfNwkJCUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fRU1JX05BTkRGX0RfNwkJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19FU0RIQzRfREFUNwkJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fR1BVM2RfR1BVX0RFQlVHX09VVF83CUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fSVBVX0RJQUdfQlVTXzcJCUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOF9fUEFUQV9EQVRBXzgJCUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOF9fR1BJTzJfOAkJCUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOF9fRVNESEMxX0RBVDQJCUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDIsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQThfX0VNSV9OQU5ERl9EXzgJCUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOF9fRVNESEMzX0RBVDAJCUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDQsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQThfX0dQVTNkX0dQVV9ERUJVR19PVVRfOAlJT01VWF9QQUQoMHg2NDgsIDB4MkM0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQThfX0lQVV9ESUFHX0JVU184CQlJT01VWF9QQUQoMHg2NDgsIDB4MkM0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX1BBVEFfREFUQV85CQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0dQSU8yXzkJCQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0VTREhDMV9EQVQ1CQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCAyLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE5X19FTUlfTkFOREZfRF85CQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0VTREhDM19EQVQxCQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE5X19HUFUzZF9HUFVfREVCVUdfT1VUXzkJSU9NVVhfUEFEKDB4NjRDLCAweDJDOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE5X19JUFVfRElBR19CVVNfOQkJSU9NVVhfUEFEKDB4NjRDLCAweDJDOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMF9fUEFUQV9EQVRBXzEwCQlJT01VWF9QQUQoMHg2NTAsIDB4MkNDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19HUElPMl8xMAkJCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTBfX0VTREhDMV9EQVQ2CQlJT01VWF9QQUQoMHg2NTAsIDB4MkNDLCAyLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMF9fRU1JX05BTkRGX0RfMTAJCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTBfX0VTREhDM19EQVQyCQlJT01VWF9QQUQoMHg2NTAsIDB4MkNDLCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMF9fR1BVM2RfR1BVX0RFQlVHX09VVF8xMAlJT01VWF9QQUQoMHg2NTAsIDB4MkNDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19JUFVfRElBR19CVVNfMTAJCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX1BBVEFfREFUQV8xMQkJSU9NVVhfUEFEKDB4NjU0LCAweDJEMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fR1BJTzJfMTEJCQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTExX19FU0RIQzFfREFUNwkJSU9NVVhfUEFEKDB4NjU0LCAweDJEMCwgMiwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX0VNSV9OQU5ERl9EXzExCQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTExX19FU0RIQzNfREFUMwkJSU9NVVhfUEFEKDB4NjU0LCAweDJEMCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTEJSU9NVVhfUEFEKDB4NjU0LCAweDJEMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fSVBVX0RJQUdfQlVTXzExCQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19QQVRBX0RBVEFfMTIJCUlPTVVYX1BBRCgweDY1OCwgMHgyRDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTJfX0dQSU8yXzEyCQkJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fRVNESEMyX0RBVDQJCUlPTVVYX1BBRCgweDY1OCwgMHgyRDQsIDIsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19FTUlfTkFOREZfRF8xMgkJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fRVNESEM0X0RBVDAJCUlPTVVYX1BBRCgweDY1OCwgMHgyRDQsIDQsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19HUFUzZF9HUFVfREVCVUdfT1VUXzEyCUlPTVVYX1BBRCgweDY1OCwgMHgyRDQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTJfX0lQVV9ESUFHX0JVU18xMgkJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExM19fUEFUQV9EQVRBXzEzCQlJT01VWF9QQUQoMHg2NUMsIDB4MkQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19HUElPMl8xMwkJCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTNfX0VTREhDMl9EQVQ1CQlJT01VWF9QQUQoMHg2NUMsIDB4MkQ4LCAyLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExM19fRU1JX05BTkRGX0RfMTMJCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTNfX0VTREhDNF9EQVQxCQlJT01VWF9QQUQoMHg2NUMsIDB4MkQ4LCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExM19fR1BVM2RfR1BVX0RFQlVHX09VVF8xMwlJT01VWF9QQUQoMHg2NUMsIDB4MkQ4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19JUFVfRElBR19CVVNfMTMJCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX1BBVEFfREFUQV8xNAkJSU9NVVhfUEFEKDB4NjYwLCAweDJEQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fR1BJTzJfMTQJCQlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE0X19FU0RIQzJfREFUNgkJSU9NVVhfUEFEKDB4NjYwLCAweDJEQywgMiwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX0VNSV9OQU5ERl9EXzE0CQlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE0X19FU0RIQzRfREFUMgkJSU9NVVhfUEFEKDB4NjYwLCAweDJEQywgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTQJSU9NVVhfUEFEKDB4NjYwLCAweDJEQywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fSVBVX0RJQUdfQlVTXzE0CQlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19QQVRBX0RBVEFfMTUJCUlPTVVYX1BBRCgweDY2NCwgMHgyRTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTVfX0dQSU8yXzE1CQkJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fRVNESEMyX0RBVDcJCUlPTVVYX1BBRCgweDY2NCwgMHgyRTAsIDIsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19FTUlfTkFOREZfRF8xNQkJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fRVNESEM0X0RBVDMJCUlPTVVYX1BBRCgweDY2NCwgMHgyRTAsIDQsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19HUFUzZF9HUFVfREVCVUdfT1VUXzE1CUlPTVVYX1BBRCgweDY2NCwgMHgyRTAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTVfX0lQVV9ESUFHX0JVU18xNQkJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTBfX0VTREhDMV9EQVQwCQkJSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEwX19HUElPMV8xNgkJCUlPTVVYX1BBRCgweDY2QywgMHgyRTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEwX19HUFRfQ0FQSU4xCQkJSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTBfX0NTUElfTUlTTwkJCUlPTVVYX1BBRCgweDY2QywgMHgyRTQsIDUsIDB4Nzg0LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEwX19DQ01fUExMM19CWVAJCUlPTVVYX1BBRCgweDY2QywgMHgyRTQsIDcsIDB4Nzc4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEExX19FU0RIQzFfREFUMQkJCUlPTVVYX1BBRCgweDY3MCwgMHgyRTgsIDAsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMV9fR1BJTzFfMTcJCQlJT01VWF9QQUQoMHg2NzAsIDB4MkU4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMV9fR1BUX0NBUElOMgkJCUlPTVVYX1BBRCgweDY3MCwgMHgyRTgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEExX19DU1BJX1NTMAkJCUlPTVVYX1BBRCgweDY3MCwgMHgyRTgsIDUsIDB4NzhDLCAzLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEExX19DQ01fUExMNF9CWVAJCUlPTVVYX1BBRCgweDY3MCwgMHgyRTgsIDcsIDB4NzdDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0NNRF9fRVNESEMxX0NNRAkJCUlPTVVYX1BBRCgweDY3NCwgMHgyRUMsIDAgfCBJT01VWF9DT05GSUdfU0lPTiwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0NNRF9fR1BJTzFfMTgJCQlJT01VWF9QQUQoMHg2NzQsIDB4MkVDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9DTURfX0dQVF9DTVBPVVQxCQkJSU9NVVhfUEFEKDB4Njc0LCAweDJFQywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfQ01EX19DU1BJX01PU0kJCQlJT01VWF9QQUQoMHg2NzQsIDB4MkVDLCA1LCAweDc4OCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9DTURfX0NDTV9QTEwxX0JZUAkJCUlPTVVYX1BBRCgweDY3NCwgMHgyRUMsIDcsIDB4NzcwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19FU0RIQzFfREFUMgkJCUlPTVVYX1BBRCgweDY3OCwgMHgyRjAsIDAsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fR1BJTzFfMTkJCQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fR1BUX0NNUE9VVDIJCQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fUFdNMl9QV01PCQkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX1dET0cxX1dET0dfQgkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX0NTUElfU1MxCQkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgNSwgMHg3OTAsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX1dET0cxX1dET0dfUlNUX0JfREVCCUlPTVVYX1BBRCgweDY3OCwgMHgyRjAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19DQ01fUExMMl9CWVAJCUlPTVVYX1BBRCgweDY3OCwgMHgyRjAsIDcsIDB4Nzc0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0NMS19fRVNESEMxX0NMSwkJCUlPTVVYX1BBRCgweDY3QywgMHgyRjQsIDAsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9DTEtfX0dQSU8xXzIwCQkJSU9NVVhfUEFEKDB4NjdDLCAweDJGNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfQ0xLX19PU0MzMmtfMzJLX09VVAkJSU9NVVhfUEFEKDB4NjdDLCAweDJGNCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfQ0xLX19HUFRfQ0xLSU4JCQlJT01VWF9QQUQoMHg2N0MsIDB4MkY0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9DTEtfX0NTUElfU0NMSwkJCUlPTVVYX1BBRCgweDY3QywgMHgyRjQsIDUsIDB4NzgwLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0NMS19fU0FUQV9QSFlfRFRCXzAJCUlPTVVYX1BBRCgweDY3QywgMHgyRjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19FU0RIQzFfREFUMwkJCUlPTVVYX1BBRCgweDY4MCwgMHgyRjgsIDAsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fR1BJTzFfMjEJCQlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fR1BUX0NNUE9VVDMJCQlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fUFdNMV9QV01PCQkJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX1dET0cyX1dET0dfQgkJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX0NTUElfU1MyCQkJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgNSwgMHg3OTQsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX1dET0cyX1dET0dfUlNUX0JfREVCCUlPTVVYX1BBRCgweDY4MCwgMHgyRjgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19TQVRBX1BIWV9EVEJfMQkJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfQ0xLX19FU0RIQzJfQ0xLCQkJSU9NVVhfUEFEKDB4Njg4LCAweDJGQywgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0NMS19fR1BJTzFfMTAJCQlJT01VWF9QQUQoMHg2ODgsIDB4MkZDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9DTEtfX0tQUF9DT0xfNQkJCUlPTVVYX1BBRCgweDY4OCwgMHgyRkMsIDIsIDB4ODQwLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0NMS19fQVVETVVYX0FVRDRfUlhGUwkJSU9NVVhfUEFEKDB4Njg4LCAweDJGQywgMywgMHg3M0MsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfQ0xLX19DU1BJX1NDTEsJCQlJT01VWF9QQUQoMHg2ODgsIDB4MkZDLCA1LCAweDc4MCwgMywgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9DTEtfX1NDQ19SQU5ET01fVgkJCUlPTVVYX1BBRCgweDY4OCwgMHgyRkMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0NNRF9fRVNESEMyX0NNRAkJCUlPTVVYX1BBRCgweDY4QywgMHgzMDAsIDAsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9DTURfX0dQSU8xXzExCQkJSU9NVVhfUEFEKDB4NjhDLCAweDMwMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfQ01EX19LUFBfUk9XXzUJCQlJT01VWF9QQUQoMHg2OEMsIDB4MzAwLCAyLCAweDg0QywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9DTURfX0FVRE1VWF9BVUQ0X1JYQwkJSU9NVVhfUEFEKDB4NjhDLCAweDMwMCwgMywgMHg3MzgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfQ01EX19DU1BJX01PU0kJCQlJT01VWF9QQUQoMHg2OEMsIDB4MzAwLCA1LCAweDc4OCwgMywgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9DTURfX1NDQ19SQU5ET00JCQlJT01VWF9QQUQoMHg2OEMsIDB4MzAwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBM19fRVNESEMyX0RBVDMJCQlJT01VWF9QQUQoMHg2OTAsIDB4MzA0LCAwLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTNfX0dQSU8xXzEyCQkJSU9NVVhfUEFEKDB4NjkwLCAweDMwNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTNfX0tQUF9DT0xfNgkJCUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDIsIDB4ODQ0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEzX19BVURNVVhfQVVENF9UWEMJCUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDMsIDB4NzQwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEzX19DU1BJX1NTMgkJCUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDUsIDB4Nzk0LCAzLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEzX19TSkNfRE9ORQkJCUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEyX19FU0RIQzJfREFUMgkJCUlPTVVYX1BBRCgweDY5NCwgMHgzMDgsIDAsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMl9fR1BJTzFfMTMJCQlJT01VWF9QQUQoMHg2OTQsIDB4MzA4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMl9fS1BQX1JPV182CQkJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgMiwgMHg4NTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTJfX0FVRE1VWF9BVUQ0X1RYRAkJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgMywgMHg3MzQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTJfX0NTUElfU1MxCQkJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgNSwgMHg3OTAsIDMsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTJfX1NKQ19GQUlMCQkJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTFfX0VTREhDMl9EQVQxCQkJSU9NVVhfUEFEKDB4Njk4LCAweDMwQywgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEExX19HUElPMV8xNAkJCUlPTVVYX1BBRCgweDY5OCwgMHgzMEMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEExX19LUFBfQ09MXzcJCQlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCAyLCAweDg0OCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fQVVETVVYX0FVRDRfVFhGUwkJSU9NVVhfUEFEKDB4Njk4LCAweDMwQywgMywgMHg3NDQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTFfX0NTUElfU1MwCQkJSU9NVVhfUEFEKDB4Njk4LCAweDMwQywgNSwgMHg3OEMsIDQsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTFfX1JUSUNfU0VDX1ZJTwkJSU9NVVhfUEFEKDB4Njk4LCAweDMwQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTBfX0VTREhDMl9EQVQwCQkJSU9NVVhfUEFEKDB4NjlDLCAweDMxMCwgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEwX19HUElPMV8xNQkJCUlPTVVYX1BBRCgweDY5QywgMHgzMTAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEwX19LUFBfUk9XXzcJCQlJT01VWF9QQUQoMHg2OUMsIDB4MzEwLCAyLCAweDg1NCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMF9fQVVETVVYX0FVRDRfUlhECQlJT01VWF9QQUQoMHg2OUMsIDB4MzEwLCAzLCAweDczMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMF9fQ1NQSV9NSVNPCQkJSU9NVVhfUEFEKDB4NjlDLCAweDMxMCwgNSwgMHg3ODQsIDMsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTBfX1JUSUNfRE9ORV9JTlQJCUlPTVVYX1BBRCgweDY5QywgMHgzMTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18wX19DQ01fQ0xLTwkJCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18wX19HUElPMV8wCQkJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzBfX0tQUF9DT0xfNQkJCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDIsIDB4ODQwLCAzLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18wX19DQ01fU1NJX0VYVDFfQ0xLCQlJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fRVBJVDFfRVBJVE8JCQlJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fU1JUQ19BTEFSTV9ERUIJCQlJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fVVNCT0gzX1VTQkgxX1BXUgkJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzBfX0NTVV9URAkJCQlJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fRVNBSTFfU0NLUgkJCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDAsIDB4N0RDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xX19HUElPMV8xCQkJSU9NVVhfUEFEKDB4NkE4LCAweDMxOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX0tQUF9ST1dfNQkJCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDIsIDB4ODRDLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xX19DQ01fU1NJX0VYVDJfQ0xLCQlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fUFdNMl9QV01PCQkJSU9NVVhfUEFEKDB4NkE4LCAweDMxOCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX1dET0cyX1dET0dfQgkJCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xX19FU0RIQzFfQ0QJCQlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fU1JDX1RFU1RFUl9BQ0sJCQlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fRVNBSTFfRlNSCQkJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgMCwgMHg3Q0MsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX0dQSU8xXzkJCQlJT01VWF9QQUQoMHg2QUMsIDB4MzFDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fS1BQX0NPTF82CQkJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgMiwgMHg4NDQsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX0NDTV9SRUZfRU5fQgkJCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT185X19QV00xX1BXTU8JCQlJT01VWF9QQUQoMHg2QUMsIDB4MzFDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fV0RPRzFfV0RPR19CCQkJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX0VTREhDMV9XUAkJCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDYsIDB4N0ZDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT185X19TQ0NfRkFJTF9TVEFURQkJCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18zX19FU0FJMV9IQ0tSCQkJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgMCwgMHg3RDQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX0dQSU8xXzMJCQlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fSTJDM19TQ0wJCQlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCAyIHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18zX19EUExMSVAxX1RPR19FTgkJCUlPTVVYX1BBRCgweDZCMCwgMHgzMjAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18zX19DQ01fQ0xLTzIJCQlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDAJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX1VTQk9IM19VU0JIMV9PQwkJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgNiwgMHg4QTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX01MQl9NTEJDTEsJCQlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCA3LCAweDg1OCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNl9fRVNBSTFfU0NLVAkJCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDAsIDB4N0UwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT182X19HUElPMV82CQkJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX0kyQzNfU0RBCQkJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgMiB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNl9fQ0NNX0NDTV9PVVRfMAkJCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT182X19DU1VfQ1NVX0lOVF9ERUIJCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT182X19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMQlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNl9fRVNESEMyX0xDVEwJCQlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNl9fTUxCX01MQlNJRwkJCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDcsIDB4ODYwLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18yX19FU0FJMV9GU1QJCQlJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCAwLCAweDdEMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fR1BJTzFfMgkJCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18yX19LUFBfUk9XXzYJCQlJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCAyLCAweDg1MCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fQ0NNX0NDTV9PVVRfMQkJCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18yX19DU1VfQ1NVX0FMQVJNX0FVVF8wCQlJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDIJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzJfX0VTREhDMl9XUAkJCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18yX19NTEJfTUxCREFUCQkJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgNywgMHg4NUMsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX0VTQUkxX0hDS1QJCQlJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCAwLCAweDdEOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fR1BJTzFfNAkJCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT180X19LUFBfQ09MXzcJCQlJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCAyLCAweDg0OCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fQ0NNX0NDTV9PVVRfMgkJCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT180X19DU1VfQ1NVX0FMQVJNX0FVVF8xCQlJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDMJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX0VTREhDMl9DRAkJCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT180X19TQ0NfU0VDX1NUQVRFCQkJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX0VTQUkxX1RYMl9SWDMJCQlJT01VWF9QQUQoMHg2QzAsIDB4MzMwLCAwLCAweDdFQywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fR1BJTzFfNQkJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT181X19LUFBfUk9XXzcJCQlJT01VWF9QQUQoMHg2QzAsIDB4MzMwLCAyLCAweDg1NCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fQ0NNX0NMS08JCQlJT01VWF9QQUQoMHg2QzAsIDB4MzMwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fQ1NVX0NTVV9BTEFSTV9BVVRfMgkJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQ0CUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT181X19JMkMzX1NDTAkJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDYgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MjQsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX0NDTV9QTEwxX0JZUAkJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDcsIDB4NzcwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT183X19FU0FJMV9UWDRfUlgxCQkJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgMCwgMHg3RjQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0dQSU8xXzcJCQlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fN19fRVBJVDFfRVBJVE8JCQlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fN19fQ0FOMV9UWENBTgkJCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT183X19VQVJUMl9UWERfTVVYCQkJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgNCwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT183X19GSVJJX1JYRAkJCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDUsIDB4ODBDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT183X19TUERJRl9QTE9DSwkJCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT183X19DQ01fUExMMl9CWVAJCQlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCA3LCAweDc3NCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fRVNBSTFfVFg1X1JYMAkJCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDAsIDB4N0Y4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT184X19HUElPMV84CQkJSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzhfX0VQSVQyX0VQSVRPCQkJSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzhfX0NBTjFfUlhDQU4JCQlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCAzLCAweDc2MCwgMywgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fVUFSVDJfUlhEX01VWAkJCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDQsIDB4ODgwLCA1LCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fRklSSV9UWEQJCQlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fU1BESUZfU1JDTEsJCQlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fQ0NNX1BMTDNfQllQCQkJSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgNywgMHg3NzgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19FU0FJMV9UWDNfUlgyCQkJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgMCwgMHg3RjAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19HUElPN18xMQkJCUlPTVVYX1BBRCgweDZDQywgMHgzM0MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xNl9fVFpJQ19QV1JGQUlMX0lOVAkJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19SVENfQ0VfUlRDX0VYVF9UUklHMQkJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19TUERJRl9JTjEJCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCA1LCAweDg3MCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX0kyQzNfU0RBCQkJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgNiB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyOCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX1NKQ19ERV9CCQkJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19FU0FJMV9UWDAJCQlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCAwLCAweDdFNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX0dQSU83XzEyCQkJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19TRE1BX0VYVF9FVkVOVF8wCQlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCAyLCAweDg2OCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX0dQQ19QTUlDX1JEWQkJCUlPTVVYX1BBRCgweDZEMCwgMHgzNDAsIDMsIDB4ODEwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xN19fUlRDX0NFX1JUQ19GU1ZfVFJJRwkJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19TUERJRl9PVVQxCQkJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19JUFVfU05PT1AyCQkJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19TSkNfSlRBR19BQ1QJCQlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMThfX0VTQUkxX1RYMQkJCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDAsIDB4N0U4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fR1BJTzdfMTMJCQlJT01VWF9QQUQoMHg2RDQsIDB4MzQ0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMThfX1NETUFfRVhUX0VWRU5UXzEJCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDIsIDB4ODZDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fT1dJUkVfTElORQkJCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDMsIDB4ODY0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fUlRDX0NFX1JUQ19BTEFSTTJfVFJJRwlJT01VWF9QQUQoMHg2RDQsIDB4MzQ0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMThfX0NDTV9BU1JDX0VYVF9DTEsJCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDUsIDB4NzY4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fRVNESEMxX0xDVEwJCQlJT01VWF9QQUQoMHg2RDQsIDB4MzQ0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMThfX1NSQ19TWVNURU1fUlNUCQlJT01VWF9QQUQoMHg2RDQsIDB4MzQ0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCiAKICNlbmRpZgkvKiBfX01BQ0hfSU9NVVhfTVg1M19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC12My5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LXYzLmgKaW5kZXggZWJiY2UzMy4uMmZhM2I1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LXYzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LXYzLmgKQEAgLTgwLDYgKzgwLDcgQEAKIAkJKChpb211eF92M19jZmdfdCkoX3NlbF9pbnB1dF9vZnMpIDw8IE1VWF9TRUxfSU5QVVRfT0ZTX1NISUZUKSB8IFwKIAkJKChpb211eF92M19jZmdfdCkoX3NlbF9pbnB1dCkgPDwgTVVYX1NFTF9JTlBVVF9TSElGVCkpCiAKKyNkZWZpbmUgTkVXX1BBRF9DVFJMKGNmZywgcGFkKQkoKChjZmcpICYgfk1VWF9QQURfQ1RSTF9NQVNLKSB8IE1VWF9QQURfQ1RSTChwYWQpKQogLyoKICAqIFVzZSB0byBzZXQgUEFEIGNvbnRyb2wKICAqLwpAQCAtODksMTEgKzkwLDExIEBACiAjZGVmaW5lIFBBRF9DVExfSFlTCQkJKDEgPDwgOCkKIAogI2RlZmluZSBQQURfQ1RMX1BLRQkJCSgxIDw8IDcpCi0jZGVmaW5lIFBBRF9DVExfUFVFCQkJKDEgPDwgNikKLSNkZWZpbmUgUEFEX0NUTF9QVVNfMTAwS19ET1dOCQkoMCA8PCA0KQotI2RlZmluZSBQQURfQ1RMX1BVU180N0tfVVAJCSgxIDw8IDQpCi0jZGVmaW5lIFBBRF9DVExfUFVTXzEwMEtfVVAJCSgyIDw8IDQpCi0jZGVmaW5lIFBBRF9DVExfUFVTXzIyS19VUAkJKDMgPDwgNCkKKyNkZWZpbmUgUEFEX0NUTF9QVUUJCQkoMSA8PCA2IHwgUEFEX0NUTF9QS0UpCisjZGVmaW5lIFBBRF9DVExfUFVTXzEwMEtfRE9XTgkJKDAgPDwgNCB8IFBBRF9DVExfUFVFKQorI2RlZmluZSBQQURfQ1RMX1BVU180N0tfVVAJCSgxIDw8IDQgfCBQQURfQ1RMX1BVRSkKKyNkZWZpbmUgUEFEX0NUTF9QVVNfMTAwS19VUAkJKDIgPDwgNCB8IFBBRF9DVExfUFVFKQorI2RlZmluZSBQQURfQ1RMX1BVU18yMktfVVAJCSgzIDw8IDQgfCBQQURfQ1RMX1BVRSkKIAogI2RlZmluZSBQQURfQ1RMX09ERQkJCSgxIDw8IDMpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IDAwZTgxMmIuLmZkOWVmYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtMTQsOSArMTQsMTUgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CiAKIC8qCi0gKiBTb0NzIHdpdGggVFpJQyBpbnRlcnJ1cHQgY29udHJvbGxlciBoYXZlIDEyOCBJUlFzLCB0aG9zZSB3aXRoIEFWSUMgaGF2ZSA2NAorICogU29DcyB3aXRoIEdJQyBpbnRlcnJ1cHQgY29udHJvbGxlciBoYXZlIDE2MCBJUlFzLCB0aG9zZSB3aXRoIFRaSUMKKyAqIGhhdmUgMTI4IElSUXMsIGFuZCB0aG9zZSB3aXRoIEFWSUMgaGF2ZSA2NC4KKyAqCisgKiBUbyBzdXBwb3J0IHNpbmdsZSBpbWFnZSwgdGhlIGJpZ2dlc3QgbnVtYmVyIHNob3VsZCBiZSBkZWZpbmVkIG9uCisgKiB0b3Agb2YgdGhlIGxpc3QuCiAgKi8KLSNpZmRlZiBDT05GSUdfTVhDX1RaSUMKKyNpZiBkZWZpbmVkIENPTkZJR19BUk1fR0lDCisjZGVmaW5lIE1YQ19JTlRFUk5BTF9JUlFTCTE2MAorI2VsaWYgZGVmaW5lZCBDT05GSUdfTVhDX1RaSUMKICNkZWZpbmUgTVhDX0lOVEVSTkFMX0lSUVMJMTI4CiAjZWxzZQogI2RlZmluZSBNWENfSU5URVJOQUxfSVJRUwk2NApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWJlNWNkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19NRU1PUllfSF9fCi0jZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX01FTU9SWV9IX18KLQotI2RlZmluZSBNWDFfUEhZU19PRkZTRVQJCVVMKDB4MDgwMDAwMDApCi0jZGVmaW5lIE1YMjFfUEhZU19PRkZTRVQJVUwoMHhjMDAwMDAwMCkKLSNkZWZpbmUgTVgyNV9QSFlTX09GRlNFVAlVTCgweDgwMDAwMDAwKQotI2RlZmluZSBNWDI3X1BIWVNfT0ZGU0VUCVVMKDB4YTAwMDAwMDApCi0jZGVmaW5lIE1YM3hfUEhZU19PRkZTRVQJVUwoMHg4MDAwMDAwMCkKLSNkZWZpbmUgTVg1MF9QSFlTX09GRlNFVAlVTCgweDcwMDAwMDAwKQotI2RlZmluZSBNWDUxX1BIWVNfT0ZGU0VUCVVMKDB4OTAwMDAwMDApCi0jZGVmaW5lIE1YNTNfUEhZU19PRkZTRVQJVUwoMHg3MDAwMDAwMCkKLQotI2lmICFkZWZpbmVkKENPTkZJR19SVU5USU1FX1BIWVNfT0ZGU0VUKQotIyBpZiBkZWZpbmVkIENPTkZJR19BUkNIX01YMQotIyAgZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCU1YMV9QSFlTX09GRlNFVAotIyBlbGlmIGRlZmluZWQgQ09ORklHX01BQ0hfTVgyMQotIyAgZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCU1YMjFfUEhZU19PRkZTRVQKLSMgZWxpZiBkZWZpbmVkIENPTkZJR19BUkNIX01YMjUKLSMgIGRlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlNWDI1X1BIWVNfT0ZGU0VUCi0jIGVsaWYgZGVmaW5lZCBDT05GSUdfTUFDSF9NWDI3Ci0jICBkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJTVgyN19QSFlTX09GRlNFVAotIyBlbGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgzCi0jICBkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJTVgzeF9QSFlTX09GRlNFVAotIyBlbGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVg1MAotIyAgZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCU1YNTBfUEhZU19PRkZTRVQKLSMgZWxpZiBkZWZpbmVkIENPTkZJR19BUkNIX01YNTEKLSMgIGRlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlNWDUxX1BIWVNfT0ZGU0VUCi0jIGVsaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDUzCi0jICBkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJTVg1M19QSFlTX09GRlNFVAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19NWDNfVklERU8pCi0vKgotICogSW5jcmVhc2Ugc2l6ZSBvZiBETUEtY29uc2lzdGVudCBtZW1vcnkgcmVnaW9uLgotICogVGhpcyBpcyByZXF1aXJlZCBmb3IgbXgzIGNhbWVyYSBkcml2ZXIgdG8gY2FwdHVyZSBhdCBsZWFzdCB0d28gUVhHQSBmcmFtZXMuCi0gKi8KLSNkZWZpbmUgQ09OU0lTVEVOVF9ETUFfU0laRSBTWl84TQotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NWDFfVklERU8pIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPX01YMl9IT1NUU1VQUE9SVCkKLS8qCi0gKiBJbmNyZWFzZSBzaXplIG9mIERNQS1jb25zaXN0ZW50IG1lbW9yeSByZWdpb24uCi0gKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpLk1YIGNhbWVyYSBkcml2ZXIgdG8gY2FwdHVyZSBhdCBsZWFzdCBmb3VyIFZHQSBmcmFtZXMuCi0gKi8KLSNkZWZpbmUgQ09OU0lTVEVOVF9ETUFfU0laRSBTWl80TQotI2VuZGlmIC8qIENPTkZJR19NWDFfVklERU8gfHwgQ09ORklHX1ZJREVPX01YMl9IT1NUU1VQUE9SVCAqLwotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NWENfTUVNT1JZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjUuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI1LmgKaW5kZXggMDg3Y2Q3YS4uY2NlYmY1YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjUuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNS5oCkBAIC00MSw2ICs0MSw3IEBACiAjZGVmaW5lIE1YMjVfU1NJMl9CQVNFX0FERFIJCTB4NTAwMTQwMDAKICNkZWZpbmUgTVgyNV9TU0kxX0JBU0VfQUREUgkJMHg1MDAzNDAwMAogI2RlZmluZSBNWDI1X05GQ19CQVNFX0FERFIJCTB4YmIwMDAwMDAKKyNkZWZpbmUgTVgyNV9JSU1fQkFTRV9BRERSCQkweDUzZmYwMDAwCiAjZGVmaW5lIE1YMjVfRFJZSUNFX0JBU0VfQUREUgkJMHg1M2ZmYzAwMAogI2RlZmluZSBNWDI1X0VTREhDMV9CQVNFX0FERFIJCTB4NTNmYjQwMDAKICNkZWZpbmUgTVgyNV9FU0RIQzJfQkFTRV9BRERSCQkweDUzZmI4MDAwCkBAIC0xMDQsNCArMTA1LDggQEAKICNkZWZpbmUgTVgyNV9ETUFfUkVRX1NTSTFfUlgwCTI4CiAjZGVmaW5lIE1YMjVfRE1BX1JFUV9TU0kxX1RYMAkyOQogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIGludCBteDI1X3JldmlzaW9uKHZvaWQpOworI2VuZGlmCisKICNlbmRpZiAvKiBpZm5kZWYgX19NQUNIX01YMjVfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjcuaAppbmRleCAxZGMxYzUyLi42MjY1MzU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI3LmgKQEAgLTI0LDEwICsyNCw2IEBACiAjaWZuZGVmIF9fTUFDSF9NWDI3X0hfXwogI2RlZmluZSBfX01BQ0hfTVgyN19IX18KIAotI2lmbmRlZiBfX0FTU0VNQkxFUl9fCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNlbmRpZgotCiAjZGVmaW5lIE1YMjdfQUlQSV9CQVNFX0FERFIJCTB4MTAwMDAwMDAKICNkZWZpbmUgTVgyN19BSVBJX1NJWkUJCQlTWl8xTQogI2RlZmluZSBNWDI3X0RNQV9CQVNFX0FERFIJCQkoTVgyN19BSVBJX0JBU0VfQUREUiArIDB4MDEwMDApCkBAIC0xMzEsMTYgKzEyNyw2IEBACiAjZGVmaW5lIE1YMjdfSU9fUDJWKHgpCQkJSU1YX0lPX1AyVih4KQogI2RlZmluZSBNWDI3X0lPX0FERFJFU1MoeCkJCUlPTUVNKE1YMjdfSU9fUDJWKHgpKQogCi0jaWZuZGVmIF9fQVNTRU1CTEVSX18KLXN0YXRpYyBpbmxpbmUgdm9pZCBteDI3X3NldHVwX3dlaW1jcyhzaXplX3QgY3MsCi0JCXVuc2lnbmVkIHVwcGVyLCB1bnNpZ25lZCBsb3dlciwgdW5zaWduZWQgYWRkaW9uYWwpCi17Ci0JX19yYXdfd3JpdGVsKHVwcGVyLCBNWDI3X0lPX0FERFJFU1MoTVgyN19XRUlNX0NTQ1J4VShjcykpKTsKLQlfX3Jhd193cml0ZWwobG93ZXIsIE1YMjdfSU9fQUREUkVTUyhNWDI3X1dFSU1fQ1NDUnhMKGNzKSkpOwotCV9fcmF3X3dyaXRlbChhZGRpb25hbCwgTVgyN19JT19BRERSRVNTKE1YMjdfV0VJTV9DU0NSeEEoY3MpKSk7Ci19Ci0jZW5kaWYKLQogLyogZml4ZWQgaW50ZXJydXB0IG51bWJlcnMgKi8KICNkZWZpbmUgTVgyN19JTlRfSTJDMgkJMQogI2RlZmluZSBNWDI3X0lOVF9HUFQ2CQkyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzMS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzEuaAppbmRleCA3OWU3ZmMwLi5lMjc2MTllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzMS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDMxLmgKQEAgLTEsMTAgKzEsNiBAQAogI2lmbmRlZiBfX01BQ0hfTVgzMV9IX18KICNkZWZpbmUgX19NQUNIX01YMzFfSF9fCiAKLSNpZm5kZWYgX19BU1NFTUJMRVJfXwotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jZW5kaWYKLQogLyoKICAqIElSQU0KICAqLwpAQCAtMTIyLDE2ICsxMTgsNiBAQAogI2RlZmluZSBNWDMxX0lPX1AyVih4KQkJCUlNWF9JT19QMlYoeCkKICNkZWZpbmUgTVgzMV9JT19BRERSRVNTKHgpCQlJT01FTShNWDMxX0lPX1AyVih4KSkKIAotI2lmbmRlZiBfX0FTU0VNQkxFUl9fCi1zdGF0aWMgaW5saW5lIHZvaWQgbXgzMV9zZXR1cF93ZWltY3Moc2l6ZV90IGNzLAotCQl1bnNpZ25lZCB1cHBlciwgdW5zaWduZWQgbG93ZXIsIHVuc2lnbmVkIGFkZGlvbmFsKQotewotCV9fcmF3X3dyaXRlbCh1cHBlciwgTVgzMV9JT19BRERSRVNTKE1YMzFfV0VJTV9DU0NSeFUoY3MpKSk7Ci0JX19yYXdfd3JpdGVsKGxvd2VyLCBNWDMxX0lPX0FERFJFU1MoTVgzMV9XRUlNX0NTQ1J4TChjcykpKTsKLQlfX3Jhd193cml0ZWwoYWRkaW9uYWwsIE1YMzFfSU9fQUREUkVTUyhNWDMxX1dFSU1fQ1NDUnhBKGNzKSkpOwotfQotI2VuZGlmCi0KICNkZWZpbmUgTVgzMV9JTlRfSTJDMwkJMwogI2RlZmluZSBNWDMxX0lOVF9JMkMyCQk0CiAjZGVmaW5lIE1YMzFfSU5UX01QRUc0X0VOQ09ERVIJNQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzUuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDM1LmgKaW5kZXggZDEzZGJmZS4uODA5NjVhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzUuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzNS5oCkBAIC0zNiw3ICszNiw3IEBACiAjZGVmaW5lIE1YMzVfVUFSVDNfQkFTRV9BRERSCQkJKE1YMzVfU1BCQTBfQkFTRV9BRERSICsgMHgwYzAwMCkKICNkZWZpbmUgTVgzNV9DU1BJMl9CQVNFX0FERFIJCQkoTVgzNV9TUEJBMF9CQVNFX0FERFIgKyAweDEwMDAwKQogI2RlZmluZSBNWDM1X1NTSTJfQkFTRV9BRERSCQkJKE1YMzVfU1BCQTBfQkFTRV9BRERSICsgMHgxNDAwMCkKLSNkZWZpbmUgTVgzNV9BVEFfRE1BX0JBU0VfQUREUgkJCShNWDM1X1NQQkEwX0JBU0VfQUREUiArIDB4MjAwMDApCisjZGVmaW5lIE1YMzVfQVRBX0JBU0VfQUREUgkJCShNWDM1X1NQQkEwX0JBU0VfQUREUiArIDB4MjAwMDApCiAjZGVmaW5lIE1YMzVfTVNIQzFfQkFTRV9BRERSCQkJKE1YMzVfU1BCQTBfQkFTRV9BRERSICsgMHgyNDAwMCkKICNkZWZpbmUgTVgzNV9GRUNfQkFTRV9BRERSCQkweDUwMDM4MDAwCiAjZGVmaW5lIE1YMzVfU1BCQV9DVFJMX0JBU0VfQUREUgkJKE1YMzVfU1BCQTBfQkFTRV9BRERSICsgMHgzYzAwMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDN4LmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzeC5oCmluZGV4IDM4OGE0MDcuLjMwZGJmNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDN4LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214M3guaApAQCAtMTg3LDIyICsxODcsOCBAQAogLyogTWFuZGF0b3J5IGRlZmluZXMgdXNlZCBnbG9iYWxseSAqLwogCiAjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKSAmJiAhZGVmaW5lZChfX01YQ19CT09UX1VOQ09NUFJFU1MpCi0KLWV4dGVybiB1bnNpZ25lZCBpbnQgbXgzMV9jcHVfcmV2OwotZXh0ZXJuIHZvaWQgbXgzMV9yZWFkX2NwdV9yZXYodm9pZCk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG14MzFfcmV2aXNpb24odm9pZCkKLXsKLQlyZXR1cm4gbXgzMV9jcHVfcmV2OwotfQotCi1leHRlcm4gdW5zaWduZWQgaW50IG14MzVfY3B1X3JldjsKLWV4dGVybiB2b2lkIG14MzVfcmVhZF9jcHVfcmV2KHZvaWQpOwotCi1zdGF0aWMgaW5saW5lIGludCBteDM1X3JldmlzaW9uKHZvaWQpCi17Ci0JcmV0dXJuIG14MzVfY3B1X3JldjsKLX0KK2V4dGVybiBpbnQgbXgzNV9yZXZpc2lvbih2b2lkKTsKK2V4dGVybiBpbnQgbXgzMV9yZXZpc2lvbih2b2lkKTsKICNlbmRpZgogCiAjZW5kaWYgLyogaWZuZGVmIF9fTUFDSF9NWDN4X0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214NTEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDUxLmgKaW5kZXggZGVkZTE5YS4uY2RmMDdjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214NTEuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXg1MS5oCkBAIC0xOCwxOCArMTgsNiBAQAogI2RlZmluZSBNWDUxX0dQVV9DVFJMX0JBU0VfQUREUgkJMHgzMDAwMDAwMAogI2RlZmluZSBNWDUxX0lQVV9DVFJMX0JBU0VfQUREUgkJMHg0MDAwMDAwMAogCi0jZGVmaW5lIE1YNTFfREVCVUdfQkFTRV9BRERSCQkweDYwMDAwMDAwCi0jZGVmaW5lIE1YNTFfREVCVUdfU0laRQkJCVNaXzFNCi0KLSNkZWZpbmUgTVg1MV9FVEJfQkFTRV9BRERSCQkoTVg1MV9ERUJVR19CQVNFX0FERFIgKyAweDAxMDAwKQotI2RlZmluZSBNWDUxX0VUTV9CQVNFX0FERFIJCShNWDUxX0RFQlVHX0JBU0VfQUREUiArIDB4MDIwMDApCi0jZGVmaW5lIE1YNTFfVFBJVV9CQVNFX0FERFIJCShNWDUxX0RFQlVHX0JBU0VfQUREUiArIDB4MDMwMDApCi0jZGVmaW5lIE1YNTFfQ1RJMF9CQVNFX0FERFIJCShNWDUxX0RFQlVHX0JBU0VfQUREUiArIDB4MDQwMDApCi0jZGVmaW5lIE1YNTFfQ1RJMV9CQVNFX0FERFIJCShNWDUxX0RFQlVHX0JBU0VfQUREUiArIDB4MDUwMDApCi0jZGVmaW5lIE1YNTFfQ1RJMl9CQVNFX0FERFIJCShNWDUxX0RFQlVHX0JBU0VfQUREUiArIDB4MDYwMDApCi0jZGVmaW5lIE1YNTFfQ1RJM19CQVNFX0FERFIJCShNWDUxX0RFQlVHX0JBU0VfQUREUiArIDB4MDcwMDApCi0jZGVmaW5lIE1YNTFfQ09SVEVYX0RCR19CQVNFX0FERFIJKE1YNTFfREVCVUdfQkFTRV9BRERSICsgMHgwODAwMCkKLQogLyoKICAqIFNQQkEgZ2xvYmFsIG1vZHVsZSBlbmFibGVkICMwCiAgKi8KQEAgLTU1LDcgKzQzLDEwIEBACiAjZGVmaW5lIE1YNTFfQUlQUzFfQkFTRV9BRERSCQkweDczZjAwMDAwCiAjZGVmaW5lIE1YNTFfQUlQUzFfU0laRQkJCVNaXzFNCiAKLSNkZWZpbmUgTVg1MV9PVEdfQkFTRV9BRERSCQkoTVg1MV9BSVBTMV9CQVNFX0FERFIgKyAweDgwMDAwKQorI2RlZmluZSBNWDUxX1VTQl9CQVNFX0FERFIJCShNWDUxX0FJUFMxX0JBU0VfQUREUiArIDB4ODAwMDApCisjZGVmaW5lIE1YNTFfVVNCX09UR19CQVNFX0FERFIJCShNWDUxX1VTQl9CQVNFX0FERFIgKyAweDAwMDApCisjZGVmaW5lIE1YNTFfVVNCX0hTMV9CQVNFX0FERFIJCShNWDUxX1VTQl9CQVNFX0FERFIgKyAweDAyMDApCisjZGVmaW5lIE1YNTFfVVNCX0hTMl9CQVNFX0FERFIJCShNWDUxX1VTQl9CQVNFX0FERFIgKyAweDA0MDApCiAjZGVmaW5lIE1YNTFfR1BJTzFfQkFTRV9BRERSCQkoTVg1MV9BSVBTMV9CQVNFX0FERFIgKyAweDg0MDAwKQogI2RlZmluZSBNWDUxX0dQSU8yX0JBU0VfQUREUgkJKE1YNTFfQUlQUzFfQkFTRV9BRERSICsgMHg4ODAwMCkKICNkZWZpbmUgTVg1MV9HUElPM19CQVNFX0FERFIJCShNWDUxX0FJUFMxX0JBU0VfQUREUiArIDB4OGMwMDApCkBAIC0xMzIsNiArMTIzLDcgQEAKIAogI2RlZmluZSBNWDUxX0dQVTJEX0JBU0VfQUREUgkJMHhkMDAwMDAwMAogI2RlZmluZSBNWDUxX1RaSUNfQkFTRV9BRERSCQkweGUwMDAwMDAwCisjZGVmaW5lIE1YNTFfVFpJQ19TSVpFCQkJU1pfMTZLCiAKICNkZWZpbmUgTVg1MV9JT19QMlYoeCkJCQlJTVhfSU9fUDJWKHgpCiAjZGVmaW5lIE1YNTFfSU9fQUREUkVTUyh4KQkJSU9NRU0oTVg1MV9JT19QMlYoeCkpCkBAIC0yNDAsMTE3ICsyMzIsMTE0IEBACiAvKgogICogSW50ZXJydXB0IG51bWJlcnMKICAqLwotI2RlZmluZSBNWDUxX01YQ19JTlRfQkFTRQkJMAotI2RlZmluZSBNWDUxX01YQ19JTlRfUkVTVjAJCTAKKyNkZWZpbmUgTVg1MV9JTlRfQkFTRQkJCTAKKyNkZWZpbmUgTVg1MV9JTlRfUkVTVjAJCQkwCiAjZGVmaW5lIE1YNTFfSU5UX0VTREhDMQkJCTEKICNkZWZpbmUgTVg1MV9JTlRfRVNESEMyCQkJMgogI2RlZmluZSBNWDUxX0lOVF9FU0RIQzMJCQkzCiAjZGVmaW5lIE1YNTFfSU5UX0VTREhDNAkJCTQKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1JFU1Y1CQk1CisjZGVmaW5lIE1YNTFfSU5UX1JFU1Y1CQkJNQogI2RlZmluZSBNWDUxX0lOVF9TRE1BCQkJNgotI2RlZmluZSBNWDUxX01YQ19JTlRfSU9NVVgJCTcKKyNkZWZpbmUgTVg1MV9JTlRfSU9NVVgJCQk3CiAjZGVmaW5lIE1YNTFfSU5UX05GQwkJCTgKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1ZQVQkJOQorI2RlZmluZSBNWDUxX0lOVF9WUFUJCQk5CiAjZGVmaW5lIE1YNTFfSU5UX0lQVV9FUlIJCTEwCiAjZGVmaW5lIE1YNTFfSU5UX0lQVV9TWU4JCTExCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUFUJCTEyCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9SRVNWMTMJCTEzCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9VU0JfSDEJCTE0Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9FTUkJCTE1Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9VU0JfSDIJCTE2Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9VU0JfSDMJCTE3Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9VU0JfT1RHCQkxOAotI2RlZmluZSBNWDUxX01YQ19JTlRfU0FIQVJBX0gwCQkxOQotI2RlZmluZSBNWDUxX01YQ19JTlRfU0FIQVJBX0gxCQkyMAotI2RlZmluZSBNWDUxX01YQ19JTlRfU0NDX1NNTgkJMjEKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NDQ19TVFoJCTIyCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TQ0NfU0NNCQkyMwotI2RlZmluZSBNWDUxX01YQ19JTlRfU1JUQ19OVFoJCTI0Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TUlRDX1RaCQkyNQotI2RlZmluZSBNWDUxX01YQ19JTlRfUlRJQwkJMjYKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0NTVQkJMjcKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NMSU1fQgkJMjgKKyNkZWZpbmUgTVg1MV9JTlRfR1BVCQkJMTIKKyNkZWZpbmUgTVg1MV9JTlRfUkVTVjEzCQkJMTMKKyNkZWZpbmUgTVg1MV9JTlRfVVNCX0hTMQkJMTQKKyNkZWZpbmUgTVg1MV9JTlRfRU1JCQkJMTUKKyNkZWZpbmUgTVg1MV9JTlRfVVNCX0hTMgkJMTYKKyNkZWZpbmUgTVg1MV9JTlRfVVNCX0hTMwkJMTcKKyNkZWZpbmUgTVg1MV9JTlRfVVNCX09URwkJMTgKKyNkZWZpbmUgTVg1MV9JTlRfU0FIQVJBX0gwCQkxOQorI2RlZmluZSBNWDUxX0lOVF9TQUhBUkFfSDEJCTIwCisjZGVmaW5lIE1YNTFfSU5UX1NDQ19TTU4JCTIxCisjZGVmaW5lIE1YNTFfSU5UX1NDQ19TVFoJCTIyCisjZGVmaW5lIE1YNTFfSU5UX1NDQ19TQ00JCTIzCisjZGVmaW5lIE1YNTFfSU5UX1NSVENfTlRaCQkyNAorI2RlZmluZSBNWDUxX0lOVF9TUlRDX1RaCQkyNQorI2RlZmluZSBNWDUxX0lOVF9SVElDCQkJMjYKKyNkZWZpbmUgTVg1MV9JTlRfQ1NVCQkJMjcKKyNkZWZpbmUgTVg1MV9JTlRfU0xJTV9CCQkJMjgKICNkZWZpbmUgTVg1MV9JTlRfU1NJMQkJCTI5CiAjZGVmaW5lIE1YNTFfSU5UX1NTSTIJCQkzMAogI2RlZmluZSBNWDUxX0lOVF9VQVJUMQkJCTMxCiAjZGVmaW5lIE1YNTFfSU5UX1VBUlQyCQkJMzIKICNkZWZpbmUgTVg1MV9JTlRfVUFSVDMJCQkzMwotI2RlZmluZSBNWDUxX01YQ19JTlRfUkVTVjM0CQkzNAotI2RlZmluZSBNWDUxX01YQ19JTlRfUkVTVjM1CQkzNQorI2RlZmluZSBNWDUxX0lOVF9SRVNWMzQJCQkzNAorI2RlZmluZSBNWDUxX0lOVF9SRVNWMzUJCQkzNQogI2RlZmluZSBNWDUxX0lOVF9FQ1NQSTEJCQkzNgogI2RlZmluZSBNWDUxX0lOVF9FQ1NQSTIJCQkzNwogI2RlZmluZSBNWDUxX0lOVF9DU1BJCQkJMzgKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQVAkJMzkKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0VQSVQxCQk0MAotI2RlZmluZSBNWDUxX01YQ19JTlRfRVBJVDIJCTQxCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPMV9JTlQ3CQk0MgotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzFfSU5UNgkJNDMKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU8xX0lOVDUJCTQ0Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPMV9JTlQ0CQk0NQotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzFfSU5UMwkJNDYKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU8xX0lOVDIJCTQ3Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPMV9JTlQxCQk0OAotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzFfSU5UMAkJNDkKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU8xX0xPVwkJNTAKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU8xX0hJR0gJCTUxCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPMl9MT1cJCTUyCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPMl9ISUdICQk1MwotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzNfTE9XCQk1NAotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzNfSElHSAkJNTUKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU80X0xPVwkJNTYKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU80X0hJR0gJCTU3Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9XRE9HMQkJNTgKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1dET0cyCQk1OQorI2RlZmluZSBNWDUxX0lOVF9HUFQJCQkzOQorI2RlZmluZSBNWDUxX0lOVF9FUElUMQkJCTQwCisjZGVmaW5lIE1YNTFfSU5UX0VQSVQyCQkJNDEKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzFfSU5UNwkJNDIKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzFfSU5UNgkJNDMKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzFfSU5UNQkJNDQKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzFfSU5UNAkJNDUKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzFfSU5UMwkJNDYKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzFfSU5UMgkJNDcKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzFfSU5UMQkJNDgKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzFfSU5UMAkJNDkKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzFfTE9XCQk1MAorI2RlZmluZSBNWDUxX0lOVF9HUElPMV9ISUdICQk1MQorI2RlZmluZSBNWDUxX0lOVF9HUElPMl9MT1cJCTUyCisjZGVmaW5lIE1YNTFfSU5UX0dQSU8yX0hJR0gJCTUzCisjZGVmaW5lIE1YNTFfSU5UX0dQSU8zX0xPVwkJNTQKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzNfSElHSAkJNTUKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzRfTE9XCQk1NgorI2RlZmluZSBNWDUxX0lOVF9HUElPNF9ISUdICQk1NworI2RlZmluZSBNWDUxX0lOVF9XRE9HMQkJCTU4CisjZGVmaW5lIE1YNTFfSU5UX1dET0cyCQkJNTkKICNkZWZpbmUgTVg1MV9JTlRfS1BQCQkJNjAKICNkZWZpbmUgTVg1MV9JTlRfUFdNMQkJCTYxCiAjZGVmaW5lIE1YNTFfSU5UX0kyQzEJCQk2MgogI2RlZmluZSBNWDUxX0lOVF9JMkMyCQkJNjMKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0hTX0kyQwkJNjQKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1JFU1Y2NQkJNjUKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1JFU1Y2NgkJNjYKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NJTV9JUEIJCTY3Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TSU1fREFUCQk2OAotI2RlZmluZSBNWDUxX01YQ19JTlRfSUlNCQk2OQotI2RlZmluZSBNWDUxX01YQ19JTlRfQVRBCQk3MAotI2RlZmluZSBNWDUxX01YQ19JTlRfQ0NNMQkJNzEKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0NDTTIJCTcyCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUEMxCQk3MwotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BDMgkJNzQKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NSQwkJNzUKLSNkZWZpbmUgTVg1MV9NWENfSU5UX05NCQkJNzYKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1BNVQkJNzcKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0NUSV9JUlEJCTc4Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9DVEkxX1RHMAkJNzkKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0NUSTFfVEcxCQk4MAotI2RlZmluZSBNWDUxX01YQ19JTlRfTUNHX0VSUgkJODEKLSNkZWZpbmUgTVg1MV9NWENfSU5UX01DR19UTVIJCTgyCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9NQ0dfRlVOQwkJODMKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQVTJfSVJRCQk4NAotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BVMl9CVVNZCQk4NQotI2RlZmluZSBNWDUxX01YQ19JTlRfUkVTVjg2CQk4NgorI2RlZmluZSBNWDUxX0lOVF9IU19JMkMJCQk2NAorI2RlZmluZSBNWDUxX0lOVF9SRVNWNjUJCQk2NQorI2RlZmluZSBNWDUxX0lOVF9SRVNWNjYJCQk2NgorI2RlZmluZSBNWDUxX0lOVF9TSU1fSVBCCQk2NworI2RlZmluZSBNWDUxX0lOVF9TSU1fREFUCQk2OAorI2RlZmluZSBNWDUxX0lOVF9JSU0JCQk2OQorI2RlZmluZSBNWDUxX0lOVF9BVEEJCQk3MAorI2RlZmluZSBNWDUxX0lOVF9DQ00xCQkJNzEKKyNkZWZpbmUgTVg1MV9JTlRfQ0NNMgkJCTcyCisjZGVmaW5lIE1YNTFfSU5UX0dQQzEJCQkJNzMKKyNkZWZpbmUgTVg1MV9JTlRfR1BDMgkJCTc0CisjZGVmaW5lIE1YNTFfSU5UX1NSQwkJCTc1CisjZGVmaW5lIE1YNTFfSU5UX05NCQkJNzYKKyNkZWZpbmUgTVg1MV9JTlRfUE1VCQkJNzcKKyNkZWZpbmUgTVg1MV9JTlRfQ1RJX0lSUQkJNzgKKyNkZWZpbmUgTVg1MV9JTlRfQ1RJMV9URzAJCTc5CisjZGVmaW5lIE1YNTFfSU5UX0NUSTFfVEcxCQk4MAorI2RlZmluZSBNWDUxX0lOVF9NQ0dfRVJSCQk4MQorI2RlZmluZSBNWDUxX0lOVF9NQ0dfVE1SCQk4MgorI2RlZmluZSBNWDUxX0lOVF9NQ0dfRlVOQwkJODMKKyNkZWZpbmUgTVg1MV9JTlRfR1BVMl9JUlEJCTg0CisjZGVmaW5lIE1YNTFfSU5UX0dQVTJfQlVTWQkJODUKKyNkZWZpbmUgTVg1MV9JTlRfUkVTVjg2CQkJODYKICNkZWZpbmUgTVg1MV9JTlRfRkVDCQkJODcKLSNkZWZpbmUgTVg1MV9NWENfSU5UX09XSVJFCQk4OAotI2RlZmluZSBNWDUxX01YQ19JTlRfQ1RJMV9URzIJCTg5Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TSkMJCTkwCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TUERJRgkJOTEKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1RWRQkJOTIKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0ZJUkkJCTkzCisjZGVmaW5lIE1YNTFfSU5UX09XSVJFCQkJODgKKyNkZWZpbmUgTVg1MV9JTlRfQ1RJMV9URzIJCTg5CisjZGVmaW5lIE1YNTFfSU5UX1NKQwkJCTkwCisjZGVmaW5lIE1YNTFfSU5UX1NQRElGCQkJOTEKKyNkZWZpbmUgTVg1MV9JTlRfVFZFCQkJOTIKKyNkZWZpbmUgTVg1MV9JTlRfRklSSQkJCTkzCiAjZGVmaW5lIE1YNTFfSU5UX1BXTTIJCQk5NAotI2RlZmluZSBNWDUxX01YQ19JTlRfU0xJTV9FWFAJCTk1CisjZGVmaW5lIE1YNTFfSU5UX1NMSU1fRVhQCQk5NQogI2RlZmluZSBNWDUxX0lOVF9TU0kzCQkJOTYKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0VNSV9CT09UCQk5NwotI2RlZmluZSBNWDUxX01YQ19JTlRfQ1RJMV9URzMJCTk4Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TTUNfUlgJCTk5Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9WUFVfSURMRQkJMTAwCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9FTUlfTkZDCQkxMDEKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQVV9JRExFCQkxMDIKKyNkZWZpbmUgTVg1MV9JTlRfRU1JX0JPT1QJCTk3CisjZGVmaW5lIE1YNTFfSU5UX0NUSTFfVEczCQk5OAorI2RlZmluZSBNWDUxX0lOVF9TTUNfUlgJCQk5OQorI2RlZmluZSBNWDUxX0lOVF9WUFVfSURMRQkJMTAwCisjZGVmaW5lIE1YNTFfSU5UX0VNSV9ORkMJCTEwMQorI2RlZmluZSBNWDUxX0lOVF9HUFVfSURMRQkJMTAyCiAKICNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pICYmICFkZWZpbmVkKF9fTVhDX0JPT1RfVU5DT01QUkVTUykKIGV4dGVybiBpbnQgbXg1MV9yZXZpc2lvbih2b2lkKTsKIGV4dGVybiB2b2lkIG14NTFfZGlzcGxheV9yZXZpc2lvbih2b2lkKTsKICNlbmRpZgogCi0vKiB0YXBlLW91dCAxIGRlZmluZXMgKi8KLSNkZWZpbmUgTVg1MV9UWklDX0JBU0VfQUREUl9UTzEJCTB4OGZmZmMwMDAKLQogI2VuZGlmCS8qIGlmbmRlZiBfX01BQ0hfTVg1MV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDUzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXg1My5oCmluZGV4IDVlM2MzMjMuLmEzN2U4YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDUzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214NTMuaApAQCAtOSw2ICs5LDcgQEAKIAogLyogVFpJQyAqLwogI2RlZmluZSBNWDUzX1RaSUNfQkFTRV9BRERSCQkweDBGRkZDMDAwCisjZGVmaW5lIE1YNTNfVFpJQ19TSVpFCQkJU1pfMTZLCiAKIC8qCiAgKiBBSENJIFNBVEEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDZxLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXg2cS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NGE1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXg2cS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpZm5kZWYgX19NQUNIX01YNlFfSF9fCisjZGVmaW5lIF9fTUFDSF9NWDZRX0hfXworCisjZGVmaW5lIE1YNlFfSU9fUDJWKHgpCQkJSU1YX0lPX1AyVih4KQorI2RlZmluZSBNWDZRX0lPX0FERFJFU1MoeCkJCUlPTUVNKE1YNlFfSU9fUDJWKHgpKQorCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIGJsb2NrcyB0aGF0IG5lZWQgdG8gYmUgc3RhdGljYWxseSBtYXBwZWQuCisgKiBGb3Igb3RoZXIgYmxvY2tzLCB0aGUgYmFzZSBhZGRyZXNzIHJlYWxseSBzaG91bGQgYmUgcmV0cmlldmVkIGZyb20KKyAqIGRldmljZSB0cmVlLgorICovCisjZGVmaW5lIE1YNlFfU0NVX0JBU0VfQUREUgkJMHgwMGEwMDAwMAorI2RlZmluZSBNWDZRX1NDVV9TSVpFCQkJMHgxMDAwCisjZGVmaW5lIE1YNlFfQ0NNX0JBU0VfQUREUgkJMHgwMjBjNDAwMAorI2RlZmluZSBNWDZRX0NDTV9TSVpFCQkJMHg0MDAwCisjZGVmaW5lIE1YNlFfQU5BVE9QX0JBU0VfQUREUgkJMHgwMjBjODAwMAorI2RlZmluZSBNWDZRX0FOQVRPUF9TSVpFCQkweDEwMDAKKyNkZWZpbmUgTVg2UV9VQVJUNF9CQVNFX0FERFIJCTB4MDIxZjAwMDAKKyNkZWZpbmUgTVg2UV9VQVJUNF9TSVpFCQkJMHg0MDAwCisKKyNlbmRpZgkvKiBfX01BQ0hfTVg2UV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGMuaAppbmRleCAwOTg3OTIzLi4wMGE3ODE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXhjLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Yy5oCkBAIC0xODMsMTMgKzE4Myw2IEBACiB9OwogCiBpbnQgdHppY19lbmFibGVfd2FrZShpbnQgaXNfaWRsZSk7Ci1lbnVtIG14Y19jcHVfcHdyX21vZGUgewotCVdBSVRfQ0xPQ0tFRCwJCS8qIHdmaSBvbmx5ICovCi0JV0FJVF9VTkNMT0NLRUQsCQkvKiBXQUlUICovCi0JV0FJVF9VTkNMT0NLRURfUE9XRVJfT0ZGLAkvKiBXQUlUICsgU1JQRyAqLwotCVNUT1BfUE9XRVJfT04sCQkvKiBqdXN0IFNUT1AgKi8KLQlTVE9QX1BPV0VSX09GRiwJCS8qIFNUT1AgKyBTUlBHICovCi19OwogCiBleHRlcm4gc3RydWN0IGNwdV9vcCAqKCpnZXRfY3B1X29wKShpbnQgKm9wKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmluZGV4IDUxZjAyYTkuLmNmODhiMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvc3lzdGVtLmgKQEAgLTE3LDQxICsxNywxMiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19TWVNURU1fSF9fCiAjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX1NZU1RFTV9IX18KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotCi1leHRlcm4gdm9pZCBteDVfY3B1X2xwX3NldChlbnVtIG14Y19jcHVfcHdyX21vZGUgbW9kZSk7CitleHRlcm4gdm9pZCAoKmlteF9pZGxlKSh2b2lkKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQogewotCS8qIGZpeCBpLk1YMzEgZXJyYXRhIFRMU2JvNjU5NTMgYW5kIGkuTVgzNSBlcnJhdGEgRU5HY20wOTQ3MiAqLwotCWlmIChjcHVfaXNfbXgzMSgpIHx8IGNwdV9pc19teDM1KCkpIHsKLQkJdW5zaWduZWQgbG9uZyByZWcgPSAwOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCS8qIGRpc2FibGUgSSBhbmQgRCBjYWNoZSAqLwotCQkJIm1yYyBwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKLQkJCSJiaWMgJTAsICUwLCAjMHgwMDAwMTAwMFxuIgotCQkJImJpYyAlMCwgJTAsICMweDAwMDAwMDA0XG4iCi0JCQkibWNyIHAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgotCQkJLyogaW52YWxpZGF0ZSBJIGNhY2hlICovCi0JCQkibW92ICUwLCAjMFxuIgotCQkJIm1jciBwMTUsIDAsICUwLCBjNywgYzUsIDBcbiIKLQkJCS8qIGNsZWFyIGFuZCBpbnZhbGlkYXRlIEQgY2FjaGUgKi8KLQkJCSJtb3YgJTAsICMwXG4iCi0JCQkibWNyIHAxNSwgMCwgJTAsIGM3LCBjMTQsIDBcbiIKLQkJCS8qIFdGSSAqLwotCQkJIm1vdiAlMCwgIzBcbiIKLQkJCSJtY3IgcDE1LCAwLCAlMCwgYzcsIGMwLCA0XG4iCi0JCQkibm9wXG4iICJub3BcbiIgIm5vcFxuIiAibm9wXG4iCi0JCQkibm9wXG4iICJub3BcbiIgIm5vcFxuIgotCQkJLyogZW5hYmxlIEkgYW5kIEQgY2FjaGUgKi8KLQkJCSJtcmMgcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCi0JCQkib3JyICUwLCAlMCwgIzB4MDAwMDEwMDBcbiIKLQkJCSJvcnIgJTAsICUwLCAjMHgwMDAwMDAwNFxuIgotCQkJIm1jciBwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKLQkJCTogIj1yIiAocmVnKSk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfbXg1MSgpKQotCQlteDVfY3B1X2xwX3NldChXQUlUX1VOQ0xPQ0tFRF9QT1dFUl9PRkYpOworCWlmIChpbXhfaWRsZSAhPSBOVUxMKQorCQkoaW14X2lkbGUpKCk7CiAJZWxzZQogCQljcHVfZG9faWRsZSgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaXJxLWNvbW1vbi5jIGIvYXJjaC9hcm0vcGxhdC1teGMvaXJxLWNvbW1vbi5jCmluZGV4IDk2OTUzZTIuLmI2ZTExNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2lycS1jb21tb24uYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pcnEtY29tbW9uLmMKQEAgLTIzLDE3ICsyMywxNyBAQAogCiBpbnQgaW14X2lycV9zZXRfcHJpb3JpdHkodW5zaWduZWQgY2hhciBpcnEsIHVuc2lnbmVkIGNoYXIgcHJpbykKIHsKLQlzdHJ1Y3QgbXhjX2lycV9jaGlwICpjaGlwOwotCXN0cnVjdCBpcnFfY2hpcCAqYmFzZTsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJc3RydWN0IG14Y19leHRyYV9pcnEgKmV4aXJxOwogCWludCByZXQ7CiAKIAlyZXQgPSAtRU5PU1lTOwogCi0JYmFzZSA9IGlycV9nZXRfY2hpcChpcnEpOwotCWlmIChiYXNlKSB7Ci0JCWNoaXAgPSBjb250YWluZXJfb2YoYmFzZSwgc3RydWN0IG14Y19pcnFfY2hpcCwgYmFzZSk7Ci0JCWlmIChjaGlwLT5zZXRfcHJpb3JpdHkpCi0JCQlyZXQgPSBjaGlwLT5zZXRfcHJpb3JpdHkoaXJxLCBwcmlvKTsKKwlnYyA9IGlycV9nZXRfY2hpcF9kYXRhKGlycSk7CisJaWYgKGdjICYmIGdjLT5wcml2YXRlKSB7CisJCWV4aXJxID0gZ2MtPnByaXZhdGU7CisJCWlmIChleGlycS0+c2V0X3ByaW9yaXR5KQorCQkJcmV0ID0gZXhpcnEtPnNldF9wcmlvcml0eShpcnEsIHByaW8pOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC00MywxNSArNDMsMTYgQEAKIGludCBteGNfc2V0X2lycV9maXEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCiB7CiAJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOwotCWludCAoKnNldF9pcnFfZmlxKSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisJc3RydWN0IG14Y19leHRyYV9pcnEgKmV4aXJxOwogCWludCByZXQ7CiAKIAlyZXQgPSAtRU5PU1lTOwogCiAJZ2MgPSBpcnFfZ2V0X2NoaXBfZGF0YShpcnEpOwogCWlmIChnYyAmJiBnYy0+cHJpdmF0ZSkgewotCQlzZXRfaXJxX2ZpcSA9IGdjLT5wcml2YXRlOwotCQlyZXQgPSBzZXRfaXJxX2ZpcShpcnEsIHR5cGUpOworCQlleGlycSA9IGdjLT5wcml2YXRlOworCQlpZiAoZXhpcnEtPnNldF9pcnFfZmlxKQorCQkJcmV0ID0gZXhpcnEtPnNldF9pcnFfZmlxKGlycSwgdHlwZSk7CiAJfQogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2lycS1jb21tb24uaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2lycS1jb21tb24uaAppbmRleCA3MjAzNTQzLi42Y2NiM2ExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pcnEtY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaXJxLWNvbW1vbi5oCkBAIC0xOSw5ICsxOSw4IEBACiAjaWZuZGVmIF9fUExBVF9NWENfSVJRX0NPTU1PTl9IX18KICNkZWZpbmUgX19QTEFUX01YQ19JUlFfQ09NTU9OX0hfXwogCi1zdHJ1Y3QgbXhjX2lycV9jaGlwCitzdHJ1Y3QgbXhjX2V4dHJhX2lycQogewotCXN0cnVjdCBpcnFfY2hpcAliYXNlOwogCWludCAoKnNldF9wcmlvcml0eSkodW5zaWduZWQgY2hhciBpcnEsIHVuc2lnbmVkIGNoYXIgcHJpbyk7CiAJaW50ICgqc2V0X2lycV9maXEpKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9wd20uYyBiL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jCmluZGV4IDc2MWMzYzkuLjQyZDc0ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJaWYgKHB3bSA9PSBOVUxMIHx8IHBlcmlvZF9ucyA9PSAwIHx8IGR1dHlfbnMgPiBwZXJpb2RfbnMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNwdV9pc19teDI3KCkgfHwgY3B1X2lzX214MygpIHx8IGNwdV9pc19teDI1KCkgfHwgY3B1X2lzX214NTEoKSkgeworCWlmICghKGNwdV9pc19teDEoKSB8fCBjcHVfaXNfbXgyMSgpKSkgewogCQl1bnNpZ25lZCBsb25nIGxvbmcgYzsKIAkJdW5zaWduZWQgbG9uZyBwZXJpb2RfY3ljbGVzLCBkdXR5X2N5Y2xlcywgcHJlc2NhbGU7CiAJCXUzMiBjcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL3N5c3RlbS5jIGIvYXJjaC9hcm0vcGxhdC1teGMvc3lzdGVtLmMKaW5kZXggODAyNGYyYS4uOWRhZDhkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvc3lzdGVtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvc3lzdGVtLmMKQEAgLTI4LDYgKzI4LDkgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAordm9pZCAoKmlteF9pZGxlKSh2b2lkKSA9IE5VTEw7Cit2b2lkIF9faW9tZW0gKigqaW14X2lvcmVtYXApKHVuc2lnbmVkIGxvbmcsIHNpemVfdCwgdW5zaWduZWQgaW50KSA9IE5VTEw7CisKIHN0YXRpYyB2b2lkIF9faW9tZW0gKndkb2dfYmFzZTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL3R6aWMuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL3R6aWMuYwppbmRleCBmMjU3ZmNjLi5hM2MxNjRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy90emljLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvdHppYy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb24uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgpAQCAtNDIsNyArNDMsNyBAQAogI2RlZmluZSBUWklDX1NSQ0NMQVIwCTB4MDI4MAkvKiBTb3VyY2UgQ2xlYXIgUmVnaXN0ZXIgMCAqLwogI2RlZmluZSBUWklDX1BSSU9SSVRZMAkweDA0MDAJLyogUHJpb3JpdHkgUmVnaXN0ZXIgMCAqLwogI2RlZmluZSBUWklDX1BORDAJMHgwRDAwCS8qIFBlbmRpbmcgUmVnaXN0ZXIgMCAqLwotI2RlZmluZSBUWklDX0hJUE5EMAkweDBEODAJLyogSGlnaCBQcmlvcml0eSBQZW5kaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIFRaSUNfSElQTkQoaSkJKDB4MEQ4MCsgKChpKSA8PCAyKSkJLyogSGlnaCBQcmlvcml0eSBQZW5kaW5nIFJlZ2lzdGVyICovCiAjZGVmaW5lIFRaSUNfV0FLRVVQMChpKQkoMHgwRTAwICsgKChpKSA8PCAyKSkJLyogV2FrZXVwIENvbmZpZyBSZWdpc3RlciAqLwogI2RlZmluZSBUWklDX1NXSU5UCTB4MEYwMAkvKiBTb2Z0d2FyZSBJbnRlcnJ1cHQgUmlnZ2VyIFJlZ2lzdGVyICovCiAjZGVmaW5lIFRaSUNfSUQwCTB4MEZEMAkvKiBJbmRlbnRpZmljYXRpb24gUmVnaXN0ZXIgMCAqLwpAQCAtNzQsNiArNzUsMTIgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCAqd2FrZXVwX2ludHJbNF07CiAKK3N0YXRpYyBzdHJ1Y3QgbXhjX2V4dHJhX2lycSB0emljX2V4dHJhX2lycSA9IHsKKyNpZmRlZiBDT05GSUdfRklRCisJLnNldF9pcnFfZmlxID0gdHppY19zZXRfaXJxX2ZpcSwKKyNlbmRpZgorfTsKKwogc3RhdGljIF9faW5pdCB2b2lkIHR6aWNfaW5pdF9nYyh1bnNpZ25lZCBpbnQgaXJxX3N0YXJ0KQogewogCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKQEAgLTgyLDcgKzg5LDcgQEAKIAogCWdjID0gaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCgidHppYyIsIDEsIGlycV9zdGFydCwgdHppY19iYXNlLAogCQkJCSAgICBoYW5kbGVfbGV2ZWxfaXJxKTsKLQlnYy0+cHJpdmF0ZSA9IHR6aWNfc2V0X2lycV9maXE7CisJZ2MtPnByaXZhdGUgPSAmdHppY19leHRyYV9pcnE7CiAJZ2MtPndha2VfZW5hYmxlZCA9IElSUV9NU0soMzIpOwogCXdha2V1cF9pbnRyW2lkeF0gPSAmZ2MtPndha2VfYWN0aXZlOwogCkBAIC05Niw2ICsxMDMsMjggQEAKIAlpcnFfc2V0dXBfZ2VuZXJpY19jaGlwKGdjLCBJUlFfTVNLKDMyKSwgMCwgSVJRX05PUkVRVUVTVCwgMCk7CiB9CiAKK2FzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgdHppY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBzdGF0OworCWludCBpLCBpcnFvZnMsIGhhbmRsZWQ7CisKKwlkbyB7CisJCWhhbmRsZWQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXN0YXQgPSBfX3Jhd19yZWFkbCh0emljX2Jhc2UgKyBUWklDX0hJUE5EKGkpKSAmCisJCQkJX19yYXdfcmVhZGwodHppY19iYXNlICsgVFpJQ19JTlRTRUMwKGkpKTsKKworCQkJd2hpbGUgKHN0YXQpIHsKKwkJCQloYW5kbGVkID0gMTsKKwkJCQlpcnFvZnMgPSBmbHMoc3RhdCkgLSAxOworCQkJCWhhbmRsZV9JUlEoaXJxb2ZzICsgaSAqIDMyLCByZWdzKTsKKwkJCQlzdGF0ICY9IH4oMSA8PCBpcnFvZnMpOworCQkJfQorCQl9CisJfSB3aGlsZSAoaGFuZGxlZCk7Cit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBUWklDIGhhcmR3YXJlIGFuZCBkaXNhYmxlcyBhbGwgdGhlCiAgKiBpbnRlcnJ1cHRzLiBJdCByZWdpc3RlcnMgdGhlIGludGVycnVwdCBlbmFibGUgYW5kIGRpc2FibGUgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9LY29uZmlnCmluZGV4IGNlNjU5MDEuLmJjYTQ5MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9LY29uZmlnCkBAIC0xNSwxMCArMTUsMTYgQEAKIAogY29uZmlnIEhBU19NVFUKIAlib29sCi0Jc2VsZWN0IEhBVkVfU0NIRURfQ0xPQ0sKIAloZWxwCiAJICBTdXBwb3J0IGZvciBNdWx0aSBUaW1lciBVbml0LiBNVFUgcHJvdmlkZXMgYWNjZXNzCiAJICB0byBtdWx0aXBsZSBpbnRlcnJ1cHQgZ2VuZXJhdGluZyBwcm9ncmFtbWFibGUKIAkgIDMyLWJpdCBmcmVlIHJ1bm5pbmcgZGVjcmVtZW50aW5nIGNvdW50ZXJzLgogCitjb25maWcgTk9NQURJS19NVFVfU0NIRURfQ0xPQ0sKKwlib29sCisJZGVwZW5kcyBvbiBIQVNfTVRVCisJc2VsZWN0IEhBVkVfU0NIRURfQ0xPQ0sKKwloZWxwCisJICBVc2UgdGhlIE11bHRpIFRpbWVyIFVuaXQgYXMgdGhlIHNjaGVkX2Nsb2NrLgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLW5vbWFkaWsuaCBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvZ3Bpby1ub21hZGlrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwNWJmMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvZ3Bpby1ub21hZGlrLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIFN0cnVjdHVyZXMgYW5kIHJlZ2lzdGVycyBmb3IgR1BJTyBhY2Nlc3MgaW4gdGhlIE5vbWFkaWsgU29DCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNUTWljcm9lbGVjdHJvbmljcworICogICAgIEF1dGhvcjogUHJhZnVsbGEgV0FEQVNLQVIgPHByYWZ1bGxhLndhZGFza2FyQHN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBBbGVzc2FuZHJvIFJ1YmluaSA8cnViaW5pQHVuaXB2Lml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX1BMQVRfTk9NQURJS19HUElPCisjZGVmaW5lIF9fUExBVF9OT01BRElLX0dQSU8KKworLyoKKyAqICJubWtfZ3BpbyIgYW5kICJOTUtfR1BJTyIgc3RhbmQgZm9yICJOb21hZGlrIEdQSU8iLCBsZWF2aW5nCisgKiB0aGUgImdwaW8iIG5hbWVzcGFjZSBmb3IgZ2VuZXJpYyBhbmQgY3Jvc3MtbWFjaGluZSBmdW5jdGlvbnMKKyAqLworCisvKiBSZWdpc3RlciBpbiB0aGUgbG9naWMgYmxvY2sgKi8KKyNkZWZpbmUgTk1LX0dQSU9fREFUCTB4MDAKKyNkZWZpbmUgTk1LX0dQSU9fREFUUwkweDA0CisjZGVmaW5lIE5NS19HUElPX0RBVEMJMHgwOAorI2RlZmluZSBOTUtfR1BJT19QRElTCTB4MGMKKyNkZWZpbmUgTk1LX0dQSU9fRElSCTB4MTAKKyNkZWZpbmUgTk1LX0dQSU9fRElSUwkweDE0CisjZGVmaW5lIE5NS19HUElPX0RJUkMJMHgxOAorI2RlZmluZSBOTUtfR1BJT19TTFBDCTB4MWMKKyNkZWZpbmUgTk1LX0dQSU9fQUZTTEEJMHgyMAorI2RlZmluZSBOTUtfR1BJT19BRlNMQgkweDI0CisKKyNkZWZpbmUgTk1LX0dQSU9fUklNU0MJMHg0MAorI2RlZmluZSBOTUtfR1BJT19GSU1TQwkweDQ0CisjZGVmaW5lIE5NS19HUElPX0lTCTB4NDgKKyNkZWZpbmUgTk1LX0dQSU9fSUMJMHg0YworI2RlZmluZSBOTUtfR1BJT19SV0lNU0MJMHg1MAorI2RlZmluZSBOTUtfR1BJT19GV0lNU0MJMHg1NAorI2RlZmluZSBOTUtfR1BJT19XS1MJMHg1OAorCisvKiBBbHRlcm5hdGUgZnVuY3Rpb25zOiBmdW5jdGlvbiBDIGlzIHNldCBpbiBodyBieSBzZXR0aW5nIGJvdGggQSBhbmQgQiAqLworI2RlZmluZSBOTUtfR1BJT19BTFRfR1BJTwkwCisjZGVmaW5lIE5NS19HUElPX0FMVF9BCTEKKyNkZWZpbmUgTk1LX0dQSU9fQUxUX0IJMgorI2RlZmluZSBOTUtfR1BJT19BTFRfQwkoTk1LX0dQSU9fQUxUX0EgfCBOTUtfR1BJT19BTFRfQikKKworLyogUHVsbCB1cC9kb3duIHZhbHVlcyAqLworZW51bSBubWtfZ3Bpb19wdWxsIHsKKwlOTUtfR1BJT19QVUxMX05PTkUsCisJTk1LX0dQSU9fUFVMTF9VUCwKKwlOTUtfR1BJT19QVUxMX0RPV04sCit9OworCisvKiBTbGVlcCBtb2RlICovCitlbnVtIG5ta19ncGlvX3NscG0geworCU5NS19HUElPX1NMUE1fSU5QVVQsCisJTk1LX0dQSU9fU0xQTV9XQUtFVVBfRU5BQkxFID0gTk1LX0dQSU9fU0xQTV9JTlBVVCwKKwlOTUtfR1BJT19TTFBNX05PQ0hBTkdFLAorCU5NS19HUElPX1NMUE1fV0FLRVVQX0RJU0FCTEUgPSBOTUtfR1BJT19TTFBNX05PQ0hBTkdFLAorfTsKKworZXh0ZXJuIGludCBubWtfZ3Bpb19zZXRfc2xwbShpbnQgZ3BpbywgZW51bSBubWtfZ3Bpb19zbHBtIG1vZGUpOworZXh0ZXJuIGludCBubWtfZ3Bpb19zZXRfcHVsbChpbnQgZ3BpbywgZW51bSBubWtfZ3Bpb19wdWxsIHB1bGwpOworZXh0ZXJuIGludCBubWtfZ3Bpb19zZXRfbW9kZShpbnQgZ3BpbywgaW50IGdwaW9fbW9kZSk7CitleHRlcm4gaW50IG5ta19ncGlvX2dldF9tb2RlKGludCBncGlvKTsKKworZXh0ZXJuIHZvaWQgbm1rX2dwaW9fd2FrZXVwc19zdXNwZW5kKHZvaWQpOworZXh0ZXJuIHZvaWQgbm1rX2dwaW9fd2FrZXVwc19yZXN1bWUodm9pZCk7CisKK2V4dGVybiB2b2lkIG5ta19ncGlvX2Nsb2Nrc19lbmFibGUodm9pZCk7CitleHRlcm4gdm9pZCBubWtfZ3Bpb19jbG9ja3NfZGlzYWJsZSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgbm1rX2dwaW9fcmVhZF9wdWxsKGludCBncGlvX2JhbmssIHUzMiAqcHVsbF91cCk7CisKKy8qCisgKiBQbGF0Zm9ybSBkYXRhIHRvIHJlZ2lzdGVyIGEgYmxvY2s6IG9ubHkgdGhlIGluaXRpYWwgZ3Bpby9pcnEgbnVtYmVyLgorICovCitzdHJ1Y3Qgbm1rX2dwaW9fcGxhdGZvcm1fZGF0YSB7CisJY2hhciAqbmFtZTsKKwlpbnQgZmlyc3RfZ3BpbzsKKwlpbnQgZmlyc3RfaXJxOworCWludCBudW1fZ3BpbzsKKwl1MzIgKCpnZXRfc2Vjb25kYXJ5X3N0YXR1cykodW5zaWduZWQgaW50IGJhbmspOworCXZvaWQgKCpzZXRfaW9mb3JjZSkoYm9vbCBlbmFibGUpOworCWJvb2wgc3VwcG9ydHNfc2xlZXBtb2RlOworfTsKKworI2VuZGlmIC8qIF9fUExBVF9OT01BRElLX0dQSU8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvZ3Bpby5oIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZDdlNjUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogU3RydWN0dXJlcyBhbmQgcmVnaXN0ZXJzIGZvciBHUElPIGFjY2VzcyBpbiB0aGUgTm9tYWRpayBTb0MKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggU1RNaWNyb2VsZWN0cm9uaWNzCi0gKiAgICAgQXV0aG9yOiBQcmFmdWxsYSBXQURBU0tBUiA8cHJhZnVsbGEud2FkYXNrYXJAc3QuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA5IEFsZXNzYW5kcm8gUnViaW5pIDxydWJpbmlAdW5pcHYuaXQ+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2lmbmRlZiBfX0FTTV9QTEFUX0dQSU9fSAotI2RlZmluZSBfX0FTTV9QTEFUX0dQSU9fSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0vKgotICogVGhlc2UgY3VycmVudGx5IGNhdXNlIGEgZnVuY3Rpb24gY2FsbCB0byBoYXBwZW4sIHRoZXkgbWF5IGJlIG9wdGltaXplZAotICogaWYgbmVlZGVkIGJ5IGFkZGluZyBjcHUtc3BlY2lmaWMgZGVmaW5lcyB0byBpZGVudGlmeSBibG9ja3MKLSAqIChzZWUgbWFjaC1weGEvaW5jbHVkZS9tYWNoL2dwaW8uaCBhcyBhbiBleGFtcGxlIHVzaW5nIEdQTFIgZXRjKQotICovCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlICBfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlICBfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAgICBfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEgICAgIF9fZ3Bpb190b19pcnEKLQotLyoKLSAqICJubWtfZ3BpbyIgYW5kICJOTUtfR1BJTyIgc3RhbmQgZm9yICJOb21hZGlrIEdQSU8iLCBsZWF2aW5nCi0gKiB0aGUgImdwaW8iIG5hbWVzcGFjZSBmb3IgZ2VuZXJpYyBhbmQgY3Jvc3MtbWFjaGluZSBmdW5jdGlvbnMKLSAqLwotCi0vKiBSZWdpc3RlciBpbiB0aGUgbG9naWMgYmxvY2sgKi8KLSNkZWZpbmUgTk1LX0dQSU9fREFUCTB4MDAKLSNkZWZpbmUgTk1LX0dQSU9fREFUUwkweDA0Ci0jZGVmaW5lIE5NS19HUElPX0RBVEMJMHgwOAotI2RlZmluZSBOTUtfR1BJT19QRElTCTB4MGMKLSNkZWZpbmUgTk1LX0dQSU9fRElSCTB4MTAKLSNkZWZpbmUgTk1LX0dQSU9fRElSUwkweDE0Ci0jZGVmaW5lIE5NS19HUElPX0RJUkMJMHgxOAotI2RlZmluZSBOTUtfR1BJT19TTFBDCTB4MWMKLSNkZWZpbmUgTk1LX0dQSU9fQUZTTEEJMHgyMAotI2RlZmluZSBOTUtfR1BJT19BRlNMQgkweDI0Ci0KLSNkZWZpbmUgTk1LX0dQSU9fUklNU0MJMHg0MAotI2RlZmluZSBOTUtfR1BJT19GSU1TQwkweDQ0Ci0jZGVmaW5lIE5NS19HUElPX0lTCTB4NDgKLSNkZWZpbmUgTk1LX0dQSU9fSUMJMHg0YwotI2RlZmluZSBOTUtfR1BJT19SV0lNU0MJMHg1MAotI2RlZmluZSBOTUtfR1BJT19GV0lNU0MJMHg1NAotI2RlZmluZSBOTUtfR1BJT19XS1MJMHg1OAotCi0vKiBBbHRlcm5hdGUgZnVuY3Rpb25zOiBmdW5jdGlvbiBDIGlzIHNldCBpbiBodyBieSBzZXR0aW5nIGJvdGggQSBhbmQgQiAqLwotI2RlZmluZSBOTUtfR1BJT19BTFRfR1BJTwkwCi0jZGVmaW5lIE5NS19HUElPX0FMVF9BCTEKLSNkZWZpbmUgTk1LX0dQSU9fQUxUX0IJMgotI2RlZmluZSBOTUtfR1BJT19BTFRfQwkoTk1LX0dQSU9fQUxUX0EgfCBOTUtfR1BJT19BTFRfQikKLQotLyogUHVsbCB1cC9kb3duIHZhbHVlcyAqLwotZW51bSBubWtfZ3Bpb19wdWxsIHsKLQlOTUtfR1BJT19QVUxMX05PTkUsCi0JTk1LX0dQSU9fUFVMTF9VUCwKLQlOTUtfR1BJT19QVUxMX0RPV04sCi19OwotCi0vKiBTbGVlcCBtb2RlICovCi1lbnVtIG5ta19ncGlvX3NscG0gewotCU5NS19HUElPX1NMUE1fSU5QVVQsCi0JTk1LX0dQSU9fU0xQTV9XQUtFVVBfRU5BQkxFID0gTk1LX0dQSU9fU0xQTV9JTlBVVCwKLQlOTUtfR1BJT19TTFBNX05PQ0hBTkdFLAotCU5NS19HUElPX1NMUE1fV0FLRVVQX0RJU0FCTEUgPSBOTUtfR1BJT19TTFBNX05PQ0hBTkdFLAotfTsKLQotZXh0ZXJuIGludCBubWtfZ3Bpb19zZXRfc2xwbShpbnQgZ3BpbywgZW51bSBubWtfZ3Bpb19zbHBtIG1vZGUpOwotZXh0ZXJuIGludCBubWtfZ3Bpb19zZXRfcHVsbChpbnQgZ3BpbywgZW51bSBubWtfZ3Bpb19wdWxsIHB1bGwpOwotZXh0ZXJuIGludCBubWtfZ3Bpb19zZXRfbW9kZShpbnQgZ3BpbywgaW50IGdwaW9fbW9kZSk7Ci1leHRlcm4gaW50IG5ta19ncGlvX2dldF9tb2RlKGludCBncGlvKTsKLQotZXh0ZXJuIHZvaWQgbm1rX2dwaW9fd2FrZXVwc19zdXNwZW5kKHZvaWQpOwotZXh0ZXJuIHZvaWQgbm1rX2dwaW9fd2FrZXVwc19yZXN1bWUodm9pZCk7Ci0KLWV4dGVybiB2b2lkIG5ta19ncGlvX3JlYWRfcHVsbChpbnQgZ3Bpb19iYW5rLCB1MzIgKnB1bGxfdXApOwotCi0vKgotICogUGxhdGZvcm0gZGF0YSB0byByZWdpc3RlciBhIGJsb2NrOiBvbmx5IHRoZSBpbml0aWFsIGdwaW8vaXJxIG51bWJlci4KLSAqLwotc3RydWN0IG5ta19ncGlvX3BsYXRmb3JtX2RhdGEgewotCWNoYXIgKm5hbWU7Ci0JaW50IGZpcnN0X2dwaW87Ci0JaW50IGZpcnN0X2lycTsKLQlpbnQgbnVtX2dwaW87Ci0JdTMyICgqZ2V0X3NlY29uZGFyeV9zdGF0dXMpKHVuc2lnbmVkIGludCBiYW5rKTsKLQl2b2lkICgqc2V0X2lvZm9yY2UpKGJvb2wgZW5hYmxlKTsKLQlib29sIHN1cHBvcnRzX3NsZWVwbW9kZTsKLX07Ci0KLSNlbmRpZiAvKiBfX0FTTV9QTEFUX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9tdHUuaCBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvbXR1LmgKaW5kZXggNjU3MDRhMy4uNjUwOGU3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9tdHUuaAorKysgYi9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L210dS5oCkBAIC0xLDU0ICsxLDExIEBACiAjaWZuZGVmIF9fUExBVF9NVFVfSAogI2RlZmluZSBfX1BMQVRfTVRVX0gKIAotLyoKLSAqIEd1YXJhbnRlZWQgcnVudGltZSBjb252ZXJzaW9uIHJhbmdlIGluIHNlY29uZHMgZm9yCi0gKiB0aGUgY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQuCi0gKi8KLSNkZWZpbmUgTVRVX01JTl9SQU5HRSA0Ci0KIC8qIHNob3VsZCBiZSBzZXQgYnkgdGhlIHBsYXRmb3JtIGNvZGUgKi8KIGV4dGVybiB2b2lkIF9faW9tZW0gKm10dV9iYXNlOwogCi0vKgotICogVGhlIE1UVSBkZXZpY2UgaG9zdHMgZm91ciBkaWZmZXJlbnQgY291bnRlcnMsIHdpdGggNCBzZXQgb2YKLSAqIHJlZ2lzdGVycy4gVGhlc2UgYXJlIHJlZ2lzdGVyIG5hbWVzLgotICovCi0KLSNkZWZpbmUgTVRVX0lNU0MJMHgwMAkvKiBJbnRlcnJ1cHQgbWFzayBzZXQvY2xlYXIgKi8KLSNkZWZpbmUgTVRVX1JJUwkJMHgwNAkvKiBSYXcgaW50ZXJydXB0IHN0YXR1cyAqLwotI2RlZmluZSBNVFVfTUlTCQkweDA4CS8qIE1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzICovCi0jZGVmaW5lIE1UVV9JQ1IJCTB4MEMJLyogSW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyICovCi0KLS8qIHBlci10aW1lciByZWdpc3RlcnMgdGFrZSAwLi4zIGFzIGFyZ3VtZW50ICovCi0jZGVmaW5lIE1UVV9MUih4KQkoMHgxMCArIDB4MTAgKiAoeCkgKyAweDAwKQkvKiBMb2FkIHZhbHVlICovCi0jZGVmaW5lIE1UVV9WQUwoeCkJKDB4MTAgKyAweDEwICogKHgpICsgMHgwNCkJLyogQ3VycmVudCB2YWx1ZSAqLwotI2RlZmluZSBNVFVfQ1IoeCkJKDB4MTAgKyAweDEwICogKHgpICsgMHgwOCkJLyogQ29udHJvbCByZWcgKi8KLSNkZWZpbmUgTVRVX0JHTFIoeCkJKDB4MTAgKyAweDEwICogKHgpICsgMHgwYykJLyogQXQgbmV4dCBvdmVyZmxvdyAqLwotCi0vKiBiaXRzIGZvciB0aGUgY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBNVFVfQ1JuX0VOQQkJMHg4MAotI2RlZmluZSBNVFVfQ1JuX1BFUklPRElDCTB4NDAJLyogaWYgMCA9IGZyZWUtcnVubmluZyAqLwotI2RlZmluZSBNVFVfQ1JuX1BSRVNDQUxFX01BU0sJMHgwYwotI2RlZmluZSBNVFVfQ1JuX1BSRVNDQUxFXzEJCTB4MDAKLSNkZWZpbmUgTVRVX0NSbl9QUkVTQ0FMRV8xNgkJMHgwNAotI2RlZmluZSBNVFVfQ1JuX1BSRVNDQUxFXzI1NgkJMHgwOAotI2RlZmluZSBNVFVfQ1JuXzMyQklUUwkJMHgwMgotI2RlZmluZSBNVFVfQ1JuX09ORVNIT1QJCTB4MDEJLyogaWYgMCA9IHdyYXBzIHJlbG9hZGluZyBmcm9tIEJHTFIqLwotCi0vKiBPdGhlciByZWdpc3RlcnMgYXJlIHVzdWFsIGFtYmEvcHJpbWVjZWxsIHJlZ2lzdGVycywgY3VycmVudGx5IG5vdCB1c2VkICovCi0jZGVmaW5lIE1UVV9JVENSCTB4ZmYwCi0jZGVmaW5lIE1UVV9JVE9QCTB4ZmY0Ci0KLSNkZWZpbmUgTVRVX1BFUklQSF9JRDAJMHhmZTAKLSNkZWZpbmUgTVRVX1BFUklQSF9JRDEJMHhmZTQKLSNkZWZpbmUgTVRVX1BFUklQSF9JRDIJMHhmZTgKLSNkZWZpbmUgTVRVX1BFUklQSF9JRDMJMHhmZUMKLQotI2RlZmluZSBNVFVfUENFTEwwCTB4ZmYwCi0jZGVmaW5lIE1UVV9QQ0VMTDEJMHhmZjQKLSNkZWZpbmUgTVRVX1BDRUxMMgkweGZmOAotI2RlZmluZSBNVFVfUENFTEwzCTB4ZmZDCit2b2lkIG5tZGtfY2xrZXZ0X3Jlc2V0KHZvaWQpOwordm9pZCBubWRrX2Nsa3NyY19yZXNldCh2b2lkKTsKIAogI2VuZGlmIC8qIF9fUExBVF9NVFVfSCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L3BpbmNmZy5oIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9waW5jZmcuaAppbmRleCAwNWEzOTM2Li4yMmNiOTdkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L3BpbmNmZy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvcGluY2ZnLmgKQEAgLTM3LDcgKzM3LDYgQEAKICAqCQkgICAgIFNMUE0gdmFsdWUgPSBzYW1lIGFzIG5vcm1hbAogICoKICAqIFBJTl9DRkcJICAgLSBkZWZhdWx0IGNvbmZpZyB3aXRoIGFsdGVybmF0ZSBmdW5jdGlvbgotICogUElOX0NGR19QVUxMCSAgIC0gZGVmYXVsdCBjb25maWcgd2l0aCBhbHRlcm5hdGUgZnVuY3Rpb24gYW5kIHB1bGwgdXAvZG93bgogICovCiAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBwaW5fY2ZnX3Q7CkBAIC0xMzMsMTAgKzEzMiw2IEBACiAJKFBJTl9DRkdfREVGQVVMVCB8XAogCSAoUElOX05VTShudW0pIHwgUElOXyMjYWx0IHwgUElOX09VVFBVVF8jI3ZhbCkpCiAKLSNkZWZpbmUgUElOX0NGR19QVUxMKG51bSwgYWx0LCBwdWxsKQlcCi0JKChQSU5fQ0ZHX0RFRkFVTFQgJiB+UElOX1BVTExfTUFTSykgfFwKLQkgKFBJTl9OVU0obnVtKSB8IFBJTl8jI2FsdCB8IFBJTl9QVUxMXyMjcHVsbCkpCi0KIGV4dGVybiBpbnQgbm1rX2NvbmZpZ19waW4ocGluX2NmZ190IGNmZywgYm9vbCBzbGVlcCk7CiBleHRlcm4gaW50IG5ta19jb25maWdfcGlucyhwaW5fY2ZnX3QgKmNmZ3MsIGludCBudW0pOwogZXh0ZXJuIGludCBubWtfY29uZmlnX3BpbnNfc2xlZXAocGluX2NmZ190ICpjZmdzLCBpbnQgbnVtKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay90aW1lci5jIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL3RpbWVyLmMKaW5kZXggZWY3NGUxNTcuLjMwYjY0MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay90aW1lci5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay90aW1lci5jCkBAIC0yMSwxMCArMjEsNTkgQEAKICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3NjaGVkX2Nsb2NrLmg+CiAKLSNpbmNsdWRlIDxwbGF0L210dS5oPgorLyoKKyAqIEd1YXJhbnRlZWQgcnVudGltZSBjb252ZXJzaW9uIHJhbmdlIGluIHNlY29uZHMgZm9yCisgKiB0aGUgY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQuCisgKi8KKyNkZWZpbmUgTVRVX01JTl9SQU5HRSA0CisKKy8qCisgKiBUaGUgTVRVIGRldmljZSBob3N0cyBmb3VyIGRpZmZlcmVudCBjb3VudGVycywgd2l0aCA0IHNldCBvZgorICogcmVnaXN0ZXJzLiBUaGVzZSBhcmUgcmVnaXN0ZXIgbmFtZXMuCisgKi8KKworI2RlZmluZSBNVFVfSU1TQwkweDAwCS8qIEludGVycnVwdCBtYXNrIHNldC9jbGVhciAqLworI2RlZmluZSBNVFVfUklTCQkweDA0CS8qIFJhdyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIE1UVV9NSVMJCTB4MDgJLyogTWFza2VkIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgTVRVX0lDUgkJMHgwQwkvKiBJbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgKi8KKworLyogcGVyLXRpbWVyIHJlZ2lzdGVycyB0YWtlIDAuLjMgYXMgYXJndW1lbnQgKi8KKyNkZWZpbmUgTVRVX0xSKHgpCSgweDEwICsgMHgxMCAqICh4KSArIDB4MDApCS8qIExvYWQgdmFsdWUgKi8KKyNkZWZpbmUgTVRVX1ZBTCh4KQkoMHgxMCArIDB4MTAgKiAoeCkgKyAweDA0KQkvKiBDdXJyZW50IHZhbHVlICovCisjZGVmaW5lIE1UVV9DUih4KQkoMHgxMCArIDB4MTAgKiAoeCkgKyAweDA4KQkvKiBDb250cm9sIHJlZyAqLworI2RlZmluZSBNVFVfQkdMUih4KQkoMHgxMCArIDB4MTAgKiAoeCkgKyAweDBjKQkvKiBBdCBuZXh0IG92ZXJmbG93ICovCisKKy8qIGJpdHMgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1UVV9DUm5fRU5BCQkweDgwCisjZGVmaW5lIE1UVV9DUm5fUEVSSU9ESUMJMHg0MAkvKiBpZiAwID0gZnJlZS1ydW5uaW5nICovCisjZGVmaW5lIE1UVV9DUm5fUFJFU0NBTEVfTUFTSwkweDBjCisjZGVmaW5lIE1UVV9DUm5fUFJFU0NBTEVfMQkJMHgwMAorI2RlZmluZSBNVFVfQ1JuX1BSRVNDQUxFXzE2CQkweDA0CisjZGVmaW5lIE1UVV9DUm5fUFJFU0NBTEVfMjU2CQkweDA4CisjZGVmaW5lIE1UVV9DUm5fMzJCSVRTCQkweDAyCisjZGVmaW5lIE1UVV9DUm5fT05FU0hPVAkJMHgwMQkvKiBpZiAwID0gd3JhcHMgcmVsb2FkaW5nIGZyb20gQkdMUiovCisKKy8qIE90aGVyIHJlZ2lzdGVycyBhcmUgdXN1YWwgYW1iYS9wcmltZWNlbGwgcmVnaXN0ZXJzLCBjdXJyZW50bHkgbm90IHVzZWQgKi8KKyNkZWZpbmUgTVRVX0lUQ1IJMHhmZjAKKyNkZWZpbmUgTVRVX0lUT1AJMHhmZjQKKworI2RlZmluZSBNVFVfUEVSSVBIX0lEMAkweGZlMAorI2RlZmluZSBNVFVfUEVSSVBIX0lEMQkweGZlNAorI2RlZmluZSBNVFVfUEVSSVBIX0lEMgkweGZlOAorI2RlZmluZSBNVFVfUEVSSVBIX0lEMwkweGZlQworCisjZGVmaW5lIE1UVV9QQ0VMTDAJMHhmZjAKKyNkZWZpbmUgTVRVX1BDRUxMMQkweGZmNAorI2RlZmluZSBNVFVfUENFTEwyCTB4ZmY4CisjZGVmaW5lIE1UVV9QQ0VMTDMJMHhmZkMKKworc3RhdGljIGJvb2wgY2xrZXZ0X3BlcmlvZGljOworc3RhdGljIHUzMiBjbGtfcHJlc2NhbGU7CitzdGF0aWMgdTMyIG5tZGtfY3ljbGU7CQkvKiB3cml0ZS1vbmNlICovCiAKIHZvaWQgX19pb21lbSAqbXR1X2Jhc2U7IC8qIEFzc2lnbmVkIGJ5IG1hY2hpbmUgY29kZSAqLwogCisjaWZkZWYgQ09ORklHX05PTUFESUtfTVRVX1NDSEVEX0NMT0NLCiAvKgogICogT3ZlcnJpZGUgdGhlIGdsb2JhbCB3ZWFrIHNjaGVkX2Nsb2NrIHN5bWJvbCB3aXRoIHRoaXMKICAqIGxvY2FsIGltcGxlbWVudGF0aW9uIHdoaWNoIHVzZXMgdGhlIGNsb2Nrc291cmNlIHRvIGdldCBzb21lCkBAIC00OCwzMiArOTcsNTYgQEAKIAl1MzIgY3ljID0gLXJlYWRsKG10dV9iYXNlICsgTVRVX1ZBTCgwKSk7CiAJdXBkYXRlX3NjaGVkX2Nsb2NrKCZjZCwgY3ljLCAodTMyKX4wKTsKIH0KKyNlbmRpZgogCiAvKiBDbG9ja2V2ZW50IGRldmljZTogdXNlIG9uZS1zaG90IG1vZGUgKi8KK3N0YXRpYyBpbnQgbm1ka19jbGtldnRfbmV4dCh1bnNpZ25lZCBsb25nIGV2dCwgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXYpCit7CisJd3JpdGVsKDEgPDwgMSwgbXR1X2Jhc2UgKyBNVFVfSU1TQyk7CisJd3JpdGVsKGV2dCwgbXR1X2Jhc2UgKyBNVFVfTFIoMSkpOworCS8qIExvYWQgaGlnaGVzdCB2YWx1ZSwgZW5hYmxlIGRldmljZSwgZW5hYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoTVRVX0NSbl9PTkVTSE9UIHwgY2xrX3ByZXNjYWxlIHwKKwkgICAgICAgTVRVX0NSbl8zMkJJVFMgfCBNVFVfQ1JuX0VOQSwKKwkgICAgICAgbXR1X2Jhc2UgKyBNVFVfQ1IoMSkpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbm1ka19jbGtldnRfcmVzZXQodm9pZCkKK3sKKwlpZiAoY2xrZXZ0X3BlcmlvZGljKSB7CisKKwkJLyogVGltZXI6IGNvbmZpZ3VyZSBsb2FkIGFuZCBiYWNrZ3JvdW5kLWxvYWQsIGFuZCBmaXJlIGl0IHVwICovCisJCXdyaXRlbChubWRrX2N5Y2xlLCBtdHVfYmFzZSArIE1UVV9MUigxKSk7CisJCXdyaXRlbChubWRrX2N5Y2xlLCBtdHVfYmFzZSArIE1UVV9CR0xSKDEpKTsKKworCQl3cml0ZWwoTVRVX0NSbl9QRVJJT0RJQyB8IGNsa19wcmVzY2FsZSB8CisJCSAgICAgICBNVFVfQ1JuXzMyQklUUyB8IE1UVV9DUm5fRU5BLAorCQkgICAgICAgbXR1X2Jhc2UgKyBNVFVfQ1IoMSkpOworCQl3cml0ZWwoMSA8PCAxLCBtdHVfYmFzZSArIE1UVV9JTVNDKTsKKwl9IGVsc2UgeworCQkvKiBHZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgdG8gc3RhcnQgdGhlIGNsb2NrZXZlbnQgYWdhaW4gKi8KKwkJKHZvaWQpIG5tZGtfY2xrZXZ0X25leHQobm1ka19jeWNsZSwgTlVMTCk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBubWRrX2Nsa2V2dF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAogCQkJICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCiB7Ci0JdTMyIGNyOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKLQkJcHJfZXJyKCIlczogcGVyaW9kaWMgbW9kZSBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CisJCWNsa2V2dF9wZXJpb2RpYyA9IHRydWU7CisJCW5tZGtfY2xrZXZ0X3Jlc2V0KCk7CiAJCWJyZWFrOwogCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKLQkJLyogTG9hZCBoaWdoZXN0IHZhbHVlLCBlbmFibGUgZGV2aWNlLCBlbmFibGUgaW50ZXJydXB0cyAqLwotCQljciA9IHJlYWRsKG10dV9iYXNlICsgTVRVX0NSKDEpKTsKLQkJd3JpdGVsKDAsIG10dV9iYXNlICsgTVRVX0xSKDEpKTsKLQkJd3JpdGVsKGNyIHwgTVRVX0NSbl9FTkEsIG10dV9iYXNlICsgTVRVX0NSKDEpKTsKLQkJd3JpdGVsKDEgPDwgMSwgbXR1X2Jhc2UgKyBNVFVfSU1TQyk7CisJCWNsa2V2dF9wZXJpb2RpYyA9IGZhbHNlOwogCQlicmVhazsKIAljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgogCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgotCQkvKiBkaXNhYmxlIGlycSAqLwogCQl3cml0ZWwoMCwgbXR1X2Jhc2UgKyBNVFVfSU1TQyk7CiAJCS8qIGRpc2FibGUgdGltZXIgKi8KLQkJY3IgPSByZWFkbChtdHVfYmFzZSArIE1UVV9DUigxKSk7Ci0JCWNyICY9IH5NVFVfQ1JuX0VOQTsKLQkJd3JpdGVsKGNyLCBtdHVfYmFzZSArIE1UVV9DUigxKSk7CisJCXdyaXRlbCgwLCBtdHVfYmFzZSArIE1UVV9DUigxKSk7CiAJCS8qIGxvYWQgc29tZSBoaWdoIGRlZmF1bHQgdmFsdWUgKi8KIAkJd3JpdGVsKDB4ZmZmZmZmZmYsIG10dV9iYXNlICsgTVRVX0xSKDEpKTsKIAkJYnJlYWs7CkBAIC04MiwxNiArMTU1LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbm1ka19jbGtldnRfbmV4dCh1bnNpZ25lZCBsb25nIGV2dCwgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXYpCi17Ci0JLyogd3JpdGluZyB0aGUgdmFsdWUgaGFzIGltbWVkaWF0ZSBlZmZlY3QgKi8KLQl3cml0ZWwoZXZ0LCBtdHVfYmFzZSArIE1UVV9MUigxKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIG5tZGtfY2xrZXZ0ID0gewogCS5uYW1lCQk9ICJtdHVfMSIsCi0JLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKKwkuZmVhdHVyZXMJPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UIHwgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMsCiAJLnJhdGluZwkJPSAyMDAsCiAJLnNldF9tb2RlCT0gbm1ka19jbGtldnRfbW9kZSwKIAkuc2V0X25leHRfZXZlbnQJPSBubWRrX2Nsa2V2dF9uZXh0LApAQCAtMTE2LDExICsxODIsMjMgQEAKIAkuZGV2X2lkCQk9ICZubWRrX2Nsa2V2dCwKIH07CiAKK3ZvaWQgbm1ka19jbGtzcmNfcmVzZXQodm9pZCkKK3sKKwkvKiBEaXNhYmxlICovCisJd3JpdGVsKDAsIG10dV9iYXNlICsgTVRVX0NSKDApKTsKKworCS8qIENsb2NrU291cmNlOiBjb25maWd1cmUgbG9hZCBhbmQgYmFja2dyb3VuZC1sb2FkLCBhbmQgZmlyZSBpdCB1cCAqLworCXdyaXRlbChubWRrX2N5Y2xlLCBtdHVfYmFzZSArIE1UVV9MUigwKSk7CisJd3JpdGVsKG5tZGtfY3ljbGUsIG10dV9iYXNlICsgTVRVX0JHTFIoMCkpOworCisJd3JpdGVsKGNsa19wcmVzY2FsZSB8IE1UVV9DUm5fMzJCSVRTIHwgTVRVX0NSbl9FTkEsCisJICAgICAgIG10dV9iYXNlICsgTVRVX0NSKDApKTsKK30KKwogdm9pZCBfX2luaXQgbm1ka190aW1lcl9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByYXRlOwogCXN0cnVjdCBjbGsgKmNsazA7Ci0JdTMyIGNyID0gTVRVX0NSbl8zMkJJVFM7CiAKIAljbGswID0gY2xrX2dldF9zeXMoIm10dTAiLCBOVUxMKTsKIAlCVUdfT04oSVNfRVJSKGNsazApKTsKQEAgLTEzOCwzMCArMjE2LDI4IEBACiAJcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGswKTsKIAlpZiAocmF0ZSA+IDMyMDAwMDAwKSB7CiAJCXJhdGUgLz0gMTY7Ci0JCWNyIHw9IE1UVV9DUm5fUFJFU0NBTEVfMTY7CisJCWNsa19wcmVzY2FsZSA9IE1UVV9DUm5fUFJFU0NBTEVfMTY7CiAJfSBlbHNlIHsKLQkJY3IgfD0gTVRVX0NSbl9QUkVTQ0FMRV8xOworCQljbGtfcHJlc2NhbGUgPSBNVFVfQ1JuX1BSRVNDQUxFXzE7CiAJfQogCisJbm1ka19jeWNsZSA9IChyYXRlICsgSFovMikgLyBIWjsKKworCiAJLyogVGltZXIgMCBpcyB0aGUgZnJlZSBydW5uaW5nIGNsb2Nrc291cmNlICovCi0Jd3JpdGVsKGNyLCBtdHVfYmFzZSArIE1UVV9DUigwKSk7Ci0Jd3JpdGVsKDAsIG10dV9iYXNlICsgTVRVX0xSKDApKTsKLQl3cml0ZWwoMCwgbXR1X2Jhc2UgKyBNVFVfQkdMUigwKSk7Ci0Jd3JpdGVsKGNyIHwgTVRVX0NSbl9FTkEsIG10dV9iYXNlICsgTVRVX0NSKDApKTsKKwlubWRrX2Nsa3NyY19yZXNldCgpOwogCiAJaWYgKGNsb2Nrc291cmNlX21taW9faW5pdChtdHVfYmFzZSArIE1UVV9WQUwoMCksICJtdHVfMCIsCiAJCQlyYXRlLCAyMDAsIDMyLCBjbG9ja3NvdXJjZV9tbWlvX3JlYWRsX2Rvd24pKQogCQlwcl9lcnIoInRpbWVyOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjbG9jayBzb3VyY2UgJXNcbiIsCiAJCSAgICAgICAibXR1XzAiKTsKLQorI2lmZGVmIENPTkZJR19OT01BRElLX01UVV9TQ0hFRF9DTE9DSwogCWluaXRfc2NoZWRfY2xvY2soJmNkLCBub21hZGlrX3VwZGF0ZV9zY2hlZF9jbG9jaywgMzIsIHJhdGUpOwotCisjZW5kaWYKIAkvKiBUaW1lciAxIGlzIHVzZWQgZm9yIGV2ZW50cyAqLwogCiAJY2xvY2tldmVudHNfY2FsY19tdWx0X3NoaWZ0KCZubWRrX2Nsa2V2dCwgcmF0ZSwgTVRVX01JTl9SQU5HRSk7CiAKLQl3cml0ZWwoY3IgfCBNVFVfQ1JuX09ORVNIT1QsIG10dV9iYXNlICsgTVRVX0NSKDEpKTsgLyogb2ZmLCBjdXJyZW50bHkgKi8KLQogCW5tZGtfY2xrZXZ0Lm1heF9kZWx0YV9ucyA9CiAJCWNsb2NrZXZlbnRfZGVsdGEybnMoMHhmZmZmZmZmZiwgJm5tZGtfY2xrZXZ0KTsKIAlubWRrX2Nsa2V2dC5taW5fZGVsdGFfbnMgPQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZwppbmRleCA1YjYwNWE5Li5hYTU5ZjQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZwpAQCAtMTUsNiArMTUsNyBAQAogCXNlbGVjdCBDTEtTUkNfTU1JTwogCXNlbGVjdCBHRU5FUklDX0lSUV9DSElQCiAJc2VsZWN0IEhBVkVfSURFCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgICJTeXN0ZW1zIGJhc2VkIG9uIG9tYXA3eHgsIG9tYXAxNXh4IG9yIG9tYXAxNnh4IgogCkBAIC0xMzMsMTggKzEzNCw2IEBACiAJICBUaGlzIGNhbiBhbHNvIGJlIGNoYW5nZWQgYXQgcnVudGltZSAodmlhIHRoZSBtYm94X2tmaWZvX3NpemUKIAkgIG1vZHVsZSBwYXJhbWV0ZXIpLgogCi1jb25maWcgT01BUF9JT01NVQotCXRyaXN0YXRlCi0KLWNvbmZpZyBPTUFQX0lPTU1VX0RFQlVHCi0gICAgICAgdHJpc3RhdGUgIkV4cG9ydCBPTUFQIElPTU1VIGludGVybmFscyBpbiBEZWJ1Z0ZTIgotICAgICAgIGRlcGVuZHMgb24gT01BUF9JT01NVSAmJiBERUJVR19GUwotICAgICAgIGhlbHAKLSAgICAgICAgIFNlbGVjdCB0aGlzIHRvIHNlZSBleHRlbnNpdmUgaW5mb3JtYXRpb24gYWJvdXQKLSAgICAgICAgIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBPTUFQIElPTU1VIGluIGRlYnVnZnMuCi0KLSAgICAgICAgIFNheSBOIHVubGVzcyB5b3Uga25vdyB5b3UgbmVlZCB0aGlzLgotCiBjb25maWcgT01BUF9JT01NVV9JVkEyCiAJYm9vbAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUKaW5kZXggZjAyMzNlNi4uOTg1MjYyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZQpAQCAtMTgsOCArMTgsNiBAQAogb2JqLSQoQ09ORklHX0FSQ0hfT01BUDQpICs9IG9tYXBfZGV2aWNlLm8KIAogb2JqLSQoQ09ORklHX09NQVBfTUNCU1ApICs9IG1jYnNwLm8KLW9iai0kKENPTkZJR19PTUFQX0lPTU1VKSArPSBpb21tdS5vIGlvdm1tLm8KLW9iai0kKENPTkZJR19PTUFQX0lPTU1VX0RFQlVHKSArPSBpb21tdS1kZWJ1Zy5vCiAKIG9iai0kKENPTkZJR19DUFVfRlJFUSkgKz0gY3B1LW9tYXAubwogb2JqLSQoQ09ORklHX09NQVBfRE1fVElNRVIpICs9IGRtdGltZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYwppbmRleCAzYmE0ZDExLi41NjdlNGI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1kZXZpY2VzLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctZGV2aWNlcy5jCmluZGV4IDkyM2M5NjIuLmNhYTFmN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWRldmljZXMuYwpAQCAtOCw3ICs4LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKIAogLyogTWFueSBPTUFQIGRldmVsb3BtZW50IHBsYXRmb3JtcyByZXVzZSB0aGUgc2FtZSAiZGVidWcgYm9hcmQiOyB0aGVzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWxlZHMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1sZWRzLmMKaW5kZXggZmMwNWIxMC4uNjFhMWVjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWxlZHMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctbGVkcy5jCkBAIC03LDcgKzcsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKIAogLyogTWFueSBPTUFQIGRldmVsb3BtZW50IHBsYXRmb3JtcyByZXVzZSB0aGUgc2FtZSAiZGVidWcgYm9hcmQiOyB0aGVzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RldmljZXMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZXZpY2VzLmMKaW5kZXggZWEyOGY5OC4uMTk3MTkzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RldmljZXMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGV2aWNlcy5jCkBAIC04LDcgKzgsNyBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yNCw5MSArMjQsOSBAQAogI2luY2x1ZGUgPHBsYXQvdGMuaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9tbWMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L21lbmVsYXVzLmg+Ci0jaW5jbHVkZSA8cGxhdC9tY2JzcC5oPgogI2luY2x1ZGUgPHBsYXQvb21hcDQ0eHguaD4KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTUNCU1ApIHx8IGRlZmluZWQoQ09ORklHX09NQVBfTUNCU1BfTU9EVUxFKQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKm9tYXBfbWNic3BfZGV2aWNlczsKLQotdm9pZCBvbWFwX21jYnNwX3JlZ2lzdGVyX2JvYXJkX2NmZyhzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IHJlc19jb3VudCwKLQkJCXN0cnVjdCBvbWFwX21jYnNwX3BsYXRmb3JtX2RhdGEgKmNvbmZpZywgaW50IHNpemUpCi17Ci0JaW50IGk7Ci0KLQlvbWFwX21jYnNwX2RldmljZXMgPSBremFsbG9jKHNpemUgKiBzaXplb2Yoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKSwKLQkJCQkgICAgIEdGUF9LRVJORUwpOwotCWlmICghb21hcF9tY2JzcF9kZXZpY2VzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIE1jQlNQIGRldmljZXNcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpuZXdfbWNic3A7Ci0JCWludCByZXQ7Ci0KLQkJbmV3X21jYnNwID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJvbWFwLW1jYnNwIiwgaSArIDEpOwotCQlpZiAoIW5ld19tY2JzcCkKLQkJCWNvbnRpbnVlOwotCQlwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhuZXdfbWNic3AsICZyZXNbaSAqIHJlc19jb3VudF0sCi0JCQkJCXJlc19jb3VudCk7Ci0JCW5ld19tY2JzcC0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAmY29uZmlnW2ldOwotCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKG5ld19tY2JzcCk7Ci0JCWlmIChyZXQpIHsKLQkJCXBsYXRmb3JtX2RldmljZV9wdXQobmV3X21jYnNwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCW9tYXBfbWNic3BfZGV2aWNlc1tpXSA9IG5ld19tY2JzcDsKLQl9Ci19Ci0KLSNlbHNlCi12b2lkIG9tYXBfbWNic3BfcmVnaXN0ZXJfYm9hcmRfY2ZnKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgcmVzX2NvdW50LAotCQkJc3RydWN0IG9tYXBfbWNic3BfcGxhdGZvcm1fZGF0YSAqY29uZmlnLCBpbnQgc2l6ZSkKLXsgIH0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX01DUERNKSB8fCBcCi0JCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19NQ1BETV9NT0RVTEUpCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbWNwZG1fcmVzb3VyY2VzW10gPSB7Ci0JewotCQkubmFtZQkJPSAibWNwZG1fbWVtIiwKLQkJLnN0YXJ0CQk9IE9NQVA0NFhYX01DUERNX0JBU0UsCi0JCS5lbmQJCT0gT01BUDQ0WFhfTUNQRE1fQkFTRSArIFNaXzRLLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJtY3BkbV9pcnEiLAotCQkuc3RhcnQJCT0gT01BUDQ0WFhfSVJRX01DUERNLAotCQkuZW5kCQk9IE9NQVA0NFhYX0lSUV9NQ1BETSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwX21jcGRtX2RldmljZSA9IHsKLQkubmFtZQkJPSAib21hcC1tY3BkbSIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtY3BkbV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IG1jcGRtX3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyB2b2lkIG9tYXBfaW5pdF9tY3BkbSh2b2lkKQotewotCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXBfbWNwZG1fZGV2aWNlKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pbml0X21jcGRtKHZvaWQpIHt9Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogI2lmIGRlZmluZWQoQ09ORklHX01NQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9NT0RVTEUpIHx8IFwKIAlkZWZpbmVkKENPTkZJR19NTUNfT01BUF9IUykgfHwgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfSFNfTU9EVUxFKQogCkBAIC0yOTEsNyArMjA5LDYgQEAKIAkgKiBpbiBhbHBoYWJldGljYWwgb3JkZXIgc28gdGhleSdyZSBlYXNpZXIgdG8gc29ydCB0aHJvdWdoLgogCSAqLwogCW9tYXBfaW5pdF9ybmcoKTsKLQlvbWFwX2luaXRfbWNwZG0oKTsKIAlvbWFwX2luaXRfdXdpcmUoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jCmluZGV4IDc1YTg0N2QuLmFmM2I5MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYwpAQCAtMyw2ICszLDEyIEBACiAgKgogICogT01BUCBEdWFsLU1vZGUgVGltZXJzCiAgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICogVGFydW4gS2FudGkgRGViQmFybWEgPHRhcnVuLmthbnRpQHRpLmNvbT4KKyAqIFRoYXJhIEdvcGluYXRoIDx0aGFyYUB0aS5jb20+CisgKgorICogZG10aW1lciBhZGFwdGF0aW9uIHRvIHBsYXRmb3JtX2RyaXZlci4KKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KICAqIE9NQVAyIHN1cHBvcnQgYnkgSnVoYSBZcmpvbGEKICAqIEFQSSBpbXByb3ZlbWVudHMgYW5kIE9NQVAyIGNsb2NrIGZyYW1ld29yayBzdXBwb3J0IGJ5IFRpbW8gVGVyYXMKQEAgLTI5LDE2OCArMzUsODEgQEAKICAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKwogI2luY2x1ZGUgPHBsYXQvZG10aW1lci5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCi1zdGF0aWMgaW50IGRtX3RpbWVyX2NvdW50Oworc3RhdGljIExJU1RfSEVBRChvbWFwX3RpbWVyX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhkbV90aW1lcl9sb2NrKTsKIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCi1zdGF0aWMgc3RydWN0IG9tYXBfZG1fdGltZXIgb21hcDFfZG1fdGltZXJzW10gPSB7Ci0JeyAucGh5c19iYXNlID0gMHhmZmZiMTQwMCwgLmlycSA9IElOVF8xNjEwX0dQVElNRVIxIH0sCi0JeyAucGh5c19iYXNlID0gMHhmZmZiMWMwMCwgLmlycSA9IElOVF8xNjEwX0dQVElNRVIyIH0sCi0JeyAucGh5c19iYXNlID0gMHhmZmZiMjQwMCwgLmlycSA9IElOVF8xNjEwX0dQVElNRVIzIH0sCi0JeyAucGh5c19iYXNlID0gMHhmZmZiMmMwMCwgLmlycSA9IElOVF8xNjEwX0dQVElNRVI0IH0sCi0JeyAucGh5c19iYXNlID0gMHhmZmZiMzQwMCwgLmlycSA9IElOVF8xNjEwX0dQVElNRVI1IH0sCi0JeyAucGh5c19iYXNlID0gMHhmZmZiM2MwMCwgLmlycSA9IElOVF8xNjEwX0dQVElNRVI2IH0sCi0JeyAucGh5c19iYXNlID0gMHhmZmZiNzQwMCwgLmlycSA9IElOVF8xNjEwX0dQVElNRVI3IH0sCi0JeyAucGh5c19iYXNlID0gMHhmZmZiZDQwMCwgLmlycSA9IElOVF8xNjEwX0dQVElNRVI4IH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IG9tYXAxX2RtX3RpbWVyX2NvdW50ID0gQVJSQVlfU0laRShvbWFwMV9kbV90aW1lcnMpOwotCi0jZWxzZQotI2RlZmluZSBvbWFwMV9kbV90aW1lcnMJCQlOVUxMCi0jZGVmaW5lIG9tYXAxX2RtX3RpbWVyX2NvdW50CQkwCi0jZW5kaWYJLyogQ09ORklHX0FSQ0hfT01BUDEgKi8KLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyCi1zdGF0aWMgc3RydWN0IG9tYXBfZG1fdGltZXIgb21hcDJfZG1fdGltZXJzW10gPSB7Ci0JeyAucGh5c19iYXNlID0gMHg0ODAyODAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVIxIH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODAyYTAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVIyIH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA3ODAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVIzIH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA3YTAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI0IH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA3YzAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI1IH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA3ZTAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI2IH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA4MDAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI3IH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA4MjAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI4IH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA4NDAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI5IH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA4NjAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVIxMCB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDgwODgwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSMTEgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDhhMDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjEyIH0sCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqb21hcDJfZG1fc291cmNlX25hbWVzW10gX19pbml0ZGF0YSA9IHsKLQkic3lzX2NrIiwKLQkiZnVuY18zMmtfY2siLAotCSJhbHRfY2siLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpvbWFwMl9kbV9zb3VyY2VfY2xvY2tzWzNdOwotc3RhdGljIGNvbnN0IGludCBvbWFwMl9kbV90aW1lcl9jb3VudCA9IEFSUkFZX1NJWkUob21hcDJfZG1fdGltZXJzKTsKLQotI2Vsc2UKLSNkZWZpbmUgb21hcDJfZG1fdGltZXJzCQkJTlVMTAotI2RlZmluZSBvbWFwMl9kbV90aW1lcl9jb3VudAkJMAotI2RlZmluZSBvbWFwMl9kbV9zb3VyY2VfbmFtZXMJCU5VTEwKLSNkZWZpbmUgb21hcDJfZG1fc291cmNlX2Nsb2NrcwkJTlVMTAotI2VuZGlmCS8qIENPTkZJR19BUkNIX09NQVAyICovCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMwotc3RhdGljIHN0cnVjdCBvbWFwX2RtX3RpbWVyIG9tYXAzX2RtX3RpbWVyc1tdID0gewotCXsgLnBoeXNfYmFzZSA9IDB4NDgzMTgwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSMSB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDkwMzIwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSMiB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDkwMzQwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSMyB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDkwMzYwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSNCB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDkwMzgwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSNSB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDkwM0EwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSNiB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDkwM0MwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSNyB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDkwM0UwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSOCB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDkwNDAwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSOSB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDgwODYwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSMTAgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDg4MDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjExIH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODMwNDAwMCwgLmlycSA9IElOVF8zNFhYX0dQVDEyX0lSUSB9LAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKm9tYXAzX2RtX3NvdXJjZV9uYW1lc1tdIF9faW5pdGRhdGEgPSB7Ci0JInN5c19jayIsCi0JIm9tYXBfMzJrX2ZjayIsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKm9tYXAzX2RtX3NvdXJjZV9jbG9ja3NbMl07Ci1zdGF0aWMgY29uc3QgaW50IG9tYXAzX2RtX3RpbWVyX2NvdW50ID0gQVJSQVlfU0laRShvbWFwM19kbV90aW1lcnMpOwotCi0jZWxzZQotI2RlZmluZSBvbWFwM19kbV90aW1lcnMJCQlOVUxMCi0jZGVmaW5lIG9tYXAzX2RtX3RpbWVyX2NvdW50CQkwCi0jZGVmaW5lIG9tYXAzX2RtX3NvdXJjZV9uYW1lcwkJTlVMTAotI2RlZmluZSBvbWFwM19kbV9zb3VyY2VfY2xvY2tzCQlOVUxMCi0jZW5kaWYJLyogQ09ORklHX0FSQ0hfT01BUDMgKi8KLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVA0Ci1zdGF0aWMgc3RydWN0IG9tYXBfZG1fdGltZXIgb21hcDRfZG1fdGltZXJzW10gPSB7Ci0JeyAucGh5c19iYXNlID0gMHg0YTMxODAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQxIH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODAzMjAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQyIH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODAzNDAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQzIH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODAzNjAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQ0IH0sCi0JeyAucGh5c19iYXNlID0gMHg0MDEzODAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQ1IH0sCi0JeyAucGh5c19iYXNlID0gMHg0MDEzYTAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQ2IH0sCi0JeyAucGh5c19iYXNlID0gMHg0MDEzYTAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQ3IH0sCi0JeyAucGh5c19iYXNlID0gMHg0MDEzZTAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQ4IH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODAzZTAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQ5IH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA4NjAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQxMCB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDgwODgwMDAsIC5pcnEgPSBPTUFQNDRYWF9JUlFfR1BUMTEgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDRhMzIwMDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDEyIH0sCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKm9tYXA0X2RtX3NvdXJjZV9uYW1lc1tdIF9faW5pdGRhdGEgPSB7Ci0JInN5c19jbGtpbl9jayIsCi0JInN5c18zMmtfY2siLAotCU5VTEwKLX07Ci1zdGF0aWMgc3RydWN0IGNsayAqb21hcDRfZG1fc291cmNlX2Nsb2Nrc1syXTsKLXN0YXRpYyBjb25zdCBpbnQgb21hcDRfZG1fdGltZXJfY291bnQgPSBBUlJBWV9TSVpFKG9tYXA0X2RtX3RpbWVycyk7Ci0KLSNlbHNlCi0jZGVmaW5lIG9tYXA0X2RtX3RpbWVycwkJCU5VTEwKLSNkZWZpbmUgb21hcDRfZG1fdGltZXJfY291bnQJCTAKLSNkZWZpbmUgb21hcDRfZG1fc291cmNlX25hbWVzCQlOVUxMCi0jZGVmaW5lIG9tYXA0X2RtX3NvdXJjZV9jbG9ja3MJCU5VTEwKLSNlbmRpZgkvKiBDT05GSUdfQVJDSF9PTUFQNCAqLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfZG1fdGltZXIgKmRtX3RpbWVyczsKLXN0YXRpYyBjb25zdCBjaGFyICoqZG1fc291cmNlX25hbWVzOwotc3RhdGljIHN0cnVjdCBjbGsgKipkbV9zb3VyY2VfY2xvY2tzOwotCi1zdGF0aWMgc3BpbmxvY2tfdCBkbV90aW1lcl9sb2NrOwotCi0vKgotICogUmVhZHMgdGltZXIgcmVnaXN0ZXJzIGluIHBvc3RlZCBhbmQgbm9uLXBvc3RlZCBtb2RlLiBUaGUgcG9zdGVkIG1vZGUgYml0Ci0gKiBpcyBlbmNvZGVkIGluIHJlZy4gTm90ZSB0aGF0IGluIHBvc3RlZCBtb2RlIHdyaXRlIHBlbmRpbmcgYml0IG11c3QgYmUKLSAqIGNoZWNrZWQuIE90aGVyd2lzZSBhIHJlYWQgb2YgYSBub24gY29tcGxldGVkIHdyaXRlIHdpbGwgcHJvZHVjZSBhbiBlcnJvci4KKy8qKgorICogb21hcF9kbV90aW1lcl9yZWFkX3JlZyAtIHJlYWQgdGltZXIgcmVnaXN0ZXJzIGluIHBvc3RlZCBhbmQgbm9uLXBvc3RlZCBtb2RlCisgKiBAdGltZXI6ICAgICAgdGltZXIgcG9pbnRlciBvdmVyIHdoaWNoIHJlYWQgb3BlcmF0aW9uIHRvIHBlcmZvcm0KKyAqIEByZWc6ICAgICAgICBsb3dlc3QgYnl0ZSBob2xkcyB0aGUgcmVnaXN0ZXIgb2Zmc2V0CisgKgorICogVGhlIHBvc3RlZCBtb2RlIGJpdCBpcyBlbmNvZGVkIGluIHJlZy4gTm90ZSB0aGF0IGluIHBvc3RlZCBtb2RlIHdyaXRlCisgKiBwZW5kaW5nIGJpdCBtdXN0IGJlIGNoZWNrZWQuIE90aGVyd2lzZSBhIHJlYWQgb2YgYSBub24gY29tcGxldGVkIHdyaXRlCisgKiB3aWxsIHByb2R1Y2UgYW4gZXJyb3IuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdTMyIG9tYXBfZG1fdGltZXJfcmVhZF9yZWcoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1MzIgcmVnKQogewotCXJldHVybiBfX29tYXBfZG1fdGltZXJfcmVhZCh0aW1lci0+aW9fYmFzZSwgcmVnLCB0aW1lci0+cG9zdGVkKTsKKwlXQVJOX09OKChyZWcgJiAweGZmKSA8IF9PTUFQX1RJTUVSX1dBS0VVUF9FTl9PRkZTRVQpOworCXJldHVybiBfX29tYXBfZG1fdGltZXJfcmVhZCh0aW1lciwgcmVnLCB0aW1lci0+cG9zdGVkKTsKIH0KIAotLyoKLSAqIFdyaXRlcyB0aW1lciByZWdpc3RlcnMgaW4gcG9zdGVkIGFuZCBub24tcG9zdGVkIG1vZGUuIFRoZSBwb3N0ZWQgbW9kZSBiaXQKLSAqIGlzIGVuY29kZWQgaW4gcmVnLiBOb3RlIHRoYXQgaW4gcG9zdGVkIG1vZGUgdGhlIHdyaXRlIHBlbmRpbmcgYml0IG11c3QgYmUKLSAqIGNoZWNrZWQuIE90aGVyd2lzZSBhIHdyaXRlIG9uIGEgcmVnaXN0ZXIgd2hpY2ggaGFzIGEgcGVuZGluZyB3cml0ZSB3aWxsIGJlCi0gKiBsb3N0LgorLyoqCisgKiBvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyAtIHdyaXRlIHRpbWVyIHJlZ2lzdGVycyBpbiBwb3N0ZWQgYW5kIG5vbi1wb3N0ZWQgbW9kZQorICogQHRpbWVyOiAgICAgIHRpbWVyIHBvaW50ZXIgb3ZlciB3aGljaCB3cml0ZSBvcGVyYXRpb24gaXMgdG8gcGVyZm9ybQorICogQHJlZzogICAgICAgIGxvd2VzdCBieXRlIGhvbGRzIHRoZSByZWdpc3RlciBvZmZzZXQKKyAqIEB2YWx1ZTogICAgICBkYXRhIHRvIHdyaXRlIGludG8gdGhlIHJlZ2lzdGVyCisgKgorICogVGhlIHBvc3RlZCBtb2RlIGJpdCBpcyBlbmNvZGVkIGluIHJlZy4gTm90ZSB0aGF0IGluIHBvc3RlZCBtb2RlIHRoZSB3cml0ZQorICogcGVuZGluZyBiaXQgbXVzdCBiZSBjaGVja2VkLiBPdGhlcndpc2UgYSB3cml0ZSBvbiBhIHJlZ2lzdGVyIHdoaWNoIGhhcyBhCisgKiBwZW5kaW5nIHdyaXRlIHdpbGwgYmUgbG9zdC4KICAqLwogc3RhdGljIHZvaWQgb21hcF9kbV90aW1lcl93cml0ZV9yZWcoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1MzIgcmVnLAogCQkJCQkJdTMyIHZhbHVlKQogewotCV9fb21hcF9kbV90aW1lcl93cml0ZSh0aW1lci0+aW9fYmFzZSwgcmVnLCB2YWx1ZSwgdGltZXItPnBvc3RlZCk7CisJV0FSTl9PTigocmVnICYgMHhmZikgPCBfT01BUF9USU1FUl9XQUtFVVBfRU5fT0ZGU0VUKTsKKwlfX29tYXBfZG1fdGltZXJfd3JpdGUodGltZXIsIHJlZywgdmFsdWUsIHRpbWVyLT5wb3N0ZWQpOworfQorCitzdGF0aWMgdm9pZCBvbWFwX3RpbWVyX3Jlc3RvcmVfY29udGV4dChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCit7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfT0NQX0NGR19PRkZTRVQsCisJCQkJdGltZXItPmNvbnRleHQudGlvY3BfY2ZnKTsKKwlpZiAodGltZXItPnJldmlzaW9uID4gMSkKKwkJX19yYXdfd3JpdGVsKHRpbWVyLT5jb250ZXh0LnRpc3RhdCwgdGltZXItPnN5c19zdGF0KTsKKworCV9fcmF3X3dyaXRlbCh0aW1lci0+Y29udGV4dC50aXNyLCB0aW1lci0+aXJxX3N0YXQpOworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX1dBS0VVUF9FTl9SRUcsCisJCQkJdGltZXItPmNvbnRleHQudHdlcik7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ09VTlRFUl9SRUcsCisJCQkJdGltZXItPmNvbnRleHQudGNycik7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfTE9BRF9SRUcsCisJCQkJdGltZXItPmNvbnRleHQudGxkcik7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfTUFUQ0hfUkVHLAorCQkJCXRpbWVyLT5jb250ZXh0LnRtYXIpOworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0lGX0NUUkxfUkVHLAorCQkJCXRpbWVyLT5jb250ZXh0LnRzaWNyKTsKKwlfX3Jhd193cml0ZWwodGltZXItPmNvbnRleHQudGllciwgdGltZXItPmlycV9lbmEpOworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLAorCQkJCXRpbWVyLT5jb250ZXh0LnRjbHIpOwogfQogCiBzdGF0aWMgdm9pZCBvbWFwX2RtX3RpbWVyX3dhaXRfZm9yX3Jlc2V0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKIHsKIAlpbnQgYzsKIAorCWlmICghdGltZXItPnN5c19zdGF0KQorCQlyZXR1cm47CisKIAljID0gMDsKLQl3aGlsZSAoIShvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX1NZU19TVEFUX1JFRykgJiAxKSkgeworCXdoaWxlICghKF9fcmF3X3JlYWRsKHRpbWVyLT5zeXNfc3RhdCkgJiAxKSkgewogCQljKys7CiAJCWlmIChjID4gMTAwMDAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlRpbWVyIGZhaWxlZCB0byByZXNldFxuIik7CkBAIC0yMDEsNTMgKzEyMCw2NSBAQAogCiBzdGF0aWMgdm9pZCBvbWFwX2RtX3RpbWVyX3Jlc2V0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKIHsKLQlpbnQgYXV0b2lkbGUgPSAwLCB3YWtldXAgPSAwOwotCi0JaWYgKCFjcHVfY2xhc3NfaXNfb21hcDIoKSB8fCB0aW1lciAhPSAmZG1fdGltZXJzWzBdKSB7CisJb21hcF9kbV90aW1lcl9lbmFibGUodGltZXIpOworCWlmICh0aW1lci0+cGRldi0+aWQgIT0gMSkgewogCQlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9JRl9DVFJMX1JFRywgMHgwNik7CiAJCW9tYXBfZG1fdGltZXJfd2FpdF9mb3JfcmVzZXQodGltZXIpOwogCX0KLQlvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2UodGltZXIsIE9NQVBfVElNRVJfU1JDXzMyX0tIWik7CiAKLQkvKiBFbmFibGUgYXV0b2lkbGUgb24gT01BUDIrICovCi0JaWYgKGNwdV9jbGFzc19pc19vbWFwMigpKQotCQlhdXRvaWRsZSA9IDE7Ci0KLQkvKgotCSAqIEVuYWJsZSB3YWtlLXVwIG9uIE9NQVAyIENQVXMuCi0JICovCi0JaWYgKGNwdV9jbGFzc19pc19vbWFwMigpKQotCQl3YWtldXAgPSAxOwotCi0JX19vbWFwX2RtX3RpbWVyX3Jlc2V0KHRpbWVyLT5pb19iYXNlLCBhdXRvaWRsZSwgd2FrZXVwKTsKKwlfX29tYXBfZG1fdGltZXJfcmVzZXQodGltZXIsIDAsIDApOworCW9tYXBfZG1fdGltZXJfZGlzYWJsZSh0aW1lcik7CiAJdGltZXItPnBvc3RlZCA9IDE7CiB9CiAKLXZvaWQgb21hcF9kbV90aW1lcl9wcmVwYXJlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK2ludCBvbWFwX2RtX3RpbWVyX3ByZXBhcmUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewotCW9tYXBfZG1fdGltZXJfZW5hYmxlKHRpbWVyKTsKLQlvbWFwX2RtX3RpbWVyX3Jlc2V0KHRpbWVyKTsKKwlzdHJ1Y3QgZG10aW1lcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHRpbWVyLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0OworCisJdGltZXItPmZjbGsgPSBjbGtfZ2V0KCZ0aW1lci0+cGRldi0+ZGV2LCAiZmNrIik7CisJaWYgKFdBUk5fT05fT05DRShJU19FUlJfT1JfTlVMTCh0aW1lci0+ZmNsaykpKSB7CisJCXRpbWVyLT5mY2xrID0gTlVMTDsKKwkJZGV2X2VycigmdGltZXItPnBkZXYtPmRldiwgIjogTm8gZmNsayBoYW5kbGUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBkYXRhLT5uZWVkc19tYW51YWxfcmVzZXQpCisJCW9tYXBfZG1fdGltZXJfcmVzZXQodGltZXIpOworCisJcmV0ID0gb21hcF9kbV90aW1lcl9zZXRfc291cmNlKHRpbWVyLCBPTUFQX1RJTUVSX1NSQ18zMl9LSFopOworCisJdGltZXItPnBvc3RlZCA9IDE7CisJcmV0dXJuIHJldDsKIH0KIAogc3RydWN0IG9tYXBfZG1fdGltZXIgKm9tYXBfZG1fdGltZXJfcmVxdWVzdCh2b2lkKQogewotCXN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciA9IE5VTEw7CisJc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyID0gTlVMTCwgKnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IGRtX3RpbWVyX2NvdW50OyBpKyspIHsKLQkJaWYgKGRtX3RpbWVyc1tpXS5yZXNlcnZlZCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZvbWFwX3RpbWVyX2xpc3QsIG5vZGUpIHsKKwkJaWYgKHQtPnJlc2VydmVkKQogCQkJY29udGludWU7CiAKLQkJdGltZXIgPSAmZG1fdGltZXJzW2ldOworCQl0aW1lciA9IHQ7CiAJCXRpbWVyLT5yZXNlcnZlZCA9IDE7CiAJCWJyZWFrOwogCX0KKworCWlmICh0aW1lcikgeworCQlyZXQgPSBvbWFwX2RtX3RpbWVyX3ByZXBhcmUodGltZXIpOworCQlpZiAocmV0KSB7CisJCQl0aW1lci0+cmVzZXJ2ZWQgPSAwOworCQkJdGltZXIgPSBOVUxMOworCQl9CisJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKIAotCWlmICh0aW1lciAhPSBOVUxMKQotCQlvbWFwX2RtX3RpbWVyX3ByZXBhcmUodGltZXIpOworCWlmICghdGltZXIpCisJCXByX2RlYnVnKCIlczogdGltZXIgcmVxdWVzdCBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gdGltZXI7CiB9CkBAIC0yNTUsNzQgKzE4Niw2NSBAQAogCiBzdHJ1Y3Qgb21hcF9kbV90aW1lciAqb21hcF9kbV90aW1lcl9yZXF1ZXN0X3NwZWNpZmljKGludCBpZCkKIHsKLQlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXI7CisJc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyID0gTlVMTCwgKnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7Ci0JaWYgKGlkIDw9IDAgfHwgaWQgPiBkbV90aW1lcl9jb3VudCB8fCBkbV90aW1lcnNbaWQtMV0ucmVzZXJ2ZWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1fdGltZXJfbG9jaywgZmxhZ3MpOwotCQlwcmludGsoIkJVRzogd2FybmluZyBhdCAlczolZC8lcygpOiB1bmFibGUgdG8gZ2V0IHRpbWVyICVkXG4iLAotCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywgaWQpOwotCQlkdW1wX3N0YWNrKCk7Ci0JCXJldHVybiBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm9tYXBfdGltZXJfbGlzdCwgbm9kZSkgeworCQlpZiAodC0+cGRldi0+aWQgPT0gaWQgJiYgIXQtPnJlc2VydmVkKSB7CisJCQl0aW1lciA9IHQ7CisJCQl0aW1lci0+cmVzZXJ2ZWQgPSAxOworCQkJYnJlYWs7CisJCX0KIAl9CiAKLQl0aW1lciA9ICZkbV90aW1lcnNbaWQtMV07Ci0JdGltZXItPnJlc2VydmVkID0gMTsKKwlpZiAodGltZXIpIHsKKwkJcmV0ID0gb21hcF9kbV90aW1lcl9wcmVwYXJlKHRpbWVyKTsKKwkJaWYgKHJldCkgeworCQkJdGltZXItPnJlc2VydmVkID0gMDsKKwkJCXRpbWVyID0gTlVMTDsKKwkJfQorCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CiAKLQlvbWFwX2RtX3RpbWVyX3ByZXBhcmUodGltZXIpOworCWlmICghdGltZXIpCisJCXByX2RlYnVnKCIlczogdGltZXIlZCByZXF1ZXN0IGZhaWxlZCFcbiIsIF9fZnVuY19fLCBpZCk7CiAKIAlyZXR1cm4gdGltZXI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3JlcXVlc3Rfc3BlY2lmaWMpOwogCi12b2lkIG9tYXBfZG1fdGltZXJfZnJlZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCitpbnQgb21hcF9kbV90aW1lcl9mcmVlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKIHsKLQlvbWFwX2RtX3RpbWVyX2VuYWJsZSh0aW1lcik7Ci0Jb21hcF9kbV90aW1lcl9yZXNldCh0aW1lcik7Ci0Jb21hcF9kbV90aW1lcl9kaXNhYmxlKHRpbWVyKTsKKwlpZiAodW5saWtlbHkoIXRpbWVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbGtfcHV0KHRpbWVyLT5mY2xrKTsKIAogCVdBUk5fT04oIXRpbWVyLT5yZXNlcnZlZCk7CiAJdGltZXItPnJlc2VydmVkID0gMDsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfZnJlZSk7CiAKIHZvaWQgb21hcF9kbV90aW1lcl9lbmFibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewotCWlmICh0aW1lci0+ZW5hYmxlZCkKLQkJcmV0dXJuOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDJQTFVTCi0JaWYgKGNwdV9jbGFzc19pc19vbWFwMigpKSB7Ci0JCWNsa19lbmFibGUodGltZXItPmZjbGspOwotCQljbGtfZW5hYmxlKHRpbWVyLT5pY2xrKTsKLQl9Ci0jZW5kaWYKLQotCXRpbWVyLT5lbmFibGVkID0gMTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKCZ0aW1lci0+cGRldi0+ZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfZW5hYmxlKTsKIAogdm9pZCBvbWFwX2RtX3RpbWVyX2Rpc2FibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewotCWlmICghdGltZXItPmVuYWJsZWQpCi0JCXJldHVybjsKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyUExVUwotCWlmIChjcHVfY2xhc3NfaXNfb21hcDIoKSkgewotCQljbGtfZGlzYWJsZSh0aW1lci0+aWNsayk7Ci0JCWNsa19kaXNhYmxlKHRpbWVyLT5mY2xrKTsKLQl9Ci0jZW5kaWYKLQotCXRpbWVyLT5lbmFibGVkID0gMDsKKwlwbV9ydW50aW1lX3B1dCgmdGltZXItPnBkZXYtPmRldik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX2Rpc2FibGUpOwogCiBpbnQgb21hcF9kbV90aW1lcl9nZXRfaXJxKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKIHsKLQlyZXR1cm4gdGltZXItPmlycTsKKwlpZiAodGltZXIpCisJCXJldHVybiB0aW1lci0+aXJxOworCXJldHVybiAtRUlOVkFMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9nZXRfaXJxKTsKIApAQCAtMzM0LDI0ICsyNTYsMjkgQEAKICAqLwogX191MzIgb21hcF9kbV90aW1lcl9tb2RpZnlfaWRsZWN0X21hc2soX191MzIgaW5wdXRtYXNrKQogewotCWludCBpOworCWludCBpID0gMDsKKwlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBJZiBBUk1YT1IgY2Fubm90IGJlIGlkbGVkIHRoaXMgZnVuY3Rpb24gY2FsbCBpcyB1bm5lY2Vzc2FyeSAqLwogCWlmICghKGlucHV0bWFzayAmICgxIDw8IDEpKSkKIAkJcmV0dXJuIGlucHV0bWFzazsKIAogCS8qIElmIGFueSBhY3RpdmUgdGltZXIgaXMgdXNpbmcgQVJNWE9SIHJldHVybiBtb2RpZmllZCBtYXNrICovCi0JZm9yIChpID0gMDsgaSA8IGRtX3RpbWVyX2NvdW50OyBpKyspIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fdGltZXJfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIsICZvbWFwX3RpbWVyX2xpc3QsIG5vZGUpIHsKIAkJdTMyIGw7CiAKLQkJbCA9IG9tYXBfZG1fdGltZXJfcmVhZF9yZWcoJmRtX3RpbWVyc1tpXSwgT01BUF9USU1FUl9DVFJMX1JFRyk7CisJCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKIAkJaWYgKGwgJiBPTUFQX1RJTUVSX0NUUkxfU1QpIHsKIAkJCWlmICgoKG9tYXBfcmVhZGwoTU9EX0NPTkZfQ1RSTF8xKSA+PiAoaSAqIDIpKSAmIDB4MDMpID09IDApCiAJCQkJaW5wdXRtYXNrICY9IH4oMSA8PCAxKTsKIAkJCWVsc2UKIAkJCQlpbnB1dG1hc2sgJj0gfigxIDw8IDIpOwogCQl9CisJCWkrKzsKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1fdGltZXJfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIGlucHV0bWFzazsKIH0KQEAgLTM2MSw3ICsyODgsOSBAQAogCiBzdHJ1Y3QgY2xrICpvbWFwX2RtX3RpbWVyX2dldF9mY2xrKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKIHsKLQlyZXR1cm4gdGltZXItPmZjbGs7CisJaWYgKHRpbWVyKQorCQlyZXR1cm4gdGltZXItPmZjbGs7CisJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX2dldF9mY2xrKTsKIApAQCAtMzc1LDcwICszMDQsOTEgQEAKIAogI2VuZGlmCiAKLXZvaWQgb21hcF9kbV90aW1lcl90cmlnZ2VyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK2ludCBvbWFwX2RtX3RpbWVyX3RyaWdnZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogeworCWlmICh1bmxpa2VseSghdGltZXIgfHwgcG1fcnVudGltZV9zdXNwZW5kZWQoJnRpbWVyLT5wZGV2LT5kZXYpKSkgeworCQlwcl9lcnIoIiVzOiB0aW1lciBub3QgYXZhaWxhYmxlIG9yIGVuYWJsZWQuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX1RSSUdHRVJfUkVHLCAwKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfdHJpZ2dlcik7CiAKLXZvaWQgb21hcF9kbV90aW1lcl9zdGFydChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCitpbnQgb21hcF9kbV90aW1lcl9zdGFydChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCiB7CiAJdTMyIGw7CiAKKwlpZiAodW5saWtlbHkoIXRpbWVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbWFwX2RtX3RpbWVyX2VuYWJsZSh0aW1lcik7CisKKwlpZiAodGltZXItPmxvc2VzX2NvbnRleHQpIHsKKwkJdTMyIGN0eF9sb3NzX2NudF9hZnRlciA9CisJCQl0aW1lci0+Z2V0X2NvbnRleHRfbG9zc19jb3VudCgmdGltZXItPnBkZXYtPmRldik7CisJCWlmIChjdHhfbG9zc19jbnRfYWZ0ZXIgIT0gdGltZXItPmN0eF9sb3NzX2NvdW50KQorCQkJb21hcF90aW1lcl9yZXN0b3JlX2NvbnRleHQodGltZXIpOworCX0KKwogCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKIAlpZiAoIShsICYgT01BUF9USU1FUl9DVFJMX1NUKSkgewogCQlsIHw9IE9NQVBfVElNRVJfQ1RSTF9TVDsKIAkJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOwogCX0KKworCS8qIFNhdmUgdGhlIGNvbnRleHQgKi8KKwl0aW1lci0+Y29udGV4dC50Y2xyID0gbDsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfc3RhcnQpOwogCi12b2lkIG9tYXBfZG1fdGltZXJfc3RvcChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCitpbnQgb21hcF9kbV90aW1lcl9zdG9wKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKIHsKIAl1bnNpZ25lZCBsb25nIHJhdGUgPSAwOworCXN0cnVjdCBkbXRpbWVyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdGltZXItPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDJQTFVTCi0JcmF0ZSA9IGNsa19nZXRfcmF0ZSh0aW1lci0+ZmNsayk7Ci0jZW5kaWYKKwlpZiAodW5saWtlbHkoIXRpbWVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlfX29tYXBfZG1fdGltZXJfc3RvcCh0aW1lci0+aW9fYmFzZSwgdGltZXItPnBvc3RlZCwgcmF0ZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3N0b3ApOworCWlmICghcGRhdGEtPm5lZWRzX21hbnVhbF9yZXNldCkKKwkJcmF0ZSA9IGNsa19nZXRfcmF0ZSh0aW1lci0+ZmNsayk7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQotCi1pbnQgb21hcF9kbV90aW1lcl9zZXRfc291cmNlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHNvdXJjZSkKLXsKLQlpbnQgbiA9ICh0aW1lciAtIGRtX3RpbWVycykgPDwgMTsKLQl1MzIgbDsKLQotCWwgPSBvbWFwX3JlYWRsKE1PRF9DT05GX0NUUkxfMSkgJiB+KDB4MDMgPDwgbik7Ci0JbCB8PSBzb3VyY2UgPDwgbjsKLQlvbWFwX3dyaXRlbChsLCBNT0RfQ09ORl9DVFJMXzEpOworCV9fb21hcF9kbV90aW1lcl9zdG9wKHRpbWVyLCB0aW1lci0+cG9zdGVkLCByYXRlKTsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9zZXRfc291cmNlKTsKLQotI2Vsc2UKK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfc3RvcCk7CiAKIGludCBvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2Uoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgc291cmNlKQogeworCWludCByZXQ7CisJc3RydWN0IGRtdGltZXJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlpZiAodW5saWtlbHkoIXRpbWVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZGF0YSA9IHRpbWVyLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwogCWlmIChzb3VyY2UgPCAwIHx8IHNvdXJjZSA+PSAzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBfX29tYXBfZG1fdGltZXJfc2V0X3NvdXJjZSh0aW1lci0+ZmNsaywKLQkJCQkJCWRtX3NvdXJjZV9jbG9ja3Nbc291cmNlXSk7CisJcmV0ID0gcGRhdGEtPnNldF90aW1lcl9zcmModGltZXItPnBkZXYsIHNvdXJjZSk7CisKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9zZXRfc291cmNlKTsKIAotI2VuZGlmCi0KLXZvaWQgb21hcF9kbV90aW1lcl9zZXRfbG9hZChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBhdXRvcmVsb2FkLAoraW50IG9tYXBfZG1fdGltZXJfc2V0X2xvYWQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgYXV0b3JlbG9hZCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgbG9hZCkKIHsKIAl1MzIgbDsKIAorCWlmICh1bmxpa2VseSghdGltZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBfZG1fdGltZXJfZW5hYmxlKHRpbWVyKTsKIAlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CiAJaWYgKGF1dG9yZWxvYWQpCiAJCWwgfD0gT01BUF9USU1FUl9DVFJMX0FSOwpAQCAtNDQ4LDE1ICszOTgsMzIgQEAKIAlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9MT0FEX1JFRywgbG9hZCk7CiAKIAlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9UUklHR0VSX1JFRywgMCk7CisJLyogU2F2ZSB0aGUgY29udGV4dCAqLworCXRpbWVyLT5jb250ZXh0LnRjbHIgPSBsOworCXRpbWVyLT5jb250ZXh0LnRsZHIgPSBsb2FkOworCW9tYXBfZG1fdGltZXJfZGlzYWJsZSh0aW1lcik7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3NldF9sb2FkKTsKIAogLyogT3B0aW1pemVkIHNldF9sb2FkIHdoaWNoIHJlbW92ZXMgY29zdGx5IHNwaW4gd2FpdCBpbiB0aW1lcl9zdGFydCAqLwotdm9pZCBvbWFwX2RtX3RpbWVyX3NldF9sb2FkX3N0YXJ0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGF1dG9yZWxvYWQsCitpbnQgb21hcF9kbV90aW1lcl9zZXRfbG9hZF9zdGFydChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBhdXRvcmVsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsb2FkKQogewogCXUzMiBsOwogCisJaWYgKHVubGlrZWx5KCF0aW1lcikpCisJCXJldHVybiAtRUlOVkFMOworCisJb21hcF9kbV90aW1lcl9lbmFibGUodGltZXIpOworCisJaWYgKHRpbWVyLT5sb3Nlc19jb250ZXh0KSB7CisJCXUzMiBjdHhfbG9zc19jbnRfYWZ0ZXIgPQorCQkJdGltZXItPmdldF9jb250ZXh0X2xvc3NfY291bnQoJnRpbWVyLT5wZGV2LT5kZXYpOworCQlpZiAoY3R4X2xvc3NfY250X2FmdGVyICE9IHRpbWVyLT5jdHhfbG9zc19jb3VudCkKKwkJCW9tYXBfdGltZXJfcmVzdG9yZV9jb250ZXh0KHRpbWVyKTsKKwl9CisKIAlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CiAJaWYgKGF1dG9yZWxvYWQpIHsKIAkJbCB8PSBPTUFQX1RJTUVSX0NUUkxfQVI7CkBAIC00NjYsMTUgKzQzMywyNSBAQAogCX0KIAlsIHw9IE9NQVBfVElNRVJfQ1RSTF9TVDsKIAotCV9fb21hcF9kbV90aW1lcl9sb2FkX3N0YXJ0KHRpbWVyLT5pb19iYXNlLCBsLCBsb2FkLCB0aW1lci0+cG9zdGVkKTsKKwlfX29tYXBfZG1fdGltZXJfbG9hZF9zdGFydCh0aW1lciwgbCwgbG9hZCwgdGltZXItPnBvc3RlZCk7CisKKwkvKiBTYXZlIHRoZSBjb250ZXh0ICovCisJdGltZXItPmNvbnRleHQudGNsciA9IGw7CisJdGltZXItPmNvbnRleHQudGxkciA9IGxvYWQ7CisJdGltZXItPmNvbnRleHQudGNyciA9IGxvYWQ7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3NldF9sb2FkX3N0YXJ0KTsKIAotdm9pZCBvbWFwX2RtX3RpbWVyX3NldF9tYXRjaChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBlbmFibGUsCitpbnQgb21hcF9kbV90aW1lcl9zZXRfbWF0Y2goc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgZW5hYmxlLAogCQkJICAgICB1bnNpZ25lZCBpbnQgbWF0Y2gpCiB7CiAJdTMyIGw7CiAKKwlpZiAodW5saWtlbHkoIXRpbWVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbWFwX2RtX3RpbWVyX2VuYWJsZSh0aW1lcik7CiAJbCA9IG9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcpOwogCWlmIChlbmFibGUpCiAJCWwgfD0gT01BUF9USU1FUl9DVFJMX0NFOwpAQCAtNDgyLDE0ICs0NTksMjQgQEAKIAkJbCAmPSB+T01BUF9USU1FUl9DVFJMX0NFOwogCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBsKTsKIAlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9NQVRDSF9SRUcsIG1hdGNoKTsKKworCS8qIFNhdmUgdGhlIGNvbnRleHQgKi8KKwl0aW1lci0+Y29udGV4dC50Y2xyID0gbDsKKwl0aW1lci0+Y29udGV4dC50bWFyID0gbWF0Y2g7CisJb21hcF9kbV90aW1lcl9kaXNhYmxlKHRpbWVyKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfc2V0X21hdGNoKTsKIAotdm9pZCBvbWFwX2RtX3RpbWVyX3NldF9wd20oc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgZGVmX29uLAoraW50IG9tYXBfZG1fdGltZXJfc2V0X3B3bShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBkZWZfb24sCiAJCQkgICBpbnQgdG9nZ2xlLCBpbnQgdHJpZ2dlcikKIHsKIAl1MzIgbDsKIAorCWlmICh1bmxpa2VseSghdGltZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBfZG1fdGltZXJfZW5hYmxlKHRpbWVyKTsKIAlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CiAJbCAmPSB+KE9NQVBfVElNRVJfQ1RSTF9HUE9DRkcgfCBPTUFQX1RJTUVSX0NUUkxfU0NQV00gfAogCSAgICAgICBPTUFQX1RJTUVSX0NUUkxfUFQgfCAoMHgwMyA8PCAxMCkpOwpAQCAtNDk5LDEzICs0ODYsMjIgQEAKIAkJbCB8PSBPTUFQX1RJTUVSX0NUUkxfUFQ7CiAJbCB8PSB0cmlnZ2VyIDw8IDEwOwogCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBsKTsKKworCS8qIFNhdmUgdGhlIGNvbnRleHQgKi8KKwl0aW1lci0+Y29udGV4dC50Y2xyID0gbDsKKwlvbWFwX2RtX3RpbWVyX2Rpc2FibGUodGltZXIpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9zZXRfcHdtKTsKIAotdm9pZCBvbWFwX2RtX3RpbWVyX3NldF9wcmVzY2FsZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgcHJlc2NhbGVyKQoraW50IG9tYXBfZG1fdGltZXJfc2V0X3ByZXNjYWxlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBwcmVzY2FsZXIpCiB7CiAJdTMyIGw7CiAKKwlpZiAodW5saWtlbHkoIXRpbWVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbWFwX2RtX3RpbWVyX2VuYWJsZSh0aW1lcik7CiAJbCA9IG9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcpOwogCWwgJj0gfihPTUFQX1RJTUVSX0NUUkxfUFJFIHwgKDB4MDcgPDwgMikpOwogCWlmIChwcmVzY2FsZXIgPj0gMHgwMCAmJiBwcmVzY2FsZXIgPD0gMHgwNykgewpAQCAtNTEzLDEzICs1MDksMjggQEAKIAkJbCB8PSBwcmVzY2FsZXIgPDwgMjsKIAl9CiAJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOworCisJLyogU2F2ZSB0aGUgY29udGV4dCAqLworCXRpbWVyLT5jb250ZXh0LnRjbHIgPSBsOworCW9tYXBfZG1fdGltZXJfZGlzYWJsZSh0aW1lcik7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3NldF9wcmVzY2FsZXIpOwogCi12b2lkIG9tYXBfZG1fdGltZXJfc2V0X2ludF9lbmFibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLAoraW50IG9tYXBfZG1fdGltZXJfc2V0X2ludF9lbmFibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLAogCQkJCSAgdW5zaWduZWQgaW50IHZhbHVlKQogewotCV9fb21hcF9kbV90aW1lcl9pbnRfZW5hYmxlKHRpbWVyLT5pb19iYXNlLCB2YWx1ZSk7CisJaWYgKHVubGlrZWx5KCF0aW1lcikpCisJCXJldHVybiAtRUlOVkFMOworCisJb21hcF9kbV90aW1lcl9lbmFibGUodGltZXIpOworCV9fb21hcF9kbV90aW1lcl9pbnRfZW5hYmxlKHRpbWVyLCB2YWx1ZSk7CisKKwkvKiBTYXZlIHRoZSBjb250ZXh0ICovCisJdGltZXItPmNvbnRleHQudGllciA9IHZhbHVlOworCXRpbWVyLT5jb250ZXh0LnR3ZXIgPSB2YWx1ZTsKKwlvbWFwX2RtX3RpbWVyX2Rpc2FibGUodGltZXIpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9zZXRfaW50X2VuYWJsZSk7CiAKQEAgLTUyNyw0MCArNTM4LDYxIEBACiB7CiAJdW5zaWduZWQgaW50IGw7CiAKLQlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9TVEFUX1JFRyk7CisJaWYgKHVubGlrZWx5KCF0aW1lciB8fCBwbV9ydW50aW1lX3N1c3BlbmRlZCgmdGltZXItPnBkZXYtPmRldikpKSB7CisJCXByX2VycigiJXM6IHRpbWVyIG5vdCBhdmFpbGFibGUgb3IgZW5hYmxlZC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbCA9IF9fcmF3X3JlYWRsKHRpbWVyLT5pcnFfc3RhdCk7CiAKIAlyZXR1cm4gbDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfcmVhZF9zdGF0dXMpOwogCi12b2lkIG9tYXBfZG1fdGltZXJfd3JpdGVfc3RhdHVzKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IHZhbHVlKQoraW50IG9tYXBfZG1fdGltZXJfd3JpdGVfc3RhdHVzKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IHZhbHVlKQogewotCV9fb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXModGltZXItPmlvX2Jhc2UsIHZhbHVlKTsKKwlpZiAodW5saWtlbHkoIXRpbWVyIHx8IHBtX3J1bnRpbWVfc3VzcGVuZGVkKCZ0aW1lci0+cGRldi0+ZGV2KSkpCisJCXJldHVybiAtRUlOVkFMOworCisJX19vbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyh0aW1lciwgdmFsdWUpOworCS8qIFNhdmUgdGhlIGNvbnRleHQgKi8KKwl0aW1lci0+Y29udGV4dC50aXNyID0gdmFsdWU7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyk7CiAKIHVuc2lnbmVkIGludCBvbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCiB7Ci0JcmV0dXJuIF9fb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIodGltZXItPmlvX2Jhc2UsIHRpbWVyLT5wb3N0ZWQpOworCWlmICh1bmxpa2VseSghdGltZXIgfHwgcG1fcnVudGltZV9zdXNwZW5kZWQoJnRpbWVyLT5wZGV2LT5kZXYpKSkgeworCQlwcl9lcnIoIiVzOiB0aW1lciBub3QgaWF2YWlsYWJsZSBvciBlbmFibGVkLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gX19vbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcih0aW1lciwgdGltZXItPnBvc3RlZCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcik7CiAKLXZvaWQgb21hcF9kbV90aW1lcl93cml0ZV9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IHZhbHVlKQoraW50IG9tYXBfZG1fdGltZXJfd3JpdGVfY291bnRlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKKwlpZiAodW5saWtlbHkoIXRpbWVyIHx8IHBtX3J1bnRpbWVfc3VzcGVuZGVkKCZ0aW1lci0+cGRldi0+ZGV2KSkpIHsKKwkJcHJfZXJyKCIlczogdGltZXIgbm90IGF2YWlsYWJsZSBvciBlbmFibGVkLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DT1VOVEVSX1JFRywgdmFsdWUpOworCisJLyogU2F2ZSB0aGUgY29udGV4dCAqLworCXRpbWVyLT5jb250ZXh0LnRjcnIgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfd3JpdGVfY291bnRlcik7CiAKIGludCBvbWFwX2RtX3RpbWVyc19hY3RpdmUodm9pZCkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZG1fdGltZXJfY291bnQ7IGkrKykgewotCQlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXI7Ci0KLQkJdGltZXIgPSAmZG1fdGltZXJzW2ldOwotCi0JCWlmICghdGltZXItPmVuYWJsZWQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lciwgJm9tYXBfdGltZXJfbGlzdCwgbm9kZSkgeworCQlpZiAoIXRpbWVyLT5yZXNlcnZlZCkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKSAmCkBAIC01NzIsNjkgKzYwNCwxNDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJzX2FjdGl2ZSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfZG1fdGltZXJfaW5pdCh2b2lkKQorLyoqCisgKiBvbWFwX2RtX3RpbWVyX3Byb2JlIC0gcHJvYmUgZnVuY3Rpb24gY2FsbGVkIGZvciBldmVyeSByZWdpc3RlcmVkIGRldmljZQorICogQHBkZXY6CXBvaW50ZXIgdG8gY3VycmVudCB0aW1lciBwbGF0Zm9ybSBkZXZpY2UKKyAqCisgKiBDYWxsZWQgYnkgZHJpdmVyIGZyYW1ld29yayBhdCB0aGUgZW5kIG9mIGRldmljZSByZWdpc3RyYXRpb24gZm9yIGFsbAorICogdGltZXIgZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgb21hcF9kbV90aW1lcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXI7Ci0JaW50IGksIG1hcF9zaXplID0gU1pfOEs7CS8qIE1vZHVsZSA0S0IgKyBMNCA0S0IgZXhjZXB0IG9uIG9tYXAxICovCisJc3RydWN0IHJlc291cmNlICptZW0sICppcnEsICppb2FyZWE7CisJc3RydWN0IGRtdGltZXJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCWlmICghKGNwdV9pc19vbWFwMTZ4eCgpIHx8IGNwdV9jbGFzc19pc19vbWFwMigpKSkKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBubyBwbGF0Zm9ybSBkYXRhLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKLQotCXNwaW5fbG9ja19pbml0KCZkbV90aW1lcl9sb2NrKTsKLQotCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewotCQlkbV90aW1lcnMgPSBvbWFwMV9kbV90aW1lcnM7Ci0JCWRtX3RpbWVyX2NvdW50ID0gb21hcDFfZG1fdGltZXJfY291bnQ7Ci0JCW1hcF9zaXplID0gU1pfMks7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQlkbV90aW1lcnMgPSBvbWFwMl9kbV90aW1lcnM7Ci0JCWRtX3RpbWVyX2NvdW50ID0gb21hcDJfZG1fdGltZXJfY291bnQ7Ci0JCWRtX3NvdXJjZV9uYW1lcyA9IG9tYXAyX2RtX3NvdXJjZV9uYW1lczsKLQkJZG1fc291cmNlX2Nsb2NrcyA9IG9tYXAyX2RtX3NvdXJjZV9jbG9ja3M7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSkgewotCQlkbV90aW1lcnMgPSBvbWFwM19kbV90aW1lcnM7Ci0JCWRtX3RpbWVyX2NvdW50ID0gb21hcDNfZG1fdGltZXJfY291bnQ7Ci0JCWRtX3NvdXJjZV9uYW1lcyA9IG9tYXAzX2RtX3NvdXJjZV9uYW1lczsKLQkJZG1fc291cmNlX2Nsb2NrcyA9IG9tYXAzX2RtX3NvdXJjZV9jbG9ja3M7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQlkbV90aW1lcnMgPSBvbWFwNF9kbV90aW1lcnM7Ci0JCWRtX3RpbWVyX2NvdW50ID0gb21hcDRfZG1fdGltZXJfY291bnQ7Ci0JCWRtX3NvdXJjZV9uYW1lcyA9IG9tYXA0X2RtX3NvdXJjZV9uYW1lczsKLQkJZG1fc291cmNlX2Nsb2NrcyA9IG9tYXA0X2RtX3NvdXJjZV9jbG9ja3M7CiAJfQogCi0JaWYgKGNwdV9jbGFzc19pc19vbWFwMigpKQotCQlmb3IgKGkgPSAwOyBkbV9zb3VyY2VfbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCQkJZG1fc291cmNlX2Nsb2Nrc1tpXSA9IGNsa19nZXQoTlVMTCwgZG1fc291cmNlX25hbWVzW2ldKTsKLQotCWlmIChjcHVfaXNfb21hcDI0M3goKSkKLQkJZG1fdGltZXJzWzBdLnBoeXNfYmFzZSA9IDB4NDkwMTgwMDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZG1fdGltZXJfY291bnQ7IGkrKykgewotCQl0aW1lciA9ICZkbV90aW1lcnNbaV07Ci0KLQkJLyogU3RhdGljIG1hcHBpbmcsIG5ldmVyIHJlbGVhc2VkICovCi0JCXRpbWVyLT5pb19iYXNlID0gaW9yZW1hcCh0aW1lci0+cGh5c19iYXNlLCBtYXBfc2l6ZSk7Ci0JCUJVR19PTighdGltZXItPmlvX2Jhc2UpOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDJQTFVTCi0JCWlmIChjcHVfY2xhc3NfaXNfb21hcDIoKSkgewotCQkJY2hhciBjbGtfbmFtZVsxNl07Ci0JCQlzcHJpbnRmKGNsa19uYW1lLCAiZ3B0JWRfaWNrIiwgaSArIDEpOwotCQkJdGltZXItPmljbGsgPSBjbGtfZ2V0KE5VTEwsIGNsa19uYW1lKTsKLQkJCXNwcmludGYoY2xrX25hbWUsICJncHQlZF9mY2siLCBpICsgMSk7Ci0JCQl0aW1lci0+ZmNsayA9IGNsa19nZXQoTlVMTCwgY2xrX25hbWUpOwotCQl9Ci0KLQkJLyogT25lIG9yIHR3byB0aW1lcnMgbWF5IGJlIHNldCB1cCBlYXJseSBmb3Igc3lzX3RpbWVyICovCi0JCWlmIChzeXNfdGltZXJfcmVzZXJ2ZWQgJiAoMSAgPDwgaSkpIHsKLQkJCXRpbWVyLT5yZXNlcnZlZCA9IDE7Ci0JCQl0aW1lci0+cG9zdGVkID0gMTsKLQkJfQotI2VuZGlmCisJaXJxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAodW5saWtlbHkoIWlycSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG5vIElSUSByZXNvdXJjZS5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAodW5saWtlbHkoIW1lbSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG5vIG1lbW9yeSByZXNvdXJjZS5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW9hcmVhID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSwKKwkJCXBkZXYtPm5hbWUpOworCWlmICghaW9hcmVhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiByZWdpb24gYWxyZWFkeSBjbGFpbWVkLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXRpbWVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfZG1fdGltZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRpbWVyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBubyBtZW1vcnkgZm9yIG9tYXBfZG1fdGltZXIuXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2lvcmVnaW9uOworCX0KKworCXRpbWVyLT5pb19iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCWlmICghdGltZXItPmlvX2Jhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGlvcmVtYXAgZmFpbGVkLlxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwl0aW1lci0+aWQgPSBwZGV2LT5pZDsKKwl0aW1lci0+aXJxID0gaXJxLT5zdGFydDsKKwl0aW1lci0+cmVzZXJ2ZWQgPSBwZGF0YS0+cmVzZXJ2ZWQ7CisJdGltZXItPnBkZXYgPSBwZGV2OworCXRpbWVyLT5sb3Nlc19jb250ZXh0ID0gcGRhdGEtPmxvc2VzX2NvbnRleHQ7CisJdGltZXItPmdldF9jb250ZXh0X2xvc3NfY291bnQgPSBwZGF0YS0+Z2V0X2NvbnRleHRfbG9zc19jb3VudDsKKworCS8qIFNraXAgcG1fcnVudGltZV9lbmFibGUgZm9yIE9NQVAxICovCisJaWYgKCFwZGF0YS0+bmVlZHNfbWFudWFsX3Jlc2V0KSB7CisJCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCQlwbV9ydW50aW1lX2lycV9zYWZlKCZwZGV2LT5kZXYpOworCX0KKworCWlmICghdGltZXItPnJlc2VydmVkKSB7CisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7CisJCV9fb21hcF9kbV90aW1lcl9pbml0X3JlZ3ModGltZXIpOworCQlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKKwl9CisKKwkvKiBhZGQgdGhlIHRpbWVyIGVsZW1lbnQgdG8gdGhlIGxpc3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fdGltZXJfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5ub2RlLCAmb21hcF90aW1lcl9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJEZXZpY2UgUHJvYmVkLlxuIik7CisKIAlyZXR1cm4gMDsKKworZXJyX2ZyZWVfbWVtOgorCWtmcmVlKHRpbWVyKTsKKworZXJyX2ZyZWVfaW9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CisKKwlyZXR1cm4gcmV0OwogfQogCi1hcmNoX2luaXRjYWxsKG9tYXBfZG1fdGltZXJfaW5pdCk7CisvKioKKyAqIG9tYXBfZG1fdGltZXJfcmVtb3ZlIC0gY2xlYW51cCBhIHJlZ2lzdGVyZWQgdGltZXIgZGV2aWNlCisgKiBAcGRldjoJcG9pbnRlciB0byBjdXJyZW50IHRpbWVyIHBsYXRmb3JtIGRldmljZQorICoKKyAqIENhbGxlZCBieSBkcml2ZXIgZnJhbWV3b3JrIHdoZW5ldmVyIGEgdGltZXIgZGV2aWNlIGlzIHVucmVnaXN0ZXJlZC4KKyAqIEluIGFkZGl0aW9uIHRvIGZyZWVpbmcgcGxhdGZvcm0gcmVzb3VyY2VzIGl0IGFsc28gZGVsZXRlcyB0aGUgdGltZXIKKyAqIGVudHJ5IGZyb20gdGhlIGxvY2FsIGxpc3QuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IG9tYXBfZG1fdGltZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fdGltZXJfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIsICZvbWFwX3RpbWVyX2xpc3QsIG5vZGUpCisJCWlmICh0aW1lci0+cGRldi0+aWQgPT0gcGRldi0+aWQpIHsKKwkJCWxpc3RfZGVsKCZ0aW1lci0+bm9kZSk7CisJCQlrZnJlZSh0aW1lcik7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2RtX3RpbWVyX2RyaXZlciA9IHsKKwkucHJvYmUgID0gb21hcF9kbV90aW1lcl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aob21hcF9kbV90aW1lcl9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgPSAib21hcF90aW1lciIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfZG1fdGltZXJfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwX2RtX3RpbWVyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX2RtX3RpbWVyX2RyaXZlcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfZG1fdGltZXJfZHJpdmVyKTsKK30KKworZWFybHlfcGxhdGZvcm1faW5pdCgiZWFybHl0aW1lciIsICZvbWFwX2RtX3RpbWVyX2RyaXZlcik7Cittb2R1bGVfaW5pdChvbWFwX2RtX3RpbWVyX2RyaXZlcl9pbml0KTsKK21vZHVsZV9leGl0KG9tYXBfZG1fdGltZXJfZHJpdmVyX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAgRHVhbC1Nb2RlIFRpbWVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSSVZFUl9OQU1FKTsKK01PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIEluYyIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2kyYy5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2kyYy5jCmluZGV4IDMzNDFjYTQuLmRiMDcxYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pMmMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMKQEAgLTEwOCw2ICsxMDgsMjIgQEAKIAlyZXNbMV0uc3RhcnQgPSBJTlRfSTJDOwogCXBkYXRhID0gJmkyY19wZGF0YVtidXNfaWQgLSAxXTsKIAorCS8qIGFsbCBPTUFQMSBoYXZlIElQIHZlcnNpb24gMSByZWdpc3RlciBzZXQgKi8KKwlwZGF0YS0+cmV2ID0gT01BUF9JMkNfSVBfVkVSU0lPTl8xOworCisJLyogYWxsIE9NQVAxIEkyQyBhcmUgaW1wbGVtZW50ZWQgbGlrZSB0aGlzICovCisJcGRhdGEtPmZsYWdzID0gT01BUF9JMkNfRkxBR19OT19GSUZPIHwKKwkJICAgICAgIE9NQVBfSTJDX0ZMQUdfU0lNUExFX0NMT0NLIHwKKwkJICAgICAgIE9NQVBfSTJDX0ZMQUdfMTZCSVRfREFUQV9SRUcgfAorCQkgICAgICAgT01BUF9JMkNfRkxBR19BTFdBWVNfQVJNWE9SX0NMSzsKKworCS8qIGhvdyB0aGUgY3B1IGJ1cyBpcyB3aXJlZCB1cCBkaWZmZXJzIGZvciA3eHggb25seSAqLworCisJaWYgKGNwdV9pc19vbWFwN3h4KCkpCisJCXBkYXRhLT5mbGFncyB8PSBPTUFQX0kyQ19GTEFHX0JVU19TSElGVF8xOworCWVsc2UKKwkJcGRhdGEtPmZsYWdzIHw9IE9NQVBfSTJDX0ZMQUdfQlVTX1NISUZUXzI7CisKIAlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBkZXYpOwogfQogCkBAIC0xMjMsMjEgKzEzOSwxNCBAQAogCW9tYXBfcG1fc2V0X21heF9tcHVfd2FrZXVwX2xhdChkZXYsIHQpOwogfQogCi1zdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgb21hcF9pMmNfbGF0ZW5jeVtdID0gewotCVswXSA9IHsKLQkJLmRlYWN0aXZhdGVfZnVuYwk9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAotCQkuYWN0aXZhdGVfZnVuYwkJPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MJCQk9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLX07Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG9tYXAyX2kyY19hZGRfYnVzKGludCBidXNfaWQpCiB7CiAJaW50IGw7CiAJc3RydWN0IG9tYXBfaHdtb2QgKm9oOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAljaGFyIG9oX25hbWVbTUFYX09NQVBfSTJDX0hXTU9EX05BTUVfTEVOXTsKIAlzdHJ1Y3Qgb21hcF9pMmNfYnVzX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBvbWFwX2kyY19kZXZfYXR0ciAqZGV2X2F0dHI7CiAKIAlvbWFwMl9pMmNfbXV4X3BpbnMoYnVzX2lkKTsKIApAQCAtMTUyLDYgKzE2MSwxNiBAQAogCiAJcGRhdGEgPSAmaTJjX3BkYXRhW2J1c19pZCAtIDFdOwogCS8qCisJICogcGFzcyB0aGUgaHdtb2QgY2xhc3MncyBDUFUtc3BlY2lmaWMga25vd2xlZGdlIG9mIEkyQyBJUCByZXZpc2lvbiBpbgorCSAqIHVzZSwgYW5kIGZ1bmN0aW9uYWxpdHkgaW1wbGVtZW50YXRpb24gZmxhZ3MsIHVwIHRvIHRoZSBPTUFQIEkyQworCSAqIGRyaXZlciB2aWEgcGxhdGZvcm0gZGF0YQorCSAqLworCXBkYXRhLT5yZXYgPSBvaC0+Y2xhc3MtPnJldjsKKworCWRldl9hdHRyID0gKHN0cnVjdCBvbWFwX2kyY19kZXZfYXR0ciAqKW9oLT5kZXZfYXR0cjsKKwlwZGF0YS0+ZmxhZ3MgPSBkZXZfYXR0ci0+ZmxhZ3M7CisKKwkvKgogCSAqIFdoZW4gd2FpdGluZyBmb3IgY29tcGxldGlvbiBvZiBhIGkyYyB0cmFuc2Zlciwgd2UgbmVlZCB0bwogCSAqIHNldCBhIHdha2UgdXAgbGF0ZW5jeSBjb25zdHJhaW50IGZvciB0aGUgTVBVLiBUaGlzIGlzIHRvCiAJICogZW5zdXJlIHF1aWNrIGVub3VnaCB3YWtldXAgZnJvbSBpZGxlLCB3aGVuIHRyYW5zZmVyCkBAIC0xNjAsMTIgKzE3OSwxMiBAQAogCSAqLwogCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKIAkJcGRhdGEtPnNldF9tcHVfd2t1cF9sYXQgPSBvbWFwX3BtX3NldF9tYXhfbXB1X3dha2V1cF9sYXRfY29tcGF0OwotCW9kID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgYnVzX2lkLCBvaCwgcGRhdGEsCisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIGJ1c19pZCwgb2gsIHBkYXRhLAogCQkJc2l6ZW9mKHN0cnVjdCBvbWFwX2kyY19idXNfcGxhdGZvcm1fZGF0YSksCi0JCQlvbWFwX2kyY19sYXRlbmN5LCBBUlJBWV9TSVpFKG9tYXBfaTJjX2xhdGVuY3kpLCAwKTsKLQlXQVJOKElTX0VSUihvZCksICJDb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzXG4iLCBuYW1lKTsKKwkJCU5VTEwsIDAsIDApOworCVdBUk4oSVNfRVJSKHBkZXYpLCAiQ291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlc1xuIiwgbmFtZSk7CiAKLQlyZXR1cm4gUFRSX0VSUihvZCk7CisJcmV0dXJuIFBUUl9SRVQocGRldik7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgb21hcDJfaTJjX2FkZF9idXMoaW50IGJ1c19pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY2xvY2suaAppbmRleCBkZjRiOTY4Li4xOTdjYTAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2Nsb2NrLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jbG9jay5oCkBAIC04MCw4ICs4MCw2IEBACiAgKgogICogQGRpdiBpcyB0aGUgZGl2aXNvciB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBwYXJlbnQgY2xvY2sncyByYXRlCiAgKiB0byBwcm9kdWNlIHRoZSBjdXJyZW50IGNsb2NrJ3MgcmF0ZS4KLSAqCi0gKiBYWFggQGZsYWdzIHByb2JhYmx5IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGFuIHN0cnVjdCBvbWFwX2NoaXAuCiAgKi8KIHN0cnVjdCBjbGtzZWxfcmF0ZSB7CiAJdTMyCQkJdmFsOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jb21tb24uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY29tbW9uLmgKaW5kZXggNDU2NGNjNi4uYzUwZGY0OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jb21tb24uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NvbW1vbi5oCkBAIC00NSw2ICs0NSwxOCBAQAogCiBleHRlcm4gdm9pZCBvbWFwX3Jlc2VydmUodm9pZCk7CiAKK3ZvaWQgb21hcDI0MjBfaW5pdF9lYXJseSh2b2lkKTsKK3ZvaWQgb21hcDI0MzBfaW5pdF9lYXJseSh2b2lkKTsKK3ZvaWQgb21hcDM0MzBfaW5pdF9lYXJseSh2b2lkKTsKK3ZvaWQgb21hcDM1eHhfaW5pdF9lYXJseSh2b2lkKTsKK3ZvaWQgb21hcDM2MzBfaW5pdF9lYXJseSh2b2lkKTsKK3ZvaWQgb21hcDNfaW5pdF9lYXJseSh2b2lkKTsJLyogRG8gbm90IHVzZSB0aGlzIG9uZSAqLwordm9pZCBhbTM1eHhfaW5pdF9lYXJseSh2b2lkKTsKK3ZvaWQgdGk4MTZ4X2luaXRfZWFybHkodm9pZCk7Cit2b2lkIG9tYXA0NDMwX2luaXRfZWFybHkodm9pZCk7CisKK3ZvaWQgb21hcF9zcmFtX2luaXQodm9pZCk7CisKIC8qCiAgKiBJTyBiYXNlcyBmb3IgdmFyaW91cyBPTUFQIHByb2Nlc3NvcnMKICAqIEV4Y2VwdCB0aGUgdGFwIGJhc2UsIHJlc3QgYWxsIHRoZSBpbyBiYXNlcwpAQCAtNTMsMTMgKzY1LDEzIEBACiBzdHJ1Y3Qgb21hcF9nbG9iYWxzIHsKIAl1MzIJCWNsYXNzOwkJLyogT01BUCBjbGFzcyB0byBkZXRlY3QgKi8KIAl2b2lkIF9faW9tZW0JKnRhcDsJCS8qIENvbnRyb2wgbW9kdWxlIElEIGNvZGUgKi8KLQl1bnNpZ25lZCBsb25nICAgc2RyYzsgICAgICAgICAgIC8qIFNEUkFNIENvbnRyb2xsZXIgKi8KLQl1bnNpZ25lZCBsb25nICAgc21zOyAgICAgICAgICAgIC8qIFNEUkFNIE1lbW9yeSBTY2hlZHVsZXIgKi8KLQl1bnNpZ25lZCBsb25nICAgY3RybDsgICAgICAgICAgIC8qIFN5c3RlbSBDb250cm9sIE1vZHVsZSAqLwotCXVuc2lnbmVkIGxvbmcgICBjdHJsX3BhZDsJLyogUEFEIENvbnRyb2wgTW9kdWxlICovCi0JdW5zaWduZWQgbG9uZyAgIHBybTsgICAgICAgICAgICAvKiBQb3dlciBhbmQgUmVzZXQgTWFuYWdlbWVudCAqLwotCXVuc2lnbmVkIGxvbmcgICBjbTsgICAgICAgICAgICAgLyogQ2xvY2sgTWFuYWdlbWVudCAqLwotCXVuc2lnbmVkIGxvbmcgICBjbTI7CisJdm9pZCBfX2lvbWVtCSpzZHJjOyAgICAgICAgICAgLyogU0RSQU0gQ29udHJvbGxlciAqLworCXZvaWQgX19pb21lbQkqc21zOyAgICAgICAgICAgIC8qIFNEUkFNIE1lbW9yeSBTY2hlZHVsZXIgKi8KKwl2b2lkIF9faW9tZW0JKmN0cmw7ICAgICAgICAgICAvKiBTeXN0ZW0gQ29udHJvbCBNb2R1bGUgKi8KKwl2b2lkIF9faW9tZW0JKmN0cmxfcGFkOwkvKiBQQUQgQ29udHJvbCBNb2R1bGUgKi8KKwl2b2lkIF9faW9tZW0JKnBybTsgICAgICAgICAgICAvKiBQb3dlciBhbmQgUmVzZXQgTWFuYWdlbWVudCAqLworCXZvaWQgX19pb21lbQkqY207ICAgICAgICAgICAgIC8qIENsb2NrIE1hbmFnZW1lbnQgKi8KKwl2b2lkIF9faW9tZW0JKmNtMjsKIH07CiAKIHZvaWQgb21hcDJfc2V0X2dsb2JhbHNfMjQyeCh2b2lkKTsKQEAgLTc0LDcgKzg2LDExIEBACiB2b2lkIG9tYXAyX3NldF9nbG9iYWxzX2NvbnRyb2woc3RydWN0IG9tYXBfZ2xvYmFscyAqKTsKIHZvaWQgb21hcDJfc2V0X2dsb2JhbHNfcHJjbShzdHJ1Y3Qgb21hcF9nbG9iYWxzICopOwogCit2b2lkIG9tYXAyNDJ4X21hcF9pbyh2b2lkKTsKK3ZvaWQgb21hcDI0M3hfbWFwX2lvKHZvaWQpOwogdm9pZCBvbWFwM19tYXBfaW8odm9pZCk7Cit2b2lkIG9tYXA0X21hcF9pbyh2b2lkKTsKKwogCiAvKioKICAqIG9tYXBfdGVzdF90aW1lb3V0IC0gYnVzeS1sb29wLCB0ZXN0aW5nIGEgY29uZGl0aW9uCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NwdS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jcHUuaAppbmRleCA2N2IzZDc1Li40MDhhMTJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NwdS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY3B1LmgKQEAgLTQ0LDEzICs0NCw2IEBACiAKIGludCBvbWFwX3R5cGUodm9pZCk7CiAKLXN0cnVjdCBvbWFwX2NoaXBfaWQgewotCXUxNiBvYzsKLQl1OCB0eXBlOwotfTsKLQotI2RlZmluZSBPTUFQX0NISVBfSU5JVCh4KQl7IC5vYyA9IHggfQotCiAvKgogICogb21hcF9yZXYgYml0czoKICAqIENQVSBpZCBiaXRzCSgwNzMwLCAxNTEwLCAxNzEwLCAyNDIyLi4uKQlbMzE6MTZdCkBAIC02MCwxOSArNTMsNiBAQAogdW5zaWduZWQgaW50IG9tYXBfcmV2KHZvaWQpOwogCiAvKgotICogRGVmaW5lIENQVSByZXZpc2lvbiBiaXRzCi0gKgotICogVmVyYm9zZSBtZWFuaW5nIG9mIHRoZSByZXZpc2lvbiBiaXRzIG1heSBiZSBkaWZmZXJlbnQgZm9yIGEgc2lsaWNvbgotICogZmFtaWx5LiBUaGlzIGRpZmZlcmVuY2UgY2FuIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLSAqLwotI2RlZmluZSBPTUFQX1JFVkJJVFNfMDAJCTB4MDAKLSNkZWZpbmUgT01BUF9SRVZCSVRTXzAxCQkweDAxCi0jZGVmaW5lIE9NQVBfUkVWQklUU18wMgkJMHgwMgotI2RlZmluZSBPTUFQX1JFVkJJVFNfMDMJCTB4MDMKLSNkZWZpbmUgT01BUF9SRVZCSVRTXzA0CQkweDA0Ci0jZGVmaW5lIE9NQVBfUkVWQklUU18wNQkJMHgwNQotCi0vKgogICogR2V0IHRoZSBDUFUgcmV2aXNpb24gZm9yIE9NQVAgZGV2aWNlcwogICovCiAjZGVmaW5lIEdFVF9PTUFQX1JFVklTSU9OKCkJKChvbWFwX3JldigpID4+IDgpICYgMHhmZikKQEAgLTI2Miw3ICsyNDIsNyBAQAogSVNfT01BUF9UWVBFKDI0MjMsIDB4MjQyMykKIElTX09NQVBfVFlQRSgyNDMwLCAweDI0MzApCiBJU19PTUFQX1RZUEUoMzQzMCwgMHgzNDMwKQotSVNfT01BUF9UWVBFKDM1MDUsIDB4MzUwNSkKK0lTX09NQVBfVFlQRSgzNTA1LCAweDM1MTcpCiBJU19PTUFQX1RZUEUoMzUxNywgMHgzNTE3KQogCiAjZGVmaW5lIGNwdV9pc19vbWFwMzEwKCkJCTAKQEAgLTM1NCw4ICszMzQsOSBAQAogCQkJCQkJKCFvbWFwM19oYXNfc2d4KCkpICYmCVwKIAkJCQkJCShvbWFwM19oYXNfaXZhKCkpKQogIyBkZWZpbmUgY3B1X2lzX29tYXAzNTMwKCkJCShjcHVfaXNfb21hcDM0MzAoKSkKLSMgZGVmaW5lIGNwdV9pc19vbWFwMzUwNSgpCQlpc19vbWFwMzUwNSgpCiAjIGRlZmluZSBjcHVfaXNfb21hcDM1MTcoKQkJaXNfb21hcDM1MTcoKQorIyBkZWZpbmUgY3B1X2lzX29tYXAzNTA1KCkJCShjcHVfaXNfb21hcDM1MTcoKSAmJgkJXAorCQkJCQkJIW9tYXAzX2hhc19zZ3goKSkKICMgdW5kZWYgY3B1X2lzX29tYXAzNjMwCiAjIGRlZmluZSBjcHVfaXNfb21hcDM2MzAoKQkJaXNfb21hcDM2M3goKQogIyBkZWZpbmUgY3B1X2lzX3RpODE2eCgpCQlpc190aTgxNngoKQpAQCAtMzc5LDM1ICszNjAsMzEgQEAKIC8qIFZhcmlvdXMgc2lsaWNvbiByZXZpc2lvbnMgZm9yIG9tYXAyICovCiAjZGVmaW5lIE9NQVAyNDJYX0NMQVNTCQkweDI0MjAwMDI0CiAjZGVmaW5lIE9NQVAyNDIwX1JFVl9FUzFfMAlPTUFQMjQyWF9DTEFTUwotI2RlZmluZSBPTUFQMjQyMF9SRVZfRVMyXzAJKE9NQVAyNDJYX0NMQVNTIHwgKE9NQVBfUkVWQklUU18wMSA8PCA4KSkKKyNkZWZpbmUgT01BUDI0MjBfUkVWX0VTMl8wCShPTUFQMjQyWF9DTEFTUyB8ICgweDEgPDwgOCkpCiAKICNkZWZpbmUgT01BUDI0M1hfQ0xBU1MJCTB4MjQzMDAwMjQKICNkZWZpbmUgT01BUDI0MzBfUkVWX0VTMV8wCU9NQVAyNDNYX0NMQVNTCiAKICNkZWZpbmUgT01BUDM0M1hfQ0xBU1MJCTB4MzQzMDAwMzQKICNkZWZpbmUgT01BUDM0MzBfUkVWX0VTMV8wCU9NQVAzNDNYX0NMQVNTCi0jZGVmaW5lIE9NQVAzNDMwX1JFVl9FUzJfMAkoT01BUDM0M1hfQ0xBU1MgfCAoT01BUF9SRVZCSVRTXzAxIDw8IDgpKQotI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMyXzEJKE9NQVAzNDNYX0NMQVNTIHwgKE9NQVBfUkVWQklUU18wMiA8PCA4KSkKLSNkZWZpbmUgT01BUDM0MzBfUkVWX0VTM18wCShPTUFQMzQzWF9DTEFTUyB8IChPTUFQX1JFVkJJVFNfMDMgPDwgOCkpCi0jZGVmaW5lIE9NQVAzNDMwX1JFVl9FUzNfMQkoT01BUDM0M1hfQ0xBU1MgfCAoT01BUF9SRVZCSVRTXzA0IDw8IDgpKQotI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMzXzFfMgkoT01BUDM0M1hfQ0xBU1MgfCAoT01BUF9SRVZCSVRTXzA1IDw8IDgpKQorI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMyXzAJKE9NQVAzNDNYX0NMQVNTIHwgKDB4MSA8PCA4KSkKKyNkZWZpbmUgT01BUDM0MzBfUkVWX0VTMl8xCShPTUFQMzQzWF9DTEFTUyB8ICgweDIgPDwgOCkpCisjZGVmaW5lIE9NQVAzNDMwX1JFVl9FUzNfMAkoT01BUDM0M1hfQ0xBU1MgfCAoMHgzIDw8IDgpKQorI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMzXzEJKE9NQVAzNDNYX0NMQVNTIHwgKDB4NCA8PCA4KSkKKyNkZWZpbmUgT01BUDM0MzBfUkVWX0VTM18xXzIJKE9NQVAzNDNYX0NMQVNTIHwgKDB4NSA8PCA4KSkKIAogI2RlZmluZSBPTUFQMzYzWF9DTEFTUwkJMHgzNjMwMDAzNAogI2RlZmluZSBPTUFQMzYzMF9SRVZfRVMxXzAJT01BUDM2M1hfQ0xBU1MKLSNkZWZpbmUgT01BUDM2MzBfUkVWX0VTMV8xCShPTUFQMzYzWF9DTEFTUyB8IChPTUFQX1JFVkJJVFNfMDEgPDwgOCkpCi0jZGVmaW5lIE9NQVAzNjMwX1JFVl9FUzFfMgkoT01BUDM2M1hfQ0xBU1MgfCAoT01BUF9SRVZCSVRTXzAyIDw8IDgpKQorI2RlZmluZSBPTUFQMzYzMF9SRVZfRVMxXzEJKE9NQVAzNjNYX0NMQVNTIHwgKDB4MSA8PCA4KSkKKyNkZWZpbmUgT01BUDM2MzBfUkVWX0VTMV8yCShPTUFQMzYzWF9DTEFTUyB8ICgweDIgPDwgOCkpCiAKLSNkZWZpbmUgT01BUDM1WFhfQ0xBU1MJCTB4MzUwMDAwMzQKLSNkZWZpbmUgT01BUDM1MDNfUkVWKHYpCQkoT01BUDM1WFhfQ0xBU1MgfCAoMHgzNTAzIDw8IDE2KSB8ICh2IDw8IDgpKQotI2RlZmluZSBPTUFQMzUxNV9SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MTUgPDwgMTYpIHwgKHYgPDwgOCkpCi0jZGVmaW5lIE9NQVAzNTI1X1JFVih2KQkJKE9NQVAzNVhYX0NMQVNTIHwgKDB4MzUyNSA8PCAxNikgfCAodiA8PCA4KSkKLSNkZWZpbmUgT01BUDM1MzBfUkVWKHYpCQkoT01BUDM1WFhfQ0xBU1MgfCAoMHgzNTMwIDw8IDE2KSB8ICh2IDw8IDgpKQotI2RlZmluZSBPTUFQMzUwNV9SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MDUgPDwgMTYpIHwgKHYgPDwgOCkpCi0jZGVmaW5lIE9NQVAzNTE3X1JFVih2KQkJKE9NQVAzNVhYX0NMQVNTIHwgKDB4MzUxNyA8PCAxNikgfCAodiA8PCA4KSkKKyNkZWZpbmUgT01BUDM1MTdfQ0xBU1MJCTB4MzUxNzAwMzQKKyNkZWZpbmUgT01BUDM1MTdfUkVWX0VTMV8wCU9NQVAzNTE3X0NMQVNTCisjZGVmaW5lIE9NQVAzNTE3X1JFVl9FUzFfMQkoT01BUDM1MTdfQ0xBU1MgfCAoMHgxIDw8IDgpKQogCiAjZGVmaW5lIFRJODE2WF9DTEFTUwkJMHg4MTYwMDAzNAogI2RlZmluZSBUSTgxNjhfUkVWX0VTMV8wCVRJODE2WF9DTEFTUwotI2RlZmluZSBUSTgxNjhfUkVWX0VTMV8xCShUSTgxNlhfQ0xBU1MgfCAoT01BUF9SRVZCSVRTXzAxIDw8IDgpKQorI2RlZmluZSBUSTgxNjhfUkVWX0VTMV8xCShUSTgxNlhfQ0xBU1MgfCAoMHgxIDw8IDgpKQogCiAjZGVmaW5lIE9NQVA0NDNYX0NMQVNTCQkweDQ0MzAwMDQ0CiAjZGVmaW5lIE9NQVA0NDMwX1JFVl9FUzFfMAkoT01BUDQ0M1hfQ0xBU1MgfCAoMHgxMCA8PCA4KSkKQEAgLTQxOCw2NSArMzk1LDE3IEBACiAjZGVmaW5lIE9NQVA0NDZYX0NMQVNTCQkweDQ0NjAwMDQ0CiAjZGVmaW5lIE9NQVA0NDYwX1JFVl9FUzFfMAkoT01BUDQ0NlhfQ0xBU1MgfCAoMHgxMCA8PCA4KSkKIAotLyoKLSAqIG9tYXBfY2hpcCBiaXRzCi0gKgotICogQ0hJUF9JU19PTUFQezI0MjAsMjQzMCwzNDMwfSBpbmRpY2F0ZSB0aGF0IGEgcGFydGljdWxhciBzdHJ1Y3R1cmUgaXMKLSAqIHZhbGlkIG9uIGFsbCBjaGlwcyBvZiB0aGF0IHR5cGUuICBDSElQX0lTX09NQVAzNDMwRVN7MSwyfSBpbmRpY2F0ZXMKLSAqIHNvbWV0aGluZyB0aGF0IGlzIG9ubHkgdmFsaWQgb24gdGhhdCBwYXJ0aWN1bGFyIEVTIHJldmlzaW9uLgotICoKLSAqIFRoZXNlIGJpdHMgbWF5IGJlIE9SZWQgdG9nZXRoZXIgdG8gaW5kaWNhdGUgc3RydWN0dXJlcyB0aGF0IGFyZQotICogYXZhaWxhYmxlIG9uIG11bHRpcGxlIGNoaXAgdHlwZXMuCi0gKgotICogVG8gdGVzdCB3aGV0aGVyIGEgcGFydGljdWxhciBzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgY3VycmVudCBPTUFQIGNoaXAgdHlwZSwKLSAqIHVzZSBvbWFwX2NoaXBfaXMoKS4KLSAqCi0gKi8KLSNkZWZpbmUgQ0hJUF9JU19PTUFQMjQyMAkJKDEgPDwgMCkKLSNkZWZpbmUgQ0hJUF9JU19PTUFQMjQzMAkJKDEgPDwgMSkKLSNkZWZpbmUgQ0hJUF9JU19PTUFQMzQzMAkJKDEgPDwgMikKLSNkZWZpbmUgQ0hJUF9JU19PTUFQMzQzMEVTMQkJKDEgPDwgMykKLSNkZWZpbmUgQ0hJUF9JU19PTUFQMzQzMEVTMgkJKDEgPDwgNCkKLSNkZWZpbmUgQ0hJUF9JU19PTUFQMzQzMEVTM18wCQkoMSA8PCA1KQotI2RlZmluZSBDSElQX0lTX09NQVAzNDMwRVMzXzEJCSgxIDw8IDYpCi0jZGVmaW5lIENISVBfSVNfT01BUDM2MzBFUzEJCSgxIDw8IDcpCi0jZGVmaW5lIENISVBfSVNfT01BUDQ0MzBFUzEJCSgxIDw8IDgpCi0jZGVmaW5lIENISVBfSVNfT01BUDM2MzBFUzFfMSAgICAgICAgICAgKDEgPDwgOSkKLSNkZWZpbmUgQ0hJUF9JU19PTUFQMzYzMEVTMV8yICAgICAgICAgICAoMSA8PCAxMCkKLSNkZWZpbmUgQ0hJUF9JU19PTUFQNDQzMEVTMgkJKDEgPDwgMTEpCi0jZGVmaW5lIENISVBfSVNfT01BUDQ0MzBFUzJfMQkJKDEgPDwgMTIpCi0jZGVmaW5lIENISVBfSVNfT01BUDQ0MzBFUzJfMgkJKDEgPDwgMTMpCi0jZGVmaW5lIENISVBfSVNfVEk4MTZYCQkJKDEgPDwgMTQpCi0jZGVmaW5lIENISVBfSVNfT01BUDQ0NjBFUzFfMAkJKDEgPDwgMTUpCi0KLSNkZWZpbmUgQ0hJUF9JU19PTUFQMjRYWAkJKENISVBfSVNfT01BUDI0MjAgfCBDSElQX0lTX09NQVAyNDMwKQotCi0jZGVmaW5lIENISVBfSVNfT01BUDQ0MzAJCShDSElQX0lTX09NQVA0NDMwRVMxIHwJCVwKLQkJCQkJIENISVBfSVNfT01BUDQ0MzBFUzIgfAkJXAotCQkJCQkgQ0hJUF9JU19PTUFQNDQzMEVTMl8xIHwJXAotCQkJCQkgQ0hJUF9JU19PTUFQNDQzMEVTMl8yIHwJXAotCQkJCQkgQ0hJUF9JU19PTUFQNDQ2MEVTMV8wKQotCi0vKgotICogIkdFIiBoZXJlIHJlcHJlc2VudHMgImdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byIgaW4gdGVybXMgb2YgRVMKLSAqIGxldmVscy4gIFNvIENISVBfR0VfT01BUDM0MzBFUzIgaXMgaW50ZW5kZWQgdG8gbWF0Y2ggYWxsIE9NQVAzNDMwCi0gKiBjaGlwcyBhdCBFUzIgYW5kIGJleW9uZCwgYnV0IG5vdCwgZm9yIGV4YW1wbGUsIGFueSBPTUFQIGxpbmVzIGFmdGVyCi0gKiBPTUFQMy4KLSAqLwotI2RlZmluZSBDSElQX0dFX09NQVAzNDMwRVMyCQkoQ0hJUF9JU19PTUFQMzQzMEVTMiB8IFwKLQkJCQkJIENISVBfSVNfT01BUDM0MzBFUzNfMCB8IFwKLQkJCQkJIENISVBfR0VfT01BUDM0MzBFUzNfMSkKLSNkZWZpbmUgQ0hJUF9HRV9PTUFQMzQzMEVTM18xCQkoQ0hJUF9JU19PTUFQMzQzMEVTM18xIHwgXAotCQkJCQkgQ0hJUF9JU19PTUFQMzYzMEVTMSB8IFwKLQkJCQkJIENISVBfR0VfT01BUDM2MzBFUzFfMSkKLSNkZWZpbmUgQ0hJUF9HRV9PTUFQMzYzMEVTMV8xCQkoQ0hJUF9JU19PTUFQMzYzMEVTMV8xIHwgXAotCQkJCQkgQ0hJUF9JU19PTUFQMzYzMEVTMV8yKQotCi1pbnQgb21hcF9jaGlwX2lzKHN0cnVjdCBvbWFwX2NoaXBfaWQgb2NpKTsKIHZvaWQgb21hcDJfY2hlY2tfcmV2aXNpb24odm9pZCk7CiAKIC8qCiAgKiBSdW50aW1lIGRldGVjdGlvbiBvZiBPTUFQMyBmZWF0dXJlcworICoKKyAqIE9NQVAzX0hBU19JT19DSEFJTl9DVFJMOiBTb21lIGxhdGVyIG1lbWJlcnMgb2YgdGhlIE9NQVAzIGNoaXAKKyAqICAgIGZhbWlseSBoYXZlIE9TLWxldmVsIGNvbnRyb2wgb3ZlciB0aGUgSS9PIGNoYWluIGNsb2NrLiAgVGhpcyBpcworICogICAgdG8gYXZvaWQgYSB3aW5kb3cgZHVyaW5nIHdoaWNoIHdha2V1cHMgY291bGQgcG90ZW50aWFsbHkgYmUgbG9zdAorICogICAgZHVyaW5nIHBvd2VyZG9tYWluIHRyYW5zaXRpb25zLiAgSWYgdGhpcyBiaXQgaXMgc2V0LCBpdAorICogICAgaW5kaWNhdGVzIHRoYXQgdGhlIGNoaXAgZG9lcyBzdXBwb3J0IE9TLWxldmVsIGNvbnRyb2wgb2YgdGhpcworICogICAgZmVhdHVyZS4KICAqLwogZXh0ZXJuIHUzMiBvbWFwX2ZlYXR1cmVzOwogCkBAIC00ODgsOSArNDE3LDEwIEBACiAjZGVmaW5lIE9NQVAzX0hBU18xOTJNSFpfQ0xLCQlCSVQoNSkKICNkZWZpbmUgT01BUDNfSEFTX0lPX1dBS0VVUAkJQklUKDYpCiAjZGVmaW5lIE9NQVAzX0hBU19TRFJDCQkJQklUKDcpCi0jZGVmaW5lIE9NQVA0X0hBU19NUFVfMUdIWgkJQklUKDgpCi0jZGVmaW5lIE9NQVA0X0hBU19NUFVfMV8yR0haCQlCSVQoOSkKLSNkZWZpbmUgT01BUDRfSEFTX01QVV8xXzVHSFoJCUJJVCgxMCkKKyNkZWZpbmUgT01BUDNfSEFTX0lPX0NIQUlOX0NUUkwJCUJJVCg4KQorI2RlZmluZSBPTUFQNF9IQVNfTVBVXzFHSFoJCUJJVCg5KQorI2RlZmluZSBPTUFQNF9IQVNfTVBVXzFfMkdIWgkJQklUKDEwKQorI2RlZmluZSBPTUFQNF9IQVNfTVBVXzFfNUdIWgkJQklUKDExKQogCiAKICNkZWZpbmUgT01BUDNfSEFTX0ZFQVRVUkUoZmVhdCxmbGFnKQkJCVwKQEAgLTUwNywxMiArNDM3LDExIEBACiBPTUFQM19IQVNfRkVBVFVSRSgxOTJtaHpfY2xrLCAxOTJNSFpfQ0xLKQogT01BUDNfSEFTX0ZFQVRVUkUoaW9fd2FrZXVwLCBJT19XQUtFVVApCiBPTUFQM19IQVNfRkVBVFVSRShzZHJjLCBTRFJDKQorT01BUDNfSEFTX0ZFQVRVUkUoaW9fY2hhaW5fY3RybCwgSU9fQ0hBSU5fQ1RSTCkKIAogLyoKICAqIFJ1bnRpbWUgZGV0ZWN0aW9uIG9mIE9NQVA0IGZlYXR1cmVzCiAgKi8KLWV4dGVybiB1MzIgb21hcF9mZWF0dXJlczsKLQogI2RlZmluZSBPTUFQNF9IQVNfRkVBVFVSRShmZWF0LCBmbGFnKQkJCVwKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9tYXA0X2hhc18gIyNmZWF0KHZvaWQpCVwKIHsJCQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9kbXRpbWVyLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2RtdGltZXIuaAppbmRleCBlYjVkMTZjLi45NDE4ZjAwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2RtdGltZXIuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2RtdGltZXIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBhcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2RtdGltZXIuaAorICogYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9kbXRpbWVyLmgKICAqCiAgKiBPTUFQIER1YWwtTW9kZSBUaW1lcnMKICAqCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaWZuZGVmIF9fQVNNX0FSQ0hfRE1USU1FUl9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfRE1USU1FUl9ICkBAIC01OSwxMiArNjAsNTYgQEAKICAqIGluIE9NQVA0IGNhbiBiZSBkaXN0aW5ndWlzaGVkLgogICovCiAjZGVmaW5lIE9NQVBfVElNRVJfSVBfVkVSU0lPTl8xICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisKKy8qIHRpbWVyIGNhcGFiaWxpdGllcyB1c2VkIGluIGh3bW9kIGRhdGFiYXNlICovCisjZGVmaW5lIE9NQVBfVElNRVJfU0VDVVJFCQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgT01BUF9USU1FUl9BTFdPTgkJCQkweDQwMDAwMDAwCisjZGVmaW5lIE9NQVBfVElNRVJfSEFTX1BXTQkJCQkweDIwMDAwMDAwCisKK3N0cnVjdCBvbWFwX3RpbWVyX2NhcGFiaWxpdHlfZGV2X2F0dHIgeworCXUzMiB0aW1lcl9jYXBhYmlsaXR5OworfTsKKwogc3RydWN0IG9tYXBfZG1fdGltZXI7CiBzdHJ1Y3QgY2xrOwogCitzdHJ1Y3QgdGltZXJfcmVncyB7CisJdTMyIHRpZHI7CisJdTMyIHRpb2NwX2NmZzsKKwl1MzIgdGlzdGF0OworCXUzMiB0aXNyOworCXUzMiB0aWVyOworCXUzMiB0d2VyOworCXUzMiB0Y2xyOworCXUzMiB0Y3JyOworCXUzMiB0bGRyOworCXUzMiB0dHJnOworCXUzMiB0d3BzOworCXUzMiB0bWFyOworCXUzMiB0Y2FyMTsKKwl1MzIgdHNpY3I7CisJdTMyIHRjYXIyOworCXUzMiB0cGlyOworCXUzMiB0bmlyOworCXUzMiB0Y3ZyOworCXUzMiB0b2NyOworCXUzMiB0b3dyOworfTsKKworc3RydWN0IGRtdGltZXJfcGxhdGZvcm1fZGF0YSB7CisJaW50ICgqc2V0X3RpbWVyX3NyYykoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHNvdXJjZSk7CisJaW50IHRpbWVyX2lwX3ZlcnNpb247CisJdTMyIG5lZWRzX21hbnVhbF9yZXNldDoxOworCWJvb2wgcmVzZXJ2ZWQ7CisKKwlib29sIGxvc2VzX2NvbnRleHQ7CisKKwlpbnQgKCpnZXRfY29udGV4dF9sb3NzX2NvdW50KShzdHJ1Y3QgZGV2aWNlICpkZXYpOworfTsKKwogc3RydWN0IG9tYXBfZG1fdGltZXIgKm9tYXBfZG1fdGltZXJfcmVxdWVzdCh2b2lkKTsKIHN0cnVjdCBvbWFwX2RtX3RpbWVyICpvbWFwX2RtX3RpbWVyX3JlcXVlc3Rfc3BlY2lmaWMoaW50IHRpbWVyX2lkKTsKLXZvaWQgb21hcF9kbV90aW1lcl9mcmVlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CitpbnQgb21hcF9kbV90aW1lcl9mcmVlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CiB2b2lkIG9tYXBfZG1fdGltZXJfZW5hYmxlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CiB2b2lkIG9tYXBfZG1fdGltZXJfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwogCkBAIC03MywyMyArMTE4LDIzIEBACiB1MzIgb21hcF9kbV90aW1lcl9tb2RpZnlfaWRsZWN0X21hc2sodTMyIGlucHV0bWFzayk7CiBzdHJ1Y3QgY2xrICpvbWFwX2RtX3RpbWVyX2dldF9mY2xrKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CiAKLXZvaWQgb21hcF9kbV90aW1lcl90cmlnZ2VyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7Ci12b2lkIG9tYXBfZG1fdGltZXJfc3RhcnQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKLXZvaWQgb21hcF9kbV90aW1lcl9zdG9wKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CitpbnQgb21hcF9kbV90aW1lcl90cmlnZ2VyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CitpbnQgb21hcF9kbV90aW1lcl9zdGFydChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOworaW50IG9tYXBfZG1fdGltZXJfc3RvcChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwogCiBpbnQgb21hcF9kbV90aW1lcl9zZXRfc291cmNlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHNvdXJjZSk7Ci12b2lkIG9tYXBfZG1fdGltZXJfc2V0X2xvYWQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgYXV0b3JlbG9hZCwgdW5zaWduZWQgaW50IHZhbHVlKTsKLXZvaWQgb21hcF9kbV90aW1lcl9zZXRfbG9hZF9zdGFydChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBhdXRvcmVsb2FkLCB1bnNpZ25lZCBpbnQgdmFsdWUpOwotdm9pZCBvbWFwX2RtX3RpbWVyX3NldF9tYXRjaChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBlbmFibGUsIHVuc2lnbmVkIGludCBtYXRjaCk7Ci12b2lkIG9tYXBfZG1fdGltZXJfc2V0X3B3bShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBkZWZfb24sIGludCB0b2dnbGUsIGludCB0cmlnZ2VyKTsKLXZvaWQgb21hcF9kbV90aW1lcl9zZXRfcHJlc2NhbGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHByZXNjYWxlcik7CitpbnQgb21hcF9kbV90aW1lcl9zZXRfbG9hZChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBhdXRvcmVsb2FkLCB1bnNpZ25lZCBpbnQgdmFsdWUpOworaW50IG9tYXBfZG1fdGltZXJfc2V0X2xvYWRfc3RhcnQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgYXV0b3JlbG9hZCwgdW5zaWduZWQgaW50IHZhbHVlKTsKK2ludCBvbWFwX2RtX3RpbWVyX3NldF9tYXRjaChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBlbmFibGUsIHVuc2lnbmVkIGludCBtYXRjaCk7CitpbnQgb21hcF9kbV90aW1lcl9zZXRfcHdtKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGRlZl9vbiwgaW50IHRvZ2dsZSwgaW50IHRyaWdnZXIpOworaW50IG9tYXBfZG1fdGltZXJfc2V0X3ByZXNjYWxlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBwcmVzY2FsZXIpOwogCi12b2lkIG9tYXBfZG1fdGltZXJfc2V0X2ludF9lbmFibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpOworaW50IG9tYXBfZG1fdGltZXJfc2V0X2ludF9lbmFibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpOwogCiB1bnNpZ25lZCBpbnQgb21hcF9kbV90aW1lcl9yZWFkX3N0YXR1cyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwotdm9pZCBvbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7CitpbnQgb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpOwogdW5zaWduZWQgaW50IG9tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7Ci12b2lkIG9tYXBfZG1fdGltZXJfd3JpdGVfY291bnRlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7CitpbnQgb21hcF9kbV90aW1lcl93cml0ZV9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IHZhbHVlKTsKIAogaW50IG9tYXBfZG1fdGltZXJzX2FjdGl2ZSh2b2lkKTsKIApAQCAtOTgsMTIgKzE0MywzMCBAQAogICogdXNlZCBieSBkbXRpbWVyLmMgYW5kIHN5c190aW1lciByZWxhdGVkIGNvZGUuCiAgKi8KIAotLyogcmVnaXN0ZXIgb2Zmc2V0cyAqLwotI2RlZmluZSBfT01BUF9USU1FUl9JRF9PRkZTRVQJCTB4MDAKLSNkZWZpbmUgX09NQVBfVElNRVJfT0NQX0NGR19PRkZTRVQJMHgxMAotI2RlZmluZSBfT01BUF9USU1FUl9TWVNfU1RBVF9PRkZTRVQJMHgxNAotI2RlZmluZSBfT01BUF9USU1FUl9TVEFUX09GRlNFVAkJMHgxOAotI2RlZmluZSBfT01BUF9USU1FUl9JTlRfRU5fT0ZGU0VUCTB4MWMKKy8qCisgKiBUaGUgaW50ZXJydXB0IHJlZ2lzdGVycyBhcmUgZGlmZmVyZW50IGJldHdlZW4gdjEgYW5kIHYyIGlwLgorICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBvZmZzZXRzIGZyb20gdGltZXItPmlvYmFzZS4KKyAqLworI2RlZmluZSBPTUFQX1RJTUVSX0lEX09GRlNFVAkJMHgwMAorI2RlZmluZSBPTUFQX1RJTUVSX09DUF9DRkdfT0ZGU0VUCTB4MTAKKworI2RlZmluZSBPTUFQX1RJTUVSX1YxX1NZU19TVEFUX09GRlNFVAkweDE0CisjZGVmaW5lIE9NQVBfVElNRVJfVjFfU1RBVF9PRkZTRVQJMHgxOAorI2RlZmluZSBPTUFQX1RJTUVSX1YxX0lOVF9FTl9PRkZTRVQJMHgxYworCisjZGVmaW5lIE9NQVBfVElNRVJfVjJfSVJRU1RBVFVTX1JBVwkweDI0CisjZGVmaW5lIE9NQVBfVElNRVJfVjJfSVJRU1RBVFVTCQkweDI4CisjZGVmaW5lIE9NQVBfVElNRVJfVjJfSVJRRU5BQkxFX1NFVAkweDJjCisjZGVmaW5lIE9NQVBfVElNRVJfVjJfSVJRRU5BQkxFX0NMUgkweDMwCisKKy8qCisgKiBUaGUgZnVuY3Rpb25hbCByZWdpc3RlcnMgaGF2ZSBhIGRpZmZlcmVudCBiYXNlIG9uIHYxIGFuZCB2MiBpcC4KKyAqIFRoZXNlIHJlZ2lzdGVycyBhcmUgb2Zmc2V0cyBmcm9tIHRpbWVyLT5mdW5jX2Jhc2UuIFRoZSBmdW5jX2Jhc2UKKyAqIGlzIHNhbWFlIGFzIGlvX2Jhc2UgZm9yIHYxIGFuZCBpb19iYXNlICsgMHgxNCBmb3IgdjIgaXAuCisgKgorICovCisjZGVmaW5lIE9NQVBfVElNRVJfVjJfRlVOQ19PRkZTRVQJCTB4MTQKKwogI2RlZmluZSBfT01BUF9USU1FUl9XQUtFVVBfRU5fT0ZGU0VUCTB4MjAKICNkZWZpbmUgX09NQVBfVElNRVJfQ1RSTF9PRkZTRVQJCTB4MjQKICNkZWZpbmUJCU9NQVBfVElNRVJfQ1RSTF9HUE9DRkcJCSgxIDw8IDE0KQpAQCAtMTQ3LDIxICsyMTAsNiBAQAogLyogcmVnaXN0ZXIgb2Zmc2V0cyB3aXRoIHRoZSB3cml0ZSBwZW5kaW5nIGJpdCBlbmNvZGVkICovCiAjZGVmaW5lCVdQU0hJRlQJCQkJCTE2CiAKLSNkZWZpbmUgT01BUF9USU1FUl9JRF9SRUcJCQkoX09NQVBfVElNRVJfSURfT0ZGU0VUIFwKLQkJCQkJCQl8IChXUF9OT05FIDw8IFdQU0hJRlQpKQotCi0jZGVmaW5lIE9NQVBfVElNRVJfT0NQX0NGR19SRUcJCQkoX09NQVBfVElNRVJfT0NQX0NGR19PRkZTRVQgXAotCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9TWVNfU1RBVF9SRUcJCQkoX09NQVBfVElNRVJfU1lTX1NUQVRfT0ZGU0VUIFwKLQkJCQkJCQl8IChXUF9OT05FIDw8IFdQU0hJRlQpKQotCi0jZGVmaW5lIE9NQVBfVElNRVJfU1RBVF9SRUcJCQkoX09NQVBfVElNRVJfU1RBVF9PRkZTRVQgXAotCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9JTlRfRU5fUkVHCQkJKF9PTUFQX1RJTUVSX0lOVF9FTl9PRkZTRVQgXAotCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCi0KICNkZWZpbmUgT01BUF9USU1FUl9XQUtFVVBfRU5fUkVHCQkoX09NQVBfVElNRVJfV0FLRVVQX0VOX09GRlNFVCBcCiAJCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKIApAQCAtMjA5LDQ5ICsyNTcsODggQEAKIAogc3RydWN0IG9tYXBfZG1fdGltZXIgewogCXVuc2lnbmVkIGxvbmcgcGh5c19iYXNlOworCWludCBpZDsKIAlpbnQgaXJxOwotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyUExVUwogCXN0cnVjdCBjbGsgKmljbGssICpmY2xrOwotI2VuZGlmCi0Jdm9pZCBfX2lvbWVtICppb19iYXNlOworCisJdm9pZCBfX2lvbWVtCSppb19iYXNlOworCXZvaWQgX19pb21lbQkqc3lzX3N0YXQ7CS8qIFRJU1RBVCB0aW1lciBzdGF0dXMgKi8KKwl2b2lkIF9faW9tZW0JKmlycV9zdGF0OwkvKiBUSVNSL0lSUVNUQVRVUyBpbnRlcnJ1cHQgc3RhdHVzICovCisJdm9pZCBfX2lvbWVtCSppcnFfZW5hOwkvKiBpcnEgZW5hYmxlICovCisJdm9pZCBfX2lvbWVtCSppcnFfZGlzOwkvKiBpcnEgZGlzYWJsZSwgb25seSBvbiB2MiBpcCAqLworCXZvaWQgX19pb21lbQkqcGVuZDsJCS8qIHdyaXRlIHBlbmRpbmcgKi8KKwl2b2lkIF9faW9tZW0JKmZ1bmNfYmFzZTsJLyogZnVuY3Rpb24gcmVnaXN0ZXIgYmFzZSAqLworCiAJdW5zaWduZWQgbG9uZyByYXRlOwogCXVuc2lnbmVkIHJlc2VydmVkOjE7Ci0JdW5zaWduZWQgZW5hYmxlZDoxOwogCXVuc2lnbmVkIHBvc3RlZDoxOworCXN0cnVjdCB0aW1lcl9yZWdzIGNvbnRleHQ7CisJYm9vbCBsb3Nlc19jb250ZXh0OworCWludCBjdHhfbG9zc19jb3VudDsKKwlpbnQgcmV2aXNpb247CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisKKwlpbnQgKCpnZXRfY29udGV4dF9sb3NzX2NvdW50KShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogfTsKIAotZXh0ZXJuIHUzMiBzeXNfdGltZXJfcmVzZXJ2ZWQ7Ci12b2lkIG9tYXBfZG1fdGltZXJfcHJlcGFyZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOworaW50IG9tYXBfZG1fdGltZXJfcHJlcGFyZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwogCi1zdGF0aWMgaW5saW5lIHUzMiBfX29tYXBfZG1fdGltZXJfcmVhZCh2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiByZWcsCitzdGF0aWMgaW5saW5lIHUzMiBfX29tYXBfZG1fdGltZXJfcmVhZChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHUzMiByZWcsCiAJCQkJCQlpbnQgcG9zdGVkKQogewogCWlmIChwb3N0ZWQpCi0JCXdoaWxlIChfX3Jhd19yZWFkbChiYXNlICsgKE9NQVBfVElNRVJfV1JJVEVfUEVORF9SRUcgJiAweGZmKSkKLQkJCQkmIChyZWcgPj4gV1BTSElGVCkpCisJCXdoaWxlIChfX3Jhd19yZWFkbCh0aW1lci0+cGVuZCkgJiAocmVnID4+IFdQU0hJRlQpKQogCQkJY3B1X3JlbGF4KCk7CiAKLQlyZXR1cm4gX19yYXdfcmVhZGwoYmFzZSArIChyZWcgJiAweGZmKSk7CisJcmV0dXJuIF9fcmF3X3JlYWRsKHRpbWVyLT5mdW5jX2Jhc2UgKyAocmVnICYgMHhmZikpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3dyaXRlKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHJlZywgdTMyIHZhbCwKLQkJCQkJCWludCBwb3N0ZWQpCitzdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3dyaXRlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwKKwkJCQkJdTMyIHJlZywgdTMyIHZhbCwgaW50IHBvc3RlZCkKIHsKIAlpZiAocG9zdGVkKQotCQl3aGlsZSAoX19yYXdfcmVhZGwoYmFzZSArIChPTUFQX1RJTUVSX1dSSVRFX1BFTkRfUkVHICYgMHhmZikpCi0JCQkJJiAocmVnID4+IFdQU0hJRlQpKQorCQl3aGlsZSAoX19yYXdfcmVhZGwodGltZXItPnBlbmQpICYgKHJlZyA+PiBXUFNISUZUKSkKIAkJCWNwdV9yZWxheCgpOwogCi0JX19yYXdfd3JpdGVsKHZhbCwgYmFzZSArIChyZWcgJiAweGZmKSk7CisJX19yYXdfd3JpdGVsKHZhbCwgdGltZXItPmZ1bmNfYmFzZSArIChyZWcgJiAweGZmKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX29tYXBfZG1fdGltZXJfaW5pdF9yZWdzKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwl1MzIgdGlkcjsKKworCS8qIEFzc3VtZSB2MSBpcCBpZiBiaXRzIFszMToxNl0gYXJlIHplcm8gKi8KKwl0aWRyID0gX19yYXdfcmVhZGwodGltZXItPmlvX2Jhc2UpOworCWlmICghKHRpZHIgPj4gMTYpKSB7CisJCXRpbWVyLT5yZXZpc2lvbiA9IDE7CisJCXRpbWVyLT5zeXNfc3RhdCA9IHRpbWVyLT5pb19iYXNlICsKKwkJCQlPTUFQX1RJTUVSX1YxX1NZU19TVEFUX09GRlNFVDsKKwkJdGltZXItPmlycV9zdGF0ID0gdGltZXItPmlvX2Jhc2UgKyBPTUFQX1RJTUVSX1YxX1NUQVRfT0ZGU0VUOworCQl0aW1lci0+aXJxX2VuYSA9IHRpbWVyLT5pb19iYXNlICsgT01BUF9USU1FUl9WMV9JTlRfRU5fT0ZGU0VUOworCQl0aW1lci0+aXJxX2RpcyA9IDA7CisJCXRpbWVyLT5wZW5kID0gdGltZXItPmlvX2Jhc2UgKyBfT01BUF9USU1FUl9XUklURV9QRU5EX09GRlNFVDsKKwkJdGltZXItPmZ1bmNfYmFzZSA9IHRpbWVyLT5pb19iYXNlOworCX0gZWxzZSB7CisJCXRpbWVyLT5yZXZpc2lvbiA9IDI7CisJCXRpbWVyLT5zeXNfc3RhdCA9IDA7CisJCXRpbWVyLT5pcnFfc3RhdCA9IHRpbWVyLT5pb19iYXNlICsgT01BUF9USU1FUl9WMl9JUlFTVEFUVVM7CisJCXRpbWVyLT5pcnFfZW5hID0gdGltZXItPmlvX2Jhc2UgKyBPTUFQX1RJTUVSX1YyX0lSUUVOQUJMRV9TRVQ7CisJCXRpbWVyLT5pcnFfZGlzID0gdGltZXItPmlvX2Jhc2UgKyBPTUFQX1RJTUVSX1YyX0lSUUVOQUJMRV9DTFI7CisJCXRpbWVyLT5wZW5kID0gdGltZXItPmlvX2Jhc2UgKworCQkJX09NQVBfVElNRVJfV1JJVEVfUEVORF9PRkZTRVQgKworCQkJCU9NQVBfVElNRVJfVjJfRlVOQ19PRkZTRVQ7CisJCXRpbWVyLT5mdW5jX2Jhc2UgPSB0aW1lci0+aW9fYmFzZSArIE9NQVBfVElNRVJfVjJfRlVOQ19PRkZTRVQ7CisJfQogfQogCiAvKiBBc3N1bWVzIHRoZSBzb3VyY2UgY2xvY2sgaGFzIGJlZW4gc2V0IGJ5IGNhbGxlciAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fb21hcF9kbV90aW1lcl9yZXNldCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBhdXRvaWRsZSwKLQkJCQkJCWludCB3YWtldXApCitzdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3Jlc2V0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwKKwkJCQkJaW50IGF1dG9pZGxlLCBpbnQgd2FrZXVwKQogewogCXUzMiBsOwogCi0JbCA9IF9fb21hcF9kbV90aW1lcl9yZWFkKGJhc2UsIE9NQVBfVElNRVJfT0NQX0NGR19SRUcsIDApOworCWwgPSBfX3Jhd19yZWFkbCh0aW1lci0+aW9fYmFzZSArIE9NQVBfVElNRVJfT0NQX0NGR19PRkZTRVQpOwogCWwgfD0gMHgwMiA8PCAzOyAgLyogU2V0IHRvIHNtYXJ0LWlkbGUgbW9kZSAqLwogCWwgfD0gMHgyIDw8IDg7ICAgLyogU2V0IGNsb2NrIGFjdGl2aXR5IHRvIHBlcnNlcnZlIGYtY2xvY2sgb24gaWRsZSAqLwogCkBAIC0yNjEsMTAgKzM0OCwxMCBAQAogCWlmICh3YWtldXApCiAJCWwgfD0gMSA8PCAyOwogCi0JX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfT0NQX0NGR19SRUcsIGwsIDApOworCV9fcmF3X3dyaXRlbChsLCB0aW1lci0+aW9fYmFzZSArIE9NQVBfVElNRVJfT0NQX0NGR19PRkZTRVQpOwogCiAJLyogTWF0Y2ggaGFyZHdhcmUgcmVzZXQgZGVmYXVsdCBvZiBwb3N0ZWQgbW9kZSAqLwotCV9fb21hcF9kbV90aW1lcl93cml0ZShiYXNlLCBPTUFQX1RJTUVSX0lGX0NUUkxfUkVHLAorCV9fb21hcF9kbV90aW1lcl93cml0ZSh0aW1lciwgT01BUF9USU1FUl9JRl9DVFJMX1JFRywKIAkJCQkJT01BUF9USU1FUl9DVFJMX1BPU1RFRCwgMCk7CiB9CiAKQEAgLTI4NiwxOCArMzczLDE4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fb21hcF9kbV90aW1lcl9zdG9wKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IHBvc3RlZCwKLQkJCQkJCXVuc2lnbmVkIGxvbmcgcmF0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX29tYXBfZG1fdGltZXJfc3RvcChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsCisJCQkJCWludCBwb3N0ZWQsIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKIAl1MzIgbDsKIAotCWwgPSBfX29tYXBfZG1fdGltZXJfcmVhZChiYXNlLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBwb3N0ZWQpOworCWwgPSBfX29tYXBfZG1fdGltZXJfcmVhZCh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgcG9zdGVkKTsKIAlpZiAobCAmIE9NQVBfVElNRVJfQ1RSTF9TVCkgewogCQlsICY9IH4weDE7Ci0JCV9fb21hcF9kbV90aW1lcl93cml0ZShiYXNlLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBsLCBwb3N0ZWQpOworCQlfX29tYXBfZG1fdGltZXJfd3JpdGUodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwsIHBvc3RlZCk7CiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDJQTFVTCiAJCS8qIFJlYWRiYWNrIHRvIG1ha2Ugc3VyZSB3cml0ZSBoYXMgY29tcGxldGVkICovCi0JCV9fb21hcF9kbV90aW1lcl9yZWFkKGJhc2UsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIHBvc3RlZCk7CisJCV9fb21hcF9kbV90aW1lcl9yZWFkKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBwb3N0ZWQpOwogCQkvKgogCQkgKiBXYWl0IGZvciBmdW5jdGlvbmFsIGNsb2NrIHBlcmlvZCB4IDMuNSB0byBtYWtlIHN1cmUgdGhhdAogCQkgKiB0aW1lciBpcyBzdG9wcGVkCkBAIC0zMDcsMzQgKzM5NCwzNCBAQAogCX0KIAogCS8qIEFjayBwb3NzaWJseSBwZW5kaW5nIGludGVycnVwdCAqLwotCV9fb21hcF9kbV90aW1lcl93cml0ZShiYXNlLCBPTUFQX1RJTUVSX1NUQVRfUkVHLAotCQkJCQlPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVywgMCk7CisJX19yYXdfd3JpdGVsKE9NQVBfVElNRVJfSU5UX09WRVJGTE9XLCB0aW1lci0+aXJxX3N0YXQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQodm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgY3RybCwKLQkJCQkJCXVuc2lnbmVkIGludCBsb2FkLCBpbnQgcG9zdGVkKQorc3RhdGljIGlubGluZSB2b2lkIF9fb21hcF9kbV90aW1lcl9sb2FkX3N0YXJ0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwKKwkJCQkJCXUzMiBjdHJsLCB1bnNpZ25lZCBpbnQgbG9hZCwKKwkJCQkJCWludCBwb3N0ZWQpCiB7Ci0JX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfQ09VTlRFUl9SRUcsIGxvYWQsIHBvc3RlZCk7Ci0JX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGN0cmwsIHBvc3RlZCk7CisJX19vbWFwX2RtX3RpbWVyX3dyaXRlKHRpbWVyLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHLCBsb2FkLCBwb3N0ZWQpOworCV9fb21hcF9kbV90aW1lcl93cml0ZSh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgY3RybCwgcG9zdGVkKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fb21hcF9kbV90aW1lcl9pbnRfZW5hYmxlKHZvaWQgX19pb21lbSAqYmFzZSwKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX29tYXBfZG1fdGltZXJfaW50X2VuYWJsZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsCiAJCQkJCQl1bnNpZ25lZCBpbnQgdmFsdWUpCiB7Ci0JX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfSU5UX0VOX1JFRywgdmFsdWUsIDApOwotCV9fb21hcF9kbV90aW1lcl93cml0ZShiYXNlLCBPTUFQX1RJTUVSX1dBS0VVUF9FTl9SRUcsIHZhbHVlLCAwKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIHRpbWVyLT5pcnFfZW5hKTsKKwlfX29tYXBfZG1fdGltZXJfd3JpdGUodGltZXIsIE9NQVBfVElNRVJfV0FLRVVQX0VOX1JFRywgdmFsdWUsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX29tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKHZvaWQgX19pb21lbSAqYmFzZSwKLQkJCQkJCQlpbnQgcG9zdGVkKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK19fb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgcG9zdGVkKQogewotCXJldHVybiBfX29tYXBfZG1fdGltZXJfcmVhZChiYXNlLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHLCBwb3N0ZWQpOworCXJldHVybiBfX29tYXBfZG1fdGltZXJfcmVhZCh0aW1lciwgT01BUF9USU1FUl9DT1VOVEVSX1JFRywgcG9zdGVkKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXModm9pZCBfX2lvbWVtICpiYXNlLAorc3RhdGljIGlubGluZSB2b2lkIF9fb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLAogCQkJCQkJdW5zaWduZWQgaW50IHZhbHVlKQogewotCV9fb21hcF9kbV90aW1lcl93cml0ZShiYXNlLCBPTUFQX1RJTUVSX1NUQVRfUkVHLCB2YWx1ZSwgMCk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCB0aW1lci0+aXJxX3N0YXQpOwogfQogCiAjZW5kaWYgLyogX19BU01fQVJDSF9ETVRJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZ3Bpby5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9ncGlvLmgKaW5kZXggOTFlOGRlMy4uOWU4NmVlMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9ncGlvLmgKQEAgLTIyMiwyNiArMjIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KIAotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKLXsKLQlfX2dwaW9fc2V0X3ZhbHVlKGdwaW8sIHZhbHVlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19jYW5zbGVlcCh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBfX2dwaW9fY2Fuc2xlZXAoZ3Bpbyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIF9fZ3Bpb190b19pcnEoZ3Bpbyk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGlycSkKIHsKIAlpbnQgdG1wOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pby5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pby5oCmluZGV4IGQ3MmVjODUuLjdmMjk2OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvLmgKQEAgLTIyOCwxMyArMjI4LDEzIEBACiAKICNkZWZpbmUgT01BUDQ0WFhfRU1JRjJfUEhZUwlPTUFQNDRYWF9FTUlGMl9CQVNFCiAJCQkJCQkvKiAweDRkMDAwMDAwIC0tPiAweGZkMjAwMDAwICovCi0jZGVmaW5lIE9NQVA0NFhYX0VNSUYyX1ZJUlQJKE9NQVA0NFhYX0VNSUYyX1BIWVMgKyBPTUFQNF9MM19QRVJfSU9fT0ZGU0VUKQogI2RlZmluZSBPTUFQNDRYWF9FTUlGMl9TSVpFCVNaXzFNCisjZGVmaW5lIE9NQVA0NFhYX0VNSUYyX1ZJUlQJKE9NQVA0NFhYX0VNSUYxX1ZJUlQgKyBPTUFQNDRYWF9FTUlGMV9TSVpFKQogCiAjZGVmaW5lIE9NQVA0NFhYX0RNTV9QSFlTCU9NQVA0NFhYX0RNTV9CQVNFCiAJCQkJCQkvKiAweDRlMDAwMDAwIC0tPiAweGZkMzAwMDAwICovCi0jZGVmaW5lIE9NQVA0NFhYX0RNTV9WSVJUCShPTUFQNDRYWF9ETU1fUEhZUyArIE9NQVA0X0wzX1BFUl9JT19PRkZTRVQpCiAjZGVmaW5lIE9NQVA0NFhYX0RNTV9TSVpFCVNaXzFNCisjZGVmaW5lIE9NQVA0NFhYX0RNTV9WSVJUCShPTUFQNDRYWF9FTUlGMl9WSVJUICsgT01BUDQ0WFhfRU1JRjJfU0laRSkKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBPbWFwIHNwZWNpZmljIHJlZ2lzdGVyIGFjY2VzcwpAQCAtMjQ3LDYgKzI0Nyw4IEBACiAgKiBOT1RFOiBQbGVhc2UgdXNlIGlvcmVtYXAgKyBfX3Jhd19yZWFkL3dyaXRlIHdoZXJlIHBvc3NpYmxlIGluc3RlYWQgb2YgdGhlc2UKICAqLwogCit2b2lkIG9tYXBfaW9yZW1hcF9pbml0KHZvaWQpOworCiBleHRlcm4gdTggb21hcF9yZWFkYih1MzIgcGEpOwogZXh0ZXJuIHUxNiBvbWFwX3JlYWR3KHUzMiBwYSk7CiBleHRlcm4gdTMyIG9tYXBfcmVhZGwodTMyIHBhKTsKQEAgLTI1Niw4ICsyNTgsMzEgQEAKIAogc3RydWN0IG9tYXBfc2RyY19wYXJhbXM7CiAKLWV4dGVybiB2b2lkIG9tYXAxX21hcF9jb21tb25faW8odm9pZCk7Ci1leHRlcm4gdm9pZCBvbWFwMV9pbml0X2NvbW1vbl9odyh2b2lkKTsKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDg1MCkKK3ZvaWQgb21hcDd4eF9tYXBfaW8odm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfbWFwX2lvKHZvaWQpCit7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCit2b2lkIG9tYXAxNXh4X21hcF9pbyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcDE1eHhfbWFwX2lvKHZvaWQpCit7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCit2b2lkIG9tYXAxNnh4X21hcF9pbyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcDE2eHhfbWFwX2lvKHZvaWQpCit7Cit9CisjZW5kaWYKKwordm9pZCBvbWFwMV9pbml0X2Vhcmx5KHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX1NPQ19PTUFQMjQyMAogZXh0ZXJuIHZvaWQgb21hcDI0MnhfbWFwX2NvbW1vbl9pbyh2b2lkKTsKQEAgLTMwMCw3ICszMjUsNyBAQAogI2VuZGlmCiAKIGV4dGVybiB2b2lkIG9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKHZvaWQpOwotZXh0ZXJuIHZvaWQgb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtcyAqc2RyY19jczAsCitleHRlcm4gdm9pZCBvbWFwX3NkcmNfaW5pdChzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtcyAqc2RyY19jczAsCiAJCQkJICAgICAgc3RydWN0IG9tYXBfc2RyY19wYXJhbXMgKnNkcmNfY3MxKTsKIAogI2RlZmluZSBfX2FyY2hfaW9yZW1hcAlvbWFwX2lvcmVtYXAKQEAgLTMwOSw2ICszMzQsOCBAQAogdm9pZCBfX2lvbWVtICpvbWFwX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHR5cGUpOwogdm9pZCBvbWFwX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKIAorZXh0ZXJuIHZvaWQgX19pbml0IG9tYXBfaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKHZvaWQpOworCiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvbW11LmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvbW11LmgKaW5kZXggMTc0ZjFiOS4uYTFkNzllZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb21tdS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW9tbXUuaApAQCAtMjUsMTYgKzI1LDE3IEBACiAJfTsKIH07CiAKLXN0cnVjdCBpb21tdSB7CitzdHJ1Y3Qgb21hcF9pb21tdSB7CiAJY29uc3QgY2hhcgkqbmFtZTsKIAlzdHJ1Y3QgbW9kdWxlCSpvd25lcjsKIAlzdHJ1Y3QgY2xrCSpjbGs7CiAJdm9pZCBfX2lvbWVtCSpyZWdiYXNlOwogCXN0cnVjdCBkZXZpY2UJKmRldjsKIAl2b2lkCQkqaXNyX3ByaXY7CisJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluOwogCiAJdW5zaWduZWQgaW50CXJlZmNvdW50OwotCXN0cnVjdCBtdXRleAlpb21tdV9sb2NrOwkvKiBnbG9iYWwgZm9yIHRoaXMgd2hvbGUgb2JqZWN0ICovCisJc3BpbmxvY2tfdAlpb21tdV9sb2NrOwkvKiBnbG9iYWwgZm9yIHRoaXMgd2hvbGUgb2JqZWN0ICovCiAKIAkvKgogCSAqIFdlIGRvbid0IGNoYW5nZSBpb3BnZCBmb3IgYSBzaXR1YXRpb24gbGlrZSBwZ2QgZm9yIGEgdGFzaywKQEAgLTQ4LDggKzQ5LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCW1tYXA7CiAJc3RydWN0IG11dGV4CQltbWFwX2xvY2s7IC8qIHByb3RlY3QgbW1hcCAqLwogCi0JaW50ICgqaXNyKShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgaW9tbXVfZXJycywgdm9pZCAqcHJpdik7Ci0KIAl2b2lkICpjdHg7IC8qIGlvbW11IGNvbnRleHQ6IHJlZ2lzdHJlcyBzYXZlZCBhcmVhICovCiAJdTMyIGRhX3N0YXJ0OwogCXUzMiBkYV9lbmQ7CkBAIC04MSwyNSArODAsMjcgQEAKIHN0cnVjdCBpb21tdV9mdW5jdGlvbnMgewogCXVuc2lnbmVkIGxvbmcJdmVyc2lvbjsKIAotCWludCAoKmVuYWJsZSkoc3RydWN0IGlvbW11ICpvYmopOwotCXZvaWQgKCpkaXNhYmxlKShzdHJ1Y3QgaW9tbXUgKm9iaik7Ci0Jdm9pZCAoKnNldF90d2wpKHN0cnVjdCBpb21tdSAqb2JqLCBib29sIG9uKTsKLQl1MzIgKCpmYXVsdF9pc3IpKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgKnJhKTsKKwlpbnQgKCplbmFibGUpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmopOworCXZvaWQgKCpkaXNhYmxlKShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKTsKKwl2b2lkICgqc2V0X3R3bCkoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgYm9vbCBvbik7CisJdTMyICgqZmF1bHRfaXNyKShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgKnJhKTsKIAotCXZvaWQgKCp0bGJfcmVhZF9jcikoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcik7Ci0Jdm9pZCAoKnRsYl9sb2FkX2NyKShzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyKTsKKwl2b2lkICgqdGxiX3JlYWRfY3IpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcik7CisJdm9pZCAoKnRsYl9sb2FkX2NyKShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IpOwogCi0Jc3RydWN0IGNyX3JlZ3MgKigqYWxsb2NfY3IpKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpOworCXN0cnVjdCBjcl9yZWdzICooKmFsbG9jX2NyKShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCQkJCXN0cnVjdCBpb3RsYl9lbnRyeSAqZSk7CiAJaW50ICgqY3JfdmFsaWQpKHN0cnVjdCBjcl9yZWdzICpjcik7CiAJdTMyICgqY3JfdG9fdmlydCkoc3RydWN0IGNyX3JlZ3MgKmNyKTsKIAl2b2lkICgqY3JfdG9fZSkoc3RydWN0IGNyX3JlZ3MgKmNyLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpOwotCXNzaXplX3QgKCpkdW1wX2NyKShzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyLCBjaGFyICpidWYpOworCXNzaXplX3QgKCpkdW1wX2NyKShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IsCisJCQkJCQkJY2hhciAqYnVmKTsKIAogCXUzMiAoKmdldF9wdGVfYXR0cikoc3RydWN0IGlvdGxiX2VudHJ5ICplKTsKIAotCXZvaWQgKCpzYXZlX2N0eCkoc3RydWN0IGlvbW11ICpvYmopOwotCXZvaWQgKCpyZXN0b3JlX2N0eCkoc3RydWN0IGlvbW11ICpvYmopOwotCXNzaXplX3QgKCpkdW1wX2N0eCkoc3RydWN0IGlvbW11ICpvYmosIGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4pOworCXZvaWQgKCpzYXZlX2N0eCkoc3RydWN0IG9tYXBfaW9tbXUgKm9iaik7CisJdm9pZCAoKnJlc3RvcmVfY3R4KShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKTsKKwlzc2l6ZV90ICgqZHVtcF9jdHgpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4pOwogfTsKIAogc3RydWN0IGlvbW11X3BsYXRmb3JtX2RhdGEgewpAQCAtMTUwLDQwICsxNTEsMzEgQEAKIC8qCiAgKiBnbG9iYWwgZnVuY3Rpb25zCiAgKi8KLWV4dGVybiB1MzIgaW9tbXVfYXJjaF92ZXJzaW9uKHZvaWQpOworZXh0ZXJuIHUzMiBvbWFwX2lvbW11X2FyY2hfdmVyc2lvbih2b2lkKTsKIAotZXh0ZXJuIHZvaWQgaW90bGJfY3JfdG9fZShzdHJ1Y3QgY3JfcmVncyAqY3IsIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSk7Ci1leHRlcm4gdTMyIGlvdGxiX2NyX3RvX3ZpcnQoc3RydWN0IGNyX3JlZ3MgKmNyKTsKK2V4dGVybiB2b2lkIG9tYXBfaW90bGJfY3JfdG9fZShzdHJ1Y3QgY3JfcmVncyAqY3IsIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSk7CiAKLWV4dGVybiBpbnQgbG9hZF9pb3RsYl9lbnRyeShzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGlvdGxiX2VudHJ5ICplKTsKLWV4dGVybiB2b2lkIGlvbW11X3NldF90d2woc3RydWN0IGlvbW11ICpvYmosIGJvb2wgb24pOwotZXh0ZXJuIHZvaWQgZmx1c2hfaW90bGJfcGFnZShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhKTsKLWV4dGVybiB2b2lkIGZsdXNoX2lvdGxiX3JhbmdlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgc3RhcnQsIHUzMiBlbmQpOwotZXh0ZXJuIHZvaWQgZmx1c2hfaW90bGJfYWxsKHN0cnVjdCBpb21tdSAqb2JqKTsKK2V4dGVybiBpbnQKK29tYXBfaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSk7CiAKLWV4dGVybiBpbnQgaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpOwotZXh0ZXJuIHZvaWQgaW9wZ3RhYmxlX2xvb2t1cF9lbnRyeShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgKipwcGdkLAotCQkJCSAgIHUzMiAqKnBwdGUpOwotZXh0ZXJuIHNpemVfdCBpb3BndGFibGVfY2xlYXJfZW50cnkoc3RydWN0IGlvbW11ICpvYmosIHUzMiBpb3ZhKTsKLQotZXh0ZXJuIGludCBpb21tdV9zZXRfZGFfcmFuZ2Uoc3RydWN0IGlvbW11ICpvYmosIHUzMiBzdGFydCwgdTMyIGVuZCk7Ci1leHRlcm4gc3RydWN0IGlvbW11ICppb21tdV9nZXQoY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gdm9pZCBpb21tdV9wdXQoc3RydWN0IGlvbW11ICpvYmopOwotZXh0ZXJuIGludCBpb21tdV9zZXRfaXNyKGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgaW50ICgqaXNyKShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgaW9tbXVfZXJycywKK2V4dGVybiBpbnQgb21hcF9pb21tdV9zZXRfaXNyKGNvbnN0IGNoYXIgKm5hbWUsCisJCSBpbnQgKCppc3IpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSwgdTMyIGlvbW11X2VycnMsCiAJCQkJICAgIHZvaWQgKnByaXYpLAogCQkJIHZvaWQgKmlzcl9wcml2KTsKIAotZXh0ZXJuIHZvaWQgaW9tbXVfc2F2ZV9jdHgoc3RydWN0IGlvbW11ICpvYmopOwotZXh0ZXJuIHZvaWQgaW9tbXVfcmVzdG9yZV9jdHgoc3RydWN0IGlvbW11ICpvYmopOworZXh0ZXJuIHZvaWQgb21hcF9pb21tdV9zYXZlX2N0eChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKTsKK2V4dGVybiB2b2lkIG9tYXBfaW9tbXVfcmVzdG9yZV9jdHgoc3RydWN0IG9tYXBfaW9tbXUgKm9iaik7CiAKLWV4dGVybiBpbnQgaW5zdGFsbF9pb21tdV9hcmNoKGNvbnN0IHN0cnVjdCBpb21tdV9mdW5jdGlvbnMgKm9wcyk7Ci1leHRlcm4gdm9pZCB1bmluc3RhbGxfaW9tbXVfYXJjaChjb25zdCBzdHJ1Y3QgaW9tbXVfZnVuY3Rpb25zICpvcHMpOworZXh0ZXJuIGludCBvbWFwX2luc3RhbGxfaW9tbXVfYXJjaChjb25zdCBzdHJ1Y3QgaW9tbXVfZnVuY3Rpb25zICpvcHMpOworZXh0ZXJuIHZvaWQgb21hcF91bmluc3RhbGxfaW9tbXVfYXJjaChjb25zdCBzdHJ1Y3QgaW9tbXVfZnVuY3Rpb25zICpvcHMpOwogCi1leHRlcm4gaW50IGZvcmVhY2hfaW9tbXVfZGV2aWNlKHZvaWQgKmRhdGEsCitleHRlcm4gaW50IG9tYXBfZm9yZWFjaF9pb21tdV9kZXZpY2Uodm9pZCAqZGF0YSwKIAkJCQlpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKIAotZXh0ZXJuIHNzaXplX3QgaW9tbXVfZHVtcF9jdHgoc3RydWN0IGlvbW11ICpvYmosIGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4pOwotZXh0ZXJuIHNpemVfdCBkdW1wX3RsYl9lbnRyaWVzKHN0cnVjdCBpb21tdSAqb2JqLCBjaGFyICpidWYsIHNzaXplX3QgbGVuKTsKK2V4dGVybiBzc2l6ZV90CitvbWFwX2lvbW11X2R1bXBfY3R4KHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4pOworZXh0ZXJuIHNpemVfdAorb21hcF9kdW1wX3RsYl9lbnRyaWVzKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4pOworc3RydWN0IGRldmljZSAqb21hcF9maW5kX2lvbW11X2RldmljZShjb25zdCBjaGFyICpuYW1lKTsKIAogI2VuZGlmIC8qIF9fTUFDSF9JT01NVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvbW11Mi5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb21tdTIuaAppbmRleCAxMGFkMDVmLi5kNDExNmI1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb21tdTIuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvbW11Mi5oCkBAIC04MywxMiArODMsMTIgQEAKIC8qCiAgKiByZWdpc3RlciBhY2Nlc3NvcnMKICAqLwotc3RhdGljIGlubGluZSB1MzIgaW9tbXVfcmVhZF9yZWcoc3RydWN0IGlvbW11ICpvYmosIHNpemVfdCBvZmZzKQorc3RhdGljIGlubGluZSB1MzIgaW9tbXVfcmVhZF9yZWcoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc2l6ZV90IG9mZnMpCiB7CiAJcmV0dXJuIF9fcmF3X3JlYWRsKG9iai0+cmVnYmFzZSArIG9mZnMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW9tbXVfd3JpdGVfcmVnKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgdmFsLCBzaXplX3Qgb2ZmcykKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb21tdV93cml0ZV9yZWcoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIHZhbCwgc2l6ZV90IG9mZnMpCiB7CiAJX19yYXdfd3JpdGVsKHZhbCwgb2JqLT5yZWdiYXNlICsgb2Zmcyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvcGd0YWJsZS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3BndGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE4MTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3BndGFibGUuaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIG9tYXAgaW9tbXU6IHBhZ2V0YWJsZSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogV3JpdHRlbiBieSBIaXJvc2hpIERPWVUgPEhpcm9zaGkuRE9ZVUBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fUExBVF9PTUFQX0lPTU1VX0gKKyNkZWZpbmUgX19QTEFUX09NQVBfSU9NTVVfSAorCisvKgorICogIkwyIHRhYmxlIiBhZGRyZXNzIG1hc2sgYW5kIHNpemUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgSU9QR0RfU0hJRlQJCTIwCisjZGVmaW5lIElPUEdEX1NJWkUJCSgxVUwgPDwgSU9QR0RfU0hJRlQpCisjZGVmaW5lIElPUEdEX01BU0sJCSh+KElPUEdEX1NJWkUgLSAxKSkKKworLyoKKyAqICJzZWN0aW9uIiBhZGRyZXNzIG1hc2sgYW5kIHNpemUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgSU9TRUNUSU9OX1NISUZUCQkyMAorI2RlZmluZSBJT1NFQ1RJT05fU0laRQkJKDFVTCA8PCBJT1NFQ1RJT05fU0hJRlQpCisjZGVmaW5lIElPU0VDVElPTl9NQVNLCQkofihJT1NFQ1RJT05fU0laRSAtIDEpKQorCisvKgorICogInN1cGVyc2VjdGlvbiIgYWRkcmVzcyBtYXNrIGFuZCBzaXplIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIElPU1VQRVJfU0hJRlQJCTI0CisjZGVmaW5lIElPU1VQRVJfU0laRQkJKDFVTCA8PCBJT1NVUEVSX1NISUZUKQorI2RlZmluZSBJT1NVUEVSX01BU0sJCSh+KElPU1VQRVJfU0laRSAtIDEpKQorCisjZGVmaW5lIFBUUlNfUEVSX0lPUEdECQkoMVVMIDw8ICgzMiAtIElPUEdEX1NISUZUKSkKKyNkZWZpbmUgSU9QR0RfVEFCTEVfU0laRQkoUFRSU19QRVJfSU9QR0QgKiBzaXplb2YodTMyKSkKKworLyoKKyAqICJzbWFsbCBwYWdlIiBhZGRyZXNzIG1hc2sgYW5kIHNpemUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgSU9QVEVfU0hJRlQJCTEyCisjZGVmaW5lIElPUFRFX1NJWkUJCSgxVUwgPDwgSU9QVEVfU0hJRlQpCisjZGVmaW5lIElPUFRFX01BU0sJCSh+KElPUFRFX1NJWkUgLSAxKSkKKworLyoKKyAqICJsYXJnZSBwYWdlIiBhZGRyZXNzIG1hc2sgYW5kIHNpemUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgSU9MQVJHRV9TSElGVAkJMTYKKyNkZWZpbmUgSU9MQVJHRV9TSVpFCQkoMVVMIDw8IElPTEFSR0VfU0hJRlQpCisjZGVmaW5lIElPTEFSR0VfTUFTSwkJKH4oSU9MQVJHRV9TSVpFIC0gMSkpCisKKyNkZWZpbmUgUFRSU19QRVJfSU9QVEUJCSgxVUwgPDwgKElPUEdEX1NISUZUIC0gSU9QVEVfU0hJRlQpKQorI2RlZmluZSBJT1BURV9UQUJMRV9TSVpFCShQVFJTX1BFUl9JT1BURSAqIHNpemVvZih1MzIpKQorCisjZGVmaW5lIElPUEFHRV9NQVNLCQlJT1BURV9NQVNLCisKKy8qKgorICogb21hcF9pb21tdV90cmFuc2xhdGUoKSAtIHZhIHRvIHBhIHRyYW5zbGF0aW9uCisgKiBAZDoJCW9tYXAgaW9tbXUgZGVzY3JpcHRvcgorICogQHZhOgkJdmlydHVhbCBhZGRyZXNzCisgKiBAbWFzazoJb21hcCBpb21tdSBkZXNjcmlwdG9yIG1hc2sKKyAqCisgKiB2YSB0byBwYSB0cmFuc2xhdGlvbgorICovCitzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IG9tYXBfaW9tbXVfdHJhbnNsYXRlKHUzMiBkLCB1MzIgdmEsIHUzMiBtYXNrKQoreworCXJldHVybiAoZCAmIG1hc2spIHwgKHZhICYgKH5tYXNrKSk7Cit9CisKKy8qCisgKiBzb21lIGRlc2NyaXB0b3IgYXR0cmlidXRlcy4KKyAqLworI2RlZmluZSBJT1BHRF9UQUJMRQkJKDEgPDwgMCkKKyNkZWZpbmUgSU9QR0RfU0VDVElPTgkJKDIgPDwgMCkKKyNkZWZpbmUgSU9QR0RfU1VQRVIJCSgxIDw8IDE4IHwgMiA8PCAwKQorCisjZGVmaW5lIGlvcGdkX2lzX3RhYmxlKHgpCSgoKHgpICYgMykgPT0gSU9QR0RfVEFCTEUpCisjZGVmaW5lIGlvcGdkX2lzX3NlY3Rpb24oeCkJKCgoeCkgJiAoMSA8PCAxOCB8IDMpKSA9PSBJT1BHRF9TRUNUSU9OKQorI2RlZmluZSBpb3BnZF9pc19zdXBlcih4KQkoKCh4KSAmICgxIDw8IDE4IHwgMykpID09IElPUEdEX1NVUEVSKQorCisjZGVmaW5lIElPUFRFX1NNQUxMCQkoMiA8PCAwKQorI2RlZmluZSBJT1BURV9MQVJHRQkJKDEgPDwgMCkKKworI2RlZmluZSBpb3B0ZV9pc19zbWFsbCh4KQkoKCh4KSAmIDIpID09IElPUFRFX1NNQUxMKQorI2RlZmluZSBpb3B0ZV9pc19sYXJnZSh4KQkoKCh4KSAmIDMpID09IElPUFRFX0xBUkdFKQorCisvKiB0byBmaW5kIGFuIGVudHJ5IGluIGEgcGFnZS10YWJsZS1kaXJlY3RvcnkgKi8KKyNkZWZpbmUgaW9wZ2RfaW5kZXgoZGEpCQkoKChkYSkgPj4gSU9QR0RfU0hJRlQpICYgKFBUUlNfUEVSX0lPUEdEIC0gMSkpCisjZGVmaW5lIGlvcGdkX29mZnNldChvYmosIGRhKQkoKG9iaiktPmlvcGdkICsgaW9wZ2RfaW5kZXgoZGEpKQorCisjZGVmaW5lIGlvcGdkX3BhZ2VfcGFkZHIoaW9wZ2QpCSgqaW9wZ2QgJiB+KCgxIDw8IDEwKSAtIDEpKQorI2RlZmluZSBpb3BnZF9wYWdlX3ZhZGRyKGlvcGdkKQkoKHUzMiAqKXBoeXNfdG9fdmlydChpb3BnZF9wYWdlX3BhZGRyKGlvcGdkKSkpCisKKy8qIHRvIGZpbmQgYW4gZW50cnkgaW4gdGhlIHNlY29uZC1sZXZlbCBwYWdlIHRhYmxlLiAqLworI2RlZmluZSBpb3B0ZV9pbmRleChkYSkJCSgoKGRhKSA+PiBJT1BURV9TSElGVCkgJiAoUFRSU19QRVJfSU9QVEUgLSAxKSkKKyNkZWZpbmUgaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSkJKGlvcGdkX3BhZ2VfdmFkZHIoaW9wZ2QpICsgaW9wdGVfaW5kZXgoZGEpKQorCitzdGF0aWMgaW5saW5lIHUzMiBpb3RsYl9pbml0X2VudHJ5KHN0cnVjdCBpb3RsYl9lbnRyeSAqZSwgdTMyIGRhLCB1MzIgcGEsCisJCQkJICAgdTMyIGZsYWdzKQoreworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKworCWUtPmRhCQk9IGRhOworCWUtPnBhCQk9IHBhOworCWUtPnZhbGlkCT0gMTsKKwkvKiBGSVhNRTogYWRkIE9NQVAxIHN1cHBvcnQgKi8KKwllLT5wZ3N6CQk9IGZsYWdzICYgTU1VX0NBTV9QR1NaX01BU0s7CisJZS0+ZW5kaWFuCT0gZmxhZ3MgJiBNTVVfUkFNX0VORElBTl9NQVNLOworCWUtPmVsc3oJCT0gZmxhZ3MgJiBNTVVfUkFNX0VMU1pfTUFTSzsKKwllLT5taXhlZAk9IGZsYWdzICYgTU1VX1JBTV9NSVhFRF9NQVNLOworCisJcmV0dXJuIGlvcGdzel90b19ieXRlcyhlLT5wZ3N6KTsKK30KKworI2RlZmluZSB0b19pb21tdShkZXYpCQkJCQkJCVwKKwkoc3RydWN0IG9tYXBfaW9tbXUgKilwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSkKKworI2VuZGlmIC8qIF9fUExBVF9PTUFQX0lPTU1VX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW92bW0uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW92bW0uaAppbmRleCBlOTkyYjk2Li42YWYxYTkxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvdm1tLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3ZtbS5oCkBAIC0xMyw4ICsxMywxMCBAQAogI2lmbmRlZiBfX0lPTU1VX01NQVBfSAogI2RlZmluZSBfX0lPTU1VX01NQVBfSAogCisjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KKwogc3RydWN0IGlvdm1fc3RydWN0IHsKLQlzdHJ1Y3QgaW9tbXUJCSppb21tdTsJLyogaW9tbXUgb2JqZWN0IHdoaWNoIHRoaXMgYmVsb25ncyB0byAqLworCXN0cnVjdCBvbWFwX2lvbW11CSppb21tdTsJLyogaW9tbXUgb2JqZWN0IHdoaWNoIHRoaXMgYmVsb25ncyB0byAqLwogCXUzMgkJCWRhX3N0YXJ0OyAvKiBhcmVhIGRlZmluaXRpb24gKi8KIAl1MzIJCQlkYV9lbmQ7CiAJdTMyCQkJZmxhZ3M7IC8qIElPVk1GXzogc2VlIGJlbG93ICovCkBAIC03MCwyMCArNzIsMTggQEAKICNkZWZpbmUgSU9WTUZfREFfRklYRUQJCSgxIDw8ICg0ICsgSU9WTUZfU1dfU0hJRlQpKQogCiAKLWV4dGVybiBzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmZpbmRfaW92bV9hcmVhKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpOwotZXh0ZXJuIHUzMiBpb21tdV92bWFwKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsCitleHRlcm4gc3RydWN0IGlvdm1fc3RydWN0ICpvbWFwX2ZpbmRfaW92bV9hcmVhKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSk7CitleHRlcm4gdTMyCitvbWFwX2lvbW11X3ZtYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEsCiAJCQljb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdTMyIGZsYWdzKTsKLWV4dGVybiBzdHJ1Y3Qgc2dfdGFibGUgKmlvbW11X3Z1bm1hcChzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhKTsKLWV4dGVybiB1MzIgaW9tbXVfdm1hbGxvYyhzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCBzaXplX3QgYnl0ZXMsCi0JCQkgICB1MzIgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgaW9tbXVfdmZyZWUoc3RydWN0IGlvbW11ICpvYmosIGNvbnN0IHUzMiBkYSk7Ci1leHRlcm4gdTMyIGlvbW11X2ttYXAoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCBzaXplX3QgYnl0ZXMsCi0JCQl1MzIgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgaW9tbXVfa3VubWFwKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpOwotZXh0ZXJuIHUzMiBpb21tdV9rbWFsbG9jKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHNpemVfdCBieXRlcywKLQkJCSAgIHUzMiBmbGFncyk7Ci1leHRlcm4gdm9pZCBpb21tdV9rZnJlZShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhKTsKLQotZXh0ZXJuIHZvaWQgKmRhX3RvX3ZhKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpOworZXh0ZXJuIHN0cnVjdCBzZ190YWJsZSAqb21hcF9pb21tdV92dW5tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCXN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSk7CitleHRlcm4gdTMyCitvbWFwX2lvbW11X3ZtYWxsb2Moc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCXUzMiBkYSwgc2l6ZV90IGJ5dGVzLCB1MzIgZmxhZ3MpOworZXh0ZXJuIHZvaWQKK29tYXBfaW9tbXVfdmZyZWUoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCWNvbnN0IHUzMiBkYSk7CitleHRlcm4gdm9pZCAqb21hcF9kYV90b192YShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEpOwogCiAjZW5kaWYgLyogX19JT01NVV9NTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbWNic3AuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbWNic3AuaAppbmRleCA5ODgyYzY1Li44ZmE3NGUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21jYnNwLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tY2JzcC5oCkBAIC0yNSw5ICsyNSw3IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfT01BUF9NQ0JTUF9ICiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogLyogbWFjcm8gZm9yIGJ1aWxkaW5nIHBsYXRmb3JtX2RldmljZSBmb3IgTWNCU1AgcG9ydHMgKi8KICNkZWZpbmUgT01BUF9NQ0JTUF9QTEFURk9STV9ERVZJQ0UocG9ydF9ucikJCVwKQEAgLTQwLDEwNCArMzgsNjAgQEAKICNkZWZpbmUgTUNCU1BfQ09ORklHX1RZUEUzCTB4MwogI2RlZmluZSBNQ0JTUF9DT05GSUdfVFlQRTQJMHg0CiAKLSNkZWZpbmUgT01BUDdYWF9NQ0JTUDFfQkFTRQkweGZmZmIxMDAwCi0jZGVmaW5lIE9NQVA3WFhfTUNCU1AyX0JBU0UJMHhmZmZiMTgwMAorLyogTWNCU1AgcmVnaXN0ZXIgbnVtYmVycy4gUmVnaXN0ZXIgYWRkcmVzcyBvZmZzZXQgPSBudW0gKiByZWdfc3RlcCAqLworZW51bSB7CisJLyogQ29tbW9uIHJlZ2lzdGVycyAqLworCU9NQVBfTUNCU1BfUkVHX1NQQ1IyID0gNCwKKwlPTUFQX01DQlNQX1JFR19TUENSMSwKKwlPTUFQX01DQlNQX1JFR19SQ1IyLAorCU9NQVBfTUNCU1BfUkVHX1JDUjEsCisJT01BUF9NQ0JTUF9SRUdfWENSMiwKKwlPTUFQX01DQlNQX1JFR19YQ1IxLAorCU9NQVBfTUNCU1BfUkVHX1NSR1IyLAorCU9NQVBfTUNCU1BfUkVHX1NSR1IxLAorCU9NQVBfTUNCU1BfUkVHX01DUjIsCisJT01BUF9NQ0JTUF9SRUdfTUNSMSwKKwlPTUFQX01DQlNQX1JFR19SQ0VSQSwKKwlPTUFQX01DQlNQX1JFR19SQ0VSQiwKKwlPTUFQX01DQlNQX1JFR19YQ0VSQSwKKwlPTUFQX01DQlNQX1JFR19YQ0VSQiwKKwlPTUFQX01DQlNQX1JFR19QQ1IwLAorCU9NQVBfTUNCU1BfUkVHX1JDRVJDLAorCU9NQVBfTUNCU1BfUkVHX1JDRVJELAorCU9NQVBfTUNCU1BfUkVHX1hDRVJDLAorCU9NQVBfTUNCU1BfUkVHX1hDRVJELAorCU9NQVBfTUNCU1BfUkVHX1JDRVJFLAorCU9NQVBfTUNCU1BfUkVHX1JDRVJGLAorCU9NQVBfTUNCU1BfUkVHX1hDRVJFLAorCU9NQVBfTUNCU1BfUkVHX1hDRVJGLAorCU9NQVBfTUNCU1BfUkVHX1JDRVJHLAorCU9NQVBfTUNCU1BfUkVHX1JDRVJILAorCU9NQVBfTUNCU1BfUkVHX1hDRVJHLAorCU9NQVBfTUNCU1BfUkVHX1hDRVJILAogCi0jZGVmaW5lIE9NQVAxNTEwX01DQlNQMV9CQVNFCTB4ZTEwMTE4MDAKLSNkZWZpbmUgT01BUDE1MTBfTUNCU1AyX0JBU0UJMHhmZmZiMTAwMAotI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDNfQkFTRQkweGUxMDE3MDAwCisJLyogT01BUDEtT01BUDI0MjAgcmVnaXN0ZXJzICovCisJT01BUF9NQ0JTUF9SRUdfRFJSMiA9IDAsCisJT01BUF9NQ0JTUF9SRUdfRFJSMSwKKwlPTUFQX01DQlNQX1JFR19EWFIyLAorCU9NQVBfTUNCU1BfUkVHX0RYUjEsCiAKLSNkZWZpbmUgT01BUDE2MTBfTUNCU1AxX0JBU0UJMHhlMTAxMTgwMAotI2RlZmluZSBPTUFQMTYxMF9NQ0JTUDJfQkFTRQkweGZmZmIxMDAwCi0jZGVmaW5lIE9NQVAxNjEwX01DQlNQM19CQVNFCTB4ZTEwMTcwMDAKKwkvKiBPTUFQMjQzMCBhbmQgb253YXJkcyAqLworCU9NQVBfTUNCU1BfUkVHX0RSUiA9IDAsCisJT01BUF9NQ0JTUF9SRUdfRFhSID0gMiwKKwlPTUFQX01DQlNQX1JFR19TWVNDT04gPQkzNSwKKwlPTUFQX01DQlNQX1JFR19USFJTSDIsCisJT01BUF9NQ0JTUF9SRUdfVEhSU0gxLAorCU9NQVBfTUNCU1BfUkVHX0lSUVNUID0gNDAsCisJT01BUF9NQ0JTUF9SRUdfSVJRRU4sCisJT01BUF9NQ0JTUF9SRUdfV0FLRVVQRU4sCisJT01BUF9NQ0JTUF9SRUdfWENDUiwKKwlPTUFQX01DQlNQX1JFR19SQ0NSLAorCU9NQVBfTUNCU1BfUkVHX1hCVUZGU1RBVCwKKwlPTUFQX01DQlNQX1JFR19SQlVGRlNUQVQsCisJT01BUF9NQ0JTUF9SRUdfU1NFTENSLAorfTsKIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCi0KLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFJSMgkweDAwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RSUjEJMHgwMgotI2RlZmluZSBPTUFQX01DQlNQX1JFR19EWFIyCTB4MDQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFhSMQkweDA2Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RSUgkweDAyCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RYUgkweDA2Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1NQQ1IyCTB4MDgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1BDUjEJMHgwYQotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ1IyCTB4MGMKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNSMQkweDBlCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDUjIJMHgxMAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ1IxCTB4MTIKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1JHUjIJMHgxNAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19TUkdSMQkweDE2Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX01DUjIJMHgxOAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19NQ1IxCTB4MWEKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkEJMHgxYwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSQgkweDFlCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJBCTB4MjAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkIJMHgyMgotI2RlZmluZSBPTUFQX01DQlNQX1JFR19QQ1IwCTB4MjQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkMJMHgyNgotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSRAkweDI4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJDCTB4MkEKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkQJMHgyQwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSRQkweDJFCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJGCTB4MzAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkUJMHgzMgotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSRgkweDM0Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJHCTB4MzYKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkgJMHgzOAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSRwkweDNBCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJICTB4M0MKLQotLyogRHVtbXkgZGVmaW5lcywgdGhlc2UgYXJlIG5vdCBhdmFpbGFibGUgb24gb21hcDEgKi8KLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENDUgkweDAwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDQ1IJMHgwMAotCi0jZWxzZQotCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RSUjIJMHgwMAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19EUlIxCTB4MDQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFhSMgkweDA4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RYUjEJMHgwQwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19EUlIJMHgwMAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19EWFIJMHgwOAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19TUENSMgkweDEwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1NQQ1IxCTB4MTQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNSMgkweDE4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDUjEJMHgxQwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ1IyCTB4MjAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENSMQkweDI0Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1NSR1IyCTB4MjgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1JHUjEJMHgyQwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19NQ1IyCTB4MzAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfTUNSMQkweDM0Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJBCTB4MzgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkIJMHgzQwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSQQkweDQwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJCCTB4NDQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUENSMAkweDQ4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJDCTB4NEMKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkQJMHg1MAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSQwkweDU0Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJECTB4NTgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkUJMHg1QwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSRgkweDYwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJFCTB4NjQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkYJMHg2OAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSRwkweDZDCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJICTB4NzAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkcJMHg3NAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSSAkweDc4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1NZU0NPTgkweDhDCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1RIUlNIMgkweDkwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1RIUlNIMQkweDk0Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0lSUVNUCTB4QTAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfSVJRRU4JMHhBNAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19XQUtFVVBFTgkweEE4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDQ1IJMHhBQwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0NSCTB4QjAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWEJVRkZTVEFUCTB4QjQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkJVRkZTVEFUCTB4QjgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1NFTENSCTB4QkMKLQorLyogT01BUDMgc2lkZXRvbmUgY29udHJvbCByZWdpc3RlcnMgKi8KICNkZWZpbmUgT01BUF9TVF9SRUdfUkVWCQkweDAwCiAjZGVmaW5lIE9NQVBfU1RfUkVHX1NZU0NPTkZJRwkweDEwCiAjZGVmaW5lIE9NQVBfU1RfUkVHX0lSUVNUQVRVUwkweDE4CkBAIC0xNDYsOCArMTAwLDYgQEAKICNkZWZpbmUgT01BUF9TVF9SRUdfU0ZJUkNSCTB4MjgKICNkZWZpbmUgT01BUF9TVF9SRUdfU1NFTENSCTB4MkMKIAotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNY0JTUCBTUENSMSBiaXQgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIFJSU1QJCQkweDAwMDEKICNkZWZpbmUgUlJEWQkJCTB4MDAwMgpAQCAtMzQ0LDIwICsyOTYsMjAgQEAKIHN0cnVjdCBvbWFwX21jYnNwX29wcyB7CiAJdm9pZCAoKnJlcXVlc3QpKHVuc2lnbmVkIGludCk7CiAJdm9pZCAoKmZyZWUpKHVuc2lnbmVkIGludCk7Ci0JaW50ICgqc2V0X2Nsa3Nfc3JjKSh1OCwgdTgpOwogfTsKIAogc3RydWN0IG9tYXBfbWNic3BfcGxhdGZvcm1fZGF0YSB7Ci0JdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2U7Ci0JdTggZG1hX3J4X3N5bmMsIGRtYV90eF9zeW5jOwotCXUxNiByeF9pcnEsIHR4X2lycTsKIAlzdHJ1Y3Qgb21hcF9tY2JzcF9vcHMgKm9wczsKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMwotCS8qIFNpZGV0b25lIGJsb2NrIGZvciBNY0JTUCAyIGFuZCAzICovCi0JdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2Vfc3Q7Ci0jZW5kaWYKIAl1MTYgYnVmZmVyX3NpemU7Ci0JdW5zaWduZWQgaW50IG1jYnNwX2NvbmZpZ190eXBlOworCXU4IHJlZ19zaXplOworCXU4IHJlZ19zdGVwOworCisJLyogTWNCU1AgcGxhdGZvcm0gYW5kIGluc3RhbmNlIHNwZWNpZmljIGZlYXR1cmVzICovCisJYm9vbCBoYXNfd2FrZXVwOyAvKiBXYWtldXAgY2FwYWJpbGl0eSAqLworCWJvb2wgaGFzX2NjcjsgLyogVHJhbnNjZWl2ZXIgaGFzIGNvbmZpZ3VyYXRpb24gY29udHJvbCByZWdpc3RlcnMgKi8KKwlpbnQgKCplbmFibGVfc3RfY2xvY2spKHVuc2lnbmVkIGludCwgYm9vbCk7CisJaW50ICgqc2V0X2Nsa19zcmMpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGNsayAqY2xrLCBjb25zdCBjaGFyICpzcmMpOworCWludCAoKm11eF9zaWduYWwpKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqc2lnbmFsLCBjb25zdCBjaGFyICpzcmMpOwogfTsKIAogc3RydWN0IG9tYXBfbWNic3Bfc3RfZGF0YSB7CkBAIC0zODksMTQgKzM0MSwxMiBAQAogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3Qgb21hcF9tY2JzcF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgY2xrICpmY2xrOwotI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCiAJc3RydWN0IG9tYXBfbWNic3Bfc3RfZGF0YSAqc3RfZGF0YTsKIAlpbnQgZG1hX29wX21vZGU7CiAJdTE2IG1heF90eF90aHJlczsKIAl1MTYgbWF4X3J4X3RocmVzOwotI2VuZGlmCiAJdm9pZCAqcmVnX2NhY2hlOwotCXVuc2lnbmVkIGludCBtY2JzcF9jb25maWdfdHlwZTsKKwlpbnQgcmVnX2NhY2hlX3NpemU7CiB9OwogCiAvKioKQEAgLTQwOCwxNiArMzU4LDEwIEBACiB9OwogCiBleHRlcm4gc3RydWN0IG9tYXBfbWNic3AgKiptY2JzcF9wdHI7Ci1leHRlcm4gaW50IG9tYXBfbWNic3BfY291bnQsIG9tYXBfbWNic3BfY2FjaGVfc2l6ZTsKLQotI2RlZmluZSBvbWFwX21jYnNwX2NoZWNrX3ZhbGlkX2lkKGlkKQkoaWQgPCBvbWFwX21jYnNwX2NvdW50KQotI2RlZmluZSBpZF90b19tY2JzcF9wdHIoaWQpCQltY2JzcF9wdHJbaWRdOworZXh0ZXJuIGludCBvbWFwX21jYnNwX2NvdW50OwogCiBpbnQgb21hcF9tY2JzcF9pbml0KHZvaWQpOwotdm9pZCBvbWFwX21jYnNwX3JlZ2lzdGVyX2JvYXJkX2NmZyhzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IHJlc19jb3VudCwKLQkJCXN0cnVjdCBvbWFwX21jYnNwX3BsYXRmb3JtX2RhdGEgKmNvbmZpZywgaW50IHNpemUpOwogdm9pZCBvbWFwX21jYnNwX2NvbmZpZyh1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBvbWFwX21jYnNwX3JlZ19jZmcgKiBjb25maWcpOwotI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCiB2b2lkIG9tYXBfbWNic3Bfc2V0X3R4X3RocmVzaG9sZCh1bnNpZ25lZCBpbnQgaWQsIHUxNiB0aHJlc2hvbGQpOwogdm9pZCBvbWFwX21jYnNwX3NldF9yeF90aHJlc2hvbGQodW5zaWduZWQgaW50IGlkLCB1MTYgdGhyZXNob2xkKTsKIHUxNiBvbWFwX21jYnNwX2dldF9tYXhfdHhfdGhyZXNob2xkKHVuc2lnbmVkIGludCBpZCk7CkBAIC00MjYsMTggKzM3MCw2IEBACiB1MTYgb21hcF9tY2JzcF9nZXRfdHhfZGVsYXkodW5zaWduZWQgaW50IGlkKTsKIHUxNiBvbWFwX21jYnNwX2dldF9yeF9kZWxheSh1bnNpZ25lZCBpbnQgaWQpOwogaW50IG9tYXBfbWNic3BfZ2V0X2RtYV9vcF9tb2RlKHVuc2lnbmVkIGludCBpZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIG9tYXBfbWNic3Bfc2V0X3R4X3RocmVzaG9sZCh1bnNpZ25lZCBpbnQgaWQsIHUxNiB0aHJlc2hvbGQpCi17IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX21jYnNwX3NldF9yeF90aHJlc2hvbGQodW5zaWduZWQgaW50IGlkLCB1MTYgdGhyZXNob2xkKQoteyB9Ci1zdGF0aWMgaW5saW5lIHUxNiBvbWFwX21jYnNwX2dldF9tYXhfdHhfdGhyZXNob2xkKHVuc2lnbmVkIGludCBpZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSB1MTYgb21hcF9tY2JzcF9nZXRfbWF4X3J4X3RocmVzaG9sZCh1bnNpZ25lZCBpbnQgaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdTE2IG9tYXBfbWNic3BfZ2V0X2ZpZm9fc2l6ZSh1bnNpZ25lZCBpbnQgaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdTE2IG9tYXBfbWNic3BfZ2V0X3R4X2RlbGF5KHVuc2lnbmVkIGludCBpZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSB1MTYgb21hcF9tY2JzcF9nZXRfcnhfZGVsYXkodW5zaWduZWQgaW50IGlkKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBvbWFwX21jYnNwX2dldF9kbWFfb3BfbW9kZSh1bnNpZ25lZCBpbnQgaWQpIHsgcmV0dXJuIDA7IH0KLSNlbmRpZgogaW50IG9tYXBfbWNic3BfcmVxdWVzdCh1bnNpZ25lZCBpbnQgaWQpOwogdm9pZCBvbWFwX21jYnNwX2ZyZWUodW5zaWduZWQgaW50IGlkKTsKIHZvaWQgb21hcF9tY2JzcF9zdGFydCh1bnNpZ25lZCBpbnQgaWQsIGludCB0eCwgaW50IHJ4KTsKQEAgLTQ1MywyMSArMzg1LDExIEBACiBpbnQgb21hcF9tY2JzcF9kbWFfY2hfcGFyYW1zKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHN0cmVhbSk7CiBpbnQgb21hcF9tY2JzcF9kbWFfcmVnX3BhcmFtcyh1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBzdHJlYW0pOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKIC8qIFNpZGV0b25lIHNwZWNpZmljIEFQSSAqLwogaW50IG9tYXBfc3Rfc2V0X2NoZ2Fpbih1bnNpZ25lZCBpbnQgaWQsIGludCBjaGFubmVsLCBzMTYgY2hnYWluKTsKIGludCBvbWFwX3N0X2dldF9jaGdhaW4odW5zaWduZWQgaW50IGlkLCBpbnQgY2hhbm5lbCwgczE2ICpjaGdhaW4pOwogaW50IG9tYXBfc3RfZW5hYmxlKHVuc2lnbmVkIGludCBpZCk7CiBpbnQgb21hcF9zdF9kaXNhYmxlKHVuc2lnbmVkIGludCBpZCk7CiBpbnQgb21hcF9zdF9pc19lbmFibGVkKHVuc2lnbmVkIGludCBpZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgb21hcF9zdF9zZXRfY2hnYWluKHVuc2lnbmVkIGludCBpZCwgaW50IGNoYW5uZWwsCi0JCQkJICAgICBzMTYgY2hnYWluKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBvbWFwX3N0X2dldF9jaGdhaW4odW5zaWduZWQgaW50IGlkLCBpbnQgY2hhbm5lbCwKLQkJCQkgICAgIHMxNiAqY2hnYWluKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBvbWFwX3N0X2VuYWJsZSh1bnNpZ25lZCBpbnQgaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IG9tYXBfc3RfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IG9tYXBfc3RfaXNfZW5hYmxlZCh1bnNpZ25lZCBpbnQgaWQpIHsgIHJldHVybiAwOyB9Ci0jZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21lbW9yeS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3MjBhYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogTWVtb3J5IG1hcCBmb3IgT01BUC0xNTEwIGFuZCAxNjEwCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFJpZGdlUnVuLCBJbmMuCi0gKiBBdXRob3I6IEdyZWcgTG9ubm9uIDxnbG9ubm9uQHJpZGdlcnVuLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGRlcml2ZWQgZnJvbSBhcmNoL2FybS9tYWNoLWludGVyZ3JhdG9yL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICogQ29weXJpZ2h0IChDKSAxOTk5IEFSTSBMaW1pdGVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCi0gKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMSkKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgxMDAwMDAwMCkKLSNlbHNlCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4ODAwMDAwMDApCi0jZW5kaWYKLQotLyoKLSAqIEJ1cyBhZGRyZXNzIGlzIHBoeXNpY2FsIGFkZHJlc3MsIGV4Y2VwdCBmb3IgT01BUC0xNTEwIExvY2FsIEJ1cy4KLSAqIE9NQVAtMTUxMCBidXMgYWRkcmVzcyBpcyB0cmFuc2xhdGVkIGludG8gYSBMb2NhbCBCdXMgYWRkcmVzcyBpZiB0aGUKLSAqIE9NQVAgYnVzIHR5cGUgaXMgbGJ1cy4gV2UgZG8gdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gYmFzZWQgb24gdGhlCi0gKiBkZXZpY2Ugb3ZlcnJpZGluZyB0aGUgZGVmYXVsdHMgdXNlZCBpbiB0aGUgZG1hLW1hcHBpbmcgQVBJLgotICogTm90ZSB0aGF0IHRoZSBpc19sYnVzX2RldmljZSgpIHRlc3QgaXMgbm90IHZlcnkgZWZmaWNpZW50IG9uIDE1MTAKLSAqIGJlY2F1c2Ugb2YgdGhlIHN0cm5jbXAoKS4KLSAqLwotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCi0KLS8qCi0gKiBPTUFQLTE1MTAgTG9jYWwgQnVzIGFkZHJlc3Mgb2Zmc2V0Ci0gKi8KLSNkZWZpbmUgT01BUDE1MTBfTEJfT0ZGU0VUCVVMKDB4MzAwMDAwMDApCi0KLSNkZWZpbmUgdmlydF90b19sYnVzKHgpCQkoKHgpIC0gUEFHRV9PRkZTRVQgKyBPTUFQMTUxMF9MQl9PRkZTRVQpCi0jZGVmaW5lIGxidXNfdG9fdmlydCh4KQkJKCh4KSAtIE9NQVAxNTEwX0xCX09GRlNFVCArIFBBR0VfT0ZGU0VUKQotI2RlZmluZSBpc19sYnVzX2RldmljZShkZXYpCShjcHVfaXNfb21hcDE1eHgoKSAmJiBkZXYgJiYgKHN0cm5jbXAoZGV2X25hbWUoZGV2KSwgIm9oY2kiLCA0KSA9PSAwKSkKLQotI2RlZmluZSBfX2FyY2hfcGZuX3RvX2RtYShkZXYsIHBmbikJXAotCSh7IGRtYV9hZGRyX3QgX19kbWEgPSBfX3Bmbl90b19waHlzKHBmbik7IFwKLQkgICBpZiAoaXNfbGJ1c19kZXZpY2UoZGV2KSkgXAotCQlfX2RtYSA9IF9fZG1hIC0gUEhZU19PRkZTRVQgKyBPTUFQMTUxMF9MQl9PRkZTRVQ7IFwKLQkgICBfX2RtYTsgfSkKLQotI2RlZmluZSBfX2FyY2hfZG1hX3RvX3BmbihkZXYsIGFkZHIpCVwKLQkoeyBkbWFfYWRkcl90IF9fZG1hID0gYWRkcjsJCQkJXAotCSAgIGlmIChpc19sYnVzX2RldmljZShkZXYpKQkJCQlcCi0JCV9fZG1hICs9IFBIWVNfT0ZGU0VUIC0gT01BUDE1MTBfTEJfT0ZGU0VUOwlcCi0JICAgX19waHlzX3RvX3BmbihfX2RtYSk7CQkJCVwKLQl9KQotCi0jZGVmaW5lIF9fYXJjaF9kbWFfdG9fdmlydChkZXYsIGFkZHIpCSh7ICh2b2lkICopIChpc19sYnVzX2RldmljZShkZXYpID8gXAotCQkJCQkJbGJ1c190b192aXJ0KGFkZHIpIDogXAotCQkJCQkJX19waHlzX3RvX3ZpcnQoYWRkcikpOyB9KQotCi0jZGVmaW5lIF9fYXJjaF92aXJ0X3RvX2RtYShkZXYsIGFkZHIpCSh7IHVuc2lnbmVkIGxvbmcgX19hZGRyID0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpOyBcCi0JCQkJCSAgIChkbWFfYWRkcl90KSAoaXNfbGJ1c19kZXZpY2UoZGV2KSA/IFwKLQkJCQkJCXZpcnRfdG9fbGJ1cyhfX2FkZHIpIDogXAotCQkJCQkJX192aXJ0X3RvX3BoeXMoX19hZGRyKSk7IH0pCi0KLSNlbmRpZgkvKiBDT05GSUdfQVJDSF9PTUFQMTVYWCAqLwotCi0vKiBPdmVycmlkZSB0aGUgQVJNIGRlZmF1bHQgKi8KLSNpZmRlZiBDT05GSUdfRkJfT01BUF9DT05TSVNURU5UX0RNQV9TSVpFCi0KLSNpZiAoQ09ORklHX0ZCX09NQVBfQ09OU0lTVEVOVF9ETUFfU0laRSA9PSAwKQotI3VuZGVmIENPTkZJR19GQl9PTUFQX0NPTlNJU1RFTlRfRE1BX1NJWkUKLSNkZWZpbmUgQ09ORklHX0ZCX09NQVBfQ09OU0lTVEVOVF9ETUFfU0laRSAyCi0jZW5kaWYKLQotI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFIFwKLQkoKChDT05GSUdfRkJfT01BUF9DT05TSVNURU5UX0RNQV9TSVpFICsgMSkgJiB+MSkgKiAxMDI0ICogMTAyNCkKLQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21tYy5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tbWMuaAppbmRleCBjN2I4NzQxLi45NGNmNzBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21tYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbW1jLmgKQEAgLTMxLDcgKzMxLDI0IEBACiAKICNkZWZpbmUgT01BUF9NTUNfTUFYX1NMT1RTCTIKIAotI2RlZmluZSBPTUFQX0hTTU1DX1NVUFBPUlRTX0RVQUxfVk9MVAlCSVQoMSkKKy8qCisgKiBzdHJ1Y3Qgb21hcF9tbWNfZGV2X2F0dHIuZmxhZ3MgcG9zc2liaWxpdGllcworICoKKyAqIE9NQVBfSFNNTUNfU1VQUE9SVFNfRFVBTF9WT0xUOiBTb21lIEhTTU1DIGNvbnRyb2xsZXIgaW5zdGFuY2VzIGNhbgorICogICAgb3BlcmF0ZSB3aXRoIGVpdGhlciAxLjhWZGMgb3IgMy4wVmRjIGNhcmQgdm9sdGFnZXM7IHRoaXMgZmxhZworICogICAgc2hvdWxkIGJlIHNldCBpZiB0aGlzIGlzIHRoZSBjYXNlLiAgU2VlIGZvciBleGFtcGxlIFNlY3Rpb24gMjIuNS4zCisgKiAgICAiTU1DL1NEL1NESU8xIEJ1cyBWb2x0YWdlIFNlbGVjdGlvbiIgb2YgdGhlIE9NQVAzNHh4IE11bHRpbWVkaWEKKyAqICAgIERldmljZSBTaWxpY29uIFJldmlzaW9uIDMuMS54IFJldmlzaW9uIFpSIChKdWx5IDIwMTEpIChTV1BVMjIzUikuCisgKgorICogT01BUF9IU01NQ19CUk9LRU5fTVVMVElCTE9DS19SRUFEOiBNdWx0aXBsZS1ibG9jayByZWFkIHRyYW5zZmVycworICogICAgZG9uJ3Qgd29yayBjb3JyZWN0bHkgb24gc29tZSBNTUMgY29udHJvbGxlciBpbnN0YW5jZXMgb24gc29tZQorICogICAgT01BUDMgU29DczsgdGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgaWYgdGhpcyBpcyB0aGUgY2FzZS4gIFNlZQorICogICAgZm9yIGV4YW1wbGUgQWR2aXNvcnkgMi4xLjEuMTI4ICJNTUM6IE11bHRpcGxlIEJsb2NrIFJlYWQKKyAqICAgIE9wZXJhdGlvbiBJc3N1ZSIgaW4gX09NQVAzNTMwLzM1MjUvMzUxNS8zNTAzIFNpbGljb24gRXJyYXRhXworICogICAgUmV2aXNpb24gRiAoT2N0b2JlciAyMDEwKSAoU1BSWjI3OEYpLgorICovCisjZGVmaW5lIE9NQVBfSFNNTUNfU1VQUE9SVFNfRFVBTF9WT0xUCQlCSVQoMCkKKyNkZWZpbmUgT01BUF9IU01NQ19CUk9LRU5fTVVMVElCTE9DS19SRUFECUJJVCgxKQogCiBzdHJ1Y3Qgb21hcF9tbWNfZGV2X2F0dHIgewogCXU4IGZsYWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwLWFsc2EuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcC1hbHNhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzA1NWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwLWFsc2EuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9vbWFwLWFsc2EuaAotICoKLSAqIEFsc2EgRHJpdmVyIGZvciBBSUMyMyBhbmQgVFNDMjEwMSBjb2RlY3Mgb24gT01BUCBwbGF0Zm9ybSBib2FyZHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IE1pa2EgTGFpdGlvIDxsYW1pa3JAY2Muanl1LmZpPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBJbnN0aXR1dG8gTm9raWEgZGUgVGVjbm9sb2dpYSAtIElOZFQgLSBNYW5hdXMgQnJhemlsCi0gKiBXcml0dGVuIGJ5IERhbmllbCBQZXRyaW5pLCBEYXZpZCBDb2hlbiwgQW5kZXJzb24gQnJpZ2xpYQotICogICAgICAgICAgICB7ZGFuaWVsLnBldHJpbmksIGRhdmlkLmNvaGVuLCBhbmRlcnNvbi5icmlnbGlhfUBpbmR0Lm9yZy5icgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTgotICogTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogIEhpc3RvcnkKLSAqICAtLS0tLS0tCi0gKgotICogIDIwMDUvMDcvMjUgSU5kVC0xMExFIEtlcm5lbCBUZWFtIC0gCUFsc2EgZHJpdmVyIGZvciBvbWFwIG9zaywKLSAqICAJCQkJCW9yaWdpbmFsIHZlcnNpb24gYmFzZWQgaW4gc2ExMTAwIGRyaXZlcgotICogIAkJCQkJYW5kIG9tYXAgb3NzIGRyaXZlci4KLSAqLwotCi0jaWZuZGVmIF9fT01BUF9BTFNBX0gKLSNkZWZpbmUgX19PTUFQX0FMU0FfSAotCi0jaW5jbHVkZSA8cGxhdC9kbWEuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8cGxhdC9tY2JzcC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jZGVmaW5lIERNQV9CVUZfU0laRQkoMTAyNCAqIDgpCi0KLS8qCi0gKiBCdWZmZXIgbWFuYWdlbWVudCBmb3IgYWxzYSBhbmQgZG1hCi0gKi8KLXN0cnVjdCBhdWRpb19zdHJlYW0gewotCWNoYXIgKmlkOwkJLyogaWRlbnRpZmljYXRpb24gc3RyaW5nICovCi0JaW50IHN0cmVhbV9pZDsJCS8qIG51bWVyaWMgaWRlbnRpZmljYXRpb24gKi8KLQlpbnQgZG1hX2RldjsJCS8qIGRtYSBudW1iZXIgb2YgdGhhdCBkZXZpY2UgKi8KLQlpbnQgKmxjaDsJCS8qIENoYWluIG9mIGNoYW5uZWxzIHRoaXMgc3RyZWFtIGlzIGxpbmtlZCB0byAqLwotCWNoYXIgc3RhcnRlZDsJCS8qIHRvIHN0b3JlIGlmIHRoZSBjaGFpbiB3YXMgc3RhcnRlZCBvciBub3QgKi8KLQlpbnQgZG1hX3FfaGVhZDsJCS8qIERNQSBDaGFubmVsIFEgSGVhZCAqLwotCWludCBkbWFfcV90YWlsOwkJLyogRE1BIENoYW5uZWwgUSBUYWlsICovCi0JY2hhciBkbWFfcV9jb3VudDsJLyogRE1BIENoYW5uZWwgUSBDb3VudCAqLwotCWludCBhY3RpdmU6MTsJCS8qIHdlIGFyZSB1c2luZyB0aGlzIHN0cmVhbSBmb3IgdHJhbnNmZXIgbm93ICovCi0JaW50IHBlcmlvZDsJCS8qIGN1cnJlbnQgdHJhbnNmZXIgcGVyaW9kICovCi0JaW50IHBlcmlvZHM7CQkvKiBjdXJyZW50IGNvdW50IG9mIHBlcmlvZHMgcmVnaXN0ZXJkIGluIHRoZSBETUEgZW5naW5lICovCi0Jc3BpbmxvY2tfdCBkbWFfbG9jazsJLyogZm9yIGxvY2tpbmcgaW4gRE1BIG9wZXJhdGlvbnMgKi8KLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN0cmVhbTsJLyogdGhlIHBjbSBzdHJlYW0gKi8KLQl1bnNpZ25lZCBsaW5rZWQ6MTsJLyogZG1hIGNoYW5uZWxzIGxpbmtlZCAqLwotCWludCBvZmZzZXQ7CQkvKiBzdG9yZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBwZXJpb2QgaW4gdGhlIGFsc2EgYnVmZmVyICovCi0JaW50ICgqaHdfc3RhcnQpKHZvaWQpOyAgLyogaW50ZXJmYWNlIHRvIHN0YXJ0IEhXIGludGVyZmFjZSwgZS5nLiBNY0JTUCAqLwotCWludCAoKmh3X3N0b3ApKHZvaWQpOyAgIC8qIGludGVyZmFjZSB0byBzdG9wIEhXIGludGVyZmFjZSwgZS5nLiBNY0JTUCAqLwotfTsKLQotLyoKLSAqIEFsc2EgY2FyZCBzdHJ1Y3R1cmUgZm9yIGFpYzIzCi0gKi8KLXN0cnVjdCBzbmRfY2FyZF9vbWFwX2NvZGVjIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQlsb25nIHNhbXBsZXJhdGU7Ci0Jc3RydWN0IGF1ZGlvX3N0cmVhbSBzWzJdOwkvKiBwbGF5YmFjayAmIGNhcHR1cmUgKi8KLX07Ci0KLS8qIENvZGVjIHNwZWNpZmljIGluZm9ybWF0aW9uIGFuZCBmdW5jdGlvbiBwb2ludGVycy4KLSAqIENvZGVjIChvbWFwLWFsc2EtYWljMjMuYyBhbmQgb21hcC1hbHNhLXRzYzIxMDEuYykKLSAqIGFyZSByZXNwb25zaWJsZSBmb3IgZGVmaW5pbmcgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzLgotICovCi1zdHJ1Y3Qgb21hcF9hbHNhX2NvZGVjX2NvbmZpZyB7Ci0JY2hhciAJKm5hbWU7Ci0Jc3RydWN0CW9tYXBfbWNic3BfcmVnX2NmZyAqbWNic3BfcmVnc19hbHNhOwotCXN0cnVjdAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCAqaHdfY29uc3RyYWludHNfcmF0ZXM7Ci0Jc3RydWN0CXNuZF9wY21faGFyZHdhcmUgKnNuZF9vbWFwX2Fsc2FfcGxheWJhY2s7Ci0Jc3RydWN0CXNuZF9wY21faGFyZHdhcmUgKnNuZF9vbWFwX2Fsc2FfY2FwdHVyZTsKLQl2b2lkCSgqY29kZWNfY29uZmlndXJlX2Rldikodm9pZCk7Ci0Jdm9pZAkoKmNvZGVjX3NldF9zYW1wbGVyYXRlKShsb25nKTsKLQl2b2lkCSgqY29kZWNfY2xvY2tfc2V0dXApKHZvaWQpOwotCWludAkoKmNvZGVjX2Nsb2NrX29uKSh2b2lkKTsKLQlpbnQgCSgqY29kZWNfY2xvY2tfb2ZmKSh2b2lkKTsKLQlpbnQJKCpnZXRfZGVmYXVsdF9zYW1wbGVyYXRlKSh2b2lkKTsKLX07Ci0KLS8qKioqKioqKioqKiBNaXhlciBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgc25kX29tYXBfbWl4ZXIoc3RydWN0IHNuZF9jYXJkX29tYXBfY29kZWMgKik7Ci12b2lkIHNuZF9vbWFwX2luaXRfbWl4ZXIodm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXZvaWQgc25kX29tYXBfc3VzcGVuZF9taXhlcih2b2lkKTsKLXZvaWQgc25kX29tYXBfcmVzdW1lX21peGVyKHZvaWQpOwotI2VuZGlmCi0KLWludCBzbmRfb21hcF9hbHNhX3Bvc3RfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IG9tYXBfYWxzYV9jb2RlY19jb25maWcgKmNvbmZpZyk7Ci1pbnQgc25kX29tYXBfYWxzYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0jaWZkZWYgQ09ORklHX1BNCi1pbnQgc25kX29tYXBfYWxzYV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci1pbnQgc25kX29tYXBfYWxzYV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0jZWxzZQotI2RlZmluZSBzbmRfb21hcF9hbHNhX3N1c3BlbmQJTlVMTAotI2RlZmluZSBzbmRfb21hcF9hbHNhX3Jlc3VtZQlOVUxMCi0jZW5kaWYKLQotdm9pZCBjYWxsYmFja19vbWFwX2Fsc2Ffc291bmRfZG1hKHZvaWQgKik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwLXBtLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXAtcG0uaAppbmRleCAwODQwZGY4Li42N2ZhYTdiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXAtcG0uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXAtcG0uaApAQCAtMzQyLDkgKzM0Miw5IEBACiAgKiBkcml2ZXIgbXVzdCByZXN0b3JlIGRldmljZSBjb250ZXh0LiAgIElmIHRoZSBudW1iZXIgb2YgY29udGV4dCBsb3NzZXMKICAqIGV4Y2VlZHMgdGhlIG1heGltdW0gcG9zaXRpdmUgaW50ZWdlciwgdGhlIGZ1bmN0aW9uIHdpbGwgd3JhcCB0byAwIGFuZAogICogY29udGludWUgY291bnRpbmcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29udGV4dCBsb3NzZXMgZm9yIHRoaXMgZGV2aWNlLAotICogb3IgemVybyB1cG9uIGVycm9yLgorICogb3IgbmVnYXRpdmUgdmFsdWUgdXBvbiBlcnJvci4KICAqLwotdTMyIG9tYXBfcG1fZ2V0X2Rldl9jb250ZXh0X2xvc3NfY291bnQoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBvbWFwX3BtX2dldF9kZXZfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIHZvaWQgb21hcF9wbV9lbmFibGVfb2ZmX21vZGUodm9pZCk7CiB2b2lkIG9tYXBfcG1fZGlzYWJsZV9vZmZfbW9kZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9kZXZpY2UuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9kZXZpY2UuaAppbmRleCBlZTQwNWIzNi4uNTE0MjNkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2RldmljZS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9kZXZpY2UuaApAQCAtNjgsNyArNjgsNyBAQAogICoKICAqLwogc3RydWN0IG9tYXBfZGV2aWNlIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQlwZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OwogCXN0cnVjdCBvbWFwX2h3bW9kCQkqKmh3bW9kczsKIAlzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeQkqcG1fbGF0czsKIAl1MzIJCQkJZGV2X3dha2V1cF9sYXQ7CkBAIC04OCwzMSArODgsMjYgQEAKIAogLyogQ29yZSBjb2RlIGludGVyZmFjZSAqLwogCi1pbnQgb21hcF9kZXZpY2VfY291bnRfcmVzb3VyY2VzKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpOwotaW50IG9tYXBfZGV2aWNlX2ZpbGxfcmVzb3VyY2VzKHN0cnVjdCBvbWFwX2RldmljZSAqb2QsIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKLQotc3RydWN0IG9tYXBfZGV2aWNlICpvbWFwX2RldmljZV9idWlsZChjb25zdCBjaGFyICpwZGV2X25hbWUsIGludCBwZGV2X2lkLAorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb21hcF9kZXZpY2VfYnVpbGQoY29uc3QgY2hhciAqcGRldl9uYW1lLCBpbnQgcGRldl9pZCwKIAkJCQkgICAgICBzdHJ1Y3Qgb21hcF9od21vZCAqb2gsIHZvaWQgKnBkYXRhLAogCQkJCSAgICAgIGludCBwZGF0YV9sZW4sCiAJCQkJICAgICAgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgKnBtX2xhdHMsCiAJCQkJICAgICAgaW50IHBtX2xhdHNfY250LCBpbnQgaXNfZWFybHlfZGV2aWNlKTsKIAotc3RydWN0IG9tYXBfZGV2aWNlICpvbWFwX2RldmljZV9idWlsZF9zcyhjb25zdCBjaGFyICpwZGV2X25hbWUsIGludCBwZGV2X2lkLAorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb21hcF9kZXZpY2VfYnVpbGRfc3MoY29uc3QgY2hhciAqcGRldl9uYW1lLCBpbnQgcGRldl9pZCwKIAkJCQkJIHN0cnVjdCBvbWFwX2h3bW9kICoqb2gsIGludCBvaF9jbnQsCiAJCQkJCSB2b2lkICpwZGF0YSwgaW50IHBkYXRhX2xlbiwKIAkJCQkJIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5ICpwbV9sYXRzLAogCQkJCQkgaW50IHBtX2xhdHNfY250LCBpbnQgaXNfZWFybHlfZGV2aWNlKTsKIAotaW50IG9tYXBfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpOwotaW50IG9tYXBfZWFybHlfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpOwotCiB2b2lkIF9faW9tZW0gKm9tYXBfZGV2aWNlX2dldF9ydF92YShzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kKTsKK3N0cnVjdCBkZXZpY2UgKm9tYXBfZGV2aWNlX2dldF9ieV9od21vZF9uYW1lKGNvbnN0IGNoYXIgKm9oX25hbWUpOwogCiAvKiBPTUFQIFBNIGludGVyZmFjZSAqLwogaW50IG9tYXBfZGV2aWNlX2FsaWduX3BtX2xhdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkJICAgICB1MzIgbmV3X3dha2V1cF9sYXRfbGltaXQpOwogc3RydWN0IHBvd2VyZG9tYWluICpvbWFwX2RldmljZV9nZXRfcHdyZG0oc3RydWN0IG9tYXBfZGV2aWNlICpvZCk7Ci11MzIgb21hcF9kZXZpY2VfZ2V0X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKK2ludCBvbWFwX2RldmljZV9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogCiAvKiBPdGhlciAqLwogCkBAIC0xMjIsMTEgKzExNyw2IEBACiBpbnQgb21hcF9kZXZpY2VfZGlzYWJsZV9jbG9ja3Moc3RydWN0IG9tYXBfZGV2aWNlICpvZCk7CiBpbnQgb21hcF9kZXZpY2VfZW5hYmxlX2Nsb2NrcyhzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kKTsKIAotc3RhdGljIGlubGluZSB2b2lkIG9tYXBfZGV2aWNlX2Rpc2FibGVfaWRsZV9vbl9zdXNwZW5kKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpCi17Ci0Jb2QtPmZsYWdzIHw9IE9NQVBfREVWSUNFX05PX0lETEVfT05fU1VTUEVORDsKLX0KLQogLyoKICAqIEVudHJpZXMgc2hvdWxkIGJlIGtlcHQgaW4gbGF0ZW5jeSBvcmRlciBhc2NlbmRpbmcKICAqCkBAIC0xNTcsNiArMTQ3LDE3IEBACiAjZGVmaW5lIE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QgQklUKDEpCiAKIC8qIEdldCBvbWFwX2RldmljZSBwb2ludGVyIGZyb20gcGxhdGZvcm1fZGV2aWNlIHBvaW50ZXIgKi8KLSNkZWZpbmUgdG9fb21hcF9kZXZpY2UoeCkgY29udGFpbmVyX29mKCh4KSwgc3RydWN0IG9tYXBfZGV2aWNlLCBwZGV2KQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgb21hcF9kZXZpY2UgKnRvX29tYXBfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHBkZXYgPyBwZGV2LT5hcmNoZGF0YS5vZCA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgb21hcF9kZXZpY2VfZGlzYWJsZV9pZGxlX29uX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kID0gdG9fb21hcF9kZXZpY2UocGRldik7CisKKwlvZC0+ZmxhZ3MgfD0gT01BUF9ERVZJQ0VfTk9fSURMRV9PTl9TVVNQRU5EOworfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9od21vZC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2h3bW9kLmgKaW5kZXggMGUzMjljYS4uOGIzNzJlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2h3bW9kLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2h3bW9kLmgKQEAgLTQ5Niw3ICs0OTYsNiBAQAogICogQF9zdGF0ZTogaW50ZXJuYWwtdXNlIGh3bW9kIHN0YXRlCiAgKiBAX3Bvc3RzZXR1cF9zdGF0ZTogaW50ZXJuYWwtdXNlIHN0YXRlIHRvIGxlYXZlIHRoZSBod21vZCBpbiBhZnRlciBfc2V0dXAoKQogICogQGZsYWdzOiBod21vZCBmbGFncyAoZG9jdW1lbnRlZCBiZWxvdykKLSAqIEBvbWFwX2NoaXA6IE9NQVAgY2hpcHMgdGhpcyBod21vZCBpcyBwcmVzZW50IG9uCiAgKiBAX2xvY2s6IHNwaW5sb2NrIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgb24gdGhpcyBod21vZAogICogQG5vZGU6IGxpc3Qgbm9kZSBmb3IgaHdtb2QgbGlzdCAoaW50ZXJuYWwgdXNlKQogICoKQEAgLTUyNiw3ICs1MjUsNiBAQAogCWNoYXIJCQkJKmNsa2RtX25hbWU7CiAJc3RydWN0IGNsb2NrZG9tYWluCQkqY2xrZG07CiAJY2hhcgkJCQkqdmRkX25hbWU7Ci0Jc3RydWN0IHZvbHRhZ2Vkb21haW4JCSp2b2x0ZG07CiAJc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmCSoqbWFzdGVyczsgLyogY29ubmVjdCB0byAqX0lBICovCiAJc3RydWN0IG9tYXBfaHdtb2Rfb2NwX2lmCSoqc2xhdmVzOyAgLyogY29ubmVjdCB0byAqX1RBICovCiAJdm9pZAkJCQkqZGV2X2F0dHI7CkBAIC01NDUsNyArNTQzLDYgQEAKIAl1OAkJCQlfaW50X2ZsYWdzOwogCXU4CQkJCV9zdGF0ZTsKIAl1OAkJCQlfcG9zdHNldHVwX3N0YXRlOwotCWNvbnN0IHN0cnVjdCBvbWFwX2NoaXBfaWQJb21hcF9jaGlwOwogfTsKIAogaW50IG9tYXBfaHdtb2RfcmVnaXN0ZXIoc3RydWN0IG9tYXBfaHdtb2QgKipvaHMpOwpAQCAtNjAzLDcgKzYwMCw3IEBACiAJCQkJIHZvaWQgKnVzZXIpOwogCiBpbnQgb21hcF9od21vZF9zZXRfcG9zdHNldHVwX3N0YXRlKHN0cnVjdCBvbWFwX2h3bW9kICpvaCwgdTggc3RhdGUpOwotdTMyIG9tYXBfaHdtb2RfZ2V0X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3Qgb21hcF9od21vZCAqb2gpOworaW50IG9tYXBfaHdtb2RfZ2V0X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3Qgb21hcF9od21vZCAqb2gpOwogCiBpbnQgb21hcF9od21vZF9ub19zZXR1cF9yZXNldChzdHJ1Y3Qgb21hcF9od21vZCAqb2gpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3NlcmlhbC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9zZXJpYWwuaAppbmRleCBkZTNiMTBjLi4xYWI5ZmQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3NlcmlhbC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvc2VyaWFsLmgKQEAgLTE2LDggKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKIC8qCi0gKiBNZW1vcnkgZW50cnkgdXNlZCBmb3IgdGhlIERFQlVHX0xMIFVBUlQgY29uZmlndXJhdGlvbi4gU2VlIGFsc28KLSAqIHVuY29tcHJlc3MuaCBhbmQgZGVidWctbWFjcm8uUy4KKyAqIE1lbW9yeSBlbnRyeSB1c2VkIGZvciB0aGUgREVCVUdfTEwgVUFSVCBjb25maWd1cmF0aW9uLCByZWxhdGl2ZSB0bworICogc3RhcnQgb2YgUkFNLiBTZWUgYWxzbyB1bmNvbXByZXNzLmggYW5kIGRlYnVnLW1hY3JvLlMuCiAgKgogICogTm90ZSB0aGF0IHVzaW5nIGEgbWVtb3J5IGxvY2F0aW9uIGZvciBzdG9yaW5nIHRoZSBVQVJUIGNvbmZpZ3VyYXRpb24KICAqIGhhcyBhdCBsZWFzdCB0d28gbGltaXRhdGlvbnM6CkBAIC0yNyw3ICsyNyw3IEBACiAgKiAyLiBXZSBhc3N1bWUgcHJpbnRhc2NpaSBpcyBjYWxsZWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUgcGFnaW5nX2luaXQsCiAgKiAgICBhbmQgYWRkcnVhcnQgaGFzIGEgY2hhbmNlIHRvIHJlYWQgT01BUF9VQVJUX0lORk8KICAqLwotI2RlZmluZSBPTUFQX1VBUlRfSU5GTwkJKFBMQVRfUEhZU19PRkZTRVQgKyAweDNmZmMpCisjZGVmaW5lIE9NQVBfVUFSVF9JTkZPX09GUwkweDNmZmMKIAogLyogT01BUDEgc2VyaWFsIHBvcnRzICovCiAjZGVmaW5lIE9NQVAxX1VBUlQxX0JBU0UJMHhmZmZiMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3VuY29tcHJlc3MuaAppbmRleCBhMDY3NDg0Li4yZjQ3MmU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3VuY29tcHJlc3MuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3VuY29tcHJlc3MuaApAQCAtMzYsNyArMzYsMTMgQEAKICAqLwogc3RhdGljIHZvaWQgc2V0X29tYXBfdWFydF9pbmZvKHVuc2lnbmVkIGNoYXIgcG9ydCkKIHsKLQkqKHZvbGF0aWxlIHUzMiAqKU9NQVBfVUFSVF9JTkZPID0gcG9ydDsKKwkvKgorCSAqIEdldCBhZGRyZXNzIG9mIHNvbWUuYnNzIHZhcmlhYmxlIGFuZCByb3VuZCBpdCBkb3duCisJICogYSBsYSBDT05GSUdfQVVUT19aUkVMQUREUi4KKwkgKi8KKwl1MzIgcmFtX3N0YXJ0ID0gKHUzMikmdWFydF9zaGlmdCAmIDB4ZjgwMDAwMDA7CisJdTMyICp1YXJ0X2luZm8gPSAodTMyICopKHJhbV9zdGFydCArIE9NQVBfVUFSVF9JTkZPX09GUyk7CisJKnVhcnRfaW5mbyA9IHBvcnQ7CiB9CiAKIHN0YXRpYyB2b2lkIHB1dGMoaW50IGMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3ZvbHRhZ2UuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdm9sdGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNmE0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3ZvbHRhZ2UuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogT01BUCBWb2x0YWdlIE1hbmFnZW1lbnQgUm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVJDSF9BUk1fT01BUF9WT0xUQUdFX0gKKyNkZWZpbmUgX19BUkNIX0FSTV9PTUFQX1ZPTFRBR0VfSAorCitzdHJ1Y3Qgdm9sdGFnZWRvbWFpbjsKKworc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgdm9sdGRtX3NjYWxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpOwordW5zaWduZWQgbG9uZyB2b2x0ZG1fZ2V0X3ZvbHRhZ2Uoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW8uYwppbmRleCBmMWVjZmE5Li4zMzM4NzFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW8uYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW8uYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8cGxhdC9vbWFwN3h4Lmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwMTUxMC5oPgpAQCAtMjMsMTEgKzI0LDE2IEBACiAjZGVmaW5lIEJFVFdFRU4ocCxzdCxzeikJKChwKSA+PSAoc3QpICYmIChwKSA8ICgoc3QpICsgKHN6KSkpCiAjZGVmaW5lIFhMQVRFKHAscHN0LHZzdCkJKCh2b2lkIF9faW9tZW0gKikoKHApIC0gKHBzdCkgKyAodnN0KSkpCiAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKIC8qCiAgKiBJbnRlcmNlcHQgaW9yZW1hcCgpIHJlcXVlc3RzIGZvciBhZGRyZXNzZXMgaW4gb3VyIGZpeGVkIG1hcHBpbmcgcmVnaW9ucy4KICAqLwogdm9pZCBfX2lvbWVtICpvbWFwX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHR5cGUpCiB7CisKKwlXQVJOKCFpbml0aWFsaXplZCwgIkRvIG5vdCB1c2UgaW9yZW1hcCBiZWZvcmUgaW5pdF9lYXJseVxuIik7CisKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQogCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewogCQlpZiAoQkVUV0VFTihwLCBPTUFQMV9JT19QSFlTLCBPTUFQMV9JT19TSVpFKSkKQEAgLTEzOSwzICsxNDUsMTUgQEAKIAkJX19pb3VubWFwKGFkZHIpOwogfQogRVhQT1JUX1NZTUJPTChvbWFwX2lvdW5tYXApOworCit2b2lkIF9faW5pdCBvbWFwX2luaXRfY29uc2lzdGVudF9kbWFfc2l6ZSh2b2lkKQoreworI2lmZGVmIENPTkZJR19GQl9PTUFQX0NPTlNJU1RFTlRfRE1BX1NJWkUKKwlpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoQ09ORklHX0ZCX09NQVBfQ09OU0lTVEVOVF9ETUFfU0laRSA8PCAyMCk7CisjZW5kaWYKK30KKwordm9pZCBfX2luaXQgb21hcF9pb3JlbWFwX2luaXQodm9pZCkKK3sKKwlpbml0aWFsaXplZCsrOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvbW11LWRlYnVnLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW9tbXUtZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3Y2YyZi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW9tbXUtZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKgotICogb21hcCBpb21tdTogZGVidWdmcyBpbnRlcmZhY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgotICoKLSAqIFdyaXR0ZW4gYnkgSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2lvbW11Lmg+Ci0jaW5jbHVkZSA8cGxhdC9pb3ZtbS5oPgotCi0jaW5jbHVkZSAiaW9wZ3RhYmxlLmgiCi0KLSNkZWZpbmUgTUFYQ09MVU1OIDEwMCAvKiBmb3Igc2hvcnQgbWVzc2FnZXMgKi8KLQotc3RhdGljIERFRklORV9NVVRFWChpb21tdV9kZWJ1Z19sb2NrKTsKLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmlvbW11X2RlYnVnX3Jvb3Q7Ci0KLXN0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfdmVyKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXUzMiB2ZXIgPSBpb21tdV9hcmNoX3ZlcnNpb24oKTsKLQljaGFyIGJ1ZltNQVhDT0xVTU5dLCAqcCA9IGJ1ZjsKLQotCXAgKz0gc3ByaW50ZihwLCAiSC9XIHZlcnNpb246ICVkLiVkXG4iLCAodmVyID4+IDQpICYgMHhmICwgdmVyICYgMHhmKTsKLQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwIC0gYnVmKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZGVidWdfcmVhZF9yZWdzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaW9tbXUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyICpwLCAqYnVmOwotCXNzaXplX3QgYnl0ZXM7Ci0KLQlidWYgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcCA9IGJ1ZjsKLQotCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCi0JYnl0ZXMgPSBpb21tdV9kdW1wX2N0eChvYmosIHAsIGNvdW50KTsKLQlieXRlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIGJ5dGVzKTsKLQotCW11dGV4X3VubG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0Ja2ZyZWUoYnVmKTsKLQotCXJldHVybiBieXRlczsKLX0KLQotc3RhdGljIHNzaXplX3QgZGVidWdfcmVhZF90bGIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAotCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGlvbW11ICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqcCwgKmJ1ZjsKLQlzc2l6ZV90IGJ5dGVzLCByZXN0OwotCi0JYnVmID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCXAgPSBidWY7Ci0KLQltdXRleF9sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQotCXAgKz0gc3ByaW50ZihwLCAiJThzICU4c1xuIiwgImNhbToiLCAicmFtOiIpOwotCXAgKz0gc3ByaW50ZihwLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCXJlc3QgPSBjb3VudCAtIChwIC0gYnVmKTsKLQlwICs9IGR1bXBfdGxiX2VudHJpZXMob2JqLCBwLCByZXN0KTsKLQotCWJ5dGVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcCAtIGJ1Zik7Ci0KLQltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCWtmcmVlKGJ1Zik7Ci0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRlYnVnX3dyaXRlX3BhZ2V0YWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGlvdGxiX2VudHJ5IGU7Ci0Jc3RydWN0IGNyX3JlZ3MgY3I7Ci0JaW50IGVycjsKLQlzdHJ1Y3QgaW9tbXUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1ZltNQVhDT0xVTU5dLCAqcCA9IGJ1ZjsKLQotCWNvdW50ID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSk7Ci0KLQltdXRleF9sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQlpZiAoY29weV9mcm9tX3VzZXIocCwgdXNlcmJ1ZiwgY291bnQpKSB7Ci0JCW11dGV4X3VubG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXNzY2FuZihwLCAiJXggJXgiLCAmY3IuY2FtLCAmY3IucmFtKTsKLQlpZiAoIWNyLmNhbSB8fCAhY3IucmFtKSB7Ci0JCW11dGV4X3VubG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlvdGxiX2NyX3RvX2UoJmNyLCAmZSk7Ci0JZXJyID0gaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KG9iaiwgJmUpOwotCWlmIChlcnIpCi0JCWRldl9lcnIob2JqLT5kZXYsICIlczogZmFpbCB0byBzdG9yZSBjclxuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLSNkZWZpbmUgZHVtcF9pb3B0YWJsZV9lbnRyeV9vbmUobHYsIGRhLCB2YWwpCQkJXAotCSh7CQkJCQkJCVwKLQkJaW50IF9fZXJyID0gMDsJCQkJCVwKLQkJc3NpemVfdCBieXRlczsJCQkJCVwKLQkJY29uc3QgaW50IG1heGNvbCA9IDIyOwkJCQlcCi0JCWNvbnN0IGNoYXIgKnN0ciA9ICIlZDogJTA4eCAlMDh4XG4iOwkJXAotCQlieXRlcyA9IHNucHJpbnRmKHAsIG1heGNvbCwgc3RyLCBsdiwgZGEsIHZhbCk7CVwKLQkJcCArPSBieXRlczsJCQkJCVwKLQkJbGVuIC09IGJ5dGVzOwkJCQkJXAotCQlpZiAobGVuIDwgbWF4Y29sKQkJCQlcCi0JCQlfX2VyciA9IC1FTk9NRU07CQkJXAotCQlfX2VycjsJCQkJCQlcCi0JfSkKLQotc3RhdGljIHNzaXplX3QgZHVtcF9pb3B0YWJsZShzdHJ1Y3QgaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGxlbikKLXsKLQlpbnQgaTsKLQl1MzIgKmlvcGdkOwotCWNoYXIgKnAgPSBidWY7Ci0KLQlzcGluX2xvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKLQotCWlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgMCk7Ci0JZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX0lPUEdEOyBpKyssIGlvcGdkKyspIHsKLQkJaW50IGosIGVycjsKLQkJdTMyICppb3B0ZTsKLQkJdTMyIGRhOwotCi0JCWlmICghKmlvcGdkKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCEoKmlvcGdkICYgSU9QR0RfVEFCTEUpKSB7Ci0JCQlkYSA9IGkgPDwgSU9QR0RfU0hJRlQ7Ci0KLQkJCWVyciA9IGR1bXBfaW9wdGFibGVfZW50cnlfb25lKDEsIGRhLCAqaW9wZ2QpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIG91dDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIDApOwotCi0JCWZvciAoaiA9IDA7IGogPCBQVFJTX1BFUl9JT1BURTsgaisrLCBpb3B0ZSsrKSB7Ci0JCQlpZiAoISppb3B0ZSkKLQkJCQljb250aW51ZTsKLQotCQkJZGEgPSAoaSA8PCBJT1BHRF9TSElGVCkgKyAoaiA8PCBJT1BURV9TSElGVCk7Ci0JCQllcnIgPSBkdW1wX2lvcHRhYmxlX2VudHJ5X29uZSgyLCBkYSwgKmlvcGdkKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKLQotCXJldHVybiBwIC0gYnVmOwotfQotCi1zdGF0aWMgc3NpemVfdCBkZWJ1Z19yZWFkX3BhZ2V0YWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCi0JCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKnAsICpidWY7Ci0Jc2l6ZV90IGJ5dGVzOwotCi0JYnVmID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCXAgPSBidWY7Ci0KLQlwICs9IHNwcmludGYocCwgIkw6ICU4cyAlOHNcbiIsICJkYToiLCAicGE6Iik7Ci0JcCArPSBzcHJpbnRmKHAsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0KLQltdXRleF9sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQotCWJ5dGVzID0gUEFHRV9TSVpFIC0gKHAgLSBidWYpOwotCXAgKz0gZHVtcF9pb3B0YWJsZShvYmosIHAsIGJ5dGVzKTsKLQotCWJ5dGVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcCAtIGJ1Zik7Ci0KLQltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOwotCi0JcmV0dXJuIGJ5dGVzOwotfQotCi1zdGF0aWMgc3NpemVfdCBkZWJ1Z19yZWFkX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAotCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKnAsICpidWY7Ci0Jc3RydWN0IGlvdm1fc3RydWN0ICp0bXA7Ci0JaW50IHVuaW5pdGlhbGl6ZWRfdmFyKGkpOwotCXNzaXplX3QgYnl0ZXM7Ci0KLQlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcCA9IGJ1ZjsKLQotCXAgKz0gc3ByaW50ZihwLCAiJS0zcyAlLThzICUtOHMgJTZzICU4c1xuIiwKLQkJICAgICAiTm8iLCAic3RhcnQiLCAiZW5kIiwgInNpemUiLCAiZmxhZ3MiKTsKLQlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCi0JbXV0ZXhfbG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJm9iai0+bW1hcCwgbGlzdCkgewotCQlzaXplX3QgbGVuOwotCQljb25zdCBjaGFyICpzdHIgPSAiJTNkICUwOHgtJTA4eCAlNnggJTh4XG4iOwotCQljb25zdCBpbnQgbWF4Y29sID0gMzk7Ci0KLQkJbGVuID0gdG1wLT5kYV9lbmQgLSB0bXAtPmRhX3N0YXJ0OwotCQlwICs9IHNucHJpbnRmKHAsIG1heGNvbCwgc3RyLAotCQkJICAgICAgaSwgdG1wLT5kYV9zdGFydCwgdG1wLT5kYV9lbmQsIGxlbiwgdG1wLT5mbGFncyk7Ci0KLQkJaWYgKFBBR0VfU0laRSAtIChwIC0gYnVmKSA8IG1heGNvbCkKLQkJCWJyZWFrOwotCQlpKys7Ci0JfQotCi0JYnl0ZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwIC0gYnVmKTsKLQotCW11dGV4X3VubG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1Zik7Ci0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfbWVtKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKnAsICpidWY7Ci0Jc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOwotCXNzaXplX3QgYnl0ZXM7Ci0KLQljb3VudCA9IG1pbl90KHNzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUpOwotCi0JYnVmID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCXAgPSBidWY7Ci0KLQltdXRleF9sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQotCWFyZWEgPSBmaW5kX2lvdm1fYXJlYShvYmosICh1MzIpcHBvcyk7Ci0JaWYgKElTX0VSUihhcmVhKSkgewotCQlieXRlcyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0JbWVtY3B5KHAsIGFyZWEtPnZhLCBjb3VudCk7Ci0JcCArPSBjb3VudDsKLQotCWJ5dGVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcCAtIGJ1Zik7Ci1lcnJfb3V0OgotCW11dGV4X3VubG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1Zik7Ci0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRlYnVnX3dyaXRlX21lbShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGlvbW11ICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOwotCWNoYXIgKnAsICpidWY7Ci0KLQljb3VudCA9IG1pbl90KHNpemVfdCwgY291bnQsIFBBR0VfU0laRSk7Ci0KLQlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcCA9IGJ1ZjsKLQotCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHAsIHVzZXJidWYsIGNvdW50KSkgewotCQljb3VudCA9ICAtRUZBVUxUOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0JYXJlYSA9IGZpbmRfaW92bV9hcmVhKG9iaiwgKHUzMilwcG9zKTsKLQlpZiAoSVNfRVJSKGFyZWEpKSB7Ci0JCWNvdW50ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfb3V0OwotCX0KLQltZW1jcHkoYXJlYS0+dmEsIHAsIGNvdW50KTsKLWVycl9vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIGludCBkZWJ1Z19vcGVuX2dlbmVyaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBERUJVR19GT1BTKG5hbWUpCQkJCQkJXAotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnXyMjbmFtZSMjX2ZvcHMgPSB7CVwKLQkJLm9wZW4gPSBkZWJ1Z19vcGVuX2dlbmVyaWMsCQkJCVwKLQkJLnJlYWQgPSBkZWJ1Z19yZWFkXyMjbmFtZSwJCQkJXAotCQkud3JpdGUgPSBkZWJ1Z193cml0ZV8jI25hbWUsCQkJCVwKLQkJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKLQl9OwotCi0jZGVmaW5lIERFQlVHX0ZPUFNfUk8obmFtZSkJCQkJCQlcCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfIyNuYW1lIyNfZm9wcyA9IHsJXAotCQkub3BlbiA9IGRlYnVnX29wZW5fZ2VuZXJpYywJCQkJXAotCQkucmVhZCA9IGRlYnVnX3JlYWRfIyNuYW1lLAkJCQlcCi0JCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQlcCi0JfTsKLQotREVCVUdfRk9QU19STyh2ZXIpOwotREVCVUdfRk9QU19STyhyZWdzKTsKLURFQlVHX0ZPUFNfUk8odGxiKTsKLURFQlVHX0ZPUFMocGFnZXRhYmxlKTsKLURFQlVHX0ZPUFNfUk8obW1hcCk7Ci1ERUJVR19GT1BTKG1lbSk7Ci0KLSNkZWZpbmUgX19ERUJVR19BRERfRklMRShhdHRyLCBtb2RlKQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJc3RydWN0IGRlbnRyeSAqZGVudDsJCQkJCVwKLQkJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoI2F0dHIsIG1vZGUsIHBhcmVudCwJCVwKLQkJCQkJICAgb2JqLCAmZGVidWdfIyNhdHRyIyNfZm9wcyk7CVwKLQkJaWYgKCFkZW50KQkJCQkJCVwKLQkJCXJldHVybiAtRU5PTUVNOwkJCQkJXAotCX0KLQotI2RlZmluZSBERUJVR19BRERfRklMRShuYW1lKSBfX0RFQlVHX0FERF9GSUxFKG5hbWUsIDYwMCkKLSNkZWZpbmUgREVCVUdfQUREX0ZJTEVfUk8obmFtZSkgX19ERUJVR19BRERfRklMRShuYW1lLCA0MDApCi0KLXN0YXRpYyBpbnQgaW9tbXVfZGVidWdfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgaW9tbXUgKm9iaiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBkZW50cnkgKmQsICpwYXJlbnQ7Ci0KLQlpZiAoIW9iaiB8fCAhb2JqLT5kZXYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZCA9IGRlYnVnZnNfY3JlYXRlX2RpcihvYmotPm5hbWUsIGlvbW11X2RlYnVnX3Jvb3QpOwotCWlmICghZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcGFyZW50ID0gZDsKLQotCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV91OCgibnJfdGxiX2VudHJpZXMiLCA0MDAsIHBhcmVudCwKLQkJCSAgICAgICh1OCAqKSZvYmotPm5yX3RsYl9lbnRyaWVzKTsKLQlpZiAoIWQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JREVCVUdfQUREX0ZJTEVfUk8odmVyKTsKLQlERUJVR19BRERfRklMRV9STyhyZWdzKTsKLQlERUJVR19BRERfRklMRV9STyh0bGIpOwotCURFQlVHX0FERF9GSUxFKHBhZ2V0YWJsZSk7Ci0JREVCVUdfQUREX0ZJTEVfUk8obW1hcCk7Ci0JREVCVUdfQUREX0ZJTEUobWVtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpb21tdV9kZWJ1Z19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZDsKLQlpbnQgZXJyOwotCi0JZCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiaW9tbXUiLCBOVUxMKTsKLQlpZiAoIWQpCi0JCXJldHVybiAtRU5PTUVNOwotCWlvbW11X2RlYnVnX3Jvb3QgPSBkOwotCi0JZXJyID0gZm9yZWFjaF9pb21tdV9kZXZpY2UoZCwgaW9tbXVfZGVidWdfcmVnaXN0ZXIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dDsKLQlyZXR1cm4gMDsKLQotZXJyX291dDoKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaW9tbXVfZGVidWdfcm9vdCk7Ci0JcmV0dXJuIGVycjsKLX0KLW1vZHVsZV9pbml0KGlvbW11X2RlYnVnX2luaXQpCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpb21tdV9kZWJ1Z2ZzX2V4aXQodm9pZCkKLXsKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaW9tbXVfZGVidWdfcm9vdCk7Ci19Ci1tb2R1bGVfZXhpdChpb21tdV9kZWJ1Z2ZzX2V4aXQpCi0KLU1PRFVMRV9ERVNDUklQVElPTigib21hcCBpb21tdTogZGVidWdmcyBpbnRlcmZhY2UiKTsKLU1PRFVMRV9BVVRIT1IoIkhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pb21tdS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2lvbW11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmMzMWUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvbW11LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAyICswLDAgQEAKLS8qCi0gKiBvbWFwIGlvbW11OiB0bGIgYW5kIHBhZ2V0YWJsZSBwcmltaXRpdmVzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgTm9raWEgQ29ycG9yYXRpb24KLSAqCi0gKiBXcml0dGVuIGJ5IEhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4sCi0gKgkJUGF1bCBNdW5kdCBhbmQgVG9zaGloaXJvIEtvYmF5YXNoaQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2lvbW11Lmg+Ci0KLSNpbmNsdWRlICJpb3BndGFibGUuaCIKLQotI2RlZmluZSBmb3JfZWFjaF9pb3RsYl9jcihvYmosIG4sIF9faSwgY3IpCQkJCVwKLQlmb3IgKF9faSA9IDA7CQkJCQkJCVwKLQkgICAgIChfX2kgPCAobikpICYmIChjciA9IF9faW90bGJfcmVhZF9jcigob2JqKSwgX19pKSwgdHJ1ZSk7CVwKLQkgICAgIF9faSsrKQotCi0vKiBhY2NvbW1vZGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9tYXAxIGFuZCBvbWFwMi8zICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlvbW11X2Z1bmN0aW9ucyAqYXJjaF9pb21tdTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9pb21tdV9kcml2ZXI7Ci1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlvcHRlX2NhY2hlcDsKLQotLyoqCi0gKiBpbnN0YWxsX2lvbW11X2FyY2ggLSBJbnN0YWxsIGFyY2h0ZWN1cmUgc3BlY2lmaWMgaW9tbXUgZnVuY3Rpb25zCi0gKiBAb3BzOglhIHBvaW50ZXIgdG8gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGlvbW11IGZ1bmN0aW9ucwotICoKLSAqIFRoZXJlIGFyZSBzZXZlcmFsIGtpbmQgb2YgaW9tbXUgYWxnb3JpdGhtKHRsYiwgcGFnZXRhYmxlKSBhbW9uZwotICogb21hcCBzZXJpZXMuIFRoaXMgaW50ZXJmYWNlIGluc3RhbGxzIHN1Y2ggYW4gaW9tbXUgYWxnb3JpZ2htLgotICoqLwotaW50IGluc3RhbGxfaW9tbXVfYXJjaChjb25zdCBzdHJ1Y3QgaW9tbXVfZnVuY3Rpb25zICpvcHMpCi17Ci0JaWYgKGFyY2hfaW9tbXUpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlhcmNoX2lvbW11ID0gb3BzOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW5zdGFsbF9pb21tdV9hcmNoKTsKLQotLyoqCi0gKiB1bmluc3RhbGxfaW9tbXVfYXJjaCAtIFVuaW5zdGFsbCBhcmNodGVjdXJlIHNwZWNpZmljIGlvbW11IGZ1bmN0aW9ucwotICogQG9wczoJYSBwb2ludGVyIHRvIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpb21tdSBmdW5jdGlvbnMKLSAqCi0gKiBUaGlzIGludGVyZmFjZSB1bmluc3RhbGxzIHRoZSBpb21tdSBhbGdvcmlnaG0gaW5zdGFsbGVkIHByZXZpb3VzbHkuCi0gKiovCi12b2lkIHVuaW5zdGFsbF9pb21tdV9hcmNoKGNvbnN0IHN0cnVjdCBpb21tdV9mdW5jdGlvbnMgKm9wcykKLXsKLQlpZiAoYXJjaF9pb21tdSAhPSBvcHMpCi0JCXByX2VycigiJXM6IG5vdCB5b3VyIGFyY2hcbiIsIF9fZnVuY19fKTsKLQotCWFyY2hfaW9tbXUgPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodW5pbnN0YWxsX2lvbW11X2FyY2gpOwotCi0vKioKLSAqIGlvbW11X3NhdmVfY3R4IC0gU2F2ZSByZWdpc3RlcnMgZm9yIHBtIG9mZi1tb2RlIHN1cHBvcnQKLSAqIEBvYmo6CXRhcmdldCBpb21tdQotICoqLwotdm9pZCBpb21tdV9zYXZlX2N0eChzdHJ1Y3QgaW9tbXUgKm9iaikKLXsKLQlhcmNoX2lvbW11LT5zYXZlX2N0eChvYmopOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfc2F2ZV9jdHgpOwotCi0vKioKLSAqIGlvbW11X3Jlc3RvcmVfY3R4IC0gUmVzdG9yZSByZWdpc3RlcnMgZm9yIHBtIG9mZi1tb2RlIHN1cHBvcnQKLSAqIEBvYmo6CXRhcmdldCBpb21tdQotICoqLwotdm9pZCBpb21tdV9yZXN0b3JlX2N0eChzdHJ1Y3QgaW9tbXUgKm9iaikKLXsKLQlhcmNoX2lvbW11LT5yZXN0b3JlX2N0eChvYmopOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfcmVzdG9yZV9jdHgpOwotCi0vKioKLSAqIGlvbW11X2FyY2hfdmVyc2lvbiAtIFJldHVybiBydW5uaW5nIGlvbW11IGFyY2ggdmVyc2lvbgotICoqLwotdTMyIGlvbW11X2FyY2hfdmVyc2lvbih2b2lkKQotewotCXJldHVybiBhcmNoX2lvbW11LT52ZXJzaW9uOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfYXJjaF92ZXJzaW9uKTsKLQotc3RhdGljIGludCBpb21tdV9lbmFibGUoc3RydWN0IGlvbW11ICpvYmopCi17Ci0JaW50IGVycjsKLQotCWlmICghb2JqKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghYXJjaF9pb21tdSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQljbGtfZW5hYmxlKG9iai0+Y2xrKTsKLQotCWVyciA9IGFyY2hfaW9tbXUtPmVuYWJsZShvYmopOwotCi0JY2xrX2Rpc2FibGUob2JqLT5jbGspOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbW11X2Rpc2FibGUoc3RydWN0IGlvbW11ICpvYmopCi17Ci0JaWYgKCFvYmopCi0JCXJldHVybjsKLQotCWNsa19lbmFibGUob2JqLT5jbGspOwotCi0JYXJjaF9pb21tdS0+ZGlzYWJsZShvYmopOwotCi0JY2xrX2Rpc2FibGUob2JqLT5jbGspOwotfQotCi0vKgotICoJVExCIG9wZXJhdGlvbnMKLSAqLwotdm9pZCBpb3RsYl9jcl90b19lKHN0cnVjdCBjcl9yZWdzICpjciwgc3RydWN0IGlvdGxiX2VudHJ5ICplKQotewotCUJVR19PTighY3IgfHwgIWUpOwotCi0JYXJjaF9pb21tdS0+Y3JfdG9fZShjciwgZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb3RsYl9jcl90b19lKTsKLQotc3RhdGljIGlubGluZSBpbnQgaW90bGJfY3JfdmFsaWQoc3RydWN0IGNyX3JlZ3MgKmNyKQotewotCWlmICghY3IpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIGFyY2hfaW9tbXUtPmNyX3ZhbGlkKGNyKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgY3JfcmVncyAqaW90bGJfYWxsb2NfY3Ioc3RydWN0IGlvbW11ICpvYmosCi0JCQkJCSAgICAgc3RydWN0IGlvdGxiX2VudHJ5ICplKQotewotCWlmICghZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gYXJjaF9pb21tdS0+YWxsb2NfY3Iob2JqLCBlKTsKLX0KLQotdTMyIGlvdGxiX2NyX3RvX3ZpcnQoc3RydWN0IGNyX3JlZ3MgKmNyKQotewotCXJldHVybiBhcmNoX2lvbW11LT5jcl90b192aXJ0KGNyKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvdGxiX2NyX3RvX3ZpcnQpOwotCi1zdGF0aWMgdTMyIGdldF9pb3B0ZV9hdHRyKHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKLXsKLQlyZXR1cm4gYXJjaF9pb21tdS0+Z2V0X3B0ZV9hdHRyKGUpOwotfQotCi1zdGF0aWMgdTMyIGlvbW11X3JlcG9ydF9mYXVsdChzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyICpkYSkKLXsKLQlyZXR1cm4gYXJjaF9pb21tdS0+ZmF1bHRfaXNyKG9iaiwgZGEpOwotfQotCi1zdGF0aWMgdm9pZCBpb3RsYl9sb2NrX2dldChzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGlvdGxiX2xvY2sgKmwpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IGlvbW11X3JlYWRfcmVnKG9iaiwgTU1VX0xPQ0spOwotCi0JbC0+YmFzZSA9IE1NVV9MT0NLX0JBU0UodmFsKTsKLQlsLT52aWN0ID0gTU1VX0xPQ0tfVklDVCh2YWwpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGlvdGxiX2xvY2tfc2V0KHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfbG9jayAqbCkKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gKGwtPmJhc2UgPDwgTU1VX0xPQ0tfQkFTRV9TSElGVCk7Ci0JdmFsIHw9IChsLT52aWN0IDw8IE1NVV9MT0NLX1ZJQ1RfU0hJRlQpOwotCi0JaW9tbXVfd3JpdGVfcmVnKG9iaiwgdmFsLCBNTVVfTE9DSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvdGxiX3JlYWRfY3Ioc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcikKLXsKLQlhcmNoX2lvbW11LT50bGJfcmVhZF9jcihvYmosIGNyKTsKLX0KLQotc3RhdGljIHZvaWQgaW90bGJfbG9hZF9jcihzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyKQotewotCWFyY2hfaW9tbXUtPnRsYl9sb2FkX2NyKG9iaiwgY3IpOwotCi0JaW9tbXVfd3JpdGVfcmVnKG9iaiwgMSwgTU1VX0ZMVVNIX0VOVFJZKTsKLQlpb21tdV93cml0ZV9yZWcob2JqLCAxLCBNTVVfTERfVExCKTsKLX0KLQotLyoqCi0gKiBpb3RsYl9kdW1wX2NyIC0gRHVtcCBhbiBpb21tdSB0bGIgZW50cnkgaW50byBidWYKLSAqIEBvYmo6CXRhcmdldCBpb21tdQotICogQGNyOgkJY29udGVudHMgb2YgY2FtIGFuZCByYW0gcmVnaXN0ZXIKLSAqIEBidWY6CW91dHB1dCBidWZmZXIKLSAqKi8KLXN0YXRpYyBpbmxpbmUgc3NpemVfdCBpb3RsYl9kdW1wX2NyKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IsCi0JCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlCVUdfT04oIWNyIHx8ICFidWYpOwotCi0JcmV0dXJuIGFyY2hfaW9tbXUtPmR1bXBfY3Iob2JqLCBjciwgYnVmKTsKLX0KLQotLyogb25seSB1c2VkIGluIGlvdGxiIGl0ZXJhdGlvbiBmb3ItbG9vcCAqLwotc3RhdGljIHN0cnVjdCBjcl9yZWdzIF9faW90bGJfcmVhZF9jcihzdHJ1Y3QgaW9tbXUgKm9iaiwgaW50IG4pCi17Ci0Jc3RydWN0IGNyX3JlZ3MgY3I7Ci0Jc3RydWN0IGlvdGxiX2xvY2sgbDsKLQotCWlvdGxiX2xvY2tfZ2V0KG9iaiwgJmwpOwotCWwudmljdCA9IG47Ci0JaW90bGJfbG9ja19zZXQob2JqLCAmbCk7Ci0JaW90bGJfcmVhZF9jcihvYmosICZjcik7Ci0KLQlyZXR1cm4gY3I7Ci19Ci0KLS8qKgotICogbG9hZF9pb3RsYl9lbnRyeSAtIFNldCBhbiBpb21tdSB0bGIgZW50cnkKLSAqIEBvYmo6CXRhcmdldCBpb21tdQotICogQGU6CQlhbiBpb21tdSB0bGIgZW50cnkgaW5mbwotICoqLwotaW50IGxvYWRfaW90bGJfZW50cnkoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKLXsKLQlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgaW90bGJfbG9jayBsOwotCXN0cnVjdCBjcl9yZWdzICpjcjsKLQotCWlmICghb2JqIHx8ICFvYmotPm5yX3RsYl9lbnRyaWVzIHx8ICFlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNsa19lbmFibGUob2JqLT5jbGspOwotCi0JaW90bGJfbG9ja19nZXQob2JqLCAmbCk7Ci0JaWYgKGwuYmFzZSA9PSBvYmotPm5yX3RsYl9lbnRyaWVzKSB7Ci0JCWRldl93YXJuKG9iai0+ZGV2LCAiJXM6IHByZXNlcnZlIGVudHJpZXMgZnVsbFxuIiwgX19mdW5jX18pOwotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoIWUtPnByc3ZkKSB7Ci0JCWludCBpOwotCQlzdHJ1Y3QgY3JfcmVncyB0bXA7Ci0KLQkJZm9yX2VhY2hfaW90bGJfY3Iob2JqLCBvYmotPm5yX3RsYl9lbnRyaWVzLCBpLCB0bXApCi0JCQlpZiAoIWlvdGxiX2NyX3ZhbGlkKCZ0bXApKQotCQkJCWJyZWFrOwotCi0JCWlmIChpID09IG9iai0+bnJfdGxiX2VudHJpZXMpIHsKLQkJCWRldl9kYmcob2JqLT5kZXYsICIlczogZnVsbDogbm8gZW50cnlcbiIsIF9fZnVuY19fKTsKLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaW90bGJfbG9ja19nZXQob2JqLCAmbCk7Ci0JfSBlbHNlIHsKLQkJbC52aWN0ID0gbC5iYXNlOwotCQlpb3RsYl9sb2NrX3NldChvYmosICZsKTsKLQl9Ci0KLQljciA9IGlvdGxiX2FsbG9jX2NyKG9iaiwgZSk7Ci0JaWYgKElTX0VSUihjcikpIHsKLQkJY2xrX2Rpc2FibGUob2JqLT5jbGspOwotCQlyZXR1cm4gUFRSX0VSUihjcik7Ci0JfQotCi0JaW90bGJfbG9hZF9jcihvYmosIGNyKTsKLQlrZnJlZShjcik7Ci0KLQlpZiAoZS0+cHJzdmQpCi0JCWwuYmFzZSsrOwotCS8qIGluY3JlbWVudCB2aWN0aW0gZm9yIG5leHQgdGxiIGxvYWQgKi8KLQlpZiAoKytsLnZpY3QgPT0gb2JqLT5ucl90bGJfZW50cmllcykKLQkJbC52aWN0ID0gbC5iYXNlOwotCWlvdGxiX2xvY2tfc2V0KG9iaiwgJmwpOwotb3V0OgotCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobG9hZF9pb3RsYl9lbnRyeSk7Ci0KLS8qKgotICogZmx1c2hfaW90bGJfcGFnZSAtIENsZWFyIGFuIGlvbW11IHRsYiBlbnRyeQotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCi0gKgotICogQ2xlYXIgYW4gaW9tbXUgdGxiIGVudHJ5IHdoaWNoIGluY2x1ZGVzICdkYScgYWRkcmVzcy4KLSAqKi8KLXZvaWQgZmx1c2hfaW90bGJfcGFnZShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhKQotewotCWludCBpOwotCXN0cnVjdCBjcl9yZWdzIGNyOwotCi0JY2xrX2VuYWJsZShvYmotPmNsayk7Ci0KLQlmb3JfZWFjaF9pb3RsYl9jcihvYmosIG9iai0+bnJfdGxiX2VudHJpZXMsIGksIGNyKSB7Ci0JCXUzMiBzdGFydDsKLQkJc2l6ZV90IGJ5dGVzOwotCi0JCWlmICghaW90bGJfY3JfdmFsaWQoJmNyKSkKLQkJCWNvbnRpbnVlOwotCi0JCXN0YXJ0ID0gaW90bGJfY3JfdG9fdmlydCgmY3IpOwotCQlieXRlcyA9IGlvcGdzel90b19ieXRlcyhjci5jYW0gJiAzKTsKLQotCQlpZiAoKHN0YXJ0IDw9IGRhKSAmJiAoZGEgPCBzdGFydCArIGJ5dGVzKSkgewotCQkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiAlMDh4PD0lMDh4KCV4KVxuIiwKLQkJCQlfX2Z1bmNfXywgc3RhcnQsIGRhLCBieXRlcyk7Ci0JCQlpb3RsYl9sb2FkX2NyKG9iaiwgJmNyKTsKLQkJCWlvbW11X3dyaXRlX3JlZyhvYmosIDEsIE1NVV9GTFVTSF9FTlRSWSk7Ci0JCX0KLQl9Ci0JY2xrX2Rpc2FibGUob2JqLT5jbGspOwotCi0JaWYgKGkgPT0gb2JqLT5ucl90bGJfZW50cmllcykKLQkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBubyBwYWdlIGZvciAlMDh4XG4iLCBfX2Z1bmNfXywgZGEpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZmx1c2hfaW90bGJfcGFnZSk7Ci0KLS8qKgotICogZmx1c2hfaW90bGJfcmFuZ2UgLSBDbGVhciBhbiBpb21tdSB0bGIgZW50cmllcwotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiBAc3RhcnQ6CWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3Moc3RhcnQpCi0gKiBAZW5kOglpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzKGVuZCkKLSAqCi0gKiBDbGVhciBhbiBpb21tdSB0bGIgZW50cnkgd2hpY2ggaW5jbHVkZXMgJ2RhJyBhZGRyZXNzLgotICoqLwotdm9pZCBmbHVzaF9pb3RsYl9yYW5nZShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIHN0YXJ0LCB1MzIgZW5kKQotewotCXUzMiBkYSA9IHN0YXJ0OwotCi0Jd2hpbGUgKGRhIDwgZW5kKSB7Ci0JCWZsdXNoX2lvdGxiX3BhZ2Uob2JqLCBkYSk7Ci0JCS8qIEZJWE1FOiBPcHRpbWl6ZSBmb3IgbXVsdGlwbGUgcGFnZSBzaXplICovCi0JCWRhICs9IElPUFRFX1NJWkU7Ci0JfQotfQotRVhQT1JUX1NZTUJPTF9HUEwoZmx1c2hfaW90bGJfcmFuZ2UpOwotCi0vKioKLSAqIGZsdXNoX2lvdGxiX2FsbCAtIENsZWFyIGFsbCBpb21tdSB0bGIgZW50cmllcwotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiovCi12b2lkIGZsdXNoX2lvdGxiX2FsbChzdHJ1Y3QgaW9tbXUgKm9iaikKLXsKLQlzdHJ1Y3QgaW90bGJfbG9jayBsOwotCi0JY2xrX2VuYWJsZShvYmotPmNsayk7Ci0KLQlsLmJhc2UgPSAwOwotCWwudmljdCA9IDA7Ci0JaW90bGJfbG9ja19zZXQob2JqLCAmbCk7Ci0KLQlpb21tdV93cml0ZV9yZWcob2JqLCAxLCBNTVVfR0ZMVVNIKTsKLQotCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZsdXNoX2lvdGxiX2FsbCk7Ci0KLS8qKgotICogaW9tbXVfc2V0X3R3bCAtIGVuYWJsZS9kaXNhYmxlIHRhYmxlIHdhbGtpbmcgbG9naWMKLSAqIEBvYmo6CXRhcmdldCBpb21tdQotICogQG9uOgkJZW5hYmxlL2Rpc2FibGUKLSAqCi0gKiBGdW5jdGlvbiB1c2VkIHRvIGVuYWJsZS9kaXNhYmxlIFRXTC4gSWYgb25lIHdhbnRzIHRvIHdvcmsKLSAqIGV4Y2x1c2l2ZWx5IHdpdGggbG9ja2VkIFRMQiBlbnRyaWVzIGFuZCByZWNlaXZlIG5vdGlmaWNhdGlvbnMKLSAqIGZvciBUTEIgbWlzcyB0aGVuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBkaXNhYmxlIFRXTC4KLSAqLwotdm9pZCBpb21tdV9zZXRfdHdsKHN0cnVjdCBpb21tdSAqb2JqLCBib29sIG9uKQotewotCWNsa19lbmFibGUob2JqLT5jbGspOwotCWFyY2hfaW9tbXUtPnNldF90d2wob2JqLCBvbik7Ci0JY2xrX2Rpc2FibGUob2JqLT5jbGspOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfc2V0X3R3bCk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0lPTU1VX0RFQlVHX01PRFVMRSkKLQotc3NpemVfdCBpb21tdV9kdW1wX2N0eChzdHJ1Y3QgaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGJ5dGVzKQotewotCWlmICghb2JqIHx8ICFidWYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY2xrX2VuYWJsZShvYmotPmNsayk7Ci0KLQlieXRlcyA9IGFyY2hfaW9tbXUtPmR1bXBfY3R4KG9iaiwgYnVmLCBieXRlcyk7Ci0KLQljbGtfZGlzYWJsZShvYmotPmNsayk7Ci0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV9kdW1wX2N0eCk7Ci0KLXN0YXRpYyBpbnQgX19kdW1wX3RsYl9lbnRyaWVzKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3JzLCBpbnQgbnVtKQotewotCWludCBpOwotCXN0cnVjdCBpb3RsYl9sb2NrIHNhdmVkOwotCXN0cnVjdCBjcl9yZWdzIHRtcDsKLQlzdHJ1Y3QgY3JfcmVncyAqcCA9IGNyczsKLQotCWNsa19lbmFibGUob2JqLT5jbGspOwotCWlvdGxiX2xvY2tfZ2V0KG9iaiwgJnNhdmVkKTsKLQotCWZvcl9lYWNoX2lvdGxiX2NyKG9iaiwgbnVtLCBpLCB0bXApIHsKLQkJaWYgKCFpb3RsYl9jcl92YWxpZCgmdG1wKSkKLQkJCWNvbnRpbnVlOwotCQkqcCsrID0gdG1wOwotCX0KLQotCWlvdGxiX2xvY2tfc2V0KG9iaiwgJnNhdmVkKTsKLQljbGtfZGlzYWJsZShvYmotPmNsayk7Ci0KLQlyZXR1cm4gIHAgLSBjcnM7Ci19Ci0KLS8qKgotICogZHVtcF90bGJfZW50cmllcyAtIGR1bXAgY3IgYXJyYXlzIHRvIGdpdmVuIGJ1ZmZlcgotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiBAYnVmOglvdXRwdXQgYnVmZmVyCi0gKiovCi1zaXplX3QgZHVtcF90bGJfZW50cmllcyhzdHJ1Y3QgaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGJ5dGVzKQotewotCWludCBpLCBudW07Ci0Jc3RydWN0IGNyX3JlZ3MgKmNyOwotCWNoYXIgKnAgPSBidWY7Ci0KLQludW0gPSBieXRlcyAvIHNpemVvZigqY3IpOwotCW51bSA9IG1pbihvYmotPm5yX3RsYl9lbnRyaWVzLCBudW0pOwotCi0JY3IgPSBrY2FsbG9jKG51bSwgc2l6ZW9mKCpjciksIEdGUF9LRVJORUwpOwotCWlmICghY3IpCi0JCXJldHVybiAwOwotCi0JbnVtID0gX19kdW1wX3RsYl9lbnRyaWVzKG9iaiwgY3IsIG51bSk7Ci0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQotCQlwICs9IGlvdGxiX2R1bXBfY3Iob2JqLCBjciArIGksIHApOwotCWtmcmVlKGNyKTsKLQotCXJldHVybiBwIC0gYnVmOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZHVtcF90bGJfZW50cmllcyk7Ci0KLWludCBmb3JlYWNoX2lvbW11X2RldmljZSh2b2lkICpkYXRhLCBpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKQotewotCXJldHVybiBkcml2ZXJfZm9yX2VhY2hfZGV2aWNlKCZvbWFwX2lvbW11X2RyaXZlci5kcml2ZXIsCi0JCQkJICAgICAgTlVMTCwgZGF0YSwgZm4pOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZm9yZWFjaF9pb21tdV9kZXZpY2UpOwotCi0jZW5kaWYgLyogQ09ORklHX09NQVBfSU9NTVVfREVCVUdfTU9EVUxFICovCi0KLS8qCi0gKglIL1cgcGFnZXRhYmxlIG9wZXJhdGlvbnMKLSAqLwotc3RhdGljIHZvaWQgZmx1c2hfaW9wZ2RfcmFuZ2UodTMyICpmaXJzdCwgdTMyICpsYXN0KQotewotCS8qIEZJWE1FOiBMMiBjYWNoZSBzaG91bGQgYmUgdGFrZW4gY2FyZSBvZiBpZiBpdCBleGlzdHMgKi8KLQlkbyB7Ci0JCWFzbSgibWNyCXAxNSwgMCwgJTAsIGM3LCBjMTAsIDEgQCBmbHVzaF9wZ2QiCi0JCSAgICA6IDogInIiIChmaXJzdCkpOwotCQlmaXJzdCArPSBMMV9DQUNIRV9CWVRFUyAvIHNpemVvZigqZmlyc3QpOwotCX0gd2hpbGUgKGZpcnN0IDw9IGxhc3QpOwotfQotCi1zdGF0aWMgdm9pZCBmbHVzaF9pb3B0ZV9yYW5nZSh1MzIgKmZpcnN0LCB1MzIgKmxhc3QpCi17Ci0JLyogRklYTUU6IEwyIGNhY2hlIHNob3VsZCBiZSB0YWtlbiBjYXJlIG9mIGlmIGl0IGV4aXN0cyAqLwotCWRvIHsKLQkJYXNtKCJtY3IJcDE1LCAwLCAlMCwgYzcsIGMxMCwgMSBAIGZsdXNoX3B0ZSIKLQkJICAgIDogOiAiciIgKGZpcnN0KSk7Ci0JCWZpcnN0ICs9IEwxX0NBQ0hFX0JZVEVTIC8gc2l6ZW9mKCpmaXJzdCk7Ci0JfSB3aGlsZSAoZmlyc3QgPD0gbGFzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvcHRlX2ZyZWUodTMyICppb3B0ZSkKLXsKLQkvKiBOb3RlOiBmcmVlZCBpb3B0ZSdzIG11c3QgYmUgY2xlYW4gcmVhZHkgZm9yIHJlLXVzZSAqLwotCWttZW1fY2FjaGVfZnJlZShpb3B0ZV9jYWNoZXAsIGlvcHRlKTsKLX0KLQotc3RhdGljIHUzMiAqaW9wdGVfYWxsb2Moc3RydWN0IGlvbW11ICpvYmosIHUzMiAqaW9wZ2QsIHUzMiBkYSkKLXsKLQl1MzIgKmlvcHRlOwotCi0JLyogYSB0YWJsZSBoYXMgYWxyZWFkeSBleGlzdGVkICovCi0JaWYgKCppb3BnZCkKLQkJZ290byBwdGVfcmVhZHk7Ci0KLQkvKgotCSAqIGRvIHRoZSBhbGxvY2F0aW9uIG91dHNpZGUgdGhlIHBhZ2UgdGFibGUgbG9jawotCSAqLwotCXNwaW5fdW5sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7Ci0JaW9wdGUgPSBrbWVtX2NhY2hlX3phbGxvYyhpb3B0ZV9jYWNoZXAsIEdGUF9LRVJORUwpOwotCXNwaW5fbG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOwotCi0JaWYgKCEqaW9wZ2QpIHsKLQkJaWYgKCFpb3B0ZSkKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JCSppb3BnZCA9IHZpcnRfdG9fcGh5cyhpb3B0ZSkgfCBJT1BHRF9UQUJMRTsKLQkJZmx1c2hfaW9wZ2RfcmFuZ2UoaW9wZ2QsIGlvcGdkKTsKLQotCQlkZXZfdmRiZyhvYmotPmRldiwgIiVzOiBhIG5ldyBwdGU6JXBcbiIsIF9fZnVuY19fLCBpb3B0ZSk7Ci0JfSBlbHNlIHsKLQkJLyogV2UgcmFjZWQsIGZyZWUgdGhlIHJlZHVuaW92YW50IHRhYmxlICovCi0JCWlvcHRlX2ZyZWUoaW9wdGUpOwotCX0KLQotcHRlX3JlYWR5OgotCWlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSk7Ci0KLQlkZXZfdmRiZyhvYmotPmRldiwKLQkJICIlczogZGE6JTA4eCBwZ2Q6JXAgKnBnZDolMDh4IHB0ZTolcCAqcHRlOiUwOHhcbiIsCi0JCSBfX2Z1bmNfXywgZGEsIGlvcGdkLCAqaW9wZ2QsIGlvcHRlLCAqaW9wdGUpOwotCi0JcmV0dXJuIGlvcHRlOwotfQotCi1zdGF0aWMgaW50IGlvcGdkX2FsbG9jX3NlY3Rpb24oc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCB1MzIgcHJvdCkKLXsKLQl1MzIgKmlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOwotCi0JaWYgKChkYSB8IHBhKSAmIH5JT1NFQ1RJT05fTUFTSykgewotCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6ICUwOHg6JTA4eCBzaG91bGQgYWxpZ25lZCBvbiAlMDhseFxuIiwKLQkJCV9fZnVuY19fLCBkYSwgcGEsIElPU0VDVElPTl9TSVpFKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JKmlvcGdkID0gKHBhICYgSU9TRUNUSU9OX01BU0spIHwgcHJvdCB8IElPUEdEX1NFQ1RJT047Ci0JZmx1c2hfaW9wZ2RfcmFuZ2UoaW9wZ2QsIGlvcGdkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpb3BnZF9hbGxvY19zdXBlcihzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgcGEsIHUzMiBwcm90KQotewotCXUzMiAqaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCBkYSk7Ci0JaW50IGk7Ci0KLQlpZiAoKGRhIHwgcGEpICYgfklPU1VQRVJfTUFTSykgewotCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6ICUwOHg6JTA4eCBzaG91bGQgYWxpZ25lZCBvbiAlMDhseFxuIiwKLQkJCV9fZnVuY19fLCBkYSwgcGEsIElPU1VQRVJfU0laRSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQkqKGlvcGdkICsgaSkgPSAocGEgJiBJT1NVUEVSX01BU0spIHwgcHJvdCB8IElPUEdEX1NVUEVSOwotCWZsdXNoX2lvcGdkX3JhbmdlKGlvcGdkLCBpb3BnZCArIDE1KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpb3B0ZV9hbGxvY19wYWdlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHUzMiBwYSwgdTMyIHByb3QpCi17Ci0JdTMyICppb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKLQl1MzIgKmlvcHRlID0gaW9wdGVfYWxsb2Mob2JqLCBpb3BnZCwgZGEpOwotCi0JaWYgKElTX0VSUihpb3B0ZSkpCi0JCXJldHVybiBQVFJfRVJSKGlvcHRlKTsKLQotCSppb3B0ZSA9IChwYSAmIElPUEFHRV9NQVNLKSB8IHByb3QgfCBJT1BURV9TTUFMTDsKLQlmbHVzaF9pb3B0ZV9yYW5nZShpb3B0ZSwgaW9wdGUpOwotCi0JZGV2X3ZkYmcob2JqLT5kZXYsICIlczogZGE6JTA4eCBwYTolMDh4IHB0ZTolcCAqcHRlOiUwOHhcbiIsCi0JCSBfX2Z1bmNfXywgZGEsIHBhLCBpb3B0ZSwgKmlvcHRlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlvcHRlX2FsbG9jX2xhcmdlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHUzMiBwYSwgdTMyIHByb3QpCi17Ci0JdTMyICppb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKLQl1MzIgKmlvcHRlID0gaW9wdGVfYWxsb2Mob2JqLCBpb3BnZCwgZGEpOwotCWludCBpOwotCi0JaWYgKChkYSB8IHBhKSAmIH5JT0xBUkdFX01BU0spIHsKLQkJZGV2X2VycihvYmotPmRldiwgIiVzOiAlMDh4OiUwOHggc2hvdWxkIGFsaWduZWQgb24gJTA4bHhcbiIsCi0JCQlfX2Z1bmNfXywgZGEsIHBhLCBJT0xBUkdFX1NJWkUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoSVNfRVJSKGlvcHRlKSkKLQkJcmV0dXJuIFBUUl9FUlIoaW9wdGUpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCSooaW9wdGUgKyBpKSA9IChwYSAmIElPTEFSR0VfTUFTSykgfCBwcm90IHwgSU9QVEVfTEFSR0U7Ci0JZmx1c2hfaW9wdGVfcmFuZ2UoaW9wdGUsIGlvcHRlICsgMTUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlvcGd0YWJsZV9zdG9yZV9lbnRyeV9jb3JlKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCi17Ci0JaW50ICgqZm4pKHN0cnVjdCBpb21tdSAqLCB1MzIsIHUzMiwgdTMyKTsKLQl1MzIgcHJvdDsKLQlpbnQgZXJyOwotCi0JaWYgKCFvYmogfHwgIWUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChlLT5wZ3N6KSB7Ci0JY2FzZSBNTVVfQ0FNX1BHU1pfMTZNOgotCQlmbiA9IGlvcGdkX2FsbG9jX3N1cGVyOwotCQlicmVhazsKLQljYXNlIE1NVV9DQU1fUEdTWl8xTToKLQkJZm4gPSBpb3BnZF9hbGxvY19zZWN0aW9uOwotCQlicmVhazsKLQljYXNlIE1NVV9DQU1fUEdTWl82NEs6Ci0JCWZuID0gaW9wdGVfYWxsb2NfbGFyZ2U7Ci0JCWJyZWFrOwotCWNhc2UgTU1VX0NBTV9QR1NaXzRLOgotCQlmbiA9IGlvcHRlX2FsbG9jX3BhZ2U7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZuID0gTlVMTDsKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCXByb3QgPSBnZXRfaW9wdGVfYXR0cihlKTsKLQotCXNwaW5fbG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOwotCWVyciA9IGZuKG9iaiwgZS0+ZGEsIGUtPnBhLCBwcm90KTsKLQlzcGluX3VubG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOwotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKiBpb3BndGFibGVfc3RvcmVfZW50cnkgLSBNYWtlIGFuIGlvbW11IHB0ZSBlbnRyeQotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiBAZToJCWFuIGlvbW11IHRsYiBlbnRyeSBpbmZvCi0gKiovCi1pbnQgaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCi17Ci0JaW50IGVycjsKLQotCWZsdXNoX2lvdGxiX3BhZ2Uob2JqLCBlLT5kYSk7Ci0JZXJyID0gaW9wZ3RhYmxlX3N0b3JlX2VudHJ5X2NvcmUob2JqLCBlKTsKLSNpZmRlZiBQUkVGRVRDSF9JT1RMQgotCWlmICghZXJyKQotCQlsb2FkX2lvdGxiX2VudHJ5KG9iaiwgZSk7Ci0jZW5kaWYKLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KTsKLQotLyoqCi0gKiBpb3BndGFibGVfbG9va3VwX2VudHJ5IC0gTG9va3VwIGFuIGlvbW11IHB0ZSBlbnRyeQotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCi0gKiBAcHBnZDoJaW9tbXUgcGdkIGVudHJ5IHBvaW50ZXIgdG8gYmUgcmV0dXJuZWQKLSAqIEBwcHRlOglpb21tdSBwdGUgZW50cnkgcG9pbnRlciB0byBiZSByZXR1cm5lZAotICoqLwotdm9pZCBpb3BndGFibGVfbG9va3VwX2VudHJ5KHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHUzMiAqKnBwZ2QsIHUzMiAqKnBwdGUpCi17Ci0JdTMyICppb3BnZCwgKmlvcHRlID0gTlVMTDsKLQotCWlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOwotCWlmICghKmlvcGdkKQotCQlnb3RvIG91dDsKLQotCWlmIChpb3BnZF9pc190YWJsZSgqaW9wZ2QpKQotCQlpb3B0ZSA9IGlvcHRlX29mZnNldChpb3BnZCwgZGEpOwotb3V0OgotCSpwcGdkID0gaW9wZ2Q7Ci0JKnBwdGUgPSBpb3B0ZTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvcGd0YWJsZV9sb29rdXBfZW50cnkpOwotCi1zdGF0aWMgc2l6ZV90IGlvcGd0YWJsZV9jbGVhcl9lbnRyeV9jb3JlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpCi17Ci0Jc2l6ZV90IGJ5dGVzOwotCXUzMiAqaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCBkYSk7Ci0JaW50IG5lbnQgPSAxOwotCi0JaWYgKCEqaW9wZ2QpCi0JCXJldHVybiAwOwotCi0JaWYgKGlvcGdkX2lzX3RhYmxlKCppb3BnZCkpIHsKLQkJaW50IGk7Ci0JCXUzMiAqaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIGRhKTsKLQotCQlieXRlcyA9IElPUFRFX1NJWkU7Ci0JCWlmICgqaW9wdGUgJiBJT1BURV9MQVJHRSkgewotCQkJbmVudCAqPSAxNjsKLQkJCS8qIHJld2luZCB0byB0aGUgMXN0IGVudHJ5ICovCi0JCQlpb3B0ZSA9IGlvcHRlX29mZnNldChpb3BnZCwgKGRhICYgSU9MQVJHRV9NQVNLKSk7Ci0JCX0KLQkJYnl0ZXMgKj0gbmVudDsKLQkJbWVtc2V0KGlvcHRlLCAwLCBuZW50ICogc2l6ZW9mKCppb3B0ZSkpOwotCQlmbHVzaF9pb3B0ZV9yYW5nZShpb3B0ZSwgaW9wdGUgKyAobmVudCAtIDEpICogc2l6ZW9mKCppb3B0ZSkpOwotCi0JCS8qCi0JCSAqIGRvIHRhYmxlIHdhbGsgdG8gY2hlY2sgaWYgdGhpcyB0YWJsZSBpcyBuZWNlc3Nhcnkgb3Igbm90Ci0JCSAqLwotCQlpb3B0ZSA9IGlvcHRlX29mZnNldChpb3BnZCwgMCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9JT1BURTsgaSsrKQotCQkJaWYgKGlvcHRlW2ldKQotCQkJCWdvdG8gb3V0OwotCi0JCWlvcHRlX2ZyZWUoaW9wdGUpOwotCQluZW50ID0gMTsgLyogZm9yIHRoZSBuZXh0IEwxIGVudHJ5ICovCi0JfSBlbHNlIHsKLQkJYnl0ZXMgPSBJT1BHRF9TSVpFOwotCQlpZiAoKCppb3BnZCAmIElPUEdEX1NVUEVSKSA9PSBJT1BHRF9TVVBFUikgewotCQkJbmVudCAqPSAxNjsKLQkJCS8qIHJld2luZCB0byB0aGUgMXN0IGVudHJ5ICovCi0JCQlpb3BnZCA9IGlvcGdkX29mZnNldChvYmosIChkYSAmIElPU1VQRVJfTUFTSykpOwotCQl9Ci0JCWJ5dGVzICo9IG5lbnQ7Ci0JfQotCW1lbXNldChpb3BnZCwgMCwgbmVudCAqIHNpemVvZigqaW9wZ2QpKTsKLQlmbHVzaF9pb3BnZF9yYW5nZShpb3BnZCwgaW9wZ2QgKyAobmVudCAtIDEpICogc2l6ZW9mKCppb3BnZCkpOwotb3V0OgotCXJldHVybiBieXRlczsKLX0KLQotLyoqCi0gKiBpb3BndGFibGVfY2xlYXJfZW50cnkgLSBSZW1vdmUgYW4gaW9tbXUgcHRlIGVudHJ5Ci0gKiBAb2JqOgl0YXJnZXQgaW9tbXUKLSAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKLSAqKi8KLXNpemVfdCBpb3BndGFibGVfY2xlYXJfZW50cnkoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSkKLXsKLQlzaXplX3QgYnl0ZXM7Ci0KLQlzcGluX2xvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKLQotCWJ5dGVzID0gaW9wZ3RhYmxlX2NsZWFyX2VudHJ5X2NvcmUob2JqLCBkYSk7Ci0JZmx1c2hfaW90bGJfcGFnZShvYmosIGRhKTsKLQotCXNwaW5fdW5sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7Ci0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb3BndGFibGVfY2xlYXJfZW50cnkpOwotCi1zdGF0aWMgdm9pZCBpb3BndGFibGVfY2xlYXJfZW50cnlfYWxsKHN0cnVjdCBpb21tdSAqb2JqKQotewotCWludCBpOwotCi0Jc3Bpbl9sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfSU9QR0Q7IGkrKykgewotCQl1MzIgZGE7Ci0JCXUzMiAqaW9wZ2Q7Ci0KLQkJZGEgPSBpIDw8IElPUEdEX1NISUZUOwotCQlpb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKLQotCQlpZiAoISppb3BnZCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChpb3BnZF9pc190YWJsZSgqaW9wZ2QpKQotCQkJaW9wdGVfZnJlZShpb3B0ZV9vZmZzZXQoaW9wZ2QsIDApKTsKLQotCQkqaW9wZ2QgPSAwOwotCQlmbHVzaF9pb3BnZF9yYW5nZShpb3BnZCwgaW9wZ2QpOwotCX0KLQotCWZsdXNoX2lvdGxiX2FsbChvYmopOwotCi0Jc3Bpbl91bmxvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKLX0KLQotLyoKLSAqCURldmljZSBJT01NVSBnZW5lcmljIG9wZXJhdGlvbnMKLSAqLwotc3RhdGljIGlycXJldHVybl90IGlvbW11X2ZhdWx0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQl1MzIgZGEsIGVycnM7Ci0JdTMyICppb3BnZCwgKmlvcHRlOwotCXN0cnVjdCBpb21tdSAqb2JqID0gZGF0YTsKLQotCWlmICghb2JqLT5yZWZjb3VudCkKLQkJcmV0dXJuIElSUV9OT05FOwotCi0JY2xrX2VuYWJsZShvYmotPmNsayk7Ci0JZXJycyA9IGlvbW11X3JlcG9ydF9mYXVsdChvYmosICZkYSk7Ci0JY2xrX2Rpc2FibGUob2JqLT5jbGspOwotCWlmIChlcnJzID09IDApCi0JCXJldHVybiBJUlFfSEFORExFRDsKLQotCS8qIEZhdWx0IGNhbGxiYWNrIG9yIFRMQi9QVEUgRHluYW1pYyBsb2FkaW5nICovCi0JaWYgKG9iai0+aXNyICYmICFvYmotPmlzcihvYmosIGRhLCBlcnJzLCBvYmotPmlzcl9wcml2KSkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCi0JaW9tbXVfZGlzYWJsZShvYmopOwotCi0JaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCBkYSk7Ci0KLQlpZiAoIWlvcGdkX2lzX3RhYmxlKCppb3BnZCkpIHsKLQkJZGV2X2VycihvYmotPmRldiwgIiVzOiBlcnJzOjB4JTA4eCBkYToweCUwOHggcGdkOjB4JXAgIgotCQkJIipwZ2Q6cHglMDh4XG4iLCBvYmotPm5hbWUsIGVycnMsIGRhLCBpb3BnZCwgKmlvcGdkKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCWlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSk7Ci0KLQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6IGVycnM6MHglMDh4IGRhOjB4JTA4eCBwZ2Q6MHglcCAqcGdkOjB4JTA4eCAiCi0JCSJwdGU6MHglcCAqcHRlOjB4JTA4eFxuIiwgb2JqLT5uYW1lLCBlcnJzLCBkYSwgaW9wZ2QsICppb3BnZCwKLQkJaW9wdGUsICppb3B0ZSk7Ci0KLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLXN0YXRpYyBpbnQgZGV2aWNlX21hdGNoX2J5X2FsaWFzKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaW9tbXUgKm9iaiA9IHRvX2lvbW11KGRldik7Ci0JY29uc3QgY2hhciAqbmFtZSA9IGRhdGE7Ci0KLQlwcl9kZWJ1ZygiJXM6ICVzICVzXG4iLCBfX2Z1bmNfXywgb2JqLT5uYW1lLCBuYW1lKTsKLQotCXJldHVybiBzdHJjbXAob2JqLT5uYW1lLCBuYW1lKSA9PSAwOwotfQotCi0vKioKLSAqIGlvbW11X3NldF9kYV9yYW5nZSAtIFNldCBhIHZhbGlkIGRldmljZSBhZGRyZXNzIHJhbmdlCi0gKiBAb2JqOgkJdGFyZ2V0IGlvbW11Ci0gKiBAc3RhcnQJCVN0YXJ0IG9mIHZhbGlkIHJhbmdlCi0gKiBAZW5kCQkJRW5kIG9mIHZhbGlkIHJhbmdlCi0gKiovCi1pbnQgaW9tbXVfc2V0X2RhX3JhbmdlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgc3RhcnQsIHUzMiBlbmQpCi17Ci0KLQlpZiAoIW9iaikKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoZW5kIDwgc3RhcnQgfHwgIVBBR0VfQUxJR04oc3RhcnQgfCBlbmQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9iai0+ZGFfc3RhcnQgPSBzdGFydDsKLQlvYmotPmRhX2VuZCA9IGVuZDsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfc2V0X2RhX3JhbmdlKTsKLQotLyoqCi0gKiBpb21tdV9nZXQgLSBHZXQgaW9tbXUgaGFuZGxlcgotICogQG5hbWU6CXRhcmdldCBpb21tdSBuYW1lCi0gKiovCi1zdHJ1Y3QgaW9tbXUgKmlvbW11X2dldChjb25zdCBjaGFyICpuYW1lKQotewotCWludCBlcnIgPSAtRU5PTUVNOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgaW9tbXUgKm9iajsKLQotCWRldiA9IGRyaXZlcl9maW5kX2RldmljZSgmb21hcF9pb21tdV9kcml2ZXIuZHJpdmVyLCBOVUxMLCAodm9pZCAqKW5hbWUsCi0JCQkJIGRldmljZV9tYXRjaF9ieV9hbGlhcyk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCi0Jb2JqID0gdG9faW9tbXUoZGV2KTsKLQotCW11dGV4X2xvY2soJm9iai0+aW9tbXVfbG9jayk7Ci0KLQlpZiAob2JqLT5yZWZjb3VudCsrID09IDApIHsKLQkJZXJyID0gaW9tbXVfZW5hYmxlKG9iaik7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9lbmFibGU7Ci0JCWZsdXNoX2lvdGxiX2FsbChvYmopOwotCX0KLQotCWlmICghdHJ5X21vZHVsZV9nZXQob2JqLT5vd25lcikpCi0JCWdvdG8gZXJyX21vZHVsZTsKLQotCW11dGV4X3VubG9jaygmb2JqLT5pb21tdV9sb2NrKTsKLQotCWRldl9kYmcob2JqLT5kZXYsICIlczogJXNcbiIsIF9fZnVuY19fLCBvYmotPm5hbWUpOwotCXJldHVybiBvYmo7Ci0KLWVycl9tb2R1bGU6Ci0JaWYgKG9iai0+cmVmY291bnQgPT0gMSkKLQkJaW9tbXVfZGlzYWJsZShvYmopOwotZXJyX2VuYWJsZToKLQlvYmotPnJlZmNvdW50LS07Ci0JbXV0ZXhfdW5sb2NrKCZvYmotPmlvbW11X2xvY2spOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV9nZXQpOwotCi0vKioKLSAqIGlvbW11X3B1dCAtIFB1dCBiYWNrIGlvbW11IGhhbmRsZXIKLSAqIEBvYmo6CXRhcmdldCBpb21tdQotICoqLwotdm9pZCBpb21tdV9wdXQoc3RydWN0IGlvbW11ICpvYmopCi17Ci0JaWYgKCFvYmogfHwgSVNfRVJSKG9iaikpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJm9iai0+aW9tbXVfbG9jayk7Ci0KLQlpZiAoLS1vYmotPnJlZmNvdW50ID09IDApCi0JCWlvbW11X2Rpc2FibGUob2JqKTsKLQotCW1vZHVsZV9wdXQob2JqLT5vd25lcik7Ci0KLQltdXRleF91bmxvY2soJm9iai0+aW9tbXVfbG9jayk7Ci0KLQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICVzXG4iLCBfX2Z1bmNfXywgb2JqLT5uYW1lKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X3B1dCk7Ci0KLWludCBpb21tdV9zZXRfaXNyKGNvbnN0IGNoYXIgKm5hbWUsCi0JCSAgaW50ICgqaXNyKShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgaW9tbXVfZXJycywKLQkJCSAgICAgdm9pZCAqcHJpdiksCi0JCSAgdm9pZCAqaXNyX3ByaXYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBpb21tdSAqb2JqOwotCi0JZGV2ID0gZHJpdmVyX2ZpbmRfZGV2aWNlKCZvbWFwX2lvbW11X2RyaXZlci5kcml2ZXIsIE5VTEwsICh2b2lkICopbmFtZSwKLQkJCQkgZGV2aWNlX21hdGNoX2J5X2FsaWFzKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlvYmogPSB0b19pb21tdShkZXYpOwotCW11dGV4X2xvY2soJm9iai0+aW9tbXVfbG9jayk7Ci0JaWYgKG9iai0+cmVmY291bnQgIT0gMCkgewotCQltdXRleF91bmxvY2soJm9iai0+aW9tbXVfbG9jayk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCW9iai0+aXNyID0gaXNyOwotCW9iai0+aXNyX3ByaXYgPSBpc3JfcHJpdjsKLQltdXRleF91bmxvY2soJm9iai0+aW9tbXVfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X3NldF9pc3IpOwotCi0vKgotICoJT01BUCBEZXZpY2UgTU1VKElPTU1VKSBkZXRlY3Rpb24KLSAqLwotc3RhdGljIGludCBfX2RldmluaXQgb21hcF9pb21tdV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCBlcnIgPSAtRU5PREVWOwotCXZvaWQgKnA7Ci0JaW50IGlycTsKLQlzdHJ1Y3QgaW9tbXUgKm9iajsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlzdHJ1Y3QgaW9tbXVfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCWlmIChwZGV2LT5udW1fcmVzb3VyY2VzICE9IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jb2JqID0ga3phbGxvYyhzaXplb2YoKm9iaikgKyBNTVVfUkVHX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghb2JqKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW9iai0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBwZGF0YS0+Y2xrX25hbWUpOwotCWlmIChJU19FUlIob2JqLT5jbGspKQotCQlnb3RvIGVycl9jbGs7Ci0KLQlvYmotPm5yX3RsYl9lbnRyaWVzID0gcGRhdGEtPm5yX3RsYl9lbnRyaWVzOwotCW9iai0+bmFtZSA9IHBkYXRhLT5uYW1lOwotCW9iai0+ZGV2ID0gJnBkZXYtPmRldjsKLQlvYmotPmN0eCA9ICh2b2lkICopb2JqICsgc2l6ZW9mKCpvYmopOwotCW9iai0+ZGFfc3RhcnQgPSBwZGF0YS0+ZGFfc3RhcnQ7Ci0Jb2JqLT5kYV9lbmQgPSBwZGF0YS0+ZGFfZW5kOwotCi0JbXV0ZXhfaW5pdCgmb2JqLT5pb21tdV9sb2NrKTsKLQltdXRleF9pbml0KCZvYmotPm1tYXBfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmb2JqLT5tbWFwKTsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZXMpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBlcnJfbWVtOwotCX0KLQotCXJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCi0JCQkJIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKLQlpZiAoIXJlcykgewotCQllcnIgPSAtRUlPOwotCQlnb3RvIGVycl9tZW07Ci0JfQotCi0Jb2JqLT5yZWdiYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghb2JqLT5yZWdiYXNlKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2lvcmVtYXA7Ci0JfQotCi0JaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoaXJxIDwgMCkgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGVycl9pcnE7Ci0JfQotCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgaW9tbXVfZmF1bHRfaGFuZGxlciwgSVJRRl9TSEFSRUQsCi0JCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBvYmopOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycl9pcnE7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgb2JqKTsKLQotCXAgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKElPUEdEX1RBQkxFX1NJWkUpKTsKLQlpZiAoIXApIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfcGdkOwotCX0KLQltZW1zZXQocCwgMCwgSU9QR0RfVEFCTEVfU0laRSk7Ci0JY2xlYW5fZGNhY2hlX2FyZWEocCwgSU9QR0RfVEFCTEVfU0laRSk7Ci0Jb2JqLT5pb3BnZCA9IHA7Ci0KLQlCVUdfT04oIUlTX0FMSUdORUQoKHVuc2lnbmVkIGxvbmcpb2JqLT5pb3BnZCwgSU9QR0RfVEFCTEVfU0laRSkpOwotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHJlZ2lzdGVyZWRcbiIsIG9iai0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci0KLWVycl9wZ2Q6Ci0JZnJlZV9pcnEoaXJxLCBvYmopOwotZXJyX2lycToKLQlpb3VubWFwKG9iai0+cmVnYmFzZSk7Ci1lcnJfaW9yZW1hcDoKLQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLWVycl9tZW06Ci0JY2xrX3B1dChvYmotPmNsayk7Ci1lcnJfY2xrOgotCWtmcmVlKG9iaik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgb21hcF9pb21tdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgaXJxOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXN0cnVjdCBpb21tdSAqb2JqID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCWlvcGd0YWJsZV9jbGVhcl9lbnRyeV9hbGwob2JqKTsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW9iai0+aW9wZ2QsIGdldF9vcmRlcihJT1BHRF9UQUJMRV9TSVpFKSk7Ci0KLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWZyZWVfaXJxKGlycSwgb2JqKTsKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlvdW5tYXAob2JqLT5yZWdiYXNlKTsKLQotCWNsa19wdXQob2JqLT5jbGspOwotCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyByZW1vdmVkXG4iLCBvYmotPm5hbWUpOwotCWtmcmVlKG9iaik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfaW9tbXVfZHJpdmVyID0gewotCS5wcm9iZQk9IG9tYXBfaW9tbXVfcHJvYmUsCi0JLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKG9tYXBfaW9tbXVfcmVtb3ZlKSwKLQkuZHJpdmVyCT0gewotCQkubmFtZQk9ICJvbWFwLWlvbW11IiwKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgaW9wdGVfY2FjaGVwX2N0b3Iodm9pZCAqaW9wdGUpCi17Ci0JY2xlYW5fZGNhY2hlX2FyZWEoaW9wdGUsIElPUFRFX1RBQkxFX1NJWkUpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwX2lvbW11X2luaXQodm9pZCkKLXsKLQlzdHJ1Y3Qga21lbV9jYWNoZSAqcDsKLQljb25zdCB1bnNpZ25lZCBsb25nIGZsYWdzID0gU0xBQl9IV0NBQ0hFX0FMSUdOOwotCXNpemVfdCBhbGlnbiA9IDEgPDwgMTA7IC8qIEwyIHBhZ2V0YWJsZSBhbGlnbmVtZW50ICovCi0KLQlwID0ga21lbV9jYWNoZV9jcmVhdGUoImlvcHRlX2NhY2hlIiwgSU9QVEVfVEFCTEVfU0laRSwgYWxpZ24sIGZsYWdzLAotCQkJICAgICAgaW9wdGVfY2FjaGVwX2N0b3IpOwotCWlmICghcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaW9wdGVfY2FjaGVwID0gcDsKLQotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBfaW9tbXVfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KG9tYXBfaW9tbXVfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX2lvbW11X2V4aXQodm9pZCkKLXsKLQlrbWVtX2NhY2hlX2Rlc3Ryb3koaW9wdGVfY2FjaGVwKTsKLQotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwX2lvbW11X2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChvbWFwX2lvbW11X2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIm9tYXAgaW9tbXU6IHRsYiBhbmQgcGFnZXRhYmxlIHByaW1pdGl2ZXMiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06b21hcC1pb21tdSIpOwotTU9EVUxFX0FVVEhPUigiSGlyb3NoaSBET1lVLCBQYXVsIE11bmR0IGFuZCBUb3NoaWhpcm8gS29iYXlhc2hpIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW9wZ3RhYmxlLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW9wZ3RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTkzYmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvcGd0YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBvbWFwIGlvbW11OiBwYWdldGFibGUgZGVmaW5pdGlvbnMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgotICoKLSAqIFdyaXR0ZW4gYnkgSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfX1BMQVRfT01BUF9JT01NVV9ICi0jZGVmaW5lIF9fUExBVF9PTUFQX0lPTU1VX0gKLQotLyoKLSAqICJMMiB0YWJsZSIgYWRkcmVzcyBtYXNrIGFuZCBzaXplIGRlZmluaXRpb25zLgotICovCi0jZGVmaW5lIElPUEdEX1NISUZUCQkyMAotI2RlZmluZSBJT1BHRF9TSVpFCQkoMVVMIDw8IElPUEdEX1NISUZUKQotI2RlZmluZSBJT1BHRF9NQVNLCQkofihJT1BHRF9TSVpFIC0gMSkpCi0KLS8qCi0gKiAic2VjdGlvbiIgYWRkcmVzcyBtYXNrIGFuZCBzaXplIGRlZmluaXRpb25zLgotICovCi0jZGVmaW5lIElPU0VDVElPTl9TSElGVAkJMjAKLSNkZWZpbmUgSU9TRUNUSU9OX1NJWkUJCSgxVUwgPDwgSU9TRUNUSU9OX1NISUZUKQotI2RlZmluZSBJT1NFQ1RJT05fTUFTSwkJKH4oSU9TRUNUSU9OX1NJWkUgLSAxKSkKLQotLyoKLSAqICJzdXBlcnNlY3Rpb24iIGFkZHJlc3MgbWFzayBhbmQgc2l6ZSBkZWZpbml0aW9ucy4KLSAqLwotI2RlZmluZSBJT1NVUEVSX1NISUZUCQkyNAotI2RlZmluZSBJT1NVUEVSX1NJWkUJCSgxVUwgPDwgSU9TVVBFUl9TSElGVCkKLSNkZWZpbmUgSU9TVVBFUl9NQVNLCQkofihJT1NVUEVSX1NJWkUgLSAxKSkKLQotI2RlZmluZSBQVFJTX1BFUl9JT1BHRAkJKDFVTCA8PCAoMzIgLSBJT1BHRF9TSElGVCkpCi0jZGVmaW5lIElPUEdEX1RBQkxFX1NJWkUJKFBUUlNfUEVSX0lPUEdEICogc2l6ZW9mKHUzMikpCi0KLS8qCi0gKiAic21hbGwgcGFnZSIgYWRkcmVzcyBtYXNrIGFuZCBzaXplIGRlZmluaXRpb25zLgotICovCi0jZGVmaW5lIElPUFRFX1NISUZUCQkxMgotI2RlZmluZSBJT1BURV9TSVpFCQkoMVVMIDw8IElPUFRFX1NISUZUKQotI2RlZmluZSBJT1BURV9NQVNLCQkofihJT1BURV9TSVpFIC0gMSkpCi0KLS8qCi0gKiAibGFyZ2UgcGFnZSIgYWRkcmVzcyBtYXNrIGFuZCBzaXplIGRlZmluaXRpb25zLgotICovCi0jZGVmaW5lIElPTEFSR0VfU0hJRlQJCTE2Ci0jZGVmaW5lIElPTEFSR0VfU0laRQkJKDFVTCA8PCBJT0xBUkdFX1NISUZUKQotI2RlZmluZSBJT0xBUkdFX01BU0sJCSh+KElPTEFSR0VfU0laRSAtIDEpKQotCi0jZGVmaW5lIFBUUlNfUEVSX0lPUFRFCQkoMVVMIDw8IChJT1BHRF9TSElGVCAtIElPUFRFX1NISUZUKSkKLSNkZWZpbmUgSU9QVEVfVEFCTEVfU0laRQkoUFRSU19QRVJfSU9QVEUgKiBzaXplb2YodTMyKSkKLQotI2RlZmluZSBJT1BBR0VfTUFTSwkJSU9QVEVfTUFTSwotCi0vKgotICogc29tZSBkZXNjcmlwdG9yIGF0dHJpYnV0ZXMuCi0gKi8KLSNkZWZpbmUgSU9QR0RfVEFCTEUJCSgxIDw8IDApCi0jZGVmaW5lIElPUEdEX1NFQ1RJT04JCSgyIDw8IDApCi0jZGVmaW5lIElPUEdEX1NVUEVSCQkoMSA8PCAxOCB8IDIgPDwgMCkKLQotI2RlZmluZSBpb3BnZF9pc190YWJsZSh4KQkoKCh4KSAmIDMpID09IElPUEdEX1RBQkxFKQotCi0jZGVmaW5lIElPUFRFX1NNQUxMCQkoMiA8PCAwKQotI2RlZmluZSBJT1BURV9MQVJHRQkJKDEgPDwgMCkKLQotLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIHBhZ2UtdGFibGUtZGlyZWN0b3J5ICovCi0jZGVmaW5lIGlvcGdkX2luZGV4KGRhKQkJKCgoZGEpID4+IElPUEdEX1NISUZUKSAmIChQVFJTX1BFUl9JT1BHRCAtIDEpKQotI2RlZmluZSBpb3BnZF9vZmZzZXQob2JqLCBkYSkJKChvYmopLT5pb3BnZCArIGlvcGdkX2luZGV4KGRhKSkKLQotI2RlZmluZSBpb3BnZF9wYWdlX3BhZGRyKGlvcGdkKQkoKmlvcGdkICYgfigoMSA8PCAxMCkgLSAxKSkKLSNkZWZpbmUgaW9wZ2RfcGFnZV92YWRkcihpb3BnZCkJKCh1MzIgKilwaHlzX3RvX3ZpcnQoaW9wZ2RfcGFnZV9wYWRkcihpb3BnZCkpKQotCi0vKiB0byBmaW5kIGFuIGVudHJ5IGluIHRoZSBzZWNvbmQtbGV2ZWwgcGFnZSB0YWJsZS4gKi8KLSNkZWZpbmUgaW9wdGVfaW5kZXgoZGEpCQkoKChkYSkgPj4gSU9QVEVfU0hJRlQpICYgKFBUUlNfUEVSX0lPUFRFIC0gMSkpCi0jZGVmaW5lIGlvcHRlX29mZnNldChpb3BnZCwgZGEpCShpb3BnZF9wYWdlX3ZhZGRyKGlvcGdkKSArIGlvcHRlX2luZGV4KGRhKSkKLQotc3RhdGljIGlubGluZSB1MzIgaW90bGJfaW5pdF9lbnRyeShzdHJ1Y3QgaW90bGJfZW50cnkgKmUsIHUzMiBkYSwgdTMyIHBhLAotCQkJCSAgIHUzMiBmbGFncykKLXsKLQltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7Ci0KLQllLT5kYQkJPSBkYTsKLQllLT5wYQkJPSBwYTsKLQllLT52YWxpZAk9IDE7Ci0JLyogRklYTUU6IGFkZCBPTUFQMSBzdXBwb3J0ICovCi0JZS0+cGdzegkJPSBmbGFncyAmIE1NVV9DQU1fUEdTWl9NQVNLOwotCWUtPmVuZGlhbgk9IGZsYWdzICYgTU1VX1JBTV9FTkRJQU5fTUFTSzsKLQllLT5lbHN6CQk9IGZsYWdzICYgTU1VX1JBTV9FTFNaX01BU0s7Ci0JZS0+bWl4ZWQJPSBmbGFncyAmIE1NVV9SQU1fTUlYRURfTUFTSzsKLQotCXJldHVybiBpb3Bnc3pfdG9fYnl0ZXMoZS0+cGdzeik7Ci19Ci0KLSNkZWZpbmUgdG9faW9tbXUoZGV2KQkJCQkJCQlcCi0JKHN0cnVjdCBpb21tdSAqKXBsYXRmb3JtX2dldF9kcnZkYXRhKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKQotCi0jZW5kaWYgLyogX19QTEFUX09NQVBfSU9NTVVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvdm1tLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW92bW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzllN2ZlZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW92bW0uYworKysgL2Rldi9udWxsCkBAIC0xLDkwNCArMCwwIEBACi0vKgotICogb21hcCBpb21tdTogc2ltcGxlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBtYW5hZ2VtZW50Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KLSAqCi0gKiBXcml0dGVuIGJ5IEhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9pb21tdS5oPgotI2luY2x1ZGUgPHBsYXQvaW92bW0uaD4KLQotI2luY2x1ZGUgImlvcGd0YWJsZS5oIgotCi0vKgotICogQSBkZXZpY2UgZHJpdmVyIG5lZWRzIHRvIGNyZWF0ZSBhZGRyZXNzIG1hcHBpbmdzIGJldHdlZW46Ci0gKgotICogLSBpb21tdS9kZXZpY2UgYWRkcmVzcwotICogLSBwaHlzaWNhbCBhZGRyZXNzCi0gKiAtIG1wdSB2aXJ0dWFsIGFkZHJlc3MKLSAqCi0gKiBUaGVyZSBhcmUgNCBwb3NzaWJsZSBwYXR0ZXJucyBmb3IgdGhlbToKLSAqCi0gKiAgICB8aW92YS8JCQkgIG1hcHBpbmcJCWlvbW11XwkJcGFnZQotICogICAgfCBkYQlwYQl2YQkoZCktKHApLSh2KQkJZnVuY3Rpb24JdHlwZQotICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIDEgfCBjCWMJYwkgMSAtIDEgLSAxCSAgX2ttYXAoKSAvIF9rdW5tYXAoKQlzCi0gKiAgMiB8IGMJYyxhCWMJIDEgLSAxIC0gMQlfa21hbGxvYygpLyBfa2ZyZWUoKQlzCi0gKiAgMyB8IGMJZAljCSAxIC0gbiAtIDEJICBfdm1hcCgpIC8gX3Z1bm1hcCgpCXMKLSAqICA0IHwgYwlkLGEJYwkgMSAtIG4gLSAxCV92bWFsbG9jKCkvIF92ZnJlZSgpCW4qCi0gKgotICoKLSAqCSdpb3ZhJzoJZGV2aWNlIGlvbW11IHZpcnR1YWwgYWRkcmVzcwotICoJJ2RhJzoJYWxpYXMgb2YgJ2lvdmEnCi0gKgkncGEnOglwaHlzaWNhbCBhZGRyZXNzCi0gKgkndmEnOgltcHUgdmlydHVhbCBhZGRyZXNzCi0gKgotICoJJ2MnOgljb250aWd1b3VzIG1lbW9yeSBhcmVhCi0gKgknZCc6CWRpc2NvbnRpZ3VvdXMgbWVtb3J5IGFyZWEKLSAqCSdhJzoJYW5vbnltb3VzIG1lbW9yeSBhbGxvY2F0aW9uCi0gKgknKCknOglvcHRpb25hbCBmZWF0dXJlCi0gKgotICoJJ24nOglhIG5vcm1hbCBwYWdlKDRLQikgc2l6ZSBpcyB1c2VkLgotICoJJ3MnOgltdWx0aXBsZSBpb21tdSBzdXBlcnBhZ2UoMTZNQiwgMU1CLCA2NEtCLCA0S0IpIHNpemUgaXMgdXNlZC4KLSAqCi0gKgknKic6CW5vdCB5ZXQsIGJ1dCBmZWFzaWJsZS4KLSAqLwotCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlvdm1fYXJlYV9jYWNoZXA7Ci0KLS8qIHJldHVybiB0b3RhbCBieXRlcyBvZiBzZyBidWZmZXJzICovCi1zdGF0aWMgc2l6ZV90IHNndGFibGVfbGVuKGNvbnN0IHN0cnVjdCBzZ190YWJsZSAqc2d0KQotewotCXVuc2lnbmVkIGludCBpLCB0b3RhbCA9IDA7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQotCWlmICghc2d0KQotCQlyZXR1cm4gMDsKLQotCWZvcl9lYWNoX3NnKHNndC0+c2dsLCBzZywgc2d0LT5uZW50cywgaSkgewotCQlzaXplX3QgYnl0ZXM7Ci0KLQkJYnl0ZXMgPSBzZy0+bGVuZ3RoOwotCi0JCWlmICghaW9wZ3N6X29rKGJ5dGVzKSkgewotCQkJcHJfZXJyKCIlczogc2dbJWRdIG5vdCBpb21tdSBwYWdlc2l6ZSgleClcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGksIGJ5dGVzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJdG90YWwgKz0gYnl0ZXM7Ci0JfQotCi0JcmV0dXJuIHRvdGFsOwotfQotI2RlZmluZSBzZ3RhYmxlX29rKHgpCSghIXNndGFibGVfbGVuKHgpKQotCi1zdGF0aWMgdW5zaWduZWQgbWF4X2FsaWdubWVudCh1MzIgYWRkcikKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBwYWdlc2l6ZVtdID0geyBTWl8xNk0sIFNaXzFNLCBTWl82NEssIFNaXzRLLCB9OwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhZ2VzaXplKSAmJiBhZGRyICYgKHBhZ2VzaXplW2ldIC0gMSk7IGkrKykKLQkJOwotCXJldHVybiAoaSA8IEFSUkFZX1NJWkUocGFnZXNpemUpKSA/IHBhZ2VzaXplW2ldIDogMDsKLX0KLQotLyoKLSAqIGNhbGN1bGF0ZSB0aGUgb3B0aW1hbCBudW1iZXIgc2cgZWxlbWVudHMgZnJvbSB0b3RhbCBieXRlcyBiYXNlZCBvbgotICogaW9tbXUgc3VwZXJwYWdlcwotICovCi1zdGF0aWMgdW5zaWduZWQgc2d0YWJsZV9uZW50cyhzaXplX3QgYnl0ZXMsIHUzMiBkYSwgdTMyIHBhKQotewotCXVuc2lnbmVkIG5yX2VudHJpZXMgPSAwLCBlbnRfc3o7Ci0KLQlpZiAoIUlTX0FMSUdORUQoYnl0ZXMsIFBBR0VfU0laRSkpIHsKLQkJcHJfZXJyKCIlczogd3Jvbmcgc2l6ZSAlMDh4XG4iLCBfX2Z1bmNfXywgYnl0ZXMpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3aGlsZSAoYnl0ZXMpIHsKLQkJZW50X3N6ID0gbWF4X2FsaWdubWVudChkYSB8IHBhKTsKLQkJZW50X3N6ID0gbWluX3QodW5zaWduZWQsIGVudF9zeiwgaW9wZ3N6X21heChieXRlcykpOwotCQlucl9lbnRyaWVzKys7Ci0JCWRhICs9IGVudF9zejsKLQkJcGEgKz0gZW50X3N6OwotCQlieXRlcyAtPSBlbnRfc3o7Ci0JfQotCi0JcmV0dXJuIG5yX2VudHJpZXM7Ci19Ci0KLS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHNnX3RhYmxlIGhlYWRlcihhIGtpbmQgb2YgJ3N1cGVyYmxvY2snKSAqLwotc3RhdGljIHN0cnVjdCBzZ190YWJsZSAqc2d0YWJsZV9hbGxvYyhjb25zdCBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncywKLQkJCQkJCQl1MzIgZGEsIHUzMiBwYSkKLXsKLQl1bnNpZ25lZCBpbnQgbnJfZW50cmllczsKLQlpbnQgZXJyOwotCXN0cnVjdCBzZ190YWJsZSAqc2d0OwotCi0JaWYgKCFieXRlcykKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlpZiAoIUlTX0FMSUdORUQoYnl0ZXMsIFBBR0VfU0laRSkpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0JaWYgKGZsYWdzICYgSU9WTUZfTElORUFSKSB7Ci0JCW5yX2VudHJpZXMgPSBzZ3RhYmxlX25lbnRzKGJ5dGVzLCBkYSwgcGEpOwotCQlpZiAoIW5yX2VudHJpZXMpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQl9IGVsc2UKLQkJbnJfZW50cmllcyA9ICBieXRlcyAvIFBBR0VfU0laRTsKLQotCXNndCA9IGt6YWxsb2Moc2l6ZW9mKCpzZ3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNndCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQllcnIgPSBzZ19hbGxvY190YWJsZShzZ3QsIG5yX2VudHJpZXMsIEdGUF9LRVJORUwpOwotCWlmIChlcnIpIHsKLQkJa2ZyZWUoc2d0KTsKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHNndDolcCglZCBlbnRyaWVzKVxuIiwgX19mdW5jX18sIHNndCwgbnJfZW50cmllcyk7Ci0KLQlyZXR1cm4gc2d0OwotfQotCi0vKiBmcmVlIHNnX3RhYmxlIGhlYWRlcihhIGtpbmQgb2Ygc3VwZXJibG9jaykgKi8KLXN0YXRpYyB2b2lkIHNndGFibGVfZnJlZShzdHJ1Y3Qgc2dfdGFibGUgKnNndCkKLXsKLQlpZiAoIXNndCkKLQkJcmV0dXJuOwotCi0Jc2dfZnJlZV90YWJsZShzZ3QpOwotCWtmcmVlKHNndCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNndDolcFxuIiwgX19mdW5jX18sIHNndCk7Ci19Ci0KLS8qIG1hcCAnc2dsaXN0JyB0byBhIGNvbnRpZ3VvdXMgbXB1IHZpcnR1YWwgYXJlYSBhbmQgcmV0dXJuICd2YScgKi8KLXN0YXRpYyB2b2lkICp2bWFwX3NnKGNvbnN0IHN0cnVjdCBzZ190YWJsZSAqc2d0KQotewotCXUzMiB2YTsKLQlzaXplX3QgdG90YWw7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICpuZXc7Ci0JY29uc3Qgc3RydWN0IG1lbV90eXBlICptdHlwZTsKLQotCW10eXBlID0gZ2V0X21lbV90eXBlKE1UX0RFVklDRSk7Ci0JaWYgKCFtdHlwZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQl0b3RhbCA9IHNndGFibGVfbGVuKHNndCk7Ci0JaWYgKCF0b3RhbCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQluZXcgPSBfX2dldF92bV9hcmVhKHRvdGFsLCBWTV9JT1JFTUFQLCBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCk7Ci0JaWYgKCFuZXcpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCXZhID0gKHUzMiluZXctPmFkZHI7Ci0KLQlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgc2csIHNndC0+bmVudHMsIGkpIHsKLQkJc2l6ZV90IGJ5dGVzOwotCQl1MzIgcGE7Ci0JCWludCBlcnI7Ci0KLQkJcGEgPSBzZ19waHlzKHNnKTsKLQkJYnl0ZXMgPSBzZy0+bGVuZ3RoOwotCi0JCUJVR19PTihieXRlcyAhPSBQQUdFX1NJWkUpOwotCi0JCWVyciA9IGlvcmVtYXBfcGFnZSh2YSwgIHBhLCBtdHlwZSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXQ7Ci0KLQkJdmEgKz0gYnl0ZXM7Ci0JfQotCi0JZmx1c2hfY2FjaGVfdm1hcCgodW5zaWduZWQgbG9uZyluZXctPmFkZHIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpKG5ldy0+YWRkciArIHRvdGFsKSk7Ci0JcmV0dXJuIG5ldy0+YWRkcjsKLQotZXJyX291dDoKLQlXQVJOX09OKDEpOyAvKiBGSVhNRTogY2xlYW51cCBzb21lIG1wdSBtYXBwaW5ncyAqLwotCXZ1bm1hcChuZXctPmFkZHIpOwotCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdnVubWFwX3NnKGNvbnN0IHZvaWQgKnZhKQotewotCXZ1bm1hcCh2YSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW92bV9zdHJ1Y3QgKl9fZmluZF9pb3ZtX2FyZWEoc3RydWN0IGlvbW11ICpvYmosIGNvbnN0IHUzMiBkYSkKLXsKLQlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKnRtcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmb2JqLT5tbWFwLCBsaXN0KSB7Ci0JCWlmICgoZGEgPj0gdG1wLT5kYV9zdGFydCkgJiYgKGRhIDwgdG1wLT5kYV9lbmQpKSB7Ci0JCQlzaXplX3QgbGVuOwotCi0JCQlsZW4gPSB0bXAtPmRhX2VuZCAtIHRtcC0+ZGFfc3RhcnQ7Ci0KLQkJCWRldl9kYmcob2JqLT5kZXYsICIlczogJTA4eC0lMDh4LSUwOHgoJXgpICUwOHhcbiIsCi0JCQkJX19mdW5jX18sIHRtcC0+ZGFfc3RhcnQsIGRhLCB0bXAtPmRhX2VuZCwgbGVuLAotCQkJCXRtcC0+ZmxhZ3MpOwotCi0JCQlyZXR1cm4gdG1wOwotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotICogZmluZF9pb3ZtX2FyZWEgIC0gIGZpbmQgaW92bWEgd2hpY2ggaW5jbHVkZXMgQGRhCi0gKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCi0gKgotICogRmluZCB0aGUgZXhpc3RpbmcgaW92bWEgc3RhcnRpbmcgYXQgQGRhCi0gKi8KLXN0cnVjdCBpb3ZtX3N0cnVjdCAqZmluZF9pb3ZtX2FyZWEoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSkKLXsKLQlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFyZWE7Ci0KLQltdXRleF9sb2NrKCZvYmotPm1tYXBfbG9jayk7Ci0JYXJlYSA9IF9fZmluZF9pb3ZtX2FyZWEob2JqLCBkYSk7Ci0JbXV0ZXhfdW5sb2NrKCZvYmotPm1tYXBfbG9jayk7Ci0KLQlyZXR1cm4gYXJlYTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZpbmRfaW92bV9hcmVhKTsKLQotLyoKLSAqIFRoaXMgZmluZHMgdGhlIGhvbGUoYXJlYSkgd2hpY2ggZml0cyB0aGUgcmVxdWVzdGVkIGFkZHJlc3MgYW5kIGxlbgotICogaW4gaW92bWFzIG1tYXAsIGFuZCByZXR1cm5zIHRoZSBuZXcgYWxsb2NhdGVkIGlvdm1hLgotICovCi1zdGF0aWMgc3RydWN0IGlvdm1fc3RydWN0ICphbGxvY19pb3ZtX2FyZWEoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwKLQkJCQkJICAgc2l6ZV90IGJ5dGVzLCB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGlvdm1fc3RydWN0ICpuZXcsICp0bXA7Ci0JdTMyIHN0YXJ0LCBwcmV2X2VuZCwgYWxpZ25tZW50OwotCi0JaWYgKCFvYmogfHwgIWJ5dGVzKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCXN0YXJ0ID0gZGE7Ci0JYWxpZ25tZW50ID0gUEFHRV9TSVpFOwotCi0JaWYgKH5mbGFncyAmIElPVk1GX0RBX0ZJWEVEKSB7Ci0JCS8qIERvbid0IG1hcCBhZGRyZXNzIDAgKi8KLQkJc3RhcnQgPSBvYmotPmRhX3N0YXJ0ID8gb2JqLT5kYV9zdGFydCA6IGFsaWdubWVudDsKLQotCQlpZiAoZmxhZ3MgJiBJT1ZNRl9MSU5FQVIpCi0JCQlhbGlnbm1lbnQgPSBpb3Bnc3pfbWF4KGJ5dGVzKTsKLQkJc3RhcnQgPSByb3VuZHVwKHN0YXJ0LCBhbGlnbm1lbnQpOwotCX0gZWxzZSBpZiAoc3RhcnQgPCBvYmotPmRhX3N0YXJ0IHx8IHN0YXJ0ID4gb2JqLT5kYV9lbmQgfHwKLQkJCQkJb2JqLT5kYV9lbmQgLSBzdGFydCA8IGJ5dGVzKSB7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQotCXRtcCA9IE5VTEw7Ci0JaWYgKGxpc3RfZW1wdHkoJm9iai0+bW1hcCkpCi0JCWdvdG8gZm91bmQ7Ci0KLQlwcmV2X2VuZCA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZvYmotPm1tYXAsIGxpc3QpIHsKLQotCQlpZiAocHJldl9lbmQgPiBzdGFydCkKLQkJCWJyZWFrOwotCi0JCWlmICh0bXAtPmRhX3N0YXJ0ID4gc3RhcnQgJiYgKHRtcC0+ZGFfc3RhcnQgLSBzdGFydCkgPj0gYnl0ZXMpCi0JCQlnb3RvIGZvdW5kOwotCi0JCWlmICh0bXAtPmRhX2VuZCA+PSBzdGFydCAmJiB+ZmxhZ3MgJiBJT1ZNRl9EQV9GSVhFRCkKLQkJCXN0YXJ0ID0gcm91bmR1cCh0bXAtPmRhX2VuZCArIDEsIGFsaWdubWVudCk7Ci0KLQkJcHJldl9lbmQgPSB0bXAtPmRhX2VuZDsKLQl9Ci0KLQlpZiAoKHN0YXJ0ID49IHByZXZfZW5kKSAmJiAob2JqLT5kYV9lbmQgLSBzdGFydCA+PSBieXRlcykpCi0JCWdvdG8gZm91bmQ7Ci0KLQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IG5vIHNwYWNlIHRvIGZpdCAlMDh4KCV4KSBmbGFnczogJTA4eFxuIiwKLQkJX19mdW5jX18sIGRhLCBieXRlcywgZmxhZ3MpOwotCi0JcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLWZvdW5kOgotCW5ldyA9IGttZW1fY2FjaGVfemFsbG9jKGlvdm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwotCWlmICghbmV3KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCW5ldy0+aW9tbXUgPSBvYmo7Ci0JbmV3LT5kYV9zdGFydCA9IHN0YXJ0OwotCW5ldy0+ZGFfZW5kID0gc3RhcnQgKyBieXRlczsKLQluZXctPmZsYWdzID0gZmxhZ3M7Ci0KLQkvKgotCSAqIGtlZXAgYXNjZW5kaW5nIG9yZGVyIG9mIGlvdm1hcwotCSAqLwotCWlmICh0bXApCi0JCWxpc3RfYWRkX3RhaWwoJm5ldy0+bGlzdCwgJnRtcC0+bGlzdCk7Ci0JZWxzZQotCQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmb2JqLT5tbWFwKTsKLQotCWRldl9kYmcob2JqLT5kZXYsICIlczogZm91bmQgJTA4eC0lMDh4LSUwOHgoJXgpICUwOHhcbiIsCi0JCV9fZnVuY19fLCBuZXctPmRhX3N0YXJ0LCBzdGFydCwgbmV3LT5kYV9lbmQsIGJ5dGVzLCBmbGFncyk7Ci0KLQlyZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2lvdm1fYXJlYShzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGlvdm1fc3RydWN0ICphcmVhKQotewotCXNpemVfdCBieXRlczsKLQotCUJVR19PTighb2JqIHx8ICFhcmVhKTsKLQotCWJ5dGVzID0gYXJlYS0+ZGFfZW5kIC0gYXJlYS0+ZGFfc3RhcnQ7Ci0KLQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICUwOHgtJTA4eCgleCkgJTA4eFxuIiwKLQkJX19mdW5jX18sIGFyZWEtPmRhX3N0YXJ0LCBhcmVhLT5kYV9lbmQsIGJ5dGVzLCBhcmVhLT5mbGFncyk7Ci0KLQlsaXN0X2RlbCgmYXJlYS0+bGlzdCk7Ci0Ja21lbV9jYWNoZV9mcmVlKGlvdm1fYXJlYV9jYWNoZXAsIGFyZWEpOwotfQotCi0vKioKLSAqIGRhX3RvX3ZhIC0gY29udmVydCAoZCkgdG8gKHYpCi0gKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKLSAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKLSAqIEB2YToJCW1wdSB2aXJ0dWFsIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zIG1wdSB2aXJ0dWFsIGFkZHIgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBkZXZpY2UgdmlydHVhbCBhZGRyCi0gKi8KLXZvaWQgKmRhX3RvX3ZhKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpCi17Ci0Jdm9pZCAqdmEgPSBOVUxMOwotCXN0cnVjdCBpb3ZtX3N0cnVjdCAqYXJlYTsKLQotCW11dGV4X2xvY2soJm9iai0+bW1hcF9sb2NrKTsKLQotCWFyZWEgPSBfX2ZpbmRfaW92bV9hcmVhKG9iaiwgZGEpOwotCWlmICghYXJlYSkgewotCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IG5vIGRhIGFyZWEoJTA4eClcbiIsIF9fZnVuY19fLCBkYSk7Ci0JCWdvdG8gb3V0OwotCX0KLQl2YSA9IGFyZWEtPnZhOwotb3V0OgotCW11dGV4X3VubG9jaygmb2JqLT5tbWFwX2xvY2spOwotCi0JcmV0dXJuIHZhOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZGFfdG9fdmEpOwotCi1zdGF0aWMgdm9pZCBzZ3RhYmxlX2ZpbGxfdm1hbGxvYyhzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdm9pZCAqX3ZhKQotewotCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0Jdm9pZCAqdmEgPSBfdmE7Ci0Jdm9pZCAqdmFfZW5kOwotCi0JZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7Ci0JCXN0cnVjdCBwYWdlICpwZzsKLQkJY29uc3Qgc2l6ZV90IGJ5dGVzID0gUEFHRV9TSVpFOwotCi0JCS8qCi0JCSAqIGlvbW11ICdzdXBlcnBhZ2UnIGlzbid0IHN1cHBvcnRlZCB3aXRoICdpb21tdV92bWFsbG9jKCknCi0JCSAqLwotCQlwZyA9IHZtYWxsb2NfdG9fcGFnZSh2YSk7Ci0JCUJVR19PTighcGcpOwotCQlzZ19zZXRfcGFnZShzZywgcGcsIGJ5dGVzLCAwKTsKLQotCQl2YSArPSBieXRlczsKLQl9Ci0KLQl2YV9lbmQgPSBfdmEgKyBQQUdFX1NJWkUgKiBpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2d0YWJsZV9kcmFpbl92bWFsbG9jKHN0cnVjdCBzZ190YWJsZSAqc2d0KQotewotCS8qCi0JICogQWN0dWFsbHkgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGF0IGFsbCwganVzdCBleGlzdHMgZm9yCi0JICogY29uc2lzdGVuY3kgb2YgdGhlIGNvZGUgcmVhZGFiaWxpdHkuCi0JICovCi0JQlVHX09OKCFzZ3QpOwotfQotCi1zdGF0aWMgdm9pZCBzZ3RhYmxlX2ZpbGxfa21hbGxvYyhzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdTMyIHBhLCB1MzIgZGEsCi0JCQkJCQkJCXNpemVfdCBsZW4pCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQotCWZvcl9lYWNoX3NnKHNndC0+c2dsLCBzZywgc2d0LT5uZW50cywgaSkgewotCQl1bnNpZ25lZCBieXRlczsKLQotCQlieXRlcyA9IG1heF9hbGlnbm1lbnQoZGEgfCBwYSk7Ci0JCWJ5dGVzID0gbWluX3QodW5zaWduZWQsIGJ5dGVzLCBpb3Bnc3pfbWF4KGxlbikpOwotCi0JCUJVR19PTighaW9wZ3N6X29rKGJ5dGVzKSk7Ci0KLQkJc2dfc2V0X2J1ZihzZywgcGh5c190b192aXJ0KHBhKSwgYnl0ZXMpOwotCQkvKgotCQkgKiAncGEnIGlzIGNvdGludW91cyhsaW5lYXIpLgotCQkgKi8KLQkJcGEgKz0gYnl0ZXM7Ci0JCWRhICs9IGJ5dGVzOwotCQlsZW4gLT0gYnl0ZXM7Ci0JfQotCUJVR19PTihsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2d0YWJsZV9kcmFpbl9rbWFsbG9jKHN0cnVjdCBzZ190YWJsZSAqc2d0KQotewotCS8qCi0JICogQWN0dWFsbHkgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGF0IGFsbCwganVzdCBleGlzdHMgZm9yCi0JICogY29uc2lzdGVuY3kgb2YgdGhlIGNvZGUgcmVhZGFiaWxpdHkKLQkgKi8KLQlCVUdfT04oIXNndCk7Ci19Ci0KLS8qIGNyZWF0ZSAnZGEnIDwtPiAncGEnIG1hcHBpbmcgZnJvbSAnc2d0JyAqLwotc3RhdGljIGludCBtYXBfaW92bV9hcmVhKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW92bV9zdHJ1Y3QgKm5ldywKLQkJCSBjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdTMyIGZsYWdzKQotewotCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IGksIGo7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQl1MzIgZGEgPSBuZXctPmRhX3N0YXJ0OwotCi0JaWYgKCFvYmogfHwgIXNndCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlCVUdfT04oIXNndGFibGVfb2soc2d0KSk7Ci0KLQlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgc2csIHNndC0+bmVudHMsIGkpIHsKLQkJdTMyIHBhOwotCQlpbnQgcGdzejsKLQkJc2l6ZV90IGJ5dGVzOwotCQlzdHJ1Y3QgaW90bGJfZW50cnkgZTsKLQotCQlwYSA9IHNnX3BoeXMoc2cpOwotCQlieXRlcyA9IHNnLT5sZW5ndGg7Ci0KLQkJZmxhZ3MgJj0gfklPVk1GX1BHU1pfTUFTSzsKLQkJcGdzeiA9IGJ5dGVzX3RvX2lvcGdzeihieXRlcyk7Ci0JCWlmIChwZ3N6IDwgMCkKLQkJCWdvdG8gZXJyX291dDsKLQkJZmxhZ3MgfD0gcGdzejsKLQotCQlwcl9kZWJ1ZygiJXM6IFslZF0gJTA4eCAlMDh4KCV4KVxuIiwgX19mdW5jX18sCi0JCQkgaSwgZGEsIHBhLCBieXRlcyk7Ci0KLQkJaW90bGJfaW5pdF9lbnRyeSgmZSwgZGEsIHBhLCBmbGFncyk7Ci0JCWVyciA9IGlvcGd0YWJsZV9zdG9yZV9lbnRyeShvYmosICZlKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dDsKLQotCQlkYSArPSBieXRlczsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWVycl9vdXQ6Ci0JZGEgPSBuZXctPmRhX3N0YXJ0OwotCi0JZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBpLCBqKSB7Ci0JCXNpemVfdCBieXRlczsKLQotCQlieXRlcyA9IGlvcGd0YWJsZV9jbGVhcl9lbnRyeShvYmosIGRhKTsKLQotCQlCVUdfT04oIWlvcGdzel9vayhieXRlcykpOwotCi0JCWRhICs9IGJ5dGVzOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi0vKiByZWxlYXNlICdkYScgPC0+ICdwYScgbWFwcGluZyAqLwotc3RhdGljIHZvaWQgdW5tYXBfaW92bV9hcmVhKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFyZWEpCi17Ci0JdTMyIHN0YXJ0OwotCXNpemVfdCB0b3RhbCA9IGFyZWEtPmRhX2VuZCAtIGFyZWEtPmRhX3N0YXJ0OwotCi0JQlVHX09OKCghdG90YWwpIHx8ICFJU19BTElHTkVEKHRvdGFsLCBQQUdFX1NJWkUpKTsKLQotCXN0YXJ0ID0gYXJlYS0+ZGFfc3RhcnQ7Ci0Jd2hpbGUgKHRvdGFsID4gMCkgewotCQlzaXplX3QgYnl0ZXM7Ci0KLQkJYnl0ZXMgPSBpb3BndGFibGVfY2xlYXJfZW50cnkob2JqLCBzdGFydCk7Ci0JCWlmIChieXRlcyA9PSAwKQotCQkJYnl0ZXMgPSBQQUdFX1NJWkU7Ci0JCWVsc2UKLQkJCWRldl9kYmcob2JqLT5kZXYsICIlczogdW5tYXAgJTA4eCgleCkgJTA4eFxuIiwKLQkJCQlfX2Z1bmNfXywgc3RhcnQsIGJ5dGVzLCBhcmVhLT5mbGFncyk7Ci0KLQkJQlVHX09OKCFJU19BTElHTkVEKGJ5dGVzLCBQQUdFX1NJWkUpKTsKLQotCQl0b3RhbCAtPSBieXRlczsKLQkJc3RhcnQgKz0gYnl0ZXM7Ci0JfQotCUJVR19PTih0b3RhbCk7Ci19Ci0KLS8qIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciBhbGwgdW5tYXBwaW5nICovCi1zdGF0aWMgc3RydWN0IHNnX3RhYmxlICp1bm1hcF92bV9hcmVhKHN0cnVjdCBpb21tdSAqb2JqLCBjb25zdCB1MzIgZGEsCi0JCQkJICAgICAgdm9pZCAoKmZuKShjb25zdCB2b2lkICopLCB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IHNnX3RhYmxlICpzZ3QgPSBOVUxMOwotCXN0cnVjdCBpb3ZtX3N0cnVjdCAqYXJlYTsKLQotCWlmICghSVNfQUxJR05FRChkYSwgUEFHRV9TSVpFKSkgewotCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6IGFsaWdubWVudCBlcnIoJTA4eClcbiIsIF9fZnVuY19fLCBkYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCW11dGV4X2xvY2soJm9iai0+bW1hcF9sb2NrKTsKLQotCWFyZWEgPSBfX2ZpbmRfaW92bV9hcmVhKG9iaiwgZGEpOwotCWlmICghYXJlYSkgewotCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IG5vIGRhIGFyZWEoJTA4eClcbiIsIF9fZnVuY19fLCBkYSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICgoYXJlYS0+ZmxhZ3MgJiBmbGFncykgIT0gZmxhZ3MpIHsKLQkJZGV2X2VycihvYmotPmRldiwgIiVzOiB3cm9uZyBmbGFncyglMDh4KVxuIiwgX19mdW5jX18sCi0JCQlhcmVhLT5mbGFncyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlzZ3QgPSAoc3RydWN0IHNnX3RhYmxlICopYXJlYS0+c2d0OwotCi0JdW5tYXBfaW92bV9hcmVhKG9iaiwgYXJlYSk7Ci0KLQlmbihhcmVhLT52YSk7Ci0KLQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICUwOHgtJTA4eC0lMDh4KCV4KSAlMDh4XG4iLCBfX2Z1bmNfXywKLQkJYXJlYS0+ZGFfc3RhcnQsIGRhLCBhcmVhLT5kYV9lbmQsCi0JCWFyZWEtPmRhX2VuZCAtIGFyZWEtPmRhX3N0YXJ0LCBhcmVhLT5mbGFncyk7Ci0KLQlmcmVlX2lvdm1fYXJlYShvYmosIGFyZWEpOwotb3V0OgotCW11dGV4X3VubG9jaygmb2JqLT5tbWFwX2xvY2spOwotCi0JcmV0dXJuIHNndDsKLX0KLQotc3RhdGljIHUzMiBtYXBfaW9tbXVfcmVnaW9uKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsCi0JICAgICAgY29uc3Qgc3RydWN0IHNnX3RhYmxlICpzZ3QsIHZvaWQgKnZhLCBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncykKLXsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKm5ldzsKLQotCW11dGV4X2xvY2soJm9iai0+bW1hcF9sb2NrKTsKLQotCW5ldyA9IGFsbG9jX2lvdm1fYXJlYShvYmosIGRhLCBieXRlcywgZmxhZ3MpOwotCWlmIChJU19FUlIobmV3KSkgewotCQllcnIgPSBQVFJfRVJSKG5ldyk7Ci0JCWdvdG8gZXJyX2FsbG9jX2lvdm1hOwotCX0KLQluZXctPnZhID0gdmE7Ci0JbmV3LT5zZ3QgPSBzZ3Q7Ci0KLQlpZiAobWFwX2lvdm1fYXJlYShvYmosIG5ldywgc2d0LCBuZXctPmZsYWdzKSkKLQkJZ290byBlcnJfbWFwOwotCi0JbXV0ZXhfdW5sb2NrKCZvYmotPm1tYXBfbG9jayk7Ci0KLQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IGRhOiUwOHgoJXgpIGZsYWdzOiUwOHggdmE6JXBcbiIsCi0JCV9fZnVuY19fLCBuZXctPmRhX3N0YXJ0LCBieXRlcywgbmV3LT5mbGFncywgdmEpOwotCi0JcmV0dXJuIG5ldy0+ZGFfc3RhcnQ7Ci0KLWVycl9tYXA6Ci0JZnJlZV9pb3ZtX2FyZWEob2JqLCBuZXcpOwotZXJyX2FsbG9jX2lvdm1hOgotCW11dGV4X3VubG9jaygmb2JqLT5tbWFwX2xvY2spOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIF9faW9tbXVfdm1hcChzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLAotCQkgY29uc3Qgc3RydWN0IHNnX3RhYmxlICpzZ3QsIHZvaWQgKnZhLCBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gbWFwX2lvbW11X3JlZ2lvbihvYmosIGRhLCBzZ3QsIHZhLCBieXRlcywgZmxhZ3MpOwotfQotCi0vKioKLSAqIGlvbW11X3ZtYXAgIC0gIChkKS0ocCktKHYpIGFkZHJlc3MgbWFwcGVyCi0gKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKLSAqIEBzZ3Q6CWFkZHJlc3Mgb2Ygc2NhdHRlciBnYXRoZXIgdGFibGUKLSAqIEBmbGFnczoJaW92bWEgYW5kIHBhZ2UgcHJvcGVydHkKLSAqCi0gKiBDcmVhdGVzIDEtbi0xIG1hcHBpbmcgd2l0aCBnaXZlbiBAc2d0IGFuZCByZXR1cm5zIEBkYS4KLSAqIEFsbCBAc2d0IGVsZW1lbnQgbXVzdCBiZSBpbyBwYWdlIHNpemUgYWxpZ25lZC4KLSAqLwotdTMyIGlvbW11X3ZtYXAoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgY29uc3Qgc3RydWN0IHNnX3RhYmxlICpzZ3QsCi0JCSB1MzIgZmxhZ3MpCi17Ci0Jc2l6ZV90IGJ5dGVzOwotCXZvaWQgKnZhID0gTlVMTDsKLQotCWlmICghb2JqIHx8ICFvYmotPmRldiB8fCAhc2d0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJ5dGVzID0gc2d0YWJsZV9sZW4oc2d0KTsKLQlpZiAoIWJ5dGVzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlieXRlcyA9IFBBR0VfQUxJR04oYnl0ZXMpOwotCi0JaWYgKGZsYWdzICYgSU9WTUZfTU1JTykgewotCQl2YSA9IHZtYXBfc2coc2d0KTsKLQkJaWYgKElTX0VSUih2YSkpCi0JCQlyZXR1cm4gUFRSX0VSUih2YSk7Ci0JfQotCi0JZmxhZ3MgfD0gSU9WTUZfRElTQ09OVDsKLQlmbGFncyB8PSBJT1ZNRl9NTUlPOwotCi0JZGEgPSBfX2lvbW11X3ZtYXAob2JqLCBkYSwgc2d0LCB2YSwgYnl0ZXMsIGZsYWdzKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKGRhKSkKLQkJdnVubWFwX3NnKHZhKTsKLQotCXJldHVybiBkYTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X3ZtYXApOwotCi0vKioKLSAqIGlvbW11X3Z1bm1hcCAgLSAgcmVsZWFzZSB2aXJ0dWFsIG1hcHBpbmcgb2J0YWluZWQgYnkgJ2lvbW11X3ZtYXAoKScKLSAqIEBvYmo6CW9iamVjdGl2ZSBpb21tdQotICogQGRhOgkJaW9tbXUgZGV2aWNlIHZpcnR1YWwgYWRkcmVzcwotICoKLSAqIEZyZWUgdGhlIGlvbW11IHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIHN0YXJ0aW5nIGF0Ci0gKiBAZGEsIHdoaWNoIHdhcyByZXR1cm5lZCBieSAnaW9tbXVfdm1hcCgpJy4KLSAqLwotc3RydWN0IHNnX3RhYmxlICppb21tdV92dW5tYXAoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSkKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKLQkvKgotCSAqICdzZ3QnIGlzIGFsbG9jYXRlZCBiZWZvcmUgJ2lvbW11X3ZtYWxsb2MoKScgaXMgY2FsbGVkLgotCSAqIEp1c3QgcmV0dXJucyAnc2d0JyB0byB0aGUgY2FsbGVyIHRvIGZyZWUKLQkgKi8KLQlzZ3QgPSB1bm1hcF92bV9hcmVhKG9iaiwgZGEsIHZ1bm1hcF9zZywgSU9WTUZfRElTQ09OVCB8IElPVk1GX01NSU8pOwotCWlmICghc2d0KQotCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IE5vIHNndFxuIiwgX19mdW5jX18pOwotCXJldHVybiBzZ3Q7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV92dW5tYXApOwotCi0vKioKLSAqIGlvbW11X3ZtYWxsb2MgIC0gIChkKS0ocCktKHYpIGFkZHJlc3MgYWxsb2NhdG9yIGFuZCBtYXBwZXIKLSAqIEBvYmo6CW9iamVjdGl2ZSBpb21tdQotICogQGRhOgkJY29udGlndW91cyBpb21tdSB2aXJ0dWFsIG1lbW9yeQotICogQGJ5dGVzOglhbGxvY2F0aW9uIHNpemUKLSAqIEBmbGFnczoJaW92bWEgYW5kIHBhZ2UgcHJvcGVydHkKLSAqCi0gKiBBbGxvY2F0ZSBAYnl0ZXMgbGluZWFybHkgYW5kIGNyZWF0ZXMgMS1uLTEgbWFwcGluZyBhbmQgcmV0dXJucwotICogQGRhIGFnYWluLCB3aGljaCBtaWdodCBiZSBhZGp1c3RlZCBpZiAnSU9WTUZfREFfRklYRUQnIGlzIG5vdCBzZXQuCi0gKi8KLXUzMiBpb21tdV92bWFsbG9jKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHNpemVfdCBieXRlcywgdTMyIGZsYWdzKQotewotCXZvaWQgKnZhOwotCXN0cnVjdCBzZ190YWJsZSAqc2d0OwotCi0JaWYgKCFvYmogfHwgIW9iai0+ZGV2IHx8ICFieXRlcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlieXRlcyA9IFBBR0VfQUxJR04oYnl0ZXMpOwotCi0JdmEgPSB2bWFsbG9jKGJ5dGVzKTsKLQlpZiAoIXZhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZsYWdzIHw9IElPVk1GX0RJU0NPTlQ7Ci0JZmxhZ3MgfD0gSU9WTUZfQUxMT0M7Ci0KLQlzZ3QgPSBzZ3RhYmxlX2FsbG9jKGJ5dGVzLCBmbGFncywgZGEsIDApOwotCWlmIChJU19FUlIoc2d0KSkgewotCQlkYSA9IFBUUl9FUlIoc2d0KTsKLQkJZ290byBlcnJfc2d0X2FsbG9jOwotCX0KLQlzZ3RhYmxlX2ZpbGxfdm1hbGxvYyhzZ3QsIHZhKTsKLQotCWRhID0gX19pb21tdV92bWFwKG9iaiwgZGEsIHNndCwgdmEsIGJ5dGVzLCBmbGFncyk7Ci0JaWYgKElTX0VSUl9WQUxVRShkYSkpCi0JCWdvdG8gZXJyX2lvbW11X3ZtYXA7Ci0KLQlyZXR1cm4gZGE7Ci0KLWVycl9pb21tdV92bWFwOgotCXNndGFibGVfZHJhaW5fdm1hbGxvYyhzZ3QpOwotCXNndGFibGVfZnJlZShzZ3QpOwotZXJyX3NndF9hbGxvYzoKLQl2ZnJlZSh2YSk7Ci0JcmV0dXJuIGRhOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfdm1hbGxvYyk7Ci0KLS8qKgotICogaW9tbXVfdmZyZWUgIC0gIHJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCBieSAnaW9tbXVfdm1hbGxvYygpJwotICogQG9iajoJb2JqZWN0aXZlIGlvbW11Ci0gKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCi0gKgotICogRnJlZXMgdGhlIGlvbW11IHZpcnR1YWxseSBjb250aW51b3VzIG1lbW9yeSBhcmVhIHN0YXJ0aW5nIGF0Ci0gKiBAZGEsIGFzIG9idGFpbmVkIGZyb20gJ2lvbW11X3ZtYWxsb2MoKScuCi0gKi8KLXZvaWQgaW9tbXVfdmZyZWUoc3RydWN0IGlvbW11ICpvYmosIGNvbnN0IHUzMiBkYSkKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKLQotCXNndCA9IHVubWFwX3ZtX2FyZWEob2JqLCBkYSwgdmZyZWUsIElPVk1GX0RJU0NPTlQgfCBJT1ZNRl9BTExPQyk7Ci0JaWYgKCFzZ3QpCi0JCWRldl9kYmcob2JqLT5kZXYsICIlczogTm8gc2d0XG4iLCBfX2Z1bmNfXyk7Ci0Jc2d0YWJsZV9mcmVlKHNndCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV92ZnJlZSk7Ci0KLXN0YXRpYyB1MzIgX19pb21tdV9rbWFwKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHUzMiBwYSwgdm9pZCAqdmEsCi0JCQkgIHNpemVfdCBieXRlcywgdTMyIGZsYWdzKQotewotCXN0cnVjdCBzZ190YWJsZSAqc2d0OwotCi0Jc2d0ID0gc2d0YWJsZV9hbGxvYyhieXRlcywgZmxhZ3MsIGRhLCBwYSk7Ci0JaWYgKElTX0VSUihzZ3QpKQotCQlyZXR1cm4gUFRSX0VSUihzZ3QpOwotCi0Jc2d0YWJsZV9maWxsX2ttYWxsb2Moc2d0LCBwYSwgZGEsIGJ5dGVzKTsKLQotCWRhID0gbWFwX2lvbW11X3JlZ2lvbihvYmosIGRhLCBzZ3QsIHZhLCBieXRlcywgZmxhZ3MpOwotCWlmIChJU19FUlJfVkFMVUUoZGEpKSB7Ci0JCXNndGFibGVfZHJhaW5fa21hbGxvYyhzZ3QpOwotCQlzZ3RhYmxlX2ZyZWUoc2d0KTsKLQl9Ci0KLQlyZXR1cm4gZGE7Ci19Ci0KLS8qKgotICogaW9tbXVfa21hcCAgLSAgKGQpLShwKS0odikgYWRkcmVzcyBtYXBwZXIKLSAqIEBvYmo6CW9iamVjdGl2ZSBpb21tdQotICogQGRhOgkJY29udGlndW91cyBpb21tdSB2aXJ0dWFsIG1lbW9yeQotICogQHBhOgkJY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKLSAqIEBmbGFnczoJaW92bWEgYW5kIHBhZ2UgcHJvcGVydHkKLSAqCi0gKiBDcmVhdGVzIDEtMS0xIG1hcHBpbmcgYW5kIHJldHVybnMgQGRhIGFnYWluLCB3aGljaCBjYW4gYmUKLSAqIGFkanVzdGVkIGlmICdJT1ZNRl9EQV9GSVhFRCcgaXMgbm90IHNldC4KLSAqLwotdTMyIGlvbW11X2ttYXAoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCBzaXplX3QgYnl0ZXMsCi0JCSB1MzIgZmxhZ3MpCi17Ci0Jdm9pZCAqdmE7Ci0KLQlpZiAoIW9iaiB8fCAhb2JqLT5kZXYgfHwgIWJ5dGVzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJ5dGVzID0gUEFHRV9BTElHTihieXRlcyk7Ci0KLQl2YSA9IGlvcmVtYXAocGEsIGJ5dGVzKTsKLQlpZiAoIXZhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZsYWdzIHw9IElPVk1GX0xJTkVBUjsKLQlmbGFncyB8PSBJT1ZNRl9NTUlPOwotCi0JZGEgPSBfX2lvbW11X2ttYXAob2JqLCBkYSwgcGEsIHZhLCBieXRlcywgZmxhZ3MpOwotCWlmIChJU19FUlJfVkFMVUUoZGEpKQotCQlpb3VubWFwKHZhKTsKLQotCXJldHVybiBkYTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2ttYXApOwotCi0vKioKLSAqIGlvbW11X2t1bm1hcCAgLSAgcmVsZWFzZSB2aXJ0dWFsIG1hcHBpbmcgb2J0YWluZWQgYnkgJ2lvbW11X2ttYXAoKScKLSAqIEBvYmo6CW9iamVjdGl2ZSBpb21tdQotICogQGRhOgkJaW9tbXUgZGV2aWNlIHZpcnR1YWwgYWRkcmVzcwotICoKLSAqIEZyZWVzIHRoZSBpb21tdSB2aXJ0dWFsbHkgY29udGlndW91cyBtZW1vcnkgYXJlYSBzdGFydGluZyBhdAotICogQGRhLCB3aGljaCB3YXMgcGFzc2VkIHRvIGFuZCB3YXMgcmV0dXJuZWQgYnknaW9tbXVfa21hcCgpJy4KLSAqLwotdm9pZCBpb21tdV9rdW5tYXAoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSkKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKLQl0eXBlZGVmIHZvaWQgKCpmdW5jX3QpKGNvbnN0IHZvaWQgKik7Ci0KLQlzZ3QgPSB1bm1hcF92bV9hcmVhKG9iaiwgZGEsIChmdW5jX3QpaW91bm1hcCwKLQkJCSAgICBJT1ZNRl9MSU5FQVIgfCBJT1ZNRl9NTUlPKTsKLQlpZiAoIXNndCkKLQkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBObyBzZ3RcbiIsIF9fZnVuY19fKTsKLQlzZ3RhYmxlX2ZyZWUoc2d0KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2t1bm1hcCk7Ci0KLS8qKgotICogaW9tbXVfa21hbGxvYyAgLSAgKGQpLShwKS0odikgYWRkcmVzcyBhbGxvY2F0b3IgYW5kIG1hcHBlcgotICogQG9iajoJb2JqZWN0aXZlIGlvbW11Ci0gKiBAZGE6CQljb250aWd1b3VzIGlvbW11IHZpcnR1YWwgbWVtb3J5Ci0gKiBAYnl0ZXM6CWJ5dGVzIGZvciBhbGxvY2F0aW9uCi0gKiBAZmxhZ3M6CWlvdm1hIGFuZCBwYWdlIHByb3BlcnR5Ci0gKgotICogQWxsb2NhdGUgQGJ5dGVzIGxpbmVhcmx5IGFuZCBjcmVhdGVzIDEtMS0xIG1hcHBpbmcgYW5kIHJldHVybnMKLSAqIEBkYSBhZ2Fpbiwgd2hpY2ggbWlnaHQgYmUgYWRqdXN0ZWQgaWYgJ0lPVk1GX0RBX0ZJWEVEJyBpcyBub3Qgc2V0LgotICovCi11MzIgaW9tbXVfa21hbGxvYyhzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncykKLXsKLQl2b2lkICp2YTsKLQl1MzIgcGE7Ci0KLQlpZiAoIW9iaiB8fCAhb2JqLT5kZXYgfHwgIWJ5dGVzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJ5dGVzID0gUEFHRV9BTElHTihieXRlcyk7Ci0KLQl2YSA9IGttYWxsb2MoYnl0ZXMsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQlpZiAoIXZhKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwYSA9IHZpcnRfdG9fcGh5cyh2YSk7Ci0KLQlmbGFncyB8PSBJT1ZNRl9MSU5FQVI7Ci0JZmxhZ3MgfD0gSU9WTUZfQUxMT0M7Ci0KLQlkYSA9IF9faW9tbXVfa21hcChvYmosIGRhLCBwYSwgdmEsIGJ5dGVzLCBmbGFncyk7Ci0JaWYgKElTX0VSUl9WQUxVRShkYSkpCi0JCWtmcmVlKHZhKTsKLQotCXJldHVybiBkYTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2ttYWxsb2MpOwotCi0vKioKLSAqIGlvbW11X2tmcmVlICAtICByZWxlYXNlIHZpcnR1YWwgbWFwcGluZyBvYnRhaW5lZCBieSAnaW9tbXVfa21hbGxvYygpJwotICogQG9iajoJb2JqZWN0aXZlIGlvbW11Ci0gKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCi0gKgotICogRnJlZXMgdGhlIGlvbW11IHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIHN0YXJ0aW5nIGF0Ci0gKiBAZGEsIHdoaWNoIHdhcyBwYXNzZWQgdG8gYW5kIHdhcyByZXR1cm5lZCBieSdpb21tdV9rbWFsbG9jKCknLgotICovCi12b2lkIGlvbW11X2tmcmVlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpCi17Ci0Jc3RydWN0IHNnX3RhYmxlICpzZ3Q7Ci0KLQlzZ3QgPSB1bm1hcF92bV9hcmVhKG9iaiwgZGEsIGtmcmVlLCBJT1ZNRl9MSU5FQVIgfCBJT1ZNRl9BTExPQyk7Ci0JaWYgKCFzZ3QpCi0JCWRldl9kYmcob2JqLT5kZXYsICIlczogTm8gc2d0XG4iLCBfX2Z1bmNfXyk7Ci0Jc2d0YWJsZV9mcmVlKHNndCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV9rZnJlZSk7Ci0KLQotc3RhdGljIGludCBfX2luaXQgaW92bW1faW5pdCh2b2lkKQotewotCWNvbnN0IHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTTEFCX0hXQ0FDSEVfQUxJR047Ci0Jc3RydWN0IGttZW1fY2FjaGUgKnA7Ci0KLQlwID0ga21lbV9jYWNoZV9jcmVhdGUoImlvdm1fYXJlYV9jYWNoZSIsIHNpemVvZihzdHJ1Y3QgaW92bV9zdHJ1Y3QpLCAwLAotCQkJICAgICAgZmxhZ3MsIE5VTEwpOwotCWlmICghcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaW92bV9hcmVhX2NhY2hlcCA9IHA7Ci0KLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KGlvdm1tX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaW92bW1fZXhpdCh2b2lkKQotewotCWttZW1fY2FjaGVfZGVzdHJveShpb3ZtX2FyZWFfY2FjaGVwKTsKLX0KLW1vZHVsZV9leGl0KGlvdm1tX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIm9tYXAgaW9tbXU6IHNpbXBsZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgbWFuYWdlbWVudCIpOwotTU9EVUxFX0FVVEhPUigiSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL21haWxib3guYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tYWlsYm94LmMKaW5kZXggNjlkZGM5Zi4uYWQ4MDExMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL21haWxib3guYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvbWFpbGJveC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8cGxhdC9tYWlsYm94Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKaW5kZXggNmM2MmFmMS4uNGIxNWNkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMKQEAgLTI0LDQ1ICsyNCw0MCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPHBsYXQvbWNic3AuaD4KLSNpbmNsdWRlIDxwbGF0L29tYXBfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCi0vKiBYWFggVGhlc2UgInNpZGV3YXlzIiBpbmNsdWRlcyBhcmUgYSBzaWduIHRoYXQgc29tZXRoaW5nIGlzIHdyb25nICovCi0jaW5jbHVkZSAiLi4vbWFjaC1vbWFwMi9jbTJ4eHhfM3h4eC5oIgotI2luY2x1ZGUgIi4uL21hY2gtb21hcDIvY20tcmVnYml0cy0zNHh4LmgiCi0KIHN0cnVjdCBvbWFwX21jYnNwICoqbWNic3BfcHRyOwotaW50IG9tYXBfbWNic3BfY291bnQsIG9tYXBfbWNic3BfY2FjaGVfc2l6ZTsKK2ludCBvbWFwX21jYnNwX2NvdW50OworCisjZGVmaW5lIG9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpCShpZCA8IG9tYXBfbWNic3BfY291bnQpCisjZGVmaW5lIGlkX3RvX21jYnNwX3B0cihpZCkJCW1jYnNwX3B0cltpZF07CiAKIHN0YXRpYyB2b2lkIG9tYXBfbWNic3Bfd3JpdGUoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwLCB1MTYgcmVnLCB1MzIgdmFsKQogewotCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewotCQkoKHUxNiAqKW1jYnNwLT5yZWdfY2FjaGUpW3JlZyAvIHNpemVvZih1MTYpXSA9ICh1MTYpdmFsOwotCQlfX3Jhd193cml0ZXcoKHUxNil2YWwsIG1jYnNwLT5pb19iYXNlICsgcmVnKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMjQyMCgpKSB7Ci0JCSgodTE2ICopbWNic3AtPnJlZ19jYWNoZSlbcmVnIC8gc2l6ZW9mKHUzMildID0gKHUxNil2YWw7Ci0JCV9fcmF3X3dyaXRldygodTE2KXZhbCwgbWNic3AtPmlvX2Jhc2UgKyByZWcpOworCXZvaWQgX19pb21lbSAqYWRkciA9IG1jYnNwLT5pb19iYXNlICsgcmVnICogbWNic3AtPnBkYXRhLT5yZWdfc3RlcDsKKworCWlmIChtY2JzcC0+cGRhdGEtPnJlZ19zaXplID09IDIpIHsKKwkJKCh1MTYgKiltY2JzcC0+cmVnX2NhY2hlKVtyZWddID0gKHUxNil2YWw7CisJCV9fcmF3X3dyaXRldygodTE2KXZhbCwgYWRkcik7CiAJfSBlbHNlIHsKLQkJKCh1MzIgKiltY2JzcC0+cmVnX2NhY2hlKVtyZWcgLyBzaXplb2YodTMyKV0gPSB2YWw7Ci0JCV9fcmF3X3dyaXRlbCh2YWwsIG1jYnNwLT5pb19iYXNlICsgcmVnKTsKKwkJKCh1MzIgKiltY2JzcC0+cmVnX2NhY2hlKVtyZWddID0gdmFsOworCQlfX3Jhd193cml0ZWwodmFsLCBhZGRyKTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9tY2JzcF9yZWFkKHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCwgdTE2IHJlZywgYm9vbCBmcm9tX2NhY2hlKQogewotCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewotCQlyZXR1cm4gIWZyb21fY2FjaGUgPyBfX3Jhd19yZWFkdyhtY2JzcC0+aW9fYmFzZSArIHJlZykgOgotCQkJCSgodTE2ICopbWNic3AtPnJlZ19jYWNoZSlbcmVnIC8gc2l6ZW9mKHUxNildOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAyNDIwKCkpIHsKLQkJcmV0dXJuICFmcm9tX2NhY2hlID8gX19yYXdfcmVhZHcobWNic3AtPmlvX2Jhc2UgKyByZWcpIDoKLQkJCQkoKHUxNiAqKW1jYnNwLT5yZWdfY2FjaGUpW3JlZyAvIHNpemVvZih1MzIpXTsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBtY2JzcC0+aW9fYmFzZSArIHJlZyAqIG1jYnNwLT5wZGF0YS0+cmVnX3N0ZXA7CisKKwlpZiAobWNic3AtPnBkYXRhLT5yZWdfc2l6ZSA9PSAyKSB7CisJCXJldHVybiAhZnJvbV9jYWNoZSA/IF9fcmF3X3JlYWR3KGFkZHIpIDoKKwkJCQkgICAgICgodTE2ICopbWNic3AtPnJlZ19jYWNoZSlbcmVnXTsKIAl9IGVsc2UgewotCQlyZXR1cm4gIWZyb21fY2FjaGUgPyBfX3Jhd19yZWFkbChtY2JzcC0+aW9fYmFzZSArIHJlZykgOgotCQkJCSgodTMyICopbWNic3AtPnJlZ19jYWNoZSlbcmVnIC8gc2l6ZW9mKHUzMildOworCQlyZXR1cm4gIWZyb21fY2FjaGUgPyBfX3Jhd19yZWFkbChhZGRyKSA6CisJCQkJICAgICAoKHUzMiAqKW1jYnNwLT5yZWdfY2FjaGUpW3JlZ107CiAJfQogfQogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKIHN0YXRpYyB2b2lkIG9tYXBfbWNic3Bfc3Rfd3JpdGUoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwLCB1MTYgcmVnLCB1MzIgdmFsKQogewogCV9fcmF3X3dyaXRlbCh2YWwsIG1jYnNwLT5zdF9kYXRhLT5pb19iYXNlX3N0ICsgcmVnKTsKQEAgLTcyLDcgKzY3LDYgQEAKIHsKIAlyZXR1cm4gX19yYXdfcmVhZGwobWNic3AtPnN0X2RhdGEtPmlvX2Jhc2Vfc3QgKyByZWcpOwogfQotI2VuZGlmCiAKICNkZWZpbmUgTUNCU1BfUkVBRChtY2JzcCwgcmVnKSBcCiAJCW9tYXBfbWNic3BfcmVhZChtY2JzcCwgT01BUF9NQ0JTUF9SRUdfIyNyZWcsIDApCkBAIC0xODcsNyArMTgxLDcgQEAKIAlNQ0JTUF9XUklURShtY2JzcCwgTUNSMiwgY29uZmlnLT5tY3IyKTsKIAlNQ0JTUF9XUklURShtY2JzcCwgTUNSMSwgY29uZmlnLT5tY3IxKTsKIAlNQ0JTUF9XUklURShtY2JzcCwgUENSMCwgY29uZmlnLT5wY3IwKTsKLQlpZiAoY3B1X2lzX29tYXAyNDMwKCkgfHwgY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXA0NHh4KCkpIHsKKwlpZiAobWNic3AtPnBkYXRhLT5oYXNfY2NyKSB7CiAJCU1DQlNQX1dSSVRFKG1jYnNwLCBYQ0NSLCBjb25maWctPnhjY3IpOwogCQlNQ0JTUF9XUklURShtY2JzcCwgUkNDUiwgY29uZmlnLT5yY2NyKTsKIAl9CkBAIC0yMzksNDYgKzIzMywyOCBAQAogCX0KIAltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CiAKLQlkYXRhX3JlZyA9IG1jYnNwLT5waHlzX2RtYV9iYXNlOwotCi0JaWYgKG1jYnNwLT5tY2JzcF9jb25maWdfdHlwZSA8IE1DQlNQX0NPTkZJR19UWVBFMikgeworCWlmIChtY2JzcC0+cGRhdGEtPnJlZ19zaXplID09IDIpIHsKIAkJaWYgKHN0cmVhbSkKLQkJCWRhdGFfcmVnICs9IE9NQVBfTUNCU1BfUkVHX0RSUjE7CisJCQlkYXRhX3JlZyA9IE9NQVBfTUNCU1BfUkVHX0RSUjE7CiAJCWVsc2UKLQkJCWRhdGFfcmVnICs9IE9NQVBfTUNCU1BfUkVHX0RYUjE7CisJCQlkYXRhX3JlZyA9IE9NQVBfTUNCU1BfUkVHX0RYUjE7CiAJfSBlbHNlIHsKIAkJaWYgKHN0cmVhbSkKLQkJCWRhdGFfcmVnICs9IE9NQVBfTUNCU1BfUkVHX0RSUjsKKwkJCWRhdGFfcmVnID0gT01BUF9NQ0JTUF9SRUdfRFJSOwogCQllbHNlCi0JCQlkYXRhX3JlZyArPSBPTUFQX01DQlNQX1JFR19EWFI7CisJCQlkYXRhX3JlZyA9IE9NQVBfTUNCU1BfUkVHX0RYUjsKIAl9CiAKLQlyZXR1cm4gZGF0YV9yZWc7CisJcmV0dXJuIG1jYnNwLT5waHlzX2RtYV9iYXNlICsgZGF0YV9yZWcgKiBtY2JzcC0+cGRhdGEtPnJlZ19zdGVwOwogfQogRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX2RtYV9yZWdfcGFyYW1zKTsKIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCi1zdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlICpmaW5kX29tYXBfZGV2aWNlX2J5X2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsCi0JCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihwZGV2LCBzdHJ1Y3Qgb21hcF9kZXZpY2UsIHBkZXYpOwotfQotCiBzdGF0aWMgdm9pZCBvbWFwX3N0X29uKHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkKIHsKIAl1bnNpZ25lZCBpbnQgdzsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwogCi0Jb2QgPSBmaW5kX29tYXBfZGV2aWNlX2J5X2RldihtY2JzcC0+ZGV2KTsKLQotCS8qCi0JICogU2lkZXRvbmUgdXNlcyBNY0JTUCBJQ0xLIC0gd2hpY2ggbXVzdCBub3QgaWRsZSB3aGVuIHNpZGV0b25lcwotCSAqIGFyZSBlbmFibGVkIG9yIHNpZGV0b25lcyBzdGFydCBzb3VuZGluZyB1Z2x5LgotCSAqLwotCXcgPSBvbWFwMl9jbV9yZWFkX21vZF9yZWcoT01BUDM0MzBfUEVSX01PRCwgQ01fQVVUT0lETEUpOwotCXcgJj0gfigxIDw8IChtY2JzcC0+aWQgLSAyKSk7Ci0Jb21hcDJfY21fd3JpdGVfbW9kX3JlZyh3LCBPTUFQMzQzMF9QRVJfTU9ELCBDTV9BVVRPSURMRSk7CisJaWYgKG1jYnNwLT5wZGF0YS0+ZW5hYmxlX3N0X2Nsb2NrKQorCQltY2JzcC0+cGRhdGEtPmVuYWJsZV9zdF9jbG9jayhtY2JzcC0+aWQsIDEpOwogCiAJLyogRW5hYmxlIE1jQlNQIFNpZGV0b25lICovCiAJdyA9IE1DQlNQX1JFQUQobWNic3AsIFNTRUxDUik7CkBAIC0yOTIsOSArMjY4LDYgQEAKIHN0YXRpYyB2b2lkIG9tYXBfc3Rfb2ZmKHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkKIHsKIAl1bnNpZ25lZCBpbnQgdzsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwotCi0Jb2QgPSBmaW5kX29tYXBfZGV2aWNlX2J5X2RldihtY2JzcC0+ZGV2KTsKIAogCXcgPSBNQ0JTUF9TVF9SRUFEKG1jYnNwLCBTU0VMQ1IpOwogCU1DQlNQX1NUX1dSSVRFKG1jYnNwLCBTU0VMQ1IsIHcgJiB+KFNUX1NJREVUT05FRU4pKTsKQEAgLTMwMiwxNyArMjc1LDEzIEBACiAJdyA9IE1DQlNQX1JFQUQobWNic3AsIFNTRUxDUik7CiAJTUNCU1BfV1JJVEUobWNic3AsIFNTRUxDUiwgdyAmIH4oU0lERVRPTkVFTikpOwogCi0JdyA9IG9tYXAyX2NtX3JlYWRfbW9kX3JlZyhPTUFQMzQzMF9QRVJfTU9ELCBDTV9BVVRPSURMRSk7Ci0JdyB8PSAxIDw8IChtY2JzcC0+aWQgLSAyKTsKLQlvbWFwMl9jbV93cml0ZV9tb2RfcmVnKHcsIE9NQVAzNDMwX1BFUl9NT0QsIENNX0FVVE9JRExFKTsKKwlpZiAobWNic3AtPnBkYXRhLT5lbmFibGVfc3RfY2xvY2spCisJCW1jYnNwLT5wZGF0YS0+ZW5hYmxlX3N0X2Nsb2NrKG1jYnNwLT5pZCwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfc3RfZmlyX3dyaXRlKHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCwgczE2ICpmaXIpCiB7CiAJdTE2IHZhbCwgaTsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwotCi0Jb2QgPSBmaW5kX29tYXBfZGV2aWNlX2J5X2RldihtY2JzcC0+ZGV2KTsKIAogCXZhbCA9IE1DQlNQX1NUX1JFQUQobWNic3AsIFNTRUxDUik7CiAKQEAgLTM0MCw5ICszMDksNiBAQAogewogCXUxNiB3OwogCXN0cnVjdCBvbWFwX21jYnNwX3N0X2RhdGEgKnN0X2RhdGEgPSBtY2JzcC0+c3RfZGF0YTsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwotCi0Jb2QgPSBmaW5kX29tYXBfZGV2aWNlX2J5X2RldihtY2JzcC0+ZGV2KTsKIAogCXcgPSBNQ0JTUF9TVF9SRUFEKG1jYnNwLCBTU0VMQ1IpOwogCkBAIC01MjUsMTQgKzQ5MSwxMyBAQAogewogCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKIAotCWlmICghY3B1X2lzX29tYXAzNHh4KCkgJiYgIWNwdV9pc19vbWFwNDR4eCgpKQotCQlyZXR1cm47Ci0KIAlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7CiAJCXJldHVybjsKIAl9CiAJbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOworCWlmIChtY2JzcC0+cGRhdGEtPmJ1ZmZlcl9zaXplID09IDApCisJCXJldHVybjsKIAogCWlmICh0aHJlc2hvbGQgJiYgdGhyZXNob2xkIDw9IG1jYnNwLT5tYXhfdHhfdGhyZXMpCiAJCU1DQlNQX1dSSVRFKG1jYnNwLCBUSFJTSDIsIHRocmVzaG9sZCAtIDEpOwpAQCAtNTQ4LDE0ICs1MTMsMTMgQEAKIHsKIAlzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3A7CiAKLQlpZiAoIWNwdV9pc19vbWFwMzR4eCgpICYmICFjcHVfaXNfb21hcDQ0eHgoKSkKLQkJcmV0dXJuOwotCiAJaWYgKCFvbWFwX21jYnNwX2NoZWNrX3ZhbGlkX2lkKGlkKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGlkICglZClcbiIsIF9fZnVuY19fLCBpZCArIDEpOwogCQlyZXR1cm47CiAJfQogCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKKwlpZiAobWNic3AtPnBkYXRhLT5idWZmZXJfc2l6ZSA9PSAwKQorCQlyZXR1cm47CiAKIAlpZiAodGhyZXNob2xkICYmIHRocmVzaG9sZCA8PSBtY2JzcC0+bWF4X3J4X3RocmVzKQogCQlNQ0JTUF9XUklURShtY2JzcCwgVEhSU0gxLCB0aHJlc2hvbGQgLSAxKTsKQEAgLTYyNSw2ICs1ODksOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOworCWlmIChtY2JzcC0+cGRhdGEtPmJ1ZmZlcl9zaXplID09IDApCisJCXJldHVybiAwOwogCiAJLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyZWUgbG9jYXRpb25zIGluIHRoZSBidWZmZXIgKi8KIAlidWZmc3RhdCA9IE1DQlNQX1JFQUQobWNic3AsIFhCVUZGU1RBVCk7CkBAIC02NDgsNiArNjE0LDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKKwlpZiAobWNic3AtPnBkYXRhLT5idWZmZXJfc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKIAogCS8qIFJldHVybnMgdGhlIG51bWJlciBvZiB1c2VkIGxvY2F0aW9ucyBpbiB0aGUgYnVmZmVyICovCiAJYnVmZnN0YXQgPSBNQ0JTUF9SRUFEKG1jYnNwLCBSQlVGRlNUQVQpOwpAQCAtNjgzLDQ2ICs2NTEsNiBAQAogfQogRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX2dldF9kbWFfb3BfbW9kZSk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMzR4eF9tY2JzcF9yZXF1ZXN0KHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkKLXsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwotCi0Jb2QgPSBmaW5kX29tYXBfZGV2aWNlX2J5X2RldihtY2JzcC0+ZGV2KTsKLQkvKgotCSAqIEVuYWJsZSB3YWt1cCBiZWhhdmlvciwgc21hcnQgaWRsZSBhbmQgYWxsIHdha2V1cHMKLQkgKiBSRVZJU0lUOiBzb21lIHdha2V1cHMgbWF5IGJlIHVubmVjZXNzYXJ5Ci0JICovCi0JaWYgKGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpKSB7Ci0JCU1DQlNQX1dSSVRFKG1jYnNwLCBXQUtFVVBFTiwgWFJEWUVOIHwgUlJEWUVOKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMzR4eF9tY2JzcF9mcmVlKHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkKLXsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwotCi0Jb2QgPSBmaW5kX29tYXBfZGV2aWNlX2J5X2RldihtY2JzcC0+ZGV2KTsKLQotCS8qCi0JICogRGlzYWJsZSB3YWt1cCBiZWhhdmlvciwgc21hcnQgaWRsZSBhbmQgYWxsIHdha2V1cHMKLQkgKi8KLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJLyoKLQkJICogSFcgYnVnIHdvcmthcm91bmQgLSBJZiBub19pZGxlIG1vZGUgaXMgdGFrZW4sIHdlIG5lZWQgdG8KLQkJICogZ28gdG8gc21hcnRfaWRsZSBiZWZvcmUgZ29pbmcgdG8gYWx3YXlzX2lkbGUsIG9yIHRoZQotCQkgKiBkZXZpY2Ugd2lsbCBub3QgaGl0IHJldGVudGlvbiBhbnltb3JlLgotCQkgKi8KLQotCQlNQ0JTUF9XUklURShtY2JzcCwgV0FLRVVQRU4sIDApOwotCX0KLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgb21hcDM0eHhfbWNic3BfcmVxdWVzdChzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3ApIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgb21hcDM0eHhfbWNic3BfZnJlZShzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3ApIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgb21hcF9zdF9zdGFydChzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3ApIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgb21hcF9zdF9zdG9wKHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkge30KLSNlbmRpZgotCiBpbnQgb21hcF9tY2JzcF9yZXF1ZXN0KHVuc2lnbmVkIGludCBpZCkKIHsKIAlzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3A7CkBAIC03MzUsNyArNjYzLDcgQEAKIAl9CiAJbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOwogCi0JcmVnX2NhY2hlID0ga3phbGxvYyhvbWFwX21jYnNwX2NhY2hlX3NpemUsIEdGUF9LRVJORUwpOworCXJlZ19jYWNoZSA9IGt6YWxsb2MobWNic3AtPnJlZ19jYWNoZV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlZ19jYWNoZSkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC03NTcsOCArNjg1LDkgQEAKIAogCXBtX3J1bnRpbWVfZ2V0X3N5bmMobWNic3AtPmRldik7CiAKLQkvKiBEbyBwcm9jZWR1cmUgc3BlY2lmaWMgdG8gb21hcDM0eHggYXJjaCwgaWYgYXBwbGljYWJsZSAqLwotCW9tYXAzNHh4X21jYnNwX3JlcXVlc3QobWNic3ApOworCS8qIEVuYWJsZSB3YWtldXAgYmVoYXZpb3IgKi8KKwlpZiAobWNic3AtPnBkYXRhLT5oYXNfd2FrZXVwKQorCQlNQ0JTUF9XUklURShtY2JzcCwgV0FLRVVQRU4sIFhSRFlFTiB8IFJSRFlFTik7CiAKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGF0IHRyYW5zbWl0dGVyLCByZWNlaXZlciBhbmQgc2FtcGxlLXJhdGUgZ2VuZXJhdG9yIGFyZQpAQCAtNzk1LDggKzcyNCw5IEBACiAJaWYgKG1jYnNwLT5wZGF0YSAmJiBtY2JzcC0+cGRhdGEtPm9wcyAmJiBtY2JzcC0+cGRhdGEtPm9wcy0+ZnJlZSkKIAkJbWNic3AtPnBkYXRhLT5vcHMtPmZyZWUoaWQpOwogCi0JLyogRG8gcHJvY2VkdXJlIHNwZWNpZmljIHRvIG9tYXAzNHh4IGFyY2gsIGlmIGFwcGxpY2FibGUgKi8KLQlvbWFwMzR4eF9tY2JzcF9mcmVlKG1jYnNwKTsKKwkvKiBEaXNhYmxlIHdha2V1cCBiZWhhdmlvciAqLworCWlmIChtY2JzcC0+cGRhdGEtPmhhc193YWtldXApCisJCU1DQlNQX1dSSVRFKG1jYnNwLCBXQUtFVVBFTiwgMCk7CiAKIAlwbV9ydW50aW1lX3B1dF9zeW5jKG1jYnNwLT5kZXYpOwogCkBAIC04MjUsOCArNzU1LDkgQEAKIAlpZiAobWNic3AtPnBkYXRhICYmIG1jYnNwLT5wZGF0YS0+b3BzICYmIG1jYnNwLT5wZGF0YS0+b3BzLT5mcmVlKQogCQltY2JzcC0+cGRhdGEtPm9wcy0+ZnJlZShpZCk7CiAKLQkvKiBEbyBwcm9jZWR1cmUgc3BlY2lmaWMgdG8gb21hcDM0eHggYXJjaCwgaWYgYXBwbGljYWJsZSAqLwotCW9tYXAzNHh4X21jYnNwX2ZyZWUobWNic3ApOworCS8qIERpc2FibGUgd2FrZXVwIGJlaGF2aW9yICovCisJaWYgKG1jYnNwLT5wZGF0YS0+aGFzX3dha2V1cCkKKwkJTUNCU1BfV1JJVEUobWNic3AsIFdBS0VVUEVOLCAwKTsKIAogCXBtX3J1bnRpbWVfcHV0X3N5bmMobWNic3AtPmRldik7CiAKQEAgLTg2Niw3ICs3OTcsNyBAQAogCX0KIAltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CiAKLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpCisJaWYgKG1jYnNwLT5zdF9kYXRhKQogCQlvbWFwX3N0X3N0YXJ0KG1jYnNwKTsKIAogCS8qIE9ubHkgZW5hYmxlIFNSRywgaWYgTWNCU1AgaXMgbWFzdGVyICovCkBAIC05MDQsNyArODM1LDcgQEAKIAkJTUNCU1BfV1JJVEUobWNic3AsIFNQQ1IyLCB3IHwgKDEgPDwgNykpOwogCX0KIAotCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDQ0eHgoKSkgeworCWlmIChtY2JzcC0+cGRhdGEtPmhhc19jY3IpIHsKIAkJLyogUmVsZWFzZSB0aGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyICovCiAJCXcgPSBNQ0JTUF9SRUFEX0NBQ0hFKG1jYnNwLCBYQ0NSKTsKIAkJdyAmPSB+KHR4ID8gWERJU0FCTEUgOiAwKTsKQEAgLTkzNCw3ICs4NjUsNyBAQAogCiAJLyogUmVzZXQgdHJhbnNtaXR0ZXIgKi8KIAl0eCAmPSAxOwotCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDQ0eHgoKSkgeworCWlmIChtY2JzcC0+cGRhdGEtPmhhc19jY3IpIHsKIAkJdyA9IE1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFhDQ1IpOwogCQl3IHw9ICh0eCA/IFhESVNBQkxFIDogMCk7CiAJCU1DQlNQX1dSSVRFKG1jYnNwLCBYQ0NSLCB3KTsKQEAgLTk0NCw3ICs4NzUsNyBAQAogCiAJLyogUmVzZXQgcmVjZWl2ZXIgKi8KIAlyeCAmPSAxOwotCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDQ0eHgoKSkgeworCWlmIChtY2JzcC0+cGRhdGEtPmhhc19jY3IpIHsKIAkJdyA9IE1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFJDQ1IpOwogCQl3IHw9IChyeCA/IFJESVNBQkxFIDogMCk7CiAJCU1DQlNQX1dSSVRFKG1jYnNwLCBSQ0NSLCB3KTsKQEAgLTk2MSwzOSArODkyLDcyIEBACiAJCU1DQlNQX1dSSVRFKG1jYnNwLCBTUENSMiwgdyAmIH4oMSA8PCA2KSk7CiAJfQogCi0JaWYgKGNwdV9pc19vbWFwMzR4eCgpKQorCWlmIChtY2JzcC0+c3RfZGF0YSkKIAkJb21hcF9zdF9zdG9wKG1jYnNwKTsKIH0KIEVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9zdG9wKTsKIAotLyoKLSAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBvbmx5IHJlcXVpcmVkIG9uIGFuIE9NQVAxLW9ubHkgYnVpbGQuCi0gKiBtYWNoLW9tYXAyL21jYnNwLmMgY29udGFpbnMgdGhlIHJlYWwgZnVuY3Rpb25zCi0gKi8KLSNpZm5kZWYgQ09ORklHX0FSQ0hfT01BUDJQTFVTCiBpbnQgb21hcDJfbWNic3Bfc2V0X2Nsa3Nfc3JjKHU4IGlkLCB1OCBmY2tfc3JjX2lkKQogewotCVdBUk4oMSwgIiVzOiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIG9uIGFuIE9NQVAxLW9ubHkga2VybmVsXG4iLAotCSAgICAgX19mdW5jX18pOwotCXJldHVybiAtRUlOVkFMOworCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKKwljb25zdCBjaGFyICpzcmM7CisKKwlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CisKKwlpZiAoZmNrX3NyY19pZCA9PSBNQ0JTUF9DTEtTX1BBRF9TUkMpCisJCXNyYyA9ICJjbGtzX2V4dCI7CisJZWxzZSBpZiAoZmNrX3NyY19pZCA9PSBNQ0JTUF9DTEtTX1BSQ01fU1JDKQorCQlzcmMgPSAiY2xrc19mY2xrIjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1jYnNwLT5wZGF0YS0+c2V0X2Nsa19zcmMpCisJCXJldHVybiBtY2JzcC0+cGRhdGEtPnNldF9jbGtfc3JjKG1jYnNwLT5kZXYsIG1jYnNwLT5mY2xrLCBzcmMpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CiB9CitFWFBPUlRfU1lNQk9MKG9tYXAyX21jYnNwX3NldF9jbGtzX3NyYyk7CiAKIHZvaWQgb21hcDJfbWNic3AxX211eF9jbGtyX3NyYyh1OCBtdXgpCiB7Ci0JV0FSTigxLCAiJXM6IHNob3VsZCBuZXZlciBiZSBjYWxsZWQgb24gYW4gT01BUDEtb25seSBrZXJuZWxcbiIsCi0JICAgICBfX2Z1bmNfXyk7Ci0JcmV0dXJuOworCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKKwljb25zdCBjaGFyICpzcmM7CisKKwlpZiAobXV4ID09IENMS1JfU1JDX0NMS1IpCisJCXNyYyA9ICJjbGtyIjsKKwllbHNlIGlmIChtdXggPT0gQ0xLUl9TUkNfQ0xLWCkKKwkJc3JjID0gImNsa3giOworCWVsc2UKKwkJcmV0dXJuOworCisJbWNic3AgPSBpZF90b19tY2JzcF9wdHIoMCk7CisJaWYgKG1jYnNwLT5wZGF0YS0+bXV4X3NpZ25hbCkKKwkJbWNic3AtPnBkYXRhLT5tdXhfc2lnbmFsKG1jYnNwLT5kZXYsICJjbGtyIiwgc3JjKTsKIH0KK0VYUE9SVF9TWU1CT0wob21hcDJfbWNic3AxX211eF9jbGtyX3NyYyk7CiAKIHZvaWQgb21hcDJfbWNic3AxX211eF9mc3Jfc3JjKHU4IG11eCkKIHsKLQlXQVJOKDEsICIlczogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBvbiBhbiBPTUFQMS1vbmx5IGtlcm5lbFxuIiwKLQkgICAgIF9fZnVuY19fKTsKLQlyZXR1cm47Ci19Ci0jZW5kaWYKKwlzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3A7CisJY29uc3QgY2hhciAqc3JjOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKKwlpZiAobXV4ID09IEZTUl9TUkNfRlNSKQorCQlzcmMgPSAiZnNyIjsKKwllbHNlIGlmIChtdXggPT0gRlNSX1NSQ19GU1gpCisJCXNyYyA9ICJmc3giOworCWVsc2UKKwkJcmV0dXJuOworCisJbWNic3AgPSBpZF90b19tY2JzcF9wdHIoMCk7CisJaWYgKG1jYnNwLT5wZGF0YS0+bXV4X3NpZ25hbCkKKwkJbWNic3AtPnBkYXRhLT5tdXhfc2lnbmFsKG1jYnNwLT5kZXYsICJmc3IiLCBzcmMpOworfQorRVhQT1JUX1NZTUJPTChvbWFwMl9tY2JzcDFfbXV4X2Zzcl9zcmMpOworCiAjZGVmaW5lIG1heF90aHJlcyhtKQkJCShtY2JzcC0+cGRhdGEtPmJ1ZmZlcl9zaXplKQogI2RlZmluZSB2YWxpZF90aHJlc2hvbGQobSwgdmFsKQkJKCh2YWwpIDw9IG1heF90aHJlcyhtKSkKICNkZWZpbmUgVEhSRVNIT0xEX1BST1BfQlVJTERFUihwcm9wKQkJCQkJXApAQCAtMTA4NCw2ICsxMDQ4LDE3IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihkbWFfb3BfbW9kZSwgMDY0NCwgZG1hX29wX21vZGVfc2hvdywgZG1hX29wX21vZGVfc3RvcmUpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYWRkaXRpb25hbF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9tYXhfdHhfdGhyZXMuYXR0ciwKKwkmZGV2X2F0dHJfbWF4X3J4X3RocmVzLmF0dHIsCisJJmRldl9hdHRyX2RtYV9vcF9tb2RlLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZGl0aW9uYWxfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSAoc3RydWN0IGF0dHJpYnV0ZSAqKilhZGRpdGlvbmFsX2F0dHJzLAorfTsKKwogc3RhdGljIHNzaXplX3Qgc3RfdGFwc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtMTE0MiwyNyArMTExNyw2IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihzdF90YXBzLCAwNjQ0LCBzdF90YXBzX3Nob3csIHN0X3RhcHNfc3RvcmUpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYWRkaXRpb25hbF9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9tYXhfdHhfdGhyZXMuYXR0ciwKLQkmZGV2X2F0dHJfbWF4X3J4X3RocmVzLmF0dHIsCi0JJmRldl9hdHRyX2RtYV9vcF9tb2RlLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZGl0aW9uYWxfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSAoc3RydWN0IGF0dHJpYnV0ZSAqKilhZGRpdGlvbmFsX2F0dHJzLAotfTsKLQotc3RhdGljIGlubGluZSBpbnQgX19kZXZpbml0IG9tYXBfYWRkaXRpb25hbF9hZGQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmFkZGl0aW9uYWxfYXR0cl9ncm91cCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RldmV4aXQgb21hcF9hZGRpdGlvbmFsX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZhZGRpdGlvbmFsX2F0dHJfZ3JvdXApOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqc2lkZXRvbmVfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfc3RfdGFwcy5hdHRyLAogCU5VTEwsCkBAIC0xMTcyLDEwICsxMTI2LDkgQEAKIAkuYXR0cnMgPSAoc3RydWN0IGF0dHJpYnV0ZSAqKilzaWRldG9uZV9hdHRycywKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG9tYXBfc3RfYWRkKHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IG9tYXBfc3RfYWRkKHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCwKKwkJCQkgc3RydWN0IHJlc291cmNlICpyZXMpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3Qgb21hcF9tY2JzcF9zdF9kYXRhICpzdF9kYXRhOwogCWludCBlcnI7CiAKQEAgLTExODUsOSArMTEzOCw2IEBACiAJCWdvdG8gZXJyMTsKIAl9CiAKLQlwZGV2ID0gY29udGFpbmVyX29mKG1jYnNwLT5kZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAic2lkZXRvbmUiKTsKIAlzdF9kYXRhLT5pb19iYXNlX3N0ID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCWlmICghc3RfZGF0YS0+aW9fYmFzZV9zdCkgewogCQllcnIgPSAtRU5PTUVNOwpAQCAtMTIxNCw2MCArMTE2NCwxMSBAQAogewogCXN0cnVjdCBvbWFwX21jYnNwX3N0X2RhdGEgKnN0X2RhdGEgPSBtY2JzcC0+c3RfZGF0YTsKIAotCWlmIChzdF9kYXRhKSB7Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmbWNic3AtPmRldi0+a29iaiwgJnNpZGV0b25lX2F0dHJfZ3JvdXApOwotCQlpb3VubWFwKHN0X2RhdGEtPmlvX2Jhc2Vfc3QpOwotCQlrZnJlZShzdF9kYXRhKTsKLQl9CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZtY2JzcC0+ZGV2LT5rb2JqLCAmc2lkZXRvbmVfYXR0cl9ncm91cCk7CisJaW91bm1hcChzdF9kYXRhLT5pb19iYXNlX3N0KTsKKwlrZnJlZShzdF9kYXRhKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fZGV2aW5pdCBvbWFwMzR4eF9kZXZpY2VfaW5pdChzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3ApCi17Ci0JbWNic3AtPmRtYV9vcF9tb2RlID0gTUNCU1BfRE1BX01PREVfRUxFTUVOVDsKLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJLyoKLQkJICogSW5pdGlhbGx5IGNvbmZpZ3VyZSB0aGUgbWF4aW11bSB0aHJlc2hvbGRzIHRvIGEgc2FmZSB2YWx1ZS4KLQkJICogVGhlIE1jQlNQIEZJRk8gdXNhZ2Ugd2l0aCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG5vdCBnbyB1bmRlcgotCQkgKiAxNiBsb2NhdGlvbnMuCi0JCSAqIElmIHRoZSB3aG9sZSBGSUZPIHdpdGhvdXQgc2FmZXR5IGJ1ZmZlciBpcyB1c2VkLCB0aGFuIHRoZXJlCi0JCSAqIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGUgRE1BIHdpbGwgYmUgbm90IGFibGUgdG8gcHVzaCB0aGUKLQkJICogbmV3IGRhdGEgb24gdGltZSwgY2F1c2luZyBjaGFubmVsIHNoaWZ0cyBpbiBydW50aW1lLgotCQkgKi8KLQkJbWNic3AtPm1heF90eF90aHJlcyA9IG1heF90aHJlcyhtY2JzcCkgLSAweDEwOwotCQltY2JzcC0+bWF4X3J4X3RocmVzID0gbWF4X3RocmVzKG1jYnNwKSAtIDB4MTA7Ci0JCS8qCi0JCSAqIFJFVklTSVQ6IFNldCBkbWFwX29wX21vZGUgdG8gVEhSRVNIT0xEIGFzIGRlZmF1bHQKLQkJICogZm9yIG1jYnNwMiBpbnN0YW5jZXMuCi0JCSAqLwotCQlpZiAob21hcF9hZGRpdGlvbmFsX2FkZChtY2JzcC0+ZGV2KSkKLQkJCWRldl93YXJuKG1jYnNwLT5kZXYsCi0JCQkJIlVuYWJsZSB0byBjcmVhdGUgYWRkaXRpb25hbCBjb250cm9sc1xuIik7Ci0KLQkJaWYgKG1jYnNwLT5pZCA9PSAyIHx8IG1jYnNwLT5pZCA9PSAzKQotCQkJaWYgKG9tYXBfc3RfYWRkKG1jYnNwKSkKLQkJCQlkZXZfd2FybihtY2JzcC0+ZGV2LAotCQkJCSAiVW5hYmxlIHRvIGNyZWF0ZSBzaWRldG9uZSBjb250cm9sc1xuIik7Ci0KLQl9IGVsc2UgewotCQltY2JzcC0+bWF4X3R4X3RocmVzID0gLUVJTlZBTDsKLQkJbWNic3AtPm1heF9yeF90aHJlcyA9IC1FSU5WQUw7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kZXZleGl0IG9tYXAzNHh4X2RldmljZV9leGl0KHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkKLXsKLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJb21hcF9hZGRpdGlvbmFsX3JlbW92ZShtY2JzcC0+ZGV2KTsKLQotCQlpZiAobWNic3AtPmlkID09IDIgfHwgbWNic3AtPmlkID09IDMpCi0JCQlvbWFwX3N0X3JlbW92ZShtY2JzcCk7Ci0JfQotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RldmluaXQgb21hcDM0eHhfZGV2aWNlX2luaXQoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwKSB7fQotc3RhdGljIGlubGluZSB2b2lkIF9fZGV2ZXhpdCBvbWFwMzR4eF9kZXZpY2VfZXhpdChzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3ApIHt9Ci0jZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDMgKi8KLQogLyoKICAqIE1jQlNQMSBhbmQgTWNCU1AzIGFyZSBkaXJlY3RseSBtYXBwZWQgb24gMTYxMCBhbmQgMTUxMC4KICAqIDczMCBoYXMgb25seSAyIE1jQlNQLCBhbmQgYm90aCBvZiB0aGVtIGFyZSBNUFUgcGVyaXBoZXJhbHMuCkBAIC0xMzE2LDcgKzEyMTcsNyBAQAogCQl9CiAJfQogCW1jYnNwLT5waHlzX2Jhc2UgPSByZXMtPnN0YXJ0OwotCW9tYXBfbWNic3BfY2FjaGVfc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwltY2JzcC0+cmVnX2NhY2hlX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJbWNic3AtPmlvX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKCFtY2JzcC0+aW9fYmFzZSkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTM2NCwxNSArMTI2NSw1MiBAQAogCW1jYnNwLT5wZGF0YSA9IHBkYXRhOwogCW1jYnNwLT5kZXYgPSAmcGRldi0+ZGV2OwogCW1jYnNwX3B0cltpZF0gPSBtY2JzcDsKLQltY2JzcC0+bWNic3BfY29uZmlnX3R5cGUgPSBwZGF0YS0+bWNic3BfY29uZmlnX3R5cGU7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWNic3ApOwogCXBtX3J1bnRpbWVfZW5hYmxlKG1jYnNwLT5kZXYpOwogCi0JLyogSW5pdGlhbGl6ZSBtY2JzcCBwcm9wZXJ0aWVzIGZvciBPTUFQMzRYWCBpZiBuZWVkZWQgLyBhcHBsaWNhYmxlICovCi0Jb21hcDM0eHhfZGV2aWNlX2luaXQobWNic3ApOworCW1jYnNwLT5kbWFfb3BfbW9kZSA9IE1DQlNQX0RNQV9NT0RFX0VMRU1FTlQ7CisJaWYgKG1jYnNwLT5wZGF0YS0+YnVmZmVyX3NpemUpIHsKKwkJLyoKKwkJICogSW5pdGlhbGx5IGNvbmZpZ3VyZSB0aGUgbWF4aW11bSB0aHJlc2hvbGRzIHRvIGEgc2FmZSB2YWx1ZS4KKwkJICogVGhlIE1jQlNQIEZJRk8gdXNhZ2Ugd2l0aCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG5vdCBnbyB1bmRlcgorCQkgKiAxNiBsb2NhdGlvbnMuCisJCSAqIElmIHRoZSB3aG9sZSBGSUZPIHdpdGhvdXQgc2FmZXR5IGJ1ZmZlciBpcyB1c2VkLCB0aGFuIHRoZXJlCisJCSAqIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGUgRE1BIHdpbGwgYmUgbm90IGFibGUgdG8gcHVzaCB0aGUKKwkJICogbmV3IGRhdGEgb24gdGltZSwgY2F1c2luZyBjaGFubmVsIHNoaWZ0cyBpbiBydW50aW1lLgorCQkgKi8KKwkJbWNic3AtPm1heF90eF90aHJlcyA9IG1heF90aHJlcyhtY2JzcCkgLSAweDEwOworCQltY2JzcC0+bWF4X3J4X3RocmVzID0gbWF4X3RocmVzKG1jYnNwKSAtIDB4MTA7CisKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZtY2JzcC0+ZGV2LT5rb2JqLAorCQkJCQkgJmFkZGl0aW9uYWxfYXR0cl9ncm91cCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIobWNic3AtPmRldiwKKwkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIGNvbnRyb2xzXG4iKTsKKwkJCWdvdG8gZXJyX3RocmVzOworCQl9CisJfSBlbHNlIHsKKwkJbWNic3AtPm1heF90eF90aHJlcyA9IC1FSU5WQUw7CisJCW1jYnNwLT5tYXhfcnhfdGhyZXMgPSAtRUlOVkFMOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJzaWRldG9uZSIpOworCWlmIChyZXMpIHsKKwkJcmV0ID0gb21hcF9zdF9hZGQobWNic3AsIHJlcyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIobWNic3AtPmRldiwKKwkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBzaWRldG9uZSBjb250cm9sc1xuIik7CisJCQlnb3RvIGVycl9zdDsKKwkJfQorCX0KIAogCXJldHVybiAwOwogCitlcnJfc3Q6CisJaWYgKG1jYnNwLT5wZGF0YS0+YnVmZmVyX3NpemUpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmbWNic3AtPmRldi0+a29iaiwKKwkJCQkgICAmYWRkaXRpb25hbF9hdHRyX2dyb3VwKTsKK2Vycl90aHJlczoKKwljbGtfcHV0KG1jYnNwLT5mY2xrKTsKIGVycl9yZXM6CiAJaW91bm1hcChtY2JzcC0+aW9fYmFzZSk7CiBlcnJfaW9yZW1hcDoKQEAgLTEzOTIsNyArMTMzMCwxMiBAQAogCQkJCW1jYnNwLT5wZGF0YS0+b3BzLT5mcmVlKQogCQkJbWNic3AtPnBkYXRhLT5vcHMtPmZyZWUobWNic3AtPmlkKTsKIAotCQlvbWFwMzR4eF9kZXZpY2VfZXhpdChtY2JzcCk7CisJCWlmIChtY2JzcC0+cGRhdGEtPmJ1ZmZlcl9zaXplKQorCQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZtY2JzcC0+ZGV2LT5rb2JqLAorCQkJCQkgICAmYWRkaXRpb25hbF9hdHRyX2dyb3VwKTsKKworCQlpZiAobWNic3AtPnN0X2RhdGEpCisJCQlvbWFwX3N0X3JlbW92ZShtY2JzcCk7CiAKIAkJY2xrX3B1dChtY2JzcC0+ZmNsayk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwLXBtLW5vb3AuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwLXBtLW5vb3AuYwppbmRleCBiMDQ3MWJiMi4uM2RjMzgwMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXAtcG0tbm9vcC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwLXBtLW5vb3AuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPHBsYXQvb21hcF9kZXZpY2UuaD4KIAogc3RhdGljIGJvb2wgb2ZmX21vZGVfZW5hYmxlZDsKLXN0YXRpYyB1MzIgZHVtbXlfY29udGV4dF9sb3NzX2NvdW50ZXI7CitzdGF0aWMgaW50IGR1bW15X2NvbnRleHRfbG9zc19jb3VudGVyOwogCiAvKgogICogRGV2aWNlLWRyaXZlci1vcmlnaW5hdGVkIGNvbnN0cmFpbnRzICh2aWEgYm9hcmQtKi5jIGZpbGVzKQpAQCAtMzExLDIyICszMTEsMzIgQEAKIAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAyUExVUwogCi11MzIgb21hcF9wbV9nZXRfZGV2X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgb21hcF9wbV9nZXRfZGV2X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXUzMiBjb3VudDsKKwlpbnQgY291bnQ7CiAKIAlpZiAoV0FSTl9PTighZGV2KSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKGRldi0+cGFyZW50ID09ICZvbWFwX2RldmljZV9wYXJlbnQpIHsKIAkJY291bnQgPSBvbWFwX2RldmljZV9nZXRfY29udGV4dF9sb3NzX2NvdW50KHBkZXYpOwogCX0gZWxzZSB7CiAJCVdBUk5fT05DRShvZmZfbW9kZV9lbmFibGVkLCAib21hcF9wbTogdXNpbmcgZHVtbXkgY29udGV4dCBsb3NzIGNvdW50ZXI7IGRldmljZSAlcyBzaG91bGQgYmUgY29udmVydGVkIHRvIG9tYXBfZGV2aWNlIiwKIAkJCSAgZGV2X25hbWUoZGV2KSk7Ci0JCWlmIChvZmZfbW9kZV9lbmFibGVkKQotCQkJZHVtbXlfY29udGV4dF9sb3NzX2NvdW50ZXIrKzsKKwogCQljb3VudCA9IGR1bW15X2NvbnRleHRfbG9zc19jb3VudGVyOworCisJCWlmIChvZmZfbW9kZV9lbmFibGVkKSB7CisJCQljb3VudCsrOworCQkJLyoKKwkJCSAqIENvbnRleHQgbG9zcyBjb3VudCBoYXMgdG8gYmUgYSBub24tbmVnYXRpdmUgdmFsdWUuCisJCQkgKiBDbGVhciB0aGUgc2lnbiBiaXQgdG8gZ2V0IGEgdmFsdWUgcmFuZ2UgZnJvbSAwIHRvCisJCQkgKiBJTlRfTUFYLgorCQkJICovCisJCQljb3VudCAmPSBJTlRfTUFYOworCQkJZHVtbXlfY29udGV4dF9sb3NzX2NvdW50ZXIgPSBjb3VudDsKKwkJfQogCX0KIAogCXByX2RlYnVnKCJPTUFQIFBNOiBjb250ZXh0IGxvc3MgY291bnQgZm9yIGRldiAlcyA9ICVkXG4iLApAQCAtMzM3LDcgKzM0Nyw3IEBACiAKICNlbHNlCiAKLXUzMiBvbWFwX3BtX2dldF9kZXZfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBvbWFwX3BtX2dldF9kZXZfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gZHVtbXlfY29udGV4dF9sb3NzX2NvdW50ZXI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvb21hcF9kZXZpY2UuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCmluZGV4IDAyNjA5ZWUuLmU4ZDk4NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCkBAIC03OCw2ICs3OCw3IEBACiAjdW5kZWYgREVCVUcKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTg1LDYgKzg2LDggQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCiAjaW5jbHVkZSA8cGxhdC9vbWFwX2RldmljZS5oPgogI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgpAQCAtOTQsNiArOTcsMjMgQEAKICNkZWZpbmUgVVNFX1dBS0VVUF9MQVQJCQkwCiAjZGVmaW5lIElHTk9SRV9XQUtFVVBfTEFUCQkxCiAKK3N0YXRpYyBpbnQgb21hcF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CitzdGF0aWMgaW50IG9tYXBfZWFybHlfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZSAqb21hcF9kZXZpY2VfYWxsb2Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgICBzdHJ1Y3Qgb21hcF9od21vZCAqKm9ocywgaW50IG9oX2NudCwKKwkJCQkgICAgICBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSAqcG1fbGF0cywKKwkJCQkgICAgICBpbnQgcG1fbGF0c19jbnQpOworc3RhdGljIHZvaWQgb21hcF9kZXZpY2VfZGVsZXRlKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpOworCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX2RlZmF1bHRfbGF0ZW5jeVtdID0geworCXsKKwkJLmRlYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAorCQkuYWN0aXZhdGVfZnVuYyAgID0gb21hcF9kZXZpY2VfZW5hYmxlX2h3bW9kcywKKwkJLmZsYWdzID0gT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVCwKKwl9Cit9OworCiAvKiBQcml2YXRlIGZ1bmN0aW9ucyAqLwogCiAvKioKQEAgLTExNCw3ICsxMzQsNyBAQAogewogCXN0cnVjdCB0aW1lc3BlYyBhLCBiLCBjOwogCi0JcHJfZGVidWcoIm9tYXBfZGV2aWNlOiAlczogYWN0aXZhdGluZ1xuIiwgb2QtPnBkZXYubmFtZSk7CisJZGV2X2RiZygmb2QtPnBkZXYtPmRldiwgIm9tYXBfZGV2aWNlOiBhY3RpdmF0aW5nXG4iKTsKIAogCXdoaWxlIChvZC0+cG1fbGF0X2xldmVsID4gMCkgewogCQlzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSAqb2RwbDsKQEAgLTEzOCwyNSArMTU4LDI0IEBACiAJCWMgPSB0aW1lc3BlY19zdWIoYiwgYSk7CiAJCWFjdF9sYXQgPSB0aW1lc3BlY190b19ucygmYyk7CiAKLQkJcHJfZGVidWcoIm9tYXBfZGV2aWNlOiAlczogcG1fbGF0ICVkOiBhY3RpdmF0ZTogZWxhcHNlZCB0aW1lICIKLQkJCSAiJWxsdSBuc2VjXG4iLCBvZC0+cGRldi5uYW1lLCBvZC0+cG1fbGF0X2xldmVsLAotCQkJIGFjdF9sYXQpOworCQlkZXZfZGJnKCZvZC0+cGRldi0+ZGV2LAorCQkJIm9tYXBfZGV2aWNlOiBwbV9sYXQgJWQ6IGFjdGl2YXRlOiBlbGFwc2VkIHRpbWUgIgorCQkJIiVsbHUgbnNlY1xuIiwgb2QtPnBtX2xhdF9sZXZlbCwgYWN0X2xhdCk7CiAKIAkJaWYgKGFjdF9sYXQgPiBvZHBsLT5hY3RpdmF0ZV9sYXQpIHsKIAkJCW9kcGwtPmFjdGl2YXRlX2xhdF93b3JzdCA9IGFjdF9sYXQ7CiAJCQlpZiAob2RwbC0+ZmxhZ3MgJiBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNUKSB7CiAJCQkJb2RwbC0+YWN0aXZhdGVfbGF0ID0gYWN0X2xhdDsKLQkJCQlwcl93YXJuaW5nKCJvbWFwX2RldmljZTogJXMuJWQ6IG5ldyB3b3JzdCBjYXNlICIKLQkJCQkJICAgImFjdGl2YXRlIGxhdGVuY3kgJWQ6ICVsbHVcbiIsCi0JCQkJCSAgIG9kLT5wZGV2Lm5hbWUsIG9kLT5wZGV2LmlkLAotCQkJCQkgICBvZC0+cG1fbGF0X2xldmVsLCBhY3RfbGF0KTsKKwkJCQlkZXZfZGJnKCZvZC0+cGRldi0+ZGV2LAorCQkJCQkibmV3IHdvcnN0IGNhc2UgYWN0aXZhdGUgbGF0ZW5jeSAiCisJCQkJCSIlZDogJWxsdVxuIiwKKwkJCQkJb2QtPnBtX2xhdF9sZXZlbCwgYWN0X2xhdCk7CiAJCQl9IGVsc2UKLQkJCQlwcl93YXJuaW5nKCJvbWFwX2RldmljZTogJXMuJWQ6IGFjdGl2YXRlICIKLQkJCQkJICAgImxhdGVuY3kgJWQgaGlnaGVyIHRoYW4gZXhwdGVjdGVkLiAiCi0JCQkJCSAgICIoJWxsdSA+ICVkKVxuIiwKLQkJCQkJICAgb2QtPnBkZXYubmFtZSwgb2QtPnBkZXYuaWQsCi0JCQkJCSAgIG9kLT5wbV9sYXRfbGV2ZWwsIGFjdF9sYXQsCi0JCQkJCSAgIG9kcGwtPmFjdGl2YXRlX2xhdCk7CisJCQkJZGV2X3dhcm4oJm9kLT5wZGV2LT5kZXYsCisJCQkJCSAiYWN0aXZhdGUgbGF0ZW5jeSAlZCAiCisJCQkJCSAiaGlnaGVyIHRoYW4gZXhwdGVjdGVkLiAoJWxsdSA+ICVkKVxuIiwKKwkJCQkJIG9kLT5wbV9sYXRfbGV2ZWwsIGFjdF9sYXQsCisJCQkJCSBvZHBsLT5hY3RpdmF0ZV9sYXQpOwogCQl9CiAKIAkJb2QtPmRldl93YWtldXBfbGF0IC09IG9kcGwtPmFjdGl2YXRlX2xhdDsKQEAgLTE4Myw3ICsyMDIsNyBAQAogewogCXN0cnVjdCB0aW1lc3BlYyBhLCBiLCBjOwogCi0JcHJfZGVidWcoIm9tYXBfZGV2aWNlOiAlczogZGVhY3RpdmF0aW5nXG4iLCBvZC0+cGRldi5uYW1lKTsKKwlkZXZfZGJnKCZvZC0+cGRldi0+ZGV2LCAib21hcF9kZXZpY2U6IGRlYWN0aXZhdGluZ1xuIik7CiAKIAl3aGlsZSAob2QtPnBtX2xhdF9sZXZlbCA8IG9kLT5wbV9sYXRzX2NudCkgewogCQlzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSAqb2RwbDsKQEAgLTIwNiwyOCArMjI1LDI2IEBACiAJCWMgPSB0aW1lc3BlY19zdWIoYiwgYSk7CiAJCWRlYWN0X2xhdCA9IHRpbWVzcGVjX3RvX25zKCZjKTsKIAotCQlwcl9kZWJ1Zygib21hcF9kZXZpY2U6ICVzOiBwbV9sYXQgJWQ6IGRlYWN0aXZhdGU6IGVsYXBzZWQgdGltZSAiCi0JCQkgIiVsbHUgbnNlY1xuIiwgb2QtPnBkZXYubmFtZSwgb2QtPnBtX2xhdF9sZXZlbCwKLQkJCSBkZWFjdF9sYXQpOworCQlkZXZfZGJnKCZvZC0+cGRldi0+ZGV2LAorCQkJIm9tYXBfZGV2aWNlOiBwbV9sYXQgJWQ6IGRlYWN0aXZhdGU6IGVsYXBzZWQgdGltZSAiCisJCQkiJWxsdSBuc2VjXG4iLCBvZC0+cG1fbGF0X2xldmVsLCBkZWFjdF9sYXQpOwogCiAJCWlmIChkZWFjdF9sYXQgPiBvZHBsLT5kZWFjdGl2YXRlX2xhdCkgewogCQkJb2RwbC0+ZGVhY3RpdmF0ZV9sYXRfd29yc3QgPSBkZWFjdF9sYXQ7CiAJCQlpZiAob2RwbC0+ZmxhZ3MgJiBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNUKSB7CiAJCQkJb2RwbC0+ZGVhY3RpdmF0ZV9sYXQgPSBkZWFjdF9sYXQ7Ci0JCQkJcHJfd2FybmluZygib21hcF9kZXZpY2U6ICVzLiVkOiBuZXcgd29yc3QgY2FzZSAiCi0JCQkJCSAgICJkZWFjdGl2YXRlIGxhdGVuY3kgJWQ6ICVsbHVcbiIsCi0JCQkJCSAgIG9kLT5wZGV2Lm5hbWUsIG9kLT5wZGV2LmlkLAotCQkJCQkgICBvZC0+cG1fbGF0X2xldmVsLCBkZWFjdF9sYXQpOworCQkJCWRldl9kYmcoJm9kLT5wZGV2LT5kZXYsCisJCQkJCSJuZXcgd29yc3QgY2FzZSBkZWFjdGl2YXRlIGxhdGVuY3kgIgorCQkJCQkiJWQ6ICVsbHVcbiIsCisJCQkJCW9kLT5wbV9sYXRfbGV2ZWwsIGRlYWN0X2xhdCk7CiAJCQl9IGVsc2UKLQkJCQlwcl93YXJuaW5nKCJvbWFwX2RldmljZTogJXMuJWQ6IGRlYWN0aXZhdGUgIgotCQkJCQkgICAibGF0ZW5jeSAlZCBoaWdoZXIgdGhhbiBleHB0ZWN0ZWQuICIKLQkJCQkJICAgIiglbGx1ID4gJWQpXG4iLAotCQkJCQkgICBvZC0+cGRldi5uYW1lLCBvZC0+cGRldi5pZCwKLQkJCQkJICAgb2QtPnBtX2xhdF9sZXZlbCwgZGVhY3RfbGF0LAotCQkJCQkgICBvZHBsLT5kZWFjdGl2YXRlX2xhdCk7CisJCQkJZGV2X3dhcm4oJm9kLT5wZGV2LT5kZXYsCisJCQkJCSAiZGVhY3RpdmF0ZSBsYXRlbmN5ICVkICIKKwkJCQkJICJoaWdoZXIgdGhhbiBleHB0ZWN0ZWQuICglbGx1ID4gJWQpXG4iLAorCQkJCQkgb2QtPnBtX2xhdF9sZXZlbCwgZGVhY3RfbGF0LAorCQkJCQkgb2RwbC0+ZGVhY3RpdmF0ZV9sYXQpOwogCQl9CiAKLQogCQlvZC0+ZGV2X3dha2V1cF9sYXQgKz0gb2RwbC0+YWN0aXZhdGVfbGF0OwogCiAJCW9kLT5wbV9sYXRfbGV2ZWwrKzsKQEAgLTI0NSwyOCArMjYyLDI3IEBACiAJaWYgKCFjbGtfYWxpYXMgfHwgIWNsa19uYW1lKQogCQlyZXR1cm47CiAKLQlwcl9kZWJ1Zygib21hcF9kZXZpY2U6ICVzOiBDcmVhdGluZyAlcyAtPiAlc1xuIiwKLQkJIGRldl9uYW1lKCZvZC0+cGRldi5kZXYpLCBjbGtfYWxpYXMsIGNsa19uYW1lKTsKKwlkZXZfZGJnKCZvZC0+cGRldi0+ZGV2LCAiQ3JlYXRpbmcgJXMgLT4gJXNcbiIsIGNsa19hbGlhcywgY2xrX25hbWUpOwogCi0JciA9IGNsa19nZXRfc3lzKGRldl9uYW1lKCZvZC0+cGRldi5kZXYpLCBjbGtfYWxpYXMpOworCXIgPSBjbGtfZ2V0X3N5cyhkZXZfbmFtZSgmb2QtPnBkZXYtPmRldiksIGNsa19hbGlhcyk7CiAJaWYgKCFJU19FUlIocikpIHsKLQkJcHJfd2FybmluZygib21hcF9kZXZpY2U6ICVzOiBhbGlhcyAlcyBhbHJlYWR5IGV4aXN0c1xuIiwKLQkJCSAgIGRldl9uYW1lKCZvZC0+cGRldi5kZXYpLCBjbGtfYWxpYXMpOworCQlkZXZfd2Fybigmb2QtPnBkZXYtPmRldiwKKwkJCSAiYWxpYXMgJXMgYWxyZWFkeSBleGlzdHNcbiIsIGNsa19hbGlhcyk7CiAJCWNsa19wdXQocik7CiAJCXJldHVybjsKIAl9CiAKIAlyID0gb21hcF9jbGtfZ2V0X2J5X25hbWUoY2xrX25hbWUpOwogCWlmIChJU19FUlIocikpIHsKLQkJcHJfZXJyKCJvbWFwX2RldmljZTogJXM6IG9tYXBfY2xrX2dldF9ieV9uYW1lIGZvciAlcyBmYWlsZWRcbiIsCi0JCSAgICAgICBkZXZfbmFtZSgmb2QtPnBkZXYuZGV2KSwgY2xrX25hbWUpOworCQlkZXZfZXJyKCZvZC0+cGRldi0+ZGV2LAorCQkJIm9tYXBfY2xrX2dldF9ieV9uYW1lIGZvciAlcyBmYWlsZWRcbiIsIGNsa19uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAotCWwgPSBjbGtkZXZfYWxsb2MociwgY2xrX2FsaWFzLCBkZXZfbmFtZSgmb2QtPnBkZXYuZGV2KSk7CisJbCA9IGNsa2Rldl9hbGxvYyhyLCBjbGtfYWxpYXMsIGRldl9uYW1lKCZvZC0+cGRldi0+ZGV2KSk7CiAJaWYgKCFsKSB7Ci0JCXByX2Vycigib21hcF9kZXZpY2U6ICVzOiBjbGtkZXZfYWxsb2MgZm9yICVzIGZhaWxlZFxuIiwKLQkJICAgICAgIGRldl9uYW1lKCZvZC0+cGRldi5kZXYpLCBjbGtfYWxpYXMpOworCQlkZXZfZXJyKCZvZC0+cGRldi0+ZGV2LAorCQkJImNsa2Rldl9hbGxvYyBmb3IgJXMgZmFpbGVkXG4iLCBjbGtfYWxpYXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMDQsNiArMzIwLDk2IEBACiB9CiAKIAorc3RhdGljIHN0cnVjdCBkZXZfcG1fZG9tYWluIG9tYXBfZGV2aWNlX3BtX2RvbWFpbjsKKworLyoqCisgKiBvbWFwX2RldmljZV9idWlsZF9mcm9tX2R0IC0gYnVpbGQgYW4gb21hcF9kZXZpY2Ugd2l0aCBtdWx0aXBsZSBod21vZHMKKyAqIEBwZGV2X25hbWU6IG5hbWUgb2YgdGhlIHBsYXRmb3JtX2RldmljZSBkcml2ZXIgdG8gdXNlCisgKiBAcGRldl9pZDogdGhpcyBwbGF0Zm9ybV9kZXZpY2UncyBjb25uZWN0aW9uIElECisgKiBAb2g6IHB0ciB0byB0aGUgc2luZ2xlIG9tYXBfaHdtb2QgdGhhdCBiYWNrcyB0aGlzIG9tYXBfZGV2aWNlCisgKiBAcGRhdGE6IHBsYXRmb3JtX2RhdGEgcHRyIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwbGF0Zm9ybV9kZXZpY2UKKyAqIEBwZGF0YV9sZW46IGFtb3VudCBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBAcGRhdGEKKyAqIEBwbV9sYXRzOiBwb2ludGVyIHRvIGEgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBhcnJheSBmb3IgdGhpcyBkZXZpY2UKKyAqIEBwbV9sYXRzX2NudDogQVJSQVlfU0laRSgpIG9mIEBwbV9sYXRzCisgKiBAaXNfZWFybHlfZGV2aWNlOiBzaG91bGQgdGhlIGRldmljZSBiZSByZWdpc3RlcmVkIGFzIGFuIGVhcmx5IGRldmljZSBvciBub3QKKyAqCisgKiBGdW5jdGlvbiBmb3IgYnVpbGRpbmcgYW4gb21hcF9kZXZpY2UgYWxyZWFkeSByZWdpc3RlcmVkIGZyb20gZGV2aWNlLXRyZWUKKyAqCisgKiBSZXR1cm5zIDAgb3IgUFRSX0VSUigpIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IG9tYXBfZGV2aWNlX2J1aWxkX2Zyb21fZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb21hcF9od21vZCAqKmh3bW9kczsKKwlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOworCXN0cnVjdCBvbWFwX2h3bW9kICpvaDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwljb25zdCBjaGFyICpvaF9uYW1lOworCWludCBvaF9jbnQsIGksIHJldCA9IDA7CisKKwlvaF9jbnQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKG5vZGUsICJ0aSxod21vZHMiKTsKKwlpZiAoIW9oX2NudCB8fCBJU19FUlJfVkFMVUUob2hfY250KSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiTm8gJ2h3bW9kcycgdG8gYnVpbGQgb21hcF9kZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlod21vZHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9od21vZCAqKSAqIG9oX2NudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFod21vZHMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvZGJmZF9leGl0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBvaF9jbnQ7IGkrKykgeworCQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChub2RlLCAidGksaHdtb2RzIiwgaSwgJm9oX25hbWUpOworCQlvaCA9IG9tYXBfaHdtb2RfbG9va3VwKG9oX25hbWUpOworCQlpZiAoIW9oKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgbG9va3VwIGh3bW9kICclcydcbiIsCisJCQkJb2hfbmFtZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvZGJmZF9leGl0MTsKKwkJfQorCQlod21vZHNbaV0gPSBvaDsKKwl9CisKKwlvZCA9IG9tYXBfZGV2aWNlX2FsbG9jKHBkZXYsIGh3bW9kcywgb2hfY250LCBOVUxMLCAwKTsKKwlpZiAoIW9kKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvY2F0ZSBvbWFwX2RldmljZSBmb3IgOiVzXG4iLAorCQkJb2hfbmFtZSk7CisJCXJldCA9IFBUUl9FUlIob2QpOworCQlnb3RvIG9kYmZkX2V4aXQxOworCX0KKworCWlmIChvZl9nZXRfcHJvcGVydHkobm9kZSwgInRpLG5vX2lkbGVfb25fc3VzcGVuZCIsIE5VTEwpKQorCQlvbWFwX2RldmljZV9kaXNhYmxlX2lkbGVfb25fc3VzcGVuZChwZGV2KTsKKworCXBkZXYtPmRldi5wbV9kb21haW4gPSAmb21hcF9kZXZpY2VfcG1fZG9tYWluOworCitvZGJmZF9leGl0MToKKwlrZnJlZShod21vZHMpOworb2RiZmRfZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9vbWFwX2RldmljZV9ub3RpZmllcl9jYWxsKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJVU19OT1RJRllfQUREX0RFVklDRToKKwkJaWYgKHBkZXYtPmRldi5vZl9ub2RlKQorCQkJb21hcF9kZXZpY2VfYnVpbGRfZnJvbV9kdChwZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIEJVU19OT1RJRllfREVMX0RFVklDRToKKwkJaWYgKHBkZXYtPmFyY2hkYXRhLm9kKQorCQkJb21hcF9kZXZpY2VfZGVsZXRlKHBkZXYtPmFyY2hkYXRhLm9kKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisKIC8qIFB1YmxpYyBmdW5jdGlvbnMgZm9yIHVzZSBieSBjb3JlIGNvZGUgKi8KIAogLyoqCkBAIC0zMjEsNyArNDI3LDcgQEAKICAqIHJldHVybiB0aGUgY29udGV4dCBsb3NzIGNvdW50ZXIgZm9yIHRoYXQgaHdtb2QsIG90aGVyd2lzZSByZXR1cm4KICAqIHplcm8uCiAgKi8KLXUzMiBvbWFwX2RldmljZV9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitpbnQgb21hcF9kZXZpY2VfZ2V0X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CiAJdTMyIHJldCA9IDA7CkBAIC0zNDMsNyArNDQ5LDcgQEAKICAqIG11Y2ggbWVtb3J5IHRvIGFsbG9jYXRlIGJlZm9yZSBjYWxsaW5nCiAgKiBvbWFwX2RldmljZV9maWxsX3Jlc291cmNlcygpLiAgUmV0dXJucyB0aGUgY291bnQuCiAgKi8KLWludCBvbWFwX2RldmljZV9jb3VudF9yZXNvdXJjZXMoc3RydWN0IG9tYXBfZGV2aWNlICpvZCkKK3N0YXRpYyBpbnQgb21hcF9kZXZpY2VfY291bnRfcmVzb3VyY2VzKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpCiB7CiAJaW50IGMgPSAwOwogCWludCBpOwpAQCAtMzUyLDcgKzQ1OCw3IEBACiAJCWMgKz0gb21hcF9od21vZF9jb3VudF9yZXNvdXJjZXMob2QtPmh3bW9kc1tpXSk7CiAKIAlwcl9kZWJ1Zygib21hcF9kZXZpY2U6ICVzOiBjb3VudGVkICVkIHRvdGFsIHJlc291cmNlcyBhY3Jvc3MgJWQgIgotCQkgImh3bW9kc1xuIiwgb2QtPnBkZXYubmFtZSwgYywgb2QtPmh3bW9kc19jbnQpOworCQkgImh3bW9kc1xuIiwgb2QtPnBkZXYtPm5hbWUsIGMsIG9kLT5od21vZHNfY250KTsKIAogCXJldHVybiBjOwogfQpAQCAtMzc0LDcgKzQ4MCw4IEBACiAgKiBmdW5jdGlvbnMgdG8gZ2V0IGRldmljZSByZXNvdXJjZXMuICBIYWNraW5nIGFyb3VuZCB0aGUgZXhpc3RpbmcKICAqIHBsYXRmb3JtX2RldmljZSBjb2RlIHdhc3RlcyBtZW1vcnkuICBSZXR1cm5zIDAuCiAgKi8KLWludCBvbWFwX2RldmljZV9maWxsX3Jlc291cmNlcyhzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3N0YXRpYyBpbnQgb21hcF9kZXZpY2VfZmlsbF9yZXNvdXJjZXMoc3RydWN0IG9tYXBfZGV2aWNlICpvZCwKKwkJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKIAlpbnQgYyA9IDA7CiAJaW50IGksIHI7CkBAIC0zODksNiArNDk2LDExMyBAQAogfQogCiAvKioKKyAqIG9tYXBfZGV2aWNlX2FsbG9jIC0gYWxsb2NhdGUgYW4gb21hcF9kZXZpY2UKKyAqIEBwZGV2OiBwbGF0Zm9ybV9kZXZpY2UgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoaXMgb21hcF9kZXZpY2UKKyAqIEBvaDogcHRyIHRvIHRoZSBzaW5nbGUgb21hcF9od21vZCB0aGF0IGJhY2tzIHRoaXMgb21hcF9kZXZpY2UKKyAqIEBwZGF0YTogcGxhdGZvcm1fZGF0YSBwdHIgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHBsYXRmb3JtX2RldmljZQorICogQHBkYXRhX2xlbjogYW1vdW50IG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5IEBwZGF0YQorICogQHBtX2xhdHM6IHBvaW50ZXIgdG8gYSBvbWFwX2RldmljZV9wbV9sYXRlbmN5IGFycmF5IGZvciB0aGlzIGRldmljZQorICogQHBtX2xhdHNfY250OiBBUlJBWV9TSVpFKCkgb2YgQHBtX2xhdHMKKyAqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWxsb2NhdGluZyBhbiBvbWFwX2RldmljZSBzdHJ1Y3R1cmUgYW5kIGZpbGxpbmcKKyAqIGh3bW9kcywgcmVzb3VyY2VzIGFuZCBwbV9sYXRlbmN5IGF0dHJpYnV0ZXMuCisgKgorICogUmV0dXJucyBhbiBzdHJ1Y3Qgb21hcF9kZXZpY2UgcG9pbnRlciBvciBFUlJfUFRSKCkgb24gZXJyb3I7CisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9tYXBfZGV2aWNlX2FsbG9jKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJCXN0cnVjdCBvbWFwX2h3bW9kICoqb2hzLCBpbnQgb2hfY250LAorCQkJCQlzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSAqcG1fbGF0cywKKwkJCQkJaW50IHBtX2xhdHNfY250KQoreworCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMOworCWludCBpLCByZXNfY291bnQ7CisJc3RydWN0IG9tYXBfaHdtb2QgKipod21vZHM7CisKKwlvZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghb2QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvZGFfZXhpdDE7CisJfQorCW9kLT5od21vZHNfY250ID0gb2hfY250OworCisJaHdtb2RzID0ga21lbWR1cChvaHMsIHNpemVvZihzdHJ1Y3Qgb21hcF9od21vZCAqKSAqIG9oX2NudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFod21vZHMpCisJCWdvdG8gb2RhX2V4aXQyOworCisJb2QtPmh3bW9kcyA9IGh3bW9kczsKKwlvZC0+cGRldiA9IHBkZXY7CisKKwkvKgorCSAqIEhBQ0s6IElkZWFsbHkgdGhlIHJlc291cmNlcyBmcm9tIERUIHNob3VsZCBtYXRjaCwgYW5kIGh3bW9kCisJICogc2hvdWxkIGp1c3QgYWRkIHRoZSBtaXNzaW5nIG9uZXMuIFNpbmNlIHRoZSBuYW1lIGlzIG5vdAorCSAqIHByb3Blcmx5IHBvcHVsYXRlZCBieSBEVCwgc3RpY2sgdG8gaHdtb2QgcmVzb3VyY2VzIG9ubHkuCisJICovCisJaWYgKHBkZXYtPm51bV9yZXNvdXJjZXMgJiYgcGRldi0+cmVzb3VyY2UpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICIlcygpOiByZXNvdXJjZXMgYWxyZWFkeSBhbGxvY2F0ZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcGRldi0+bnVtX3Jlc291cmNlcyk7CisKKwlyZXNfY291bnQgPSBvbWFwX2RldmljZV9jb3VudF9yZXNvdXJjZXMob2QpOworCWlmIChyZXNfY291bnQgPiAwKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzKCk6IHJlc291cmNlcyBhbGxvY2F0ZWQgZnJvbSBod21vZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXNfY291bnQpOworCQlyZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogcmVzX2NvdW50LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZXMpCisJCQlnb3RvIG9kYV9leGl0MzsKKworCQlvbWFwX2RldmljZV9maWxsX3Jlc291cmNlcyhvZCwgcmVzKTsKKworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCByZXMsIHJlc19jb3VudCk7CisJCWtmcmVlKHJlcyk7CisKKwkJaWYgKHJldCkKKwkJCWdvdG8gb2RhX2V4aXQzOworCX0KKworCWlmICghcG1fbGF0cykgeworCQlwbV9sYXRzID0gb21hcF9kZWZhdWx0X2xhdGVuY3k7CisJCXBtX2xhdHNfY250ID0gQVJSQVlfU0laRShvbWFwX2RlZmF1bHRfbGF0ZW5jeSk7CisJfQorCisJb2QtPnBtX2xhdHNfY250ID0gcG1fbGF0c19jbnQ7CisJb2QtPnBtX2xhdHMgPSBrbWVtZHVwKHBtX2xhdHMsCisJCQlzaXplb2Yoc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kpICogcG1fbGF0c19jbnQsCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW9kLT5wbV9sYXRzKQorCQlnb3RvIG9kYV9leGl0MzsKKworCXBkZXYtPmFyY2hkYXRhLm9kID0gb2Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2hfY250OyBpKyspIHsKKwkJaHdtb2RzW2ldLT5vZCA9IG9kOworCQlfYWRkX2h3bW9kX2Nsb2Nrc19jbGtkZXYob2QsIGh3bW9kc1tpXSk7CisJfQorCisJcmV0dXJuIG9kOworCitvZGFfZXhpdDM6CisJa2ZyZWUoaHdtb2RzKTsKK29kYV9leGl0MjoKKwlrZnJlZShvZCk7CitvZGFfZXhpdDE6CisJZGV2X2VycigmcGRldi0+ZGV2LCAib21hcF9kZXZpY2U6IGJ1aWxkIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworc3RhdGljIHZvaWQgb21hcF9kZXZpY2VfZGVsZXRlKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpCit7CisJaWYgKCFvZCkKKwkJcmV0dXJuOworCisJb2QtPnBkZXYtPmFyY2hkYXRhLm9kID0gTlVMTDsKKwlrZnJlZShvZC0+cG1fbGF0cyk7CisJa2ZyZWUob2QtPmh3bW9kcyk7CisJa2ZyZWUob2QpOworfQorCisvKioKICAqIG9tYXBfZGV2aWNlX2J1aWxkIC0gYnVpbGQgYW5kIHJlZ2lzdGVyIGFuIG9tYXBfZGV2aWNlIHdpdGggb25lIG9tYXBfaHdtb2QKICAqIEBwZGV2X25hbWU6IG5hbWUgb2YgdGhlIHBsYXRmb3JtX2RldmljZSBkcml2ZXIgdG8gdXNlCiAgKiBAcGRldl9pZDogdGhpcyBwbGF0Zm9ybV9kZXZpY2UncyBjb25uZWN0aW9uIElECkBAIC00MDUsNyArNjE5LDcgQEAKICAqIGluZm9ybWF0aW9uLiAgUmV0dXJucyBFUlJfUFRSKC1FSU5WQUwpIGlmIEBvaCBpcyBOVUxMOyBvdGhlcndpc2UsCiAgKiBwYXNzZXMgYWxvbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBvbWFwX2RldmljZV9idWlsZF9zcygpLgogICovCi1zdHJ1Y3Qgb21hcF9kZXZpY2UgKm9tYXBfZGV2aWNlX2J1aWxkKGNvbnN0IGNoYXIgKnBkZXZfbmFtZSwgaW50IHBkZXZfaWQsCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwX2RldmljZV9idWlsZChjb25zdCBjaGFyICpwZGV2X25hbWUsIGludCBwZGV2X2lkLAogCQkJCSAgICAgIHN0cnVjdCBvbWFwX2h3bW9kICpvaCwgdm9pZCAqcGRhdGEsCiAJCQkJICAgICAgaW50IHBkYXRhX2xlbiwKIAkJCQkgICAgICBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSAqcG1fbGF0cywKQEAgLTQzOCwxOCArNjUyLDE1IEBACiAgKiBwbGF0Zm9ybV9kZXZpY2UgcmVjb3JkLiAgUmV0dXJucyBhbiBFUlJfUFRSKCkgb24gZXJyb3IsIG9yIHBhc3NlcwogICogYWxvbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBvbWFwX2RldmljZV9yZWdpc3RlcigpLgogICovCi1zdHJ1Y3Qgb21hcF9kZXZpY2UgKm9tYXBfZGV2aWNlX2J1aWxkX3NzKGNvbnN0IGNoYXIgKnBkZXZfbmFtZSwgaW50IHBkZXZfaWQsCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwX2RldmljZV9idWlsZF9zcyhjb25zdCBjaGFyICpwZGV2X25hbWUsIGludCBwZGV2X2lkLAogCQkJCQkgc3RydWN0IG9tYXBfaHdtb2QgKipvaHMsIGludCBvaF9jbnQsCiAJCQkJCSB2b2lkICpwZGF0YSwgaW50IHBkYXRhX2xlbiwKIAkJCQkJIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5ICpwbV9sYXRzLAogCQkJCQkgaW50IHBtX2xhdHNfY250LCBpbnQgaXNfZWFybHlfZGV2aWNlKQogewogCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKLQljaGFyICpwZGV2X25hbWUyOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKLQlpbnQgaSwgcmVzX2NvdW50OwotCXN0cnVjdCBvbWFwX2h3bW9kICoqaHdtb2RzOwogCiAJaWYgKCFvaHMgfHwgb2hfY250ID09IDAgfHwgIXBkZXZfbmFtZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC00NTcsNzIgKzY2OCw0MCBAQAogCWlmICghcGRhdGEgJiYgcGRhdGFfbGVuID4gMCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQlwcl9kZWJ1Zygib21hcF9kZXZpY2U6ICVzOiBidWlsZGluZyB3aXRoICVkIGh3bW9kc1xuIiwgcGRldl9uYW1lLAotCQkgb2hfY250KTsKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKHBkZXZfbmFtZSwgcGRldl9pZCk7CisJaWYgKCFwZGV2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb2Ric19leGl0OworCX0KIAotCW9kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJLyogU2V0IHRoZSBkZXZfbmFtZSBlYXJseSB0byBhbGxvdyBkZXZfeHh4IGluIG9tYXBfZGV2aWNlX2FsbG9jICovCisJaWYgKHBkZXYtPmlkICE9IC0xKQorCQlkZXZfc2V0X25hbWUoJnBkZXYtPmRldiwgIiVzLiVkIiwgcGRldi0+bmFtZSwgIHBkZXYtPmlkKTsKKwllbHNlCisJCWRldl9zZXRfbmFtZSgmcGRldi0+ZGV2LCAiJXMiLCBwZGV2LT5uYW1lKTsKKworCW9kID0gb21hcF9kZXZpY2VfYWxsb2MocGRldiwgb2hzLCBvaF9jbnQsIHBtX2xhdHMsIHBtX2xhdHNfY250KTsKIAlpZiAoIW9kKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCW9kLT5od21vZHNfY250ID0gb2hfY250OwotCi0JaHdtb2RzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfaHdtb2QgKikgKiBvaF9jbnQsCi0JCQkgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFod21vZHMpCiAJCWdvdG8gb2Ric19leGl0MTsKIAotCW1lbWNweShod21vZHMsIG9ocywgc2l6ZW9mKHN0cnVjdCBvbWFwX2h3bW9kICopICogb2hfY250KTsKLQlvZC0+aHdtb2RzID0gaHdtb2RzOwotCi0JcGRldl9uYW1lMiA9IGt6YWxsb2Moc3RybGVuKHBkZXZfbmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkZXZfbmFtZTIpCi0JCWdvdG8gb2Ric19leGl0MjsKLQlzdHJjcHkocGRldl9uYW1lMiwgcGRldl9uYW1lKTsKLQotCW9kLT5wZGV2Lm5hbWUgPSBwZGV2X25hbWUyOwotCW9kLT5wZGV2LmlkID0gcGRldl9pZDsKLQotCXJlc19jb3VudCA9IG9tYXBfZGV2aWNlX2NvdW50X3Jlc291cmNlcyhvZCk7Ci0JaWYgKHJlc19jb3VudCA+IDApIHsKLQkJcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIHJlc19jb3VudCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcmVzKQotCQkJZ290byBvZGJzX2V4aXQzOwotCX0KLQlvbWFwX2RldmljZV9maWxsX3Jlc291cmNlcyhvZCwgcmVzKTsKLQotCW9kLT5wZGV2Lm51bV9yZXNvdXJjZXMgPSByZXNfY291bnQ7Ci0Jb2QtPnBkZXYucmVzb3VyY2UgPSByZXM7Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoJm9kLT5wZGV2LCBwZGF0YSwgcGRhdGFfbGVuKTsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgcGRhdGEsIHBkYXRhX2xlbik7CiAJaWYgKHJldCkKLQkJZ290byBvZGJzX2V4aXQ0OwotCi0Jb2QtPnBtX2xhdHMgPSBwbV9sYXRzOwotCW9kLT5wbV9sYXRzX2NudCA9IHBtX2xhdHNfY250OworCQlnb3RvIG9kYnNfZXhpdDI7CiAKIAlpZiAoaXNfZWFybHlfZGV2aWNlKQotCQlyZXQgPSBvbWFwX2Vhcmx5X2RldmljZV9yZWdpc3RlcihvZCk7CisJCXJldCA9IG9tYXBfZWFybHlfZGV2aWNlX3JlZ2lzdGVyKHBkZXYpOwogCWVsc2UKLQkJcmV0ID0gb21hcF9kZXZpY2VfcmVnaXN0ZXIob2QpOwotCi0JZm9yIChpID0gMDsgaSA8IG9oX2NudDsgaSsrKSB7Ci0JCWh3bW9kc1tpXS0+b2QgPSBvZDsKLQkJX2FkZF9od21vZF9jbG9ja3NfY2xrZGV2KG9kLCBod21vZHNbaV0pOwotCX0KLQorCQlyZXQgPSBvbWFwX2RldmljZV9yZWdpc3RlcihwZGV2KTsKIAlpZiAocmV0KQotCQlnb3RvIG9kYnNfZXhpdDQ7CisJCWdvdG8gb2Ric19leGl0MjsKIAotCXJldHVybiBvZDsKKwlyZXR1cm4gcGRldjsKIAotb2Ric19leGl0NDoKLQlrZnJlZShyZXMpOwotb2Ric19leGl0MzoKLQlrZnJlZShwZGV2X25hbWUyKTsKIG9kYnNfZXhpdDI6Ci0Ja2ZyZWUoaHdtb2RzKTsKKwlvbWFwX2RldmljZV9kZWxldGUob2QpOwogb2Ric19leGl0MToKLQlrZnJlZShvZCk7CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKK29kYnNfZXhpdDoKIAogCXByX2Vycigib21hcF9kZXZpY2U6ICVzOiBidWlsZCBmYWlsZWQgKCVkKVxuIiwgcGRldl9uYW1lLCByZXQpOwogCkBAIC01MzgsMTEgKzcxNywxMSBAQAogICogcGxhdGZvcm1fZWFybHlfYWRkX2RldmljZSgpIG9uIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtX2RldmljZS4KICAqIFJldHVybnMgMCBieSBkZWZhdWx0LgogICovCi1pbnQgb21hcF9lYXJseV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG9tYXBfZGV2aWNlICpvZCkKK3N0YXRpYyBpbnQgb21hcF9lYXJseV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzWzFdOwogCi0JZGV2aWNlc1swXSA9ICYob2QtPnBkZXYpOworCWRldmljZXNbMF0gPSBwZGV2OwogCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIDEpOwogCXJldHVybiAwOwogfQpAQCAtNjM4LDEzICs4MTcsMTMgQEAKICAqIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigpIG9uIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtX2RldmljZS4KICAqIFJldHVybnMgdGhlIHJldHVybiB2YWx1ZSBvZiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoKS4KICAqLwotaW50IG9tYXBfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpCitzdGF0aWMgaW50IG9tYXBfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JcHJfZGVidWcoIm9tYXBfZGV2aWNlOiAlczogcmVnaXN0ZXJpbmdcbiIsIG9kLT5wZGV2Lm5hbWUpOworCXByX2RlYnVnKCJvbWFwX2RldmljZTogJXM6IHJlZ2lzdGVyaW5nXG4iLCBwZGV2LT5uYW1lKTsKIAotCW9kLT5wZGV2LmRldi5wYXJlbnQgPSAmb21hcF9kZXZpY2VfcGFyZW50OwotCW9kLT5wZGV2LmRldi5wbV9kb21haW4gPSAmb21hcF9kZXZpY2VfcG1fZG9tYWluOwotCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9kLT5wZGV2KTsKKwlwZGV2LT5kZXYucGFyZW50ID0gJm9tYXBfZGV2aWNlX3BhcmVudDsKKwlwZGV2LT5kZXYucG1fZG9tYWluID0gJm9tYXBfZGV2aWNlX3BtX2RvbWFpbjsKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIH0KIAogCkBAIC02NzEsOCArODUwLDkgQEAKIAlvZCA9IHRvX29tYXBfZGV2aWNlKHBkZXYpOwogCiAJaWYgKG9kLT5fc3RhdGUgPT0gT01BUF9ERVZJQ0VfU1RBVEVfRU5BQkxFRCkgewotCQlXQVJOKDEsICJvbWFwX2RldmljZTogJXMuJWQ6ICVzKCkgY2FsbGVkIGZyb20gaW52YWxpZCBzdGF0ZSAlZFxuIiwKLQkJICAgICBvZC0+cGRldi5uYW1lLCBvZC0+cGRldi5pZCwgX19mdW5jX18sIG9kLT5fc3RhdGUpOworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJvbWFwX2RldmljZTogJXMoKSBjYWxsZWQgZnJvbSBpbnZhbGlkIHN0YXRlICVkXG4iLAorCQkJIF9fZnVuY19fLCBvZC0+X3N0YXRlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03MTAsOCArODkwLDkgQEAKIAlvZCA9IHRvX29tYXBfZGV2aWNlKHBkZXYpOwogCiAJaWYgKG9kLT5fc3RhdGUgIT0gT01BUF9ERVZJQ0VfU1RBVEVfRU5BQkxFRCkgewotCQlXQVJOKDEsICJvbWFwX2RldmljZTogJXMuJWQ6ICVzKCkgY2FsbGVkIGZyb20gaW52YWxpZCBzdGF0ZSAlZFxuIiwKLQkJICAgICBvZC0+cGRldi5uYW1lLCBvZC0+cGRldi5pZCwgX19mdW5jX18sIG9kLT5fc3RhdGUpOworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJvbWFwX2RldmljZTogJXMoKSBjYWxsZWQgZnJvbSBpbnZhbGlkIHN0YXRlICVkXG4iLAorCQkJIF9fZnVuY19fLCBvZC0+X3N0YXRlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03NDIsOCArOTIzLDkgQEAKIAogCWlmIChvZC0+X3N0YXRlICE9IE9NQVBfREVWSUNFX1NUQVRFX0VOQUJMRUQgJiYKIAkgICAgb2QtPl9zdGF0ZSAhPSBPTUFQX0RFVklDRV9TVEFURV9JRExFKSB7Ci0JCVdBUk4oMSwgIm9tYXBfZGV2aWNlOiAlcy4lZDogJXMoKSBjYWxsZWQgZnJvbSBpbnZhbGlkIHN0YXRlICVkXG4iLAotCQkgICAgIG9kLT5wZGV2Lm5hbWUsIG9kLT5wZGV2LmlkLCBfX2Z1bmNfXywgb2QtPl9zdGF0ZSk7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIm9tYXBfZGV2aWNlOiAlcygpIGNhbGxlZCBmcm9tIGludmFsaWQgc3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sIG9kLT5fc3RhdGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTgzNyw2ICsxMDE5LDQyIEBACiAJcmV0dXJuIG9tYXBfaHdtb2RfZ2V0X21wdV9ydF92YShvZC0+aHdtb2RzWzBdKTsKIH0KIAorLyoqCisgKiBvbWFwX2RldmljZV9nZXRfYnlfaHdtb2RfbmFtZSgpIC0gY29udmVydCBhIGh3bW9kIG5hbWUgdG8KKyAqIGRldmljZSBwb2ludGVyLgorICogQG9oX25hbWU6IG5hbWUgb2YgdGhlIGh3bW9kIGRldmljZQorICoKKyAqIFJldHVybnMgYmFjayBhIHN0cnVjdCBkZXZpY2UgKiBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCBhIGh3bW9kCisgKiBkZXZpY2UgcmVwcmVzZW50ZWQgYnkgYSBod21vZF9uYW1lCisgKi8KK3N0cnVjdCBkZXZpY2UgKm9tYXBfZGV2aWNlX2dldF9ieV9od21vZF9uYW1lKGNvbnN0IGNoYXIgKm9oX25hbWUpCit7CisJc3RydWN0IG9tYXBfaHdtb2QgKm9oOworCisJaWYgKCFvaF9uYW1lKSB7CisJCVdBUk4oMSwgIiVzOiBubyBod21vZCBuYW1lIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlvaCA9IG9tYXBfaHdtb2RfbG9va3VwKG9oX25hbWUpOworCWlmIChJU19FUlJfT1JfTlVMTChvaCkpIHsKKwkJV0FSTigxLCAiJXM6IG5vIGh3bW9kIGZvciAlc1xuIiwgX19mdW5jX18sCisJCQlvaF9uYW1lKTsKKwkJcmV0dXJuIEVSUl9QVFIob2ggPyBQVFJfRVJSKG9oKSA6IC1FTk9ERVYpOworCX0KKwlpZiAoSVNfRVJSX09SX05VTEwob2gtPm9kKSkgeworCQlXQVJOKDEsICIlczogbm8gb21hcF9kZXZpY2UgZm9yICVzXG4iLCBfX2Z1bmNfXywKKwkJCW9oX25hbWUpOworCQlyZXR1cm4gRVJSX1BUUihvaC0+b2QgPyBQVFJfRVJSKG9oLT5vZCkgOiAtRU5PREVWKTsKKwl9CisKKwlpZiAoSVNfRVJSX09SX05VTEwob2gtPm9kLT5wZGV2KSkKKwkJcmV0dXJuIEVSUl9QVFIob2gtPm9kLT5wZGV2ID8gUFRSX0VSUihvaC0+b2QtPnBkZXYpIDogLUVOT0RFVik7CisKKwlyZXR1cm4gJm9oLT5vZC0+cGRldi0+ZGV2OworfQorRVhQT1JUX1NZTUJPTChvbWFwX2RldmljZV9nZXRfYnlfaHdtb2RfbmFtZSk7CisKIC8qCiAgKiBQdWJsaWMgZnVuY3Rpb25zIGludGVuZGVkIGZvciB1c2UgaW4gb21hcF9kZXZpY2VfcG1fbGF0ZW5jeQogICogLmFjdGl2YXRlX2Z1bmMgYW5kIC5kZWFjdGl2YXRlX2Z1bmMgZnVuY3Rpb24gcG9pbnRlcnMKQEAgLTkxNyw4ICsxMTM1LDEzIEBACiAJLnBhcmVudCAgICAgICAgID0gJnBsYXRmb3JtX2J1cywKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGxhdGZvcm1fbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBfb21hcF9kZXZpY2Vfbm90aWZpZXJfY2FsbCwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IG9tYXBfZGV2aWNlX2luaXQodm9pZCkKIHsKKwlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmcGxhdGZvcm1fbmIpOwogCXJldHVybiBkZXZpY2VfcmVnaXN0ZXIoJm9tYXBfZGV2aWNlX3BhcmVudCk7CiB9CiBjb3JlX2luaXRjYWxsKG9tYXBfZGV2aWNlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKaW5kZXggMzYzYzkxZS4uOGIyODY2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvb21hcGZiLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KQEAgLTI5LDEwICsyOCw4IEBACiAjaW5jbHVkZSA8cGxhdC9zcmFtLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC92cmFtLmg+CiAKICNpbmNsdWRlICJzcmFtLmgiCi0jaW5jbHVkZSAiZmIuaCIKIAogLyogWFhYIFRoZXNlICJzaWRld2F5cyIgaW5jbHVkZXMgYXJlIGEgc2lnbiB0aGF0IHNvbWV0aGluZyBpcyB3cm9uZyAqLwogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCkBAIC00MSwxNiArMzgsOSBAQAogI2VuZGlmCiAKICNkZWZpbmUgT01BUDFfU1JBTV9QQQkJMHgyMDAwMDAwMAotI2RlZmluZSBPTUFQMV9TUkFNX1ZBCQlWTUFMTE9DX0VORAogI2RlZmluZSBPTUFQMl9TUkFNX1BVQl9QQQkoT01BUDJfU1JBTV9QQSArIDB4ZjgwMCkKLSNkZWZpbmUgT01BUDJfU1JBTV9WQQkJMHhmZTQwMDAwMAotI2RlZmluZSBPTUFQMl9TUkFNX1BVQl9WQQkoT01BUDJfU1JBTV9WQSArIDB4ODAwKQotI2RlZmluZSBPTUFQM19TUkFNX1ZBICAgICAgICAgICAweGZlNDAwMDAwCiAjZGVmaW5lIE9NQVAzX1NSQU1fUFVCX1BBICAgICAgIChPTUFQM19TUkFNX1BBICsgMHg4MDAwKQotI2RlZmluZSBPTUFQM19TUkFNX1BVQl9WQSAgICAgICAoT01BUDNfU1JBTV9WQSArIDB4ODAwMCkKLSNkZWZpbmUgT01BUDRfU1JBTV9WQQkJMHhmZTQwMDAwMAogI2RlZmluZSBPTUFQNF9TUkFNX1BVQl9QQQkoT01BUDRfU1JBTV9QQSArIDB4NDAwMCkKLSNkZWZpbmUgT01BUDRfU1JBTV9QVUJfVkEJKE9NQVA0X1NSQU1fVkEgKyAweDQwMDApCiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyUExVUykKICNkZWZpbmUgU1JBTV9CT09UTE9BREVSX1NaCTB4MDAKQEAgLTczLDkgKzYzLDkgQEAKICNkZWZpbmUgUk9VTkRfRE9XTih2YWx1ZSxib3VuZGFyeSkJKCh2YWx1ZSkgJiAofigoYm91bmRhcnkpLTEpKSkKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9zcmFtX3N0YXJ0Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9zcmFtX2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpvbWFwX3NyYW1fYmFzZTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfc3JhbV9zaXplOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9zcmFtX2NlaWw7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpvbWFwX3NyYW1fY2VpbDsKIAogLyoKICAqIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IFJBTUZTIGZpcmV3YWxsIHNldHVwLCB0aGUgcHVibGljIHVzYWJsZSBhbW91bnQgb2YKQEAgLTExMiwxMiArMTAyLDkgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZGV0ZWN0X3NyYW0odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHJlc2VydmVkOwotCiAJaWYgKGNwdV9jbGFzc19pc19vbWFwMigpKSB7CiAJCWlmIChpc19zcmFtX2xvY2tlZCgpKSB7CiAJCQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJCQlvbWFwX3NyYW1fYmFzZSA9IE9NQVAzX1NSQU1fUFVCX1ZBOwogCQkJCW9tYXBfc3JhbV9zdGFydCA9IE9NQVAzX1NSQU1fUFVCX1BBOwogCQkJCWlmICgob21hcF90eXBlKCkgPT0gT01BUDJfREVWSUNFX1RZUEVfRU1VKSB8fAogCQkJCSAgICAob21hcF90eXBlKCkgPT0gT01BUDJfREVWSUNFX1RZUEVfU0VDKSkgewpAQCAtMTI2LDI1ICsxMTMsMjAgQEAKIAkJCQkJb21hcF9zcmFtX3NpemUgPSAweDgwMDA7IC8qIDMySyAqLwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJCQlvbWFwX3NyYW1fYmFzZSA9IE9NQVA0X1NSQU1fUFVCX1ZBOwogCQkJCW9tYXBfc3JhbV9zdGFydCA9IE9NQVA0X1NSQU1fUFVCX1BBOwogCQkJCW9tYXBfc3JhbV9zaXplID0gMHhhMDAwOyAvKiA0MEsgKi8KIAkJCX0gZWxzZSB7Ci0JCQkJb21hcF9zcmFtX2Jhc2UgPSBPTUFQMl9TUkFNX1BVQl9WQTsKIAkJCQlvbWFwX3NyYW1fc3RhcnQgPSBPTUFQMl9TUkFNX1BVQl9QQTsKIAkJCQlvbWFwX3NyYW1fc2l6ZSA9IDB4ODAwOyAvKiAySyAqLwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7Ci0JCQkJb21hcF9zcmFtX2Jhc2UgPSBPTUFQM19TUkFNX1ZBOwogCQkJCW9tYXBfc3JhbV9zdGFydCA9IE9NQVAzX1NSQU1fUEE7CiAJCQkJb21hcF9zcmFtX3NpemUgPSAweDEwMDAwOyAvKiA2NEsgKi8KIAkJCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJCQlvbWFwX3NyYW1fYmFzZSA9IE9NQVA0X1NSQU1fVkE7CiAJCQkJb21hcF9zcmFtX3N0YXJ0ID0gT01BUDRfU1JBTV9QQTsKIAkJCQlvbWFwX3NyYW1fc2l6ZSA9IDB4ZTAwMDsgLyogNTZLICovCiAJCQl9IGVsc2UgewotCQkJCW9tYXBfc3JhbV9iYXNlID0gT01BUDJfU1JBTV9WQTsKIAkJCQlvbWFwX3NyYW1fc3RhcnQgPSBPTUFQMl9TUkFNX1BBOwogCQkJCWlmIChjcHVfaXNfb21hcDI0MngoKSkKIAkJCQkJb21hcF9zcmFtX3NpemUgPSAweGEwMDAwOyAvKiA2NDBLICovCkBAIC0xNTMsNyArMTM1LDYgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCW9tYXBfc3JhbV9iYXNlID0gT01BUDFfU1JBTV9WQTsKIAkJb21hcF9zcmFtX3N0YXJ0ID0gT01BUDFfU1JBTV9QQTsKIAogCQlpZiAoY3B1X2lzX29tYXA3eHgoKSkKQEAgLTE3MCwzNSArMTUxLDE0IEBACiAJCQlvbWFwX3NyYW1fc2l6ZSA9IDB4NDAwMDsKIAkJfQogCX0KLQlyZXNlcnZlZCA9IG9tYXBmYl9yZXNlcnZlX3NyYW0ob21hcF9zcmFtX3N0YXJ0LCBvbWFwX3NyYW1fYmFzZSwKLQkJCQkgICAgICAgb21hcF9zcmFtX3NpemUsCi0JCQkJICAgICAgIG9tYXBfc3JhbV9zdGFydCArIFNSQU1fQk9PVExPQURFUl9TWiwKLQkJCQkgICAgICAgb21hcF9zcmFtX3NpemUgLSBTUkFNX0JPT1RMT0FERVJfU1opOwotCW9tYXBfc3JhbV9zaXplIC09IHJlc2VydmVkOwotCi0JcmVzZXJ2ZWQgPSBvbWFwX3ZyYW1fcmVzZXJ2ZV9zcmFtKG9tYXBfc3JhbV9zdGFydCwgb21hcF9zcmFtX2Jhc2UsCi0JCQlvbWFwX3NyYW1fc2l6ZSwKLQkJCW9tYXBfc3JhbV9zdGFydCArIFNSQU1fQk9PVExPQURFUl9TWiwKLQkJCW9tYXBfc3JhbV9zaXplIC0gU1JBTV9CT09UTE9BREVSX1NaKTsKLQlvbWFwX3NyYW1fc2l6ZSAtPSByZXNlcnZlZDsKLQotCW9tYXBfc3JhbV9jZWlsID0gb21hcF9zcmFtX2Jhc2UgKyBvbWFwX3NyYW1fc2l6ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwX3NyYW1faW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewkvKiAubGVuZ3RoIGdldHMgZmlsbGVkIGluIGF0IHJ1bnRpbWUgKi8KLQkJLnZpcnR1YWwJPSBPTUFQMV9TUkFNX1ZBLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oT01BUDFfU1JBTV9QQSksCi0JCS50eXBlCQk9IE1UX01FTU9SWQotCX0KLX07Ci0KIC8qCiAgKiBOb3RlIHRoYXQgd2UgY2Fubm90IHVzZSBpb3JlbWFwIGZvciBTUkFNLCBhcyBjbG9jayBpbml0IG5lZWRzIFNSQU0gZWFybHkuCiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX21hcF9zcmFtKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBiYXNlOworCWludCBjYWNoZWQgPSAxOwogCiAJaWYgKG9tYXBfc3JhbV9zaXplID09IDApCiAJCXJldHVybjsKQEAgLTIxMSwyOCArMTcxLDE4IEBACiAJCSAqIHRoZSBBUk0gbWF5IGF0dGVtcHQgdG8gd3JpdGUgY2FjaGUgbGluZXMgYmFjayB0byBTRFJBTQogCQkgKiB3aGljaCB3aWxsIGNhdXNlIHRoZSBzeXN0ZW0gdG8gaGFuZy4KIAkJICovCi0JCW9tYXBfc3JhbV9pb19kZXNjWzBdLnR5cGUgPSBNVF9NRU1PUllfTk9OQ0FDSEVEOworCQljYWNoZWQgPSAwOwogCX0KIAotCW9tYXBfc3JhbV9pb19kZXNjWzBdLnZpcnR1YWwgPSBvbWFwX3NyYW1fYmFzZTsKLQliYXNlID0gb21hcF9zcmFtX3N0YXJ0OwotCWJhc2UgPSBST1VORF9ET1dOKGJhc2UsIFBBR0VfU0laRSk7Ci0Jb21hcF9zcmFtX2lvX2Rlc2NbMF0ucGZuID0gX19waHlzX3RvX3BmbihiYXNlKTsKLQlvbWFwX3NyYW1faW9fZGVzY1swXS5sZW5ndGggPSBST1VORF9ET1dOKG9tYXBfc3JhbV9zaXplLCBQQUdFX1NJWkUpOwotCWlvdGFibGVfaW5pdChvbWFwX3NyYW1faW9fZGVzYywgQVJSQVlfU0laRShvbWFwX3NyYW1faW9fZGVzYykpOworCW9tYXBfc3JhbV9zdGFydCA9IFJPVU5EX0RPV04ob21hcF9zcmFtX3N0YXJ0LCBQQUdFX1NJWkUpOworCW9tYXBfc3JhbV9iYXNlID0gX19hcm1faW9yZW1hcF9leGVjKG9tYXBfc3JhbV9zdGFydCwgb21hcF9zcmFtX3NpemUsCisJCQkJCQljYWNoZWQpOworCWlmICghb21hcF9zcmFtX2Jhc2UpIHsKKwkJcHJfZXJyKCJTUkFNOiBDb3VsZCBub3QgbWFwXG4iKTsKKwkJcmV0dXJuOworCX0KIAotCXByX2luZm8oIlNSQU06IE1hcHBlZCBwYSAweCUwOGxseCB0byB2YSAweCUwOGx4IHNpemU6IDB4JWx4XG4iLAotCQkobG9uZyBsb25nKSBfX3Bmbl90b19waHlzKG9tYXBfc3JhbV9pb19kZXNjWzBdLnBmbiksCi0JCW9tYXBfc3JhbV9pb19kZXNjWzBdLnZpcnR1YWwsCi0JCW9tYXBfc3JhbV9pb19kZXNjWzBdLmxlbmd0aCk7Ci0KLQkvKgotCSAqIE5vcm1hbGx5IGRldmljZW1hcHNfaW5pdCgpIHdvdWxkIGZsdXNoIGNhY2hlcyBhbmQgdGxiIGFmdGVyCi0JICogbWRlc2MtPm1hcF9pbygpLCBidXQgc2luY2Ugd2UncmUgY2FsbGVkIGZyb20gbWFwX2lvKCksIHdlCi0JICogbXVzdCBkbyBpdCBoZXJlLgotCSAqLwotCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKLQlmbHVzaF9jYWNoZV9hbGwoKTsKKwlvbWFwX3NyYW1fY2VpbCA9IG9tYXBfc3JhbV9iYXNlICsgb21hcF9zcmFtX3NpemU7CiAKIAkvKgogCSAqIExvb2tzIGxpa2Ugd2UgbmVlZCB0byBwcmVzZXJ2ZSBzb21lIGJvb3Rsb2FkZXIgY29kZSBhdCB0aGUKQEAgLTI1MSwxMyArMjAxLDE4IEBACiAgKi8KIHZvaWQgKm9tYXBfc3JhbV9wdXNoX2FkZHJlc3ModW5zaWduZWQgbG9uZyBzaXplKQogewotCWlmIChzaXplID4gKG9tYXBfc3JhbV9jZWlsIC0gKG9tYXBfc3JhbV9iYXNlICsgU1JBTV9CT09UTE9BREVSX1NaKSkpIHsKKwl1bnNpZ25lZCBsb25nIGF2YWlsYWJsZSwgbmV3X2NlaWwgPSAodW5zaWduZWQgbG9uZylvbWFwX3NyYW1fY2VpbDsKKworCWF2YWlsYWJsZSA9IG9tYXBfc3JhbV9jZWlsIC0gKG9tYXBfc3JhbV9iYXNlICsgU1JBTV9CT09UTE9BREVSX1NaKTsKKworCWlmIChzaXplID4gYXZhaWxhYmxlKSB7CiAJCXByX2VycigiTm90IGVub3VnaCBzcGFjZSBpbiBTUkFNXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0Jb21hcF9zcmFtX2NlaWwgLT0gc2l6ZTsKLQlvbWFwX3NyYW1fY2VpbCA9IFJPVU5EX0RPV04ob21hcF9zcmFtX2NlaWwsIEZOQ1BZX0FMSUdOKTsKKwluZXdfY2VpbCAtPSBzaXplOworCW5ld19jZWlsID0gUk9VTkRfRE9XTihuZXdfY2VpbCwgRk5DUFlfQUxJR04pOworCW9tYXBfc3JhbV9jZWlsID0gSU9NRU0obmV3X2NlaWwpOwogCiAJcmV0dXJuICh2b2lkICopb21hcF9zcmFtX2NlaWw7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9yaW9uL2luY2x1ZGUvcGxhdC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LW9yaW9uL2luY2x1ZGUvcGxhdC9ncGlvLmgKaW5kZXggMzA3NWI5Zi4uM2FiZjMwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vcmlvbi9pbmNsdWRlL3BsYXQvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vaW5jbHVkZS9wbGF0L2dwaW8uaApAQCAtMTIsMTUgKzEyLDcgQEAKICNkZWZpbmUgX19QTEFUX0dQSU9fSAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotLyoKLSAqIEdFTkVSSUNfR1BJTyBwcmltaXRpdmVzLgotICovCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlICBfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlICBfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAgICBfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEgICAgIF9fZ3Bpb190b19pcnEKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKgogICogT3Jpb24tc3BlY2lmaWMgR1BJTyBBUEkgZXh0ZW5zaW9ucy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtcHhhL01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1weGEvTWFrZWZpbGUKaW5kZXggM2FjYTViYS4uZjMwMmQwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1weGEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1weGEvTWFrZWZpbGUKQEAgLTQsNyArNCw2IEBACiAKIG9iai15CTo9IGRtYS5vCiAKLW9iai0kKENPTkZJR19HRU5FUklDX0dQSU8pCSs9IGdwaW8ubwogb2JqLSQoQ09ORklHX1BYQTN4eCkJCSs9IG1mcC5vCiBvYmotJChDT05GSUdfUFhBOTV4KQkJKz0gbWZwLm8KIG9iai0kKENPTkZJR19BUkNIX01NUCkJCSs9IG1mcC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMWRjMzYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1weGEvZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vcGxhdC1weGEvZ3Bpby5jCi0gKgotICogIEdlbmVyaWMgUFhBIEdQSU8gaGFuZGxpbmcKLSAqCi0gKiAgQXV0aG9yOglOaWNvbGFzIFBpdHJlCi0gKiAgQ3JlYXRlZDoJSnVuIDE1LCAyMDAxCi0gKiAgQ29weXJpZ2h0OglNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotCi1pbnQgcHhhX2xhc3RfZ3BpbzsKLQotc3RydWN0IHB4YV9ncGlvX2NoaXAgewotCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKLQl2b2lkIF9faW9tZW0JKnJlZ2Jhc2U7Ci0JY2hhciBsYWJlbFsxMF07Ci0KLQl1bnNpZ25lZCBsb25nCWlycV9tYXNrOwotCXVuc2lnbmVkIGxvbmcJaXJxX2VkZ2VfcmlzZTsKLQl1bnNpZ25lZCBsb25nCWlycV9lZGdlX2ZhbGw7Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQl1bnNpZ25lZCBsb25nCXNhdmVkX2dwbHI7Ci0JdW5zaWduZWQgbG9uZwlzYXZlZF9ncGRyOwotCXVuc2lnbmVkIGxvbmcJc2F2ZWRfZ3JlcjsKLQl1bnNpZ25lZCBsb25nCXNhdmVkX2dmZXI7Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ3Bpb19sb2NrKTsKLXN0YXRpYyBzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqcHhhX2dwaW9fY2hpcHM7Ci0KLSNkZWZpbmUgZm9yX2VhY2hfZ3Bpb19jaGlwKGksIGMpCQkJXAotCWZvciAoaSA9IDAsIGMgPSAmcHhhX2dwaW9fY2hpcHNbMF07IGkgPD0gcHhhX2xhc3RfZ3BpbzsgaSArPSAzMiwgYysrKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqZ3Bpb19jaGlwX2Jhc2Uoc3RydWN0IGdwaW9fY2hpcCAqYykKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGMsIHN0cnVjdCBweGFfZ3Bpb19jaGlwLCBjaGlwKS0+cmVnYmFzZTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqZ3Bpb190b19weGFjaGlwKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuICZweGFfZ3Bpb19jaGlwc1tncGlvX3RvX2JhbmsoZ3BpbyldOwotfQotCi1zdGF0aWMgaW50IHB4YV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gZ3Bpb19jaGlwX2Jhc2UoY2hpcCk7Ci0JdWludDMyX3QgdmFsdWUsIG1hc2sgPSAxIDw8IG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCi0JdmFsdWUgPSBfX3Jhd19yZWFkbChiYXNlICsgR1BEUl9PRkZTRVQpOwotCWlmIChfX2dwaW9faXNfaW52ZXJ0ZWQoY2hpcC0+YmFzZSArIG9mZnNldCkpCi0JCXZhbHVlIHw9IG1hc2s7Ci0JZWxzZQotCQl2YWx1ZSAmPSB+bWFzazsKLQlfX3Jhd193cml0ZWwodmFsdWUsIGJhc2UgKyBHUERSX09GRlNFVCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBweGFfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBncGlvX2NoaXBfYmFzZShjaGlwKTsKLQl1aW50MzJfdCB0bXAsIG1hc2sgPSAxIDw8IG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JX19yYXdfd3JpdGVsKG1hc2ssIGJhc2UgKyAodmFsdWUgPyBHUFNSX09GRlNFVCA6IEdQQ1JfT0ZGU0VUKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0KLQl0bXAgPSBfX3Jhd19yZWFkbChiYXNlICsgR1BEUl9PRkZTRVQpOwotCWlmIChfX2dwaW9faXNfaW52ZXJ0ZWQoY2hpcC0+YmFzZSArIG9mZnNldCkpCi0JCXRtcCAmPSB+bWFzazsKLQllbHNlCi0JCXRtcCB8PSBtYXNrOwotCV9fcmF3X3dyaXRlbCh0bXAsIGJhc2UgKyBHUERSX09GRlNFVCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBweGFfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBfX3Jhd19yZWFkbChncGlvX2NoaXBfYmFzZShjaGlwKSArIEdQTFJfT0ZGU0VUKSAmICgxIDw8IG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHB4YV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlfX3Jhd193cml0ZWwoMSA8PCBvZmZzZXQsIGdwaW9fY2hpcF9iYXNlKGNoaXApICsKLQkJCQkodmFsdWUgPyBHUFNSX09GRlNFVCA6IEdQQ1JfT0ZGU0VUKSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHB4YV9pbml0X2dwaW9fY2hpcChpbnQgZ3Bpb19lbmQpCi17Ci0JaW50IGksIGdwaW8sIG5iYW5rcyA9IGdwaW9fdG9fYmFuayhncGlvX2VuZCkgKyAxOwotCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjaGlwczsKLQotCWNoaXBzID0ga3phbGxvYyhuYmFua3MgKiBzaXplb2Yoc3RydWN0IHB4YV9ncGlvX2NoaXApLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2hpcHMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgR1BJTyBjaGlwc1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlmb3IgKGkgPSAwLCBncGlvID0gMDsgaSA8IG5iYW5rczsgaSsrLCBncGlvICs9IDMyKSB7Ci0JCXN0cnVjdCBncGlvX2NoaXAgKmMgPSAmY2hpcHNbaV0uY2hpcDsKLQotCQlzcHJpbnRmKGNoaXBzW2ldLmxhYmVsLCAiZ3Bpby0lZCIsIGkpOwotCQljaGlwc1tpXS5yZWdiYXNlID0gKHZvaWQgX19pb21lbSAqKUdQSU9fQkFOSyhpKTsKLQotCQljLT5iYXNlICA9IGdwaW87Ci0JCWMtPmxhYmVsID0gY2hpcHNbaV0ubGFiZWw7Ci0KLQkJYy0+ZGlyZWN0aW9uX2lucHV0ICA9IHB4YV9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKLQkJYy0+ZGlyZWN0aW9uX291dHB1dCA9IHB4YV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7Ci0JCWMtPmdldCA9IHB4YV9ncGlvX2dldDsKLQkJYy0+c2V0ID0gcHhhX2dwaW9fc2V0OwotCi0JCS8qIG51bWJlciBvZiBHUElPcyBvbiBsYXN0IGJhbmsgbWF5IGJlIGxlc3MgdGhhbiAzMiAqLwotCQljLT5uZ3BpbyA9IChncGlvICsgMzEgPiBncGlvX2VuZCkgPyAoZ3Bpb19lbmQgLSBncGlvICsgMSkgOiAzMjsKLQkJZ3Bpb2NoaXBfYWRkKGMpOwotCX0KLQlweGFfZ3Bpb19jaGlwcyA9IGNoaXBzOwotCXJldHVybiAwOwotfQotCi0vKiBVcGRhdGUgb25seSB0aG9zZSBHUkVSeCBhbmQgR0ZFUnggZWRnZSBkZXRlY3Rpb24gcmVnaXN0ZXIgYml0cyBpZiB0aG9zZQotICogYml0cyBhcmUgc2V0IGluIGMtPmlycV9tYXNrCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfZWRnZV9kZXRlY3Qoc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMpCi17Ci0JdWludDMyX3QgZ3JlciwgZ2ZlcjsKLQotCWdyZXIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpICYgfmMtPmlycV9tYXNrOwotCWdmZXIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR0ZFUl9PRkZTRVQpICYgfmMtPmlycV9tYXNrOwotCWdyZXIgfD0gYy0+aXJxX2VkZ2VfcmlzZSAmIGMtPmlycV9tYXNrOwotCWdmZXIgfD0gYy0+aXJxX2VkZ2VfZmFsbCAmIGMtPmlycV9tYXNrOwotCV9fcmF3X3dyaXRlbChncmVyLCBjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpOwotCV9fcmF3X3dyaXRlbChnZmVyLCBjLT5yZWdiYXNlICsgR0ZFUl9PRkZTRVQpOwotfQotCi1zdGF0aWMgaW50IHB4YV9ncGlvX2lycV90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCi17Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmM7Ci0JaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCXVuc2lnbmVkIGxvbmcgZ3BkciwgbWFzayA9IEdQSU9fYml0KGdwaW8pOwotCi0JYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKLQotCWlmICh0eXBlID09IElSUV9UWVBFX1BST0JFKSB7Ci0JCS8qIERvbid0IG1lc3Mgd2l0aCBlbmFibGVkIEdQSU9zIHVzaW5nIHByZWNvbmZpZ3VyZWQgZWRnZXMgb3IKLQkJICogR1BJT3Mgc2V0IHRvIGFsdGVybmF0ZSBmdW5jdGlvbiBvciB0byBvdXRwdXQgZHVyaW5nIHByb2JlCi0JCSAqLwotCQlpZiAoKGMtPmlycV9lZGdlX3Jpc2UgfCBjLT5pcnFfZWRnZV9mYWxsKSAmIEdQSU9fYml0KGdwaW8pKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKF9fZ3Bpb19pc19vY2N1cGllZChncGlvKSkKLQkJCXJldHVybiAwOwotCi0JCXR5cGUgPSBJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORzsKLQl9Ci0KLQlncGRyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdQRFJfT0ZGU0VUKTsKLQotCWlmIChfX2dwaW9faXNfaW52ZXJ0ZWQoZ3BpbykpCi0JCV9fcmF3X3dyaXRlbChncGRyIHwgbWFzaywgIGMtPnJlZ2Jhc2UgKyBHUERSX09GRlNFVCk7Ci0JZWxzZQotCQlfX3Jhd193cml0ZWwoZ3BkciAmIH5tYXNrLCBjLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQpOwotCi0JaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKLQkJYy0+aXJxX2VkZ2VfcmlzZSB8PSBtYXNrOwotCWVsc2UKLQkJYy0+aXJxX2VkZ2VfcmlzZSAmPSB+bWFzazsKLQotCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKQotCQljLT5pcnFfZWRnZV9mYWxsIHw9IG1hc2s7Ci0JZWxzZQotCQljLT5pcnFfZWRnZV9mYWxsICY9IH5tYXNrOwotCi0JdXBkYXRlX2VkZ2VfZGV0ZWN0KGMpOwotCi0JcHJfZGVidWcoIiVzOiBJUlElZCAoR1BJTyVkKSAtIGVkZ2UlcyVzXG4iLCBfX2Z1bmNfXywgZC0+aXJxLCBncGlvLAotCQkoKHR5cGUgJiBJUlFfVFlQRV9FREdFX1JJU0lORykgID8gIiByaXNpbmciICA6ICIiKSwKLQkJKCh0eXBlICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSA/ICIgZmFsbGluZyIgOiAiIikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBweGFfZ3Bpb19kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYzsKLQlpbnQgbG9vcCwgZ3BpbywgZ3Bpb19iYXNlLCBuOwotCXVuc2lnbmVkIGxvbmcgZ2VkcjsKLQotCWRvIHsKLQkJbG9vcCA9IDA7Ci0JCWZvcl9lYWNoX2dwaW9fY2hpcChncGlvLCBjKSB7Ci0JCQlncGlvX2Jhc2UgPSBjLT5jaGlwLmJhc2U7Ci0KLQkJCWdlZHIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOwotCQkJZ2VkciA9IGdlZHIgJiBjLT5pcnFfbWFzazsKLQkJCV9fcmF3X3dyaXRlbChnZWRyLCBjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOwotCi0JCQluID0gZmluZF9maXJzdF9iaXQoJmdlZHIsIEJJVFNfUEVSX0xPTkcpOwotCQkJd2hpbGUgKG4gPCBCSVRTX1BFUl9MT05HKSB7Ci0JCQkJbG9vcCA9IDE7Ci0KLQkJCQlnZW5lcmljX2hhbmRsZV9pcnEoZ3Bpb190b19pcnEoZ3Bpb19iYXNlICsgbikpOwotCQkJCW4gPSBmaW5kX25leHRfYml0KCZnZWRyLCBCSVRTX1BFUl9MT05HLCBuICsgMSk7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlIChsb29wKTsKLX0KLQotc3RhdGljIHZvaWQgcHhhX2Fja19tdXhlZF9ncGlvKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX3B4YWNoaXAoZ3Bpbyk7Ci0KLQlfX3Jhd193cml0ZWwoR1BJT19iaXQoZ3BpbyksIGMtPnJlZ2Jhc2UgKyBHRURSX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHB4YV9tYXNrX211eGVkX2dwaW8oc3RydWN0IGlycV9kYXRhICpkKQotewotCWludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKLQlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKLQl1aW50MzJfdCBncmVyLCBnZmVyOwotCi0JYy0+aXJxX21hc2sgJj0gfkdQSU9fYml0KGdwaW8pOwotCi0JZ3JlciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCkgJiB+R1BJT19iaXQoZ3Bpbyk7Ci0JZ2ZlciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCkgJiB+R1BJT19iaXQoZ3Bpbyk7Ci0JX19yYXdfd3JpdGVsKGdyZXIsIGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCk7Ci0JX19yYXdfd3JpdGVsKGdmZXIsIGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHB4YV91bm1hc2tfbXV4ZWRfZ3BpbyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19weGFjaGlwKGdwaW8pOwotCi0JYy0+aXJxX21hc2sgfD0gR1BJT19iaXQoZ3Bpbyk7Ci0JdXBkYXRlX2VkZ2VfZGV0ZWN0KGMpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHB4YV9tdXhlZF9ncGlvX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIkdQSU8iLAotCS5pcnFfYWNrCT0gcHhhX2Fja19tdXhlZF9ncGlvLAotCS5pcnFfbWFzawk9IHB4YV9tYXNrX211eGVkX2dwaW8sCi0JLmlycV91bm1hc2sJPSBweGFfdW5tYXNrX211eGVkX2dwaW8sCi0JLmlycV9zZXRfdHlwZQk9IHB4YV9ncGlvX2lycV90eXBlLAotfTsKLQotdm9pZCBfX2luaXQgcHhhX2luaXRfZ3BpbyhpbnQgbXV4X2lycSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBzZXRfd2FrZV90IGZuKQotewotCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjOwotCWludCBncGlvLCBpcnE7Ci0KLQlweGFfbGFzdF9ncGlvID0gZW5kOwotCi0JLyogSW5pdGlhbGl6ZSBHUElPIGNoaXBzICovCi0JcHhhX2luaXRfZ3Bpb19jaGlwKGVuZCk7Ci0KLQkvKiBjbGVhciBhbGwgR1BJTyBlZGdlIGRldGVjdHMgKi8KLQlmb3JfZWFjaF9ncGlvX2NoaXAoZ3BpbywgYykgewotCQlfX3Jhd193cml0ZWwoMCwgYy0+cmVnYmFzZSArIEdGRVJfT0ZGU0VUKTsKLQkJX19yYXdfd3JpdGVsKDAsIGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCk7Ci0JCV9fcmF3X3dyaXRlbCh+MCxjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOwotCX0KLQotCWZvciAoaXJxICA9IGdwaW9fdG9faXJxKHN0YXJ0KTsgaXJxIDw9IGdwaW9fdG9faXJxKGVuZCk7IGlycSsrKSB7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZweGFfbXV4ZWRfZ3Bpb19jaGlwLAotCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKLQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKLQl9Ci0KLQkvKiBJbnN0YWxsIGhhbmRsZXIgZm9yIEdQSU8+PTIgZWRnZSBkZXRlY3QgaW50ZXJydXB0cyAqLwotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKG11eF9pcnEsIHB4YV9ncGlvX2RlbXV4X2hhbmRsZXIpOwotCXB4YV9tdXhlZF9ncGlvX2NoaXAuaXJxX3NldF93YWtlID0gZm47Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcHhhX2dwaW9fc3VzcGVuZCh2b2lkKQotewotCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjOwotCWludCBncGlvOwotCi0JZm9yX2VhY2hfZ3Bpb19jaGlwKGdwaW8sIGMpIHsKLQkJYy0+c2F2ZWRfZ3BsciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHUExSX09GRlNFVCk7Ci0JCWMtPnNhdmVkX2dwZHIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQpOwotCQljLT5zYXZlZF9ncmVyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdSRVJfT0ZGU0VUKTsKLQkJYy0+c2F2ZWRfZ2ZlciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCk7Ci0KLQkJLyogQ2xlYXIgR1BJTyB0cmFuc2l0aW9uIGRldGVjdCBiaXRzICovCi0JCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcHhhX2dwaW9fcmVzdW1lKHZvaWQpCi17Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmM7Ci0JaW50IGdwaW87Ci0KLQlmb3JfZWFjaF9ncGlvX2NoaXAoZ3BpbywgYykgewotCQkvKiByZXN0b3JlIGxldmVsIHdpdGggc2V0L2NsZWFyICovCi0JCV9fcmF3X3dyaXRlbCggYy0+c2F2ZWRfZ3BsciwgYy0+cmVnYmFzZSArIEdQU1JfT0ZGU0VUKTsKLQkJX19yYXdfd3JpdGVsKH5jLT5zYXZlZF9ncGxyLCBjLT5yZWdiYXNlICsgR1BDUl9PRkZTRVQpOwotCi0JCV9fcmF3X3dyaXRlbChjLT5zYXZlZF9ncmVyLCBjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpOwotCQlfX3Jhd193cml0ZWwoYy0+c2F2ZWRfZ2ZlciwgYy0+cmVnYmFzZSArIEdGRVJfT0ZGU0VUKTsKLQkJX19yYXdfd3JpdGVsKGMtPnNhdmVkX2dwZHIsIGMtPnJlZ2Jhc2UgKyBHUERSX09GRlNFVCk7Ci0JfQotfQotI2Vsc2UKLSNkZWZpbmUgcHhhX2dwaW9fc3VzcGVuZAlOVUxMCi0jZGVmaW5lIHB4YV9ncGlvX3Jlc3VtZQkJTlVMTAotI2VuZGlmCi0KLXN0cnVjdCBzeXNjb3JlX29wcyBweGFfZ3Bpb19zeXNjb3JlX29wcyA9IHsKLQkuc3VzcGVuZAk9IHB4YV9ncGlvX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBweGFfZ3Bpb19yZXN1bWUsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L2dwaW8tcHhhLmggYi9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvZ3Bpby1weGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjM5MGJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L2dwaW8tcHhhLmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBfX1BMQVRfUFhBX0dQSU9fSAorI2RlZmluZSBfX1BMQVRfUFhBX0dQSU9fSAorCitzdHJ1Y3QgaXJxX2RhdGE7CisKKy8qCisgKiBXZSBoYW5kbGUgdGhlIEdQSU9zIGJ5IGJhbmtzLCBlYWNoIGJhbmsgY292ZXJzIHVwIHRvIDMyIEdQSU9zIHdpdGgKKyAqIG9uZSBzZXQgb2YgcmVnaXN0ZXJzLiBUaGUgcmVnaXN0ZXIgb2Zmc2V0cyBhcmUgb3JnYW5pemVkIGJlbG93OgorICoKKyAqICAgICAgICAgICBHUExSICAgIEdQRFIgICAgR1BTUiAgICBHUENSICAgIEdSRVIgICAgR0ZFUiAgICBHRURSCisgKiBCQU5LIDAgLSAweDAwMDAgIDB4MDAwQyAgMHgwMDE4ICAweDAwMjQgIDB4MDAzMCAgMHgwMDNDICAweDAwNDgKKyAqIEJBTksgMSAtIDB4MDAwNCAgMHgwMDEwICAweDAwMUMgIDB4MDAyOCAgMHgwMDM0ICAweDAwNDAgIDB4MDA0QworICogQkFOSyAyIC0gMHgwMDA4ICAweDAwMTQgIDB4MDAyMCAgMHgwMDJDICAweDAwMzggIDB4MDA0NCAgMHgwMDUwCisgKgorICogQkFOSyAzIC0gMHgwMTAwICAweDAxMEMgIDB4MDExOCAgMHgwMTI0ICAweDAxMzAgIDB4MDEzQyAgMHgwMTQ4CisgKiBCQU5LIDQgLSAweDAxMDQgIDB4MDExMCAgMHgwMTFDICAweDAxMjggIDB4MDEzNCAgMHgwMTQwICAweDAxNEMKKyAqIEJBTksgNSAtIDB4MDEwOCAgMHgwMTE0ICAweDAxMjAgIDB4MDEyQyAgMHgwMTM4ICAweDAxNDQgIDB4MDE1MAorICoKKyAqIE5PVEU6CisgKiAgIEJBTksgMyBpcyBvbmx5IGF2YWlsYWJsZSBvbiBQWEEyN3ggYW5kIGxhdGVyIHByb2Nlc3NvcnMuCisgKiAgIEJBTksgNCBhbmQgNSBhcmUgb25seSBhdmFpbGFibGUgb24gUFhBOTM1CisgKi8KKworI2RlZmluZSBHUElPX0JBTksobikJKEdQSU9fUkVHU19WSVJUICsgQkFOS19PRkYobikpCisKKyNkZWZpbmUgR1BMUl9PRkZTRVQJMHgwMAorI2RlZmluZSBHUERSX09GRlNFVAkweDBDCisjZGVmaW5lIEdQU1JfT0ZGU0VUCTB4MTgKKyNkZWZpbmUgR1BDUl9PRkZTRVQJMHgyNAorI2RlZmluZSBHUkVSX09GRlNFVAkweDMwCisjZGVmaW5lIEdGRVJfT0ZGU0VUCTB4M0MKKyNkZWZpbmUgR0VEUl9PRkZTRVQJMHg0OAorCisvKiBOT1RFOiBzb21lIFBYQXMgaGF2ZSBmZXdlciBvbi1jaGlwIEdQSU9zIChsaWtlIFBYQTI1NSwgd2l0aCA4NSkuCisgKiBUaG9zZSBjYXNlcyBjdXJyZW50bHkgY2F1c2UgaG9sZXMgaW4gdGhlIEdQSU8gbnVtYmVyIHNwYWNlLCB0aGUKKyAqIGFjdHVhbCBudW1iZXIgb2YgdGhlIGxhc3QgR1BJTyBpcyByZWNvcmRlZCBieSAncHhhX2xhc3RfZ3BpbycuCisgKi8KK2V4dGVybiBpbnQgcHhhX2xhc3RfZ3BpbzsKKwordHlwZWRlZiBpbnQgKCpzZXRfd2FrZV90KShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBvbik7CisKK2V4dGVybiB2b2lkIHB4YV9pbml0X2dwaW8oaW50IG11eF9pcnEsIGludCBzdGFydCwgaW50IGVuZCwgc2V0X3dha2VfdCBmbik7CisKKyNlbmRpZiAvKiBfX1BMQVRfUFhBX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L2dwaW8uaCBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9ncGlvLmgKaW5kZXggMWRkZDJiOS4uMjU4Zjc3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L2dwaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvZ3Bpby5oCkBAIC0xLDM1ICsxLDEwIEBACiAjaWZuZGVmIF9fUExBVF9HUElPX0gKICNkZWZpbmUgX19QTEFUX0dQSU9fSAogCi1zdHJ1Y3QgaXJxX2RhdGE7CisjZGVmaW5lIF9fQVJNX0dQSU9MSUJfQ09NUExFWAogCi0vKgotICogV2UgaGFuZGxlIHRoZSBHUElPcyBieSBiYW5rcywgZWFjaCBiYW5rIGNvdmVycyB1cCB0byAzMiBHUElPcyB3aXRoCi0gKiBvbmUgc2V0IG9mIHJlZ2lzdGVycy4gVGhlIHJlZ2lzdGVyIG9mZnNldHMgYXJlIG9yZ2FuaXplZCBiZWxvdzoKLSAqCi0gKiAgICAgICAgICAgR1BMUiAgICBHUERSICAgIEdQU1IgICAgR1BDUiAgICBHUkVSICAgIEdGRVIgICAgR0VEUgotICogQkFOSyAwIC0gMHgwMDAwICAweDAwMEMgIDB4MDAxOCAgMHgwMDI0ICAweDAwMzAgIDB4MDAzQyAgMHgwMDQ4Ci0gKiBCQU5LIDEgLSAweDAwMDQgIDB4MDAxMCAgMHgwMDFDICAweDAwMjggIDB4MDAzNCAgMHgwMDQwICAweDAwNEMKLSAqIEJBTksgMiAtIDB4MDAwOCAgMHgwMDE0ICAweDAwMjAgIDB4MDAyQyAgMHgwMDM4ICAweDAwNDQgIDB4MDA1MAotICoKLSAqIEJBTksgMyAtIDB4MDEwMCAgMHgwMTBDICAweDAxMTggIDB4MDEyNCAgMHgwMTMwICAweDAxM0MgIDB4MDE0OAotICogQkFOSyA0IC0gMHgwMTA0ICAweDAxMTAgIDB4MDExQyAgMHgwMTI4ICAweDAxMzQgIDB4MDE0MCAgMHgwMTRDCi0gKiBCQU5LIDUgLSAweDAxMDggIDB4MDExNCAgMHgwMTIwICAweDAxMkMgIDB4MDEzOCAgMHgwMTQ0ICAweDAxNTAKLSAqCi0gKiBOT1RFOgotICogICBCQU5LIDMgaXMgb25seSBhdmFpbGFibGUgb24gUFhBMjd4IGFuZCBsYXRlciBwcm9jZXNzb3JzLgotICogICBCQU5LIDQgYW5kIDUgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIFBYQTkzNQotICovCi0KLSNkZWZpbmUgR1BJT19CQU5LKG4pCShHUElPX1JFR1NfVklSVCArIEJBTktfT0ZGKG4pKQotCi0jZGVmaW5lIEdQTFJfT0ZGU0VUCTB4MDAKLSNkZWZpbmUgR1BEUl9PRkZTRVQJMHgwQwotI2RlZmluZSBHUFNSX09GRlNFVAkweDE4Ci0jZGVmaW5lIEdQQ1JfT0ZGU0VUCTB4MjQKLSNkZWZpbmUgR1JFUl9PRkZTRVQJMHgzMAotI2RlZmluZSBHRkVSX09GRlNFVAkweDNDCi0jZGVmaW5lIEdFRFJfT0ZGU0VUCTB4NDgKKy8qIFRoZSBpbmRpdmlkdWFsIG1hY2hpbmUgcHJvdmlkZXMgcmVnaXN0ZXIgb2Zmc2V0cyBhbmQgTlJfQlVJTFRJTl9HUElPICovCisjaW5jbHVkZSA8bWFjaC9ncGlvLXB4YS5oPgogCiBzdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQogewpAQCAtNTIsMTMgKzI3LDQgQEAKIAogI2RlZmluZSBncGlvX2NhbnNsZWVwCQlfX2dwaW9fY2Fuc2xlZXAKIAotLyogTk9URTogc29tZSBQWEFzIGhhdmUgZmV3ZXIgb24tY2hpcCBHUElPcyAobGlrZSBQWEEyNTUsIHdpdGggODUpLgotICogVGhvc2UgY2FzZXMgY3VycmVudGx5IGNhdXNlIGhvbGVzIGluIHRoZSBHUElPIG51bWJlciBzcGFjZSwgdGhlCi0gKiBhY3R1YWwgbnVtYmVyIG9mIHRoZSBsYXN0IEdQSU8gaXMgcmVjb3JkZWQgYnkgJ3B4YV9sYXN0X2dwaW8nLgotICovCi1leHRlcm4gaW50IHB4YV9sYXN0X2dwaW87Ci0KLXR5cGVkZWYgaW50ICgqc2V0X3dha2VfdCkoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pOwotCi1leHRlcm4gdm9pZCBweGFfaW5pdF9ncGlvKGludCBtdXhfaXJxLCBpbnQgc3RhcnQsIGludCBlbmQsIHNldF93YWtlX3QgZm4pOwogI2VuZGlmIC8qIF9fUExBVF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9tZnAuaCBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9tZnAuaAppbmRleCA4OWU2OGUwLi41Yzc5YzI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvbWZwLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L21mcC5oCkBAIC00NTYsNyArNDU2LDcgQEAKIAogI2RlZmluZSBNRlBfQUREUl9FTkQJeyBNRlBfUElOX0lOVkFMSUQsIDAgfQogCi12b2lkIF9faW5pdCBtZnBfaW5pdF9iYXNlKHVuc2lnbmVkIGxvbmcgbWZwcl9iYXNlKTsKK3ZvaWQgX19pbml0IG1mcF9pbml0X2Jhc2Uodm9pZCBfX2lvbWVtICptZnByX2Jhc2UpOwogdm9pZCBfX2luaXQgbWZwX2luaXRfYWRkcihzdHJ1Y3QgbWZwX2FkZHJfbWFwICptYXApOwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L3B4YTN4eF9uYW5kLmggYi9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvcHhhM3h4X25hbmQuaAppbmRleCA0NDIzMDFmLi5jNDJmMzlmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvcHhhM3h4X25hbmQuaAorKysgYi9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvcHhhM3h4X25hbmQuaApAQCAtNDEsNiArNDEsMTkgQEAKIAlzdHJ1Y3QgcHhhM3h4X25hbmRfdGltaW5nICp0aW1pbmc7CS8qIE5BTkQgRmxhc2ggdGltaW5nICovCiB9OwogCisvKgorICogQ3VycmVudCBweGEzeHhfbmFuZCBjb250cm9sbGVyIGhhcyB0d28gY2hpcCBzZWxlY3Qgd2hpY2gKKyAqIGJvdGggYmUgd29ya2FibGUuCisgKgorICogTm90aWNlIHNob3VsZCBiZSB0YWtlbiB0aGF0OgorICogV2hlbiB5b3Ugd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlLCB5b3Ugc2hvdWxkIG5vdCBlbmFibGUgdGhlCisgKiBrZWVwIGNvbmZpZ3VyYXRpb24gZmVhdHVyZSwgZm9yIHR3byBjaGlwIHNlbGVjdCBjb3VsZCBiZQorICogYXR0YWNoZWQgd2l0aCBkaWZmZXJlbnQgbmFuZCBjaGlwLiBUaGUgZGlmZmVyZW50IHBhZ2Ugc2l6ZQorICogYW5kIHRpbWluZyByZXF1aXJlbWVudCBtYWtlIHRoZSBrZWVwIGNvbmZpZ3VyYXRpb24gaW1wb3NzaWJsZS4KKyAqLworCisvKiBUaGUgbWF4IG51bSBvZiBjaGlwIHNlbGVjdCBjdXJyZW50IHN1cHBvcnQgKi8KKyNkZWZpbmUgTlVNX0NISVBfU0VMRUNUCQkoMikKIHN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhIHsKIAogCS8qIHRoZSBkYXRhIGZsYXNoIGJ1cyBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgU3RhdGljIE1lbW9yeQpAQCAtNTIsOCArNjUsMTEgQEAKIAkvKiBhbGxvdyBwbGF0Zm9ybSBjb2RlIHRvIGtlZXAgT0JNL2Jvb3Rsb2FkZXIgZGVmaW5lZCBORkMgY29uZmlnICovCiAJaW50CWtlZXBfY29uZmlnOwogCi0JY29uc3Qgc3RydWN0IG10ZF9wYXJ0aXRpb24JCSpwYXJ0czsKLQl1bnNpZ25lZCBpbnQJCQkJbnJfcGFydHM7CisJLyogaW5kaWNhdGUgaG93IG1hbnkgY2hpcCBzZWxlY3RzIHdpbGwgYmUgdXNlZCAqLworCWludAludW1fY3M7CisKKwljb25zdCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkJKnBhcnRzW05VTV9DSElQX1NFTEVDVF07CisJdW5zaWduZWQgaW50CQkJCW5yX3BhcnRzW05VTV9DSElQX1NFTEVDVF07CiAKIAljb25zdCBzdHJ1Y3QgcHhhM3h4X25hbmRfZmxhc2ggKiAJZmxhc2g7CiAJc2l6ZV90CQkJCQludW1fZmxhc2g7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXB4YS9tZnAuYyBiL2FyY2gvYXJtL3BsYXQtcHhhL21mcC5jCmluZGV4IGJlMTJlYWQuLjJjNGRiYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtcHhhL21mcC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtcHhhL21mcC5jCkBAIC0yMjksNyArMjI5LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZnBfc3Bpbl9sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgX19pbml0IG1mcF9pbml0X2Jhc2UodW5zaWduZWQgbG9uZyBtZnByX2Jhc2UpCit2b2lkIF9faW5pdCBtZnBfaW5pdF9iYXNlKHZvaWQgX19pb21lbSAqbWZwcl9iYXNlKQogewogCWludCBpOwogCkBAIC0yMzcsNyArMjM3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZnBfdGFibGUpOyBpKyspCiAJCW1mcF90YWJsZVtpXS5jb25maWcgPSAtMTsKIAotCW1mcHJfbW1pb19iYXNlID0gKHZvaWQgX19pb21lbSAqKW1mcHJfYmFzZTsKKwltZnByX21taW9fYmFzZSA9IG1mcHJfYmFzZTsKIH0KIAogdm9pZCBfX2luaXQgbWZwX2luaXRfYWRkcihzdHJ1Y3QgbWZwX2FkZHJfbWFwICptYXApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnCmluZGV4IDhjNWIzMDIuLmQ4OTczYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnCkBAIC05LDcgKzksNiBAQAogCXNlbGVjdCBOT19JT1BPUlQKIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgUzNDX0RFVl9OQU5ECi0Jc2VsZWN0IFMzQ19HUElPX0NGR19TM0MyNFhYCiAJaGVscAogCSAgQmFzZSBwbGF0Zm9ybSBjb2RlIGZvciBhbnkgU2Ftc3VuZyBTM0MyNFhYIGRldmljZQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvTWFrZWZpbGUKaW5kZXggMDI5MWJkNi4uYjJiMDExMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9NYWtlZmlsZQpAQCAtMTQsOSArMTQsNyBAQAogCiBvYmoteQkJCQkrPSBjcHUubwogb2JqLXkJCQkJKz0gaXJxLm8KLW9iai15CQkJCSs9IGRldnMubwotb2JqLXkJCQkJKz0gZ3Bpby5vCi1vYmoteQkJCQkrPSBncGlvbGliLm8KK29iai15CQkJCSs9IGRldi11YXJ0Lm8KIG9iai15CQkJCSs9IGNsb2NrLm8KIG9iai0kKENPTkZJR19TM0MyNFhYX0RDTEspCSs9IGNsb2NrLWRjbGsubwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY3B1LmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY3B1LmMKaW5kZXggYzFmYzZjNi4uM2M2MzM1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUuYwpAQCAtMjE1LDE5ICsyMTUsMTggQEAKIAogdm9pZCBfX2luaXQgczNjMjR4eF9pbml0X2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGlkY29kZSA9IDB4MDsKLQogCS8qIGluaXRpYWxpc2UgdGhlIGlvIGRlc2NyaXB0b3JzIHdlIG5lZWQgZm9yIGluaXRpYWxpc2F0aW9uICovCiAJaW90YWJsZV9pbml0KG1hY2hfZGVzYywgc2l6ZSk7CiAJaW90YWJsZV9pbml0KHMzY19pb2Rlc2MsIEFSUkFZX1NJWkUoczNjX2lvZGVzYykpOwogCiAJaWYgKGNwdV9hcmNoaXRlY3R1cmUoKSA+PSBDUFVfQVJDSF9BUk12NSkgewotCQlpZGNvZGUgPSBzM2MyNHh4X3JlYWRfaWRjb2RlX3Y1KCk7CisJCXNhbXN1bmdfY3B1X2lkID0gczNjMjR4eF9yZWFkX2lkY29kZV92NSgpOwogCX0gZWxzZSB7Ci0JCWlkY29kZSA9IHMzYzI0eHhfcmVhZF9pZGNvZGVfdjQoKTsKKwkJc2Ftc3VuZ19jcHVfaWQgPSBzM2MyNHh4X3JlYWRfaWRjb2RlX3Y0KCk7CiAJfQorCXMzYzI0eHhfaW5pdF9jcHUoKTsKIAogCWFybV9wbV9yZXN0YXJ0ID0gczNjMjR4eF9wbV9yZXN0YXJ0OwogCi0JczNjX2luaXRfY3B1KGlkY29kZSwgY3B1X2lkcywgQVJSQVlfU0laRShjcHVfaWRzKSk7CisJczNjX2luaXRfY3B1KHNhbXN1bmdfY3B1X2lkLCBjcHVfaWRzLCBBUlJBWV9TSVpFKGNwdV9pZHMpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kZXYtdWFydC5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Rldi11YXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiMjJlNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kZXYtdWFydC5jCkBAIC0wLDAgKzEsMTAwIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2LXVhcnQuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBCYXNlIFMzQzI0WFggVUFSVCByZXNvdXJjZSBhbmQgcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgorCisvKiBTZXJpYWwgcG9ydCByZWdpc3RyYXRpb25zICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjMjQxMF91YXJ0MF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9VQVJUMCwKKwkJLmVuZCAgID0gUzNDMjQxMF9QQV9VQVJUMCArIDB4M2ZmZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9TM0NVQVJUX1JYMCwKKwkJLmVuZCAgID0gSVJRX1MzQ1VBUlRfRVJSMCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2MyNDEwX3VhcnQxX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1VBUlQxLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1VBUlQxICsgMHgzZmZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgxLAorCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzYzI0MTBfdWFydDJfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfVUFSVDIsCisJCS5lbmQgICA9IFMzQzI0MTBfUEFfVUFSVDIgKyAweDNmZmYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfUzNDVUFSVF9SWDIsCisJCS5lbmQgICA9IElSUV9TM0NVQVJUX0VSUjIsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjMjQxMF91YXJ0M19yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQ0M19QQV9VQVJUMywKKwkJLmVuZCAgID0gUzNDMjQ0M19QQV9VQVJUMyArIDB4M2ZmZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9TM0NVQVJUX1JYMywKKwkJLmVuZCAgID0gSVJRX1MzQ1VBUlRfRVJSMywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBzM2MyNHh4X3VhcnRfcmVzb3VyY2VzIHMzYzI0MTBfdWFydF9yZXNvdXJjZXNbXSBfX2luaXRkYXRhID0geworCVswXSA9IHsKKwkJLnJlc291cmNlcwk9IHMzYzI0MTBfdWFydDBfcmVzb3VyY2UsCisJCS5ucl9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzYzI0MTBfdWFydDBfcmVzb3VyY2UpLAorCX0sCisJWzFdID0geworCQkucmVzb3VyY2VzCT0gczNjMjQxMF91YXJ0MV9yZXNvdXJjZSwKKwkJLm5yX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjMjQxMF91YXJ0MV9yZXNvdXJjZSksCisJfSwKKwlbMl0gPSB7CisJCS5yZXNvdXJjZXMJPSBzM2MyNDEwX3VhcnQyX3Jlc291cmNlLAorCQkubnJfcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2MyNDEwX3VhcnQyX3Jlc291cmNlKSwKKwl9LAorCVszXSA9IHsKKwkJLnJlc291cmNlcwk9IHMzYzI0MTBfdWFydDNfcmVzb3VyY2UsCisJCS5ucl9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzYzI0MTBfdWFydDNfcmVzb3VyY2UpLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kZXZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmJmMmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYworKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2cy5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIEJhc2UgUzNDMjRYWCBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0jaW5jbHVkZSA8bWFjaC9mYi5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2RtYS5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KLSNpbmNsdWRlIDxwbGF0L3VkYy5oPgotI2luY2x1ZGUgPHBsYXQvbWNpLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotI2luY2x1ZGUgPHBsYXQvcmVncy1zcGkuaD4KLSNpbmNsdWRlIDxwbGF0L3RzLmg+Ci0KLS8qIFNlcmlhbCBwb3J0IHJlZ2lzdHJhdGlvbnMgKi8KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2MyNDEwX3VhcnQwX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1VBUlQwLAotCQkuZW5kICAgPSBTM0MyNDEwX1BBX1VBUlQwICsgMHgzZmZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgwLAotCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIwLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzYzI0MTBfdWFydDFfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0MTBfUEFfVUFSVDEsCi0JCS5lbmQgICA9IFMzQzI0MTBfUEFfVUFSVDEgKyAweDNmZmYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfUzNDVUFSVF9SWDEsCi0JCS5lbmQgICA9IElSUV9TM0NVQVJUX0VSUjEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjMjQxMF91YXJ0Ml9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9VQVJUMiwKLQkJLmVuZCAgID0gUzNDMjQxMF9QQV9VQVJUMiArIDB4M2ZmZiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9TM0NVQVJUX1JYMiwKLQkJLmVuZCAgID0gSVJRX1MzQ1VBUlRfRVJSMiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2MyNDEwX3VhcnQzX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNDQzX1BBX1VBUlQzLAotCQkuZW5kICAgPSBTM0MyNDQzX1BBX1VBUlQzICsgMHgzZmZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgzLAotCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIzLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHMzYzI0eHhfdWFydF9yZXNvdXJjZXMgczNjMjQxMF91YXJ0X3Jlc291cmNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JWzBdID0gewotCQkucmVzb3VyY2VzCT0gczNjMjQxMF91YXJ0MF9yZXNvdXJjZSwKLQkJLm5yX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjMjQxMF91YXJ0MF9yZXNvdXJjZSksCi0JfSwKLQlbMV0gPSB7Ci0JCS5yZXNvdXJjZXMJPSBzM2MyNDEwX3VhcnQxX3Jlc291cmNlLAotCQkubnJfcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2MyNDEwX3VhcnQxX3Jlc291cmNlKSwKLQl9LAotCVsyXSA9IHsKLQkJLnJlc291cmNlcwk9IHMzYzI0MTBfdWFydDJfcmVzb3VyY2UsCi0JCS5ucl9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzYzI0MTBfdWFydDJfcmVzb3VyY2UpLAotCX0sCi0JWzNdID0gewotCQkucmVzb3VyY2VzCT0gczNjMjQxMF91YXJ0M19yZXNvdXJjZSwKLQkJLm5yX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjMjQxMF91YXJ0M19yZXNvdXJjZSksCi0JfSwKLX07Ci0KLS8qIExDRCBDb250cm9sbGVyICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2xjZF9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDMjRYWF9QQV9MQ0QsCi0JCS5lbmQgICA9IFMzQzI0WFhfUEFfTENEICsgUzNDMjRYWF9TWl9MQ0QgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX0xDRCwKLQkJLmVuZCAgID0gSVJRX0xDRCwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfQotCi19OwotCi1zdGF0aWMgdTY0IHMzY19kZXZpY2VfbGNkX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9sY2QgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC1sY2QiLAotCS5pZAkJICA9IC0xLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19sY2RfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX2xjZF9yZXNvdXJjZSwKLQkuZGV2ICAgICAgICAgICAgICA9IHsKLQkJLmRtYV9tYXNrCQk9ICZzM2NfZGV2aWNlX2xjZF9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmVUwKLQl9Ci19OwotCi1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfbGNkKTsKLQotdm9pZCBfX2luaXQgczNjMjR4eF9mYl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gKnBkKQotewotCXN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvICpucGQ7Ci0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2YoKm5wZCksICZzM2NfZGV2aWNlX2xjZCk7Ci0JaWYgKG5wZCkgewotCQlucGQtPmRpc3BsYXlzID0ga21lbWR1cChwZC0+ZGlzcGxheXMsCi0JCQlzaXplb2Yoc3RydWN0IHMzYzI0MTBmYl9kaXNwbGF5KSAqIG5wZC0+bnVtX2Rpc3BsYXlzLAotCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghbnBkLT5kaXNwbGF5cykKLQkJCXByaW50ayhLRVJOX0VSUiAibm8gbWVtb3J5IGZvciBMQ0QgZGlzcGxheSBkYXRhXG4iKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIm5vIG1lbW9yeSBmb3IgTENEIHBsYXRmb3JtIGRhdGFcbiIpOwotCX0KLX0KLQotLyogVG91Y2hzY3JlZW4gKi8KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdHNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0WFhfUEFfQURDLAotCQkuZW5kICAgPSBTM0MyNFhYX1BBX0FEQyArIFMzQzI0WFhfU1pfQURDIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9UQywKLQkJLmVuZCAgID0gSVJRX1RDLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdHMgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC10cyIsCi0JLmlkCQkgID0gLTEsCi0JLmRldi5wYXJlbnQJPSAmczNjX2RldmljZV9hZGMuZGV2LAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY190c19yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfdHNfcmVzb3VyY2UsCi19OwotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3RzKTsKLQotdm9pZCBfX2luaXQgczNjMjR4eF90c19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvICpoYXJkX3MzYzI0MTB0c19pbmZvKQotewotCXMzY19zZXRfcGxhdGRhdGEoaGFyZF9zM2MyNDEwdHNfaW5mbywKLQkJCSBzaXplb2Yoc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvKSwgJnMzY19kZXZpY2VfdHMpOwotfQotCi0vKiBVU0IgRGV2aWNlIChHYWRnZXQpKi8KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdXNiZ2FkZ2V0X3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNFhYX1BBX1VTQkRFViwKLQkJLmVuZCAgID0gUzNDMjRYWF9QQV9VU0JERVYgKyBTM0MyNFhYX1NaX1VTQkRFViAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfVVNCRCwKLQkJLmVuZCAgID0gSVJRX1VTQkQsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLQotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3VzYmdhZGdldCA9IHsKLQkubmFtZQkJICA9ICJzM2MyNDEwLXVzYmdhZGdldCIsCi0JLmlkCQkgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3VzYmdhZGdldF9yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfdXNiZ2FkZ2V0X3Jlc291cmNlLAotfTsKLQotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3VzYmdhZGdldCk7Ci0KLXZvaWQgX19pbml0IHMzYzI0eHhfdWRjX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF91ZGNfbWFjaF9pbmZvICpwZCkKLXsKLQlzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2YoKnBkKSwgJnMzY19kZXZpY2VfdXNiZ2FkZ2V0KTsKLX0KLQotLyogVVNCIEhpZ2ggU3BlZWQgMi4wIERldmljZSAoR2FkZ2V0KSAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaHN1ZGNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFMzQzI0MTZfUEFfSFNVREMsCi0JCS5lbmQJPSBTM0MyNDE2X1BBX0hTVURDICsgUzNDMjQxNl9TWl9IU1VEQyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfVVNCRCwKLQkJLmVuZAk9IElSUV9VU0JELAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgdTY0IHMzY19oc3VkY19kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3VzYl9oc3VkYyA9IHsKLQkubmFtZQkJPSAiczNjLWhzdWRjIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19oc3VkY19yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX2hzdWRjX3Jlc291cmNlLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sJCT0gJnMzY19oc3VkY19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwotCi12b2lkIF9faW5pdCBzM2MyNHh4X2hzdWRjX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjR4eF9oc3VkY19wbGF0ZGF0YSAqcGQpCi17Ci0JczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKCpwZCksICZzM2NfZGV2aWNlX3VzYl9oc3VkYyk7Ci19Ci0KLS8qIElJUyAqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19paXNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0WFhfUEFfSUlTLAotCQkuZW5kICAgPSBTM0MyNFhYX1BBX0lJUyArIFMzQzI0WFhfU1pfSUlTIC0xLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9Ci19OwotCi1zdGF0aWMgdTY0IHMzY19kZXZpY2VfaWlzX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9paXMgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjR4eC1paXMiLAotCS5pZAkJICA9IC0xLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19paXNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX2lpc19yZXNvdXJjZSwKLQkuZGV2ICAgICAgICAgICAgICA9IHsKLQkJLmRtYV9tYXNrID0gJnMzY19kZXZpY2VfaWlzX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTAotCX0KLX07Ci0KLUVYUE9SVF9TWU1CT0woczNjX2RldmljZV9paXMpOwotCi0vKiBSVEMgKi8KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfcnRjX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNFhYX1BBX1JUQywKLQkJLmVuZCAgID0gUzNDMjRYWF9QQV9SVEMgKyAweGZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1JUQywKLQkJLmVuZCAgID0gSVJRX1JUQywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMl0gPSB7Ci0JCS5zdGFydCA9IElSUV9USUNLLAotCQkuZW5kICAgPSBJUlFfVElDSywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEKLQl9Ci19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfcnRjID0gewotCS5uYW1lCQkgID0gInMzYzI0MTAtcnRjIiwKLQkuaWQJCSAgPSAtMSwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfcnRjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19ydGNfcmVzb3VyY2UsCi19OwotCi1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfcnRjKTsKLQotLyogQURDICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2FkY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDMjRYWF9QQV9BREMsCi0JCS5lbmQgICA9IFMzQzI0WFhfUEFfQURDICsgUzNDMjRYWF9TWl9BREMgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1RDLAotCQkuZW5kICAgPSBJUlFfVEMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQgPSBJUlFfQURDLAotCQkuZW5kICAgPSBJUlFfQURDLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci0KLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9hZGMgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjR4eC1hZGMiLAotCS5pZAkJICA9IC0xLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19hZGNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX2FkY19yZXNvdXJjZSwKLX07Ci0KLS8qIFNESSAqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19zZGlfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0WFhfUEFfU0RJLAotCQkuZW5kICAgPSBTM0MyNFhYX1BBX1NESSArIFMzQzI0WFhfU1pfU0RJIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9TREksCi0JCS5lbmQgICA9IElSUV9TREksCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLQotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3NkaSA9IHsKLQkubmFtZQkJICA9ICJzM2MyNDEwLXNkaSIsCi0JLmlkCQkgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3NkaV9yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2Nfc2RpX3Jlc291cmNlLAotfTsKLQotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3NkaSk7Ci0KLXZvaWQgX19pbml0IHMzYzI0eHhfbWNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEgKnBkYXRhKQotewotCXMzY19zZXRfcGxhdGRhdGEocGRhdGEsIHNpemVvZihzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEpLAotCQkJICZzM2NfZGV2aWNlX3NkaSk7Ci19Ci0KLQotLyogU1BJICgwKSAqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19zcGkwX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNFhYX1BBX1NQSSwKLQkJLmVuZCAgID0gUzNDMjRYWF9QQV9TUEkgKyAweDFmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1NQSTAsCi0JCS5lbmQgICA9IElSUV9TUEkwLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV9zcGkwX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9zcGkwID0gewotCS5uYW1lCQkgID0gInMzYzI0MTAtc3BpIiwKLQkuaWQJCSAgPSAwLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19zcGkwX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19zcGkwX3Jlc291cmNlLAotICAgICAgICAuZGV2ICAgICAgICAgICAgICA9IHsKLSAgICAgICAgICAgICAgICAuZG1hX21hc2sgPSAmczNjX2RldmljZV9zcGkwX2RtYW1hc2ssCi0gICAgICAgICAgICAgICAgLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCi0gICAgICAgIH0KLX07Ci0KLUVYUE9SVF9TWU1CT0woczNjX2RldmljZV9zcGkwKTsKLQotLyogU1BJICgxKSAqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19zcGkxX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNFhYX1BBX1NQSSArIFMzQzI0MTBfU1BJMSwKLQkJLmVuZCAgID0gUzNDMjRYWF9QQV9TUEkgKyBTM0MyNDEwX1NQSTEgKyAweDFmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1NQSTEsCi0JCS5lbmQgICA9IElSUV9TUEkxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV9zcGkxX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9zcGkxID0gewotCS5uYW1lCQkgID0gInMzYzI0MTAtc3BpIiwKLQkuaWQJCSAgPSAxLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19zcGkxX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19zcGkxX3Jlc291cmNlLAotICAgICAgICAuZGV2ICAgICAgICAgICAgICA9IHsKLSAgICAgICAgICAgICAgICAuZG1hX21hc2sgPSAmczNjX2RldmljZV9zcGkxX2RtYW1hc2ssCi0gICAgICAgICAgICAgICAgLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCi0gICAgICAgIH0KLX07Ci0KLUVYUE9SVF9TWU1CT0woczNjX2RldmljZV9zcGkxKTsKLQotI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MAotCi0vKiBDYW1pZiBDb250cm9sbGVyICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2NhbWlmX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNDQwX1BBX0NBTUlGLAotCQkuZW5kICAgPSBTM0MyNDQwX1BBX0NBTUlGICsgUzNDMjQ0MF9TWl9DQU1JRiAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfQ0FNLAotCQkuZW5kICAgPSBJUlFfQ0FNLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV9jYW1pZl9kbWFtYXNrID0gMHhmZmZmZmZmZlVMOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfY2FtaWYgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQ0MC1jYW1pZiIsCi0JLmlkCQkgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2NhbWlmX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19jYW1pZl9yZXNvdXJjZSwKLQkuZGV2ICAgICAgICAgICAgICA9IHsKLQkJLmRtYV9tYXNrID0gJnMzY19kZXZpY2VfY2FtaWZfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCi0JfQotfTsKLQotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX2NhbWlmKTsKLQotLyogQUM5NyAqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19hYzk3X3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNDQwX1BBX0FDOTcsCi0JCS5lbmQgICA9IFMzQzI0NDBfUEFfQUM5NyArIFMzQzI0NDBfU1pfQUM5NyAtMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9TM0MyNDR4X0FDOTcsCi0JCS5lbmQgICA9IElSUV9TM0MyNDR4X0FDOTcsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkubmFtZSAgPSAiUENNIG91dCIsCi0JCS5zdGFydCA9IERNQUNIX1BDTV9PVVQsCi0JCS5lbmQgICA9IERNQUNIX1BDTV9PVVQsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAotCX0sCi0JWzNdID0gewotCQkubmFtZSAgPSAiUENNIGluIiwKLQkJLnN0YXJ0ID0gRE1BQ0hfUENNX0lOLAotCQkuZW5kICAgPSBETUFDSF9QQ01fSU4sCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAotCX0sCi0JWzRdID0gewotCQkubmFtZSAgPSAiTWljIGluIiwKLQkJLnN0YXJ0ID0gRE1BQ0hfTUlDX0lOLAotCQkuZW5kICAgPSBETUFDSF9NSUNfSU4sCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAotCX0sCi19OwotCi1zdGF0aWMgdTY0IHMzY19kZXZpY2VfYXVkaW9fZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2FjOTcgPSB7Ci0JLm5hbWUJCSAgPSAic2Ftc3VuZy1hYzk3IiwKLQkuaWQJCSAgPSAtMSwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfYWM5N19yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfYWM5N19yZXNvdXJjZSwKLQkuZGV2ICAgICAgICAgICAgICA9IHsKLQkJLmRtYV9tYXNrID0gJnMzY19kZXZpY2VfYXVkaW9fZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCi0JfQotfTsKLQotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX2FjOTcpOwotCi0vKiBBU29DIEkyUyAqLwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzI0MTJfZGV2aWNlX2lpcyA9IHsKLQkubmFtZQkJICA9ICJzM2MyNDEyLWlpcyIsCi0JLmlkCQkgID0gLTEsCi0JLmRldiAgICAgICAgICAgICAgPSB7Ci0JCS5kbWFfbWFzayA9ICZzM2NfZGV2aWNlX2F1ZGlvX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTAotCX0KLX07Ci0KLUVYUE9SVF9TWU1CT0woczNjMjQxMl9kZXZpY2VfaWlzKTsKLQotI2VuZGlmIC8vIENPTkZJR19DUFVfUzMyNDQwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKaW5kZXggNTM5YmQwZS4uNTM3NTRiY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKQEAgLTEwOTQsMTQgKzEwOTQsMTQgQEAKICAqCiAgKiBjb25maWd1cmUgdGhlIGRtYSBzb3VyY2UvZGVzdGluYXRpb24gaGFyZHdhcmUgdHlwZSBhbmQgYWRkcmVzcwogICoKLSAqIHNvdXJjZTogICAgUzNDMjQxMF9ETUFTUkNfSFc6IHNvdXJjZSBpcyBoYXJkd2FyZQotICogICAgICAgICAgICBTM0MyNDEwX0RNQVNSQ19NRU06IHNvdXJjZSBpcyBtZW1vcnkKKyAqIHNvdXJjZTogICAgRE1BX0ZST01fREVWSUNFOiBzb3VyY2UgaXMgaGFyZHdhcmUKKyAqICAgICAgICAgICAgRE1BX1RPX0RFVklDRTogc291cmNlIGlzIG1lbW9yeQogICoKICAqIGRldmFkZHI6ICAgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc291cmNlCiAqLwogCiBpbnQgczNjMjQxMF9kbWFfZGV2Y29uZmlnKGVudW0gZG1hX2NoIGNoYW5uZWwsCi0JCQkgIGVudW0gczNjMjQxMF9kbWFzcmMgc291cmNlLAorCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBzb3VyY2UsCiAJCQkgIHVuc2lnbmVkIGxvbmcgZGV2YWRkcikKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IHMzY19kbWFfbG9va3VwX2NoYW5uZWwoY2hhbm5lbCk7CkBAIC0xMTMxLDcgKzExMzEsNyBAQAogCSBod2NmZyB8PSBTM0MyNDEwX0RJU1JDQ19JTkM7CiAKIAlzd2l0Y2ggKHNvdXJjZSkgewotCWNhc2UgUzNDMjQxMF9ETUFTUkNfSFc6CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CiAJCS8qIHNvdXJjZSBpcyBoYXJkd2FyZSAqLwogCQlwcl9kZWJ1ZygiJXM6IGh3IHNvdXJjZSwgZGV2YWRkcj0lMDhseCwgaHdjZmc9JWRcbiIsCiAJCQkgX19mdW5jX18sIGRldmFkZHIsIGh3Y2ZnKTsKQEAgLTExNDIsNyArMTE0Miw3IEBACiAJCWNoYW4tPmFkZHJfcmVnID0gZG1hX3JlZ2FkZHIoY2hhbiwgUzNDMjQxMF9ETUFfRElEU1QpOwogCQlicmVhazsKIAotCWNhc2UgUzNDMjQxMF9ETUFTUkNfTUVNOgorCWNhc2UgRE1BX1RPX0RFVklDRToKIAkJLyogc291cmNlIGlzIG1lbW9yeSAqLwogCQlwcl9kZWJ1ZygiJXM6IG1lbSBzb3VyY2UsIGRldmFkZHI9JTA4bHgsIGh3Y2ZnPSVkXG4iLAogCQkJIF9fZnVuY19fLCBkZXZhZGRyLCBod2NmZyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzZDdjMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW8uYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDEwIFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFMzQzI0WFggR1BJTyBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8tZm5zLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KLQotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jb3JlLmg+Ci0KLS8qIGdwaW9saWIgd3JhcHBlcnMgdW50aWwgdGhlc2UgYXJlIHRvdGFsbHkgZWxpbWluYXRlZCAqLwotCi12b2lkIHMzYzI0MTBfZ3Bpb19wdWxsdXAodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKQotewotCWludCByZXQ7Ci0KLQlXQVJOX09OKHRvKTsJLyogc2hvdWxkIGJlIG5vbmUgb2YgdGhlc2UgbGVmdCAqLwotCi0JaWYgKCF0bykgewotCQkvKiBpZiBwdWxsIGlzIGVuYWJsZWQsIHRyeSBmaXJzdCB3aXRoIHVwLCBhbmQgaWYgdGhhdAotCQkgKiBmYWlscywgdHJ5IHVzaW5nIGRvd24gKi8KLQotCQlyZXQgPSBzM2NfZ3Bpb19zZXRwdWxsKHBpbiwgUzNDX0dQSU9fUFVMTF9VUCk7Ci0JCWlmIChyZXQpCi0JCQlzM2NfZ3Bpb19zZXRwdWxsKHBpbiwgUzNDX0dQSU9fUFVMTF9ET1dOKTsKLQl9IGVsc2UgewotCQlzM2NfZ3Bpb19zZXRwdWxsKHBpbiwgUzNDX0dQSU9fUFVMTF9OT05FKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19wdWxsdXApOwotCi12b2lkIHMzYzI0MTBfZ3Bpb19zZXRwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKQotewotCS8qIGRvIHRoaXMgdmlhIGdwaW9saWIgdW50aWwgYWxsIHVzZXJzIHJlbW92ZWQgKi8KLQotCWdwaW9fcmVxdWVzdChwaW4sICJ0ZW1wb3JhcnkiKTsKLQlncGlvX3NldF92YWx1ZShwaW4sIHRvKTsKLQlncGlvX2ZyZWUocGluKTsKLX0KLQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9fc2V0cGluKTsKLQotdW5zaWduZWQgaW50IHMzYzI0MTBfZ3Bpb19nZXRwaW4odW5zaWduZWQgaW50IHBpbikKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IHMzY19ncGlvbGliX2dldGNoaXAocGluKTsKLQl1bnNpZ25lZCBsb25nIG9mZnMgPSBwaW4gLSBjaGlwLT5jaGlwLmJhc2U7Ci0KLQlyZXR1cm4gX19yYXdfcmVhZGwoY2hpcC0+YmFzZSArIDB4MDQpICYgKDE8PCBvZmZzKTsKLX0KLQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9fZ2V0cGluKTsKLQotdW5zaWduZWQgaW50IHMzYzI0MTBfbW9kaWZ5X21pc2Njcih1bnNpZ25lZCBpbnQgY2xlYXIsIHVuc2lnbmVkIGludCBjaGFuZ2UpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIG1pc2NjcjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQltaXNjY3IgPSBfX3Jhd19yZWFkbChTM0MyNFhYX01JU0NDUik7Ci0JbWlzY2NyICY9IH5jbGVhcjsKLQltaXNjY3IgXj0gY2hhbmdlOwotCV9fcmF3X3dyaXRlbChtaXNjY3IsIFMzQzI0WFhfTUlTQ0NSKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gbWlzY2NyOwotfQotCi1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfbW9kaWZ5X21pc2Njcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpb2xpYi5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW9saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzYjY0MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpb2xpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvbGliLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogUzNDMjRYWCBHUElPbGliIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCi0jaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy1oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxwbGF0L3BtLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotCi1zdGF0aWMgaW50IHMzYzI0eHhfZ3Bpb2xpYl9iYW5rYV9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmthX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19ncGlvKGNoaXApOwotCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGRhdDsKLQl1bnNpZ25lZCBsb25nIGNvbjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyAweDAwKTsKLQlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwNCk7Ci0KLQlkYXQgJj0gfigxIDw8IG9mZnNldCk7Ci0JaWYgKHZhbHVlKQotCQlkYXQgfD0gMSA8PCBvZmZzZXQ7Ci0KLQlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7Ci0KLQljb24gJj0gfigxIDw8IG9mZnNldCk7Ci0KLQlfX3Jhd193cml0ZWwoY29uLCBiYXNlICsgMHgwMCk7Ci0JX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIDB4MDQpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHMzYzI0eHhfZ3Bpb2xpYl9iYW5rZl90b2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JaWYgKG9mZnNldCA8IDQpCi0JCXJldHVybiBJUlFfRUlOVDAgKyBvZmZzZXQ7Ci0JCi0JaWYgKG9mZnNldCA8IDgpCi0JCXJldHVybiBJUlFfRUlOVDQgKyBvZmZzZXQgLSA0OwotCQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBzM2MyNHh4X2dwaW9jZmdfYmFua2EgPSB7Ci0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eF9hLAotCS5nZXRfY29uZmlnCT0gczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHhfYSwKLX07Ci0KLXN0cnVjdCBzM2NfZ3Bpb19jZmcgczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQgPSB7Ci0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eCwKLQkuZ2V0X2NvbmZpZwk9IHMzY19ncGlvX2dldGNmZ19zM2MyNHh4LAotfTsKLQotc3RydWN0IHMzY19ncGlvX2NoaXAgczNjMjR4eF9ncGlvc1tdID0gewotCVswXSA9IHsKLQkJLmJhc2UJPSBTM0MyNDEwX0dQQUNPTiwKLQkJLnBtCT0gX19ncGlvX3BtKCZzM2NfZ3Bpb19wbV8xYml0KSwKLQkJLmNvbmZpZwk9ICZzM2MyNHh4X2dwaW9jZmdfYmFua2EsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BBKDApLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9BIiwKLQkJCS5uZ3BpbwkJCT0gMjQsCi0JCQkuZGlyZWN0aW9uX2lucHV0CT0gczNjMjR4eF9ncGlvbGliX2JhbmthX2lucHV0LAotCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBzM2MyNHh4X2dwaW9saWJfYmFua2Ffb3V0cHV0LAotCQl9LAotCX0sCi0JWzFdID0gewotCQkuYmFzZQk9IFMzQzI0MTBfR1BCQ09OLAotCQkucG0JPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzJiaXQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCQkJPSBTM0MyNDEwX0dQQigwKSwKLQkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCQkubGFiZWwJCQk9ICJHUElPQiIsCi0JCQkubmdwaW8JCQk9IDE2LAotCQl9LAotCX0sCi0JWzJdID0gewotCQkuYmFzZQk9IFMzQzI0MTBfR1BDQ09OLAotCQkucG0JPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzJiaXQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCQkJPSBTM0MyNDEwX0dQQygwKSwKLQkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCQkubGFiZWwJCQk9ICJHUElPQyIsCi0JCQkubmdwaW8JCQk9IDE2LAotCQl9LAotCX0sCi0JWzNdID0gewotCQkuYmFzZQk9IFMzQzI0MTBfR1BEQ09OLAotCQkucG0JPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzJiaXQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCQkJPSBTM0MyNDEwX0dQRCgwKSwKLQkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCQkubGFiZWwJCQk9ICJHUElPRCIsCi0JCQkubmdwaW8JCQk9IDE2LAotCQl9LAotCX0sCi0JWzRdID0gewotCQkuYmFzZQk9IFMzQzI0MTBfR1BFQ09OLAotCQkucG0JPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzJiaXQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCQkJPSBTM0MyNDEwX0dQRSgwKSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9FIiwKLQkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCQkubmdwaW8JCQk9IDE2LAotCQl9LAotCX0sCi0JWzVdID0gewotCQkuYmFzZQk9IFMzQzI0MTBfR1BGQ09OLAotCQkucG0JPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzJiaXQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCQkJPSBTM0MyNDEwX0dQRigwKSwKLQkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCQkubGFiZWwJCQk9ICJHUElPRiIsCi0JCQkubmdwaW8JCQk9IDgsCi0JCQkudG9faXJxCQkJPSBzM2MyNHh4X2dwaW9saWJfYmFua2ZfdG9pcnEsCi0JCX0sCi0JfSwKLQlbNl0gPSB7Ci0JCS5iYXNlCT0gUzNDMjQxMF9HUEdDT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UOCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQkJCT0gUzNDMjQxMF9HUEcoMCksCi0JCQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCQkJLmxhYmVsCQkJPSAiR1BJT0ciLAotCQkJLm5ncGlvCQkJPSAxNiwKLQkJCS50b19pcnEJCQk9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzI0MTBfR1BIQ09OLAotCQkucG0JPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzJiaXQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCQkJPSBTM0MyNDEwX0dQSCgwKSwKLQkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCQkubGFiZWwJCQk9ICJHUElPSCIsCi0JCQkubmdwaW8JCQk9IDExLAotCQl9LAotCX0sCi0JCS8qIEdQSU9TIGZvciB0aGUgUzNDMjQ0MyBhbmQgbGF0ZXIgZGV2aWNlcy4gKi8KLQl7Ci0JCS5iYXNlCT0gUzNDMjQ0MF9HUEpDT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BKKDApLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9KIiwKLQkJCS5uZ3BpbwkJCT0gMTYsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzI0NDNfR1BLQ09OLAotCQkucG0JPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzJiaXQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCQkJPSBTM0MyNDEwX0dQSygwKSwKLQkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCQkubGFiZWwJCQk9ICJHUElPSyIsCi0JCQkubmdwaW8JCQk9IDE2LAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0MyNDQzX0dQTENPTiwKLQkJLnBtCT0gX19ncGlvX3BtKCZzM2NfZ3Bpb19wbV8yYml0KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQkJCT0gUzNDMjQxMF9HUEwoMCksCi0JCQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCQkJLmxhYmVsCQkJPSAiR1BJT0wiLAotCQkJLm5ncGlvCQkJPSAxNSwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDMjQ0M19HUE1DT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BNKDApLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9NIiwKLQkJCS5uZ3BpbwkJCT0gMiwKLQkJfSwKLQl9LAotfTsKLQotCi1zdGF0aWMgX19pbml0IGludCBzM2MyNHh4X2dwaW9saWJfaW5pdCh2b2lkKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gczNjMjR4eF9ncGlvczsKLQlpbnQgZ3BuOwotCi0JZm9yIChncG4gPSAwOyBncG4gPCBBUlJBWV9TSVpFKHMzYzI0eHhfZ3Bpb3MpOyBncG4rKywgY2hpcCsrKSB7Ci0JCWlmICghY2hpcC0+Y29uZmlnKQotCQkJY2hpcC0+Y29uZmlnID0gJnMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0OwotCi0JCXMzY19ncGlvbGliX2FkZChjaGlwKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotY29yZV9pbml0Y2FsbChzM2MyNHh4X2dwaW9saWJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvbWFjaC9jbGtkZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmZmE4My4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaWZuZGVmIF9fTUFDSF9DTEtERVZfSF9fCi0jZGVmaW5lIF9fTUFDSF9DTEtERVZfSF9fCi0KLSNkZWZpbmUgX19jbGtfZ2V0KGNsaykgKHsgMTsgfSkKLSNkZWZpbmUgX19jbGtfcHV0KGNsaykgZG8ge30gd2hpbGUgKDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODdkZTIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFMzQzI0eHggLSBwd20gY2xvY2sgYW5kIHRpbWVyIHN1cHBvcnQKLSAqLwotCi0vKioKLSAqIHB3bV9jZmdfc3JjX2lzX3RjbGsoKSAtIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtdXggY29uZmlnIGlzIGEgdGNsawotICogQGNmZzogVGhlIHRpbWVyIFRDRkcxIHJlZ2lzdGVyIGJpdHMgc2hpZnRlZCBkb3duIHRvIDAuCi0gKgotICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZnJvbSBUQ0ZHMSBpcyBhIFRDTEsgaW5zdGVhZAotICogYW55IG9mIHRoZSBURElWIGNsb2Nrcy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHdtX2NmZ19zcmNfaXNfdGNsayh1bnNpZ25lZCBsb25nIHRjZmcpCi17Ci0JcmV0dXJuIHRjZmcgPT0gUzNDMjQxMF9UQ0ZHMV9NVVhfVENMSzsKLX0KLQotLyoqCi0gKiB0Y2ZnX3RvX2Rpdmlzb3IoKSAtIGNvbnZlcnQgdGNmZzEgc2V0dGluZyB0byBhIGRpdmlzb3IKLSAqIEB0Y2ZnMTogVGhlIHRjZmcxIHNldHRpbmcsIHNoaWZ0ZWQgZG93bi4KLSAqCi0gKiBHZXQgdGhlIGRpdmlzb3IgdmFsdWUgZm9yIHRoZSBnaXZlbiB0Y2ZnMSBzZXR0aW5nLiBXZSBhc3N1bWUgdGhlCi0gKiBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0byBzZWUgaWYgdGhpcyBpcyBub3QgYSBUQ0xLIHNvdXJjZS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRjZmdfdG9fZGl2aXNvcih1bnNpZ25lZCBsb25nIHRjZmcxKQotewotCXJldHVybiAxIDw8ICgxICsgdGNmZzEpOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2hhc19kaXYxKCkgLSBkb2VzIHRoZSB0ZGl2IHNldHRpbmcgaGF2ZSBhIC8xCi0gKgotICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhIC8xIGluIHRoZSB0ZGl2IHNldHRpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHB3bV90ZGl2X2hhc19kaXYxKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogcHdtX3RkaXZfZGl2X2JpdHMoKSAtIGNhbGN1bGF0ZSBUQ0ZHMSBkaXZpc29yIHZhbHVlLgotICogQGRpdjogVGhlIGRpdmlzb3IgdG8gY2FsY3VsYXRlIHRoZSBiaXQgaW5mb3JtYXRpb24gZm9yLgotICoKLSAqIFR1cm4gYSBkaXZpc29yIGludG8gdGhlIG5lY2Vzc2FyeSBiaXQgZmllbGQgZm9yIFRDRkcxLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHdtX3RkaXZfZGl2X2JpdHModW5zaWduZWQgaW50IGRpdikKLXsKLQlyZXR1cm4gaWxvZzIoZGl2KSAtIDE7Ci19Ci0KLSNkZWZpbmUgUzNDX1RDRkcxX01VWF9UQ0xLIFMzQzI0MTBfVENGRzFfTVVYX1RDTEsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvYXVkaW8tc2ltdGVjLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2F1ZGlvLXNpbXRlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTVlODhmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvYXVkaW8tc2ltdGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBhcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2F1ZGlvLXNpbXRlYy5oCi0gKgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogU2ltdGVjIEF1ZGlvIHN1cHBvcnQuCi0qLwotCi0vKioKLSAqIHN0cnVjdCBzM2MyNHh4X2F1ZGlvX3NpbXRlY19wZGF0YSAtIHBsYXRmb3JtIGRhdGEgZm9yIHNpbXRlYyBhdWRpbwotICogQHVzZV9tcGxsaW46IFNlbGVjdCBjb2RlYyBjbG9jayBmcm9tIE1QTExpbgotICogQG91dHB1dF9jZGNsazogTmVlZCB0byBvdXRwdXQgQ0RDTEsgdG8gdGhlIGNvZGVjCi0gKiBAaGF2ZV9taWM6IFNldCBpZiB3ZSBoYXZlIGEgTUlDIHNvY2tldAotICogQGhhdmVfbG91dDogU2V0IGlmIHdlIGhhdmUgYSBMaW5lT3V0IHNvY2tldAotICogQGFtcF9ncGlvOiBHUElPIHBpbiB0byBlbmFibGUgdGhlIEFNUAotICogQGFtcF9nYWluOiBPcHRpb24gR1BJTyB0byBjb250cm9sIEFNUCBnYWluCi0gKi8KLXN0cnVjdCBzM2MyNHh4X2F1ZGlvX3NpbXRlY19wZGF0YSB7Ci0JdW5zaWduZWQgaW50CXVzZV9tcGxsaW46MTsKLQl1bnNpZ25lZCBpbnQJb3V0cHV0X2NkY2xrOjE7Ci0KLQl1bnNpZ25lZCBpbnQJaGF2ZV9taWM6MTsKLQl1bnNpZ25lZCBpbnQJaGF2ZV9sb3V0OjE7Ci0KLQlpbnQJCWFtcF9ncGlvOwotCWludAkJYW1wX2dhaW5bMl07Ci0KLQl2b2lkCSgqc3RhcnR1cCkodm9pZCk7Ci19OwotCi1leHRlcm4gaW50IHNpbXRlY19hdWRpb19hZGQoY29uc3QgY2hhciAqY29kZWNfbmFtZSwgYm9vbCBoYXNfbHJfcm91dGluZywKLQkJCSAgICBzdHJ1Y3QgczNjMjR4eF9hdWRpb19zaW10ZWNfcGRhdGEgKnBkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY29tbW9uLXNtZGsuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY29tbW9uLXNtZGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkOTA5NC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2NvbW1vbi1zbWRrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L2NvbW1vbi1zbWRrLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogQ29tbW9uIGNvZGUgZm9yIFNNREsyNDEwIGFuZCBTTURLMjQ0MCBib2FyZHMKLSAqCi0gKiBodHRwOi8vd3d3LmZsdWZmLm9yZy9iZW4vc21kazI0NDAvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLWV4dGVybiB2b2lkIHNtZGtfbWFjaGluZV9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9jcHUtZnJlcS1jb3JlLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2NwdS1mcmVxLWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYyMzIzNS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2NwdS1mcmVxLWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKiBhcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvY3B1LWZyZXEuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IFNpbXRlYyBFbGVjdHJvbmljcwotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBTM0MgQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIHN1cHBvcnQgLSBjb3JlIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPHBsYXQvY3B1LWZyZXEuaD4KLQotc3RydWN0IHNlcV9maWxlOwotCi0jZGVmaW5lIE1BWF9CQU5LUyAoOCkKLSNkZWZpbmUgUzNDMjQxMl9NQVhfSU8JKDgpCi0KLS8qKgotICogc3RydWN0IHMzYzI0MTBfaW9iYW5rX3RpbWluZyAtIElPIGJhbmsgdGltaW5ncyBmb3IgUzNDMjQxMCBzdHlsZSB0aW1pbmdzCi0gKiBAYmFua2NvbjogVGhlIGNhY2hlZCB2ZXJzaW9uIG9mIHNldHRpbmdzIGluIHRoaXMgc3RydWN0dXJlLgotICogQHRhY3A6Ci0gKiBAdGFjczogVGltZSBmcm9tIGFkZHJlc3MgdmFsaWQgdG8gbkNTIGFzc2VydGVkLgotICogQHRjb3M6IFRpbWUgZnJvbSBuQ1MgYXNzZXJ0ZWQgdG8gbk9FIG9yIG5XRSBhc3NlcnRlZC4KLSAqIEB0YWNjOiBUaW1lIHRoYXQgbk9FIG9yIG5XRSBpcyBhc3NlcnRlZC4KLSAqIEB0Y29oOiBUaW1lIG5DUyBpcyBoZWxkIGFmdGVyIG5PRSBvciBuV0UgYXJlIHJlbGVhc2VkLgotICogQHRjYWg6IFRpbWUgYWRkcmVzcyBpcyBoZWxkIGZvciBhZnRlcgotICogQG53YWl0X2VuOiBXaGV0aGVyIG5XQUlUIGlzIGVuYWJsZWQgZm9yIHRoaXMgYmFuay4KLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBJTyB0aW1pbmdzIGZvciBhIFMzQzI0MTAgc3R5bGUgSU8gYmFuawotICogdXNlZCBieSB0aGUgQ1BVIGZyZXF1ZW5jeSBzdXBwb3J0IGlmIGl0IG5lZWRzIHRvIGNoYW5nZSB0aGUgc2V0dGluZ3MKLSAqIG9mIHRoZSBJTy4KLSAqLwotc3RydWN0IHMzYzI0MTBfaW9iYW5rX3RpbWluZyB7Ci0JdW5zaWduZWQgbG9uZwliYW5rY29uOwotCXVuc2lnbmVkIGludAl0YWNwOwotCXVuc2lnbmVkIGludAl0YWNzOwotCXVuc2lnbmVkIGludAl0Y29zOwotCXVuc2lnbmVkIGludAl0YWNjOwotCXVuc2lnbmVkIGludAl0Y29oOwkJLyogbkNTIGhvbGQgYWZyZXIgbk9FL25XRSAqLwotCXVuc2lnbmVkIGludAl0Y2FoOwkJLyogQWRkcmVzcyBob2xkIGFmdGVyIG5DUyAqLwotCXVuc2lnbmVkIGNoYXIJbndhaXRfZW47CS8qIG5XYWl0IGVuYWJsZWQgZm9yIGJhbmsuICovCi19OwotCi0vKioKLSAqIHN0cnVjdCBzM2MyNDEyX2lvYmFua190aW1pbmcgLSBpbyB0aW1pbmdzIGZvciBQTDA5MiAoUzNDMjQxMikgc3R5bGUgSU8KLSAqIEBpZGN5OiBUaGUgaWRsZSBjeWNsZSB0aW1lIGJldHdlZW4gdHJhbnNhY3Rpb25zLgotICogQHdzdHJkOiBuQ1MgcmVsZWFzZSB0byBlbmQgb2YgcmVhZCBjeWNsZS4KLSAqIEB3c3R3cjogbkNTIHJlbGVhc2UgdG8gZW5kIG9mIHdyaXRlIGN5Y2xlLgotICogQHdzdG9lbjogbkNTIGFzc2VydGlvbiB0byBuT0UgYXNzZXJ0aW9uIHRpbWUuCi0gKiBAd3N0d2VuOiBuQ1MgYXNzZXJ0aW9uIHRvIG5XRSBhc3NlcnRpb24gdGltZS4KLSAqIEB3c3RicmQ6IEJ1cnN0IHJlYWR5IGRlbGF5LgotICogQHNtYmlkY3lyOiBSZWdpc3RlciBjYWNoZSBmb3Igc21iaWRjeXIgdmFsdWUuCi0gKiBAc21id3N0cmQ6IFJlZ2lzdGVyIGNhY2hlIGZvciBzbWJ3c3RyZCB2YWx1ZS4KLSAqIEBzbWJ3c3R3cjogUmVnaXN0ZXIgY2FjaGUgZm9yIHNtYndzdHdyIHZhbHVlLgotICogQHNtYndzdG9lbjogUmVnaXN0ZXIgY2FjaGUgZm9yIHNtYndzdG9lbiB2YWx1ZS4KLSAqIEBzbWJ3c3R3ZW46IFJlZ2lzdGVyIGNhY2hlIGZvciBzbWJ3c3R3ZW4gdmFsdWUuCi0gKiBAc21id3N0YnJkOiBSZWdpc3RlciBjYWNoZSBmb3Igc21id3N0YnJkIHZhbHVlLgotICoKLSAqIFRpbWluZyBpbmZvcm1hdGlvbiBmb3IgYSBJTyBiYW5rIG9uIGFuIFMzQzI0MTIgb3Igc2ltaWxhciBzeXN0ZW0gd2hpY2gKLSAqIHVzZXMgYSBQTDA5MyBibG9jay4KLSAqLwotc3RydWN0IHMzYzI0MTJfaW9iYW5rX3RpbWluZyB7Ci0JdW5zaWduZWQgaW50CWlkY3k7Ci0JdW5zaWduZWQgaW50CXdzdHJkOwotCXVuc2lnbmVkIGludAl3c3R3cjsKLQl1bnNpZ25lZCBpbnQJd3N0b2VuOwotCXVuc2lnbmVkIGludAl3c3R3ZW47Ci0JdW5zaWduZWQgaW50CXdzdGJyZDsKLQotCS8qIHJlZ2lzdGVyIGNhY2hlICovCi0JdW5zaWduZWQgY2hhcglzbWJpZGN5cjsKLQl1bnNpZ25lZCBjaGFyCXNtYndzdHJkOwotCXVuc2lnbmVkIGNoYXIJc21id3N0d3I7Ci0JdW5zaWduZWQgY2hhcglzbWJ3c3RvZW47Ci0JdW5zaWduZWQgY2hhcglzbWJ3c3R3ZW47Ci0JdW5zaWduZWQgY2hhcglzbWJ3c3RicmQ7Ci19OwotCi11bmlvbiBzM2NfaW9iYW5rIHsKLQlzdHJ1Y3QgczNjMjQxMF9pb2JhbmtfdGltaW5nCSppb18yNDEwOwotCXN0cnVjdCBzM2MyNDEyX2lvYmFua190aW1pbmcJKmlvXzI0MTI7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBzM2NfaW90aW1pbmdzIC0gQ2hpcCBJTyB0aW1pbmdzIGhvbGRlcgotICogQGJhbms6IFRoZSB0aW1pbmdzIGZvciBlYWNoIElPIGJhbmsuCi0gKi8KLXN0cnVjdCBzM2NfaW90aW1pbmdzIHsKLQl1bmlvbiBzM2NfaW9iYW5rCWJhbmtbTUFYX0JBTktTXTsKLX07Ci0KLS8qKgotICogc3RydWN0IHMzY19wbGx0YWIgLSBQTEwgdGFibGUgaW5mb3JtYXRpb24uCi0gKiBAdmFsczogTGlzdCBvZiBQTEwgdmFsdWVzLgotICogQHNpemU6IFNpemUgb2YgdGhlIFBMTCB0YWJsZSBAdmFscy4KLSAqLwotc3RydWN0IHMzY19wbGx0YWIgewotCXN0cnVjdCBzM2NfcGxsdmFsCSp2YWxzOwotCWludAkJCSBzaXplOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnIC0gY3VycmVudCBjcHUgZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24KLSAqIEBmcmVxOiBUaGUgY3VycmVudCBzZXR0aW5ncyBmb3IgdGhlIGNvcmUgY2xvY2tzLgotICogQG1heDogTWF4aXVtIHNldHRpbmdzLCBkZXJpdmVkIGZyb20gY29yZSwgYm9hcmQgYW5kIHVzZXIgc2V0dGluZ3MuCi0gKiBAcGxsOiBUaGUgUExMIHRhYmxlIGVudHJ5IGZvciB0aGUgY3VycmVudCBQTEwgc2V0dGluZ3MuCi0gKiBAZGl2czogVGhlIGRpdmlzb3Igc2V0dGluZ3MgZm9yIHRoZSBjb3JlIGNsb2Nrcy4KLSAqIEBpbmZvOiBUaGUgY3VycmVudCBjb3JlIGRyaXZlciBpbmZvcm1hdGlvbi4KLSAqIEBib2FyZDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYm9hcmQgd2UgYXJlIHJ1bm5pbmcgb24uCi0gKiBAbG9ja19wbGw6IFNldCBpZiB0aGUgUExMIHNldHRpbmdzIGNhbm5vdCBiZSBjaGFuZ2VkLgotICoKLSAqIFRoaXMgaXMgZm9yIHRoZSBjb3JlIGRyaXZlcnMgdGhhdCBuZWVkIHRvIGtub3cgaW5mb3JtYXRpb24gYWJvdXQKLSAqIHRoZSBjdXJyZW50IHNldHRpbmdzIGFuZCB2YWx1ZXMuIEl0IHNob3VsZCBub3QgYmUgbmVlZGVkIGJ5IGFueQotICogZGV2aWNlIGRyaXZlcnMuCi0qLwotc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyB7Ci0Jc3RydWN0IHMzY19mcmVxCQlmcmVxOwotCXN0cnVjdCBzM2NfZnJlcQkJbWF4OwotCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBwbGw7Ci0Jc3RydWN0IHMzY19jbGtkaXZzCWRpdnM7Ci0Jc3RydWN0IHMzY19jcHVmcmVxX2luZm8gKmluZm87CS8qIGZvciBjb3JlLCBub3QgZHJpdmVycyAqLwotCXN0cnVjdCBzM2NfY3B1ZnJlcV9ib2FyZCAqYm9hcmQ7Ci0KLQl1bnNpZ25lZCBpbnQJbG9ja19wbGw6MTsKLX07Ci0KLS8qKgotICogc3RydWN0IHMzY19jcHVmcmVxX2luZm8gLSBJbmZvcm1hdGlvbiBmb3IgdGhlIENQVSBmcmVxdWVuY3kgZHJpdmVyLgotICogQG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgaW1wbGVtZW50YXRpb24uCi0gKiBAbWF4OiBUaGUgbWF4aW11bSBmcmVxdWVuY2llcyBmb3IgdGhlIHN5c3RlbS4KLSAqIEBsYXRlbmN5OiBUcmFuc2l0aW9uIGxhdGVuY3kgdG8gZ2l2ZSB0byBjcHVmcmVxLgotICogQGxvY2t0aW1lX206IFRoZSBsb2NrLXRpbWUgaW4gdVMgZm9yIHRoZSBNUExMLgotICogQGxvY2t0aW1lX3U6IFRoZSBsb2NrLXRpbWUgaW4gdVMgZm9yIHRoZSBVUExMLgotICogQGxvY3R0aW1lX2JpdHM6IFRoZSBudW1iZXIgb2YgYml0cyBlYWNoIExPQ0tUSU1FIGZpZWxkLgotICogQG5lZWRfcGxsOiBTZXQgaWYgdGhpcyBkcml2ZXIgbmVlZHMgdG8gY2hhbmdlIHRoZSBQTEwgdmFsdWVzIHRvIGFjaGlldmUKLSAqCWFueSBmcmVxdWVuY3kgY2hhbmdlcy4gVGhpcyBpcyByZWFsbHkgb25seSBuZWVkIGJ5IGRldmljZXMgbGlrZSB0aGUKLSAqCVMzQzI0MTAgd2hlcmUgdGhlcmUgaXMgbm8gb3IgbGltaXRlZCBkaXZpZGVyIGJldHdlZW4gdGhlIFBMTCBhbmQgdGhlCi0gKglBUk1DTEsuCi0gKiBAcmVzdW1lX2Nsb2NrczogVXBkYXRlIHRoZSBjbG9ja3Mgb24gcmVzdW1lLgotICogQGdldF9pb3RpbWluZzogR2V0IHRoZSBjdXJyZW50IElPIHRpbWluZyBkYXRhLCBtYWlubHkgZm9yIHVzZSBhdCBzdGFydC4KLSAqIEBzZXRfaW90aW1pbmc6IFVwZGF0ZSB0aGUgSU8gdGltaW5ncyBmcm9tIHRoZSBjYWNoZWQgY29waWVzIGNhbGN1bGF0ZWQKLSAqCWZyb20gdGhlIEBjYWxjX2lvdGltaW5nIGVudHJ5IHdoZW4gY2hhbmdpbmcgdGhlIGZyZXF1ZW5jeS4KLSAqIEBjYWxjX2lvdGltaW5nOiBDYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgY2FjaGVkIGNvcGllcyBvZiB0aGUgSU8gdGltaW5ncwotICoJZnJvbSB0aGUgbmV3bHkgY2FsY3VsYXRlZCBmcmVxdWVuY2llcy4KLSAqIEBjYWxjX2ZyZXF0YWJsZTogQ2FsY3VsYXRlIChmaWxsIGluKSB0aGUgZ2l2ZW4gZnJlcXVlbmN5IHRhYmxlIGZyb20gdGhlCi0gKgljdXJyZW50IGZyZXF1ZW5jeSBjb25maWd1cmF0aW9uLiBJZiB0aGUgdGFibGUgcGFzc2VkIGluIGlzIE5VTEwsCi0gKgl0aGVuIHRoZSByZXR1cm4gaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBiZSBmaWxsZWQgZm9yIGFsbG9jYXRpb24KLSAqCW9mIHRoZSB0YWJsZS4KLSAqIEBzZXRfcmVmcmVzaDogU2V0IHRoZSBtZW1vcnkgcmVmcmVzaCBjb25maWd1cmF0aW9uLgotICogQHNldF9mdmNvOiBTZXQgdGhlIFBMTCBmcmVxdWVuY2llcy4KLSAqIEBzZXRfZGl2czogVXBkYXRlIHRoZSBjbG9jayBkaXZpc29ycy4KLSAqIEBjYWxjX2RpdnM6IENhbGN1bGF0ZSB0aGUgY2xvY2sgZGl2aXNvcnMuCi0gKi8KLXN0cnVjdCBzM2NfY3B1ZnJlcV9pbmZvIHsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQlzdHJ1Y3QgczNjX2ZyZXEJCW1heDsKLQotCXVuc2lnbmVkIGludAkJbGF0ZW5jeTsKLQotCXVuc2lnbmVkIGludAkJbG9ja3RpbWVfbTsKLQl1bnNpZ25lZCBpbnQJCWxvY2t0aW1lX3U7Ci0JdW5zaWduZWQgY2hhcgkJbG9ja3RpbWVfYml0czsKLQotCXVuc2lnbmVkIGludAkJbmVlZF9wbGw6MTsKLQotCS8qIGRyaXZlciByb3V0aW5lcyAqLwotCi0Jdm9pZAkJKCpyZXN1bWVfY2xvY2tzKSh2b2lkKTsKLQotCWludAkJKCpnZXRfaW90aW1pbmcpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOwotCi0Jdm9pZAkJKCpzZXRfaW90aW1pbmcpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOwotCi0JaW50CQkoKmNhbGNfaW90aW1pbmcpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICp0aW1pbmdzKTsKLQotCWludAkJKCpjYWxjX2ZyZXF0YWJsZSkoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAotCQkJCQkgIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdCwKLQkJCQkJICBzaXplX3QgdGFibGVfc2l6ZSk7Ci0KLQl2b2lkCQkoKmRlYnVnX2lvX3Nob3cpKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAotCQkJCQkgc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAotCQkJCQkgdW5pb24gczNjX2lvYmFuayAqaW9iKTsKLQotCXZvaWQJCSgqc2V0X3JlZnJlc2gpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7Ci0Jdm9pZAkJKCpzZXRfZnZjbykoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnKTsKLQl2b2lkCQkoKnNldF9kaXZzKShzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcpOwotCWludAkJKCpjYWxjX2RpdnMpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7Ci19OwotCi1leHRlcm4gaW50IHMzY19jcHVmcmVxX3JlZ2lzdGVyKHN0cnVjdCBzM2NfY3B1ZnJlcV9pbmZvICppbmZvKTsKLQotZXh0ZXJuIGludCBzM2NfcGxsdGFiX3JlZ2lzdGVyKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcGxscywgdW5zaWduZWQgaW50IHBsbHNfbm8pOwotCi0vKiBleHBvcnRzIGFuZCB1dGlsaXRpZXMgZm9yIGRlYnVnZnMgKi8KLWV4dGVybiBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpzM2NfY3B1ZnJlcV9nZXRjb25maWcodm9pZCk7Ci1leHRlcm4gc3RydWN0IHMzY19pb3RpbWluZ3MgKnMzY19jcHVmcmVxX2dldGlvdGltaW5ncyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxMF9pb3RpbWluZ19kZWJ1Z2ZzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAotCQkJCSAgICAgc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAotCQkJCSAgICAgdW5pb24gczNjX2lvYmFuayAqaW9iKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxMl9pb3RpbWluZ19kZWJ1Z2ZzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAotCQkJCSAgICAgc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAotCQkJCSAgICAgdW5pb24gczNjX2lvYmFuayAqaW9iKTsKLQotI2lmZGVmIENPTkZJR19DUFVfRlJFUV9TM0MyNFhYX0RFQlVHRlMKLSNkZWZpbmUgczNjX2NwdWZyZXFfZGVidWdmc19jYWxsKHgpIHgKLSNlbHNlCi0jZGVmaW5lIHMzY19jcHVmcmVxX2RlYnVnZnNfY2FsbCh4KSBOVUxMCi0jZW5kaWYKLQotLyogVXNlZnVsIHV0aWxpdHkgZnVuY3Rpb25zLiAqLwotCi1leHRlcm4gc3RydWN0IGNsayAqczNjX2NwdWZyZXFfY2xrX2dldChzdHJ1Y3QgZGV2aWNlICosIGNvbnN0IGNoYXIgKik7Ci0KLS8qIFMzQzI0MTAgYW5kIGNvbXBhdGlibGUgZXhwb3J0ZWQgZnVuY3Rpb25zICovCi0KLWV4dGVybiB2b2lkIHMzYzI0MTBfY3B1ZnJlcV9zZXRyZWZyZXNoKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7Ci1leHRlcm4gdm9pZCBzM2MyNDEwX3NldF9mdmNvKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7Ci0KLSNpZmRlZiBDT05GSUdfUzNDMjQxMF9JT1RJTUlORwotZXh0ZXJuIGludCBzM2MyNDEwX2lvdGltaW5nX2NhbGMoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAotCQkJCSBzdHJ1Y3QgczNjX2lvdGltaW5ncyAqaW90KTsKLQotZXh0ZXJuIGludCBzM2MyNDEwX2lvdGltaW5nX2dldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOwotCi1leHRlcm4gdm9pZCBzM2MyNDEwX2lvdGltaW5nX3NldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICppb3QpOwotI2Vsc2UKLSNkZWZpbmUgczNjMjQxMF9pb3RpbWluZ19jYWxjIE5VTEwKLSNkZWZpbmUgczNjMjQxMF9pb3RpbWluZ19nZXQgTlVMTAotI2RlZmluZSBzM2MyNDEwX2lvdGltaW5nX3NldCBOVUxMCi0jZW5kaWYgLyogQ09ORklHX1MzQzI0MTBfSU9USU1JTkcgKi8KLQotLyogUzNDMjQxMiBjb21wYXRpYmxlIHJvdXRpbmVzICovCi0KLWV4dGVybiBpbnQgczNjMjQxMl9pb3RpbWluZ19nZXQoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAotCQkJCXN0cnVjdCBzM2NfaW90aW1pbmdzICp0aW1pbmdzKTsKLQotZXh0ZXJuIGludCBzM2MyNDEyX2lvdGltaW5nX2dldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOwotCi1leHRlcm4gaW50IHMzYzI0MTJfaW90aW1pbmdfY2FsYyhzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICppb3QpOwotCi1leHRlcm4gdm9pZCBzM2MyNDEyX2lvdGltaW5nX3NldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICppb3QpOwotCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfREVCVUcKLSNkZWZpbmUgczNjX2ZyZXFfZGJnKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKLSNlbHNlCi0jZGVmaW5lIHMzY19mcmVxX2RiZyh4Li4uKSBkbyB7IGlmICgwKSBwcmludGsoeCk7IH0gd2hpbGUgKDApCi0jZW5kaWYgLyogQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfREVCVUcgKi8KLQotI2lmZGVmIENPTkZJR19DUFVfRlJFUV9TM0MyNFhYX0lPREVCVUcKLSNkZWZpbmUgczNjX2ZyZXFfaW9kYmcoeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQotI2Vsc2UKLSNkZWZpbmUgczNjX2ZyZXFfaW9kYmcoeC4uLikgZG8geyBpZiAoMCkgcHJpbnRrKHgpOyB9IHdoaWxlICgwKQotI2VuZGlmIC8qIENPTkZJR19DUFVfRlJFUV9TM0MyNFhYX0lPREVCVUcgKi8KLQotc3RhdGljIGlubGluZSBpbnQgczNjX2NwdWZyZXFfYWRkZnJlcShzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlLAotCQkJCSAgICAgIGludCBpbmRleCwgc2l6ZV90IHRhYmxlX3NpemUsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGZyZXEpCi17Ci0JaWYgKGluZGV4IDwgMCkKLQkJcmV0dXJuIGluZGV4OwotCi0JaWYgKHRhYmxlKSB7Ci0JCWlmIChpbmRleCA+PSB0YWJsZV9zaXplKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJczNjX2ZyZXFfZGJnKCIlczogeyAlZCA9ICV1IGtIeiB9XG4iLAotCQkJICAgICBfX2Z1bmNfXywgaW5kZXgsIGZyZXEpOwotCi0JCXRhYmxlW2luZGV4XS5pbmRleCA9IGluZGV4OwotCQl0YWJsZVtpbmRleF0uZnJlcXVlbmN5ID0gZnJlcTsKLQl9Ci0KLQlyZXR1cm4gaW5kZXggKyAxOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9maXEuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvZmlxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjFiODMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9maXEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvZmlxLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogSGVhZGVyIGZpbGUgZm9yIFMzQzI0WFggQ1BVIEZJUSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLWV4dGVybiBpbnQgczNjMjR4eF9zZXRfZmlxKHVuc2lnbmVkIGludCBpcnEsIGJvb2wgb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9pcnEuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDg3ZDYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9pcnEuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L2lycS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogSGVhZGVyIGZpbGUgZm9yIFMzQzI0WFggQ1BVIElSUSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1pcnEuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotCi0jZGVmaW5lIGlycWRiZih4Li4uKQotI2RlZmluZSBpcnFkYmYyKHguLi4pCi0KLSNkZWZpbmUgRVhUSU5UX09GRiAoSVJRX0VJTlQ0IC0gNCkKLQotLyogdGhlc2UgYXJlIGV4cG9ydGVkIGZvciBhcmNoL2FybS9tYWNoLSogdXNhZ2UgKi8KLWV4dGVybiBzdHJ1Y3QgaXJxX2NoaXAgczNjX2lycV9sZXZlbF9jaGlwOwotZXh0ZXJuIHN0cnVjdCBpcnFfY2hpcCBzM2NfaXJxX2NoaXA7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotczNjX2lycXN1Yl9tYXNrKHVuc2lnbmVkIGludCBpcnFubywgdW5zaWduZWQgaW50IHBhcmVudGJpdCwKLQkJaW50IHN1YmNoZWNrKQotewotCXVuc2lnbmVkIGxvbmcgbWFzazsKLQl1bnNpZ25lZCBsb25nIHN1Ym1hc2s7Ci0KLQlzdWJtYXNrID0gX19yYXdfcmVhZGwoUzNDMjQxMF9JTlRTVUJNU0spOwotCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVE1TSyk7Ci0KLQlzdWJtYXNrIHw9ICgxVUwgPDwgKGlycW5vIC0gSVJRX1MzQ1VBUlRfUlgwKSk7Ci0KLQkvKiBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYXNrIHRoZSBwYXJlbnQgSVJRICovCi0KLQlpZiAoKHN1Ym1hc2sgICYgc3ViY2hlY2spID09IHN1YmNoZWNrKSB7Ci0JCV9fcmF3X3dyaXRlbChtYXNrIHwgcGFyZW50Yml0LCBTM0MyNDEwX0lOVE1TSyk7Ci0JfQotCi0JLyogd3JpdGUgYmFjayBtYXNrcyAqLwotCV9fcmF3X3dyaXRlbChzdWJtYXNrLCBTM0MyNDEwX0lOVFNVQk1TSyk7Ci0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1zM2NfaXJxc3ViX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxbm8sIHVuc2lnbmVkIGludCBwYXJlbnRiaXQpCi17Ci0JdW5zaWduZWQgbG9uZyBtYXNrOwotCXVuc2lnbmVkIGxvbmcgc3VibWFzazsKLQotCXN1Ym1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVFNVQk1TSyk7Ci0JbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UTVNLKTsKLQotCXN1Ym1hc2sgJj0gfigxVUwgPDwgKGlycW5vIC0gSVJRX1MzQ1VBUlRfUlgwKSk7Ci0JbWFzayAmPSB+cGFyZW50Yml0OwotCi0JLyogd3JpdGUgYmFjayBtYXNrcyAqLwotCV9fcmF3X3dyaXRlbChzdWJtYXNrLCBTM0MyNDEwX0lOVFNVQk1TSyk7Ci0JX19yYXdfd3JpdGVsKG1hc2ssIFMzQzI0MTBfSU5UTVNLKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXMzY19pcnFzdWJfbWFza2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8sIHVuc2lnbmVkIGludCBwYXJlbnRtYXNrLCB1bnNpZ25lZCBpbnQgZ3JvdXApCi17Ci0JdW5zaWduZWQgaW50IGJpdCA9IDFVTCA8PCAoaXJxbm8gLSBJUlFfUzNDVUFSVF9SWDApOwotCi0JczNjX2lycXN1Yl9tYXNrKGlycW5vLCBwYXJlbnRtYXNrLCBncm91cCk7Ci0KLQlfX3Jhd193cml0ZWwoYml0LCBTM0MyNDEwX1NVQlNSQ1BORCk7Ci0KLQkvKiBvbmx5IGFjayBwYXJlbnQgaWYgd2UndmUgZ290IGFsbCB0aGUgaXJxcyAoc2VlbXMgd2UgbXVzdAotCSAqIGFjaywgYWxsIGFuZCBob3BlIHRoYXQgdGhlIGlycSBzeXN0ZW0gcmV0cmlnZ2VycyBvayB3aGVuCi0JICogdGhlIGludGVycnVwdCBnb2VzIG9mZiBhZ2FpbikKLQkgKi8KLQotCWlmICgxKSB7Ci0JCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX1NSQ1BORCk7Ci0JCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX0lOVFBORCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXMzY19pcnFzdWJfYWNrKHVuc2lnbmVkIGludCBpcnFubywgdW5zaWduZWQgaW50IHBhcmVudG1hc2ssIHVuc2lnbmVkIGludCBncm91cCkKLXsKLQl1bnNpZ25lZCBpbnQgYml0ID0gMVVMIDw8IChpcnFubyAtIElSUV9TM0NVQVJUX1JYMCk7Ci0KLQlfX3Jhd193cml0ZWwoYml0LCBTM0MyNDEwX1NVQlNSQ1BORCk7Ci0KLQkvKiBvbmx5IGFjayBwYXJlbnQgaWYgd2UndmUgZ290IGFsbCB0aGUgaXJxcyAoc2VlbXMgd2UgbXVzdAotCSAqIGFjaywgYWxsIGFuZCBob3BlIHRoYXQgdGhlIGlycSBzeXN0ZW0gcmV0cmlnZ2VycyBvayB3aGVuCi0JICogdGhlIGludGVycnVwdCBnb2VzIG9mZiBhZ2FpbikKLQkgKi8KLQotCWlmICgxKSB7Ci0JCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX1NSQ1BORCk7Ci0JCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX0lOVFBORCk7Ci0JfQotfQotCi0vKiBleHBvcnRlZCBmb3IgdXNlIGluIGFyY2gvYXJtL21hY2gtczNjMjQxMCAqLwotCi0jaWZkZWYgQ09ORklHX1BNCi1leHRlcm4gaW50IHMzY19pcnFfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBzdGF0ZSk7Ci0jZWxzZQotI2RlZmluZSBzM2NfaXJxX3dha2UgTlVMTAotI2VuZGlmCi0KLWV4dGVybiBpbnQgczNjX2lycWV4dF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tYXAuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTM0ZDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L21hcC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFMzQzI0WFggLSBNZW1vcnkgbWFwIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fUExBVF9TM0MyNFhYX01BUF9ICi0jZGVmaW5lIF9fQVNNX1BMQVRfUzNDMjRYWF9NQVBfSAotCi0vKiBpbnRlcnJ1cHQgY29udHJvbGxlciBpcyB0aGUgZmlyc3QgdGhpbmcgd2UgcHV0IGluLCB0byBtYWtlCi0gKiB0aGUgYXNzZW1ibHkgY29kZSBmb3IgdGhlIGlycSBkZXRlY3Rpb24gZWFzaWVyCi0gKi8KLSNkZWZpbmUgUzNDMjRYWF9WQV9JUlEJICAgUzNDX1ZBX0lSUQotI2RlZmluZSBTM0MyNDEwX1BBX0lSUQkgICAoMHg0QTAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9JUlEJICAgU1pfMU0KLQotLyogbWVtb3J5IGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFMzQzI0WFhfVkFfTUVNQ1RSTCBTM0NfVkFfTUVNCi0jZGVmaW5lIFMzQzI0MTBfUEFfTUVNQ1RSTCAoMHg0ODAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9NRU1DVFJMIFNaXzFNCi0KLS8qIFVBUlRzICovCi0jZGVmaW5lIFMzQzI0WFhfVkFfVUFSVAkgICBTM0NfVkFfVUFSVAotI2RlZmluZSBTM0MyNDEwX1BBX1VBUlQJICAgKDB4NTAwMDAwMDApCi0jZGVmaW5lIFMzQzI0WFhfU1pfVUFSVAkgICBTWl8xTQotI2RlZmluZSBTM0NfVUFSVF9PRkZTRVQJICAgKDB4NDAwMCkKLQotI2RlZmluZSBTM0NfVkFfVUFSVHgodWFydCkgKFMzQ19WQV9VQVJUICsgKCh1YXJ0ICogUzNDX1VBUlRfT0ZGU0VUKSkpCi0KLS8qIFRpbWVycyAqLwotI2RlZmluZSBTM0MyNFhYX1ZBX1RJTUVSICAgUzNDX1ZBX1RJTUVSCi0jZGVmaW5lIFMzQzI0MTBfUEFfVElNRVIgICAoMHg1MTAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9USU1FUiAgIFNaXzFNCi0KLS8qIENsb2NrIGFuZCBQb3dlciBtYW5hZ2VtZW50ICovCi0jZGVmaW5lIFMzQzI0WFhfVkFfQ0xLUFdSICBTM0NfVkFfU1lTCi0jZGVmaW5lIFMzQzI0WFhfU1pfQ0xLUFdSICBTWl8xTQotCi0vKiBVU0IgRGV2aWNlIHBvcnQgKi8KLSNkZWZpbmUgUzNDMjQxMF9QQV9VU0JERVYgICgweDUyMDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1NaX1VTQkRFViAgU1pfMU0KLQotLyogV2F0Y2hkb2cgKi8KLSNkZWZpbmUgUzNDMjRYWF9WQV9XQVRDSERPRyBTM0NfVkFfV0FUQ0hET0cKLSNkZWZpbmUgUzNDMjQxMF9QQV9XQVRDSERPRyAoMHg1MzAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9XQVRDSERPRyBTWl8xTQotCi0vKiBTdGFuZGFyZCBzaXplIGRlZmluaXRpb25zIGZvciBwZXJpcGhlcmFsIGJsb2Nrcy4gKi8KLQotI2RlZmluZSBTM0MyNFhYX1NaX0lJUwkJU1pfMU0KLSNkZWZpbmUgUzNDMjRYWF9TWl9BREMJCVNaXzFNCi0jZGVmaW5lIFMzQzI0WFhfU1pfU1BJCQlTWl8xTQotI2RlZmluZSBTM0MyNFhYX1NaX1NESQkJU1pfMU0KLSNkZWZpbmUgUzNDMjRYWF9TWl9OQU5ECQlTWl8xTQotCi0vKiBHUElPIHBvcnRzICovCi0KLS8qIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIFZBIG9mIHRoaXMgbXVzdCBlbnN1cmUgdGhhdAotICogaXQgaXMgdGhlIHNhbWUgZGlzdGFuY2UgYXBhcnQgZnJvbSB0aGUgVUFSVCBpbiB0aGUKLSAqIHBoc3lpY2FsIGFkZHJlc3Mgc3BhY2UsIGFzIHRoZSBpbml0aWFsIG1hcHBpbmcgZm9yIHRoZSBJTwotICogaXMgZG9uZSBhcyBhIDE6MSBtYXBwaW5nLiBUaGlzIHB1dHMgaXQgKGN1cnJlbnRseSkgYXQKLSAqIDB4RkE4MDAwMDAsIHdoaWNoIGlzIG5vdCBpbiB0aGUgd2F5IG9mIGFueSBjdXJyZW50IG1hcHBpbmcKLSAqIGJ5IHRoZSBiYXNlIHN5c3RlbS4KLSovCi0KLSNkZWZpbmUgUzNDMjQxMF9QQV9HUElPCSAgICgweDU2MDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8JICAgKChTM0MyNFhYX1BBX0dQSU8gLSBTM0MyNFhYX1BBX1VBUlQpICsgUzNDMjRYWF9WQV9VQVJUKQotI2RlZmluZSBTM0MyNFhYX1NaX0dQSU8JICAgU1pfMU0KLQotCi0vKiBJU0Egc3R5bGUgSU8sIGZvciBlYWNoIG1hY2hpbmUgdG8gc29ydCBvdXQgbWFwcGluZ3MgZm9yLCBpZiBpdAotICogaW1wbGVtZW50cyBpdC4gV2UgcmVzZXJ2ZSB0d28gMTZNIHJlZ2lvbnMgZm9yIElTQS4KLSAqLwotCi0jZGVmaW5lIFMzQzI0WFhfVkFfSVNBX1dPUkQgIFMzQzI0MTBfQUREUigweDAyMDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1ZBX0lTQV9CWVRFICBTM0MyNDEwX0FERFIoMHgwMzAwMDAwMCkKLQotLyogZGVhbCB3aXRoIHRoZSByZWdpc3RlcnMgdGhhdCBtb3ZlIHVuZGVyIHRoZSAyNDEyLzI0MTMgKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEyKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQxMykKLSNpZm5kZWYgX19BU1NFTUJMWV9fCi1leHRlcm4gdm9pZCBfX2lvbWVtICpzM2MyNHh4X3ZhX2dwaW8yOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEyX09OTFkKLSNkZWZpbmUgUzNDMjRYWF9WQV9HUElPMiAoUzNDMjRYWF9WQV9HUElPICsgMHgxMCkKLSNlbHNlCi0jZGVmaW5lIFMzQzI0WFhfVkFfR1BJTzIgczNjMjR4eF92YV9ncGlvMgotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBzM2MyNHh4X3ZhX2dwaW8yIFMzQzI0WFhfVkFfR1BJTwotI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8yIFMzQzI0WFhfVkFfR1BJTwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0FTTV9QTEFUX1MzQzI0WFhfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvbWNpLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L21jaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWMyYjIxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvbWNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jaWZuZGVmIF9BUkNIX01DSV9ICi0jZGVmaW5lIF9BUkNIX01DSV9ICi0KLS8qKgotICogc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhIC0gc2QvbW1jIGNvbnRyb2xsZXIgcGxhdGZvcm0gZGF0YQotICogQG5vX3dwcm90ZWN0OiBTZXQgdGhpcyB0byBpbmRpY2F0ZSB0aGVyZSBpcyBubyB3cml0ZS1wcm90ZWN0IHN3aXRjaC4KLSAqIEBub19kZXRlY3Q6IFNldCB0aGlzIGlmIHRoZXJlIGlzIG5vIGRldGVjdCBzd2l0Y2guCi0gKiBAd3Byb3RlY3RfaW52ZXJ0OiBJbnZlcnQgdGhlIGRlZmF1bHQgc2Vuc2Ugb2YgdGhlIHdyaXRlIHByb3RlY3Qgc3dpdGNoLgotICogQGRldGVjdF9pbnZlcnQ6IEludmVydCB0aGUgZGVmYXVsdCBzZW5zZSBvZiB0aGUgd3JpdGUgcHJvdGVjdCBzd2l0Y2guCi0gKiBAdXNlX2RtYTogU2V0IHRvIGFsbG93IHRoZSB1c2Ugb2YgRE1BLgotICogQGdwaW9fZGV0ZWN0OiBHUElPIG51bWJlciBmb3IgdGhlIGNhcmQgZGV0ZWN0IGxpbmUuCi0gKiBAZ3Bpb193cHJvdGVjdDogR1BJTyBudW1iZXIgZm9yIHRoZSB3cml0ZSBwcm90ZWN0IGxpbmUuCi0gKiBAb2NyX2F2YWlsOiBUaGUgbWFzayBvZiB0aGUgYXZhaWxhYmxlIHBvd2VyIHN0YXRlcywgbm9uLXplcm8gdG8gdXNlLgotICogQHNldF9wb3dlcjogQ2FsbGJhY2sgdG8gY29udHJvbCB0aGUgcG93ZXIgbW9kZS4KLSAqCi0gKiBUaGUgQGdwaW9fZGV0ZWN0IGlzIHVzZWQgZm9yIGNhcmQgZGV0ZWN0aW9uIHdoZW4gQG5vX3dwcm90ZWN0IGlzIHVuc2V0LAotICogYW5kIHRoZSBkZWZhdWx0IHNlbnNlIGlzIHRoYXQgMCByZXR1cm5lZCBmcm9tIGdwaW9fZ2V0X3ZhbHVlKCkgbWVhbnMKLSAqIHRoYXQgYSBjYXJkIGlzIGluc2VydGVkLiBJZiBAZGV0ZWN0X2ludmVydCBpcyBzZXQsIHRoZW4gdGhlIHZhbHVlIGZyb20KLSAqIGdwaW9fZ2V0X3ZhbHVlKCkgaXMgaW52ZXJ0ZWQsIHdoaWNoIG1ha2VzIDEgbWVhbiBjYXJkIGluc2VydGVkLgotICoKLSAqIFRoZSBkcml2ZXIgd2lsbCB1c2UgQGdwaW9fd3Byb3RlY3QgdG8gc2lnbmFsIHdoZXRoZXIgdGhlIGNhcmQgaXMgd3JpdGUKLSAqIHByb3RlY3RlZCBpZiBAbm9fd3Byb3RlY3QgaXMgbm90IHNldC4gQSAwIHJldHVybmVkIGZyb20gZ3Bpb19nZXRfdmFsdWUoKQotICogbWVhbnMgdGhlIGNhcmQgaXMgcmVhZC93cml0ZSwgYW5kIDEgbWVhbnMgcmVhZC1vbmx5LiBUaGUgQHdwcm90ZWN0X2ludmVydAotICogd2lsbCBpbnZlcnQgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gZ3Bpb19nZXRfdmFsdWUoKS4KLSAqCi0gKiBDYXJkIHBvd2VyIGlzIHNldCBieSBAb2NyX2F2YWlsYSwgdXNpbmcgTUNDX1ZERF8gY29uc3RhbnRzIGlmIGl0IGlzIHNldAotICogdG8gYSBub24temVybyB2YWx1ZSwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IG9mIDMuMi0zLjRWIGlzIHVzZWQuCi0gKi8KLXN0cnVjdCBzM2MyNHh4X21jaV9wZGF0YSB7Ci0JdW5zaWduZWQgaW50CW5vX3dwcm90ZWN0IDogMTsKLQl1bnNpZ25lZCBpbnQJbm9fZGV0ZWN0IDogMTsKLQl1bnNpZ25lZCBpbnQJd3Byb3RlY3RfaW52ZXJ0IDogMTsKLQl1bnNpZ25lZCBpbnQJZGV0ZWN0X2ludmVydCA6IDE7ICAgLyogc2V0ID0+IGRldGVjdCBhY3RpdmUgaGlnaC4gKi8KLQl1bnNpZ25lZCBpbnQJdXNlX2RtYSA6IDE7Ci0KLQl1bnNpZ25lZCBpbnQJZ3Bpb19kZXRlY3Q7Ci0JdW5zaWduZWQgaW50CWdwaW9fd3Byb3RlY3Q7Ci0JdW5zaWduZWQgbG9uZwlvY3JfYXZhaWw7Ci0Jdm9pZAkJKCpzZXRfcG93ZXIpKHVuc2lnbmVkIGNoYXIgcG93ZXJfbW9kZSwKLQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHZkZCk7Ci19OwotCi0vKioKLSAqIHMzYzI0eHhfbWNpX3NldF9wbGF0ZGF0YSAtIHNldCBwbGF0Zm9ybSBkYXRhIGZvciBtbWMvc2RpIGRldmljZQotICogQHBkYXRhOiBUaGUgcGxhdGZvcm0gZGF0YQotICoKLSAqIENvcHkgdGhlIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWQgYnkgQHBkYXRhIHNvIHRoYXQgdGhpcyBjYW4gYmUgbWFya2VkCi0gKiBfX2luaXRkYXRhLgotICovCi1leHRlcm4gdm9pZCBzM2MyNHh4X21jaV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhICpwZGF0YSk7Ci0KLSNlbmRpZiAvKiBfQVJDSF9OQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9wbGwuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcGxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNTcyOWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9wbGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcGxsLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFMzQzI0eHggLSBjb21tb24gcGxsIHJlZ2lzdGVycyBhbmQgY29kZQotICovCi0KLSNkZWZpbmUgUzNDMjRYWF9QTExDT05fTURJVlNISUZUCTEyCi0jZGVmaW5lIFMzQzI0WFhfUExMQ09OX1BESVZTSElGVAk0Ci0jZGVmaW5lIFMzQzI0WFhfUExMQ09OX1NESVZTSElGVAkwCi0jZGVmaW5lIFMzQzI0WFhfUExMQ09OX01ESVZNQVNLCQkoKDE8PCgxKygxOS0xMikpKS0xKQotI2RlZmluZSBTM0MyNFhYX1BMTENPTl9QRElWTUFTSwkJKCgxPDw1KS0xKQotI2RlZmluZSBTM0MyNFhYX1BMTENPTl9TRElWTUFTSwkJMwotCi0jaW5jbHVkZSA8YXNtL2RpdjY0Lmg+Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1zM2MyNHh4X2dldF9wbGwodW5zaWduZWQgaW50IHBsbHZhbCwgdW5zaWduZWQgaW50IGJhc2VjbGspCi17Ci0JdW5zaWduZWQgaW50IG1kaXYsIHBkaXYsIHNkaXY7Ci0JdWludDY0X3QgZnZjbzsKLQotCW1kaXYgPSBwbGx2YWwgPj4gUzNDMjRYWF9QTExDT05fTURJVlNISUZUOwotCXBkaXYgPSBwbGx2YWwgPj4gUzNDMjRYWF9QTExDT05fUERJVlNISUZUOwotCXNkaXYgPSBwbGx2YWwgPj4gUzNDMjRYWF9QTExDT05fU0RJVlNISUZUOwotCi0JbWRpdiAmPSBTM0MyNFhYX1BMTENPTl9NRElWTUFTSzsKLQlwZGl2ICY9IFMzQzI0WFhfUExMQ09OX1BESVZNQVNLOwotCXNkaXYgJj0gUzNDMjRYWF9QTExDT05fU0RJVk1BU0s7Ci0KLQlmdmNvID0gKHVpbnQ2NF90KWJhc2VjbGsgKiAobWRpdiArIDgpOwotCWRvX2RpdihmdmNvLCAocGRpdiArIDIpIDw8IHNkaXYpOwotCi0JcmV0dXJuICh1bnNpZ25lZCBpbnQpZnZjbzsKLX0KLQotI2RlZmluZSBTM0MyNDE2X1BMTF9NX1NISUZUCSgxNCkKLSNkZWZpbmUgUzNDMjQxNl9QTExfUF9TSElGVAkoNSkKLSNkZWZpbmUgUzNDMjQxNl9QTExfU19NQVNLCSg3KQotI2RlZmluZSBTM0MyNDE2X1BMTF9NX01BU0sJKCgxIDw8IDEwKSAtIDEpCi0jZGVmaW5lIFMzQzI0MTZfUExMX1BfTUFTSwkoNjMpCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1zM2MyNDE2X2dldF9wbGwodW5zaWduZWQgaW50IHBsbHZhbCwgdW5zaWduZWQgaW50IGJhc2VjbGspCi17Ci0JdW5zaWduZWQgaW50IG0sIHAsIHM7Ci0JdWludDY0X3QgZnZjbzsKLQotCW0gPSBwbGx2YWwgPj4gUzNDMjQxNl9QTExfTV9TSElGVDsKLQlwID0gcGxsdmFsID4+IFMzQzI0MTZfUExMX1BfU0hJRlQ7Ci0KLQlzID0gcGxsdmFsICYgUzNDMjQxNl9QTExfU19NQVNLOwotCW0gJj0gUzNDMjQxNl9QTExfTV9NQVNLOwotCXAgJj0gUzNDMjQxNl9QTExfUF9NQVNLOwotCi0JZnZjbyA9ICh1aW50NjRfdCliYXNlY2xrICogbTsKLQlkb19kaXYoZnZjbywgKHAgPDwgcykpOwotCi0JcmV0dXJuICh1bnNpZ25lZCBpbnQpZnZjbzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1kbWEuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwZjRjMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3MtZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kbWEuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFNhbXN1bmcgUzNDMjRYWCBETUEgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0vKiBETUEgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBTM0MyNDEwX0RNQV9ESVNSQwkJKDB4MDApCi0jZGVmaW5lIFMzQzI0MTBfRE1BX0RJU1JDQwkJKDB4MDQpCi0jZGVmaW5lIFMzQzI0MTBfRE1BX0RJRFNUCQkoMHgwOCkKLSNkZWZpbmUgUzNDMjQxMF9ETUFfRElEU1RDCQkoMHgwQykKLSNkZWZpbmUgUzNDMjQxMF9ETUFfRENPTgkJKDB4MTApCi0jZGVmaW5lIFMzQzI0MTBfRE1BX0RTVEFUCQkoMHgxNCkKLSNkZWZpbmUgUzNDMjQxMF9ETUFfRENTUkMJCSgweDE4KQotI2RlZmluZSBTM0MyNDEwX0RNQV9EQ0RTVAkJKDB4MUMpCi0jZGVmaW5lIFMzQzI0MTBfRE1BX0RNQVNLVFJJRwkJKDB4MjApCi0jZGVmaW5lIFMzQzI0MTJfRE1BX0RNQVJFUVNFTAkJKDB4MjQpCi0jZGVmaW5lIFMzQzI0NDNfRE1BX0RNQVJFUVNFTAkJKDB4MjQpCi0KLSNkZWZpbmUgUzNDMjQxMF9ESVNSQ0NfSU5DCQkoMTw8MCkKLSNkZWZpbmUgUzNDMjQxMF9ESVNSQ0NfQVBCCQkoMTw8MSkKLQotI2RlZmluZSBTM0MyNDEwX0RNQVNLVFJJR19TVE9QCQkoMTw8MikKLSNkZWZpbmUgUzNDMjQxMF9ETUFTS1RSSUdfT04JCSgxPDwxKQotI2RlZmluZSBTM0MyNDEwX0RNQVNLVFJJR19TV1RSSUcJKDE8PDApCi0KLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0RFTUFORAkJKDA8PDMxKQotI2RlZmluZSBTM0MyNDEwX0RDT05fSEFORFNIQUtFCQkoMTw8MzEpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9TWU5DX1BDTEsJCSgwPDwzMCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX1NZTkNfSENMSwkJKDE8PDMwKQotCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9JTlRSRVEJCSgxPDwyOSkKLQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gwX1hEUkVRMAkJKDA8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gwX1VBUlQwCQkoMTw8MjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDBfU0RJCQkoMjw8MjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDBfVElNRVIJCSgzPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMF9VU0JFUDEJCSg0PDwyNCkKLQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gxX1hEUkVRMQkJKDA8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gxX1VBUlQxCQkoMTw8MjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDFfSTJTU0RJCQkoMjw8MjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDFfU1BJCQkoMzw8MjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDFfVVNCRVAyCQkoNDw8MjQpCi0KLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMl9JMlNTRE8JCSgwPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMl9JMlNTREkJCSgxPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMl9TREkJCSgyPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMl9USU1FUgkJKDM8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gyX1VTQkVQMwkJKDQ8PDI0KQotCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDNfVUFSVDIJCSgwPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIM19TREkJCSgxPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIM19TUEkJCSgyPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIM19USU1FUgkJKDM8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gzX1VTQkVQNAkJKDQ8PDI0KQotCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9TUkNTSElGVAkJKDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fU1JDTUFTSwkJKDc8PDI0KQotCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9CWVRFCQkoMDw8MjApCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9IQUxGV09SRAkJKDE8PDIwKQotI2RlZmluZSBTM0MyNDEwX0RDT05fV09SRAkJKDI8PDIwKQotCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9BVVRPUkVMT0FECQkoMDw8MjIpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9OT1JFTE9BRAkJKDE8PDIyKQotI2RlZmluZSBTM0MyNDEwX0RDT05fSFdUUklHCQkoMTw8MjMpCi0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDAKLSNkZWZpbmUgUzNDMjQ0MF9ESURTVENfQ0hLSU5UCQkoMTw8MikKLQotI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gwX0kyU1NETwkJKDU8PDI0KQotI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gwX1BDTUlOCQkoNjw8MjQpCi0KLSNkZWZpbmUgUzNDMjQ0MF9EQ09OX0NIMV9QQ01PVVQJCSg1PDwyNCkKLSNkZWZpbmUgUzNDMjQ0MF9EQ09OX0NIMV9TREkJCSg2PDwyNCkKLQotI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gyX1BDTUlOCQkoNTw8MjQpCi0jZGVmaW5lIFMzQzI0NDBfRENPTl9DSDJfTUlDSU4JCSg2PDwyNCkKLQotI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gzX01JQ0lOCQkoNTw8MjQpCi0jZGVmaW5lIFMzQzI0NDBfRENPTl9DSDNfUENNT1VUCQkoNjw8MjQpCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19DUFVfUzNDMjQxMgotCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1NSQyh4KQkoKHgpPDwxKQotCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX0hXCQkoMSkKLQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9TUEkwVFgJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDApCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1NQSTBSWAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMSkKLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfU1BJMVRYCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygyKQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9TUEkxUlgJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDMpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX0kyU1RYCQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoNCkKLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfSTJTUlgJCVMzQzI0MTJfRE1BUkVRU0VMX1NSQyg1KQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9USU1FUgkJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDkpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1NESQkJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDEwKQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VU0JFUDEJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDEzKQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VU0JFUDIJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDE0KQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VU0JFUDMJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDE1KQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VU0JFUDQJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDE2KQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9YRFJFUTAJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDE3KQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9YRFJFUTEJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDE4KQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMF8wCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxOSkKLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDBfMQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMjApCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQxXzAJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDIxKQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMV8xCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygyMikKLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDJfMAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMjMpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQyXzEJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDI0KQotCi0jZW5kaWYKLQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9TUkMoeCkJKCh4KTw8MSkKLQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9IVwkJKDEpCi0KLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfU1BJMFRYCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygwKQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9TUEkwUlgJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDEpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1NQSTFUWAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMikKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfU1BJMVJYCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygzKQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9JMlNUWAkJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDQpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX0kyU1JYCQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoNSkKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVElNRVIJCVMzQzI0NDNfRE1BUkVRU0VMX1NSQyg5KQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9TREkJCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygxMCkKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfWERSRVEwCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygxNykKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfWERSRVExCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygxOCkKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDBfMAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMTkpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQwXzEJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDIwKQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMV8wCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyMSkKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDFfMQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjIpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQyXzAJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDIzKQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMl8xCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyNCkKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDNfMAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjUpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQzXzEJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDI2KQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9QQ01PVVQJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDI3KQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9QQ01JTiAJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDI4KQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9NSUNJTgkJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDI5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLWlpcy5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLWlpcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzQ0ZTBlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1paXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1paXMuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBTaW10ZWMgRWxlY3Ryb25pY3MgPGxpbnV4QHNpbXRlYy5jby51az4KLSAqCQkgICAgICBodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogUzNDMjQxMCBJSVMgcmVnaXN0ZXIgZGVmaW5pdGlvbgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfSUlTX0gKLSNkZWZpbmUgX19BU01fQVJDSF9SRUdTX0lJU19ICi0KLSNkZWZpbmUgUzNDMjQxMF9JSVNDT04JICgweDAwKQotCi0jZGVmaW5lIFMzQzI0MTBfSUlTQ09OX0xSSU5ERVgJICAoMTw8OCkKLSNkZWZpbmUgUzNDMjQxMF9JSVNDT05fVFhGSUZPUkRZICAoMTw8NykKLSNkZWZpbmUgUzNDMjQxMF9JSVNDT05fUlhGSUZPUkRZICAoMTw8NikKLSNkZWZpbmUgUzNDMjQxMF9JSVNDT05fVFhETUFFTgkgICgxPDw1KQotI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9SWERNQUVOCSAgKDE8PDQpCi0jZGVmaW5lIFMzQzI0MTBfSUlTQ09OX1RYSURMRQkgICgxPDwzKQotI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9SWElETEUJICAoMTw8MikKLSNkZWZpbmUgUzNDMjQxMF9JSVNDT05fUFNDRU4JICAoMTw8MSkKLSNkZWZpbmUgUzNDMjQxMF9JSVNDT05fSUlTRU4JICAoMTw8MCkKLQotI2RlZmluZSBTM0MyNDEwX0lJU01PRAkgKDB4MDQpCi0KLSNkZWZpbmUgUzNDMjQ0MF9JSVNNT0RfTVBMTAkgICgxPDw5KQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF9TTEFWRQkgICgxPDw4KQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF9OT1hGRVIJICAoMDw8NikKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfUlhNT0RFCSAgKDE8PDYpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EX1RYTU9ERQkgICgyPDw2KQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF9UWFJYTU9ERQkgICgzPDw2KQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF9MUl9MTE9XCSAgKDA8PDUpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EX0xSX1JMT1cJICAoMTw8NSkKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfSUlTCSAgKDA8PDQpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EX01TQgkgICgxPDw0KQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF84QklUCSAgKDA8PDMpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzE2QklUCSAgKDE8PDMpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EX0JJVE1BU0sJICAoMTw8MykKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfMjU2RlMJICAoMDw8MikKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfMzg0RlMJICAoMTw8MikKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfMTZGUwkgICgwPDwwKQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF8zMkZTCSAgKDE8PDApCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzQ4RlMJICAoMjw8MCkKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfRlNfTUFTSwkgICgzPDwwKQotCi0jZGVmaW5lIFMzQzI0MTBfSUlTUFNSCQkoMHgwOCkKLSNkZWZpbmUgUzNDMjQxMF9JSVNQU1JfSU5UTUFTSwkoMzE8PDUpCi0jZGVmaW5lIFMzQzI0MTBfSUlTUFNSX0lOVFNISUZUCSg1KQotI2RlZmluZSBTM0MyNDEwX0lJU1BTUl9FWFRNQVNLCSgzMTw8MCkKLSNkZWZpbmUgUzNDMjQxMF9JSVNQU1JfRVhUU0hGSVQJKDApCi0KLSNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OICAoMHgwYykKLQotI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fVFhETUEJICAoMTw8MTUpCi0jZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9SWERNQQkgICgxPDwxNCkKLSNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OX1RYRU5BQkxFICAoMTw8MTMpCi0jZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9SWEVOQUJMRSAgKDE8PDEyKQotI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fVFhNQVNLCSAgKDB4M2YgPDwgNikKLSNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OX1RYU0hJRlQJICAoNikKLSNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OX1JYTUFTSwkgICgweDNmKQotI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fUlhTSElGVAkgICgwKQotCi0jZGVmaW5lIFMzQzI0MTBfSUlTRklGTyAgKDB4MTApCi0jZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX0lJU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3Mtc3BpLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3Mtc3BpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MmUyZjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLXNwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9yZWdzLXNwaS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEZldHJvbiBHbWJICi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBTM0MyNDEwIFNQSSByZWdpc3RlciBkZWZpbml0aW9uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19TUElfSAotI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfU1BJX0gKLQotI2RlZmluZSBTM0MyNDEwX1NQSTEJKDB4MjApCi0jZGVmaW5lIFMzQzI0MTJfU1BJMQkoMHgxMDApCi0KLSNkZWZpbmUgUzNDMjQxMF9TUENPTgkoMHgwMCkKLQotI2RlZmluZSBTM0MyNDEyX1NQQ09OX1JYRklGT19SQjIJKDA8PDE0KQotI2RlZmluZSBTM0MyNDEyX1NQQ09OX1JYRklGT19SQjQJKDE8PDE0KQotI2RlZmluZSBTM0MyNDEyX1NQQ09OX1JYRklGT19SQjEyCSgyPDwxNCkKLSNkZWZpbmUgUzNDMjQxMl9TUENPTl9SWEZJRk9fUkIxNAkoMzw8MTQpCi0jZGVmaW5lIFMzQzI0MTJfU1BDT05fVFhGSUZPX1JCMgkoMDw8MTIpCi0jZGVmaW5lIFMzQzI0MTJfU1BDT05fVFhGSUZPX1JCNAkoMTw8MTIpCi0jZGVmaW5lIFMzQzI0MTJfU1BDT05fVFhGSUZPX1JCMTIJKDI8PDEyKQotI2RlZmluZSBTM0MyNDEyX1NQQ09OX1RYRklGT19SQjE0CSgzPDwxMikKLSNkZWZpbmUgUzNDMjQxMl9TUENPTl9SWEZJRk9fUkVTRVQJKDE8PDExKSAvKiBSeEZJRk8gcmVzZXQgKi8KLSNkZWZpbmUgUzNDMjQxMl9TUENPTl9UWEZJRk9fUkVTRVQJKDE8PDEwKSAvKiBUeEZJRk8gcmVzZXQgKi8KLSNkZWZpbmUgUzNDMjQxMl9TUENPTl9SWEZJRk9fRU4JCSgxPDw5KSAgLyogUnhGSUZPIEVuYWJsZSAqLwotI2RlZmluZSBTM0MyNDEyX1NQQ09OX1RYRklGT19FTgkJKDE8PDgpICAvKiBUeEZJRk8gRW5hYmxlICovCi0KLSNkZWZpbmUgUzNDMjQxMl9TUENPTl9ESVJDX1JYCSAgKDE8PDcpCi0KLSNkZWZpbmUgUzNDMjQxMF9TUENPTl9TTU9EX0RNQQkgICgyPDw1KQkvKiBETUEgbW9kZSAqLwotI2RlZmluZSBTM0MyNDEwX1NQQ09OX1NNT0RfSU5UCSAgKDE8PDUpCS8qIGludGVycnVwdCBtb2RlICovCi0jZGVmaW5lIFMzQzI0MTBfU1BDT05fU01PRF9QT0xMICAgKDA8PDUpCS8qIHBvbGxpbmcgbW9kZSAqLwotI2RlZmluZSBTM0MyNDEwX1NQQ09OX0VOU0NLCSAgKDE8PDQpCS8qIEVuYWJsZSBTQ0sgKi8KLSNkZWZpbmUgUzNDMjQxMF9TUENPTl9NU1RSCSAgKDE8PDMpCS8qIE1hc3Rlci9TbGF2ZSBzZWxlY3QKLQkJCQkJCSAgIDA6IHNsYXZlLCAxOiBtYXN0ZXIgKi8KLSNkZWZpbmUgUzNDMjQxMF9TUENPTl9DUE9MX0hJR0gJICAoMTw8MikJLyogQ2xvY2sgcG9sYXJpdHkgc2VsZWN0ICovCi0jZGVmaW5lIFMzQzI0MTBfU1BDT05fQ1BPTF9MT1cJICAoMDw8MikJLyogQ2xvY2sgcG9sYXJpdHkgc2VsZWN0ICovCi0KLSNkZWZpbmUgUzNDMjQxMF9TUENPTl9DUEhBX0ZNVEIJICAoMTw8MSkJLyogQ2xvY2sgUGhhc2UgU2VsZWN0ICovCi0jZGVmaW5lIFMzQzI0MTBfU1BDT05fQ1BIQV9GTVRBCSAgKDA8PDEpCS8qIENsb2NrIFBoYXNlIFNlbGVjdCAqLwotCi0jZGVmaW5lIFMzQzI0MTBfU1BDT05fVEFHRAkgICgxPDwwKQkvKiBUeCBhdXRvIGdhcmJhZ2UgZGF0YSBtb2RlICovCi0KLQotI2RlZmluZSBTM0MyNDEwX1NQU1RBCSAoMHgwNCkKLQotI2RlZmluZSBTM0MyNDEyX1NQU1RBX1JYRklGT19BRQkJKDE8PDExKQotI2RlZmluZSBTM0MyNDEyX1NQU1RBX1RYRklGT19BRQkJKDE8PDEwKQotI2RlZmluZSBTM0MyNDEyX1NQU1RBX1JYRklGT19FUlJPUgkoMTw8OSkKLSNkZWZpbmUgUzNDMjQxMl9TUFNUQV9UWEZJRk9fRVJST1IJKDE8PDgpCi0jZGVmaW5lIFMzQzI0MTJfU1BTVEFfUlhGSUZPX0ZJRk8JKDE8PDcpCi0jZGVmaW5lIFMzQzI0MTJfU1BTVEFfUlhGSUZPX0VNUFRZCSgxPDw2KQotI2RlZmluZSBTM0MyNDEyX1NQU1RBX1RYRklGT19ORlVMTAkoMTw8NSkKLSNkZWZpbmUgUzNDMjQxMl9TUFNUQV9UWEZJRk9fRU1QVFkJKDE8PDQpCi0KLSNkZWZpbmUgUzNDMjQxMF9TUFNUQV9EQ09MCSAgKDE8PDIpCS8qIERhdGEgQ29sbGlzaW9uIEVycm9yICovCi0jZGVmaW5lIFMzQzI0MTBfU1BTVEFfTVVMRAkgICgxPDwxKQkvKiBNdWx0aSBNYXN0ZXIgRXJyb3IgKi8KLSNkZWZpbmUgUzNDMjQxMF9TUFNUQV9SRUFEWQkgICgxPDwwKQkvKiBEYXRhIFR4L1J4IHJlYWR5ICovCi0jZGVmaW5lIFMzQzI0MTJfU1BTVEFfUkVBRFlfT1JHCSAgKDE8PDMpCi0KLSNkZWZpbmUgUzNDMjQxMF9TUFBJTgkgKDB4MDgpCi0KLSNkZWZpbmUgUzNDMjQxMF9TUFBJTl9FTk1VTAkgICgxPDwyKQkvKiBNdWx0aSBNYXN0ZXIgRXJyb3IgZGV0ZWN0ICovCi0jZGVmaW5lIFMzQzI0MTBfU1BQSU5fUkVTRVJWRUQJICAoMTw8MSkKLSNkZWZpbmUgUzNDMjQxMF9TUFBJTl9LRUVQCSAgKDE8PDApCS8qIE1hc3RlciBPdXQga2VlcCAqLwotCi0jZGVmaW5lIFMzQzI0MTBfU1BQUkUJICgweDBDKQotI2RlZmluZSBTM0MyNDEwX1NQVERBVAkgKDB4MTApCi0jZGVmaW5lIFMzQzI0MTBfU1BSREFUCSAoMHgxNCkKLQotI2RlZmluZSBTM0MyNDEyX1RYRklGTwkgKDB4MTgpCi0jZGVmaW5lIFMzQzI0MTJfUlhGSUZPCSAoMHgxOCkKLSNkZWZpbmUgUzNDMjQxMl9TUEZJQwkgKDB4MjQpCi0KLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUkVHU19TUElfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLXVkYy5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLXVkYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGRkNGE0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy11ZGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtdWRjLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSGVyYmVydCBQb2V0emwgPGhlcmJlcnRAMTN0aGZsb29yLmF0PgotICoKLSAqIFRoaXMgaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9SRUdTX1VEQ19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19VRENfSAotCi0jZGVmaW5lIFMzQzI0MTBfVVNCRFJFRyh4KSAoeCkKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19GVU5DX0FERFJfUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxNDApCi0jZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxNDQpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQX0lOVF9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxNDgpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfVVNCX0lOVF9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxNTgpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQX0lOVF9FTl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE1YykKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JfSU5UX0VOX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTZjKQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0ZSQU1FX05VTTFfUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxNzApCi0jZGVmaW5lIFMzQzI0MTBfVURDX0ZSQU1FX05VTTJfUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxNzQpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0ZJRk9fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxYzApCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMV9GSUZPX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMWM0KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDJfRklGT19SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDFjOCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAzX0ZJRk9fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxY2MpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQNF9GSUZPX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMWQwKQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMV9ETUFfQ09OCQlTM0MyNDEwX1VTQkRSRUcoMHgwMjAwKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDFfRE1BX1VOSVQJUzNDMjQxMF9VU0JEUkVHKDB4MDIwNCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0RNQV9GSUZPCVMzQzI0MTBfVVNCRFJFRygweDAyMDgpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMV9ETUFfVFRDX0wJUzNDMjQxMF9VU0JEUkVHKDB4MDIwYykKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0RNQV9UVENfTQlTM0MyNDEwX1VTQkRSRUcoMHgwMjEwKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDFfRE1BX1RUQ19ICVMzQzI0MTBfVVNCRFJFRygweDAyMTQpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAyX0RNQV9DT04JCVMzQzI0MTBfVVNCRFJFRygweDAyMTgpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9ETUFfVU5JVAlTM0MyNDEwX1VTQkRSRUcoMHgwMjFjKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDJfRE1BX0ZJRk8JUzNDMjQxMF9VU0JEUkVHKDB4MDIyMCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAyX0RNQV9UVENfTAlTM0MyNDEwX1VTQkRSRUcoMHgwMjI0KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDJfRE1BX1RUQ19NCVMzQzI0MTBfVVNCRFJFRygweDAyMjgpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9ETUFfVFRDX0gJUzNDMjQxMF9VU0JEUkVHKDB4MDIyYykKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRE1BX0NPTgkJUzNDMjQxMF9VU0JEUkVHKDB4MDI0MCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAzX0RNQV9VTklUCVMzQzI0MTBfVVNCRFJFRygweDAyNDQpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQM19ETUFfRklGTwlTM0MyNDEwX1VTQkRSRUcoMHgwMjQ4KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRE1BX1RUQ19MCVMzQzI0MTBfVVNCRFJFRygweDAyNGMpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQM19ETUFfVFRDX00JUzNDMjQxMF9VU0JEUkVHKDB4MDI1MCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAzX0RNQV9UVENfSAlTM0MyNDEwX1VTQkRSRUcoMHgwMjU0KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQNF9ETUFfQ09OCQlTM0MyNDEwX1VTQkRSRUcoMHgwMjU4KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDRfRE1BX1VOSVQJUzNDMjQxMF9VU0JEUkVHKDB4MDI1YykKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0RNQV9GSUZPCVMzQzI0MTBfVVNCRFJFRygweDAyNjApCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQNF9ETUFfVFRDX0wJUzNDMjQxMF9VU0JEUkVHKDB4MDI2NCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0RNQV9UVENfTQlTM0MyNDEwX1VTQkRSRUcoMHgwMjY4KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDRfRE1BX1RUQ19ICVMzQzI0MTBfVVNCRFJFRygweDAyNmMpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5ERVhfUkVHCQlTM0MyNDEwX1VTQkRSRUcoMHgwMTc4KQotCi0vKiBpbmRleGVkIHJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIFMzQzI0MTBfVURDX01BWFBfUkVHCQlTM0MyNDEwX1VTQkRSRUcoMHgwMTgwKQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfUkVHCQlTM0MyNDEwX1VTQkRSRUcoMHgwMTg0KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lOX0NTUjFfUkVHCQlTM0MyNDEwX1VTQkRSRUcoMHgwMTg0KQotI2RlZmluZSBTM0MyNDEwX1VEQ19JTl9DU1IyX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE4OCkKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19PVVRfQ1NSMV9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE5MCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfT1VUX0NTUjJfUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxOTQpCi0jZGVmaW5lIFMzQzI0MTBfVURDX09VVF9GSUZPX0NOVDFfUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxOTgpCi0jZGVmaW5lIFMzQzI0MTBfVURDX09VVF9GSUZPX0NOVDJfUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxOWMpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfRlVOQ0FERFJfVVBEQVRFCSgxPDw3KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9JU09VUAkJKDE8PDcpIC8vIFIvVwotI2RlZmluZSBTM0MyNDEwX1VEQ19QV1JfUkVTRVQJCSgxPDwzKSAvLyBSCi0jZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9SRVNVTUUJCSgxPDwyKSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfUFdSX1NVU1BFTkQJCSgxPDwxKSAvLyBSCi0jZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9FTlNVU1BFTkQJKDE8PDApIC8vIFIvVwotCi0jZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9ERUZBVUxUCQkweDAwCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5UX0VQNAkJKDE8PDQpIC8vIFIvVyAoY2xlYXIgb25seSkKLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5UX0VQMwkJKDE8PDMpIC8vIFIvVyAoY2xlYXIgb25seSkKLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5UX0VQMgkJKDE8PDIpIC8vIFIvVyAoY2xlYXIgb25seSkKLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5UX0VQMQkJKDE8PDEpIC8vIFIvVyAoY2xlYXIgb25seSkKLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5UX0VQMAkJKDE8PDApIC8vIFIvVyAoY2xlYXIgb25seSkKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JJTlRfUkVTRVQJKDE8PDIpIC8vIFIvVyAoY2xlYXIgb25seSkKLSNkZWZpbmUgUzNDMjQxMF9VRENfVVNCSU5UX1JFU1VNRQkoMTw8MSkgLy8gUi9XIChjbGVhciBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JJTlRfU1VTUEVORAkoMTw8MCkgLy8gUi9XIChjbGVhciBvbmx5KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lOVEVfRVA0CQkoMTw8NCkgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lOVEVfRVAzCQkoMTw8MykgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lOVEVfRVAyCQkoMTw8MikgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lOVEVfRVAxCQkoMTw8MSkgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lOVEVfRVAwCQkoMTw8MCkgLy8gUi9XCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfVVNCSU5URV9SRVNFVAkoMTw8MikgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX1VTQklOVEVfU1VTUEVORAkoMTw8MCkgLy8gUi9XCi0KLQotI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDAJCSgweDAwKQotI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDEJCSgweDAxKSAvLyA/PwotI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDIJCSgweDAyKSAvLyA/PwotI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDMJCSgweDAzKSAvLyA/PwotI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDQJCSgweDA0KSAvLyA/PwotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IxX0NMUkRUCQkoMTw8NikgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IxX1NFTlRTVEwJKDE8PDUpIC8vIFIvVyAoY2xlYXIgb25seSkKLSNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfU0VORFNUTAkoMTw8NCkgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IxX0ZGTFVTSAkoMTw8MykgLy8gVyAgIChzZXQgb25seSkKLSNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfVU5EUlVOCSgxPDwyKSAvLyBSL1cgKGNsZWFyIG9ubHkpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IxX1BLVFJEWQkoMTw8MCkgLy8gUi9XIChzZXQgb25seSkKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMl9BVVRPU0VUCSgxPDw3KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjJfSVNPCQkoMTw8NikgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IyX01PREVJTgkoMTw8NSkgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IyX0RNQUlFTgkoMTw8NCkgLy8gUi9XCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjFfQ0xSRFQJCSgxPDw3KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjFfU0VOVFNUTAkoMTw8NikgLy8gUi9XIChjbGVhciBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9TRU5EU1RMCSgxPDw1KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjFfRkZMVVNICSgxPDw0KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjFfREVSUk9SCSgxPDwzKSAvLyBSCi0jZGVmaW5lIFMzQzI0MTBfVURDX09DU1IxX09WUlJVTgkoMTw8MikgLy8gUi9XIChjbGVhciBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9QS1RSRFkJKDE8PDApIC8vIFIvVyAoY2xlYXIgb25seSkKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMl9BVVRPQ0xSCSgxPDw3KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjJfSVNPCQkoMTw8NikgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX09DU1IyX0RNQUlFTgkoMTw8NSkgLy8gUi9XCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9PUEtSRFkJKDE8PDApCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfSVBLUkRZCSgxPDwxKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NFTlRTVEwJKDE8PDIpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfREUJCSgxPDwzKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NFCQkoMTw8NCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9TRU5EU1RMCSgxPDw1KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NPUEtUUkRZCSgxPDw2KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NTRQkoMTw8NykKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19NQVhQXzgJCSgxPDwwKQotI2RlZmluZSBTM0MyNDEwX1VEQ19NQVhQXzE2CQkoMTw8MSkKLSNkZWZpbmUgUzNDMjQxMF9VRENfTUFYUF8zMgkJKDE8PDIpCi0jZGVmaW5lIFMzQzI0MTBfVURDX01BWFBfNjQJCSgxPDwzKQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEwLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhYjRhYWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3MzYzI0MTAuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgczNjMjQxMCBtYWNoaW5lIGRpcmVjdG9yeQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotKi8KLQotI2lmZGVmIENPTkZJR19DUFVfUzNDMjQxMAotCi1leHRlcm4gIGludCBzM2MyNDEwX2luaXQodm9pZCk7Ci1leHRlcm4gIGludCBzM2MyNDEwYV9pbml0KHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDEwX21hcF9pbyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxMF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLSNlbHNlCi0jZGVmaW5lIHMzYzI0MTBfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzM2MyNDEwX2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBzM2MyNDEwX21hcF9pbyBOVUxMCi0jZGVmaW5lIHMzYzI0MTBfaW5pdCBOVUxMCi0jZGVmaW5lIHMzYzI0MTBhX2luaXQgTlVMTAotI2VuZGlmCi0KLWV4dGVybiBpbnQgczNjMjQxMF9iYXNlY2xrX2FkZCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQxMi5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMTVkM2IuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3MzYzI0MTIuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgczNjMjQxMiBjcHUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEyCi0KLWV4dGVybiAgaW50IHMzYzI0MTJfaW5pdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxMl9tYXBfaW8odm9pZCk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0MTJfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0MTJfaW5pdF9jbG9ja3MoaW50IHh0YWwpOwotCi1leHRlcm4gIGludCBzM2MyNDEyX2Jhc2VjbGtfYWRkKHZvaWQpOwotI2Vsc2UKLSNkZWZpbmUgczNjMjQxMl9pbml0X2Nsb2NrcyBOVUxMCi0jZGVmaW5lIHMzYzI0MTJfaW5pdF91YXJ0cyBOVUxMCi0jZGVmaW5lIHMzYzI0MTJfbWFwX2lvIE5VTEwKLSNkZWZpbmUgczNjMjQxMl9pbml0IE5VTEwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDE2LmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzYzA5MC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvczNjMjQ0My5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFlhdWhlbiBLaGFydXpoeSA8amVraG9yQGdtYWlsLmNvbT4KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgczNjMjQxNiBjcHUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZkZWYgQ09ORklHX0NQVV9TM0MyNDE2Ci0KLXN0cnVjdCBzM2MyNDEwX3VhcnRjZmc7Ci0KLWV4dGVybiAgaW50IHMzYzI0MTZfaW5pdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxNl9tYXBfaW8odm9pZCk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0MTZfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0MTZfaW5pdF9jbG9ja3MoaW50IHh0YWwpOwotCi1leHRlcm4gIGludCBzM2MyNDE2X2Jhc2VjbGtfYWRkKHZvaWQpOwotCi0jZWxzZQotI2RlZmluZSBzM2MyNDE2X2luaXRfY2xvY2tzIE5VTEwKLSNkZWZpbmUgczNjMjQxNl9pbml0X3VhcnRzIE5VTEwKLSNkZWZpbmUgczNjMjQxNl9tYXBfaW8gTlVMTAotI2RlZmluZSBzM2MyNDE2X2luaXQgTlVMTAotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0NDMuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQ0My5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk3MTVmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQ0My5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogbGludXgvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9zM2MyNDQzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgczNjMjQ0MyBjcHUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQzCi0KLXN0cnVjdCBzM2MyNDEwX3VhcnRjZmc7Ci0KLWV4dGVybiAgaW50IHMzYzI0NDNfaW5pdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQ0M19tYXBfaW8odm9pZCk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0NDNfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0NDNfaW5pdF9jbG9ja3MoaW50IHh0YWwpOwotCi1leHRlcm4gIGludCBzM2MyNDQzX2Jhc2VjbGtfYWRkKHZvaWQpOwotCi0jZWxzZQotI2RlZmluZSBzM2MyNDQzX2luaXRfY2xvY2tzIE5VTEwKLSNkZWZpbmUgczNjMjQ0M19pbml0X3VhcnRzIE5VTEwKLSNkZWZpbmUgczNjMjQ0M19tYXBfaW8gTlVMTAotI2RlZmluZSBzM2MyNDQzX2luaXQgTlVMTAotI2VuZGlmCi0KLS8qIGNvbW1vbiBjb2RlIHVzZWQgYnkgczNjMjQ0MyBhbmQgb3RoZXJzLgotICogbm90ZSwgbm90IHRvIGJlIHVzZWQgb3V0c2lkZSBvZiBhcmNoL2FybS9tYWNoLXMzYyogKi8KLQotc3RydWN0IGNsazsJLyogc29tZSBmaWxlcyBkb24ndCBuZWVkIGNsay5oIG90aGVyd2lzZSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGludCAoKnBsbF9mbikodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IGJhc2UpOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgKCpmZGl2X2ZuKSh1bnNpZ25lZCBsb25nIGNsa2NvbjApOwotCi1leHRlcm4gdm9pZCBzM2MyNDQzX2NvbW1vbl9zZXR1cF9jbG9ja3MocGxsX2ZuIGdldF9tcGxsLCBmZGl2X2ZuIGZkaXYpOwotZXh0ZXJuIHZvaWQgczNjMjQ0M19jb21tb25faW5pdF9jbG9ja3MoaW50IHh0YWwsIHBsbF9mbiBnZXRfbXBsbCwgZmRpdl9mbiBmZGl2KTsKLQotZXh0ZXJuIGludCBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfaChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOwotZXh0ZXJuIGludCBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOwotZXh0ZXJuIGludCBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcyhzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOwotCi1leHRlcm4gc3RydWN0IGNsa3NyY19jbGsgY2xrX2VwbGxyZWY7Ci1leHRlcm4gc3RydWN0IGNsa3NyY19jbGsgY2xrX2VzeXNjbGs7Ci1leHRlcm4gc3RydWN0IGNsa3NyY19jbGsgY2xrX21zeXNjbGs7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0NHguaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQ0eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWU4ZDBhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQ0eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDR4LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgUzNDMjQ0MCBhbmQgUzNDMjQ0MiBjcHUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0NDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDQyKQotCi1leHRlcm4gdm9pZCBzM2MyNDR4X21hcF9pbyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQ0eF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQ0eF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLSNlbHNlCi0jZGVmaW5lIHMzYzI0NHhfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzM2MyNDR4X2luaXRfdWFydHMgTlVMTAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDAKLWV4dGVybiAgaW50IHMzYzI0NDBfaW5pdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQ0MF9tYXBfaW8odm9pZCk7Ci0jZWxzZQotI2RlZmluZSBzM2MyNDQwX2luaXQgTlVMTAotI2RlZmluZSBzM2MyNDQwX21hcF9pbyBOVUxMCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MgotZXh0ZXJuICBpbnQgczNjMjQ0Ml9pbml0KHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDQyX21hcF9pbyh2b2lkKTsKLSNlbHNlCi0jZGVmaW5lIHMzYzI0NDJfaW5pdCBOVUxMCi0jZGVmaW5lIHMzYzI0NDJfbWFwX2lvIE5VTEwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC91ZGMuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvdWRjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Mzg4NDI0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvdWRjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3VkYy5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+Ci0gKgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICoKLSAqICBDaGFuZ2Vsb2c6Ci0gKgkxNC1NYXItMjAwNQlSVFAJQ3JlYXRlZCBmaWxlCi0gKgkwMi1BdWctMjAwNQlSVFAJRmlsZSByZW5hbWUKLSAqCTA3LVNlcC0yMDA1CUJKRAlNaW5vciBjbGVhbnVwcywgY2hhbmdlZCBjbWQgdG8gZW51bQotICoJMTgtSmFuLTIwMDcJSE1XCUFkZCBwZXItcGxhdGZvcm0gdmJ1c19kcmF3IGZ1bmN0aW9uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSTV9BUkNIX1VEQ19ICi0jZGVmaW5lIF9fQVNNX0FSTV9BUkNIX1VEQ19ICi0KLWVudW0gczNjMjQxMF91ZGNfY21kX2UgewotCVMzQzI0MTBfVURDX1BfRU5BQkxFCT0gMSwJLyogUHVsbC11cCBlbmFibGUgICAgICAgICovCi0JUzNDMjQxMF9VRENfUF9ESVNBQkxFCT0gMiwJLyogUHVsbC11cCBkaXNhYmxlICAgICAgICovCi0JUzNDMjQxMF9VRENfUF9SRVNFVAk9IDMsCS8qIFVEQyByZXNldCwgaW4gY2FzZSBvZiAqLwotfTsKLQotc3RydWN0IHMzYzI0MTBfdWRjX21hY2hfaW5mbyB7Ci0Jdm9pZAkoKnVkY19jb21tYW5kKShlbnVtIHMzYzI0MTBfdWRjX2NtZF9lKTsKLSAJdm9pZAkoKnZidXNfZHJhdykodW5zaWduZWQgaW50IG1hKTsKLQotCXVuc2lnbmVkIGludCBwdWxsdXBfcGluOwotCXVuc2lnbmVkIGludCBwdWxsdXBfcGluX2ludmVydGVkOwotCi0JdW5zaWduZWQgaW50IHZidXNfcGluOwotCXVuc2lnbmVkIGNoYXIgdmJ1c19waW5faW52ZXJ0ZWQ7Ci19OwotCi1leHRlcm4gdm9pZCBfX2luaXQgczNjMjR4eF91ZGNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3VkY19tYWNoX2luZm8gKik7Ci0KLS8qKgotICogczNjMjR4eF9oc3VkY19wbGF0ZGF0YSAtIFBsYXRmb3JtIGRhdGEgZm9yIFVTQiBIaWdoLVNwZWVkIGdhZGdldCBjb250cm9sbGVyLgotICogQGVwbnVtOiBOdW1iZXIgb2YgZW5kcG9pbnRzIHRvIGJlIGluc3RhbnRpYXRlZCBieSB0aGUgY29udHJvbGxlciBkcml2ZXIuCi0gKiBAZ3Bpb19pbml0OiBQbGF0Zm9ybSBzcGVjaWZpYyBVU0IgcmVsYXRlZCBHUElPIGluaXRpYWxpemF0aW9uLgotICogQGdwaW9fdW5pbml0OiBQbGF0Zm9ybSBzcGVjaWZpYyBVU0IgcmVsZXRlZCBHUElPIHVuaW5pdGlhbHphdGlvbi4KLSAqCi0gKiBSZXByZXNlbnRhdGlvbiBvZiBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgUzNDMjRYWCBVU0IgMi4wIEhpZ2ggU3BlZWQgZ2FkZ2V0Ci0gKiBjb250cm9sbGVycy4KLSAqLwotc3RydWN0IHMzYzI0eHhfaHN1ZGNfcGxhdGRhdGEgewotCXVuc2lnbmVkIGludAllcG51bTsKLQl2b2lkCQkoKmdwaW9faW5pdCkodm9pZCk7Ci0Jdm9pZAkJKCpncGlvX3VuaW5pdCkodm9pZCk7Ci19OwotCi1leHRlcm4gdm9pZCBfX2luaXQgczNjMjR4eF9oc3VkY19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0eHhfaHN1ZGNfcGxhdGRhdGEgKnBkKTsKLQotI2VuZGlmIC8qIF9fQVNNX0FSTV9BUkNIX1VEQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0My1jbG9jay5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NDMtY2xvY2suYwppbmRleCA1OTU1MmMwLi41YTIxYjE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0My1jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDQzLWNsb2NrLmMKQEAgLTE2MCw2ICsxNjAsMTI0IEBACiAJfSwKIH07CiAKKy8qIGFybWRpdgorICoKKyAqIHRoaXMgY2xvY2sgaXMgc291cmNlZCBmcm9tIG1zeXNjbGsgYW5kIGNhbiBoYXZlIGEgbnVtYmVyIG9mCisgKiBkaXZpZGVyIHZhbHVlcyBhcHBsaWVkIHRvIGl0IHRvIHRoZW4gYmUgZmVkIGludG8gYXJtY2xrLgorKi8KKworc3RhdGljIHVuc2lnbmVkIGludCAqYXJtZGl2Oworc3RhdGljIGludCBucl9hcm1kaXY7CitzdGF0aWMgaW50IGFybWRpdm1hc2s7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzI0NDNfYXJtY2xrX3JvdW5kcmF0ZShzdHJ1Y3QgY2xrICpjbGssCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudCA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyBjYWxjOworCXVuc2lnbmVkIGJlc3QgPSAyNTY7IC8qIGJpZ2dlciB0aGFuIGFueSB2YWx1ZSAqLworCXVuc2lnbmVkIGRpdjsKKwlpbnQgcHRyOworCisJaWYgKCFucl9hcm1kaXYpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBucl9hcm1kaXY7IHB0cisrKSB7CisJCWRpdiA9IGFybWRpdltwdHJdOworCQlpZiAoZGl2KSB7CisJCQkvKiBjcHVmcmVxIHByb3ZpZGVzIDI2Nm1oeiBhcyAyNjY2NjYwMDAgbm90IDI2NjY2NjY2NiAqLworCQkJY2FsYyA9IChwYXJlbnQgLyBkaXYgLyAxMDAwKSAqIDEwMDA7CisJCQlpZiAoY2FsYyA8PSByYXRlICYmIGRpdiA8IGJlc3QpCisJCQkJYmVzdCA9IGRpdjsKKwkJfQorCX0KKworCXJldHVybiBwYXJlbnQgLyBiZXN0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzM2MyNDQzX2FybWNsa19nZXRyYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIHJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgY2xrY29uMDsKKwlpbnQgdmFsOworCisJaWYgKCFucl9hcm1kaXYgfHwgIWFybWRpdm1hc2spCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrY29uMCA9IF9fcmF3X3JlYWRsKFMzQzI0NDNfQ0xLRElWMCk7CisJY2xrY29uMCAmPSBhcm1kaXZtYXNrOworCXZhbCA9IGNsa2NvbjAgPj4gUzNDMjQ0M19DTEtESVYwX0FSTURJVl9TSElGVDsKKworCXJldHVybiByYXRlIC8gYXJtZGl2W3ZhbF07Cit9CisKK3N0YXRpYyBpbnQgczNjMjQ0M19hcm1jbGtfc2V0cmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudCA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyBjYWxjOworCXVuc2lnbmVkIGRpdjsKKwl1bnNpZ25lZCBiZXN0ID0gMjU2OyAvKiBiaWdnZXIgdGhhbiBhbnkgdmFsdWUgKi8KKwlpbnQgcHRyOworCWludCB2YWwgPSAtMTsKKworCWlmICghbnJfYXJtZGl2IHx8ICFhcm1kaXZtYXNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAocHRyID0gMDsgcHRyIDwgbnJfYXJtZGl2OyBwdHIrKykgeworCQlkaXYgPSBhcm1kaXZbcHRyXTsKKwkJaWYgKGRpdikgeworCQkJLyogY3B1ZnJlcSBwcm92aWRlcyAyNjZtaHogYXMgMjY2NjY2MDAwIG5vdCAyNjY2NjY2NjYgKi8KKwkJCWNhbGMgPSAocGFyZW50IC8gZGl2IC8gMTAwMCkgKiAxMDAwOworCQkJaWYgKGNhbGMgPD0gcmF0ZSAmJiBkaXYgPCBiZXN0KSB7CisJCQkJYmVzdCA9IGRpdjsKKwkJCQl2YWwgPSBwdHI7CisJCQl9CisJCX0KKwl9CisKKwlpZiAodmFsID49IDApIHsKKwkJdW5zaWduZWQgbG9uZyBjbGtjb24wOworCisJCWNsa2NvbjAgPSBfX3Jhd19yZWFkbChTM0MyNDQzX0NMS0RJVjApOworCQljbGtjb24wICY9IH5hcm1kaXZtYXNrOworCQljbGtjb24wIHw9IHZhbCA8PCBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX1NISUZUOworCQlfX3Jhd193cml0ZWwoY2xrY29uMCwgUzNDMjQ0M19DTEtESVYwKTsKKwl9CisKKwlyZXR1cm4gKHZhbCA9PSAtMSkgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2FybWRpdiA9IHsKKwkubmFtZQkJPSAiYXJtZGl2IiwKKwkucGFyZW50CQk9ICZjbGtfbXN5c2Nsay5jbGssCisJLm9wcwkJPSAmKHN0cnVjdCBjbGtfb3BzKSB7CisJCS5yb3VuZF9yYXRlID0gczNjMjQ0M19hcm1jbGtfcm91bmRyYXRlLAorCQkuZ2V0X3JhdGUgPSBzM2MyNDQzX2FybWNsa19nZXRyYXRlLAorCQkuc2V0X3JhdGUgPSBzM2MyNDQzX2FybWNsa19zZXRyYXRlLAorCX0sCit9OworCisvKiBhcm1jbGsKKyAqCisgKiB0aGlzIGlzIHRoZSBjbG9jayBmZWQgaW50byB0aGUgQVJNIGNvcmUgaXRzZWxmLCBmcm9tIGFybWRpdiBvciBmcm9tIGhjbGsuCisgKi8KKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa19hcm1fc291cmNlc1tdID0geworCVswXSA9ICZjbGtfYXJtZGl2LAorCVsxXSA9ICZjbGtfaCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYXJtID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhcm1jbGsiLAorCX0sCisJLnNvdXJjZXMgPSAmKHN0cnVjdCBjbGtzcmNfc291cmNlcykgeworCQkuc291cmNlcyA9IGNsa19hcm1fc291cmNlcywKKwkJLm5yX3NvdXJjZXMgPSBBUlJBWV9TSVpFKGNsa19hcm1fc291cmNlcyksCisJfSwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFMzQzI0NDNfQ0xLRElWMCwgLnNpemUgPSAxLCAuc2hpZnQgPSAxMyB9LAorfTsKKwogLyogdXNiaG9zdAogICoKICAqIHVzYiBob3N0IGJ1cy1jbG9jaywgdXN1YWxseSA0OE1IeiB0byBwcm92aWRlIFVTQiBidXMgY2xvY2sgdGltaW5nCkBAIC0yMDUsOSArMzIzLDY0IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19pMnNfZXh0ID0geworCS5uYW1lCQk9ICJpMnMtZXh0IiwKK307CisKKy8qIGkyc19lcGxsZGl2CisgKgorICogVGhpcyBjbG9jayBpcyB0aGUgb3V0cHV0IGZyb20gdGhlIEkyUyBkaXZpc29yIG9mIEVTWVNDTEssIGFuZCBpcyBzZXBhcmF0ZQorICogZnJvbSB0aGUgbXV4IHRoYXQgY29tZXMgYWZ0ZXIgaXQgKGNhbm5vdCBtZXJnZSBpbnRvIG9uZSBzaW5nbGUgY2xvY2spCisqLworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2kyc19lcGxsZGl2ID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJpMnMtZXBsbGRpdiIsCisJCS5wYXJlbnQJCT0gJmNsa19lc3lzY2xrLmNsaywKKwl9LAorCS5yZWdfZGl2ID0geyAucmVnID0gUzNDMjQ0M19DTEtESVYxLCAuc2l6ZSA9IDQsIC5zaGlmdCA9IDEyLCB9LAorfTsKKworLyogaTJzLXJlZgorICoKKyAqIGkycyBidXMgcmVmZXJlbmNlIGNsb2NrLCBzZWxlY3RhYmxlIGZyb20gZXh0ZXJuYWwsIGVzeXNjbGsgb3IgZXBsbHJlZgorICoKKyAqIE5vdGUsIHRoaXMgdXNlZCB0byBiZSB0d28gY2xvY2tzLCBidXQgd2FzIGNvbXByZXNzZWQgaW50byBvbmUuCisqLworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrX2kyc19zcmNsaXN0W10gPSB7CisJWzBdID0gJmNsa19pMnNfZXBsbGRpdi5jbGssCisJWzFdID0gJmNsa19pMnNfZXh0LAorCVsyXSA9ICZjbGtfZXBsbHJlZi5jbGssCisJWzNdID0gJmNsa19lcGxscmVmLmNsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfaTJzID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJpMnMtaWYiLAorCQkuY3RybGJpdAk9IFMzQzI0NDNfU0NMS0NPTl9JMlNDTEssCisJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3MsCisKKwl9LAorCS5zb3VyY2VzID0gJihzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMpIHsKKwkJLnNvdXJjZXMgPSBjbGtfaTJzX3NyY2xpc3QsCisJCS5ucl9zb3VyY2VzID0gQVJSQVlfU0laRShjbGtfaTJzX3NyY2xpc3QpLAorCX0sCisJLnJlZ19zcmMgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS1NSQywgLnNpemUgPSAyLCAuc2hpZnQgPSAxNCB9LAorfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3Nfb2ZmW10gPSB7CiAJeworCQkubmFtZQkJPSAiaWlzIiwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3AsCisJCS5jdHJsYml0CT0gUzNDMjQ0M19QQ0xLQ09OX0lJUywKKwl9LCB7CisJCS5uYW1lCQk9ICJoc3NwaSIsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLAorCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9IU1NQSSwKKwl9LCB7CiAJCS5uYW1lCQk9ICJhZGMiLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcCwKQEAgLTI1Myw2ICs0MjYsNyBAQAogCQkuY3RybGJpdAk9IFMzQzI0NDNfSENMS0NPTl9ETUE1LAogCX0sIHsKIAkJLm5hbWUJCT0gImhzbW1jIiwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjEiLAogCQkucGFyZW50CQk9ICZjbGtfaCwKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfaCwKIAkJLmN0cmxiaXQJPSBTM0MyNDQzX0hDTEtDT05fSFNNTUMsCkBAIC0zNDcsOCArNTIxLDcgQEAKIAogLyogRVBMTENPTiBjb21wYXRpYmxlIGVub3VnaCB0byBnZXQgb24vb2ZmIGluZm9ybWF0aW9uICovCiAKLXZvaWQgX19pbml0X29yX2NwdWZyZXEgczNjMjQ0M19jb21tb25fc2V0dXBfY2xvY2tzKHBsbF9mbiBnZXRfbXBsbCwKLQkJCQkJCSAgIGZkaXZfZm4gZ2V0X2ZkaXYpCit2b2lkIF9faW5pdF9vcl9jcHVmcmVxIHMzYzI0NDNfY29tbW9uX3NldHVwX2Nsb2NrcyhwbGxfZm4gZ2V0X21wbGwpCiB7CiAJdW5zaWduZWQgbG9uZyBlcGxsY29uID0gX19yYXdfcmVhZGwoUzNDMjQ0M19FUExMQ09OKTsKIAl1bnNpZ25lZCBsb25nIG1wbGxjb24gPSBfX3Jhd19yZWFkbChTM0MyNDQzX01QTExDT04pOwpAQCAtMzY4LDcgKzU0MSw3IEBACiAJcGxsID0gZ2V0X21wbGwobXBsbGNvbiwgeHRhbCk7CiAJY2xrX21zeXNjbGsuY2xrLnJhdGUgPSBwbGw7CiAKLQlmY2xrID0gcGxsIC8gZ2V0X2ZkaXYoY2xrZGl2MCk7CisJZmNsayA9IGNsa19nZXRfcmF0ZSgmY2xrX2FybWRpdik7CiAJaGNsayA9IHMzYzI0NDNfcHJlZGl2X2dldHJhdGUoJmNsa19wcmVkaXYpOwogCWhjbGsgLz0gczNjMjQ0M19nZXRfaGRpdihjbGtkaXYwKTsKIAlwY2xrID0gaGNsayAvICgoY2xrZGl2MCAmIFMzQzI0NDNfQ0xLRElWMF9IQUxGX1BDTEspID8gMiA6IDEpOwpAQCAtNDAzLDIwICs1NzYsMjkgQEAKIAkmY2xrX2V4dCwKIAkmY2xrX2VwbGwsCiAJJmNsa191c2JfYnVzLAorCSZjbGtfYXJtZGl2LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrICpjbGtzcmNzW10gX19pbml0ZGF0YSA9IHsKKwkmY2xrX2kyc19lcGxsZGl2LAorCSZjbGtfaTJzLAogCSZjbGtfdXNiX2J1c19ob3N0LAogCSZjbGtfZXBsbHJlZiwKIAkmY2xrX2VzeXNjbGssCiAJJmNsa19tc3lzY2xrLAorCSZjbGtfYXJtLAogfTsKIAogdm9pZCBfX2luaXQgczNjMjQ0M19jb21tb25faW5pdF9jbG9ja3MoaW50IHh0YWwsIHBsbF9mbiBnZXRfbXBsbCwKLQkJCQkgICAgICAgZmRpdl9mbiBnZXRfZmRpdikKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpkaXZzLCBpbnQgbnJfZGl2cywKKwkJCQkgICAgICAgaW50IGRpdm1hc2spCiB7CiAJaW50IHB0cjsKIAorCWFybWRpdiA9IGRpdnM7CisJbnJfYXJtZGl2ID0gbnJfZGl2czsKKwlhcm1kaXZtYXNrID0gZGl2bWFzazsKKwogCS8qIHMzYzI0NDMgcGFyZW50cyBoIGFuZCBwIGNsb2NrcyBmcm9tIHByZWRpdiAqLwogCWNsa19oLnBhcmVudCA9ICZjbGtfcHJlZGl2OwogCWNsa19wLnBhcmVudCA9ICZjbGtfcHJlZGl2OwpAQCAtNDM3LDUgKzYxOSw1IEBACiAJczNjX3JlZ2lzdGVyX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7CiAJczNjX2Rpc2FibGVfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKIAotCXMzYzI0NDNfY29tbW9uX3NldHVwX2Nsb2NrcyhnZXRfbXBsbCwgZ2V0X2ZkaXYpOworCXMzYzI0NDNfY29tbW9uX3NldHVwX2Nsb2NrcyhnZXRfbXBsbCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1zNXAvS2NvbmZpZwppbmRleCA5YTE5N2U1Li45Yjk5NjhmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL0tjb25maWcKQEAgLTcsNyArNyw3IEBACiAKIGNvbmZpZyBQTEFUX1M1UAogCWJvb2wKLQlkZXBlbmRzIG9uIChBUkNIX1M1UDY0WDAgfHwgQVJDSF9TNVBDMTAwIHx8IEFSQ0hfUzVQVjIxMCB8fCBBUkNIX0VYWU5PUzQpCisJZGVwZW5kcyBvbiAoQVJDSF9TNVA2NFgwIHx8IEFSQ0hfUzVQQzEwMCB8fCBBUkNIX1M1UFYyMTAgfHwgQVJDSF9FWFlOT1MpCiAJZGVmYXVsdCB5CiAJc2VsZWN0IEFSTV9WSUMgaWYgIUFSQ0hfRVhZTk9TNAogCXNlbGVjdCBBUk1fR0lDIGlmIEFSQ0hfRVhZTk9TNApAQCAtMTYsOSArMTYsNiBAQAogCXNlbGVjdCBTM0NfR1BJT19UUkFDSwogCXNlbGVjdCBTNVBfR1BJT19EUlZTVFIKIAlzZWxlY3QgU0FNU1VOR19HUElPTElCXzRCSVQKLQlzZWxlY3QgUzNDX0dQSU9fQ0ZHX1MzQzY0WFgKLQlzZWxlY3QgUzNDX0dQSU9fUFVMTF9VUERPV04KLQlzZWxlY3QgUzNDX0dQSU9fQ0ZHX1MzQzI0WFgKIAlzZWxlY3QgUExBVF9TQU1TVU5HCiAJc2VsZWN0IFNBTVNVTkdfQ0xLU1JDCiAJc2VsZWN0IFNBTVNVTkdfSVJRX1ZJQ19USU1FUgpAQCAtNDIsNiArMzksMTIgQEAKIAloZWxwCiAJICBVc2UgdGhlIEhpZ2ggUmVzb2x1dGlvbiB0aW1lciBzdXBwb3J0CiAKK2NvbmZpZyBTNVBfUE0KKwlib29sCisJaGVscAorCSAgQ29tbW9uIGNvZGUgZm9yIHBvd2VyIG1hbmFnZW1lbnQgc3VwcG9ydCBvbiBTNVAgYW5kIG5ld2VyIFNvQ3MKKwkgIE5vdGU6IERvIG5vdCBzZWxlY3QgdGhpcyBmb3IgUzVQNjQ0MCBhbmQgUzVQNjQ1MC4KKwogY29tbWVudCAiU3lzdGVtIE1NVSIKIAogY29uZmlnIFM1UF9TWVNURU1fTU1VCkBAIC01MCw2ICs1MywxMiBAQAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFN5c3RlbSBNTVUKIAorY29uZmlnIFM1UF9TTEVFUAorCWJvb2wKKwloZWxwCisJICBJbnRlcm5hbCBjb25maWcgbm9kZSB0byBhcHBseSBjb21tb24gUzVQIHNsZWVwIG1hbmFnZW1lbnQgY29kZS4KKwkgIENhbiBiZSBzZWxlY3RlZCBieSBTNVAgYW5kIG5ld2VyIFNvQ3Mgd2l0aCBzaW1pbGFyIHNsZWVwIHByb2NlZHVyZS4KKwogY29uZmlnIFM1UF9ERVZfRklNQzAKIAlib29sCiAJaGVscApAQCAtNzUsNiArODQsMTEgQEAKIAloZWxwCiAJICBDb21waWxlIGluIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucyBmb3IgRklNRCBjb250cm9sbGVyIDAKIAorY29uZmlnIFM1UF9ERVZfSTJDX0hETUlQSFkKKwlib29sCisJaGVscAorCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMgZm9yIEkyQyBIRE1JUEhZIGNvbnRyb2xsZXIKKwogY29uZmlnIFM1UF9ERVZfTUZDCiAJYm9vbAogCWhlbHAKQEAgLTk1LDYgKzEwOSwxMSBAQAogCWhlbHAKIAkgIENvbXBpbGUgaW4gcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb25zIGZvciBNSVBJLUNTSVMgY2hhbm5lbCAxCiAKK2NvbmZpZyBTNVBfREVWX1RWCisJYm9vbAorCWhlbHAKKwkgIENvbXBpbGUgaW4gcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb24gZm9yIFRWIGludGVyZmFjZQorCiBjb25maWcgUzVQX0RFVl9VU0JfRUhDSQogCWJvb2wKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtczVwL01ha2VmaWxlCmluZGV4IDRiNTNlMDQuLjg3NjM0NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL01ha2VmaWxlCkBAIC0xMiw3ICsxMiw2IEBACiAKICMgQ29yZSBmaWxlcwogCi1vYmoteQkJCQkrPSBkZXYtcG11Lm8KIG9iai15CQkJCSs9IGRldi11YXJ0Lm8KIG9iai15CQkJCSs9IGNwdS5vCiBvYmoteQkJCQkrPSBjbG9jay5vCkBAIC0yMCwxOSArMTksMTAgQEAKIG9iai0kKENPTkZJR19TNVBfRVhUX0lOVCkJKz0gaXJxLWVpbnQubwogb2JqLSQoQ09ORklHX1M1UF9HUElPX0lOVCkJKz0gaXJxLWdwaW9pbnQubwogb2JqLSQoQ09ORklHX1M1UF9TWVNURU1fTU1VKQkrPSBzeXNtbXUubwotb2JqLSQoQ09ORklHX1BNKQkJKz0gcG0ubwotb2JqLSQoQ09ORklHX1BNKQkJKz0gaXJxLXBtLm8KK29iai0kKENPTkZJR19TNVBfUE0pCQkrPSBwbS5vIGlycS1wbS5vCitvYmotJChDT05GSUdfUzVQX1NMRUVQKQkJKz0gc2xlZXAubwogb2JqLSQoQ09ORklHX1M1UF9IUlQpIAkJKz0gczVwLXRpbWUubwogCiAjIGRldmljZXMKIG9iai0kKENPTkZJR19TNVBfREVWX01GQykJKz0gZGV2LW1mYy5vCi1vYmotJChDT05GSUdfUzVQX0RFVl9GSU1DMCkJKz0gZGV2LWZpbWMwLm8KLW9iai0kKENPTkZJR19TNVBfREVWX0ZJTUMxKQkrPSBkZXYtZmltYzEubwotb2JqLSQoQ09ORklHX1M1UF9ERVZfRklNQzIpCSs9IGRldi1maW1jMi5vCi1vYmotJChDT05GSUdfUzVQX0RFVl9GSU1DMykJKz0gZGV2LWZpbWMzLm8KLW9iai0kKENPTkZJR19TNVBfREVWX0ZJTUQwKQkrPSBkZXYtZmltZDAubwotb2JqLSQoQ09ORklHX1M1UF9ERVZfT05FTkFORCkJKz0gZGV2LW9uZW5hbmQubwotb2JqLSQoQ09ORklHX1M1UF9ERVZfQ1NJUzApCSs9IGRldi1jc2lzMC5vCi1vYmotJChDT05GSUdfUzVQX0RFVl9DU0lTMSkJKz0gZGV2LWNzaXMxLm8KLW9iai0kKENPTkZJR19TNVBfREVWX1VTQl9FSENJKQkrPSBkZXYtZWhjaS5vCiBvYmotJChDT05GSUdfUzVQX1NFVFVQX01JUElQSFkpCSs9IHNldHVwLW1pcGlwaHkubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvY3B1LmMgYi9hcmNoL2FybS9wbGF0LXM1cC9jcHUuYwppbmRleCBiYmMyYWE3Li5hNTY5NTllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9jcHUuYworKysgYi9hcmNoL2FybS9wbGF0LXM1cC9jcHUuYwpAQCAtMzMsNDggKzMzLDY2IEBACiBzdGF0aWMgY29uc3QgY2hhciBuYW1lX3M1cGMxMDBbXSA9ICJTNVBDMTAwIjsKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczVwdjIxMFtdID0gIlM1UFYyMTAvUzVQQzExMCI7CiBzdGF0aWMgY29uc3QgY2hhciBuYW1lX2V4eW5vczQyMTBbXSA9ICJFWFlOT1M0MjEwIjsKK3N0YXRpYyBjb25zdCBjaGFyIG5hbWVfZXh5bm9zNDIxMltdID0gIkVYWU5PUzQyMTIiOworc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9leHlub3M0NDEyW10gPSAiRVhZTk9TNDQxMiI7CiAKIHN0YXRpYyBzdHJ1Y3QgY3B1X3RhYmxlIGNwdV9pZHNbXSBfX2luaXRkYXRhID0gewogCXsKLQkJLmlkY29kZQkJPSAweDU2NDQwMTAwLAotCQkuaWRtYXNrCQk9IDB4ZmZmZmYwMDAsCisJCS5pZGNvZGUJCT0gUzVQNjQ0MF9DUFVfSUQsCisJCS5pZG1hc2sJCT0gUzVQNjRYWF9DUFVfTUFTSywKIAkJLm1hcF9pbwkJPSBzNXA2NDQwX21hcF9pbywKIAkJLmluaXRfY2xvY2tzCT0gczVwNjQ0MF9pbml0X2Nsb2NrcywKIAkJLmluaXRfdWFydHMJPSBzNXA2NDQwX2luaXRfdWFydHMsCiAJCS5pbml0CQk9IHM1cDY0eDBfaW5pdCwKIAkJLm5hbWUJCT0gbmFtZV9zNXA2NDQwLAogCX0sIHsKLQkJLmlkY29kZQkJPSAweDM2NDUwMDAwLAotCQkuaWRtYXNrCQk9IDB4ZmZmZmYwMDAsCisJCS5pZGNvZGUJCT0gUzVQNjQ1MF9DUFVfSUQsCisJCS5pZG1hc2sJCT0gUzVQNjRYWF9DUFVfTUFTSywKIAkJLm1hcF9pbwkJPSBzNXA2NDUwX21hcF9pbywKIAkJLmluaXRfY2xvY2tzCT0gczVwNjQ1MF9pbml0X2Nsb2NrcywKIAkJLmluaXRfdWFydHMJPSBzNXA2NDUwX2luaXRfdWFydHMsCiAJCS5pbml0CQk9IHM1cDY0eDBfaW5pdCwKIAkJLm5hbWUJCT0gbmFtZV9zNXA2NDUwLAogCX0sIHsKLQkJLmlkY29kZQkJPSAweDQzMTAwMDAwLAotCQkuaWRtYXNrCQk9IDB4ZmZmZmYwMDAsCisJCS5pZGNvZGUJCT0gUzVQQzEwMF9DUFVfSUQsCisJCS5pZG1hc2sJCT0gUzVQQzEwMF9DUFVfTUFTSywKIAkJLm1hcF9pbwkJPSBzNXBjMTAwX21hcF9pbywKIAkJLmluaXRfY2xvY2tzCT0gczVwYzEwMF9pbml0X2Nsb2NrcywKIAkJLmluaXRfdWFydHMJPSBzNXBjMTAwX2luaXRfdWFydHMsCiAJCS5pbml0CQk9IHM1cGMxMDBfaW5pdCwKIAkJLm5hbWUJCT0gbmFtZV9zNXBjMTAwLAogCX0sIHsKLQkJLmlkY29kZQkJPSAweDQzMTEwMDAwLAotCQkuaWRtYXNrCQk9IDB4ZmZmZmYwMDAsCisJCS5pZGNvZGUJCT0gUzVQVjIxMF9DUFVfSUQsCisJCS5pZG1hc2sJCT0gUzVQVjIxMF9DUFVfTUFTSywKIAkJLm1hcF9pbwkJPSBzNXB2MjEwX21hcF9pbywKIAkJLmluaXRfY2xvY2tzCT0gczVwdjIxMF9pbml0X2Nsb2NrcywKIAkJLmluaXRfdWFydHMJPSBzNXB2MjEwX2luaXRfdWFydHMsCiAJCS5pbml0CQk9IHM1cHYyMTBfaW5pdCwKIAkJLm5hbWUJCT0gbmFtZV9zNXB2MjEwLAogCX0sIHsKLQkJLmlkY29kZQkJPSAweDQzMjEwMDAwLAotCQkuaWRtYXNrCQk9IDB4ZmZmZTAwMDAsCisJCS5pZGNvZGUJCT0gRVhZTk9TNDIxMF9DUFVfSUQsCisJCS5pZG1hc2sJCT0gRVhZTk9TNF9DUFVfTUFTSywKIAkJLm1hcF9pbwkJPSBleHlub3M0X21hcF9pbywKIAkJLmluaXRfY2xvY2tzCT0gZXh5bm9zNF9pbml0X2Nsb2NrcywKIAkJLmluaXRfdWFydHMJPSBleHlub3M0X2luaXRfdWFydHMsCi0JCS5pbml0CQk9IGV4eW5vczRfaW5pdCwKKwkJLmluaXQJCT0gZXh5bm9zX2luaXQsCiAJCS5uYW1lCQk9IG5hbWVfZXh5bm9zNDIxMCwKKwl9LCB7CisJCS5pZGNvZGUJCT0gRVhZTk9TNDIxMl9DUFVfSUQsCisJCS5pZG1hc2sJCT0gRVhZTk9TNF9DUFVfTUFTSywKKwkJLm1hcF9pbwkJPSBleHlub3M0X21hcF9pbywKKwkJLmluaXRfY2xvY2tzCT0gZXh5bm9zNF9pbml0X2Nsb2NrcywKKwkJLmluaXRfdWFydHMJPSBleHlub3M0X2luaXRfdWFydHMsCisJCS5pbml0CQk9IGV4eW5vc19pbml0LAorCQkubmFtZQkJPSBuYW1lX2V4eW5vczQyMTIsCisJfSwgeworCQkuaWRjb2RlCQk9IEVYWU5PUzQ0MTJfQ1BVX0lELAorCQkuaWRtYXNrCQk9IEVYWU5PUzRfQ1BVX01BU0ssCisJCS5tYXBfaW8JCT0gZXh5bm9zNF9tYXBfaW8sCisJCS5pbml0X2Nsb2Nrcwk9IGV4eW5vczRfaW5pdF9jbG9ja3MsCisJCS5pbml0X3VhcnRzCT0gZXh5bm9zNF9pbml0X3VhcnRzLAorCQkuaW5pdAkJPSBleHlub3NfaW5pdCwKKwkJLm5hbWUJCT0gbmFtZV9leHlub3M0NDEyLAogCX0sCiB9OwogCkBAIC0xMTQsMTMgKzEzMiwxMyBAQAogdm9pZCBfX2luaXQgczVwX2luaXRfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsCiAJCQlpbnQgc2l6ZSwgdm9pZCBfX2lvbWVtICpjcHVpZF9hZGRyKQogewotCXVuc2lnbmVkIGxvbmcgaWRjb2RlOwotCiAJLyogaW5pdGlhbGl6ZSB0aGUgaW8gZGVzY3JpcHRvcnMgd2UgbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24gKi8KIAlpb3RhYmxlX2luaXQoczVwX2lvZGVzYywgQVJSQVlfU0laRShzNXBfaW9kZXNjKSk7CiAJaWYgKG1hY2hfZGVzYykKIAkJaW90YWJsZV9pbml0KG1hY2hfZGVzYywgc2l6ZSk7CiAKLQlpZGNvZGUgPSBfX3Jhd19yZWFkbChjcHVpZF9hZGRyKTsKLQlzM2NfaW5pdF9jcHUoaWRjb2RlLCBjcHVfaWRzLCBBUlJBWV9TSVpFKGNwdV9pZHMpKTsKKwkvKiBkZXRlY3QgY3B1IGlkIGFuZCByZXYuICovCisJczVwX2luaXRfY3B1KGNwdWlkX2FkZHIpOworCisJczNjX2luaXRfY3B1KHNhbXN1bmdfY3B1X2lkLCBjcHVfaWRzLCBBUlJBWV9TSVpFKGNwdV9pZHMpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1jc2lzMC5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWNzaXMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYWFiZWYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWNzaXMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCi0gKiBTNVAgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBNSVBJLUNTSVMgY2hhbm5lbCAwCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9taXBpX2NzaXMwX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTNVBfUEFfTUlQSV9DU0lTMCwKLQkJLmVuZCAgID0gUzVQX1BBX01JUElfQ1NJUzAgKyBTWl80SyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfTUlQSV9DU0lTMCwKLQkJLmVuZCAgID0gSVJRX01JUElfQ1NJUzAsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9taXBpX2NzaXMwID0gewotCS5uYW1lCQkgID0gInM1cC1taXBpLWNzaXMiLAotCS5pZAkJICA9IDAsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczVwX21pcGlfY3NpczBfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczVwX21pcGlfY3NpczBfcmVzb3VyY2UsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWNzaXMxLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtY3NpczEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiOTFiNS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtY3NpczEuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFM1UCBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIE1JUEktQ1NJUyBjaGFubmVsIDEKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX21pcGlfY3NpczFfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFM1UF9QQV9NSVBJX0NTSVMxLAotCQkuZW5kICAgPSBTNVBfUEFfTUlQSV9DU0lTMSArIFNaXzRLIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9NSVBJX0NTSVMxLAotCQkuZW5kICAgPSBJUlFfTUlQSV9DU0lTMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9taXBpX2NzaXMxID0gewotCS5uYW1lCQkgID0gInM1cC1taXBpLWNzaXMiLAotCS5pZAkJICA9IDEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczVwX21pcGlfY3NpczFfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczVwX21pcGlfY3NpczFfcmVzb3VyY2UsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWVoY2kuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1laGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MDgwZmYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWVoY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKLSAqIEF1dGhvcjogSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2VoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L3VzYi1waHkuaD4KLQotLyogVVNCIEVIQ0kgSG9zdCBDb250cm9sbGVyIHJlZ2lzdHJhdGlvbiAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfZWhjaV9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzVQX1BBX0VIQ0ksCi0JCS5lbmQJPSBTNVBfUEFfRUhDSSArIFNaXzI1NiAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfVVNCX0hPU1QsCi0JCS5lbmQJPSBJUlFfVVNCX0hPU1QsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0YXRpYyB1NjQgczVwX2RldmljZV9laGNpX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9laGNpID0gewotCS5uYW1lCQk9ICJzNXAtZWhjaSIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfZWhjaV9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczVwX2VoY2lfcmVzb3VyY2UsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzayA9ICZzNXBfZGV2aWNlX2VoY2lfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCi0JfQotfTsKLQotdm9pZCBfX2luaXQgczVwX2VoY2lfc2V0X3BsYXRkYXRhKHN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSAqcGQpCi17Ci0Jc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhICpucGQ7Ci0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhKSwKLQkJCSZzNXBfZGV2aWNlX2VoY2kpOwotCi0JaWYgKCFucGQtPnBoeV9pbml0KQotCQlucGQtPnBoeV9pbml0ID0gczVwX3VzYl9waHlfaW5pdDsKLQlpZiAoIW5wZC0+cGh5X2V4aXQpCi0JCW5wZC0+cGh5X2V4aXQgPSBzNXBfdXNiX3BoeV9leGl0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWMwLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4NzcwZi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzAuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqCi0gKiBCYXNlIFM1UCBGSU1DMCByZXNvdXJjZSBhbmQgZGV2aWNlIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1jMF9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzVQX1BBX0ZJTUMwLAotCQkuZW5kCT0gUzVQX1BBX0ZJTUMwICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0ZJTUMwLAotCQkuZW5kCT0gSVJRX0ZJTUMwLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHU2NCBzNXBfZmltYzBfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzAgPSB7Ci0JLm5hbWUJCT0gInM1cC1maW1jIiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWMwX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzNXBfZmltYzBfcmVzb3VyY2UsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzawkJPSAmczVwX2ZpbWMwX2RtYV9tYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWMxLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlM2E5Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzEuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqCi0gKiBCYXNlIFM1UCBGSU1DMSByZXNvdXJjZSBhbmQgZGV2aWNlIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1jMV9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzVQX1BBX0ZJTUMxLAotCQkuZW5kCT0gUzVQX1BBX0ZJTUMxICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0ZJTUMxLAotCQkuZW5kCT0gSVJRX0ZJTUMxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHU2NCBzNXBfZmltYzFfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzEgPSB7Ci0JLm5hbWUJCT0gInM1cC1maW1jIiwKLQkuaWQJCT0gMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWMxX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzNXBfZmltYzFfcmVzb3VyY2UsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzawkJPSAmczVwX2ZpbWMxX2RtYV9tYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWMyLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMjk4MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMi5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqCi0gKiBCYXNlIFM1UCBGSU1DMiByZXNvdXJjZSBhbmQgZGV2aWNlIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1jMl9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzVQX1BBX0ZJTUMyLAotCQkuZW5kCT0gUzVQX1BBX0ZJTUMyICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0ZJTUMyLAotCQkuZW5kCT0gSVJRX0ZJTUMyLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHU2NCBzNXBfZmltYzJfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzIgPSB7Ci0JLm5hbWUJCT0gInM1cC1maW1jIiwKLQkuaWQJCT0gMiwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWMyX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzNXBfZmltYzJfcmVzb3VyY2UsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzawkJPSAmczVwX2ZpbWMyX2RtYV9tYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWMzLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzMWJlYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzMuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMy5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqCi0gKiBCYXNlIFM1UCBGSU1DMyByZXNvdXJjZSBhbmQgZGV2aWNlIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1jM19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzVQX1BBX0ZJTUMzLAotCQkuZW5kCT0gUzVQX1BBX0ZJTUMzICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0ZJTUMzLAotCQkuZW5kCT0gSVJRX0ZJTUMzLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHU2NCBzNXBfZmltYzNfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzMgPSB7Ci0JLm5hbWUJCT0gInM1cC1maW1jIiwKLQkuaWQJCT0gMywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWMzX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzNXBfZmltYzNfcmVzb3VyY2UsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzawkJPSAmczVwX2ZpbWMzX2RtYV9tYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWQwLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltZDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyOGJiNS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltZDAuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1kMC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBDb3JlIGZpbGUgZm9yIFNhbXN1bmcgRGlzcGxheSBDb250cm9sbGVyIChGSU1EKSBkcml2ZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2ZiLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfZmltZDBfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFM1UF9QQV9GSU1EMCwKLQkJLmVuZAk9IFM1UF9QQV9GSU1EMCArIFNaXzMySyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfRklNRDBfVlNZTkMsCi0JCS5lbmQJPSBJUlFfRklNRDBfVlNZTkMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQJPSBJUlFfRklNRDBfRklGTywKLQkJLmVuZAk9IElSUV9GSU1EMF9GSUZPLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVszXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0ZJTUQwX1NZU1RFTSwKLQkJLmVuZAk9IElSUV9GSU1EMF9TWVNURU0sCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgdTY0IGZpbWQwX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltZDAgPSB7Ci0JLm5hbWUJCT0gInM1cC1mYiIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9maW1kMF9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczVwX2ZpbWQwX3Jlc291cmNlLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sJCT0gJmZpbWQwX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07Ci0KLXZvaWQgX19pbml0IHM1cF9maW1kMF9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19mYl9wbGF0ZGF0YSAqcGQpCi17Ci0JczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEpLAotCQkJJnM1cF9kZXZpY2VfZmltZDApOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW1mYy5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW1mYy5jCmluZGV4IDk0MjI2YTAuLmEzMGQzNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1tZmMuYworKysgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtbWZjLmMKQEAgLTIyLDU2ICsyMiw2IEBACiAjaW5jbHVkZSA8cGxhdC9pcnFzLmg+CiAjaW5jbHVkZSA8cGxhdC9tZmMuaD4KIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfbWZjX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTNVBfUEFfTUZDLAotCQkuZW5kCT0gUzVQX1BBX01GQyArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfTUZDLAotCQkuZW5kCT0gSVJRX01GQywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfQotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21mYyA9IHsKLQkubmFtZQkJPSAiczVwLW1mYyIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfbWZjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzNXBfbWZjX3Jlc291cmNlLAotfTsKLQotLyoKLSAqIE1GQyBoYXJkd2FyZSBoYXMgMiBtZW1vcnkgaW50ZXJmYWNlcyB3aGljaCBhcmUgbW9kZWxsZWQgYXMgdHdvIHNlcGFyYXRlCi0gKiBwbGF0Zm9ybSBkZXZpY2VzIHRvIGxldCBkbWEtbWFwcGluZyBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0uCi0gKgotICogTUZDIHBhcmVudCBkZXZpY2UgKHM1cF9kZXZpY2VfbWZjKSBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIG1lbW9yeQotICogaW50ZXJmYWNlIHNwZWNpZmljIGRldmljZXMgKHM1cF9kZXZpY2VfbWZjX2wgYW5kIHM1cF9kZXZpY2VfbWZjX3IpLgotICovCi0KLXN0YXRpYyB1NjQgczVwX21mY19kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9tZmNfbCA9IHsKLQkubmFtZQkJPSAiczVwLW1mYy1sIiwKLQkuaWQJCT0gLTEsCi0JLmRldgkJPSB7Ci0JCS5wYXJlbnQJCQk9ICZzNXBfZGV2aWNlX21mYy5kZXYsCi0JCS5kbWFfbWFzawkJPSAmczVwX21mY19kbWFfbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21mY19yID0gewotCS5uYW1lCQk9ICJzNXAtbWZjLXIiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLnBhcmVudAkJCT0gJnM1cF9kZXZpY2VfbWZjLmRldiwKLQkJLmRtYV9tYXNrCQk9ICZzNXBfbWZjX2RtYV9tYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwotCiBzdHJ1Y3QgczVwX21mY19yZXNlcnZlZF9tZW0gewogCXBoeXNfYWRkcl90CWJhc2U7CiAJdW5zaWduZWQgbG9uZwlzaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW9uZW5hbmQuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1vbmVuYW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzM2YzguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW9uZW5hbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2Rldi1vbmVuYW5kLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcwotICogIEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+Ci0gKgotICogUzVQIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgT25lTkFORCBkZXZpY2VzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9vbmVuYW5kX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzVQX1BBX09ORU5BTkQsCi0JCS5lbmQJPSBTNVBfUEFfT05FTkFORCArIFNaXzEyOEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gUzVQX1BBX09ORU5BTkRfRE1BLAotCQkuZW5kCT0gUzVQX1BBX09ORU5BTkRfRE1BICsgU1pfOEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX09ORU5BTkRfQVVESSwKLQkJLmVuZAk9IElSUV9PTkVOQU5EX0FVREksCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2Vfb25lbmFuZCA9IHsKLQkubmFtZQkJPSAiczVwYzExMC1vbmVuYW5kIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9vbmVuYW5kX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gczVwX29uZW5hbmRfcmVzb3VyY2VzLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1wbXUuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1wbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NTc2ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtcG11LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LXBtdS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCi0gKiBBdXRob3I6IEpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9wbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfcG11X3Jlc291cmNlID0gewotCS5zdGFydAk9IElSUV9QTVUsCi0JLmVuZAk9IElSUV9QTVUsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfcG11ID0gewotCS5uYW1lCQk9ICJhcm0tcG11IiwKLQkuaWQJCT0gQVJNX1BNVV9ERVZJQ0VfQ1BVLAotCS5udW1fcmVzb3VyY2VzCT0gMSwKLQkucmVzb3VyY2UJPSAmczVwX3BtdV9yZXNvdXJjZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHM1cF9wbXVfaW5pdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmczVwX2RldmljZV9wbXUpOwotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChzNXBfcG11X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2NhbXBvcnQuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9jYW1wb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNjg4YzguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2NhbXBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCi0gKiBTNVAgc2VyaWVzIGNhbWVyYSBpbnRlcmZhY2UgaGVscGVyIGZ1bmN0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBQTEFUX1M1UF9DQU1QT1JUX0hfCi0jZGVmaW5lIFBMQVRfUzVQX0NBTVBPUlRfSF8gX19GSUxFX18KLQotZW51bSBzNXBfY2FtcG9ydF9pZCB7Ci0JUzVQX0NBTVBPUlRfQSwKLQlTNVBfQ0FNUE9SVF9CLAotfTsKLQotLyoKLSAqIFRoZSBoZWxwZXIgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSBHUElPIGZvciB0aGUgY2FtZXJhIHBhcmFsbGVsIGJ1cy4KLSAqIFRoZSBjYW1lcmEgcG9ydCBjYW4gYmUgbXVsdGlwbGV4ZWQgd2l0aCBhbnkgRklNQyBlbnRpdHksIGV2ZW4gbXVsdGlwbGUKLSAqIEZJTUMgZW50aXRpZXMgYXJlIGFsbG93ZWQgdG8gYmUgYXR0YWNoZWQgdG8gYSBzaW5nbGUgcG9ydCBzaW11bHRhbmVvdXNseS4KLSAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdG8gYmUgdXNlZCBpbiB0aGUgYm9hcmQgc2V0dXAgY29kZS4KLSAqLwotaW50IHM1cHYyMTBfZmltY19zZXR1cF9ncGlvKGVudW0gczVwX2NhbXBvcnRfaWQgaWQpOwotaW50IGV4eW5vczRfZmltY19zZXR1cF9ncGlvKGVudW0gczVwX2NhbXBvcnRfaWQgaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9laGNpLmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvZWhjaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWU2ODEwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9laGNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCi0gKiBBdXRob3I6IEpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX19QTEFUX1M1UF9FSENJX0gKLSNkZWZpbmUgX19QTEFUX1M1UF9FSENJX0gKLQotc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhIHsKLQlpbnQgKCpwaHlfaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHR5cGUpOwotCWludCAoKnBoeV9leGl0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgdHlwZSk7Ci19OwotCi1leHRlcm4gdm9pZCBzNXBfZWhjaV9zZXRfcGxhdGRhdGEoc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhICpwZCk7Ci0KLSNlbmRpZiAvKiBfX1BMQVRfUzVQX0VIQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2V4eW5vczQuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9leHlub3M0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwN2NhYWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2V4eW5vczQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9leHlub3M0LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgZXh5bm9zNCBjcHUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0vKiBDb21tb24gaW5pdCBjb2RlIGZvciBFWFlOT1M0IHJlbGF0ZWQgU29DcyAqLwotCi1leHRlcm4gdm9pZCBleHlub3M0X2NvbW1vbl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLWV4dGVybiB2b2lkIGV4eW5vczRfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOwotZXh0ZXJuIHZvaWQgZXh5bm9zNF9zZXR1cF9jbG9ja3Modm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX0VYWU5PUzQyMTAKLQotZXh0ZXJuICBpbnQgZXh5bm9zNF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgZXh5bm9zNF9pbml0X2lycSh2b2lkKTsKLWV4dGVybiB2b2lkIGV4eW5vczRfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgZXh5bm9zNF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci1leHRlcm4gc3RydWN0IHN5c190aW1lciBleHlub3M0X3RpbWVyOwotCi0jZGVmaW5lIGV4eW5vczRfaW5pdF91YXJ0cyBleHlub3M0X2NvbW1vbl9pbml0X3VhcnRzCi0KLSNlbHNlCi0jZGVmaW5lIGV4eW5vczRfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBleHlub3M0X2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBleHlub3M0X21hcF9pbyBOVUxMCi0jZGVmaW5lIGV4eW5vczRfaW5pdCBOVUxMCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9pcnFzLmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvaXJxcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRkYmZjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9pcnFzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvaXJxcy5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBTNVAgQ29tbW9uIElSUSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fUExBVF9TNVBfSVJRU19ICi0jZGVmaW5lIF9fQVNNX1BMQVRfUzVQX0lSUVNfSCBfX0ZJTEVfXwotCi0vKiB3ZSBrZWVwIHRoZSBmaXJzdCBzZXQgb2YgQ1BVIElSUXMgb3V0IG9mIHRoZSByYW5nZSBvZgotICogdGhlIElTQSBzcGFjZSwgc28gdGhhdCB0aGUgUEMxMDQgaGFzIHRoZW0gdG8gaXRzZWxmCi0gKiBhbmQgd2UgZG9uJ3QgZW5kIHVwIGhhdmluZyB0byBkbyBob3JyaWJsZSB0aGluZ3MgdG8gdGhlCi0gKiBzdGFuZGFyZCBJU0EgZHJpdmVycy4uLi4KLSAqCi0gKiBub3RlLCBzaW5jZSB3ZSdyZSB1c2luZyB0aGUgVklDcywgb3VyIHN0YXJ0IG11c3QgYmUgYQotICogbXVsaXRwbGUgb2YgMzIgdG8gYWxsb3cgdGhlIGNvbW1vbiBjb2RlIHRvIHdvcmsKLSAqLwotCi0jZGVmaW5lIFM1UF9JUlFfT0ZGU0VUCQkoMzIpCi0KLSNkZWZpbmUgUzVQX0lSUSh4KQkJKCh4KSArIFM1UF9JUlFfT0ZGU0VUKQotCi0jZGVmaW5lIFM1UF9WSUMwX0JBU0UJCVM1UF9JUlEoMCkKLSNkZWZpbmUgUzVQX1ZJQzFfQkFTRQkJUzVQX0lSUSgzMikKLSNkZWZpbmUgUzVQX1ZJQzJfQkFTRQkJUzVQX0lSUSg2NCkKLSNkZWZpbmUgUzVQX1ZJQzNfQkFTRQkJUzVQX0lSUSg5NikKLQotI2RlZmluZSBWSUNfQkFTRSh4KQkJKFM1UF9WSUMwX0JBU0UgKyAoKHgpKjMyKSkKLQotI2RlZmluZSBJUlFfVklDMF9CQVNFCQlTNVBfVklDMF9CQVNFCi0jZGVmaW5lIElSUV9WSUMxX0JBU0UJCVM1UF9WSUMxX0JBU0UKLSNkZWZpbmUgSVJRX1ZJQzJfQkFTRQkJUzVQX1ZJQzJfQkFTRQotCi0vKiBWSUMgYmFzZWQgSVJRcyAqLwotCi0jZGVmaW5lIFM1UF9JUlFfVklDMCh4KQkJKFM1UF9WSUMwX0JBU0UgKyAoeCkpCi0jZGVmaW5lIFM1UF9JUlFfVklDMSh4KQkJKFM1UF9WSUMxX0JBU0UgKyAoeCkpCi0jZGVmaW5lIFM1UF9JUlFfVklDMih4KQkJKFM1UF9WSUMyX0JBU0UgKyAoeCkpCi0jZGVmaW5lIFM1UF9JUlFfVklDMyh4KQkJKFM1UF9WSUMzX0JBU0UgKyAoeCkpCi0KLSNkZWZpbmUgUzVQX1RJTUVSX0lSUSh4KQkoMTEgKyAoeCkpCi0KLSNkZWZpbmUgSVJRX1RJTUVSMAkJUzVQX1RJTUVSX0lSUSgwKQotI2RlZmluZSBJUlFfVElNRVIxCQlTNVBfVElNRVJfSVJRKDEpCi0jZGVmaW5lIElSUV9USU1FUjIJCVM1UF9USU1FUl9JUlEoMikKLSNkZWZpbmUgSVJRX1RJTUVSMwkJUzVQX1RJTUVSX0lSUSgzKQotI2RlZmluZSBJUlFfVElNRVI0CQlTNVBfVElNRVJfSVJRKDQpCi0KLSNkZWZpbmUgSVJRX0VJTlQoeCkJCSgoeCkgPCAxNiA/ICgoeCkgKyBTNVBfRUlOVF9CQVNFMSkgXAotCQkJCQk6ICgoeCkgLSAxNiArIFM1UF9FSU5UX0JBU0UyKSkKLQotI2RlZmluZSBFSU5UX09GRlNFVChpcnEpCSgoaXJxKSA8IFM1UF9FSU5UX0JBU0UyID8gXAotCQkJCQkJKChpcnEpIC0gUzVQX0VJTlRfQkFTRTEpIDogXAotCQkJCQkJKChpcnEpICsgMTYgLSBTNVBfRUlOVF9CQVNFMikpCi0KLSNkZWZpbmUgSVJRX0VJTlRfQklUKHgpCQlFSU5UX09GRlNFVCh4KQotCi0vKiBUeXBpY2FsbHkgb25seSBhIGZldyBncGlvIGNoaXBzIHJlcXVpcmUgZ3BpbyBpbnRlcnJ1cHQgc3VwcG9ydC4KLSAgIFRvIGF2b2lkIG1lbW9yeSB3YXN0ZSBpcnEgZGVzY3JpcHRvcnMgYXJlIGFsbG9jYXRlZCBvbmx5IGZvcgotICAgUzVQX0dQSU9JTlRfR1JPVVBfQ09VTlQgY2hpcHMsIGVhY2ggd2l0aCB0b3RhbCBudW1iZXIgb2YKLSAgIFM1UF9HUElPSU5UX0dST1VQX1NJWkUgcGlucy9pcnFzLiBFYWNoIEdQSU9JTlQgZ3JvdXAgY2FuIGJlIGFzc2lnZWQKLSAgIHRvIGFueSBncGlvIGNoaXAgd2l0aCB0aGUgczVwX3JlZ2lzdGVyX2dwaW9faW50ZXJydXB0KCkgZnVuY3Rpb24gKi8KLSNkZWZpbmUgUzVQX0dQSU9JTlRfR1JPVVBfQ09VTlQgNAotI2RlZmluZSBTNVBfR1BJT0lOVF9HUk9VUF9TSVpFCTgKLSNkZWZpbmUgUzVQX0dQSU9JTlRfQ09VTlQJKFM1UF9HUElPSU5UX0dST1VQX0NPVU5UICogUzVQX0dQSU9JTlRfR1JPVVBfU0laRSkKLQotLyogSVJRIHR5cGVzIGNvbW1vbiBmb3IgYWxsIHM1cCBwbGF0Zm9ybXMgKi8KLSNkZWZpbmUgUzVQX0lSUV9UWVBFX0xFVkVMX0xPVwkJKDB4MDApCi0jZGVmaW5lIFM1UF9JUlFfVFlQRV9MRVZFTF9ISUdICQkoMHgwMSkKLSNkZWZpbmUgUzVQX0lSUV9UWVBFX0VER0VfRkFMTElORwkoMHgwMikKLSNkZWZpbmUgUzVQX0lSUV9UWVBFX0VER0VfUklTSU5HCSgweDAzKQotI2RlZmluZSBTNVBfSVJRX1RZUEVfRURHRV9CT1RICQkoMHgwNCkKLQotI2VuZGlmIC8qIF9fQVNNX1BMQVRfUzVQX0lSUVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21hcC1zNXAuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9tYXAtczVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDM1NTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21hcC1zNXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9tYXAtczVwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFM1UCAtIE1lbW9yeSBtYXAgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9QTEFUX01BUF9TNVBfSAotI2RlZmluZSBfX0FTTV9QTEFUX01BUF9TNVBfSCBfX0ZJTEVfXwotCi0jZGVmaW5lIFM1UF9WQV9DSElQSUQJCVMzQ19BRERSKDB4MDIwMDAwMDApCi0jZGVmaW5lIFM1UF9WQV9DTVUJCVMzQ19BRERSKDB4MDIxMDAwMDApCi0jZGVmaW5lIFM1UF9WQV9QTVUJCVMzQ19BRERSKDB4MDIxODAwMDApCi0jZGVmaW5lIFM1UF9WQV9HUElPCQlTM0NfQUREUigweDAyMjAwMDAwKQotI2RlZmluZSBTNVBfVkFfR1BJTzEJCVM1UF9WQV9HUElPCi0jZGVmaW5lIFM1UF9WQV9HUElPMgkJUzNDX0FERFIoMHgwMjI0MDAwMCkKLSNkZWZpbmUgUzVQX1ZBX0dQSU8zCQlTM0NfQUREUigweDAyMjgwMDAwKQotCi0jZGVmaW5lIFM1UF9WQV9TWVNSQU0JCVMzQ19BRERSKDB4MDI0MDAwMDApCi0jZGVmaW5lIFM1UF9WQV9ETUMwCQlTM0NfQUREUigweDAyNDQwMDAwKQotI2RlZmluZSBTNVBfVkFfRE1DMQkJUzNDX0FERFIoMHgwMjQ4MDAwMCkKLSNkZWZpbmUgUzVQX1ZBX1NST01DCQlTM0NfQUREUigweDAyNEMwMDAwKQotCi0jZGVmaW5lIFM1UF9WQV9TWVNUSU1FUgkJUzNDX0FERFIoMHgwMjUwMDAwMCkKLSNkZWZpbmUgUzVQX1ZBX0wyQ0MJCVMzQ19BRERSKDB4MDI2MDAwMDApCi0KLSNkZWZpbmUgUzVQX1ZBX0NPTUJJTkVSX0JBU0UJUzNDX0FERFIoMHgwMjcwMDAwMCkKLSNkZWZpbmUgUzVQX1ZBX0NPTUJJTkVSKHgpCShTNVBfVkFfQ09NQklORVJfQkFTRSArICgoeCkgPj4gMikgKiAweDEwKQotCi0jZGVmaW5lIFM1UF9WQV9DT1JFUEVSSV9CQVNFCVMzQ19BRERSKDB4MDI4MDAwMDApCi0jZGVmaW5lIFM1UF9WQV9DT1JFUEVSSSh4KQkoUzVQX1ZBX0NPUkVQRVJJX0JBU0UgKyAoeCkpCi0jZGVmaW5lIFM1UF9WQV9TQ1UJCVM1UF9WQV9DT1JFUEVSSSgweDApCi0jZGVmaW5lIFM1UF9WQV9UV0QJCVM1UF9WQV9DT1JFUEVSSSgweDYwMCkKLQotI2RlZmluZSBTNVBfVkFfR0lDX0NQVQkJUzNDX0FERFIoMHgwMjgxMDAwMCkKLSNkZWZpbmUgUzVQX1ZBX0dJQ19ESVNUCQlTM0NfQUREUigweDAyODIwMDAwKQotCi0jZGVmaW5lIFMzQ19WQV9VU0JfSFNQSFkJUzNDX0FERFIoMHgwMjkwMDAwMCkKLQotI2RlZmluZSBWQV9WSUMoeCkJCShTM0NfVkFfSVJRICsgKCh4KSAqIDB4MTAwMDApKQotI2RlZmluZSBWQV9WSUMwCQkJVkFfVklDKDApCi0jZGVmaW5lIFZBX1ZJQzEJCQlWQV9WSUMoMSkKLSNkZWZpbmUgVkFfVklDMgkJCVZBX1ZJQygyKQotI2RlZmluZSBWQV9WSUMzCQkJVkFfVklDKDMpCi0KLSNkZWZpbmUgUzVQX1ZBX1VBUlQoeCkJCShTM0NfVkFfVUFSVCArICgoeCkgKiBTM0NfVUFSVF9PRkZTRVQpKQotI2RlZmluZSBTNVBfVkFfVUFSVDAJCVM1UF9WQV9VQVJUKDApCi0jZGVmaW5lIFM1UF9WQV9VQVJUMQkJUzVQX1ZBX1VBUlQoMSkKLSNkZWZpbmUgUzVQX1ZBX1VBUlQyCQlTNVBfVkFfVUFSVCgyKQotI2RlZmluZSBTNVBfVkFfVUFSVDMJCVM1UF9WQV9VQVJUKDMpCi0KLSNpZm5kZWYgUzNDX1VBUlRfT0ZGU0VUCi0jZGVmaW5lIFMzQ19VQVJUX09GRlNFVAkJKDB4NDAwKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0FTTV9QTEFUX01BUF9TNVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21mYy5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21mYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njk3ZjhjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9tZmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX19QTEFUX1M1UF9NRkNfSAotI2RlZmluZSBfX1BMQVRfUzVQX01GQ19ICi0KLS8qKgotICogczVwX21mY19yZXNlcnZlX21lbSAtIGZ1bmN0aW9uIHRvIGVhcmx5IHJlc2VydmUgbWVtb3J5IGZvciBNRkMgZHJpdmVyCi0gKiBAcmJhc2U6CWJhc2UgYWRkcmVzcyBmb3IgTUZDICdyaWdodCcgbWVtb3J5IGludGVyZmFjZQotICogQHJzaXplOglzaXplIG9mIHRoZSBtZW1vcnkgcmVzZXJ2ZWQgZm9yIE1GQyAncmlnaHQnIGludGVyZmFjZQotICogQGxiYXNlOgliYXNlIGFkZHJlc3MgZm9yIE1GQyAnbGVmdCcgbWVtb3J5IGludGVyZmFjZQotICogQGxzaXplOglzaXplIG9mIHRoZSBtZW1vcnkgcmVzZXJ2ZWQgZm9yIE1GQyAnbGVmdCcgaW50ZXJmYWNlCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXNlcnZlcyBzeXN0ZW0gbWVtb3J5IGZvciBib3RoIE1GQyBkZXZpY2UgbWVtb3J5Ci0gKiBpbnRlcmZhY2VzIGFuZCByZWdpc3RlcnMgaXQgdG8gcmVzcGVjdGl2ZSBzdHJ1Y3QgZGV2aWNlIGVudHJpZXMgYXMKLSAqIGNvaGVyZW50IG1lbW9yeS4KLSAqLwotdm9pZCBfX2luaXQgczVwX21mY19yZXNlcnZlX21lbShwaHlzX2FkZHJfdCByYmFzZSwgdW5zaWduZWQgaW50IHJzaXplLAotCQkJCXBoeXNfYWRkcl90IGxiYXNlLCB1bnNpZ25lZCBpbnQgbHNpemUpOwotCi0jZW5kaWYgLyogX19QTEFUX1M1UF9NRkNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21pcGlfY3Npcy5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21pcGlfY3Npcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQyNTRjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9taXBpX2NzaXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFM1UCBzZXJpZXMgTUlQSSBDU0kgc2xhdmUgZGV2aWNlIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpZm5kZWYgUExBVF9TNVBfTUlQSV9DU0lTX0hfCi0jZGVmaW5lIFBMQVRfUzVQX01JUElfQ1NJU19IXyBfX0ZJTEVfXwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOwotCi0vKioKLSAqIHN0cnVjdCBzNXBfcGxhdGZvcm1fbWlwaV9jc2lzIC0gcGxhdGZvcm0gZGF0YSBmb3IgUzVQIE1JUEktQ1NJUyBkcml2ZXIKLSAqIEBjbGtfcmF0ZTogYnVzIGNsb2NrIGZyZXF1ZW5jeQotICogQGxhbmVzOiBudW1iZXIgb2YgZGF0YSBsYW5lcyB1c2VkCi0gKiBAYWxpZ25tZW50OiBkYXRhIGFsaWdubWVudCBpbiBiaXRzCi0gKiBAaHNfc2V0dGxlOiBIUy1SWCBzZXR0bGUgdGltZQotICogQGZpeGVkX3BoeV92ZGQ6IGZhbHNlIHRvIGVuYWJsZSBleHRlcm5hbCBELVBIWSByZWd1bGF0b3IgbWFuYWdlbWVudCBpbiB0aGUKLSAqCQkgICBkcml2ZXIgb3IgdHJ1ZSBpbiBjYXNlIHRoaXMgcmVndWxhdG9yIGhhcyBubyBlbmFibGUgZnVuY3Rpb24KLSAqIEBwaHlfZW5hYmxlOiBwb2ludGVyIHRvIGEgY2FsbGJhY2sgY29udHJvbGxpbmcgRC1QSFkgZW5hYmxlL3Jlc2V0Ci0gKi8KLXN0cnVjdCBzNXBfcGxhdGZvcm1fbWlwaV9jc2lzIHsKLQl1bnNpZ25lZCBsb25nIGNsa19yYXRlOwotCXU4IGxhbmVzOwotCXU4IGFsaWdubWVudDsKLQl1OCBoc19zZXR0bGU7Ci0JYm9vbCBmaXhlZF9waHlfdmRkOwotCWludCAoKnBoeV9lbmFibGUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGJvb2wgb24pOwotfTsKLQotLyoqCi0gKiBzNXBfY3Npc19waHlfZW5hYmxlIC0gZ2xvYmFsIE1JUEktQ1NJIHJlY2VpdmVyIEQtUEhZIGNvbnRyb2wKLSAqIEBwZGV2OiBNSVBJLUNTSVMgcGxhdGZvcm0gZGV2aWNlCi0gKiBAb246IHRydWUgdG8gZW5hYmxlIEQtUEhZIGFuZCBkZWFzc2VydCBpdHMgcmVzZXQKLSAqCWZhbHNlIHRvIGRpc2FibGUgRC1QSFkKLSAqLwotaW50IHM1cF9jc2lzX3BoeV9lbmFibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgYm9vbCBvbik7Ci0KLSNlbmRpZiAvKiBQTEFUX1M1UF9NSVBJX0NTSVNfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9wbGwuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9wbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyOGZhZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvcGxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyogYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3BsbC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBTNVAgUExMIGNvZGUKLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3BsbC5oCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNkZWZpbmUgUExMNDVYWF9NRElWX01BU0sJKDB4M0ZGKQotI2RlZmluZSBQTEw0NVhYX1BESVZfTUFTSwkoMHgzRikKLSNkZWZpbmUgUExMNDVYWF9TRElWX01BU0sJKDB4NykKLSNkZWZpbmUgUExMNDVYWF9NRElWX1NISUZUCSgxNikKLSNkZWZpbmUgUExMNDVYWF9QRElWX1NISUZUCSg4KQotI2RlZmluZSBQTEw0NVhYX1NESVZfU0hJRlQJKDApCi0KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQotZW51bSBwbGw0NXh4X3R5cGVfdCB7Ci0JcGxsXzQ1MDAsCi0JcGxsXzQ1MDIsCi0JcGxsXzQ1MDgKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzNXBfZ2V0X3BsbDQ1eHgodW5zaWduZWQgbG9uZyBiYXNlY2xrLCB1MzIgcGxsX2NvbiwKLQkJCQkJICAgIGVudW0gcGxsNDV4eF90eXBlX3QgcGxsX3R5cGUpCi17Ci0JdTMyIG1kaXYsIHBkaXYsIHNkaXY7Ci0JdTY0IGZ2Y28gPSBiYXNlY2xrOwotCi0JbWRpdiA9IChwbGxfY29uID4+IFBMTDQ1WFhfTURJVl9TSElGVCkgJiBQTEw0NVhYX01ESVZfTUFTSzsKLQlwZGl2ID0gKHBsbF9jb24gPj4gUExMNDVYWF9QRElWX1NISUZUKSAmIFBMTDQ1WFhfUERJVl9NQVNLOwotCXNkaXYgPSAocGxsX2NvbiA+PiBQTEw0NVhYX1NESVZfU0hJRlQpICYgUExMNDVYWF9TRElWX01BU0s7Ci0KLQlpZiAocGxsX3R5cGUgPT0gcGxsXzQ1MDgpCi0JCXNkaXYgPSBzZGl2IC0gMTsKLQotCWZ2Y28gKj0gbWRpdjsKLQlkb19kaXYoZnZjbywgKHBkaXYgPDwgc2RpdikpOwotCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKWZ2Y287Ci19Ci0KLSNkZWZpbmUgUExMNDZYWF9LRElWX01BU0sJKDB4RkZGRikKLSNkZWZpbmUgUExMNDY1MENfS0RJVl9NQVNLCSgweEZGRikKLSNkZWZpbmUgUExMNDZYWF9NRElWX01BU0sJKDB4MUZGKQotI2RlZmluZSBQTEw0NlhYX1BESVZfTUFTSwkoMHgzRikKLSNkZWZpbmUgUExMNDZYWF9TRElWX01BU0sJKDB4NykKLSNkZWZpbmUgUExMNDZYWF9NRElWX1NISUZUCSgxNikKLSNkZWZpbmUgUExMNDZYWF9QRElWX1NISUZUCSg4KQotI2RlZmluZSBQTEw0NlhYX1NESVZfU0hJRlQJKDApCi0KLWVudW0gcGxsNDZ4eF90eXBlX3QgewotCXBsbF80NjAwLAotCXBsbF80NjUwLAotCXBsbF80NjUwYywKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzNXBfZ2V0X3BsbDQ2eHgodW5zaWduZWQgbG9uZyBiYXNlY2xrLAotCQkJCQkgICAgdTMyIHBsbF9jb24wLCB1MzIgcGxsX2NvbjEsCi0JCQkJCSAgICBlbnVtIHBsbDQ2eHhfdHlwZV90IHBsbF90eXBlKQotewotCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwotCXUzMiBtZGl2LCBwZGl2LCBzZGl2LCBrZGl2OwotCXU2NCB0bXA7Ci0KLQltZGl2ID0gKHBsbF9jb24wID4+IFBMTDQ2WFhfTURJVl9TSElGVCkgJiBQTEw0NlhYX01ESVZfTUFTSzsKLQlwZGl2ID0gKHBsbF9jb24wID4+IFBMTDQ2WFhfUERJVl9TSElGVCkgJiBQTEw0NlhYX1BESVZfTUFTSzsKLQlzZGl2ID0gKHBsbF9jb24wID4+IFBMTDQ2WFhfU0RJVl9TSElGVCkgJiBQTEw0NlhYX1NESVZfTUFTSzsKLQlrZGl2ID0gcGxsX2NvbjEgJiBQTEw0NlhYX0tESVZfTUFTSzsKLQotCWlmIChwbGxfdHlwZSA9PSBwbGxfNDY1MGMpCi0JCWtkaXYgPSBwbGxfY29uMSAmIFBMTDQ2NTBDX0tESVZfTUFTSzsKLQllbHNlCi0JCWtkaXYgPSBwbGxfY29uMSAmIFBMTDQ2WFhfS0RJVl9NQVNLOwotCi0JdG1wID0gYmFzZWNsazsKLQotCWlmIChwbGxfdHlwZSA9PSBwbGxfNDYwMCkgewotCQl0bXAgKj0gKG1kaXYgPDwgMTYpICsga2RpdjsKLQkJZG9fZGl2KHRtcCwgKHBkaXYgPDwgc2RpdikpOwotCQlyZXN1bHQgPSB0bXAgPj4gMTY7Ci0JfSBlbHNlIHsKLQkJdG1wICo9IChtZGl2IDw8IDEwKSArIGtkaXY7Ci0JCWRvX2Rpdih0bXAsIChwZGl2IDw8IHNkaXYpKTsKLQkJcmVzdWx0ID0gdG1wID4+IDEwOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNkZWZpbmUgUExMOTBYWF9NRElWX01BU0sJKDB4RkYpCi0jZGVmaW5lIFBMTDkwWFhfUERJVl9NQVNLCSgweDNGKQotI2RlZmluZSBQTEw5MFhYX1NESVZfTUFTSwkoMHg3KQotI2RlZmluZSBQTEw5MFhYX0tESVZfTUFTSwkoMHhmZmZmKQotI2RlZmluZSBQTEw5MFhYX01ESVZfU0hJRlQJKDE2KQotI2RlZmluZSBQTEw5MFhYX1BESVZfU0hJRlQJKDgpCi0jZGVmaW5lIFBMTDkwWFhfU0RJVl9TSElGVAkoMCkKLSNkZWZpbmUgUExMOTBYWF9LRElWX1NISUZUCSgwKQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczVwX2dldF9wbGw5MHh4KHVuc2lnbmVkIGxvbmcgYmFzZWNsaywKLQkJCQkJICAgIHUzMiBwbGxfY29uLCB1MzIgcGxsX2NvbmspCi17Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQ7Ci0JdTMyIG1kaXYsIHBkaXYsIHNkaXYsIGtkaXY7Ci0JdTY0IHRtcDsKLQotCW1kaXYgPSAocGxsX2NvbiA+PiBQTEw5MFhYX01ESVZfU0hJRlQpICYgUExMOTBYWF9NRElWX01BU0s7Ci0JcGRpdiA9IChwbGxfY29uID4+IFBMTDkwWFhfUERJVl9TSElGVCkgJiBQTEw5MFhYX1BESVZfTUFTSzsKLQlzZGl2ID0gKHBsbF9jb24gPj4gUExMOTBYWF9TRElWX1NISUZUKSAmIFBMTDkwWFhfU0RJVl9NQVNLOwotCWtkaXYgPSBwbGxfY29uayAmIFBMTDkwWFhfS0RJVl9NQVNLOwotCi0JLyogV2UgbmVlZCB0byBtdWx0aXBsZSBiYXNlY2xrIGJ5IG1kaXYgKHRoZSBpbnRlZ2VyIHBhcnQpIGFuZCBrZGl2Ci0JICogd2hpY2ggaXMgaW4gMl4xNnRocywgc28gc2hpZnQgbWRpdiB1cCAoZG9lcyBub3Qgb3ZlcmZsb3cpIGFuZAotCSAqIGFkZCBrZGl2IGJlZm9yZSBtdWx0aXBseWluZy4gVGhlIHVzZSBvZiB0bXAgaXMgdG8gYXZvaWQgYW55Ci0JICogb3ZlcmZsb3dzIGJlZm9yZSBzaGlmdGluZyBiYWMgZG93biBpbnRvIHJlc3VsdCB3aGVuIG11bHRpcGxpbmcKLQkgKiBieSB0aGUgbWRpdiBhbmQga2RpdiBwYWlyLgotCSAqLwotCi0JdG1wID0gYmFzZWNsazsKLQl0bXAgKj0gKG1kaXYgPDwgMTYpICsga2RpdjsKLQlkb19kaXYodG1wLCAocGRpdiA8PCBzZGl2KSk7Ci0JcmVzdWx0ID0gdG1wID4+IDE2OwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotI2RlZmluZSBQTEw2NVhYX01ESVZfTUFTSwkoMHgzRkYpCi0jZGVmaW5lIFBMTDY1WFhfUERJVl9NQVNLCSgweDNGKQotI2RlZmluZSBQTEw2NVhYX1NESVZfTUFTSwkoMHg3KQotI2RlZmluZSBQTEw2NVhYX01ESVZfU0hJRlQJKDE2KQotI2RlZmluZSBQTEw2NVhYX1BESVZfU0hJRlQJKDgpCi0jZGVmaW5lIFBMTDY1WFhfU0RJVl9TSElGVAkoMCkKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHM1cF9nZXRfcGxsNjV4eCh1bnNpZ25lZCBsb25nIGJhc2VjbGssIHUzMiBwbGxfY29uKQotewotCXUzMiBtZGl2LCBwZGl2LCBzZGl2OwotCXU2NCBmdmNvID0gYmFzZWNsazsKLQotCW1kaXYgPSAocGxsX2NvbiA+PiBQTEw2NVhYX01ESVZfU0hJRlQpICYgUExMNjVYWF9NRElWX01BU0s7Ci0JcGRpdiA9IChwbGxfY29uID4+IFBMTDY1WFhfUERJVl9TSElGVCkgJiBQTEw2NVhYX1BESVZfTUFTSzsKLQlzZGl2ID0gKHBsbF9jb24gPj4gUExMNjVYWF9TRElWX1NISUZUKSAmIFBMTDY1WFhfU0RJVl9NQVNLOwotCi0JZnZjbyAqPSBtZGl2OwotCWRvX2RpdihmdmNvLCAocGRpdiA8PCBzZGl2KSk7Ci0KLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnZjbzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9yZWdzLXNyb20uaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9yZWdzLXNyb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMWFiNS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvcmVncy1zcm9tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvcmVncy1zcm9tLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogUzVQIFNST01DIHJlZ2lzdGVyIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fUExBVF9TNVBfUkVHU19TUk9NX0gKLSNkZWZpbmUgX19BU01fUExBVF9TNVBfUkVHU19TUk9NX0ggX19GSUxFX18KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNkZWZpbmUgUzVQX1NST01SRUcoeCkJCShTNVBfVkFfU1JPTUMgKyAoeCkpCi0KLSNkZWZpbmUgUzVQX1NST01fQlcJCVM1UF9TUk9NUkVHKDB4MCkKLSNkZWZpbmUgUzVQX1NST01fQkMwCQlTNVBfU1JPTVJFRygweDQpCi0jZGVmaW5lIFM1UF9TUk9NX0JDMQkJUzVQX1NST01SRUcoMHg4KQotI2RlZmluZSBTNVBfU1JPTV9CQzIJCVM1UF9TUk9NUkVHKDB4YykKLSNkZWZpbmUgUzVQX1NST01fQkMzCQlTNVBfU1JPTVJFRygweDEwKQotI2RlZmluZSBTNVBfU1JPTV9CQzQJCVM1UF9TUk9NUkVHKDB4MTQpCi0jZGVmaW5lIFM1UF9TUk9NX0JDNQkJUzVQX1NST01SRUcoMHgxOCkKLQotLyogb25lIHJlZ2lzdGVyIEJXIGhvbGRzIDQgeCA0LWJpdCBwYWNrZWQgc2V0dGluZ3MgZm9yIE5DUzAgLSBOQ1MzICovCi0KLSNkZWZpbmUgUzVQX1NST01fQldfX0RBVEFXSURUSF9fU0hJRlQJCTAKLSNkZWZpbmUgUzVQX1NST01fQldfX0FERFJNT0RFX19TSElGVAkJMQotI2RlZmluZSBTNVBfU1JPTV9CV19fV0FJVEVOQUJMRV9fU0hJRlQJCTIKLSNkZWZpbmUgUzVQX1NST01fQldfX0JZVEVFTkFCTEVfX1NISUZUCQkzCi0KLSNkZWZpbmUgUzVQX1NST01fQldfX0NTX01BU0sJCQkweGYKLQotI2RlZmluZSBTNVBfU1JPTV9CV19fTkNTMF9fU0hJRlQJCTAKLSNkZWZpbmUgUzVQX1NST01fQldfX05DUzFfX1NISUZUCQk0Ci0jZGVmaW5lIFM1UF9TUk9NX0JXX19OQ1MyX19TSElGVAkJOAotI2RlZmluZSBTNVBfU1JPTV9CV19fTkNTM19fU0hJRlQJCTEyCi0jZGVmaW5lIFM1UF9TUk9NX0JXX19OQ1M0X19TSElGVAkJMTYKLSNkZWZpbmUgUzVQX1NST01fQldfX05DUzVfX1NISUZUCQkyMAotCi0vKiBhcHBsaWVzIHRvIHNhbWUgdG8gQkNTMCAtIEJDUzMgKi8KLQotI2RlZmluZSBTNVBfU1JPTV9CQ1hfX1BNQ19fU0hJRlQJCTAKLSNkZWZpbmUgUzVQX1NST01fQkNYX19UQUNQX19TSElGVAkJNAotI2RlZmluZSBTNVBfU1JPTV9CQ1hfX1RDQUhfX1NISUZUCQk4Ci0jZGVmaW5lIFM1UF9TUk9NX0JDWF9fVENPSF9fU0hJRlQJCTEyCi0jZGVmaW5lIFM1UF9TUk9NX0JDWF9fVEFDQ19fU0hJRlQJCTE2Ci0jZGVmaW5lIFM1UF9TUk9NX0JDWF9fVENPU19fU0hJRlQJCTI0Ci0jZGVmaW5lIFM1UF9TUk9NX0JDWF9fVEFDU19fU0hJRlQJCTI4Ci0KLSNlbmRpZiAvKiBfX0FTTV9QTEFUX1M1UF9SRUdTX1NST01fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3Jlc2V0LmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvcmVzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1ZTk3OC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvcmVzZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9yZXNldC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9QTEFUX1M1UF9SRVNFVF9ICi0jZGVmaW5lIF9fQVNNX1BMQVRfUzVQX1JFU0VUX0ggX19GSUxFX18KLQotZXh0ZXJuIHZvaWQgKCpzNXBfcmVzZXRfaG9vaykodm9pZCk7Ci0KLSNlbmRpZiAvKiBfX0FTTV9QTEFUX1M1UF9SRVNFVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwLWNsb2NrLmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwLWNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OWI1YmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cC1jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cC1jbG9jay5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIHM1cCBjbG9jayBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fUExBVF9TNVBfQ0xPQ0tfSAotI2RlZmluZSBfX0FTTV9QTEFUX1M1UF9DTE9DS19IIF9fRklMRV9fCi0KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLQotI2RlZmluZSBHRVRfRElWKGNsaywgZmllbGQpICgoKChjbGspICYgZmllbGQjI19NQVNLKSA+PiBmaWVsZCMjX1NISUZUKSArIDEpCi0KLSNkZWZpbmUgY2xrX2Zpbl9hcGxsIGNsa19leHRfeHRhbF9tdXgKLSNkZWZpbmUgY2xrX2Zpbl9tcGxsIGNsa19leHRfeHRhbF9tdXgKLSNkZWZpbmUgY2xrX2Zpbl9lcGxsIGNsa19leHRfeHRhbF9tdXgKLSNkZWZpbmUgY2xrX2Zpbl9kcGxsIGNsa19leHRfeHRhbF9tdXgKLSNkZWZpbmUgY2xrX2Zpbl92cGxsIGNsa19leHRfeHRhbF9tdXgKLSNkZWZpbmUgY2xrX2Zpbl9ocGxsIGNsa19leHRfeHRhbF9tdXgKLQotZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2V4dF94dGFsX211eDsKLWV4dGVybiBzdHJ1Y3QgY2xrIGNsa194dXNieHRpOwotZXh0ZXJuIHN0cnVjdCBjbGsgY2xrXzQ4bTsKLWV4dGVybiBzdHJ1Y3QgY2xrIHM1cF9jbGtfMjdtOwotZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2ZvdXRfYXBsbDsKLWV4dGVybiBzdHJ1Y3QgY2xrIGNsa19mb3V0X21wbGw7Ci1leHRlcm4gc3RydWN0IGNsayBjbGtfZm91dF9lcGxsOwotZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2ZvdXRfZHBsbDsKLWV4dGVybiBzdHJ1Y3QgY2xrIGNsa19mb3V0X3ZwbGw7Ci1leHRlcm4gc3RydWN0IGNsayBjbGtfYXJtOwotZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX3ZwbGw7Ci0KLWV4dGVybiBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrX3NyY19hcGxsOwotZXh0ZXJuIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtfc3JjX21wbGw7Ci1leHRlcm4gc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa19zcmNfZXBsbDsKLWV4dGVybiBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrX3NyY19kcGxsOwotCi1leHRlcm4gaW50IHM1cF9nYXRlY3RybCh2b2lkIF9faW9tZW0gKnJlZywgc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKTsKLQotLyogQ29tbW9uIEVQTEwgb3BlcmF0aW9ucyBmb3IgUzVQIHBsYXRmb3JtICovCi1leHRlcm4gaW50IHM1cF9lcGxsX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgczVwX2VwbGxfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKTsKLQotLyogU1BESUYgY2xrIG9wZXJhdGlvbnMgY29tbW9uIGZvciBTNVBDMTAwL1YyMTAvQzExMCBhbmQgRXh5bm9zNCAqLwotZXh0ZXJuIGludCBzNXBfc3BkaWZfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgczVwX3NwZGlmX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsayk7Ci0KLWV4dGVybiBzdHJ1Y3QgY2xrX29wcyBzNXBfc2Nsa19zcGRpZl9vcHM7Ci0jZW5kaWYgLyogX19BU01fUExBVF9TNVBfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cC10aW1lLmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwLXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1ZTg4MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwLXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXAtdGltZS5oCi0gKgotICogQ29weXJpZ2h0IDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIEhlYWRlciBmaWxlIGZvciBzNXAgdGltZSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fUExBVF9TNVBfVElNRV9ICi0jZGVmaW5lIF9fQVNNX1BMQVRfUzVQX1RJTUVfSCBfX0ZJTEVfXwotCi0vKiBTNVAgSFItVGltZXIgQ2xvY2sgbW9kZSAqLwotZW51bSBzNXBfdGltZXJfbW9kZSB7Ci0JUzVQX1BXTTAsCi0JUzVQX1BXTTEsCi0JUzVQX1BXTTIsCi0JUzVQX1BXTTMsCi0JUzVQX1BXTTQsCi19OwotCi1zdHJ1Y3QgczVwX3RpbWVyX3NvdXJjZSB7Ci0JdW5zaWduZWQgaW50IGV2ZW50X2lkOwotCXVuc2lnbmVkIGludCBzb3VyY2VfaWQ7Ci19OwotCi0vKiBCZSBhYmxlIHRvIHNsZWVwIGZvciBhdGxlYXN0IDQgc2Vjb25kcyAodXN1YWxseSBtb3JlKSAqLwotI2RlZmluZSBTNVBUSU1FUl9NSU5fUkFOR0UJNAotCi0jZGVmaW5lIFRDTlRfTUFYCQkweGZmZmZmZmZmCi0jZGVmaW5lIE5PTl9QRVJJT0RJQwkJMAotI2RlZmluZSBQRVJJT0RJQwkJMQotCi1leHRlcm4gdm9pZCBfX2luaXQgczVwX3NldF90aW1lcl9zb3VyY2UoZW51bSBzNXBfdGltZXJfbW9kZSBldmVudCwKLQkJCQkJZW51bSBzNXBfdGltZXJfbW9kZSBzb3VyY2UpOwotZXh0ZXJuCXN0cnVjdCBzeXNfdGltZXIgczVwX3RpbWVyOwotI2VuZGlmIC8qIF9fQVNNX1BMQVRfUzVQX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cDY0NDAuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXA2NDQwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODU4NWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cDY0NDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIGFyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXA2NDQwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIEhlYWRlciBmaWxlIGZvciBzNXA2NDQwIGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSAvKiBDb21tb24gaW5pdCBjb2RlIGZvciBTNVA2NDQwIHJlbGF0ZWQgU29DcyAqLwotCi1leHRlcm4gdm9pZCBzNXA2NDQwX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cDY0NDBfc2V0dXBfY2xvY2tzKHZvaWQpOwotCi0jaWZkZWYgQ09ORklHX0NQVV9TNVA2NDQwCi0KLWV4dGVybiAgaW50IHM1cDY0eDBfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cDY0NDBfaW5pdF9pcnEodm9pZCk7Ci1leHRlcm4gdm9pZCBzNXA2NDQwX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cDY0NDBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOwotCi1leHRlcm4gdm9pZCBzNXA2NDQwX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOwotCi0jZWxzZQotI2RlZmluZSBzNXA2NDQwX2luaXRfY2xvY2tzIE5VTEwKLSNkZWZpbmUgczVwNjQ0MF9pbml0X3VhcnRzIE5VTEwKLSNkZWZpbmUgczVwNjQ0MF9tYXBfaW8gTlVMTAotI2RlZmluZSBzNXA2NHgwX2luaXQgTlVMTAotI2VuZGlmCi0KLS8qIFM1UDY0NDAgdGltZXIgKi8KLQotZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgczVwNjQ0MF90aW1lcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXA2NDUwLmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwNjQ1MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDBhNDFjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXA2NDUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBhcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwNjQ1MC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEhlYWRlciBmaWxlIGZvciBzNXA2NDUwIGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLS8qIENvbW1vbiBpbml0IGNvZGUgZm9yIFM1UDY0NTAgcmVsYXRlZCBTb0NzICovCi0KLWV4dGVybiB2b2lkIHM1cDY0NTBfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwNjQ1MF9zZXR1cF9jbG9ja3Modm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX1M1UDY0NTAKLQotZXh0ZXJuICBpbnQgczVwNjR4MF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwNjQ1MF9pbml0X2lycSh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cDY0NTBfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwNjQ1MF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLWV4dGVybiB2b2lkIHM1cDY0NTBfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7Ci0KLSNlbHNlCi0jZGVmaW5lIHM1cDY0NTBfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzNXA2NDUwX2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBzNXA2NDUwX21hcF9pbyBOVUxMCi0jZGVmaW5lIHM1cDY0eDBfaW5pdCBOVUxMCi0jZW5kaWYKLQotLyogUzVQNjQ1MCB0aW1lciAqLwotCi1leHRlcm4gc3RydWN0IHN5c190aW1lciBzNXA2NDUwX3RpbWVyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cGMxMDAuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXBjMTAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjA5OWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cGMxMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIGFyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXBjMTAwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIEhlYWRlciBmaWxlIGZvciBzNXBjMTAwIGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLS8qIENvbW1vbiBpbml0IGNvZGUgZm9yIFM1UEMxMDAgcmVsYXRlZCBTb0NzICovCi0KLWV4dGVybiB2b2lkIHM1cGMxMDBfY29tbW9uX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOwotZXh0ZXJuIHZvaWQgczVwYzEwMF9yZWdpc3Rlcl9jbG9ja3Modm9pZCk7Ci1leHRlcm4gdm9pZCBzNXBjMTAwX3NldHVwX2Nsb2Nrcyh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19DUFVfUzVQQzEwMAotCi1leHRlcm4gIGludCBzNXBjMTAwX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBzNXBjMTAwX2luaXRfaXJxKHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwYzEwMF9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBzNXBjMTAwX2luaXRfY2xvY2tzKGludCB4dGFsKTsKLQotI2RlZmluZSBzNXBjMTAwX2luaXRfdWFydHMgczVwYzEwMF9jb21tb25faW5pdF91YXJ0cwotCi0jZWxzZQotI2RlZmluZSBzNXBjMTAwX2luaXRfY2xvY2tzIE5VTEwKLSNkZWZpbmUgczVwYzEwMF9pbml0X3VhcnRzIE5VTEwKLSNkZWZpbmUgczVwYzEwMF9tYXBfaW8gTlVMTAotI2RlZmluZSBzNXBjMTAwX2luaXQgTlVMTAotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwdjIxMC5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cHYyMTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5M2EwYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwdjIxMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cHYyMTAuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIHM1cHYyMTAgY3B1IHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotLyogQ29tbW9uIGluaXQgY29kZSBmb3IgUzVQVjIxMCByZWxhdGVkIFNvQ3MgKi8KLQotZXh0ZXJuIHZvaWQgczVwdjIxMF9jb21tb25faW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7Ci1leHRlcm4gdm9pZCBzNXB2MjEwX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cHYyMTBfc2V0dXBfY2xvY2tzKHZvaWQpOwotCi0jaWZkZWYgQ09ORklHX0NQVV9TNVBWMjEwCi0KLWV4dGVybiAgaW50IHM1cHYyMTBfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cHYyMTBfaW5pdF9pcnEodm9pZCk7Ci1leHRlcm4gdm9pZCBzNXB2MjEwX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cHYyMTBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOwotCi0jZGVmaW5lIHM1cHYyMTBfaW5pdF91YXJ0cyBzNXB2MjEwX2NvbW1vbl9pbml0X3VhcnRzCi0KLSNlbHNlCi0jZGVmaW5lIHM1cHYyMTBfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzNXB2MjEwX2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBzNXB2MjEwX21hcF9pbyBOVUxMCi0jZGVmaW5lIHM1cHYyMTBfaW5pdCBOVUxMCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zeXNtbXUuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zeXNtbXUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1MjgzYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvc3lzbW11LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvc3lzbW11LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBTYW1zdW5nIFN5c3RlbSBNTVUgZHJpdmVyIGZvciBTNVAgcGxhdGZvcm0KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9fUExBVF9TWVNNTVVfSAotI2RlZmluZSBfX0FTTV9fUExBVF9TWVNNTVVfSCBfX0ZJTEVfXwotCi1lbnVtIFM1UF9TWVNNTVVfSU5URVJSVVBUX1RZUEUgewotCVNZU01NVV9QQUdFRkFVTFQsCi0JU1lTTU1VX0FSX01VTFRJSElULAotCVNZU01NVV9BV19NVUxUSUhJVCwKLQlTWVNNTVVfQlVTRVJST1IsCi0JU1lTTU1VX0FSX1NFQ1VSSVRZLAotCVNZU01NVV9BUl9BQ0NFU1MsCi0JU1lTTU1VX0FXX1NFQ1VSSVRZLAotCVNZU01NVV9BV19QUk9URUNUSU9OLCAvKiA3ICovCi0JU1lTTU1VX0ZBVUxUU19OVU0KLX07Ci0KLSNpZmRlZiBDT05GSUdfUzVQX1NZU1RFTV9NTVUKLQotI2luY2x1ZGUgPG1hY2gvc3lzbW11Lmg+Ci0KLS8qKgotICogczVwX3N5c21tdV9lbmFibGUoKSAtIGVuYWJsZSBzeXN0ZW0gbW11IG9mIGlwCi0gKiBAaXBzOiBUaGUgaXAgY29ubmVjdGVkIHN5c3RlbSBtbXUuCi0gKiAjcGdkOiBCYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIDFzdCBsZXZlbCBwYWdlIHRhYmxlCi0gKgotICogVGhpcyBmdW5jdGlvbiBlbmFibGUgc3lzdGVtIG1tdSB0byB0cmFuc2ZlciBhZGRyZXNzCi0gKiBmcm9tIHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCi0gKi8KLXZvaWQgczVwX3N5c21tdV9lbmFibGUoc3lzbW11X2lwcyBpcHMsIHVuc2lnbmVkIGxvbmcgcGdkKTsKLQotLyoqCi0gKiBzNXBfc3lzbW11X2Rpc2FibGUoKSAtIGRpc2FibGUgc3lzbW11IG1tdSBvZiBpcAotICogQGlwczogVGhlIGlwIGNvbm5lY3RlZCBzeXN0ZW0gbW11LgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZGlzYWJsZSBzeXN0ZW0gbW11IHRvIHRyYW5zZmVyIGFkZHJlc3MKLSAqIGZyb20gdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MKLSAqLwotdm9pZCBzNXBfc3lzbW11X2Rpc2FibGUoc3lzbW11X2lwcyBpcHMpOwotCi0vKioKLSAqIHM1cF9zeXNtbXVfc2V0X3RhYmxlYmFzZV9wZ2QoKSAtIHNldCBwYWdlIHRhYmxlIGJhc2UgYWRkcmVzcyB0byByZWZlciBwYWdlIHRhYmxlCi0gKiBAaXBzOiBUaGUgaXAgY29ubmVjdGVkIHN5c3RlbSBtbXUuCi0gKiBAcGdkOiBUaGUgcGFnZSB0YWJsZSBiYXNlIGFkZHJlc3MuCi0gKgotICogVGhpcyBmdW5jdGlvbiBzZXQgcGFnZSB0YWJsZSBiYXNlIGFkZHJlc3MKLSAqIFdoZW4gc3lzdGVtIG1tdSB0cmFuc2ZlciBhZGRyZXNzIGZyb20gdmlydGF1bCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MsCi0gKiBzeXN0ZW0gbW11IHJlZmVyIGFkZHJlc3MgaW5mb3JtYXRpb24gZnJvbSBwYWdlIHRhYmxlCi0gKi8KLXZvaWQgczVwX3N5c21tdV9zZXRfdGFibGViYXNlX3BnZChzeXNtbXVfaXBzIGlwcywgdW5zaWduZWQgbG9uZyBwZ2QpOwotCi0vKioKLSAqIHM1cF9zeXNtbXVfdGxiX2ludmFsaWRhdGUoKSAtIGZsdXNoIGFsbCBUTEIgZW50cnkgaW4gc3lzdGVtIG1tdQotICogQGlwczogVGhlIGlwIGNvbm5lY3RlZCBzeXN0ZW0gbW11LgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZmx1c2ggYWxsIFRMQiBlbnRyeSBpbiBzeXN0ZW0gbW11Ci0gKi8KLXZvaWQgczVwX3N5c21tdV90bGJfaW52YWxpZGF0ZShzeXNtbXVfaXBzIGlwcyk7Ci0KLS8qKiBzNXBfc3lzbW11X3NldF9mYXVsdF9oYW5kbGVyKCkgLSBGYXVsdCBoYW5kbGVyIGZvciBTeXN0ZW0gTU1VcwotICogQGl0eXBlOiB0eXBlIG9mIGZhdWx0LgotICogQHBndGFibGVfYmFzZTogdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcGFnZSB0YWJsZSBiYXNlLiBUaGlzIGlzIDAgaWYgQGlwcyBpcwotICogICAgICAgICAgICAgICBTWVNNTVVfQlVTRVJST1IuCi0gKiBAZmF1bHRfYWRkcjogdGhlIGRldmljZSAodmlydHVhbCkgYWRkcmVzcyB0aGF0IHRoZSBTeXN0ZW0gTU1VIHRyaWVkIHRvCi0gKiAgICAgICAgICAgICB0cmFuc2xhdGVkLiBUaGlzIGlzIDAgaWYgQGlwcyBpcyBTWVNNTVVfQlVTRVJST1IuCi0gKiBDYWxsZWQgd2hlbiBpbnRlcnJ1cHQgb2NjdXJyZWQgYnkgdGhlIFN5c3RlbSBNTVVzCi0gKiBUaGUgZGV2aWNlIGRyaXZlcnMgb2YgcGVyaXBoZXJhbCBkZXZpY2VzIHRoYXQgaGFzIGEgU3lzdGVtIE1NVSBjYW4gaW1wbGVtZW50Ci0gKiBhIGZhdWx0IGhhbmRsZXIgdG8gcmVzb2x2ZSBhZGRyZXNzIHRyYW5zbGF0aW9uIGZhdWx0IGJ5IFN5c3RlbSBNTVUuCi0gKiBUaGUgbWVhbmluZ3Mgb2YgcmV0dXJuIHZhbHVlIGFuZCBwYXJhbWV0ZXJzIGFyZSBkZXNjcmliZWQgYmVsb3cuCi0KLSAqIHJldHVybiB2YWx1ZTogbm9uLXplcm8gaWYgdGhlIGZhdWx0IGlzIGNvcnJlY3RseSByZXNvbHZlZC4KLSAqICAgICAgICAgemVybyBpZiB0aGUgZmF1bHQgaXMgbm90IGhhbmRsZWQuCi0gKi8KLXZvaWQgczVwX3N5c21tdV9zZXRfZmF1bHRfaGFuZGxlcihzeXNtbXVfaXBzIGlwcywKLQkJCWludCAoKmhhbmRsZXIpKGVudW0gUzVQX1NZU01NVV9JTlRFUlJVUFRfVFlQRSBpdHlwZSwKLQkJCQkJdW5zaWduZWQgbG9uZyBwZ3RhYmxlX2Jhc2UsCi0JCQkJCXVuc2lnbmVkIGxvbmcgZmF1bHRfYWRkcikpOwotI2Vsc2UKLSNkZWZpbmUgczVwX3N5c21tdV9lbmFibGUoaXBzLCBwZ2QpIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgczVwX3N5c21tdV9kaXNhYmxlKGlwcykgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBzNXBfc3lzbW11X3NldF90YWJsZWJhc2VfcGdkKGlwcywgcGdkKSBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHM1cF9zeXNtbXVfdGxiX2ludmFsaWRhdGUoaXBzKSBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHM1cF9zeXNtbXVfc2V0X2ZhdWx0X2hhbmRsZXIoaXBzLCBoYW5kbGVyKSBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLSNlbmRpZiAvKiBfX0FTTV9QTEFUX1NZU01NVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvc3lzdGVtLXJlc2V0LmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvc3lzdGVtLXJlc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDdmMzQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3N5c3RlbS1yZXNldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3N5c3RlbS1yZXNldC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3lzdGVtLXJlc2V0LmgKLSAqCi0gKiBTNVAgLSBTeXN0ZW0gZGVmaW5lIGZvciBhcmNoX3Jlc2V0KCkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPHBsYXQvd2F0Y2hkb2ctcmVzZXQuaD4KLQotdm9pZCAoKnM1cF9yZXNldF9ob29rKSh2b2lkKTsKLQotc3RhdGljIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUsIGNvbnN0IGNoYXIgKmNtZCkKLXsKLQkvKiBTV1JFU0VUIHN1cHBvcnQgaW4gczVwX3Jlc2V0X2hvb2soKSAqLwotCi0JaWYgKHM1cF9yZXNldF9ob29rKQotCQlzNXBfcmVzZXRfaG9vaygpOwotCi0JLyogUGVyZm9ybSByZXNldCB1c2luZyBXYXRjaGRvZyByZXNldAotCSAqIGlmIHRoZXJlIGlzIG5vIHM1cF9yZXNldF9ob29rKCkKLQkgKi8KLQotCWFyY2hfd2R0X3Jlc2V0KCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvdXNiLXBoeS5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3VzYi1waHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkNmJjZi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvdXNiLXBoeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAotICogQXV0aG9yOiBKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9fUExBVF9TNVBfVVNCX1BIWV9ICi0jZGVmaW5lIF9fUExBVF9TNVBfVVNCX1BIWV9ICi0KLWVudW0gczVwX3VzYl9waHlfdHlwZSB7Ci0JUzVQX1VTQl9QSFlfREVWSUNFLAotCVM1UF9VU0JfUEhZX0hPU1QsCi19OwotCi1leHRlcm4gaW50IHM1cF91c2JfcGh5X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHR5cGUpOwotZXh0ZXJuIGludCBzNXBfdXNiX3BoeV9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCB0eXBlKTsKLQotI2VuZGlmIC8qIF9fUExBVF9TNVBfUkVHU19VU0JfUEhZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2lycS1ncGlvaW50LmMgYi9hcmNoL2FybS9wbGF0LXM1cC9pcnEtZ3Bpb2ludC5jCmluZGV4IGM2NWViNzkuLjFmZGZhYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2lycS1ncGlvaW50LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zNXAvaXJxLWdwaW9pbnQuYwpAQCAtMzcsNyArMzcsNyBAQAogCWludAkJCXN0YXJ0OwogCWludAkJCW5yX2dyb3VwczsKIAlpbnQJCQlpcnE7Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAJKipjaGlwczsKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAJKipjaGlwczsKIAl2b2lkCQkJKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQsIHN0cnVjdCBpcnFfZGVzYyAqKTsKIH07CiAKQEAgLTg3LDcgKzg3LDcgQEAKIAljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKIAogCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IGJhbmstPm5yX2dyb3VwczsgZ3JvdXArKykgewotCQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IGJhbmstPmNoaXBzW2dyb3VwXTsKKwkJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwID0gYmFuay0+Y2hpcHNbZ3JvdXBdOwogCQlpZiAoIWNoaXApCiAJCQljb250aW51ZTsKIApAQCAtMTEwLDcgKzExMCw3IEBACiAJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgczVwX2dwaW9pbnRfYWRkKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQorc3RhdGljIF9faW5pdCBpbnQgczVwX2dwaW9pbnRfYWRkKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCkKIHsKIAlzdGF0aWMgaW50IHVzZWRfZ3Bpb2ludF9ncm91cHMgPSAwOwogCWludCBncm91cCA9IGNoaXAtPmdyb3VwOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFiYW5rLT5oYW5kbGVyKSB7Ci0JCWJhbmstPmNoaXBzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHMzY19ncGlvX2NoaXAgKikgKgorCQliYW5rLT5jaGlwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqKSAqCiAJCQkJICAgICAgYmFuay0+bnJfZ3JvdXBzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFiYW5rLT5jaGlwcykKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAKIGludCBfX2luaXQgczVwX3JlZ2lzdGVyX2dwaW9faW50ZXJydXB0KGludCBwaW4pCiB7Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKm15X2NoaXAgPSBzM2NfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpteV9jaGlwID0gc2Ftc3VuZ19ncGlvbGliX2dldGNoaXAocGluKTsKIAlpbnQgb2Zmc2V0LCBncm91cDsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9zbGVlcC5TIGIvYXJjaC9hcm0vcGxhdC1zNXAvc2xlZXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmQ1OTFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zNXAvc2xlZXAuUwpAQCAtMCwwICsxLDQ5IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXM1cC9zbGVlcC5TCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIENvbW1vbiBTNVAgU2xlZXAgQ29kZQorICogQmFzZWQgb24gUzNDNjRYWCBzbGVlcCBjb2RlIGJ5OgorICoJQmVuIERvb2tzLCAoYykgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworCS50ZXh0CisKKwkvKgorCSAqIHNsZWVwIG1hZ2ljLCB0byBhbGxvdyB0aGUgYm9vdGxvYWRlciB0byBjaGVjayBmb3IgYW4gdmFsaWQKKwkgKiBpbWFnZSB0byByZXN1bWUgdG8uIE11c3QgYmUgdGhlIGZpcnN0IHdvcmQgYmVmb3JlIHRoZQorCSAqIHMzY19jcHVfcmVzdW1lIGVudHJ5LgorCSAqLworCisJLndvcmQJMHgyYmVkZjAwZAorCisJLyoKKwkgKiBzM2NfY3B1X3Jlc3VtZQorCSAqCisJICogcmVzdW1lIGNvZGUgZW50cnkgZm9yIGJvb3Rsb2FkZXIgdG8gY2FsbAorCSAqCisJICogd2UgbXVzdCBwdXQgdGhpcyBjb2RlIGhlcmUgaW4gdGhlIGRhdGEgc2VnbWVudCBhcyB3ZSBoYXZlIG5vCisJICogb3RoZXIgd2F5IG9mIHJlc3RvcmluZyB0aGUgc3RhY2sgcG9pbnRlciBhZnRlciBzbGVlcCwgYW5kIHdlCisJICogbXVzdCBub3Qgd3JpdGUgdG8gdGhlIGNvZGUgc2VnbWVudCAoY29kZSBpcyByZWFkLW9ubHkpCisJICovCisKK0VOVFJZKHMzY19jcHVfcmVzdW1lKQorCWIJY3B1X3Jlc3VtZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvS2NvbmZpZwppbmRleCBkZmZhMzdiLi4zMTNlYjI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvS2NvbmZpZwpAQCAtNzQsMzkgKzc0LDEyIEBACiAJICBjb25maWd1cmF0aW9uLiBHUElPbGliIHNoYWxsIGJlIGNvbXBpbGVkIG9ubHkgZm9yIFMzQzY0WFggYW5kIFM1UAogCSAgc2VyaWVzIG9mIHByb2Nlc3NvcnMuCiAKLWNvbmZpZyBTM0NfR1BJT19DRkdfUzNDMjRYWAotCWJvb2wKLQloZWxwCi0JICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSBTM0MyNFhYIHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbgotCSAgZnVuY3Rpb25zLgotCiBjb25maWcgUzNDX0dQSU9fQ0ZHX1MzQzY0WFgKIAlib29sCiAJaGVscAogCSAgSW50ZXJuYWwgY29uZmlndXJhdGlvbiB0byBlbmFibGUgUzNDNjRYWCBzdHlsZSBHUElPIGNvbmZpZ3VyYXRpb24KIAkgIGZ1bmN0aW9ucy4KIAotY29uZmlnIFMzQ19HUElPX1BVTExfVVBET1dOCi0JYm9vbAotCWhlbHAKLQkgIEludGVybmFsIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIHRoZSBjb3JyZWN0IEdQSU8gcHVsbCBoZWxwZXIKLQotY29uZmlnIFMzQ19HUElPX1BVTExfUzNDMjQ0MwotCWJvb2wKLQlzZWxlY3QgUzNDX0dQSU9fUFVMTF9VUERPV04KLQloZWxwCi0JICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUgY29ycmVjdCBHUElPIHB1bGwgaGVscGVyIGZvciBTM0MyNDQzLXN0eWxlIEdQSU8KLQotY29uZmlnIFMzQ19HUElPX1BVTExfRE9XTgotCWJvb2wKLQloZWxwCi0JICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUgY29ycmVjdCBHUElPIHB1bGwgaGVscGVyCi0KLWNvbmZpZyBTM0NfR1BJT19QVUxMX1VQCi0JYm9vbAotCWhlbHAKLQkgIEludGVybmFsIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIHRoZSBjb3JyZWN0IEdQSU8gcHVsbCBoZWxwZXIKLQogY29uZmlnIFM1UF9HUElPX0RSVlNUUgogCWJvb2wKIAloZWxwCkBAIC0yOTUsMTEgKzI2OCwxNCBAQAogCWhlbHAKIAkgIEludGVybmFsIGNvbmZpZ3VyYXRpb24gZm9yIFMzQyBETUEgY29yZQogCi1jb25maWcgUzNDX1BMMzMwX0RNQQorY29uZmlnIFNBTVNVTkdfRE1BREVWCiAJYm9vbAotCXNlbGVjdCBQTDMzMAorCXNlbGVjdCBETUFERVZJQ0VTCisJc2VsZWN0IFBMMzMwX0RNQSBpZiAoQ1BVX0VYWU5PUzQyMTAgfHwgQ1BVX1M1UFYyMTAgfHwgQ1BVX1M1UEMxMDAgfHwgXAorCQkJCQlDUFVfUzVQNjQ1MCB8fCBDUFVfUzVQNjQ0MCkKKwlzZWxlY3QgQVJNX0FNQkEKIAloZWxwCi0JICBTM0MgRE1BIEFQSSBEcml2ZXIgZm9yIFBMMzMwIERNQUMuCisJICBVc2UgRE1BIGRldmljZSBlbmdpbmUgZm9yIFBMMzMwIERNQUMuCiAKIGNvbW1lbnQgIlBvd2VyIG1hbmFnZW1lbnQiCiAKQEAgLTM2Miw0ICszMzgsMTEgQEAKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgUG93ZXIgRG9tYWluIGJ5IFJ1bnRpbWUgUE0uCiAKK2NvbmZpZyBERUJVR19TM0NfVUFSVAorCWRlcGVuZHMgb24gUExBVF9TQU1TVU5HCisJaW50CisJZGVmYXVsdCAiMCIgaWYgREVCVUdfUzNDX1VBUlQwCisJZGVmYXVsdCAiMSIgaWYgREVCVUdfUzNDX1VBUlQxCisJZGVmYXVsdCAiMiIgaWYgREVCVUdfUzNDX1VBUlQyCisKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvTWFrZWZpbGUKaW5kZXggMTEwNTkyMjMuLjYwMTIzNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACi0jIGFyY2gvYXJtL3BsYXQtczNjNjR4eC9NYWtlZmlsZQorIyBhcmNoL2FybS9wbGF0LXNhbXN1bmcvTWFrZWZpbGUKICMKICMgQ29weXJpZ2h0IDIwMDkgU2ltdGVjIEVsZWN0cm9uaWNzCiAjCkBAIC0xMSwxMyArMTEsMTAgQEAKIAogIyBPYmplY3RzIHdlIGFsd2F5cyBidWlsZCBpbmRlcGVuZGVudCBvZiBTb0MgY2hvaWNlCiAKLW9iai15CQkJCSs9IGluaXQubworb2JqLXkJCQkJKz0gaW5pdC5vIGNwdS5vCiBvYmotJChDT05GSUdfQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQpICAgKz0gdGltZS5vCiBvYmoteQkJCQkrPSBjbG9jay5vCiBvYmoteQkJCQkrPSBwd20tY2xvY2subwotb2JqLXkJCQkJKz0gZ3Bpby5vCi1vYmoteQkJCQkrPSBncGlvLWNvbmZpZy5vCi1vYmoteQkJCQkrPSBkZXYtYXNvY2RtYS5vCiAKIG9iai0kKENPTkZJR19TQU1TVU5HX0NMS1NSQykJKz0gY2xvY2stY2xrc3JjLm8KIApAQCAtMzEsNDAgKzI4LDE2IEBACiAKIG9iai15CQkJCSs9IHBsYXRmb3JtZGF0YS5vCiAKLW9iai0kKENPTkZJR19TM0NfREVWX0hTTU1DKQkrPSBkZXYtaHNtbWMubwotb2JqLSQoQ09ORklHX1MzQ19ERVZfSFNNTUMxKQkrPSBkZXYtaHNtbWMxLm8KLW9iai0kKENPTkZJR19TM0NfREVWX0hTTU1DMikJKz0gZGV2LWhzbW1jMi5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9IU01NQzMpCSs9IGRldi1oc21tYzMubwotb2JqLSQoQ09ORklHX1MzQ19ERVZfSFdNT04pCSs9IGRldi1od21vbi5vCi1vYmoteQkJCQkrPSBkZXYtaTJjMC5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9JMkMxKQkrPSBkZXYtaTJjMS5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9JMkMyKQkrPSBkZXYtaTJjMi5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9JMkMzKQkrPSBkZXYtaTJjMy5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9JMkM0KQkrPSBkZXYtaTJjNC5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9JMkM1KQkrPSBkZXYtaTJjNS5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9JMkM2KQkrPSBkZXYtaTJjNi5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9JMkM3KQkrPSBkZXYtaTJjNy5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9GQikJKz0gZGV2LWZiLm8KK29iai15CQkJCSs9IGRldnMubwogb2JqLXkJCQkJKz0gZGV2LXVhcnQubwotb2JqLSQoQ09ORklHX1MzQ19ERVZfVVNCX0hPU1QpCSs9IGRldi11c2Iubwotb2JqLSQoQ09ORklHX1MzQ19ERVZfVVNCX0hTT1RHKQkrPSBkZXYtdXNiLWhzb3RnLm8KLW9iai0kKENPTkZJR19TM0NfREVWX1dEVCkJKz0gZGV2LXdkdC5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9OQU5EKQkrPSBkZXYtbmFuZC5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9PTkVOQU5EKQkrPSBkZXYtb25lbmFuZC5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9SVEMpCSs9IGRldi1ydGMubwogCi1vYmotJChDT05GSUdfU0FNU1VOR19ERVZfQURDKQkrPSBkZXYtYWRjLm8KLW9iai0kKENPTkZJR19TQU1TVU5HX0RFVl9JREUpCSs9IGRldi1pZGUubwotb2JqLSQoQ09ORklHX1NBTVNVTkdfREVWX1RTKQkrPSBkZXYtdHMubwotb2JqLSQoQ09ORklHX1NBTVNVTkdfREVWX0tFWVBBRCkJKz0gZGV2LWtleXBhZC5vCi1vYmotJChDT05GSUdfU0FNU1VOR19ERVZfUFdNKQkrPSBkZXYtcHdtLm8KIG9iai0kKENPTkZJR19TQU1TVU5HX0RFVl9CQUNLTElHSFQpCSs9IGRldi1iYWNrbGlnaHQubwogCiAjIERNQSBzdXBwb3J0CiAKLW9iai0kKENPTkZJR19TM0NfRE1BKQkJKz0gZG1hLm8KK29iai0kKENPTkZJR19TM0NfRE1BKQkJKz0gZG1hLm8gczNjLWRtYS1vcHMubwogCi1vYmotJChDT05GSUdfUzNDX1BMMzMwX0RNQSkJKz0gczNjLXBsMzMwLm8KK29iai0kKENPTkZJR19TQU1TVU5HX0RNQURFVikJKz0gZG1hLW9wcy5vCiAKICMgUE0gc3VwcG9ydAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvYWRjLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvYWRjLmMKaW5kZXggZWU4ZGVlZi4uMzNlY2QwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2FkYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9hZGMuYwpAQCAtNDEsNiArNDEsOCBAQAogCiBlbnVtIHMzY19jcHVfdHlwZSB7CiAJVFlQRV9BRENWMSwgLyogUzNDMjRYWCAqLworCVRZUEVfQURDVjExLCAvKiBTM0MyNDQzICovCisJVFlQRV9BRENWMTIsIC8qIFMzQzI0MTYsIFMzQzI0NTAgKi8KIAlUWVBFX0FEQ1YyLCAvKiBTM0M2NFhYLCBTNVA2NFgwLCBTNVBDMTAwICovCiAJVFlQRV9BRENWMywgLyogUzVQVjIxMCwgUzVQQzExMCwgRVhZTk9TNDIxMCAqLwogfTsKQEAgLTk4LDEzICsxMDAsMTcgQEAKIAogCWNsaWVudC0+c2VsZWN0X2NiKGNsaWVudCwgMSk7CiAKLQljb24gJj0gflMzQzI0MTBfQURDQ09OX01VWE1BU0s7CisJaWYgKGNwdSA9PSBUWVBFX0FEQ1YxIHx8IGNwdSA9PSBUWVBFX0FEQ1YyKQorCQljb24gJj0gflMzQzI0MTBfQURDQ09OX01VWE1BU0s7CiAJY29uICY9IH5TM0MyNDEwX0FEQ0NPTl9TVERCTTsKIAljb24gJj0gflMzQzI0MTBfQURDQ09OX1NUQVJUTUFTSzsKIAogCWlmICghY2xpZW50LT5pc190cykgewogCQlpZiAoY3B1ID09IFRZUEVfQURDVjMpCiAJCQl3cml0ZWwoY2xpZW50LT5jaGFubmVsICYgMHhmLCBhZGMtPnJlZ3MgKyBTNVBfQURDTVVYKTsKKwkJZWxzZSBpZiAoY3B1ID09IFRZUEVfQURDVjExIHx8IGNwdSA9PSBUWVBFX0FEQ1YxMikKKwkJCXdyaXRlbChjbGllbnQtPmNoYW5uZWwgJiAweGYsCisJCQkJCQlhZGMtPnJlZ3MgKyBTM0MyNDQzX0FEQ01VWCk7CiAJCWVsc2UKIAkJCWNvbiB8PSBTM0MyNDEwX0FEQ0NPTl9TRUxNVVgoY2xpZW50LT5jaGFubmVsKTsKIAl9CkBAIC0yOTMsMTMgKzI5OSwxMyBAQAogCiAJY2xpZW50LT5ucl9zYW1wbGVzLS07CiAKLQlpZiAoY3B1ICE9IFRZUEVfQURDVjEpIHsKLQkJLyogUzNDNjRYWC9TNVAgQURDIHJlc29sdXRpb24gaXMgMTItYml0ICovCi0JCWRhdGEwICY9IDB4ZmZmOwotCQlkYXRhMSAmPSAweGZmZjsKLQl9IGVsc2UgeworCWlmIChjcHUgPT0gVFlQRV9BRENWMSB8fCBjcHUgPT0gVFlQRV9BRENWMTEpIHsKIAkJZGF0YTAgJj0gMHgzZmY7CiAJCWRhdGExICY9IDB4M2ZmOworCX0gZWxzZSB7CisJCS8qIFMzQzI0MTYvUzNDNjRYWC9TNVAgQURDIHJlc29sdXRpb24gaXMgMTItYml0ICovCisJCWRhdGEwICY9IDB4ZmZmOworCQlkYXRhMSAmPSAweGZmZjsKIAl9CiAKIAlpZiAoY2xpZW50LT5jb252ZXJ0X2NiKQpAQCAtMzIwLDcgKzMyNiw3IEBACiAJfQogCiBleGl0OgotCWlmIChjcHUgIT0gVFlQRV9BRENWMSkgeworCWlmIChjcHUgPT0gVFlQRV9BRENWMiB8fCBjcHUgPT0gVFlQRV9BRENWMykgewogCQkvKiBDbGVhciBBREMgaW50ZXJydXB0ICovCiAJCXdyaXRlbCgwLCBhZGMtPnJlZ3MgKyBTM0M2NFhYX0FEQ0NMUklOVCk7CiAJfQpAQCAtMzMyLDYgKzMzOCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdHJ1Y3QgYWRjX2RldmljZSAqYWRjOwogCXN0cnVjdCByZXNvdXJjZSAqcmVnczsKKwllbnVtIHMzY19jcHVfdHlwZSBjcHUgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpLT5kcml2ZXJfZGF0YTsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIHRtcDsKIApAQCAtMzk0LDEwICs0MDEsMTMgQEAKIAljbGtfZW5hYmxlKGFkYy0+Y2xrKTsKIAogCXRtcCA9IGFkYy0+cHJlc2NhbGUgfCBTM0MyNDEwX0FEQ0NPTl9QUlNDRU47Ci0JaWYgKHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhICE9IFRZUEVfQURDVjEpIHsKLQkJLyogRW5hYmxlIDEyLWJpdCBBREMgcmVzb2x1dGlvbiAqLworCisJLyogRW5hYmxlIDEyLWJpdCBBREMgcmVzb2x1dGlvbiAqLworCWlmIChjcHUgPT0gVFlQRV9BRENWMTIpCisJCXRtcCB8PSBTM0MyNDE2X0FEQ0NPTl9SRVNTRUw7CisJaWYgKGNwdSA9PSBUWVBFX0FEQ1YyIHx8IGNwdSA9PSBUWVBFX0FEQ1YzKQogCQl0bXAgfD0gUzNDNjRYWF9BRENDT05fUkVTU0VMOwotCX0KKwogCXdyaXRlbCh0bXAsIGFkYy0+cmVncyArIFMzQzI0MTBfQURDQ09OKTsKIAogCWRldl9pbmZvKGRldiwgImF0dGFjaGVkIGFkYyBkcml2ZXJcbiIpOwpAQCAtNDY0LDYgKzQ3NCw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsCiAJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOwogCXN0cnVjdCBhZGNfZGV2aWNlICphZGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwllbnVtIHMzY19jcHVfdHlwZSBjcHUgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpLT5kcml2ZXJfZGF0YTsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgdG1wOwogCkBAIC00NzQsOSArNDg1LDEzIEBACiAJZW5hYmxlX2lycShhZGMtPmlycSk7CiAKIAl0bXAgPSBhZGMtPnByZXNjYWxlIHwgUzNDMjQxMF9BRENDT05fUFJTQ0VOOworCiAJLyogRW5hYmxlIDEyLWJpdCBBREMgcmVzb2x1dGlvbiAqLwotCWlmIChwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpLT5kcml2ZXJfZGF0YSAhPSBUWVBFX0FEQ1YxKQorCWlmIChjcHUgPT0gVFlQRV9BRENWMTIpCisJCXRtcCB8PSBTM0MyNDE2X0FEQ0NPTl9SRVNTRUw7CisJaWYgKGNwdSA9PSBUWVBFX0FEQ1YyIHx8IGNwdSA9PSBUWVBFX0FEQ1YzKQogCQl0bXAgfD0gUzNDNjRYWF9BRENDT05fUkVTU0VMOworCiAJd3JpdGVsKHRtcCwgYWRjLT5yZWdzICsgUzNDMjQxMF9BRENDT04pOwogCiAJcmV0dXJuIDA7CkBAIC00OTIsNiArNTA3LDEyIEBACiAJCS5uYW1lICAgICAgICAgICA9ICJzM2MyNHh4LWFkYyIsCiAJCS5kcml2ZXJfZGF0YSAgICA9IFRZUEVfQURDVjEsCiAJfSwgeworCQkubmFtZQkJPSAiczNjMjQ0My1hZGMiLAorCQkuZHJpdmVyX2RhdGEJPSBUWVBFX0FEQ1YxMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJzM2MyNDE2LWFkYyIsCisJCS5kcml2ZXJfZGF0YQk9IFRZUEVfQURDVjEyLAorCX0sIHsKIAkJLm5hbWUgICAgICAgICAgID0gInMzYzY0eHgtYWRjIiwKIAkJLmRyaXZlcl9kYXRhICAgID0gVFlQRV9BRENWMiwKIAl9LCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvY3B1LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMDZkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9jcHUuYwpAQCAtMCwwICsxLDU4IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvY3B1LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBTYW1zdW5nIENQVSBTdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKwordW5zaWduZWQgbG9uZyBzYW1zdW5nX2NwdV9pZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2Ftc3VuZ19jcHVfcmV2OworCit1bnNpZ25lZCBpbnQgc2Ftc3VuZ19yZXYodm9pZCkKK3sKKwlyZXR1cm4gc2Ftc3VuZ19jcHVfcmV2OworfQorRVhQT1JUX1NZTUJPTChzYW1zdW5nX3Jldik7CisKK3ZvaWQgX19pbml0IHMzYzI0eHhfaW5pdF9jcHUodm9pZCkKK3sKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCisKKwlzYW1zdW5nX2NwdV9yZXYgPSAwOworfQorCit2b2lkIF9faW5pdCBzM2M2NHh4X2luaXRfY3B1KHZvaWQpCit7CisJc2Ftc3VuZ19jcHVfaWQgPSBfX3Jhd19yZWFkbChTM0NfVkFfU1lTICsgMHgxMTgpOworCWlmICghc2Ftc3VuZ19jcHVfaWQpIHsKKwkJLyoKKwkJICogUzNDNjQwMCBoYXMgdGhlIElEIHJlZ2lzdGVyIGluIGEgZGlmZmVyZW50IHBsYWNlLAorCQkgKiBhbmQgbmVlZHMgYSB3cml0ZSBiZWZvcmUgaXQgY2FuIGJlIHJlYWQuCisJCSAqLworCQlfX3Jhd193cml0ZWwoMHgwLCBTM0NfVkFfU1lTICsgMHhBMUMpOworCQlzYW1zdW5nX2NwdV9pZCA9IF9fcmF3X3JlYWRsKFMzQ19WQV9TWVMgKyAweEExQyk7CisJfQorCisJc2Ftc3VuZ19jcHVfcmV2ID0gMDsKK30KKwordm9pZCBfX2luaXQgczVwX2luaXRfY3B1KHZvaWQgX19pb21lbSAqY3B1aWRfYWRkcikKK3sKKwlzYW1zdW5nX2NwdV9pZCA9IF9fcmF3X3JlYWRsKGNwdWlkX2FkZHIpOworCXNhbXN1bmdfY3B1X3JldiA9IHNhbXN1bmdfY3B1X2lkICYgMHhGRjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYWRjLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWFkYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDkwM2Q0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYWRjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWFkYy5jCi0gKgotICogQ29weXJpZ2h0IDIwMTAgTWF1cnVzIEN1ZWxlbmFlcmUKLSAqCi0gKiBTM0M2NHh4IHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgQURDIGRldmljZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9hZGMuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19hZGNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFNBTVNVTkdfUEFfQURDLAotCQkuZW5kICAgPSBTQU1TVU5HX1BBX0FEQyArIFNaXzI1NiAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfVEMsCi0JCS5lbmQgICA9IElSUV9UQywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMl0gPSB7Ci0JCS5zdGFydCA9IElSUV9BREMsCi0JCS5lbmQgICA9IElSUV9BREMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfYWRjID0gewotCS5uYW1lCQk9ICJzYW1zdW5nLWFkYyIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfYWRjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfYWRjX3Jlc291cmNlLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYXNvY2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1hc29jZG1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZTM1ZDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1hc29jZG1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWFzb2NkbWEuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQKLSAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotCi1zdGF0aWMgdTY0IGF1ZGlvX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhbXN1bmdfYXNvY19kbWEgPSB7Ci0JLm5hbWUJCSAgPSAic2Ftc3VuZy1hdWRpbyIsCi0JLmlkCQkgID0gLTEsCi0JLmRldiAgICAgICAgICAgICAgPSB7Ci0JCS5kbWFfbWFzayA9ICZhdWRpb19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAotCX0KLX07Ci1FWFBPUlRfU1lNQk9MKHNhbXN1bmdfYXNvY19kbWEpOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhbXN1bmdfYXNvY19pZG1hID0gewotCS5uYW1lCQk9ICJzYW1zdW5nLWlkbWEiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZhdWRpb19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0KLX07Ci1FWFBPUlRfU1lNQk9MKHNhbXN1bmdfYXNvY19pZG1hKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYmFja2xpZ2h0LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWJhY2tsaWdodC5jCmluZGV4IDNjZWRkNGMuLmU2NTczMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYmFja2xpZ2h0LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1iYWNrbGlnaHQuYwpAQCAtMTIsOCArMTIsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1mYi5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1mYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWExMzYyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtZmIuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2Rldi1mYi5jCi0gKgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGZyYW1lYnVmZmVyIGRldmljZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2ZiLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfZmJfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQ19QQV9GQiwKLQkJLmVuZCAgID0gUzNDX1BBX0ZCICsgU1pfMTZLIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9MQ0RfVlNZTkMsCi0JCS5lbmQgICA9IElSUV9MQ0RfVlNZTkMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQgPSBJUlFfTENEX0ZJRk8sCi0JCS5lbmQgICA9IElSUV9MQ0RfRklGTywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbM10gPSB7Ci0JCS5zdGFydCA9IElSUV9MQ0RfU1lTVEVNLAotCQkuZW5kICAgPSBJUlFfTENEX1NZU1RFTSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9mYiA9IHsKLQkubmFtZQkJICA9ICJzM2MtZmIiLAotCS5pZAkJICA9IC0xLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19mYl9yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfZmJfcmVzb3VyY2UsCi0JLmRldi5kbWFfbWFzawkgID0gJnMzY19kZXZpY2VfZmIuZGV2LmNvaGVyZW50X2RtYV9tYXNrLAotCS5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwsCi19OwotCi12b2lkIF9faW5pdCBzM2NfZmJfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgKnBkKQotewotCXMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhKSwKLQkJCSAmczNjX2RldmljZV9mYik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2E2NWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1oc21tYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWhzbW1jLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGhzbW1jIGRldmljZXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi0jZGVmaW5lIFMzQ19TWl9IU01NQwkoMHgxMDAwKQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19oc21tY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDX1BBX0hTTU1DMCwKLQkJLmVuZCAgID0gUzNDX1BBX0hTTU1DMCArIFMzQ19TWl9IU01NQyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfSFNNTUMwLAotCQkuZW5kICAgPSBJUlFfSFNNTUMwLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgdTY0IHMzY19kZXZpY2VfaHNtbWNfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YSA9IHsKLQkubWF4X3dpZHRoCT0gNCwKLQkuaG9zdF9jYXBzCT0gKE1NQ19DQVBfNF9CSVRfREFUQSB8Ci0JCQkgICBNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCksCi0JLmNsa190eXBlCT0gUzNDX1NESENJX0NMS19ESVZfSU5URVJOQUwsCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMwID0gewotCS5uYW1lCQk9ICJzM2Mtc2RoY2kiLAotCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaHNtbWNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHMzY19oc21tY19yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZzM2NfZGV2aWNlX2hzbW1jX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmZVTCwKLQkJLnBsYXRmb3JtX2RhdGEJCT0gJnMzY19oc21tYzBfZGVmX3BsYXRkYXRhLAotCX0sCi19OwotCi12b2lkIHMzY19zZGhjaTBfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnBkKQotewotCXN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnNldCA9ICZzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YTsKLQotCXNldC0+Y2RfdHlwZSA9IHBkLT5jZF90eXBlOwotCXNldC0+ZXh0X2NkX2luaXQgPSBwZC0+ZXh0X2NkX2luaXQ7Ci0Jc2V0LT5leHRfY2RfY2xlYW51cCA9IHBkLT5leHRfY2RfY2xlYW51cDsKLQlzZXQtPmV4dF9jZF9ncGlvID0gcGQtPmV4dF9jZF9ncGlvOwotCXNldC0+ZXh0X2NkX2dwaW9faW52ZXJ0ID0gcGQtPmV4dF9jZF9ncGlvX2ludmVydDsKLQotCWlmIChwZC0+bWF4X3dpZHRoKQotCQlzZXQtPm1heF93aWR0aCA9IHBkLT5tYXhfd2lkdGg7Ci0JaWYgKHBkLT5jZmdfZ3BpbykKLQkJc2V0LT5jZmdfZ3BpbyA9IHBkLT5jZmdfZ3BpbzsKLQlpZiAocGQtPmNmZ19jYXJkKQotCQlzZXQtPmNmZ19jYXJkID0gcGQtPmNmZ19jYXJkOwotCWlmIChwZC0+aG9zdF9jYXBzKQotCQlzZXQtPmhvc3RfY2FwcyB8PSBwZC0+aG9zdF9jYXBzOwotCWlmIChwZC0+Y2xrX3R5cGUpCi0JCXNldC0+Y2xrX3R5cGUgPSBwZC0+Y2xrX3R5cGU7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jMS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1oc21tYzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5NzMyMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWhzbW1jMS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBTM0Mgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBoc21tYyBkZXZpY2UgMQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0KLSNkZWZpbmUgUzNDX1NaX0hTTU1DCSgweDEwMDApCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2hzbW1jMV9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDX1BBX0hTTU1DMSwKLQkJLmVuZCAgID0gUzNDX1BBX0hTTU1DMSArIFMzQ19TWl9IU01NQyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfSFNNTUMxLAotCQkuZW5kICAgPSBJUlFfSFNNTUMxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgdTY0IHMzY19kZXZpY2VfaHNtbWMxX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEgPSB7Ci0JLm1heF93aWR0aAk9IDQsCi0JLmhvc3RfY2Fwcwk9IChNTUNfQ0FQXzRfQklUX0RBVEEgfAotCQkJICAgTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQpLAotCS5jbGtfdHlwZQk9IFMzQ19TREhDSV9DTEtfRElWX0lOVEVSTkFMLAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMSA9IHsKLQkubmFtZQkJPSAiczNjLXNkaGNpIiwKLQkuaWQJCT0gMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2hzbW1jMV9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX2hzbW1jMV9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZzM2NfZGV2aWNlX2hzbW1jMV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmVUwsCi0JCS5wbGF0Zm9ybV9kYXRhCQk9ICZzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YSwKLQl9LAotfTsKLQotdm9pZCBzM2Nfc2RoY2kxX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpwZCkKLXsKLQlzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpzZXQgPSAmczNjX2hzbW1jMV9kZWZfcGxhdGRhdGE7Ci0KLQlzZXQtPmNkX3R5cGUgPSBwZC0+Y2RfdHlwZTsKLQlzZXQtPmV4dF9jZF9pbml0ID0gcGQtPmV4dF9jZF9pbml0OwotCXNldC0+ZXh0X2NkX2NsZWFudXAgPSBwZC0+ZXh0X2NkX2NsZWFudXA7Ci0Jc2V0LT5leHRfY2RfZ3BpbyA9IHBkLT5leHRfY2RfZ3BpbzsKLQlzZXQtPmV4dF9jZF9ncGlvX2ludmVydCA9IHBkLT5leHRfY2RfZ3Bpb19pbnZlcnQ7Ci0KLQlpZiAocGQtPm1heF93aWR0aCkKLQkJc2V0LT5tYXhfd2lkdGggPSBwZC0+bWF4X3dpZHRoOwotCWlmIChwZC0+Y2ZnX2dwaW8pCi0JCXNldC0+Y2ZnX2dwaW8gPSBwZC0+Y2ZnX2dwaW87Ci0JaWYgKHBkLT5jZmdfY2FyZCkKLQkJc2V0LT5jZmdfY2FyZCA9IHBkLT5jZmdfY2FyZDsKLQlpZiAocGQtPmhvc3RfY2FwcykKLQkJc2V0LT5ob3N0X2NhcHMgfD0gcGQtPmhvc3RfY2FwczsKLQlpZiAocGQtPmNsa190eXBlKQotCQlzZXQtPmNsa190eXBlID0gcGQtPmNsa190eXBlOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1oc21tYzIuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHNtbWMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGFlZGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1oc21tYzIuYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2Rldi1oc21tYzIuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgTWF1cnVzIEN1ZWxlbmFlcmUKLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9wbGF0LXMzYy9kZXYtaHNtbWMxLmMKLSAqIG9yaWdpbmFsIGZpbGUgQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoKLSAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGhzbW1jIGRldmljZSAyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0KLSNkZWZpbmUgUzNDX1NaX0hTTU1DCSgweDEwMDApCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2hzbW1jMl9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDX1BBX0hTTU1DMiwKLQkJLmVuZCAgID0gUzNDX1BBX0hTTU1DMiArIFMzQ19TWl9IU01NQyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfSFNNTUMyLAotCQkuZW5kICAgPSBJUlFfSFNNTUMyLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgdTY0IHMzY19kZXZpY2VfaHNtbWMyX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEgPSB7Ci0JLm1heF93aWR0aAk9IDQsCi0JLmhvc3RfY2Fwcwk9IChNTUNfQ0FQXzRfQklUX0RBVEEgfAotCQkJICAgTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQpLAotCS5jbGtfdHlwZQk9IFMzQ19TREhDSV9DTEtfRElWX0lOVEVSTkFMLAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMiA9IHsKLQkubmFtZQkJPSAiczNjLXNkaGNpIiwKLQkuaWQJCT0gMiwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2hzbW1jMl9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX2hzbW1jMl9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZzM2NfZGV2aWNlX2hzbW1jMl9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmVUwsCi0JCS5wbGF0Zm9ybV9kYXRhCQk9ICZzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YSwKLQl9LAotfTsKLQotdm9pZCBzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpwZCkKLXsKLQlzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpzZXQgPSAmczNjX2hzbW1jMl9kZWZfcGxhdGRhdGE7Ci0KLQlzZXQtPmNkX3R5cGUgPSBwZC0+Y2RfdHlwZTsKLQlzZXQtPmV4dF9jZF9pbml0ID0gcGQtPmV4dF9jZF9pbml0OwotCXNldC0+ZXh0X2NkX2NsZWFudXAgPSBwZC0+ZXh0X2NkX2NsZWFudXA7Ci0Jc2V0LT5leHRfY2RfZ3BpbyA9IHBkLT5leHRfY2RfZ3BpbzsKLQlzZXQtPmV4dF9jZF9ncGlvX2ludmVydCA9IHBkLT5leHRfY2RfZ3Bpb19pbnZlcnQ7Ci0KLQlpZiAocGQtPm1heF93aWR0aCkKLQkJc2V0LT5tYXhfd2lkdGggPSBwZC0+bWF4X3dpZHRoOwotCWlmIChwZC0+Y2ZnX2dwaW8pCi0JCXNldC0+Y2ZnX2dwaW8gPSBwZC0+Y2ZnX2dwaW87Ci0JaWYgKHBkLT5jZmdfY2FyZCkKLQkJc2V0LT5jZmdfY2FyZCA9IHBkLT5jZmdfY2FyZDsKLQlpZiAocGQtPmhvc3RfY2FwcykKLQkJc2V0LT5ob3N0X2NhcHMgfD0gcGQtPmhvc3RfY2FwczsKLQlpZiAocGQtPmNsa190eXBlKQotCQlzZXQtPmNsa190eXBlID0gcGQtPmNsa190eXBlOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1oc21tYzMuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHNtbWMzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTc3NmYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1oc21tYzMuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHNtbWMzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jMS5jCi0gKgotICogU2Ftc3VuZyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgaHNtbWMgZGV2aWNlIDMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLQotI2RlZmluZSBTM0NfU1pfSFNNTUMJKDB4MTAwMCkKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaHNtbWMzX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTM0NfUEFfSFNNTUMzLAotCQkuZW5kCT0gUzNDX1BBX0hTTU1DMyArIFMzQ19TWl9IU01NQyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfSFNNTUMzLAotCQkuZW5kCT0gSVJRX0hTTU1DMywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfQotfTsKLQotc3RhdGljIHU2NCBzM2NfZGV2aWNlX2hzbW1jM19kbWFtYXNrID0gMHhmZmZmZmZmZlVMOwotCi1zdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHMzY19oc21tYzNfZGVmX3BsYXRkYXRhID0gewotCS5tYXhfd2lkdGgJPSA0LAotCS5ob3N0X2NhcHMJPSAoTU1DX0NBUF80X0JJVF9EQVRBIHwKLQkJCSAgIE1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEKSwKLQkuY2xrX3R5cGUJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9JTlRFUk5BTCwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzMgPSB7Ci0JLm5hbWUJCT0gInMzYy1zZGhjaSIsCi0JLmlkCQk9IDMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19oc21tYzNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHMzY19oc21tYzNfcmVzb3VyY2UsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzawkJPSAmczNjX2RldmljZV9oc21tYzNfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZlVMLAotCQkucGxhdGZvcm1fZGF0YQkJPSAmczNjX2hzbW1jM19kZWZfcGxhdGRhdGEsCi0JfSwKLX07Ci0KLXZvaWQgczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqcGQpCi17Ci0Jc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqc2V0ID0gJnMzY19oc21tYzNfZGVmX3BsYXRkYXRhOwotCi0Jc2V0LT5jZF90eXBlID0gcGQtPmNkX3R5cGU7Ci0Jc2V0LT5leHRfY2RfaW5pdCA9IHBkLT5leHRfY2RfaW5pdDsKLQlzZXQtPmV4dF9jZF9jbGVhbnVwID0gcGQtPmV4dF9jZF9jbGVhbnVwOwotCXNldC0+ZXh0X2NkX2dwaW8gPSBwZC0+ZXh0X2NkX2dwaW87Ci0Jc2V0LT5leHRfY2RfZ3Bpb19pbnZlcnQgPSBwZC0+ZXh0X2NkX2dwaW9faW52ZXJ0OwotCi0JaWYgKHBkLT5tYXhfd2lkdGgpCi0JCXNldC0+bWF4X3dpZHRoID0gcGQtPm1heF93aWR0aDsKLQlpZiAocGQtPmNmZ19ncGlvKQotCQlzZXQtPmNmZ19ncGlvID0gcGQtPmNmZ19ncGlvOwotCWlmIChwZC0+Y2ZnX2NhcmQpCi0JCXNldC0+Y2ZnX2NhcmQgPSBwZC0+Y2ZnX2NhcmQ7Ci0JaWYgKHBkLT5ob3N0X2NhcHMpCi0JCXNldC0+aG9zdF9jYXBzIHw9IHBkLT5ob3N0X2NhcHM7Ci0JaWYgKHBkLT5jbGtfdHlwZSkKLQkJc2V0LT5jbGtfdHlwZSA9IHBkLT5jbGtfdHlwZTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHdtb24uYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHdtb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYTc5Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWh3bW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWh3bW9uLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogQWRhcHRlZCBmb3IgSFdNT04gYnkgTWF1cnVzIEN1ZWxlbmFlcmUKLSAqCi0gKiBTYW1zdW5nIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgSFdNT04KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9od21vbi5oPgotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHdtb24gPSB7Ci0JLm5hbWUJCT0gInMzYy1od21vbiIsCi0JLmlkCQk9IC0xLAotCS5kZXYucGFyZW50CT0gJnMzY19kZXZpY2VfYWRjLmRldiwKLX07Ci0KLXZvaWQgX19pbml0IHMzY19od21vbl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19od21vbl9wZGF0YSAqcGQpCi17Ci0JczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2NfaHdtb25fcGRhdGEpLAotCQkJICZzM2NfZGV2aWNlX2h3bW9uKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMC5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MjUxZjUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMC5jCi0gKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgaTJjIGRldmljZSAwCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQ19QQV9JSUMsCi0JCS5lbmQgICA9IFMzQ19QQV9JSUMgKyBTWl80SyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfSUlDLAotCQkuZW5kICAgPSBJUlFfSUlDLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzAgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC1pMmMiLAotI2lmZGVmIENPTkZJR19TM0NfREVWX0kyQzEKLQkuaWQJCSAgPSAwLAotI2Vsc2UKLQkuaWQJCSAgPSAtMSwKLSNlbmRpZgotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19pMmNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX2kyY19yZXNvdXJjZSwKLX07Ci0KLXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBkZWZhdWx0X2kyY19kYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmZsYWdzCQk9IDAsCi0JLnNsYXZlX2FkZHIJPSAweDEwLAotCS5mcmVxdWVuY3kJPSAxMDAqMTAwMCwKLQkuc2RhX2RlbGF5CT0gMTAwLAotfTsKLQotdm9pZCBfX2luaXQgczNjX2kyYzBfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCi17Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7Ci0KLQlpZiAoIXBkKQotCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOwotCi0JbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCi0JCQkgICAgICAgJnMzY19kZXZpY2VfaTJjMCk7Ci0KLQlpZiAoIW5wZC0+Y2ZnX2dwaW8pCi0JCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjMF9jZmdfZ3BpbzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiN2M3YmUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMS5jCi0gKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgaTJjIGRldmljZSAxCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQ19QQV9JSUMxLAotCQkuZW5kICAgPSBTM0NfUEFfSUlDMSArIFNaXzRLIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9JSUMxLAotCQkuZW5kICAgPSBJUlFfSUlDMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMxID0gewotCS5uYW1lCQkgID0gInMzYzI0MTAtaTJjIiwKLQkuaWQJCSAgPSAxLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19pMmNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX2kyY19yZXNvdXJjZSwKLX07Ci0KLXZvaWQgX19pbml0IHMzY19pMmMxX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQotewotCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOwotCi0JaWYgKCFwZCkgewotCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOwotCQlwZC0+YnVzX251bSA9IDE7Ci0JfQotCi0JbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCi0JCQkgICAgICAgJnMzY19kZXZpY2VfaTJjMSk7Ci0KLQlpZiAoIW5wZC0+Y2ZnX2dwaW8pCi0JCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjMV9jZmdfZ3BpbzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMi5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTlmZDAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMi5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBTM0Mgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBpMmMgZGV2aWNlIDIKLSAqCi0gKiBCYXNlZCBvbiBwbGF0LXNhbXN1bmcvZGV2LWkyYzAuYwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLWlpYy5oPgotI2luY2x1ZGUgPHBsYXQvaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0NfUEFfSUlDMiwKLQkJLmVuZCAgID0gUzNDX1BBX0lJQzIgKyBTWl80SyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfSUlDMiwKLQkJLmVuZCAgID0gSVJRX0lJQzIsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMiA9IHsKLQkubmFtZQkJICA9ICJzM2MyNDEwLWkyYyIsCi0JLmlkCQkgID0gMiwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfaTJjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19pMmNfcmVzb3VyY2UsCi19OwotCi12b2lkIF9faW5pdCBzM2NfaTJjMl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKLXsKLQlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKLQotCWlmICghcGQpIHsKLQkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKLQkJcGQtPmJ1c19udW0gPSAyOwotCX0KLQotCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAotCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzIpOwotCi0JaWYgKCFucGQtPmNmZ19ncGlvKQotCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzJfY2ZnX2dwaW87Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzMuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhlZmE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFM1UCBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGkyYyBkZXZpY2UgMwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDX1BBX0lJQzMsCi0JCS5lbmQJPSBTM0NfUEFfSUlDMyArIFNaXzRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9JSUMzLAotCQkuZW5kCT0gSVJRX0lJQzMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMyA9IHsKLQkubmFtZQkJPSAiczNjMjQ0MC1pMmMiLAotCS5pZAkJPSAzLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaTJjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfaTJjX3Jlc291cmNlLAotfTsKLQotdm9pZCBfX2luaXQgczNjX2kyYzNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCi17Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7Ci0KLQlpZiAoIXBkKSB7Ci0JCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7Ci0JCXBkLT5idXNfbnVtID0gMzsKLQl9Ci0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKLQkJCSAgICAgICAmczNjX2RldmljZV9pMmMzKTsKLQotCWlmICghbnBkLT5jZmdfZ3BpbykKLQkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmMzX2NmZ19ncGlvOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM0LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlMjY0NC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzQuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBTNVAgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBpMmMgZGV2aWNlIDMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFMzQ19QQV9JSUM0LAotCQkuZW5kCT0gUzNDX1BBX0lJQzQgKyBTWl80SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfSUlDNCwKLQkJLmVuZAk9IElSUV9JSUM0LAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzQgPSB7Ci0JLm5hbWUJCT0gInMzYzI0NDAtaTJjIiwKLQkuaWQJCT0gNCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2kyY19yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX2kyY19yZXNvdXJjZSwKLX07Ci0KLXZvaWQgX19pbml0IHMzY19pMmM0X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQotewotCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOwotCi0JaWYgKCFwZCkgewotCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOwotCQlwZC0+YnVzX251bSA9IDQ7Ci0JfQotCi0JbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCi0JCQkgICAgICAgJnMzY19kZXZpY2VfaTJjNCk7Ci0KLQlpZiAoIW5wZC0+Y2ZnX2dwaW8pCi0JCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjNF9jZmdfZ3BpbzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OTY1NTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzMuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogUzVQIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgaTJjIGRldmljZSAzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLWlpYy5oPgotI2luY2x1ZGUgPHBsYXQvaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTM0NfUEFfSUlDNSwKLQkJLmVuZAk9IFMzQ19QQV9JSUM1ICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0lJQzUsCi0JCS5lbmQJPSBJUlFfSUlDNSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM1ID0gewotCS5uYW1lCQk9ICJzM2MyNDQwLWkyYyIsCi0JLmlkCQk9IDUsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHMzY19pMmNfcmVzb3VyY2UsCi19OwotCi12b2lkIF9faW5pdCBzM2NfaTJjNV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKLXsKLQlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKLQotCWlmICghcGQpIHsKLQkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKLQkJcGQtPmJ1c19udW0gPSA1OwotCX0KLQotCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAotCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzUpOwotCi0JaWYgKCFucGQtPmNmZ19ncGlvKQotCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzVfY2ZnX2dwaW87Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzYuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDFkNzk5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM2LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFM1UCBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGkyYyBkZXZpY2UgNgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDX1BBX0lJQzYsCi0JCS5lbmQJPSBTM0NfUEFfSUlDNiArIFNaXzRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9JSUM2LAotCQkuZW5kCT0gSVJRX0lJQzYsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjNiA9IHsKLQkubmFtZQkJPSAiczNjMjQ0MC1pMmMiLAotCS5pZAkJPSA2LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaTJjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfaTJjX3Jlc291cmNlLAotfTsKLQotdm9pZCBfX2luaXQgczNjX2kyYzZfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCi17Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7Ci0KLQlpZiAoIXBkKSB7Ci0JCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7Ci0JCXBkLT5idXNfbnVtID0gNjsKLQl9Ci0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKLQkJCSAgICAgICAmczNjX2RldmljZV9pMmM2KTsKLQotCWlmICghbnBkLT5jZmdfZ3BpbykKLQkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmM2X2NmZ19ncGlvOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM3LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkZGNkMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzcuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNy5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBTNVAgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBpMmMgZGV2aWNlIDcKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFMzQ19QQV9JSUM3LAotCQkuZW5kCT0gUzNDX1BBX0lJQzcgKyBTWl80SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfSUlDNywKLQkJLmVuZAk9IElSUV9JSUM3LAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzcgPSB7Ci0JLm5hbWUJCT0gInMzYzI0NDAtaTJjIiwKLQkuaWQJCT0gNywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2kyY19yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX2kyY19yZXNvdXJjZSwKLX07Ci0KLXZvaWQgX19pbml0IHMzY19pMmM3X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQotewotCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOwotCi0JaWYgKCFwZCkgewotCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOwotCQlwZC0+YnVzX251bSA9IDc7Ci0JfQotCi0JbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCi0JCQkgICAgICAgJnMzY19kZXZpY2VfaTJjNyk7Ci0KLQlpZiAoIW5wZC0+Y2ZnX2dwaW8pCi0JCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjN19jZmdfZ3BpbzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaWRlLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWlkZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDk3OTgyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaWRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWlkZS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIFNhbXN1bmcgQ0YtQVRBIGRldmljZSBkZWZpbml0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPHBsYXQvYXRhLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2NmY29uX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTQU1TVU5HX1BBX0NGQ09OLAotCQkuZW5kCT0gU0FNU1VOR19QQV9DRkNPTiArIFNaXzE2SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfQ0ZDT04sCi0JCS5lbmQJPSBJUlFfQ0ZDT04sCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfY2Zjb24gPSB7Ci0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19jZmNvbl9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX2NmY29uX3Jlc291cmNlLAotfTsKLQotdm9pZCBzM2NfaWRlX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX2lkZV9wbGF0ZGF0YSAqcGRhdGEpCi17Ci0JczNjX3NldF9wbGF0ZGF0YShwZGF0YSwgc2l6ZW9mKHN0cnVjdCBzM2NfaWRlX3BsYXRkYXRhKSwKLQkJCSAmczNjX2RldmljZV9jZmNvbik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWtleXBhZC5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1rZXlwYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3YzJkNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWtleXBhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYta2V5cGFkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKLSAqIEF1dGhvcjogSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQva2V5cGFkLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2Ftc3VuZ19rZXlwYWRfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTQU1TVU5HX1BBX0tFWVBBRCwKLQkJLmVuZAk9IFNBTVNVTkdfUEFfS0VZUEFEICsgMHgyMCAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfS0VZUEFELAotCQkuZW5kCT0gSVJRX0tFWVBBRCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19kZXZpY2Vfa2V5cGFkID0gewotCS5uYW1lCQk9ICJzYW1zdW5nLWtleXBhZCIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzYW1zdW5nX2tleXBhZF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHNhbXN1bmdfa2V5cGFkX3Jlc291cmNlcywKLX07Ci0KLXZvaWQgX19pbml0IHNhbXN1bmdfa2V5cGFkX3NldF9wbGF0ZGF0YShzdHJ1Y3Qgc2Ftc3VuZ19rZXlwYWRfcGxhdGRhdGEgKnBkKQotewotCXN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSAqbnBkOwotCi0JbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSksCi0JCQkmc2Ftc3VuZ19kZXZpY2Vfa2V5cGFkKTsKLQotCWlmICghbnBkLT5jZmdfZ3BpbykKLQkJbnBkLT5jZmdfZ3BpbyA9IHNhbXN1bmdfa2V5cGFkX2NmZ19ncGlvOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1uYW5kLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW5hbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlMzBlYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW5hbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgbmFuZCBkZXZpY2UKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19uYW5kX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0NfUEFfTkFORCwKLQkJLmVuZCAgID0gUzNDX1BBX05BTkQgKyBTWl8xTSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfQotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX25hbmQgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC1uYW5kIiwKLQkuaWQJCSAgPSAtMSwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfbmFuZF9yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfbmFuZF9yZXNvdXJjZSwKLX07Ci0KLUVYUE9SVF9TWU1CT0woczNjX2RldmljZV9uYW5kKTsKLQotLyoqCi0gKiBzM2NfbmFuZF9jb3B5X3NldCgpIC0gY29weSBuYW5kIHNldCBkYXRhCi0gKiBAc2V0OiBUaGUgbmV3IHN0cnVjdHVyZSwgZGlyZWN0bHkgY29waWVkIGZyb20gdGhlIG9sZC4KLSAqCi0gKiBDb3B5IGFsbCB0aGUgZmllbGRzIGZyb20gdGhlIE5BTkQgc2V0IGZpZWxkIGZyb20gd2hhdCBpcyBwcm9iYWJseSBfX2luaXRkYXRhCi0gKiB0byBuZXcga2VybmVsIG1lbW9yeS4gVGhlIGNvZGUgcmV0dXJucyAwIGlmIHRoZSBjb3B5IGhhcHBlbmVkIGNvcnJlY3RseSBvcgotICogYW4gZXJyb3IgY29kZSBmb3IgdGhlIGNhbGxpbmcgZnVuY3Rpb24gdG8gZGlzcGxheS4KLSAqCi0gKiBOb3RlLCB3ZSBjdXJyZW50bHkgZG8gbm90IHRyeSBhbmQgbG9vayB0byBzZWUgaWYgd2UndmUgYWxyZWFkeSBjb3BpZWQgdGhlCi0gKiBkYXRhIGluIGEgcHJldmlvdXMgc2V0LgotICovCi1zdGF0aWMgaW50IF9faW5pdCBzM2NfbmFuZF9jb3B5X3NldChzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCAqc2V0KQotewotCXZvaWQgKnB0cjsKLQlpbnQgc2l6ZTsKLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IG10ZF9wYXJ0aXRpb24pICogc2V0LT5ucl9wYXJ0aXRpb25zOwotCWlmIChzaXplKSB7Ci0JCXB0ciA9IGttZW1kdXAoc2V0LT5wYXJ0aXRpb25zLCBzaXplLCBHRlBfS0VSTkVMKTsKLQkJc2V0LT5wYXJ0aXRpb25zID0gcHRyOwotCi0JCWlmICghcHRyKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCQotCWlmIChzZXQtPm5yX21hcCAmJiBzZXQtPm5yX2NoaXBzKSB7Ci0JCXNpemUgPSBzaXplb2YoaW50KSAqIHNldC0+bnJfY2hpcHM7Ci0JCXB0ciA9IGttZW1kdXAoc2V0LT5ucl9tYXAsIHNpemUsIEdGUF9LRVJORUwpOwotCQlzZXQtPm5yX21hcCA9IHB0cjsKLQotCQlpZiAoIXB0cikKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmIChzZXQtPmVjY19sYXlvdXQpIHsKLQkJcHRyID0ga21lbWR1cChzZXQtPmVjY19sYXlvdXQsCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IG5hbmRfZWNjbGF5b3V0KSwgR0ZQX0tFUk5FTCk7Ci0JCXNldC0+ZWNjX2xheW91dCA9IHB0cjsKLQotCQlpZiAoIXB0cikKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQkKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBfX2luaXQgczNjX25hbmRfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX25hbmQgKm5hbmQpCi17Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1fbmFuZCAqbnBkOwotCWludCBzaXplOwotCWludCByZXQ7Ci0KLQkvKiBub3RlLCBpZiB3ZSBnZXQgYSBmYWlsdXJlIGluIGFsbG9jYXRpb24sIHdlIHNpbXBseSBkcm9wIG91dCBvZiB0aGUKLQkgKiBmdW5jdGlvbi4gSWYgdGhlcmUgaXMgc28gbGl0dGxlIG1lbW9yeSBhdmFpbGFibGUgYXQgaW5pdGlhbGlzYXRpb24KLQkgKiB0aW1lIHRoZW4gdGhlcmUgaXMgbGl0dGxlIGNoYW5jZSB0aGUgc3lzdGVtIGlzIGdvaW5nIHRvIHJ1bi4KLQkgKi8gCi0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKG5hbmQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9uYW5kKSwKLQkJCQkmczNjX2RldmljZV9uYW5kKTsKLQlpZiAoIW5wZCkKLQkJcmV0dXJuOwotCi0JLyogbm93IHNlZSBpZiB3ZSBuZWVkIHRvIGNvcHkgYW55IG9mIHRoZSBuYW5kIHNldCBkYXRhICovCi0KLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX25hbmRfc2V0KSAqIG5wZC0+bnJfc2V0czsKLQlpZiAoc2l6ZSkgewotCQlzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCAqZnJvbSA9IG5wZC0+c2V0czsKLQkJc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQgKnRvOwotCQlpbnQgaTsKLQotCQl0byA9IGttZW1kdXAoZnJvbSwgc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCW5wZC0+c2V0cyA9IHRvOwkvKiBzZXQsIGV2ZW4gaWYgd2UgZmFpbGVkICovCi0KLQkJaWYgKCF0bykgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBzZXRzXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvciAoaSA9IDA7IGkgPCBucGQtPm5yX3NldHM7IGkrKykgewotCQkJcmV0ID0gczNjX25hbmRfY29weV9zZXQodG8pOwotCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBjb3B5IHNldCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgaSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdG8rKzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtb25lbmFuZC5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1vbmVuYW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGFlNzEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1vbmVuYW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1vbmVuYW5kLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcwotICogIEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+Ci0gKgotICogUzNDNjRYWC9TNVBDMTAwIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgT25lTkFORCBkZXZpY2VzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19vbmVuYW5kX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDX1BBX09ORU5BTkQsCi0JCS5lbmQJPSBTM0NfUEFfT05FTkFORCArIDB4NDAwIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IFMzQ19QQV9PTkVOQU5EX0JVRiwKLQkJLmVuZAk9IFMzQ19QQV9PTkVOQU5EX0JVRiArIFMzQ19TWl9PTkVOQU5EX0JVRiAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQJPSBJUlFfT05FTkFORCwKLQkJLmVuZAk9IElSUV9PTkVOQU5ELAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX29uZW5hbmQgPSB7Ci0JLm5hbWUJCT0gInNhbXN1bmctb25lbmFuZCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19vbmVuYW5kX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gczNjX29uZW5hbmRfcmVzb3VyY2VzLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtcHdtLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXB3bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI0N2IwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtcHdtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXB3bS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBCZW4gRG9va3MKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4sIDxiZW4tbGludXhAZmx1ZmYub3JnPgotICoKLSAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIHRoZSBQV00gdGltZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0KLSNkZWZpbmUgVElNRVJfUkVTT1VSQ0VfU0laRSAoMSkKLQotI2RlZmluZSBUSU1FUl9SRVNPVVJDRShfdG1yLCBfaXJxKQkJCVwKLQkoc3RydWN0IHJlc291cmNlIFtUSU1FUl9SRVNPVVJDRV9TSVpFXSkgewlcCi0JCVswXSA9IHsJCQkJCVwKLQkJCS5zdGFydAk9IF9pcnEsCQkJXAotCQkJLmVuZAk9IF9pcnEsCQkJXAotCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEJXAotCQl9CQkJCQlcCi0JfQotCi0jZGVmaW5lIERFRklORV9TM0NfVElNRVIoX3Rtcl9ubywgX2lycSkJCQlcCi0JLm5hbWUJCT0gInMzYzI0eHgtcHdtIiwJCVwKLQkuaWQJCT0gX3Rtcl9ubywJCQlcCi0JLm51bV9yZXNvdXJjZXMJPSBUSU1FUl9SRVNPVVJDRV9TSVpFLAkJXAotCS5yZXNvdXJjZQk9IFRJTUVSX1JFU09VUkNFKF90bXJfbm8sIF9pcnEpLAlcCi0KLS8qCi0gKiBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgYW4gc3RhdGljIG1hcHBpbmcgZm9yIHRoZSB0aW1lciwKLSAqIHdlIGRvIG5vdCBib3RoZXIgc2V0dGluZyBhbnkgSU8gcmVzb3VyY2UgZm9yIHRoZSBiYXNlLgotICovCi0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV90aW1lcltdID0gewotCVswXSA9IHsgREVGSU5FX1MzQ19USU1FUigwLCBJUlFfVElNRVIwKSB9LAotCVsxXSA9IHsgREVGSU5FX1MzQ19USU1FUigxLCBJUlFfVElNRVIxKSB9LAotCVsyXSA9IHsgREVGSU5FX1MzQ19USU1FUigyLCBJUlFfVElNRVIyKSB9LAotCVszXSA9IHsgREVGSU5FX1MzQ19USU1FUigzLCBJUlFfVElNRVIzKSB9LAotCVs0XSA9IHsgREVGSU5FX1MzQ19USU1FUig0LCBJUlFfVElNRVI0KSB9LAotfTsKLUVYUE9SVF9TWU1CT0woczNjX2RldmljZV90aW1lcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXJ0Yy5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1ydGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0ZTIyNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXJ0Yy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1ydGMuYwotICoKLSAqIENvcHlyaWdodCAyMDA5IGJ5IE1hdXJ1cyBDdWVsZW5hZXJlIDxtY3VlbGVuYWVyZUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3J0Y19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDX1BBX1JUQywKLQkJLmVuZAk9IFMzQ19QQV9SVEMgKyAweGZmLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1JUQ19BTEFSTSwKLQkJLmVuZAk9IElSUV9SVENfQUxBUk0sCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQJPSBJUlFfUlRDX1RJQywKLQkJLmVuZAk9IElSUV9SVENfVElDLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUQotCX0KLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9ydGMgPSB7Ci0JLm5hbWUJCT0gInMzYzY0eHgtcnRjIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19ydGNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHMzY19ydGNfcmVzb3VyY2UsCi19OwotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3J0Yyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXRzLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTQzZjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi10cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi10cy5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4sIDxiZW4tbGludXhAZmx1ZmYub3JnPgotICoKLSAqIEFkYXB0ZWQgYnkgTWF1cnVzIEN1ZWxlbmFlcmUgZm9yIHMzYzY0eHgKLSAqCi0gKiBTM0M2NFhYIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgdG91Y2hzY3JlZW4gZGV2aWNlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L3RzLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3RzX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTQU1TVU5HX1BBX0FEQywKLQkJLmVuZCAgID0gU0FNU1VOR19QQV9BREMgKyBTWl8yNTYgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1RDLAotCQkuZW5kICAgPSBJUlFfVEMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdHMgPSB7Ci0JLm5hbWUJCT0gInMzYzY0eHgtdHMiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX3RzX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfdHNfcmVzb3VyY2UsCi19OwotCi12b2lkIF9faW5pdCBzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gKnBkKQotewotCXMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8pLAotCQkJICZzM2NfZGV2aWNlX3RzKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtdXNiLWhzb3RnLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXVzYi1oc290Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E4NDRhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtdXNiLWhzb3RnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtdXNiLWhzb3RnLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgVVNCIGhpZ2gtc3BlZWQgVURDL090RyBibG9jawotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdXNiX2hzb3RnX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDX1BBX1VTQl9IU09URywKLQkJLmVuZAk9IFMzQ19QQV9VU0JfSFNPVEcgKyAweDEwMDAwIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9PVEcsCi0JCS5lbmQJPSBJUlFfT1RHLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHU2NCBzM2NfaHNvdGdfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2JfaHNvdGcgPSB7Ci0JLm5hbWUJCT0gInMzYy1oc290ZyIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfdXNiX2hzb3RnX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gczNjX3VzYl9oc290Z19yZXNvdXJjZXMsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzawkJPSAmczNjX2hzb3RnX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXVzYi5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi11c2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmYmFhOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXVzYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LXVzYi5jCi0gKgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIFVTQiBob3N0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L3VzYi1jb250cm9sLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3VzYl9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDX1BBX1VTQkhPU1QsCi0JCS5lbmQgICA9IFMzQ19QQV9VU0JIT1NUICsgMHgxMDAgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1VTQkgsCi0JCS5lbmQgICA9IElSUV9VU0JILAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgdTY0IHMzY19kZXZpY2VfdXNiX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9vaGNpID0gewotCS5uYW1lCQkgID0gInMzYzI0MTAtb2hjaSIsCi0JLmlkCQkgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3VzYl9yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfdXNiX3Jlc291cmNlLAotCS5kZXYgICAgICAgICAgICAgID0gewotCQkuZG1hX21hc2sgPSAmczNjX2RldmljZV91c2JfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCi0JfQotfTsKLQotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX29oY2kpOwotCi0vKioKLSAqIHMzY19vaGNpX3NldF9wbGF0ZGF0YSAtIGluaXRpYWxpc2UgT0hDSSBkZXZpY2UgcGxhdGZvcm0gZGF0YQotICogQGluZm86IFRoZSBwbGF0Zm9ybSBkYXRhLgotICoKLSAqIFRoaXMgY2FsbCBjb3BpZXMgdGhlIEBpbmZvIHBhc3NlZCBpbiBhbmQgc2V0cyB0aGUgZGV2aWNlIC5wbGF0Zm9ybV9kYXRhCi0gKiBmaWVsZCB0byB0aGF0IGNvcHkuIFRoZSBAaW5mbyBpcyBjb3BpZWQgc28gdGhhdCB0aGUgb3JpZ2luYWwgY2FuIGJlIG1hcmtlZAotICogX19pbml0ZGF0YS4KLSAqLwotdm9pZCBfX2luaXQgczNjX29oY2lfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX2hjZF9pbmZvICppbmZvKQotewotCXMzY19zZXRfcGxhdGRhdGEoaW5mbywgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX2hjZF9pbmZvKSwKLQkJCSAmczNjX2RldmljZV9vaGNpKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtd2R0LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXdkdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTliNWI4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtd2R0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXdkdC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIHRoZSB3YXRjaGRvZyB0aW1lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3dkdF9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDX1BBX1dEVCwKLQkJLmVuZAk9IFMzQ19QQV9XRFQgKyBTWl8xSywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9XRFQsCi0JCS5lbmQJPSBJUlFfV0RULAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfd2R0ID0gewotCS5uYW1lCQk9ICJzM2MyNDEwLXdkdCIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2Nfd2R0X3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2Nfd2R0X3Jlc291cmNlLAotfTsKLUVYUE9SVF9TWU1CT0woczNjX2RldmljZV93ZHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RldnMuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhOGI1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2cy5jCkBAIC0wLDAgKzEsMTQ2MyBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RldnMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBCYXNlIFNBTVNVTkcgcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL29uZW5hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3BtdS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvYWRjLmg+CisjaW5jbHVkZSA8cGxhdC9hdGEuaD4KKyNpbmNsdWRlIDxwbGF0L2VoY2kuaD4KKyNpbmNsdWRlIDxwbGF0L2ZiLmg+CisjaW5jbHVkZSA8cGxhdC9mYi1zM2MyNDEwLmg+CisjaW5jbHVkZSA8cGxhdC9od21vbi5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CisjaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KKyNpbmNsdWRlIDxwbGF0L21jaS5oPgorI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgorI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KKyNpbmNsdWRlIDxwbGF0L3RzLmg+CisjaW5jbHVkZSA8cGxhdC91ZGMuaD4KKyNpbmNsdWRlIDxwbGF0L3VzYi1jb250cm9sLmg+CisjaW5jbHVkZSA8cGxhdC91c2ItcGh5Lmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWlpYy5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc3BpLmg+CisKK3N0YXRpYyB1NjQgc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCisvKiBBQzk3ICovCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19hYzk3X3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDMjQ0MF9QQV9BQzk3LCBTM0MyNDQwX1NaX0FDOTcpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9TM0MyNDRYX0FDOTcpLAorCVsyXSA9IERFRklORV9SRVNfRE1BX05BTUVEKERNQUNIX1BDTV9PVVQsICJQQ00gb3V0IiksCisJWzNdID0gREVGSU5FX1JFU19ETUFfTkFNRUQoRE1BQ0hfUENNX0lOLCAiUENNIGluIiksCisJWzRdID0gREVGSU5FX1JFU19ETUFfTkFNRUQoRE1BQ0hfTUlDX0lOLCAiTWljIGluIiksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfYWM5NyA9IHsKKwkubmFtZQkJPSAic2Ftc3VuZy1hYzk3IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19hYzk3X3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfYWM5N19yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworI2VuZGlmIC8qIENPTkZJR19DUFVfUzNDMjQ0MCAqLworCisvKiBBREMgKi8KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2FkY19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQzI0WFhfUEFfQURDLCBTM0MyNFhYX1NaX0FEQyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1RDKSwKKwlbMl0gPSBERUZJTkVfUkVTX0lSUShJUlFfQURDKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9hZGMgPSB7CisJLm5hbWUJCT0gInMzYzI0eHgtYWRjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19hZGNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19hZGNfcmVzb3VyY2UsCit9OworI2VuZGlmIC8qIENPTkZJR19QTEFUX1MzQzI0WFggKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NBTVNVTkdfREVWX0FEQykKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2FkY19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFNBTVNVTkdfUEFfQURDLCBTWl8yNTYpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9UQyksCisJWzJdID0gREVGSU5FX1JFU19JUlEoSVJRX0FEQyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfYWRjID0geworCS5uYW1lCQk9ICJzYW1zdW5nLWFkYyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfYWRjX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfYWRjX3Jlc291cmNlLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfU0FNU1VOR19ERVZfQURDICovCisKKy8qIENhbWlmIENvbnRyb2xsZXIgKi8KKworI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfY2FtaWZfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0MyNDQwX1BBX0NBTUlGLCBTM0MyNDQwX1NaX0NBTUlGKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfQ0FNKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9jYW1pZiA9IHsKKwkubmFtZQkJPSAiczNjMjQ0MC1jYW1pZiIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfY2FtaWZfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19jYW1pZl9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworI2VuZGlmIC8qIENPTkZJR19DUFVfUzNDMjQ0MCAqLworCisvKiBBU09DIERNQSAqLworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhbXN1bmdfYXNvY19kbWEgPSB7CisJLm5hbWUJCT0gInNhbXN1bmctYXVkaW8iLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhbXN1bmdfYXNvY19pZG1hID0geworCS5uYW1lCQk9ICJzYW1zdW5nLWlkbWEiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworCisvKiBGQiAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfRkIKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2ZiX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX0ZCLCBTWl8xNkspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9MQ0RfVlNZTkMpLAorCVsyXSA9IERFRklORV9SRVNfSVJRKElSUV9MQ0RfRklGTyksCisJWzNdID0gREVGSU5FX1JFU19JUlEoSVJRX0xDRF9TWVNURU0pLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2ZiID0geworCS5uYW1lCQk9ICJzM2MtZmIiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2ZiX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfZmJfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisKK3ZvaWQgX19pbml0IHMzY19mYl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19mYl9wbGF0ZGF0YSAqcGQpCit7CisJczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEpLAorCQkJICZzM2NfZGV2aWNlX2ZiKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9GQiAqLworCisvKiBGSU1DICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9GSU1DMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfZmltYzBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTNVBfUEFfRklNQzAsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfRklNQzApLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWMwID0geworCS5uYW1lCQk9ICJzNXAtZmltYyIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9maW1jMF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX2ZpbWMwX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltY19tZCA9IHsKKwkubmFtZQk9ICJzNXAtZmltYy1tZCIsCisJLmlkCT0gLTEsCit9OworI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX0ZJTUMwICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9GSU1DMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfZmltYzFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTNVBfUEFfRklNQzEsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfRklNQzEpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWMxID0geworCS5uYW1lCQk9ICJzNXAtZmltYyIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9maW1jMV9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX2ZpbWMxX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX0ZJTUMxICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9GSU1DMgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfZmltYzJfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTNVBfUEFfRklNQzIsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfRklNQzIpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWMyID0geworCS5uYW1lCQk9ICJzNXAtZmltYyIsCisJLmlkCQk9IDIsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9maW1jMl9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX2ZpbWMyX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX0ZJTUMyICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9GSU1DMworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfZmltYzNfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTNVBfUEFfRklNQzMsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfRklNQzMpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWMzID0geworCS5uYW1lCQk9ICJzNXAtZmltYyIsCisJLmlkCQk9IDMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9maW1jM19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX2ZpbWMzX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX0ZJTUMzICovCisKKy8qIEZJTUQwICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9GSU1EMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfZmltZDBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTNVBfUEFfRklNRDAsIFNaXzMySyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0ZJTUQwX1ZTWU5DKSwKKwlbMl0gPSBERUZJTkVfUkVTX0lSUShJUlFfRklNRDBfRklGTyksCisJWzNdID0gREVGSU5FX1JFU19JUlEoSVJRX0ZJTUQwX1NZU1RFTSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltZDAgPSB7CisJLm5hbWUJCT0gInM1cC1mYiIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9maW1kMF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX2ZpbWQwX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworCit2b2lkIF9faW5pdCBzNXBfZmltZDBfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgKnBkKQoreworCXMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhKSwKKwkJCSAmczVwX2RldmljZV9maW1kMCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1M1UF9ERVZfRklNRDAgKi8KKworLyogSFdNT04gKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0hXTU9OCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHdtb24gPSB7CisJLm5hbWUJCT0gInMzYy1od21vbiIsCisJLmlkCQk9IC0xLAorCS5kZXYucGFyZW50CT0gJnMzY19kZXZpY2VfYWRjLmRldiwKK307CisKK3ZvaWQgX19pbml0IHMzY19od21vbl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19od21vbl9wZGF0YSAqcGQpCit7CisJczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2NfaHdtb25fcGRhdGEpLAorCQkJICZzM2NfZGV2aWNlX2h3bW9uKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9IV01PTiAqLworCisvKiBIU01NQyAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2hzbW1jX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX0hTTU1DMCwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9IU01NQzApLAorfTsKKworc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YSA9IHsKKwkubWF4X3dpZHRoCT0gNCwKKwkuaG9zdF9jYXBzCT0gKE1NQ19DQVBfNF9CSVRfREFUQSB8CisJCQkgICBNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCksCisJLmNsa190eXBlCT0gUzNDX1NESENJX0NMS19ESVZfSU5URVJOQUwsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMwID0geworCS5uYW1lCQk9ICJzM2Mtc2RoY2kiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaHNtbWNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19oc21tY19yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnMzY19oc21tYzBfZGVmX3BsYXRkYXRhLAorCX0sCit9OworCit2b2lkIHMzY19zZGhjaTBfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnBkKQoreworCXMzY19zZGhjaV9zZXRfcGxhdGRhdGEocGQsICZzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfSFNNTUMgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaHNtbWMxX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX0hTTU1DMSwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9IU01NQzEpLAorfTsKKworc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YSA9IHsKKwkubWF4X3dpZHRoCT0gNCwKKwkuaG9zdF9jYXBzCT0gKE1NQ19DQVBfNF9CSVRfREFUQSB8CisJCQkgICBNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCksCisJLmNsa190eXBlCT0gUzNDX1NESENJX0NMS19ESVZfSU5URVJOQUwsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMxID0geworCS5uYW1lCQk9ICJzM2Mtc2RoY2kiLAorCS5pZAkJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaHNtbWMxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaHNtbWMxX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEsCisJfSwKK307CisKK3ZvaWQgczNjX3NkaGNpMV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqcGQpCit7CisJczNjX3NkaGNpX3NldF9wbGF0ZGF0YShwZCwgJnMzY19oc21tYzFfZGVmX3BsYXRkYXRhKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9IU01NQzEgKi8KKworLyogSFNNTUMyICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzIKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2hzbW1jMl9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9IU01NQzIsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfSFNNTUMyKSwKK307CisKK3N0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEgPSB7CisJLm1heF93aWR0aAk9IDQsCisJLmhvc3RfY2Fwcwk9IChNTUNfQ0FQXzRfQklUX0RBVEEgfAorCQkJICAgTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQpLAorCS5jbGtfdHlwZQk9IFMzQ19TREhDSV9DTEtfRElWX0lOVEVSTkFMLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMiA9IHsKKwkubmFtZQkJPSAiczNjLXNkaGNpIiwKKwkuaWQJCT0gMiwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2hzbW1jMl9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2hzbW1jMl9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnMzY19oc21tYzJfZGVmX3BsYXRkYXRhLAorCX0sCit9OworCit2b2lkIHMzY19zZGhjaTJfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnBkKQoreworCXMzY19zZGhjaV9zZXRfcGxhdGRhdGEocGQsICZzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfSFNNTUMyICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2hzbW1jM19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9IU01NQzMsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfSFNNTUMzKSwKK307CisKK3N0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgczNjX2hzbW1jM19kZWZfcGxhdGRhdGEgPSB7CisJLm1heF93aWR0aAk9IDQsCisJLmhvc3RfY2Fwcwk9IChNTUNfQ0FQXzRfQklUX0RBVEEgfAorCQkJICAgTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQpLAorCS5jbGtfdHlwZQk9IFMzQ19TREhDSV9DTEtfRElWX0lOVEVSTkFMLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMyA9IHsKKwkubmFtZQkJPSAiczNjLXNkaGNpIiwKKwkuaWQJCT0gMywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2hzbW1jM19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2hzbW1jM19yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnMzY19oc21tYzNfZGVmX3BsYXRkYXRhLAorCX0sCit9OworCit2b2lkIHMzY19zZGhjaTNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnBkKQoreworCXMzY19zZGhjaV9zZXRfcGxhdGRhdGEocGQsICZzM2NfaHNtbWMzX2RlZl9wbGF0ZGF0YSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfSFNNTUMzICovCisKKy8qIEkyQyAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmMwX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX0lJQywgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9JSUMpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzAgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtaTJjIiwKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9JMkMxCisJLmlkCQk9IDAsCisjZWxzZQorCS5pZAkJPSAtMSwKKyNlbmRpZgorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaTJjMF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2kyYzBfcmVzb3VyY2UsCit9OworCitzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgZGVmYXVsdF9pMmNfZGF0YSBfX2luaXRkYXRhID0geworCS5mbGFncwkJPSAwLAorCS5zbGF2ZV9hZGRyCT0gMHgxMCwKKwkuZnJlcXVlbmN5CT0gMTAwKjEwMDAsCisJLnNkYV9kZWxheQk9IDEwMCwKK307CisKK3ZvaWQgX19pbml0IHMzY19pMmMwX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOworCisJaWYgKCFwZCkKKwkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKKworCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAorCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzApOworCisJaWYgKCFucGQtPmNmZ19ncGlvKQorCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzBfY2ZnX2dwaW87Cit9CisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9JMkMxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmMxX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX0lJQzEsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfSUlDMSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMSA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1pMmMiLAorCS5pZAkJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaTJjMV9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2kyYzFfcmVzb3VyY2UsCit9OworCit2b2lkIF9faW5pdCBzM2NfaTJjMV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKK3sKKwlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKKworCWlmICghcGQpIHsKKwkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKKwkJcGQtPmJ1c19udW0gPSAxOworCX0KKworCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAorCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzEpOworCisJaWYgKCFucGQtPmNmZ19ncGlvKQorCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzFfY2ZnX2dwaW87Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfSTJDMSAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfSTJDMgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjMl9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9JSUMyLCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0lJQzIpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzIgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtaTJjIiwKKwkuaWQJCT0gMiwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2kyYzJfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19pMmMyX3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgczNjX2kyYzJfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCit7CisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7CisKKwlpZiAoIXBkKSB7CisJCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7CisJCXBkLT5idXNfbnVtID0gMjsKKwl9CisKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKKwkJCSAgICAgICAmczNjX2RldmljZV9pMmMyKTsKKworCWlmICghbnBkLT5jZmdfZ3BpbykKKwkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmMyX2NmZ19ncGlvOworfQorI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX0kyQzIgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0kyQzMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyYzNfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfSUlDMywgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9JSUMzKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMzID0geworCS5uYW1lCQk9ICJzM2MyNDQwLWkyYyIsCisJLmlkCQk9IDMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmMzX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaTJjM19yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IHMzY19pMmMzX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOworCisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCQlwZC0+YnVzX251bSA9IDM7CisJfQorCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnMzY19kZXZpY2VfaTJjMyk7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjM19jZmdfZ3BpbzsKK30KKyNlbmRpZiAvKkNPTkZJR19TM0NfREVWX0kyQzMgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0kyQzQKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyYzRfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfSUlDNCwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9JSUM0KSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM0ID0geworCS5uYW1lCQk9ICJzM2MyNDQwLWkyYyIsCisJLmlkCQk9IDQsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmM0X3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaTJjNF9yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IHMzY19pMmM0X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOworCisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCQlwZC0+YnVzX251bSA9IDQ7CisJfQorCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnMzY19kZXZpY2VfaTJjNCk7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjNF9jZmdfZ3BpbzsKK30KKyNlbmRpZiAvKkNPTkZJR19TM0NfREVWX0kyQzQgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0kyQzUKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyYzVfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfSUlDNSwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9JSUM1KSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM1ID0geworCS5uYW1lCQk9ICJzM2MyNDQwLWkyYyIsCisJLmlkCQk9IDUsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmM1X3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaTJjNV9yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IHMzY19pMmM1X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOworCisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCQlwZC0+YnVzX251bSA9IDU7CisJfQorCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnMzY19kZXZpY2VfaTJjNSk7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjNV9jZmdfZ3BpbzsKK30KKyNlbmRpZiAvKkNPTkZJR19TM0NfREVWX0kyQzUgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0kyQzYKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyYzZfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfSUlDNiwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9JSUM2KSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM2ID0geworCS5uYW1lCQk9ICJzM2MyNDQwLWkyYyIsCisJLmlkCQk9IDYsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmM2X3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaTJjNl9yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IHMzY19pMmM2X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOworCisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCQlwZC0+YnVzX251bSA9IDY7CisJfQorCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnMzY19kZXZpY2VfaTJjNik7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjNl9jZmdfZ3BpbzsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9JMkM2ICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9JMkM3CitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmM3X3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX0lJQzcsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfSUlDNyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjNyA9IHsKKwkubmFtZQkJPSAiczNjMjQ0MC1pMmMiLAorCS5pZAkJPSA3LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaTJjN19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2kyYzdfcmVzb3VyY2UsCit9OworCit2b2lkIF9faW5pdCBzM2NfaTJjN19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKK3sKKwlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKKworCWlmICghcGQpIHsKKwkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKKwkJcGQtPmJ1c19udW0gPSA3OworCX0KKworCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAorCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzcpOworCisJaWYgKCFucGQtPmNmZ19ncGlvKQorCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzdfY2ZnX2dwaW87Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfSTJDNyAqLworCisvKiBJMkMgSERNSVBIWSAqLworCisjaWZkZWYgQ09ORklHX1M1UF9ERVZfSTJDX0hETUlQSFkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX2kyY19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9JSUNfSERNSVBIWSwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9JSUNfSERNSVBIWSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfaTJjX2hkbWlwaHkgPSB7CisJLm5hbWUJCT0gInMzYzI0NDAtaGRtaXBoeS1pMmMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2kyY19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX2kyY19yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IHM1cF9pMmNfaGRtaXBoeV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKK3sKKwlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKKworCWlmICghcGQpIHsKKwkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKKworCQlpZiAoc29jX2lzX2V4eW5vczQyMTAoKSkKKwkJCXBkLT5idXNfbnVtID0gODsKKwkJZWxzZSBpZiAoc29jX2lzX3M1cHYyMTAoKSkKKwkJCXBkLT5idXNfbnVtID0gMzsKKwkJZWxzZQorCQkJcGQtPmJ1c19udW0gPSAwOworCX0KKworCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAorCQkJICAgICAgICZzNXBfZGV2aWNlX2kyY19oZG1pcGh5KTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzVQX0RFVl9JMkNfSERNSVBIWSAqLworCisvKiBJMlMgKi8KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2lpc19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQzI0WFhfUEFfSUlTLCBTM0MyNFhYX1NaX0lJUyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaWlzID0geworCS5uYW1lCQk9ICJzM2MyNHh4LWlpcyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaWlzX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaWlzX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisjZW5kaWYgLyogQ09ORklHX1BMQVRfUzNDMjRYWCAqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzI0MTJfZGV2aWNlX2lpcyA9IHsKKwkubmFtZQkJPSAiczNjMjQxMi1paXMiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworI2VuZGlmIC8qIENPTkZJR19DUFVfUzNDMjQ0MCAqLworCisvKiBJREUgQ0ZDT04gKi8KKworI2lmZGVmIENPTkZJR19TQU1TVU5HX0RFVl9JREUKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2NmY29uX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oU0FNU1VOR19QQV9DRkNPTiwgU1pfMTZLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfQ0ZDT04pLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2NmY29uID0geworCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfY2Zjb25fcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19jZmNvbl9yZXNvdXJjZSwKK307CisKK3ZvaWQgczNjX2lkZV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19pZGVfcGxhdGRhdGEgKnBkYXRhKQoreworCXMzY19zZXRfcGxhdGRhdGEocGRhdGEsIHNpemVvZihzdHJ1Y3QgczNjX2lkZV9wbGF0ZGF0YSksCisJCQkgJnMzY19kZXZpY2VfY2Zjb24pOworfQorI2VuZGlmIC8qIENPTkZJR19TQU1TVU5HX0RFVl9JREUgKi8KKworLyogS0VZUEFEICovCisKKyNpZmRlZiBDT05GSUdfU0FNU1VOR19ERVZfS0VZUEFECitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNhbXN1bmdfa2V5cGFkX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFNBTVNVTkdfUEFfS0VZUEFELCBTWl8zMiksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0tFWVBBRCksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhbXN1bmdfZGV2aWNlX2tleXBhZCA9IHsKKwkubmFtZQkJPSAic2Ftc3VuZy1rZXlwYWQiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2Ftc3VuZ19rZXlwYWRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzYW1zdW5nX2tleXBhZF9yZXNvdXJjZXMsCit9OworCit2b2lkIF9faW5pdCBzYW1zdW5nX2tleXBhZF9zZXRfcGxhdGRhdGEoc3RydWN0IHNhbXN1bmdfa2V5cGFkX3BsYXRkYXRhICpwZCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19rZXlwYWRfcGxhdGRhdGEgKm5wZDsKKworCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3Qgc2Ftc3VuZ19rZXlwYWRfcGxhdGRhdGEpLAorCQkJJnNhbXN1bmdfZGV2aWNlX2tleXBhZCk7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJCW5wZC0+Y2ZnX2dwaW8gPSBzYW1zdW5nX2tleXBhZF9jZmdfZ3BpbzsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0FNU1VOR19ERVZfS0VZUEFEICovCisKKy8qIExDRCBDb250cm9sbGVyICovCisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19sY2RfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0MyNFhYX1BBX0xDRCwgUzNDMjRYWF9TWl9MQ0QpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9MQ0QpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2xjZCA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1sY2QiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2xjZF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2xjZF9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworCit2b2lkIF9faW5pdCBzM2MyNHh4X2ZiX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyAqcGQpCit7CisJc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gKm5wZDsKKworCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZigqbnBkKSwgJnMzY19kZXZpY2VfbGNkKTsKKwlpZiAobnBkKSB7CisJCW5wZC0+ZGlzcGxheXMgPSBrbWVtZHVwKHBkLT5kaXNwbGF5cywKKwkJCXNpemVvZihzdHJ1Y3QgczNjMjQxMGZiX2Rpc3BsYXkpICogbnBkLT5udW1fZGlzcGxheXMsCisJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFucGQtPmRpc3BsYXlzKQorCQkJcHJpbnRrKEtFUk5fRVJSICJubyBtZW1vcnkgZm9yIExDRCBkaXNwbGF5IGRhdGFcbiIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAibm8gbWVtb3J5IGZvciBMQ0QgcGxhdGZvcm0gZGF0YVxuIik7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19QTEFUX1MzQzI0WFggKi8KKworLyogTUZDICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9NRkMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX21mY19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9NRkMsIFNaXzY0SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX01GQyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWZjID0geworCS5uYW1lCQk9ICJzNXAtbWZjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9tZmNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHM1cF9tZmNfcmVzb3VyY2UsCit9OworCisvKgorICogTUZDIGhhcmR3YXJlIGhhcyAyIG1lbW9yeSBpbnRlcmZhY2VzIHdoaWNoIGFyZSBtb2RlbGxlZCBhcyB0d28gc2VwYXJhdGUKKyAqIHBsYXRmb3JtIGRldmljZXMgdG8gbGV0IGRtYS1tYXBwaW5nIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlbS4KKyAqCisgKiBNRkMgcGFyZW50IGRldmljZSAoczVwX2RldmljZV9tZmMpIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgbWVtb3J5CisgKiBpbnRlcmZhY2Ugc3BlY2lmaWMgZGV2aWNlcyAoczVwX2RldmljZV9tZmNfbCBhbmQgczVwX2RldmljZV9tZmNfcikuCisgKi8KKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21mY19sID0geworCS5uYW1lCQk9ICJzNXAtbWZjLWwiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBhcmVudAkJCT0gJnM1cF9kZXZpY2VfbWZjLmRldiwKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21mY19yID0geworCS5uYW1lCQk9ICJzNXAtbWZjLXIiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBhcmVudAkJCT0gJnM1cF9kZXZpY2VfbWZjLmRldiwKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUzVQX0RFVl9NRkMgKi8KKworLyogTUlQSSBDU0lTICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9DU0lTMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfbWlwaV9jc2lzMF9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9NSVBJX0NTSVMwLCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX01JUElfQ1NJUzApLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21pcGlfY3NpczAgPSB7CisJLm5hbWUJCT0gInM1cC1taXBpLWNzaXMiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfbWlwaV9jc2lzMF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX21pcGlfY3NpczBfcmVzb3VyY2UsCit9OworI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX0NTSVMwICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9DU0lTMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfbWlwaV9jc2lzMV9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9NSVBJX0NTSVMxLCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX01JUElfQ1NJUzEpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21pcGlfY3NpczEgPSB7CisJLm5hbWUJCT0gInM1cC1taXBpLWNzaXMiLAorCS5pZAkJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfbWlwaV9jc2lzMV9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX21pcGlfY3NpczFfcmVzb3VyY2UsCit9OworI2VuZGlmCisKKy8qIE5BTkQgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX05BTkQKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX25hbmRfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfTkFORCwgU1pfMU0pLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX25hbmQgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtbmFuZCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfbmFuZF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX25hbmRfcmVzb3VyY2UsCit9OworCisvKgorICogczNjX25hbmRfY29weV9zZXQoKSAtIGNvcHkgbmFuZCBzZXQgZGF0YQorICogQHNldDogVGhlIG5ldyBzdHJ1Y3R1cmUsIGRpcmVjdGx5IGNvcGllZCBmcm9tIHRoZSBvbGQuCisgKgorICogQ29weSBhbGwgdGhlIGZpZWxkcyBmcm9tIHRoZSBOQU5EIHNldCBmaWVsZCBmcm9tIHdoYXQgaXMgcHJvYmFibHkgX19pbml0ZGF0YQorICogdG8gbmV3IGtlcm5lbCBtZW1vcnkuIFRoZSBjb2RlIHJldHVybnMgMCBpZiB0aGUgY29weSBoYXBwZW5lZCBjb3JyZWN0bHkgb3IKKyAqIGFuIGVycm9yIGNvZGUgZm9yIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHRvIGRpc3BsYXkuCisgKgorICogTm90ZSwgd2UgY3VycmVudGx5IGRvIG5vdCB0cnkgYW5kIGxvb2sgdG8gc2VlIGlmIHdlJ3ZlIGFscmVhZHkgY29waWVkIHRoZQorICogZGF0YSBpbiBhIHByZXZpb3VzIHNldC4KKyAqLworc3RhdGljIGludCBfX2luaXQgczNjX25hbmRfY29weV9zZXQoc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQgKnNldCkKK3sKKwl2b2lkICpwdHI7CisJaW50IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBtdGRfcGFydGl0aW9uKSAqIHNldC0+bnJfcGFydGl0aW9uczsKKwlpZiAoc2l6ZSkgeworCQlwdHIgPSBrbWVtZHVwKHNldC0+cGFydGl0aW9ucywgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCXNldC0+cGFydGl0aW9ucyA9IHB0cjsKKworCQlpZiAoIXB0cikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChzZXQtPm5yX21hcCAmJiBzZXQtPm5yX2NoaXBzKSB7CisJCXNpemUgPSBzaXplb2YoaW50KSAqIHNldC0+bnJfY2hpcHM7CisJCXB0ciA9IGttZW1kdXAoc2V0LT5ucl9tYXAsIHNpemUsIEdGUF9LRVJORUwpOworCQlzZXQtPm5yX21hcCA9IHB0cjsKKworCQlpZiAoIXB0cikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChzZXQtPmVjY19sYXlvdXQpIHsKKwkJcHRyID0ga21lbWR1cChzZXQtPmVjY19sYXlvdXQsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IG5hbmRfZWNjbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisJCXNldC0+ZWNjX2xheW91dCA9IHB0cjsKKworCQlpZiAoIXB0cikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCBzM2NfbmFuZF9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1fbmFuZCAqbmFuZCkKK3sKKwlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9uYW5kICpucGQ7CisJaW50IHNpemU7CisJaW50IHJldDsKKworCS8qIG5vdGUsIGlmIHdlIGdldCBhIGZhaWx1cmUgaW4gYWxsb2NhdGlvbiwgd2Ugc2ltcGx5IGRyb3Agb3V0IG9mIHRoZQorCSAqIGZ1bmN0aW9uLiBJZiB0aGVyZSBpcyBzbyBsaXR0bGUgbWVtb3J5IGF2YWlsYWJsZSBhdCBpbml0aWFsaXNhdGlvbgorCSAqIHRpbWUgdGhlbiB0aGVyZSBpcyBsaXR0bGUgY2hhbmNlIHRoZSBzeXN0ZW0gaXMgZ29pbmcgdG8gcnVuLgorCSAqLworCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShuYW5kLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1fbmFuZCksCisJCQkJJnMzY19kZXZpY2VfbmFuZCk7CisJaWYgKCFucGQpCisJCXJldHVybjsKKworCS8qIG5vdyBzZWUgaWYgd2UgbmVlZCB0byBjb3B5IGFueSBvZiB0aGUgbmFuZCBzZXQgZGF0YSAqLworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCkgKiBucGQtPm5yX3NldHM7CisJaWYgKHNpemUpIHsKKwkJc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQgKmZyb20gPSBucGQtPnNldHM7CisJCXN0cnVjdCBzM2MyNDEwX25hbmRfc2V0ICp0bzsKKwkJaW50IGk7CisKKwkJdG8gPSBrbWVtZHVwKGZyb20sIHNpemUsIEdGUF9LRVJORUwpOworCQlucGQtPnNldHMgPSB0bzsJLyogc2V0LCBldmVuIGlmIHdlIGZhaWxlZCAqLworCisJCWlmICghdG8pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3Igc2V0c1xuIiwgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG5wZC0+bnJfc2V0czsgaSsrKSB7CisJCQlyZXQgPSBzM2NfbmFuZF9jb3B5X3NldCh0byk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGNvcHkgc2V0ICVkXG4iLAorCQkJCV9fZnVuY19fLCBpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0bysrOworCQl9CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX05BTkQgKi8KKworLyogT05FTkFORCAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfT05FTkFORAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2Nfb25lbmFuZF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfT05FTkFORCwgU1pfMUspLAorCVsxXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9PTkVOQU5EX0JVRiwgUzNDX1NaX09ORU5BTkRfQlVGKSwKKwlbMl0gPSBERUZJTkVfUkVTX0lSUShJUlFfT05FTkFORCksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfb25lbmFuZCA9IHsKKwkubmFtZQkJPSAic2Ftc3VuZy1vbmVuYW5kIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX29uZW5hbmRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzM2Nfb25lbmFuZF9yZXNvdXJjZXMsCit9OworI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX09ORU5BTkQgKi8KKworI2lmZGVmIENPTkZJR19TM0M2NFhYX0RFVl9PTkVOQU5EMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2M2NHh4X29uZW5hbmQxX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQzY0WFhfUEFfT05FTkFORDEsIFNaXzFLKSwKKwlbMV0gPSBERUZJTkVfUkVTX01FTShTM0M2NFhYX1BBX09ORU5BTkQxX0JVRiwgUzNDNjRYWF9TWl9PTkVOQU5EMV9CVUYpLAorCVsyXSA9IERFRklORV9SRVNfSVJRKElSUV9PTkVOQU5EMSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX29uZW5hbmQxID0geworCS5uYW1lCQk9ICJzYW1zdW5nLW9uZW5hbmQiLAorCS5pZAkJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2M2NHh4X29uZW5hbmQxX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gczNjNjR4eF9vbmVuYW5kMV9yZXNvdXJjZXMsCit9OworCit2b2lkIHMzYzY0eHhfb25lbmFuZDFfc2V0X3BsYXRkYXRhKHN0cnVjdCBvbmVuYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCXMzY19zZXRfcGxhdGRhdGEocGRhdGEsIHNpemVvZihzdHJ1Y3Qgb25lbmFuZF9wbGF0Zm9ybV9kYXRhKSwKKwkJCSAmczNjNjR4eF9kZXZpY2Vfb25lbmFuZDEpOworfQorI2VuZGlmIC8qIENPTkZJR19TM0M2NFhYX0RFVl9PTkVOQU5EMSAqLworCisjaWZkZWYgQ09ORklHX1M1UF9ERVZfT05FTkFORAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfb25lbmFuZF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTNVBfUEFfT05FTkFORCwgU1pfMTI4SyksCisJWzFdID0gREVGSU5FX1JFU19NRU0oUzVQX1BBX09ORU5BTkRfRE1BLCBTWl84SyksCisJWzJdID0gREVGSU5FX1JFU19JUlEoSVJRX09ORU5BTkRfQVVESSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2Vfb25lbmFuZCA9IHsKKwkubmFtZQkJPSAiczVwYzExMC1vbmVuYW5kIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9vbmVuYW5kX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gczVwX29uZW5hbmRfcmVzb3VyY2VzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUzVQX0RFVl9PTkVOQU5EICovCisKKy8qIFBNVSAqLworCisjaWZkZWYgQ09ORklHX1BMQVRfUzVQCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9wbXVfcmVzb3VyY2VbXSA9IHsKKwlERUZJTkVfUkVTX0lSUShJUlFfUE1VKQorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX3BtdSA9IHsKKwkubmFtZQkJPSAiYXJtLXBtdSIsCisJLmlkCQk9IEFSTV9QTVVfREVWSUNFX0NQVSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX3BtdV9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX3BtdV9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHM1cF9wbXVfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmczVwX2RldmljZV9wbXUpOworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChzNXBfcG11X2luaXQpOworI2VuZGlmIC8qIENPTkZJR19QTEFUX1M1UCAqLworCisvKiBQV00gVGltZXIgKi8KKworI2lmZGVmIENPTkZJR19TQU1TVU5HX0RFVl9QV00KKworI2RlZmluZSBUSU1FUl9SRVNPVVJDRV9TSVpFICgxKQorCisjZGVmaW5lIFRJTUVSX1JFU09VUkNFKF90bXIsIF9pcnEpCQkJXAorCShzdHJ1Y3QgcmVzb3VyY2UgW1RJTUVSX1JFU09VUkNFX1NJWkVdKSB7CVwKKwkJWzBdID0gewkJCQkJXAorCQkJLnN0YXJ0CT0gX2lycSwJCQlcCisJCQkuZW5kCT0gX2lycSwJCQlcCisJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUQlcCisJCX0JCQkJCVwKKwl9CisKKyNkZWZpbmUgREVGSU5FX1MzQ19USU1FUihfdG1yX25vLCBfaXJxKQkJCVwKKwkubmFtZQkJPSAiczNjMjR4eC1wd20iLAkJXAorCS5pZAkJPSBfdG1yX25vLAkJCVwKKwkubnVtX3Jlc291cmNlcwk9IFRJTUVSX1JFU09VUkNFX1NJWkUsCQlcCisJLnJlc291cmNlCT0gVElNRVJfUkVTT1VSQ0UoX3Rtcl9ubywgX2lycSksCVwKKworLyoKKyAqIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSBhbiBzdGF0aWMgbWFwcGluZyBmb3IgdGhlIHRpbWVyLAorICogd2UgZG8gbm90IGJvdGhlciBzZXR0aW5nIGFueSBJTyByZXNvdXJjZSBmb3IgdGhlIGJhc2UuCisgKi8KKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RpbWVyW10gPSB7CisJWzBdID0geyBERUZJTkVfUzNDX1RJTUVSKDAsIElSUV9USU1FUjApIH0sCisJWzFdID0geyBERUZJTkVfUzNDX1RJTUVSKDEsIElSUV9USU1FUjEpIH0sCisJWzJdID0geyBERUZJTkVfUzNDX1RJTUVSKDIsIElSUV9USU1FUjIpIH0sCisJWzNdID0geyBERUZJTkVfUzNDX1RJTUVSKDMsIElSUV9USU1FUjMpIH0sCisJWzRdID0geyBERUZJTkVfUzNDX1RJTUVSKDQsIElSUV9USU1FUjQpIH0sCit9OworI2VuZGlmIC8qIENPTkZJR19TQU1TVU5HX0RFVl9QV00gKi8KKworLyogUlRDICovCisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19ydGNfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0MyNFhYX1BBX1JUQywgU1pfMjU2KSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfUlRDKSwKKwlbMl0gPSBERUZJTkVfUkVTX0lSUShJUlFfVElDSyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfcnRjID0geworCS5uYW1lCQk9ICJzM2MyNDEwLXJ0YyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfcnRjX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfcnRjX3Jlc291cmNlLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUExBVF9TM0MyNFhYICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9SVEMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3J0Y19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9SVEMsIFNaXzI1NiksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1JUQ19BTEFSTSksCisJWzJdID0gREVGSU5FX1JFU19JUlEoSVJRX1JUQ19USUMpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3J0YyA9IHsKKwkubmFtZQkJPSAiczNjNjR4eC1ydGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX3J0Y19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX3J0Y19yZXNvdXJjZSwKK307CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfUlRDICovCisKKy8qIFNESSAqLworCisjaWZkZWYgQ09ORklHX1BMQVRfUzNDMjRYWAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2Nfc2RpX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDMjRYWF9QQV9TREksIFMzQzI0WFhfU1pfU0RJKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfU0RJKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9zZGkgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtc2RpIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19zZGlfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19zZGlfcmVzb3VyY2UsCit9OworCit2b2lkIF9faW5pdCBzM2MyNHh4X21jaV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhICpwZGF0YSkKK3sKKwlzM2Nfc2V0X3BsYXRkYXRhKHBkYXRhLCBzaXplb2Yoc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhKSwKKwkJCSAmczNjX2RldmljZV9zZGkpOworfQorI2VuZGlmIC8qIENPTkZJR19QTEFUX1MzQzI0WFggKi8KKworLyogU1BJICovCisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19zcGkwX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDMjRYWF9QQV9TUEksIFNaXzMyKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfU1BJMCksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc3BpMCA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1zcGkiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2Nfc3BpMF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX3NwaTBfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2Nfc3BpMV9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQzI0WFhfUEFfU1BJMSwgU1pfMzIpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9TUEkxKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9zcGkxID0geworCS5uYW1lCQk9ICJzM2MyNDEwLXNwaSIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19zcGkxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2Nfc3BpMV9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworI2VuZGlmIC8qIENPTkZJR19QTEFUX1MzQzI0WFggKi8KKworLyogVG91Y2hzY3JlZW4gKi8KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3RzX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDMjRYWF9QQV9BREMsIFMzQzI0WFhfU1pfQURDKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfVEMpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RzID0geworCS5uYW1lCQk9ICJzM2MyNDEwLXRzIiwKKwkuaWQJCT0gLTEsCisJLmRldi5wYXJlbnQJPSAmczNjX2RldmljZV9hZGMuZGV2LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfdHNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY190c19yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IHMzYzI0eHhfdHNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyAqaGFyZF9zM2MyNDEwdHNfaW5mbykKK3sKKwlzM2Nfc2V0X3BsYXRkYXRhKGhhcmRfczNjMjQxMHRzX2luZm8sCisJCQkgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyksICZzM2NfZGV2aWNlX3RzKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUExBVF9TM0MyNFhYICovCisKKyNpZmRlZiBDT05GSUdfU0FNU1VOR19ERVZfVFMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3RzX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oU0FNU1VOR19QQV9BREMsIFNaXzI1NiksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1RDKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gZGVmYXVsdF90c19kYXRhIF9faW5pdGRhdGEgPSB7CisJLmRlbGF5CQkJPSAxMDAwMCwKKwkucHJlc2MJCQk9IDQ5LAorCS5vdmVyc2FtcGxpbmdfc2hpZnQJPSAyLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RzID0geworCS5uYW1lCQk9ICJzM2M2NHh4LXRzIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY190c19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX3RzX3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgczNjMjR4eF90c19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvICpwZCkKK3sKKwlpZiAoIXBkKQorCQlwZCA9ICZkZWZhdWx0X3RzX2RhdGE7CisKKwlzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvKSwKKwkJCSAmczNjX2RldmljZV90cyk7Cit9CisjZW5kaWYgLyogQ09ORklHX1NBTVNVTkdfREVWX1RTICovCisKKy8qIFRWICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9UVgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9oZG1pX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9IRE1JLCBTWl8xTSksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0hETUkpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2hkbWkgPSB7CisJLm5hbWUJCT0gInM1cC1oZG1pIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9oZG1pX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gczVwX2hkbWlfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfc2RvX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9TRE8sIFNaXzY0SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1NETyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2Vfc2RvID0geworCS5uYW1lCQk9ICJzNXAtc2RvIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9zZG9fcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzNXBfc2RvX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX21peGVyX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTUVNX05BTUVEKFM1UF9QQV9NSVhFUiwgU1pfNjRLLCAibXhyIiksCisJWzFdID0gREVGSU5FX1JFU19NRU1fTkFNRUQoUzVQX1BBX1ZQLCBTWl82NEssICJ2cCIpLAorCVsyXSA9IERFRklORV9SRVNfSVJRX05BTUVEKElSUV9NSVhFUiwgImlycSIpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21peGVyID0geworCS5uYW1lCQk9ICJzNXAtbWl4ZXIiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX21peGVyX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gczVwX21peGVyX3Jlc291cmNlcywKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX1RWICovCisKKy8qIFVTQiAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfVVNCX0hPU1QKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3VzYl9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9VU0JIT1NULCBTWl8yNTYpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9VU0JIKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9vaGNpID0geworCS5uYW1lCQk9ICJzM2MyNDEwLW9oY2kiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX3VzYl9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX3VzYl9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworCisvKgorICogczNjX29oY2lfc2V0X3BsYXRkYXRhIC0gaW5pdGlhbGlzZSBPSENJIGRldmljZSBwbGF0Zm9ybSBkYXRhCisgKiBAaW5mbzogVGhlIHBsYXRmb3JtIGRhdGEuCisgKgorICogVGhpcyBjYWxsIGNvcGllcyB0aGUgQGluZm8gcGFzc2VkIGluIGFuZCBzZXRzIHRoZSBkZXZpY2UgLnBsYXRmb3JtX2RhdGEKKyAqIGZpZWxkIHRvIHRoYXQgY29weS4gVGhlIEBpbmZvIGlzIGNvcGllZCBzbyB0aGF0IHRoZSBvcmlnaW5hbCBjYW4gYmUgbWFya2VkCisgKiBfX2luaXRkYXRhLgorICovCisKK3ZvaWQgX19pbml0IHMzY19vaGNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9oY2RfaW5mbyAqaW5mbykKK3sKKwlzM2Nfc2V0X3BsYXRkYXRhKGluZm8sIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9oY2RfaW5mbyksCisJCQkgJnMzY19kZXZpY2Vfb2hjaSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfVVNCX0hPU1QgKi8KKworLyogVVNCIERldmljZSAoR2FkZ2V0KSAqLworCisjaWZkZWYgQ09ORklHX1BMQVRfUzNDMjRYWAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdXNiZ2FkZ2V0X3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDMjRYWF9QQV9VU0JERVYsIFMzQzI0WFhfU1pfVVNCREVWKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfVVNCRCksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdXNiZ2FkZ2V0ID0geworCS5uYW1lCQk9ICJzM2MyNDEwLXVzYmdhZGdldCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfdXNiZ2FkZ2V0X3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfdXNiZ2FkZ2V0X3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgczNjMjR4eF91ZGNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3VkY19tYWNoX2luZm8gKnBkKQoreworCXMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZigqcGQpLCAmczNjX2RldmljZV91c2JnYWRnZXQpOworfQorI2VuZGlmIC8qIENPTkZJR19QTEFUX1MzQzI0WFggKi8KKworLyogVVNCIEVIQ0kgSG9zdCBDb250cm9sbGVyICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9VU0JfRUhDSQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfZWhjaV9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9FSENJLCBTWl8yNTYpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9VU0JfSE9TVCksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZWhjaSA9IHsKKwkubmFtZQkJPSAiczVwLWVoY2kiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2VoY2lfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHM1cF9laGNpX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisKK3ZvaWQgX19pbml0IHM1cF9laGNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgKnBkKQoreworCXN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSAqbnBkOworCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSksCisJCQkmczVwX2RldmljZV9laGNpKTsKKworCWlmICghbnBkLT5waHlfaW5pdCkKKwkJbnBkLT5waHlfaW5pdCA9IHM1cF91c2JfcGh5X2luaXQ7CisJaWYgKCFucGQtPnBoeV9leGl0KQorCQlucGQtPnBoeV9leGl0ID0gczVwX3VzYl9waHlfZXhpdDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzVQX0RFVl9VU0JfRUhDSSAqLworCisvKiBVU0IgSFNPVEcgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX1VTQl9IU09URworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdXNiX2hzb3RnX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9VU0JfSFNPVEcsIFNaXzE2SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX09URyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdXNiX2hzb3RnID0geworCS5uYW1lCQk9ICJzM2MtaHNvdGciLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX3VzYl9oc290Z19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHMzY191c2JfaHNvdGdfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX1VTQl9IU09URyAqLworCisvKiBVU0IgSGlnaCBTcHBlZCAyLjAgRGV2aWNlIChHYWRnZXQpICovCisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19oc3VkY19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQzI0MTZfUEFfSFNVREMsIFMzQzI0MTZfU1pfSFNVREMpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9VU0JEKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2JfaHN1ZGMgPSB7CisJLm5hbWUJCT0gInMzYy1oc3VkYyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaHN1ZGNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19oc3VkY19yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgczNjMjR4eF9oc3VkY19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0eHhfaHN1ZGNfcGxhdGRhdGEgKnBkKQoreworCXMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZigqcGQpLCAmczNjX2RldmljZV91c2JfaHN1ZGMpOworfQorI2VuZGlmIC8qIENPTkZJR19QTEFUX1MzQzI0WFggKi8KKworLyogV0RUICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9XRFQKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3dkdF9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9XRFQsIFNaXzFLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfV0RUKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV93ZHQgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtd2R0IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY193ZHRfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY193ZHRfcmVzb3VyY2UsCit9OworI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX1dEVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RtYS1vcHMuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kbWEtb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhOTk0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kbWEtb3BzLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kbWEtb3BzLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogU2Ftc3VuZyBETUEgT3BlcmF0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDMzMC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorCitzdGF0aWMgaW5saW5lIGJvb2wgcGwzMzBfZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGRtYV9wbDMzMF9wZXJpICpwZXJpID0gY2hhbi0+cHJpdmF0ZTsKKwlyZXR1cm4gcGVyaS0+cGVyaV9pZCA9PSAodW5zaWduZWQpcGFyYW07Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzYW1zdW5nX2RtYWRldl9yZXF1ZXN0KGVudW0gZG1hX2NoIGRtYV9jaCwKKwkJCQlzdHJ1Y3Qgc2Ftc3VuZ19kbWFfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisJZG1hX2NhcF9tYXNrX3QgbWFzazsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBzbGF2ZV9jb25maWc7CisKKwlkbWFfY2FwX3plcm8obWFzayk7CisJZG1hX2NhcF9zZXQoaW5mby0+Y2FwLCBtYXNrKTsKKworCWNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIHBsMzMwX2ZpbHRlciwgKHZvaWQgKilkbWFfY2gpOworCisJaWYgKGluZm8tPmRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJbWVtc2V0KCZzbGF2ZV9jb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZykpOworCQlzbGF2ZV9jb25maWcuZGlyZWN0aW9uID0gaW5mby0+ZGlyZWN0aW9uOworCQlzbGF2ZV9jb25maWcuc3JjX2FkZHIgPSBpbmZvLT5maWZvOworCQlzbGF2ZV9jb25maWcuc3JjX2FkZHJfd2lkdGggPSBpbmZvLT53aWR0aDsKKwkJc2xhdmVfY29uZmlnLnNyY19tYXhidXJzdCA9IDE7CisJCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcoY2hhbiwgJnNsYXZlX2NvbmZpZyk7CisJfSBlbHNlIGlmIChpbmZvLT5kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgeworCQltZW1zZXQoJnNsYXZlX2NvbmZpZywgMCwgc2l6ZW9mKHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnKSk7CisJCXNsYXZlX2NvbmZpZy5kaXJlY3Rpb24gPSBpbmZvLT5kaXJlY3Rpb247CisJCXNsYXZlX2NvbmZpZy5kc3RfYWRkciA9IGluZm8tPmZpZm87CisJCXNsYXZlX2NvbmZpZy5kc3RfYWRkcl93aWR0aCA9IGluZm8tPndpZHRoOworCQlzbGF2ZV9jb25maWcuZHN0X21heGJ1cnN0ID0gMTsKKwkJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhjaGFuLCAmc2xhdmVfY29uZmlnKTsKKwl9CisKKwlyZXR1cm4gKHVuc2lnbmVkKWNoYW47Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19kbWFkZXZfcmVsZWFzZSh1bnNpZ25lZCBjaCwKKwkJCXN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKK3sKKwlkbWFfcmVsZWFzZV9jaGFubmVsKChzdHJ1Y3QgZG1hX2NoYW4gKiljaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYW1zdW5nX2RtYWRldl9wcmVwYXJlKHVuc2lnbmVkIGNoLAorCQkJc3RydWN0IHNhbXN1bmdfZG1hX3ByZXBfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gKHN0cnVjdCBkbWFfY2hhbiAqKWNoOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKKworCXN3aXRjaCAoaW5mby0+Y2FwKSB7CisJY2FzZSBETUFfU0xBVkU6CisJCXNnX2luaXRfdGFibGUoJnNnLCAxKTsKKwkJc2dfZG1hX2xlbigmc2cpID0gaW5mby0+bGVuOworCQlzZ19zZXRfcGFnZSgmc2csIHBmbl90b19wYWdlKFBGTl9ET1dOKGluZm8tPmJ1ZikpLAorCQkJICAgIGluZm8tPmxlbiwgb2Zmc2V0X2luX3BhZ2UoaW5mby0+YnVmKSk7CisJCXNnX2RtYV9hZGRyZXNzKCZzZykgPSBpbmZvLT5idWY7CisKKwkJZGVzYyA9IGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbiwKKwkJCSZzZywgMSwgaW5mby0+ZGlyZWN0aW9uLCBETUFfUFJFUF9JTlRFUlJVUFQpOworCQlicmVhazsKKwljYXNlIERNQV9DWUNMSUM6CisJCWRlc2MgPSBjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX2RtYV9jeWNsaWMoY2hhbiwKKwkJCWluZm8tPmJ1ZiwgaW5mby0+bGVuLCBpbmZvLT5wZXJpb2QsIGluZm8tPmRpcmVjdGlvbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmNoYW4tPmRldi0+ZGV2aWNlLCAidW5zdXBwb3J0ZWQgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCFkZXNjKSB7CisJCWRldl9lcnIoJmNoYW4tPmRldi0+ZGV2aWNlLCAiY2Fubm90IHByZXBhcmUgY3ljbGljIGRtYVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRlc2MtPmNhbGxiYWNrID0gaW5mby0+ZnA7CisJZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBpbmZvLT5mcF9wYXJhbTsKKworCWRtYWVuZ2luZV9zdWJtaXQoKHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqKWRlc2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNhbXN1bmdfZG1hZGV2X3RyaWdnZXIodW5zaWduZWQgY2gpCit7CisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoKHN0cnVjdCBkbWFfY2hhbiAqKWNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzYW1zdW5nX2RtYWRldl9mbHVzaCh1bnNpZ25lZCBjaCkKK3sKKwlyZXR1cm4gZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoKHN0cnVjdCBkbWFfY2hhbiAqKWNoKTsKK30KKworc3RydWN0IHNhbXN1bmdfZG1hX29wcyBkbWFkZXZfb3BzID0geworCS5yZXF1ZXN0CT0gc2Ftc3VuZ19kbWFkZXZfcmVxdWVzdCwKKwkucmVsZWFzZQk9IHNhbXN1bmdfZG1hZGV2X3JlbGVhc2UsCisJLnByZXBhcmUJPSBzYW1zdW5nX2RtYWRldl9wcmVwYXJlLAorCS50cmlnZ2VyCT0gc2Ftc3VuZ19kbWFkZXZfdHJpZ2dlciwKKwkuc3RhcnRlZAk9IE5VTEwsCisJLmZsdXNoCQk9IHNhbXN1bmdfZG1hZGV2X2ZsdXNoLAorCS5zdG9wCQk9IHNhbXN1bmdfZG1hZGV2X2ZsdXNoLAorfTsKKwordm9pZCAqc2Ftc3VuZ19kbWFkZXZfZ2V0X29wcyh2b2lkKQoreworCXJldHVybiAmZG1hZGV2X29wczsKK30KK0VYUE9SVF9TWU1CT0woc2Ftc3VuZ19kbWFkZXZfZ2V0X29wcyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZ3Bpby1jb25maWcuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9ncGlvLWNvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzBiMDQwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9ncGlvLWNvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2dwaW8tY29uZmlnLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgotICogQ29weXJpZ2h0IDIwMDgtMjAxMCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDIHNlcmllcyBHUElPIGNvbmZpZ3VyYXRpb24gY29yZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaD4KLQotaW50IHMzY19ncGlvX2NmZ3Bpbih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgY29uZmlnKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gczNjX2dwaW9saWJfZ2V0Y2hpcChwaW4pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG9mZnNldDsKLQlpbnQgcmV0OwotCi0JaWYgKCFjaGlwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9mZnNldCA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKLQotCXMzY19ncGlvX2xvY2soY2hpcCwgZmxhZ3MpOwotCXJldCA9IHMzY19ncGlvX2RvX3NldGNmZyhjaGlwLCBvZmZzZXQsIGNvbmZpZyk7Ci0JczNjX2dwaW9fdW5sb2NrKGNoaXAsIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHMzY19ncGlvX2NmZ3Bpbik7Ci0KLWludCBzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UodW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgbnIsCi0JCQkgIHVuc2lnbmVkIGludCBjZmcpCi17Ci0JaW50IHJldDsKLQotCWZvciAoOyBuciA+IDA7IG5yLS0sIHN0YXJ0KyspIHsKLQkJcmV0ID0gczNjX2dwaW9fY2ZncGluKHN0YXJ0LCBjZmcpOwotCQlpZiAocmV0ICE9IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoczNjX2dwaW9fY2ZncGluX3JhbmdlKTsKLQotaW50IHMzY19ncGlvX2NmZ2FsbF9yYW5nZSh1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBuciwKLQkJCSAgdW5zaWduZWQgaW50IGNmZywgczNjX2dwaW9fcHVsbF90IHB1bGwpCi17Ci0JaW50IHJldDsKLQotCWZvciAoOyBuciA+IDA7IG5yLS0sIHN0YXJ0KyspIHsKLQkJczNjX2dwaW9fc2V0cHVsbChzdGFydCwgcHVsbCk7Ci0JCXJldCA9IHMzY19ncGlvX2NmZ3BpbihzdGFydCwgY2ZnKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHMzY19ncGlvX2NmZ2FsbF9yYW5nZSk7Ci0KLXVuc2lnbmVkIHMzY19ncGlvX2dldGNmZyh1bnNpZ25lZCBpbnQgcGluKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gczNjX2dwaW9saWJfZ2V0Y2hpcChwaW4pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgcmV0ID0gMDsKLQlpbnQgb2Zmc2V0OwotCi0JaWYgKGNoaXApIHsKLQkJb2Zmc2V0ID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOwotCi0JCXMzY19ncGlvX2xvY2soY2hpcCwgZmxhZ3MpOwotCQlyZXQgPSBzM2NfZ3Bpb19kb19nZXRjZmcoY2hpcCwgb2Zmc2V0KTsKLQkJczNjX2dwaW9fdW5sb2NrKGNoaXAsIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChzM2NfZ3Bpb19nZXRjZmcpOwotCi0KLWludCBzM2NfZ3Bpb19zZXRwdWxsKHVuc2lnbmVkIGludCBwaW4sIHMzY19ncGlvX3B1bGxfdCBwdWxsKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gczNjX2dwaW9saWJfZ2V0Y2hpcChwaW4pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG9mZnNldCwgcmV0OwotCi0JaWYgKCFjaGlwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9mZnNldCA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKLQotCXMzY19ncGlvX2xvY2soY2hpcCwgZmxhZ3MpOwotCXJldCA9IHMzY19ncGlvX2RvX3NldHB1bGwoY2hpcCwgb2Zmc2V0LCBwdWxsKTsKLQlzM2NfZ3Bpb191bmxvY2soY2hpcCwgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woczNjX2dwaW9fc2V0cHVsbCk7Ci0KLXMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsKHVuc2lnbmVkIGludCBwaW4pCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAgPSBzM2NfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgb2Zmc2V0OwotCXUzMiBwdXAgPSAwOwotCi0JaWYgKGNoaXApIHsKLQkJb2Zmc2V0ID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOwotCi0JCXMzY19ncGlvX2xvY2soY2hpcCwgZmxhZ3MpOwotCQlwdXAgPSBzM2NfZ3Bpb19kb19nZXRwdWxsKGNoaXAsIG9mZnNldCk7Ci0JCXMzY19ncGlvX3VubG9jayhjaGlwLCBmbGFncyk7Ci0JfQotCi0JcmV0dXJuIChfX2ZvcmNlIHMzY19ncGlvX3B1bGxfdClwdXA7Ci19Ci1FWFBPUlRfU1lNQk9MKHMzY19ncGlvX2dldHB1bGwpOwotCi0jaWZkZWYgQ09ORklHX1MzQ19HUElPX0NGR19TM0MyNFhYCi1pbnQgczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHhfYShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjZmcpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlOwotCXVuc2lnbmVkIGludCBzaGlmdCA9IG9mZjsKLQl1MzIgY29uOwotCi0JaWYgKHMzY19ncGlvX2lzX2NmZ19zcGVjaWFsKGNmZykpIHsKLQkJY2ZnICY9IDB4ZjsKLQotCQkvKiBNYXAgb3V0cHV0IHRvIDAsIGFuZCBTRk4yIHRvIDEgKi8KLQkJY2ZnIC09IDE7Ci0JCWlmIChjZmcgPiAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJY2ZnIDw8PSBzaGlmdDsKLQl9Ci0KLQljb24gPSBfX3Jhd19yZWFkbChyZWcpOwotCWNvbiAmPSB+KDB4MSA8PCBzaGlmdCk7Ci0JY29uIHw9IGNmZzsKLQlfX3Jhd193cml0ZWwoY29uLCByZWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIHMzY19ncGlvX2dldGNmZ19zM2MyNHh4X2Eoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgdW5zaWduZWQgaW50IG9mZikKLXsKLQl1MzIgY29uOwotCi0JY29uID0gX19yYXdfcmVhZGwoY2hpcC0+YmFzZSk7Ci0JY29uID4+PSBvZmY7Ci0JY29uICY9IDE7Ci0JY29uKys7Ci0KLQlyZXR1cm4gUzNDX0dQSU9fU0ZOKGNvbik7Ci19Ci0KLWludCBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKQotewotCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBvZmYgKiAyOwotCXUzMiBjb247Ci0KLQlpZiAoczNjX2dwaW9faXNfY2ZnX3NwZWNpYWwoY2ZnKSkgewotCQljZmcgJj0gMHhmOwotCQlpZiAoY2ZnID4gMykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWNmZyA8PD0gc2hpZnQ7Ci0JfQotCi0JY29uID0gX19yYXdfcmVhZGwocmVnKTsKLQljb24gJj0gfigweDMgPDwgc2hpZnQpOwotCWNvbiB8PSBjZmc7Ci0JX19yYXdfd3JpdGVsKGNvbiwgcmVnKTsKLQotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBpbnQgczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHgoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgb2ZmKQotewotCXUzMiBjb247Ci0KLQljb24gPSBfX3Jhd19yZWFkbChjaGlwLT5iYXNlKTsKLQljb24gPj49IG9mZiAqIDI7Ci0JY29uICY9IDM7Ci0KLQkvKiB0aGlzIGNvbnZlcnNpb24gd29ya3MgZm9yIElOIGFuZCBPVVQgYXMgd2VsbCBhcyBzcGVjaWFsIG1vZGUgKi8KLQlyZXR1cm4gUzNDX0dQSU9fU1BFQ0lBTChjb24pOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUzNDX0dQSU9fQ0ZHX1MzQzY0WFgKLWludCBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCSB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKQotewotCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSAob2ZmICYgNykgKiA0OwotCXUzMiBjb247Ci0KLQlpZiAob2ZmIDwgOCAmJiBjaGlwLT5jaGlwLm5ncGlvID4gOCkKLQkJcmVnIC09IDQ7Ci0KLQlpZiAoczNjX2dwaW9faXNfY2ZnX3NwZWNpYWwoY2ZnKSkgewotCQljZmcgJj0gMHhmOwotCQljZmcgPDw9IHNoaWZ0OwotCX0KLQotCWNvbiA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JY29uICY9IH4oMHhmIDw8IHNoaWZ0KTsKLQljb24gfD0gY2ZnOwotCV9fcmF3X3dyaXRlbChjb24sIHJlZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgczNjX2dwaW9fZ2V0Y2ZnX3MzYzY0eHhfNGJpdChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgb2ZmKQotewotCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSAob2ZmICYgNykgKiA0OwotCXUzMiBjb247Ci0KLQlpZiAob2ZmIDwgOCAmJiBjaGlwLT5jaGlwLm5ncGlvID4gOCkKLQkJcmVnIC09IDQ7Ci0KLQljb24gPSBfX3Jhd19yZWFkbChyZWcpOwotCWNvbiA+Pj0gc2hpZnQ7Ci0JY29uICY9IDB4ZjsKLQotCS8qIHRoaXMgY29udmVyc2lvbiB3b3JrcyBmb3IgSU4gYW5kIE9VVCBhcyB3ZWxsIGFzIHNwZWNpYWwgbW9kZSAqLwotCXJldHVybiBTM0NfR1BJT19TUEVDSUFMKGNvbik7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUzNDX0dQSU9fQ0ZHX1MzQzY0WFggKi8KLQotI2lmZGVmIENPTkZJR19TM0NfR1BJT19QVUxMX1VQRE9XTgotaW50IHMzY19ncGlvX3NldHB1bGxfdXBkb3duKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJICAgIHVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKQotewotCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZSArIDB4MDg7Ci0JaW50IHNoaWZ0ID0gb2ZmICogMjsKLQl1MzIgcHVwOwotCi0JcHVwID0gX19yYXdfcmVhZGwocmVnKTsKLQlwdXAgJj0gfigzIDw8IHNoaWZ0KTsKLQlwdXAgfD0gcHVsbCA8PCBzaGlmdDsKLQlfX3Jhd193cml0ZWwocHVwLCByZWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93bihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJdW5zaWduZWQgaW50IG9mZikKLXsKLQl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2UgKyAweDA4OwotCWludCBzaGlmdCA9IG9mZiAqIDI7Ci0JdTMyIHB1cCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0KLQlwdXAgPj49IHNoaWZ0OwotCXB1cCAmPSAweDM7Ci0JcmV0dXJuIChfX2ZvcmNlIHMzY19ncGlvX3B1bGxfdClwdXA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUzNDX0dQSU9fUFVMTF9TM0MyNDQzCi1pbnQgczNjX2dwaW9fc2V0cHVsbF9zM2MyNDQzKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCXVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKQotewotCXN3aXRjaCAocHVsbCkgewotCWNhc2UgUzNDX0dQSU9fUFVMTF9OT05FOgotCQlwdWxsID0gMHgwMTsKLQkJYnJlYWs7Ci0JY2FzZSBTM0NfR1BJT19QVUxMX1VQOgotCQlwdWxsID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSBTM0NfR1BJT19QVUxMX0RPV046Ci0JCXB1bGwgPSAweDAyOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHMzY19ncGlvX3NldHB1bGxfdXBkb3duKGNoaXAsIG9mZiwgcHVsbCk7Ci19Ci0KLXMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsX3MzYzI0NDMoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCXVuc2lnbmVkIGludCBvZmYpCi17Ci0JczNjX2dwaW9fcHVsbF90IHB1bGw7Ci0KLQlwdWxsID0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24oY2hpcCwgb2ZmKTsKLQotCXN3aXRjaCAocHVsbCkgewotCWNhc2UgMHgwMDoKLQkJcHVsbCA9IFMzQ19HUElPX1BVTExfVVA7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMToKLQljYXNlIDB4MDM6Ci0JCXB1bGwgPSBTM0NfR1BJT19QVUxMX05PTkU7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMjoKLQkJcHVsbCA9IFMzQ19HUElPX1BVTExfRE9XTjsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHB1bGw7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfUzNDX0dQSU9fUFVMTF9VUCkgfHwgZGVmaW5lZChDT05GSUdfUzNDX0dQSU9fUFVMTF9ET1dOKQotc3RhdGljIGludCBzM2NfZ3Bpb19zZXRwdWxsXzEoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkgdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwsCi0JCQkgczNjX2dwaW9fcHVsbF90IHVwZG93bikKLXsKLQl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2UgKyAweDA4OwotCXUzMiBwdXAgPSBfX3Jhd19yZWFkbChyZWcpOwotCi0JaWYgKHB1bGwgPT0gdXBkb3duKQotCQlwdXAgJj0gfigxIDw8IG9mZik7Ci0JZWxzZSBpZiAocHVsbCA9PSBTM0NfR1BJT19QVUxMX05PTkUpCi0JCXB1cCB8PSAoMSA8PCBvZmYpOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlfX3Jhd193cml0ZWwocHVwLCByZWcpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfMShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCB1cGRvd24pCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlICsgMHgwODsKLQl1MzIgcHVwID0gX19yYXdfcmVhZGwocmVnKTsKLQotCXB1cCAmPSAoMSA8PCBvZmYpOwotCXJldHVybiBwdXAgPyBTM0NfR1BJT19QVUxMX05PTkUgOiB1cGRvd247Ci19Ci0jZW5kaWYgLyogQ09ORklHX1MzQ19HUElPX1BVTExfVVAgfHwgQ09ORklHX1MzQ19HUElPX1BVTExfRE9XTiAqLwotCi0jaWZkZWYgQ09ORklHX1MzQ19HUElPX1BVTExfVVAKLXMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsXzF1cChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYpCi17Ci0JcmV0dXJuIHMzY19ncGlvX2dldHB1bGxfMShjaGlwLCBvZmYsIFMzQ19HUElPX1BVTExfVVApOwotfQotCi1pbnQgczNjX2dwaW9fc2V0cHVsbF8xdXAoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkgdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpCi17Ci0JcmV0dXJuIHMzY19ncGlvX3NldHB1bGxfMShjaGlwLCBvZmYsIHB1bGwsIFMzQ19HUElPX1BVTExfVVApOwotfQotI2VuZGlmIC8qIENPTkZJR19TM0NfR1BJT19QVUxMX1VQICovCi0KLSNpZmRlZiBDT05GSUdfUzNDX0dQSU9fUFVMTF9ET1dOCi1zM2NfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZ2V0cHVsbF8xZG93bihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYpCi17Ci0JcmV0dXJuIHMzY19ncGlvX2dldHB1bGxfMShjaGlwLCBvZmYsIFMzQ19HUElPX1BVTExfRE9XTik7Ci19Ci0KLWludCBzM2NfZ3Bpb19zZXRwdWxsXzFkb3duKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJIHVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKQotewotCXJldHVybiBzM2NfZ3Bpb19zZXRwdWxsXzEoY2hpcCwgb2ZmLCBwdWxsLCBTM0NfR1BJT19QVUxMX0RPV04pOwotfQotI2VuZGlmIC8qIENPTkZJR19TM0NfR1BJT19QVUxMX0RPV04gKi8KLQotI2lmZGVmIENPTkZJR19TNVBfR1BJT19EUlZTVFIKLXM1cF9ncGlvX2RydnN0cl90IHM1cF9ncGlvX2dldF9kcnZzdHIodW5zaWduZWQgaW50IHBpbikKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IHMzY19ncGlvbGliX2dldGNoaXAocGluKTsKLQl1bnNpZ25lZCBpbnQgb2ZmOwotCXZvaWQgX19pb21lbSAqcmVnOwotCWludCBzaGlmdDsKLQl1MzIgZHJ2c3RyOwotCi0JaWYgKCFjaGlwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9mZiA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKLQlzaGlmdCA9IG9mZiAqIDI7Ci0JcmVnID0gY2hpcC0+YmFzZSArIDB4MEM7Ci0KLQlkcnZzdHIgPSBfX3Jhd19yZWFkbChyZWcpOwotCWRydnN0ciA9IGRydnN0ciA+PiBzaGlmdDsKLQlkcnZzdHIgJj0gMHgzOwotCi0JcmV0dXJuIChfX2ZvcmNlIHM1cF9ncGlvX2RydnN0cl90KWRydnN0cjsKLX0KLUVYUE9SVF9TWU1CT0woczVwX2dwaW9fZ2V0X2RydnN0cik7Ci0KLWludCBzNXBfZ3Bpb19zZXRfZHJ2c3RyKHVuc2lnbmVkIGludCBwaW4sIHM1cF9ncGlvX2RydnN0cl90IGRydnN0cikKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IHMzY19ncGlvbGliX2dldGNoaXAocGluKTsKLQl1bnNpZ25lZCBpbnQgb2ZmOwotCXZvaWQgX19pb21lbSAqcmVnOwotCWludCBzaGlmdDsKLQl1MzIgdG1wOwotCi0JaWYgKCFjaGlwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9mZiA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKLQlzaGlmdCA9IG9mZiAqIDI7Ci0JcmVnID0gY2hpcC0+YmFzZSArIDB4MEM7Ci0KLQl0bXAgPSBfX3Jhd19yZWFkbChyZWcpOwotCXRtcCAmPSB+KDB4MyA8PCBzaGlmdCk7Ci0JdG1wIHw9IGRydnN0ciA8PCBzaGlmdDsKLQotCV9fcmF3X3dyaXRlbCh0bXAsIHJlZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woczVwX2dwaW9fc2V0X2RydnN0cik7Ci0jZW5kaWYJLyogQ09ORklHX1M1UF9HUElPX0RSVlNUUiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDNjNGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9ncGlvLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDIHNlcmllcyBHUElPIGNvcmUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCi0jaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KLQotI2lmZGVmIENPTkZJR19TM0NfR1BJT19UUkFDSwotc3RydWN0IHMzY19ncGlvX2NoaXAgKnMzY19ncGlvc1tTM0NfR1BJT19FTkRdOwotCi1zdGF0aWMgX19pbml0IHZvaWQgczNjX2dwaW9saWJfdHJhY2soc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApCi17Ci0JdW5zaWduZWQgaW50IGdwbjsKLQlpbnQgaTsKLQotCWdwbiA9IGNoaXAtPmNoaXAuYmFzZTsKLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+Y2hpcC5uZ3BpbzsgaSsrLCBncG4rKykgewotCQlCVUdfT04oZ3BuID49IEFSUkFZX1NJWkUoczNjX2dwaW9zKSk7Ci0JCXMzY19ncGlvc1tncG5dID0gY2hpcDsKLQl9Ci19Ci0jZW5kaWYgLyogQ09ORklHX1MzQ19HUElPX1RSQUNLICovCi0KLS8qIERlZmF1bHQgcm91dGluZXMgZm9yIGNvbnRyb2xsaW5nIEdQSU8sIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBTM0MyNFhYCi0gKiBHUElPIGZ1bmN0aW9ucyB3aGljaCBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgZWFjaCBncGlvIGJhbmsgb2YgdGhlCi0gKiBjaGlwIGlzIGFzIGZvbGxvd2luZzoKLSAqCi0gKiBiYXNlICsgMHgwMDogQ29udHJvbCByZWdpc3RlciwgMiBiaXRzIHBlciBncGlvCi0gKgkgICAgICAgIGdwaW8gbjogMiBiaXRzIHN0YXJ0aW5nIGF0ICgyKm4pCi0gKgkJMDAgPSBpbnB1dCwgMDEgPSBvdXRwdXQsIG90aGVycyBtZWFuIHNwZWNpYWwtZnVuY3Rpb24KLSAqIGJhc2UgKyAweDA0OiBEYXRhIHJlZ2lzdGVyLCAxIGJpdCBwZXIgZ3BpbwotICoJCWJpdCBuOiBkYXRhIGJpdCBuCi0qLwotCi1zdGF0aWMgaW50IHMzY19ncGlvbGliX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19ncGlvKGNoaXApOwotCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGNvbjsKLQotCXMzY19ncGlvX2xvY2sob3VyY2hpcCwgZmxhZ3MpOwotCi0JY29uID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDApOwotCWNvbiAmPSB+KDMgPDwgKG9mZnNldCAqIDIpKTsKLQotCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyAweDAwKTsKLQotCXMzY19ncGlvX3VubG9jayhvdXJjaGlwLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgczNjX2dwaW9saWJfb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkgICAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19ncGlvKGNoaXApOwotCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGRhdDsKLQl1bnNpZ25lZCBsb25nIGNvbjsKLQotCXMzY19ncGlvX2xvY2sob3VyY2hpcCwgZmxhZ3MpOwotCi0JZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDQpOwotCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKLQlpZiAodmFsdWUpCi0JCWRhdCB8PSAxIDw8IG9mZnNldDsKLQlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7Ci0KLQljb24gPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwMCk7Ci0JY29uICY9IH4oMyA8PCAob2Zmc2V0ICogMikpOwotCWNvbiB8PSAxIDw8IChvZmZzZXQgKiAyKTsKLQotCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyAweDAwKTsKLQlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7Ci0KLQlzM2NfZ3Bpb191bmxvY2sob3VyY2hpcCwgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzM2NfZ3Bpb2xpYl9zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCSAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19ncGlvKGNoaXApOwotCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGRhdDsKLQotCXMzY19ncGlvX2xvY2sob3VyY2hpcCwgZmxhZ3MpOwotCi0JZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDQpOwotCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKLQlpZiAodmFsdWUpCi0JCWRhdCB8PSAxIDw8IG9mZnNldDsKLQlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7Ci0KLQlzM2NfZ3Bpb191bmxvY2sob3VyY2hpcCwgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHMzY19ncGlvbGliX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCXZhbCA9IF9fcmF3X3JlYWRsKG91cmNoaXAtPmJhc2UgKyAweDA0KTsKLQl2YWwgPj49IG9mZnNldDsKLQl2YWwgJj0gMTsKLQotCXJldHVybiB2YWw7Ci19Ci0KLV9faW5pdCB2b2lkIHMzY19ncGlvbGliX2FkZChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9ICZjaGlwLT5jaGlwOwotCWludCByZXQ7Ci0KLQlCVUdfT04oIWNoaXAtPmJhc2UpOwotCUJVR19PTighZ2MtPmxhYmVsKTsKLQlCVUdfT04oIWdjLT5uZ3Bpbyk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2hpcC0+bG9jayk7Ci0KLQlpZiAoIWdjLT5kaXJlY3Rpb25faW5wdXQpCi0JCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBzM2NfZ3Bpb2xpYl9pbnB1dDsKLQlpZiAoIWdjLT5kaXJlY3Rpb25fb3V0cHV0KQotCQlnYy0+ZGlyZWN0aW9uX291dHB1dCA9IHMzY19ncGlvbGliX291dHB1dDsKLQlpZiAoIWdjLT5zZXQpCi0JCWdjLT5zZXQgPSBzM2NfZ3Bpb2xpYl9zZXQ7Ci0JaWYgKCFnYy0+Z2V0KQotCQlnYy0+Z2V0ID0gczNjX2dwaW9saWJfZ2V0OwotCi0jaWZkZWYgQ09ORklHX1BNCi0JaWYgKGNoaXAtPnBtICE9IE5VTEwpIHsKLQkJaWYgKCFjaGlwLT5wbS0+c2F2ZSB8fCAhY2hpcC0+cG0tPnJlc3VtZSkKLQkJCXByaW50ayhLRVJOX0VSUiAiZ3BpbzogJXMgaGFzIG1pc3NpbmcgUE0gZnVuY3Rpb25zXG4iLAotCQkJICAgICAgIGdjLT5sYWJlbCk7Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiZ3BpbzogJXMgaGFzIG5vIFBNIGZ1bmN0aW9uXG4iLCBnYy0+bGFiZWwpOwotI2VuZGlmCi0KLQkvKiBncGlvY2hpcF9hZGQoKSBwcmludHMgb3duIGZhaWx1cmUgbWVzc2FnZSBvbiBlcnJvci4gKi8KLQlyZXQgPSBncGlvY2hpcF9hZGQoZ2MpOwotCWlmIChyZXQgPj0gMCkKLQkJczNjX2dwaW9saWJfdHJhY2soY2hpcCk7Ci19Ci0KLWludCBzYW1zdW5nX2dwaW9saWJfdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKnMzY19jaGlwID0gY29udGFpbmVyX29mKGNoaXAsCi0JCQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCwgY2hpcCk7Ci0KLQlyZXR1cm4gczNjX2NoaXAtPmlycV9iYXNlICsgb2Zmc2V0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9hZGMtY29yZS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9hZGMtY29yZS5oCmluZGV4IGEyODE1NjguLmE5MjdiZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvYWRjLWNvcmUuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2FkYy1jb3JlLmgKQEAgLTIwLDcgKzIwLDcgQEAKIC8qIHJlLWRlZmluZSBkZXZpY2UgbmFtZSBkZXBlbmRpbmcgb24gc3VwcG9ydC4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBzM2NfYWRjX3NldG5hbWUoY2hhciAqbmFtZSkKIHsKLSNpZmRlZiBDT05GSUdfU0FNU1VOR19ERVZfQURDCisjaWYgZGVmaW5lZChDT05GSUdfU0FNU1VOR19ERVZfQURDKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX1MzQzI0WFgpCiAJczNjX2RldmljZV9hZGMubmFtZSA9IG5hbWU7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvYXVkaW8tc2ltdGVjLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2F1ZGlvLXNpbXRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDUzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2F1ZGlvLXNpbXRlYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvYXVkaW8tc2ltdGVjLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBTaW10ZWMgQXVkaW8gc3VwcG9ydC4KKyovCisKKy8qKgorICogc3RydWN0IHMzYzI0eHhfYXVkaW9fc2ltdGVjX3BkYXRhIC0gcGxhdGZvcm0gZGF0YSBmb3Igc2ltdGVjIGF1ZGlvCisgKiBAdXNlX21wbGxpbjogU2VsZWN0IGNvZGVjIGNsb2NrIGZyb20gTVBMTGluCisgKiBAb3V0cHV0X2NkY2xrOiBOZWVkIHRvIG91dHB1dCBDRENMSyB0byB0aGUgY29kZWMKKyAqIEBoYXZlX21pYzogU2V0IGlmIHdlIGhhdmUgYSBNSUMgc29ja2V0CisgKiBAaGF2ZV9sb3V0OiBTZXQgaWYgd2UgaGF2ZSBhIExpbmVPdXQgc29ja2V0CisgKiBAYW1wX2dwaW86IEdQSU8gcGluIHRvIGVuYWJsZSB0aGUgQU1QCisgKiBAYW1wX2dhaW46IE9wdGlvbiBHUElPIHRvIGNvbnRyb2wgQU1QIGdhaW4KKyAqLworc3RydWN0IHMzYzI0eHhfYXVkaW9fc2ltdGVjX3BkYXRhIHsKKwl1bnNpZ25lZCBpbnQJdXNlX21wbGxpbjoxOworCXVuc2lnbmVkIGludAlvdXRwdXRfY2RjbGs6MTsKKworCXVuc2lnbmVkIGludAloYXZlX21pYzoxOworCXVuc2lnbmVkIGludAloYXZlX2xvdXQ6MTsKKworCWludAkJYW1wX2dwaW87CisJaW50CQlhbXBfZ2FpblsyXTsKKworCXZvaWQJKCpzdGFydHVwKSh2b2lkKTsKK307CisKK2V4dGVybiBpbnQgc2ltdGVjX2F1ZGlvX2FkZChjb25zdCBjaGFyICpjb2RlY19uYW1lLCBib29sIGhhc19scl9yb3V0aW5nLAorCQkJICAgIHN0cnVjdCBzM2MyNHh4X2F1ZGlvX3NpbXRlY19wZGF0YSAqcGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jYW1wb3J0LmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NhbXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTcwOGJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jYW1wb3J0LmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFM1UCBzZXJpZXMgY2FtZXJhIGludGVyZmFjZSBoZWxwZXIgZnVuY3Rpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fUExBVF9TQU1TVU5HX0NBTVBPUlRfSF8KKyNkZWZpbmUgX19QTEFUX1NBTVNVTkdfQ0FNUE9SVF9IXyBfX0ZJTEVfXworCitlbnVtIHM1cF9jYW1wb3J0X2lkIHsKKwlTNVBfQ0FNUE9SVF9BLAorCVM1UF9DQU1QT1JUX0IsCit9OworCisvKgorICogVGhlIGhlbHBlciBmdW5jdGlvbnMgdG8gY29uZmlndXJlIEdQSU8gZm9yIHRoZSBjYW1lcmEgcGFyYWxsZWwgYnVzLgorICogVGhlIGNhbWVyYSBwb3J0IGNhbiBiZSBtdWx0aXBsZXhlZCB3aXRoIGFueSBGSU1DIGVudGl0eSwgZXZlbiBtdWx0aXBsZQorICogRklNQyBlbnRpdGllcyBhcmUgYWxsb3dlZCB0byBiZSBhdHRhY2hlZCB0byBhIHNpbmdsZSBwb3J0IHNpbXVsdGFuZW91c2x5LgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSB0byBiZSB1c2VkIGluIHRoZSBib2FyZCBzZXR1cCBjb2RlLgorICovCitpbnQgczVwdjIxMF9maW1jX3NldHVwX2dwaW8oZW51bSBzNXBfY2FtcG9ydF9pZCBpZCk7CitpbnQgZXh5bm9zNF9maW1jX3NldHVwX2dwaW8oZW51bSBzNXBfY2FtcG9ydF9pZCBpZCk7CisKKyNlbmRpZiAvKiBfX1BMQVRfU0FNU1VOR19DQU1QT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY29tbW9uLXNtZGsuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY29tbW9uLXNtZGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAyOGYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jb21tb24tc21kay5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY29tbW9uLXNtZGsuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBDb21tb24gY29kZSBmb3IgU01ESzI0MTAgYW5kIFNNREsyNDQwIGJvYXJkcworICoKKyAqIGh0dHA6Ly93d3cuZmx1ZmYub3JnL2Jlbi9zbWRrMjQ0MC8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworZXh0ZXJuIHZvaWQgc21ka19tYWNoaW5lX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NwdS1mcmVxLWNvcmUuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzQ3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NwdS1mcmVxLWNvcmUuaApAQCAtMCwwICsxLDI4OCBAQAorLyogYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jcHUtZnJlcS1jb3JlLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDIENQVSBmcmVxdWVuY3kgc2NhbGluZyBzdXBwb3J0IC0gY29yZSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+CisKK3N0cnVjdCBzZXFfZmlsZTsKKworI2RlZmluZSBNQVhfQkFOS1MgKDgpCisjZGVmaW5lIFMzQzI0MTJfTUFYX0lPCSg4KQorCisvKioKKyAqIHN0cnVjdCBzM2MyNDEwX2lvYmFua190aW1pbmcgLSBJTyBiYW5rIHRpbWluZ3MgZm9yIFMzQzI0MTAgc3R5bGUgdGltaW5ncworICogQGJhbmtjb246IFRoZSBjYWNoZWQgdmVyc2lvbiBvZiBzZXR0aW5ncyBpbiB0aGlzIHN0cnVjdHVyZS4KKyAqIEB0YWNwOgorICogQHRhY3M6IFRpbWUgZnJvbSBhZGRyZXNzIHZhbGlkIHRvIG5DUyBhc3NlcnRlZC4KKyAqIEB0Y29zOiBUaW1lIGZyb20gbkNTIGFzc2VydGVkIHRvIG5PRSBvciBuV0UgYXNzZXJ0ZWQuCisgKiBAdGFjYzogVGltZSB0aGF0IG5PRSBvciBuV0UgaXMgYXNzZXJ0ZWQuCisgKiBAdGNvaDogVGltZSBuQ1MgaXMgaGVsZCBhZnRlciBuT0Ugb3IgbldFIGFyZSByZWxlYXNlZC4KKyAqIEB0Y2FoOiBUaW1lIGFkZHJlc3MgaXMgaGVsZCBmb3IgYWZ0ZXIKKyAqIEBud2FpdF9lbjogV2hldGhlciBuV0FJVCBpcyBlbmFibGVkIGZvciB0aGlzIGJhbmsuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB0aGUgSU8gdGltaW5ncyBmb3IgYSBTM0MyNDEwIHN0eWxlIElPIGJhbmsKKyAqIHVzZWQgYnkgdGhlIENQVSBmcmVxdWVuY3kgc3VwcG9ydCBpZiBpdCBuZWVkcyB0byBjaGFuZ2UgdGhlIHNldHRpbmdzCisgKiBvZiB0aGUgSU8uCisgKi8KK3N0cnVjdCBzM2MyNDEwX2lvYmFua190aW1pbmcgeworCXVuc2lnbmVkIGxvbmcJYmFua2NvbjsKKwl1bnNpZ25lZCBpbnQJdGFjcDsKKwl1bnNpZ25lZCBpbnQJdGFjczsKKwl1bnNpZ25lZCBpbnQJdGNvczsKKwl1bnNpZ25lZCBpbnQJdGFjYzsKKwl1bnNpZ25lZCBpbnQJdGNvaDsJCS8qIG5DUyBob2xkIGFmcmVyIG5PRS9uV0UgKi8KKwl1bnNpZ25lZCBpbnQJdGNhaDsJCS8qIEFkZHJlc3MgaG9sZCBhZnRlciBuQ1MgKi8KKwl1bnNpZ25lZCBjaGFyCW53YWl0X2VuOwkvKiBuV2FpdCBlbmFibGVkIGZvciBiYW5rLiAqLworfTsKKworLyoqCisgKiBzdHJ1Y3QgczNjMjQxMl9pb2JhbmtfdGltaW5nIC0gaW8gdGltaW5ncyBmb3IgUEwwOTIgKFMzQzI0MTIpIHN0eWxlIElPCisgKiBAaWRjeTogVGhlIGlkbGUgY3ljbGUgdGltZSBiZXR3ZWVuIHRyYW5zYWN0aW9ucy4KKyAqIEB3c3RyZDogbkNTIHJlbGVhc2UgdG8gZW5kIG9mIHJlYWQgY3ljbGUuCisgKiBAd3N0d3I6IG5DUyByZWxlYXNlIHRvIGVuZCBvZiB3cml0ZSBjeWNsZS4KKyAqIEB3c3RvZW46IG5DUyBhc3NlcnRpb24gdG8gbk9FIGFzc2VydGlvbiB0aW1lLgorICogQHdzdHdlbjogbkNTIGFzc2VydGlvbiB0byBuV0UgYXNzZXJ0aW9uIHRpbWUuCisgKiBAd3N0YnJkOiBCdXJzdCByZWFkeSBkZWxheS4KKyAqIEBzbWJpZGN5cjogUmVnaXN0ZXIgY2FjaGUgZm9yIHNtYmlkY3lyIHZhbHVlLgorICogQHNtYndzdHJkOiBSZWdpc3RlciBjYWNoZSBmb3Igc21id3N0cmQgdmFsdWUuCisgKiBAc21id3N0d3I6IFJlZ2lzdGVyIGNhY2hlIGZvciBzbWJ3c3R3ciB2YWx1ZS4KKyAqIEBzbWJ3c3RvZW46IFJlZ2lzdGVyIGNhY2hlIGZvciBzbWJ3c3RvZW4gdmFsdWUuCisgKiBAc21id3N0d2VuOiBSZWdpc3RlciBjYWNoZSBmb3Igc21id3N0d2VuIHZhbHVlLgorICogQHNtYndzdGJyZDogUmVnaXN0ZXIgY2FjaGUgZm9yIHNtYndzdGJyZCB2YWx1ZS4KKyAqCisgKiBUaW1pbmcgaW5mb3JtYXRpb24gZm9yIGEgSU8gYmFuayBvbiBhbiBTM0MyNDEyIG9yIHNpbWlsYXIgc3lzdGVtIHdoaWNoCisgKiB1c2VzIGEgUEwwOTMgYmxvY2suCisgKi8KK3N0cnVjdCBzM2MyNDEyX2lvYmFua190aW1pbmcgeworCXVuc2lnbmVkIGludAlpZGN5OworCXVuc2lnbmVkIGludAl3c3RyZDsKKwl1bnNpZ25lZCBpbnQJd3N0d3I7CisJdW5zaWduZWQgaW50CXdzdG9lbjsKKwl1bnNpZ25lZCBpbnQJd3N0d2VuOworCXVuc2lnbmVkIGludAl3c3RicmQ7CisKKwkvKiByZWdpc3RlciBjYWNoZSAqLworCXVuc2lnbmVkIGNoYXIJc21iaWRjeXI7CisJdW5zaWduZWQgY2hhcglzbWJ3c3RyZDsKKwl1bnNpZ25lZCBjaGFyCXNtYndzdHdyOworCXVuc2lnbmVkIGNoYXIJc21id3N0b2VuOworCXVuc2lnbmVkIGNoYXIJc21id3N0d2VuOworCXVuc2lnbmVkIGNoYXIJc21id3N0YnJkOworfTsKKwordW5pb24gczNjX2lvYmFuayB7CisJc3RydWN0IHMzYzI0MTBfaW9iYW5rX3RpbWluZwkqaW9fMjQxMDsKKwlzdHJ1Y3QgczNjMjQxMl9pb2JhbmtfdGltaW5nCSppb18yNDEyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgczNjX2lvdGltaW5ncyAtIENoaXAgSU8gdGltaW5ncyBob2xkZXIKKyAqIEBiYW5rOiBUaGUgdGltaW5ncyBmb3IgZWFjaCBJTyBiYW5rLgorICovCitzdHJ1Y3QgczNjX2lvdGltaW5ncyB7CisJdW5pb24gczNjX2lvYmFuawliYW5rW01BWF9CQU5LU107Cit9OworCisvKioKKyAqIHN0cnVjdCBzM2NfcGxsdGFiIC0gUExMIHRhYmxlIGluZm9ybWF0aW9uLgorICogQHZhbHM6IExpc3Qgb2YgUExMIHZhbHVlcy4KKyAqIEBzaXplOiBTaXplIG9mIHRoZSBQTEwgdGFibGUgQHZhbHMuCisgKi8KK3N0cnVjdCBzM2NfcGxsdGFiIHsKKwlzdHJ1Y3QgczNjX3BsbHZhbAkqdmFsczsKKwlpbnQJCQkgc2l6ZTsKK307CisKKy8qKgorICogc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAtIGN1cnJlbnQgY3B1IGZyZXF1ZW5jeSBjb25maWd1cmF0aW9uCisgKiBAZnJlcTogVGhlIGN1cnJlbnQgc2V0dGluZ3MgZm9yIHRoZSBjb3JlIGNsb2Nrcy4KKyAqIEBtYXg6IE1heGl1bSBzZXR0aW5ncywgZGVyaXZlZCBmcm9tIGNvcmUsIGJvYXJkIGFuZCB1c2VyIHNldHRpbmdzLgorICogQHBsbDogVGhlIFBMTCB0YWJsZSBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgUExMIHNldHRpbmdzLgorICogQGRpdnM6IFRoZSBkaXZpc29yIHNldHRpbmdzIGZvciB0aGUgY29yZSBjbG9ja3MuCisgKiBAaW5mbzogVGhlIGN1cnJlbnQgY29yZSBkcml2ZXIgaW5mb3JtYXRpb24uCisgKiBAYm9hcmQ6IFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGJvYXJkIHdlIGFyZSBydW5uaW5nIG9uLgorICogQGxvY2tfcGxsOiBTZXQgaWYgdGhlIFBMTCBzZXR0aW5ncyBjYW5ub3QgYmUgY2hhbmdlZC4KKyAqCisgKiBUaGlzIGlzIGZvciB0aGUgY29yZSBkcml2ZXJzIHRoYXQgbmVlZCB0byBrbm93IGluZm9ybWF0aW9uIGFib3V0CisgKiB0aGUgY3VycmVudCBzZXR0aW5ncyBhbmQgdmFsdWVzLiBJdCBzaG91bGQgbm90IGJlIG5lZWRlZCBieSBhbnkKKyAqIGRldmljZSBkcml2ZXJzLgorKi8KK3N0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgeworCXN0cnVjdCBzM2NfZnJlcQkJZnJlcTsKKwlzdHJ1Y3QgczNjX2ZyZXEJCW1heDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgcGxsOworCXN0cnVjdCBzM2NfY2xrZGl2cwlkaXZzOworCXN0cnVjdCBzM2NfY3B1ZnJlcV9pbmZvICppbmZvOwkvKiBmb3IgY29yZSwgbm90IGRyaXZlcnMgKi8KKwlzdHJ1Y3QgczNjX2NwdWZyZXFfYm9hcmQgKmJvYXJkOworCisJdW5zaWduZWQgaW50CWxvY2tfcGxsOjE7Cit9OworCisvKioKKyAqIHN0cnVjdCBzM2NfY3B1ZnJlcV9pbmZvIC0gSW5mb3JtYXRpb24gZm9yIHRoZSBDUFUgZnJlcXVlbmN5IGRyaXZlci4KKyAqIEBuYW1lOiBUaGUgbmFtZSBvZiB0aGlzIGltcGxlbWVudGF0aW9uLgorICogQG1heDogVGhlIG1heGltdW0gZnJlcXVlbmNpZXMgZm9yIHRoZSBzeXN0ZW0uCisgKiBAbGF0ZW5jeTogVHJhbnNpdGlvbiBsYXRlbmN5IHRvIGdpdmUgdG8gY3B1ZnJlcS4KKyAqIEBsb2NrdGltZV9tOiBUaGUgbG9jay10aW1lIGluIHVTIGZvciB0aGUgTVBMTC4KKyAqIEBsb2NrdGltZV91OiBUaGUgbG9jay10aW1lIGluIHVTIGZvciB0aGUgVVBMTC4KKyAqIEBsb2N0dGltZV9iaXRzOiBUaGUgbnVtYmVyIG9mIGJpdHMgZWFjaCBMT0NLVElNRSBmaWVsZC4KKyAqIEBuZWVkX3BsbDogU2V0IGlmIHRoaXMgZHJpdmVyIG5lZWRzIHRvIGNoYW5nZSB0aGUgUExMIHZhbHVlcyB0byBhY2hpZXZlCisgKglhbnkgZnJlcXVlbmN5IGNoYW5nZXMuIFRoaXMgaXMgcmVhbGx5IG9ubHkgbmVlZCBieSBkZXZpY2VzIGxpa2UgdGhlCisgKglTM0MyNDEwIHdoZXJlIHRoZXJlIGlzIG5vIG9yIGxpbWl0ZWQgZGl2aWRlciBiZXR3ZWVuIHRoZSBQTEwgYW5kIHRoZQorICoJQVJNQ0xLLgorICogQHJlc3VtZV9jbG9ja3M6IFVwZGF0ZSB0aGUgY2xvY2tzIG9uIHJlc3VtZS4KKyAqIEBnZXRfaW90aW1pbmc6IEdldCB0aGUgY3VycmVudCBJTyB0aW1pbmcgZGF0YSwgbWFpbmx5IGZvciB1c2UgYXQgc3RhcnQuCisgKiBAc2V0X2lvdGltaW5nOiBVcGRhdGUgdGhlIElPIHRpbWluZ3MgZnJvbSB0aGUgY2FjaGVkIGNvcGllcyBjYWxjdWxhdGVkCisgKglmcm9tIHRoZSBAY2FsY19pb3RpbWluZyBlbnRyeSB3aGVuIGNoYW5naW5nIHRoZSBmcmVxdWVuY3kuCisgKiBAY2FsY19pb3RpbWluZzogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIGNhY2hlZCBjb3BpZXMgb2YgdGhlIElPIHRpbWluZ3MKKyAqCWZyb20gdGhlIG5ld2x5IGNhbGN1bGF0ZWQgZnJlcXVlbmNpZXMuCisgKiBAY2FsY19mcmVxdGFibGU6IENhbGN1bGF0ZSAoZmlsbCBpbikgdGhlIGdpdmVuIGZyZXF1ZW5jeSB0YWJsZSBmcm9tIHRoZQorICoJY3VycmVudCBmcmVxdWVuY3kgY29uZmlndXJhdGlvbi4gSWYgdGhlIHRhYmxlIHBhc3NlZCBpbiBpcyBOVUxMLAorICoJdGhlbiB0aGUgcmV0dXJuIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgZmlsbGVkIGZvciBhbGxvY2F0aW9uCisgKglvZiB0aGUgdGFibGUuCisgKiBAc2V0X3JlZnJlc2g6IFNldCB0aGUgbWVtb3J5IHJlZnJlc2ggY29uZmlndXJhdGlvbi4KKyAqIEBzZXRfZnZjbzogU2V0IHRoZSBQTEwgZnJlcXVlbmNpZXMuCisgKiBAc2V0X2RpdnM6IFVwZGF0ZSB0aGUgY2xvY2sgZGl2aXNvcnMuCisgKiBAY2FsY19kaXZzOiBDYWxjdWxhdGUgdGhlIGNsb2NrIGRpdmlzb3JzLgorICovCitzdHJ1Y3QgczNjX2NwdWZyZXFfaW5mbyB7CisJY29uc3QgY2hhcgkJKm5hbWU7CisJc3RydWN0IHMzY19mcmVxCQltYXg7CisKKwl1bnNpZ25lZCBpbnQJCWxhdGVuY3k7CisKKwl1bnNpZ25lZCBpbnQJCWxvY2t0aW1lX207CisJdW5zaWduZWQgaW50CQlsb2NrdGltZV91OworCXVuc2lnbmVkIGNoYXIJCWxvY2t0aW1lX2JpdHM7CisKKwl1bnNpZ25lZCBpbnQJCW5lZWRfcGxsOjE7CisKKwkvKiBkcml2ZXIgcm91dGluZXMgKi8KKworCXZvaWQJCSgqcmVzdW1lX2Nsb2Nrcykodm9pZCk7CisKKwlpbnQJCSgqZ2V0X2lvdGltaW5nKShzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJCXN0cnVjdCBzM2NfaW90aW1pbmdzICp0aW1pbmdzKTsKKworCXZvaWQJCSgqc2V0X2lvdGltaW5nKShzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJCXN0cnVjdCBzM2NfaW90aW1pbmdzICp0aW1pbmdzKTsKKworCWludAkJKCpjYWxjX2lvdGltaW5nKShzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJCSBzdHJ1Y3QgczNjX2lvdGltaW5ncyAqdGltaW5ncyk7CisKKwlpbnQJCSgqY2FsY19mcmVxdGFibGUpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQkJICBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnQsCisJCQkJCSAgc2l6ZV90IHRhYmxlX3NpemUpOworCisJdm9pZAkJKCpkZWJ1Z19pb19zaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCQkJIHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQkJIHVuaW9uIHMzY19pb2JhbmsgKmlvYik7CisKKwl2b2lkCQkoKnNldF9yZWZyZXNoKShzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcpOworCXZvaWQJCSgqc2V0X2Z2Y28pKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7CisJdm9pZAkJKCpzZXRfZGl2cykoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnKTsKKwlpbnQJCSgqY2FsY19kaXZzKShzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcpOworfTsKKworZXh0ZXJuIGludCBzM2NfY3B1ZnJlcV9yZWdpc3RlcihzdHJ1Y3QgczNjX2NwdWZyZXFfaW5mbyAqaW5mbyk7CisKK2V4dGVybiBpbnQgczNjX3BsbHRhYl9yZWdpc3RlcihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnBsbHMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHBsbHNfbm8pOworCisvKiBleHBvcnRzIGFuZCB1dGlsaXRpZXMgZm9yIGRlYnVnZnMgKi8KK2V4dGVybiBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpzM2NfY3B1ZnJlcV9nZXRjb25maWcodm9pZCk7CitleHRlcm4gc3RydWN0IHMzY19pb3RpbWluZ3MgKnMzY19jcHVmcmVxX2dldGlvdGltaW5ncyh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxMF9pb3RpbWluZ19kZWJ1Z2ZzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJCSAgICAgc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAorCQkJCSAgICAgdW5pb24gczNjX2lvYmFuayAqaW9iKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxMl9pb3RpbWluZ19kZWJ1Z2ZzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJCSAgICAgc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAorCQkJCSAgICAgdW5pb24gczNjX2lvYmFuayAqaW9iKTsKKworI2lmZGVmIENPTkZJR19DUFVfRlJFUV9TM0MyNFhYX0RFQlVHRlMKKyNkZWZpbmUgczNjX2NwdWZyZXFfZGVidWdmc19jYWxsKHgpIHgKKyNlbHNlCisjZGVmaW5lIHMzY19jcHVmcmVxX2RlYnVnZnNfY2FsbCh4KSBOVUxMCisjZW5kaWYKKworLyogVXNlZnVsIHV0aWxpdHkgZnVuY3Rpb25zLiAqLworCitleHRlcm4gc3RydWN0IGNsayAqczNjX2NwdWZyZXFfY2xrX2dldChzdHJ1Y3QgZGV2aWNlICosIGNvbnN0IGNoYXIgKik7CisKKy8qIFMzQzI0MTAgYW5kIGNvbXBhdGlibGUgZXhwb3J0ZWQgZnVuY3Rpb25zICovCisKK2V4dGVybiB2b2lkIHMzYzI0MTBfY3B1ZnJlcV9zZXRyZWZyZXNoKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7CitleHRlcm4gdm9pZCBzM2MyNDEwX3NldF9mdmNvKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7CisKKyNpZmRlZiBDT05GSUdfUzNDMjQxMF9JT1RJTUlORworZXh0ZXJuIGludCBzM2MyNDEwX2lvdGltaW5nX2NhbGMoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAorCQkJCSBzdHJ1Y3QgczNjX2lvdGltaW5ncyAqaW90KTsKKworZXh0ZXJuIGludCBzM2MyNDEwX2lvdGltaW5nX2dldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOworCitleHRlcm4gdm9pZCBzM2MyNDEwX2lvdGltaW5nX3NldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICppb3QpOworI2Vsc2UKKyNkZWZpbmUgczNjMjQxMF9pb3RpbWluZ19jYWxjIE5VTEwKKyNkZWZpbmUgczNjMjQxMF9pb3RpbWluZ19nZXQgTlVMTAorI2RlZmluZSBzM2MyNDEwX2lvdGltaW5nX3NldCBOVUxMCisjZW5kaWYgLyogQ09ORklHX1MzQzI0MTBfSU9USU1JTkcgKi8KKworLyogUzNDMjQxMiBjb21wYXRpYmxlIHJvdXRpbmVzICovCisKK2V4dGVybiBpbnQgczNjMjQxMl9pb3RpbWluZ19nZXQoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAorCQkJCXN0cnVjdCBzM2NfaW90aW1pbmdzICp0aW1pbmdzKTsKKworZXh0ZXJuIGludCBzM2MyNDEyX2lvdGltaW5nX2dldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOworCitleHRlcm4gaW50IHMzYzI0MTJfaW90aW1pbmdfY2FsYyhzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICppb3QpOworCitleHRlcm4gdm9pZCBzM2MyNDEyX2lvdGltaW5nX3NldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICppb3QpOworCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfREVCVUcKKyNkZWZpbmUgczNjX2ZyZXFfZGJnKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKKyNlbHNlCisjZGVmaW5lIHMzY19mcmVxX2RiZyh4Li4uKSBkbyB7IGlmICgwKSBwcmludGsoeCk7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfREVCVUcgKi8KKworI2lmZGVmIENPTkZJR19DUFVfRlJFUV9TM0MyNFhYX0lPREVCVUcKKyNkZWZpbmUgczNjX2ZyZXFfaW9kYmcoeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQorI2Vsc2UKKyNkZWZpbmUgczNjX2ZyZXFfaW9kYmcoeC4uLikgZG8geyBpZiAoMCkgcHJpbnRrKHgpOyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENPTkZJR19DUFVfRlJFUV9TM0MyNFhYX0lPREVCVUcgKi8KKworc3RhdGljIGlubGluZSBpbnQgczNjX2NwdWZyZXFfYWRkZnJlcShzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlLAorCQkJCSAgICAgIGludCBpbmRleCwgc2l6ZV90IHRhYmxlX3NpemUsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZyZXEpCit7CisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIGluZGV4OworCisJaWYgKHRhYmxlKSB7CisJCWlmIChpbmRleCA+PSB0YWJsZV9zaXplKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJczNjX2ZyZXFfZGJnKCIlczogeyAlZCA9ICV1IGtIeiB9XG4iLAorCQkJICAgICBfX2Z1bmNfXywgaW5kZXgsIGZyZXEpOworCisJCXRhYmxlW2luZGV4XS5pbmRleCA9IGluZGV4OworCQl0YWJsZVtpbmRleF0uZnJlcXVlbmN5ID0gZnJlcTsKKwl9CisKKwlyZXR1cm4gaW5kZXggKyAxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jcHUuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LmgKaW5kZXggYzBhNTc0MS4uNDBmZDdiNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jcHUuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NwdS5oCkBAIC0xLDkgKzEsMTIgQEAKIC8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LmgKICAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKICAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcwogICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgogICoKLSAqIEhlYWRlciBmaWxlIGZvciBTM0MyNFhYIENQVSBzdXBwb3J0CisgKiBIZWFkZXIgZmlsZSBmb3IgU2Ftc3VuZyBDUFUgc3VwcG9ydAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTUsNiArMTgsMTA4IEBACiAjaWZuZGVmIF9fU0FNU1VOR19QTEFUX0NQVV9ICiAjZGVmaW5lIF9fU0FNU1VOR19QTEFUX0NQVV9ICiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNhbXN1bmdfY3B1X2lkOworCisjZGVmaW5lIFMzQzI0WFhfQ1BVX0lECQkweDMyNDAwMDAwCisjZGVmaW5lIFMzQzI0WFhfQ1BVX01BU0sJMHhGRkYwMDAwMAorCisjZGVmaW5lIFMzQzY0MDBfQ1BVX0lECQkweDM2NDAwMDAwCisjZGVmaW5lIFMzQzY0MTBfQ1BVX0lECQkweDM2NDEwMDAwCisjZGVmaW5lIFMzQzY0WFhfQ1BVX01BU0sJMHhGRkZGRjAwMAorCisjZGVmaW5lIFM1UDY0NDBfQ1BVX0lECQkweDU2NDQwMDAwCisjZGVmaW5lIFM1UDY0NTBfQ1BVX0lECQkweDM2NDUwMDAwCisjZGVmaW5lIFM1UDY0WFhfQ1BVX01BU0sJMHhGRkZGRjAwMAorCisjZGVmaW5lIFM1UEMxMDBfQ1BVX0lECQkweDQzMTAwMDAwCisjZGVmaW5lIFM1UEMxMDBfQ1BVX01BU0sJMHhGRkZGRjAwMAorCisjZGVmaW5lIFM1UFYyMTBfQ1BVX0lECQkweDQzMTEwMDAwCisjZGVmaW5lIFM1UFYyMTBfQ1BVX01BU0sJMHhGRkZGRjAwMAorCisjZGVmaW5lIEVYWU5PUzQyMTBfQ1BVX0lECTB4NDMyMTAwMDAKKyNkZWZpbmUgRVhZTk9TNDIxMl9DUFVfSUQJMHg0MzIyMDAwMAorI2RlZmluZSBFWFlOT1M0NDEyX0NQVV9JRAkweEU0NDEyMjAwCisjZGVmaW5lIEVYWU5PUzRfQ1BVX01BU0sJMHhGRkZFMDAwMAorCisjZGVmaW5lIElTX1NBTVNVTkdfQ1BVKG5hbWUsIGlkLCBtYXNrKQkJXAorc3RhdGljIGlubGluZSBpbnQgaXNfc2Ftc3VuZ18jI25hbWUodm9pZCkJXAorewkJCQkJCVwKKwlyZXR1cm4gKChzYW1zdW5nX2NwdV9pZCAmIG1hc2spID09IChpZCAmIG1hc2spKTsJXAorfQorCitJU19TQU1TVU5HX0NQVShzM2MyNHh4LCBTM0MyNFhYX0NQVV9JRCwgUzNDMjRYWF9DUFVfTUFTSykKK0lTX1NBTVNVTkdfQ1BVKHMzYzY0MDAsIFMzQzY0MDBfQ1BVX0lELCBTM0M2NFhYX0NQVV9NQVNLKQorSVNfU0FNU1VOR19DUFUoczNjNjQxMCwgUzNDNjQxMF9DUFVfSUQsIFMzQzY0WFhfQ1BVX01BU0spCitJU19TQU1TVU5HX0NQVShzNXA2NDQwLCBTNVA2NDQwX0NQVV9JRCwgUzVQNjRYWF9DUFVfTUFTSykKK0lTX1NBTVNVTkdfQ1BVKHM1cDY0NTAsIFM1UDY0NTBfQ1BVX0lELCBTNVA2NFhYX0NQVV9NQVNLKQorSVNfU0FNU1VOR19DUFUoczVwYzEwMCwgUzVQQzEwMF9DUFVfSUQsIFM1UEMxMDBfQ1BVX01BU0spCitJU19TQU1TVU5HX0NQVShzNXB2MjEwLCBTNVBWMjEwX0NQVV9JRCwgUzVQVjIxMF9DUFVfTUFTSykKK0lTX1NBTVNVTkdfQ1BVKGV4eW5vczQyMTAsIEVYWU5PUzQyMTBfQ1BVX0lELCBFWFlOT1M0X0NQVV9NQVNLKQorSVNfU0FNU1VOR19DUFUoZXh5bm9zNDIxMiwgRVhZTk9TNDIxMl9DUFVfSUQsIEVYWU5PUzRfQ1BVX01BU0spCitJU19TQU1TVU5HX0NQVShleHlub3M0NDEyLCBFWFlOT1M0NDEyX0NQVV9JRCwgRVhZTk9TNF9DUFVfTUFTSykKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQxMikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDE2KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQ0MCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDQyKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQ0WCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDQzKQorIyBkZWZpbmUgc29jX2lzX3MzYzI0eHgoKQlpc19zYW1zdW5nX3MzYzI0eHgoKQorI2Vsc2UKKyMgZGVmaW5lIHNvY19pc19zM2MyNHh4KCkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzNDNjQwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzY0MTApCisjIGRlZmluZSBzb2NfaXNfczNjNjR4eCgpCShpc19zYW1zdW5nX3MzYzY0MDAoKSB8fCBpc19zYW1zdW5nX3MzYzY0MTAoKSkKKyNlbHNlCisjIGRlZmluZSBzb2NfaXNfczNjNjR4eCgpCTAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1M1UDY0NDApCisjIGRlZmluZSBzb2NfaXNfczVwNjQ0MCgpCWlzX3NhbXN1bmdfczVwNjQ0MCgpCisjZWxzZQorIyBkZWZpbmUgc29jX2lzX3M1cDY0NDAoKQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TNVA2NDUwKQorIyBkZWZpbmUgc29jX2lzX3M1cDY0NTAoKQlpc19zYW1zdW5nX3M1cDY0NTAoKQorI2Vsc2UKKyMgZGVmaW5lIHNvY19pc19zNXA2NDUwKCkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzVQQzEwMCkKKyMgZGVmaW5lIHNvY19pc19zNXBjMTAwKCkJaXNfc2Ftc3VuZ19zNXBjMTAwKCkKKyNlbHNlCisjIGRlZmluZSBzb2NfaXNfczVwYzEwMCgpCTAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1M1UFYyMTApCisjIGRlZmluZSBzb2NfaXNfczVwdjIxMCgpCWlzX3NhbXN1bmdfczVwdjIxMCgpCisjZWxzZQorIyBkZWZpbmUgc29jX2lzX3M1cHYyMTAoKQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9FWFlOT1M0MjEwKQorIyBkZWZpbmUgc29jX2lzX2V4eW5vczQyMTAoKQlpc19zYW1zdW5nX2V4eW5vczQyMTAoKQorI2Vsc2UKKyMgZGVmaW5lIHNvY19pc19leHlub3M0MjEwKCkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TT0NfRVhZTk9TNDIxMikKKyMgZGVmaW5lIHNvY19pc19leHlub3M0MjEyKCkJaXNfc2Ftc3VuZ19leHlub3M0MjEyKCkKKyNlbHNlCisjIGRlZmluZSBzb2NfaXNfZXh5bm9zNDIxMigpCTAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU09DX0VYWU5PUzQ0MTIpCisjIGRlZmluZSBzb2NfaXNfZXh5bm9zNDQxMigpCWlzX3NhbXN1bmdfZXh5bm9zNDQxMigpCisjZWxzZQorIyBkZWZpbmUgc29jX2lzX2V4eW5vczQ0MTIoKQkwCisjZW5kaWYKKworI2RlZmluZSBFWFlOT1M0MjEwX1JFVl8wCSgweDApCisjZGVmaW5lIEVYWU5PUzQyMTBfUkVWXzFfMAkoMHgxMCkKKyNkZWZpbmUgRVhZTk9TNDIxMF9SRVZfMV8xCSgweDExKQorCiAjZGVmaW5lIElPREVTQ19FTlQoeCkgeyAodW5zaWduZWQgbG9uZylTM0MyNFhYX1ZBXyMjeCwgX19waHlzX3RvX3BmbihTM0MyNFhYX1BBXyMjeCksIFMzQzI0WFhfU1pfIyN4LCBNVF9ERVZJQ0UgfQogCiAjaWZuZGVmIE1IWgpAQCAtNTUsNiArMTYwLDEyIEBACiBleHRlcm4gdm9pZCBzNXBfaW5pdF9pbyhzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywKIAkJCWludCBzaXplLCB2b2lkIF9faW9tZW0gKmNwdWlkX2FkZHIpOwogCitleHRlcm4gdm9pZCBzM2MyNHh4X2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIHZvaWQgczNjNjR4eF9pbml0X2NwdSh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cF9pbml0X2NwdSh2b2lkIF9faW9tZW0gKmNwdWlkX2FkZHIpOworCitleHRlcm4gdW5zaWduZWQgaW50IHNhbXN1bmdfcmV2KHZvaWQpOworCiBleHRlcm4gdm9pZCBzM2MyNHh4X2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOwogCiBleHRlcm4gdm9pZCBzM2MyNHh4X2luaXRfY2xvY2tzKGludCB4dGFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZGV2cy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kZXZzLmgKaW5kZXggMjRlYmIxZS4uYWI2MzNjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kZXZzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kZXZzLmgKQEAgLTMwLDMwICszMCwyNCBAQAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnMzYzI0eHhfdWFydF9kZXZzW107CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqczNjMjR4eF91YXJ0X3NyY1tdOwogCi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RpbWVyW107Ci0KK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX2FjOTc7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9paXMwOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2VfaWlzMTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX2lpc3Y0OwotCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9vbmVuYW5kMTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX3BjbTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9wY20xOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2Vfc3BpMDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX3NwaTE7CiAKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhbXN1bmdfYXNvY19kbWE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYW1zdW5nX2Fzb2NfaWRtYTsKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2VfcGNtMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX3BjbTE7Ci0KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX2FjOTc7Ci0KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdHM7Ci0KK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfYWRjOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9jZmNvbjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfZmI7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWQwOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9vaGNpOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9sY2Q7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3dkdDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHdtb247CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMzsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMjsKQEAgLTYyLDkzICs1Niw5MCBAQAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM1OwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM2OwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM3OwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9ydGM7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2FkYzsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc2RpOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9paXM7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2h3bW9uOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMyOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzM7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2NmY29uOwotCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2xjZDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfbmFuZDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfb2hjaTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfb25lbmFuZDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfcnRjOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9zZGk7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3NwaTA7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3NwaTE7Ci0KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX3NwaTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9zcGkxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2Vfc3BpMjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwaTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9zcGkxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjR4MF9kZXZpY2Vfc3BpMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0eDBfZGV2aWNlX3NwaTE7Ci0KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHdtb247Ci0KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfbmFuZDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfb25lbmFuZDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX29uZW5hbmQxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9vbmVuYW5kOwotCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RzOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV90aW1lcltdOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2JnYWRnZXQ7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3VzYl9oc3VkYzsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdXNiX2hzb3RnOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2JfaHN1ZGM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3dkdDsKIAotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfYWM5NzsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3BjbTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9wY20xOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfcGNtMjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX2lpczA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9paXMxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfaWlzMjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwZGlmOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9laGNpOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWMyOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMzsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltY19tZDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltZDA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2hkbWk7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2kyY19oZG1pcGh5OworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9tZmM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21mY19sOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9tZmNfcjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWlwaV9jc2lzMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWlwaV9jc2lzMTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWl4ZXI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX29uZW5hbmQ7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX3NkbzsKIAotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfYWM5NzsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3BjbTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9wY20xOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfcGNtMjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX2kyczA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9pMnMxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfaTJzMjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3NwZGlmOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfcGRbXTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX2FoY2k7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9kd21jaTsKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ0MF9kZXZpY2VfcGNtOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ0MF9kZXZpY2VfaWlzOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ0MF9kZXZpY2VfcGNtOwogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDUwX2RldmljZV9paXMwOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ1MF9kZXZpY2VfaWlzMTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0NTBfZGV2aWNlX2lpczI7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDUwX2RldmljZV9wY20wOwogCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NHgwX2RldmljZV9zcGkwOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjR4MF9kZXZpY2Vfc3BpMTsKKwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfYWM5NzsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX3BjbTA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9wY20xOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfaWlzMDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX2lpczE7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9paXMyOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfcGNtMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX3BjbTE7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9zcGRpZjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX3NwaTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9zcGkxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2Vfc3BpMjsKIAotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19kZXZpY2Vfa2V5cGFkOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfYWM5NzsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX2lpczA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9paXMxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfaWlzMjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3BjbTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9wY20xOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfcGNtMjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwZGlmOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2Vfc3BpMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwaTE7CiAKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWMxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzM7Ci0KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWZjOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9tZmNfbDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWZjX3I7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21pcGlfY3NpczA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21pcGlfY3NpczE7Ci0KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZWhjaTsKLQorZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfYWM5NzsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX2FoY2k7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9kd21jaTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX2kyczA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9pMnMxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfaTJzMjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3BjbTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9wY20xOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfcGNtMjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3BkW107CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9zcGRpZjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3N5c21tdTsKIAorZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19hc29jX2RtYTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhbXN1bmdfYXNvY19pZG1hOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19kZXZpY2Vfa2V5cGFkOworCiAvKiBzM2MyNDQwIHNwZWNpZmljIGRldmljZXMgKi8KIAogI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEtb3BzLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS1vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzFhMzYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEtb3BzLmgKQEAgLTAsMCArMSw2MyBAQAorLyogYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEtb3BzLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogU2Ftc3VuZyBETUEgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX1NBTVNVTkdfRE1BX09QU19IXworI2RlZmluZSBfX1NBTVNVTkdfRE1BX09QU19IXyBfX0ZJTEVfXworCisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisKK3N0cnVjdCBzYW1zdW5nX2RtYV9wcmVwX2luZm8geworCWVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgY2FwOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbjsKKwlkbWFfYWRkcl90IGJ1ZjsKKwl1bnNpZ25lZCBsb25nIHBlcmlvZDsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwl2b2lkICgqZnApKHZvaWQgKmRhdGEpOworCXZvaWQgKmZwX3BhcmFtOworfTsKKworc3RydWN0IHNhbXN1bmdfZG1hX2luZm8geworCWVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgY2FwOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbjsKKwllbnVtIGRtYV9zbGF2ZV9idXN3aWR0aCB3aWR0aDsKKwlkbWFfYWRkcl90IGZpZm87CisJc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqY2xpZW50OworfTsKKworc3RydWN0IHNhbXN1bmdfZG1hX29wcyB7CisJdW5zaWduZWQgKCpyZXF1ZXN0KShlbnVtIGRtYV9jaCBjaCwgc3RydWN0IHNhbXN1bmdfZG1hX2luZm8gKmluZm8pOworCWludCAoKnJlbGVhc2UpKHVuc2lnbmVkIGNoLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQpOworCWludCAoKnByZXBhcmUpKHVuc2lnbmVkIGNoLCBzdHJ1Y3Qgc2Ftc3VuZ19kbWFfcHJlcF9pbmZvICppbmZvKTsKKwlpbnQgKCp0cmlnZ2VyKSh1bnNpZ25lZCBjaCk7CisJaW50ICgqc3RhcnRlZCkodW5zaWduZWQgY2gpOworCWludCAoKmZsdXNoKSh1bnNpZ25lZCBjaCk7CisJaW50ICgqc3RvcCkodW5zaWduZWQgY2gpOworfTsKKworZXh0ZXJuIHZvaWQgKnNhbXN1bmdfZG1hZGV2X2dldF9vcHModm9pZCk7CitleHRlcm4gdm9pZCAqczNjX2RtYV9nZXRfb3BzKHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKl9fc2Ftc3VuZ19kbWFfZ2V0X29wcyh2b2lkKQoreworCWlmIChzYW1zdW5nX2RtYV9pc19kbWFkZXYoKSkKKwkJcmV0dXJuIHNhbXN1bmdfZG1hZGV2X2dldF9vcHMoKTsKKwllbHNlCisJCXJldHVybiBzM2NfZG1hX2dldF9vcHMoKTsKK30KKworLyoKKyAqIHNhbXN1bmdfZG1hX2dldF9vcHMKKyAqIGdldCB0aGUgc2V0IG9mIHNhbXN1bmcgZG1hIG9wZXJhdGlvbnMKKyAqLworI2RlZmluZSBzYW1zdW5nX2RtYV9nZXRfb3BzKCkgX19zYW1zdW5nX2RtYV9nZXRfb3BzKCkKKworI2VuZGlmIC8qIF9fU0FNU1VOR19ETUFfT1BTX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS1wbDMzMC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEtcGwzMzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTU1ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEtcGwzMzAuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQuCisgKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fRE1BX1BMMzMwX0hfCisjZGVmaW5lIF9fRE1BX1BMMzMwX0hfIF9fRklMRV9fCisKKy8qCisgKiBQTDMzMCBjYW4gYXNzaWduIGFueSBjaGFubmVsIHRvIGNvbW11bmljYXRlIHdpdGgKKyAqIGFueSBvZiB0aGUgcGVyaXBoZXJhbHMgYXR0Y2hlZCB0byB0aGUgRE1BQy4KKyAqIEZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeSBhY3Jvc3MgY2xpZW50IGRyaXZlcnMsCisgKiBXZSBrZWVwIHRoZSBjaGFubmVsIG5hbWVzIHVuY2hhbmdlZCBhbmQgb25seSBhZGQKKyAqIG1pc3NpbmcgcGVyaXBoZXJhbHMgYXJlIGFkZGVkLgorICogT3JkZXIgaXMgbm90IGltcG9ydGFudCBzaW5jZSBETUEgUEwzMzAgQVBJIGRyaXZlcgorICogdXNlIHRoZXNlIGp1c3QgYXMgSURzLgorICovCitlbnVtIGRtYV9jaCB7CisJRE1BQ0hfVUFSVDBfUlgsCisJRE1BQ0hfVUFSVDBfVFgsCisJRE1BQ0hfVUFSVDFfUlgsCisJRE1BQ0hfVUFSVDFfVFgsCisJRE1BQ0hfVUFSVDJfUlgsCisJRE1BQ0hfVUFSVDJfVFgsCisJRE1BQ0hfVUFSVDNfUlgsCisJRE1BQ0hfVUFSVDNfVFgsCisJRE1BQ0hfVUFSVDRfUlgsCisJRE1BQ0hfVUFSVDRfVFgsCisJRE1BQ0hfVUFSVDVfUlgsCisJRE1BQ0hfVUFSVDVfVFgsCisJRE1BQ0hfVVNJX1JYLAorCURNQUNIX1VTSV9UWCwKKwlETUFDSF9JUkRBLAorCURNQUNIX0kyUzBfUlgsCisJRE1BQ0hfSTJTMF9UWCwKKwlETUFDSF9JMlMwU19UWCwKKwlETUFDSF9JMlMxX1JYLAorCURNQUNIX0kyUzFfVFgsCisJRE1BQ0hfSTJTMl9SWCwKKwlETUFDSF9JMlMyX1RYLAorCURNQUNIX1NQSTBfUlgsCisJRE1BQ0hfU1BJMF9UWCwKKwlETUFDSF9TUEkxX1JYLAorCURNQUNIX1NQSTFfVFgsCisJRE1BQ0hfU1BJMl9SWCwKKwlETUFDSF9TUEkyX1RYLAorCURNQUNIX0FDOTdfTUlDSU4sCisJRE1BQ0hfQUM5N19QQ01JTiwKKwlETUFDSF9BQzk3X1BDTU9VVCwKKwlETUFDSF9FWFRFUk5BTCwKKwlETUFDSF9QV00sCisJRE1BQ0hfU1BESUYsCisJRE1BQ0hfSFNJX1JYLAorCURNQUNIX0hTSV9UWCwKKwlETUFDSF9QQ00wX1RYLAorCURNQUNIX1BDTTBfUlgsCisJRE1BQ0hfUENNMV9UWCwKKwlETUFDSF9QQ00xX1JYLAorCURNQUNIX1BDTTJfVFgsCisJRE1BQ0hfUENNMl9SWCwKKwlETUFDSF9NU01fUkVRMywKKwlETUFDSF9NU01fUkVRMiwKKwlETUFDSF9NU01fUkVRMSwKKwlETUFDSF9NU01fUkVRMCwKKwlETUFDSF9TTElNQlVTMF9SWCwKKwlETUFDSF9TTElNQlVTMF9UWCwKKwlETUFDSF9TTElNQlVTMEFVWF9SWCwKKwlETUFDSF9TTElNQlVTMEFVWF9UWCwKKwlETUFDSF9TTElNQlVTMV9SWCwKKwlETUFDSF9TTElNQlVTMV9UWCwKKwlETUFDSF9TTElNQlVTMl9SWCwKKwlETUFDSF9TTElNQlVTMl9UWCwKKwlETUFDSF9TTElNQlVTM19SWCwKKwlETUFDSF9TTElNQlVTM19UWCwKKwlETUFDSF9TTElNQlVTNF9SWCwKKwlETUFDSF9TTElNQlVTNF9UWCwKKwlETUFDSF9TTElNQlVTNV9SWCwKKwlETUFDSF9TTElNQlVTNV9UWCwKKwkvKiBFTkQgTWFya2VyLCBhbHNvIHVzZWQgdG8gZGVub3RlIGEgcmVzZXJ2ZWQgY2hhbm5lbCAqLworCURNQUNIX01BWCwKK307CisKK3N0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgeworCWNoYXIJKm5hbWU7Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wgc2Ftc3VuZ19kbWFfaGFzX2NpcmN1bGFyKHZvaWQpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzYW1zdW5nX2RtYV9pc19kbWFkZXYodm9pZCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworI2luY2x1ZGUgPHBsYXQvZG1hLW9wcy5oPgorCisjZW5kaWYJLyogX19ETUFfUEwzMzBfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLXMzYzI0eHguaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLXMzYzI0eHguaAppbmRleCAzMzZkNWFjLi4xYzFlZDU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS1zM2MyNHh4LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEtczNjMjR4eC5oCkBAIC0xOCwxMSArMTgsNiBAQAogI2RlZmluZSBETUFfQ0hfVkFMSUQJCSgxPDwzMSkKICNkZWZpbmUgRE1BX0NIX05FVkVSCQkoMTw8MzApCiAKLXN0cnVjdCBzM2MyNHh4X2RtYV9hZGRyIHsKLQl1bnNpZ25lZCBsb25nCQlmcm9tOwotCXVuc2lnbmVkIGxvbmcJCXRvOwotfTsKLQogLyogc3RydWN0IHMzYzI0eHhfZG1hX21hcAogICoKICAqIHRoaXMgaG9sZHMgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBjaGFubmVsIHNlbGVjdGVkCkBAIC0zMSw3ICsyNiw2IEBACiAKIHN0cnVjdCBzM2MyNHh4X2RtYV9tYXAgewogCWNvbnN0IGNoYXIJCSpuYW1lOwotCXN0cnVjdCBzM2MyNHh4X2RtYV9hZGRyICBod19hZGRyOwogCiAJdW5zaWduZWQgbG9uZwkJIGNoYW5uZWxzW1MzQ19ETUFfQ0hBTk5FTFNdOwogCXVuc2lnbmVkIGxvbmcJCSBjaGFubmVsc19yeFtTM0NfRE1BX0NIQU5ORUxTXTsKQEAgLTQ3LDcgKzQxLDcgQEAKIAogCXZvaWQJKCpkaXJlY3Rpb24pKHN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuLAogCQkJICAgICBzdHJ1Y3QgczNjMjR4eF9kbWFfbWFwICptYXAsCi0JCQkgICAgIGVudW0gczNjMjQxMF9kbWFzcmMgZGlyKTsKKwkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKTsKIH07CiAKIGV4dGVybiBpbnQgczNjMjR4eF9kbWFfaW5pdF9tYXAoc3RydWN0IHMzYzI0eHhfZG1hX3NlbGVjdGlvbiAqc2VsKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS5oCmluZGV4IDhjMjczYjcuLmI5MDYxMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEuaApAQCAtMTAsMTcgKzEwLDE0IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCiBlbnVtIHMzYzI0MTBfZG1hX2J1ZmZyZXN1bHQgewogCVMzQzI0MTBfUkVTX09LLAogCVMzQzI0MTBfUkVTX0VSUiwKIAlTM0MyNDEwX1JFU19BQk9SVAogfTsKIAotZW51bSBzM2MyNDEwX2RtYXNyYyB7Ci0JUzNDMjQxMF9ETUFTUkNfSFcsCQkvKiBzb3VyY2UgaXMgbWVtb3J5ICovCi0JUzNDMjQxMF9ETUFTUkNfTUVNCQkvKiBzb3VyY2UgaXMgaGFyZHdhcmUgKi8KLX07Ci0KIC8qIGVudW0gczNjMjQxMF9jaGFuX29wCiAgKgogICogb3BlcmF0aW9uIGNvZGVzIHBhc3NlZCB0byB0aGUgRE1BIGNvZGUgYnkgdGhlIHVzZXIsIGFuZCBhbHNvIHVzZWQKQEAgLTExMiw3ICsxMDksNyBAQAogKi8KIAogZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9kZXZjb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwKLQkJZW51bSBzM2MyNDEwX2RtYXNyYyBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgZGV2YWRkcik7CisJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBkZXZhZGRyKTsKIAogLyogczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24KICAqCkBAIC0xMjYsMyArMTIzLDQgQEAKIGV4dGVybiBpbnQgczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKGVudW0gZG1hX2NoLCBzM2MyNDEwX2RtYV9jYmZuX3QgcnRuKTsKIAogCisjaW5jbHVkZSA8cGxhdC9kbWEtb3BzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2VoY2kuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZWhjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjhjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2VoY2kuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3I6IEpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19QTEFUX1NBTVNVTkdfRUhDSV9ICisjZGVmaW5lIF9fUExBVF9TQU1TVU5HX0VIQ0lfSCBfX0ZJTEVfXworCitzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgeworCWludCAoKnBoeV9pbml0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgdHlwZSk7CisJaW50ICgqcGh5X2V4aXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCB0eXBlKTsKK307CisKK2V4dGVybiB2b2lkIHM1cF9laGNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgKnBkKTsKKworI2VuZGlmIC8qIF9fUExBVF9TQU1TVU5HX0VIQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9leHlub3M0LmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2V4eW5vczQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTQ2ZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9leHlub3M0LmgKQEAgLTAsMCArMSwzNSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9leHlub3M0LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgZXh5bm9zNCBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisvKiBDb21tb24gaW5pdCBjb2RlIGZvciBFWFlOT1M0IHJlbGF0ZWQgU29DcyAqLworCitleHRlcm4gdm9pZCBleHlub3M0X2NvbW1vbl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKK2V4dGVybiB2b2lkIGV4eW5vczRfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOworZXh0ZXJuIHZvaWQgZXh5bm9zNDIxMF9yZWdpc3Rlcl9jbG9ja3Modm9pZCk7CitleHRlcm4gdm9pZCBleHlub3M0MjEyX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKTsKK2V4dGVybiB2b2lkIGV4eW5vczRfc2V0dXBfY2xvY2tzKHZvaWQpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfRVhZTk9TCitleHRlcm4gIGludCBleHlub3NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGV4eW5vczRfaW5pdF9pcnEodm9pZCk7CitleHRlcm4gdm9pZCBleHlub3M0X21hcF9pbyh2b2lkKTsKK2V4dGVybiB2b2lkIGV4eW5vczRfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgZXh5bm9zNF90aW1lcjsKKworI2RlZmluZSBleHlub3M0X2luaXRfdWFydHMgZXh5bm9zNF9jb21tb25faW5pdF91YXJ0cworCisjZWxzZQorI2RlZmluZSBleHlub3M0X2luaXRfY2xvY2tzIE5VTEwKKyNkZWZpbmUgZXh5bm9zNF9pbml0X3VhcnRzIE5VTEwKKyNkZWZpbmUgZXh5bm9zNF9tYXBfaW8gTlVMTAorI2RlZmluZSBleHlub3NfaW5pdCBOVUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZmItczNjMjQxMC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9mYi1zM2MyNDEwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1ZDk1OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZmItczNjMjQxMC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZmItczNjMjQxMC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKgorICogSW5zcGlyZWQgYnkgcHhhZmIuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX1BMQVRfRkJfUzNDMjQxMF9ICisjZGVmaW5lIF9fQVNNX1BMQVRfRkJfUzNDMjQxMF9IIF9fRklMRV9fCisKK3N0cnVjdCBzM2MyNDEwZmJfaHcgeworCXVuc2lnbmVkIGxvbmcJbGNkY29uMTsKKwl1bnNpZ25lZCBsb25nCWxjZGNvbjI7CisJdW5zaWduZWQgbG9uZwlsY2Rjb24zOworCXVuc2lnbmVkIGxvbmcJbGNkY29uNDsKKwl1bnNpZ25lZCBsb25nCWxjZGNvbjU7Cit9OworCisvKiBMQ0QgZGVzY3JpcHRpb24gKi8KK3N0cnVjdCBzM2MyNDEwZmJfZGlzcGxheSB7CisJLyogTENEIHR5cGUgKi8KKwl1bnNpZ25lZCB0eXBlOworCisJLyogU2NyZWVuIHNpemUgKi8KKwl1bnNpZ25lZCBzaG9ydCB3aWR0aDsKKwl1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7CisKKwkvKiBTY3JlZW4gaW5mbyAqLworCXVuc2lnbmVkIHNob3J0IHhyZXM7CisJdW5zaWduZWQgc2hvcnQgeXJlczsKKwl1bnNpZ25lZCBzaG9ydCBicHA7CisKKwl1bnNpZ25lZCBwaXhjbG9jazsJCS8qIHBpeGNsb2NrIGluIHBpY29zZWNvbmRzICovCisJdW5zaWduZWQgc2hvcnQgbGVmdF9tYXJnaW47ICAvKiB2YWx1ZSBpbiBwaXhlbHMgKFRGVCkgb3IgSENMS3MgKFNUTikgKi8KKwl1bnNpZ25lZCBzaG9ydCByaWdodF9tYXJnaW47IC8qIHZhbHVlIGluIHBpeGVscyAoVEZUKSBvciBIQ0xLcyAoU1ROKSAqLworCXVuc2lnbmVkIHNob3J0IGhzeW5jX2xlbjsgICAgLyogdmFsdWUgaW4gcGl4ZWxzIChURlQpIG9yIEhDTEtzIChTVE4pICovCisJdW5zaWduZWQgc2hvcnQgdXBwZXJfbWFyZ2luOwkvKiB2YWx1ZSBpbiBsaW5lcyAoVEZUKSBvciAwIChTVE4pICovCisJdW5zaWduZWQgc2hvcnQgbG93ZXJfbWFyZ2luOwkvKiB2YWx1ZSBpbiBsaW5lcyAoVEZUKSBvciAwIChTVE4pICovCisJdW5zaWduZWQgc2hvcnQgdnN5bmNfbGVuOwkvKiB2YWx1ZSBpbiBsaW5lcyAoVEZUKSBvciAwIChTVE4pICovCisKKwkvKiBsY2QgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nCWxjZGNvbjU7Cit9OworCitzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyB7CisKKwlzdHJ1Y3QgczNjMjQxMGZiX2Rpc3BsYXkgKmRpc3BsYXlzOwkvKiBhdHRhY2hlZCBkaXBsYXlzIGluZm8gKi8KKwl1bnNpZ25lZCBudW1fZGlzcGxheXM7CQkJLyogbnVtYmVyIG9mIGRlZmluZWQgZGlzcGxheXMgKi8KKwl1bnNpZ25lZCBkZWZhdWx0X2Rpc3BsYXk7CisKKwkvKiBHUElPcyAqLworCisJdW5zaWduZWQgbG9uZwlncGN1cDsKKwl1bnNpZ25lZCBsb25nCWdwY3VwX21hc2s7CisJdW5zaWduZWQgbG9uZwlncGNjb247CisJdW5zaWduZWQgbG9uZwlncGNjb25fbWFzazsKKwl1bnNpZ25lZCBsb25nCWdwZHVwOworCXVuc2lnbmVkIGxvbmcJZ3BkdXBfbWFzazsKKwl1bnNpZ25lZCBsb25nCWdwZGNvbjsKKwl1bnNpZ25lZCBsb25nCWdwZGNvbl9tYXNrOworCisJLyogbHBjMzYwMCBjb250cm9sIHJlZ2lzdGVyICovCisJdW5zaWduZWQgbG9uZwlscGNzZWw7Cit9OworCitleHRlcm4gdm9pZCBfX2luaXQgczNjMjR4eF9mYl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gKik7CisKKyNlbmRpZiAvKiBfX0FTTV9QTEFUX0ZCX1MzQzI0MTBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9mYi5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9mYi5oCmluZGV4IDAxZjEwZTQuLjBmZWRmNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZmIuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2ZiLmgKQEAgLTEwOSw0ICsxMDksMTEgQEAKICAqLwogZXh0ZXJuIHZvaWQgZXh5bm9zNF9maW1kMF9ncGlvX3NldHVwXzI0YnBwKHZvaWQpOwogCisvKioKKyAqIHM1cDY0eDBfZmJfZ3Bpb19zZXR1cF8yNGJwcCgpIC0gUzVQNjQ0MC9TNVA2NDUwIHNldHVwIGZ1bmN0aW9uIGZvciAyNGJwcCBMQ0QKKyAqCisgKiBJbml0aWFsaXNlIHRoZSBHUElPIGZvciBhbiAyNGJwcCBMQ0QgZGlzcGxheSBvbiB0aGUgUkdCIGludGVyZmFjZS4KKyAqLworZXh0ZXJuIHZvaWQgczVwNjR4MF9mYl9ncGlvX3NldHVwXzI0YnBwKHZvaWQpOworCiAjZW5kaWYgLyogX19QTEFUX1MzQ19GQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2ZpcS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9maXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzVkMDZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9maXEuaApAQCAtMCwwICsxLDEzIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2ZpcS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEhlYWRlciBmaWxlIGZvciBTM0MyNFhYIENQVSBGSVEgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCitleHRlcm4gaW50IHMzYzI0eHhfc2V0X2ZpcSh1bnNpZ25lZCBpbnQgaXJxLCBib29sIG9uKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZ3Bpby1jZmctaGVscGVycy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXJzLmgKaW5kZXggOWE0ZTUzZC4uYTE4MWQ3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXJzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXJzLmgKQEAgLTEsMTEgKzEsMTEgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXIuaAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXIuaAogICoKICAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCiAgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKICAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCiAgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CiAgKgotICogUzNDIFBsYXRmb3JtIC0gR1BJTyBwaW4gY29uZmlndXJhdGlvbiBoZWxwZXIgZGVmaW5pdGlvbnMKKyAqIFNhbXN1bmcgUGxhdGZvcm0gLSBHUElPIHBpbiBjb25maWd1cmF0aW9uIGhlbHBlciBkZWZpbml0aW9ucwogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMjQsMTIwICsyNCwzMCBAQAogICogYnkgZGlzYWJsaW5nIGludGVycnVwdHMuCiAqLwogCi1zdGF0aWMgaW5saW5lIGludCBzM2NfZ3Bpb19kb19zZXRjZmcoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY29uZmlnKQorc3RhdGljIGlubGluZSBpbnQgc2Ftc3VuZ19ncGlvX2RvX3NldGNmZyhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCSB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY29uZmlnKQogewogCXJldHVybiAoY2hpcC0+Y29uZmlnLT5zZXRfY29uZmlnKShjaGlwLCBvZmYsIGNvbmZpZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgczNjX2dwaW9fZG9fZ2V0Y2ZnKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgIHVuc2lnbmVkIGludCBvZmYpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNhbXN1bmdfZ3Bpb19kb19nZXRjZmcoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgb2ZmKQogewogCXJldHVybiAoY2hpcC0+Y29uZmlnLT5nZXRfY29uZmlnKShjaGlwLCBvZmYpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzM2NfZ3Bpb19kb19zZXRwdWxsKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKQorc3RhdGljIGlubGluZSBpbnQgc2Ftc3VuZ19ncGlvX2RvX3NldHB1bGwoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgIHVuc2lnbmVkIGludCBvZmYsIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCkKIHsKIAlyZXR1cm4gKGNoaXAtPmNvbmZpZy0+c2V0X3B1bGwpKGNoaXAsIG9mZiwgcHVsbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2RvX2dldHB1bGwoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCQkgIHVuc2lnbmVkIGludCBvZmYpCitzdGF0aWMgaW5saW5lIHNhbXN1bmdfZ3Bpb19wdWxsX3Qgc2Ftc3VuZ19ncGlvX2RvX2dldHB1bGwoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJCSAgdW5zaWduZWQgaW50IG9mZikKIHsKIAlyZXR1cm4gY2hpcC0+Y29uZmlnLT5nZXRfcHVsbChjaGlwLCBvZmYpOwogfQogCi0vKioKLSAqIHMzY19ncGlvX3NldGNmZ19zM2MyNHh4IC0gUzNDMjRYWCBzdHlsZSBHUElPIGNvbmZpZ3VyYXRpb24uCi0gKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCi0gKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgotICogQGNmZzogVGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgdG8gc2V0LgotICoKLSAqIFRoaXMgaGVscGVyIGRlYWwgd2l0aCB0aGUgR1BJTyBjYXNlcyB3aGVyZSB0aGUgY29udHJvbCByZWdpc3RlcgotICogaGFzIHR3byBiaXRzIG9mIGNvbmZpZ3VyYXRpb24gcGVyIGdwaW8sIHdoaWNoIGhhdmUgdGhlIGZvbGxvd2luZwotICogZnVuY3Rpb25zOgotICoJMDAgPSBpbnB1dAotICoJMDEgPSBvdXRwdXQKLSAqCTF4ID0gc3BlY2lhbCBmdW5jdGlvbgotKi8KLWV4dGVybiBpbnQgczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHgoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGNmZyk7Ci0KLS8qKgotICogczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHggLSBTM0MyNFhYIHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbiByZWFkLgotICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgotICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KLSAqCi0gKiBUaGUgcmV2ZXJzZSBvZiBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eCgpLiBXaWxsIHJldHVybiBhIHZhbHVlIHdoaWNnCi0gKiBjb3VsZCBiZSBkaXJlY3RseSBwYXNzZWQgYmFjayB0byBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eCgpLCBmcm9tIHRoZQotICogUzNDX0dQSU9fU1BFQ0lBTCgpIG1hY3JvLgotICovCi11bnNpZ25lZCBpbnQgczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHgoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgb2ZmKTsKLQotLyoqCi0gKiBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eF9hIC0gUzNDMjRYWCBzdHlsZSBHUElPIGNvbmZpZ3VyYXRpb24gKEJhbmsgQSkKLSAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KLSAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCi0gKiBAY2ZnOiBUaGUgY29uZmlndXJhdGlvbiB2YWx1ZSB0byBzZXQuCi0gKgotICogVGhpcyBoZWxwZXIgZGVhbCB3aXRoIHRoZSBHUElPIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIHJlZ2lzdGVyCi0gKiBoYXMgb25lIGJpdCBvZiBjb25maWd1cmF0aW9uIGZvciB0aGUgZ3Bpbywgd2hlcmUgc2V0dGluZyB0aGUgYml0Ci0gKiBtZWFucyB0aGUgcGluIGlzIGluIHNwZWNpYWwgZnVuY3Rpb24gbW9kZSBhbmQgdW5zZXQgbWVhbnMgb3V0cHV0LgotKi8KLWV4dGVybiBpbnQgczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHhfYShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjZmcpOwotCi0KLS8qKgotICogczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHhfYSAtIFMzQzI0WFggc3R5bGUgR1BJTyBjb25maWd1cmF0aW9uIHJlYWQgKEJhbmsgQSkKLSAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KLSAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCi0gKgotICogVGhlIHJldmVyc2Ugb2YgczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHhfYSgpIHR1cm5pbmcgYW4gR1BJTyBpbnRvIGEgdXNhYmxlCi0gKiBHUElPIGNvbmZpZ3VyYXRpb24gdmFsdWUuCi0gKgotICogQHNhIHMzY19ncGlvX2dldGNmZ19zM2MyNHh4Ci0gKiBAc2EgczNjX2dwaW9fZ2V0Y2ZnX3MzYzY0eHhfNGJpdAotICovCi1leHRlcm4gdW5zaWduZWQgczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHhfYShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJICB1bnNpZ25lZCBpbnQgb2ZmKTsKLQotLyoqCi0gKiBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0IC0gUzNDNjRYWCA0Yml0IHNpbmdsZSByZWdpc3RlciBHUElPIGNvbmZpZy4KLSAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KLSAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCi0gKiBAY2ZnOiBUaGUgY29uZmlndXJhdGlvbiB2YWx1ZSB0byBzZXQuCi0gKgotICogVGhpcyBoZWxwZXIgZGVhbCB3aXRoIHRoZSBHUElPIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIHJlZ2lzdGVyIGhhcyA0IGJpdHMKLSAqIG9mIGNvbnRyb2wgcGVyIEdQSU8sIGdlbmVyYWxseSBpbiB0aGUgZm9ybSBvZjoKLSAqCTAwMDAgPSBJbnB1dAotICoJMDAwMSA9IE91dHB1dAotICoJb3RoZXJzID0gU3BlY2lhbCBmdW5jdGlvbnMgKGRlcGVuZGVudCBvbiBiYW5rKQotICoKLSAqIE5vdGUsIHNpbmNlIHRoZSBjb2RlIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgdHdvIGNvbnRyb2wKLSAqIHJlZ2lzdGVycyBpbnN0ZWFkIG9mIG9uZSwgd2UgZG8gbm90IGhhdmUgYSBzZXBhcmF0ZSBzZXQgb2YgZnVuY3Rpb25zIGZvcgotICogZWFjaCBjYXNlLgotKi8KLWV4dGVybiBpbnQgczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGNmZyk7Ci0KLQotLyoqCi0gKiBzM2NfZ3Bpb19nZXRjZmdfczNjNjR4eF80Yml0IC0gUzNDNjRYWCA0Yml0IHNpbmdsZSByZWdpc3RlciBHUElPIGNvbmZpZyByZWFkLgotICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgotICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KLSAqCi0gKiBUaGUgcmV2ZXJzZSBvZiBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0KCksIHR1cm5pbmcgYSBncGlvIGNvbmZpZ3VyYXRpb24KLSAqIHJlZ2lzdGVyIHNldHRpbmcgaW50byBhIHZhbHVlIHRoZSBzb2Z0d2FyZSBjYW4gdXNlLCBzdWNoIGFzIGNvdWxkIGJlIHBhc3NlZAotICogdG8gczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdCgpLgotICoKLSAqIEBzYSBzM2NfZ3Bpb19nZXRjZmdfczNjMjR4eAotICovCi1leHRlcm4gdW5zaWduZWQgczNjX2dwaW9fZ2V0Y2ZnX3MzYzY0eHhfNGJpdChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgb2ZmKTsKLQogLyogUHVsbC17dXAsZG93bn0gcmVzaXN0b3IgY29udHJvbHMuCiAgKgogICogUzNDMjQxMCxTM0MyNDQwID0gUHVsbC1VUCwKQEAgLTE0Nyw3ICs1Nyw3IEBACiAgKi8KIAogLyoqCi0gKiBzM2NfZ3Bpb19zZXRwdWxsXzF1cCgpIC0gUHVsbCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgdXAgb3Igbm9uZS4KKyAqIHMzYzI0eHhfZ3Bpb19zZXRwdWxsXzF1cCgpIC0gUHVsbCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgdXAgb3Igbm9uZS4KICAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KICAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCiAgKiBAcGFyYW06IHB1bGw6IFRoZSBwdWxsIG1vZGUgYmVpbmcgcmVxdWVzdGVkLgpAQCAtMTU1LDExICs2NSwxMSBAQAogICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBHUElPcyB3aXRoIG9uZQogICogYml0IGNvbmZpZ3VyaW5nIHRoZSBwcmVzZW5jZSBvZiBhIHB1bGwtdXAgcmVzaXN0b3IuCiAgKi8KLWV4dGVybiBpbnQgczNjX2dwaW9fc2V0cHVsbF8xdXAoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpOworZXh0ZXJuIGludCBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xdXAoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmLCBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpOwogCiAvKioKLSAqIHMzY19ncGlvX3NldHB1bGxfMWRvd24oKSAtIFB1bGwgY29uZmlndXJhdGlvbiBmb3IgY2hvaWNlIG9mIGRvd24gb3Igbm9uZQorICogczNjMjR4eF9ncGlvX3NldHB1bGxfMWRvd24oKSAtIFB1bGwgY29uZmlndXJhdGlvbiBmb3IgY2hvaWNlIG9mIGRvd24gb3Igbm9uZQogICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkCiAgKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkCiAgKiBAcGFyYW06IHB1bGw6IFRoZSBwdWxsIG1vZGUgYmVpbmcgcmVxdWVzdGVkCkBAIC0xNjcsMTEgKzc3LDEzIEBACiAgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIEdQSU9zIHdpdGggb25lCiAgKiBiaXQgY29uZmlndXJpbmcgdGhlIHByZXNlbmNlIG9mIGEgcHVsbC1kb3duIHJlc2lzdG9yLgogICovCi1leHRlcm4gaW50IHMzY19ncGlvX3NldHB1bGxfMWRvd24oc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJICB1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCk7CitleHRlcm4gaW50IHMzYzI0eHhfZ3Bpb19zZXRwdWxsXzFkb3duKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgb2ZmLCBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpOwogCiAvKioKLSAqIHMzY19ncGlvX3NldHB1bGxfdXBvd24oKSAtIFB1bGwgY29uZmlndXJhdGlvbiBmb3IgY2hvaWNlIG9mIHVwLCBkb3duIG9yIG5vbmUKKyAqIHNhbXN1bmdfZ3Bpb19zZXRwdWxsX3Vwb3duKCkgLSBQdWxsIGNvbmZpZ3VyYXRpb24gZm9yIGNob2ljZSBvZiB1cCwKKyAqIGRvd24gb3Igbm9uZQorICoKICAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KICAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCiAgKiBAcGFyYW06IHB1bGw6IFRoZSBwdWxsIG1vZGUgYmVpbmcgcmVxdWVzdGVkLgpAQCAtMTgzLDQ1ICs5NSw0NiBAQAogICoJMDEgPSBQdWxsLXVwIHJlc2lzdG9yIGNvbm5lY3RlZAogICoJMTAgPSBQdWxsLWRvd24gcmVzaXN0b3IgY29ubmVjdGVkCiAgKi8KLWV4dGVybiBpbnQgczNjX2dwaW9fc2V0cHVsbF91cGRvd24oc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpOwotCitleHRlcm4gaW50IHNhbXN1bmdfZ3Bpb19zZXRwdWxsX3VwZG93bihzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmYsIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCk7CiAKIC8qKgotICogczNjX2dwaW9fZ2V0cHVsbF91cGRvd24oKSAtIEdldCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgdXAsIGRvd24gb3Igbm9uZQorICogc2Ftc3VuZ19ncGlvX2dldHB1bGxfdXBkb3duKCkgLSBHZXQgY29uZmlndXJhdGlvbiBmb3IgY2hvaWNlIG9mIHVwLAorICogZG93biBvciBub25lCisgKgogICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCB0aGUgR1BJTyBwaW4gYmVsb25ncyB0bwogICogQG9mZjogVGhlIG9mZnNldCB0byB0aGUgcGluIHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiBvZi4KICAqCi0gKiBUaGlzIGhlbHBlciBmdW5jdGlvbiByZWFkcyB0aGUgc3RhdGUgb2YgdGhlIHB1bGwte3VwLGRvd259IHJlc2lzdG9yIGZvciB0aGUKLSAqIGdpdmVuIEdQSU8gaW4gdGhlIHNhbWUgY2FzZSBhcyBzM2NfZ3Bpb19zZXRwdWxsX3Vwb3duLgorICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmVhZHMgdGhlIHN0YXRlIG9mIHRoZSBwdWxsLXt1cCxkb3dufSByZXNpc3RvcgorICogZm9yIHRoZSBnaXZlbiBHUElPIGluIHRoZSBzYW1lIGNhc2UgYXMgc2Ftc3VuZ19ncGlvX3NldHB1bGxfdXBvd24uCiAqLwotZXh0ZXJuIHMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93bihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmYpOworZXh0ZXJuIHNhbXN1bmdfZ3Bpb19wdWxsX3Qgc2Ftc3VuZ19ncGlvX2dldHB1bGxfdXBkb3duKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2ZmKTsKIAogLyoqCi0gKiBzM2NfZ3Bpb19nZXRwdWxsXzF1cCgpIC0gR2V0IGNvbmZpZ3VyYXRpb24gZm9yIGNob2ljZSBvZiB1cCBvciBub25lCisgKiBzM2MyNHh4X2dwaW9fZ2V0cHVsbF8xdXAoKSAtIEdldCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgdXAgb3Igbm9uZQogICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCB0aGUgR1BJTyBwaW4gYmVsb25ncyB0bwogICogQG9mZjogVGhlIG9mZnNldCB0byB0aGUgcGluIHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiBvZi4KICAqCiAgKiBUaGlzIGhlbHBlciBmdW5jdGlvbiByZWFkcyB0aGUgc3RhdGUgb2YgdGhlIHB1bGwtdXAgcmVzaXN0b3IgZm9yIHRoZQotICogZ2l2ZW4gR1BJTyBpbiB0aGUgc2FtZSBjYXNlIGFzIHMzY19ncGlvX3NldHB1bGxfMXVwLgorICogZ2l2ZW4gR1BJTyBpbiB0aGUgc2FtZSBjYXNlIGFzIHMzYzI0eHhfZ3Bpb19zZXRwdWxsXzF1cC4KICovCi1leHRlcm4gczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfMXVwKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgICAgdW5zaWduZWQgaW50IG9mZik7CitleHRlcm4gc2Ftc3VuZ19ncGlvX3B1bGxfdCBzM2MyNHh4X2dwaW9fZ2V0cHVsbF8xdXAoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCBvZmYpOwogCiAvKioKLSAqIHMzY19ncGlvX2dldHB1bGxfMWRvd24oKSAtIEdldCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgZG93biBvciBub25lCisgKiBzM2MyNHh4X2dwaW9fZ2V0cHVsbF8xZG93bigpIC0gR2V0IGNvbmZpZ3VyYXRpb24gZm9yIGNob2ljZSBvZiBkb3duIG9yIG5vbmUKICAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgdGhlIEdQSU8gcGluIGJlbG9uZ3MgdG8KICAqIEBvZmY6IFRoZSBvZmZzZXQgdG8gdGhlIHBpbiB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YuCiAgKgogICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmVhZHMgdGhlIHN0YXRlIG9mIHRoZSBwdWxsLWRvd24gcmVzaXN0b3IgZm9yIHRoZQotICogZ2l2ZW4gR1BJTyBpbiB0aGUgc2FtZSBjYXNlIGFzIHMzY19ncGlvX3NldHB1bGxfMWRvd24uCisgKiBnaXZlbiBHUElPIGluIHRoZSBzYW1lIGNhc2UgYXMgczNjMjR4eF9ncGlvX3NldHB1bGxfMWRvd24uCiAqLwotZXh0ZXJuIHMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsXzFkb3duKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgICAgdW5zaWduZWQgaW50IG9mZik7CitleHRlcm4gc2Ftc3VuZ19ncGlvX3B1bGxfdCBzM2MyNHh4X2dwaW9fZ2V0cHVsbF8xZG93bihzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgb2ZmKTsKIAogLyoqCi0gKiBzM2NfZ3Bpb19zZXRwdWxsX3MzYzI0NDMoKSAtIFB1bGwgY29uZmlndXJhdGlvbiBmb3IgczNjMjQ0My4KKyAqIHMzYzI0NDNfZ3Bpb19zZXRwdWxsKCkgLSBQdWxsIGNvbmZpZ3VyYXRpb24gZm9yIHMzYzI0NDMuCiAgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCiAgKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgogICogQHBhcmFtOiBwdWxsOiBUaGUgcHVsbCBtb2RlIGJlaW5nIHJlcXVlc3RlZC4KQEAgLTIzMywxOSArMTQ2LDE4IEBACiAgKgkxMCA9IFB1bGwtZG93biByZXNpc3RvciBjb25uZWN0ZWQKICAqCXgxID0gTm8gcHVsbCB1cCByZXNpc3RvcgogICovCi1leHRlcm4gaW50IHMzY19ncGlvX3NldHB1bGxfczNjMjQ0MyhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpOworZXh0ZXJuIGludCBzM2MyNDQzX2dwaW9fc2V0cHVsbChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJdW5zaWduZWQgaW50IG9mZiwgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKTsKIAogLyoqCi0gKiBzM2NfZ3Bpb19nZXRwdWxsX3MzYzI0NDMoKSAtIEdldCBjb25maWd1cmF0aW9uIGZvciBzM2MyNDQzIHB1bGwgcmVzaXN0b3JzCisgKiBzM2MyNDQzX2dwaW9fZ2V0cHVsbCgpIC0gR2V0IGNvbmZpZ3VyYXRpb24gZm9yIHMzYzI0NDMgcHVsbCByZXNpc3RvcnMKICAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgdGhlIEdQSU8gcGluIGJlbG9uZ3MgdG8uCiAgKiBAb2ZmOiBUaGUgb2Zmc2V0IHRvIHRoZSBwaW4gdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uIG9mLgogICoKICAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJlYWRzIHRoZSBzdGF0ZSBvZiB0aGUgcHVsbC17dXAsZG93bn0gcmVzaXN0b3IgZm9yIHRoZQotICogZ2l2ZW4gR1BJTyBpbiB0aGUgc2FtZSBjYXNlIGFzIHMzY19ncGlvX3NldHB1bGxfdXBvd24uCisgKiBnaXZlbiBHUElPIGluIHRoZSBzYW1lIGNhc2UgYXMgc2Ftc3VuZ19ncGlvX3NldHB1bGxfdXBvd24uCiAqLwotZXh0ZXJuIHMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsX3MzYzI0NDMoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCitleHRlcm4gc2Ftc3VuZ19ncGlvX3B1bGxfdCBzM2MyNDQzX2dwaW9fZ2V0cHVsbChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCiAJCQkJCQl1bnNpZ25lZCBpbnQgb2ZmKTsKIAogI2VuZGlmIC8qIF9fUExBVF9HUElPX0NGR19IRUxQRVJTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy5oCmluZGV4IDE3NjJkY2IuLmQ0ODI0NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZ3Bpby1jZmcuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY2ZnLmgKQEAgLTI0LDE0ICsyNCwxNCBAQAogI2lmbmRlZiBfX1BMQVRfR1BJT19DRkdfSAogI2RlZmluZSBfX1BMQVRfR1BJT19DRkdfSCBfX0ZJTEVfXwogCi10eXBlZGVmIHVuc2lnbmVkIGludCBfX2JpdHdpc2VfXyBzM2NfZ3Bpb19wdWxsX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX2JpdHdpc2VfXyBzYW1zdW5nX2dwaW9fcHVsbF90OwogdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19iaXR3aXNlX18gczVwX2dwaW9fZHJ2c3RyX3Q7CiAKIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gaWYgZ3Bpby1jb3JlLmggaGFzbid0IGJlZW4gaW5jbHVkZWQgKi8KLXN0cnVjdCBzM2NfZ3Bpb19jaGlwOworc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwOwogCiAvKioKLSAqIHN0cnVjdCBzM2NfZ3Bpb19jZmcgR1BJTyBjb25maWd1cmF0aW9uCisgKiBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NmZyBHUElPIGNvbmZpZ3VyYXRpb24KICAqIEBjZmdfZWludDogQ29uZmlndXJhdGlvbiBzZXR0aW5nIHdoZW4gdXNlZCBmb3IgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZQogICogQGdldF9wdWxsOiBSZWFkIHRoZSBjdXJyZW50IHB1bGwgY29uZmlndXJhdGlvbiBmb3IgdGhlIEdQSU8KICAqIEBzZXRfcHVsbDogU2V0IHRoZSBjdXJyZW50IHB1bGwgY29uZmlndXJhaXRvbiBmb3IgdGhlIEdQSU8KQEAgLTQ0LDIwICs0NCwyMCBAQAogICogcGVyLWJhbmsgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0aGF0IG90aGVyIHN5c3RlbXMgc3VjaCBhcyB0aGUKICAqIGV4dGVybmFsIGludGVycnVwdCBjb2RlIHdpbGwgbmVlZC4KICAqCi0gKiBAc2EgczNjX2dwaW9fY2ZncGluCisgKiBAc2Egc2Ftc3VuZ19ncGlvX2NmZ3BpbgogICogQHNhIHMzY19ncGlvX2dldGNmZwogICogQHNhIHMzY19ncGlvX3NldHB1bGwKICAqIEBzYSBzM2NfZ3Bpb19nZXRwdWxsCiAgKi8KLXN0cnVjdCBzM2NfZ3Bpb19jZmcgeworc3RydWN0IHNhbXN1bmdfZ3Bpb19jZmcgewogCXVuc2lnbmVkIGludAljZmdfZWludDsKIAotCXMzY19ncGlvX3B1bGxfdAkoKmdldF9wdWxsKShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmcyk7Ci0JaW50CQkoKnNldF9wdWxsKShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2ZmcywKLQkJCQkgICAgczNjX2dwaW9fcHVsbF90IHB1bGwpOworCXNhbXN1bmdfZ3Bpb19wdWxsX3QJKCpnZXRfcHVsbCkoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzKTsKKwlpbnQJCSgqc2V0X3B1bGwpKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2ZmcywKKwkJCQkgICAgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKTsKIAotCXVuc2lnbmVkICgqZ2V0X2NvbmZpZykoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnMpOwotCWludAkgKCpzZXRfY29uZmlnKShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2ZmcywKKwl1bnNpZ25lZCAoKmdldF9jb25maWcpKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmcyk7CisJaW50CSAoKnNldF9jb25maWcpKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2ZmcywKIAkJCSAgICAgICB1bnNpZ25lZCBjb25maWcpOwogfTsKIApAQCAtNjksNyArNjksNyBAQAogI2RlZmluZSBTM0NfR1BJT19PVVRQVVQJKFMzQ19HUElPX1NQRUNJQUwoMSkpCiAjZGVmaW5lIFMzQ19HUElPX1NGTih4KQkoUzNDX0dQSU9fU1BFQ0lBTCh4KSkKIAotI2RlZmluZSBzM2NfZ3Bpb19pc19jZmdfc3BlY2lhbChfY2ZnKSBcCisjZGVmaW5lIHNhbXN1bmdfZ3Bpb19pc19jZmdfc3BlY2lhbChfY2ZnKSBcCiAJKCgoX2NmZykgJiBTM0NfR1BJT19TUEVDSUFMX01BUkspID09IFMzQ19HUElPX1NQRUNJQUxfTUFSSykKIAogLyoqCkBAIC0xMjgsOSArMTI4LDkgQEAKICAqIHVwIG9yIGRvd24gc2V0dGluZ3MsIGFuZCBpdCBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBjaGlwIHRoYXQgaXMgYmVpbmcKICAqIHVzZWQgdG8gd2hldGhlciB0aGUgcGFydGljdWxhciBtb2RlIGlzIGF2YWlsYWJsZS4KICAqLwotI2RlZmluZSBTM0NfR1BJT19QVUxMX05PTkUJKChfX2ZvcmNlIHMzY19ncGlvX3B1bGxfdCkweDAwKQotI2RlZmluZSBTM0NfR1BJT19QVUxMX0RPV04JKChfX2ZvcmNlIHMzY19ncGlvX3B1bGxfdCkweDAxKQotI2RlZmluZSBTM0NfR1BJT19QVUxMX1VQCSgoX19mb3JjZSBzM2NfZ3Bpb19wdWxsX3QpMHgwMikKKyNkZWZpbmUgUzNDX0dQSU9fUFVMTF9OT05FCSgoX19mb3JjZSBzYW1zdW5nX2dwaW9fcHVsbF90KTB4MDApCisjZGVmaW5lIFMzQ19HUElPX1BVTExfRE9XTgkoKF9fZm9yY2Ugc2Ftc3VuZ19ncGlvX3B1bGxfdCkweDAxKQorI2RlZmluZSBTM0NfR1BJT19QVUxMX1VQCSgoX19mb3JjZSBzYW1zdW5nX2dwaW9fcHVsbF90KTB4MDIpCiAKIC8qKgogICogczNjX2dwaW9fc2V0cHVsbCgpIC0gc2V0IHRoZSBzdGF0ZSBvZiBhIGdwaW8gcGluIHB1bGwgcmVzaXN0b3IKQEAgLTE0Myw3ICsxNDMsNyBAQAogICoKICAqIEBwdWxsIGlzIG9uZSBvZiBTM0NfR1BJT19QVUxMX05PTkUsIFMzQ19HUElPX1BVTExfRE9XTiBvciBTM0NfR1BJT19QVUxMX1VQLgogKi8KLWV4dGVybiBpbnQgczNjX2dwaW9fc2V0cHVsbCh1bnNpZ25lZCBpbnQgcGluLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCk7CitleHRlcm4gaW50IHMzY19ncGlvX3NldHB1bGwodW5zaWduZWQgaW50IHBpbiwgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKTsKIAogLyoqCiAgKiBzM2NfZ3Bpb19nZXRwdWxsKCkgLSBnZXQgdGhlIHB1bGwgcmVzaXN0b3Igc3RhdGUgb2YgYSBncGlvIHBpbgpAQCAtMTUxLDcgKzE1MSw3IEBACiAgKgogICogUmVhZCB0aGUgcHVsbCByZXNpc3RvciB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwaW4uCiAqLwotZXh0ZXJuIHMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsKHVuc2lnbmVkIGludCBwaW4pOworZXh0ZXJuIHNhbXN1bmdfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZ2V0cHVsbCh1bnNpZ25lZCBpbnQgcGluKTsKIAogLyogY29uZmlndXJlIGBhbGxgIGFzcGVjdHMgb2YgYW4gZ3BpbyAqLwogCkBAIC0xNzAsNyArMTcwLDcgQEAKICAqIEBzYSBzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UKICAqLwogZXh0ZXJuIGludCBzM2NfZ3Bpb19jZmdhbGxfcmFuZ2UodW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgbnIsCi0JCQkJIHVuc2lnbmVkIGludCBjZmcsIHMzY19ncGlvX3B1bGxfdCBwdWxsKTsKKwkJCQkgdW5zaWduZWQgaW50IGNmZywgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKTsKIAogc3RhdGljIGlubGluZSBpbnQgczNjX2dwaW9fY2ZncmFuZ2Vfbm9wdWxsKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBzaXplLAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY2ZnKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNvcmUuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZ3Bpby1jb3JlLmgKaW5kZXggOGNhZDRjZi4uMWZlNjkxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNvcmUuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY29yZS5oCkBAIC0yNSwyMiArMjUsMjIgQEAKICAqIHNwZWNpZmljIGNvZGUuCiAqLwogCi1zdHJ1Y3QgczNjX2dwaW9fY2hpcDsKK3N0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcDsKIAogLyoqCi0gKiBzdHJ1Y3QgczNjX2dwaW9fcG0gLSBwb3dlciBtYW5hZ2VtZW50IChzdXNwZW5kL3Jlc3VtZSkgaW5mb3JtYXRpb24KKyAqIHN0cnVjdCBzYW1zdW5nX2dwaW9fcG0gLSBwb3dlciBtYW5hZ2VtZW50IChzdXNwZW5kL3Jlc3VtZSkgaW5mb3JtYXRpb24KICAqIEBzYXZlOiBSb3V0aW5lIHRvIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBHUElPIGJsb2NrCiAgKiBAcmVzdW1lOiBSb3V0aW5lIHRvIHJlc3VtZSB0aGUgR1BJTyBibG9jay4KICAqLwotc3RydWN0IHMzY19ncGlvX3BtIHsKLQl2b2lkICgqc2F2ZSkoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApOwotCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKTsKK3N0cnVjdCBzYW1zdW5nX2dwaW9fcG0geworCXZvaWQgKCpzYXZlKShzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXApOworCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCk7CiB9OwogCi1zdHJ1Y3QgczNjX2dwaW9fY2ZnOworc3RydWN0IHNhbXN1bmdfZ3Bpb19jZmc7CiAKIC8qKgotICogc3RydWN0IHMzY19ncGlvX2NoaXAgLSB3cmFwcGVyIGZvciBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBncGlvCisgKiBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgLSB3cmFwcGVyIGZvciBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBncGlvCiAgKiBAY2hpcDogVGhlIGNoaXAgc3RydWN0dXJlIHRvIGJlIGV4cG9ydGVkIHZpYSBncGlvbGliLgogICogQGJhc2U6IFRoZSBiYXNlIHBvaW50ZXIgdG8gdGhlIGdwaW8gY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCiAgKiBAZ3JvdXA6IFRoZSBncm91cCByZWdpc3RlciBudW1iZXIgZm9yIGdwaW8gaW50ZXJydXB0IHN1cHBvcnQuCkBAIC02MCwxMCArNjAsMTAgQEAKICAqIENQVSBjb3JlcyB0cnlpbmcgdG8gZ2V0IG9uZSBsb2NrIGZvciBkaWZmZXJlbnQgR1BJTyBiYW5rcywgd2hlcmUgZWFjaAogICogYmFuayBvZiBHUElPIGhhcyBpdHMgb3duIHJlZ2lzdGVyIHNwYWNlIGFuZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KICAqLwotc3RydWN0IHMzY19ncGlvX2NoaXAgeworc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHsKIAlzdHJ1Y3QgZ3Bpb19jaGlwCWNoaXA7Ci0Jc3RydWN0IHMzY19ncGlvX2NmZwkqY29uZmlnOwotCXN0cnVjdCBzM2NfZ3Bpb19wbQkqcG07CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jZmcJKmNvbmZpZzsKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX3BtCSpwbTsKIAl2b2lkIF9faW9tZW0JCSpiYXNlOwogCWludAkJCWlycV9iYXNlOwogCWludAkJCWdyb3VwOwpAQCAtNzMsNTggKzczLDExIEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHMzY19ncGlvX2NoaXAgKnRvX3MzY19ncGlvKHN0cnVjdCBncGlvX2NoaXAgKmdwYykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICp0b19zYW1zdW5nX2dwaW8oc3RydWN0IGdwaW9fY2hpcCAqZ3BjKQogewotCXJldHVybiBjb250YWluZXJfb2YoZ3BjLCBzdHJ1Y3QgczNjX2dwaW9fY2hpcCwgY2hpcCk7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihncGMsIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCwgY2hpcCk7CiB9CiAKLS8qKiBzM2NfZ3Bpb2xpYl9hZGQoKSAtIGFkZCB0aGUgczNjIHNwZWNpZmljIHZlcnNpb24gb2YgYSBncGlvX2NoaXAuCi0gKiBAY2hpcDogVGhlIGNoaXAgdG8gcmVnaXN0ZXIKLSAqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciB0byBncGlvY2hpcF9hZGQoKSB0aGF0IHRha2VzIG91ciBzcGVjaWZpYyBncGlvIGNoaXAKLSAqIGluZm9ybWF0aW9uIGFuZCBtYWtlcyB0aGUgbmVjZXNzYXJ5IGFsdGVyYXRpb25zIGZvciB0aGUgcGxhdGZvcm0gYW5kCi0gKiBub3RlcyB0aGUgaW5mb3JtYXRpb24gZm9yIHVzZSB3aXRoIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbXMgYW5kIGFueQotICogb3RoZXIgcGFydHMgb2YgdGhlIHN5c3RlbS4KLSAqLwotZXh0ZXJuIHZvaWQgczNjX2dwaW9saWJfYWRkKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKTsKLQotLyogQ09ORklHX1MzQ19HUElPX1RSQUNLIGVuYWJsZXMgdGhlIHRyYWNraW5nIG9mIHRoZSBzM2Mgc3BlY2lmaWMgZ3Bpb3MKLSAqIGZvciB1c2Ugd2l0aCB0aGUgY29uZmlndXJhdGlvbiBjYWxscywgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSBzM2MgZ3Bpb2xpYgotICogc3VwcG9ydCBjb2RlLgotICoKLSAqIE5vdCBhbGwgczNjIHN1cHBvcnQgY29kZSB3aWxsIG5lZWQgdGhpcywgYXMgc29tZSBjb25maWd1cmF0aW9ucyBvZiBjcHUKLSAqIG1heSBvbmx5IHN1cHBvcnQgb25lIG9yIHR3byBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBoYXZlIGFuCi0gKiBlYXN5IGdwaW8gdG8gczNjX2dwaW9fY2hpcCBtYXBwaW5nIGZ1bmN0aW9uLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGVuCi0gKiB0aGUgbWFjaGluZSBzdXBwb3J0IGZpbGUgc2hvdWxkIHByb3ZpZGUgaXRzIG93biBzM2NfZ3Bpb2xpYl9nZXRjaGlwKCkKLSAqIGFuZCBhbnkgb3RoZXIgbmVjZXNzYXJ5IGZ1bmN0aW9ucy4KLSAqLwotCi0vKioKLSAqIHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyAtIDRiaXQgc2luZ2xlIHJlZ2lzdGVyIEdQSU8gY29uZmlnLgotICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgotICogQG5yX2NoaXBzOiBUaGUgbm8gb2YgY2hpcHMgKGdwaW8gcG9ydHMpIGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgotICoKLSAqIFRoaXMgaGVscGVyIGRlYWwgd2l0aCB0aGUgR1BJTyBjYXNlcyB3aGVyZSB0aGUgY29udHJvbCByZWdpc3RlciBoYXMgNCBiaXRzCi0gKiBvZiBjb250cm9sIHBlciBHUElPLCBnZW5lcmFsbHkgaW4gdGhlIGZvcm0gb2Y6Ci0gKiAwMDAwID0gSW5wdXQKLSAqIDAwMDEgPSBPdXRwdXQKLSAqIG90aGVycyA9IFNwZWNpYWwgZnVuY3Rpb25zIChkZXBlbmRlbnQgb24gYmFuaykKLSAqCi0gKiBOb3RlLCBzaW5jZSB0aGUgY29kZSB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIHR3byBjb250cm9sCi0gKiByZWdpc3RlcnMgaW5zdGVhZCBvZiBvbmUsIHdlIGRvIG5vdCBoYXZlIGEgc2VwYXJhdGUgc2V0IG9mIGZ1bmN0aW9uCi0gKiAoc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0Ml9jaGlwcylmb3IgZWFjaCBjYXNlLgotICovCi1leHRlcm4gdm9pZCBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCSAgIGludCBucl9jaGlwcyk7Ci1leHRlcm4gdm9pZCBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQyX2NoaXBzKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgICAgaW50IG5yX2NoaXBzKTsKLWV4dGVybiB2b2lkIHNhbXN1bmdfZ3Bpb2xpYl9hZGRfMmJpdF9jaGlwcyhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJICAgaW50IG5yX2NoaXBzKTsKLQotZXh0ZXJuIHZvaWQgc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKTsKLWV4dGVybiB2b2lkIHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdDIoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApOwotCi0KIC8qKgogICogc2Ftc3VuZ19ncGlvbGliX3RvX2lycSAtIGNvbnZlcnQgZ3BpbyBwaW4gdG8gaXJxIG51bWJlcgogICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCB0aGUgcGluIGJlbG9uZ3MgdG8uCkBAIC0xMzYsMzYgKzg5LDM2IEBACiBleHRlcm4gaW50IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCk7CiAKIC8qIGV4cG9ydGVkIGZvciBjb3JlIFNvQyBzdXBwb3J0IHRvIGNoYW5nZSAqLwotZXh0ZXJuIHN0cnVjdCBzM2NfZ3Bpb19jZmcgczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQ7CitleHRlcm4gc3RydWN0IHNhbXN1bmdfZ3Bpb19jZmcgczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQ7CiAKICNpZmRlZiBDT05GSUdfUzNDX0dQSU9fVFJBQ0sKLWV4dGVybiBzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqczNjX2dwaW9zW1MzQ19HUElPX0VORF07CitleHRlcm4gc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpzM2NfZ3Bpb3NbUzNDX0dQSU9fRU5EXTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqczNjX2dwaW9saWJfZ2V0Y2hpcCh1bnNpZ25lZCBpbnQgY2hpcCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcCh1bnNpZ25lZCBpbnQgY2hpcCkKIHsKIAlyZXR1cm4gKGNoaXAgPCBTM0NfR1BJT19FTkQpID8gczNjX2dwaW9zW2NoaXBdIDogTlVMTDsKIH0KICNlbHNlCi0vKiBtYWNoaW5lIHNwZWNpZmljIGNvZGUgc2hvdWxkIHByb3ZpZGUgczNjX2dwaW9saWJfZ2V0Y2hpcCAqLworLyogbWFjaGluZSBzcGVjaWZpYyBjb2RlIHNob3VsZCBwcm92aWRlIHNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwICovCiAKICNpbmNsdWRlIDxtYWNoL2dwaW8tdHJhY2suaD4KIAotc3RhdGljIGlubGluZSB2b2lkIHMzY19ncGlvbGliX3RyYWNrKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfZ3Bpb2xpYl90cmFjayhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXApIHsgfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUE0KLWV4dGVybiBzdHJ1Y3QgczNjX2dwaW9fcG0gczNjX2dwaW9fcG1fMWJpdDsKLWV4dGVybiBzdHJ1Y3QgczNjX2dwaW9fcG0gczNjX2dwaW9fcG1fMmJpdDsKLWV4dGVybiBzdHJ1Y3QgczNjX2dwaW9fcG0gczNjX2dwaW9fcG1fNGJpdDsKK2V4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX3BtIHNhbXN1bmdfZ3Bpb19wbV8xYml0OworZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX2dwaW9fcG0gc2Ftc3VuZ19ncGlvX3BtXzJiaXQ7CitleHRlcm4gc3RydWN0IHNhbXN1bmdfZ3Bpb19wbSBzYW1zdW5nX2dwaW9fcG1fNGJpdDsKICNkZWZpbmUgX19ncGlvX3BtKHgpIHgKICNlbHNlCi0jZGVmaW5lIHMzY19ncGlvX3BtXzFiaXQgTlVMTAotI2RlZmluZSBzM2NfZ3Bpb19wbV8yYml0IE5VTEwKLSNkZWZpbmUgczNjX2dwaW9fcG1fNGJpdCBOVUxMCisjZGVmaW5lIHNhbXN1bmdfZ3Bpb19wbV8xYml0IE5VTEwKKyNkZWZpbmUgc2Ftc3VuZ19ncGlvX3BtXzJiaXQgTlVMTAorI2RlZmluZSBzYW1zdW5nX2dwaW9fcG1fNGJpdCBOVUxMCiAjZGVmaW5lIF9fZ3Bpb19wbSh4KSBOVUxMCiAKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogLyogbG9ja2luZyB3cmFwcGVycyB0byBkZWFsIHdpdGggbXVsdGlwbGUgYWNjZXNzIHRvIHRoZSBzYW1lIGdwaW8gYmFuayAqLwotI2RlZmluZSBzM2NfZ3Bpb19sb2NrKF9vYywgX2ZsKSBzcGluX2xvY2tfaXJxc2F2ZSgmKF9vYyktPmxvY2ssIF9mbCkKLSNkZWZpbmUgczNjX2dwaW9fdW5sb2NrKF9vYywgX2ZsKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoX29jKS0+bG9jaywgX2ZsKQorI2RlZmluZSBzYW1zdW5nX2dwaW9fbG9jayhfb2MsIF9mbCkgc3Bpbl9sb2NrX2lycXNhdmUoJihfb2MpLT5sb2NrLCBfZmwpCisjZGVmaW5lIHNhbXN1bmdfZ3Bpb191bmxvY2soX29jLCBfZmwpIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihfb2MpLT5sb2NrLCBfZmwpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tZm5zLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tZm5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiMTM5MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZ3Bpby1mbnMuaApAQCAtMCwwICsxLDk4IEBACisvKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tZm5zLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNDEwIC0gaGFyZHdhcmUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX01BQ0hfR1BJT19GTlNfSAorI2RlZmluZSBfX01BQ0hfR1BJT19GTlNfSCBfX0ZJTEVfXworCisvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGluIHRoZSB0by1iZS1yZW1vdmVkIGNhdGVnb3J5IGFuZCBpdCBpcyBzdHJvbmdseQorICogZW5jb3VyYWdlZCBub3QgdG8gdXNlIHRoZXNlIGluIG5ldyBjb2RlLiBUaGV5IHdpbGwgYmUgbWFya2VkIGRlcHJlY2F0ZWQKKyAqIHZlcnkgc29vbi4KKyAqCisgKiBNb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBlaXRoZXIgcmVwbGFjZWQgYnkgdGhlIGdwaW9jZmcgY2FsbHMKKyAqIGZvciB0aGUgczNjIHBsYXRmb3JtIG9yIGJ5IHRoZSBnZW5lcmljIEdQSU9saWIgQVBJLgorICoKKyAqIEFzIG9mIDIuNi4zNS1yYywgdGhlc2Ugd2lsbCBiZSByZW1vdmVkLCB3aXRoIHRoZSBmZXcgZHJpdmVycyB1c2luZyB0aGVtCisgKiBlaXRoZXIgcmVwbGFjZWQgb3IgZ2l2ZW4gYSB3cmFwcGVyIHVudGlsIHRoZSBjYWxscyBjYW4gYmUgcmVtb3ZlZC4KKyovCisKKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEwX2dwaW9fY2ZncGluKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBjZmcpCit7CisJLyogMToxIG1hcHBpbmcgYmV0d2VlbiBjZmdwaW4gYW5kIHNldGNmZyBjYWxscyBhdCB0aGUgbW9tZW50ICovCisJczNjX2dwaW9fY2ZncGluKHBpbiwgY2ZnKTsKK30KKworLyogZXh0ZXJuYWwgZnVuY3Rpb25zIGZvciBHUElPIHN1cHBvcnQKKyAqCisgKiBUaGVzZSBhbGxvdyB2YXJpb3VzIGRpZmZlcmVudCBjbGllbnRzIHRvIGFjY2VzcyB0aGUgc2FtZSBHUElPCisgKiByZWdpc3RlcnMgd2l0aG91dCBjb25mbGljdGluZy4gSWYgeW91ciBkcml2ZXIgb25seSBvd25zIHRoZSBlbnRpcmUKKyAqIEdQSU8gcmVnaXN0ZXIsIHRoZW4gaXQgaXMgc2FmZSB0byBpb3JlbWFwL19fcmF3X3tyZWFkfHdyaXRlfSB0byBpdC4KKyovCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgczNjMjQxMF9ncGlvX2dldGNmZyh1bnNpZ25lZCBpbnQgcGluKTsKKworLyogczNjMjQxMF9ncGlvX2dldGlycQorICoKKyAqIHR1cm4gdGhlIGdpdmVuIHBpbiBudW1iZXIgaW50byB0aGUgY29ycmVzcG9uZGluZyBJUlEgbnVtYmVyCisgKgorICogcmV0dXJuczoKKyAqCTwgMCA9IG5vIGludGVycnVwdCBmb3IgdGhpcyBwaW4KKyAqCT49MCA9IGludGVycnVwdCBudW1iZXIgZm9yIHRoZSBwaW4KKyovCisKK2V4dGVybiBpbnQgczNjMjQxMF9ncGlvX2dldGlycSh1bnNpZ25lZCBpbnQgcGluKTsKKworLyogczNjMjQxMF9ncGlvX2lycWZpbHRlcgorICoKKyAqIHNldCB0aGUgaXJxIGZpbHRlcmluZyBvbiB0aGUgZ2l2ZW4gcGluCisgKgorICogb24gPSAwID0+IGRpc2FibGUgZmlsdGVyaW5nCisgKiAgICAgIDEgPT4gZW5hYmxlIGZpbHRlcmluZworICoKKyAqIGNvbmZpZyA9IFMzQzI0MTBfRUlOVEZMVF9QQ0xLIG9yIFMzQzI0MTBfRUlOVEZMVF9FWFRDTEsgb3JyZWQgd2l0aAorICogICAgICAgICAgd2lkdGggb2YgZmlsdGVyICgwIHRocm91Z2ggNjMpCisgKgorICoKKyovCisKK2V4dGVybiBpbnQgczNjMjQxMF9ncGlvX2lycWZpbHRlcih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgb24sCisJCQkJICB1bnNpZ25lZCBpbnQgY29uZmlnKTsKKworLyogczNjMjQxMF9ncGlvX3B1bGx1cAorICoKKyAqIFRoaXMgY2FsbCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBzM2NfZ3Bpb19zZXRwdWxsKCkuCisgKgorICogQXMgYSBub3RlLCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gZGlzdGluY3Rpb24gYmV0d2VlbiBwdWxsLXVwIGFuZCBwdWxsLWRvd24KKyAqIGluIHRoZSBzM2MyNHh4IHNlcmllcyBkZXZpY2VzIHdpdGggb25seSBhbiBvbi9vZmYgY29uZmlndXJhdGlvbi4KKyAqLworCisvKiBzM2MyNDEwX2dwaW9fcHVsbHVwCisgKgorICogY29uZmlndXJlIHRoZSBwdWxsLXVwIGNvbnRyb2wgb24gdGhlIGdpdmVuIHBpbgorICoKKyAqIHRvID0gMSA9PiBkaXNhYmxlIHRoZSBwdWxsLXVwCisgKiAgICAgIDAgPT4gZW5hYmxlIHRoZSBwdWxsLXVwCisgKgorICogZWc7CisgKgorICogICBzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BCKDApLCAwKTsKKyAqICAgczNjMjQxMF9ncGlvX3B1bGx1cChTM0MyNDEwX0dQRSg4KSwgMCk7CisqLworCitleHRlcm4gdm9pZCBzM2MyNDEwX2dwaW9fcHVsbHVwKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCB0byk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTBfZ3Bpb19zZXRwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBzM2MyNDEwX2dwaW9fZ2V0cGluKHVuc2lnbmVkIGludCBwaW4pOworCisjZW5kaWYgLyogX19NQUNIX0dQSU9fRk5TX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvaWljLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2lpYy5oCmluZGV4IDU2YjAwNTkuLjUxZDUyZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvaWljLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9paWMuaApAQCAtNjAsNiArNjAsNyBAQAogZXh0ZXJuIHZvaWQgczNjX2kyYzVfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqaTJjKTsKIGV4dGVybiB2b2lkIHMzY19pMmM2X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKmkyYyk7CiBleHRlcm4gdm9pZCBzM2NfaTJjN19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICppMmMpOworZXh0ZXJuIHZvaWQgczVwX2kyY19oZG1pcGh5X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKmkyYyk7CiAKIC8qIGRlZmluZWQgYnkgYXJjaGl0ZWN0dXJlIHRvIGNvbmZpZ3VyZSBncGlvICovCiBleHRlcm4gdm9pZCBzM2NfaTJjMF9jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9pcnEuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxYTg5YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvaXJxLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvaXJxLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgUzNDMjRYWCBDUFUgSVJRIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWlycS5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CisKKyNkZWZpbmUgaXJxZGJmKHguLi4pCisjZGVmaW5lIGlycWRiZjIoeC4uLikKKworI2RlZmluZSBFWFRJTlRfT0ZGIChJUlFfRUlOVDQgLSA0KQorCisvKiB0aGVzZSBhcmUgZXhwb3J0ZWQgZm9yIGFyY2gvYXJtL21hY2gtKiB1c2FnZSAqLworZXh0ZXJuIHN0cnVjdCBpcnFfY2hpcCBzM2NfaXJxX2xldmVsX2NoaXA7CitleHRlcm4gc3RydWN0IGlycV9jaGlwIHMzY19pcnFfY2hpcDsKKworc3RhdGljIGlubGluZSB2b2lkIHMzY19pcnFzdWJfbWFzayh1bnNpZ25lZCBpbnQgaXJxbm8sCisJCQkJICAgdW5zaWduZWQgaW50IHBhcmVudGJpdCwKKwkJCQkgICBpbnQgc3ViY2hlY2spCit7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCXVuc2lnbmVkIGxvbmcgc3VibWFzazsKKworCXN1Ym1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVFNVQk1TSyk7CisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UTVNLKTsKKworCXN1Ym1hc2sgfD0gKDFVTCA8PCAoaXJxbm8gLSBJUlFfUzNDVUFSVF9SWDApKTsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIG1hc2sgdGhlIHBhcmVudCBJUlEgKi8KKworCWlmICgoc3VibWFzayAgJiBzdWJjaGVjaykgPT0gc3ViY2hlY2spCisJCV9fcmF3X3dyaXRlbChtYXNrIHwgcGFyZW50Yml0LCBTM0MyNDEwX0lOVE1TSyk7CisKKwkvKiB3cml0ZSBiYWNrIG1hc2tzICovCisJX19yYXdfd3JpdGVsKHN1Ym1hc2ssIFMzQzI0MTBfSU5UU1VCTVNLKTsKKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX2lycXN1Yl91bm1hc2sodW5zaWduZWQgaW50IGlycW5vLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHBhcmVudGJpdCkKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyBzdWJtYXNrOworCisJc3VibWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UU1VCTVNLKTsKKwltYXNrID0gX19yYXdfcmVhZGwoUzNDMjQxMF9JTlRNU0spOworCisJc3VibWFzayAmPSB+KDFVTCA8PCAoaXJxbm8gLSBJUlFfUzNDVUFSVF9SWDApKTsKKwltYXNrICY9IH5wYXJlbnRiaXQ7CisKKwkvKiB3cml0ZSBiYWNrIG1hc2tzICovCisJX19yYXdfd3JpdGVsKHN1Ym1hc2ssIFMzQzI0MTBfSU5UU1VCTVNLKTsKKwlfX3Jhd193cml0ZWwobWFzaywgUzNDMjQxMF9JTlRNU0spOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfaXJxc3ViX21hc2thY2sodW5zaWduZWQgaW50IGlycW5vLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBwYXJlbnRtYXNrLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBncm91cCkKK3sKKwl1bnNpZ25lZCBpbnQgYml0ID0gMVVMIDw8IChpcnFubyAtIElSUV9TM0NVQVJUX1JYMCk7CisKKwlzM2NfaXJxc3ViX21hc2soaXJxbm8sIHBhcmVudG1hc2ssIGdyb3VwKTsKKworCV9fcmF3X3dyaXRlbChiaXQsIFMzQzI0MTBfU1VCU1JDUE5EKTsKKworCS8qIG9ubHkgYWNrIHBhcmVudCBpZiB3ZSd2ZSBnb3QgYWxsIHRoZSBpcnFzIChzZWVtcyB3ZSBtdXN0CisJICogYWNrLCBhbGwgYW5kIGhvcGUgdGhhdCB0aGUgaXJxIHN5c3RlbSByZXRyaWdnZXJzIG9rIHdoZW4KKwkgKiB0aGUgaW50ZXJydXB0IGdvZXMgb2ZmIGFnYWluKQorCSAqLworCisJaWYgKDEpIHsKKwkJX19yYXdfd3JpdGVsKHBhcmVudG1hc2ssIFMzQzI0MTBfU1JDUE5EKTsKKwkJX19yYXdfd3JpdGVsKHBhcmVudG1hc2ssIFMzQzI0MTBfSU5UUE5EKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfaXJxc3ViX2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8sCisJCQkJICB1bnNpZ25lZCBpbnQgcGFyZW50bWFzaywKKwkJCQkgIHVuc2lnbmVkIGludCBncm91cCkKK3sKKwl1bnNpZ25lZCBpbnQgYml0ID0gMVVMIDw8IChpcnFubyAtIElSUV9TM0NVQVJUX1JYMCk7CisKKwlfX3Jhd193cml0ZWwoYml0LCBTM0MyNDEwX1NVQlNSQ1BORCk7CisKKwkvKiBvbmx5IGFjayBwYXJlbnQgaWYgd2UndmUgZ290IGFsbCB0aGUgaXJxcyAoc2VlbXMgd2UgbXVzdAorCSAqIGFjaywgYWxsIGFuZCBob3BlIHRoYXQgdGhlIGlycSBzeXN0ZW0gcmV0cmlnZ2VycyBvayB3aGVuCisJICogdGhlIGludGVycnVwdCBnb2VzIG9mZiBhZ2FpbikKKwkgKi8KKworCWlmICgxKSB7CisJCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX1NSQ1BORCk7CisJCV9fcmF3X3dyaXRlbChwYXJlbnRtYXNrLCBTM0MyNDEwX0lOVFBORCk7CisJfQorfQorCisvKiBleHBvcnRlZCBmb3IgdXNlIGluIGFyY2gvYXJtL21hY2gtczNjMjQxMCAqLworCisjaWZkZWYgQ09ORklHX1BNCitleHRlcm4gaW50IHMzY19pcnFfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBzdGF0ZSk7CisjZWxzZQorI2RlZmluZSBzM2NfaXJxX3dha2UgTlVMTAorI2VuZGlmCisKK2V4dGVybiBpbnQgczNjX2lycWV4dF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9pcnFzLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQxYTdlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9pcnFzLmgKQEAgLTAsMCArMSw4MCBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9pcnFzLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFM1UCBDb21tb24gSVJRIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX1BMQVRfU0FNU1VOR19JUlFTX0gKKyNkZWZpbmUgX19QTEFUX1NBTVNVTkdfSVJRU19IIF9fRklMRV9fCisKKy8qIHdlIGtlZXAgdGhlIGZpcnN0IHNldCBvZiBDUFUgSVJRcyBvdXQgb2YgdGhlIHJhbmdlIG9mCisgKiB0aGUgSVNBIHNwYWNlLCBzbyB0aGF0IHRoZSBQQzEwNCBoYXMgdGhlbSB0byBpdHNlbGYKKyAqIGFuZCB3ZSBkb24ndCBlbmQgdXAgaGF2aW5nIHRvIGRvIGhvcnJpYmxlIHRoaW5ncyB0byB0aGUKKyAqIHN0YW5kYXJkIElTQSBkcml2ZXJzLi4uLgorICoKKyAqIG5vdGUsIHNpbmNlIHdlJ3JlIHVzaW5nIHRoZSBWSUNzLCBvdXIgc3RhcnQgbXVzdCBiZSBhCisgKiBtdWxpdHBsZSBvZiAzMiB0byBhbGxvdyB0aGUgY29tbW9uIGNvZGUgdG8gd29yaworICovCisKKyNkZWZpbmUgUzVQX0lSUV9PRkZTRVQJCSgzMikKKworI2RlZmluZSBTNVBfSVJRKHgpCQkoKHgpICsgUzVQX0lSUV9PRkZTRVQpCisKKyNkZWZpbmUgUzVQX1ZJQzBfQkFTRQkJUzVQX0lSUSgwKQorI2RlZmluZSBTNVBfVklDMV9CQVNFCQlTNVBfSVJRKDMyKQorI2RlZmluZSBTNVBfVklDMl9CQVNFCQlTNVBfSVJRKDY0KQorI2RlZmluZSBTNVBfVklDM19CQVNFCQlTNVBfSVJRKDk2KQorCisjZGVmaW5lIFZJQ19CQVNFKHgpCQkoUzVQX1ZJQzBfQkFTRSArICgoeCkqMzIpKQorCisjZGVmaW5lIElSUV9WSUMwX0JBU0UJCVM1UF9WSUMwX0JBU0UKKyNkZWZpbmUgSVJRX1ZJQzFfQkFTRQkJUzVQX1ZJQzFfQkFTRQorI2RlZmluZSBJUlFfVklDMl9CQVNFCQlTNVBfVklDMl9CQVNFCisKKy8qIFZJQyBiYXNlZCBJUlFzICovCisKKyNkZWZpbmUgUzVQX0lSUV9WSUMwKHgpCQkoUzVQX1ZJQzBfQkFTRSArICh4KSkKKyNkZWZpbmUgUzVQX0lSUV9WSUMxKHgpCQkoUzVQX1ZJQzFfQkFTRSArICh4KSkKKyNkZWZpbmUgUzVQX0lSUV9WSUMyKHgpCQkoUzVQX1ZJQzJfQkFTRSArICh4KSkKKyNkZWZpbmUgUzVQX0lSUV9WSUMzKHgpCQkoUzVQX1ZJQzNfQkFTRSArICh4KSkKKworI2RlZmluZSBTNVBfVElNRVJfSVJRKHgpCSgxMSArICh4KSkKKworI2RlZmluZSBJUlFfVElNRVIwCQlTNVBfVElNRVJfSVJRKDApCisjZGVmaW5lIElSUV9USU1FUjEJCVM1UF9USU1FUl9JUlEoMSkKKyNkZWZpbmUgSVJRX1RJTUVSMgkJUzVQX1RJTUVSX0lSUSgyKQorI2RlZmluZSBJUlFfVElNRVIzCQlTNVBfVElNRVJfSVJRKDMpCisjZGVmaW5lIElSUV9USU1FUjQJCVM1UF9USU1FUl9JUlEoNCkKKworI2RlZmluZSBJUlFfRUlOVCh4KQkJKCh4KSA8IDE2ID8gKCh4KSArIFM1UF9FSU5UX0JBU0UxKSBcCisJCQkJCTogKCh4KSAtIDE2ICsgUzVQX0VJTlRfQkFTRTIpKQorCisjZGVmaW5lIEVJTlRfT0ZGU0VUKGlycSkJKChpcnEpIDwgUzVQX0VJTlRfQkFTRTIgPyBcCisJCQkJCQkoKGlycSkgLSBTNVBfRUlOVF9CQVNFMSkgOiBcCisJCQkJCQkoKGlycSkgKyAxNiAtIFM1UF9FSU5UX0JBU0UyKSkKKworI2RlZmluZSBJUlFfRUlOVF9CSVQoeCkJCUVJTlRfT0ZGU0VUKHgpCisKKy8qIFR5cGljYWxseSBvbmx5IGEgZmV3IGdwaW8gY2hpcHMgcmVxdWlyZSBncGlvIGludGVycnVwdCBzdXBwb3J0LgorICAgVG8gYXZvaWQgbWVtb3J5IHdhc3RlIGlycSBkZXNjcmlwdG9ycyBhcmUgYWxsb2NhdGVkIG9ubHkgZm9yCisgICBTNVBfR1BJT0lOVF9HUk9VUF9DT1VOVCBjaGlwcywgZWFjaCB3aXRoIHRvdGFsIG51bWJlciBvZgorICAgUzVQX0dQSU9JTlRfR1JPVVBfU0laRSBwaW5zL2lycXMuIEVhY2ggR1BJT0lOVCBncm91cCBjYW4gYmUgYXNzaWdlZAorICAgdG8gYW55IGdwaW8gY2hpcCB3aXRoIHRoZSBzNXBfcmVnaXN0ZXJfZ3Bpb19pbnRlcnJ1cHQoKSBmdW5jdGlvbiAqLworI2RlZmluZSBTNVBfR1BJT0lOVF9HUk9VUF9DT1VOVCA0CisjZGVmaW5lIFM1UF9HUElPSU5UX0dST1VQX1NJWkUJOAorI2RlZmluZSBTNVBfR1BJT0lOVF9DT1VOVAkoUzVQX0dQSU9JTlRfR1JPVVBfQ09VTlQgKiBTNVBfR1BJT0lOVF9HUk9VUF9TSVpFKQorCisvKiBJUlEgdHlwZXMgY29tbW9uIGZvciBhbGwgczVwIHBsYXRmb3JtcyAqLworI2RlZmluZSBTNVBfSVJRX1RZUEVfTEVWRUxfTE9XCQkoMHgwMCkKKyNkZWZpbmUgUzVQX0lSUV9UWVBFX0xFVkVMX0hJR0gJCSgweDAxKQorI2RlZmluZSBTNVBfSVJRX1RZUEVfRURHRV9GQUxMSU5HCSgweDAyKQorI2RlZmluZSBTNVBfSVJRX1RZUEVfRURHRV9SSVNJTkcJKDB4MDMpCisjZGVmaW5lIFM1UF9JUlFfVFlQRV9FREdFX0JPVEgJCSgweDA0KQorCisjZW5kaWYgLyogX19QTEFUX1NBTVNVTkdfSVJRU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21hcC1zM2MuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWFwLXMzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDQ4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21hcC1zM2MuaApAQCAtMCwwICsxLDg0IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21hcC1zM2MuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNFhYIC0gTWVtb3J5IG1hcCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX1BMQVRfTUFQX1MzQ19ICisjZGVmaW5lIF9fQVNNX1BMQVRfTUFQX1MzQ19IIF9fRklMRV9fCisKKyNkZWZpbmUgUzNDMjRYWF9WQV9JUlEJCVMzQ19WQV9JUlEKKyNkZWZpbmUgUzNDMjRYWF9WQV9NRU1DVFJMCVMzQ19WQV9NRU0KKyNkZWZpbmUgUzNDMjRYWF9WQV9VQVJUCQlTM0NfVkFfVUFSVAorCisjZGVmaW5lIFMzQzI0WFhfVkFfVElNRVIJUzNDX1ZBX1RJTUVSCisjZGVmaW5lIFMzQzI0WFhfVkFfQ0xLUFdSCVMzQ19WQV9TWVMKKyNkZWZpbmUgUzNDMjRYWF9WQV9XQVRDSERPRwlTM0NfVkFfV0FUQ0hET0cKKworI2RlZmluZSBTM0MyNDEyX1ZBX1NTTUMJCVMzQ19BRERSX0NQVSgweDAwMDAwMDAwKQorI2RlZmluZSBTM0MyNDEyX1ZBX0VCSQkJUzNDX0FERFJfQ1BVKDB4MDAwMTAwMDApCisKKyNkZWZpbmUgUzNDMjQxMF9QQV9VQVJUCQkoMHg1MDAwMDAwMCkKKyNkZWZpbmUgUzNDMjRYWF9QQV9VQVJUCQlTM0MyNDEwX1BBX1VBUlQKKworI2lmbmRlZiBTM0NfVUFSVF9PRkZTRVQKKyNkZWZpbmUgUzNDX1VBUlRfT0ZGU0VUCQkoMHg0MDApCisjZW5kaWYKKworLyoKKyAqIEdQSU8gcG9ydHMKKyAqCisgKiB0aGUgY2FsY3VsYXRpb24gZm9yIHRoZSBWQSBvZiB0aGlzIG11c3QgZW5zdXJlIHRoYXQKKyAqIGl0IGlzIHRoZSBzYW1lIGRpc3RhbmNlIGFwYXJ0IGZyb20gdGhlIFVBUlQgaW4gdGhlCisgKiBwaHN5aWNhbCBhZGRyZXNzIHNwYWNlLCBhcyB0aGUgaW5pdGlhbCBtYXBwaW5nIGZvciB0aGUgSU8KKyAqIGlzIGRvbmUgYXMgYSAxOjEgbWFwcGluZy4gVGhpcyBwdXRzIGl0IChjdXJyZW50bHkpIGF0CisgKiAweEZBODAwMDAwLCB3aGljaCBpcyBub3QgaW4gdGhlIHdheSBvZiBhbnkgY3VycmVudCBtYXBwaW5nCisgKiBieSB0aGUgYmFzZSBzeXN0ZW0uCisqLworCisjZGVmaW5lIFMzQzI0MTBfUEFfR1BJTwkJKDB4NTYwMDAwMDApCisjZGVmaW5lIFMzQzI0WFhfUEFfR1BJTwkJUzNDMjQxMF9QQV9HUElPCisKKyNkZWZpbmUgUzNDMjRYWF9WQV9HUElPCQkoKFMzQzI0WFhfUEFfR1BJTyAtIFMzQzI0WFhfUEFfVUFSVCkgKyBTM0MyNFhYX1ZBX1VBUlQpCisjZGVmaW5lIFMzQzY0WFhfVkFfR1BJTwkJUzNDX0FERFJfQ1BVKDB4MDAwMDAwMDApCisKKyNkZWZpbmUgUzNDNjRYWF9WQV9NT0RFTQlTM0NfQUREUl9DUFUoMHgwMDEwMDAwMCkKKyNkZWZpbmUgUzNDNjRYWF9WQV9VU0JfSFNQSFkJUzNDX0FERFJfQ1BVKDB4MDAyMDAwMDApCisKKyNkZWZpbmUgUzNDX1ZBX1VTQl9IU1BIWQlTM0M2NFhYX1ZBX1VTQl9IU1BIWQorCisvKgorICogSVNBIHN0eWxlIElPLCBmb3IgZWFjaCBtYWNoaW5lIHRvIHNvcnQgb3V0IG1hcHBpbmdzIGZvciwKKyAqIGlmIGl0IGltcGxlbWVudHMgaXQuIFdlIHJlc2VydmUgdHdvIDE2TSByZWdpb25zIGZvciBJU0EuCisgKi8KKworI2RlZmluZSBTM0MyNDEwX0FERFIoeCkJCVMzQ19BRERSKHgpCisKKyNkZWZpbmUgUzNDMjRYWF9WQV9JU0FfV09SRAlTM0MyNDEwX0FERFIoMHgwMjAwMDAwMCkKKyNkZWZpbmUgUzNDMjRYWF9WQV9JU0FfQllURQlTM0MyNDEwX0FERFIoMHgwMzAwMDAwMCkKKworLyogZGVhbCB3aXRoIHRoZSByZWdpc3RlcnMgdGhhdCBtb3ZlIHVuZGVyIHRoZSAyNDEyLzI0MTMgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEyKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQxMykKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gdm9pZCBfX2lvbWVtICpzM2MyNHh4X3ZhX2dwaW8yOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEyX09OTFkKKyNkZWZpbmUgUzNDMjRYWF9WQV9HUElPMgkoUzNDMjRYWF9WQV9HUElPICsgMHgxMCkKKyNlbHNlCisjZGVmaW5lIFMzQzI0WFhfVkFfR1BJTzIgczNjMjR4eF92YV9ncGlvMgorI2VuZGlmCisjZWxzZQorI2RlZmluZSBzM2MyNHh4X3ZhX2dwaW8yIFMzQzI0WFhfVkFfR1BJTworI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8yIFMzQzI0WFhfVkFfR1BJTworI2VuZGlmCisKKyNpbmNsdWRlIDxwbGF0L21hcC1zNXAuaD4KKworI2VuZGlmIC8qIF9fQVNNX1BMQVRfTUFQX1MzQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21hcC1zNXAuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDdiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21hcC1zNXAuaApAQCAtMCwwICsxLDYxIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21hcC1zNXAuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogUzVQIC0gTWVtb3J5IG1hcCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX1BMQVRfTUFQX1M1UF9ICisjZGVmaW5lIF9fQVNNX1BMQVRfTUFQX1M1UF9IIF9fRklMRV9fCisKKyNkZWZpbmUgUzVQX1ZBX0NISVBJRAkJUzNDX0FERFIoMHgwMjAwMDAwMCkKKyNkZWZpbmUgUzVQX1ZBX0NNVQkJUzNDX0FERFIoMHgwMjEwMDAwMCkKKyNkZWZpbmUgUzVQX1ZBX1BNVQkJUzNDX0FERFIoMHgwMjE4MDAwMCkKKyNkZWZpbmUgUzVQX1ZBX0dQSU8JCVMzQ19BRERSKDB4MDIyMDAwMDApCisjZGVmaW5lIFM1UF9WQV9HUElPMQkJUzVQX1ZBX0dQSU8KKyNkZWZpbmUgUzVQX1ZBX0dQSU8yCQlTM0NfQUREUigweDAyMjQwMDAwKQorI2RlZmluZSBTNVBfVkFfR1BJTzMJCVMzQ19BRERSKDB4MDIyODAwMDApCisKKyNkZWZpbmUgUzVQX1ZBX1NZU1JBTQkJUzNDX0FERFIoMHgwMjQwMDAwMCkKKyNkZWZpbmUgUzVQX1ZBX0RNQzAJCVMzQ19BRERSKDB4MDI0NDAwMDApCisjZGVmaW5lIFM1UF9WQV9ETUMxCQlTM0NfQUREUigweDAyNDgwMDAwKQorI2RlZmluZSBTNVBfVkFfU1JPTUMJCVMzQ19BRERSKDB4MDI0QzAwMDApCisKKyNkZWZpbmUgUzVQX1ZBX1NZU1RJTUVSCQlTM0NfQUREUigweDAyNTAwMDAwKQorI2RlZmluZSBTNVBfVkFfTDJDQwkJUzNDX0FERFIoMHgwMjYwMDAwMCkKKworI2RlZmluZSBTNVBfVkFfQ09NQklORVJfQkFTRQlTM0NfQUREUigweDAyNzAwMDAwKQorI2RlZmluZSBTNVBfVkFfQ09NQklORVIoeCkJKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgKCh4KSA+PiAyKSAqIDB4MTApCisKKyNkZWZpbmUgUzVQX1ZBX0NPUkVQRVJJX0JBU0UJUzNDX0FERFIoMHgwMjgwMDAwMCkKKyNkZWZpbmUgUzVQX1ZBX0NPUkVQRVJJKHgpCShTNVBfVkFfQ09SRVBFUklfQkFTRSArICh4KSkKKyNkZWZpbmUgUzVQX1ZBX1NDVQkJUzVQX1ZBX0NPUkVQRVJJKDB4MCkKKyNkZWZpbmUgUzVQX1ZBX1RXRAkJUzVQX1ZBX0NPUkVQRVJJKDB4NjAwKQorCisjZGVmaW5lIFM1UF9WQV9HSUNfQ1BVCQlTM0NfQUREUigweDAyODEwMDAwKQorI2RlZmluZSBTNVBfVkFfR0lDX0RJU1QJCVMzQ19BRERSKDB4MDI4MjAwMDApCisKKyNkZWZpbmUgVkFfVklDKHgpCQkoUzNDX1ZBX0lSUSArICgoeCkgKiAweDEwMDAwKSkKKyNkZWZpbmUgVkFfVklDMAkJCVZBX1ZJQygwKQorI2RlZmluZSBWQV9WSUMxCQkJVkFfVklDKDEpCisjZGVmaW5lIFZBX1ZJQzIJCQlWQV9WSUMoMikKKyNkZWZpbmUgVkFfVklDMwkJCVZBX1ZJQygzKQorCisjZGVmaW5lIFM1UF9WQV9VQVJUKHgpCQkoUzNDX1ZBX1VBUlQgKyAoKHgpICogUzNDX1VBUlRfT0ZGU0VUKSkKKyNkZWZpbmUgUzVQX1ZBX1VBUlQwCQlTNVBfVkFfVUFSVCgwKQorI2RlZmluZSBTNVBfVkFfVUFSVDEJCVM1UF9WQV9VQVJUKDEpCisjZGVmaW5lIFM1UF9WQV9VQVJUMgkJUzVQX1ZBX1VBUlQoMikKKyNkZWZpbmUgUzVQX1ZBX1VBUlQzCQlTNVBfVkFfVUFSVCgzKQorCisjaWZuZGVmIFMzQ19VQVJUX09GRlNFVAorI2RlZmluZSBTM0NfVUFSVF9PRkZTRVQJCSgweDQwMCkKKyNlbmRpZgorCisjaW5jbHVkZSA8cGxhdC9tYXAtczNjLmg+CisKKyNlbmRpZiAvKiBfX0FTTV9QTEFUX01BUF9TNVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9tY2kuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyZDMxNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWNpLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfQVJDSF9NQ0lfSAorI2RlZmluZSBfQVJDSF9NQ0lfSAorCisvKioKKyAqIHN0cnVjdCBzM2MyNHh4X21jaV9wZGF0YSAtIHNkL21tYyBjb250cm9sbGVyIHBsYXRmb3JtIGRhdGEKKyAqIEBub193cHJvdGVjdDogU2V0IHRoaXMgdG8gaW5kaWNhdGUgdGhlcmUgaXMgbm8gd3JpdGUtcHJvdGVjdCBzd2l0Y2guCisgKiBAbm9fZGV0ZWN0OiBTZXQgdGhpcyBpZiB0aGVyZSBpcyBubyBkZXRlY3Qgc3dpdGNoLgorICogQHdwcm90ZWN0X2ludmVydDogSW52ZXJ0IHRoZSBkZWZhdWx0IHNlbnNlIG9mIHRoZSB3cml0ZSBwcm90ZWN0IHN3aXRjaC4KKyAqIEBkZXRlY3RfaW52ZXJ0OiBJbnZlcnQgdGhlIGRlZmF1bHQgc2Vuc2Ugb2YgdGhlIHdyaXRlIHByb3RlY3Qgc3dpdGNoLgorICogQHVzZV9kbWE6IFNldCB0byBhbGxvdyB0aGUgdXNlIG9mIERNQS4KKyAqIEBncGlvX2RldGVjdDogR1BJTyBudW1iZXIgZm9yIHRoZSBjYXJkIGRldGVjdCBsaW5lLgorICogQGdwaW9fd3Byb3RlY3Q6IEdQSU8gbnVtYmVyIGZvciB0aGUgd3JpdGUgcHJvdGVjdCBsaW5lLgorICogQG9jcl9hdmFpbDogVGhlIG1hc2sgb2YgdGhlIGF2YWlsYWJsZSBwb3dlciBzdGF0ZXMsIG5vbi16ZXJvIHRvIHVzZS4KKyAqIEBzZXRfcG93ZXI6IENhbGxiYWNrIHRvIGNvbnRyb2wgdGhlIHBvd2VyIG1vZGUuCisgKgorICogVGhlIEBncGlvX2RldGVjdCBpcyB1c2VkIGZvciBjYXJkIGRldGVjdGlvbiB3aGVuIEBub193cHJvdGVjdCBpcyB1bnNldCwKKyAqIGFuZCB0aGUgZGVmYXVsdCBzZW5zZSBpcyB0aGF0IDAgcmV0dXJuZWQgZnJvbSBncGlvX2dldF92YWx1ZSgpIG1lYW5zCisgKiB0aGF0IGEgY2FyZCBpcyBpbnNlcnRlZC4gSWYgQGRldGVjdF9pbnZlcnQgaXMgc2V0LCB0aGVuIHRoZSB2YWx1ZSBmcm9tCisgKiBncGlvX2dldF92YWx1ZSgpIGlzIGludmVydGVkLCB3aGljaCBtYWtlcyAxIG1lYW4gY2FyZCBpbnNlcnRlZC4KKyAqCisgKiBUaGUgZHJpdmVyIHdpbGwgdXNlIEBncGlvX3dwcm90ZWN0IHRvIHNpZ25hbCB3aGV0aGVyIHRoZSBjYXJkIGlzIHdyaXRlCisgKiBwcm90ZWN0ZWQgaWYgQG5vX3dwcm90ZWN0IGlzIG5vdCBzZXQuIEEgMCByZXR1cm5lZCBmcm9tIGdwaW9fZ2V0X3ZhbHVlKCkKKyAqIG1lYW5zIHRoZSBjYXJkIGlzIHJlYWQvd3JpdGUsIGFuZCAxIG1lYW5zIHJlYWQtb25seS4gVGhlIEB3cHJvdGVjdF9pbnZlcnQKKyAqIHdpbGwgaW52ZXJ0IHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGdwaW9fZ2V0X3ZhbHVlKCkuCisgKgorICogQ2FyZCBwb3dlciBpcyBzZXQgYnkgQG9jcl9hdmFpbGEsIHVzaW5nIE1DQ19WRERfIGNvbnN0YW50cyBpZiBpdCBpcyBzZXQKKyAqIHRvIGEgbm9uLXplcm8gdmFsdWUsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBvZiAzLjItMy40ViBpcyB1c2VkLgorICovCitzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEgeworCXVuc2lnbmVkIGludAlub193cHJvdGVjdDoxOworCXVuc2lnbmVkIGludAlub19kZXRlY3Q6MTsKKwl1bnNpZ25lZCBpbnQJd3Byb3RlY3RfaW52ZXJ0OjE7CisJdW5zaWduZWQgaW50CWRldGVjdF9pbnZlcnQ6MTsJLyogc2V0ID0+IGRldGVjdCBhY3RpdmUgaGlnaCAqLworCXVuc2lnbmVkIGludAl1c2VfZG1hOjE7CisKKwl1bnNpZ25lZCBpbnQJZ3Bpb19kZXRlY3Q7CisJdW5zaWduZWQgaW50CWdwaW9fd3Byb3RlY3Q7CisJdW5zaWduZWQgbG9uZwlvY3JfYXZhaWw7CisJdm9pZAkJKCpzZXRfcG93ZXIpKHVuc2lnbmVkIGNoYXIgcG93ZXJfbW9kZSwKKwkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHZkZCk7Cit9OworCisvKioKKyAqIHMzYzI0eHhfbWNpX3NldF9wbGF0ZGF0YSAtIHNldCBwbGF0Zm9ybSBkYXRhIGZvciBtbWMvc2RpIGRldmljZQorICogQHBkYXRhOiBUaGUgcGxhdGZvcm0gZGF0YQorICoKKyAqIENvcHkgdGhlIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWQgYnkgQHBkYXRhIHNvIHRoYXQgdGhpcyBjYW4gYmUgbWFya2VkCisgKiBfX2luaXRkYXRhLgorICovCitleHRlcm4gdm9pZCBzM2MyNHh4X21jaV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhICpwZGF0YSk7CisKKyNlbmRpZiAvKiBfQVJDSF9OQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9tZmMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMzIyNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWZjLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX1BMQVRfU0FNU1VOR19NRkNfSAorI2RlZmluZSBfX1BMQVRfU0FNU1VOR19NRkNfSCBfX0ZJTEVfXworCisvKioKKyAqIHM1cF9tZmNfcmVzZXJ2ZV9tZW0gLSBmdW5jdGlvbiB0byBlYXJseSByZXNlcnZlIG1lbW9yeSBmb3IgTUZDIGRyaXZlcgorICogQHJiYXNlOgliYXNlIGFkZHJlc3MgZm9yIE1GQyAncmlnaHQnIG1lbW9yeSBpbnRlcmZhY2UKKyAqIEByc2l6ZToJc2l6ZSBvZiB0aGUgbWVtb3J5IHJlc2VydmVkIGZvciBNRkMgJ3JpZ2h0JyBpbnRlcmZhY2UKKyAqIEBsYmFzZToJYmFzZSBhZGRyZXNzIGZvciBNRkMgJ2xlZnQnIG1lbW9yeSBpbnRlcmZhY2UKKyAqIEBsc2l6ZToJc2l6ZSBvZiB0aGUgbWVtb3J5IHJlc2VydmVkIGZvciBNRkMgJ2xlZnQnIGludGVyZmFjZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzZXJ2ZXMgc3lzdGVtIG1lbW9yeSBmb3IgYm90aCBNRkMgZGV2aWNlIG1lbW9yeQorICogaW50ZXJmYWNlcyBhbmQgcmVnaXN0ZXJzIGl0IHRvIHJlc3BlY3RpdmUgc3RydWN0IGRldmljZSBlbnRyaWVzIGFzCisgKiBjb2hlcmVudCBtZW1vcnkuCisgKi8KK3ZvaWQgX19pbml0IHM1cF9tZmNfcmVzZXJ2ZV9tZW0ocGh5c19hZGRyX3QgcmJhc2UsIHVuc2lnbmVkIGludCByc2l6ZSwKKwkJCQlwaHlzX2FkZHJfdCBsYmFzZSwgdW5zaWduZWQgaW50IGxzaXplKTsKKworI2VuZGlmIC8qIF9fUExBVF9TQU1TVU5HX01GQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21pcGlfY3Npcy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9taXBpX2NzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDViMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9taXBpX2NzaXMuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBTNVAgc2VyaWVzIE1JUEkgQ1NJIHNsYXZlIGRldmljZSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fUExBVF9TQU1TVU5HX01JUElfQ1NJU19IXworI2RlZmluZSBfX1BMQVRfU0FNU1VOR19NSVBJX0NTSVNfSF8gX19GSUxFX18KKworc3RydWN0IHBsYXRmb3JtX2RldmljZTsKKworLyoqCisgKiBzdHJ1Y3QgczVwX3BsYXRmb3JtX21pcGlfY3NpcyAtIHBsYXRmb3JtIGRhdGEgZm9yIFM1UCBNSVBJLUNTSVMgZHJpdmVyCisgKiBAY2xrX3JhdGU6IGJ1cyBjbG9jayBmcmVxdWVuY3kKKyAqIEBsYW5lczogbnVtYmVyIG9mIGRhdGEgbGFuZXMgdXNlZAorICogQGFsaWdubWVudDogZGF0YSBhbGlnbm1lbnQgaW4gYml0cworICogQGhzX3NldHRsZTogSFMtUlggc2V0dGxlIHRpbWUKKyAqIEBmaXhlZF9waHlfdmRkOiBmYWxzZSB0byBlbmFibGUgZXh0ZXJuYWwgRC1QSFkgcmVndWxhdG9yIG1hbmFnZW1lbnQgaW4gdGhlCisgKgkJICAgZHJpdmVyIG9yIHRydWUgaW4gY2FzZSB0aGlzIHJlZ3VsYXRvciBoYXMgbm8gZW5hYmxlIGZ1bmN0aW9uCisgKiBAcGh5X2VuYWJsZTogcG9pbnRlciB0byBhIGNhbGxiYWNrIGNvbnRyb2xsaW5nIEQtUEhZIGVuYWJsZS9yZXNldAorICovCitzdHJ1Y3QgczVwX3BsYXRmb3JtX21pcGlfY3NpcyB7CisJdW5zaWduZWQgbG9uZyBjbGtfcmF0ZTsKKwl1OCBsYW5lczsKKwl1OCBhbGlnbm1lbnQ7CisJdTggaHNfc2V0dGxlOworCWJvb2wgZml4ZWRfcGh5X3ZkZDsKKwlpbnQgKCpwaHlfZW5hYmxlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBib29sIG9uKTsKK307CisKKy8qKgorICogczVwX2NzaXNfcGh5X2VuYWJsZSAtIGdsb2JhbCBNSVBJLUNTSSByZWNlaXZlciBELVBIWSBjb250cm9sCisgKiBAcGRldjogTUlQSS1DU0lTIHBsYXRmb3JtIGRldmljZQorICogQG9uOiB0cnVlIHRvIGVuYWJsZSBELVBIWSBhbmQgZGVhc3NlcnQgaXRzIHJlc2V0CisgKglmYWxzZSB0byBkaXNhYmxlIEQtUEhZCisgKi8KK2ludCBzNXBfY3Npc19waHlfZW5hYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGJvb2wgb24pOworCisjZW5kaWYgLyogX19QTEFUX1NBTVNVTkdfTUlQSV9DU0lTX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BsbC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTdhZjdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbGwuaApAQCAtMCwwICsxLDMyMyBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbGwuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFNhbXN1bmcgUExMIGNvZGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2RlZmluZSBTM0MyNFhYX1BMTF9NRElWX01BU0sJCSgweEZGKQorI2RlZmluZSBTM0MyNFhYX1BMTF9QRElWX01BU0sJCSgweDFGKQorI2RlZmluZSBTM0MyNFhYX1BMTF9TRElWX01BU0sJCSgweDMpCisjZGVmaW5lIFMzQzI0WFhfUExMX01ESVZfU0hJRlQJCSgxMikKKyNkZWZpbmUgUzNDMjRYWF9QTExfUERJVl9TSElGVAkJKDQpCisjZGVmaW5lIFMzQzI0WFhfUExMX1NESVZfU0hJRlQJCSgwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzM2MyNHh4X2dldF9wbGwodW5zaWduZWQgaW50IHBsbHZhbCwKKwkJCQkJICAgdW5zaWduZWQgaW50IGJhc2VjbGspCit7CisJdW5zaWduZWQgaW50IG1kaXYsIHBkaXYsIHNkaXY7CisJdWludDY0X3QgZnZjbzsKKworCW1kaXYgPSAocGxsdmFsID4+IFMzQzI0WFhfUExMX01ESVZfU0hJRlQpICYgUzNDMjRYWF9QTExfTURJVl9NQVNLOworCXBkaXYgPSAocGxsdmFsID4+IFMzQzI0WFhfUExMX1BESVZfU0hJRlQpICYgUzNDMjRYWF9QTExfUERJVl9NQVNLOworCXNkaXYgPSAocGxsdmFsID4+IFMzQzI0WFhfUExMX1NESVZfU0hJRlQpICYgUzNDMjRYWF9QTExfU0RJVl9NQVNLOworCisJZnZjbyA9ICh1aW50NjRfdCliYXNlY2xrICogKG1kaXYgKyA4KTsKKwlkb19kaXYoZnZjbywgKHBkaXYgKyAyKSA8PCBzZGl2KTsKKworCXJldHVybiAodW5zaWduZWQgaW50KWZ2Y287Cit9CisKKyNkZWZpbmUgUzNDMjQxNl9QTExfTURJVl9NQVNLCQkoMHgzRkYpCisjZGVmaW5lIFMzQzI0MTZfUExMX1BESVZfTUFTSwkJKDB4M0YpCisjZGVmaW5lIFMzQzI0MTZfUExMX1NESVZfTUFTSwkJKDB4NykKKyNkZWZpbmUgUzNDMjQxNl9QTExfTURJVl9TSElGVAkJKDE0KQorI2RlZmluZSBTM0MyNDE2X1BMTF9QRElWX1NISUZUCQkoNSkKKyNkZWZpbmUgUzNDMjQxNl9QTExfU0RJVl9TSElGVAkJKDApCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHMzYzI0MTZfZ2V0X3BsbCh1bnNpZ25lZCBpbnQgcGxsdmFsLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgYmFzZWNsaykKK3sKKwl1bnNpZ25lZCBpbnQgbWRpdiwgcGRpdiwgc2RpdjsKKwl1aW50NjRfdCBmdmNvOworCisJbWRpdiA9IChwbGx2YWwgPj4gUzNDMjQxNl9QTExfTURJVl9TSElGVCkgJiBTM0MyNDE2X1BMTF9NRElWX01BU0s7CisJcGRpdiA9IChwbGx2YWwgPj4gUzNDMjQxNl9QTExfUERJVl9TSElGVCkgJiBTM0MyNDE2X1BMTF9QRElWX01BU0s7CisJc2RpdiA9IChwbGx2YWwgPj4gUzNDMjQxNl9QTExfU0RJVl9TSElGVCkgJiBTM0MyNDE2X1BMTF9TRElWX01BU0s7CisKKwlmdmNvID0gKHVpbnQ2NF90KWJhc2VjbGsgKiBtZGl2OworCWRvX2RpdihmdmNvLCAocGRpdiA8PCBzZGl2KSk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludClmdmNvOworfQorCisjZGVmaW5lIFMzQzY0MDBfUExMX01ESVZfTUFTSwkJKDB4M0ZGKQorI2RlZmluZSBTM0M2NDAwX1BMTF9QRElWX01BU0sJCSgweDNGKQorI2RlZmluZSBTM0M2NDAwX1BMTF9TRElWX01BU0sJCSgweDcpCisjZGVmaW5lIFMzQzY0MDBfUExMX01ESVZfU0hJRlQJCSgxNikKKyNkZWZpbmUgUzNDNjQwMF9QTExfUERJVl9TSElGVAkJKDgpCisjZGVmaW5lIFMzQzY0MDBfUExMX1NESVZfU0hJRlQJCSgwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczNjNjQwMF9nZXRfcGxsKHVuc2lnbmVkIGxvbmcgYmFzZWNsaywKKwkJCQkJICAgIHUzMiBwbGxjb24pCit7CisJdTMyIG1kaXYsIHBkaXYsIHNkaXY7CisJdTY0IGZ2Y28gPSBiYXNlY2xrOworCisJbWRpdiA9IChwbGxjb24gPj4gUzNDNjQwMF9QTExfTURJVl9TSElGVCkgJiBTM0M2NDAwX1BMTF9NRElWX01BU0s7CisJcGRpdiA9IChwbGxjb24gPj4gUzNDNjQwMF9QTExfUERJVl9TSElGVCkgJiBTM0M2NDAwX1BMTF9QRElWX01BU0s7CisJc2RpdiA9IChwbGxjb24gPj4gUzNDNjQwMF9QTExfU0RJVl9TSElGVCkgJiBTM0M2NDAwX1BMTF9TRElWX01BU0s7CisKKwlmdmNvICo9IG1kaXY7CisJZG9fZGl2KGZ2Y28sIChwZGl2IDw8IHNkaXYpKTsKKworCXJldHVybiAodW5zaWduZWQgbG9uZylmdmNvOworfQorCisjZGVmaW5lIFBMTDY1NTNYX01ESVZfTUFTSwkoMHg3RikKKyNkZWZpbmUgUExMNjU1M1hfUERJVl9NQVNLCSgweDFGKQorI2RlZmluZSBQTEw2NTUzWF9TRElWX01BU0sJKDB4MykKKyNkZWZpbmUgUExMNjU1M1hfS0RJVl9NQVNLCSgweEZGRkYpCisjZGVmaW5lIFBMTDY1NTNYX01ESVZfU0hJRlQJKDE2KQorI2RlZmluZSBQTEw2NTUzWF9QRElWX1NISUZUCSg4KQorI2RlZmluZSBQTEw2NTUzWF9TRElWX1NISUZUCSgwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczNjX2dldF9wbGw2NTUzeCh1bnNpZ25lZCBsb25nIGJhc2VjbGssCisJCQkJCSAgICAgdTMyIHBsbF9jb24wLCB1MzIgcGxsX2NvbjEpCit7CisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisJdTMyIG1kaXYsIHBkaXYsIHNkaXYsIGtkaXY7CisJdTY0IHRtcDsKKworCW1kaXYgPSAocGxsX2NvbjAgPj4gUExMNjU1M1hfTURJVl9TSElGVCkgJiBQTEw2NTUzWF9NRElWX01BU0s7CisJcGRpdiA9IChwbGxfY29uMCA+PiBQTEw2NTUzWF9QRElWX1NISUZUKSAmIFBMTDY1NTNYX1BESVZfTUFTSzsKKwlzZGl2ID0gKHBsbF9jb24wID4+IFBMTDY1NTNYX1NESVZfU0hJRlQpICYgUExMNjU1M1hfU0RJVl9NQVNLOworCWtkaXYgPSBwbGxfY29uMSAmIFBMTDY1NTNYX0tESVZfTUFTSzsKKworCS8qCisJICogV2UgbmVlZCB0byBtdWx0aXBsZSBiYXNlY2xrIGJ5IG1kaXYgKHRoZSBpbnRlZ2VyIHBhcnQpIGFuZCBrZGl2CisJICogd2hpY2ggaXMgaW4gMl4xNnRocywgc28gc2hpZnQgbWRpdiB1cCAoZG9lcyBub3Qgb3ZlcmZsb3cpIGFuZAorCSAqIGFkZCBrZGl2IGJlZm9yZSBtdWx0aXBseWluZy4gVGhlIHVzZSBvZiB0bXAgaXMgdG8gYXZvaWQgYW55CisJICogb3ZlcmZsb3dzIGJlZm9yZSBzaGlmdGluZyBiYWMgZG93biBpbnRvIHJlc3VsdCB3aGVuIG11bHRpcGxpbmcKKwkgKiBieSB0aGUgbWRpdiBhbmQga2RpdiBwYWlyLgorCSAqLworCisJdG1wID0gYmFzZWNsazsKKwl0bXAgKj0gKG1kaXYgPDwgMTYpICsga2RpdjsKKwlkb19kaXYodG1wLCAocGRpdiA8PCBzZGl2KSk7CisJcmVzdWx0ID0gdG1wID4+IDE2OworCisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBQTEwzNVhYX01ESVZfTUFTSwkoMHgzRkYpCisjZGVmaW5lIFBMTDM1WFhfUERJVl9NQVNLCSgweDNGKQorI2RlZmluZSBQTEwzNVhYX1NESVZfTUFTSwkoMHg3KQorI2RlZmluZSBQTEwzNVhYX01ESVZfU0hJRlQJKDE2KQorI2RlZmluZSBQTEwzNVhYX1BESVZfU0hJRlQJKDgpCisjZGVmaW5lIFBMTDM1WFhfU0RJVl9TSElGVAkoMCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHM1cF9nZXRfcGxsMzV4eCh1bnNpZ25lZCBsb25nIGJhc2VjbGssIHUzMiBwbGxfY29uKQoreworCXUzMiBtZGl2LCBwZGl2LCBzZGl2OworCXU2NCBmdmNvID0gYmFzZWNsazsKKworCW1kaXYgPSAocGxsX2NvbiA+PiBQTEwzNVhYX01ESVZfU0hJRlQpICYgUExMMzVYWF9NRElWX01BU0s7CisJcGRpdiA9IChwbGxfY29uID4+IFBMTDM1WFhfUERJVl9TSElGVCkgJiBQTEwzNVhYX1BESVZfTUFTSzsKKwlzZGl2ID0gKHBsbF9jb24gPj4gUExMMzVYWF9TRElWX1NISUZUKSAmIFBMTDM1WFhfU0RJVl9NQVNLOworCisJZnZjbyAqPSBtZGl2OworCWRvX2RpdihmdmNvLCAocGRpdiA8PCBzZGl2KSk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnZjbzsKK30KKworI2RlZmluZSBQTEwzNlhYX0tESVZfTUFTSwkoMHhGRkZGKQorI2RlZmluZSBQTEwzNlhYX01ESVZfTUFTSwkoMHgxRkYpCisjZGVmaW5lIFBMTDM2WFhfUERJVl9NQVNLCSgweDNGKQorI2RlZmluZSBQTEwzNlhYX1NESVZfTUFTSwkoMHg3KQorI2RlZmluZSBQTEwzNlhYX01ESVZfU0hJRlQJKDE2KQorI2RlZmluZSBQTEwzNlhYX1BESVZfU0hJRlQJKDgpCisjZGVmaW5lIFBMTDM2WFhfU0RJVl9TSElGVAkoMCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHM1cF9nZXRfcGxsMzZ4eCh1bnNpZ25lZCBsb25nIGJhc2VjbGssCisJCQkJCSAgICB1MzIgcGxsX2NvbjAsIHUzMiBwbGxfY29uMSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdDsKKwl1MzIgbWRpdiwgcGRpdiwgc2Rpdiwga2RpdjsKKwl1NjQgdG1wOworCisJbWRpdiA9IChwbGxfY29uMCA+PiBQTEwzNlhYX01ESVZfU0hJRlQpICYgUExMMzZYWF9NRElWX01BU0s7CisJcGRpdiA9IChwbGxfY29uMCA+PiBQTEwzNlhYX1BESVZfU0hJRlQpICYgUExMMzZYWF9QRElWX01BU0s7CisJc2RpdiA9IChwbGxfY29uMCA+PiBQTEwzNlhYX1NESVZfU0hJRlQpICYgUExMMzZYWF9TRElWX01BU0s7CisJa2RpdiA9IHBsbF9jb24xICYgUExMMzZYWF9LRElWX01BU0s7CisKKwl0bXAgPSBiYXNlY2xrOworCisJdG1wICo9IChtZGl2IDw8IDE2KSArIGtkaXY7CisJZG9fZGl2KHRtcCwgKHBkaXYgPDwgc2RpdikpOworCXJlc3VsdCA9IHRtcCA+PiAxNjsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgUExMNDVYWF9NRElWX01BU0sJKDB4M0ZGKQorI2RlZmluZSBQTEw0NVhYX1BESVZfTUFTSwkoMHgzRikKKyNkZWZpbmUgUExMNDVYWF9TRElWX01BU0sJKDB4NykKKyNkZWZpbmUgUExMNDVYWF9NRElWX1NISUZUCSgxNikKKyNkZWZpbmUgUExMNDVYWF9QRElWX1NISUZUCSg4KQorI2RlZmluZSBQTEw0NVhYX1NESVZfU0hJRlQJKDApCisKK2VudW0gcGxsNDV4eF90eXBlX3QgeworCXBsbF80NTAwLAorCXBsbF80NTAyLAorCXBsbF80NTA4Cit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczVwX2dldF9wbGw0NXh4KHVuc2lnbmVkIGxvbmcgYmFzZWNsaywgdTMyIHBsbF9jb24sCisJCQkJCSAgICBlbnVtIHBsbDQ1eHhfdHlwZV90IHBsbF90eXBlKQoreworCXUzMiBtZGl2LCBwZGl2LCBzZGl2OworCXU2NCBmdmNvID0gYmFzZWNsazsKKworCW1kaXYgPSAocGxsX2NvbiA+PiBQTEw0NVhYX01ESVZfU0hJRlQpICYgUExMNDVYWF9NRElWX01BU0s7CisJcGRpdiA9IChwbGxfY29uID4+IFBMTDQ1WFhfUERJVl9TSElGVCkgJiBQTEw0NVhYX1BESVZfTUFTSzsKKwlzZGl2ID0gKHBsbF9jb24gPj4gUExMNDVYWF9TRElWX1NISUZUKSAmIFBMTDQ1WFhfU0RJVl9NQVNLOworCisJaWYgKHBsbF90eXBlID09IHBsbF80NTA4KQorCQlzZGl2ID0gc2RpdiAtIDE7CisKKwlmdmNvICo9IG1kaXY7CisJZG9fZGl2KGZ2Y28sIChwZGl2IDw8IHNkaXYpKTsKKworCXJldHVybiAodW5zaWduZWQgbG9uZylmdmNvOworfQorCisvKiBDT04wIGJpdC1maWVsZHMgKi8KKyNkZWZpbmUgUExMNDZYWF9NRElWX01BU0sJKDB4MUZGKQorI2RlZmluZSBQTEw0NlhYX1BESVZfTUFTSwkoMHgzRikKKyNkZWZpbmUgUExMNDZYWF9TRElWX01BU0sJKDB4NykKKyNkZWZpbmUgUExMNDZYWF9MT0NLRURfU0hJRlQJKDI5KQorI2RlZmluZSBQTEw0NlhYX01ESVZfU0hJRlQJKDE2KQorI2RlZmluZSBQTEw0NlhYX1BESVZfU0hJRlQJKDgpCisjZGVmaW5lIFBMTDQ2WFhfU0RJVl9TSElGVAkoMCkKKworLyogQ09OMSBiaXQtZmllbGRzICovCisjZGVmaW5lIFBMTDQ2WFhfTVJSX01BU0sJKDB4MUYpCisjZGVmaW5lIFBMTDQ2WFhfTUZSX01BU0sJKDB4M0YpCisjZGVmaW5lIFBMTDQ2WFhfS0RJVl9NQVNLCSgweEZGRkYpCisjZGVmaW5lIFBMTDQ2NTBDX0tESVZfTUFTSwkoMHhGRkYpCisjZGVmaW5lIFBMTDQ2WFhfTVJSX1NISUZUCSgyNCkKKyNkZWZpbmUgUExMNDZYWF9NRlJfU0hJRlQJKDE2KQorI2RlZmluZSBQTEw0NlhYX0tESVZfU0hJRlQJKDApCisKK2VudW0gcGxsNDZ4eF90eXBlX3QgeworCXBsbF80NjAwLAorCXBsbF80NjUwLAorCXBsbF80NjUwYywKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzNXBfZ2V0X3BsbDQ2eHgodW5zaWduZWQgbG9uZyBiYXNlY2xrLAorCQkJCQkgICAgdTMyIHBsbF9jb24wLCB1MzIgcGxsX2NvbjEsCisJCQkJCSAgICBlbnVtIHBsbDQ2eHhfdHlwZV90IHBsbF90eXBlKQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCXUzMiBtZGl2LCBwZGl2LCBzZGl2LCBrZGl2OworCXU2NCB0bXA7CisKKwltZGl2ID0gKHBsbF9jb24wID4+IFBMTDQ2WFhfTURJVl9TSElGVCkgJiBQTEw0NlhYX01ESVZfTUFTSzsKKwlwZGl2ID0gKHBsbF9jb24wID4+IFBMTDQ2WFhfUERJVl9TSElGVCkgJiBQTEw0NlhYX1BESVZfTUFTSzsKKwlzZGl2ID0gKHBsbF9jb24wID4+IFBMTDQ2WFhfU0RJVl9TSElGVCkgJiBQTEw0NlhYX1NESVZfTUFTSzsKKwlrZGl2ID0gcGxsX2NvbjEgJiBQTEw0NlhYX0tESVZfTUFTSzsKKworCWlmIChwbGxfdHlwZSA9PSBwbGxfNDY1MGMpCisJCWtkaXYgPSBwbGxfY29uMSAmIFBMTDQ2NTBDX0tESVZfTUFTSzsKKwllbHNlCisJCWtkaXYgPSBwbGxfY29uMSAmIFBMTDQ2WFhfS0RJVl9NQVNLOworCisJdG1wID0gYmFzZWNsazsKKworCWlmIChwbGxfdHlwZSA9PSBwbGxfNDYwMCkgeworCQl0bXAgKj0gKG1kaXYgPDwgMTYpICsga2RpdjsKKwkJZG9fZGl2KHRtcCwgKHBkaXYgPDwgc2RpdikpOworCQlyZXN1bHQgPSB0bXAgPj4gMTY7CisJfSBlbHNlIHsKKwkJdG1wICo9IChtZGl2IDw8IDEwKSArIGtkaXY7CisJCWRvX2Rpdih0bXAsIChwZGl2IDw8IHNkaXYpKTsKKwkJcmVzdWx0ID0gdG1wID4+IDEwOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgUExMOTBYWF9NRElWX01BU0sJKDB4RkYpCisjZGVmaW5lIFBMTDkwWFhfUERJVl9NQVNLCSgweDNGKQorI2RlZmluZSBQTEw5MFhYX1NESVZfTUFTSwkoMHg3KQorI2RlZmluZSBQTEw5MFhYX0tESVZfTUFTSwkoMHhmZmZmKQorI2RlZmluZSBQTEw5MFhYX0xPQ0tFRF9TSElGVAkoMjkpCisjZGVmaW5lIFBMTDkwWFhfTURJVl9TSElGVAkoMTYpCisjZGVmaW5lIFBMTDkwWFhfUERJVl9TSElGVAkoOCkKKyNkZWZpbmUgUExMOTBYWF9TRElWX1NISUZUCSgwKQorI2RlZmluZSBQTEw5MFhYX0tESVZfU0hJRlQJKDApCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzNXBfZ2V0X3BsbDkweHgodW5zaWduZWQgbG9uZyBiYXNlY2xrLAorCQkJCQkgICAgdTMyIHBsbF9jb24sIHUzMiBwbGxfY29uaykKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdDsKKwl1MzIgbWRpdiwgcGRpdiwgc2Rpdiwga2RpdjsKKwl1NjQgdG1wOworCisJbWRpdiA9IChwbGxfY29uID4+IFBMTDkwWFhfTURJVl9TSElGVCkgJiBQTEw5MFhYX01ESVZfTUFTSzsKKwlwZGl2ID0gKHBsbF9jb24gPj4gUExMOTBYWF9QRElWX1NISUZUKSAmIFBMTDkwWFhfUERJVl9NQVNLOworCXNkaXYgPSAocGxsX2NvbiA+PiBQTEw5MFhYX1NESVZfU0hJRlQpICYgUExMOTBYWF9TRElWX01BU0s7CisJa2RpdiA9IHBsbF9jb25rICYgUExMOTBYWF9LRElWX01BU0s7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gbXVsdGlwbGUgYmFzZWNsayBieSBtZGl2ICh0aGUgaW50ZWdlciBwYXJ0KSBhbmQga2RpdgorCSAqIHdoaWNoIGlzIGluIDJeMTZ0aHMsIHNvIHNoaWZ0IG1kaXYgdXAgKGRvZXMgbm90IG92ZXJmbG93KSBhbmQKKwkgKiBhZGQga2RpdiBiZWZvcmUgbXVsdGlwbHlpbmcuIFRoZSB1c2Ugb2YgdG1wIGlzIHRvIGF2b2lkIGFueQorCSAqIG92ZXJmbG93cyBiZWZvcmUgc2hpZnRpbmcgYmFjIGRvd24gaW50byByZXN1bHQgd2hlbiBtdWx0aXBsaW5nCisJICogYnkgdGhlIG1kaXYgYW5kIGtkaXYgcGFpci4KKwkgKi8KKworCXRtcCA9IGJhc2VjbGs7CisJdG1wICo9IChtZGl2IDw8IDE2KSArIGtkaXY7CisJZG9fZGl2KHRtcCwgKHBkaXYgPDwgc2RpdikpOworCXJlc3VsdCA9IHRtcCA+PiAxNjsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKyNkZWZpbmUgUExMNjVYWF9NRElWX01BU0sJKDB4M0ZGKQorI2RlZmluZSBQTEw2NVhYX1BESVZfTUFTSwkoMHgzRikKKyNkZWZpbmUgUExMNjVYWF9TRElWX01BU0sJKDB4NykKKyNkZWZpbmUgUExMNjVYWF9NRElWX1NISUZUCSgxNikKKyNkZWZpbmUgUExMNjVYWF9QRElWX1NISUZUCSg4KQorI2RlZmluZSBQTEw2NVhYX1NESVZfU0hJRlQJKDApCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzNXBfZ2V0X3BsbDY1eHgodW5zaWduZWQgbG9uZyBiYXNlY2xrLCB1MzIgcGxsX2NvbikKK3sKKwl1MzIgbWRpdiwgcGRpdiwgc2RpdjsKKwl1NjQgZnZjbyA9IGJhc2VjbGs7CisKKwltZGl2ID0gKHBsbF9jb24gPj4gUExMNjVYWF9NRElWX1NISUZUKSAmIFBMTDY1WFhfTURJVl9NQVNLOworCXBkaXYgPSAocGxsX2NvbiA+PiBQTEw2NVhYX1BESVZfU0hJRlQpICYgUExMNjVYWF9QRElWX01BU0s7CisJc2RpdiA9IChwbGxfY29uID4+IFBMTDY1WFhfU0RJVl9TSElGVCkgJiBQTEw2NVhYX1NESVZfTUFTSzsKKworCWZ2Y28gKj0gbWRpdjsKKwlkb19kaXYoZnZjbywgKHBkaXYgPDwgc2RpdikpOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWZ2Y287Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BsbDY1NTN4LmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BsbDY1NTN4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YjdlMWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbGw2NTUzeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbGw2NTUzeC5oCi0gKglwYXJ0aWFsbHkgZnJvbSBhcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3BsbC5oCi0gKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBTYW1zdW5nIFBMTDY1NTN4IFBMTCBjb2RlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLS8qIFMzQzY0MDAgYW5kIGNvbXBhdGlibGUgKFMzQzI0MTYsIGV0Yy4pIEVQTEwgY29kZSAqLwotCi0jZGVmaW5lIFBMTDY1NTNYX01ESVZfTUFTSwkoKDEgPDwgKDIzLTE2KSkgLSAxKQotI2RlZmluZSBQTEw2NTUzWF9QRElWX01BU0sJKCgxIDw8ICgxMy04KSkgLSAxKQotI2RlZmluZSBQTEw2NTUzWF9TRElWX01BU0sJKCgxIDw8ICgyLTApKSAtIDEpCi0jZGVmaW5lIFBMTDY1NTNYX01ESVZfU0hJRlQJKDE2KQotI2RlZmluZSBQTEw2NTUzWF9QRElWX1NISUZUCSg4KQotI2RlZmluZSBQTEw2NTUzWF9TRElWX1NISUZUCSgwKQotI2RlZmluZSBQTEw2NTUzWF9LRElWX01BU0sJKDB4ZmZmZikKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHMzY19nZXRfcGxsNjU1M3godW5zaWduZWQgbG9uZyBiYXNlY2xrLAotCQkJCQkgICAgIHUzMiBwbGwwLCB1MzIgcGxsMSkKLXsKLQl1bnNpZ25lZCBsb25nIHJlc3VsdDsKLQl1MzIgbWRpdiwgcGRpdiwgc2Rpdiwga2RpdjsKLQl1NjQgdG1wOwotCi0JbWRpdiA9IChwbGwwID4+IFBMTDY1NTNYX01ESVZfU0hJRlQpICYgUExMNjU1M1hfTURJVl9NQVNLOwotCXBkaXYgPSAocGxsMCA+PiBQTEw2NTUzWF9QRElWX1NISUZUKSAmIFBMTDY1NTNYX1BESVZfTUFTSzsKLQlzZGl2ID0gKHBsbDAgPj4gUExMNjU1M1hfU0RJVl9TSElGVCkgJiBQTEw2NTUzWF9TRElWX01BU0s7Ci0Ja2RpdiA9IHBsbDEgJiBQTEw2NTUzWF9LRElWX01BU0s7Ci0KLQkvKiBXZSBuZWVkIHRvIG11bHRpcGxlIGJhc2VjbGsgYnkgbWRpdiAodGhlIGludGVnZXIgcGFydCkgYW5kIGtkaXYKLQkgKiB3aGljaCBpcyBpbiAyXjE2dGhzLCBzbyBzaGlmdCBtZGl2IHVwIChkb2VzIG5vdCBvdmVyZmxvdykgYW5kCi0JICogYWRkIGtkaXYgYmVmb3JlIG11bHRpcGx5aW5nLiBUaGUgdXNlIG9mIHRtcCBpcyB0byBhdm9pZCBhbnkKLQkgKiBvdmVyZmxvd3MgYmVmb3JlIHNoaWZ0aW5nIGJhYyBkb3duIGludG8gcmVzdWx0IHdoZW4gbXVsdGlwbGluZwotCSAqIGJ5IHRoZSBtZGl2IGFuZCBrZGl2IHBhaXIuCi0JICovCi0KLQl0bXAgPSBiYXNlY2xrOwotCXRtcCAqPSAobWRpdiA8PCAxNikgKyBrZGl2OwotCWRvX2Rpdih0bXAsIChwZGl2IDw8IHNkaXYpKTsKLQlyZXN1bHQgPSB0bXAgPj4gMTY7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbS5oCmluZGV4IGY2NzQ5OTEuLmRjZjY4NzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcG0uaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BtLmgKQEAgLTE2NSwyMCArMTY1LDIwIEBACiBleHRlcm4gdm9pZCBzM2NfcG1fY29uZmlndXJlX2V4dGludCh2b2lkKTsKIAogLyoqCi0gKiBzM2NfcG1fcmVzdG9yZV9ncGlvcygpIC0gcmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGdwaW9zIGFmdGVyIHNsZWVwLgorICogc2Ftc3VuZ19wbV9yZXN0b3JlX2dwaW9zKCkgLSByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgZ3Bpb3MgYWZ0ZXIgc2xlZXAuCiAgKgogICogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIEdQSU8gcGlucyBhZnRlciBzbGVlcCwgd2hpY2ggbWF5IGludm9sdmUgZW5zdXJpbmcKICAqIHRoYXQgd2UgZG8gbm90IGdsaXRjaCB0aGUgc3RhdGUgb2YgdGhlIHBpbnMgZnJvbSB0aGF0IHRoZSBib290bG9hZGVyJ3MKICAqIHJlc3VtZSBjb2RlIGhhcyBkb25lLgogKi8KLWV4dGVybiB2b2lkIHMzY19wbV9yZXN0b3JlX2dwaW9zKHZvaWQpOworZXh0ZXJuIHZvaWQgc2Ftc3VuZ19wbV9yZXN0b3JlX2dwaW9zKHZvaWQpOwogCiAvKioKLSAqIHMzY19wbV9zYXZlX2dwaW9zKCkgLSBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgR1BJT3MgZm9yIHJlc3RvcmluZyBhZnRlciBzbGVlcC4KKyAqIHNhbXN1bmdfcG1fc2F2ZV9ncGlvcygpIC0gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIEdQSU9zIGZvciByZXN0b3JpbmcgYWZ0ZXIgc2xlZXAuCiAgKgotICogU2F2ZSB0aGUgR1BJTyBzdGF0ZXMgZm9yIHJlc290cmF0aW9uIG9uIHJlc3VtZS4gU2VlIHMzY19wbV9yZXN0b3JlX2dwaW9zKCkuCisgKiBTYXZlIHRoZSBHUElPIHN0YXRlcyBmb3IgcmVzb3RyYXRpb24gb24gcmVzdW1lLiBTZWUgc2Ftc3VuZ19wbV9yZXN0b3JlX2dwaW9zKCkuCiAgKi8KLWV4dGVybiB2b2lkIHMzY19wbV9zYXZlX2dwaW9zKHZvaWQpOworZXh0ZXJuIHZvaWQgc2Ftc3VuZ19wbV9zYXZlX2dwaW9zKHZvaWQpOwogCiBleHRlcm4gdm9pZCBzM2NfcG1fc2F2ZV9jb3JlKHZvaWQpOwogZXh0ZXJuIHZvaWQgczNjX3BtX3Jlc3RvcmVfY29yZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcHdtLWNsb2NrLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3B3bS1jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNmE2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3B3bS1jbG9jay5oCkBAIC0wLDAgKzEsODEgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcHdtLWNsb2NrLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBTQU1TVU5HIC0gcHdtIGNsb2NrIGFuZCB0aW1lciBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fUExBVF9QV01fQ0xPQ0tfSAorI2RlZmluZSBfX0FTTV9QTEFUX1BXTV9DTE9DS19IIF9fRklMRV9fCisKKy8qKgorICogcHdtX2NmZ19zcmNfaXNfdGNsaygpIC0gcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG11eCBjb25maWcgaXMgYSB0Y2xrCisgKiBAdGNmZzogVGhlIHRpbWVyIFRDRkcxIHJlZ2lzdGVyIGJpdHMgc2hpZnRlZCBkb3duIHRvIDAuCisgKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZnJvbSBUQ0ZHMSBpcyBhIFRDTEsgaW5zdGVhZAorICogYW55IG9mIHRoZSBURElWIGNsb2Nrcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcHdtX2NmZ19zcmNfaXNfdGNsayh1bnNpZ25lZCBsb25nIHRjZmcpCit7CisJaWYgKHNvY19pc19zM2MyNHh4KCkpCisJCXJldHVybiB0Y2ZnID09IFMzQzI0MTBfVENGRzFfTVVYX1RDTEs7CisJZWxzZSBpZiAoc29jX2lzX3MzYzY0eHgoKSB8fCBzb2NfaXNfczVwYzEwMCgpKQorCQlyZXR1cm4gdGNmZyA+PSBTM0M2NFhYX1RDRkcxX01VWF9UQ0xLOworCWVsc2UgaWYgKHNvY19pc19zNXA2NDQwKCkgfHwgc29jX2lzX3M1cDY0NTAoKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gdGNmZyA9PSBTM0M2NFhYX1RDRkcxX01VWF9UQ0xLOworfQorCisvKioKKyAqIHRjZmdfdG9fZGl2aXNvcigpIC0gY29udmVydCB0Y2ZnMSBzZXR0aW5nIHRvIGEgZGl2aXNvcgorICogQHRjZmcxOiBUaGUgdGNmZzEgc2V0dGluZywgc2hpZnRlZCBkb3duLgorICoKKyAqIEdldCB0aGUgZGl2aXNvciB2YWx1ZSBmb3IgdGhlIGdpdmVuIHRjZmcxIHNldHRpbmcuIFdlIGFzc3VtZSB0aGUKKyAqIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRvIHNlZSBpZiB0aGlzIGlzIG5vdCBhIFRDTEsgc291cmNlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGNmZ190b19kaXZpc29yKHVuc2lnbmVkIGxvbmcgdGNmZzEpCit7CisJaWYgKHNvY19pc19zM2MyNHh4KCkpCisJCXJldHVybiAxIDw8ICh0Y2ZnMSArIDEpOworCWVsc2UKKwkJcmV0dXJuIDEgPDwgdGNmZzE7Cit9CisKKy8qKgorICogcHdtX3RkaXZfaGFzX2RpdjEoKSAtIGRvZXMgdGhlIHRkaXYgc2V0dGluZyBoYXZlIGEgLzEKKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGEgLzEgaW4gdGhlIHRkaXYgc2V0dGluZy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcHdtX3RkaXZfaGFzX2RpdjEodm9pZCkKK3sKKwlpZiAoc29jX2lzX3MzYzI0eHgoKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworLyoqCisgKiBwd21fdGRpdl9kaXZfYml0cygpIC0gY2FsY3VsYXRlIFRDRkcxIGRpdmlzb3IgdmFsdWUuCisgKiBAZGl2OiBUaGUgZGl2aXNvciB0byBjYWxjdWxhdGUgdGhlIGJpdCBpbmZvcm1hdGlvbiBmb3IuCisgKgorICogVHVybiBhIGRpdmlzb3IgaW50byB0aGUgbmVjZXNzYXJ5IGJpdCBmaWVsZCBmb3IgVENGRzEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwd21fdGRpdl9kaXZfYml0cyh1bnNpZ25lZCBpbnQgZGl2KQoreworCWlmIChzb2NfaXNfczNjMjR4eCgpKQorCQlyZXR1cm4gaWxvZzIoZGl2KSAtIDE7CisJZWxzZQorCQlyZXR1cm4gaWxvZzIoZGl2KTsKK30KKyNlbmRpZiAvKiBfX0FTTV9QTEFUX1BXTV9DTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3MtYWRjLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3MtYWRjLmgKaW5kZXggMDM1ZThjMy4uNzA2MTIxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLWFkYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1hZGMuaApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBTM0MyNDEwX0FEQ0RBVDAJICAgUzNDMjQxMF9BRENSRUcoMHgwQykKICNkZWZpbmUgUzNDMjQxMF9BRENEQVQxCSAgIFMzQzI0MTBfQURDUkVHKDB4MTApCiAjZGVmaW5lIFMzQzY0WFhfQURDVVBETgkJUzNDMjQxMF9BRENSRUcoMHgxNCkKKyNkZWZpbmUgUzNDMjQ0M19BRENNVVgJCVMzQzI0MTBfQURDUkVHKDB4MTgpCiAjZGVmaW5lIFMzQzY0WFhfQURDQ0xSSU5UCVMzQzI0MTBfQURDUkVHKDB4MTgpCiAjZGVmaW5lIFM1UF9BRENNVVgJCVMzQzI0MTBfQURDUkVHKDB4MUMpCiAjZGVmaW5lIFMzQzY0WFhfQURDQ0xSSU5UUE5ETlVQCVMzQzI0MTBfQURDUkVHKDB4MjApCkBAIC0zMyw2ICszNCw3IEBACiAjZGVmaW5lIFMzQzI0MTBfQURDQ09OX1BSU0NWTE1BU0sJKDB4RkY8PDYpCiAjZGVmaW5lIFMzQzI0MTBfQURDQ09OX1NFTE1VWCh4KQkoKCh4KSYweDcpPDwzKQogI2RlZmluZSBTM0MyNDEwX0FEQ0NPTl9NVVhNQVNLCQkoMHg3PDwzKQorI2RlZmluZSBTM0MyNDE2X0FEQ0NPTl9SRVNTRUwJCSgxIDw8IDMpCiAjZGVmaW5lIFMzQzI0MTBfQURDQ09OX1NUREJNCQkoMTw8MikKICNkZWZpbmUgUzNDMjQxMF9BRENDT05fUkVBRF9TVEFSVAkoMTw8MSkKICNkZWZpbmUgUzNDMjQxMF9BRENDT05fRU5BQkxFX1NUQVJUCSgxPDwwKQpAQCAtNDAsNiArNDIsNyBAQAogCiAKIC8qIEFEQ1RTQyBSZWdpc3RlciBCaXRzICovCisjZGVmaW5lIFMzQzI0NDNfQURDVFNDX1VEX1NFTgkJKDEgPDwgOCkKICNkZWZpbmUgUzNDMjQxMF9BRENUU0NfWU1fU0VOCQkoMTw8NykKICNkZWZpbmUgUzNDMjQxMF9BRENUU0NfWVBfU0VOCQkoMTw8NikKICNkZWZpbmUgUzNDMjQxMF9BRENUU0NfWE1fU0VOCQkoMTw8NSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1kbWEuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzhiY2NiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLWRtYS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3MtZG1hLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTYW1zdW5nIFMzQzI0WFggRE1BIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9QTEFUX1JFR1NfRE1BX0gKKyNkZWZpbmUgX19BU01fUExBVF9SRUdTX0RNQV9IIF9fRklMRV9fCisKKyNkZWZpbmUgUzNDMjQxMF9ETUFfRElTUkMJCSgweDAwKQorI2RlZmluZSBTM0MyNDEwX0RNQV9ESVNSQ0MJCSgweDA0KQorI2RlZmluZSBTM0MyNDEwX0RNQV9ESURTVAkJKDB4MDgpCisjZGVmaW5lIFMzQzI0MTBfRE1BX0RJRFNUQwkJKDB4MEMpCisjZGVmaW5lIFMzQzI0MTBfRE1BX0RDT04JCSgweDEwKQorI2RlZmluZSBTM0MyNDEwX0RNQV9EU1RBVAkJKDB4MTQpCisjZGVmaW5lIFMzQzI0MTBfRE1BX0RDU1JDCQkoMHgxOCkKKyNkZWZpbmUgUzNDMjQxMF9ETUFfRENEU1QJCSgweDFDKQorI2RlZmluZSBTM0MyNDEwX0RNQV9ETUFTS1RSSUcJCSgweDIwKQorI2RlZmluZSBTM0MyNDEyX0RNQV9ETUFSRVFTRUwJCSgweDI0KQorI2RlZmluZSBTM0MyNDQzX0RNQV9ETUFSRVFTRUwJCSgweDI0KQorCisjZGVmaW5lIFMzQzI0MTBfRElTUkNDX0lOQwkJKDEgPDwgMCkKKyNkZWZpbmUgUzNDMjQxMF9ESVNSQ0NfQVBCCQkoMSA8PCAxKQorCisjZGVmaW5lIFMzQzI0MTBfRE1BU0tUUklHX1NUT1AJCSgxIDw8IDIpCisjZGVmaW5lIFMzQzI0MTBfRE1BU0tUUklHX09OCQkoMSA8PCAxKQorI2RlZmluZSBTM0MyNDEwX0RNQVNLVFJJR19TV1RSSUcJKDEgPDwgMCkKKworI2RlZmluZSBTM0MyNDEwX0RDT05fREVNQU5ECQkoMCA8PCAzMSkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0hBTkRTSEFLRQkJKDEgPDwgMzEpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9TWU5DX1BDTEsJCSgwIDw8IDMwKQorI2RlZmluZSBTM0MyNDEwX0RDT05fU1lOQ19IQ0xLCQkoMSA8PCAzMCkKKworI2RlZmluZSBTM0MyNDEwX0RDT05fSU5UUkVRCQkoMSA8PCAyOSkKKworI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gwX1hEUkVRMAkJKDAgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDBfVUFSVDAJCSgxIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gwX1NESQkJKDIgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDBfVElNRVIJCSgzIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gwX1VTQkVQMQkJKDQgPDwgMjQpCisKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMV9YRFJFUTEJCSgwIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gxX1VBUlQxCQkoMSA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMV9JMlNTREkJCSgyIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gxX1NQSQkJKDMgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDFfVVNCRVAyCQkoNCA8PCAyNCkKKworI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gyX0kyU1NETwkJKDAgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDJfSTJTU0RJCQkoMSA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMl9TREkJCSgyIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gyX1RJTUVSCQkoMyA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMl9VU0JFUDMJCSg0IDw8IDI0KQorCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDNfVUFSVDIJCSgwIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gzX1NESQkJKDEgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDNfU1BJCQkoMiA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIM19USU1FUgkJKDMgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDNfVVNCRVA0CQkoNCA8PCAyNCkKKworI2RlZmluZSBTM0MyNDEwX0RDT05fU1JDU0hJRlQJCSgyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX1NSQ01BU0sJCSg3IDw8IDI0KQorCisjZGVmaW5lIFMzQzI0MTBfRENPTl9CWVRFCQkoMCA8PCAyMCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0hBTEZXT1JECQkoMSA8PCAyMCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX1dPUkQJCSgyIDw8IDIwKQorCisjZGVmaW5lIFMzQzI0MTBfRENPTl9BVVRPUkVMT0FECQkoMCA8PCAyMikKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX05PUkVMT0FECQkoMSA8PCAyMikKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0hXVFJJRwkJKDEgPDwgMjMpCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDAKKworI2RlZmluZSBTM0MyNDQwX0RJRFNUQ19DSEtJTlQJCSgxIDw8IDIpCisKKyNkZWZpbmUgUzNDMjQ0MF9EQ09OX0NIMF9JMlNTRE8JCSg1IDw8IDI0KQorI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gwX1BDTUlOCQkoNiA8PCAyNCkKKworI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gxX1BDTU9VVAkJKDUgPDwgMjQpCisjZGVmaW5lIFMzQzI0NDBfRENPTl9DSDFfU0RJCQkoNiA8PCAyNCkKKworI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gyX1BDTUlOCQkoNSA8PCAyNCkKKyNkZWZpbmUgUzNDMjQ0MF9EQ09OX0NIMl9NSUNJTgkJKDYgPDwgMjQpCisKKyNkZWZpbmUgUzNDMjQ0MF9EQ09OX0NIM19NSUNJTgkJKDUgPDwgMjQpCisjZGVmaW5lIFMzQzI0NDBfRENPTl9DSDNfUENNT1VUCQkoNiA8PCAyNCkKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX1MzQzI0NDAgKi8KKworI2lmZGVmIENPTkZJR19DUFVfUzNDMjQxMgorCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1NSQyh4KQkoKHgpIDw8IDEpCisKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfSFcJCSgxKQorCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1NQSTBUWAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMCkKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfU1BJMFJYCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxKQorI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9TUEkxVFgJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDIpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1NQSTFSWAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMykKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfSTJTVFgJCVMzQzI0MTJfRE1BUkVRU0VMX1NSQyg0KQorI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9JMlNSWAkJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDUpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1RJTUVSCQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoOSkKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfU0RJCQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTApCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VTQkVQMQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTMpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VTQkVQMglTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTQpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VTQkVQMwlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTUpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VTQkVQNAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTYpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1hEUkVRMAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTcpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1hEUkVRMQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTgpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQwXzAJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDE5KQorI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMF8xCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygyMCkKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDFfMAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMjEpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQxXzEJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDIyKQorI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMl8wCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygyMykKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDJfMQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMjQpCisjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDEyICovCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDMKKworI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9TUkMoeCkJKCh4KSA8PCAxKQorCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX0hXCQkoMSkKKworI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9TUEkwVFgJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDApCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1NQSTBSWAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMSkKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfU1BJMVRYCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyKQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9TUEkxUlgJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDMpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX0kyU1RYCQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoNCkKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfSTJTUlgJCVMzQzI0NDNfRE1BUkVRU0VMX1NSQyg1KQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9USU1FUgkJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDkpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1NESQkJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDEwKQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9YRFJFUTAJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDE3KQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9YRFJFUTEJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDE4KQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMF8wCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygxOSkKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDBfMQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjApCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQxXzAJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDIxKQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMV8xCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyMikKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDJfMAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjMpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQyXzEJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDI0KQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUM18wCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyNSkKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDNfMQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjYpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1BDTU9VVAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjcpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1BDTUlOCQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjgpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX01JQ0lOCQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjkpCisjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDQzICovCisKKyNlbmRpZiAvKiBfX0FTTV9QTEFUX1JFR1NfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1paXMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1paXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMThkMzVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLWlpcy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1paXMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBTaW10ZWMgRWxlY3Ryb25pY3MgPGxpbnV4QHNpbXRlYy5jby51az4KKyAqCQkgICAgICBodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogUzNDMjQxMCBJSVMgcmVnaXN0ZXIgZGVmaW5pdGlvbgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfSUlTX0gKKyNkZWZpbmUgX19BU01fQVJDSF9SRUdTX0lJU19ICisKKyNkZWZpbmUgUzNDMjQxMF9JSVNDT04JCQkoMHgwMCkKKworI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9MUklOREVYCQkoMSA8PCA4KQorI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9UWEZJRk9SRFkJKDEgPDwgNykKKyNkZWZpbmUgUzNDMjQxMF9JSVNDT05fUlhGSUZPUkRZCSgxIDw8IDYpCisjZGVmaW5lIFMzQzI0MTBfSUlTQ09OX1RYRE1BRU4JCSgxIDw8IDUpCisjZGVmaW5lIFMzQzI0MTBfSUlTQ09OX1JYRE1BRU4JCSgxIDw8IDQpCisjZGVmaW5lIFMzQzI0MTBfSUlTQ09OX1RYSURMRQkJKDEgPDwgMykKKyNkZWZpbmUgUzNDMjQxMF9JSVNDT05fUlhJRExFCQkoMSA8PCAyKQorI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9QU0NFTgkJKDEgPDwgMSkKKyNkZWZpbmUgUzNDMjQxMF9JSVNDT05fSUlTRU4JCSgxIDw8IDApCisKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0QJCQkoMHgwNCkKKworI2RlZmluZSBTM0MyNDQwX0lJU01PRF9NUExMCQkoMSA8PCA5KQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF9TTEFWRQkJKDEgPDwgOCkKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfTk9YRkVSCQkoMCA8PCA2KQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF9SWE1PREUJCSgxIDw8IDYpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EX1RYTU9ERQkJKDIgPDwgNikKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfVFhSWE1PREUJCSgzIDw8IDYpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EX0xSX0xMT1cJCSgwIDw8IDUpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EX0xSX1JMT1cJCSgxIDw8IDUpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EX0lJUwkJKDAgPDwgNCkKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfTVNCCQkoMSA8PCA0KQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF84QklUCQkoMCA8PCAzKQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF8xNkJJVAkJKDEgPDwgMykKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfQklUTUFTSwkJKDEgPDwgMykKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfMjU2RlMJCSgwIDw8IDIpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzM4NEZTCQkoMSA8PCAyKQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF8xNkZTCQkoMCA8PCAwKQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF8zMkZTCQkoMSA8PCAwKQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF80OEZTCQkoMiA8PCAwKQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF9GU19NQVNLCQkoMyA8PCAwKQorCisjZGVmaW5lIFMzQzI0MTBfSUlTUFNSCQkJKDB4MDgpCisKKyNkZWZpbmUgUzNDMjQxMF9JSVNQU1JfSU5UTUFTSwkJKDMxIDw8IDUpCisjZGVmaW5lIFMzQzI0MTBfSUlTUFNSX0lOVFNISUZUCQkoNSkKKyNkZWZpbmUgUzNDMjQxMF9JSVNQU1JfRVhUTUFTSwkJKDMxIDw8IDApCisjZGVmaW5lIFMzQzI0MTBfSUlTUFNSX0VYVFNIRklUCQkoMCkKKworI2RlZmluZSBTM0MyNDEwX0lJU0ZDT04JCQkoMHgwYykKKworI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fVFhETUEJCSgxIDw8IDE1KQorI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fUlhETUEJCSgxIDw8IDE0KQorI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fVFhFTkFCTEUJKDEgPDwgMTMpCisjZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9SWEVOQUJMRQkoMSA8PCAxMikKKyNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OX1RYTUFTSwkJKDB4M2YgPDwgNikKKyNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OX1RYU0hJRlQJCSg2KQorI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fUlhNQVNLCQkoMHgzZikKKyNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OX1JYU0hJRlQJCSgwKQorCisjZGVmaW5lIFMzQzI0MTBfSUlTRklGTwkJCSgweDEwKQorCisjZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX0lJU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3Mtc3BpLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3Mtc3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyZmU3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zcGkuaApAQCAtMCwwICsxLDQ4IEBACisvKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3Mtc3BpLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRmV0cm9uIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFMzQzI0MTAgU1BJIHJlZ2lzdGVyIGRlZmluaXRpb24KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9SRUdTX1NQSV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19TUElfSAorCisjZGVmaW5lIFMzQzI0MTBfU1BJMQkJKDB4MjApCisjZGVmaW5lIFMzQzI0MTJfU1BJMQkJKDB4MTAwKQorCisjZGVmaW5lIFMzQzI0MTBfU1BDT04JCSgweDAwKQorCisjZGVmaW5lIFMzQzI0MTBfU1BDT05fU01PRF9ETUEJKDIgPDwgNSkJLyogRE1BIG1vZGUgKi8KKyNkZWZpbmUgUzNDMjQxMF9TUENPTl9TTU9EX0lOVAkoMSA8PCA1KQkvKiBpbnRlcnJ1cHQgbW9kZSAqLworI2RlZmluZSBTM0MyNDEwX1NQQ09OX1NNT0RfUE9MTAkoMCA8PCA1KQkvKiBwb2xsaW5nIG1vZGUgKi8KKyNkZWZpbmUgUzNDMjQxMF9TUENPTl9FTlNDSwkoMSA8PCA0KQkvKiBFbmFibGUgU0NLICovCisjZGVmaW5lIFMzQzI0MTBfU1BDT05fTVNUUgkoMSA8PCAzKQkvKiBNYXN0ZXI6MSwgU2xhdmU6MCBzZWxlY3QgKi8KKyNkZWZpbmUgUzNDMjQxMF9TUENPTl9DUE9MX0hJR0gJKDEgPDwgMikJLyogQ2xvY2sgcG9sYXJpdHkgc2VsZWN0ICovCisjZGVmaW5lIFMzQzI0MTBfU1BDT05fQ1BPTF9MT1cJKDAgPDwgMikJLyogQ2xvY2sgcG9sYXJpdHkgc2VsZWN0ICovCisKKyNkZWZpbmUgUzNDMjQxMF9TUENPTl9DUEhBX0ZNVEIJKDEgPDwgMSkJLyogQ2xvY2sgUGhhc2UgU2VsZWN0ICovCisjZGVmaW5lIFMzQzI0MTBfU1BDT05fQ1BIQV9GTVRBCSgwIDw8IDEpCS8qIENsb2NrIFBoYXNlIFNlbGVjdCAqLworCisjZGVmaW5lIFMzQzI0MTBfU1BTVEEJCSgweDA0KQorCisjZGVmaW5lIFMzQzI0MTBfU1BTVEFfRENPTAkoMSA8PCAyKQkvKiBEYXRhIENvbGxpc2lvbiBFcnJvciAqLworI2RlZmluZSBTM0MyNDEwX1NQU1RBX01VTEQJKDEgPDwgMSkJLyogTXVsdGkgTWFzdGVyIEVycm9yICovCisjZGVmaW5lIFMzQzI0MTBfU1BTVEFfUkVBRFkJKDEgPDwgMCkJLyogRGF0YSBUeC9SeCByZWFkeSAqLworI2RlZmluZSBTM0MyNDEyX1NQU1RBX1JFQURZX09SRwkoMSA8PCAzKQorCisjZGVmaW5lIFMzQzI0MTBfU1BQSU4JCSgweDA4KQorCisjZGVmaW5lIFMzQzI0MTBfU1BQSU5fRU5NVUwJKDEgPDwgMikJLyogTXVsdGkgTWFzdGVyIEVycm9yIGRldGVjdCAqLworI2RlZmluZSBTM0MyNDEwX1NQUElOX1JFU0VSVkVECSgxIDw8IDEpCisjZGVmaW5lIFMzQzI0MTBfU1BQSU5fS0VFUAkoMSA8PCAwKQkvKiBNYXN0ZXIgT3V0IGtlZXAgKi8KKworI2RlZmluZSBTM0MyNDEwX1NQUFJFCQkoMHgwQykKKyNkZWZpbmUgUzNDMjQxMF9TUFREQVQJCSgweDEwKQorI2RlZmluZSBTM0MyNDEwX1NQUkRBVAkJKDB4MTQpCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1JFR1NfU1BJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zcm9tLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3Mtc3JvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjcyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3Mtc3JvbS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zcm9tLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogUzVQIFNST01DIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19QTEFUX1NBTVNVTkdfUkVHU19TUk9NX0gKKyNkZWZpbmUgX19QTEFUX1NBTVNVTkdfUkVHU19TUk9NX0ggX19GSUxFX18KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKyNkZWZpbmUgUzVQX1NST01SRUcoeCkJCShTNVBfVkFfU1JPTUMgKyAoeCkpCisKKyNkZWZpbmUgUzVQX1NST01fQlcJCVM1UF9TUk9NUkVHKDB4MCkKKyNkZWZpbmUgUzVQX1NST01fQkMwCQlTNVBfU1JPTVJFRygweDQpCisjZGVmaW5lIFM1UF9TUk9NX0JDMQkJUzVQX1NST01SRUcoMHg4KQorI2RlZmluZSBTNVBfU1JPTV9CQzIJCVM1UF9TUk9NUkVHKDB4YykKKyNkZWZpbmUgUzVQX1NST01fQkMzCQlTNVBfU1JPTVJFRygweDEwKQorI2RlZmluZSBTNVBfU1JPTV9CQzQJCVM1UF9TUk9NUkVHKDB4MTQpCisjZGVmaW5lIFM1UF9TUk9NX0JDNQkJUzVQX1NST01SRUcoMHgxOCkKKworLyogb25lIHJlZ2lzdGVyIEJXIGhvbGRzIDQgeCA0LWJpdCBwYWNrZWQgc2V0dGluZ3MgZm9yIE5DUzAgLSBOQ1MzICovCisKKyNkZWZpbmUgUzVQX1NST01fQldfX0RBVEFXSURUSF9fU0hJRlQJCTAKKyNkZWZpbmUgUzVQX1NST01fQldfX0FERFJNT0RFX19TSElGVAkJMQorI2RlZmluZSBTNVBfU1JPTV9CV19fV0FJVEVOQUJMRV9fU0hJRlQJCTIKKyNkZWZpbmUgUzVQX1NST01fQldfX0JZVEVFTkFCTEVfX1NISUZUCQkzCisKKyNkZWZpbmUgUzVQX1NST01fQldfX0NTX01BU0sJCQkweGYKKworI2RlZmluZSBTNVBfU1JPTV9CV19fTkNTMF9fU0hJRlQJCTAKKyNkZWZpbmUgUzVQX1NST01fQldfX05DUzFfX1NISUZUCQk0CisjZGVmaW5lIFM1UF9TUk9NX0JXX19OQ1MyX19TSElGVAkJOAorI2RlZmluZSBTNVBfU1JPTV9CV19fTkNTM19fU0hJRlQJCTEyCisjZGVmaW5lIFM1UF9TUk9NX0JXX19OQ1M0X19TSElGVAkJMTYKKyNkZWZpbmUgUzVQX1NST01fQldfX05DUzVfX1NISUZUCQkyMAorCisvKiBhcHBsaWVzIHRvIHNhbWUgdG8gQkNTMCAtIEJDUzMgKi8KKworI2RlZmluZSBTNVBfU1JPTV9CQ1hfX1BNQ19fU0hJRlQJCTAKKyNkZWZpbmUgUzVQX1NST01fQkNYX19UQUNQX19TSElGVAkJNAorI2RlZmluZSBTNVBfU1JPTV9CQ1hfX1RDQUhfX1NISUZUCQk4CisjZGVmaW5lIFM1UF9TUk9NX0JDWF9fVENPSF9fU0hJRlQJCTEyCisjZGVmaW5lIFM1UF9TUk9NX0JDWF9fVEFDQ19fU0hJRlQJCTE2CisjZGVmaW5lIFM1UF9TUk9NX0JDWF9fVENPU19fU0hJRlQJCTI0CisjZGVmaW5lIFM1UF9TUk9NX0JDWF9fVEFDU19fU0hJRlQJCTI4CisKKyNlbmRpZiAvKiBfX1BMQVRfU0FNU1VOR19SRUdTX1NST01fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXVkYy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXVkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDNkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3MtdWRjLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy11ZGMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBIZXJiZXJ0IFBvZXR6bCA8aGVyYmVydEAxM3RoZmxvb3IuYXQ+CisgKgorICogVGhpcyBpbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfVURDX0gKKyNkZWZpbmUgX19BU01fQVJDSF9SRUdTX1VEQ19ICisKKyNkZWZpbmUgUzNDMjQxMF9VU0JEUkVHKHgpICh4KQorCisjZGVmaW5lIFMzQzI0MTBfVURDX0ZVTkNfQUREUl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE0MCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfUFdSX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE0NCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVBfSU5UX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE0OCkKKworI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE1OCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVBfSU5UX0VOX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTVjKQorCisjZGVmaW5lIFMzQzI0MTBfVURDX1VTQl9JTlRfRU5fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxNmMpCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfRlJBTUVfTlVNMV9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE3MCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRlJBTUVfTlVNMl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE3NCkKKworI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfRklGT19SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDFjMCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0ZJRk9fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxYzQpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9GSUZPX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMWM4KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRklGT19SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDFjYykKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0ZJRk9fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxZDApCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0RNQV9DT04JCVMzQzI0MTBfVVNCRFJFRygweDAyMDApCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMV9ETUFfVU5JVAlTM0MyNDEwX1VTQkRSRUcoMHgwMjA0KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDFfRE1BX0ZJRk8JUzNDMjQxMF9VU0JEUkVHKDB4MDIwOCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0RNQV9UVENfTAlTM0MyNDEwX1VTQkRSRUcoMHgwMjBjKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDFfRE1BX1RUQ19NCVMzQzI0MTBfVVNCRFJFRygweDAyMTApCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMV9ETUFfVFRDX0gJUzNDMjQxMF9VU0JEUkVHKDB4MDIxNCkKKworI2RlZmluZSBTM0MyNDEwX1VEQ19FUDJfRE1BX0NPTgkJUzNDMjQxMF9VU0JEUkVHKDB4MDIxOCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAyX0RNQV9VTklUCVMzQzI0MTBfVVNCRFJFRygweDAyMWMpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9ETUFfRklGTwlTM0MyNDEwX1VTQkRSRUcoMHgwMjIwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDJfRE1BX1RUQ19MCVMzQzI0MTBfVVNCRFJFRygweDAyMjQpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9ETUFfVFRDX00JUzNDMjQxMF9VU0JEUkVHKDB4MDIyOCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAyX0RNQV9UVENfSAlTM0MyNDEwX1VTQkRSRUcoMHgwMjJjKQorCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQM19ETUFfQ09OCQlTM0MyNDEwX1VTQkRSRUcoMHgwMjQwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRE1BX1VOSVQJUzNDMjQxMF9VU0JEUkVHKDB4MDI0NCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAzX0RNQV9GSUZPCVMzQzI0MTBfVVNCRFJFRygweDAyNDgpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQM19ETUFfVFRDX0wJUzNDMjQxMF9VU0JEUkVHKDB4MDI0YykKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAzX0RNQV9UVENfTQlTM0MyNDEwX1VTQkRSRUcoMHgwMjUwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRE1BX1RUQ19ICVMzQzI0MTBfVVNCRFJFRygweDAyNTQpCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0RNQV9DT04JCVMzQzI0MTBfVVNCRFJFRygweDAyNTgpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQNF9ETUFfVU5JVAlTM0MyNDEwX1VTQkRSRUcoMHgwMjVjKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDRfRE1BX0ZJRk8JUzNDMjQxMF9VU0JEUkVHKDB4MDI2MCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0RNQV9UVENfTAlTM0MyNDEwX1VTQkRSRUcoMHgwMjY0KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDRfRE1BX1RUQ19NCVMzQzI0MTBfVVNCRFJFRygweDAyNjgpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQNF9ETUFfVFRDX0gJUzNDMjQxMF9VU0JEUkVHKDB4MDI2YykKKworI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxNzgpCisKKy8qIGluZGV4ZWQgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfTUFYUF9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxODApCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxODQpCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxODQpCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHCQlTM0MyNDEwX1VTQkRSRUcoMHgwMTg4KQorCisjZGVmaW5lIFMzQzI0MTBfVURDX09VVF9DU1IxX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTkwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19PVVRfQ1NSMl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE5NCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfT1VUX0ZJRk9fQ05UMV9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE5OCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfT1VUX0ZJRk9fQ05UMl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE5YykKKworI2RlZmluZSBTM0MyNDEwX1VEQ19GVU5DQUREUl9VUERBVEUJKDEgPDwgNykKKworI2RlZmluZSBTM0MyNDEwX1VEQ19QV1JfSVNPVVAJCSgxIDw8IDcpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19QV1JfUkVTRVQJCSgxIDw8IDMpIC8qIFIgICAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19QV1JfUkVTVU1FCQkoMSA8PCAyKSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfUFdSX1NVU1BFTkQJCSgxIDw8IDEpIC8qIFIgICAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19QV1JfRU5TVVNQRU5ECSgxIDw8IDApIC8qIFIvVyAqLworCisjZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9ERUZBVUxUCQkoMHgwMCkKKworI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRfRVA0CQkoMSA8PCA0KSAvKiBSL1cgKGNsZWFyIG9ubHkpICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOVF9FUDMJCSgxIDw8IDMpIC8qIFIvVyAoY2xlYXIgb25seSkgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSU5UX0VQMgkJKDEgPDwgMikgLyogUi9XIChjbGVhciBvbmx5KSAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRfRVAxCQkoMSA8PCAxKSAvKiBSL1cgKGNsZWFyIG9ubHkpICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOVF9FUDAJCSgxIDw8IDApIC8qIFIvVyAoY2xlYXIgb25seSkgKi8KKworI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JJTlRfUkVTRVQJKDEgPDwgMikgLyogUi9XIChjbGVhciBvbmx5KSAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JJTlRfUkVTVU1FCSgxIDw8IDEpIC8qIFIvVyAoY2xlYXIgb25seSkgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfVVNCSU5UX1NVU1BFTkQJKDEgPDwgMCkgLyogUi9XIChjbGVhciBvbmx5KSAqLworCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOVEVfRVA0CQkoMSA8PCA0KSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSU5URV9FUDMJCSgxIDw8IDMpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRFX0VQMgkJKDEgPDwgMikgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOVEVfRVAxCQkoMSA8PCAxKSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSU5URV9FUDAJCSgxIDw8IDApIC8qIFIvVyAqLworCisjZGVmaW5lIFMzQzI0MTBfVURDX1VTQklOVEVfUkVTRVQJKDEgPDwgMikgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX1VTQklOVEVfU1VTUEVORAkoMSA8PCAwKSAvKiBSL1cgKi8KKworI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDAJCSgweDAwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDEJCSgweDAxKQorI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDIJCSgweDAyKQorI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDMJCSgweDAzKQorI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9FUDQJCSgweDA0KQorCisjZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IxX0NMUkRUCQkoMSA8PCA2KSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfU0VOVFNUTAkoMSA8PCA1KSAvKiBSL1cgKGNsZWFyIG9ubHkpICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IxX1NFTkRTVEwJKDEgPDwgNCkgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IxX0ZGTFVTSAkoMSA8PCAzKSAvKiBXICAgKHNldCBvbmx5KSAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMV9VTkRSVU4JKDEgPDwgMikgLyogUi9XIChjbGVhciBvbmx5KSAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMV9QS1RSRFkJKDEgPDwgMCkgLyogUi9XIChzZXQgb25seSkgKi8KKworI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMl9BVVRPU0VUCSgxIDw8IDcpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMl9JU08JCSgxIDw8IDYpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMl9NT0RFSU4JKDEgPDwgNSkgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IyX0RNQUlFTgkoMSA8PCA0KSAvKiBSL1cgKi8KKworI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9DTFJEVAkJKDEgPDwgNykgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX09DU1IxX1NFTlRTVEwJKDEgPDwgNikgLyogUi9XIChjbGVhciBvbmx5KSAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9TRU5EU1RMCSgxIDw8IDUpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9GRkxVU0gJKDEgPDwgNCkgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX09DU1IxX0RFUlJPUgkoMSA8PCAzKSAvKiBSICAgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjFfT1ZSUlVOCSgxIDw8IDIpIC8qIFIvVyAoY2xlYXIgb25seSkgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjFfUEtUUkRZCSgxIDw8IDApIC8qIFIvVyAoY2xlYXIgb25seSkgKi8KKworI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMl9BVVRPQ0xSCSgxIDw8IDcpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMl9JU08JCSgxIDw8IDYpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMl9ETUFJRU4JKDEgPDwgNSkgLyogUi9XICovCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9PUEtSRFkJKDEgPDwgMCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9JUEtSRFkJKDEgPDwgMSkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9TRU5UU1RMCSgxIDw8IDIpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfREUJCSgxIDw8IDMpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfU0UJCSgxIDw8IDQpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfU0VORFNUTAkoMSA8PCA1KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NPUEtUUkRZCSgxIDw8IDYpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfU1NFCQkoMSA8PCA3KQorCisjZGVmaW5lIFMzQzI0MTBfVURDX01BWFBfOAkJKDEgPDwgMCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfTUFYUF8xNgkJKDEgPDwgMSkKKyNkZWZpbmUgUzNDMjQxMF9VRENfTUFYUF8zMgkJKDEgPDwgMikKKyNkZWZpbmUgUzNDMjQxMF9VRENfTUFYUF82NAkJKDEgPDwgMykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3Jlc2V0LmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3Jlc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjYTUxNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVzZXQuaApAQCAtMCwwICsxLDE2IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3Jlc2V0LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fUExBVF9TQU1TVU5HX1JFU0VUX0gKKyNkZWZpbmUgX19QTEFUX1NBTVNVTkdfUkVTRVRfSCBfX0ZJTEVfXworCitleHRlcm4gdm9pZCAoKnM1cF9yZXNldF9ob29rKSh2b2lkKTsKKworI2VuZGlmIC8qIF9fUExBVF9TQU1TVU5HX1JFU0VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjLWRtYS1wbDMzMC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MtZG1hLXBsMzMwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMDc0NDIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MtZG1hLXBsMzMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZC4KLSAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYJX19TM0NfRE1BX1BMMzMwX0hfCi0jZGVmaW5lCV9fUzNDX0RNQV9QTDMzMF9IXwotCi0jZGVmaW5lIFMzQzI0MTBfRE1BRl9BVVRPU1RBUlQJCSgxIDw8IDApCi0jZGVmaW5lIFMzQzI0MTBfRE1BRl9DSVJDVUxBUgkJKDEgPDwgMSkKLQotLyoKLSAqIFBMMzMwIGNhbiBhc3NpZ24gYW55IGNoYW5uZWwgdG8gY29tbXVuaWNhdGUgd2l0aAotICogYW55IG9mIHRoZSBwZXJpcGhlcmFscyBhdHRjaGVkIHRvIHRoZSBETUFDLgotICogRm9yIHRoZSBzYWtlIG9mIGNvbnNpc3RlbmN5IGFjcm9zcyBjbGllbnQgZHJpdmVycywKLSAqIFdlIGtlZXAgdGhlIGNoYW5uZWwgbmFtZXMgdW5jaGFuZ2VkIGFuZCBvbmx5IGFkZAotICogbWlzc2luZyBwZXJpcGhlcmFscyBhcmUgYWRkZWQuCi0gKiBPcmRlciBpcyBub3QgaW1wb3J0YW50IHNpbmNlIFMzQyBQTDMzMCBBUEkgZHJpdmVyCi0gKiB1c2UgdGhlc2UganVzdCBhcyBJRHMuCi0gKi8KLWVudW0gZG1hX2NoIHsKLQlETUFDSF9VQVJUMF9SWCwKLQlETUFDSF9VQVJUMF9UWCwKLQlETUFDSF9VQVJUMV9SWCwKLQlETUFDSF9VQVJUMV9UWCwKLQlETUFDSF9VQVJUMl9SWCwKLQlETUFDSF9VQVJUMl9UWCwKLQlETUFDSF9VQVJUM19SWCwKLQlETUFDSF9VQVJUM19UWCwKLQlETUFDSF9VQVJUNF9SWCwKLQlETUFDSF9VQVJUNF9UWCwKLQlETUFDSF9VQVJUNV9SWCwKLQlETUFDSF9VQVJUNV9UWCwKLQlETUFDSF9VU0lfUlgsCi0JRE1BQ0hfVVNJX1RYLAotCURNQUNIX0lSREEsCi0JRE1BQ0hfSTJTMF9SWCwKLQlETUFDSF9JMlMwX1RYLAotCURNQUNIX0kyUzBTX1RYLAotCURNQUNIX0kyUzFfUlgsCi0JRE1BQ0hfSTJTMV9UWCwKLQlETUFDSF9JMlMyX1JYLAotCURNQUNIX0kyUzJfVFgsCi0JRE1BQ0hfU1BJMF9SWCwKLQlETUFDSF9TUEkwX1RYLAotCURNQUNIX1NQSTFfUlgsCi0JRE1BQ0hfU1BJMV9UWCwKLQlETUFDSF9TUEkyX1JYLAotCURNQUNIX1NQSTJfVFgsCi0JRE1BQ0hfQUM5N19NSUNJTiwKLQlETUFDSF9BQzk3X1BDTUlOLAotCURNQUNIX0FDOTdfUENNT1VULAotCURNQUNIX0VYVEVSTkFMLAotCURNQUNIX1BXTSwKLQlETUFDSF9TUERJRiwKLQlETUFDSF9IU0lfUlgsCi0JRE1BQ0hfSFNJX1RYLAotCURNQUNIX1BDTTBfVFgsCi0JRE1BQ0hfUENNMF9SWCwKLQlETUFDSF9QQ00xX1RYLAotCURNQUNIX1BDTTFfUlgsCi0JRE1BQ0hfUENNMl9UWCwKLQlETUFDSF9QQ00yX1JYLAotCURNQUNIX01TTV9SRVEzLAotCURNQUNIX01TTV9SRVEyLAotCURNQUNIX01TTV9SRVExLAotCURNQUNIX01TTV9SRVEwLAotCURNQUNIX1NMSU1CVVMwX1JYLAotCURNQUNIX1NMSU1CVVMwX1RYLAotCURNQUNIX1NMSU1CVVMwQVVYX1JYLAotCURNQUNIX1NMSU1CVVMwQVVYX1RYLAotCURNQUNIX1NMSU1CVVMxX1JYLAotCURNQUNIX1NMSU1CVVMxX1RYLAotCURNQUNIX1NMSU1CVVMyX1JYLAotCURNQUNIX1NMSU1CVVMyX1RYLAotCURNQUNIX1NMSU1CVVMzX1JYLAotCURNQUNIX1NMSU1CVVMzX1RYLAotCURNQUNIX1NMSU1CVVM0X1JYLAotCURNQUNIX1NMSU1CVVM0X1RYLAotCURNQUNIX1NMSU1CVVM1X1JYLAotCURNQUNIX1NMSU1CVVM1X1RYLAotCS8qIEVORCBNYXJrZXIsIGFsc28gdXNlZCB0byBkZW5vdGUgYSByZXNlcnZlZCBjaGFubmVsICovCi0JRE1BQ0hfTUFYLAotfTsKLQotc3RhdGljIGlubGluZSBib29sIHMzY19kbWFfaGFzX2NpcmN1bGFyKHZvaWQpCi17Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLSNpbmNsdWRlIDxwbGF0L2RtYS5oPgotCi0jZW5kaWYJLyogX19TM0NfRE1BX1BMMzMwX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYy1wbDMzMC1wZGF0YS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MtcGwzMzAtcGRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1ZTJhOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYy1wbDMzMC1wZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MtcGwzMzAtcGRhdGEuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQuCi0gKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9fUzNDX1BMMzMwX1BEQVRBX0gKLSNkZWZpbmUgX19TM0NfUEwzMzBfUERBVEFfSAotCi0jaW5jbHVkZSA8cGxhdC9zM2MtZG1hLXBsMzMwLmg+Ci0KLS8qCi0gKiBFdmVyeSBQTDMzMCBETUFDIGhhcyBtYXggMzIgcGVyaXBoZXJhbCBpbnRlcmZhY2VzLAotICogb2Ygd2hpY2ggc29tZSBtYXkgYmUgbm90IGJlIHJlYWxseSB1c2VkIGluIHlvdXIKLSAqIERNQUMncyBjb25maWd1cmF0aW9uLgotICogUG9wdWxhdGUgdGhpcyBhcnJheSBvZiAzMiBwZXJpIGkvZnMgd2l0aCByZWxldmFudAotICogY2hhbm5lbCBJRHMgZm9yIHVzZWQgcGVyaSBpL2YgYW5kIERNQUNIX01BWCBmb3IKLSAqIHRob3NlIHVudXNlZC4KLSAqCi0gKiBUaGUgcGxhdGZvcm1zIGp1c3QgbmVlZCB0byBwcm92aWRlIHRoaXMgaW5mbwotICogdG8gdGhlIFMzQyBETUEgQVBJIGRyaXZlciBmb3IgUEwzMzAuCi0gKi8KLXN0cnVjdCBzM2NfcGwzMzBfcGxhdGRhdGEgewotCWVudW0gZG1hX2NoIHBlcmlbMzJdOwotfTsKLQotI2VuZGlmIC8qIF9fUzNDX1BMMzMwX1BEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQxMC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDEwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4NjQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQxMC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQxMC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEhlYWRlciBmaWxlIGZvciBzM2MyNDEwIG1hY2hpbmUgZGlyZWN0b3J5CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEwCisKK2V4dGVybiAgaW50IHMzYzI0MTBfaW5pdCh2b2lkKTsKK2V4dGVybiAgaW50IHMzYzI0MTBhX2luaXQodm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTBfbWFwX2lvKHZvaWQpOworCitleHRlcm4gdm9pZCBzM2MyNDEwX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOworCitleHRlcm4gdm9pZCBzM2MyNDEwX2luaXRfY2xvY2tzKGludCB4dGFsKTsKKworI2Vsc2UKKyNkZWZpbmUgczNjMjQxMF9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHMzYzI0MTBfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHMzYzI0MTBfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczNjMjQxMF9pbml0IE5VTEwKKyNkZWZpbmUgczNjMjQxMGFfaW5pdCBOVUxMCisjZW5kaWYKKworZXh0ZXJuIGludCBzM2MyNDEwX2Jhc2VjbGtfYWRkKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDEyLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNmZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDEyLmgKQEAgLTAsMCArMSwyOSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDEyLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogSGVhZGVyIGZpbGUgZm9yIHMzYzI0MTIgY3B1IHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmZGVmIENPTkZJR19DUFVfUzNDMjQxMgorCitleHRlcm4gIGludCBzM2MyNDEyX2luaXQodm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTJfbWFwX2lvKHZvaWQpOworCitleHRlcm4gdm9pZCBzM2MyNDEyX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOworCitleHRlcm4gdm9pZCBzM2MyNDEyX2luaXRfY2xvY2tzKGludCB4dGFsKTsKKworZXh0ZXJuICBpbnQgczNjMjQxMl9iYXNlY2xrX2FkZCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHMzYzI0MTJfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBzM2MyNDEyX2luaXRfdWFydHMgTlVMTAorI2RlZmluZSBzM2MyNDEyX21hcF9pbyBOVUxMCisjZGVmaW5lIHMzYzI0MTJfaW5pdCBOVUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQxNi5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2NGY4NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQxNi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQxNi5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFlhdWhlbiBLaGFydXpoeSA8amVraG9yQGdtYWlsLmNvbT4KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczNjMjQxNiBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDE2CisKK3N0cnVjdCBzM2MyNDEwX3VhcnRjZmc7CisKK2V4dGVybiAgaW50IHMzYzI0MTZfaW5pdCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxNl9tYXBfaW8odm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTZfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTZfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCitleHRlcm4gIGludCBzM2MyNDE2X2Jhc2VjbGtfYWRkKHZvaWQpOworCisjZWxzZQorI2RlZmluZSBzM2MyNDE2X2luaXRfY2xvY2tzIE5VTEwKKyNkZWZpbmUgczNjMjQxNl9pbml0X3VhcnRzIE5VTEwKKyNkZWZpbmUgczNjMjQxNl9tYXBfaW8gTlVMTAorI2RlZmluZSBzM2MyNDE2X2luaXQgTlVMTAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0NDMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQ0My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWUxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0NDMuaApAQCAtMCwwICsxLDUyIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0NDMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEhlYWRlciBmaWxlIGZvciBzM2MyNDQzIGNwdSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDMKKworc3RydWN0IHMzYzI0MTBfdWFydGNmZzsKKworZXh0ZXJuICBpbnQgczNjMjQ0M19pbml0KHZvaWQpOworCitleHRlcm4gdm9pZCBzM2MyNDQzX21hcF9pbyh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQ0M19pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKKworZXh0ZXJuIHZvaWQgczNjMjQ0M19pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKK2V4dGVybiAgaW50IHMzYzI0NDNfYmFzZWNsa19hZGQodm9pZCk7CisKKyNlbHNlCisjZGVmaW5lIHMzYzI0NDNfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBzM2MyNDQzX2luaXRfdWFydHMgTlVMTAorI2RlZmluZSBzM2MyNDQzX21hcF9pbyBOVUxMCisjZGVmaW5lIHMzYzI0NDNfaW5pdCBOVUxMCisjZW5kaWYKKworLyogY29tbW9uIGNvZGUgdXNlZCBieSBzM2MyNDQzIGFuZCBvdGhlcnMuCisgKiBub3RlLCBub3QgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIGFyY2gvYXJtL21hY2gtczNjKiAqLworCitzdHJ1Y3QgY2xrOwkvKiBzb21lIGZpbGVzIGRvbid0IG5lZWQgY2xrLmggb3RoZXJ3aXNlICovCisKK3R5cGVkZWYgdW5zaWduZWQgaW50ICgqcGxsX2ZuKSh1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgYmFzZSk7CisKK2V4dGVybiB2b2lkIHMzYzI0NDNfY29tbW9uX3NldHVwX2Nsb2NrcyhwbGxfZm4gZ2V0X21wbGwpOworZXh0ZXJuIHZvaWQgczNjMjQ0M19jb21tb25faW5pdF9jbG9ja3MoaW50IHh0YWwsIHBsbF9mbiBnZXRfbXBsbCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpkaXZzLCBpbnQgbnJfZGl2cywKKwkJCQkgICAgICAgaW50IGRpdm1hc2spOworCitleHRlcm4gaW50IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9oKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CitleHRlcm4gaW50IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CitleHRlcm4gaW50IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9zKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CisKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZXBsbHJlZjsKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZXN5c2NsazsKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbXN5c2NsazsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQ0eC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwYzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQ0eC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQ0eC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogSGVhZGVyIGZpbGUgZm9yIFMzQzI0NDAgYW5kIFMzQzI0NDIgY3B1IHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDQwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQ0MikKKworZXh0ZXJuIHZvaWQgczNjMjQ0eF9tYXBfaW8odm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0NHhfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CisKK2V4dGVybiB2b2lkIHMzYzI0NHhfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCisjZWxzZQorI2RlZmluZSBzM2MyNDR4X2luaXRfY2xvY2tzIE5VTEwKKyNkZWZpbmUgczNjMjQ0eF9pbml0X3VhcnRzIE5VTEwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCitleHRlcm4gIGludCBzM2MyNDQwX2luaXQodm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0NDBfbWFwX2lvKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgczNjMjQ0MF9pbml0IE5VTEwKKyNkZWZpbmUgczNjMjQ0MF9tYXBfaW8gTlVMTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDIKK2V4dGVybiAgaW50IHMzYzI0NDJfaW5pdCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQ0Ml9tYXBfaW8odm9pZCk7CisjZWxzZQorI2RlZmluZSBzM2MyNDQyX2luaXQgTlVMTAorI2RlZmluZSBzM2MyNDQyX21hcF9pbyBOVUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjNjQwMC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkNDI4YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjNjQwMC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjNjQwMC5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczNjNjQwMCBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisvKiBDb21tb24gaW5pdCBjb2RlIGZvciBTM0M2NDAwIHJlbGF0ZWQgU29DcyAqLworCitleHRlcm4gdm9pZCBzM2M2NDAwX2NvbW1vbl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKK2V4dGVybiB2b2lkIHMzYzY0MDBfc2V0dXBfY2xvY2tzKHZvaWQpOworCitleHRlcm4gdm9pZCBzM2M2NHh4X3JlZ2lzdGVyX2Nsb2Nrcyh1bnNpZ25lZCBsb25nIHh0YWwsIHVuc2lnbmVkIGFybWNsa19saW1pdCk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzY0MDAKKworZXh0ZXJuICBpbnQgczNjNjQwMF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgczNjNjQwMF9pbml0X2lycSh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzY0MDBfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgczNjNjQwMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKKyNkZWZpbmUgczNjNjQwMF9pbml0X3VhcnRzIHMzYzY0MDBfY29tbW9uX2luaXRfdWFydHMKKworI2Vsc2UKKyNkZWZpbmUgczNjNjQwMF9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHMzYzY0MDBfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHMzYzY0MDBfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczNjNjQwMF9pbml0IE5VTEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NDEwLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0MTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGE2Njc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NDEwLmgKQEAgLTAsMCArMSwyOSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NDEwLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczNjNjQxMCBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0M2NDEwCisKK2V4dGVybiAgaW50IHMzYzY0MTBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzY0MTBfaW5pdF9pcnEodm9pZCk7CitleHRlcm4gdm9pZCBzM2M2NDEwX21hcF9pbyh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzY0MTBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCisjZGVmaW5lIHMzYzY0MTBfaW5pdF91YXJ0cyBzM2M2NDAwX2NvbW1vbl9pbml0X3VhcnRzCisKKyNlbHNlCisjZGVmaW5lIHMzYzY0MTBfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBzM2M2NDEwX2luaXRfdWFydHMgTlVMTAorI2RlZmluZSBzM2M2NDEwX21hcF9pbyBOVUxMCisjZGVmaW5lIHMzYzY0MTBfaW5pdCBOVUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwLWNsb2NrLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cC1jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NGJmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cC1jbG9jay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwLWNsb2NrLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczVwIGNsb2NrIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9QTEFUX1M1UF9DTE9DS19ICisjZGVmaW5lIF9fQVNNX1BMQVRfUzVQX0NMT0NLX0ggX19GSUxFX18KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjZGVmaW5lIEdFVF9ESVYoY2xrLCBmaWVsZCkgKCgoKGNsaykgJiBmaWVsZCMjX01BU0spID4+IGZpZWxkIyNfU0hJRlQpICsgMSkKKworI2RlZmluZSBjbGtfZmluX2FwbGwgY2xrX2V4dF94dGFsX211eAorI2RlZmluZSBjbGtfZmluX21wbGwgY2xrX2V4dF94dGFsX211eAorI2RlZmluZSBjbGtfZmluX2VwbGwgY2xrX2V4dF94dGFsX211eAorI2RlZmluZSBjbGtfZmluX2RwbGwgY2xrX2V4dF94dGFsX211eAorI2RlZmluZSBjbGtfZmluX3ZwbGwgY2xrX2V4dF94dGFsX211eAorI2RlZmluZSBjbGtfZmluX2hwbGwgY2xrX2V4dF94dGFsX211eAorCitleHRlcm4gc3RydWN0IGNsayBjbGtfZXh0X3h0YWxfbXV4OworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX3h1c2J4dGk7CitleHRlcm4gc3RydWN0IGNsayBjbGtfNDhtOworZXh0ZXJuIHN0cnVjdCBjbGsgczVwX2Nsa18yN207CitleHRlcm4gc3RydWN0IGNsayBjbGtfZm91dF9hcGxsOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2ZvdXRfbXBsbDsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19mb3V0X2VwbGw7CitleHRlcm4gc3RydWN0IGNsayBjbGtfZm91dF9kcGxsOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2ZvdXRfdnBsbDsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19hcm07CitleHRlcm4gc3RydWN0IGNsayBjbGtfdnBsbDsKKworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtfc3JjX2FwbGw7CitleHRlcm4gc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa19zcmNfbXBsbDsKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrX3NyY19lcGxsOworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtfc3JjX2RwbGw7CisKK2V4dGVybiBpbnQgczVwX2dhdGVjdHJsKHZvaWQgX19pb21lbSAqcmVnLCBzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOworCisvKiBDb21tb24gRVBMTCBvcGVyYXRpb25zIGZvciBTNVAgcGxhdGZvcm0gKi8KK2V4dGVybiBpbnQgczVwX2VwbGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzNXBfZXBsbF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspOworCisvKiBTUERJRiBjbGsgb3BlcmF0aW9ucyBjb21tb24gZm9yIFM1UEMxMDAvVjIxMC9DMTEwIGFuZCBFeHlub3M0ICovCitleHRlcm4gaW50IHM1cF9zcGRpZl9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzNXBfc3BkaWZfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKTsKKworZXh0ZXJuIHN0cnVjdCBjbGtfb3BzIHM1cF9zY2xrX3NwZGlmX29wczsKKyNlbmRpZiAvKiBfX0FTTV9QTEFUX1M1UF9DTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cC10aW1lLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cC10aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3MGFlYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwLXRpbWUuaApAQCAtMCwwICsxLDQwIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cC10aW1lLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHM1cCB0aW1lIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9QTEFUX1M1UF9USU1FX0gKKyNkZWZpbmUgX19BU01fUExBVF9TNVBfVElNRV9IIF9fRklMRV9fCisKKy8qIFM1UCBIUi1UaW1lciBDbG9jayBtb2RlICovCitlbnVtIHM1cF90aW1lcl9tb2RlIHsKKwlTNVBfUFdNMCwKKwlTNVBfUFdNMSwKKwlTNVBfUFdNMiwKKwlTNVBfUFdNMywKKwlTNVBfUFdNNCwKK307CisKK3N0cnVjdCBzNXBfdGltZXJfc291cmNlIHsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfaWQ7CisJdW5zaWduZWQgaW50IHNvdXJjZV9pZDsKK307CisKKy8qIEJlIGFibGUgdG8gc2xlZXAgZm9yIGF0bGVhc3QgNCBzZWNvbmRzICh1c3VhbGx5IG1vcmUpICovCisjZGVmaW5lIFM1UFRJTUVSX01JTl9SQU5HRQk0CisKKyNkZWZpbmUgVENOVF9NQVgJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgTk9OX1BFUklPRElDCQkwCisjZGVmaW5lIFBFUklPRElDCQkxCisKK2V4dGVybiB2b2lkIF9faW5pdCBzNXBfc2V0X3RpbWVyX3NvdXJjZShlbnVtIHM1cF90aW1lcl9tb2RlIGV2ZW50LAorCQkJCQllbnVtIHM1cF90aW1lcl9tb2RlIHNvdXJjZSk7CitleHRlcm4Jc3RydWN0IHN5c190aW1lciBzNXBfdGltZXI7CisjZW5kaWYgLyogX19BU01fUExBVF9TNVBfVElNRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cDY0NDAuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwNjQ0MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODVlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cDY0NDAuaApAQCAtMCwwICsxLDM2IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cDY0NDAuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHM1cDY0NDAgY3B1IHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworIC8qIENvbW1vbiBpbml0IGNvZGUgZm9yIFM1UDY0NDAgcmVsYXRlZCBTb0NzICovCisKK2V4dGVybiB2b2lkIHM1cDY0NDBfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOworZXh0ZXJuIHZvaWQgczVwNjQ0MF9zZXR1cF9jbG9ja3Modm9pZCk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UDY0NDAKKworZXh0ZXJuICBpbnQgczVwNjR4MF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgczVwNjQ0MF9pbml0X2lycSh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cDY0NDBfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgczVwNjQ0MF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKK2V4dGVybiB2b2lkIHM1cDY0NDBfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CisKKyNlbHNlCisjZGVmaW5lIHM1cDY0NDBfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBzNXA2NDQwX2luaXRfdWFydHMgTlVMTAorI2RlZmluZSBzNXA2NDQwX21hcF9pbyBOVUxMCisjZGVmaW5lIHM1cDY0eDBfaW5pdCBOVUxMCisjZW5kaWYKKworLyogUzVQNjQ0MCB0aW1lciAqLworCitleHRlcm4gc3RydWN0IHN5c190aW1lciBzNXA2NDQwX3RpbWVyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXA2NDUwLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cDY0NTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTI1ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXA2NDUwLmgKQEAgLTAsMCArMSwzNiBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXA2NDUwLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHM1cDY0NTAgY3B1IHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworLyogQ29tbW9uIGluaXQgY29kZSBmb3IgUzVQNjQ1MCByZWxhdGVkIFNvQ3MgKi8KKworZXh0ZXJuIHZvaWQgczVwNjQ1MF9yZWdpc3Rlcl9jbG9ja3Modm9pZCk7CitleHRlcm4gdm9pZCBzNXA2NDUwX3NldHVwX2Nsb2Nrcyh2b2lkKTsKKworI2lmZGVmIENPTkZJR19DUFVfUzVQNjQ1MAorCitleHRlcm4gIGludCBzNXA2NHgwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBzNXA2NDUwX2luaXRfaXJxKHZvaWQpOworZXh0ZXJuIHZvaWQgczVwNjQ1MF9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBzNXA2NDUwX2luaXRfY2xvY2tzKGludCB4dGFsKTsKKworZXh0ZXJuIHZvaWQgczVwNjQ1MF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKKworI2Vsc2UKKyNkZWZpbmUgczVwNjQ1MF9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHM1cDY0NTBfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHM1cDY0NTBfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczVwNjR4MF9pbml0IE5VTEwKKyNlbmRpZgorCisvKiBTNVA2NDUwIHRpbWVyICovCisKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIHM1cDY0NTBfdGltZXI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cGMxMDAuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwYzEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjFhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cGMxMDAuaApAQCAtMCwwICsxLDMzIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cGMxMDAuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHM1cGMxMDAgY3B1IHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworLyogQ29tbW9uIGluaXQgY29kZSBmb3IgUzVQQzEwMCByZWxhdGVkIFNvQ3MgKi8KKworZXh0ZXJuIHZvaWQgczVwYzEwMF9jb21tb25faW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CitleHRlcm4gdm9pZCBzNXBjMTAwX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cGMxMDBfc2V0dXBfY2xvY2tzKHZvaWQpOworCisjaWZkZWYgQ09ORklHX0NQVV9TNVBDMTAwCisKK2V4dGVybiAgaW50IHM1cGMxMDBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cGMxMDBfaW5pdF9pcnEodm9pZCk7CitleHRlcm4gdm9pZCBzNXBjMTAwX21hcF9pbyh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cGMxMDBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCisjZGVmaW5lIHM1cGMxMDBfaW5pdF91YXJ0cyBzNXBjMTAwX2NvbW1vbl9pbml0X3VhcnRzCisKKyNlbHNlCisjZGVmaW5lIHM1cGMxMDBfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBzNXBjMTAwX2luaXRfdWFydHMgTlVMTAorI2RlZmluZSBzNXBjMTAwX21hcF9pbyBOVUxMCisjZGVmaW5lIHM1cGMxMDBfaW5pdCBOVUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwdjIxMC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXB2MjEwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiYzZiZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cHYyMTAuaApAQCAtMCwwICsxLDMzIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cHYyMTAuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHM1cHYyMTAgY3B1IHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworLyogQ29tbW9uIGluaXQgY29kZSBmb3IgUzVQVjIxMCByZWxhdGVkIFNvQ3MgKi8KKworZXh0ZXJuIHZvaWQgczVwdjIxMF9jb21tb25faW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CitleHRlcm4gdm9pZCBzNXB2MjEwX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cHYyMTBfc2V0dXBfY2xvY2tzKHZvaWQpOworCisjaWZkZWYgQ09ORklHX0NQVV9TNVBWMjEwCisKK2V4dGVybiAgaW50IHM1cHYyMTBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cHYyMTBfaW5pdF9pcnEodm9pZCk7CitleHRlcm4gdm9pZCBzNXB2MjEwX21hcF9pbyh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cHYyMTBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCisjZGVmaW5lIHM1cHYyMTBfaW5pdF91YXJ0cyBzNXB2MjEwX2NvbW1vbl9pbml0X3VhcnRzCisKKyNlbHNlCisjZGVmaW5lIHM1cHYyMTBfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBzNXB2MjEwX2luaXRfdWFydHMgTlVMTAorI2RlZmluZSBzNXB2MjEwX21hcF9pbyBOVUxMCisjZGVmaW5lIHM1cHYyMTBfaW5pdCBOVUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvc2RoY2kuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvc2RoY2kuaAppbmRleCAwNThlMDk2Li5lN2IzYzc1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3NkaGNpLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zZGhjaS5oCkBAIC01NSwxMCArNTUsNiBAQAogICoJCSBjZF90eXBlID09IFMzQ19TREhDSV9DRF9HUElPCiAgKiBAZXh0X2NkX2dwaW9faW52ZXJ0OiBpbnZlcnQgdmFsdWVzIGZvciBleHRlcm5hbCBDRCBncGlvIGxpbmUKICAqIEBjZmdfZ3BpbzogQ29uZmlndXJlIHRoZSBHUElPIGZvciBhIHNwZWNpZmljIGNhcmQgYml0LXdpZHRoCi0gKiBAY2ZnX2NhcmQ6IENvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlIGZvciBhIHNwZWNpZmljIGNhcmQgYW5kIHNwZWVkLiBUaGlzCi0gKiAgICAgICAgICAgIGlzIG5lY2Vzc2FyeSB0aGUgY29udHJvbGxlcnMgYW5kL29yIEdQSU8gYmxvY2tzIHJlcXVpcmUgdGhlCi0gKgkgICAgICBjaGFuZ2luZyBvZiBkcml2ZXItc3RyZW5ndGggYW5kIG90aGVyIGNvbnRyb2xzIGRlcGVuZGVudCBvbgotICoJICAgICAgdGhlIGNhcmQgYW5kIHNwZWVkIG9mIG9wZXJhdGlvbi4KICAqCiAgKiBJbml0aWFsaXNhdGlvbiBkYXRhIHNwZWNpZmljIHRvIGVpdGhlciB0aGUgbWFjaGluZSBvciB0aGUgcGxhdGZvcm0KICAqIGZvciB0aGUgZGV2aWNlIGRyaXZlciB0byB1c2Ugb3IgY2FsbC1iYWNrIHdoZW4gY29uZmlndXJpbmcgZ3BpbyBvcgpAQCAtODAsMTIgKzc2LDE1IEBACiAJCQkJCQkgICAgICBpbnQgc3RhdGUpKTsKIAogCXZvaWQJKCpjZmdfZ3Bpbykoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBpbnQgd2lkdGgpOwotCXZvaWQJKCpjZmdfY2FyZCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAotCQkJICAgIHZvaWQgX19pb21lbSAqcmVnYmFzZSwKLQkJCSAgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJICAgIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiB9OwogCisvKiBzM2Nfc2RoY2lfc2V0X3BsYXRkYXRhKCkgLSBjb21tb24gaGVscGVyIGZvciBzZXR0aW5nIFNESENJIHBsYXRmb3JtIGRhdGEKKyAqIEBwZDogVGhlIGRlZmF1bHQgcGxhdGZvcm0gZGF0YSBmb3IgdGhpcyBkZXZpY2UuCisgKiBAc2V0OiBQb2ludGVyIHRvIHRoZSBwbGF0Zm9ybSBkYXRhIHRvIGZpbGwgaW4uCisgKi8KK2V4dGVybiB2b2lkIHMzY19zZGhjaV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqcGQsCisJCQkJICAgIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnNldCk7CisKIC8qKgogICogczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEgLSBTZXQgcGxhdGZvcm0gZGF0YSBmb3IgUzNDIFNESENJIGRldmljZS4KICAqIEBwZDogUGxhdGZvcm0gZGF0YSB0byByZWdpc3RlciB0byBkZXZpY2UuCkBAIC0xMzIsMTcgKzEzMSwxMSBAQAogI2lmZGVmIENPTkZJR19TM0MyNDE2X1NFVFVQX1NESENJCiBleHRlcm4gY2hhciAqczNjMjQxNl9oc21tY19jbGtzcmNzWzRdOwogCi1leHRlcm4gdm9pZCBzM2MyNDE2X3NldHVwX3NkaGNpX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkJICAgdm9pZCBfX2lvbWVtICpyLAotCQkJCQkgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCQkgICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgczNjMjQxNl9kZWZhdWx0X3NkaGNpMCh2b2lkKQogewogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DCiAJczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2xvY2tzID0gczNjMjQxNl9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczNjMjQxNl9zZXR1cF9zZGhjaTBfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzM2MyNDE2X3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX0hTTU1DICovCiB9CiAKQEAgLTE1MSw3ICsxNDQsNiBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMQogCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHMzYzI0MTZfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHMzYzI0MTZfc2V0dXBfc2RoY2kxX2NmZ19ncGlvOwotCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczNjMjQxNl9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9IU01NQzEgKi8KIH0KIApAQCAtMTY1LDE3ICsxNTcsMTEgQEAKICNpZmRlZiBDT05GSUdfUzNDNjRYWF9TRVRVUF9TREhDSQogZXh0ZXJuIGNoYXIgKnMzYzY0eHhfaHNtbWNfY2xrc3Jjc1s0XTsKIAotZXh0ZXJuIHZvaWQgczNjNjQwMF9zZXR1cF9zZGhjaV9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCQkJCSB2b2lkIF9faW9tZW0gKnIsCi0JCQkJCSBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCQkgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKLQogc3RhdGljIGlubGluZSB2b2lkIHMzYzY0MDBfZGVmYXVsdF9zZGhjaTAodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQwogCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHMzYzY0eHhfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHMzYzY0eHhfc2V0dXBfc2RoY2kwX2NmZ19ncGlvOwotCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczNjNjQwMF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0xODQsNyArMTcwLDYgQEAKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzEKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzM2M2NHh4X2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzM2M2NHh4X3NldHVwX3NkaGNpMV9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHMzYzY0MDBfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApAQCAtMTkzLDIxICsxNzgsMTQgQEAKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzIKIAlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzM2M2NHh4X2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzM2M2NHh4X3NldHVwX3NkaGNpMl9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHMzYzY0MDBfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIAotZXh0ZXJuIHZvaWQgczNjNjQxMF9zZXR1cF9zZGhjaV9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCQkJCSB2b2lkIF9faW9tZW0gKnIsCi0JCQkJCSBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCQkgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKLQogc3RhdGljIGlubGluZSB2b2lkIHMzYzY0MTBfZGVmYXVsdF9zZGhjaTAodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQwogCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHMzYzY0eHhfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHMzYzY0eHhfc2V0dXBfc2RoY2kwX2NmZ19ncGlvOwotCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczNjNjQxMF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0yMTYsNyArMTk0LDYgQEAKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzEKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzM2M2NHh4X2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzM2M2NHh4X3NldHVwX3NkaGNpMV9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHMzYzY0MTBfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApAQCAtMjI1LDcgKzIwMiw2IEBACiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMyCiAJczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2xvY2tzID0gczNjNjR4eF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzJfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczNjNjR4eF9zZXR1cF9zZGhjaTJfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzM2M2NDEwX3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTI0NCwxNyArMjIwLDExIEBACiAjaWZkZWYgQ09ORklHX1M1UEMxMDBfU0VUVVBfU0RIQ0kKIGV4dGVybiBjaGFyICpzNXBjMTAwX2hzbW1jX2Nsa3NyY3NbNF07CiAKLWV4dGVybiB2b2lkIHM1cGMxMDBfc2V0dXBfc2RoY2kwX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkJICAgdm9pZCBfX2lvbWVtICpyLAotCQkJCQkgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCQkgICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgczVwYzEwMF9kZWZhdWx0X3NkaGNpMCh2b2lkKQogewogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DCiAJczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2xvY2tzID0gczVwYzEwMF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczVwYzEwMF9zZXR1cF9zZGhjaTBfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzNXBjMTAwX3NldHVwX3NkaGNpMF9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0yNjMsNyArMjMzLDYgQEAKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzEKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzNXBjMTAwX2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzNXBjMTAwX3NldHVwX3NkaGNpMV9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHM1cGMxMDBfc2V0dXBfc2RoY2kwX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTI3Miw3ICsyNDEsNiBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMgogCXMzY19oc21tYzJfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHM1cGMxMDBfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHM1cGMxMDBfc2V0dXBfc2RoY2kyX2NmZ19ncGlvOwotCXMzY19oc21tYzJfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczVwYzEwMF9zZXR1cF9zZGhjaTBfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApAQCAtMjg4LDE3ICsyNTYsMTEgQEAKICNpZmRlZiBDT05GSUdfUzVQVjIxMF9TRVRVUF9TREhDSQogZXh0ZXJuIGNoYXIgKnM1cHYyMTBfaHNtbWNfY2xrc3Jjc1s0XTsKIAotZXh0ZXJuIHZvaWQgczVwdjIxMF9zZXR1cF9zZGhjaV9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCQkJCSAgIHZvaWQgX19pb21lbSAqciwKLQkJCQkJICAgc3RydWN0IG1tY19pb3MgKmlvcywKLQkJCQkJICAgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKLQogc3RhdGljIGlubGluZSB2b2lkIHM1cHYyMTBfZGVmYXVsdF9zZGhjaTAodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQwogCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHM1cHYyMTBfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHM1cHYyMTBfc2V0dXBfc2RoY2kwX2NmZ19ncGlvOwotCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczVwdjIxMF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0zMDcsNyArMjY5LDYgQEAKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzEKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzNXB2MjEwX2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzNXB2MjEwX3NldHVwX3NkaGNpMV9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHM1cHYyMTBfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApAQCAtMzE2LDcgKzI3Nyw2IEBACiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMyCiAJczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2xvY2tzID0gczVwdjIxMF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzJfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczVwdjIxMF9zZXR1cF9zZGhjaTJfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzNXB2MjEwX3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTMyNSw3ICsyODUsNiBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMwogCXMzY19oc21tYzNfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHM1cHYyMTBfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMzX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHM1cHYyMTBfc2V0dXBfc2RoY2kzX2NmZ19ncGlvOwotCXMzY19oc21tYzNfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczVwdjIxMF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0zNDEsMTcgKzMwMCwxMSBAQAogI2lmZGVmIENPTkZJR19FWFlOT1M0X1NFVFVQX1NESENJCiBleHRlcm4gY2hhciAqZXh5bm9zNF9oc21tY19jbGtzcmNzWzRdOwogCi1leHRlcm4gdm9pZCBleHlub3M0X3NldHVwX3NkaGNpX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkJICAgdm9pZCBfX2lvbWVtICpyLAotCQkJCQkgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCQkgICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgZXh5bm9zNF9kZWZhdWx0X3NkaGNpMCh2b2lkKQogewogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DCiAJczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2xvY2tzID0gZXh5bm9zNF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gZXh5bm9zNF9zZXR1cF9zZGhjaTBfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBleHlub3M0X3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTM2MCw3ICszMTMsNiBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMQogCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IGV4eW5vczRfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IGV4eW5vczRfc2V0dXBfc2RoY2kxX2NmZ19ncGlvOwotCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gZXh5bm9zNF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0zNjksNyArMzIxLDYgQEAKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzIKIAlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBleHlub3M0X2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBleHlub3M0X3NldHVwX3NkaGNpMl9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IGV4eW5vczRfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApAQCAtMzc4LDcgKzMyOSw2IEBACiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMzCiAJczNjX2hzbW1jM19kZWZfcGxhdGRhdGEuY2xvY2tzID0gZXh5bm9zNF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzNfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gZXh5bm9zNF9zZXR1cF9zZGhjaTNfY2ZnX2dwaW87Ci0JczNjX2hzbW1jM19kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBleHlub3M0X3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvc3lzbW11LmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3N5c21tdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZThlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3N5c21tdS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvc3lzbW11LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBTYW1zdW5nIFN5c3RlbSBNTVUgZHJpdmVyIGZvciBTNVAgcGxhdGZvcm0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX1BMQVRfU0FNU1VOR19TWVNNTVVfSAorI2RlZmluZSBfX1BMQVRfU0FNU1VOR19TWVNNTVVfSCBfX0ZJTEVfXworCitlbnVtIFM1UF9TWVNNTVVfSU5URVJSVVBUX1RZUEUgeworCVNZU01NVV9QQUdFRkFVTFQsCisJU1lTTU1VX0FSX01VTFRJSElULAorCVNZU01NVV9BV19NVUxUSUhJVCwKKwlTWVNNTVVfQlVTRVJST1IsCisJU1lTTU1VX0FSX1NFQ1VSSVRZLAorCVNZU01NVV9BUl9BQ0NFU1MsCisJU1lTTU1VX0FXX1NFQ1VSSVRZLAorCVNZU01NVV9BV19QUk9URUNUSU9OLCAvKiA3ICovCisJU1lTTU1VX0ZBVUxUU19OVU0KK307CisKKyNpZmRlZiBDT05GSUdfUzVQX1NZU1RFTV9NTVUKKworI2luY2x1ZGUgPG1hY2gvc3lzbW11Lmg+CisKKy8qKgorICogczVwX3N5c21tdV9lbmFibGUoKSAtIGVuYWJsZSBzeXN0ZW0gbW11IG9mIGlwCisgKiBAaXBzOiBUaGUgaXAgY29ubmVjdGVkIHN5c3RlbSBtbXUuCisgKiAjcGdkOiBCYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIDFzdCBsZXZlbCBwYWdlIHRhYmxlCisgKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGUgc3lzdGVtIG1tdSB0byB0cmFuc2ZlciBhZGRyZXNzCisgKiBmcm9tIHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK3ZvaWQgczVwX3N5c21tdV9lbmFibGUoc3lzbW11X2lwcyBpcHMsIHVuc2lnbmVkIGxvbmcgcGdkKTsKKworLyoqCisgKiBzNXBfc3lzbW11X2Rpc2FibGUoKSAtIGRpc2FibGUgc3lzbW11IG1tdSBvZiBpcAorICogQGlwczogVGhlIGlwIGNvbm5lY3RlZCBzeXN0ZW0gbW11LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGlzYWJsZSBzeXN0ZW0gbW11IHRvIHRyYW5zZmVyIGFkZHJlc3MKKyAqIGZyb20gdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MKKyAqLwordm9pZCBzNXBfc3lzbW11X2Rpc2FibGUoc3lzbW11X2lwcyBpcHMpOworCisvKioKKyAqIHM1cF9zeXNtbXVfc2V0X3RhYmxlYmFzZV9wZ2QoKSAtIHNldCBwYWdlIHRhYmxlIGJhc2UgYWRkcmVzcyB0byByZWZlciBwYWdlIHRhYmxlCisgKiBAaXBzOiBUaGUgaXAgY29ubmVjdGVkIHN5c3RlbSBtbXUuCisgKiBAcGdkOiBUaGUgcGFnZSB0YWJsZSBiYXNlIGFkZHJlc3MuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXQgcGFnZSB0YWJsZSBiYXNlIGFkZHJlc3MKKyAqIFdoZW4gc3lzdGVtIG1tdSB0cmFuc2ZlciBhZGRyZXNzIGZyb20gdmlydGF1bCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MsCisgKiBzeXN0ZW0gbW11IHJlZmVyIGFkZHJlc3MgaW5mb3JtYXRpb24gZnJvbSBwYWdlIHRhYmxlCisgKi8KK3ZvaWQgczVwX3N5c21tdV9zZXRfdGFibGViYXNlX3BnZChzeXNtbXVfaXBzIGlwcywgdW5zaWduZWQgbG9uZyBwZ2QpOworCisvKioKKyAqIHM1cF9zeXNtbXVfdGxiX2ludmFsaWRhdGUoKSAtIGZsdXNoIGFsbCBUTEIgZW50cnkgaW4gc3lzdGVtIG1tdQorICogQGlwczogVGhlIGlwIGNvbm5lY3RlZCBzeXN0ZW0gbW11LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZmx1c2ggYWxsIFRMQiBlbnRyeSBpbiBzeXN0ZW0gbW11CisgKi8KK3ZvaWQgczVwX3N5c21tdV90bGJfaW52YWxpZGF0ZShzeXNtbXVfaXBzIGlwcyk7CisKKy8qKiBzNXBfc3lzbW11X3NldF9mYXVsdF9oYW5kbGVyKCkgLSBGYXVsdCBoYW5kbGVyIGZvciBTeXN0ZW0gTU1VcworICogQGl0eXBlOiB0eXBlIG9mIGZhdWx0LgorICogQHBndGFibGVfYmFzZTogdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcGFnZSB0YWJsZSBiYXNlLiBUaGlzIGlzIDAgaWYgQGlwcyBpcworICogICAgICAgICAgICAgICBTWVNNTVVfQlVTRVJST1IuCisgKiBAZmF1bHRfYWRkcjogdGhlIGRldmljZSAodmlydHVhbCkgYWRkcmVzcyB0aGF0IHRoZSBTeXN0ZW0gTU1VIHRyaWVkIHRvCisgKiAgICAgICAgICAgICB0cmFuc2xhdGVkLiBUaGlzIGlzIDAgaWYgQGlwcyBpcyBTWVNNTVVfQlVTRVJST1IuCisgKiBDYWxsZWQgd2hlbiBpbnRlcnJ1cHQgb2NjdXJyZWQgYnkgdGhlIFN5c3RlbSBNTVVzCisgKiBUaGUgZGV2aWNlIGRyaXZlcnMgb2YgcGVyaXBoZXJhbCBkZXZpY2VzIHRoYXQgaGFzIGEgU3lzdGVtIE1NVSBjYW4gaW1wbGVtZW50CisgKiBhIGZhdWx0IGhhbmRsZXIgdG8gcmVzb2x2ZSBhZGRyZXNzIHRyYW5zbGF0aW9uIGZhdWx0IGJ5IFN5c3RlbSBNTVUuCisgKiBUaGUgbWVhbmluZ3Mgb2YgcmV0dXJuIHZhbHVlIGFuZCBwYXJhbWV0ZXJzIGFyZSBkZXNjcmliZWQgYmVsb3cuCisKKyAqIHJldHVybiB2YWx1ZTogbm9uLXplcm8gaWYgdGhlIGZhdWx0IGlzIGNvcnJlY3RseSByZXNvbHZlZC4KKyAqICAgICAgICAgemVybyBpZiB0aGUgZmF1bHQgaXMgbm90IGhhbmRsZWQuCisgKi8KK3ZvaWQgczVwX3N5c21tdV9zZXRfZmF1bHRfaGFuZGxlcihzeXNtbXVfaXBzIGlwcywKKwkJCWludCAoKmhhbmRsZXIpKGVudW0gUzVQX1NZU01NVV9JTlRFUlJVUFRfVFlQRSBpdHlwZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBwZ3RhYmxlX2Jhc2UsCisJCQkJCXVuc2lnbmVkIGxvbmcgZmF1bHRfYWRkcikpOworI2Vsc2UKKyNkZWZpbmUgczVwX3N5c21tdV9lbmFibGUoaXBzLCBwZ2QpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgczVwX3N5c21tdV9kaXNhYmxlKGlwcykgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzNXBfc3lzbW11X3NldF90YWJsZWJhc2VfcGdkKGlwcywgcGdkKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHM1cF9zeXNtbXVfdGxiX2ludmFsaWRhdGUoaXBzKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHM1cF9zeXNtbXVfc2V0X2ZhdWx0X2hhbmRsZXIoaXBzLCBoYW5kbGVyKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNlbmRpZiAvKiBfX0FTTV9QTEFUX1NZU01NVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3N5c3RlbS1yZXNldC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zeXN0ZW0tcmVzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQ4ZTk5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvc3lzdGVtLXJlc2V0LmgKQEAgLTAsMCArMSwzMSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zeXN0ZW0tcmVzZXQuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3N5c3RlbS1yZXNldC5oCisgKgorICogUzVQIC0gU3lzdGVtIGRlZmluZSBmb3IgYXJjaF9yZXNldCgpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxwbGF0L3dhdGNoZG9nLXJlc2V0Lmg+CisKK3ZvaWQgKCpzNXBfcmVzZXRfaG9vaykodm9pZCk7CisKK3N0YXRpYyB2b2lkIGFyY2hfcmVzZXQoY2hhciBtb2RlLCBjb25zdCBjaGFyICpjbWQpCit7CisJLyogU1dSRVNFVCBzdXBwb3J0IGluIHM1cF9yZXNldF9ob29rKCkgKi8KKworCWlmIChzNXBfcmVzZXRfaG9vaykKKwkJczVwX3Jlc2V0X2hvb2soKTsKKworCS8qIFBlcmZvcm0gcmVzZXQgdXNpbmcgV2F0Y2hkb2cgcmVzZXQKKwkgKiBpZiB0aGVyZSBpcyBubyBzNXBfcmVzZXRfaG9vaygpCisJICovCisKKwlhcmNoX3dkdF9yZXNldCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC90di1jb3JlLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3R2LWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmMzNGYzYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvdHYtY29yZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3R2LmgKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJVG9tYXN6IFN0YW5pc2xhd3NraSA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPgorICoKKyAqIFNhbXN1bmcgVFYgZHJpdmVyIGNvcmUgZnVuY3Rpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fU0FNU1VOR19QTEFUX1RWX0gKKyNkZWZpbmUgX19TQU1TVU5HX1BMQVRfVFZfSCBfX0ZJTEVfXworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGZvciB1c2Ugd2l0aCB0aGUgY29yZSBzdXBwb3J0IGNvZGUsIHN1Y2ggYXMKKyAqIHRoZSBDUFUtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gY29kZS4KKyAqLworCisvKiBSZS1kZWZpbmUgZGV2aWNlIG5hbWUgdG8gZGlmZmVyZW50aWF0ZSB0aGUgc3Vic3lzdGVtIGluIHZhcmlvdXMgU29Dcy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzNXBfaGRtaV9zZXRuYW1lKGNoYXIgKm5hbWUpCit7CisjaWZkZWYgQ09ORklHX1M1UF9ERVZfVFYKKwlzNXBfZGV2aWNlX2hkbWkubmFtZSA9IG5hbWU7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHM1cF9taXhlcl9zZXRuYW1lKGNoYXIgKm5hbWUpCit7CisjaWZkZWYgQ09ORklHX1M1UF9ERVZfVFYKKwlzNXBfZGV2aWNlX21peGVyLm5hbWUgPSBuYW1lOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzNXBfc2RvX3NldG5hbWUoY2hhciAqbmFtZSkKK3sKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9UVgorCXM1cF9kZXZpY2Vfc2RvLm5hbWUgPSBuYW1lOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBfX1NBTVNVTkdfUExBVF9UVl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3VkYy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC91ZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIyZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC91ZGMuaApAQCAtMCwwICsxLDU3IEBACisvKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3VkYy5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKgkxNC1NYXItMjAwNQlSVFAJQ3JlYXRlZCBmaWxlCisgKgkwMi1BdWctMjAwNQlSVFAJRmlsZSByZW5hbWUKKyAqCTA3LVNlcC0yMDA1CUJKRAlNaW5vciBjbGVhbnVwcywgY2hhbmdlZCBjbWQgdG8gZW51bQorICoJMTgtSmFuLTIwMDcJSE1XCUFkZCBwZXItcGxhdGZvcm0gdmJ1c19kcmF3IGZ1bmN0aW9uCisqLworCisjaWZuZGVmIF9fQVNNX0FSTV9BUkNIX1VEQ19ICisjZGVmaW5lIF9fQVNNX0FSTV9BUkNIX1VEQ19ICisKK2VudW0gczNjMjQxMF91ZGNfY21kX2UgeworCVMzQzI0MTBfVURDX1BfRU5BQkxFCT0gMSwJLyogUHVsbC11cCBlbmFibGUgICAgICAgICovCisJUzNDMjQxMF9VRENfUF9ESVNBQkxFCT0gMiwJLyogUHVsbC11cCBkaXNhYmxlICAgICAgICovCisJUzNDMjQxMF9VRENfUF9SRVNFVAk9IDMsCS8qIFVEQyByZXNldCwgaW4gY2FzZSBvZiAqLworfTsKKworc3RydWN0IHMzYzI0MTBfdWRjX21hY2hfaW5mbyB7CisJdm9pZAkoKnVkY19jb21tYW5kKShlbnVtIHMzYzI0MTBfdWRjX2NtZF9lKTsKKwl2b2lkCSgqdmJ1c19kcmF3KSh1bnNpZ25lZCBpbnQgbWEpOworCisJdW5zaWduZWQgaW50IHB1bGx1cF9waW47CisJdW5zaWduZWQgaW50IHB1bGx1cF9waW5faW52ZXJ0ZWQ7CisKKwl1bnNpZ25lZCBpbnQgdmJ1c19waW47CisJdW5zaWduZWQgY2hhciB2YnVzX3Bpbl9pbnZlcnRlZDsKK307CisKK2V4dGVybiB2b2lkIF9faW5pdCBzM2MyNHh4X3VkY19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfdWRjX21hY2hfaW5mbyAqKTsKKworLyoqCisgKiBzM2MyNHh4X2hzdWRjX3BsYXRkYXRhIC0gUGxhdGZvcm0gZGF0YSBmb3IgVVNCIEhpZ2gtU3BlZWQgZ2FkZ2V0IGNvbnRyb2xsZXIuCisgKiBAZXBudW06IE51bWJlciBvZiBlbmRwb2ludHMgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBjb250cm9sbGVyIGRyaXZlci4KKyAqIEBncGlvX2luaXQ6IFBsYXRmb3JtIHNwZWNpZmljIFVTQiByZWxhdGVkIEdQSU8gaW5pdGlhbGl6YXRpb24uCisgKiBAZ3Bpb191bmluaXQ6IFBsYXRmb3JtIHNwZWNpZmljIFVTQiByZWxldGVkIEdQSU8gdW5pbml0aWFsemF0aW9uLgorICoKKyAqIFJlcHJlc2VudGF0aW9uIG9mIHBsYXRmb3JtIGRhdGEgZm9yIHRoZSBTM0MyNFhYIFVTQiAyLjAgSGlnaCBTcGVlZCBnYWRnZXQKKyAqIGNvbnRyb2xsZXJzLgorICovCitzdHJ1Y3QgczNjMjR4eF9oc3VkY19wbGF0ZGF0YSB7CisJdW5zaWduZWQgaW50CWVwbnVtOworCXZvaWQJCSgqZ3Bpb19pbml0KSh2b2lkKTsKKwl2b2lkCQkoKmdwaW9fdW5pbml0KSh2b2lkKTsKK307CisKK2V4dGVybiB2b2lkIF9faW5pdCBzM2MyNHh4X2hzdWRjX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjR4eF9oc3VkY19wbGF0ZGF0YSAqcGQpOworCisjZW5kaWYgLyogX19BU01fQVJNX0FSQ0hfVURDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvdXNiLXBoeS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC91c2ItcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5YmNkYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvdXNiLXBoeS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKKyAqIEF1dGhvcjogSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX1BMQVRfU0FNU1VOR19VU0JfUEhZX0gKKyNkZWZpbmUgX19QTEFUX1NBTVNVTkdfVVNCX1BIWV9IIF9fRklMRV9fCisKK2VudW0gczVwX3VzYl9waHlfdHlwZSB7CisJUzVQX1VTQl9QSFlfREVWSUNFLAorCVM1UF9VU0JfUEhZX0hPU1QsCit9OworCitleHRlcm4gaW50IHM1cF91c2JfcGh5X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHR5cGUpOworZXh0ZXJuIGludCBzNXBfdXNiX3BoeV9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCB0eXBlKTsKKworI2VuZGlmIC8qIF9fUExBVF9TQU1TVU5HX1VTQl9QSFlfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BsYXRmb3JtZGF0YS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BsYXRmb3JtZGF0YS5jCmluZGV4IDdjZjJlMWUuLmNlYjlmYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbGF0Zm9ybWRhdGEuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcGxhdGZvcm1kYXRhLmMKQEAgLTEwLDEwICsxMCwxMiBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KIAogdm9pZCBfX2luaXQgKnMzY19zZXRfcGxhdGRhdGEodm9pZCAqcGQsIHNpemVfdCBwZHNpemUsCiAJCQkgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMzUsMyArMzcsMjIgQEAKIAlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IG5wZDsKIAlyZXR1cm4gbnBkOwogfQorCit2b2lkIHMzY19zZGhjaV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqcGQsCisJCQkgICAgIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnNldCkKK3sKKwlzZXQtPmNkX3R5cGUgPSBwZC0+Y2RfdHlwZTsKKwlzZXQtPmV4dF9jZF9pbml0ID0gcGQtPmV4dF9jZF9pbml0OworCXNldC0+ZXh0X2NkX2NsZWFudXAgPSBwZC0+ZXh0X2NkX2NsZWFudXA7CisJc2V0LT5leHRfY2RfZ3BpbyA9IHBkLT5leHRfY2RfZ3BpbzsKKwlzZXQtPmV4dF9jZF9ncGlvX2ludmVydCA9IHBkLT5leHRfY2RfZ3Bpb19pbnZlcnQ7CisKKwlpZiAocGQtPm1heF93aWR0aCkKKwkJc2V0LT5tYXhfd2lkdGggPSBwZC0+bWF4X3dpZHRoOworCWlmIChwZC0+Y2ZnX2dwaW8pCisJCXNldC0+Y2ZnX2dwaW8gPSBwZC0+Y2ZnX2dwaW87CisJaWYgKHBkLT5ob3N0X2NhcHMpCisJCXNldC0+aG9zdF9jYXBzIHw9IHBkLT5ob3N0X2NhcHM7CisJaWYgKHBkLT5jbGtfdHlwZSkKKwkJc2V0LT5jbGtfdHlwZSA9IHBkLT5jbGtfdHlwZTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbS1ncGlvLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0tZ3Bpby5jCmluZGV4IDk2NTI4MjAuLjRiZTAxNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbS1ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLWdwaW8uYwpAQCAtMjgsMTMgKzI4LDEzIEBACiAjZGVmaW5lIE9GRlNfREFUCSgweDA0KQogI2RlZmluZSBPRkZTX1VQCQkoMHgwOCkKIAotc3RhdGljIHZvaWQgczNjX2dwaW9fcG1fMWJpdF9zYXZlKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19ncGlvX3BtXzFiaXRfc2F2ZShzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXApCiB7CiAJY2hpcC0+cG1fc2F2ZVswXSA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UgKyBPRkZTX0NPTik7CiAJY2hpcC0+cG1fc2F2ZVsxXSA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UgKyBPRkZTX0RBVCk7CiB9CiAKLXN0YXRpYyB2b2lkIHMzY19ncGlvX3BtXzFiaXRfcmVzdW1lKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19ncGlvX3BtXzFiaXRfcmVzdW1lKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBjaGlwLT5iYXNlOwogCXUzMiBvbGRfZ3Bjb24gPSBfX3Jhd19yZWFkbChiYXNlICsgT0ZGU19DT04pOwpAQCAtNjAsMTIgKzYwLDEyIEBACiAJCSAgY2hpcC0+Y2hpcC5sYWJlbCwgb2xkX2dwY29uLCBncHNfZ3Bjb24sIG9sZF9ncGRhdCwgZ3BzX2dwZGF0KTsKIH0KIAotc3RydWN0IHMzY19ncGlvX3BtIHMzY19ncGlvX3BtXzFiaXQgPSB7Ci0JLnNhdmUJPSBzM2NfZ3Bpb19wbV8xYml0X3NhdmUsCi0JLnJlc3VtZSA9IHMzY19ncGlvX3BtXzFiaXRfcmVzdW1lLAorc3RydWN0IHNhbXN1bmdfZ3Bpb19wbSBzYW1zdW5nX2dwaW9fcG1fMWJpdCA9IHsKKwkuc2F2ZQk9IHNhbXN1bmdfZ3Bpb19wbV8xYml0X3NhdmUsCisJLnJlc3VtZSA9IHNhbXN1bmdfZ3Bpb19wbV8xYml0X3Jlc3VtZSwKIH07CiAKLXN0YXRpYyB2b2lkIHMzY19ncGlvX3BtXzJiaXRfc2F2ZShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZ3Bpb19wbV8yYml0X3NhdmUoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwKQogewogCWNoaXAtPnBtX3NhdmVbMF0gPSBfX3Jhd19yZWFkbChjaGlwLT5iYXNlICsgT0ZGU19DT04pOwogCWNoaXAtPnBtX3NhdmVbMV0gPSBfX3Jhd19yZWFkbChjaGlwLT5iYXNlICsgT0ZGU19EQVQpOwpAQCAtOTUsNyArOTUsNyBAQAogfQogCiAvKioKLSAqIHMzY19ncGlvX3BtXzJiaXRfcmVzdW1lKCkgLSByZXN0b3JlIHRoZSBnaXZlbiBHUElPIGJhbmsKKyAqIHNhbXN1bmdfZ3Bpb19wbV8yYml0X3Jlc3VtZSgpIC0gcmVzdG9yZSB0aGUgZ2l2ZW4gR1BJTyBiYW5rCiAgKiBAY2hpcDogVGhlIGNoaXAgaW5mb3JtYXRpb24gdG8gcmVzdW1lLgogICoKICAqIFJlc3RvcmUgb25lIG9mIHRoZSBHUElPIGJhbmtzIHRoYXQgd2FzIHNhdmVkIGR1cmluZyBzdXNwZW5kLiBUaGlzIGlzCkBAIC0xMjEsNyArMTIxLDcgQEAKICAqIFsxXSB0aGlzIGFzc3VtZXMgdGhhdCB3cml0aW5nIHRvIGEgcGluIERBVCB3aGlsc3QgaW4gU0ZOIHdpbGwgc2V0IHRoZQogICogICAgIHN0YXRlIGZvciB3aGVuIGl0IGlzIG5leHQgb3V0cHV0LgogICovCi1zdGF0aWMgdm9pZCBzM2NfZ3Bpb19wbV8yYml0X3Jlc3VtZShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZ3Bpb19wbV8yYml0X3Jlc3VtZShzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXApCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gY2hpcC0+YmFzZTsKIAl1MzIgb2xkX2dwY29uID0gX19yYXdfcmVhZGwoYmFzZSArIE9GRlNfQ09OKTsKQEAgLTE4NywxMyArMTg3LDEzIEBACiAJCSAgY2hpcC0+Y2hpcC5sYWJlbCwgb2xkX2dwY29uLCBncHNfZ3Bjb24sIG9sZF9ncGRhdCwgZ3BzX2dwZGF0KTsKIH0KIAotc3RydWN0IHMzY19ncGlvX3BtIHMzY19ncGlvX3BtXzJiaXQgPSB7Ci0JLnNhdmUJPSBzM2NfZ3Bpb19wbV8yYml0X3NhdmUsCi0JLnJlc3VtZSA9IHMzY19ncGlvX3BtXzJiaXRfcmVzdW1lLAorc3RydWN0IHNhbXN1bmdfZ3Bpb19wbSBzYW1zdW5nX2dwaW9fcG1fMmJpdCA9IHsKKwkuc2F2ZQk9IHNhbXN1bmdfZ3Bpb19wbV8yYml0X3NhdmUsCisJLnJlc3VtZSA9IHNhbXN1bmdfZ3Bpb19wbV8yYml0X3Jlc3VtZSwKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1MzQzY0WFgpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfUzVQKQotc3RhdGljIHZvaWQgczNjX2dwaW9fcG1fNGJpdF9zYXZlKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19ncGlvX3BtXzRiaXRfc2F2ZShzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXApCiB7CiAJY2hpcC0+cG1fc2F2ZVsxXSA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UgKyBPRkZTX0NPTik7CiAJY2hpcC0+cG1fc2F2ZVsyXSA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UgKyBPRkZTX0RBVCk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJY2hpcC0+cG1fc2F2ZVswXSA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UgLSA0KTsKIH0KIAotc3RhdGljIHUzMiBzM2NfZ3Bpb19wbV80Yml0X21hc2sodTMyIG9sZF9ncGNvbiwgdTMyIGdwc19ncGNvbikKK3N0YXRpYyB1MzIgc2Ftc3VuZ19ncGlvX3BtXzRiaXRfbWFzayh1MzIgb2xkX2dwY29uLCB1MzIgZ3BzX2dwY29uKQogewogCXUzMiBvbGQsIG5ldywgbWFzazsKIAl1MzIgY2hhbmdlX21hc2sgPSAweDA7CkBAIC0yNDIsMTQgKzI0MiwxNCBAQAogCXJldHVybiBjaGFuZ2VfbWFzazsKIH0KIAotc3RhdGljIHZvaWQgczNjX2dwaW9fcG1fNGJpdF9jb24oc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsIGludCBpbmRleCkKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZ3Bpb19wbV80Yml0X2NvbihzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsIGludCBpbmRleCkKIHsKIAl2b2lkIF9faW9tZW0gKmNvbiA9IGNoaXAtPmJhc2UgKyAoaW5kZXggKiA0KTsKIAl1MzIgb2xkX2dwY29uID0gX19yYXdfcmVhZGwoY29uKTsKIAl1MzIgZ3BzX2dwY29uID0gY2hpcC0+cG1fc2F2ZVtpbmRleCArIDFdOwogCXUzMiBncGNvbiwgbWFzazsKIAotCW1hc2sgPSBzM2NfZ3Bpb19wbV80Yml0X21hc2sob2xkX2dwY29uLCBncHNfZ3Bjb24pOworCW1hc2sgPSBzYW1zdW5nX2dwaW9fcG1fNGJpdF9tYXNrKG9sZF9ncGNvbiwgZ3BzX2dwY29uKTsKIAogCWdwY29uID0gb2xkX2dwY29uICYgfm1hc2s7CiAJZ3Bjb24gfD0gZ3BzX2dwY29uICYgbWFzazsKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCV9fcmF3X3dyaXRlbChncGNvbiwgY29uKTsKIH0KIAotc3RhdGljIHZvaWQgczNjX2dwaW9fcG1fNGJpdF9yZXN1bWUoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApCitzdGF0aWMgdm9pZCBzYW1zdW5nX2dwaW9fcG1fNGJpdF9yZXN1bWUoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGNoaXAtPmJhc2U7CiAJdTMyIG9sZF9ncGNvblsyXTsKQEAgLTI2OSwxMCArMjY5LDEwIEBACiAJb2xkX2dwY29uWzBdID0gMDsKIAlvbGRfZ3Bjb25bMV0gPSBfX3Jhd19yZWFkbChiYXNlICsgT0ZGU19DT04pOwogCi0JczNjX2dwaW9fcG1fNGJpdF9jb24oY2hpcCwgMCk7CisJc2Ftc3VuZ19ncGlvX3BtXzRiaXRfY29uKGNoaXAsIDApOwogCWlmIChjaGlwLT5jaGlwLm5ncGlvID4gOCkgewogCQlvbGRfZ3Bjb25bMF0gPSBfX3Jhd19yZWFkbChiYXNlIC0gNCk7Ci0JCXMzY19ncGlvX3BtXzRiaXRfY29uKGNoaXAsIC0xKTsKKwkJc2Ftc3VuZ19ncGlvX3BtXzRiaXRfY29uKGNoaXAsIC0xKTsKIAl9CiAKIAkvKiBOb3cgY2hhbmdlIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHJlcXVpcmUgREFULENPTiAqLwpAQCAtMjk4LDE5ICsyOTgsMTkgQEAKIAkJCSAgb2xkX2dwZGF0LCBncHNfZ3BkYXQpOwogfQogCi1zdHJ1Y3QgczNjX2dwaW9fcG0gczNjX2dwaW9fcG1fNGJpdCA9IHsKLQkuc2F2ZQk9IHMzY19ncGlvX3BtXzRiaXRfc2F2ZSwKLQkucmVzdW1lID0gczNjX2dwaW9fcG1fNGJpdF9yZXN1bWUsCitzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX3BtIHNhbXN1bmdfZ3Bpb19wbV80Yml0ID0geworCS5zYXZlCT0gc2Ftc3VuZ19ncGlvX3BtXzRiaXRfc2F2ZSwKKwkucmVzdW1lID0gc2Ftc3VuZ19ncGlvX3BtXzRiaXRfcmVzdW1lLAogfTsKICNlbmRpZiAvKiBDT05GSUdfQVJDSF9TM0M2NFhYIHx8IENPTkZJR19QTEFUX1M1UCAqLwogCiAvKioKLSAqIHMzY19wbV9zYXZlX2dwaW8oKSAtIHNhdmUgZ3BpbyBjaGlwIGRhdGEgZm9yIHN1c3BlbmQKKyAqIHNhbXN1bmdfcG1fc2F2ZV9ncGlvKCkgLSBzYXZlIGdwaW8gY2hpcCBkYXRhIGZvciBzdXNwZW5kCiAgKiBAb3VyY2hpcDogVGhlIGNoaXAgZm9yIHN1c3BlbmQuCiAgKi8KLXN0YXRpYyB2b2lkIHMzY19wbV9zYXZlX2dwaW8oc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXApCitzdGF0aWMgdm9pZCBzYW1zdW5nX3BtX3NhdmVfZ3BpbyhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXApCiB7Ci0Jc3RydWN0IHMzY19ncGlvX3BtICpwbSA9IG91cmNoaXAtPnBtOworCXN0cnVjdCBzYW1zdW5nX2dwaW9fcG0gKnBtID0gb3VyY2hpcC0+cG07CiAKIAlpZiAocG0gPT0gTlVMTCB8fCBwbS0+c2F2ZSA9PSBOVUxMKQogCQlTM0NfUE1EQkcoIiVzOiBubyBwbSBmb3IgJXNcbiIsIF9fZnVuY19fLCBvdXJjaGlwLT5jaGlwLmxhYmVsKTsKQEAgLTMxOSwyNCArMzE5LDI0IEBACiB9CiAKIC8qKgotICogczNjX3BtX3NhdmVfZ3Bpb3MoKSAtIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSBHUElPIGJhbmtzLgorICogc2Ftc3VuZ19wbV9zYXZlX2dwaW9zKCkgLSBTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgR1BJTyBiYW5rcy4KICAqCiAgKiBGb3IgYWxsIHRoZSBHUElPIGJhbmtzLCBzYXZlIHRoZSBzdGF0ZSBvZiBlYWNoIG9uZSByZWFkeSBmb3IgZ29pbmcKICAqIGludG8gYSBzdXNwZW5kIG1vZGUuCiAgKi8KLXZvaWQgczNjX3BtX3NhdmVfZ3Bpb3Modm9pZCkKK3ZvaWQgc2Ftc3VuZ19wbV9zYXZlX2dwaW9zKHZvaWQpCiB7Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXA7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpvdXJjaGlwOwogCXVuc2lnbmVkIGludCBncGlvX25yOwogCiAJZm9yIChncGlvX25yID0gMDsgZ3Bpb19uciA8IFMzQ19HUElPX0VORDspIHsKLQkJb3VyY2hpcCA9IHMzY19ncGlvbGliX2dldGNoaXAoZ3Bpb19ucik7CisJCW91cmNoaXAgPSBzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcChncGlvX25yKTsKIAkJaWYgKCFvdXJjaGlwKSB7CiAJCQlncGlvX25yKys7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXMzY19wbV9zYXZlX2dwaW8ob3VyY2hpcCk7CisJCXNhbXN1bmdfcG1fc2F2ZV9ncGlvKG91cmNoaXApOwogCiAJCVMzQ19QTURCRygiJXM6IHNhdmUgJTA4eCwlMDh4LCUwOHgsJTA4eFxuIiwKIAkJCSAgb3VyY2hpcC0+Y2hpcC5sYWJlbCwKQEAgLTM1MSwxMiArMzUxLDEyIEBACiB9CiAKIC8qKgotICogczNjX3BtX3Jlc3VtZV9ncGlvKCkgLSByZXN0b3JlIGdwaW8gY2hpcCBkYXRhIGFmdGVyIHN1c3BlbmQKKyAqIHNhbXN1bmdfcG1fcmVzdW1lX2dwaW8oKSAtIHJlc3RvcmUgZ3BpbyBjaGlwIGRhdGEgYWZ0ZXIgc3VzcGVuZAogICogQG91cmNoaXA6IFRoZSBzdXNwZW5kZWQgY2hpcC4KICAqLwotc3RhdGljIHZvaWQgczNjX3BtX3Jlc3VtZV9ncGlvKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19wbV9yZXN1bWVfZ3BpbyhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXApCiB7Ci0Jc3RydWN0IHMzY19ncGlvX3BtICpwbSA9IG91cmNoaXAtPnBtOworCXN0cnVjdCBzYW1zdW5nX2dwaW9fcG0gKnBtID0gb3VyY2hpcC0+cG07CiAKIAlpZiAocG0gPT0gTlVMTCB8fCBwbS0+cmVzdW1lID09IE5VTEwpCiAJCVMzQ19QTURCRygiJXM6IG5vIHBtIGZvciAlc1xuIiwgX19mdW5jX18sIG91cmNoaXAtPmNoaXAubGFiZWwpOwpAQCAtMzY0LDE5ICszNjQsMTkgQEAKIAkJcG0tPnJlc3VtZShvdXJjaGlwKTsKIH0KIAotdm9pZCBzM2NfcG1fcmVzdG9yZV9ncGlvcyh2b2lkKQordm9pZCBzYW1zdW5nX3BtX3Jlc3RvcmVfZ3Bpb3Modm9pZCkKIHsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcDsKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXA7CiAJdW5zaWduZWQgaW50IGdwaW9fbnI7CiAKIAlmb3IgKGdwaW9fbnIgPSAwOyBncGlvX25yIDwgUzNDX0dQSU9fRU5EOykgewotCQlvdXJjaGlwID0gczNjX2dwaW9saWJfZ2V0Y2hpcChncGlvX25yKTsKKwkJb3VyY2hpcCA9IHNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKGdwaW9fbnIpOwogCQlpZiAoIW91cmNoaXApIHsKIAkJCWdwaW9fbnIrKzsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJczNjX3BtX3Jlc3VtZV9ncGlvKG91cmNoaXApOworCQlzYW1zdW5nX3BtX3Jlc3VtZV9ncGlvKG91cmNoaXApOwogCiAJCWdwaW9fbnIgKz0gb3VyY2hpcC0+Y2hpcC5uZ3BpbzsKIAkJZ3Bpb19uciArPSBDT05GSUdfUzNDX0dQSU9fU1BBQ0U7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0uYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbS5jCmluZGV4IGFlNmY5OTguLjY0YWI2NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbS5jCkBAIC0yNjgsOCArMjY4LDggQEAKIAogCS8qIHNhdmUgYWxsIG5lY2Vzc2FyeSBjb3JlIHJlZ2lzdGVycyBub3QgY292ZXJlZCBieSB0aGUgZHJpdmVycyAqLwogCi0JczNjX3BtX3NhdmVfZ3Bpb3MoKTsKLQlzM2NfcG1fc2F2ZWRfZ3Bpb3MoKTsKKwlzYW1zdW5nX3BtX3NhdmVfZ3Bpb3MoKTsKKwlzYW1zdW5nX3BtX3NhdmVkX2dwaW9zKCk7CiAJczNjX3BtX3NhdmVfdWFydHMoKTsKIAlzM2NfcG1fc2F2ZV9jb3JlKCk7CiAKQEAgLTMwNiw3ICszMDYsNyBAQAogCiAJczNjX3BtX3Jlc3RvcmVfY29yZSgpOwogCXMzY19wbV9yZXN0b3JlX3VhcnRzKCk7Ci0JczNjX3BtX3Jlc3RvcmVfZ3Bpb3MoKTsKKwlzYW1zdW5nX3BtX3Jlc3RvcmVfZ3Bpb3MoKTsKIAlzM2NfcG1fcmVzdG9yZWRfZ3Bpb3MoKTsKIAogCXMzY19wbV9kZWJ1Z19pbml0KCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcHdtLWNsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcHdtLWNsb2NrLmMKaW5kZXggZjFiYmE4OC4uYTM1ZmYzYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3B3bS1jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wd20tY2xvY2suYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3MtdGltZXIuaD4KLSNpbmNsdWRlIDxtYWNoL3B3bS1jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvcHdtLWNsb2NrLmg+CiAKIC8qIEVhY2ggb2YgdGhlIHRpbWVycyAwIHRocm91Z2ggNSBnbyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKICAqIGNsb2NrIHRyZWUsIHdpdGggdGhlIGlucHV0cyBkZXBlbmRpbmcgb24gdGhlIHRpbWVycy4KQEAgLTMzOSw4ICszMzksMTcgQEAKIAl1bnNpZ25lZCBsb25nIGJpdHM7CiAJdW5zaWduZWQgbG9uZyBzaGlmdCA9IFMzQzI0MTBfVENGRzFfU0hJRlQoaWQpOwogCisJdW5zaWduZWQgbG9uZyBtdXhfdGNsazsKKworCWlmIChzb2NfaXNfczNjMjR4eCgpKQorCQltdXhfdGNsayA9IFMzQzI0MTBfVENGRzFfTVVYX1RDTEs7CisJZWxzZSBpZiAoc29jX2lzX3M1cDY0NDAoKSB8fCBzb2NfaXNfczVwNjQ1MCgpKQorCQltdXhfdGNsayA9IDA7CisJZWxzZQorCQltdXhfdGNsayA9IFMzQzY0WFhfVENGRzFfTVVYX1RDTEs7CisKIAlpZiAocGFyZW50ID09IHMzYzI0eHhfcHdtY2xrX3RjbGsoaWQpKQotCQliaXRzID0gUzNDX1RDRkcxX01VWF9UQ0xLIDw8IHNoaWZ0OworCQliaXRzID0gbXV4X3RjbGsgPDwgc2hpZnQ7CiAJZWxzZSBpZiAocGFyZW50ID09IHMzYzI0eHhfcHdtY2xrX3RkaXYoaWQpKQogCQliaXRzID0gY2xrX3B3bV90ZGl2X2JpdHModG9fdGRpdihwYXJlbnQpKSA8PCBzaGlmdDsKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcHdtLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcHdtLmMKaW5kZXggZjM3NDU3Yy4uZGMxMTg1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3B3bS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wd20uYwpAQCAtMjk5LDYgKzI5OSw5IEBACiAJCWdvdG8gZXJyX2Nsa190aW47CiAJfQogCisJY2xrX2VuYWJsZShwd20tPmNsayk7CisJY2xrX2VuYWJsZShwd20tPmNsa19kaXYpOworCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJdGNvbiA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfVENPTik7CkBAIC0zMjYsNiArMzI5LDggQEAKIAlyZXR1cm4gMDsKIAogIGVycl9jbGtfdGRpdjoKKwljbGtfZGlzYWJsZShwd20tPmNsa19kaXYpOworCWNsa19kaXNhYmxlKHB3bS0+Y2xrKTsKIAljbGtfcHV0KHB3bS0+Y2xrX2Rpdik7CiAKICBlcnJfY2xrX3RpbjoKQEAgLTM0MCw2ICszNDUsOCBAQAogewogCXN0cnVjdCBwd21fZGV2aWNlICpwd20gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCWNsa19kaXNhYmxlKHB3bS0+Y2xrX2Rpdik7CisJY2xrX2Rpc2FibGUocHdtLT5jbGspOwogCWNsa19wdXQocHdtLT5jbGtfZGl2KTsKIAljbGtfcHV0KHB3bS0+Y2xrKTsKIAlrZnJlZShwd20pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3MzYy1kbWEtb3BzLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvczNjLWRtYS1vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODE0OTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3MzYy1kbWEtb3BzLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9zM2MtZG1hLW9wcy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFNhbXN1bmcgUzNDLURNQSBPcGVyYXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisKK3N0cnVjdCBjYl9kYXRhIHsKKwl2b2lkICgqZnApICh2b2lkICopOworCXZvaWQgKmZwX3BhcmFtOworCXVuc2lnbmVkIGNoOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoZG1hX2xpc3QpOworCitzdGF0aWMgdm9pZCBzM2NfZG1hX2NiKHN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFubmVsLCB2b2lkICpwYXJhbSwKKwkJICAgICAgIGludCBzaXplLCBlbnVtIHMzYzI0MTBfZG1hX2J1ZmZyZXN1bHQgcmVzKQoreworCXN0cnVjdCBjYl9kYXRhICpkYXRhID0gcGFyYW07CisKKwlkYXRhLT5mcChkYXRhLT5mcF9wYXJhbSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzM2NfZG1hX3JlcXVlc3QoZW51bSBkbWFfY2ggZG1hX2NoLAorCQkJCSBzdHJ1Y3Qgc2Ftc3VuZ19kbWFfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgY2JfZGF0YSAqZGF0YTsKKworCWlmIChzM2MyNDEwX2RtYV9yZXF1ZXN0KGRtYV9jaCwgaW5mby0+Y2xpZW50LCBOVUxMKSA8IDApIHsKKwkJczNjMjQxMF9kbWFfZnJlZShkbWFfY2gsIGluZm8tPmNsaWVudCk7CisJCXJldHVybiAwOworCX0KKworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2JfZGF0YSksIEdGUF9LRVJORUwpOworCWRhdGEtPmNoID0gZG1hX2NoOworCWxpc3RfYWRkX3RhaWwoJmRhdGEtPm5vZGUsICZkbWFfbGlzdCk7CisKKwlzM2MyNDEwX2RtYV9kZXZjb25maWcoZG1hX2NoLCBpbmZvLT5kaXJlY3Rpb24sIGluZm8tPmZpZm8pOworCisJaWYgKGluZm8tPmNhcCA9PSBETUFfQ1lDTElDKQorCQlzM2MyNDEwX2RtYV9zZXRmbGFncyhkbWFfY2gsIFMzQzI0MTBfRE1BRl9DSVJDVUxBUik7CisKKwlzM2MyNDEwX2RtYV9jb25maWcoZG1hX2NoLCBpbmZvLT53aWR0aCk7CisKKwlyZXR1cm4gKHVuc2lnbmVkKWRtYV9jaDsKK30KKworc3RhdGljIGludCBzM2NfZG1hX3JlbGVhc2UodW5zaWduZWQgY2gsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgY2JfZGF0YSAqZGF0YTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGF0YSwgJmRtYV9saXN0LCBub2RlKQorCQlpZiAoZGF0YS0+Y2ggPT0gY2gpCisJCQlicmVhazsKKwlsaXN0X2RlbCgmZGF0YS0+bm9kZSk7CisKKwlzM2MyNDEwX2RtYV9mcmVlKGNoLCBjbGllbnQpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjX2RtYV9wcmVwYXJlKHVuc2lnbmVkIGNoLCBzdHJ1Y3Qgc2Ftc3VuZ19kbWFfcHJlcF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjYl9kYXRhICpkYXRhOworCWludCBsZW4gPSAoaW5mby0+Y2FwID09IERNQV9DWUNMSUMpID8gaW5mby0+cGVyaW9kIDogaW5mby0+bGVuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkYXRhLCAmZG1hX2xpc3QsIG5vZGUpCisJCWlmIChkYXRhLT5jaCA9PSBjaCkKKwkJCWJyZWFrOworCisJaWYgKCFkYXRhLT5mcCkgeworCQlzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4oY2gsIHMzY19kbWFfY2IpOworCQlkYXRhLT5mcCA9IGluZm8tPmZwOworCQlkYXRhLT5mcF9wYXJhbSA9IGluZm8tPmZwX3BhcmFtOworCX0KKworCXMzYzI0MTBfZG1hX2VucXVldWUoY2gsICh2b2lkICopZGF0YSwgaW5mby0+YnVmLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHMzY19kbWFfdHJpZ2dlcih1bnNpZ25lZCBjaCkKK3sKKwlyZXR1cm4gczNjMjQxMF9kbWFfY3RybChjaCwgUzNDMjQxMF9ETUFPUF9TVEFSVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHMzY19kbWFfc3RhcnRlZCh1bnNpZ25lZCBjaCkKK3sKKwlyZXR1cm4gczNjMjQxMF9kbWFfY3RybChjaCwgUzNDMjQxMF9ETUFPUF9TVEFSVEVEKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgczNjX2RtYV9mbHVzaCh1bnNpZ25lZCBjaCkKK3sKKwlyZXR1cm4gczNjMjQxMF9kbWFfY3RybChjaCwgUzNDMjQxMF9ETUFPUF9GTFVTSCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHMzY19kbWFfc3RvcCh1bnNpZ25lZCBjaCkKK3sKKwlyZXR1cm4gczNjMjQxMF9kbWFfY3RybChjaCwgUzNDMjQxMF9ETUFPUF9TVE9QKTsKK30KKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2RtYV9vcHMgczNjX2RtYV9vcHMgPSB7CisJLnJlcXVlc3QJPSBzM2NfZG1hX3JlcXVlc3QsCisJLnJlbGVhc2UJPSBzM2NfZG1hX3JlbGVhc2UsCisJLnByZXBhcmUJPSBzM2NfZG1hX3ByZXBhcmUsCisJLnRyaWdnZXIJPSBzM2NfZG1hX3RyaWdnZXIsCisJLnN0YXJ0ZWQJPSBzM2NfZG1hX3N0YXJ0ZWQsCisJLmZsdXNoCQk9IHMzY19kbWFfZmx1c2gsCisJLnN0b3AJCT0gczNjX2RtYV9zdG9wLAorfTsKKwordm9pZCAqczNjX2RtYV9nZXRfb3BzKHZvaWQpCit7CisJcmV0dXJuICZzM2NfZG1hX29wczsKK30KK0VYUE9SVF9TWU1CT0woczNjX2RtYV9nZXRfb3BzKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9zM2MtcGwzMzAuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9zM2MtcGwzMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg1NjM4Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvczNjLXBsMzMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ0ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9zM2MtcGwzMzAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQuCi0gKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3BsMzMwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3MzYy1wbDMzMC1wZGF0YS5oPgotCi0vKioKLSAqIHN0cnVjdCBzM2NfcGwzMzBfZG1hYyAtIExvZ2ljYWwgcmVwcmVzZW50YXRpb24gb2YgYSBQTDMzMCBETUFDLgotICogQGJ1c3lfY2hhbjogTnVtYmVyIG9mIGNoYW5uZWxzIGN1cnJlbnRseSBidXN5LgotICogQHBlcmk6IExpc3Qgb2YgSURzIG9mIHBlcmlwaGVyYWxzIHRoaXMgRE1BQyBjYW4gd29yayB3aXRoLgotICogQG5vZGU6IFRvIGF0dGFjaCB0byB0aGUgZ2xvYmFsIGxpc3Qgb2YgRE1BQ3MuCi0gKiBAcGk6IFBMMzMwIGNvbmZpZ3VyYXRpb24gaW5mbyBmb3IgdGhlIERNQUMuCi0gKiBAa21jYWNoZTogUG9vbCB0byBxdWlja2x5IGFsbG9jYXRlIHhmZXJzIGZvciBhbGwgY2hhbm5lbHMgaW4gdGhlIGRtYWMuCi0gKiBAY2xrOiBQb2ludGVyIG9mIERNQUMgb3BlcmF0aW9uIGNsb2NrLgotICovCi1zdHJ1Y3QgczNjX3BsMzMwX2RtYWMgewotCXVuc2lnbmVkCQlidXN5X2NoYW47Ci0JZW51bSBkbWFfY2gJCSpwZXJpOwotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQlzdHJ1Y3QgcGwzMzBfaW5mbwkqcGk7Ci0Jc3RydWN0IGttZW1fY2FjaGUJKmttY2FjaGU7Ci0Jc3RydWN0IGNsawkJKmNsazsKLX07Ci0KLS8qKgotICogc3RydWN0IHMzY19wbDMzMF94ZmVyIC0gQSByZXF1ZXN0IHN1Ym1pdHRlZCBieSBTM0MgRE1BIGNsaWVudHMuCi0gKiBAdG9rZW46IFhmZXIgSUQgcHJvdmlkZWQgYnkgdGhlIGNsaWVudC4KLSAqIEBub2RlOiBUbyBhdHRhY2ggdG8gdGhlIGxpc3Qgb2YgeGZlcnMgb24gYSBjaGFubmVsLgotICogQHB4OiBYZmVyIGZvciBQTDMzMCBjb3JlLgotICogQGNoYW46IE93bmVyIGNoYW5uZWwgb2YgdGhpcyB4ZmVyLgotICovCi1zdHJ1Y3QgczNjX3BsMzMwX3hmZXIgewotCXZvaWQJCQkqdG9rZW47Ci0Jc3RydWN0IGxpc3RfaGVhZAlub2RlOwotCXN0cnVjdCBwbDMzMF94ZmVyCXB4OwotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbgkqY2hhbjsKLX07Ci0KLS8qKgotICogc3RydWN0IHMzY19wbDMzMF9jaGFuIC0gTG9naWNhbCBjaGFubmVsIHRvIGNvbW11bmljYXRlIHdpdGgKLSAqIAlhIFBoeXNpY2FsIHBlcmlwaGVyYWwuCi0gKiBAcGwzMzBfY2hhbl9pZDogVG9rZW4gb2YgYSBoYXJkd2FyZSBjaGFubmVsIHRocmVhZCBvZiBQTDMzMCBETUFDLgotICogCU5VTEwgaWYgdGhlIGNoYW5uZWwgaXMgYXZhaWxhYmxlIHRvIGJlIGFjcXVpcmVkLgotICogQGlkOiBJRCBvZiB0aGUgcGVyaXBoZXJhbCB0aGF0IHRoaXMgY2hhbm5lbCBjYW4gY29tbXVuaWNhdGUgd2l0aC4KLSAqIEBvcHRpb25zOiBPcHRpb25zIHNwZWNpZmllZCBieSB0aGUgY2xpZW50LgotICogQHNkYWRkcjogQWRkcmVzcyBwcm92aWRlZCB2aWEgczNjMjQxMF9kbWFfZGV2Y29uZmlnLgotICogQG5vZGU6IFRvIGF0dGFjaCB0byB0aGUgZ2xvYmFsIGxpc3Qgb2YgY2hhbm5lbHMuCi0gKiBAbHJxOiBQb2ludGVyIHRvIHRoZSBsYXN0IHN1Ym1pdHRlZCBwbDMzMF9yZXEgdG8gUEwzMzAgY29yZS4KLSAqIEB4ZmVyX2xpc3Q6IFRvIG1hbmFnZSBsaXN0IG9mIHhmZXJzIGVucXVldWVkLgotICogQHJlcTogVHdvIHJlcXVlc3RzIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIFBMMzMwIGVuZ2luZS4KLSAqIEBjYWxsYmFja19mbjogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIGNsaWVudC4KLSAqIEBycWNmZzogQ2hhbm5lbCBjb25maWd1cmF0aW9uIGZvciB0aGUgeGZlcnMuCi0gKiBAeGZlcl9oZWFkOiBQb2ludGVyIHRvIHRoZSB4ZmVyIHRvIGJlIG5leHQgZXhlY3V0ZWQuCi0gKiBAZG1hYzogUG9pbnRlciB0byB0aGUgRE1BQyB0aGF0IG1hbmFnZXMgdGhpcyBjaGFubmVsLCBOVUxMIGlmIHRoZQotICogCWNoYW5uZWwgaXMgYXZhaWxhYmxlIHRvIGJlIGFjcXVpcmVkLgotICogQGNsaWVudDogQ2xpZW50IG9mIHRoaXMgY2hhbm5lbC4gTlVMTCBpZiB0aGUKLSAqIAljaGFubmVsIGlzIGF2YWlsYWJsZSB0byBiZSBhY3F1aXJlZC4KLSAqLwotc3RydWN0IHMzY19wbDMzMF9jaGFuIHsKLQl2b2lkCQkJCSpwbDMzMF9jaGFuX2lkOwotCWVudW0gZG1hX2NoCQkJaWQ7Ci0JdW5zaWduZWQgaW50CQkJb3B0aW9uczsKLQl1bnNpZ25lZCBsb25nCQkJc2RhZGRyOwotCXN0cnVjdCBsaXN0X2hlYWQJCW5vZGU7Ci0Jc3RydWN0IHBsMzMwX3JlcQkJKmxycTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQl4ZmVyX2xpc3Q7Ci0Jc3RydWN0IHBsMzMwX3JlcQkJcmVxWzJdOwotCXMzYzI0MTBfZG1hX2NiZm5fdAkJY2FsbGJhY2tfZm47Ci0Jc3RydWN0IHBsMzMwX3JlcWNmZwkJcnFjZmc7Ci0Jc3RydWN0IHMzY19wbDMzMF94ZmVyCQkqeGZlcl9oZWFkOwotCXN0cnVjdCBzM2NfcGwzMzBfZG1hYwkJKmRtYWM7Ci0Jc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudAkqY2xpZW50OwotfTsKLQotLyogQWxsIERNQUNzIGluIHRoZSBwbGF0Zm9ybSAqLwotc3RhdGljIExJU1RfSEVBRChkbWFjX2xpc3QpOwotCi0vKiBBbGwgY2hhbm5lbHMgdG8gcGVyaXBoZXJhbHMgaW4gdGhlIHBsYXRmb3JtICovCi1zdGF0aWMgTElTVF9IRUFEKGNoYW5fbGlzdCk7Ci0KLS8qCi0gKiBTaW5jZSB3ZSBhZGQgcmVzb3VyY2VzKERNQUNzIGFuZCBDaGFubmVscykgdG8gdGhlIGdsb2JhbCBwb29sLAotICogd2UgbmVlZCB0byBndWFyZCBhY2Nlc3MgdG8gdGhlIHJlc291cmNlcyB1c2luZyBhIGdsb2JhbCBsb2NrCi0gKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socmVzX2xvY2spOwotCi0vKiBSZXR1cm5zIHRoZSBjaGFubmVsIHdpdGggSUQgJ2lkJyBpbiB0aGUgY2hhbl9saXN0ICovCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9jaGFuICppZF90b19jaGFuKGNvbnN0IGVudW0gZG1hX2NoIGlkKQotewotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2g7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmY2hhbl9saXN0LCBub2RlKQotCQlpZiAoY2gtPmlkID09IGlkKQotCQkJcmV0dXJuIGNoOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IGNoYW5uZWwgd2l0aCBJRCAnaWQnIGFuZCBhZGQgdG8gY2hhbl9saXN0ICovCi1zdGF0aWMgdm9pZCBjaGFuX2FkZChjb25zdCBlbnVtIGRtYV9jaCBpZCkKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoID0gaWRfdG9fY2hhbihpZCk7Ci0KLQkvKiBSZXR1cm4gaWYgdGhlIGNoYW5uZWwgYWxyZWFkeSBleGlzdHMgKi8KLQlpZiAoY2gpCi0JCXJldHVybjsKLQotCWNoID0ga21hbGxvYyhzaXplb2YoKmNoKSwgR0ZQX0tFUk5FTCk7Ci0JLyogUmV0dXJuIHNpbGVudGx5IHRvIHdvcmsgd2l0aCBvdGhlciBjaGFubmVscyAqLwotCWlmICghY2gpCi0JCXJldHVybjsKLQotCWNoLT5pZCA9IGlkOwotCWNoLT5kbWFjID0gTlVMTDsKLQotCWxpc3RfYWRkX3RhaWwoJmNoLT5ub2RlLCAmY2hhbl9saXN0KTsKLX0KLQotLyogSWYgdGhlIGNoYW5uZWwgaXMgbm90IHlldCBhY3F1aXJlZCBieSBhbnkgY2xpZW50ICovCi1zdGF0aWMgYm9vbCBjaGFuX2ZyZWUoc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaCkKLXsKLQlpZiAoIWNoKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBDaGFubmVsIHBvaW50cyB0byBzb21lIERNQUMgb25seSB3aGVuIGl0J3MgYWNxdWlyZWQgKi8KLQlyZXR1cm4gY2gtPmRtYWMgPyBmYWxzZSA6IHRydWU7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIDAgaXMgcGVyaXBoZXJhbCBpL2YgaXMgaW52YWxpZCBvciBub3QgcHJlc2VudCBvbiB0aGUgZG1hYy4KLSAqIEluZGV4ICsgMSwgb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgdW5zaWduZWQgaWZhY2Vfb2ZfZG1hYyhzdHJ1Y3QgczNjX3BsMzMwX2RtYWMgKmRtYWMsIGVudW0gZG1hX2NoIGNoX2lkKQotewotCWVudW0gZG1hX2NoICppZCA9IGRtYWMtPnBlcmk7Ci0JaW50IGk7Ci0KLQkvKiBEaXNjb3VudCBpbnZhbGlkIG1hcmtlcnMgKi8KLQlpZiAoY2hfaWQgPT0gRE1BQ0hfTUFYKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBQTDMzMF9NQVhfUEVSSTsgaSsrKQotCQlpZiAoaWRbaV0gPT0gY2hfaWQpCi0JCQlyZXR1cm4gaSArIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogSWYgYWxsIGNoYW5uZWwgdGhyZWFkcyBvZiB0aGUgRE1BQyBhcmUgYnVzeSAqLwotc3RhdGljIGlubGluZSBib29sIGRtYWNfYnVzeShzdHJ1Y3QgczNjX3BsMzMwX2RtYWMgKmRtYWMpCi17Ci0Jc3RydWN0IHBsMzMwX2luZm8gKnBpID0gZG1hYy0+cGk7Ci0KLQlyZXR1cm4gKGRtYWMtPmJ1c3lfY2hhbiA8IHBpLT5wY2ZnLm51bV9jaGFuKSA/IGZhbHNlIDogdHJ1ZTsKLX0KLQotLyoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlIGNoYW5uZWxzIHRoYXQKLSAqIGNhbiBiZSBoYW5kbGVkIGJ5IHRoaXMgZG1hYyBvbmx5LgotICovCi1zdGF0aWMgdW5zaWduZWQgY2hfb25seWJ5X2RtYWMoc3RydWN0IHMzY19wbDMzMF9kbWFjICpkbWFjKQotewotCWVudW0gZG1hX2NoICppZCA9IGRtYWMtPnBlcmk7Ci0Jc3RydWN0IHMzY19wbDMzMF9kbWFjICpkOwotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2g7Ci0JdW5zaWduZWQgZm91bmQsIGNvdW50ID0gMDsKLQllbnVtIGRtYV9jaCBwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFBMMzMwX01BWF9QRVJJOyBpKyspIHsKLQkJcCA9IGlkW2ldOwotCQljaCA9IGlkX3RvX2NoYW4ocCk7Ci0KLQkJaWYgKHAgPT0gRE1BQ0hfTUFYIHx8ICFjaGFuX2ZyZWUoY2gpKQotCQkJY29udGludWU7Ci0KLQkJZm91bmQgPSAwOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZkbWFjX2xpc3QsIG5vZGUpIHsKLQkJCWlmIChkICE9IGRtYWMgJiYgaWZhY2Vfb2ZfZG1hYyhkLCBjaC0+aWQpKSB7Ci0JCQkJZm91bmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghZm91bmQpCi0JCQljb3VudCsrOwotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQotLyoKLSAqIE1lYXN1cmUgb2Ygc3VpdGFiaWxpdHkgb2YgJ2RtYWMnIGhhbmRsaW5nICdjaCcKLSAqCi0gKiAwIGluZGljYXRlcyAnZG1hYycgY2FuIG5vdCBoYW5kbGUgJ2NoJyBlaXRoZXIKLSAqIGJlY2F1c2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUgb3IKLSAqIGJlY2F1c2UgYWxsIGRtYWMgY2hhbm5lbHMgYXJlIGN1cnJlbnRseSBidXN5LgotICoKLSAqID4wIHZsYXVlIGluZGljYXRlcyAnZG1hYycgaGFzIHRoZSBjYXBhYmlsaXR5LgotICogVGhlIGJpZ2dlciB0aGUgdmFsdWUgdGhlIG1vcmUgc3VpdGFibGUgdGhlIGRtYWMuCi0gKi8KLSNkZWZpbmUgTUFYX1NVSVQJVUlOVF9NQVgKLSNkZWZpbmUgTUlOX1NVSVQJMAotCi1zdGF0aWMgdW5zaWduZWQgc3VpdGFibGlsaXR5KHN0cnVjdCBzM2NfcGwzMzBfZG1hYyAqZG1hYywKLQkJc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaCkKLXsKLQlzdHJ1Y3QgcGwzMzBfaW5mbyAqcGkgPSBkbWFjLT5waTsKLQllbnVtIGRtYV9jaCAqaWQgPSBkbWFjLT5wZXJpOwotCXN0cnVjdCBzM2NfcGwzMzBfZG1hYyAqZDsKLQl1bnNpZ25lZCBzOwotCWludCBpOwotCi0JcyA9IE1JTl9TVUlUOwotCS8qIElmIGFsbCB0aGUgRE1BQyBjaGFubmVsIHRocmVhZHMgYXJlIGJ1c3kgKi8KLQlpZiAoZG1hY19idXN5KGRtYWMpKQotCQlyZXR1cm4gczsKLQotCWZvciAoaSA9IDA7IGkgPCBQTDMzMF9NQVhfUEVSSTsgaSsrKQotCQlpZiAoaWRbaV0gPT0gY2gtPmlkKQotCQkJYnJlYWs7Ci0KLQkvKiBJZiB0aGUgJ2RtYWMnIGNhbid0IHRhbGsgdG8gJ2NoJyAqLwotCWlmIChpID09IFBMMzMwX01BWF9QRVJJKQotCQlyZXR1cm4gczsKLQotCXMgPSBNQVhfU1VJVDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZkbWFjX2xpc3QsIG5vZGUpIHsKLQkJLyoKLQkJICogSWYgc29tZSBvdGhlciBkbWFjIGNhbiB0YWxrIHRvIHRoaXMKLQkJICogcGVyaSBhbmQgaGFzIHNvbWUgY2hhbm5lbCBmcmVlLgotCQkgKi8KLQkJaWYgKGQgIT0gZG1hYyAmJiBpZmFjZV9vZl9kbWFjKGQsIGNoLT5pZCkgJiYgIWRtYWNfYnVzeShkKSkgewotCQkJcyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocykKLQkJcmV0dXJuIHM7Ci0KLQlzID0gMTAwOwotCi0JLyogR29vZCBpZiBmcmVlIGNoYW5zIGFyZSBtb3JlLCBiYWQgb3RoZXJ3aXNlICovCi0JcyArPSAocGktPnBjZmcubnVtX2NoYW4gLSBkbWFjLT5idXN5X2NoYW4pIC0gY2hfb25seWJ5X2RtYWMoZG1hYyk7Ci0KLQlyZXR1cm4gczsKLX0KLQotLyogTW9yZSB0aGFuIG9uZSBETUFDIG1heSBoYXZlIGNhcGFiaWxpdHkgdG8gdHJhbnNmZXIgZGF0YSB3aXRoIHRoZQotICogcGVyaXBoZXJhbC4gVGhpcyBmdW5jdGlvbiBhc3NpZ25zIG1vc3Qgc3VpdGFibGUgRE1BQyB0byBtYW5hZ2UgdGhlCi0gKiBjaGFubmVsIGFuZCBoZW5jZSBjb21tdW5pY2F0ZSB3aXRoIHRoZSBwZXJpcGhlcmFsLgotICovCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9kbWFjICptYXBfY2hhbl90b19kbWFjKHN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2gpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9kbWFjICpkLCAqZG1hYyA9IE5VTEw7Ci0JdW5zaWduZWQgc24sIHNsID0gTUlOX1NVSVQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZkbWFjX2xpc3QsIG5vZGUpIHsKLQkJc24gPSBzdWl0YWJsaWxpdHkoZCwgY2gpOwotCi0JCWlmIChzbiA9PSBNQVhfU1VJVCkKLQkJCXJldHVybiBkOwotCi0JCWlmIChzbiA+IHNsKQotCQkJZG1hYyA9IGQ7Ci0JfQotCi0JcmV0dXJuIGRtYWM7Ci19Ci0KLS8qIEFjcXVpcmUgdGhlIGNoYW5uZWwgZm9yIHBlcmlwaGVyYWwgJ2lkJyAqLwotc3RhdGljIHN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2hhbl9hY3F1aXJlKGNvbnN0IGVudW0gZG1hX2NoIGlkKQotewotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2ggPSBpZF90b19jaGFuKGlkKTsKLQlzdHJ1Y3QgczNjX3BsMzMwX2RtYWMgKmRtYWM7Ci0KLQkvKiBJZiB0aGUgY2hhbm5lbCBkb2Vzbid0IGV4aXN0IG9yIGlzIGFscmVhZHkgYWNxdWlyZWQgKi8KLQlpZiAoIWNoIHx8ICFjaGFuX2ZyZWUoY2gpKSB7Ci0JCWNoID0gTlVMTDsKLQkJZ290byBhY3FfZXhpdDsKLQl9Ci0KLQlkbWFjID0gbWFwX2NoYW5fdG9fZG1hYyhjaCk7Ci0JLyogSWYgY291bGRuJ3QgbWFwICovCi0JaWYgKCFkbWFjKSB7Ci0JCWNoID0gTlVMTDsKLQkJZ290byBhY3FfZXhpdDsKLQl9Ci0KLQlkbWFjLT5idXN5X2NoYW4rKzsKLQljaC0+ZG1hYyA9IGRtYWM7Ci0KLWFjcV9leGl0OgotCXJldHVybiBjaDsKLX0KLQotLyogRGVsZXRlIHhmZXIgZnJvbSB0aGUgcXVldWUgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZWxfZnJvbV9xdWV1ZShzdHJ1Y3QgczNjX3BsMzMwX3hmZXIgKnhmZXIpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF94ZmVyICp0OwotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2g7Ci0JaW50IGZvdW5kOwotCi0JaWYgKCF4ZmVyKQotCQlyZXR1cm47Ci0KLQljaCA9IHhmZXItPmNoYW47Ci0KLQkvKiBNYWtlIHN1cmUgeGZlciBpcyBpbiB0aGUgcXVldWUgKi8KLQlmb3VuZCA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmY2gtPnhmZXJfbGlzdCwgbm9kZSkKLQkJaWYgKHQgPT0geGZlcikgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCWlmICghZm91bmQpCi0JCXJldHVybjsKLQotCS8qIElmIHhmZXIgaXMgbGFzdCBlbnRyeSBpbiB0aGUgcXVldWUgKi8KLQlpZiAoeGZlci0+bm9kZS5uZXh0ID09ICZjaC0+eGZlcl9saXN0KQotCQl0ID0gbGlzdF9lbnRyeShjaC0+eGZlcl9saXN0Lm5leHQsCi0JCQkJc3RydWN0IHMzY19wbDMzMF94ZmVyLCBub2RlKTsKLQllbHNlCi0JCXQgPSBsaXN0X2VudHJ5KHhmZXItPm5vZGUubmV4dCwKLQkJCQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIsIG5vZGUpOwotCi0JLyogSWYgdGhlcmUgd2FzIG9ubHkgb25lIG5vZGUgbGVmdCAqLwotCWlmICh0ID09IHhmZXIpCi0JCWNoLT54ZmVyX2hlYWQgPSBOVUxMOwotCWVsc2UgaWYgKGNoLT54ZmVyX2hlYWQgPT0geGZlcikKLQkJY2gtPnhmZXJfaGVhZCA9IHQ7Ci0KLQlsaXN0X2RlbCgmeGZlci0+bm9kZSk7Ci19Ci0KLS8qIFByb3ZpZGVzIHBvaW50ZXIgdG8gdGhlIG5leHQgeGZlciBpbiB0aGUgcXVldWUuCi0gKiBJZiBDSVJDVUxBUiBvcHRpb24gaXMgc2V0LCB0aGUgbGlzdCBpcyBsZWZ0IGludGFjdCwKLSAqIG90aGVyd2lzZSB0aGUgeGZlciBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0gKiBGb3JjZWQgZGVsZXRlICdwbHVjaycgY2FuIGJlIHNldCB0byBvdmVycmlkZSB0aGUgQ0lSQ1VMQVIgb3B0aW9uLgotICovCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF94ZmVyICpnZXRfZnJvbV9xdWV1ZShzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoLAotCQlpbnQgcGx1Y2spCi17Ci0Jc3RydWN0IHMzY19wbDMzMF94ZmVyICp4ZmVyID0gY2gtPnhmZXJfaGVhZDsKLQotCWlmICgheGZlcikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBJZiB4ZmVyIGlzIGxhc3QgZW50cnkgaW4gdGhlIHF1ZXVlICovCi0JaWYgKHhmZXItPm5vZGUubmV4dCA9PSAmY2gtPnhmZXJfbGlzdCkKLQkJY2gtPnhmZXJfaGVhZCA9IGxpc3RfZW50cnkoY2gtPnhmZXJfbGlzdC5uZXh0LAotCQkJCQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIsIG5vZGUpOwotCWVsc2UKLQkJY2gtPnhmZXJfaGVhZCA9IGxpc3RfZW50cnkoeGZlci0+bm9kZS5uZXh0LAotCQkJCQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIsIG5vZGUpOwotCi0JaWYgKHBsdWNrIHx8ICEoY2gtPm9wdGlvbnMgJiBTM0MyNDEwX0RNQUZfQ0lSQ1VMQVIpKQotCQlkZWxfZnJvbV9xdWV1ZSh4ZmVyKTsKLQotCXJldHVybiB4ZmVyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3RvX3F1ZXVlKHN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2gsCi0JCXN0cnVjdCBzM2NfcGwzMzBfeGZlciAqeGZlciwgaW50IGZyb250KQotewotCXN0cnVjdCBwbDMzMF94ZmVyICp4dDsKLQotCS8qIElmIHF1ZXVlIGVtcHR5ICovCi0JaWYgKGNoLT54ZmVyX2hlYWQgPT0gTlVMTCkKLQkJY2gtPnhmZXJfaGVhZCA9IHhmZXI7Ci0KLQl4dCA9ICZjaC0+eGZlcl9oZWFkLT5weDsKLQkvKiBJZiB0aGUgaGVhZCBhbHJlYWR5IHN1Ym1pdHRlZCAoQ0lSQ1VMQVIgaGVhZCkgKi8KLQlpZiAoY2gtPm9wdGlvbnMgJiBTM0MyNDEwX0RNQUZfQ0lSQ1VMQVIgJiYKLQkJKHh0ID09IGNoLT5yZXFbMF0ueCB8fCB4dCA9PSBjaC0+cmVxWzFdLngpKQotCQljaC0+eGZlcl9oZWFkID0geGZlcjsKLQotCS8qIElmIHRoaXMgaXMgYSByZXN1Ym1pc3Npb24sIGl0IHNob3VsZCBnbyBhdCB0aGUgaGVhZCAqLwotCWlmIChmcm9udCkgewotCQljaC0+eGZlcl9oZWFkID0geGZlcjsKLQkJbGlzdF9hZGQoJnhmZXItPm5vZGUsICZjaC0+eGZlcl9saXN0KTsKLQl9IGVsc2UgewotCQlsaXN0X2FkZF90YWlsKCZ4ZmVyLT5ub2RlLCAmY2gtPnhmZXJfbGlzdCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2ZpbmlzaF9vZmYoc3RydWN0IHMzY19wbDMzMF94ZmVyICp4ZmVyLAotCQllbnVtIHMzYzI0MTBfZG1hX2J1ZmZyZXN1bHQgcmVzLCBpbnQgZmZyZWUpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQotCWlmICgheGZlcikKLQkJcmV0dXJuOwotCi0JY2ggPSB4ZmVyLT5jaGFuOwotCi0JLyogRG8gY2FsbGJhY2sgKi8KLQlpZiAoY2gtPmNhbGxiYWNrX2ZuKQotCQljaC0+Y2FsbGJhY2tfZm4oTlVMTCwgeGZlci0+dG9rZW4sIHhmZXItPnB4LmJ5dGVzLCByZXMpOwotCi0JLyogRm9yY2UgRnJlZSBvciBpZiBidWZmZXIgaXMgbm90IG5lZWRlZCBhbnltb3JlICovCi0JaWYgKGZmcmVlIHx8ICEoY2gtPm9wdGlvbnMgJiBTM0MyNDEwX0RNQUZfQ0lSQ1VMQVIpKQotCQlrbWVtX2NhY2hlX2ZyZWUoY2gtPmRtYWMtPmttY2FjaGUsIHhmZXIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBzM2NfcGwzMzBfc3VibWl0KHN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2gsCi0JCXN0cnVjdCBwbDMzMF9yZXEgKnIpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF94ZmVyICp4ZmVyOwotCWludCByZXQgPSAwOwotCi0JLyogSWYgYWxyZWFkeSBzdWJtaXR0ZWQgKi8KLQlpZiAoci0+eCkKLQkJcmV0dXJuIDA7Ci0KLQl4ZmVyID0gZ2V0X2Zyb21fcXVldWUoY2gsIDApOwotCWlmICh4ZmVyKSB7Ci0JCXItPnggPSAmeGZlci0+cHg7Ci0KLQkJLyogVXNlIG1heCBiYW5kd2lkdGggZm9yIE08LT5NIHhmZXJzICovCi0JCWlmIChyLT5ycXR5cGUgPT0gTUVNVE9NRU0pIHsKLQkJCXN0cnVjdCBwbDMzMF9pbmZvICpwaSA9IHhmZXItPmNoYW4tPmRtYWMtPnBpOwotCQkJaW50IGJ1cnN0ID0gMSA8PCBjaC0+cnFjZmcuYnJzdF9zaXplOwotCQkJdTMyIGJ5dGVzID0gci0+eC0+Ynl0ZXM7Ci0JCQlpbnQgYmw7Ci0KLQkJCWJsID0gcGktPnBjZmcuZGF0YV9idXNfd2lkdGggLyA4OwotCQkJYmwgKj0gcGktPnBjZmcuZGF0YV9idWZfZGVwOwotCQkJYmwgLz0gYnVyc3Q7Ci0KLQkJCS8qIHNyYy9kc3RfYnVyc3RfbGVuIGNhbid0IGJlIG1vcmUgdGhhbiAxNiAqLwotCQkJaWYgKGJsID4gMTYpCi0JCQkJYmwgPSAxNjsKLQotCQkJd2hpbGUgKGJsID4gMSkgewotCQkJCWlmICghKGJ5dGVzICUgKGJsICogYnVyc3QpKSkKLQkJCQkJYnJlYWs7Ci0JCQkJYmwtLTsKLQkJCX0KLQotCQkJY2gtPnJxY2ZnLmJyc3RfbGVuID0gYmw7Ci0JCX0gZWxzZSB7Ci0JCQljaC0+cnFjZmcuYnJzdF9sZW4gPSAxOwotCQl9Ci0KLQkJcmV0ID0gcGwzMzBfc3VibWl0X3JlcShjaC0+cGwzMzBfY2hhbl9pZCwgcik7Ci0KLQkJLyogSWYgc3VibWlzc2lvbiB3YXMgc3VjY2Vzc2Z1bCAqLwotCQlpZiAoIXJldCkgewotCQkJY2gtPmxycSA9IHI7IC8qIGxhdGVzdCBzdWJtaXR0ZWQgcmVxICovCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXItPnggPSBOVUxMOwotCi0JCS8qIElmIGJvdGggb2YgdGhlIFBMMzMwIHBpbmctcG9uZyBidWZmZXJzIGZpbGxlZCAqLwotCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKLQkJCWRldl9lcnIoY2gtPmRtYWMtPnBpLT5kZXYsICIlczolZCFcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCS8qIFF1ZXVlIGJhY2sgYWdhaW4gKi8KLQkJCWFkZF90b19xdWV1ZShjaCwgeGZlciwgMSk7Ci0JCQlyZXQgPSAwOwotCQl9IGVsc2UgewotCQkJZGV2X2VycihjaC0+ZG1hYy0+cGktPmRldiwgIiVzOiVkIVxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJX2ZpbmlzaF9vZmYoeGZlciwgUzNDMjQxMF9SRVNfRVJSLCAwKTsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzY19wbDMzMF9ycShzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoLAotCXN0cnVjdCBwbDMzMF9yZXEgKnIsIGVudW0gcGwzMzBfb3BfZXJyIGVycikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzM2NfcGwzMzBfeGZlciAqeGZlcjsKLQlzdHJ1Y3QgcGwzMzBfeGZlciAqeGwgPSByLT54OwotCWVudW0gczNjMjQxMF9kbWFfYnVmZnJlc3VsdCByZXM7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCXItPnggPSBOVUxMOwotCi0JczNjX3BsMzMwX3N1Ym1pdChjaCwgcik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JLyogTWFwIHJlc3VsdCB0byBTM0MgRE1BIEFQSSAqLwotCWlmIChlcnIgPT0gUEwzMzBfRVJSX05PTkUpCi0JCXJlcyA9IFMzQzI0MTBfUkVTX09LOwotCWVsc2UgaWYgKGVyciA9PSBQTDMzMF9FUlJfQUJPUlQpCi0JCXJlcyA9IFMzQzI0MTBfUkVTX0FCT1JUOwotCWVsc2UKLQkJcmVzID0gUzNDMjQxMF9SRVNfRVJSOwotCi0JLyogSWYgbGFzdCByZXF1ZXN0IGhhZCBzb21lIHhmZXIgKi8KLQlpZiAoeGwpIHsKLQkJeGZlciA9IGNvbnRhaW5lcl9vZih4bCwgc3RydWN0IHMzY19wbDMzMF94ZmVyLCBweCk7Ci0JCV9maW5pc2hfb2ZmKHhmZXIsIHJlcywgMCk7Ci0JfSBlbHNlIHsKLQkJZGV2X2luZm8oY2gtPmRtYWMtPnBpLT5kZXYsICIlczolZCBObyBYZmVyPyFcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgczNjX3BsMzMwX3JxMCh2b2lkICp0b2tlbiwgZW51bSBwbDMzMF9vcF9lcnIgZXJyKQotewotCXN0cnVjdCBwbDMzMF9yZXEgKnIgPSB0b2tlbjsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoID0gY29udGFpbmVyX29mKHIsCi0JCQkJCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiwgcmVxWzBdKTsKLQlzM2NfcGwzMzBfcnEoY2gsIHIsIGVycik7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzY19wbDMzMF9ycTEodm9pZCAqdG9rZW4sIGVudW0gcGwzMzBfb3BfZXJyIGVycikKLXsKLQlzdHJ1Y3QgcGwzMzBfcmVxICpyID0gdG9rZW47Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaCA9IGNvbnRhaW5lcl9vZihyLAotCQkJCQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4sIHJlcVsxXSk7Ci0JczNjX3BsMzMwX3JxKGNoLCByLCBlcnIpOwotfQotCi0vKiBSZWxlYXNlIGFuIGFjcXVpcmVkIGNoYW5uZWwgKi8KLXN0YXRpYyB2b2lkIGNoYW5fcmVsZWFzZShzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoKQotewotCXN0cnVjdCBzM2NfcGwzMzBfZG1hYyAqZG1hYzsKLQotCWlmIChjaGFuX2ZyZWUoY2gpKQotCQlyZXR1cm47Ci0KLQlkbWFjID0gY2gtPmRtYWM7Ci0JY2gtPmRtYWMgPSBOVUxMOwotCWRtYWMtPmJ1c3lfY2hhbi0tOwotfQotCi1pbnQgczNjMjQxMF9kbWFfY3RybChlbnVtIGRtYV9jaCBpZCwgZW51bSBzM2MyNDEwX2NoYW5fb3Agb3ApCi17Ci0Jc3RydWN0IHMzY19wbDMzMF94ZmVyICp4ZmVyOwotCWVudW0gcGwzMzBfY2hhbl9vcCBwbDMzMG9wOwotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2g7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaWR4LCByZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCWNoID0gaWRfdG9fY2hhbihpZCk7Ci0KLQlpZiAoIWNoIHx8IGNoYW5fZnJlZShjaCkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBjdHJsX2V4aXQ7Ci0JfQotCi0Jc3dpdGNoIChvcCkgewotCWNhc2UgUzNDMjQxMF9ETUFPUF9TVEFSVDoKLQkJLyogTWFrZSBzdXJlIGJvdGggcmVxcyBhcmUgZW5xdWV1ZWQgKi8KLQkJaWR4ID0gKGNoLT5scnEgPT0gJmNoLT5yZXFbMF0pID8gMSA6IDA7Ci0JCXMzY19wbDMzMF9zdWJtaXQoY2gsICZjaC0+cmVxW2lkeF0pOwotCQlzM2NfcGwzMzBfc3VibWl0KGNoLCAmY2gtPnJlcVsxIC0gaWR4XSk7Ci0JCXBsMzMwb3AgPSBQTDMzMF9PUF9TVEFSVDsKLQkJYnJlYWs7Ci0KLQljYXNlIFMzQzI0MTBfRE1BT1BfU1RPUDoKLQkJcGwzMzBvcCA9IFBMMzMwX09QX0FCT1JUOwotCQlicmVhazsKLQotCWNhc2UgUzNDMjQxMF9ETUFPUF9GTFVTSDoKLQkJcGwzMzBvcCA9IFBMMzMwX09QX0ZMVVNIOwotCQlicmVhazsKLQotCWNhc2UgUzNDMjQxMF9ETUFPUF9QQVVTRToKLQljYXNlIFMzQzI0MTBfRE1BT1BfUkVTVU1FOgotCWNhc2UgUzNDMjQxMF9ETUFPUF9USU1FT1VUOgotCWNhc2UgUzNDMjQxMF9ETUFPUF9TVEFSVEVEOgotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQotCWRlZmF1bHQ6Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IHBsMzMwX2NoYW5fY3RybChjaC0+cGwzMzBfY2hhbl9pZCwgcGwzMzBvcCk7Ci0KLQlpZiAocGwzMzBvcCA9PSBQTDMzMF9PUF9TVEFSVCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlkeCA9IChjaC0+bHJxID09ICZjaC0+cmVxWzBdKSA/IDEgOiAwOwotCi0JLyogQWJvcnQgdGhlIGN1cnJlbnQgeGZlciAqLwotCWlmIChjaC0+cmVxW2lkeF0ueCkgewotCQl4ZmVyID0gY29udGFpbmVyX29mKGNoLT5yZXFbaWR4XS54LAotCQkJCXN0cnVjdCBzM2NfcGwzMzBfeGZlciwgcHgpOwotCi0JCS8qIERyb3AgeGZlciBkdXJpbmcgRkxVU0ggKi8KLQkJaWYgKHBsMzMwb3AgPT0gUEwzMzBfT1BfRkxVU0gpCi0JCQlkZWxfZnJvbV9xdWV1ZSh4ZmVyKTsKLQotCQljaC0+cmVxW2lkeF0ueCA9IE5VTEw7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQkJX2ZpbmlzaF9vZmYoeGZlciwgUzNDMjQxMF9SRVNfQUJPUlQsCi0JCQkJcGwzMzBvcCA9PSBQTDMzMF9PUF9GTFVTSCA/IDEgOiAwKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JfQotCi0JLyogRmx1c2ggdGhlIHdob2xlIHF1ZXVlICovCi0JaWYgKHBsMzMwb3AgPT0gUEwzMzBfT1BfRkxVU0gpIHsKLQotCQlpZiAoY2gtPnJlcVsxIC0gaWR4XS54KSB7Ci0JCQl4ZmVyID0gY29udGFpbmVyX29mKGNoLT5yZXFbMSAtIGlkeF0ueCwKLQkJCQkJc3RydWN0IHMzY19wbDMzMF94ZmVyLCBweCk7Ci0KLQkJCWRlbF9mcm9tX3F1ZXVlKHhmZXIpOwotCi0JCQljaC0+cmVxWzEgLSBpZHhdLnggPSBOVUxMOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCQkJX2ZpbmlzaF9vZmYoeGZlciwgUzNDMjQxMF9SRVNfQUJPUlQsIDEpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQkvKiBGaW5pc2ggb2ZmIHRoZSByZW1haW5pbmcgaW4gdGhlIHF1ZXVlICovCi0JCXhmZXIgPSBjaC0+eGZlcl9oZWFkOwotCQl3aGlsZSAoeGZlcikgewotCi0JCQlkZWxfZnJvbV9xdWV1ZSh4ZmVyKTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQkJCV9maW5pc2hfb2ZmKHhmZXIsIFMzQzI0MTBfUkVTX0FCT1JULCAxKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JCQl4ZmVyID0gY2gtPnhmZXJfaGVhZDsKLQkJfQotCX0KLQotY3RybF9leGl0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9jdHJsKTsKLQotaW50IHMzYzI0MTBfZG1hX2VucXVldWUoZW51bSBkbWFfY2ggaWQsIHZvaWQgKnRva2VuLAotCQkJZG1hX2FkZHJfdCBhZGRyLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoOwotCXN0cnVjdCBzM2NfcGwzMzBfeGZlciAqeGZlcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpZHgsIHJldCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCWNoID0gaWRfdG9fY2hhbihpZCk7Ci0KLQkvKiBFcnJvciBpZiBpbnZhbGlkIG9yIGZyZWUgY2hhbm5lbCAqLwotCWlmICghY2ggfHwgY2hhbl9mcmVlKGNoKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVucV9leGl0OwotCX0KLQotCS8qIEVycm9yIGlmIHNpemUgaXMgdW5hbGlnbmVkICovCi0JaWYgKGNoLT5ycWNmZy5icnN0X3NpemUgJiYgc2l6ZSAlICgxIDw8IGNoLT5ycWNmZy5icnN0X3NpemUpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5xX2V4aXQ7Ci0JfQotCi0JeGZlciA9IGttZW1fY2FjaGVfYWxsb2MoY2gtPmRtYWMtPmttY2FjaGUsIEdGUF9BVE9NSUMpOwotCWlmICgheGZlcikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVucV9leGl0OwotCX0KLQotCXhmZXItPnRva2VuID0gdG9rZW47Ci0JeGZlci0+Y2hhbiA9IGNoOwotCXhmZXItPnB4LmJ5dGVzID0gc2l6ZTsKLQl4ZmVyLT5weC5uZXh0ID0gTlVMTDsgLyogU2luZ2xlIHJlcXVlc3QgKi8KLQotCS8qIEZvciBTM0MgRE1BIEFQSSwgZGlyZWN0aW9uIGlzIGFsd2F5cyBmaXhlZCBmb3IgYWxsIHhmZXJzICovCi0JaWYgKGNoLT5yZXFbMF0ucnF0eXBlID09IE1FTVRPREVWKSB7Ci0JCXhmZXItPnB4LnNyY19hZGRyID0gYWRkcjsKLQkJeGZlci0+cHguZHN0X2FkZHIgPSBjaC0+c2RhZGRyOwotCX0gZWxzZSB7Ci0JCXhmZXItPnB4LnNyY19hZGRyID0gY2gtPnNkYWRkcjsKLQkJeGZlci0+cHguZHN0X2FkZHIgPSBhZGRyOwotCX0KLQotCWFkZF90b19xdWV1ZShjaCwgeGZlciwgMCk7Ci0KLQkvKiBUcnkgc3VibWl0dGluZyBvbiBlaXRoZXIgcmVxdWVzdCAqLwotCWlkeCA9IChjaC0+bHJxID09ICZjaC0+cmVxWzBdKSA/IDEgOiAwOwotCi0JaWYgKCFjaC0+cmVxW2lkeF0ueCkKLQkJczNjX3BsMzMwX3N1Ym1pdChjaCwgJmNoLT5yZXFbaWR4XSk7Ci0JZWxzZQotCQlzM2NfcGwzMzBfc3VibWl0KGNoLCAmY2gtPnJlcVsxIC0gaWR4XSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGNoLT5vcHRpb25zICYgUzNDMjQxMF9ETUFGX0FVVE9TVEFSVCkKLQkJczNjMjQxMF9kbWFfY3RybChpZCwgUzNDMjQxMF9ETUFPUF9TVEFSVCk7Ci0KLQlyZXR1cm4gMDsKLQotZW5xX2V4aXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2VucXVldWUpOwotCi1pbnQgczNjMjQxMF9kbWFfcmVxdWVzdChlbnVtIGRtYV9jaCBpZCwKLQkJCXN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCwKLQkJCXZvaWQgKmRldikKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2RtYWMgKmRtYWM7Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQljaCA9IGNoYW5fYWNxdWlyZShpZCk7Ci0JaWYgKCFjaCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gcmVxX2V4aXQ7Ci0JfQotCi0JZG1hYyA9IGNoLT5kbWFjOwotCi0JY2gtPnBsMzMwX2NoYW5faWQgPSBwbDMzMF9yZXF1ZXN0X2NoYW5uZWwoZG1hYy0+cGkpOwotCWlmICghY2gtPnBsMzMwX2NoYW5faWQpIHsKLQkJY2hhbl9yZWxlYXNlKGNoKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIHJlcV9leGl0OwotCX0KLQotCWNoLT5jbGllbnQgPSBjbGllbnQ7Ci0JY2gtPm9wdGlvbnMgPSAwOyAvKiBDbGVhciBhbnkgb3B0aW9uICovCi0JY2gtPmNhbGxiYWNrX2ZuID0gTlVMTDsgLyogQ2xlYXIgYW55IGNhbGxiYWNrICovCi0JY2gtPmxycSA9IE5VTEw7Ci0KLQljaC0+cnFjZmcuYnJzdF9zaXplID0gMjsgLyogRGVmYXVsdCB3b3JkIHNpemUgKi8KLQljaC0+cnFjZmcuc3dhcCA9IFNXQVBfTk87Ci0JY2gtPnJxY2ZnLnNjY3RsID0gU0NDVFJMMDsgLyogTm9uY2FjaGVhYmxlIGFuZCBub25idWZmZXJhYmxlICovCi0JY2gtPnJxY2ZnLmRjY3RsID0gRENDVFJMMDsgLyogTm9uY2FjaGVhYmxlIGFuZCBub25idWZmZXJhYmxlICovCi0JY2gtPnJxY2ZnLnByaXZpbGVnZWQgPSAwOwotCWNoLT5ycWNmZy5pbnNuYWNjZXNzID0gMDsKLQotCS8qIFNldCBpbnZhbGlkIGRpcmVjdGlvbiAqLwotCWNoLT5yZXFbMF0ucnF0eXBlID0gREVWVE9ERVY7Ci0JY2gtPnJlcVsxXS5ycXR5cGUgPSBjaC0+cmVxWzBdLnJxdHlwZTsKLQotCWNoLT5yZXFbMF0uY2ZnID0gJmNoLT5ycWNmZzsKLQljaC0+cmVxWzFdLmNmZyA9IGNoLT5yZXFbMF0uY2ZnOwotCi0JY2gtPnJlcVswXS5wZXJpID0gaWZhY2Vfb2ZfZG1hYyhkbWFjLCBpZCkgLSAxOyAvKiBPcmlnaW5hbCBpbmRleCAqLwotCWNoLT5yZXFbMV0ucGVyaSA9IGNoLT5yZXFbMF0ucGVyaTsKLQotCWNoLT5yZXFbMF0udG9rZW4gPSAmY2gtPnJlcVswXTsKLQljaC0+cmVxWzBdLnhmZXJfY2IgPSBzM2NfcGwzMzBfcnEwOwotCWNoLT5yZXFbMV0udG9rZW4gPSAmY2gtPnJlcVsxXTsKLQljaC0+cmVxWzFdLnhmZXJfY2IgPSBzM2NfcGwzMzBfcnExOwotCi0JY2gtPnJlcVswXS54ID0gTlVMTDsKLQljaC0+cmVxWzFdLnggPSBOVUxMOwotCi0JLyogUmVzZXQgeGZlciBsaXN0ICovCi0JSU5JVF9MSVNUX0hFQUQoJmNoLT54ZmVyX2xpc3QpOwotCWNoLT54ZmVyX2hlYWQgPSBOVUxMOwotCi1yZXFfZXhpdDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfcmVxdWVzdCk7Ci0KLWludCBzM2MyNDEwX2RtYV9mcmVlKGVudW0gZG1hX2NoIGlkLCBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIgKnhmZXI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpZHg7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCWNoID0gaWRfdG9fY2hhbihpZCk7Ci0KLQlpZiAoIWNoIHx8IGNoYW5fZnJlZShjaCkpCi0JCWdvdG8gZnJlZV9leGl0OwotCi0JLyogUmVmdXNlIGlmIHNvbWVvbmUgZWxzZSB3YW50ZWQgdG8gZnJlZSB0aGUgY2hhbm5lbCAqLwotCWlmIChjaC0+Y2xpZW50ICE9IGNsaWVudCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZnJlZV9leGl0OwotCX0KLQotCS8qIFN0b3AgYW55IGFjdGl2ZSB4ZmVyLCBGbHVzaGUgdGhlIHF1ZXVlIGFuZCBkbyBjYWxsYmFja3MgKi8KLQlwbDMzMF9jaGFuX2N0cmwoY2gtPnBsMzMwX2NoYW5faWQsIFBMMzMwX09QX0ZMVVNIKTsKLQotCS8qIEFib3J0IHRoZSBzdWJtaXR0ZWQgcmVxdWVzdHMgKi8KLQlpZHggPSAoY2gtPmxycSA9PSAmY2gtPnJlcVswXSkgPyAxIDogMDsKLQotCWlmIChjaC0+cmVxW2lkeF0ueCkgewotCQl4ZmVyID0gY29udGFpbmVyX29mKGNoLT5yZXFbaWR4XS54LAotCQkJCXN0cnVjdCBzM2NfcGwzMzBfeGZlciwgcHgpOwotCi0JCWNoLT5yZXFbaWR4XS54ID0gTlVMTDsKLQkJZGVsX2Zyb21fcXVldWUoeGZlcik7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQkJX2ZpbmlzaF9vZmYoeGZlciwgUzNDMjQxMF9SRVNfQUJPUlQsIDEpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoY2gtPnJlcVsxIC0gaWR4XS54KSB7Ci0JCXhmZXIgPSBjb250YWluZXJfb2YoY2gtPnJlcVsxIC0gaWR4XS54LAotCQkJCXN0cnVjdCBzM2NfcGwzMzBfeGZlciwgcHgpOwotCi0JCWNoLT5yZXFbMSAtIGlkeF0ueCA9IE5VTEw7Ci0JCWRlbF9mcm9tX3F1ZXVlKHhmZXIpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JCV9maW5pc2hfb2ZmKHhmZXIsIFMzQzI0MTBfUkVTX0FCT1JULCAxKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JfQotCi0JLyogUGx1Y2sgYW5kIEFib3J0IHRoZSBxdWV1ZWQgcmVxdWVzdHMgaW4gb3JkZXIgKi8KLQlkbyB7Ci0JCXhmZXIgPSBnZXRfZnJvbV9xdWV1ZShjaCwgMSk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQkJX2ZpbmlzaF9vZmYoeGZlciwgUzNDMjQxMF9SRVNfQUJPUlQsIDEpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQl9IHdoaWxlICh4ZmVyKTsKLQotCWNoLT5jbGllbnQgPSBOVUxMOwotCi0JcGwzMzBfcmVsZWFzZV9jaGFubmVsKGNoLT5wbDMzMF9jaGFuX2lkKTsKLQotCWNoLT5wbDMzMF9jaGFuX2lkID0gTlVMTDsKLQotCWNoYW5fcmVsZWFzZShjaCk7Ci0KLWZyZWVfZXhpdDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfZnJlZSk7Ci0KLWludCBzM2MyNDEwX2RtYV9jb25maWcoZW51bSBkbWFfY2ggaWQsIGludCB4ZmVydW5pdCkKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoOwotCXN0cnVjdCBwbDMzMF9pbmZvICpwaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpLCBkYndpZHRoLCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQljaCA9IGlkX3RvX2NoYW4oaWQpOwotCi0JaWYgKCFjaCB8fCBjaGFuX2ZyZWUoY2gpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gY2ZnX2V4aXQ7Ci0JfQotCi0JcGkgPSBjaC0+ZG1hYy0+cGk7Ci0JZGJ3aWR0aCA9IHBpLT5wY2ZnLmRhdGFfYnVzX3dpZHRoIC8gODsKLQotCS8qIE1heCBzaXplIG9mIHhmZXIgY2FuIGJlIHBjZmcuZGF0YV9idXNfd2lkdGggKi8KLQlpZiAoeGZlcnVuaXQgPiBkYndpZHRoKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gY2ZnX2V4aXQ7Ci0JfQotCi0JaSA9IDA7Ci0Jd2hpbGUgKHhmZXJ1bml0ICE9ICgxIDw8IGkpKQotCQlpKys7Ci0KLQkvKiBJZiB2YWxpZCB2YWx1ZSAqLwotCWlmICh4ZmVydW5pdCA9PSAoMSA8PCBpKSkKLQkJY2gtPnJxY2ZnLmJyc3Rfc2l6ZSA9IGk7Ci0JZWxzZQotCQlyZXQgPSAtRUlOVkFMOwotCi1jZmdfZXhpdDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfY29uZmlnKTsKLQotLyogT3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KLSNkZWZpbmUgUzNDX1BMMzMwX0ZMQUdTIChTM0MyNDEwX0RNQUZfQ0lSQ1VMQVIgfCBTM0MyNDEwX0RNQUZfQVVUT1NUQVJUKQotCi1pbnQgczNjMjQxMF9kbWFfc2V0ZmxhZ3MoZW51bSBkbWFfY2ggaWQsIHVuc2lnbmVkIGludCBvcHRpb25zKQotewotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2g7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JY2ggPSBpZF90b19jaGFuKGlkKTsKLQotCWlmICghY2ggfHwgY2hhbl9mcmVlKGNoKSB8fCBvcHRpb25zICYgfihTM0NfUEwzMzBfRkxBR1MpKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJY2gtPm9wdGlvbnMgPSBvcHRpb25zOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9zZXRmbGFncyk7Ci0KLWludCBzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4oZW51bSBkbWFfY2ggaWQsIHMzYzI0MTBfZG1hX2NiZm5fdCBydG4pCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQljaCA9IGlkX3RvX2NoYW4oaWQpOwotCi0JaWYgKCFjaCB8fCBjaGFuX2ZyZWUoY2gpKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJY2gtPmNhbGxiYWNrX2ZuID0gcnRuOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbik7Ci0KLWludCBzM2MyNDEwX2RtYV9kZXZjb25maWcoZW51bSBkbWFfY2ggaWQsIGVudW0gczNjMjQxMF9kbWFzcmMgc291cmNlLAotCQkJICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQljaCA9IGlkX3RvX2NoYW4oaWQpOwotCi0JaWYgKCFjaCB8fCBjaGFuX2ZyZWUoY2gpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZGV2Y2ZnX2V4aXQ7Ci0JfQotCi0Jc3dpdGNoIChzb3VyY2UpIHsKLQljYXNlIFMzQzI0MTBfRE1BU1JDX0hXOiAvKiBQLT5NICovCi0JCWNoLT5yZXFbMF0ucnF0eXBlID0gREVWVE9NRU07Ci0JCWNoLT5yZXFbMV0ucnF0eXBlID0gREVWVE9NRU07Ci0JCWNoLT5ycWNmZy5zcmNfaW5jID0gMDsKLQkJY2gtPnJxY2ZnLmRzdF9pbmMgPSAxOwotCQlicmVhazsKLQljYXNlIFMzQzI0MTBfRE1BU1JDX01FTTogLyogTS0+UCAqLwotCQljaC0+cmVxWzBdLnJxdHlwZSA9IE1FTVRPREVWOwotCQljaC0+cmVxWzFdLnJxdHlwZSA9IE1FTVRPREVWOwotCQljaC0+cnFjZmcuc3JjX2luYyA9IDE7Ci0JCWNoLT5ycWNmZy5kc3RfaW5jID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkZXZjZmdfZXhpdDsKLQl9Ci0KLQljaC0+c2RhZGRyID0gYWRkcmVzczsKLQotZGV2Y2ZnX2V4aXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2RldmNvbmZpZyk7Ci0KLWludCBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbihlbnVtIGRtYV9jaCBpZCwgZG1hX2FkZHJfdCAqc3JjLCBkbWFfYWRkcl90ICpkc3QpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaCA9IGlkX3RvX2NoYW4oaWQpOwotCXN0cnVjdCBwbDMzMF9jaGFuc3RhdHVzIHN0YXR1czsKLQlpbnQgcmV0OwotCi0JaWYgKCFjaCB8fCBjaGFuX2ZyZWUoY2gpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IHBsMzMwX2NoYW5fc3RhdHVzKGNoLT5wbDMzMF9jaGFuX2lkLCAmc3RhdHVzKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCSpzcmMgPSBzdGF0dXMuc3JjX2FkZHI7Ci0JKmRzdCA9IHN0YXR1cy5kc3RfYWRkcjsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbik7Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBwbDMzMF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCWlmIChwbDMzMF91cGRhdGUoZGF0YSkpCi0JCXJldHVybiBJUlFfSEFORExFRDsKLQllbHNlCi0JCXJldHVybiBJUlFfTk9ORTsKLX0KLQotc3RhdGljIGludCBwbDMzMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzM2NfcGwzMzBfZG1hYyAqczNjX3BsMzMwX2RtYWM7Ci0Jc3RydWN0IHMzY19wbDMzMF9wbGF0ZGF0YSAqcGwzMzBwZDsKLQlzdHJ1Y3QgcGwzMzBfaW5mbyAqcGwzMzBfaW5mbzsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgaSwgcmV0LCBpcnE7Ci0KLQlwbDMzMHBkID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQkvKiBDYW4ndCBkbyB3aXRob3V0IHRoZSBsaXN0IG9mIF8zMl8gcGVyaXBoZXJhbHMgKi8KLQlpZiAoIXBsMzMwcGQgfHwgIXBsMzMwcGQtPnBlcmkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm0gZGF0YSBtaXNzaW5nIVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXBsMzMwX2luZm8gPSBremFsbG9jKHNpemVvZigqcGwzMzBfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghcGwzMzBfaW5mbykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwbDMzMF9pbmZvLT5wbDMzMF9kYXRhID0gTlVMTDsKLQlwbDMzMF9pbmZvLT5kZXYgPSAmcGRldi0+ZGV2OwotCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIHByb2JlX2VycjE7Ci0JfQotCi0JcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSk7Ci0KLQlwbDMzMF9pbmZvLT5iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghcGwzMzBfaW5mby0+YmFzZSkgewotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gcHJvYmVfZXJyMjsKLQl9Ci0KLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChpcnEgPCAwKSB7Ci0JCXJldCA9IGlycTsKLQkJZ290byBwcm9iZV9lcnIzOwotCX0KLQotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcGwzMzBfaXJxX2hhbmRsZXIsIDAsCi0JCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcGwzMzBfaW5mbyk7Ci0JaWYgKHJldCkKLQkJZ290byBwcm9iZV9lcnI0OwotCi0JLyogQWxsb2NhdGUgYSBuZXcgRE1BQyAqLwotCXMzY19wbDMzMF9kbWFjID0ga21hbGxvYyhzaXplb2YoKnMzY19wbDMzMF9kbWFjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzM2NfcGwzMzBfZG1hYykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2VycjU7Ci0JfQotCi0JLyogR2V0IG9wZXJhdGlvbiBjbG9jayBhbmQgZW5hYmxlIGl0ICovCi0JczNjX3BsMzMwX2RtYWMtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInBkbWEiKTsKLQlpZiAoSVNfRVJSKHMzY19wbDMzMF9kbWFjLT5jbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBnZXQgb3BlcmF0aW9uIGNsb2NrLlxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gcHJvYmVfZXJyNjsKLQl9Ci0JY2xrX2VuYWJsZShzM2NfcGwzMzBfZG1hYy0+Y2xrKTsKLQotCXJldCA9IHBsMzMwX2FkZChwbDMzMF9pbmZvKTsKLQlpZiAocmV0KQotCQlnb3RvIHByb2JlX2Vycjc7Ci0KLQkvKiBIb29rIHRoZSBpbmZvICovCi0JczNjX3BsMzMwX2RtYWMtPnBpID0gcGwzMzBfaW5mbzsKLQotCS8qIE5vIGJ1c3kgY2hhbm5lbHMgKi8KLQlzM2NfcGwzMzBfZG1hYy0+YnVzeV9jaGFuID0gMDsKLQotCXMzY19wbDMzMF9kbWFjLT5rbWNhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoZGV2X25hbWUoJnBkZXYtPmRldiksCi0JCQkJc2l6ZW9mKHN0cnVjdCBzM2NfcGwzMzBfeGZlciksIDAsIDAsIE5VTEwpOwotCi0JaWYgKCFzM2NfcGwzMzBfZG1hYy0+a21jYWNoZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2Vycjg7Ci0JfQotCi0JLyogR2V0IHRoZSBsaXN0IG9mIHBlcmlwaGVyYWxzICovCi0JczNjX3BsMzMwX2RtYWMtPnBlcmkgPSBwbDMzMHBkLT5wZXJpOwotCi0JLyogQXR0YWNoIHRvIHRoZSBsaXN0IG9mIERNQUNzICovCi0JbGlzdF9hZGRfdGFpbCgmczNjX3BsMzMwX2RtYWMtPm5vZGUsICZkbWFjX2xpc3QpOwotCi0JLyogQ3JlYXRlIGEgY2hhbm5lbCBmb3IgZWFjaCBwZXJpcGhlcmFsIGluIHRoZSBETUFDCi0JICogdGhhdCBpcywgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0Ci0JICovCi0JZm9yIChpID0gMDsgaSA8IFBMMzMwX01BWF9QRVJJOyBpKyspCi0JCWlmIChzM2NfcGwzMzBfZG1hYy0+cGVyaVtpXSAhPSBETUFDSF9NQVgpCi0JCQljaGFuX2FkZChzM2NfcGwzMzBfZG1hYy0+cGVyaVtpXSk7Ci0KLQlwcmludGsoS0VSTl9JTkZPCi0JCSJMb2FkZWQgZHJpdmVyIGZvciBQTDMzMCBETUFDLSVkICVzXG4iLAlwZGV2LT5pZCwgcGRldi0+bmFtZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTwotCQkiXHREQlVGRi0ldXgldWJ5dGVzIE51bV9DaGFucy0ldSBOdW1fUGVyaS0ldSBOdW1fRXZlbnRzLSV1XG4iLAotCQlwbDMzMF9pbmZvLT5wY2ZnLmRhdGFfYnVmX2RlcCwKLQkJcGwzMzBfaW5mby0+cGNmZy5kYXRhX2J1c193aWR0aCAvIDgsIHBsMzMwX2luZm8tPnBjZmcubnVtX2NoYW4sCi0JCXBsMzMwX2luZm8tPnBjZmcubnVtX3BlcmksIHBsMzMwX2luZm8tPnBjZmcubnVtX2V2ZW50cyk7Ci0KLQlyZXR1cm4gMDsKLQotcHJvYmVfZXJyODoKLQlwbDMzMF9kZWwocGwzMzBfaW5mbyk7Ci1wcm9iZV9lcnI3OgotCWNsa19kaXNhYmxlKHMzY19wbDMzMF9kbWFjLT5jbGspOwotCWNsa19wdXQoczNjX3BsMzMwX2RtYWMtPmNsayk7Ci1wcm9iZV9lcnI2OgotCWtmcmVlKHMzY19wbDMzMF9kbWFjKTsKLXByb2JlX2VycjU6Ci0JZnJlZV9pcnEoaXJxLCBwbDMzMF9pbmZvKTsKLXByb2JlX2VycjQ6Ci1wcm9iZV9lcnIzOgotCWlvdW5tYXAocGwzMzBfaW5mby0+YmFzZSk7Ci1wcm9iZV9lcnIyOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotcHJvYmVfZXJyMToKLQlrZnJlZShwbDMzMF9pbmZvKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcGwzMzBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9kbWFjICpkbWFjLCAqZDsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGRlbCwgZm91bmQ7Ci0KLQlpZiAoIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JZm91bmQgPSAwOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmRtYWNfbGlzdCwgbm9kZSkKLQkJaWYgKGQtPnBpLT5kZXYgPT0gJnBkZXYtPmRldikgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCWlmICghZm91bmQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZG1hYyA9IGQ7Ci0KLQkvKiBSZW1vdmUgYWxsIENoYW5uZWxzIHRoYXQgYXJlIG1hbmFnZWQgb25seSBieSB0aGlzIERNQUMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmY2hhbl9saXN0LCBub2RlKSB7Ci0KLQkJLyogT25seSBjaGFubmVscyB0aGF0IGFyZSBoYW5kbGVkIGJ5IHRoaXMgRE1BQyAqLwotCQlpZiAoaWZhY2Vfb2ZfZG1hYyhkbWFjLCBjaC0+aWQpKQotCQkJZGVsID0gMTsKLQkJZWxzZQotCQkJY29udGludWU7Ci0KLQkJLyogRG9uJ3QgcmVtb3ZlIGlmIHNvbWUgb3RoZXIgRE1BQyBoYXMgaXQgdG9vICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmRtYWNfbGlzdCwgbm9kZSkKLQkJCWlmIChkICE9IGRtYWMgJiYgaWZhY2Vfb2ZfZG1hYyhkLCBjaC0+aWQpKSB7Ci0JCQkJZGVsID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQlpZiAoZGVsKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCQkJczNjMjQxMF9kbWFfZnJlZShjaC0+aWQsIGNoLT5jbGllbnQpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JCQlsaXN0X2RlbCgmY2gtPm5vZGUpOwotCQkJa2ZyZWUoY2gpOwotCQl9Ci0JfQotCi0JLyogRGlzYWJsZSBvcGVyYXRpb24gY2xvY2sgKi8KLQljbGtfZGlzYWJsZShkbWFjLT5jbGspOwotCWNsa19wdXQoZG1hYy0+Y2xrKTsKLQotCS8qIFJlbW92ZSB0aGUgRE1BQyAqLwotCWxpc3RfZGVsKCZkbWFjLT5ub2RlKTsKLQlrZnJlZShkbWFjKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGwzMzBfZHJpdmVyID0gewotCS5kcml2ZXIJCT0gewotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLm5hbWUJPSAiczNjLXBsMzMwIiwKLQl9LAotCS5wcm9iZQkJPSBwbDMzMF9wcm9iZSwKLQkucmVtb3ZlCQk9IHBsMzMwX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBsMzMwX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwbDMzMF9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQocGwzMzBfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwbDMzMF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBsMzMwX2RyaXZlcik7Ci0JcmV0dXJuOwotfQotbW9kdWxlX2V4aXQocGwzMzBfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBQTDMzMCBETUEgQ29udHJvbGxlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zcGVhci9pbmNsdWRlL3BsYXQvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL3BsYXQtc3BlYXIvaW5jbHVkZS9wbGF0L2RlYnVnLW1hY3JvLlMKaW5kZXggODUwMWJiZi4uMDJiMTYwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zcGVhci9pbmNsdWRlL3BsYXQvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9kZWJ1Zy1tYWNyby5TCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjU1BFQVJfREJHX1VBUlRfQkFTRQkJQCBQaHlzaWNhbCBiYXNlCiAJCW1vdglccnYsICNWQV9TUEVBUl9EQkdfVUFSVF9CQVNFCQlAIFZpcnR1YWwgYmFzZQogCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zcGVhci9pbmNsdWRlL3BsYXQvZ3Bpby5oIGIvYXJjaC9hcm0vcGxhdC1zcGVhci9pbmNsdWRlL3BsYXQvZ3Bpby5oCmluZGV4IGI4NTdjOTEuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc3BlYXIvaW5jbHVkZS9wbGF0L2dwaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9ncGlvLmgKQEAgLTEsMjQgKzEgQEAKLS8qCi0gKiBhcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9ncGlvLmgKLSAqCi0gKiBHUElPIG1hY3JvcyBmb3IgU1BFQXIgcGxhdGZvcm0KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgU1QgTWljcm9lbGVjdHJvbmljcwotICogVmlyZXNoIEt1bWFyPHZpcmVzaC5rdW1hckBzdC5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fUExBVF9HUElPX0gKLSNkZWZpbmUgX19QTEFUX0dQSU9fSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCi0KLSNlbmRpZiAvKiBfX1BMQVRfR1BJT19IICovCisvKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zcGVhci9pbmNsdWRlL3BsYXQvbWVtb3J5LmggYi9hcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzNTk5ZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9tZW1vcnkuaAotICoKLSAqIE1lbW9yeSBtYXAgZm9yIFNQRUFyIHBsYXRmb3JtCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFNUIE1pY3JvZWxlY3Ryb25pY3MKLSAqIFZpcmVzaCBLdW1hcjx2aXJlc2gua3VtYXJAc3QuY29tPgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfX1BMQVRfTUVNT1JZX0gKLSNkZWZpbmUgX19QTEFUX01FTU9SWV9ICi0KLS8qIFBoeXNpY2FsIERSQU0gb2Zmc2V0ICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MDAwMDAwMDApCi0KLSNlbmRpZiAvKiBfX1BMQVRfTUVNT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtdGNjL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vcGxhdC10Y2MvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggNzY2MmY3My4uY2YxN2QwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC10Y2MvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vcGxhdC10Y2MvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTksNyArOSw3IEBACiAgKgogICovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3ZlcQlccnAsICMweDkwMDAwMDAwCUAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzCiAJCW1vdm5lCVxydiwgIzB4RjEwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKIAkJb3JyCVxycCwgXHJwLCAjMHgwMDAwNzAwMAlAIFVBUlQwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXRjYy9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9wbGF0LXRjYy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTZlMGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC10Y2MvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAotICogQ29weXJpZ2h0IChDKSAyMDAwIFJpZGdlUnVuLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUZWxlY2hpcHMKLSAqIENvcHlyaWdodCAoQykgMjAxMCBIYW5zIEouIEtvY2ggPGhqa0BsaW51dHJvbml4LmRlPgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIHYyLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLS8qCi0gKiBQaHlzaWNhbCBEUkFNIG9mZnNldC4KLSAqLwotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDIwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtdmVyc2F0aWxlL3BsYXRzbXAuYyBiL2FyY2gvYXJtL3BsYXQtdmVyc2F0aWxlL3BsYXRzbXAuYwppbmRleCA1MWVjZmVhLi45MmYxOGQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXZlcnNhdGlsZS9wbGF0c21wLmMKKysrIGIvYXJjaC9hcm0vcGxhdC12ZXJzYXRpbGUvcGxhdHNtcC5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJICogc2luY2Ugd2UgaGF2ZW4ndCBzZW50IHRoZW0gYSBzb2Z0IGludGVycnVwdCwgdGhleSBzaG91bGRuJ3QKIAkgKiBiZSB0aGVyZS4KIAkgKi8KLQl3cml0ZV9wZW5fcmVsZWFzZShjcHUpOworCXdyaXRlX3Blbl9yZWxlYXNlKGNwdV9sb2dpY2FsX21hcChjcHUpKTsKIAogCS8qCiAJICogU2VuZCB0aGUgc2Vjb25kYXJ5IENQVSBhIHNvZnQgaW50ZXJydXB0LCB0aGVyZWJ5IGNhdXNpbmcKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwppbmRleCA3OWJjYjQzLi44ZjNjY2RkIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCkBAIC04LDkgKzgsOSBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVfcG0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgpAQCAtNjgsNyArNjgsNyBAQAogLyoKICAqIEZvcmNlIGEgcmVsb2FkIG9mIHRoZSBWRlAgY29udGV4dCBmcm9tIHRoZSB0aHJlYWQgc3RydWN0dXJlLiAgV2UgZG8KICAqIHRoaXMgYnkgZW5zdXJpbmcgdGhhdCBhY2Nlc3MgdG8gdGhlIFZGUCBoYXJkd2FyZSBpcyBkaXNhYmxlZCwgYW5kCi0gKiBjbGVhciBsYXN0X1ZGUF9jb250ZXh0LiAgTXVzdCBiZSBjYWxsZWQgZnJvbSBub24tcHJlZW1wdGlibGUgY29udGV4dC4KKyAqIGNsZWFyIHZmcF9jdXJyZW50X2h3X3N0YXRlLiAgTXVzdCBiZSBjYWxsZWQgZnJvbSBub24tcHJlZW1wdGlibGUgY29udGV4dC4KICAqLwogc3RhdGljIHZvaWQgdmZwX2ZvcmNlX3JlbG9hZCh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCkKIHsKQEAgLTQzNiw5ICs0MzYsNyBAQAogCXNldF9jb3Byb19hY2Nlc3MoYWNjZXNzIHwgQ1BBQ0NfRlVMTCgxMCkgfCBDUEFDQ19GVUxMKDExKSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLSNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgotCisjaWZkZWYgQ09ORklHX0NQVV9QTQogc3RhdGljIGludCB2ZnBfcG1fc3VzcGVuZCh2b2lkKQogewogCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CkBAIC00NjgsMTkgKzQ2NiwzMyBAQAogCWZteHIoRlBFWEMsIGZtcngoRlBFWEMpICYgfkZQRVhDX0VOKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyB2ZnBfcG1fc3lzY29yZV9vcHMgPSB7Ci0JLnN1c3BlbmQJPSB2ZnBfcG1fc3VzcGVuZCwKLQkucmVzdW1lCQk9IHZmcF9wbV9yZXN1bWUsCitzdGF0aWMgaW50IHZmcF9jcHVfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGNtZCwKKwl2b2lkICp2KQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDUFVfUE1fRU5URVI6CisJCXZmcF9wbV9zdXNwZW5kKCk7CisJCWJyZWFrOworCWNhc2UgQ1BVX1BNX0VOVEVSX0ZBSUxFRDoKKwljYXNlIENQVV9QTV9FWElUOgorCQl2ZnBfcG1fcmVzdW1lKCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHZmcF9jcHVfcG1fbm90aWZpZXJfYmxvY2sgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB2ZnBfY3B1X3BtX25vdGlmaWVyLAogfTsKIAogc3RhdGljIHZvaWQgdmZwX3BtX2luaXQodm9pZCkKIHsKLQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmdmZwX3BtX3N5c2NvcmVfb3BzKTsKKwljcHVfcG1fcmVnaXN0ZXJfbm90aWZpZXIoJnZmcF9jcHVfcG1fbm90aWZpZXJfYmxvY2spOwogfQogCiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHZmcF9wbV9pbml0KHZvaWQpIHsgfQotI2VuZGlmIC8qIENPTkZJR19QTSAqLworI2VuZGlmIC8qIENPTkZJR19DUFVfUE0gKi8KIAogLyoKICAqIEVuc3VyZSB0aGF0IHRoZSBWRlAgc3RhdGUgc3RvcmVkIGluICd0aHJlYWQtPnZmcHN0YXRlJyBpcyB1cCB0byBkYXRlCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYwppbmRleCBmYWZlZDRjLi4xZjE3YmRlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMKQEAgLTkwLDExICs5MCw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbmFuZF9wYXJ0X2luZm8oaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShuYW5kX3BhcnRpdGlvbnMpOwotCXJldHVybiBuYW5kX3BhcnRpdGlvbnM7Ci19CiAKIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIGF0bmd3MTAwbWtpaV9uYW5kX2RhdGEgX19pbml0ZGF0YSA9IHsKIAkuY2xlCQk9IDIxLApAQCAtMTAyLDcgKzk3LDggQEAKIAkucmR5X3Bpbgk9IEdQSU9fUElOX1BCKDI4KSwKIAkuZW5hYmxlX3Bpbgk9IEdQSU9fUElOX1BFKDIzKSwKIAkuYnVzX3dpZHRoXzE2CT0gdHJ1ZSwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRfaW5mbywKKwkucGFydHMJCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKG5hbmRfcGFydGl0aW9ucyksCiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYwppbmRleCA2Y2UzMGZiLi40NjQzZmY1IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCkBAIC05MCwxOCArOTAsMTMgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpuYW5kX3BhcnRfaW5mbyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKG5hbmRfcGFydGl0aW9ucyk7Ci0JcmV0dXJuIG5hbmRfcGFydGl0aW9uczsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgYXRzdGsxMDA2X25hbmRfZGF0YSBfX2luaXRkYXRhID0gewogCS5jbGUJCT0gMjEsCiAJLmFsZQkJPSAyMiwKIAkucmR5X3Bpbgk9IEdQSU9fUElOX1BCKDMwKSwKIAkuZW5hYmxlX3Bpbgk9IEdQSU9fUElOX1BCKDI5KSwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRfaW5mbywKKwkucGFydHMJCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKG51bV9wYXJ0aXRpb25zKSwKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggYzhkMWZhZS4uMjQ3Yjg4YyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zb2NrZXQuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC02Miw0ICs2Miw3IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjZW5kaWYgLyogX19BU01fQVZSMzJfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYwppbmRleCA4NjkyNWZkLi4yM2IxYTk3IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2NwdWZyZXEuYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY3B1ZnJlcS5jCmluZGV4IDAyNGM1ODYuLjYyNzc0MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY3B1ZnJlcS5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY3B1ZnJlcS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjcHVjbGs7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9ib2FyZC5oIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvYm9hcmQuaAppbmRleCA2Nzk0NThkLi41ZDdmZmNhIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9ib2FyZC5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2JvYXJkLmgKQEAgLTEyOCw3ICsxMjgsOCBAQAogCXU4CWFsZTsJCS8qIGFkZHJlc3MgbGluZSBudW1iZXIgY29ubmVjdGVkIHRvIEFMRSAqLwogCXU4CWNsZTsJCS8qIGFkZHJlc3MgbGluZSBudW1iZXIgY29ubmVjdGVkIHRvIENMRSAqLwogCXU4CWJ1c193aWR0aF8xNjsJLyogYnVzd2lkdGggaXMgMTYgYml0ICovCi0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKigqcGFydGl0aW9uX2luZm8pKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKTsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CisJdW5zaWduZWQgaW50CW51bV9wYXJ0czsKIH07CiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKIGF0MzJfYWRkX2RldmljZV9uYW5kKHVuc2lnbmVkIGludCBpZCwgc3RydWN0IGF0bWVsX25hbmRfZGF0YSAqZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5jCmluZGV4IDI1ODY4MmIuLmFhZmY4M2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYwppbmRleCA5YjM5ZGVhLi45MDNjN2Q4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tbS9kbWEtY29oZXJlbnQuYyBiL2FyY2gvYXZyMzIvbW0vZG1hLWNvaGVyZW50LmMKaW5kZXggM2MwMDQyMi4uNTBjZGI1YiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9kbWEtY29oZXJlbnQuYworKysgYi9hcmNoL2F2cjMyL21tL2RtYS1jb2hlcmVudC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3NlcmlhbC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3NlcmlhbC5oCmluZGV4IDdmZDBlYzcuLmVjYWNkZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZXJpYWwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc2VyaWFsLmgKQEAgLTMyLDYgKzMyLDggQEAKIHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0IHsKIAlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7CiAJdW5zaWduZWQgaW50IG9sZF9zdGF0dXM7CisJaW50IHR4X2lycTsKKwlpbnQgcnhfaXJxOwogCWludCBzdGF0dXNfaXJxOwogI2lmbmRlZiBCRklOX1VBUlRfQkY1NFhfU1RZTEUKIAl1bnNpZ25lZCBpbnQgbHNyOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZG1hLW1hcHBpbmcuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2RtYS1tYXBwaW5nLmMKaW5kZXggMDRkZGNmZS4uZjBkMTExOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9kbWEtbWFwcGluZy5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBzcGlubG9ja190IGRtYV9wYWdlX2xvY2s7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqZG1hX3BhZ2U7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggMDQzMDBmMi4uZTQ3ZDE5YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMjQsNiArMjQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGFzbS9iZmluX3BmbW9uLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9zeXNfYmZpbi5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc3lzX2JmaW4uYwppbmRleCA4OTQ0OGVkLi5kOTk4MzgzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9zeXNfYmZpbi5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3N5c19iZmluLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX0ZCKSB8fCBkZWZpbmVkKENPTkZJR19GQl9NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIHVuc2lnbmVkIGxvbmcgZ2V0X2ZiX3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgb3JpZ19hZGRyLAogCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jCmluZGV4IGQ3OGZjMmMuLmQxYzBjMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgpAQCAtMzcyLDggKzM3MywxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtNDE1LDggKzQyMSwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1RYLAorCQkuZW5kID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy90Y20tYmY1MTguYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvdGNtLWJmNTE4LmMKaW5kZXggNTVjMTI3OS4uNTQ3MGJmOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy90Y20tYmY1MTguYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL3RjbS1iZjUxOC5jCkBAIC0zMDksOCArMzA5LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0zNTIsOCArMzU3LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2FkNzE2MGV2YWwuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvYWQ3MTYwZXZhbC5jCmluZGV4IGMwNGRmNDMuLjViYzY5MzggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvYWQ3MTYwZXZhbC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvYWQ3MTYwZXZhbC5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTM4MCw4ICszODEsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTQyMyw4ICs0MjksMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYwppbmRleCA2NDAwMzQxLi5jZDI4OTY5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCkBAIC04LDYgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTUzOSw4ICs1NDAsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTU4Miw4ICs1ODgsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYwppbmRleCA2ZGJiMWI0Li45Zjc5MmVhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTQxNyw4ICs0MTgsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTQ2MCw4ICs0NjYsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwppbmRleCA0ZTlkYzljLi4zZWNhZmZmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTcxMCw4ICs3MTEsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTc1Myw4ICs3NTksMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvdGxsNjUyN20uYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvdGxsNjUyN20uYwppbmRleCBlYzRiYzc0Li4zYTkyYzQzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL3RsbDY1MjdtLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy90bGw2NTI3bS5jCkBAIC04LDYgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTQ5NSw4ICs0OTYsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTUzOSw4ICs1NDUsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYwppbmRleCA1ZGE1Nzg3Li40N2NhZGQzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCkBAIC0yMzgsOCArMjM4LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlggKyAxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMKaW5kZXggYjBlYzgyNS4uMTg4MTdkNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMKQEAgLTE5Myw4ICsxOTMsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCArIDEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jCmluZGV4IDE0ZjU0YTMuLjJjOGYzMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMKQEAgLTIyMSw4ICsyMjEsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCArIDEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCmluZGV4IGVjZDI4MDEuLjE0NDU1NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKQEAgLTI5Miw4ICsyOTIsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCArIDEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYwppbmRleCBmYmVlNzdmLi5iNTk3ZDRlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYwpAQCAtMTUxLDggKzE1MSwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYICsgMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKaW5kZXggOTY0YThlNS4uMmFmZDAyZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwpAQCAtMjk4LDggKzI5OCwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYICsgMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3ZS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN2UuYwppbmRleCA5ZmIyMGQ2Li42MDRhNDMwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3ZS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzdlLmMKQEAgLTgsNiArOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgpAQCAtMzA1LDggKzMwNiwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMzY2LDggKzM3MiwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1RYLAorCQkuZW5kID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN3UuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1Mzd1LmMKaW5kZXggNWJhMzg5Zi4uZDkxNmI0NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN3UuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3dS5jCkBAIC05LDYgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTMwNiw4ICszMDcsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTM0OSw4ICszNTUsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZG5wNTM3MC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9kbnA1MzcwLmMKaW5kZXggOGJjOTUxZC4uNWYzMDcyMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9kbnA1MzcwLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9kbnA1MzcwLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTIzNiw4ICsyMzcsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTI4MCw4ICsyODYsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCAgID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kICAgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCAgID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYwppbmRleCBjNjJmOWRjLi4zOTAxZGQwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jCkBAIC0yNDAsOCArMjQwLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0yODMsOCArMjg4LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYwppbmRleCAzYjgxNTFkLi5hZWJkMzFjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgpAQCAtMTAwLDYgKzEwMSw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX01BQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2JmaW5fbWFjLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYmZpbl9tYWNfcGVyaXBoZXJhbHNbXSA9IFBfUk1JSTA7CiAKIHN0YXRpYyBzdHJ1Y3QgYmZpbl9waHlkZXZfcGxhdGZvcm1fZGF0YSBiZmluX3BoeWRldl9kYXRhW10gPSB7CkBAIC0zMDgsOCArMzEwLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0zNTEsOCArMzU4LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKaW5kZXggNmM5MTZhNi4uN2ZiYjBiYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYwpAQCAtNyw2ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTE1NjYsOCArMTU2NywxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMTYyMSw4ICsxNjI3LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYwppbmRleCAyZGEwMzE2Li42OTE3Y2UyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgpAQCAtMzA2LDggKzMwNywxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMzQ5LDggKzM1NSwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1RYLAorCQkuZW5kID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jCmluZGV4IDYyOWYzYzMuLjgzNTZlYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKQEAgLTQ5LDggKzQ5LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0xMDQsOCArMTA5LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0xNDcsOCArMTU3LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDJfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDJfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDJfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDJfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMl9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKaW5kZXggMjEyYjllMC4uMDM1MGVhYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYwpAQCAtMTM1LDggKzEzNSwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMTc4LDggKzE4MywxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1RYLAorCQkuZW5kID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMjM3LDggKzI0NywxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQyX1RYLAorCQkuZW5kID0gSVJRX1VBUlQyX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQyX1JYLAotCQkuZW5kID0gSVJRX1VBUlQyX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDJfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMjgwLDggKzI5NSwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQzX1RYLAorCQkuZW5kID0gSVJRX1VBUlQzX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQzX1JYLAotCQkuZW5kID0gSVJRX1VBUlQzX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDNfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCmluZGV4IGNkOWNiYjYuLmJiODY4YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKQEAgLTI0MSw4ICsyNDEsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTI4NCw4ICsyODksMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTM0Myw4ICszNTMsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMl9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMl9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMl9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMl9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQyX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTM4Niw4ICs0MDEsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUM19UWCwKKwkJLmVuZCA9IElSUV9VQVJUM19UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUM19SWCwKLQkJLmVuZCA9IElSUV9VQVJUM19SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQzX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvYWN2aWxvbi5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9hY3ZpbG9uLmMKaW5kZXggOTcyZTEzNC4uYjFiNzMzOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9hY3ZpbG9uLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9hY3ZpbG9uLmMKQEAgLTIwMyw4ICsyMDMsMTMgQEAKIAkgLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJIH0sCiAJeworCSAuc3RhcnQgPSBJUlFfVUFSVF9UWCwKKwkgLmVuZCA9IElSUV9VQVJUX1RYLAorCSAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkgfSwKKwl7CiAJIC5zdGFydCA9IElSUV9VQVJUX1JYLAotCSAuZW5kID0gSVJRX1VBUlRfUlggKyAxLAorCSAuZW5kID0gSVJRX1VBUlRfUlgsCiAJIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCSB9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYwppbmRleCBjMWI3MmYyLi5jMDE3Y2YwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCkBAIC0yNzcsOCArMjc3LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlRfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlRfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCmluZGV4IDk0OTBkYzguLjI3ZjIyZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKQEAgLTE3Miw4ICsxNzIsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUX1RYLAorCQkuZW5kID0gSVJRX1VBUlRfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL3RlcGxhLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL3RlcGxhLmMKaW5kZXggYmIwNTZlNi4uMWE1N2JjOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYwpAQCAtNTEsOCArNTEsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUX1RYLAorCQkuZW5kID0gSVJRX1VBUlRfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3B1ZnJlcS5jCmluZGV4IDg1ZGM2ZDYuLjJlNmVlZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3B1ZnJlcS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3B1ZnJlcS5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21tL2luaXQuYyBiL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCmluZGV4IGY4NDM1Y2QuLjc4ZGFhZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9iZmluLWdsb2JhbC5oPgogI2luY2x1ZGUgPGFzbS9wZGEuaD4KICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwva2dkYi5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9rZ2RiLmMKaW5kZXggYjlmOWM4Yy4uYjU3OWRkMCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9rZ2RiLmMKQEAgLTY5NCw3ICs2OTQsNyBAQAogICAgICAgICAgICAgICAgIC8qIFZhbGlkIG1lbSBhZGRyZXNzLiAqLwogICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9ICptZW0rKzsKLQkJCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaCk7CisJCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2gpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKQEAgLTg2OCw3ICs4NjgsNyBAQAogCS8qIFNlbmQgdHJhcCB0eXBlIChjb252ZXJ0ZWQgdG8gc2lnbmFsKSAqLwogCiAJKnB0cisrID0gJ1QnOwotCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBzaWd2YWwpOworCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBzaWd2YWwpOwogCiAJLyogU2VuZCByZWdpc3RlciBjb250ZW50cy4gV2UgcHJvYmFibHkgb25seSBuZWVkIHRvIHNlbmQgdGhlCiAJICogUEMsIGZyYW1lIHBvaW50ZXIgYW5kIHN0YWNrIHBvaW50ZXIgaGVyZS4gT3RoZXIgcmVnaXN0ZXJzIHdpbGwgYmUKQEAgLTg4MSw3ICs4ODEsNyBAQAogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlYWRfcmVnaXN0ZXIgKHJlZ25vLCAmcmVnX2NvbnQpOwogICAgICAgICAgICAgICAgIAogCQlpZiAoc3RhdHVzID09IFNVQ0NFU1MpIHsKLQkJCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCByZWdubyk7CisJCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgcmVnbm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gJzonOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBtZW0yaGV4KHB0ciwgKHVuc2lnbmVkIGNoYXIgKikmcmVnX2NvbnQsCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWEzL25hbmRmbGFzaC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1hMy9uYW5kZmxhc2guYwppbmRleCBmNThmMmMxLi43ZmI1MjEyIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWEzL25hbmRmbGFzaC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtYTMvbmFuZGZsYXNoLmMKQEAgLTE2Myw3ICsxNjMsNyBAQAogCXRoaXMtPmVjYy5tb2RlID0gTkFORF9FQ0NfU09GVDsKIAogCS8qIEVuYWJsZSB0aGUgZm9sbG93aW5nIGZvciBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSAqLwotCS8qIHRoaXMtPm9wdGlvbnMgPSBOQU5EX1VTRV9GTEFTSF9CQlQ7ICovCisJLyogdGhpcy0+YmJ0X29wdGlvbnMgPSBOQU5EX0JCVF9VU0VfRkxBU0g7ICovCiAKIAkvKiBTY2FuIHRvIGZpbmQgZXhpc3RlbmNlIG9mIHRoZSBkZXZpY2UgKi8KIAlpZiAobmFuZF9zY2FuKGNyaXN2MzJfbXRkLCAxKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1mcy9uYW5kZmxhc2guYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvbmFuZGZsYXNoLmMKaW5kZXggZDViMGNjOS4uZTAzMjM4NCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1mcy9uYW5kZmxhc2guYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWZzL25hbmRmbGFzaC5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAl0aGlzLT5lY2MubW9kZSA9IE5BTkRfRUNDX1NPRlQ7CiAKIAkvKiBFbmFibGUgdGhlIGZvbGxvd2luZyBmb3IgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUgKi8KLQkvKiB0aGlzLT5vcHRpb25zID0gTkFORF9VU0VfRkxBU0hfQkJUOyAqLworCS8qIHRoaXMtPmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIOyAqLwogCiAJLyogU2NhbiB0byBmaW5kIGV4aXN0ZW5jZSBvZiB0aGUgZGV2aWNlICovCiAJaWYgKG5hbmRfc2NhbihjcmlzdjMyX210ZCwgMSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwva2dkYi5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9rZ2RiLmMKaW5kZXggYzAzNDNjMy4uOGMxZDM1YyAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9rZ2RiLmMKQEAgLTY3Nyw3ICs2NzcsNyBAQAogICAgICAgICAgICAgICAgIC8qIFZhbGlkIG1lbSBhZGRyZXNzLiAqLwogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQkJY2ggPSAqbWVtKys7Ci0JCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2gpOworCQkJYnVmID0gaGV4X2J5dGVfcGFjayhidWYsIGNoKTsKIAkJfQogICAgICAgICB9CiAgICAgICAgIC8qIFRlcm1pbmF0ZSBwcm9wZXJseS4gKi8KQEAgLTY5NSw3ICs2OTUsNyBAQAogCW1lbSArPSBjb3VudCAtIDE7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJY2ggPSAqbWVtLS07Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaCk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBUZXJtaW5hdGUgcHJvcGVybHkuICovCkBAIC04ODAsNyArODgwLDcgQEAKIAkvKiBTZW5kIHRyYXAgdHlwZSAoY29udmVydGVkIHRvIHNpZ25hbCkgKi8KIAogCSpwdHIrKyA9ICdUJzsKLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgc2lndmFsKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgc2lndmFsKTsKIAogCWlmICgoKHJlZy5leHMgJiAweGZmMDApID4+IDgpID09IDB4YykgewogCkBAIC05ODgsMjYgKzk4OCwyNiBAQAogCX0KIAkvKiBPbmx5IHNlbmQgUEMsIGZyYW1lIGFuZCBzdGFjayBwb2ludGVyLiAqLwogCXJlYWRfcmVnaXN0ZXIoUEMsICZyZWdfY29udCk7Ci0JcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIFBDKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgUEMpOwogCSpwdHIrKyA9ICc6JzsKIAlwdHIgPSBtZW0yaGV4KHB0ciwgKHVuc2lnbmVkIGNoYXIgKikmcmVnX2NvbnQsIHJlZ2lzdGVyX3NpemVbUENdKTsKIAkqcHRyKysgPSAnOyc7CiAKIAlyZWFkX3JlZ2lzdGVyKFI4LCAmcmVnX2NvbnQpOwotCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBSOCk7CisJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIFI4KTsKIAkqcHRyKysgPSAnOic7CiAJcHRyID0gbWVtMmhleChwdHIsICh1bnNpZ25lZCBjaGFyICopJnJlZ19jb250LCByZWdpc3Rlcl9zaXplW1I4XSk7CiAJKnB0cisrID0gJzsnOwogCiAJcmVhZF9yZWdpc3RlcihTUCwgJnJlZ19jb250KTsKLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgU1ApOworCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBTUCk7CiAJKnB0cisrID0gJzonOwogCXB0ciA9IG1lbTJoZXgocHRyLCAodW5zaWduZWQgY2hhciAqKSZyZWdfY29udCwgcmVnaXN0ZXJfc2l6ZVtTUF0pOwogCSpwdHIrKyA9ICc7JzsKIAogCS8qIFNlbmQgRVJQIGFzIHdlbGw7IHRoaXMgd2lsbCBzYXZlIHVzIGFuIGVudGlyZSByZWdpc3RlciBmZXRjaCBpbiBzb21lIGNhc2VzLiAqLwogICAgICAgICByZWFkX3JlZ2lzdGVyKEVSUCwgJnJlZ19jb250KTsKLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgRVJQKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgRVJQKTsKICAgICAgICAgKnB0cisrID0gJzonOwogICAgICAgICBwdHIgPSBtZW0yaGV4KHB0ciwgKHVuc2lnbmVkIGNoYXIgKikmcmVnX2NvbnQsIHJlZ2lzdGVyX3NpemVbRVJQXSk7CiAgICAgICAgICpwdHIrKyA9ICc7JzsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCAxYTRhNjE5Li5lMjY5MjY0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC02NCw2ICs2NCw5IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggYTZiMjY4OC4uY2U4MGZkYSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTYyLDUgKzYyLDggQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICA0MAogCisjZGVmaW5lIFNPX1dJRklfU1RBVFVTCQk0MQorI2RlZmluZSBTQ01fV0lGSV9TVEFUVVMJCVNPX1dJRklfU1RBVFVTCisKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jIGIvYXJjaC9mcnYva2VybmVsL2dkYi1zdHViLmMKaW5kZXggYTRkYmE2Yi4uYTZkNTM4MSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL2dkYi1zdHViLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL2dkYi1zdHViLmMKQEAgLTY3Miw3ICs2NzIsNyBAQAogCWlmICgodWludDMyX3QpbWVtJjEgJiYgY291bnQ+PTEpIHsKIAkJaWYgKCFnZGJzdHViX3JlYWRfYnl0ZShtZW0sY2gpKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFswXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFswXSk7CiAJCW1lbSsrOwogCQljb3VudC0tOwogCX0KQEAgLTY4MCw4ICs2ODAsOCBAQAogCWlmICgodWludDMyX3QpbWVtJjMgJiYgY291bnQ+PTIpIHsKIAkJaWYgKCFnZGJzdHViX3JlYWRfd29yZChtZW0sKHVpbnQxNl90ICopY2gpKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFswXSk7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFsxXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFswXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFsxXSk7CiAJCW1lbSArPSAyOwogCQljb3VudCAtPSAyOwogCX0KQEAgLTY4OSwxMCArNjg5LDEwIEBACiAJd2hpbGUgKGNvdW50Pj00KSB7CiAJCWlmICghZ2Ric3R1Yl9yZWFkX2R3b3JkKG1lbSwodWludDMyX3QgKiljaCkpCiAJCQlyZXR1cm4gTlVMTDsKLQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsIGNoWzBdKTsKLQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsIGNoWzFdKTsKLQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsIGNoWzJdKTsKLQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsIGNoWzNdKTsKKwkJYnVmID0gaGV4X2J5dGVfcGFjayhidWYsIGNoWzBdKTsKKwkJYnVmID0gaGV4X2J5dGVfcGFjayhidWYsIGNoWzFdKTsKKwkJYnVmID0gaGV4X2J5dGVfcGFjayhidWYsIGNoWzJdKTsKKwkJYnVmID0gaGV4X2J5dGVfcGFjayhidWYsIGNoWzNdKTsKIAkJbWVtICs9IDQ7CiAJCWNvdW50IC09IDQ7CiAJfQpAQCAtNzAwLDggKzcwMCw4IEBACiAJaWYgKGNvdW50Pj0yKSB7CiAJCWlmICghZ2Ric3R1Yl9yZWFkX3dvcmQobWVtLCh1aW50MTZfdCAqKWNoKSkKIAkJCXJldHVybiBOVUxMOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMF0pOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMV0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMF0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMV0pOwogCQltZW0gKz0gMjsKIAkJY291bnQgLT0gMjsKIAl9CkBAIC03MDksNyArNzA5LDcgQEAKIAlpZiAoY291bnQ+PTEpIHsKIAkJaWYgKCFnZGJzdHViX3JlYWRfYnl0ZShtZW0sY2gpKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFswXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFswXSk7CiAJfQogCiAJKmJ1ZiA9IDA7CkBAIC0xNDk4LDIxICsxNDk4LDIxIEBACiAJCXB0ciA9IG1lbTJoZXgodGl0bGUsIHB0ciwgc2l6ZW9mKHRpdGxlKSAtIDEsMCk7CiAKIAkJaHggPSBoZXhfYXNjX2hpKGJyciA+PiAyNCk7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19sbyhicnIgPj4gMjQpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfaGkoYnJyID4+IDE2KTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2xvKGJyciA+PiAxNik7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19oaShicnIgPj4gOCk7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19sbyhicnIgPj4gOCk7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19oaShicnIpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfbG8oYnJyKTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAogCQlwdHIgPSBtZW0yaGV4KGNybGYsIHB0ciwgc2l6ZW9mKGNybGYpIC0gMSwgMCk7CiAJCSpwdHIgPSAwOwpAQCAtMTUyNiwxMCArMTUyNiwxMCBAQAogCiAJLyogU2VuZCB0cmFwIHR5cGUgKGNvbnZlcnRlZCB0byBzaWduYWwpICovCiAJKnB0cisrID0gJ1QnOwotCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBzaWd2YWwpOworCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBzaWd2YWwpOwogCiAJLyogU2VuZCBFcnJvciBQQyAqLwotCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBHREJfUkVHX1BDKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgR0RCX1JFR19QQyk7CiAJKnB0cisrID0gJzonOwogCXB0ciA9IG1lbTJoZXgoJl9fZGVidWdfZnJhbWUtPnBjLCBwdHIsIDQsIDApOwogCSpwdHIrKyA9ICc7JzsKQEAgLTE1MzcsNyArMTUzNyw3IEBACiAJLyoKIAkgKiBTZW5kIGZyYW1lIHBvaW50ZXIKIAkgKi8KLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgR0RCX1JFR19GUCk7CisJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIEdEQl9SRUdfRlApOwogCSpwdHIrKyA9ICc6JzsKIAlwdHIgPSBtZW0yaGV4KCZfX2RlYnVnX2ZyYW1lLT5mcCwgcHRyLCA0LCAwKTsKIAkqcHRyKysgPSAnOyc7CkBAIC0xNTQ1LDcgKzE1NDUsNyBAQAogCS8qCiAJICogU2VuZCBzdGFjayBwb2ludGVyCiAJICovCi0JcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIEdEQl9SRUdfU1ApOworCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBHREJfUkVHX1NQKTsKIAkqcHRyKysgPSAnOic7CiAJcHRyID0gbWVtMmhleCgmX19kZWJ1Z19mcmFtZS0+c3AsIHB0ciwgNCwgMCk7CiAJKnB0cisrID0gJzsnOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9ncGlvLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2dwaW8taW50ZXJuYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9ncGlvLmgKcmVuYW1lIHRvIGFyY2gvaDgzMDAvaW5jbHVkZS9hc20vZ3Bpby1pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCAwNGMwZjQ1Li5jZjFkYWFiIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTYyLDQgKzYyLDcgQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICA0MAogCisjZGVmaW5lIFNPX1dJRklfU1RBVFVTCQk0MQorI2RlZmluZSBTQ01fV0lGSV9TVEFUVVMJCVNPX1dJRklfU1RBVFVTCisKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9pcnEuYyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2lycS5jCmluZGV4IGU5NzczNDUuLmJjNGY1MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2lycS5jCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2lycS5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8taW50ZXJuYWwuaD4KICNpbmNsdWRlIDxhc20vcmVnczMwNnguaD4KIAogY29uc3QgaW50IF9faW5pdGRhdGEgaDgzMDBfc2F2ZWRfdmVjdG9yc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvaXJxLmMgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9pcnEuYwppbmRleCA4MTgyZjA0Li43YjVmMjlmIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9pcnEuYworKysgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9pcnEuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLWludGVybmFsLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ3MyNjd4Lmg+CiAKIC8qIHNhdmVkIHZlY3RvciBsaXN0ICovCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vS2NvbmZpZyBiL2FyY2gvaGV4YWdvbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNTEzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vS2NvbmZpZwpAQCAtMCwwICsxLDIyMCBAQAorIyBIZXhhZ29uIGNvbmZpZ3VyYXRpb24KK2NvbW1lbnQgIkxpbnV4IEtlcm5lbCBDb25maWd1cmF0aW9uIGZvciBIZXhhZ29uIgorCitjb25maWcgSEVYQUdPTgorCWRlZl9ib29sIHkKKwlzZWxlY3QgSEFWRV9PUFJPRklMRQorCXNlbGVjdCBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpZiBTTVAKKwkjIE90aGVyIHBlbmRpbmcgcHJvamVjdHMvdG8tZG8gaXRlbXMuCisJIyBzZWxlY3QgSEFWRV9SRUdTX0FORF9TVEFDS19BQ0NFU1NfQVBJCisJIyBzZWxlY3QgSEFWRV9IV19CUkVBS1BPSU5UIGlmIFBFUkZfRVZFTlRTCisJIyBzZWxlY3QgQVJDSF9IQVNfQ1BVX0lETEVfV0FJVAorCSMgc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCisJIyBzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwkjIHNlbGVjdCBIQVZFX0NMSworCSMgc2VsZWN0IElSUV9QRVJfQ1BVCisJc2VsZWN0IEhBVkVfSVJRX1dPUksKKwkjIHNlbGVjdCBHRU5FUklDX1BFTkRJTkdfSVJRIGlmIFNNUAorCXNlbGVjdCBHRU5FUklDX0FUT01JQzY0CisJc2VsZWN0IEhBVkVfUEVSRl9FVkVOVFMKKwlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCisJc2VsZWN0IEdFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUQorCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX0RFUFJFQ0FURUQKKwkjIEdFTkVSSUNfQUxMT0NBVE9SIGlzIHVzZWQgYnkgZG1hX2FsbG9jX2NvaGVyZW50KCkKKwlzZWxlY3QgR0VORVJJQ19BTExPQ0FUT1IKKwlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVworCXNlbGVjdCBIQVZFX0FSQ0hfS0dEQgorCXNlbGVjdCBIQVZFX0FSQ0hfVFJBQ0VIT09LCisJc2VsZWN0IE5PX0lPUE9SVAorCSMgbW9zdGx5IGdlbmVyaWMgcm91dGluZXMsIHdpdGggc29tZSBhY2NlbGVyYXRlZCBvbmVzCisJLS0taGVscC0tLQorCSAgUXVhbGNvbW0gSGV4YWdvbiBpcyBhIHByb2Nlc3NvciBhcmNoaXRlY3R1cmUgZGVzaWduZWQgZm9yIGhpZ2gKKwkgIHBlcmZvcm1hbmNlIGFuZCBsb3cgcG93ZXIgYWNyb3NzIGEgd2lkZSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucy4KKworY29uZmlnIEhFWEFHT05fQVJDSF9WMQorCWJvb2wKKworY29uZmlnIEhFWEFHT05fQVJDSF9WMgorCWJvb2wKKworY29uZmlnIEhFWEFHT05fQVJDSF9WMworCWJvb2wKKworY29uZmlnIEhFWEFHT05fQVJDSF9WNAorCWJvb2wKKworY29uZmlnIEZSQU1FX1BPSU5URVIKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBMT0NLREVQX1NVUFBPUlQKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBQQ0kKKwlkZWZfYm9vbCBuCisKK2NvbmZpZyBFQVJMWV9QUklOVEsKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBLVElNRV9TQ0FMQVIKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBNTVUKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBUUkFDRV9JUlFGTEFHU19TVVBQT1JUCisJZGVmX2Jvb2wgeQorCitjb25maWcgR0VORVJJQ19DU1VNCisJZGVmX2Jvb2wgeQorCisjCisjIFVzZSB0aGUgZ2VuZXJpYyBpbnRlcnJ1cHQgaGFuZGxpbmcgY29kZSBpbiBrZXJuZWwvaXJxLzoKKyMKK2NvbmZpZyBHRU5FUklDX0lSUV9QUk9CRQorCWRlZl9ib29sIHkKKworY29uZmlnIEdFTkVSSUNfSU9NQVAKKwlkZWZfYm9vbCB5CisKKyNjb25maWcgWk9ORV9ETUEKKyMJYm9vbAorIwlkZWZhdWx0IHkKKworY29uZmlnIEhBU19ETUEKKwlib29sCisJc2VsZWN0IEhBVkVfRE1BX0FUVFJTCisJZGVmYXVsdCB5CisKK2NvbmZpZyBORUVEX1NHX0RNQV9MRU5HVEgKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBSV1NFTV9HRU5FUklDX1NQSU5MT0NLCisJZGVmX2Jvb2wgbgorCitjb25maWcgUldTRU1fWENIR0FERF9BTEdPUklUSE0KKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX0ZJTkRfTkVYVF9CSVQKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX0hXRUlHSFQKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX1RJTUUKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTCisJZGVmX2Jvb2wgeQorCitjb25maWcgR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBTVEFDS1RSQUNFX1NVUFBPUlQKKwlkZWZfYm9vbCB5CisJc2VsZWN0IFNUQUNLVFJBQ0UKKworY29uZmlnIEdFTkVSSUNfQlVHCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gQlVHCisKK2NvbmZpZyBCVUcKKwlkZWZfYm9vbCB5CisKK21lbnUgIk1hY2hpbmUgc2VsZWN0aW9uIgorCitjaG9pY2UKKwlwcm9tcHQgIlN5c3RlbSB0eXBlIgorCWRlZmF1bHQgSEVYQUdPTl9BUkNIX1YyCisKK2NvbmZpZyBIRVhBR09OX0NPTUVUCisJYm9vbCAiQ29tZXQgQm9hcmQiCisJc2VsZWN0IEhFWEFHT05fQVJDSF9WMgorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHRoZSBDb21ldCBwbGF0Zm9ybS4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBIRVhBR09OX1ZNCisJZGVmX2Jvb2wgeQorCitjb25maWcgQ01ETElORQorCXN0cmluZyAiRGVmYXVsdCBrZXJuZWwgY29tbWFuZCBzdHJpbmciCisJZGVmYXVsdCAiIgorCWhlbHAKKwkgIE9uIHNvbWUgcGxhdGZvcm1zLCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IGZvciB0aGUgYm9vdCBsb2FkZXIKKwkgIHRvIHBhc3MgYXJndW1lbnRzIHRvIHRoZSBrZXJuZWwuIEZvciB0aGVzZSwgeW91IHNob3VsZCBzdXBwbHkgc29tZQorCSAgY29tbWFuZC1saW5lIG9wdGlvbnMgYXQgYnVpbGQgdGltZSBieSBlbnRlcmluZyB0aGVtIGhlcmUuICBBdCBhCisJICBtaW5pbXVtLCB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhlIG1lbW9yeSBzaXplIGFuZCB0aGUgcm9vdCBkZXZpY2UKKwkgIChlLmcuLCBtZW09NjRNIHJvb3Q9L2Rldi9uZnMpLgorCitjb25maWcgSEVYQUdPTl9BTkdFTF9UUkFQUworCWJvb2wgIlVzZSBBbmdlbCBUcmFwcyIKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgYW5nZWwgZGVidWcgdHJhcHMgKGZvciBwcmludGsncykuCisKK2NvbmZpZyBTTVAKKwlib29sICJNdWx0aS1Qcm9jZXNzaW5nIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgRW5hYmxlcyBTTVAgc3VwcG9ydCBpbiB0aGUga2VybmVsLiAgSWYgdW5zdXJlLCBzYXkgIlkiCisKK2NvbmZpZyBOUl9DUFVTCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBDUFVzIiBpZiBTTVAKKwlyYW5nZSAyIDYgaWYgU01QCisJZGVmYXVsdCAiMSIgaWYgIVNNUAorCWRlZmF1bHQgIjYiIGlmIFNNUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHdoaWNoIHRoaXMKKwkgIGtlcm5lbCB3aWxsIHN1cHBvcnQuICBUaGUgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgaXMgNiBhbmQgdGhlCisJICBtaW5pbXVtIHZhbHVlIHdoaWNoIG1ha2VzIHNlbnNlIGlzIDIuCisKKwkgIFRoaXMgaXMgcHVyZWx5IHRvIHNhdmUgbWVtb3J5IC0gZWFjaCBzdXBwb3J0ZWQgQ1BVIGFkZHMKKwkgIGFwcHJveGltYXRlbHkgZWlnaHQga2lsb2J5dGVzIHRvIHRoZSBrZXJuZWwgaW1hZ2UuCisKK2Nob2ljZQorCXByb21wdCAiS2VybmVsIHBhZ2Ugc2l6ZSIKKwlkZWZhdWx0IFBBR0VfU0laRV80S0IKKwktLS1oZWxwLS0tCisJICBDaGFuZ2VzIHRoZSBkZWZhdWx0IHBhZ2Ugc2l6ZTsgdXNlIHdpdGggY2F1dGlvbi4KKworY29uZmlnIFBBR0VfU0laRV80S0IKKwlib29sICI0S0IiCisKK2NvbmZpZyBQQUdFX1NJWkVfMTZLQgorCWJvb2wgIjE2S0IiCisKK2NvbmZpZyBQQUdFX1NJWkVfNjRLQgorCWJvb2wgIjY0S0IiCisKK2NvbmZpZyBQQUdFX1NJWkVfMjU2S0IKKwlib29sICIyNTZLQiIKKworZW5kY2hvaWNlCisKK3NvdXJjZSAibW0vS2NvbmZpZyIKKworc291cmNlICJrZXJuZWwvS2NvbmZpZy5oeiIKK3NvdXJjZSAia2VybmVsL3RpbWUvS2NvbmZpZyIKKworY29uZmlnIEdFTkVSSUNfR1BJTworCWJvb2wgIkdlbmVyaWMgR1BJTyBzdXBwb3J0IgorCWRlZmF1bHQgbgorCitlbmRtZW51CisKK3NvdXJjZSAiaW5pdC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL0tjb25maWciCitzb3VyY2UgImZzL0tjb25maWciCisKK21lbnUgIkV4ZWN1dGFibGUgRmlsZSBGb3JtYXRzIgorc291cmNlICJmcy9LY29uZmlnLmJpbmZtdCIKK2VuZG1lbnUKKworc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAic2VjdXJpdHkvS2NvbmZpZyIKK3NvdXJjZSAiY3J5cHRvL0tjb25maWciCitzb3VyY2UgImxpYi9LY29uZmlnIgorCittZW51ICJLZXJuZWwgaGFja2luZyIKK3NvdXJjZSAibGliL0tjb25maWcuZGVidWciCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vTWFrZWZpbGUgYi9hcmNoL2hleGFnb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0ZGU4NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9NYWtlZmlsZQpAQCAtMCwwICsxLDU4IEBACisjICBNYWtlZmlsZSBmb3IgdGhlIEhleGFnb24gYXJjaAorCitLQlVJTERfREVGQ09ORklHID0gY29tZXRfZGVmY29uZmlnCisKKyMgRG8gbm90IHVzZSBHUC1yZWxhdGl2ZSBqdW1wcworS0JVSUxEX0NGTEFHUyArPSAtRzAKK0xERkxBR1Nfdm1saW51eCArPSAtRzAKKworIyBEbyBub3QgdXNlIHNpbmdsZS1ieXRlIGVudW1zOyB0aGVzZSB3aWxsIG92ZXJmbG93LgorS0JVSUxEX0NGTEFHUyArPSAtZm5vLXNob3J0LWVudW1zCisKKyMgTW9kdWxlcyBtdXN0IHVzZSBlaXRoZXIgbG9uZy1jYWxscywgb3IgdXNlIHBpYy9wbHQuCisjIFVzZSBsb25nLWNhbGxzIGZvciBub3csIGl0J3MgZWFzaWVyLiAgQW5kIGZhc3Rlci4KKyMgQ0ZMQUdTX01PRFVMRSArPSAtZlBJQworIyBMREZMQUdTX01PRFVMRSArPSAtc2hhcmVkCitDRkxBR1NfTU9EVUxFICs9IC1tbG9uZy1jYWxscworCitjZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1YxKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjEpCitjZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1YyKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjIpCitjZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1YzKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjMpCitjZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1Y0KSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjQpCisKK2FmbGFncy0kKENPTkZJR19IRVhBR09OX0FSQ0hfVjEpICs9ICQoY2FsbCBjYy1vcHRpb24sLW12MSkKK2FmbGFncy0kKENPTkZJR19IRVhBR09OX0FSQ0hfVjIpICs9ICQoY2FsbCBjYy1vcHRpb24sLW12MikKK2FmbGFncy0kKENPTkZJR19IRVhBR09OX0FSQ0hfVjMpICs9ICQoY2FsbCBjYy1vcHRpb24sLW12MykKK2FmbGFncy0kKENPTkZJR19IRVhBR09OX0FSQ0hfVjQpICs9ICQoY2FsbCBjYy1vcHRpb24sLW12NCkKKworbGRmbGFncy0kKENPTkZJR19IRVhBR09OX0FSQ0hfVjEpICs9ICQoY2FsbCBjYy1vcHRpb24sLW12MSkKK2xkZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1YyKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjIpCitsZGZsYWdzLSQoQ09ORklHX0hFWEFHT05fQVJDSF9WMykgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXYzKQorbGRmbGFncy0kKENPTkZJR19IRVhBR09OX0FSQ0hfVjQpICs9ICQoY2FsbCBjYy1vcHRpb24sLW12NCkKKworS0JVSUxEX0NGTEFHUyArPSAkKGNmbGFncy15KQorS0JVSUxEX0FGTEFHUyArPSAkKGFmbGFncy15KQorCisjICBubyBLQlVJTERfTERGTEFHUz8KK0xERkxBR1MgKz0gJChsZGZsYWdzLXkpCisKKyMgVGhyZWFkLWluZm8gcmVnaXN0ZXIgd2lsbCBiZSByMTkuICBUaGlzIHZhbHVlIGlzIG5vdCBjb25maWd1cmVhYmxlOworIyBpdCBpcyBoYXJkLWNvZGVkIGluIHNldmVyYWwgZmlsZXMuCitUSVJfTkFNRSA6PSByMTkKK0tCVUlMRF9DRkxBR1MgKz0gLWZmaXhlZC0kKFRJUl9OQU1FKSAtRFRIUkVBRElORk9fUkVHPSQoVElSX05BTUUpIC1EX19saW51eF9fCitLQlVJTERfQUZMQUdTICs9IC1EVEhSRUFESU5GT19SRUc9JChUSVJfTkFNRSkKKworTElCR0NDIDo9ICQoc2hlbGwgJChDQykgJChLQlVJTERfQ0ZMQUdTKSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSkKK2xpYnMteSArPSAkKExJQkdDQykKKworaGVhZC15IDo9IGFyY2gvaGV4YWdvbi9rZXJuZWwvaGVhZC5vIFwKKwlhcmNoL2hleGFnb24va2VybmVsL2luaXRfdGFzay5vCisKK2NvcmUteSArPSBhcmNoL2hleGFnb24va2VybmVsLyBcCisJYXJjaC9oZXhhZ29uL21tLyBcCisJYXJjaC9oZXhhZ29uL2xpYi8KKworIwlhcmNoL2hleGFnb24vcGxhdGZvcm0vY29tbW9uLworIworI2NvcmUtJChDT05GSUdfSEVYQUdPTl9DT01FVCkJCSs9IGFyY2gvaGV4YWdvbi9wbGF0Zm9ybS9jb21ldC8KKyNtYWNoaW5lLSQoQ09ORklHX0hFWEFHT05fQ09NRVQpCQk6PSBjb21ldApkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2NvbmZpZ3MvY29tZXRfZGVmY29uZmlnIGIvYXJjaC9oZXhhZ29uL2NvbmZpZ3MvY29tZXRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjRmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vY29uZmlncy9jb21ldF9kZWZjb25maWcKQEAgLTAsMCArMSw4NSBAQAorQ09ORklHX1NNUD15CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19IWl8xMDA9eQorQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ1JPU1NfQ09NUElMRT0iaGV4YWdvbi0iCitDT05GSUdfTE9DQUxWRVJTSU9OPSItc21wIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CitDT05GSUdfVEFTS1NUQVRTPXkKK0NPTkZJR19UQVNLX0RFTEFZX0FDQ1Q9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE4CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKK0NPTkZJR19DT05ORUNUT1I9eQorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9OQkQ9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX01JST15CitDT05GSUdfUEhZTElCPXkKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTY0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfREVCVUc9eQorQ09ORklHX1NQSV9CSVRCQU5HPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUMl9GU19TRUNVUklUWT15CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19RVU9UQT15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15CisjIENPTkZJR19NSVNDX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CitDT05GSUdfTkZTX1YzX0FDTD15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX0NDSVRUPXkKK0NPTkZJR19DUkMxNj15CitDT05GSUdfQ1JDX1QxMERJRj15CitDT05GSUdfTElCQ1JDMzJDPXkKK0NPTkZJR19GUkFNRV9XQVJOPTAKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhMTdmMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTAsMCArMSw1OCBAQAoraW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KKworaGVhZGVyLXkgKz0gcmVnaXN0ZXJzLmgKK2hlYWRlci15ICs9IHVjb250ZXh0LmgKK2hlYWRlci15ICs9IHVzZXIuaAorCitnZW5lcmljLXkgKz0gYXV4dmVjLmgKK2dlbmVyaWMteSArPSBidWcuaAorZ2VuZXJpYy15ICs9IGJ1Z3MuaAorZ2VuZXJpYy15ICs9IGNwdW1hc2suaAorZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAorZ2VuZXJpYy15ICs9IGN1cnJlbnQuaAorZ2VuZXJpYy15ICs9IGRldmljZS5oCitnZW5lcmljLXkgKz0gZGl2NjQuaAorZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKK2dlbmVyaWMteSArPSBlcnJuby5oCitnZW5lcmljLXkgKz0gZmIuaAorZ2VuZXJpYy15ICs9IGZjbnRsLmgKK2dlbmVyaWMteSArPSBmdHJhY2UuaAorZ2VuZXJpYy15ICs9IGhhcmRpcnEuaAorZ2VuZXJpYy15ICs9IGh3X2lycS5oCitnZW5lcmljLXkgKz0gaW9jdGwuaAorZ2VuZXJpYy15ICs9IGlvY3Rscy5oCitnZW5lcmljLXkgKz0gaW9tYXAuaAorZ2VuZXJpYy15ICs9IGlwY2J1Zi5oCitnZW5lcmljLXkgKz0gaXBjLmgKK2dlbmVyaWMteSArPSBpcnFfcmVncy5oCitnZW5lcmljLXkgKz0ga2RlYnVnLmgKK2dlbmVyaWMteSArPSBrbWFwX3R5cGVzLmgKK2dlbmVyaWMteSArPSBsb2NhbDY0LmgKK2dlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IG1tYW4uaAorZ2VuZXJpYy15ICs9IG1zZ2J1Zi5oCitnZW5lcmljLXkgKz0gcGNpLmgKK2dlbmVyaWMteSArPSBwZXJjcHUuaAorZ2VuZXJpYy15ICs9IHBvbGwuaAorZ2VuZXJpYy15ICs9IHBvc2l4X3R5cGVzLmgKK2dlbmVyaWMteSArPSByZXNvdXJjZS5oCitnZW5lcmljLXkgKz0gcndzZW0uaAorZ2VuZXJpYy15ICs9IHNjYXR0ZXJsaXN0LmgKK2dlbmVyaWMteSArPSBzZWN0aW9ucy5oCitnZW5lcmljLXkgKz0gc2VnbWVudC5oCitnZW5lcmljLXkgKz0gc2VtYnVmLmgKK2dlbmVyaWMteSArPSBzaG1idWYuaAorZ2VuZXJpYy15ICs9IHNobXBhcmFtLmgKK2dlbmVyaWMteSArPSBzaWdpbmZvLmgKK2dlbmVyaWMteSArPSBzb2NrZXQuaAorZ2VuZXJpYy15ICs9IHNvY2tpb3MuaAorZ2VuZXJpYy15ICs9IHN0YXRmcy5oCitnZW5lcmljLXkgKz0gc3RhdC5oCitnZW5lcmljLXkgKz0gdGVybWJpdHMuaAorZ2VuZXJpYy15ICs9IHRlcm1pb3MuaAorZ2VuZXJpYy15ICs9IHRvcG9sb2d5LmgKK2dlbmVyaWMteSArPSB0eXBlcy5oCitnZW5lcmljLXkgKz0gdWNvbnRleHQuaAorZ2VuZXJpYy15ICs9IHVuYWxpZ25lZC5oCitnZW5lcmljLXkgKz0geG9yLmgKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9hc20tb2Zmc2V0cy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2FzbS1vZmZzZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3MGVlMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9hc20tb2Zmc2V0cy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxnZW5lcmF0ZWQvYXNtLW9mZnNldHMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9hdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIwZjkwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQXRvbWljIG9wZXJhdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fQVRPTUlDX0gKKyNkZWZpbmUgX0FTTV9BVE9NSUNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJeyAoaSkgfQorI2RlZmluZSBhdG9taWNfc2V0KHYsIGkpCSgodiktPmNvdW50ZXIgPSAoaSkpCisKKy8qKgorICogYXRvbWljX3JlYWQgLSByZWFkcyBhIHdvcmQsIGF0b21pY2FsbHkKKyAqIEB2OiBwb2ludGVyIHRvIGF0b21pYyB2YWx1ZQorICoKKyAqIEFzc3VtZXMgYWxsIHdvcmQgcmVhZHMgb24gb3VyIGFyY2hpdGVjdHVyZSBhcmUgYXRvbWljLgorICovCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQorCisvKioKKyAqIGF0b21pY194Y2hnIC0gYXRvbWljCisgKiBAdjogcG9pbnRlciB0byBtZW1vcnkgdG8gY2hhbmdlCisgKiBAbmV3OiBuZXcgdmFsdWUgKHRlY2huaWNhbGx5IHBhc3NlZCBpbiBhIHJlZ2lzdGVyIC0tIHNlZSB4Y2hnKQorICovCisjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykJKHhjaGcoJigodiktPmNvdW50ZXIpLCAobmV3KSkpCisKKworLyoqCisgKiBhdG9taWNfY21weGNoZyAtIGF0b21pYyBjb21wYXJlLWFuZC1leGNoYW5nZSB2YWx1ZXMKKyAqIEB2OiBwb2ludGVyIHRvIHZhbHVlIHRvIGNoYW5nZQorICogQG9sZDogIGRlc2lyZWQgb2xkIHZhbHVlIHRvIG1hdGNoCisgKiBAbmV3OiAgbmV3IHZhbHVlIHRvIHB1dCBpbgorICoKKyAqIFBhcmFtZXRlcnMgYXJlIHRoZW4gcG9pbnRlciwgdmFsdWUtaW4tcmVnaXN0ZXIsIHZhbHVlLWluLXJlZ2lzdGVyLAorICogYW5kIHRoZSBvdXRwdXQgaXMgdGhlIG9sZCB2YWx1ZS4KKyAqCisgKiBBcHBhcmVudGx5IHRoaXMgaXMgY29tcGxpY2F0ZWQgZm9yIGFyY2hzIHRoYXQgZG9uJ3Qgc3VwcG9ydAorICogdGhlIG1lbXdfbG9ja2VkIGxpa2Ugd2UgZG8gKG9yIGl0J3MgYnJva2VuIG9yIHdoYXRldmVyKS4KKyAqCisgKiBLaW5kIG9mIHRoZSBseW5jaHBpbiBvZiB0aGUgcmVzdCBvZiB0aGUgZ2VuZXJpY2FsbHkgZGVmaW5lZCByb3V0aW5lcy4KKyAqIFJlbWVtYmVyIFYyIGhhZCB0aGF0IGJ1ZyB3aXRoIGRvdG5ldyBwcmVkaWNhdGUgc2V0IGJ5IG1lbXdfbG9ja2VkLgorICoKKyAqICJvbGQiIGlzICJleHBlY3RlZCIgb2xkIHZhbCwgX19vbGR2YWwgaXMgYWN0dWFsIG9sZCB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfY21weGNoZyhhdG9taWNfdCAqdiwgaW50IG9sZCwgaW50IG5ldykKK3sKKwlpbnQgX19vbGR2YWw7CisKKwlhc20gdm9sYXRpbGUoCisJCSIxOgklMCA9IG1lbXdfbG9ja2VkKCUxKTtcbiIKKwkJIgl7IFAwID0gY21wLmVxKCUwLCUyKTtcbiIKKwkJIgkgIGlmICghUDAubmV3KSBqdW1wOm50IDJmOyB9XG4iCisJCSIJbWVtd19sb2NrZWQoJTEsUDApID0gJTM7XG4iCisJCSIJaWYgKCFQMCkganVtcCAxYjtcbiIKKwkJIjI6XG4iCisJCTogIj0mciIgKF9fb2xkdmFsKQorCQk6ICJyIiAoJnYtPmNvdW50ZXIpLCAiciIgKG9sZCksICJyIiAobmV3KQorCQk6ICJtZW1vcnkiLCAicDAiCisJKTsKKworCXJldHVybiBfX29sZHZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIGF0b21pY190ICp2KQoreworCWludCBvdXRwdXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIxOgklMCA9IG1lbXdfbG9ja2VkKCUxKTtcbiIKKwkJIgklMCA9IGFkZCglMCwlMik7XG4iCisJCSIJbWVtd19sb2NrZWQoJTEsUDMpPSUwO1xuIgorCQkiCWlmICFQMyBqdW1wIDFiO1xuIgorCQk6ICI9JnIiIChvdXRwdXQpCisJCTogInIiICgmdi0+Y291bnRlciksICJyIiAoaSkKKwkJOiAibWVtb3J5IiwgInAzIgorCSk7CisJcmV0dXJuIG91dHB1dDsKKworfQorCisjZGVmaW5lIGF0b21pY19hZGQoaSwgdikgYXRvbWljX2FkZF9yZXR1cm4oaSwgKHYpKQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJaW50IG91dHB1dDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIxOgklMCA9IG1lbXdfbG9ja2VkKCUxKTtcbiIKKwkJIgklMCA9IHN1YiglMCwlMik7XG4iCisJCSIJbWVtd19sb2NrZWQoJTEsUDMpPSUwXG4iCisJCSIJaWYgIVAzIGp1bXAgMWI7XG4iCisJCTogIj0mciIgKG91dHB1dCkKKwkJOiAiciIgKCZ2LT5jb3VudGVyKSwgInIiIChpKQorCQk6ICJtZW1vcnkiLCAicDMiCisJKTsKKwlyZXR1cm4gb3V0cHV0OworfQorCisjZGVmaW5lIGF0b21pY19zdWIoaSwgdikgYXRvbWljX3N1Yl9yZXR1cm4oaSwgKHYpKQorCisvKioKKyAqIGF0b21pY19hZGRfdW5sZXNzIC0gYWRkIHVubGVzcyB0aGUgbnVtYmVyIGlzIGEgZ2l2ZW4gdmFsdWUKKyAqIEB2OiBwb2ludGVyIHRvIHZhbHVlCisgKiBAYTogYW1vdW50IHRvIGFkZAorICogQHU6IHVubGVzcyB2YWx1ZSBpcyBlcXVhbCB0byB1CisgKgorICogUmV0dXJucyAxIGlmIHRoZSBhZGQgaGFwcGVuZWQsIDAgaWYgaXQgZGlkbid0LgorICovCitzdGF0aWMgaW5saW5lIGludCBfX2F0b21pY19hZGRfdW5sZXNzKGF0b21pY190ICp2LCBpbnQgYSwgaW50IHUpCit7CisJaW50IG91dHB1dCwgX19vbGR2YWw7CisJYXNtIHZvbGF0aWxlKAorCQkiMToJJTAgPSBtZW13X2xvY2tlZCglMik7IgorCQkiCXsiCisJCSIJCXAzID0gY21wLmVxKCUwLCAlNCk7IgorCQkiCQlpZiAocDMubmV3KSBqdW1wOm50IDJmOyIKKwkJIgkJJTAgPSBhZGQoJTAsICUzKTsiCisJCSIJCSUxID0gIzA7IgorCQkiCX0iCisJCSIJbWVtd19sb2NrZWQoJTIsIHAzKSA9ICUwOyIKKwkJIgl7IgorCQkiCQlpZiAhcDMganVtcCAxYjsiCisJCSIJCSUxID0gIzE7IgorCQkiCX0iCisJCSIyOiIKKwkJOiAiPSZyIiAoX19vbGR2YWwpLCAiPSZyIiAob3V0cHV0KQorCQk6ICJyIiAodiksICJyIiAoYSksICJyIiAodSkKKwkJOiAibWVtb3J5IiwgInAzIgorCSk7CisJcmV0dXJuIG91dHB1dDsKK30KKworI2RlZmluZSBhdG9taWNfaW5jX25vdF96ZXJvKHYpIGF0b21pY19hZGRfdW5sZXNzKCh2KSwgMSwgMCkKKworI2RlZmluZSBhdG9taWNfaW5jKHYpIGF0b21pY19hZGQoMSwgKHYpKQorI2RlZmluZSBhdG9taWNfZGVjKHYpIGF0b21pY19zdWIoMSwgKHYpKQorCisjZGVmaW5lIGF0b21pY19pbmNfYW5kX3Rlc3QodikgKGF0b21pY19hZGRfcmV0dXJuKDEsICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh2KSAoYXRvbWljX3N1Yl9yZXR1cm4oMSwgKHYpKSA9PSAwKQorI2RlZmluZSBhdG9taWNfc3ViX2FuZF90ZXN0KGksIHYpIChhdG9taWNfc3ViX3JldHVybihpLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19hZGRfbmVnYXRpdmUoaSwgdikgKGF0b21pY19hZGRfcmV0dXJuKGksICh2KSkgPCAwKQorCisKKyNkZWZpbmUgYXRvbWljX2luY19yZXR1cm4odikgKGF0b21pY19hZGRfcmV0dXJuKDEsIHYpKQorI2RlZmluZSBhdG9taWNfZGVjX3JldHVybih2KSAoYXRvbWljX3N1Yl9yZXR1cm4oMSwgdikpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2JpdG9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzQ2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBCaXQgb3BlcmF0aW9ucyBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9CSVRPUFNfSAorI2RlZmluZSBfQVNNX0JJVE9QU19ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorCisvKgorICogVGhlIG9mZnNldCBjYWxjdWxhdGlvbnMgZm9yIHRoZXNlIGFyZSBiYXNlZCBvbiBCSVRTX1BFUl9MT05HID09IDMyCisgKiAoaS5lLiBJIGdldCB0byBzaGlmdCBieSAjNS0yICgzMiBiaXRzIHBlciBsb25nLCA0IGJ5dGVzIHBlciBhY2Nlc3MpLAorICogbWFzayBieSAweDAwMDAwMDFGKQorICoKKyAqIFR5cGljYWxseSwgUjEwIGlzIGNsb2JiZXJlZCBmb3IgYWRkcmVzcywgUjExIGJpdCBuciwgYW5kIFIxMiBpcyB0ZW1wCisgKi8KKworLyoqCisgKiB0ZXN0X2FuZF9jbGVhcl9iaXQgLSBjbGVhciBhIGJpdCBhbmQgcmV0dXJuIGl0cyBvbGQgdmFsdWUKKyAqIEBucjogIGJpdCBudW1iZXIgdG8gY2xlYXIKKyAqIEBhZGRyOiAgcG9pbnRlciB0byBtZW1vcnkKKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3sKKwlpbnQgb2xkdmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCSIJe1IxMCA9ICUxOyBSMTEgPSBhc3IoJTIsIzUpOyB9XG4iCisJIgl7UjEwICs9IGFzbChSMTEsIzIpOyBSMTEgPSBhbmQoJTIsIzB4MWYpfVxuIgorCSIxOglSMTIgPSBtZW13X2xvY2tlZChSMTApO1xuIgorCSIJeyBQMCA9IHRzdGJpdChSMTIsUjExKTsgUjEyID0gY2xyYml0KFIxMixSMTEpOyB9XG4iCisJIgltZW13X2xvY2tlZChSMTAsUDEpID0gUjEyO1xuIgorCSIJe2lmICFQMSBqdW1wIDFiOyAlMCA9IG11eChQMCwjMSwjMCk7fVxuIgorCTogIj0mciIgKG9sZHZhbCkKKwk6ICJyIiAoYWRkciksICJyIiAobnIpCisJOiAicjEwIiwgInIxMSIsICJyMTIiLCAicDAiLCAicDEiLCAibWVtb3J5IgorCSk7CisKKwlyZXR1cm4gb2xkdmFsOworfQorCisvKioKKyAqIHRlc3RfYW5kX3NldF9iaXQgLSBzZXQgYSBiaXQgYW5kIHJldHVybiBpdHMgb2xkIHZhbHVlCisgKiBAbnI6ICBiaXQgbnVtYmVyIHRvIHNldAorICogQGFkZHI6ICBwb2ludGVyIHRvIG1lbW9yeQorICovCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3sKKwlpbnQgb2xkdmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCSIJe1IxMCA9ICUxOyBSMTEgPSBhc3IoJTIsIzUpOyB9XG4iCisJIgl7UjEwICs9IGFzbChSMTEsIzIpOyBSMTEgPSBhbmQoJTIsIzB4MWYpfVxuIgorCSIxOglSMTIgPSBtZW13X2xvY2tlZChSMTApO1xuIgorCSIJeyBQMCA9IHRzdGJpdChSMTIsUjExKTsgUjEyID0gc2V0Yml0KFIxMixSMTEpOyB9XG4iCisJIgltZW13X2xvY2tlZChSMTAsUDEpID0gUjEyO1xuIgorCSIJe2lmICFQMSBqdW1wIDFiOyAlMCA9IG11eChQMCwjMSwjMCk7fVxuIgorCTogIj0mciIgKG9sZHZhbCkKKwk6ICJyIiAoYWRkciksICJyIiAobnIpCisJOiAicjEwIiwgInIxMSIsICJyMTIiLCAicDAiLCAicDEiLCAibWVtb3J5IgorCSk7CisKKworCXJldHVybiBvbGR2YWw7CisKK30KKworLyoqCisgKiB0ZXN0X2FuZF9jaGFuZ2VfYml0IC0gdG9nZ2xlIGEgYml0IGFuZCByZXR1cm4gaXRzIG9sZCB2YWx1ZQorICogQG5yOiAgYml0IG51bWJlciB0byBzZXQKKyAqIEBhZGRyOiAgcG9pbnRlciB0byBtZW1vcnkKKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJaW50IG9sZHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkiCXtSMTAgPSAlMTsgUjExID0gYXNyKCUyLCM1KTsgfVxuIgorCSIJe1IxMCArPSBhc2woUjExLCMyKTsgUjExID0gYW5kKCUyLCMweDFmKX1cbiIKKwkiMToJUjEyID0gbWVtd19sb2NrZWQoUjEwKTtcbiIKKwkiCXsgUDAgPSB0c3RiaXQoUjEyLFIxMSk7IFIxMiA9IHRvZ2dsZWJpdChSMTIsUjExKTsgfVxuIgorCSIJbWVtd19sb2NrZWQoUjEwLFAxKSA9IFIxMjtcbiIKKwkiCXtpZiAhUDEganVtcCAxYjsgJTAgPSBtdXgoUDAsIzEsIzApO31cbiIKKwk6ICI9JnIiIChvbGR2YWwpCisJOiAiciIgKGFkZHIpLCAiciIgKG5yKQorCTogInIxMCIsICJyMTEiLCAicjEyIiwgInAwIiwgInAxIiwgIm1lbW9yeSIKKwkpOworCisJcmV0dXJuIG9sZHZhbDsKKworfQorCisvKgorICogQXRvbWljLCBidXQgZG9lc24ndCBjYXJlIGFib3V0IHRoZSByZXR1cm4gdmFsdWUuCisgKiBSZXdyaXRlIGxhdGVyIHRvIHNhdmUgYSBjeWNsZSBvciB0d28uCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJdGVzdF9hbmRfY2xlYXJfYml0KG5yLCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQoreworCXRlc3RfYW5kX3NldF9iaXQobnIsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJdGVzdF9hbmRfY2hhbmdlX2JpdChuciwgYWRkcik7Cit9CisKKworLyoKKyAqIFRoZXNlIGFyZSBhbGxvd2VkIHRvIGJlIG5vbi1hdG9taWMuICBJbiBmYWN0IHRoZSBnZW5lcmljIGZsYXZvcnMgYXJlCisgKiBpbiBub24tYXRvbWljLmguICBXb3VsZCBpdCBiZSBiZXR0ZXIgdG8gdXNlIGludHJpbnNpY3MgZm9yIHRoaXM/CisgKgorICogT0ssIHdyaXRlcyBpbiBvdXIgYXJjaGl0ZWN0dXJlIGRvIG5vdCBpbnZhbGlkYXRlIExML1NDLCBzbyB0aGlzIGhhcyB0bworICogYmUgYXRvbWljLCBwYXJ0aWN1bGFybHkgZm9yIHRoaW5ncyBsaWtlIHNsYWJfbG9jayBhbmQgc2xhYl91bmxvY2suCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXRlc3RfYW5kX2NsZWFyX2JpdChuciwgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXRlc3RfYW5kX3NldF9iaXQobnIsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl0ZXN0X2FuZF9jaGFuZ2VfYml0KG5yLCBhZGRyKTsKK30KKworLyogIEFwcGFyZW50bHksIGF0IGxlYXN0IHNvbWUgb2YgdGhlc2UgYXJlIGFsbG93ZWQgdG8gYmUgbm9uLWF0b21pYyAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KG5yLCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX190ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdChuciwgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJcmV0dXJuIHRlc3RfYW5kX2NoYW5nZV9iaXQobnIsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYml0KGludCBuciwgY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlpbnQgcmV0dmFsOworCisJYXNtIHZvbGF0aWxlKAorCSJ7UDAgPSB0c3RiaXQoJTEsJTIpOyBpZiAoUDAubmV3KSAlMCA9ICMxOyBpZiAoIVAwLm5ldykgJTAgPSAjMDt9XG4iCisJOiAiPSZyIiAocmV0dmFsKQorCTogInIiIChhZGRyW0JJVF9XT1JEKG5yKV0pLCAiciIgKG5yICUgQklUU19QRVJfTE9ORykKKwk6ICJwMCIKKwkpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSB0ZXN0X2JpdChuciwgYWRkcikgX190ZXN0X2JpdChuciwgYWRkcikKKworLyoKKyAqIGZmeiAtIGZpbmQgZmlyc3QgemVybyBpbiB3b3JkLgorICogQHdvcmQ6IFRoZSB3b3JkIHRvIHNlYXJjaAorICoKKyAqIFVuZGVmaW5lZCBpZiBubyB6ZXJvIGV4aXN0cywgc28gY29kZSBzaG91bGQgY2hlY2sgYWdhaW5zdCB+MFVMIGZpcnN0LgorICovCitzdGF0aWMgaW5saW5lIGxvbmcgZmZ6KGludCB4KQoreworCWludCByOworCisJYXNtKCIlMCA9IGN0MSglMSk7XG4iCisJCTogIj0mciIgKHIpCisJCTogInIiICh4KSk7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBmbHMgLSBmaW5kIGxhc3QgKG1vc3Qtc2lnbmlmaWNhbnQpIGJpdCBzZXQKKyAqIEB4OiB0aGUgd29yZCB0byBzZWFyY2gKKyAqCisgKiBUaGlzIGlzIGRlZmluZWQgdGhlIHNhbWUgd2F5IGFzIGZmcy4KKyAqIE5vdGUgZmxzKDApID0gMCwgZmxzKDEpID0gMSwgZmxzKDB4ODAwMDAwMDApID0gMzIuCisgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBmbHMoaW50IHgpCit7CisJaW50IHI7CisKKwlhc20oInsgJTAgPSBjbDAoJTEpO31cbiIKKwkJIiUwID0gc3ViKCMzMiwlMCk7XG4iCisJCTogIj0mciIgKHIpCisJCTogInIiICh4KQorCQk6ICJwMCIpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBmZnMgLSBmaW5kIGZpcnN0IGJpdCBzZXQKKyAqIEB4OiB0aGUgd29yZCB0byBzZWFyY2gKKyAqCisgKiBUaGlzIGlzIGRlZmluZWQgdGhlIHNhbWUgd2F5IGFzCisgKiB0aGUgbGliYyBhbmQgY29tcGlsZXIgYnVpbHRpbiBmZnMgcm91dGluZXMsIHRoZXJlZm9yZQorICogZGlmZmVycyBpbiBzcGlyaXQgZnJvbSB0aGUgYWJvdmUgZmZ6IChtYW4gZmZzKS4KKyAqLworc3RhdGljIGlubGluZSBsb25nIGZmcyhpbnQgeCkKK3sKKwlpbnQgcjsKKworCWFzbSgieyBQMCA9IGNtcC5lcSglMSwjMCk7ICUwID0gY3QwKCUxKTt9XG4iCisJCSJ7IGlmIFAwICUwID0gIzA7IGlmICFQMCAlMCA9IGFkZCglMCwjMSk7fVxuIgorCQk6ICI9JnIiIChyKQorCQk6ICJyIiAoeCkKKwkJOiAicDAiKTsKKworCXJldHVybiByOworfQorCisvKgorICogX19mZnMgLSBmaW5kIGZpcnN0IGJpdCBpbiB3b3JkLgorICogQHdvcmQ6IFRoZSB3b3JkIHRvIHNlYXJjaAorICoKKyAqIFVuZGVmaW5lZCBpZiBubyBiaXQgZXhpc3RzLCBzbyBjb2RlIHNob3VsZCBjaGVjayBhZ2FpbnN0IDAgZmlyc3QuCisgKgorICogYml0c19wZXJfbG9uZyBhc3N1bWVkIHRvIGJlIDMyCisgKiBudW1iZXJpbmcgc3RhcnRzIGF0IDAgSSB0aGluayAoaW5zdGVhZCBvZiAxIGxpa2UgZmZzKQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19mZnModW5zaWduZWQgbG9uZyB3b3JkKQoreworCWludCBudW07CisKKwlhc20oIiUwID0gY3QwKCUxKTtcbiIKKwkJOiAiPSZyIiAobnVtKQorCQk6ICJyIiAod29yZCkpOworCisJcmV0dXJuIG51bTsKK30KKworLyoKKyAqIF9fZmxzIC0gZmluZCBsYXN0IChtb3N0LXNpZ25pZmljYW50KSBzZXQgYml0IGluIGEgbG9uZyB3b3JkCisgKiBAd29yZDogdGhlIHdvcmQgdG8gc2VhcmNoCisgKgorICogVW5kZWZpbmVkIGlmIG5vIHNldCBiaXQgZXhpc3RzLCBzbyBjb2RlIHNob3VsZCBjaGVjayBhZ2FpbnN0IDAgZmlyc3QuCisgKiBiaXRzX3Blcl9sb25nIGFzc3VtZWQgdG8gYmUgMzIKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZmxzKHVuc2lnbmVkIGxvbmcgd29yZCkKK3sKKwlpbnQgbnVtOworCisJYXNtKCIlMCA9IGNsMCglMSk7XG4iCisJCSIlMCA9IHN1YigjMzEsJTApO1xuIgorCQk6ICI9JnIiIChudW0pCisJCTogInIiICh3b3JkKSk7CisKKwlyZXR1cm4gbnVtOworfQorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2xvY2suaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmluZC5oPgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZsczY0Lmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2h3ZWlnaHQuaD4KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9sZS5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9leHQyLWF0b21pYy5oPgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYml0c3BlcmxvbmcuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9iaXRzcGVybG9uZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDFjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYml0c3BlcmxvbmcuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0FTTV9IRVhBR09OX0JJVFNQRVJMT05HX0gKKyNkZWZpbmUgX19BU01fSEVYQUdPTl9CSVRTUEVSTE9OR19ICisKKyNkZWZpbmUgX19CSVRTX1BFUl9MT05HIDMyCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRzcGVybG9uZy5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTE5YjlmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fQllURU9SREVSX0gKKyNkZWZpbmUgX0FTTV9CWVRFT1JERVJfSAorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CisKKyNlbmRpZiAvKiBfQVNNX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vY2FjaGUuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDFkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vY2FjaGUuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ2FjaGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19BU01fQ0FDSEVfSAorI2RlZmluZSBfX0FTTV9DQUNIRV9ICisKKy8qIEJ5dGVzIHBlciBMMSBjYWNoZSBsaW5lICovCisjZGVmaW5lIEwxX0NBQ0hFX1NISUZUCQkoNSkKKyNkZWZpbmUgTDFfQ0FDSEVfQllURVMJCSgxIDw8IEwxX0NBQ0hFX1NISUZUKQorCisjZGVmaW5lIF9fY2FjaGVsaW5lX2FsaWduZWQJX19hbGlnbmVkKEwxX0NBQ0hFX0JZVEVTKQorI2RlZmluZSBfX19fY2FjaGVsaW5lX2FsaWduZWQJX19hbGlnbmVkKEwxX0NBQ0hFX0JZVEVTKQorCisvKiBTZWUgaHR0cDovL2tlcm5lbHRyYXAub3JnL25vZGUvMTUxMDAgICovCisjZGVmaW5lIF9fcmVhZF9tb3N0bHkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY1YzFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ2FjaGUgZmx1c2ggb3BlcmF0aW9ucyBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0NBQ0hFRkxVU0hfSAorI2RlZmluZSBfQVNNX0NBQ0hFRkxVU0hfSAorCisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jYWNoZWZsdXNoLmg+CisKKy8qIENhY2hlIGZsdXNoaW5nOgorICoKKyAqICAtIGZsdXNoX2NhY2hlX2FsbCgpIGZsdXNoZXMgZW50aXJlIGNhY2hlCisgKiAgLSBmbHVzaF9jYWNoZV9tbShtbSkgZmx1c2hlcyB0aGUgc3BlY2lmaWVkIG1tIGNvbnRleHQncyBjYWNoZSBsaW5lcworICogIC0gZmx1c2hfY2FjaGVfcGFnZShtbSwgdm1hZGRyLCBwZm4pIGZsdXNoZXMgYSBzaW5nbGUgcGFnZQorICogIC0gZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKSBmbHVzaGVzIGEgcmFuZ2Ugb2YgcGFnZXMKKyAqICAtIGZsdXNoX2ljYWNoZV9yYW5nZShzdGFydCwgZW5kKSBmbHVzaCBhIHJhbmdlIG9mIGluc3RydWN0aW9ucworICogIC0gZmx1c2hfZGNhY2hlX3BhZ2UocGcpIGZsdXNoZXMod2JhY2smaW52YWxpZGF0ZXMpIGEgcGFnZSBmb3IgZGNhY2hlCisgKiAgLSBmbHVzaF9pY2FjaGVfcGFnZSh2bWEsIHBnKSBmbHVzaGVzKGludmFsaWRhdGVzKSBhIHBhZ2UgZm9yIGljYWNoZQorICoKKyAqICBOZWVkIHRvIGRvdWJsZWNoZWNrIHdoaWNoIG9uZSBpcyByZWFsbHkgbmVlZGVkIGZvciBwdHJhY2Ugc3R1ZmYgdG8gd29yay4KKyAqLworI2RlZmluZSBMSU5FU0laRQkzMgorI2RlZmluZSBMSU5FQklUUwk1CisKKy8qCisgKiBGbHVzaCBEY2FjaGUgcmFuZ2UgdGhyb3VnaCBjdXJyZW50IG1hcC4KKyAqLworZXh0ZXJuIHZvaWQgZmx1c2hfZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKKworLyoKKyAqIEZsdXNoIEljYWNoZSByYW5nZSB0aHJvdWdoIGN1cnJlbnQgbWFwLgorICovCisjdW5kZWYgZmx1c2hfaWNhY2hlX3JhbmdlCitleHRlcm4gdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworCisvKgorICogTWVtb3J5LW1hbmFnZW1lbnQgcmVsYXRlZCBmbHVzaGVzIGFyZSB0aGVyZSB0byBlbnN1cmUgaW4gbm9uLXBoeXNpY2FsbHkKKyAqIGluZGV4ZWQgY2FjaGUgc2NoZW1lcyB0aGF0IHN0YWxlIGxpbmVzIGJlbG9uZ2luZyB0byBhIGdpdmVuIEFTSUQgYXJlbid0CisgKiBpbiB0aGUgY2FjaGUgdG8gY29uZnVzZSB0aGluZ3MuICBUaGUgcHJvdG90eXBlIEhleGFnb24gVmlydHVhbCBNYWNoaW5lCisgKiBvbmx5IHVzZXMgYSBzaW5nbGUgQVNJRCBmb3IgYWxsIHVzZXItbW9kZSBtYXBzLCB3aGljaCBzaG91bGQKKyAqIG1lYW4gdGhhdCB0aGV5IGFyZW4ndCBuZWNlc3NhcnkuICBBIGJydXRlLWZvcmNlLCBmbHVzaC1ldmVyeXRoaW5nCisgKiBpbXBsZW1lbnRhdGlvbiwgd2l0aCB0aGUgbmFtZSB4eHh4eF9oZXhhZ29uKCkgaXMgcHJlc2VudCBpbgorICogYXJjaC9oZXhhZ29uL21tL2NhY2hlLmMsIGJ1dCBsZXQncyBub3Qgd2lyZSBpdCB1cCB1bnRpbCB3ZSBrbm93CisgKiBpdCBpcyBuZWVkZWQuCisgKi8KK2V4dGVybiB2b2lkIGZsdXNoX2NhY2hlX2FsbF9oZXhhZ29uKHZvaWQpOworCisvKgorICogVGhpcyBtYXkgb3IgbWF5IG5vdCBldmVyIGhhdmUgdG8gYmUgbm9uLW51bGwsIGRlcGVuZGluZyBvbiB0aGUKKyAqIHZpcnR1YWwgbWFjaGluZSBNTVUuICBGb3IgYSBuYXRpdmUga2VybmVsLCBpdCdzIGRlZmluaXRpZWx5ICBhIG5vLW9wCisgKgorICogVGhpcyBpcyBhbHNvIHRoZSBwbGFjZSB3aGVyZSBkZWZlcnJlZCBjYWNoZSBjb2hlcmVuY3kgc3R1ZmYgc2VlbXMKKyAqIHRvIGhhcHBlbiwgY2xhc3NpY2FsbHkuLi4gIGJ1dCBpbnN0ZWFkIHdlIGRvIGl0IGxpa2UgaWE2NCBhbmQKKyAqIGNsZWFuIHRoZSBjYWNoZSB3aGVuIHRoZSBQVEUgaXMgc2V0LgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9tbXVfY2FjaGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXApCit7CisJLyogIGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhIGRvZXNuJ3Qgd2luZCB1cCBoZXJlLCBkb2VzIGl0PyAgKi8KK30KKworI3VuZGVmIGNvcHlfdG9fdXNlcl9wYWdlCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV90b191c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWRkciwKKwkJCQkJICAgICB2b2lkICpkc3QsIHZvaWQgKnNyYywgaW50IGxlbikKK3sKKwltZW1jcHkoZHN0LCBzcmMsIGxlbik7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSB7CisJCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgZHN0LAorCQkodW5zaWduZWQgbG9uZykgZHN0ICsgbGVuKTsKKwl9Cit9CisKKworZXh0ZXJuIHZvaWQgaGV4YWdvbl9pbnZfZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2V4dGVybiB2b2lkIGhleGFnb25fY2xlYW5fZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vY2hlY2tzdW0uaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTRlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vY2hlY2tzdW0uaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0NIRUNLU1VNX0gKKyNkZWZpbmUgX0FTTV9DSEVDS1NVTV9ICisKKyNkZWZpbmUgZG9fY3N1bQlkb19jc3VtCit1bnNpZ25lZCBpbnQgZG9fY3N1bShjb25zdCB2b2lkICp2b2lkcHRyLCBpbnQgbGVuKTsKKworLyoKKyAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdAorICogY2hlY2tzdW1zCisgKgorICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCisgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQorICovCisjZGVmaW5lIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjaworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0pOworCisvKgorICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKKyAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCisgKi8KKyNkZWZpbmUgY3N1bV90Y3B1ZHBfbm9mb2xkIGNzdW1fdGNwdWRwX25vZm9sZAorX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLAorCXVuc2lnbmVkIHNob3J0IGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pOworCisjZGVmaW5lIGNzdW1fdGNwdWRwX21hZ2ljIGNzdW1fdGNwdWRwX21hZ2ljCitfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsCisJdW5zaWduZWQgc2hvcnQgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSk7CisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jaGVja3N1bS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9kZWxheS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2RlbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiMTJlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9kZWxheS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fREVMQVlfSAorI2RlZmluZSBfQVNNX0RFTEFZX0gKKworI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorCitleHRlcm4gdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKKworI2RlZmluZSB1ZGVsYXkodXNlY3MpIF9fdWRlbGF5KCh1c2VjcykpCisKKyNlbmRpZiAvKiBfQVNNX0RFTEFZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4YjIyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogRE1BIG9wZXJhdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9ETUFfTUFQUElOR19ICisjZGVmaW5lIF9BU01fRE1BX01BUFBJTkdfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1kZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1hdHRycy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdHJ1Y3QgZGV2aWNlOworZXh0ZXJuIGludCBiYWRfZG1hX2FkZHJlc3M7CisKK2V4dGVybiBzdHJ1Y3QgZG1hX21hcF9vcHMgKmRtYV9vcHM7CisKKyNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQorI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKSBkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkbWFfbWFwX29wcyAqZ2V0X2RtYV9vcHMoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICh1bmxpa2VseShkZXYgPT0gTlVMTCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGRtYV9vcHM7Cit9CisKK2V4dGVybiBpbnQgZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKK2V4dGVybiBpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOworZXh0ZXJuIGludCBkbWFfaXNfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CitleHRlcm4gdm9pZCBkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1jb21tb24uaD4KKworc3RhdGljIGlubGluZSBib29sIGRtYV9jYXBhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoIWRldi0+ZG1hX21hc2spCisJCXJldHVybiAwOworCXJldHVybiBhZGRyICsgc2l6ZSAtIDEgPD0gKmRldi0+ZG1hX21hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlzdHJ1Y3QgZG1hX21hcF9vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJaWYgKGRtYV9vcHMtPm1hcHBpbmdfZXJyb3IpCisJCXJldHVybiBkbWFfb3BzLT5tYXBwaW5nX2Vycm9yKGRldiwgZG1hX2FkZHIpOworCisJcmV0dXJuIChkbWFfYWRkciA9PSBiYWRfZG1hX2FkZHJlc3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQoreworCXZvaWQgKnJldDsKKwlzdHJ1Y3QgZG1hX21hcF9vcHMgKm9wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlCVUdfT04oIWRtYV9vcHMpOworCisJcmV0ID0gb3BzLT5hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsIGZsYWcpOworCisJZGVidWdfZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgKmRtYV9oYW5kbGUsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCit7CisJc3RydWN0IGRtYV9tYXBfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighZG1hX29wcyk7CisKKwlkbWFfb3BzLT5mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworCisJZGVidWdfZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCBjcHVfYWRkciwgZG1hX2hhbmRsZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2RtYS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNmQyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZG1hLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9ETUFfSAorI2RlZmluZSBfQVNNX0RNQV9ICisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDEKKyNkZWZpbmUgTUFYX0RNQV9BRERSRVNTICAoUEFHRV9PRkZTRVQpCisKK2V4dGVybiBzaXplX3QgaGV4YWdvbl9jb2hlcmVudF9wb29sX3NpemU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2VsZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTc2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZWxmLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBFTEYgZGVmaW5pdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19BU01fRUxGX0gKKyNkZWZpbmUgX19BU01fRUxGX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdXNlci5oPgorCisvKgorICogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGluIGxpbnV4L2VsZi1lbS5oLgorICovCisjZGVmaW5lIEVNX0hFWEFHT04JMTY0ICAgLyogUVVBTENPTU0gSGV4YWdvbiAqLworCitzdHJ1Y3QgZWxmMzJfaGRyOworCisvKgorICogRUxGIGhlYWRlciBlX2ZsYWdzIGRlZmluZXMuCisgKi8KKworLyogIHNob3VsZCBoYXZlIHN0dWZmIGxpa2UgIkNQVSB0eXBlIiBhbmQgbWF5YmUgIkFCSSB2ZXJzaW9uIiwgZXRjICAqLworCisvKiBIZXhhZ29uIHJlbG9jYXRpb25zICovCisgIC8qIFYyICovCisjZGVmaW5lIFJfSEVYQUdPTl9OT05FICAgICAgICAgICAwCisjZGVmaW5lIFJfSEVYQUdPTl9CMjJfUENSRUwgICAgICAxCisjZGVmaW5lIFJfSEVYQUdPTl9CMTVfUENSRUwgICAgICAyCisjZGVmaW5lIFJfSEVYQUdPTl9CN19QQ1JFTCAgICAgICAzCisjZGVmaW5lIFJfSEVYQUdPTl9MTzE2ICAgICAgICAgICA0CisjZGVmaW5lIFJfSEVYQUdPTl9ISTE2ICAgICAgICAgICA1CisjZGVmaW5lIFJfSEVYQUdPTl8zMiAgICAgICAgICAgICA2CisjZGVmaW5lIFJfSEVYQUdPTl8xNiAgICAgICAgICAgICA3CisjZGVmaW5lIFJfSEVYQUdPTl84ICAgICAgICAgICAgICA4CisjZGVmaW5lIFJfSEVYQUdPTl9HUFJFTDE2XzAgICAgICA5CisjZGVmaW5lIFJfSEVYQUdPTl9HUFJFTDE2XzEgICAgIDEwCisjZGVmaW5lIFJfSEVYQUdPTl9HUFJFTDE2XzIgICAgIDExCisjZGVmaW5lIFJfSEVYQUdPTl9HUFJFTDE2XzMgICAgIDEyCisjZGVmaW5lIFJfSEVYQUdPTl9ITDE2ICAgICAgICAgIDEzCisgIC8qIFYzICovCisjZGVmaW5lIFJfSEVYQUdPTl9CMTNfUENSRUwgICAgIDE0CisgIC8qIFY0ICovCisjZGVmaW5lIFJfSEVYQUdPTl9COV9QQ1JFTCAgICAgIDE1CisgIC8qIFY0IChleHRlbmRlcnMpICovCisjZGVmaW5lIFJfSEVYQUdPTl9CMzJfUENSRUxfWCAgIDE2CisjZGVmaW5lIFJfSEVYQUdPTl8zMl82X1ggICAgICAgIDE3CisgIC8qIFY0IChleHRlbmRlZCkgKi8KKyNkZWZpbmUgUl9IRVhBR09OX0IyMl9QQ1JFTF9YICAgMTgKKyNkZWZpbmUgUl9IRVhBR09OX0IxNV9QQ1JFTF9YICAgMTkKKyNkZWZpbmUgUl9IRVhBR09OX0IxM19QQ1JFTF9YICAgMjAKKyNkZWZpbmUgUl9IRVhBR09OX0I5X1BDUkVMX1ggICAgMjEKKyNkZWZpbmUgUl9IRVhBR09OX0I3X1BDUkVMX1ggICAgMjIKKyNkZWZpbmUgUl9IRVhBR09OXzE2X1ggICAgICAgICAgMjMKKyNkZWZpbmUgUl9IRVhBR09OXzEyX1ggICAgICAgICAgMjQKKyNkZWZpbmUgUl9IRVhBR09OXzExX1ggICAgICAgICAgMjUKKyNkZWZpbmUgUl9IRVhBR09OXzEwX1ggICAgICAgICAgMjYKKyNkZWZpbmUgUl9IRVhBR09OXzlfWCAgICAgICAgICAgMjcKKyNkZWZpbmUgUl9IRVhBR09OXzhfWCAgICAgICAgICAgMjgKKyNkZWZpbmUgUl9IRVhBR09OXzdfWCAgICAgICAgICAgMjkKKyNkZWZpbmUgUl9IRVhBR09OXzZfWCAgICAgICAgICAgMzAKKyAgLyogVjIgUElDICovCisjZGVmaW5lIFJfSEVYQUdPTl8zMl9QQ1JFTCAgICAgIDMxCisjZGVmaW5lIFJfSEVYQUdPTl9DT1BZICAgICAgICAgIDMyCisjZGVmaW5lIFJfSEVYQUdPTl9HTE9CX0RBVCAgICAgIDMzCisjZGVmaW5lIFJfSEVYQUdPTl9KTVBfU0xPVCAgICAgIDM0CisjZGVmaW5lIFJfSEVYQUdPTl9SRUxBVElWRSAgICAgIDM1CisjZGVmaW5lIFJfSEVYQUdPTl9QTFRfQjIyX1BDUkVMIDM2CisjZGVmaW5lIFJfSEVYQUdPTl9HT1RPRkZfTE8xNiAgIDM3CisjZGVmaW5lIFJfSEVYQUdPTl9HT1RPRkZfSEkxNiAgIDM4CisjZGVmaW5lIFJfSEVYQUdPTl9HT1RPRkZfMzIgICAgIDM5CisjZGVmaW5lIFJfSEVYQUdPTl9HT1RfTE8xNiAgICAgIDQwCisjZGVmaW5lIFJfSEVYQUdPTl9HT1RfSEkxNiAgICAgIDQxCisjZGVmaW5lIFJfSEVYQUdPTl9HT1RfMzIgICAgICAgIDQyCisjZGVmaW5lIFJfSEVYQUdPTl9HT1RfMTYgICAgICAgIDQzCisKKy8qCisgKiBFTEYgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2dyZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCBlbGZfZ3JlZ3NldF90OworI2RlZmluZSBFTEZfTkdSRUcgKHNpemVvZihlbGZfZ3JlZ3NldF90KS9zaXplb2YodW5zaWduZWQgbG9uZykpCisKKy8qICBQbGFjZWhvbGRlciAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBlbGZfZnByZWdzZXRfdDsKKworLyoKKyAqIEJ5cGFzcyB0aGUgd2hvbGUgInJlZ3NldHMiIHRoaW5nIGZvciBub3cgYW5kIHVzZSB0aGUgZGVmaW5lLgorICovCisKKyNkZWZpbmUgRUxGX0NPUkVfQ09QWV9SRUdTKERFU1QsIFJFR1MpCVwKK2RvIHsJCQkJCVwKKwlERVNULnIwID0gUkVHUy0+cjAwOwkJXAorCURFU1QucjEgPSBSRUdTLT5yMDE7CQlcCisJREVTVC5yMiA9IFJFR1MtPnIwMjsJCVwKKwlERVNULnIzID0gUkVHUy0+cjAzOwkJXAorCURFU1QucjQgPSBSRUdTLT5yMDQ7CQlcCisJREVTVC5yNSA9IFJFR1MtPnIwNTsJCVwKKwlERVNULnI2ID0gUkVHUy0+cjA2OwkJXAorCURFU1QucjcgPSBSRUdTLT5yMDc7CQlcCisJREVTVC5yOCA9IFJFR1MtPnIwODsJCVwKKwlERVNULnI5ID0gUkVHUy0+cjA5OwkJXAorCURFU1QucjEwID0gUkVHUy0+cjEwOwkJXAorCURFU1QucjExID0gUkVHUy0+cjExOwkJXAorCURFU1QucjEyID0gUkVHUy0+cjEyOwkJXAorCURFU1QucjEzID0gUkVHUy0+cjEzOwkJXAorCURFU1QucjE0ID0gUkVHUy0+cjE0OwkJXAorCURFU1QucjE1ID0gUkVHUy0+cjE1OwkJXAorCURFU1QucjE2ID0gUkVHUy0+cjE2OwkJXAorCURFU1QucjE3ID0gUkVHUy0+cjE3OwkJXAorCURFU1QucjE4ID0gUkVHUy0+cjE4OwkJXAorCURFU1QucjE5ID0gUkVHUy0+cjE5OwkJXAorCURFU1QucjIwID0gUkVHUy0+cjIwOwkJXAorCURFU1QucjIxID0gUkVHUy0+cjIxOwkJXAorCURFU1QucjIyID0gUkVHUy0+cjIyOwkJXAorCURFU1QucjIzID0gUkVHUy0+cjIzOwkJXAorCURFU1QucjI0ID0gUkVHUy0+cjI0OwkJXAorCURFU1QucjI1ID0gUkVHUy0+cjI1OwkJXAorCURFU1QucjI2ID0gUkVHUy0+cjI2OwkJXAorCURFU1QucjI3ID0gUkVHUy0+cjI3OwkJXAorCURFU1QucjI4ID0gUkVHUy0+cjI4OwkJXAorCURFU1QucjI5ID0gcHRfcHNwKFJFR1MpOwlcCisJREVTVC5yMzAgPSBSRUdTLT5yMzA7CQlcCisJREVTVC5yMzEgPSBSRUdTLT5yMzE7CQlcCisJREVTVC5zYTAgPSBSRUdTLT5zYTA7CQlcCisJREVTVC5sYzAgPSBSRUdTLT5sYzA7CQlcCisJREVTVC5zYTEgPSBSRUdTLT5zYTE7CQlcCisJREVTVC5sYzEgPSBSRUdTLT5sYzE7CQlcCisJREVTVC5tMCA9IFJFR1MtPm0wOwkJXAorCURFU1QubTEgPSBSRUdTLT5tMTsJCVwKKwlERVNULnVzciA9IFJFR1MtPnVzcjsJCVwKKwlERVNULnAzXzAgPSBSRUdTLT5wcmVkczsJXAorCURFU1QuZ3AgPSBSRUdTLT5ncDsJCVwKKwlERVNULnVncCA9IFJFR1MtPnVncDsJCVwKKwlERVNULnBjID0gcHRfZWxyKFJFR1MpOwlcCisJREVTVC5jYXVzZSA9IHB0X2NhdXNlKFJFR1MpOwlcCisJREVTVC5iYWR2YSA9IHB0X2JhZHZhKFJFR1MpOwlcCit9IHdoaWxlICgwKTsKKworCisKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlLgorICogQ2hlY2tzIHRoZSBtYWNoaW5lIGFuZCBBQkkgdHlwZS4KKyAqLworI2RlZmluZSBlbGZfY2hlY2tfYXJjaChoZHIpCSgoaGRyKS0+ZV9tYWNoaW5lID09IEVNX0hFWEFHT04pCisKKy8qCisgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcy4KKyAqLworI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1MzMgorI2RlZmluZSBFTEZfREFUQQlFTEZEQVRBMkxTQgorI2RlZmluZSBFTEZfQVJDSAlFTV9IRVhBR09OCisKKyNpZmRlZiBDT05GSUdfSEVYQUdPTl9BUkNIX1YyCisjZGVmaW5lIEVMRl9DT1JFX0VGTEFHUyAweDEKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0hFWEFHT05fQVJDSF9WMworI2RlZmluZSBFTEZfQ09SRV9FRkxBR1MgMHgyCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19IRVhBR09OX0FSQ0hfVjQKKyNkZWZpbmUgRUxGX0NPUkVfRUZMQUdTIDB4MworI2VuZGlmCisKKy8qCisgKiBTb21lIGFyY2hpdGVjdHVyZXMgaGF2ZSBsZC5zbyBzZXQgdXAgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24KKyAqIHRvIGJlIHJlZ2lzdGVyZWQgdXNpbmcgYXRleGl0LCB0byBmYWNpbGl0YXRlIGNsZWFudXAuICBTbyB0aGF0CisgKiBzdGF0aWMgZXhlY3V0YWJsZXMgd2lsbCBiZSB3ZWxsLWJlaGF2ZWQsIHdlIHdvdWxkIG51bGwgdGhlIHJlZ2lzdGVyCisgKiBpbiBxdWVzdGlvbiBoZXJlLCBpbiB0aGUgcHRfcmVncyBzdHJ1Y3R1cmUgcGFzc2VkLiAgRm9yIG5vdywKKyAqIGxlYXZlIGl0IGEgbnVsbCBtYWNyby4KKyAqLworI2RlZmluZSBFTEZfUExBVF9JTklUKHJlZ3MsIGxvYWRfYWRkcikgZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIFVTRV9FTEZfQ09SRV9EVU1QCisjZGVmaW5lIENPUkVfRFVNUF9VU0VfUkVHU0VUCisKKy8qIEhybSBpcyB0aGlzIGdvaW5nIHRvIGNhdXNlIHByb2JsZW1zIGZvciBjaGFuZ2luZyBQQUdFX1NJWkU/ICAqLworI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQk0MDk2CisKKy8qCisgKiBUaGlzIGlzIHRoZSBsb2NhdGlvbiB0aGF0IGFuIEVUX0RZTiBwcm9ncmFtIGlzIGxvYWRlZCBpZiBleGVjJ2VkLiAgVHlwaWNhbAorICogdXNlIG9mIHRoaXMgaXMgdG8gaW52b2tlICIuL2xkLnNvIHNvbWVwcm9nIiB0byB0ZXN0IG91dCBhIG5ldyB2ZXJzaW9uIG9mCisgKiB0aGUgbG9hZGVyLiAgV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBvdXQgb2YgdGhlIHdheSBvZiB0aGUgcHJvZ3JhbQorICogdGhhdCBpdCB3aWxsICJleGVjIiwgYW5kIHRoYXQgdGhlcmUgaXMgc3VmZmljaWVudCByb29tIGZvciB0aGUgYnJrLgorICovCisjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAgICAgICAgIDB4MDgwMDAwMDBVTAorCisvKgorICogVGhpcyB5aWVsZHMgYSBtYXNrIHRoYXQgdXNlciBwcm9ncmFtcyBjYW4gdXNlIHRvIGZpZ3VyZSBvdXQgd2hhdAorICogaW5zdHJ1Y3Rpb24gc2V0IHRoaXMgY3B1IHN1cHBvcnRzLgorICovCisjZGVmaW5lIEVMRl9IV0NBUAkoMCkKKworLyoKKyAqIFRoaXMgeWllbGRzIGEgc3RyaW5nIHRoYXQgbGQuc28gd2lsbCB1c2UgdG8gbG9hZCBpbXBsZW1lbnRhdGlvbgorICogc3BlY2lmaWMgbGlicmFyaWVzIGZvciBvcHRpbWl6YXRpb24uICBUaGlzIGlzIG1vcmUgc3BlY2lmaWMgaW4KKyAqIGludGVudCB0aGFuIHBva2luZyBhdCB1bmFtZSBvciAvcHJvYy9jcHVpbmZvLgorICovCisjZGVmaW5lIEVMRl9QTEFURk9STSAgKE5VTEwpCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCkKKyNlbmRpZgorCisjZGVmaW5lIEFSQ0hfSEFTX1NFVFVQX0FERElUSU9OQUxfUEFHRVMgMQorc3RydWN0IGxpbnV4X2JpbnBybTsKK2V4dGVybiBpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sCisJCQkJICAgICAgIGludCB1c2VzX2ludGVycCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZml4bWFwLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZml4bWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3ZjQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9maXhtYXAuaApAQCAtMCwwICsxLDczIEBACisvKgorICogRml4bWFwIHN1cHBvcnQgZm9yIEhleGFnb24gLSBlbm91Z2ggdG8gc3VwcG9ydCBoaWdobWVtIGZlYXR1cmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0ZJWE1BUF9ICisjZGVmaW5lIF9BU01fRklYTUFQX0gKKworLyoKKyAqIEEgbG90IG9mIHRoZSBmaXhtYXAgaW5mbyBpcyBhbHJlYWR5IGluIG1lbS1sYXlvdXQuaAorICovCisjaW5jbHVkZSA8YXNtL21lbS1sYXlvdXQuaD4KKworLyoKKyAqIEZ1bGwgZml4bWFwIHN1cHBvcnQgaW52b2x2ZXMgc2V0X2ZpeG1hcCgpIGZ1bmN0aW9ucywgYnV0CisgKiB0aGVzZSBtYXkgbm90IGJlIG5lZWRlZCBpZiBhbGwgd2UncmUgYWZ0ZXIgaXMgYW4gYXJlYSBmb3IKKyAqIGhpZ2htZW0ga2VybmVsIG1hcHBpbmdzLgorICovCisjZGVmaW5lCV9fZml4X3RvX3ZpcnQoeCkJKEZJWEFERFJfVE9QIC0gKCh4KSA8PCBQQUdFX1NISUZUKSkKKyNkZWZpbmUJX192aXJ0X3RvX2ZpeCh4KQkoKEZJWEFERFJfVE9QIC0gKCh4KSZQQUdFX01BU0spKSA+PiBQQUdFX1NISUZUKQorCitleHRlcm4gdm9pZCBfX3RoaXNfZml4bWFwX2RvZXNfbm90X2V4aXN0KHZvaWQpOworCisvKioKKyAqIGZpeF90b192aXJ0IC0tICJpbmRleCB0byBhZGRyZXNzIiB0cmFuc2xhdGlvbi4KKyAqCisgKiBJZiBhbnlvbmUgdHJpZXMgdG8gdXNlIHRoZSBpZHggZGlyZWN0bHkgd2l0aG91dCB0cmFuc2xhdGlvbiwKKyAqIHdlIGNhdGNoIHRoZSBidWcgd2l0aCBhIE5VTEwtZGVmZXJlbmNlIGtlcm5lbCBvb3BzLiBJbGxlZ2FsCisgKiByYW5nZXMgb2YgaW5jb21pbmcgaW5kaWNlcyBhcmUgY2F1Z2h0IHRvby4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGZpeF90b192aXJ0KGNvbnN0IHVuc2lnbmVkIGludCBpZHgpCit7CisJLyoKKwkgKiBUaGlzIGJyYW5jaCBnZXRzIGNvbXBsZXRlbHkgZWxpbWluYXRlZCBhZnRlciBpbmxpbmluZywKKwkgKiBleGNlcHQgd2hlbiBzb21lb25lIHRyaWVzIHRvIHVzZSBmaXhhZGRyIGluZGljZXMgaW4gYW4KKwkgKiBpbGxlZ2FsIHdheS4gKHN1Y2ggYXMgbWl4aW5nIHVwIGFkZHJlc3MgdHlwZXMgb3IgdXNpbmcKKwkgKiBvdXQtb2YtcmFuZ2UgaW5kaWNlcykuCisJICoKKwkgKiBJZiBpdCBkb2Vzbid0IGdldCByZW1vdmVkLCB0aGUgbGlua2VyIHdpbGwgY29tcGxhaW4KKwkgKiBsb3VkbHkgd2l0aCBhIHJlYXNvbmFibHkgY2xlYXIgZXJyb3IgbWVzc2FnZS4uCisJICovCisJaWYgKGlkeCA+PSBfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMpCisJCV9fdGhpc19maXhtYXBfZG9lc19ub3RfZXhpc3QoKTsKKworCXJldHVybiBfX2ZpeF90b192aXJ0KGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX2ZpeChjb25zdCB1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCUJVR19PTih2YWRkciA+PSBGSVhBRERSX1RPUCB8fCB2YWRkciA8IEZJWEFERFJfU1RBUlQpOworCXJldHVybiBfX3ZpcnRfdG9fZml4KHZhZGRyKTsKK30KKworI2RlZmluZSBrbWFwX2dldF9maXhtYXBfcHRlKHZhZGRyKSBcCisJcHRlX29mZnNldF9rZXJuZWwocG1kX29mZnNldChwdWRfb2Zmc2V0KHBnZF9vZmZzZXRfayh2YWRkciksIFwKKwkJCQkodmFkZHIpKSwgKHZhZGRyKSksICh2YWRkcikpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2ZwdS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2ZwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMTM1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZnB1LmgKQEAgLTAsMCArMSw0IEBACisvKgorICogSWYgdGhlIEZQVSBpcyB1c2VkIGluc2lkZSB0aGUga2VybmVsLAorICoga2VybmVsX2ZwdV9lbmQoKSB3aWxsIGJlIGRlZmluZWQgaGVyZS4KKyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2Z1dGV4LmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTU5N2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2Z1dGV4LmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpZm5kZWYgX0FTTV9IRVhBR09OX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9IRVhBR09OX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisvKiBYWFggVE9ETy0tIG5lZWQgdG8gYWRkIHN5bmMgYmFycmllcnMhICovCisKKyNkZWZpbmUgX19mdXRleF9hdG9taWNfb3AoaW5zbiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZykgXAorCV9fYXNtX18gX192b2xhdGlsZSggXAorCSIxOiAlMCA9IG1lbXdfbG9ja2VkKCUzKTtcbiIgXAorCSAgICAvKiBGb3IgZXhhbXBsZTogJTEgPSAlNCAqLyBcCisJICAgIGluc24gXAorCSIyOiBtZW13X2xvY2tlZCglMyxwMikgPSAlMTtcbiIgXAorCSIgICBpZiAhcDIganVtcCAxYjtcbiIgXAorCSIgICAlMSA9ICMwO1xuIiBcCisJIjM6XG4iIFwKKwkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIiBcCisJIjQ6ICUxID0gIyU1O1xuIiBcCisJIiAgIGp1bXAgM2JcbiIgXAorCSIucHJldmlvdXNcbiIgXAorCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iIFwKKwkiLmxvbmcgMWIsNGIsMmIsNGJcbiIgXAorCSIucHJldmlvdXNcbiIgXAorCTogIj0mciIgKG9sZHZhbCksICI9JnIiIChyZXQpLCAiK20iICgqdWFkZHIpIFwKKwk6ICJyIiAodWFkZHIpLCAiciIgKG9wYXJnKSwgImkiICgtRUZBVUxUKSBcCisJOiAicDIiLCAibWVtb3J5IikKKworCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlcihpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0OworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBGVVRFWF9PUF9TRVQ6CisJCV9fZnV0ZXhfYXRvbWljX29wKCIlMSA9ICU0XG4iLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJCV9fZnV0ZXhfYXRvbWljX29wKCIlMSA9IGFkZCglMCwlNClcbiIsIHJldCwgb2xkdmFsLCB1YWRkciwKKwkJCQkgIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9PUjoKKwkJX19mdXRleF9hdG9taWNfb3AoIiUxID0gb3IoJTAsJTQpXG4iLCByZXQsIG9sZHZhbCwgdWFkZHIsCisJCQkJICBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQU5ETjoKKwkJX19mdXRleF9hdG9taWNfb3AoIiUxID0gbm90KCU0KTsgJTEgPSBhbmQoJTAsJTEpXG4iLCByZXQsCisJCQkJICBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfWE9SOgorCQlfX2Z1dGV4X2F0b21pY19vcCgiJTEgPSB4b3IoJTAsJTQpXG4iLCByZXQsIG9sZHZhbCwgdWFkZHIsCisJCQkJICBvcGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJcGFnZWZhdWx0X2VuYWJsZSgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6CisJCQlyZXQgPSAob2xkdmFsID09IGNtcGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6CisJCQlyZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6CisJCQlyZXQgPSAob2xkdmFsIDwgY21wYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRToKKwkJCXJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRToKKwkJCXJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDoKKwkJCXJldCA9IChvbGR2YWwgPiBjbXBhcmcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1MzIgKnV2YWwsIHUzMiBfX3VzZXIgKnVhZGRyLCB1MzIgb2xkdmFsLAorCQkJICAgICAgdTMyIG5ld3ZhbCkKK3sKKwlpbnQgcHJldjsKKwlpbnQgcmV0OworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKHUzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkiMTogJTEgPSBtZW13X2xvY2tlZCglMylcbiIKKwkiICAge1xuIgorCSIgICAgICBwMiA9IGNtcC5lcSglMSwlNClcbiIKKwkiICAgICAgaWYgIXAyLm5ldyBqdW1wOk5UIDNmXG4iCisJIiAgIH1cbiIKKwkiMjogbWVtd19sb2NrZWQoJTMscDIpID0gJTVcbiIKKwkiICAgaWYgIXAyIGp1bXAgMWJcbiIKKwkiMzpcbiIKKwkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCSI0OiAlMCA9ICMlNlxuIgorCSIgICBqdW1wIDNiXG4iCisJIi5wcmV2aW91c1xuIgorCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCisJIi5sb25nIDFiLDRiLDJiLDRiXG4iCisJIi5wcmV2aW91c1xuIgorCTogIityIiAocmV0KSwgIj0mciIgKHByZXYpLCAiK20iICgqdWFkZHIpCisJOiAiciIgKHVhZGRyKSwgInIiIChvbGR2YWwpLCAiciIgKG5ld3ZhbCksICJpIigtRUZBVUxUKQorCTogInAyIiwgIm1lbW9yeSIpOworCisJKnV2YWwgPSBwcmV2OworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9IRVhBR09OX0ZVVEVYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9oZXhhZ29uX3ZtLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaGV4YWdvbl92bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmNiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaGV4YWdvbl92bS5oCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogRGVjbGFyYXRpb25zIGZvciB0byBIZXhhZ29uIFZpcnRhbCBNYWNoaW5lLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgQVNNX0hFWEFHT05fVk1fSAorI2RlZmluZSBBU01fSEVYQUdPTl9WTV9ICisKKy8qCisgKiBJbiBwcmluY2lwbGUsIGEgTGludXgga2VybmVsIGZvciB0aGUgVk0gY291bGQKKyAqIHNlbGVjdGl2ZWx5IGRlZmluZSB0aGUgdmlydHVhbCBpbnN0cnVjdGlvbnMKKyAqIGFzIGlubGluZSBhc3NlbWJsZXIgbWFjcm9zLCBidXQgZm9yIGEgZmlyc3QgcGFzcywKKyAqIHdlJ2xsIHVzZSBzdWJyb3V0aW5lcyBmb3IgYm90aCB0aGUgVk0gYW5kIHRoZSBuYXRpdmUKKyAqIGtlcm5lbHMuICBJdCdzIGNvc3RpbmcgYSBzdWJyb3V0aW5lIGNhbGwvcmV0dXJuLAorICogYnV0IGl0IG1ha2VzIGZvciBhIHNpbmdsZSBzZXQgb2YgZW50cnkgcG9pbnRzCisgKiBmb3IgdHJhY2luZy9kZWJ1Z2dpbmcuCisgKi8KKworLyoKKyAqIExldHMgbWFrZSB0aGlzIHN0dWZmIHZpc2libGUgb25seSBpZiBjb25maWd1cmVkLAorICogc28gd2UgY2FuIHVuY29uZGl0aW9uYWxseSBpbmNsdWRlIHRoZSBmaWxlLgorICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK2VudW0gVk1fQ0FDSEVfT1BTIHsKKwlpY2tpbGwsCisJZGNraWxsLAorCWwya2lsbCwKKwlkY2NsZWFuaW52YSwKKwlpY2ludmEsCisJaWRzeW5jLAorCWZldGNoX2NmZworfTsKKworZW51bSBWTV9JTlRfT1BTIHsKKwlub3AsCisJZ2xvYmVuLAorCWdsb2JkaXMsCisJbG9jZW4sCisJbG9jZGlzLAorCWFmZmluaXR5LAorCWdldCwKKwlwZWVrLAorCXN0YXR1cywKKwlwb3N0LAorCWNsZWFyCit9OworCitleHRlcm4gdm9pZCBfS19WTV9ldmVudF92ZWN0b3Iodm9pZCk7CisKK3ZvaWQgX192bXJ0ZSh2b2lkKTsKK2xvbmcgX192bXNldHZlYyh2b2lkICopOworbG9uZyBfX3Ztc2V0aWUobG9uZyk7Citsb25nIF9fdm1nZXRpZSh2b2lkKTsKK2xvbmcgX192bWludG9wKGVudW0gVk1fSU5UX09QUywgbG9uZywgbG9uZywgbG9uZywgbG9uZyk7Citsb25nIF9fdm1jbHJtYXAodm9pZCAqLCB1bnNpZ25lZCBsb25nKTsKK2xvbmcgX192bW5ld21hcCh2b2lkICopOworbG9uZyBfX3ZtY2FjaGUoZW51bSBWTV9DQUNIRV9PUFMgb3AsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOwordW5zaWduZWQgbG9uZyBsb25nIF9fdm1nZXR0aW1lKHZvaWQpOworbG9uZyBfX3Ztc2V0dGltZSh1bnNpZ25lZCBsb25nIGxvbmcpOworbG9uZyBfX3Ztc3RhcnQodm9pZCAqLCB2b2lkICopOwordm9pZCBfX3Ztc3RvcCh2b2lkKTsKK2xvbmcgX192bXdhaXQodm9pZCk7Cit2b2lkIF9fdm15aWVsZCh2b2lkKTsKK2xvbmcgX192bXZwaWQodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX3ZtY2FjaGVfaWNraWxsKHZvaWQpCit7CisJcmV0dXJuIF9fdm1jYWNoZShpY2tpbGwsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWNhY2hlX2Rja2lsbCh2b2lkKQoreworCXJldHVybiBfX3ZtY2FjaGUoZGNraWxsLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1jYWNoZV9sMmtpbGwodm9pZCkKK3sKKwlyZXR1cm4gX192bWNhY2hlKGwya2lsbCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX3ZtY2FjaGVfZGNjbGVhbmludmEodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlyZXR1cm4gX192bWNhY2hlKGRjY2xlYW5pbnZhLCBhZGRyLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWNhY2hlX2ljaW52YSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXJldHVybiBfX3ZtY2FjaGUoaWNpbnZhLCBhZGRyLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWNhY2hlX2lkc3luYyh1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXJldHVybiBfX3ZtY2FjaGUoaWRzeW5jLCBhZGRyLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWNhY2hlX2ZldGNoX2NmZyh1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlyZXR1cm4gX192bWNhY2hlKGZldGNoX2NmZywgdmFsLCAwKTsKK30KKworLyogaW50ZXJydXB0IG9wZXJhdGlvbnMgICovCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX3ZtaW50b3Bfbm9wKHZvaWQpCit7CisJcmV0dXJuIF9fdm1pbnRvcChub3AsIDAsIDAsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX2dsb2Jlbihsb25nIGkpCit7CisJcmV0dXJuIF9fdm1pbnRvcChnbG9iZW4sIGksIDAsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX2dsb2JkaXMobG9uZyBpKQoreworCXJldHVybiBfX3ZtaW50b3AoZ2xvYmRpcywgaSwgMCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX3ZtaW50b3BfbG9jZW4obG9uZyBpKQoreworCXJldHVybiBfX3ZtaW50b3AobG9jZW4sIGksIDAsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX2xvY2Rpcyhsb25nIGkpCit7CisJcmV0dXJuIF9fdm1pbnRvcChsb2NkaXMsIGksIDAsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX2FmZmluaXR5KGxvbmcgaSwgbG9uZyBjcHUpCit7CisJcmV0dXJuIF9fdm1pbnRvcChsb2NkaXMsIGksIGNwdSwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX3ZtaW50b3BfZ2V0KHZvaWQpCit7CisJcmV0dXJuIF9fdm1pbnRvcChnZXQsIDAsIDAsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX3BlZWsodm9pZCkKK3sKKwlyZXR1cm4gX192bWludG9wKHBlZWssIDAsIDAsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX3N0YXR1cyhsb25nIGkpCit7CisJcmV0dXJuIF9fdm1pbnRvcChzdGF0dXMsIGksIDAsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX3Bvc3QobG9uZyBpKQoreworCXJldHVybiBfX3ZtaW50b3AocG9zdCwgaSwgMCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX3ZtaW50b3BfY2xlYXIobG9uZyBpKQoreworCXJldHVybiBfX3ZtaW50b3AoY2xlYXIsIGksIDAsIDAsIDApOworfQorCisjZWxzZSAvKiBPbmx5IGFzc2VtYmx5IGNvZGUgc2hvdWxkIHJlZmVyZW5jZSB0aGVzZSAqLworCisjZGVmaW5lIEhWTV9UUkFQMV9WTVJURQkJCTEKKyNkZWZpbmUgSFZNX1RSQVAxX1ZNU0VUVkVDCQkyCisjZGVmaW5lIEhWTV9UUkFQMV9WTVNFVElFCQkzCisjZGVmaW5lIEhWTV9UUkFQMV9WTUdFVElFCQk0CisjZGVmaW5lIEhWTV9UUkFQMV9WTUlOVE9QCQk1CisjZGVmaW5lIEhWTV9UUkFQMV9WTUNMUk1BUAkJMTAKKyNkZWZpbmUgSFZNX1RSQVAxX1ZNTkVXTUFQCQkxMQorI2RlZmluZSBIVk1fVFJBUDFfRk9STUVSTFlfVk1XSVJFCTEyCisjZGVmaW5lIEhWTV9UUkFQMV9WTUNBQ0hFCQkxMworI2RlZmluZSBIVk1fVFJBUDFfVk1HRVRUSU1FCQkxNAorI2RlZmluZSBIVk1fVFJBUDFfVk1TRVRUSU1FCQkxNQorI2RlZmluZSBIVk1fVFJBUDFfVk1XQUlUCQkxNgorI2RlZmluZSBIVk1fVFJBUDFfVk1ZSUVMRAkJMTcKKyNkZWZpbmUgSFZNX1RSQVAxX1ZNU1RBUlQJCTE4CisjZGVmaW5lIEhWTV9UUkFQMV9WTVNUT1AJCTE5CisjZGVmaW5lIEhWTV9UUkFQMV9WTVZQSUQJCTIwCisjZGVmaW5lIEhWTV9UUkFQMV9WTVNFVFJFR1MJCTIxCisjZGVmaW5lIEhWTV9UUkFQMV9WTUdFVFJFR1MJCTIyCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIENvbnN0YW50cyBmb3IgdmlydHVhbCBpbnN0cnVjdGlvbiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzCisgKi8KKworLyogdm1zZXRpZSBhcmd1bWVudHMgKi8KKworI2RlZmluZSBWTV9JTlRfRElTQUJMRQkwCisjZGVmaW5lIFZNX0lOVF9FTkFCTEUJMQorCisvKiB2bXNldGltYXNrIGFyZ3VtZW50cyAqLworCisjZGVmaW5lIFZNX0lOVF9VTk1BU0sJMAorI2RlZmluZSBWTV9JTlRfTUFTSwkxCisKKyNkZWZpbmUgVk1fTkVXTUFQX1RZUEVfTElORUFSCTAKKyNkZWZpbmUgVk1fTkVXTUFQX1RZUEVfUEdUQUJMRVMJMQorCisKKy8qCisgKiBFdmVudCBSZWNvcmQgZGVmaW5pdGlvbnMgdXNlZnVsIHRvIGJvdGggQyBhbmQgQXNzZW1ibGVyCisgKi8KKworLyogVk1FU1QgTGF5b3V0ICovCisKKyNkZWZpbmUgSFZNX1ZNRVNUX1VNX1NGVAkzMQorI2RlZmluZSBIVk1fVk1FU1RfVU1fTVNLCTEKKyNkZWZpbmUgSFZNX1ZNRVNUX0lFX1NGVAkzMAorI2RlZmluZSBIVk1fVk1FU1RfSUVfTVNLCTEKKyNkZWZpbmUgSFZNX1ZNRVNUX0VWRU5UTlVNX1NGVAkxNgorI2RlZmluZSBIVk1fVk1FU1RfRVZFTlROVU1fTVNLCTB4ZmYKKyNkZWZpbmUgSFZNX1ZNRVNUX0NBVVNFX1NGVAkwCisjZGVmaW5lIEhWTV9WTUVTVF9DQVVTRV9NU0sJMHhmZmZmCisKKy8qCisgKiBUaGUgaW5pdGlhbCBwcm9ncmFtIGdldHMgdG8gZmluZCBhIHN5c3RlbSBlbnZpcm9ubWVudCBkZXNjcmlwdG9yCisgKiBvbiBpdHMgc3RhY2sgd2hlbiBpdCBiZWdpbnMgZXhlY3Rpb24uIFRoZSBmaXJzdCB3b3JkIGlzIGEgdmVyc2lvbgorICogY29kZSB0byBpbmRpY2F0ZSB3aGF0IGlzIHRoZXJlLiAgWmVybyBtZWFucyBub3RoaW5nIG1vcmUuCisgKi8KKworI2RlZmluZSBIRVhBR09OX1ZNX1NFRF9OVUxMCTAKKworLyoKKyAqIEV2ZW50IG51bWJlcnMgZm9yIHZlY3RvciBiaW5kaW5nCisgKi8KKworI2RlZmluZSBIVk1fRVZfUkVTRVQJCTAKKyNkZWZpbmUgSFZNX0VWX01BQ0hDSEVDSwkxCisjZGVmaW5lIEhWTV9FVl9HRU5FWAkJMgorI2RlZmluZSBIVk1fRVZfVFJBUAkJOAorI2RlZmluZSBIVk1fRVZfSU5UUgkJMTUKKy8qIFRoZXNlIHNob3VkIGJlIG51a2VkIGFzIHNvb24gYXMgd2Uga25vdyB0aGUgVk0gaXMgdXAgdG8gc3BlYyB2MC4xLjEgKi8KKyNkZWZpbmUgSFZNX0VWX0lOVFJfMAkJMTYKKyNkZWZpbmUgSFZNX01BWF9JTlRSCQkyNDAKKworLyoKKyAqIENhdXNlIHZhbHVlcyBmb3IgR2VuZXJhbCBFeGNlcHRpb24KKyAqLworCisjZGVmaW5lIEhWTV9HRV9DX0JVUwkweDAxCisjZGVmaW5lIEhWTV9HRV9DX1hQUk9UCTB4MTEKKyNkZWZpbmUgSFZNX0dFX0NfWFVTRVIJMHgxNAorI2RlZmluZSBIVk1fR0VfQ19JTlZJCTB4MTUKKyNkZWZpbmUgSFZNX0dFX0NfUFJJVkkJMHgxQgorI2RlZmluZSBIVk1fR0VfQ19YTUFMCTB4MUMKKyNkZWZpbmUgSFZNX0dFX0NfUk1BTAkweDIwCisjZGVmaW5lIEhWTV9HRV9DX1dNQUwJMHgyMQorI2RlZmluZSBIVk1fR0VfQ19SUFJPVAkweDIyCisjZGVmaW5lIEhWTV9HRV9DX1dQUk9UCTB4MjMKKyNkZWZpbmUgSFZNX0dFX0NfUlVTRVIJMHgyNAorI2RlZmluZSBIVk1fR0VfQ19XVVNFUgkweDI1CisjZGVmaW5lIEhWTV9HRV9DX0NBQ0hFCTB4MjgKKworLyoKKyAqIENhdXNlIGNvZGVzIGZvciBNYWNoaW5lIENoZWNrCisgKi8KKworI2RlZmluZQlIVk1fTUNIS19DX0RPV04JCTB4MDAKKyNkZWZpbmUJSFZNX01DSEtfQ19CQURTUAkweDAxCisjZGVmaW5lCUhWTV9NQ0hLX0NfQkFERVgJMHgwMgorI2RlZmluZQlIVk1fTUNIS19DX0JBRFBUCTB4MDMKKyNkZWZpbmUJSFZNX01DSEtfQ19SRUdXUgkweDI5CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2ludHJpbnNpY3MuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9pbnRyaW5zaWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwMjE4NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9pbnRyaW5zaWNzLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9IRVhBR09OX0lOVFJJTlNJQ1NfSAorI2RlZmluZSBfQVNNX0hFWEFHT05fSU5UUklOU0lDU19ICisKKyNkZWZpbmUgSEVYQUdPTl9QX3ZybXB5aGFjY19QUAlfX2J1aWx0aW5fSEVYQUdPTl9NMl92cm1hY19zMAorI2RlZmluZSBIRVhBR09OX1BfdnJtcHloX1BQCV9fYnVpbHRpbl9IRVhBR09OX00yX3ZybXB5X3MwCisjZGVmaW5lIEhFWEFHT05fUl9jbDBfUgkJX19idWlsdGluX0hFWEFHT05fUzJfY2wwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2FjYzJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBJTyBkZWZpbml0aW9ucyBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0lPX0gKKyNkZWZpbmUgX0FTTV9JT19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vbWVtLWxheW91dC5oPgorI2luY2x1ZGUgPGFzbS9pb21hcC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworLyoKKyAqIFdlIGRvbid0IGhhdmUgUENJIHlldC4KKyAqIF9JT19CQVNFIGlzIHBvaW50aW5nIGF0IHdoYXQgc2hvdWxkIGJlIHVudXNlZCB2aXJ0dWFsIHNwYWNlLgorICovCisjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZgorI2RlZmluZSBfSU9fQkFTRSAoKHZvaWQgX19pb21lbSAqKTB4ZmUwMDAwMDApCisKK2V4dGVybiBpbnQgcmVtYXBfYXJlYV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkJCQl1bnNpZ25lZCBsb25nIGVuZCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK2V4dGVybiB2b2lkIF9faW91bm1hcChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOworCisvKiBEZWZpbmVkIGluIGxpYi9pby5jLCBuZWVkZWQgZm9yIHNtYzkxeCBkcml2ZXIuICovCitleHRlcm4gdm9pZCBfX3Jhd19yZWFkc3coY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkYXRhLCBpbnQgd29yZGxlbik7CitleHRlcm4gdm9pZCBfX3Jhd193cml0ZXN3KHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IHdvcmRsZW4pOworCitleHRlcm4gdm9pZCBfX3Jhd19yZWFkc2woY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkYXRhLCBpbnQgd29yZGxlbik7CitleHRlcm4gdm9pZCBfX3Jhd193cml0ZXNsKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IHdvcmRsZW4pOworCisjZGVmaW5lIHJlYWRzdyhwLCBkLCBsKQlfX3Jhd19yZWFkc3cocCwgZCwgbCkKKyNkZWZpbmUgd3JpdGVzdyhwLCBkLCBsKSBfX3Jhd193cml0ZXN3KHAsIGQsIGwpCisKKyNkZWZpbmUgcmVhZHNsKHAsIGQsIGwpICAgX19yYXdfcmVhZHNsKHAsIGQsIGwpCisjZGVmaW5lIHdyaXRlc2wocCwgZCwgbCkgIF9fcmF3X3dyaXRlc2wocCwgZCwgbCkKKworLyoKKyAqIHZpcnRfdG9fcGh5cyAtIG1hcCB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwKKyAqIEBhZGRyZXNzOiAgYWRkcmVzcyB0byBtYXAKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2xhdGlsZSB2b2lkICphZGRyZXNzKQoreworCXJldHVybiBfX3BhKGFkZHJlc3MpOworfQorCisvKgorICogcGh5c190b192aXJ0IC0gbWFwIHBoeXNpY2FsIGFkZHJlc3MgdG8gdmlydHVhbAorICogQGFkZHJlc3M6IGFkZHJlc3MgdG8gbWFwCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqcGh5c190b192aXJ0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlyZXR1cm4gX192YShhZGRyZXNzKTsKK30KKworLyoKKyAqIGNvbnZlcnQgYSBwaHlzaWNhbCBwb2ludGVyIHRvIGEgdmlydHVhbCBrZXJuZWwgcG9pbnRlciBmb3IKKyAqIC9kZXYvbWVtIGFjY2Vzcy4KKyAqLworI2RlZmluZSB4bGF0ZV9kZXZfa21lbV9wdHIocCkgICAgX192YShwKQorI2RlZmluZSB4bGF0ZV9kZXZfbWVtX3B0cihwKSAgICBfX3ZhKHApCisKKy8qCisgKiBJTyBwb3J0IGFjY2VzcyBwcmltaXRpdmVzLiAgSGV4YWdvbiBkb2Vzbid0IGhhdmUgc3BlY2lhbCBJTyBhY2Nlc3MKKyAqIGluc3RydWN0aW9uczsgYWxsIEkvTyBpcyBtZW1vcnkgbWFwcGVkLgorICoKKyAqIGluL291dCBhcmUgdXNlZCBmb3IgInBvcnRzIiwgYnV0IHdlIGRvbid0IGhhdmUgInBvcnQgaW5zdHJ1Y3Rpb25zIiwKKyAqIHNvIHRoZXNlIGFyZSByZWFsbHkganVzdCBtZW1vcnkgbWFwcGVkIHRvby4KKyAqLworCisvKgorICogcmVhZGIgLSByZWFkIGJ5dGUgZnJvbSBtZW1vcnkgbWFwcGVkIGRldmljZQorICogQGFkZHI6ICBwb2ludGVyIHRvIG1lbW9yeQorICoKKyAqIE9wZXJhdGVzIG9uICJJL08gYnVzIG1lbW9yeSBzcGFjZSIKKyAqLworc3RhdGljIGlubGluZSB1OCByZWFkYihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTggdmFsOworCWFzbSB2b2xhdGlsZSgKKwkJIiUwID0gbWVtYiglMSk7IgorCQk6ICI9JnIiICh2YWwpCisJCTogInIiIChhZGRyKQorCSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MTYgcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXUxNiB2YWw7CisJYXNtIHZvbGF0aWxlKAorCQkiJTAgPSBtZW1oKCUxKTsiCisJCTogIj0mciIgKHZhbCkKKwkJOiAiciIgKGFkZHIpCisJKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHUzMiByZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTMyIHZhbDsKKwlhc20gdm9sYXRpbGUoCisJCSIlMCA9IG1lbXcoJTEpOyIKKwkJOiAiPSZyIiAodmFsKQorCQk6ICJyIiAoYWRkcikKKwkpOworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiB3cml0ZWIgLSB3cml0ZSBhIGJ5dGUgdG8gYSBtZW1vcnkgbG9jYXRpb24KKyAqIEBkYXRhOiBkYXRhIHRvIHdyaXRlIHRvCisgKiBAYWRkcjogIHBvaW50ZXIgdG8gbWVtb3J5CisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGViKHU4IGRhdGEsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlhc20gdm9sYXRpbGUoCisJCSJtZW1iKCUwKSA9ICUxOyIKKwkJOgorCQk6ICJyIiAoYWRkciksICJyIiAoZGF0YSkKKwkJOiAibWVtb3J5IgorCSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXcodTE2IGRhdGEsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlhc20gdm9sYXRpbGUoCisJCSJtZW1oKCUwKSA9ICUxOyIKKwkJOgorCQk6ICJyIiAoYWRkciksICJyIiAoZGF0YSkKKwkJOiAibWVtb3J5IgorCSk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlbCh1MzIgZGF0YSwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCWFzbSB2b2xhdGlsZSgKKwkJIm1lbXcoJTApID0gJTE7IgorCQk6CisJCTogInIiIChhZGRyKSwgInIiIChkYXRhKQorCQk6ICJtZW1vcnkiCisJKTsKK30KKworI2RlZmluZSBfX3Jhd193cml0ZWIgd3JpdGViCisjZGVmaW5lIF9fcmF3X3dyaXRldyB3cml0ZXcKKyNkZWZpbmUgX19yYXdfd3JpdGVsIHdyaXRlbAorCisjZGVmaW5lIF9fcmF3X3JlYWRiIHJlYWRiCisjZGVmaW5lIF9fcmF3X3JlYWR3IHJlYWR3CisjZGVmaW5lIF9fcmF3X3JlYWRsIHJlYWRsCisKKy8qCisgKiBOZWVkIGFuIG10eXBlIHNvbWV3aGVyZSBpbiBoZXJlLCBmb3IgY2FjaGUgdHlwZSBkZWFscz8KKyAqIFRoaXMgaXMgcHJvYmFibHkgdG9vIGxvbmcgZm9yIGFuIGlubGluZS4KKyAqLwordm9pZCBfX2lvbWVtICppb3JlbWFwX25vY2FjaGUodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuIGlvcmVtYXBfbm9jYWNoZShwaHlzX2FkZHIsIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJX19pb3VubWFwKGFkZHIpOworfQorCisjZGVmaW5lIF9fcmF3X3dyaXRlbCB3cml0ZWwKKworc3RhdGljIGlubGluZSB2b2lkIG1lbWNweV9mcm9taW8odm9pZCAqZHN0LCBjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNyYywKKwlpbnQgY291bnQpCit7CisJbWVtY3B5KGRzdCwgKHZvaWQgKikgc3JjLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1jcHlfdG9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmRzdCwgY29uc3Qgdm9pZCAqc3JjLAorCWludCBjb3VudCkKK3sKKwltZW1jcHkoKHZvaWQgKikgZHN0LCBzcmMsIGNvdW50KTsKK30KKworI2RlZmluZSBQQ0lfSU9fQUREUgkodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopCisKKy8qCisgKiBpbmIgLSByZWFkIGJ5dGUgZnJvbSBJL08gcG9ydCBvciBzb21ldGhpbmcKKyAqIEBwb3J0OiAgYWRkcmVzcyBpbiBJL08gc3BhY2UKKyAqCisgKiBPcGVyYXRlcyBvbiAiSS9PIGJ1cyBJL08gc3BhY2UiCisgKi8KK3N0YXRpYyBpbmxpbmUgdTggaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlyZXR1cm4gcmVhZGIoX0lPX0JBU0UgKyAocG9ydCAmIElPX1NQQUNFX0xJTUlUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGludyh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJcmV0dXJuIHJlYWR3KF9JT19CQVNFICsgKHBvcnQgJiBJT19TUEFDRV9MSU1JVCkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBpbmwodW5zaWduZWQgbG9uZyBwb3J0KQoreworCXJldHVybiByZWFkbChfSU9fQkFTRSArIChwb3J0ICYgSU9fU1BBQ0VfTElNSVQpKTsKK30KKworLyoKKyAqIG91dGIgLSB3cml0ZSBhIGJ5dGUgdG8gYSBtZW1vcnkgbG9jYXRpb24KKyAqIEBkYXRhOiBkYXRhIHRvIHdyaXRlIHRvCisgKiBAYWRkcjogIGFkZHJlc3MgaW4gSS9PIHNwYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRiKHU4IGRhdGEsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl3cml0ZWIoZGF0YSwgX0lPX0JBU0UgKyAocG9ydCAmIElPX1NQQUNFX0xJTUlUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXR3KHUxNiBkYXRhLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJd3JpdGV3KGRhdGEsIF9JT19CQVNFICsgKHBvcnQgJiBJT19TUEFDRV9MSU1JVCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0bCh1MzIgZGF0YSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXdyaXRlbChkYXRhLCBfSU9fQkFTRSArIChwb3J0ICYgSU9fU1BBQ0VfTElNSVQpKTsKK30KKworI2RlZmluZSBvdXRiX3Agb3V0YgorI2RlZmluZSBvdXR3X3Agb3V0dworI2RlZmluZSBvdXRsX3Agb3V0bAorCisjZGVmaW5lIGluYl9wIGluYgorI2RlZmluZSBpbndfcCBpbncKKyNkZWZpbmUgaW5sX3AgaW5sCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYnVmZmVyLCBpbnQgY291bnQpCit7CisJaWYgKGNvdW50KSB7CisJCXU4ICpidWYgPSBidWZmZXI7CisJCWRvIHsKKwkJCXU4IHggPSBpbmIocG9ydCk7CisJCQkqYnVmKysgPSB4OworCQl9IHdoaWxlICgtLWNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYnVmZmVyLCBpbnQgY291bnQpCit7CisJaWYgKGNvdW50KSB7CisJCXUxNiAqYnVmID0gYnVmZmVyOworCQlkbyB7CisJCQl1MTYgeCA9IGludyhwb3J0KTsKKwkJCSpidWYrKyA9IHg7CisJCX0gd2hpbGUgKC0tY291bnQpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGluc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpidWZmZXIsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJdTMyICpidWYgPSBidWZmZXI7CisJCWRvIHsKKwkJCXUzMiB4ID0gaW53KHBvcnQpOworCQkJKmJ1ZisrID0geDsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpidWZmZXIsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJY29uc3QgdTggKmJ1ZiA9IGJ1ZmZlcjsKKwkJZG8geworCQkJb3V0YigqYnVmKyssIHBvcnQpOworCQl9IHdoaWxlICgtLWNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRzdyh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgaW50IGNvdW50KQoreworCWlmIChjb3VudCkgeworCQljb25zdCB1MTYgKmJ1ZiA9IGJ1ZmZlcjsKKwkJZG8geworCQkJb3V0dygqYnVmKyssIHBvcnQpOworCQl9IHdoaWxlICgtLWNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgaW50IGNvdW50KQoreworCWlmIChjb3VudCkgeworCQljb25zdCB1MzIgKmJ1ZiA9IGJ1ZmZlcjsKKwkJZG8geworCQkJb3V0bCgqYnVmKyssIHBvcnQpOworCQl9IHdoaWxlICgtLWNvdW50KTsKKwl9Cit9CisKKyNkZWZpbmUgZmx1c2hfd3JpdGVfYnVmZmVycygpIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkOGMxNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9pcnEuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0lSUV9IXworI2RlZmluZSBfQVNNX0lSUV9IXworCisvKiBOdW1iZXIgb2YgZmlyc3QtbGV2ZWwgaW50ZXJydXB0cyBhc3NvY2lhdGVkIHdpdGggdGhlIENQVSBjb3JlLiAqLworI2RlZmluZSBIRVhBR09OX0NQVUlOVFMgMzIKKworLyoKKyAqIE11c3QgZGVmaW5lIE5SX0lSUVMgYmVmb3JlIGluY2x1ZGluZyA8YXNtLWdlbmVyaWMvaXJxLmg+CisgKiA2NCA9PSB0aGUgdHdvIFNJUkMncywgMTc2ID09IHRoZSB0d28gZ3BpbydzCisgKgorICogSVJRIGNvbmZpZ3VyYXRpb24gaXMgc3RpbGwgaW4gZmx1eDsgZGVmaW5pbmcgdGhpcyB0byBhIGNvbWZvcnRhYmx5CisgKiBsYXJnZSBudW1iZXIuCisgKi8KKyNkZWZpbmUgTlJfSVJRUyA1MTIKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lycS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9pcnFmbGFncy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxNTIzNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBJUlEgc3VwcG9ydCBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0lSUUZMQUdTX0gKKyNkZWZpbmUgX0FTTV9JUlFGTEFHU19ICisKKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKK3sKKwlyZXR1cm4gX192bWdldGllKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcmNoX2xvY2FsX2lycV9zYXZlKHZvaWQpCit7CisJcmV0dXJuIF9fdm1zZXRpZShWTV9JTlRfRElTQUJMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBhcmNoX2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gIWZsYWdzOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkKHZvaWQpCit7CisJcmV0dXJuICFfX3ZtZ2V0aWUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQoreworCV9fdm1zZXRpZShWTV9JTlRfRU5BQkxFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKK3sKKwlfX3Ztc2V0aWUoVk1fSU5UX0RJU0FCTEUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCV9fdm1zZXRpZShmbGFncyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2tnZGIuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9rZ2RiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4Nzc5NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9rZ2RiLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIGFyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9rZ2RiLmggLSBIZXhhZ29uIEtHREIgU3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fSEVYQUdPTl9LR0RCX0hfXworI2RlZmluZSBfX0hFWEFHT05fS0dEQl9IX18KKworI2RlZmluZSBCUkVBS19JTlNUUl9TSVpFIDQKKyNkZWZpbmUgQ0FDSEVfRkxVU0hfSVNfU0FGRSAgIDEKKyNkZWZpbmUgQlVGTUFYICAgICAgICgoTlVNUkVHQllURVMgKiAyKSArIDUxMikKKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfa2dkYl9icmVha3BvaW50KHZvaWQpCit7CisJYXNtKCJ0cmFwMCgjMHhEQikiKTsKK30KKworLyogUmVnaXN0ZXJzOgorICogMzIgZ3ByICsgc2EwLzEgKyBsYzAvMSArIG0wLzEgKyBncCArIHVncCArIHByZWQgKyBwYyA9IDQyIHRvdGFsLgorICogdm0gcmVncyA9IHBzcCtlbHIrZXN0K2JhZHZhID0gNAorICogc3lzY2FsbCtyZXN0YXJ0ID0gMiBtb3JlCisgKiBzbyA0OCA9IDQyICs0ICsgMgorICovCisjZGVmaW5lIERCR19VU0VSX1JFR1MgNDIKKyNkZWZpbmUgREJHX01BWF9SRUdfTlVNIChEQkdfVVNFUl9SRUdTICsgNikKKyNkZWZpbmUgTlVNUkVHQllURVMgIChEQkdfTUFYX1JFR19OVU0qNCkKKworI2VuZGlmIC8qIF9fSEVYQUdPTl9LR0RCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2xpbmthZ2UuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9saW5rYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwYjg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9saW5rYWdlLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19BU01fTElOS0FHRV9ICisjZGVmaW5lIF9fQVNNX0xJTktBR0VfSAorCisjZGVmaW5lIF9fQUxJR04JCS5hbGlnbiA0CisjZGVmaW5lIF9fQUxJR05fU1RSCSIuYWxpZ24gNCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbWVtLWxheW91dC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21lbS1sYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmU1ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21lbS1sYXlvdXQuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIE1lbW9yeSBsYXlvdXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9IRVhBR09OX01FTV9MQVlPVVRfSAorI2RlZmluZSBfQVNNX0hFWEFHT05fTUVNX0xBWU9VVF9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgorCisvKgorICogSGF2ZSB0byBkbyB0aGlzIGZvciBnaW5vcm1vdXMgbnVtYmVycywgZWxzZSB0aGV5IGdldCBwcmludGVkIGFzCisgKiBuZWdhdGl2ZSBudW1iZXJzLCB3aGljaCB0aGUgbGlua2VyIG5vIGxpa2V5IHdoZW4geW91IHRyeSB0bworICogYXNzaWduIGl0IHRvIHRoZSBsb2NhdGlvbiBjb3VudGVyLgorICovCisKKyNkZWZpbmUgUEFHRV9PRkZTRVQJCQlfQUMoMHhjMDAwMDAwMCwgVUwpCisKKy8qCisgKiBMT0FEX0FERFJFU1MgaXMgdGhlIHBoeXNpY2FsL2xpbmVhciBhZGRyZXNzIG9mIHdoZXJlIGluIG1lbW9yeQorICogdGhlIGtlcm5lbCBnZXRzIGxvYWRlZC4gVGhlIDEyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgbXVzdCBiZSB6ZXJvICgwKQorICogZHVlIHRvIGxpbWl0YXRpb25zIG9uIHNldHRpbmcgdGhlIEVWQgorICoKKyAqLworCisjaWZuZGVmIExPQURfQUREUkVTUworI2RlZmluZSBMT0FEX0FERFJFU1MJCQkweDAwMDAwMDAwCisjZW5kaWYKKworI2RlZmluZSBUQVNLX1NJWkUJCQkoUEFHRV9PRkZTRVQpCisKKy8qICBub3Qgc3VyZSBob3cgdGhlc2UgYXJlIHVzZWQgeWV0ICAqLworI2RlZmluZSBTVEFDS19UT1AJCQlUQVNLX1NJWkUKKyNkZWZpbmUgU1RBQ0tfVE9QX01BWAkJCVRBU0tfU0laRQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworZW51bSBmaXhlZF9hZGRyZXNzZXMgeworCUZJWF9LTUFQX0JFR0lOLAorCUZJWF9LTUFQX0VORCwgIC8qICBjaGVjayBmb3IgcGVyLWNwdWlzbSAgKi8KKwlfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMKK307CisKKyNkZWZpbmUgTUlOX0tFUk5FTF9TRUcgMHgzMDAgICAvKiBGcm9tIDB4YzAwMDAwMDAgKi8KK2V4dGVybiBpbnQgbWF4X2tlcm5lbF9zZWc7CisKKy8qCisgKiBTdGFydCBvZiB2bWFsbG9jIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBmb3Iga2VybmVsOworICogc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gdGhlIGFtb3VudCBvZiBwaHlzaWNhbCBtZW1vcnkgYXZhaWxhYmxlCisgKi8KKworI2RlZmluZSBWTUFMTE9DX1NUQVJUIChQQUdFX09GRlNFVCArIFZNQUxMT0NfT0ZGU0VUICsgXAorCSh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5KQorCisvKiBHYXAgYmV0d2VlbiBwaHlzaWNhbCByYW0gYW5kIHZtYWxsb2Mgc3BhY2UgZm9yIGd1YXJkIHB1cnBvc2VzLiAqLworI2RlZmluZSBWTUFMTE9DX09GRlNFVCBQQUdFX1NJWkUKKworLyoKKyAqIENyZWF0ZSB0aGUgc3BhY2UgYmV0d2VlbiBWTUFMTE9DX1NUQVJUIGFuZCBGSVhBRERSX1RPUCBiYWNrd2FyZHMKKyAqIGZyb20gdGhlIC4uLiAidG9wIi4KKyAqCisgKiBQZXJtYW5lbnQgSU8gbWFwcGluZ3Mgd2lsbCBsaXZlIGF0IDB4ZmV4eF94eHh4CisgKiBIeXBlcnZpc29yIG9jY3VwaWVzIHRoZSBsYXN0IDE2TUIgcGFnZSBhdCAweGZmeHh4eHh4CisgKi8KKworI2RlZmluZSBGSVhBRERSX1RPUCAgICAgMHhmZTAwMDAwMAorI2RlZmluZSBGSVhBRERSX1NJWkUgICAgKF9fZW5kX29mX2ZpeGVkX2FkZHJlc3NlcyA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBGSVhBRERSX1NUQVJUICAgKEZJWEFERFJfVE9QIC0gRklYQUREUl9TSVpFKQorCisvKgorICogInBlcm1hbmVudCBrZXJuZWwgbWFwcGluZ3MiLCBkZWZpbmVkIGFzIGxvbmctbGFzdGluZyBtYXBwaW5ncyBvZgorICogaGlnaC1tZW1vcnkgcGFnZSBmcmFtZXMgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuCisgKi8KKworI2RlZmluZSBMQVNUX1BLTUFQCVBUUlNfUEVSX1BURQorI2RlZmluZSBMQVNUX1BLTUFQX01BU0sJKExBU1RfUEtNQVAgLSAxKQorI2RlZmluZSBQS01BUF9OUih2aXJ0KQkoKHZpcnQgLSBQS01BUF9CQVNFKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBQS01BUF9BRERSKG5yKQkoUEtNQVBfQkFTRSArICgobnIpIDw8IFBBR0VfU0hJRlQpKQorCisvKgorICogVG8gdGhlICJsZWZ0IiBvZiB0aGUgZml4ZWQgbWFwIHNwYWNlIGlzIHRoZSBrbWFwIHNwYWNlCisgKgorICogIlBlcm1hbmVudCBLZXJuZWwgTWFwcGluZ3MiOyBmYW5jeSAob3IgbGVzcyBmYW5jeSkgUFRFIHRhYmxlCisgKiB0aGF0IGxvb2tzIGxpa2UgaXQncyBhY3R1YWxseSB3YWxrZWQuCisgKiBOZWVkIHRvIGNoZWNrIHRoZSBhbGlnbm1lbnQvc2hpZnQgdXNhZ2U7IHNvbWUgYXJjaHMgdXNlCisgKiBQTURfTUFTSyBvbiB0aGlzIHZhbHVlCisgKi8KKyNkZWZpbmUgUEtNQVBfQkFTRSAoRklYQUREUl9TVEFSVC1QQUdFX1NJWkUqTEFTVF9QS01BUCkKKworLyoKKyAqIDIgcGFnZXMgb2YgZ3VhcmQgZ2FwIGJldHdlZW4gd2hlcmUgdm1hbGxvYyBhcmVhIGVuZHMKKyAqIGFuZCBwa21hcF9iYXNlIGJlZ2lucy4KKyAqLworI2RlZmluZSBWTUFMTE9DX0VORCAoUEtNQVBfQkFTRS1QQUdFX1NJWkUqMikKKyNlbmRpZiAvKiAgIV9fQVNTRU1CTFlfXyAgKi8KKworCisjZW5kaWYgLyogX0FTTV9IRVhBR09OX01FTV9MQVlPVVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21tdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTVkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbW11LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9NTVVfSAorI2RlZmluZSBfQVNNX01NVV9ICisKKyNpbmNsdWRlIDxhc20vdmRzby5oPgorCisvKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHN0YXRlIGZvciBhIG1tX3N0cnVjdC4KKyAqIEZvciB0aGUgSGV4YWdvbiBWaXJ0dWFsIE1hY2hpbmUsIGl0IGNhbiBiZSBhIGNvcHkKKyAqIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBwYWdlIHRhYmxlIGJhc2UuCisgKi8KK3N0cnVjdCBtbV9jb250ZXh0IHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZ2VuZXJhdGlvbjsKKwl1bnNpZ25lZCBsb25nIHB0YmFzZTsKKwlzdHJ1Y3QgaGV4YWdvbl92ZHNvICp2ZHNvOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbW1fY29udGV4dCBtbV9jb250ZXh0X3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZlNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBNTSBjb250ZXh0IHN1cHBvcnQgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9NTVVfQ09OVEVYVF9ICisjZGVmaW5lIF9BU01fTU1VX0NPTlRFWFRfSAorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9tZW0tbGF5b3V0Lmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CisKKy8qCisgKiBWTSBwb3J0IGhpZGVzIGFsbCBUTEIgbWFuYWdlbWVudCwgc28gImxhenkgVExCIiBpc24ndCB2ZXJ5CisgKiBtZWFuaW5nZnVsLiAgRXZlbiBmb3IgcG9ydHMgdG8gYXJjaGl0ZWN0dXJlcyB3aXRoIHZpc2JsZSBUTEJzLAorICogdGhpcyBpcyBhbG1vc3QgaW52YXJpYWJseSBhIG51bGwgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbnRlcl9sYXp5X3RsYihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKK30KKworLyoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBhY3Rpb25zLCBpZiBhbnksIGZvciBtZW1vcnkgbWFwIGRlYWN0aXZhdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRlYWN0aXZhdGVfbW0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CisKKy8qKgorICogaW5pdF9uZXdfY29udGV4dCAtIGluaXRpYWxpemUgY29udGV4dCByZWxhdGVkIGluZm8gZm9yIG5ldyBtbV9zdHJ1Y3QgaW5zdGFuY2UKKyAqIEB0c2s6IHBvaW50ZXIgdG8gYSB0YXNrIHN0cnVjdAorICogQG1tOiBwb2ludGVyIHRvIGEgbmV3IG1tIHN0cnVjdAorICovCitzdGF0aWMgaW5saW5lIGludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwkvKiBtbS0+Y29udGV4dCBpcyBzZXQgdXAgYnkgcGdkX2FsbG9jICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgU3dpdGNoIGFjdGl2ZSBtbSBjb250ZXh0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKKwkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlpbnQgbDE7CisKKwkvKgorCSAqIEZvciB2aXJ0dWFsIG1hY2hpbmUsIHdlIGhhdmUgdG8gdXBkYXRlIHN5c3RlbSBtYXAgaWYgaXQncyBiZWVuCisJICogdG91Y2hlZC4KKwkgKi8KKwlpZiAobmV4dC0+Y29udGV4dC5nZW5lcmF0aW9uIDwgcHJldi0+Y29udGV4dC5nZW5lcmF0aW9uKSB7CisJCWZvciAobDEgPSBNSU5fS0VSTkVMX1NFRzsgbDEgPD0gbWF4X2tlcm5lbF9zZWc7IGwxKyspCisJCQluZXh0LT5wZ2RbbDFdID0gaW5pdF9tbS5wZ2RbbDFdOworCisJCW5leHQtPmNvbnRleHQuZ2VuZXJhdGlvbiA9IHByZXYtPmNvbnRleHQuZ2VuZXJhdGlvbjsKKwl9CisKKwlfX3ZtbmV3bWFwKCh2b2lkICopbmV4dC0+Y29udGV4dC5wdGJhc2UpOworfQorCisvKgorICogIEFjdGl2YXRlIG5ldyBtZW1vcnkgbWFwIGZvciB0YXNrCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3dpdGNoX21tKHByZXYsIG5leHQsIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+dGFzayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKiAgR2VuZXJpYyBob29rcyBmb3IgYXJjaF9kdXBfbW1hcCBhbmQgYXJjaF9leGl0X21tYXAgICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1faG9va3MuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbW9kdWxlLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiYTQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9tb2R1bGUuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX01PRFVMRV9ICisjZGVmaW5lIF9BU01fTU9EVUxFX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL21vZHVsZS5oPgorCisjZGVmaW5lIE1PRFVMRV9BUkNIX1ZFUk1BR0lDIF9fc3RyaW5naWZ5KFBST0NFU1NPUl9NT0RFTF9OQU1FKSAiICIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbXV0ZXguaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YjUyZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbXV0ZXguaApAQCAtMCwwICsxLDggQEAKKy8qCisgKiBQdWxsIGluIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbXV0ZXggZmFzdHBhdGguCisgKgorICogVE9ETzogaW1wbGVtZW50IG9wdGltaXplZCBwcmltaXRpdmVzIGluc3RlYWQsIG9yIGxlYXZlIHRoZSBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZSwgb3IgcGljayB0aGUgYXRvbWljX3hjaGcoKSBiYXNlZCBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbi4gKHNlZSBhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmggZm9yIGRldGFpbHMpCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmg+CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGFnZS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQ5NzYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIFBhZ2UgbWFuYWdlbWVudCBkZWZpbml0aW9ucyBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1BBR0VfSAorI2RlZmluZSBfQVNNX1BBR0VfSAorCisjaW5jbHVkZSA8bGludXgvY29uc3QuaD4KKworLyogIFRoaXMgaXMgcHJvYmFibHkgbm90IHRoZSBtb3N0IGdyYWNlZnVsIHdheSB0byBoYW5kbGUgdGhpcy4gICovCisKKyNpZmRlZiBDT05GSUdfUEFHRV9TSVpFXzRLQgorI2RlZmluZSBQQUdFX1NISUZUIDEyCisjZGVmaW5lIEhFWEFHT05fTDFfUFRFX1NJWkUgX19IVk1fUERFX1NfNEtCCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfMTZLQgorI2RlZmluZSBQQUdFX1NISUZUIDE0CisjZGVmaW5lIEhFWEFHT05fTDFfUFRFX1NJWkUgX19IVk1fUERFX1NfMTZLQgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFHRV9TSVpFXzY0S0IKKyNkZWZpbmUgUEFHRV9TSElGVCAxNgorI2RlZmluZSBIRVhBR09OX0wxX1BURV9TSVpFIF9fSFZNX1BERV9TXzY0S0IKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBR0VfU0laRV8yNTZLQgorI2RlZmluZSBQQUdFX1NISUZUIDE4CisjZGVmaW5lIEhFWEFHT05fTDFfUFRFX1NJWkUgX19IVk1fUERFX1NfMjU2S0IKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBR0VfU0laRV8xTUIKKyNkZWZpbmUgUEFHRV9TSElGVCAyMAorI2RlZmluZSBIRVhBR09OX0wxX1BURV9TSVpFIF9fSFZNX1BERV9TXzFNQgorI2VuZGlmCisKKy8qCisgKiAgVGhlc2Ugc2hvdWxkIGJlIGRlZmluZWQgaW4gaHVnZXRsYi5oLCBidXQgYXBwYXJlbnRseSBub3QuCisgKiAgIkh1Z2UiIGZvciB1cyBzaG91bGQgYmUgNE1CIG9yIDE2TUIsIHdoaWNoIGFyZSBib3RoIHJlcHJlc2VudGVkCisgKiAgaW4gTDEgUFRFJ3MuICBSaWdodCBub3csIGl0J3Mgc2V0IHVwIGZvciA0TUIuCisgKi8KKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisjZGVmaW5lIEhQQUdFX1NISUZUIDIyCisjZGVmaW5lIEhQQUdFX1NJWkUgKDFVTCA8PCBIUEFHRV9TSElGVCkKKyNkZWZpbmUgSFBBR0VfTUFTSyAofihIUEFHRV9TSVpFLTEpKQorI2RlZmluZSBIVUdFVExCX1BBR0VfT1JERVIgKEhQQUdFX1NISUZULVBBR0VfU0hJRlQpCisjZGVmaW5lIEhWTV9IVUdFUEFHRV9TSVpFIDB4NQorI2VuZGlmCisKKyNkZWZpbmUgUEFHRV9TSVpFICAoMVVMIDw8IFBBR0VfU0hJRlQpCisjZGVmaW5lIFBBR0VfTUFTSyAgKH4oKDEgPDwgUEFHRV9TSElGVCkgLSAxKSkKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qCisgKiBUaGlzIGlzIGZvciBQRk5fRE9XTiwgd2hpY2ggbW0uaCBuZWVkcy4gIFNlZW1zIHRoZSByaWdodCBwbGFjZSB0byBwdWxsIGl0IGluLgorICovCisjaW5jbHVkZSA8bGludXgvcGZuLmg+CisKKy8qCisgKiBXZSBpbXBsZW1lbnQgYSB0d28tbGV2ZWwgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHBhZ2UgdGFibGUgc3RydWN0dXJlLgorICogTnVsbCBpbnRlcm1lZGlhdGUgcGFnZSB0YWJsZSBsZXZlbCAocG1kLCBwdWQpIGRlZmluaXRpb25zIHdpbGwgY29tZSBmcm9tCisgKiBhc20tZ2VuZXJpYy9wYWdldGFibGUtbm9wbWQuaCBhbmQgYXNtLWdlbmVyaWMvcGFnZXRhYmxlLW5vcHVkLmgKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHB0ZTsgfSBwdGVfdDsKK3R5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ2Q7IH0gcGdkX3Q7Cit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdwcm90OyB9IHBncHJvdF90OwordHlwZWRlZiBzdHJ1Y3QgcGFnZSAqcGd0YWJsZV90OworCisjZGVmaW5lIHB0ZV92YWwoeCkgICAgICgoeCkucHRlKQorI2RlZmluZSBwZ2RfdmFsKHgpICAgICAoKHgpLnBnZCkKKyNkZWZpbmUgcGdwcm90X3ZhbCh4KSAgKCh4KS5wZ3Byb3QpCisjZGVmaW5lIF9fcHRlKHgpICAgICAgICgocHRlX3QpIHsgKHgpIH0pCisjZGVmaW5lIF9fcGdkKHgpICAgICAgICgocGdkX3QpIHsgKHgpIH0pCisjZGVmaW5lIF9fcGdwcm90KHgpICAgICgocGdwcm90X3QpIHsgKHgpIH0pCisKKy8qCisgKiBXZSBuZWVkIGEgX19wYSBhbmQgYSBfX3ZhIHJvdXRpbmUgZm9yIGtlcm5lbCBzcGFjZS4KKyAqIE1JUFMgc2F5cyB0aGV5J3JlIG9ubHkgdXNlZCBkdXJpbmcgbWVtX2luaXQuCisgKiBhbHNvLCBjaGVjayBpZiB3ZSBuZWVkIGEgUEhZU19PRkZTRVQuCisgKi8KKyNkZWZpbmUgX19wYSh4KSAoKHVuc2lnbmVkIGxvbmcpKHgpIC0gUEFHRV9PRkZTRVQpCisjZGVmaW5lIF9fdmEoeCkgKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh4KSArIFBBR0VfT0ZGU0VUKSkKKworLyogVGhlICJwYWdlIGZyYW1lIiBkZXNjcmlwdG9yIGlzIGRlZmluZWQgaW4gbGludXgvbW0uaCAqLworc3RydWN0IHBhZ2U7CisKKy8qIFJldHVybnMgcGFnZSBmcmFtZSBkZXNjcmlwdG9yIGZvciB2aXJ0dWFsIGFkZHJlc3MuICovCisjZGVmaW5lIHZpcnRfdG9fcGFnZShrYWRkcikgcGZuX3RvX3BhZ2UoUEZOX0RPV04oX19wYShrYWRkcikpKQorCisvKiBEZWZhdWx0IHZtIGFyZWEgYmVoYXZpb3IgaXMgbm9uLWV4ZWN1dGFibGUuICAqLworI2RlZmluZSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MgKFZNX1JFQUQgfCBWTV9XUklURSB8IFwKKwkJCQlWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDKQorCisjZGVmaW5lIHBmbl92YWxpZChwZm4pICgocGZuKSA8IG1heF9tYXBucikKKyNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKSBwZm5fdmFsaWQoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKKworLyogIE5lZWQgdG8gbm90IHVzZSBhIGRlZmluZSBmb3IgbGluZXNpemU7IG1heSBtb3ZlIHRoaXMgdG8gYW5vdGhlciBmaWxlLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9wYWdlKHZvaWQgKnBhZ2UpCit7CisJLyogIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBvbiBwYWdlcyB3aXRoIEwxIFdCIGNhY2hlICovCisJYXNtIHZvbGF0aWxlKAorCQkiCWxvb3AwKDFmLCUxKTtcbiIKKwkJIjE6CXsgZGN6ZXJvYSglMCk7XG4iCisJCSIJICAlMCA9IGFkZCglMCwjMzIpOyB9OmVuZGxvb3AwXG4iCisJCTogIityIiAocGFnZSkKKwkJOiAiciIgKFBBR0VfU0laRS8zMikKKwkJOiAibGMwIiwgInNhMCIsICJtZW1vcnkiCisJKTsKK30KKworI2RlZmluZSBjb3B5X3BhZ2UodG8sIGZyb20pCW1lbWNweSgodG8pLCAoZnJvbSksIFBBR0VfU0laRSkKKworLyoKKyAqIFVuZGVyIGFzc3VtcHRpb24gdGhhdCBrZXJuZWwgYWx3YXlzICJzZWVzIiB1c2VyIG1hcC4uLgorICovCisjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKKyNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQorCisvKgorICogcGFnZV90b19waHlzIC0gY29udmVydCBwYWdlIHRvIHBoeXNpY2FsIGFkZHJlc3MKKyAqIEBwYWdlIC0gcG9pbnRlciB0byBwYWdlIGVudHJ5IGluIG1lbV9tYXAKKyAqLworI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkgICAgICAocGFnZV90b19wZm4ocGFnZSkgPDwgUEFHRV9TSElGVCkKKworLyoKKyAqIEZvciBwb3J0IHRvIEhleGFnb24gVmlydHVhbCBNYWNoaW5lLCBNQVlCRSB3ZSBjaGVjayBmb3IgYXR0ZW1wdHMKKyAqIHRvIHJlZmVyZW5jZSByZXNlcnZlZCBIVk0gc3BhY2UsIGJ1dCBpbiBhbnkgY2FzZSwgdGhlIFZNIHdpbGwgYmUKKyAqIHByb3RlY3RlZC4KKyAqLworI2RlZmluZSBrZXJuX2FkZHJfdmFsaWQoYWRkcikgICAoMSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgorLyogWFhYIFRvZG86IGltcGxlbWVudCBhc3NlbWJseS1vcHRpbWl6ZWQgdmVyc2lvbiBvZiBnZXRvcmRlci4gKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9nZXRvcmRlci5oPgorCisjZW5kaWYgLyogaWZkZWYgX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogaWZkZWYgX19LRVJORUxfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wYXJhbS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1MzQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wYXJhbS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fUEFSQU1fSAorI2RlZmluZSBfQVNNX1BBUkFNX0gKKworI2RlZmluZSBFWEVDX1BBR0VTSVpFCTE2Mzg0CisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYXJhbS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjkxMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fUEVSRl9FVkVOVF9ICisjZGVmaW5lIF9BU01fUEVSRl9FVkVOVF9ICisKKyNkZWZpbmUgUEVSRl9FVkVOVF9JTkRFWF9PRkZTRVQJMAorCisjZW5kaWYgLyogX0FTTV9QRVJGX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wZ2FsbG9jLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGdhbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDQzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGdhbGxvYy5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogUGFnZSB0YWJsZSBzdXBwb3J0IGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fUEdBTExPQ19ICisjZGVmaW5lIF9BU01fUEdBTExPQ19ICisKKyNpbmNsdWRlIDxhc20vbWVtLWxheW91dC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2RlZmluZSBjaGVja19wZ3RfY2FjaGUoKSBkbyB7fSB3aGlsZSAoMCkKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBrbWFwX2dlbmVyYXRpb247CisKKy8qCisgKiBQYWdlIHRhYmxlIGNyZWF0aW9uIGludGVyZmFjZQorICovCitzdGF0aWMgaW5saW5lIHBnZF90ICpwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcGdkX3QgKnBnZDsKKworCXBnZCA9IChwZ2RfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisKKwkvKgorCSAqIFRoZXJlIG1heSBiZSBiZXR0ZXIgd2F5cyB0byBkbyB0aGlzLCBidXQgdG8gZW5zdXJlCisJICogdGhhdCBuZXcgYWRkcmVzcyBzcGFjZXMgYWx3YXlzIGNvbnRhaW4gdGhlIGtlcm5lbAorCSAqIGJhc2UgbWFwcGluZywgYW5kIHRvIGVuc3VyZSB0aGF0IHRoZSB1c2VyIGFyZWEgaXMKKwkgKiBpbml0aWFsbHkgbWFya2VkIGludmFsaWQsIGluaXRpYWxpemUgdGhlIG5ldyBtYXAKKwkgKiBtYXAgd2l0aCBhIGNvcHkgb2YgdGhlIGtlcm5lbCdzIHBlcnNpc3RlbnQgbWFwLgorCSAqLworCisJbWVtY3B5KHBnZCwgc3dhcHBlcl9wZ19kaXIsIFBUUlNfUEVSX1BHRCpzaXplb2YocGdkX3QgKikpOworCW1tLT5jb250ZXh0LmdlbmVyYXRpb24gPSBrbWFwX2dlbmVyYXRpb247CisKKwkvKiBQaHlzaWNhbCB2ZXJzaW9uIGlzIHdoYXQgaXMgcGFzc2VkIHRvIHZpcnR1YWwgbWFjaGluZSBvbiBzd2l0Y2ggKi8KKwltbS0+Y29udGV4dC5wdGJhc2UgPSBfX3BhKHBnZCk7CisKKwlyZXR1cm4gcGdkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCit7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwZ2QpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBwYWdlICpwdGU7CisKKwlwdGUgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQgfCBfX0dGUF9aRVJPKTsKKworCWlmIChwdGUpCisJCXBndGFibGVfcGFnZV9jdG9yKHB0ZSk7CisKKwlyZXR1cm4gcHRlOworfQorCisvKiBfa2VybmVsIHZhcmlhbnQgZ2V0cyB0byB1c2UgYSBkaWZmZXJlbnQgYWxsb2NhdG9yICovCitzdGF0aWMgaW5saW5lIHB0ZV90ICpwdGVfYWxsb2Nfb25lX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJZ2ZwX3QgZmxhZ3MgPSAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFUEVBVCB8IF9fR0ZQX1pFUk87CisJcmV0dXJuIChwdGVfdCAqKSBfX2dldF9mcmVlX3BhZ2UoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwdGUpCit7CisJcGd0YWJsZV9wYWdlX2R0b3IocHRlKTsKKwlfX2ZyZWVfcGFnZShwdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLAorCQkJCXBndGFibGVfdCBwdGUpCit7CisJLyoKKwkgKiBDb252ZW5pZW50bHksIHplcm8gaW4gMyBMU0IgbWVhbnMgaW5kaXJlY3QgNEsgcGFnZSB0YWJsZS4KKwkgKiBOb3Qgc28gY29udmVuaWVudCB3aGVuIHlvdSdyZSB0cnlpbmcgdG8gdmFyeSB0aGUgcGFnZSBzaXplLgorCSAqLworCXNldF9wbWQocG1kLCBfX3BtZCgoKHVuc2lnbmVkIGxvbmcpcGFnZV90b19wZm4ocHRlKSA8PCBQQUdFX1NISUZUKSB8CisJCUhFWEFHT05fTDFfUFRFX1NJWkUpKTsKK30KKworLyoKKyAqIE90aGVyIGFyY2hpdGVjdHVyZXMgc2VlbSB0byBoYXZlIHdheXMgb2YgbWFraW5nIGFsbCBwcm9jZXNzZXMKKyAqIHNoYXJlIHRoZSBzYW1lIHBtZCdzIGZvciB0aGVpciBrZXJuZWwgbWFwcGluZ3MsIGJ1dCB0aGUgdjAuMworICogSGV4YWdvbiBWTSBzcGVjIGhhcyBhICJtb25vbGl0aGljIiBMMSB0YWJsZSBmb3IgdXNlciBhbmQga2VybmVsCisgKiBzZWdtZW50cy4gIFdlIHRyYWNrICJnZW5lcmF0aW9ucyIgb2YgdGhlIGtlcm5lbCBtYXAgdG8gbWluaW1pemUKKyAqIG92ZXJoZWFkLCBhbmQgdXBkYXRlIHRoZSAic2xhdmUiIGNvcGllcyBvZiB0aGUga2VybmVsIG1hcHBpbmdzCisgKiBhcyBwYXJ0IG9mIHN3aXRjaF9tbS4gIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdG8gdXBkYXRlIHRoZQorICoga2VybmVsIG1hcCBvZiB0aGUgYWN0aXZlIHRocmVhZCB3aG8ncyBjYWxsaW5nIHBtZF9wb3B1bGF0ZV9rZXJuZWwuLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHBtZF9wb3B1bGF0ZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsCisJCQkJICAgICAgIHB0ZV90ICpwdGUpCit7CisJZXh0ZXJuIHNwaW5sb2NrX3Qga21hcF9nZW5fbG9jazsKKwlwbWRfdCAqcHBtZDsKKwlpbnQgcG1kaW5kZXg7CisKKwlzcGluX2xvY2soJmttYXBfZ2VuX2xvY2spOworCWttYXBfZ2VuZXJhdGlvbisrOworCW1tLT5jb250ZXh0LmdlbmVyYXRpb24gPSBrbWFwX2dlbmVyYXRpb247CisJY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LmdlbmVyYXRpb24gPSBrbWFwX2dlbmVyYXRpb247CisJc3Bpbl91bmxvY2soJmttYXBfZ2VuX2xvY2spOworCisJc2V0X3BtZChwbWQsIF9fcG1kKCgodW5zaWduZWQgbG9uZylfX3BhKHB0ZSkpIHwgSEVYQUdPTl9MMV9QVEVfU0laRSkpOworCisJLyoKKwkgKiBOb3cgdGhlICJzbGF2ZSIgY29weSBvZiB0aGUgY3VycmVudCB0aHJlYWQuCisJICogVGhpcyBpcyBwb2ludGVyIGFyaXRobWV0aWMsIG5vdCBieXRlIGFkZHJlc3NlcyEKKwkgKi8KKwlwbWRpbmRleCA9IChwZ2RfdCAqKXBtZCAtIG1tLT5wZ2Q7CisJcHBtZCA9IChwbWRfdCAqKWN1cnJlbnQtPmFjdGl2ZV9tbS0+cGdkICsgcG1kaW5kZXg7CisJc2V0X3BtZChwcG1kLCBfX3BtZCgoKHVuc2lnbmVkIGxvbmcpX19wYShwdGUpKSB8IEhFWEFHT05fTDFfUFRFX1NJWkUpKTsKKwlpZiAocG1kaW5kZXggPiBtYXhfa2VybmVsX3NlZykKKwkJbWF4X2tlcm5lbF9zZWcgPSBwbWRpbmRleDsKK30KKworI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIsIHB0ZSwgYWRkcikJCVwKK2RvIHsJCQkJCQlcCisJcGd0YWJsZV9wYWdlX2R0b3IoKHB0ZSkpOwkJXAorCXRsYl9yZW1vdmVfcGFnZSgodGxiKSwgKHB0ZSkpOwkJXAorfSB3aGlsZSAoMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BndGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTYxOWJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIFBhZ2UgdGFibGUgc3VwcG9ydCBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1BHVEFCTEVfSAorI2RlZmluZSBfQVNNX1BHVEFCTEVfSAorCisvKgorICogUGFnZSB0YWJsZSBkZWZpbml0aW9ucyBmb3IgUXVhbGNvbW0gSGV4YWdvbiBwcm9jZXNzb3IuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLW5vcG1kLmg+CisKKy8qIEEgaGFuZHkgdGhpbmcgdG8gaGF2ZSBpZiBvbmUgaGFzIHRoZSBSQU0uIERlY2xhcmVkIGluIGhlYWQuUyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZW1wdHlfemVyb19wYWdlOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgemVyb19wYWdlX21hc2s7CisKKy8qCisgKiBUaGUgUFRFIG1vZGVsIGRlc2NyaWJlZCBoZXJlIGlzIHRoYXQgb2YgdGhlIEhleGFnb24gVmlydHVhbCBNYWNoaW5lLAorICogd2hpY2ggYXV0b25vbW91c2x5IHdhbGtzIDItbGV2ZWwgcGFnZSB0YWJsZXMuICBBdCBhIGxvd2VyIGxldmVsLCB3ZQorICogYWxzbyBkZXNjcmliZSB0aGUgUklTQ2lzaCBzb2Z0d2FyZS1sb2FkZWQgVExCIGVudHJ5IHN0cnVjdHVyZSBvZgorICogdGhlIHVuZGVybHlpbmcgSGV4YWdvbiBwcm9jZXNzb3IuIEEga2VybmVsIGJ1aWx0IHRvIHJ1biBvbiB0aGUKKyAqIHZpcnR1YWwgbWFjaGluZSBoYXMgbm8gbmVlZCB0byBrbm93IGFib3V0IHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlLgorICovCisjaW5jbHVkZSA8YXNtL3ZtX21tdS5oPgorCisvKgorICogVG8gbWF4aW1pemUgdGhlIGNvbWZvcnQgbGV2ZWwgZm9yIHRoZSBQVEUgbWFuaXB1bGF0aW9uIG1hY3JvcywKKyAqIGRlZmluZSB0aGUgIndlbGwga25vd24iIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBiaXRzLgorICovCisjZGVmaW5lIF9QQUdFX1JFQUQJX19IVk1fUFRFX1IKKyNkZWZpbmUgX1BBR0VfV1JJVEUJX19IVk1fUFRFX1cKKyNkZWZpbmUgX1BBR0VfRVhFQ1VURQlfX0hWTV9QVEVfWAorI2RlZmluZSBfUEFHRV9VU0VSCV9fSFZNX1BURV9VCisKKy8qCisgKiBXZSBoYXZlIGEgdG90YWwgb2YgNCAic29mdCIgYml0cyBhdmFpbGFibGUgaW4gdGhlIGFic3RyYWN0IFBURS4KKyAqIFRoZSB0d28gbWFuZGF0b3J5IHNvZnR3YXJlIGJpdHMgYXJlIERpcnR5IGFuZCBBY2Nlc3NlZC4KKyAqIFRvIG1ha2Ugbm9ubGluZWFyIHN3YXAgd29yayBhY2NvcmRpbmcgdG8gdGhlIG1vcmUgcmVjZW50CisgKiBtb2RlbCwgd2Ugd2FudCBhIGxvdyBvcmRlciAiUHJlc2VudCIgYml0IHRvIGluZGljYXRlIHdoZXRoZXIKKyAqIHRoZSBQVEUgZGVzY3JpYmVzIE1NVSBwcm9ncmFtbWluZyBvciBzd2FwIHNwYWNlLgorICovCisjZGVmaW5lIF9QQUdFX1BSRVNFTlQJKDE8PDApCisjZGVmaW5lIF9QQUdFX0RJUlRZCSgxPDwxKQorI2RlZmluZSBfUEFHRV9BQ0NFU1NFRAkoMTw8MikKKworLyoKKyAqIF9QQUdFX0ZJTEUgaXMgb25seSBtZWFuaW5nZnVsIGlmIF9QQUdFX1BSRVNFTlQgaXMgZmFsc2UsIHdoaWxlCisgKiBfUEFHRV9ESVJUWSBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgX1BBR0VfUFJFU0VOVCBpcyB0cnVlLgorICogU28gd2UgY2FuIG92ZXJsb2FkIHRoZSBiaXQuLi4KKyAqLworI2RlZmluZSBfUEFHRV9GSUxFCV9QQUdFX0RJUlRZIC8qIHNldDogIHBhZ2VjYWNoZSwgdW5zZXQgPSBzd2FwICovCisKKy8qCisgKiBGb3Igbm93LCBsZXQncyBzYXkgdGhhdCBWYWxpZCBhbmQgUHJlc2VudCBhcmUgdGhlIHNhbWUgdGhpbmcuCisgKiBBbHRlcm5hdGl2ZWx5LCB3ZSBjb3VsZCBzYXkgdGhhdCBpdCdzIHRoZSAib3IiIG9mIFIsIFcsIGFuZCBYCisgKiBwZXJtaXNzaW9ucy4KKyAqLworI2RlZmluZSBfUEFHRV9WQUxJRAlfUEFHRV9QUkVTRU5UCisKKy8qCisgKiBXZSdyZSBub3QgZGVmaW5pbmcgX1BBR0VfR0xPQkFMIGhlcmUsIHNpbmNlIHRoZXJlJ3Mgbm8gY29uY2VwdAorICogb2YgZ2xvYmFsIHBhZ2VzIG9yIEFTSURzIGV4cG9zZWQgdG8gdGhlIEhleGFnb24gVmlydHVhbCBNYWNoaW5lLAorICogYW5kIHdlIHdhbnQgdG8gdXNlIHRoZSBzYW1lIHBhZ2UgdGFibGUgc3RydWN0dXJlcyBhbmQgbWFjcm9zIGluCisgKiB0aGUgbmF0aXZlIGtlcm5lbCBhcyB3ZSBkbyBpbiB0aGUgdmlydHVhbCBtYWNoaW5lIGtlcm5lbC4KKyAqIFNvIHdlJ2xsIHB1dCB1cCB3aXRoIGEgYml0IG9mIGluZWZmaWNpZW5jeSBmb3Igbm93Li4uCisgKi8KKworLyoKKyAqIFRvcCAiRk9VUlRIIiBsZXZlbCAocGdkKSwgd2hpY2ggZm9yIHRoZSBIZXhhZ29uIFZNIGlzIHJlYWxseQorICogb25seSB0aGUgc2Vjb25kIGZyb20gdGhlIGJvdHRvbSwgcGdkIGFuZCBwdWQgYm90aCBiZWluZyBjb2xsYXBzZWQuCisgKiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgNE1CIG9mIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSwgNEsgb2YgdGFibGUKKyAqIHRodXMgbWFwcyB0aGUgZnVsbCA0R0IuCisgKi8KKyNkZWZpbmUgUEdESVJfU0hJRlQgMjIKKyNkZWZpbmUgUFRSU19QRVJfUEdEIDEwMjQKKworI2RlZmluZSBQR0RJUl9TSVpFICgxVUwgPDwgUEdESVJfU0hJRlQpCisjZGVmaW5lIFBHRElSX01BU0sgKH4oUEdESVJfU0laRS0xKSkKKworI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfNEtCCisjZGVmaW5lIFBUUlNfUEVSX1BURSAxMDI0CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfMTZLQgorI2RlZmluZSBQVFJTX1BFUl9QVEUgMjU2CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfNjRLQgorI2RlZmluZSBQVFJTX1BFUl9QVEUgNjQKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBR0VfU0laRV8yNTZLQgorI2RlZmluZSBQVFJTX1BFUl9QVEUgMTYKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBR0VfU0laRV8xTUIKKyNkZWZpbmUgUFRSU19QRVJfUFRFIDQKKyNlbmRpZgorCisvKiAgQW55IGJpZ2dlciBhbmQgdGhlIFBURSBkaXNhcHBlYXJzLiAgKi8KKyNkZWZpbmUgcGdkX0VSUk9SKGUpIFwKKwlwcmludGsoS0VSTl9FUlIgIiVzOiVkOiBiYWQgcGdkICUwOGx4LlxuIiwgX19GSUxFX18sIF9fTElORV9fLFwKKwkJcGdkX3ZhbChlKSkKKworLyoKKyAqIFBhZ2UgUHJvdGVjdGlvbiBDb25zdGFudHMuIEluY2x1ZGVzIChpbiB0aGlzIHZhcmlhbnQpIGNhY2hlIGF0dHJpYnV0ZXMuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIF9kZmx0X2NhY2hlX2F0dDsKKworI2RlZmluZSBQQUdFX05PTkUJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBcCisJCQkJX2RmbHRfY2FjaGVfYXR0KQorI2RlZmluZSBQQUdFX1JFQURPTkxZCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgXAorCQkJCV9QQUdFX1JFQUQgfCBfUEFHRV9FWEVDVVRFIHwgX2RmbHRfY2FjaGVfYXR0KQorI2RlZmluZSBQQUdFX0NPUFkJUEFHRV9SRUFET05MWQorI2RlZmluZSBQQUdFX0VYRUMJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBcCisJCQkJX1BBR0VfUkVBRCB8IF9QQUdFX0VYRUNVVEUgfCBfZGZsdF9jYWNoZV9hdHQpCisjZGVmaW5lIFBBR0VfQ09QWV9FWEVDCVBBR0VfRVhFQworI2RlZmluZSBQQUdFX1NIQVJFRAlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IF9QQUdFX1JFQUQgfCBcCisJCQkJX1BBR0VfRVhFQ1VURSB8IF9QQUdFX1dSSVRFIHwgX2RmbHRfY2FjaGVfYXR0KQorI2RlZmluZSBQQUdFX0tFUk5FTAlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUkVBRCB8IFwKKwkJCQlfUEFHRV9XUklURSB8IF9QQUdFX0VYRUNVVEUgfCBfZGZsdF9jYWNoZV9hdHQpCisKKworLyoKKyAqIEFsaWFzZXMgZm9yIG1hcHBpbmcgbW1hcCgpIHByb3RlY3Rpb24gYml0cyB0byBwYWdlIHByb3RlY3Rpb25zLgorICogVGhlc2UgZ2V0IHVzZWQgZm9yIHN0YXRpYyBpbml0aWFsaXphdGlvbiwgc28gdXNpbmcgdGhlIF9kZmx0X2NhY2hlX2F0dAorICogdmFyaWFibGUgZm9yIHRoZSBkZWZhdWx0IGNhY2hlIGF0dHJpYnV0ZSBpc24ndCB3b3JrYWJsZS4gSWYgdGhlCisgKiBkZWZhdWx0IGdldHMgY2hhbmdlZCBhdCBib290IHRpbWUsIHRoZSBib290IG9wdGlvbiBjb2RlIGhhcyB0bworICogdXBkYXRlIGRhdGEgc3RydWN0dXJlcyBsaWtlIHRoZSBwcm90YWN0aW9uX21hcFtdIGFycmF5LgorICovCisjZGVmaW5lIENBQ0hFREVGCShDQUNIRV9ERUZBVUxUIDw8IDYpCisKKy8qIFByaXZhdGUgKGNvcHktb24td3JpdGUpIHBhZ2UgcHJvdGVjdGlvbnMuICovCisjZGVmaW5lIF9fUDAwMCBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IENBQ0hFREVGKQorI2RlZmluZSBfX1AwMDEgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBfUEFHRV9SRUFEIHwgQ0FDSEVERUYpCisjZGVmaW5lIF9fUDAxMCBfX1AwMDAJLyogV3JpdGUtb25seSBjb3B5LW9uLXdyaXRlICovCisjZGVmaW5lIF9fUDAxMSBfX1AwMDEJLyogUmVhZC9Xcml0ZSBjb3B5LW9uLXdyaXRlICovCisjZGVmaW5lIF9fUDEwMCBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IFwKKwkJCV9QQUdFX0VYRUNVVEUgfCBDQUNIRURFRikKKyNkZWZpbmUgX19QMTAxIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgX1BBR0VfRVhFQ1VURSB8IFwKKwkJCV9QQUdFX1JFQUQgfCBDQUNIRURFRikKKyNkZWZpbmUgX19QMTEwIF9fUDEwMAkvKiBXcml0ZS9leGVjdXRlIGNvcHktb24td3JpdGUgKi8KKyNkZWZpbmUgX19QMTExIF9fUDEwMQkvKiBSZWFkL1dyaXRlL0V4ZWN1dGUsIGNvcHktb24td3JpdGUgKi8KKworLyogU2hhcmVkIHBhZ2UgcHJvdGVjdGlvbnMuICovCisjZGVmaW5lIF9fUzAwMCBfX1AwMDAKKyNkZWZpbmUgX19TMDAxIF9fUDAwMQorI2RlZmluZSBfX1MwMTAgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBcCisJCQlfUEFHRV9XUklURSB8IENBQ0hFREVGKQorI2RlZmluZSBfX1MwMTEgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBfUEFHRV9SRUFEIHwgXAorCQkJX1BBR0VfV1JJVEUgfCBDQUNIRURFRikKKyNkZWZpbmUgX19TMTAwIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgXAorCQkJX1BBR0VfRVhFQ1VURSB8IENBQ0hFREVGKQorI2RlZmluZSBfX1MxMDEgX19QMTAxCisjZGVmaW5lIF9fUzExMCBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IFwKKwkJCV9QQUdFX0VYRUNVVEUgfCBfUEFHRV9XUklURSB8IENBQ0hFREVGKQorI2RlZmluZSBfX1MxMTEgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBfUEFHRV9SRUFEIHwgXAorCQkJX1BBR0VfRVhFQ1VURSB8IF9QQUdFX1dSSVRFIHwgQ0FDSEVERUYpCisKK2V4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltQVFJTX1BFUl9QR0RdOyAgLyogbG9jYXRlZCBpbiBoZWFkLlMgKi8KKworLyogU2VlbXMgdG8gYmUgemVybyBldmVuIGluIGFyY2hpdGVjdHVyZXMgd2hlcmUgdGhlIHplcm8gcGFnZSBpcyBmaXJld2FsbGVkPyAqLworI2RlZmluZSBGSVJTVF9VU0VSX0FERFJFU1MgMAorI2RlZmluZSBwdGVfc3BlY2lhbChwdGUpCTAKKyNkZWZpbmUgcHRlX21rc3BlY2lhbChwdGUpCShwdGUpCisKKy8qICBIVUdFVExCIG5vdCB3b3JraW5nIGN1cnJlbnRseSAgKi8KKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisjZGVmaW5lIHB0ZV9ta2h1Z2UocHRlKSBfX3B0ZSgocHRlX3ZhbChwdGUpICYgfjB4MykgfCBIVk1fSFVHRVBBR0VfU0laRSkKKyNlbmRpZgorCisvKgorICogRm9yIG5vdywgYXNzdW1lIHRoYXQgaGlnaGVyLWxldmVsIGNvZGUgd2lsbCBkbyBUTEIvTU1VIGludmFsaWRhdGlvbnMKKyAqIGFuZCBkb24ndCBpbnNlcnQgdGhhdCBvdmVyaGVhZCBpbnRvIHRoaXMgbG93LWxldmVsIGZ1bmN0aW9uLgorICovCitleHRlcm4gdm9pZCBzeW5jX2ljYWNoZV9kY2FjaGUocHRlX3QgcHRlKTsKKworI2RlZmluZSBwdGVfcHJlc2VudF9leGVjX3VzZXIocHRlKSBcCisJKChwdGVfdmFsKHB0ZSkgJiAoX1BBR0VfRVhFQ1VURSB8IF9QQUdFX1VTRVIpKSA9PSBcCisJKF9QQUdFX0VYRUNVVEUgfCBfUEFHRV9VU0VSKSkKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKK3sKKwkvKiAgc2hvdWxkIHJlYWxseSBiZSB1c2luZyBwdGVfZXhlYywgaWYgaXQgd2VyZW4ndCBkZWNsYXJlZCBsYXRlci4gKi8KKwlpZiAocHRlX3ByZXNlbnRfZXhlY191c2VyKHB0ZXZhbCkpCisJCXN5bmNfaWNhY2hlX2RjYWNoZShwdGV2YWwpOworCisJKnB0ZXAgPSBwdGV2YWw7Cit9CisKKy8qCisgKiBGb3IgdGhlIEhleGFnb24gVmlydHVhbCBNYWNoaW5lIE1NVSAob3IgaXRzIGVtdWxhdGlvbiksIGEgbnVsbC9pbnZhbGlkCisgKiBMMSBQVEUgKFBNRC9QR0QpIGhhcyA3IGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiBGb3IgdGhlIEwyIFBURQorICogKExpbnV4IFBURSksIHRoZSBrZXkgaXMgdG8gaGF2ZSBiaXRzIDExLi45IGFsbCB6ZXJvLiAgV2UnZCB1c2UgMHg3CisgKiBhcyBhIHVuaXZlcnNhbCBudWxsIGVudHJ5LCBidXQgc29tZSBvZiB0aG9zZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzCisgKiBhcmUgaW50ZXJwcmV0ZWQgYnkgc29mdHdhcmUuCisgKi8KKyNkZWZpbmUgX05VTExfUE1ECTB4NworI2RlZmluZSBfTlVMTF9QVEUJMHgwCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbWRfY2xlYXIocG1kX3QgKnBtZF9lbnRyeV9wdHIpCit7CisJIHBtZF92YWwoKnBtZF9lbnRyeV9wdHIpID0gX05VTExfUE1EOworfQorCisvKgorICogQ29udmVuaWVudGx5LCBhIG51bGwgUFRFIHZhbHVlIGlzIGludmFsaWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQlwdGVfdCAqcHRlcCkKK3sKKwlwdGVfdmFsKCpwdGVwKSA9IF9OVUxMX1BURTsKK30KKworI2lmZGVmIE5FRURfUE1EX0lOREVYX0RFU1BJVEVfQkVJTkdfMl9MRVZFTAorLyoqCisgKiBwbWRfaW5kZXggLSByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgaW4gdGhlIFBNRCBwYWdlCisgKiB3aGljaCB3b3VsZCBjb250cm9sIHRoZSBnaXZlbiB2aXJ0dWFsIGFkZHJlc3MKKyAqLworI2RlZmluZSBwbWRfaW5kZXgoYWRkcmVzcykgKCgoYWRkcmVzcykgPj4gUE1EX1NISUZUKSAmIChQVFJTX1BFUl9QTUQtMSkpCisKKyNlbmRpZgorCisvKioKKyAqIHBnZF9pbmRleCAtIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgUEdEIHBhZ2UKKyAqIHdoaWNoIHdvdWxkIGNvbnRyb2wgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcworICoKKyAqIFRoaXMgcmV0dXJucyB0aGUgKmluZGV4KiBmb3IgdGhlIGFkZHJlc3MgaW4gdGhlIHBnZF90CisgKi8KKyNkZWZpbmUgcGdkX2luZGV4KGFkZHJlc3MpICgoKGFkZHJlc3MpID4+IFBHRElSX1NISUZUKSAmIChQVFJTX1BFUl9QR0QtMSkpCisKKy8qCisgKiBwZ2Rfb2Zmc2V0IC0gZmluZCBhbiBvZmZzZXQgaW4gYSBwYWdlLXRhYmxlLWRpcmVjdG9yeQorICovCisjZGVmaW5lIHBnZF9vZmZzZXQobW0sIGFkZHIpICgobW0pLT5wZ2QgKyBwZ2RfaW5kZXgoYWRkcikpCisKKy8qCisgKiBwZ2Rfb2Zmc2V0X2sgLSBnZXQga2VybmVsIChpbml0X21tKSBwZ2QgZW50cnkgcG9pbnRlciBmb3IgYWRkcgorICovCisjZGVmaW5lIHBnZF9vZmZzZXRfayhhZGRyZXNzKSBwZ2Rfb2Zmc2V0KCZpbml0X21tLCBhZGRyZXNzKQorCisvKioKKyAqIHBtZF9ub25lIC0gY2hlY2sgaWYgcG1kX2VudHJ5IGlzIG1hcHBlZAorICogQHBtZF9lbnRyeTogIHBtZCBlbnRyeQorICoKKyAqIE1JUFMgY2hlY2tzIGl0IGFnYWluc3QgdGhhdCAiaW52YWxpZCBwdGUgdGFibGUiIHRoaW5nLgorICovCitzdGF0aWMgaW5saW5lIGludCBwbWRfbm9uZShwbWRfdCBwbWQpCit7CisJcmV0dXJuIHBtZF92YWwocG1kKSA9PSBfTlVMTF9QTUQ7Cit9CisKKy8qKgorICogcG1kX3ByZXNlbnQgLSBpcyB0aGVyZSBhIHBhZ2UgdGFibGUgYmVoaW5kIHRoaXM/CisgKiBFc3NlbnRpYWxseSB0aGUgaW52ZXJzZSBvZiBwbWRfbm9uZS4gIFdlIG1heWJlCisgKiBzYXZlIGFuIGlubGluZSBpbnN0cnVjdGlvbiBieSBkZWZpbmluZyBpdCB0aGlzCisgKiB3YXksIGluc3RlYWQgb2Ygc2ltcGx5ICIhcG1kX25vbmUiLgorICovCitzdGF0aWMgaW5saW5lIGludCBwbWRfcHJlc2VudChwbWRfdCBwbWQpCit7CisJcmV0dXJuIHBtZF92YWwocG1kKSAhPSAodW5zaWduZWQgbG9uZylfTlVMTF9QTUQ7Cit9CisKKy8qKgorICogcG1kX2JhZCAtIGNoZWNrIGlmIGEgUE1EIGVudHJ5IGlzICJiYWQiLiBUaGF0IG1pZ2h0IG1lYW4gc3dhcHBlZCBvdXQuCisgKiBBcyB3ZSBoYXZlIG5vIGtub3duIGNhdXNlIG9mIGJhZG5lc3MsIGl0J3MgbnVsbCwgYXMgaXQgaXMgZm9yIG1hbnkKKyAqIGFyY2hpdGVjdHVyZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBtZF9iYWQocG1kX3QgcG1kKQoreworCXJldHVybiAwOworfQorCisvKgorICogcG1kX3BhZ2UgLSBjb252ZXJ0cyBhIFBNRCBlbnRyeSB0byBhIHBhZ2UgcG9pbnRlcgorICovCisjZGVmaW5lIHBtZF9wYWdlKHBtZCkgIChwZm5fdG9fcGFnZShwbWRfdmFsKHBtZCkgPj4gUEFHRV9TSElGVCkpCisjZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQorCisvKioKKyAqIHB0ZV9ub25lIC0gY2hlY2sgaWYgcHRlIGlzIG1hcHBlZAorICogQHB0ZTogcHRlX3QgZW50cnkKKyAqLworc3RhdGljIGlubGluZSBpbnQgcHRlX25vbmUocHRlX3QgcHRlKQoreworCXJldHVybiBwdGVfdmFsKHB0ZSkgPT0gX05VTExfUFRFOworfTsKKworLyoKKyAqIHB0ZV9wcmVzZW50IC0gY2hlY2sgaWYgcGFnZSBpcyBwcmVzZW50CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9wcmVzZW50KHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUFJFU0VOVDsKK30KKworLyogbWtfcHRlIC0gbWFrZSBhIFBURSBvdXQgb2YgYSBwYWdlIHBvaW50ZXIgYW5kIHByb3RlY3Rpb24gYml0cyAqLworI2RlZmluZSBta19wdGUocGFnZSwgcGdwcm90KSBwZm5fcHRlKHBhZ2VfdG9fcGZuKHBhZ2UpLCAocGdwcm90KSkKKworLyogcHRlX3BhZ2UgLSByZXR1cm5zIGEgcGFnZSAoZnJhbWUgcG9pbnRlci9kZXNjcmlwdG9yPykgYmFzZWQgb24gYSBQVEUgKi8KKyNkZWZpbmUgcHRlX3BhZ2UoeCkgcGZuX3RvX3BhZ2UocHRlX3Bmbih4KSkKKworLyogcHRlX21rb2xkIC0gbWFyayBQVEUgYXMgbm90IHJlY2VudGx5IGFjY2Vzc2VkICovCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsKKwlyZXR1cm4gcHRlOworfQorCisvKiBwdGVfbWt5b3VuZyAtIG1hcmsgUFRFIGFzIHJlY2VudGx5IGFjY2Vzc2VkICovCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfQUNDRVNTRUQ7CisJcmV0dXJuIHB0ZTsKK30KKworLyogcHRlX21rY2xlYW4gLSBtYXJrIHBhZ2UgYXMgaW4gc3luYyB3aXRoIGJhY2tpbmcgc3RvcmUgKi8KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRElSVFk7CisJcmV0dXJuIHB0ZTsKK30KKworLyogcHRlX21rZGlydHkgLSBtYXJrIHBhZ2UgYXMgbW9kaWZpZWQgKi8KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9ESVJUWTsKKwlyZXR1cm4gcHRlOworfQorCisvKiBwdGVfeW91bmcgLSAiaXMgUFRFIG1hcmtlZCBhcyBhY2Nlc3NlZCI/ICovCitzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQoreworCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsKK30KKworLyogcHRlX2RpcnR5IC0gImlzIFBURSBkaXJ0eT8iICovCitzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQoreworCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsKK30KKworLyogcHRlX21vZGlmeSAtIHNldCBwcm90ZWN0aW9uIGJpdHMgb24gUFRFICovCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9tb2RpZnkocHRlX3QgcHRlLCBwZ3Byb3RfdCBwcm90KQoreworCXB0ZV92YWwocHRlKSAmPSBQQUdFX01BU0s7CisJcHRlX3ZhbChwdGUpIHw9IHBncHJvdF92YWwocHJvdCk7CisJcmV0dXJuIHB0ZTsKK30KKworLyogcHRlX3dycHJvdGVjdCAtIG1hcmsgcGFnZSBhcyBub3Qgd3JpdGFibGUgKi8KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9XUklURTsKKwlyZXR1cm4gcHRlOworfQorCisvKiBwdGVfbWt3cml0ZSAtIG1hcmsgcGFnZSBhcyB3cml0YWJsZSAqLworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1dSSVRFOworCXJldHVybiBwdGU7Cit9CisKKy8qIHB0ZV9ta2V4ZWMgLSBtYXJrIFBURSBhcyBleGVjdXRhYmxlICovCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9FWEVDVVRFOworCXJldHVybiBwdGU7Cit9CisKKy8qIHB0ZV9yZWFkIC0gImlzIFBURSBtYXJrZWQgYXMgcmVhZGFibGU/IiAqLworc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQoreworCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOworfQorCisvKiBwdGVfd3JpdGUgLSAiaXMgUFRFIG1hcmtlZCBhcyB3cml0YWJsZT8iICovCitzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQoreworCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURTsKK30KKworCisvKiBwdGVfZXhlYyAtICJpcyBQVEUgbWFya2VkIGFzIGV4ZWN1dGFibGU/IiAqLworc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQoreworCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDVVRFOworfQorCisvKiBfX3B0ZV90b19zd3BfZW50cnkgLSBleHRyYWN0IHN3YXAgZW50cnkgZnJvbSBQVEUgKi8KKyNkZWZpbmUgX19wdGVfdG9fc3dwX2VudHJ5KHB0ZSkgKChzd3BfZW50cnlfdCkgeyBwdGVfdmFsKHB0ZSkgfSkKKworLyogX19zd3BfZW50cnlfdG9fcHRlIC0gZXh0cmFjdCBQVEUgZnJvbSBzd2FwIGVudHJ5ICovCisjZGVmaW5lIF9fc3dwX2VudHJ5X3RvX3B0ZSh4KSAoKHB0ZV90KSB7ICh4KS52YWwgfSkKKworLyogcGZuX3B0ZSAtIGNvbnZlcnQgcGFnZSBudW1iZXIgYW5kIHByb3RlY3Rpb24gdmFsdWUgdG8gcGFnZSB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBwZm5fcHRlKHBmbiwgcGdwcm90KSBfX3B0ZSgocGZuIDw8IFBBR0VfU0hJRlQpIHwgcGdwcm90X3ZhbChwZ3Byb3QpKQorCisvKiBwdGVfcGZuIC0gY29udmVydCBwdGUgdG8gcGFnZSBmcmFtZSBudW1iZXIgKi8KKyNkZWZpbmUgcHRlX3BmbihwdGUpIChwdGVfdmFsKHB0ZSkgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgc2V0X3BtZChwbWRwdHIsIHBtZHZhbCkgKCoocG1kcHRyKSA9IChwbWR2YWwpKQorCisvKgorICogc2V0X3B0ZV9hdCAtIHVwZGF0ZSBwYWdlIHRhYmxlIGFuZCBkbyB3aGF0ZXZlciBtYWdpYyBtYXkgYmUKKyAqIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlL2Zpcm13YXJlIHRha2Ugbm90ZS4KKyAqCisgKiBWTSBtYXkgcmVxdWlyZSBhIHZpcnR1YWwgaW5zdHJ1Y3Rpb24gdG8gYWxlcnQgdGhlIE1NVS4KKyAqLworI2RlZmluZSBzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGVwLCBwdGUpIHNldF9wdGUocHRlcCwgcHRlKQorCisvKgorICogTWF5IG5lZWQgdG8gaW52b2tlIHRoZSB2aXJ0dWFsIG1hY2hpbmUgYXMgd2VsbC4uLgorICovCisjZGVmaW5lIHB0ZV91bm1hcChwdGUpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHB0ZV91bm1hcF9uZXN0ZWQocHRlKQlkbyB7IH0gd2hpbGUgKDApCisKKy8qCisgKiBwdGVfb2Zmc2V0X21hcCAtIHJldHVybnMgdGhlIGxpbmVhciBhZGRyZXNzIG9mIHRoZSBwYWdlIHRhYmxlIGVudHJ5CisgKiBjb3JyZXNwb25kaW5nIHRvIGFuIGFkZHJlc3MKKyAqLworI2RlZmluZSBwdGVfb2Zmc2V0X21hcChkaXIsIGFkZHJlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgocHRlX3QgKilwYWdlX2FkZHJlc3MocG1kX3BhZ2UoKihkaXIpKSkgKyBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCisKKyNkZWZpbmUgcHRlX29mZnNldF9tYXBfbmVzdGVkKHBtZCwgYWRkcikgcHRlX29mZnNldF9tYXAocG1kLCBhZGRyKQorCisvKiBwdGVfb2Zmc2V0X2tlcm5lbCAtIGtlcm5lbCB2ZXJzaW9uIG9mIHB0ZV9vZmZzZXQgKi8KKyNkZWZpbmUgcHRlX29mZnNldF9rZXJuZWwoZGlyLCBhZGRyZXNzKSBcCisJKChwdGVfdCAqKSAodW5zaWduZWQgbG9uZykgX192YShwbWRfdmFsKCpkaXIpICYgUEFHRV9NQVNLKSBcCisJCQkJKyAgX19wdGVfb2Zmc2V0KGFkZHJlc3MpKQorCisvKiBaRVJPX1BBR0UgLSByZXR1cm5zIHRoZSBnbG9iYWxseSBzaGFyZWQgemVybyBwYWdlICovCisjZGVmaW5lIFpFUk9fUEFHRSh2YWRkcikgKHZpcnRfdG9fcGFnZSgmZW1wdHlfemVyb19wYWdlKSkKKworI2RlZmluZSBfX3B0ZV9vZmZzZXQoYWRkcmVzcykgKCgoYWRkcmVzcykgPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUFRFIC0gMSkpCisKKy8qIE5vdGhpbmcgc3BlY2lhbCBhYm91dCBJTyByZW1hcHBpbmcgYXQgdGhpcyBwb2ludCAqLworI2RlZmluZSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KSBcCisJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKKworLyogIEkgdGhpbmsgdGhpcyBpcyBpbiBjYXNlIHdlIGhhdmUgcGFnZSB0YWJsZSBjYWNoZXM7IG5lZWRlZCBieSBpbml0L21haW4uYyAgKi8KKyNkZWZpbmUgcGd0YWJsZV9jYWNoZV9pbml0KCkgICAgZG8geyB9IHdoaWxlICgwKQorCisvKgorICogU3dhcC9maWxlIFBURSBkZWZpbml0aW9ucy4gIElmIF9QQUdFX1BSRVNFTlQgaXMgemVybywgdGhlIHJlc3Qgb2YgdGhlCisgKiBQVEUgaXMgaW50ZXJwcmV0ZWQgYXMgc3dhcCBpbmZvcm1hdGlvbi4gIERlcGVuZGluZyBvbiB0aGUgX1BBR0VfRklMRQorICogYml0LCB0aGUgcmVtYWluaW5nIGZyZWUgYml0cyBhcmUgZWl0ZWhyIGludGVycHJldGVkIGFzIGEgZmlsZSBvZmZzZXQKKyAqIG9yIGEgc3dhcCB0eXBlL29mZnNldCB0dXBsZS4gIFJhdGhlciB0aGFuIGhhdmUgdGhlIFRMQiBmaWxsIGhhbmRsZXIKKyAqIHRlc3QgX1BBR0VfUFJFU0VOVCwgd2UncmUgZ29pbmcgdG8gcmVzZXJ2ZSB0aGUgcGVybWlzc2lvbnMgYml0cworICogYW5kIHNldCB0aGVtIHRvIGFsbCB6ZXJvcyBmb3Igc3dhcCBlbnRyaWVzLCB3aGljaCBzcGVlZHMgdXAgdGhlCisgKiBtaXNzIGhhbmRsZXIgYXQgdGhlIGNvc3Qgb2YgMyBiaXRzIG9mIG9mZnNldC4gIFRoYXQgdHJhZGUtb2ZmIGNhbgorICogYmUgcmV2aXNpdGVkIGlmIG5lY2Vzc2FyeSwgYnV0IEhleGFnb24gcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSBhbmQKKyAqIHRhcmdldCBhcHBsaWNhdGlvbnMgc3VnZ2VzdCBhIGxvdCBvZiBUTEIgbWlzc2VzIGFuZCBub3QgbXVjaCBzd2FwIHNwYWNlLgorICoKKyAqIEZvcm1hdCBvZiBzd2FwIFBURToKKyAqCWJpdAkwOglQcmVzZW50ICh6ZXJvKQorICoJYml0CTE6CV9QQUdFX0ZJTEUgKHplcm8pCisgKgliaXRzCTItNjoJc3dhcCB0eXBlIChhcmNoIGluZGVwZW5kZW50IGxheWVyIHVzZXMgNSBiaXRzIG1heCkKKyAqCWJpdHMJNy05OgliaXRzIDI6MCBvZiBvZmZzZXQKKyAqCWJpdHMgMTAtMTI6CWVmZmVjdGl2ZWx5IF9QQUdFX1BST1ROT05FIChhbGwgemVybykKKyAqCWJpdHMgMTMtMzE6ICBiaXRzIDIxOjMgb2Ygc3dhcCBvZmZzZXQKKyAqCisgKiBGb3JtYXQgb2YgZmlsZSBQVEU6CisgKgliaXQJMDoJUHJlc2VudCAoemVybykKKyAqCWJpdAkxOglfUEFHRV9GSUxFICh6ZXJvKQorICoJYml0cwkyLTk6CWJpdHMgNzowIG9mIG9mZnNldAorICoJYml0cyAxMC0xMjoJZWZmZWN0aXZlbHkgX1BBR0VfUFJPVE5PTkUgKGFsbCB6ZXJvKQorICoJYml0cyAxMy0zMTogIGJpdHMgMjY6OCBvZiBzd2FwIG9mZnNldAorICoKKyAqIFRoZSBzcGxpdCBvZmZzZXQgbWFrZXMgc29tZSBvZiB0aGUgZm9sbG93aW5nIG1hY3JvcyBhIGxpdHRsZSBnbmFybHksCisgKiBidXQgdGhlcmUncyBwbGVudHkgb2YgcHJlY2VkZW50IGZvciB0aGlzIHNvcnQgb2YgdGhpbmcuCisgKi8KKyNkZWZpbmUgUFRFX0ZJTEVfTUFYX0JJVFMgICAgIDI3CisKKy8qIFVzZWQgZm9yIHN3YXAgUFRFcyAqLworI2RlZmluZSBfX3N3cF90eXBlKHN3cF9wdGUpCQkoKChzd3BfcHRlKS52YWwgPj4gMikgJiAweDFmKQorCisjZGVmaW5lIF9fc3dwX29mZnNldChzd3BfcHRlKSBcCisJKCgoKHN3cF9wdGUpLnZhbCA+PiA3KSAmIDB4NykgfCAoKChzd3BfcHRlKS52YWwgPj4gMTApICYgMHgwMDNmZmZmOCkpCisKKyNkZWZpbmUgX19zd3BfZW50cnkodHlwZSwgb2Zmc2V0KSBcCisJKChzd3BfZW50cnlfdCkJeyBcCisJCSgodHlwZSA8PCAyKSB8IFwKKwkJICgob2Zmc2V0ICYgMHgzZmZmZjgpIDw8IDEwKSB8ICgob2Zmc2V0ICYgMHg3KSA8PCA3KSkgfSkKKworLyogVXNlZCBmb3IgZmlsZSBQVEVzICovCisjZGVmaW5lIHB0ZV9maWxlKHB0ZSkgXAorCSgocHRlX3ZhbChwdGUpICYgKF9QQUdFX0ZJTEUgfCBfUEFHRV9QUkVTRU5UKSkgPT0gX1BBR0VfRklMRSkKKworI2RlZmluZSBwdGVfdG9fcGdvZmYocHRlKSBcCisJKCgocHRlX3ZhbChwdGUpID4+IDIpICYgMHhmZikgfCAoKHB0ZV92YWwocHRlKSA+PiA1KSAmIDB4MDdmZmZmMDApKQorCisjZGVmaW5lIHBnb2ZmX3RvX3B0ZShvZmYpIFwKKwkoKHB0ZV90KSB7ICgoKChvZmYpICYgMHg3ZmZmZjAwKSA8PCA1KSB8ICgoKG9mZikgJiAweGZmKSA8PCAyKVwKKwl8IF9QQUdFX0ZJTEUpIH0pCisKKy8qICBPaCBib3kuICBUaGVyZSBhcmUgYSBsb3Qgb2YgcG9zc2libGUgYXJjaCBvdmVycmlkZXMgZm91bmQgaW4gdGhpcyBmaWxlLiAgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzVkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBQcm9jZXNzL3Byb2Nlc3NvciBzdXBwb3J0IGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fUFJPQ0VTU09SX0gKKyNkZWZpbmUgX0FTTV9QUk9DRVNTT1JfSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaW5jbHVkZSA8YXNtL21lbS1sYXlvdXQuaD4KKyNpbmNsdWRlIDxhc20vcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKworLyogIG11c3QgYmUgYSBtYWNybyAgKi8KKyNkZWZpbmUgY3VycmVudF90ZXh0X2FkZHIoKSAoeyBfX2xhYmVsX18gX2w7IF9sOiAmJl9sOyB9KQorCisvKiAgdGFza19zdHJ1Y3QsIGRlZmluZWQgZWxzZXdoZXJlLCBpcyB0aGUgInByb2Nlc3MgZGVzY3JpcHRvciIgKi8KK3N0cnVjdCB0YXNrX3N0cnVjdDsKKworLyogIHRoaXMgaXMgZGVmaW5lZCBpbiBhcmNoL3Byb2Nlc3MuYyAgKi8KK2V4dGVybiBwaWRfdCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisKK2V4dGVybiB2b2lkIHN0YXJ0X3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKworLyoKKyAqIHRocmVhZF9zdHJ1Y3QgaXMgc3VwcG9zZWQgdG8gYmUgZm9yIGNvbnRleHQgc3dpdGNoIGRhdGEuCisgKiBTcGVjaWZpY2FsbHksIHRvIGhvbGQgdGhlIHN0YXRlIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHN3aXRjaF90by4uLgorICovCitzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB7CisJdm9pZCAqc3dpdGNoX3NwOworfTsKKworLyoKKyAqIGluaXRpYWxpemVzIHRocmVhZF9zdHJ1Y3QKKyAqIFRoZSBvbmx5IHRoaW5nIHdlIGhhdmUgaW4gdGhlcmUgaXMgc3dpdGNoX3NwCisgKiB3aGljaCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvIGJlIGluaXRpYWxpemVkLgorICovCisKKyNkZWZpbmUgSU5JVF9USFJFQUQgeyBcCit9CisKKyNkZWZpbmUgY3B1X3JlbGF4KCkgX192bXlpZWxkKCkKKworLyoKKyAqICJVbmxhenlpbmcgYWxsIGxhenkgc3RhdHVzIiBvY2N1cnMgaGVyZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHByZXBhcmVfdG9fY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKK30KKworLyoKKyAqIERlY2lkZXMgd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHNlYXJjaCBmb3IgYSBmcmVlIGNodW5rIG9mIHZtIHNwYWNlIGR1cmluZworICogbW1hcHMuCisgKiBTZWUgYWxzbyBhcmNoX2dldF91bm1hcHBlZF9hcmVhLgorICogRG9lc24ndCBhZmZlY3QgaWYgeW91IGhhdmUgTUFYX0ZJWEVEIGluIHRoZSBwYWdlIGZsYWdzIHNldCB0aG91Z2guLi4KKyAqCisgKiBBcHBhcmVudGx5IHRoZSBjb252ZW50aW9uIGlzIHRoYXQgbGQuc28gd2lsbCBhc2sgZm9yICJ1bm1hcHBlZCIgcHJpdmF0ZQorICogbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBTT01FV0hFUkUsIGJ1dCBpdCBhbHNvIGFza3MgZm9yIG1lbW9yeSBleHBsaWNpdGx5CisgKiB2aWEgTUFQX0ZJWEVEIGF0IHRoZSBsb3dlciAqIGFkZHJlc3NlcyBzdGFydGluZyBhdCBWQT0weDAuCisgKgorICogSWYgdGhlIHR3byByZXF1ZXN0cyBjb2xsaWRlLCB5b3UgZ2V0IGF1dGhlbnRpYyBzZWdmYXVsdGluZyBhY3Rpb24sIHNvCisgKiB5b3UgaGF2ZSB0byBraWNrIHRoZSAidW5tYXBwZWQiIGJhc2UgcmVxdWVzdHMgaGlnaGVyIHVwLgorICovCisjZGVmaW5lIFRBU0tfVU5NQVBQRURfQkFTRQkoUEFHRV9BTElHTihUQVNLX1NJWkUvMykpCisKKworI2RlZmluZSB0YXNrX3B0X3JlZ3ModGFzaykgXAorCSgoc3RydWN0IHB0X3JlZ3MgKikodGFza19zdGFja19wYWdlKHRhc2spICsgVEhSRUFEX1NJWkUpIC0gMSkKKworI2RlZmluZSBLU1RLX0VJUCh0c2spIChwdF9lbHIodGFza19wdF9yZWdzKHRzaykpKQorI2RlZmluZSBLU1RLX0VTUCh0c2spIChwdF9wc3AodGFza19wdF9yZWdzKHRzaykpKQorCisvKiAgRnJlZSBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgYSB0aHJlYWQ7IGRlZmluZWQgaW4gcHJvY2Vzcy5jICAqLworZXh0ZXJuIHZvaWQgcmVsZWFzZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICpkZWFkX3Rhc2spOworCisvKiBHZXQgd2FpdCBjaGFubmVsIGZvciB0YXNrIFAuICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKKy8qICBUaGUgZm9sbG93aW5nIHN0dWZmIGlzIHByZXR0eSBIRVhBR09OIHNwZWNpZmljLiAgKi8KKworLyogIFRoaXMgaXMgcmVhbGx5IGp1c3QgaGVyZSBmb3IgX19zd2l0Y2hfdG8uCisgICAgT2Zmc2V0cyBhcmUgcHVsbGVkIHZpYSBhc20tb2Zmc2V0cy5jICAqLworCisvKgorICogTm8gcmVhbCByZWFzb24gd2h5IFZNIGFuZCBuYXRpdmUgc3dpdGNoIHN0YWNrcyBzaG91bGQgYmUgZGlmZmVyZW50LgorICogVWx0aW1hdGVseSB0aGlzIHNob3VsZCBtZXJnZS4gIE5vdGUgdGhhdCBSZXYgQy4gQUJJIGNhbGxlZCBvdXQgb25seQorICogUjI0LTI3IGFzIGNhbGxlZSBzYXZlZCBHUFJzIG5lZWRpbmcgZXhwbGljaXQgYXR0ZW50aW9uIChSMjktMzEgYmVpbmcKKyAqIGRlYWx0IHdpdGggYXV0b21hZ2ljYWxseSBieSBhbGxvY2ZyYW1lKSwgYnV0IHRoZSBjdXJyZW50IEFCSSBoYXMKKyAqIG1vcmUsIFIxNi1SMjcuICBCeSBzYXZpbmcgbW9yZSwgdGhlIHdvcnN0IGNhc2UgaXMgdGhhdCB3ZSB3YXN0ZSBzb21lCisgKiBjeWNsZXMgaWYgYnVpbGRpbmcgd2l0aCB0aGUgb2xkIGNvbXBpbGVycy4KKyAqLworCitzdHJ1Y3QgaGV4YWdvbl9zd2l0Y2hfc3RhY2sgeworCXVuc2lnbmVkIGxvbmcgbG9uZwlyMTcxNjsKKwl1bnNpZ25lZCBsb25nIGxvbmcJcjE5MTg7CisJdW5zaWduZWQgbG9uZyBsb25nCXIyMTIwOworCXVuc2lnbmVkIGxvbmcgbG9uZwlyMjMyMjsKKwl1bnNpZ25lZCBsb25nIGxvbmcJcjI1MjQ7CisJdW5zaWduZWQgbG9uZyBsb25nCXIyNzI2OworCXVuc2lnbmVkIGxvbmcJCWZwOworCXVuc2lnbmVkIGxvbmcJCWxyOworfTsKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyZjYwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogUHRyYWNlIGRlZmluaXRpb25zIGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fUFRSQUNFX0gKKyNkZWZpbmUgX0FTTV9QVFJBQ0VfSAorCisjaW5jbHVkZSA8YXNtL3JlZ2lzdGVycy5oPgorCisjZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgcHRfZWxyKHJlZ3MpCisjZGVmaW5lIHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5yMjkpCisKKyNkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCisKKy8qIGtwcm9iZS1iYXNlZCBldmVudCB0cmFjZXIgc3VwcG9ydCAqLworZXh0ZXJuIGludCByZWdzX3F1ZXJ5X3JlZ2lzdGVyX29mZnNldChjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBjb25zdCBjaGFyICpyZWdzX3F1ZXJ5X3JlZ2lzdGVyX25hbWUodW5zaWduZWQgaW50IG9mZnNldCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3JlZ2lzdGVycy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3JlZ2lzdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDc0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcmVnaXN0ZXJzLmgKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1JFR0lTVEVSU19ICisjZGVmaW5lIF9BU01fUkVHSVNURVJTX0gKKworI2RlZmluZSBTUCByMjkKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogIFNlZSBrZXJuZWwvZW50cnkuUyBmb3IgZnVydGhlciBkb2N1bWVudGF0aW9uLiAgKi8KKworLyoKKyAqIEVudHJ5IGNvZGUgY29waWVzIHRoZSBldmVudCByZWNvcmQgb3V0IG9mIGd1ZXN0IHJlZ2lzdGVycyBpbnRvCisgKiB0aGlzIHN0cnVjdHVyZSAod2hpY2ggaXMgb24gdGhlIHN0YWNrKS4KKyAqLworCitzdHJ1Y3QgaHZtX2V2ZW50X3JlY29yZCB7CisJdW5zaWduZWQgbG9uZyB2bWVsOyAgICAgLyogRXZlbnQgTGlua2FnZSAocmV0dXJuIGFkZHJlc3MpICovCisJdW5zaWduZWQgbG9uZyB2bWVzdDsgICAgLyogRXZlbnQgY29udGV4dCAtIHByZS1ldmVudCBTU1IgdmFsdWVzICovCisJdW5zaWduZWQgbG9uZyB2bXBzcDsgICAgLyogUHJldmlvdXMgc3RhY2sgcG9pbnRlciAqLworCXVuc2lnbmVkIGxvbmcgdm1iYWR2YTsgIC8qIEJhZCB2aXJ0dWFsIGFkZHJlc3MgZm9yIGFkZHJlc3NpbmcgZXZlbnRzICovCit9OworCitzdHJ1Y3QgcHRfcmVncyB7CisJbG9uZyByZXN0YXJ0X3IwOyAgICAgICAgLyogUjAgY2hlY2twb2ludCBmb3Igc3lzY2FsbCByZXN0YXJ0ICovCisJbG9uZyBzeXNjYWxsX25yOyAgICAgICAgLyogT25seSB1c2VkIGluIHN5c3RlbSBjYWxscyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgdXNyOworCQkJdW5zaWduZWQgbG9uZyBwcmVkczsKKwkJfTsKKwkJbG9uZyBsb25nIGludCBwcmVkc3VzcjsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgbTA7CisJCQl1bnNpZ25lZCBsb25nIG0xOworCQl9OworCQlsb25nIGxvbmcgaW50IG0xbTA7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHNhMTsKKwkJCXVuc2lnbmVkIGxvbmcgbGMxOworCQl9OworCQlsb25nIGxvbmcgaW50IGxjMXNhMTsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgc2EwOworCQkJdW5zaWduZWQgbG9uZyBsYzA7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgbGMwc2EwOworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyBncDsKKwkJCXVuc2lnbmVkIGxvbmcgdWdwOworCQl9OworCQlsb25nIGxvbmcgaW50IHVncGdwOworCX07CisJLyoKKwkqIEJlIGV4dHJlbWVseSBjYXJlZnVsIHdpdGggcmVhcnJhbmdpbmcgdGhlc2UsIGlmIGF0IGFsbC4gIFNvbWUgY29kZQorCSogYXNzdW1lcyB0aGUgMzIgcmVnaXN0ZXJzIGV4aXN0IGV4YWN0bHkgbGlrZSB0aGlzIGluIG1lbW9yeTsKKwkqIGUuZy4ga2VybmVsL3B0cmFjZS5jCisJKiBlLmcuIGtlcm5lbC9zaWduYWwuYyAocmVzdG9yZV9zaWdjb250ZXh0KQorCSovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMDA7CisJCQl1bnNpZ25lZCBsb25nIHIwMTsKKwkJfTsKKwkJbG9uZyBsb25nIGludCByMDEwMDsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjAyOworCQkJdW5zaWduZWQgbG9uZyByMDM7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcjAzMDI7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIwNDsKKwkJCXVuc2lnbmVkIGxvbmcgcjA1OworCQl9OworCQlsb25nIGxvbmcgaW50IHIwNTA0OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMDY7CisJCQl1bnNpZ25lZCBsb25nIHIwNzsKKwkJfTsKKwkJbG9uZyBsb25nIGludCByMDcwNjsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjA4OworCQkJdW5zaWduZWQgbG9uZyByMDk7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcjA5MDg7CisJfTsKKwl1bmlvbiB7CisJICAgICAgIHN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIxMDsKKwkJCXVuc2lnbmVkIGxvbmcgcjExOworCSAgICAgICB9OworCSAgICAgICBsb25nIGxvbmcgaW50IHIxMTEwOworCX07CisJdW5pb24geworCSAgICAgICBzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMTI7CisJCQl1bnNpZ25lZCBsb25nIHIxMzsKKwkgICAgICAgfTsKKwkgICAgICAgbG9uZyBsb25nIGludCByMTMxMjsKKwl9OworCXVuaW9uIHsKKwkgICAgICAgc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjE0OworCQkJdW5zaWduZWQgbG9uZyByMTU7CisJICAgICAgIH07CisJICAgICAgIGxvbmcgbG9uZyBpbnQgcjE1MTQ7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIxNjsKKwkJCXVuc2lnbmVkIGxvbmcgcjE3OworCQl9OworCQlsb25nIGxvbmcgaW50IHIxNzE2OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMTg7CisJCQl1bnNpZ25lZCBsb25nIHIxOTsKKwkJfTsKKwkJbG9uZyBsb25nIGludCByMTkxODsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjIwOworCQkJdW5zaWduZWQgbG9uZyByMjE7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcjIxMjA7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIyMjsKKwkJCXVuc2lnbmVkIGxvbmcgcjIzOworCQl9OworCQlsb25nIGxvbmcgaW50IHIyMzIyOworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMjQ7CisJCQl1bnNpZ25lZCBsb25nIHIyNTsKKwkJfTsKKwkJbG9uZyBsb25nIGludCByMjUyNDsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjI2OworCQkJdW5zaWduZWQgbG9uZyByMjc7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcjI3MjY7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIyODsKKwkJCXVuc2lnbmVkIGxvbmcgcjI5OworCSAgICAgICB9OworCSAgICAgICBsb25nIGxvbmcgaW50IHIyOTI4OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMzA7CisJCQl1bnNpZ25lZCBsb25nIHIzMTsKKwkJfTsKKwkJbG9uZyBsb25nIGludCByMzEzMDsKKwl9OworCS8qIFZNIGRpc3BhdGNoIHB1c2hlcyBldmVudCByZWNvcmQgb250byBzdGFjayAtIHdlIGNhbiBidWlsZCBvbiBpdCAqLworCXN0cnVjdCBodm1fZXZlbnRfcmVjb3JkIGh2bWVyOworfTsKKworLyogRGVmaW5lcyB0byBjb252ZW5pZW50bHkgYWNjZXNzIHRoZSB2YWx1ZXMgICovCisKKy8qCisgKiBBcyBvZiB0aGUgVk0gc3BlYyAwLjUsIHRoZXNlIHJlZ2lzdGVycyBhcmUgbm93IHNldC9yZXRyaWV2ZWQgdmlhIGEKKyAqIFZNIGNhbGwuICBPbiB0aGUgaW4tYm91bmQgc2lkZSwgd2UganVzdCBmZXRjaCB0aGUgdmFsdWVzCisgKiBhdCB0aGUgZW50cnkgcG9pbnRzIGFuZCBzdHVmZiB0aGVtIGludG8gdGhlIG9sZCByZWNvcmQgaW4gcHRfcmVncy4KKyAqIEhvd2V2ZXIsIG9uIHRoZSBvdXRib3VuZCBzaWRlLCBwcm9iYWJseSBhdCBWTSBydGUsIHdlIHNldCB0aGUKKyAqIHJlZ2lzdGVycyBiYWNrLgorICovCisKKyNkZWZpbmUgcHRfZWxyKHJlZ3MpICgocmVncyktPmh2bWVyLnZtZWwpCisjZGVmaW5lIHB0X3NldF9lbHIocmVncywgdmFsKSAoKHJlZ3MpLT5odm1lci52bWVsID0gKHZhbCkpCisjZGVmaW5lIHB0X2NhdXNlKHJlZ3MpICgocmVncyktPmh2bWVyLnZtZXN0ICYgKEhWTV9WTUVTVF9DQVVTRV9NU0spKQorI2RlZmluZSB1c2VyX21vZGUocmVncykgXAorCSgoKHJlZ3MpLT5odm1lci52bWVzdCAmIChIVk1fVk1FU1RfVU1fTVNLIDw8IEhWTV9WTUVTVF9VTV9TRlQpKSAhPSAwKQorI2RlZmluZSBpbnRzX2VuYWJsZWQocmVncykgXAorCSgoKHJlZ3MpLT5odm1lci52bWVzdCAmIChIVk1fVk1FU1RfSUVfTVNLIDw8IEhWTV9WTUVTVF9JRV9TRlQpKSAhPSAwKQorI2RlZmluZSBwdF9wc3AocmVncykgKChyZWdzKS0+aHZtZXIudm1wc3ApCisjZGVmaW5lIHB0X2JhZHZhKHJlZ3MpICgocmVncyktPmh2bWVyLnZtYmFkdmEpCisKKyNkZWZpbmUgcHRfc2V0X3J0ZV9zcChyZWdzLCBzcCkgZG8ge1wKKwlwdF9wc3AocmVncykgPSAoc3ApO1wKKwkocmVncyktPlNQID0gKHVuc2lnbmVkIGxvbmcpICYoKHJlZ3MpLT5odm1lcik7XAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgcHRfc2V0X2ttb2RlKHJlZ3MpIFwKKwkocmVncyktPmh2bWVyLnZtZXN0ID0gKEhWTV9WTUVTVF9JRV9NU0sgPDwgSFZNX1ZNRVNUX0lFX1NGVCkKKworI2RlZmluZSBwdF9zZXRfdXNlcm1vZGUocmVncykgXAorCShyZWdzKS0+aHZtZXIudm1lc3QgPSAoSFZNX1ZNRVNUX1VNX01TSyA8PCBIVk1fVk1FU1RfVU1fU0ZUKSBcCisJCQkgICAgfCAoSFZNX1ZNRVNUX0lFX01TSyA8PCBIVk1fVk1FU1RfSUVfU0ZUKQorCisjZW5kaWYgIC8qICBpZm5kZWYgX19BU1NFTUJMWSAgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc2V0dXAuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zZXR1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzU0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1NFVFVQX0gKKyNkZWZpbmUgX0FTTV9TRVRVUF9ICisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2V0dXAuaD4KKworZXh0ZXJuIGNoYXIgZXh0ZXJuYWxfY21kbGluZV9idWZmZXI7CisKK3ZvaWQgX19pbml0IHNldHVwX2FyY2hfbWVtb3J5KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmRjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fU0lHQ09OVEVYVF9ICisjZGVmaW5lIF9BU01fU0lHQ09OVEVYVF9ICisKKyNpbmNsdWRlIDxhc20vdXNlci5oPgorCisvKgorICogU2lnbmFsIGNvbnRleHQgc3RydWN0dXJlIC0gY29udGFpbnMgYWxsIGluZm8gdG8gZG8gd2l0aCB0aGUgc3RhdGUKKyAqIGJlZm9yZSB0aGUgc2lnbmFsIGhhbmRsZXIgd2FzIGludm9rZWQuICBOb3RlOiBvbmx5IGFkZCBuZXcgZW50cmllcworICogdG8gdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlLgorICovCitzdHJ1Y3Qgc2lnY29udGV4dCB7CisJc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3Qgc2NfcmVnczsKK30gX19hbGlnbmVkKDgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zaWduYWwuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzFjMDU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NpZ25hbC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fU0lHTkFMX0gKKyNkZWZpbmUgX0FTTV9TSUdOQUxfSAorCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX3J0X3NpZ3RyYW1wX3RlbXBsYXRlWzJdOworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnbmFsLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Yzg2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc21wLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIFNNUCBkZWZpbml0aW9ucyBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0FTTV9TTVBfSAorI2RlZmluZSBfX0FTTV9TTVBfSAorCisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorCisjZGVmaW5lIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1KQorCitlbnVtIGlwaV9tZXNzYWdlX3R5cGUgeworCUlQSV9OT1AgPSAwLAorCUlQSV9SRVNDSEVEVUxFID0gMSwKKwlJUElfQ0FMTF9GVU5DLAorCUlQSV9DQUxMX0ZVTkNfU0lOR0xFLAorCUlQSV9DUFVfU1RPUCwKKwlJUElfVElNRVIsCit9OworCitleHRlcm4gdm9pZCBzZW5kX2lwaShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaywgZW51bSBpcGlfbWVzc2FnZV90eXBlIG1zZyk7CitleHRlcm4gdm9pZCBzbXBfc3RhcnRfY3B1cyh2b2lkKTsKK2V4dGVybiB2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGkoaW50IGNwdSk7CitleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CisKK2V4dGVybiB2b2lkIHNtcF92bV91bm1hc2tfaXJxKHZvaWQgKmluZm8pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4YTkyMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogU3BpbmxvY2sgc3VwcG9ydCBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9TUElOTE9DS19ICisjZGVmaW5lIF9BU01fU1BJTkxPQ0tfSAorCisjaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+CisKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHVsbGVkIGluIGZvciBTTVAgYnVpbGRzLgorICogUmVhbGx5IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBiYXJyaWVyIHN0dWZmIGZvciAidHJ1ZSIgU01QCisgKi8KKworLyoKKyAqIFJlYWQgbG9ja3M6CisgKiAtIGxvYWQgdGhlIGxvY2sgdmFsdWUKKyAqIC0gaW5jcmVtZW50IGl0CisgKiAtIGlmIHRoZSBsb2NrIHZhbHVlIGlzIHN0aWxsIG5lZ2F0aXZlLCBnbyBiYWNrIGFuZCB0cnkgYWdhaW4uCisgKiAtIHVuc3VjY2Vzc2Z1bCBzdG9yZSBpcyB1bnN1Y2Nlc3NmdWwuICBHbyBiYWNrIGFuZCB0cnkgYWdhaW4uICBMb3Nlci4KKyAqIC0gc3VjY2Vzc2Z1bCBzdG9yZSBuZXcgbG9jayB2YWx1ZSBpZiBwb3NpdGl2ZSAtPiBsb2NrIGFjcXVpcmVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3JlYWRfbG9jayhhcmNoX3J3bG9ja190ICpsb2NrKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiMToJUjYgPSBtZW13X2xvY2tlZCglMCk7XG4iCisJCSIJeyBQMyA9IGNtcC5nZShSNiwjMCk7IFI2ID0gYWRkKFI2LCMxKTt9XG4iCisJCSIJeyBpZiAhUDMganVtcCAxYjsgfVxuIgorCQkiCW1lbXdfbG9ja2VkKCUwLFAzKSA9IFI2O1xuIgorCQkiCXsgaWYgIVAzIGp1bXAgMWI7IH1cbiIKKwkJOgorCQk6ICJyIiAoJmxvY2stPmxvY2spCisJCTogIm1lbW9yeSIsICJyNiIsICJwMyIKKwkpOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3JlYWRfdW5sb2NrKGFyY2hfcndsb2NrX3QgKmxvY2spCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIxOglSNiA9IG1lbXdfbG9ja2VkKCUwKTtcbiIKKwkJIglSNiA9IGFkZChSNiwjLTEpO1xuIgorCQkiCW1lbXdfbG9ja2VkKCUwLFAzKSA9IFI2XG4iCisJCSIJaWYgIVAzIGp1bXAgMWI7XG4iCisJCToKKwkJOiAiciIgKCZsb2NrLT5sb2NrKQorCQk6ICJtZW1vcnkiLCAicjYiLCAicDMiCisJKTsKKworfQorCisvKiAgSSB0aGluayB0aGlzIHJldHVybnMgMCBvbiBmYWlsLCAxIG9uIHN1Y2Nlc3MuICAqLworc3RhdGljIGlubGluZSBpbnQgYXJjaF9yZWFkX3RyeWxvY2soYXJjaF9yd2xvY2tfdCAqbG9jaykKK3sKKwlpbnQgdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIglSNiA9IG1lbXdfbG9ja2VkKCUxKTtcbiIKKwkJIgl7ICUwID0gIzA7IFAzID0gY21wLmdlKFI2LCMwKTsgUjYgPSBhZGQoUjYsIzEpO31cbiIKKwkJIgl7IGlmICFQMyBqdW1wIDFmOyB9XG4iCisJCSIJbWVtd19sb2NrZWQoJTEsUDMpID0gUjY7XG4iCisJCSIJeyAlMCA9IFAzIH1cbiIKKwkJIjE6XG4iCisJCTogIj0mciIgKHRlbXApCisJCTogInIiICgmbG9jay0+bG9jaykKKwkJOiAibWVtb3J5IiwgInI2IiwgInAzIgorCSk7CisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFyY2hfcmVhZF9jYW5fbG9jayhhcmNoX3J3bG9ja190ICpyd2xvY2spCit7CisJcmV0dXJuIHJ3bG9jay0+bG9jayA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcmNoX3dyaXRlX2Nhbl9sb2NrKGFyY2hfcndsb2NrX3QgKnJ3bG9jaykKK3sKKwlyZXR1cm4gcndsb2NrLT5sb2NrID09IDA7Cit9CisKKy8qICBTdHVmZnMgYSAtMSBpbiB0aGUgbG9jayB2YWx1ZT8gICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF93cml0ZV9sb2NrKGFyY2hfcndsb2NrX3QgKmxvY2spCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIxOglSNiA9IG1lbXdfbG9ja2VkKCUwKVxuIgorCQkiCXsgUDMgPSBjbXAuZXEoUjYsIzApOyAgUjYgPSAjLTE7fVxuIgorCQkiCXsgaWYgIVAzIGp1bXAgMWI7IH1cbiIKKwkJIgltZW13X2xvY2tlZCglMCxQMykgPSBSNjtcbiIKKwkJIgl7IGlmICFQMyBqdW1wIDFiOyB9XG4iCisJCToKKwkJOiAiciIgKCZsb2NrLT5sb2NrKQorCQk6ICJtZW1vcnkiLCAicjYiLCAicDMiCisJKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBhcmNoX3dyaXRlX3RyeWxvY2soYXJjaF9yd2xvY2tfdCAqbG9jaykKK3sKKwlpbnQgdGVtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIglSNiA9IG1lbXdfbG9ja2VkKCUxKVxuIgorCQkiCXsgJTAgPSAjMDsgUDMgPSBjbXAuZXEoUjYsIzApOyAgUjYgPSAjLTE7fVxuIgorCQkiCXsgaWYgIVAzIGp1bXAgMWY7IH1cbiIKKwkJIgltZW13X2xvY2tlZCglMSxQMykgPSBSNjtcbiIKKwkJIgklMCA9IFAzO1xuIgorCQkiMTpcbiIKKwkJOiAiPSZyIiAodGVtcCkKKwkJOiAiciIgKCZsb2NrLT5sb2NrKQorCQk6ICJtZW1vcnkiLCAicjYiLCAicDMiCisJKTsKKwlyZXR1cm4gdGVtcDsKKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF93cml0ZV91bmxvY2soYXJjaF9yd2xvY2tfdCAqbG9jaykKK3sKKwlzbXBfbWIoKTsKKwlsb2NrLT5sb2NrID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfc3Bpbl9sb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIjE6CVI2ID0gbWVtd19sb2NrZWQoJTApO1xuIgorCQkiCVAzID0gY21wLmVxKFI2LCMwKTtcbiIKKwkJIgl7IGlmICFQMyBqdW1wIDFiOyBSNiA9ICMxOyB9XG4iCisJCSIJbWVtd19sb2NrZWQoJTAsUDMpID0gUjY7XG4iCisJCSIJeyBpZiAhUDMganVtcCAxYjsgfVxuIgorCQk6CisJCTogInIiICgmbG9jay0+bG9jaykKKwkJOiAibWVtb3J5IiwgInI2IiwgInAzIgorCSk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfc3Bpbl91bmxvY2soYXJjaF9zcGlubG9ja190ICpsb2NrKQoreworCXNtcF9tYigpOworCWxvY2stPmxvY2sgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhcmNoX3NwaW5fdHJ5bG9jayhhcmNoX3NwaW5sb2NrX3QgKmxvY2spCit7CisJaW50IHRlbXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJUjYgPSBtZW13X2xvY2tlZCglMSk7XG4iCisJCSIJUDMgPSBjbXAuZXEoUjYsIzApO1xuIgorCQkiCXsgaWYgIVAzIGp1bXAgMWY7IFI2ID0gIzE7ICUwID0gIzA7IH1cbiIKKwkJIgltZW13X2xvY2tlZCglMSxQMykgPSBSNjtcbiIKKwkJIgklMCA9IFAzO1xuIgorCQkiMTpcbiIKKwkJOiAiPSZyIiAodGVtcCkKKwkJOiAiciIgKCZsb2NrLT5sb2NrKQorCQk6ICJtZW1vcnkiLCAicjYiLCAicDMiCisJKTsKKwlyZXR1cm4gdGVtcDsKK30KKworLyoKKyAqIFNNUCBzcGlubG9ja3MgYXJlIGludGVuZGVkIHRvIGFsbG93IG9ubHkgYSBzaW5nbGUgQ1BVIGF0IHRoZSBsb2NrCisgKi8KKyNkZWZpbmUgYXJjaF9zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIGFyY2hfc3Bpbl9sb2NrKGxvY2spCisjZGVmaW5lIGFyY2hfc3Bpbl91bmxvY2tfd2FpdChsb2NrKSBcCisJZG8ge3doaWxlIChhcmNoX3NwaW5faXNfbG9ja2VkKGxvY2spKSBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYXJjaF9zcGluX2lzX2xvY2tlZCh4KSAoKHgpLT5sb2NrICE9IDApCisKKyNkZWZpbmUgYXJjaF9yZWFkX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIGFyY2hfcmVhZF9sb2NrKGxvY2spCisjZGVmaW5lIGFyY2hfd3JpdGVfbG9ja19mbGFncyhsb2NrLCBmbGFncykgYXJjaF93cml0ZV9sb2NrKGxvY2spCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTkzN2FmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIFNwaW5sb2NrIHN1cHBvcnQgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9BU01fU1BJTkxPQ0tfVFlQRVNfSAorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKK30gYXJjaF9zcGlubG9ja190OworCisjZGVmaW5lIF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSBhcmNoX3J3bG9ja190OworCisjZGVmaW5lIF9fQVJDSF9SV19MT0NLX1VOTE9DS0VECQl7IDAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zdHJpbmcuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ4OWMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3N0cmluZy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fU1RSSU5HX0hfCisjZGVmaW5lIF9BU01fU1RSSU5HX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIF9fSEFWRV9BUkNIX01FTUNQWQorZXh0ZXJuIHZvaWQgKm1lbWNweSh2b2lkICpfX3RvLCBfX2NvbnN0X18gdm9pZCAqX19mcm9tLCBzaXplX3QgX19uKTsKKworLyogIFRvRG86ICB1c2UgZGN6ZXJvYSwgYWNjZWxlcmF0ZSB0aGUgY29tcGlsZXItY29uc3RhbnQgemVybyBjYXNlICAqLworI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1TRVQKK2V4dGVybiB2b2lkICptZW1zZXQodm9pZCAqX190bywgaW50IGMsIHNpemVfdCBfX24pOworI2VuZGlmCisKKworI2VuZGlmIC8qIF9BU01fU1RSSU5HX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3VzcGVuZC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3N1c3BlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODlkZDgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3N1c3BlbmQuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1NVU1BFTkRfSAorI2RlZmluZSBfQVNNX1NVU1BFTkRfSAorCitzdGF0aWMgaW5saW5lIGludCBhcmNoX3ByZXBhcmVfc3VzcGVuZCh2b2lkKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Y2YwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fU1dBQl9ICisjZGVmaW5lIF9BU01fU1dBQl9ICisKKyNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zeXNjYWxsLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3lzY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlN2Q2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3lzY2FsbC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBTeXNjYWxsIHN1cHBvcnQgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9IRVhBR09OX1NZU0NBTExfSAorI2RlZmluZSBfQVNNX0hFWEFHT05fU1lTQ0FMTF9ICisKK3R5cGVkZWYgbG9uZyAoKnN5c2NhbGxfZm4pKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKKwl1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKworYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyIF9fdXNlciAqdWZpbGVuYW1lLCBjaGFyIF9fdXNlciAqIF9fdXNlciAqYXJndiwKKwkJCSAgY2hhciBfX3VzZXIgKiBfX3VzZXIgKmVudnApOworYXNtbGlua2FnZSBpbnQgc3lzX2Nsb25lKHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3c3AsCisJCQkgdW5zaWduZWQgbG9uZyBwYXJlbnRfdGlkcCwgdW5zaWduZWQgbG9uZyBjaGlsZF90aWRwKTsKKworI2RlZmluZSBzeXNfZXhlY3ZlCXN5c19leGVjdmUKKyNkZWZpbmUgc3lzX2Nsb25lCXN5c19jbG9uZQorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc3lzY2FsbHMuaD4KKworZXh0ZXJuIHZvaWQgKnN5c19jYWxsX3RhYmxlW107CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzeXNjYWxsX2dldF9ucihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gcmVncy0+cjA2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9nZXRfYXJndW1lbnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgdW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBuLAorCQkJCQkgdW5zaWduZWQgbG9uZyAqYXJncykKK3sKKwlCVUdfT04oaSArIG4gPiA2KTsKKwltZW1jcHkoYXJncywgJigmcmVncy0+cjAwKVtpXSwgbiAqIHNpemVvZihhcmdzWzBdKSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNlZDFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogU3lzdGVtIGxldmVsIGRlZmluaXRpb25zIGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fU1lTVEVNX0gKKyNkZWZpbmUgX0FTTV9TWVNURU1fSAorCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9oZXhhZ29uX3ZtLmg+CisKK3N0cnVjdCB0aHJlYWRfc3RydWN0OworCitleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpfX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CisKKyNkZWZpbmUgc3dpdGNoX3RvKHAsIG4sIHIpIGRvIHtcCisJciA9IF9fc3dpdGNoX3RvKChwKSwgKG4pLCAocikpO1wKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBybWIoKQkJCQliYXJyaWVyKCkKKyNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQkJYmFycmllcigpCisjZGVmaW5lIHdtYigpCQkJCWJhcnJpZXIoKQorI2RlZmluZSBtYigpCQkJCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfcm1iKCkJCQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF93bWIoKQkJCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWIoKQkJCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpCWJhcnJpZXIoKQorCisvKgorICogX194Y2hnIC0gYXRvbWljYWxseSBleGNoYW5nZSBhIHJlZ2lzdGVyIGFuZCBhIG1lbW9yeSBsb2NhdGlvbgorICogQHg6IHZhbHVlIHRvIHN3YXAKKyAqIEBwdHI6IHBvaW50ZXIgdG8gbWVtb3J5CisgKiBAc2l6ZTogIHNpemUgb2YgdGhlIHZhbHVlCisgKgorICogT25seSA0IGJ5dGVzIHN1cHBvcnRlZCBjdXJyZW50bHkuCisgKgorICogTm90ZTogIHRoZXJlIHdhcyBhbiBlcnJhdGEgZm9yIFYyIGFib3V0IC5uZXcncyBhbmQgbWVtd19sb2NrZWQuCisgKgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX194Y2hnKHVuc2lnbmVkIGxvbmcgeCwgdm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCSAgIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgcmV0dmFsOworCisJLyogIENhbid0IHNlZW0gdG8gdXNlIHByaW50ayBvciBwYW5pYyBoZXJlLCBzbyBqdXN0IHN0b3AgICovCisJaWYgKHNpemUgIT0gNCkgZG8geyBhc20gdm9sYXRpbGUoImJya3B0O1xuIik7IH0gd2hpbGUgKDEpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCSIxOgklMCA9IG1lbXdfbG9ja2VkKCUxKTtcbiIgICAgLyogIGxvYWQgaW50byByZXR2YWwgKi8KKwkiCW1lbXdfbG9ja2VkKCUxLFAwKSA9ICUyO1xuIiAvKiAgc3RvcmUgaW50byBtZW1vcnkgKi8KKwkiCWlmICFQMCBqdW1wIDFiO1xuIgorCTogIj0mciIgKHJldHZhbCkKKwk6ICJyIiAocHRyKSwgInIiICh4KQorCTogIm1lbW9yeSIsICJwMCIKKwkpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBBdG9taWNhbGx5IHN3YXAgdGhlIGNvbnRlbnRzIG9mIGEgcmVnaXN0ZXIgd2l0aCBtZW1vcnkuICBTaG91bGQgYmUgYXRvbWljCisgKiBiZXR3ZWVuIG11bHRpcGxlIENQVSdzIGFuZCB3aXRoaW4gaW50ZXJydXB0cyBvbiB0aGUgc2FtZSBDUFUuCisgKi8KKyNkZWZpbmUgeGNoZyhwdHIsIHYpICgoX190eXBlb2ZfXygqKHB0cikpKV9feGNoZygodW5zaWduZWQgbG9uZykodiksIChwdHIpLCBcCisJc2l6ZW9mKCoocHRyKSkpKQorCisvKiAgU2V0IGEgdmFsdWUgYW5kIHVzZSBhIG1lbW9yeSBiYXJyaWVyLiAgVXNlZCBieSB0aGUgc2NoZWR1bGVyIHNvbWV3aGVyZS4gICovCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBcCisJZG8geyB2YXIgPSB2YWx1ZTsgbWIoKTsgfSB3aGlsZSAoMCkKKworLyoKKyAqICBzZWUgcnQtbXV0ZXgtZGVzaWduLnR4dDsgY21weGNoZyBzdXBwb3NlZGx5IGNoZWNrcyBpZiAqcHRyID09IEEgYW5kIHN3YXBzLgorICogIGxvb2tzIGp1c3QgbGlrZSBhdG9taWNfY21weGNoZyBvbiBvdXIgYXJjaCBjdXJyZW50bHkgd2l0aCBhIGJ1bmNoIG9mCisgKiAgdmFyaWFibGUgY2FzdGluZy4KKyAqLworI2RlZmluZSBfX0hBVkVfQVJDSF9DTVBYQ0hHIDEKKworI2RlZmluZSBjbXB4Y2hnKHB0ciwgb2xkLCBuZXcpCQkJCQlcCisoewkJCQkJCQkJXAorCV9fdHlwZW9mX18ocHRyKSBfX3B0ciA9IChwdHIpOwkJCQlcCisJX190eXBlb2ZfXygqKHB0cikpIF9fb2xkID0gKG9sZCk7CQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldyA9IChuZXcpOwkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19vbGR2YWwgPSAwOwkJCVwKKwkJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCQlcCisJCSIxOgklMCA9IG1lbXdfbG9ja2VkKCUxKTtcbiIJCVwKKwkJIgl7IFAwID0gY21wLmVxKCUwLCUyKTtcbiIJCVwKKwkJIgkgIGlmICghUDAubmV3KSBqdW1wOm50IDJmOyB9XG4iCQlcCisJCSIJbWVtd19sb2NrZWQoJTEscDApID0gJTM7XG4iCQlcCisJCSIJaWYgKCFQMCkganVtcCAxYjtcbiIJCQlcCisJCSIyOlxuIgkJCQkJCVwKKwkJOiAiPSZyIiAoX19vbGR2YWwpCQkJCVwKKwkJOiAiciIgKF9fcHRyKSwgInIiIChfX29sZCksICJyIiAoX19uZXcpCQlcCisJCTogIm1lbW9yeSIsICJwMCIJCQkJXAorCSk7CQkJCQkJCVwKKwlfX29sZHZhbDsJCQkJCQlcCit9KQorCisvKiAgU2hvdWxkIHByb2JhYmx5IHNob290IGZvciBhbiA4LWJ5dGUgYWxpZ25lZCBzdGFjayBwb2ludGVyICAqLworI2RlZmluZSBTVEFDS19NQVNLICh+NykKKyNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCAmIFNUQUNLX01BU0spCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzI5MzRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBUaHJlYWQgc3VwcG9ydCBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1RIUkVBRF9JTkZPX0gKKyNkZWZpbmUgX0FTTV9USFJFQURfSU5GT19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2VuZGlmCisKKyNkZWZpbmUgVEhSRUFEX1NISUZUCQkxMgorI2RlZmluZSBUSFJFQURfU0laRQkJKDE8PFRIUkVBRF9TSElGVCkKKworI2lmIFRIUkVBRF9TSElGVCA+PSBQQUdFX1NISUZUCisjZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSCShUSFJFQURfU0hJRlQgLSBQQUdFX1NISUZUKQorI2Vsc2UgIC8qICBkb24ndCB1c2Ugc3RhbmRhcmQgYWxsb2NhdG9yICAqLworI2RlZmluZSBfX0hBVkVfQVJDSF9USFJFQURfSU5GT19BTExPQ0FUT1IKK2V4dGVybiBzdHJ1Y3QgdGhyZWFkX2luZm8gKmFsbG9jX3RocmVhZF9pbmZvX25vZGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBub2RlKTsKK2V4dGVybiB2b2lkIGZyZWVfdGhyZWFkX2luZm8oc3RydWN0IHRocmVhZF9pbmZvICp0aSk7CisjZW5kaWYKKworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBzZWc7Cit9IG1tX3NlZ21lbnRfdDsKKworLyoKKyAqIFRoaXMgaXMgdW5pb24nZCB3aXRoIHRoZSAiYm90dG9tIiBvZiB0aGUga2VybmVsIHN0YWNrLgorICogSXQga2VlcHMgdHJhY2sgb2YgdGhyZWFkIGluZm8gd2hpY2ggaXMgaGFuZHkgZm9yIHJvdXRpbmVzCisgKiB0byBhY2Nlc3MgcXVpY2tseS4KKyAqLworCitzdHJ1Y3QgdGhyZWFkX2luZm8geworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgZXhlY19kb21haW4gICAgICAqZXhlY19kb21haW47ICAgLyogZXhlY3V0aW9uIGRvbWFpbiAqLworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOyAgICAgICAgICAvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KKwlfX3UzMiAgICAgICAgICAgICAgICAgICBjcHU7ICAgICAgICAgICAgLyogY3VycmVudCBjcHUgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBwcmVlbXB0X2NvdW50OyAgLyogMD0+cHJlZW1wdGlibGUsPDA9PkJVRyAqLworCW1tX3NlZ21lbnRfdCAgICAgICAgICAgIGFkZHJfbGltaXQ7ICAgICAvKiBzZWdtZW50YXRpb24gc3V4ICovCisJLyoKKwkgKiB1c2VkIGZvciBzeXNjYWxscyBzb21laG93OworCSAqIHNlZW1zIHRvIGhhdmUgYSBmdW5jdGlvbiBwb2ludGVyIGFuZCBmb3VyIGFyZ3VtZW50cworCSAqLworCXN0cnVjdCByZXN0YXJ0X2Jsb2NrICAgIHJlc3RhcnRfYmxvY2s7CisJLyogUG9pbnRzIHRvIHRoZSBjdXJyZW50IHB0X3JlZ3MgZnJhbWUgICovCisJc3RydWN0IHB0X3JlZ3MJCSpyZWdzOworCS8qCisJICogc2F2ZWQga2VybmVsIHNwIGF0IHN3aXRjaF90byB0aW1lOworCSAqIG5vdCBzdXJlIGlmIHRoaXMgaXMgdXNlZCAoaXQncyBub3QgaW4gdGhlIFZNIG1vZGVsIGl0IHNlZW1zOworCSAqIHNlZSB0aHJlYWRfc3RydWN0KQorCSAqLworCXVuc2lnbmVkIGxvbmcJCXNwOworfTsKKworI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLworCisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisKKyNlbmRpZiAgLyogX19BU1NFTUJMWV9fICAqLworCisvKiAgbG9va3MgbGlrZSAibGludXgvaGFyZGlycS5oIiB1c2VzIHRoaXMuICAqLworCisjZGVmaW5lIFBSRUVNUFRfQUNUSVZFCQkweDEwMDAwMDAwCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkudGFzayAgICAgICAgICAgPSAmdHNrLCAgICAgICAgICAgICAgICAgXAorCS5leGVjX2RvbWFpbiAgICA9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLCBcCisJLmZsYWdzICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgIFwKKwkuY3B1ICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgXAorCS5wcmVlbXB0X2NvdW50ICA9IDEsICAgICAgICAgICAgICAgICAgICBcCisJLmFkZHJfbGltaXQgICAgID0gS0VSTkVMX0RTLCAgICAgICAgICAgIFwKKwkucmVzdGFydF9ibG9jayA9IHsgICAgICAgICAgICAgICAgICAgICAgXAorCQkuZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGwsICAgIFwKKwl9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCS5zcCA9IDAsCQkJCVwKKwkucmVncyA9IE5VTEwsCQkJXAorfQorCisjZGVmaW5lIGluaXRfdGhyZWFkX2luZm8gICAgICAgIChpbml0X3RocmVhZF91bmlvbi50aHJlYWRfaW5mbykKKyNkZWZpbmUgaW5pdF9zdGFjayAgICAgICAgICAgICAgKGluaXRfdGhyZWFkX3VuaW9uLnN0YWNrKQorCisvKiBUYWNreSBwcmVwcm9jZXNzb3IgdHJpY2tlcnkgKi8KKyNkZWZpbmUJcXFzdHIocykgcXN0cihzKQorI2RlZmluZSBxc3RyKHMpICNzCisjZGVmaW5lIFFVT1RFRF9USFJFQURJTkZPX1JFRyBxcXN0cihUSFJFQURJTkZPX1JFRykKKworcmVnaXN0ZXIgc3RydWN0IHRocmVhZF9pbmZvICpfX2N1cnJlbnRfdGhyZWFkX2luZm8gYXNtKFFVT1RFRF9USFJFQURJTkZPX1JFRyk7CisjZGVmaW5lIGN1cnJlbnRfdGhyZWFkX2luZm8oKSAgX19jdXJyZW50X3RocmVhZF9pbmZvCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIHRocmVhZCBpbmZvcm1hdGlvbiBmbGFncworICogLSB0aGVzZSBhcmUgcHJvY2VzcyBzdGF0ZSBmbGFncyB0aGF0IHZhcmlvdXMgYXNzZW1ibHkgZmlsZXMKKyAqICAgbWF5IG5lZWQgdG8gYWNjZXNzCisgKiAtIHBlbmRpbmcgd29yay10by1iZS1kb25lIGZsYWdzIGFyZSBpbiBMU1cKKyAqIC0gb3RoZXIgZmxhZ3MgaW4gTVNXCisgKi8KKworI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRSAgICAgICAwICAgICAgIC8qIHN5c2NhbGwgdHJhY2UgYWN0aXZlICovCisjZGVmaW5lIFRJRl9OT1RJRllfUkVTVU1FICAgICAgIDEgICAgICAgLyogcmVzdW1wdGlvbiBub3RpZmljYXRpb24gcmVxdWVzdGVkICovCisjZGVmaW5lIFRJRl9TSUdQRU5ESU5HICAgICAgICAgIDIgICAgICAgLyogc2lnbmFsIHBlbmRpbmcgKi8KKyNkZWZpbmUgVElGX05FRURfUkVTQ0hFRCAgICAgICAgMyAgICAgICAvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCisjZGVmaW5lIFRJRl9TSU5HTEVTVEVQICAgICAgICAgIDQgICAgICAgLyogcmVzdG9yZSBzcyBAIHJldHVybiB0byB1c3IgbW9kZSAqLworI2RlZmluZSBUSUZfSVJFVCAgICAgICAgICAgICAgICA1ICAgICAgIC8qIHJldHVybiB3aXRoIGlyZXQgKi8KKyNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSyAgICAgNiAgICAgICAvKiByZXN0b3JlIHNpZyBtYXNrIGluIGRvX3NpZ25hbCgpICovCisvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLworI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcgICAgICAxNgorI2RlZmluZSBUSUZfTUVNRElFICAgICAgICAgICAgICAxNyAgICAgIC8qIE9PTSBraWxsZXIga2lsbGVkIHByb2Nlc3MgKi8KKworI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UgICAgICAoMSA8PCBUSUZfU1lTQ0FMTF9UUkFDRSkKKyNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FICAgICAgKDEgPDwgVElGX05PVElGWV9SRVNVTUUpCisjZGVmaW5lIF9USUZfU0lHUEVORElORyAgICAgICAgICgxIDw8IFRJRl9TSUdQRU5ESU5HKQorI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRCAgICAgICAoMSA8PCBUSUZfTkVFRF9SRVNDSEVEKQorI2RlZmluZSBfVElGX1NJTkdMRVNURVAgICAgICAgICAoMSA8PCBUSUZfU0lOR0xFU1RFUCkKKyNkZWZpbmUgX1RJRl9JUkVUICAgICAgICAgICAgICAgKDEgPDwgVElGX0lSRVQpCisjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLICAgICgxIDw8IFRJRl9SRVNUT1JFX1NJR01BU0spCisjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcgICAgICgxIDw8IFRJRl9QT0xMSU5HX05SRkxBRykKKworLyogd29yayB0byBkbyBvbiBpbnRlcnJ1cHQvZXhjZXB0aW9uIHJldHVybiAtIEFsbCBidXQgVElGX1NZU0NBTExfVFJBQ0UgKi8KKyNkZWZpbmUgX1RJRl9XT1JLX01BU0sgICAgICAgICAgKDB4MDAwMEZGRkYgJiB+X1RJRl9TWVNDQUxMX1RSQUNFKQorCisvKiB3b3JrIHRvIGRvIG9uIGFueSByZXR1cm4gdG8gdS1zcGFjZSAqLworI2RlZmluZSBfVElGX0FMTFdPUktfTUFTSyAgICAgICAweDAwMDBGRkZGCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RpbWUuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxYjgyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aW1lLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgQVNNX1RJTUVfSAorI2RlZmluZSBBU01fVElNRV9ICisKK2V4dGVybiBjeWNsZXNfdCAgICAgICAgcGN5Y2xlX2ZyZXFfbWh6OworZXh0ZXJuIGN5Y2xlc190ICAgICAgICB0aHJlYWRfZnJlcV9taHo7CitleHRlcm4gY3ljbGVzX3QgICAgICAgIHNsZWVwX2Nsa19mcmVxOworCit2b2lkIHNldHVwX3BlcmNwdV9jbG9ja2Rldih2b2lkKTsKK3ZvaWQgaXBpX3RpbWVyKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aW1lci1yZWdzLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGltZXItcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGRiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGltZXItcmVncy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBUaW1lciBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1RJTUVSX1JFR1NfSAorI2RlZmluZSBfQVNNX1RJTUVSX1JFR1NfSAorCisvKiAgVGhpcyBzdHVmZiBzaG91bGQgZ28gaW50byBhIHBsYXRmb3JtIHNwZWNpZmljIGZpbGUgICovCisjZGVmaW5lIFRDWDBfQ0xLX1JBVEUJCTE5MjAwCisjZGVmaW5lIFRJTUVSX0VOQUJMRQkJMAorI2RlZmluZSBUSU1FUl9DTFJfT05fTUFUQ0gJMQorCisvKgorICogOHg1MCBIREQgU3BlY3MgNS04LiAgU2ltdWxhdG9yIGNvLXNpbSBub3QgZml4ZWQgdW50aWwKKyAqIHJlbGVhc2UgMS4xLCBhbmQgdGhlbiBpdCdzICJhZGp1c3RhYmxlIiBhbmQgcHJvYmFibHkgbm90IGRlZmF1bHRlZC4KKyAqLworI2RlZmluZSBSVE9TX1RJTUVSX0lOVAkJMworI2lmZGVmIENPTkZJR19IRVhBR09OX0NPTUVUCisjZGVmaW5lIFJUT1NfVElNRVJfUkVHU19BRERSCTB4QUIwMDAwMDBVTAorI2VuZGlmCisjZGVmaW5lIFNMRUVQX0NMS19SQVRFCQkzMjAwMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aW1leC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExYzYyYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aW1leC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fVElNRVhfSAorI2RlZmluZSBfQVNNX1RJTUVYX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLXJlZ3MuaD4KKworLyogVXNpbmcgVENYMCBhcyBvdXIgY2xvY2suICBDTE9DS19USUNLX1JBVEUgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQuICovCisjZGVmaW5lIENMT0NLX1RJQ0tfUkFURSAgICAgICAgICAgICAgVENYMF9DTEtfUkFURQorCisjZGVmaW5lIEFSQ0hfSEFTX1JFQURfQ1VSUkVOVF9USU1FUgorCitzdGF0aWMgaW5saW5lIGludCByZWFkX2N1cnJlbnRfdGltZXIodW5zaWduZWQgbG9uZyAqdGltZXJfdmFsKQoreworCSp0aW1lcl92YWwgPSAodW5zaWduZWQgbG9uZykgX192bWdldHRpbWUoKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGxiLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGxiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczYWJkZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90bGIuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1RMQl9ICisjZGVmaW5lIF9BU01fVExCX0gKKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworLyoKKyAqIFdlIGRvbid0IG5lZWQgYW55IHNwZWNpYWwgcGVyLXB0ZSBvciBwZXItdm1hIGhhbmRsaW5nLi4uCisgKi8KKyNkZWZpbmUgdGxiX3N0YXJ0X3ZtYSh0bGIsIHZtYSkJCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB0bGJfZW5kX3ZtYSh0bGIsIHZtYSkJCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBfX3RsYl9yZW1vdmVfdGxiX2VudHJ5KHRsYiwgcHRlcCwgYWRkcmVzcykJZG8geyB9IHdoaWxlICgwKQorCisvKgorICogLi4gYmVjYXVzZSB3ZSBmbHVzaCB0aGUgd2hvbGUgbW0gd2hlbiBpdCBmaWxscyB1cAorICovCisjZGVmaW5lIHRsYl9mbHVzaCh0bGIpCQlmbHVzaF90bGJfbW0oKHRsYiktPm1tKQorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGxiLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGxiZmx1c2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODlhOTAyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIFRMQiBmbHVzaCBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1RMQkZMVVNIX0gKKyNkZWZpbmUgX0FTTV9UTEJGTFVTSF9ICisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworLyoKKyAqIFRMQiBmbHVzaGluZyAtLSBpbiAiU01QIiwgdGhlc2Ugcm91dGluZXMgZ2V0IGRlZmluZWQgdG8gYmUgdGhlCisgKiBvbmVzIGZyb20gc21wLmMsIGVsc2UgdGhleSBhcmUgc29tZSBsb2NhbCBmbGF2b3JzLgorICovCisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNvbW1vbmx5IG1hY3JvcywgYnV0IGluIHRoZSBpbnRlcmVzdHMgb2YKKyAqIFZNIHZzLiBuYXRpdmUgaW1wbGVtZW50YXRpb24gYW5kIGNvZGUgc2l6ZSwgd2Ugc2ltcGx5IGRlY2xhcmUKKyAqIHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzIGhlcmUuCisgKi8KK2V4dGVybiB2b2lkIHRsYl9mbHVzaF9hbGwodm9pZCk7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfb25lKHVuc2lnbmVkIGxvbmcpOworCisvKgorICogIlRoaXMgaXMgY2FsbGVkIGluIG11bm1hcCB3aGVuIHdlIGhhdmUgZnJlZWQgdXAgc29tZSBwYWdlLXRhYmxlIHBhZ2VzLgorICogV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLi4uIgorICoKKyAqIFRoZSBWTSBrZXJuZWwgZG9lc24ndCB3YWxrIHBhZ2UgdGFibGVzLCBhbmQgdGhleSBhcmUgcGFzc2VkIHRvIHRoZSBWTU0KKyAqIGJ5IGxvZ2ljYWwgYWRkcmVzcy4gVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBwb3NzaWJpbGl0eSB0aGF0IHRoZXkKKyAqIGNvdWxkIGJlIHJlZmVyZW5jZWQgYnkgdGhlIFZNIGtlcm5lbCBiYXNlZCBvbiBhIHN0YWxlIG1hcHBpbmcsIHNpbmNlCisgKiB0aGV5IHdvdWxkIG9ubHkgYmUgbG9jYXRlZCBieSBjb25zdWx0aW5nIHRoZSBtbSBzdHJ1Y3R1cmUsIGFuZCB0aGV5CisgKiB3aWxsIGhhdmUgYmVlbiBwdXJnZWQgZnJvbSB0aGF0IHN0cnVjdHVyZSBieSB0aGUgbXVubWFwLiAgU2VlbXMgbGlrZQorICogYSBub29wIG9uIEhWTSBhcyB3ZWxsLgorICovCisjZGVmaW5lIGZsdXNoX3RsYl9wZ3RhYmxlcyhtbSwgc3RhcnQsIGVuZCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdHJhcHMuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90cmFwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNDA3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdHJhcHMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogVHJhcCBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0hFWEFHT05fVFJBUFNfSAorI2RlZmluZSBfQVNNX0hFWEFHT05fVFJBUFNfSAorCisjaW5jbHVkZSA8YXNtL3JlZ2lzdGVycy5oPgorCitleHRlcm4gaW50IGRpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycik7CitleHRlcm4gaW50IGRpZV9pZl9rZXJuZWwoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpOworCisjZW5kaWYgLyogX0FTTV9IRVhBR09OX1RSQVBTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzA2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogVXNlciBtZW1vcnkgYWNjZXNzIHN1cHBvcnQgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fVUFDQ0VTU19ICisjZGVmaW5lIF9BU01fVUFDQ0VTU19ICisvKgorICogVXNlciBzcGFjZSBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucworICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisKKy8qCisgKiBhY2Nlc3Nfb2s6IC0gQ2hlY2tzIGlmIGEgdXNlciBzcGFjZSBwb2ludGVyIGlzIHZhbGlkCisgKiBAdHlwZTogVHlwZSBvZiBhY2Nlc3M6ICVWRVJJRllfUkVBRCBvciAlVkVSSUZZX1dSSVRFLiAgTm90ZSB0aGF0CisgKiAgICAgICAgJVZFUklGWV9XUklURSBpcyBhIHN1cGVyc2V0IG9mICVWRVJJRllfUkVBRCAtIGlmIGl0IGlzIHNhZmUKKyAqICAgICAgICB0byB3cml0ZSB0byBhIGJsb2NrLCBpdCBpcyBhbHdheXMgc2FmZSB0byByZWFkIGZyb20gaXQuCisgKiBAYWRkcjogVXNlciBzcGFjZSBwb2ludGVyIHRvIHN0YXJ0IG9mIGJsb2NrIHRvIGNoZWNrCisgKiBAc2l6ZTogU2l6ZSBvZiBibG9jayB0byBjaGVjaworICoKKyAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCisgKgorICogQ2hlY2tzIGlmIGEgcG9pbnRlciB0byBhIGJsb2NrIG9mIG1lbW9yeSBpbiB1c2VyIHNwYWNlIGlzIHZhbGlkLgorICoKKyAqIFJldHVybnMgdHJ1ZSAobm9uemVybykgaWYgdGhlIG1lbW9yeSBibG9jayAqbWF5KiBiZSB2YWxpZCwgZmFsc2UgKHplcm8pCisgKiBpZiBpdCBpcyBkZWZpbml0ZWx5IGludmFsaWQuCisgKgorICogVXNlciBhZGRyZXNzIHNwYWNlIGluIEhleGFnb24sIGxpa2UgeDg2LCBnb2VzIHRvIDB4YmZmZmZmZmYsIHNvIHRoZQorICogc2ltcGxlIE1TQi1iYXNlZCB0ZXN0cyB1c2VkIGJ5IE1JUFMgd29uJ3Qgd29yay4gIFNvbWUgZnVydGhlcgorICogb3B0aW1pemF0aW9uIGlzIHByb2JhYmx5IHBvc3NpYmxlIGhlcmUsIGJ1dCBmb3Igbm93LCBrZWVwIGl0CisgKiByZWFzb25hYmx5IHNpbXBsZSBhbmQgbm90ICp0b28qIHNsb3cuICBBZnRlciBhbGwsIHdlJ3ZlIGdvdCB0aGUKKyAqIE1NVSBmb3IgYmFja3VwLgorICovCisjZGVmaW5lIFZFUklGWV9SRUFEICAgICAwCisjZGVmaW5lIFZFUklGWV9XUklURSAgICAxCisKKyNkZWZpbmUgX19hY2Nlc3Nfb2soYWRkciwgc2l6ZSkgXAorCSgoZ2V0X2ZzKCkuc2VnID09IEtFUk5FTF9EUy5zZWcpIHx8IFwKKwkoKCh1bnNpZ25lZCBsb25nKWFkZHIgPCBnZXRfZnMoKS5zZWcpICYmIFwKKwkgICh1bnNpZ25lZCBsb25nKXNpemUgPCAoZ2V0X2ZzKCkuc2VnIC0gKHVuc2lnbmVkIGxvbmcpYWRkcikpKQorCisvKgorICogV2hlbiBhIGtlcm5lbC1tb2RlIHBhZ2UgZmF1bHQgaXMgdGFrZW4sIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbgorICogYWRkcmVzcyBpcyBjaGVja2VkIGFnYWluc3QgYSB0YWJsZSBvZiBleGNlcHRpb25fdGFibGVfZW50cmllcy4KKyAqIEVhY2ggZW50cnkgaXMgYSB0dXBsZSBvZiB0aGUgYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IG1heQorICogYmUgYXV0aG9yaXplZCB0byBmYXVsdCwgYW5kIHRoZSBhZGRyZXNzIGF0IHdoaWNoIGV4ZWN1dGlvbiBzaG91bGQKKyAqIGJlIHJlc3VtZWQgaW5zdGVhZCBvZiB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24sIHNvIGFzIHRvIGVmZmVjdAorICogYSB3b3JrYXJvdW5kLgorICovCisKKy8qICBBc3NlbWJseSBzb21ld2hhdCBvcHRpbWl6ZWQgY29weSByb3V0aW5lcyAgKi8KK3Vuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcl9oZXhhZ29uKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbik7Cit1bnNpZ25lZCBsb25nIF9fY29weV90b191c2VyX2hleGFnb24odm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbik7CisKKyNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikgX19jb3B5X2Zyb21fdXNlcl9oZXhhZ29uKHRvLCBmcm9tLCBuKQorI2RlZmluZSBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikgX19jb3B5X3RvX3VzZXJfaGV4YWdvbih0bywgZnJvbSwgbikKKworLyoKKyAqIFhYWCB0b2RvOiBzb21lIGFkZGl0b25hbCBwZXJmb3JtYW5jZSBnYWluIGlzIHBvc3NpYmxlIGJ5CisgKiBpbXBsZW1lbnRpbmcgX19jb3B5X3RvL2Zyb21fdXNlcl9pbmF0b21pYywgd2hpY2ggaXMgbXVjaAorICogbGlrZSBfX2NvcHlfdG8vZnJvbV91c2VyLCBidXQgcGVyZm9ybXMgc2xpZ2h0bHkgbGVzcyBjaGVja2luZy4KKyAqLworCitfX2tlcm5lbF9zaXplX3QgX19jbGVhcl91c2VyX2hleGFnb24odm9pZCBfX3VzZXIgKmRlc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpOworI2RlZmluZSBfX2NsZWFyX3VzZXIoYSwgcykgX19jbGVhcl91c2VyX2hleGFnb24oKGEpLCAocykpCisKKyNkZWZpbmUgX19zdHJuY3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbikgaGV4YWdvbl9zdHJuY3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbikKKworLyogIGdldCBhcm91bmQgdGhlIGlmbmRlZiBpbiBhc20tZ2VuZXJpYy91YWNjZXNzLmggICovCisjZGVmaW5lIF9fc3Rybmxlbl91c2VyIF9fc3Rybmxlbl91c2VyCisKK2V4dGVybiBsb25nIF9fc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgbik7CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBoZXhhZ29uX3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywKKwkJCQkJICAgICBsb25nIG4pOworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdWFjY2Vzcy5oPgorCisvKiAgVG9kbzogIGFuIGFjdHVhbCBhY2NlbGVyYXRlZCB2ZXJzaW9uIG9mIHRoaXMuICAqLworc3RhdGljIGlubGluZSBsb25nIGhleGFnb25fc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLAorCQkJCQkgICAgIGxvbmcgbikKK3sKKwlsb25nIHJlcyA9IF9fc3Rybmxlbl91c2VyKHNyYywgbik7CisKKwkvKiByZXR1cm4gZnJvbSBzdHJubGVuIGNhbid0IGJlIHplcm8gLS0gdGhhdCB3b3VsZCBiZSBydWJiaXNoLiAqLworCisJaWYgKHJlcyA+IG4pIHsKKwkJY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIG4pOworCQlyZXR1cm4gbjsKKwl9IGVsc2UgeworCQljb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgcmVzKTsKKwkJcmV0dXJuIHJlcy0xOworCX0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwZWNkZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogU3lzY2FsbCBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmICFkZWZpbmVkKF9BU01fSEVYQUdPTl9VTklTVERfSCkgfHwgZGVmaW5lZChfX1NZU0NBTEwpCisjZGVmaW5lIF9BU01fSEVYQUdPTl9VTklTVERfSAorCisvKgorICogIFRoZSBrZXJuZWwgcHVsbHMgdGhpcyB1bmlzdGQuaCBpbiB0aHJlZSBkaWZmZXJlbnQgd2F5czoKKyAqICAxLiAgdGhlICJub3JtYWwiIHdheSB3aGljaCBnZXRzIGFsbCB0aGUgX19OUiBkZWZpbmVzCisgKiAgMi4gIHdpdGggX19TWVNDQUxMIGRlZmluZWQgdG8gcHJvZHVjZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqICAzLiAgd2l0aCBfX1NZU0NBTEwgZGVmaW5lZCB0byBwcm9kdWNlIHN5c2NhbGwgdGFibGUgaW5pdGlhbGl6YXRpb24KKyAqICBTZWUgYWxzbzogIHN5c2NhbGx0YWIuYworICovCisKKyNkZWZpbmUgc3lzX21tYXAyIHN5c19tbWFwX3Bnb2ZmCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy91bmlzdGQuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdXNlci5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU1MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VzZXIuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBIRVhBR09OX0FTTV9VU0VSX0gKKyNkZWZpbmUgSEVYQUdPTl9BU01fVVNFUl9ICisKKy8qCisgKiBMYXlvdXQgZm9yIHJlZ2lzdGVycyBwYXNzZWQgaW4gZWxmIGNvcmUgZHVtcHMgdG8gdXNlcnNwYWNlLgorICoKKyAqIEJhc2ljYWxseSBhIHJlYXJyYW5nZWQgc3Vic2V0IG9mICJwdF9yZWdzIi4KKyAqCisgKiBJbnRlcmVzdGVkIHBhcnRpZXM6ICBsaWJjLCBnZGIuLi4KKyAqLworCitzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyByMDsKKwl1bnNpZ25lZCBsb25nIHIxOworCXVuc2lnbmVkIGxvbmcgcjI7CisJdW5zaWduZWQgbG9uZyByMzsKKwl1bnNpZ25lZCBsb25nIHI0OworCXVuc2lnbmVkIGxvbmcgcjU7CisJdW5zaWduZWQgbG9uZyByNjsKKwl1bnNpZ25lZCBsb25nIHI3OworCXVuc2lnbmVkIGxvbmcgcjg7CisJdW5zaWduZWQgbG9uZyByOTsKKwl1bnNpZ25lZCBsb25nIHIxMDsKKwl1bnNpZ25lZCBsb25nIHIxMTsKKwl1bnNpZ25lZCBsb25nIHIxMjsKKwl1bnNpZ25lZCBsb25nIHIxMzsKKwl1bnNpZ25lZCBsb25nIHIxNDsKKwl1bnNpZ25lZCBsb25nIHIxNTsKKwl1bnNpZ25lZCBsb25nIHIxNjsKKwl1bnNpZ25lZCBsb25nIHIxNzsKKwl1bnNpZ25lZCBsb25nIHIxODsKKwl1bnNpZ25lZCBsb25nIHIxOTsKKwl1bnNpZ25lZCBsb25nIHIyMDsKKwl1bnNpZ25lZCBsb25nIHIyMTsKKwl1bnNpZ25lZCBsb25nIHIyMjsKKwl1bnNpZ25lZCBsb25nIHIyMzsKKwl1bnNpZ25lZCBsb25nIHIyNDsKKwl1bnNpZ25lZCBsb25nIHIyNTsKKwl1bnNpZ25lZCBsb25nIHIyNjsKKwl1bnNpZ25lZCBsb25nIHIyNzsKKwl1bnNpZ25lZCBsb25nIHIyODsKKwl1bnNpZ25lZCBsb25nIHIyOTsKKwl1bnNpZ25lZCBsb25nIHIzMDsKKwl1bnNpZ25lZCBsb25nIHIzMTsKKwl1bnNpZ25lZCBsb25nIHNhMDsKKwl1bnNpZ25lZCBsb25nIGxjMDsKKwl1bnNpZ25lZCBsb25nIHNhMTsKKwl1bnNpZ25lZCBsb25nIGxjMTsKKwl1bnNpZ25lZCBsb25nIG0wOworCXVuc2lnbmVkIGxvbmcgbTE7CisJdW5zaWduZWQgbG9uZyB1c3I7CisJdW5zaWduZWQgbG9uZyBwM18wOworCXVuc2lnbmVkIGxvbmcgZ3A7CisJdW5zaWduZWQgbG9uZyB1Z3A7CisJdW5zaWduZWQgbG9uZyBwYzsKKwl1bnNpZ25lZCBsb25nIGNhdXNlOworCXVuc2lnbmVkIGxvbmcgYmFkdmE7CisJdW5zaWduZWQgbG9uZyBwYWQxOyAgLyogcGFkIG91dCB0byA0OCB3b3JkcyB0b3RhbCAqLworCXVuc2lnbmVkIGxvbmcgcGFkMjsgIC8qIHBhZCBvdXQgdG8gNDggd29yZHMgdG90YWwgKi8KKwl1bnNpZ25lZCBsb25nIHBhZDM7ICAvKiBwYWQgb3V0IHRvIDQ4IHdvcmRzIHRvdGFsICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS92ZHNvLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdmRzby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTVjYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdmRzby5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiB2RFNPIGltcGxlbWVudGF0aW9uIGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19BU01fVkRTT19ICisjZGVmaW5lIF9fQVNNX1ZEU09fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGhleGFnb25fdmRzbyB7CisJdTMyIHJ0X3NpZ25hbF90cmFtcG9saW5lWzJdOworfTsKKworI2VuZGlmIC8qIF9fQVNNX1ZEU09fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3ZtX2ZhdWx0LmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdm1fZmF1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWNkYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3ZtX2ZhdWx0LmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9IRVhBR09OX1ZNX0ZBVUxUX0gKKyNkZWZpbmUgX0FTTV9IRVhBR09OX1ZNX0ZBVUxUX0gKKworZXh0ZXJuIHZvaWQgZXhlY3V0ZV9wcm90ZWN0aW9uX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQgd3JpdGVfcHJvdGVjdGlvbl9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiB2b2lkIHJlYWRfcHJvdGVjdGlvbl9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdm1fbW11LmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdm1fbW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwNDYyZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS92bV9tbXUuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIEhleGFnb24gVk0gcGFnZSB0YWJsZSBlbnRyeSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9WTV9NTVVfSAorI2RlZmluZSBfQVNNX1ZNX01NVV9ICisKKy8qCisgKiBTaGlmdCwgbWFzaywgYW5kIG90aGVyIGNvbnN0YW50cyBmb3IgdGhlIEhleGFnb24gVmlydHVhbCBNYWNoaW5lCisgKiBwYWdlIHRhYmxlcy4KKyAqCisgKiBWaXJ0dWFsIG1hY2hpbmUgTU1VIGFsbG93cyBmaXJzdC1sZXZlbCBlbnRyaWVzIHRvIGVpdGhlciBiZQorICogc2luZ2xlLWxldmVsIGxvb2t1cCBQVEVzIGZvciB2ZXJ5IGxhcmdlIHBhZ2VzLCBvciBQREVzIHBvaW50aW5nCisgKiB0byBzZWNvbmQtbGV2ZWwgUFRFcyBmb3Igc21hbGxlciBwYWdlcy4gSWYgUFRFIGlzIHNpbmdsZS1sZXZlbCwKKyAqIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGNhbm5vdCBiZSB1c2VkIGFzIHNvZnR3YXJlIGJpdHMgdG8gZW5jb2RlCisgKiB2aXJ0dWFsIG1lbW9yeSBzdWJzeXN0ZW0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhZ2UsIGFuZCB0aGF0IHN0YXRlCisgKiBtdXN0IGJlIG1haW50YWluZWQgaW4gc29tZSBwYXJhbGxlbCBkYXRhIHN0cnVjdHVyZS4KKyAqLworCisvKiBTIG9yIFBhZ2UgU2l6ZSBmaWVsZCBpbiBQREUgKi8KKyNkZWZpbmUJX19IVk1fUERFX1MJCSgweDcgPDwgMCkKKyNkZWZpbmUgX19IVk1fUERFX1NfNEtCCQkwCisjZGVmaW5lIF9fSFZNX1BERV9TXzE2S0IJMQorI2RlZmluZSBfX0hWTV9QREVfU182NEtCCTIKKyNkZWZpbmUgX19IVk1fUERFX1NfMjU2S0IJMworI2RlZmluZSBfX0hWTV9QREVfU18xTUIJCTQKKyNkZWZpbmUgX19IVk1fUERFX1NfNE1CCQk1CisjZGVmaW5lIF9fSFZNX1BERV9TXzE2TUIJNgorI2RlZmluZSBfX0hWTV9QREVfU19JTlZBTElECTcKKworLyogTWFza3MgZm9yIEwyIHBhZ2UgdGFibGUgcG9pbnRlciwgYXMgZnVuY3Rpb24gb2YgcGFnZSBzaXplICovCisjZGVmaW5lIF9fSFZNX1BERV9QVE1BU0tfNEtCCTB4ZmZmZmYwMDAKKyNkZWZpbmUgX19IVk1fUERFX1BUTUFTS18xNktCCTB4ZmZmZmZjMDAKKyNkZWZpbmUgX19IVk1fUERFX1BUTUFTS182NEtCCTB4ZmZmZmZmMDAKKyNkZWZpbmUgX19IVk1fUERFX1BUTUFTS18yNTZLQgkweGZmZmZmZmMwCisjZGVmaW5lIF9fSFZNX1BERV9QVE1BU0tfMU1CCTB4ZmZmZmZmZjAKKworLyoKKyAqIFZpcnR1YWwgTWFjaGluZSBQVEUgQml0cy9GaWVsZHMKKyAqLworI2RlZmluZSBfX0hWTV9QVEVfVAkJKDE8PDQpCisjZGVmaW5lIF9fSFZNX1BURV9VCQkoMTw8NSkKKyNkZWZpbmUJX19IVk1fUFRFX0MJCSgweDc8PDYpCisjZGVmaW5lIF9fSFZNX1BURV9DVkFMKHB0ZSkJKCgocHRlKSAmIF9fSFZNX1BURV9DKSA+PiA2KQorI2RlZmluZSBfX0hWTV9QVEVfUgkJKDE8PDkpCisjZGVmaW5lIF9fSFZNX1BURV9XCQkoMTw8MTApCisjZGVmaW5lIF9fSFZNX1BURV9YCQkoMTw8MTEpCisKKy8qCisgKiBDYWNoZSBBdHRyaWJ1dGVzLCB0byBiZSBzaGlmdGVkIGFzIG5lY2Vzc2FyeSBmb3IgdmlydHVhbC9waHlzaWNhbCBQVEVzCisgKi8KKworI2RlZmluZSBfX0hFWEFHT05fQ19XQgkJMHgwCS8qIFdyaXRlLWJhY2ssIG5vIEwyICovCisjZGVmaW5lCV9fSEVYQUdPTl9DX1dUCQkweDEJLyogV3JpdGUtdGhyb3VnaCwgbm8gTDIgKi8KKyNkZWZpbmUJX19IRVhBR09OX0NfREVWCQkweDQJLyogRGV2aWNlIHJlZ2lzdGVyIHNwYWNlICovCisjZGVmaW5lCV9fSEVYQUdPTl9DX1dUX0wyCTB4NQkvKiBXcml0ZS10aHJvdWdoLCB3aXRoIEwyICovCisvKiB0aGlzIHJlYWxseSBzaG91bGQgYmUgI2lmIENPTkZJR19IRVhBR09OX0FSQ0ggPSAyIGJ1dCB0aGF0J3Mgbm90IGRlZmluZWQgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19IRVhBR09OX0NPTUVUKSB8fCBkZWZpbmVkKENPTkZJR19RRFNQNl9TVDEpCisjZGVmaW5lIF9fSEVYQUdPTl9DX1VOQwkJX19IRVhBR09OX0NfREVWCisjZWxzZQorI2RlZmluZQlfX0hFWEFHT05fQ19VTkMJCTB4NgkvKiBVbmNhY2hlZCBtZW1vcnkgKi8KKyNlbmRpZgorI2RlZmluZQlfX0hFWEFHT05fQ19XQl9MMgkweDcJLyogV3JpdGUtYmFjaywgd2l0aCBMMiAqLworCisvKgorICogVGhpcyBjYW4gYmUgb3ZlcnJpZGVuLCBidXQgd2UncmUgZGVmYXVsdGluZyB0byB0aGUgbW9zdCBhZ2dyZXNzaXZlCisgKiBjYWNoZSBwb2xpY3ksIHRoZSBiZXR0ZXIgdG8gZmluZCBidWdzIHNvb25lci4KKyAqLworCisjZGVmaW5lCUNBQ0hFX0RFRkFVTFQJX19IRVhBR09OX0NfV0JfTDIKKworLyogTWFza3MgZm9yIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcywgYXMgYSBmdW5jdGlvbiBvZiBwYWdlIHNpemUgKi8KKworI2RlZmluZSBfX0hWTV9QVEVfUEdNQVNLXzRLQgkweGZmZmZmMDAwCisjZGVmaW5lIF9fSFZNX1BURV9QR01BU0tfMTZLQgkweGZmZmZjMDAwCisjZGVmaW5lIF9fSFZNX1BURV9QR01BU0tfNjRLQgkweGZmZmYwMDAwCisjZGVmaW5lIF9fSFZNX1BURV9QR01BU0tfMjU2S0IJMHhmZmZjMDAwMAorI2RlZmluZSBfX0hWTV9QVEVfUEdNQVNLXzFNQgkweGZmZjAwMDAwCisKKy8qIE1hc2tzIGZvciBzaW5nbGUtbGV2ZWwgbGFyZ2UgcGFnZSBsb29rdXBzICovCisKKyNkZWZpbmUgX19IVk1fUFRFX1BHTUFTS180TUIJMHhmZmMwMDAwMAorI2RlZmluZSBfX0hWTV9QVEVfUEdNQVNLXzE2TUIJMHhmZjAwMDAwMAorCisvKgorICogIkJpZyBrZXJuZWwgcGFnZSBtYXBwaW5ncyIgKHNlZSB2bV9pbml0X3NlZ3RhYmxlLlMpCisgKiBhcmUgY3VycmVudGx5IDE2TUIKKyAqLworCisjZGVmaW5lIEJJR19LRVJORUxfUEFHRV9TSElGVCAyNAorI2RlZmluZSBCSUdfS0VSTkVMX1BBR0VfU0laRSAoMSA8PCBCSUdfS0VSTkVMX1BBR0VfU0hJRlQpCisKKworCisjZW5kaWYgLyogX0FTTV9WTV9NTVVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4OWYzNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvTWFrZWZpbGUKQEAgLTAsMCArMSwxOCBAQAorZXh0cmEteSA6PSBoZWFkLm8gdm1saW51eC5sZHMgaW5pdF90YXNrLm8KKworb2JqLSQoQ09ORklHX1NNUCkgKz0gc21wLm8gdG9wb2xvZ3kubworCitvYmoteSArPSBzZXR1cC5vIGlycV9jcHUubyB0cmFwcy5vIHN5c2NhbGx0YWIubyBzaWduYWwubyB0aW1lLm8KK29iai15ICs9IHByb2Nlc3MubyBzeXNjYWxsLm8gdHJhbXBvbGluZS5vIHJlc2V0Lm8gcHRyYWNlLm8KK29iai15ICs9IHZkc28ubworCitvYmotJChDT05GSUdfS0dEQikgICAgKz0ga2dkYi5vCitvYmotJChDT05GSUdfTU9EVUxFUykgKz0gbW9kdWxlLm8gaGV4YWdvbl9rc3ltcy5vCisKKyMgTW9kdWxlcyByZXF1aXJlZCB0byB3b3JrIHdpdGggdGhlIEhleGFnb24gVmlydHVhbCBNYWNoaW5lCitvYmoteSArPSB2bV9lbnRyeS5vIHZtX2V2ZW50cy5vIHZtX3N3aXRjaC5vIHZtX29wcy5vIHZtX2luaXRfc2VndGFibGUubworb2JqLXkgKz0gdm1fdmVjdG9ycy5vCisKK29iai0kKENPTkZJR19IQVNfRE1BKSArPSBkbWEubworCitvYmotJChDT05GSUdfU1RBQ0tUUkFDRSkgKz0gc3RhY2t0cmFjZS5vCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2hleGFnb24va2VybmVsL2FzbS1vZmZzZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmZmE1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBLZXZpbiBLaXNzZWxsLCBrZXZpbmtAbWlwcy5jb20gYW5kIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tidWlsZC5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qICBUaGlzIGZpbGUgaXMgdXNlZCB0byBwcm9kdWNlIGFzbS9saW5rZXJzY3JpcHQgY29uc3RhbnRzIGZyb20gaGVhZGVyCisgICAgZmlsZXMgdHlwaWNhbGx5IHVzZWQgaW4gYy4gIFNwZWNpZmljYWxseSwgaXQgZ2VuZXJhdGVzIGFzbS1vZmZzZXRzLmggICovCisKK2ludCBtYWluKHZvaWQpCit7CisJQ09NTUVOVCgiVGhpcyBpcyBhIGNvbW1lbnQuIik7CisJLyogIG1pZ2h0IGdldCB0aGVzZSBmcm9tIHNvbWV3aGVyZSBlbHNlLiAgKi8KKwlERUZJTkUoX1BBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwlERUZJTkUoX1BBR0VfU0hJRlQsIFBBR0VfU0hJRlQpOworCUJMQU5LKCk7CisKKwlDT01NRU5UKCJIZXhhZ29uIHB0X3JlZ3MgZGVmaW5pdGlvbnMiKTsKKwlPRkZTRVQoX1BUX1NZU0NBTExfTlIsIHB0X3JlZ3MsIHN5c2NhbGxfbnIpOworCU9GRlNFVChfUFRfVUdQR1AsIHB0X3JlZ3MsIHVncGdwKTsKKwlPRkZTRVQoX1BUX1IzMTMwLCBwdF9yZWdzLCByMzEzMCk7CisJT0ZGU0VUKF9QVF9SMjkyOCwgcHRfcmVncywgcjI5MjgpOworCU9GRlNFVChfUFRfUjI3MjYsIHB0X3JlZ3MsIHIyNzI2KTsKKwlPRkZTRVQoX1BUX1IyNTI0LCBwdF9yZWdzLCByMjUyNCk7CisJT0ZGU0VUKF9QVF9SMjMyMiwgcHRfcmVncywgcjIzMjIpOworCU9GRlNFVChfUFRfUjIxMjAsIHB0X3JlZ3MsIHIyMTIwKTsKKwlPRkZTRVQoX1BUX1IxOTE4LCBwdF9yZWdzLCByMTkxOCk7CisJT0ZGU0VUKF9QVF9SMTcxNiwgcHRfcmVncywgcjE3MTYpOworCU9GRlNFVChfUFRfUjE1MTQsIHB0X3JlZ3MsIHIxNTE0KTsKKwlPRkZTRVQoX1BUX1IxMzEyLCBwdF9yZWdzLCByMTMxMik7CisJT0ZGU0VUKF9QVF9SMTExMCwgcHRfcmVncywgcjExMTApOworCU9GRlNFVChfUFRfUjA5MDgsIHB0X3JlZ3MsIHIwOTA4KTsKKwlPRkZTRVQoX1BUX1IwNzA2LCBwdF9yZWdzLCByMDcwNik7CisJT0ZGU0VUKF9QVF9SMDUwNCwgcHRfcmVncywgcjA1MDQpOworCU9GRlNFVChfUFRfUjAzMDIsIHB0X3JlZ3MsIHIwMzAyKTsKKwlPRkZTRVQoX1BUX1IwMTAwLCBwdF9yZWdzLCByMDEwMCk7CisJT0ZGU0VUKF9QVF9MQzBTQTAsIHB0X3JlZ3MsIGxjMHNhMCk7CisJT0ZGU0VUKF9QVF9MQzFTQTEsIHB0X3JlZ3MsIGxjMXNhMSk7CisJT0ZGU0VUKF9QVF9NMU0wLCBwdF9yZWdzLCBtMW0wKTsKKwlPRkZTRVQoX1BUX1BSRURTVVNSLCBwdF9yZWdzLCBwcmVkc3Vzcik7CisJT0ZGU0VUKF9QVF9FVlJFQywgcHRfcmVncywgaHZtZXIpOworCU9GRlNFVChfUFRfRVJfVk1FTCwgcHRfcmVncywgaHZtZXIudm1lbCk7CisJT0ZGU0VUKF9QVF9FUl9WTUVTVCwgcHRfcmVncywgaHZtZXIudm1lc3QpOworCU9GRlNFVChfUFRfRVJfVk1QU1AsIHB0X3JlZ3MsIGh2bWVyLnZtcHNwKTsKKwlPRkZTRVQoX1BUX0VSX1ZNQkFEVkEsIHB0X3JlZ3MsIGh2bWVyLnZtYmFkdmEpOworCURFRklORShfUFRfUkVHU19TSVpFLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKwlCTEFOSygpOworCisJQ09NTUVOVCgiSGV4YWdvbiB0aHJlYWRfaW5mbyBkZWZpbml0aW9ucyIpOworCU9GRlNFVChfVEhSRUFEX0lORk9fRkxBR1MsIHRocmVhZF9pbmZvLCBmbGFncyk7CisJT0ZGU0VUKF9USFJFQURfSU5GT19QVF9SRUdTLCB0aHJlYWRfaW5mbywgcmVncyk7CisJT0ZGU0VUKF9USFJFQURfSU5GT19TUCwgdGhyZWFkX2luZm8sIHNwKTsKKwlERUZJTkUoX1RIUkVBRF9TSVpFLCBUSFJFQURfU0laRSk7CisJQkxBTksoKTsKKworCUNPTU1FTlQoIkhleGFnb24gaGV4YWdvbl9zd2l0Y2hfc3RhY2sgZGVmaW5pdGlvbnMiKTsKKwlPRkZTRVQoX1NXSVRDSF9SMTcxNiwgaGV4YWdvbl9zd2l0Y2hfc3RhY2ssIHIxNzE2KTsKKwlPRkZTRVQoX1NXSVRDSF9SMTkxOCwgaGV4YWdvbl9zd2l0Y2hfc3RhY2ssIHIxOTE4KTsKKwlPRkZTRVQoX1NXSVRDSF9SMjEyMCwgaGV4YWdvbl9zd2l0Y2hfc3RhY2ssIHIyMTIwKTsKKwlPRkZTRVQoX1NXSVRDSF9SMjMyMiwgaGV4YWdvbl9zd2l0Y2hfc3RhY2ssIHIyMzIyKTsKKworCU9GRlNFVChfU1dJVENIX1IyNTI0LCBoZXhhZ29uX3N3aXRjaF9zdGFjaywgcjI1MjQpOworCU9GRlNFVChfU1dJVENIX1IyNzI2LCBoZXhhZ29uX3N3aXRjaF9zdGFjaywgcjI3MjYpOworCU9GRlNFVChfU1dJVENIX0ZQLCBoZXhhZ29uX3N3aXRjaF9zdGFjaywgZnApOworCU9GRlNFVChfU1dJVENIX0xSLCBoZXhhZ29uX3N3aXRjaF9zdGFjaywgbHIpOworCURFRklORShfU1dJVENIX1NUQUNLX1NJWkUsIHNpemVvZihzdHJ1Y3QgaGV4YWdvbl9zd2l0Y2hfc3RhY2spKTsKKwlCTEFOSygpOworCisJQ09NTUVOVCgiSGV4YWdvbiB0YXNrX3N0cnVjdCBkZWZpbml0aW9ucyIpOworCU9GRlNFVChfVEFTS19USFJFQURfSU5GTywgdGFza19zdHJ1Y3QsIHN0YWNrKTsKKwlPRkZTRVQoX1RBU0tfU1RSVUNUX1RIUkVBRCwgdGFza19zdHJ1Y3QsIHRocmVhZCk7CisKKwlDT01NRU5UKCJIZXhhZ29uIHRocmVhZF9zdHJ1Y3QgZGVmaW5pdGlvbnMiKTsKKwlPRkZTRVQoX1RIUkVBRF9TVFJVQ1RfU1dJVENIX1NQLCB0aHJlYWRfc3RydWN0LCBzd2l0Y2hfc3ApOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL2RtYS5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzExYWNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9kbWEuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIERNQSBpbXBsZW1lbnRhdGlvbiBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9kbWEtbWFwcGluZy5oPgorCitzdHJ1Y3QgZG1hX21hcF9vcHMgKmRtYV9vcHM7CitFWFBPUlRfU1lNQk9MKGRtYV9vcHMpOworCitpbnQgYmFkX2RtYV9hZGRyZXNzOyAgLyogIGdsb2JhbHMgYXJlIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQgdG8gemVybyAgKi8KKworaW50IGRtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlpZiAobWFzayA9PSBETUFfQklUX01BU0soMzIpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkbWFfc3VwcG9ydGVkKTsKKworaW50IGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCWlmICghZGV2LT5kbWFfbWFzayB8fCAhZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spKQorCQlyZXR1cm4gLUVJTzsKKworCSpkZXYtPmRtYV9tYXNrID0gbWFzazsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkbWFfc2V0X21hc2spOworCitzdGF0aWMgc3RydWN0IGdlbl9wb29sICpjb2hlcmVudF9wb29sOworCisKKy8qIEFsbG9jYXRlcyBmcm9tIGEgcG9vbCBvZiB1bmNhY2hlZCBtZW1vcnkgdGhhdCB3YXMgcmVzZXJ2ZWQgYXQgYm9vdCB0aW1lICovCisKK3ZvaWQgKmhleGFnb25fZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJIGRtYV9hZGRyX3QgKmRtYV9hZGRyLCBnZnBfdCBmbGFnKQoreworCXZvaWQgKnJldDsKKworCWlmIChjb2hlcmVudF9wb29sID09IE5VTEwpIHsKKwkJY29oZXJlbnRfcG9vbCA9IGdlbl9wb29sX2NyZWF0ZShQQUdFX1NISUZULCAtMSk7CisKKwkJaWYgKGNvaGVyZW50X3Bvb2wgPT0gTlVMTCkKKwkJCXBhbmljKCJDYW4ndCBjcmVhdGUgJXMoKSBtZW1vcnkgcG9vbCEiLCBfX2Z1bmNfXyk7CisJCWVsc2UKKwkJCWdlbl9wb29sX2FkZChjb2hlcmVudF9wb29sLAorCQkJCShQQUdFX09GRlNFVCArIChtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZUKSksCisJCQkJaGV4YWdvbl9jb2hlcmVudF9wb29sX3NpemUsIC0xKTsKKwl9CisKKwlyZXQgPSAodm9pZCAqKSBnZW5fcG9vbF9hbGxvYyhjb2hlcmVudF9wb29sLCBzaXplKTsKKworCWlmIChyZXQpIHsKKwkJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisJCSpkbWFfYWRkciA9IChkbWFfYWRkcl90KSAocmV0IC0gUEFHRV9PRkZTRVQpOworCX0gZWxzZQorCQkqZG1hX2FkZHIgPSB+MDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhleGFnb25fZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKKwkJCQkgIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJZ2VuX3Bvb2xfZnJlZShjb2hlcmVudF9wb29sLCAodW5zaWduZWQgbG9uZykgdmFkZHIsIHNpemUpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2FkZHIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqaHdkZXYsCisJCSAgICAgIGRtYV9hZGRyX3QgYnVzLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoaHdkZXYgJiYgaHdkZXYtPmRtYV9tYXNrICYmICFkbWFfY2FwYWJsZShod2RldiwgYnVzLCBzaXplKSkgeworCQlpZiAoKmh3ZGV2LT5kbWFfbWFzayA+PSBETUFfQklUX01BU0soMzIpKQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzOiBvdmVyZmxvdyAlTHgrJXp1IG9mIGRldmljZSBtYXNrICVMeFxuIiwKKwkJCQluYW1lLCAobG9uZyBsb25nKWJ1cywgc2l6ZSwKKwkJCQkobG9uZyBsb25nKSpod2Rldi0+ZG1hX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaGV4YWdvbl9tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgIGludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7CisJaW50IGk7CisKKwlXQVJOX09OKG5lbnRzID09IDAgfHwgc2dbMF0ubGVuZ3RoID09IDApOworCisJZm9yX2VhY2hfc2coc2csIHMsIG5lbnRzLCBpKSB7CisJCXMtPmRtYV9hZGRyZXNzID0gc2dfcGh5cyhzKTsKKwkJaWYgKCFjaGVja19hZGRyKCJtYXBfc2ciLCBod2Rldiwgcy0+ZG1hX2FkZHJlc3MsIHMtPmxlbmd0aCkpCisJCQlyZXR1cm4gMDsKKworCQlzLT5kbWFfbGVuZ3RoID0gcy0+bGVuZ3RoOworCisJCWZsdXNoX2RjYWNoZV9yYW5nZShQQUdFX09GRlNFVCArIHMtPmRtYV9hZGRyZXNzLAorCQkJCSAgIFBBR0VfT0ZGU0VUICsgcy0+ZG1hX2FkZHJlc3MgKyBzLT5sZW5ndGgpOworCX0KKworCXJldHVybiBuZW50czsKK30KKworLyoKKyAqIGFkZHJlc3MgaXMgdmlydHVhbAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmModm9pZCAqYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN3aXRjaCAoZGlyKSB7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQloZXhhZ29uX2NsZWFuX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcpIGFkZHIgKyBzaXplKTsKKwkJYnJlYWs7CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJCWhleGFnb25faW52X2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcpIGFkZHIgKyBzaXplKTsKKwkJYnJlYWs7CisJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwkJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBhZGRyLAorCQkodW5zaWduZWQgbG9uZykgYWRkciArIHNpemUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZG1hX2FkZHJfdG9fdmlydChkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiBwaHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpIGRtYV9hZGRyKTsKK30KKworLyoqCisgKiBoZXhhZ29uX21hcF9wYWdlKCkgLSBtYXBzIGFuIGFkZHJlc3MgZm9yIGRldmljZSBETUEKKyAqIEBkZXY6CXBvaW50ZXIgdG8gRE1BIGRldmljZQorICogQHBhZ2U6CXBvaW50ZXIgdG8gcGFnZSBzdHJ1Y3Qgb2YgRE1BIG1lbW9yeQorICogQG9mZnNldDoJb2Zmc2V0IHdpdGhpbiBwYWdlCisgKiBAc2l6ZToJc2l6ZSBvZiBtZW1vcnkgdG8gbWFwCisgKiBAZGlyOgl0cmFuc2ZlciBkaXJlY3Rpb24KKyAqIEBhdHRyczoJcG9pbnRlciB0byBETUEgYXR0cnMgKG5vdCB1c2VkKQorICoKKyAqIENhbGxlZCB0byBtYXAgYSBtZW1vcnkgYWRkcmVzcyB0byBhIERNQSBhZGRyZXNzIHByaW9yCisgKiB0byBhY2Nlc3NlcyB0by9mcm9tIGRldmljZS4KKyAqCisgKiBXZSBkb24ndCBwYXJ0aWN1bGFybHkgaGF2ZSBtYW55IGhvb3BzIHRvIGp1bXAgdGhyb3VnaAorICogc28gZmFyLiAgU3RyYWlnaHQgdHJhbnNsYXRpb24gYmV0d2VlbiBwaHlzIGFuZCB2aXJ0dWFsLgorICoKKyAqIERNQSBpcyBub3QgY2FjaGUgY29oZXJlbnQgc28gc3luYyBpcyBuZWNlc3Nhcnk7IHRoaXMKKyAqIHNlZW1zIHRvIGJlIGEgY29udmVuaWVudCBwbGFjZSB0byBkbyBpdC4KKyAqCisgKi8KK3N0YXRpYyBkbWFfYWRkcl90IGhleGFnb25fbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJCSAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCWRtYV9hZGRyX3QgYnVzID0gcGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0OworCVdBUk5fT04oc2l6ZSA9PSAwKTsKKworCWlmICghY2hlY2tfYWRkcigibWFwX3NpbmdsZSIsIGRldiwgYnVzLCBzaXplKSkKKwkJcmV0dXJuIGJhZF9kbWFfYWRkcmVzczsKKworCWRtYV9zeW5jKGRtYV9hZGRyX3RvX3ZpcnQoYnVzKSwgc2l6ZSwgZGlyKTsKKworCXJldHVybiBidXM7Cit9CisKK3N0YXRpYyB2b2lkIGhleGFnb25fc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCisJCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlkbWFfc3luYyhkbWFfYWRkcl90b192aXJ0KGRtYV9oYW5kbGUpLCBzaXplLCBkaXIpOworfQorCitzdGF0aWMgdm9pZCBoZXhhZ29uX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZG1hX3N5bmMoZG1hX2FkZHJfdG9fdmlydChkbWFfaGFuZGxlKSwgc2l6ZSwgZGlyKTsKK30KKworc3RydWN0IGRtYV9tYXBfb3BzIGhleGFnb25fZG1hX29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQJPSBoZXhhZ29uX2RtYV9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudAk9IGhleGFnb25fZnJlZV9jb2hlcmVudCwKKwkubWFwX3NnCQk9IGhleGFnb25fbWFwX3NnLAorCS5tYXBfcGFnZQk9IGhleGFnb25fbWFwX3BhZ2UsCisJLnN5bmNfc2luZ2xlX2Zvcl9jcHUgPSBoZXhhZ29uX3N5bmNfc2luZ2xlX2Zvcl9jcHUsCisJLnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UgPSBoZXhhZ29uX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UsCisJLmlzX3BoeXMJPSAxLAorfTsKKwordm9pZCBfX2luaXQgaGV4YWdvbl9kbWFfaW5pdCh2b2lkKQoreworCWlmIChkbWFfb3BzKQorCQlyZXR1cm47CisKKwlkbWFfb3BzID0gJmhleGFnb25fZG1hX29wczsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvaGVhZC5TIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9oZWFkLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2YjgxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvaGVhZC5TCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogRWFybHkga2VybmVsIHN0YXJ0dXAgY29kZSBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vbWVtLWxheW91dC5oPgorI2luY2x1ZGUgPGFzbS92bV9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisJX19JTklUCitFTlRSWShzdGV4dCkKKwkvKgorCSAqIFZNTSB3aWxsIGFscmVhZHkgaGF2ZSBzZXQgdXAgdHJ1ZSB2ZWN0b3IgcGFnZSwgTU1VLCBldGMuCisJICogVG8gc2V0IHVwIGluaXRpYWwga2VybmVsIGlkZW50aXR5IG1hcCwgd2UgaGF2ZSB0byBwYXNzCisJICogdGhlIFZNTSBhIHBvaW50ZXIgdG8gc29tZSBjYW5vbmljYWwgcGFnZSB0YWJsZXMuIEluCisJICogdGhpcyBpbXBsZW1lbnRhdGlvbiwgd2UncmUgYXNzdW1pbmcgdGhhdCB3ZSd2ZSBnb3QKKwkgKiB0aGVtIHByZWNvbXBpbGVkLiBHZW5lcmF0ZSB2YWx1ZSBpbiBSMjQsIGFzIHdlJ2xsIG5lZWQKKwkgKiBpdCBhZ2FpbiBzaG9ydGx5LgorCSAqLworCXIyNC5MID0gI0xPKHN3YXBwZXJfcGdfZGlyKQorCXIyNC5IID0gI0hJKHN3YXBwZXJfcGdfZGlyKQorCisJLyoKKwkgKiBTeW1ib2wgaXMga2VybmVsIHNlZ21lbnQgYWRkcmVzcywgYnV0IHdlIG5lZWQKKwkgKiB0aGUgbG9naWNhbC9waHlzaWNhbCBhZGRyZXNzLgorCSAqLworCXIyNCA9IGFzbChyMjQsICMyKQorCXIyNCA9IGxzcihyMjQsICMyKQorCisJcjAgPSByMjQKKworCS8qCisJICogSW5pdGlhbGl6ZSBhIDE2TUIgUFRFIHRvIG1ha2UgdGhlIHZpcnR1YWwgYW5kIHBoeXNpY2FsCisJICogYWRkcmVzc2VzIHdoZXJlIHRoZSBrZXJuZWwgd2FzIGxvYWRlZCBiZSBpZGVudGljYWwuCisJICovCisjZGVmaW5lIFBURV9CSVRTICggX19IVk1fUFRFX1IgfCBfX0hWTV9QVEVfVyB8IF9fSFZNX1BURV9YCVwKKwkJICB8IF9fSEVYQUdPTl9DX1dCX0wyIDw8IDYJCQlcCisJCSAgfCBfX0hWTV9QREVfU180TUIpCisKKwlyMSA9IHBjCisJcjIuSCA9ICMweGZmYzAKKwlyMi5MID0gIzB4MDAwMAorCXIxID0gYW5kKHIxLHIyKQkJLyogcm91bmQgUEMgdG8gNE1CIGJvdW5kYXJ5CSovCisJcjIgPSBsc3IocjEsICMyMikJLyogNE1CIHBhZ2UgbnVtYmVyCQkqLworCXIyID0gYXNsKHIyLCAjMikJLyogdGltZXMgc2l6ZW9mKFBURSkgKDRieXRlcykJKi8KKwlyMCA9IGFkZChyMCxyMikJCS8qIHIwID0gYWRkcmVzcyBvZiBjb3JyZWN0IFBURQkqLworCXIyID0gI1BURV9CSVRTCisJcjEgPSBhZGQocjEscjIpCQkvKiByMSA9IDRNQiBQVEUgZm9yIHRoZSBmaXJzdCBlbnRyeQkqLworCXIyLmggPSAjMHgwMDQwCisJcjIubCA9ICMweDAwMDAJCS8qIDRNQgkqLworCW1lbXcocjAgKysgIzQpID0gcjEKKwlyMSA9IGFkZChyMSwgcjIpCisJbWVtdyhyMCArKyAjNCkgPSByMQorCisJcjAgPSByMjQKKworCS8qCisJICogVGhlIHN1YnJvdXRpbmUgd3JhcHBlciBhcm91bmQgdGhlIHZpcnR1YWwgaW5zdHJ1Y3Rpb24gdG91Y2hlcworCSAqIG5vIG1lbW9yeSwgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIGl0IGV2ZW4gaGVyZS4KKwkgKi8KKwljYWxsCV9fdm1uZXdtYXA7CisKKwkvKiAgSnVtcCBpbnRvIHZpcnR1YWwgYWRkcmVzcyByYW5nZS4gICovCisKKwlyMzEuaCA9ICNoaShfX2hlYWRfc192YWRkcl90YXJnZXQpCisJcjMxLmwgPSAjbG8oX19oZWFkX3NfdmFkZHJfdGFyZ2V0KQorCWp1bXByIHIzMQorCisJLyogIEluc2VydCB0cmlwcHkgc3BhY2UgZWZmZWN0cy4gICovCisKK19faGVhZF9zX3ZhZGRyX3RhcmdldDoKKwkvKgorCSAqIFRlYXIgZG93biBWQT1QQSB0cmFuc2xhdGlvbiBub3cgdGhhdCB3ZSBhcmUgcnVubmluZworCSAqIGluIHRoZSBkZXNnbmF0ZWQga2VybmVsIHNlZ21lbnRzLgorCSAqLworCXIwID0gI19fSFZNX1BERV9TX0lOVkFMSUQKKwlyMSA9IHIyNAorCWxvb3AwKDFmLCMweDEwMCkKKzE6CisJeworCQltZW13KFIxICsrICM0KSA9IFIwCisJfTplbmRsb29wMAorCisJcjAgPSByMjQKKwljYWxsIF9fdm1uZXdtYXAKKworCS8qICBHbyBhaGVhZCBhbmQgaW5zdGFsbCB0aGUgdHJhcDAgcmV0dXJuIHNvIGFuZ2VsIGNhbGxzIHdvcmsgICovCisJcjAuaCA9ICNoaShfS19wcm92aXNpb25hbF92ZWMpCisJcjAubCA9ICNsbyhfS19wcm92aXNpb25hbF92ZWMpCisJY2FsbCBfX3Ztc2V0dmVjCisKKwkvKgorCSAqIE9LLCBhdCB0aGlzIHBvaW50IHdlIHNob3VsZCBzdGFydCB0byBiZSBtdWNoIG1vcmUgY2FyZWZ1bCwKKwkgKiB3ZSdyZSBnb2luZyB0byBlbnRlciBDIGNvZGUgYW5kIHN0YXJ0IHRvdWNoaW5nIG1lbW9yeQorCSAqIGluIGFsbCBzb3J0cyBvZiBwbGFjZXMuCisJICogVGhpcyBtZWFuczoKKwkgKiAgICAgIFNHUCBuZWVkcyB0byBiZSBPSworCSAqCU5lZWQgdG8gbG9jayBzaGFyZWQgcmVzb3VyY2VzCisJICoJQSBidW5jaCBvZiBvdGhlciB0aGluZ3MgdGhhdCB3aWxsIGNhdXNlCisJICogCWFsbCBraW5kcyBvZiBwYWluZnVsIGJ1Z3MKKwkgKi8KKworCS8qCisJICogU3RhY2sgcG9pbnRlciBzaG91bGQgYmUgcG9pbnRlZCBhdCB0aGUgaW5pdCB0YXNrJ3MKKwkgKiB0aHJlYWQgc3RhY2ssIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gZGVjbGFyZWQgaW4gYXJjaC9pbml0X3Rhc2suYy4KKwkgKiBTbyB1aGhoaGguLi4KKwkgKiBJdCdzIGFjY2Vzc2libGUgdmlhIHRoZSBpbml0X3RocmVhZF91bmlvbiwgd2hpY2ggaXMgYSB1bmlvbgorCSAqIG9mIGEgdGhyZWFkX2luZm8gc3RydWN0IGFuZCBhIHN0YWNrOyBvZiBjb3Vyc2UsIHRoZSB0b3AKKwkgKiBvZiB0aGUgc3RhY2sgaXMgbm90IGZvciB5b3UuICBUaGUgZW5kIG9mIHRoZSBzdGFjaworCSAqIGlzIHNpbXBseSBpbml0X3RocmVhZF91bmlvbiArIFRIUkVBRF9TSVpFLgorCSAqLworCisJe3IyOS5IID0gI0hJKGluaXRfdGhyZWFkX3VuaW9uKTsgcjAuSCA9ICNISShfVEhSRUFEX1NJWkUpOyB9CisJe3IyOS5MID0gI0xPKGluaXRfdGhyZWFkX3VuaW9uKTsgcjAuTCA9ICNMTyhfVEhSRUFEX1NJWkUpOyB9CisKKwkvKiAgaW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXIgdXNlZCB0byBwb2ludCB0byBjdXJyZW50X3RocmVhZF9pbmZvICovCisJLyogIEZpeG1lOiAgVEhSRUFESU5GT19SRUcgY2FuJ3QgYmUgUjIgYmVjYXVzZSBvZiB0aGF0IG1lbXNldCB0aGluZy4gKi8KKwl7cjI5ID0gYWRkKHIyOSxyMCk7IFRIUkVBRElORk9fUkVHID0gcjI5OyB9CisKKwkvKiAgSGFjazogIHplcm8gYnNzOyAqLworCXsgcjAuTCA9ICNMTyhfX2Jzc19zdGFydCk7ICByMSA9ICMwOyByMi5sID0gI0xPKF9fYnNzX3N0b3ApOyB9CisJeyByMC5IID0gI0hJKF9fYnNzX3N0YXJ0KTsgICAgICAgICAgIHIyLmggPSAjSEkoX19ic3Nfc3RvcCk7IH0KKworCXIyID0gc3ViKHIyLHIwKTsKKwljYWxsIG1lbXNldDsKKworCS8qIFRpbWUgdG8gbWFrZSB0aGUgZG91Z2hudXRzLiAgICovCisJY2FsbCBzdGFydF9rZXJuZWwKKworCS8qCisJICogU2hvdWxkIG5vdCByZWFjaCBoZXJlLgorCSAqLworMToKKwlqdW1wIDFiCisKKy5wMmFsaWduIFBBR0VfU0hJRlQKK0VOVFJZKGV4dGVybmFsX2NtZGxpbmVfYnVmZmVyKQorICAgICAgICAuZmlsbCBfUEFHRV9TSVpFLDEsMAorCisuZGF0YQorLnAyYWxpZ24gUEFHRV9TSElGVAorRU5UUlkoZW1wdHlfemVyb19wYWdlKQorICAgICAgICAuZmlsbCBfUEFHRV9TSVpFLDEsMApkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9oZXhhZ29uX2tzeW1zLmMgYi9hcmNoL2hleGFnb24va2VybmVsL2hleGFnb25fa3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjE4OTI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9oZXhhZ29uX2tzeW1zLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIEV4cG9ydCBvZiBzeW1ib2xzIGRlZmluZWQgaW4gYXNzZW1ibHkgZmlsZXMgYW5kL29yIGxpYmdjYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitFWFBPUlRfU1lNQk9MKF9fY29weV9mcm9tX3VzZXJfaGV4YWdvbik7CitFWFBPUlRfU1lNQk9MKF9fY29weV90b191c2VyX2hleGFnb24pOworRVhQT1JUX1NZTUJPTChfX3ZtZ2V0aWUpOworRVhQT1JUX1NZTUJPTChfX3Ztc2V0aWUpOworRVhQT1JUX1NZTUJPTChtZW1jcHkpOworRVhQT1JUX1NZTUJPTChtZW1zZXQpOworCisjZGVmaW5lIERFQ0xBUkVfRVhQT1JUKG5hbWUpICAgICBcCisJZXh0ZXJuIHZvaWQgbmFtZSh2b2lkKTsgRVhQT1JUX1NZTUJPTChuYW1lKQorCisvKiBTeW1ib2xzIGZvdW5kIGluIGxpYmdjYyB0aGF0IGFzc29ydGVkIGtlcm5lbCBtb2R1bGVzIG5lZWQgKi8KK0RFQ0xBUkVfRVhQT1JUKF9faGV4YWdvbl9tZW1jcHlfbGlrZWx5X2FsaWduZWRfbWluMzJieXRlc19tdWx0OGJ5dGVzKTsKKworREVDTEFSRV9FWFBPUlQoX19oZXhhZ29uX2RpdnNpMyk7CitERUNMQVJFX0VYUE9SVChfX2hleGFnb25fbW9kc2kzKTsKK0RFQ0xBUkVfRVhQT1JUKF9faGV4YWdvbl91ZGl2c2kzKTsKK0RFQ0xBUkVfRVhQT1JUKF9faGV4YWdvbl91bW9kc2kzKTsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL2hleGFnb24va2VybmVsL2luaXRfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjgzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL2luaXRfdGFzay5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBJbml0IHRhc2sgZGVmaW5pdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCBpbml0X3NpZ25hbHMgPSBJTklUX1NJR05BTFMoaW5pdF9zaWduYWxzKTsKK3N0YXRpYyBzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgaW5pdF9zaWdoYW5kID0gSU5JVF9TSUdIQU5EKGluaXRfc2lnaGFuZCk7CisKKy8qCisgKiBJbml0aWFsIHRocmVhZCBzdHJ1Y3R1cmUuCisgKgorICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIDgxOTItYnl0ZSBhbGlnbmVkIGR1ZSB0byB0aGUKKyAqIHdheSBwcm9jZXNzIHN0YWNrcyBhcmUgaGFuZGxlZC4gVGhpcyBpcyBkb25lIGJ5IG1ha2luZyBzdXJlCisgKiB0aGUgbGlua2VyIG1hcHMgdGhpcyBpbiB0aGUgLnRleHQgc2VnbWVudCByaWdodCBhZnRlciBoZWFkLlMsCisgKiBhbmQgbWFraW5nIGhlYWQuUyBlbnN1cmUgdGhlIHByb3BlciBhbGlnbm1lbnQuCisgKi8KK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbgorCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSwKKwkJX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSkgPSB7CisJCQlJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykKKwkJfTsKKworLyoKKyAqIEluaXRpYWwgdGFzayBzdHJ1Y3R1cmUuCisgKgorICogQWxsIG90aGVyIHRhc2sgc3RydWN0cyB3aWxsIGJlIGFsbG9jYXRlZCBvbiBzbGFicyBpbiBmb3JrLmMKKyAqLworc3RydWN0IHRhc2tfc3RydWN0IGluaXRfdGFzayA9IElOSVRfVEFTSyhpbml0X3Rhc2spOworRVhQT1JUX1NZTUJPTChpbml0X3Rhc2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9pcnFfY3B1LmMgYi9hcmNoL2hleGFnb24va2VybmVsL2lycV9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQxNmExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9pcnFfY3B1LmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIEZpcnN0LWxldmVsIGludGVycnVwdCBjb250cm9sbGVyIG1vZGVsIGZvciBIZXhhZ29uLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorCitzdGF0aWMgdm9pZCBtYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJX192bWludG9wX2xvY2RpcygobG9uZykgZGF0YS0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgbWFza19pcnFfbnVtKHVuc2lnbmVkIGludCBpcnEpCit7CisJX192bWludG9wX2xvY2RpcygobG9uZykgaXJxKTsKK30KKworc3RhdGljIHZvaWQgdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJX192bWludG9wX2xvY2VuKChsb25nKSBkYXRhLT5pcnEpOworfQorCisvKiAgVGhpcyBpcyBhY3R1YWxseSBhbGwgd2UgbmVlZCBmb3IgaGFuZGxlX2Zhc3Rlb2lfaXJxICAqLworc3RhdGljIHZvaWQgZW9pX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJX192bWludG9wX2dsb2JlbigobG9uZykgZGF0YS0+aXJxKTsKK30KKworLyogUG93ZXIgbWFtYW5nZW1lbnQgd2FrZSBjYWxsLiBXZSBkb24ndCBuZWVkIHRoaXMsIGhvd2V2ZXIsCisgKiBpZiB0aGlzIGlzIGFic2VudCwgdGhlbiBhbiAtRU5YSU8gZXJyb3IgaXMgcmV0dXJuZWQgdG8gdGhlCisgKiBtc21fc2VyaWFsIGRyaXZlciwgYW5kIGl0IGZhaWxzIHRvIGNvcnJlY3RseSBpbml0aWFsaXplLgorICogVGhpcyBpcyBhIGJ1ZyBpbiB0aGUgbXNtX3NlcmlhbCBkcml2ZXIsIGJ1dCwgZm9yIG5vdywgd2UKKyAqIHdvcmsgYXJvdW5kIGl0IGhlcmUsIGJ5IHByb3ZpZGluZyB0aGlzIGJvZ3VzIGhhbmRsZXIuCisgKiBYWFggRklYTUUhISEgcmVtb3ZlIHRoaXMgd2hlbiBtc21fc2VyaWFsIGlzIGZpeGVkLgorICovCitzdGF0aWMgaW50IHNldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9uKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGhleGFnb25faXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIkhFWEFHT04iLAorCS5pcnFfbWFzawk9IG1hc2tfaXJxLAorCS5pcnFfdW5tYXNrCT0gdW5tYXNrX2lycSwKKwkuaXJxX3NldF93YWtlCT0gc2V0X3dha2UsCisJLmlycV9lb2kJPSBlb2lfaXJxCit9OworCisvKioKKyAqIFRoZSBoZXhhZ29uIGNvcmUgY29tZXMgd2l0aCBhIGZpcnN0LWxldmVsIGludGVycnVwdCBjb250cm9sbGVyCisgKiB3aXRoIDMyIHRvdGFsIHBvc3NpYmxlIGludGVycnVwdHMuICBXaGVuIHRoZSBjb3JlIGlzIGVtYmVkZGVkCisgKiBpbnRvIGRpZmZlcmVudCBzeXN0ZW1zL3BsYXRmb3JtcywgaXQgaXMgdHlwaWNhbGx5IHdyYXBwZWQgYnkKKyAqIG1hY3JvIGNlbGxzIHRoYXQgcHJvdmlkZSBvbmUgb3IgbW9yZSBzZWNvbmQtbGV2ZWwgaW50ZXJydXB0CisgKiBjb250cm9sbGVycyB0aGF0IGFyZSBjYXNjYWRlZCBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZSBmaXJzdC1sZXZlbAorICogaW50ZXJydXB0cyBoYW5kbGVkIGhlcmUuIFRoZSBwcmVjaXNlIHdpcmluZyBvZiB0aGVzZSBvdGhlcgorICogaXJxcyB2YXJpZXMgZnJvbSBwbGF0Zm9ybSB0byBwbGF0Zm9ybSwgYW5kIGFyZSBzZXQgdXAgJiBjb25maWd1cmVkCisgKiBpbiB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgZmlsZXMuCisgKgorICogVGhlIGZpcnN0LWxldmVsIGludGVycnVwdCBjb250cm9sbGVyIGlzIHdyYXBwZWQgYnkgdGhlIFZNLCB3aGljaAorICogdmlydHVhbGl6ZXMgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGZvciB1cy4gIEl0IHByb3ZpZGVzIGEgdmVyeQorICogc2ltcGxlLCBmYXN0ICYgZWZmaWNpZW50IEFQSSwgYW5kIHNvIHRoZSBmYXN0ZW9pIGhhbmRsZXIgaXMKKyAqIGFwcHJvcHJpYXRlIGZvciB0aGlzIGNhc2UuCisgKi8KK3ZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCit7CisJaW50IGlycTsKKworCWZvciAoaXJxID0gMDsgaXJxIDwgSEVYQUdPTl9DUFVJTlRTOyBpcnErKykgeworCQltYXNrX2lycV9udW0oaXJxKTsKKwkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmhleGFnb25faXJxX2NoaXAsCisJCQkJCQkgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL2tnZGIuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwva2dkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNGFhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL2tnZGIuYwpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIGFyY2gvaGV4YWdvbi9rZXJuZWwva2dkYi5jIC0gSGV4YWdvbiBLR0RCIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2tnZGIuaD4KKworLyogQWxsIHJlZ2lzdGVycyBhcmUgNCBieXRlcywgZm9yIG5vdyAqLworI2RlZmluZSBHREJfU0laRU9GX1JFRyA0CisKKy8qIFRoZSByZWdpc3RlciBuYW1lcyBhcmUgdXNlZCBkdXJpbmcgcHJpbnRpbmcgb2YgdGhlIHJlZ3M7CisgKiBLZWVwIHRoZXNlIGF0IHRocmVlIGxldHRlcnMgdG8gcHJldHR5LXByaW50LiAqLworc3RydWN0IGRiZ19yZWdfZGVmX3QgZGJnX3JlZ19kZWZbREJHX01BWF9SRUdfTlVNXSA9IHsKKwl7ICIgcjAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIwMCl9LAorCXsgIiByMSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjAxKX0sCisJeyAiIHIyIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMDIpfSwKKwl7ICIgcjMiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIwMyl9LAorCXsgIiByNCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjA0KX0sCisJeyAiIHI1IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMDUpfSwKKwl7ICIgcjYiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIwNil9LAorCXsgIiByNyIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjA3KX0sCisJeyAiIHI4IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMDgpfSwKKwl7ICIgcjkiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIwOSl9LAorCXsgInIxMCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjEwKX0sCisJeyAicjExIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMTEpfSwKKwl7ICJyMTIiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIxMil9LAorCXsgInIxMyIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjEzKX0sCisJeyAicjE0IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMTQpfSwKKwl7ICJyMTUiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIxNSl9LAorCXsgInIxNiIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjE2KX0sCisJeyAicjE3IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMTcpfSwKKwl7ICJyMTgiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIxOCl9LAorCXsgInIxOSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjE5KX0sCisJeyAicjIwIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMjApfSwKKwl7ICJyMjEiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIyMSl9LAorCXsgInIyMiIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjIyKX0sCisJeyAicjIzIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMjMpfSwKKwl7ICJyMjQiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIyNCl9LAorCXsgInIyNSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjI1KX0sCisJeyAicjI2IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMjYpfSwKKwl7ICJyMjciLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIyNyl9LAorCXsgInIyOCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjI4KX0sCisJeyAicjI5IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMjkpfSwKKwl7ICJyMzAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIzMCl9LAorCXsgInIzMSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjMxKX0sCisKKwl7ICJ1c3IiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHVzcil9LAorCXsgInByZWRzIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBwcmVkcyl9LAorCXsgIiBtMCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgbTApfSwKKwl7ICIgbTEiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIG0xKX0sCisJeyAic2EwIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBzYTApfSwKKwl7ICJzYTEiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHNhMSl9LAorCXsgImxjMCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgbGMwKX0sCisJeyAibGMxIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBsYzEpfSwKKwl7ICIgZ3AiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIGdwKX0sCisJeyAidWdwIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCB1Z3ApfSwKKwl7ICJwc3AiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIGh2bWVyLnZtcHNwKX0sCisJeyAiZWxyIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBodm1lci52bWVsKX0sCisJeyAiZXN0IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBodm1lci52bWVzdCl9LAorCXsgImJhZHZhIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBodm1lci52bWJhZHZhKX0sCisJeyAicmVzdGFydF9yMCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcmVzdGFydF9yMCl9LAorCXsgInN5c2NhbGxfbnIiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHN5c2NhbGxfbnIpfSwKK307CisKK3N0cnVjdCBrZ2RiX2FyY2ggYXJjaF9rZ2RiX29wcyA9IHsKKwkvKiB0cmFwMCgjMHhEQikgMHgwY2RiMDA1NCAqLworCS5nZGJfYnB0X2luc3RyID0gezB4NTQsIDB4MDAsIDB4ZGIsIDB4MGN9LAorfTsKKworY2hhciAqZGJnX2dldF9yZWcoaW50IHJlZ25vLCB2b2lkICptZW0sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZWdubyA+PSBEQkdfTUFYX1JFR19OVU0gfHwgcmVnbm8gPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCSooKHVuc2lnbmVkIGxvbmcgKikgbWVtKSA9ICooKHVuc2lnbmVkIGxvbmcgKikgKCh2b2lkICopcmVncyArCisJCWRiZ19yZWdfZGVmW3JlZ25vXS5vZmZzZXQpKTsKKworCXJldHVybiBkYmdfcmVnX2RlZltyZWdub10ubmFtZTsKK30KKworaW50IGRiZ19zZXRfcmVnKGludCByZWdubywgdm9pZCAqbWVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocmVnbm8gPj0gREJHX01BWF9SRUdfTlVNIHx8IHJlZ25vIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqKCh1bnNpZ25lZCBsb25nICopICgodm9pZCAqKXJlZ3MgKyBkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0KSkgPQorCQkqKCh1bnNpZ25lZCBsb25nICopIG1lbSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBrZ2RiX2FyY2hfc2V0X3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHBjKQoreworCWluc3RydWN0aW9uX3BvaW50ZXIocmVncykgPSBwYzsKK30KKworI2lmZGVmIENPTkZJR19TTVAKKworLyoqCisgKiBrZ2RiX3JvdW5kdXBfY3B1cyAtIEdldCBvdGhlciBDUFVzIGludG8gYSBob2xkaW5nIHBhdHRlcm4KKyAqIEBmbGFnczogQ3VycmVudCBJUlEgc3RhdGUKKyAqCisgKiBPbiBTTVAgc3lzdGVtcywgd2UgbmVlZCB0byBnZXQgdGhlIGF0dGVudGlvbiBvZiB0aGUgb3RoZXIgQ1BVcworICogYW5kIGdldCB0aGVtIGJlIGluIGEga25vd24gc3RhdGUuICBUaGlzIHNob3VsZCBkbyB3aGF0IGlzIG5lZWRlZAorICogdG8gZ2V0IHRoZSBvdGhlciBDUFVzIHRvIGNhbGwga2dkYl93YWl0KCkuIE5vdGUgdGhhdCBvbiBzb21lIGFyY2hlcywKKyAqIHRoZSBOTUkgYXBwcm9hY2ggaXMgbm90IHVzZWQgZm9yIHJvdW5kaW5nIHVwIGFsbCB0aGUgQ1BVcy4gRm9yIGV4YW1wbGUsCisgKiBpbiBjYXNlIG9mIE1JUFMsIHNtcF9jYWxsX2Z1bmN0aW9uKCkgaXMgdXNlZCB0byByb3VuZHVwIENQVXMuIEluCisgKiB0aGlzIGNhc2UsIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBiZWZvcmUKKyAqIGNhbGxpbmcgc21wX2NhbGxfZnVuY3Rpb24oKS4gVGhlIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24gaXMKKyAqIHRoZSBmbGFncyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHJlc3RvcmluZyB0aGUgaW50ZXJydXB0cy4gVGhlcmUgaXMKKyAqIGxvY2FsX2lycV9zYXZlKCkgY2FsbCBiZWZvcmUga2dkYl9yb3VuZHVwX2NwdXMoKS4KKyAqCisgKiBPbiBub24tU01QIHN5c3RlbXMsIHRoaXMgaXMgbm90IGNhbGxlZC4KKyAqLworCitzdGF0aWMgdm9pZCBoZXhhZ29uX2tnZGJfbm1pX2hvb2sodm9pZCAqaWdub3JlZCkKK3sKKwlrZ2RiX25taWNhbGxiYWNrKHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGdldF9pcnFfcmVncygpKTsKK30KKwordm9pZCBrZ2RiX3JvdW5kdXBfY3B1cyh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlzbXBfY2FsbF9mdW5jdGlvbihoZXhhZ29uX2tnZGJfbm1pX2hvb2ssIE5VTEwsIDApOworCWxvY2FsX2lycV9kaXNhYmxlKCk7Cit9CisjZW5kaWYKKworCisvKiAgTm90IHlldCB3b3JraW5nICAqLwordm9pZCBzbGVlcGluZ190aHJlYWRfdG9fZ2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsCisJCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqdGhyZWFkX3JlZ3M7CisKKwlpZiAodGFzayA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBJbml0aWFsaXplIHRvIHplcm8gKi8KKwltZW1zZXQoZ2RiX3JlZ3MsIDAsIE5VTVJFR0JZVEVTKTsKKworCS8qIE90aGVyd2lzZSwgd2UgaGF2ZSBvbmx5IHNvbWUgcmVnaXN0ZXJzIGZyb20gc3dpdGNoX3RvKCkgKi8KKwl0aHJlYWRfcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKKwlnZGJfcmVnc1swXSA9IHRocmVhZF9yZWdzLT5yMDA7Cit9CisKKy8qKgorICoga2dkYl9hcmNoX2hhbmRsZV9leGNlcHRpb24gLSBIYW5kbGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIEdEQiBwYWNrZXRzLgorICogQHZlY3RvcjogVGhlIGVycm9yIHZlY3RvciBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgaGFwcGVuZWQuCisgKiBAc2lnbm86IFRoZSBzaWduYWwgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGhhdCBoYXBwZW5lZC4KKyAqIEBlcnJfY29kZTogVGhlIGVycm9yIGNvZGUgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IGhhcHBlbmVkLgorICogQHJlbWNvbV9pbl9idWZmZXI6IFRoZSBidWZmZXIgb2YgdGhlIHBhY2tldCB3ZSBoYXZlIHJlYWQuCisgKiBAcmVtY29tX291dF9idWZmZXI6IFRoZSBidWZmZXIgb2YgJUJVRk1BWCBieXRlcyB0byB3cml0ZSBhIHBhY2tldCBpbnRvLgorICogQHJlZ3M6IFRoZSAmc3RydWN0IHB0X3JlZ3Mgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIE1VU1QgaGFuZGxlIHRoZSAnYycgYW5kICdzJyBjb21tYW5kIHBhY2tldHMsCisgKiBhcyB3ZWxsIHBhY2tldHMgdG8gc2V0IC8gcmVtb3ZlIGEgaGFyZHdhcmUgYnJlYWtwb2ludCwgaWYgdXNlZC4KKyAqIElmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIHBhY2tldHMgd2hpY2ggdGhlIGhhcmR3YXJlIG5lZWRzIHRvIGhhbmRsZSwKKyAqIHRoZXkgYXJlIGhhbmRsZWQgaGVyZS4gIFRoZSBjb2RlIHNob3VsZCByZXR1cm4gLTEgaWYgaXQgd2FudHMgdG8KKyAqIHByb2Nlc3MgbW9yZSBwYWNrZXRzLCBhbmQgYSAlMCBvciAlMSBpZiBpdCB3YW50cyB0byBleGl0IGZyb20gdGhlCisgKiBrZ2RiIGNhbGxiYWNrLgorICoKKyAqIE5vdCB5ZXQgd29ya2luZy4KKyAqLworaW50IGtnZGJfYXJjaF9oYW5kbGVfZXhjZXB0aW9uKGludCB2ZWN0b3IsIGludCBzaWdubywgaW50IGVycl9jb2RlLAorCQkJICAgICAgIGNoYXIgKnJlbWNvbV9pbl9idWZmZXIsIGNoYXIgKnJlbWNvbV9vdXRfYnVmZmVyLAorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpsaW51eF9yZWdzKQoreworCXN3aXRjaCAocmVtY29tX2luX2J1ZmZlclswXSkgeworCWNhc2UgJ3MnOgorCWNhc2UgJ2MnOgorCQlyZXR1cm4gMDsKKwl9CisJLyogU3RheSBpbiB0aGUgZGVidWdnZXIuICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IF9fa2dkYl9ub3RpZnkoc3RydWN0IGRpZV9hcmdzICphcmdzLCB1bnNpZ25lZCBsb25nIGNtZCkKK3sKKwkvKiBjcHUgcm91bmR1cCAqLworCWlmIChhdG9taWNfcmVhZCgma2dkYl9hY3RpdmUpICE9IC0xKSB7CisJCWtnZGJfbm1pY2FsbGJhY2soc21wX3Byb2Nlc3Nvcl9pZCgpLCBhcmdzLT5yZWdzKTsKKwkJcmV0dXJuIE5PVElGWV9TVE9QOworCX0KKworCWlmICh1c2VyX21vZGUoYXJncy0+cmVncykpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCWlmIChrZ2RiX2hhbmRsZV9leGNlcHRpb24oYXJncy0+dHJhcG5yICYgMHhmZiwgYXJncy0+c2lnbnIsIGFyZ3MtPmVyciwKKwkJCQkgICAgYXJncy0+cmVncykpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCXJldHVybiBOT1RJRllfU1RPUDsKK30KKworc3RhdGljIGludAora2dkYl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqcHRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlyZXQgPSBfX2tnZGJfbm90aWZ5KHB0ciwgY21kKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGtnZGJfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBrZ2RiX25vdGlmeSwKKworCS8qCisJICogTG93ZXN0LXByaW8gbm90aWZpZXIgcHJpb3JpdHksIHdlIHdhbnQgdG8gYmUgbm90aWZpZWQgbGFzdDoKKwkgKi8KKwkucHJpb3JpdHkgPSAtSU5UX01BWCwKK307CisKKy8qKgorICoga2dkYl9hcmNoX2luaXQgLSBQZXJmb3JtIGFueSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5pdGFsaXphdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIHRoZSBpbml0YWxpemF0aW9uIG9mIGFueSBhcmNoaXRlY3R1cmUKKyAqIHNwZWNpZmljIGNhbGxiYWNrcy4KKyAqLworaW50IGtnZGJfYXJjaF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2RpZV9ub3RpZmllcigma2dkYl9ub3RpZmllcik7Cit9CisKKy8qKgorICoga2dkYl9hcmNoX2V4aXQgLSBQZXJmb3JtIGFueSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgdW5pbml0YWxpemF0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgdGhlIHVuaW5pdGFsaXphdGlvbiBvZiBhbnkgYXJjaGl0ZWN0dXJlCisgKiBzcGVjaWZpYyBjYWxsYmFja3MsIGZvciBkeW5hbWljIHJlZ2lzdHJhdGlvbiBhbmQgdW5yZWdpc3RyYXRpb24uCisgKi8KK3ZvaWQga2dkYl9hcmNoX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigma2dkYl9ub3RpZmllcik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL21vZHVsZS5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWE3NmJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9tb2R1bGUuYwpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIEtlcm5lbCBtb2R1bGUgbG9hZGVyIGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmbXQgLCAuLi4pCisjZW5kaWYKKworLyoKKyAqIG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMgLSB0d2VhayBnb3QvcGx0IHNlY3Rpb25zLgorICogQGhkciAtIHBvaW50ZXIgdG8gZWxmIGhlYWRlcgorICogQHNlY2hkcnMgLSBwb2ludGVyIHRvIGVsZiBsb2FkIHNlY3Rpb24gaGVhZGVycworICogQHNlY3N0cmluZ3MgLSBzeW1ib2wgbmFtZXMKKyAqIEBtb2QgLSBwb2ludGVyIHRvIG1vZHVsZQorICovCitpbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLCBFbGZfU2hkciAqc2VjaGRycywKKwkJCQljaGFyICpzZWNzdHJpbmdzLAorCQkJCXN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZm91bmQgPSAwOworCisJLyogTG9vayBmb3IgLnBsdCBhbmQvb3IgLmdvdC5wbHQgYW5kL29yIC5pbml0LnBsdCBzZWN0aW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCBoZHItPmVfc2hudW07IGkrKykgeworCQlERUJVR1AoIlNlY3Rpb24gJWQgaXMgJXNcbiIsIGksCisJCSAgICAgICBzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lKTsKKwkJaWYgKHN0cmNtcChzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLCAiLnBsdCIpID09IDApCisJCQlmb3VuZCA9IGkrMTsKKwkJaWYgKHN0cmNtcChzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLCAiLmdvdC5wbHQiKSA9PSAwKQorCQkJZm91bmQgPSBpKzE7CisJCWlmIChzdHJjbXAoc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSwgIi5yZWxhLnBsdCIpID09IDApCisJCQlmb3VuZCA9IGkrMTsKKwl9CisKKwkvKiBBdCB0aGlzIHRpbWUsIHdlIGRvbid0IHN1cHBvcnQgbW9kdWxlcyBjb21pbGVkIHdpdGggLXNoYXJlZCAqLworCWlmIChmb3VuZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiTW9kdWxlICclcycgY29udGFpbnMgdW5leHBlY3RlZCAucGx0Ly5nb3Qgc2VjdGlvbnMuXG4iLAorCQkJbW9kLT5uYW1lKTsKKwkJLyogIHJldHVybiAtRU5PRVhFQzsgICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhcHBseV9yZWxvY2F0ZV9hZGQgLSBwZXJmb3JtIHJlbGEgcmVsb2NhdGlvbnMuCisgKiBAc2VjaGRycyAtIHBvaW50ZXIgdG8gc2VjdGlvbiBoZWFkZXJzCisgKiBAc3RydGFiIC0gc29tZSBzb3J0IG9mIHN0YXJ0IGFkZHJlc3M/CisgKiBAc3ltaW5kZXggLSBzeW1ib2wgaW5kZXggb2Zmc2V0IG9yIHNvbWV0aGluZz8KKyAqIEByZWxzZWMgLSBhZGRyZXNzIHRvIHJlbG9jYXRlIHRvPworICogQG1vZHVsZSAtIHBvaW50ZXIgdG8gbW9kdWxlCisgKgorICogUGVyZm9ybSByZWxhIHJlbG9jYXRpb25zLgorICovCitpbnQgYXBwbHlfcmVsb2NhdGVfYWRkKEVsZl9TaGRyICpzZWNoZHJzLCBjb25zdCBjaGFyICpzdHJ0YWIsCisJCQl1bnNpZ25lZCBpbnQgc3ltaW5kZXgsIHVuc2lnbmVkIGludCByZWxzZWMsCisJCQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJRWxmMzJfU3ltICpzeW07CisJdWludDMyX3QgKmxvY2F0aW9uOworCXVpbnQzMl90IHZhbHVlOworCXVuc2lnbmVkIGludCBucmVsb2NzID0gc2VjaGRyc1tyZWxzZWNdLnNoX3NpemUgLyBzaXplb2YoRWxmMzJfUmVsYSk7CisJRWxmMzJfUmVsYSAqcmVsYSA9ICh2b2lkICopc2VjaGRyc1tyZWxzZWNdLnNoX2FkZHI7CisJRWxmMzJfV29yZCBzeW1faW5mbyA9IHNlY2hkcnNbcmVsc2VjXS5zaF9pbmZvOworCUVsZjMyX1N5bSAqc3ltX2Jhc2UgPSAoRWxmMzJfU3ltICopIHNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHI7CisJdm9pZCAqbG9jX2Jhc2UgPSAodm9pZCAqKSBzZWNoZHJzW3N5bV9pbmZvXS5zaF9hZGRyOworCisJREVCVUdQKCJBcHBseWluZyByZWxvY2F0aW9ucyBpbiBzZWN0aW9uICV1IHRvIHNlY3Rpb24gJXUgYmFzZT0lcFxuIiwKKwkgICAgICAgcmVsc2VjLCBzeW1faW5mbywgbG9jX2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IG5yZWxvY3M7IGkrKykgeworCisJCS8qIFN5bWJvbCB0byByZWxvY2F0ZSAqLworCQlzeW0gPSBzeW1fYmFzZSArIEVMRjMyX1JfU1lNKHJlbGFbaV0ucl9pbmZvKTsKKworCQkvKiBXaGVyZSB0byBtYWtlIHRoZSBjaGFuZ2UgKi8KKwkJbG9jYXRpb24gPSBsb2NfYmFzZSArIHJlbGFbaV0ucl9vZmZzZXQ7CisKKwkJLyogYEV2ZXJ5dGhpbmcgaXMgcmVsYXRpdmUnLiAqLworCQl2YWx1ZSA9IHN5bS0+c3RfdmFsdWUgKyByZWxhW2ldLnJfYWRkZW5kOworCisJCURFQlVHUCgiJWQ6IHZhbHVlPSUwOHggbG9jPSVwIHJlbG9jPSVkIHN5bWJvbD0lc1xuIiwKKwkJICAgICAgIGksIHZhbHVlLCBsb2NhdGlvbiwgRUxGMzJfUl9UWVBFKHJlbGFbaV0ucl9pbmZvKSwKKwkJICAgICAgIHN5bS0+c3RfbmFtZSA/CisJCSAgICAgICAmc3RydGFiW3N5bS0+c3RfbmFtZV0gOiAiKGFub255bW91cykiKTsKKworCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWxhW2ldLnJfaW5mbykpIHsKKwkJY2FzZSBSX0hFWEFHT05fQjIyX1BDUkVMOiB7CisJCQlpbnQgZGlzdCA9IChpbnQpKHZhbHVlIC0gKHVpbnQzMl90KWxvY2F0aW9uKTsKKwkJCWlmICgoZGlzdCA8IC0weDAwODAwMDAwKSB8fAorCQkJICAgIChkaXN0ID49IDB4MDA4MDAwMDApKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogJXM6ICUwOHg9JTA4eC0lMDh4ICVzXG4iLAorCQkJCSAgICAgICBtb2R1bGUtPm5hbWUsCisJCQkJICAgICAgICJSX0hFWEFHT05fQjIyX1BDUkVMIHJlbG9jIG91dCBvZiByYW5nZSIsCisJCQkJICAgICAgIGRpc3QsIHZhbHVlLCAodWludDMyX3QpbG9jYXRpb24sCisJCQkJICAgICAgIHN5bS0+c3RfbmFtZSA/CisJCQkJICAgICAgICZzdHJ0YWJbc3ltLT5zdF9uYW1lXSA6ICIoYW5vbnltb3VzKSIpOworCQkJCXJldHVybiAtRU5PRVhFQzsKKwkJCX0KKwkJCURFQlVHUCgiQjIyX1BDUkVMIGNvbnRlbnRzOiAlMDhYLlxuIiwgKmxvY2F0aW9uKTsKKwkJCSpsb2NhdGlvbiAmPSB+MHgwMWZmM2ZmZjsKKwkJCSpsb2NhdGlvbiB8PSAweDAwMDAzZmZmICYgZGlzdDsKKwkJCSpsb2NhdGlvbiB8PSAweDAxZmYwMDAwICYgKGRpc3Q8PDIpOworCQkJREVCVUdQKCJDb250ZW50cyBhZnRlciByZWxvYzogJTA4eFxuIiwgKmxvY2F0aW9uKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUl9IRVhBR09OX0hJMTY6CisJCQl2YWx1ZSA9ICh2YWx1ZT4+MTYpICYgMHhmZmZmOworCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSBSX0hFWEFHT05fTE8xNjoKKwkJCSpsb2NhdGlvbiAmPSB+MHgwMGMwM2ZmZjsKKwkJCSpsb2NhdGlvbiB8PSB2YWx1ZSAmIDB4M2ZmZjsKKwkJCSpsb2NhdGlvbiB8PSAodmFsdWUgJiAweGMwMDApIDw8IDg7CisJCQlicmVhazsKKwkJY2FzZSBSX0hFWEFHT05fMzI6CisJCQkqbG9jYXRpb24gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFJfSEVYQUdPTl8zMl9QQ1JFTDoKKwkJCSpsb2NhdGlvbiA9IHZhbHVlIC0gKHVpbnQzMl90KWxvY2F0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgUl9IRVhBR09OX1BMVF9CMjJfUENSRUw6CisJCWNhc2UgUl9IRVhBR09OX0dPVE9GRl9MTzE2OgorCQljYXNlIFJfSEVYQUdPTl9HT1RPRkZfSEkxNjoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEdPVC9QTFQgcmVsb2NhdGlvbnMgdW5zdXBwb3J0ZWRcbiIsCisJCQkgICAgICAgbW9kdWxlLT5uYW1lKTsKKwkJCXJldHVybiAtRU5PRVhFQzsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVua25vd24gcmVsb2NhdGlvbjogJXVcbiIsCisJCQkgICAgICAgbW9kdWxlLT5uYW1lLAorCQkJICAgICAgIEVMRjMyX1JfVFlQRShyZWxhW2ldLnJfaW5mbykpOworCQkJcmV0dXJuIC1FTk9FWEVDOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2hleGFnb24va2VybmVsL3Byb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGM0ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiBQcm9jZXNzIGNyZWF0aW9uIHN1cHBvcnQgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKgorICogS2VybmVsIHRocmVhZCBjcmVhdGlvbi4gIFRoZSBkZXNpcmVkIGtlcm5lbCBmdW5jdGlvbiBpcyAid3JhcHBlZCIKKyAqIGluIHRoZSBrZXJuZWxfdGhyZWFkX2hlbHBlciBmdW5jdGlvbiwgd2hpY2ggZG9lcyBjbGVhbnVwCisgKiBhZnRlcndhcmRzLgorICovCitzdGF0aWMgdm9pZCBfX25vcmV0dXJuIGtlcm5lbF90aHJlYWRfaGVscGVyKHZvaWQgKmFyZywgaW50ICgqZm4pKHZvaWQgKikpCit7CisJZG9fZXhpdChmbihhcmcpKTsKK30KKworaW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyByZWdzOworCisJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOworCS8qCisJICogWWVzLCB3ZSdyZSBleHBsb3RpbmcgaWxsaWNpdCBrbm93bGVkZ2Ugb2YgdGhlIEFCSSBoZXJlLgorCSAqLworCXJlZ3MucjAwID0gKHVuc2lnbmVkIGxvbmcpIGFyZzsKKwlyZWdzLnIwMSA9ICh1bnNpZ25lZCBsb25nKSBmbjsKKwlwdF9zZXRfZWxyKCZyZWdzLCAodW5zaWduZWQgbG9uZylrZXJuZWxfdGhyZWFkX2hlbHBlcik7CisJcHRfc2V0X2ttb2RlKCZyZWdzKTsKKworCXJldHVybiBkb19mb3JrKGZsYWdzfENMT05FX1ZNfENMT05FX1VOVFJBQ0VELCAwLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOworCisvKgorICogUHJvZ3JhbSB0aHJlYWQgbGF1bmNoLiAgT2Z0ZW4gZGVmaW5lZCBhcyBhIG1hY3JvIGluIHByb2Nlc3Nvci5oLAorICogYnV0IHdlJ3JlIHNob290aW5nIGZvciBhIHNtYWxsIGZvb3RwcmludCBhbmQgaXQncyBub3QgYW4gaW5uZXItbG9vcAorICogcGVyZm9ybWFuY2UtY3JpdGljYWwgb3BlcmF0aW9uLgorICoKKyAqIFRoZSBIZXhhZ29uIEFCSSBzcGVjaWZpZXMgdGhhdCBSMjggaXMgemVybydlZCBiZWZvcmUgcHJvZ3JhbSBsYXVuY2gsCisgKiBzbyB0aGF0IGdldHMgYXV0b21hdGljYWxseSBkb25lIGhlcmUuICBJZiB3ZSBldmVyIHN0b3AgZG9pbmcgdGhhdCBoZXJlLAorICogd2UnbGwgcHJvYmFibHkgd2FudCB0byBkZWZpbmUgdGhlIEVMRl9QTEFUX0lOSVQgbWFjcm8uCisgKi8KK3ZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIHNwKQoreworCS8qIFNldCB0byBydW4gd2l0aCB1c2VyLW1vZGUgZGF0YSBzZWdtZW50YXRpb24gKi8KKwlzZXRfZnMoVVNFUl9EUyk7CisJLyogV2Ugd2FudCB0byB6ZXJvIGFsbCBkYXRhLWNvbnRhaW5pbmcgcmVnaXN0ZXJzLiBJcyB0aGlzIG92ZXJraWxsPyAqLworCW1lbXNldChyZWdzLCAwLCBzaXplb2YoKnJlZ3MpKTsKKwkvKiBXZSBtaWdodCB3YW50IHRvIGFsc28gemVybyBhbGwgUHJvY2Vzc29yIHJlZ2lzdGVycyBoZXJlICovCisJcHRfc2V0X3VzZXJtb2RlKHJlZ3MpOworCXB0X3NldF9lbHIocmVncywgcGMpOworCXB0X3NldF9ydGVfc3AocmVncywgc3ApOworfQorCisvKgorICogIFNwaW4sIG9yIGJldHRlciBzdGlsbCwgZG8gYSBoYXJkd2FyZSBvciBWTSB3YWl0IGluc3RydWN0aW9uCisgKiAgSWYgaGFyZHdhcmUgb3IgVk0gb2ZmZXIgd2FpdCB0ZXJtaW5hdGlvbiBldmVuIHRob3VnaCBpbnRlcnJ1cHRzCisgKiAgYXJlIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKK3sKKwlfX3Ztd2FpdCgpOworfQorCit2b2lkICgqaWRsZV9zbGVlcCkodm9pZCkgPSBkZWZhdWx0X2lkbGU7CisKK3ZvaWQgY3B1X2lkbGUodm9pZCkKK3sKKwl3aGlsZSAoMSkgeworCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDEpOworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CisJCQlpZGxlX3NsZWVwKCk7CisJCQkvKiAgaW50ZXJydXB0cyB3YWtlIHVzIHVwLCBidXQgYXJlbid0IHNlcnZpY2VkICAqLworCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwkvKiBzZXJ2aWNlIGludGVycnVwdCAgICovCisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQl9CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOworCQlzY2hlZHVsZSgpOworCX0KK30KKworLyoKKyAqICBSZXR1cm4gc2F2ZWQgUEMgb2YgYSBibG9ja2VkIHRocmVhZAorICovCit1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcHkgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHRocmVhZCBzdGF0ZQorICovCitpbnQgY29weV90aHJlYWQodW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyB1c3AsCisJCXVuc2lnbmVkIGxvbmcgdW51c2VkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSB0YXNrX3RocmVhZF9pbmZvKHApOworCXN0cnVjdCBoZXhhZ29uX3N3aXRjaF9zdGFjayAqc3M7CisJc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVnczsKKwlhc21saW5rYWdlIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKKworCWNoaWxkcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoKCh1bnNpZ25lZCBsb25nKSB0aSArIFRIUkVBRF9TSVpFKSAtCisJCQkJCXNpemVvZigqY2hpbGRyZWdzKSk7CisKKwltZW1jcHkoY2hpbGRyZWdzLCByZWdzLCBzaXplb2YoKmNoaWxkcmVncykpOworCXRpLT5yZWdzID0gY2hpbGRyZWdzOworCisJLyoKKwkgKiBFc3RhYmxpc2gga2VybmVsIHN0YWNrIHBvaW50ZXIgYW5kIGluaXRpYWwgUEMgZm9yIG5ldyB0aHJlYWQKKwkgKi8KKwlzcyA9IChzdHJ1Y3QgaGV4YWdvbl9zd2l0Y2hfc3RhY2sgKikgKCh1bnNpZ25lZCBsb25nKSBjaGlsZHJlZ3MgLQorCQkJCQkJICAgIHNpemVvZigqc3MpKTsKKwlzcy0+bHIgPSAodW5zaWduZWQgbG9uZylyZXRfZnJvbV9mb3JrOworCXAtPnRocmVhZC5zd2l0Y2hfc3AgPSBzczsKKworCS8qIElmIFVzZXIgbW9kZSB0aHJlYWQsIHNldCBwdF9yZWcgc3RhY2sgcG9pbnRlciBhcyBwZXIgcGFyYW1ldGVyICovCisJaWYgKHVzZXJfbW9kZShjaGlsZHJlZ3MpKSB7CisJCXB0X3NldF9ydGVfc3AoY2hpbGRyZWdzLCB1c3ApOworCisJCS8qIENoaWxkIHNlZXMgemVybyByZXR1cm4gdmFsdWUgKi8KKwkJY2hpbGRyZWdzLT5yMDAgPSAwOworCisJCS8qCisJCSAqIFRoZSBjbG9uZSBzeXNjYWxsIGhhcyB0aGUgQyBzaWduYXR1cmU6CisJCSAqIGludCBbcjBdIGNsb25lKGludCBmbGFncyBbcjBdLAorCQkgKiAgICAgICAgICAgdm9pZCAqY2hpbGRfZnJhbWUgW3IxXSwKKwkJICogICAgICAgICAgIHZvaWQgKnBhcmVudF90aWQgW3IyXSwKKwkJICogICAgICAgICAgIHZvaWQgKmNoaWxkX3RpZCBbcjNdLAorCQkgKiAgICAgICAgICAgdm9pZCAqdGhyZWFkX2NvbnRyb2xfYmxvY2sgW3I0XSk7CisJCSAqIHVncCBpcyB1c2VkIHRvIHByb3ZpZGUgVExTIHN1cHBvcnQuCisJCSAqLworCQlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TRVRUTFMpCisJCQljaGlsZHJlZ3MtPnVncCA9IGNoaWxkcmVncy0+cjA0OworCisJCS8qCisJCSAqIFBhcmVudCBzZWVzIG5ldyBwaWQgLS0gbm90IG5lY2Vzc2FyeSwgbm90IGV2ZW4gcG9zc2libGUgYXQKKwkJICogdGhpcyBwb2ludCBpbiB0aGUgZm9yayBwcm9jZXNzCisJCSAqIE1pZ2h0IGFsc28gd2FudCB0byBzZXQgdGhpbmdzIGxpa2UgdGktPmFkZHJfbGltaXQKKwkJICovCisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYga2VybmVsIHRocmVhZCwgcmVzdW1lIHN0YWNrIGlzIGtlcm5lbCBzdGFjayBiYXNlLgorCQkgKiBOb3RlIHRoYXQgdGhpcyBpcyBwb2ludGVyIGFyaXRobWV0aWMgb24gcHRfcmVncyAqCisJCSAqLworCQlwdF9zZXRfcnRlX3NwKGNoaWxkcmVncywgKHVuc2lnbmVkIGxvbmcpKGNoaWxkcmVncyArIDEpKTsKKwkJLyoKKwkJICogV2UgbmVlZCB0aGUgY3VycmVudCB0aHJlYWRfaW5mbyBmYXN0IHBhdGggcG9pbnRlcgorCQkgKiBzZXQgdXAgaW4gcHRfcmVncy4gIFRoZSByZWdpc3RlciB0byBiZSB1c2VkIGlzCisJCSAqIHBhcmFtZXRyaWMgZm9yIGFzc2VtYmxlciBjb2RlLCBidXQgdGhlIG1lY2hhbmlzbQorCQkgKiBkb2Vzbid0IGRyb3AgbmVhdGx5IGludG8gQy4gIE5lZWRzIHRvIGJlIGZpeGVkLgorCQkgKi8KKwkJY2hpbGRyZWdzLT5USFJFQURJTkZPX1JFRyA9ICh1bnNpZ25lZCBsb25nKSB0aTsKKwl9CisKKwkvKgorCSAqIHRocmVhZF9pbmZvIHBvaW50ZXIgaXMgcHVsbGVkIG91dCBvZiB0YXNrX3N0cnVjdCAic3RhY2siCisJICogZmllbGQgb24gc3dpdGNoX3RvLgorCSAqLworCXAtPnN0YWNrID0gKHZvaWQgKil0aTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVsZWFzZSBhbnkgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJlc291cmNlcyBsb2NrZWQgYnkgdGhyZWFkCisgKi8KK3ZvaWQgcmVsZWFzZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICpkZWFkX3Rhc2spCit7Cit9CisKKy8qCisgKiBGcmVlIGFueSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgdGhyZWFkIGRhdGEgc3RydWN0dXJlcywgZXRjLgorICovCit2b2lkIGV4aXRfdGhyZWFkKHZvaWQpCit7Cit9CisKKy8qCisgKiBTb21lIGFyY2hzIGZsdXNoIGRlYnVnIGFuZCBGUFUgaW5mbyBoZXJlCisgKi8KK3ZvaWQgZmx1c2hfdGhyZWFkKHZvaWQpCit7Cit9CisKKy8qCisgKiBUaGUgIndhaXQgY2hhbm5lbCIgdGVybWlub2xvZ3kgaXMgYXJjaGFpYywgYnV0IHdoYXQgd2Ugd2FudAorICogaXMgYW4gaWRlbnRpZmljYXRpb24gb2YgdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBzY2hlZHVsZXIKKyAqIHdhcyBpbnZva2VkIGJ5IGEgYmxvY2tlZCB0aHJlYWQuCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZwLCBwYzsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX3BhZ2U7CisJaW50IGNvdW50ID0gMDsKKwlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlID09IFRBU0tfUlVOTklORykKKwkJcmV0dXJuIDA7CisKKwlzdGFja19wYWdlID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApOworCWZwID0gKChzdHJ1Y3QgaGV4YWdvbl9zd2l0Y2hfc3RhY2sgKilwLT50aHJlYWQuc3dpdGNoX3NwKS0+ZnA7CisJZG8geworCQlpZiAoZnAgPCAoc3RhY2tfcGFnZSArIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKSB8fAorCQkJZnAgPj0gKFRIUkVBRF9TSVpFIC0gOCArIHN0YWNrX3BhZ2UpKQorCQkJcmV0dXJuIDA7CisJCXBjID0gKCh1bnNpZ25lZCBsb25nICopZnApWzFdOworCQlpZiAoIWluX3NjaGVkX2Z1bmN0aW9ucyhwYykpCisJCQlyZXR1cm4gcGM7CisJCWZwID0gKih1bnNpZ25lZCBsb25nICopIGZwOworCX0gd2hpbGUgKGNvdW50KysgPCAxNik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJvcnJvd2VkIGZyb20gUG93ZXJQQyAtLSBiYXNpY2FsbHkgYWxsb3cgc21hbGxlciBrZXJuZWwgc3RhY2tzIGlmIHdlCisgKiBnbyBjcmF6eSB3aXRoIHRoZSBwYWdlIHNpemVzLgorICovCisjaWYgVEhSRUFEX1NISUZUIDwgUEFHRV9TSElGVAorCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnRocmVhZF9pbmZvX2NhY2hlOworCitzdHJ1Y3QgdGhyZWFkX2luZm8gKmFsbG9jX3RocmVhZF9pbmZvX25vZGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBub2RlKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGk7CisKKwl0aSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZSh0aHJlYWRfaW5mb19jYWNoZSwgR0ZQX0tFUk5FTCwgbm9kZSk7CisJaWYgKHVubGlrZWx5KHRpID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKyNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKKwltZW1zZXQodGksIDAsIFRIUkVBRF9TSVpFKTsKKyNlbmRpZgorCXJldHVybiB0aTsKK30KKwordm9pZCBmcmVlX3RocmVhZF9pbmZvKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCit7CisJa21lbV9jYWNoZV9mcmVlKHRocmVhZF9pbmZvX2NhY2hlLCB0aSk7Cit9CisKKy8qICBXZWFrIHN5bWJvbDsgY2FsbGVkIGJ5IGluaXQvbWFpbi5jICAqLworCit2b2lkIHRocmVhZF9pbmZvX2NhY2hlX2luaXQodm9pZCkKK3sKKwl0aHJlYWRfaW5mb19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJ0aHJlYWRfaW5mbyIsIFRIUkVBRF9TSVpFLAorCQkJCQkgICAgICBUSFJFQURfU0laRSwgMCwgTlVMTCk7CisJQlVHX09OKHRocmVhZF9pbmZvX2NhY2hlID09IE5VTEwpOworfQorCisjZW5kaWYgLyogVEhSRUFEX1NISUZUIDwgUEFHRV9TSElGVCAqLworCisvKgorICogUmVxdWlyZWQgcGxhY2Vob2xkZXIuCisgKi8KK2ludCBkdW1wX2ZwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywgZWxmX2ZwcmVnc2V0X3QgKmZwdSkKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2hleGFnb24va2VybmVsL3B0cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYTNmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3B0cmFjZS5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogUHRyYWNlIHN1cHBvcnQgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z2VuZXJhdGVkL2NvbXBpbGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3NldC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdXNlci5oPgorCitzdGF0aWMgaW50IGdlbnJlZ3NfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkgICBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkgICB2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBkdW1teTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0YXJnZXQpOworCisKKwlpZiAoIXJlZ3MpCisJCXJldHVybiAtRUlPOworCisJLyogVGhlIGdlbmVyYWwgaWRlYSBoZXJlIGlzIHRoYXQgdGhlIGNvcHlvdXQgbXVzdCBoYXBwZW4gaW4KKwkgKiBleGFjdGx5IHRoZSBzYW1lIG9yZGVyIGluIHdoaWNoIHRoZSB1c2Vyc3BhY2UgZXhwZWN0cyB0aGVzZQorCSAqIHJlZ3MuIE5vdywgdGhlIHNlcXVlbmNlIGluIHVzZXJzcGFjZSBkb2VzIG5vdCBtYXRjaCB0aGUKKwkgKiBzZXF1ZW5jZSBpbiB0aGUga2VybmVsLCBzbyBldmVyeXRoaW5nIHBhc3QgdGhlIDMyIGdwcnMKKwkgKiBoYXBwZW5zIG9uZSBhdCBhIHRpbWUuCisJICovCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgICZyZWdzLT5yMDAsIDAsIDMyKnNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKyNkZWZpbmUgT05FWFQoS1BUX1JFRywgVVNSX1JFRykgXAorCWlmICghcmV0KSBcCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsIFwKKwkJCUtQVF9SRUcsIG9mZnNldG9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0LCBVU1JfUkVHKSwgXAorCQkJb2Zmc2V0b2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QsIFVTUl9SRUcpICsgXAorCQkJCSBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJLyogTXVzdCBiZSBleGFjdGx5IHNhbWUgc2VxdWVuY2UgYXMgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QgKi8KKwlPTkVYVCgmcmVncy0+c2EwLCBzYTApOworCU9ORVhUKCZyZWdzLT5sYzAsIGxjMCk7CisJT05FWFQoJnJlZ3MtPnNhMSwgc2ExKTsKKwlPTkVYVCgmcmVncy0+bGMxLCBsYzEpOworCU9ORVhUKCZyZWdzLT5tMCwgbTApOworCU9ORVhUKCZyZWdzLT5tMSwgbTEpOworCU9ORVhUKCZyZWdzLT51c3IsIHVzcik7CisJT05FWFQoJnJlZ3MtPnByZWRzLCBwM18wKTsKKwlPTkVYVCgmcmVncy0+Z3AsIGdwKTsKKwlPTkVYVCgmcmVncy0+dWdwLCB1Z3ApOworCU9ORVhUKCZwdF9lbHIocmVncyksIHBjKTsKKwlkdW1teSA9IHB0X2NhdXNlKHJlZ3MpOworCU9ORVhUKCZkdW1teSwgY2F1c2UpOworCU9ORVhUKCZwdF9iYWR2YShyZWdzKSwgYmFkdmEpOworCisJLyogUGFkIHRoZSByZXN0IHdpdGggemVyb3MsIGlmIG5lZWRlZCAqLworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0X3plcm8oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCW9mZnNldG9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0LCBwYWQxKSwgLTEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2VucmVnc19zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCSAgIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgIGNvbnN0IHZvaWQgKmtidWYsIGNvbnN0IHZvaWQgX191c2VyICp1YnVmKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBidWNrZXQ7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFyZ2V0KTsKKworCWlmICghcmVncykKKwkJcmV0dXJuIC1FSU87CisKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICZyZWdzLT5yMDAsIDAsIDMyKnNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKyNkZWZpbmUgSU5FWFQoS1BUX1JFRywgVVNSX1JFRykgXAorCWlmICghcmV0KSBcCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwgXAorCQkJS1BUX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QsIFVTUl9SRUcpLCBcCisJCQlvZmZzZXRvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCwgVVNSX1JFRykgKyBcCisJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKworCS8qIE11c3QgYmUgZXhhY3RseSBzYW1lIHNlcXVlbmNlIGFzIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0ICovCisJSU5FWFQoJnJlZ3MtPnNhMCwgc2EwKTsKKwlJTkVYVCgmcmVncy0+bGMwLCBsYzApOworCUlORVhUKCZyZWdzLT5zYTEsIHNhMSk7CisJSU5FWFQoJnJlZ3MtPmxjMSwgbGMxKTsKKwlJTkVYVCgmcmVncy0+bTAsIG0wKTsKKwlJTkVYVCgmcmVncy0+bTEsIG0xKTsKKwlJTkVYVCgmcmVncy0+dXNyLCB1c3IpOworCUlORVhUKCZyZWdzLT5wcmVkcywgcDNfMCk7CisJSU5FWFQoJnJlZ3MtPmdwLCBncCk7CisJSU5FWFQoJnJlZ3MtPnVncCwgdWdwKTsKKwlJTkVYVCgmcHRfZWxyKHJlZ3MpLCBwYyk7CisKKwkvKiBDQVVTRSBhbmQgQkFEVkEgYXJlbid0IHdyaXRlYWJsZS4gKi8KKwlJTkVYVCgmYnVja2V0LCBjYXVzZSk7CisJSU5FWFQoJmJ1Y2tldCwgYmFkdmEpOworCisJLyogSWdub3JlIHRoZSByZXN0LCBpZiBuZWVkZWQgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QsIHBhZDEpLCAtMSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBUaGlzIGlzIHNwZWNpYWw7IFNQIGlzIGFjdHVhbGx5IHJlc3RvcmVkIGJ5IHRoZSBWTSB2aWEgdGhlCisJICogc3BlY2lhbCBldmVudCByZWNvcmQgd2hpY2ggaXMgc2V0IGJ5IHRoZSBzcGVjaWFsIHRyYXAuCisJICovCisJcmVncy0+aHZtZXIudm1wc3AgPSByZWdzLT5yMjk7CisJcmV0dXJuIDA7Cit9CisKK2VudW0gaGV4YWdvbl9yZWdzZXQgeworCVJFR1NFVF9HRU5FUkFMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCBoZXhhZ29uX3JlZ3NldHNbXSA9IHsKKwlbUkVHU0VUX0dFTkVSQUxdID0geworCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUlNUQVRVUywKKwkJLm4gPSBFTEZfTkdSRUcsCisJCS5zaXplID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkuYWxpZ24gPSBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCS5nZXQgPSBnZW5yZWdzX2dldCwKKwkJLnNldCA9IGdlbnJlZ3Nfc2V0LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgaGV4YWdvbl91c2VyX3ZpZXcgPSB7CisJLm5hbWUgPSBVVFNfTUFDSElORSwKKwkuZV9tYWNoaW5lID0gRUxGX0FSQ0gsCisJLmVpX29zYWJpID0gRUxGX09TQUJJLAorCS5yZWdzZXRzID0gaGV4YWdvbl9yZWdzZXRzLAorCS5uID0gQVJSQVlfU0laRShoZXhhZ29uX3JlZ3NldHMpCit9OworCitjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXRfdmlldyAqdGFza191c2VyX3JlZ3NldF92aWV3KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gJmhleGFnb25fdXNlcl92aWV3OworfQorCit2b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisJLyogQm9pbGVycGxhdGUgLSByZXNvbHZlcyB0byBudWxsIGlubGluZSBpZiBubyBIVyBzaW5nbGUtc3RlcCAqLworCXVzZXJfZGlzYWJsZV9zaW5nbGVfc3RlcChjaGlsZCk7Cit9CisKK2xvbmcgYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LAorCQkgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJcmV0dXJuIHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvcmVzZXQuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvcmVzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDcyZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9yZXNldC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKwordm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQoreworCXNtcF9zZW5kX3N0b3AoKTsKKwlfX3Ztc3RvcCgpOworfQorCit2b2lkIG1hY2hpbmVfaGFsdCh2b2lkKQoreworfQorCit2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCit7Cit9CisKK3ZvaWQgcG1fcG93ZXJfb2ZmKHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3NldHVwLmMgYi9hcmNoL2hleGFnb24va2VybmVsL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwMmY3OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvc2V0dXAuYwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIEFyY2ggcmVsYXRlZCBzZXR1cCBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9oZXhhZ29uX3ZtLmg+CisjaW5jbHVkZSA8YXNtL3ZtX21tdS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaWZkZWYgQ09ORklHX09GCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNlbmRpZgorCitjaGFyIGNtZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKK3N0YXRpYyBjaGFyIGRlZmF1bHRfY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXSBfX2luaXRkYXRhID0gQ09ORklHX0NNRExJTkU7CisKK2ludCBvbl9zaW11bGF0b3I7CisKK3ZvaWQgX19jcHVpbml0IGNhbGlicmF0ZV9kZWxheSh2b2lkKQoreworCWxvb3BzX3Blcl9qaWZmeSA9IHRocmVhZF9mcmVxX21oeiAqIDEwMDAwMDAgLyBIWjsKK30KKworLyoKKyAqIHNldHVwX2FyY2ggLSAgaGlnaCBsZXZlbCBhcmNoaXRlY3R1cmFsIHNldHVwIHJvdXRpbmUKKyAqIEBjbWRsaW5lX3A6IHBvaW50ZXIgdG8gcG9pbnRlciB0byBjb21tYW5kLWxpbmUgYXJndW1lbnRzCisgKi8KKwordm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQoreworCWNoYXIgKnAgPSAmZXh0ZXJuYWxfY21kbGluZV9idWZmZXI7CisKKwkvKgorCSAqIFRoZXNlIHdpbGwgZXZlbnR1YWxseSBiZSBwdWxsZWQgaW4gdmlhIGVpdGhlciBzb21lIGh5cGVydmlzb3IKKwkgKiBvciBkZXZpY2V0cmVlIGRlc2NyaXB0aW9uLiAgSGFyZHdpcmluZyBmb3Igbm93LgorCSAqLworCXBjeWNsZV9mcmVxX21oeiA9IDYwMDsKKwl0aHJlYWRfZnJlcV9taHogPSAxMDA7CisJc2xlZXBfY2xrX2ZyZXEgPSAzMjAwMDsKKworCS8qCisJICogU2V0IHVwIGV2ZW50IGJpbmRpbmdzIHRvIGhhbmRsZSBleGNlcHRpb25zIGFuZCBpbnRlcnJ1cHRzLgorCSAqLworCV9fdm1zZXR2ZWMoX0tfVk1fZXZlbnRfdmVjdG9yKTsKKworCS8qCisJICogU2ltdWxhdG9yIGhhcyBhIGZldyBkaWZmZXJlbmNlcyBmcm9tIHRoZSBoYXJkd2FyZS4KKwkgKiBGb3Igbm93LCBjaGVjayB1bmluaXRpYWxpemVkLWJ1dC1tYXBwZWQgbWVtb3J5CisJICogcHJpb3IgdG8gaW52b2tpbmcgc2V0dXBfYXJjaF9tZW1vcnkoKS4KKwkgKi8KKwlpZiAoKihpbnQgKikoKHVuc2lnbmVkIGxvbmcpX2VuZCArIDgpID09IDB4MWYxZjFmMWYpCisJCW9uX3NpbXVsYXRvciA9IDE7CisJZWxzZQorCQlvbl9zaW11bGF0b3IgPSAwOworCisJaWYgKHBbMF0gIT0gJ1wwJykKKwkJc3RybGNweShib290X2NvbW1hbmRfbGluZSwgcCwgQ09NTUFORF9MSU5FX1NJWkUpOworCWVsc2UKKwkJc3RybGNweShib290X2NvbW1hbmRfbGluZSwgZGVmYXVsdF9jb21tYW5kX2xpbmUsCisJCQlDT01NQU5EX0xJTkVfU0laRSk7CisKKwkvKgorCSAqIGJvb3RfY29tbWFuZF9saW5lIGFuZCB0aGUgdmFsdWUgc2V0IHVwIGJ5IHNldHVwX2FyY2gKKwkgKiBhcmUgYm90aCBwaWNrZWQgdXAgYnkgdGhlIGluaXQgY29kZS4gSWYgbm8gcmVhc29uIHRvCisJICogbWFrZSB0aGVtIGRpZmZlcmVudCwgcGFzcyB0aGUgc2FtZSBwb2ludGVyIGJhY2suCisJICovCisJc3RybGNweShjbWRfbGluZSwgYm9vdF9jb21tYW5kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKKwkqY21kbGluZV9wID0gY21kX2xpbmU7CisKKwlwYXJzZV9lYXJseV9wYXJhbSgpOworCisJc2V0dXBfYXJjaF9tZW1vcnkoKTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlzbXBfc3RhcnRfY3B1cygpOworI2VuZGlmCit9CisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIGR1bXBpbmcgQ1BVIGluZm8gdmlhIC9wcm9jCisgKiBQcm9iYWJseSBzaG91bGQgbW92ZSB0byBrZXJuZWwvcHJvYy5jIG9yIHNvbWV0aGluZy4KKyAqLworc3RhdGljIHZvaWQgKmNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gKnBvcyA8IG5yX2NwdV9pZHMgPyAodm9pZCAqKSgodW5zaWduZWQgbG9uZykgKnBvcyArIDEpIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSsrKnBvczsKKwlyZXR1cm4gY19zdGFydChtLCBwb3MpOworfQorCitzdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworfQorCisvKgorICogRXZlbnR1YWxseSB0aGlzIHdpbGwgZHVtcCBpbmZvcm1hdGlvbiBhYm91dAorICogQ1BVIHByb3BlcnRpZXMgbGlrZSBJU0EgbGV2ZWwsIFRMQiBzaXplLCBldGMuCisgKi8KK3N0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpIHYgLSAxOworCisJc2VxX3ByaW50ZihtLCAicHJvY2Vzc29yXHQ6ICVkXG4iLCBjcHUpOworCXNlcV9wcmludGYobSwgIm1vZGVsIG5hbWVcdDogSGV4YWdvbiBWaXJ0dWFsIE1hY2hpbmVcbiIpOworCXNlcV9wcmludGYobSwgIkJvZ29NaXBzXHQ6ICVsdS4lMDJsdVxuIiwKKwkJKGxvb3BzX3Blcl9qaWZmeSAqIEhaKSAvIDUwMDAwMCwKKwkJKChsb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwKSAlIDEwMCk7CisJc2VxX3ByaW50ZihtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CisJLnN0YXJ0ICA9ICZjX3N0YXJ0LAorCS5uZXh0ICAgPSAmY19uZXh0LAorCS5zdG9wICAgPSAmY19zdG9wLAorCS5zaG93ICAgPSAmc2hvd19jcHVpbmZvLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2hleGFnb24va2VybmVsL3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NWJlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3NpZ25hbC5jCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogU2lnbmFsIHN1cHBvcnQgZm9yIEhleGFnb24gcHJvY2Vzc29yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KKyNpbmNsdWRlIDxhc20vcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisjaW5jbHVkZSA8YXNtL3Zkc28uaD4KKworI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKKworc3RydWN0IHJ0X3NpZ2ZyYW1lIHsKKwl1bnNpZ25lZCBsb25nIHRyYW1wWzJdOworCXN0cnVjdCBzaWdpbmZvIGluZm87CisJc3RydWN0IHVjb250ZXh0IHVjOworfTsKKworc3RhdGljIHZvaWQgX191c2VyICpnZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgIHNpemVfdCBmcmFtZV9zaXplKQoreworCXVuc2lnbmVkIGxvbmcgc3AgPSByZWdzLT5yMjk7CisKKwkvKiBTd2l0Y2ggdG8gc2lnbmFsIHN0YWNrIGlmIGFwcHJvcHJpYXRlICovCisJaWYgKChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSAmJiAoc2FzX3NzX2ZsYWdzKHNwKSA9PSAwKSkKKwkJc3AgPSBjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZTsKKworCXJldHVybiAodm9pZCBfX3VzZXIgKikoKHNwIC0gZnJhbWVfc2l6ZSkgJiB+KHNpemVvZihsb25nIGxvbmcpIC0gMSkpOworfQorCitzdGF0aWMgaW50IHNldHVwX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGVyciA9IDA7CisKKwllcnIgfD0gY29weV90b191c2VyKCZzYy0+c2NfcmVncy5yMCwgJnJlZ3MtPnIwMCwKKwkJCSAgICAzMipzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+c2EwLCAmc2MtPnNjX3JlZ3Muc2EwKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5sYzAsICZzYy0+c2NfcmVncy5sYzApOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnNhMSwgJnNjLT5zY19yZWdzLnNhMSk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+bGMxLCAmc2MtPnNjX3JlZ3MubGMxKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5tMCwgJnNjLT5zY19yZWdzLm0wKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5tMSwgJnNjLT5zY19yZWdzLm0xKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT51c3IsICZzYy0+c2NfcmVncy51c3IpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnByZWRzLCAmc2MtPnNjX3JlZ3MucDNfMCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+Z3AsICZzYy0+c2NfcmVncy5ncCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+dWdwLCAmc2MtPnNjX3JlZ3MudWdwKTsKKworCXRtcCA9IHB0X2VscihyZWdzKTsgZXJyIHw9IF9fcHV0X3VzZXIodG1wLCAmc2MtPnNjX3JlZ3MucGMpOworCXRtcCA9IHB0X2NhdXNlKHJlZ3MpOyBlcnIgfD0gX19wdXRfdXNlcih0bXAsICZzYy0+c2NfcmVncy5jYXVzZSk7CisJdG1wID0gcHRfYmFkdmEocmVncyk7IGVyciB8PSBfX3B1dF91c2VyKHRtcCwgJnNjLT5zY19yZWdzLmJhZHZhKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgICAgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgZXJyID0gMDsKKworCWVyciB8PSBjb3B5X2Zyb21fdXNlcigmcmVncy0+cjAwLCAmc2MtPnNjX3JlZ3MucjAsCisJCQkgICAgICAzMiAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwllcnIgfD0gX19nZXRfdXNlcihyZWdzLT5zYTAsICZzYy0+c2NfcmVncy5zYTApOworCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPmxjMCwgJnNjLT5zY19yZWdzLmxjMCk7CisJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+c2ExLCAmc2MtPnNjX3JlZ3Muc2ExKTsKKwllcnIgfD0gX19nZXRfdXNlcihyZWdzLT5sYzEsICZzYy0+c2NfcmVncy5sYzEpOworCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPm0wLCAmc2MtPnNjX3JlZ3MubTApOworCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPm0xLCAmc2MtPnNjX3JlZ3MubTEpOworCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPnVzciwgJnNjLT5zY19yZWdzLnVzcik7CisJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+cHJlZHMsICZzYy0+c2NfcmVncy5wM18wKTsKKwllcnIgfD0gX19nZXRfdXNlcihyZWdzLT5ncCwgJnNjLT5zY19yZWdzLmdwKTsKKwllcnIgfD0gX19nZXRfdXNlcihyZWdzLT51Z3AsICZzYy0+c2NfcmVncy51Z3ApOworCisJZXJyIHw9IF9fZ2V0X3VzZXIodG1wLCAmc2MtPnNjX3JlZ3MucGMpOyBwdF9zZXRfZWxyKHJlZ3MsIHRtcCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogU2V0dXAgc2lnbmFsIHN0YWNrIGZyYW1lIHdpdGggc2lnaW5mbyBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZShpbnQgc2lnbnIsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKKwkJCSAgc2lnc2V0X3QgKnNldCwgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCXN0cnVjdCBoZXhhZ29uX3Zkc28gKnZkc28gPSBjdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvOworCisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZihzdHJ1Y3QgcnRfc2lnZnJhbWUpKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfc2lnZnJhbWUpKSkKKwkJZ290bwlzaWdzZWd2OworCisJaWYgKGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgaW5mbykpCisJCWdvdG8Jc2lnc2VndjsKKworCS8qIFRoZSBvbi1zdGFjayBzaWduYWwgdHJhbXBvbGluZSBpcyBubyBsb25nZXIgZXhlY3V0ZWQ7CisJICogaG93ZXZlciwgdGhlIGxpYmdjYyBzaWduYWwgZnJhbWUgdW53aW5kaW5nIGNvZGUgY2hlY2tzIGZvcgorCSAqIHRoZSBwcmVzZW5jZSBvZiB0aGVzZSB0d28gbnVtZXJpYyBtYWdpYyB2YWx1ZXMuCisJICovCisJZXJyIHw9IF9fcHV0X3VzZXIoMHg3ODAwZDE2NiwgJmZyYW1lLT50cmFtcFswXSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoMHg1NDAwYzAwNCwgJmZyYW1lLT50cmFtcFsxXSk7CisJZXJyIHw9IHNldHVwX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCk7CisJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2V0LCBzaXplb2YoKnNldCkpOworCWlmIChlcnIpCisJCWdvdG8gc2lnc2VndjsKKworCS8qIExvYWQgcjAvcjEgcGFpciB3aXRoIHNpZ251bWJlci9zaWdpbmZvIHBvaW50ZXIuLi4gKi8KKwlyZWdzLT5yMDEwMCA9ICgodW5zaWduZWQgbG9uZyBsb25nKSgodW5zaWduZWQgbG9uZykmZnJhbWUtPmluZm8pIDw8IDMyKQorCQl8ICh1bnNpZ25lZCBsb25nIGxvbmcpc2lnbnI7CisJcmVncy0+cjAyID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CisJcmVncy0+cjMxID0gKHVuc2lnbmVkIGxvbmcpIHZkc28tPnJ0X3NpZ25hbF90cmFtcG9saW5lOworCXB0X3BzcChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZTsKKwlwdF9zZXRfZWxyKHJlZ3MsICh1bnNpZ25lZCBsb25nKWthLT5zYS5zYV9oYW5kbGVyKTsKKworCXJldHVybiAwOworCitzaWdzZWd2OgorCWZvcmNlX3NpZ3NlZ3Yoc2lnbnIsIGN1cnJlbnQpOworCXJldHVybiAtRUZBVUxUOworfQorCisvKgorICogU2V0dXAgaW52b2NhdGlvbiBvZiBzaWduYWwgaGFuZGxlcgorICovCitzdGF0aWMgaW50IGhhbmRsZV9zaWduYWwoaW50IHNpZywgc2lnaW5mb190ICppbmZvLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCByYzsKKworCS8qCisJICogSWYgd2UncmUgaGFuZGxpbmcgYSBzaWduYWwgdGhhdCBhYm9ydGVkIGEgc3lzdGVtIGNhbGwsCisJICogc2V0IHVwIHRoZSBlcnJvciByZXR1cm4gdmFsdWUgYmVmb3JlIGFkZGluZyB0aGUgc2lnbmFsCisJICogZnJhbWUgdG8gdGhlIHN0YWNrLgorCSAqLworCisJaWYgKHJlZ3MtPnN5c2NhbGxfbnIgPj0gMCkgeworCQlzd2l0Y2ggKHJlZ3MtPnIwMCkgeworCQljYXNlIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s6CisJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQkJcmVncy0+cjAwID0gLUVJTlRSOworCQkJYnJlYWs7CisJCWNhc2UgLUVSRVNUQVJUU1lTOgorCQkJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVEFSVCkpIHsKKwkJCQlyZWdzLT5yMDAgPSAtRUlOVFI7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CisJCQlyZWdzLT5yMDYgPSByZWdzLT5zeXNjYWxsX25yOworCQkJcHRfc2V0X2VscihyZWdzLCBwdF9lbHIocmVncykgLSA0KTsKKwkJCXJlZ3MtPnIwMCA9IHJlZ3MtPnJlc3RhcnRfcjA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lOyBub3QgZG9pbmcgdGhlIFNBX1NJR0lORk8gdGhpbmcuICBXZQorCSAqIG9ubHkgc2V0IHVwIHRoZSBydF9mcmFtZSBmbGF2b3IuCisJICovCisJcmMgPSBzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOworCisJLyogSWYgdGhlcmUgd2FzIGFuIGVycm9yIG9uIHNldHVwLCBubyBzaWduYWwgd2FzIGRlbGl2ZXJlZC4gKi8KKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsICZrYS0+c2Euc2FfbWFzayk7CisJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCisJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCwgc2lnKTsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIHJldHVybi1mcm9tLWV2ZW50IGNvZGUuCisgKi8KK3N0YXRpYyB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qga19zaWdhY3Rpb24gc2lnYWN0OworCXNpZ2luZm9fdCBpbmZvOworCWludCBzaWdubzsKKworCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQlyZXR1cm47CisKKwlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQorCQlnb3RvIG5vX3NpZ25hbDsKKworCXNpZ25vID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAmc2lnYWN0LCByZWdzLCBOVUxMKTsKKworCWlmIChzaWdubyA+IDApIHsKKwkJc2lnc2V0X3QgKm9sZHNldDsKKworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCQllbHNlCisJCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKKworCQlpZiAoaGFuZGxlX3NpZ25hbChzaWdubywgJmluZm8sICZzaWdhY3QsIG9sZHNldCwgcmVncykgPT0gMCkgeworCQkJLyoKKwkJCSAqIFN1Y2Nlc3NmdWwgZGVsaXZlcnkgY2FzZS4gIFRoZSBzYXZlZCBzaWdtYXNrIGlzCisJCQkgKiBzdG9yZWQgaW4gdGhlIHNpZ25hbCBmcmFtZSwgYW5kIHdpbGwgYmUgcmVzdG9yZWQKKwkJCSAqIGJ5IHNpZ3JldHVybi4gIFdlIGNhbiBjbGVhciB0aGUgVElGIGZsYWcuCisJCQkgKi8KKwkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCisJCQl0cmFjZWhvb2tfc2lnbmFsX2hhbmRsZXIoc2lnbm8sICZpbmZvLCAmc2lnYWN0LCByZWdzLAorCQkJCXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKTsKKwkJfQorCQlyZXR1cm47CisJfQorCitub19zaWduYWw6CisJLyoKKwkgKiBJZiB3ZSBjYW1lIGZyb20gYSBzeXN0ZW0gY2FsbCwgaGFuZGxlIHRoZSByZXN0YXJ0LgorCSAqLworCWlmIChyZWdzLT5zeXNjYWxsX25yID49IDApIHsKKwkJc3dpdGNoIChyZWdzLT5yMDApIHsKKwkJY2FzZSAtRVJFU1RBUlROT0hBTkQ6CisJCWNhc2UgLUVSRVNUQVJUU1lTOgorCQljYXNlIC1FUkVTVEFSVE5PSU5UUjoKKwkJCXJlZ3MtPnIwNiA9IHJlZ3MtPnN5c2NhbGxfbnI7CisJCQlicmVhazsKKwkJY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCQkJcmVncy0+cjA2ID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gbm9fcmVzdGFydDsKKwkJfQorCQlwdF9zZXRfZWxyKHJlZ3MsIHB0X2VscihyZWdzKSAtIDQpOworCQlyZWdzLT5yMDAgPSByZWdzLT5yZXN0YXJ0X3IwOworCX0KKworbm9fcmVzdGFydDoKKwkvKiBJZiB0aGVyZSdzIG5vIHNpZ25hbCB0byBkZWxpdmVyLCBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjayAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKSB7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCX0KK30KKwordm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHRocmVhZF9pbmZvX2ZsYWdzKQoreworCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfU0lHUEVORElORykKKwkJZG9fc2lnbmFsKHJlZ3MpOworCisJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgX1RJRl9OT1RJRllfUkVTVU1FKSB7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9OT1RJRllfUkVTVU1FKTsKKwkJaWYgKGN1cnJlbnQtPnJlcGxhY2VtZW50X3Nlc3Npb25fa2V5cmluZykKKwkJCWtleV9yZXBsYWNlX3Nlc3Npb25fa2V5cmluZygpOworCX0KK30KKworLyoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyB3cmFwcGVycyBmb3Igc2lnbmFsLXJlbGF0ZWQgc3lzdGVtIGNhbGxzCisgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqdXNzLCBzdGFja190IF9fdXNlciAqdW9zcykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVnczsKKworCXJldHVybiBkb19zaWdhbHRzdGFjayh1c3MsIHVvc3MsIHJlZ3MtPnIyOSk7Cit9CisKK2FzbWxpbmthZ2UgaW50IHN5c19ydF9zaWdyZXR1cm4odm9pZCkKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVnczsKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKKwlzaWdzZXRfdCBibG9ja2VkOworCisJZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKXB0X3BzcChyZWdzKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBiYWRmcmFtZTsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmYmxvY2tlZCwgJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzaXplb2YoYmxvY2tlZCkpKQorCQlnb3RvIGJhZGZyYW1lOworCisJc2lnZGVsc2V0bWFzaygmYmxvY2tlZCwgfl9CTE9DS0FCTEUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPmJsb2NrZWQgPSBibG9ja2VkOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwkvKiBSZXN0b3JlIHRoZSB1c2VyJ3Mgc3RhY2sgYXMgd2VsbCAqLworCXB0X3BzcChyZWdzKSA9IHJlZ3MtPnIyOTsKKworCS8qCisJICogTGVhdmUgYSB0cmFjZSBpbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCB0aGlzIHdhcyBhIHNpZ3JldHVybi4KKwkgKiBJZiB0aGUgc3lzdGVtIGNhbGwgaXMgdG8gcmVwbGF5LCB3ZSd2ZSBhbHJlYWR5IHJlc3RvcmVkIHRoZQorCSAqIG51bWJlciBpbiB0aGUgR1BSIHNsb3QgYW5kIGl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgb24gdGhlCisJICogbmV3IHN5c3RlbSBjYWxsIHRyYXAgZW50cnkuIE5vdGUgdGhhdCBpZiByZXN0b3JlX3NpZ2NvbnRleHQoKQorCSAqIGRpZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGJ1bGsgY29weSBvZiB0aGUgcHRfcmVncyBzdHJ1Y3QsCisJICogd2UgY291bGQgYXZvaWQgdGhpcyBhc3NpZ25tZW50IGJ5IHNpbXBseSBub3Qgb3ZlcndyaXRpbmcKKwkgKiByZWdzLT5zeXNjYWxsX25yLgorCSAqLworCXJlZ3MtPnN5c2NhbGxfbnIgPSBfX05SX3J0X3NpZ3JldHVybjsKKworCS8qCisJICogSWYgd2Ugd2VyZSBtZXRpY3Vsb3VzLCB3ZSdkIG9ubHkgY2FsbCB0aGlzIGlmIHdlIGtuZXcgdGhhdAorCSAqIHdlIHdlcmUgYWN0dWFsbHkgZ29pbmcgdG8gdXNlIGFuIGFsdGVybmF0ZSBzdGFjaywgYW5kIHdlJ2QKKwkgKiBjb25zaWRlciBhbnkgZXJyb3IgdG8gYmUgZmF0YWwuICBXaGF0IHdlIGRvIGhlcmUsIGluIGNvbW1vbgorCSAqIHdpdGggbWFueSBvdGhlciBhcmNoaXRlY3R1cmVzLCBpcyBjYWxsIGl0IGJsaW5kbHkgYW5kIG9ubHkKKwkgKiBjb25zaWRlciB0aGUgLUVGQVVMVCByZXR1cm4gY2FzZSB0byBiZSBwcm9vZiBvZiBhIHByb2JsZW0uCisJICovCisJaWYgKGRvX3NpZ2FsdHN0YWNrKCZmcmFtZS0+dWMudWNfc3RhY2ssIE5VTEwsIHB0X3BzcChyZWdzKSkgPT0gLUVGQVVMVCkKKwkJZ290byBiYWRmcmFtZTsKKworCXJldHVybiAwOworCitiYWRmcmFtZToKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3NtcC5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODcxYTJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9zbXAuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIFNNUCBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4gIC8qICB4Y2hnICAqLworI2luY2x1ZGUgPGFzbS90aW1lLmg+ICAgIC8qICB0aW1lcl9pbnRlcnJ1cHQgICovCisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKworI2RlZmluZSBCQVNFX0lQSV9JUlEgMjYKKworLyoKKyAqIGNwdV9wb3NzaWJsZV9tYXAgbmVlZHMgdG8gYmUgZmlsbGVkIG91dCBwcmlvciB0byBzZXR1cF9wZXJfY3B1X2FyZWFzCisgKiAod2hpY2ggaXMgcHJpb3IgdG8gYW55IG9mIG91ciBzbXBfcHJlcGFyZV9jcHUgY3JhcCksIGluIG9yZGVyIHRvIHNldAorICogdXAgdGhlLi4uICBwZXJfY3B1IGFyZWFzLgorICovCisKK3N0cnVjdCBpcGlfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBiaXRzOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBpcGlfZGF0YSwgaXBpX2RhdGEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19oYW5kbGVfaXBpKHVuc2lnbmVkIGxvbmcgKm9wcywgc3RydWN0IGlwaV9kYXRhICppcGksCisJCQkJaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIG1zZyA9IDA7CisJZG8geworCQltc2cgPSBmaW5kX25leHRfYml0KG9wcywgQklUU19QRVJfTE9ORywgbXNnKzEpOworCisJCXN3aXRjaCAobXNnKSB7CisKKwkJY2FzZSBJUElfVElNRVI6CisJCQlpcGlfdGltZXIoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBJX0NBTExfRlVOQzoKKwkJCWdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KCk7CisJCQlicmVhazsKKworCQljYXNlIElQSV9DQUxMX0ZVTkNfU0lOR0xFOgorCQkJZ2VuZXJpY19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaW50ZXJydXB0KCk7CisJCQlicmVhazsKKworCQljYXNlIElQSV9DUFVfU1RPUDoKKwkJCS8qCisJCQkgKiBjYWxsIHZtc3RvcCgpCisJCQkgKi8KKwkJCV9fdm1zdG9wKCk7CisJCQlicmVhazsKKworCQljYXNlIElQSV9SRVNDSEVEVUxFOgorCQkJc2NoZWR1bGVyX2lwaSgpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChtc2cgPCBCSVRTX1BFUl9MT05HKTsKK30KKworLyogIFVzZWQgZm9yIElQSSBjYWxsIGZyb20gb3RoZXIgQ1BVJ3MgdG8gdW5tYXNrIGludCAgKi8KK3ZvaWQgc21wX3ZtX3VubWFza19pcnEodm9pZCAqaW5mbykKK3sKKwlfX3ZtaW50b3BfbG9jZW4oKGxvbmcpIGluZm8pOworfQorCisKKy8qCisgKiBUaGlzIGlzIGJhc2VkIG9uIEFscGhhJ3MgSVBJIHN0dWZmLgorICogU3VwcG9zZWQgdG8gdGFrZSAoaW50LCB2b2lkKikgYXMgYXJncyBub3cuCisgKiBTcGVjaWZpY2FsbHksIGZpcnN0IGFyZyBpcyBpcnEsIHNlY29uZCBpcyB0aGUgaXJxX2Rlc2MuCisgKi8KKworaXJxcmV0dXJuX3QgaGFuZGxlX2lwaShpbnQgaXJxLCB2b2lkICpkZXNjKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IGlwaV9kYXRhICppcGkgPSAmcGVyX2NwdShpcGlfZGF0YSwgY3B1KTsKKwl1bnNpZ25lZCBsb25nIG9wczsKKworCXdoaWxlICgob3BzID0geGNoZygmaXBpLT5iaXRzLCAwKSkgIT0gMCkKKwkJX19oYW5kbGVfaXBpKCZvcHMsIGlwaSwgY3B1KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3ZvaWQgc2VuZF9pcGkoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssIGVudW0gaXBpX21lc3NhZ2VfdHlwZSBtc2cpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGNwdTsKKwl1bnNpZ25lZCBsb25nIHJldHZhbDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWZvcl9lYWNoX2NwdShjcHUsIGNwdW1hc2spIHsKKwkJc3RydWN0IGlwaV9kYXRhICppcGkgPSAmcGVyX2NwdShpcGlfZGF0YSwgY3B1KTsKKworCQlzZXRfYml0KG1zZywgJmlwaS0+Yml0cyk7CisJCS8qICBQb3NzaWJsZSBiYXJyaWVyIGhlcmUgICovCisJCXJldHZhbCA9IF9fdm1pbnRvcF9wb3N0KEJBU0VfSVBJX0lSUStjcHUpOworCisJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQgJWxkIG5vdCBjb25maWd1cmVkP1xuIiwKKwkJCQlCQVNFX0lQSV9JUlErY3B1KTsKKwkJfQorCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXBpX2ludGRlc2MgPSB7CisJLmhhbmRsZXIgPSBoYW5kbGVfaXBpLAorCS5mbGFncyA9IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJLm5hbWUgPSAiaXBpX2hhbmRsZXIiCit9OworCit2b2lkIF9faW5pdCBzbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKQoreworfQorCisvKgorICogaW50ZXJydXB0cyBzaG91bGQgYWxyZWFkeSBiZSBkaXNhYmxlZCBmcm9tIHRoZSBWTQorICogU1Agc2hvdWxkIGFscmVhZHkgYmUgY29ycmVjdDsgbmVlZCB0byBzZXQgVEhSRUFESU5GT19SRUcKKyAqIHRvIHBvaW50IHRvIGN1cnJlbnQgdGhyZWFkIGluZm8KKyAqLworCit2b2lkIF9fY3B1aW5pdCBzdGFydF9zZWNvbmRhcnkodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgdGhyZWFkX3B0cjsKKworCS8qICBDYWxjdWxhdGUgdGhyZWFkX2luZm8gcG9pbnRlciBmcm9tIHN0YWNrIHBvaW50ZXIgICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIlMCA9IFNQO1xuIgorCQk6ICI9ciIgKHRocmVhZF9wdHIpCisJKTsKKworCXRocmVhZF9wdHIgPSB0aHJlYWRfcHRyICYgfihUSFJFQURfU0laRS0xKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlRVU9URURfVEhSRUFESU5GT19SRUcgIiA9ICUwO1xuIgorCQk6CisJCTogInIiICh0aHJlYWRfcHRyKQorCSk7CisKKwkvKiAgU2V0IHRoZSBtZW1vcnkgc3RydWN0ICAqLworCWF0b21pY19pbmMoJmluaXRfbW0ubW1fY291bnQpOworCWN1cnJlbnQtPmFjdGl2ZV9tbSA9ICZpbml0X21tOworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJc2V0dXBfaXJxKEJBU0VfSVBJX0lSUSArIGNwdSwgJmlwaV9pbnRkZXNjKTsKKworCS8qICBSZWdpc3RlciB0aGUgY2xvY2tfZXZlbnQgZHVtbXkgICovCisJc2V0dXBfcGVyY3B1X2Nsb2NrZGV2KCk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyBjcHUgJWRcbiIsIF9fZnVuY19fLCBjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSk7CisKKwlzZXRfY3B1X29ubGluZShjcHUsIHRydWUpOworCXdoaWxlICghY3B1bWFza190ZXN0X2NwdShjcHUsIGNwdV9hY3RpdmVfbWFzaykpCisJCWNwdV9yZWxheCgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWNwdV9pZGxlKCk7Cit9CisKKworLyoKKyAqIGNhbGxlZCBvbmNlIGZvciBlYWNoIHByZXNlbnQgY3B1CisgKiBhcHBhcmVudGx5IHN0YXJ0cyB1cCB0aGUgQ1BVIGFuZCB0aGVuCisgKiBtYWludGFpbnMgY29udHJvbCB1bnRpbCAiY3B1X29ubGluZShjcHUpIiBpcyBzZXQuCisgKi8KKworaW50IF9fY3B1aW5pdCBfX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZDsKKwl2b2lkICpzdGFja19zdGFydDsKKworCS8qICBDcmVhdGUgbmV3IGluaXQgdGFzayBmb3IgdGhlIENQVSAgKi8KKwlpZGxlID0gZm9ya19pZGxlKGNwdSk7CisJaWYgKElTX0VSUihpZGxlKSkKKwkJcGFuaWMoS0VSTl9FUlIgImZvcmtfaWRsZSBmYWlsZWRcbiIpOworCisJdGhyZWFkID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKWlkbGUtPnN0YWNrOworCXRocmVhZC0+Y3B1ID0gY3B1OworCisJLyogIEJvb3QgdG8gdGhlIGhlYWQuICAqLworCXN0YWNrX3N0YXJ0ID0gICgodm9pZCAqKSB0aHJlYWQpICsgVEhSRUFEX1NJWkU7CisJX192bXN0YXJ0KHN0YXJ0X3NlY29uZGFyeSwgc3RhY2tfc3RhcnQpOworCisJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCisJCWJhcnJpZXIoKTsKKworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKK30KKwordm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJaW50IGk7CisKKwkvKgorCSAqIHNob3VsZCBldmVudHVhbGx5IGhhdmUgc29tZSBzb3J0IG9mIG1hY2hpbmUKKwkgKiBkZXNjcmlwdG9yIHRoYXQgaGFzIHRoaXMgc3R1ZmYKKwkgKi8KKworCS8qICBSaWdodCBub3csIGxldCdzIGp1c3QgZmFrZSBpdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2NwdXM7IGkrKykKKwkJY3B1X3NldChpLCBjcHVfcHJlc2VudF9tYXApOworCisJLyogIEFsc28gbmVlZCB0byByZWdpc3RlciB0aGUgaW50ZXJydXB0cyBmb3IgSVBJICAqLworCWlmIChtYXhfY3B1cyA+IDEpCisJCXNldHVwX2lycShCQVNFX0lQSV9JUlEsICZpcGlfaW50ZGVzYyk7Cit9CisKK3ZvaWQgc21wX3NlbmRfcmVzY2hlZHVsZShpbnQgY3B1KQoreworCXNlbmRfaXBpKGNwdW1hc2tfb2YoY3B1KSwgSVBJX1JFU0NIRURVTEUpOworfQorCit2b2lkIHNtcF9zZW5kX3N0b3Aodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1bWFzayB0YXJnZXRzOworCWNwdW1hc2tfY29weSgmdGFyZ2V0cywgY3B1X29ubGluZV9tYXNrKTsKKwljcHVtYXNrX2NsZWFyX2NwdShzbXBfcHJvY2Vzc29yX2lkKCksICZ0YXJnZXRzKTsKKwlzZW5kX2lwaSgmdGFyZ2V0cywgSVBJX0NQVV9TVE9QKTsKK30KKwordm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpCit7CisJc2VuZF9pcGkoY3B1bWFza19vZihjcHUpLCBJUElfQ0FMTF9GVU5DX1NJTkdMRSk7Cit9CisKK3ZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCit7CisJc2VuZF9pcGkobWFzaywgSVBJX0NBTExfRlVOQyk7Cit9CisKK2ludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQgc21wX3N0YXJ0X2NwdXModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCisJCWNwdV9zZXQoaSwgY3B1X3Bvc3NpYmxlX21hcCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvc3RhY2t0cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzU5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtMCwwICsxLDY2IEBACisvKgorICogU3RhY2t0cmFjZSBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RhY2t0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3JlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgY3VycmVudF9mcmFtZV9wb2ludGVyIGFzbSgicjMwIik7CisKK3N0cnVjdCBzdGFja2ZyYW1lIHsKKwl1bnNpZ25lZCBsb25nIGZwOworCXVuc2lnbmVkIGxvbmcgcmV0czsKK307CisKKy8qCisgKiBTYXZlIHN0YWNrLWJhY2t0cmFjZSBhZGRyZXNzZXMgaW50byBhIHN0YWNrX3RyYWNlIGJ1ZmZlci4KKyAqLwordm9pZCBzYXZlX3N0YWNrX3RyYWNlKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UpCit7CisJdW5zaWduZWQgbG9uZyBsb3csIGhpZ2g7CisJdW5zaWduZWQgbG9uZyBmcDsKKwlzdHJ1Y3Qgc3RhY2tmcmFtZSAqZnJhbWU7CisJaW50IHNraXAgPSB0cmFjZS0+c2tpcDsKKworCWxvdyA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShjdXJyZW50KTsKKwloaWdoID0gbG93ICsgVEhSRUFEX1NJWkU7CisJZnAgPSBjdXJyZW50X2ZyYW1lX3BvaW50ZXI7CisKKwl3aGlsZSAoZnAgPj0gbG93ICYmIGZwIDw9IChoaWdoIC0gc2l6ZW9mKCpmcmFtZSkpKSB7CisJCWZyYW1lID0gKHN0cnVjdCBzdGFja2ZyYW1lICopZnA7CisKKwkJaWYgKHNraXApIHsKKwkJCXNraXAtLTsKKwkJfSBlbHNlIHsKKwkJCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gZnJhbWUtPnJldHM7CisJCQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPj0gdHJhY2UtPm1heF9lbnRyaWVzKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogVGhlIG5leHQgZnJhbWUgbXVzdCBiZSBhdCBhIGhpZ2hlciBhZGRyZXNzIHRoYW4gdGhlCisJCSAqIGN1cnJlbnQgZnJhbWUuCisJCSAqLworCQlsb3cgPSBmcCArIHNpemVvZigqZnJhbWUpOworCQlmcCA9IGZyYW1lLT5mcDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvc3lzY2FsbC5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9zeXNjYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwZGQxOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvc3lzY2FsbC5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBIZXhhZ29uIHN5c3RlbSBjYWxscworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9tbWFuLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2lzdGVycy5oPgorCisvKgorICogU3lzdGVtIGNhbGxzIHdpdGggYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHdyYXBwZXJzLgorICogU2VlIHNpZ25hbC5jIGZvciBzaWduYWwtcmVsYXRlZCBzeXN0ZW0gY2FsbCB3cmFwcGVycy4KKyAqLworCithc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICp1ZmlsZW5hbWUsCisJCQkgIGNvbnN0IGNoYXIgX191c2VyICpjb25zdCBfX3VzZXIgKmFyZ3YsCisJCQkgIGNvbnN0IGNoYXIgX191c2VyICpjb25zdCBfX3VzZXIgKmVudnApCit7CisJc3RydWN0IHB0X3JlZ3MgKnByZWdzID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5yZWdzOworCWNoYXIgKmZpbGVuYW1lOworCWludCByZXR2YWw7CisKKwlmaWxlbmFtZSA9IGdldG5hbWUodWZpbGVuYW1lKTsKKwlyZXR2YWwgPSBQVFJfRVJSKGZpbGVuYW1lKTsKKwlpZiAoSVNfRVJSKGZpbGVuYW1lKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGRvX2V4ZWN2ZShmaWxlbmFtZSwgYXJndiwgZW52cCwgcHJlZ3MpOworCXB1dG5hbWUoZmlsZW5hbWUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworYXNtbGlua2FnZSBpbnQgc3lzX2Nsb25lKHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3c3AsCisJCQkgdW5zaWduZWQgbG9uZyBwYXJlbnRfdGlkcCwgdW5zaWduZWQgbG9uZyBjaGlsZF90aWRwKQoreworCXN0cnVjdCBwdF9yZWdzICpwcmVncyA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVnczsKKworCWlmICghbmV3c3ApCisJCW5ld3NwID0gcHJlZ3MtPlNQOworCXJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLCBuZXdzcCwgcHJlZ3MsIDAsIChpbnQgX191c2VyICopcGFyZW50X3RpZHAsCisJCSAgICAgICAoaW50IF9fdXNlciAqKWNoaWxkX3RpZHApOworfQorCisvKgorICogRG8gYSBzeXN0ZW0gY2FsbCBmcm9tIHRoZSBrZXJuZWwsIHNvIGFzIHRvIGhhdmUgYSBwcm9wZXIgcHRfcmVncworICogYW5kIHJlY3ljbGUgdGhlIHN5c19leGVjdnBlIGluZnJ1c3RydWN0dXJlLgorICovCitpbnQga2VybmVsX2V4ZWN2ZShjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJICBjb25zdCBjaGFyICpjb25zdCBhcmd2W10sIGNvbnN0IGNoYXIgKmNvbnN0IGVudnBbXSkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTAgYXNtKCJyMCIpID0gKHVuc2lnbmVkIGxvbmcpIGZpbGVuYW1lOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19hMSBhc20oInIxIikgPSAodW5zaWduZWQgbG9uZykgYXJndjsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTIgYXNtKCJyMiIpID0gKHVuc2lnbmVkIGxvbmcpIGVudnA7CisJaW50IHJldHZhbDsKKworCV9fYXNtX18gdm9sYXRpbGUoCisJCSIJUjYgPSAjJTQ7XG4iCisJCSIJdHJhcDAoIzEpO1xuIgorCQkiCSUwID0gUjA7XG4iCisJCTogIj1yIiAocmV0dmFsKQorCQk6ICJyIiAoX19hMCksICJyIiAoX19hMSksICJyIiAoX19hMiksICJpIiAoX19OUl9leGVjdmUpCisJKTsKKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9leGVjdmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9zeXNjYWxsdGFiLmMgYi9hcmNoL2hleGFnb24va2VybmVsL3N5c2NhbGx0YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTUwZjQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9zeXNjYWxsdGFiLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIFN5c3RlbSBjYWxsIHRhYmxlIGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzY2FsbC5oPgorCisjdW5kZWYgX19TWVNDQUxMCisjZGVmaW5lIF9fU1lTQ0FMTChuciwgY2FsbCkgW25yXSA9IChjYWxsKSwKKwordm9pZCAqc3lzX2NhbGxfdGFibGVbX19OUl9zeXNjYWxsc10gPSB7CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorfTsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvdGltZS5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlZTE1YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdGltZS5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogVGltZSByZWxhdGVkIGZ1bmN0aW9ucyBmb3IgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorCisvKgorICogRm9yIHRoZSBjbG9ja3NvdXJjZSB3ZSBuZWVkOgorICoJcGN5Y2xlIGZyZXF1ZW5jeSAoNjAwTUh6KQorICogRm9yIHRoZSBsb29wc19wZXJfamlmZnkgd2UgbmVlZDoKKyAqCXRocmVhZC9jcHUgZnJlcXVlbmN5ICgxMDBNSHopCisgKiBBbmQgZm9yIHRoZSB0aW1lciwgd2UgbmVlZDoKKyAqCXNsZWVwIGNsb2NrIHJhdGUKKyAqLworCitjeWNsZXNfdAlwY3ljbGVfZnJlcV9taHo7CitjeWNsZXNfdAl0aHJlYWRfZnJlcV9taHo7CitjeWNsZXNfdAlzbGVlcF9jbGtfZnJlcTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBydG9zX3RpbWVyX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gUlRPU19USU1FUl9SRUdTX0FERFIsCisJCS5lbmQJPSBSVE9TX1RJTUVSX1JFR1NfQUREUitQQUdFX1NJWkUtMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ0b3NfdGltZXJfZGV2aWNlID0geworCS5uYW1lCQk9ICJydG9zX3RpbWVyIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHJ0b3NfdGltZXJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBydG9zX3RpbWVyX3Jlc291cmNlcywKK307CisKKy8qICBBIGxvdCBvZiB0aGlzIHN0dWZmIHNob3VsZCBtb3ZlIGludG8gYSBwbGF0Zm9ybSBzcGVjaWZpYyBzZWN0aW9uLiAgKi8KK3N0cnVjdCBhZHNwX2h3X3RpbWVyX3N0cnVjdCB7CisJdTMyIG1hdGNoOyAgIC8qICBNYXRjaCB2YWx1ZSAgKi8KKwl1MzIgY291bnQ7CisJdTMyIGVuYWJsZTsgIC8qICBbMV0gLSBDTFJfT05fTUFUQ0hfRU4sIFswXSAtIEVOICAqLworCXUzMiBjbGVhcjsgICAvKiAgb25lLXNob3QgcmVnaXN0ZXIgdGhhdCBjbGVhcnMgdGhlIGNvdW50ICAqLworfTsKKworLyogIExvb2sgZm9yICJUQ1gwIiBmb3IgcmVsYXRlZCBjb25zdGFudHMuICAqLworc3RhdGljIF9faW9tZW0gc3RydWN0IGFkc3BfaHdfdGltZXJfc3RydWN0ICpydG9zX3RpbWVyOworCitzdGF0aWMgY3ljbGVfdCB0aW1lcl9nZXRfY3ljbGVzKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJcmV0dXJuIChjeWNsZV90KSBfX3ZtZ2V0dGltZSgpOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGhleGFnb25fY2xvY2tzb3VyY2UgPSB7CisJLm5hbWUJCT0gInBjeWNsZXMiLAorCS5yYXRpbmcJCT0gMjUwLAorCS5yZWFkCQk9IHRpbWVyX2dldF9jeWNsZXMsCisJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAorfTsKKworc3RhdGljIGludCBzZXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGRlbHRhLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJLyogIEFzc3VtaW5nIHRoZSB0aW1lciB3aWxsIGJlIGRpc2FibGVkIHdoZW4gd2UgZW50ZXIgaGVyZS4gICovCisKKwlpb3dyaXRlMzIoMSwgJnJ0b3NfdGltZXItPmNsZWFyKTsKKwlpb3dyaXRlMzIoMCwgJnJ0b3NfdGltZXItPmNsZWFyKTsKKworCWlvd3JpdGUzMihkZWx0YSwgJnJ0b3NfdGltZXItPm1hdGNoKTsKKwlpb3dyaXRlMzIoMSA8PCBUSU1FUl9FTkFCTEUsICZydG9zX3RpbWVyLT5lbmFibGUpOworCXJldHVybiAwOworfQorCisvKgorICogU2V0cyB0aGUgbW9kZSAocGVyaW9kaWMsIHNodXRkb3duLCBvbmVzaG90LCBldGMpIG9mIGEgdGltZXIuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCQkvKiBYWFggaW1wbGVtZW50IG1lICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NNUAorLyogIEJyb2FkY2FzdCBtZWNoYW5pc20gICovCitzdGF0aWMgdm9pZCBicm9hZGNhc3QoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCit7CisJc2VuZF9pcGkobWFzaywgSVBJX1RJTUVSKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBoZXhhZ29uX2Nsb2NrZXZlbnRfZGV2ID0geworCS5uYW1lCQk9ICJjbG9ja2V2ZW50IiwKKwkuZmVhdHVyZXMJPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5yYXRpbmcJCT0gNDAwLAorCS5pcnEJCT0gUlRPU19USU1FUl9JTlQsCisJLnNldF9uZXh0X2V2ZW50ID0gc2V0X25leHRfZXZlbnQsCisJLnNldF9tb2RlCT0gc2V0X21vZGUsCisjaWZkZWYgQ09ORklHX1NNUAorCS5icm9hZGNhc3QJPSBicm9hZGNhc3QsCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgY2xvY2tfZXZlbnRzKTsKKwordm9pZCBzZXR1cF9wZXJjcHVfY2xvY2tkZXYodm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNlX2RldiA9ICZoZXhhZ29uX2Nsb2NrZXZlbnRfZGV2OworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmR1bW15X2Nsb2NrX2RldiA9CisJCSZwZXJfY3B1KGNsb2NrX2V2ZW50cywgY3B1KTsKKworCW1lbWNweShkdW1teV9jbG9ja19kZXYsIGNlX2Rldiwgc2l6ZW9mKCpkdW1teV9jbG9ja19kZXYpKTsKKwlJTklUX0xJU1RfSEVBRCgmZHVtbXlfY2xvY2tfZGV2LT5saXN0KTsKKworCWR1bW15X2Nsb2NrX2Rldi0+ZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9EVU1NWTsKKwlkdW1teV9jbG9ja19kZXYtPmNwdW1hc2sgPSBjcHVtYXNrX29mKGNwdSk7CisJZHVtbXlfY2xvY2tfZGV2LT5tb2RlID0gQ0xPQ0tfRVZUX01PREVfVU5VU0VEOworCisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGR1bW15X2Nsb2NrX2Rldik7Cit9CisKKy8qICBDYWxsZWQgZnJvbSBzbXAuYyBmb3IgZWFjaCBDUFUncyB0aW1lciBpcGkgY2FsbCAgKi8KK3ZvaWQgaXBpX3RpbWVyKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZV9kZXYgPSAmcGVyX2NwdShjbG9ja19ldmVudHMsIGNwdSk7CisKKwljZV9kZXYtPmV2ZW50X2hhbmRsZXIoY2VfZGV2KTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2VfZGV2ID0gJmhleGFnb25fY2xvY2tldmVudF9kZXY7CisKKwlpb3dyaXRlMzIoMCwgJnJ0b3NfdGltZXItPmVuYWJsZSk7CisJY2VfZGV2LT5ldmVudF9oYW5kbGVyKGNlX2Rldik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qICBUaGlzIHNob3VsZCBhbHNvIGJlIHB1bGxlZCBmcm9tIGRldnRyZWUgICovCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBydG9zX3RpbWVyX2ludGRlc2MgPSB7CisJLmhhbmRsZXIgPSB0aW1lcl9pbnRlcnJ1cHQsCisJLmZsYWdzID0gSVJRRl9USU1FUiB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJLm5hbWUgPSAicnRvc190aW1lciIKK307CisKKy8qCisgKiB0aW1lX2luaXRfZGVmZXJyZWQgLSBjYWxsZWQgYnkgc3RhcnRfa2VybmVsIHRvIHNldCB1cCB0aW1lci9jbG9jayBzb3VyY2UKKyAqCisgKiBJbnN0YWxsIHRoZSBJUlEgaGFuZGxlciBmb3IgdGhlIGNsb2NrLCBzZXR1cCB0aW1lcnMuCisgKiBUaGlzIGlzIGRvbmUgbGF0ZSwgYXMgdGhhdCB3YXksIHdlIGNhbiB1c2UgaW9yZW1hcCgpLgorICoKKyAqIFRoaXMgcnVucyBqdXN0IGJlZm9yZSB0aGUgZGVsYXkgbG9vcCBpcyBjYWxpYnJhdGVkLCBhbmQKKyAqIGlzIHVzZWQgZm9yIGRlbGF5IGNhbGlicmF0aW9uLgorICovCit2b2lkIF9faW5pdCB0aW1lX2luaXRfZGVmZXJyZWQodm9pZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZV9kZXYgPSAmaGV4YWdvbl9jbG9ja2V2ZW50X2RldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCXN0cnVjdCByZXNvdXJjZSByOworCWludCBlcnI7CisKKwljZV9kZXYtPmNwdW1hc2sgPSBjcHVfYWxsX21hc2s7CisKKwlpZiAoIXJlc291cmNlKQorCQlyZXNvdXJjZSA9IHJ0b3NfdGltZXJfZGV2aWNlLnJlc291cmNlOworCisJLyogIGlvcmVtYXAgaGVyZSBtZWFucyB0aGlzIGhhcyB0byBydW4gbGF0ZXIsIGFmdGVyIHBhZ2luZyBpbml0ICAqLworCXJ0b3NfdGltZXIgPSBpb3JlbWFwKHJlc291cmNlLT5zdGFydCwgcmVzb3VyY2UtPmVuZAorCQktIHJlc291cmNlLT5zdGFydCArIDEpOworCisJaWYgKCFydG9zX3RpbWVyKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXNvdXJjZS0+c3RhcnQsIHJlc291cmNlLT5lbmQKKwkJCS0gcmVzb3VyY2UtPnN0YXJ0ICsgMSk7CisJfQorCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2toeigmaGV4YWdvbl9jbG9ja3NvdXJjZSwgcGN5Y2xlX2ZyZXFfbWh6ICogMTAwMCk7CisKKwkvKiAgTm90ZTogdGhlIHNpbSBnZW5lcmljIFJUT1MgY2xvY2sgaXMgYXBwYXJlbnRseSByZWFsbHkgMTg3NTBIeiAgKi8KKworCS8qCisJICogTGFzdCBhcmcgaXMgc29tZSBndWFyYW50ZWVkIHNlY29uZHMgZm9yIHdoaWNoIHRoZSBjb252ZXJzaW9uIHdpbGwKKwkgKiB3b3JrIHdpdGhvdXQgb3ZlcmZsb3cuCisJICovCisJY2xvY2tldmVudHNfY2FsY19tdWx0X3NoaWZ0KGNlX2Rldiwgc2xlZXBfY2xrX2ZyZXEsIDQpOworCisJY2VfZGV2LT5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N2ZmZmZmZmYsIGNlX2Rldik7CisJY2VfZGV2LT5taW5fZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZiwgY2VfZGV2KTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlzZXR1cF9wZXJjcHVfY2xvY2tkZXYoKTsKKyNlbmRpZgorCisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGNlX2Rldik7CisJc2V0dXBfaXJxKGNlX2Rldi0+aXJxLCAmcnRvc190aW1lcl9pbnRkZXNjKTsKK30KKwordm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCit7CisJbGF0ZV90aW1lX2luaXQgPSB0aW1lX2luaXRfZGVmZXJyZWQ7Cit9CisKKy8qCisgKiBUaGlzIGNvdWxkIGJlY29tZSBwYXJhbWV0cmljIG9yIHBlcmhhcHMgZXZlbiBjb21wdXRlZCBhdCBydW4tdGltZSwKKyAqIGJ1dCBmb3Igbm93IHdlIHRha2UgdGhlIG9ic2VydmVkIHNpbXVsYXRvciBqaXR0ZXIuCisgKi8KK3N0YXRpYyBsb25nIGxvbmcgZnVkZ2VmYWN0b3IgPSAzNTA7ICAvKiBNYXliZSBsb3dlciBpZiBrZXJuZWwgb3B0aW1pemVkLiAqLworCit2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gX192bWdldHRpbWUoKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZmluaXNoID0gKHBjeWNsZV9mcmVxX21oeiAqIHVzZWNzKSAtIGZ1ZGdlZmFjdG9yOworCisJd2hpbGUgKChfX3ZtZ2V0dGltZSgpIC0gc3RhcnQpIDwgZmluaXNoKQorCQljcHVfcmVsYXgoKTsgLyogIG5vdCBzdXJlIGhvdyB0aGlzIGltcHJvdmVzIHJlYWRhYmlsaXR5ICAqLworfQorRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2hleGFnb24va2VybmVsL3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0NDc1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ1BVIHRvcG9sb2d5IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbm9kZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisKKy8qICBTd2lwZWQgZnJvbSBNSVBTLiAgKi8KKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKKworc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisKKwlmb3JfZWFjaF9wcmVzZW50X2NwdShpKSB7CisKKwkJLyoKKwkJICogcmVnaXN0ZXJfY3B1IHRha2VzIGEgcGVyX2NwdSBwb2ludGVyIGFuZAorCQkgKiBqdXN0IHBvaW50cyBpdCBhdCBhbm90aGVyIHBlcl9jcHUgc3RydWN0Li4uCisJCSAqLworCisJCXJldCA9IHJlZ2lzdGVyX2NwdSgmcGVyX2NwdShjcHVfZGV2aWNlcywgaSksIGkpOworCQlpZiAocmV0KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidG9wb2xvZ3lfaW5pdDogcmVnaXN0ZXJfY3B1ICVkICIKKwkJCSAgICAgICAiZmFpbGVkICglZClcbiIsIGksIHJldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvdHJhbXBvbGluZS5TIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC90cmFtcG9saW5lLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjMzZjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdHJhbXBvbGluZS5TCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVHJhbXBvbGluZSBzZXF1ZW5jZXMgdG8gYmUgY29waWVkIG9udG8gdXNlciBzdGFjay4KKyAqIFRoaXMgY29uc3VtZXMgYSBsaXR0bGUgbW9yZSBzcGFjZSB0aGFuIGhhbmQtYXNzZW1ibGluZworICogaW1tZWRpYXRlIGNvbnN0YW50cyBmb3IgdXNlIGluIEMsIGJ1dCBpcyBtb3JlIHBvcnRhYmxlCisgKiB0byBmdXR1cmUgdHdlYWtzIHRvIHRoZSBIZXhhZ29uIGluc3RydWN0aW9uIHNldC4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisvKiAgU2lnIHRyYW1wb2xpbmVzIC0gY2FsbCBzeXNfc2lncmV0dXJuIG9yIHN5c19ydF9zaWdyZXR1cm4gYXMgYXBwcm9wcmlhdGUgKi8KKworLyogIHBsYWluIHNpZ3JldHVybiBpcyBnb25lLiAgKi8KKworCS5nbG9ibCBfX3J0X3NpZ3RyYW1wX3RlbXBsYXRlCitfX3J0X3NpZ3RyYW1wX3RlbXBsYXRlOgorCXI2ID0gI19fTlJfcnRfc2lncmV0dXJuOworCXRyYXAwKCMxKTsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDg4NTdkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC90cmFwcy5jCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogS2VybmVsIHRyYXBzL2V2ZW50cyBmb3IgSGV4YWdvbiBwcm9jZXNzb3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorI2luY2x1ZGUgPGFzbS92bV9mYXVsdC5oPgorI2luY2x1ZGUgPGFzbS9zeXNjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpZmRlZiBDT05GSUdfS0dEQgorIyBpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CisjZW5kaWYKKworI2RlZmluZSBUUkFQX1NZU0NBTEwJMQorI2RlZmluZSBUUkFQX0RFQlVHCTB4ZGIKKwordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit7Cit9CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19CVUcKKy8qIE1heWJlIHNob3VsZCByZXNlbWJsZSBhcmNoL3NoL2tlcm5lbC90cmFwcy5jID8/ICovCitpbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogQ09ORklHX0dFTkVSSUNfQlVHICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpleF9uYW1lKGludCBleCkKK3sKKwlzd2l0Y2ggKGV4KSB7CisJY2FzZSBIVk1fR0VfQ19YUFJPVDoKKwljYXNlIEhWTV9HRV9DX1hVU0VSOgorCQlyZXR1cm4gIkV4ZWN1dGUgcHJvdGVjdGlvbiBmYXVsdCI7CisJY2FzZSBIVk1fR0VfQ19SUFJPVDoKKwljYXNlIEhWTV9HRV9DX1JVU0VSOgorCQlyZXR1cm4gIlJlYWQgcHJvdGVjdGlvbiBmYXVsdCI7CisJY2FzZSBIVk1fR0VfQ19XUFJPVDoKKwljYXNlIEhWTV9HRV9DX1dVU0VSOgorCQlyZXR1cm4gIldyaXRlIHByb3RlY3Rpb24gZmF1bHQiOworCWNhc2UgSFZNX0dFX0NfWE1BTDoKKwkJcmV0dXJuICJNaXNhbGlnbmVkIGluc3RydWN0aW9uIjsKKwljYXNlIEhWTV9HRV9DX1JNQUw6CisJCXJldHVybiAiTWlzYWxpZ25lZCBkYXRhIGxvYWQiOworCWNhc2UgSFZNX0dFX0NfV01BTDoKKwkJcmV0dXJuICJNaXNhbGlnbmVkIGRhdGEgc3RvcmUiOworCWNhc2UgSFZNX0dFX0NfSU5WSToKKwljYXNlIEhWTV9HRV9DX1BSSVZJOgorCQlyZXR1cm4gIklsbGVnYWwgaW5zdHJ1Y3Rpb24iOworCWNhc2UgSFZNX0dFX0NfQlVTOgorCQlyZXR1cm4gIlByZWNpc2UgYnVzIGVycm9yIjsKKwljYXNlIEhWTV9HRV9DX0NBQ0hFOgorCQlyZXR1cm4gIkNhY2hlIGVycm9yIjsKKworCWNhc2UgMHhkYjoKKwkJcmV0dXJuICJEZWJ1Z2dlciB0cmFwIjsKKworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5yZWNvZ25pemVkIGV4Y2VwdGlvbiI7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19zaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZnAsCisJCQkgIHVuc2lnbmVkIGxvbmcgaXApCit7CisJaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDI0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgKm5ld2ZwOworCXVuc2lnbmVkIGxvbmcgbG93LCBoaWdoOworCWNoYXIgdG1wc3RyWzEyOF07CisJY2hhciAqbW9kbmFtZTsKKwlpbnQgaTsKKworCWlmICh0YXNrID09IE5VTEwpCisJCXRhc2sgPSBjdXJyZW50OworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIyVkLCAlcy8lZCwgQ2FsbCBUcmFjZTpcbiIsCisJICAgICAgIHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIHRhc2stPmNvbW0sCisJICAgICAgIHRhc2tfcGlkX25yKHRhc2spKTsKKworCWlmIChmcCA9PSBOVUxMKSB7CisJCWlmICh0YXNrID09IGN1cnJlbnQpIHsKKwkJCWFzbSgiJTAgPSByMzAiIDogIj1yIiAoZnApKTsKKwkJfSBlbHNlIHsKKwkJCWZwID0gKHVuc2lnbmVkIGxvbmcgKikKKwkJCSAgICAgKChzdHJ1Y3QgaGV4YWdvbl9zd2l0Y2hfc3RhY2sgKikKKwkJCSAgICAgdGFzay0+dGhyZWFkLnN3aXRjaF9zcCktPmZwOworCQl9CisJfQorCisJaWYgKCgoKHVuc2lnbmVkIGxvbmcpIGZwKSAmIDB4MykgfHwgKCh1bnNpZ25lZCBsb25nKSBmcCA8IDB4MTAwMCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gQ29ycnVwdCBmcmFtZSBwb2ludGVyICVwXG4iLCBmcCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBTYXZlZCBsaW5rIHJlZyBpcyBvbmUgd29yZCBhYm92ZSBGUCAqLworCWlmICghaXApCisJCWlwID0gKihmcCsxKTsKKworCS8qIEV4cGVjdCBrZXJuZWwgc3RhY2sgdG8gYmUgaW4tYm91bmRzICovCisJbG93ID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRhc2spOworCWhpZ2ggPSBsb3cgKyBUSFJFQURfU0laRSAtIDg7CisJbG93ICs9IHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pOworCisJZm9yIChpID0gMDsgaSA8IGtzdGFja19kZXB0aF90b19wcmludDsgaSsrKSB7CisKKwkJbmFtZSA9IGthbGxzeW1zX2xvb2t1cChpcCwgJnNpemUsICZvZmZzZXQsICZtb2RuYW1lLCB0bXBzdHIpOworCisJCXByaW50ayhLRVJOX0lORk8gIlslcF0gMHglbHg6ICVzICsgMHglbHgiLCBmcCwgaXAsIG5hbWUsCisJCQlvZmZzZXQpOworCQlpZiAoKCh1bnNpZ25lZCBsb25nKSBmcCA8IGxvdykgfHwgKGhpZ2ggPCAodW5zaWduZWQgbG9uZykgZnApKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiIChGUCBvdXQgb2YgYm91bmRzISkiKTsKKwkJaWYgKG1vZG5hbWUpCisJCQlwcmludGsoS0VSTl9DT05UICIgWyVzXSAiLCBtb2RuYW1lKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKworCQluZXdmcCA9ICh1bnNpZ25lZCBsb25nICopICpmcDsKKworCQlpZiAoKCh1bnNpZ25lZCBsb25nKSBuZXdmcCkgJiAweDMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIi0tIENvcnJ1cHQgZnJhbWUgcG9pbnRlciAlcFxuIiwKKwkJCQluZXdmcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEF0dGVtcHQgdG8gY29udGludWUgcGFzdCBleGNlcHRpb24uICovCisJCWlmICgwID09IG5ld2ZwKSB7CisJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoKCh2b2lkICopZnApCisJCQkJCQkrIDgpOworCisJCQlpZiAocmVncy0+c3lzY2FsbF9uciAhPSAtMSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIi0tIHRyYXAwIC0tIHN5c2NhbGxfbnI6ICVsZCIsCisJCQkJCXJlZ3MtPnN5c2NhbGxfbnIpOworCQkJCXByaW50ayhLRVJOX0NPTlQgIiAgcHNwOiAlbHggIGVscjogJWx4XG4iLAorCQkJCQkgcHRfcHNwKHJlZ3MpLCBwdF9lbHIocmVncykpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKiByZWFsbHkgd2FudCB0byBzZWUgbW9yZSAuLi4gKi8KKwkJCQlrc3RhY2tfZGVwdGhfdG9fcHJpbnQgKz0gNjsKKwkJCQlwcmludGsoS0VSTl9JTkZPICItLSAlcyAoMHglbHgpICBiYWR2YTogJWx4XG4iLAorCQkJCQlleF9uYW1lKHB0X2NhdXNlKHJlZ3MpKSwgcHRfY2F1c2UocmVncyksCisJCQkJCXB0X2JhZHZhKHJlZ3MpKTsKKwkJCX0KKworCQkJbmV3ZnAgPSAodW5zaWduZWQgbG9uZyAqKSByZWdzLT5yMzA7CisJCQlpcCA9IHB0X2VscihyZWdzKTsKKwkJfSBlbHNlIHsKKwkJCWlwID0gKihuZXdmcCArIDEpOworCQl9CisKKwkJLyogSWYgbGluayByZWcgaXMgbnVsbCwgd2UgYXJlIGRvbmUuICovCisJCWlmIChpcCA9PSAweDApCisJCQlicmVhazsKKworCQkvKiBJZiBuZXdmcCBpc24ndCBsYXJnZXIsIHdlJ3JlIHRyYWNpbmcgZ2FyYmFnZS4gKi8KKwkJaWYgKG5ld2ZwID4gZnApCisJCQlmcCA9IG5ld2ZwOworCQllbHNlCisJCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmZwKQoreworCS8qIFNhdmVkIGxpbmsgcmVnIGlzIG9uZSB3b3JkIGFib3ZlIEZQICovCisJZG9fc2hvd19zdGFjayh0YXNrLCBmcCwgMCk7Cit9CisKK3ZvaWQgZHVtcF9zdGFjayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgKmZwOworCWFzbSgiJTAgPSByMzAiIDogIj1yIiAoZnApKTsKKwlzaG93X3N0YWNrKGN1cnJlbnQsIGZwKTsKK30KK0VYUE9SVF9TWU1CT0woZHVtcF9zdGFjayk7CisKK2ludCBkaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCXNwaW5sb2NrX3QgbG9jazsKKwkJaW50IGNvdW50ZXI7CisJfSBkaWUgPSB7CisJCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoZGllLmxvY2spLAorCQkuY291bnRlciA9IDAKKwl9OworCisJY29uc29sZV92ZXJib3NlKCk7CisJb29wc19lbnRlcigpOworCisJc3Bpbl9sb2NrX2lycSgmZGllLmxvY2spOworCWJ1c3Rfc3BpbmxvY2tzKDEpOworCXByaW50ayhLRVJOX0VNRVJHICJPb3BzOiAlc1sjJWRdOlxuIiwgc3RyLCArK2RpZS5jb3VudGVyKTsKKworCWlmIChub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIGVyciwgcHRfY2F1c2UocmVncyksIFNJR1NFR1YpID09CisJICAgIE5PVElGWV9TVE9QKQorCQlyZXR1cm4gMTsKKworCXByaW50X21vZHVsZXMoKTsKKwlzaG93X3JlZ3MocmVncyk7CisJZG9fc2hvd19zdGFjayhjdXJyZW50LCAmcmVncy0+cjMwLCBwdF9lbHIocmVncykpOworCisJYnVzdF9zcGlubG9ja3MoMCk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CisKKwlzcGluX3VubG9ja19pcnEoJmRpZS5sb2NrKTsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKKworCWlmIChwYW5pY19vbl9vb3BzKQorCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CisKKwlvb3BzX2V4aXQoKTsKKwlkb19leGl0KGVycik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWVfaWZfa2VybmVsKGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQoreworCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQlyZXR1cm4gZGllKHN0ciwgcmVncywgZXJyKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKgorICogSXQncyBub3QgY2xlYXIgdGhhdCBtaXNhbGlnbmVkIGZldGNoZXMgYXJlIGV2ZXIgcmVjb3ZlcmFibGUuCisgKi8KK3N0YXRpYyB2b2lkIG1pc2FsaWduZWRfaW5zdHJ1Y3Rpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZGllX2lmX2tlcm5lbCgiTWlzYWxpZ25lZCBJbnN0cnVjdGlvbiIsIHJlZ3MsIDApOworCWZvcmNlX3NpZyhTSUdCVVMsIGN1cnJlbnQpOworfQorCisvKgorICogTWlzYWxpZ25lZCBsb2FkcyBhbmQgc3RvcmVzLCBvbiB0aGUgb3RoZXIgaGFuZCwgY2FuIGJlCisgKiBlbXVsYXRlZCwgYW5kIHByb2JhYmx5IHNob3VsZCBiZSwgc29tZSBkYXkuICBCdXQgZm9yIG5vdworICogdGhleSB3aWxsIGJlIGNvbnNpZGVyZWQgZmF0YWwuCisgKi8KK3N0YXRpYyB2b2lkIG1pc2FsaWduZWRfZGF0YV9sb2FkKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWRpZV9pZl9rZXJuZWwoIk1pc2FsaWduZWQgRGF0YSBMb2FkIiwgcmVncywgMCk7CisJZm9yY2Vfc2lnKFNJR0JVUywgY3VycmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIG1pc2FsaWduZWRfZGF0YV9zdG9yZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlkaWVfaWZfa2VybmVsKCJNaXNhbGlnbmVkIERhdGEgU3RvcmUiLCByZWdzLCAwKTsKKwlmb3JjZV9zaWcoU0lHQlVTLCBjdXJyZW50KTsKK30KKworc3RhdGljIHZvaWQgaWxsZWdhbF9pbnN0cnVjdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlkaWVfaWZfa2VybmVsKCJJbGxlZ2FsIEluc3RydWN0aW9uIiwgcmVncywgMCk7CisJZm9yY2Vfc2lnKFNJR0lMTCwgY3VycmVudCk7Cit9CisKKy8qCisgKiBQcmVjaXNlIGJ1cyBlcnJvcnMgbWF5IGJlIHJlY292ZXJhYmxlIHdpdGggYSBhIHJldHJ5LAorICogYnV0IGZvciBub3csIHRyZWF0IHRoZW0gYXMgaXJyZWNvdmVyYWJsZS4KKyAqLworc3RhdGljIHZvaWQgcHJlY2lzZV9idXNfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZGllX2lmX2tlcm5lbCgiUHJlY2lzZSBCdXMgRXJyb3IiLCByZWdzLCAwKTsKKwlmb3JjZV9zaWcoU0lHQlVTLCBjdXJyZW50KTsKK30KKworLyoKKyAqIElmIGFueXRoaW5nIGlzIHRvIGJlIGRvbmUgaGVyZSBvdGhlciB0aGFuIHBhbmljLAorICogaXQgd2lsbCBwcm9iYWJseSBiZSBjb21wbGV4IGFuZCBtaWdyYXRlIHRvIGFub3RoZXIKKyAqIHNvdXJjZSBtb2R1bGUuICBGb3Igbm93LCBqdXN0IGRpZS4KKyAqLworc3RhdGljIHZvaWQgY2FjaGVfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZGllKCJDYWNoZSBFcnJvciIsIHJlZ3MsIDApOworfQorCisvKgorICogR2VuZXJhbCBleGNlcHRpb24gaGFuZGxlcgorICovCit2b2lkIGRvX2dlbmV4KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qCisJICogRGVjb2RlIENhdXNlIGFuZCBEaXNwYXRjaAorCSAqLworCXN3aXRjaCAocHRfY2F1c2UocmVncykpIHsKKwljYXNlIEhWTV9HRV9DX1hQUk9UOgorCWNhc2UgSFZNX0dFX0NfWFVTRVI6CisJCWV4ZWN1dGVfcHJvdGVjdGlvbl9mYXVsdChyZWdzKTsKKwkJYnJlYWs7CisJY2FzZSBIVk1fR0VfQ19SUFJPVDoKKwljYXNlIEhWTV9HRV9DX1JVU0VSOgorCQlyZWFkX3Byb3RlY3Rpb25fZmF1bHQocmVncyk7CisJCWJyZWFrOworCWNhc2UgSFZNX0dFX0NfV1BST1Q6CisJY2FzZSBIVk1fR0VfQ19XVVNFUjoKKwkJd3JpdGVfcHJvdGVjdGlvbl9mYXVsdChyZWdzKTsKKwkJYnJlYWs7CisJY2FzZSBIVk1fR0VfQ19YTUFMOgorCQltaXNhbGlnbmVkX2luc3RydWN0aW9uKHJlZ3MpOworCQlicmVhazsKKwljYXNlIEhWTV9HRV9DX1JNQUw6CisJCW1pc2FsaWduZWRfZGF0YV9sb2FkKHJlZ3MpOworCQlicmVhazsKKwljYXNlIEhWTV9HRV9DX1dNQUw6CisJCW1pc2FsaWduZWRfZGF0YV9zdG9yZShyZWdzKTsKKwkJYnJlYWs7CisJY2FzZSBIVk1fR0VfQ19JTlZJOgorCWNhc2UgSFZNX0dFX0NfUFJJVkk6CisJCWlsbGVnYWxfaW5zdHJ1Y3Rpb24ocmVncyk7CisJCWJyZWFrOworCWNhc2UgSFZNX0dFX0NfQlVTOgorCQlwcmVjaXNlX2J1c19lcnJvcihyZWdzKTsKKwkJYnJlYWs7CisJY2FzZSBIVk1fR0VfQ19DQUNIRToKKwkJY2FjaGVfZXJyb3IocmVncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEhhbHQgYW5kIGNhdGNoIGZpcmUgKi8KKwkJcGFuaWMoIlVucmVjb2duaXplZCBleGNlcHRpb24gMHglbHhcbiIsIHB0X2NhdXNlKHJlZ3MpKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBJbmRpcmVjdCBzeXN0ZW0gY2FsbCBkaXNwYXRjaCAqLworbG9uZyBzeXNfc3lzY2FsbCh2b2lkKQoreworCXByaW50ayhLRVJOX0VSUiAic3lzX3N5c2NhbGwgaW52b2tlZCFcbiIpOworCXJldHVybiAtRU5PU1lTOworfQorCit2b2lkIGRvX3RyYXAwKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgc3lzY2FsbHJldCA9IDA7CisJc3lzY2FsbF9mbiBzeXNjYWxsOworCisJc3dpdGNoIChwdF9jYXVzZShyZWdzKSkgeworCWNhc2UgVFJBUF9TWVNDQUxMOgorCQkvKiBTeXN0ZW0gY2FsbCBpcyB0cmFwMCAjMSAqLworCisJCS8qIGFsbG93IHN0cmFjZSB0byBjYXRjaCBzeXNjYWxsIGFyZ3MgICovCisJCWlmICh1bmxpa2VseSh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSAmJgorCQkJdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2VudHJ5KHJlZ3MpKSkKKwkJCXJldHVybjsgIC8qICByZXR1cm4gLUVOT1NZUyBzb21ld2hlcmU/ICAqLworCisJCS8qIEludGVycnVwdHMgc2hvdWxkIGJlIHJlLWVuYWJsZWQgZm9yIHN5c2NhbGwgcHJvY2Vzc2luZyAqLworCQlfX3Ztc2V0aWUoVk1fSU5UX0VOQUJMRSk7CisKKwkJLyoKKwkJICogU3lzdGVtIGNhbGwgbnVtYmVyIGlzIGluIHI2LCBhcmd1bWVudHMgaW4gcjAuLnI1LgorCQkgKiBGb3J0dW5hdGVseSwgbm8gTGludXggc3lzY2FsbCBoYXMgbW9yZSB0aGFuIDYgYXJndW1lbnRzLAorCQkgKiBhbmQgSGV4YWdvbiBBQkkgcGFzc2VzIGZpcnN0IDYgYXJndW1lbnRzIGluIHJlZ2lzdGVycy4KKwkJICogNjQtYml0IGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIG9kZC9ldmVuIHJlZ2lzdGVyIHBhaXJzLgorCQkgKiBGb3J0dW5hdGVseSwgd2UgaGF2ZSBubyBzeXN0ZW0gY2FsbHMgdGhhdCB0YWtlIG1vcmUKKwkJICogdGhhbiB0aHJlZSBhcmd1bWVudHMgd2l0aCBtb3JlIHRoYW4gb25lIDY0LWJpdCB2YWx1ZS4KKwkJICogU2hvdWxkIHRoYXQgY2hhbmdlLCB3ZSdkIG5lZWQgdG8gcmVkZXNpZ24gdG8gY29weQorCQkgKiBiZXR3ZWVuIHVzZXIgYW5kIGtlcm5lbCBzdGFja3MuCisJCSAqLworCQlyZWdzLT5zeXNjYWxsX25yID0gcmVncy0+cjA2OworCisJCS8qCisJCSAqIEdQUiBSMCBjYXJyaWVzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIGFuZCBpcyBhbHNvIHVzZWQKKwkJICogdG8gcmVwb3J0IHRoZSByZXR1cm4gdmFsdWUuICBXZSBuZWVkIGEgYmFja3VwIG9mCisJCSAqIHRoZSB1c2VyJ3MgdmFsdWUgaW4gY2FzZSB3ZSBuZWVkIHRvIGRvIGEgbGF0ZSByZXN0YXJ0CisJCSAqIG9mIHRoZSBzeXN0ZW0gY2FsbC4KKwkJICovCisJCXJlZ3MtPnJlc3RhcnRfcjAgPSByZWdzLT5yMDA7CisKKwkJaWYgKCh1bnNpZ25lZCBsb25nKSByZWdzLT5zeXNjYWxsX25yID49IF9fTlJfc3lzY2FsbHMpIHsKKwkJCXJlZ3MtPnIwMCA9IC0xOworCQl9IGVsc2UgeworCQkJc3lzY2FsbCA9IChzeXNjYWxsX2ZuKQorCQkJCSAgKHN5c19jYWxsX3RhYmxlW3JlZ3MtPnN5c2NhbGxfbnJdKTsKKwkJCXN5c2NhbGxyZXQgPSBzeXNjYWxsKHJlZ3MtPnIwMCwgcmVncy0+cjAxLAorCQkJCSAgIHJlZ3MtPnIwMiwgcmVncy0+cjAzLAorCQkJCSAgIHJlZ3MtPnIwNCwgcmVncy0+cjA1KTsKKwkJfQorCisJCS8qCisJCSAqIElmIGl0IHdhcyBhIHNpZ3JldHVybiBzeXN0ZW0gY2FsbCwgZG9uJ3Qgb3ZlcndyaXRlCisJCSAqIHIwIHZhbHVlIGluIHN0YWNrIGZyYW1lIHdpdGggcmV0dXJuIHZhbHVlLgorCQkgKgorCQkgKiBfX05SX3NpZ3JldHVybiBkb2Vzbid0IHNlZW0gdG8gZXhpc3QgaW4gbmV3IHVuaXN0ZC5oCisJCSAqLworCisJCWlmIChyZWdzLT5zeXNjYWxsX25yICE9IF9fTlJfcnRfc2lncmV0dXJuKQorCQkJcmVncy0+cjAwID0gc3lzY2FsbHJldDsKKworCQkvKiBhbGxvdyBzdHJhY2UgdG8gZ2V0IHRoZSBzeXNjYWxsIHJldHVybiBzdGF0ZSAgKi8KKwkJaWYgKHVubGlrZWx5KHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKSkKKwkJCXRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9leGl0KHJlZ3MsIDApOworCisJCWJyZWFrOworCWNhc2UgVFJBUF9ERUJVRzoKKwkJLyogVHJhcDAgMHhkYiBpcyBkZWJ1ZyBicmVha3BvaW50ICovCisJCWlmICh1c2VyX21vZGUocmVncykpIHsKKwkJCXN0cnVjdCBzaWdpbmZvIGluZm87CisKKwkJCWluZm8uc2lfc2lnbm8gPSBTSUdUUkFQOworCQkJaW5mby5zaV9lcnJubyA9IDA7CisJCQkvKgorCQkJICogU29tZSBhcmNoaXRlY3VyZXMgYWRkIHNvbWUgcGVyLXRocmVhZCBzdGF0ZQorCQkJICogdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBicmVha3BvaW50IHRyYXBzIGFuZAorCQkJICogdHJhY2UgdHJhcHMuICBXZSBtYXkgd2FudCB0byBkbyB0aGF0LCBhbmQKKwkJCSAqIHNldCB0aGUgc2lfY29kZSB2YWx1ZSBhcHByb3ByaWF0ZWx5LCBvciB3ZQorCQkJICogbWF5IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IHRyYXAwIGZsYXZvci4KKwkJCSAqLworCQkJaW5mby5zaV9jb2RlID0gVFJBUF9CUktQVDsKKwkJCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKSBwdF9lbHIocmVncyk7CisJCQlzZW5kX3NpZ19pbmZvKFNJR1RSQVAsICZpbmZvLCBjdXJyZW50KTsKKwkJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfS0dEQgorCQkJa2dkYl9oYW5kbGVfZXhjZXB0aW9uKHB0X2NhdXNlKHJlZ3MpLCBTSUdUUkFQLAorCQkJCQkgICAgICBUUkFQX0JSS1BULCByZWdzKTsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCX0KKwkvKiBJZ25vcmUgb3RoZXIgdHJhcDAgY29kZXMgZm9yIG5vdywgZXNwZWNpYWxseSAwIChBbmdlbCBjYWxscykgKi8KK30KKworLyoKKyAqIE1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIGhhbmRsZXIKKyAqLwordm9pZCBkb19tYWNoY2hlY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogSGFsdCBhbmQgY2F0Y2ggZmlyZSAqLworCV9fdm1zdG9wKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3Zkc28uYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdmRzby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Mjc3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3Zkc28uYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIHZEU08gaW1wbGVtZW50YXRpb24gZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8YXNtL3Zkc28uaD4KKworc3RhdGljIHN0cnVjdCBwYWdlICp2ZHNvX3BhZ2U7CisKKy8qIENyZWF0ZSBhIHZEU08gcGFnZSBob2xkaW5nIHRoZSBzaWduYWwgdHJhbXBvbGluZS4KKyAqIFdlIHdhbnQgdGhpcyBmb3IgYSBub24tZXhlY3V0YWJsZSBzdGFjay4KKyAqLworc3RhdGljIGludCBfX2luaXQgdmRzb19pbml0KHZvaWQpCit7CisJc3RydWN0IGhleGFnb25fdmRzbyAqdmRzbzsKKworCXZkc29fcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCF2ZHNvX3BhZ2UpCisJCXBhbmljKCJDYW5ub3QgYWxsb2NhdGUgdmRzbyIpOworCisJdmRzbyA9IHZtYXAoJnZkc29fcGFnZSwgMSwgMCwgUEFHRV9LRVJORUwpOworCWlmICghdmRzbykKKwkJcGFuaWMoIkNhbm5vdCBtYXAgdmRzbyIpOworCWNsZWFyX3BhZ2UodmRzbyk7CisKKwkvKiBJbnN0YWxsIHRoZSBzaWduYWwgdHJhbXBvbGluZTsgY3VycmVudGx5IGxvb2tzIGxpa2UgdGhpczoKKwkgKglyNiA9ICNfX05SX3J0X3NpZ3JldHVybjsKKwkgKgl0cmFwMCgjMSk7CisJICovCisJdmRzby0+cnRfc2lnbmFsX3RyYW1wb2xpbmVbMF0gPSBfX3J0X3NpZ3RyYW1wX3RlbXBsYXRlWzBdOworCXZkc28tPnJ0X3NpZ25hbF90cmFtcG9saW5lWzFdID0gX19ydF9zaWd0cmFtcF90ZW1wbGF0ZVsxXTsKKworCXZ1bm1hcCh2ZHNvKTsKKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbCh2ZHNvX2luaXQpOworCisvKgorICogQ2FsbGVkIGZyb20gYmluZm10X2VsZi4gIENyZWF0ZSBhIFZNQSBmb3IgdGhlIHZEU08gcGFnZS4KKyAqLworaW50IGFyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBpbnQgdXNlc19pbnRlcnApCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHZkc29fYmFzZTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCisJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKworCS8qIFRyeSB0byBnZXQgaXQgbG9hZGVkIHJpZ2h0IG5lYXIgbGQuc28vZ2xpYmMuICovCisJdmRzb19iYXNlID0gU1RBQ0tfVE9QOworCisJdmRzb19iYXNlID0gZ2V0X3VubWFwcGVkX2FyZWEoTlVMTCwgdmRzb19iYXNlLCBQQUdFX1NJWkUsIDAsIDApOworCWlmIChJU19FUlJfVkFMVUUodmRzb19iYXNlKSkgeworCQlyZXQgPSB2ZHNvX2Jhc2U7CisJCWdvdG8gdXBfZmFpbDsKKwl9CisKKwkvKiBNQVlXUklURSB0byBhbGxvdyBnZGIgdG8gQ09XIGFuZCBzZXQgYnJlYWtwb2ludHMuICovCisJcmV0ID0gaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcobW0sIHZkc29fYmFzZSwgUEFHRV9TSVpFLAorCQkJCSAgICAgIFZNX1JFQUR8Vk1fRVhFQ3wKKwkJCQkgICAgICBWTV9NQVlSRUFEfFZNX01BWVdSSVRFfFZNX01BWUVYRUN8CisJCQkJICAgICAgVk1fQUxXQVlTRFVNUCwKKwkJCQkgICAgICAmdmRzb19wYWdlKTsKKworCWlmIChyZXQpCisJCWdvdG8gdXBfZmFpbDsKKworCW1tLT5jb250ZXh0LnZkc28gPSAodm9pZCAqKXZkc29fYmFzZTsKKwordXBfZmFpbDoKKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyICphcmNoX3ZtYV9uYW1lKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWlmICh2bWEtPnZtX21tICYmIHZtYS0+dm1fc3RhcnQgPT0gKGxvbmcpdm1hLT52bV9tbS0+Y29udGV4dC52ZHNvKQorCQlyZXR1cm4gIlt2ZHNvXSI7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3ZtX2VudHJ5LlMgYi9hcmNoL2hleGFnb24va2VybmVsL3ZtX2VudHJ5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5OTA2NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1fZW50cnkuUwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIEV2ZW50IGVudHJ5L2V4aXQgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+ICAvKiAgYXNzZW1ibHktc2FmZXIgdmVyc2lvbnMgb2YgQyBkZWZpbmVzICovCisjaW5jbHVkZSA8YXNtL21lbS1sYXlvdXQuaD4gICAvKiAgc2lnaCwgZXhjZXB0IGZvciBwYWdlX29mZnNldCAgKi8KKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorCisvKgorICogRW50cnkgaW50byBndWVzdC1tb2RlIExpbnV4IHVuZGVyIEhleGFnb24gVmlydHVhbCBNYWNoaW5lLgorICogU3RhY2sgcG9pbnRlciBwb2ludHMgdG8gZXZlbnQgcmVjb3JkIC0gYnVpbGQgcHRfcmVncyBvbiB0b3Agb2YgaXQsCisgKiBzZXQgdXAgYSBwbGF1c2libGUgQyBzdGFjayBmcmFtZSwgYW5kIGRpc3BhdGNoIHRvIHRoZSBDIGhhbmRsZXIuCisgKiBPbiByZXR1cm4sIGRvIHZtcnRlIHZpcnR1YWwgaW5zdHJ1Y3Rpb24gd2l0aCBTUCB3aGVyZSB3ZSBzdGFydGVkLgorICoKKyAqIFZNIFNwZWMgMC41IHVzZXMgYSB0cmFwIHRvIGZldGNoIEhWTSByZWNvcmQgbm93LgorICovCisKKy8qCisgKiBTYXZlIGZ1bGwgcmVnaXN0ZXIgc3RhdGUsIHdoaWxlIHNldHRpbmcgdXAgdGhyZWFkX2luZm8gc3RydWN0CisgKiBwb2ludGVyIGRlcml2ZWQgZnJvbSBrZXJuZWwgc3RhY2sgcG9pbnRlciBpbiBUSFJFQURJTkZPX1JFRworICogcmVnaXN0ZXIsIHB1dHRpbmcgcHJpb3IgdGhyZWFkX2luZm8ucmVncyBwb2ludGVyIGluIGEgY2FsbGVlLXNhdmUKKyAqIHJlZ2lzdGVyIChSMjQsIHdoaWNoIGhhZCBiZXR0ZXIgbm90IGV2ZXIgYmUgYXNzaWduZWQgdG8gVEhSRUFESU5GT19SRUcpLAorICogYW5kIHVwZGF0aW5nIHRocmVhZF9pbmZvLnJlZ3MgdG8gcG9pbnQgdG8gY3VycmVudCBzdGFjayBmcmFtZSwKKyAqIHNvIGFzIHRvIHN1cHBvcnQgbmVzdGVkIGV2ZW50cyBpbiBrZXJuZWwgbW9kZS4KKyAqCisgKiBBcyB0aGlzIGlzIGNvbW1vbiBjb2RlLCB3ZSBzZXQgdGhlIHB0X3JlZ3Mgc3lzdGVtIGNhbGwgbnVtYmVyCisgKiB0byAtMSBmb3IgYWxsIGV2ZW50cy4gIEl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgc3lzdGVtIGNhbGwKKyAqIG51bWJlciBpbiB0aGUgY2FzZSB3aGVyZSB3ZSBkZWNvZGUgYSBzeXN0ZW0gY2FsbCAodHJhcDAoIzEpKS4KKyAqLworCisjZGVmaW5lIHNhdmVfcHRfcmVncygpXAorCW1lbWQoUjAgKyAjX1BUX1IzMTMwKSA9IFIzMTozMDsgXAorCXsgbWVtdyhSMCArICNfUFRfUjI5MjgpID0gUjI4OyBcCisJICBSMzEgPSBtZW13KFIwICsgI19QVF9FUl9WTVBTUCk7IH1cCisJeyBtZW13KFIwICsgIyhfUFRfUjI5MjggKyA0KSkgPSBSMzE7IFwKKwkgIFIzMSA9IHVncDsgfSBcCisJeyBtZW1kKFIwICsgI19QVF9SMjcyNikgPSBSMjc6MjY7IFwKKwkgIFIzMCA9IGdwIDsgfSBcCisJbWVtZChSMCArICNfUFRfUjI1MjQpID0gUjI1OjI0OyBcCisJbWVtZChSMCArICNfUFRfUjIzMjIpID0gUjIzOjIyOyBcCisJbWVtZChSMCArICNfUFRfUjIxMjApID0gUjIxOjIwOyBcCisJbWVtZChSMCArICNfUFRfUjE5MTgpID0gUjE5OjE4OyBcCisJbWVtZChSMCArICNfUFRfUjE3MTYpID0gUjE3OjE2OyBcCisJbWVtZChSMCArICNfUFRfUjE1MTQpID0gUjE1OjE0OyBcCisJbWVtZChSMCArICNfUFRfUjEzMTIpID0gUjEzOjEyOyBcCisJeyBtZW1kKFIwICsgI19QVF9SMTExMCkgPSBSMTE6MTA7IFwKKwkgIFIxNSA9IGxjMDsgfSBcCisJeyBtZW1kKFIwICsgI19QVF9SMDkwOCkgPSBSOTo4OyBcCisJICBSMTQgPSBzYTA7IH0gXAorCXsgbWVtZChSMCArICNfUFRfUjA3MDYpID0gUjc6NjsgXAorCSAgUjEzID0gbGMxOyB9IFwKKwl7IG1lbWQoUjAgKyAjX1BUX1IwNTA0KSA9IFI1OjQ7IFwKKwkgIFIxMiA9IHNhMTsgfSBcCisJeyBtZW1kKFIwICsgI19QVF9VR1BHUCkgPSBSMzE6MzA7IFwKKwkgIFIxMSA9IG0xOyBcCisJICBSMi5IID0gI0hJKF9USFJFQURfU0laRSk7IH0gXAorCXsgbWVtZChSMCArICNfUFRfTEMwU0EwKSA9IFIxNToxNDsgXAorCSAgUjEwID0gbTA7IFwKKwkgIFIyLkwgPSAjTE8oX1RIUkVBRF9TSVpFKTsgfSBcCisJeyBtZW1kKFIwICsgI19QVF9MQzFTQTEpID0gUjEzOjEyOyBcCisJICBSMTUgPSBwMzowOyBcCisJICBSMiA9IG5lZyhSMik7IH0gXAorCXsgbWVtZChSMCArICNfUFRfTTFNMCkgPSBSMTE6MTA7IFwKKwkgIFIxNCAgPSB1c3I7IFwKKwkgIFIyID0gYW5kKFIwLFIyKTsgfSBcCisJeyBtZW1kKFIwICsgI19QVF9QUkVEU1VTUikgPSAgUjE1OjE0OyBcCisJICBUSFJFQURJTkZPX1JFRyA9IFIyOyB9IFwKKwl7IHIyNCA9IG1lbXcoVEhSRUFESU5GT19SRUcgKyAjX1RIUkVBRF9JTkZPX1BUX1JFR1MpOyBcCisJICBtZW13KFRIUkVBRElORk9fUkVHICsgI19USFJFQURfSU5GT19QVF9SRUdTKSA9IFIwOyBcCisJICBSMiA9ICMtMTsgfSBcCisJeyBtZW13KFIwICsgI19QVF9TWVNDQUxMX05SKSA9IFIyOyBcCisJICBSMzAgPSAjMDsgfQorCisvKgorICogUmVzdG9yZSByZWdpc3RlcnMgYW5kIHRocmVhZF9pbmZvLnJlZ3Mgc3RhdGUuIFRIUkVBRElORk9fUkVHCisgKiBpcyBhc3N1bWVkIHRvIHN0aWxsIGJlIHNhbmUsIGFuZCBSMjQgdG8gaGF2ZSBiZWVuIGNvcnJlY3RseQorICogcHJlc2VydmVkLiBEb24ndCByZXN0b3JlIFIyOSAoU1ApIHVudGlsIGxhdGVyLgorICovCisKKyNkZWZpbmUgcmVzdG9yZV9wdF9yZWdzKCkgXAorCXsgbWVtdyhUSFJFQURJTkZPX1JFRyArICNfVEhSRUFEX0lORk9fUFRfUkVHUykgPSBSMjQ7IFwKKwkgIFIxNToxNCA9IG1lbWQoUjAgKyAjX1BUX1BSRURTVVNSKTsgfSBcCisJeyBSMTE6MTAgPSBtZW1kKFIwICsgI19QVF9NMU0wKTsgXAorCSAgcDM6MCA9IFIxNTsgfSBcCisJeyBSMTM6MTIgPSBtZW1kKFIwICsgI19QVF9MQzFTQTEpOyBcCisJICB1c3IgPSBSMTQ7IH0gXAorCXsgUjE1OjE0ID0gbWVtZChSMCArICNfUFRfTEMwU0EwKTsgXAorCSAgbTEgPSBSMTE7IH0gXAorCXsgUjM6MiA9IG1lbWQoUjAgKyAjX1BUX1IwMzAyKTsgXAorCSAgbTAgPSBSMTA7IH0gXAorCXsgUjU6NCA9IG1lbWQoUjAgKyAjX1BUX1IwNTA0KTsgXAorCSAgbGMxID0gUjEzOyB9IFwKKwl7IFI3OjYgPSBtZW1kKFIwICsgI19QVF9SMDcwNik7IFwKKwkgIHNhMSA9IFIxMjsgfSBcCisJeyBSOTo4ID0gbWVtZChSMCArICNfUFRfUjA5MDgpOyBcCisJICBsYzAgPSBSMTU7IH0gXAorCXsgUjExOjEwID0gbWVtZChSMCArICNfUFRfUjExMTApOyBcCisJICBzYTAgPSBSMTQ7IH0gXAorCXsgUjEzOjEyID0gbWVtZChSMCArICNfUFRfUjEzMTIpOyBcCisJICBSMTU6MTQgPSBtZW1kKFIwICsgI19QVF9SMTUxNCk7IH0gXAorCXsgUjE3OjE2ID0gbWVtZChSMCArICNfUFRfUjE3MTYpOyBcCisJICBSMTk6MTggPSBtZW1kKFIwICsgI19QVF9SMTkxOCk7IH0gXAorCXsgUjIxOjIwID0gbWVtZChSMCArICNfUFRfUjIxMjApOyBcCisJICBSMjM6MjIgPSBtZW1kKFIwICsgI19QVF9SMjMyMik7IH0gXAorCXsgUjI1OjI0ID0gbWVtZChSMCArICNfUFRfUjI1MjQpOyBcCisJICBSMjc6MjYgPSBtZW1kKFIwICsgI19QVF9SMjcyNik7IH0gXAorCVIzMTozMCA9IG1lbWQoUjAgKyAjX1BUX1VHUEdQKTsgXAorCXsgUjI4ID0gbWVtdyhSMCArICNfUFRfUjI5MjgpOyBcCisJICB1Z3AgPSBSMzE7IH0gXAorCXsgUjMxOjMwID0gbWVtZChSMCArICNfUFRfUjMxMzApOyBcCisJICBncCA9IFIzMDsgfQorCisJLyoKKwkgKiBDbGVhcnMgb2ZmIGVub3VnaCBzcGFjZSBmb3IgdGhlIHJlc3Qgb2YgcHRfcmVnczsgZXZyZWMgaXMgYSBwYXJ0CisJICogb2YgcHRfcmVncyBpbiBIVk0gbW9kZS4gIFNhdmUgUjAvUjEsIHNldCBoYW5kbGVyJ3MgYWRkcmVzcyBpbiBSMS4KKwkgKiBSMCBpcyB0aGUgYWRkcmVzcyBvZiBwdF9yZWdzIGFuZCBpcyB0aGUgcGFyYW1ldGVyIHRvIHNhdmVfcHRfcmVncy4KKwkgKi8KKworLyoKKyAqIFNpbmNlIHRoZSBIVk0gaXNuJ3QgYXV0b21hZ2ljYWxseSBwdXNoaW5nIHRoZSBFVlJFQyBvbnRvIHRoZSBzdGFjayBhbnltb3JlLAorICogd2UnbGwgc3VicmFjdCB0aGUgZW50aXJlIHNpemUgb3V0IGFuZCB0aGVuIGZpbGwgaXQgaW4gb3Vyc2VsdmVzLgorICogTmVlZCB0byBzYXZlIG9mZiBSMCwgUjEsIFIyLCBSMyBpbW1lZGlhdGVseS4KKyAqLworCisjZGVmaW5lCXZtX2V2ZW50X2VudHJ5KENIYW5kbGVyKSBcCisJeyBcCisJCVIyOSA9IGFkZChSMjksICMtKF9QVF9SRUdTX1NJWkUpKTsgXAorCQltZW1kKFIyOSArICMoX1BUX1IwMTAwICsgLV9QVF9SRUdTX1NJWkUpKSA9IFIxOjA7IFwKKwl9IFwKKwl7IFwKKwkJbWVtZChSMjkgKyNfUFRfUjAzMDIpID0gUjM6MjsgXAorCX0gXAorCXRyYXAxKCNIVk1fVFJBUDFfVk1HRVRSRUdTKTsgXAorCXsgXAorCQltZW1kKFIyOSArICNfUFRfRVJfVk1FTCkgPSBSMTowOyBcCisJCVIwID0gUjI5OyBcCisJCVIxLkwgPSAjTE8oQ0hhbmRsZXIpOyBcCisJfSBcCisJeyBcCisJCW1lbWQoUjI5ICsgI19QVF9FUl9WTVBTUCkgPSBSMzoyOyBcCisJCVIxLkggPSAjSEkoQ0hhbmRsZXIpOyBcCisJCWp1bXAgZXZlbnRfZGlzcGF0Y2g7IFwKKwl9CisKKy50ZXh0CisJLyoKKwkgKiBEbyBidWxrIHNhdmUvcmVzdG9yZSBpbiBvbmUgcGxhY2UuCisJICogQWRkcyBhIGp1bXAgdG8gZGlzcGF0Y2ggbGF0ZW5jeSwgYnV0CisJICogc2F2ZXMgaHVuZHJlZHMgb2YgYnl0ZXMuCisJICovCisKK2V2ZW50X2Rpc3BhdGNoOgorCXNhdmVfcHRfcmVncygpCisJY2FsbHIJcjEKKworCS8qCisJICogSWYgd2Ugd2VyZSBpbiBrZXJuZWwgbW9kZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBzY2hlZHVsZXIKKwkgKiBvciBzaWduYWxzIGlmIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQuICBJZiBzZXQsIHRoZW4gaXQgaGFzCisJICogdG8ganVtcCB0byBhIG5lZWRfcmVzY2hlZCBraW5kIG9mIGJsb2NrLgorCSAqIEJUVywgQ09ORklHX1BSRUVNUFQgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCisJICovCisKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCVIwID0gI1ZNX0lOVF9ESVNBQkxFCisJdHJhcDEoI0hWTV9UUkFQMV9WTVNFVElFKQorI2VuZGlmCisKKwkvKiAgIk5lc3RlZCBjb250cm9sIHBhdGgiIC0tIGlmIHRoZSBwcmV2aW91cyBtb2RlIHdhcyBrZXJuZWwgICovCisJUjAgPSBtZW13KFIyOSArICNfUFRfRVJfVk1FU1QpOworCVAwID0gdHN0Yml0KFIwLCAjSFZNX1ZNRVNUX1VNX1NGVCk7CisJaWYgIVAwIGp1bXAgcmVzdG9yZV9hbGw7CisJLyoKKwkgKiBSZXR1cm5pbmcgZnJvbSBzeXN0ZW0gY2FsbCwgbm9ybWFsbHkgY29taW5nIGJhY2sgZnJvbSB1c2VyIG1vZGUKKwkgKi8KK3JldHVybl9mcm9tX3N5c2NhbGw6CisJLyogIERpc2FibGUgaW50ZXJydXB0cyB3aGlsZSBjaGVja2luZyBUSUYgICovCisJUjAgPSAjVk1fSU5UX0RJU0FCTEUKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNU0VUSUUpCisKKwkvKgorCSAqIENvbWluZyBiYWNrIGZyb20gdGhlIEMtd29ybGQsIG91ciB0aHJlYWQgaW5mbyBwb2ludGVyCisJICogc2hvdWxkIGJlIGluIHRoZSBkZXNpZ25hdGVkIHJlZ2lzdGVyICh1c3VhbGx5IFIxOSkKKwkgKi8KKwlSMS5MID0gI0xPKF9USUZfQUxMV09SS19NQVNLKQorCXsKKwkJUjEuSCA9ICNISShfVElGX0FMTFdPUktfTUFTSyk7CisJCVIwID0gbWVtdyhUSFJFQURJTkZPX1JFRyArICNfVEhSRUFEX0lORk9fRkxBR1MpOworCX0KKworCS8qCisJICogQ29tcGFyZSBhZ2FpbnN0IHRoZSAicmV0dXJuIHRvIHVzZXJzcGFjZSIgX1RJRl9XT1JLX01BU0sKKwkgKi8KKwlSMSA9IGFuZChSMSxSMCk7CisJeyBQMCA9IGNtcC5lcShSMSwjMCk7IGlmICghUDAubmV3KSBqdW1wOnQgd29ya19wZW5kaW5nO30KKwlqdW1wIHJlc3RvcmVfYWxsOyAgLyogIHdlJ3JlIG91dHRhIGhlcmUhICAqLworCit3b3JrX3BlbmRpbmc6CisJeworCQlQMCA9IHRzdGJpdChSMSwgI1RJRl9ORUVEX1JFU0NIRUQpOworCQlpZiAoIVAwLm5ldykganVtcDpudCB3b3JrX25vdGlmeXNpZzsKKwl9CisJY2FsbCBzY2hlZHVsZQorCWp1bXAgcmV0dXJuX2Zyb21fc3lzY2FsbDsgIC8qICBjaGVjayBmb3IgbW9yZSB3b3JrICAqLworCit3b3JrX25vdGlmeXNpZzoKKwkvKiAgdGhpcyBpcyB0aGUgcGFydCB0aGF0J3Mga2luZCBvZiBmdXp6eS4gICovCisJUjEgPSBhbmQoUjAsICMoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9OT1RJRllfUkVTVU1FKSk7CisJUDAgPSBjbXAuZXEoUjEsICMwKTsKKwlpZiBQMCBqdW1wIHJlc3RvcmVfYWxsCisJUjEgPSBSMDsgCS8qIHVuc2lnbmVkIGxvbmcgdGhyZWFkX2luZm9fZmxhZ3MgKi8KKwlSMCA9IFIyOTsJLyogcmVncyBzaG91bGQgc3RpbGwgYmUgYXQgdG9wIG9mIHN0YWNrICAqLworCWNhbGwgZG9fbm90aWZ5X3Jlc3VtZQorCityZXN0b3JlX2FsbDoKKwkvKiBEaXNhYmxlIGludGVycnVwdHMsIGlmIHRoZXkgd2VyZW4ndCBhbHJlYWR5LCBiZWZvcmUgcmVnIHJlc3RvcmUuICAqLworCVIwID0gI1ZNX0lOVF9ESVNBQkxFCisJdHJhcDEoI0hWTV9UUkFQMV9WTVNFVElFKQorCisJLyogIGRvIHRoZSBzZXRyZWdzIGhlcmUgZm9yIFZNIDAuNSAgKi8KKwkvKiAgUjI5IGhlcmUgc2hvdWxkIGFscmVhZHkgYmUgcG9pbnRpbmcgYXQgcHRfcmVncyAgKi8KKwlSMTowID0gbWVtZChSMjkgKyAjX1BUX0VSX1ZNRUwpOworCVIzOjIgPSBtZW1kKFIyOSArICNfUFRfRVJfVk1QU1ApOworCXRyYXAxKCNIVk1fVFJBUDFfVk1TRVRSRUdTKTsKKworCVIwID0gUjI5CisJcmVzdG9yZV9wdF9yZWdzKCkKKwlSMTowID0gbWVtZChSMjkgKyAjX1BUX1IwMTAwKTsKKwlSMjkgPSBhZGQoUjI5LCAjX1BUX1JFR1NfU0laRSk7CisJdHJhcDEoI0hWTV9UUkFQMV9WTVJURSkKKwkvKiBOb3RyZWFjaGVkICovCisKKwkuZ2xvYmwgX0tfZW50ZXJfZ2VuZXgKK19LX2VudGVyX2dlbmV4OgorCXZtX2V2ZW50X2VudHJ5KGRvX2dlbmV4KQorCisJLmdsb2JsIF9LX2VudGVyX2ludGVycnVwdAorX0tfZW50ZXJfaW50ZXJydXB0OgorCXZtX2V2ZW50X2VudHJ5KGFyY2hfZG9fSVJRKQorCisJLmdsb2JsIF9LX2VudGVyX3RyYXAwCitfS19lbnRlcl90cmFwMDoKKwl2bV9ldmVudF9lbnRyeShkb190cmFwMCkKKworCS5nbG9ibCBfS19lbnRlcl9tYWNoY2hlY2sKK19LX2VudGVyX21hY2hjaGVjazoKKwl2bV9ldmVudF9lbnRyeShkb19tYWNoY2hlY2spCisKKworCS5nbG9ibCByZXRfZnJvbV9mb3JrCityZXRfZnJvbV9mb3JrOgorCWNhbGwgc2NoZWR1bGVfdGFpbAorCWp1bXAgcmV0dXJuX2Zyb21fc3lzY2FsbApkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9ldmVudHMuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1fZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2YTA4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3ZtX2V2ZW50cy5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogTW9zdGx5IElSUSBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKgorICogc2hvd19yZWdzIC0gcHJpbnQgcHRfcmVncyBzdHJ1Y3R1cmUKKyAqIEByZWdzOiBwb2ludGVyIHRvIHB0X3JlZ3MKKyAqCisgKiBUby1kbzogIGFkZCBhbGwgdGhlIGFjY2Vzc29yIGRlZmluaXRpb25zIHRvIHJlZ2lzdGVycy5oCisgKgorICogV2lsbCBtYWtlIHRoaXMgcm91dGluZSBhIGxvdCBlYXNpZXIgdG8gd3JpdGUuCisgKi8KK3ZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ayhLRVJOX0VNRVJHICJyZXN0YXJ0X3IwOiBcdDB4JTA4bHggICBzeXNjYWxsX25yOiAlbGRcbiIsCisJICAgICAgIHJlZ3MtPnJlc3RhcnRfcjAsIHJlZ3MtPnN5c2NhbGxfbnIpOworCXByaW50ayhLRVJOX0VNRVJHICJwcmVkczogXHRcdDB4JTA4bHhcbiIsIHJlZ3MtPnByZWRzKTsKKwlwcmludGsoS0VSTl9FTUVSRyAibGMwOiBcdDB4JTA4bHggICBzYTA6IDB4JTA4bHggICBtMDogIDB4JTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPmxjMCwgcmVncy0+c2EwLCByZWdzLT5tMCk7CisJcHJpbnRrKEtFUk5fRU1FUkcgImxjMTogXHQweCUwOGx4ICAgc2ExOiAweCUwOGx4ICAgbTE6ICAweCUwOGx4XG4iLAorCSAgICAgICByZWdzLT5sYzEsIHJlZ3MtPnNhMSwgcmVncy0+bTEpOworCXByaW50ayhLRVJOX0VNRVJHICJncDogXHQweCUwOGx4ICAgdWdwOiAweCUwOGx4ICAgdXNyOiAweCUwOGx4XG4iLAorCSAgICAgICByZWdzLT5ncCwgcmVncy0+dWdwLCByZWdzLT51c3IpOworCXByaW50ayhLRVJOX0VNRVJHICJyMDogXHQweCUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLCByZWdzLT5yMDAsCisJCXJlZ3MtPnIwMSwKKwkJcmVncy0+cjAyLAorCQlyZWdzLT5yMDMpOworCXByaW50ayhLRVJOX0VNRVJHICJyNDogIFx0MHglMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwgcmVncy0+cjA0LAorCQlyZWdzLT5yMDUsCisJCXJlZ3MtPnIwNiwKKwkJcmVncy0+cjA3KTsKKwlwcmludGsoS0VSTl9FTUVSRyAicjg6ICBcdDB4JTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsIHJlZ3MtPnIwOCwKKwkJcmVncy0+cjA5LAorCQlyZWdzLT5yMTAsCisJCXJlZ3MtPnIxMSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgInIxMjogXHQweCUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLCByZWdzLT5yMTIsCisJCXJlZ3MtPnIxMywKKwkJcmVncy0+cjE0LAorCQlyZWdzLT5yMTUpOworCXByaW50ayhLRVJOX0VNRVJHICJyMTY6IFx0MHglMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwgcmVncy0+cjE2LAorCQlyZWdzLT5yMTcsCisJCXJlZ3MtPnIxOCwKKwkJcmVncy0+cjE5KTsKKwlwcmludGsoS0VSTl9FTUVSRyAicjIwOiBcdDB4JTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsIHJlZ3MtPnIyMCwKKwkJcmVncy0+cjIxLAorCQlyZWdzLT5yMjIsCisJCXJlZ3MtPnIyMyk7CisJcHJpbnRrKEtFUk5fRU1FUkcgInIyNDogXHQweCUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLCByZWdzLT5yMjQsCisJCXJlZ3MtPnIyNSwKKwkJcmVncy0+cjI2LAorCQlyZWdzLT5yMjcpOworCXByaW50ayhLRVJOX0VNRVJHICJyMjg6IFx0MHglMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwgcmVncy0+cjI4LAorCQlyZWdzLT5yMjksCisJCXJlZ3MtPnIzMCwKKwkJcmVncy0+cjMxKTsKKworCXByaW50ayhLRVJOX0VNRVJHICJlbHI6IFx0MHglMDhseCAgIGNhdXNlOiAweCUwOGx4ICAgdXNlcl9tb2RlOiAlZFxuIiwKKwkJcHRfZWxyKHJlZ3MpLCBwdF9jYXVzZShyZWdzKSwgdXNlcl9tb2RlKHJlZ3MpKTsKKwlwcmludGsoS0VSTl9FTUVSRyAicHNwOiBcdDB4JTA4bHggICBiYWR2YTogMHglMDhseCAgIGludF9lbmFibGVkOiAlZFxuIiwKKwkJcHRfcHNwKHJlZ3MpLCBwdF9iYWR2YShyZWdzKSwgaW50c19lbmFibGVkKHJlZ3MpKTsKK30KKwordm9pZCBkdW1teV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGludCBlbHIgPSBwdF9lbHIocmVncyk7CisJcHJpbnRrKEtFUk5fRVJSICJVbmltcGxlbWVudGVkIGhhbmRsZXI7IEVMUj0weCUwOHhcbiIsIGVscik7Cit9CisKKwordm9pZCBhcmNoX2RvX0lSUShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaXJxID0gcHRfY2F1c2UocmVncyk7CisJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOworCisJaXJxX2VudGVyKCk7CisJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CisJaXJxX2V4aXQoKTsKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9pbml0X3NlZ3RhYmxlLlMgYi9hcmNoL2hleGFnb24va2VybmVsL3ZtX2luaXRfc2VndGFibGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWJiMzViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9pbml0X3NlZ3RhYmxlLlMKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgKiBJbml0aWFsIHBhZ2UgdGFibGUgZm9yIExpbnV4IGtlcm5lbCB1bmRlciBIZXhhZ29uIFZNLAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGVzZSB0YWJsZXMgYXJlIHByZS1jb21wdXRlZCBhbmQgbGlua2VkIGludG8ga2VybmVsLgorICovCisKKyNpbmNsdWRlIDxhc20vdm1fbW11Lmg+CisvKiAgI2luY2x1ZGUgPGFzbS9pb21hcC5oPiAgKi8KKworLyoKKyAqIFN0YXJ0IHdpdGggbWFwcGluZyBQQT0wIHRvIGJvdGggVkE9MHgwIGFuZCBWQT0weGMwMDAwMDAgYXMgMTZNQiBsYXJnZSBwYWdlcy4KKyAqIE5vIHVzZXIgbW9kZSBhY2Nlc3MsIFJXWCwgd3JpdGUtYmFjayBjYWNoZS4gIFRoZSBlbnRyeSBuZWVkcworICogdG8gYmUgcmVwbGljYXRlZCBmb3IgYWxsIDQgdmlydHVhbCBzZWdtZW50cyBtYXBwaW5nIHRvIHRoZSBwYWdlLgorICovCisKKy8qICJCaWcgS2VybmVsIFBhZ2UiICAqLworI2RlZmluZSBCS1AocGEpICgoKHBhKSAmIF9fSFZNX1BURV9QR01BU0tfNE1CKQkJXAorCQl8IF9fSFZNX1BURV9SIHwgX19IVk1fUFRFX1cgfCBfX0hWTV9QVEVfWAlcCisJCXwgX19IRVhBR09OX0NfV0JfTDIgPDwgNgkJCVwKKwkJfCBfX0hWTV9QREVfU18xNk1CKQorCisvKiAgTm8gY2FjaGUgdmVyc2lvbiAgKi8KKworI2RlZmluZSBCS1BHX0lPKHBhKSAoKChwYSkgJiBfX0hWTV9QVEVfUEdNQVNLXzE2TUIpIFwKKwkJCXwgX19IVk1fUFRFX1IgfCBfX0hWTV9QVEVfVyB8IF9fSFZNX1BURV9YIFwKKwkJCXwgX19IVk1fUERFX1NfMTZNQiB8IF9fSEVYQUdPTl9DX0RFViA8PCA2ICkKKworI2RlZmluZSBGT1VSS19JTyhwYSkgKCgocGEpICYgX19IVk1fUFRFX1BHTUFTS180S0IpIFwKKwkJCXwgX19IVk1fUFRFX1IgfCBfX0hWTV9QVEVfVyB8IF9fSFZNX1BURV9YIFwKKwkJCXwgX19IRVhBR09OX0NfREVWIDw8IDYgKQorCisjZGVmaW5lIEwyX1BUUihwYSkgKCgocGEpICYgX19IVk1fUFRFX1BHTUFTS180S0IpIFwKKwkJCXwgX19IVk1fUERFX1NfNEtCICApCisKKyNkZWZpbmUgWCBfX0hWTV9QREVfU19JTlZBTElECisKKwkucDJhbGlnbiAxMgorCS5nbG9ibCBzd2FwcGVyX3BnX2RpcgorCS5nbG9ibCBfS19pbml0X3NlZ3RhYmxlCitzd2FwcGVyX3BnX2RpcjoKKy8qIFZBIDB4MDAwMDAwMDAgKi8KKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorLyogVkEgMHg0MDAwMDAwMCAqLworCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorLyogVkEgMHg4MDAwMDAwMCAqLworCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorLyoweGE4Ki8ud29yZCBYLFgsWCxYCisjaWZkZWYgQ09ORklHX0NPTUVUX0VBUkxZX1VBUlRfREVCVUcKK1VBUlRfUFRFX0VOVFJZOgorLyoweGE5Ki8ud29yZCBCS1BHX0lPKDB4YTkwMDAwMDApLEJLUEdfSU8oMHhhOTAwMDAwMCksQktQR19JTygweGE5MDAwMDAwKSxCS1BHX0lPKDB4YTkwMDAwMDApCisjZWxzZQorLyoweGE5Ki8ud29yZCBYLFgsWCxYCisjZW5kaWYKKy8qMHhhYSovLndvcmQgWCxYLFgsWAorLyoweGFiKi8ud29yZCBYLFgsWCxYCisvKjB4YWMqLy53b3JkIFgsWCxYLFgKKy8qMHhhZCovLndvcmQgWCxYLFgsWAorLyoweGFlKi8ud29yZCBYLFgsWCxYCisvKjB4YWYqLy53b3JkIFgsWCxYLFgKKy8qMHhiMCovLndvcmQgWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYCisJLndvcmQgWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYCitfS19pbml0X3NlZ3RhYmxlOgorLyogVkEgMHhDMDAwMDAwMCAqLworCS53b3JkIEJLUCgweDAwMDAwMDAwKSwgQktQKDB4MDA0MDAwMDApLCBCS1AoMHgwMDgwMDAwMCksIEJLUCgweDAwYzAwMDAwKQorCS53b3JkIEJLUCgweDAxMDAwMDAwKSwgQktQKDB4MDE0MDAwMDApLCBCS1AoMHgwMTgwMDAwMCksIEJLUCgweDAxYzAwMDAwKQorCS53b3JkIEJLUCgweDAyMDAwMDAwKSwgQktQKDB4MDI0MDAwMDApLCBCS1AoMHgwMjgwMDAwMCksIEJLUCgweDAyYzAwMDAwKQorCS53b3JkIEJLUCgweDAzMDAwMDAwKSwgQktQKDB4MDM0MDAwMDApLCBCS1AoMHgwMzgwMDAwMCksIEJLUCgweDAzYzAwMDAwKQorCS53b3JkIEJLUCgweDA0MDAwMDAwKSwgQktQKDB4MDQ0MDAwMDApLCBCS1AoMHgwNDgwMDAwMCksIEJLUCgweDA0YzAwMDAwKQorCS53b3JkIEJLUCgweDA1MDAwMDAwKSwgQktQKDB4MDU0MDAwMDApLCBCS1AoMHgwNTgwMDAwMCksIEJLUCgweDA1YzAwMDAwKQorCS53b3JkIEJLUCgweDA2MDAwMDAwKSwgQktQKDB4MDY0MDAwMDApLCBCS1AoMHgwNjgwMDAwMCksIEJLUCgweDA2YzAwMDAwKQorCS53b3JkIEJLUCgweDA3MDAwMDAwKSwgQktQKDB4MDc0MDAwMDApLCBCS1AoMHgwNzgwMDAwMCksIEJLUCgweDA3YzAwMDAwKQorCisJLndvcmQgQktQKDB4MDgwMDAwMDApLCBCS1AoMHgwODQwMDAwMCksIEJLUCgweDA4ODAwMDAwKSwgQktQKDB4MDhjMDAwMDApCisJLndvcmQgQktQKDB4MDkwMDAwMDApLCBCS1AoMHgwOTQwMDAwMCksIEJLUCgweDA5ODAwMDAwKSwgQktQKDB4MDljMDAwMDApCisJLndvcmQgQktQKDB4MGEwMDAwMDApLCBCS1AoMHgwYTQwMDAwMCksIEJLUCgweDBhODAwMDAwKSwgQktQKDB4MGFjMDAwMDApCisJLndvcmQgQktQKDB4MGIwMDAwMDApLCBCS1AoMHgwYjQwMDAwMCksIEJLUCgweDBiODAwMDAwKSwgQktQKDB4MGJjMDAwMDApCisJLndvcmQgQktQKDB4MGMwMDAwMDApLCBCS1AoMHgwYzQwMDAwMCksIEJLUCgweDBjODAwMDAwKSwgQktQKDB4MGNjMDAwMDApCisJLndvcmQgQktQKDB4MGQwMDAwMDApLCBCS1AoMHgwZDQwMDAwMCksIEJLUCgweDBkODAwMDAwKSwgQktQKDB4MGRjMDAwMDApCisJLndvcmQgQktQKDB4MGUwMDAwMDApLCBCS1AoMHgwZTQwMDAwMCksIEJLUCgweDBlODAwMDAwKSwgQktQKDB4MGVjMDAwMDApCisJLndvcmQgQktQKDB4MGYwMDAwMDApLCBCS1AoMHgwZjQwMDAwMCksIEJLUCgweDBmODAwMDAwKSwgQktQKDB4MGZjMDAwMDApCisKKwkud29yZCBCS1AoMHgxMDAwMDAwMCksIEJLUCgweDEwNDAwMDAwKSwgQktQKDB4MTA4MDAwMDApLCBCS1AoMHgxMGMwMDAwMCkKKwkud29yZCBCS1AoMHgxMTAwMDAwMCksIEJLUCgweDExNDAwMDAwKSwgQktQKDB4MTE4MDAwMDApLCBCS1AoMHgxMWMwMDAwMCkKKwkud29yZCBCS1AoMHgxMjAwMDAwMCksIEJLUCgweDEyNDAwMDAwKSwgQktQKDB4MTI4MDAwMDApLCBCS1AoMHgxMmMwMDAwMCkKKwkud29yZCBCS1AoMHgxMzAwMDAwMCksIEJLUCgweDEzNDAwMDAwKSwgQktQKDB4MTM4MDAwMDApLCBCS1AoMHgxM2MwMDAwMCkKKwkud29yZCBCS1AoMHgxNDAwMDAwMCksIEJLUCgweDE0NDAwMDAwKSwgQktQKDB4MTQ4MDAwMDApLCBCS1AoMHgxNGMwMDAwMCkKKwkud29yZCBCS1AoMHgxNTAwMDAwMCksIEJLUCgweDE1NDAwMDAwKSwgQktQKDB4MTU4MDAwMDApLCBCS1AoMHgxNWMwMDAwMCkKKwkud29yZCBCS1AoMHgxNjAwMDAwMCksIEJLUCgweDE2NDAwMDAwKSwgQktQKDB4MTY4MDAwMDApLCBCS1AoMHgxNmMwMDAwMCkKKwkud29yZCBCS1AoMHgxNzAwMDAwMCksIEJLUCgweDE3NDAwMDAwKSwgQktQKDB4MTc4MDAwMDApLCBCS1AoMHgxN2MwMDAwMCkKKworCS53b3JkIEJLUCgweDE4MDAwMDAwKSwgQktQKDB4MTg0MDAwMDApLCBCS1AoMHgxODgwMDAwMCksIEJLUCgweDE4YzAwMDAwKQorCS53b3JkIEJLUCgweDE5MDAwMDAwKSwgQktQKDB4MTk0MDAwMDApLCBCS1AoMHgxOTgwMDAwMCksIEJLUCgweDE5YzAwMDAwKQorCS53b3JkIEJLUCgweDFhMDAwMDAwKSwgQktQKDB4MWE0MDAwMDApLCBCS1AoMHgxYTgwMDAwMCksIEJLUCgweDFhYzAwMDAwKQorCS53b3JkIEJLUCgweDFiMDAwMDAwKSwgQktQKDB4MWI0MDAwMDApLCBCS1AoMHgxYjgwMDAwMCksIEJLUCgweDFiYzAwMDAwKQorCS53b3JkIEJLUCgweDFjMDAwMDAwKSwgQktQKDB4MWM0MDAwMDApLCBCS1AoMHgxYzgwMDAwMCksIEJLUCgweDFjYzAwMDAwKQorCS53b3JkIEJLUCgweDFkMDAwMDAwKSwgQktQKDB4MWQ0MDAwMDApLCBCS1AoMHgxZDgwMDAwMCksIEJLUCgweDFkYzAwMDAwKQorCS53b3JkIEJLUCgweDFlMDAwMDAwKSwgQktQKDB4MWU0MDAwMDApLCBCS1AoMHgxZTgwMDAwMCksIEJLUCgweDFlYzAwMDAwKQorCS53b3JkIEJLUCgweDFmMDAwMDAwKSwgQktQKDB4MWY0MDAwMDApLCBCS1AoMHgxZjgwMDAwMCksIEJLUCgweDFmYzAwMDAwKQorCisJLndvcmQgQktQKDB4MjAwMDAwMDApLCBCS1AoMHgyMDQwMDAwMCksIEJLUCgweDIwODAwMDAwKSwgQktQKDB4MjBjMDAwMDApCisJLndvcmQgQktQKDB4MjEwMDAwMDApLCBCS1AoMHgyMTQwMDAwMCksIEJLUCgweDIxODAwMDAwKSwgQktQKDB4MjFjMDAwMDApCisJLndvcmQgQktQKDB4MjIwMDAwMDApLCBCS1AoMHgyMjQwMDAwMCksIEJLUCgweDIyODAwMDAwKSwgQktQKDB4MjJjMDAwMDApCisJLndvcmQgQktQKDB4MjMwMDAwMDApLCBCS1AoMHgyMzQwMDAwMCksIEJLUCgweDIzODAwMDAwKSwgQktQKDB4MjNjMDAwMDApCisJLndvcmQgQktQKDB4MjQwMDAwMDApLCBCS1AoMHgyNDQwMDAwMCksIEJLUCgweDI0ODAwMDAwKSwgQktQKDB4MjRjMDAwMDApCisJLndvcmQgQktQKDB4MjUwMDAwMDApLCBCS1AoMHgyNTQwMDAwMCksIEJLUCgweDI1ODAwMDAwKSwgQktQKDB4MjVjMDAwMDApCisJLndvcmQgQktQKDB4MjYwMDAwMDApLCBCS1AoMHgyNjQwMDAwMCksIEJLUCgweDI2ODAwMDAwKSwgQktQKDB4MjZjMDAwMDApCisJLndvcmQgQktQKDB4MjcwMDAwMDApLCBCS1AoMHgyNzQwMDAwMCksIEJLUCgweDI3ODAwMDAwKSwgQktQKDB4MjdjMDAwMDApCisKKwkud29yZCBCS1AoMHgyODAwMDAwMCksIEJLUCgweDI4NDAwMDAwKSwgQktQKDB4Mjg4MDAwMDApLCBCS1AoMHgyOGMwMDAwMCkKKwkud29yZCBCS1AoMHgyOTAwMDAwMCksIEJLUCgweDI5NDAwMDAwKSwgQktQKDB4Mjk4MDAwMDApLCBCS1AoMHgyOWMwMDAwMCkKKwkud29yZCBCS1AoMHgyYTAwMDAwMCksIEJLUCgweDJhNDAwMDAwKSwgQktQKDB4MmE4MDAwMDApLCBCS1AoMHgyYWMwMDAwMCkKKwkud29yZCBCS1AoMHgyYjAwMDAwMCksIEJLUCgweDJiNDAwMDAwKSwgQktQKDB4MmI4MDAwMDApLCBCS1AoMHgyYmMwMDAwMCkKKwkud29yZCBCS1AoMHgyYzAwMDAwMCksIEJLUCgweDJjNDAwMDAwKSwgQktQKDB4MmM4MDAwMDApLCBCS1AoMHgyY2MwMDAwMCkKKwkud29yZCBCS1AoMHgyZDAwMDAwMCksIEJLUCgweDJkNDAwMDAwKSwgQktQKDB4MmQ4MDAwMDApLCBCS1AoMHgyZGMwMDAwMCkKKwkud29yZCBCS1AoMHgyZTAwMDAwMCksIEJLUCgweDJlNDAwMDAwKSwgQktQKDB4MmU4MDAwMDApLCBCS1AoMHgyZWMwMDAwMCkKKwkud29yZCBCS1AoMHgyZjAwMDAwMCksIEJLUCgweDJmNDAwMDAwKSwgQktQKDB4MmY4MDAwMDApLCBCS1AoMHgyZmMwMDAwMCkKKworCS53b3JkIEJLUCgweDMwMDAwMDAwKSwgQktQKDB4MzA0MDAwMDApLCBCS1AoMHgzMDgwMDAwMCksIEJLUCgweDMwYzAwMDAwKQorCS53b3JkIEJLUCgweDMxMDAwMDAwKSwgQktQKDB4MzE0MDAwMDApLCBCS1AoMHgzMTgwMDAwMCksIEJLUCgweDMxYzAwMDAwKQorCS53b3JkIEJLUCgweDMyMDAwMDAwKSwgQktQKDB4MzI0MDAwMDApLCBCS1AoMHgzMjgwMDAwMCksIEJLUCgweDMyYzAwMDAwKQorCS53b3JkIEJLUCgweDMzMDAwMDAwKSwgQktQKDB4MzM0MDAwMDApLCBCS1AoMHgzMzgwMDAwMCksIEJLUCgweDMzYzAwMDAwKQorCS53b3JkIEJLUCgweDM0MDAwMDAwKSwgQktQKDB4MzQ0MDAwMDApLCBCS1AoMHgzNDgwMDAwMCksIEJLUCgweDM0YzAwMDAwKQorCS53b3JkIEJLUCgweDM1MDAwMDAwKSwgQktQKDB4MzU0MDAwMDApLCBCS1AoMHgzNTgwMDAwMCksIEJLUCgweDM1YzAwMDAwKQorCS53b3JkIEJLUCgweDM2MDAwMDAwKSwgQktQKDB4MzY0MDAwMDApLCBCS1AoMHgzNjgwMDAwMCksIEJLUCgweDM2YzAwMDAwKQorCS53b3JkIEJLUCgweDM3MDAwMDAwKSwgQktQKDB4Mzc0MDAwMDApLCBCS1AoMHgzNzgwMDAwMCksIEJLUCgweDM3YzAwMDAwKQorCisJLndvcmQgQktQKDB4MzgwMDAwMDApLCBCS1AoMHgzODQwMDAwMCksIEJLUCgweDM4ODAwMDAwKSwgQktQKDB4MzhjMDAwMDApCisJLndvcmQgQktQKDB4MzkwMDAwMDApLCBCS1AoMHgzOTQwMDAwMCksIEJLUCgweDM5ODAwMDAwKSwgQktQKDB4MzljMDAwMDApCisJLndvcmQgQktQKDB4M2EwMDAwMDApLCBCS1AoMHgzYTQwMDAwMCksIEJLUCgweDNhODAwMDAwKSwgQktQKDB4M2FjMDAwMDApCisJLndvcmQgQktQKDB4M2IwMDAwMDApLCBCS1AoMHgzYjQwMDAwMCksIEJLUCgweDNiODAwMDAwKSwgQktQKDB4M2JjMDAwMDApCisJLndvcmQgQktQKDB4M2MwMDAwMDApLCBCS1AoMHgzYzQwMDAwMCksIEJLUCgweDNjODAwMDAwKSwgQktQKDB4M2NjMDAwMDApCisJLndvcmQgQktQKDB4M2QwMDAwMDApLCBCS1AoMHgzZDQwMDAwMCksIEJLUCgweDNkODAwMDAwKSwgQktQKDB4M2RjMDAwMDApCitfS19pb19tYXA6CisJLndvcmQgWCxYLFgsWCAvKiAweDNlMDAwMDAwIC0gZGV2aWNlIElPIGVhcmx5IHJlbWFwICovCisJLndvcmQgWCxYLFgsWCAvKiAweDNmMDAwMDAwIC0gaHlwZXJ2aXNvciBzcGFjZSovCisKKyNpZiAwCisvKgorICogVGhpcyBpcyBpbiBoZXJlIGFzIGFuIGV4YW1wbGUgZm9yIGRldmljZXMgd2hpY2ggbmVlZCB0byBiZSBtYXBwZWQgcmVhbGx5CisgKiBlYXJseS4KKyAqLworCS5wMmFsaWduIDEyCisJLmdsb2JsIF9LX2lvX2ttYXAKKwkuZ2xvYmwgX0tfaW5pdF9kZXZpY2V0YWJsZQorX0tfaW5pdF9kZXZpY2V0YWJsZTogIC8qICBTaG91bGQgYmUgNE1CIHdvcnRoIG9mIGVudHJpZXMgICovCisJLndvcmQgRk9VUktfSU8oTVNNX0dQSU8xX1BIWVMpLEZPVVJLX0lPKE1TTV9HUElPMl9QSFlTKSxGT1VSS19JTyhNU01fU0lSQ19QSFlTKSxYCisJLndvcmQgRk9VUktfSU8oVExNTV9HUElPMV9QSFlTKSxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1fb3BzLlMgYi9hcmNoL2hleGFnb24va2VybmVsL3ZtX29wcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDdmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3ZtX29wcy5TCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogSGV4YWdvbiBWTSBpbnN0cnVjdGlvbiBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorCisvKgorICogQyB3cmFwcGVycyBmb3IgdmlydHVhbCBtYWNoaW5lICJpbnN0cnVjdGlvbnMiLiAgVGhlc2UKKyAqIGNvdWxkIGJlLCBhbmQgcGVyaGFwcyBzb21lIGRheSB3aWxsIGJlLCBoYW5kbGVkIGFzIGluLWxpbmUKKyAqIG1hY3JvcywgYnV0IGZvciB0cmFjaW5nL2RlYnVnZ2luZyBpdCdzIGhhbmR5IHRvIGhhdmUKKyAqIGEgc2luZ2xlIHBvaW50IG9mIGludm9jYXRpb24gZm9yIGVhY2ggb2YgdGhlbS4KKyAqIENvbnZlbmllbnRseSwgdGhleSB0YWtlIHBhcmFtdGVycyBhbmQgcmV0dXJuIHZhbHVlcworICogY29uc2lzdGVudCB3aXRoIHRoZSBBQkkgY2FsbGluZyBjb252ZW50aW9uLgorICovCisKK0VOVFJZKF9fdm1ydGUpCisJdHJhcDEoI0hWTV9UUkFQMV9WTVJURSk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3Ztc2V0dmVjKQorCXRyYXAxKCNIVk1fVFJBUDFfVk1TRVRWRUMpOworCWp1bXByCVIzMTsKKworRU5UUlkoX192bXNldGllKQorCXRyYXAxKCNIVk1fVFJBUDFfVk1TRVRJRSk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3ZtZ2V0aWUpCisJdHJhcDEoI0hWTV9UUkFQMV9WTUdFVElFKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm1pbnRvcCkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNSU5UT1ApOworCWp1bXByCVIzMTsKKworRU5UUlkoX192bWNscm1hcCkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNQ0xSTUFQKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm1uZXdtYXApCisJcjEgPSAjVk1fTkVXTUFQX1RZUEVfUEdUQUJMRVM7CisJdHJhcDEoI0hWTV9UUkFQMV9WTU5FV01BUCk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3ZtY2FjaGUpCisJdHJhcDEoI0hWTV9UUkFQMV9WTUNBQ0hFKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm1nZXR0aW1lKQorCXRyYXAxKCNIVk1fVFJBUDFfVk1HRVRUSU1FKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm1zZXR0aW1lKQorCXRyYXAxKCNIVk1fVFJBUDFfVk1TRVRUSU1FKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm13YWl0KQorCXRyYXAxKCNIVk1fVFJBUDFfVk1XQUlUKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm15aWVsZCkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNWUlFTEQpOworCWp1bXByCVIzMTsKKworRU5UUlkoX192bXN0YXJ0KQorCXRyYXAxKCNIVk1fVFJBUDFfVk1TVEFSVCk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3Ztc3RvcCkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNU1RPUCk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3ZtdnBpZCkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNVlBJRCk7CisJanVtcHIJUjMxOworCisvKiAgUHJvYmFibHkgbm90IGFjdHVhbGx5IGdvaW5nIHRvIHVzZSB0aGVzZTsgc2VlIHZtX2VudHJ5LlMgICovCisKK0VOVFJZKF9fdm1zZXRyZWdzKQorCXRyYXAxKCNIVk1fVFJBUDFfVk1TRVRSRUdTKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm1nZXRyZWdzKQorCXRyYXAxKCNIVk1fVFJBUDFfVk1HRVRSRUdTKTsKKwlqdW1wcglSMzE7CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3ZtX3N3aXRjaC5TIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9zd2l0Y2guUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGVjZjJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9zd2l0Y2guUwpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29udGV4dCBzd2l0Y2ggc3VwcG9ydCBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKworLnRleHQKKworLyoKKyAqIFRoZSByZWdpc3RlciB1c2VkIGFzIGEgZmFzdC1wYXRoIHRocmVhZCBpbmZvcm1hdGlvbiBwb2ludGVyCisgKiBpcyBkZXRlcm1pbmVkIGFzIGEga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiAgSWYgaXQgaGFwcGVucworICogdG8gYmUgYSBjYWxsZWUtc2F2ZSByZWdpc3Rlciwgd2UncmUgZ29pbmcgdG8gYmUgc2F2aW5nIGFuZAorICogcmVzdG9yaW5nIGl0IHR3aWNlIGhlcmUuCisgKgorICogVGhpcyBjb2RlIGFudGljaXBhdGVzIGEgcmV2aXNlZCBBQkkgd2hlcmUgUjIwLTIzIGFyZSBhZGRlZAorICogdG8gdGhlIHNldCBvZiBjYWxsZWUtc2F2ZSByZWdpc3RlcnMsIGJ1dCB0aGlzIHNob3VsZCBiZQorICogYmFja3dhcmQgY29tcGF0aWJsZSB0byBsZWdhY3kgdG9vbHMuCisgKi8KKworCisvKgorICoJdm9pZCBzd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAorICoJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCwgc3RydWN0IHRhc2tfc3RydWN0ICpsYXN0KTsKKyAqLworCS5wMmFsaWduIDIKKwkuZ2xvYmwgX19zd2l0Y2hfdG8KKwkudHlwZQlfX3N3aXRjaF90bywgQGZ1bmN0aW9uCisKKy8qCisgKiBXaGVuIHdlIGV4aXQgdGhlIHdvcm1ob2xlLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBwcmV2aW91cyB0YXNrCisgKiBpbiB0aGUgbmV3IFIwJ3MgcG9pbnRlci4gIFRlY2huaWNhbGx5IGl0IHNob3VsZCBiZSBSMiwgYnV0IHRoZXkgc2hvdWxkCisgKiBiZSB0aGUgc2FtZTsgc2VlbXMgbGlrZSBhIGxlZ2FjeSB0aGluZy4gIEluIHNob3J0LCBkb24ndCBidXRjaGVyCisgKiBSMCwgbGV0IGl0IGdvIGJhY2sgb3V0IHVubW9sZXN0ZWQuCisgKi8KKworX19zd2l0Y2hfdG86CisJLyoKKwkgKiBQdXNoIGNhbGxlZS1zYXZlcyBvbnRvICJwcmV2IiBzdGFjay4KKwkgKiBIZXJlLCB3ZSdyZSBzbmVha3kgYmVjYXVzZSB0aGUgTFIgYW5kIEZQCisJICogc3RvcmFnZSBvZiB0aGUgdGhyZWFkX3N0YWNrIHN0cnVjdHVyZQorCSAqIGlzIGF1dG9tYWdpY2FsbHkgYWxsb2NhdGVkIGJ5IGFsbG9jZnJhbWUsCisJICogc28gd2UgcGFzcyBzdHJ1Y3Qgc2l6ZSBsZXNzIDguCisJICovCisJYWxsb2NmcmFtZSgjKF9TV0lUQ0hfU1RBQ0tfU0laRSAtIDgpKTsKKwltZW1kKFIyOSsjKF9TV0lUQ0hfUjI3MjYpKT1SMjc6MjY7CisJbWVtZChSMjkrIyhfU1dJVENIX1IyNTI0KSk9UjI1OjI0OworCW1lbWQoUjI5KyMoX1NXSVRDSF9SMjMyMikpPVIyMzoyMjsKKwltZW1kKFIyOSsjKF9TV0lUQ0hfUjIxMjApKT1SMjE6MjA7CisJbWVtZChSMjkrIyhfU1dJVENIX1IxOTE4KSk9UjE5OjE4OworCW1lbWQoUjI5KyMoX1NXSVRDSF9SMTcxNikpPVIxNzoxNjsKKwkvKiBTdGFzaCB0aHJlYWRfaW5mbyBwb2ludGVyIGluIHRhc2tfc3RydWN0ICovCisJbWVtdyhSMCsjX1RBU0tfVEhSRUFEX0lORk8pID0gVEhSRUFESU5GT19SRUc7CisJbWVtdyhSMCArIyhfVEFTS19TVFJVQ1RfVEhSRUFEICsgX1RIUkVBRF9TVFJVQ1RfU1dJVENIX1NQKSkgPSBSMjk7CisJLyogU3dpdGNoIHRvICJuZXh0IiBzdGFjayBhbmQgcmVzdG9yZSBjYWxsZWUgc2F2ZXMgZnJvbSB0aGVyZSAqLworCVIyOSA9IG1lbXcoUjEgKyAjKF9UQVNLX1NUUlVDVF9USFJFQUQgKyBfVEhSRUFEX1NUUlVDVF9TV0lUQ0hfU1ApKTsKKwl7CisJICAgIFIyNzoyNiA9IG1lbWQoUjI5KyMoX1NXSVRDSF9SMjcyNikpOworCSAgICBSMjU6MjQgPSBtZW1kKFIyOSsjKF9TV0lUQ0hfUjI1MjQpKTsKKwl9CisJeworCSAgICBSMjM6MjIgPSBtZW1kKFIyOSsjKF9TV0lUQ0hfUjIzMjIpKTsKKwkgICAgUjIxOjIwID0gbWVtZChSMjkrIyhfU1dJVENIX1IyMTIwKSk7CisJfQorCXsKKwkgICAgUjE5OjE4ID0gbWVtZChSMjkrIyhfU1dJVENIX1IxOTE4KSk7CisJICAgIFIxNzoxNiA9IG1lbWQoUjI5KyMoX1NXSVRDSF9SMTcxNikpOworCX0KKwl7CisJICAgIC8qIFRIUkVBRElORk9fUkVHIGlzIGN1cnJlbnRseSBvbmUgb2YgdGhlIGNhbGxlZS1zYXZlZCByZWdzCisJICAgICAqIGFib3ZlLCBhbmQgc28gYmUgc3VyZSB0byByZS1sb2FkIGl0IGxhc3QuCisJICAgICAqLworCSAgICBUSFJFQURJTkZPX1JFRyA9IG1lbXcoUjEgKyAjX1RBU0tfVEhSRUFEX0lORk8pOworCSAgICBSMzE6MzAgPSBtZW1kKFIyOSsjX1NXSVRDSF9GUCk7CisJfQorCXsKKwkgICAgUjI5ID0gYWRkKFIyOSwjX1NXSVRDSF9TVEFDS19TSVpFKTsKKwkgICAganVtcHIgUjMxOworCX0KKwkuc2l6ZQlfX3N3aXRjaF90bywgLi1fX3N3aXRjaF90bwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV92ZWN0b3JzLlMgYi9hcmNoL2hleGFnb24va2VybmVsL3ZtX3ZlY3RvcnMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2E0YjUwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV92ZWN0b3JzLlMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIEV2ZW50IGp1bXAgdGFibGVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9oZXhhZ29uX3ZtLmg+CisKKy50ZXh0CisKKy8qICBUaGlzIGlzIHJlZ2lzdGVyZWQgZWFybHkgb24gdG8gYWxsb3cgYW5nZWwgICovCisuZ2xvYmFsIF9LX3Byb3Zpc2lvbmFsX3ZlYworX0tfcHJvdmlzaW9uYWxfdmVjOgorCWp1bXAgMWY7CisJanVtcCAxZjsKKwlqdW1wIDFmOworCWp1bXAgMWY7CisJanVtcCAxZjsKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNUlRFKQorCWp1bXAgMWY7CisJanVtcCAxZjsKKworCisuZ2xvYmFsIF9LX1ZNX2V2ZW50X3ZlY3RvcgorX0tfVk1fZXZlbnRfdmVjdG9yOgorMToKKwlqdW1wIDFiOyAgLyogIFJlc2V0ICAqLworCWp1bXAgX0tfZW50ZXJfbWFjaGNoZWNrOworCWp1bXAgX0tfZW50ZXJfZ2VuZXg7CisJanVtcCAxYjsgIC8qICAzIFJzdmQgICovCisJanVtcCAxYjsgIC8qICA0IFJzdmQgICovCisJanVtcCBfS19lbnRlcl90cmFwMDsKKwlqdW1wIDFiOyAgLyogIDYgUnN2ZCAgKi8KKwlqdW1wIF9LX2VudGVyX2ludGVycnVwdDsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1saW51eC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFkM2MzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciBIZXhhZ29uIGtlcm5lbAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNkZWZpbmUgTE9BRF9PRkZTRVQgUEFHRV9PRkZTRVQKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CS8qICBNb3N0IG9mIHRoZSBrZXJuZWwgZGVmaW5lcyBhcmUgaGVyZSAgKi8KKyNpbmNsdWRlIDxhc20vbWVtLWxheW91dC5oPgkvKiAgZXhjZXB0IGZvciBwYWdlX29mZnNldCAgKi8KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4JCS8qICBhbmQgbm93IHdlJ3JlIHB1bGxpbmcgY2FjaGUgbGluZSBzaXplICAqLworT1VUUFVUX0FSQ0goaGV4YWdvbikKK0VOVFJZKHN0ZXh0KQorCitqaWZmaWVzID0gamlmZmllc182NDsKKworLyoKK1NlZSBhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oIGZvciBleHBhbnNpb24gb2Ygc29tZSBvZiB0aGVzZSBtYWNyb3MuCitTZWUgYXNtLWdlbmVyaWMvc2VjdGlvbnMuaCBmb3Igc2VlbWluZ2x5IHJlcXVpcmVkIGxhYmVscy4KKyovCisKKyNkZWZpbmUgUEFHRV9TSVpFIF9QQUdFX1NJWkUKKworLyogIFRoaXMgTE9BRF9PRkZTRVQgaXMgdGVtcG9yYXJ5IGZvciBkZWJ1Z2dpbmcgb24gdGhlIHNpbXVsYXRvcjsgaXQgbWF5IGNoYW5nZQorICAgIGZvciBoeXBlcnZpc29yIHBzZXVkby1waHlzaWNhbCBtZW1vcnkuICAqLworCisKK1NFQ1RJT05TCit7CisJLiA9IFBBR0VfT0ZGU0VUICsgTE9BRF9BRERSRVNTOworCisJX19pbml0X2JlZ2luID0gLjsKKwlIRUFEX1RFWFRfU0VDVElPTgorCUlOSVRfVEVYVF9TRUNUSU9OKFBBR0VfU0laRSkKKwlQRVJDUFVfU0VDVElPTihMMV9DQUNIRV9CWVRFUykKKwlfX2luaXRfZW5kID0gLjsKKworICAgICAgICAuID0gQUxJR04oX1BBR0VfU0laRSk7CisJX3N0ZXh0ID0gLjsKKwkudGV4dCA6IEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX3RleHQgPSAuOworCQlURVhUX1RFWFQKKwkJU0NIRURfVEVYVAorCQlMT0NLX1RFWFQKKwkJS1BST0JFU19URVhUCisJCSooLmZpeHVwKQorCX0KKwlfZXRleHQgPSAuOworCisJSU5JVF9EQVRBX1NFQ1RJT04oUEFHRV9TSVpFKQorCisJX3NkYXRhID0gLjsKKwkJUldfREFUQV9TRUNUSU9OKDMyLFBBR0VfU0laRSxQQUdFX1NJWkUpCisJCVJPX0RBVEFfU0VDVElPTihQQUdFX1NJWkUpCisJX2VkYXRhID0gLjsKKworCUVYQ0VQVElPTl9UQUJMRSgxNikKKwlOT1RFUworCisJQlNTX1NFQ1RJT04oX1BBR0VfU0laRSwgX1BBR0VfU0laRSwgX1BBR0VfU0laRSkKKworCV9lbmQgPSAuOworCisJL0RJU0NBUkQvIDogeworCQlFWElUX1RFWFQKKwkJRVhJVF9EQVRBCisJCUVYSVRfQ0FMTAorCX0KKworCVNUQUJTX0RFQlVHCisJRFdBUkZfREVCVUcKKworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2xpYi9NYWtlZmlsZSBiL2FyY2gvaGV4YWdvbi9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0NjU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9saWIvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACisjCisjIE1ha2VmaWxlIGZvciBoZXhhZ29uLXNwZWNpZmljIGxpYnJhcnkgZmlsZXMuCisjCitvYmoteSA9IGNoZWNrc3VtLm8gaW8ubyBtZW1jcHkubyBtZW1zZXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2xpYi9jaGVja3N1bS5jIGIvYXJjaC9oZXhhZ29uL2xpYi9jaGVja3N1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDA1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbGliL2NoZWNrc3VtLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDaGVja3N1bSBmdW5jdGlvbnMgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiAgVGhpcyB3YXMgZGVyaXZlZCBmcm9tIGFyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMgICovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW50cmluc2ljcy5oPgorCisKKy8qICBWZWN0b3IgdmFsdWUgb3BlcmF0aW9ucyAgKi8KKyNkZWZpbmUgU0lHTih4LCB5KQkoKDB4ODAwMFVMTCp4KTw8eSkKKyNkZWZpbmUgQ0FSUlkoeCwgeSkJKCgweDAwMDJVTEwqeCk8PHkpCisjZGVmaW5lIFNFTEVDVCh4LCB5KQkoKDB4MDAwMVVMTCp4KTw8eSkKKworI2RlZmluZSBWUl9ORUdBVEUoYSwgYiwgYywgZCkJKFNJR04oYSwgNDgpICsgU0lHTihiLCAzMikgKyBTSUdOKGMsIDE2KSBcCisJKyBTSUdOKGQsIDApKQorI2RlZmluZSBWUl9DQVJSWShhLCBiLCBjLCBkKQkoQ0FSUlkoYSwgNDgpICsgQ0FSUlkoYiwgMzIpICsgQ0FSUlkoYywgMTYpIFwKKwkrIENBUlJZKGQsIDApKQorI2RlZmluZSBWUl9TRUxFQ1QoYSwgYiwgYywgZCkJKFNFTEVDVChhLCA0OCkgKyBTRUxFQ1QoYiwgMzIpICsgU0VMRUNUKGMsIDE2KSBcCisJKyBTRUxFQ1QoZCwgMCkpCisKKworLyogb3B0aW1pemVkIEhFWEFHT04gVjMgaW50cmluc2ljIHZlcnNpb24gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZnJvbTY0dG8xNih1NjQgeCkKK3sKKwl1NjQgc3VtOworCisJc3VtID0gSEVYQUdPTl9QX3ZybXB5aF9QUCh4XlZSX05FR0FURSgxLCAxLCAxLCAxKSwKKwkJCSAgICAgVlJfU0VMRUNUKDEsIDEsIDEsIDEpKTsKKwlzdW0gKz0gVlJfQ0FSUlkoMCwgMCwgMSwgMCk7CisJc3VtID0gSEVYQUdPTl9QX3ZybXB5aF9QUChzdW0sIFZSX1NFTEVDVCgwLCAwLCAxLCAxKSk7CisKKwlyZXR1cm4gMHhGRkZGICYgc3VtOworfQorCisvKgorICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKKyAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkLgorICovCitfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsCisJCQkgIHVuc2lnbmVkIHNob3J0IGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkgIF9fd3N1bSBzdW0pCit7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmZyb202NHRvMTYoCisJCShfX2ZvcmNlIHU2NClzYWRkciArIChfX2ZvcmNlIHU2NClkYWRkciArCisJCShfX2ZvcmNlIHU2NClzdW0gKyAoKGxlbiArIHByb3RvKSA8PCA4KSk7Cit9CisKK19fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwKKwkJCSAgdW5zaWduZWQgc2hvcnQgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCSAgX193c3VtIHN1bSkKK3sKKwl1NjQgcmVzdWx0OworCisJcmVzdWx0ID0gKF9fZm9yY2UgdTY0KXNhZGRyICsgKF9fZm9yY2UgdTY0KWRhZGRyICsKKwkJIChfX2ZvcmNlIHU2NClzdW0gKyAoKGxlbiArIHByb3RvKSA8PCA4KTsKKworCS8qIEZvbGQgZG93biB0byAzMi1iaXRzIHNvIHdlIGRvbid0IGxvc2UgaW4gdGhlIHR5cGVkZWYtbGVzcworCSAgIG5ldHdvcmsgc3RhY2suICAqLworCS8qIDY0IHRvIDMzICovCisJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmZVTCkgKyAocmVzdWx0ID4+IDMyKTsKKwkvKiAzMyB0byAzMiAqLworCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmZmZmZmVUwpICsgKHJlc3VsdCA+PiAzMik7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX25vZm9sZCk7CisKKy8qCisgKiBEbyBhIDY0LWJpdCBjaGVja3N1bSBvbiBhbiBhcmJpdHJhcnkgbWVtb3J5IGFyZWEuLgorICoKKyAqIFRoaXMgaXNuJ3QgYSBncmVhdCByb3V0aW5lLCBidXQgaXQncyBub3QgX2hvcnJpYmxlXyBlaXRoZXIuIFRoZQorICogaW5uZXIgbG9vcCBjb3VsZCBiZSB1bnJvbGxlZCBhIGJpdCBmdXJ0aGVyLCBhbmQgdGhlcmUgYXJlIGJldHRlcgorICogd2F5cyB0byBkbyB0aGUgY2FycnksIGJ1dCB0aGlzIGlzIHJlYXNvbmFibGUuCisgKi8KKworLyogb3B0aW1pemVkIEhFWEFHT04gaW50cmluc2ljIHZlcnNpb24sIHdpdGggb3ZlciByZWFkIGZpeGVkICovCit1bnNpZ25lZCBpbnQgZG9fY3N1bShjb25zdCB2b2lkICp2b2lkcHRyLCBpbnQgbGVuKQoreworCXU2NCBzdW0wLCBzdW0xLCB4MCwgeDEsICpwdHI4X28sICpwdHI4X2UsICpwdHI4OworCWludCBpLCBzdGFydCwgbWlkLCBlbmQsIG1hc2s7CisJY29uc3QgY2hhciAqcHRyID0gdm9pZHB0cjsKKwl1bnNpZ25lZCBzaG9ydCAqcHRyMjsKKwl1bnNpZ25lZCBpbnQgKnB0cjQ7CisKKwlpZiAobGVuIDw9IDApCisJCXJldHVybiAwOworCisJc3RhcnQgPSAweEYgJiAoMTYtKCgoaW50KSBwdHIpICYgMHhGKSkgOworCW1hc2sgID0gMHg3ZmZmZmZmZlVMID4+IEhFWEFHT05fUl9jbDBfUihsZW4pOworCXN0YXJ0ID0gc3RhcnQgJiBtYXNrIDsKKworCW1pZCA9IGxlbiAtIHN0YXJ0OworCWVuZCA9IG1pZCAmIDB4RjsKKwltaWQgPSBtaWQ+PjQ7CisJc3VtMCA9IG1pZCA8PCAxODsKKwlzdW0xID0gMDsKKworCWlmIChzdGFydCAmIDEpCisJCXN1bTAgKz0gKHU2NCkgKHB0clswXSA8PCA4KTsKKwlwdHIyID0gKHVuc2lnbmVkIHNob3J0ICopICZwdHJbc3RhcnQgJiAxXTsKKwlpZiAoc3RhcnQgJiAyKQorCQlzdW0xICs9ICh1NjQpIHB0cjJbMF07CisJcHRyNCA9ICh1bnNpZ25lZCBpbnQgKikgJnB0cltzdGFydCAmIDNdOworCWlmIChzdGFydCAmIDQpIHsKKwkJc3VtMCA9IEhFWEFHT05fUF92cm1weWhhY2NfUFAoc3VtMCwKKwkJCVZSX05FR0FURSgwLCAwLCAxLCAxKV4oKHU2NClwdHI0WzBdKSwKKwkJCVZSX1NFTEVDVCgwLCAwLCAxLCAxKSk7CisJCXN1bTAgKz0gVlJfU0VMRUNUKDAsIDAsIDEsIDApOworCX0KKwlwdHI4ID0gKHU2NCAqKSAmcHRyW3N0YXJ0ICYgN107CisJaWYgKHN0YXJ0ICYgOCkgeworCQlzdW0xID0gSEVYQUdPTl9QX3ZybXB5aGFjY19QUChzdW0xLAorCQkJVlJfTkVHQVRFKDEsIDEsIDEsIDEpXihwdHI4WzBdKSwKKwkJCVZSX1NFTEVDVCgxLCAxLCAxLCAxKSk7CisJCXN1bTEgKz0gVlJfQ0FSUlkoMCwgMCwgMSwgMCk7CisJfQorCXB0cjhfbyA9ICh1NjQgKikgKHB0ciArIHN0YXJ0KTsKKwlwdHI4X2UgPSAodTY0ICopIChwdHIgKyBzdGFydCArIDgpOworCisJaWYgKG1pZCkgeworCQl4MCA9ICpwdHI4X2U7IHB0cjhfZSArPSAyOworCQl4MSA9ICpwdHI4X287IHB0cjhfbyArPSAyOworCQlpZiAobWlkID4gMSkKKwkJCWZvciAoaSA9IDA7IGkgPCBtaWQtMTsgaSsrKSB7CisJCQkJc3VtMCA9IEhFWEFHT05fUF92cm1weWhhY2NfUFAoc3VtMCwKKwkJCQkJeDBeVlJfTkVHQVRFKDEsIDEsIDEsIDEpLAorCQkJCQlWUl9TRUxFQ1QoMSwgMSwgMSwgMSkpOworCQkJCXN1bTEgPSBIRVhBR09OX1BfdnJtcHloYWNjX1BQKHN1bTEsCisJCQkJCXgxXlZSX05FR0FURSgxLCAxLCAxLCAxKSwKKwkJCQkJVlJfU0VMRUNUKDEsIDEsIDEsIDEpKTsKKwkJCQl4MCA9ICpwdHI4X2U7IHB0cjhfZSArPSAyOworCQkJCXgxID0gKnB0cjhfbzsgcHRyOF9vICs9IDI7CisJCQl9CisJCXN1bTAgPSBIRVhBR09OX1BfdnJtcHloYWNjX1BQKHN1bTAsIHgwXlZSX05FR0FURSgxLCAxLCAxLCAxKSwKKwkJCVZSX1NFTEVDVCgxLCAxLCAxLCAxKSk7CisJCXN1bTEgPSBIRVhBR09OX1BfdnJtcHloYWNjX1BQKHN1bTEsIHgxXlZSX05FR0FURSgxLCAxLCAxLCAxKSwKKwkJCVZSX1NFTEVDVCgxLCAxLCAxLCAxKSk7CisJfQorCisJcHRyNCA9ICh1bnNpZ25lZCBpbnQgKikgJnB0cltzdGFydCArIChtaWQgKiAxNikgKyAoZW5kICYgOCldOworCWlmIChlbmQgJiA0KSB7CisJCXN1bTEgPSBIRVhBR09OX1BfdnJtcHloYWNjX1BQKHN1bTEsCisJCQlWUl9ORUdBVEUoMCwgMCwgMSwgMSleKCh1NjQpcHRyNFswXSksCisJCQlWUl9TRUxFQ1QoMCwgMCwgMSwgMSkpOworCQlzdW0xICs9IFZSX1NFTEVDVCgwLCAwLCAxLCAwKTsKKwl9CisJcHRyMiA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcHRyW3N0YXJ0ICsgKG1pZCAqIDE2KSArIChlbmQgJiAxMildOworCWlmIChlbmQgJiAyKQorCQlzdW0wICs9ICh1NjQpIHB0cjJbMF07CisKKwlpZiAoZW5kICYgMSkKKwkJc3VtMSArPSAodTY0KSBwdHJbc3RhcnQgKyAobWlkICogMTYpICsgKGVuZCAmIDE0KV07CisKKwlwdHI4ID0gKHU2NCAqKSAmcHRyW3N0YXJ0ICsgKG1pZCAqIDE2KV07CisJaWYgKGVuZCAmIDgpIHsKKwkJc3VtMCA9IEhFWEFHT05fUF92cm1weWhhY2NfUFAoc3VtMCwKKwkJCVZSX05FR0FURSgxLCAxLCAxLCAxKV4ocHRyOFswXSksCisJCQlWUl9TRUxFQ1QoMSwgMSwgMSwgMSkpOworCQlzdW0wICs9IFZSX0NBUlJZKDAsIDAsIDEsIDApOworCX0KKwlzdW0wID0gSEVYQUdPTl9QX3ZybXB5aF9QUCgoc3VtMCtzdW0xKV5WUl9ORUdBVEUoMCwgMCwgMCwgMSksCisJCVZSX1NFTEVDVCgwLCAwLCAxLCAxKSk7CisJc3VtMCArPSBWUl9ORUdBVEUoMCwgMCwgMCwgMSk7CisJc3VtMCA9IEhFWEFHT05fUF92cm1weWhfUFAoc3VtMCwgVlJfU0VMRUNUKDAsIDAsIDEsIDEpKTsKKworCWlmIChzdGFydCAmIDEpCisJCXN1bTAgPSAoc3VtMCA8PCA4KSB8ICgweEZGICYgKHN1bTAgPj4gOCkpOworCisJcmV0dXJuIDB4RkZGRiAmIHN1bTA7Cit9CisKKy8qCisgKiBjb3B5IGZyb20gZHMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKKyAqLworX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQoreworCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2xpYi9pby5jIGIvYXJjaC9oZXhhZ29uL2xpYi9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTQ3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbGliL2lvLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIEkvTyBhY2Nlc3MgZnVuY3Rpb25zIGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiAgVGhlc2UgYXJlIGFsbCBGSUZPIHJvdXRpbmVzISAgKi8KKworLyoKKyAqIF9fcmF3X3JlYWRzdyAtIHJlYWQgd29yZHMgYSBzaG9ydCBhdCBhIHRpbWUKKyAqIEBhZGRyOiAgc291cmNlIGFkZHJlc3MKKyAqIEBkYXRhOiAgZGF0YSBhZGRyZXNzCisgKiBAbGVuOiBudW1iZXIgb2Ygc2hvcnRzIHRvIHJlYWQKKyAqLwordm9pZCBfX3Jhd19yZWFkc3coY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCWNvbnN0IHZvbGF0aWxlIHNob3J0IGludCAqc3JjID0gKHNob3J0IGludCAqKSBhZGRyOworCXNob3J0IGludCAqZHN0ID0gKHNob3J0IGludCAqKSBkYXRhOworCisJaWYgKCh1MzIpZGF0YSAmIDB4MSkKKwkJcGFuaWMoInVuYWxpZ25lZCBwb2ludGVyIHRvIHJlYWRzdyIpOworCisJd2hpbGUgKGxlbi0tID4gMCkKKwkJKmRzdCsrID0gKnNyYzsKKworfQorCisvKgorICogX19yYXdfd3JpdGVzdyAtIHJlYWQgd29yZHMgYSBzaG9ydCBhdCBhIHRpbWUKKyAqIEBhZGRyOiAgc291cmNlIGFkZHJlc3MKKyAqIEBkYXRhOiAgZGF0YSBhZGRyZXNzCisgKiBAbGVuOiBudW1iZXIgb2Ygc2hvcnRzIHRvIHJlYWQKKyAqLwordm9pZCBfX3Jhd193cml0ZXN3KHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwljb25zdCBzaG9ydCBpbnQgKnNyYyA9IChzaG9ydCBpbnQgKilkYXRhOworCXZvbGF0aWxlIHNob3J0IGludCAqZHN0ID0gKHNob3J0IGludCAqKWFkZHI7CisKKwlpZiAoKHUzMilkYXRhICYgMHgxKQorCQlwYW5pYygidW5hbGlnbmVkIHBvaW50ZXIgdG8gd3JpdGVzdyIpOworCisJd2hpbGUgKGxlbi0tID4gMCkKKwkJKmRzdCA9ICpzcmMrKzsKKworCit9CisKKy8qICBQcmV0dHkgc3VyZSBsZW4gaXMgcHJlLWFkanVzdGVkIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBhY2Nlc3MgYWxyZWFkeSAqLwordm9pZCBfX3Jhd19yZWFkc2woY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCWNvbnN0IHZvbGF0aWxlIGxvbmcgKnNyYyA9IChsb25nICopIGFkZHI7CisJbG9uZyAqZHN0ID0gKGxvbmcgKikgZGF0YTsKKworCWlmICgodTMyKWRhdGEgJiAweDMpCisJCXBhbmljKCJ1bmFsaWduZWQgcG9pbnRlciB0byByZWFkc2wiKTsKKworCXdoaWxlIChsZW4tLSA+IDApCisJCSpkc3QrKyA9ICpzcmM7CisKKworfQorCit2b2lkIF9fcmF3X3dyaXRlc2wodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCWNvbnN0IGxvbmcgKnNyYyA9IChsb25nICopZGF0YTsKKwl2b2xhdGlsZSBsb25nICpkc3QgPSAobG9uZyAqKWFkZHI7CisKKwlpZiAoKHUzMilkYXRhICYgMHgzKQorCQlwYW5pYygidW5hbGlnbmVkIHBvaW50ZXIgdG8gd3JpdGVzbCIpOworCisJd2hpbGUgKGxlbi0tID4gMCkKKwkJKmRzdCA9ICpzcmMrKzsKKworCit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbGliL21lbWNweS5TIGIvYXJjaC9oZXhhZ29uL2xpYi9tZW1jcHkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTAxYzMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2xpYi9tZW1jcHkuUwpAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogRGVzY3JpcHRpb24KKyAqCisgKiAgIGxpYnJhcnkgZnVuY3Rpb24gZm9yIG1lbWNweSB3aGVyZSBsZW5ndGggYnl0ZXMgYXJlIGNvcGllZCBmcm9tCisgKiAgIHB0cl9pbiB0byBwdHJfb3V0LiBwdHJfb3V0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KKyAqICAgQWxsb3dzIGFueSBjb21iaW5hdGlvbiBvZiBhbGlnbm1lbnQgb24gaW5wdXQgYW5kIG91dHB1dCBwb2ludGVycworICogICBhbmQgbGVuZ3RoIGZyb20gMCB0byAyXjMyLTEKKyAqCisgKiBSZXN0cmljdGlvbnMKKyAqICAgVGhlIGFycmF5cyBzaG91bGQgbm90IG92ZXJsYXAsIHRoZSBwcm9ncmFtIHdpbGwgcHJvZHVjZSB1bmRlZmluZWQgb3V0cHV0CisgKiAgIGlmIHRoZXkgZG8uCisgKiAgIEZvciBibG9ja3MgbGVzcyB0aGFuIDE2IGJ5dGVzIGEgYnl0ZSBieSBieXRlIGNvcHkgaXMgcGVyZm9ybWVkLiBGb3IKKyAqICAgOGJ5dGUgYWxpZ25tZW50cywgYW5kIGxlbmd0aCBtdWx0aXBsZXMsIGEgZHdvcmQgY29weSBpcyBwZXJmb3JtZWQgdXAgdG8KKyAqICAgOTZieXRlcworICogSGlzdG9yeQorICoKKyAqICAgREpIICA1LzE1LzA5IEluaXRpYWwgdmVyc2lvbiAxLjAKKyAqICAgREpIICA2LyAxLzA5IFZlcnNpb24gMS4xIG1vZGlmaWVkIEFCSSB0byBpbmxjdWRlIFIxNi1SMTkKKyAqICAgREpIICA3LzEyLzA5IFZlcnNpb24gMS4yIG9wdGltaXplZCBjb2Rlc2l6ZSBkb3duIHRvIDc2MCB3YXMgODQwCisgKiAgIERKSCAxMC8xNC8wOSBWZXJzaW9uIDEuMyBhZGRlZCBzcGVjaWFsIGxvb3AgZm9yIGFsaWduZWQgY2FzZSwgd2FzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmVhZGluZyBibG9hdGVkIGNvZGVzaXplIGJhY2sgdXAgdG8gODkyCisgKiAgIERKSCAgNC8yMC8xMCBWZXJzaW9uIDEuNCBmaXhlZCBMZHdvcmRfbG9vcF9lcGlsb2cgbG9vcCB0byBwcmV2ZW50IGxvYWRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cmluZyBpZiBvbmx5IDEgbGVmdCBvdXRzdGFuZGluZywgZml4ZXMgYnVnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDM4ODgsIGNvcnJlY3RlZCBmb3IgYWxsIGFsaWdubWVudHMuIFBlZWxlZCBvZmYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgMzJieXRlIGNodW5rIGZyb20ga2VybmVsIGxvb3AgYW5kIGV4dGVuZGVkIDhieXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wIGF0IGVuZCB0byBzb2x2ZSBhbGwgY29tYmluYXRpb25zIGFuZCBwcmV2ZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyIHJlYWQuICBGaXhlZCBMZHdvcmRfbG9vcF9wcm9sb2cgdG8gcHJldmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJlYWQgZm9yIGJsb2NrcyBsZXNzIHRoYW4gNDhieXRlcy4gUmVkdWNlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNpemUgdG8gNzUyIGJ5dGVzCisgKiAgIERKSCAgNC8yMS8xMCB2ZXJzaW9uIDEuNSAxLjQgZml4IGJyb2tlIGNvZGUgZm9yIGlucHV0IGJsb2NrIGVuZHMgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIHRvIGR3b3JkIGJvdW5kYXJpZXMsdW5kZXJ3cml0aW5nIGJ5IDEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUsIGFkZGVkIGRldGVjdGlvbiBmb3IgdGhpcyBhbmQgZml4ZWQuIEEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdHRsZSBibG9hdC4KKyAqICAgREpIICA0LzIzLzEwIHZlcnNpb24gMS42IGNvcnJlY3RlZCBzdGFjayBlcnJvciwgUjIwIHdhcyBub3QgYmVpbmcgcmVzdG9yZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cywgZml4ZWQgdGhlIGVycm9yIG9mIFIyMCBiZWluZyBtb2RpZmllZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGl0IHdhcyBiZWluZyBzYXZlZAorICogTmF0dXJhbCBjIG1vZGVsCisgKiA9PT09PT09PT09PT09PT0KKyAqIHZvaWQgKiBtZW1jcHkoY2hhciAqIHB0cl9vdXQsIGNoYXIgKiBwdHJfaW4sIGludCBsZW5ndGgpIHsKKyAqICAgaW50IGk7CisgKiAgIGlmKGxlbmd0aCkgZm9yKGk9MDsgaSA8IGxlbmd0aDsgaSsrKSB7IHB0cl9vdXRbaV0gPSBwdHJfaW5baV07IH0KKyAqICAgcmV0dXJuKHB0cl9vdXQpOworICogfQorICoKKyAqIE9wdGltaXplZCBtZW1jcHkgZnVuY3Rpb24KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHZvaWQgKiBtZW1jcHkoY2hhciAqIHB0cl9vdXQsIGNoYXIgKiBwdHJfaW4sIGludCBsZW4pIHsKKyAqICAgaW50IGksIHByb2xvZywga2VybmVsLCBlcGlsb2csIG1hc2s7CisgKiAgIHU4IG9mZnNldDsKKyAqICAgczY0IGRhdGEwLCBkYXRhRjgsIGRhdGE3MDsKKyAqCisgKiAgIHM2NCAqIHB0cjhfaW47CisgKiAgIHM2NCAqIHB0cjhfb3V0OworICogICBzMzIgKiBwdHI0OworICogICBzMTYgKiBwdHIyOworICoKKyAqICAgb2Zmc2V0ID0gKChpbnQpIHB0cl9pbikgJiA3OworICogICBwdHI4X2luID0gKHM2NCAqKSAmcHRyX2luWy1vZmZzZXRdOyAgIC8vcmVhZCBpbiB0aGUgYWxpZ25lZCBwb2ludGVycworICoKKyAqICAgZGF0YTcwID0gKnB0cjhfaW4rKzsKKyAqICAgZGF0YUY4ID0gKnB0cjhfaW4rKzsKKyAqCisgKiAgIGRhdGEwID0gSEVYQUdPTl9QX3ZhbGlnbmJfUFBwKGRhdGFGOCwgZGF0YTcwLCBvZmZzZXQpOworICoKKyAqICAgcHJvbG9nID0gMzIgLSAoKGludCkgcHRyX291dCk7CisgKiAgIG1hc2sgID0gMHg3ZmZmZmZmZiA+PiBIRVhBR09OX1JfY2wwX1IobGVuKTsKKyAqICAgcHJvbG9nID0gcHJvbG9nICYgbWFzazsKKyAqICAga2VybmVsID0gbGVuIC0gcHJvbG9nOworICogICBlcGlsb2cgPSBrZXJuZWwgJiAweDFGOworICogICBrZXJuZWwgPSBrZXJuZWw+PjU7CisgKgorICogICBpZiAocHJvbG9nICYgMSkgeyBwdHJfb3V0WzBdID0gKHU4KSBkYXRhMDsgZGF0YTAgPj49IDg7IHB0cl9vdXQgKz0gMTt9CisgKiAgIHB0cjIgPSAoczE2ICopICZwdHJfb3V0WzBdOworICogICBpZiAocHJvbG9nICYgMikgeyBwdHIyWzBdID0gKHUxNikgZGF0YTA7ICBkYXRhMCA+Pj0gMTY7IHB0cl9vdXQgKz0gMjt9CisgKiAgIHB0cjQgPSAoczMyICopICZwdHJfb3V0WzBdOworICogICBpZiAocHJvbG9nICYgNCkgeyBwdHI0WzBdID0gKHUzMikgZGF0YTA7ICBkYXRhMCA+Pj0gMzI7IHB0cl9vdXQgKz0gNDt9CisgKgorICogICBvZmZzZXQgPSBvZmZzZXQgKyAocHJvbG9nICYgNyk7CisgKiAgIGlmIChvZmZzZXQgPj0gOCkgeworICogICAgIGRhdGE3MCA9IGRhdGFGODsKKyAqICAgICBkYXRhRjggPSAqcHRyOF9pbisrOworICogICB9CisgKiAgIG9mZnNldCA9IG9mZnNldCAmIDB4NzsKKyAqCisgKiAgIHByb2xvZyA9IHByb2xvZyA+PiAzOworICogICBpZiAocHJvbG9nKSBmb3IgKGk9MDsgaSA8IHByb2xvZzsgaSsrKSB7CisgKiAgICAgICBkYXRhMCA9IEhFWEFHT05fUF92YWxpZ25iX1BQcChkYXRhRjgsIGRhdGE3MCwgb2Zmc2V0KTsKKyAqICAgICAgIHB0cjhfb3V0ID0gKHM2NCAqKSAmcHRyX291dFswXTsgKnB0cjhfb3V0ID0gZGF0YTA7IHB0cl9vdXQgKz0gODsKKyAqICAgICAgIGRhdGE3MCA9IGRhdGFGODsKKyAqICAgICAgIGRhdGFGOCA9ICpwdHI4X2luKys7CisgKiAgIH0KKyAqICAgaWYoa2VybmVsKSB7IGtlcm5lbCAtPSAxOyBlcGlsb2cgKz0gMzI7IH0KKyAqICAgaWYoa2VybmVsKSBmb3IoaT0wOyBpIDwga2VybmVsOyBpKyspIHsKKyAqICAgICAgIGRhdGEwID0gSEVYQUdPTl9QX3ZhbGlnbmJfUFBwKGRhdGFGOCwgZGF0YTcwLCBvZmZzZXQpOworICogICAgICAgcHRyOF9vdXQgPSAoczY0ICopICZwdHJfb3V0WzBdOyAqcHRyOF9vdXQgPSBkYXRhMDsgcHRyX291dCArPSA4OworICogICAgICAgZGF0YTcwID0gKnB0cjhfaW4rKzsKKyAqCisgKiAgICAgICBkYXRhMCA9IEhFWEFHT05fUF92YWxpZ25iX1BQcChkYXRhNzAsIGRhdGFGOCwgb2Zmc2V0KTsKKyAqICAgICAgIHB0cjhfb3V0ID0gKHM2NCAqKSAmcHRyX291dFswXTsgKnB0cjhfb3V0ID0gZGF0YTA7IHB0cl9vdXQgKz0gODsKKyAqICAgICAgIGRhdGFGOCA9ICpwdHI4X2luKys7CisgKgorICogICAgICAgZGF0YTAgPSBIRVhBR09OX1BfdmFsaWduYl9QUHAoZGF0YUY4LCBkYXRhNzAsIG9mZnNldCk7CisgKiAgICAgICBwdHI4X291dCA9IChzNjQgKikgJnB0cl9vdXRbMF07ICpwdHI4X291dCA9IGRhdGEwOyBwdHJfb3V0ICs9IDg7CisgKiAgICAgICBkYXRhNzAgPSAqcHRyOF9pbisrOworICoKKyAqICAgICAgIGRhdGEwID0gSEVYQUdPTl9QX3ZhbGlnbmJfUFBwKGRhdGE3MCwgZGF0YUY4LCBvZmZzZXQpOworICogICAgICAgcHRyOF9vdXQgPSAoczY0ICopICZwdHJfb3V0WzBdOyAqcHRyOF9vdXQgPSBkYXRhMDsgcHRyX291dCArPSA4OworICogICAgICAgZGF0YUY4ID0gKnB0cjhfaW4rKzsKKyAqICAgfQorICogICBlcGlsb2dkd3MgPSBlcGlsb2cgPj4gMzsKKyAqICAgaWYgKGVwaWxvZ2R3cykgZm9yIChpPTA7IGkgPCBlcGlsb2dkd3M7IGkrKykgeworICogICAgICAgZGF0YTAgPSBIRVhBR09OX1BfdmFsaWduYl9QUHAoZGF0YUY4LCBkYXRhNzAsIG9mZnNldCk7CisgKiAgICAgICBwdHI4X291dCA9IChzNjQgKikgJnB0cl9vdXRbMF07ICpwdHI4X291dCA9IGRhdGEwOyBwdHJfb3V0ICs9IDg7CisgKiAgICAgICBkYXRhNzAgPSBkYXRhRjg7CisgKiAgICAgICBkYXRhRjggPSAqcHRyOF9pbisrOworICogICB9CisgKiAgIGRhdGEwID0gSEVYQUdPTl9QX3ZhbGlnbmJfUFBwKGRhdGFGOCwgZGF0YTcwLCBvZmZzZXQpOworICoKKyAqICAgcHRyNCA9IChzMzIgKikgJnB0cl9vdXRbMF07CisgKiAgIGlmIChlcGlsb2cgJiA0KSB7IHB0cjRbMF0gPSAodTMyKSBkYXRhMDsgZGF0YTAgPj49IDMyOyBwdHJfb3V0ICs9IDQ7fQorICogICBwdHIyID0gKHMxNiAqKSAmcHRyX291dFswXTsKKyAqICAgaWYgKGVwaWxvZyAmIDIpIHsgcHRyMlswXSA9ICh1MTYpIGRhdGEwOyBkYXRhMCA+Pj0gMTY7IHB0cl9vdXQgKz0gMjt9CisgKiAgIGlmIChlcGlsb2cgJiAxKSB7ICpwdHJfb3V0KysgPSAodTgpIGRhdGEwOyB9CisgKgorICogICByZXR1cm4ocHRyX291dCAtIGxlbmd0aCk7CisgKiB9CisgKgorICogQ29kZXNpemUgOiA3ODQgYnl0ZXMKKyAqLworCisKKyNkZWZpbmUgcHRyX291dAkJUjAJLyogIGRlc3RpbmF0aW9uICBwb3VudGVyICAqLworI2RlZmluZSBwdHJfaW4JCVIxCS8qICBzb3VyY2UgcG9pbnRlciAgKi8KKyNkZWZpbmUgbGVuCQlSMgkvKiAgbGVuZ3RoIG9mIGNvcHkgaW4gYnl0ZXMgICovCisKKyNkZWZpbmUgZGF0YTcwCQlSMTM6MTIJLyogIGxvIDggYnl0ZXMgb2Ygbm9uLWFsaWduZWQgdHJhbnNmZXIgICovCisjZGVmaW5lIGRhdGFGOAkJUjExOjEwCS8qICBoaSA4IGJ5dGVzIG9mIG5vbi1hbGlnbmVkIHRyYW5zZmVyICAqLworI2RlZmluZSBsZGF0YTAJCVI3OjYJLyogIGV2ZW4gOCBieXRlcyBjaHVua3MgICovCisjZGVmaW5lIGxkYXRhMQkJUjI1OjI0CS8qICBvZGQgOCBieXRlcyBjaHVua3MgICovCisjZGVmaW5lIGRhdGExCQlSNwkvKiAgbG93ZXIgOCBieXRlcyBvZiBsZGF0YTEgICovCisjZGVmaW5lIGRhdGEwCQlSNgkvKiAgbG93ZXIgOCBieXRlcyBvZiBsZGF0YTAgICovCisKKyNkZWZpbmUgaWZieXRlCQlwMAkvKiAgaWYgdHJhbnNmZXIgaGFzIGJ5dGVzIGluIGVwaWxvZy9wcm9sb2cgICovCisjZGVmaW5lIGlmaHdvcmQJCXAwCS8qICBpZiB0cmFuc2ZlciBoYXMgc2hvcnRzIGluIGVwaWxvZy9wcm9sb2cgICovCisjZGVmaW5lIGlmd29yZAkJcDAJLyogIGlmIHRyYW5zZmVyIGhhcyB3b3JkcyBpbiBlcGlsb2cvcHJvbG9nICAqLworI2RlZmluZSBub3Byb2xvZwlwMAkvKiAgbm8gcHJvbG9nLCB4ZmVyIHN0YXJ0cyBhdCAzMmJ5dGUgICovCisjZGVmaW5lIG5va2VybmVsCXAxCS8qICBubyAzMmJ5dGUgbXVsdGlwbGUgYmxvY2sgaW4gdGhlIHRyYW5zZmVyICAqLworI2RlZmluZSBub2VwaWxvZwlwMAkvKiAgbm8gZXBpbG9nLCB4ZmVyIGVuZHMgb24gMzJieXRlIGJvdW5kYXJ5ICAqLworI2RlZmluZSBhbGlnbgkJcDIJLyogIGFsaWdubWVudCBvZiBpbnB1dCByZWwgdG8gOGJ5dGUgYm91bmRhcnkgICovCisjZGVmaW5lIGtlcm5lbDEJCXAwCS8qICBrZXJuZWwgY291bnQgPT0gMSAgKi8KKworI2RlZmluZSBkYWxpZ24JCVIyNQkvKiAgcmVsIGFsaWdubWVudCBvZiBpbnB1dCB0byBvdXRwdXQgZGF0YSAgKi8KKyNkZWZpbmUgc3RhcjMJCVIxNgkvKiAgbnVtYmVyIGJ5dGVzIGluIHByb2xvZyAtIGR3b3JkcyAgKi8KKyNkZWZpbmUgcmVzdAkJUjgJLyogIGxlbmd0aCAtIHByb2xvZyBieXRlcyAgKi8KKyNkZWZpbmUgYmFjawkJUjcJLyogIG5yIGJ5dGVzID4gZHdvcmQgYm91bmRhcnkgaW4gc3JjIGJsb2NrICAqLworI2RlZmluZSBlcGlsb2cJCVIzCS8qICBieXRlcyBpbiBlcGlsb2cgICovCisjZGVmaW5lIGluYwkJUjE1OjE0CS8qICBpbmMga2VybmVsIGJ5IC0xIGFuZCBkZWZldGNoIHB0ciBieSAzMiAgKi8KKyNkZWZpbmUga2VybmVsCQlSNAkvKiAgbnVtYmVyIG9mIDMyYnl0ZSBjaHVua3MgaW4ga2VybmVsICAqLworI2RlZmluZSBwdHJfaW5fcF8xMjgJUjUJLyogIHBvaW50ZXIgZm9yIHByZWZldGNoIG9mIGlucHV0IGRhdGEgICovCisjZGVmaW5lIG1hc2sJCVI4CS8qICBtYXNrIHVzZWQgdG8gZGV0ZXJtaW5lIHByb2xvZyBzaXplICAqLworI2RlZmluZSBzaGlmdAkJUjgJLyogIHVzZWQgdG8gd29yayBhIHNoaWZ0ZXIgdG8gZXh0cmFjdCBieXRlcyAgKi8KKyNkZWZpbmUgc2hpZnQyCQlSNQkvKiAgaW4gZXBpbG9nIHRvIHdvcmtzaGlmdGVyIHRvIGV4dHJhY3QgYnl0ZXMgKi8KKyNkZWZpbmUgcHJvbG9nCQlSMTUJLyogIGJ5dGVzIGluICBwcm9sb2cgICovCisjZGVmaW5lIGVwaWxvZ2R3cwlSMTUJLyogIG51bWJlciBkd29yZHMgaW4gZXBpbG9nICAqLworI2RlZmluZSBzaGlmdGIJCVIxNAkvKiAgdXNlZCB0byBleHRyYWN0IGJ5dGVzICAqLworI2RlZmluZSBvZmZzZXQJCVI5CS8qICBzYW1lIGFzIGFsaWduIGluIHJlZyAgKi8KKyNkZWZpbmUgcHRyX291dF9wXzMyCVIxNwkvKiAgcG9pbnRlciB0byBvdXRwdXQgZGN6ZXJvICAqLworI2RlZmluZSBhbGlnbjg4OAlSMTQJLyogIGlmIHNpbXBsZSBkd29yZCBsb29wIGNhbiBiZSB1c2VkICAqLworI2RlZmluZSBsZW44CQlSOQkvKiAgbnVtYmVyIG9mIGR3b3JkcyBpbiBsZW5ndGggICovCisjZGVmaW5lIG92ZXIJCVIyMAkvKiAgbnIgb2YgYnl0ZXMgPiBsYXN0IGlucCBidWYgZHdvcmQgYm91bmRhcnkgKi8KKworI2RlZmluZSBwdHJfaW5fcF8xMjhrZXJuZWwJUjU6NAkvKiAgcGFja2VkIGZldGNoIHBvaW50ZXIgJiBrZXJuZWwgY250ICovCisKKwkuc2VjdGlvbiAudGV4dAorCS5wMmFsaWduIDQKKyAgICAgICAgLmdsb2JhbCBtZW1jcHkKKyAgICAgICAgLnR5cGUgbWVtY3B5LCBAZnVuY3Rpb24KK21lbWNweToKK3sKKwlwMiA9IGNtcC5lcShsZW4sICMwKTsJCS8qICA9MCAqLworCWFsaWduODg4ID0gb3IocHRyX2luLCBwdHJfb3V0KTsJLyogICU4IDwgOTcgKi8KKwlwMCA9IGNtcC5ndHUobGVuLCAjMjMpOwkJLyogICUxLCA8MjQgKi8KKwlwMSA9IGNtcC5lcShwdHJfaW4sIHB0cl9vdXQpOwkvKiAgYXR0ZW1wdCB0byBvdmVyd3JpdGUgc2VsZiAqLworfQoreworCXAxID0gb3IocDIsIHAxKTsKKwlwMyA9IGNtcC5ndHUobGVuLCAjOTUpOwkJLyogICU4IDwgOTcgKi8KKwlhbGlnbjg4OCA9IG9yKGFsaWduODg4LCBsZW4pOwkvKiAgJTggPCA5NyAqLworCWxlbjggPSBsc3IobGVuLCAjMyk7CQkvKiAgJTggPCA5NyAqLworfQoreworCWRjZmV0Y2gocHRyX2luKTsJCS8qICB6ZXJvL3B0cmluPXB0cm91dCBjYXVzZXMgZmV0Y2ggKi8KKwlwMiA9IGJpdHNjbHIoYWxpZ244ODgsICM3KTsJLyogICU4IDwgOTcgICovCisJaWYocDEpIGp1bXByIHIzMTsJCS8qICA9MCAgKi8KK30KK3sKKwlwMiA9IGFuZChwMiwhcDMpOwkJCS8qICAlOCA8IDk3ICAqLworCWlmIChwMi5uZXcpIGxlbiA9IGFkZChsZW4sICMtOCk7CS8qICAlOCA8IDk3ICAqLworCWlmIChwMi5uZXcpIGp1bXA6TlQgLkxkd29yZGFsaWduZWQ7IAkvKiAgJTggPCA5NyAgKi8KK30KK3sKKwlpZighcDApIGp1bXAgLkxieXRlczIzb3JsZXNzOwkvKiAgJTEsIDwyNCAgKi8KKwltYXNrLmwgPSAjTE8oMHg3ZmZmZmZmZik7CisJLyogIGFsbCBieXRlcyBiZWZvcmUgbGluZSBtdWx0aXBsZXMgb2YgZGF0YSAgKi8KKwlwcm9sb2cgPSBzdWIoIzAsIHB0cl9vdXQpOworfQoreworCS8qICBzYXZlIHIzMSBvbiBzdGFjaywgZGVjcmVtZW50IHNwIGJ5IDE2ICAqLworCWFsbG9jZnJhbWUoIzI0KTsKKwltYXNrLmggPSAjSEkoMHg3ZmZmZmZmZik7CisJcHRyX2luX3BfMTI4ID0gYWRkKHB0cl9pbiwgIzMyKTsKKwliYWNrID0gY2wwKGxlbik7Cit9Cit7CisJbWVtZChzcCsjMCkgPSBSMTc6MTY7CQkvKiAgc2F2ZSByMTYscjE3IG9uIHN0YWNrNiAgKi8KKwlyMzEubCA9ICNMTyguTG1lbWNweV9yZXR1cm4pOwkvKiAgc2V0IHVwIGZpbmFsIHJldHVybiBwb2ludGVyICAqLworCXByb2xvZyAmPSBsc3IobWFzaywgYmFjayk7CisJb2Zmc2V0ID0gYW5kKHB0cl9pbiwgIzcpOworfQoreworCW1lbWQoc3ArIzgpID0gUjI1OjI0OwkJLyogIHNhdmUgcjI1LHIyNCBvbiBzdGFjayAgKi8KKwlkYWxpZ24gPSBzdWIocHRyX291dCwgcHRyX2luKTsKKwlyMzEuaCA9ICNISSguTG1lbWNweV9yZXR1cm4pOwkvKiAgc2V0IHVwIGZpbmFsIHJldHVybiBwb2ludGVyICAqLworfQoreworCS8qICBzZWUgaWYgdGhlcmUgaWYgaW5wdXQgYnVmZmVyIGVuZCBpZiBhbGlnbmVkICAqLworCW92ZXIgPSBhZGQobGVuLCBwdHJfaW4pOworCWJhY2sgPSBhZGQobGVuLCBvZmZzZXQpOworCW1lbWQoc3ArIzE2KSA9IFIyMToyMDsJCS8qICBzYXZlIHIyMCxyMjEgb24gc3RhY2sgICovCit9Cit7CisJbm9wcm9sb2cgPSBiaXRzY2xyKHByb2xvZywgIzcpOworCXByb2xvZyA9IGFuZChwcm9sb2csICMzMSk7CisJZGNmZXRjaChwdHJfaW5fcF8xMjgpOworCXB0cl9pbl9wXzEyOCA9IGFkZChwdHJfaW5fcF8xMjgsICMzMik7Cit9Cit7CisJa2VybmVsID0gc3ViKGxlbiwgcHJvbG9nKTsKKwlzaGlmdCA9IGFzbChwcm9sb2csICMzKTsKKwlzdGFyMyA9IGFuZChwcm9sb2csICM3KTsKKwlwdHJfaW4gPSBhbmQocHRyX2luLCAjLTgpOworfQoreworCXByb2xvZyA9IGxzcihwcm9sb2csICMzKTsKKwllcGlsb2cgPSBhbmQoa2VybmVsLCAjMzEpOworCXB0cl9vdXRfcF8zMiA9IGFkZChwdHJfb3V0LCBwcm9sb2cpOworCW92ZXIgPSBhbmQob3ZlciwgIzcpOworfQoreworCXAzID0gY21wLmd0dShiYWNrLCAjOCk7CisJa2VybmVsID0gbHNyKGtlcm5lbCwgIzUpOworCWRjZmV0Y2gocHRyX2luX3BfMTI4KTsKKwlwdHJfaW5fcF8xMjggPSBhZGQocHRyX2luX3BfMTI4LCAjMzIpOworfQoreworCXAxID0gY21wLmVxKHByb2xvZywgIzApOworCWlmKCFwMS5uZXcpIHByb2xvZyA9IGFkZChwcm9sb2csICMxKTsKKwlkY2ZldGNoKHB0cl9pbl9wXzEyOCk7CS8qICByZXNlcnZlIHRoZSBsaW5lIDY0Ynl0ZXMgb24gICovCisJcHRyX2luX3BfMTI4ID0gYWRkKHB0cl9pbl9wXzEyOCwgIzMyKTsKK30KK3sKKwlub2tlcm5lbCA9IGNtcC5lcShrZXJuZWwsIzApOworCWRjZmV0Y2gocHRyX2luX3BfMTI4KTsJLyogcmVzZXJ2ZSB0aGUgbGluZSA2NGJ5dGVzIG9uICAqLworCXB0cl9pbl9wXzEyOCA9IGFkZChwdHJfaW5fcF8xMjgsICMzMik7CisJc2hpZnRiID0gYW5kKHNoaWZ0LCAjOCk7Cit9Cit7CisJZGNmZXRjaChwdHJfaW5fcF8xMjgpOwkJLyogIHJlc2VydmUgdGhlIGxpbmUgNjRieXRlcyBvbiAgKi8KKwlwdHJfaW5fcF8xMjggPSBhZGQocHRyX2luX3BfMTI4LCAjMzIpOworCWlmKG5va2VybmVsKSBqdW1wIC5Mc2tpcDY0OworCXAyID0gY21wLmVxKGtlcm5lbCwgIzEpOwkvKiAgc2tpcCBvdnIgaWYga2VybmVsID09IDAgICovCit9Cit7CisJZGN6ZXJvYShwdHJfb3V0X3BfMzIpOworCS8qICBkb24ndCBhZHZhbmNlIHBvaW50ZXIgICovCisJaWYoIXAyKSBwdHJfb3V0X3BfMzIgPSBhZGQocHRyX291dF9wXzMyLCAjMzIpOworfQoreworCWRhbGlnbiA9IGFuZChkYWxpZ24sICMzMSk7CisJZGN6ZXJvYShwdHJfb3V0X3BfMzIpOworfQorLkxza2lwNjQ6Cit7CisJZGF0YTcwID0gbWVtZChwdHJfaW4rKyMxNik7CisJaWYocDMpIGRhdGFGOCA9IG1lbWQocHRyX2luKyM4KTsKKwlpZihub3Byb2xvZykganVtcCAuTG5vcHJvbG9nMzI7CisJYWxpZ24gPSBvZmZzZXQ7Cit9CisvKiAgdXB0byBpbml0aWFsIDcgYnl0ZXMgICovCit7CisJbGRhdGEwID0gdmFsaWduYihkYXRhRjgsIGRhdGE3MCwgYWxpZ24pOworCWlmYnl0ZSA9IHRzdGJpdChzaGlmdCwjMyk7CisJb2Zmc2V0ID0gYWRkKG9mZnNldCwgc3RhcjMpOworfQoreworCWlmKGlmYnl0ZSkgbWVtYihwdHJfb3V0KysjMSkgPSBkYXRhMDsKKwlsZGF0YTAgPSBsc3IobGRhdGEwLCBzaGlmdGIpOworCXNoaWZ0YiA9IGFuZChzaGlmdCwgIzE2KTsKKwlpZmh3b3JkID0gdHN0Yml0KHNoaWZ0LCM0KTsKK30KK3sKKwlpZihpZmh3b3JkKSBtZW1oKHB0cl9vdXQrKyMyKSA9IGRhdGEwOworCWxkYXRhMCA9IGxzcihsZGF0YTAsIHNoaWZ0Yik7CisJaWZ3b3JkID0gdHN0Yml0KHNoaWZ0LCM1KTsKKwlwMiA9IGNtcC5ndHUob2Zmc2V0LCAjNyk7Cit9Cit7CisJaWYoaWZ3b3JkKSBtZW13KHB0cl9vdXQrKyM0KSA9IGRhdGEwOworCWlmKHAyKSBkYXRhNzAgPSBkYXRhRjg7CisJaWYocDIpIGRhdGFGOCA9IG1lbWQocHRyX2luKysjOCk7CS8qICBhbm90aGVyIDggYnl0ZXMgICovCisJYWxpZ24gPSBvZmZzZXQ7Cit9CisuTG5vcHJvbG9nMzI6Cit7CisJcDMgPSBzcDFsb29wMCguTGR3b3JkX2xvb3BfcHJvbG9nLCBwcm9sb2cpCisJcmVzdCA9IHN1YihsZW4sIHN0YXIzKTsJLyogIHdoYXRzIGxlZnQgYWZ0ZXIgdGhlIGxvb3AgICovCisJcDAgPSBjbXAuZ3Qob3ZlciwgIzApOworfQorCWlmKHAwKSByZXN0ID0gYWRkKHJlc3QsICMxNik7CisuTGR3b3JkX2xvb3BfcHJvbG9nOgoreworCWlmKHAzKSBtZW1kKHB0cl9vdXQrKyM4KSA9IGxkYXRhMDsKKwlsZGF0YTAgPSB2YWxpZ25iKGRhdGFGOCwgZGF0YTcwLCBhbGlnbik7CisJcDAgPSBjbXAuZ3QocmVzdCwgIzE2KTsKK30KK3sKKwlkYXRhNzAgPSBkYXRhRjg7CisJaWYocDApIGRhdGFGOCA9IG1lbWQocHRyX2luKysjOCk7CisJcmVzdCA9IGFkZChyZXN0LCAjLTgpOworfTplbmRsb29wMAorLkxrZXJuZWw6Cit7CisJLyogIGtlcm5lbCBpcyBhdCBsZWFzdCAzMmJ5dGVzICAqLworCXAzID0gY21wLmd0dShrZXJuZWwsICMwKTsKKwkvKiAgbGFzdCBpdG4uIHJlbW92ZSBlZGdlIGVmZmVjdHMgICovCisJaWYocDMubmV3KSBrZXJuZWwgPSBhZGQoa2VybmVsLCAjLTEpOworCS8qICBkZWFsdCB3aXRoIGluIGxhc3QgZHdvcmQgbG9vcCAgKi8KKwlpZihwMy5uZXcpIGVwaWxvZyA9IGFkZChlcGlsb2csICMzMik7Cit9Cit7CisJbm9rZXJuZWwgPSBjbXAuZXEoa2VybmVsLCAjMCk7CQkvKiAgYWZ0ZXIgYWRqdXN0bWVudCwgcmVjaGVjayAqLworCWlmKG5va2VybmVsLm5ldykganVtcDpOVCAuTGVwaWxvZzsJLyogIGxpa2VseSBub3QgdGFrZW4gICovCisJaW5jID0gY29tYmluZSgjMzIsICMtMSk7CisJcDMgPSBjbXAuZ3R1KGRhbGlnbiwgIzI0KTsKK30KK3sKKwlpZihwMykganVtcCAuTG9kZF9hbGlnbm1lbnQ7Cit9Cit7CisJbG9vcDAoLkxvd29yZF9sb29wXzI1dG8zMSwga2VybmVsKTsKKwlrZXJuZWwxID0gY21wLmd0dShrZXJuZWwsICMxKTsKKwlyZXN0ID0ga2VybmVsOworfQorCS5mYWxpZ24KKy5Mb3dvcmRfbG9vcF8yNXRvMzE6Cit7CisJZGNmZXRjaChwdHJfaW5fcF8xMjgpOwkvKiAgcHJlZmV0Y2ggNCBsaW5lcyBhaGVhZCAgKi8KKwlpZihrZXJuZWwxKSBwdHJfb3V0X3BfMzIgPSBhZGQocHRyX291dF9wXzMyLCAjMzIpOworfQoreworCWRjemVyb2EocHRyX291dF9wXzMyKTsJLyogIHJlc2VydmUgdGhlIG5leHQgMzJieXRlcyBpbiBjYWNoZSAgKi8KKwlwMyA9IGNtcC5lcShrZXJuZWwsIHJlc3QpOworfQoreworCS8qICBrZXJuZWwgLT0gMSAgKi8KKwlwdHJfaW5fcF8xMjhrZXJuZWwgPSB2YWRkdyhwdHJfaW5fcF8xMjhrZXJuZWwsIGluYyk7CisJLyogIGtpbGwgd3JpdGUgb24gZmlyc3QgaXRlcmF0aW9uICAqLworCWlmKCFwMykgbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTE7CisJbGRhdGExID0gdmFsaWduYihkYXRhRjgsIGRhdGE3MCwgYWxpZ24pOworCWRhdGE3MCA9IG1lbWQocHRyX2luKysjOCk7Cit9Cit7CisJbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTA7CisJbGRhdGEwID0gdmFsaWduYihkYXRhNzAsIGRhdGFGOCwgYWxpZ24pOworCWRhdGFGOCA9IG1lbWQocHRyX2luKysjOCk7Cit9Cit7CisJbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTE7CisJbGRhdGExID0gdmFsaWduYihkYXRhRjgsIGRhdGE3MCwgYWxpZ24pOworCWRhdGE3MCA9IG1lbWQocHRyX2luKysjOCk7Cit9Cit7CisJbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTA7CisJbGRhdGEwID0gdmFsaWduYihkYXRhNzAsIGRhdGFGOCwgYWxpZ24pOworCWRhdGFGOCA9IG1lbWQocHRyX2luKysjOCk7CisJa2VybmVsMSA9IGNtcC5ndHUoa2VybmVsLCAjMSk7Cit9OmVuZGxvb3AwCit7CisJbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTE7CisJanVtcCAuTGVwaWxvZzsKK30KKy5Mb2RkX2FsaWdubWVudDoKK3sKKwlsb29wMCguTG93b3JkX2xvb3BfMDB0bzI0LCBrZXJuZWwpOworCWtlcm5lbDEgPSBjbXAuZ3R1KGtlcm5lbCwgIzEpOworCXJlc3QgPSBhZGQoa2VybmVsLCAjLTEpOworfQorCS5mYWxpZ24KKy5Mb3dvcmRfbG9vcF8wMHRvMjQ6Cit7CisJZGNmZXRjaChwdHJfaW5fcF8xMjgpOwkvKiAgcHJlZmV0Y2ggNCBsaW5lcyBhaGVhZCAgKi8KKwlwdHJfaW5fcF8xMjhrZXJuZWwgPSB2YWRkdyhwdHJfaW5fcF8xMjhrZXJuZWwsIGluYyk7CisJaWYoa2VybmVsMSkgcHRyX291dF9wXzMyID0gYWRkKHB0cl9vdXRfcF8zMiwgIzMyKTsKK30KK3sKKwlkY3plcm9hKHB0cl9vdXRfcF8zMik7CS8qICByZXNlcnZlIHRoZSBuZXh0IDMyYnl0ZXMgaW4gY2FjaGUgICovCit9Cit7CisJbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTA7CisJbGRhdGEwID0gdmFsaWduYihkYXRhRjgsIGRhdGE3MCwgYWxpZ24pOworCWRhdGE3MCA9IG1lbWQocHRyX2luKysjOCk7Cit9Cit7CisJbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTA7CisJbGRhdGEwID0gdmFsaWduYihkYXRhNzAsIGRhdGFGOCwgYWxpZ24pOworCWRhdGFGOCA9IG1lbWQocHRyX2luKysjOCk7Cit9Cit7CisJbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTA7CisJbGRhdGEwID0gdmFsaWduYihkYXRhRjgsIGRhdGE3MCwgYWxpZ24pOworCWRhdGE3MCA9IG1lbWQocHRyX2luKysjOCk7Cit9Cit7CisJbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTA7CisJbGRhdGEwID0gdmFsaWduYihkYXRhNzAsIGRhdGFGOCwgYWxpZ24pOworCWRhdGFGOCA9IG1lbWQocHRyX2luKysjOCk7CisJa2VybmVsMSA9IGNtcC5ndHUoa2VybmVsLCAjMSk7Cit9OmVuZGxvb3AwCisuTGVwaWxvZzoKK3sKKwlub2VwaWxvZyA9IGNtcC5lcShlcGlsb2csIzApOworCWVwaWxvZ2R3cyA9IGxzcihlcGlsb2csICMzKTsKKwlrZXJuZWwgPSBhbmQoZXBpbG9nLCAjNyk7Cit9Cit7CisJaWYobm9lcGlsb2cpIGp1bXByIHIzMTsKKwlpZihub2VwaWxvZykgcHRyX291dCA9IHN1YihwdHJfb3V0LCBsZW4pOworCXAzID0gY21wLmVxKGVwaWxvZ2R3cywgIzApOworCXNoaWZ0MiA9IGFzbChlcGlsb2csICMzKTsKK30KK3sKKwlzaGlmdGIgPSBhbmQoc2hpZnQyLCAjMzIpOworCWlmd29yZCA9IHRzdGJpdChlcGlsb2csIzIpOworCWlmKHAzKSBqdW1wIC5MZXBpbG9nNjA7CisJaWYoIXAzKSBlcGlsb2cgPSBhZGQoZXBpbG9nLCAjLTE2KTsKK30KK3sKKwlsb29wMCguTGR3b3JkX2xvb3BfZXBpbG9nLCBlcGlsb2dkd3MpOworCS8qICBzdG9wIGNyaXRlcmlhIGlzIGxzYnMgdW5sZXNzID0gMCB0aGVuIGl0cyA4ICAqLworCXAzID0gY21wLmVxKGtlcm5lbCwgIzApOworCWlmKHAzLm5ldykga2VybmVsPSAjODsKKwlwMSA9IGNtcC5ndChvdmVyLCAjMCk7Cit9CisJLyogIGlmIG5vdCBhbGlnbmVkIHRvIGVuZCBvZiBidWZmZXIgZXhlY3V0ZSAxIG1vcmUgaXRlcmF0aW9uICAqLworCWlmKHAxKSBrZXJuZWw9ICMwOworLkxkd29yZF9sb29wX2VwaWxvZzoKK3sKKwltZW1kKHB0cl9vdXQrKyM4KSA9IGxkYXRhMDsKKwlsZGF0YTAgPSB2YWxpZ25iKGRhdGFGOCwgZGF0YTcwLCBhbGlnbik7CisJcDMgPSBjbXAuZ3QoZXBpbG9nLCBrZXJuZWwpOworfQoreworCWRhdGE3MCA9IGRhdGFGODsKKwlpZihwMykgZGF0YUY4ID0gbWVtZChwdHJfaW4rKyM4KTsKKwllcGlsb2cgPSBhZGQoZXBpbG9nLCAjLTgpOworfTplbmRsb29wMAorLyogY29weSBsYXN0IDcgYnl0ZXMgKi8KKy5MZXBpbG9nNjA6Cit7CisJaWYoaWZ3b3JkKSBtZW13KHB0cl9vdXQrKyM0KSA9IGRhdGEwOworCWxkYXRhMCA9IGxzcihsZGF0YTAsIHNoaWZ0Yik7CisJaWZod29yZCA9IHRzdGJpdChlcGlsb2csIzEpOworCXNoaWZ0YiA9IGFuZChzaGlmdDIsICMxNik7Cit9Cit7CisJaWYoaWZod29yZCkgbWVtaChwdHJfb3V0KysjMikgPSBkYXRhMDsKKwlsZGF0YTAgPSBsc3IobGRhdGEwLCBzaGlmdGIpOworCWlmYnl0ZSA9IHRzdGJpdChlcGlsb2csIzApOworCWlmKGlmYnl0ZS5uZXcpIGxlbiA9IGFkZChsZW4sICMtMSk7Cit9Cit7CisJaWYoaWZieXRlKSBtZW1iKHB0cl9vdXQpID0gZGF0YTA7CisJcHRyX291dCA9IHN1YihwdHJfb3V0LCBsZW4pOwkvKiAgcmV0dXJuIGRlc3QgcG9pbnRlciAgKi8KKyAgICAgICAganVtcHIgcjMxOworfQorLyogIGRvIGJ5dGUgY29weSBmb3Igc21hbGwgbiAgKi8KKy5MYnl0ZXMyM29ybGVzczoKK3sKKwlwMyA9IHNwMWxvb3AwKC5MYnl0ZV9jb3B5LCBsZW4pOworCWxlbiA9IGFkZChsZW4sICMtMSk7Cit9CisuTGJ5dGVfY29weToKK3sKKwlkYXRhMCA9IG1lbWIocHRyX2luKysjMSk7CisJaWYocDMpIG1lbWIocHRyX291dCsrIzEpID0gZGF0YTA7Cit9OmVuZGxvb3AwCit7CisJbWVtYihwdHJfb3V0KSA9IGRhdGEwOworCXB0cl9vdXQgPSBzdWIocHRyX291dCwgbGVuKTsKKwlqdW1wciByMzE7Cit9CisvKiAgZG8gZHdvcmQgY29waWVzIGZvciBhbGlnbmVkIGluLCBvdXQgYW5kIGxlbmd0aCAgKi8KKy5MZHdvcmRhbGlnbmVkOgoreworCXAzID0gc3AxbG9vcDAoLkxkd29yZF9jb3B5LCBsZW44KTsKK30KKy5MZHdvcmRfY29weToKK3sKKwlpZihwMykgbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTA7CisJbGRhdGEwID0gbWVtZChwdHJfaW4rKyM4KTsKK306ZW5kbG9vcDAKK3sKKwltZW1kKHB0cl9vdXQpID0gbGRhdGEwOworCXB0cl9vdXQgPSBzdWIocHRyX291dCwgbGVuKTsKKwlqdW1wciByMzE7CS8qICByZXR1cm4gdG8gZnVuY3Rpb24gY2FsbGVyICAqLworfQorLkxtZW1jcHlfcmV0dXJuOgorCXIyMToyMCA9IG1lbWQoc3ArIzE2KTsJLyogIHJlc3RvcmUgcjIwK3IyMSAgKi8KK3sKKwlyMjU6MjQgPSBtZW1kKHNwKyM4KTsJLyogIHJlc3RvcmUgcjI0K3IyNSAgKi8KKwlyMTc6MTYgPSBtZW1kKHNwKyMwKTsJLyogIHJlc3RvcmUgcjE2K3IxNyAgKi8KK30KKwlkZWFsbG9jZnJhbWU7CS8qICByZXN0b3JlIHIzMSBhbmQgaW5jcm1lbnQgc3RhY2sgYnkgMTYgICovCisJanVtcHIgcjMxCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbGliL21lbXNldC5TIGIvYXJjaC9oZXhhZ29uL2xpYi9tZW1zZXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmQ5NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2xpYi9tZW1zZXQuUwpAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworLyogSEVYQUdPTiBhc3NlbWJseSBvcHRpbWl6ZWQgbWVtc2V0ICovCisvKiBSZXBsYWNlcyB0aGUgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbiBtZW1zZXQgKi8KKworCisgICAgICAgIC5tYWNybyBIRVhBR09OX09QVF9GVU5DX0JFR0lOIG5hbWUKKwkudGV4dAorCS5wMmFsaWduIDQKKwkuZ2xvYmwgXG5hbWUKKwkudHlwZSAgXG5hbWUsIEBmdW5jdGlvbgorXG5hbWU6CisJLmVuZG0KKworCS5tYWNybyBIRVhBR09OX09QVF9GVU5DX0ZJTklTSCBuYW1lCisJLnNpemUgIFxuYW1lLCAuIC0gXG5hbWUKKwkuZW5kbQorCisvKiBGVU5DVElPTjogbWVtc2V0ICh2MiB2ZXJzaW9uKSAqLworI2lmIF9fSEVYQUdPTl9BUkNIX18gPCAzCitIRVhBR09OX09QVF9GVU5DX0JFR0lOIG1lbXNldAorCXsKKwkJcjYgPSAjOAorCQlyNyA9IGV4dHJhY3R1KHIwLCAjMyAsICMwKQorCQlwMCA9IGNtcC5lcShyMiwgIzApCisJCXAxID0gY21wLmd0dShyMiwgIzcpCisJfQorCXsKKwkJcjQgPSB2c3BsYXRiKHIxKQorCQlyOCA9IHIwICAgICAgICAgICAvKiBsZWF2ZSByMCBpbnRhY3QgZm9yIHJldHVybiB2YWwgICovCisJCXI5ID0gc3ViKHI2LCByNykgIC8qIGJ5dGVzIHVudGlsIGRvdWJsZSBhbGlnbm1lbnQgICovCisJCWlmIHAwIGp1bXByIHIzMSAgIC8qIGNvdW50ID09IDAsIHNvIHJldHVybiAgKi8KKwl9CisJeworCQlyMyA9ICMwCisJCXI3ID0gIzAKKwkJcDAgPSB0c3RiaXQocjksICMwKQorCQlpZiBwMSBqdW1wIDJmIC8qIHNraXAgYnl0ZSBsb29wICovCisJfQorCisvKiBsZXNzIHRoYW4gOCBieXRlcyB0byBzZXQsIHNvIGp1c3Qgc2V0IGEgYnl0ZSBhdCBhIHRpbWUgYW5kIHJldHVybiAgKi8KKworCQlsb29wMCgxZiwgcjIpIC8qIGJ5dGUgbG9vcCAqLworCS5mYWxpZ24KKzE6IC8qIGJ5dGUgbG9vcCAqLworCXsKKwkJbWVtYihyOCsrIzEpID0gcjQKKwl9OmVuZGxvb3AwCisJCWp1bXByIHIzMQorCS5mYWxpZ24KKzI6IC8qIHNraXAgYnl0ZSBsb29wICovCisJeworCQlyNiA9ICMxCisJCXAwID0gdHN0Yml0KHI5LCAjMSkKKwkJcDEgPSBjbXAuZXEocjIsICMxKQorCQlpZiAhcDAganVtcCAzZiAvKiBza2lwIGluaXRpYWwgYnl0ZSBzdG9yZSAqLworCX0KKwl7CisJCW1lbWIocjgrKyMxKSA9IHI0CisJCXIzOjIgPSBzdWIocjM6Miwgcjc6NikKKwkJaWYgcDEganVtcHIgcjMxCisJfQorCS5mYWxpZ24KKzM6IC8qIHNraXAgaW5pdGlhbCBieXRlIHN0b3JlICovCisJeworCQlyNiA9ICMyCisJCXAwID0gdHN0Yml0KHI5LCAjMikKKwkJcDEgPSBjbXAuZXEocjIsICMyKQorCQlpZiAhcDAganVtcCA0ZiAvKiBza2lwIGluaXRpYWwgaGFsZiBzdG9yZSAqLworCX0KKwl7CisJCW1lbWgocjgrKyMyKSA9IHI0CisJCXIzOjIgPSBzdWIocjM6Miwgcjc6NikKKwkJaWYgcDEganVtcHIgcjMxCisJfQorCS5mYWxpZ24KKzQ6IC8qIHNraXAgaW5pdGlhbCBoYWxmIHN0b3JlICovCisJeworCQlyNiA9ICM0CisJCXAwID0gY21wLmd0dShyMiwgIzcpCisJCXAxID0gY21wLmVxKHIyLCAjNCkKKwkJaWYgIXAwIGp1bXAgNWYgLyogc2tpcCBpbml0aWFsIHdvcmQgc3RvcmUgKi8KKwl9CisJeworCQltZW13KHI4KysjNCkgPSByNAorCQlyMzoyID0gc3ViKHIzOjIsIHI3OjYpCisJCXAwID0gY21wLmd0dShyMiwgIzExKQorCQlpZiBwMSBqdW1wciByMzEKKwl9CisJLmZhbGlnbgorNTogLyogc2tpcCBpbml0aWFsIHdvcmQgc3RvcmUgKi8KKwl7CisJCXIxMCA9IGxzcihyMiwgIzMpCisJCXAxID0gY21wLmVxKHIzLCAjMSkKKwkJaWYgIXAwIGp1bXAgN2YgLyogc2tpcCBkb3VibGUgbG9vcCAqLworCX0KKwl7CisJCXI1ID0gcjQKKwkJcjYgPSAjOAorCQlsb29wMCg2ZiwgcjEwKSAvKiBkb3VibGUgbG9vcCAqLworCX0KKworLyogc2V0IGJ5dGVzIGEgZG91YmxlIHdvcmQgYXQgYSB0aW1lICAqLworCisJLmZhbGlnbgorNjogLyogZG91YmxlIGxvb3AgKi8KKwl7CisJCW1lbWQocjgrKyM4KSA9IHI1OjQKKwkJcjM6MiA9IHN1YihyMzoyLCByNzo2KQorCQlwMSA9IGNtcC5lcShyMiwgIzgpCisJfTplbmRsb29wMAorCS5mYWxpZ24KKzc6IC8qIHNraXAgZG91YmxlIGxvb3AgKi8KKwl7CisJCXAwID0gdHN0Yml0KHIyLCAjMikKKwkJaWYgcDEganVtcHIgcjMxCisJfQorCXsKKwkJcjYgPSAjNAorCQlwMCA9IHRzdGJpdChyMiwgIzEpCisJCXAxID0gY21wLmVxKHIyLCAjNCkKKwkJaWYgIXAwIGp1bXAgOGYgLyogc2tpcCBmaW5hbCB3b3JkIHN0b3JlICovCisJfQorCXsKKwkJbWVtdyhyOCsrIzQpID0gcjQKKwkJcjM6MiA9IHN1YihyMzoyLCByNzo2KQorCQlpZiBwMSBqdW1wciByMzEKKwl9CisJLmZhbGlnbgorODogLyogc2tpcCBmaW5hbCB3b3JkIHN0b3JlICovCisJeworCQlwMSA9IGNtcC5lcShyMiwgIzIpCisJCWlmICFwMCBqdW1wIDlmIC8qIHNraXAgZmluYWwgaGFsZiBzdG9yZSAqLworCX0KKwl7CisJCW1lbWgocjgrKyMyKSA9IHI0CisJCWlmIHAxIGp1bXByIHIzMQorCX0KKwkuZmFsaWduCis5OiAvKiBza2lwIGZpbmFsIGhhbGYgc3RvcmUgKi8KKwl7CisJCW1lbWIocjgrKyMxKSA9IHI0CisJCWp1bXByIHIzMQorCX0KK0hFWEFHT05fT1BUX0ZVTkNfRklOSVNIIG1lbXNldAorI2VuZGlmCisKKworLyogIEZVTkNUSU9OOiBtZW1zZXQgKHYzIGFuZCBoaWdoZXIgdmVyc2lvbikgICovCisjaWYgX19IRVhBR09OX0FSQ0hfXyA+PSAzCitIRVhBR09OX09QVF9GVU5DX0JFR0lOIG1lbXNldAorCXsKKwkJcjc9dnNwbGF0YihyMSkKKwkJcjYgPSByMAorCQlpZiAocjI9PSMwKSBqdW1wOm50IC5MMQorCX0KKwl7CisJCXI1OjQ9Y29tYmluZShyNyxyNykKKwkJcDAgPSBjbXAuZ3R1KHIyLCM4KQorCQlpZiAocDAubmV3KSBqdW1wOm50IC5MMworCX0KKwl7CisJCXIzID0gcjAKKwkJbG9vcDAoLkw0NyxyMikKKwl9CisJLmZhbGlnbgorLkw0NzoKKwl7CisJCW1lbWIocjMrKyMxKSA9IHIxCisJfTplbmRsb29wMCAvKiBzdGFydD0uTDQ3ICovCisJCWp1bXByIHIzMQorLkwzOgorCXsKKwkJcDAgPSB0c3RiaXQocjAsIzApCisJCWlmICghcDAubmV3KSBqdW1wOm50IC5MOAorCQlwMSA9IGNtcC5lcShyMiwgIzEpCisJfQorCXsKKwkJcjYgPSBhZGQocjAsICMxKQorCQlyMiA9IGFkZChyMiwjLTEpCisJCW1lbWIocjApID0gcjEKKwkJaWYgKHAxKSBqdW1wIC5MMQorCX0KKy5MODoKKwl7CisJCXAwID0gdHN0Yml0KHI2LCMxKQorCQlpZiAoIXAwLm5ldykganVtcDpudCAuTDEwCisJfQorCXsKKwkJcjIgPSBhZGQocjIsIy0yKQorCQltZW1oKHI2KysjMikgPSByNworCQlwMCA9IGNtcC5lcShyMiwgIzIpCisJCWlmIChwMC5uZXcpIGp1bXA6bnQgLkwxCisJfQorLkwxMDoKKwl7CisJCXAwID0gdHN0Yml0KHI2LCMyKQorCQlpZiAoIXAwLm5ldykganVtcDpudCAuTDEyCisJfQorCXsKKwkJcjIgPSBhZGQocjIsIy00KQorCQltZW13KHI2KysjNCkgPSByNworCQlwMCA9IGNtcC5lcShyMiwgIzQpCisJCWlmIChwMC5uZXcpIGp1bXA6bnQgLkwxCisJfQorLkwxMjoKKwl7CisJCXAwID0gY21wLmd0dShyMiwjMTI3KQorCQlpZiAoIXAwLm5ldykganVtcDpudCAuTDE0CisJfQorCQlyMyA9IGFuZChyNiwjMzEpCisJCWlmIChyMz09IzApIGp1bXA6bnQgLkwxNworCXsKKwkJbWVtZChyNisrIzgpID0gcjU6NAorCQlyMiA9IGFkZChyMiwjLTgpCisJfQorCQlyMyA9IGFuZChyNiwjMzEpCisJCWlmIChyMz09IzApIGp1bXA6bnQgLkwxNworCXsKKwkJbWVtZChyNisrIzgpID0gcjU6NAorCQlyMiA9IGFkZChyMiwjLTgpCisJfQorCQlyMyA9IGFuZChyNiwjMzEpCisJCWlmIChyMz09IzApIGp1bXA6bnQgLkwxNworCXsKKwkJbWVtZChyNisrIzgpID0gcjU6NAorCQlyMiA9IGFkZChyMiwjLTgpCisJfQorLkwxNzoKKwl7CisJCXIzID0gbHNyKHIyLCM1KQorCQlpZiAocjEhPSMwKSBqdW1wOm50IC5MMTgKKwl9CisJeworCQlyOCA9IHIzCisJCXIzID0gcjYKKwkJbG9vcDAoLkw0NixyMykKKwl9CisJLmZhbGlnbgorLkw0NjoKKwl7CisJCWRjemVyb2EocjYpCisJCXI2ID0gYWRkKHI2LCMzMikKKwkJcjIgPSBhZGQocjIsIy0zMikKKwl9OmVuZGxvb3AwIC8qIHN0YXJ0PS5MNDYgKi8KKy5MMTQ6CisJeworCQlwMCA9IGNtcC5ndHUocjIsIzcpCisJCWlmICghcDAubmV3KSBqdW1wOm50IC5MMjgKKwkJcjggPSBsc3IocjIsIzMpCisJfQorCQlsb29wMCguTDQ0LHI4KQorCS5mYWxpZ24KKy5MNDQ6CisJeworCQltZW1kKHI2KysjOCkgPSByNTo0CisJCXIyID0gYWRkKHIyLCMtOCkKKwl9OmVuZGxvb3AwIC8qIHN0YXJ0PS5MNDQgKi8KKy5MMjg6CisJeworCQlwMCA9IHRzdGJpdChyMiwjMikKKwkJaWYgKCFwMC5uZXcpIGp1bXA6bnQgLkwzMworCX0KKwl7CisJCXIyID0gYWRkKHIyLCMtNCkKKwkJbWVtdyhyNisrIzQpID0gcjcKKwl9CisuTDMzOgorCXsKKwkJcDAgPSB0c3RiaXQocjIsIzEpCisJCWlmICghcDAubmV3KSBqdW1wOm50IC5MMzUKKwl9CisJeworCQlyMiA9IGFkZChyMiwjLTIpCisJCW1lbWgocjYrKyMyKSA9IHI3CisJfQorLkwzNToKKwkJcDAgPSBjbXAuZXEocjIsIzEpCisJCWlmIChwMCkgbWVtYihyNikgPSByMQorLkwxOgorCQlqdW1wciByMzEKKy5MMTg6CisJCWxvb3AwKC5MNDUscjMpCisJLmZhbGlnbgorLkw0NToKKwkJZGN6ZXJvYShyNikKKwl7CisJCW1lbWQocjYrKyM4KSA9IHI1OjQKKwkJcjIgPSBhZGQocjIsIy0zMikKKwl9CisJCW1lbWQocjYrKyM4KSA9IHI1OjQKKwkJbWVtZChyNisrIzgpID0gcjU6NAorCXsKKwkJbWVtZChyNisrIzgpID0gcjU6NAorCX06ZW5kbG9vcDAgLyogc3RhcnQ9Lkw0NSAgKi8KKwkJanVtcCAuTDE0CitIRVhBR09OX09QVF9GVU5DX0ZJTklTSCBtZW1zZXQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL21tL01ha2VmaWxlIGIvYXJjaC9oZXhhZ29uL21tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMGJlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbW0vTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjCisjIE1ha2VmaWxlIGZvciBIZXhhZ29uIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbQorIworCitvYmoteSA6PSBpbml0Lm8gcGdhbGxvYy5vIGlvcmVtYXAubyB1YWNjZXNzLm8gdm1fZmF1bHQubyBjYWNoZS5vCitvYmoteSArPSBjb3B5X3RvX3VzZXIubyBjb3B5X2Zyb21fdXNlci5vIHN0cm5sZW5fdXNlci5vIHZtX3RsYi5vCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vY2FjaGUuYyBiL2FyY2gvaGV4YWdvbi9tbS9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2Y2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbW0vY2FjaGUuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENhY2hlIG1hbmFnZW1lbnQgZnVuY3Rpb25zIGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorCisjZGVmaW5lIHNwYW5saW5lcyhzdGFydCwgZW5kKSBcCisJKCgoZW5kIC0gKHN0YXJ0ICYgfihMSU5FU0laRSAtIDEpKSkgPj4gTElORUJJVFMpICsgMSkKKwordm9pZCBmbHVzaF9kY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBsaW5lcyA9IHNwYW5saW5lcyhzdGFydCwgZW5kLTEpOworCXVuc2lnbmVkIGxvbmcgaSwgZmxhZ3M7CisKKwlzdGFydCAmPSB+KExJTkVTSVpFIC0gMSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGluZXM7IGkrKykgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIJZGNjbGVhbmludmEoJTApOwkiCisJCToKKwkJOiAiciIgKHN0YXJ0KQorCQkpOworCQlzdGFydCArPSBMSU5FU0laRTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCit2b2lkIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxpbmVzID0gc3BhbmxpbmVzKHN0YXJ0LCBlbmQtMSk7CisJdW5zaWduZWQgbG9uZyBpLCBmbGFnczsKKworCXN0YXJ0ICY9IH4oTElORVNJWkUgLSAxKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBsaW5lczsgaSsrKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJCSIJZGNjbGVhbmEoJTApOyAiCisJCQkiCWljaW52YSglMCk7CSIKKwkJCToKKwkJCTogInIiIChzdGFydCkKKwkJKTsKKwkJc3RhcnQgKz0gTElORVNJWkU7CisJfQorCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJImlzeW5jIgorCSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCit2b2lkIGhleGFnb25fY2xlYW5fZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgbGluZXMgPSBzcGFubGluZXMoc3RhcnQsIGVuZC0xKTsKKwl1bnNpZ25lZCBsb25nIGksIGZsYWdzOworCisJc3RhcnQgJj0gfihMSU5FU0laRSAtIDEpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IGxpbmVzOyBpKyspIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiCWRjY2xlYW5hKCUwKTsJIgorCQk6CisJCTogInIiIChzdGFydCkKKwkJKTsKKwkJc3RhcnQgKz0gTElORVNJWkU7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKwordm9pZCBoZXhhZ29uX2ludl9kY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBsaW5lcyA9IHNwYW5saW5lcyhzdGFydCwgZW5kLTEpOworCXVuc2lnbmVkIGxvbmcgaSwgZmxhZ3M7CisKKwlzdGFydCAmPSB+KExJTkVTSVpFIC0gMSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGluZXM7IGkrKykgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIJZGNpbnZhKCUwKTsJIgorCQk6CisJCTogInIiIChzdGFydCkKKwkJKTsKKwkJc3RhcnQgKz0gTElORVNJWkU7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisKKworLyoKKyAqIFRoaXMgaXMganVzdCByZWFsbHkgYnJ1dGFsIGFuZCBzaG91bGRuJ3QgYmUgdXNlZCBhbnl3YXlzLAorICogZXNwZWNpYWxseSBvbiBWMi4gIExlZnQgaGVyZSBqdXN0IGluIGNhc2UuCisgKi8KK3ZvaWQgZmx1c2hfY2FjaGVfYWxsX2hleGFnb24odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX3ZtY2FjaGVfaWNraWxsKCk7CisJX192bWNhY2hlX2Rja2lsbCgpOworCV9fdm1jYWNoZV9sMmtpbGwoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbWIoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9tbS9jb3B5X2Zyb21fdXNlci5TIGIvYXJjaC9oZXhhZ29uL21tL2NvcHlfZnJvbV91c2VyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViMWQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9tbS9jb3B5X2Zyb21fdXNlci5TCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogVXNlciBtZW1vcnkgY29weSBmdW5jdGlvbnMgZm9yIGtlcm5lbAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMgaW52b2x2ZXMgdmFsaWduYgorICogVGhlIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgb25seSBzcGVlZCB1cCBzcmMvZGVzdCBzaW1pbGFyIGFsaWdubWVudC4KKyAqLworCisvKgorICogQ29weSB0by9mcm9tIHVzZXIgYXJlIHRoZSBzYW1lLCBleGNlcHQgdGhhdCBmb3IgcGFja2V0cyB3aXRoIGEgbG9hZCBhbmQKKyAqIGEgc3RvcmUsIEkgZG9uJ3Qga25vdyBob3cgdG8gdGVsbCB3aGljaCBraW5kIG9mIGV4Y2VwdGlvbiB3ZSBnb3QuCisgKiBUaGVyZWZvcmUsIHdlIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb24sIGFuZCBoYW5kbGUgZmF1bHRpbmcgYWRkcmVzc2VzCisgKiBkaWZmZXJlbnRseSBmb3IgZWFjaCBmdW5jdGlvbgorICovCisKKy8qCisgKiBjb3B5IGZyb20gdXNlcjogbG9hZHMgY2FuIGZhdWx0CisgKi8KKyNkZWZpbmUgc3JjX3NhdiByMTMKKyNkZWZpbmUgZHN0X3NhdiByMTIKKyNkZWZpbmUgc3JjX2RzdF9zYXYgcjEzOjEyCisjZGVmaW5lIGRfZGJ1ZiByMTU6MTQKKyNkZWZpbmUgd19kYnVmIHIxNQorCisjZGVmaW5lIGRzdCByMAorI2RlZmluZSBzcmMgcjEKKyNkZWZpbmUgYnl0ZXMgcjIKKyNkZWZpbmUgbG9vcGNvdW50IHI1CisKKyNkZWZpbmUgRlVOQ05BTUUgX19jb3B5X2Zyb21fdXNlcl9oZXhhZ29uCisjaW5jbHVkZSAiY29weV91c2VyX3RlbXBsYXRlLlMiCisKKwkvKiBMT0FEIEZBVUxUUyBmcm9tIENPUFlfRlJPTV9VU0VSICovCisKKwkvKiBBbGlnbm1lbnQgbG9vcC4gIHIyIGhhcyBiZWVuIHVwZGF0ZWQuIFJldHVybiBpdC4gKi8KKwkuZmFsaWduCisxMDA5OgorMjAwOToKKzQwMDk6CisJeworCQlyMCA9IHIyCisJCWp1bXByIHIzMQorCX0KKwkvKiBOb3JtYWwgY29weSBsb29wcy4gRG8gZXBpbG9nLiBVc2Ugc3JjLXNyY19zYXYgdG8gY29tcHV0ZSBkaXN0YW5jZSAqLworCS8qIFggLSAoQSAtIEIpID09IFggKyBCIC0gQSAqLworCS5mYWxpZ24KKzgwODk6CisJeworCQltZW1kKGRzdCkgPSBkX2RidWYKKwkJcjIgKz0gc3ViKHNyY19zYXYsc3JjKQorCX0KKwl7CisJCXIwID0gcjIKKwkJanVtcHIgcjMxCisJfQorCS5mYWxpZ24KKzQwODk6CisJeworCQltZW13KGRzdCkgPSB3X2RidWYKKwkJcjIgKz0gc3ViKHNyY19zYXYsc3JjKQorCX0KKwl7CisJCXIwID0gcjIKKwkJanVtcHIgcjMxCisJfQorCS5mYWxpZ24KKzIwODk6CisJeworCQltZW1oKGRzdCkgPSB3X2RidWYKKwkJcjIgKz0gc3ViKHNyY19zYXYsc3JjKQorCX0KKwl7CisJCXIwID0gcjIKKwkJanVtcHIgcjMxCisJfQorCS5mYWxpZ24KKzEwODk6CisJeworCQltZW1iKGRzdCkgPSB3X2RidWYKKwkJcjIgKz0gc3ViKHNyY19zYXYsc3JjKQorCX0KKwl7CisJCXIwID0gcjIKKwkJanVtcHIgcjMxCisJfQorCisJLyogQ09QWSBGUk9NIFVTRVI6IG9ubHkgbG9hZHMgY2FuIGZhaWwgKi8KKworCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmxvbmcgMTAwMGIsMTAwOWIKKwkubG9uZyAyMDAwYiwyMDA5YgorCS5sb25nIDQwMDBiLDQwMDliCisJLmxvbmcgODA4MGIsODA4OWIKKwkubG9uZyA0MDgwYiw0MDg5YgorCS5sb25nIDIwODBiLDIwODliCisJLmxvbmcgMTA4MGIsMTA4OWIKKwkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9tbS9jb3B5X3RvX3VzZXIuUyBiL2FyY2gvaGV4YWdvbi9tbS9jb3B5X3RvX3VzZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjk3NDBlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL2NvcHlfdG9fdXNlci5TCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBVc2VyIG1lbW9yeSBjb3B5aW5nIHJvdXRpbmVzIGZvciB0aGUgSGV4YWdvbiBLZXJuZWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBUaGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMgaW52b2x2ZXMgdmFsaWduYgorICogVGhlIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgb25seSBzcGVlZCB1cCBzcmMvZGVzdCBzaW1pbGFyIGFsaWdubWVudC4KKyAqLworCisvKgorICogQ29weSB0by9mcm9tIHVzZXIgYXJlIHRoZSBzYW1lLCBleGNlcHQgdGhhdCBmb3IgcGFja2V0cyB3aXRoIGEgbG9hZCBhbmQKKyAqIGEgc3RvcmUsIEkgZG9uJ3Qga25vdyBob3cgdG8gdGVsbCB3aGljaCBraW5kIG9mIGV4Y2VwdGlvbiB3ZSBnb3QuCisgKiBUaGVyZWZvcmUsIHdlIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb24sIGFuZCBoYW5kbGUgZmF1bHRpbmcgYWRkcmVzc2VzCisgKiBkaWZmZXJlbnRseSBmb3IgZWFjaCBmdW5jdGlvbgorICovCisKKy8qCisgKiBjb3B5IHRvIHVzZXI6IHN0b3JlcyBjYW4gZmF1bHQKKyAqLworI2RlZmluZSBzcmNfc2F2IHIxMworI2RlZmluZSBkc3Rfc2F2IHIxMgorI2RlZmluZSBzcmNfZHN0X3NhdiByMTM6MTIKKyNkZWZpbmUgZF9kYnVmIHIxNToxNAorI2RlZmluZSB3X2RidWYgcjE1CisKKyNkZWZpbmUgZHN0IHIwCisjZGVmaW5lIHNyYyByMQorI2RlZmluZSBieXRlcyByMgorI2RlZmluZSBsb29wY291bnQgcjUKKworI2RlZmluZSBGVU5DTkFNRSBfX2NvcHlfdG9fdXNlcl9oZXhhZ29uCisjaW5jbHVkZSAiY29weV91c2VyX3RlbXBsYXRlLlMiCisKKwkvKiBTVE9SRSBGQVVMVFMgZnJvbSBDT1BZX1RPX1VTRVIgKi8KKwkuZmFsaWduCisxMTA5OgorMjEwOToKKzQxMDk6CisJLyogQWxpZ25tZW50IGxvb3AuICByMiBoYXMgYmVlbiB1cGRhdGVkLiAgUmV0dXJuIGl0LiAqLworCXsKKwkJcjAgPSByMgorCQlqdW1wciByMzEKKwl9CisJLyogTm9ybWFsIGNvcHkgbG9vcHMuICBVc2UgZHN0LWRzdF9zYXYgdG8gY29tcHV0ZSBkaXN0YW5jZSAqLworCS8qIGRzdCBob2xkcyBiZXN0IHdyaXRlLCBubyBuZWVkIHRvIHVud2luZCBhbnkgbG9vcHMgKi8KKwkvKiBYIC0gKEEgLSBCKSA9PSBYICsgQiAtIEEgKi8KKwkuZmFsaWduCis4MTg5OgorODE5OToKKzQxODk6Cis0MTk5OgorMjE4OToKKzIxOTk6CisxMTg5OgorMTE5OToKKwl7CisJCXIyICs9IHN1Yihkc3Rfc2F2LGRzdCkKKwl9CisJeworCQlyMCA9IHIyCisJCWp1bXByIHIzMQorCX0KKworCS8qIENPUFkgVE8gVVNFUjogb25seSBzdG9yZXMgY2FuIGZhaWwgKi8KKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5sb25nIDExMDBiLDExMDliCisJLmxvbmcgMjEwMGIsMjEwOWIKKwkubG9uZyA0MTAwYiw0MTA5YgorCS5sb25nIDgxODBiLDgxODliCisJLmxvbmcgODE5MGIsODE5OWIKKwkubG9uZyA0MTgwYiw0MTg5YgorCS5sb25nIDQxOTBiLDQxOTliCisJLmxvbmcgMjE4MGIsMjE4OWIKKwkubG9uZyAyMTkwYiwyMTk5YgorCS5sb25nIDExODBiLDExODliCisJLmxvbmcgMTE5MGIsMTE5OWIKKwkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9tbS9jb3B5X3VzZXJfdGVtcGxhdGUuUyBiL2FyY2gvaGV4YWdvbi9tbS9jb3B5X3VzZXJfdGVtcGxhdGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ3ZDdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL2NvcHlfdXNlcl90ZW1wbGF0ZS5TCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogTnVtZXJvbG9neToKKyAqIFdYWVoKKyAqIFc6IHdpZHRoIGluIGJ5dGVzCisgKiBYOiBMb2FkPTAsIFN0b3JlPTEKKyAqIFk6IExvY2F0aW9uIDA9cHJlYW1ibGUsOD1sb29wLDk9ZXBpbG9nCisgKiBaOiBMb2NhdGlvbj0wLGhhbmRsZXI9OQorICovCisJLnRleHQKKwkuZ2xvYmFsIEZVTkNOQU1FCisJLnR5cGUgRlVOQ05BTUUsIEBmdW5jdGlvbgorCS5wMmFsaWduIDUKK0ZVTkNOQU1FOgorCXsKKwkJcDAgPSBjbXAuZ3R1KGJ5dGVzLCMwKQorCQlpZiAoIXAwLm5ldykganVtcDpudCAuTGRvbmUKKwkJcjMgPSBvcihkc3Qsc3JjKQorCQlyNCA9IHhvcihkc3Qsc3JjKQorCX0KKwl7CisJCXAxID0gY21wLmd0dShieXRlcywjMTUpCisJCXAwID0gYml0c2NscihyMywjNykKKwkJaWYgKCFwMC5uZXcpIGp1bXA6bnQgLkxvb3Bfbm90X2FsaWduZWRfOAorCQlzcmNfZHN0X3NhdiA9IGNvbWJpbmUoc3JjLGRzdCkKKwl9CisKKwl7CisJCWxvb3Bjb3VudCA9IGxzcihieXRlcywjMykKKwkJaWYgKCFwMSkganVtcCAuTHNtYWxsCisJfQorCXAzPXNwMWxvb3AwKC5Mb29wOCxsb29wY291bnQpCisuTG9vcDg6Cis4MDgwOgorODE4MDoKKwl7CisJCWlmIChwMykgbWVtZChkc3QrKyM4KSA9IGRfZGJ1ZgorCQlkX2RidWYgPSBtZW1kKHNyYysrIzgpCisJfTplbmRsb29wMAorODE5MDoKKwl7CisJCW1lbWQoZHN0KysjOCkgPSBkX2RidWYKKwkJYnl0ZXMgLT0gYXNsKGxvb3Bjb3VudCwjMykKKwkJanVtcCAuTHNtYWxsCisJfQorCisuTG9vcF9ub3RfYWxpZ25lZF84OgorCXsKKwkJcDAgPSBiaXRzY2xyKHI0LCM3KQorCQlpZiAocDAubmV3KSBqdW1wOm50IC5MYWxpZ24KKwl9CisJeworCQlwMCA9IGJpdHNjbHIocjMsIzMpCisJCWlmICghcDAubmV3KSBqdW1wOm50IC5Mb29wX25vdF9hbGlnbmVkXzQKKwkJcDEgPSBjbXAuZ3R1KGJ5dGVzLCM3KQorCX0KKworCXsKKwkJaWYgKCFwMSkganVtcCAuTHNtYWxsCisJCWxvb3Bjb3VudCA9IGxzcihieXRlcywjMikKKwl9CisJcDM9c3AxbG9vcDAoLkxvb3A0LGxvb3Bjb3VudCkKKy5Mb29wNDoKKzQwODA6Cis0MTgwOgorCXsKKwkJaWYgKHAzKSBtZW13KGRzdCsrIzQpID0gd19kYnVmCisJCXdfZGJ1ZiA9IG1lbXcoc3JjKysjNCkKKwl9OmVuZGxvb3AwCis0MTkwOgorCXsKKwkJbWVtdyhkc3QrKyM0KSA9IHdfZGJ1ZgorCQlieXRlcyAtPSBhc2wobG9vcGNvdW50LCMyKQorCQlqdW1wIC5Mc21hbGwKKwl9CisKKy5Mb29wX25vdF9hbGlnbmVkXzQ6CisJeworCQlwMCA9IGJpdHNjbHIocjMsIzEpCisJCWlmICghcDAubmV3KSBqdW1wOm50IC5Mb29wX25vdF9hbGlnbmVkCisJCXAxID0gY21wLmd0dShieXRlcywjMykKKwl9CisKKwl7CisJCWlmICghcDEpIGp1bXAgLkxzbWFsbAorCQlsb29wY291bnQgPSBsc3IoYnl0ZXMsIzEpCisJfQorCXAzPXNwMWxvb3AwKC5Mb29wMixsb29wY291bnQpCisuTG9vcDI6CisyMDgwOgorMjE4MDoKKwl7CisJCWlmIChwMykgbWVtaChkc3QrKyMyKSA9IHdfZGJ1ZgorCQl3X2RidWYgPSBtZW11aChzcmMrKyMyKQorCX06ZW5kbG9vcDAKKzIxOTA6CisJeworCQltZW1oKGRzdCsrIzIpID0gd19kYnVmCisJCWJ5dGVzIC09IGFzbChsb29wY291bnQsIzEpCisJCWp1bXAgLkxzbWFsbAorCX0KKworLkxvb3Bfbm90X2FsaWduZWQ6IC8qIFdvcmtzIGZvciBhcyBzbWFsbCBhcyBvbmUgYnl0ZSAqLworCXAzPXNwMWxvb3AwKC5Mb29wMSxieXRlcykKKy5Mb29wMToKKzEwODA6CisxMTgwOgorCXsKKwkJaWYgKHAzKSBtZW1iKGRzdCsrIzEpID0gd19kYnVmCisJCXdfZGJ1ZiA9IG1lbXViKHNyYysrIzEpCisJfTplbmRsb29wMAorCS8qIERvbmUgKi8KKzExOTA6CisJeworCQltZW1iKGRzdCkgPSB3X2RidWYKKwkJanVtcHIgcjMxCisJCXIwID0gIzAKKwl9CisKKy5Mc21hbGw6CisJeworCQlwMCA9IGNtcC5ndHUoYnl0ZXMsIzApCisJCWlmIChwMC5uZXcpIGp1bXA6bnQgLkxvb3Bfbm90X2FsaWduZWQKKwl9CisuTGRvbmU6CisJeworCQlyMCA9ICMwCisJCWp1bXByIHIzMQorCX0KKwkuZmFsaWduCisuTGFsaWduOgorMTAwMDoKKwl7CisJCWlmIChwMC5uZXcpIHdfZGJ1ZiA9IG1lbXViKHNyYykKKwkJcDAgPSB0c3RiaXQoc3JjLCMwKQorCQlpZiAoIXAxKSBqdW1wIC5Mc21hbGwKKwl9CisxMTAwOgorCXsKKwkJaWYgKHAwKSBtZW1iKGRzdCsrIzEpID0gd19kYnVmCisJCWlmIChwMCkgYnl0ZXMgPSBhZGQoYnl0ZXMsIy0xKQorCQlpZiAocDApIHNyYyA9IGFkZChzcmMsIzEpCisJfQorMjAwMDoKKwl7CisJCWlmIChwMC5uZXcpIHdfZGJ1ZiA9IG1lbXVoKHNyYykKKwkJcDAgPSB0c3RiaXQoc3JjLCMxKQorCQlpZiAoIXAxKSBqdW1wIC5Mc21hbGwKKwl9CisyMTAwOgorCXsKKwkJaWYgKHAwKSBtZW1oKGRzdCsrIzIpID0gd19kYnVmCisJCWlmIChwMCkgYnl0ZXMgPSBhZGQoYnl0ZXMsIy0yKQorCQlpZiAocDApIHNyYyA9IGFkZChzcmMsIzIpCisJfQorNDAwMDoKKwl7CisJCWlmIChwMC5uZXcpIHdfZGJ1ZiA9IG1lbXcoc3JjKQorCQlwMCA9IHRzdGJpdChzcmMsIzIpCisJCWlmICghcDEpIGp1bXAgLkxzbWFsbAorCX0KKzQxMDA6CisJeworCQlpZiAocDApIG1lbXcoZHN0KysjNCkgPSB3X2RidWYKKwkJaWYgKHAwKSBieXRlcyA9IGFkZChieXRlcywjLTQpCisJCWlmIChwMCkgc3JjID0gYWRkKHNyYywjNCkKKwkJanVtcCBGVU5DTkFNRQorCX0KKwkuc2l6ZSBGVU5DTkFNRSwuLUZVTkNOQU1FCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vaW5pdC5jIGIvYXJjaC9oZXhhZ29uL21tL2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdkNzQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL2luaXQuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIE1lbW9yeSBzdWJzeXN0ZW0gaW5pdGlhbGl6YXRpb24gZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS92bV9tbXUuaD4KKworLyoKKyAqIERlZmluZSBhIHN0YXJ0cGcganVzdCBwYXN0IHRoZSBlbmQgb2YgdGhlIGtlcm5lbCBpbWFnZSBhbmQgYSBsYXN0cGcKKyAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGVuZCBvZiByZWFsIG9yIHNpbXVsYXRlZCBwbGF0Zm9ybSBtZW1vcnkuCisgKi8KKyNkZWZpbmUgYm9vdG1lbV9zdGFydHBnIChQRk5fVVAoKCh1bnNpZ25lZCBsb25nKSBfZW5kKSAtIFBBR0VfT0ZGU0VUKSkKKwordW5zaWduZWQgbG9uZyBib290bWVtX2xhc3RwZzsgIC8qICBTaG91bGQgYmUgc2V0IGJ5IHBsYXRmb3JtIGNvZGUgICovCisKKy8qICBTZXQgYXMgdmFyaWFibGUgdG8gbGltaXQgUE1EIGNvcGllcyAgKi8KK2ludCBtYXhfa2VybmVsX3NlZyA9IDB4MzAzOworCisvKiAgdGhpbmsgdGhpcyBzaG91bGQgYmUgKHBhZ2Vfc2l6ZS0xKSB0aGUgd2F5IGl0J3MgdXNlZC4uLiovCit1bnNpZ25lZCBsb25nIHplcm9fcGFnZV9tYXNrOworCisvKiAgaW5kaWNhdGUgcGZuJ3Mgb2YgaGlnaCBtZW1vcnkgICovCit1bnNpZ25lZCBsb25nIGhpZ2hzdGFydF9wZm4sIGhpZ2hlbmRfcGZuOworCisvKiBzdHJ1Y3QgbW11X2dhdGhlciBkZWZpbmVkIGluIGFzbS1nZW5lcmljLmg7ICAqLworREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKKworLyogRGVmYXVsdCBjYWNoZSBhdHRyaWJ1dGUgZm9yIG5ld2x5IGNyZWF0ZWQgcGFnZSB0YWJsZXMgKi8KK3Vuc2lnbmVkIGxvbmcgX2RmbHRfY2FjaGVfYXR0ID0gQ0FDSEVERUY7CisKKy8qCisgKiBUaGUgY3VycmVudCAiZ2VuZXJhdGlvbiIgb2Yga2VybmVsIG1hcCwgd2hpY2ggc2hvdWxkIG5vdCByb2xsCisgKiBvdmVyIHVudGlsIEhlbGwgZnJlZXplcyBvdmVyLiAgQWN0dWFsIGJvdW5kIGluIHllYXJzIG5lZWRzIHRvIGJlCisgKiBjYWxjdWxhdGVkIHRvIGNvbmZpcm0uCisgKi8KK0RFRklORV9TUElOTE9DSyhrbWFwX2dlbl9sb2NrKTsKKworLyogIGNoZWNrcGF0Y2ggc2F5cyBkb24ndCBpbml0IHRoaXMgdG8gMC4gICovCit1bnNpZ25lZCBsb25nIGxvbmcga21hcF9nZW5lcmF0aW9uOworCisvKgorICogbWVtX2luaXQgLSBpbml0aWFsaXplcyBtZW1vcnkKKyAqCisgKiBGcmVlcyB1cCBib290bWVtCisgKiBGaXhlcyB1cCBtb3JlIHN0dWZmIGZvciBISUdITUVNCisgKiBDYWxjdWxhdGVzIGFuZCBkaXNwbGF5cyBtZW1vcnkgYXZhaWxhYmxlL3VzZWQKKyAqLwordm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKK3sKKwkvKiAgTm8gaWRlYSB3aGVyZSB0aGlzIGlzIGFjdHVhbGx5IGRlY2xhcmVkLiAgU2VlbXMgdG8gZXZhZGUgTFhSLiAgKi8KKwl0b3RhbHJhbV9wYWdlcyArPSBmcmVlX2FsbF9ib290bWVtKCk7CisJbnVtX3BoeXNwYWdlcyA9IGJvb3RtZW1fbGFzdHBnOwkvKiAgc2VyaW91c2x5LCB3aGF0PyAgKi8KKworCXByaW50ayhLRVJOX0lORk8gInRvdGFscmFtX3BhZ2VzID0gJWxkXG4iLCB0b3RhbHJhbV9wYWdlcyk7CisKKwkvKgorCSAqICBUby1EbzogIHNvbWVvbmUgc29tZXdoZXJlIHNob3VsZCB3aXBlIG91dCB0aGUgYm9vdG1lbSBtYXAKKwkgKiAgYWZ0ZXIgd2UncmUgZG9uZT8KKwkgKi8KKworCS8qCisJICogVGhpcyBjYW4gYmUgbW92ZWQgdG8gc29tZSBtb3JlIHZpcnR1YWwtbWVtb3J5LXNwZWNpZmljCisJICogaW5pdGlhbGl6YXRpb24gaG9vayBhdCBzb21lIHBvaW50LiAgU2V0IHRoZSBpbml0X21tCisJICogZGVzY3JpcHRvcnMgImNvbnRleHQiIHZhbHVlIHRvIHBvaW50IHRvIHRoZSBpbml0aWFsCisJICoga2VybmVsIHNlZ21lbnQgdGFibGUncyBwaHlzaWNhbCBhZGRyZXNzLgorCSAqLworCWluaXRfbW0uY29udGV4dC5wdGJhc2UgPSBfX3BhKGluaXRfbW0ucGdkKTsKK30KKworLyoKKyAqIGZyZWVfaW5pdG1lbSAtIGZyZWVzIG1lbW9yeSB1c2VkIGJ5IHN0dWZmIGRlY2xhcmVkIHdpdGggX19pbml0CisgKgorICogVG9kbzogIGZyZWUgcGFnZXMgYmV0d2VlbiBfX2luaXRfYmVnaW4gYW5kIF9faW5pdF9lbmQ7IHBvc3NpYmx5CisgKiBzb21lIGRldnRyZWUgcmVsYXRlZCBzdHVmZiBhcyB3ZWxsLgorICovCit2b2lkIF9faW5pdF9yZWZvayBmcmVlX2luaXRtZW0odm9pZCkKK3sKK30KKworLyoKKyAqIGZyZWVfaW5pdHJkX21lbSAtIGZyZWVzLi4uICBpbml0cmQgbWVtb3J5LgorICogQHN0YXJ0IC0gc3RhcnQgb2YgaW5pdCBtZW1vcnkKKyAqIEBlbmQgLSBlbmQgb2YgaW5pdCBtZW1vcnkKKyAqCisgKiBBcHBhcmVudGx5IGhhcyB0byBiZSBwYXNzZWQgdGhlIGFkZHJlc3Mgb2YgdGhlIGluaXRyZCBtZW1vcnkuCisgKgorICogV3JhcHBlZCBieSAjaWZkZWYgQ09ORklHX0JMS0RFVl9JTklUUkQKKyAqLwordm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7Cit9CisKK3ZvaWQgc3luY19pY2FjaGVfZGNhY2hlKHB0ZV90IHB0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlwYWdlID0gcHRlX3BhZ2UocHRlKTsKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHBhZ2VfYWRkcmVzcyhwYWdlKTsKKworCV9fdm1jYWNoZV9pZHN5bmMoYWRkciwgUEFHRV9TSVpFKTsKK30KKworLyoKKyAqIEluIG9yZGVyIHRvIHNldCB1cCBwYWdlIGFsbG9jYXRvciAibm9kZXMiLAorICogc29tZWJvZHkgaGFzIHRvIGNhbGwgZnJlZV9hcmVhX2luaXQoKSBmb3IgVU1BLgorICoKKyAqIEluIHRoaXMgbW9kZSwgd2Ugb25seSBoYXZlIG9uZSBwZ19kYXRhX3QKKyAqIHN0cnVjdHVyZTogY29udGlnX21lbV9kYXRhLgorICovCit2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgem9uZXNfc2l6ZXNbTUFYX05SX1pPTkVTXSA9IHswLCB9OworCisJLyoKKwkgKiAgVGhpcyBpcyBub3QgcGFydGljdWxhcmx5IHdlbGwgZG9jdW1lbnRlZCBhbnl3aGVyZSwgYnV0CisJICogIGdpdmUgWk9ORV9OT1JNQUwgYWxsIHRoZSBtZW1vcnksIGluY2x1ZGluZyB0aGUgYmlnIGhvbGVzCisJICogIGxlZnQgYnkgdGhlIGtlcm5lbCtib290bWVtX21hcCB3aGljaCBhcmUgYWxyZWFkeSBsZWZ0IGFzIHJlc2VydmVkCisJICogIGluIHRoZSBib290bWVtX21hcDsgZnJlZV9hcmVhX2luaXQgc2hvdWxkIHNlZSB0aG9zZSBiaXRzIGFuZAorCSAqICBhZGp1c3QgYWNjb3JkaW5nbHkuCisJICovCisKKwl6b25lc19zaXplc1taT05FX05PUk1BTF0gPSBtYXhfbG93X3BmbjsKKworCWZyZWVfYXJlYV9pbml0KHpvbmVzX3NpemVzKTsgIC8qICBzZXRzIHVwIHRoZSB6b25lbGlzdHMgYW5kIG1lbV9tYXAgICovCisKKwkvKgorCSAqIFN0YXJ0IG9mIGhpZ2ggbWVtb3J5IGFyZWEuICBXaWxsIHByb2JhYmx5IG5lZWQgc29tZXRoaW5nIG1vcmUKKwkgKiBmYW5jeSBpZiB3ZS4uLiAgZ2V0IG1vcmUgZmFuY3kuCisJICovCisJaGlnaF9tZW1vcnkgPSAodm9pZCAqKSgoYm9vdG1lbV9sYXN0cGcgKyAxKSA8PCBQQUdFX1NISUZUKTsKK30KKworI2lmbmRlZiBETUFfUkVTRVJWRQorI2RlZmluZSBETUFfUkVTRVJWRQkJKDQpCisjZW5kaWYKKworI2RlZmluZSBETUFfQ0hVTktTSVpFCQkoMTw8MjIpCisjZGVmaW5lIERNQV9SRVNFUlZFRF9CWVRFUwkoRE1BX1JFU0VSVkUgKiBETUFfQ0hVTktTSVpFKQorCisvKgorICogUGljayBvdXQgdGhlIG1lbW9yeSBzaXplLiAgV2UgbG9vayBmb3IgbWVtPXNpemUsCisgKiB3aGVyZSBzaXplIGlzICJzaXplW0trTW1dIgorICovCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9tZW0oY2hhciAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY2hhciAqZW5kcDsKKworCXNpemUgPSBtZW1wYXJzZShwLCAmZW5kcCk7CisKKwlib290bWVtX2xhc3RwZyA9IFBGTl9ET1dOKHNpemUpOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibWVtIiwgZWFybHlfbWVtKTsKKworc2l6ZV90IGhleGFnb25fY29oZXJlbnRfcG9vbF9zaXplID0gKHNpemVfdCkgKERNQV9SRVNFUlZFIDw8IDIyKTsKKwordm9pZCBfX2luaXQgc2V0dXBfYXJjaF9tZW1vcnkodm9pZCkKK3sKKwlpbnQgYm9vdG1hcF9zaXplOworCS8qICBYWFggVG9kbzogdGhpcyBwcm9iYWJseSBzaG91bGQgYmUgY2xlYW5lZCB1cCAgKi8KKwl1MzIgKnNlZ3RhYmxlID0gKHUzMiAqKSAmc3dhcHBlcl9wZ19kaXJbMF07CisJdTMyICpzZWd0YWJsZV9lbmQ7CisKKwkvKgorCSAqIFNldCB1cCBib290IG1lbW9yeSBhbGxvY2F0b3IKKwkgKgorCSAqIFRoZSBHb3JtYW4gYm9vayBhbHNvIHRhbGtzIGFib3V0IHRoZXNlIGZ1bmN0aW9ucy4KKwkgKiBUaGlzIG5lZWRzIHRvIGNoYW5nZSBmb3IgaGlnaG1lbSBzZXR1cHMuCisJICovCisKKwkvKiBNZW1vcnkgc2l6ZSBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDE2TSAqLworCWJvb3RtZW1fbGFzdHBnID0gUEZOX0RPV04oKGJvb3RtZW1fbGFzdHBnIDw8IFBBR0VfU0hJRlQpICYKKwkJfigoQklHX0tFUk5FTF9QQUdFX1NJWkUpIC0gMSkpOworCisJLyoKKwkgKiBSZXNlcnZlIHRoZSB0b3AgRE1BX1JFU0VSVkUgYnl0ZXMgb2YgUkFNIGZvciBETUEgKHVuY2FjaGVkKQorCSAqIG1lbW9yeSBhbGxvY2F0aW9uCisJICovCisJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtKGJvb3RtZW1fc3RhcnRwZywgYm9vdG1lbV9sYXN0cGcgLQorCQkJCSAgICBQRk5fRE9XTihETUFfUkVTRVJWRURfQllURVMpKTsKKworCXByaW50ayhLRVJOX0lORk8gImJvb3RtZW1fc3RhcnRwZzogIDB4JTA4bHhcbiIsIGJvb3RtZW1fc3RhcnRwZyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiYm9vdG1lbV9sYXN0cGc6ICAweCUwOGx4XG4iLCBib290bWVtX2xhc3RwZyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiYm9vdG1hcF9zaXplOiAgJWRcbiIsIGJvb3RtYXBfc2l6ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAibWF4X2xvd19wZm46ICAweCUwOGx4XG4iLCBtYXhfbG93X3Bmbik7CisKKwkvKgorCSAqIFRoZSBkZWZhdWx0IFZNIHBhZ2UgdGFibGVzICh3aWxsIGJlKSBwb3B1bGF0ZWQgd2l0aAorCSAqIFZBPVBBK1BBR0VfT0ZGU0VUIG1hcHBpbmcuICBXZSBnbyBpbiBhbmQgaW52YWxpZGF0ZSBlbnRyaWVzCisJICogaGlnaGVyIHRoYW4gd2hhdCB3ZSBoYXZlIG1lbW9yeSBmb3IuCisJICovCisKKwkvKiAgdGhpcyBpcyBwb2ludGVyIGFyaXRobWV0aWM7IGVhY2ggZW50cnkgY292ZXJzIDRNQiAgKi8KKwlzZWd0YWJsZSA9IHNlZ3RhYmxlICsgKFBBR0VfT0ZGU0VUID4+IDIyKTsKKworCS8qICB0aGlzIGFjdHVhbGx5IG9ubHkgZ29lcyB0byB0aGUgZW5kIG9mIHRoZSBmaXJzdCBnaWcgICovCisJc2VndGFibGVfZW5kID0gc2VndGFibGUgKyAoMTw8KDMwLTIyKSk7CisKKwkvKiAgTW92ZSBmb3J3YXJkIHRvIHRoZSBzdGFydCBvZiBlbXB0eSBwYWdlcyAgKi8KKwlzZWd0YWJsZSArPSBib290bWVtX2xhc3RwZyA+PiAoMjItUEFHRV9TSElGVCk7CisKKwl7CisJICAgIGludCBpOworCisJICAgIGZvciAoaSA9IDEgOyBpIDw9IERNQV9SRVNFUlZFIDsgaSsrKQorCQlzZWd0YWJsZVstaV0gPSAoKHNlZ3RhYmxlWy1pXSAmIF9fSFZNX1BURV9QR01BU0tfNE1CKQorCQkJCXwgX19IVk1fUFRFX1IgfCBfX0hWTV9QVEVfVyB8IF9fSFZNX1BURV9YCisJCQkJfCBfX0hFWEFHT05fQ19VTkMgPDwgNgorCQkJCXwgX19IVk1fUERFX1NfNE1CKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJjbGVhcmluZyBzZWd0YWJsZSBmcm9tICVwIHRvICVwXG4iLCBzZWd0YWJsZSwKKwkJc2VndGFibGVfZW5kKTsKKwl3aGlsZSAoc2VndGFibGUgPCAoc2VndGFibGVfZW5kLTgpKQorCQkqKHNlZ3RhYmxlKyspID0gX19IVk1fUERFX1NfSU5WQUxJRDsKKwkvKiBzdG9wIHRoZSBwb2ludGVyIGF0IHRoZSBkZXZpY2UgSS9PIDRNQiBwYWdlICAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAic2VndGFibGUgPSAlcCAoc2hvdWxkIGJlIGVxdWFsIHRvIF9LX2lvX21hcClcbiIsCisJCXNlZ3RhYmxlKTsKKworI2lmIDAKKwkvKiAgT3RoZXIgaGFsZiBvZiB0aGUgZWFybHkgZGV2aWNlIHRhYmxlIGZyb20gdm1faW5pdF9zZWd0YWJsZS4gKi8KKwlwcmludGsoS0VSTl9JTkZPICImX0tfaW5pdF9kZXZpY2V0YWJsZSA9IDB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpIF9LX2luaXRfZGV2aWNldGFibGUtUEFHRV9PRkZTRVQpOworCSpzZWd0YWJsZSA9ICgodTMyKSAodW5zaWduZWQgbG9uZykgX0tfaW5pdF9kZXZpY2V0YWJsZS1QQUdFX09GRlNFVCkgfAorCQlfX0hWTV9QREVfU180S0I7CisJcHJpbnRrKEtFUk5fSU5GTyAiKnNlZ3RhYmxlID0gMHglMDh4XG4iLCAqc2VndGFibGUpOworI2VuZGlmCisKKwkvKgorCSAqIEZyZWUgYWxsIHRoZSBtZW1vcnkgdGhhdCB3YXNuJ3QgdGFrZW4gdXAgYnkgdGhlIGJvb3RtYXAsIHRoZSBETUEKKwkgKiByZXNlcnZlLCBvciBrZXJuZWwgaXRzZWxmLgorCSAqLworCWZyZWVfYm9vdG1lbShQRk5fUEhZUyhib290bWVtX3N0YXJ0cGcpK2Jvb3RtYXBfc2l6ZSwKKwkJICAgICBQRk5fUEhZUyhib290bWVtX2xhc3RwZyAtIGJvb3RtZW1fc3RhcnRwZykgLSBib290bWFwX3NpemUgLQorCQkgICAgIERNQV9SRVNFUlZFRF9CWVRFUyk7CisKKwkvKgorCSAqICBUaGUgYm9vdG1lbSBhbGxvY2F0b3Igc2VlbWluZ2x5IGp1c3QgbGl2ZXMgdG8gZmVlZCBtZW1vcnkKKwkgKiAgdG8gdGhlIHBhZ2luZyBzeXN0ZW0KKwkgKi8KKwlwcmludGsoS0VSTl9JTkZPICJQQUdFX1NJWkU9JWx1XG4iLCBQQUdFX1NJWkUpOworCXBhZ2luZ19pbml0KCk7ICAvKiAgU2VlIEdvcm1hbiBCb29rLCAyLjMgICovCisKKwkvKgorCSAqICBBdCB0aGlzIHBvaW50LCB0aGUgcGFnZSBhbGxvY2F0b3IgaXMga2luZCBvZiBpbml0aWFsaXplZCwgYnV0CisJICogIGFwcGFyZW50bHkgbm8gcGFnZXMgYXJlIGF2YWlsYWJsZSAoanVzdCBsaWtlIHdpdGggdGhlIGJvb3RtZW0KKwkgKiAgYWxsb2NhdG9yKSwgYW5kIG5lZWQgdG8gYmUgZnJlZWQgdGhlbXNlbHZlcyB2aWEgbWVtX2luaXQoKSwKKwkgKiAgd2hpY2ggaXMgY2FsbGVkIGJ5IHN0YXJ0X2tlcm5lbCgpIGxhdGVyIG9uIGluIHRoZSBwcm9jZXNzCisJICovCit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vaW9yZW1hcC5jIGIvYXJjaC9oZXhhZ29uL21tL2lvcmVtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTM3YmMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL2lvcmVtYXAuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogSS9PIHJlbWFwIGZ1bmN0aW9ucyBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKwordm9pZCBfX2lvbWVtICppb3JlbWFwX25vY2FjaGUodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxhc3RfYWRkciwgYWRkcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBoeXNfYWRkciAmIH5QQUdFX01BU0s7CisJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKKworCXBncHJvdF90IHByb3QgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UfF9QQUdFX1JFQUR8X1BBR0VfV1JJVEUKKwkJCQkJfChfX0hFWEFHT05fQ19ERVYgPDwgNikpOworCisJbGFzdF9hZGRyID0gcGh5c19hZGRyICsgc2l6ZSAtIDE7CisKKwkvKiAgV3JhcHBpbmcgbm90IGFsbG93ZWQgICovCisJaWYgKCFzaXplIHx8IChsYXN0X2FkZHIgPCBwaHlzX2FkZHIpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qICBSb3VuZHMgdXAgdG8gbmV4dCBwYWdlIHNpemUsIGluY2x1ZGluZyB3aG9sZS1wYWdlIG9mZnNldCAqLworCXNpemUgPSBQQUdFX0FMSUdOKG9mZnNldCArIHNpemUpOworCisJYXJlYSA9IGdldF92bV9hcmVhKHNpemUsIFZNX0lPUkVNQVApOworCWFkZHIgPSAodW5zaWduZWQgbG9uZylhcmVhLT5hZGRyOworCisJaWYgKGlvcmVtYXBfcGFnZV9yYW5nZShhZGRyLCBhZGRyK3NpemUsIHBoeXNfYWRkciwgcHJvdCkpIHsKKwkJdnVubWFwKCh2b2lkICopYWRkcik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAodm9pZCBfX2lvbWVtICopIChvZmZzZXQgKyBhZGRyKTsKK30KKwordm9pZCBfX2lvdW5tYXAoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXZ1bm1hcCgodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGFkZHIgJiBQQUdFX01BU0spKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9tbS9wZ2FsbG9jLmMgYi9hcmNoL2hleGFnb24vbW0vcGdhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzVlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbW0vcGdhbGxvYy5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCit2b2lkIF9faW5pdCBwZ3RhYmxlX2NhY2hlX2luaXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9tbS9zdHJubGVuX3VzZXIuUyBiL2FyY2gvaGV4YWdvbi9tbS9zdHJubGVuX3VzZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzZhMTZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL3N0cm5sZW5fdXNlci5TCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogVXNlciBzdHJpbmcgbGVuZ3RoIGZ1bmN0aW9ucyBmb3Iga2VybmVsCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2RlZmluZSBpc3JjCXIwCisjZGVmaW5lIG1heAlyMQkvKiAgRG8gbm90IGNoYW5nZSEgICovCisKKyNkZWZpbmUgZW5kCXIyCisjZGVmaW5lIHRtcDEJcjMKKworI2RlZmluZSBvYm8JcjYJLyogIG9mZi1ieS1vbmUgICovCisjZGVmaW5lIHN0YXJ0CXI3CisjZGVmaW5lIG1vZDgJcjgKKyNkZWZpbmUgZGJ1ZiAgICByMTU6MTQKKyNkZWZpbmUgZGNtcAlyMTM6MTIKKworLyoKKyAqIFRoZSB2ZWN0b3IgbWFzayB2ZXJzaW9uIG9mIHRoaXMgdHVybmVkIG91dCAqcmVhbGx5KiBiYWRseS4KKyAqIFRoZSBoYXJkd2FyZSBsb29wIHZlcnNpb24gYWxzbyB0dXJuZWQgb3V0ICpyZWFsbHkqIGJhZGx5LgorICogU2VlbXMgc3RyYWlnaHQgcG9pbnRlciBhcml0aG1ldGljIGJhc2ljYWxseSB3aW5zIGhlcmUuCisgKi8KKworI2RlZmluZSBmbmFtZSBfX3N0cm5sZW5fdXNlcgorCisJLnRleHQKKwkuZ2xvYmFsIGZuYW1lCisJLnR5cGUgZm5hbWUsIEBmdW5jdGlvbgorCS5wMmFsaWduIDUgIC8qICB3aHk/ICAqLworZm5hbWU6CisJeworCQltb2Q4ID0gYW5kKGlzcmMsIzcpOworCQllbmQgPSBhZGQoaXNyYyxtYXgpOworCQlzdGFydCA9IGlzcmM7CisJfQorCXsKKwkJUDAgPSBjbXAuZXEobW9kOCwjMCk7CisJCW1vZDggPSBhbmQoZW5kLCM3KTsKKwkJZGNtcCA9ICMwOworCQlpZiAoUDAubmV3KSBqdW1wOnQgZHdfbG9vcDsJLyogIGZpcmUgdXAgdGhlIG92ZW4gICovCisJfQorCithbGlnbm1lbnRfbG9vcDoKK2ZhaWxfMToJeworCQl0bXAxID0gbWVtYihzdGFydCsrIzEpOworCX0KKwl7CisJCVAwID0gY21wLmVxKHRtcDEsIzApOworCQlpZiAoUDAubmV3KSBqdW1wOm50IGV4aXRfZm91bmQ7CisJCVAxID0gY21wLmd0dShlbmQsc3RhcnQpOworCQltb2Q4ID0gYW5kKHN0YXJ0LCM3KTsKKwl9CisJeworCQlpZiAoIVAxKSBqdW1wIGV4aXRfZXJyb3I7ICAvKiAgaGl0IHRoZSBlbmQgICovCisJCVAwID0gY21wLmVxKG1vZDgsIzApOworCX0KKwl7CisJCWlmICghUDApIGp1bXAgYWxpZ25tZW50X2xvb3A7CisJfQorCisKKworZHdfbG9vcDoKK2ZhaWxfMjoJeworCQlkYnVmID0gbWVtZChzdGFydCk7CisJCW9ibyA9IGFkZChzdGFydCwjMSk7CisJfQorCXsKKwkJUDAgPSB2Y21wYi5lcShkYnVmLGRjbXApOworCX0KKwl7CisJCXRtcDEgPSBQMDsKKwkJUDAgPSBjbXAuZ3R1KGVuZCxzdGFydCk7CisJfQorCXsKKwkJdG1wMSA9IGN0MCh0bXAxKTsKKwkJbW9kOCA9IGFuZChlbmQsIzcpOworCQlpZiAoIVAwKSBqdW1wIGVuZF9jaGVjazsKKwl9CisJeworCQlQMCA9IGNtcC5lcSh0bXAxLCMzMik7CisJCWlmICghUDAubmV3KSBqdW1wOm50IGV4aXRfZm91bmQ7CisJCWlmICghUDAubmV3KSBzdGFydCA9IGFkZChvYm8sdG1wMSk7CisJfQorCXsKKwkJc3RhcnQgPSBhZGQoc3RhcnQsIzgpOworCQlqdW1wIGR3X2xvb3A7CisJfQkvKiAgbWlnaHQgYmUgbmljZSB0byBjb21iaW5lIHRoZXNlIGp1bXBzLi4uICAgKi8KKworCitlbmRfY2hlY2s6CisJeworCQlQMCA9IGNtcC5ndCh0bXAxLG1vZDgpOworCQlpZiAoUDAubmV3KSBqdW1wOm50IGV4aXRfZXJyb3I7CS8qICBuZXZlcmZvdW5kISAgKi8KKwkJc3RhcnQgPSBhZGQob2JvLHRtcDEpOworCX0KKworZXhpdF9mb3VuZDoKKwl7CisJCVIwID0gc3ViKHN0YXJ0LGlzcmMpOworCQlqdW1wciBSMzE7CisJfQorCitleGl0X2Vycm9yOgorCXsKKwkJUjAgPSBhZGQobWF4LCMxKTsKKwkJanVtcHIgUjMxOworCX0KKworCS8qICBVaCwgd2hhdCBkb2VzIHRoZSAiZml4dXAiIHJldHVybiBoZXJlPyAgKi8KKwkuZmFsaWduCitmaXhfMToKKwl7CisJCVIwID0gIzA7CisJCWp1bXByIFIzMTsKKwl9CisKKwkuc2l6ZSBmbmFtZSwuLWZuYW1lCisKKworLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKy5sb25nIGZhaWxfMSxmaXhfMQorLmxvbmcgZmFpbF8yLGZpeF8xCisucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9tbS91YWNjZXNzLmMgYi9hcmNoL2hleGFnb24vbW0vdWFjY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDgxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbW0vdWFjY2Vzcy5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogU3VwcG9ydCBmb3IgdXNlciBtZW1vcnkgYWNjZXNzIGZyb20ga2VybmVsLiAgVGhpcyB3aWxsCisgKiBwcm9iYWJseSBiZSBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZSBhdCBzb21lIHBvaW50LCBidXQKKyAqIGZvciBlYXNlIG9mIGRlYnVnLCBhbmQgdG8gYSBsZXNzZXIgZGVncmVlIGZvciBjb2RlIHNpemUsCisgKiB3ZSBpbXBsZW1lbnQgaGVyZSBhcyBzdWJyb3V0aW5lcy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisvKgorICogRm9yIGNsZWFyX3VzZXIoKSwgZXhwbG9pdCBwcmV2aW91c2x5IGRlZmluZWQgY29weV90b191c2VyIGZ1bmN0aW9uCisgKiBhbmQgdGhlIGZhY3QgdGhhdCB3ZSd2ZSBnb3QgYSBoYW5keSB6ZXJvIHBhZ2UgZGVmaW5lZCBpbiBrZXJuZWwvaGVhZC5TCisgKgorICogZGN6ZXJvIGhlcmUgd291bGQgYmUgZXZlbiBmYXN0ZXIuCisgKi8KK19fa2VybmVsX3NpemVfdCBfX2NsZWFyX3VzZXJfaGV4YWdvbih2b2lkIF9fdXNlciAqZGVzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlsb25nIHVuY2xlYXJlZDsKKworCXdoaWxlIChjb3VudCA+IFBBR0VfU0laRSkgeworCQl1bmNsZWFyZWQgPSBfX2NvcHlfdG9fdXNlcl9oZXhhZ29uKGRlc3QsICZlbXB0eV96ZXJvX3BhZ2UsCisJCQkJCQlQQUdFX1NJWkUpOworCQlpZiAodW5jbGVhcmVkKQorCQkJcmV0dXJuIGNvdW50IC0gKFBBR0VfU0laRSAtIHVuY2xlYXJlZCk7CisJCWNvdW50IC09IFBBR0VfU0laRTsKKwkJZGVzdCArPSBQQUdFX1NJWkU7CisJfQorCWlmIChjb3VudCkKKwkJY291bnQgPSBfX2NvcHlfdG9fdXNlcl9oZXhhZ29uKGRlc3QsICZlbXB0eV96ZXJvX3BhZ2UsIGNvdW50KTsKKworCXJldHVybiBjb3VudDsKK30KKwordW5zaWduZWQgbG9uZyBjbGVhcl91c2VyX2hleGFnb24odm9pZCBfX3VzZXIgKmRlc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkZXN0LCBjb3VudCkpCisJCXJldHVybiBjb3VudDsKKwllbHNlCisJCXJldHVybiBfX2NsZWFyX3VzZXJfaGV4YWdvbihkZXN0LCBjb3VudCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vdm1fZmF1bHQuYyBiL2FyY2gvaGV4YWdvbi9tbS92bV9mYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMGI3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbW0vdm1fZmF1bHQuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIE1lbW9yeSBmYXVsdCBoYW5kbGluZyBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFBhZ2UgZmF1bHQgaGFuZGxpbmcgZm9yIHRoZSBIZXhhZ29uIFZpcnR1YWwgTWFjaGluZS4KKyAqIENhbiBhbHNvIGJlIGNhbGxlZCBieSBhIG5hdGl2ZSBwb3J0IGVtdWxhdGluZyB0aGUgSFZNCisgKiBleGVjcHRpb25zLgorICovCisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisKKy8qCisgKiBEZWNvZGUgb2YgaGFyZHdhcmUgZXhjZXB0aW9uIHNlbmRzIHVzIHRvIG9uZSBvZiBzZXZlcmFsCisgKiBlbnRyeSBwb2ludHMuICBBdCBlYWNoLCB3ZSBnZW5lcmF0ZSBjYW5vbmljYWwgYXJndW1lbnRzCisgKiBmb3IgaGFuZGxpbmcgYnkgdGhlIGFic3RyYWN0IG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUuCisgKi8KKyNkZWZpbmUgRkxUX0lGRVRDSCAgICAgLTEKKyNkZWZpbmUgRkxUX0xPQUQgICAgICAgIDAKKyNkZWZpbmUgRkxUX1NUT1JFICAgICAgIDEKKworCisvKgorICogQ2Fub25pY2FsIHBhZ2UgZmF1bHQgaGFuZGxlcgorICovCit2b2lkIGRvX3BhZ2VfZmF1bHQodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBsb25nIGNhdXNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXNpZ2luZm9fdCBpbmZvOworCWludCBzaV9jb2RlID0gU0VHVl9NQVBFUlI7CisJaW50IGZhdWx0OworCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeHVwOworCisJLyoKKwkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQgb3IgaGF2ZSBubyB1c2VyIGNvbnRleHQsCisJICogdGhlbiBtdXN0IG5vdCB0YWtlIHRoZSBmYXVsdC4KKwkgKi8KKwlpZiAodW5saWtlbHkoaW5faW50ZXJydXB0KCkgfHwgIW1tKSkKKwkJZ290byBub19jb250ZXh0OworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyZXNzKTsKKwlpZiAoIXZtYSkKKwkJZ290byBiYWRfYXJlYTsKKworCWlmICh2bWEtPnZtX3N0YXJ0IDw9IGFkZHJlc3MpCisJCWdvdG8gZ29vZF9hcmVhOworCisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX0dST1dTRE9XTikpCisJCWdvdG8gYmFkX2FyZWE7CisKKwlpZiAoZXhwYW5kX3N0YWNrKHZtYSwgYWRkcmVzcykpCisJCWdvdG8gYmFkX2FyZWE7CisKK2dvb2RfYXJlYToKKwkvKiBBZGRyZXNzIHNwYWNlIGlzIE9LLiAgTm93IGNoZWNrIGFjY2VzcyByaWdodHMuICovCisJc2lfY29kZSA9IFNFR1ZfQUNDRVJSOworCisJc3dpdGNoIChjYXVzZSkgeworCWNhc2UgRkxUX0lGRVRDSDoKKwkJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpKQorCQkJZ290byBiYWRfYXJlYTsKKwkJYnJlYWs7CisJY2FzZSBGTFRfTE9BRDoKKwkJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpKQorCQkJZ290byBiYWRfYXJlYTsKKwkJYnJlYWs7CisJY2FzZSBGTFRfU1RPUkU6CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCQlnb3RvIGJhZF9hcmVhOworCQlicmVhazsKKwl9CisKKwlmYXVsdCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBhZGRyZXNzLCAoY2F1c2UgPiAwKSk7CisKKwkvKiBUaGUgbW9zdCBjb21tb24gY2FzZSAtLSB3ZSBhcmUgZG9uZS4gKi8KKwlpZiAobGlrZWx5KCEoZmF1bHQgJiBWTV9GQVVMVF9FUlJPUikpKSB7CisJCWlmIChmYXVsdCAmIFZNX0ZBVUxUX01BSk9SKQorCQkJY3VycmVudC0+bWFqX2ZsdCsrOworCQllbHNlCisJCQljdXJyZW50LT5taW5fZmx0Kys7CisKKwkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkJcmV0dXJuOworCX0KKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwkvKiBIYW5kbGUgY29weWluL291dCBleGNlcHRpb24gY2FzZXMgKi8KKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJZ290byBub19jb250ZXh0OworCisJaWYgKGZhdWx0ICYgVk1fRkFVTFRfT09NKSB7CisJCXBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBVc2VyLW1vZGUgYWRkcmVzcyBpcyBpbiB0aGUgbWVtb3J5IG1hcCwgYnV0IHdlIGFyZQorCSAqIHVuYWJsZSB0byBmaXggdXAgdGhlIHBhZ2UgZmF1bHQuCisJICovCisJaWYgKGZhdWx0ICYgVk1fRkFVTFRfU0lHQlVTKSB7CisJCWluZm8uc2lfc2lnbm8gPSBTSUdCVVM7CisJCWluZm8uc2lfY29kZSA9IEJVU19BRFJFUlI7CisJfQorCS8qIEFkZHJlc3MgaXMgbm90IGluIHRoZSBtZW1vcnkgbWFwICovCisJZWxzZSB7CisJCWluZm8uc2lfc2lnbm8gPSBTSUdTRUdWOworCQlpbmZvLnNpX2NvZGUgPSBTRUdWX0FDQ0VSUjsKKwl9CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopYWRkcmVzczsKKwlmb3JjZV9zaWdfaW5mbyhpbmZvLnNpX2NvZGUsICZpbmZvLCBjdXJyZW50KTsKKwlyZXR1cm47CisKK2JhZF9hcmVhOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCWluZm8uc2lfc2lnbm8gPSBTSUdTRUdWOworCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJaW5mby5zaV9jb2RlID0gc2lfY29kZTsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgKilhZGRyZXNzOworCQlmb3JjZV9zaWdfaW5mbyhTSUdTRUdWLCAmaW5mbywgY3VycmVudCk7CisJCXJldHVybjsKKwl9CisJLyogS2VybmVsLW1vZGUgZmF1bHQgZmFsbHMgdGhyb3VnaCAqLworCitub19jb250ZXh0OgorCWZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocHRfZWxyKHJlZ3MpKTsKKwlpZiAoZml4dXApIHsKKwkJcHRfc2V0X2VscihyZWdzLCBmaXh1cC0+Zml4dXApOworCQlyZXR1cm47CisJfQorCisJLyogVGhpbmdzIGFyZSBsb29raW5nIHZlcnksIHZlcnkgYmFkIG5vdyAqLworCWJ1c3Rfc3BpbmxvY2tzKDEpOworCXByaW50ayhLRVJOX0VNRVJHICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCBhdCAiCisJCSJ2aXJ0dWFsIGFkZHJlc3MgMHglMDhseCwgcmVncyAlcFxuIiwgYWRkcmVzcywgcmVncyk7CisJZGllKCJCYWQgS2VybmVsIFZBIiwgcmVncywgU0lHS0lMTCk7Cit9CisKKwordm9pZCByZWFkX3Byb3RlY3Rpb25fZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBiYWR2YWRyID0gcHRfYmFkdmEocmVncyk7CisKKwlkb19wYWdlX2ZhdWx0KGJhZHZhZHIsIEZMVF9MT0FELCByZWdzKTsKK30KKwordm9pZCB3cml0ZV9wcm90ZWN0aW9uX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgYmFkdmFkciA9IHB0X2JhZHZhKHJlZ3MpOworCisJZG9fcGFnZV9mYXVsdChiYWR2YWRyLCBGTFRfU1RPUkUsIHJlZ3MpOworfQorCit2b2lkIGV4ZWN1dGVfcHJvdGVjdGlvbl9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGJhZHZhZHIgPSBwdF9iYWR2YShyZWdzKTsKKworCWRvX3BhZ2VfZmF1bHQoYmFkdmFkciwgRkxUX0lGRVRDSCwgcmVncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vdm1fdGxiLmMgYi9hcmNoL2hleGFnb24vbW0vdm1fdGxiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmZjQxNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9tbS92bV90bGIuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogSGV4YWdvbiBWaXJ0dWFsIE1hY2hpbmUgVExCIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGUgSGV4YWdvbiBWaXJ0dWFsIE1hY2hpbmUgY29uY2VhbHMgdGhlIHJlYWwgd29ya2luZ3Mgb2YKKyAqIHRoZSBUTEIsIGJ1dCB0aGVyZSBhcmUgb25lIG9yIHR3byBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvCisgKiBiZSBpbnN0YW50aWF0ZWQgZm9yIGl0LCBkaWZmZXJlbnRseSBmcm9tIGEgbmF0aXZlIGJ1aWxkLgorICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9oZXhhZ29uX3ZtLmg+CisKKy8qCisgKiBJbml0aWFsIFZNIGltcGxlbWVudGF0aW9uIGhhcyBvbmx5IG9uZSBtYXAgYWN0aXZlIGF0IGEgdGltZSwgd2l0aAorICogVExCIHB1cmdpbmdzIG9uIGNoYW5nZXMuICBTbyBlaXRoZXIgd2UncmUgbnVraW5nIHRoZSBjdXJyZW50IG1hcCwKKyAqIG9yIGl0J3MgYSBuby1vcC4gIFRoaXMgb3BlcmF0aW9uIGlzIG1lc3N5IG9uIHRydWUgU01QcyB3aGVyZSBvdGhlcgorICogcHJvY2Vzc29ycyBtdXN0IGJlIGluZHVjZWQgdG8gZmx1c2ggdGhlIGNvcGllcyBpbiB0aGVpciBsb2NhbCBUTEJzLAorICogYnV0IEhleGFnb24gdGhyZWFkLWJhc2VkIHZpcnR1YWwgcHJvY2Vzc29ycyBzaGFyZSB0aGUgc2FtZSBNTVUuCisgKi8KK3ZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCisJaWYgKG1tLT5jb250ZXh0LnB0YmFzZSA9PSBjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQucHRiYXNlKQorCQlfX3ZtY2xybWFwKCh2b2lkICopc3RhcnQsIGVuZCAtIHN0YXJ0KTsKK30KKworLyoKKyAqIEZsdXNoIGEgcGFnZSBmcm9tIHRoZSBrZXJuZWwgdmlydHVhbCBtYXAgLSB1c2VkIGJ5IGhpZ2htZW0KKyAqLwordm9pZCBmbHVzaF90bGJfb25lKHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJX192bWNscm1hcCgodm9pZCAqKXZhZGRyLCBQQUdFX1NJWkUpOworfQorCisvKgorICogRmx1c2ggYWxsIFRMQnMgYWNyb3NzIGFsbCBDUFVzLCB2aXJ0dWFsIG9yIHJlYWwuCisgKiBBIHNpbmdsZSBIZXhhZ29uIGNvcmUgaGFzIDYgdGhyZWFkIGNvbnRleHRzIGJ1dAorICogb25seSBvbmUgVExCLgorICovCit2b2lkIHRsYl9mbHVzaF9hbGwodm9pZCkKK3sKKwkvKiAgc2hvdWxkIHByb2JhYmx5IHVzZSB0aGF0IGZpeGFkZHIgZW5kIG9yIHdoYXRldmUgbGFiZWwgICovCisJX192bWNscm1hcCgwLCAweGZmZmYwMDAwKTsKK30KKworLyoKKyAqIEZsdXNoIFRMQiBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIG1tX3N0cnVjdCBtYXBwaW5nLgorICovCit2b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwkvKiBDdXJyZW50IFZpcnR1YWwgTWFjaGluZSBoYXMgb25seSBvbmUgbWFwIGFjdGl2ZSBhdCBhIHRpbWUgKi8KKwlpZiAoY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LnB0YmFzZSA9PSBtbS0+Y29udGV4dC5wdGJhc2UpCisJCXRsYl9mbHVzaF9hbGwoKTsKK30KKworLyoKKyAqIEZsdXNoIFRMQiBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggYSBwYWdlIG9mIGEgdm1hLgorICovCit2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKKworCWlmIChtbS0+Y29udGV4dC5wdGJhc2UgID09IGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5wdGJhc2UpCisJCV9fdm1jbHJtYXAoKHZvaWQgKil2YWRkciwgUEFHRV9TSVpFKTsKK30KKworLyoKKyAqIEZsdXNoIFRMQiBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBhIGtlcm5lbCBhZGRyZXNzIHJhbmdlLgorICogTGlrZSBmbHVzaCByYW5nZSwgYnV0IHdpdGhvdXQgdGhlIGNoZWNrIG9uIHRoZSB2bWEtPnZtX21tLgorICovCit2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJCV9fdm1jbHJtYXAoKHZvaWQgKilzdGFydCwgZW5kIC0gc3RhcnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L0tjb25maWcgYi9hcmNoL2lhNjQvS2NvbmZpZwppbmRleCAzZmY3Nzg1Li4yNzQ4OWI2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvS2NvbmZpZworKysgYi9hcmNoL2lhNjQvS2NvbmZpZwpAQCAtOTIsNyArOTIsNyBAQAogCWRlZl9ib29sIHkKIAogY29uZmlnIEdFTkVSSUNfR1BJTwotCWRlZl9ib29sIHkKKwlib29sCiAKIGNvbmZpZyBETUkKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCmluZGV4IDQzYWIxY2QuLjk1NGQ4MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCkBAIC04Nyw2ICs4Nyw3IEBACiBDT05GSUdfTkVUX1RVTElQPXkKIENPTkZJR19UVUxJUD1tCiBDT05GSUdfTkVUX1BDST15CitDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTD15CiBDT05GSUdfRTEwMD1tCiBDT05GSUdfRTEwMDA9eQogQ09ORklHX0lHQj15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9nZW5zcGFyc2VfZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3MvZ2Vuc3BhcnNlX2RlZmNvbmZpZwppbmRleCBiMTFmYTg4Li45MWM0MWVjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9nZW5zcGFyc2VfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbnNwYXJzZV9kZWZjb25maWcKQEAgLTc1LDYgKzc1LDcgQEAKIENPTkZJR19ORVRfVFVMSVA9eQogQ09ORklHX1RVTElQPW0KIENPTkZJR19ORVRfUENJPXkKK0NPTkZJR19ORVRfVkVORE9SX0lOVEVMPXkKIENPTkZJR19FMTAwPW0KIENPTkZJR19FMTAwMD15CiBDT05GSUdfVElHT04zPXkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZwppbmRleCAxMzdhNDUzLi5hNWE5ZTAyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvdGlnZXJfZGVmY29uZmlnCkBAIC03Nyw2ICs3Nyw3IEBACiBDT05GSUdfTkVUX1RVTElQPXkKIENPTkZJR19UVUxJUD1tCiBDT05GSUdfTkVUX1BDST15CitDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTD15CiBDT05GSUdfRTEwMD1tCiBDT05GSUdfRTEwMDA9eQogQ09ORklHX1RJR09OMz15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy94ZW5fZG9tdV9kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy94ZW5fZG9tdV9kZWZjb25maWcKaW5kZXggMmJmNzZlNC4uMzdiOWI0MiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MveGVuX2RvbXVfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL3hlbl9kb211X2RlZmNvbmZpZwpAQCAtODAsNiArODAsNyBAQAogQ09ORklHX05FVF9UVUxJUD15CiBDT05GSUdfVFVMSVA9bQogQ09ORklHX05FVF9QQ0k9eQorQ09ORklHX05FVF9WRU5ET1JfSU5URUw9eQogQ09ORklHX0UxMDA9bQogQ09ORklHX0UxMDAwPXkKIENPTkZJR19USUdPTjM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcKaW5kZXggMWQ0MjgyNy4uZmM3YWJhMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnCkBAIC01Nyw2ICs1Nyw3IEBACiBDT05GSUdfVFVMSVBfTkFQST15CiBDT05GSUdfVFVMSVBfTkFQSV9IV19NSVRJR0FUSU9OPXkKIENPTkZJR19ORVRfUENJPXkKK0NPTkZJR19ORVRfVkVORE9SX0lOVEVMPXkKIENPTkZJR19FMTAwPXkKIENPTkZJR19FMTAwMD15CiBDT05GSUdfVElHT04zPXkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9jb21tb24vaHdzd19pb21tdS5jIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9od3N3X2lvbW11LmMKaW5kZXggZTRhODBkOC4uMWU0Y2FlNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9od3N3X2lvbW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9od3N3X2lvbW11LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogCiBleHRlcm4gc3RydWN0IGRtYV9tYXBfb3BzIHNiYV9kbWFfb3BzLCBzd2lvdGxiX2RtYV9vcHM7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggNTE0MjdlYS4uNGIwMzY2NCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNzEsNCArNzEsNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmIC8qIF9BU01fSUE2NF9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IDdjOTI4ZGEuLjc2MTcyNDggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTMyMSwxMSArMzIxLDEzIEBACiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkJMTMyOQogI2RlZmluZSBfX05SX3NldG5zCQkJMTMzMAogI2RlZmluZSBfX05SX3NlbmRtbXNnCQkJMTMzMQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJCTEzMzIKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgkJMTMzMwogCiAjaWZkZWYgX19LRVJORUxfXwogCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMJCQkzMDggLyogbGVuZ3RoIG9mIHN5c2NhbGwgdGFibGUgKi8KKyNkZWZpbmUgTlJfc3lzY2FsbHMJCQkzMTAgLyogbGVuZ3RoIG9mIHN5c2NhbGwgdGFibGUgKi8KIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBzdG9wIHNjcmlwdHMvY2hlY2tzeXNjYWxscy5zaCBmcm9tIGNvbXBsYWluaW5nIGFib3V0CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20veGVuL2dyYW50X3RhYmxlLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20veGVuL2dyYW50X3RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWZhZTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9ncmFudF90YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9ncmFudF90YWJsZS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElzYWt1IFlhbWFoYXRhIDx5YW1haGF0YSBhdCB2YWxpbnV4IGNvIGpwPgotICogICAgICAgICAgICAgICAgICAgIFZBIExpbnV4IFN5c3RlbXMgSmFwYW4gSy5LLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfQVNNX0lBNjRfWEVOX0dSQU5UX1RBQkxFX0gKLSNkZWZpbmUgX0FTTV9JQTY0X1hFTl9HUkFOVF9UQUJMRV9ICi0KLXN0cnVjdCB2bV9zdHJ1Y3QgKnhlbl9hbGxvY192bV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci12b2lkIHhlbl9mcmVlX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSk7Ci0KLSNlbmRpZiAvKiBfQVNNX0lBNjRfWEVOX0dSQU5UX1RBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS94ZW4vaW50ZXJmYWNlLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20veGVuL2ludGVyZmFjZS5oCmluZGV4IGU5NTFlNzQuLjFkMjQyN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS94ZW4vaW50ZXJmYWNlLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9pbnRlcmZhY2UuaApAQCAtNzYsNiArNzYsNyBAQAogREVGSU5FX0dVRVNUX0hBTkRMRShpbnQpOwogREVGSU5FX0dVRVNUX0hBTkRMRShsb25nKTsKIERFRklORV9HVUVTVF9IQU5ETEUodm9pZCk7CitERUZJTkVfR1VFU1RfSEFORExFKHVpbnQ2NF90KTsKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIHhlbl9wZm5fdDsKIERFRklORV9HVUVTVF9IQU5ETEUoeGVuX3Bmbl90KTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZG1hLW1hcHBpbmcuYyBiL2FyY2gvaWE2NC9rZXJuZWwvZG1hLW1hcHBpbmcuYwppbmRleCBmMmMxNjAwLi43Zjc5MTYyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9kbWEtbWFwcGluZy5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qIFNldCB0aGlzIHRvIDEgaWYgdGhlcmUgaXMgYSBIVyBJT01NVSBpbiB0aGUgc3lzdGVtICovCiBpbnQgaW9tbXVfZGV0ZWN0ZWQgX19yZWFkX21vc3RseTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCAxOThjNzUzLi41YjMxZDQ2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNzc3LDYgKzE3NzcsOCBAQAogCWRhdGE4IHN5c19zeW5jZnMKIAlkYXRhOCBzeXNfc2V0bnMJCQkJLy8gMTMzMAogCWRhdGE4IHN5c19zZW5kbW1zZworCWRhdGE4IHN5c19wcm9jZXNzX3ZtX3JlYWR2CisJZGF0YTggc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CiAKIAkub3JnIHN5c19jYWxsX3RhYmxlICsgOCpOUl9zeXNjYWxscwkvLyBndWFyZCBhZ2FpbnN0IGZhaWx1cmVzIHRvIGluY3JlYXNlIE5SX3N5c2NhbGxzCiAjZW5kaWYgLyogX19JQTY0X0FTTV9QQVJBVklSVFVBTElaRURfTkFUSVZFICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggMGUwZTBjYy4uOWJlMWYxMSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL21tem9uZS5oPgogI2luY2x1ZGUgPGFzbS9udW1hLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS9rdm0taWE2NC5jIGIvYXJjaC9pYTY0L2t2bS9rdm0taWE2NC5jCmluZGV4IDgyMTNlZmUuLjQzZjRjOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0va3ZtLWlhNjQuYworKysgYi9hcmNoL2lhNjQva3ZtL2t2bS1pYTY0LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlbC1pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vZ2NjX2ludHJpbi5oPgpAQCAtMjA0LDcgKzIwNSw3IEBACiAJCXIgPSBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQ7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX0NBUF9JT01NVToKLQkJciA9IGlvbW11X2ZvdW5kKCk7CisJCXIgPSBpb21tdV9wcmVzZW50KCZwY2lfYnVzX3R5cGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvcGNpLmMgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCmluZGV4IGFhMjUzM2EuLjJjMjc3MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9wY2kvcGNpLmMKKysrIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fYWNwaV9pbml0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2FjcGlfaW5pdC5jCmluZGV4IDhjZGNiMTcuLmIxNzI1MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fYWNwaV9pbml0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19hY3BpX2luaXQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKaW5kZXggOTgwNzlmMi4uMGEzNmYwOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KICNpbmNsdWRlIDxhc20vc24vaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKaW5kZXggMzA4NjJjMC4uMmRlNDFkNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKQEAgLTYxNSwxMSArNjE1LDE1IEBACiAJCX0KIAl9CiAKLQlpZiAoY3B1ID09IFNOX0hXUEVSRl9BUkdfQU5ZX0NQVSB8fCBjcHUgPT0gZ2V0X2NwdSgpKSB7Ci0JCS8qIGRvbid0IGNhcmUsIG9yIGFscmVhZHkgb24gY29ycmVjdCBjcHUgKi8KKwlpZiAoY3B1ID09IFNOX0hXUEVSRl9BUkdfQU5ZX0NQVSkgeworCQkvKiBkb24ndCBjYXJlIHdoaWNoIGNwdSAqLwogCQlzbl9od3BlcmZfY2FsbF9zYWwob3BfaW5mbyk7Ci0JfQotCWVsc2UgeworCX0gZWxzZSBpZiAoY3B1ID09IGdldF9jcHUoKSkgeworCQkvKiBhbHJlYWR5IG9uIGNvcnJlY3QgY3B1ICovCisJCXNuX2h3cGVyZl9jYWxsX3NhbChvcF9pbmZvKTsKKwkJcHV0X2NwdSgpOworCX0gZWxzZSB7CisJCXB1dF9jcHUoKTsKIAkJaWYgKHVzZV9pcGkpIHsKIAkJCS8qIHVzZSBhbiBpbnRlcnByb2Nlc3NvciBpbnRlcnJ1cHQgdG8gY2FsbCBTQUwgKi8KIAkJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIHNuX2h3cGVyZl9jYWxsX3NhbCwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCmluZGV4IDMzZGVmNjYuLjFlODYzYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2dlby5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCmluZGV4IDNjYjVjZjMuLjU2OThmMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KICNpbmNsdWRlIDxhc20vc24vZ2VvLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMgYi9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMKaW5kZXggOWMyNzFiZS4uNjQyNDUxZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2lvLmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQveGVuL2dyYW50LXRhYmxlLmMgYi9hcmNoL2lhNjQveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggNDhjY2EzNy4uYzE4MjgxMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3hlbi9ncmFudC10YWJsZS5jCisrKyBiL2FyY2gvaWE2NC94ZW4vZ3JhbnQtdGFibGUuYwpAQCAtMzEsNjggKzMxLDYgQEAKIAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgogCi1zdHJ1Y3Qgdm1fc3RydWN0ICp4ZW5fYWxsb2Nfdm1fYXJlYSh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaW50IG9yZGVyOwotCXVuc2lnbmVkIGxvbmcgdmlydDsKLQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKLQl2aXJ0ID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7Ci0JaWYgKHZpcnQgPT0gMCkKLQkJZ290byBlcnIwOwotCW5yX3BhZ2VzID0gMSA8PCBvcmRlcjsKLQlzY3J1Yl9wYWdlcyh2aXJ0LCBucl9wYWdlcyk7Ci0KLQlhcmVhID0ga21hbGxvYyhzaXplb2YoKmFyZWEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoYXJlYSA9PSBOVUxMKQotCQlnb3RvIGVycjE7Ci0KLQlhcmVhLT5mbGFncyA9IFZNX0lPUkVNQVA7Ci0JYXJlYS0+YWRkciA9ICh2b2lkICopdmlydDsKLQlhcmVhLT5zaXplID0gc2l6ZTsKLQlhcmVhLT5wYWdlcyA9IE5VTEw7Ci0JYXJlYS0+bnJfcGFnZXMgPSBucl9wYWdlczsKLQlhcmVhLT5waHlzX2FkZHIgPSAwOwkvKiB4ZW5idXNfbWFwX3JpbmdfdmFsbG9jIHVzZXMgdGhpcyBmaWVsZCEgICovCi0KLQlyZXR1cm4gYXJlYTsKLQotZXJyMToKLQlmcmVlX3BhZ2VzKHZpcnQsIG9yZGVyKTsKLWVycjA6Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZW5fYWxsb2Nfdm1fYXJlYSk7Ci0KLXZvaWQgeGVuX2ZyZWVfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhKQotewotCXVuc2lnbmVkIGludCBvcmRlciA9IGdldF9vcmRlcihhcmVhLT5zaXplKTsKLQl1bnNpZ25lZCBsb25nIGk7Ci0JdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBfX3BhKGFyZWEtPmFkZHIpOwotCi0JLyogVGhpcyBhcmVhIGlzIHVzZWQgZm9yIGZvcmVpZ24gcGFnZSBtYXBwcGluZy4KLQkgKiBTbyB1bmRlcmx5aW5nIG1hY2hpbmUgcGFnZSBtYXkgbm90IGJlIGFzc2lnbmVkLiAqLwotCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBvcmRlcik7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIHJldDsKLQkJdW5zaWduZWQgbG9uZyBncGZuID0gKHBoeXNfYWRkciA+PiBQQUdFX1NISUZUKSArIGk7Ci0JCXN0cnVjdCB4ZW5fbWVtb3J5X3Jlc2VydmF0aW9uIHJlc2VydmF0aW9uID0gewotCQkJLm5yX2V4dGVudHMgICA9IDEsCi0JCQkuYWRkcmVzc19iaXRzID0gMCwKLQkJCS5leHRlbnRfb3JkZXIgPSAwLAotCQkJLmRvbWlkICAgICAgICA9IERPTUlEX1NFTEYKLQkJfTsKLQkJc2V0X3hlbl9ndWVzdF9oYW5kbGUocmVzZXJ2YXRpb24uZXh0ZW50X3N0YXJ0LCAmZ3Bmbik7Ci0JCXJldCA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9wb3B1bGF0ZV9waHlzbWFwLAotCQkJCQkgICAmcmVzZXJ2YXRpb24pOwotCQlCVUdfT04ocmV0ICE9IDEpOwotCX0KLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFyZWEtPmFkZHIsIG9yZGVyKTsKLQlrZnJlZShhcmVhKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHhlbl9mcmVlX3ZtX2FyZWEpOwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBncmFudCB0YWJsZSBoYWNrCiAgKiBjbWQ6IEdOVFRBQk9QX3h4eApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3hlbi9oeXBlcnZpc29yLmMgYi9hcmNoL2lhNjQveGVuL2h5cGVydmlzb3IuYwppbmRleCBjYWM0ZDk3Li41MjE3MmVlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQveGVuL2h5cGVydmlzb3IuYworKysgYi9hcmNoL2lhNjQveGVuL2h5cGVydmlzb3IuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20veGVuL3ByaXZvcC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL20zMnIvS2NvbmZpZyBiL2FyY2gvbTMyci9LY29uZmlnCmluZGV4IDZjNGU5YWEuLmVmODBhNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9LY29uZmlnCisrKyBiL2FyY2gvbTMyci9LY29uZmlnCkBAIC0zMjMsMTMgKzMyMyw2IEBACiAJZGVmYXVsdCAiMSIKIAlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKIAotIyB0dXJuaW5nIHRoaXMgb24gd2FzdGVzIGEgYnVuY2ggb2Ygc3BhY2UuCi0jIFN1bW1pdCBuZWVkcyBpdCBvbmx5IHdoZW4gTlVNQSBpcyBvbgotY29uZmlnIEJPT1RfSU9SRU1BUAotCWJvb2wKLQlkZXBlbmRzIG9uIE5VTUEKLQlkZWZhdWx0IG4KLQogZW5kbWVudQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCA0Njk3ODdjMy4uZThiOGM1YiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNjIsNCArNjIsNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmIC8qIF9BU01fTTMyUl9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcgYi9hcmNoL202OGsvS2NvbmZpZwppbmRleCA2YzI4NTgyLi4zNjFkNTQwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZworKysgYi9hcmNoL202OGsvS2NvbmZpZwpAQCAtNCw4ICs0LDggQEAKIAlzZWxlY3QgSEFWRV9JREUKIAlzZWxlY3QgSEFWRV9BT1VUIGlmIE1NVQogCXNlbGVjdCBHRU5FUklDX0FUT01JQzY0IGlmIE1NVQotCXNlbGVjdCBIQVZFX0dFTkVSSUNfSEFSRElSUVMgaWYgIU1NVQotCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XIGlmICFNTVUKKwlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCisJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKIAlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcgaWYgUk1XX0lOU05TCiAKIGNvbmZpZyBSV1NFTV9HRU5FUklDX1NQSU5MT0NLCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZy5idXMgYi9hcmNoL202OGsvS2NvbmZpZy5idXMKaW5kZXggODI5NGYwYy4uM2FkYjQ5OSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcuYnVzCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnLmJ1cwpAQCAtMiw2ICsyLDE1IEBACiAKIGNvbW1lbnQgIkJ1cyBTdXBwb3J0IgogCitjb25maWcgRElPCisJYm9vbCAiRElPIGJ1cyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSFAzMDAKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgIkRJTyIgZXhwYW5zaW9uIGJ1cyB1c2VkIGluCisJICBIUDMwMCBtYWNoaW5lcy4gSWYgeW91IGFyZSB1c2luZyBzdWNoIGEgc3lzdGVtIHlvdSBhbG1vc3QgY2VydGFpbmx5CisJICB3YW50IHRoaXMuCisKIGNvbmZpZyBOVUJVUwogCWJvb2wKIAlkZXBlbmRzIG9uIE1BQwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcuZGV2aWNlcyBiL2FyY2gvbTY4ay9LY29uZmlnLmRldmljZXMKaW5kZXggZDIxNDAzNC4uNjAzM2Y1ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcuZGV2aWNlcworKysgYi9hcmNoL202OGsvS2NvbmZpZy5kZXZpY2VzCkBAIC0yNCw2ICsyNCwzNyBAQAogCSAgaW5jbHVkaW5nIHRoZSBtb2RlbCwgQ1BVLCBNTVUsIGNsb2NrIHNwZWVkLCBCb2dvTUlQUyByYXRpbmcsCiAJICBhbmQgbWVtb3J5IHNpemUuCiAKK2NvbmZpZyBOQVRGRUFUCisJYm9vbCAiQVJBbnlNIGVtdWxhdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBVEFSSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgQVJBbnlNIG5hdGl2ZSBmZWF0dXJlcywgc3VjaCBhcworCSAgYWNjZXNzIHRvIGEgZGlzayBpbWFnZSBhcyAvZGV2L2hkYS4KKworY29uZmlnIE5GQkxPQ0sKKwl0cmlzdGF0ZSAiTmF0RmVhdCBibG9jayBkZXZpY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJMT0NLICYmIE5BVEZFQVQKKwloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUkFueU0gTmF0RmVhdCBibG9jayBkZXZpY2UKKwkgIHdoaWNoIGFsbG93cyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBoYXJkIGRyaXZlcyB3aXRob3V0IHVzaW5nCisJICB0aGUgaGFyZHdhcmUgZW11bGF0aW9uLgorCitjb25maWcgTkZDT04KKwl0cmlzdGF0ZSAiTmF0RmVhdCBjb25zb2xlIGRyaXZlciIKKwlkZXBlbmRzIG9uIE5BVEZFQVQKKwloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUkFueU0gTmF0RmVhdCBjb25zb2xlIGRyaXZlcgorCSAgd2hpY2ggYWxsb3dzIHRoZSBjb25zb2xlIG91dHB1dCB0byBiZSByZWRpcmVjdGVkIHRvIHRoZSBzdGRlcnIKKwkgIG91dHB1dCBvZiBBUkFueU0uCisKK2NvbmZpZyBORkVUSAorCXRyaXN0YXRlICJOYXRGZWF0IEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFVEhFUk5FVCAmJiBOQVRGRUFUCisJaGVscAorCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgQVJBbnlNIE5hdEZlYXQgbmV0d29yayBkZXZpY2UKKwkgIHdoaWNoIHdpbGwgZW11bGF0ZSBhIHJlZ3VsYXIgZXRoZXJuZXQgZGV2aWNlIHdoaWxlIHByZXNlbnRpbmcgYW4KKwkgIGV0aGVydGFwIGRldmljZSB0byB0aGUgaG9zdCBzeXN0ZW0uCisKIGVuZG1lbnUKIAogbWVudSAiQ2hhcmFjdGVyIGRldmljZXMiCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jIGIvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYwppbmRleCBjNWI1MjEyLi40N2I1ZjkwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9hbWlpbnRzLmMKQEAgLTEsNDMgKzEsMTUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jIC0tIEFtaWdhIExpbnV4IGludGVycnVwdCBoYW5kbGluZyBjb2RlCisgKiBBbWlnYSBMaW51eCBpbnRlcnJ1cHQgaGFuZGxpbmcgY29kZQogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAxMS8wNy85NjogcmV3cml0dGVuIGludGVycnVwdCBoYW5kbGluZywgaXJxIGxpc3RzIGFyZSBleGlzdHMgbm93IG9ubHkgZm9yCi0gKiAgICAgICAgICAgdGhpcyBzb3VyY2VzIHdoZXJlIGl0IG1ha2VzIHNlbnNlIChWRVJUQi9QT1JUUy9FWFRFUikgYW5kIHlvdSBtdXN0Ci0gKiAgICAgICAgICAgYmUgY2FyZWZ1bCB0aGF0IGRldl9pZCBmb3IgdGhpcyBzb3VyY2VzIGlzIHVuaXF1ZSBzaW5jZSB0aGlzIHRoZQotICogICAgICAgICAgIG9ubHkgcG9zc2liaWxpdHkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgaGFuZGxlcnMgZm9yCi0gKiAgICAgICAgICAgZnJlZV9pcnEuIGlycSBsaXN0cyBhbHNvIGhhdmUgZGlmZmVyZW50IGlycSBmbGFnczoKLSAqICAgICAgICAgICAtIElSUV9GTEdfRkFTVDogaGFuZGxlciBpcyBpbnNlcnRlZCBhdCB0b3Agb2YgbGlzdCAoYWZ0ZXIgb3RoZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdCBoYW5kbGVycykKLSAqICAgICAgICAgICAtIElSUV9GTEdfU0xPVzogaGFuZGxlciBpcyBpbnNlcnRlZCBhdCBib3R0b20gb2YgbGlzdCBhbmQgYmVmb3JlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkncmUgZXhlY3V0ZWQgaXJxIGxldmVsIGlzIHNldCB0byB0aGUgcHJldmlvdXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lLCBidXQgaGFuZGxlcnMgZG9uJ3QgbmVlZCB0byBiZSByZWVudHJhbnQsIGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZW50cmFuY2Ugb2NjdXJyZWQsIHNsb3cgaGFuZGxlcnMgd2lsbCBiZSBqdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhZ2Fpbi4KLSAqICAgICAgICAgICBUaGUgd2hvbGUgaW50ZXJydXB0IGhhbmRsaW5nIGZvciBDSUFzIGlzIG1vdmVkIHRvIGNpYS5jCi0gKiAgICAgICAgICAgL1JvbWFuIFppcHBlbAotICoKLSAqIDA3LzA4Lzk5OiByZXdhbXAgb2YgdGhlIGludGVycnVwdCBoYW5kbGluZyAtIHdlIG5vdyBoYXZlIHR3byB0eXBlcyBvZgotICogICAgICAgICAgIGludGVycnVwdHMsIG5vcm1hbCBhbmQgZmFzdCBoYW5kbGVycywgZmFzdCBoYW5kbGVycyBiZWluZwotICogICAgICAgICAgIG1hcmtlZCB3aXRoIElSUUZfRElTQUJMRUQgYW5kIHJ1bnMgd2l0aCBhbGwgb3RoZXIgaW50ZXJydXB0cwotICogICAgICAgICAgIGRpc2FibGVkLiBOb3JtYWwgaW50ZXJydXB0cyBkaXNhYmxlIHRoZWlyIG93biBzb3VyY2UgYnV0Ci0gKiAgICAgICAgICAgcnVuIHdpdGggYWxsIG90aGVyIGludGVycnVwdCBzb3VyY2VzIGVuYWJsZWQuCi0gKiAgICAgICAgICAgUE9SVFMgYW5kIEVYVEVSIGludGVycnVwdHMgYXJlIGFsd2F5cyBzaGFyZWQgZXZlbiBpZiB0aGUKLSAqICAgICAgICAgICBkcml2ZXJzIGRvIG5vdCBleHBsaWNpdGx5IG1hcmsgdGhpcyB3aGVuIGNhbGxpbmcKLSAqICAgICAgICAgICByZXF1ZXN0X2lycSB3aGljaCB0aGV5IHJlYWxseSBzaG91bGQgZG8uCi0gKiAgICAgICAgICAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSB3YXkgaW50ZXJydXB0cyBhcmUgaGFuZGxlZCBvbiBhbGwKLSAqICAgICAgICAgICBvdGhlciBhcmNoaXRlY3R1cmVzIGFuZCBtYWtlcyBhIHRvbiBvZiBzZW5zZSBiZXNpZGVzCi0gKiAgICAgICAgICAgaGF2aW5nIHRoZSBhZHZhbnRhZ2Ugb2YgbWFraW5nIGl0IGVhc2llciB0byBzaGFyZQotICogICAgICAgICAgIGRyaXZlcnMuCi0gKiAgICAgICAgICAgL0plcwogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KQEAgLTQ1LDIwICsxNywxMjggQEAKICNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CiAjaW5jbHVkZSA8YXNtL2FtaXBjbWNpYS5oPgogCi1zdGF0aWMgdm9pZCBhbWlnYV9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgYW1pZ2FfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDEoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50MyhpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQ0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDUoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIAotc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBhbWlnYV9pcnFfY29udHJvbGxlciA9IHsKKy8qCisgKiBFbmFibGUvZGlzYWJsZSBhIHBhcnRpY3VsYXIgbWFjaGluZSBzcGVjaWZpYyBpbnRlcnJ1cHQgc291cmNlLgorICogTm90ZSB0aGF0IHRoaXMgbWF5IGFmZmVjdCBvdGhlciBpbnRlcnJ1cHRzIGluIGNhc2Ugb2YgYSBzaGFyZWQgaW50ZXJydXB0LgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIGEgX3ZlcnlfIHNob3J0IHRpbWUgdG8gY2hhbmdlIHNvbWUKKyAqIGludGVybmFsIGRhdGEsIHRoYXQgbWF5IG5vdCBiZSBjaGFuZ2VkIGJ5IHRoZSBpbnRlcnJ1cHQgYXQgdGhlIHNhbWUgdGltZS4KKyAqLworCitzdGF0aWMgdm9pZCBhbWlnYV9pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgKDEgPDwgKGRhdGEtPmlycSAtIElSUV9VU0VSKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFtaWdhX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gMSA8PCAoZGF0YS0+aXJxIC0gSVJRX1VTRVIpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGFtaWdhX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJhbWlnYSIsCi0JLmxvY2sJCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQoYW1pZ2FfaXJxX2NvbnRyb2xsZXIubG9jayksCi0JLmVuYWJsZQkJPSBhbWlnYV9lbmFibGVfaXJxLAotCS5kaXNhYmxlCT0gYW1pZ2FfZGlzYWJsZV9pcnEsCisJLmlycV9lbmFibGUJPSBhbWlnYV9pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IGFtaWdhX2lycV9kaXNhYmxlLAogfTsKIAorCisvKgorICogVGhlIGJ1aWx0aW4gQW1pZ2EgaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXJzLgorICovCisKK3N0YXRpYyB2b2lkIGFtaV9pbnQxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKKworCS8qIGlmIHNlcmlhbCB0cmFuc21pdCBidWZmZXIgZW1wdHksIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfVEJFKSB7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9UQkU7CisJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfQU1JR0FfVEJFKTsKKwl9CisKKwkvKiBpZiBmbG9wcHkgZGlzayB0cmFuc2ZlciBjb21wbGV0ZSwgaW50ZXJydXB0ICovCisJaWYgKGludHMgJiBJRl9EU0tCTEspIHsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0RTS0JMSzsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9BTUlHQV9EU0tCTEspOworCX0KKworCS8qIGlmIHNvZnR3YXJlIGludGVycnVwdCBzZXQsIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfU09GVCkgeworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfU09GVDsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9BTUlHQV9TT0ZUKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFtaV9pbnQzKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKKworCS8qIGlmIGEgYmxpdHRlciBpbnRlcnJ1cHQgKi8KKwlpZiAoaW50cyAmIElGX0JMSVQpIHsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0JMSVQ7CisJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfQU1JR0FfQkxJVCk7CisJfQorCisJLyogaWYgYSBjb3BwZXIgaW50ZXJydXB0ICovCisJaWYgKGludHMgJiBJRl9DT1BFUikgeworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQ09QRVI7CisJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfQU1JR0FfQ09QUEVSKTsKKwl9CisKKwkvKiBpZiBhIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfVkVSVEIpIHsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1ZFUlRCOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0FNSUdBX1ZFUlRCKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFtaV9pbnQ0KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKKworCS8qIGlmIGF1ZGlvIDAgaW50ZXJydXB0ICovCisJaWYgKGludHMgJiBJRl9BVUQwKSB7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQwOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0FNSUdBX0FVRDApOworCX0KKworCS8qIGlmIGF1ZGlvIDEgaW50ZXJydXB0ICovCisJaWYgKGludHMgJiBJRl9BVUQxKSB7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQxOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0FNSUdBX0FVRDEpOworCX0KKworCS8qIGlmIGF1ZGlvIDIgaW50ZXJydXB0ICovCisJaWYgKGludHMgJiBJRl9BVUQyKSB7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQyOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0FNSUdBX0FVRDIpOworCX0KKworCS8qIGlmIGF1ZGlvIDMgaW50ZXJydXB0ICovCisJaWYgKGludHMgJiBJRl9BVUQzKSB7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQzOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0FNSUdBX0FVRDMpOworCX0KK30KKworc3RhdGljIHZvaWQgYW1pX2ludDUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOworCisJLyogaWYgc2VyaWFsIHJlY2VpdmUgYnVmZmVyIGZ1bGwgaW50ZXJydXB0ICovCisJaWYgKGludHMgJiBJRl9SQkYpIHsKKwkJLyogYWNrbm93bGVkZ2Ugb2YgSUZfUkJGIG11c3QgYmUgZG9uZSBieSB0aGUgc2VyaWFsIGludGVycnVwdCAqLworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0FNSUdBX1JCRik7CisJfQorCisJLyogaWYgYSBkaXNrIHN5bmMgaW50ZXJydXB0ICovCisJaWYgKGludHMgJiBJRl9EU0tTWU4pIHsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0RTS1NZTjsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9BTUlHQV9EU0tTWU4pOworCX0KK30KKworCiAvKgogICogdm9pZCBhbWlnYV9pbml0X0lSUSh2b2lkKQogICoKQEAgLTcyLDE2ICsxNTIsMTMgQEAKIAogdm9pZCBfX2luaXQgYW1pZ2FfaW5pdF9JUlEodm9pZCkKIHsKLQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fMSwgYW1pX2ludDEsIDAsICJpbnQxIiwgTlVMTCkpCi0JCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgaW50JWRcbiIsIDEpOwotCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT18zLCBhbWlfaW50MywgMCwgImludDMiLCBOVUxMKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBpbnQlZFxuIiwgMyk7Ci0JaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzQsIGFtaV9pbnQ0LCAwLCAiaW50NCIsIE5VTEwpKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIGludCVkXG4iLCA0KTsKLQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNSwgYW1pX2ludDUsIDAsICJpbnQ1IiwgTlVMTCkpCi0JCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgaW50JWRcbiIsIDUpOworCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmFtaWdhX2lycV9jaGlwLCBoYW5kbGVfc2ltcGxlX2lycSwgSVJRX1VTRVIsCisJCQkJICBBTUlfU1REX0lSUVMpOwogCi0JbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmYW1pZ2FfaXJxX2NvbnRyb2xsZXIsIElSUV9VU0VSLCBBTUlfU1REX0lSUVMpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9BVVRPXzEsIGFtaV9pbnQxKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT18zLCBhbWlfaW50Myk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0FVVE9fNCwgYW1pX2ludDQpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9BVVRPXzUsIGFtaV9pbnQ1KTsKIAogCS8qIHR1cm4gb2ZmIFBDTUNJQSBpbnRlcnJ1cHRzICovCiAJaWYgKEFNSUdBSFdfUFJFU0VOVChQQ01DSUEpKQpAQCAtOTUsMTIwICsxNzIsMyBAQAogCWNpYV9pbml0X0lSUSgmY2lhYV9iYXNlKTsKIAljaWFfaW5pdF9JUlEoJmNpYWJfYmFzZSk7CiB9Ci0KLS8qCi0gKiBFbmFibGUvZGlzYWJsZSBhIHBhcnRpY3VsYXIgbWFjaGluZSBzcGVjaWZpYyBpbnRlcnJ1cHQgc291cmNlLgotICogTm90ZSB0aGF0IHRoaXMgbWF5IGFmZmVjdCBvdGhlciBpbnRlcnJ1cHRzIGluIGNhc2Ugb2YgYSBzaGFyZWQgaW50ZXJydXB0LgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIGEgX3ZlcnlfIHNob3J0IHRpbWUgdG8gY2hhbmdlIHNvbWUKLSAqIGludGVybmFsIGRhdGEsIHRoYXQgbWF5IG5vdCBiZSBjaGFuZ2VkIGJ5IHRoZSBpbnRlcnJ1cHQgYXQgdGhlIHNhbWUgdGltZS4KLSAqLwotCi1zdGF0aWMgdm9pZCBhbWlnYV9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8ICgxIDw8IChpcnEgLSBJUlFfVVNFUikpOwotfQotCi1zdGF0aWMgdm9pZCBhbWlnYV9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSAxIDw8IChpcnEgLSBJUlFfVVNFUik7Ci19Ci0KLS8qCi0gKiBUaGUgYnVpbHRpbiBBbWlnYSBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlcnMuCi0gKi8KLQotc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKLQotCS8qIGlmIHNlcmlhbCB0cmFuc21pdCBidWZmZXIgZW1wdHksIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfVEJFKSB7Ci0JCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9UQkU7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfVEJFKTsKLQl9Ci0KLQkvKiBpZiBmbG9wcHkgZGlzayB0cmFuc2ZlciBjb21wbGV0ZSwgaW50ZXJydXB0ICovCi0JaWYgKGludHMgJiBJRl9EU0tCTEspIHsKLQkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0RTS0JMSzsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9EU0tCTEspOwotCX0KLQotCS8qIGlmIHNvZnR3YXJlIGludGVycnVwdCBzZXQsIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfU09GVCkgewotCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfU09GVDsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9TT0ZUKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDMoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOwotCi0JLyogaWYgYSBibGl0dGVyIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfQkxJVCkgewotCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQkxJVDsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9CTElUKTsKLQl9Ci0KLQkvKiBpZiBhIGNvcHBlciBpbnRlcnJ1cHQgKi8KLQlpZiAoaW50cyAmIElGX0NPUEVSKSB7Ci0JCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9DT1BFUjsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9DT1BQRVIpOwotCX0KLQotCS8qIGlmIGEgdmVydGljYWwgYmxhbmsgaW50ZXJydXB0ICovCi0JaWYgKGludHMgJiBJRl9WRVJUQikgewotCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfVkVSVEI7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfVkVSVEIpOwotCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50NChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQgaW50cyA9IGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgYW1pZ2FfY3VzdG9tLmludGVuYXI7Ci0KLQkvKiBpZiBhdWRpbyAwIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfQVVEMCkgewotCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMDsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9BVUQwKTsKLQl9Ci0KLQkvKiBpZiBhdWRpbyAxIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfQVVEMSkgewotCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMTsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9BVUQxKTsKLQl9Ci0KLQkvKiBpZiBhdWRpbyAyIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfQVVEMikgewotCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMjsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9BVUQyKTsKLQl9Ci0KLQkvKiBpZiBhdWRpbyAzIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfQVVEMykgewotCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMzsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9BVUQzKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDUoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOwotCi0JLyogaWYgc2VyaWFsIHJlY2VpdmUgYnVmZmVyIGZ1bGwgaW50ZXJydXB0ICovCi0JaWYgKGludHMgJiBJRl9SQkYpIHsKLQkJLyogYWNrbm93bGVkZ2Ugb2YgSUZfUkJGIG11c3QgYmUgZG9uZSBieSB0aGUgc2VyaWFsIGludGVycnVwdCAqLwotCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX1JCRik7Ci0JfQotCi0JLyogaWYgYSBkaXNrIHN5bmMgaW50ZXJydXB0ICovCi0JaWYgKGludHMgJiBJRl9EU0tTWU4pIHsKLQkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0RTS1NZTjsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9EU0tTWU4pOwotCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY2lhLmMgYi9hcmNoL202OGsvYW1pZ2EvY2lhLmMKaW5kZXggZWNkMGY3Yy4uMThjMGUyOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jaWEuYwpAQCAtOTMsMTMgKzkzLDE0IEBACiAJYW1pZ2FfY3VzdG9tLmludHJlcSA9IGJhc2UtPmludF9tYXNrOwogCWZvciAoOyBpbnRzOyBtYWNoX2lycSsrLCBpbnRzID4+PSAxKSB7CiAJCWlmIChpbnRzICYgMSkKLQkJCW02OGtfaGFuZGxlX2ludChtYWNoX2lycSk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEobWFjaF9pcnEpOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNpYV9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBjaWFfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKIAl1bnNpZ25lZCBjaGFyIG1hc2s7CiAKIAlpZiAoaXJxID49IElSUV9BTUlHQV9DSUFCKSB7CkBAIC0xMTMsMTkgKzExNCwyMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgY2lhX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBjaWFfaXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQogeworCXVuc2lnbmVkIGludCBpcnEgPSBkYXRhLT5pcnE7CisKIAlpZiAoaXJxID49IElSUV9BTUlHQV9DSUFCKQogCQljaWFfYWJsZV9pcnEoJmNpYWJfYmFzZSwgMSA8PCAoaXJxIC0gSVJRX0FNSUdBX0NJQUIpKTsKIAllbHNlCiAJCWNpYV9hYmxlX2lycSgmY2lhYV9iYXNlLCAxIDw8IChpcnEgLSBJUlFfQU1JR0FfQ0lBQSkpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIGNpYV9pcnFfY29udHJvbGxlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY2lhX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJjaWEiLAotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGNpYV9pcnFfY29udHJvbGxlci5sb2NrKSwKLQkuZW5hYmxlCQk9IGNpYV9lbmFibGVfaXJxLAotCS5kaXNhYmxlCT0gY2lhX2Rpc2FibGVfaXJxLAorCS5pcnFfZW5hYmxlCT0gY2lhX2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCT0gY2lhX2lycV9kaXNhYmxlLAogfTsKIAogLyoKQEAgLTEzNCw5ICsxMzYsOSBAQAogICogaW50byB0aGlzIGNoYWluLgogICovCiAKLXN0YXRpYyB2b2lkIGF1dG9fZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYXV0b19pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzd2l0Y2ggKGlycSkgeworCXN3aXRjaCAoZGF0YS0+aXJxKSB7CiAJY2FzZSBJUlFfQVVUT18yOgogCQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfUE9SVFM7CiAJCWJyZWFrOwpAQCAtMTQ2LDkgKzE0OCw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdXRvX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBhdXRvX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzd2l0Y2ggKGlycSkgeworCXN3aXRjaCAoZGF0YS0+aXJxKSB7CiAJY2FzZSBJUlFfQVVUT18yOgogCQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfUE9SVFM7CiAJCWJyZWFrOwpAQCAtMTU4LDI0ICsxNjAsMjUgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgYXV0b19pcnFfY29udHJvbGxlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYXV0b19pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAiYXV0byIsCi0JLmxvY2sJCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQoYXV0b19pcnFfY29udHJvbGxlci5sb2NrKSwKLQkuZW5hYmxlCQk9IGF1dG9fZW5hYmxlX2lycSwKLQkuZGlzYWJsZQk9IGF1dG9fZGlzYWJsZV9pcnEsCisJLmlycV9lbmFibGUJPSBhdXRvX2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCT0gYXV0b19pcnFfZGlzYWJsZSwKIH07CiAKIHZvaWQgX19pbml0IGNpYV9pbml0X0lSUShzdHJ1Y3QgY2lhYmFzZSAqYmFzZSkKIHsKLQltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZjaWFfaXJxX2NvbnRyb2xsZXIsIGJhc2UtPmNpYV9pcnEsIENJQV9JUlFTKTsKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZjaWFfaXJxX2NoaXAsIGhhbmRsZV9zaW1wbGVfaXJxLAorCQkJCSAgYmFzZS0+Y2lhX2lycSwgQ0lBX0lSUVMpOwogCiAJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IGFuZCB0dXJuIG9mZiBhbGwgaW50ZXJydXB0cyAqLwogCWNpYV9zZXRfaXJxKGJhc2UsIENJQV9JQ1JfQUxMKTsKIAljaWFfYWJsZV9pcnEoYmFzZSwgQ0lBX0lDUl9BTEwpOwogCiAJLyogb3ZlcnJpZGUgYXV0byBpbnQgYW5kIGluc3RhbGwgQ0lBIGhhbmRsZXIgKi8KLQltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZhdXRvX2lycV9jb250cm9sbGVyLCBiYXNlLT5oYW5kbGVyX2lycSwgMSk7Ci0JbTY4a19pcnFfc3RhcnR1cChiYXNlLT5oYW5kbGVyX2lycSk7CisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmYXV0b19pcnFfY2hpcCwgaGFuZGxlX3NpbXBsZV9pcnEsCisJCQkJICBiYXNlLT5oYW5kbGVyX2lycSwgMSk7CisJbTY4a19pcnFfc3RhcnR1cF9pcnEoYmFzZS0+aGFuZGxlcl9pcnEpOwogCWlmIChyZXF1ZXN0X2lycShiYXNlLT5oYW5kbGVyX2lycSwgY2lhX2hhbmRsZXIsIElSUUZfU0hBUkVELAogCQkJYmFzZS0+bmFtZSwgYmFzZSkpCiAJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCBiYXNlLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jIGIvYXJjaC9tNjhrL2Fwb2xsby9kbl9pbnRzLmMKaW5kZXggNWQ0N2YzYS4uMTdiZTFlNyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2Fwb2xsby9kbl9pbnRzLmMKKysrIGIvYXJjaC9tNjhrL2Fwb2xsby9kbl9pbnRzLmMKQEAgLTEsMTkgKzEsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vYXBvbGxvaHcuaD4KIAotdm9pZCBkbl9wcm9jZXNzX2ludCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit1bnNpZ25lZCBpbnQgYXBvbGxvX2lycV9zdGFydHVwKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlfX202OGtfaGFuZGxlX2ludChpcnEsIGZwKTsKKwl1bnNpZ25lZCBpbnQgaXJxID0gZGF0YS0+aXJxOwogCi0JKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2EpPTB4MjA7Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2IpPTB4MjA7Ci19Ci0KLWludCBhcG9sbG9faXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKIAlpZiAoaXJxIDwgOCkKIAkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2ErMSkgJj0gfigxIDw8IGlycSk7CiAJZWxzZQpAQCAtMjEsMjQgKzE1LDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXBvbGxvX2lycV9zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKQordm9pZCBhcG9sbG9faXJxX3NodXRkb3duKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKKwl1bnNpZ25lZCBpbnQgaXJxID0gZGF0YS0+aXJxOworCiAJaWYgKGlycSA8IDgpCiAJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNhKzEpIHw9ICgxIDw8IGlycSk7CiAJZWxzZQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikocGljYisxKSB8PSAoMSA8PCAoaXJxIC0gOCkpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIGFwb2xsb19pcnFfY29udHJvbGxlciA9IHsKK3ZvaWQgYXBvbGxvX2lycV9lb2koc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNhKSA9IDB4MjA7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2IpID0gMHgyMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBhcG9sbG9faXJxX2NoaXAgPSB7CiAJLm5hbWUgICAgICAgICAgID0gImFwb2xsbyIsCi0JLmxvY2sgICAgICAgICAgID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoYXBvbGxvX2lycV9jb250cm9sbGVyLmxvY2spLAotCS5zdGFydHVwICAgICAgICA9IGFwb2xsb19pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gICAgICAgPSBhcG9sbG9faXJxX3NodXRkb3duLAorCS5pcnFfc3RhcnR1cCAgICA9IGFwb2xsb19pcnFfc3RhcnR1cCwKKwkuaXJxX3NodXRkb3duICAgPSBhcG9sbG9faXJxX3NodXRkb3duLAorCS5pcnFfZW9pCT0gYXBvbGxvX2lycV9lb2ksCiB9OwogCiAKIHZvaWQgX19pbml0IGRuX2luaXRfSVJRKHZvaWQpCiB7Ci0JbTY4a19zZXR1cF91c2VyX2ludGVycnVwdChWRUNfVVNFUiArIDk2LCAxNiwgZG5fcHJvY2Vzc19pbnQpOwotCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmFwb2xsb19pcnFfY29udHJvbGxlciwgSVJRX0FQT0xMTywgMTYpOworCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIgKyA5NiwgMTYpOworCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmFwb2xsb19pcnFfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxLAorCQkJCSAgSVJRX0FQT0xMTywgMTYpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYyBiL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMKaW5kZXggMjZhODA0ZS4uNmQxOTZkYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYworKysgYi9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jCkBAIC02MCwyNDQgKzYwLDggQEAKICAqIDxhc20vYXRhcmlpbnRzLmg+KTogQXV0b3ZlY3RvciBpbnRlcnJ1cHRzIGFyZSAxLi43LCB0aGVuIGZvbGxvdyBTVC1NRlAsCiAgKiBUVC1NRlAsIFNDQywgYW5kIGZpbmFsbHkgVk1FIGludGVycnVwdHMuIFZlY3RvciBudW1iZXJzIGZvciB0aGUgbGF0dGVyIGNhbgogICogYmUgYWxsb2NhdGVkIGJ5IGF0YXJpX3JlZ2lzdGVyX3ZtZV9pbnQoKS4KLSAqCi0gKiBFYWNoIGludGVycnVwdCBjYW4gYmUgb2YgdGhyZWUgdHlwZXM6Ci0gKgotICogIC0gU0xPVzogVGhlIGhhbmRsZXIgcnVucyB3aXRoIGFsbCBpbnRlcnJ1cHRzIGVuYWJsZWQsIGV4Y2VwdCB0aGUgb25lIGl0Ci0gKiAgICB3YXMgY2FsbGVkIGJ5ICh0byBhdm9pZCByZWVudGVyaW5nKS4gVGhpcyBzaG91bGQgYmUgdGhlIHVzdWFsIG1ldGhvZC4KLSAqICAgIEJ1dCBpdCBpcyBjdXJyZW50bHkgcG9zc2libGUgb25seSBmb3IgTUZQIGludHMsIHNpbmNlIG9ubHkgdGhlIE1GUAotICogICAgb2ZmZXJzIGFuIGVhc3kgd2F5IHRvIG1hc2sgaW50ZXJydXB0cy4KLSAqCi0gKiAgLSBGQVNUOiBUaGUgaGFuZGxlciBydW5zIHdpdGggYWxsIGludGVycnVwdHMgZGlzYWJsZWQuIFRoaXMgc2hvdWxkIGJlIHVzZWQKLSAqICAgIG9ubHkgZm9yIHJlYWxseSBmYXN0IGhhbmRsZXJzLCB0aGF0IGp1c3QgZG8gYWN0aW9ucyBpbW1lZGlhdGVseQotICogICAgbmVjZXNzYXJ5LCBhbmQgbGV0IHRoZSByZXN0IGRvIGEgYm90dG9tIGhhbGYgb3IgdGFzayBxdWV1ZS4KLSAqCi0gKiAgLSBQUklPUklUSVpFRDogVGhlIGhhbmRsZXIgY2FuIGJlIGludGVycnVwdGVkIGJ5IGhpZ2hlci1sZXZlbCBpbnRzCi0gKiAgICAoZ3JlYXRlciBJUEwsIG5vIE1GUCBwcmlvcml0aWVzISkuIFRoaXMgaXMgdGhlIG1ldGhvZCBvZiBjaG9pY2UgZm9yIGludHMKLSAqICAgIHdoaWNoIHNob3VsZCBiZSBzbG93LCBidXQgYXJlIG5vdCBmcm9tIGEgTUZQLgotICoKLSAqIFRoZSBmZWF0dXJlIG9mIG1vcmUgdGhhbiBvbmUgaGFuZGxlciBmb3Igb25lIGludCBzb3VyY2UgaXMgc3RpbGwgdGhlcmUsIGJ1dAotICogb25seSBhcHBsaWNhYmxlIGlmIGFsbCBoYW5kZXJzIGFyZSBvZiB0aGUgc2FtZSB0eXBlLiBUbyBub3Qgc2xvdyBkb3duCi0gKiBwcm9jZXNzaW5nIG9mIGludHMgd2l0aCBvbmx5IG9uZSBoYW5kbGVyIGJ5IHRoZSBjaGFpbmluZyBmZWF0dXJlLCB0aGUgbGlzdAotICogY2FsbGluZyBmdW5jdGlvbiBhdGFyaV9jYWxsX2lycV9saXN0KCkgaXMgb25seSBwbHVnZ2VkIGluIGF0IHRoZSB0aW1lIHRoZQotICogc2Vjb25kIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZC4KLSAqCi0gKiBJbXBsZW1lbnRhdGlvbiBub3RlczogRm9yIGZhc3QtYXMtcG9zc2libGUgaW50IGhhbmRsaW5nLCB0aGVyZSBhcmUgc2VwYXJhdGUKLSAqIGVudHJ5IHBvaW50cyBmb3IgZWFjaCB0eXBlIChzbG93L2Zhc3QvcHJpbykuIFRoZSBhc3NlbWJsZXIgaGFuZGxlciBjYWxscwotICogdGhlIGlycSBkaXJlY3RseSBpbiB0aGUgdXN1YWwgY2FzZSwgbm8gQyB3cmFwcGVyIGlzIGludm9sdmVkLiBJbiBjYXNlIG9mCi0gKiBtdWx0aXBsZSBoYW5kbGVycywgYXRhcmlfY2FsbF9pcnFfbGlzdCgpIGlzIHJlZ2lzdGVyZWQgYXMgaGFuZGxlciBhbmQgY2FsbHMKLSAqIGluIHR1cm4gdGhlIHJlYWwgaXJxJ3MuIFRvIGVhc2UgYWNjZXNzIGZyb20gYXNzZW1ibGVyIGxldmVsIHRvIHRoZSBpcnEKLSAqIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIGFjY29tcGFueWluZyBkYXRhLCB0aGVzZSB0d28gYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlCi0gKiBhcnJheSwgaXJxX2hhbmRsZXJbXS4gVGhlIHJlc3Qgb2YgZGF0YSAodHlwZSwgbmFtZSkgYXJlIHB1dCBpbnRvIGEgc2Vjb25kCi0gKiBhcnJheSwgaXJxX3BhcmFtLCB0aGF0IGlzIGFjY2Vzc2VkIGZyb20gQyBvbmx5LiBGb3IgZWFjaCBzbG93IGludGVycnVwdCAoMzIKLSAqIGluIGFsbCkgdGhlcmUgYXJlIHNlcGFyYXRlIGhhbmRsZXIgZnVuY3Rpb25zLCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0bwotICogaGFyZC1jb2RlIHRoZSBNRlAgcmVnaXN0ZXIgYWRkcmVzcyBhbmQgdmFsdWUsIGFyZSBuZWNlc3NhcnkgdG8gbWFzayB0aGUKLSAqIGludC4gSWYgdGhlcmUnZCBiZSBvbmx5IG9uZSBnZW5lcmljIGZ1bmN0aW9uLCBsb3RzIG9mIGNhbGN1bGF0aW9ucyB3b3VsZCBiZQotICogbmVlZGVkIHRvIGRldGVybWluZSBNRlAgcmVnaXN0ZXIgYW5kIGludCBtYXNrIGZyb20gdGhlIHZlY3RvciBudW1iZXIgOi0oCi0gKgotICogRnVydGhlcm1vcmUsIHNsb3cgaW50cyBtYXkgbm90IGxvd2VyIHRoZSBJUEwgYmVsb3cgaXRzIHByZXZpb3VzIHZhbHVlCi0gKiAoYmVmb3JlIHRoZSBpbnQgaGFwcGVuZWQpLiBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGFuIGludCBvZiBjbGFzcyBQUklPLCBvbgotICogdGhhdCB0aGlzIGludCBtYXkgYmUgc3RhY2tlZCwgY2Fubm90IGJlIHJlZW50ZXJlZC4gVGhpcyBmZWF0dXJlIGlzCi0gKiBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzOiBJZiB0aGUgc3RhY2sgZnJhbWUgZm9ybWF0IGlzIDEgKHRocm93YXdheSksIHRoZSBpbnQKLSAqIGlzIG5vdCBzdGFja2VkLCBhbmQgdGhlIElQTCBpcyBhbmRlZCB3aXRoIDB4ZmJmZiwgcmVzdWx0aW5nIGluIGEgbmV3IGxldmVsCi0gKiAyLCB3aGljaCBzdGlsbCBibG9ja3MgdGhlIEhTWU5DLCBidXQgbm8gaW50ZXJydXB0cyBvZiBpbnRlcmVzdC4gSWYgdGhlCi0gKiBmcmFtZSBmb3JtYXQgaXMgMCwgdGhlIGludCBpcyBuZXN0ZWQsIGFuZCB0aGUgb2xkIElQTCB2YWx1ZSBjYW4gYmUgZm91bmQgaW4KLSAqIHRoZSBzciBjb3B5IGluIHRoZSBmcmFtZS4KICAqLwogCi0jaWYgMAotCi0jZGVmaW5lCU5VTV9JTlRfU09VUkNFUwkoOCArIE5VTV9BVEFSSV9TT1VSQ0VTKQotCi10eXBlZGVmIHZvaWQgKCphc21faXJxX2hhbmRsZXIpKHZvaWQpOwotCi1zdHJ1Y3QgaXJxaGFuZGxlciB7Ci0JaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0Jdm9pZAkqZGV2X2lkOwotfTsKLQotc3RydWN0IGlycXBhcmFtIHsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCWNvbnN0IGNoYXIJKmRldm5hbWU7Ci19OwotCi0vKgotICogQXJyYXkgd2l0aCBpcnEncyBhbmQgdGhlaXIgcGFyYW1ldGVyIGRhdGEuIFRoaXMgYXJyYXkgaXMgYWNjZXNzZWQgZnJvbSBsb3cKLSAqIGxldmVsIGFzc2VtYmxlciBjb2RlLCBzbyBhbiBlbGVtZW50IHNpemUgb2YgOCBhbGxvd3MgdXNhZ2Ugb2YgaW5kZXggc2NhbGluZwotICogYWRkcmVzc2luZyBtb2RlLgotICovCi1zdGF0aWMgc3RydWN0IGlycWhhbmRsZXIgaXJxX2hhbmRsZXJbTlVNX0lOVF9TT1VSQ0VTXTsKLQotLyoKLSAqIFRoaXMgYXJyYXkgaG9sZCB0aGUgcmVzdCBvZiBwYXJhbWV0ZXJzIG9mIGludCBoYW5kbGVyczogdHlwZQotICogKHNsb3csZmFzdCxwcmlvKSBhbmQgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZXNlIHZhbHVlcyBhcmUgb25seQotICogYWNjZXNzZWQgZnJvbSBDCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaXJxcGFyYW0gaXJxX3BhcmFtW05VTV9JTlRfU09VUkNFU107Ci0KLS8qIGNoZWNrIGZvciB2YWxpZCBpbnQgbnVtYmVyIChjb21wbGV4LCBzaWdoLi4uKSAqLwotI2RlZmluZQlJU19WQUxJRF9JTlROTyhuKQkJCQkJCQkJCQkJXAotCSgobikgPiAwICYmCQkJCQkJCQkJCQkJCQlcCi0JIC8qIGF1dG92ZWMgYW5kIFNULU1GUCBvayBhbnl3YXkgKi8JCQkJCQkJCVwKLQkgKCgobikgPCBUVE1GUF9TT1VSQ0VfQkFTRSkgfHwJCQkJCQkJCQlcCi0JICAvKiBUVC1NRlAgb2sgaWYgcHJlc2VudCAqLwkJCQkJCQkJCVwKLQkgICgobikgPj0gVFRNRlBfU09VUkNFX0JBU0UgJiYgKG4pIDwgU0NDX1NPVVJDRV9CQVNFICYmCQkJXAotCSAgIEFUQVJJSFdfUFJFU0VOVChUVF9NRlApKSB8fAkJCQkJCQkJCVwKLQkgIC8qIFNDQyBvayBpZiBwcmVzZW50IGFuZCBudW1iZXIgZXZlbiAqLwkJCQkJCVwKLQkgICgobikgPj0gU0NDX1NPVVJDRV9CQVNFICYmIChuKSA8IFZNRV9TT1VSQ0VfQkFTRSAmJgkJCVwKLQkgICAhKChuKSAmIDEpICYmIEFUQVJJSFdfUFJFU0VOVChTQ0MpKSB8fAkJCQkJCVwKLQkgIC8qIGdyZWF0ZXIgbnVtYmVycyBvayBpZiB0aGV5IGFyZSByZWdpc3RlcmVkIFZNRSB2ZWN0b3JzICovCQlcCi0JICAoKG4pID49IFZNRV9TT1VSQ0VfQkFTRSAmJiAobikgPCBWTUVfU09VUkNFX0JBU0UgKyBWTUVfTUFYX1NPVVJDRVMgJiYgXAotCQkgIGZyZWVfdm1lX3ZlY19iaXRtYXAgJiAoMSA8PCAoKG4pIC0gVk1FX1NPVVJDRV9CQVNFKSkpKSkKLQotCi0vKgotICogSGVyZSBzdGFydCB0aGUgYXNzZW1ibGVyIGVudHJ5IHBvaW50cyBmb3IgaW50ZXJydXB0cwotICovCi0KLSNkZWZpbmUgSVJRX05BTUUobnIpIGF0YXJpX3Nsb3dfaXJxXyMjbnIjI19oYW5kbGVyKHZvaWQpCi0KLSNkZWZpbmUJQlVJTERfU0xPV19JUlEobikJCQkJCQkgICBcCi1hc21saW5rYWdlIHZvaWQgSVJRX05BTUUobik7CQkJCQkJICAgXAotLyogRHVtbXkgZnVuY3Rpb24gdG8gYWxsb3cgYXNtIHdpdGggb3BlcmFuZHMuICAqLwkJCSAgIFwKLXZvaWQgYXRhcmlfc2xvd19pcnFfIyNuIyNfZHVtbXkgKHZvaWQpIHsJCQkJICAgXAotX19hc21fXyAoX19BTElHTl9TVFIgIlxuIgkJCQkJCSAgIFwKLSJhdGFyaV9zbG93X2lycV8iICNuICJfaGFuZGxlcjpcdCIJCQkJCSAgIFwKLSIJYWRkbAklNiwlNVxuIgkvKiBwcmVlbXB0X2NvdW50KCkgKz0gSEFSRElSUV9PRkZTRVQgKi8JICAgXAotCVNBVkVfQUxMX0lOVCAiXG4iCQkJCQkJICAgXAotCUdFVF9DVVJSRU5UKCUlZDApICJcbiIJCQkJCQkgICBcCi0iCWFuZGIJI34oMTw8KCVjMyY3KSksJWE0OndcbiIJLyogbWFzayB0aGlzIGludGVycnVwdCAqLwkgICBcCi0JLyogZ2V0IG9sZCBJUEwgZnJvbSBzdGFjayBmcmFtZSAqLwkJCQkgICBcCi0iCWJmZXh0dQklJXNwQCglYzIpeyM1LCMzfSwlJWQwXG4iCQkJCSAgIFwKLSIJbW92ZXcJJSVzciwlJWQxXG4iCQkJCQkJICAgXAotIgliZmlucwklJWQwLCUlZDF7IzIxLCMzfVxuIgkJCQkJICAgXAotIgltb3ZldwklJWQxLCUlc3JcbiIJCS8qIHNldCBJUEwgPSBwcmV2aW91cyB2YWx1ZSAqLwkgICBcCi0iCWFkZHFsCSMxLCVhMFxuIgkJCQkJCSAgIFwKLSIJbGVhCSVhMSwlJWEwXG4iCQkJCQkJICAgXAotIglwZWEJJSVzcEBcbiIJCS8qIHB1c2ggYWRkciBvZiBmcmFtZSAqLwkgICBcCi0iCW1vdmVsCSUlYTBAKDQpLCUlc3BALVxuIgkvKiBwdXNoIGhhbmRsZXIgZGF0YSAqLwkJICAgXAotIglwZWEJKCVjMys4KVxuIgkJLyogcHVzaCBpbnQgbnVtYmVyICovCQkgICBcCi0iCW1vdmVsCSUlYTBALCUlYTBcbiIJCQkJCQkgICBcCi0iCWpic3IJJSVhMEBcbiIJCS8qIGNhbGwgdGhlIGhhbmRsZXIgKi8JCSAgIFwKLSIJYWRkcWwJIzgsJSVzcFxuIgkJCQkJCSAgIFwKLSIJYWRkcWwJIzQsJSVzcFxuIgkJCQkJCSAgIFwKLSIJb3J3CSMweDA2MDAsJSVzclxuIgkJCQkJCSAgIFwKLSIJYW5kdwkjMHhmZWZmLCUlc3JcbiIJCS8qIHNldCBJUEwgPSA2IGFnYWluICovCQkgICBcCi0iCW9yYgkjKDE8PCglYzMmNykpLCVhNDp3XG4iCS8qIG5vdyB1bm1hc2sgdGhlIGludCBhZ2FpbiAqLwkgICBcCi0iCWpicmEJcmV0X2Zyb21faW50ZXJydXB0XG4iCQkJCQkgICBcCi0JIDogOiAiaSIgKCZrc3RhdF9jcHUoMCkuaXJxc1tuKzhdKSwgImkiICgmaXJxX2hhbmRsZXJbbis4XSksCSAgIFwKLQkgICAgICJuIiAoUFRfT0ZGX1NSKSwgIm4iIChuKSwJCQkJCSAgIFwKLQkgICAgICJpIiAobiAmIDggPyAobiAmIDE2ID8gJnR0X21mcC5pbnRfbWtfYSA6ICZzdF9tZnAuaW50X21rX2EpICAgXAotCQkgICAgICAgIDogKG4gJiAxNiA/ICZ0dF9tZnAuaW50X21rX2IgOiAmc3RfbWZwLmludF9ta19iKSksIFwKLQkgICAgICJtIiAocHJlZW1wdF9jb3VudCgpKSwgImRpIiAoSEFSRElSUV9PRkZTRVQpCQkgICBcCi0pOwkJCQkJCQkJCSAgIFwKLQlmb3IgKDs7KTsJCQkvKiBmYWtlIG5vcmV0dXJuICovCQkgICBcCi19Ci0KLUJVSUxEX1NMT1dfSVJRKDApOwotQlVJTERfU0xPV19JUlEoMSk7Ci1CVUlMRF9TTE9XX0lSUSgyKTsKLUJVSUxEX1NMT1dfSVJRKDMpOwotQlVJTERfU0xPV19JUlEoNCk7Ci1CVUlMRF9TTE9XX0lSUSg1KTsKLUJVSUxEX1NMT1dfSVJRKDYpOwotQlVJTERfU0xPV19JUlEoNyk7Ci1CVUlMRF9TTE9XX0lSUSg4KTsKLUJVSUxEX1NMT1dfSVJRKDkpOwotQlVJTERfU0xPV19JUlEoMTApOwotQlVJTERfU0xPV19JUlEoMTEpOwotQlVJTERfU0xPV19JUlEoMTIpOwotQlVJTERfU0xPV19JUlEoMTMpOwotQlVJTERfU0xPV19JUlEoMTQpOwotQlVJTERfU0xPV19JUlEoMTUpOwotQlVJTERfU0xPV19JUlEoMTYpOwotQlVJTERfU0xPV19JUlEoMTcpOwotQlVJTERfU0xPV19JUlEoMTgpOwotQlVJTERfU0xPV19JUlEoMTkpOwotQlVJTERfU0xPV19JUlEoMjApOwotQlVJTERfU0xPV19JUlEoMjEpOwotQlVJTERfU0xPV19JUlEoMjIpOwotQlVJTERfU0xPV19JUlEoMjMpOwotQlVJTERfU0xPV19JUlEoMjQpOwotQlVJTERfU0xPV19JUlEoMjUpOwotQlVJTERfU0xPV19JUlEoMjYpOwotQlVJTERfU0xPV19JUlEoMjcpOwotQlVJTERfU0xPV19JUlEoMjgpOwotQlVJTERfU0xPV19JUlEoMjkpOwotQlVJTERfU0xPV19JUlEoMzApOwotQlVJTERfU0xPV19JUlEoMzEpOwotCi1hc21faXJxX2hhbmRsZXIgc2xvd19oYW5kbGVyc1szMl0gPSB7Ci0JWzBdCT0gYXRhcmlfc2xvd19pcnFfMF9oYW5kbGVyLAotCVsxXQk9IGF0YXJpX3Nsb3dfaXJxXzFfaGFuZGxlciwKLQlbMl0JPSBhdGFyaV9zbG93X2lycV8yX2hhbmRsZXIsCi0JWzNdCT0gYXRhcmlfc2xvd19pcnFfM19oYW5kbGVyLAotCVs0XQk9IGF0YXJpX3Nsb3dfaXJxXzRfaGFuZGxlciwKLQlbNV0JPSBhdGFyaV9zbG93X2lycV81X2hhbmRsZXIsCi0JWzZdCT0gYXRhcmlfc2xvd19pcnFfNl9oYW5kbGVyLAotCVs3XQk9IGF0YXJpX3Nsb3dfaXJxXzdfaGFuZGxlciwKLQlbOF0JPSBhdGFyaV9zbG93X2lycV84X2hhbmRsZXIsCi0JWzldCT0gYXRhcmlfc2xvd19pcnFfOV9oYW5kbGVyLAotCVsxMF0JPSBhdGFyaV9zbG93X2lycV8xMF9oYW5kbGVyLAotCVsxMV0JPSBhdGFyaV9zbG93X2lycV8xMV9oYW5kbGVyLAotCVsxMl0JPSBhdGFyaV9zbG93X2lycV8xMl9oYW5kbGVyLAotCVsxM10JPSBhdGFyaV9zbG93X2lycV8xM19oYW5kbGVyLAotCVsxNF0JPSBhdGFyaV9zbG93X2lycV8xNF9oYW5kbGVyLAotCVsxNV0JPSBhdGFyaV9zbG93X2lycV8xNV9oYW5kbGVyLAotCVsxNl0JPSBhdGFyaV9zbG93X2lycV8xNl9oYW5kbGVyLAotCVsxN10JPSBhdGFyaV9zbG93X2lycV8xN19oYW5kbGVyLAotCVsxOF0JPSBhdGFyaV9zbG93X2lycV8xOF9oYW5kbGVyLAotCVsxOV0JPSBhdGFyaV9zbG93X2lycV8xOV9oYW5kbGVyLAotCVsyMF0JPSBhdGFyaV9zbG93X2lycV8yMF9oYW5kbGVyLAotCVsyMV0JPSBhdGFyaV9zbG93X2lycV8yMV9oYW5kbGVyLAotCVsyMl0JPSBhdGFyaV9zbG93X2lycV8yMl9oYW5kbGVyLAotCVsyM10JPSBhdGFyaV9zbG93X2lycV8yM19oYW5kbGVyLAotCVsyNF0JPSBhdGFyaV9zbG93X2lycV8yNF9oYW5kbGVyLAotCVsyNV0JPSBhdGFyaV9zbG93X2lycV8yNV9oYW5kbGVyLAotCVsyNl0JPSBhdGFyaV9zbG93X2lycV8yNl9oYW5kbGVyLAotCVsyN10JPSBhdGFyaV9zbG93X2lycV8yN19oYW5kbGVyLAotCVsyOF0JPSBhdGFyaV9zbG93X2lycV8yOF9oYW5kbGVyLAotCVsyOV0JPSBhdGFyaV9zbG93X2lycV8yOV9oYW5kbGVyLAotCVszMF0JPSBhdGFyaV9zbG93X2lycV8zMF9oYW5kbGVyLAotCVszMV0JPSBhdGFyaV9zbG93X2lycV8zMV9oYW5kbGVyCi19OwotCi1hc21saW5rYWdlIHZvaWQgYXRhcmlfZmFzdF9pcnFfaGFuZGxlciggdm9pZCApOwotYXNtbGlua2FnZSB2b2lkIGF0YXJpX3ByaW9faXJxX2hhbmRsZXIoIHZvaWQgKTsKLQotLyogRHVtbXkgZnVuY3Rpb24gdG8gYWxsb3cgYXNtIHdpdGggb3BlcmFuZHMuICAqLwotdm9pZCBhdGFyaV9mYXN0X3ByaW9faXJxX2R1bW15ICh2b2lkKSB7Ci1fX2FzbV9fIChfX0FMSUdOX1NUUiAiXG4iCi0iYXRhcmlfZmFzdF9pcnFfaGFuZGxlcjpcblx0IgotCSJvcncJIzB4NzAwLCUlc3JcbiIJCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KLSJhdGFyaV9wcmlvX2lycV9oYW5kbGVyOlxuXHQiCi0JImFkZGwJJTMsJTJcblx0IgkJLyogcHJlZW1wdF9jb3VudCgpICs9IEhBUkRJUlFfT0ZGU0VUICovCi0JU0FWRV9BTExfSU5UICJcblx0IgotCUdFVF9DVVJSRU5UKCUlZDApICJcblx0IgotCS8qIGdldCB2ZWN0b3IgbnVtYmVyIGZyb20gc3RhY2sgZnJhbWUgYW5kIGNvbnZlcnQgdG8gc291cmNlICovCi0JImJmZXh0dQklJXNwQCglYzEpeyM0LCMxMH0sJSVkMFxuXHQiCi0JInN1YncJIygweDQwLTgpLCUlZDBcblx0IgotCSJqcGwJMWZcblx0IgotCSJhZGR3CSMoMHg0MC04LTB4MTgpLCUlZDBcbiIKLSAgICAiMTpcdGxlYQklYTAsJSVhMFxuXHQiCi0JImFkZHFsCSMxLCUlYTBAKCUlZDA6bDo0KVxuXHQiCi0JImxlYQlpcnFfaGFuZGxlciwlJWEwXG5cdCIKLQkibGVhCSUlYTBAKCUlZDA6bDo4KSwlJWEwXG5cdCIKLQkicGVhCSUlc3BAXG5cdCIJCS8qIHB1c2ggZnJhbWUgYWRkcmVzcyAqLwotCSJtb3ZlbAklJWEwQCg0KSwlJXNwQC1cblx0IgkvKiBwdXNoIGhhbmRsZXIgZGF0YSAqLwotCSJtb3ZlbAklJWQwLCUlc3BALVxuXHQiCS8qIHB1c2ggaW50IG51bWJlciAqLwotCSJtb3ZlbAklJWEwQCwlJWEwXG5cdCIKLQkianNyCSUlYTBAXG5cdCIJCS8qIGFuZCBjYWxsIHRoZSBoYW5kbGVyICovCi0JImFkZHFsCSM4LCUlc3Bcblx0IgotCSJhZGRxbAkjNCwlJXNwXG5cdCIKLQkiamJyYQlyZXRfZnJvbV9pbnRlcnJ1cHQiCi0JIDogOiAiaSIgKCZrc3RhdF9jcHUoMCkuaXJxcyksICJuIiAoUFRfT0ZGX0ZPUk1BVFZFQyksCi0JICAgICAibSIgKHByZWVtcHRfY291bnQoKSksICJkaSIgKEhBUkRJUlFfT0ZGU0VUKQotKTsKLQlmb3IgKDs7KTsKLX0KLSNlbmRpZgotCiAvKgogICogQml0bWFwIGZvciBmcmVlIGludGVycnVwdCB2ZWN0b3IgbnVtYmVycwogICogKG5ldyB2ZWN0b3JzIHN0YXJ0aW5nIGZyb20gMHg3MCBjYW4gYmUgYWxsb2NhdGVkIGJ5CkBAIC0zMjAsMzEgKzg0LDQ0IEBACiAKIGV4dGVybiBpbnQgYXRhcmlfU0NDX3Jlc2V0X2RvbmU7CiAKLXN0YXRpYyBpbnQgYXRhcmlfc3RhcnR1cF9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhcmlfaXJxX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCW02OGtfaXJxX3N0YXJ0dXAoaXJxKTsKKwl1bnNpZ25lZCBpbnQgaXJxID0gZGF0YS0+aXJxOworCisJbTY4a19pcnFfc3RhcnR1cChkYXRhKTsKIAlhdGFyaV90dXJub25faXJxKGlycSk7CiAJYXRhcmlfZW5hYmxlX2lycShpcnEpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhdGFyaV9zaHV0ZG93bl9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGF0YXJpX2lycV9zaHV0ZG93bihzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKKwogCWF0YXJpX2Rpc2FibGVfaXJxKGlycSk7CiAJYXRhcmlfdHVybm9mZl9pcnEoaXJxKTsKLQltNjhrX2lycV9zaHV0ZG93bihpcnEpOworCW02OGtfaXJxX3NodXRkb3duKGRhdGEpOwogCiAJaWYgKGlycSA9PSBJUlFfQVVUT180KQogCSAgICB2ZWN0b3JzW1ZFQ19JTlQ0XSA9IGZhbGNvbl9oYmxoYW5kbGVyOwogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIGF0YXJpX2lycV9jb250cm9sbGVyID0geworc3RhdGljIHZvaWQgYXRhcmlfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJYXRhcmlfZW5hYmxlX2lycShkYXRhLT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBhdGFyaV9pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJYXRhcmlfZGlzYWJsZV9pcnEoZGF0YS0+aXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBhdGFyaV9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAiYXRhcmkiLAotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGF0YXJpX2lycV9jb250cm9sbGVyLmxvY2spLAotCS5zdGFydHVwCT0gYXRhcmlfc3RhcnR1cF9pcnEsCi0JLnNodXRkb3duCT0gYXRhcmlfc2h1dGRvd25faXJxLAotCS5lbmFibGUJCT0gYXRhcmlfZW5hYmxlX2lycSwKLQkuZGlzYWJsZQk9IGF0YXJpX2Rpc2FibGVfaXJxLAorCS5pcnFfc3RhcnR1cAk9IGF0YXJpX2lycV9zdGFydHVwLAorCS5pcnFfc2h1dGRvd24JPSBhdGFyaV9pcnFfc2h1dGRvd24sCisJLmlycV9lbmFibGUJPSBhdGFyaV9pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IGF0YXJpX2lycV9kaXNhYmxlLAogfTsKIAogLyoKQEAgLTM2MCw4ICsxMzcsOSBAQAogCiB2b2lkIF9faW5pdCBhdGFyaV9pbml0X0lSUSh2b2lkKQogewotCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIE5VTV9BVEFSSV9TT1VSQ0VTIC0gSVJRX1VTRVIsIE5VTEwpOwotCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmF0YXJpX2lycV9jb250cm9sbGVyLCAxLCBOVU1fQVRBUklfU09VUkNFUyAtIDEpOworCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIE5VTV9BVEFSSV9TT1VSQ0VTIC0gSVJRX1VTRVIpOworCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmF0YXJpX2lycV9jaGlwLCBoYW5kbGVfc2ltcGxlX2lycSwgMSwKKwkJCQkgIE5VTV9BVEFSSV9TT1VSQ0VTIC0gMSk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBNRlAocykgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2F0YXJpL3RpbWUuYyBiL2FyY2gvbTY4ay9hdGFyaS90aW1lLmMKaW5kZXggYTA1MzFmMy4uYzBjYzY4YSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL3RpbWUuYworKysgYi9hcmNoL202OGsvYXRhcmkvdGltZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jCmluZGV4IDFlZGQ5NTAuLjgxMjg2NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYworKysgYi9hcmNoL202OGsvYnZtZTYwMDAvY29uZmlnLmMKQEAgLTg2LDcgKzg2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IGJ2bWU2MDAwX2luaXRfSVJRKHZvaWQpCiB7Ci0JbTY4a19zZXR1cF91c2VyX2ludGVycnVwdChWRUNfVVNFUiwgMTkyLCBOVUxMKTsKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCAxOTIpOwogfQogCiB2b2lkIF9faW5pdCBjb25maWdfYnZtZTYwMDAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9lbXUvbmZibG9jay5jIGIvYXJjaC9tNjhrL2VtdS9uZmJsb2NrLmMKaW5kZXggNDhlNTBmOC4uZTMwMTEzMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2VtdS9uZmJsb2NrLmMKKysrIGIvYXJjaC9tNjhrL2VtdS9uZmJsb2NrLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKIH07CiAKLXN0YXRpYyBpbnQgbmZoZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBuZmhkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWUsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgbmZoZF9kZXZpY2UgKmRldiA9IHF1ZXVlLT5xdWV1ZWRhdGE7CiAJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CkBAIC03Niw3ICs3Niw2IEBACiAJCXNlYyArPSBsZW47CiAJfQogCWJpb19lbmRpbyhiaW8sIDApOwotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG5maGRfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2hwMzAwL3RpbWUuYyBiL2FyY2gvbTY4ay9ocDMwMC90aW1lLmMKaW5kZXggZjYzMTJjNy4uYzg3ZmU2OSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2hwMzAwL3RpbWUuYworKysgYi9hcmNoL202OGsvaHAzMDAvdGltZS5jCkBAIC03MCw3ICs3MCw3IEBACiAKICAgYXNtIHZvbGF0aWxlKCIgbW92cHcgJTAsJTFAKDUpIiA6IDogImQiIChJTlRWQUwpLCAiYSIgKENMT0NLQkFTRSkpOwogCi0gIGlmIChyZXF1ZXN0X2lycShJUlFfQVVUT182LCBocDMwMF90aWNrLCBJUlFfRkxHX1NURCwgInRpbWVyIHRpY2siLCB2ZWN0b3IpKQorICBpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgaHAzMDBfdGljaywgMCwgInRpbWVyIHRpY2siLCB2ZWN0b3IpKQogICAgIHByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgdGltZXIgaW50ZXJydXB0XG4iKTsKIAogICBvdXRfOChDTE9DS0JBU0UgKyBDTEtDUjIsIDB4MSk7CQkvKiBzZWxlY3QgQ1IxICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vaGFyZGlycS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCA4NzBlNTM0Li5kYjMwZWQyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vaGFyZGlycS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKQEAgLTE4LDYgKzE4LDExIEBACiAKICNpZmRlZiBDT05GSUdfTU1VCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2tfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXByX2NyaXQoInVuZXhwZWN0ZWQgSVJRIHRyYXAgYXQgdmVjdG9yICUwMnhcbiIsIGlycSk7Cit9CisKIC8qIGVudHJ5LlMgaXMgc2Vuc2l0aXZlIHRvIHRoZSBvZmZzZXRzIG9mIHRoZXNlIGZpZWxkcyAqLwogdHlwZWRlZiBzdHJ1Y3QgewogCXVuc2lnbmVkIGludCBfX3NvZnRpcnFfcGVuZGluZzsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9pcnEuaAppbmRleCA2OWVkMGQ3NC4uNjE5OGRmNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2lycS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9pcnEuaApAQCAtMjcsMTEgKzI3LDYgQEAKIAogI2lmZGVmIENPTkZJR19NTVUKIAotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KLQogLyoKICAqIEludGVycnVwdCBzb3VyY2UgZGVmaW5pdGlvbnMKICAqIEdlbmVyYWwgaW50ZXJydXB0IHNvdXJjZXMgYXJlIHRoZSBsZXZlbCAxLTcuCkBAIC01NCwxMCArNDksNiBAQAogCiAjZGVmaW5lIElSUV9VU0VSCTgKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfY2Fub25pY2FsaXplKHVuc2lnbmVkIGludCBpcnEpOwotCi1zdHJ1Y3QgcHRfcmVnczsKLQogLyoKICAqIHZhcmlvdXMgZmxhZ3MgZm9yIHJlcXVlc3RfaXJxKCkgLSB0aGUgQW1pZ2Egbm93IHVzZXMgdGhlIHN0YW5kYXJkCiAgKiBtZWNoYW5pc20gbGlrZSBhbGwgb3RoZXIgYXJjaGl0ZWN0dXJlcyAtIElSUUZfRElTQUJMRUQgYW5kCkBAIC03MSw1NyArNjIsMjcgQEAKICNkZWZpbmUgSVJRX0ZMR19TVEQJKDB4ODAwMCkJLyogaW50ZXJuYWxseSB1c2VkCQkqLwogI2VuZGlmCiAKLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGNoYWluIHRvZ2V0aGVyIHRoZSBJU1JzIGZvciBhIHBhcnRpY3VsYXIKLSAqIGludGVycnVwdCBzb3VyY2UgKGlmIGl0IHN1cHBvcnRzIGNoYWluaW5nKS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgaXJxX25vZGUgewotCWlycXJldHVybl90CSgqaGFuZGxlcikoaW50LCB2b2lkICopOwotCXZvaWQJCSpkZXZfaWQ7Ci0Jc3RydWN0IGlycV9ub2RlICpuZXh0OwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JY29uc3QgY2hhcgkqZGV2bmFtZTsKLX0gaXJxX25vZGVfdDsKK3N0cnVjdCBpcnFfZGF0YTsKK3N0cnVjdCBpcnFfY2hpcDsKK3N0cnVjdCBpcnFfZGVzYzsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbTY4a19pcnFfc3RhcnR1cChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOworZXh0ZXJuIHVuc2lnbmVkIGludCBtNjhrX2lycV9zdGFydHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK2V4dGVybiB2b2lkIG02OGtfaXJxX3NodXRkb3duKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CitleHRlcm4gdm9pZCBtNjhrX3NldHVwX2F1dG9faW50ZXJydXB0KHZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQsCisJCQkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqKSk7CitleHRlcm4gdm9pZCBtNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KHVuc2lnbmVkIGludCB2ZWMsIHVuc2lnbmVkIGludCBjbnQpOworZXh0ZXJuIHZvaWQgbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcihzdHJ1Y3QgaXJxX2NoaXAgKiwKKwkJCQkgICAgICB2b2lkICgqaGFuZGxlKSh1bnNpZ25lZCBpbnQgaXJxLAorCQkJCQkJICAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBjbnQpOwogCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaGFzIG9ubHkgNCBlbGVtZW50cyBmb3Igc3BlZWQgcmVhc29ucwotICovCi1zdHJ1Y3QgaXJxX2hhbmRsZXIgewotCWludAkJKCpoYW5kbGVyKShpbnQsIHZvaWQgKik7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQl2b2lkCQkqZGV2X2lkOwotCWNvbnN0IGNoYXIJKmRldm5hbWU7Ci19OwotCi1zdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCWludCAoKnN0YXJ0dXApKHVuc2lnbmVkIGludCBpcnEpOwotCXZvaWQgKCpzaHV0ZG93bikodW5zaWduZWQgaW50IGlycSk7Ci0Jdm9pZCAoKmVuYWJsZSkodW5zaWduZWQgaW50IGlycSk7Ci0Jdm9pZCAoKmRpc2FibGUpKHVuc2lnbmVkIGludCBpcnEpOwotfTsKLQotZXh0ZXJuIGludCBtNjhrX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBtNjhrX2lycV9zaHV0ZG93bih1bnNpZ25lZCBpbnQpOwotCi0vKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IGlycV9ub2RlX3QKLSAqLwotZXh0ZXJuIGlycV9ub2RlX3QgKm5ld19pcnFfbm9kZSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgbTY4a19zZXR1cF9hdXRvX2ludGVycnVwdCh2b2lkICgqaGFuZGxlcikodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKSk7Ci1leHRlcm4gdm9pZCBtNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KHVuc2lnbmVkIGludCB2ZWMsIHVuc2lnbmVkIGludCBjbnQsCi0JCQkJICAgICAgdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKikpOwotZXh0ZXJuIHZvaWQgbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcihzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwotCi1hc21saW5rYWdlIHZvaWQgbTY4a19oYW5kbGVfaW50KHVuc2lnbmVkIGludCk7Ci1hc21saW5rYWdlIHZvaWQgX19tNjhrX2hhbmRsZV9pbnQodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaXJxX2Nhbm9uaWNhbGl6ZSh1bnNpZ25lZCBpbnQgaXJxKTsKIAogI2Vsc2UKICNkZWZpbmUgaXJxX2Nhbm9uaWNhbGl6ZShpcnEpICAoaXJxKQogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIAogYXNtbGlua2FnZSB2b2lkIGRvX0lSUShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gYXRvbWljX3QgaXJxX2Vycl9jb3VudDsKIAogI2VuZGlmIC8qIF9NNjhLX0lSUV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21hY2ludG9zaC5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21hY2ludG9zaC5oCmluZGV4IGMyYTFjNWUuLjEyZWJlNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tYWNpbnRvc2guaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbWFjaW50b3NoLmgKQEAgLTEyLDYgKzEyLDggQEAKIGV4dGVybiB2b2lkIG1hY19wb3dlcm9mZih2b2lkKTsKIGV4dGVybiB2b2lkIG1hY19pbml0X0lSUSh2b2lkKTsKIGV4dGVybiBpbnQgbWFjX2lycV9wZW5kaW5nKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBtYWNfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOworZXh0ZXJuIHZvaWQgbWFjX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CiAKIC8qCiAgKglGbG9wcHkgZHJpdmVyIG1hZ2ljIGhvb2sgLSBwcm9iYWJseSBzaG91bGRuJ3QgYmUgaGVyZQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3E0MGludHMuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9xNDBpbnRzLmgKaW5kZXggM2Q5NzBhZi4uMjJmMTJjOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3E0MGludHMuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcTQwaW50cy5oCkBAIC0yNCw2ICsyNCwzIEBACiAjZGVmaW5lIFE0MF9JUlExMF9NQVNLICAgICAgICgxPDw1KQogI2RlZmluZSBRNDBfSVJRMTRfTUFTSyAgICAgICAoMTw8NikKICNkZWZpbmUgUTQwX0lSUTE1X01BU0sgICAgICAgKDE8PDcpCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIHE0MF9wcm9iZV9pcnFfb24gKHZvaWQpOwotZXh0ZXJuIGludCBxNDBfcHJvYmVfaXJxX29mZiAodW5zaWduZWQgbG9uZyBpcnFzKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCA5YmY0OWM4Li5kNDcwOGNlIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC02Miw0ICs2Miw3IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZTdmMGYyZS4uYzU2OTYxOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCkBAIC02LDE2ICs2LDE1IEBACiBleHRyYS0kKENPTkZJR19TVU4zKQk6PSBzdW4zLWhlYWQubwogZXh0cmEteQkJCSs9IHZtbGludXgubGRzCiAKLW9iai15CTo9IGVudHJ5Lm8gbTY4a19rc3ltcy5vIG1vZHVsZS5vIHByb2Nlc3MubyBwdHJhY2UubyBzZXR1cC5vIHNpZ25hbC5vIFwKLQkgICBzeXNfbTY4ay5vIHN5c2NhbGx0YWJsZS5vIHRpbWUubyB0cmFwcy5vCitvYmoteQk6PSBlbnRyeS5vIGlycS5vIG02OGtfa3N5bXMubyBtb2R1bGUubyBwcm9jZXNzLm8gcHRyYWNlLm8gc2V0dXAubyBcCisJICAgc2lnbmFsLm8gc3lzX202OGsubyBzeXNjYWxsdGFibGUubyB0aW1lLm8gdHJhcHMubwogCi1vYmotJChDT05GSUdfTU1VKQkrPSBpbnRzLm8gZGV2cmVzLm8gdmVjdG9ycy5vCi1kZXZyZXMtJChDT05GSUdfTU1VKQk9IC4uLy4uLy4uL2tlcm5lbC9pcnEvZGV2cmVzLm8KK29iai0kKENPTkZJR19NTVUpCSs9IGludHMubyB2ZWN0b3JzLm8KIAogaWZuZGVmIENPTkZJR19NTVVfU1VOMwogb2JqLXkJCQkrPSBkbWEubwogZW5kaWYKIGlmbmRlZiBDT05GSUdfTU1VCi1vYmoteQkJCSs9IGluaXRfdGFzay5vIGlycS5vCitvYmoteQkJCSs9IGluaXRfdGFzay5vCiBlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2RtYV9tbS5jIGIvYXJjaC9tNjhrL2tlcm5lbC9kbWFfbW0uYwppbmRleCA0YmJiM2MyLi5hM2M0NzFiIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2RtYV9tbS5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvZG1hX21tLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2RtYV9uby5jIGIvYXJjaC9tNjhrL2tlcm5lbC9kbWFfbm8uYwppbmRleCBmYzYxNTQxLi5mMWRjM2ZjIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2RtYV9uby5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvZG1hX25vLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogdm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2VudHJ5X21tLlMgYi9hcmNoL202OGsva2VybmVsL2VudHJ5X21tLlMKaW5kZXggYmQwZWMwNS4uYzcxM2Y1MSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeV9tbS5TCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnlfbW0uUwpAQCAtNDgsNyArNDgsNyBAQAogLmdsb2JsIHN5c19mb3JrLCBzeXNfY2xvbmUsIHN5c192Zm9yawogLmdsb2JsIHJldF9mcm9tX2ludGVycnVwdCwgYmFkX2ludGVycnVwdAogLmdsb2JsIGF1dG9faXJxaGFuZGxlcl9maXh1cAotLmdsb2JsIHVzZXJfaXJxdmVjX2ZpeHVwLCB1c2VyX2lycWhhbmRsZXJfZml4dXAKKy5nbG9ibCB1c2VyX2lycXZlY19maXh1cAogCiAudGV4dAogRU5UUlkoYnVzZXJyKQpAQCAtMjA3LDcgKzIwNyw3IEBACiAJbW92ZWwJJXNwLCVzcEAtCiAJbW92ZWwJJWQwLCVzcEAtCQl8ICBwdXQgdmVjdG9yICMgb24gc3RhY2sKIGF1dG9faXJxaGFuZGxlcl9maXh1cCA9IC4gKyAyCi0JanNyCV9fbTY4a19oYW5kbGVfaW50CXwgIHByb2Nlc3MgdGhlIElSUQorCWpzcglkb19JUlEJCQl8ICBwcm9jZXNzIHRoZSBJUlEKIAlhZGRxbAkjOCwlc3AJCQl8ICBwb3AgcGFyYW1ldGVycyBvZmYgc3RhY2sKIAogcmV0X2Zyb21faW50ZXJydXB0OgpAQCAtMjQwLDggKzI0MCw3IEBACiAKIAltb3ZlbAklc3AsJXNwQC0KIAltb3ZlbAklZDAsJXNwQC0JCXwgIHB1dCB2ZWN0b3IgIyBvbiBzdGFjawotdXNlcl9pcnFoYW5kbGVyX2ZpeHVwID0gLiArIDIKLQlqc3IJX19tNjhrX2hhbmRsZV9pbnQJfCAgcHJvY2VzcyB0aGUgSVJRCisJanNyCWRvX0lSUQkJCXwgIHByb2Nlc3MgdGhlIElSUQogCWFkZHFsCSM4LCVzcAkJCXwgIHBvcCBwYXJhbWV0ZXJzIG9mZiBzdGFjawogCiAJc3VicWIJIzEsJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX1BSRUVNUFQrMSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jIGIvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMKaW5kZXggNzYxZWUwNC4uNzRmZWZhYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMKQEAgLTQsMjUgKzQsNiBAQAogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIDA3LzAzLzk2OiBUaW1lciBpbml0aWFsaXphdGlvbiwgYW5kIHRodXMgbWFjaF9zY2hlZF9pbml0KCksCi0gKiAgICAgICAgICAgcmVtb3ZlZCBmcm9tIHJlcXVlc3RfaXJxKCkgYW5kIG1vdmVkIHRvIGluaXRfdGltZSgpLgotICogICAgICAgICAgIFdlIHNob3VsZCB0aGVyZWZvcmUgY29uc2lkZXIgcmVuYW1pbmcgb3VyIGFkZF9pc3IoKSBhbmQKLSAqICAgICAgICAgICByZW1vdmVfaXNyKCkgdG8gcmVxdWVzdF9pcnEoKSBhbmQgZnJlZV9pcnEoKQotICogICAgICAgICAgIHJlc3BlY3RpdmVseSwgc28gdGhleSBhcmUgY29tcGxpYW50IHdpdGggdGhlIG90aGVyCi0gKiAgICAgICAgICAgYXJjaGl0ZWN0dXJlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL0plcwotICogMTEvMDcvOTY6IENoYW5nZWQgYWxsIGFkZF8vcmVtb3ZlX2lzcigpIHRvIHJlcXVlc3RfL2ZyZWVfaXJxKCkgY2FsbHMuCi0gKiAgICAgICAgICAgUmVtb3ZlZCBpcnEgbGlzdCBzdXBwb3J0LCBpZiBhbnkgbWFjaGluZSBuZWVkcyBhbiBpcnEgc2VydmVyCi0gKiAgICAgICAgICAgaXQgbXVzdCBpbXBsZW1lbnQgdGhpcyBpdHNlbGYgKGFzIGl0J3MgYWxyZWFkeSBkb25lKSwgaW5zdGVhZAotICogICAgICAgICAgIG9ubHkgZGVmYXVsdCBoYW5kbGVyIGFyZSB1c2VkIHdpdGggbWFjaF9kZWZhdWx0X2hhbmRsZXIuCi0gKiAgICAgICAgICAgcmVxdWVzdF9pcnEgZ290IHNvbWUgZmxhZ3MgZGlmZmVyZW50IGZyb20gb3RoZXIgYXJjaGl0ZWN0dXJlczoKLSAqICAgICAgICAgICAtIElSUV9GTEdfUkVQTEFDRSA6IFJlcGxhY2UgYW4gZXhpc3RpbmcgaGFuZGxlciAodGhlIGRlZmF1bHQgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgcmVwbGFjZWQgd2l0aG91dCB0aGlzIGZsYWcpCi0gKiAgICAgICAgICAgLSBJUlFfRkxHX0xPQ0sgOiBoYW5kbGVyIGNhbid0IGJlIHJlcGxhY2VkCi0gKiAgICAgICAgICAgVGhlcmUgYXJlIG90aGVyIG1hY2hpbmUgZGVwZW5kaW5nIGZsYWdzLCBzZWUgdGhlcmUKLSAqICAgICAgICAgICBJZiB5b3Ugd2FudCB0byByZXBsYWNlIGEgZGVmYXVsdCBoYW5kbGVyIHlvdSBzaG91bGQga25vdyB3aGF0Ci0gKiAgICAgICAgICAgeW91J3JlIGRvaW5nLCBzaW5jZSBpdCBtaWdodCBoYW5kbGUgZGlmZmVyZW50IG90aGVyIGlycSBzb3VyY2VzCi0gKiAgICAgICAgICAgd2hpY2ggbXVzdCBiZSBzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1JvbWFuIFppcHBlbAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQ3LDMzICsyOCwyMiBAQAogI2VuZGlmCiAKIGV4dGVybiB1MzIgYXV0b19pcnFoYW5kbGVyX2ZpeHVwW107Ci1leHRlcm4gdTMyIHVzZXJfaXJxaGFuZGxlcl9maXh1cFtdOwogZXh0ZXJuIHUxNiB1c2VyX2lycXZlY19maXh1cFtdOwogCi0vKiB0YWJsZSBmb3Igc3lzdGVtIGludGVycnVwdCBoYW5kbGVycyAqLwotc3RhdGljIHN0cnVjdCBpcnFfbm9kZSAqaXJxX2xpc3RbTlJfSVJRU107Ci1zdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyICppcnFfY29udHJvbGxlcltOUl9JUlFTXTsKLXN0YXRpYyBpbnQgaXJxX2RlcHRoW05SX0lSUVNdOwotCiBzdGF0aWMgaW50IG02OGtfZmlyc3RfdXNlcl92ZWM7CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgYXV0b19pcnFfY29udHJvbGxlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYXV0b19pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAiYXV0byIsCi0JLmxvY2sJCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQoYXV0b19pcnFfY29udHJvbGxlci5sb2NrKSwKLQkuc3RhcnR1cAk9IG02OGtfaXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duCT0gbTY4a19pcnFfc2h1dGRvd24sCisJLmlycV9zdGFydHVwCT0gbTY4a19pcnFfc3RhcnR1cCwKKwkuaXJxX3NodXRkb3duCT0gbTY4a19pcnFfc2h1dGRvd24sCiB9OwogCi1zdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIHVzZXJfaXJxX2NvbnRyb2xsZXIgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHVzZXJfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gInVzZXIiLAotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHVzZXJfaXJxX2NvbnRyb2xsZXIubG9jayksCi0JLnN0YXJ0dXAJPSBtNjhrX2lycV9zdGFydHVwLAotCS5zaHV0ZG93bgk9IG02OGtfaXJxX3NodXRkb3duLAorCS5pcnFfc3RhcnR1cAk9IG02OGtfaXJxX3N0YXJ0dXAsCisJLmlycV9zaHV0ZG93bgk9IG02OGtfaXJxX3NodXRkb3duLAogfTsKIAotI2RlZmluZSBOVU1fSVJRX05PREVTIDEwMAotc3RhdGljIGlycV9ub2RlX3Qgbm9kZXNbTlVNX0lSUV9OT0RFU107Ci0KIC8qCiAgKiB2b2lkIGluaXRfSVJRKHZvaWQpCiAgKgpAQCAtOTYsNyArNjYsNyBAQAogCX0KIAogCWZvciAoaSA9IElSUV9BVVRPXzE7IGkgPD0gSVJRX0FVVE9fNzsgaSsrKQotCQlpcnFfY29udHJvbGxlcltpXSA9ICZhdXRvX2lycV9jb250cm9sbGVyOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJmF1dG9faXJxX2NoaXAsIGhhbmRsZV9zaW1wbGVfaXJxKTsKIAogCW1hY2hfaW5pdF9JUlEoKTsKIH0KQEAgLTEwNiw3ICs3Niw3IEBACiAgKiBAaGFuZGxlcjogY2FsbGVkIGZyb20gYXV0byB2ZWN0b3IgaW50ZXJydXB0cwogICoKICAqIHNldHVwIHRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCBmcm9tIGF1dG8gdmVjdG9yIGludGVycnVwdHMgaW5zdGVhZCBvZiB0aGUKLSAqIHN0YW5kYXJkIF9fbTY4a19oYW5kbGVfaW50KCksIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggaXJxIG51bWJlcnMgaW4gdGhlIHJhbmdlCisgKiBzdGFuZGFyZCBkb19JUlEoKSwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBpcnEgbnVtYmVycyBpbiB0aGUgcmFuZ2UKICAqIGZyb20gSVJRX0FVVE9fMSAtIElSUV9BVVRPXzcuCiAgKi8KIHZvaWQgX19pbml0IG02OGtfc2V0dXBfYXV0b19pbnRlcnJ1cHQodm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKikpCkBAIC0xMjAsMjE3ICs5MCw0OSBAQAogICogbTY4a19zZXR1cF91c2VyX2ludGVycnVwdAogICogQHZlYzogZmlyc3QgdXNlciB2ZWN0b3IgaW50ZXJydXB0IHRvIGhhbmRsZQogICogQGNudDogbnVtYmVyIG9mIGFjdGl2ZSB1c2VyIHZlY3RvciBpbnRlcnJ1cHRzCi0gKiBAaGFuZGxlcjogY2FsbGVkIGZyb20gdXNlciB2ZWN0b3IgaW50ZXJydXB0cwogICoKICAqIHNldHVwIHVzZXIgdmVjdG9yIGludGVycnVwdHMsIHRoaXMgaW5jbHVkZXMgYWN0aXZhdGluZyB0aGUgc3BlY2lmaWVkIHJhbmdlCiAgKiBvZiBpbnRlcnJ1cHRzLCBvbmx5IHRoZW4gdGhlc2UgaW50ZXJydXB0cyBjYW4gYmUgcmVxdWVzdGVkIChub3RlOiB0aGlzIGlzCi0gKiBkaWZmZXJlbnQgZnJvbSBhdXRvIHZlY3RvciBpbnRlcnJ1cHRzKS4gQW4gb3B0aW9uYWwgaGFuZGxlciBjYW4gYmUgaW5zdGFsbGVkCi0gKiB0byBiZSBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBfX202OGtfaGFuZGxlX2ludCgpLCBpdCB3aWxsIGJlIGNhbGxlZAotICogd2l0aCBpcnEgbnVtYmVycyBzdGFydGluZyBmcm9tIElSUV9VU0VSLgorICogZGlmZmVyZW50IGZyb20gYXV0byB2ZWN0b3IgaW50ZXJydXB0cykuCiAgKi8KLXZvaWQgX19pbml0IG02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQodW5zaWduZWQgaW50IHZlYywgdW5zaWduZWQgaW50IGNudCwKLQkJCQkgICAgICB2b2lkICgqaGFuZGxlcikodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKSkKK3ZvaWQgX19pbml0IG02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQodW5zaWduZWQgaW50IHZlYywgdW5zaWduZWQgaW50IGNudCkKIHsKIAlpbnQgaTsKIAogCUJVR19PTihJUlFfVVNFUiArIGNudCA+IE5SX0lSUVMpOwogCW02OGtfZmlyc3RfdXNlcl92ZWMgPSB2ZWM7CiAJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQotCQlpcnFfY29udHJvbGxlcltJUlFfVVNFUiArIGldID0gJnVzZXJfaXJxX2NvbnRyb2xsZXI7CisJCWlycV9zZXRfY2hpcChJUlFfVVNFUiArIGksICZ1c2VyX2lycV9jaGlwKTsKIAkqdXNlcl9pcnF2ZWNfZml4dXAgPSB2ZWMgLSBJUlFfVVNFUjsKLQlpZiAoaGFuZGxlcikKLQkJKnVzZXJfaXJxaGFuZGxlcl9maXh1cCA9ICh1MzIpaGFuZGxlcjsKIAlmbHVzaF9pY2FjaGUoKTsKIH0KIAogLyoqCiAgKiBtNjhrX3NldHVwX2lycV9jb250cm9sbGVyCi0gKiBAY29udHI6IGlycSBjb250cm9sbGVyIHdoaWNoIGNvbnRyb2xzIHNwZWNpZmllZCBpcnEKKyAqIEBjaGlwOiBpcnEgY2hpcCB3aGljaCBjb250cm9scyBzcGVjaWZpZWQgaXJxCisgKiBAaGFuZGxlOiBmbG93IGhhbmRsZXIgd2hpY2ggaGFuZGxlcyBzcGVjaWZpZWQgaXJxCiAgKiBAaXJxOiBmaXJzdCBpcnEgdG8gYmUgbWFuYWdlZCBieSB0aGUgY29udHJvbGxlcgorICogQGNudDogbnVtYmVyIG9mIGlycXMgdG8gYmUgbWFuYWdlZCBieSB0aGUgY29udHJvbGxlcgogICoKICAqIENoYW5nZSB0aGUgY29udHJvbGxlciBmb3IgdGhlIHNwZWNpZmllZCByYW5nZSBvZiBpcnEsIHdoaWNoIHdpbGwgYmUgdXNlZCB0bwogICogbWFuYWdlIHRoZXNlIGlycS4gYXV0by91c2VyIGlycSBhbHJlYWR5IGhhdmUgYSBkZWZhdWx0IGNvbnRyb2xsZXIsIHdoaWNoIGNhbgogICogYmUgY2hhbmdlZCBhcyB3ZWxsLCBidXQgdGhlIGNvbnRyb2xsZXIgcHJvYmFibHkgc2hvdWxkIHVzZSBtNjhrX2lycV9zdGFydHVwLwogICogbTY4a19pcnFfc2h1dGRvd24uCiAgKi8KLXZvaWQgbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcihzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmNvbnRyLCB1bnNpZ25lZCBpbnQgaXJxLAordm9pZCBtNjhrX3NldHVwX2lycV9jb250cm9sbGVyKHN0cnVjdCBpcnFfY2hpcCAqY2hpcCwKKwkJCSAgICAgICBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlLCB1bnNpZ25lZCBpbnQgaXJxLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBjbnQpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCi0JCWlycV9jb250cm9sbGVyW2lycSArIGldID0gY29udHI7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWlycV9zZXRfY2hpcChpcnEgKyBpLCBjaGlwKTsKKwkJaWYgKGhhbmRsZSkKKwkJCWlycV9zZXRfaGFuZGxlcihpcnEgKyBpLCBoYW5kbGUpOworCX0KIH0KIAotaXJxX25vZGVfdCAqbmV3X2lycV9ub2RlKHZvaWQpCi17Ci0JaXJxX25vZGVfdCAqbm9kZTsKLQlzaG9ydCBpOwotCi0JZm9yIChub2RlID0gbm9kZXMsIGkgPSBOVU1fSVJRX05PREVTLTE7IGkgPj0gMDsgbm9kZSsrLCBpLS0pIHsKLQkJaWYgKCFub2RlLT5oYW5kbGVyKSB7Ci0JCQltZW1zZXQobm9kZSwgMCwgc2l6ZW9mKCpub2RlKSk7Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCX0KLQotCXByaW50ayAoIm5ld19pcnFfbm9kZTogb3V0IG9mIG5vZGVzXG4iKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotaW50IHNldHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX25vZGUgKm5vZGUpCi17Ci0Jc3RydWN0IGlycV9jb250cm9sbGVyICpjb250cjsKLQlzdHJ1Y3QgaXJxX25vZGUgKipwcmV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoaXJxID49IE5SX0lSUVMgfHwgIShjb250ciA9IGlycV9jb250cm9sbGVyW2lycV0pKSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWQgZnJvbSAlc1xuIiwKLQkJICAgICAgIF9fZnVuY19fLCBpcnEsIG5vZGUtPmRldm5hbWUpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjb250ci0+bG9jaywgZmxhZ3MpOwotCi0JcHJldiA9IGlycV9saXN0ICsgaXJxOwotCWlmICgqcHJldikgewotCQkvKiBDYW4ndCBzaGFyZSBpbnRlcnJ1cHRzIHVubGVzcyBib3RoIGFncmVlIHRvICovCi0JCWlmICghKCgqcHJldiktPmZsYWdzICYgbm9kZS0+ZmxhZ3MgJiBJUlFGX1NIQVJFRCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCXdoaWxlICgqcHJldikKLQkJCXByZXYgPSAmKCpwcmV2KS0+bmV4dDsKLQl9Ci0KLQlpZiAoIWlycV9saXN0W2lycV0pIHsKLQkJaWYgKGNvbnRyLT5zdGFydHVwKQotCQkJY29udHItPnN0YXJ0dXAoaXJxKTsKLQkJZWxzZQotCQkJY29udHItPmVuYWJsZShpcnEpOwotCX0KLQlub2RlLT5uZXh0ID0gTlVMTDsKLQkqcHJldiA9IG5vZGU7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250ci0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCByZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotCQlpcnFfaGFuZGxlcl90IGhhbmRsZXIsCi0JCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgaXJxX25vZGUgKm5vZGU7Ci0JaW50IHJlczsKLQotCW5vZGUgPSBuZXdfaXJxX25vZGUoKTsKLQlpZiAoIW5vZGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jbm9kZS0+aGFuZGxlciA9IGhhbmRsZXI7Ci0Jbm9kZS0+ZmxhZ3MgICA9IGZsYWdzOwotCW5vZGUtPmRldl9pZCAgPSBkZXZfaWQ7Ci0Jbm9kZS0+ZGV2bmFtZSA9IGRldm5hbWU7Ci0KLQlyZXMgPSBzZXR1cF9pcnEoaXJxLCBub2RlKTsKLQlpZiAocmVzKQotCQlub2RlLT5oYW5kbGVyID0gTlVMTDsKLQotCXJldHVybiByZXM7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocmVxdWVzdF9pcnEpOwotCi12b2lkIGZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmNvbnRyOwotCXN0cnVjdCBpcnFfbm9kZSAqKnAsICpub2RlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoaXJxID49IE5SX0lSUVMgfHwgIShjb250ciA9IGlycV9jb250cm9sbGVyW2lycV0pKSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWRcbiIsIF9fZnVuY19fLCBpcnEpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7Ci0KLQlwID0gaXJxX2xpc3QgKyBpcnE7Ci0Jd2hpbGUgKChub2RlID0gKnApKSB7Ci0JCWlmIChub2RlLT5kZXZfaWQgPT0gZGV2X2lkKQotCQkJYnJlYWs7Ci0JCXAgPSAmbm9kZS0+bmV4dDsKLQl9Ci0KLQlpZiAobm9kZSkgewotCQkqcCA9IG5vZGUtPm5leHQ7Ci0JCW5vZGUtPmhhbmRsZXIgPSBOVUxMOwotCX0gZWxzZQotCQlwcmludGsoIiVzOiBSZW1vdmluZyBwcm9iYWJseSB3cm9uZyBJUlEgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgaXJxKTsKLQotCWlmICghaXJxX2xpc3RbaXJxXSkgewotCQlpZiAoY29udHItPnNodXRkb3duKQotCQkJY29udHItPnNodXRkb3duKGlycSk7Ci0JCWVsc2UKLQkJCWNvbnRyLT5kaXNhYmxlKGlycSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHItPmxvY2ssIGZsYWdzKTsKLX0KLQotRVhQT1JUX1NZTUJPTChmcmVlX2lycSk7Ci0KLXZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpcnFfY29udHJvbGxlciAqY29udHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhKGNvbnRyID0gaXJxX2NvbnRyb2xsZXJbaXJxXSkpIHsKLQkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBpcnEpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGlycV9kZXB0aFtpcnFdKSB7Ci0JCWlmICghLS1pcnFfZGVwdGhbaXJxXSkgewotCQkJaWYgKGNvbnRyLT5lbmFibGUpCi0JCQkJY29udHItPmVuYWJsZShpcnEpOwotCQl9Ci0JfSBlbHNlCi0JCVdBUk5fT04oMSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHItPmxvY2ssIGZsYWdzKTsKLX0KLQotRVhQT1JUX1NZTUJPTChlbmFibGVfaXJxKTsKLQotdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpcnFfY29udHJvbGxlciAqY29udHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhKGNvbnRyID0gaXJxX2NvbnRyb2xsZXJbaXJxXSkpIHsKLQkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBpcnEpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCFpcnFfZGVwdGhbaXJxXSsrKSB7Ci0JCWlmIChjb250ci0+ZGlzYWJsZSkKLQkJCWNvbnRyLT5kaXNhYmxlKGlycSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnEpOwotCi12b2lkIGRpc2FibGVfaXJxX25vc3luYyh1bnNpZ25lZCBpbnQgaXJxKSBfX2F0dHJpYnV0ZV9fKChhbGlhcygiZGlzYWJsZV9pcnEiKSkpOwotCi1FWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxX25vc3luYyk7Ci0KLWludCBtNjhrX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCit1bnNpZ25lZCBpbnQgbTY4a19pcnFfc3RhcnR1cF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlpZiAoaXJxIDw9IElSUV9BVVRPXzcpCiAJCXZlY3RvcnNbVkVDX1NQVVIgKyBpcnFdID0gYXV0b19pbnRoYW5kbGVyOwpAQCAtMzM5LDggKzE0MSwxNSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIG02OGtfaXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCit1bnNpZ25lZCBpbnQgbTY4a19pcnFfc3RhcnR1cChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CisJcmV0dXJuIG02OGtfaXJxX3N0YXJ0dXBfaXJxKGRhdGEtPmlycSk7Cit9CisKK3ZvaWQgbTY4a19pcnFfc2h1dGRvd24oc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCBpcnEgPSBkYXRhLT5pcnE7CisKIAlpZiAoaXJxIDw9IElSUV9BVVRPXzcpCiAJCXZlY3RvcnNbVkVDX1NQVVIgKyBpcnFdID0gYmFkX2ludGhhbmRsZXI7CiAJZWxzZQpAQCAtMzQ4LDMzICsxNTcsNiBAQAogfQogCiAKLS8qCi0gKiBEbyB3ZSBuZWVkIHRoZXNlIHByb2JlIGZ1bmN0aW9ucyBvbiB0aGUgbTY4az8KLSAqCi0gKiAgLi4uIG1heSBiZSB1c2VmdWwgd2l0aCBJU0EgZGV2aWNlcwotICovCi11bnNpZ25lZCBsb25nIHByb2JlX2lycV9vbiAodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfUTQwCi0JaWYgKE1BQ0hfSVNfUTQwKQotCQlyZXR1cm4gcTQwX3Byb2JlX2lycV9vbigpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocHJvYmVfaXJxX29uKTsKLQotaW50IHByb2JlX2lycV9vZmYgKHVuc2lnbmVkIGxvbmcgaXJxcykKLXsKLSNpZmRlZiBDT05GSUdfUTQwCi0JaWYgKE1BQ0hfSVNfUTQwKQotCQlyZXR1cm4gcTQwX3Byb2JlX2lycV9vZmYoaXJxcyk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb2ZmKTsKLQogdW5zaWduZWQgaW50IGlycV9jYW5vbmljYWxpemUodW5zaWduZWQgaW50IGlycSkKIHsKICNpZmRlZiBDT05GSUdfUTQwCkBAIC0zODYsNTIgKzE2OCw5IEBACiAKIEVYUE9SVF9TWU1CT0woaXJxX2Nhbm9uaWNhbGl6ZSk7CiAKLWFzbWxpbmthZ2Ugdm9pZCBtNjhrX2hhbmRsZV9pbnQodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXJxX25vZGUgKm5vZGU7Ci0Ja3N0YXRfY3B1KDApLmlycXNbaXJxXSsrOwotCW5vZGUgPSBpcnFfbGlzdFtpcnFdOwotCWRvIHsKLQkJbm9kZS0+aGFuZGxlcihpcnEsIG5vZGUtPmRldl9pZCk7Ci0JCW5vZGUgPSBub2RlLT5uZXh0OwotCX0gd2hpbGUgKG5vZGUpOwotfQotCi1hc21saW5rYWdlIHZvaWQgX19tNjhrX2hhbmRsZV9pbnQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzOwotCW9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwotCW02OGtfaGFuZGxlX2ludChpcnEpOwotCXNldF9pcnFfcmVncyhvbGRfcmVncyk7Ci19CiAKIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfYmFkaW50KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWtzdGF0X2NwdSgwKS5pcnFzWzBdKys7Ci0JcHJpbnRrKCJ1bmV4cGVjdGVkIGludGVycnVwdCBmcm9tICV1XG4iLCByZWdzLT52ZWN0b3IpOworCWF0b21pY19pbmMoJmlycV9lcnJfY291bnQpOworCXByX3dhcm4oInVuZXhwZWN0ZWQgaW50ZXJydXB0IGZyb20gJXVcbiIsIHJlZ3MtPnZlY3Rvcik7CiB9Ci0KLWludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQotewotCXN0cnVjdCBpcnFfY29udHJvbGxlciAqY29udHI7Ci0Jc3RydWN0IGlycV9ub2RlICpub2RlOwotCWludCBpID0gKihsb2ZmX3QgKikgdjsKLQotCS8qIGF1dG92ZWN0b3IgaW50ZXJydXB0cyAqLwotCWlmIChpcnFfbGlzdFtpXSkgewotCQljb250ciA9IGlycV9jb250cm9sbGVyW2ldOwotCQlub2RlID0gaXJxX2xpc3RbaV07Ci0JCXNlcV9wcmludGYocCwgIiUtOHMgJTN1OiAlMTB1ICVzIiwgY29udHItPm5hbWUsIGksIGtzdGF0X2NwdSgwKS5pcnFzW2ldLCBub2RlLT5kZXZuYW1lKTsKLQkJd2hpbGUgKChub2RlID0gbm9kZS0+bmV4dCkpCi0JCQlzZXFfcHJpbnRmKHAsICIsICVzIiwgbm9kZS0+ZGV2bmFtZSk7Ci0JCXNlcV9wdXRzKHAsICJcbiIpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi12b2lkIGluaXRfaXJxX3Byb2Modm9pZCkKLXsKLQkvKiBJbnNlcnQgL3Byb2MvaXJxIGRyaXZlciBoZXJlICovCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvYmFib29uLmMgYi9hcmNoL202OGsvbWFjL2JhYm9vbi5jCmluZGV4IDJhOTZiZWIuLmI0MDM5MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvYmFib29uLmMKKysrIGIvYXJjaC9tNjhrL21hYy9iYWJvb24uYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KQEAgLTIwLDkgKzIxLDYgQEAKIAogLyogI2RlZmluZSBERUJVR19JUlFTICovCiAKLWV4dGVybiB2b2lkIG1hY19lbmFibGVfaXJxKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBtYWNfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKLQogaW50IGJhYm9vbl9wcmVzZW50Owogc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBiYWJvb24gKmJhYm9vbjsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJhYm9vbl9kaXNhYmxlZDsKQEAgLTUzLDcgKzUxLDcgQEAKICAqIEJhYm9vbiBpbnRlcnJ1cHQgaGFuZGxlci4gVGhpcyB3b3JrcyBhIGxvdCBsaWtlIGEgVklBLgogICovCiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBiYWJvb25faXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyB2b2lkIGJhYm9vbl9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWludCBpcnFfYml0LCBpcnFfbnVtOwogCXVuc2lnbmVkIGNoYXIgZXZlbnRzOwpAQCAtNjQsMTUgKzYyLDE2IEBACiAJCSh1aW50KSBiYWJvb24tPm1iX3N0YXR1cyk7CiAjZW5kaWYKIAotCWlmICghKGV2ZW50cyA9IGJhYm9vbi0+bWJfaWZyICYgMHgwNykpCi0JCXJldHVybiBJUlFfTk9ORTsKKwlldmVudHMgPSBiYWJvb24tPm1iX2lmciAmIDB4MDc7CisJaWYgKCFldmVudHMpCisJCXJldHVybjsKIAogCWlycV9udW0gPSBJUlFfQkFCT09OXzA7CiAJaXJxX2JpdCA9IDE7CiAJZG8gewogCSAgICAgICAgaWYgKGV2ZW50cyAmIGlycV9iaXQpIHsKIAkJCWJhYm9vbi0+bWJfaWZyICY9IH5pcnFfYml0OwotCQkJbTY4a19oYW5kbGVfaW50KGlycV9udW0pOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycV9udW0pOwogCQl9CiAJCWlycV9iaXQgPDw9IDE7CiAJCWlycV9udW0rKzsKQEAgLTgyLDcgKzgxLDYgQEAKIAkvKiBmb3Igbm93IHdlIG5lZWQgdG8gc21hc2ggYWxsIGludGVycnVwdHMgKi8KIAliYWJvb24tPm1iX2lmciAmPSB+ZXZlbnRzOwogI2VuZGlmCi0JcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAvKgpAQCAtOTIsOCArOTAsNyBAQAogdm9pZCBfX2luaXQgYmFib29uX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKIHsKIAliYWJvb25fZGlzYWJsZWQgPSAwOwotCWlmIChyZXF1ZXN0X2lycShJUlFfTlVCVVNfQywgYmFib29uX2lycSwgMCwgImJhYm9vbiIsICh2b2lkICopYmFib29uKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBiYWJvb24gaW50ZXJydXB0XG4iKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfTlVCVVNfQywgYmFib29uX2lycSk7CiB9CiAKIC8qCkBAIC0xMTEsNyArMTA4LDcgQEAKIAogCWJhYm9vbl9kaXNhYmxlZCAmPSB+KDEgPDwgaXJxX2lkeCk7CiAJaWYgKCFiYWJvb25fZGlzYWJsZWQpCi0JCW1hY19lbmFibGVfaXJxKElSUV9OVUJVU19DKTsKKwkJbWFjX2lycV9lbmFibGUoaXJxX2dldF9pcnFfZGF0YShJUlFfTlVCVVNfQykpOwogfQogCiB2b2lkIGJhYm9vbl9pcnFfZGlzYWJsZShpbnQgaXJxKQpAQCAtMTI0LDcgKzEyMSw3IEBACiAKIAliYWJvb25fZGlzYWJsZWQgfD0gMSA8PCBpcnFfaWR4OwogCWlmIChiYWJvb25fZGlzYWJsZWQpCi0JCW1hY19kaXNhYmxlX2lycShJUlFfTlVCVVNfQyk7CisJCW1hY19pcnFfZGlzYWJsZShpcnFfZ2V0X2lycV9kYXRhKElSUV9OVUJVU19DKSk7CiB9CiAKIHZvaWQgYmFib29uX2lycV9jbGVhcihpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9pb3AuYyBiL2FyY2gvbTY4ay9tYWMvaW9wLmMKaW5kZXggMWFkNGU5ZC4uYTU0NjJjYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9pb3AuYworKysgYi9hcmNoL202OGsvbWFjL2lvcC5jCkBAIC0zMDUsMTUgKzMwNSwxMyBAQAogewogCWlmIChpb3BfaXNtX3ByZXNlbnQpIHsKIAkJaWYgKG9zc19wcmVzZW50KSB7Ci0JCQlpZiAocmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9JT1BJU00sIGlvcF9pc21faXJxLAotCQkJCQlJUlFfRkxHX0xPQ0ssICJJU00gSU9QIiwKLQkJCQkJKHZvaWQgKikgSU9QX05VTV9JU00pKQorCQkJaWYgKHJlcXVlc3RfaXJxKE9TU19JUlFMRVZfSU9QSVNNLCBpb3BfaXNtX2lycSwgMCwKKwkJCQkJIklTTSBJT1AiLCAodm9pZCAqKUlPUF9OVU1fSVNNKSkKIAkJCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIElTTSBJT1AgaW50ZXJydXB0XG4iKTsKIAkJCW9zc19pcnFfZW5hYmxlKElSUV9NQUNfQURCKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChyZXF1ZXN0X2lycShJUlFfVklBMl8wLCBpb3BfaXNtX2lycSwKLQkJCQkJSVJRX0ZMR19MT0NLfElSUV9GTEdfRkFTVCwgIklTTSBJT1AiLAotCQkJCQkodm9pZCAqKSBJT1BfTlVNX0lTTSkpCisJCQlpZiAocmVxdWVzdF9pcnEoSVJRX1ZJQTJfMCwgaW9wX2lzbV9pcnEsIDAsICJJU00gSU9QIiwKKwkJCQkJKHZvaWQgKilJT1BfTlVNX0lTTSkpCiAJCQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBJU00gSU9QIGludGVycnVwdFxuIik7CiAJCX0KIAkJaWYgKCFpb3BfYWxpdmUoaW9wX2Jhc2VbSU9QX05VTV9JU01dKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9tYWNpbnRzLmMgYi9hcmNoL202OGsvbWFjL21hY2ludHMuYwppbmRleCBmOTIxOTBjLi5iYTIyMGI3IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL21hY2ludHMuYworKysgYi9hcmNoL202OGsvbWFjL21hY2ludHMuYwpAQCAtMTkwLDE0ICsxOTAsMTAgQEAKIAogLyogI2RlZmluZSBERUJVR19NQUNJTlRTICovCiAKLXZvaWQgbWFjX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSk7Ci12b2lkIG1hY19kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLQotc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBtYWNfaXJxX2NvbnRyb2xsZXIgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1hY19pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAibWFjIiwKLQkubG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChtYWNfaXJxX2NvbnRyb2xsZXIubG9jayksCi0JLmVuYWJsZQkJPSBtYWNfZW5hYmxlX2lycSwKLQkuZGlzYWJsZQk9IG1hY19kaXNhYmxlX2lycSwKKwkuaXJxX2VuYWJsZQk9IG1hY19pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IG1hY19pcnFfZGlzYWJsZSwKIH07CiAKIHZvaWQgX19pbml0IG1hY19pbml0X0lSUSh2b2lkKQpAQCAtMjA1LDcgKzIwMSw3IEBACiAjaWZkZWYgREVCVUdfTUFDSU5UUwogCXByaW50aygibWFjX2luaXRfSVJRKCk6IFNldHRpbmcgdGhpbmdzIHVwLi4uXG4iKTsKICNlbmRpZgotCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJm1hY19pcnFfY29udHJvbGxlciwgSVJRX1VTRVIsCisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmbWFjX2lycV9jaGlwLCBoYW5kbGVfc2ltcGxlX2lycSwgSVJRX1VTRVIsCiAJCQkJICBOVU1fTUFDX1NPVVJDRVMgLSBJUlFfVVNFUik7CiAJLyogTWFrZSBzdXJlIHRoZSBTT05JQyBpbnRlcnJ1cHQgaXMgY2xlYXJlZCBvciB0aGluZ3MgZ2V0IHVnbHkgKi8KICNpZmRlZiBTSFVUVVBfU09OSUMKQEAgLTI0MSwxNiArMjM3LDE3IEBACiB9CiAKIC8qCi0gKiAgbWFjX2VuYWJsZV9pcnEgLSBlbmFibGUgYW4gaW50ZXJydXB0IHNvdXJjZQotICogbWFjX2Rpc2FibGVfaXJxIC0gZGlzYWJsZSBhbiBpbnRlcnJ1cHQgc291cmNlCisgKiAgbWFjX2lycV9lbmFibGUgLSBlbmFibGUgYW4gaW50ZXJydXB0IHNvdXJjZQorICogbWFjX2lycV9kaXNhYmxlIC0gZGlzYWJsZSBhbiBpbnRlcnJ1cHQgc291cmNlCiAgKiAgIG1hY19jbGVhcl9pcnEgLSBjbGVhcnMgYSBwZW5kaW5nIGludGVycnVwdAotICogbWFjX3BlbmRpbmdfaXJxIC0gUmV0dXJucyB0aGUgcGVuZGluZyBzdGF0dXMgb2YgYW4gSVJRIChub256ZXJvID0gcGVuZGluZykKKyAqIG1hY19pcnFfcGVuZGluZyAtIHJldHVybnMgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIGFuIElSUSAobm9uemVybyA9IHBlbmRpbmcpCiAgKgogICogVGhlc2Ugcm91dGluZXMgYXJlIGp1c3QgZGlzcGF0Y2hlcnMgdG8gdGhlIFZJQS9PU1MvUFNDIHJvdXRpbmVzLgogICovCiAKLXZvaWQgbWFjX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3ZvaWQgbWFjX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQogeworCWludCBpcnEgPSBkYXRhLT5pcnE7CiAJaW50IGlycV9zcmMgPSBJUlFfU1JDKGlycSk7CiAKIAlzd2l0Y2goaXJxX3NyYykgewpAQCAtMjgzLDggKzI4MCw5IEBACiAJfQogfQogCi12b2lkIG1hY19kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQordm9pZCBtYWNfaXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQogeworCWludCBpcnEgPSBkYXRhLT5pcnE7CiAJaW50IGlycV9zcmMgPSBJUlFfU1JDKGlycSk7CiAKIAlzd2l0Y2goaXJxX3NyYykgewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9vc3MuYyBiL2FyY2gvbTY4ay9tYWMvb3NzLmMKaW5kZXggYTljMGY1YS4uYTRjODJkYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9vc3MuYworKysgYi9hcmNoL202OGsvbWFjL29zcy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogI2luY2x1ZGUgPGFzbS9tYWNpbnRvc2guaD4KQEAgLTI5LDEwICszMCw3IEBACiBpbnQgb3NzX3ByZXNlbnQ7CiB2b2xhdGlsZSBzdHJ1Y3QgbWFjX29zcyAqb3NzOwogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgb3NzX2lycShpbnQsIHZvaWQgKik7Ci1zdGF0aWMgaXJxcmV0dXJuX3Qgb3NzX251YnVzX2lycShpbnQsIHZvaWQgKik7Ci0KLWV4dGVybiBpcnFyZXR1cm5fdCB2aWExX2lycShpbnQsIHZvaWQgKik7CitleHRlcm4gdm9pZCB2aWExX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwogCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgT1NTCkBAIC02MCwyNiArNTgsNiBAQAogfQogCiAvKgotICogUmVnaXN0ZXIgdGhlIE9TUyBhbmQgTnVCdXMgaW50ZXJydXB0IGRpc3BhdGNoZXJzLgotICovCi0KLXZvaWQgX19pbml0IG9zc19yZWdpc3Rlcl9pbnRlcnJ1cHRzKHZvaWQpCi17Ci0JaWYgKHJlcXVlc3RfaXJxKE9TU19JUlFMRVZfU0NTSSwgb3NzX2lycSwgSVJRX0ZMR19MT0NLLAotCQkJInNjc2kiLCAodm9pZCAqKSBvc3MpKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgInNjc2kiKTsKLQlpZiAocmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9OVUJVUywgb3NzX251YnVzX2lycSwgSVJRX0ZMR19MT0NLLAotCQkJIm51YnVzIiwgKHZvaWQgKikgb3NzKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJudWJ1cyIpOwotCWlmIChyZXF1ZXN0X2lycShPU1NfSVJRTEVWX1NPVU5ELCBvc3NfaXJxLCBJUlFfRkxHX0xPQ0ssCi0JCQkic291bmQiLCAodm9pZCAqKSBvc3MpKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgInNvdW5kIik7Ci0JaWYgKHJlcXVlc3RfaXJxKE9TU19JUlFMRVZfVklBMSwgdmlhMV9pcnEsIElSUV9GTEdfTE9DSywKLQkJCSJ2aWExIiwgKHZvaWQgKikgdmlhMSkpCi0JCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAidmlhMSIpOwotfQotCi0vKgogICogSW5pdGlhbGl6ZSBPU1MgZm9yIE51YnVzIGFjY2VzcwogICovCiAKQEAgLTkyLDE3ICs3MCwxNyBAQAogICogYW5kIFNDU0k7IGV2ZXJ5dGhpbmcgZWxzZSBpcyByb3V0ZWQgdG8gaXRzIG93biBhdXRvdmVjdG9yIElSUS4KICAqLwogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgb3NzX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgdm9pZCBvc3NfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAlpbnQgZXZlbnRzOwogCiAJZXZlbnRzID0gb3NzLT5pcnFfcGVuZGluZyAmIChPU1NfSVBfU09VTkR8T1NTX0lQX1NDU0kpOwogCWlmICghZXZlbnRzKQotCQlyZXR1cm4gSVJRX05PTkU7CisJCXJldHVybjsKIAogI2lmZGVmIERFQlVHX0lSUVMKIAlpZiAoKGNvbnNvbGVfbG9nbGV2ZWwgPT0gMTApICYmICEoZXZlbnRzICYgT1NTX0lQX1NDU0kpKSB7Ci0JCXByaW50aygib3NzX2lycTogaXJxICVkIGV2ZW50cyA9IDB4JTA0WFxuIiwgaXJxLAorCQlwcmludGsoIm9zc19pcnE6IGlycSAldSBldmVudHMgPSAweCUwNFhcbiIsIGlycSwKIAkJCShpbnQpIG9zcy0+aXJxX3BlbmRpbmcpOwogCX0KICNlbmRpZgpAQCAtMTEzLDExICs5MSwxMCBAQAogCQkvKiBGSVhNRTogY2FsbCBzb3VuZCBoYW5kbGVyICovCiAJfSBlbHNlIGlmIChldmVudHMgJiBPU1NfSVBfU0NTSSkgewogCQlvc3MtPmlycV9wZW5kaW5nICY9IH5PU1NfSVBfU0NTSTsKLQkJbTY4a19oYW5kbGVfaW50KElSUV9NQUNfU0NTSSk7CisJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfTUFDX1NDU0kpOwogCX0gZWxzZSB7CiAJCS8qIEZJWE1FOiBlcnJvciBjaGVjayBoZXJlPyAqLwogCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIC8qCkBAIC0xMjYsMTMgKzEwMywxMyBAQAogICogVW5saWtlIHRoZSBWSUEvUkJWIHRoaXMgaXMgb24gaXRzIG93biBhdXRvdmVjdG9yIGludGVycnVwdCBsZXZlbC4KICAqLwogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgb3NzX251YnVzX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgdm9pZCBvc3NfbnVidXNfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAlpbnQgZXZlbnRzLCBpcnFfYml0LCBpOwogCiAJZXZlbnRzID0gb3NzLT5pcnFfcGVuZGluZyAmIE9TU19JUF9OVUJVUzsKIAlpZiAoIWV2ZW50cykKLQkJcmV0dXJuIElSUV9OT05FOworCQlyZXR1cm47CiAKICNpZmRlZiBERUJVR19OVUJVU19JTlQKIAlpZiAoY29uc29sZV9sb2dsZXZlbCA+IDcpIHsKQEAgLTE0OCwxMCArMTI1LDIxIEBACiAJCWlycV9iaXQgPj49IDE7CiAJCWlmIChldmVudHMgJiBpcnFfYml0KSB7CiAJCQlvc3MtPmlycV9wZW5kaW5nICY9IH5pcnFfYml0OwotCQkJbTY4a19oYW5kbGVfaW50KE5VQlVTX1NPVVJDRV9CQVNFICsgaSk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoTlVCVVNfU09VUkNFX0JBU0UgKyBpKTsKIAkJfQogCX0gd2hpbGUoZXZlbnRzICYgKGlycV9iaXQgLSAxKSk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogUmVnaXN0ZXIgdGhlIE9TUyBhbmQgTnVCdXMgaW50ZXJydXB0IGRpc3BhdGNoZXJzLgorICovCisKK3ZvaWQgX19pbml0IG9zc19yZWdpc3Rlcl9pbnRlcnJ1cHRzKHZvaWQpCit7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoT1NTX0lSUUxFVl9TQ1NJLCBvc3NfaXJxKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihPU1NfSVJRTEVWX05VQlVTLCBvc3NfbnVidXNfaXJxKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihPU1NfSVJRTEVWX1NPVU5ELCBvc3NfaXJxKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihPU1NfSVJRTEVWX1ZJQTEsIHZpYTFfaXJxKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvcHNjLmMgYi9hcmNoL202OGsvbWFjL3BzYy5jCmluZGV4IGE0YzNlYjYuLmU2YzJkMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvcHNjLmMKKysrIGIvYXJjaC9tNjhrL21hYy9wc2MuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KQEAgLTMwLDggKzMxLDYgQEAKIGludCBwc2NfcHJlc2VudDsKIHZvbGF0aWxlIF9fdTggKnBzYzsKIAotaXJxcmV0dXJuX3QgcHNjX2lycShpbnQsIHZvaWQgKik7Ci0KIC8qCiAgKiBEZWJ1Z2dpbmcgZHVtcCwgdXNlZCBpbiB2YXJpb3VzIHBsYWNlcyB0byBzZWUgd2hhdCdzIGdvaW5nIG9uLgogICovCkBAIC0xMTIsNTIgKzExMSw1MiBAQAogfQogCiAvKgotICogUmVnaXN0ZXIgdGhlIFBTQyBpbnRlcnJ1cHQgZGlzcGF0Y2hlcnMgZm9yIGF1dG92ZWN0b3IgaW50ZXJydXB0cyAzLTYuCi0gKi8KLQotdm9pZCBfX2luaXQgcHNjX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKLXsKLQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fMywgcHNjX2lycSwgMCwgInBzYzMiLCAodm9pZCAqKSAweDMwKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBwc2MlZCBpbnRlcnJ1cHRcbiIsIDMpOwotCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT180LCBwc2NfaXJxLCAwLCAicHNjNCIsICh2b2lkICopIDB4NDApKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIHBzYyVkIGludGVycnVwdFxuIiwgNCk7Ci0JaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIHBzY19pcnEsIDAsICJwc2M1IiwgKHZvaWQgKikgMHg1MCkpCi0JCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgcHNjJWQgaW50ZXJydXB0XG4iLCA1KTsKLQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgcHNjX2lycSwgMCwgInBzYzYiLCAodm9pZCAqKSAweDYwKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBwc2MlZCBpbnRlcnJ1cHRcbiIsIDYpOwotfQotCi0vKgogICogUFNDIGludGVycnVwdCBoYW5kbGVyLiBJdCdzIGEgbG90IGxpa2UgdGhlIFZJQSBpbnRlcnJ1cHQgaGFuZGxlci4KICAqLwogCi1pcnFyZXR1cm5fdCBwc2NfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyB2b2lkIHBzY19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCWludCBwSUZSCT0gcElGUmJhc2UgKyAoKGludCkgZGV2X2lkKTsKLQlpbnQgcElFUgk9IHBJRVJiYXNlICsgKChpbnQpIGRldl9pZCk7CisJdW5zaWduZWQgaW50IG9mZnNldCA9ICh1bnNpZ25lZCBpbnQpaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKKwlpbnQgcElGUgk9IHBJRlJiYXNlICsgb2Zmc2V0OworCWludCBwSUVSCT0gcElFUmJhc2UgKyBvZmZzZXQ7CiAJaW50IGlycV9udW07CiAJdW5zaWduZWQgY2hhciBpcnFfYml0LCBldmVudHM7CiAKICNpZmRlZiBERUJVR19JUlFTCi0JcHJpbnRrKCJwc2NfaXJxOiBpcnEgJWQgcElGUiA9IDB4JTAyWCBwSUVSID0gMHglMDJYXG4iLAorCXByaW50aygicHNjX2lycTogaXJxICV1IHBJRlIgPSAweCUwMlggcElFUiA9IDB4JTAyWFxuIiwKIAkJaXJxLCAoaW50KSBwc2NfcmVhZF9ieXRlKHBJRlIpLCAoaW50KSBwc2NfcmVhZF9ieXRlKHBJRVIpKTsKICNlbmRpZgogCiAJZXZlbnRzID0gcHNjX3JlYWRfYnl0ZShwSUZSKSAmIHBzY19yZWFkX2J5dGUocElFUikgJiAweEY7CiAJaWYgKCFldmVudHMpCi0JCXJldHVybiBJUlFfTk9ORTsKKwkJcmV0dXJuOwogCiAJaXJxX251bSA9IGlycSA8PCAzOwogCWlycV9iaXQgPSAxOwogCWRvIHsKIAkJaWYgKGV2ZW50cyAmIGlycV9iaXQpIHsKIAkJCXBzY193cml0ZV9ieXRlKHBJRlIsIGlycV9iaXQpOwotCQkJbTY4a19oYW5kbGVfaW50KGlycV9udW0pOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycV9udW0pOwogCQl9CiAJCWlycV9udW0rKzsKIAkJaXJxX2JpdCA8PD0gMTsKIAl9IHdoaWxlIChldmVudHMgPj0gaXJxX2JpdCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogUmVnaXN0ZXIgdGhlIFBTQyBpbnRlcnJ1cHQgZGlzcGF0Y2hlcnMgZm9yIGF1dG92ZWN0b3IgaW50ZXJydXB0cyAzLTYuCisgKi8KKwordm9pZCBfX2luaXQgcHNjX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKK3sKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT18zLCBwc2NfaXJxKTsKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShJUlFfQVVUT18zLCAodm9pZCAqKTB4MzApOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9BVVRPXzQsIHBzY19pcnEpOworCWlycV9zZXRfaGFuZGxlcl9kYXRhKElSUV9BVVRPXzQsICh2b2lkICopMHg0MCk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0FVVE9fNSwgcHNjX2lycSk7CisJaXJxX3NldF9oYW5kbGVyX2RhdGEoSVJRX0FVVE9fNSwgKHZvaWQgKikweDUwKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT182LCBwc2NfaXJxKTsKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShJUlFfQVVUT182LCAodm9pZCAqKTB4NjApOwogfQogCiB2b2lkIHBzY19pcnFfZW5hYmxlKGludCBpcnEpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvdmlhLmMgYi9hcmNoL202OGsvbWFjL3ZpYS5jCmluZGV4IGU3MTE2NmQuLmYxNjAwYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvdmlhLmMKKysrIGIvYXJjaC9tNjhrL21hYy92aWEuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2ludG9zaC5oPgpAQCAtNzcsOSArNzgsNiBAQAogc3RhdGljIHU4IG51YnVzX2Rpc2FibGVkOwogCiB2b2lkIHZpYV9kZWJ1Z19kdW1wKHZvaWQpOwotaXJxcmV0dXJuX3QgdmlhMV9pcnEoaW50LCB2b2lkICopOwotaXJxcmV0dXJuX3QgdmlhMl9pcnEoaW50LCB2b2lkICopOwotaXJxcmV0dXJuX3QgdmlhX251YnVzX2lycShpbnQsIHZvaWQgKik7CiB2b2lkIHZpYV9pcnFfZW5hYmxlKGludCBpcnEpOwogdm9pZCB2aWFfaXJxX2Rpc2FibGUoaW50IGlycSk7CiB2b2lkIHZpYV9pcnFfY2xlYXIoaW50IGlycSk7CkBAIC0yODEsNDAgKzI3OSwxMSBAQAogCXZpYTFbdlQxQ0xdID0gTUFDX0NMT0NLX0xPVzsKIAl2aWExW3ZUMUNIXSA9IE1BQ19DTE9DS19ISUdIOwogCi0JaWYgKHJlcXVlc3RfaXJxKElSUV9NQUNfVElNRVJfMSwgZnVuYywgSVJRX0ZMR19MT0NLLCAidGltZXIiLCBmdW5jKSkKKwlpZiAocmVxdWVzdF9pcnEoSVJRX01BQ19USU1FUl8xLCBmdW5jLCAwLCAidGltZXIiLCBmdW5jKSkKIAkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJ0aW1lciIpOwogfQogCiAvKgotICogUmVnaXN0ZXIgdGhlIGludGVycnVwdCBkaXNwYXRjaGVycyBmb3IgVklBIG9yIFJCViBtYWNoaW5lcyBvbmx5LgotICovCi0KLXZvaWQgX19pbml0IHZpYV9yZWdpc3Rlcl9pbnRlcnJ1cHRzKHZvaWQpCi17Ci0JaWYgKHZpYV9hbHRfbWFwcGluZykgewotCQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fMSwgdmlhMV9pcnEsCi0JCQkJSVJRX0ZMR19MT0NLfElSUV9GTEdfRkFTVCwgInNvZnR3YXJlIiwKLQkJCQkodm9pZCAqKSB2aWExKSkKLQkJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAic29mdHdhcmUiKTsKLQkJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzYsIHZpYTFfaXJxLAotCQkJCUlSUV9GTEdfTE9DS3xJUlFfRkxHX0ZBU1QsICJ2aWExIiwKLQkJCQkodm9pZCAqKSB2aWExKSkKLQkJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAidmlhMSIpOwotCX0gZWxzZSB7Ci0JCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT18xLCB2aWExX2lycSwKLQkJCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAidmlhMSIsCi0JCQkJKHZvaWQgKikgdmlhMSkpCi0JCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgInZpYTEiKTsKLQl9Ci0JaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzIsIHZpYTJfaXJxLCBJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULAotCQkJInZpYTIiLCAodm9pZCAqKSB2aWEyKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJ2aWEyIik7Ci0JaWYgKHJlcXVlc3RfaXJxKElSUV9NQUNfTlVCVVMsIHZpYV9udWJ1c19pcnEsCi0JCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAibnVidXMiLCAodm9pZCAqKSB2aWEyKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJudWJ1cyIpOwotfQotCi0vKgogICogRGVidWdnaW5nIGR1bXAsIHVzZWQgaW4gdmFyaW91cyBwbGFjZXMgdG8gc2VlIHdoYXQncyBnb2luZyBvbi4KICAqLwogCkBAIC00NDYsNDggKzQxNSw0NiBAQAogICogdmlhNjUyMi5jIDotKSwgZGlzYWJsZS9wZW5kaW5nIG1hc2tzIGFkZGVkLgogICovCiAKLWlycXJldHVybl90IHZpYTFfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3ZvaWQgdmlhMV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWludCBpcnFfbnVtOwogCXVuc2lnbmVkIGNoYXIgaXJxX2JpdCwgZXZlbnRzOwogCiAJZXZlbnRzID0gdmlhMVt2SUZSXSAmIHZpYTFbdklFUl0gJiAweDdGOwogCWlmICghZXZlbnRzKQotCQlyZXR1cm4gSVJRX05PTkU7CisJCXJldHVybjsKIAogCWlycV9udW0gPSBWSUExX1NPVVJDRV9CQVNFOwogCWlycV9iaXQgPSAxOwogCWRvIHsKIAkJaWYgKGV2ZW50cyAmIGlycV9iaXQpIHsKIAkJCXZpYTFbdklGUl0gPSBpcnFfYml0OwotCQkJbTY4a19oYW5kbGVfaW50KGlycV9udW0pOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycV9udW0pOwogCQl9CiAJCSsraXJxX251bTsKIAkJaXJxX2JpdCA8PD0gMTsKIAl9IHdoaWxlIChldmVudHMgPj0gaXJxX2JpdCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1pcnFyZXR1cm5fdCB2aWEyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgdm9pZCB2aWEyX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaW50IGlycV9udW07CiAJdW5zaWduZWQgY2hhciBpcnFfYml0LCBldmVudHM7CiAKIAlldmVudHMgPSB2aWEyW2dJRlJdICYgdmlhMltnSUVSXSAmIDB4N0Y7CiAJaWYgKCFldmVudHMpCi0JCXJldHVybiBJUlFfTk9ORTsKKwkJcmV0dXJuOwogCiAJaXJxX251bSA9IFZJQTJfU09VUkNFX0JBU0U7CiAJaXJxX2JpdCA9IDE7CiAJZG8gewogCQlpZiAoZXZlbnRzICYgaXJxX2JpdCkgewogCQkJdmlhMltnSUZSXSA9IGlycV9iaXQgfCByYnZfY2xlYXI7Ci0JCQltNjhrX2hhbmRsZV9pbnQoaXJxX251bSk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX251bSk7CiAJCX0KIAkJKytpcnFfbnVtOwogCQlpcnFfYml0IDw8PSAxOwogCX0gd2hpbGUgKGV2ZW50cyA+PSBpcnFfYml0KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIC8qCkBAIC00OTUsNyArNDYyLDcgQEAKICAqIFZJQTIgZGlzcGF0Y2hlciBhcyBhIGZhc3QgaW50ZXJydXB0IGhhbmRsZXIuCiAgKi8KIAotaXJxcmV0dXJuX3QgdmlhX251YnVzX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit2b2lkIHZpYV9udWJ1c19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWludCBzbG90X2lycTsKIAl1bnNpZ25lZCBjaGFyIHNsb3RfYml0LCBldmVudHM7CkBAIC01MDYsNyArNDczLDcgQEAKIAllbHNlCiAJCWV2ZW50cyAmPSB+dmlhMlt2RGlyQV07CiAJaWYgKCFldmVudHMpCi0JCXJldHVybiBJUlFfTk9ORTsKKwkJcmV0dXJuOwogCiAJZG8gewogCQlzbG90X2lycSA9IElSUV9OVUJVU19GOwpAQCAtNTE0LDcgKzQ4MSw3IEBACiAJCWRvIHsKIAkJCWlmIChldmVudHMgJiBzbG90X2JpdCkgewogCQkJCWV2ZW50cyAmPSB+c2xvdF9iaXQ7Ci0JCQkJbTY4a19oYW5kbGVfaW50KHNsb3RfaXJxKTsKKwkJCQlnZW5lcmljX2hhbmRsZV9pcnEoc2xvdF9pcnEpOwogCQkJfQogCQkJLS1zbG90X2lycTsKIAkJCXNsb3RfYml0ID4+PSAxOwpAQCAtNTI4LDcgKzQ5NSwyNCBAQAogCQllbHNlCiAJCQlldmVudHMgJj0gfnZpYTJbdkRpckFdOwogCX0gd2hpbGUgKGV2ZW50cyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogUmVnaXN0ZXIgdGhlIGludGVycnVwdCBkaXNwYXRjaGVycyBmb3IgVklBIG9yIFJCViBtYWNoaW5lcyBvbmx5LgorICovCisKK3ZvaWQgX19pbml0IHZpYV9yZWdpc3Rlcl9pbnRlcnJ1cHRzKHZvaWQpCit7CisJaWYgKHZpYV9hbHRfbWFwcGluZykgeworCQkvKiBzb2Z0d2FyZSBpbnRlcnJ1cHQgKi8KKwkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0FVVE9fMSwgdmlhMV9pcnEpOworCQkvKiB2aWExIGludGVycnVwdCAqLworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT182LCB2aWExX2lycSk7CisJfSBlbHNlIHsKKwkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0FVVE9fMSwgdmlhMV9pcnEpOworCX0KKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT18yLCB2aWEyX2lycSk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX01BQ19OVUJVUywgdmlhX251YnVzX2lycSk7CiB9CiAKIHZvaWQgdmlhX2lycV9lbmFibGUoaW50IGlycSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNDcvY29uZmlnLmMgYi9hcmNoL202OGsvbXZtZTE0Ny9jb25maWcuYwppbmRleCA2Y2I5YzNhLi41ZGU5MjRlIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbXZtZTE0Ny9jb25maWcuYworKysgYi9hcmNoL202OGsvbXZtZTE0Ny9jb25maWcuYwpAQCAtODEsNyArODEsNyBAQAogCiB2b2lkIF9faW5pdCBtdm1lMTQ3X2luaXRfSVJRKHZvaWQpCiB7Ci0JbTY4a19zZXR1cF91c2VyX2ludGVycnVwdChWRUNfVVNFUiwgMTkyLCBOVUxMKTsKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCAxOTIpOwogfQogCiB2b2lkIF9faW5pdCBjb25maWdfbXZtZTE0Nyh2b2lkKQpAQCAtMTE0LDggKzExNCw3IEBACiB2b2lkIG12bWUxNDdfc2NoZWRfaW5pdCAoaXJxX2hhbmRsZXJfdCB0aW1lcl9yb3V0aW5lKQogewogCXRpY2tfaGFuZGxlciA9IHRpbWVyX3JvdXRpbmU7Ci0JaWYgKHJlcXVlc3RfaXJxKFBDQ19JUlFfVElNRVIxLCBtdm1lMTQ3X3RpbWVyX2ludCwgSVJRX0ZMR19SRVBMQUNFLAotCQkJInRpbWVyIDEiLCBOVUxMKSkKKwlpZiAocmVxdWVzdF9pcnEoUENDX0lSUV9USU1FUjEsIG12bWUxNDdfdGltZXJfaW50LCAwLCAidGltZXIgMSIsIE5VTEwpKQogCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIHRpbWVyIGludGVycnVwdFxuIik7CiAKIAkvKiBJbml0IHRoZSBjbG9jayB3aXRoIGEgdmFsdWUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tdm1lMTZ4L2NvbmZpZy5jIGIvYXJjaC9tNjhrL212bWUxNngvY29uZmlnLmMKaW5kZXggMGIyOGUyNi4uMzFhNjZkOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL212bWUxNngvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL212bWUxNngvY29uZmlnLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXZtZTE2eF9pbml0X0lSUSAodm9pZCkKIHsKLQltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCAxOTIsIE5VTEwpOworCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDE5Mik7CiB9CiAKICNkZWZpbmUgcGNjMmNoaXAJKCh2b2xhdGlsZSB1X2NoYXIgKikweGZmZjQyMDAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3E0MC9xNDBpbnRzLmMgYi9hcmNoL202OGsvcTQwL3E0MGludHMuYwppbmRleCA5ZjBlM2Q1Li4yYjg4ODQ5IDEwMDY0NAotLS0gYS9hcmNoL202OGsvcTQwL3E0MGludHMuYworKysgYi9hcmNoL202OGsvcTQwL3E0MGludHMuYwpAQCAtMTUsMTAgKzE1LDEwIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogCiAjaW5jbHVkZSA8YXNtL3E0MF9tYXN0ZXIuaD4KQEAgLTM1LDM1ICszNSwzNiBAQAogKi8KIAogc3RhdGljIHZvaWQgcTQwX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKLXN0YXRpYyB2b2lkIHE0MF9lbmFibGVfaXJxKHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBxNDBfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIHE0MF9pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CitzdGF0aWMgdm9pZCBxNDBfaXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKIAogdW5zaWduZWQgc2hvcnQgcTQwX2FibGVjb3VudFszNV07CiB1bnNpZ25lZCBzaG9ydCBxNDBfc3RhdGVbMzVdOwogCi1zdGF0aWMgaW50IHE0MF9pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHVuc2lnbmVkIGludCBxNDBfaXJxX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkYXRhKQogeworCXVuc2lnbmVkIGludCBpcnEgPSBkYXRhLT5pcnE7CisKIAkvKiB0ZXN0IGZvciBJU0EgaW50cyBub3QgaW1wbGVtZW50ZWQgYnkgSFcgKi8KIAlzd2l0Y2ggKGlycSkgewogCWNhc2UgMTogY2FzZSAyOiBjYXNlIDg6IGNhc2UgOToKIAljYXNlIDExOiBjYXNlIDEyOiBjYXNlIDEzOgogCQlwcmludGsoIiVzOiBJU0EgSVJRICVkIG5vdCBpbXBsZW1lbnRlZCBieSBIV1xuIiwgX19mdW5jX18sIGlycSk7Ci0JCXJldHVybiAtRU5YSU87CisJCS8qIEZJWE1FIHJldHVybiAtRU5YSU87ICovCiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBxNDBfaXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBxNDBfaXJxX3NodXRkb3duKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBxNDBfaXJxX2NvbnRyb2xsZXIgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHE0MF9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAicTQwIiwKLQkubG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChxNDBfaXJxX2NvbnRyb2xsZXIubG9jayksCi0JLnN0YXJ0dXAJPSBxNDBfaXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duCT0gcTQwX2lycV9zaHV0ZG93biwKLQkuZW5hYmxlCQk9IHE0MF9lbmFibGVfaXJxLAotCS5kaXNhYmxlCT0gcTQwX2Rpc2FibGVfaXJxLAorCS5pcnFfc3RhcnR1cAk9IHE0MF9pcnFfc3RhcnR1cCwKKwkuaXJxX3NodXRkb3duCT0gcTQwX2lycV9zaHV0ZG93biwKKwkuaXJxX2VuYWJsZQk9IHE0MF9pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IHE0MF9pcnFfZGlzYWJsZSwKIH07CiAKIC8qCkBAIC04MSwxMyArODIsMTQgQEAKIAogdm9pZCBfX2luaXQgcTQwX2luaXRfSVJRKHZvaWQpCiB7Ci0JbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmcTQwX2lycV9jb250cm9sbGVyLCAxLCBRNDBfSVJRX01BWCk7CisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmcTQwX2lycV9jaGlwLCBoYW5kbGVfc2ltcGxlX2lycSwgMSwKKwkJCQkgIFE0MF9JUlFfTUFYKTsKIAogCS8qIHNldHVwIGhhbmRsZXIgZm9yIElTQSBpbnRzICovCiAJbTY4a19zZXR1cF9hdXRvX2ludGVycnVwdChxNDBfaXJxX2hhbmRsZXIpOwogCi0JbTY4a19pcnFfc3RhcnR1cChJUlFfQVVUT18yKTsKLQltNjhrX2lycV9zdGFydHVwKElSUV9BVVRPXzQpOworCW02OGtfaXJxX3N0YXJ0dXBfaXJxKElSUV9BVVRPXzIpOworCW02OGtfaXJxX3N0YXJ0dXBfaXJxKElSUV9BVVRPXzQpOwogCiAJLyogbm93IGVuYWJsZSBzb21lIGludHMuLiAqLwogCW1hc3Rlcl9vdXRiKDEsIEVYVF9FTkFCTEVfUkVHKTsgIC8qIElTQSBJUlEgNS0xNSAqLwpAQCAtMjE4LDExICsyMjAsMTEgQEAKIAlzd2l0Y2ggKGlycSkgewogCWNhc2UgNDoKIAljYXNlIDY6Ci0JCV9fbTY4a19oYW5kbGVfaW50KFE0MF9JUlFfU0FNUExFLCBmcCk7CisJCWRvX0lSUShRNDBfSVJRX1NBTVBMRSwgZnApOwogCQlyZXR1cm47CiAJfQogCWlmIChtaXIgJiBRNDBfSVJRX0ZSQU1FX01BU0spIHsKLQkJX19tNjhrX2hhbmRsZV9pbnQoUTQwX0lSUV9GUkFNRSwgZnApOworCQlkb19JUlEoUTQwX0lSUV9GUkFNRSwgZnApOwogCQltYXN0ZXJfb3V0YigtMSwgRlJBTUVfQ0xFQVJfUkVHKTsKIAl9CiAJaWYgKChtaXIgJiBRNDBfSVJRX1NFUl9NQVNLKSB8fCAobWlyICYgUTQwX0lSUV9FWFRfTUFTSykpIHsKQEAgLTI1Nyw3ICsyNTksNyBAQAogCQkJCQlnb3RvIGlpcnE7CiAJCQkJfQogCQkJCXE0MF9zdGF0ZVtpcnFdIHw9IElSUV9JTlBST0dSRVNTOwotCQkJCV9fbTY4a19oYW5kbGVfaW50KGlycSwgZnApOworCQkJCWRvX0lSUShpcnEsIGZwKTsKIAkJCQlxNDBfc3RhdGVbaXJxXSAmPSB+SVJRX0lOUFJPR1JFU1M7CiAKIAkJCQkvKiBuYWl2ZWx5IGVuYWJsZSBldmVyeXRoaW5nLCBpZiB0aGF0IGZhaWxzIHRoYW4gICAgKi8KQEAgLTI4OCwyNSArMjkwLDI5IEBACiAJbWlyID0gbWFzdGVyX2luYihJSVJRX1JFRyk7CiAJLyogc2hvdWxkIHRlc3Qgd2hldGhlciBrZXlib2FyZCBpcnEgaXMgcmVhbGx5IGVuYWJsZWQsIGRvaW5nIGl0IGluIGRlZmhhbmQgKi8KIAlpZiAobWlyICYgUTQwX0lSUV9LRVlCX01BU0spCi0JCV9fbTY4a19oYW5kbGVfaW50KFE0MF9JUlFfS0VZQk9BUkQsIGZwKTsKKwkJZG9fSVJRKFE0MF9JUlFfS0VZQk9BUkQsIGZwKTsKIAogCXJldHVybjsKIH0KIAotdm9pZCBxNDBfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQordm9pZCBxNDBfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKKwogCWlmIChpcnEgPj0gNSAmJiBpcnEgPD0gMTUpIHsKIAkJbWV4dF9kaXNhYmxlZC0tOwogCQlpZiAobWV4dF9kaXNhYmxlZCA+IDApCi0JCQlwcmludGsoInE0MF9lbmFibGVfaXJxIDogbmVzdGVkIGRpc2FibGUvZW5hYmxlXG4iKTsKKwkJCXByaW50aygicTQwX2lycV9lbmFibGUgOiBuZXN0ZWQgZGlzYWJsZS9lbmFibGVcbiIpOwogCQlpZiAobWV4dF9kaXNhYmxlZCA9PSAwKQogCQkJbWFzdGVyX291dGIoMSwgRVhUX0VOQUJMRV9SRUcpOwogCX0KIH0KIAogCi12b2lkIHE0MF9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQordm9pZCBxNDBfaXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQogeworCXVuc2lnbmVkIGludCBpcnEgPSBkYXRhLT5pcnE7CisKIAkvKiBkaXNhYmxlIElTQSBpcXMgOiBvbmx5IGRvIHNvbWV0aGluZyBpZiB0aGUgZHJpdmVyIGhhcyBiZWVuCiAJICogdmVyaWZpZWQgdG8gYmUgUTQwICJjb21wYXRpYmxlIiAtIHJpZ2h0IG5vdyBJREUsIE5FMksKIAkgKiBBbnkgZHJpdmVyIHNob3VsZCBub3QgYXR0ZW1wdCB0byBzbGVlcCBhY3Jvc3MgZGlzYWJsZV9pcnEgISEKQEAgLTMxOSwxMyArMzI1LDMgQEAKIAkJCXByaW50aygiZGlzYWJsZV9pcnEgbmVzdGluZyBjb3VudCAlZFxuIixtZXh0X2Rpc2FibGVkKTsKIAl9CiB9Ci0KLXVuc2lnbmVkIGxvbmcgcTQwX3Byb2JlX2lycV9vbih2b2lkKQotewotCXByaW50aygiaXJxIHByb2Jpbmcgbm90IHdvcmtpbmcgLSByZWNvbmZpZ3VyZSB0aGUgZHJpdmVyIHRvIGF2b2lkIHRoaXNcbiIpOwotCXJldHVybiAtMTsKLX0KLWludCBxNDBfcHJvYmVfaXJxX29mZih1bnNpZ25lZCBsb25nIGlycXMpCi17Ci0JcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3N1bjMvc3VuM2ludHMuYyBiL2FyY2gvbTY4ay9zdW4zL3N1bjNpbnRzLmMKaW5kZXggNjQ2NGFkMy4uNzhiNjBmNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjMvc3VuM2ludHMuYworKysgYi9hcmNoL202OGsvc3VuMy9zdW4zaW50cy5jCkBAIC01MSwyNSArNTEsMjkgQEAKIAogc3RhdGljIGlycXJldHVybl90IHN1bjNfaW50NyhpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JKnN1bjNfaW50cmVnIHw9ICAoMSA8PCBpcnEpOwotCWlmICghKGtzdGF0X2NwdSgwKS5pcnFzW2lycV0gJSAyMDAwKSkKLQkJc3VuM19sZWRzKGxlZF9wYXR0ZXJuWyhrc3RhdF9jcHUoMCkuaXJxc1tpcnFdICUgMTYwMDApIC8gMjAwMF0pOworCXVuc2lnbmVkIGludCBjbnQ7CisKKwljbnQgPSBrc3RhdF9pcnFzX2NwdShpcnEsIDApOworCWlmICghKGNudCAlIDIwMDApKQorCQlzdW4zX2xlZHMobGVkX3BhdHRlcm5bY250ICUgMTYwMDAgLyAyMDAwXSk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3VuM19pbnQ1KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKKwl1bnNpZ25lZCBpbnQgY250OworCiAjaWZkZWYgQ09ORklHX1NVTjMKIAlpbnRlcnNpbF9jbGVhcigpOwogI2VuZGlmCi0gICAgICAgICpzdW4zX2ludHJlZyB8PSAgKDEgPDwgaXJxKTsKICNpZmRlZiBDT05GSUdfU1VOMwogCWludGVyc2lsX2NsZWFyKCk7CiAjZW5kaWYKIAl4dGltZV91cGRhdGUoMSk7CiAJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKGdldF9pcnFfcmVncygpKSk7Ci0gICAgICAgIGlmICghKGtzdGF0X2NwdSgwKS5pcnFzW2lycV0gJSAyMCkpCi0gICAgICAgICAgICAgICAgc3VuM19sZWRzKGxlZF9wYXR0ZXJuWyhrc3RhdF9jcHUoMCkuaXJxc1tpcnFdICUgMTYwKSAvIDIwXSk7CisJY250ID0ga3N0YXRfaXJxc19jcHUoaXJxLCAwKTsKKwlpZiAoIShjbnQgJSAyMCkpCisJCXN1bjNfbGVkcyhsZWRfcGF0dGVybltjbnQgJSAxNjAgLyAyMF0pOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNzksMjkgKzgzLDMzIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCBzdW4zX2ludGhhbmRsZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCitzdGF0aWMgdm9pZCBzdW4zX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotICAgICAgICAqc3VuM19pbnRyZWcgJj0gfigxIDw8IGlycSk7CisgICAgc3VuM19lbmFibGVfaXJxKGRhdGEtPmlycSk7Cit9OwogCi0JX19tNjhrX2hhbmRsZV9pbnQoaXJxLCBmcCk7Ci19CitzdGF0aWMgdm9pZCBzdW4zX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKyAgICBzdW4zX2Rpc2FibGVfaXJxKGRhdGEtPmlycSk7Cit9OwogCi1zdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIHN1bjNfaXJxX2NvbnRyb2xsZXIgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bjNfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gInN1bjMiLAotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHN1bjNfaXJxX2NvbnRyb2xsZXIubG9jayksCi0JLnN0YXJ0dXAJPSBtNjhrX2lycV9zdGFydHVwLAotCS5zaHV0ZG93bgk9IG02OGtfaXJxX3NodXRkb3duLAotCS5lbmFibGUJCT0gc3VuM19lbmFibGVfaXJxLAotCS5kaXNhYmxlCT0gc3VuM19kaXNhYmxlX2lycSwKKwkuaXJxX3N0YXJ0dXAJPSBtNjhrX2lycV9zdGFydHVwLAorCS5pcnFfc2h1dGRvd24JPSBtNjhrX2lycV9zaHV0ZG93biwKKwkuaXJxX2VuYWJsZQk9IHN1bjNfaXJxX2VuYWJsZSwKKwkuaXJxX2Rpc2FibGUJPSBzdW4zX2lycV9kaXNhYmxlLAorCS5pcnFfbWFzawk9IHN1bjNfaXJxX2Rpc2FibGUsCisJLmlycV91bm1hc2sJPSBzdW4zX2lycV9lbmFibGUsCiB9OwogCiB2b2lkIF9faW5pdCBzdW4zX2luaXRfSVJRKHZvaWQpCiB7CiAJKnN1bjNfaW50cmVnID0gMTsKIAotCW02OGtfc2V0dXBfYXV0b19pbnRlcnJ1cHQoc3VuM19pbnRoYW5kbGUpOwotCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJnN1bjNfaXJxX2NvbnRyb2xsZXIsIElSUV9BVVRPXzEsIDcpOwotCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDEyOCwgTlVMTCk7CisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmc3VuM19pcnFfY2hpcCwgaGFuZGxlX2xldmVsX2lycSwgSVJRX0FVVE9fMSwKKwkJCQkgIDcpOworCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDEyOCk7CiAKIAlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNSwgc3VuM19pbnQ1LCAwLCAiaW50NSIsIE5VTEwpKQogCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgImludDUiKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKaW5kZXggYTU2OTUxNC4uM2EzZTViOCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKQEAgLTI4LDEyICsyOCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1hdHRycy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1jb2hlcmVudC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKICNkZWZpbmUgRE1BX0VSUk9SX0NPREUJCSh+KGRtYV9hZGRyX3QpMHgwKQogCiAjZGVmaW5lIF9fZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgZ2ZwLCBzaXplLCBoYW5kbGUpCU5VTEwKICNkZWZpbmUgX19kbWFfZnJlZV9jb2hlcmVudChzaXplLCBhZGRyKQkJKCh2b2lkKTApCi0jZGVmaW5lIF9fZG1hX3N5bmMoYWRkciwgc2l6ZSwgcncpCQkoKHZvaWQpMCkKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRldmljZV90b19tYXNrKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTk1LDYgKzk1LDIyIEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1jb21tb24uaD4KIAorc3RhdGljIGlubGluZSB2b2lkIF9fZG1hX3N5bmModW5zaWduZWQgbG9uZyBwYWRkciwKKwkJCSAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3dpdGNoIChkaXJlY3Rpb24pIHsKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwkJZmx1c2hfZGNhY2hlX3JhbmdlKHBhZGRyLCBwYWRkciArIHNpemUpOworCQlicmVhazsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UocGFkZHIsIHBhZGRyICsgc2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKwogc3RhdGljIGlubGluZSBpbnQgZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCXN0cnVjdCBkbWFfbWFwX29wcyAqb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKQEAgLTEzNSw3ICsxNTEsNyBAQAogCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7Ci0JX19kbWFfc3luYyh2YWRkciwgc2l6ZSwgKGludClkaXJlY3Rpb24pOworCV9fZG1hX3N5bmModmlydF90b19waHlzKHZhZGRyKSwgc2l6ZSwgKGludClkaXJlY3Rpb24pOwogfQogCiAjZW5kaWYJLyogX0FTTV9NSUNST0JMQVpFX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCAwOThkZmRkLi44MzQ4NDlmIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0xNiwxMyArMTYsMTUgQEAKICAqIEkndmUgc25hZmZsZWQgdGhlIHZhbHVlIGZyb20gdGhlIG1pY3JvYmxhemUgYmludXRpbHMgc291cmNlIGNvZGUKICAqIC9iaW51dGlscy9taWNyb2JsYXplL2luY2x1ZGUvZWxmL21pY3JvYmxhemUuaAogICovCi0jZGVmaW5lIEVNX1hJTElOWF9NSUNST0JMQVpFCTB4YmFhYgotI2RlZmluZSBFTEZfQVJDSAkJRU1fWElMSU5YX01JQ1JPQkxBWkUKKyNkZWZpbmUgRU1fTUlDUk9CTEFaRQkJMTg5CisjZGVmaW5lIEVNX01JQ1JPQkxBWkVfT0xECTB4YmFhYgorI2RlZmluZSBFTEZfQVJDSAkJRU1fTUlDUk9CTEFaRQogCiAvKgogICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KICAqLwotI2RlZmluZSBlbGZfY2hlY2tfYXJjaCh4KQkoKHgpLT5lX21hY2hpbmUgPT0gRU1fWElMSU5YX01JQ1JPQkxBWkUpCisjZGVmaW5lIGVsZl9jaGVja19hcmNoKHgpCSgoeCktPmVfbWFjaGluZSA9PSBFTV9NSUNST0JMQVpFIFwKKwkJCQkgfHwgKHgpLT5lX21hY2hpbmUgPT0gRU1fTUlDUk9CTEFaRV9PTEQpCiAKIC8qCiAgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcy4KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCBlNmEyMjg0Li41YTQzM2NiIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0xNyw4ICsxNyw2IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaD4KIAotI2RlZmluZSBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXCi0KIHN0cnVjdCB0YXNrX3N0cnVjdDsKIHN0cnVjdCB0aHJlYWRfaW5mbzsKIApAQCAtOTYsMTEgKzk0LDQgQEAKIAogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpICh4KQogCi0vKgotICogTWljcm9CbGF6ZSBkb2Vzbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMgaW4gaGFyZHdhcmUuCi0gKgotICogQmFzZWQgb24gdGhpcyB3ZSBmb3JjZSB0aGUgSVAgaGVhZGVyIGFsaWdubWVudCBpbiBuZXR3b3JrIGRyaXZlcnMuCi0gKi8KLSNkZWZpbmUgTkVUX0lQX0FMSUdOCTIKLQogI2VuZGlmIC8qIF9BU01fTUlDUk9CTEFaRV9TWVNURU1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggNWJiOTVhMS4uMDcyYjAwNyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC05NSw3ICs5NSw3IEBACiAgKiAgLSAiYWRkciIsICJhZGRyICsgc2l6ZSIgYW5kICJzaXplIiBhcmUgYWxsIGJlbG93IHRoZSBsaW1pdAogICovCiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLCBhZGRyLCBzaXplKSBcCi0JKGdldF9mcygpLnNlZyA+ICgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKSB8IFwKKwkoZ2V0X2ZzKCkuc2VnID49ICgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKSB8IFwKIAkJKHNpemUpIHwgKCh1bnNpZ25lZCBsb25nKShhZGRyKSArIChzaXplKSkpKQogCiAvKiB8fCBwcmludGsoImFjY2Vzc19vayBmYWlsZWQgZm9yICVzIGF0IDB4JTA4bHggKHNpemUgJWQpLCBzZWcgMHglMDh4XG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jCmluZGV4IDQ0Mzk0ZDguLjU0MTk0YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8uYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAl7IjguMDAuYSIsIDB4MTJ9LAogCXsiOC4wMC5iIiwgMHgxM30sCiAJeyI4LjEwLmEiLCAweDE0fSwKKwl7IjguMjAuYSIsIDB4MTV9LAogCXtOVUxMLCAwfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZG1hLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2RtYS5jCmluZGV4IDM5M2U2YjIuLjY1YTRhZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZG1hLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9kbWEuYwpAQCAtMTAsOCArMTAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKIC8qCiAgKiBHZW5lcmljIGRpcmVjdCBETUEgaW1wbGVtZW50YXRpb24KQEAgLTIxLDIxICsyMSw2IEBACiAgKiBjYW4gc2V0IGFyY2hkYXRhLmRtYV9kYXRhIHRvIGFuIHVuc2lnbmVkIGxvbmcgaG9sZGluZyB0aGUgb2Zmc2V0LiBCeQogICogZGVmYXVsdCB0aGUgb2Zmc2V0IGlzIFBDSV9EUkFNX09GRlNFVC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fZG1hX3N5bmNfcGFnZSh1bnNpZ25lZCBsb25nIHBhZGRyLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JY2FzZSBETUFfVE9fREVWSUNFOgotCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6Ci0JCWZsdXNoX2RjYWNoZV9yYW5nZShwYWRkciArIG9mZnNldCwgcGFkZHIgKyBvZmZzZXQgKyBzaXplKTsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfRlJPTV9ERVZJQ0U6Ci0JCWludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHBhZGRyICsgb2Zmc2V0LCBwYWRkciArIG9mZnNldCArIHNpemUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci19CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9kbWFfZGlyZWN0X29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC05MSw3ICs3Niw3IEBACiAJLyogRklYTUUgdGhpcyBwYXJ0IG9mIGNvZGUgaXMgdW50ZXN0ZWQgKi8KIAlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZW50cywgaSkgewogCQlzZy0+ZG1hX2FkZHJlc3MgPSBzZ19waHlzKHNnKSArIGdldF9kbWFfZGlyZWN0X29mZnNldChkZXYpOwotCQlfX2RtYV9zeW5jX3BhZ2UocGFnZV90b19waHlzKHNnX3BhZ2Uoc2cpKSwgc2ctPm9mZnNldCwKKwkJX19kbWFfc3luYyhwYWdlX3RvX3BoeXMoc2dfcGFnZShzZykpICsgc2ctPm9mZnNldCwKIAkJCQkJCQlzZy0+bGVuZ3RoLCBkaXJlY3Rpb24pOwogCX0KIApAQCAtMTE2LDcgKzEwMSw3IEBACiAJCQkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAogCQkJCQkgICAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQogewotCV9fZG1hX3N5bmNfcGFnZShwYWdlX3RvX3BoeXMocGFnZSksIG9mZnNldCwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlfX2RtYV9zeW5jKHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZnNldCwgc2l6ZSwgZGlyZWN0aW9uKTsKIAlyZXR1cm4gcGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0ICsgZ2V0X2RtYV9kaXJlY3Rfb2Zmc2V0KGRldik7CiB9CiAKQEAgLTEzMSw3ICsxMTYsNjMgQEAKICAqIHBoeXNfdG9fdmlydCBpcyBoZXJlIGJlY2F1c2UgaW4gX19kbWFfc3luY19wYWdlIGlzIF9fdmlydF90b19waHlzIGFuZAogICogZG1hX2FkZHJlc3MgaXMgcGh5c2ljYWwgYWRkcmVzcwogICovCi0JX19kbWFfc3luY19wYWdlKGRtYV9hZGRyZXNzLCAwICwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlfX2RtYV9zeW5jKGRtYV9hZGRyZXNzLCBzaXplLCBkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYV9kaXJlY3Rfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJLyoKKwkgKiBJdCdzIHBvaW50bGVzcyB0byBmbHVzaCB0aGUgY2FjaGUgYXMgdGhlIG1lbW9yeSBzZWdtZW50CisJICogaXMgZ2l2ZW4gdG8gdGhlIENQVQorCSAqLworCisJaWYgKGRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpCisJCV9fZG1hX3N5bmMoZG1hX2hhbmRsZSwgc2l6ZSwgZGlyZWN0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkbWFfZGlyZWN0X3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwkvKgorCSAqIEl0J3MgcG9pbnRsZXNzIHRvIGludmFsaWRhdGUgdGhlIGNhY2hlIGlmIHRoZSBkZXZpY2UgaXNuJ3QKKwkgKiBzdXBwb3NlZCB0byB3cml0ZSB0byB0aGUgcmVsZXZhbnQgcmVnaW9uCisJICovCisKKwlpZiAoZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCV9fZG1hX3N5bmMoZG1hX2hhbmRsZSwgc2l6ZSwgZGlyZWN0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkbWFfZGlyZWN0X3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbnRzLAorCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGk7CisKKwkvKiBGSVhNRSB0aGlzIHBhcnQgb2YgY29kZSBpcyB1bnRlc3RlZCAqLworCWlmIChkaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQorCQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZW50cywgaSkKKwkJCV9fZG1hX3N5bmMoc2ctPmRtYV9hZGRyZXNzLCBzZy0+bGVuZ3RoLCBkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYV9kaXJlY3Rfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgbmVudHMsCisJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaTsKKworCS8qIEZJWE1FIHRoaXMgcGFydCBvZiBjb2RlIGlzIHVudGVzdGVkICovCisJaWYgKGRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZW50cywgaSkKKwkJCV9fZG1hX3N5bmMoc2ctPmRtYV9hZGRyZXNzLCBzZy0+bGVuZ3RoLCBkaXJlY3Rpb24pOwogfQogCiBzdHJ1Y3QgZG1hX21hcF9vcHMgZG1hX2RpcmVjdF9vcHMgPSB7CkBAIC0xNDIsNiArMTgzLDEwIEBACiAJLmRtYV9zdXBwb3J0ZWQJPSBkbWFfZGlyZWN0X2RtYV9zdXBwb3J0ZWQsCiAJLm1hcF9wYWdlCT0gZG1hX2RpcmVjdF9tYXBfcGFnZSwKIAkudW5tYXBfcGFnZQk9IGRtYV9kaXJlY3RfdW5tYXBfcGFnZSwKKwkuc3luY19zaW5nbGVfZm9yX2NwdQkJPSBkbWFfZGlyZWN0X3N5bmNfc2luZ2xlX2Zvcl9jcHUsCisJLnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UJCT0gZG1hX2RpcmVjdF9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlLAorCS5zeW5jX3NnX2Zvcl9jcHUJCT0gZG1hX2RpcmVjdF9zeW5jX3NnX2Zvcl9jcHUsCisJLnN5bmNfc2dfZm9yX2RldmljZQkJPSBkbWFfZGlyZWN0X3N5bmNfc2dfZm9yX2RldmljZSwKIH07CiBFWFBPUlRfU1lNQk9MKGRtYV9kaXJlY3Rfb3BzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9leGNlcHRpb25zLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2V4Y2VwdGlvbnMuYwppbmRleCA2NmZhZDIzLi42MzQ4ZGM4IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2V4Y2VwdGlvbnMuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2V4Y2VwdGlvbnMuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJY2FzZSBNSUNST0JMQVpFX0RJVl9aRVJPX0VYQ0VQVElPTjoKIAkJaWYgKHVzZXJfbW9kZShyZWdzKSkgewogCQkJcHJfZGVidWcoIkRpdmlkZSBieSB6ZXJvIGV4Y2VwdGlvbiBpbiB1c2VyIG1vZGVcbiIpOwotCQkJX2V4Y2VwdGlvbihTSUdJTEwsIHJlZ3MsIEZQRV9JTlRESVYsIGFkZHIpOworCQkJX2V4Y2VwdGlvbihTSUdGUEUsIHJlZ3MsIEZQRV9JTlRESVYsIGFkZHIpOwogCQkJcmV0dXJuOwogCQl9CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpdmlkZSBieSB6ZXJvIGV4Y2VwdGlvbiAiIFwKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaXJxLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2lycS5jCmluZGV4IGNlN2FjODQuLmU1ZDYzYTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9pcnEuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGRiYjgxMjQuLjk1Y2MyOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xNzksNiArMTc5LDcgQEAKIAogCXRpLT5jcHVfY29udGV4dC5tc3IgPSAoY2hpbGRyZWdzLT5tc3J8TVNSX1ZNKTsKIAl0aS0+Y3B1X2NvbnRleHQubXNyICY9IH5NU1JfVU1TOyAvKiBzd2l0Y2hfdG8gdG8ga2VybmVsIG1vZGUgKi8KKwl0aS0+Y3B1X2NvbnRleHQubXNyICY9IH5NU1JfSUU7CiAjZW5kaWYKIAl0aS0+Y3B1X2NvbnRleHQucjE1ID0gKHVuc2lnbmVkIGxvbmcpcmV0X2Zyb21fZm9yayAtIDg7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3B0cmFjZS5jCmluZGV4IDZhOGUwY2MuLjA0M2NiNTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCXJldCA9IC0xTDsKIAogCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSkKLQkJYXVkaXRfc3lzY2FsbF9lbnRyeShFTV9YSUxJTlhfTUlDUk9CTEFaRSwgcmVncy0+cjEyLAorCQlhdWRpdF9zeXNjYWxsX2VudHJ5KEVNX01JQ1JPQkxBWkUsIHJlZ3MtPnIxMiwKIAkJCQkgICAgcmVncy0+cjUsIHJlZ3MtPnI2LAogCQkJCSAgICByZWdzLT5yNywgcmVncy0+cjgpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3RpbWVyLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3RpbWVyLmMKaW5kZXggZTU1NTBjZS4uYWY3NGIxMSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC90aW1lci5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdGltZXIuYwpAQCAtMzA4LDcgKzMwOCw4IEBACiB7CiAJaWYgKHRpbWVyX2luaXRpYWxpemVkKSB7CiAJCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3MgPSAmY2xvY2tzb3VyY2VfbWljcm9ibGF6ZTsKLQkJY3ljbGVfdCBjeWMgPSBjbnQzMl90b182Myhjcy0+cmVhZChOVUxMKSk7CisKKwkJY3ljbGVfdCBjeWMgPSBjbnQzMl90b182Myhjcy0+cmVhZChOVUxMKSkgJiBMTE9OR19NQVg7CiAJCXJldHVybiBjbG9ja3NvdXJjZV9jeWMybnMoY3ljLCBjcy0+bXVsdCwgY3MtPnNoaWZ0KTsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvbGliL01ha2VmaWxlIGIvYXJjaC9taWNyb2JsYXplL2xpYi9NYWtlZmlsZQppbmRleCAxMGMzMjBhLi5jMTMwNjdiIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9saWIvTWFrZWZpbGUKQEAgLTI1LDUgKzI1LDYgQEAKIGxpYi15ICs9IG1vZHNpMy5vCiBsaWIteSArPSBtdWxkaTMubwogbGliLXkgKz0gbXVsc2kzLm8KK2xpYi15ICs9IHVjbXBkaTIubwogbGliLXkgKz0gdWRpdnNpMy5vCiBsaWIteSArPSB1bW9kc2kzLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9saWIvdWFjY2Vzc19vbGQuUyBiL2FyY2gvbWljcm9ibGF6ZS9saWIvdWFjY2Vzc19vbGQuUwppbmRleCA1ODEwY2VjLi5mMDM3MjY2IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvbGliL3VhY2Nlc3Nfb2xkLlMKKysrIGIvYXJjaC9taWNyb2JsYXplL2xpYi91YWNjZXNzX29sZC5TCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiAvKgogICogaW50IF9fc3RybmNweV91c2VyKGNoYXIgKnRvLCBjaGFyICpmcm9tLCBpbnQgbGVuKTsKQEAgLTMzLDggKzM0LDggQEAKIAkgKiByMyAtIHRlbXAgY291bnQKIAkgKiByNCAtIHRlbXAgdmFsCiAJICovCisJYmVxaWQJcjcsM2YKIAlhZGRpawlyMyxyNywwCQkvKiB0ZW1wX2NvdW50ID0gbGVuICovCi0JYmVxaQlyMywzZgogMToKIAlsYnUJcjQscjYscjAKIAlzYglyNCxyNSxyMApAQCAtNzYsOCArNzcsOCBAQAogLnR5cGUgIF9fc3Rybmxlbl91c2VyLCBAZnVuY3Rpb24KIC5hbGlnbiA0OwogX19zdHJubGVuX3VzZXI6CisJYmVxaWQJcjYsM2YKIAlhZGRpawlyMyxyNiwwCi0JYmVxaQlyMywzZgogMToKIAlsYnUJcjQscjUscjAKIAliZXFpZAlyNCwyZgkJLyogYnJlYWsgb24gTlVMICovCkBAIC0xMDIsNiArMTAzLDQ5IEBACiAJLnNlY3Rpb24JX19leF90YWJsZSwiYSIKIAkud29yZAkxYiw0YgogCisvKiBMb29wIHVucm9sbGluZyBmb3IgX19jb3B5X3RvZnJvbV91c2VyICovCisjZGVmaW5lIENPUFkob2Zmc2V0KQlcCisxOglsd2kJcjQgLCByNiwgMHgwMDAwICsgb2Zmc2V0OwlcCisyOglsd2kJcjE5LCByNiwgMHgwMDA0ICsgb2Zmc2V0OwlcCiszOglsd2kJcjIwLCByNiwgMHgwMDA4ICsgb2Zmc2V0OwlcCis0Oglsd2kJcjIxLCByNiwgMHgwMDBDICsgb2Zmc2V0OwlcCis1Oglsd2kJcjIyLCByNiwgMHgwMDEwICsgb2Zmc2V0OwlcCis2Oglsd2kJcjIzLCByNiwgMHgwMDE0ICsgb2Zmc2V0OwlcCis3Oglsd2kJcjI0LCByNiwgMHgwMDE4ICsgb2Zmc2V0OwlcCis4Oglsd2kJcjI1LCByNiwgMHgwMDFDICsgb2Zmc2V0OwlcCis5Oglzd2kJcjQgLCByNSwgMHgwMDAwICsgb2Zmc2V0OwlcCisxMDoJc3dpCXIxOSwgcjUsIDB4MDAwNCArIG9mZnNldDsJXAorMTE6CXN3aQlyMjAsIHI1LCAweDAwMDggKyBvZmZzZXQ7CVwKKzEyOglzd2kJcjIxLCByNSwgMHgwMDBDICsgb2Zmc2V0OwlcCisxMzoJc3dpCXIyMiwgcjUsIDB4MDAxMCArIG9mZnNldDsJXAorMTQ6CXN3aQlyMjMsIHI1LCAweDAwMTQgKyBvZmZzZXQ7CVwKKzE1Oglzd2kJcjI0LCByNSwgMHgwMDE4ICsgb2Zmc2V0OwlcCisxNjoJc3dpCXIyNSwgcjUsIDB4MDAxQyArIG9mZnNldDsJXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiOwkJXAorCS53b3JkCTFiLCAwZjsJCQkJXAorCS53b3JkCTJiLCAwZjsJCQkJXAorCS53b3JkCTNiLCAwZjsJCQkJXAorCS53b3JkCTRiLCAwZjsJCQkJXAorCS53b3JkCTViLCAwZjsJCQkJXAorCS53b3JkCTZiLCAwZjsJCQkJXAorCS53b3JkCTdiLCAwZjsJCQkJXAorCS53b3JkCThiLCAwZjsJCQkJXAorCS53b3JkCTliLCAwZjsJCQkJXAorCS53b3JkCTEwYiwgMGY7CQkJXAorCS53b3JkCTExYiwgMGY7CQkJXAorCS53b3JkCTEyYiwgMGY7CQkJXAorCS53b3JkCTEzYiwgMGY7CQkJXAorCS53b3JkCTE0YiwgMGY7CQkJXAorCS53b3JkCTE1YiwgMGY7CQkJXAorCS53b3JkCTE2YiwgMGY7CQkJXAorCS50ZXh0CisKKyNkZWZpbmUgQ09QWV84MChvZmZzZXQpCVwKKwlDT1BZKDB4MDAgKyBvZmZzZXQpO1wKKwlDT1BZKDB4MjAgKyBvZmZzZXQpO1wKKwlDT1BZKDB4NDAgKyBvZmZzZXQpO1wKKwlDT1BZKDB4NjAgKyBvZmZzZXQpOworCiAvKgogICogaW50IF9fY29weV90b2Zyb21fdXNlcihjaGFyICp0bywgY2hhciAqZnJvbSwgaW50IGxlbikKICAqIFJldHVybjoKQEAgLTExOSwzNCArMTYzLDc5IEBACiAJICogcjcsIHIzIC0gY291bnQKIAkgKiByNCAtIHRlbXB2YWwKIAkgKi8KLQliZXFpZAlyNywgM2YgLyogemVybyBzaXplIGlzIG5vdCBsaWtlbHkgKi8KLQlhbmRpCXIzLCByNywgMHgzIC8qIGZpbHRlciBhZGQgY291bnQgKi8KLQlibmVpZAlyMywgNGYgLyogaWYgaXMgb2RkIHZhbHVlIHRoZW4gYnl0ZSBjb3B5aW5nICovCisJYmVxaWQJcjcsIDBmIC8qIHplcm8gc2l6ZSBpcyBub3QgbGlrZWx5ICovCiAJb3IJcjMsIHI1LCByNiAvKiBmaW5kIGlmIGlzIGFueSB0by9mcm9tIHVuYWxpZ25lZCAqLwotCWFuZGkJcjMsIHIzLCAweDMgLyogbWFzayB1bmFsaWduZWQgKi8KLQlibmVpZAlyMywgMWYgLyogaXQgaXMgdW5hbGlnbmVkIC0+IHRoZW4ganVtcCAqLworCW9yCXIzLCByMywgcjcgLyogZmluZCBpZiBjb3VudCBpcyB1bmFsaWduZWQgKi8KKwlhbmRpCXIzLCByMywgMHgzIC8qIG1hc2sgbGFzdCAzIGJpdHMgKi8KKwlibmVpZAlyMywgYnUxIC8qIGlmIHIzIGlzIG5vdCB6ZXJvIHRoZW4gYnl0ZSBjb3B5aW5nICovCiAJb3IJcjMsIHIwLCByMAogCi0vKiBhdCBsZWFzdCBvbmUgNCBieXRlIGNvcHkgKi8KLTU6CWx3CXI0LCByNiwgcjMKLTY6CXN3CXI0LCByNSwgcjMKKwlyc3ViaQlyMywgcjcsIFBBR0VfU0laRSAvKiBkZXRlY3QgUEFHRV9TSVpFICovCisJYmVxaWQJcjMsIHBhZ2U7CisJb3IJcjMsIHIwLCByMAorCit3MToJbHcJcjQsIHI2LCByMyAvKiBhdCBsZWFzdCBvbmUgNCBieXRlIGNvcHkgKi8KK3cyOglzdwlyNCwgcjUsIHIzCiAJYWRkaWsJcjcsIHI3LCAtNAotCWJuZWlkCXI3LCA1YgorCWJuZWlkCXI3LCB3MQogCWFkZGlrCXIzLCByMywgNAogCWFkZGlrCXIzLCByNywgMAogCXJ0c2QJcjE1LCA4CiAJbm9wCi00OglvcglyMywgcjAsIHIwCi0xOglsYnUJcjQscjYscjMKLTI6CXNiCXI0LHI1LHIzCisKKwkuc2VjdGlvbglfX2V4X3RhYmxlLCJhIgorCS53b3JkCXcxLCAwZjsKKwkud29yZAl3MiwgMGY7CisJLnRleHQKKworLmFsaWduIDQgLyogQWxpZ25tZW50IGlzIGltcG9ydGFudCB0byBrZWVwIGljYWNoZSBoYXBweSAqLworcGFnZToJLyogQ3JlYXRlIHJvb20gb24gc3RhY2sgYW5kIHNhdmUgcmVnaXN0ZXJzIGZvciBzdG9yaWduIHZhbHVlcyAqLworCWFkZGlrICAgcjEsIHIxLCAtMzIKKwlzd2kJcjE5LCByMSwgNAorCXN3aQlyMjAsIHIxLCA4CisJc3dpCXIyMSwgcjEsIDEyCisJc3dpCXIyMiwgcjEsIDE2CisJc3dpCXIyMywgcjEsIDIwCisJc3dpCXIyNCwgcjEsIDI0CisJc3dpCXIyNSwgcjEsIDI4Citsb29wOgkvKiByNCwgcjE5LCByMjAsIHIyMSwgcjIyLCByMjMsIHIyNCwgcjI1IGFyZSB1c2VkIGZvciBzdG9yaW5nIHZhbHVlcyAqLworCS8qIExvb3AgdW5yb2xsaW5nIHRvIGdldCBwZXJmb3JtYW5jZSBib29zdCAqLworCUNPUFlfODAoMHgwMDApOworCUNPUFlfODAoMHgwODApOworCUNPUFlfODAoMHgxMDApOworCUNPUFlfODAoMHgxODApOworCS8qIGNvcHkgbG9vcCAqLworCWFkZGlrCXI2LCByNiwgMHgyMDAKKwlhZGRpawlyNywgcjcsIC0weDIwMAorCWJuZWlkCXI3LCBsb29wCisJYWRkaWsJcjUsIHI1LCAweDIwMAorCS8qIFJlc3RvcmUgcmVnaXN0ZXIgY29udGVudCAqLworCWx3aQlyMTksIHIxLCA0CisJbHdpCXIyMCwgcjEsIDgKKwlsd2kJcjIxLCByMSwgMTIKKwlsd2kJcjIyLCByMSwgMTYKKwlsd2kJcjIzLCByMSwgMjAKKwlsd2kJcjI0LCByMSwgMjQKKwlsd2kJcjI1LCByMSwgMjgKKwlhZGRpayAgIHIxLCByMSwgMzIKKwkvKiByZXR1cm4gYmFjayAqLworCWFkZGlrCXIzLCByNywgMAorCXJ0c2QJcjE1LCA4CisJbm9wCisKKy5hbGlnbiA0IC8qIEFsaWdubWVudCBpcyBpbXBvcnRhbnQgdG8ga2VlcCBpY2FjaGUgaGFwcHkgKi8KK2J1MToJbGJ1CXI0LHI2LHIzCitidTI6CXNiCXI0LHI1LHIzCiAJYWRkaWsJcjcscjcsLTEKLQlibmVpZAlyNywxYgorCWJuZWlkCXI3LGJ1MQogCWFkZGlrCXIzLHIzLDEJCS8qIGRlbGF5IHNsb3QgKi8KLTM6CiswOgogCWFkZGlrCXIzLHI3LDAKIAlydHNkCXIxNSw4CiAJbm9wCiAJLnNpemUgICBfX2NvcHlfdG9mcm9tX3VzZXIsIC4gLSBfX2NvcHlfdG9mcm9tX3VzZXIKIAogCS5zZWN0aW9uCV9fZXhfdGFibGUsImEiCi0JLndvcmQJMWIsM2IsMmIsM2IsNWIsM2IsNmIsM2IKKwkud29yZAlidTEsIDBiOworCS53b3JkCWJ1MiwgMGI7CisJLnRleHQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9saWIvdWNtcGRpMi5jIGIvYXJjaC9taWNyb2JsYXplL2xpYi91Y21wZGkyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjYTEwNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9saWIvdWNtcGRpMi5jCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImxpYmdjYy5oIgorCit3b3JkX3R5cGUgX191Y21wZGkyKHVuc2lnbmVkIGxvbmcgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGxvbmcgYikKK3sKKwljb25zdCBEV3VuaW9uIGF1ID0gey5sbCA9IGF9OworCWNvbnN0IERXdW5pb24gYnUgPSB7LmxsID0gYn07CisKKwlpZiAoKHVuc2lnbmVkIGludCkgYXUucy5oaWdoIDwgKHVuc2lnbmVkIGludCkgYnUucy5oaWdoKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICgodW5zaWduZWQgaW50KSBhdS5zLmhpZ2ggPiAodW5zaWduZWQgaW50KSBidS5zLmhpZ2gpCisJCXJldHVybiAyOworCWlmICgodW5zaWduZWQgaW50KSBhdS5zLmxvdyA8ICh1bnNpZ25lZCBpbnQpIGJ1LnMubG93KQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICgodW5zaWduZWQgaW50KSBhdS5zLmxvdyA+ICh1bnNpZ25lZCBpbnQpIGJ1LnMubG93KQorCQlyZXR1cm4gMjsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0woX191Y21wZGkyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9tbS9pbml0LmMgYi9hcmNoL21pY3JvYmxhemUvbW0vaW5pdC5jCmluZGV4IDM2YTEzM2UuLjU2NWQxOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9tbS9pbml0LmMKKysrIGIvYXJjaC9taWNyb2JsYXplL21tL2luaXQuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL3BjaS9pb21hcC5jIGIvYXJjaC9taWNyb2JsYXplL3BjaS9pb21hcC5jCmluZGV4IDNmYmYxNmYuLjU3YWNkYTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvaW9tYXAuYworKysgYi9hcmNoL21pY3JvYmxhemUvcGNpL2lvbWFwLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL3BjaS9wY2ktY29tbW9uLmMgYi9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYwppbmRleCA0Y2ZhZTIwLi5kYjg0MWM3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYworKysgYi9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCA0Y2JjNmQ4Li5kNDZmMWRhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtNDcsNiArNDcsOCBAQAogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX1pCT09UCisJc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCisJc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAKIGNvbmZpZyBBUjcKIAlib29sICJUZXhhcyBJbnN0cnVtZW50cyBBUjciCkBAIC0yMDYsNiArMjA4LDcgQEAKIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKIAlzZWxlY3QgSEFWRV9QV00KIAlzZWxlY3QgSEFWRV9DTEsKKwlzZWxlY3QgR0VORVJJQ19JUlFfQ0hJUAogCiBjb25maWcgTEFOVElRCiAJYm9vbCAiTGFudGlxIGJhc2VkIHBsYXRmb3JtcyIKQEAgLTgxNywxMCArODIwLDYgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKLWNvbmZpZyBBUkNIX1NVUFBPUlRTX09QUk9GSUxFCi0JYm9vbAotCWRlZmF1bHQgeSBpZiAhTUlQU19NVF9TTVRDCi0KIGNvbmZpZyBHRU5FUklDX0hXRUlHSFQKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0yMDkyLDcgKzIwOTEsNyBAQAogCiBjb25maWcgSFdfUEVSRl9FVkVOVFMKIAlib29sICJFbmFibGUgaGFyZHdhcmUgcGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0IGZvciBwZXJmIGV2ZW50cyIKLQlkZXBlbmRzIG9uIFBFUkZfRVZFTlRTICYmICFNSVBTX01UX1NNVEMgJiYgT1BST0ZJTEU9biAmJiBDUFVfTUlQUzMyCisJZGVwZW5kcyBvbiBQRVJGX0VWRU5UUyAmJiAhTUlQU19NVF9TTVRDICYmIE9QUk9GSUxFPW4gJiYgKENQVV9NSVBTMzIgfHwgQ1BVX01JUFM2NCB8fCBDUFVfUjEwMDAwIHx8IENQVV9TQjEgfHwgQ1BVX0NBVklVTV9PQ1RFT04pCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgRW5hYmxlIGhhcmR3YXJlIHBlcmZvcm1hbmNlIGNvdW50ZXIgc3VwcG9ydCBmb3IgcGVyZiBldmVudHMuIElmCkBAIC0yMjUyLDE2ICsyMjUxLDYgQEAKIAogc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgogCi1jb25maWcgTUlQU19JTlNBTkVfTEFSR0UKLQlib29sICJTdXBwb3J0IGZvciBsYXJnZSA2NC1iaXQgY29uZmlndXJhdGlvbnMiCi0JZGVwZW5kcyBvbiBDUFVfUjEwMDAwICYmIDY0QklUCi0JaGVscAotCSAgTUlQUyBSMTAwMDAgZG9lcyBzdXBwb3J0IGEgNDQgYml0IC8gMTZUQiBhZGRyZXNzIHNwYWNlIGFzIG9wcG9zZWQgdG8KLQkgIHByZXZpb3VzIDY0LWJpdCBwcm9jZXNzb3JzIHdoaWNoIG9ubHkgc3VwcG9ydGVkIDQwIGJpdCAvIDFUQi4gSWYgeW91Ci0JICBuZWVkIHByb2Nlc3NlcyBvZiBtb3JlIHRoYW4gMVRCIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSwgc2F5IFkgaGVyZS4KLQkgIFRoaXMgd2lsbCByZXN1bHQgaW4gYWRkaXRpb25hbCBtZW1vcnkgdXNhZ2UsIHNvIGl0IGlzIG5vdAotCSAgcmVjb21tZW5kZWQgZm9yIG5vcm1hbCB1c2Vycy4KLQogY29uZmlnIEtFWEVDCiAJYm9vbCAiS2V4ZWMgc3lzdGVtIGNhbGwgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9NYWtlZmlsZQppbmRleCA1M2UzNTE0Li4wYmUzMTg2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC0yMjYsNyArMjI2LDcgQEAKIGlmZGVmIENPTkZJR19NSVBTCiBDSEVDS0ZMQUdTICs9ICQoc2hlbGwgJChDQykgJChLQlVJTERfQ0ZMQUdTKSAtZE0gLUUgLXhjIC9kZXYvbnVsbCB8IFwKIAllZ3JlcCAtdncgJ19fR05VQ18ofE1JTk9SX3xQQVRDSExFVkVMXylfJyB8IFwKLQlzZWQgLWUgJ3MvXlwjZGVmaW5lIC8tRC8nIC1lICJzLyAvPScvIiAtZSAicy8kJC8nLyIpCisJc2VkIC1lICJzL15cI2RlZmluZSAvLUQnLyIgLWUgInMvIC8nPScvIiAtZSAicy8kJC8nLyIpCiBpZmRlZiBDT05GSUdfNjRCSVQKIENIRUNLRkxBR1MJCSs9IC1tNjQKIGVuZGlmCkBAIC0yODYsMTYgKzI4NiwxOCBAQAogYXJjaHByZXBhcmU6CiBpZmRlZiBDT05GSUdfTUlQUzMyX04zMgogCUBlY2hvICcgIENoZWNraW5nIG1pc3Npbmctc3lzY2FsbHMgZm9yIE4zMicKLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT0uIG1pc3Npbmctc3lzY2FsbHMgY2NmbGFncy15PSItbWFiaT1uMzIiCisJJChRKSQoTUFLRSkgJChidWlsZCk9LiBtaXNzaW5nLXN5c2NhbGxzIG1pc3Npbmdfc3lzY2FsbHNfZmxhZ3M9Ii1tYWJpPW4zMiIKIGVuZGlmCiBpZmRlZiBDT05GSUdfTUlQUzMyX08zMgogCUBlY2hvICcgIENoZWNraW5nIG1pc3Npbmctc3lzY2FsbHMgZm9yIE8zMicKLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT0uIG1pc3Npbmctc3lzY2FsbHMgY2NmbGFncy15PSItbWFiaT0zMiIKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0uIG1pc3Npbmctc3lzY2FsbHMgbWlzc2luZ19zeXNjYWxsc19mbGFncz0iLW1hYmk9MzIiCiBlbmRpZgogCiBpbnN0YWxsOgogCSQoUSlpbnN0YWxsIC1EIC1tIDc1NSB2bWxpbnV4ICQoSU5TVEFMTF9QQVRIKS92bWxpbnV4LSQoS0VSTkVMUkVMRUFTRSkKK2lmZGVmIENPTkZJR19TWVNfU1VQUE9SVFNfWkJPT1QKIAkkKFEpaW5zdGFsbCAtRCAtbSA3NTUgdm1saW51eiAkKElOU1RBTExfUEFUSCkvdm1saW51ei0kKEtFUk5FTFJFTEVBU0UpCitlbmRpZgogCSQoUSlpbnN0YWxsIC1EIC1tIDY0NCAuY29uZmlnICQoSU5TVEFMTF9QQVRIKS9jb25maWctJChLRVJORUxSRUxFQVNFKQogCSQoUSlpbnN0YWxsIC1EIC1tIDY0NCBTeXN0ZW0ubWFwICQoSU5TVEFMTF9QQVRIKS9TeXN0ZW0ubWFwLSQoS0VSTkVMUkVMRUFTRSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZyBiL2FyY2gvbWlwcy9hbGNoZW15L0tjb25maWcKaW5kZXggMmNjZmQ0YS4uMmE2OGJlNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZworKysgYi9hcmNoL21pcHMvYWxjaGVteS9LY29uZmlnCkBAIC0xOCwyMCArMTgsMjAgQEAKIAlib29sICI0RyBTeXN0ZW1zIE1UWC0xIGJvYXJkIgogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBTT0NfQVUxNTAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKIAogY29uZmlnIE1JUFNfQk9TUE9SVVMKIAlib29sICJBbGNoZW15IEJvc3BvcnVzIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxNTAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCiAKIGNvbmZpZyBNSVBTX0RCMTAwMAogCWJvb2wgIkFsY2hlbXkgREIxMDAwIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxMDAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KQEAgLTM5LDE0ICszOSwxNCBAQAogCiBjb25maWcgTUlQU19EQjExMDAKIAlib29sICJBbGNoZW15IERCMTEwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTEwMAorCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCiBjb25maWcgTUlQU19EQjEyMDAKIAlib29sICJBbGNoZW15IERCMTIwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTIwMAorCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAJc2VsZWN0IERNQV9DT0hFUkVOVAogCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCkBAIC01NCw3ICs1NCw3IEBACiAKIGNvbmZpZyBNSVBTX0RCMTUwMAogCWJvb2wgIkFsY2hlbXkgREIxNTAwIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxNTAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQpAQCAtNjQsNyArNjQsNyBAQAogCiBjb25maWcgTUlQU19EQjE1NTAKIAlib29sICJBbGNoZW15IERCMTU1MCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTU1MAorCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKQEAgLTc0LDEzICs3NCwxMyBAQAogY29uZmlnIE1JUFNfTUlSQUdFCiAJYm9vbCAiQWxjaGVteSBNaXJhZ2UgYm9hcmQiCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBTT0NfQVUxNTAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKIAogY29uZmlnIE1JUFNfUEIxMDAwCiAJYm9vbCAiQWxjaGVteSBQQjEwMDAgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTEwMDAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCkBAIC04OSw3ICs4OSw3IEBACiAKIGNvbmZpZyBNSVBTX1BCMTEwMAogCWJvb2wgIkFsY2hlbXkgUEIxMTAwIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxMTAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQpAQCAtOTgsNyArOTgsNyBAQAogCiBjb25maWcgTUlQU19QQjEyMDAKIAlib29sICJBbGNoZW15IFBCMTIwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTIwMAorCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCkBAIC0xMDYsNyArMTA2LDcgQEAKIAogY29uZmlnIE1JUFNfUEIxNTAwCiAJYm9vbCAiQWxjaGVteSBQQjE1MDAgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTE1MDAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgpAQCAtMTE0LDcgKzExNCw3IEBACiAKIGNvbmZpZyBNSVBTX1BCMTU1MAogCWJvb2wgIkFsY2hlbXkgUEIxNTUwIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxNTUwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQpAQCAtMTI0LDEzICsxMjQsMTMgQEAKIGNvbmZpZyBNSVBTX1hYUzE1MDAKIAlib29sICJNeUNhYmxlIFhYUzE1MDAgYm9hcmQiCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBTT0NfQVUxNTAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKIAogY29uZmlnIE1JUFNfR1BSCiAJYm9vbCAiVHJhcGV6ZSBJVFMgR1BSIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxNTUwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQpAQCAtMTM4LDIzICsxMzgsMyBAQAogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCiBlbmRjaG9pY2UKLQotY29uZmlnIFNPQ19BVTEwMDAKLQlib29sCi0Jc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKLQotY29uZmlnIFNPQ19BVTExMDAKLQlib29sCi0Jc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKLQotY29uZmlnIFNPQ19BVTE1MDAKLQlib29sCi0Jc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKLQotY29uZmlnIFNPQ19BVTE1NTAKLQlib29sCi0Jc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKLQotY29uZmlnIFNPQ19BVTEyMDAKLQlib29sCi0Jc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9NYWtlZmlsZQppbmRleCAyNzgxMWZlLi44MTFlY2U3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL01ha2VmaWxlCkBAIC0xMiw5ICsxMiw1IEBACiAKICMgb3B0aW9uYWwgZ3Bpb2xpYiBzdXBwb3J0CiBpZmVxICgkKENPTkZJR19BTENIRU1ZX0dQSU9fSU5ESVJFQ1QpLCkKLSBpZmVxICgkKENPTkZJR19HUElPTElCKSx5KQotICBvYmotJChDT05GSUdfQUxDSEVNWV9HUElPSU5UX0FVMTAwMCkgKz0gZ3Bpb2xpYi1hdTEwMDAubwotIGVuZGlmCisgb2JqLSQoQ09ORklHX0dQSU9MSUIpICs9IGdwaW9saWIubwogZW5kaWYKLQotb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jCmluZGV4IDNhNWFiYjUuLjBlNjNlZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jCkBAIC00MCw4ICs0MCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19BVTEyMDApCi0KIC8qCiAgKiBUaGUgRGVzY3JpcHRvciBCYXNlZCBETUEgc3VwcG9ydHMgdXAgdG8gMTYgY2hhbm5lbHMuCiAgKgpAQCAtNjIsMTIwICs2MCw5NiBAQAogCQkJKGRiZG1hX2dsb2JhbF90ICopS1NFRzFBRERSKEFVMTU1MF9EQkRNQV9DT05GX1BIWVNfQUREUik7CiBzdGF0aWMgaW50IGRiZG1hX2luaXRpYWxpemVkOwogCi1zdGF0aWMgZGJkZXZfdGFiX3QgZGJkZXZfdGFiW10gPSB7Ci0jaWZkZWYgQ09ORklHX1NPQ19BVTE1NTAKK3N0YXRpYyBkYmRldl90YWJfdCAqZGJkZXZfdGFiOworCitzdGF0aWMgZGJkZXZfdGFiX3QgYXUxNTUwX2RiZGV2X3RhYltdIF9faW5pdGRhdGEgPSB7CiAJLyogVUFSVFMgKi8KLQl7IERTQ1JfQ01EMF9VQVJUMF9UWCwgREVWX0ZMQUdTX09VVCwgMCwgOCwgMHgxMTEwMDAwNCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VBUlQwX1JYLCBERVZfRkxBR1NfSU4sIDAsIDgsIDB4MTExMDAwMDAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9VQVJUM19UWCwgREVWX0ZMQUdTX09VVCwgMCwgOCwgMHgxMTQwMDAwNCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VBUlQzX1JYLCBERVZfRkxBR1NfSU4sIDAsIDgsIDB4MTE0MDAwMDAsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfVUFSVDBfVFgsIERFVl9GTEFHU19PVVQsIDAsIDgsIDB4MTExMDAwMDQsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfVUFSVDBfUlgsIERFVl9GTEFHU19JTiwgIDAsIDgsIDB4MTExMDAwMDAsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfVUFSVDNfVFgsIERFVl9GTEFHU19PVVQsIDAsIDgsIDB4MTE0MDAwMDQsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfVUFSVDNfUlgsIERFVl9GTEFHU19JTiwgIDAsIDgsIDB4MTE0MDAwMDAsIDAsIDAgfSwKIAogCS8qIEVYVCBETUEgKi8KLQl7IERTQ1JfQ01EMF9ETUFfUkVRMCwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX0RNQV9SRVExLCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfRE1BX1JFUTIsIDAsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9ETUFfUkVRMywgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9ETUFfUkVRMCwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9ETUFfUkVRMSwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9ETUFfUkVRMiwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9ETUFfUkVRMywgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAogCiAJLyogVVNCIERFViAqLwotCXsgRFNDUl9DTUQwX1VTQkRFVl9SWDAsIERFVl9GTEFHU19JTiwgNCwgOCwgMHgxMDIwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VTQkRFVl9UWDAsIERFVl9GTEFHU19PVVQsIDQsIDgsIDB4MTAyMDAwMDQsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9VU0JERVZfVFgxLCBERVZfRkxBR1NfT1VULCA0LCA4LCAweDEwMjAwMDA4LCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfVVNCREVWX1RYMiwgREVWX0ZMQUdTX09VVCwgNCwgOCwgMHgxMDIwMDAwYywgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VTQkRFVl9SWDMsIERFVl9GTEFHU19JTiwgNCwgOCwgMHgxMDIwMDAxMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VTQkRFVl9SWDQsIERFVl9GTEFHU19JTiwgNCwgOCwgMHgxMDIwMDAxNCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9VU0JERVZfUlgwLCBERVZfRkxBR1NfSU4sICA0LCA4LCAweDEwMjAwMDAwLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX1VTQkRFVl9UWDAsIERFVl9GTEFHU19PVVQsIDQsIDgsIDB4MTAyMDAwMDQsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfVVNCREVWX1RYMSwgREVWX0ZMQUdTX09VVCwgNCwgOCwgMHgxMDIwMDAwOCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9VU0JERVZfVFgyLCBERVZfRkxBR1NfT1VULCA0LCA4LCAweDEwMjAwMDBjLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX1VTQkRFVl9SWDMsIERFVl9GTEFHU19JTiwgIDQsIDgsIDB4MTAyMDAwMTAsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfVVNCREVWX1JYNCwgREVWX0ZMQUdTX0lOLCAgNCwgOCwgMHgxMDIwMDAxNCwgMCwgMCB9LAogCi0JLyogUFNDIDAgKi8KLQl7IERTQ1JfQ01EMF9QU0MwX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDExYTAwMDFjLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfUFNDMF9SWCwgREVWX0ZMQUdTX0lOLCAwLCAwLCAweDExYTAwMDFjLCAwLCAwIH0sCisJLyogUFNDcyAqLworCXsgQVUxNTUwX0RTQ1JfQ01EMF9QU0MwX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDExYTAwMDFjLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX1BTQzBfUlgsIERFVl9GTEFHU19JTiwgIDAsIDAsIDB4MTFhMDAwMWMsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfUFNDMV9UWCwgREVWX0ZMQUdTX09VVCwgMCwgMCwgMHgxMWIwMDAxYywgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9QU0MxX1JYLCBERVZfRkxBR1NfSU4sICAwLCAwLCAweDExYjAwMDFjLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX1BTQzJfVFgsIERFVl9GTEFHU19PVVQsIDAsIDAsIDB4MTBhMDAwMWMsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfUFNDMl9SWCwgREVWX0ZMQUdTX0lOLCAgMCwgMCwgMHgxMGEwMDAxYywgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9QU0MzX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDEwYjAwMDFjLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX1BTQzNfUlgsIERFVl9GTEFHU19JTiwgIDAsIDAsIDB4MTBiMDAwMWMsIDAsIDAgfSwKIAotCS8qIFBTQyAxICovCi0JeyBEU0NSX0NNRDBfUFNDMV9UWCwgREVWX0ZMQUdTX09VVCwgMCwgMCwgMHgxMWIwMDAxYywgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1BTQzFfUlgsIERFVl9GTEFHU19JTiwgMCwgMCwgMHgxMWIwMDAxYywgMCwgMCB9LAotCi0JLyogUFNDIDIgKi8KLQl7IERTQ1JfQ01EMF9QU0MyX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDEwYTAwMDFjLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfUFNDMl9SWCwgREVWX0ZMQUdTX0lOLCAwLCAwLCAweDEwYTAwMDFjLCAwLCAwIH0sCi0KLQkvKiBQU0MgMyAqLwotCXsgRFNDUl9DTUQwX1BTQzNfVFgsIERFVl9GTEFHU19PVVQsIDAsIDAsIDB4MTBiMDAwMWMsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9QU0MzX1JYLCBERVZfRkxBR1NfSU4sIDAsIDAsIDB4MTBiMDAwMWMsIDAsIDAgfSwKLQotCXsgRFNDUl9DTUQwX1BDSV9XUklURSwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAkvKiBQQ0kgKi8KLQl7IERTQ1JfQ01EMF9OQU5EX0ZMQVNILCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCS8qIE5BTkQgKi8KKwl7IEFVMTU1MF9EU0NSX0NNRDBfUENJX1dSSVRFLCAgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LCAgLyogUENJICovCisJeyBBVTE1NTBfRFNDUl9DTUQwX05BTkRfRkxBU0gsIDAsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwgLyogTkFORCAqLwogCiAJLyogTUFDIDAgKi8KLQl7IERTQ1JfQ01EMF9NQUMwX1JYLCBERVZfRkxBR1NfSU4sIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9NQUMwX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX01BQzBfUlgsIERFVl9GTEFHU19JTiwgIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfTUFDMF9UWCwgREVWX0ZMQUdTX09VVCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAogCiAJLyogTUFDIDEgKi8KLQl7IERTQ1JfQ01EMF9NQUMxX1JYLCBERVZfRkxBR1NfSU4sIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9NQUMxX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0KLSNlbmRpZiAvKiBDT05GSUdfU09DX0FVMTU1MCAqLwotCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLQl7IERTQ1JfQ01EMF9VQVJUMF9UWCwgREVWX0ZMQUdTX09VVCwgMCwgOCwgMHgxMTEwMDAwNCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VBUlQwX1JYLCBERVZfRkxBR1NfSU4sIDAsIDgsIDB4MTExMDAwMDAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9VQVJUMV9UWCwgREVWX0ZMQUdTX09VVCwgMCwgOCwgMHgxMTIwMDAwNCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VBUlQxX1JYLCBERVZfRkxBR1NfSU4sIDAsIDgsIDB4MTEyMDAwMDAsIDAsIDAgfSwKLQotCXsgRFNDUl9DTUQwX0RNQV9SRVEwLCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfRE1BX1JFUTEsIDAsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQotCXsgRFNDUl9DTUQwX01BRV9CRSwgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX01BRV9GRSwgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX01BRV9CT1RILCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfTENELCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0KLQl7IERTQ1JfQ01EMF9TRE1TX1RYMCwgREVWX0ZMQUdTX09VVCwgNCwgOCwgMHgxMDYwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1NETVNfUlgwLCBERVZfRkxBR1NfSU4sIDQsIDgsIDB4MTA2MDAwMDQsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9TRE1TX1RYMSwgREVWX0ZMQUdTX09VVCwgNCwgOCwgMHgxMDY4MDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1NETVNfUlgxLCBERVZfRkxBR1NfSU4sIDQsIDgsIDB4MTA2ODAwMDQsIDAsIDAgfSwKLQotCXsgRFNDUl9DTUQwX0FFU19SWCwgREVWX0ZMQUdTX0lOICwgNCwgMzIsIDB4MTAzMDAwMDgsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9BRVNfVFgsIERFVl9GTEFHU19PVVQsIDQsIDMyLCAweDEwMzAwMDA0LCAwLCAwIH0sCi0KLQl7IERTQ1JfQ01EMF9QU0MwX1RYLCBERVZfRkxBR1NfT1VULCAwLCAxNiwgMHgxMWEwMDAxYywgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1BTQzBfUlgsIERFVl9GTEFHU19JTiwgMCwgMTYsIDB4MTFhMDAwMWMsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9QU0MwX1NZTkMsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQotCXsgRFNDUl9DTUQwX1BTQzFfVFgsIERFVl9GTEFHU19PVVQsIDAsIDE2LCAweDExYjAwMDFjLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfUFNDMV9SWCwgREVWX0ZMQUdTX0lOLCAwLCAxNiwgMHgxMWIwMDAxYywgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1BTQzFfU1lOQywgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCi0JeyBEU0NSX0NNRDBfQ0lNX1JYQSwgREVWX0ZMQUdTX0lOLCAwLCAzMiwgMHgxNDAwNDAyMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX0NJTV9SWEIsIERFVl9GTEFHU19JTiwgMCwgMzIsIDB4MTQwMDQwNDAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9DSU1fUlhDLCBERVZfRkxBR1NfSU4sIDAsIDMyLCAweDE0MDA0MDYwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfQ0lNX1NZTkMsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQotCXsgRFNDUl9DTUQwX05BTkRfRkxBU0gsIERFVl9GTEFHU19JTiwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCi0jZW5kaWYgLyogQ09ORklHX1NPQ19BVTEyMDAgKi8KKwl7IEFVMTU1MF9EU0NSX0NNRDBfTUFDMV9SWCwgREVWX0ZMQUdTX0lOLCAgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9NQUMxX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCiAKIAl7IERTQ1JfQ01EMF9USFJPVFRMRSwgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX0FMV0FZUywgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCi0JLyogUHJvdmlkZSAxNiB1c2VyIGRlZmluYWJsZSBkZXZpY2UgdHlwZXMgKi8KLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisJeyBEU0NSX0NNRDBfQUxXQVlTLCAgIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKIH07CiAKLSNkZWZpbmUgREJERVZfVEFCX1NJWkUJQVJSQVlfU0laRShkYmRldl90YWIpCitzdGF0aWMgZGJkZXZfdGFiX3QgYXUxMjAwX2RiZGV2X3RhYltdIF9faW5pdGRhdGEgPSB7CisJeyBBVTEyMDBfRFNDUl9DTUQwX1VBUlQwX1RYLCBERVZfRkxBR1NfT1VULCAwLCA4LCAweDExMTAwMDA0LCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1VBUlQwX1JYLCBERVZfRkxBR1NfSU4sICAwLCA4LCAweDExMTAwMDAwLCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1VBUlQxX1RYLCBERVZfRkxBR1NfT1VULCAwLCA4LCAweDExMjAwMDA0LCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1VBUlQxX1JYLCBERVZfRkxBR1NfSU4sICAwLCA4LCAweDExMjAwMDAwLCAwLCAwIH0sCiAKKwl7IEFVMTIwMF9EU0NSX0NNRDBfRE1BX1JFUTAsIDAsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfRE1BX1JFUTEsIDAsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKworCXsgQVUxMjAwX0RTQ1JfQ01EMF9NQUVfQkUsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfTUFFX0ZFLCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX01BRV9CT1RILCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX0xDRCwgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCisJeyBBVTEyMDBfRFNDUl9DTUQwX1NETVNfVFgwLCBERVZfRkxBR1NfT1VULCA0LCA4LCAweDEwNjAwMDAwLCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1NETVNfUlgwLCBERVZfRkxBR1NfSU4sICA0LCA4LCAweDEwNjAwMDA0LCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1NETVNfVFgxLCBERVZfRkxBR1NfT1VULCA0LCA4LCAweDEwNjgwMDAwLCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1NETVNfUlgxLCBERVZfRkxBR1NfSU4sICA0LCA4LCAweDEwNjgwMDA0LCAwLCAwIH0sCisKKwl7IEFVMTIwMF9EU0NSX0NNRDBfQUVTX1JYLCBERVZfRkxBR1NfSU4gLCA0LCAzMiwgMHgxMDMwMDAwOCwgMCwgMCB9LAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9BRVNfVFgsIERFVl9GTEFHU19PVVQsIDQsIDMyLCAweDEwMzAwMDA0LCAwLCAwIH0sCisKKwl7IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9UWCwgICBERVZfRkxBR1NfT1VULCAwLCAxNiwgMHgxMWEwMDAxYywgMCwgMCB9LAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9QU0MwX1JYLCAgIERFVl9GTEFHU19JTiwgIDAsIDE2LCAweDExYTAwMDFjLCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1BTQzBfU1lOQywgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1RYLCAgIERFVl9GTEFHU19PVVQsIDAsIDE2LCAweDExYjAwMDFjLCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1BTQzFfUlgsICAgREVWX0ZMQUdTX0lOLCAgMCwgMTYsIDB4MTFiMDAwMWMsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfUFNDMV9TWU5DLCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisKKwl7IEFVMTIwMF9EU0NSX0NNRDBfQ0lNX1JYQSwgIERFVl9GTEFHU19JTiwgMCwgMzIsIDB4MTQwMDQwMjAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfQ0lNX1JYQiwgIERFVl9GTEFHU19JTiwgMCwgMzIsIDB4MTQwMDQwNDAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfQ0lNX1JYQywgIERFVl9GTEFHU19JTiwgMCwgMzIsIDB4MTQwMDQwNjAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfQ0lNX1NZTkMsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKworCXsgQVUxMjAwX0RTQ1JfQ01EMF9OQU5EX0ZMQVNILCBERVZfRkxBR1NfSU4sIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKworCXsgRFNDUl9DTUQwX1RIUk9UVExFLCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBEU0NSX0NNRDBfQUxXQVlTLCAgIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKK307CisKKy8qIDMyIHByZWRlZmluZWQgcGx1cyAzMiBjdXN0b20gKi8KKyNkZWZpbmUgREJERVZfVEFCX1NJWkUJCTY0CiAKIHN0YXRpYyBjaGFuX3RhYl90ICpjaGFuX3RhYl9wdHJbTlVNX0RCRE1BX0NIQU5TXTsKIApAQCAtMTAyOCwzOCArMTAwMiw0MyBAQAogCS5yZXN1bWUJCT0gYWxjaGVteV9kYmRtYV9yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBhdTF4eHhfZGJkbWFfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZGJkbWFfc2V0dXAodW5zaWduZWQgaW50IGlycSwgZGJkZXZfdGFiX3QgKmlkdGFibGUpCiB7Ci0JaW50IGlycV9uciwgcmV0OworCWludCByZXQ7CisKKwlkYmRldl90YWIgPSBremFsbG9jKHNpemVvZihkYmRldl90YWJfdCkgKiBEQkRFVl9UQUJfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYmRldl90YWIpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KGRiZGV2X3RhYiwgaWR0YWJsZSwgMzIgKiBzaXplb2YoZGJkZXZfdGFiX3QpKTsKKwlmb3IgKHJldCA9IDMyOyByZXQgPCBEQkRFVl9UQUJfU0laRTsgcmV0KyspCisJCWRiZGV2X3RhYltyZXRdLmRldl9pZCA9IH4wOwogCiAJZGJkbWFfZ3B0ci0+ZGRtYV9jb25maWcgPSAwOwogCWRiZG1hX2dwdHItPmRkbWFfdGhyb3R0bGUgPSAwOwogCWRiZG1hX2dwdHItPmRkbWFfaW50ZW4gPSAweGZmZmY7CiAJYXVfc3luYygpOwogCi0Jc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKLQljYXNlIEFMQ0hFTVlfQ1BVX0FVMTU1MDoKLQkJaXJxX25yID0gQVUxNTUwX0RETUFfSU5UOwotCQlicmVhazsKLQljYXNlIEFMQ0hFTVlfQ1BVX0FVMTIwMDoKLQkJaXJxX25yID0gQVUxMjAwX0RETUFfSU5UOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZXQgPSByZXF1ZXN0X2lycShpcnFfbnIsIGRiZG1hX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKLQkJCSJBdTF4eHggZGJkbWEiLCAodm9pZCAqKWRiZG1hX2dwdHIpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZGJkbWFfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiZGJkbWEiLAorCQkJICAodm9pZCAqKWRiZG1hX2dwdHIpOwogCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGdyYWIgREJETUEgaW50ZXJydXB0IVxuIik7CiAJZWxzZSB7CiAJCWRiZG1hX2luaXRpYWxpemVkID0gMTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteSBEQkRNQSBpbml0aWFsaXplZFxuIik7CiAJCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZhbGNoZW15X2RiZG1hX3N5c2NvcmVfb3BzKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQotc3Vic3lzX2luaXRjYWxsKGF1MXh4eF9kYmRtYV9pbml0KTsKIAotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19BVTEyMDApICovCitzdGF0aWMgaW50IF9faW5pdCBhbGNoZW15X2RiZG1hX2luaXQodm9pZCkKK3sKKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTUwOgorCQlyZXR1cm4gZGJkbWFfc2V0dXAoQVUxNTUwX0RETUFfSU5ULCBhdTE1NTBfZGJkZXZfdGFiKTsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTIwMDoKKwkJcmV0dXJuIGRiZG1hX3NldHVwKEFVMTIwMF9ERE1BX0lOVCwgYXUxMjAwX2RiZGV2X3RhYik7CisJfQorCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKGFsY2hlbXlfZGJkbWFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZG1hLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZG1hLmMKaW5kZXggMzQ3OTgwZS4uOWI2MjRlMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RtYS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kbWEuYwpAQCAtNDAsOCArNDAsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwX2RtYS5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NPQ19BVTExMDApCiAvKgogICogQSBub3RlIG9uIHJlc291cmNlIGFsbG9jYXRpb246CiAgKgpAQCAtODgsMTIgKzg2LDEyIEBACiAJeyBBVTEwMDBfQUM5N19QSFlTX0FERFIgKyAweDA4LCBETUFfRFcxNiB8IERNQV9EUiB9LAkvKiBBQzk3IFJYIGMgKi8KIAl7IEFVMTAwMF9VQVJUM19QSFlTX0FERFIgKyAweDA0LCBETUFfRFc4IHwgRE1BX05DIH0sCS8qIFVBUlQzX1RYICovCiAJeyBBVTEwMDBfVUFSVDNfUEhZU19BRERSICsgMHgwMCwgRE1BX0RXOCB8IERNQV9OQyB8IERNQV9EUiB9LCAvKiBVQVJUM19SWCAqLwotCXsgQVUxMDAwX1VTQkRfUEhZU19BRERSICsgMHgwMCwgRE1BX0RXOCB8IERNQV9OQyB8IERNQV9EUiB9LCAvKiBFUDBSRCAqLwotCXsgQVUxMDAwX1VTQkRfUEhZU19BRERSICsgMHgwNCwgRE1BX0RXOCB8IERNQV9OQyB9LCAvKiBFUDBXUiAqLwotCXsgQVUxMDAwX1VTQkRfUEhZU19BRERSICsgMHgwOCwgRE1BX0RXOCB8IERNQV9OQyB9LCAvKiBFUDJXUiAqLwotCXsgQVUxMDAwX1VTQkRfUEhZU19BRERSICsgMHgwYywgRE1BX0RXOCB8IERNQV9OQyB9LCAvKiBFUDNXUiAqLwotCXsgQVUxMDAwX1VTQkRfUEhZU19BRERSICsgMHgxMCwgRE1BX0RXOCB8IERNQV9OQyB8IERNQV9EUiB9LCAvKiBFUDRSRCAqLwotCXsgQVUxMDAwX1VTQkRfUEhZU19BRERSICsgMHgxNCwgRE1BX0RXOCB8IERNQV9OQyB8IERNQV9EUiB9LCAvKiBFUDVSRCAqLworCXsgQVUxMDAwX1VTQl9VRENfUEhZU19BRERSICsgMHgwMCwgRE1BX0RXOCB8IERNQV9OQyB8IERNQV9EUiB9LCAvKiBFUDBSRCAqLworCXsgQVUxMDAwX1VTQl9VRENfUEhZU19BRERSICsgMHgwNCwgRE1BX0RXOCB8IERNQV9OQyB9LCAvKiBFUDBXUiAqLworCXsgQVUxMDAwX1VTQl9VRENfUEhZU19BRERSICsgMHgwOCwgRE1BX0RXOCB8IERNQV9OQyB9LCAvKiBFUDJXUiAqLworCXsgQVUxMDAwX1VTQl9VRENfUEhZU19BRERSICsgMHgwYywgRE1BX0RXOCB8IERNQV9OQyB9LCAvKiBFUDNXUiAqLworCXsgQVUxMDAwX1VTQl9VRENfUEhZU19BRERSICsgMHgxMCwgRE1BX0RXOCB8IERNQV9OQyB8IERNQV9EUiB9LCAvKiBFUDRSRCAqLworCXsgQVUxMDAwX1VTQl9VRENfUEhZU19BRERSICsgMHgxNCwgRE1BX0RXOCB8IERNQV9OQyB8IERNQV9EUiB9LCAvKiBFUDVSRCAqLwogCS8qIG9uIEF1MTUwMCwgdGhlc2UgMiBhcmUgRE1BX1JFUTIvMyAoR1BJTzIwOC8yMDkpIGluc3RlYWQhICovCiAJeyBBVTEwMDBfSTJTX1BIWVNfQUREUiArIDB4MDAsIERNQV9EVzMyIHwgRE1BX05DfSwJLyogSTJTIFRYICovCiAJeyBBVTEwMDBfSTJTX1BIWVNfQUREUiArIDB4MDAsIERNQV9EVzMyIHwgRE1BX05DIHwgRE1BX0RSfSwgLyogSTJTIFJYICovCkBAIC0xNzAsMTMgKzE2OCwxMyBAQAogCWNvbnN0IHN0cnVjdCBkbWFfZGV2ICpkZXY7CiAJaW50IGksIHJldDsKIAotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTExMDApCi0JaWYgKGRldl9pZCA8IDAgfHwgZGV2X2lkID49IChETUFfTlVNX0RFViArIERNQV9OVU1fREVWX0JBTksyKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0jZWxzZQotCWlmIChkZXZfaWQgPCAwIHx8IGRldl9pZCA+PSBETUFfTlVNX0RFVikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0jZW5kaWYKKwlpZiAoYWxjaGVteV9nZXRfY3B1dHlwZSgpID09IEFMQ0hFTVlfQ1BVX0FVMTEwMCkgeworCQlpZiAoZGV2X2lkIDwgMCB8fCBkZXZfaWQgPj0gKERNQV9OVU1fREVWICsgRE1BX05VTV9ERVZfQkFOSzIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJaWYgKGRldl9pZCA8IDAgfHwgZGV2X2lkID49IERNQV9OVU1fREVWKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9BVTEwMDBfRE1BX0NIQU5ORUxTOyBpKyspCiAJCWlmIChhdTEwMDBfZG1hX3RhYmxlW2ldLmRldl9pZCA8IDApCkBAIC0yMzksMzAgKzIzNywyOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhdTEwMDBfZG1hX2luaXQodm9pZCkKIHsKLSAgICAgICAgaW50IGJhc2UsIGk7CisJaW50IGJhc2UsIGk7CiAKLSAgICAgICAgc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKLSAgICAgICAgY2FzZSBBTENIRU1ZX0NQVV9BVTEwMDA6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IEFVMTAwMF9ETUFfSU5UX0JBU0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUxDSEVNWV9DUFVfQVUxNTAwOgotICAgICAgICAgICAgICAgIGJhc2UgPSBBVTE1MDBfRE1BX0lOVF9CQVNFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFMQ0hFTVlfQ1BVX0FVMTEwMDoKLSAgICAgICAgICAgICAgICBiYXNlID0gQVUxMTAwX0RNQV9JTlRfQkFTRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgfQorCXN3aXRjaCAoYWxjaGVteV9nZXRfY3B1dHlwZSgpKSB7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTEwMDA6CisJCWJhc2UgPSBBVTEwMDBfRE1BX0lOVF9CQVNFOworCQlicmVhazsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTUwMDoKKwkJYmFzZSA9IEFVMTUwMF9ETUFfSU5UX0JBU0U7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMTAwOgorCQliYXNlID0gQVUxMTAwX0RNQV9JTlRfQkFTRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CisJfQogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVUxMDAwX0RNQV9DSEFOTkVMUzsgaSsrKQotICAgICAgICAgICAgICAgIGF1MTAwMF9kbWFfdGFibGVbaV0uaXJxID0gYmFzZSArIGk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BVTEwMDBfRE1BX0NIQU5ORUxTOyBpKyspCisJCWF1MTAwMF9kbWFfdGFibGVbaV0uaXJxID0gYmFzZSArIGk7CiAKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteSBETUEgaW5pdGlhbGl6ZWRcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkFsY2hlbXkgRE1BIGluaXRpYWxpemVkXG4iKTsKIAogb3V0OgotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIGFyY2hfaW5pdGNhbGwoYXUxMDAwX2RtYV9pbml0KTsKLQotI2VuZGlmIC8qIEFVMTAwMCBBVTE1MDAgQVUxMTAwICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZ3Bpb2xpYi1hdTEwMDAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9ncGlvbGliLWF1MTAwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGUxYTk0Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9ncGlvbGliLWF1MTAwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDksIE9wZW5XcnQub3JnLCBGbG9yaWFuIEZhaW5lbGxpIDxmbG9yaWFuQG9wZW53cnQub3JnPgotICogIAlHUElPTElCIHN1cHBvcnQgZm9yIEF1MTAwMCwgQXUxNTAwLCBBdTExMDAsIEF1MTU1MCBhbmQgQXUxMngwLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRAkgIGBgQVMJSVMnJyBBTkQgICBBTlkJRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywJICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8JRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUJIExJQUJMRSBGT1IgQU5ZCSAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRAkgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUwlPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwJT1IgUFJPRklUUzsgT1IJQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgkgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAgTm90ZXMgOgotICogCWF1MTAwMCBTb0MgaGF2ZSBvbmx5IG9uZSBHUElPIGJsb2NrIDogR1BJTzEKLSAqIAlBdTExMDAsIEF1MTV4MCwgQXUxMngwIGhhdmUgYSBzZWNvbmQgb25lIDogR1BJTzIKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2dwaW8uaD4KLQotc3RhdGljIGludCBncGlvMl9nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBhbGNoZW15X2dwaW8yX2dldF92YWx1ZShvZmZzZXQgKyBBTENIRU1ZX0dQSU8yX0JBU0UpOwotfQotCi1zdGF0aWMgdm9pZCBncGlvMl9zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JYWxjaGVteV9ncGlvMl9zZXRfdmFsdWUob2Zmc2V0ICsgQUxDSEVNWV9HUElPMl9CQVNFLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ3BpbzJfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlyZXR1cm4gYWxjaGVteV9ncGlvMl9kaXJlY3Rpb25faW5wdXQob2Zmc2V0ICsgQUxDSEVNWV9HUElPMl9CQVNFKTsKLX0KLQotc3RhdGljIGludCBncGlvMl9kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKLQkJCQkgIGludCB2YWx1ZSkKLXsKLQlyZXR1cm4gYWxjaGVteV9ncGlvMl9kaXJlY3Rpb25fb3V0cHV0KG9mZnNldCArIEFMQ0hFTVlfR1BJTzJfQkFTRSwKLQkJCQkJCXZhbHVlKTsKLX0KLQotc3RhdGljIGludCBncGlvMl90b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBhbGNoZW15X2dwaW8yX3RvX2lycShvZmZzZXQgKyBBTENIRU1ZX0dQSU8yX0JBU0UpOwotfQotCi0KLXN0YXRpYyBpbnQgZ3BpbzFfZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlyZXR1cm4gYWxjaGVteV9ncGlvMV9nZXRfdmFsdWUob2Zmc2V0ICsgQUxDSEVNWV9HUElPMV9CQVNFKTsKLX0KLQotc3RhdGljIHZvaWQgZ3BpbzFfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JYWxjaGVteV9ncGlvMV9zZXRfdmFsdWUob2Zmc2V0ICsgQUxDSEVNWV9HUElPMV9CQVNFLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ3BpbzFfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlyZXR1cm4gYWxjaGVteV9ncGlvMV9kaXJlY3Rpb25faW5wdXQob2Zmc2V0ICsgQUxDSEVNWV9HUElPMV9CQVNFKTsKLX0KLQotc3RhdGljIGludCBncGlvMV9kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXJldHVybiBhbGNoZW15X2dwaW8xX2RpcmVjdGlvbl9vdXRwdXQob2Zmc2V0ICsgQUxDSEVNWV9HUElPMV9CQVNFLAotCQkJCQkgICAgIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCBncGlvMV90b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBhbGNoZW15X2dwaW8xX3RvX2lycShvZmZzZXQgKyBBTENIRU1ZX0dQSU8xX0JBU0UpOwotfQotCi1zdHJ1Y3QgZ3Bpb19jaGlwIGFsY2hlbXlfZ3Bpb19jaGlwW10gPSB7Ci0JWzBdID0gewotCQkubGFiZWwJCQk9ICJhbGNoZW15LWdwaW8xIiwKLQkJLmRpcmVjdGlvbl9pbnB1dAk9IGdwaW8xX2RpcmVjdGlvbl9pbnB1dCwKLQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBncGlvMV9kaXJlY3Rpb25fb3V0cHV0LAotCQkuZ2V0CQkJPSBncGlvMV9nZXQsCi0JCS5zZXQJCQk9IGdwaW8xX3NldCwKLQkJLnRvX2lycQkJCT0gZ3BpbzFfdG9faXJxLAotCQkuYmFzZQkJCT0gQUxDSEVNWV9HUElPMV9CQVNFLAotCQkubmdwaW8JCQk9IEFMQ0hFTVlfR1BJTzFfTlVNLAotCX0sCi0JWzFdID0gewotCQkubGFiZWwgICAgICAgICAgICAgICAgICA9ICJhbGNoZW15LWdwaW8yIiwKLQkJLmRpcmVjdGlvbl9pbnB1dCAgICAgICAgPSBncGlvMl9kaXJlY3Rpb25faW5wdXQsCi0JCS5kaXJlY3Rpb25fb3V0cHV0ICAgICAgID0gZ3BpbzJfZGlyZWN0aW9uX291dHB1dCwKLQkJLmdldCAgICAgICAgICAgICAgICAgICAgPSBncGlvMl9nZXQsCi0JCS5zZXQgICAgICAgICAgICAgICAgICAgID0gZ3BpbzJfc2V0LAotCQkudG9faXJxCQkJPSBncGlvMl90b19pcnEsCi0JCS5iYXNlICAgICAgICAgICAgICAgICAgID0gQUxDSEVNWV9HUElPMl9CQVNFLAotCQkubmdwaW8gICAgICAgICAgICAgICAgICA9IEFMQ0hFTVlfR1BJTzJfTlVNLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhbGNoZW15X2dwaW9saWJfaW5pdCh2b2lkKQotewotCWdwaW9jaGlwX2FkZCgmYWxjaGVteV9ncGlvX2NoaXBbMF0pOwotCWlmIChhbGNoZW15X2dldF9jcHV0eXBlKCkgIT0gQUxDSEVNWV9DUFVfQVUxMDAwKQotCQlncGlvY2hpcF9hZGQoJmFsY2hlbXlfZ3Bpb19jaGlwWzFdKTsKLQotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChhbGNoZW15X2dwaW9saWJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZ3Bpb2xpYi5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2dwaW9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWZiNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2dwaW9saWIuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSwgT3BlbldydC5vcmcsIEZsb3JpYW4gRmFpbmVsbGkgPGZsb3JpYW5Ab3BlbndydC5vcmc+CisgKglHUElPTElCIHN1cHBvcnQgZm9yIEFsY2hlbXkgY2hpcHMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVECSAgYGBBUwlJUycnIEFORCAgIEFOWQlFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLAkgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTwlFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQkgTElBQkxFIEZPUiBBTlkJICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVECSAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTCU9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLAlPUiBQUk9GSVRTOyBPUglCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCSBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBOb3RlcyA6CisgKglUaGlzIGZpbGUgbXVzdCBPTkxZIGJlIGJ1aWx0IHdoZW4gQ09ORklHX0dQSU9MSUI9eSBhbmQKKyAqCSBDT05GSUdfQUxDSEVNWV9HUElPX0lORElSRUNUPW4sIG90aGVyd2lzZSBjb21waWxhdGlvbiB3aWxsIGZhaWwhCisgKglhdTEwMDAgU29DIGhhdmUgb25seSBvbmUgR1BJTyBibG9jayA6IEdQSU8xCisgKglBdTExMDAsIEF1MTV4MCwgQXUxMngwIGhhdmUgYSBzZWNvbmQgb25lIDogR1BJTzIKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9ncGlvLWF1MTAwMC5oPgorCitzdGF0aWMgaW50IGdwaW8yX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIGFsY2hlbXlfZ3BpbzJfZ2V0X3ZhbHVlKG9mZnNldCArIEFMQ0hFTVlfR1BJTzJfQkFTRSk7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW8yX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlhbGNoZW15X2dwaW8yX3NldF92YWx1ZShvZmZzZXQgKyBBTENIRU1ZX0dQSU8yX0JBU0UsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBncGlvMl9kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBhbGNoZW15X2dwaW8yX2RpcmVjdGlvbl9pbnB1dChvZmZzZXQgKyBBTENIRU1ZX0dQSU8yX0JBU0UpOworfQorCitzdGF0aWMgaW50IGdwaW8yX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAorCQkJCSAgaW50IHZhbHVlKQoreworCXJldHVybiBhbGNoZW15X2dwaW8yX2RpcmVjdGlvbl9vdXRwdXQob2Zmc2V0ICsgQUxDSEVNWV9HUElPMl9CQVNFLAorCQkJCQkJdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdwaW8yX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIGFsY2hlbXlfZ3BpbzJfdG9faXJxKG9mZnNldCArIEFMQ0hFTVlfR1BJTzJfQkFTRSk7Cit9CisKKworc3RhdGljIGludCBncGlvMV9nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBhbGNoZW15X2dwaW8xX2dldF92YWx1ZShvZmZzZXQgKyBBTENIRU1ZX0dQSU8xX0JBU0UpOworfQorCitzdGF0aWMgdm9pZCBncGlvMV9zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlhbGNoZW15X2dwaW8xX3NldF92YWx1ZShvZmZzZXQgKyBBTENIRU1ZX0dQSU8xX0JBU0UsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBncGlvMV9kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBhbGNoZW15X2dwaW8xX2RpcmVjdGlvbl9pbnB1dChvZmZzZXQgKyBBTENIRU1ZX0dQSU8xX0JBU0UpOworfQorCitzdGF0aWMgaW50IGdwaW8xX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkJdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJcmV0dXJuIGFsY2hlbXlfZ3BpbzFfZGlyZWN0aW9uX291dHB1dChvZmZzZXQgKyBBTENIRU1ZX0dQSU8xX0JBU0UsCisJCQkJCSAgICAgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdwaW8xX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIGFsY2hlbXlfZ3BpbzFfdG9faXJxKG9mZnNldCArIEFMQ0hFTVlfR1BJTzFfQkFTRSk7Cit9CisKK3N0cnVjdCBncGlvX2NoaXAgYWxjaGVteV9ncGlvX2NoaXBbXSA9IHsKKwlbMF0gPSB7CisJCS5sYWJlbAkJCT0gImFsY2hlbXktZ3BpbzEiLAorCQkuZGlyZWN0aW9uX2lucHV0CT0gZ3BpbzFfZGlyZWN0aW9uX2lucHV0LAorCQkuZGlyZWN0aW9uX291dHB1dAk9IGdwaW8xX2RpcmVjdGlvbl9vdXRwdXQsCisJCS5nZXQJCQk9IGdwaW8xX2dldCwKKwkJLnNldAkJCT0gZ3BpbzFfc2V0LAorCQkudG9faXJxCQkJPSBncGlvMV90b19pcnEsCisJCS5iYXNlCQkJPSBBTENIRU1ZX0dQSU8xX0JBU0UsCisJCS5uZ3BpbwkJCT0gQUxDSEVNWV9HUElPMV9OVU0sCisJfSwKKwlbMV0gPSB7CisJCS5sYWJlbCAgICAgICAgICAgICAgICAgID0gImFsY2hlbXktZ3BpbzIiLAorCQkuZGlyZWN0aW9uX2lucHV0ICAgICAgICA9IGdwaW8yX2RpcmVjdGlvbl9pbnB1dCwKKwkJLmRpcmVjdGlvbl9vdXRwdXQgICAgICAgPSBncGlvMl9kaXJlY3Rpb25fb3V0cHV0LAorCQkuZ2V0ICAgICAgICAgICAgICAgICAgICA9IGdwaW8yX2dldCwKKwkJLnNldCAgICAgICAgICAgICAgICAgICAgPSBncGlvMl9zZXQsCisJCS50b19pcnEJCQk9IGdwaW8yX3RvX2lycSwKKwkJLmJhc2UgICAgICAgICAgICAgICAgICAgPSBBTENIRU1ZX0dQSU8yX0JBU0UsCisJCS5uZ3BpbyAgICAgICAgICAgICAgICAgID0gQUxDSEVNWV9HUElPMl9OVU0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsY2hlbXlfZ3Bpb2NoaXBfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTAwMDoKKwkJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZhbGNoZW15X2dwaW9fY2hpcFswXSk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTAwLi4uQUxDSEVNWV9DUFVfQVUxMjAwOgorCQlyZXQgPSBncGlvY2hpcF9hZGQoJmFsY2hlbXlfZ3Bpb19jaGlwWzBdKTsKKwkJcmV0IHw9IGdwaW9jaGlwX2FkZCgmYWxjaGVteV9ncGlvX2NoaXBbMV0pOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KK2FyY2hfaW5pdGNhbGwoYWxjaGVteV9ncGlvY2hpcF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wY2kuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2NmNmNS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgotICoJQWxjaGVteS9BTUQgQXUxeDAwIFBDSSBzdXBwb3J0LgotICoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDMsIDIwMDctMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKLSAqCi0gKiAgU3VwcG9ydCBmb3IgYWxsIGRldmljZXMgKGdyZWF0ZXIgdGhhbiAxNikgYWRkZWQgYnkgRGF2aWQgR2F0aHJpZ2h0LgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgotCi0vKiBUQkQgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGNpX2lvX3Jlc291cmNlID0gewotCS5zdGFydAk9IFBDSV9JT19TVEFSVCwKLQkuZW5kCT0gUENJX0lPX0VORCwKLQkubmFtZQk9ICJQQ0kgSU8gc3BhY2UiLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGNpX21lbV9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJPSBQQ0lfTUVNX1NUQVJULAotCS5lbmQJPSBQQ0lfTUVNX0VORCwKLQkubmFtZQk9ICJQQ0kgbWVtb3J5IHNwYWNlIiwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQotfTsKLQotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIGF1MXhfcGNpX29wczsKLQotc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBhdTF4X2NvbnRyb2xsZXIgPSB7Ci0JLnBjaV9vcHMJPSAmYXUxeF9wY2lfb3BzLAotCS5pb19yZXNvdXJjZQk9ICZwY2lfaW9fcmVzb3VyY2UsCi0JLm1lbV9yZXNvdXJjZQk9ICZwY2lfbWVtX3Jlc291cmNlLAotfTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1MDApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2aXJ0X2lvX2FkZHI7Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgYXUxeF9wY2lfc2V0dXAodm9pZCkKLXsKLQlleHRlcm4gdm9pZCBhdTF4X3BjaV9jZmdfaW5pdCh2b2lkKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1MDApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApCi0JdmlydF9pb19hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChBdTE1MDBfUENJX0lPX1NUQVJULAotCQkJQXUxNTAwX1BDSV9JT19FTkQgLSBBdTE1MDBfUENJX0lPX1NUQVJUICsgMSk7Ci0KLQlpZiAoIXZpcnRfaW9fYWRkcikgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBpb3JlbWFwIHBjaSBzcGFjZVxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlhdTF4X2NvbnRyb2xsZXIuaW9fbWFwX2Jhc2UgPSB2aXJ0X2lvX2FkZHI7Ci0KLSNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCi0JewotCQkvKgotCQkgKiAgU2V0IHRoZSBOQyBiaXQgaW4gY29udHJvbGxlciBmb3IgQXUxNTAwIHByZS1BQyBzaWxpY29uCi0JCSAqLwotCQl1MzIgcHJpZCA9IHJlYWRfYzBfcHJpZCgpOwotCi0JCWlmICgocHJpZCAmIDB4RkYwMDAwMDApID09IDB4MDEwMDAwMDAgJiYgcHJpZCA8IDB4MDEwMzAyMDIpIHsKLQkJCWF1X3dyaXRlbCgoMSA8PCAxNikgfCBhdV9yZWFkbChBdTE1MDBfUENJX0NGRyksCi0JCQkJICBBdTE1MDBfUENJX0NGRyk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJOb24tY29oZXJlbnQgUENJIGFjY2Vzc2VzIGVuYWJsZWRcbiIpOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlzZXRfaW9fcG9ydF9iYXNlKHZpcnRfaW9fYWRkcik7Ci0jZW5kaWYKLQotCWF1MXhfcGNpX2NmZ19pbml0KCk7Ci0KLQlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmYXUxeF9jb250cm9sbGVyKTsKLQlyZXR1cm4gMDsKLX0KLQotYXJjaF9pbml0Y2FsbChhdTF4X3BjaV9zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wbGF0Zm9ybS5jCmluZGV4IGY3MmM0OGQuLmM4ZTVkNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wbGF0Zm9ybS5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMTAwX21tYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZXRoLmg+CkBAIC0xMTEsMjcwICsxMTEsODcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteTogZmFpbGVkIHRvIHJlZ2lzdGVyIFVBUlRzXG4iKTsKIH0KIAotLyogT0hDSSAoVVNCIGZ1bGwgc3BlZWQgaG9zdCBjb250cm9sbGVyKSAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTF4eHhfdXNiX29oY2lfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gVVNCX09IQ0lfQkFTRSwKLQkJLmVuZAkJPSBVU0JfT0hDSV9CQVNFICsgVVNCX09IQ0lfTEVOIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJCT0gRk9SX1BMQVRGT1JNX0NfVVNCX0hPU1RfSU5ULAotCQkuZW5kCQk9IEZPUl9QTEFURk9STV9DX1VTQl9IT1NUX0lOVCwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCisKKy8qIFRoZSBkbWFtYXNrIG11c3QgYmUgc2V0IGZvciBPSENJL0VIQ0kgdG8gd29yayAqLworc3RhdGljIHU2NCBhbGNoZW15X29oY2lfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CitzdGF0aWMgdTY0IF9fbWF5YmVfdW51c2VkIGFsY2hlbXlfZWhjaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxjaGVteV9vaGNpX2RhdGFbXVsyXSBfX2luaXRkYXRhID0geworCVtBTENIRU1ZX0NQVV9BVTEwMDBdID0geyBBVTEwMDBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTEwMDBfVVNCX0hPU1RfSU5UIH0sCisJW0FMQ0hFTVlfQ1BVX0FVMTUwMF0gPSB7IEFVMTAwMF9VU0JfT0hDSV9QSFlTX0FERFIsIEFVMTUwMF9VU0JfSE9TVF9JTlQgfSwKKwlbQUxDSEVNWV9DUFVfQVUxMTAwXSA9IHsgQVUxMDAwX1VTQl9PSENJX1BIWVNfQUREUiwgQVUxMTAwX1VTQl9IT1NUX0lOVCB9LAorCVtBTENIRU1ZX0NQVV9BVTE1NTBdID0geyBBVTE1NTBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTE1NTBfVVNCX0hPU1RfSU5UIH0sCisJW0FMQ0hFTVlfQ1BVX0FVMTIwMF0gPSB7IEFVMTIwMF9VU0JfT0hDSV9QSFlTX0FERFIsIEFVMTIwMF9VU0JfSU5UIH0sCiB9OwogCi0vKiBUaGUgZG1hbWFzayBtdXN0IGJlIHNldCBmb3IgT0hDSSB0byB3b3JrICovCi1zdGF0aWMgdTY0IG9oY2lfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF1MXh4eF91c2Jfb2hjaV9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImF1MXh4eC1vaGNpIiwKLQkuaWQJCT0gMCwKLQkuZGV2ID0gewotCQkuZG1hX21hc2sJCT0gJm9oY2lfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTF4eHhfdXNiX29oY2lfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBhdTF4eHhfdXNiX29oY2lfcmVzb3VyY2VzLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxjaGVteV9laGNpX2RhdGFbXVsyXSBfX2luaXRkYXRhID0geworCVtBTENIRU1ZX0NQVV9BVTEyMDBdID0geyBBVTEyMDBfVVNCX0VIQ0lfUEhZU19BRERSLCBBVTEyMDBfVVNCX0lOVCB9LAogfTsKIAotLyoqKiBBVTExMDAgTENEIGNvbnRyb2xsZXIgKioqLwotCi0jaWZkZWYgQ09ORklHX0ZCX0FVMTEwMAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTExMDBfbGNkX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ICAgICAgICAgID0gTENEX1BIWVNfQUREUiwKLQkJLmVuZCAgICAgICAgICAgID0gTENEX1BIWVNfQUREUiArIDB4ODAwIC0gMSwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCAgICAgICAgICA9IEFVMTEwMF9MQ0RfSU5ULAotCQkuZW5kICAgICAgICAgICAgPSBBVTExMDBfTENEX0lOVCwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9JUlEsCitzdGF0aWMgaW50IF9faW5pdCBfbmV3X3VzYnJlcyhzdHJ1Y3QgcmVzb3VyY2UgKipyLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqZCkKK3sKKwkqciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiAyLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpyKQorCQlyZXR1cm4gLUVOT01FTTsKKwkqZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpkKSB7CisJCWtmcmVlKCpyKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQotfTsKIAotc3RhdGljIHU2NCBhdTExMDBfbGNkX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCSgqZCktPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisJKCpkKS0+bnVtX3Jlc291cmNlcyA9IDI7CisJKCpkKS0+cmVzb3VyY2UgPSAqcjsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxMTAwX2xjZF9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gImF1MTEwMC1sY2QiLAotCS5pZCAgICAgICAgICAgICA9IDAsCi0JLmRldiA9IHsKLQkJLmRtYV9tYXNrICAgICAgICAgICAgICAgPSAmYXUxMTAwX2xjZF9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgICAgICA9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGF1MTEwMF9sY2RfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBhdTExMDBfbGNkX3Jlc291cmNlcywKLX07Ci0jZW5kaWYKKwlyZXR1cm4gMDsKK30KIAotI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCi0vKiBFSENJIChVU0IgaGlnaCBzcGVlZCBob3N0IGNvbnRyb2xsZXIpICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MXh4eF91c2JfZWhjaV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSBVU0JfRUhDSV9CQVNFLAotCQkuZW5kCQk9IFVTQl9FSENJX0JBU0UgKyBVU0JfRUhDSV9MRU4gLSAxLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAkJPSBBVTEyMDBfVVNCX0lOVCwKLQkJLmVuZAkJPSBBVTEyMDBfVVNCX0lOVCwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19Oworc3RhdGljIHZvaWQgX19pbml0IGFsY2hlbXlfc2V0dXBfdXNiKGludCBjdHlwZSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCi1zdGF0aWMgdTY0IGVoY2lfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisJLyogc2V0dXAgT0hDSTAuICBFdmVyeSB2YXJpYW50IGhhcyBvbmUgKi8KKwlpZiAoX25ld191c2JyZXMoJnJlcywgJnBkZXYpKQorCQlyZXR1cm47CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF1MXh4eF91c2JfZWhjaV9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImF1MXh4eC1laGNpIiwKLQkuaWQJCT0gMCwKLQkuZGV2ID0gewotCQkuZG1hX21hc2sJCT0gJmVoY2lfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTF4eHhfdXNiX2VoY2lfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBhdTF4eHhfdXNiX2VoY2lfcmVzb3VyY2VzLAotfTsKKwlyZXNbMF0uc3RhcnQgPSBhbGNoZW15X29oY2lfZGF0YVtjdHlwZV1bMF07CisJcmVzWzBdLmVuZCA9IHJlc1swXS5zdGFydCArIDB4MTAwIC0gMTsKKwlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwlyZXNbMV0uc3RhcnQgPSBhbGNoZW15X29oY2lfZGF0YVtjdHlwZV1bMV07CisJcmVzWzFdLmVuZCA9IHJlc1sxXS5zdGFydDsKKwlyZXNbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKwlwZGV2LT5uYW1lID0gImF1MXh4eC1vaGNpIjsKKwlwZGV2LT5pZCA9IDA7CisJcGRldi0+ZGV2LmRtYV9tYXNrID0gJmFsY2hlbXlfb2hjaV9kbWFtYXNrOwogCi0vKiBBdTEyMDAgVURDIChVU0IgZ2FkZ2V0IGNvbnRyb2xsZXIpICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MXh4eF91c2JfZ2R0X3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CQk9IFVTQl9VRENfQkFTRSwKLQkJLmVuZAkJPSBVU0JfVURDX0JBU0UgKyBVU0JfVURDX0xFTiAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IEFVMTIwMF9VU0JfSU5ULAotCQkuZW5kCQk9IEFVMTIwMF9VU0JfSU5ULAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07CisJaWYgKHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihwZGV2KSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteSBVU0I6IGNhbm5vdCBhZGQgT0hDSTBcbiIpOwogCi1zdGF0aWMgdTY0IHVkY19kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxeHh4X3VzYl9nZHRfZGV2aWNlID0gewotCS5uYW1lCQk9ICJhdTF4eHgtdWRjIiwKLQkuaWQJCT0gMCwKLQkuZGV2ID0gewotCQkuZG1hX21hc2sJCT0gJnVkY19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MXh4eF91c2JfZ2R0X3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gYXUxeHh4X3VzYl9nZHRfcmVzb3VyY2VzLAotfTsKKwkvKiBzZXR1cCBFSENJMDogQXUxMjAwICovCisJaWYgKGN0eXBlID09IEFMQ0hFTVlfQ1BVX0FVMTIwMCkgeworCQlpZiAoX25ld191c2JyZXMoJnJlcywgJnBkZXYpKQorCQkJcmV0dXJuOwogCi0vKiBBdTEyMDAgVU9DIChVU0IgT1RHIGNvbnRyb2xsZXIpICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MXh4eF91c2Jfb3RnX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CQk9IFVTQl9VT0NfQkFTRSwKLQkJLmVuZAkJPSBVU0JfVU9DX0JBU0UgKyBVU0JfVU9DX0xFTiAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IEFVMTIwMF9VU0JfSU5ULAotCQkuZW5kCQk9IEFVMTIwMF9VU0JfSU5ULAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07CisJCXJlc1swXS5zdGFydCA9IGFsY2hlbXlfZWhjaV9kYXRhW2N0eXBlXVswXTsKKwkJcmVzWzBdLmVuZCA9IHJlc1swXS5zdGFydCArIDB4MTAwIC0gMTsKKwkJcmVzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCXJlc1sxXS5zdGFydCA9IGFsY2hlbXlfZWhjaV9kYXRhW2N0eXBlXVsxXTsKKwkJcmVzWzFdLmVuZCA9IHJlc1sxXS5zdGFydDsKKwkJcmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJCXBkZXYtPm5hbWUgPSAiYXUxeHh4LWVoY2kiOworCQlwZGV2LT5pZCA9IDA7CisJCXBkZXYtPmRldi5kbWFfbWFzayA9ICZhbGNoZW15X2VoY2lfZG1hbWFzazsKIAotc3RhdGljIHU2NCB1b2NfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF1MXh4eF91c2Jfb3RnX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXUxeHh4LXVvYyIsCi0JLmlkCQk9IDAsCi0JLmRldiA9IHsKLQkJLmRtYV9tYXNrCQk9ICZ1b2NfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTF4eHhfdXNiX290Z19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IGF1MXh4eF91c2Jfb3RnX3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX2xjZF9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCAgICAgICAgICA9IExDRF9QSFlTX0FERFIsCi0JCS5lbmQgICAgICAgICAgICA9IExDRF9QSFlTX0FERFIgKyAweDgwMCAtIDEsCi0JCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgICAgICAgICAgPSBBVTEyMDBfTENEX0lOVCwKLQkJLmVuZCAgICAgICAgICAgID0gQVUxMjAwX0xDRF9JTlQsCi0JCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfSVJRLAorCQlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBkZXYpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteSBVU0I6IGNhbm5vdCBhZGQgRUhDSTBcbiIpOwogCX0KLX07Ci0KLXN0YXRpYyB1NjQgYXUxMjAwX2xjZF9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxMjAwX2xjZF9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gImF1MTIwMC1sY2QiLAotCS5pZCAgICAgICAgICAgICA9IDAsCi0JLmRldiA9IHsKLQkJLmRtYV9tYXNrICAgICAgICAgICAgICAgPSAmYXUxMjAwX2xjZF9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgICAgICA9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGF1MTIwMF9sY2RfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBhdTEyMDBfbGNkX3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyB1NjQgYXUxeHh4X21tY19kbWFtYXNrID0gIERNQV9CSVRfTUFTSygzMik7Ci0KLWV4dGVybiBzdHJ1Y3QgYXUxeG1tY19wbGF0Zm9ybV9kYXRhIGF1MXhtbWNfcGxhdGRhdGFbMl07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX21tYzBfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgICAgICAgICAgPSBBVTExMDBfU0QwX1BIWVNfQUREUiwKLQkJLmVuZCAgICAgICAgICAgID0gQVUxMTAwX1NEMF9QSFlTX0FERFIgKyAweGZmZiwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAkJPSBBVTEyMDBfU0RfSU5ULAotCQkuZW5kCQk9IEFVMTIwMF9TRF9JTlQsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0CQk9IERTQ1JfQ01EMF9TRE1TX1RYMCwKLQkJLmVuZAkJPSBEU0NSX0NNRDBfU0RNU19UWDAsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0RNQSwKLQl9LAotCVszXSA9IHsKLQkJLnN0YXJ0ICAgICAgICAgID0gRFNDUl9DTUQwX1NETVNfUlgwLAotCQkuZW5kCQk9IERTQ1JfQ01EMF9TRE1TX1JYMCwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9ETUEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxMjAwX21tYzBfZGV2aWNlID0gewotCS5uYW1lID0gImF1MXh4eC1tbWMiLAotCS5pZCA9IDAsCi0JLmRldiA9IHsKLQkJLmRtYV9tYXNrCQk9ICZhdTF4eHhfbW1jX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JCS5wbGF0Zm9ybV9kYXRhCQk9ICZhdTF4bW1jX3BsYXRkYXRhWzBdLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MTIwMF9tbWMwX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gYXUxMjAwX21tYzBfcmVzb3VyY2VzLAotfTsKLQotI2lmbmRlZiBDT05GSUdfTUlQU19EQjEyMDAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX21tYzFfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgICAgICAgICAgPSBBVTExMDBfU0QxX1BIWVNfQUREUiwKLQkJLmVuZCAgICAgICAgICAgID0gQVUxMTAwX1NEMV9QSFlTX0FERFIgKyAweGZmZiwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAkJPSBBVTEyMDBfU0RfSU5ULAotCQkuZW5kCQk9IEFVMTIwMF9TRF9JTlQsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0CQk9IERTQ1JfQ01EMF9TRE1TX1RYMSwKLQkJLmVuZAkJPSBEU0NSX0NNRDBfU0RNU19UWDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0RNQSwKLQl9LAotCVszXSA9IHsKLQkJLnN0YXJ0ICAgICAgICAgID0gRFNDUl9DTUQwX1NETVNfUlgxLAotCQkuZW5kCQk9IERTQ1JfQ01EMF9TRE1TX1JYMSwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9ETUEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxMjAwX21tYzFfZGV2aWNlID0gewotCS5uYW1lID0gImF1MXh4eC1tbWMiLAotCS5pZCA9IDEsCi0JLmRldiA9IHsKLQkJLmRtYV9tYXNrCQk9ICZhdTF4eHhfbW1jX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JCS5wbGF0Zm9ybV9kYXRhCQk9ICZhdTF4bW1jX3BsYXRkYXRhWzFdLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MTIwMF9tbWMxX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gYXUxMjAwX21tYzFfcmVzb3VyY2VzLAotfTsKLSNlbmRpZiAvKiAjaWZuZGVmIENPTkZJR19NSVBTX0RCMTIwMCAqLwotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfU09DX0FVMTIwMCAqLwotCi0vKiBBbGwgQWxjaGVteSBkZW1vYm9hcmRzIHdpdGggSTJDIGhhdmUgdGhpcyAjZGVmaW5lIGluIHRoZWlyIGhlYWRlcnMgKi8KLSNpZmRlZiBTTUJVU19QU0NfQkFTRQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwYmRiX3NtYnVzX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0CT0gQ1BIWVNBRERSKFNNQlVTX1BTQ19CQVNFKSwKLQkJLmVuZAk9IENQSFlTQUREUihTTUJVU19QU0NfQkFTRSArIDB4ZmZmZmYpLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGJkYl9zbWJ1c19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImF1MXhwc2Nfc21idXMiLAotCS5pZAkJPSAwLAkvKiBidXMgbnVtYmVyICovCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHBiZGJfc21idXNfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBwYmRiX3NtYnVzX3Jlc291cmNlcywKLX07Ci0jZW5kaWYKK30KIAogLyogTWFjcm8gdG8gaGVscCBkZWZpbmluZyB0aGUgRXRoZXJuZXQgTUFDIHJlc291cmNlcyAqLwotI2RlZmluZSBNQUNfUkVTX0NPVU5UCTMJLyogTUFDIHJlZ3MgYmFzZSwgTUFDIGVuYWJsZSByZWcsIE1BQyBJTlQgKi8KLSNkZWZpbmUgTUFDX1JFUyhfYmFzZSwgX2VuYWJsZSwgX2lycSkJCQlcCisjZGVmaW5lIE1BQ19SRVNfQ09VTlQJNAkvKiBNQUMgcmVncywgTUFDIGVuLCBNQUMgSU5ULCBNQUNETUEgcmVncyAqLworI2RlZmluZSBNQUNfUkVTKF9iYXNlLCBfZW5hYmxlLCBfaXJxLCBfbWFjZG1hKQkJXAogCXsJCQkJCQlcCiAJCS5zdGFydAk9IF9iYXNlLAkJCVwKIAkJLmVuZAk9IF9iYXNlICsgMHhmZmZmLAkJXApAQCAtMzg5LDI4ICsyMDYsMzcgQEAKIAkJLnN0YXJ0CT0gX2lycSwJCQkJXAogCQkuZW5kCT0gX2lycSwJCQkJXAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUQkJXAorCX0sCQkJCQkJXAorCXsJCQkJCQlcCisJCS5zdGFydAk9IF9tYWNkbWEsCQkJXAorCQkuZW5kCT0gX21hY2RtYSArIDB4MWZmLAkJXAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwJCVwKIAl9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxeHh4X2V0aDBfcmVzb3VyY2VzW11bTUFDX1JFU19DT1VOVF0gX19pbml0ZGF0YSA9IHsKIAlbQUxDSEVNWV9DUFVfQVUxMDAwXSA9IHsKIAkJTUFDX1JFUyhBVTEwMDBfTUFDMF9QSFlTX0FERFIsCiAJCQlBVTEwMDBfTUFDRU5fUEhZU19BRERSLAotCQkJQVUxMDAwX01BQzBfRE1BX0lOVCkKKwkJCUFVMTAwMF9NQUMwX0RNQV9JTlQsCisJCQlBVTEwMDBfTUFDRE1BMF9QSFlTX0FERFIpCiAJfSwKIAlbQUxDSEVNWV9DUFVfQVUxNTAwXSA9IHsKIAkJTUFDX1JFUyhBVTE1MDBfTUFDMF9QSFlTX0FERFIsCiAJCQlBVTE1MDBfTUFDRU5fUEhZU19BRERSLAotCQkJQVUxNTAwX01BQzBfRE1BX0lOVCkKKwkJCUFVMTUwMF9NQUMwX0RNQV9JTlQsCisJCQlBVTEwMDBfTUFDRE1BMF9QSFlTX0FERFIpCiAJfSwKIAlbQUxDSEVNWV9DUFVfQVUxMTAwXSA9IHsKIAkJTUFDX1JFUyhBVTEwMDBfTUFDMF9QSFlTX0FERFIsCiAJCQlBVTEwMDBfTUFDRU5fUEhZU19BRERSLAotCQkJQVUxMTAwX01BQzBfRE1BX0lOVCkKKwkJCUFVMTEwMF9NQUMwX0RNQV9JTlQsCisJCQlBVTEwMDBfTUFDRE1BMF9QSFlTX0FERFIpCiAJfSwKIAlbQUxDSEVNWV9DUFVfQVUxNTUwXSA9IHsKIAkJTUFDX1JFUyhBVTEwMDBfTUFDMF9QSFlTX0FERFIsCiAJCQlBVTEwMDBfTUFDRU5fUEhZU19BRERSLAotCQkJQVUxNTUwX01BQzBfRE1BX0lOVCkKKwkJCUFVMTU1MF9NQUMwX0RNQV9JTlQsCisJCQlBVTEwMDBfTUFDRE1BMF9QSFlTX0FERFIpCiAJfSwKIH07CiAKQEAgLTQyOSwxNyArMjU1LDIwIEBACiAJW0FMQ0hFTVlfQ1BVX0FVMTAwMF0gPSB7CiAJCU1BQ19SRVMoQVUxMDAwX01BQzFfUEhZU19BRERSLAogCQkJQVUxMDAwX01BQ0VOX1BIWVNfQUREUiArIDQsCi0JCQlBVTEwMDBfTUFDMV9ETUFfSU5UKQorCQkJQVUxMDAwX01BQzFfRE1BX0lOVCwKKwkJCUFVMTAwMF9NQUNETUExX1BIWVNfQUREUikKIAl9LAogCVtBTENIRU1ZX0NQVV9BVTE1MDBdID0gewogCQlNQUNfUkVTKEFVMTUwMF9NQUMxX1BIWVNfQUREUiwKIAkJCUFVMTUwMF9NQUNFTl9QSFlTX0FERFIgKyA0LAotCQkJQVUxNTAwX01BQzFfRE1BX0lOVCkKKwkJCUFVMTUwMF9NQUMxX0RNQV9JTlQsCisJCQlBVTEwMDBfTUFDRE1BMV9QSFlTX0FERFIpCiAJfSwKIAlbQUxDSEVNWV9DUFVfQVUxNTUwXSA9IHsKIAkJTUFDX1JFUyhBVTEwMDBfTUFDMV9QSFlTX0FERFIsCiAJCQlBVTEwMDBfTUFDRU5fUEhZU19BRERSICsgNCwKLQkJCUFVMTU1MF9NQUMxX0RNQV9JTlQpCisJCQlBVTE1NTBfTUFDMV9ETUFfSU5ULAorCQkJQVUxMDAwX01BQ0RNQTFfUEhZU19BRERSKQogCX0sCiB9OwogCkBAIC01MjEsMzYgKzM1MCwxNSBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF1MXh4eF9wbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmYXUxeHh4X3VzYl9vaGNpX2RldmljZSwKLSNpZmRlZiBDT05GSUdfRkJfQVUxMTAwCi0JJmF1MTEwMF9sY2RfZGV2aWNlLAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLQkmYXUxeHh4X3VzYl9laGNpX2RldmljZSwKLQkmYXUxeHh4X3VzYl9nZHRfZGV2aWNlLAotCSZhdTF4eHhfdXNiX290Z19kZXZpY2UsCi0JJmF1MTIwMF9sY2RfZGV2aWNlLAotCSZhdTEyMDBfbW1jMF9kZXZpY2UsCi0jaWZuZGVmIENPTkZJR19NSVBTX0RCMTIwMAotCSZhdTEyMDBfbW1jMV9kZXZpY2UsCi0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIFNNQlVTX1BTQ19CQVNFCi0JJnBiZGJfc21idXNfZGV2aWNlLAotI2VuZGlmCi19OwotCiBzdGF0aWMgaW50IF9faW5pdCBhdTF4eHhfcGxhdGZvcm1faW5pdCh2b2lkKQogewotCWludCBlcnIsIGN0eXBlID0gYWxjaGVteV9nZXRfY3B1dHlwZSgpOworCWludCBjdHlwZSA9IGFsY2hlbXlfZ2V0X2NwdXR5cGUoKTsKIAogCWFsY2hlbXlfc2V0dXBfdWFydHMoY3R5cGUpOwogCWFsY2hlbXlfc2V0dXBfbWFjcyhjdHlwZSk7CisJYWxjaGVteV9zZXR1cF91c2IoY3R5cGUpOwogCi0JZXJyID0gcGxhdGZvcm1fYWRkX2RldmljZXMoYXUxeHh4X3BsYXRmb3JtX2RldmljZXMsCi0JCQkJICAgQVJSQVlfU0laRShhdTF4eHhfcGxhdGZvcm1fZGV2aWNlcykpOwotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIGFyY2hfaW5pdGNhbGwoYXUxeHh4X3BsYXRmb3JtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3Bvd2VyLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcG93ZXIuYwppbmRleCBiODYzMjRhLi5iZGQ2NjUxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcG93ZXIuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcG93ZXIuYwpAQCAtMzcsOCArMzcsNiBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogCi0jaWZkZWYgQ09ORklHX1BNCi0KIC8qCiAgKiBXZSBuZWVkIHRvIHNhdmUvcmVzdG9yZSBhIGJ1bmNoIG9mIGNvcmUgcmVnaXN0ZXJzIHRoYXQgYXJlCiAgKiBlaXRoZXIgdm9sYXRpbGUgb3IgcmVzZXQgdG8gc29tZSBzdGF0ZSBhY3Jvc3MgYSBwcm9jZXNzb3Igc2xlZXAuCkBAIC00OSw3ICs0Nyw2IEBACiAgKiBXZSBvbmx5IGhhdmUgdG8gc2F2ZS9yZXN0b3JlIHJlZ2lzdGVycyB0aGF0IGFyZW4ndCBvdGhlcndpc2UKICAqIGRvbmUgYXMgcGFydCBvZiBhIGRyaXZlciBwbV8qIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNsZWVwX3VzYlsyXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfc3lzX2Nsb2Nrc1s1XTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfc3lzX3BpbmZ1bmM7CiBzdGF0aWMgdW5zaWduZWQgaW50IHNsZWVwX3N0YXRpY19tZW1jdGxyWzRdWzNdOwpAQCAtNTcsMzEgKzU0LDYgQEAKIAogc3RhdGljIHZvaWQgc2F2ZV9jb3JlX3JlZ3Modm9pZCkKIHsKLSNpZm5kZWYgQ09ORklHX1NPQ19BVTEyMDAKLQkvKiBTaHV0ZG93biBVU0IgaG9zdC9kZXZpY2UuICovCi0Jc2xlZXBfdXNiWzBdID0gYXVfcmVhZGwoVVNCX0hPU1RfQ09ORklHKTsKLQotCS8qIFRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSB1bmRvY3VtZW50ZWQgcmVzZXQgcmVnaXN0ZXIuLi4uICovCi0JYXVfd3JpdGVsKDAsIDB4YjAxMDAwMDQpOwotCWF1X3N5bmMoKTsKLQlhdV93cml0ZWwoMCwgVVNCX0hPU1RfQ09ORklHKTsKLQlhdV9zeW5jKCk7Ci0KLQlzbGVlcF91c2JbMV0gPSBhdV9yZWFkbChVU0JEX0VOQUJMRSk7Ci0JYXVfd3JpdGVsKDAsIFVTQkRfRU5BQkxFKTsKLQlhdV9zeW5jKCk7Ci0KLSNlbHNlCS8qIEFVMTIwMCAqLwotCi0JLyogZW5hYmxlIGFjY2VzcyB0byBPVEcgbW1pbyBzbyB3ZSBjYW4gc2F2ZSBPVEcgQ0FQL01VWC4KLQkgKiBGSVhNRTogd3JpdGUgYW4gT1RHIGRyaXZlciBhbmQgbW92ZSB0aGlzIHN0dWZmIHRoZXJlIQotCSAqLwotCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfTVNSX0JBU0UgKyA0KSB8ICgxIDw8IDYpLCBVU0JfTVNSX0JBU0UgKyA0KTsKLQlhdV9zeW5jKCk7Ci0Jc2xlZXBfdXNiWzBdID0gYXVfcmVhZGwoMHhiNDAyMDAyMCk7CS8qIE9UR19DQVAgKi8KLQlzbGVlcF91c2JbMV0gPSBhdV9yZWFkbCgweGI0MDIwMDI0KTsJLyogT1RHX01VWCAqLwotI2VuZGlmCi0KIAkvKiBDbG9ja3MgYW5kIFBMTHMuICovCiAJc2xlZXBfc3lzX2Nsb2Nrc1swXSA9IGF1X3JlYWRsKFNZU19GUkVRQ1RSTDApOwogCXNsZWVwX3N5c19jbG9ja3NbMV0gPSBhdV9yZWFkbChTWVNfRlJFUUNUUkwxKTsKQEAgLTEyNSwyMiArOTcsNiBAQAogCWF1X3dyaXRlbChzbGVlcF9zeXNfcGluZnVuYywgU1lTX1BJTkZVTkMpOwogCWF1X3N5bmMoKTsKIAotI2lmbmRlZiBDT05GSUdfU09DX0FVMTIwMAotCWF1X3dyaXRlbChzbGVlcF91c2JbMF0sIFVTQl9IT1NUX0NPTkZJRyk7Ci0JYXVfd3JpdGVsKHNsZWVwX3VzYlsxXSwgVVNCRF9FTkFCTEUpOwotCWF1X3N5bmMoKTsKLSNlbHNlCi0JLyogZW5hYmxlIGFjY2VzcyB0byBPVEcgbWVtb3J5ICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFVTQl9NU1JfQkFTRSArIDQpIHwgKDEgPDwgNiksIFVTQl9NU1JfQkFTRSArIDQpOwotCWF1X3N5bmMoKTsKLQotCS8qIHJlc3RvcmUgT1RHIGNhcHMgYW5kIHBvcnQgbXV4LiAqLwotCWF1X3dyaXRlbChzbGVlcF91c2JbMF0sIDB4YjQwMjAwMjAgKyAwKTsJLyogT1RHX0NBUCAqLwotCWF1X3N5bmMoKTsKLQlhdV93cml0ZWwoc2xlZXBfdXNiWzFdLCAweGI0MDIwMDIwICsgNCk7CS8qIE9UR19NVVggKi8KLQlhdV9zeW5jKCk7Ci0jZW5kaWYKLQogCS8qIFJlc3RvcmUgdGhlIHN0YXRpYyBtZW1vcnkgY29udHJvbGxlciBjb25maWd1cmF0aW9uLiAqLwogCWF1X3dyaXRlbChzbGVlcF9zdGF0aWNfbWVtY3RsclswXVswXSwgTUVNX1NUQ0ZHMCk7CiAJYXVfd3JpdGVsKHNsZWVwX3N0YXRpY19tZW1jdGxyWzBdWzFdLCBNRU1fU1RUSU1FMCk7CkBAIC0xNzQsNSArMTMwLDMgQEAKIAogCXJlc3RvcmVfY29yZV9yZWdzKCk7CiB9Ci0KLSNlbmRpZgkvKiBDT05GSUdfUE0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMKaW5kZXggMWI4ODdjOC4uMzdmZmQ5OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMKQEAgLTczLDggKzczLDggQEAKIC8qIFRoaXMgcm91dGluZSBzaG91bGQgYmUgdmFsaWQgZm9yIGFsbCBBdTF4IGJhc2VkIGJvYXJkcyAqLwogcGh5c190IF9fZml4dXBfYmlncGh5c19hZGRyKHBoeXNfdCBwaHlzX2FkZHIsIHBoeXNfdCBzaXplKQogewotCXUzMiBzdGFydCA9ICh1MzIpQXUxNTAwX1BDSV9NRU1fU1RBUlQ7Ci0JdTMyIGVuZCAgID0gKHUzMilBdTE1MDBfUENJX01FTV9FTkQ7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IEFMQ0hFTVlfUENJX01FTVdJTl9TVEFSVDsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IEFMQ0hFTVlfUENJX01FTVdJTl9FTkQ7CiAKIAkvKiBEb24ndCBmaXh1cCAzNi1iaXQgYWRkcmVzc2VzICovCiAJaWYgKChwaHlzX2FkZHIgPj4gMzIpICE9IDApCkBAIC04Miw3ICs4Miw3IEBACiAKIAkvKiBDaGVjayBmb3IgUENJIG1lbW9yeSB3aW5kb3cgKi8KIAlpZiAocGh5c19hZGRyID49IHN0YXJ0ICYmIChwaHlzX2FkZHIgKyBzaXplIC0gMSkgPD0gZW5kKQotCQlyZXR1cm4gKHBoeXNfdCkoKHBoeXNfYWRkciAtIHN0YXJ0KSArIEF1MTUwMF9QQ0lfTUVNX1NUQVJUKTsKKwkJcmV0dXJuIChwaHlzX3QpKEFVMTUwMF9QQ0lfTUVNX1BIWVNfQUREUiArIHBoeXNfYWRkcik7CiAKIAkvKiBkZWZhdWx0IG5vcCAqLwogCXJldHVybiBwaHlzX2FkZHI7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMjAwL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMjAwL3BsYXRmb3JtLmMKaW5kZXggZmJiNTU5My4uYzYxODY3YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTIwMC9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAvcGxhdGZvcm0uYwpAQCAtMjEzLDcgKzIxMywxMiBAQAogCQkuc3RhcnQJPSBEQjEyMDBfSURFX0lOVCwKIAkJLmVuZAk9IERCMTIwMF9JREVfSU5ULAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9CisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfRE1BX1JFUTEsCisJCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX0RNQV9SRVExLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAogc3RhdGljIHU2NCBpZGVfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CkBAIC0zMjgsMjMgKzMzMyw4NSBAQAogCS5icmlnaHRuZXNzX3NldAk9IGRiMTIwMF9tbWNsZWRfc2V0LAogfTsKIAotLyogbmVlZGVkIGJ5IGFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wbGF0Zm9ybS5jICovCi1zdHJ1Y3QgYXUxeG1tY19wbGF0Zm9ybV9kYXRhIGF1MXhtbWNfcGxhdGRhdGFbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXUxeG1tY19wbGF0Zm9ybV9kYXRhIGRiMTIwMG1tY19wbGF0ZGF0YSA9IHsKKwkuY2Rfc2V0dXAJPSBkYjEyMDBfbW1jX2NkX3NldHVwLAorCS5zZXRfcG93ZXIJPSBkYjEyMDBfbW1jX3NldF9wb3dlciwKKwkuY2FyZF9pbnNlcnRlZAk9IGRiMTIwMF9tbWNfY2FyZF9pbnNlcnRlZCwKKwkuY2FyZF9yZWFkb25seQk9IGRiMTIwMF9tbWNfY2FyZF9yZWFkb25seSwKKwkubGVkCQk9ICZkYjEyMDBfbW1jX2xlZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX21tYzBfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuY2Rfc2V0dXAJPSBkYjEyMDBfbW1jX2NkX3NldHVwLAotCQkuc2V0X3Bvd2VyCT0gZGIxMjAwX21tY19zZXRfcG93ZXIsCi0JCS5jYXJkX2luc2VydGVkCT0gZGIxMjAwX21tY19jYXJkX2luc2VydGVkLAotCQkuY2FyZF9yZWFkb25seQk9IGRiMTIwMF9tbWNfY2FyZF9yZWFkb25seSwKLQkJLmxlZAkJPSAmZGIxMjAwX21tY19sZWQsCisJCS5zdGFydAk9IEFVMTEwMF9TRDBfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxMTAwX1NEMF9QSFlTX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9TRF9JTlQsCisJCS5lbmQJPSBBVTEyMDBfU0RfSU5ULAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1RYMCwKKwkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19UWDAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfUlgwLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1JYMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfQorfTsKKworc3RhdGljIHU2NCBhdTF4eHhfbW1jX2RtYW1hc2sgPSAgRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGIxMjAwX21tYzBfZGV2ID0geworCS5uYW1lCQk9ICJhdTF4eHgtbW1jIiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkuZG1hX21hc2sJCT0gJmF1MXh4eF9tbWNfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJmRiMTIwMG1tY19wbGF0ZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTEyMDBfbW1jMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGF1MTIwMF9tbWMwX3Jlc291cmNlcywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MTIwMF9sY2RfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTEyMDBfTENEX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTIwMF9MQ0RfUEhZU19BRERSICsgMHg4MDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMjAwX0xDRF9JTlQsCisJCS5lbmQJPSBBVTEyMDBfTENEX0lOVCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHU2NCBhdTEyMDBfbGNkX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdTEyMDBfbGNkX2RldiA9IHsKKwkubmFtZQkJPSAiYXUxMjAwLWxjZCIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrCQk9ICZhdTEyMDBfbGNkX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXUxMjAwX2xjZF9yZXMpLAorCS5yZXNvdXJjZQk9IGF1MTIwMF9sY2RfcmVzLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX3BzYzBfcmVzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSBQU0MwX1BIWVNfQUREUiwKLQkJLmVuZAk9IFBTQzBfUEhZU19BRERSICsgMHgwMDBmZmZmZiwKKwkJLnN0YXJ0CT0gQVUxNTUwX1BTQzBfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxNTUwX1BTQzBfUEhZU19BRERSICsgMHhmZmYsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtMzUzLDEzICs0MjAsMTMgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAlbMl0gPSB7Ci0JCS5zdGFydAk9IERTQ1JfQ01EMF9QU0MwX1RYLAotCQkuZW5kCT0gRFNDUl9DTUQwX1BTQzBfVFgsCisJCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9UWCwKKwkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9UWCwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCiAJfSwKIAlbM10gPSB7Ci0JCS5zdGFydAk9IERTQ1JfQ01EMF9QU0MwX1JYLAotCQkuZW5kCT0gRFNDUl9DTUQwX1BTQzBfUlgsCisJCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9SWCwKKwkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9SWCwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCiAJfSwKIH07CkBAIC00MDEsOCArNDY4LDggQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTEyMDBfcHNjMV9yZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydAk9IFBTQzFfUEhZU19BRERSLAotCQkuZW5kCT0gUFNDMV9QSFlTX0FERFIgKyAweDAwMGZmZmZmLAorCQkuc3RhcnQJPSBBVTE1NTBfUFNDMV9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTE1NTBfUFNDMV9QSFlTX0FERFIgKyAweGZmZiwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC00MTEsMTcgKzQ3OCwxOCBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCVsyXSA9IHsKLQkJLnN0YXJ0CT0gRFNDUl9DTUQwX1BTQzFfVFgsCi0JCS5lbmQJPSBEU0NSX0NNRDBfUFNDMV9UWCwKKwkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1RYLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1RYLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKIAl9LAogCVszXSA9IHsKLQkJLnN0YXJ0CT0gRFNDUl9DTUQwX1BTQzFfUlgsCi0JCS5lbmQJPSBEU0NSX0NNRDBfUFNDMV9SWCwKKwkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1JYLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1JYLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKIAl9LAogfTsKIAorLyogQUM5NyBvciBJMlMgZGV2aWNlICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjEyMDBfYXVkaW9fZGV2ID0gewogCS8qIG5hbWUgYXNzaWduZWQgbGF0ZXIgYmFzZWQgb24gc3dpdGNoIHNldHRpbmcgKi8KIAkuaWQJCT0gMSwJLyogUFNDIElEICovCkBAIC00MjksMTkgKzQ5NywzNCBAQAogCS5yZXNvdXJjZQk9IGF1MTIwMF9wc2MxX3JlcywKIH07CiAKKy8qIERCMTIwMCBBU29DIGNhcmQgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjEyMDBfc291bmRfZGV2ID0geworCS8qIG5hbWUgYXNzaWduZWQgbGF0ZXIgYmFzZWQgb24gc3dpdGNoIHNldHRpbmcgKi8KKwkuaWQJCT0gMSwJLyogUFNDIElEICovCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjEyMDBfc3RhY19kZXYgPSB7CiAJLm5hbWUJCT0gImFjOTctY29kZWMiLAogCS5pZAkJPSAxLAkvKiBvbiBQU0MxICovCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjEyMDBfYXVkaW9kbWFfZGV2ID0geworCS5uYW1lCQk9ICJhdTF4cHNjLXBjbSIsCisJLmlkCQk9IDEsCS8qIFBTQyBJRCAqLworfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRiMTIwMF9kZXZzW10gX19pbml0ZGF0YSA9IHsKIAlOVUxMLAkJLyogUFNDMCwgc2VsZWN0ZWQgYnkgUzYuOCAqLwogCSZkYjEyMDBfaWRlX2RldiwKKwkmZGIxMjAwX21tYzBfZGV2LAorCSZhdTEyMDBfbGNkX2RldiwKIAkmZGIxMjAwX2V0aF9kZXYsCiAJJmRiMTIwMF9ydGNfZGV2LAogCSZkYjEyMDBfbmFuZF9kZXYsCisJJmRiMTIwMF9hdWRpb2RtYV9kZXYsCiAJJmRiMTIwMF9hdWRpb19kZXYsCiAJJmRiMTIwMF9zdGFjX2RldiwKKwkmZGIxMjAwX3NvdW5kX2RldiwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGRiMTIwMF9kZXZfaW5pdCh2b2lkKQpAQCAtNTAxLDQxICs1ODQsMzkgQEAKIAlpZiAoc3cgPT0gQkNTUl9TV0lUQ0hFU19ESVBfOCkgewogCQliY3NyX21vZChCQ1NSX1JFU0VUUywgMCwgQkNTUl9SRVNFVFNfUFNDMU1VWCk7CiAJCWRiMTIwMF9hdWRpb19kZXYubmFtZSA9ICJhdTF4cHNjX2kycyI7CisJCWRiMTIwMF9zb3VuZF9kZXYubmFtZSA9ICJkYjEyMDAtaTJzIjsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiIFM2LjcgT04gOiBQU0MxIG1vZGUgSTJTXG4iKTsKIAl9IGVsc2UgewogCQliY3NyX21vZChCQ1NSX1JFU0VUUywgQkNTUl9SRVNFVFNfUFNDMU1VWCwgMCk7CiAJCWRiMTIwMF9hdWRpb19kZXYubmFtZSA9ICJhdTF4cHNjX2FjOTciOworCQlkYjEyMDBfc291bmRfZGV2Lm5hbWUgPSAiZGIxMjAwLWFjOTciOwogCQlwcmludGsoS0VSTl9JTkZPICIgUzYuNyBPRkY6IFBTQzEgbW9kZSBBQzk3XG4iKTsKIAl9CiAKIAkvKiBBdWRpbyBQU0MgY2xvY2sgaXMgc3VwcGxpZWQgZXh0ZXJuYWxseS4gKEZJWE1FOiBwbGF0ZGF0YSEhKSAqLwogCV9fcmF3X3dyaXRlbChQU0NfU0VMX0NMS19TRVJDTEssCi0JCSh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoUFNDMV9QSFlTX0FERFIpICsgUFNDX1NFTF9PRkZTRVQpOworCQkodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTU1MF9QU0MxX1BIWVNfQUREUikgKyBQU0NfU0VMX09GRlNFVCk7CiAJd21iKCk7CiAKLQlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoUENNQ0lBX0FUVFJfUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwMDQwMDAwMCAtIDEsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDAwMDEwMDAwIC0gMSwKLQkJCQkgICAgREIxMjAwX1BDMF9JTlQsCi0JCQkJICAgIERCMTIwMF9QQzBfSU5TRVJUX0lOVCwKLQkJCQkgICAgLypEQjEyMDBfUEMwX1NUU0NIR19JTlQqLzAsCi0JCQkJICAgIERCMTIwMF9QQzBfRUpFQ1RfSU5ULAotCQkJCSAgICAwKTsKKwlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwMDAxMDAwMCAtIDEsCisJCURCMTIwMF9QQzBfSU5ULCBEQjEyMDBfUEMwX0lOU0VSVF9JTlQsCisJCS8qREIxMjAwX1BDMF9TVFNDSEdfSU5UKi8wLCBEQjEyMDBfUEMwX0VKRUNUX0lOVCwgMCk7CiAKLQlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDQwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA0NDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDQwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDA0NDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDQwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDA0MDEwMDAwIC0gMSwKLQkJCQkgICAgREIxMjAwX1BDMV9JTlQsCi0JCQkJICAgIERCMTIwMF9QQzFfSU5TRVJUX0lOVCwKLQkJCQkgICAgLypEQjEyMDBfUEMxX1NUU0NIR19JTlQqLzAsCi0JCQkJICAgIERCMTIwMF9QQzFfRUpFQ1RfSU5ULAotCQkJCSAgICAxKTsKKwlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwNDAwMDAwMCwKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA0NDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDA0MDAwMDAwLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDQ0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDQwMDAwMDAsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwNDAxMDAwMCAtIDEsCisJCURCMTIwMF9QQzFfSU5ULCBEQjEyMDBfUEMxX0lOU0VSVF9JTlQsCisJCS8qREIxMjAwX1BDMV9TVFNDSEdfSU5UKi8wLCBEQjEyMDBfUEMxX0VKRUNUX0lOVCwgMSk7CiAKIAlzd2FwcGVkID0gYmNzcl9yZWFkKEJDU1JfU1RBVFVTKSAmIEJDU1JfU1RBVFVTX0RCMTIwMF9TV0FQQk9PVDsKIAlkYjF4X3JlZ2lzdGVyX25vcmZsYXNoKDY0IDw8IDIwLCAyLCBzd2FwcGVkKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4MDAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4MDAvYm9hcmRfc2V0dXAuYwppbmRleCA1Yzk1NmZlLi43Y2QzNmU2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeDAwL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9ib2FyZF9zZXR1cC5jCkBAIC00MCwyNCArNDAsNiBAQAogCiAjaW5jbHVkZSA8cHJvbS5oPgogCi0jaWZkZWYgQ09ORklHX01JUFNfREIxNTAwCi1jaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7Ci0JWzEyXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAxMiAtIEhQVDM3MSAgICovCi0JWzEzXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQSwgQVUxNTAwX1BDSV9JTlRCLCBBVTE1MDBfUENJX0lOVEMsIEFVMTUwMF9QQ0lfSU5URCB9LCAvKiBJRFNFTCAxMyAtIFBDSSBzbG90ICovCi19OwotCi0jZW5kaWYKLQotCi0jaWZkZWYgQ09ORklHX01JUFNfREIxNTUwCi1jaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7Ci0JWzExXSA9IHsgLTEsIEFVMTU1MF9QQ0lfSU5UQywgMHhmZiwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAxMSAtIG9uLWJvYXJkIEhQVDM3MSAqLwotCVsxMl0gPSB7IC0xLCBBVTE1NTBfUENJX0lOVEIsIEFVMTU1MF9QQ0lfSU5UQywgQVUxNTUwX1BDSV9JTlRELCBBVTE1NTBfUENJX0lOVEEgfSwgLyogSURTRUwgMTIgLSBQQ0kgc2xvdCAyIChsZWZ0KSAqLwotCVsxM10gPSB7IC0xLCBBVTE1NTBfUENJX0lOVEEsIEFVMTU1MF9QQ0lfSU5UQiwgQVUxNTUwX1BDSV9JTlRDLCBBVTE1NTBfUENJX0lOVEQgfSwgLyogSURTRUwgMTMgLSBQQ0kgc2xvdCAxIChyaWdodCkgKi8KLX07Ci0jZW5kaWYKLQotCiAjaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKIGNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKIAlbMTFdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCBBVTE1MDBfUENJX0lOVEIsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMTEgLSBtaW5pUENJICAqLwpAQCAtOTEsMTIgKzczLDYgQEAKIAogCiAjaWZkZWYgQ09ORklHX01JUFNfTUlSQUdFCi1jaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7Ci0JWzExXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5URCwgMHhmZiwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAxMSAtIFNNSSBWR1ggKi8KLQlbMTJdID0geyAtMSwgMHhmZiwgMHhmZiwgQVUxNTAwX1BDSV9JTlRDLCAweGZmIH0sIC8qIElEU0VMIDEyIC0gUE5YMTMwMCAqLwotCVsxM10gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEEsIEFVMTUwMF9QQ0lfSU5UQiwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAxMyAtIG1pbmlQQ0kgKi8KLX07Ci0KIHN0YXRpYyB2b2lkIG1pcmFnZV9wb3dlcl9vZmYodm9pZCkKIHsKIAlhbGNoZW15X2dwaW9fZGlyZWN0aW9uX291dHB1dCgyMTAsIDEpOwpAQCAtMTU4LDkgKzEzNCw3IEBACiAJLyogaW5pdGlhbGl6ZSBib2FyZCByZWdpc3RlciBzcGFjZSAqLwogCWJjc3JfaW5pdChiY3NyMSwgYmNzcjIpOwogCi0JLyogTm90IHZhbGlkIGZvciBBdTE1NTAgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19JUkRBKSAmJiBcCi0gICAoZGVmaW5lZChDT05GSUdfU09DX0FVMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTEwMCkpCisjaWYgZGVmaW5lZChDT05GSUdfSVJEQSkgJiYgZGVmaW5lZChDT05GSUdfQVUxMDAwX0ZJUikKIAl7CiAJCXUzMiBwaW5fZnVuYzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9wbGF0Zm9ybS5jCmluZGV4IDk3OGQ1YWIuLjllNmIzZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4MDAvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeDAwL3BsYXRmb3JtLmMKQEAgLTE5LDEyICsxOSwxNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHguaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMF9kbWEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgogI2luY2x1ZGUgIi4uL3BsYXRmb3JtLmgiCiAKK3N0cnVjdCBwY2lfZGV2OworCiAvKiBEQjF4eHggUENNQ0lBIGludGVycnVwdCBzb3VyY2VzOgogICogQ0QwLzEgCUdQSU8wLzMKICAqIFNUU0NIRzAvMQlHUElPMS80CkBAIC04NSwzNCArOTAsMjI3IEBACiAjZW5kaWYKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSQorI2lmZGVmIENPTkZJR19NSVBTX0RCMTUwMAorc3RhdGljIGludCBkYjF4eHhfbWFwX3BjaV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmQsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoKHNsb3QgPCAxMikgfHwgKHNsb3QgPiAxMykgfHwgcGluID09IDApCisJCXJldHVybiAtMTsKKwlpZiAoc2xvdCA9PSAxMikKKwkJcmV0dXJuIChwaW4gPT0gMSkgPyBBVTE1MDBfUENJX0lOVEEgOiAweGZmOworCWlmIChzbG90ID09IDEzKSB7CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQTsKKwkJY2FzZSAyOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRCOworCQljYXNlIDM6IHJldHVybiBBVTE1MDBfUENJX0lOVEM7CisJCWNhc2UgNDogcmV0dXJuIEFVMTUwMF9QQ0lfSU5URDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTU1MAorc3RhdGljIGludCBkYjF4eHhfbWFwX3BjaV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmQsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoKHNsb3QgPCAxMSkgfHwgKHNsb3QgPiAxMykgfHwgcGluID09IDApCisJCXJldHVybiAtMTsKKwlpZiAoc2xvdCA9PSAxMSkKKwkJcmV0dXJuIChwaW4gPT0gMSkgPyBBVTE1NTBfUENJX0lOVEMgOiAweGZmOworCWlmIChzbG90ID09IDEyKSB7CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFVMTU1MF9QQ0lfSU5UQjsKKwkJY2FzZSAyOiByZXR1cm4gQVUxNTUwX1BDSV9JTlRDOworCQljYXNlIDM6IHJldHVybiBBVTE1NTBfUENJX0lOVEQ7CisJCWNhc2UgNDogcmV0dXJuIEFVMTU1MF9QQ0lfSU5UQTsKKwkJfQorCX0KKwlpZiAoc2xvdCA9PSAxMykgeworCQlzd2l0Y2ggKHBpbikgeworCQljYXNlIDE6IHJldHVybiBBVTE1NTBfUENJX0lOVEE7CisJCWNhc2UgMjogcmV0dXJuIEFVMTU1MF9QQ0lfSU5UQjsKKwkJY2FzZSAzOiByZXR1cm4gQVUxNTUwX1BDSV9JTlRDOworCQljYXNlIDQ6IHJldHVybiBBVTE1NTBfUENJX0lOVEQ7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19CT1NQT1JVUworc3RhdGljIGludCBkYjF4eHhfbWFwX3BjaV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmQsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoKHNsb3QgPCAxMSkgfHwgKHNsb3QgPiAxMykgfHwgcGluID09IDApCisJCXJldHVybiAtMTsKKwlpZiAoc2xvdCA9PSAxMikKKwkJcmV0dXJuIChwaW4gPT0gMSkgPyBBVTE1MDBfUENJX0lOVEEgOiAweGZmOworCWlmIChzbG90ID09IDExKSB7CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQTsKKwkJY2FzZSAyOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRCOworCQlkZWZhdWx0OiByZXR1cm4gMHhmZjsKKwkJfQorCX0KKwlpZiAoc2xvdCA9PSAxMykgeworCQlzd2l0Y2ggKHBpbikgeworCQljYXNlIDE6IHJldHVybiBBVTE1MDBfUENJX0lOVEE7CisJCWNhc2UgMjogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQjsKKwkJY2FzZSAzOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRDOworCQljYXNlIDQ6IHJldHVybiBBVTE1MDBfUENJX0lOVEQ7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19NSVJBR0UKK3N0YXRpYyBpbnQgZGIxeHh4X21hcF9wY2lfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkLCB1OCBzbG90LCB1OCBwaW4pCit7CisJaWYgKChzbG90IDwgMTEpIHx8IChzbG90ID4gMTMpIHx8IHBpbiA9PSAwKQorCQlyZXR1cm4gLTE7CisJaWYgKHNsb3QgPT0gMTEpCisJCXJldHVybiAocGluID09IDEpID8gQVUxNTAwX1BDSV9JTlREIDogMHhmZjsKKwlpZiAoc2xvdCA9PSAxMikKKwkJcmV0dXJuIChwaW4gPT0gMykgPyBBVTE1MDBfUENJX0lOVEMgOiAweGZmOworCWlmIChzbG90ID09IDEzKSB7CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQTsKKwkJY2FzZSAyOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRCOworCQlkZWZhdWx0OiByZXR1cm4gMHhmZjsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhbGNoZW15X3BjaV9ob3N0X3Jlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVUxNTAwX1BDSV9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTE1MDBfUENJX1BIWVNfQUREUiArIDB4ZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhbGNoZW15X3BjaV9wbGF0ZGF0YSBkYjF4eHhfcGNpX3BkID0geworCS5ib2FyZF9tYXBfaXJxCT0gZGIxeHh4X21hcF9wY2lfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGIxeHh4X3BjaV9ob3N0X2RldiA9IHsKKwkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmZGIxeHh4X3BjaV9wZCwKKwkubmFtZQkJPSAiYWxjaGVteS1wY2kiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhbGNoZW15X3BjaV9ob3N0X3JlcyksCisJLnJlc291cmNlCT0gYWxjaGVteV9wY2lfaG9zdF9yZXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkYjE1eDBfcGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkYjF4eHhfcGNpX2hvc3RfZGV2KTsKK30KKy8qIG11c3QgYmUgYXJjaF9pbml0Y2FsbDsgTUlQUyBQQ0kgc2NhbnMgYnVzc2VzIGluIGEgc3Vic3lzX2luaXRjYWxsICovCithcmNoX2luaXRjYWxsKGRiMTV4MF9wY2lfaW5pdCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTEwMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTExMDBfbGNkX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMTAwX0xDRF9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTExMDBfTENEX1BIWVNfQUREUiArIDB4ODAwIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFVMTEwMF9MQ0RfSU5ULAorCQkuZW5kCT0gQVUxMTAwX0xDRF9JTlQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyB1NjQgYXUxMTAwX2xjZF9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxMTAwX2xjZF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF1MTEwMC1sY2QiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzawkJPSAmYXUxMTAwX2xjZF9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MTEwMF9sY2RfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBhdTExMDBfbGNkX3Jlc291cmNlcywKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhbGNoZW15X2FjOTdjX3Jlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMDAwX0FDOTdfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxMDAwX0FDOTdfUEhZU19BRERSICsgMHhmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBETUFfSURfQUM5N0NfVFgsCisJCS5lbmQJPSBETUFfSURfQUM5N0NfVFgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBETUFfSURfQUM5N0NfUlgsCisJCS5lbmQJPSBETUFfSURfQUM5N0NfUlgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbGNoZW15X2FjOTdjX2RldiA9IHsKKwkubmFtZQkJPSAiYWxjaGVteS1hYzk3YyIsCisJLmlkCQk9IC0xLAorCS5yZXNvdXJjZQk9IGFsY2hlbXlfYWM5N2NfcmVzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhbGNoZW15X2FjOTdjX3JlcyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbGNoZW15X2FjOTdjX2RtYV9kZXYgPSB7CisJLm5hbWUJCT0gImFsY2hlbXktcGNtLWRtYSIsCisJLmlkCQk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjF4MDBfY29kZWNfZGV2ID0geworCS5uYW1lCQk9ICJhYzk3LWNvZGVjIiwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjF4MDBfYXVkaW9fZGV2ID0geworCS5uYW1lCQk9ICJkYjEwMDAtYXVkaW8iLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgZGIxeHh4X2Rldl9pbml0KHZvaWQpCiB7CiAjaWZkZWYgREIxWFhYX0hBU19QQ01DSUEKLQlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoUENNQ0lBX0FUVFJfUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwMDQwMDAwMCAtIDEsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDAwMDEwMDAwIC0gMSwKLQkJCQkgICAgREIxWFhYX1BDTUNJQV9DQVJEMCwKLQkJCQkgICAgREIxWFhYX1BDTUNJQV9DRDAsCi0JCQkJICAgIC8qREIxWFhYX1BDTUNJQV9TVFNDSEcwKi8wLAotCQkJCSAgICAwLAotCQkJCSAgICAwKTsKKwlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwMDAxMDAwMCAtIDEsCisJCURCMVhYWF9QQ01DSUFfQ0FSRDAsIERCMVhYWF9QQ01DSUFfQ0QwLAorCQkvKkRCMVhYWF9QQ01DSUFfU1RTQ0hHMCovMCwgMCwgMCk7CiAKLQlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDQwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA0NDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDQwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDA0NDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDQwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDA0MDEwMDAwIC0gMSwKLQkJCQkgICAgREIxWFhYX1BDTUNJQV9DQVJEMSwKLQkJCQkgICAgREIxWFhYX1BDTUNJQV9DRDEsCi0JCQkJICAgIC8qREIxWFhYX1BDTUNJQV9TVFNDSEcxKi8wLAotCQkJCSAgICAwLAotCQkJCSAgICAxKTsKKwlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwNDAwMDAwMCwKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA0NDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDA0MDAwMDAwLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDQ0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDQwMDAwMDAsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwNDAxMDAwMCAtIDEsCisJCURCMVhYWF9QQ01DSUFfQ0FSRDEsIERCMVhYWF9QQ01DSUFfQ0QxLAorCQkvKkRCMVhYWF9QQ01DSUFfU1RTQ0hHMSovMCwgMCwgMSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUlQU19EQjExMDAKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF1MTEwMF9sY2RfZGV2aWNlKTsKICNlbmRpZgogCWRiMXhfcmVnaXN0ZXJfbm9yZmxhc2goQk9BUkRfRkxBU0hfU0laRSwgQk9BUkRfRkxBU0hfV0lEVEgsIEZfU1dBUFBFRCk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRiMXgwMF9jb2RlY19kZXYpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYWxjaGVteV9hYzk3Y19kbWFfZGV2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmFsY2hlbXlfYWM5N2NfZGV2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRiMXgwMF9hdWRpb19kZXYpOworCiAJcmV0dXJuIDA7CiB9CiBkZXZpY2VfaW5pdGNhbGwoZGIxeHh4X2Rldl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjExMDAvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjExMDAvcGxhdGZvcm0uYwppbmRleCAyYzhkYzI5Li45YzU3YzAxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMTAwL3BsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTEwMC9wbGF0Zm9ybS5jCkBAIC0xOSwzMSArMTksNTggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2Jjc3IuaD4KIAogI2luY2x1ZGUgIi4uL3BsYXRmb3JtLmgiCiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMTAwX2xjZF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFVMTEwMF9MQ0RfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxMTAwX0xDRF9QSFlTX0FERFIgKyAweDgwMCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVTExMDBfTENEX0lOVCwKKwkJLmVuZAk9IEFVMTEwMF9MQ0RfSU5ULAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgdTY0IGF1MTEwMF9sY2RfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF1MTEwMF9sY2RfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdTExMDAtbGNkIiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkuZG1hX21hc2sJCT0gJmF1MTEwMF9sY2RfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTExMDBfbGNkX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gYXUxMTAwX2xjZF9yZXNvdXJjZXMsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBwYjExMDBfZGV2X2luaXQodm9pZCkKIHsKIAlpbnQgc3dhcHBlZDsKIAogCS8qIFBDTUNJQS4gc2luZ2xlIHNvY2tldCwgaWRlbnRpY2FsIHRvIFBiMTUwMCAqLwotCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldChQQ01DSUFfQVRUUl9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDAwMTAwMDAgLSAxLAotCQkJCSAgICBBVTExMDBfR1BJTzExX0lOVCwJIC8qIGNhcmQgKi8KLQkJCQkgICAgQVUxMTAwX0dQSU85X0lOVCwJIC8qIGluc2VydCAqLwotCQkJCSAgICAvKkFVMTEwMF9HUElPMTBfSU5UKi8wLCAvKiBzdHNjaGcgKi8KLQkJCQkgICAgMCwJCQkgLyogZWplY3QgKi8KLQkJCQkgICAgMCk7CQkJIC8qIGlkICovCisJZGIxeF9yZWdpc3Rlcl9wY21jaWFfc29ja2V0KAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwMDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDAwMTAwMDAgLSAxLAorCQlBVTExMDBfR1BJTzExX0lOVCwgQVUxMTAwX0dQSU85X0lOVCwJIC8qIGNhcmQgLyBpbnNlcnQgKi8KKwkJLypBVTExMDBfR1BJTzEwX0lOVCovMCwgMCwgMCk7IC8qIHN0c2NoZyAvIGVqZWN0IC8gaWQgKi8KIAogCXN3YXBwZWQgPSBiY3NyX3JlYWQoQkNTUl9TVEFUVVMpICYgIEJDU1JfU1RBVFVTX0RCMTAwMF9TV0FQQk9PVDsKIAlkYjF4X3JlZ2lzdGVyX25vcmZsYXNoKDY0ICogMTAyNCAqIDEwMjQsIDQsIHN3YXBwZWQpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXUxMTAwX2xjZF9kZXZpY2UpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMjAwL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMjAwL3BsYXRmb3JtLmMKaW5kZXggM2VmMmRjZS4uNTRmN2Y3YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTIwMC9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjEyMDAvcGxhdGZvcm0uYwpAQCAtMjQsOSArMjQsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHguaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTEwMF9tbWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2Jjc3IuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1wYjF4MDAvcGIxMjAwLmg+CiAKICNpbmNsdWRlICIuLi9wbGF0Zm9ybS5oIgogCkBAIC04OCw3ICs5MCw3IEBACiAJcmV0dXJuIChiY3NyX3JlYWQoQkNTUl9TSUdTVEFUKSAmIEJDU1JfSU5UX1NEMUlOU0VSVCkgPyAxIDogMDsKIH0KIAotY29uc3Qgc3RydWN0IGF1MXhtbWNfcGxhdGZvcm1fZGF0YSBhdTF4bW1jX3BsYXRkYXRhWzJdID0geworc3RhdGljIHN0cnVjdCBhdTF4bW1jX3BsYXRmb3JtX2RhdGEgcGIxMjAwbW1jX3BsYXRkYXRhWzJdID0gewogCVswXSA9IHsKIAkJLnNldF9wb3dlcgk9IHBiMTIwMG1tYzBfc2V0X3Bvd2VyLAogCQkuY2FyZF9pbnNlcnRlZAk9IHBiMTIwMG1tYzBfY2FyZF9pbnNlcnRlZCwKQEAgLTEwNSw2ICsxMDcsNzkgQEAKIAl9LAogfTsKIAorc3RhdGljIHU2NCBhdTF4eHhfbW1jX2RtYW1hc2sgPSAgRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTEyMDBfbW1jMF9yZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFVMTEwMF9TRDBfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxMTAwX1NEMF9QSFlTX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9TRF9JTlQsCisJCS5lbmQJPSBBVTEyMDBfU0RfSU5ULAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1RYMCwKKwkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19UWDAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfUlgwLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1JYMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGIxMjAwX21tYzBfZGV2ID0geworCS5uYW1lCQk9ICJhdTF4eHgtbW1jIiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkuZG1hX21hc2sJCT0gJmF1MXh4eF9tbWNfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnBiMTIwMG1tY19wbGF0ZGF0YVswXSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTEyMDBfbW1jMF9yZXMpLAorCS5yZXNvdXJjZQk9IGF1MTIwMF9tbWMwX3JlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX21tYzFfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTExMDBfU0QxX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTEwMF9TRDFfUEhZU19BRERSICsgMHhmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVTEyMDBfU0RfSU5ULAorCQkuZW5kCT0gQVUxMjAwX1NEX0lOVCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19UWDEsCisJCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfVFgxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorCVszXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1JYMSwKKwkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19SWDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBiMTIwMF9tbWMxX2RldiA9IHsKKwkubmFtZQkJPSAiYXUxeHh4LW1tYyIsCisJLmlkCQk9IDEsCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrCQk9ICZhdTF4eHhfbW1jX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZwYjEyMDBtbWNfcGxhdGRhdGFbMV0sCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXUxMjAwX21tYzFfcmVzKSwKKwkucmVzb3VyY2UJPSBhdTEyMDBfbW1jMV9yZXMsCit9OworCisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaWRlX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gSURFX1BIWVNfQUREUiwKQEAgLTExNSw3ICsxOTAsMTIgQEAKIAkJLnN0YXJ0CT0gSURFX0lOVCwKIAkJLmVuZAk9IElERV9JTlQsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCi0JfQorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX0RNQV9SRVExLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9ETUFfUkVRMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKIHN0YXRpYyB1NjQgaWRlX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwpAQCAtMTYxLDM4ICsyNDEsOTQgQEAKIAkucmVzb3VyY2UJPSBzbWM5MWMxMTFfcmVzb3VyY2VzCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MTIwMF9wc2MwX3Jlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVUxNTUwX1BTQzBfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxNTUwX1BTQzBfUEhZU19BRERSICsgMHhmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVTEyMDBfUFNDMF9JTlQsCisJCS5lbmQJPSBBVTEyMDBfUFNDMF9JTlQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX1BTQzBfVFgsCisJCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX1BTQzBfVFgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX1BTQzBfUlgsCisJCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX1BTQzBfUlgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwYjEyMDBfaTJjX2RldiA9IHsKKwkubmFtZQkJPSAiYXUxeHBzY19zbWJ1cyIsCisJLmlkCQk9IDAsCS8qIGJ1cyBudW1iZXIgKi8KKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXUxMjAwX3BzYzBfcmVzKSwKKwkucmVzb3VyY2UJPSBhdTEyMDBfcHNjMF9yZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MTIwMF9sY2RfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTEyMDBfTENEX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTIwMF9MQ0RfUEhZU19BRERSICsgMHg4MDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMjAwX0xDRF9JTlQsCisJCS5lbmQJPSBBVTEyMDBfTENEX0lOVCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHU2NCBhdTEyMDBfbGNkX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdTEyMDBfbGNkX2RldiA9IHsKKwkubmFtZQkJPSAiYXUxMjAwLWxjZCIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrCQk9ICZhdTEyMDBfbGNkX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXUxMjAwX2xjZF9yZXMpLAorCS5yZXNvdXJjZQk9IGF1MTIwMF9sY2RfcmVzLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmJvYXJkX3BsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZpZGVfZGV2aWNlLAotCSZzbWM5MWMxMTFfZGV2aWNlCisJJnNtYzkxYzExMV9kZXZpY2UsCisJJnBiMTIwMF9pMmNfZGV2LAorCSZwYjEyMDBfbW1jMF9kZXYsCisJJnBiMTIwMF9tbWMxX2RldiwKKwkmYXUxMjAwX2xjZF9kZXYsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBib2FyZF9yZWdpc3Rlcl9kZXZpY2VzKHZvaWQpCiB7CiAJaW50IHN3YXBwZWQ7CiAKLQlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoUENNQ0lBX0FUVFJfUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwMDQwMDAwMCAtIDEsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDAwMDEwMDAwIC0gMSwKLQkJCQkgICAgUEIxMjAwX1BDMF9JTlQsCi0JCQkJICAgIFBCMTIwMF9QQzBfSU5TRVJUX0lOVCwKLQkJCQkgICAgLypQQjEyMDBfUEMwX1NUU0NIR19JTlQqLzAsCi0JCQkJICAgIFBCMTIwMF9QQzBfRUpFQ1RfSU5ULAotCQkJCSAgICAwKTsKKwlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwMDAxMDAwMCAtIDEsCisJCVBCMTIwMF9QQzBfSU5ULCBQQjEyMDBfUEMwX0lOU0VSVF9JTlQsCisJCS8qUEIxMjAwX1BDMF9TVFNDSEdfSU5UKi8wLCBQQjEyMDBfUEMwX0VKRUNUX0lOVCwgMCk7CiAKLQlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDgwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA4NDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDgwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDA4NDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDgwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDA4MDEwMDAwIC0gMSwKLQkJCQkgICAgUEIxMjAwX1BDMV9JTlQsCi0JCQkJICAgIFBCMTIwMF9QQzFfSU5TRVJUX0lOVCwKLQkJCQkgICAgLypQQjEyMDBfUEMxX1NUU0NIR19JTlQqLzAsCi0JCQkJICAgIFBCMTIwMF9QQzFfRUpFQ1RfSU5ULAotCQkJCSAgICAxKTsKKwlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwODAwMDAwMCwKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA4NDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDA4MDAwMDAwLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDg0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDgwMDAwMDAsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwODAxMDAwMCAtIDEsCisJCVBCMTIwMF9QQzFfSU5ULCBQQjEyMDBfUEMxX0lOU0VSVF9JTlQsCisJCS8qUEIxMjAwX1BDMV9TVFNDSEdfSU5UKi8wLCBQQjEyMDBfUEMxX0VKRUNUX0lOVCwgMSk7CiAKIAlzd2FwcGVkID0gYmNzcl9yZWFkKEJDU1JfU1RBVFVTKSAmICBCQ1NSX1NUQVRVU19EQjEyMDBfU1dBUEJPT1Q7CiAJZGIxeF9yZWdpc3Rlcl9ub3JmbGFzaCgxMjggKiAxMDI0ICogMTAyNCwgMiwgc3dhcHBlZCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL2JvYXJkX3NldHVwLmMKaW5kZXggM2I0ZmEzMi4uMzdjMTg4MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTUwMC9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1MDAvYm9hcmRfc2V0dXAuYwpAQCAtMzMsMTMgKzMzLDYgQEAKIAogI2luY2x1ZGUgPHByb20uaD4KIAotCi1jaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7Ci0JWzEyXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiwgMHhmZiB9LCAgIC8qIElEU0VMIDEyIC0gSFBUMzcwCSovCi0JWzEzXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQSwgQVUxNTAwX1BDSV9JTlRCLCBBVTE1MDBfUENJX0lOVEMsIEFVMTUwMF9QQ0lfSU5URCB9LCAgIC8qIElEU0VMIDEzIC0gUENJIHNsb3QgKi8KLX07Ci0KLQogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCiB7CiAJcmV0dXJuICJBbGNoZW15IFBiMTUwMCI7CkBAIC0xMDEsMjAgKzk0LDE4IEBACiAjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKSAqLwogCiAjaWZkZWYgQ09ORklHX1BDSQotCS8qIFNldHVwIFBDSSBidXMgY29udHJvbGxlciAqLwotCWF1X3dyaXRlbCgwLCBBdTE1MDBfUENJX0NNRU0pOwotCWF1X3dyaXRlbCgweDAwMDAzZmZmLCBBdTE1MDBfQ0ZHX0JBU0UpOwotI2lmIGRlZmluZWQoX19NSVBTRUJfXykKLQlhdV93cml0ZWwoMHhmIHwgKDIgPDwgNikgfCAoMSA8PCA0KSwgQXUxNTAwX1BDSV9DRkcpOwotI2Vsc2UKLQlhdV93cml0ZWwoMHhmLCBBdTE1MDBfUENJX0NGRyk7Ci0jZW5kaWYKLQlhdV93cml0ZWwoMHhmMDAwMDAwMCwgQXUxNTAwX1BDSV9NV01BU0tfREVWKTsKLQlhdV93cml0ZWwoMCwgQXUxNTAwX1BDSV9NV0JBU0VfUkVWX0NDTCk7Ci0JYXVfd3JpdGVsKDB4MDJhMDAzNTYsIEF1MTUwMF9QQ0lfU1RBVENNRCk7Ci0JYXVfd3JpdGVsKDB4MDAwMDNjMDQsIEF1MTUwMF9QQ0lfSERSVFlQRSk7Ci0JYXVfd3JpdGVsKDB4MDAwMDAwMDgsIEF1MTUwMF9QQ0lfTUJBUik7Ci0JYXVfc3luYygpOworCXsKKwkJdm9pZCBfX2lvbWVtICpiYXNlID0KKwkJCQkodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTUwMF9QQ0lfUEhZU19BRERSKTsKKwkJLyogU2V0dXAgUENJIGJ1cyBjb250cm9sbGVyICovCisJCV9fcmF3X3dyaXRlbCgweDAwMDAzZmZmLCBiYXNlICsgUENJX1JFR19DTUVNKTsKKwkJX19yYXdfd3JpdGVsKDB4ZjAwMDAwMDAsIGJhc2UgKyBQQ0lfUkVHX01XTUFTS19ERVYpOworCQlfX3Jhd193cml0ZWwoMCwgYmFzZSArIFBDSV9SRUdfTVdCQVNFX1JFVl9DQ0wpOworCQlfX3Jhd193cml0ZWwoMHgwMmEwMDM1NiwgYmFzZSArIFBDSV9SRUdfU1RBVENNRCk7CisJCV9fcmF3X3dyaXRlbCgweDAwMDAzYzA0LCBiYXNlICsgUENJX1JFR19QQVJBTSk7CisJCV9fcmF3X3dyaXRlbCgweDAwMDAwMDA4LCBiYXNlICsgUENJX1JFR19NQkFSKTsKKwkJd21iKCk7CisJfQogI2VuZGlmCiAKIAkvKiBFbmFibGUgc3lzIGJ1cyBjbG9jayBkaXZpZGVyIHdoZW4gSURMRSBzdGF0ZSBvciBubyBidXMgYWN0aXZpdHkuICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL3BsYXRmb3JtLmMKaW5kZXggZDQ0M2JjNy4uMWU1MmEwMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTUwMC9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1MDAvcGxhdGZvcm0uYwpAQCAtMTgsMzIgKzE4LDc3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2Jjc3IuaD4KIAogI2luY2x1ZGUgIi4uL3BsYXRmb3JtLmgiCiAKK3N0YXRpYyBpbnQgcGIxNTAwX21hcF9wY2lfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkLCB1OCBzbG90LCB1OCBwaW4pCit7CisJaWYgKChzbG90IDwgMTIpIHx8IChzbG90ID4gMTMpIHx8IHBpbiA9PSAwKQorCQlyZXR1cm4gLTE7CisJaWYgKHNsb3QgPT0gMTIpCisJCXJldHVybiAocGluID09IDEpID8gQVUxNTAwX1BDSV9JTlRBIDogMHhmZjsKKwlpZiAoc2xvdCA9PSAxMykgeworCQlzd2l0Y2ggKHBpbikgeworCQljYXNlIDE6IHJldHVybiBBVTE1MDBfUENJX0lOVEE7CisJCWNhc2UgMjogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQjsKKwkJY2FzZSAzOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRDOworCQljYXNlIDQ6IHJldHVybiBBVTE1MDBfUENJX0lOVEQ7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFsY2hlbXlfcGNpX2hvc3RfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTE1MDBfUENJX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTUwMF9QQ0lfUEhZU19BRERSICsgMHhmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGFsY2hlbXlfcGNpX3BsYXRkYXRhIHBiMTUwMF9wY2lfcGQgPSB7CisJLmJvYXJkX21hcF9pcnEJPSBwYjE1MDBfbWFwX3BjaV9pcnEsCisJLnBjaV9jZmdfc2V0CT0gUENJX0NPTkZJR19BRU4gfCBQQ0lfQ09ORklHX1IySCB8IFBDSV9DT05GSUdfUjFIIHwKKwkJCSAgUENJX0NPTkZJR19DSCB8CisjaWYgZGVmaW5lZChfX01JUFNFQl9fKQorCQkJICBQQ0lfQ09ORklHX1NJQ19IV0FfREFUIHwgUENJX0NPTkZJR19TTSwKKyNlbHNlCisJCQkgIDAsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBiMTUwMF9wY2lfaG9zdCA9IHsKKwkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmcGIxNTAwX3BjaV9wZCwKKwkubmFtZQkJPSAiYWxjaGVteS1wY2kiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhbGNoZW15X3BjaV9ob3N0X3JlcyksCisJLnJlc291cmNlCT0gYWxjaGVteV9wY2lfaG9zdF9yZXMsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBwYjE1MDBfZGV2X2luaXQodm9pZCkKIHsKIAlpbnQgc3dhcHBlZDsKIAotCS8qIFBDTUNJQS4gc2luZ2xlIHNvY2tldCwgaWRlbnRpY2FsIHRvIFBiMTUwMCAqLwotCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldChQQ01DSUFfQVRUUl9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDAwMTAwMDAgLSAxLAotCQkJCSAgICBBVTE1MDBfR1BJTzExX0lOVCwJIC8qIGNhcmQgKi8KLQkJCQkgICAgQVUxNTAwX0dQSU85X0lOVCwJIC8qIGluc2VydCAqLwotCQkJCSAgICAvKkFVMTUwMF9HUElPMTBfSU5UKi8wLCAvKiBzdHNjaGcgKi8KLQkJCQkgICAgMCwJCQkgLyogZWplY3QgKi8KLQkJCQkgICAgMCk7CQkJIC8qIGlkICovCisJLyogUENNQ0lBLiBzaW5nbGUgc29ja2V0LCBpZGVudGljYWwgdG8gUGIxMTAwICovCisJZGIxeF9yZWdpc3Rlcl9wY21jaWFfc29ja2V0KAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwMDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDAwMTAwMDAgLSAxLAorCQlBVTE1MDBfR1BJTzExX0lOVCwgQVUxNTAwX0dQSU85X0lOVCwJIC8qIGNhcmQgLyBpbnNlcnQgKi8KKwkJLypBVTE1MDBfR1BJTzEwX0lOVCovMCwgMCwgMCk7IC8qIHN0c2NoZyAvIGVqZWN0IC8gaWQgKi8KIAogCXN3YXBwZWQgPSBiY3NyX3JlYWQoQkNTUl9TVEFUVVMpICYgIEJDU1JfU1RBVFVTX0RCMTAwMF9TV0FQQk9PVDsKIAlkYjF4X3JlZ2lzdGVyX25vcmZsYXNoKDY0ICogMTAyNCAqIDEwMjQsIDQsIHN3YXBwZWQpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcGIxNTAwX3BjaV9ob3N0KTsKIAogCXJldHVybiAwOwogfQotZGV2aWNlX2luaXRjYWxsKHBiMTUwMF9kZXZfaW5pdCk7CithcmNoX2luaXRjYWxsKHBiMTUwMF9kZXZfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTUwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTUwL2JvYXJkX3NldHVwLmMKaW5kZXggYjc5MDIxMy4uMGY2MmQxZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTU1MC9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1NTAvYm9hcmRfc2V0dXAuYwpAQCAtMzcsMTIgKzM3LDYgQEAKIAogI2luY2x1ZGUgPHByb20uaD4KIAotCi1jaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7Ci0JWzEyXSA9IHsgLTEsIEFVMTU1MF9QQ0lfSU5UQiwgQVUxNTUwX1BDSV9JTlRDLCBBVTE1NTBfUENJX0lOVEQsIEFVMTU1MF9QQ0lfSU5UQSB9LCAvKiBJRFNFTCAxMiAtIFBDSSBzbG90IDIgKGxlZnQpICAqLwotCVsxM10gPSB7IC0xLCBBVTE1NTBfUENJX0lOVEEsIEFVMTU1MF9QQ0lfSU5UQiwgQVUxNTUwX1BDSV9JTlRDLCBBVTE1NTBfUENJX0lOVEQgfSwgLyogSURTRUwgMTMgLSBQQ0kgc2xvdCAxIChyaWdodCkgKi8KLX07Ci0KIGNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQogewogCXJldHVybiAiQWxjaGVteSBQYjE1NTAiOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTU1MC9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTU1MC9wbGF0Zm9ybS5jCmluZGV4IGQ3MTUwZDAuLmE0NjA0YjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1NTAvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTUwL3BsYXRmb3JtLmMKQEAgLTE4LDE0ICsxOCw4OSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjE1NTAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgogCiAjaW5jbHVkZSAiLi4vcGxhdGZvcm0uaCIKIAorc3RhdGljIGludCBwYjE1NTBfbWFwX3BjaV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmQsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoKHNsb3QgPCAxMikgfHwgKHNsb3QgPiAxMykgfHwgcGluID09IDApCisJCXJldHVybiAtMTsKKwlpZiAoc2xvdCA9PSAxMikgeworCQlzd2l0Y2ggKHBpbikgeworCQljYXNlIDE6IHJldHVybiBBVTE1MDBfUENJX0lOVEI7CisJCWNhc2UgMjogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQzsKKwkJY2FzZSAzOiByZXR1cm4gQVUxNTAwX1BDSV9JTlREOworCQljYXNlIDQ6IHJldHVybiBBVTE1MDBfUENJX0lOVEE7CisJCX0KKwl9CisJaWYgKHNsb3QgPT0gMTMpIHsKKwkJc3dpdGNoIChwaW4pIHsKKwkJY2FzZSAxOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRBOworCQljYXNlIDI6IHJldHVybiBBVTE1MDBfUENJX0lOVEI7CisJCWNhc2UgMzogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQzsKKwkJY2FzZSA0OiByZXR1cm4gQVUxNTAwX1BDSV9JTlREOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhbGNoZW15X3BjaV9ob3N0X3Jlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVUxNTAwX1BDSV9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTE1MDBfUENJX1BIWVNfQUREUiArIDB4ZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhbGNoZW15X3BjaV9wbGF0ZGF0YSBwYjE1NTBfcGNpX3BkID0geworCS5ib2FyZF9tYXBfaXJxCT0gcGIxNTUwX21hcF9wY2lfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGIxNTUwX3BjaV9ob3N0ID0geworCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZwYjE1NTBfcGNpX3BkLAorCS5uYW1lCQk9ICJhbGNoZW15LXBjaSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGFsY2hlbXlfcGNpX2hvc3RfcmVzKSwKKwkucmVzb3VyY2UJPSBhbGNoZW15X3BjaV9ob3N0X3JlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxNTUwX3BzYzJfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTE1NTBfUFNDMl9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTE1NTBfUFNDMl9QSFlTX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFVMTU1MF9QU0MyX0lOVCwKKwkJLmVuZAk9IEFVMTU1MF9QU0MyX0lOVCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IEFVMTU1MF9EU0NSX0NNRDBfUFNDMl9UWCwKKwkJLmVuZAk9IEFVMTU1MF9EU0NSX0NNRDBfUFNDMl9UWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwlbM10gPSB7CisJCS5zdGFydAk9IEFVMTU1MF9EU0NSX0NNRDBfUFNDMl9SWCwKKwkJLmVuZAk9IEFVMTU1MF9EU0NSX0NNRDBfUFNDMl9SWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBiMTU1MF9pMmNfZGV2ID0geworCS5uYW1lCQk9ICJhdTF4cHNjX3NtYnVzIiwKKwkuaWQJCT0gMCwJLyogYnVzIG51bWJlciAqLworCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTE1NTBfcHNjMl9yZXMpLAorCS5yZXNvdXJjZQk9IGF1MTU1MF9wc2MyX3JlcywKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHBiMTU1MF9kZXZfaW5pdCh2b2lkKQogewogCWludCBzd2FwcGVkOwpAQCAtMzcsMzMgKzExMiwyOSBAQAogCSogZHJpdmVycyBhcmUgdXNlZCB0byBzaGFyZWQgaXJxcyBhbmQgYikgc3RhdHVzY2hhbmdlIGlzbid0IHJlYWxseSB1c2UtCiAJKiBmdWwgYW55d2F5LgogCSovCi0JZGIxeF9yZWdpc3Rlcl9wY21jaWFfc29ja2V0KFBDTUNJQV9BVFRSX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDA0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwMDAxMDAwMCAtIDEsCi0JCQkJICAgIEFVMTU1MF9HUElPMjAxXzIwNV9JTlQsCi0JCQkJICAgIEFVMTU1MF9HUElPMF9JTlQsCi0JCQkJICAgIDAsCi0JCQkJICAgIDAsCi0JCQkJICAgIDApOworCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldCgKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDA0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDAwMDEwMDAwIC0gMSwKKwkJQVUxNTUwX0dQSU8yMDFfMjA1X0lOVCwgQVUxNTUwX0dQSU8wX0lOVCwgMCwgMCwgMCk7CiAKLQlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDgwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA4NDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDgwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDA4NDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDgwMDAwMDAsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDA4MDEwMDAwIC0gMSwKLQkJCQkgICAgQVUxNTUwX0dQSU8yMDFfMjA1X0lOVCwKLQkJCQkgICAgQVUxNTUwX0dQSU8xX0lOVCwKLQkJCQkgICAgMCwKLQkJCQkgICAgMCwKLQkJCQkgICAgMSk7CisJZGIxeF9yZWdpc3Rlcl9wY21jaWFfc29ja2V0KAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDgwMDAwMDAsCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwODQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwODAwMDAwMCwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDA4NDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDA4MDAwMDAwLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDgwMTAwMDAgLSAxLAorCQlBVTE1NTBfR1BJTzIwMV8yMDVfSU5ULCBBVTE1NTBfR1BJTzFfSU5ULCAwLCAwLCAxKTsKIAogCXN3YXBwZWQgPSBiY3NyX3JlYWQoQkNTUl9TVEFUVVMpICYgQkNTUl9TVEFUVVNfUEIxNTUwX1NXQVBCT09UOwogCWRiMXhfcmVnaXN0ZXJfbm9yZmxhc2goMTI4ICogMTAyNCAqIDEwMjQsIDQsIHN3YXBwZWQpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcGIxNTUwX3BjaV9ob3N0KTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBiMTU1MF9pMmNfZGV2KTsKIAogCXJldHVybiAwOwogfQotZGV2aWNlX2luaXRjYWxsKHBiMTU1MF9kZXZfaW5pdCk7CithcmNoX2luaXRjYWxsKHBiMTU1MF9kZXZfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9ncHIvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9ib2FyZF9zZXR1cC5jCmluZGV4IDVmOGYwNjkuLmRlYTQ1YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2dwci9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9ib2FyZF9zZXR1cC5jCkBAIC0zNiwxMCArMzYsNiBAQAogCiAjaW5jbHVkZSA8cHJvbS5oPgogCi1jaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7Ci0JWzBdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCBBVTE1MDBfUENJX0lOVEIsIDB4ZmYsIDB4ZmYgfSwKLX07Ci0KIHN0YXRpYyB2b2lkIGdwcl9yZXNldChjaGFyICpjKQogewogCS8qIHN3aXRjaCBTeXN0ZW0tTEVEIHRvIG9yYW5nZSAocmVkIyBhbmQgZ3JlZW4jIG9uKSAqLwpAQCAtNzYsMTIgKzcyLDQgQEAKIAogCS8qIFRha2UgYXdheSBSZXNldCBvZiBVTVRTLWNhcmQgKi8KIAlhbGNoZW15X2dwaW9fZGlyZWN0aW9uX291dHB1dCgyMTUsIDEpOwotCi0jaWZkZWYgQ09ORklHX1BDSQotI2lmIGRlZmluZWQoX19NSVBTRUJfXykKLQlhdV93cml0ZWwoMHhmIHwgKDIgPDwgNikgfCAoMSA8PCA0KSwgQXUxNTAwX1BDSV9DRkcpOwotI2Vsc2UKLQlhdV93cml0ZWwoMHhmLCBBdTE1MDBfUENJX0NGRyk7Ci0jZW5kaWYKLSNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9ncHIvcGxhdGZvcm0uYwppbmRleCAxNGI0NjYyLi45ODJjZTg1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9ncHIvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9ncHIvcGxhdGZvcm0uYwpAQCAtMTY3LDYgKzE2Nyw0NSBAQAogCX0KIH07CiAKKworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFsY2hlbXlfcGNpX2hvc3RfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTE1MDBfUENJX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTUwMF9QQ0lfUEhZU19BRERSICsgMHhmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgaW50IGdwcl9tYXBfcGNpX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZCwgdTggc2xvdCwgdTggcGluKQoreworCWlmICgoc2xvdCA9PSAwKSAmJiAocGluID09IDEpKQorCQlyZXR1cm4gQVUxNTUwX1BDSV9JTlRBOworCWVsc2UgaWYgKChzbG90ID09IDApICYmIChwaW4gPT0gMikpCisJCXJldHVybiBBVTE1NTBfUENJX0lOVEI7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWxjaGVteV9wY2lfcGxhdGRhdGEgZ3ByX3BjaV9wZCA9IHsKKwkuYm9hcmRfbWFwX2lycQk9IGdwcl9tYXBfcGNpX2lycSwKKwkucGNpX2NmZ19zZXQJPSBQQ0lfQ09ORklHX0FFTiB8IFBDSV9DT05GSUdfUjJIIHwgUENJX0NPTkZJR19SMUggfAorCQkJICBQQ0lfQ09ORklHX0NIIHwKKyNpZiBkZWZpbmVkKF9fTUlQU0VCX18pCisJCQkgIFBDSV9DT05GSUdfU0lDX0hXQV9EQVQgfCBQQ0lfQ09ORklHX1NNLAorI2Vsc2UKKwkJCSAgMCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZ3ByX3BjaV9ob3N0X2RldiA9IHsKKwkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmZ3ByX3BjaV9wZCwKKwkubmFtZQkJPSAiYWxjaGVteS1wY2kiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhbGNoZW15X3BjaV9ob3N0X3JlcyksCisJLnJlc291cmNlCT0gYWxjaGVteV9wY2lfaG9zdF9yZXMsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZ3ByX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZncHJfd2R0X2RldmljZSwKIAkmZ3ByX210ZF9kZXZpY2UsCkBAIC0xNzQsNiArMjEzLDE0IEBACiAJJmdwcl9sZWRfZGV2aWNlcywKIH07CiAKK3N0YXRpYyBpbnQgX19pbml0IGdwcl9wY2lfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmdwcl9wY2lfaG9zdF9kZXYpOworfQorLyogbXVzdCBiZSBhcmNoX2luaXRjYWxsOyBNSVBTIFBDSSBzY2FucyBidXNzZXMgaW4gYSBzdWJzeXNfaW5pdGNhbGwgKi8KK2FyY2hfaW5pdGNhbGwoZ3ByX3BjaV9pbml0KTsKKworCiBzdGF0aWMgaW50IF9faW5pdCBncHJfZGV2X2luaXQodm9pZCkKIHsKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBncHJfaTJjX2luZm8sIEFSUkFZX1NJWkUoZ3ByX2kyY19pbmZvKSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvYm9hcmRfc2V0dXAuYwppbmRleCAzYWU5ODRjLi44NTFhNWFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMKQEAgLTM4LDIwICszOCw2IEBACiAKICNpbmNsdWRlIDxwcm9tLmg+CiAKLWNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKLQlbMF0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEEsIEFVMTUwMF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwMCAtIEFkYXB0ZXJBLVNsb3QwICh0b3ApICovCi0JWzFdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRCLCBBVTE1MDBfUENJX0lOVEEsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDEgLSBBZGFwdGVyQS1TbG90MSAoYm90dG9tKSAqLwotCVsyXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQywgQVUxNTAwX1BDSV9JTlRELCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDAyIC0gQWRhcHRlckItU2xvdDAgKHRvcCkgKi8KLQlbM10gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEQsIEFVMTUwMF9QQ0lfSU5UQywgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwMyAtIEFkYXB0ZXJCLVNsb3QxIChib3R0b20pICovCi0JWzRdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCBBVTE1MDBfUENJX0lOVEIsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDQgLSBBZGFwdGVyQy1TbG90MCAodG9wKSAqLwotCVs1XSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQiwgQVUxNTAwX1BDSV9JTlRBLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDA1IC0gQWRhcHRlckMtU2xvdDEgKGJvdHRvbSkgKi8KLQlbNl0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEMsIEFVMTUwMF9QQ0lfSU5URCwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwNiAtIEFkYXB0ZXJELVNsb3QwICh0b3ApICovCi0JWzddID0geyAtMSwgQVUxNTAwX1BDSV9JTlRELCBBVTE1MDBfUENJX0lOVEMsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDcgLSBBZGFwdGVyRC1TbG90MSAoYm90dG9tKSAqLwotfTsKLQotZXh0ZXJuIGludCAoKmJvYXJkX3BjaV9pZHNlbCkodW5zaWduZWQgaW50IGRldnNlbCwgaW50IGFzc2VydCk7Ci1pbnQgbXR4MV9wY2lfaWRzZWwodW5zaWduZWQgaW50IGRldnNlbCwgaW50IGFzc2VydCk7Ci0KIHN0YXRpYyB2b2lkIG10eDFfcmVzZXQoY2hhciAqYykKIHsKIAkvKiBKdW1wIHRvIHRoZSByZXNldCB2ZWN0b3IgKi8KQEAgLTc0LDE1ICs2MCw2IEBACiAJYWxjaGVteV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoMjA0LCAwKTsKICNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpICovCiAKLSNpZmRlZiBDT05GSUdfUENJCi0jaWYgZGVmaW5lZChfX01JUFNFQl9fKQotCWF1X3dyaXRlbCgweGYgfCAoMiA8PCA2KSB8ICgxIDw8IDQpLCBBdTE1MDBfUENJX0NGRyk7Ci0jZWxzZQotCWF1X3dyaXRlbCgweGYsIEF1MTUwMF9QQ0lfQ0ZHKTsKLSNlbmRpZgotCWJvYXJkX3BjaV9pZHNlbCA9IG10eDFfcGNpX2lkc2VsOwotI2VuZGlmCi0KIAkvKiBJbml0aWFsaXplIHN5c19waW5mdW5jICovCiAJYXVfd3JpdGVsKFNZU19QRl9OSTIsIFNZU19QSU5GVU5DKTsKIApAQCAtMTA0LDIzICs4MSw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiNEcgU3lzdGVtcyBNVFgtMSBCb2FyZFxuIik7CiB9CiAKLWludAotbXR4MV9wY2lfaWRzZWwodW5zaWduZWQgaW50IGRldnNlbCwgaW50IGFzc2VydCkKLXsKLQkvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgYSBwcm9wcmlldGFyeSBDYXJkYnVzCi0JICogYWRhcHRlciBvbiB0aGUgbXR4LTEgInNpbmdsZWJvYXJkIiB2YXJpYW50LiBJdCB0cmlnZ2VycyBhIGN1c3RvbQotCSAqIGxvZ2ljIGNoaXAgY29ubmVjdGVkIHRvIEVYVF9JTzMgKEdQSU8xKSB0byBzdXBwcmVzcyBJRFNFTCBzaWduYWxzLgotCSAqLwotCWlmIChhc3NlcnQgJiYgZGV2c2VsICE9IDApCi0JCS8qIFN1cHByZXNzIHNpZ25hbCB0byBDYXJkYnVzICovCi0JCWFsY2hlbXlfZ3Bpb19zZXRfdmFsdWUoMSwgMCk7CS8qIHNldCBFWFRfSU8zIE9GRiAqLwotCWVsc2UKLQkJYWxjaGVteV9ncGlvX3NldF92YWx1ZSgxLCAxKTsJLyogc2V0IEVYVF9JTzMgT04gKi8KLQotCXVkZWxheSgxKTsKLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgbXR4MV9pbml0X2lycSh2b2lkKQogewogCWlycV9zZXRfaXJxX3R5cGUoQVUxNTAwX0dQSU8yMDRfSU5ULCBJUlFGX1RSSUdHRVJfSElHSCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvcGxhdGZvcm0uYwppbmRleCA1NTYyOGUzLi5jYzQ3YjY4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL3BsYXRmb3JtLmMKQEAgLTEzNSw3ICsxMzUsNjkgQEAKIAkucmVzb3VyY2UJPSAmbXR4MV9tdGRfcmVzb3VyY2UsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFsY2hlbXlfcGNpX2hvc3RfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTE1MDBfUENJX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTUwMF9QQ0lfUEhZU19BRERSICsgMHhmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgaW50IG10eDFfcGNpX2lkc2VsKHVuc2lnbmVkIGludCBkZXZzZWwsIGludCBhc3NlcnQpCit7CisJLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG5lY2Vzc2FyeSB0byBzdXBwb3J0IGEgcHJvcHJpZXRhcnkgQ2FyZGJ1cworCSAqIGFkYXB0ZXIgb24gdGhlIG10eC0xICJzaW5nbGVib2FyZCIgdmFyaWFudC4gSXQgdHJpZ2dlcnMgYSBjdXN0b20KKwkgKiBsb2dpYyBjaGlwIGNvbm5lY3RlZCB0byBFWFRfSU8zIChHUElPMSkgdG8gc3VwcHJlc3MgSURTRUwgc2lnbmFscy4KKwkgKi8KKwlpZiAoYXNzZXJ0ICYmIGRldnNlbCAhPSAwKQorCQkvKiBTdXBwcmVzcyBzaWduYWwgdG8gQ2FyZGJ1cyAqLworCQlhbGNoZW15X2dwaW9fc2V0X3ZhbHVlKDEsIDApOwkvKiBzZXQgRVhUX0lPMyBPRkYgKi8KKwllbHNlCisJCWFsY2hlbXlfZ3Bpb19zZXRfdmFsdWUoMSwgMSk7CS8qIHNldCBFWFRfSU8zIE9OICovCisKKwl1ZGVsYXkoMSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIG10eDFfaXJxdGFiW11bNV0gPSB7CisJWzBdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCBBVTE1MDBfUENJX0lOVEEsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDAgLSBBZGFwdGVyQS1TbG90MCAodG9wKSAqLworCVsxXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQiwgQVUxNTAwX1BDSV9JTlRBLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDAxIC0gQWRhcHRlckEtU2xvdDEgKGJvdHRvbSkgKi8KKwlbMl0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEMsIEFVMTUwMF9QQ0lfSU5URCwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwMiAtIEFkYXB0ZXJCLVNsb3QwICh0b3ApICovCisJWzNdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRELCBBVTE1MDBfUENJX0lOVEMsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDMgLSBBZGFwdGVyQi1TbG90MSAoYm90dG9tKSAqLworCVs0XSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQSwgQVUxNTAwX1BDSV9JTlRCLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDA0IC0gQWRhcHRlckMtU2xvdDAgKHRvcCkgKi8KKwlbNV0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEIsIEFVMTUwMF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwNSAtIEFkYXB0ZXJDLVNsb3QxIChib3R0b20pICovCisJWzZdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRDLCBBVTE1MDBfUENJX0lOVEQsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDYgLSBBZGFwdGVyRC1TbG90MCAodG9wKSAqLworCVs3XSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5URCwgQVUxNTAwX1BDSV9JTlRDLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDA3IC0gQWRhcHRlckQtU2xvdDEgKGJvdHRvbSkgKi8KK307CisKK3N0YXRpYyBpbnQgbXR4MV9tYXBfcGNpX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZCwgdTggc2xvdCwgdTggcGluKQoreworCXJldHVybiBtdHgxX2lycXRhYltzbG90XVtwaW5dOworfQorCitzdGF0aWMgc3RydWN0IGFsY2hlbXlfcGNpX3BsYXRkYXRhIG10eDFfcGNpX3BkID0geworCS5ib2FyZF9tYXBfaXJxCSA9IG10eDFfbWFwX3BjaV9pcnEsCisJLmJvYXJkX3BjaV9pZHNlbCA9IG10eDFfcGNpX2lkc2VsLAorCS5wY2lfY2ZnX3NldAkgPSBQQ0lfQ09ORklHX0FFTiB8IFBDSV9DT05GSUdfUjJIIHwgUENJX0NPTkZJR19SMUggfAorCQkJICAgUENJX0NPTkZJR19DSCB8CisjaWYgZGVmaW5lZChfX01JUFNFQl9fKQorCQkJICAgUENJX0NPTkZJR19TSUNfSFdBX0RBVCB8IFBDSV9DT05GSUdfU00sCisjZWxzZQorCQkJICAgMCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXR4MV9wY2lfaG9zdCA9IHsKKwkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmbXR4MV9wY2lfcGQsCisJLm5hbWUJCT0gImFsY2hlbXktcGNpIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYWxjaGVteV9wY2lfaG9zdF9yZXMpLAorCS5yZXNvdXJjZQk9IGFsY2hlbXlfcGNpX2hvc3RfcmVzLAorfTsKKworCiBzdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgcGxhdGZvcm1fZGV2aWNlICogbXR4MV9kZXZzW10gPSB7CisJJm10eDFfcGNpX2hvc3QsCiAJJm10eDFfZ3Bpb19sZWRzLAogCSZtdHgxX3dkdCwKIAkmbXR4MV9idXR0b24sCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2JvYXJkX3NldHVwLmMKaW5kZXggODFlNTdmYS4uM2ZhODNmNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvYm9hcmRfc2V0dXAuYwpAQCAtNzAsMTQgKzcwLDYgQEAKIAkvKiBFbmFibGUgRFRSIChNQ1IgYml0IDApID0gVVNCIHBvd2VyIHVwICovCiAJX19yYXdfd3JpdGVsKDEsICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX1VBUlQzX1BIWVNfQUREUiArIDB4MTgpKTsKIAl3bWIoKTsKLQotI2lmZGVmIENPTkZJR19QQ0kKLSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pCi0JYXVfd3JpdGVsKDB4ZiB8ICgyIDw8IDYpIHwgKDEgPDwgNCksIEF1MTUwMF9QQ0lfQ0ZHKTsKLSNlbHNlCi0JYXVfd3JpdGVsKDB4ZiwgQXUxNTAwX1BDSV9DRkcpOwotI2VuZGlmCi0jZW5kaWYKIH0KIAogc3RhdGljIGludCBfX2luaXQgeHhzMTUwMF9pbml0X2lycSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9wbGF0Zm9ybS5jCmluZGV4IGU4N2M0NWMuLjA2YTNhNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL3BsYXRmb3JtLmMKQEAgLTI3LDIwICsyNywyMCBAQAogCXsKIAkJLm5hbWUJPSAicGNtY2lhLWlvIiwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JCS5zdGFydAk9IFBDTUNJQV9JT19QSFlTX0FERFIsCi0JCS5lbmQJPSBQQ01DSUFfSU9fUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAorCQkuc3RhcnQJPSBBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAogCX0sCiAJewogCQkubmFtZQk9ICJwY21jaWEtYXR0ciIsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCQkuc3RhcnQJPSBQQ01DSUFfQVRUUl9QSFlTX0FERFIsCi0JCS5lbmQJPSBQQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCisJCS5zdGFydAk9IEFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAogCX0sCiAJewogCQkubmFtZQk9ICJwY21jaWEtbWVtIiwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JCS5zdGFydAk9IFBDTUNJQV9NRU1fUEhZU19BRERSLAotCQkuZW5kCT0gUENNQ0lBX01FTV9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCisJCS5zdGFydAk9IEFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvZ3Bpby5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvZ3Bpby5jCmluZGV4IDU3YjQyNWYuLjVlYmRmNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L2dwaW8uYworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9ncGlvLmMKQEAgLTYsNiArNiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXVyZWxpZW4gSmFybm8gPGF1cmVsaWVuQGF1cmVsMzIubmV0PgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9kcml2ZXJfY2hpcGNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfZHJpdmVyX2V4dGlmLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2V0dXAuYwppbmRleCAxN2MzZDE0Li4xY2ZkZGEwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMKQEAgLTI2LDYgKzI2LDcgQEAKICAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9lbWJlZGRlZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3NyYy1vY3Rlb24uYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2NzcmMtb2N0ZW9uLmMKaW5kZXggMjlkNTZhZi4uY2U2NDgzYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3NyYy1vY3Rlb24uYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jc3JjLW9jdGVvbi5jCkBAIC03LDYgKzcsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIENhdml1bSBOZXR3b3JrcywgSW5jLgogICovCiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2RtYS1vY3Rlb24uYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2RtYS1vY3Rlb24uYwppbmRleCAxYWJiNjZjLi5lYTRmZWJhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9kbWEtb2N0ZW9uLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZG1hLW9jdGVvbi5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zd2lvdGxiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9mbGFzaF9zZXR1cC5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZmxhc2hfc2V0dXAuYwppbmRleCAwZWUwMmY1Li45NzVjMjAzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9mbGFzaF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2ZsYXNoX3NldHVwLmMKQEAgLTgsNiArOCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQ2F2aXVtIE5ldHdvcmtzCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAppbmRleCA0MGJiOWZkLi42OTQ2OGRlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTExNCw0ICsxMTQsMjggQEAKIGV4dGVybiB2b2lkICprbWFwX2NvaGVyZW50KHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGFkZHIpOwogZXh0ZXJuIHZvaWQga3VubWFwX2NvaGVyZW50KHZvaWQpOwogCisjZGVmaW5lIEFSQ0hfSEFTX0ZMVVNIX0tFUk5FTF9EQ0FDSEVfUEFHRQorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2tlcm5lbF9kY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlCVUdfT04oY3B1X2hhc19kY19hbGlhc2VzICYmIFBhZ2VIaWdoTWVtKHBhZ2UpKTsKK30KKworLyoKKyAqIEZvciBub3cgZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UgYW5kIGludmFsaWRhdGVfa2VybmVsX3ZtYXBfcmFuZ2UgYm90aCBkbyBhCisgKiBjYWNoZSB3cml0ZWJhY2sgYW5kIGludmFsaWRhdGUgb3BlcmF0aW9uLgorICovCitleHRlcm4gdm9pZCAoKl9fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UpKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBzaXplKTsKKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2tlcm5lbF92bWFwX3JhbmdlKHZvaWQgKnZhZGRyLCBpbnQgc2l6ZSkKK3sKKwlpZiAoY3B1X2hhc19kY19hbGlhc2VzKQorCQlfX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlKCh1bnNpZ25lZCBsb25nKSB2YWRkciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlX2tlcm5lbF92bWFwX3JhbmdlKHZvaWQgKnZhZGRyLCBpbnQgc2l6ZSkKK3sKKwlpZiAoY3B1X2hhc19kY19hbGlhc2VzKQorCQlfX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlKCh1bnNpZ25lZCBsb25nKSB2YWRkciwgc2l6ZSk7Cit9CisKICNlbmRpZiAvKiBfQVNNX0NBQ0hFRkxVU0hfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NvbXBhdC5oCmluZGV4IGRiYzUxMDYuLmI3N2RmMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jb21wYXQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY29tcGF0LmgKQEAgLTExMSw3ICsxMTEsOCBAQAogCWludAkJZl9iYXZhaWw7CiAJY29tcGF0X2ZzaWRfdAlmX2ZzaWQ7CiAJaW50CQlmX25hbWVsZW47Ci0JaW50CQlmX3NwYXJlWzZdOworCWludAkJZl9mbGFnczsKKwlpbnQJCWZfc3BhcmVbNV07CiB9OwogCiAjZGVmaW5lIENPTVBBVF9STElNX0lORklOSVRZCTB4N2ZmZmZmZmZVTApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oCmluZGV4IDVmOTVhNGIuLjJmN2Y0MTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmgKQEAgLTEzNSw2ICsxMzUsOSBAQAogI2RlZmluZSBQUklEX0lNUF9DQVZJVU1fQ041MFhYIDB4MDYwMAogI2RlZmluZSBQUklEX0lNUF9DQVZJVU1fQ041MlhYIDB4MDcwMAogI2RlZmluZSBQUklEX0lNUF9DQVZJVU1fQ042M1hYIDB4OTAwMAorI2RlZmluZSBQUklEX0lNUF9DQVZJVU1fQ042OFhYIDB4OTEwMAorI2RlZmluZSBQUklEX0lNUF9DQVZJVU1fQ042NlhYIDB4OTIwMAorI2RlZmluZSBQUklEX0lNUF9DQVZJVU1fQ042MVhYIDB4OTMwMAogCiAvKgogICogVGhlc2UgYXJlIHRoZSBQUklEJ3MgZm9yIHdoZW4gMjM6MTYgPT0gUFJJRF9DT01QX0lOR0VOSUMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggYjA0ZTRkZS4uYTU4ZjIyOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lvLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTMyOSwxNCArMzI5LDEwIEBACiAJCQkiZHNybDMyCSVMMCwgJUwwLCAwIgkJCSJcblx0IglcCiAJCQkiZHNsbDMyCSVNMCwgJU0wLCAwIgkJCSJcblx0IglcCiAJCQkib3IJJUwwLCAlTDAsICVNMCIJCQkiXG5cdCIJXAotCQkJIi5zZXQJcHVzaCIJCQkJIlxuXHQiCVwKLQkJCSIuc2V0CW5vcmVvcmRlciIJCQkiXG5cdCIJXAotCQkJIi5zZXQJbm9tYWNybyIJCQkiXG5cdCIJXAogCQkJInNkCSVMMCwgJTIiCQkJIlxuXHQiCVwKLQkJCSIuc2V0CXBvcCIJCQkJIlxuXHQiCVwKIAkJCSIuc2V0CW1pcHMwIgkJCQkiXG4iCVwKIAkJCTogIj1yIiAoX190bXApCQkJCQlcCi0JCQk6ICIwIiAoX192YWwpLCAiUiIgKCpfX21lbSkpOwkJCVwKKwkJCTogIjAiIChfX3ZhbCksICJtIiAoKl9fbWVtKSk7CQkJXAogCQlpZiAoaXJxKQkJCQkJCVwKIAkJCWxvY2FsX2lycV9yZXN0b3JlKF9fZmxhZ3MpOwkJCVwKIAl9IGVsc2UJCQkJCQkJCVwKQEAgLTM1OSwxNiArMzU1LDEyIEBACiAJCQlsb2NhbF9pcnFfc2F2ZShfX2ZsYWdzKTsJCQlcCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAogCQkJIi5zZXQJbWlwczMiCQkiXHRcdCMgX19yZWFkcSIJIlxuXHQiCVwKLQkJCSIuc2V0CXB1c2giCQkJCSJcblx0IglcCi0JCQkiLnNldAlub3Jlb3JkZXIiCQkJIlxuXHQiCVwKLQkJCSIuc2V0CW5vbWFjcm8iCQkJIlxuXHQiCVwKIAkJCSJsZAklTDAsICUxIgkJCSJcblx0IglcCi0JCQkiLnNldAlwb3AiCQkJCSJcblx0IglcCiAJCQkiZHNyYTMyCSVNMCwgJUwwLCAwIgkJCSJcblx0IglcCiAJCQkic2xsCSVMMCwgJUwwLCAwIgkJCSJcblx0IglcCiAJCQkiLnNldAltaXBzMCIJCQkJIlxuIglcCiAJCQk6ICI9ciIgKF9fdmFsKQkJCQkJXAotCQkJOiAiUiIgKCpfX21lbSkpOwkJCQlcCisJCQk6ICJtIiAoKl9fbWVtKSk7CQkJCVwKIAkJaWYgKGlycSkJCQkJCQlcCiAJCQlsb2NhbF9pcnFfcmVzdG9yZShfX2ZsYWdzKTsJCQlcCiAJfSBlbHNlIHsJCQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oCmluZGV4IGYyNjBlYmUuLmRlMjRlYzU3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oCkBAIC0yNDUsNiArMjQ1LDIzIEBACiB2b2lkIGFsY2hlbXlfc2xlZXBfYXUxNTUwKHZvaWQpOwogdm9pZCBhdV9zbGVlcCh2b2lkKTsKIAorLyogVVNCOiBkcml2ZXJzL3VzYi9ob3N0L2FsY2hlbXktY29tbW9uLmMgKi8KK2VudW0gYWxjaGVteV91c2JfYmxvY2sgeworCUFMQ0hFTVlfVVNCX09IQ0kwLAorCUFMQ0hFTVlfVVNCX1VEQzAsCisJQUxDSEVNWV9VU0JfRUhDSTAsCisJQUxDSEVNWV9VU0JfT1RHMCwKK307CitpbnQgYWxjaGVteV91c2JfY29udHJvbChpbnQgYmxvY2ssIGludCBlbmFibGUpOworCisvKiBQQ0kgY29udHJvbGxlciBwbGF0Zm9ybSBkYXRhICovCitzdHJ1Y3QgYWxjaGVteV9wY2lfcGxhdGRhdGEgeworCWludCAoKmJvYXJkX21hcF9pcnEpKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkLCB1OCBzbG90LCB1OCBwaW4pOworCWludCAoKmJvYXJkX3BjaV9pZHNlbCkodW5zaWduZWQgaW50IGRldnNlbCwgaW50IGFzc2VydCk7CisJLyogYml0cyB0byBzZXQvY2xlYXIgaW4gUENJX0NPTkZJRyByZWdpc3RlciAqLworCXVuc2lnbmVkIGxvbmcgcGNpX2NmZ19zZXQ7CisJdW5zaWduZWQgbG9uZyBwY2lfY2ZnX2NscjsKK307CiAKIC8qIFNPQyBJbnRlcnJ1cHQgbnVtYmVycyAqLwogCkBAIC01NzUsMzggKzU5Miw5NSBAQAogI2VuZGlmIC8qICFkZWZpbmVkIChfTEFOR1VBR0VfQVNTRU1CTFkpICovCiAKIC8qCi0gKiBTRFJBTSByZWdpc3RlciBvZmZzZXRzCisgKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3NlcyBmb3IgaW50ZWdyYXRlZCBwZXJpcGhlcmFscworICogMC4uYXUxMDAwIDEuLmF1MTUwMCAyLi5hdTExMDAgMy4uYXUxNTUwIDQuLmF1MTIwMAogICovCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NPQ19BVTExMDApCi0jZGVmaW5lIE1FTV9TRE1PREUwCQkweDAwMDAKLSNkZWZpbmUgTUVNX1NETU9ERTEJCTB4MDAwNAotI2RlZmluZSBNRU1fU0RNT0RFMgkJMHgwMDA4Ci0jZGVmaW5lIE1FTV9TREFERFIwCQkweDAwMEMKLSNkZWZpbmUgTUVNX1NEQUREUjEJCTB4MDAxMAotI2RlZmluZSBNRU1fU0RBRERSMgkJMHgwMDE0Ci0jZGVmaW5lIE1FTV9TRFJFRkNGRwkJMHgwMDE4Ci0jZGVmaW5lIE1FTV9TRFBSRUNNRAkJMHgwMDFDCi0jZGVmaW5lIE1FTV9TREFVVE9SRUYJCTB4MDAyMAotI2RlZmluZSBNRU1fU0RXUk1EMAkJMHgwMDI0Ci0jZGVmaW5lIE1FTV9TRFdSTUQxCQkweDAwMjgKLSNkZWZpbmUgTUVNX1NEV1JNRDIJCTB4MDAyQwotI2RlZmluZSBNRU1fU0RTTEVFUAkJMHgwMDMwCi0jZGVmaW5lIE1FTV9TRFNNQ0tFCQkweDAwMzQKIAotLyoKLSAqIE1FTV9TRE1PREUgcmVnaXN0ZXIgY29udGVudCBkZWZpbml0aW9ucwotICovCisjZGVmaW5lIEFVMTAwMF9BQzk3X1BIWVNfQUREUgkJMHgxMDAwMDAwMCAvKiAwMTIgKi8KKyNkZWZpbmUgQVUxMDAwX1VTQl9PSENJX1BIWVNfQUREUgkweDEwMTAwMDAwIC8qIDAxMiAqLworI2RlZmluZSBBVTEwMDBfVVNCX1VEQ19QSFlTX0FERFIJMHgxMDIwMDAwMCAvKiAwMTIzICovCisjZGVmaW5lIEFVMTAwMF9JUkRBX1BIWVNfQUREUgkJMHgxMDMwMDAwMCAvKiAwMiAqLworI2RlZmluZSBBVTEyMDBfQUVTX1BIWVNfQUREUgkJMHgxMDMwMDAwMCAvKiA0ICovCisjZGVmaW5lIEFVMTAwMF9JQzBfUEhZU19BRERSCQkweDEwNDAwMDAwIC8qIDAxMjM0ICovCisjZGVmaW5lIEFVMTAwMF9NQUMwX1BIWVNfQUREUgkJMHgxMDUwMDAwMCAvKiAwMjMgKi8KKyNkZWZpbmUgQVUxMDAwX01BQzFfUEhZU19BRERSCQkweDEwNTEwMDAwIC8qIDAyMyAqLworI2RlZmluZSBBVTEwMDBfTUFDRU5fUEhZU19BRERSCQkweDEwNTIwMDAwIC8qIDAyMyAqLworI2RlZmluZSBBVTExMDBfU0QwX1BIWVNfQUREUgkJMHgxMDYwMDAwMCAvKiAyNCAqLworI2RlZmluZSBBVTExMDBfU0QxX1BIWVNfQUREUgkJMHgxMDY4MDAwMCAvKiAyNCAqLworI2RlZmluZSBBVTE1NTBfUFNDMl9QSFlTX0FERFIJCTB4MTBBMDAwMDAgLyogMyAqLworI2RlZmluZSBBVTE1NTBfUFNDM19QSFlTX0FERFIJCTB4MTBCMDAwMDAgLyogMyAqLworI2RlZmluZSBBVTEwMDBfSTJTX1BIWVNfQUREUgkJMHgxMTAwMDAwMCAvKiAwMiAqLworI2RlZmluZSBBVTE1MDBfTUFDMF9QSFlTX0FERFIJCTB4MTE1MDAwMDAgLyogMSAqLworI2RlZmluZSBBVTE1MDBfTUFDMV9QSFlTX0FERFIJCTB4MTE1MTAwMDAgLyogMSAqLworI2RlZmluZSBBVTE1MDBfTUFDRU5fUEhZU19BRERSCQkweDExNTIwMDAwIC8qIDEgKi8KKyNkZWZpbmUgQVUxMDAwX1VBUlQwX1BIWVNfQUREUgkJMHgxMTEwMDAwMCAvKiAwMTIzNCAqLworI2RlZmluZSBBVTEyMDBfU1dDTlRfUEhZU19BRERSCQkweDExMTAwMTBDIC8qIDQgKi8KKyNkZWZpbmUgQVUxMDAwX1VBUlQxX1BIWVNfQUREUgkJMHgxMTIwMDAwMCAvKiAwMjM0ICovCisjZGVmaW5lIEFVMTAwMF9VQVJUMl9QSFlTX0FERFIJCTB4MTEzMDAwMDAgLyogMCAqLworI2RlZmluZSBBVTEwMDBfVUFSVDNfUEhZU19BRERSCQkweDExNDAwMDAwIC8qIDAxMjMgKi8KKyNkZWZpbmUgQVUxMDAwX1NTSTBfUEhZU19BRERSCQkweDExNjAwMDAwIC8qIDAyICovCisjZGVmaW5lIEFVMTAwMF9TU0kxX1BIWVNfQUREUgkJMHgxMTY4MDAwMCAvKiAwMiAqLworI2RlZmluZSBBVTE1MDBfR1BJTzJfUEhZU19BRERSCQkweDExNzAwMDAwIC8qIDEyMzQgKi8KKyNkZWZpbmUgQVUxMDAwX0lDMV9QSFlTX0FERFIJCTB4MTE4MDAwMDAgLyogMDEyMzQgKi8KKyNkZWZpbmUgQVUxMDAwX1NZU19QSFlTX0FERFIJCTB4MTE5MDAwMDAgLyogMDEyMzQgKi8KKyNkZWZpbmUgQVUxNTUwX1BTQzBfUEhZU19BRERSCQkweDExQTAwMDAwIC8qIDM0ICovCisjZGVmaW5lIEFVMTU1MF9QU0MxX1BIWVNfQUREUgkJMHgxMUIwMDAwMCAvKiAzNCAqLworI2RlZmluZSBBVTEwMDBfTUVNX1BIWVNfQUREUgkJMHgxNDAwMDAwMCAvKiAwMTIzNCAqLworI2RlZmluZSBBVTEwMDBfU1RBVElDX01FTV9QSFlTX0FERFIJMHgxNDAwMTAwMCAvKiAwMTIzNCAqLworI2RlZmluZSBBVTEwMDBfRE1BX1BIWVNfQUREUgkJMHgxNDAwMjAwMCAvKiAwMTIgKi8KKyNkZWZpbmUgQVUxNTUwX0RCRE1BX1BIWVNfQUREUgkJMHgxNDAwMjAwMCAvKiAzNCAqLworI2RlZmluZSBBVTE1NTBfREJETUFfQ09ORl9QSFlTX0FERFIJMHgxNDAwMzAwMCAvKiAzNCAqLworI2RlZmluZSBBVTEwMDBfTUFDRE1BMF9QSFlTX0FERFIJMHgxNDAwNDAwMCAvKiAwMTIzICovCisjZGVmaW5lIEFVMTAwMF9NQUNETUExX1BIWVNfQUREUgkweDE0MDA0MjAwIC8qIDAxMjMgKi8KKyNkZWZpbmUgQVUxMjAwX0NJTV9QSFlTX0FERFIJCTB4MTQwMDQwMDAgLyogNCAqLworI2RlZmluZSBBVTE1MDBfUENJX1BIWVNfQUREUgkJMHgxNDAwNTAwMCAvKiAxMyAqLworI2RlZmluZSBBVTE1NTBfUEVfUEhZU19BRERSCQkweDE0MDA4MDAwIC8qIDMgKi8KKyNkZWZpbmUgQVUxMjAwX01BRUJFX1BIWVNfQUREUgkJMHgxNDAxMDAwMCAvKiA0ICovCisjZGVmaW5lIEFVMTIwMF9NQUVGRV9QSFlTX0FERFIJCTB4MTQwMTIwMDAgLyogNCAqLworI2RlZmluZSBBVTE1NTBfVVNCX09IQ0lfUEhZU19BRERSCTB4MTQwMjAwMDAgLyogMyAqLworI2RlZmluZSBBVTEyMDBfVVNCX0NUTF9QSFlTX0FERFIJMHgxNDAyMDAwMCAvKiA0ICovCisjZGVmaW5lIEFVMTIwMF9VU0JfT1RHX1BIWVNfQUREUgkweDE0MDIwMDIwIC8qIDQgKi8KKyNkZWZpbmUgQVUxMjAwX1VTQl9PSENJX1BIWVNfQUREUgkweDE0MDIwMTAwIC8qIDQgKi8KKyNkZWZpbmUgQVUxMjAwX1VTQl9FSENJX1BIWVNfQUREUgkweDE0MDIwMjAwIC8qIDQgKi8KKyNkZWZpbmUgQVUxMjAwX1VTQl9VRENfUEhZU19BRERSCTB4MTQwMjIwMDAgLyogNCAqLworI2RlZmluZSBBVTExMDBfTENEX1BIWVNfQUREUgkJMHgxNTAwMDAwMCAvKiAyICovCisjZGVmaW5lIEFVMTIwMF9MQ0RfUEhZU19BRERSCQkweDE1MDAwMDAwIC8qIDQgKi8KKyNkZWZpbmUgQVUxNTAwX1BDSV9NRU1fUEhZU19BRERSCTB4NDAwMDAwMDAwVUxMIC8qIDEzICovCisjZGVmaW5lIEFVMTUwMF9QQ0lfSU9fUEhZU19BRERSCQkweDUwMDAwMDAwMFVMTCAvKiAxMyAqLworI2RlZmluZSBBVTE1MDBfUENJX0NPTkZJRzBfUEhZU19BRERSCTB4NjAwMDAwMDAwVUxMIC8qIDEzICovCisjZGVmaW5lIEFVMTUwMF9QQ0lfQ09ORklHMV9QSFlTX0FERFIJMHg2ODAwMDAwMDBVTEwgLyogMTMgKi8KKyNkZWZpbmUgQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIJMHhGMDAwMDAwMDBVTEwgLyogMDEyMzQgKi8KKyNkZWZpbmUgQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUgkweEY0MDAwMDAwMFVMTCAvKiAwMTIzNCAqLworI2RlZmluZSBBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIJMHhGODAwMDAwMDBVTEwgLyogMDEyMzQgKi8KKworCisvKiBBdTEwMDAgU0RSQU0gbWVtb3J5IGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBBVTEwMDBfTUVNX1NETU9ERTAJCTB4MDAwMAorI2RlZmluZSBBVTEwMDBfTUVNX1NETU9ERTEJCTB4MDAwNAorI2RlZmluZSBBVTEwMDBfTUVNX1NETU9ERTIJCTB4MDAwOAorI2RlZmluZSBBVTEwMDBfTUVNX1NEQUREUjAJCTB4MDAwQworI2RlZmluZSBBVTEwMDBfTUVNX1NEQUREUjEJCTB4MDAxMAorI2RlZmluZSBBVTEwMDBfTUVNX1NEQUREUjIJCTB4MDAxNAorI2RlZmluZSBBVTEwMDBfTUVNX1NEUkVGQ0ZHCQkweDAwMTgKKyNkZWZpbmUgQVUxMDAwX01FTV9TRFBSRUNNRAkJMHgwMDFDCisjZGVmaW5lIEFVMTAwMF9NRU1fU0RBVVRPUkVGCQkweDAwMjAKKyNkZWZpbmUgQVUxMDAwX01FTV9TRFdSTUQwCQkweDAwMjQKKyNkZWZpbmUgQVUxMDAwX01FTV9TRFdSTUQxCQkweDAwMjgKKyNkZWZpbmUgQVUxMDAwX01FTV9TRFdSTUQyCQkweDAwMkMKKyNkZWZpbmUgQVUxMDAwX01FTV9TRFNMRUVQCQkweDAwMzAKKyNkZWZpbmUgQVUxMDAwX01FTV9TRFNNQ0tFCQkweDAwMzQKKworLyogTUVNX1NETU9ERSByZWdpc3RlciBjb250ZW50IGRlZmluaXRpb25zICovCiAjZGVmaW5lIE1FTV9TRE1PREVfRgkJKDEgPDwgMjIpCiAjZGVmaW5lIE1FTV9TRE1PREVfU1IJCSgxIDw8IDIxKQogI2RlZmluZSBNRU1fU0RNT0RFX0JTCQkoMSA8PCAyMCkKICNkZWZpbmUgTUVNX1NETU9ERV9SUwkJKDMgPDwgMTgpCiAjZGVmaW5lIE1FTV9TRE1PREVfQ1MJCSg3IDw8IDE1KQotI2RlZmluZSBNRU1fU0RNT0RFX1RSQVMgCSgxNSA8PCAxMSkKLSNkZWZpbmUgTUVNX1NETU9ERV9UTVJEIAkoMyA8PCA5KQorI2RlZmluZSBNRU1fU0RNT0RFX1RSQVMJCSgxNSA8PCAxMSkKKyNkZWZpbmUgTUVNX1NETU9ERV9UTVJECQkoMyA8PCA5KQogI2RlZmluZSBNRU1fU0RNT0RFX1RXUgkJKDMgPDwgNykKICNkZWZpbmUgTUVNX1NETU9ERV9UUlAJCSgzIDw8IDUpCi0jZGVmaW5lIE1FTV9TRE1PREVfVFJDRCAJKDMgPDwgMykKKyNkZWZpbmUgTUVNX1NETU9ERV9UUkNECQkoMyA8PCAzKQogI2RlZmluZSBNRU1fU0RNT0RFX1RDTAkJKDcgPDwgMCkKIAogI2RlZmluZSBNRU1fU0RNT0RFX0JTXzJCYW5rCSgwIDw8IDIwKQpAQCAtNjI4LDE3MyArNzAyLDQzIEBACiAjZGVmaW5lIE1FTV9TRE1PREVfVFJDRF9OKE4pCSgoTikgPDwgMykKICNkZWZpbmUgTUVNX1NETU9ERV9UQ0xfTihOKQkoKE4pIDw8IDApCiAKLS8qCi0gKiBNRU1fU0RBRERSIHJlZ2lzdGVyIGNvbnRlbnRzIGRlZmluaXRpb25zCi0gKi8KKy8qIE1FTV9TREFERFIgcmVnaXN0ZXIgY29udGVudHMgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgTUVNX1NEQUREUl9FCQkoMSA8PCAyMCkKLSNkZWZpbmUgTUVNX1NEQUREUl9DU0JBIAkoMHgwM0ZGIDw8IDEwKQorI2RlZmluZSBNRU1fU0RBRERSX0NTQkEJCSgweDAzRkYgPDwgMTApCiAjZGVmaW5lIE1FTV9TREFERFJfQ1NNQVNLCSgweDAzRkYgPDwgMCkKICNkZWZpbmUgTUVNX1NEQUREUl9DU0JBX04oTikJKChOKSAmICgweDAzRkYgPDwgMjIpID4+IDEyKQogI2RlZmluZSBNRU1fU0RBRERSX0NTTUFTS19OKE4pCSgoTikmKDB4MDNGRiA8PCAyMikgPj4gMjIpCiAKLS8qCi0gKiBNRU1fU0RSRUZDRkcgcmVnaXN0ZXIgY29udGVudCBkZWZpbml0aW9ucwotICovCisvKiBNRU1fU0RSRUZDRkcgcmVnaXN0ZXIgY29udGVudCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBNRU1fU0RSRUZDRkdfVFJDCSgxNSA8PCAyOCkKICNkZWZpbmUgTUVNX1NEUkVGQ0ZHX1RSUE0JKDMgPDwgMjYpCiAjZGVmaW5lIE1FTV9TRFJFRkNGR19FCQkoMSA8PCAyNSkKLSNkZWZpbmUgTUVNX1NEUkVGQ0ZHX1JFIAkoMHgxZmZmZmZmIDw8IDApCisjZGVmaW5lIE1FTV9TRFJFRkNGR19SRQkJKDB4MWZmZmZmZiA8PCAwKQogI2RlZmluZSBNRU1fU0RSRUZDRkdfVFJDX04oTikJKChOKSA8PCBNRU1fU0RSRUZDRkdfVFJDKQogI2RlZmluZSBNRU1fU0RSRUZDRkdfVFJQTV9OKE4pCSgoTikgPDwgTUVNX1NEUkVGQ0ZHX1RSUE0pCiAjZGVmaW5lIE1FTV9TRFJFRkNGR19SRUZfTihOKQkoTikKLSNlbmRpZgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBBdTE1NTAgU0RSQU0gUmVnaXN0ZXIgT2Zmc2V0cwotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19BVTEyMDApCi0jZGVmaW5lIE1FTV9TRE1PREUwCQkweDA4MDAKLSNkZWZpbmUgTUVNX1NETU9ERTEJCTB4MDgwOAotI2RlZmluZSBNRU1fU0RNT0RFMgkJMHgwODEwCi0jZGVmaW5lIE1FTV9TREFERFIwCQkweDA4MjAKLSNkZWZpbmUgTUVNX1NEQUREUjEJCTB4MDgyOAotI2RlZmluZSBNRU1fU0RBRERSMgkJMHgwODMwCi0jZGVmaW5lIE1FTV9TRENPTkZJR0EJCTB4MDg0MAotI2RlZmluZSBNRU1fU0RDT05GSUdCCQkweDA4NDgKLSNkZWZpbmUgTUVNX1NEU1RBVAkJMHgwODUwCi0jZGVmaW5lIE1FTV9TREVSUkFERFIJCTB4MDg1OAotI2RlZmluZSBNRU1fU0RTVFJJREUwCQkweDA4NjAKLSNkZWZpbmUgTUVNX1NEU1RSSURFMQkJMHgwODY4Ci0jZGVmaW5lIE1FTV9TRFNUUklERTIJCTB4MDg3MAotI2RlZmluZSBNRU1fU0RXUk1EMAkJMHgwODgwCi0jZGVmaW5lIE1FTV9TRFdSTUQxCQkweDA4ODgKLSNkZWZpbmUgTUVNX1NEV1JNRDIJCTB4MDg5MAotI2RlZmluZSBNRU1fU0RQUkVDTUQJCTB4MDhDMAotI2RlZmluZSBNRU1fU0RBVVRPUkVGCQkweDA4QzgKLSNkZWZpbmUgTUVNX1NEU1JFRgkJMHgwOEQwCi0jZGVmaW5lIE1FTV9TRFNMRUVQCQlNRU1fU0RTUkVGCi0KLSNlbmRpZgotCi0vKgotICogUGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMgZm9yIGludGVncmF0ZWQgcGVyaXBoZXJhbHMKLSAqIDAuLmF1MTAwMCAxLi5hdTE1MDAgMi4uYXUxMTAwIDMuLmF1MTU1MCA0Li5hdTEyMDAKLSAqLwotCi0jZGVmaW5lIEFVMTAwMF9BQzk3X1BIWVNfQUREUgkJMHgxMDAwMDAwMCAvKiAwMTIgKi8KLSNkZWZpbmUgQVUxMDAwX1VTQkRfUEhZU19BRERSCQkweDEwMjAwMDAwIC8qIDAxMjMgKi8KLSNkZWZpbmUgQVUxMDAwX0lDMF9QSFlTX0FERFIJCTB4MTA0MDAwMDAgLyogMDEyMzQgKi8KLSNkZWZpbmUgQVUxMDAwX01BQzBfUEhZU19BRERSCQkweDEwNTAwMDAwIC8qIDAyMyAqLwotI2RlZmluZSBBVTEwMDBfTUFDMV9QSFlTX0FERFIJCTB4MTA1MTAwMDAgLyogMDIzICovCi0jZGVmaW5lIEFVMTAwMF9NQUNFTl9QSFlTX0FERFIJCTB4MTA1MjAwMDAgLyogMDIzICovCi0jZGVmaW5lIEFVMTEwMF9TRDBfUEhZU19BRERSCQkweDEwNjAwMDAwIC8qIDI0ICovCi0jZGVmaW5lIEFVMTEwMF9TRDFfUEhZU19BRERSCQkweDEwNjgwMDAwIC8qIDI0ICovCi0jZGVmaW5lIEFVMTAwMF9JMlNfUEhZU19BRERSCQkweDExMDAwMDAwIC8qIDAyICovCi0jZGVmaW5lIEFVMTUwMF9NQUMwX1BIWVNfQUREUgkJMHgxMTUwMDAwMCAvKiAxICovCi0jZGVmaW5lIEFVMTUwMF9NQUMxX1BIWVNfQUREUgkJMHgxMTUxMDAwMCAvKiAxICovCi0jZGVmaW5lIEFVMTUwMF9NQUNFTl9QSFlTX0FERFIJCTB4MTE1MjAwMDAgLyogMSAqLwotI2RlZmluZSBBVTEwMDBfVUFSVDBfUEhZU19BRERSCQkweDExMTAwMDAwIC8qIDAxMjM0ICovCi0jZGVmaW5lIEFVMTAwMF9VQVJUMV9QSFlTX0FERFIJCTB4MTEyMDAwMDAgLyogMDIzNCAqLwotI2RlZmluZSBBVTEwMDBfVUFSVDJfUEhZU19BRERSCQkweDExMzAwMDAwIC8qIDAgKi8KLSNkZWZpbmUgQVUxMDAwX1VBUlQzX1BIWVNfQUREUgkJMHgxMTQwMDAwMCAvKiAwMTIzICovCi0jZGVmaW5lIEFVMTUwMF9HUElPMl9QSFlTX0FERFIJCTB4MTE3MDAwMDAgLyogMTIzNCAqLwotI2RlZmluZSBBVTEwMDBfSUMxX1BIWVNfQUREUgkJMHgxMTgwMDAwMCAvKiAwMTIzNCAqLwotI2RlZmluZSBBVTEwMDBfU1lTX1BIWVNfQUREUgkJMHgxMTkwMDAwMCAvKiAwMTIzNCAqLwotI2RlZmluZSBBVTEwMDBfRE1BX1BIWVNfQUREUgkJMHgxNDAwMjAwMCAvKiAwMTIgKi8KLSNkZWZpbmUgQVUxNTUwX0RCRE1BX1BIWVNfQUREUgkJMHgxNDAwMjAwMCAvKiAzNCAqLwotI2RlZmluZSBBVTE1NTBfREJETUFfQ09ORl9QSFlTX0FERFIJMHgxNDAwMzAwMCAvKiAzNCAqLwotI2RlZmluZSBBVTEwMDBfTUFDRE1BMF9QSFlTX0FERFIJMHgxNDAwNDAwMCAvKiAwMTIzICovCi0jZGVmaW5lIEFVMTAwMF9NQUNETUExX1BIWVNfQUREUgkweDE0MDA0MjAwIC8qIDAxMjMgKi8KLQotCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEwMDAKLSNkZWZpbmUJTUVNX1BIWVNfQUREUgkJMHgxNDAwMDAwMAotI2RlZmluZQlTVEFUSUNfTUVNX1BIWVNfQUREUgkweDE0MDAxMDAwCi0jZGVmaW5lCVVTQkhfUEhZU19BRERSCQkweDEwMTAwMDAwCi0jZGVmaW5lCUlSREFfUEhZU19BRERSCQkweDEwMzAwMDAwCi0jZGVmaW5lCVNTSTBfUEhZU19BRERSCQkweDExNjAwMDAwCi0jZGVmaW5lCVNTSTFfUEhZU19BRERSCQkweDExNjgwMDAwCi0jZGVmaW5lIFBDTUNJQV9JT19QSFlTX0FERFIJMHhGMDAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX0FUVFJfUEhZU19BRERSCTB4RjQwMDAwMDAwVUxMCi0jZGVmaW5lIFBDTUNJQV9NRU1fUEhZU19BRERSCTB4RjgwMDAwMDAwVUxMCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgQ09ORklHX1NPQ19BVTE1MDAKLSNkZWZpbmUJTUVNX1BIWVNfQUREUgkJMHgxNDAwMDAwMAotI2RlZmluZQlTVEFUSUNfTUVNX1BIWVNfQUREUgkweDE0MDAxMDAwCi0jZGVmaW5lCVVTQkhfUEhZU19BRERSCQkweDEwMTAwMDAwCi0jZGVmaW5lIFBDSV9QSFlTX0FERFIJCTB4MTQwMDUwMDAKLSNkZWZpbmUgUENJX01FTV9QSFlTX0FERFIJMHg0MDAwMDAwMDBVTEwKLSNkZWZpbmUgUENJX0lPX1BIWVNfQUREUgkweDUwMDAwMDAwMFVMTAotI2RlZmluZSBQQ0lfQ09ORklHMF9QSFlTX0FERFIJMHg2MDAwMDAwMDBVTEwKLSNkZWZpbmUgUENJX0NPTkZJRzFfUEhZU19BRERSCTB4NjgwMDAwMDAwVUxMCi0jZGVmaW5lIFBDTUNJQV9JT19QSFlTX0FERFIJMHhGMDAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX0FUVFJfUEhZU19BRERSCTB4RjQwMDAwMDAwVUxMCi0jZGVmaW5lIFBDTUNJQV9NRU1fUEhZU19BRERSCTB4RjgwMDAwMDAwVUxMCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgQ09ORklHX1NPQ19BVTExMDAKLSNkZWZpbmUJTUVNX1BIWVNfQUREUgkJMHgxNDAwMDAwMAotI2RlZmluZQlTVEFUSUNfTUVNX1BIWVNfQUREUgkweDE0MDAxMDAwCi0jZGVmaW5lCVVTQkhfUEhZU19BRERSCQkweDEwMTAwMDAwCi0jZGVmaW5lCUlSREFfUEhZU19BRERSCQkweDEwMzAwMDAwCi0jZGVmaW5lCVNTSTBfUEhZU19BRERSCQkweDExNjAwMDAwCi0jZGVmaW5lCVNTSTFfUEhZU19BRERSCQkweDExNjgwMDAwCi0jZGVmaW5lIExDRF9QSFlTX0FERFIJCTB4MTUwMDAwMDAKLSNkZWZpbmUgUENNQ0lBX0lPX1BIWVNfQUREUgkweEYwMDAwMDAwMFVMTAotI2RlZmluZSBQQ01DSUFfQVRUUl9QSFlTX0FERFIJMHhGNDAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX01FTV9QSFlTX0FERFIJMHhGODAwMDAwMDBVTEwKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBDT05GSUdfU09DX0FVMTU1MAotI2RlZmluZQlNRU1fUEhZU19BRERSCQkweDE0MDAwMDAwCi0jZGVmaW5lCVNUQVRJQ19NRU1fUEhZU19BRERSCTB4MTQwMDEwMDAKLSNkZWZpbmUJVVNCSF9QSFlTX0FERFIJCTB4MTQwMjAwMDAKLSNkZWZpbmUgUENJX1BIWVNfQUREUgkJMHgxNDAwNTAwMAotI2RlZmluZSBQRV9QSFlTX0FERFIJCTB4MTQwMDgwMDAKLSNkZWZpbmUgUFNDMF9QSFlTX0FERFIJCTB4MTFBMDAwMDAKLSNkZWZpbmUgUFNDMV9QSFlTX0FERFIJCTB4MTFCMDAwMDAKLSNkZWZpbmUgUFNDMl9QSFlTX0FERFIJCTB4MTBBMDAwMDAKLSNkZWZpbmUgUFNDM19QSFlTX0FERFIJCTB4MTBCMDAwMDAKLSNkZWZpbmUgUENJX01FTV9QSFlTX0FERFIJMHg0MDAwMDAwMDBVTEwKLSNkZWZpbmUgUENJX0lPX1BIWVNfQUREUgkweDUwMDAwMDAwMFVMTAotI2RlZmluZSBQQ0lfQ09ORklHMF9QSFlTX0FERFIJMHg2MDAwMDAwMDBVTEwKLSNkZWZpbmUgUENJX0NPTkZJRzFfUEhZU19BRERSCTB4NjgwMDAwMDAwVUxMCi0jZGVmaW5lIFBDTUNJQV9JT19QSFlTX0FERFIJMHhGMDAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX0FUVFJfUEhZU19BRERSCTB4RjQwMDAwMDAwVUxMCi0jZGVmaW5lIFBDTUNJQV9NRU1fUEhZU19BRERSCTB4RjgwMDAwMDAwVUxMCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLSNkZWZpbmUJTUVNX1BIWVNfQUREUgkJMHgxNDAwMDAwMAotI2RlZmluZQlTVEFUSUNfTUVNX1BIWVNfQUREUgkweDE0MDAxMDAwCi0jZGVmaW5lIEFFU19QSFlTX0FERFIJCTB4MTAzMDAwMDAKLSNkZWZpbmUgQ0lNX1BIWVNfQUREUgkJMHgxNDAwNDAwMAotI2RlZmluZSBVU0JNX1BIWVNfQUREUgkJMHgxNDAyMDAwMAotI2RlZmluZQlVU0JIX1BIWVNfQUREUgkJMHgxNDAyMDEwMAotI2RlZmluZSBQU0MwX1BIWVNfQUREUgkgCTB4MTFBMDAwMDAKLSNkZWZpbmUgUFNDMV9QSFlTX0FERFIJIAkweDExQjAwMDAwCi0jZGVmaW5lIExDRF9QSFlTX0FERFIJCTB4MTUwMDAwMDAKLSNkZWZpbmUgU1dDTlRfUEhZU19BRERSCQkweDExMTAwMTBDCi0jZGVmaW5lIE1BRUZFX1BIWVNfQUREUgkJMHgxNDAxMjAwMAotI2RlZmluZSBNQUVCRV9QSFlTX0FERFIJCTB4MTQwMTAwMDAKLSNkZWZpbmUgUENNQ0lBX0lPX1BIWVNfQUREUgkweEYwMDAwMDAwMFVMTAotI2RlZmluZSBQQ01DSUFfQVRUUl9QSFlTX0FERFIJMHhGNDAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX01FTV9QSFlTX0FERFIJMHhGODAwMDAwMDBVTEwKLSNlbmRpZgorLyogQXUxNTUwIFNEUkFNIFJlZ2lzdGVyIE9mZnNldHMgKi8KKyNkZWZpbmUgQVUxNTUwX01FTV9TRE1PREUwCQkweDA4MDAKKyNkZWZpbmUgQVUxNTUwX01FTV9TRE1PREUxCQkweDA4MDgKKyNkZWZpbmUgQVUxNTUwX01FTV9TRE1PREUyCQkweDA4MTAKKyNkZWZpbmUgQVUxNTUwX01FTV9TREFERFIwCQkweDA4MjAKKyNkZWZpbmUgQVUxNTUwX01FTV9TREFERFIxCQkweDA4MjgKKyNkZWZpbmUgQVUxNTUwX01FTV9TREFERFIyCQkweDA4MzAKKyNkZWZpbmUgQVUxNTUwX01FTV9TRENPTkZJR0EJCTB4MDg0MAorI2RlZmluZSBBVTE1NTBfTUVNX1NEQ09ORklHQgkJMHgwODQ4CisjZGVmaW5lIEFVMTU1MF9NRU1fU0RTVEFUCQkweDA4NTAKKyNkZWZpbmUgQVUxNTUwX01FTV9TREVSUkFERFIJCTB4MDg1OAorI2RlZmluZSBBVTE1NTBfTUVNX1NEU1RSSURFMAkJMHgwODYwCisjZGVmaW5lIEFVMTU1MF9NRU1fU0RTVFJJREUxCQkweDA4NjgKKyNkZWZpbmUgQVUxNTUwX01FTV9TRFNUUklERTIJCTB4MDg3MAorI2RlZmluZSBBVTE1NTBfTUVNX1NEV1JNRDAJCTB4MDg4MAorI2RlZmluZSBBVTE1NTBfTUVNX1NEV1JNRDEJCTB4MDg4OAorI2RlZmluZSBBVTE1NTBfTUVNX1NEV1JNRDIJCTB4MDg5MAorI2RlZmluZSBBVTE1NTBfTUVNX1NEUFJFQ01ECQkweDA4QzAKKyNkZWZpbmUgQVUxNTUwX01FTV9TREFVVE9SRUYJCTB4MDhDOAorI2RlZmluZSBBVTE1NTBfTUVNX1NEU1JFRgkJMHgwOEQwCisjZGVmaW5lIEFVMTU1MF9NRU1fU0RTTEVFUAkJTUVNX1NEU1JFRgogCiAvKiBTdGF0aWMgQnVzIENvbnRyb2xsZXIgKi8KICNkZWZpbmUgTUVNX1NUQ0ZHMAkJMHhCNDAwMTAwMApAQCAtODEzLDgxICs3NTcsMTQgQEAKICNkZWZpbmUgTUVNX1NUVElNRTMJCTB4QjQwMDEwMzQKICNkZWZpbmUgTUVNX1NUQUREUjMJCTB4QjQwMDEwMzgKIAotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19BVTEyMDApCiAjZGVmaW5lIE1FTV9TVE5EQ1RMCQkweEI0MDAxMTAwCiAjZGVmaW5lIE1FTV9TVFNUQVQJCTB4QjQwMDExMDQKIAogI2RlZmluZSBNRU1fU1ROQU5EX0NNRAkJMHgwCiAjZGVmaW5lIE1FTV9TVE5BTkRfQUREUiAJMHg0CiAjZGVmaW5lIE1FTV9TVE5BTkRfREFUQSAJMHgyMAotI2VuZGlmCiAKIAotCi0KLS8qIEF1MTAwMCAqLwotI2lmZGVmIENPTkZJR19TT0NfQVUxMDAwCi0KLSNkZWZpbmUgVVNCX09IQ0lfQkFTRQkJMHgxMDEwMDAwMAkvKiBwaHlzIGFkZHIgZm9yIGlvcmVtYXAgKi8KLSNkZWZpbmUgVVNCX0hPU1RfQ09ORklHIAkweEIwMTdGRkZDCi0jZGVmaW5lIEZPUl9QTEFURk9STV9DX1VTQl9IT1NUX0lOVCBBVTEwMDBfVVNCX0hPU1RfSU5UCi0jZW5kaWYgLyogQ09ORklHX1NPQ19BVTEwMDAgKi8KLQotLyogQXUxNTAwICovCi0jaWZkZWYgQ09ORklHX1NPQ19BVTE1MDAKLQotI2RlZmluZSBVU0JfT0hDSV9CQVNFCQkweDEwMTAwMDAwCS8qIHBoeXMgYWRkciBmb3IgaW9yZW1hcCAqLwotI2RlZmluZSBVU0JfSE9TVF9DT05GSUcgCTB4QjAxN2ZmZmMKLSNkZWZpbmUgRk9SX1BMQVRGT1JNX0NfVVNCX0hPU1RfSU5UIEFVMTUwMF9VU0JfSE9TVF9JTlQKLSNlbmRpZiAvKiBDT05GSUdfU09DX0FVMTUwMCAqLwotCi0vKiBBdTExMDAgKi8KLSNpZmRlZiBDT05GSUdfU09DX0FVMTEwMAotCi0jZGVmaW5lIFVTQl9PSENJX0JBU0UJCTB4MTAxMDAwMDAJLyogcGh5cyBhZGRyIGZvciBpb3JlbWFwICovCi0jZGVmaW5lIFVTQl9IT1NUX0NPTkZJRyAJMHhCMDE3RkZGQwotI2RlZmluZSBGT1JfUExBVEZPUk1fQ19VU0JfSE9TVF9JTlQgQVUxMTAwX1VTQl9IT1NUX0lOVAotI2VuZGlmIC8qIENPTkZJR19TT0NfQVUxMTAwICovCi0KLSNpZmRlZiBDT05GSUdfU09DX0FVMTU1MAotCi0jZGVmaW5lIFVTQl9PSENJX0JBU0UJCTB4MTQwMjAwMDAJLyogcGh5cyBhZGRyIGZvciBpb3JlbWFwICovCi0jZGVmaW5lIFVTQl9PSENJX0xFTgkJMHgwMDA2MDAwMAotI2RlZmluZSBVU0JfSE9TVF9DT05GSUcgCTB4QjQwMjdmZmMKLSNkZWZpbmUgRk9SX1BMQVRGT1JNX0NfVVNCX0hPU1RfSU5UIEFVMTU1MF9VU0JfSE9TVF9JTlQKLSNlbmRpZiAvKiBDT05GSUdfU09DX0FVMTU1MCAqLwotCi0KLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotCi0jZGVmaW5lIFVTQl9VT0NfQkFTRQkJMHgxNDAyMDAyMAotI2RlZmluZSBVU0JfVU9DX0xFTgkJMHgyMAotI2RlZmluZSBVU0JfT0hDSV9CQVNFCQkweDE0MDIwMTAwCi0jZGVmaW5lIFVTQl9PSENJX0xFTgkJMHgxMDAKLSNkZWZpbmUgVVNCX0VIQ0lfQkFTRQkJMHgxNDAyMDIwMAotI2RlZmluZSBVU0JfRUhDSV9MRU4JCTB4MTAwCi0jZGVmaW5lIFVTQl9VRENfQkFTRQkJMHgxNDAyMjAwMAotI2RlZmluZSBVU0JfVURDX0xFTgkJMHgyMDAwCi0jZGVmaW5lIFVTQl9NU1JfQkFTRQkJMHhCNDAyMDAwMAotI2RlZmluZSBVU0JfTVNSX01DRkcJCTQKLSNkZWZpbmUgVVNCTVNSTUNGR19PTUVNRU4JMAotI2RlZmluZSBVU0JNU1JNQ0ZHX09CTUVOCTEKLSNkZWZpbmUgVVNCTVNSTUNGR19FTUVNRU4JMgotI2RlZmluZSBVU0JNU1JNQ0ZHX0VCTUVOCTMKLSNkZWZpbmUgVVNCTVNSTUNGR19ETUVNRU4JNAotI2RlZmluZSBVU0JNU1JNQ0ZHX0RCTUVOCTUKLSNkZWZpbmUgVVNCTVNSTUNGR19HTUVNRU4JNgotI2RlZmluZSBVU0JNU1JNQ0ZHX09IQ0NMS0VOCTE2Ci0jZGVmaW5lIFVTQk1TUk1DRkdfRUhDQ0xLRU4JMTcKLSNkZWZpbmUgVVNCTVNSTUNGR19VRENDTEtFTgkxOAotI2RlZmluZSBVU0JNU1JNQ0ZHX1BIWVBMTEVOCTE5Ci0jZGVmaW5lIFVTQk1TUk1DRkdfUkRDT01CCTMwCi0jZGVmaW5lIFVTQk1TUk1DRkdfUEZFTiAJMzEKLQotI2RlZmluZSBGT1JfUExBVEZPUk1fQ19VU0JfSE9TVF9JTlQgQVUxMjAwX1VTQl9JTlQKLQotI2VuZGlmIC8qIENPTkZJR19TT0NfQVUxMjAwICovCi0KIC8qIFByb2dyYW1tYWJsZSBDb3VudGVycyAwIGFuZCAxICovCiAjZGVmaW5lIFNZU19CQVNFCQkweEIxOTAwMDAwCiAjZGVmaW5lIFNZU19DT1VOVEVSX0NOVFJMCShTWVNfQkFTRSArIDB4MTQpCkBAIC05NTgsNTYgKzgzNSw2IEBACiAjICBkZWZpbmUgSTJTX0NPTlRST0xfRCAJKDEgPDwgMSkKICMgIGRlZmluZSBJMlNfQ09OVFJPTF9DRQkoMSA8PCAwKQogCi0vKiBVU0IgSG9zdCBDb250cm9sbGVyICovCi0jaWZuZGVmIFVTQl9PSENJX0xFTgotI2RlZmluZSBVU0JfT0hDSV9MRU4JCTB4MDAxMDAwMDAKLSNlbmRpZgotCi0jaWZuZGVmIENPTkZJR19TT0NfQVUxMjAwCi0KLS8qIFVTQiBEZXZpY2UgQ29udHJvbGxlciAqLwotI2RlZmluZSBVU0JEX0VQMFJECQkweEIwMjAwMDAwCi0jZGVmaW5lIFVTQkRfRVAwV1IJCTB4QjAyMDAwMDQKLSNkZWZpbmUgVVNCRF9FUDJXUgkJMHhCMDIwMDAwOAotI2RlZmluZSBVU0JEX0VQM1dSCQkweEIwMjAwMDBDCi0jZGVmaW5lIFVTQkRfRVA0UkQJCTB4QjAyMDAwMTAKLSNkZWZpbmUgVVNCRF9FUDVSRAkJMHhCMDIwMDAxNAotI2RlZmluZSBVU0JEX0lOVEVOCQkweEIwMjAwMDE4Ci0jZGVmaW5lIFVTQkRfSU5UU1RBVAkJMHhCMDIwMDAxQwotIyAgZGVmaW5lIFVTQkRFVl9JTlRfU09GCSgxIDw8IDEyKQotIyAgZGVmaW5lIFVTQkRFVl9JTlRfSEZfQklUCTYKLSMgIGRlZmluZSBVU0JERVZfSU5UX0hGX01BU0sJKDB4M2YgPDwgVVNCREVWX0lOVF9IRl9CSVQpCi0jICBkZWZpbmUgVVNCREVWX0lOVF9DTVBMVF9CSVQJMAotIyAgZGVmaW5lIFVTQkRFVl9JTlRfQ01QTFRfTUFTSyAoMHgzZiA8PCBVU0JERVZfSU5UX0NNUExUX0JJVCkKLSNkZWZpbmUgVVNCRF9DT05GSUcJCTB4QjAyMDAwMjAKLSNkZWZpbmUgVVNCRF9FUDBDUwkJMHhCMDIwMDAyNAotI2RlZmluZSBVU0JEX0VQMkNTCQkweEIwMjAwMDI4Ci0jZGVmaW5lIFVTQkRfRVAzQ1MJCTB4QjAyMDAwMkMKLSNkZWZpbmUgVVNCRF9FUDRDUwkJMHhCMDIwMDAzMAotI2RlZmluZSBVU0JEX0VQNUNTCQkweEIwMjAwMDM0Ci0jICBkZWZpbmUgVVNCREVWX0NTX1NVCQkoMSA8PCAxNCkKLSMgIGRlZmluZSBVU0JERVZfQ1NfTkFLIAkoMSA8PCAxMykKLSMgIGRlZmluZSBVU0JERVZfQ1NfQUNLIAkoMSA8PCAxMikKLSMgIGRlZmluZSBVU0JERVZfQ1NfQlVTWQkoMSA8PCAxMSkKLSMgIGRlZmluZSBVU0JERVZfQ1NfVFNJWkVfQklUCTEKLSMgIGRlZmluZSBVU0JERVZfQ1NfVFNJWkVfTUFTSwkoMHgzZmYgPDwgVVNCREVWX0NTX1RTSVpFX0JJVCkKLSMgIGRlZmluZSBVU0JERVZfQ1NfU1RBTEwJKDEgPDwgMCkKLSNkZWZpbmUgVVNCRF9FUDBSRFNUQVQJCTB4QjAyMDAwNDAKLSNkZWZpbmUgVVNCRF9FUDBXUlNUQVQJCTB4QjAyMDAwNDQKLSNkZWZpbmUgVVNCRF9FUDJXUlNUQVQJCTB4QjAyMDAwNDgKLSNkZWZpbmUgVVNCRF9FUDNXUlNUQVQJCTB4QjAyMDAwNEMKLSNkZWZpbmUgVVNCRF9FUDRSRFNUQVQJCTB4QjAyMDAwNTAKLSNkZWZpbmUgVVNCRF9FUDVSRFNUQVQJCTB4QjAyMDAwNTQKLSMgIGRlZmluZSBVU0JERVZfRlNUQVRfRkxVU0gJKDEgPDwgNikKLSMgIGRlZmluZSBVU0JERVZfRlNUQVRfVUYJKDEgPDwgNSkKLSMgIGRlZmluZSBVU0JERVZfRlNUQVRfT0YJKDEgPDwgNCkKLSMgIGRlZmluZSBVU0JERVZfRlNUQVRfRkNOVF9CSVQgMAotIyAgZGVmaW5lIFVTQkRFVl9GU1RBVF9GQ05UX01BU0sgKDB4MGYgPDwgVVNCREVWX0ZTVEFUX0ZDTlRfQklUKQotI2RlZmluZSBVU0JEX0VOQUJMRQkJMHhCMDIwMDA1OAotIyAgZGVmaW5lIFVTQkRFVl9FTkFCTEUgCSgxIDw8IDEpCi0jICBkZWZpbmUgVVNCREVWX0NFCQkoMSA8PCAwKQotCi0jZW5kaWYgLyogIUNPTkZJR19TT0NfQVUxMjAwICovCiAKIC8qIEV0aGVybmV0IENvbnRyb2xsZXJzICAqLwogCkBAIC0xMzIyLDcgKzExNDksNiBAQAogIyAgZGVmaW5lIFNZU19QRl9NVVNUX0JFX1NFVAkoKDEgPDwgNSkgfCAoMSA8PCAyKSkKIAogLyogQXUxMjAwIG9ubHkgKi8KLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAogI2RlZmluZSBTWVNfUElORlVOQ19ETUEgCSgxIDw8IDMxKQogI2RlZmluZSBTWVNfUElORlVOQ19TMEEgCSgxIDw8IDMwKQogI2RlZmluZSBTWVNfUElORlVOQ19TMUEgCSgxIDw8IDI5KQpAQCAtMTM1MCw3ICsxMTc2LDYgQEAKICNkZWZpbmUgU1lTX1BJTkZVTkNfUDBCIAkoMSA8PCA0KQogI2RlZmluZSBTWVNfUElORlVOQ19VMFQgCSgxIDw8IDMpCiAjZGVmaW5lIFNZU19QSU5GVU5DX1MxQiAJKDEgPDwgMikKLSNlbmRpZgogCiAvKiBQb3dlciBNYW5hZ2VtZW50ICovCiAjZGVmaW5lIFNZU19TQ1JBVENIMAkJMHhCMTkwMDAxOApAQCAtMTQwNiwxMiArMTIzMSwxMiBAQAogIyAgZGVmaW5lIFNZU19DU19NSTJfTUFTSwkoMHg3IDw8IFNZU19DU19NSTJfQklUKQogIyAgZGVmaW5lIFNZU19DU19ESTIJCSgxIDw8IDE2KQogIyAgZGVmaW5lIFNZU19DU19DSTIJCSgxIDw8IDE1KQotI2lmZGVmIENPTkZJR19TT0NfQVUxMTAwCisKICMgIGRlZmluZSBTWVNfQ1NfTUxfQklUIAk3CiAjICBkZWZpbmUgU1lTX0NTX01MX01BU0sJKDB4NyA8PCBTWVNfQ1NfTUxfQklUKQogIyAgZGVmaW5lIFNZU19DU19ETAkJKDEgPDwgNikKICMgIGRlZmluZSBTWVNfQ1NfQ0wJCSgxIDw8IDUpCi0jZWxzZQorCiAjICBkZWZpbmUgU1lTX0NTX01VSF9CSVQJMTIKICMgIGRlZmluZSBTWVNfQ1NfTVVIX01BU0sJKDB4NyA8PCBTWVNfQ1NfTVVIX0JJVCkKICMgIGRlZmluZSBTWVNfQ1NfRFVICQkoMSA8PCAxMSkKQEAgLTE0MjAsNyArMTI0NSw3IEBACiAjICBkZWZpbmUgU1lTX0NTX01VRF9NQVNLCSgweDcgPDwgU1lTX0NTX01VRF9CSVQpCiAjICBkZWZpbmUgU1lTX0NTX0RVRAkJKDEgPDwgNikKICMgIGRlZmluZSBTWVNfQ1NfQ1VECQkoMSA8PCA1KQotI2VuZGlmCisKICMgIGRlZmluZSBTWVNfQ1NfTUlSX0JJVAkyCiAjICBkZWZpbmUgU1lTX0NTX01JUl9NQVNLCSgweDcgPDwgU1lTX0NTX01JUl9CSVQpCiAjICBkZWZpbmUgU1lTX0NTX0RJUgkJKDEgPDwgMSkKQEAgLTE0NjcsNTggKzEyOTIsMzAgQEAKICMgIGRlZmluZSBBQzk3Q19SUwkJKDEgPDwgMSkKICMgIGRlZmluZSBBQzk3Q19DRQkJKDEgPDwgMCkKIAotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1MDApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApCi0vKiBBdTE1MDAgUENJIENvbnRyb2xsZXIgKi8KLSNkZWZpbmUgQXUxNTAwX0NGR19CQVNFIAkweEI0MDA1MDAwCS8qIHZpcnR1YWwsIEtTRUcxIGFkZHIgKi8KLSNkZWZpbmUgQXUxNTAwX1BDSV9DTUVNIAkoQXUxNTAwX0NGR19CQVNFICsgMCkKLSNkZWZpbmUgQXUxNTAwX1BDSV9DRkcJCShBdTE1MDBfQ0ZHX0JBU0UgKyA0KQotIyAgZGVmaW5lIFBDSV9FUlJPUgkJKCgxIDw8IDIyKSB8ICgxIDw8IDIzKSB8ICgxIDw8IDI0KSB8IFwKLQkJCQkgKDEgPDwgMjUpIHwgKDEgPDwgMjYpIHwgKDEgPDwgMjcpKQotI2RlZmluZSBBdTE1MDBfUENJX0IyQk1BU0tfQ0NICShBdTE1MDBfQ0ZHX0JBU0UgKyA4KQotI2RlZmluZSBBdTE1MDBfUENJX0IyQjBfVklECShBdTE1MDBfQ0ZHX0JBU0UgKyAweEMpCi0jZGVmaW5lIEF1MTUwMF9QQ0lfQjJCMV9JRAkoQXUxNTAwX0NGR19CQVNFICsgMHgxMCkKLSNkZWZpbmUgQXUxNTAwX1BDSV9NV01BU0tfREVWCShBdTE1MDBfQ0ZHX0JBU0UgKyAweDE0KQotI2RlZmluZSBBdTE1MDBfUENJX01XQkFTRV9SRVZfQ0NMIChBdTE1MDBfQ0ZHX0JBU0UgKyAweDE4KQotI2RlZmluZSBBdTE1MDBfUENJX0VSUl9BRERSCShBdTE1MDBfQ0ZHX0JBU0UgKyAweDFDKQotI2RlZmluZSBBdTE1MDBfUENJX1NQRUNfSU5UQUNLCShBdTE1MDBfQ0ZHX0JBU0UgKyAweDIwKQotI2RlZmluZSBBdTE1MDBfUENJX0lECQkoQXUxNTAwX0NGR19CQVNFICsgMHgxMDApCi0jZGVmaW5lIEF1MTUwMF9QQ0lfU1RBVENNRAkoQXUxNTAwX0NGR19CQVNFICsgMHgxMDQpCi0jZGVmaW5lIEF1MTUwMF9QQ0lfQ0xBU1NSRVYJKEF1MTUwMF9DRkdfQkFTRSArIDB4MTA4KQotI2RlZmluZSBBdTE1MDBfUENJX0hEUlRZUEUJKEF1MTUwMF9DRkdfQkFTRSArIDB4MTBDKQotI2RlZmluZSBBdTE1MDBfUENJX01CQVIgCShBdTE1MDBfQ0ZHX0JBU0UgKyAweDExMCkKIAotI2RlZmluZSBBdTE1MDBfUENJX0hEUgkJMHhCNDAwNTEwMAkvKiB2aXJ0dWFsLCBLU0VHMSBhZGRyICovCi0KLS8qCi0gKiBBbGwgb2Ygb3VyIHN0cnVjdHVyZXMsIGxpa2UgUENJIHJlc291cmNlLCBoYXZlIDMyLWJpdCBtZW1iZXJzLgotICogRHJpdmVycyBhcmUgZXhwZWN0ZWQgdG8gZG8gYW4gaW9yZW1hcCBvbiB0aGUgUENJIE1FTSByZXNvdXJjZSwgYnV0IGl0J3MKLSAqIGhhcmQgdG8gc3RvcmUgMHg0IDAwMDAgMDAwMCBpbiBhIDMyLWJpdCB0eXBlLiAgV2UgcmVxdWlyZSBhIHNtYWxsIHBhdGNoCi0gKiB0byBfX2lvcmVtYXAgdG8gY2hlY2sgZm9yIGFkZHJlc3NlcyBiZXR3ZWVuICh1MzIpQXUxNTAwX1BDSV9NRU1fU1RBUlQgYW5kCi0gKiAodTMyKUF1MTUwMF9QQ0lfTUVNX0VORCBhbmQgY2hhbmdlIHRob3NlIHRvIHRoZSBmdWxsIDM2LWJpdCBQQ0kgTUVNCi0gKiBhZGRyZXNzZXMuICBGb3IgUENJIEkvTywgaXQncyBzaW1wbGVyIGJlY2F1c2Ugd2UgZ2V0IHRvIGRvIHRoZSBpb3JlbWFwCi0gKiBvdXJzZWx2ZXMgYW5kIHRoZW4gYWRqdXN0IHRoZSBkZXZpY2UncyByZXNvdXJjZXMuCisvKiBUaGUgUENJIGNoaXAgc2VsZWN0cyBhcmUgb3V0c2lkZSB0aGUgMzJiaXQgc3BhY2UsIGFuZCBzaW5jZSB3ZSBjYW4ndAorICoganVzdCBwcm9ncmFtIHRoZSAzNmJpdCBhZGRyZXNzZXMgaW50byBCQVJzLCB3ZSBoYXZlIHRvIHRha2UgYSBjaHVuaworICogb3V0IG9mIHRoZSAzMmJpdCBzcGFjZSBhbmQgcmVzZXJ2ZSBpdCBmb3IgUENJLiAgV2hlbiB0aGVzZSBhZGRyZXNzZXMKKyAqIGFyZSBpb3JlbWFwKCllZCwgdGhleSdsbCBiZSBmaXhlZCB1cCB0byB0aGUgcmVhbCAzNmJpdCBhZGRyZXNzIGJlZm9yZQorICogYmVpbmcgcGFzc2VkIHRvIHRoZSByZWFsIGlvcmVtYXAgZnVuY3Rpb24uCiAgKi8KLSNkZWZpbmUgQXUxNTAwX0VYVF9DRkcJCTB4NjAwMDAwMDAwVUxMCi0jZGVmaW5lIEF1MTUwMF9FWFRfQ0ZHX1RZUEUxCTB4NjgwMDAwMDAwVUxMCi0jZGVmaW5lIEF1MTUwMF9QQ0lfSU9fU1RBUlQJMHg1MDAwMDAwMDBVTEwKLSNkZWZpbmUgQXUxNTAwX1BDSV9JT19FTkQJMHg1MDAwRkZGRkZVTEwKLSNkZWZpbmUgQXUxNTAwX1BDSV9NRU1fU1RBUlQJMHg0NDAwMDAwMDBVTEwKLSNkZWZpbmUgQXUxNTAwX1BDSV9NRU1fRU5ECTB4NDRGRkZGRkZGVUxMCisjZGVmaW5lIEFMQ0hFTVlfUENJX01FTVdJTl9TVEFSVAkoQVUxNTAwX1BDSV9NRU1fUEhZU19BRERSID4+IDQpCisjZGVmaW5lIEFMQ0hFTVlfUENJX01FTVdJTl9FTkQJCShBTENIRU1ZX1BDSV9NRU1XSU5fU1RBUlQgKyAweDBGRkZGRkZGKQogCi0jZGVmaW5lIFBDSV9JT19TVEFSVAkweDAwMDAxMDAwCi0jZGVmaW5lIFBDSV9JT19FTkQJMHgwMDBGRkZGRgotI2RlZmluZSBQQ0lfTUVNX1NUQVJUCTB4NDAwMDAwMDAKLSNkZWZpbmUgUENJX01FTV9FTkQJMHg0RkZGRkZGRgorLyogZm9yIFBDSSBJTyBpdCdzIHNpbXBsZXIgYmVjYXVzZSB3ZSBnZXQgdG8gZG8gdGhlIGlvcmVtYXAgb3Vyc2VsdmVzIGFuZCB0aGVuCisgKiBhZGp1c3QgdGhlIGRldmljZSdzIHJlc291cmNlcy4KKyAqLworI2RlZmluZSBBTENIRU1ZX1BDSV9JT1dJTl9TVEFSVAkJMHgwMDAwMTAwMAorI2RlZmluZSBBTENIRU1ZX1BDSV9JT1dJTl9FTkQJCTB4MDAwMEZGRkYKIAotI2RlZmluZSBQQ0lfRklSU1RfREVWRk4gKDAgPDwgMykKLSNkZWZpbmUgUENJX0xBU1RfREVWRk4JKDE5IDw8IDMpCisjaWZkZWYgQ09ORklHX1BDSQogCiAjZGVmaW5lIElPUE9SVF9SRVNPVVJDRV9TVEFSVAkweDAwMDAxMDAwCS8qIHNraXAgbGVnYWN5IHByb2JpbmcgKi8KICNkZWZpbmUgSU9QT1JUX1JFU09VUkNFX0VORAkweGZmZmZmZmZmCiAjZGVmaW5lIElPTUVNX1JFU09VUkNFX1NUQVJUCTB4MTAwMDAwMDAKICNkZWZpbmUgSU9NRU1fUkVTT1VSQ0VfRU5ECTB4ZmZmZmZmZmZmVUxMCiAKLSNlbHNlIC8qIEF1MTAwMCBhbmQgQXUxMTAwIGFuZCBBdTEyMDAgKi8KKyNlbHNlCiAKIC8qIERvbid0IGFsbG93IGFueSBsZWdhY3kgcG9ydHMgcHJvYmluZyAqLwogI2RlZmluZSBJT1BPUlRfUkVTT1VSQ0VfU1RBUlQJMHgxMDAwMDAwMApAQCAtMTUyNiwxMyArMTMyMyw3NyBAQAogI2RlZmluZSBJT01FTV9SRVNPVVJDRV9TVEFSVAkweDEwMDAwMDAwCiAjZGVmaW5lIElPTUVNX1JFU09VUkNFX0VORAkweGZmZmZmZmZmZlVMTAogCi0jZGVmaW5lIFBDSV9JT19TVEFSVAkwCi0jZGVmaW5lIFBDSV9JT19FTkQJMAotI2RlZmluZSBQQ0lfTUVNX1NUQVJUCTAKLSNkZWZpbmUgUENJX01FTV9FTkQJMAotI2RlZmluZSBQQ0lfRklSU1RfREVWRk4gMAotI2RlZmluZSBQQ0lfTEFTVF9ERVZGTgkwCi0KICNlbmRpZgogCisvKiBQQ0kgY29udHJvbGxlciBibG9jayByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIFBDSV9SRUdfQ01FTQkJMHgwMDAwCisjZGVmaW5lIFBDSV9SRUdfQ09ORklHCQkweDAwMDQKKyNkZWZpbmUgUENJX1JFR19CMkJNQVNLX0NDSAkweDAwMDgKKyNkZWZpbmUgUENJX1JFR19CMkJCQVNFMF9WSUQJMHgwMDBDCisjZGVmaW5lIFBDSV9SRUdfQjJCQkFTRTFfU0lECTB4MDAxMAorI2RlZmluZSBQQ0lfUkVHX01XTUFTS19ERVYJMHgwMDE0CisjZGVmaW5lIFBDSV9SRUdfTVdCQVNFX1JFVl9DQ0wJMHgwMDE4CisjZGVmaW5lIFBDSV9SRUdfRVJSX0FERFIJMHgwMDFDCisjZGVmaW5lIFBDSV9SRUdfU1BFQ19JTlRBQ0sJMHgwMDIwCisjZGVmaW5lIFBDSV9SRUdfSUQJCTB4MDEwMAorI2RlZmluZSBQQ0lfUkVHX1NUQVRDTUQJCTB4MDEwNAorI2RlZmluZSBQQ0lfUkVHX0NMQVNTUkVWCTB4MDEwOAorI2RlZmluZSBQQ0lfUkVHX1BBUkFNCQkweDAxMEMKKyNkZWZpbmUgUENJX1JFR19NQkFSCQkweDAxMTAKKyNkZWZpbmUgUENJX1JFR19USU1FT1VUCQkweDAxNDAKKworLyogUENJIGNvbnRyb2xsZXIgYmxvY2sgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBQQ0lfQ01FTV9FCQkoMSA8PCAyOCkJLyogZW5hYmxlIGNhY2hlYWJsZSBtZW1vcnkgKi8KKyNkZWZpbmUgUENJX0NNRU1fQ01CQVNFKHgpCSgoKHgpICYgMHgzZmZmKSA8PCAxNCkKKyNkZWZpbmUgUENJX0NNRU1fQ01NQVNLKHgpCSgoeCkgJiAweDNmZmYpCisjZGVmaW5lIFBDSV9DT05GSUdfRVJECQkoMSA8PCAyNykgLyogcGNpIGVycm9yIGR1cmluZyBSL1cgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19FVAkJKDEgPDwgMjYpIC8qIGVycm9yIGluIHRhcmdldCBtb2RlICovCisjZGVmaW5lIFBDSV9DT05GSUdfRUYJCSgxIDw8IDI1KSAvKiBmYXRhbCBlcnJvciAqLworI2RlZmluZSBQQ0lfQ09ORklHX0VQCQkoMSA8PCAyNCkgLyogcGFyaXR5IGVycm9yICovCisjZGVmaW5lIFBDSV9DT05GSUdfRU0JCSgxIDw8IDIzKSAvKiBtdWx0aXBsZSBlcnJvcnMgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19CTQkJKDEgPDwgMjIpIC8qIGJhZCBtYXN0ZXIgZXJyb3IgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19QRAkJKDEgPDwgMjApIC8qIFBDSSBEaXNhYmxlICovCisjZGVmaW5lIFBDSV9DT05GSUdfQk1FCQkoMSA8PCAxOSkgLyogQnl0ZSBNYXNrIEVuYWJsZSBmb3IgcmVhZHMgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19OQwkJKDEgPDwgMTYpIC8qIG1hcmsgbWVtIGFjY2VzcyBub24tY29oZXJlbnQgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19JQQkJKDEgPDwgMTUpIC8qIElOVEEjIGVuYWJsZWQgKHRhcmdldCBtb2RlKSAqLworI2RlZmluZSBQQ0lfQ09ORklHX0lQCQkoMSA8PCAxMykgLyogaW50IG9uIFBDSV9QRVJSIyAqLworI2RlZmluZSBQQ0lfQ09ORklHX0lTCQkoMSA8PCAxMikgLyogaW50IG9uIFBDSV9TRVJSIyAqLworI2RlZmluZSBQQ0lfQ09ORklHX0lNTQkJKDEgPDwgMTEpIC8qIGludCBvbiBtYXN0ZXIgYWJvcnQgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19JVE0JCSgxIDw8IDEwKSAvKiBpbnQgb24gdGFyZ2V0IGFib3J0IChhcyBtYXN0ZXIpICovCisjZGVmaW5lIFBDSV9DT05GSUdfSVRUCQkoMSA8PCA5KSAgLyogaW50IG9uIHRhcmdldCBhYm9ydCAoYXMgdGFyZ2V0KSAqLworI2RlZmluZSBQQ0lfQ09ORklHX0lQQgkJKDEgPDwgOCkgIC8qIGludCBvbiBQRVJSIyBpbiBidXMgbWFzdGVyIGFjYyAqLworI2RlZmluZSBQQ0lfQ09ORklHX1NJQ19OTwkoMCA8PCA2KSAgLyogbm8gYnl0ZSBtYXNrIGNoYW5nZXMgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19TSUNfQkFfQURSCSgxIDw8IDYpICAvKiBvbiBieXRlL2h3IGFjYywgaW52ZXJ0IGFkciBiaXRzICovCisjZGVmaW5lIFBDSV9DT05GSUdfU0lDX0hXQV9EQVQJKDIgPDwgNikgIC8qIG9uIGhhbGZ3b3JkIGFjYywgc3dhcCBkYXRhICovCisjZGVmaW5lIFBDSV9DT05GSUdfU0lDX0FMTAkoMyA8PCA2KSAgLyogc3dhcCBkYXRhIGJ5dGVzIG9uIGFsbCBhY2Nlc3NlcyAqLworI2RlZmluZSBQQ0lfQ09ORklHX1NUCQkoMSA8PCA1KSAgLyogc3dhcCBkYXRhIGJ5IHRhcmdldCB0cmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19TTQkJKDEgPDwgNCkgIC8qIHN3YXAgZGF0YSBmcm9tIFBDSSBjdGwgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19BRU4JCSgxIDw8IDMpICAvKiBlbmFibGUgaW50ZXJuYWwgYXJiaXRlciAqLworI2RlZmluZSBQQ0lfQ09ORklHX1IySAkJKDEgPDwgMikgIC8qIFJFUTIjIHRvIGhpLXByaW8gYXJiaXRlciAqLworI2RlZmluZSBQQ0lfQ09ORklHX1IxSAkJKDEgPDwgMSkgIC8qIFJFUTEjIHRvIGhpLXByaW8gYXJiaXRlciAqLworI2RlZmluZSBQQ0lfQ09ORklHX0NICQkoMSA8PCAwKSAgLyogUENJIGN0bCB0byBoaS1wcmlvIGFyYml0ZXIgKi8KKyNkZWZpbmUgUENJX0IyQk1BU0tfQjJCTUFTSyh4KQkoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFBDSV9CMkJNQVNLX0NDSCh4KQkoKHgpICYgMHhmZmZmKSAvKiAxNiB1cHBlciBiaXRzIG9mIGNsYXNzIGNvZGUgKi8KKyNkZWZpbmUgUENJX0IyQkJBU0UwX1ZJRF9CMCh4KQkoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFBDSV9CMkJCQVNFMF9WSURfU1YoeCkJKCh4KSAmIDB4ZmZmZikKKyNkZWZpbmUgUENJX0IyQkJBU0UxX1NJRF9CMSh4KQkoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFBDSV9CMkJCQVNFMV9TSURfU0koeCkJKCh4KSAmIDB4ZmZmZikKKyNkZWZpbmUgUENJX01XTUFTS0RFVl9NV01BU0soeCkgKCgoeCkgJiAweGZmZmYpIDw8IDE2KQorI2RlZmluZSBQQ0lfTVdNQVNLREVWX0RFVklEKHgpCSgoeCkgJiAweGZmZmYpCisjZGVmaW5lIFBDSV9NV0JBU0VSRVZDQ0xfQkFTRSh4KSAoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFBDSV9NV0JBU0VSRVZDQ0xfUkVWKHgpICAoKCh4KSAmIDB4ZmYpIDw8IDgpCisjZGVmaW5lIFBDSV9NV0JBU0VSRVZDQ0xfQ0NMKHgpICAoKHgpICYgMHhmZikKKyNkZWZpbmUgUENJX0lEX0RJRCh4KQkJKCgoeCkgJiAweGZmZmYpIDw8IDE2KQorI2RlZmluZSBQQ0lfSURfVklEKHgpCQkoKHgpICYgMHhmZmZmKQorI2RlZmluZSBQQ0lfU1RBVENNRF9TVEFUVVMoeCkJKCgoeCkgJiAweGZmZmYpIDw8IDE2KQorI2RlZmluZSBQQ0lfU1RBVENNRF9DTUQoeCkJKCh4KSAmIDB4ZmZmZikKKyNkZWZpbmUgUENJX0NMQVNTUkVWX0NMQVNTKHgpCSgoKHgpICYgMHgwMGZmZmZmZikgPDwgOCkKKyNkZWZpbmUgUENJX0NMQVNTUkVWX1JFVih4KQkoKHgpICYgMHhmZikKKyNkZWZpbmUgUENJX1BBUkFNX0JJU1QoeCkJKCgoeCkgJiAweGZmKSA8PCAyNCkKKyNkZWZpbmUgUENJX1BBUkFNX0hUKHgpCQkoKCh4KSAmIDB4ZmYpIDw8IDE2KQorI2RlZmluZSBQQ0lfUEFSQU1fTFQoeCkJCSgoKHgpICYgMHhmZikgPDwgOCkKKyNkZWZpbmUgUENJX1BBUkFNX0NMUyh4KQkoKHgpICYgMHhmZikKKyNkZWZpbmUgUENJX1RJTUVPVVRfUkVUUklFUyh4KQkoKCh4KSAmIDB4ZmYpIDw8IDgpCS8qIG1heCByZXRyaWVzICovCisjZGVmaW5lIFBDSV9USU1FT1VUX1RPKHgpCSgoeCkgJiAweGZmKQkvKiB0YXJnZXQgcmVhZHkgdGltZW91dCAqLworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHguaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIzNjU1MC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpZm5kZWYgX0FVMVhYWF9IXwotI2RlZmluZSBfQVUxWFhYX0hfCi0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjExMDApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTUwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjE1NTApCi0jaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2RiMXgwMC5oPgotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTX1BCMTU1MCkKLSNpbmNsdWRlIDxhc20vbWFjaC1wYjF4MDAvcGIxNTUwLmg+Ci0KLSNlbGlmIGRlZmluZWQoQ09ORklHX01JUFNfUEIxMjAwKQotI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjEyMDAuaD4KLQotI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQU19EQjEyMDApCi0jaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2RiMTIwMC5oPgotCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9BVTFYWFhfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaAppbmRleCAyZmRhY2ZlLi4zMjNjZTJkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oCkBAIC0xMjYsNjYgKzEyNiw2MiBAQAogI2RlZmluZSBTV19TVEFUVVNfSU5VU0UgCSgxIDw8IDApCiAKIC8qIENvbW1hbmQgMCBkZXZpY2UgSURzLiAqLwotI2lmZGVmIENPTkZJR19TT0NfQVUxNTUwCi0jZGVmaW5lIERTQ1JfQ01EMF9VQVJUMF9UWAkwCi0jZGVmaW5lIERTQ1JfQ01EMF9VQVJUMF9SWAkxCi0jZGVmaW5lIERTQ1JfQ01EMF9VQVJUM19UWAkyCi0jZGVmaW5lIERTQ1JfQ01EMF9VQVJUM19SWAkzCi0jZGVmaW5lIERTQ1JfQ01EMF9ETUFfUkVRMAk0Ci0jZGVmaW5lIERTQ1JfQ01EMF9ETUFfUkVRMQk1Ci0jZGVmaW5lIERTQ1JfQ01EMF9ETUFfUkVRMgk2Ci0jZGVmaW5lIERTQ1JfQ01EMF9ETUFfUkVRMwk3Ci0jZGVmaW5lIERTQ1JfQ01EMF9VU0JERVZfUlgwCTgKLSNkZWZpbmUgRFNDUl9DTUQwX1VTQkRFVl9UWDAJOQotI2RlZmluZSBEU0NSX0NNRDBfVVNCREVWX1RYMQkxMAotI2RlZmluZSBEU0NSX0NNRDBfVVNCREVWX1RYMgkxMQotI2RlZmluZSBEU0NSX0NNRDBfVVNCREVWX1JYMwkxMgotI2RlZmluZSBEU0NSX0NNRDBfVVNCREVWX1JYNAkxMwotI2RlZmluZSBEU0NSX0NNRDBfUFNDMF9UWAkxNAotI2RlZmluZSBEU0NSX0NNRDBfUFNDMF9SWAkxNQotI2RlZmluZSBEU0NSX0NNRDBfUFNDMV9UWAkxNgotI2RlZmluZSBEU0NSX0NNRDBfUFNDMV9SWAkxNwotI2RlZmluZSBEU0NSX0NNRDBfUFNDMl9UWAkxOAotI2RlZmluZSBEU0NSX0NNRDBfUFNDMl9SWAkxOQotI2RlZmluZSBEU0NSX0NNRDBfUFNDM19UWAkyMAotI2RlZmluZSBEU0NSX0NNRDBfUFNDM19SWAkyMQotI2RlZmluZSBEU0NSX0NNRDBfUENJX1dSSVRFCTIyCi0jZGVmaW5lIERTQ1JfQ01EMF9OQU5EX0ZMQVNICTIzCi0jZGVmaW5lIERTQ1JfQ01EMF9NQUMwX1JYCTI0Ci0jZGVmaW5lIERTQ1JfQ01EMF9NQUMwX1RYCTI1Ci0jZGVmaW5lIERTQ1JfQ01EMF9NQUMxX1JYCTI2Ci0jZGVmaW5lIERTQ1JfQ01EMF9NQUMxX1RYCTI3Ci0jZW5kaWYgLyogQ09ORklHX1NPQ19BVTE1NTAgKi8KKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9VQVJUMF9UWAkwCisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfVUFSVDBfUlgJMQorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1VBUlQzX1RYCTIKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9VQVJUM19SWAkzCisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfRE1BX1JFUTAJNAorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX0RNQV9SRVExCTUKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9ETUFfUkVRMgk2CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfRE1BX1JFUTMJNworI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1VTQkRFVl9SWDAJOAorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1VTQkRFVl9UWDAJOQorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1VTQkRFVl9UWDEJMTAKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9VU0JERVZfVFgyCTExCisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfVVNCREVWX1JYMwkxMgorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1VTQkRFVl9SWDQJMTMKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9QU0MwX1RYCTE0CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfUFNDMF9SWAkxNQorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1BTQzFfVFgJMTYKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9QU0MxX1JYCTE3CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfUFNDMl9UWAkxOAorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1BTQzJfUlgJMTkKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9QU0MzX1RYCTIwCisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfUFNDM19SWAkyMQorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1BDSV9XUklURQkyMgorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX05BTkRfRkxBU0gJMjMKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9NQUMwX1JYCTI0CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfTUFDMF9UWAkyNQorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX01BQzFfUlgJMjYKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9NQUMxX1RYCTI3CiAKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotI2RlZmluZSBEU0NSX0NNRDBfVUFSVDBfVFgJMAotI2RlZmluZSBEU0NSX0NNRDBfVUFSVDBfUlgJMQotI2RlZmluZSBEU0NSX0NNRDBfVUFSVDFfVFgJMgotI2RlZmluZSBEU0NSX0NNRDBfVUFSVDFfUlgJMwotI2RlZmluZSBEU0NSX0NNRDBfRE1BX1JFUTAJNAotI2RlZmluZSBEU0NSX0NNRDBfRE1BX1JFUTEJNQotI2RlZmluZSBEU0NSX0NNRDBfTUFFX0JFCTYKLSNkZWZpbmUgRFNDUl9DTUQwX01BRV9GRQk3Ci0jZGVmaW5lIERTQ1JfQ01EMF9TRE1TX1RYMAk4Ci0jZGVmaW5lIERTQ1JfQ01EMF9TRE1TX1JYMAk5Ci0jZGVmaW5lIERTQ1JfQ01EMF9TRE1TX1RYMQkxMAotI2RlZmluZSBEU0NSX0NNRDBfU0RNU19SWDEJMTEKLSNkZWZpbmUgRFNDUl9DTUQwX0FFU19UWAkxMwotI2RlZmluZSBEU0NSX0NNRDBfQUVTX1JYCTEyCi0jZGVmaW5lIERTQ1JfQ01EMF9QU0MwX1RYCTE0Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MwX1JYCTE1Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MxX1RYCTE2Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MxX1JYCTE3Ci0jZGVmaW5lIERTQ1JfQ01EMF9DSU1fUlhBCTE4Ci0jZGVmaW5lIERTQ1JfQ01EMF9DSU1fUlhCCTE5Ci0jZGVmaW5lIERTQ1JfQ01EMF9DSU1fUlhDCTIwCi0jZGVmaW5lIERTQ1JfQ01EMF9NQUVfQk9USAkyMQotI2RlZmluZSBEU0NSX0NNRDBfTENECQkyMgotI2RlZmluZSBEU0NSX0NNRDBfTkFORF9GTEFTSAkyMwotI2RlZmluZSBEU0NSX0NNRDBfUFNDMF9TWU5DCTI0Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MxX1NZTkMJMjUKLSNkZWZpbmUgRFNDUl9DTUQwX0NJTV9TWU5DCTI2Ci0jZW5kaWYgLyogQ09ORklHX1NPQ19BVTEyMDAgKi8KKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9VQVJUMF9UWAkwCisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfVUFSVDBfUlgJMQorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX1VBUlQxX1RYCTIKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9VQVJUMV9SWAkzCisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfRE1BX1JFUTAJNAorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX0RNQV9SRVExCTUKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9NQUVfQkUJCTYKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9NQUVfRkUJCTcKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1RYMAk4CisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfU0RNU19SWDAJOQorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfVFgxCTEwCisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfU0RNU19SWDEJMTEKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9BRVNfVFgJCTEzCisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfQUVTX1JYCQkxMgorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX1BTQzBfVFgJMTQKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9QU0MwX1JYCTE1CisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfUFNDMV9UWAkxNgorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX1BTQzFfUlgJMTcKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9DSU1fUlhBCTE4CisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfQ0lNX1JYQgkxOQorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX0NJTV9SWEMJMjAKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9NQUVfQk9USAkyMQorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX0xDRAkJMjIKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9OQU5EX0ZMQVNICTIzCisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9TWU5DCTI0CisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfUFNDMV9TWU5DCTI1CisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfQ0lNX1NZTkMJMjYKIAogI2RlZmluZSBEU0NSX0NNRDBfVEhST1RUTEUJMzAKICNkZWZpbmUgRFNDUl9DTUQwX0FMV0FZUwkzMQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9pZGUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgKaW5kZXggNTY1NmM3Mi4uZTMwNjM4NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9pZGUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oCkBAIC01OCw2ICs1OCw3IEBACiAjZW5kaWYKIAlpbnQJCQlpcnE7CiAJdTMyCQkJcmVnYmFzZTsKKwlpbnQJCQlkZG1hX2lkOwogfSBfYXVpZGVfaHdpZjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oCmluZGV4IDg5MmI3ZjEuLjRlM2YzYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaApAQCAtMzMsMTkgKzMzLDYgQEAKICNpZm5kZWYgX0FVMTAwMF9QU0NfSF8KICNkZWZpbmUgX0FVMTAwMF9QU0NfSF8KIAotLyogVGhlIFBTQyBiYXNlIGFkZHJlc3Nlcy4gICovCi0jaWZkZWYgQ09ORklHX1NPQ19BVTE1NTAKLSNkZWZpbmUgUFNDMF9CQVNFX0FERFIJCTB4YjFhMDAwMDAKLSNkZWZpbmUgUFNDMV9CQVNFX0FERFIJCTB4YjFiMDAwMDAKLSNkZWZpbmUgUFNDMl9CQVNFX0FERFIJCTB4YjBhMDAwMDAKLSNkZWZpbmUgUFNDM19CQVNFX0FERFIJCTB4YjBiMDAwMDAKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLSNkZWZpbmUgUFNDMF9CQVNFX0FERFIJCTB4YjFhMDAwMDAKLSNkZWZpbmUgUFNDMV9CQVNFX0FERFIJCTB4YjFiMDAwMDAKLSNlbmRpZgotCiAvKgogICogVGhlIFBTQyBzZWxlY3QgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSBjb21tb24gdG8gYWxsIHByb3RvY29scy4KICAqLwpAQCAtODAsMTkgKzY3LDYgQEAKICNkZWZpbmUgUFNDX0FDOTdHUE9fT0ZGU0VUCTB4MDAwMDAwMjgKICNkZWZpbmUgUFNDX0FDOTdHUElfT0ZGU0VUCTB4MDAwMDAwMmMKIAotI2RlZmluZSBBQzk3X1BTQ19TRUwJCShBQzk3X1BTQ19CQVNFICsgUFNDX1NFTF9PRkZTRVQpCi0jZGVmaW5lIEFDOTdfUFNDX0NUUkwJCShBQzk3X1BTQ19CQVNFICsgUFNDX0NUUkxfT0ZGU0VUKQotI2RlZmluZSBQU0NfQUM5N0NGRwkJKEFDOTdfUFNDX0JBU0UgKyBQU0NfQUM5N0NGR19PRkZTRVQpCi0jZGVmaW5lIFBTQ19BQzk3TVNLCQkoQUM5N19QU0NfQkFTRSArIFBTQ19BQzk3TVNLX09GRlNFVCkKLSNkZWZpbmUgUFNDX0FDOTdQQ1IJCShBQzk3X1BTQ19CQVNFICsgUFNDX0FDOTdQQ1JfT0ZGU0VUKQotI2RlZmluZSBQU0NfQUM5N1NUQVQJCShBQzk3X1BTQ19CQVNFICsgUFNDX0FDOTdTVEFUX09GRlNFVCkKLSNkZWZpbmUgUFNDX0FDOTdFVk5UCQkoQUM5N19QU0NfQkFTRSArIFBTQ19BQzk3RVZOVF9PRkZTRVQpCi0jZGVmaW5lIFBTQ19BQzk3VFhSWAkJKEFDOTdfUFNDX0JBU0UgKyBQU0NfQUM5N1RYUlhfT0ZGU0VUKQotI2RlZmluZSBQU0NfQUM5N0NEQwkJKEFDOTdfUFNDX0JBU0UgKyBQU0NfQUM5N0NEQ19PRkZTRVQpCi0jZGVmaW5lIFBTQ19BQzk3UlNUCQkoQUM5N19QU0NfQkFTRSArIFBTQ19BQzk3UlNUX09GRlNFVCkKLSNkZWZpbmUgUFNDX0FDOTdHUE8JCShBQzk3X1BTQ19CQVNFICsgUFNDX0FDOTdHUE9fT0ZGU0VUKQotI2RlZmluZSBQU0NfQUM5N0dQSQkJKEFDOTdfUFNDX0JBU0UgKyBQU0NfQUM5N0dQSV9PRkZTRVQpCi0KIC8qIEFDOTcgQ29uZmlnIFJlZ2lzdGVyLiAqLwogI2RlZmluZSBQU0NfQUM5N0NGR19SVF9NQVNLCSgzIDw8IDMwKQogI2RlZmluZSBQU0NfQUM5N0NGR19SVF9GSUZPMQkoMCA8PCAzMCkKQEAgLTM5NCwxOSArMzY4LDYgQEAKICNkZWZpbmUgUFNDX1NQSVRYUlhfTEMJCSgxIDw8IDI5KQogI2RlZmluZSBQU0NfU1BJVFhSWF9TUgkJKDEgPDwgMjgpCiAKLS8qIFBTQyBpbiBTTUJ1cyAoSTJDKSBNb2RlLiAqLwotdHlwZWRlZiBzdHJ1Y3QJcHNjX3NtYiB7Ci0JdTMyCXBzY19zZWw7Ci0JdTMyCXBzY19jdHJsOwotCXUzMglwc2Nfc21iY2ZnOwotCXUzMglwc2Nfc21ibXNrOwotCXUzMglwc2Nfc21icGNyOwotCXUzMglwc2Nfc21ic3RhdDsKLQl1MzIJcHNjX3NtYmV2bnQ7Ci0JdTMyCXBzY19zbWJ0eHJ4OwotCXUzMglwc2Nfc21idG1yOwotfSBwc2Nfc21iX3Q7Ci0KIC8qIFNNQnVzIENvbmZpZyBSZWdpc3Rlci4gKi8KICNkZWZpbmUgUFNDX1NNQkNGR19SVF9NQVNLCSgzIDw8IDMwKQogI2RlZmluZSBQU0NfU01CQ0ZHX1JUX0ZJRk8xCSgwIDw8IDMwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8tYXUxMDAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby1hdTEwMDAuaAppbmRleCAxZjQxYTUyLi43Mzg1M2I1YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8tYXUxMDAwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8tYXUxMDAwLmgKQEAgLTM0NywxNyArMzQ3LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE9uIEF1MTAwMCwgQXUxNTAwIGFuZCBBdTExMDAgR1BJT3Mgd29uJ3Qgd29yayBhcyBpbnB1dHMgYmVmb3JlCi0gKiBTWVNfUElOSU5QVVRFTiBpcyB3cml0dGVuIHRvIGF0IGxlYXN0IG9uY2UuICBPbiBBdTE1NTAvQXUxMjAwIHRoaXMKLSAqIHJlZ2lzdGVyIGVuYWJsZXMgdXNlIG9mIEdQSU9zIGFzIHdha2Ugc291cmNlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWxjaGVteV9ncGlvMV9pbnB1dF9lbmFibGUodm9pZCkKLXsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTAwMF9TWVNfUEhZU19BRERSKTsKLQlfX3Jhd193cml0ZWwoMCwgYmFzZSArIFNZU19QSU5JTlBVVEVOKTsJLyogdGhlIHdyaXRlIG9wIGlzIGtleSAqLwotCXdtYigpOwotfQotCiAvKiBHUElPMiBzaGFyZWQgaW50ZXJydXB0cyBhbmQgY29udHJvbCAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19hbGNoZW15X2dwaW8yX21vZF9pbnQoaW50IGdwaW8yLCBpbnQgZW4pCkBAIC01NjEsNiArNTUwLDcgQEAKIAogI2lmbmRlZiBDT05GSUdfR1BJT0xJQgogCisjaWZkZWYgQ09ORklHX0FMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAogI2lmbmRlZiBDT05GSUdfQUxDSEVNWV9HUElPX0lORElSRUNUCS8qIGNhc2UgKDQpICovCiAKQEAgLTY2NSwyNCArNjU1LDcgQEAKIAogI2VuZGlmCS8qICFDT05GSUdfQUxDSEVNWV9HUElPX0lORElSRUNUICovCiAKLQotI2Vsc2UJLyogQ09ORklHIEdQSU9MSUIgKi8KLQotCi0gLyogdXNpbmcgZ3Bpb2xpYiB0byBwcm92aWRlIHVwIHRvIDIgZ3Bpb19jaGlwcyBmb3Igb24tY2hpcCBncGlvcyAqLwotI2lmbmRlZiBDT05GSUdfQUxDSEVNWV9HUElPX0lORElSRUNUCS8qIGNhc2UgKDIpICovCi0KLS8qIGdldCBldmVyeXRoaW5nIHRocm91Z2ggZ3Bpb2xpYiAqLwotI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBpcnFfdG9fZ3BpbwlhbGNoZW15X2lycV90b19ncGlvCi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLSNlbmRpZgkvKiAhQ09ORklHX0FMQ0hFTVlfR1BJT19JTkRJUkVDVCAqLwotCisjZW5kaWYJLyogQ09ORklHX0FMQ0hFTVlfR1BJT0lOVF9BVTEwMDAgKi8KIAogI2VuZGlmCS8qICFDT05GSUdfR1BJT0xJQiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8uaAppbmRleCBjM2Y2MGNkLi5mY2RjOGM0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9ncGlvLmgKQEAgLTEsMTAgKzEsODMgQEAKKy8qCisgKiBBbGNoZW15IEdQSU8gc3VwcG9ydC4KKyAqCisgKiBXaXRoIENPTkZJR19HUElPTElCPXkgZGlmZmVyZW50IHR5cGVzIG9mIG9uLWNoaXAgR1BJTyBjYW4gYmUgc3VwcG9ydGVkIHdpdGhpbgorICogIHRoZSBzYW1lIGtlcm5lbCBpbWFnZS4KKyAqIFdpdGggQ09ORklHX0dQSU9MSUI9biwgeW91ciBib2FyZCBtdXN0IHNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxWFhYIGZvciB0aGUKKyAqICBhcHByb3ByaWF0ZSBDUFUgdHlwZSAoQVUxMDAwIGN1cnJlbnRseSkuCisgKi8KKwogI2lmbmRlZiBfQUxDSEVNWV9HUElPX0hfCiAjZGVmaW5lIF9BTENIRU1ZX0dQSU9fSF8KIAotI2lmIGRlZmluZWQoQ09ORklHX0FMQ0hFTVlfR1BJT0lOVF9BVTEwMDApCi0KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2dwaW8tYXUxMDAwLmg+CiAKLSNlbmRpZgorLyogT24gQXUxMDAwLCBBdTE1MDAgYW5kIEF1MTEwMCBHUElPcyB3b24ndCB3b3JrIGFzIGlucHV0cyBiZWZvcmUKKyAqIFNZU19QSU5JTlBVVEVOIGlzIHdyaXR0ZW4gdG8gYXQgbGVhc3Qgb25jZS4gIE9uIEF1MTU1MC9BdTEyMDAvQXUxMzAwIHRoaXMKKyAqIHJlZ2lzdGVyIGVuYWJsZXMgdXNlIG9mIEdQSU9zIGFzIHdha2Ugc291cmNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWxjaGVteV9ncGlvMV9pbnB1dF9lbmFibGUodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTAwMF9TWVNfUEhZU19BRERSKTsKKwlfX3Jhd193cml0ZWwoMCwgYmFzZSArIDB4MTEwKTsJCS8qIHRoZSB3cml0ZSBvcCBpcyBrZXkgKi8KKwl3bWIoKTsKK30KKworCisvKiBMaW51eCBncGlvIGZyYW1ld29yayBpbnRlZ3JhdGlvbi4KKyoKKyogNCB1c2UgY2FzZXMgb2YgQWxjaGVteSBHUElPUzoKKyooMSkgR1BJT0xJQj15LCBBTENIRU1ZX0dQSU9fSU5ESVJFQ1Q9eToKKyoJQm9hcmQgbXVzdCByZWdpc3RlciBncGlvY2hpcHMuCisqKDIpIEdQSU9MSUI9eSwgQUxDSEVNWV9HUElPX0lORElSRUNUPW46CisqCUEgZ3Bpb2NoaXAgZm9yIHRoZSA3NSBHUElPcyBpcyByZWdpc3RlcmVkLgorKgorKigzKSBHUElPTElCPW4sIEFMQ0hFTVlfR1BJT19JTkRJUkVDVD15OgorKgl0aGUgYm9hcmRzJyBncGlvLmggbXVzdCBwcm92aWRlCXRoZSBsaW51eCBncGlvIHdyYXBwZXIgZnVuY3Rpb25zLAorKgorKig0KSBHUElPTElCPW4sIEFMQ0hFTVlfR1BJT19JTkRJUkVDVD1uOgorKglpbmxpbmFibGUgZ3BpbyBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHdoaWNoIGVuYWJsZSBhY2Nlc3MgdG8gdGhlCisqCUF1MTMwMCBncGlvcyBvbmx5IGJ5IHVzaW5nIHRoZSBudW1iZXJzIHN0cmFpZ2h0IG91dCBvZiB0aGUgZGF0YS0KKyoJc2hlZXRzLgorCisqIENhc2VzIDEgYW5kIDMgYXJlIGludGVuZGVkIGZvciBib2FyZHMgd2hpY2ggd2FudCB0byBwcm92aWRlIHRoZWlyIG93bgorKiBHUElPIG5hbWVzcGFjZSBhbmQgLW9wZXJhdGlvbnMgKGkuZS4gZm9yIGV4YW1wbGUgeW91IGhhdmUgOCBHUElPcworKiB3aGljaCBhcmUgaW4gcGFydCBwcm92aWRlZCBieSBzcGFyZSBBdTEzMDAgR1BJTyBwaW5zIGFuZCBpbiBwYXJ0IGJ5CisqIGFuIGV4dGVybmFsIEZQR0EgYnV0IHlvdSBzdGlsbCB3YW50IHRoZW0gdG8gYmUgYWNjc3NpYmxlIGluIGxpbnV4CisqIGFzIGdwaW8wLTcuIFRoZSBib2FyZCBjYW4gb2YgY291cnNlIHVzZSB0aGUgYWxjaGVteV9ncGlvWF8qIGZ1bmN0aW9ucworKiBhcyByZXF1aXJlZCkuCisqLworCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKworLyogd3JhcHMgdGhlIGNwdS1kZXBlbmRlbnQgaXJxX3RvX2dwaW8gZnVuY3Rpb25zICovCisvKiBGSVhNRTogZ3Bpb2xpYiBuZWVkcyBhbiBpcnFfdG9fZ3BpbyBob29rICovCitzdGF0aWMgaW5saW5lIGludCBfX2F1X2lycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTAwMC4uLkFMQ0hFTVlfQ1BVX0FVMTIwMDoKKwkJcmV0dXJuIGFsY2hlbXlfaXJxX3RvX2dwaW8oaXJxKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworLyogdXNpbmcgZ3Bpb2xpYiB0byBwcm92aWRlIHVwIHRvIDIgZ3Bpb19jaGlwcyBmb3Igb24tY2hpcCBncGlvcyAqLworI2lmbmRlZiBDT05GSUdfQUxDSEVNWV9HUElPX0lORElSRUNUCS8qIGNhc2UgKDIpICovCisKKy8qIGdldCBldmVyeXRoaW5nIHRocm91Z2ggZ3Bpb2xpYiAqLworI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCisjZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKKyNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQorI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAorI2RlZmluZSBpcnFfdG9fZ3BpbwlfX2F1X2lycV90b19ncGlvCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CisKKyNlbmRpZgkvKiAhQ09ORklHX0FMQ0hFTVlfR1BJT19JTkRJUkVDVCAqLworCisKKyNlbmRpZgkvKiBDT05GSUdfR1BJT0xJQiAqLwogCiAjZW5kaWYJLyogX0FMQ0hFTVlfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMTIwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMTIwMC5oCmluZGV4IDM0MDQyNDguLjdhMzk2NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMC9kYjEyMDAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxMjAwLmgKQEAgLTQ2LDggKzQ2LDYgQEAKIAogI2RlZmluZSBJREVfUEhZU19BRERSCQkweDE4ODAwMDAwCiAjZGVmaW5lIElERV9SRUdfU0hJRlQJCTUKLSNkZWZpbmUgSURFX0RETUFfUkVRCQlEU0NSX0NNRDBfRE1BX1JFUTEKLSNkZWZpbmUgSURFX1JRU0laRQkJMTI4CiAKICNkZWZpbmUgREIxMjAwX0lERV9QSFlTX0FERFIJSURFX1BIWVNfQUREUgogI2RlZmluZSBEQjEyMDBfSURFX1BIWVNfTEVOCSgxNiA8PCBJREVfUkVHX1NISUZUKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMXgwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMXgwMC5oCmluZGV4IGE5MTlkYWMuLmE1YWZmYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMC9kYjF4MDAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxeDAwLmgKQEAgLTMxLDE1ICszMSwxNSBAQAogCiAjaWZkZWYgQ09ORklHX01JUFNfREIxNTUwCiAKLSNkZWZpbmUgREJETUFfQUM5N19UWF9DSEFOCURTQ1JfQ01EMF9QU0MxX1RYCi0jZGVmaW5lIERCRE1BX0FDOTdfUlhfQ0hBTglEU0NSX0NNRDBfUFNDMV9SWAotI2RlZmluZSBEQkRNQV9JMlNfVFhfQ0hBTglEU0NSX0NNRDBfUFNDM19UWAotI2RlZmluZSBEQkRNQV9JMlNfUlhfQ0hBTglEU0NSX0NNRDBfUFNDM19SWAorI2RlZmluZSBEQkRNQV9BQzk3X1RYX0NIQU4JQVUxNTUwX0RTQ1JfQ01EMF9QU0MxX1RYCisjZGVmaW5lIERCRE1BX0FDOTdfUlhfQ0hBTglBVTE1NTBfRFNDUl9DTUQwX1BTQzFfUlgKKyNkZWZpbmUgREJETUFfSTJTX1RYX0NIQU4JQVUxNTUwX0RTQ1JfQ01EMF9QU0MzX1RYCisjZGVmaW5lIERCRE1BX0kyU19SWF9DSEFOCUFVMTU1MF9EU0NSX0NNRDBfUFNDM19SWAogCi0jZGVmaW5lIFNQSV9QU0NfQkFTRQkJUFNDMF9CQVNFX0FERFIKLSNkZWZpbmUgQUM5N19QU0NfQkFTRQkJUFNDMV9CQVNFX0FERFIKLSNkZWZpbmUgU01CVVNfUFNDX0JBU0UJCVBTQzJfQkFTRV9BRERSCi0jZGVmaW5lIEkyU19QU0NfQkFTRQkJUFNDM19CQVNFX0FERFIKKyNkZWZpbmUgU1BJX1BTQ19CQVNFCQlBVTE1NTBfUFNDMF9QSFlTX0FERFIKKyNkZWZpbmUgQUM5N19QU0NfQkFTRQkJQVUxNTUwX1BTQzFfUEhZU19BRERSCisjZGVmaW5lIFNNQlVTX1BTQ19CQVNFCQlBVTE1NTBfUFNDMl9QSFlTX0FERFIKKyNkZWZpbmUgSTJTX1BTQ19CQVNFCQlBVTE1NTBfUFNDM19QSFlTX0FERFIKIAogI2RlZmluZSBOQU5EX1BIWVNfQUREUgkJMHgyMDAwMDAwMAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvcGIxMjAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvcGIxMjAwLmgKaW5kZXggZmNlNDMzMi4uMzc0NDE2YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTIwMC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjEyMDAuaApAQCAtMjgsMjMgKzI4LDIzIEBACiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmg+CiAKLSNkZWZpbmUgREJETUFfQUM5N19UWF9DSEFOCURTQ1JfQ01EMF9QU0MxX1RYCi0jZGVmaW5lIERCRE1BX0FDOTdfUlhfQ0hBTglEU0NSX0NNRDBfUFNDMV9SWAotI2RlZmluZSBEQkRNQV9JMlNfVFhfQ0hBTglEU0NSX0NNRDBfUFNDMV9UWAotI2RlZmluZSBEQkRNQV9JMlNfUlhfQ0hBTglEU0NSX0NNRDBfUFNDMV9SWAorI2RlZmluZSBEQkRNQV9BQzk3X1RYX0NIQU4JQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1RYCisjZGVmaW5lIERCRE1BX0FDOTdfUlhfQ0hBTglBVTEyMDBfRFNDUl9DTUQwX1BTQzFfUlgKKyNkZWZpbmUgREJETUFfSTJTX1RYX0NIQU4JQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1RYCisjZGVmaW5lIERCRE1BX0kyU19SWF9DSEFOCUFVMTIwMF9EU0NSX0NNRDBfUFNDMV9SWAogCiAvKgogICogU1BJIGFuZCBTTUIgYXJlIG11eGVkIG9uIHRoZSBQYjEyMDAgYm9hcmQuCiAgKiBSZWZlciB0byBib2FyZCBkb2N1bWVudGF0aW9uLgogICovCi0jZGVmaW5lIFNQSV9QU0NfQkFTRQkJUFNDMF9CQVNFX0FERFIKLSNkZWZpbmUgU01CVVNfUFNDX0JBU0UJCVBTQzBfQkFTRV9BRERSCisjZGVmaW5lIFNQSV9QU0NfQkFTRQkJQVUxNTUwX1BTQzBfUEhZU19BRERSCisjZGVmaW5lIFNNQlVTX1BTQ19CQVNFCQlBVTE1NTBfUFNDMF9QSFlTX0FERFIKIC8qCiAgKiBBQzk3IGFuZCBJMlMgYXJlIG11eGVkIG9uIHRoZSBQYjEyMDAgYm9hcmQuCiAgKiBSZWZlciB0byBib2FyZCBkb2N1bWVudGF0aW9uLgogICovCi0jZGVmaW5lIEFDOTdfUFNDX0JBU0UgICAgICAgUFNDMV9CQVNFX0FERFIKLSNkZWZpbmUgSTJTX1BTQ19CQVNFCVBTQzFfQkFTRV9BRERSCisjZGVmaW5lIEFDOTdfUFNDX0JBU0UgICAgICAgQVUxNTUwX1BTQzFfUEhZU19BRERSCisjZGVmaW5lIEkyU19QU0NfQkFTRQlBVTE1NTBfUFNDMV9QSFlTX0FERFIKIAogCiAjZGVmaW5lIEJDU1JfU1lTVEVNX1ZEREkJMHgwMDFGCkBAIC03Niw4ICs3Niw2IEBACiAjZGVmaW5lIElERV9SRUdfU0hJRlQJCTUKICNkZWZpbmUgSURFX1BIWVNfTEVOCQkoMTYgPDwgSURFX1JFR19TSElGVCkKICNkZWZpbmUgSURFX0lOVCAJCVBCMTIwMF9JREVfSU5UCi0jZGVmaW5lIElERV9ERE1BX1JFUQkJRFNDUl9DTUQwX0RNQV9SRVExCi0jZGVmaW5lIElERV9SUVNJWkUJCTEyOAogCiAjZGVmaW5lIE5BTkRfUEhZU19BRERSIAkweDFDMDAwMDAwCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjE1NTAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjE1NTAuaAppbmRleCBmODM1Yzg4Li40NDNiODhhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvcGIxNTUwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTU1MC5oCkBAIC0zMCwxNSArMzAsMTUgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmg+CiAKLSNkZWZpbmUgREJETUFfQUM5N19UWF9DSEFOCURTQ1JfQ01EMF9QU0MxX1RYCi0jZGVmaW5lIERCRE1BX0FDOTdfUlhfQ0hBTglEU0NSX0NNRDBfUFNDMV9SWAotI2RlZmluZSBEQkRNQV9JMlNfVFhfQ0hBTglEU0NSX0NNRDBfUFNDM19UWAotI2RlZmluZSBEQkRNQV9JMlNfUlhfQ0hBTglEU0NSX0NNRDBfUFNDM19SWAorI2RlZmluZSBEQkRNQV9BQzk3X1RYX0NIQU4JQVUxNTUwX0RTQ1JfQ01EMF9QU0MxX1RYCisjZGVmaW5lIERCRE1BX0FDOTdfUlhfQ0hBTglBVTE1NTBfRFNDUl9DTUQwX1BTQzFfUlgKKyNkZWZpbmUgREJETUFfSTJTX1RYX0NIQU4JQVUxNTUwX0RTQ1JfQ01EMF9QU0MzX1RYCisjZGVmaW5lIERCRE1BX0kyU19SWF9DSEFOCUFVMTU1MF9EU0NSX0NNRDBfUFNDM19SWAogCi0jZGVmaW5lIFNQSV9QU0NfQkFTRQkJUFNDMF9CQVNFX0FERFIKLSNkZWZpbmUgQUM5N19QU0NfQkFTRQkJUFNDMV9CQVNFX0FERFIKLSNkZWZpbmUgU01CVVNfUFNDX0JBU0UJCVBTQzJfQkFTRV9BRERSCi0jZGVmaW5lIEkyU19QU0NfQkFTRQkJUFNDM19CQVNFX0FERFIKKyNkZWZpbmUgU1BJX1BTQ19CQVNFCQlBVTE1NTBfUFNDMF9QSFlTX0FERFIKKyNkZWZpbmUgQUM5N19QU0NfQkFTRQkJQVUxNTUwX1BTQzFfUEhZU19BRERSCisjZGVmaW5lIFNNQlVTX1BTQ19CQVNFCQlBVTE1NTBfUFNDMl9QSFlTX0FERFIKKyNkZWZpbmUgSTJTX1BTQ19CQVNFCQlBVTE1NTBfUFNDM19QSFlTX0FERFIKIAogLyoKICAqIFRpbWluZyB2YWx1ZXMgYXMgZGVzY3JpYmVkIGluIGRhdGFib29rLCAqIG5zIHZhbHVlIHN0cmlwcGVkIG9mCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3Byb20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcHJvbS5oCmluZGV4IDE0NmQ0MWIuLmU5Mzk0M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcHJvbS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcHJvbS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9NSVBTX1BST01fSAotI2RlZmluZSBfX0FTTV9NSVBTX1BST01fSAorI2lmbmRlZiBfX0FTTV9NSVBTUFJPTV9ICisjZGVmaW5lIF9fQVNNX01JUFNQUk9NX0gKIAogI2RlZmluZSBQUk9NX1JFU0VUCQkwCiAjZGVmaW5lIFBST01fRVhFQwkJMQpAQCAtNzMsNCArNzMsNCBAQAogCiBleHRlcm4gY2hhciAqcHJvbV9nZXRlbnYoY2hhciAqKTsKIAotI2VuZGlmIC8qIF9fQVNNX01JUFNfUFJPTV9IICovCisjZW5kaWYgLyogX19BU01fTUlQU1BST01fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaAppbmRleCA2YTZmOGE4Li4yZWE3YjgxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaApAQCAtMTAwNiwxOCArMTAwNiwyNiBAQAogI2RlZmluZSB3cml0ZV9jMF9wZXJmY3RybDAodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMCwgdmFsKQogI2RlZmluZSByZWFkX2MwX3BlcmZjbnRyMCgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDEpCiAjZGVmaW5lIHdyaXRlX2MwX3BlcmZjbnRyMCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAxLCB2YWwpCisjZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIwXzY0KCkJX19yZWFkXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgMSkKKyNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIwXzY0KHZhbCkgX193cml0ZV82NGJpdF9jMF9yZWdpc3RlcigkMjUsIDEsIHZhbCkKICNkZWZpbmUgcmVhZF9jMF9wZXJmY3RybDEoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAyKQogI2RlZmluZSB3cml0ZV9jMF9wZXJmY3RybDEodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMiwgdmFsKQogI2RlZmluZSByZWFkX2MwX3BlcmZjbnRyMSgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDMpCiAjZGVmaW5lIHdyaXRlX2MwX3BlcmZjbnRyMSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAzLCB2YWwpCisjZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIxXzY0KCkJX19yZWFkXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgMykKKyNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIxXzY0KHZhbCkgX193cml0ZV82NGJpdF9jMF9yZWdpc3RlcigkMjUsIDMsIHZhbCkKICNkZWZpbmUgcmVhZF9jMF9wZXJmY3RybDIoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA0KQogI2RlZmluZSB3cml0ZV9jMF9wZXJmY3RybDIodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgNCwgdmFsKQogI2RlZmluZSByZWFkX2MwX3BlcmZjbnRyMigpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDUpCiAjZGVmaW5lIHdyaXRlX2MwX3BlcmZjbnRyMih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA1LCB2YWwpCisjZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIyXzY0KCkJX19yZWFkXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgNSkKKyNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIyXzY0KHZhbCkgX193cml0ZV82NGJpdF9jMF9yZWdpc3RlcigkMjUsIDUsIHZhbCkKICNkZWZpbmUgcmVhZF9jMF9wZXJmY3RybDMoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA2KQogI2RlZmluZSB3cml0ZV9jMF9wZXJmY3RybDModmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgNiwgdmFsKQogI2RlZmluZSByZWFkX2MwX3BlcmZjbnRyMygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDcpCiAjZGVmaW5lIHdyaXRlX2MwX3BlcmZjbnRyMyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA3LCB2YWwpCisjZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIzXzY0KCkJX19yZWFkXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgNykKKyNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIzXzY0KHZhbCkgX193cml0ZV82NGJpdF9jMF9yZWdpc3RlcigkMjUsIDcsIHZhbCkKIAogLyogUk05MDAwIFBlcmZDb3VudCBwZXJmb3JtYW5jZSBjb3VudGVyIHJlZ2lzdGVyICovCiAjZGVmaW5lIHJlYWRfYzBfcGVyZmNvdW50KCkJX19yZWFkXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvbS5oCmluZGV4IDg1N2Q5YjcuLjdhNmU4MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wcm9tLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtOCw4ICs4LDggQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKICAqLwotI2lmbmRlZiBfX0FTTV9NSVBTX1BST01fSAotI2RlZmluZSBfX0FTTV9NSVBTX1BST01fSAorI2lmbmRlZiBfX0FTTV9QUk9NX0gKKyNkZWZpbmUgX19BU01fUFJPTV9ICiAKICNpZmRlZiBDT05GSUdfT0YKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KQEAgLTI1LDQgKzI1LDQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZpY2VfdHJlZV9pbml0KHZvaWQpIHsgfQogI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCi0jZW5kaWYgLyogX0FTTV9NSVBTX1BST01fSCAqLworI2VuZGlmIC8qIF9fQVNNX1BST01fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3JlZ2RlZi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3JlZ2RlZi5oCmluZGV4IDdjOGVjYjYuLjc4NWE1MTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9yZWdkZWYuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcmVnZGVmLmgKQEAgLTYsNiArNiw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5ODUgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5OSwgMjAwMyBieSBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMTk5MCAtIDE5OTIsIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDExIFdpbmQgUml2ZXIgU3lzdGVtcywKKyAqICAgd3JpdHRlbiBieSBSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+CiAgKi8KICNpZm5kZWYgX0FTTV9SRUdERUZfSAogI2RlZmluZSBfQVNNX1JFR0RFRl9ICkBAIC0zMCw5ICszMiwxMyBAQAogI2RlZmluZSB0MiAgICAgICQxMAogI2RlZmluZSB0MyAgICAgICQxMQogI2RlZmluZSB0NCAgICAgICQxMgorI2RlZmluZSB0YTAJJDEyCiAjZGVmaW5lIHQ1ICAgICAgJDEzCisjZGVmaW5lIHRhMQkkMTMKICNkZWZpbmUgdDYgICAgICAkMTQKKyNkZWZpbmUgdGEyCSQxNAogI2RlZmluZSB0NyAgICAgICQxNQorI2RlZmluZSB0YTMJJDE1CiAjZGVmaW5lIHMwICAgICAgJDE2ICAgICAvKiBjYWxsZWUgc2F2ZWQgKi8KICNkZWZpbmUgczEgICAgICAkMTcKICNkZWZpbmUgczIgICAgICAkMTgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCA5ZGU1MTkwLi5hZDVjMGE3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC04Miw2ICs4Miw5IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjaWZkZWYgX19LRVJORUxfXwogCiAvKiogc29ja190eXBlIC0gU29ja2V0IHR5cGVzCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL2dwaW8uYyBiL2FyY2gvbWlwcy9qejQ3NDAvZ3Bpby5jCmluZGV4IDQzOTc5NzIuLmUxZGRiOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qejQ3NDAvZ3Bpby5jCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvZ3Bpby5jCkBAIC0xNyw4ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0zMCw2ICsyOCw4IEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvYmFzZS5oPgogCisjaW5jbHVkZSAiaXJxLmgiCisKICNkZWZpbmUgSlo0NzQwX0dQSU9fQkFTRV9BICgzMiowKQogI2RlZmluZSBKWjQ3NDBfR1BJT19CQVNFX0IgKDMyKjEpCiAjZGVmaW5lIEpaNDc0MF9HUElPX0JBU0VfQyAoMzIqMikKQEAgLTc3LDE0ICs3NywxMCBAQAogc3RydWN0IGp6X2dwaW9fY2hpcCB7CiAJdW5zaWduZWQgaW50IGlycTsKIAl1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7Ci0JdWludDMyX3Qgd2FrZXVwOwotCXVpbnQzMl90IHN1c3BlbmRfbWFzazsKIAl1aW50MzJfdCBlZGdlX3RyaWdnZXJfYm90aDsKIAogCXZvaWQgX19pb21lbSAqYmFzZTsKIAotCXNwaW5sb2NrX3QgbG9jazsKLQogCXN0cnVjdCBncGlvX2NoaXAgZ3Bpb19jaGlwOwogfTsKIApAQCAtMTAyLDcgKzk4LDggQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QganpfZ3Bpb19jaGlwICppcnFfdG9fanpfZ3Bpb19jaGlwKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlyZXR1cm4gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJcmV0dXJuIGdjLT5wcml2YXRlOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQganpfZ3Bpb193cml0ZV9iaXQodW5zaWduZWQgaW50IGdwaW8sIHVuc2lnbmVkIGludCByZWcpCkBAIC0zMDQsMjEgKzMwMSwxNSBAQAogewogCXVpbnQzMl90IGZsYWc7CiAJdW5zaWduZWQgaW50IGdwaW9faXJxOwotCXVuc2lnbmVkIGludCBncGlvX2Jhbms7CiAJc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CiAKLQlncGlvX2JhbmsgPSBKWjQ3NDBfSVJRX0dQSU8wIC0gaXJxOwotCiAJZmxhZyA9IHJlYWRsKGNoaXAtPmJhc2UgKyBKWl9SRUdfR1BJT19GTEFHKTsKLQogCWlmICghZmxhZykKIAkJcmV0dXJuOwogCi0JZ3Bpb19pcnEgPSBfX2ZscyhmbGFnKTsKKwlncGlvX2lycSA9IGNoaXAtPmlycV9iYXNlICsgX19mbHMoZmxhZyk7CiAKLQlqel9ncGlvX2NoZWNrX3RyaWdnZXJfYm90aChjaGlwLCBpcnEpOwotCi0JZ3Bpb19pcnEgKz0gKGdwaW9fYmFuayA8PCA1KSArIEpaNDc0MF9JUlFfR1BJTygwKTsKKwlqel9ncGlvX2NoZWNrX3RyaWdnZXJfYm90aChjaGlwLCBncGlvX2lycSk7CiAKIAlnZW5lcmljX2hhbmRsZV9pcnEoZ3Bpb19pcnEpOwogfTsKQEAgLTMyOSwxOCArMzIwLDEyIEBACiAJd3JpdGVsKElSUV9UT19CSVQoZGF0YS0+aXJxKSwgY2hpcC0+YmFzZSArIHJlZyk7CiB9CiAKLXN0YXRpYyB2b2lkIGp6X2dwaW9faXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCWp6X2dwaW9fc2V0X2lycV9iaXQoZGF0YSwgSlpfUkVHX0dQSU9fTUFTS19TRVQpOwotfTsKLQogc3RhdGljIHZvaWQganpfZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKIAlzdHJ1Y3QganpfZ3Bpb19jaGlwICpjaGlwID0gaXJxX3RvX2p6X2dwaW9fY2hpcChkYXRhKTsKIAogCWp6X2dwaW9fY2hlY2tfdHJpZ2dlcl9ib3RoKGNoaXAsIGRhdGEtPmlycSk7Ci0KLQlqel9ncGlvX3NldF9pcnFfYml0KGRhdGEsIEpaX1JFR19HUElPX01BU0tfQ0xFQVIpOworCWlycV9nY191bm1hc2tfZW5hYmxlX3JlZyhkYXRhKTsKIH07CiAKIC8qIFRPRE86IENoZWNrIGlmIGZ1bmN0aW9uIGlzIGdwaW8gKi8KQEAgLTM1MywxOCArMzM4LDEzIEBACiAKIHN0YXRpYyB2b2lkIGp6X2dwaW9faXJxX3NodXRkb3duKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlqel9ncGlvX2lycV9tYXNrKGRhdGEpOworCWlycV9nY19tYXNrX2Rpc2FibGVfcmVnKGRhdGEpOwogCiAJLyogU2V0IGRpcmVjdGlvbiB0byBpbnB1dCAqLwogCWp6X2dwaW9fc2V0X2lycV9iaXQoZGF0YSwgSlpfUkVHX0dQSU9fRElSRUNUSU9OX0NMRUFSKTsKIAlqel9ncGlvX3NldF9pcnFfYml0KGRhdGEsIEpaX1JFR19HUElPX1NFTEVDVF9DTEVBUik7CiB9CiAKLXN0YXRpYyB2b2lkIGp6X2dwaW9faXJxX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0JanpfZ3Bpb19zZXRfaXJxX2JpdChkYXRhLCBKWl9SRUdfR1BJT19GTEFHX0NMRUFSKTsKLX07Ci0KIHN0YXRpYyBpbnQganpfZ3Bpb19pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQogewogCXN0cnVjdCBqel9ncGlvX2NoaXAgKmNoaXAgPSBpcnFfdG9fanpfZ3Bpb19jaGlwKGRhdGEpOwpAQCAtNDA4LDM1ICszODgsMTMgQEAKIHN0YXRpYyBpbnQganpfZ3Bpb19pcnFfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgb24pCiB7CiAJc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCA9IGlycV90b19qel9ncGlvX2NoaXAoZGF0YSk7Ci0Jc3Bpbl9sb2NrKCZjaGlwLT5sb2NrKTsKLQlpZiAob24pCi0JCWNoaXAtPndha2V1cCB8PSBJUlFfVE9fQklUKGRhdGEtPmlycSk7Ci0JZWxzZQotCQljaGlwLT53YWtldXAgJj0gfklSUV9UT19CSVQoZGF0YS0+aXJxKTsKLQlzcGluX3VubG9jaygmY2hpcC0+bG9jayk7CiAKKwlpcnFfZ2Nfc2V0X3dha2UoZGF0YSwgb24pOwogCWlycV9zZXRfaXJxX3dha2UoY2hpcC0+aXJxLCBvbik7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBqel9ncGlvX2lycV9jaGlwID0gewotCS5uYW1lID0gIkdQSU8iLAotCS5pcnFfbWFzayA9IGp6X2dwaW9faXJxX21hc2ssCi0JLmlycV91bm1hc2sgPSBqel9ncGlvX2lycV91bm1hc2ssCi0JLmlycV9hY2sgPSBqel9ncGlvX2lycV9hY2ssCi0JLmlycV9zdGFydHVwID0ganpfZ3Bpb19pcnFfc3RhcnR1cCwKLQkuaXJxX3NodXRkb3duID0ganpfZ3Bpb19pcnFfc2h1dGRvd24sCi0JLmlycV9zZXRfdHlwZSA9IGp6X2dwaW9faXJxX3NldF90eXBlLAotCS5pcnFfc2V0X3dha2UgPSBqel9ncGlvX2lycV9zZXRfd2FrZSwKLQkuZmxhZ3MgPSBJUlFDSElQX1NFVF9UWVBFX01BU0tFRCwKLX07Ci0KLS8qCi0gKiBUaGlzIGxvY2sgY2xhc3MgdGVsbHMgbG9ja2RlcCB0aGF0IEdQSU8gaXJxcyBhcmUgaW4gYSBkaWZmZXJlbnQKLSAqIGNhdGVnb3J5IHRoYW4gdGhlaXIgcGFyZW50cywgc28gaXQgd29uJ3QgcmVwb3J0IGZhbHNlIHJlY3Vyc2lvbi4KLSAqLwotc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBncGlvX2xvY2tfY2xhc3M7Ci0KICNkZWZpbmUgSlo0NzQwX0dQSU9fQ0hJUChfYmFuaykgeyBcCiAJLmlycV9iYXNlID0gSlo0NzQwX0lSUV9HUElPX0JBU0VfICMjIF9iYW5rLCBcCiAJLmdwaW9fY2hpcCA9IHsgXApAQCAtNDU4LDY0ICs0MTYsNDQgQEAKIAlKWjQ3NDBfR1BJT19DSElQKEQpLAogfTsKIAotc3RhdGljIHZvaWQgano0NzQwX2dwaW9fc3VzcGVuZF9jaGlwKHN0cnVjdCBqel9ncGlvX2NoaXAgKmNoaXApCi17Ci0JY2hpcC0+c3VzcGVuZF9tYXNrID0gcmVhZGwoY2hpcC0+YmFzZSArIEpaX1JFR19HUElPX01BU0spOwotCXdyaXRlbCh+KGNoaXAtPndha2V1cCksIGNoaXAtPmJhc2UgKyBKWl9SRUdfR1BJT19NQVNLX1NFVCk7Ci0Jd3JpdGVsKGNoaXAtPndha2V1cCwgY2hpcC0+YmFzZSArIEpaX1JFR19HUElPX01BU0tfQ0xFQVIpOwotfQotCi1zdGF0aWMgaW50IGp6NDc0MF9ncGlvX3N1c3BlbmQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGp6NDc0MF9ncGlvX2NoaXBzKTsgaSsrKQotCQlqejQ3NDBfZ3Bpb19zdXNwZW5kX2NoaXAoJmp6NDc0MF9ncGlvX2NoaXBzW2ldKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBqejQ3NDBfZ3Bpb19yZXN1bWVfY2hpcChzdHJ1Y3QganpfZ3Bpb19jaGlwICpjaGlwKQotewotCXVpbnQzMl90IG1hc2sgPSBjaGlwLT5zdXNwZW5kX21hc2s7Ci0KLQl3cml0ZWwofm1hc2ssIGNoaXAtPmJhc2UgKyBKWl9SRUdfR1BJT19NQVNLX0NMRUFSKTsKLQl3cml0ZWwobWFzaywgY2hpcC0+YmFzZSArIEpaX1JFR19HUElPX01BU0tfU0VUKTsKLX0KLQotc3RhdGljIHZvaWQgano0NzQwX2dwaW9fcmVzdW1lKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSBBUlJBWV9TSVpFKGp6NDc0MF9ncGlvX2NoaXBzKSAtIDE7IGkgPj0gMCA7IGktLSkKLQkJano0NzQwX2dwaW9fcmVzdW1lX2NoaXAoJmp6NDc0MF9ncGlvX2NoaXBzW2ldKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBqejQ3NDBfZ3Bpb19zeXNjb3JlX29wcyA9IHsKLQkuc3VzcGVuZCA9IGp6NDc0MF9ncGlvX3N1c3BlbmQsCi0JLnJlc3VtZSA9IGp6NDc0MF9ncGlvX3Jlc3VtZSwKLX07Ci0KIHN0YXRpYyB2b2lkIGp6NDc0MF9ncGlvX2NoaXBfaW5pdChzdHJ1Y3QganpfZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgaWQpCiB7Ci0JaW50IGlycTsKLQotCXNwaW5fbG9ja19pbml0KCZjaGlwLT5sb2NrKTsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0OwogCiAJY2hpcC0+YmFzZSA9IGlvcmVtYXAoSlo0NzQwX0dQSU9fQkFTRV9BRERSICsgKGlkICogMHgxMDApLCAweDEwMCk7CiAKLQlncGlvY2hpcF9hZGQoJmNoaXAtPmdwaW9fY2hpcCk7Ci0KIAljaGlwLT5pcnEgPSBKWjQ3NDBfSVJRX0lOVENfR1BJTyhpZCk7CiAJaXJxX3NldF9oYW5kbGVyX2RhdGEoY2hpcC0+aXJxLCBjaGlwKTsKIAlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihjaGlwLT5pcnEsIGp6X2dwaW9faXJxX2RlbXV4X2hhbmRsZXIpOwogCi0JZm9yIChpcnEgPSBjaGlwLT5pcnFfYmFzZTsgaXJxIDwgY2hpcC0+aXJxX2Jhc2UgKyBjaGlwLT5ncGlvX2NoaXAubmdwaW87ICsraXJxKSB7Ci0JCWlycV9zZXRfbG9ja2RlcF9jbGFzcyhpcnEsICZncGlvX2xvY2tfY2xhc3MpOwotCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGNoaXApOwotCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmanpfZ3Bpb19pcnFfY2hpcCwKLQkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwotCX0KKwlnYyA9IGlycV9hbGxvY19nZW5lcmljX2NoaXAoY2hpcC0+Z3Bpb19jaGlwLmxhYmVsLCAxLCBjaGlwLT5pcnFfYmFzZSwKKwkJY2hpcC0+YmFzZSwgaGFuZGxlX2xldmVsX2lycSk7CisKKwlnYy0+d2FrZV9lbmFibGVkID0gSVJRX01TSyhjaGlwLT5ncGlvX2NoaXAubmdwaW8pOworCWdjLT5wcml2YXRlID0gY2hpcDsKKworCWN0ID0gZ2MtPmNoaXBfdHlwZXM7CisJY3QtPnJlZ3MuZW5hYmxlID0gSlpfUkVHX0dQSU9fTUFTS19DTEVBUjsKKwljdC0+cmVncy5kaXNhYmxlID0gSlpfUkVHX0dQSU9fTUFTS19TRVQ7CisJY3QtPnJlZ3MuYWNrID0gSlpfUkVHX0dQSU9fRkxBR19DTEVBUjsKKworCWN0LT5jaGlwLm5hbWUgPSAiR1BJTyI7CisJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19kaXNhYmxlX3JlZzsKKwljdC0+Y2hpcC5pcnFfdW5tYXNrID0ganpfZ3Bpb19pcnFfdW5tYXNrOworCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrX3NldF9iaXQ7CisJY3QtPmNoaXAuaXJxX3N1c3BlbmQgPSBqejQ3NDBfaXJxX3N1c3BlbmQ7CisJY3QtPmNoaXAuaXJxX3Jlc3VtZSA9IGp6NDc0MF9pcnFfcmVzdW1lOworCWN0LT5jaGlwLmlycV9zdGFydHVwID0ganpfZ3Bpb19pcnFfc3RhcnR1cDsKKwljdC0+Y2hpcC5pcnFfc2h1dGRvd24gPSBqel9ncGlvX2lycV9zaHV0ZG93bjsKKwljdC0+Y2hpcC5pcnFfc2V0X3R5cGUgPSBqel9ncGlvX2lycV9zZXRfdHlwZTsKKwljdC0+Y2hpcC5pcnFfc2V0X3dha2UgPSBqel9ncGlvX2lycV9zZXRfd2FrZTsKKwljdC0+Y2hpcC5mbGFncyA9IElSUUNISVBfU0VUX1RZUEVfTUFTS0VEOworCisJaXJxX3NldHVwX2dlbmVyaWNfY2hpcChnYywgSVJRX01TSyhjaGlwLT5ncGlvX2NoaXAubmdwaW8pLAorCQlJUlFfR0NfSU5JVF9ORVNURURfTE9DSywgMCwgSVJRX05PUFJPQkUgfCBJUlFfTEVWRUwpOworCisJZ3Bpb2NoaXBfYWRkKCZjaGlwLT5ncGlvX2NoaXApOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBqejQ3NDBfZ3Bpb19pbml0KHZvaWQpCkBAIC01MjUsOCArNDYzLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShqejQ3NDBfZ3Bpb19jaGlwcyk7ICsraSkKIAkJano0NzQwX2dwaW9fY2hpcF9pbml0KCZqejQ3NDBfZ3Bpb19jaGlwc1tpXSwgaSk7CiAKLQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmano0NzQwX2dwaW9fc3lzY29yZV9vcHMpOwotCiAJcHJpbnRrKEtFUk5fSU5GTyAiSlo0NzQwIEdQSU8gaW5pdGlhbGl6ZWRcbiIpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL2lycS5jIGIvYXJjaC9taXBzL2p6NDc0MC9pcnEuYwppbmRleCBkODJjMGM0Li5mYzU3ZGVkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvano0NzQwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvaXJxLmMKQEAgLTMyLDggKzMyLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvYmFzZS5oPgogCiBzdGF0aWMgdm9pZCBfX2lvbWVtICpqel9pbnRjX2Jhc2U7Ci1zdGF0aWMgdWludDMyX3QganpfaW50Y193YWtldXA7Ci1zdGF0aWMgdWludDMyX3QganpfaW50Y19zYXZlZDsKIAogI2RlZmluZSBKWl9SRUdfSU5UQ19TVEFUVVMJMHgwMAogI2RlZmluZSBKWl9SRUdfSU5UQ19NQVNLCTB4MDQKQEAgLTQxLDQxICszOSw2IEBACiAjZGVmaW5lIEpaX1JFR19JTlRDX0NMRUFSX01BU0sJMHgwYwogI2RlZmluZSBKWl9SRUdfSU5UQ19QRU5ESU5HCTB4MTAKIAotI2RlZmluZSBJUlFfQklUKHgpIEJJVCgoeCkgLSBKWjQ3NDBfSVJRX0JBU0UpCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpbnRjX2lycV9iaXQoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXJldHVybiAodW5zaWduZWQgbG9uZylpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgaW50Y19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQl3cml0ZWwoaW50Y19pcnFfYml0KGRhdGEpLCBqel9pbnRjX2Jhc2UgKyBKWl9SRUdfSU5UQ19DTEVBUl9NQVNLKTsKLX0KLQotc3RhdGljIHZvaWQgaW50Y19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0Jd3JpdGVsKGludGNfaXJxX2JpdChkYXRhKSwganpfaW50Y19iYXNlICsgSlpfUkVHX0lOVENfU0VUX01BU0spOwotfQotCi1zdGF0aWMgaW50IGludGNfaXJxX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9uKQotewotCWlmIChvbikKLQkJanpfaW50Y193YWtldXAgfD0gaW50Y19pcnFfYml0KGRhdGEpOwotCWVsc2UKLQkJanpfaW50Y193YWtldXAgJj0gfmludGNfaXJxX2JpdChkYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGludGNfaXJxX3R5cGUgPSB7Ci0JLm5hbWUgPQkJIklOVEMiLAotCS5pcnFfbWFzayA9CWludGNfaXJxX21hc2ssCi0JLmlycV9tYXNrX2FjayA9CWludGNfaXJxX21hc2ssCi0JLmlycV91bm1hc2sgPQlpbnRjX2lycV91bm1hc2ssCi0JLmlycV9zZXRfd2FrZSA9CWludGNfaXJxX3NldF93YWtlLAotfTsKLQogc3RhdGljIGlycXJldHVybl90IGp6NDc0MF9jYXNjYWRlKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJdWludDMyX3QgaXJxX3JlZzsKQEAgLTg4LDYgKzUxLDI2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgdm9pZCBqejQ3NDBfaXJxX3NldF9tYXNrKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYywgdWludDMyX3QgbWFzaykKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfcmVncyAqcmVncyA9ICZnYy0+Y2hpcF90eXBlcy0+cmVnczsKKworCXdyaXRlbChtYXNrLCBnYy0+cmVnX2Jhc2UgKyByZWdzLT5lbmFibGUpOworCXdyaXRlbCh+bWFzaywgZ2MtPnJlZ19iYXNlICsgcmVncy0+ZGlzYWJsZSk7Cit9CisKK3ZvaWQgano0NzQwX2lycV9zdXNwZW5kKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlqejQ3NDBfaXJxX3NldF9tYXNrKGdjLCBnYy0+d2FrZV9hY3RpdmUpOworfQorCit2b2lkIGp6NDc0MF9pcnFfcmVzdW1lKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlqejQ3NDBfaXJxX3NldF9tYXNrKGdjLCBnYy0+bWFza19jYWNoZSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGp6NDc0MF9jYXNjYWRlX2FjdGlvbiA9IHsKIAkuaGFuZGxlciA9IGp6NDc0MF9jYXNjYWRlLAogCS5uYW1lID0gIkpaNDc0MCBjYXNjYWRlIGludGVycnVwdCIsCkBAIC05NSw3ICs3OCw5IEBACiAKIHZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0OworCiAJbWlwc19jcHVfaXJxX2luaXQoKTsKIAogCWp6X2ludGNfYmFzZSA9IGlvcmVtYXAoSlo0NzQwX0lOVENfQkFTRV9BRERSLCAweDE0KTsKQEAgLTEwMywxMCArODgsMjIgQEAKIAkvKiBNYXNrIGFsbCBpcnFzICovCiAJd3JpdGVsKDB4ZmZmZmZmZmYsIGp6X2ludGNfYmFzZSArIEpaX1JFR19JTlRDX1NFVF9NQVNLKTsKIAotCWZvciAoaSA9IEpaNDc0MF9JUlFfQkFTRTsgaSA8IEpaNDc0MF9JUlFfQkFTRSArIDMyOyBpKyspIHsKLQkJaXJxX3NldF9jaGlwX2RhdGEoaSwgKHZvaWQgKilJUlFfQklUKGkpKTsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZpbnRjX2lycV90eXBlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKLQl9CisJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJJTlRDIiwgMSwgSlo0NzQwX0lSUV9CQVNFLCBqel9pbnRjX2Jhc2UsCisJCWhhbmRsZV9sZXZlbF9pcnEpOworCisJZ2MtPndha2VfZW5hYmxlZCA9IElSUV9NU0soMzIpOworCisJY3QgPSBnYy0+Y2hpcF90eXBlczsKKwljdC0+cmVncy5lbmFibGUgPSBKWl9SRUdfSU5UQ19DTEVBUl9NQVNLOworCWN0LT5yZWdzLmRpc2FibGUgPSBKWl9SRUdfSU5UQ19TRVRfTUFTSzsKKwljdC0+Y2hpcC5pcnFfdW5tYXNrID0gaXJxX2djX3VubWFza19lbmFibGVfcmVnOworCWN0LT5jaGlwLmlycV9tYXNrID0gaXJxX2djX21hc2tfZGlzYWJsZV9yZWc7CisJY3QtPmNoaXAuaXJxX21hc2tfYWNrID0gaXJxX2djX21hc2tfZGlzYWJsZV9yZWc7CisJY3QtPmNoaXAuaXJxX3NldF93YWtlID0gaXJxX2djX3NldF93YWtlOworCWN0LT5jaGlwLmlycV9zdXNwZW5kID0gano0NzQwX2lycV9zdXNwZW5kOworCWN0LT5jaGlwLmlycV9yZXN1bWUgPSBqejQ3NDBfaXJxX3Jlc3VtZTsKKworCWlycV9zZXR1cF9nZW5lcmljX2NoaXAoZ2MsIElSUV9NU0soMzIpLCAwLCAwLCBJUlFfTk9QUk9CRSB8IElSUV9MRVZFTCk7CiAKIAlzZXR1cF9pcnEoMiwgJmp6NDc0MF9jYXNjYWRlX2FjdGlvbik7CiB9CkBAIC0xMjIsMTkgKzExOSw2IEBACiAJCXNwdXJpb3VzX2ludGVycnVwdCgpOwogfQogCi12b2lkIGp6NDc0MF9pbnRjX3N1c3BlbmQodm9pZCkKLXsKLQlqel9pbnRjX3NhdmVkID0gcmVhZGwoanpfaW50Y19iYXNlICsgSlpfUkVHX0lOVENfTUFTSyk7Ci0Jd3JpdGVsKH5qel9pbnRjX3dha2V1cCwganpfaW50Y19iYXNlICsgSlpfUkVHX0lOVENfU0VUX01BU0spOwotCXdyaXRlbChqel9pbnRjX3dha2V1cCwganpfaW50Y19iYXNlICsgSlpfUkVHX0lOVENfQ0xFQVJfTUFTSyk7Ci19Ci0KLXZvaWQgano0NzQwX2ludGNfcmVzdW1lKHZvaWQpCi17Ci0Jd3JpdGVsKH5qel9pbnRjX3NhdmVkLCBqel9pbnRjX2Jhc2UgKyBKWl9SRUdfSU5UQ19DTEVBUl9NQVNLKTsKLQl3cml0ZWwoanpfaW50Y19zYXZlZCwganpfaW50Y19iYXNlICsgSlpfUkVHX0lOVENfU0VUX01BU0spOwotfQotCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnRjX3NlcV9yZWcoc3RydWN0IHNlcV9maWxlICpzLCBjb25zdCBjaGFyICpuYW1lLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9pcnEuaCBiL2FyY2gvbWlwcy9qejQ3NDAvaXJxLmgKaW5kZXggNTZiNWVhZC4uZjc1ZTM5ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2p6NDc0MC9pcnEuaAorKysgYi9hcmNoL21pcHMvano0NzQwL2lycS5oCkBAIC0xNSw3ICsxNSw5IEBACiAjaWZuZGVmIF9fTUlQU19KWjQ3NDBfSVJRX0hfXwogI2RlZmluZSBfX01JUFNfSlo0NzQwX0lSUV9IX18KIAotZXh0ZXJuIHZvaWQgano0NzQwX2ludGNfc3VzcGVuZCh2b2lkKTsKLWV4dGVybiB2b2lkIGp6NDc0MF9pbnRjX3Jlc3VtZSh2b2lkKTsKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworZXh0ZXJuIHZvaWQgano0NzQwX2lycV9zdXNwZW5kKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSk7CitleHRlcm4gdm9pZCBqejQ3NDBfaXJxX3Jlc3VtZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvcG0uYyBiL2FyY2gvbWlwcy9qejQ3NDAvcG0uYwppbmRleCA5MDJkNWI1Li42NzQ0ZmE3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvano0NzQwL3BtLmMKKysrIGIvYXJjaC9taXBzL2p6NDc0MC9wbS5jCkBAIC0yMSwxMSArMjEsOSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLWp6NDc0MC9jbG9jay5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKLSNpbmNsdWRlICJpcnEuaCIKIAogc3RhdGljIGludCBqejQ3NDBfcG1fZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQogewotCWp6NDc0MF9pbnRjX3N1c3BlbmQoKTsKIAlqejQ3NDBfY2xvY2tfc3VzcGVuZCgpOwogCiAJano0NzQwX2Nsb2NrX3NldF93YWl0X21vZGUoSlo0NzQwX1dBSVRfTU9ERV9TTEVFUCk7CkBAIC0zNyw3ICszNSw2IEBACiAJano0NzQwX2Nsb2NrX3NldF93YWl0X21vZGUoSlo0NzQwX1dBSVRfTU9ERV9JRExFKTsKIAogCWp6NDc0MF9jbG9ja19yZXN1bWUoKTsKLQlqejQ3NDBfaW50Y19yZXN1bWUoKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC84MjUwLXBsYXRmb3JtLmMgYi9hcmNoL21pcHMva2VybmVsLzgyNTAtcGxhdGZvcm0uYwppbmRleCBjYmYzZmUyLi41YzZiMmFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsLzgyNTAtcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMva2VybmVsLzgyNTAtcGxhdGZvcm0uYwpAQCAtNSw3ICs1LDYgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCmluZGV4IDgzYmJhMzMuLjFhOTY2MTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTEsNiArMTEsOCBAQAogaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgogQ0ZMQUdTX1JFTU9WRV9mdHJhY2UubyA9IC1wZwogQ0ZMQUdTX1JFTU9WRV9lYXJseV9wcmludGsubyA9IC1wZworQ0ZMQUdTX1JFTU9WRV9wZXJmX2V2ZW50Lm8gPSAtcGcKK0NGTEFHU19SRU1PVkVfcGVyZl9ldmVudF9taXBzeHgubyA9IC1wZwogZW5kaWYKIAogb2JqLSQoQ09ORklHX0NFVlRfQkNNMTQ4MCkJKz0gY2V2dC1iY20xNDgwLm8KQEAgLTEwNiw3ICsxMDgsOCBAQAogCiBvYmotJChDT05GSUdfTUlQU19DUFVGUkVRKQkrPSBjcHVmcmVxLwogCi1vYmotJChDT05GSUdfSFdfUEVSRl9FVkVOVFMpCSs9IHBlcmZfZXZlbnQubworb2JqLSQoQ09ORklHX1BFUkZfRVZFTlRTKQkrPSBwZXJmX2V2ZW50Lm8KK29iai0kKENPTkZJR19IV19QRVJGX0VWRU5UUykJKz0gcGVyZl9ldmVudF9taXBzeHgubwogCiBvYmotJChDT05GSUdfSlVNUF9MQUJFTCkJKz0ganVtcF9sYWJlbC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCmluZGV4IGViYzBjZDIuLmM3ZDNjZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2J1Z3MuaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS93YXRjaC5oPgorI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vc3ByYW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC05NzgsNyArOTc5LDEwIEBACiBwbGF0Zm9ybToKIAkJc2V0X2VsZl9wbGF0Zm9ybShjcHUsICJvY3Rlb24iKTsKIAkJYnJlYWs7CisJY2FzZSBQUklEX0lNUF9DQVZJVU1fQ042MVhYOgogCWNhc2UgUFJJRF9JTVBfQ0FWSVVNX0NONjNYWDoKKwljYXNlIFBSSURfSU1QX0NBVklVTV9DTjY2WFg6CisJY2FzZSBQUklEX0lNUF9DQVZJVU1fQ042OFhYOgogCQljLT5jcHV0eXBlID0gQ1BVX0NBVklVTV9PQ1RFT04yOwogCQlfX2NwdV9uYW1lW2NwdV0gPSAiQ2F2aXVtIE9jdGVvbiBJSSI7CiAJCXNldF9lbGZfcGxhdGZvcm0oY3B1LCAib2N0ZW9uMiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pODI1My5jIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1My5jCmluZGV4IGJlNGVlN2QuLjcwNDdiZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTMuYworKysgYi9hcmNoL21pcHMva2VybmVsL2k4MjUzLmMKQEAgLTQsNyArNCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvaTgyNTMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvbWlwcy9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggNmQ2Y2E1My4uNWY5YTc2MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL21pcHMva2VybmVsL2luaXRfdGFzay5jCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXNjMDEuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW1zYzAxLmMKaW5kZXggMGM2YWZlZS4uMTRhYzUyYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXNjMDEuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS1tc2MwMS5jCkBAIC05LDcgKzksNiBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCwgMDYgUmFsZiBCYWVjaGxlIDxyYWxmQGxpbnV4LW1pcHMub3JnPgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMgYi9hcmNoL21pcHMva2VybmVsL2lycS5jCmluZGV4IGI1Mzk3MGQuLjdmNTAzMTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9taXBzLW10LmMgYi9hcmNoL21pcHMva2VybmVsL21pcHMtbXQuYwppbmRleCA1OTRjYTY5Li5jMjNkMTFmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL21pcHMtbXQuYworKysgYi9hcmNoL21pcHMva2VybmVsL21pcHMtbXQuYwpAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbWlwc19rc3ltcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzX2tzeW1zLmMKaW5kZXggMWQwNDgwNy4uNTdiYTEzZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9taXBzX2tzeW1zLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzX2tzeW1zLmMKQEAgLTksNyArOSw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL21pcHMva2VybmVsL21vZHVsZS5jCmluZGV4IDRiOTMwYWMuLmE1MDY2YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggMGFlZTk0NC4uYzFjZjljNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTE0LDUzMyArMTQsMTYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+IC8qIEZvciBwZXJmX2lycSAqLwotCi0vKiBUaGVzZSBhcmUgZm9yIDMyYml0IGNvdW50ZXJzLiBGb3IgNjRiaXQgb25lcywgZGVmaW5lIHRoZW0gYWNjb3JkaW5nbHkuICovCi0jZGVmaW5lIE1BWF9QRVJJT0QJKCgxVUxMIDw8IDMyKSAtIDEpCi0jZGVmaW5lIFZBTElEX0NPVU5UCTB4N2ZmZmZmZmYKLSNkZWZpbmUgVE9UQUxfQklUUwkzMgotI2RlZmluZSBISUdIRVNUX0JJVAkzMQotCi0jZGVmaW5lIE1JUFNfTUFYX0hXRVZFTlRTIDQKLQotc3RydWN0IGNwdV9od19ldmVudHMgewotCS8qIEFycmF5IG9mIGV2ZW50cyBvbiB0aGlzIGNwdS4gKi8KLQlzdHJ1Y3QgcGVyZl9ldmVudAkqZXZlbnRzW01JUFNfTUFYX0hXRVZFTlRTXTsKLQotCS8qCi0JICogU2V0IHRoZSBiaXQgKGluZGV4ZWQgYnkgdGhlIGNvdW50ZXIgbnVtYmVyKSB3aGVuIHRoZSBjb3VudGVyCi0JICogaXMgdXNlZCBmb3IgYW4gZXZlbnQuCi0JICovCi0JdW5zaWduZWQgbG9uZwkJdXNlZF9tYXNrW0JJVFNfVE9fTE9OR1MoTUlQU19NQVhfSFdFVkVOVFMpXTsKLQotCS8qCi0JICogVGhlIGJvcnJvd2VkIE1TQiBmb3IgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIuIEEgTUlQUyBwZXJmb3JtYW5jZQotCSAqIGNvdW50ZXIgdXNlcyBpdHMgYml0IDMxIChmb3IgMzJiaXQgY291bnRlcnMpIG9yIGJpdCA2MyAoZm9yIDY0Yml0Ci0JICogY291bnRlcnMpIGFzIGEgZmFjdG9yIG9mIGRldGVybWluaW5nIHdoZXRoZXIgYSBjb3VudGVyIG92ZXJmbG93Ci0JICogc2hvdWxkIGJlIHNpZ25hbGVkLiBTbyBoZXJlIHdlIHVzZSBhIHNlcGFyYXRlIE1TQiBmb3IgZWFjaAotCSAqIGNvdW50ZXIgdG8gbWFrZSB0aGluZ3MgZWFzeS4KLQkgKi8KLQl1bnNpZ25lZCBsb25nCQltc2JzW0JJVFNfVE9fTE9OR1MoTUlQU19NQVhfSFdFVkVOVFMpXTsKLQotCS8qCi0JICogU29mdHdhcmUgY29weSBvZiB0aGUgY29udHJvbCByZWdpc3RlciBmb3IgZWFjaCBwZXJmb3JtYW5jZSBjb3VudGVyLgotCSAqIE1JUFMgQ1BVcyB2YXJ5IGluIHBlcmZvcm1hbmNlIGNvdW50ZXJzLiBUaGV5IHVzZSB0aGlzIGRpZmZlcmVudGx5LAotCSAqIGFuZCBldmVuIG1heSBub3QgdXNlIGl0LgotCSAqLwotCXVuc2lnbmVkIGludAkJc2F2ZWRfY3RybFtNSVBTX01BWF9IV0VWRU5UU107Ci19OwotREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9od19ldmVudHMsIGNwdV9od19ldmVudHMpID0gewotCS5zYXZlZF9jdHJsID0gezB9LAotfTsKLQotLyogVGhlIGRlc2NyaXB0aW9uIG9mIE1JUFMgcGVyZm9ybWFuY2UgZXZlbnRzLiAqLwotc3RydWN0IG1pcHNfcGVyZl9ldmVudCB7Ci0JdW5zaWduZWQgaW50IGV2ZW50X2lkOwotCS8qCi0JICogTUlQUyBwZXJmb3JtYW5jZSBjb3VudGVycyBhcmUgaW5kZXhlZCBzdGFydGluZyBmcm9tIDAuCi0JICogQ05UUl9FVkVOIGluZGljYXRlcyB0aGUgaW5kZXhlcyBvZiB0aGUgY291bnRlcnMgdG8gYmUgdXNlZCBhcmUKLQkgKiBldmVuIG51bWJlcnMuCi0JICovCi0JdW5zaWduZWQgaW50IGNudHJfbWFzazsKLQkjZGVmaW5lIENOVFJfRVZFTgkweDU1NTU1NTU1Ci0JI2RlZmluZSBDTlRSX09ERAkweGFhYWFhYWFhCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCi0JZW51bSB7Ci0JCVQgID0gMCwKLQkJViAgPSAxLAotCQlQICA9IDIsCi0JfSByYW5nZTsKLSNlbHNlCi0JI2RlZmluZSBUCi0JI2RlZmluZSBWCi0JI2RlZmluZSBQCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IHJhd19ldmVudDsKLXN0YXRpYyBERUZJTkVfTVVURVgocmF3X2V2ZW50X211dGV4KTsKLQotI2RlZmluZSBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIDB4ZmZmZmZmZmYKLSNkZWZpbmUgQyh4KSBQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjeAotCi1zdHJ1Y3QgbWlwc19wbXUgewotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JaW50CQlpcnE7Ci0JaXJxcmV0dXJuX3QJKCpoYW5kbGVfaXJxKShpbnQgaXJxLCB2b2lkICpkZXYpOwotCWludAkJKCpoYW5kbGVfc2hhcmVkX2lycSkodm9pZCk7Ci0Jdm9pZAkJKCpzdGFydCkodm9pZCk7Ci0Jdm9pZAkJKCpzdG9wKSh2b2lkKTsKLQlpbnQJCSgqYWxsb2NfY291bnRlcikoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCi0JCQkJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MpOwotCXU2NAkJKCpyZWFkX2NvdW50ZXIpKHVuc2lnbmVkIGludCBpZHgpOwotCXZvaWQJCSgqd3JpdGVfY291bnRlcikodW5zaWduZWQgaW50IGlkeCwgdTY0IHZhbCk7Ci0Jdm9pZAkJKCplbmFibGVfZXZlbnQpKHN0cnVjdCBod19wZXJmX2V2ZW50ICpldnQsIGludCBpZHgpOwotCXZvaWQJCSgqZGlzYWJsZV9ldmVudCkoaW50IGlkeCk7Ci0JY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqKCptYXBfcmF3X2V2ZW50KSh1NjQgY29uZmlnKTsKLQljb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICgqZ2VuZXJhbF9ldmVudF9tYXApW1BFUkZfQ09VTlRfSFdfTUFYXTsKLQljb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICgqY2FjaGVfZXZlbnRfbWFwKQotCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KLQkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCi0JCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF07Ci0JdW5zaWduZWQgaW50CW51bV9jb3VudGVyczsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wbXUgKm1pcHNwbXU7Ci0KLXN0YXRpYyBpbnQKLW1pcHNwbXVfZXZlbnRfc2V0X3BlcmlvZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCi0JCQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAotCQkJaW50IGlkeCkKLXsKLQlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCXM2NCBsZWZ0ID0gbG9jYWw2NF9yZWFkKCZod2MtPnBlcmlvZF9sZWZ0KTsKLQlzNjQgcGVyaW9kID0gaHdjLT5zYW1wbGVfcGVyaW9kOwotCWludCByZXQgPSAwOwotCXU2NCB1bGVmdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHVubGlrZWx5KGxlZnQgPD0gLXBlcmlvZCkpIHsKLQkJbGVmdCA9IHBlcmlvZDsKLQkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOwotCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOwotCQlyZXQgPSAxOwotCX0KLQotCWlmICh1bmxpa2VseShsZWZ0IDw9IDApKSB7Ci0JCWxlZnQgKz0gcGVyaW9kOwotCQlsb2NhbDY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgbGVmdCk7Ci0JCWh3Yy0+bGFzdF9wZXJpb2QgPSBwZXJpb2Q7Ci0JCXJldCA9IDE7Ci0JfQotCi0JaWYgKGxlZnQgPiAoczY0KU1BWF9QRVJJT0QpCi0JCWxlZnQgPSBNQVhfUEVSSU9EOwotCi0JbG9jYWw2NF9zZXQoJmh3Yy0+cHJldl9jb3VudCwgKHU2NCktbGVmdCk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdWxlZnQgPSAodTY0KSgtbGVmdCkgJiBNQVhfUEVSSU9EOwotCXVsZWZ0ID4gVkFMSURfQ09VTlQgPwotCQlzZXRfYml0KGlkeCwgY3B1Yy0+bXNicykgOiBjbGVhcl9iaXQoaWR4LCBjcHVjLT5tc2JzKTsKLQltaXBzcG11LT53cml0ZV9jb3VudGVyKGlkeCwgKHU2NCkoLWxlZnQpICYgVkFMSURfQ09VTlQpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pcHNwbXVfZXZlbnRfdXBkYXRlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKLQkJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsCi0JCQlpbnQgaWR4KQotewotCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgc2hpZnQgPSA2NCAtIFRPVEFMX0JJVFM7Ci0JczY0IHByZXZfcmF3X2NvdW50LCBuZXdfcmF3X2NvdW50OwotCXU2NCBkZWx0YTsKLQotYWdhaW46Ci0JcHJldl9yYXdfY291bnQgPSBsb2NhbDY0X3JlYWQoJmh3Yy0+cHJldl9jb3VudCk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIE1ha2UgdGhlIGNvdW50ZXIgdmFsdWUgYmUgYSAicmVhbCIgb25lLiAqLwotCW5ld19yYXdfY291bnQgPSBtaXBzcG11LT5yZWFkX2NvdW50ZXIoaWR4KTsKLQlpZiAobmV3X3Jhd19jb3VudCAmICh0ZXN0X2JpdChpZHgsIGNwdWMtPm1zYnMpIDw8IEhJR0hFU1RfQklUKSkgewotCQluZXdfcmF3X2NvdW50ICY9IFZBTElEX0NPVU5UOwotCQljbGVhcl9iaXQoaWR4LCBjcHVjLT5tc2JzKTsKLQl9IGVsc2UKLQkJbmV3X3Jhd19jb3VudCB8PSAodGVzdF9iaXQoaWR4LCBjcHVjLT5tc2JzKSA8PCBISUdIRVNUX0JJVCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JaWYgKGxvY2FsNjRfY21weGNoZygmaHdjLT5wcmV2X2NvdW50LCBwcmV2X3Jhd19jb3VudCwKLQkJCQluZXdfcmF3X2NvdW50KSAhPSBwcmV2X3Jhd19jb3VudCkKLQkJZ290byBhZ2FpbjsKLQotCWRlbHRhID0gKG5ld19yYXdfY291bnQgPDwgc2hpZnQpIC0gKHByZXZfcmF3X2NvdW50IDw8IHNoaWZ0KTsKLQlkZWx0YSA+Pj0gc2hpZnQ7Ci0KLQlsb2NhbDY0X2FkZChkZWx0YSwgJmV2ZW50LT5jb3VudCk7Ci0JbG9jYWw2NF9zdWIoZGVsdGEsICZod2MtPnBlcmlvZF9sZWZ0KTsKLX0KLQotc3RhdGljIHZvaWQgbWlwc3BtdV9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKLQotCWlmICghbWlwc3BtdSkKLQkJcmV0dXJuOwotCi0JaWYgKGZsYWdzICYgUEVSRl9FRl9SRUxPQUQpCi0JCVdBUk5fT05fT05DRSghKGh3Yy0+c3RhdGUgJiBQRVJGX0hFU19VUFRPREFURSkpOwotCi0JaHdjLT5zdGF0ZSA9IDA7Ci0KLQkvKiBTZXQgdGhlIHBlcmlvZCBmb3IgdGhlIGV2ZW50LiAqLwotCW1pcHNwbXVfZXZlbnRfc2V0X3BlcmlvZChldmVudCwgaHdjLCBod2MtPmlkeCk7Ci0KLQkvKiBFbmFibGUgdGhlIGV2ZW50LiAqLwotCW1pcHNwbXUtPmVuYWJsZV9ldmVudChod2MsIGh3Yy0+aWR4KTsKLX0KLQotc3RhdGljIHZvaWQgbWlwc3BtdV9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQotewotCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwotCi0JaWYgKCFtaXBzcG11KQotCQlyZXR1cm47Ci0KLQlpZiAoIShod2MtPnN0YXRlICYgUEVSRl9IRVNfU1RPUFBFRCkpIHsKLQkJLyogV2UgYXJlIHdvcmtpbmcgb24gYSBsb2NhbCBldmVudC4gKi8KLQkJbWlwc3BtdS0+ZGlzYWJsZV9ldmVudChod2MtPmlkeCk7Ci0JCWJhcnJpZXIoKTsKLQkJbWlwc3BtdV9ldmVudF91cGRhdGUoZXZlbnQsIGh3YywgaHdjLT5pZHgpOwotCQlod2MtPnN0YXRlIHw9IFBFUkZfSEVTX1NUT1BQRUQgfCBQRVJGX0hFU19VUFRPREFURTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbWlwc3BtdV9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKLQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKLQlpbnQgaWR4OwotCWludCBlcnIgPSAwOwotCi0JcGVyZl9wbXVfZGlzYWJsZShldmVudC0+cG11KTsKLQotCS8qIFRvIGxvb2sgZm9yIGEgZnJlZSBjb3VudGVyIGZvciB0aGlzIGV2ZW50LiAqLwotCWlkeCA9IG1pcHNwbXUtPmFsbG9jX2NvdW50ZXIoY3B1YywgaHdjKTsKLQlpZiAoaWR4IDwgMCkgewotCQllcnIgPSBpZHg7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogSWYgdGhlcmUgaXMgYW4gZXZlbnQgaW4gdGhlIGNvdW50ZXIgd2UgYXJlIGdvaW5nIHRvIHVzZSB0aGVuCi0JICogbWFrZSBzdXJlIGl0IGlzIGRpc2FibGVkLgotCSAqLwotCWV2ZW50LT5ody5pZHggPSBpZHg7Ci0JbWlwc3BtdS0+ZGlzYWJsZV9ldmVudChpZHgpOwotCWNwdWMtPmV2ZW50c1tpZHhdID0gZXZlbnQ7Ci0KLQlod2MtPnN0YXRlID0gUEVSRl9IRVNfU1RPUFBFRCB8IFBFUkZfSEVTX1VQVE9EQVRFOwotCWlmIChmbGFncyAmIFBFUkZfRUZfU1RBUlQpCi0JCW1pcHNwbXVfc3RhcnQoZXZlbnQsIFBFUkZfRUZfUkVMT0FEKTsKLQotCS8qIFByb3BhZ2F0ZSBvdXIgY2hhbmdlcyB0byB0aGUgdXNlcnNwYWNlIG1hcHBpbmcuICovCi0JcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOwotCi1vdXQ6Ci0JcGVyZl9wbXVfZW5hYmxlKGV2ZW50LT5wbXUpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pcHNwbXVfZGVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQotewotCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7Ci0Jc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0JaW50IGlkeCA9IGh3Yy0+aWR4OwotCi0JV0FSTl9PTihpZHggPCAwIHx8IGlkeCA+PSBtaXBzcG11LT5udW1fY291bnRlcnMpOwotCi0JbWlwc3BtdV9zdG9wKGV2ZW50LCBQRVJGX0VGX1VQREFURSk7Ci0JY3B1Yy0+ZXZlbnRzW2lkeF0gPSBOVUxMOwotCWNsZWFyX2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzayk7Ci0KLQlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pcHNwbXVfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCi17Ci0Jc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0KLQkvKiBEb24ndCByZWFkIGRpc2FibGVkIGNvdW50ZXJzISAqLwotCWlmIChod2MtPmlkeCA8IDApCi0JCXJldHVybjsKLQotCW1pcHNwbXVfZXZlbnRfdXBkYXRlKGV2ZW50LCBod2MsIGh3Yy0+aWR4KTsKLX0KLQotc3RhdGljIHZvaWQgbWlwc3BtdV9lbmFibGUoc3RydWN0IHBtdSAqcG11KQotewotCWlmIChtaXBzcG11KQotCQltaXBzcG11LT5zdGFydCgpOwotfQotCi1zdGF0aWMgdm9pZCBtaXBzcG11X2Rpc2FibGUoc3RydWN0IHBtdSAqcG11KQotewotCWlmIChtaXBzcG11KQotCQltaXBzcG11LT5zdG9wKCk7Ci19Ci0KLXN0YXRpYyBhdG9taWNfdCBhY3RpdmVfZXZlbnRzID0gQVRPTUlDX0lOSVQoMCk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHBtdV9yZXNlcnZlX211dGV4KTsKLXN0YXRpYyBpbnQgKCpzYXZlX3BlcmZfaXJxKSh2b2lkKTsKLQotc3RhdGljIGludCBtaXBzcG11X2dldF9pcnEodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JaWYgKG1pcHNwbXUtPmlycSA+PSAwKSB7Ci0JCS8qIFJlcXVlc3QgbXkgb3duIGlycSBoYW5kbGVyLiAqLwotCQllcnIgPSByZXF1ZXN0X2lycShtaXBzcG11LT5pcnEsIG1pcHNwbXUtPmhhbmRsZV9pcnEsCi0JCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9OT0JBTEFOQ0lORywKLQkJCSJtaXBzX3BlcmZfcG11IiwgTlVMTCk7Ci0JCWlmIChlcnIpIHsKLQkJCXByX3dhcm5pbmcoIlVuYWJsZSB0byByZXF1ZXN0IElSUSVkIGZvciBNSVBTICIKLQkJCSAgICJwZXJmb3JtYW5jZSBjb3VudGVycyFcbiIsIG1pcHNwbXUtPmlycSk7Ci0JCX0KLQl9IGVsc2UgaWYgKGNwMF9wZXJmY291bnRfaXJxIDwgMCkgewotCQkvKgotCQkgKiBXZSBhcmUgc2hhcmluZyB0aGUgaXJxIG51bWJlciB3aXRoIHRoZSB0aW1lciBpbnRlcnJ1cHQuCi0JCSAqLwotCQlzYXZlX3BlcmZfaXJxID0gcGVyZl9pcnE7Ci0JCXBlcmZfaXJxID0gbWlwc3BtdS0+aGFuZGxlX3NoYXJlZF9pcnE7Ci0JCWVyciA9IDA7Ci0JfSBlbHNlIHsKLQkJcHJfd2FybmluZygiVGhlIHBsYXRmb3JtIGhhc24ndCBwcm9wZXJseSBkZWZpbmVkIGl0cyAiCi0JCQkiaW50ZXJydXB0IGNvbnRyb2xsZXIuXG4iKTsKLQkJZXJyID0gLUVOT0VOVDsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBtaXBzcG11X2ZyZWVfaXJxKHZvaWQpCi17Ci0JaWYgKG1pcHNwbXUtPmlycSA+PSAwKQotCQlmcmVlX2lycShtaXBzcG11LT5pcnEsIE5VTEwpOwotCWVsc2UgaWYgKGNwMF9wZXJmY291bnRfaXJxIDwgMCkKLQkJcGVyZl9pcnEgPSBzYXZlX3BlcmZfaXJxOwotfQotCi0vKgotICogbWlwc3h4L3JtOTAwMC9sb29uZ3NvbjIgaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgY291bnRlcnMsIHRoZXkgaGF2ZQotICogc3BlY2lmaWMgbG93LWxldmVsIGluaXQgcm91dGluZXMuCi0gKi8KLXN0YXRpYyB2b2lkIHJlc2V0X2NvdW50ZXJzKHZvaWQgKmFyZyk7Ci1zdGF0aWMgaW50IF9faHdfcGVyZl9ldmVudF9pbml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7Ci0KLXN0YXRpYyB2b2lkIGh3X3BlcmZfZXZlbnRfZGVzdHJveShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCi17Ci0JaWYgKGF0b21pY19kZWNfYW5kX211dGV4X2xvY2soJmFjdGl2ZV9ldmVudHMsCi0JCQkJJnBtdV9yZXNlcnZlX211dGV4KSkgewotCQkvKgotCQkgKiBXZSBtdXN0IG5vdCBjYWxsIHRoZSBkZXN0cm95IGZ1bmN0aW9uIHdpdGggaW50ZXJydXB0cwotCQkgKiBkaXNhYmxlZC4KLQkJICovCi0JCW9uX2VhY2hfY3B1KHJlc2V0X2NvdW50ZXJzLAotCQkJKHZvaWQgKikobG9uZyltaXBzcG11LT5udW1fY291bnRlcnMsIDEpOwotCQltaXBzcG11X2ZyZWVfaXJxKCk7Ci0JCW11dGV4X3VubG9jaygmcG11X3Jlc2VydmVfbXV0ZXgpOwotCX0KLX0KLQotc3RhdGljIGludCBtaXBzcG11X2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQotewotCWludCBlcnIgPSAwOwotCi0Jc3dpdGNoIChldmVudC0+YXR0ci50eXBlKSB7Ci0JY2FzZSBQRVJGX1RZUEVfUkFXOgotCWNhc2UgUEVSRl9UWVBFX0hBUkRXQVJFOgotCWNhc2UgUEVSRl9UWVBFX0hXX0NBQ0hFOgotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCWlmICghbWlwc3BtdSB8fCBldmVudC0+Y3B1ID49IG5yX2NwdW1hc2tfYml0cyB8fAotCQkoZXZlbnQtPmNwdSA+PSAwICYmICFjcHVfb25saW5lKGV2ZW50LT5jcHUpKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJmFjdGl2ZV9ldmVudHMpKSB7Ci0JCWlmIChhdG9taWNfcmVhZCgmYWN0aXZlX2V2ZW50cykgPiBNSVBTX01BWF9IV0VWRU5UUykgewotCQkJYXRvbWljX2RlYygmYWN0aXZlX2V2ZW50cyk7Ci0JCQlyZXR1cm4gLUVOT1NQQzsKLQkJfQotCi0JCW11dGV4X2xvY2soJnBtdV9yZXNlcnZlX211dGV4KTsKLQkJaWYgKGF0b21pY19yZWFkKCZhY3RpdmVfZXZlbnRzKSA9PSAwKQotCQkJZXJyID0gbWlwc3BtdV9nZXRfaXJxKCk7Ci0KLQkJaWYgKCFlcnIpCi0JCQlhdG9taWNfaW5jKCZhY3RpdmVfZXZlbnRzKTsKLQkJbXV0ZXhfdW5sb2NrKCZwbXVfcmVzZXJ2ZV9tdXRleCk7Ci0JfQotCi0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IF9faHdfcGVyZl9ldmVudF9pbml0KGV2ZW50KTsKLQlpZiAoZXJyKQotCQlod19wZXJmX2V2ZW50X2Rlc3Ryb3koZXZlbnQpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHN0cnVjdCBwbXUgcG11ID0gewotCS5wbXVfZW5hYmxlCT0gbWlwc3BtdV9lbmFibGUsCi0JLnBtdV9kaXNhYmxlCT0gbWlwc3BtdV9kaXNhYmxlLAotCS5ldmVudF9pbml0CT0gbWlwc3BtdV9ldmVudF9pbml0LAotCS5hZGQJCT0gbWlwc3BtdV9hZGQsCi0JLmRlbAkJPSBtaXBzcG11X2RlbCwKLQkuc3RhcnQJCT0gbWlwc3BtdV9zdGFydCwKLQkuc3RvcAkJPSBtaXBzcG11X3N0b3AsCi0JLnJlYWQJCT0gbWlwc3BtdV9yZWFkLAotfTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLW1pcHNwbXVfcGVyZl9ldmVudF9lbmNvZGUoY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqcGV2KQotewotLyoKLSAqIFRvcCA4IGJpdHMgZm9yIHJhbmdlLCBuZXh0IDE2IGJpdHMgZm9yIGNudHJfbWFzaywgbG93ZXN0IDggYml0cyBmb3IKLSAqIGV2ZW50X2lkLgotICovCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCi0JcmV0dXJuICgodW5zaWduZWQgaW50KXBldi0+cmFuZ2UgPDwgMjQpIHwKLQkJKHBldi0+Y250cl9tYXNrICYgMHhmZmZmMDApIHwKLQkJKHBldi0+ZXZlbnRfaWQgJiAweGZmKTsKLSNlbHNlCi0JcmV0dXJuIChwZXYtPmNudHJfbWFzayAmIDB4ZmZmZjAwKSB8Ci0JCShwZXYtPmV2ZW50X2lkICYgMHhmZik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKgotbWlwc3BtdV9tYXBfZ2VuZXJhbF9ldmVudChpbnQgaWR4KQotewotCWNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldjsKLQotCXBldiA9ICgoKm1pcHNwbXUtPmdlbmVyYWxfZXZlbnRfbWFwKVtpZHhdLmV2ZW50X2lkID09Ci0JCVVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgPyBFUlJfUFRSKC1FT1BOT1RTVVBQKSA6Ci0JCSYoKm1pcHNwbXUtPmdlbmVyYWxfZXZlbnRfbWFwKVtpZHhdKTsKLQotCXJldHVybiBwZXY7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICoKLW1pcHNwbXVfbWFwX2NhY2hlX2V2ZW50KHU2NCBjb25maWcpCi17Ci0JdW5zaWduZWQgaW50IGNhY2hlX3R5cGUsIGNhY2hlX29wLCBjYWNoZV9yZXN1bHQ7Ci0JY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqcGV2OwotCi0JY2FjaGVfdHlwZSA9IChjb25maWcgPj4gMCkgJiAweGZmOwotCWlmIChjYWNoZV90eXBlID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCWNhY2hlX29wID0gKGNvbmZpZyA+PiA4KSAmIDB4ZmY7Ci0JaWYgKGNhY2hlX29wID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCWNhY2hlX3Jlc3VsdCA9IChjb25maWcgPj4gMTYpICYgMHhmZjsKLQlpZiAoY2FjaGVfcmVzdWx0ID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlwZXYgPSAmKCgqbWlwc3BtdS0+Y2FjaGVfZXZlbnRfbWFwKQotCQkJCQlbY2FjaGVfdHlwZV0KLQkJCQkJW2NhY2hlX29wXQotCQkJCQlbY2FjaGVfcmVzdWx0XSk7Ci0KLQlpZiAocGV2LT5ldmVudF9pZCA9PSBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEKQotCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7Ci0KLQlyZXR1cm4gcGV2OwotCi19Ci0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfZXZlbnQoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCi0JICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKLXsKLQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCBmYWtlX2h3YyA9IGV2ZW50LT5odzsKLQotCS8qIEFsbG93IG1peGVkIGV2ZW50IGdyb3VwLiBTbyByZXR1cm4gMSB0byBwYXNzIHZhbGlkYXRpb24uICovCi0JaWYgKGV2ZW50LT5wbXUgIT0gJnBtdSB8fCBldmVudC0+c3RhdGUgPD0gUEVSRl9FVkVOVF9TVEFURV9PRkYpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIG1pcHNwbXUtPmFsbG9jX2NvdW50ZXIoY3B1YywgJmZha2VfaHdjKSA+PSAwOwotfQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX2dyb3VwKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKLXsKLQlzdHJ1Y3QgcGVyZl9ldmVudCAqc2libGluZywgKmxlYWRlciA9IGV2ZW50LT5ncm91cF9sZWFkZXI7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgZmFrZV9jcHVjOwotCi0JbWVtc2V0KCZmYWtlX2NwdWMsIDAsIHNpemVvZihmYWtlX2NwdWMpKTsKLQotCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfY3B1YywgbGVhZGVyKSkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpYmxpbmcsICZsZWFkZXItPnNpYmxpbmdfbGlzdCwgZ3JvdXBfZW50cnkpIHsKLQkJaWYgKCF2YWxpZGF0ZV9ldmVudCgmZmFrZV9jcHVjLCBzaWJsaW5nKSkKLQkJCXJldHVybiAtRU5PU1BDOwotCX0KLQotCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfY3B1YywgZXZlbnQpKQotCQlyZXR1cm4gLUVOT1NQQzsKLQotCXJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIG5lZWRlZCBieSBzcGVjaWZpYyBpcnEgaGFuZGxlcnMgaW4gcGVyZl9ldmVudF8qLmMgKi8KLXN0YXRpYyB2b2lkCi1oYW5kbGVfYXNzb2NpYXRlZF9ldmVudChzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywKLQlpbnQgaWR4LCBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gY3B1Yy0+ZXZlbnRzW2lkeF07Ci0Jc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0KLQltaXBzcG11X2V2ZW50X3VwZGF0ZShldmVudCwgaHdjLCBpZHgpOwotCWRhdGEtPnBlcmlvZCA9IGV2ZW50LT5ody5sYXN0X3BlcmlvZDsKLQlpZiAoIW1pcHNwbXVfZXZlbnRfc2V0X3BlcmlvZChldmVudCwgaHdjLCBpZHgpKQotCQlyZXR1cm47Ci0KLQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgZGF0YSwgcmVncykpCi0JCW1pcHNwbXUtPmRpc2FibGVfZXZlbnQoaWR4KTsKLX0KLQotI2luY2x1ZGUgInBlcmZfZXZlbnRfbWlwc3h4LmMiCiAKIC8qIENhbGxjaGFpbiBoYW5kbGluZyBjb2RlLiAqLwogCiAvKgogICogTGVhdmUgdXNlcnNwYWNlIGNhbGxjaGFpbiBlbXB0eSBmb3Igbm93LiBXaGVuIHdlIGZpbmQgYSB3YXkgdG8gdHJhY2UKLSAqIHRoZSB1c2VyIHN0YWNrIGNhbGxjaGFpbnMsIHdlIGFkZCBoZXJlLgorICogdGhlIHVzZXIgc3RhY2sgY2FsbGNoYWlucywgd2Ugd2lsbCBhZGQgaXQgaGVyZS4KICAqLwotdm9pZCBwZXJmX2NhbGxjaGFpbl91c2VyKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqZW50cnksCi0JCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLX0KIAogc3RhdGljIHZvaWQgc2F2ZV9yYXdfcGVyZl9jYWxsY2hhaW4oc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSwKIAl1bnNpZ25lZCBsb25nIHJlZzI5KQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50X21pcHN4eC5jIGIvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50X21pcHN4eC5jCmluZGV4IGU1YWQwOWEuLjRmMjk3MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudF9taXBzeHguYworKysgYi9hcmNoL21pcHMva2VybmVsL3BlcmZfZXZlbnRfbWlwc3h4LmMKQEAgLTEsMTMgKzEsMTEyIEBACi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMikgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01JUFM2NCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9SMTAwMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TQjEpCisvKgorICogTGludXggcGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0IGZvciBNSVBTLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDExIENhdml1bSBOZXR3b3JrcywgSW5jLgorICogQXV0aG9yOiBEZW5nLUNoZW5nIFpodQorICoKKyAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gZm9yIEFSTSwgd2hpY2ggaXMgaW4gdHVybgorICogYmFzZWQgb24gdGhlIHNwYXJjNjQgcGVyZiBldmVudCBjb2RlIGFuZCB0aGUgeDg2IGNvZGUuIFBlcmZvcm1hbmNlCisgKiBjb3VudGVyIGFjY2VzcyBpcyBiYXNlZCBvbiB0aGUgTUlQUyBPcHJvZmlsZSBjb2RlLiBBbmQgdGhlIGNhbGxjaGFpbgorICogc3VwcG9ydCByZWZlcmVuY2VzIHRoZSBjb2RlIG9mIE1JUFMgc3RhY2t0cmFjZS5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4gLyogRm9yIHBlcmZfaXJxICovCisKKyNkZWZpbmUgTUlQU19NQVhfSFdFVkVOVFMgNAorCitzdHJ1Y3QgY3B1X2h3X2V2ZW50cyB7CisJLyogQXJyYXkgb2YgZXZlbnRzIG9uIHRoaXMgY3B1LiAqLworCXN0cnVjdCBwZXJmX2V2ZW50CSpldmVudHNbTUlQU19NQVhfSFdFVkVOVFNdOworCisJLyoKKwkgKiBTZXQgdGhlIGJpdCAoaW5kZXhlZCBieSB0aGUgY291bnRlciBudW1iZXIpIHdoZW4gdGhlIGNvdW50ZXIKKwkgKiBpcyB1c2VkIGZvciBhbiBldmVudC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nCQl1c2VkX21hc2tbQklUU19UT19MT05HUyhNSVBTX01BWF9IV0VWRU5UUyldOworCisJLyoKKwkgKiBTb2Z0d2FyZSBjb3B5IG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyIGZvciBlYWNoIHBlcmZvcm1hbmNlIGNvdW50ZXIuCisJICogTUlQUyBDUFVzIHZhcnkgaW4gcGVyZm9ybWFuY2UgY291bnRlcnMuIFRoZXkgdXNlIHRoaXMgZGlmZmVyZW50bHksCisJICogYW5kIGV2ZW4gbWF5IG5vdCB1c2UgaXQuCisJICovCisJdW5zaWduZWQgaW50CQlzYXZlZF9jdHJsW01JUFNfTUFYX0hXRVZFTlRTXTsKK307CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X2h3X2V2ZW50cywgY3B1X2h3X2V2ZW50cykgPSB7CisJLnNhdmVkX2N0cmwgPSB7MH0sCit9OworCisvKiBUaGUgZGVzY3JpcHRpb24gb2YgTUlQUyBwZXJmb3JtYW5jZSBldmVudHMuICovCitzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IHsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfaWQ7CisJLyoKKwkgKiBNSVBTIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGFyZSBpbmRleGVkIHN0YXJ0aW5nIGZyb20gMC4KKwkgKiBDTlRSX0VWRU4gaW5kaWNhdGVzIHRoZSBpbmRleGVzIG9mIHRoZSBjb3VudGVycyB0byBiZSB1c2VkIGFyZQorCSAqIGV2ZW4gbnVtYmVycy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgY250cl9tYXNrOworCSNkZWZpbmUgQ05UUl9FVkVOCTB4NTU1NTU1NTUKKwkjZGVmaW5lIENOVFJfT0RECTB4YWFhYWFhYWEKKwkjZGVmaW5lIENOVFJfQUxMCTB4ZmZmZmZmZmYKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKKwllbnVtIHsKKwkJVCAgPSAwLAorCQlWICA9IDEsCisJCVAgID0gMiwKKwl9IHJhbmdlOworI2Vsc2UKKwkjZGVmaW5lIFQKKwkjZGVmaW5lIFYKKwkjZGVmaW5lIFAKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgcmF3X2V2ZW50Oworc3RhdGljIERFRklORV9NVVRFWChyYXdfZXZlbnRfbXV0ZXgpOworCisjZGVmaW5lIFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgMHhmZmZmZmZmZgorI2RlZmluZSBDKHgpIFBFUkZfQ09VTlRfSFdfQ0FDSEVfIyN4CisKK3N0cnVjdCBtaXBzX3BtdSB7CisJdTY0CQltYXhfcGVyaW9kOworCXU2NAkJdmFsaWRfY291bnQ7CisJdTY0CQlvdmVyZmxvdzsKKwljb25zdCBjaGFyCSpuYW1lOworCWludAkJaXJxOworCXU2NAkJKCpyZWFkX2NvdW50ZXIpKHVuc2lnbmVkIGludCBpZHgpOworCXZvaWQJCSgqd3JpdGVfY291bnRlcikodW5zaWduZWQgaW50IGlkeCwgdTY0IHZhbCk7CisJY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqKCptYXBfcmF3X2V2ZW50KSh1NjQgY29uZmlnKTsKKwljb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICgqZ2VuZXJhbF9ldmVudF9tYXApW1BFUkZfQ09VTlRfSFdfTUFYXTsKKwljb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICgqY2FjaGVfZXZlbnRfbWFwKQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF07CisJdW5zaWduZWQgaW50CW51bV9jb3VudGVyczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlwc19wbXUgbWlwc3BtdTsKIAogI2RlZmluZSBNX0NPTkZJRzFfUEMJKDEgPDwgNCkKIAotI2RlZmluZSBNX1BFUkZDVExfRVhMCQkJKDFVTCAgICAgIDw8ICAwKQotI2RlZmluZSBNX1BFUkZDVExfS0VSTkVMCQkoMVVMICAgICAgPDwgIDEpCi0jZGVmaW5lIE1fUEVSRkNUTF9TVVBFUlZJU09SCQkoMVVMICAgICAgPDwgIDIpCi0jZGVmaW5lIE1fUEVSRkNUTF9VU0VSCQkJKDFVTCAgICAgIDw8ICAzKQotI2RlZmluZSBNX1BFUkZDVExfSU5URVJSVVBUX0VOQUJMRQkoMVVMICAgICAgPDwgIDQpCisjZGVmaW5lIE1fUEVSRkNUTF9FWEwJCQkoMSAgICAgIDw8ICAwKQorI2RlZmluZSBNX1BFUkZDVExfS0VSTkVMCQkoMSAgICAgIDw8ICAxKQorI2RlZmluZSBNX1BFUkZDVExfU1VQRVJWSVNPUgkJKDEgICAgICA8PCAgMikKKyNkZWZpbmUgTV9QRVJGQ1RMX1VTRVIJCQkoMSAgICAgIDw8ICAzKQorI2RlZmluZSBNX1BFUkZDVExfSU5URVJSVVBUX0VOQUJMRQkoMSAgICAgIDw8ICA0KQogI2RlZmluZSBNX1BFUkZDVExfRVZFTlQoZXZlbnQpCQkoKChldmVudCkgJiAweDNmZikgIDw8IDUpCiAjZGVmaW5lIE1fUEVSRkNUTF9WUEVJRCh2cGUpCQkoKHZwZSkgICAgPDwgMTYpCiAjZGVmaW5lIE1fUEVSRkNUTF9NVF9FTihmaWx0ZXIpCQkoKGZpbHRlcikgPDwgMjApCkBAIC0xNSw4ICsxMTQsOCBAQAogI2RlZmluZSAgICBNX1RDX0VOX1ZQRQkJCU1fUEVSRkNUTF9NVF9FTigxKQogI2RlZmluZSAgICBNX1RDX0VOX1RDCQkJTV9QRVJGQ1RMX01UX0VOKDIpCiAjZGVmaW5lIE1fUEVSRkNUTF9UQ0lEKHRjaWQpCQkoKHRjaWQpICAgPDwgMjIpCi0jZGVmaW5lIE1fUEVSRkNUTF9XSURFCQkJKDFVTCAgICAgIDw8IDMwKQotI2RlZmluZSBNX1BFUkZDVExfTU9SRQkJCSgxVUwgICAgICA8PCAzMSkKKyNkZWZpbmUgTV9QRVJGQ1RMX1dJREUJCQkoMSAgICAgIDw8IDMwKQorI2RlZmluZSBNX1BFUkZDVExfTU9SRQkJCSgxICAgICAgPDwgMzEpCiAKICNkZWZpbmUgTV9QRVJGQ1RMX0NPVU5UX0VWRU5UX1dIRU5FVkVSCShNX1BFUkZDVExfRVhMIHwJCVwKIAkJCQkJTV9QRVJGQ1RMX0tFUk5FTCB8CQlcCkBAIC0zMSwxMSArMTMwLDEyIEBACiAjZW5kaWYKICNkZWZpbmUgTV9QRVJGQ1RMX0VWRU5UX01BU0sJCTB4ZmUwCiAKLSNkZWZpbmUgTV9DT1VOVEVSX09WRVJGTE9XCQkoMVVMICAgICAgPDwgMzEpCiAKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKIHN0YXRpYyBpbnQgY3B1X2hhc19taXBzbXRfcGVydGNjb3VudGVyczsKIAorc3RhdGljIERFRklORV9SV0xPQ0socG11aW50X3J3bG9jayk7CisKIC8qCiAgKiBGSVhNRTogRm9yIFZTTVAsIHZwZV9pZCgpIGlzIHJlZGVmaW5lZCBmb3IgUGVyZi1ldmVudHMsIGJlY2F1c2UKICAqIGNwdV9kYXRhW2NwdWlkXS52cGVfaWQgcmVwb3J0cyAwIGZvciBfYm90aF8gQ1BVcy4KQEAgLTQ5LDc5ICsxNDksNjIxIEBACiAjZW5kaWYKIAogLyogQ29waWVkIGZyb20gb3BfbW9kZWxfbWlwc3h4LmMgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHZwZV9zaGlmdCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCB2cGVfc2hpZnQodm9pZCkKIHsKIAlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CiB9Ci0jZWxzZSAvKiAhQ09ORklHX01JUFNfTVRfU01QICovCi0jZGVmaW5lIHZwZV9pZCgpCTAKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdnBlX3NoaWZ0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01QICovCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jb3VudGVyc190b3RhbF90b19wZXJfY3B1KHVuc2lnbmVkIGludCBjb3VudGVycykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY291bnRlcnNfdG90YWxfdG9fcGVyX2NwdSh1bnNpZ25lZCBpbnQgY291bnRlcnMpCiB7CiAJcmV0dXJuIGNvdW50ZXJzID4+IHZwZV9zaGlmdCgpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY291bnRlcnNfcGVyX2NwdV90b190b3RhbCh1bnNpZ25lZCBpbnQgY291bnRlcnMpCitzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ZXJzX3Blcl9jcHVfdG9fdG90YWwodW5zaWduZWQgaW50IGNvdW50ZXJzKQogewogCXJldHVybiBjb3VudGVycyA8PCB2cGVfc2hpZnQoKTsKIH0KIAotI2RlZmluZSBfX2RlZmluZV9wZXJmX2FjY2Vzc29ycyhyLCBuLCBucCkJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcl9jMF8gIyMgciAjIyBuKHZvaWQpCQkJXAotewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgY3B1ID0gdnBlX2lkKCk7CQkJCQlcCi0JCQkJCQkJCQlcCi0Jc3dpdGNoIChjcHUpIHsJCQkJCQkJXAotCWNhc2UgMDoJCQkJCQkJCVwKLQkJcmV0dXJuIHJlYWRfYzBfICMjIHIgIyMgbigpOwkJCQlcCi0JY2FzZSAxOgkJCQkJCQkJXAotCQlyZXR1cm4gcmVhZF9jMF8gIyMgciAjIyBucCgpOwkJCQlcCi0JZGVmYXVsdDoJCQkJCQkJXAotCQlCVUcoKTsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQlyZXR1cm4gMDsJCQkJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyBpbmxpbmUgdm9pZCB3X2MwXyAjIyByICMjIG4odW5zaWduZWQgaW50IHZhbHVlKQkJCVwKLXsJCQkJCQkJCQlcCi0JdW5zaWduZWQgaW50IGNwdSA9IHZwZV9pZCgpOwkJCQkJXAotCQkJCQkJCQkJXAotCXN3aXRjaCAoY3B1KSB7CQkJCQkJCVwKLQljYXNlIDA6CQkJCQkJCQlcCi0JCXdyaXRlX2MwXyAjIyByICMjIG4odmFsdWUpOwkJCQlcCi0JCXJldHVybjsJCQkJCQkJXAotCWNhc2UgMToJCQkJCQkJCVwKLQkJd3JpdGVfYzBfICMjIHIgIyMgbnAodmFsdWUpOwkJCQlcCi0JCXJldHVybjsJCQkJCQkJXAotCWRlZmF1bHQ6CQkJCQkJCVwKLQkJQlVHKCk7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JcmV0dXJuOwkJCQkJCQkJXAotfQkJCQkJCQkJCVwKKyNlbHNlIC8qICFDT05GSUdfTUlQU19NVF9TTVAgKi8KKyNkZWZpbmUgdnBlX2lkKCkJMAogCi1fX2RlZmluZV9wZXJmX2FjY2Vzc29ycyhwZXJmY250ciwgMCwgMikKLV9fZGVmaW5lX3BlcmZfYWNjZXNzb3JzKHBlcmZjbnRyLCAxLCAzKQotX19kZWZpbmVfcGVyZl9hY2Nlc3NvcnMocGVyZmNudHIsIDIsIDApCi1fX2RlZmluZV9wZXJmX2FjY2Vzc29ycyhwZXJmY250ciwgMywgMSkKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVAgKi8KIAotX19kZWZpbmVfcGVyZl9hY2Nlc3NvcnMocGVyZmN0cmwsIDAsIDIpCi1fX2RlZmluZV9wZXJmX2FjY2Vzc29ycyhwZXJmY3RybCwgMSwgMykKLV9fZGVmaW5lX3BlcmZfYWNjZXNzb3JzKHBlcmZjdHJsLCAyLCAwKQotX19kZWZpbmVfcGVyZl9hY2Nlc3NvcnMocGVyZmN0cmwsIDMsIDEpCitzdGF0aWMgdm9pZCByZXN1bWVfbG9jYWxfY291bnRlcnModm9pZCk7CitzdGF0aWMgdm9pZCBwYXVzZV9sb2NhbF9jb3VudGVycyh2b2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtaXBzeHhfcG11X2hhbmRsZV9pcnEoaW50LCB2b2lkICopOworc3RhdGljIGludCBtaXBzeHhfcG11X2hhbmRsZV9zaGFyZWRfaXJxKHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIGludCBfX25fY291bnRlcnModm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlwc3h4X3BtdV9zd2l6emxlX3BlcmZfaWR4KHVuc2lnbmVkIGludCBpZHgpCit7CisJaWYgKHZwZV9pZCgpID09IDEpCisJCWlkeCA9IChpZHggKyAyKSAmIDM7CisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIHU2NCBtaXBzeHhfcG11X3JlYWRfY291bnRlcih1bnNpZ25lZCBpbnQgaWR4KQoreworCWlkeCA9IG1pcHN4eF9wbXVfc3dpenpsZV9wZXJmX2lkeChpZHgpOworCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIDA6CisJCS8qCisJCSAqIFRoZSBjb3VudGVycyBhcmUgdW5zaWduZWQsIHdlIG11c3QgY2FzdCB0byB0cnVuY2F0ZQorCQkgKiBvZmYgdGhlIGhpZ2ggYml0cy4KKwkJICovCisJCXJldHVybiAodTMyKXJlYWRfYzBfcGVyZmNudHIwKCk7CisJY2FzZSAxOgorCQlyZXR1cm4gKHUzMilyZWFkX2MwX3BlcmZjbnRyMSgpOworCWNhc2UgMjoKKwkJcmV0dXJuICh1MzIpcmVhZF9jMF9wZXJmY250cjIoKTsKKwljYXNlIDM6CisJCXJldHVybiAodTMyKXJlYWRfYzBfcGVyZmNudHIzKCk7CisJZGVmYXVsdDoKKwkJV0FSTl9PTkNFKDEsICJJbnZhbGlkIHBlcmZvcm1hbmNlIGNvdW50ZXIgbnVtYmVyICglZClcbiIsIGlkeCk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHU2NCBtaXBzeHhfcG11X3JlYWRfY291bnRlcl82NCh1bnNpZ25lZCBpbnQgaWR4KQoreworCWlkeCA9IG1pcHN4eF9wbXVfc3dpenpsZV9wZXJmX2lkeChpZHgpOworCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiByZWFkX2MwX3BlcmZjbnRyMF82NCgpOworCWNhc2UgMToKKwkJcmV0dXJuIHJlYWRfYzBfcGVyZmNudHIxXzY0KCk7CisJY2FzZSAyOgorCQlyZXR1cm4gcmVhZF9jMF9wZXJmY250cjJfNjQoKTsKKwljYXNlIDM6CisJCXJldHVybiByZWFkX2MwX3BlcmZjbnRyM182NCgpOworCWRlZmF1bHQ6CisJCVdBUk5fT05DRSgxLCAiSW52YWxpZCBwZXJmb3JtYW5jZSBjb3VudGVyIG51bWJlciAoJWQpXG4iLCBpZHgpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1pcHN4eF9wbXVfd3JpdGVfY291bnRlcih1bnNpZ25lZCBpbnQgaWR4LCB1NjQgdmFsKQoreworCWlkeCA9IG1pcHN4eF9wbXVfc3dpenpsZV9wZXJmX2lkeChpZHgpOworCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIDA6CisJCXdyaXRlX2MwX3BlcmZjbnRyMCh2YWwpOworCQlyZXR1cm47CisJY2FzZSAxOgorCQl3cml0ZV9jMF9wZXJmY250cjEodmFsKTsKKwkJcmV0dXJuOworCWNhc2UgMjoKKwkJd3JpdGVfYzBfcGVyZmNudHIyKHZhbCk7CisJCXJldHVybjsKKwljYXNlIDM6CisJCXdyaXRlX2MwX3BlcmZjbnRyMyh2YWwpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCBtaXBzeHhfcG11X3dyaXRlX2NvdW50ZXJfNjQodW5zaWduZWQgaW50IGlkeCwgdTY0IHZhbCkKK3sKKwlpZHggPSBtaXBzeHhfcG11X3N3aXp6bGVfcGVyZl9pZHgoaWR4KTsKKworCXN3aXRjaCAoaWR4KSB7CisJY2FzZSAwOgorCQl3cml0ZV9jMF9wZXJmY250cjBfNjQodmFsKTsKKwkJcmV0dXJuOworCWNhc2UgMToKKwkJd3JpdGVfYzBfcGVyZmNudHIxXzY0KHZhbCk7CisJCXJldHVybjsKKwljYXNlIDI6CisJCXdyaXRlX2MwX3BlcmZjbnRyMl82NCh2YWwpOworCQlyZXR1cm47CisJY2FzZSAzOgorCQl3cml0ZV9jMF9wZXJmY250cjNfNjQodmFsKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBtaXBzeHhfcG11X3JlYWRfY29udHJvbCh1bnNpZ25lZCBpbnQgaWR4KQoreworCWlkeCA9IG1pcHN4eF9wbXVfc3dpenpsZV9wZXJmX2lkeChpZHgpOworCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiByZWFkX2MwX3BlcmZjdHJsMCgpOworCWNhc2UgMToKKwkJcmV0dXJuIHJlYWRfYzBfcGVyZmN0cmwxKCk7CisJY2FzZSAyOgorCQlyZXR1cm4gcmVhZF9jMF9wZXJmY3RybDIoKTsKKwljYXNlIDM6CisJCXJldHVybiByZWFkX2MwX3BlcmZjdHJsMygpOworCWRlZmF1bHQ6CisJCVdBUk5fT05DRSgxLCAiSW52YWxpZCBwZXJmb3JtYW5jZSBjb3VudGVyIG51bWJlciAoJWQpXG4iLCBpZHgpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1pcHN4eF9wbXVfd3JpdGVfY29udHJvbCh1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWlkeCA9IG1pcHN4eF9wbXVfc3dpenpsZV9wZXJmX2lkeChpZHgpOworCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIDA6CisJCXdyaXRlX2MwX3BlcmZjdHJsMCh2YWwpOworCQlyZXR1cm47CisJY2FzZSAxOgorCQl3cml0ZV9jMF9wZXJmY3RybDEodmFsKTsKKwkJcmV0dXJuOworCWNhc2UgMjoKKwkJd3JpdGVfYzBfcGVyZmN0cmwyKHZhbCk7CisJCXJldHVybjsKKwljYXNlIDM6CisJCXdyaXRlX2MwX3BlcmZjdHJsMyh2YWwpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW50IG1pcHN4eF9wbXVfYWxsb2NfY291bnRlcihzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywKKwkJCQkgICAgc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YykKK3sKKwlpbnQgaTsKKworCS8qCisJICogV2Ugb25seSBuZWVkIHRvIGNhcmUgdGhlIGNvdW50ZXIgbWFzay4gVGhlIHJhbmdlIGhhcyBiZWVuCisJICogY2hlY2tlZCBkZWZpbml0ZWx5LgorCSAqLworCXVuc2lnbmVkIGxvbmcgY250cl9tYXNrID0gKGh3Yy0+ZXZlbnRfYmFzZSA+PiA4KSAmIDB4ZmZmZjsKKworCWZvciAoaSA9IG1pcHNwbXUubnVtX2NvdW50ZXJzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJLyoKKwkJICogTm90ZSB0aGF0IHNvbWUgTUlQUyBwZXJmIGV2ZW50cyBjYW4gYmUgY291bnRlZCBieSBib3RoCisJCSAqIGV2ZW4gYW5kIG9kZCBjb3VudGVycywgd2hlcmVzYXMgbWFueSBvdGhlciBhcmUgb25seSBieQorCQkgKiBldmVuIF9vcl8gb2RkIGNvdW50ZXJzLiBUaGlzIGludHJvZHVjZXMgYW4gaXNzdWUgdGhhdAorCQkgKiB3aGVuIHRoZSBmb3JtZXIga2luZCBvZiBldmVudCB0YWtlcyB0aGUgY291bnRlciB0aGUKKwkJICogbGF0dGVyIGtpbmQgb2YgZXZlbnQgd2FudHMgdG8gdXNlLCB0aGVuIHRoZSAiY291bnRlcgorCQkgKiBhbGxvY2F0aW9uIiBmb3IgdGhlIGxhdHRlciBldmVudCB3aWxsIGZhaWwuIEluIGZhY3QgaWYKKwkJICogdGhleSBjYW4gYmUgZHluYW1pY2FsbHkgc3dhcHBlZCwgdGhleSBib3RoIGZlZWwgaGFwcHkuCisJCSAqIEJ1dCBoZXJlIHdlIGxlYXZlIHRoaXMgaXNzdWUgYWxvbmUgZm9yIG5vdy4KKwkJICovCisJCWlmICh0ZXN0X2JpdChpLCAmY250cl9tYXNrKSAmJgorCQkJIXRlc3RfYW5kX3NldF9iaXQoaSwgY3B1Yy0+dXNlZF9tYXNrKSkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtRUFHQUlOOworfQorCitzdGF0aWMgdm9pZCBtaXBzeHhfcG11X2VuYWJsZV9ldmVudChzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqZXZ0LCBpbnQgaWR4KQoreworCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CisKKwlXQVJOX09OKGlkeCA8IDAgfHwgaWR4ID49IG1pcHNwbXUubnVtX2NvdW50ZXJzKTsKKworCWNwdWMtPnNhdmVkX2N0cmxbaWR4XSA9IE1fUEVSRkNUTF9FVkVOVChldnQtPmV2ZW50X2Jhc2UgJiAweGZmKSB8CisJCShldnQtPmNvbmZpZ19iYXNlICYgTV9QRVJGQ1RMX0NPTkZJR19NQVNLKSB8CisJCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHQgZW5hYmxlZC4gKi8KKwkJTV9QRVJGQ1RMX0lOVEVSUlVQVF9FTkFCTEU7CisJLyoKKwkgKiBXZSBkbyBub3QgYWN0dWFsbHkgbGV0IHRoZSBjb3VudGVyIHJ1bi4gTGVhdmUgaXQgdW50aWwgc3RhcnQoKS4KKwkgKi8KK30KKworc3RhdGljIHZvaWQgbWlwc3h4X3BtdV9kaXNhYmxlX2V2ZW50KGludCBpZHgpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJV0FSTl9PTihpZHggPCAwIHx8IGlkeCA+PSBtaXBzcG11Lm51bV9jb3VudGVycyk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY3B1Yy0+c2F2ZWRfY3RybFtpZHhdID0gbWlwc3h4X3BtdV9yZWFkX2NvbnRyb2woaWR4KSAmCisJCX5NX1BFUkZDVExfQ09VTlRfRVZFTlRfV0hFTkVWRVI7CisJbWlwc3h4X3BtdV93cml0ZV9jb250cm9sKGlkeCwgY3B1Yy0+c2F2ZWRfY3RybFtpZHhdKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbWlwc3BtdV9ldmVudF9zZXRfcGVyaW9kKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgICAgc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywKKwkJCQkgICAgaW50IGlkeCkKK3sKKwl1NjQgbGVmdCA9IGxvY2FsNjRfcmVhZCgmaHdjLT5wZXJpb2RfbGVmdCk7CisJdTY0IHBlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh1bmxpa2VseSgobGVmdCArIHBlcmlvZCkgJiAoMVVMTCA8PCA2MykpKSB7CisJCS8qIGxlZnQgdW5kZXJmbG93ZWQgYnkgbW9yZSB0aGFuIHBlcmlvZC4gKi8KKwkJbGVmdCA9IHBlcmlvZDsKKwkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOworCQlyZXQgPSAxOworCX0gZWxzZQlpZiAodW5saWtlbHkoKGxlZnQgKyBwZXJpb2QpIDw9IHBlcmlvZCkpIHsKKwkJLyogbGVmdCB1bmRlcmZsb3dlZCBieSBsZXNzIHRoYW4gcGVyaW9kLiAqLworCQlsZWZ0ICs9IHBlcmlvZDsKKwkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOworCQlyZXQgPSAxOworCX0KKworCWlmIChsZWZ0ID4gbWlwc3BtdS5tYXhfcGVyaW9kKSB7CisJCWxlZnQgPSBtaXBzcG11Lm1heF9wZXJpb2Q7CisJCWxvY2FsNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBsZWZ0KTsKKwl9CisKKwlsb2NhbDY0X3NldCgmaHdjLT5wcmV2X2NvdW50LCBtaXBzcG11Lm92ZXJmbG93IC0gbGVmdCk7CisKKwltaXBzcG11LndyaXRlX2NvdW50ZXIoaWR4LCBtaXBzcG11Lm92ZXJmbG93IC0gbGVmdCk7CisKKwlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtaXBzcG11X2V2ZW50X3VwZGF0ZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkJIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsCisJCQkJIGludCBpZHgpCit7CisJdTY0IHByZXZfcmF3X2NvdW50LCBuZXdfcmF3X2NvdW50OworCXU2NCBkZWx0YTsKKworYWdhaW46CisJcHJldl9yYXdfY291bnQgPSBsb2NhbDY0X3JlYWQoJmh3Yy0+cHJldl9jb3VudCk7CisJbmV3X3Jhd19jb3VudCA9IG1pcHNwbXUucmVhZF9jb3VudGVyKGlkeCk7CisKKwlpZiAobG9jYWw2NF9jbXB4Y2hnKCZod2MtPnByZXZfY291bnQsIHByZXZfcmF3X2NvdW50LAorCQkJCW5ld19yYXdfY291bnQpICE9IHByZXZfcmF3X2NvdW50KQorCQlnb3RvIGFnYWluOworCisJZGVsdGEgPSBuZXdfcmF3X2NvdW50IC0gcHJldl9yYXdfY291bnQ7CisKKwlsb2NhbDY0X2FkZChkZWx0YSwgJmV2ZW50LT5jb3VudCk7CisJbG9jYWw2NF9zdWIoZGVsdGEsICZod2MtPnBlcmlvZF9sZWZ0KTsKK30KKworc3RhdGljIHZvaWQgbWlwc3BtdV9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKworCWlmIChmbGFncyAmIFBFUkZfRUZfUkVMT0FEKQorCQlXQVJOX09OX09OQ0UoIShod2MtPnN0YXRlICYgUEVSRl9IRVNfVVBUT0RBVEUpKTsKKworCWh3Yy0+c3RhdGUgPSAwOworCisJLyogU2V0IHRoZSBwZXJpb2QgZm9yIHRoZSBldmVudC4gKi8KKwltaXBzcG11X2V2ZW50X3NldF9wZXJpb2QoZXZlbnQsIGh3YywgaHdjLT5pZHgpOworCisJLyogRW5hYmxlIHRoZSBldmVudC4gKi8KKwltaXBzeHhfcG11X2VuYWJsZV9ldmVudChod2MsIGh3Yy0+aWR4KTsKK30KKworc3RhdGljIHZvaWQgbWlwc3BtdV9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCisJaWYgKCEoaHdjLT5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpKSB7CisJCS8qIFdlIGFyZSB3b3JraW5nIG9uIGEgbG9jYWwgZXZlbnQuICovCisJCW1pcHN4eF9wbXVfZGlzYWJsZV9ldmVudChod2MtPmlkeCk7CisJCWJhcnJpZXIoKTsKKwkJbWlwc3BtdV9ldmVudF91cGRhdGUoZXZlbnQsIGh3YywgaHdjLT5pZHgpOworCQlod2MtPnN0YXRlIHw9IFBFUkZfSEVTX1NUT1BQRUQgfCBQRVJGX0hFU19VUFRPREFURTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWlwc3BtdV9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlpbnQgaWR4OworCWludCBlcnIgPSAwOworCisJcGVyZl9wbXVfZGlzYWJsZShldmVudC0+cG11KTsKKworCS8qIFRvIGxvb2sgZm9yIGEgZnJlZSBjb3VudGVyIGZvciB0aGlzIGV2ZW50LiAqLworCWlkeCA9IG1pcHN4eF9wbXVfYWxsb2NfY291bnRlcihjcHVjLCBod2MpOworCWlmIChpZHggPCAwKSB7CisJCWVyciA9IGlkeDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhbiBldmVudCBpbiB0aGUgY291bnRlciB3ZSBhcmUgZ29pbmcgdG8gdXNlIHRoZW4KKwkgKiBtYWtlIHN1cmUgaXQgaXMgZGlzYWJsZWQuCisJICovCisJZXZlbnQtPmh3LmlkeCA9IGlkeDsKKwltaXBzeHhfcG11X2Rpc2FibGVfZXZlbnQoaWR4KTsKKwljcHVjLT5ldmVudHNbaWR4XSA9IGV2ZW50OworCisJaHdjLT5zdGF0ZSA9IFBFUkZfSEVTX1NUT1BQRUQgfCBQRVJGX0hFU19VUFRPREFURTsKKwlpZiAoZmxhZ3MgJiBQRVJGX0VGX1NUQVJUKQorCQltaXBzcG11X3N0YXJ0KGV2ZW50LCBQRVJGX0VGX1JFTE9BRCk7CisKKwkvKiBQcm9wYWdhdGUgb3VyIGNoYW5nZXMgdG8gdGhlIHVzZXJzcGFjZSBtYXBwaW5nLiAqLworCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKKworb3V0OgorCXBlcmZfcG11X2VuYWJsZShldmVudC0+cG11KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBtaXBzcG11X2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCWludCBpZHggPSBod2MtPmlkeDsKKworCVdBUk5fT04oaWR4IDwgMCB8fCBpZHggPj0gbWlwc3BtdS5udW1fY291bnRlcnMpOworCisJbWlwc3BtdV9zdG9wKGV2ZW50LCBQRVJGX0VGX1VQREFURSk7CisJY3B1Yy0+ZXZlbnRzW2lkeF0gPSBOVUxMOworCWNsZWFyX2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzayk7CisKKwlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIG1pcHNwbXVfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisKKwkvKiBEb24ndCByZWFkIGRpc2FibGVkIGNvdW50ZXJzISAqLworCWlmIChod2MtPmlkeCA8IDApCisJCXJldHVybjsKKworCW1pcHNwbXVfZXZlbnRfdXBkYXRlKGV2ZW50LCBod2MsIGh3Yy0+aWR4KTsKK30KKworc3RhdGljIHZvaWQgbWlwc3BtdV9lbmFibGUoc3RydWN0IHBtdSAqcG11KQoreworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAorCXdyaXRlX3VubG9jaygmcG11aW50X3J3bG9jayk7CisjZW5kaWYKKwlyZXN1bWVfbG9jYWxfY291bnRlcnMoKTsKK30KKworLyoKKyAqIE1JUFMgcGVyZm9ybWFuY2UgY291bnRlcnMgY2FuIGJlIHBlci1UQy4gVGhlIGNvbnRyb2wgcmVnaXN0ZXJzIGNhbgorICogbm90IGJlIGRpcmVjdGx5IGFjY2Vzc2VkIGFjY3Jvc3MgQ1BVcy4gSGVuY2UgaWYgd2Ugd2FudCB0byBkbyBnbG9iYWwKKyAqIGNvbnRyb2wsIHdlIG5lZWQgY3Jvc3MgQ1BVIGNhbGxzLiBvbl9lYWNoX2NwdSgpIGNhbiBoZWxwIHVzLCBidXQgd2UKKyAqIGNhbiBub3QgbWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLiBTbworICogaGVyZSB3ZSBwYXVzZSBsb2NhbCBjb3VudGVycyBhbmQgdGhlbiBncmFiIGEgcndsb2NrIGFuZCBsZWF2ZSB0aGUKKyAqIGNvdW50ZXJzIG9uIG90aGVyIENQVXMgYWxvbmUuIElmIGFueSBjb3VudGVyIGludGVycnVwdCByYWlzZXMgd2hpbGUKKyAqIHdlIG93biB0aGUgd3JpdGUgbG9jaywgc2ltcGx5IHBhdXNlIGxvY2FsIGNvdW50ZXJzIG9uIHRoYXQgQ1BVIGFuZAorICogc3BpbiBpbiB0aGUgaGFuZGxlci4gQWxzbyB3ZSBrbm93IHdlIHdvbid0IGJlIHN3aXRjaGVkIHRvIGFub3RoZXIKKyAqIENQVSBhZnRlciBwYXVzaW5nIGxvY2FsIGNvdW50ZXJzIGFuZCBiZWZvcmUgZ3JhYmJpbmcgdGhlIGxvY2suCisgKi8KK3N0YXRpYyB2b2lkIG1pcHNwbXVfZGlzYWJsZShzdHJ1Y3QgcG11ICpwbXUpCit7CisJcGF1c2VfbG9jYWxfY291bnRlcnMoKTsKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKKwl3cml0ZV9sb2NrKCZwbXVpbnRfcndsb2NrKTsKKyNlbmRpZgorfQorCitzdGF0aWMgYXRvbWljX3QgYWN0aXZlX2V2ZW50cyA9IEFUT01JQ19JTklUKDApOworc3RhdGljIERFRklORV9NVVRFWChwbXVfcmVzZXJ2ZV9tdXRleCk7CitzdGF0aWMgaW50ICgqc2F2ZV9wZXJmX2lycSkodm9pZCk7CisKK3N0YXRpYyBpbnQgbWlwc3BtdV9nZXRfaXJxKHZvaWQpCit7CisJaW50IGVycjsKKworCWlmIChtaXBzcG11LmlycSA+PSAwKSB7CisJCS8qIFJlcXVlc3QgbXkgb3duIGlycSBoYW5kbGVyLiAqLworCQllcnIgPSByZXF1ZXN0X2lycShtaXBzcG11LmlycSwgbWlwc3h4X3BtdV9oYW5kbGVfaXJxLAorCQkJSVJRRl9QRVJDUFUgfCBJUlFGX05PQkFMQU5DSU5HLAorCQkJIm1pcHNfcGVyZl9wbXUiLCBOVUxMKTsKKwkJaWYgKGVycikgeworCQkJcHJfd2FybmluZygiVW5hYmxlIHRvIHJlcXVlc3QgSVJRJWQgZm9yIE1JUFMgIgorCQkJICAgInBlcmZvcm1hbmNlIGNvdW50ZXJzIVxuIiwgbWlwc3BtdS5pcnEpOworCQl9CisJfSBlbHNlIGlmIChjcDBfcGVyZmNvdW50X2lycSA8IDApIHsKKwkJLyoKKwkJICogV2UgYXJlIHNoYXJpbmcgdGhlIGlycSBudW1iZXIgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0LgorCQkgKi8KKwkJc2F2ZV9wZXJmX2lycSA9IHBlcmZfaXJxOworCQlwZXJmX2lycSA9IG1pcHN4eF9wbXVfaGFuZGxlX3NoYXJlZF9pcnE7CisJCWVyciA9IDA7CisJfSBlbHNlIHsKKwkJcHJfd2FybmluZygiVGhlIHBsYXRmb3JtIGhhc24ndCBwcm9wZXJseSBkZWZpbmVkIGl0cyAiCisJCQkiaW50ZXJydXB0IGNvbnRyb2xsZXIuXG4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBtaXBzcG11X2ZyZWVfaXJxKHZvaWQpCit7CisJaWYgKG1pcHNwbXUuaXJxID49IDApCisJCWZyZWVfaXJxKG1pcHNwbXUuaXJxLCBOVUxMKTsKKwllbHNlIGlmIChjcDBfcGVyZmNvdW50X2lycSA8IDApCisJCXBlcmZfaXJxID0gc2F2ZV9wZXJmX2lycTsKK30KKworLyoKKyAqIG1pcHN4eC9ybTkwMDAvbG9vbmdzb24yIGhhdmUgZGlmZmVyZW50IHBlcmZvcm1hbmNlIGNvdW50ZXJzLCB0aGV5IGhhdmUKKyAqIHNwZWNpZmljIGxvdy1sZXZlbCBpbml0IHJvdXRpbmVzLgorICovCitzdGF0aWMgdm9pZCByZXNldF9jb3VudGVycyh2b2lkICphcmcpOworc3RhdGljIGludCBfX2h3X3BlcmZfZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOworCitzdGF0aWMgdm9pZCBod19wZXJmX2V2ZW50X2Rlc3Ryb3koc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWlmIChhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKCZhY3RpdmVfZXZlbnRzLAorCQkJCSZwbXVfcmVzZXJ2ZV9tdXRleCkpIHsKKwkJLyoKKwkJICogV2UgbXVzdCBub3QgY2FsbCB0aGUgZGVzdHJveSBmdW5jdGlvbiB3aXRoIGludGVycnVwdHMKKwkJICogZGlzYWJsZWQuCisJCSAqLworCQlvbl9lYWNoX2NwdShyZXNldF9jb3VudGVycywKKwkJCSh2b2lkICopKGxvbmcpbWlwc3BtdS5udW1fY291bnRlcnMsIDEpOworCQltaXBzcG11X2ZyZWVfaXJxKCk7CisJCW11dGV4X3VubG9jaygmcG11X3Jlc2VydmVfbXV0ZXgpOworCX0KK30KKworc3RhdGljIGludCBtaXBzcG11X2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChldmVudC0+YXR0ci50eXBlKSB7CisJY2FzZSBQRVJGX1RZUEVfUkFXOgorCWNhc2UgUEVSRl9UWVBFX0hBUkRXQVJFOgorCWNhc2UgUEVSRl9UWVBFX0hXX0NBQ0hFOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmIChldmVudC0+Y3B1ID49IG5yX2NwdW1hc2tfYml0cyB8fAorCSAgICAoZXZlbnQtPmNwdSA+PSAwICYmICFjcHVfb25saW5lKGV2ZW50LT5jcHUpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJmFjdGl2ZV9ldmVudHMpKSB7CisJCWlmIChhdG9taWNfcmVhZCgmYWN0aXZlX2V2ZW50cykgPiBNSVBTX01BWF9IV0VWRU5UUykgeworCQkJYXRvbWljX2RlYygmYWN0aXZlX2V2ZW50cyk7CisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfQorCisJCW11dGV4X2xvY2soJnBtdV9yZXNlcnZlX211dGV4KTsKKwkJaWYgKGF0b21pY19yZWFkKCZhY3RpdmVfZXZlbnRzKSA9PSAwKQorCQkJZXJyID0gbWlwc3BtdV9nZXRfaXJxKCk7CisKKwkJaWYgKCFlcnIpCisJCQlhdG9taWNfaW5jKCZhY3RpdmVfZXZlbnRzKTsKKwkJbXV0ZXhfdW5sb2NrKCZwbXVfcmVzZXJ2ZV9tdXRleCk7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IF9faHdfcGVyZl9ldmVudF9pbml0KGV2ZW50KTsKKwlpZiAoZXJyKQorCQlod19wZXJmX2V2ZW50X2Rlc3Ryb3koZXZlbnQpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwbXUgcG11ID0geworCS5wbXVfZW5hYmxlCT0gbWlwc3BtdV9lbmFibGUsCisJLnBtdV9kaXNhYmxlCT0gbWlwc3BtdV9kaXNhYmxlLAorCS5ldmVudF9pbml0CT0gbWlwc3BtdV9ldmVudF9pbml0LAorCS5hZGQJCT0gbWlwc3BtdV9hZGQsCisJLmRlbAkJPSBtaXBzcG11X2RlbCwKKwkuc3RhcnQJCT0gbWlwc3BtdV9zdGFydCwKKwkuc3RvcAkJPSBtaXBzcG11X3N0b3AsCisJLnJlYWQJCT0gbWlwc3BtdV9yZWFkLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBtaXBzcG11X3BlcmZfZXZlbnRfZW5jb2RlKGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldikKK3sKKy8qCisgKiBUb3AgOCBiaXRzIGZvciByYW5nZSwgbmV4dCAxNiBiaXRzIGZvciBjbnRyX21hc2ssIGxvd2VzdCA4IGJpdHMgZm9yCisgKiBldmVudF9pZC4KKyAqLworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAorCXJldHVybiAoKHVuc2lnbmVkIGludClwZXYtPnJhbmdlIDw8IDI0KSB8CisJCShwZXYtPmNudHJfbWFzayAmIDB4ZmZmZjAwKSB8CisJCShwZXYtPmV2ZW50X2lkICYgMHhmZik7CisjZWxzZQorCXJldHVybiAocGV2LT5jbnRyX21hc2sgJiAweGZmZmYwMCkgfAorCQkocGV2LT5ldmVudF9pZCAmIDB4ZmYpOworI2VuZGlmCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICptaXBzcG11X21hcF9nZW5lcmFsX2V2ZW50KGludCBpZHgpCit7CisJY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqcGV2OworCisJcGV2ID0gKCgqbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcClbaWR4XS5ldmVudF9pZCA9PQorCQlVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEID8gRVJSX1BUUigtRU9QTk9UU1VQUCkgOgorCQkmKCptaXBzcG11LmdlbmVyYWxfZXZlbnRfbWFwKVtpZHhdKTsKKworCXJldHVybiBwZXY7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICptaXBzcG11X21hcF9jYWNoZV9ldmVudCh1NjQgY29uZmlnKQoreworCXVuc2lnbmVkIGludCBjYWNoZV90eXBlLCBjYWNoZV9vcCwgY2FjaGVfcmVzdWx0OworCWNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldjsKKworCWNhY2hlX3R5cGUgPSAoY29uZmlnID4+IDApICYgMHhmZjsKKwlpZiAoY2FjaGVfdHlwZSA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwljYWNoZV9vcCA9IChjb25maWcgPj4gOCkgJiAweGZmOworCWlmIChjYWNoZV9vcCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwljYWNoZV9yZXN1bHQgPSAoY29uZmlnID4+IDE2KSAmIDB4ZmY7CisJaWYgKGNhY2hlX3Jlc3VsdCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcGV2ID0gJigoKm1pcHNwbXUuY2FjaGVfZXZlbnRfbWFwKQorCQkJCQlbY2FjaGVfdHlwZV0KKwkJCQkJW2NhY2hlX29wXQorCQkJCQlbY2FjaGVfcmVzdWx0XSk7CisKKwlpZiAocGV2LT5ldmVudF9pZCA9PSBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEKQorCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisKKwlyZXR1cm4gcGV2OworCit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfZXZlbnQoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCisJICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCBmYWtlX2h3YyA9IGV2ZW50LT5odzsKKworCS8qIEFsbG93IG1peGVkIGV2ZW50IGdyb3VwLiBTbyByZXR1cm4gMSB0byBwYXNzIHZhbGlkYXRpb24uICovCisJaWYgKGV2ZW50LT5wbXUgIT0gJnBtdSB8fCBldmVudC0+c3RhdGUgPD0gUEVSRl9FVkVOVF9TVEFURV9PRkYpCisJCXJldHVybiAxOworCisJcmV0dXJuIG1pcHN4eF9wbXVfYWxsb2NfY291bnRlcihjcHVjLCAmZmFrZV9od2MpID49IDA7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfZ3JvdXAoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBwZXJmX2V2ZW50ICpzaWJsaW5nLCAqbGVhZGVyID0gZXZlbnQtPmdyb3VwX2xlYWRlcjsKKwlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyBmYWtlX2NwdWM7CisKKwltZW1zZXQoJmZha2VfY3B1YywgMCwgc2l6ZW9mKGZha2VfY3B1YykpOworCisJaWYgKCF2YWxpZGF0ZV9ldmVudCgmZmFrZV9jcHVjLCBsZWFkZXIpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2libGluZywgJmxlYWRlci0+c2libGluZ19saXN0LCBncm91cF9lbnRyeSkgeworCQlpZiAoIXZhbGlkYXRlX2V2ZW50KCZmYWtlX2NwdWMsIHNpYmxpbmcpKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJaWYgKCF2YWxpZGF0ZV9ldmVudCgmZmFrZV9jcHVjLCBldmVudCkpCisJCXJldHVybiAtRU5PU1BDOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMgbmVlZGVkIGJ5IHNwZWNpZmljIGlycSBoYW5kbGVycyBpbiBwZXJmX2V2ZW50XyouYyAqLworc3RhdGljIHZvaWQgaGFuZGxlX2Fzc29jaWF0ZWRfZXZlbnQoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCisJCQkJICAgIGludCBpZHgsIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBjcHVjLT5ldmVudHNbaWR4XTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKworCW1pcHNwbXVfZXZlbnRfdXBkYXRlKGV2ZW50LCBod2MsIGlkeCk7CisJZGF0YS0+cGVyaW9kID0gZXZlbnQtPmh3Lmxhc3RfcGVyaW9kOworCWlmICghbWlwc3BtdV9ldmVudF9zZXRfcGVyaW9kKGV2ZW50LCBod2MsIGlkeCkpCisJCXJldHVybjsKKworCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCBkYXRhLCByZWdzKSkKKwkJbWlwc3h4X3BtdV9kaXNhYmxlX2V2ZW50KGlkeCk7Cit9CisKKworc3RhdGljIGludCBfX25fY291bnRlcnModm9pZCkKIHsKIAlpZiAoIShyZWFkX2MwX2NvbmZpZzEoKSAmIE1fQ09ORklHMV9QQykpCiAJCXJldHVybiAwOwpAQCAtMTM1LDcgKzc3Nyw3IEBACiAJcmV0dXJuIDQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5fY291bnRlcnModm9pZCkKK3N0YXRpYyBpbnQgbl9jb3VudGVycyh2b2lkKQogewogCWludCBjb3VudGVyczsKIApAQCAtMTYxLDk4ICs4MDMsMjAgQEAKIAlpbnQgY291bnRlcnMgPSAoaW50KShsb25nKWFyZzsKIAlzd2l0Y2ggKGNvdW50ZXJzKSB7CiAJY2FzZSA0OgotCQl3X2MwX3BlcmZjdHJsMygwKTsKLQkJd19jMF9wZXJmY250cjMoMCk7CisJCW1pcHN4eF9wbXVfd3JpdGVfY29udHJvbCgzLCAwKTsKKwkJbWlwc3BtdS53cml0ZV9jb3VudGVyKDMsIDApOwogCWNhc2UgMzoKLQkJd19jMF9wZXJmY3RybDIoMCk7Ci0JCXdfYzBfcGVyZmNudHIyKDApOworCQltaXBzeHhfcG11X3dyaXRlX2NvbnRyb2woMiwgMCk7CisJCW1pcHNwbXUud3JpdGVfY291bnRlcigyLCAwKTsKIAljYXNlIDI6Ci0JCXdfYzBfcGVyZmN0cmwxKDApOwotCQl3X2MwX3BlcmZjbnRyMSgwKTsKKwkJbWlwc3h4X3BtdV93cml0ZV9jb250cm9sKDEsIDApOworCQltaXBzcG11LndyaXRlX2NvdW50ZXIoMSwgMCk7CiAJY2FzZSAxOgotCQl3X2MwX3BlcmZjdHJsMCgwKTsKLQkJd19jMF9wZXJmY250cjAoMCk7CisJCW1pcHN4eF9wbXVfd3JpdGVfY29udHJvbCgwLCAwKTsKKwkJbWlwc3BtdS53cml0ZV9jb3VudGVyKDAsIDApOwogCX0KIH0KIAotc3RhdGljIGlubGluZSB1NjQKLW1pcHN4eF9wbXVfcmVhZF9jb3VudGVyKHVuc2lnbmVkIGludCBpZHgpCi17Ci0Jc3dpdGNoIChpZHgpIHsKLQljYXNlIDA6Ci0JCXJldHVybiByX2MwX3BlcmZjbnRyMCgpOwotCWNhc2UgMToKLQkJcmV0dXJuIHJfYzBfcGVyZmNudHIxKCk7Ci0JY2FzZSAyOgotCQlyZXR1cm4gcl9jMF9wZXJmY250cjIoKTsKLQljYXNlIDM6Ci0JCXJldHVybiByX2MwX3BlcmZjbnRyMygpOwotCWRlZmF1bHQ6Ci0JCVdBUk5fT05DRSgxLCAiSW52YWxpZCBwZXJmb3JtYW5jZSBjb3VudGVyIG51bWJlciAoJWQpXG4iLCBpZHgpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbWlwc3h4X3BtdV93cml0ZV9jb3VudGVyKHVuc2lnbmVkIGludCBpZHgsIHU2NCB2YWwpCi17Ci0Jc3dpdGNoIChpZHgpIHsKLQljYXNlIDA6Ci0JCXdfYzBfcGVyZmNudHIwKHZhbCk7Ci0JCXJldHVybjsKLQljYXNlIDE6Ci0JCXdfYzBfcGVyZmNudHIxKHZhbCk7Ci0JCXJldHVybjsKLQljYXNlIDI6Ci0JCXdfYzBfcGVyZmNudHIyKHZhbCk7Ci0JCXJldHVybjsKLQljYXNlIDM6Ci0JCXdfYzBfcGVyZmNudHIzKHZhbCk7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1taXBzeHhfcG11X3JlYWRfY29udHJvbCh1bnNpZ25lZCBpbnQgaWR4KQotewotCXN3aXRjaCAoaWR4KSB7Ci0JY2FzZSAwOgotCQlyZXR1cm4gcl9jMF9wZXJmY3RybDAoKTsKLQljYXNlIDE6Ci0JCXJldHVybiByX2MwX3BlcmZjdHJsMSgpOwotCWNhc2UgMjoKLQkJcmV0dXJuIHJfYzBfcGVyZmN0cmwyKCk7Ci0JY2FzZSAzOgotCQlyZXR1cm4gcl9jMF9wZXJmY3RybDMoKTsKLQlkZWZhdWx0OgotCQlXQVJOX09OQ0UoMSwgIkludmFsaWQgcGVyZm9ybWFuY2UgY291bnRlciBudW1iZXIgKCVkKVxuIiwgaWR4KTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1pcHN4eF9wbXVfd3JpdGVfY29udHJvbCh1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBpbnQgdmFsKQotewotCXN3aXRjaCAoaWR4KSB7Ci0JY2FzZSAwOgotCQl3X2MwX3BlcmZjdHJsMCh2YWwpOwotCQlyZXR1cm47Ci0JY2FzZSAxOgotCQl3X2MwX3BlcmZjdHJsMSh2YWwpOwotCQlyZXR1cm47Ci0JY2FzZSAyOgotCQl3X2MwX3BlcmZjdHJsMih2YWwpOwotCQlyZXR1cm47Ci0JY2FzZSAzOgotCQl3X2MwX3BlcmZjdHJsMyh2YWwpOwotCQlyZXR1cm47Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCi1zdGF0aWMgREVGSU5FX1JXTE9DSyhwbXVpbnRfcndsb2NrKTsKLSNlbmRpZgotCiAvKiAyNEsvMzRLLzEwMDRLIGNvcmVzIGNhbiBzaGFyZSB0aGUgc2FtZSBldmVudCBtYXAuICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCBtaXBzeHhjb3JlX2V2ZW50X21hcAogCQkJCVtQRVJGX0NPVU5UX0hXX01BWF0gPSB7CkBAIC0yNzcsNiArODQxLDE2IEBACiAJW1BFUkZfQ09VTlRfSFdfQlVTX0NZQ0xFU10gPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IG9jdGVvbl9ldmVudF9tYXBbUEVSRl9DT1VOVF9IV19NQVhdID0geworCVtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdID0geyAweDAxLCBDTlRSX0FMTCB9LAorCVtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10gPSB7IDB4MDMsIENOVFJfQUxMIH0sCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10gPSB7IDB4MmIsIENOVFJfQUxMIH0sCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXSA9IHsgMHgyZSwgQ05UUl9BTEwgIH0sCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10gPSB7IDB4MDgsIENOVFJfQUxMIH0sCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10gPSB7IDB4MDksIENOVFJfQUxMIH0sCisJW1BFUkZfQ09VTlRfSFdfQlVTX0NZQ0xFU10gPSB7IDB4MjUsIENOVFJfQUxMIH0sCit9OworCiAvKiAyNEsvMzRLLzEwMDRLIGNvcmVzIGNhbiBzaGFyZSB0aGUgc2FtZSBjYWNoZSBldmVudCBtYXAuICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCBtaXBzeHhjb3JlX2NhY2hlX21hcAogCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KQEAgLTUxMCwxMCArMTA4NCwxMDUgQEAKIH0sCiB9OwogCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IG9jdGVvbl9jYWNoZV9tYXAKKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdID0geworW0MoTDFEKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IDB4MmIsIENOVFJfQUxMIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IDB4MmUsIENOVFJfQUxMIH0sCisJfSwKKwlbQyhPUF9XUklURSldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IDB4MzAsIENOVFJfQUxMIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKK30sCitbQyhMMUkpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgMHgxOCwgQ05UUl9BTEwgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCisJW0MoT1BfV1JJVEUpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgMHgxOSwgQ05UUl9BTEwgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCit9LAorW0MoTEwpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKKwlbQyhPUF9XUklURSldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCisJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorfSwKK1tDKERUTEIpXSA9IHsKKwkvKgorCSAqIE9ubHkgZ2VuZXJhbCBEVExCIG1pc3NlcyBhcmUgY291bnRlZCB1c2UgdGhlIHNhbWUgZXZlbnQgZm9yCisJICogcmVhZCBhbmQgd3JpdGUuCisJICovCisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgMHgzNSwgQ05UUl9BTEwgfSwKKwl9LAorCVtDKE9QX1dSSVRFKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyAweDM1LCBDTlRSX0FMTCB9LAorCX0sCisJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorfSwKK1tDKElUTEIpXSA9IHsKKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyAweDM3LCBDTlRSX0FMTCB9LAorCX0sCisJW0MoT1BfV1JJVEUpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKK30sCitbQyhCUFUpXSA9IHsKKwkvKiBVc2luZyB0aGUgc2FtZSBjb2RlIGZvciAqSFdfQlJBTkNIKiAqLworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorCVtDKE9QX1dSSVRFKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKKwlbQyhPUF9QUkVGRVRDSCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCit9LAorfTsKKwogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAotc3RhdGljIHZvaWQKLWNoZWNrX2FuZF9jYWxjX3JhbmdlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKLQkJCWNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldikKK3N0YXRpYyB2b2lkIGNoZWNrX2FuZF9jYWxjX3JhbmdlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqcGV2KQogewogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwogCkBAIC01MzYsOSArMTIwNSw4IEBACiAJCWh3Yy0+Y29uZmlnX2Jhc2UgfD0gTV9UQ19FTl9BTEw7CiB9CiAjZWxzZQotc3RhdGljIHZvaWQKLWNoZWNrX2FuZF9jYWxjX3JhbmdlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKLQkJCWNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldikKK3N0YXRpYyB2b2lkIGNoZWNrX2FuZF9jYWxjX3JhbmdlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqcGV2KQogewogfQogI2VuZGlmCkBAIC01NjAsNyArMTIyOCw3IEBACiAJfSBlbHNlIGlmIChQRVJGX1RZUEVfUkFXID09IGV2ZW50LT5hdHRyLnR5cGUpIHsKIAkJLyogV2UgYXJlIHdvcmtpbmcgb24gdGhlIGdsb2JhbCByYXcgZXZlbnQuICovCiAJCW11dGV4X2xvY2soJnJhd19ldmVudF9tdXRleCk7Ci0JCXBldiA9IG1pcHNwbXUtPm1hcF9yYXdfZXZlbnQoZXZlbnQtPmF0dHIuY29uZmlnKTsKKwkJcGV2ID0gbWlwc3BtdS5tYXBfcmF3X2V2ZW50KGV2ZW50LT5hdHRyLmNvbmZpZyk7CiAJfSBlbHNlIHsKIAkJLyogVGhlIGV2ZW50IHR5cGUgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZC4gKi8KIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtNjA1LDcgKzEyNzMsNyBAQAogCWh3Yy0+Y29uZmlnID0gMDsKIAogCWlmICghaHdjLT5zYW1wbGVfcGVyaW9kKSB7Ci0JCWh3Yy0+c2FtcGxlX3BlcmlvZCAgPSBNQVhfUEVSSU9EOworCQlod2MtPnNhbXBsZV9wZXJpb2QgID0gbWlwc3BtdS5tYXhfcGVyaW9kOwogCQlod2MtPmxhc3RfcGVyaW9kICAgID0gaHdjLT5zYW1wbGVfcGVyaW9kOwogCQlsb2NhbDY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgaHdjLT5zYW1wbGVfcGVyaW9kKTsKIAl9CkBAIC02MTgsNzAgKzEyODYsNDcgQEAKIAl9CiAKIAlldmVudC0+ZGVzdHJveSA9IGh3X3BlcmZfZXZlbnRfZGVzdHJveTsKLQogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIHBhdXNlX2xvY2FsX2NvdW50ZXJzKHZvaWQpCiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKLQlpbnQgY291bnRlcnMgPSBtaXBzcG11LT5udW1fY291bnRlcnM7CisJaW50IGN0ciA9IG1pcHNwbXUubnVtX2NvdW50ZXJzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jc3dpdGNoIChjb3VudGVycykgewotCWNhc2UgNDoKLQkJY3B1Yy0+c2F2ZWRfY3RybFszXSA9IHJfYzBfcGVyZmN0cmwzKCk7Ci0JCXdfYzBfcGVyZmN0cmwzKGNwdWMtPnNhdmVkX2N0cmxbM10gJgotCQkJfk1fUEVSRkNUTF9DT1VOVF9FVkVOVF9XSEVORVZFUik7Ci0JY2FzZSAzOgotCQljcHVjLT5zYXZlZF9jdHJsWzJdID0gcl9jMF9wZXJmY3RybDIoKTsKLQkJd19jMF9wZXJmY3RybDIoY3B1Yy0+c2F2ZWRfY3RybFsyXSAmCi0JCQl+TV9QRVJGQ1RMX0NPVU5UX0VWRU5UX1dIRU5FVkVSKTsKLQljYXNlIDI6Ci0JCWNwdWMtPnNhdmVkX2N0cmxbMV0gPSByX2MwX3BlcmZjdHJsMSgpOwotCQl3X2MwX3BlcmZjdHJsMShjcHVjLT5zYXZlZF9jdHJsWzFdICYKLQkJCX5NX1BFUkZDVExfQ09VTlRfRVZFTlRfV0hFTkVWRVIpOwotCWNhc2UgMToKLQkJY3B1Yy0+c2F2ZWRfY3RybFswXSA9IHJfYzBfcGVyZmN0cmwwKCk7Ci0JCXdfYzBfcGVyZmN0cmwwKGNwdWMtPnNhdmVkX2N0cmxbMF0gJgotCQkJfk1fUEVSRkNUTF9DT1VOVF9FVkVOVF9XSEVORVZFUik7Ci0JfQorCWRvIHsKKwkJY3RyLS07CisJCWNwdWMtPnNhdmVkX2N0cmxbY3RyXSA9IG1pcHN4eF9wbXVfcmVhZF9jb250cm9sKGN0cik7CisJCW1pcHN4eF9wbXVfd3JpdGVfY29udHJvbChjdHIsIGNwdWMtPnNhdmVkX2N0cmxbY3RyXSAmCisJCQkJCSB+TV9QRVJGQ1RMX0NPVU5UX0VWRU5UX1dIRU5FVkVSKTsKKwl9IHdoaWxlIChjdHIgPiAwKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlc3VtZV9sb2NhbF9jb3VudGVycyh2b2lkKQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7Ci0JaW50IGNvdW50ZXJzID0gbWlwc3BtdS0+bnVtX2NvdW50ZXJzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGN0ciA9IG1pcHNwbXUubnVtX2NvdW50ZXJzOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXN3aXRjaCAoY291bnRlcnMpIHsKLQljYXNlIDQ6Ci0JCXdfYzBfcGVyZmN0cmwzKGNwdWMtPnNhdmVkX2N0cmxbM10pOwotCWNhc2UgMzoKLQkJd19jMF9wZXJmY3RybDIoY3B1Yy0+c2F2ZWRfY3RybFsyXSk7Ci0JY2FzZSAyOgotCQl3X2MwX3BlcmZjdHJsMShjcHVjLT5zYXZlZF9jdHJsWzFdKTsKLQljYXNlIDE6Ci0JCXdfYzBfcGVyZmN0cmwwKGNwdWMtPnNhdmVkX2N0cmxbMF0pOwotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJZG8geworCQljdHItLTsKKwkJbWlwc3h4X3BtdV93cml0ZV9jb250cm9sKGN0ciwgY3B1Yy0+c2F2ZWRfY3RybFtjdHJdKTsKKwl9IHdoaWxlIChjdHIgPiAwKTsKIH0KIAogc3RhdGljIGludCBtaXBzeHhfcG11X2hhbmRsZV9zaGFyZWRfaXJxKHZvaWQpCiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKIAlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSBkYXRhOwotCXVuc2lnbmVkIGludCBjb3VudGVycyA9IG1pcHNwbXUtPm51bV9jb3VudGVyczsKLQl1bnNpZ25lZCBpbnQgY291bnRlcjsKKwl1bnNpZ25lZCBpbnQgY291bnRlcnMgPSBtaXBzcG11Lm51bV9jb3VudGVyczsKKwl1NjQgY291bnRlcjsKIAlpbnQgaGFuZGxlZCA9IElSUV9OT05FOwogCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCiAJaWYgKGNwdV9oYXNfbWlwc19yMiAmJiAhKHJlYWRfYzBfY2F1c2UoKSAmICgxIDw8IDI2KSkpCiAJCXJldHVybiBoYW5kbGVkOwotCiAJLyoKIAkgKiBGaXJzdCB3ZSBwYXVzZSB0aGUgbG9jYWwgY291bnRlcnMsIHNvIHRoYXQgd2hlbiB3ZSBhcmUgbG9ja2VkCiAJICogaGVyZSwgdGhlIGNvdW50ZXJzIGFyZSBhbGwgcGF1c2VkLiBXaGVuIGl0IGdldHMgbG9ja2VkIGR1ZSB0bwpAQCAtNzAyLDEzICsxMzQ3LDkgQEAKICNkZWZpbmUgSEFORExFX0NPVU5URVIobikJCQkJCQlcCiAJY2FzZSBuICsgMToJCQkJCQkJXAogCQlpZiAodGVzdF9iaXQobiwgY3B1Yy0+dXNlZF9tYXNrKSkgewkJCVwKLQkJCWNvdW50ZXIgPSByX2MwX3BlcmZjbnRyICMjIG4oKTsJCQlcCi0JCQlpZiAoY291bnRlciAmIE1fQ09VTlRFUl9PVkVSRkxPVykgewkJXAotCQkJCXdfYzBfcGVyZmNudHIgIyMgbihjb3VudGVyICYJCVwKLQkJCQkJCVZBTElEX0NPVU5UKTsJCVwKLQkJCQlpZiAodGVzdF9hbmRfY2hhbmdlX2JpdChuLCBjcHVjLT5tc2JzKSkJXAotCQkJCQloYW5kbGVfYXNzb2NpYXRlZF9ldmVudChjcHVjLAlcCi0JCQkJCQluLCAmZGF0YSwgcmVncyk7CVwKKwkJCWNvdW50ZXIgPSBtaXBzcG11LnJlYWRfY291bnRlcihuKTsJCVwKKwkJCWlmIChjb3VudGVyICYgbWlwc3BtdS5vdmVyZmxvdykgewkJXAorCQkJCWhhbmRsZV9hc3NvY2lhdGVkX2V2ZW50KGNwdWMsIG4sICZkYXRhLCByZWdzKTsgXAogCQkJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsJCQlcCiAJCQl9CQkJCQkJXAogCQl9CkBAIC03MzMsMTA0ICsxMzc0LDExIEBACiAJcmV0dXJuIGhhbmRsZWQ7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdAotbWlwc3h4X3BtdV9oYW5kbGVfaXJxKGludCBpcnEsIHZvaWQgKmRldikKK3N0YXRpYyBpcnFyZXR1cm5fdCBtaXBzeHhfcG11X2hhbmRsZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQogewogCXJldHVybiBtaXBzeHhfcG11X2hhbmRsZV9zaGFyZWRfaXJxKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1pcHN4eF9wbXVfc3RhcnQodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKLQl3cml0ZV91bmxvY2soJnBtdWludF9yd2xvY2spOwotI2VuZGlmCi0JcmVzdW1lX2xvY2FsX2NvdW50ZXJzKCk7Ci19Ci0KLS8qCi0gKiBNSVBTIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGNhbiBiZSBwZXItVEMuIFRoZSBjb250cm9sIHJlZ2lzdGVycyBjYW4KLSAqIG5vdCBiZSBkaXJlY3RseSBhY2Nlc3NlZCBhY3Jvc3MgQ1BVcy4gSGVuY2UgaWYgd2Ugd2FudCB0byBkbyBnbG9iYWwKLSAqIGNvbnRyb2wsIHdlIG5lZWQgY3Jvc3MgQ1BVIGNhbGxzLiBvbl9lYWNoX2NwdSgpIGNhbiBoZWxwIHVzLCBidXQgd2UKLSAqIGNhbiBub3QgbWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLiBTbwotICogaGVyZSB3ZSBwYXVzZSBsb2NhbCBjb3VudGVycyBhbmQgdGhlbiBncmFiIGEgcndsb2NrIGFuZCBsZWF2ZSB0aGUKLSAqIGNvdW50ZXJzIG9uIG90aGVyIENQVXMgYWxvbmUuIElmIGFueSBjb3VudGVyIGludGVycnVwdCByYWlzZXMgd2hpbGUKLSAqIHdlIG93biB0aGUgd3JpdGUgbG9jaywgc2ltcGx5IHBhdXNlIGxvY2FsIGNvdW50ZXJzIG9uIHRoYXQgQ1BVIGFuZAotICogc3BpbiBpbiB0aGUgaGFuZGxlci4gQWxzbyB3ZSBrbm93IHdlIHdvbid0IGJlIHN3aXRjaGVkIHRvIGFub3RoZXIKLSAqIENQVSBhZnRlciBwYXVzaW5nIGxvY2FsIGNvdW50ZXJzIGFuZCBiZWZvcmUgZ3JhYmJpbmcgdGhlIGxvY2suCi0gKi8KLXN0YXRpYyB2b2lkIG1pcHN4eF9wbXVfc3RvcCh2b2lkKQotewotCXBhdXNlX2xvY2FsX2NvdW50ZXJzKCk7Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCi0Jd3JpdGVfbG9jaygmcG11aW50X3J3bG9jayk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludAotbWlwc3h4X3BtdV9hbGxvY19jb3VudGVyKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAotCQkJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YykKLXsKLQlpbnQgaTsKLQotCS8qCi0JICogV2Ugb25seSBuZWVkIHRvIGNhcmUgdGhlIGNvdW50ZXIgbWFzay4gVGhlIHJhbmdlIGhhcyBiZWVuCi0JICogY2hlY2tlZCBkZWZpbml0ZWx5LgotCSAqLwotCXVuc2lnbmVkIGxvbmcgY250cl9tYXNrID0gKGh3Yy0+ZXZlbnRfYmFzZSA+PiA4KSAmIDB4ZmZmZjsKLQotCWZvciAoaSA9IG1pcHNwbXUtPm51bV9jb3VudGVycyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCS8qCi0JCSAqIE5vdGUgdGhhdCBzb21lIE1JUFMgcGVyZiBldmVudHMgY2FuIGJlIGNvdW50ZWQgYnkgYm90aAotCQkgKiBldmVuIGFuZCBvZGQgY291bnRlcnMsIHdoZXJlc2FzIG1hbnkgb3RoZXIgYXJlIG9ubHkgYnkKLQkJICogZXZlbiBfb3JfIG9kZCBjb3VudGVycy4gVGhpcyBpbnRyb2R1Y2VzIGFuIGlzc3VlIHRoYXQKLQkJICogd2hlbiB0aGUgZm9ybWVyIGtpbmQgb2YgZXZlbnQgdGFrZXMgdGhlIGNvdW50ZXIgdGhlCi0JCSAqIGxhdHRlciBraW5kIG9mIGV2ZW50IHdhbnRzIHRvIHVzZSwgdGhlbiB0aGUgImNvdW50ZXIKLQkJICogYWxsb2NhdGlvbiIgZm9yIHRoZSBsYXR0ZXIgZXZlbnQgd2lsbCBmYWlsLiBJbiBmYWN0IGlmCi0JCSAqIHRoZXkgY2FuIGJlIGR5bmFtaWNhbGx5IHN3YXBwZWQsIHRoZXkgYm90aCBmZWVsIGhhcHB5LgotCQkgKiBCdXQgaGVyZSB3ZSBsZWF2ZSB0aGlzIGlzc3VlIGFsb25lIGZvciBub3cuCi0JCSAqLwotCQlpZiAodGVzdF9iaXQoaSwgJmNudHJfbWFzaykgJiYKLQkJCSF0ZXN0X2FuZF9zZXRfYml0KGksIGNwdWMtPnVzZWRfbWFzaykpCi0JCQlyZXR1cm4gaTsKLQl9Ci0KLQlyZXR1cm4gLUVBR0FJTjsKLX0KLQotc3RhdGljIHZvaWQKLW1pcHN4eF9wbXVfZW5hYmxlX2V2ZW50KHN0cnVjdCBod19wZXJmX2V2ZW50ICpldnQsIGludCBpZHgpCi17Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JV0FSTl9PTihpZHggPCAwIHx8IGlkeCA+PSBtaXBzcG11LT5udW1fY291bnRlcnMpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWNwdWMtPnNhdmVkX2N0cmxbaWR4XSA9IE1fUEVSRkNUTF9FVkVOVChldnQtPmV2ZW50X2Jhc2UgJiAweGZmKSB8Ci0JCShldnQtPmNvbmZpZ19iYXNlICYgTV9QRVJGQ1RMX0NPTkZJR19NQVNLKSB8Ci0JCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHQgZW5hYmxlZC4gKi8KLQkJTV9QRVJGQ1RMX0lOVEVSUlVQVF9FTkFCTEU7Ci0JLyoKLQkgKiBXZSBkbyBub3QgYWN0dWFsbHkgbGV0IHRoZSBjb3VudGVyIHJ1bi4gTGVhdmUgaXQgdW50aWwgc3RhcnQoKS4KLQkgKi8KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1taXBzeHhfcG11X2Rpc2FibGVfZXZlbnQoaW50IGlkeCkKLXsKLQlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlXQVJOX09OKGlkeCA8IDAgfHwgaWR4ID49IG1pcHNwbXUtPm51bV9jb3VudGVycyk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JY3B1Yy0+c2F2ZWRfY3RybFtpZHhdID0gbWlwc3h4X3BtdV9yZWFkX2NvbnRyb2woaWR4KSAmCi0JCX5NX1BFUkZDVExfQ09VTlRfRVZFTlRfV0hFTkVWRVI7Ci0JbWlwc3h4X3BtdV93cml0ZV9jb250cm9sKGlkeCwgY3B1Yy0+c2F2ZWRfY3RybFtpZHhdKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KIC8qIDI0SyAqLwogI2RlZmluZSBJU19VTlNVUFBPUlRFRF8yNEtfRVZFTlQociwgYikJCQkJCVwKIAkoKGIpID09IDEyIHx8IChyKSA9PSAxNTEgfHwgKHIpID09IDE1MiB8fCAoYikgPT0gMjYgfHwJCVwKQEAgLTg5Miw4ICsxNDQwLDcgQEAKICAqIHRoZW4gMTI4IG5lZWRzIHRvIGJlIGFkZGVkIHRvIDE1IGFzIHRoZSBpbnB1dCBmb3IgdGhlIGV2ZW50IGNvbmZpZywKICAqIGkuZS4sIDE0MyAoMHg4RikgdG8gYmUgdXNlZC4KICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKgotbWlwc3h4X3BtdV9tYXBfcmF3X2V2ZW50KHU2NCBjb25maWcpCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqbWlwc3h4X3BtdV9tYXBfcmF3X2V2ZW50KHU2NCBjb25maWcpCiB7CiAJdW5zaWduZWQgaW50IHJhd19pZCA9IGNvbmZpZyAmIDB4ZmY7CiAJdW5zaWduZWQgaW50IGJhc2VfaWQgPSByYXdfaWQgJiAweDdmOwpAQCAtOTcwLDQwICsxNTE3LDQ0IEBACiAJcmV0dXJuICZyYXdfZXZlbnQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWlwc19wbXUgbWlwc3h4Y29yZV9wbXUgPSB7Ci0JLmhhbmRsZV9pcnEgPSBtaXBzeHhfcG11X2hhbmRsZV9pcnEsCi0JLmhhbmRsZV9zaGFyZWRfaXJxID0gbWlwc3h4X3BtdV9oYW5kbGVfc2hhcmVkX2lycSwKLQkuc3RhcnQgPSBtaXBzeHhfcG11X3N0YXJ0LAotCS5zdG9wID0gbWlwc3h4X3BtdV9zdG9wLAotCS5hbGxvY19jb3VudGVyID0gbWlwc3h4X3BtdV9hbGxvY19jb3VudGVyLAotCS5yZWFkX2NvdW50ZXIgPSBtaXBzeHhfcG11X3JlYWRfY291bnRlciwKLQkud3JpdGVfY291bnRlciA9IG1pcHN4eF9wbXVfd3JpdGVfY291bnRlciwKLQkuZW5hYmxlX2V2ZW50ID0gbWlwc3h4X3BtdV9lbmFibGVfZXZlbnQsCi0JLmRpc2FibGVfZXZlbnQgPSBtaXBzeHhfcG11X2Rpc2FibGVfZXZlbnQsCi0JLm1hcF9yYXdfZXZlbnQgPSBtaXBzeHhfcG11X21hcF9yYXdfZXZlbnQsCi0JLmdlbmVyYWxfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfZXZlbnRfbWFwLAotCS5jYWNoZV9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9jYWNoZV9tYXAsCi19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKm9jdGVvbl9wbXVfbWFwX3Jhd19ldmVudCh1NjQgY29uZmlnKQoreworCXVuc2lnbmVkIGludCByYXdfaWQgPSBjb25maWcgJiAweGZmOworCXVuc2lnbmVkIGludCBiYXNlX2lkID0gcmF3X2lkICYgMHg3ZjsKIAotc3RhdGljIHN0cnVjdCBtaXBzX3BtdSBtaXBzeHg3NEtjb3JlX3BtdSA9IHsKLQkuaGFuZGxlX2lycSA9IG1pcHN4eF9wbXVfaGFuZGxlX2lycSwKLQkuaGFuZGxlX3NoYXJlZF9pcnEgPSBtaXBzeHhfcG11X2hhbmRsZV9zaGFyZWRfaXJxLAotCS5zdGFydCA9IG1pcHN4eF9wbXVfc3RhcnQsCi0JLnN0b3AgPSBtaXBzeHhfcG11X3N0b3AsCi0JLmFsbG9jX2NvdW50ZXIgPSBtaXBzeHhfcG11X2FsbG9jX2NvdW50ZXIsCi0JLnJlYWRfY291bnRlciA9IG1pcHN4eF9wbXVfcmVhZF9jb3VudGVyLAotCS53cml0ZV9jb3VudGVyID0gbWlwc3h4X3BtdV93cml0ZV9jb3VudGVyLAotCS5lbmFibGVfZXZlbnQgPSBtaXBzeHhfcG11X2VuYWJsZV9ldmVudCwKLQkuZGlzYWJsZV9ldmVudCA9IG1pcHN4eF9wbXVfZGlzYWJsZV9ldmVudCwKLQkubWFwX3Jhd19ldmVudCA9IG1pcHN4eF9wbXVfbWFwX3Jhd19ldmVudCwKLQkuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4NzRLY29yZV9ldmVudF9tYXAsCi0JLmNhY2hlX2V2ZW50X21hcCA9ICZtaXBzeHg3NEtjb3JlX2NhY2hlX21hcCwKLX07CisKKwlyYXdfZXZlbnQuY250cl9tYXNrID0gQ05UUl9BTEw7CisJcmF3X2V2ZW50LmV2ZW50X2lkID0gYmFzZV9pZDsKKworCWlmIChjdXJyZW50X2NwdV90eXBlKCkgPT0gQ1BVX0NBVklVTV9PQ1RFT04yKSB7CisJCWlmIChiYXNlX2lkID4gMHg0MikKKwkJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKKwl9IGVsc2UgeworCQlpZiAoYmFzZV9pZCA+IDB4M2EpCisJCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisJfQorCisJc3dpdGNoIChiYXNlX2lkKSB7CisJY2FzZSAweDAwOgorCWNhc2UgMHgwZjoKKwljYXNlIDB4MWU6CisJY2FzZSAweDFmOgorCWNhc2UgMHgyZjoKKwljYXNlIDB4MzQ6CisJY2FzZSAweDNiIC4uLiAweDNmOgorCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuICZyYXdfZXZlbnQ7Cit9CiAKIHN0YXRpYyBpbnQgX19pbml0CiBpbml0X2h3X3BlcmZfZXZlbnRzKHZvaWQpCiB7CiAJaW50IGNvdW50ZXJzLCBpcnE7CisJaW50IGNvdW50ZXJfYml0czsKIAogCXByX2luZm8oIlBlcmZvcm1hbmNlIGNvdW50ZXJzOiAiKTsKIApAQCAtMTAzNSwzMiArMTU4NiwzNiBAQAogCX0KICNlbmRpZgogCi0Jb25fZWFjaF9jcHUocmVzZXRfY291bnRlcnMsICh2b2lkICopKGxvbmcpY291bnRlcnMsIDEpOworCW1pcHNwbXUubWFwX3Jhd19ldmVudCA9IG1pcHN4eF9wbXVfbWFwX3Jhd19ldmVudDsKIAogCXN3aXRjaCAoY3VycmVudF9jcHVfdHlwZSgpKSB7CiAJY2FzZSBDUFVfMjRLOgotCQltaXBzeHhjb3JlX3BtdS5uYW1lID0gIm1pcHMvMjRLIjsKLQkJbWlwc3h4Y29yZV9wbXUubnVtX2NvdW50ZXJzID0gY291bnRlcnM7Ci0JCW1pcHN4eGNvcmVfcG11LmlycSA9IGlycTsKLQkJbWlwc3BtdSA9ICZtaXBzeHhjb3JlX3BtdTsKKwkJbWlwc3BtdS5uYW1lID0gIm1pcHMvMjRLIjsKKwkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2V2ZW50X21hcDsKKwkJbWlwc3BtdS5jYWNoZV9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9jYWNoZV9tYXA7CiAJCWJyZWFrOwogCWNhc2UgQ1BVXzM0SzoKLQkJbWlwc3h4Y29yZV9wbXUubmFtZSA9ICJtaXBzLzM0SyI7Ci0JCW1pcHN4eGNvcmVfcG11Lm51bV9jb3VudGVycyA9IGNvdW50ZXJzOwotCQltaXBzeHhjb3JlX3BtdS5pcnEgPSBpcnE7Ci0JCW1pcHNwbXUgPSAmbWlwc3h4Y29yZV9wbXU7CisJCW1pcHNwbXUubmFtZSA9ICJtaXBzLzM0SyI7CisJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9ldmVudF9tYXA7CisJCW1pcHNwbXUuY2FjaGVfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfY2FjaGVfbWFwOwogCQlicmVhazsKIAljYXNlIENQVV83NEs6Ci0JCW1pcHN4eDc0S2NvcmVfcG11Lm5hbWUgPSAibWlwcy83NEsiOwotCQltaXBzeHg3NEtjb3JlX3BtdS5udW1fY291bnRlcnMgPSBjb3VudGVyczsKLQkJbWlwc3h4NzRLY29yZV9wbXUuaXJxID0gaXJxOwotCQltaXBzcG11ID0gJm1pcHN4eDc0S2NvcmVfcG11OworCQltaXBzcG11Lm5hbWUgPSAibWlwcy83NEsiOworCQltaXBzcG11LmdlbmVyYWxfZXZlbnRfbWFwID0gJm1pcHN4eDc0S2NvcmVfZXZlbnRfbWFwOworCQltaXBzcG11LmNhY2hlX2V2ZW50X21hcCA9ICZtaXBzeHg3NEtjb3JlX2NhY2hlX21hcDsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfMTAwNEs6Ci0JCW1pcHN4eGNvcmVfcG11Lm5hbWUgPSAibWlwcy8xMDA0SyI7Ci0JCW1pcHN4eGNvcmVfcG11Lm51bV9jb3VudGVycyA9IGNvdW50ZXJzOwotCQltaXBzeHhjb3JlX3BtdS5pcnEgPSBpcnE7Ci0JCW1pcHNwbXUgPSAmbWlwc3h4Y29yZV9wbXU7CisJCW1pcHNwbXUubmFtZSA9ICJtaXBzLzEwMDRLIjsKKwkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2V2ZW50X21hcDsKKwkJbWlwc3BtdS5jYWNoZV9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9jYWNoZV9tYXA7CisJCWJyZWFrOworCWNhc2UgQ1BVX0NBVklVTV9PQ1RFT046CisJY2FzZSBDUFVfQ0FWSVVNX09DVEVPTl9QTFVTOgorCWNhc2UgQ1BVX0NBVklVTV9PQ1RFT04yOgorCQltaXBzcG11Lm5hbWUgPSAib2N0ZW9uIjsKKwkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZvY3Rlb25fZXZlbnRfbWFwOworCQltaXBzcG11LmNhY2hlX2V2ZW50X21hcCA9ICZvY3Rlb25fY2FjaGVfbWFwOworCQltaXBzcG11Lm1hcF9yYXdfZXZlbnQgPSBvY3Rlb25fcG11X21hcF9yYXdfZXZlbnQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2NvbnQoIkVpdGhlciBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IHBlcmZvcm1hbmNlICIKQEAgLTEwNjgsMTUgKzE2MjMsMzMgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKG1pcHNwbXUpCi0JCXByX2NvbnQoIiVzIFBNVSBlbmFibGVkLCAlZCBjb3VudGVycyBhdmFpbGFibGUgdG8gZWFjaCAiCi0JCQkiQ1BVLCBpcnEgJWQlc1xuIiwgbWlwc3BtdS0+bmFtZSwgY291bnRlcnMsIGlycSwKLQkJCWlycSA8IDAgPyAiIChzaGFyZSB3aXRoIHRpbWVyIGludGVycnVwdCkiIDogIiIpOworCW1pcHNwbXUubnVtX2NvdW50ZXJzID0gY291bnRlcnM7CisJbWlwc3BtdS5pcnEgPSBpcnE7CisKKwlpZiAocmVhZF9jMF9wZXJmY3RybDAoKSAmIE1fUEVSRkNUTF9XSURFKSB7CisJCW1pcHNwbXUubWF4X3BlcmlvZCA9ICgxVUxMIDw8IDYzKSAtIDE7CisJCW1pcHNwbXUudmFsaWRfY291bnQgPSAoMVVMTCA8PCA2MykgLSAxOworCQltaXBzcG11Lm92ZXJmbG93ID0gMVVMTCA8PCA2MzsKKwkJbWlwc3BtdS5yZWFkX2NvdW50ZXIgPSBtaXBzeHhfcG11X3JlYWRfY291bnRlcl82NDsKKwkJbWlwc3BtdS53cml0ZV9jb3VudGVyID0gbWlwc3h4X3BtdV93cml0ZV9jb3VudGVyXzY0OworCQljb3VudGVyX2JpdHMgPSA2NDsKKwl9IGVsc2UgeworCQltaXBzcG11Lm1heF9wZXJpb2QgPSAoMVVMTCA8PCAzMSkgLSAxOworCQltaXBzcG11LnZhbGlkX2NvdW50ID0gKDFVTEwgPDwgMzEpIC0gMTsKKwkJbWlwc3BtdS5vdmVyZmxvdyA9IDFVTEwgPDwgMzE7CisJCW1pcHNwbXUucmVhZF9jb3VudGVyID0gbWlwc3h4X3BtdV9yZWFkX2NvdW50ZXI7CisJCW1pcHNwbXUud3JpdGVfY291bnRlciA9IG1pcHN4eF9wbXVfd3JpdGVfY291bnRlcjsKKwkJY291bnRlcl9iaXRzID0gMzI7CisJfQorCisJb25fZWFjaF9jcHUocmVzZXRfY291bnRlcnMsICh2b2lkICopKGxvbmcpY291bnRlcnMsIDEpOworCisJcHJfY29udCgiJXMgUE1VIGVuYWJsZWQsICVkICVkLWJpdCBjb3VudGVycyBhdmFpbGFibGUgdG8gZWFjaCAiCisJCSJDUFUsIGlycSAlZCVzXG4iLCBtaXBzcG11Lm5hbWUsIGNvdW50ZXJzLCBjb3VudGVyX2JpdHMsIGlycSwKKwkJaXJxIDwgMCA/ICIgKHNoYXJlIHdpdGggdGltZXIgaW50ZXJydXB0KSIgOiAiIik7CiAKIAlwZXJmX3BtdV9yZWdpc3RlcigmcG11LCAiY3B1IiwgUEVSRl9UWVBFX1JBVyk7CiAKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X2luaXRjYWxsKGluaXRfaHdfcGVyZl9ldmVudHMpOwotCi0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMikuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYjMwY2IyNS4uYzQ3Zjk2ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTksMTMgKzksMTMgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNCBUaGllbW8gU2V1ZmVyCiAgKi8KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Byb20uYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvbS5jCmluZGV4IDViN2VhZGU0Li42YjhiNDIwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Byb20uYworKysgYi9hcmNoL21pcHMva2VybmVsL3Byb20uYwpAQCAtOSw3ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Jlc2V0LmMgYi9hcmNoL21pcHMva2VybmVsL3Jlc2V0LmMKaW5kZXggMDYwNTYzYS4uMDdmYzUyNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yZXNldC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcmVzZXQuYwpAQCAtNyw3ICs3LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMSBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMgYi9hcmNoL21pcHMva2VybmVsL3J0bHguYwppbmRleCA3YTgwYjdjZC4uOTMzMTY2ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKQEAgLTE5LDcgKzE5LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKaW5kZXggODY1YmM3YS4uNDc5MjA2NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwpAQCAtNDk2LDcgKzQ5Niw3IEBACiAJc3lzCXN5c19sb29rdXBfZGNvb2tpZQk0CiAJc3lzCXN5c19lcG9sbF9jcmVhdGUJMQogCXN5cwlzeXNfZXBvbGxfY3RsCQk0Ci0Jc3lzCXN5c19lcG9sbF93YWl0CQkzCS8qIDQyNTAgKi8KKwlzeXMJc3lzX2Vwb2xsX3dhaXQJCTQJLyogNDI1MCAqLwogCXN5cwlzeXNfcmVtYXBfZmlsZV9wYWdlcwk1CiAJc3lzCXN5c19zZXRfdGlkX2FkZHJlc3MJMQogCXN5cwlzeXNfcmVzdGFydF9zeXNjYWxsCTAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYwppbmRleCA4YWQxZDU2Li44NGFmMjZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCkBAIC0xMiw3ICsxMiw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NwaW5sb2NrX3Rlc3QuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3BpbmxvY2tfdGVzdC5jCmluZGV4IGRhNjExMzQuLjM5ZjdhYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc3BpbmxvY2tfdGVzdC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3BpbmxvY2tfdGVzdC5jCkBAIC0zLDcgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggZDUyZmY3Ny4uMWJhNzc1ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTUsNyArNSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMgYi9hcmNoL21pcHMva2VybmVsL3RpbWUuYwppbmRleCAxMDgzYWQ0Li45OWQ3M2I3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RpbWUuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHUtZmVhdHVyZXMuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCBjYmVhNjE4Li4yNjFjY2JjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC91bmFsaWduZWQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdW5hbGlnbmVkLmMKaW5kZXggZWIzMTliNS4uYWVkYjg5NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC91bmFsaWduZWQuYworKysgYi9hcmNoL21pcHMva2VybmVsL3VuYWxpZ25lZC5jCkBAIC03Myw3ICs3Myw2IEBACiAgKiAgICAgICBVbmRvIHRoZSBwYXJ0aWFsIHN0b3JlIGluIHRoaXMgY2FzZS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMgYi9hcmNoL21pcHMva2VybmVsL3ZwZS5jCmluZGV4IDNlZmNiMDYuLmJmYTEyYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC92cGUuYwpAQCAtMjksNyArMjksNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vcGxhdGZvcm0uYwppbmRleCBlZDAwN2EyLi41MDJiMDU5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3BsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9wbGF0Zm9ybS5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbG9vbmdzb24yX2NwdWZyZXFfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMgYi9hcmNoL21pcHMvbW0vYy1vY3Rlb24uYwppbmRleCAxNmM0ZDI1Li5kYWE4MWY3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1vY3Rlb24uYworKysgYi9hcmNoL21pcHMvbW0vYy1vY3Rlb24uYwpAQCAtMTY5LDYgKzE2OSwxMCBAQAogCQlvY3Rlb25fZmx1c2hfaWNhY2hlX2FsbF9jb3Jlcyh2bWEpOwogfQogCitzdGF0aWMgdm9pZCBvY3Rlb25fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UodW5zaWduZWQgbG9uZyB2YWRkciwgaW50IHNpemUpCit7CisJQlVHKCk7Cit9CiAKIC8qKgogICogUHJvYmUgT2N0ZW9uJ3MgY2FjaGVzCkBAIC0yNzMsNiArMjc3LDggQEAKIAlmbHVzaF9pY2FjaGVfcmFuZ2UJCT0gb2N0ZW9uX2ZsdXNoX2ljYWNoZV9yYW5nZTsKIAlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UJPSBsb2NhbF9vY3Rlb25fZmx1c2hfaWNhY2hlX3JhbmdlOwogCisJX19mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZQk9IG9jdGVvbl9mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZTsKKwogCWJ1aWxkX2NsZWFyX3BhZ2UoKTsKIAlidWlsZF9jb3B5X3BhZ2UoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLXIzay5jIGIvYXJjaC9taXBzL21tL2MtcjNrLmMKaW5kZXggZTZiMGVmZC4uMDc2NTU4MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2MtcjNrLmMKKysrIGIvYXJjaC9taXBzL21tL2MtcjNrLmMKQEAgLTI5OSw2ICsyOTksMTEgQEAKIAl3cml0ZV9jMF9zdGF0dXMoZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCByM2tfZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UodW5zaWduZWQgbG9uZyB2YWRkciwgaW50IHNpemUpCit7CisJQlVHKCk7Cit9CisKIHN0YXRpYyB2b2lkIHIza19kbWFfY2FjaGVfd2JhY2tfaW52KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAkvKiBDYXRjaCBiYWQgZHJpdmVyIGNvZGUgKi8KQEAgLTMyMyw2ICszMjgsOCBAQAogCWZsdXNoX2ljYWNoZV9yYW5nZSA9IHIza19mbHVzaF9pY2FjaGVfcmFuZ2U7CiAJbG9jYWxfZmx1c2hfaWNhY2hlX3JhbmdlID0gcjNrX2ZsdXNoX2ljYWNoZV9yYW5nZTsKIAorCV9fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UgPSByM2tfZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2U7CisKIAlmbHVzaF9jYWNoZV9zaWd0cmFtcCA9IHIza19mbHVzaF9jYWNoZV9zaWd0cmFtcDsKIAlsb2NhbF9mbHVzaF9kYXRhX2NhY2hlX3BhZ2UgPSBsb2NhbF9yM2tfZmx1c2hfZGF0YV9jYWNoZV9wYWdlOwogCWZsdXNoX2RhdGFfY2FjaGVfcGFnZSA9IHIza19mbHVzaF9kYXRhX2NhY2hlX3BhZ2U7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1yNGsuYyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCmluZGV4IGI5YWFiYjkuLmE3OWZlOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXI0ay5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCkBAIC03MjIsNiArNzIyLDM5IEBACiAJCXI0a19ibGFzdF9pY2FjaGUoKTsKIH0KIAorc3RydWN0IGZsdXNoX2tlcm5lbF92bWFwX3JhbmdlX2FyZ3MgeworCXVuc2lnbmVkIGxvbmcJdmFkZHI7CisJaW50CQlzaXplOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX3I0a19mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZSh2b2lkICphcmdzKQoreworCXN0cnVjdCBmbHVzaF9rZXJuZWxfdm1hcF9yYW5nZV9hcmdzICp2bXJhID0gYXJnczsKKwl1bnNpZ25lZCBsb25nIHZhZGRyID0gdm1yYS0+dmFkZHI7CisJaW50IHNpemUgPSB2bXJhLT5zaXplOworCisJLyoKKwkgKiBBbGlhc2VzIG9ubHkgYWZmZWN0IHRoZSBwcmltYXJ5IGNhY2hlcyBzbyBkb24ndCBib3RoZXIgd2l0aAorCSAqIFMtY2FjaGVzIG9yIFQtY2FjaGVzLgorCSAqLworCWlmIChjcHVfaGFzX3NhZmVfaW5kZXhfY2FjaGVvcHMgJiYgc2l6ZSA+PSBkY2FjaGVfc2l6ZSkKKwkJcjRrX2JsYXN0X2RjYWNoZSgpOworCWVsc2UgeworCQlSNDYwMF9ISVRfQ0FDSEVPUF9XQVJfSU1QTDsKKwkJYmxhc3RfZGNhY2hlX3JhbmdlKHZhZGRyLCB2YWRkciArIHNpemUpOworCX0KK30KKworc3RhdGljIHZvaWQgcjRrX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBzaXplKQoreworCXN0cnVjdCBmbHVzaF9rZXJuZWxfdm1hcF9yYW5nZV9hcmdzIGFyZ3M7CisKKwlhcmdzLnZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHZhZGRyOworCWFyZ3Muc2l6ZSA9IHNpemU7CisKKwlyNGtfb25fZWFjaF9jcHUobG9jYWxfcjRrX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlLCAmYXJncyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBybTdrX2VycmF0dW0zMSh2b2lkKQogewogCWNvbnN0IHVuc2lnbmVkIGxvbmcgaWNfbHNpemUgPSAzMjsKQEAgLTE0MDMsNiArMTQzNiw4IEBACiAJZmx1c2hfY2FjaGVfcGFnZQk9IHI0a19mbHVzaF9jYWNoZV9wYWdlOwogCWZsdXNoX2NhY2hlX3JhbmdlCT0gcjRrX2ZsdXNoX2NhY2hlX3JhbmdlOwogCisJX19mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZSA9IHI0a19mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZTsKKwogCWZsdXNoX2NhY2hlX3NpZ3RyYW1wCT0gcjRrX2ZsdXNoX2NhY2hlX3NpZ3RyYW1wOwogCWZsdXNoX2ljYWNoZV9hbGwJPSByNGtfZmx1c2hfaWNhY2hlX2FsbDsKIAlsb2NhbF9mbHVzaF9kYXRhX2NhY2hlX3BhZ2UJPSBsb2NhbF9yNGtfZmx1c2hfZGF0YV9jYWNoZV9wYWdlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2MtdHgzOS5jIGIvYXJjaC9taXBzL21tL2MtdHgzOS5jCmluZGV4IGQzNTJmYWQuLmE0M2MxOTdjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy10eDM5LmMKKysrIGIvYXJjaC9taXBzL21tL2MtdHgzOS5jCkBAIC0yNTMsNiArMjUzLDExIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCB0eDM5X2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBzaXplKQoreworCUJVRygpOworfQorCiBzdGF0aWMgdm9pZCB0eDM5X2RtYV9jYWNoZV93YmFja19pbnYodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBlbmQ7CkBAIC0zOTQsNiArMzk5LDggQEAKIAkJZmx1c2hfaWNhY2hlX3JhbmdlID0gdHgzOV9mbHVzaF9pY2FjaGVfcmFuZ2U7CiAJCWxvY2FsX2ZsdXNoX2ljYWNoZV9yYW5nZSA9IHR4MzlfZmx1c2hfaWNhY2hlX3JhbmdlOwogCisJCV9fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UgPSB0eDM5X2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlOworCiAJCWZsdXNoX2NhY2hlX3NpZ3RyYW1wID0gdHgzOV9mbHVzaF9jYWNoZV9zaWd0cmFtcDsKIAkJbG9jYWxfZmx1c2hfZGF0YV9jYWNoZV9wYWdlID0gbG9jYWxfdHgzOV9mbHVzaF9kYXRhX2NhY2hlX3BhZ2U7CiAJCWZsdXNoX2RhdGFfY2FjaGVfcGFnZSA9IHR4MzlfZmx1c2hfZGF0YV9jYWNoZV9wYWdlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2NhY2hlLmMgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwppbmRleCAxMmFmNzM5Li44MjkzMjBjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vY2FjaGUuYworKysgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwpAQCAtMzUsNiArMzUsMTEgQEAKIHZvaWQgKCpfX2ZsdXNoX2NhY2hlX3ZtYXApKHZvaWQpOwogdm9pZCAoKl9fZmx1c2hfY2FjaGVfdnVubWFwKSh2b2lkKTsKIAordm9pZCAoKl9fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UpKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBzaXplKTsKK3ZvaWQgKCpfX2ludmFsaWRhdGVfa2VybmVsX3ZtYXBfcmFuZ2UpKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBzaXplKTsKKworRVhQT1JUX1NZTUJPTF9HUEwoX19mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZSk7CisKIC8qIE1JUFMgc3BlY2lmaWMgY2FjaGUgb3BlcmF0aW9ucyAqLwogdm9pZCAoKmZsdXNoX2NhY2hlX3NpZ3RyYW1wKSh1bnNpZ25lZCBsb25nIGFkZHIpOwogdm9pZCAoKmxvY2FsX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZSkodm9pZCAqIGFkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3RsYi1yM2suYyBiL2FyY2gvbWlwcy9tbS90bGItcjNrLmMKaW5kZXggNDA0MjRhZi4uODdiYjg1ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3RsYi1yM2suYworKysgYi9hcmNoL21pcHMvbW0vdGxiLXIzay5jCkBAIC0yMjMsOCArMjIzLDggQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXZvaWQgX19pbml0IGFkZF93aXJlZF9lbnRyeSh1bnNpZ25lZCBsb25nIGVudHJ5bG8wLCB1bnNpZ25lZCBsb25nIGVudHJ5bG8xLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgZW50cnloaSwgdW5zaWduZWQgbG9uZyBwYWdlbWFzaykKK3ZvaWQgYWRkX3dpcmVkX2VudHJ5KHVuc2lnbmVkIGxvbmcgZW50cnlsbzAsIHVuc2lnbmVkIGxvbmcgZW50cnlsbzEsCisJCSAgICAgdW5zaWduZWQgbG9uZyBlbnRyeWhpLCB1bnNpZ25lZCBsb25nIHBhZ2VtYXNrKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBvbGRfY3R4OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3RsYi1yNGsuYyBiL2FyY2gvbWlwcy9tbS90bGItcjRrLmMKaW5kZXggYmE0MDMyNS4uMGQzOTRlMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3RsYi1yNGsuYworKysgYi9hcmNoL21pcHMvbW0vdGxiLXI0ay5jCkBAIC0zMzcsOCArMzM3LDggQEAKIAlFWElUX0NSSVRJQ0FMKGZsYWdzKTsKIH0KIAotdm9pZCBfX2luaXQgYWRkX3dpcmVkX2VudHJ5KHVuc2lnbmVkIGxvbmcgZW50cnlsbzAsIHVuc2lnbmVkIGxvbmcgZW50cnlsbzEsCi0JdW5zaWduZWQgbG9uZyBlbnRyeWhpLCB1bnNpZ25lZCBsb25nIHBhZ2VtYXNrKQordm9pZCBhZGRfd2lyZWRfZW50cnkodW5zaWduZWQgbG9uZyBlbnRyeWxvMCwgdW5zaWduZWQgbG9uZyBlbnRyeWxvMSwKKwkJICAgICB1bnNpZ25lZCBsb25nIGVudHJ5aGksIHVuc2lnbmVkIGxvbmcgcGFnZW1hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIHdpcmVkOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL1BsYXRmb3JtIGIvYXJjaC9taXBzL25ldGxvZ2ljL1BsYXRmb3JtCmluZGV4IGY4N2MxNjQuLmI2NDhiNDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9uZXRsb2dpYy9QbGF0Zm9ybQorKysgYi9hcmNoL21pcHMvbmV0bG9naWMvUGxhdGZvcm0KQEAgLTUsNiArNSwxMSBAQAogY2ZsYWdzLSQoQ09ORklHX05MTV9DT01NT04pICArPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL25ldGxvZ2ljCiAKICMKKyMgdXNlIG1pcHM2NCBpZiB4bHIgaXMgbm90IGF2YWlsYWJsZQorIworY2ZsYWdzLSQoQ09ORklHX05MTV9YTFIpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXhsciwtbWFyY2g9bWlwczY0KQorCisjCiAjIE5FVExPR0lDIFhMUi9YTFMgU29DLCBTaW11bGF0b3IgYW5kIGJvYXJkcwogIwogY29yZS0kKENPTkZJR19OTE1fWExSKQkgICAgICArPSBhcmNoL21pcHMvbmV0bG9naWMveGxyLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zZXR1cC5jIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zZXR1cC5jCmluZGV4IDQ4MjgwMjUuLmNlZTI1ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc2V0dXAuYworKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NldHVwLmMKQEAgLTUzLDcgKzUzLDcgQEAKIHVuc2lnbmVkIGxvbmcgbmxtX2NvbW1vbl9lYmFzZSA9IDB4MDsKIHN0cnVjdCBwc2JfaW5mbyBubG1fcHJvbV9pbmZvOwogCi1zdGF0aWMgdm9pZCBubG1fZWFybHlfc2VyaWFsX3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgbmxtX2Vhcmx5X3NlcmlhbF9zZXR1cCh2b2lkKQogewogCXN0cnVjdCB1YXJ0X3BvcnQgczsKIAlubG1fcmVnX3QgKnVhcnRfYmFzZTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogCS8qIE5vdGhpbmcgeWV0ICovCiB9CiAKLXN0YXRpYyB2b2lkIGJ1aWxkX2FyY3NfY21kbGluZShpbnQgKmFyZ3YpCitzdGF0aWMgdm9pZCBfX2luaXQgYnVpbGRfYXJjc19jbWRsaW5lKGludCAqYXJndikKIHsKIAlpbnQgaSwgcmVtYWluLCBsZW47CiAJY2hhciAqYXJnOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zbXAuYyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc21wLmMKaW5kZXggZDg0MmJjZS4uMDgwMjg0ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zbXAuYworKysgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NtcC5jCkBAIC0xNTgsNiArMTU4LDEwIEBACiAKIAludW1fY3B1cyA9IDE7CiAJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQkvKgorCQkgKiBCU1AgaXMgbm90IHNldCBpbiBubG1fY3B1X3JlYWR5IGFycmF5LCBpdCBpcyBvbmx5IGZvcgorCQkgKiBBU1BzIChnb3RvIHNlZSBzbXBib290LlMpCisJCSAqLwogCQlpZiAobmxtX2NwdV9yZWFkeVtpXSkgewogCQkJY3B1X3NldChpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CiAJCQlfX2NwdV9udW1iZXJfbWFwW2ldID0gbnVtX2NwdXM7CkBAIC0xOTEsNyArMTk1LDcgQEAKIAogdW5zaWduZWQgbG9uZyBzZWNvbmRhcnlfZW50cnlfcG9pbnQ7CiAKLWludCBubG1fd2FrZXVwX3NlY29uZGFyeV9jcHVzKHUzMiB3YWtldXBfbWFzaykKK2ludCBfX2NwdWluaXQgbmxtX3dha2V1cF9zZWNvbmRhcnlfY3B1cyh1MzIgd2FrZXVwX21hc2spCiB7CiAJdW5zaWduZWQgaW50IHRpZCwgcGlkLCBpcGksIGksIGJvb3RfY3B1OwogCXZvaWQgKnJlc2V0X3ZlYzsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc21wYm9vdC5TIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zbXBib290LlMKaW5kZXggYjhlMDc0NC4uOGNiNzg4OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zbXBib290LlMKKysrIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zbXBib290LlMKQEAgLTMyLDE3ICszMiwxOSBAQAogICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKwogI2luY2x1ZGUgPGFzbS9hc20uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CiAKLQotLyogRG9uJ3QganVtcCB0byBsaW51eCBmdW5jdGlvbiBmcm9tIEJvb3Rsb2FkZXIgc3RhY2suIENoYW5nZSBpdAotICogaGVyZS4gS2VybmVsIG1pZ2h0IGFsbG9jYXRlIGJvb3Rsb2FkZXIgbWVtb3J5IGJlZm9yZSBhbGwgdGhlIENQVXMgYXJlCi0gKiBicm91Z2h0IHVwIChlZzogSW5vZGUgY2FjaGUgcmVnaW9uKSBhbmQgd2UgYmV0dGVyIGRvbid0IG92ZXJ3cml0ZSB0aGlzCi0gKiBtZW1vcnkKKy8qCisgKiBFYXJseSBjb2RlIGZvciBzZWNvbmRhcnkgQ1BVcy4gVGhpcyB3aWxsIGdldCB0aGVtIG91dCBvZiB0aGUgYm9vdGxvYWRlcgorICogY29kZSBhbmQgaW50byBsaW51eC4gTmVlZGVkIGJlY2F1c2UgdGhlIGJvb3Rsb2FkZXIgYXJlYSB3aWxsIGJlIHRha2VuCisgKiBhbmQgaW5pdGlhbGl6ZWQgYnkgbGludXguCiAgKi8KKwlfX0NQVUlOSVQKIE5FU1RFRChwcm9tX3ByZV9ib290X3NlY29uZGFyeV9jcHVzLCAxNiwgc3ApCiAJLnNldAltaXBzNjQKIAltZmMwCXQwLCAkMTUsIDEJIyByZWFkIGViYXNlCkBAIC03Myw3ICs3NSwxMSBAQAogCWpyCXQwCiAJbm9wCiBFTkQocHJvbV9wcmVfYm9vdF9zZWNvbmRhcnlfY3B1cykKKwlfX0ZJTklUCiAKKy8qCisgKiBOTUkgY29kZSwgdXNlZCBmb3IgQ1BVIHdha2V1cCwgY29waWVkIHRvIHJlc2V0IGVudHJ5CisgKi8KIE5FU1RFRChubG1fYm9vdF9zbXBfbm1pLCAwLCBzcCkKIAkuc2V0IHB1c2gKIAkuc2V0IG5vYXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCmluZGV4IDRkZjg3OTkuLmJiODJjYmRiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKQEAgLTE4LDE0ICsxOCwxMyBAQAogb2JqLSQoQ09ORklHX0JDTTQ3WFgpCQkrPSBwY2ktYmNtNDd4eC5vCiBvYmotJChDT05GSUdfQkNNNjNYWCkJCSs9IHBjaS1iY202M3h4Lm8gZml4dXAtYmNtNjN4eC5vIFwKIAkJCQkJb3BzLWJjbTYzeHgubworb2JqLSQoQ09ORklHX01JUFNfQUxDSEVNWSkJKz0gcGNpLWFsY2hlbXkubwogCiAjCiAjIFRoZXNlIGFyZSBzdGlsbCBwcmV0dHkgbXVjaCBpbiB0aGUgb2xkIHN0YXRlLCB3YXRjaCwgZ28gYmxpbmQuCiAjCiBvYmotJChDT05GSUdfTEFTQVQpCQkrPSBwY2ktbGFzYXQubwogb2JqLSQoQ09ORklHX01JUFNfQ09CQUxUKQkrPSBmaXh1cC1jb2JhbHQubwotb2JqLSQoQ09ORklHX1NPQ19BVTE1MDApCSs9IGZpeHVwLWF1MTAwMC5vIG9wcy1hdTEwMDAubwotb2JqLSQoQ09ORklHX1NPQ19BVTE1NTApCSs9IGZpeHVwLWF1MTAwMC5vIG9wcy1hdTEwMDAubwogb2JqLSQoQ09ORklHX1NPQ19QTlg4NTUwKQkrPSBmaXh1cC1wbng4NTUwLm8gb3BzLXBueDg1NTAubwogb2JqLSQoQ09ORklHX0xFTU9URV9GVUxPT05HMkUpCSs9IGZpeHVwLWZ1bG9vbmcyZS5vIG9wcy1sb29uZ3NvbjIubwogb2JqLSQoQ09ORklHX0xFTU9URV9NQUNIMkYpCSs9IGZpeHVwLWxlbW90ZTJmLm8gb3BzLWxvb25nc29uMi5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWF1MTAwMC5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1hdTEwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkZGZjNC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWF1MTAwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgotICoJQm9hcmQgc3BlY2lmaWMgUENJIGZpeHVwcy4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotZXh0ZXJuIGNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV07Ci0KLWludCBfX2luaXQgcGNpYmlvc19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlyZXR1cm4gaXJxX3RhYl9hbGNoZW15W3Nsb3RdW3Bpbl07Ci19Ci0KLS8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KLWludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLWF1MTAwMC5jIGIvYXJjaC9taXBzL3BjaS9vcHMtYXUxMDAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNTdjNWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3BjaS9vcHMtYXUxMDAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgotICoJQWxjaGVteS9BTUQgQXUxeHgwIFBDSSBzdXBwb3J0LgotICoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDMsIDIwMDctMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogIFN1cHBvcnQgZm9yIGFsbCBkZXZpY2VzIChncmVhdGVyIHRoYW4gMTYpIGFkZGVkIGJ5IERhdmlkIEdhdGhyaWdodC4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KLQotI3VuZGVmCURFQlVHCi0jaWZkZWYJREVCVUcKLSNkZWZpbmUgREJHKHguLi4pIHByaW50ayhLRVJOX0RFQlVHIHgpCi0jZWxzZQotI2RlZmluZSBEQkcoeC4uLikKLSNlbmRpZgotCi0jZGVmaW5lIFBDSV9BQ0NFU1NfUkVBRCAgMAotI2RlZmluZSBQQ0lfQUNDRVNTX1dSSVRFIDEKLQotaW50ICgqYm9hcmRfcGNpX2lkc2VsKSh1bnNpZ25lZCBpbnQgZGV2c2VsLCBpbnQgYXNzZXJ0KTsKLQotdm9pZCBtb2Rfd2lyZWRfZW50cnkoaW50IGVudHJ5LCB1bnNpZ25lZCBsb25nIGVudHJ5bG8wLAotCQl1bnNpZ25lZCBsb25nIGVudHJ5bG8xLCB1bnNpZ25lZCBsb25nIGVudHJ5aGksCi0JCXVuc2lnbmVkIGxvbmcgcGFnZW1hc2spCi17Ci0JdW5zaWduZWQgbG9uZyBvbGRfcGFnZW1hc2s7Ci0JdW5zaWduZWQgbG9uZyBvbGRfY3R4OwotCi0JLyogU2F2ZSBvbGQgY29udGV4dCBhbmQgY3JlYXRlIGltcG9zc2libGUgVlBOMiB2YWx1ZSAqLwotCW9sZF9jdHggPSByZWFkX2MwX2VudHJ5aGkoKSAmIDB4ZmY7Ci0Jb2xkX3BhZ2VtYXNrID0gcmVhZF9jMF9wYWdlbWFzaygpOwotCXdyaXRlX2MwX2luZGV4KGVudHJ5KTsKLQl3cml0ZV9jMF9wYWdlbWFzayhwYWdlbWFzayk7Ci0Jd3JpdGVfYzBfZW50cnloaShlbnRyeWhpKTsKLQl3cml0ZV9jMF9lbnRyeWxvMChlbnRyeWxvMCk7Ci0Jd3JpdGVfYzBfZW50cnlsbzEoZW50cnlsbzEpOwotCXRsYl93cml0ZV9pbmRleGVkKCk7Ci0Jd3JpdGVfYzBfZW50cnloaShvbGRfY3R4KTsKLQl3cml0ZV9jMF9wYWdlbWFzayhvbGRfcGFnZW1hc2spOwotfQotCi1zdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqcGNpX2NmZ192bTsKLXN0YXRpYyBpbnQgcGNpX2NmZ193aXJlZF9lbnRyeTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfZW50cnlMbzAsIGxhc3RfZW50cnlMbzE7Ci0KLS8qCi0gKiBXZSBjYW4ndCBpb3JlbWFwIHRoZSBlbnRpcmUgcGNpIGNvbmZpZyBzcGFjZSBiZWNhdXNlIGl0J3MgdG9vIGxhcmdlLgotICogTm9yIGNhbiB3ZSBjYWxsIGlvcmVtYXAgZHluYW1pY2FsbHkgYmVjYXVzZSBzb21lIGRldmljZSBkcml2ZXJzIHVzZQotICogdGhlIFBDSSBjb25maWcgcm91dGluZXMgZnJvbSB3aXRoaW4gaW50ZXJydXB0IGhhbmRsZXJzIGFuZCB0aGF0Ci0gKiBiZWNvbWVzIGEgcHJvYmxlbSBpbiBnZXRfdm1fYXJlYSgpLiAgV2UgdXNlIG9uZSB3aXJlZCBUTEIgdG8gaGFuZGxlCi0gKiBhbGwgY29uZmlnIGFjY2Vzc2VzIGZvciBhbGwgYnVzc2VzLgotICovCi12b2lkIF9faW5pdCBhdTF4X3BjaV9jZmdfaW5pdCh2b2lkKQotewotCS8qIFJlc2VydmUgYSB3aXJlZCBlbnRyeSBmb3IgUENJIGNvbmZpZyBhY2Nlc3NlcyAqLwotCXBjaV9jZmdfdm0gPSBnZXRfdm1fYXJlYSgweDIwMDAsIFZNX0lPUkVNQVApOwotCWlmICghcGNpX2NmZ192bSkKLQkJcGFuaWMoS0VSTl9FUlIgIlBDSSB1bmFibGUgdG8gZ2V0IHZtIGFyZWFcbiIpOwotCXBjaV9jZmdfd2lyZWRfZW50cnkgPSByZWFkX2MwX3dpcmVkKCk7Ci0JYWRkX3dpcmVkX2VudHJ5KDAsIDAsICh1bnNpZ25lZCBsb25nKXBjaV9jZmdfdm0tPmFkZHIsIFBNXzRLKTsKLQlsYXN0X2VudHJ5TG8wID0gbGFzdF9lbnRyeUxvMSA9IDB4ZmZmZmZmZmY7Ci19Ci0KLXN0YXRpYyBpbnQgY29uZmlnX2FjY2Vzcyh1bnNpZ25lZCBjaGFyIGFjY2Vzc190eXBlLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAotCQkJIHVuc2lnbmVkIGludCBkZXZfZm4sIHVuc2lnbmVkIGNoYXIgd2hlcmUsIHUzMiAqZGF0YSkKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxNTAwKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfQVUxNTUwKQotCXVuc2lnbmVkIGludCBkZXZpY2UgPSBQQ0lfU0xPVChkZXZfZm4pOwotCXVuc2lnbmVkIGludCBmdW5jdGlvbiA9IFBDSV9GVU5DKGRldl9mbik7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0YXR1czsKLQl1bnNpZ25lZCBsb25nIGNmZ19iYXNlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycm9yID0gUENJQklPU19TVUNDRVNTRlVMOwotCXVuc2lnbmVkIGxvbmcgZW50cnlMbzAsIGVudHJ5TG8xOwotCi0JaWYgKGRldmljZSA+IDE5KSB7Ci0JCSpkYXRhID0gMHhmZmZmZmZmZjsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlhdV93cml0ZWwoKCgweDIwMDAgPDwgMTYpIHwgKGF1X3JlYWRsKEF1MTUwMF9QQ0lfU1RBVENNRCkgJiAweGZmZmYpKSwKLQkJCUF1MTUwMF9QQ0lfU1RBVENNRCk7Ci0JYXVfc3luY191ZGVsYXkoMSk7Ci0KLQkvKgotCSAqIEFsbG93IGJvYXJkIHZlbmRvcnMgdG8gaW1wbGVtZW50IHRoZWlyIG93biBvZmYtY2hpcCBJRFNFTC4KLQkgKiBJZiBpdCBkb2Vzbid0IHN1Y2NlZWQsIG1heSBhcyB3ZWxsIGJhaWwgb3V0IGF0IHRoaXMgcG9pbnQuCi0JICovCi0JaWYgKGJvYXJkX3BjaV9pZHNlbCAmJiBib2FyZF9wY2lfaWRzZWwoZGV2aWNlLCAxKSA9PSAwKSB7Ci0JCSpkYXRhID0gMHhmZmZmZmZmZjsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogU2V0dXAgdGhlIGNvbmZpZyB3aW5kb3cgKi8KLQlpZiAoYnVzLT5udW1iZXIgPT0gMCkKLQkJY2ZnX2Jhc2UgPSAoMSA8PCBkZXZpY2UpIDw8IDExOwotCWVsc2UKLQkJY2ZnX2Jhc2UgPSAweDgwMDAwMDAwIHwgKGJ1cy0+bnVtYmVyIDw8IDE2KSB8IChkZXZpY2UgPDwgMTEpOwotCi0JLyogU2V0dXAgdGhlIGxvd2VyIGJpdHMgb2YgdGhlIDM2LWJpdCBhZGRyZXNzICovCi0Jb2Zmc2V0ID0gKGZ1bmN0aW9uIDw8IDgpIHwgKHdoZXJlICYgfjB4Myk7Ci0JLyogUGljayB1cCBhbnkgYWRkcmVzcyB0aGF0IGZhbGxzIGJlbG93IHRoZSBwYWdlIG1hc2sgKi8KLQlvZmZzZXQgfD0gY2ZnX2Jhc2UgJiB+UEFHRV9NQVNLOwotCi0JLyogUGFnZSBib3VuZGFyeSAqLwotCWNmZ19iYXNlID0gY2ZnX2Jhc2UgJiBQQUdFX01BU0s7Ci0KLQkvKgotCSAqIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyB0aGUgc2FtZSBhcwotCSAqIHRoZSBsYXN0IGRldmljZSBhY2Nlc3NlZCwgd2UgZG9uJ3QgdG91Y2ggdGhlIFRMQi4KLQkgKi8KLQllbnRyeUxvMCA9ICg2IDw8IDI2KSB8IChjZmdfYmFzZSA+PiA2KSB8ICgyIDw8IDMpIHwgNzsKLQllbnRyeUxvMSA9ICg2IDw8IDI2KSB8IChjZmdfYmFzZSA+PiA2KSB8ICgweDEwMDAgPj4gNikgfCAoMiA8PCAzKSB8IDc7Ci0JaWYgKChlbnRyeUxvMCAhPSBsYXN0X2VudHJ5TG8wKSB8fCAoZW50cnlMbzEgIT0gbGFzdF9lbnRyeUxvMSkpIHsKLQkJbW9kX3dpcmVkX2VudHJ5KHBjaV9jZmdfd2lyZWRfZW50cnksIGVudHJ5TG8wLCBlbnRyeUxvMSwKLQkJCQkodW5zaWduZWQgbG9uZylwY2lfY2ZnX3ZtLT5hZGRyLCBQTV80Syk7Ci0JCWxhc3RfZW50cnlMbzAgPSBlbnRyeUxvMDsKLQkJbGFzdF9lbnRyeUxvMSA9IGVudHJ5TG8xOwotCX0KLQotCWlmIChhY2Nlc3NfdHlwZSA9PSBQQ0lfQUNDRVNTX1dSSVRFKQotCQlhdV93cml0ZWwoKmRhdGEsIChpbnQpKHBjaV9jZmdfdm0tPmFkZHIgKyBvZmZzZXQpKTsKLQllbHNlCi0JCSpkYXRhID0gYXVfcmVhZGwoKGludCkocGNpX2NmZ192bS0+YWRkciArIG9mZnNldCkpOwotCi0JYXVfc3luY191ZGVsYXkoMik7Ci0KLQlEQkcoImNmZ19hY2Nlc3MgJWQgYnVzLT5udW1iZXIgJXUgZGV2ICV1IGF0ICV4ICpkYXRhICV4IGNvbmYgJWx4XG4iLAotCSAgICBhY2Nlc3NfdHlwZSwgYnVzLT5udW1iZXIsIGRldmljZSwgd2hlcmUsICpkYXRhLCBvZmZzZXQpOwotCi0JLyogQ2hlY2sgbWFzdGVyIGFib3J0ICovCi0Jc3RhdHVzID0gYXVfcmVhZGwoQXUxNTAwX1BDSV9TVEFUQ01EKTsKLQotCWlmIChzdGF0dXMgJiAoMSA8PCAyOSkpIHsKLQkJKmRhdGEgPSAweGZmZmZmZmZmOwotCQllcnJvciA9IC0xOwotCQlEQkcoIkF1MXggTWFzdGVyIEFib3J0XG4iKTsKLQl9IGVsc2UgaWYgKChzdGF0dXMgPj4gMjgpICYgMHhmKSB7Ci0JCURCRygiUENJIEVSUiBkZXRlY3RlZDogZGV2aWNlICV1LCBzdGF0dXMgJWx4XG4iLAotCQkgICAgZGV2aWNlLCAoc3RhdHVzID4+IDI4KSAmIDB4Zik7Ci0KLQkJLyogQ2xlYXIgZXJyb3JzICovCi0JCWF1X3dyaXRlbChzdGF0dXMgJiAweGYwMDBmZmZmLCBBdTE1MDBfUENJX1NUQVRDTUQpOwotCi0JCSpkYXRhID0gMHhmZmZmZmZmZjsKLQkJZXJyb3IgPSAtMTsKLQl9Ci0KLQkvKiBUYWtlIGF3YXkgdGhlIElEU0VMLiAqLwotCWlmIChib2FyZF9wY2lfaWRzZWwpCi0JCSh2b2lkKWJvYXJkX3BjaV9pZHNlbChkZXZpY2UsIDApOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiBlcnJvcjsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IHJlYWRfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCQkJICAgIGludCB3aGVyZSwJdTggKnZhbCkKLXsKLQl1MzIgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSk7Ci0JaWYgKHdoZXJlICYgMSkKLQkJZGF0YSA+Pj0gODsKLQlpZiAod2hlcmUgJiAyKQotCQlkYXRhID4+PSAxNjsKLQkqdmFsID0gZGF0YSAmIDB4ZmY7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWFkX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCSAgICBpbnQgd2hlcmUsIHUxNiAqdmFsKQotewotCXUzMiBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfUkVBRCwgYnVzLCBkZXZmbiwgd2hlcmUsICZkYXRhKTsKLQlpZiAod2hlcmUgJiAyKQotCQlkYXRhID4+PSAxNjsKLQkqdmFsID0gZGF0YSAmIDB4ZmZmZjsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJlYWRfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCSAgICAgaW50IHdoZXJlLCB1MzIgKnZhbCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sIHdoZXJlLCB2YWwpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCQkJICAgICBpbnQgd2hlcmUsIHU4IHZhbCkKLXsKLQl1MzIgZGF0YSA9IDA7Ci0KLQlpZiAoY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCi0JCXJldHVybiAtMTsKLQotCWRhdGEgPSAoZGF0YSAmIH4oMHhmZiA8PCAoKHdoZXJlICYgMykgPDwgMykpKSB8Ci0JICAgICAgICh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKLQotCWlmIChjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfV1JJVEUsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCQkJICAgICBpbnQgd2hlcmUsIHUxNiB2YWwpCi17Ci0JdTMyIGRhdGEgPSAwOwotCi0JaWYgKGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpKQotCQlyZXR1cm4gLTE7Ci0KLQlkYXRhID0gKGRhdGEgJiB+KDB4ZmZmZiA8PCAoKHdoZXJlICYgMykgPDwgMykpKSB8Ci0JICAgICAgICh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKLQotCWlmIChjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfV1JJVEUsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCSAgICAgIGludCB3aGVyZSwgdTMyIHZhbCkKLXsKLQlpZiAoY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1dSSVRFLCBidXMsIGRldmZuLCB3aGVyZSwgJnZhbCkpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgY29uZmlnX3JlYWQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCQkgICAgICAgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWwpCi17Ci0Jc3dpdGNoIChzaXplKSB7Ci0JY2FzZSAxOiB7Ci0JCQl1OCBfdmFsOwotCQkJaW50IHJjID0gcmVhZF9jb25maWdfYnl0ZShidXMsIGRldmZuLCB3aGVyZSwgJl92YWwpOwotCi0JCQkqdmFsID0gX3ZhbDsKLQkJCXJldHVybiByYzsKLQkJfQotCWNhc2UgMjogewotCQkJdTE2IF92YWw7Ci0JCQlpbnQgcmMgPSByZWFkX2NvbmZpZ193b3JkKGJ1cywgZGV2Zm4sIHdoZXJlLCAmX3ZhbCk7Ci0KLQkJCSp2YWwgPSBfdmFsOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIHJlYWRfY29uZmlnX2R3b3JkKGJ1cywgZGV2Zm4sIHdoZXJlLCB2YWwpOwotCX0KLX0KLQotc3RhdGljIGludCBjb25maWdfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCQkJaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKLXsKLQlzd2l0Y2ggKHNpemUpIHsKLQljYXNlIDE6Ci0JCXJldHVybiB3cml0ZV9jb25maWdfYnl0ZShidXMsIGRldmZuLCB3aGVyZSwgKHU4KSB2YWwpOwotCWNhc2UgMjoKLQkJcmV0dXJuIHdyaXRlX2NvbmZpZ193b3JkKGJ1cywgZGV2Zm4sIHdoZXJlLCAodTE2KSB2YWwpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiB3cml0ZV9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwgd2hlcmUsIHZhbCk7Ci0JfQotfQotCi1zdHJ1Y3QgcGNpX29wcyBhdTF4X3BjaV9vcHMgPSB7Ci0JY29uZmlnX3JlYWQsCi0JY29uZmlnX3dyaXRlCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktYWxjaGVteS5jIGIvYXJjaC9taXBzL3BjaS9wY2ktYWxjaGVteS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTU3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcGNpL3BjaS1hbGNoZW15LmMKQEAgLTAsMCArMSw1MTYgQEAKKy8qCisgKiBBbGNoZW15IFBDSSBob3N0IG1vZGUgc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA3LTIwMDggTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgorICoKKyAqIFN1cHBvcnQgZm9yIGFsbCBkZXZpY2VzIChncmVhdGVyIHRoYW4gMTYpIGFkZGVkIGJ5IERhdmlkIEdhdGhyaWdodC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorCisjaWZkZWYgQ09ORklHX0RFQlVHX1BDSQorI2RlZmluZSBEQkcoeC4uLikgcHJpbnRrKEtFUk5fREVCVUcgeCkKKyNlbHNlCisjZGVmaW5lIERCRyh4Li4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIFBDSV9BQ0NFU1NfUkVBRAkJMAorI2RlZmluZSBQQ0lfQUNDRVNTX1dSSVRFCTEKKworc3RydWN0IGFsY2hlbXlfcGNpX2NvbnRleHQgeworCXN0cnVjdCBwY2lfY29udHJvbGxlciBhbGNoZW15X3BjaV9jdHJsOwkvKiBsZWF2ZSBhcyBmaXJzdCBtZW1iZXIhICovCisJdm9pZCBfX2lvbWVtICpyZWdzOwkJCS8qIGN0cmwgYmFzZSAqLworCS8qIHRvb2xzIGZvciB3aXJlZCBlbnRyeSBmb3IgY29uZmlnIHNwYWNlIGFjY2VzcyAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9lbG8wOworCXVuc2lnbmVkIGxvbmcgbGFzdF9lbG8xOworCWludCB3aXJlZF9lbnRyeTsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICpwY2lfY2ZnX3ZtOworCisJdW5zaWduZWQgbG9uZyBwbVsxMl07CisKKwlpbnQgKCpib2FyZF9tYXBfaXJxKShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZCwgdTggc2xvdCwgdTggcGluKTsKKwlpbnQgKCpib2FyZF9wY2lfaWRzZWwpKHVuc2lnbmVkIGludCBkZXZzZWwsIGludCBhc3NlcnQpOworfTsKKworLyogSU8vTUVNIHJlc291cmNlcyBmb3IgUENJLiBLZWVwIHRoZSBtZW1yZXMgaW4gc3luYyB3aXRoIF9fZml4dXBfYmlncGh5c19hZGRyCisgKiBpbiBhcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYworICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFsY2hlbXlfcGNpX2RlZl9tZW1yZXMgPSB7CisJLnN0YXJ0CT0gQUxDSEVNWV9QQ0lfTUVNV0lOX1NUQVJULAorCS5lbmQJPSBBTENIRU1ZX1BDSV9NRU1XSU5fRU5ELAorCS5uYW1lCT0gIlBDSSBtZW1vcnkgc3BhY2UiLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFsY2hlbXlfcGNpX2RlZl9pb3JlcyA9IHsKKwkuc3RhcnQJPSBBTENIRU1ZX1BDSV9JT1dJTl9TVEFSVCwKKwkuZW5kCT0gQUxDSEVNWV9QQ0lfSU9XSU5fRU5ELAorCS5uYW1lCT0gIlBDSSBJTyBzcGFjZSIsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTworfTsKKworc3RhdGljIHZvaWQgbW9kX3dpcmVkX2VudHJ5KGludCBlbnRyeSwgdW5zaWduZWQgbG9uZyBlbnRyeWxvMCwKKwkJdW5zaWduZWQgbG9uZyBlbnRyeWxvMSwgdW5zaWduZWQgbG9uZyBlbnRyeWhpLAorCQl1bnNpZ25lZCBsb25nIHBhZ2VtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgb2xkX3BhZ2VtYXNrOworCXVuc2lnbmVkIGxvbmcgb2xkX2N0eDsKKworCS8qIFNhdmUgb2xkIGNvbnRleHQgYW5kIGNyZWF0ZSBpbXBvc3NpYmxlIFZQTjIgdmFsdWUgKi8KKwlvbGRfY3R4ID0gcmVhZF9jMF9lbnRyeWhpKCkgJiAweGZmOworCW9sZF9wYWdlbWFzayA9IHJlYWRfYzBfcGFnZW1hc2soKTsKKwl3cml0ZV9jMF9pbmRleChlbnRyeSk7CisJd3JpdGVfYzBfcGFnZW1hc2socGFnZW1hc2spOworCXdyaXRlX2MwX2VudHJ5aGkoZW50cnloaSk7CisJd3JpdGVfYzBfZW50cnlsbzAoZW50cnlsbzApOworCXdyaXRlX2MwX2VudHJ5bG8xKGVudHJ5bG8xKTsKKwl0bGJfd3JpdGVfaW5kZXhlZCgpOworCXdyaXRlX2MwX2VudHJ5aGkob2xkX2N0eCk7CisJd3JpdGVfYzBfcGFnZW1hc2sob2xkX3BhZ2VtYXNrKTsKK30KKworc3RhdGljIHZvaWQgYWxjaGVteV9wY2lfd2lyZWRfZW50cnkoc3RydWN0IGFsY2hlbXlfcGNpX2NvbnRleHQgKmN0eCkKK3sKKwljdHgtPndpcmVkX2VudHJ5ID0gcmVhZF9jMF93aXJlZCgpOworCWFkZF93aXJlZF9lbnRyeSgwLCAwLCAodW5zaWduZWQgbG9uZyljdHgtPnBjaV9jZmdfdm0tPmFkZHIsIFBNXzRLKTsKKwljdHgtPmxhc3RfZWxvMCA9IGN0eC0+bGFzdF9lbG8xID0gfjA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2FjY2Vzcyh1bnNpZ25lZCBjaGFyIGFjY2Vzc190eXBlLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJIHVuc2lnbmVkIGludCBkZXZfZm4sIHVuc2lnbmVkIGNoYXIgd2hlcmUsIHUzMiAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWxjaGVteV9wY2lfY29udGV4dCAqY3R4ID0gYnVzLT5zeXNkYXRhOworCXVuc2lnbmVkIGludCBkZXZpY2UgPSBQQ0lfU0xPVChkZXZfZm4pOworCXVuc2lnbmVkIGludCBmdW5jdGlvbiA9IFBDSV9GVU5DKGRldl9mbik7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0YXR1cywgY2ZnX2Jhc2UsIGZsYWdzLCBlbnRyeUxvMCwgZW50cnlMbzEsIHI7CisJaW50IGVycm9yID0gUENJQklPU19TVUNDRVNTRlVMOworCisJaWYgKGRldmljZSA+IDE5KSB7CisJCSpkYXRhID0gMHhmZmZmZmZmZjsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFlBTU9OIG9uIGFsbCBkYjF4eHggYm9hcmRzIHdpcGVzIHRoZSBUTEIgYW5kIHdyaXRlcyB6ZXJvIHRvIEMwX3dpcmVkCisJICogb24gcmVzdW1lLCBjbGVhcmluZyBvdXIgd2lyZWQgZW50cnkuICBVbmZvcnR1bmF0ZWx5IHRoZSAtPnJlc3VtZSgpCisJICogY2FsbGJhY2sgaXMgY2FsbGVkIHdheSB3YXkgd2F5IHRvbyBsYXRlIChhbmQgLT5zdXNwZW5kKCkgdG9vIGVhcmx5KQorCSAqIHRvIGhhdmUgdGhlbSBkZXN0cm95IGFuZCByZWNyZWF0ZSBpdC4gIEluc3RlYWQganVzdCB0ZXN0IGlmIGMwX3dpcmVkCisJICogaXMgbm93IGxvd2VyIHRoYW4gdGhlIGluZGV4IHdlIHJldHJpZXZlZCBiZWZvcmUgc3VzcGVuZGluZyBhbmQgdGhlbgorCSAqIHJlY3JlYXRlIHRoZSBlbnRyeSBpZiBuZWNlc3NhcnkuICBPZiBjb3Vyc2UgdGhpcyBpcyB0b3RhbGx5IGJvbmtlcnMKKwkgKiBhbmQgYnJlYWtzIGFzIHNvb24gYXMgc29tZW9uZSBlbHNlIGFkZHMgYW5vdGhlciB3aXJlZCBlbnRyeSBzb21ld2hlcmUKKwkgKiBlbHNlLiAgQW55b25lIGhhdmUgYW55IGlkZWFzIGhvdyB0byBoYW5kbGUgdGhpcyBiZXR0ZXI/CisJICovCisJaWYgKHVubGlrZWx5KHJlYWRfYzBfd2lyZWQoKSA8IGN0eC0+d2lyZWRfZW50cnkpKQorCQlhbGNoZW15X3BjaV93aXJlZF9lbnRyeShjdHgpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXIgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX1NUQVRDTUQpICYgMHgwMDAwZmZmZjsKKwlyIHw9IFBDSV9TVEFUQ01EX1NUQVRVUygweDIwMDApOworCV9fcmF3X3dyaXRlbChyLCBjdHgtPnJlZ3MgKyBQQ0lfUkVHX1NUQVRDTUQpOworCXdtYigpOworCisJLyogQWxsb3cgYm9hcmQgdmVuZG9ycyB0byBpbXBsZW1lbnQgdGhlaXIgb3duIG9mZi1jaGlwIElEU0VMLgorCSAqIElmIGl0IGRvZXNuJ3Qgc3VjY2VlZCwgbWF5IGFzIHdlbGwgYmFpbCBvdXQgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlpZiAoY3R4LT5ib2FyZF9wY2lfaWRzZWwoZGV2aWNlLCAxKSA9PSAwKSB7CisJCSpkYXRhID0gMHhmZmZmZmZmZjsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2V0dXAgdGhlIGNvbmZpZyB3aW5kb3cgKi8KKwlpZiAoYnVzLT5udW1iZXIgPT0gMCkKKwkJY2ZnX2Jhc2UgPSAoMSA8PCBkZXZpY2UpIDw8IDExOworCWVsc2UKKwkJY2ZnX2Jhc2UgPSAweDgwMDAwMDAwIHwgKGJ1cy0+bnVtYmVyIDw8IDE2KSB8IChkZXZpY2UgPDwgMTEpOworCisJLyogU2V0dXAgdGhlIGxvd2VyIGJpdHMgb2YgdGhlIDM2LWJpdCBhZGRyZXNzICovCisJb2Zmc2V0ID0gKGZ1bmN0aW9uIDw8IDgpIHwgKHdoZXJlICYgfjB4Myk7CisJLyogUGljayB1cCBhbnkgYWRkcmVzcyB0aGF0IGZhbGxzIGJlbG93IHRoZSBwYWdlIG1hc2sgKi8KKwlvZmZzZXQgfD0gY2ZnX2Jhc2UgJiB+UEFHRV9NQVNLOworCisJLyogUGFnZSBib3VuZGFyeSAqLworCWNmZ19iYXNlID0gY2ZnX2Jhc2UgJiBQQUdFX01BU0s7CisKKwkvKiBUbyBpbXByb3ZlIHBlcmZvcm1hbmNlLCBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgdGhlIHNhbWUgYXMKKwkgKiB0aGUgbGFzdCBkZXZpY2UgYWNjZXNzZWQsIHdlIGRvbid0IHRvdWNoIHRoZSBUTEIuCisJICovCisJZW50cnlMbzAgPSAoNiA8PCAyNikgfCAoY2ZnX2Jhc2UgPj4gNikgfCAoMiA8PCAzKSB8IDc7CisJZW50cnlMbzEgPSAoNiA8PCAyNikgfCAoY2ZnX2Jhc2UgPj4gNikgfCAoMHgxMDAwID4+IDYpIHwgKDIgPDwgMykgfCA3OworCWlmICgoZW50cnlMbzAgIT0gY3R4LT5sYXN0X2VsbzApIHx8IChlbnRyeUxvMSAhPSBjdHgtPmxhc3RfZWxvMSkpIHsKKwkJbW9kX3dpcmVkX2VudHJ5KGN0eC0+d2lyZWRfZW50cnksIGVudHJ5TG8wLCBlbnRyeUxvMSwKKwkJCQkodW5zaWduZWQgbG9uZyljdHgtPnBjaV9jZmdfdm0tPmFkZHIsIFBNXzRLKTsKKwkJY3R4LT5sYXN0X2VsbzAgPSBlbnRyeUxvMDsKKwkJY3R4LT5sYXN0X2VsbzEgPSBlbnRyeUxvMTsKKwl9CisKKwlpZiAoYWNjZXNzX3R5cGUgPT0gUENJX0FDQ0VTU19XUklURSkKKwkJX19yYXdfd3JpdGVsKCpkYXRhLCBjdHgtPnBjaV9jZmdfdm0tPmFkZHIgKyBvZmZzZXQpOworCWVsc2UKKwkJKmRhdGEgPSBfX3Jhd19yZWFkbChjdHgtPnBjaV9jZmdfdm0tPmFkZHIgKyBvZmZzZXQpOworCXdtYigpOworCisJREJHKCJhbGNoZW15LXBjaTogY2ZnIGFjY2VzcyAlZCBidXMgJXUgZGV2ICV1IGF0ICV4IGRhdCAleCBjb25mICVseFxuIiwKKwkgICAgYWNjZXNzX3R5cGUsIGJ1cy0+bnVtYmVyLCBkZXZpY2UsIHdoZXJlLCAqZGF0YSwgb2Zmc2V0KTsKKworCS8qIGNoZWNrIGZvciBlcnJvcnMsIG1hc3RlciBhYm9ydCAqLworCXN0YXR1cyA9IF9fcmF3X3JlYWRsKGN0eC0+cmVncyArIFBDSV9SRUdfU1RBVENNRCk7CisJaWYgKHN0YXR1cyAmICgxIDw8IDI5KSkgeworCQkqZGF0YSA9IDB4ZmZmZmZmZmY7CisJCWVycm9yID0gLTE7CisJCURCRygiYWxjaGVteS1wY2k6IG1hc3RlciBhYm9ydCBvbiBjZmcgYWNjZXNzICVkIGJ1cyAlZCBkZXYgJWQiLAorCQkgICAgYWNjZXNzX3R5cGUsIGJ1cy0+bnVtYmVyLCBkZXZpY2UpOworCX0gZWxzZSBpZiAoKHN0YXR1cyA+PiAyOCkgJiAweGYpIHsKKwkJREJHKCJhbGNoZW15LXBjaTogUENJIEVSUiBkZXRlY3RlZDogZGV2ICVkLCBzdGF0dXMgJWx4XG4iLAorCQkgICAgZGV2aWNlLCAoc3RhdHVzID4+IDI4KSAmIDB4Zik7CisKKwkJLyogY2xlYXIgZXJyb3JzICovCisJCV9fcmF3X3dyaXRlbChzdGF0dXMgJiAweGYwMDBmZmZmLCBjdHgtPnJlZ3MgKyBQQ0lfUkVHX1NUQVRDTUQpOworCisJCSpkYXRhID0gMHhmZmZmZmZmZjsKKwkJZXJyb3IgPSAtMTsKKwl9CisKKwkvKiBUYWtlIGF3YXkgdGhlIElEU0VMLiAqLworCSh2b2lkKWN0eC0+Ym9hcmRfcGNpX2lkc2VsKGRldmljZSwgMCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHJlYWRfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgIGludCB3aGVyZSwJdTggKnZhbCkKK3sKKwl1MzIgZGF0YTsKKwlpbnQgcmV0ID0gY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSk7CisKKwlpZiAod2hlcmUgJiAxKQorCQlkYXRhID4+PSA4OworCWlmICh3aGVyZSAmIDIpCisJCWRhdGEgPj49IDE2OworCSp2YWwgPSBkYXRhICYgMHhmZjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlYWRfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgIGludCB3aGVyZSwgdTE2ICp2YWwpCit7CisJdTMyIGRhdGE7CisJaW50IHJldCA9IGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpOworCisJaWYgKHdoZXJlICYgMikKKwkJZGF0YSA+Pj0gMTY7CisJKnZhbCA9IGRhdGEgJiAweGZmZmY7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkgICAgIGludCB3aGVyZSwgdTMyICp2YWwpCit7CisJcmV0dXJuIGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgdmFsKTsKK30KKworc3RhdGljIGludCB3cml0ZV9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkgICAgIGludCB3aGVyZSwgdTggdmFsKQoreworCXUzMiBkYXRhID0gMDsKKworCWlmIChjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfUkVBRCwgYnVzLCBkZXZmbiwgd2hlcmUsICZkYXRhKSkKKwkJcmV0dXJuIC0xOworCisJZGF0YSA9IChkYXRhICYgfigweGZmIDw8ICgod2hlcmUgJiAzKSA8PCAzKSkpIHwKKwkgICAgICAgKHZhbCA8PCAoKHdoZXJlICYgMykgPDwgMykpOworCisJaWYgKGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19XUklURSwgYnVzLCBkZXZmbiwgd2hlcmUsICZkYXRhKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCB3cml0ZV9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkgICAgIGludCB3aGVyZSwgdTE2IHZhbCkKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAoY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCisJCXJldHVybiAtMTsKKworCWRhdGEgPSAoZGF0YSAmIH4oMHhmZmZmIDw8ICgod2hlcmUgJiAzKSA8PCAzKSkpIHwKKwkgICAgICAgKHZhbCA8PCAoKHdoZXJlICYgMykgPDwgMykpOworCisJaWYgKGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19XUklURSwgYnVzLCBkZXZmbiwgd2hlcmUsICZkYXRhKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCB3cml0ZV9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICAgaW50IHdoZXJlLCB1MzIgdmFsKQoreworCXJldHVybiBjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfV1JJVEUsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmdmFsKTsKK30KKworc3RhdGljIGludCBhbGNoZW15X3BjaV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJICAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQoreworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMTogeworCQkJdTggX3ZhbDsKKwkJCWludCByYyA9IHJlYWRfY29uZmlnX2J5dGUoYnVzLCBkZXZmbiwgd2hlcmUsICZfdmFsKTsKKworCQkJKnZhbCA9IF92YWw7CisJCQlyZXR1cm4gcmM7CisJCX0KKwljYXNlIDI6IHsKKwkJCXUxNiBfdmFsOworCQkJaW50IHJjID0gcmVhZF9jb25maWdfd29yZChidXMsIGRldmZuLCB3aGVyZSwgJl92YWwpOworCisJCQkqdmFsID0gX3ZhbDsKKwkJCXJldHVybiByYzsKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiByZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCB3aGVyZSwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWxjaGVteV9wY2lfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKQoreworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJcmV0dXJuIHdyaXRlX2NvbmZpZ19ieXRlKGJ1cywgZGV2Zm4sIHdoZXJlLCAodTgpIHZhbCk7CisJY2FzZSAyOgorCQlyZXR1cm4gd3JpdGVfY29uZmlnX3dvcmQoYnVzLCBkZXZmbiwgd2hlcmUsICh1MTYpIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHdyaXRlX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCB3aGVyZSwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyBhbGNoZW15X3BjaV9vcHMgPSB7CisJLnJlYWQJPSBhbGNoZW15X3BjaV9yZWFkLAorCS53cml0ZQk9IGFsY2hlbXlfcGNpX3dyaXRlLAorfTsKKworc3RhdGljIGludCBhbGNoZW15X3BjaV9kZWZfaWRzZWwodW5zaWduZWQgaW50IGRldnNlbCwgaW50IGFzc2VydCkKK3sKKwlyZXR1cm4gMTsJLyogc3VjY2VzcyAqLworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhbGNoZW15X3BjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhbGNoZW15X3BjaV9wbGF0ZGF0YSAqcGQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWxjaGVteV9wY2lfY29udGV4dCAqY3R4OworCXZvaWQgX19pb21lbSAqdmlydF9pbzsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IHJldDsKKworCS8qIG5lZWQgYXQgbGVhc3QgUENJIElSUSBtYXBwaW5nIHRhYmxlICovCisJaWYgKCFwZCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJuZWVkIHBsYXRmb3JtIGRhdGEgZm9yIFBDSSBzZXR1cFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgZm9yIHBjaWN0bCBjb250ZXh0XG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vICBwY2ljdGwgY3RybCByZWdzIHJlc291cmNlXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQxOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpLCBwZGV2LT5uYW1lKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgY2xhaW0gcGNpIHJlZ3NcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDE7CisJfQorCisJY3R4LT5yZWdzID0gaW9yZW1hcF9ub2NhY2hlKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlpZiAoIWN0eC0+cmVncykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgbWFwIHBjaSByZWdzXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQyOworCX0KKworCS8qIG1hcCBwYXJ0cyBvZiB0aGUgUENJIElPIGFyZWEgKi8KKwkvKiBSRVZJU0lUOiBpZiB0aGlzIGNoYW5nZXMgd2l0aCBhIG5ld2VyIHZhcmlhbnQgKGRvdWJ0IGl0KSBtYWtlIHRoaXMKKwkgKiBhIHBsYXRmb3JtIHJlc291cmNlLgorCSAqLworCXZpcnRfaW8gPSBpb3JlbWFwKEFVMTUwMF9QQ0lfSU9fUEhZU19BRERSLCAweDAwMTAwMDAwKTsKKwlpZiAoIXZpcnRfaW8pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlbWFwIHBjaSBpbyBzcGFjZVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0MzsKKwl9CisJY3R4LT5hbGNoZW15X3BjaV9jdHJsLmlvX21hcF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpdmlydF9pbzsKKworI2lmZGVmIENPTkZJR19ETUFfTk9OQ09IRVJFTlQKKwkvKiBBdTE1MDAgcmV2aXNpb25zIG9sZGVyIHRoYW4gQUQgaGF2ZSBib3JrZWQgY29oZXJlbnQgUENJICovCisJaWYgKChhbGNoZW15X2dldF9jcHV0eXBlKCkgPT0gQUxDSEVNWV9DUFVfQVUxNTAwKSAmJgorCSAgICAocmVhZF9jMF9wcmlkKCkgPCAweDAxMDMwMjAyKSkgeworCQl2YWwgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NPTkZJRyk7CisJCXZhbCB8PSBQQ0lfQ09ORklHX05DOworCQlfX3Jhd193cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NPTkZJRyk7CisJCXdtYigpOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAibm9uLWNvaGVyZW50IFBDSSBvbiBBdTE1MDAgQUEvQUIvQUNcbiIpOworCX0KKyNlbmRpZgorCisJaWYgKHBkLT5ib2FyZF9tYXBfaXJxKQorCQljdHgtPmJvYXJkX21hcF9pcnEgPSBwZC0+Ym9hcmRfbWFwX2lycTsKKworCWlmIChwZC0+Ym9hcmRfcGNpX2lkc2VsKQorCQljdHgtPmJvYXJkX3BjaV9pZHNlbCA9IHBkLT5ib2FyZF9wY2lfaWRzZWw7CisJZWxzZQorCQljdHgtPmJvYXJkX3BjaV9pZHNlbCA9IGFsY2hlbXlfcGNpX2RlZl9pZHNlbDsKKworCS8qIGZpbGwgaW4gcmVsZXZhbnQgcGNpX2NvbnRyb2xsZXIgbWVtYmVycyAqLworCWN0eC0+YWxjaGVteV9wY2lfY3RybC5wY2lfb3BzID0gJmFsY2hlbXlfcGNpX29wczsKKwljdHgtPmFsY2hlbXlfcGNpX2N0cmwubWVtX3Jlc291cmNlID0gJmFsY2hlbXlfcGNpX2RlZl9tZW1yZXM7CisJY3R4LT5hbGNoZW15X3BjaV9jdHJsLmlvX3Jlc291cmNlID0gJmFsY2hlbXlfcGNpX2RlZl9pb3JlczsKKworCS8qIHdlIGNhbid0IGlvcmVtYXAgdGhlIGVudGlyZSBwY2kgY29uZmlnIHNwYWNlIGJlY2F1c2UgaXQncyB0b28gbGFyZ2UsCisJICogbm9yIGNhbiB3ZSBkeW5hbWljYWxseSBpb3JlbWFwIGl0IGJlY2F1c2Ugc29tZSBkcml2ZXJzIHVzZSB0aGUKKwkgKiBQQ0kgY29uZmlnIHJvdXRpbmVzIGZyb20gd2l0aGluIGF0b21pYyBjb250ZXggYW5kIHRoYXQgYmVjb21lcyBhCisJICogcHJvYmxlbSBpbiBnZXRfdm1fYXJlYSgpLiAgSW5zdGVhZCB3ZSB1c2Ugb25lIHdpcmVkIFRMQiBlbnRyeSB0bworCSAqIGhhbmRsZSBhbGwgY29uZmlnIGFjY2Vzc2VzIGZvciBhbGwgYnVzc2VzLgorCSAqLworCWN0eC0+cGNpX2NmZ192bSA9IGdldF92bV9hcmVhKDB4MjAwMCwgVk1fSU9SRU1BUCk7CisJaWYgKCFjdHgtPnBjaV9jZmdfdm0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCB2bSBhcmVhXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ0OworCX0KKwljdHgtPndpcmVkX2VudHJ5ID0gODE5MjsJLyogaW1wb3NzaWJseSBoaWdoIHZhbHVlICovCisKKwlzZXRfaW9fcG9ydF9iYXNlKCh1bnNpZ25lZCBsb25nKWN0eC0+YWxjaGVteV9wY2lfY3RybC5pb19tYXBfYmFzZSk7CisKKwkvKiBib2FyZCBtYXkgd2FudCB0byBtb2RpZnkgYml0cyBpbiB0aGUgY29uZmlnIHJlZ2lzdGVyLCBkbyBpdCBub3cgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NPTkZJRyk7CisJdmFsICY9IH5wZC0+cGNpX2NmZ19jbHI7CisJdmFsIHw9IHBkLT5wY2lfY2ZnX3NldDsKKwl2YWwgJj0gflBDSV9DT05GSUdfUEQ7CQkvKiBjbGVhciBkaXNhYmxlIGJpdCAqLworCV9fcmF3X3dyaXRlbCh2YWwsIGN0eC0+cmVncyArIFBDSV9SRUdfQ09ORklHKTsKKwl3bWIoKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7CisJcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoJmN0eC0+YWxjaGVteV9wY2lfY3RybCk7CisKKwlyZXR1cm4gMDsKKworb3V0NDoKKwlpb3VubWFwKHZpcnRfaW8pOworb3V0MzoKKwlpb3VubWFwKGN0eC0+cmVncyk7CitvdXQyOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CitvdXQxOgorCWtmcmVlKGN0eCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCisvKiBzYXZlIFBDSSBjb250cm9sbGVyIHJlZ2lzdGVyIGNvbnRlbnRzLiAqLworc3RhdGljIGludCBhbGNoZW15X3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWxjaGVteV9wY2lfY29udGV4dCAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwljdHgtPnBtWzBdICA9IF9fcmF3X3JlYWRsKGN0eC0+cmVncyArIFBDSV9SRUdfQ01FTSk7CisJY3R4LT5wbVsxXSAgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NPTkZJRykgJiAweDAwMDlmZmZmOworCWN0eC0+cG1bMl0gID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19CMkJNQVNLX0NDSCk7CisJY3R4LT5wbVszXSAgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX0IyQkJBU0UwX1ZJRCk7CisJY3R4LT5wbVs0XSAgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX0IyQkJBU0UxX1NJRCk7CisJY3R4LT5wbVs1XSAgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX01XTUFTS19ERVYpOworCWN0eC0+cG1bNl0gID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19NV0JBU0VfUkVWX0NDTCk7CisJY3R4LT5wbVs3XSAgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX0lEKTsKKwljdHgtPnBtWzhdICA9IF9fcmF3X3JlYWRsKGN0eC0+cmVncyArIFBDSV9SRUdfQ0xBU1NSRVYpOworCWN0eC0+cG1bOV0gID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19QQVJBTSk7CisJY3R4LT5wbVsxMF0gPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX01CQVIpOworCWN0eC0+cG1bMTFdID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19USU1FT1VUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsY2hlbXlfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFsY2hlbXlfcGNpX2NvbnRleHQgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJX19yYXdfd3JpdGVsKGN0eC0+cG1bMF0sICBjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NNRU0pOworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzJdLCAgY3R4LT5yZWdzICsgUENJX1JFR19CMkJNQVNLX0NDSCk7CisJX19yYXdfd3JpdGVsKGN0eC0+cG1bM10sICBjdHgtPnJlZ3MgKyBQQ0lfUkVHX0IyQkJBU0UwX1ZJRCk7CisJX19yYXdfd3JpdGVsKGN0eC0+cG1bNF0sICBjdHgtPnJlZ3MgKyBQQ0lfUkVHX0IyQkJBU0UxX1NJRCk7CisJX19yYXdfd3JpdGVsKGN0eC0+cG1bNV0sICBjdHgtPnJlZ3MgKyBQQ0lfUkVHX01XTUFTS19ERVYpOworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzZdLCAgY3R4LT5yZWdzICsgUENJX1JFR19NV0JBU0VfUkVWX0NDTCk7CisJX19yYXdfd3JpdGVsKGN0eC0+cG1bN10sICBjdHgtPnJlZ3MgKyBQQ0lfUkVHX0lEKTsKKwlfX3Jhd193cml0ZWwoY3R4LT5wbVs4XSwgIGN0eC0+cmVncyArIFBDSV9SRUdfQ0xBU1NSRVYpOworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzldLCAgY3R4LT5yZWdzICsgUENJX1JFR19QQVJBTSk7CisJX19yYXdfd3JpdGVsKGN0eC0+cG1bMTBdLCBjdHgtPnJlZ3MgKyBQQ0lfUkVHX01CQVIpOworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzExXSwgY3R4LT5yZWdzICsgUENJX1JFR19USU1FT1VUKTsKKwl3bWIoKTsKKwlfX3Jhd193cml0ZWwoY3R4LT5wbVsxXSwgIGN0eC0+cmVncyArIFBDSV9SRUdfQ09ORklHKTsKKwl3bWIoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYWxjaGVteV9wY2lfcG1vcHMgPSB7CisJLnN1c3BlbmQJPSBhbGNoZW15X3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWxjaGVteV9wY2lfcmVzdW1lLAorfTsKKworI2RlZmluZSBBTENIRU1ZX1BDSUNUTF9QTQkoJmFsY2hlbXlfcGNpX3Btb3BzKQorCisjZWxzZQorI2RlZmluZSBBTENIRU1ZX1BDSUNUTF9QTQlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWxjaGVteV9wY2ljdGxfZHJpdmVyID0geworCS5wcm9iZQkJPSBhbGNoZW15X3BjaV9wcm9iZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJhbGNoZW15LXBjaSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSBBTENIRU1ZX1BDSUNUTF9QTSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWxjaGVteV9wY2lfaW5pdCh2b2lkKQoreworCS8qIEF1MTUwMC9BdTE1NTAgaGF2ZSBQQ0kgKi8KKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTAwOgorCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTUwOgorCQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbGNoZW15X3BjaWN0bF9kcml2ZXIpOworCX0KKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoYWxjaGVteV9wY2lfaW5pdCk7CisKKworaW50IF9faW5pdCBwY2liaW9zX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXN0cnVjdCBhbGNoZW15X3BjaV9jb250ZXh0ICpjdHggPSBkZXYtPnN5c2RhdGE7CisJaWYgKGN0eCAmJiBjdHgtPmJvYXJkX21hcF9pcnEpCisJCXJldHVybiBjdHgtPmJvYXJkX21hcF9pcnEoZGV2LCBzbG90LCBwaW4pOworCXJldHVybiAtMTsKK30KKworaW50IHBjaWJpb3NfcGxhdF9kZXZfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jIGIvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jCmluZGV4IGEwZTcyNmUuLjE5M2U5NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMKQEAgLTksNiArOSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FyY2guaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLmMgYi9hcmNoL21pcHMvcGNpL3BjaS5jCmluZGV4IDMzYmJhN2IuLjQxYWY3ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2kuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3NldHVwLmMgYi9hcmNoL21pcHMvcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9zZXR1cC5jCmluZGV4IDBhYmZiZTAuLjY1NTMwOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3Bfc2V0dXAuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3I0a2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS9zbXAtb3BzLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KIAogI2luY2x1ZGUgPG1zcF9wcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9weS1jb25zb2xlLmMgYi9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9weS1jb25zb2xlLmMKaW5kZXggNDM0ZDdiMS4uYjdmMWQ5YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvcHktY29uc29sZS5jCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3B5LWNvbnNvbGUuYwpAQCAtNjUsMTUgKzY1LDExIEBACiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCiAJIgkuc2V0CW1pcHMzCQlcbiIKLQkiCS5zZXQJcHVzaAkJXG4iCi0JIgkuc2V0CW5vcmVvcmRlcglcbiIKLQkiCS5zZXQJbm9tYWNybwkJXG4iCiAJIglsZAklMCwgJTEJCVxuIgotCSIJLnNldAlwb3AJCVxuIgogCSIJbGJ1CSUwLCAoJTApCVxuIgogCSIJLnNldAltaXBzMAkJXG4iCiAJOiAiPXIiIChyZXMpCi0JOiAiUiIgKHZhZGRyKSk7CisJOiAibSIgKHZhZGRyKSk7CiAKIAl3cml0ZV9jMF9zdGF0dXMoc3IpOwogCXNzbm9wXzQoKTsKQEAgLTkzLDE1ICs4OSwxMSBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAogCSIJLnNldAltaXBzMwkJXG4iCi0JIgkuc2V0CXB1c2gJCVxuIgotCSIJLnNldAlub3Jlb3JkZXIJXG4iCi0JIgkuc2V0CW5vbWFjcm8JCVxuIgogCSIJbGQJJTAsICUxCQlcbiIKLQkiCS5zZXQJcG9wCQlcbiIKIAkiCXNiCSUyLCAoJTApCVxuIgogCSIJLnNldAltaXBzMAkJXG4iCiAJOiAiPSZyIiAodG1wKQotCTogIlIiICh2YWRkciksICJyIiAoYykpOworCTogIm0iICh2YWRkciksICJyIiAoYykpOwogCiAJd3JpdGVfYzBfc3RhdHVzKHNyKTsKIAlzc25vcF80KCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG54ODU1MC9jb21tb24vcHJvbS5jIGIvYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3Byb20uYwppbmRleCAzMmY3MDA5Li40OTYzOWU4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG54ODU1MC9jb21tb24vcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9wbng4NTUwL2NvbW1vbi9wcm9tLmMKQEAgLTMwLDcgKzMwLDcgQEAKIH10X2Vudl92YXI7CiAKIAotY2hhciAqIHByb21fZ2V0Y21kbGluZSh2b2lkKQorY2hhciAqIF9faW5pdCBwcm9tX2dldGNtZGxpbmUodm9pZCkKIHsKIAlyZXR1cm4gJihhcmNzX2NtZGxpbmVbMF0pOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3Bvd2VydHYvS2NvbmZpZyBiL2FyY2gvbWlwcy9wb3dlcnR2L0tjb25maWcKaW5kZXggZmYwZTdlMy4uMWExYjAzZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3Bvd2VydHYvS2NvbmZpZworKysgYi9hcmNoL21pcHMvcG93ZXJ0di9LY29uZmlnCkBAIC0xLDUgKzEsMyBAQAotc291cmNlICJhcmNoL21pcHMvcG93ZXJ0di9hc2ljL0tjb25maWciCi0KIGNvbmZpZyBCT09UTE9BREVSX0RSSVZFUgogCWJvb2wgIlBvd2VyVFYgQm9vdGxvYWRlciBEcml2ZXIgU3VwcG9ydCIKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvS2NvbmZpZyBiL2FyY2gvbWlwcy9wb3dlcnR2L2FzaWMvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxNmJmZS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1jb25maWcgTUlOX1JVTlRJTUVfUkVTT1VSQ0VTCi0JYm9vbCAiU3VwcG9ydCBmb3IgbWluaW11bSBydW50aW1lIHJlc291cmNlcyIKLQlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIFBPV0VSVFYKLQloZWxwCi0JICBFbmFibGVzIHN1cHBvcnQgZm9yIG1pbmltaXppbmcgdGhlIG51bWJlciBvZiAoU0EgYXNpYykgcnVudGltZQotCSAgcmVzb3VyY2VzIHRoYXQgYXJlIHByZWFsbG9jYXRlZCBieSB0aGUga2VybmVsLgotCi1jb25maWcgTUlOX1JVTlRJTUVfRE9DU0lTCi0JYm9vbCAiU3VwcG9ydCBmb3IgbWluaW11bSBET0NTSVMgcmVzb3VyY2UiCi0JZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBNSU5fUlVOVElNRV9SRVNPVVJDRVMKLQloZWxwCi0JICBFbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBwcmVhbGxvY2F0ZWQgRE9DU0lTIHJlc291cmNlLgotCi1jb25maWcgTUlOX1JVTlRJTUVfUE1FTQotCWJvb2wgIlN1cHBvcnQgZm9yIG1pbmltdW0gUE1FTSByZXNvdXJjZSIKLQlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIE1JTl9SVU5USU1FX1JFU09VUkNFUwotCWhlbHAKLQkgIEVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHByZWFsbG9jYXRlZCBNZW1vcnkgcmVzb3VyY2UuCi0KLWNvbmZpZyBNSU5fUlVOVElNRV9URlRQCi0JYm9vbCAiU3VwcG9ydCBmb3IgbWluaW11bSBURlRQIHJlc291cmNlIgotCWRlZmF1bHQgeQotCWRlcGVuZHMgb24gTUlOX1JVTlRJTUVfUkVTT1VSQ0VTCi0JaGVscAotCSAgRW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgcHJlYWxsb2NhdGVkIFRGVFAgcmVzb3VyY2UuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9wY2kvZml4dXAtcG93ZXJ0di5jIGIvYXJjaC9taXBzL3Bvd2VydHYvcGNpL2ZpeHVwLXBvd2VydHYuYwppbmRleCA3MjZiYzJlLi5kN2VjYmFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG93ZXJ0di9wY2kvZml4dXAtcG93ZXJ0di5jCisrKyBiL2FyY2gvbWlwcy9wb3dlcnR2L3BjaS9maXh1cC1wb3dlcnR2LmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXBvd2VydHYvaW50ZXJydXB0cy5oPgogI2luY2x1ZGUgInBvd2VydHYtcGNpLmgiCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9wb3dlcnR2LXVzYi5jIGIvYXJjaC9taXBzL3Bvd2VydHYvcG93ZXJ0di11c2IuYwppbmRleCA2YWM4NWNmLi5iMGUyYWZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG93ZXJ0di9wb3dlcnR2LXVzYi5jCisrKyBiL2FyY2gvbWlwcy9wb3dlcnR2L3Bvd2VydHYtdXNiLmMKQEAgLTI5LDYgKzI5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtcG93ZXJ0di9hc2ljLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcmI1MzIvZ3Bpby5jIGIvYXJjaC9taXBzL3JiNTMyL2dwaW8uYwppbmRleCA2YzQ3ZGZlLi42ZWM0MWRmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcmI1MzIvZ3Bpby5jCisrKyBiL2FyY2gvbWlwcy9yYjUzMi9ncGlvLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9yYjUzMi9zZXR1cC5jIGIvYXJjaC9taXBzL3JiNTMyL3NldHVwLmMKaW5kZXggNTBmNTMwZi4uZDBjNjRlNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3JiNTMyL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3JiNTMyL3NldHVwLmMKQEAgLTMsNiArMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWlycS5jIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMKaW5kZXggYjE4YjA0ZS4uZjkwZGNlMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMKQEAgLTMzNywxMiArMzM3LDEyIEBACiAJLmlycV91bm1hc2sJPSBlbmFibGVfYnJpZGdlX2lycSwKIH07CiAKLXZvaWQgX19kZXZpbml0IHJlZ2lzdGVyX2JyaWRnZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3ZvaWQgcmVnaXN0ZXJfYnJpZGdlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZicmlkZ2VfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOwogfQogCi1pbnQgX19kZXZpbml0IHJlcXVlc3RfYnJpZGdlX2lycShzdHJ1Y3QgYnJpZGdlX2NvbnRyb2xsZXIgKmJjKQoraW50IHJlcXVlc3RfYnJpZGdlX2lycShzdHJ1Y3QgYnJpZGdlX2NvbnRyb2xsZXIgKmJjKQogewogCWludCBpcnEgPSBhbGxvY2F0ZV9pcnFubygpOwogCWludCBzd2xldmVsLCBjcHU7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NwaV9lZXByb20uYyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc3BpX2VlcHJvbS5jCmluZGV4IDEwM2FiYzEuLjNkYmFkOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc3BpX2VlcHJvbS5jCisrKyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc3BpX2VlcHJvbS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvZWVwcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOS9zZXR1cC5jIGIvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mzkvc2V0dXAuYwppbmRleCA3ZGMwZmFmLi4yYWQ4OTczIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOS9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM5L3NldHVwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9naXUuYyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2dpdS5jCmluZGV4IDIyY2M2ZjIuLmIzMmIzYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2dpdS5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2dpdS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vcnRjLmMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9ydGMuYwppbmRleCBlYmM1ZGNmLi43NmUzZThhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9ydGMuYworKysgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9ydGMuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCA0ZTYwYzQyLi44NzYzNTZkIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC02Miw0ICs2Miw3IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9nZGItc3R1Yi5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9nZGItc3R1Yi5jCmluZGV4IDUzODI2NmIuLjUyMmViOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLXN0dWIuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1zdHViLmMKQEAgLTc5OCw3ICs3OTgsNyBAQAogCWlmICgodTMyKSBtZW0gJiAxICYmIGNvdW50ID49IDEpIHsKIAkJaWYgKGdkYnN0dWJfcmVhZF9ieXRlKG1lbSwgY2gpICE9IDApCiAJCQlyZXR1cm4gMDsKLQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsIGNoWzBdKTsKKwkJYnVmID0gaGV4X2J5dGVfcGFjayhidWYsIGNoWzBdKTsKIAkJbWVtKys7CiAJCWNvdW50LS07CiAJfQpAQCAtODA2LDggKzgwNiw4IEBACiAJaWYgKCh1MzIpIG1lbSAmIDMgJiYgY291bnQgPj0gMikgewogCQlpZiAoZ2Ric3R1Yl9yZWFkX3dvcmQobWVtLCBjaCkgIT0gMCkKIAkJCXJldHVybiAwOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMF0pOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMV0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMF0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMV0pOwogCQltZW0gKz0gMjsKIAkJY291bnQgLT0gMjsKIAl9CkBAIC04MTUsMTAgKzgxNSwxMCBAQAogCXdoaWxlIChjb3VudCA+PSA0KSB7CiAJCWlmIChnZGJzdHViX3JlYWRfZHdvcmQobWVtLCBjaCkgIT0gMCkKIAkJCXJldHVybiAwOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMF0pOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMV0pOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMl0pOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbM10pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMF0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMV0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMl0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbM10pOwogCQltZW0gKz0gNDsKIAkJY291bnQgLT0gNDsKIAl9CkBAIC04MjYsOCArODI2LDggQEAKIAlpZiAoY291bnQgPj0gMikgewogCQlpZiAoZ2Ric3R1Yl9yZWFkX3dvcmQobWVtLCBjaCkgIT0gMCkKIAkJCXJldHVybiAwOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMF0pOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMV0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMF0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMV0pOwogCQltZW0gKz0gMjsKIAkJY291bnQgLT0gMjsKIAl9CkBAIC04MzUsNyArODM1LDcgQEAKIAlpZiAoY291bnQgPj0gMSkgewogCQlpZiAoZ2Ric3R1Yl9yZWFkX2J5dGUobWVtLCBjaCkgIT0gMCkKIAkJCXJldHVybiAwOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMF0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMF0pOwogCX0KIAogCSpidWYgPSAwOwpAQCAtMTI3MywxMyArMTI3MywxMyBAQAogCQlwdHIgPSBtZW0yaGV4KHRpdGxlLCBwdHIsIHNpemVvZih0aXRsZSkgLSAxLCAwKTsKIAogCQloeCA9IGhleF9hc2NfaGkoZXhjZXAgPj4gOCk7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19sbyhleGNlcCA+PiA4KTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2hpKGV4Y2VwKTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2xvKGV4Y2VwKTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAogCQlwdHIgPSBtZW0yaGV4KGNybGYsIHB0ciwgc2l6ZW9mKGNybGYpIC0gMSwgMCk7CiAJCSpwdHIgPSAwOwpAQCAtMTI5MSwyMSArMTI5MSwyMSBAQAogCQlwdHIgPSBtZW0yaGV4KHRiY2JlcnIsIHB0ciwgc2l6ZW9mKHRiY2JlcnIpIC0gMSwgMCk7CiAKIAkJaHggPSBoZXhfYXNjX2hpKGJjYmVyciA+PiAyNCk7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19sbyhiY2JlcnIgPj4gMjQpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfaGkoYmNiZXJyID4+IDE2KTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2xvKGJjYmVyciA+PiAxNik7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19oaShiY2JlcnIgPj4gOCk7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19sbyhiY2JlcnIgPj4gOCk7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19oaShiY2JlcnIpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfbG8oYmNiZXJyKTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAogCQlwdHIgPSBtZW0yaGV4KGNybGYsIHB0ciwgc2l6ZW9mKGNybGYpIC0gMSwgMCk7CiAJCSpwdHIgPSAwOwpAQCAtMTMyMSwxMiArMTMyMSwxMiBAQAogCSAqIFNlbmQgdHJhcCB0eXBlIChjb252ZXJ0ZWQgdG8gc2lnbmFsKQogCSAqLwogCSpwdHIrKyA9ICdUJzsKLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgc2lndmFsKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgc2lndmFsKTsKIAogCS8qCiAJICogU2VuZCBFcnJvciBQQwogCSAqLwotCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBHREJfUkVHSURfUEMpOworCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBHREJfUkVHSURfUEMpOwogCSpwdHIrKyA9ICc6JzsKIAlwdHIgPSBtZW0yaGV4KCZyZWdzLT5wYywgcHRyLCA0LCAwKTsKIAkqcHRyKysgPSAnOyc7CkBAIC0xMzM0LDcgKzEzMzQsNyBAQAogCS8qCiAJICogU2VuZCBmcmFtZSBwb2ludGVyCiAJICovCi0JcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIEdEQl9SRUdJRF9GUCk7CisJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIEdEQl9SRUdJRF9GUCk7CiAJKnB0cisrID0gJzonOwogCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmEzLCBwdHIsIDQsIDApOwogCSpwdHIrKyA9ICc7JzsKQEAgLTEzNDMsNyArMTM0Myw3IEBACiAJICogU2VuZCBzdGFjayBwb2ludGVyCiAJICovCiAJc3NwID0gKHVuc2lnbmVkIGxvbmcpIChyZWdzICsgMSk7Ci0JcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIEdEQl9SRUdJRF9TUCk7CisJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIEdEQl9SRUdJRF9TUCk7CiAJKnB0cisrID0gJzonOwogCXB0ciA9IG1lbTJoZXgoJnNzcCwgcHRyLCA0LCAwKTsKIAkqcHRyKysgPSAnOyc7CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL0tjb25maWcgYi9hcmNoL29wZW5yaXNjL0tjb25maWcKaW5kZXggOTQ2MGUxYy4uZTUxOGE1YSAxMDA2NDQKLS0tIGEvYXJjaC9vcGVucmlzYy9LY29uZmlnCisrKyBiL2FyY2gvb3BlbnJpc2MvS2NvbmZpZwpAQCAtMTksOSArMTksNiBAQAogY29uZmlnIE1NVQogCWRlZl9ib29sIHkKIAotY29uZmlnIFdJU0hCT05FX0JVU19CSUdfRU5ESUFOCi0JZGVmX2Jvb2wgeQotCiBjb25maWcgU1lNQk9MX1BSRUZJWAogICAgICAgICBzdHJpbmcKICAgICAgICAgZGVmYXVsdCAiIgpAQCAtMTYwLDE1ICsxNTcsNiBAQAogCiAJICBTYXkgWSBpZiB5b3UgYXJlIHVuc3VyZS4KIAotY29uZmlnIE9QRU5SSVNDX0VYQ0VQVElPTl9ERUJVRwotCWJvb2wgIlByaW50IHByb2Nlc3NvciBzdGF0ZSBhdCBlYWNoIGV4Y2VwdGlvbiIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIG9wdGlvbiB3aWxsIG1ha2UgeW91ciBrZXJuZWwgdW51c2FibGUgZm9yIGFsbCBidXQga2VybmVsCi0JICBkZWJ1Z2dpbmcuCi0KLQkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgotCiBjb25maWcgT1BFTlJJU0NfRVNSX0VYQ0VQVElPTl9CVUdfQ0hFQ0sKIAlib29sICJDaGVjayBmb3IgcG9zc2libGUgRVNSIGV4Y2VwdGlvbiBidWciCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9jb21wYXQuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2NvbXBhdC5oCmluZGV4IGVmYTBiNjBjLi43NjBmMzMxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9jb21wYXQuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9jb21wYXQuaApAQCAtMTA1LDcgKzEwNSw4IEBACiAJX19rZXJuZWxfZnNpZF90CWZfZnNpZDsKIAlzMzIJCWZfbmFtZWxlbjsKIAlzMzIJCWZfZnJzaXplOwotCXMzMgkJZl9zcGFyZVs1XTsKKwlzMzIJCWZfZmxhZ3M7CisJczMyCQlmX3NwYXJlWzRdOwogfTsKIAogc3RydWN0IGNvbXBhdF9zaWdjb250ZXh0IHsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggMjI1YjdkNi4uZDI4YzUxYiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTYxLDYgKzYxLDkgQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICAweDQwMjEKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJMHg0MDIyCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogLyogT19OT05CTE9DSyBjbGFzaGVzIHdpdGggdGhlIGJpdHMgdXNlZCBmb3Igc29ja2V0IHR5cGVzLiAgVGhlcmVmb3JlIHdlCiAgKiBoYXZlIHRvIGRlZmluZSBTT0NLX05PTkJMT0NLIHRvIGEgZGlmZmVyZW50IHZhbHVlIGhlcmUuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9kcml2ZXJzLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZHJpdmVycy5jCmluZGV4IDk5NGJjZDkuLjU3MDljNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9kcml2ZXJzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2RyaXZlcnMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BkYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggZDA0N2VkZS4uZDg3ZDFjNCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcGNpLWRtYS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+ICAgIC8qIGZvciBETUFfQ0hVTktfU0laRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3NldHVwLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYwppbmRleCBjYjcxZjNkLi5hMzMyOGMyIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI3VuZGVmIFBDSV9ERUJVRwogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcGRjLmg+CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9saWIvaW9tYXAuYyBiL2FyY2gvcGFyaXNjL2xpYi9pb21hcC5jCmluZGV4IDUwNjllOGIuLjhmNDcwYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2xpYi9pb21hcC5jCisrKyBiL2FyY2gvcGFyaXNjL2xpYi9pb21hcC5jCkBAIC01LDYgKzUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDQ3NjgyYjYuLmIxNzdjYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC0zMjMsNyArMzIzLDcgQEAKIAogY29uZmlnIEhPVFBMVUdfQ1BVCiAJYm9vbCAiU3VwcG9ydCBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIENQVXMiCi0JZGVwZW5kcyBvbiBTTVAgJiYgSE9UUExVRyAmJiBFWFBFUklNRU5UQUwgJiYgKFBQQ19QU0VSSUVTIHx8IFBQQ19QTUFDKQorCWRlcGVuZHMgb24gU01QICYmIEhPVFBMVUcgJiYgRVhQRVJJTUVOVEFMICYmIChQUENfUFNFUklFUyB8fCBQUENfUE1BQyB8fCBQUENfUE9XRVJOVikKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIHRvIGJlIGFibGUgdG8gZGlzYWJsZSBhbmQgcmUtZW5hYmxlIGluZGl2aWR1YWwKIAkgIENQVXMgYXQgcnVudGltZSBvbiBTTVAgbWFjaGluZXMuCkBAIC0zNDUsNyArMzQ1LDcgQEAKIAogY29uZmlnIEtFWEVDCiAJYm9vbCAia2V4ZWMgc3lzdGVtIGNhbGwgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiAoUFBDX0JPT0szUyB8fCBGU0xfQk9PS0UpICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gKFBQQ19CT09LM1MgfHwgRlNMX0JPT0tFIHx8ICg0NHggJiYgIVNNUCAmJiAhNDd4KSkgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAga2V4ZWMgaXMgYSBzeXN0ZW0gY2FsbCB0aGF0IGltcGxlbWVudHMgdGhlIGFiaWxpdHkgdG8gc2h1dGRvd24geW91cgogCSAgY3VycmVudCBrZXJuZWwsIGFuZCB0byBzdGFydCBhbm90aGVyIGtlcm5lbC4gIEl0IGlzIGxpa2UgYSByZWJvb3QKQEAgLTM3OSwxMCArMzc5LDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgIk4iCiAKLWNvbmZpZyBQUENCVUdfTlZSQU0KLQlib29sICJFbmFibGUgcmVhZGluZyBQUENCVUcgTlZSQU0gZHVyaW5nIGJvb3QiIGlmIFBQTFVTIHx8IExPUEVDCi0JZGVmYXVsdCB5IGlmIFBQQ19QUkVQCi0KIGNvbmZpZyBJUlFfQUxMX0NQVVMKIAlib29sICJEaXN0cmlidXRlIGludGVycnVwdHMgb24gYWxsIENQVXMgYnkgZGVmYXVsdCIKIAlkZXBlbmRzIG9uIFNNUCAmJiAhTVY2NDM2MApAQCAtNDI5LDggKzQyNSw3IEBACiAJZGVmX2Jvb2wgeQogCiBjb25maWcgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUwotICAgICAgIGRlZl9ib29sIHkKLSAgICAgICBkZXBlbmRzIG9uIFBQQ19CT09LM1NfNjQKKwlib29sCiAKIHNvdXJjZSAibW0vS2NvbmZpZyIKIApAQCAtNzQ2LDI0ICs3NDEsNiBAQAogCWRlcGVuZHMgb24gUENJXzgyNjAgJiYgITgyNzIKIAlkZWZhdWx0IHkKIAotY2hvaWNlCi0JcHJvbXB0ICJJRE1BIGNoYW5uZWwgZm9yIFBDSSA5IHdvcmthcm91bmQiCi0JZGVwZW5kcyBvbiA4MjYwX1BDSTkKLQotY29uZmlnIDgyNjBfUENJOV9JRE1BMQotCWJvb2wgIklETUExIgotCi1jb25maWcgODI2MF9QQ0k5X0lETUEyCi0JYm9vbCAiSURNQTIiCi0KLWNvbmZpZyA4MjYwX1BDSTlfSURNQTMKLQlib29sICJJRE1BMyIKLQotY29uZmlnIDgyNjBfUENJOV9JRE1BNAotCWJvb2wgIklETUE0IgotCi1lbmRjaG9pY2UKLQogc291cmNlICJkcml2ZXJzL3BjaS9wY2llL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9wY2kvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKaW5kZXggMDY3Y2I4NC4uMWI4YTljOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKQEAgLTE0MSw5ICsxNDEsNiBAQAogCiBjb25maWcgUFBDX0VBUkxZX0RFQlVHCiAJYm9vbCAiRWFybHkgZGVidWdnaW5nIChkYW5nZXJvdXMpIgotCSMgUFBDX0VBUkxZX0RFQlVHIG9uIDQ0MCBsZWF2ZXMgQVM9MSBtYXBwaW5ncyBhYm92ZSB0aGUgVExCIGhpZ2ggd2F0ZXIKLQkjIG1hcmssIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRoIGN1cnJlbnQgNDQwIEtWTS4KLQlkZXBlbmRzIG9uICFLVk0KIAloZWxwCiAJICBTYXkgWSB0byBlbmFibGUgc29tZSBlYXJseSBkZWJ1Z2dpbmcgZmFjaWxpdGllcyB0aGF0IG1heSBiZSBhdmFpbGFibGUKIAkgIGZvciB5b3VyIHByb2Nlc3Nvci9ib2FyZCBjb21iaW5hdGlvbi4gVGhvc2UgZmFjaWxpdGllcyBhcmUgaGFja3MKQEAgLTIyMiw3ICsyMTksOSBAQAogCiBjb25maWcgUFBDX0VBUkxZX0RFQlVHXzQ0eAogCWJvb2wgIkVhcmx5IHNlcmlhbCBkZWJ1Z2dpbmcgZm9yIElCTS9BTUNDIDQ0eCBDUFVzIgotCWRlcGVuZHMgb24gNDR4CisJIyBQUENfRUFSTFlfREVCVUcgb24gNDQwIGxlYXZlcyBBUz0xIG1hcHBpbmdzIGFib3ZlIHRoZSBUTEIgaGlnaCB3YXRlcgorCSMgbWFyaywgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGggY3VycmVudCA0NDAgS1ZNLgorCWRlcGVuZHMgb24gNDR4ICYmICFLVk0KIAloZWxwCiAJICBTZWxlY3QgdGhpcyB0byBlbmFibGUgZWFybHkgZGVidWdnaW5nIGZvciBJQk0gNDR4IGNoaXBzIHZpYSB0aGUKIAkgIGluYnVpbHQgc2VyaWFsIHBvcnQuICBJZiB5b3UgZW5hYmxlIHRoaXMsIGVuc3VyZSB5b3Ugc2V0CkBAIC0yNTgsOCArMjU3LDM1IEBACiAJZGVwZW5kcyBvbiBQUENfV1NQCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAKK2NvbmZpZyBQUENfRUFSTFlfREVCVUdfUFMzR0VMSUMKKwlib29sICJFYXJseSBkZWJ1Z2dpbmcgdGhyb3VnaCB0aGUgUFMzIEV0aGVybmV0IHBvcnQiCisJZGVwZW5kcyBvbiBQUENfUFMzCisJc2VsZWN0IFBTM0dFTElDX1VEQkcKKwloZWxwCisJICBTZWxlY3QgdGhpcyB0byBlbmFibGUgZWFybHkgZGVidWdnaW5nIGZvciB0aGUgUGxheVN0YXRpb24zIHZpYQorCSAgVURQIGJyb2FkY2FzdHMgc2VudCBvdXQgdGhyb3VnaCB0aGUgRXRoZXJuZXQgcG9ydC4KKworY29uZmlnIFBQQ19FQVJMWV9ERUJVR19PUEFMX1JBVworCWJvb2wgIk9QQUwgcmF3IGNvbnNvbGUiCisJZGVwZW5kcyBvbiBIVkNfT1BBTAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgZm9yIHRoZSBQb3dlck5WIHBsYXRmb3JtCisJICB1c2luZyBhICJyYXciIGNvbnNvbGUKKworY29uZmlnIFBQQ19FQVJMWV9ERUJVR19PUEFMX0hWU0kKKwlib29sICJPUEFMIGh2c2kgY29uc29sZSIKKwlkZXBlbmRzIG9uIEhWQ19PUEFMCisJaGVscAorCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIGVhcmx5IGRlYnVnZ2luZyBmb3IgdGhlIFBvd2VyTlYgcGxhdGZvcm0KKwkgIHVzaW5nIGFuICJodnNpIiBjb25zb2xlCisKIGVuZGNob2ljZQogCitjb25maWcgUFBDX0VBUkxZX0RFQlVHX09QQUwKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBQUENfRUFSTFlfREVCVUdfT1BBTF9SQVcgfHwgUFBDX0VBUkxZX0RFQlVHX09QQUxfSFZTSQorCisKIGNvbmZpZyBQUENfRUFSTFlfREVCVUdfSFZTSV9WVEVSTU5PCiAJaGV4ICJ2dGVybSBudW1iZXIgdG8gdXNlIHdpdGggZWFybHkgZGVidWcgSFZTSSIKIAlkZXBlbmRzIG9uIFBQQ19FQVJMWV9ERUJVR19MUEFSX0hWU0kKQEAgLTI2OCw2ICsyOTQsMTggQEAKIAkgIFlvdSBwcm9iYWJseSB3YW50IDB4MzAwMDAwMDAgZm9yIHlvdXIgZmlyc3Qgc2VyaWFsIHBvcnQgYW5kCiAJICAweDMwMDAwMDAxIGZvciB5b3VyIHNlY29uZCBvbmUKIAorY29uZmlnIFBQQ19FQVJMWV9ERUJVR19PUEFMX1ZURVJNTk8KKwloZXggInZ0ZXJtIG51bWJlciB0byB1c2Ugd2l0aCBPUEFMIGVhcmx5IGRlYnVnIgorCWRlcGVuZHMgb24gUFBDX0VBUkxZX0RFQlVHX09QQUwKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIFRoaXMgY29ycmVzcG9uZCB0byB3aGljaCAvZGV2L2h2Y04geW91IHdhbnQgdG8gdXNlIGZvciBlYXJseQorCSAgZGVidWcuCisKKwkgIE9uIE9QQUwgdjEgKHRha2VvdmVyKSB0aGlzIHNob3VsZCBhbHdheXMgYmUgMAorCSAgT24gT1BBTCB2MiwgdGhpcyB3aWxsIGJlIDAgZm9yIG5ldHdvcmsgY29uc29sZSBhbmQgMSBvciAyIGZvcgorCSAgdGhlIG1hY2hpbmUgYnVpbHQtaW4gc2VyaWFsIHBvcnRzLgorCiBjb25maWcgUFBDX0VBUkxZX0RFQlVHXzQ0eF9QSFlTTE9XCiAJaGV4ICJMb3cgMzIgYml0cyBvZiBlYXJseSBkZWJ1ZyBVQVJUIHBoeXNpY2FsIGFkZHJlc3MiCiAJZGVwZW5kcyBvbiBQUENfRUFSTFlfREVCVUdfNDR4CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IGMyNjIwMGIuLjcyZWU4YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC01OCw3ICs1OCw3IEBACiBsaWJmZHQgICAgICAgOj0gZmR0LmMgZmR0X3JvLmMgZmR0X3dpcC5jIGZkdF9zdy5jIGZkdF9ydy5jIGZkdF9zdHJlcnJvci5jCiBsaWJmZHRoZWFkZXIgOj0gZmR0LmggbGliZmR0LmggbGliZmR0X2ludGVybmFsLmgKIAotJChhZGRwcmVmaXggJChvYmopLywkKGxpYmZkdCkgbGliZmR0LXdyYXBwZXIubyBzaW1wbGVib290Lm8pOiBcCiskKGFkZHByZWZpeCAkKG9iaikvLCQobGliZmR0KSBsaWJmZHQtd3JhcHBlci5vIHNpbXBsZWJvb3QubyBlcGFwci5vKTogXAogCSQoYWRkcHJlZml4ICQob2JqKS8sJChsaWJmZHRoZWFkZXIpKQogCiBzcmMtd2xpYiA6PSBzdHJpbmcuUyBjcnQwLlMgY3J0c2F2cmVzLlMgc3RkaW8uYyBtYWluLmMgXApAQCAtMTcxLDYgKzE3MSw3IEBACiAJCSQoaWYgJDMsIC1zICQzKSQoaWYgJDQsIC1kICQ0KSQoaWYgJDUsIC1pICQ1KSB2bWxpbnV4CiAKIGltYWdlLSQoQ09ORklHX1BQQ19QU0VSSUVTKQkJKz0gekltYWdlLnBzZXJpZXMKK2ltYWdlLSQoQ09ORklHX1BQQ19QT1dFUk5WKQkJKz0gekltYWdlLnBzZXJpZXMKIGltYWdlLSQoQ09ORklHX1BQQ19NQVBMRSkJCSs9IHpJbWFnZS5tYXBsZQogaW1hZ2UtJChDT05GSUdfUFBDX0lCTV9DRUxMX0JMQURFKQkrPSB6SW1hZ2UucHNlcmllcwogaW1hZ2UtJChDT05GSUdfUFBDX1BTMykJCQkrPSBkdGJJbWFnZS5wczMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jaGFyb24uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NoYXJvbi5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwMGU1MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jaGFyb24uZHRzCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogY2hhcm9uIGJvYXJkIERldmljZSBUcmVlIFNvdXJjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZW1paGFsZgorICogTWFyaWFuIEJhbGFrb3dpY3ogPG04QHNlbWloYWxmLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyBHbWJICisgKiBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy9kdHMtdjEvOworCisvIHsKKwltb2RlbCA9ICJhbm9uLGNoYXJvbiI7CisJY29tcGF0aWJsZSA9ICJhbm9uLGNoYXJvbiI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlQb3dlclBDLDUyMDBAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKKwkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCisJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgorCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDgwMDAwMDA+OwkvLyAxMjhNQgorCX07CisKKwlzb2M1MjAwQGYwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWltbXIiOworCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OworCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisKKwkJY2RtQDIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWNkbSI7CisJCQlyZWcgPSA8MHgyMDAgMHgzOD47CisJCX07CisKKwkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7CisJCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1waWMiOworCQkJcmVnID0gPDB4NTAwIDB4ODA+OworCQl9OworCisJCXRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjAwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CisJCQlmc2wsaGFzLXdkdDsKKwkJfTsKKworCQljYW5AOTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtbXNjYW4iOworCQkJaW50ZXJydXB0cyA9IDwyIDE3IDA+OworCQkJcmVnID0gPDB4OTAwIDB4ODA+OworCQl9OworCisJCWNhbkA5ODAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1tc2NhbiI7CisJCQlpbnRlcnJ1cHRzID0gPDIgMTggMD47CisJCQlyZWcgPSA8MHg5ODAgMHg4MD47CisJCX07CisKKwkJZ3Bpb19zaW1wbGU6IGdwaW9AYjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtZ3BpbyI7CisJCQlyZWcgPSA8MHhiMDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCXVzYkAxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOworCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKKwkJCWludGVycnVwdHMgPSA8MiA2IDA+OworCQl9OworCisJCWRtYS1jb250cm9sbGVyQDEyMDAgeworCQkJZGV2aWNlX3R5cGUgPSAiZG1hLWNvbnRyb2xsZXIiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7CisJCQlyZWcgPSA8MHgxMjAwIDB4ODA+OworCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAorCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAorCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCisJCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47CisJCX07CisKKwkJeGxiQDFmMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC14bGIiOworCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCX07CisKKwkJc2VyaWFsQDIwMDAgewkJLy8gUFNDMQorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1wc2MtdWFydCI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxIDA+OworCQl9OworCisJCXNlcmlhbEAyNDAwIHsJCS8vIFBTQzMKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOworCQkJcmVnID0gPDB4MjQwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMyAwPjsKKwkJfTsKKworCQlldGhlcm5ldEAzMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtZmVjIjsKKwkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKKwkJCWZpeGVkLWxpbmsgPSA8MSAxIDEwMCAwIDA+OworCQl9OworCisJCW1kaW9AMzAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1tZGlvIjsKKwkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OyAgICAgICAvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKKwkJCWludGVycnVwdHMgPSA8MiA1IDA+OyAgIC8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgorCQl9OworCisJCWF0YUAzYTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtYXRhIjsKKwkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47CisJCX07CisKKwkJaTJjQDNkMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgzZDAwIDB4NDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDE1IDA+OworCQl9OworCisKKwkJaTJjQDNkNDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgzZDQwIDB4NDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OworCisJCQlkdHRAMjggeworCQkJCWNvbXBhdGlibGUgPSAibmF0aW9uYWwsbG04MCI7CisJCQkJcmVnID0gPDB4Mjg+OworCQkJfTsKKworCQkJcnRjQDY4IHsKKwkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzNzQiOworCQkJCXJlZyA9IDwweDY4PjsKKwkJCX07CisJCX07CisKKwkJc3JhbUA4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtc3JhbSI7CisJCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47CisJCX07CisJfTsKKworCWxvY2FsYnVzIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1scGIiLCJzaW1wbGUtYnVzIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyYW5nZXMgPSA8CTAgMCAweGZjMDAwMDAwIDB4MDIwMDAwMDAKKwkJCQkxIDAgMHhlMDAwMDAwMCAweDA0MDAwMDAwIC8vIENTMSByYW5nZSwgU001MDEKKwkJCQkzIDAgMHhlODAwMDAwMCAweDAwMDgwMDAwPjsKKworCQlmbGFzaEAwLDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDAgMCAweDAyMDAwMDAwPjsKKwkJCWJhbmstd2lkdGggPSA8ND47CisJCQlkZXZpY2Utd2lkdGggPSA8Mj47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQl9OworCisJCWRpc3BsYXlAMSwwIHsKKwkJCWNvbXBhdGlibGUgPSAic21pLHNtNTAxIjsKKwkJCXJlZyA9IDwxIDB4MDAwMDAwMDAgMHgwMDgwMDAwMAorCQkJICAgICAgIDEgMHgwM2UwMDAwMCAweDAwMjAwMDAwPjsKKwkJCW1vZGUgPSAiNjQweDQ4MC0zMkA2MCI7CisJCQlpbnRlcnJ1cHRzID0gPDEgMSAzPjsKKwkJCWxpdHRsZS1lbmRpYW47CisJCX07CisKKwkJbXJhbTBAMywwIHsKKwkJCWNvbXBhdGlibGUgPSAibXRkLXJhbSI7CisJCQlyZWcgPSA8MyAweDAwMDAwIDB4ODAwMDA+OworCQkJYmFuay13aWR0aCA9IDwxPjsKKwkJfTsKKwl9OworCisJcGNpQGYwMDAwZDAwIHsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLXBjaSI7CisJCXJlZyA9IDwweGYwMDAwZDAwIDB4MTAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8MHhjMDAwIDAgMCAxICZtcGM1MjAwX3BpYyAwIDAgMworCQkJCSAweGMwMDAgMCAwIDIgJm1wYzUyMDBfcGljIDAgMCAzCisJCQkJIDB4YzAwMCAwIDAgMyAmbXBjNTIwMF9waWMgMCAwIDMKKwkJCQkgMHhjMDAwIDAgMCA0ICZtcGM1MjAwX3BpYyAwIDAgMz47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRnJvbSBib290IGxvYWRlcgorCQlpbnRlcnJ1cHRzID0gPDIgOCAwIDIgOSAwIDIgMTAgMD47CisJCWJ1cy1yYW5nZSA9IDwwIDA+OworCQlyYW5nZXMgPSA8MHg0MjAwMDAwMCAwIDB4ODAwMDAwMDAgMHg4MDAwMDAwMCAwIDB4MTAwMDAwMDAKKwkJCSAgMHgwMjAwMDAwMCAwIDB4OTAwMDAwMDAgMHg5MDAwMDAwMCAwIDB4MTAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhhMDAwMDAwMCAwIDB4MDEwMDAwMDA+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2RpZ3N5X210Yy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZGlnc3lfbXRjLmR0cwppbmRleCAyN2JkMjY3Li5hNzUxMWYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZGlnc3lfbXRjLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZGlnc3lfbXRjLmR0cwpAQCAtMjMsMTkgKzIzLDI2IEBACiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKIAkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJCWZzbCxoYXMtd2R0OworCQkJZ3Bpby1jb250cm9sbGVyOworCQl9OworCisJCXRpbWVyQDYxMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKIAkJfTsKIAogCQlydGNAODAwIHsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJY2FuQDkwMCB7Ci0JCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCQl9OwotCi0JCWNhbkA5ODAgewotCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJc3BpQGYwMCB7CisJCQltc3A0MzBAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJzcGlkZXYiOworCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDMyMDAwPjsKKwkJCQlyZWcgPSA8MD47CisJCQl9OwogCQl9OwogCiAJCXBzY0AyMDAwIHsJCS8vIFBTQzEKQEAgLTczLDExICs4MCwxNiBAQAogCQl9OwogCiAJCWkyY0AzZDAwIHsKLQkJCXJ0Y0A1MCB7CisJCQllZXByb21ANTAgewogCQkJCWNvbXBhdGlibGUgPSAiYXQsMjRjMDgiOwogCQkJCXJlZyA9IDwweDUwPjsKIAkJCX07CiAKKwkJCXJ0Y0A1NiB7CisJCQkJY29tcGF0aWJsZSA9ICJtYyxydjMwMjljMiI7CisJCQkJcmVnID0gPDB4NTY+OworCQkJfTsKKwogCQkJcnRjQDY4IHsKIAkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzMzkiOwogCQkJCXJlZyA9IDwweDY4PjsKQEAgLTkwLDExICsxMDIsMjIgQEAKIAl9OwogCiAJcGNpQGYwMDAwZDAwIHsKLQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8MHhjMDAwIDAgMCAxICZtcGM1MjAwX3BpYyAwIDAgMworCQkJCSAweGMwMDAgMCAwIDIgJm1wYzUyMDBfcGljIDAgMCAzCisJCQkJIDB4YzAwMCAwIDAgMyAmbXBjNTIwMF9waWMgMCAwIDMKKwkJCQkgMHhjMDAwIDAgMCA0ICZtcGM1MjAwX3BpYyAwIDAgMz47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRnJvbSBib290IGxvYWRlcgorCQlpbnRlcnJ1cHRzID0gPDIgOCAwIDIgOSAwIDIgMTAgMD47CisJCWJ1cy1yYW5nZSA9IDwwIDA+OworCQlyYW5nZXMgPSA8MHg0MjAwMDAwMCAwIDB4ODAwMDAwMDAgMHg4MDAwMDAwMCAwIDB4MTAwMDAwMDAKKwkJCSAgMHgwMjAwMDAwMCAwIDB4OTAwMDAwMDAgMHg5MDAwMDAwMCAwIDB4MTAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhhMDAwMDAwMCAwIDB4MDEwMDAwMDA+OwogCX07CiAKIAlsb2NhbGJ1cyB7Ci0JCXJhbmdlcyA9IDwwIDAgMHhmZjAwMDAwMCAweDEwMDAwMDA+OworCQlyYW5nZXMgPSA8MCAwIDB4ZmYwMDAwMDAgMHgxMDAwMDAwCisJCQkgIDQgMCAweDYwMDAwMDAwIDB4MDAwMTAwMD47CiAKIAkJLy8gMTYtYml0IGZsYXNoIGRldmljZSBhdCBMb2NhbFBsdXMgQnVzIENTMAogCQlmbGFzaEAwLDAgewpAQCAtMTIyLDUgKzE0NSwyNSBAQAogCQkJCXJlZyA9IDwweDAwZjAwMDAwIDB4MTAwMDAwPjsKIAkJCX07CiAJCX07CisKKwkJY2FuQDQsMCB7CisJCQljb21wYXRpYmxlID0gIm54cCxzamExMDAwIjsKKwkJCXJlZyA9IDw0IDB4MDAwIDB4ODA+OworCQkJbnhwLGV4dGVybmFsLWNsb2NrLWZyZXF1ZW5jeSA9IDwyNDAwMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMiAzPjsgLy8gTGV2ZWwtbG93CisJCX07CisKKwkJY2FuQDQsMTAwIHsKKwkJCWNvbXBhdGlibGUgPSAibnhwLHNqYTEwMDAiOworCQkJcmVnID0gPDQgMHgxMDAgMHg4MD47CisJCQlueHAsZXh0ZXJuYWwtY2xvY2stZnJlcXVlbmN5ID0gPDI0MDAwMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MSAyIDM+OyAgLy8gTGV2ZWwtbG93CisJCX07CisKKwkJc2VyaWFsQDQsMjAwIHsKKwkJCWNvbXBhdGlibGUgPSAibnhwLHNjMjhsOTIiOworCQkJcmVnID0gPDQgMHgyMDAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMyAzPjsKKwkJfTsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfcHBjOWEuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9wcGM5YS5kdHMKaW5kZXggODNmNGI3OS4uMjI2NmJiYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9wcGM5YS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9wcGM5YS5kdHMKQEAgLTI2OSwxNCArMjY5LDE2IEBACiAJCWVuZXQwOiBldGhlcm5ldEAyNDAwMCB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwPjsKIAkJCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDB4MWQgMHgyIDB4MWUgMHgyIDB4MjIgMHgyPjsKKwkJCWludGVycnVwdHMgPSA8MjkgMiAzMCAgMiAzNCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJdGJpLWhhbmRsZSA9IDwmdGJpMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAiZ21paSI7CiAKQEAgLTI5MCwyNSArMjkyLDQ4IEBACiAJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdlZl9waWM+OwogCQkJCQlpbnRlcnJ1cHRzID0gPDB4OSAweDQ+OwogCQkJCQlyZWcgPSA8MT47CisJCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQkJfTsKIAkJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdlZl9waWM+OwogCQkJCQlpbnRlcnJ1cHRzID0gPDB4OCAweDQ+OwogCQkJCQlyZWcgPSA8Mz47CisJCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJfTsKKwkJCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCQkJcmVnID0gPDB4MTE+OworCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKIAkJCQl9OwogCQkJfTsKIAkJfTsKIAogCQllbmV0MTogZXRoZXJuZXRAMjYwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKKwkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwweDI2MDAwIDB4MTAwMD47CisJCQlyYW5nZXMgPSA8MHgwIDB4MjYwMDAgMHgxMDAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwweDFmIDB4MiAweDIwIDB4MiAweDIxIDB4Mj47CisJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMzIgMiAzMyAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJdGJpLWhhbmRsZSA9IDwmdGJpMj47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkyPjsKIAkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAiZ21paSI7CisKKwkJCW1kaW9ANTIwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7CisJCQkJcmVnID0gPDB4NTIwIDB4MjA+OworCisJCQkJdGJpMjogdGJpLXBoeUAxMSB7CisJCQkJCXJlZyA9IDwweDExPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCQkJfTsKKwkJCX07CiAJCX07CiAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmMzMTAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmMzMTAuZHRzCmluZGV4IGZjM2EzMzEuLjQyOWU4N2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjMzEwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzMxMC5kdHMKQEAgLTI2NywxNCArMjY3LDE2IEBACiAJCWVuZXQwOiBldGhlcm5ldEAyNDAwMCB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwPjsKIAkJCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDB4MWQgMHgyIDB4MWUgMHgyIDB4MjIgMHgyPjsKKwkJCWludGVycnVwdHMgPSA8MjkgMiAzMCAgMiAzNCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJdGJpLWhhbmRsZSA9IDwmdGJpMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAiZ21paSI7CiAKQEAgLTI4OCwyNSArMjkwLDQ4IEBACiAJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdlZl9waWM+OwogCQkJCQlpbnRlcnJ1cHRzID0gPDB4OSAweDQ+OwogCQkJCQlyZWcgPSA8MT47CisJCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQkJfTsKIAkJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdlZl9waWM+OwogCQkJCQlpbnRlcnJ1cHRzID0gPDB4OCAweDQ+OwogCQkJCQlyZWcgPSA8Mz47CisJCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJfTsKKwkJCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCQkJcmVnID0gPDB4MTE+OworCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKIAkJCQl9OwogCQkJfTsKIAkJfTsKIAogCQllbmV0MTogZXRoZXJuZXRAMjYwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKKwkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwweDI2MDAwIDB4MTAwMD47CisJCQlyYW5nZXMgPSA8MHgwIDB4MjYwMDAgMHgxMDAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwweDFmIDB4MiAweDIwIDB4MiAweDIxIDB4Mj47CisJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMzIgMiAzMyAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJdGJpLWhhbmRsZSA9IDwmdGJpMj47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkyPjsKIAkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAiZ21paSI7CisKKwkJCW1kaW9ANTIwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7CisJCQkJcmVnID0gPDB4NTIwIDB4MjA+OworCisJCQkJdGJpMjogdGJpLXBoeUAxMSB7CisJCQkJCXJlZyA9IDwweDExPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCQkJfTsKKwkJCX07CiAJCX07CiAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmM2MTAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmM2MTAuZHRzCmluZGV4IGMwNjcxY2MuLmQ4MTIwMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjNjEwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzYxMC5kdHMKQEAgLTI2NywxNCArMjY3LDE2IEBACiAJCWVuZXQwOiBldGhlcm5ldEAyNDAwMCB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwPjsKIAkJCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDB4MWQgMHgyIDB4MWUgMHgyIDB4MjIgMHgyPjsKKwkJCWludGVycnVwdHMgPSA8MjkgMiAzMCAgMiAzNCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJdGJpLWhhbmRsZSA9IDwmdGJpMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAiZ21paSI7CiAKQEAgLTI4OCwyNSArMjkwLDQ4IEBACiAJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdlZl9waWM+OwogCQkJCQlpbnRlcnJ1cHRzID0gPDB4OSAweDQ+OwogCQkJCQlyZWcgPSA8MT47CisJCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQkJfTsKIAkJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdlZl9waWM+OwogCQkJCQlpbnRlcnJ1cHRzID0gPDB4OCAweDQ+OwogCQkJCQlyZWcgPSA8Mz47CisJCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJfTsKKwkJCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCQkJcmVnID0gPDB4MTE+OworCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKIAkJCQl9OwogCQkJfTsKIAkJfTsKIAogCQllbmV0MTogZXRoZXJuZXRAMjYwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKKwkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwweDI2MDAwIDB4MTAwMD47CisJCQlyYW5nZXMgPSA8MHgwIDB4MjYwMDAgMHgxMDAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwweDFmIDB4MiAweDIwIDB4MiAweDIxIDB4Mj47CisJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMzIgMiAzMyAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJdGJpLWhhbmRsZSA9IDwmdGJpMj47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkyPjsKIAkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAiZ21paSI7CisKKwkJCW1kaW9ANTIwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7CisJCQkJcmVnID0gPDB4NTIwIDB4MjA+OworCisJCQkJdGJpMjogdGJpLXBoeUAxMSB7CisJCQkJCXJlZyA9IDwweDExPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCQkJfTsKKwkJCX07CiAJCX07CiAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hjdTQuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hjdTQuZHRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTg4NTk4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9oY3U0LmR0cworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotKiBEZXZpY2UgVHJlZSBTb3VyY2UgZm9yIE5ldHN0YWwgTWFzY2hpbmVuIEhDVTQKLSogYmFzZWQgb24gdGhlIElCTSBXYWxudXQKLSoKLSogQ29weXJpZ2h0IDIwMDgKLSogTmlrbGF1cyBHaWdlciA8bmlrbGF1cy5naWdlckBtZW1iZXIuZnNmLm9yZz4KLSoKLSogQ29weXJpZ2h0IDIwMDcgSUJNIENvcnAuCi0qIEpvc2ggQm95ZXIgPGp3Ym95ZXJAbGludXgudm5ldC5pYm0uY29tPgotKgotKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0Ci0qIGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qLwotCi0vZHRzLXYxLzsKLQotLyB7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MHgxPjsKLQkjc2l6ZS1jZWxscyA9IDwweDE+OwotCW1vZGVsID0gIm5ldHN0YWwsaGN1NCI7Ci0JY29tcGF0aWJsZSA9ICJuZXRzdGFsLGhjdTQiOwotCWRjci1wYXJlbnQgPSA8MHgxPjsKLQotCWFsaWFzZXMgewotCQlldGhlcm5ldDAgPSAiL3BsYi9vcGIvZXRoZXJuZXRAZWY2MDA4MDAiOwotCQlzZXJpYWwwID0gIi9wbGIvb3BiL3NlcmlhbEBlZjYwMDMwMCI7Ci0JfTsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwweDE+OwotCQkjc2l6ZS1jZWxscyA9IDwweDA+OwotCi0JCWNwdUAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQltb2RlbCA9ICJQb3dlclBDLDQwNUdQciI7Ci0JCQlyZWcgPSA8MHgwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwweDA+OwkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwweDIwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDB4MjA+OwotCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47Ci0JCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsKLQkJCWRjci1jb250cm9sbGVyOwotCQkJZGNyLWFjY2Vzcy1tZXRob2QgPSAibmF0aXZlIjsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8MHgxPjsKLQkJfTsKLQl9OwotCi0JbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJcmVnID0gPDB4MCAweDA+OwkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JfTsKLQotCVVJQzA6IGludGVycnVwdC1jb250cm9sbGVyIHsKLQkJY29tcGF0aWJsZSA9ICJpYm0sdWljIjsKLQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCWNlbGwtaW5kZXggPSA8MHgwPjsKLQkJZGNyLXJlZyA9IDwweGMwIDB4OT47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDB4MD47Ci0JCSNzaXplLWNlbGxzID0gPDB4MD47Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MHgyPjsKLQkJbGludXgscGhhbmRsZSA9IDwweDI+OwotCX07Ci0KLQlwbGIgewotCQljb21wYXRpYmxlID0gImlibSxwbGIzIjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MHgxPjsKLQkJI3NpemUtY2VsbHMgPSA8MHgxPjsKLQkJcmFuZ2VzOwotCQljbG9jay1mcmVxdWVuY3kgPSA8MHgwPjsJLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwotCi0JCVNEUkFNMDogbWVtb3J5LWNvbnRyb2xsZXIgewotCQkJY29tcGF0aWJsZSA9ICJpYm0sc2RyYW0tNDA1Z3AiOwotCQkJZGNyLXJlZyA9IDwweDEwIDB4Mj47Ci0JCX07Ci0KLQkJTUFMOiBtY21hbCB7Ci0JCQljb21wYXRpYmxlID0gImlibSxtY21hbC00MDVncCIsICJpYm0sbWNtYWwiOwotCQkJZGNyLXJlZyA9IDwweDE4MCAweDYyPjsKLQkJCW51bS10eC1jaGFucyA9IDwweDE+OwotCQkJbnVtLXJ4LWNoYW5zID0gPDB4MT47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDB4Mj47Ci0JCQlpbnRlcnJ1cHRzID0gPDB4YiAweDQgMHhjIDB4NCAweGEgMHg0IDB4ZCAweDQgMHhlIDB4ND47Ci0JCQlsaW51eCxwaGFuZGxlID0gPDB4Mz47Ci0JCX07Ci0KLQkJUE9CMDogb3BiIHsKLQkJCWNvbXBhdGlibGUgPSAiaWJtLG9wYi00MDVncCIsICJpYm0sb3BiIjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDB4MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwweDE+OwotCQkJcmFuZ2VzID0gPDB4ZWY2MDAwMDAgMHhlZjYwMDAwMCAweGEwMDAwMD47Ci0JCQlkY3ItcmVnID0gPDB4YTAgMHg1PjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDA+OwkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0KLQkJCVVBUlQwOiBzZXJpYWxAZWY2MDAzMDAgewotCQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCQlyZWcgPSA8MHhlZjYwMDMwMCAweDg+OwotCQkJCXZpcnR1YWwtcmVnID0gPDB4ZWY2MDAzMDA+OwotCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDA+Oy8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQkJCQljdXJyZW50LXNwZWVkID0gPDA+OwkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwweDI+OwotCQkJCWludGVycnVwdHMgPSA8MHgwIDB4ND47Ci0JCQl9OwotCi0JCQlJSUM6IGkyY0BlZjYwMDUwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJpYm0saWljLTQwNWdwIiwgImlibSxpaWMiOwotCQkJCXJlZyA9IDwweGVmNjAwNTAwIDB4MTE+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8MHgyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDB4MiAweDQ+OwotCQkJfTsKLQotCQkJR1BJTzogZ3Bpb0BlZjYwMDcwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJpYm0sZ3Bpby00MDVncCI7Ci0JCQkJcmVnID0gPDB4ZWY2MDA3MDAgMHgyMD47Ci0JCQl9OwotCi0JCQlFTUFDOiBldGhlcm5ldEBlZjYwMDgwMCB7Ci0JCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQkJY29tcGF0aWJsZSA9ICJpYm0sZW1hYy00MDVncCIsICJpYm0sZW1hYyI7Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwweDI+OwotCQkJCWludGVycnVwdHMgPSA8MHhmIDB4NCAweDkgMHg0PjsKLQkJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFswMCAwMCAwMCAwMCAwMCAwMF07Ci0JCQkJcmVnID0gPDB4ZWY2MDA4MDAgMHg3MD47Ci0JCQkJbWFsLWRldmljZSA9IDwweDM+OwotCQkJCW1hbC10eC1jaGFubmVsID0gPDB4MD47Ci0JCQkJbWFsLXJ4LWNoYW5uZWwgPSA8MHgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDB4MD47Ci0JCQkJbWF4LWZyYW1lLXNpemUgPSA8MHg1ZGM+OwotCQkJCXJ4LWZpZm8tc2l6ZSA9IDwweDEwMDA+OwotCQkJCXR4LWZpZm8tc2l6ZSA9IDwweDgwMD47Ci0JCQkJcGh5LW1vZGUgPSAicm1paSI7Ci0JCQkJcGh5LW1hcCA9IDwweDE+OwotCQkJfTsKLQkJfTsKLQotCQlFQkMwOiBlYmMgewotCQkJY29tcGF0aWJsZSA9ICJpYm0sZWJjLTQwNWdwIiwgImlibSxlYmMiOwotCQkJZGNyLXJlZyA9IDwweDEyIDB4Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwweDI+OwotCQkJI3NpemUtY2VsbHMgPSA8MHgxPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDA+OwkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0KLQkJCXNyYW1AMCwwIHsKLQkJCQlyZWcgPSA8MHgwIDB4MCAweDgwMDAwPjsKLQkJCX07Ci0KLQkJCWZsYXNoQDAsODAwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiamVkZWMtZmxhc2giOwotCQkJCWJhbmstd2lkdGggPSA8MHgxPjsKLQkJCQlyZWcgPSA8MHgwIDB4ODAwMDAgMHg4MDAwMD47Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MHgxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwweDE+OwotCi0JCQkJcGFydGl0aW9uQDAgewotCQkJCQlsYWJlbCA9ICJPcGVuQklPUyI7Ci0JCQkJCXJlZyA9IDwweDAgMHg4MDAwMD47Ci0JCQkJCXJlYWQtb25seTsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQl9OwotCi0JY2hvc2VuIHsKLQkJbGludXgsc3Rkb3V0LXBhdGggPSAiL3BsYi9vcGIvc2VyaWFsQGVmNjAwMzAwIjsKLQl9OwotfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rc2k4NTYwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rc2k4NTYwLmR0cwppbmRleCBiZGI3ZmMwLi4yOTZjNTcyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3NpODU2MC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2tzaTg1NjAuZHRzCkBAIC0zMDYsNyArMzA2LDcgQEAKIAlsb2NhbGJ1c0BmZGYwNTAwMCB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2MC1sb2NhbGJ1cyI7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjAtbG9jYWxidXMiLCAic2ltcGxlLWJ1cyI7CiAJCXJlZyA9IDwweGZkZjA1MDAwIDB4Njg+OwogCiAJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZTAwMDAwMDAgMHgwMDgwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21nY29nZS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWdjb2dlLmR0cwppbmRleCAxMzYwZDJmLi5lZGVkYWY1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWdjb2dlLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWdjb2dlLmR0cwpAQCAtMjEzLDYgKzIxMywxNSBAQAogCQkJCWxpbnV4LG5ldHdvcmstaW5kZXggPSA8Mj47CiAJCQkJZnNsLGNwbS1jb21tYW5kID0gPDB4MTYyMDAzMDA+OwogCQkJfTsKKworCQkJdXNiQDExYjYwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MjcyLWNwbS11c2IiOworCQkJCW1vZGUgPSAicGVyaXBoZXJhbCI7CisJCQkJcmVnID0gPDB4MTFiNjAgMHg0MCAweDhiMDAgMHgxMDA+OworCQkJCWludGVycnVwdHMgPSA8MTEgOD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmUElDPjsKKwkJCQl1c2ItY2xvY2sgPSA8NT47CisJCQl9OwogCQl9OwogCiAJCWNwbTJfcGlvX2M6IGdwaW8tY29udHJvbGxlckAxMGQ0MCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTIwMGIuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MjAwYi5kdHNpCmluZGV4IGJjMjc1NDguLjdhYjI4NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MjAwYi5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MjAwYi5kdHNpCkBAIC0xNDcsNiArMTQ3LDggQEAKIAkJfTsKIAogCQlzcGlAZjAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwogCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwogCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKaW5kZXggYjUzZDFkZi4uNTA1ZGM4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKQEAgLTM5MCw3ICszOTAsOCBAQAogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDllLWxvY2FsYnVzIiwKLQkJCSAgICAgImZzbCxwcTJwcm8tbG9jYWxidXMiOworCQkJICAgICAiZnNsLHBxMnByby1sb2NhbGJ1cyIsCisJCQkgICAgICJzaW1wbGUtYnVzIjsKIAkJcmVnID0gPDB4ZTAwMDUwMDAgMHhkOD47CiAJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZmUwMDAwMDAgMHgxMDAwMDAwCS8qIGZsYXNoICovCiAJCQkgIDB4MSAweDAgMHhmODAwMDAwMCAweDIwMDAwCS8qIFZTQyA3Mzg1ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjJkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjJkcy5kdHMKaW5kZXggMWJlOTc0My4uYjliODcxOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIyZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJCX07CiAKIAkJYm9hcmQtY29udHJvbEAzLDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjJkcy1waXhpcyI7CisJCQljb21wYXRpYmxlID0gImZzbCxwMTAyMmRzLWZwZ2EiLCAiZnNsLGZwZ2EtbmdwaXhpcyI7CiAJCQlyZWcgPSA8MyAwIDB4MzA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwZHMuZHRzCmluZGV4IGRhZTQwMzEuLjY2ZjAzZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMGRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjBkcy5kdHMKQEAgLTExOCw2ICsxMTgsMTEgQEAKIAkJCX07CiAJCX07CiAKKwkJYm9hcmQtY29udHJvbEAzLDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwMjBkcy1mcGdhIiwgImZzbCxmcGdhLW5ncGl4aXMiOworCQkJcmVnID0gPDB4MyAweDAgMHgzMD47CisJCX07CisKIAkJbmFuZEA0LDAgewogCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxiYy1mY20tbmFuZCI7CiAJCQlyZWcgPSA8MHg0IDB4MCAweDQwMDAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MHJkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDByZGIuZHRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg0ZTM5Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MHJkYi5kdHMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIFAyMDQwUkRCIERldmljZSBUcmVlIFNvdXJjZQotICoKLSAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICoKLSAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICogbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vaW5jbHVkZS8gInAyMDQwc2kuZHRzaSIKLQotLyB7Ci0JbW9kZWwgPSAiZnNsLFAyMDQwUkRCIjsKLQljb21wYXRpYmxlID0gImZzbCxQMjA0MFJEQiI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JI3NpemUtY2VsbHMgPSA8Mj47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0KLQltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCX07Ci0KLQlzb2M6IHNvY0BmZmUwMDAwMDAgewotCQlzcGlAMTEwMDAwIHsKLQkJCWZsYXNoQDAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCWNvbXBhdGlibGUgPSAic3BhbnNpb24sczI1c2wxMjgwMSI7Ci0JCQkJcmVnID0gPDA+OwotCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsgLyogaW5wdXQgY2xvY2sgKi8KLQkJCQlwYXJ0aXRpb25AdS1ib290IHsKLQkJCQkJbGFiZWwgPSAidS1ib290IjsKLQkJCQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwMDEwMDAwMD47Ci0JCQkJCXJlYWQtb25seTsKLQkJCQl9OwotCQkJCXBhcnRpdGlvbkBrZXJuZWwgewotCQkJCQlsYWJlbCA9ICJrZXJuZWwiOwotCQkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwNTAwMDAwPjsKLQkJCQkJcmVhZC1vbmx5OwotCQkJCX07Ci0JCQkJcGFydGl0aW9uQGR0YiB7Ci0JCQkJCWxhYmVsID0gImR0YiI7Ci0JCQkJCXJlZyA9IDwweDAwNjAwMDAwIDB4MDAxMDAwMDA+OwotCQkJCQlyZWFkLW9ubHk7Ci0JCQkJfTsKLQkJCQlwYXJ0aXRpb25AZnMgewotCQkJCQlsYWJlbCA9ICJmaWxlIHN5c3RlbSI7Ci0JCQkJCXJlZyA9IDwweDAwNzAwMDAwIDB4MDA5MDAwMDA+OwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCWkyY0AxMTgwMDAgewotCQkJbG03NWJANDggewotCQkJCWNvbXBhdGlibGUgPSAibnhwLGxtNzVhIjsKLQkJCQlyZWcgPSA8MHg0OD47Ci0JCQl9OwotCQkJZWVwcm9tQDUwIHsKLQkJCQljb21wYXRpYmxlID0gImF0MjQsMjRjMjU2IjsKLQkJCQlyZWcgPSA8MHg1MD47Ci0JCQl9OwotCQkJcnRjQDY4IHsKLQkJCQljb21wYXRpYmxlID0gInBlcmljb20scHQ3YzQzMzgiOwotCQkJCXJlZyA9IDwweDY4PjsKLQkJCX07Ci0JCX07Ci0KLQkJaTJjQDExODEwMCB7Ci0JCQllZXByb21ANTAgewotCQkJCWNvbXBhdGlibGUgPSAiYXQyNCwyNGMyNTYiOwotCQkJCXJlZyA9IDwweDUwPjsKLQkJCX07Ci0JCX07Ci0KLQkJdXNiMDogdXNiQDIxMDAwMCB7Ci0JCQlwaHlfdHlwZSA9ICJ1dG1pIjsKLQkJfTsKLQotCQl1c2IxOiB1c2JAMjExMDAwIHsKLQkJCWRyX21vZGUgPSAiaG9zdCI7Ci0JCQlwaHlfdHlwZSA9ICJ1dG1pIjsKLQkJfTsKLQl9OwotCi0JbG9jYWxidXNAZmZlMTI0MDAwIHsKLQkJcmVnID0gPDB4ZiAweGZlMTI0MDAwIDAgMHgxMDAwPjsKLQkJcmFuZ2VzID0gPDAgMCAweGYgMHhlODAwMDAwMCAweDA4MDAwMDAwPjsKLQotCQlmbGFzaEAwLDAgewotCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOwotCQkJcmVnID0gPDAgMCAweDA4MDAwMDAwPjsKLQkJCWJhbmstd2lkdGggPSA8Mj47Ci0JCQlkZXZpY2Utd2lkdGggPSA8Mj47Ci0JCX07Ci0JfTsKLQotCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKLQkJcmVnID0gPDB4ZiAweGZlMjAwMDAwIDAgMHgxMDAwPjsKLQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDB4MCAweDIwMDAwMDAwCi0JCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDAwMDAwIDB4MCAweDAwMDEwMDAwPjsKLQkJcGNpZUAwIHsKLQkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAotCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKLQkJCQkgIDAgMHgyMDAwMDAwMAotCi0JCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAotCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKLQkJCQkgIDAgMHgwMDAxMDAwMD47Ci0JCX07Ci0JfTsKLQotCXBjaTE6IHBjaWVAZmZlMjAxMDAwIHsKLQkJcmVnID0gPDB4ZiAweGZlMjAxMDAwIDAgMHgxMDAwPjsKLQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAgMHhjIDB4MjAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKLQkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmODAxMDAwMCAweDAgMHgwMDAxMDAwMD47Ci0JCXBjaWVAMCB7Ci0JCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKLQkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCi0JCQkJICAwIDB4MjAwMDAwMDAKLQotCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKLQkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCi0JCQkJICAwIDB4MDAwMTAwMDA+OwotCQl9OwotCX07Ci0KLQlwY2kyOiBwY2llQGZmZTIwMjAwMCB7Ci0JCXJlZyA9IDwweGYgMHhmZTIwMjAwMCAwIDB4MTAwMD47Ci0JCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHg0MDAwMDAwMCAwIDB4MjAwMDAwMDAKLQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMjAwMDAgMCAweDAwMDEwMDAwPjsKLQkJcGNpZUAwIHsKLQkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAotCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKLQkJCQkgIDAgMHgyMDAwMDAwMAotCi0JCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAotCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKLQkJCQkgIDAgMHgwMDAxMDAwMD47Ci0JCX07Ci0JfTsKLX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDBzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQwc2kuZHRzaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkYmIyNC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDBzaS5kdHNpCisrKyAvZGV2L251bGwKQEAgLTEsNjIzICswLDAgQEAKLS8qCi0gKiBQMjA0MCBTaWxpY29uIERldmljZSBUcmVlIFNvdXJjZQotICoKLSAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICoKLSAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICogbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vZHRzLXYxLzsKLQotLyB7Ci0JY29tcGF0aWJsZSA9ICJmc2wsUDIwNDAiOwotCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCSNzaXplLWNlbGxzID0gPDI+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCi0JYWxpYXNlcyB7Ci0JCWNjc3IgPSAmc29jOwotCi0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlzZXJpYWwyID0gJnNlcmlhbDI7Ci0JCXNlcmlhbDMgPSAmc2VyaWFsMzsKLQkJcGNpMCA9ICZwY2kwOwotCQlwY2kxID0gJnBjaTE7Ci0JCXBjaTIgPSAmcGNpMjsKLQkJdXNiMCA9ICZ1c2IwOwotCQl1c2IxID0gJnVzYjE7Ci0JCWRtYTAgPSAmZG1hMDsKLQkJZG1hMSA9ICZkbWExOwotCQlzZGhjID0gJnNkaGM7Ci0JCW1zaTAgPSAmbXNpMDsKLQkJbXNpMSA9ICZtc2kxOwotCQltc2kyID0gJm1zaTI7Ci0KLQkJY3J5cHRvID0gJmNyeXB0bzsKLQkJc2VjX2pyMCA9ICZzZWNfanIwOwotCQlzZWNfanIxID0gJnNlY19qcjE7Ci0JCXNlY19qcjIgPSAmc2VjX2pyMjsKLQkJc2VjX2pyMyA9ICZzZWNfanIzOwotCQlydGljX2EgPSAmcnRpY19hOwotCQlydGljX2IgPSAmcnRpY19iOwotCQlydGljX2MgPSAmcnRpY19jOwotCQlydGljX2QgPSAmcnRpY19kOwotCQlzZWNfbW9uID0gJnNlY19tb247Ci0JfTsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJY3B1MDogUG93ZXJQQyxlNTAwbWNAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47Ci0JCQlMMl8wOiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JCWNwdTE6IFBvd2VyUEMsZTUwMG1jQDEgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwxPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OwotCQkJTDJfMTogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCQljcHUyOiBQb3dlclBDLGU1MDBtY0AyIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8Mj47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKLQkJCUwyXzI6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQkJY3B1MzogUG93ZXJQQyxlNTAwbWNAMyB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDM+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47Ci0JCQlMMl8zOiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JfTsKLQotCXNvYzogc29jQGZmZTAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKLQkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4ZmUwMDAwMDAgMHgxMDAwMDAwPjsKLQkJcmVnID0gPDB4ZiAweGZlMDAwMDAwIDAgMHgwMDAwMTAwMD47Ci0KLQkJc29jLXNyYW0tZXJyb3IgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsc29jLXNyYW0tZXJyb3IiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjk+OwotCQl9OwotCi0JCWNvcmVuZXQtbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1sYXciOwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQkJZnNsLG51bS1sYXdzID0gPDMyPjsKLQkJfTsKLQotCQltZW1vcnktY29udHJvbGxlckA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjUiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKLQkJfTsKLQotCQljcGM6IGwzLWNhY2hlLWNvbnRyb2xsZXJAMTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtbDMtY2FjaGUtY29udHJvbGxlciIsICJmc2wscDQwODAtbDMtY2FjaGUtY29udHJvbGxlciIsICJjYWNoZSI7Ci0JCQlyZWcgPSA8MHgxMDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjc+OwotCQl9OwotCi0JCWNvcmVuZXQtY2ZAMTgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1jZiI7Ci0JCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMzE+OwotCQkJZnNsLGNjZi1udW0tY3NkaWRzID0gPDMyPjsKLQkJCWZzbCxjY2YtbnVtLXNub29waWRzID0gPDMyPjsKLQkJfTsKLQotCQlpb21tdUAyMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwYW11LXYxLjAiLCAiZnNsLHBhbXUiOwotCQkJcmVnID0gPDB4MjAwMDAgMHg0MDAwPjsKLQkJCWludGVycnVwdHMgPSA8Ci0JCQkJMjQgMiAwIDAKLQkJCQkxNiAyIDEgMzA+OwotCQl9OwotCi0JCW1waWM6IHBpY0A0MDAwMCB7Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDw0PjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYyIsICJjaHJwLG9wZW4tcGljIjsKLQkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKLQkJfTsKLQotCQltc2kwOiBtc2lANDE2MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOwotCQkJcmVnID0gPDB4NDE2MDAgMHgyMDA+OwotCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTB4ZTAgMCAwIDAKLQkJCQkweGUxIDAgMCAwCi0JCQkJMHhlMiAwIDAgMAotCQkJCTB4ZTMgMCAwIDAKLQkJCQkweGU0IDAgMCAwCi0JCQkJMHhlNSAwIDAgMAotCQkJCTB4ZTYgMCAwIDAKLQkJCQkweGU3IDAgMCAwPjsKLQkJfTsKLQotCQltc2kxOiBtc2lANDE4MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOwotCQkJcmVnID0gPDB4NDE4MDAgMHgyMDA+OwotCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTB4ZTggMCAwIDAKLQkJCQkweGU5IDAgMCAwCi0JCQkJMHhlYSAwIDAgMAotCQkJCTB4ZWIgMCAwIDAKLQkJCQkweGVjIDAgMCAwCi0JCQkJMHhlZCAwIDAgMAotCQkJCTB4ZWUgMCAwIDAKLQkJCQkweGVmIDAgMCAwPjsKLQkJfTsKLQotCQltc2kyOiBtc2lANDFhMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOwotCQkJcmVnID0gPDB4NDFhMDAgMHgyMDA+OwotCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTB4ZjAgMCAwIDAKLQkJCQkweGYxIDAgMCAwCi0JCQkJMHhmMiAwIDAgMAotCQkJCTB4ZjMgMCAwIDAKLQkJCQkweGY0IDAgMCAwCi0JCQkJMHhmNSAwIDAgMAotCQkJCTB4ZjYgMCAwIDAKLQkJCQkweGY3IDAgMCAwPjsKLQkJfTsKLQotCQlndXRzOiBnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWRldmljZS1jb25maWctMS4wIjsKLQkJCXJlZyA9IDwweGUwMDAwIDB4ZTAwPjsKLQkJCWZzbCxoYXMtcnN0Y3I7Ci0JCQkjc2xlZXAtY2VsbHMgPSA8MT47Ci0JCQlmc2wsbGlvZG4tYml0cyA9IDwxMj47Ci0JCX07Ci0KLQkJcGluczogZ2xvYmFsLXV0aWxpdGllc0BlMGUwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1waW4tY29udHJvbC0xLjAiOwotCQkJcmVnID0gPDB4ZTBlMDAgMHgyMDA+OwotCQkJI3NsZWVwLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOwotCQkJcmVnID0gPDB4ZTEwMDAgMHgxMDAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJfTsKLQotCQlyY3BtOiBnbG9iYWwtdXRpbGl0aWVzQGUyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXJjcG0tMS4wIjsKLQkJCXJlZyA9IDwweGUyMDAwIDB4MTAwMD47Ci0JCQkjc2xlZXAtY2VsbHMgPSA8MT47Ci0JCX07Ci0KLQkJc2ZwOiBzZnBAZTgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtc2ZwIiwgImZzbCxxb3JpcS1zZnAtMS4wIjsKLQkJCXJlZwkgICA9IDwweGU4MDAwIDB4MTAwMD47Ci0JCX07Ci0KLQkJc2VyZGVzOiBzZXJkZXNAZWEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtc2VyZGVzIjsKLQkJCXJlZwkgICA9IDwweGVhMDAwIDB4MTAwMD47Ci0JCX07Ci0KLQkJZG1hMDogZG1hQDEwMDMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHgxMDAzMDAgMHg0PjsKLQkJCXJhbmdlcyA9IDwweDAgMHgxMDAxMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJCWludGVycnVwdHMgPSA8MjggMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0cyA9IDwyOSAyIDAgMD47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDI+OwotCQkJCWludGVycnVwdHMgPSA8MzAgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMCAwPjsKLQkJCX07Ci0JCX07Ci0KLQkJZG1hMTogZG1hQDEwMTMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHgxMDEzMDAgMHg0PjsKLQkJCXJhbmdlcyA9IDwweDAgMHgxMDExMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJCWludGVycnVwdHMgPSA8MzIgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMyAyIDAgMD47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDI+OwotCQkJCWludGVycnVwdHMgPSA8MzQgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDIgMCAwPjsKLQkJCX07Ci0JCX07Ci0KLQkJc3BpQDExMDAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZXNwaSIsICJmc2wsbXBjODUzNi1lc3BpIjsKLQkJCXJlZyA9IDwweDExMDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw1MyAweDIgMCAwPjsKLQkJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKLQotCQl9OwotCi0JCXNkaGM6IHNkaGNAMTE0MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWVzZGhjIiwgImZzbCxlc2RoYyI7Ci0JCQlyZWcgPSA8MHgxMTQwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NDggMiAwIDA+OwotCQkJc2RoY2ksYXV0by1jbWQxMjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJfTsKLQotCi0JCWkyY0AxMTgwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE4MDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJaTJjQDExODEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTgxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMTE5MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExOTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWkyY0AxMTkxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE5MTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJc2VyaWFsMDogc2VyaWFsQDExYzUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWM1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMTogc2VyaWFsQDExYzYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWM2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMjogc2VyaWFsQDExZDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWQ1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMzogc2VyaWFsQDExZDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWQ2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47Ci0JCX07Ci0KLQkJZ3BpbzA6IGdwaW9AMTMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWdwaW8iLCAiZnNsLHFvcmlxLWdwaW8iOwotCQkJcmVnID0gPDB4MTMwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDU1IDIgMCAwPjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQl9OwotCi0JCXVzYjA6IHVzYkAyMTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtdXNiMi1tcGgiLAotCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1tcGgiLCAiZnNsLXVzYjItbXBoIjsKLQkJCXJlZyA9IDwweDIxMDAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDQgMHgyIDAgMD47Ci0JCQlwb3J0MDsKLQkJfTsKLQotCQl1c2IxOiB1c2JAMjExMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLXVzYjItZHIiLAotCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1kciIsICJmc2wtdXNiMi1kciI7Ci0JCQlyZWcgPSA8MHgyMTEwMDAgMHgxMDAwPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ1IDB4MiAwIDA+OwotCQl9OwotCi0JCXNhdGFAMjIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLXNhdGEiLCAiZnNsLHBxLXNhdGEtdjIiOwotCQkJcmVnID0gPDB4MjIwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDY4IDB4MiAwIDA+OwotCQl9OwotCi0JCXNhdGFAMjIxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLXNhdGEiLCAiZnNsLHBxLXNhdGEtdjIiOwotCQkJcmVnID0gPDB4MjIxMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDY5IDB4MiAwIDA+OwotCQl9OwotCi0JCWNyeXB0bzogY3J5cHRvQDMwMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMiIsICJmc2wsc2VjLXY0LjAiOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCXJlZyA9IDwweDMwMDAwMCAweDEwMDAwPjsKLQkJCXJhbmdlcyA9IDwwIDB4MzAwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw5MiAyIDAgMD47Ci0KLQkJCXNlY19qcjA6IGpyQDEwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKLQkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDw4OCAyIDAgMD47Ci0JCQl9OwotCi0JCQlzZWNfanIxOiBqckAyMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8ODkgMiAwIDA+OwotCQkJfTsKLQotCQkJc2VjX2pyMjoganJAMzAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAotCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOwotCQkJCXJlZyA9IDwweDMwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDkwIDIgMCAwPjsKLQkJCX07Ci0KLQkJCXNlY19qcjM6IGpyQDQwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKLQkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDw5MSAyIDAgMD47Ci0JCQl9OwotCi0JCQlydGljQDYwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMiLAotCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYyI7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4NjAwMCAweDEwMD47Ci0JCQkJcmFuZ2VzID0gPDB4MCAweDYxMDAgMHhlMDA+OwotCi0JCQkJcnRpY19hOiBydGljLWFAMCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKLQkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDAwIDB4MjAgMHgxMDAgMHg4MD47Ci0JCQkJfTsKLQotCQkJCXJ0aWNfYjogcnRpYy1iQDIwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAotCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4MjAgMHgyMCAweDIwMCAweDgwPjsKLQkJCQl9OwotCi0JCQkJcnRpY19jOiBydGljLWNANDAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCi0JCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHg0MCAweDIwIDB4MzAwIDB4ODA+OwotCQkJCX07Ci0KLQkJCQlydGljX2Q6IHJ0aWMtZEA2MCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKLQkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDYwIDB4MjAgMHg1MDAgMHg4MD47Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJc2VjX21vbjogc2VjX21vbkAzMTQwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItbW9uIiwgImZzbCxzZWMtdjQuMC1tb24iOwotCQkJcmVnID0gPDB4MzE0MDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDkzIDIgMCAwPjsKLQkJfTsKLQotCX07Ci0KLQlsb2NhbGJ1c0BmZmUxMjQwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOwotCQlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCX07Ci0KLQlwY2kwOiBwY2llQGZmZTIwMDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47Ci0JCWZzbCxtc2kgPSA8Jm1zaTA+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47Ci0JCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MCAwIDAgMCAwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKLQkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwotCQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCQkvKiBJRFNFTCAweDAgKi8KLQkJCQkwMDAwIDAgMCAxICZtcGljIDQwIDEgMCAwCi0JCQkJMDAwMCAwIDAgMiAmbXBpYyAxIDEgMCAwCi0JCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEgMCAwCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEgMCAwCi0JCQkJPjsKLQkJfTsKLQl9OwotCi0JcGNpMTogcGNpZUBmZmUyMDEwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKLQkJZnNsLG1zaSA9IDwmbXNpMT47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAxIDE0PjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgNDEgMSAwIDAKLQkJCQkwMDAwIDAgMCAyICZtcGljIDUgMSAwIDAKLQkJCQkwMDAwIDAgMCAzICZtcGljIDYgMSAwIDAKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDcgMSAwIDAKLQkJCQk+OwotCQl9OwotCX07Ci0KLQlwY2kyOiBwY2llQGZmZTIwMjAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47Ci0JCWZzbCxtc2kgPSA8Jm1zaTI+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMz47Ci0JCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MCAwIDAgMCAwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKLQkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwotCQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCQkvKiBJRFNFTCAweDAgKi8KLQkJCQkwMDAwIDAgMCAxICZtcGljIDQyIDEgMCAwCi0JCQkJMDAwMCAwIDAgMiAmbXBpYyA5IDEgMCAwCi0JCQkJMDAwMCAwIDAgMyAmbXBpYyAxMCAxIDAgMAotCQkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMSAwIDAKLQkJCQk+OwotCQl9OwotCX07Ci19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQxcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MXJkYi5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliNjg5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MXJkYi5kdHMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBQMjA0MVJEQiBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2luY2x1ZGUvICJwMjA0MXNpLmR0c2kiCisKKy8geworCW1vZGVsID0gImZzbCxQMjA0MVJEQiI7CisJY29tcGF0aWJsZSA9ICJmc2wsUDIwNDFSREIiOworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDI+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwl9OworCisJZGNzcjogZGNzckBmMDAwMDAwMDAgeworCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHgwMDAwMDAwMCAweDAxMDA4MDAwPjsKKwl9OworCisJc29jOiBzb2NAZmZlMDAwMDAwIHsKKwkJc3BpQDExMDAwMCB7CisJCQlmbGFzaEAwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQljb21wYXRpYmxlID0gInNwYW5zaW9uLHMyNXNsMTI4MDEiOworCQkJCXJlZyA9IDwwPjsKKwkJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw0MDAwMDAwMD47IC8qIGlucHV0IGNsb2NrICovCisJCQkJcGFydGl0aW9uQHUtYm9vdCB7CisJCQkJCWxhYmVsID0gInUtYm9vdCI7CisJCQkJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAxMDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25Aa2VybmVsIHsKKwkJCQkJbGFiZWwgPSAia2VybmVsIjsKKwkJCQkJcmVnID0gPDB4MDAxMDAwMDAgMHgwMDUwMDAwMD47CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCQkJCXBhcnRpdGlvbkBkdGIgeworCQkJCQlsYWJlbCA9ICJkdGIiOworCQkJCQlyZWcgPSA8MHgwMDYwMDAwMCAweDAwMTAwMDAwPjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisJCQkJcGFydGl0aW9uQGZzIHsKKwkJCQkJbGFiZWwgPSAiZmlsZSBzeXN0ZW0iOworCQkJCQlyZWcgPSA8MHgwMDcwMDAwMCAweDAwOTAwMDAwPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlpMmNAMTE4MDAwIHsKKwkJCWxtNzViQDQ4IHsKKwkJCQljb21wYXRpYmxlID0gIm54cCxsbTc1YSI7CisJCQkJcmVnID0gPDB4NDg+OworCQkJfTsKKwkJCWVlcHJvbUA1MCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzI1NiI7CisJCQkJcmVnID0gPDB4NTA+OworCQkJfTsKKwkJCXJ0Y0A2OCB7CisJCQkJY29tcGF0aWJsZSA9ICJwZXJpY29tLHB0N2M0MzM4IjsKKwkJCQlyZWcgPSA8MHg2OD47CisJCQl9OworCQl9OworCisJCWkyY0AxMTgxMDAgeworCQkJZWVwcm9tQDUwIHsKKwkJCQljb21wYXRpYmxlID0gImF0MjQsMjRjMjU2IjsKKwkJCQlyZWcgPSA8MHg1MD47CisJCQl9OworCQl9OworCisJCXVzYjE6IHVzYkAyMTEwMDAgeworCQkJZHJfbW9kZSA9ICJob3N0IjsKKwkJfTsKKwl9OworCisJbG9jYWxidXNAZmZlMTI0MDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMTI0MDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDAgMCAweGYgMHhlODAwMDAwMCAweDA4MDAwMDAwPjsKKworCQlmbGFzaEAwLDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDAgMCAweDA4MDAwMDAwPjsKKwkJCWJhbmstd2lkdGggPSA8Mj47CisJCQlkZXZpY2Utd2lkdGggPSA8Mj47CisJCX07CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMjAwMDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDAwMDAwIDB4MCAweDAwMDEwMDAwPjsKKwkJcGNpZUAwIHsKKwkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDAgMHgyMDAwMDAwMAorCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDAgMHgwMDAxMDAwMD47CisJCX07CisJfTsKKworCXBjaTE6IHBjaWVAZmZlMjAxMDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMjAxMDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAgMHhjIDB4MjAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmODAxMDAwMCAweDAgMHgwMDAxMDAwMD47CisJCXBjaWVAMCB7CisJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAwIDB4MDAwMTAwMDA+OworCQl9OworCX07CisKKwlwY2kyOiBwY2llQGZmZTIwMjAwMCB7CisJCXJlZyA9IDwweGYgMHhmZTIwMjAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHg0MDAwMDAwMCAwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMjAwMDAgMCAweDAwMDEwMDAwPjsKKwkJcGNpZUAwIHsKKwkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDAgMHgyMDAwMDAwMAorCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDAgMHgwMDAxMDAwMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDFzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQxc2kuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQ5MmVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQxc2kuZHRzaQpAQCAtMCwwICsxLDY5MiBAQAorLyoKKyAqIFAyMDQxIFNpbGljb24gRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy9kdHMtdjEvOworCisvIHsKKwljb21wYXRpYmxlID0gImZzbCxQMjA0MSI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwlhbGlhc2VzIHsKKwkJY2NzciA9ICZzb2M7CisJCWRjc3IgPSAmZGNzcjsKKworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJc2VyaWFsMiA9ICZzZXJpYWwyOworCQlzZXJpYWwzID0gJnNlcmlhbDM7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJCXVzYjAgPSAmdXNiMDsKKwkJdXNiMSA9ICZ1c2IxOworCQlkbWEwID0gJmRtYTA7CisJCWRtYTEgPSAmZG1hMTsKKwkJc2RoYyA9ICZzZGhjOworCQltc2kwID0gJm1zaTA7CisJCW1zaTEgPSAmbXNpMTsKKwkJbXNpMiA9ICZtc2kyOworCisJCWNyeXB0byA9ICZjcnlwdG87CisJCXNlY19qcjAgPSAmc2VjX2pyMDsKKwkJc2VjX2pyMSA9ICZzZWNfanIxOworCQlzZWNfanIyID0gJnNlY19qcjI7CisJCXNlY19qcjMgPSAmc2VjX2pyMzsKKwkJcnRpY19hID0gJnJ0aWNfYTsKKwkJcnRpY19iID0gJnJ0aWNfYjsKKwkJcnRpY19jID0gJnJ0aWNfYzsKKwkJcnRpY19kID0gJnJ0aWNfZDsKKwkJc2VjX21vbiA9ICZzZWNfbW9uOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCWNwdTA6IFBvd2VyUEMsZTUwMG1jQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OworCQkJTDJfMDogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUxOiBQb3dlclBDLGU1MDBtY0AxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKKwkJCUwyXzE6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MjogUG93ZXJQQyxlNTAwbWNAMiB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDI+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CisJCQlMMl8yOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTM6IFBvd2VyUEMsZTUwMG1jQDMgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwzPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OworCQkJTDJfMzogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCX07CisKKwlkY3NyOiBkY3NyQGYwMDAwMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzciIsICJzaW1wbGUtYnVzIjsKKworCQlkY3NyLWVwdUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZXB1IjsKKwkJCWludGVycnVwdHMgPSA8NTIgMiAwIDAKKwkJCQkgICAgICA4NCAyIDAgMAorCQkJCSAgICAgIDg1IDIgMCAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJcmVnID0gPDB4MCAweDEwMDA+OworCQl9OworCQlkY3NyLW5wYyB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW5wYyI7CisJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMCAweDEwMDAwMDAgMHg4MDAwPjsKKwkJfTsKKwkJZGNzci1ueGNAMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW54YyI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY29yZW5ldCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWNvcmVuZXQiOworCQkJcmVnID0gPDB4ODAwMCAweDEwMDAgMHhCMDAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWRwYWFAOTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kY3NyLWRwYWEiLCAiZnNsLGRjc3ItZHBhYSI7CisJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3Itb2NuQDExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRjc3Itb2NuIiwgImZzbCxkY3NyLW9jbiI7CisJCQlyZWcgPSA8MHgxMTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWRkckAxMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCQlkZXYtaGFuZGxlID0gPCZkZHI+OworCQkJcmVnID0gPDB4MTIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1uYWxAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZGNzci1uYWwiLCAiZnNsLGRjc3ItbmFsIjsKKwkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItcmNwbUAyMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kY3NyLXJjcG0iLCAiZnNsLGRjc3ItcmNwbSI7CisJCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1MD47CisJCQlyZWcgPSA8MHg0MDAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1MT47CisJCQlyZWcgPSA8MHg0MTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1Mj47CisJCQlyZWcgPSA8MHg0MjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1Mz47CisJCQlyZWcgPSA8MHg0MzAwMCAweDEwMDA+OworCQl9OworCX07CisKKwlzb2M6IHNvY0BmZmUwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWRldmljZV90eXBlID0gInNvYyI7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweGZlMDAwMDAwIDB4MTAwMDAwMD47CisJCXJlZyA9IDwweGYgMHhmZTAwMDAwMCAwIDB4MDAwMDEwMDA+OworCisJCXNvYy1zcmFtLWVycm9yIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNvYy1zcmFtLWVycm9yIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI5PjsKKwkJfTsKKworCQljb3JlbmV0LWxhd0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtbGF3IjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJCWZzbCxudW0tbGF3cyA9IDwzMj47CisJCX07CisKKwkJZGRyOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjUiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKKwkJfTsKKworCQljcGM6IGwzLWNhY2hlLWNvbnRyb2xsZXJAMTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtbDMtY2FjaGUtY29udHJvbGxlciIsICJmc2wscDQwODAtbDMtY2FjaGUtY29udHJvbGxlciIsICJjYWNoZSI7CisJCQlyZWcgPSA8MHgxMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjc+OworCQl9OworCisJCWNvcmVuZXQtY2ZAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1jZiI7CisJCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMzE+OworCQkJZnNsLGNjZi1udW0tY3NkaWRzID0gPDMyPjsKKwkJCWZzbCxjY2YtbnVtLXNub29waWRzID0gPDMyPjsKKwkJfTsKKworCQlpb21tdUAyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwYW11LXYxLjAiLCAiZnNsLHBhbXUiOworCQkJcmVnID0gPDB4MjAwMDAgMHg0MDAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMjQgMiAwIDAKKwkJCQkxNiAyIDEgMzA+OworCQl9OworCisJCW1waWM6IHBpY0A0MDAwMCB7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDw0PjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYyIsICJjaHJwLG9wZW4tcGljIjsKKwkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKKwkJfTsKKworCQltc2kwOiBtc2lANDE2MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE2MDAgMHgyMDA+OworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZTAgMCAwIDAKKwkJCQkweGUxIDAgMCAwCisJCQkJMHhlMiAwIDAgMAorCQkJCTB4ZTMgMCAwIDAKKwkJCQkweGU0IDAgMCAwCisJCQkJMHhlNSAwIDAgMAorCQkJCTB4ZTYgMCAwIDAKKwkJCQkweGU3IDAgMCAwPjsKKwkJfTsKKworCQltc2kxOiBtc2lANDE4MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE4MDAgMHgyMDA+OworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZTggMCAwIDAKKwkJCQkweGU5IDAgMCAwCisJCQkJMHhlYSAwIDAgMAorCQkJCTB4ZWIgMCAwIDAKKwkJCQkweGVjIDAgMCAwCisJCQkJMHhlZCAwIDAgMAorCQkJCTB4ZWUgMCAwIDAKKwkJCQkweGVmIDAgMCAwPjsKKwkJfTsKKworCQltc2kyOiBtc2lANDFhMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDFhMDAgMHgyMDA+OworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZjAgMCAwIDAKKwkJCQkweGYxIDAgMCAwCisJCQkJMHhmMiAwIDAgMAorCQkJCTB4ZjMgMCAwIDAKKwkJCQkweGY0IDAgMCAwCisJCQkJMHhmNSAwIDAgMAorCQkJCTB4ZjYgMCAwIDAKKwkJCQkweGY3IDAgMCAwPjsKKwkJfTsKKworCQlndXRzOiBnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWRldmljZS1jb25maWctMS4wIjsKKwkJCXJlZyA9IDwweGUwMDAwIDB4ZTAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCQkjc2xlZXAtY2VsbHMgPSA8MT47CisJCQlmc2wsbGlvZG4tYml0cyA9IDwxMj47CisJCX07CisKKwkJcGluczogZ2xvYmFsLXV0aWxpdGllc0BlMGUwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1waW4tY29udHJvbC0xLjAiOworCQkJcmVnID0gPDB4ZTBlMDAgMHgyMDA+OworCQkJI3NsZWVwLWNlbGxzID0gPDI+OworCQl9OworCisJCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOworCQkJcmVnID0gPDB4ZTEwMDAgMHgxMDAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQlyY3BtOiBnbG9iYWwtdXRpbGl0aWVzQGUyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXJjcG0tMS4wIjsKKwkJCXJlZyA9IDwweGUyMDAwIDB4MTAwMD47CisJCQkjc2xlZXAtY2VsbHMgPSA8MT47CisJCX07CisKKwkJc2ZwOiBzZnBAZTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtc2ZwIiwgImZzbCxxb3JpcS1zZnAtMS4wIjsKKwkJCXJlZwkgICA9IDwweGU4MDAwIDB4MTAwMD47CisJCX07CisKKwkJc2VyZGVzOiBzZXJkZXNAZWEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtc2VyZGVzIjsKKwkJCXJlZwkgICA9IDwweGVhMDAwIDB4MTAwMD47CisJCX07CisKKwkJZG1hMDogZG1hQDEwMDMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHgxMDAzMDAgMHg0PjsKKwkJCXJhbmdlcyA9IDwweDAgMHgxMDAxMDAgMHgyMDA+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRtYS1jaGFubmVsQDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdHMgPSA8MjggMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0cyA9IDwyOSAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdHMgPSA8MzAgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDE4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMCAwPjsKKwkJCX07CisJCX07CisKKwkJZG1hMTogZG1hQDEwMTMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHgxMDEzMDAgMHg0PjsKKwkJCXJhbmdlcyA9IDwweDAgMHgxMDExMDAgMHgyMDA+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRtYS1jaGFubmVsQDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdHMgPSA8MzIgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0cyA9IDwzMyAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdHMgPSA8MzQgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDE4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM1IDIgMCAwPjsKKwkJCX07CisJCX07CisKKwkJc3BpQDExMDAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZXNwaSIsICJmc2wsbXBjODUzNi1lc3BpIjsKKwkJCXJlZyA9IDwweDExMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw1MyAweDIgMCAwPjsKKwkJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKKwkJfTsKKworCQlzZGhjOiBzZGhjQDExNDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1lc2RoYyIsICJmc2wsZXNkaGMiOworCQkJcmVnID0gPDB4MTE0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ4IDIgMCAwPjsKKwkJCXNkaGNpLGF1dG8tY21kMTI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCX07CisKKwkJaTJjQDExODAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTgwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlpMmNAMTE4MTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExODEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM4IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AxMTkwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE5MDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJaTJjQDExOTEwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTkxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlzZXJpYWwwOiBzZXJpYWxAMTFjNTAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExYzUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKKwkJfTsKKworCQlzZXJpYWwxOiBzZXJpYWxAMTFjNjAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExYzYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKKwkJfTsKKworCQlzZXJpYWwyOiBzZXJpYWxAMTFkNTAwIHsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExZDUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKKwkJfTsKKworCQlzZXJpYWwzOiBzZXJpYWxAMTFkNjAwIHsKKwkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExZDYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKKwkJfTsKKworCQlncGlvMDogZ3Bpb0AxMzAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZ3BpbyIsICJmc2wscW9yaXEtZ3BpbyI7CisJCQlyZWcgPSA8MHgxMzAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NTUgMiAwIDA+OworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCX07CisKKwkJdXNiMDogdXNiQDIxMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS11c2IyLW1waCIsCisJCQkJCSJmc2wsbXBjODV4eC11c2IyLW1waCIsICJmc2wtdXNiMi1tcGgiOworCQkJcmVnID0gPDB4MjEwMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0NCAweDIgMCAwPjsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQkJcG9ydDA7CisJCX07CisKKwkJdXNiMTogdXNiQDIxMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS11c2IyLWRyIiwKKwkJCQkJImZzbCxtcGM4NXh4LXVzYjItZHIiLCAiZnNsLXVzYjItZHIiOworCQkJcmVnID0gPDB4MjExMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0NSAweDIgMCAwPjsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQl9OworCisJCXNhdGFAMjIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXNhdGEiLCAiZnNsLHBxLXNhdGEtdjIiOworCQkJcmVnID0gPDB4MjIwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDY4IDB4MiAwIDA+OworCQl9OworCisJCXNhdGFAMjIxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXNhdGEiLCAiZnNsLHBxLXNhdGEtdjIiOworCQkJcmVnID0gPDB4MjIxMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDY5IDB4MiAwIDA+OworCQl9OworCisJCWNyeXB0bzogY3J5cHRvQDMwMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMiIsICJmc2wsc2VjLXY0LjAiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDMwMDAwMCAweDEwMDAwPjsKKwkJCXJhbmdlcyA9IDwwIDB4MzAwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0cyA9IDw5MiAyIDAgMD47CisKKwkJCXNlY19qcjA6IGpyQDEwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw4OCAyIDAgMD47CisJCQl9OworCisJCQlzZWNfanIxOiBqckAyMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQkJCWludGVycnVwdHMgPSA8ODkgMiAwIDA+OworCQkJfTsKKworCQkJc2VjX2pyMjoganJAMzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDMwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDkwIDIgMCAwPjsKKwkJCX07CisKKwkJCXNlY19qcjM6IGpyQDQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw5MSAyIDAgMD47CisJCQl9OworCisJCQlydGljQDYwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMiLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYyI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDB4NjAwMCAweDEwMD47CisJCQkJcmFuZ2VzID0gPDB4MCAweDYxMDAgMHhlMDA+OworCisJCQkJcnRpY19hOiBydGljLWFAMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKKwkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDAwIDB4MjAgMHgxMDAgMHg4MD47CisJCQkJfTsKKworCQkJCXJ0aWNfYjogcnRpYy1iQDIwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAorCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4MjAgMHgyMCAweDIwMCAweDgwPjsKKwkJCQl9OworCisJCQkJcnRpY19jOiBydGljLWNANDAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHg0MCAweDIwIDB4MzAwIDB4ODA+OworCQkJCX07CisKKwkJCQlydGljX2Q6IHJ0aWMtZEA2MCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKKwkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDYwIDB4MjAgMHg1MDAgMHg4MD47CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJc2VjX21vbjogc2VjX21vbkAzMTQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItbW9uIiwgImZzbCxzZWMtdjQuMC1tb24iOworCQkJcmVnID0gPDB4MzE0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDkzIDIgMCAwPjsKKwkJfTsKKworCX07CisKKwlsb2NhbGJ1c0BmZmUxMjQwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCQlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCX07CisKKwlwY2kwOiBwY2llQGZmZTIwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJZnNsLG1zaSA9IDwmbXNpMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKKwkJcGNpZUAwIHsKKwkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCS8qIElEU0VMIDB4MCAqLworCQkJCTAwMDAgMCAwIDEgJm1waWMgNDAgMSAwIDAKKwkJCQkwMDAwIDAgMCAyICZtcGljIDEgMSAwIDAKKwkJCQkwMDAwIDAgMCAzICZtcGljIDIgMSAwIDAKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDMgMSAwIDAKKwkJCQk+OworCQl9OworCX07CisKKwlwY2kxOiBwY2llQGZmZTIwMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJYnVzLXJhbmdlID0gPDAgMHhmZj47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJCWZzbCxtc2kgPSA8Jm1zaTE+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE0PjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQxIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyA2IDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworCisJcGNpMjogcGNpZUBmZmUyMDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJCWZzbCxtc2kgPSA8Jm1zaTI+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMz47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQyIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyA5IDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyAxMCAxIDAgMAorCQkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMSAwIDAKKwkJCQk+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxZHMuZHRzCmluZGV4IDY5Y2FlNjcuLmJiZDExM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNDFkcy5kdHMKQEAgLTQ1LDYgKzQ1LDEwIEBACiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJfTsKIAorCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4MDAwMDAwMDAgMHgwMTAwODAwMD47CisJfTsKKwogCXNvYzogc29jQGZmZTAwMDAwMCB7CiAJCXNwaUAxMTAwMDAgewogCQkJZmxhc2hAMCB7CkBAIC0xNDcsOCArMTUxLDggQEAKIAkJfTsKIAogCQlib2FyZC1jb250cm9sQDMsMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMzA0MWRzLXBpeGlzIjsKLQkJCXJlZyA9IDwzIDAgMHgyMD47CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MWRzLWZwZ2EiLCAiZnNsLGZwZ2EtbmdwaXhpcyI7CisJCQlyZWcgPSA8MyAwIDB4MzA+OwogCQl9OwogCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MXNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNDFzaS5kdHNpCmluZGV4IDhiNjk1ODAuLjg3MTMwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MXNpLmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxc2kuZHRzaQpAQCAtNDIsNiArNDIsNyBAQAogCiAJYWxpYXNlcyB7CiAJCWNjc3IgPSAmc29jOworCQlkY3NyID0gJmRjc3I7CiAKIAkJc2VyaWFsMCA9ICZzZXJpYWwwOwogCQlzZXJpYWwxID0gJnNlcmlhbDE7CkBAIC0xMTQsNiArMTE1LDc0IEBACiAJCX07CiAJfTsKIAorCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxkY3NyIiwgInNpbXBsZS1idXMiOworCisJCWRjc3ItZXB1QDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lcHUiOworCQkJaW50ZXJydXB0cyA9IDw1MiAyIDAgMAorCQkJCSAgICAgIDg0IDIgMCAwCisJCQkJICAgICAgODUgMiAwIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCX07CisJCWRjc3ItbnBjIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDAwIDB4MTAwMDAwMCAweDgwMDA+OworCQl9OworCQlkY3NyLW54Y0AyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnhjIjsKKwkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jb3JlbmV0IHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7CisJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItZHBhYUA5MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MzA0MS1kY3NyLWRwYWEiLCAiZnNsLGRjc3ItZHBhYSI7CisJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3Itb2NuQDExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MzA0MS1kY3NyLW9jbiIsICJmc2wsZGNzci1vY24iOworCQkJcmVnID0gPDB4MTEwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1kZHJAMTIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1kZHIiOworCQkJZGV2LWhhbmRsZSA9IDwmZGRyPjsKKwkJCXJlZyA9IDwweDEyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItbmFsQDE4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MzA0MS1kY3NyLW5hbCIsICJmc2wsZGNzci1uYWwiOworCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1yY3BtQDIyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MzA0MS1kY3NyLXJjcG0iLCAiZnNsLGRjc3ItcmNwbSI7CisJCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1MD47CisJCQlyZWcgPSA8MHg0MDAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1MT47CisJCQlyZWcgPSA8MHg0MTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1Mj47CisJCQlyZWcgPSA8MHg0MjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1Mz47CisJCQlyZWcgPSA8MHg0MzAwMCAweDEwMDA+OworCQl9OworCX07CisKIAlzb2M6IHNvY0BmZmUwMDAwMDAgewogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CkBAIC0xMzMsNyArMjAyLDcgQEAKIAkJCWZzbCxudW0tbGF3cyA9IDwzMj47CiAJCX07CiAKLQkJbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CisJCWRkcjogbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC41IiwgImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMz47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNjBxZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDYwcWRzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGI5MTkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDYwcWRzLmR0cwpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIFAzMDYwUURTIERldmljZSBUcmVlIFNvdXJjZQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvaW5jbHVkZS8gInAzMDYwc2kuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiZnNsLFAzMDYwUURTIjsKKwljb21wYXRpYmxlID0gImZzbCxQMzA2MFFEUyI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCX07CisKKwlkY3NyOiBkY3NyQGYwMDAwMDAwMCB7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweDAwMDAwMDAwIDB4MDEwMDgwMDA+OworCX07CisKKwlzb2M6IHNvY0BmZmUwMDAwMDAgeworCQlzcGlAMTEwMDAwIHsKKwkJCWZsYXNoQDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCWNvbXBhdGlibGUgPSAic3BhbnNpb24sczI1c2wxMjgwMSI7CisJCQkJcmVnID0gPDA+OworCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsgLyogaW5wdXQgY2xvY2sgKi8KKwkJCQlwYXJ0aXRpb25AdS1ib290IHsKKwkJCQkJbGFiZWwgPSAidS1ib290IjsKKwkJCQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwMDEwMDAwMD47CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCQkJCXBhcnRpdGlvbkBrZXJuZWwgeworCQkJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwNTAwMDAwPjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisJCQkJcGFydGl0aW9uQGR0YiB7CisJCQkJCWxhYmVsID0gImR0YiI7CisJCQkJCXJlZyA9IDwweDAwNjAwMDAwIDB4MDAxMDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25AZnMgeworCQkJCQlsYWJlbCA9ICJmaWxlIHN5c3RlbSI7CisJCQkJCXJlZyA9IDwweDAwNzAwMDAwIDB4MDA5MDAwMDA+OworCQkJCX07CisJCQl9OworCQkJZmxhc2hAMSB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixlbjI1cTMyYiI7CisJCQkJcmVnID0gPDE+OworCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsgLyogaW5wdXQgY2xvY2sgKi8KKwkJCQlwYXJ0aXRpb25Ac3BpMSB7CisJCQkJCWxhYmVsID0gInNwaTEiOworCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwNDAwMDAwPjsKKwkJCQl9OworCQkJfTsKKwkJCWZsYXNoQDIgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ0NWRiMDgxZCI7CisJCQkJcmVnID0gPDI+OworCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsgLyogaW5wdXQgY2xvY2sgKi8KKwkJCQlwYXJ0aXRpb25Ac3BpMSB7CisJCQkJCWxhYmVsID0gInNwaTIiOworCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMTAwMDAwPjsKKwkJCQl9OworCQkJfTsKKwkJCWZsYXNoQDMgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCWNvbXBhdGlibGUgPSAic3BhbnNpb24sc3N0MjV3ZjA0MCI7CisJCQkJcmVnID0gPDM+OworCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsgLyogaW5wdXQgY2xvY2sgKi8KKwkJCQlwYXJ0aXRpb25Ac3BpMyB7CisJCQkJCWxhYmVsID0gInNwaTMiOworCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMDgwMDAwPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlpMmNAMTE4MDAwIHsKKwkJCWVlcHJvbUA1MSB7CisJCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzI1NiI7CisJCQkJcmVnID0gPDB4NTE+OworCQkJfTsKKwkJCWVlcHJvbUA1MyB7CisJCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzI1NiI7CisJCQkJcmVnID0gPDB4NTM+OworCQkJfTsKKwkJCXJ0Y0A2OCB7CisJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMzMjMyIjsKKwkJCQlyZWcgPSA8MHg2OD47CisJCQkJaW50ZXJydXB0cyA9IDwweDEgMHgxIDAgMD47CisJCQl9OworCQl9OworCisJCXVzYjA6IHVzYkAyMTAwMDAgeworCQkJcGh5X3R5cGUgPSAidWxwaSI7CisJCX07CisKKwkJdXNiMTogdXNiQDIxMTAwMCB7CisJCQlkcl9tb2RlID0gImhvc3QiOworCQkJcGh5X3R5cGUgPSAidWxwaSI7CisJCX07CisJfTsKKworCXJhcGlkaW9AZmZlMGMwMDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMGMwMDAwIDAgMHgxMTAwMD47CisKKwkJcG9ydDEgeworCQkJcmFuZ2VzID0gPDAgMCAweGMgMHgyMDAwMDAwMCAwIDB4MTAwMDAwMDA+OworCQl9OworCQlwb3J0MiB7CisJCQlyYW5nZXMgPSA8MCAwIDB4YyAweDMwMDAwMDAwIDAgMHgxMDAwMDAwMD47CisJCX07CisJfTsKKworCWxvY2FsYnVzQGZmZTEyNDAwMCB7CisJCXJlZyA9IDwweGYgMHhmZTEyNDAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwwIDAgMHhmIDB4ZTgwMDAwMDAgMHgwODAwMDAwMAorCQkJICAyIDAgMHhmIDB4ZmZhMDAwMDAgMHgwMDA0MDAwMAorCQkJICAzIDAgMHhmIDB4ZmZkZjAwMDAgMHgwMDAwODAwMD47CisKKwkJZmxhc2hAMCwwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKKwkJCXJlZyA9IDwwIDAgMHgwODAwMDAwMD47CisJCQliYW5rLXdpZHRoID0gPDI+OworCQkJZGV2aWNlLXdpZHRoID0gPDI+OworCQl9OworCisJCW5hbmRAMiwwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxlbGJjLWZjbS1uYW5kIjsKKwkJCXJlZyA9IDwweDIgMHgwIDB4NDAwMDA+OworCisJCQlwYXJ0aXRpb25AMCB7CisJCQkJbGFiZWwgPSAiTkFORCBVLUJvb3QgSW1hZ2UiOworCQkJCXJlZyA9IDwweDAgMHgwMjAwMDAwMD47CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQDIwMDAwMDAgeworCQkJCWxhYmVsID0gIk5BTkQgUm9vdCBGaWxlIFN5c3RlbSI7CisJCQkJcmVnID0gPDB4MDIwMDAwMDAgMHgxMDAwMDAwMD47CisJCQl9OworCisJCQlwYXJ0aXRpb25AMTIwMDAwMDAgeworCQkJCWxhYmVsID0gIk5BTkQgQ29tcHJlc3NlZCBSRlMgSW1hZ2UiOworCQkJCXJlZyA9IDwweDEyMDAwMDAwIDB4MDgwMDAwMDA+OworCQkJfTsKKworCQkJcGFydGl0aW9uQDFhMDAwMDAwIHsKKwkJCQlsYWJlbCA9ICJOQU5EIExpbnV4IEtlcm5lbCBJbWFnZSI7CisJCQkJcmVnID0gPDB4MWEwMDAwMDAgMHgwNDAwMDAwMD47CisJCQl9OworCisJCQlwYXJ0aXRpb25AMWUwMDAwMDAgeworCQkJCWxhYmVsID0gIk5BTkQgRFRCIEltYWdlIjsKKwkJCQlyZWcgPSA8MHgxZTAwMDAwMCAweDAxMDAwMDAwPjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxZjAwMDAwMCB7CisJCQkJbGFiZWwgPSAiTkFORCBXcml0YWJsZSBVc2VyIGFyZWEiOworCQkJCXJlZyA9IDwweDFmMDAwMDAwIDB4MjEwMDAwMDA+OworCQkJfTsKKwkJfTsKKworCQlib2FyZC1jb250cm9sQDMsMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MHFkcy1mcGdhIiwgImZzbCxmcGdhLXFpeGlzIjsKKwkJCXJlZyA9IDwzIDAgMHgxMDA+OworCQl9OworCX07CisKKwlwY2kwOiBwY2llQGZmZTIwMDAwMCB7CisJCXJlZyA9IDwweGYgMHhmZTIwMDAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHgwMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmODAwMDAwMCAweDAgMHgwMDAxMDAwMD47CisJCXBjaWVAMCB7CisJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAwIDB4MDAwMTAwMDA+OworCQl9OworCX07CisKKwlwY2kxOiBwY2llQGZmZTIwMTAwMCB7CisJCXJlZyA9IDwweGYgMHhmZTIwMTAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MCAweGUwMDAwMDAwIDB4YyAweDIwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMTAwMDAgMHgwIDB4MDAwMTAwMDA+OworCQlwY2llQDAgeworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMCAweDAwMDEwMDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA2MHNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNjBzaS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OTQ3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNjBzaS5kdHNpCkBAIC0wLDAgKzEsNzE5IEBACisvKgorICogUDMwNjAgU2lsaWNvbiBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAzMDYwIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQljY3NyID0gJnNvYzsKKwkJZGNzciA9ICZkY3NyOworCisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlzZXJpYWwyID0gJnNlcmlhbDI7CisJCXNlcmlhbDMgPSAmc2VyaWFsMzsKKwkJcGNpMCA9ICZwY2kwOworCQlwY2kxID0gJnBjaTE7CisJCXVzYjAgPSAmdXNiMDsKKwkJdXNiMSA9ICZ1c2IxOworCQlkbWEwID0gJmRtYTA7CisJCWRtYTEgPSAmZG1hMTsKKwkJbXNpMCA9ICZtc2kwOworCQltc2kxID0gJm1zaTE7CisJCW1zaTIgPSAmbXNpMjsKKworCQljcnlwdG8gPSAmY3J5cHRvOworCQlzZWNfanIwID0gJnNlY19qcjA7CisJCXNlY19qcjEgPSAmc2VjX2pyMTsKKwkJc2VjX2pyMiA9ICZzZWNfanIyOworCQlzZWNfanIzID0gJnNlY19qcjM7CisJCXJ0aWNfYSA9ICZydGljX2E7CisJCXJ0aWNfYiA9ICZydGljX2I7CisJCXJ0aWNfYyA9ICZydGljX2M7CisJCXJ0aWNfZCA9ICZydGljX2Q7CisJCXNlY19tb24gPSAmc2VjX21vbjsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKKwkJCUwyXzA6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MTogUG93ZXJQQyxlNTAwbWNAMSB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDE+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CisJCQlMMl8xOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTQ6IFBvd2VyUEMsZTUwMG1jQDQgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw0PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzQ+OworCQkJTDJfNDogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHU1OiBQb3dlclBDLGU1MDBtY0A1IHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8NT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl81PjsKKwkJCUwyXzU6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1NjogUG93ZXJQQyxlNTAwbWNANiB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDY+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNj47CisJCQlMMl82OiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTc6IFBvd2VyUEMsZTUwMG1jQDcgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw3PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzc+OworCQkJTDJfNzogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCX07CisKKwlkY3NyOiBkY3NyQGYwMDAwMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzciIsICJzaW1wbGUtYnVzIjsKKworCQlkY3NyLWVwdUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZXB1IjsKKwkJCWludGVycnVwdHMgPSA8NTIgMiAwIDAKKwkJCQkgICAgICA4NCAyIDAgMAorCQkJCSAgICAgIDg1IDIgMCAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJcmVnID0gPDB4MCAweDEwMDA+OworCQl9OworCQlkY3NyLW5wYyB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW5wYyI7CisJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMCAweDEwMDAwMDAgMHg4MDAwPjsKKwkJfTsKKwkJZGNzci1ueGNAMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW54YyI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY29yZW5ldCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWNvcmVuZXQiOworCQkJcmVnID0gPDB4ODAwMCAweDEwMDAgMHhCMDAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWRwYWFAOTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kY3NyLWRwYWEiLCAiZnNsLGRjc3ItZHBhYSI7CisJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3Itb2NuQDExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRjc3Itb2NuIiwgImZzbCxkY3NyLW9jbiI7CisJCQlyZWcgPSA8MHgxMTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWRkckAxMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCQlkZXYtaGFuZGxlID0gPCZkZHI+OworCQkJcmVnID0gPDB4MTIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1uYWxAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZGNzci1uYWwiLCAiZnNsLGRjc3ItbmFsIjsKKwkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItcmNwbUAyMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kY3NyLXJjcG0iLCAiZnNsLGRjc3ItcmNwbSI7CisJCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1MD47CisJCQlyZWcgPSA8MHg0MDAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1MT47CisJCQlyZWcgPSA8MHg0MTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0NDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1ND47CisJCQlyZWcgPSA8MHg0NDAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0NTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1NT47CisJCQlyZWcgPSA8MHg0NTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0NjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1Nj47CisJCQlyZWcgPSA8MHg0NjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0NzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1Nz47CisJCQlyZWcgPSA8MHg0NzAwMCAweDEwMDA+OworCQl9OworCX07CisKKwlzb2M6IHNvY0BmZmUwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWRldmljZV90eXBlID0gInNvYyI7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweGZlMDAwMDAwIDB4MTAwMDAwMD47CisJCXJlZyA9IDwweGYgMHhmZTAwMDAwMCAwIDB4MDAwMDEwMDA+OworCisJCXNvYy1zcmFtLWVycm9yIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNvYy1zcmFtLWVycm9yIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI5PjsKKwkJfTsKKworCQljb3JlbmV0LWxhd0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtbGF3IjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJCWZzbCxudW0tbGF3cyA9IDwzMj47CisJCX07CisKKwkJZGRyOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjQiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKKwkJfTsKKworCQljcGM6IGwzLWNhY2hlLWNvbnRyb2xsZXJAMTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtbDMtY2FjaGUtY29udHJvbGxlciIsICJjYWNoZSI7CisJCQlyZWcgPSA8MHgxMDAwMCAweDEwMDAKKwkJCSAgICAgICAweDExMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyNz47CisJCX07CisKKwkJY29yZW5ldC1jZkAxODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWNmIjsKKwkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAzMT47CisJCQlmc2wsY2NmLW51bS1jc2RpZHMgPSA8MzI+OworCQkJZnNsLGNjZi1udW0tc25vb3BpZHMgPSA8MzI+OworCQl9OworCisJCWlvbW11QDIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHBhbXUtdjEuMCIsICJmc2wscGFtdSI7CisJCQlyZWcgPSA8MHgyMDAwMCAweDUwMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkyNCAyIDAgMAorCQkJCTE2IDIgMSAzMD47CisJCX07CisKKwkJbXBpYzogcGljQDQwMDAwIHsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDQ+OworCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljIiwgImNocnAsb3Blbi1waWMiOworCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOworCQl9OworCisJCW1zaTA6IG1zaUA0MTYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MTYwMCAweDIwMD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlMCAwIDAgMAorCQkJCTB4ZTEgMCAwIDAKKwkJCQkweGUyIDAgMCAwCisJCQkJMHhlMyAwIDAgMAorCQkJCTB4ZTQgMCAwIDAKKwkJCQkweGU1IDAgMCAwCisJCQkJMHhlNiAwIDAgMAorCQkJCTB4ZTcgMCAwIDA+OworCQl9OworCisJCW1zaTE6IG1zaUA0MTgwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MTgwMCAweDIwMD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlOCAwIDAgMAorCQkJCTB4ZTkgMCAwIDAKKwkJCQkweGVhIDAgMCAwCisJCQkJMHhlYiAwIDAgMAorCQkJCTB4ZWMgMCAwIDAKKwkJCQkweGVkIDAgMCAwCisJCQkJMHhlZSAwIDAgMAorCQkJCTB4ZWYgMCAwIDA+OworCQl9OworCisJCW1zaTI6IG1zaUA0MWEwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MWEwMCAweDIwMD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhmMCAwIDAgMAorCQkJCTB4ZjEgMCAwIDAKKwkJCQkweGYyIDAgMCAwCisJCQkJMHhmMyAwIDAgMAorCQkJCTB4ZjQgMCAwIDAKKwkJCQkweGY1IDAgMCAwCisJCQkJMHhmNiAwIDAgMAorCQkJCTB4ZjcgMCAwIDA+OworCQl9OworCisJCXJtdTogcm11QGQzMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxzcmlvLXJtdSI7CisJCQlyZWcgPSA8MHhkMzAwMCAweDUwMD47CisJCQlyYW5nZXMgPSA8MHgwIDB4ZDMwMDAgMHg1MDA+OworCisJCQltZXNzYWdlLXVuaXRAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1tc2ctdW5pdCI7CisJCQkJcmVnID0gPDB4MCAweDEwMD47CisJCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkJNjAgMiAwIDAgIC8qIG1zZzFfdHhfaXJxICovCisJCQkJCTYxIDIgMCAwPjsvKiBtc2cxX3J4X2lycSAqLworCQkJfTsKKwkJCW1lc3NhZ2UtdW5pdEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tbXNnLXVuaXQiOworCQkJCXJlZyA9IDwweDEwMCAweDEwMD47CisJCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkJNjIgMiAwIDAgIC8qIG1zZzJfdHhfaXJxICovCisJCQkJCTYzIDIgMCAwPjsvKiBtc2cyX3J4X2lycSAqLworCQkJfTsKKwkJCWRvb3JiZWxsLXVuaXRANDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzcmlvLWRiZWxsLXVuaXQiOworCQkJCXJlZyA9IDwweDQwMCAweDgwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPAorCQkJCQk1NiAyIDAgMCAgLyogYmVsbF9vdXRiX2lycSAqLworCQkJCQk1NyAyIDAgMD47LyogYmVsbF9pbmJfaXJxICovCisJCQl9OworCQkJcG9ydC13cml0ZS11bml0QDRlMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1wb3J0LXdyaXRlLXVuaXQiOworCQkJCXJlZyA9IDwweDRlMCAweDIwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMT47CisJCQl9OworCQl9OworCisJCWd1dHM6IGdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtZGV2aWNlLWNvbmZpZy0xLjAiOworCQkJcmVnID0gPDB4ZTAwMDAgMHhlMDA+OworCQkJZnNsLGhhcy1yc3RjcjsKKwkJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwkJCWZzbCxsaW9kbi1iaXRzID0gPDEyPjsKKwkJfTsKKworCQlwaW5zOiBnbG9iYWwtdXRpbGl0aWVzQGUwZTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXBpbi1jb250cm9sLTEuMCI7CisJCQlyZWcgPSA8MHhlMGUwMCAweDIwMD47CisJCQkjc2xlZXAtY2VsbHMgPSA8Mj47CisJCX07CisKKwkJY2xvY2tnZW46IGdsb2JhbC11dGlsaXRpZXNAZTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQl9OworCisJCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcmNwbS0xLjAiOworCQkJcmVnID0gPDB4ZTIwMDAgMHgxMDAwPjsKKwkJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwkJfTsKKworCQlzZnA6IHNmcEBlODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1zZnAiLCAiZnNsLHFvcmlxLXNmcC0xLjAiOworCQkJcmVnCSAgID0gPDB4ZTgwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlzZXJkZXM6IHNlcmRlc0BlYTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1zZXJkZXMiOworCQkJcmVnCSAgID0gPDB4ZWEwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlkbWEwOiBkbWFAMTAwMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKKwkJCXJlZyA9IDwweDEwMDMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDEwMDEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkJaW50ZXJydXB0cyA9IDwyOCAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDI5IDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0cyA9IDwzMCAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OworCQkJCWludGVycnVwdHMgPSA8MzEgMiAwIDA+OworCQkJfTsKKwkJfTsKKworCQlkbWExOiBkbWFAMTAxMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKKwkJCXJlZyA9IDwweDEwMTMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDEwMTEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkJaW50ZXJydXB0cyA9IDwzMiAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMzIDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0cyA9IDwzNCAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OworCQkJCWludGVycnVwdHMgPSA8MzUgMiAwIDA+OworCQkJfTsKKwkJfTsKKworCQlzcGlAMTEwMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1lc3BpIiwgImZzbCxtcGM4NTM2LWVzcGkiOworCQkJcmVnID0gPDB4MTEwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDUzIDB4MiAwIDA+OworCQkJZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzID0gPDQ+OworCQl9OworCisJCWkyY0AxMTgwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE4MDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJaTJjQDExODEwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTgxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlpMmNAMTE5MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDI+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExOTAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AxMTkxMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE5MTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJc2VyaWFsMDogc2VyaWFsQDExYzUwMCB7CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHgxMWM1MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47CisJCX07CisKKwkJc2VyaWFsMTogc2VyaWFsQDExYzYwMCB7CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHgxMWM2MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47CisJCX07CisKKwkJc2VyaWFsMjogc2VyaWFsQDExZDUwMCB7CisJCQljZWxsLWluZGV4ID0gPDI+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHgxMWQ1MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47CisJCX07CisKKwkJc2VyaWFsMzogc2VyaWFsQDExZDYwMCB7CisJCQljZWxsLWluZGV4ID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHgxMWQ2MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47CisJCX07CisKKwkJZ3BpbzA6IGdwaW9AMTMwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWdwaW8iLCAiZnNsLHFvcmlxLWdwaW8iOworCQkJcmVnID0gPDB4MTMwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDU1IDIgMCAwPjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQl9OworCisJCXVzYjA6IHVzYkAyMTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtdXNiMi1tcGgiLAorCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1tcGgiLCAiZnNsLXVzYjItbXBoIjsKKwkJCXJlZyA9IDwweDIxMDAwMCAweDEwMDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8NDQgMHgyIDAgMD47CisJCX07CisKKwkJdXNiMTogdXNiQDIxMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC11c2IyLWRyIiwKKwkJCQkJImZzbCxtcGM4NXh4LXVzYjItZHIiLCAiZnNsLXVzYjItZHIiOworCQkJcmVnID0gPDB4MjExMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0NSAweDIgMCAwPjsKKwkJfTsKKworCQljcnlwdG86IGNyeXB0b0AzMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEiLCAiZnNsLHNlYy12NC4wIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHgzMDAwMDAgMHgxMDAwMD47CisJCQlyYW5nZXMgPSA8MCAweDMwMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDw5MiAyIDAgMD47CisKKwkJCXNlY19qcjA6IGpyQDEwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLWpvYi1yaW5nIiwgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8ODggMiAwIDA+OworCQkJfTsKKworCQkJc2VjX2pyMToganJAMjAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtam9iLXJpbmciLCAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDw4OSAyIDAgMD47CisJCQl9OworCisJCQlzZWNfanIyOiBqckAzMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1qb2ItcmluZyIsICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDMwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDkwIDIgMCAwPjsKKwkJCX07CisKKwkJCXNlY19qcjM6IGpyQDQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLWpvYi1yaW5nIiwgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4NDAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8OTEgMiAwIDA+OworCQkJfTsKKworCQkJcnRpY0A2MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1ydGljIiwgImZzbCxzZWMtdjQuMC1ydGljIjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQlyZWcgPSA8MHg2MDAwIDB4MTAwPjsKKwkJCQlyYW5nZXMgPSA8MHgwIDB4NjEwMCAweGUwMD47CisKKwkJCQlydGljX2E6IHJ0aWMtYUAwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtcnRpYy1tZW1vcnkiLCAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4MDAgMHgyMCAweDEwMCAweDgwPjsKKwkJCQl9OworCisJCQkJcnRpY19iOiBydGljLWJAMjAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1ydGljLW1lbW9yeSIsICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHgyMCAweDIwIDB4MjAwIDB4ODA+OworCQkJCX07CisKKwkJCQlydGljX2M6IHJ0aWMtY0A0MCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLXJ0aWMtbWVtb3J5IiwgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDQwIDB4MjAgMHgzMDAgMHg4MD47CisJCQkJfTsKKworCQkJCXJ0aWNfZDogcnRpYy1kQDYwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtcnRpYy1tZW1vcnkiLCAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4NjAgMHgyMCAweDUwMCAweDgwPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlzZWNfbW9uOiBzZWNfbW9uQDMxNDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1tb24iLCAiZnNsLHNlYy12NC4wLW1vbiI7CisJCQlyZWcgPSA8MHgzMTQwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDw5MyAyIDAgMD47CisJCX07CisJfTsKKworCXJhcGlkaW9AZmZlMGMwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc3JpbyI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDExPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQlmc2wsc3Jpby1ybXUtaGFuZGxlID0gPCZybXU+OworCQlyYW5nZXM7CisKKwkJcG9ydDEgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCX07CisKKwkJcG9ydDIgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CisJCX07CisJfTsKKworCWxvY2FsYnVzQGZmZTEyNDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CisJCWludGVycnVwdHMgPSA8MjUgMiAwIDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCQlmc2wsbXNpID0gPCZtc2kwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OworCQlwY2llQDAgeworCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0MCAxIDAgMAorCQkJCTAwMDAgMCAwIDIgJm1waWMgMSAxIDAgMAorCQkJCTAwMDAgMCAwIDMgJm1waWMgMiAxIDAgMAorCQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxIDAgMAorCQkJCT47CisJCX07CisJfTsKKworCXBjaTE6IHBjaWVAZmZlMjAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJZnNsLG1zaSA9IDwmbXNpMT47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDE0PjsKKwkJcGNpZUAwIHsKKwkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCS8qIElEU0VMIDB4MCAqLworCQkJCTAwMDAgMCAwIDEgJm1waWMgNDEgMSAwIDAKKwkJCQkwMDAwIDAgMCAyICZtcGljIDUgMSAwIDAKKwkJCQkwMDAwIDAgMCAzICZtcGljIDYgMSAwIDAKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDcgMSAwIDAKKwkJCQk+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A0MDgwZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A0MDgwZHMuZHRzCmluZGV4IGViMTEwOTguLmM3OTE2ZGMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A0MDgwZHMuZHRzCkBAIC00NSw2ICs0NSwxMCBAQAogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCX07CiAKKwlkY3NyOiBkY3NyQGYwMDAwMDAwMCB7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweDAwMDAwMDAwIDB4MDEwMDgwMDA+OworCX07CisKIAlzb2M6IHNvY0BmZmUwMDAwMDAgewogCQlzcGlAMTEwMDAwIHsKIAkJCWZsYXNoQDAgewpAQCAtMTA4LDcgKzExMiw4IEBACiAKIAlsb2NhbGJ1c0BmZmUxMjQwMDAgewogCQlyZWcgPSA8MHhmIDB4ZmUxMjQwMDAgMCAweDEwMDA+OwotCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDA+OworCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDAKKwkJCSAgMyAwIDB4ZiAweGZmZGYwMDAwIDB4MDAwMDgwMDA+OwogCiAJCWZsYXNoQDAsMCB7CiAJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CkBAIC0xMTYsNiArMTIxLDExIEBACiAJCQliYW5rLXdpZHRoID0gPDI+OwogCQkJZGV2aWNlLXdpZHRoID0gPDI+OwogCQl9OworCisJCWJvYXJkLWNvbnRyb2xAMywwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwZHMtZnBnYSIsICJmc2wsZnBnYS1uZ3BpeGlzIjsKKwkJCXJlZyA9IDwzIDAgMHgzMD47CisJCX07CiAJfTsKIAogCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MHNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBzaS5kdHNpCmluZGV4IGI3MTA1MWY1Li5mMjBjMDFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBzaS5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MHNpLmR0c2kKQEAgLTQyLDYgKzQyLDcgQEAKIAogCWFsaWFzZXMgewogCQljY3NyID0gJnNvYzsKKwkJZGNzciA9ICZkY3NyOwogCiAJCXNlcmlhbDAgPSAmc2VyaWFsMDsKIAkJc2VyaWFsMSA9ICZzZXJpYWwxOwpAQCAtNzcsNyArNzgsNyBAQAogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAKLQkJY3B1MDogUG93ZXJQQyw0MDgwQDAgeworCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKQEAgLTg1LDcgKzg2LDcgQEAKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwogCQkJfTsKIAkJfTsKLQkJY3B1MTogUG93ZXJQQyw0MDgwQDEgeworCQljcHUxOiBQb3dlclBDLGU1MDBtY0AxIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MT47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKQEAgLTkzLDcgKzk0LDcgQEAKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwogCQkJfTsKIAkJfTsKLQkJY3B1MjogUG93ZXJQQyw0MDgwQDIgeworCQljcHUyOiBQb3dlclBDLGU1MDBtY0AyIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8Mj47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKQEAgLTEwMSw3ICsxMDIsNyBAQAogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CiAJCQl9OwogCQl9OwotCQljcHUzOiBQb3dlclBDLDQwODBAMyB7CisJCWNwdTM6IFBvd2VyUEMsZTUwMG1jQDMgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwzPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OwpAQCAtMTA5LDcgKzExMCw3IEBACiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKIAkJCX07CiAJCX07Ci0JCWNwdTQ6IFBvd2VyUEMsNDA4MEA0IHsKKwkJY3B1NDogUG93ZXJQQyxlNTAwbWNANCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDQ+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfND47CkBAIC0xMTcsNyArMTE4LDcgQEAKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwogCQkJfTsKIAkJfTsKLQkJY3B1NTogUG93ZXJQQyw0MDgwQDUgeworCQljcHU1OiBQb3dlclBDLGU1MDBtY0A1IHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8NT47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl81PjsKQEAgLTEyNSw3ICsxMjYsNyBAQAogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CiAJCQl9OwogCQl9OwotCQljcHU2OiBQb3dlclBDLDQwODBANiB7CisJCWNwdTY6IFBvd2VyUEMsZTUwMG1jQDYgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDw2PjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzY+OwpAQCAtMTMzLDcgKzEzNCw3IEBACiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKIAkJCX07CiAJCX07Ci0JCWNwdTc6IFBvd2VyUEMsNDA4MEA3IHsKKwkJY3B1NzogUG93ZXJQQyxlNTAwbWNANyB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDc+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNz47CkBAIC0xNDMsNiArMTQ0LDk5IEBACiAJCX07CiAJfTsKIAorCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxkY3NyIiwgInNpbXBsZS1idXMiOworCisJCWRjc3ItZXB1QDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lcHUiOworCQkJaW50ZXJydXB0cyA9IDw1MiAyIDAgMAorCQkJCSAgICAgIDg0IDIgMCAwCisJCQkJICAgICAgODUgMiAwIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCX07CisJCWRjc3ItbnBjIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDAwIDB4MTAwMDAwMCAweDgwMDA+OworCQl9OworCQlkY3NyLW54Y0AyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnhjIjsKKwkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jb3JlbmV0IHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7CisJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItZHBhYUA5MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRjc3ItZHBhYSIsICJmc2wsZGNzci1kcGFhIjsKKwkJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1vY25AMTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZGNzci1vY24iLCAiZnNsLGRjc3Itb2NuIjsKKwkJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItZGRyQDEyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKKwkJCWRldi1oYW5kbGUgPSA8JmRkcjE+OworCQkJcmVnID0gPDB4MTIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1kZHJAMTMwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1kZHIiOworCQkJZGV2LWhhbmRsZSA9IDwmZGRyMj47CisJCQlyZWcgPSA8MHgxMzAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLW5hbEAxODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kY3NyLW5hbCIsICJmc2wsZGNzci1uYWwiOworCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1yY3BtQDIyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRjc3ItcmNwbSIsICJmc2wsZGNzci1yY3BtIjsKKwkJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUxPjsKKwkJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUyPjsKKwkJCXJlZyA9IDwweDQyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQzMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUzPjsKKwkJCXJlZyA9IDwweDQzMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQ0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHU0PjsKKwkJCXJlZyA9IDwweDQ0MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQ1MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHU1PjsKKwkJCXJlZyA9IDwweDQ1MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQ2MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHU2PjsKKwkJCXJlZyA9IDwweDQ2MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQ3MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHU3PjsKKwkJCXJlZyA9IDwweDQ3MDAwIDB4MTAwMD47CisJCX07CisJfTsKKwogCXNvYzogc29jQGZmZTAwMDAwMCB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKQEAgLTE2MiwxMyArMjU2LDEzIEBACiAJCQlmc2wsbnVtLWxhd3MgPSA8MzI+OwogCQl9OwogCi0JCW1lbW9yeS1jb250cm9sbGVyQDgwMDAgeworCQlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjQiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKIAkJfTsKIAotCQltZW1vcnktY29udHJvbGxlckA5MDAwIHsKKwkJZGRyMjogbWVtb3J5LWNvbnRyb2xsZXJAOTAwMCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC40IiwiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MTYgMiAxIDIyPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNTAyMGRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNTAyMGRzLmR0cwppbmRleCA4MzY2ZTJmLi5lNmQ0MDk5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwZHMuZHRzCkBAIC00NSw2ICs0NSwxMCBAQAogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCX07CiAKKwlkY3NyOiBkY3NyQGYwMDAwMDAwMCB7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweDAwMDAwMDAwIDB4MDEwMDgwMDA+OworCX07CisKIAlzb2M6IHNvY0BmZmUwMDAwMDAgewogCQlzcGlAMTEwMDAwIHsKIAkJCWZsYXNoQDAgewpAQCAtMTQ3LDggKzE1MSw4IEBACiAJCX07CiAKIAkJYm9hcmQtY29udHJvbEAzLDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjBkcy1waXhpcyI7Ci0JCQlyZWcgPSA8MyAwIDB4MjA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjBkcy1mcGdhIiwgImZzbCxmcGdhLW5ncGl4aXMiOworCQkJcmVnID0gPDMgMCAweDMwPjsKIAkJfTsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwc2kuZHRzaQppbmRleCA1ZTYwNDhlLi5lNzk0OGFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBzaS5kdHNpCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNTAyMHNpLmR0c2kKQEAgLTQyLDYgKzQyLDcgQEAKIAogCWFsaWFzZXMgewogCQljY3NyID0gJnNvYzsKKwkJZGNzciA9ICZkY3NyOwogCiAJCXNlcmlhbDAgPSAmc2VyaWFsMDsKIAkJc2VyaWFsMSA9ICZzZXJpYWwxOwpAQCAtOTgsNiArOTksNjkgQEAKIAkJfTsKIAl9OwogCisJZGNzcjogZGNzckBmMDAwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3IiLCAic2ltcGxlLWJ1cyI7CisKKwkJZGNzci1lcHVAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWVwdSI7CisJCQlpbnRlcnJ1cHRzID0gPDUyIDIgMCAwCisJCQkJICAgICAgODQgMiAwIDAKKwkJCQkgICAgICA4NSAyIDAgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1ucGMgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ucGMiOworCQkJcmVnID0gPDB4MTAwMCAweDEwMDAgMHgxMDAwMDAwIDB4ODAwMD47CisJCX07CisJCWRjc3ItbnhjQDIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ueGMiOworCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNvcmVuZXQgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1jb3JlbmV0IjsKKwkJCXJlZyA9IDwweDgwMDAgMHgxMDAwIDB4QjAwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1kcGFhQDkwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZGNzci1kcGFhIiwgImZzbCxkY3NyLWRwYWEiOworCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLW9jbkAxMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kY3NyLW9jbiIsICJmc2wsZGNzci1vY24iOworCQkJcmVnID0gPDB4MTEwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1kZHJAMTIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1kZHIiOworCQkJZGV2LWhhbmRsZSA9IDwmZGRyMT47CisJCQlyZWcgPSA8MHgxMjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWRkckAxMzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCQlkZXYtaGFuZGxlID0gPCZkZHIyPjsKKwkJCXJlZyA9IDwweDEzMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItbmFsQDE4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRjc3ItbmFsIiwgImZzbCxkY3NyLW5hbCI7CisJCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLXJjcG1AMjIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZGNzci1yY3BtIiwgImZzbCxkY3NyLXJjcG0iOworCQkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jcHUtc2ItcHJveHlANDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTUwMC1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1MD47CisJCQlyZWcgPSA8MHg0MDAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1NTAwLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUxPjsKKwkJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47CisJCX07CisJfTsKKwogCXNvYzogc29jQGZmZTAwMDAwMCB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKQEAgLTExNywxMyArMTgxLDEzIEBACiAJCQlmc2wsbnVtLWxhd3MgPSA8MzI+OwogCQl9OwogCi0JCW1lbW9yeS1jb250cm9sbGVyQDgwMDAgeworCQlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjUiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKIAkJfTsKIAotCQltZW1vcnktY29udHJvbGxlckA5MDAwIHsKKwkJZGRyMjogbWVtb3J5LWNvbnRyb2xsZXJAOTAwMCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC41IiwgImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2JjODU2MC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2JjODU2MC5kdHMKaW5kZXggOWUxM2VkOC4uNzIwNzhlYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NiYzg1NjAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zYmM4NTYwLmR0cwpAQCAtMzMxLDcgKzMzMSw3IEBACiAJfTsKIAogCWxvY2FsYnVzQGZmNzA1MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2MC1sb2NhbGJ1cyI7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjAtbG9jYWxidXMiLCAic2ltcGxlLWJ1cyI7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJcmVnID0gPDB4ZmY3MDUwMDAgMHgxMDA+OwkvLyBCUngsIE9SeCwgZXRjLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3lvc2VtaXRlLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy95b3NlbWl0ZS5kdHMKaW5kZXggNjQ5MjMyNC4uMzBiYjQ3NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3lvc2VtaXRlLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveW9zZW1pdGUuZHRzCkBAIC0xMzgsNiArMTM4LDQyIEBACiAJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgekltYWdlICovCiAJCQkJaW50ZXJydXB0cyA9IDwweDUgMHgxPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMxPjsKKworCQkJCW5vcl9mbGFzaEAwLDAgeworCQkJCQljb21wYXRpYmxlID0gImFtZCxzMjlnbDI1Nm4iLCAiY2ZpLWZsYXNoIjsKKwkJCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJCQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDA0MDAwMDAwPjsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCQlwYXJ0aXRpb25AMCB7CisJCQkJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJCQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwMDFlMDAwMD47CisJCQkJCX07CisJCQkJCXBhcnRpdGlvbkAxZTAwMDAgeworCQkJCQkJbGFiZWwgPSAiZHRiIjsKKwkJCQkJCXJlZyA9IDwweDAwMWUwMDAwIDB4MDAwMjAwMDA+OworCQkJCQl9OworCQkJCQlwYXJ0aXRpb25AMjAwMDAwIHsKKwkJCQkJCWxhYmVsID0gInJhbWRpc2siOworCQkJCQkJcmVnID0gPDB4MDAyMDAwMDAgMHgwMTQwMDAwMD47CisJCQkJCX07CisJCQkJCXBhcnRpdGlvbkAxNjAwMDAwIHsKKwkJCQkJCWxhYmVsID0gImpmZnMyIjsKKwkJCQkJCXJlZyA9IDwweDAxNjAwMDAwIDB4MDA0MDAwMDA+OworCQkJCQl9OworCQkJCQlwYXJ0aXRpb25AMWEwMDAwMCB7CisJCQkJCQlsYWJlbCA9ICJ1c2VyIjsKKwkJCQkJCXJlZyA9IDwweDAxYTAwMDAwIDB4MDI1NDAwMDA+OworCQkJCQl9OworCQkJCQlwYXJ0aXRpb25AM2Y0MDAwMCB7CisJCQkJCQlsYWJlbCA9ICJlbnYiOworCQkJCQkJcmVnID0gPDB4MDNmNDAwMDAgMHgwMDA0MDAwMD47CisJCQkJCX07CisJCQkJCXBhcnRpdGlvbkAzZjgwMDAwIHsKKwkJCQkJCWxhYmVsID0gInUtYm9vdCI7CisJCQkJCQlyZWcgPSA8MHgwM2Y4MDAwMCAweDAwMDgwMDAwPjsKKwkJCQkJfTsKKwkJCQl9OwogCQkJfTsKIAogCQkJVUFSVDA6IHNlcmlhbEBlZjYwMDMwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvaGN1NF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvaGN1NF9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTI2M2MuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2hjdTRfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotQ09ORklHXzQweD15Ci1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19QT1NJWF9NUVVFVUU9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfRVhQRVJUPXkKLUNPTkZJR19LQUxMU1lNU19BTEw9eQotQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotQ09ORklHX0hDVTQ9eQotIyBDT05GSUdfV0FMTlVUIGlzIG5vdCBzZXQKLUNPTkZJR19TUEFSU0VfSVJRPXkKLUNPTkZJR19QQ0k9eQotQ09ORklHX05FVD15Ci1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19VTklYPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLUNPTkZJR19DT05ORUNUT1I9eQotQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQotQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKLUNPTkZJR19NVERfT0ZfUEFSVFM9eQotQ09ORklHX01URF9DSEFSPXkKLUNPTkZJR19NVERfQkxPQ0s9bQotQ09ORklHX01URF9DRkk9eQotQ09ORklHX01URF9KRURFQ1BST0JFPXkKLUNPTkZJR19NVERfQ0ZJX0FNRFNURD15Ci1DT05GSUdfTVREX1BIWVNNQVBfT0Y9eQotQ09ORklHX1BST0NfREVWSUNFVFJFRT15Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzUwMDAKLUNPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19FVEhFUk5FVD15Ci1DT05GSUdfTkVUX1ZFTkRPUl9JQk09eQotQ09ORklHX0lCTV9FTUFDPXkKLSMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQotQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15Ci1DT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNPXkKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9bQotIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAotQ09ORklHX0VYVDJfRlM9eQotQ09ORklHX0lOT1RJRlk9eQotQ09ORklHX1BST0NfS0NPUkU9eQotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19DUkFNRlM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTUFHSUNfU1lTUlE9eQotQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQotQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQotQ09ORklHX0NSWVBUTz15Ci1DT05GSUdfQ1JZUFRPX0NCQz15Ci1DT05GSUdfQ1JZUFRPX0VDQj15Ci1DT05GSUdfQ1JZUFRPX1BDQkM9eQotQ09ORklHX0NSWVBUT19NRDU9eQotQ09ORklHX0NSWVBUT19ERVM9eQotIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC90cW01MjAwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvdHFtNTIwMF9kZWZjb25maWcKaW5kZXggOTU5Y2QyYy4uNzE2YTM3YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC90cW01MjAwX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3RxbTUyMDBfZGVmY29uZmlnCkBAIC0xLDkgKzEsMTAgQEAKIENPTkZJR19FWFBFUklNRU5UQUw9eQogQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NQQVJTRV9JUlE9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfRVhQRVJUPXkKK0NPTkZJR19FTUJFRERFRD15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CkBAIC0xNyw3ICsxOCw2IEBACiBDT05GSUdfUFBDX01QQzUyMDBfQlVHRklYPXkKICMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKIENPTkZJR19QUENfQkVTVENPTU09eQotQ09ORklHX1NQQVJTRV9JUlE9eQogQ09ORklHX1BNPXkKICMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUPXkKQEAgLTM4LDE3ICszOCwxOCBAQAogQ09ORklHX01URF9DT05DQVQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CitDT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfQ0ZJPXkKIENPTkZJR19NVERfQ0ZJX0FNRFNURD15CiBDT05GSUdfTVREX1JPTT15CiBDT05GSUdfTVREX1BIWVNNQVBfT0Y9eQorQ09ORklHX01URF9QTEFUUkFNPXkKIENPTkZJR19QUk9DX0RFVklDRVRSRUU9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzI3NjgKLSMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9TRD15CiBDT05GSUdfQ0hSX0RFVl9TRz15CiBDT05GSUdfQVRBPXkKQEAgLTU2LDEzICs1NywxMSBAQAogQ09ORklHX1BBVEFfUExBVEZPUk09eQogQ09ORklHX05FVERFVklDRVM9eQogQ09ORklHX0xYVF9QSFk9eQorQ09ORklHX0ZJWEVEX1BIWT15CiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19GRUNfTVBDNTJ4eD15CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotIyBDT05GSUdfVlQgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF9NUEM1Mnh4PXkKIENPTkZJR19TRVJJQUxfTVBDNTJ4eF9DT05TT0xFPXkKIENPTkZJR19TRVJJQUxfTVBDNTJ4eF9DT05TT0xFX0JBVUQ9MTE1MjAwCkBAIC03MCw3ICs2OSwxMyBAQAogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0NIQVJERVY9eQogQ09ORklHX0kyQ19NUEM9eQorQ09ORklHX1NFTlNPUlNfTE04MD15CiBDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX01GRF9TTTUwMT15CitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOPXkKK0NPTkZJR19GQl9TTTUwMT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CiBDT05GSUdfVVNCPXkKIENPTkZJR19VU0JfREVWSUNFRlM9eQogIyBDT05GSUdfVVNCX0RFVklDRV9DTEFTUyBpcyBub3Qgc2V0CkBAIC04MCwxMCArODUsMTAgQEAKIENPTkZJR19VU0JfU1RPUkFHRT15CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX0RTMTMwNz15CitDT05GSUdfUlRDX0RSVl9EUzEzNzQ9eQogQ09ORklHX0VYVDJfRlM9eQogQ09ORklHX0VYVDNfRlM9eQogIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKLUNPTkZJR19JTk9USUZZPXkKIENPTkZJR19NU0RPU19GUz15CiBDT05GSUdfVkZBVF9GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CkBAIC0xMDIsNyArMTA3LDYgQEAKIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0lORk89eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0VDQj15CiBDT05GSUdfQ1JZUFRPX1BDQkM9eQogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9wMTAyM3Jkc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3AxMDIzcmRzX2RlZmNvbmZpZwppbmRleCAzZmY1YTgxLi5jMDkxYWFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3AxMDIzcmRzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3AxMDIzcmRzX2RlZmNvbmZpZwpAQCAtMjQsNyArMjQsNyBAQAogQ09ORklHX1FVSUNDX0VOR0lORT15CiBDT05GSUdfUUVfR1BJTz15CiBDT05GSUdfQ1BNMj15Ci1DT05GSUdfTVBDOHh4eF9HUElPPXkKK0NPTkZJR19HUElPX01QQzhYWFg9eQogQ09ORklHX0hJR0hNRU09eQogQ09ORklHX05PX0haPXkKIENPTkZJR19ISUdIX1JFU19USU1FUlM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC94ZXNfbXBjODV4eF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3hlc19tcGM4NXh4X2RlZmNvbmZpZwppbmRleCA1ZWEzMTI0Li4xY2Q2ZmNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3hlc19tcGM4NXh4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3hlc19tcGM4NXh4X2RlZmNvbmZpZwpAQCAtMjAsNyArMjAsNyBAQAogQ09ORklHX01PRFZFUlNJT05TPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKIENPTkZJR19YRVNfTVBDODV4eD15Ci1DT05GSUdfTVBDOHh4eF9HUElPPXkKK0NPTkZJR19HUElPX01QQzhYWFg9eQogQ09ORklHX0hJR0hNRU09eQogQ09ORklHX01BVEhfRU1VTEFUSU9OPXkKIENPTkZJR19TUEFSU0VfSVJRPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQzMl9zbXBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDMyX3NtcF9kZWZjb25maWcKaW5kZXggNDMxMWQwMi4uZjA4N2RlNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDMyX3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDMyX3NtcF9kZWZjb25maWcKQEAgLTEyLDkgKzEyLDcgQEAKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TX0FMTD15Ci1DT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CiBDT05GSUdfRU1CRURERUQ9eQogQ09ORklHX1BFUkZfRVZFTlRTPXkKIENPTkZJR19TTEFCPXkKQEAgLTIzLDggKzIxLDkgQEAKIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKIENPTkZJR19NT0RWRVJTSU9OUz15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci1DT05GSUdfUDIwNDBfUkRCPXkKK0NPTkZJR19QMjA0MV9SREI9eQogQ09ORklHX1AzMDQxX0RTPXkKK0NPTkZJR19QMzA2MF9RRFM9eQogQ09ORklHX1A0MDgwX0RTPXkKIENPTkZJR19QNTAyMF9EUz15CiBDT05GSUdfSElHSE1FTT15CkBAIC02OSw3ICs2OCw2IEBACiBDT05GSUdfSVBfU0NUUD1tCiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX01URD15Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKQEAgLTEwNyw3ICsxMDUsNiBAQAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogQ09ORklHX1NFUklPX0xJQlBTMj15CiAjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX0VQQVBSX0hWX0JZVEVDSEFOPXkKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CiBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQpAQCAtMTM2LDggKzEzMyw2IEBACiBDT05GSUdfVVNCX1NUT1JBR0U9eQogQ09ORklHX01NQz15CiBDT05GSUdfTU1DX1NESENJPXkKLUNPTkZJR19NTUNfU0RIQ0lfT0Y9eQotQ09ORklHX01NQ19TREhDSV9PRl9FU0RIQz15CiBDT05GSUdfRURBQz15CiBDT05GSUdfRURBQ19NTV9FREFDPXkKIENPTkZJR19FREFDX01QQzg1WFg9eQpAQCAtMTQ2LDcgKzE0MSw2IEBACiBDT05GSUdfUlRDX0RSVl9DTU9TPXkKIENPTkZJR19VSU89eQogQ09ORklHX1NUQUdJTkc9eQotIyBDT05GSUdfU1RBR0lOR19FWENMVURFX0JVSUxEIGlzIG5vdCBzZXQKIENPTkZJR19WSVJUX0RSSVZFUlM9eQogQ09ORklHX0ZTTF9IVl9NQU5BR0VSPXkKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTE3Myw3ICsxNjcsNiBAQAogQ09ORklHX05MU19JU084ODU5XzE9eQogQ09ORklHX05MU19VVEY4PW0KIENPTkZJR19NQUdJQ19TWVNSUT15Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19ERUJVR19TSElSUT15CiBDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CiBDT05GSUdfREVCVUdfSU5GTz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jb3JlbmV0NjRfc21wX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnCmluZGV4IGM5MmMyMDQuLjc4MjgyMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnCkBAIC0xMSwxMCArMTEsOCBAQAogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfRVhQRVJUPXkKIENPTkZJR19LQUxMU1lNU19BTEw9eQotQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQpAQCAtMjUsNyArMjMsNiBAQAogQ09ORklHX05PX0haPXkKIENPTkZJR19ISUdIX1JFU19USU1FUlM9eQogQ09ORklHX0JJTkZNVF9NSVNDPW0KLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQpAQCAtOTMsMTAgKzkwLDggQEAKIENPTkZJR19DUkNfSVRVX1Q9bQogQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX0RFQlVHX0lORk89eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX1ZJUlFfREVCVUc9eQogQ09ORklHX0NSWVBUT19QQ0JDPW0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21nY29nZV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tZ2NvZ2VfZGVmY29uZmlnCmluZGV4IDZjYjU4OGEuLjBkMzZiMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21nY29nZV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbWdjb2dlX2RlZmNvbmZpZwpAQCAtMSwxNSArMSwyMiBAQAorQ09ORklHX0VYUEVSSU1FTlRBTD15CisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQogQ09ORklHX1NQQVJTRV9JUlE9eQogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0VYUEVSVD15CisjIENPTkZJR19SRF9HWklQIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNU19BTEw9eQorIyBDT05GSUdfUENTUEtSX1BMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CiBDT05GSUdfUFBDXzgyeHg9eQogQ09ORklHX01HQ09HRT15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKIENPTkZJR19CSU5GTVRfTUlTQz15CiAjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKIENPTkZJR19ORVQ9eQpAQCAtMjQsMTEgKzMxLDEwIEBACiAjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKIENPTkZJR19ORVRGSUxURVI9eQorQ09ORklHX1RJUEM9eQogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxLREVWUz15CkBAIC00Miw3ICs0OCw2IEBACiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKIENPTkZJR19CTEtfREVWX0xPT1A9eQogQ09ORklHX0JMS19ERVZfUkFNPXkKLSMgQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKIENPTkZJR19GSVhFRF9QSFk9eQogQ09ORklHX05FVF9FVEhFUk5FVD15CkBAIC01MCw2ICs1NSw3IEBACiBDT05GSUdfRlNfRU5FVF9NRElPX0ZDQz15CiAjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CkBAIC01NywyNCArNjMsMjQgQEAKIENPTkZJR19TRVJJQUxfQ1BNX0NPTlNPTEU9eQogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0NIQVJERVY9eQotIyBDT05GSUdfSTJDX1BPV0VSTUFDIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfQ1BNPXkKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUPXkKK0NPTkZJR19VU0JfRlNMX1VTQjI9eQorQ09ORklHX1VTQl9HX1NFUklBTD15CitDT05GSUdfVUlPPXkKK0NPTkZJR19VSU9fUERSVj15CiBDT05GSUdfRVhUMl9GUz15Ci1DT05GSUdfRVhUM19GUz15Ci0jIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfQVVUT0ZTNF9GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfVE1QRlM9eQogQ09ORklHX0pGRlMyX0ZTPXkKIENPTkZJR19DUkFNRlM9eQorQ09ORklHX1NRVUFTSEZTPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiBDT05GSUdfUk9PVF9ORlM9eQogQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci0jIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19OTFM9eQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQogQ09ORklHX05MU19BU0NJST15CkBAIC04Miw3ICs4OCw2IEBACiBDT05GSUdfTkxTX1VURjg9eQogQ09ORklHX01BR0lDX1NZU1JRPXkKIENPTkZJR19ERUJVR19GUz15Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19JTkZPPXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM1MTJ4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzUxMnhfZGVmY29uZmlnCmluZGV4IGMwMmJiYjIuLjIxMWZjYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzUxMnhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzUxMnhfZGVmY29uZmlnCkBAIC0xLDkgKzEsOSBAQAogQ09ORklHX0VYUEVSSU1FTlRBTD15CiAjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TUEFSU0VfSVJRPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE2CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQj15CiBDT05GSUdfTU9EVUxFUz15CkBAIC0xMywxMCArMTMsMTEgQEAKICMgQ09ORklHX1BQQ19DSFJQIGlzIG5vdCBzZXQKIENPTkZJR19QUENfTVBDNTEyeD15CiBDT05GSUdfTVBDNTEyMV9BRFM9eQorQ09ORklHX01QQzUxMjFfR0VORVJJQz15CitDT05GSUdfUERNMzYwTkc9eQogIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAogQ09ORklHX05PX0haPXkKIENPTkZJR19IWl8xMDAwPXkKLUNPTkZJR19TUEFSU0VfSVJRPXkKICMgQ09ORklHX01JR1JBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CkBAIC0zNSwxOCArMzYsMTYgQEAKIENPTkZJR19DQU5fUkFXPXkKIENPTkZJR19DQU5fQkNNPXkKIENPTkZJR19DQU5fVkNBTj15Ci1DT05GSUdfQ0FOX0RFVj15CiBDT05GSUdfQ0FOX01TQ0FOPXkKIENPTkZJR19DQU5fREVCVUdfREVWSUNFUz15CiAjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX0RFVlRNUEZTPXkKK0NPTkZJR19ERVZUTVBGU19NT1VOVD15CiAjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfQ09OQ0FUPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQotQ09ORklHX01URF9PRl9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTE9DSz15CiBDT05GSUdfTVREX0NGST15CkBAIC02Myw2ICs2Miw3IEBACiBDT05GSUdfQkxLX0RFVl9YSVA9eQogQ09ORklHX01JU0NfREVWSUNFUz15CiBDT05GSUdfRUVQUk9NX0FUMjQ9eQorQ09ORklHX0VFUFJPTV9BVDI1PXkKIENPTkZJR19TQ1NJPXkKICMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9TRD15CkBAIC05OSwxMCArOTksMTQgQEAKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19DSEFSREVWPXkKIENPTkZJR19JMkNfTVBDPXkKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9NUEM1MTJ4X1BTQz15CitDT05GSUdfR1BJT0xJQj15CitDT05GSUdfR1BJT19TWVNGUz15CitDT05GSUdfR1BJT19NUEM4WFhYPXkKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19NRURJQV9TVVBQT1JUPXkKIENPTkZJR19WSURFT19ERVY9eQotIyBDT05GSUdfVklERU9fQUxMT1dfVjRMMSBpcyBub3Qgc2V0CiBDT05GSUdfVklERU9fQURWX0RFQlVHPXkKICMgQ09ORklHX1ZJREVPX0hFTFBFUl9DSElQU19BVVRPIGlzIG5vdCBzZXQKIENPTkZJR19WSURFT19TQUE3MTFYPXkKQEAgLTEzMiw2ICsxMzYsNSBAQAogQ09ORklHX05MU19JU084ODU5XzE9eQogIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM1MjAwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzUyMDBfZGVmY29uZmlnCmluZGV4IGU2M2Y1MzcuLjJhMTMyMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzUyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzUyMDBfZGVmY29uZmlnCkBAIC04OCw2ICs4OCwxOCBAQAogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQogQ09ORklHX0xPR089eQorQ09ORklHX1NPVU5EPXkKK0NPTkZJR19TTkQ9eQorIyBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRFJJVkVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9QUEMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVVNCIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU09DPXkKK0NPTkZJR19TTkRfU09DX01QQzUyMDBfSTJTPXkKK0NPTkZJR19TTkRfTVBDNTJ4eF9TT0NfUENNMDMwPXkKK0NPTkZJR19TTkRfTVBDNTJ4eF9TT0NfRUZJS0E9eQogQ09ORklHX0hJRF9EUkFHT05SSVNFPXkKIENPTkZJR19ISURfR1lSQVRJT049eQogQ09ORklHX0hJRF9UV0lOSEFOPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9kZWZjb25maWcKaW5kZXggYTM0NjdiZi4uYTFlNWExNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9kZWZjb25maWcKQEAgLTEwLDEwICsxMCw4IEBACiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19FWFBFUlQ9eQogQ09ORklHX0tBTExTWU1TX0FMTD15Ci1DT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CiBDT05GSUdfTU9EVUxFUz15CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CkBAIC00MSw3ICszOSw2IEBACiBDT05GSUdfU0JDODU0OD15CiBDT05GSUdfUVVJQ0NfRU5HSU5FPXkKIENPTkZJR19RRV9HUElPPXkKLUNPTkZJR19NUEM4eHh4X0dQSU89eQogQ09ORklHX0hJR0hNRU09eQogQ09ORklHX05PX0haPXkKIENPTkZJR19ISUdIX1JFU19USU1FUlM9eQpAQCAtMTIzLDYgKzEyMCw3IEBACiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQ1BNPW0KIENPTkZJR19JMkNfTVBDPXkKK0NPTkZJR19HUElPX01QQzhYWFg9eQogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MPXkKIENPTkZJR19GQj15CkBAIC0yMDYsNyArMjA0LDYgQEAKIENPTkZJR19NQUNfUEFSVElUSU9OPXkKIENPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19ERUJVR19GUz15Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIENPTkZJR19ERUJVR19JTkZPPXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X3NtcF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X3NtcF9kZWZjb25maWcKaW5kZXggOTY5M2Y2ZS4uZGQxZTQxMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9zbXBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZwpAQCAtMTIsMTAgKzEyLDggQEAKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX0VYUEVSVD15CiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKLUNPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKQEAgLTQyLDcgKzQwLDYgQEAKIENPTkZJR19TQkM4NTQ4PXkKIENPTkZJR19RVUlDQ19FTkdJTkU9eQogQ09ORklHX1FFX0dQSU89eQotQ09ORklHX01QQzh4eHhfR1BJTz15CiBDT05GSUdfSElHSE1FTT15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CkBAIC0xMjQsNiArMTIxLDcgQEAKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19DUE09bQogQ09ORklHX0kyQ19NUEM9eQorQ09ORklHX0dQSU9fTVBDOFhYWD15CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9eQogQ09ORklHX0ZCPXkKQEAgLTIwNywxMCArMjA1LDggQEAKIENPTkZJR19NQUNfUEFSVElUSU9OPXkKIENPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19ERUJVR19GUz15Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIENPTkZJR19ERUJVR19JTkZPPXkKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKIENPTkZJR19WSVJRX0RFQlVHPXkKIENPTkZJR19DUllQVE9fUENCQz1tCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM0MHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNDB4X2RlZmNvbmZpZwppbmRleCA3Y2I3MDNiLi4xZWIxOWFjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM0MHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzQweF9kZWZjb25maWcKQEAgLTE0LDcgKzE0LDYgQEAKIENPTkZJR19QUEM0eHhfR1BJTz15CiBDT05GSUdfQUNBRElBPXkKIENPTkZJR19FUDQwNT15Ci1DT05GSUdfSENVND15CiBDT05GSUdfSE9URk9PVD15CiBDT05GSUdfS0lMQVVFQT15CiBDT05GSUdfTUFLQUxVPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZwppbmRleCA4NGE2ODVhNS4uNTM1NzExZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZwpAQCAtNDg1LDMgKzQ4NSw3IEBACiBDT05GSUdfQ1JZUFRPX0xaTz1tCiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAorQ09ORklHX1ZJUlRVQUxJWkFUSU9OPXkKK0NPTkZJR19LVk1fQk9PSzNTXzY0PW0KK0NPTkZJR19LVk1fQk9PSzNTXzY0X0hWPXkKK0NPTkZJR19WSE9TVF9ORVQ9bQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNnh4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzZ4eF9kZWZjb25maWcKaW5kZXggMDQzNjBmOS4uYzQ3ZjJiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNnh4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2eHhfZGVmY29uZmlnCkBAIC03MCw3ICs3MCw3IEBACiBDT05GSUdfUVVJQ0NfRU5HSU5FPXkKIENPTkZJR19RRV9HUElPPXkKIENPTkZJR19QUENfQkVTVENPTU09eQotQ09ORklHX01QQzh4eHhfR1BJTz15CitDT05GSUdfR1BJT19NUEM4WFhYPXkKIENPTkZJR19NQ1VfTVBDODM0OUVNSVRYPW0KIENPTkZJR19ISUdITUVNPXkKIENPTkZJR19OT19IWj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnCmluZGV4IDk2YTU4YjcuLmE3MmYyNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnCkBAIC0zNjIsMyArMzYyLDcgQEAKIENPTkZJR19DUllQVE9fTFpPPW0KICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CitDT05GSUdfVklSVFVBTElaQVRJT049eQorQ09ORklHX0tWTV9CT09LM1NfNjQ9bQorQ09ORklHX0tWTV9CT09LM1NfNjRfSFY9eQorQ09ORklHX1ZIT1NUX05FVD1tCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY29tcGF0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY29tcGF0LmgKaW5kZXggOTEwMTBlOC4uODhlNjAyZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NvbXBhdC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jb21wYXQuaApAQCAtMTAwLDcgKzEwMCw4IEBACiAJY29tcGF0X2ZzaWRfdAlmX2ZzaWQ7CiAJaW50CQlmX25hbWVsZW47CS8qIFN1bk9TIGlnbm9yZXMgdGhpcyBmaWVsZC4gKi8KIAlpbnQJCWZfZnJzaXplOwotCWludAkJZl9zcGFyZVs1XTsKKwlpbnQJCWZfZmxhZ3M7CisJaW50CQlmX3NwYXJlWzRdOwogfTsKIAogI2RlZmluZSBDT01QQVRfUkxJTV9PTERfSU5GSU5JVFkJMHg3ZmZmZmZmZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RldmljZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RldmljZS5oCmluZGV4IDE2ZDI1YzAuLmQ1N2MwOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kZXZpY2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmgKQEAgLTM3LDQgKzM3LDYgQEAKIAl1NjQgZG1hX21hc2s7CiB9OwogCisjZGVmaW5lIEFSQ0hfSEFTX0RNQV9HRVRfUkVRVUlSRURfTUFTSworCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmlybXdhcmUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9maXJtd2FyZS5oCmluZGV4IDNhNmM1ODYuLjE0ZGIyOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9maXJtd2FyZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9maXJtd2FyZS5oCkBAIC00OCw2ICs0OCw4IEBACiAjZGVmaW5lIEZXX0ZFQVRVUkVfQ01PCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAyMDAwMDAwKQogI2RlZmluZSBGV19GRUFUVVJFX1ZQSE4JCUFTTV9DT05TVCgweDAwMDAwMDAwMDQwMDAwMDApCiAjZGVmaW5lIEZXX0ZFQVRVUkVfWENNTwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwODAwMDAwMCkKKyNkZWZpbmUgRldfRkVBVFVSRV9PUEFMCQlBU01fQ09OU1QoMHgwMDAwMDAwMDEwMDAwMDAwKQorI2RlZmluZSBGV19GRUFUVVJFX09QQUx2MglBU01fQ09OU1QoMHgwMDAwMDAwMDIwMDAwMDAwKQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC02NSw2ICs2Nyw4IEBACiAJRldfRkVBVFVSRV9QU0VSSUVTX0FMV0FZUyA9IDAsCiAJRldfRkVBVFVSRV9JU0VSSUVTX1BPU1NJQkxFID0gRldfRkVBVFVSRV9JU0VSSUVTIHwgRldfRkVBVFVSRV9MUEFSLAogCUZXX0ZFQVRVUkVfSVNFUklFU19BTFdBWVMgPSBGV19GRUFUVVJFX0lTRVJJRVMgfCBGV19GRUFUVVJFX0xQQVIsCisJRldfRkVBVFVSRV9QT1dFUk5WX1BPU1NJQkxFID0gRldfRkVBVFVSRV9PUEFMIHwgRldfRkVBVFVSRV9PUEFMdjIsCisJRldfRkVBVFVSRV9QT1dFUk5WX0FMV0FZUyA9IDAsCiAJRldfRkVBVFVSRV9QUzNfUE9TU0lCTEUgPSBGV19GRUFUVVJFX0xQQVIgfCBGV19GRUFUVVJFX1BTM19MVjEsCiAJRldfRkVBVFVSRV9QUzNfQUxXQVlTID0gRldfRkVBVFVSRV9MUEFSIHwgRldfRkVBVFVSRV9QUzNfTFYxLAogCUZXX0ZFQVRVUkVfQ0VMTEVCX1BPU1NJQkxFID0gRldfRkVBVFVSRV9MUEFSIHwgRldfRkVBVFVSRV9CRUFULApAQCAtNzgsNiArODIsOSBAQAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogCQlGV19GRUFUVVJFX0lTRVJJRVNfUE9TU0lCTEUgfAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WCisJCUZXX0ZFQVRVUkVfUE9XRVJOVl9QT1NTSUJMRSB8CisjZW5kaWYKICNpZmRlZiBDT05GSUdfUFBDX1BTMwogCQlGV19GRUFUVVJFX1BTM19QT1NTSUJMRSB8CiAjZW5kaWYKQEAgLTk1LDYgKzEwMiw5IEBACiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAJCUZXX0ZFQVRVUkVfSVNFUklFU19BTFdBWVMgJgogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WCisJCUZXX0ZFQVRVUkVfUE9XRVJOVl9BTFdBWVMgJgorI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BQQ19QUzMKIAkJRldfRkVBVFVSRV9QUzNfQUxXQVlTICYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Zsb3BweS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Zsb3BweS5oCmluZGV4IDI0YmQzNGMuLjkzNmE5MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9mbG9wcHkuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmxvcHB5LmgKQEAgLTEwOCwxMCArMTA4LDEwIEBACiB7CiAJaWYgKGNhbl91c2VfdmlydHVhbF9kbWEpCiAJCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaGFyZGludCwKLQkJCQkgICBJUlFGX0RJU0FCTEVELCAiZmxvcHB5IiwgTlVMTCk7CisJCQkJICAgMCwgImZsb3BweSIsIE5VTEwpOwogCWVsc2UKIAkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsCi0JCQkJICAgSVJRRl9ESVNBQkxFRCwgImZsb3BweSIsIE5VTEwpOworCQkJCSAgIDAsICJmbG9wcHkiLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCB2ZG1hX2RtYV9zZXR1cChjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBtb2RlLCBpbnQgaW8pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h1Z2V0bGIuaAppbmRleCA1ODU2YTY2Li44NjAwNDkzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmgKQEAgLTEsMTUgKzEsNjAgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX0hVR0VUTEJfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfSFVHRVRMQl9ICiAKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAorZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpodWdlcHRlX2NhY2hlOworZXh0ZXJuIHZvaWQgX19pbml0IHJlc2VydmVfaHVnZXRsYl9ncGFnZXModm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgKmh1Z2VwZF9wYWdlKGh1Z2VwZF90IGhwZCkKK3sKKwlCVUdfT04oIWh1Z2VwZF9vayhocGQpKTsKKwlyZXR1cm4gKHB0ZV90ICopKChocGQucGQgJiB+SFVHRVBEX1NISUZUX01BU0spIHwgUERfSFVHRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh1Z2VwZF9zaGlmdChodWdlcGRfdCBocGQpCit7CisJcmV0dXJuIGhwZC5wZCAmIEhVR0VQRF9TSElGVF9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90ICpodWdlcHRlX29mZnNldChodWdlcGRfdCAqaHBkcCwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSAgICB1bnNpZ25lZCBwZHNoaWZ0KQoreworCS8qCisJICogT24gMzItYml0LCB3ZSBoYXZlIG11bHRpcGxlIGhpZ2hlci1sZXZlbCB0YWJsZSBlbnRyaWVzIHRoYXQgcG9pbnQgdG8KKwkgKiB0aGUgc2FtZSBodWdlcHRlLiAgSnVzdCB1c2UgdGhlIGZpcnN0IG9uZSBzaW5jZSB0aGV5J3JlIGFsbAorCSAqIGlkZW50aWNhbC4gIFNvIGZvciB0aGF0IGNhc2UsIGlkeD0wLgorCSAqLworCXVuc2lnbmVkIGxvbmcgaWR4ID0gMDsKKworCXB0ZV90ICpkaXIgPSBodWdlcGRfcGFnZSgqaHBkcCk7CisjaWZkZWYgQ09ORklHX1BQQzY0CisJaWR4ID0gKGFkZHIgJiAoKDFVTCA8PCBwZHNoaWZ0KSAtIDEpKSA+PiBodWdlcGRfc2hpZnQoKmhwZHApOworI2VuZGlmCisKKwlyZXR1cm4gZGlyICsgaWR4OworfQorCiBwdGVfdCAqaHVnZV9wdGVfb2Zmc2V0X2FuZF9zaGlmdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCAqc2hpZnQpOwogCiB2b2lkIGZsdXNoX2RjYWNoZV9pY2FjaGVfaHVnZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX01NX1NMSUNFUykgfHwgZGVmaW5lZChDT05GSUdfUFBDX1NVQlBBR0VfUFJPVCkKIGludCBpc19odWdlcGFnZV9vbmx5X3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICB1bnNpZ25lZCBsb25nIGxlbik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaXNfaHVnZXBhZ2Vfb25seV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3ZvaWQgYm9vazNlX2h1Z2V0bGJfcHJlbG9hZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwgcHRlX3QgcHRlKTsKK3ZvaWQgZmx1c2hfaHVnZXRsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHZtYWRkcik7CiAKIHZvaWQgaHVnZXRsYl9mcmVlX3BnZF9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgZmxvb3IsCkBAIC01MCw4ICs5NSwxMSBAQAogc3RhdGljIGlubGluZSBwdGVfdCBodWdlX3B0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7Ci0JdW5zaWduZWQgbG9uZyBvbGQgPSBwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCB+MFVMLCAxKTsKLQlyZXR1cm4gX19wdGUob2xkKTsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwlyZXR1cm4gX19wdGUocHRlX3VwZGF0ZShtbSwgYWRkciwgcHRlcCwgfjBVTCwgMSkpOworI2Vsc2UKKwlyZXR1cm4gX19wdGUocHRlX3VwZGF0ZShwdGVwLCB+MFVMLCAwKSk7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGh1Z2VfcHRlcF9jbGVhcl9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKQEAgLTkzLDQgKzE0MSwxNSBAQAogewogfQogCisjZWxzZSAvKiAhIENPTkZJR19IVUdFVExCX1BBR0UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNlcnZlX2h1Z2V0bGJfZ3BhZ2VzKHZvaWQpCit7CisJcHJfZXJyKCJDYW5ub3QgcmVzZXJ2ZSBncGFnZXMgd2l0aG91dCBodWdldGxiIGVuYWJsZWRcbiIpOworfQorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2h1Z2V0bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHZtYWRkcikKK3sKK30KKyNlbmRpZgorCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0hVR0VUTEJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va2V4ZWMuaAppbmRleCA4YTMzNjk4Li5mOTIxZWIxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va2V4ZWMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va2V4ZWMuaApAQCAtMiw3ICsyLDcgQEAKICNkZWZpbmUgX0FTTV9QT1dFUlBDX0tFWEVDX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCisjaWYgZGVmaW5lZChDT05GSUdfRlNMX0JPT0tFKSB8fCBkZWZpbmVkKENPTkZJR180NHgpCiAKIC8qCiAgKiBPbiBGU0wtQm9va0Ugd2Ugc2V0dXAgYSAxOjEgbWFwcGluZyB3aGljaCBjb3ZlcnMgdGhlIGZpcnN0IDJHaUIgb2YgbWVtb3J5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmgKaW5kZXggYTRmNmM4NS4uMDhmZTY5ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaApAQCAtMTQ5LDYgKzE0OSwxMiBAQAogI2RlZmluZSBLVk1fU1JFR1NfRV9VUERBVEVfREJTUgkJKDEgPDwgMykKIAogLyoKKyAqIEJvb2szUyBzcGVjaWFsIGJpdHMgdG8gaW5kaWNhdGUgY29udGVudHMgaW4gdGhlIHN0cnVjdCBieSBtYWludGFpbmluZworICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBzdHJ1Y3RzLiBJZiBhZGRpbmcgYSBuZXcgZmllbGQsCisgKiBwbGVhc2UgbWFrZSBzdXJlIHRvIGFkZCBhIGZsYWcgZm9yIHRoYXQgbmV3IGZpZWxkICovCisjZGVmaW5lIEtWTV9TUkVHU19TX0hJT1IJCSgxIDw8IDApCisKKy8qCiAgKiBJbiBLVk1fU0VUX1NSRUdTLCByZXNlcnZlZC9wYWQgZmllbGRzIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQgZnJvbSBhCiAgKiBwcmV2aW91cyBLVk1fR0VUX1JFR1MuCiAgKgpAQCAtMTczLDYgKzE3OSw4IEBACiAJCQkJX191NjQgaWJhdFs4XTsgCiAJCQkJX191NjQgZGJhdFs4XTsgCiAJCQl9IHBwYzMyOworCQkJX191NjQgZmxhZ3M7IC8qIEtWTV9TUkVHU19TXyAqLworCQkJX191NjQgaGlvcjsKIAkJfSBzOwogCQlzdHJ1Y3QgewogCQkJdW5pb24gewpAQCAtMjc2LDYgKzI4NCwxMSBAQAogI2RlZmluZSBLVk1fSU5URVJSVVBUX1VOU0VUCS0yVQogI2RlZmluZSBLVk1fSU5URVJSVVBUX1NFVF9MRVZFTAktM1UKIAorI2RlZmluZSBLVk1fQ1BVXzQ0MAkJMQorI2RlZmluZSBLVk1fQ1BVX0U1MDBWMgkJMgorI2RlZmluZSBLVk1fQ1BVXzNTXzMyCQkzCisjZGVmaW5lIEtWTV9DUFVfM1NfNjQJCTQKKwogLyogZm9yIEtWTV9DQVBfU1BBUFJfVENFICovCiBzdHJ1Y3Qga3ZtX2NyZWF0ZV9zcGFwcl90Y2UgewogCV9fdTY0IGxpb2JuOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKaW5kZXggOThkYTAxMC4uYTM4NGZmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCkBAIC05MCw2ICs5MCw4IEBACiAjZW5kaWYKIAlpbnQgY29udGV4dF9pZFtTSURfQ09OVEVYVFNdOwogCisJYm9vbCBoaW9yX3NyZWdzOwkJLyogSElPUiBpcyBzZXQgYnkgU1JFR1MsIG5vdCBQVlIgKi8KKwogCXN0cnVjdCBobGlzdF9oZWFkIGhwdGVfaGFzaF9wdGVbSFBURUdfSEFTSF9OVU1fUFRFXTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCBocHRlX2hhc2hfcHRlX2xvbmdbSFBURUdfSEFTSF9OVU1fUFRFX0xPTkddOwogCXN0cnVjdCBobGlzdF9oZWFkIGhwdGVfaGFzaF92cHRlW0hQVEVHX0hBU0hfTlVNX1ZQVEVdOwpAQCAtMTM5LDE1ICsxNDEsMTQgQEAKIGV4dGVybiBpbnQga3ZtcHBjX2VtdWxhdGVfcGFpcmVkX3NpbmdsZShzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogZXh0ZXJuIHBmbl90IGt2bXBwY19nZm5fdG9fcGZuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgZ2ZuKTsKIAotZXh0ZXJuIHZvaWQga3ZtcHBjX2hhbmRsZXJfbG93bWVtX3RyYW1wb2xpbmUodm9pZCk7Ci1leHRlcm4gdm9pZCBrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2VudGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQga3ZtcHBjX3JtY2FsbCh1bG9uZyBzcnIwLCB1bG9uZyBzcnIxKTsKK2V4dGVybiB2b2lkIGt2bXBwY19lbnRyeV90cmFtcG9saW5lKHZvaWQpOwogZXh0ZXJuIHZvaWQga3ZtcHBjX2h2X2VudHJ5X3RyYW1wb2xpbmUodm9pZCk7CiBleHRlcm4gdm9pZCBrdm1wcGNfbG9hZF91cF9mcHUodm9pZCk7CiBleHRlcm4gdm9pZCBrdm1wcGNfbG9hZF91cF9hbHRpdmVjKHZvaWQpOwogZXh0ZXJuIHZvaWQga3ZtcHBjX2xvYWRfdXBfdnN4KHZvaWQpOwogZXh0ZXJuIHUzMiBrdm1wcGNfYWxpZ25tZW50X2RzaXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgaW50IGluc3QpOwogZXh0ZXJuIHVsb25nIGt2bXBwY19hbGlnbm1lbnRfZGFyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgaW50IGluc3QpOworZXh0ZXJuIGludCBrdm1wcGNfaF9wcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY21kKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp0b19ib29rM3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpAQCAtMzgyLDYgKzM4MywzOSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb21wdXRlX3RsYmllX3JiKHVuc2lnbmVkIGxvbmcgdiwgdW5zaWduZWQgbG9uZyByLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcHRlX2luZGV4KQoreworCXVuc2lnbmVkIGxvbmcgcmIsIHZhX2xvdzsKKworCXJiID0gKHYgJiB+MHg3ZlVMKSA8PCAxNjsJCS8qIEFWQSBmaWVsZCAqLworCXZhX2xvdyA9IHB0ZV9pbmRleCA+PiAzOworCWlmICh2ICYgSFBURV9WX1NFQ09OREFSWSkKKwkJdmFfbG93ID0gfnZhX2xvdzsKKwkvKiB4b3IgdnNpZCBmcm9tIEFWQSAqLworCWlmICghKHYgJiBIUFRFX1ZfMVRCX1NFRykpCisJCXZhX2xvdyBePSB2ID4+IDEyOworCWVsc2UKKwkJdmFfbG93IF49IHYgPj4gMjQ7CisJdmFfbG93ICY9IDB4N2ZmOworCWlmICh2ICYgSFBURV9WX0xBUkdFKSB7CisJCXJiIHw9IDE7CQkJLyogTCBmaWVsZCAqLworCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDYpICYmCisJCSAgICAociAmIDB4ZmYwMDApKSB7CisJCQkvKiBub24tMTZNQiBsYXJnZSBwYWdlLCBtdXN0IGJlIDY0ayAqLworCQkJLyogKG1hc2tzIGRlcGVuZCBvbiBwYWdlIHNpemUpICovCisJCQlyYiB8PSAweDEwMDA7CQkvKiBwYWdlIGVuY29kaW5nIGluIExQIGZpZWxkICovCisJCQlyYiB8PSAodmFfbG93ICYgMHg3ZikgPDwgMTY7IC8qIDdiIG9mIFZBIGluIEFWQS9MUCBmaWVsZCAqLworCQkJcmIgfD0gKHZhX2xvdyAmIDB4ZmUpOwkvKiBBVkFMIGZpZWxkIChQNyBkb2Vzbid0IHNlZW0gdG8gY2FyZSkgKi8KKwkJfQorCX0gZWxzZSB7CisJCS8qIDRrQiBwYWdlICovCisJCXJiIHw9ICh2YV9sb3cgJiAweDdmZikgPDwgMTI7CS8qIHJlbWFpbmluZyAxMWIgb2YgVkEgKi8KKwl9CisJcmIgfD0gKHYgPj4gNTQpICYgMHgzMDA7CQkvKiBCIGZpZWxkICovCisJcmV0dXJuIHJiOworfQorCiAvKiBNYWdpYyByZWdpc3RlciB2YWx1ZXMgbG9hZGVkIGludG8gcjMgYW5kIHI0IGJlZm9yZSB0aGUgJ3NjJyBhc3NlbWJseQogICogaW5zdHJ1Y3Rpb24gZm9yIHRoZSBPU0kgaHlwZXJjYWxscyAqLwogI2RlZmluZSBPU0lfU0NfTUFHSUNfUjMJCQkweDExMzcyNEZBCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc19hc20uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzX2FzbS5oCmluZGV4IGVmN2IzNjguLjFmMmY1YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzX2FzbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzX2FzbS5oCkBAIC03NSw2ICs3NSw4IEBACiAJdWxvbmcgc2NyYXRjaDA7CiAJdWxvbmcgc2NyYXRjaDE7CiAJdTggaW5fZ3Vlc3Q7CisJdTggcmVzdG9yZV9oaWQ1OworCXU4IG5hcHBpbmc7CiAKICNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IVgogCXN0cnVjdCBrdm1fdmNwdSAqa3ZtX3ZjcHU7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IGNjMjJiMjguLmJmOGFmNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0xOTgsMjEgKzE5OCwyOSBAQAogICovCiBzdHJ1Y3Qga3ZtcHBjX3Zjb3JlIHsKIAlpbnQgbl9ydW5uYWJsZTsKLQlpbnQgbl9ibG9ja2VkOworCWludCBuX2J1c3k7CiAJaW50IG51bV90aHJlYWRzOwogCWludCBlbnRyeV9leGl0X2NvdW50OwogCWludCBuX3dva2VuOwogCWludCBuYXBfY291bnQ7CisJaW50IG5hcHBpbmdfdGhyZWFkczsKIAl1MTYgcGNwdTsKLQl1OCB2Y29yZV9ydW5uaW5nOworCXU4IHZjb3JlX3N0YXRlOwogCXU4IGluX2d1ZXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgcnVubmFibGVfdGhyZWFkczsKIAlzcGlubG9ja190IGxvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CiB9OwogCiAjZGVmaW5lIFZDT1JFX0VOVFJZX0NPVU5UKHZjKQkoKHZjKS0+ZW50cnlfZXhpdF9jb3VudCAmIDB4ZmYpCiAjZGVmaW5lIFZDT1JFX0VYSVRfQ09VTlQodmMpCSgodmMpLT5lbnRyeV9leGl0X2NvdW50ID4+IDgpCiAKKy8qIFZhbHVlcyBmb3IgdmNvcmVfc3RhdGUgKi8KKyNkZWZpbmUgVkNPUkVfSU5BQ1RJVkUJMAorI2RlZmluZSBWQ09SRV9SVU5OSU5HCTEKKyNkZWZpbmUgVkNPUkVfRVhJVElORwkyCisjZGVmaW5lIFZDT1JFX1NMRUVQSU5HCTMKKwogc3RydWN0IGt2bXBwY19wdGUgewogCXVsb25nIGVhZGRyOwogCXU2NCB2cGFnZTsKQEAgLTI1OCwxNCArMjY2LDYgQEAKIAl1bG9uZyBob3N0X3N0YWNrOwogCXUzMiBob3N0X3BpZDsKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szUwotCXVsb25nIGhvc3RfbXNyOwotCXVsb25nIGhvc3RfcjI7Ci0Jdm9pZCAqaG9zdF9yZXRpcDsKLQl1bG9uZyB0cmFtcG9saW5lX2xvd21lbTsKLQl1bG9uZyB0cmFtcG9saW5lX2VudGVyOwotCXVsb25nIGhpZ2htZW1faGFuZGxlcjsKLQl1bG9uZyBybWNhbGw7Ci0JdWxvbmcgaG9zdF9wYWNhX3BoeXM7CiAJc3RydWN0IGt2bXBwY19zbGIgc2xiWzY0XTsKIAlpbnQgc2xiX21heDsJCS8qIDEgKyBpbmRleCBvZiBsYXN0IHZhbGlkIGVudHJ5IGluIHNsYltdICovCiAJaW50IHNsYl9ucjsJCS8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIFNMQiAqLwpAQCAtMzg5LDYgKzM4OSw5IEBACiAJdTggZGNyX2lzX3dyaXRlOwogCXU4IG9zaV9uZWVkZWQ7CiAJdTggb3NpX2VuYWJsZWQ7CisJdTggcGFwcl9lbmFibGVkOworCXU4IHNhbmU7CisJdTggY3B1X3R5cGU7CiAJdTggaGNhbGxfbmVlZGVkOwogCiAJdTMyIGNwcjBfY2ZnYWRkcjsgLyogaG9sZHMgdGhlIGxhc3Qgc2V0IGNwcjBfY2ZnYWRkciAqLwpAQCAtNDA4LDExICs0MTEsMTMgQEAKIAlzdHJ1Y3QgZHRsICpkdGw7CiAJc3RydWN0IGR0bCAqZHRsX2VuZDsKIAorCXdhaXRfcXVldWVfaGVhZF90ICp3cXA7CiAJc3RydWN0IGt2bXBwY192Y29yZSAqdmNvcmU7CiAJaW50IHJldDsKIAlpbnQgdHJhcDsKIAlpbnQgc3RhdGU7CiAJaW50IHB0aWQ7CisJYm9vbCB0aW1lcl9ydW5uaW5nOwogCXdhaXRfcXVldWVfaGVhZF90IGNwdV9ydW47CiAKIAlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaF9zaGFyZWQgKnNoYXJlZDsKQEAgLTQyOCw4ICs0MzMsOSBAQAogI2VuZGlmCiB9OwogCi0jZGVmaW5lIEtWTVBQQ19WQ1BVX0JVU1lfSU5fSE9TVAkwCi0jZGVmaW5lIEtWTVBQQ19WQ1BVX0JMT0NLRUQJCTEKKy8qIFZhbHVlcyBmb3IgdmNwdS0+YXJjaC5zdGF0ZSAqLworI2RlZmluZSBLVk1QUENfVkNQVV9TVE9QUEVECQkwCisjZGVmaW5lIEtWTVBQQ19WQ1BVX0JVU1lfSU5fSE9TVAkxCiAjZGVmaW5lIEtWTVBQQ19WQ1BVX1JVTk5BQkxFCQkyCiAKICNlbmRpZiAvKiBfX1BPV0VSUENfS1ZNX0hPU1RfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaAppbmRleCBkMTIxZjQ5Li40NmVmZDFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmgKQEAgLTY2LDYgKzY2LDcgQEAKIGV4dGVybiBpbnQga3ZtcHBjX2VtdWxhdGVfbW1pbyhzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogZXh0ZXJuIHZvaWQga3ZtcHBjX2VtdWxhdGVfZGVjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBleHRlcm4gdTMyIGt2bXBwY19nZXRfZGVjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHRiKTsKK2V4dGVybiBpbnQga3ZtcHBjX3Nhbml0eV9jaGVjayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiAvKiBDb3JlLXNwZWNpZmljIGhvb2tzICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9sdjFjYWxsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbHYxY2FsbC5oCmluZGV4IDgxNzEzYWMuLmY3N2M3MDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9sdjFjYWxsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2x2MWNhbGwuaApAQCAtMjUsNiArMjUsNyBAQAogI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qIGx2MSBjYWxsIGRlY2xhcmF0aW9uIG1hY3JvcyAqLwogCkBAIC0zMTUsNyArMzE2LDcgQEAKIExWMV9DQUxMKGdwdV9jb250ZXh0X2lvbWFwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgMjIxICkKIExWMV9DQUxMKGdwdV9jb250ZXh0X2F0dHJpYnV0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMCwgMjI1ICkKIExWMV9DQUxMKGdwdV9jb250ZXh0X2ludHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMjI3ICkKLUxWMV9DQUxMKGdwdV9hdHRyaWJ1dGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgMjI4ICkKK0xWMV9DQUxMKGdwdV9hdHRyaWJ1dGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMjI4ICkKIExWMV9DQUxMKGdldF9ydGMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgMjMyICkKIExWMV9DQUxMKHNldF9wcGVfcGVyaW9kaWNfdHJhY2VyX2ZyZXF1ZW5jeSwgICAgICAgICAgICAgMSwgMCwgMjQwICkKIExWMV9DQUxMKHN0YXJ0X3BwZV9wZXJpb2RpY190cmFjZXIsICAgICAgICAgICAgICAgICAgICAgNSwgMCwgMjQxICkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCmluZGV4IDQ3Y2FjZGRiLi5iNTQwZDZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKQEAgLTg1LDggKzg2LDkgQEAKIAl2b2lkCQkoKnBjaV9kbWFfZGV2X3NldHVwKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAl2b2lkCQkoKnBjaV9kbWFfYnVzX3NldHVwKShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIAotCS8qIFBsYXRmb3JtIHNldF9kbWFfbWFzayBvdmVycmlkZSAqLworCS8qIFBsYXRmb3JtIHNldF9kbWFfbWFzayBhbmQgZG1hX2dldF9yZXF1aXJlZF9tYXNrIG92ZXJyaWRlcyAqLwogCWludAkJKCpkbWFfc2V0X21hc2spKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKTsKKwl1NjQJCSgqZG1hX2dldF9yZXF1aXJlZF9tYXNrKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiAJaW50CQkoKnByb2JlKSh2b2lkKTsKIAl2b2lkCQkoKnNldHVwX2FyY2gpKHZvaWQpOyAvKiBPcHRpb25hbCwgbWF5IGJlIE5VTEwgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oCmluZGV4IDNlYTBmOWEuLjAyNjBlYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaApAQCAtNjYsNiArNjYsNyBAQAogI2RlZmluZSBNQVMyX00JCQkweDAwMDAwMDA0CiAjZGVmaW5lIE1BUzJfRwkJCTB4MDAwMDAwMDIKICNkZWZpbmUgTUFTMl9FCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNQVMyX1dJTUdFX01BU0sJCTB4MDAwMDAwMWYKICNkZWZpbmUgTUFTMl9FUE5fTUFTSyhzaXplKQkJKH4wIDw8IChzaXplICsgMTApKQogI2RlZmluZSBNQVMyX1ZBTChhZGRyLCBzaXplLCBmbGFncykJKChhZGRyKSAmIE1BUzJfRVBOX01BU0soc2l6ZSkgfCAoZmxhZ3MpKQogCkBAIC04MCw2ICs4MSw3IEBACiAjZGVmaW5lIE1BUzNfU1cJCQkweDAwMDAwMDA0CiAjZGVmaW5lIE1BUzNfVVIJCQkweDAwMDAwMDAyCiAjZGVmaW5lIE1BUzNfU1IJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1BUzNfQkFQX01BU0sJCTB4MDAwMDAwM2YKICNkZWZpbmUgTUFTM19TUFNJWkUJCTB4MDAwMDAwM2UKICNkZWZpbmUgTUFTM19TUFNJWkVfU0hJRlQJMQogCkBAIC0yMTIsNiArMjE0LDExIEBACiAJdW5zaWduZWQgaW50CWlkOwogCXVuc2lnbmVkIGludAlhY3RpdmU7CiAJdW5zaWduZWQgbG9uZwl2ZHNvX2Jhc2U7CisjaWZkZWYgQ09ORklHX1BQQ19NTV9TTElDRVMKKwl1NjQgbG93X3NsaWNlc19wc2l6ZTsgICAvKiBTTEIgcGFnZSBzaXplIGVuY29kaW5ncyAqLworCXU2NCBoaWdoX3NsaWNlc19wc2l6ZTsgIC8qIDQgYml0cyBwZXIgc2xpY2UgZm9yIG5vdyAqLworCXUxNiB1c2VyX3BzaXplOyAgICAgICAgIC8qIHBhZ2Ugc2l6ZSBpbmRleCAqLworI2VuZGlmCiB9IG1tX2NvbnRleHRfdDsKIAogLyogUGFnZSBzaXplIGRlZmluaXRpb25zLCBjb21tb24gYmV0d2VlbiAzMiBhbmQgNjQtYml0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWhhc2g2NC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1oYXNoNjQuaAppbmRleCBiNDQ1ZTBhLi5kYjY0NWVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWhhc2g2NC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtaGFzaDY0LmgKQEAgLTI2Miw4ICsyNjIsNyBAQAogZXh0ZXJuIGludCBodGFiX2JvbHRfbWFwcGluZyh1bnNpZ25lZCBsb25nIHZzdGFydCwgdW5zaWduZWQgbG9uZyB2ZW5kLAogCQkJICAgICB1bnNpZ25lZCBsb25nIHBzdGFydCwgdW5zaWduZWQgbG9uZyBwcm90LAogCQkJICAgICBpbnQgcHNpemUsIGludCBzc2l6ZSk7Ci1leHRlcm4gdm9pZCBhZGRfZ3BhZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZSwKLQkJCSAgdW5zaWduZWQgbG9uZyBudW1iZXJfb2ZfcGFnZXMpOworZXh0ZXJuIHZvaWQgYWRkX2dwYWdlKHU2NCBhZGRyLCB1NjQgcGFnZV9zaXplLCB1bnNpZ25lZCBsb25nIG51bWJlcl9vZl9wYWdlcyk7CiBleHRlcm4gdm9pZCBkZW1vdGVfc2VnbWVudF80ayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKIAogZXh0ZXJuIHZvaWQgaHB0ZV9pbml0X25hdGl2ZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCA2OThiMzA2Li5mMDE0NTUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS5oCkBAIC0xNzUsMTQgKzE3NSwxNiBAQAogI2RlZmluZSBNTVVfUEFHRV82NEtfQVAJMwkvKiAiQWRtaXhlZCBwYWdlcyIgKGhhc2g2NCBvbmx5KSAqLwogI2RlZmluZSBNTVVfUEFHRV8yNTZLCTQKICNkZWZpbmUgTU1VX1BBR0VfMU0JNQotI2RlZmluZSBNTVVfUEFHRV84TQk2Ci0jZGVmaW5lIE1NVV9QQUdFXzE2TQk3Ci0jZGVmaW5lIE1NVV9QQUdFXzI1Nk0JOAotI2RlZmluZSBNTVVfUEFHRV8xRwk5Ci0jZGVmaW5lIE1NVV9QQUdFXzE2RwkxMAotI2RlZmluZSBNTVVfUEFHRV82NEcJMTEKLSNkZWZpbmUgTU1VX1BBR0VfQ09VTlQJMTIKKyNkZWZpbmUgTU1VX1BBR0VfNE0JNgorI2RlZmluZSBNTVVfUEFHRV84TQk3CisjZGVmaW5lIE1NVV9QQUdFXzE2TQk4CisjZGVmaW5lIE1NVV9QQUdFXzY0TQk5CisjZGVmaW5lIE1NVV9QQUdFXzI1Nk0JMTAKKyNkZWZpbmUgTU1VX1BBR0VfMUcJMTEKKyNkZWZpbmUgTU1VX1BBR0VfMTZHCTEyCisjZGVmaW5lIE1NVV9QQUdFXzY0RwkxMwogCisjZGVmaW5lIE1NVV9QQUdFX0NPVU5UCTE0CiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfU1REX01NVV82NCkKIC8qIDY0LWJpdCBjbGFzc2ljIGhhc2ggdGFibGUgTU1VICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21waWMuaAppbmRleCBkZjE4OTg5Li5lNmZhZTQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGljLmgKQEAgLTI3Myw4ICsyNzMsNiBAQAogCXVuc2lnbmVkIGludAkJaXJxX2NvdW50OwogCS8qIE51bWJlciBvZiBzb3VyY2VzICovCiAJdW5zaWduZWQgaW50CQludW1fc291cmNlczsKLQkvKiBOdW1iZXIgb2YgQ1BVcyAqLwotCXVuc2lnbmVkIGludAkJbnVtX2NwdXM7CiAJLyogZGVmYXVsdCBzZW5zZXMgYXJyYXkgKi8KIAl1bnNpZ25lZCBjaGFyCQkqc2Vuc2VzOwogCXVuc2lnbmVkIGludAkJc2Vuc2VzX2NvdW50OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5M2U4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmgKQEAgLTAsMCArMSw0NDMgQEAKKy8qCisgKiBQb3dlck5WIE9QQUwgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IDIwMTEgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fT1BBTF9ICisjZGVmaW5lIF9fT1BBTF9ICisKKy8qKioqKiogVGFrZW92ZXIgaW50ZXJmYWNlICoqKioqKioqLworCisvKiBQQVBSIEgtQ2FsbCB1c2VkIHRvIHF1ZXJ0eSB0aGUgSEFMIGV4aXN0ZW5jZSBhbmQvb3IgaW5zdGFuY2lhdGUKKyAqIGl0IGZyb20gd2l0aGluIHBIeXAgKHRlY2ggcHJldmlldyBvbmx5KS4KKyAqCisgKiBUaGlzIGlzIGV4Y2x1c2l2ZWx5IHVzZWQgaW4gcHJvbV9pbml0LmMKKyAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCitzdHJ1Y3Qgb3BhbF90YWtlb3Zlcl9hcmdzIHsKKwl1NjQJa19pbWFnZTsJCS8qIHI0ICovCisJdTY0CWtfc2l6ZTsJCQkvKiByNSAqLworCXU2NAlrX2VudHJ5OwkJLyogcjYgKi8KKwl1NjQJa19lbnRyeTI7CQkvKiByNyAqLworCXU2NAloYWxfYWRkcjsJCS8qIHI4ICovCisJdTY0CXJkX2ltYWdlOwkJLyogcjkgKi8KKwl1NjQJcmRfc2l6ZTsJCS8qIHIxMCAqLworCXU2NAlyZF9sb2M7CQkJLyogcjExICovCit9OworCitleHRlcm4gbG9uZyBvcGFsX3F1ZXJ5X3Rha2VvdmVyKHU2NCAqaGFsX3NpemUsIHU2NCAqaGFsX2FsaWduKTsKKworZXh0ZXJuIGxvbmcgb3BhbF9kb190YWtlb3ZlcihzdHJ1Y3Qgb3BhbF90YWtlb3Zlcl9hcmdzICphcmdzKTsKKworc3RydWN0IHJ0YXNfYXJnczsKK2V4dGVybiBpbnQgb3BhbF9lbnRlcl9ydGFzKHN0cnVjdCBydGFzX2FyZ3MgKmFyZ3MsCisJCQkgICB1bnNpZ25lZCBsb25nIGRhdGEsCisJCQkgICB1bnNpZ25lZCBsb25nIGVudHJ5KTsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisvKioqKioqIE9QQUwgQVBJcyAqKioqKiovCisKKy8qIFJldHVybiBjb2RlcyAqLworI2RlZmluZSBPUEFMX1NVQ0NFU1MgCQkwCisjZGVmaW5lIE9QQUxfUEFSQU1FVEVSCQktMQorI2RlZmluZSBPUEFMX0JVU1kJCS0yCisjZGVmaW5lIE9QQUxfUEFSVElBTAkJLTMKKyNkZWZpbmUgT1BBTF9DT05TVFJBSU5FRAktNAorI2RlZmluZSBPUEFMX0NMT1NFRAkJLTUKKyNkZWZpbmUgT1BBTF9IQVJEV0FSRQkJLTYKKyNkZWZpbmUgT1BBTF9VTlNVUFBPUlRFRAktNworI2RlZmluZSBPUEFMX1BFUk1JU1NJT04JCS04CisjZGVmaW5lIE9QQUxfTk9fTUVNCQktOQorI2RlZmluZSBPUEFMX1JFU09VUkNFCQktMTAKKyNkZWZpbmUgT1BBTF9JTlRFUk5BTF9FUlJPUgktMTEKKyNkZWZpbmUgT1BBTF9CVVNZX0VWRU5UCQktMTIKKyNkZWZpbmUgT1BBTF9IQVJEV0FSRV9GUk9aRU4JLTEzCisKKy8qIEFQSSBUb2tlbnMgKGluIHIwKSAqLworI2RlZmluZSBPUEFMX0NPTlNPTEVfV1JJVEUJCQkxCisjZGVmaW5lIE9QQUxfQ09OU09MRV9SRUFECQkJMgorI2RlZmluZSBPUEFMX1JUQ19SRUFECQkJCTMKKyNkZWZpbmUgT1BBTF9SVENfV1JJVEUJCQkJNAorI2RlZmluZSBPUEFMX0NFQ19QT1dFUl9ET1dOCQkJNQorI2RlZmluZSBPUEFMX0NFQ19SRUJPT1QJCQkJNgorI2RlZmluZSBPUEFMX1JFQURfTlZSQU0JCQkJNworI2RlZmluZSBPUEFMX1dSSVRFX05WUkFNCQkJOAorI2RlZmluZSBPUEFMX0hBTkRMRV9JTlRFUlJVUFQJCQk5CisjZGVmaW5lIE9QQUxfUE9MTF9FVkVOVFMJCQkxMAorI2RlZmluZSBPUEFMX1BDSV9TRVRfSFVCX1RDRV9NRU1PUlkJCTExCisjZGVmaW5lIE9QQUxfUENJX1NFVF9QSEJfVENFX01FTU9SWQkJMTIKKyNkZWZpbmUgT1BBTF9QQ0lfQ09ORklHX1JFQURfQllURQkJMTMKKyNkZWZpbmUgT1BBTF9QQ0lfQ09ORklHX1JFQURfSEFMRl9XT1JEICAJMTQKKyNkZWZpbmUgT1BBTF9QQ0lfQ09ORklHX1JFQURfV09SRAkJMTUKKyNkZWZpbmUgT1BBTF9QQ0lfQ09ORklHX1dSSVRFX0JZVEUJCTE2CisjZGVmaW5lIE9QQUxfUENJX0NPTkZJR19XUklURV9IQUxGX1dPUkQJCTE3CisjZGVmaW5lIE9QQUxfUENJX0NPTkZJR19XUklURV9XT1JECQkxOAorI2RlZmluZSBPUEFMX1NFVF9YSVZFCQkJCTE5CisjZGVmaW5lIE9QQUxfR0VUX1hJVkUJCQkJMjAKKyNkZWZpbmUgT1BBTF9HRVRfQ09NUExFVElPTl9UT0tFTl9TVEFUVVMJMjEgLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgT1BBTF9SRUdJU1RFUl9PUEFMX0VYQ0VQVElPTl9IQU5ETEVSCTIyCisjZGVmaW5lIE9QQUxfUENJX0VFSF9GUkVFWkVfU1RBVFVTCQkyMworI2RlZmluZSBPUEFMX1BDSV9TSFBDCQkJCTI0CisjZGVmaW5lIE9QQUxfQ09OU09MRV9XUklURV9CVUZGRVJfU1BBQ0UJCTI1CisjZGVmaW5lIE9QQUxfUENJX0VFSF9GUkVFWkVfQ0xFQVIJCTI2CisjZGVmaW5lIE9QQUxfUENJX1BIQl9NTUlPX0VOQUJMRQkJMjcKKyNkZWZpbmUgT1BBTF9QQ0lfU0VUX1BIQl9NRU1fV0lORE9XCQkyOAorI2RlZmluZSBPUEFMX1BDSV9NQVBfUEVfTU1JT19XSU5ET1cJCTI5CisjZGVmaW5lIE9QQUxfUENJX1NFVF9QSEJfVEFCTEVfTUVNT1JZCQkzMAorI2RlZmluZSBPUEFMX1BDSV9TRVRfUEUJCQkJMzEKKyNkZWZpbmUgT1BBTF9QQ0lfU0VUX1BFTFRWCQkJMzIKKyNkZWZpbmUgT1BBTF9QQ0lfU0VUX01WRQkJCTMzCisjZGVmaW5lIE9QQUxfUENJX1NFVF9NVkVfRU5BQkxFCQkJMzQKKyNkZWZpbmUgT1BBTF9QQ0lfR0VUX1hJVkVfUkVJU1NVRQkJMzUKKyNkZWZpbmUgT1BBTF9QQ0lfU0VUX1hJVkVfUkVJU1NVRQkJMzYKKyNkZWZpbmUgT1BBTF9QQ0lfU0VUX1hJVkVfUEUJCQkzNworI2RlZmluZSBPUEFMX0dFVF9YSVZFX1NPVVJDRQkJCTM4CisjZGVmaW5lIE9QQUxfR0VUX01TSV8zMgkJCQkzOQorI2RlZmluZSBPUEFMX0dFVF9NU0lfNjQJCQkJNDAKKyNkZWZpbmUgT1BBTF9TVEFSVF9DUFUJCQkJNDEKKyNkZWZpbmUgT1BBTF9RVUVSWV9DUFVfU1RBVFVTCQkJNDIKKyNkZWZpbmUgT1BBTF9XUklURV9PUFBBTkVMCQkJNDMKKyNkZWZpbmUgT1BBTF9QQ0lfTUFQX1BFX0RNQV9XSU5ET1cJCTQ0CisjZGVmaW5lIE9QQUxfUENJX01BUF9QRV9ETUFfV0lORE9XX1JFQUwJCTQ1CisjZGVmaW5lIE9QQUxfUENJX1JFU0VUCQkJCTQ5CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qIE90aGVyIGVudW1zICovCitlbnVtIE9wYWxWZW5kb3JBcGlUb2tlbnMgeworCU9QQUxfU1RBUlRfVkVORE9SX0FQSV9SQU5HRSA9IDEwMDAsIE9QQUxfRU5EX1ZFTkRPUl9BUElfUkFOR0UgPSAxOTk5Cit9OworZW51bSBPcGFsRnJlZXplU3RhdGUgeworCU9QQUxfRUVIX1NUT1BQRURfTk9UX0ZST1pFTiA9IDAsCisJT1BBTF9FRUhfU1RPUFBFRF9NTUlPX0ZSRUVaRSA9IDEsCisJT1BBTF9FRUhfU1RPUFBFRF9ETUFfRlJFRVpFID0gMiwKKwlPUEFMX0VFSF9TVE9QUEVEX01NSU9fRE1BX0ZSRUVaRSA9IDMsCisJT1BBTF9FRUhfU1RPUFBFRF9SRVNFVCA9IDQsCisJT1BBTF9FRUhfU1RPUFBFRF9URU1QX1VOQVZBSUwgPSA1LAorCU9QQUxfRUVIX1NUT1BQRURfUEVSTV9VTkFWQUlMID0gNgorfTsKK2VudW0gT3BhbEVlaEZyZWV6ZUFjdGlvblRva2VuIHsKKwlPUEFMX0VFSF9BQ1RJT05fQ0xFQVJfRlJFRVpFX01NSU8gPSAxLAorCU9QQUxfRUVIX0FDVElPTl9DTEVBUl9GUkVFWkVfRE1BID0gMiwKKwlPUEFMX0VFSF9BQ1RJT05fQ0xFQVJfRlJFRVpFX0FMTCA9IDMKK307CitlbnVtIE9wYWxQY2lTdGF0dXNUb2tlbiB7CisJT1BBTF9FRUhfUEhCX05PX0VSUk9SID0gMCwKKwlPUEFMX0VFSF9QSEJfRkFUQUwgPSAxLAorCU9QQUxfRUVIX1BIQl9SRUNPVkVSQUJMRSA9IDIsCisJT1BBTF9FRUhfUEhCX0JVU19FUlJPUiA9IDMsCisJT1BBTF9FRUhfUENJX05PX0RFVlNFTCA9IDQsCisJT1BBTF9FRUhfUENJX1RBID0gNSwKKwlPUEFMX0VFSF9QQ0lFWF9VUiA9IDYsCisJT1BBTF9FRUhfUENJRVhfQ0EgPSA3LAorCU9QQUxfRUVIX1BDSV9NTUlPX0VSUk9SID0gOCwKKwlPUEFMX0VFSF9QQ0lfRE1BX0VSUk9SID0gOQorfTsKK2VudW0gT3BhbFNocGNBY3Rpb24geworCU9QQUxfU0hQQ19HRVRfTElOS19TVEFURSA9IDAsCisJT1BBTF9TSFBDX0dFVF9TTE9UX1NUQVRFID0gMQorfTsKK2VudW0gT3BhbFNocGNMaW5rU3RhdGUgeworCU9QQUxfU0hQQ19MSU5LX0RPV04gPSAwLAorCU9QQUxfU0hQQ19MSU5LX1VQID0gMQorfTsKK2VudW0gT3BhbE1taW9XaW5kb3dUeXBlIHsKKwlPUEFMX00zMl9XSU5ET1dfVFlQRSA9IDEsCisJT1BBTF9NNjRfV0lORE9XX1RZUEUgPSAyLAorCU9QQUxfSU9fV0lORE9XX1RZUEUgPSAzCit9OworZW51bSBPcGFsU2hwY1Nsb3RTdGF0ZSB7CisJT1BBTF9TSFBDX0RFVl9OT1RfUFJFU0VOVCA9IDAsCisJT1BBTF9TSFBDX0RFVl9QUkVTRU5UID0gMQorfTsKK2VudW0gT3BhbEV4Y2VwdGlvbkhhbmRsZXIgeworCU9QQUxfTUFDSElORV9DSEVDS19IQU5ETEVSID0gMSwKKwlPUEFMX0hZUEVSVklTT1JfTUFJTlRFTkFOQ0VfSEFORExFUiA9IDIsCisJT1BBTF9TT0ZUUEFUQ0hfSEFORExFUiA9IDMKK307CitlbnVtIE9wYWxQZW5kaW5nU3RhdGUgeworCU9QQUxfRVZFTlRfT1BBTF9JTlRFUk5BTCA9IDB4MSwKKwlPUEFMX0VWRU5UX05WUkFNID0gMHgyLAorCU9QQUxfRVZFTlRfUlRDID0gMHg0LAorCU9QQUxfRVZFTlRfQ09OU09MRV9PVVRQVVQgPSAweDgsCisJT1BBTF9FVkVOVF9DT05TT0xFX0lOUFVUID0gMHgxMAorfTsKKworLyogTWFjaGluZSBjaGVjayByZWxhdGVkIGRlZmluaXRpb25zICovCitlbnVtIE9wYWxNQ0VfVmVyc2lvbiB7CisJT3BhbE1DRV9WMSA9IDEsCit9OworCitlbnVtIE9wYWxNQ0VfU2V2ZXJpdHkgeworCU9wYWxNQ0VfU0VWX05PX0VSUk9SID0gMCwKKwlPcGFsTUNFX1NFVl9XQVJOSU5HID0gMSwKKwlPcGFsTUNFX1NFVl9FUlJPUl9TWU5DID0gMiwKKwlPcGFsTUNFX1NFVl9GQVRBTCA9IDMsCit9OworCitlbnVtIE9wYWxNQ0VfRGlzcG9zaXRpb24geworCU9wYWxNQ0VfRElTUE9TSVRJT05fUkVDT1ZFUkVEID0gMCwKKwlPcGFsTUNFX0RJU1BPU0lUSU9OX05PVF9SRUNPVkVSRUQgPSAxLAorfTsKKworZW51bSBPcGFsTUNFX0luaXRpYXRvciB7CisJT3BhbE1DRV9JTklUSUFUT1JfVU5LTk9XTiA9IDAsCisJT3BhbE1DRV9JTklUSUFUT1JfQ1BVID0gMSwKK307CisKK2VudW0gT3BhbE1DRV9FcnJvclR5cGUgeworCU9wYWxNQ0VfRVJST1JfVFlQRV9VTktOT1dOID0gMCwKKwlPcGFsTUNFX0VSUk9SX1RZUEVfVUUgPSAxLAorCU9wYWxNQ0VfRVJST1JfVFlQRV9TTEIgPSAyLAorCU9wYWxNQ0VfRVJST1JfVFlQRV9FUkFUID0gMywKKwlPcGFsTUNFX0VSUk9SX1RZUEVfVExCID0gNCwKK307CisKK2VudW0gT3BhbE1DRV9VZUVycm9yVHlwZSB7CisJT3BhbE1DRV9VRV9FUlJPUl9JTkRFVEVSTUlOQVRFID0gMCwKKwlPcGFsTUNFX1VFX0VSUk9SX0lGRVRDSCA9IDEsCisJT3BhbE1DRV9VRV9FUlJPUl9QQUdFX1RBQkxFX1dBTEtfSUZFVENIID0gMiwKKwlPcGFsTUNFX1VFX0VSUk9SX0xPQURfU1RPUkUgPSAzLAorCU9wYWxNQ0VfVUVfRVJST1JfUEFHRV9UQUJMRV9XQUxLX0xPQURfU1RPUkUgPSA0LAorfTsKKworZW51bSBPcGFsTUNFX1NsYkVycm9yVHlwZSB7CisJT3BhbE1DRV9TTEJfRVJST1JfSU5ERVRFUk1JTkFURSA9IDAsCisJT3BhbE1DRV9TTEJfRVJST1JfUEFSSVRZID0gMSwKKwlPcGFsTUNFX1NMQl9FUlJPUl9NVUxUSUhJVCA9IDIsCit9OworCitlbnVtIE9wYWxNQ0VfRXJhdEVycm9yVHlwZSB7CisJT3BhbE1DRV9FUkFUX0VSUk9SX0lOREVURVJNSU5BVEUgPSAwLAorCU9wYWxNQ0VfRVJBVF9FUlJPUl9QQVJJVFkgPSAxLAorCU9wYWxNQ0VfRVJBVF9FUlJPUl9NVUxUSUhJVCA9IDIsCit9OworCitlbnVtIE9wYWxNQ0VfVGxiRXJyb3JUeXBlIHsKKwlPcGFsTUNFX1RMQl9FUlJPUl9JTkRFVEVSTUlOQVRFID0gMCwKKwlPcGFsTUNFX1RMQl9FUlJPUl9QQVJJVFkgPSAxLAorCU9wYWxNQ0VfVExCX0VSUk9SX01VTFRJSElUID0gMiwKK307CisKK2VudW0gT3BhbFRocmVhZFN0YXR1cyB7CisJT1BBTF9USFJFQURfSU5BQ1RJVkUgPSAweDAsCisJT1BBTF9USFJFQURfU1RBUlRFRCA9IDB4MQorfTsKKworZW51bSBPcGFsUGNpQnVzQ29tcGFyZSB7CisJT3BhbFBjaUJ1c0FueQk9IDAsCS8qIEFueSBidXMgbnVtYmVyIG1hdGNoICovCisJT3BhbFBjaUJ1czNCaXRzCT0gMiwJLyogTWF0Y2ggdG9wIDMgYml0cyBvZiBidXMgbnVtYmVyICovCisJT3BhbFBjaUJ1czRCaXRzCT0gMywJLyogTWF0Y2ggdG9wIDQgYml0cyBvZiBidXMgbnVtYmVyICovCisJT3BhbFBjaUJ1czVCaXRzCT0gNCwJLyogTWF0Y2ggdG9wIDUgYml0cyBvZiBidXMgbnVtYmVyICovCisJT3BhbFBjaUJ1czZCaXRzCT0gNSwJLyogTWF0Y2ggdG9wIDYgYml0cyBvZiBidXMgbnVtYmVyICovCisJT3BhbFBjaUJ1czdCaXRzCT0gNiwJLyogTWF0Y2ggdG9wIDcgYml0cyBvZiBidXMgbnVtYmVyICovCisJT3BhbFBjaUJ1c0FsbAk9IDcsCS8qIE1hdGNoIGJ1cyBudW1iZXIgZXhhY3RseSAqLworfTsKKworZW51bSBPcGFsRGV2aWNlQ29tcGFyZSB7CisJT1BBTF9JR05PUkVfUklEX0RFVklDRV9OVU1CRVIgPSAwLAorCU9QQUxfQ09NUEFSRV9SSURfREVWSUNFX05VTUJFUiA9IDEKK307CisKK2VudW0gT3BhbEZ1bmNDb21wYXJlIHsKKwlPUEFMX0lHTk9SRV9SSURfRlVOQ1RJT05fTlVNQkVSID0gMCwKKwlPUEFMX0NPTVBBUkVfUklEX0ZVTkNUSU9OX05VTUJFUiA9IDEKK307CisKK2VudW0gT3BhbFBlQWN0aW9uIHsKKwlPUEFMX1VOTUFQX1BFID0gMCwKKwlPUEFMX01BUF9QRSA9IDEKK307CisKK2VudW0gT3BhbFBjaVJlc2V0QW5kUmVpbml0U2NvcGUgeworCU9QQUxfUEhCX0NPTVBMRVRFID0gMSwgT1BBTF9QQ0lfTElOSyA9IDIsIE9QQUxfUEhCX0VSUk9SID0gMywKKwlPUEFMX1BDSV9IT1RfUkVTRVQgPSA0LCBPUEFMX1BDSV9GVU5EQU1FTlRBTF9SRVNFVCA9IDUsCisJT1BBTF9QQ0lfSU9EQV9SRVNFVCA9IDYsCit9OworCitlbnVtIE9wYWxQY2lSZXNldFN0YXRlIHsgT1BBTF9ERUFTU0VSVF9SRVNFVCA9IDAsIE9QQUxfQVNTRVJUX1JFU0VUID0gMSB9OworCitzdHJ1Y3Qgb3BhbF9tYWNoaW5lX2NoZWNrX2V2ZW50IHsKKwllbnVtIE9wYWxNQ0VfVmVyc2lvbgl2ZXJzaW9uOjg7CS8qIDB4MDAgKi8KKwl1aW50OF90CQkJaW5fdXNlOwkJLyogMHgwMSAqLworCWVudW0gT3BhbE1DRV9TZXZlcml0eQlzZXZlcml0eTo4OwkvKiAweDAyICovCisJZW51bSBPcGFsTUNFX0luaXRpYXRvcglpbml0aWF0b3I6ODsJLyogMHgwMyAqLworCWVudW0gT3BhbE1DRV9FcnJvclR5cGUJZXJyb3JfdHlwZTo4OwkvKiAweDA0ICovCisJZW51bSBPcGFsTUNFX0Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uOjg7IC8qIDB4MDUgKi8KKwl1aW50OF90CQkJcmVzZXJ2ZWRfMVsyXTsJLyogMHgwNiAqLworCXVpbnQ2NF90CQlncHIzOwkJLyogMHgwOCAqLworCXVpbnQ2NF90CQlzcnIwOwkJLyogMHgxMCAqLworCXVpbnQ2NF90CQlzcnIxOwkJLyogMHgxOCAqLworCXVuaW9uIHsJCQkJCS8qIDB4MjAgKi8KKwkJc3RydWN0IHsKKwkJCWVudW0gT3BhbE1DRV9VZUVycm9yVHlwZSB1ZV9lcnJvcl90eXBlOjg7CisJCQl1aW50OF90CQllZmZlY3RpdmVfYWRkcmVzc19wcm92aWRlZDsKKwkJCXVpbnQ4X3QJCXBoeXNpY2FsX2FkZHJlc3NfcHJvdmlkZWQ7CisJCQl1aW50OF90CQlyZXNlcnZlZF8xWzVdOworCQkJdWludDY0X3QJZWZmZWN0aXZlX2FkZHJlc3M7CisJCQl1aW50NjRfdAlwaHlzaWNhbF9hZGRyZXNzOworCQkJdWludDhfdAkJcmVzZXJ2ZWRfMls4XTsKKwkJfSB1ZV9lcnJvcjsKKworCQlzdHJ1Y3QgeworCQkJZW51bSBPcGFsTUNFX1NsYkVycm9yVHlwZSBzbGJfZXJyb3JfdHlwZTo4OworCQkJdWludDhfdAkJZWZmZWN0aXZlX2FkZHJlc3NfcHJvdmlkZWQ7CisJCQl1aW50OF90CQlyZXNlcnZlZF8xWzZdOworCQkJdWludDY0X3QJZWZmZWN0aXZlX2FkZHJlc3M7CisJCQl1aW50OF90CQlyZXNlcnZlZF8yWzE2XTsKKwkJfSBzbGJfZXJyb3I7CisKKwkJc3RydWN0IHsKKwkJCWVudW0gT3BhbE1DRV9FcmF0RXJyb3JUeXBlIGVyYXRfZXJyb3JfdHlwZTo4OworCQkJdWludDhfdAkJZWZmZWN0aXZlX2FkZHJlc3NfcHJvdmlkZWQ7CisJCQl1aW50OF90CQlyZXNlcnZlZF8xWzZdOworCQkJdWludDY0X3QJZWZmZWN0aXZlX2FkZHJlc3M7CisJCQl1aW50OF90CQlyZXNlcnZlZF8yWzE2XTsKKwkJfSBlcmF0X2Vycm9yOworCisJCXN0cnVjdCB7CisJCQllbnVtIE9wYWxNQ0VfVGxiRXJyb3JUeXBlIHRsYl9lcnJvcl90eXBlOjg7CisJCQl1aW50OF90CQllZmZlY3RpdmVfYWRkcmVzc19wcm92aWRlZDsKKwkJCXVpbnQ4X3QJCXJlc2VydmVkXzFbNl07CisJCQl1aW50NjRfdAllZmZlY3RpdmVfYWRkcmVzczsKKwkJCXVpbnQ4X3QJCXJlc2VydmVkXzJbMTZdOworCQl9IHRsYl9lcnJvcjsKKwl9IHU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBvcHBhbmVsX2xpbmUgeworCS8qIFhYWCAqLworfSBvcHBhbmVsX2xpbmVfdDsKKworLyogQVBJIGZ1bmN0aW9ucyAqLworaW50NjRfdCBvcGFsX2NvbnNvbGVfd3JpdGUoaW50NjRfdCB0ZXJtX251bWJlciwgaW50NjRfdCAqbGVuZ3RoLAorCQkJICAgY29uc3QgdWludDhfdCAqYnVmZmVyKTsKK2ludDY0X3Qgb3BhbF9jb25zb2xlX3JlYWQoaW50NjRfdCB0ZXJtX251bWJlciwgaW50NjRfdCAqbGVuZ3RoLAorCQkJICB1aW50OF90ICpidWZmZXIpOworaW50NjRfdCBvcGFsX2NvbnNvbGVfd3JpdGVfYnVmZmVyX3NwYWNlKGludDY0X3QgdGVybV9udW1iZXIsCisJCQkJCWludDY0X3QgKmxlbmd0aCk7CitpbnQ2NF90IG9wYWxfcnRjX3JlYWQodWludDMyX3QgKnllYXJfbW9udGhfZGF5LAorCQkgICAgICB1aW50NjRfdCAqaG91cl9taW51dGVfc2Vjb25kX21pbGxpc2Vjb25kKTsKK2ludDY0X3Qgb3BhbF9ydGNfd3JpdGUodWludDMyX3QgeWVhcl9tb250aF9kYXksCisJCSAgICAgICB1aW50NjRfdCBob3VyX21pbnV0ZV9zZWNvbmRfbWlsbGlzZWNvbmQpOworaW50NjRfdCBvcGFsX2NlY19wb3dlcl9kb3duKHVpbnQ2NF90IHJlcXVlc3QpOworaW50NjRfdCBvcGFsX2NlY19yZWJvb3Qodm9pZCk7CitpbnQ2NF90IG9wYWxfcmVhZF9udnJhbSh1aW50NjRfdCBidWZmZXIsIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCk7CitpbnQ2NF90IG9wYWxfd3JpdGVfbnZyYW0odWludDY0X3QgYnVmZmVyLCB1aW50NjRfdCBzaXplLCB1aW50NjRfdCBvZmZzZXQpOworaW50NjRfdCBvcGFsX2hhbmRsZV9pbnRlcnJ1cHQodWludDY0X3QgaXNuLCB1aW50NjRfdCAqb3V0c3RhbmRpbmdfZXZlbnRfbWFzayk7CitpbnQ2NF90IG9wYWxfcG9sbF9ldmVudHModWludDY0X3QgKm91dHN0YW5kaW5nX2V2ZW50X21hc2spOworaW50NjRfdCBvcGFsX3BjaV9zZXRfaHViX3RjZV9tZW1vcnkodWludDY0X3QgaHViX2lkLCB1aW50NjRfdCB0Y2VfbWVtX2FkZHIsCisJCQkJICAgIHVpbnQ2NF90IHRjZV9tZW1fc2l6ZSk7CitpbnQ2NF90IG9wYWxfcGNpX3NldF9waGJfdGNlX21lbW9yeSh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IHRjZV9tZW1fYWRkciwKKwkJCQkgICAgdWludDY0X3QgdGNlX21lbV9zaXplKTsKK2ludDY0X3Qgb3BhbF9wY2lfY29uZmlnX3JlYWRfYnl0ZSh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IGJ1c19kZXZfZnVuYywKKwkJCQkgIHVpbnQ2NF90IG9mZnNldCwgdWludDhfdCAqZGF0YSk7CitpbnQ2NF90IG9wYWxfcGNpX2NvbmZpZ19yZWFkX2hhbGZfd29yZCh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IGJ1c19kZXZfZnVuYywKKwkJCQkgICAgICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqZGF0YSk7CitpbnQ2NF90IG9wYWxfcGNpX2NvbmZpZ19yZWFkX3dvcmQodWludDY0X3QgcGhiX2lkLCB1aW50NjRfdCBidXNfZGV2X2Z1bmMsCisJCQkJICB1aW50NjRfdCBvZmZzZXQsIHVpbnQzMl90ICpkYXRhKTsKK2ludDY0X3Qgb3BhbF9wY2lfY29uZmlnX3dyaXRlX2J5dGUodWludDY0X3QgcGhiX2lkLCB1aW50NjRfdCBidXNfZGV2X2Z1bmMsCisJCQkJICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50OF90IGRhdGEpOworaW50NjRfdCBvcGFsX3BjaV9jb25maWdfd3JpdGVfaGFsZl93b3JkKHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgYnVzX2Rldl9mdW5jLAorCQkJCQl1aW50NjRfdCBvZmZzZXQsIHVpbnQxNl90IGRhdGEpOworaW50NjRfdCBvcGFsX3BjaV9jb25maWdfd3JpdGVfd29yZCh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IGJ1c19kZXZfZnVuYywKKwkJCQkgICB1aW50NjRfdCBvZmZzZXQsIHVpbnQzMl90IGRhdGEpOworaW50NjRfdCBvcGFsX3NldF94aXZlKHVpbnQzMl90IGlzbiwgdWludDE2X3Qgc2VydmVyLCB1aW50OF90IHByaW9yaXR5KTsKK2ludDY0X3Qgb3BhbF9nZXRfeGl2ZSh1aW50MzJfdCBpc24sIHVpbnQxNl90ICpzZXJ2ZXIsIHVpbnQ4X3QgKnByaW9yaXR5KTsKK2ludDY0X3Qgb3BhbF9yZWdpc3Rlcl9leGNlcHRpb25faGFuZGxlcih1aW50NjRfdCBvcGFsX2V4Y2VwdGlvbiwKKwkJCQkJdWludDY0X3QgaGFuZGxlcl9hZGRyZXNzLAorCQkJCQl1aW50NjRfdCBnbHVlX2NhY2hlX2xpbmUpOworaW50NjRfdCBvcGFsX3BjaV9lZWhfZnJlZXplX3N0YXR1cyh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IHBlX251bWJlciwKKwkJCQkgICB1aW50OF90ICpmcmVlemVfc3RhdGUsCisJCQkJICAgdWludDE2X3QgKnBjaV9lcnJvcl90eXBlLAorCQkJCSAgIHVpbnQ2NF90ICpwaGJfc3RhdHVzKTsKK2ludDY0X3Qgb3BhbF9wY2lfZWVoX2ZyZWV6ZV9jbGVhcih1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IHBlX251bWJlciwKKwkJCQkgIHVpbnQ2NF90IGVlaF9hY3Rpb25fdG9rZW4pOworaW50NjRfdCBvcGFsX3BjaV9zaHBjKHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3Qgc2hwY19hY3Rpb24sIHVpbnQ4X3QgKnN0YXRlKTsKKworCisKK2ludDY0X3Qgb3BhbF9wY2lfcGhiX21taW9fZW5hYmxlKHVpbnQ2NF90IHBoYl9pZCwgdWludDE2X3Qgd2luZG93X3R5cGUsCisJCQkJIHVpbnQxNl90IHdpbmRvd19udW0sIHVpbnQxNl90IGVuYWJsZSk7CitpbnQ2NF90IG9wYWxfcGNpX3NldF9waGJfbWVtX3dpbmRvdyh1aW50NjRfdCBwaGJfaWQsIHVpbnQxNl90IHdpbmRvd190eXBlLAorCQkJCSAgICB1aW50MTZfdCB3aW5kb3dfbnVtLAorCQkJCSAgICB1aW50NjRfdCBzdGFydGluZ19yZWFsX2FkZHJlc3MsCisJCQkJICAgIHVpbnQ2NF90IHN0YXJ0aW5nX3BjaV9hZGRyZXNzLAorCQkJCSAgICB1aW50MTZfdCBzZWdtZW50X3NpemUpOworaW50NjRfdCBvcGFsX3BjaV9tYXBfcGVfbW1pb193aW5kb3codWludDY0X3QgcGhiX2lkLCB1aW50MTZfdCBwZV9udW1iZXIsCisJCQkJICAgIHVpbnQxNl90IHdpbmRvd190eXBlLCB1aW50MTZfdCB3aW5kb3dfbnVtLAorCQkJCSAgICB1aW50MTZfdCBzZWdtZW50X251bSk7CitpbnQ2NF90IG9wYWxfcGNpX3NldF9waGJfdGFibGVfbWVtb3J5KHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgcnR0X2FkZHIsCisJCQkJICAgICAgdWludDY0X3QgaXZ0X2FkZHIsIHVpbnQ2NF90IGl2dF9sZW4sCisJCQkJICAgICAgdWludDY0X3QgcmVqZWN0X2FycmF5X2FkZHIsCisJCQkJICAgICAgdWludDY0X3QgcGVsdHZfYWRkcik7CitpbnQ2NF90IG9wYWxfcGNpX3NldF9wZSh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IHBlX251bWJlciwgdWludDY0X3QgYnVzX2Rldl9mdW5jLAorCQkJdWludDhfdCBidXNfY29tcGFyZSwgdWludDhfdCBkZXZfY29tcGFyZSwgdWludDhfdCBmdW5jX2NvbXBhcmUsCisJCQl1aW50OF90IHBlX2FjdGlvbik7CitpbnQ2NF90IG9wYWxfcGNpX3NldF9wZWx0dih1aW50NjRfdCBwaGJfaWQsIHVpbnQzMl90IHBhcmVudF9wZSwgdWludDMyX3QgY2hpbGRfcGUsCisJCQkgICB1aW50OF90IHN0YXRlKTsKK2ludDY0X3Qgb3BhbF9wY2lfc2V0X212ZSh1aW50NjRfdCBwaGJfaWQsIHVpbnQzMl90IG12ZV9udW1iZXIsIHVpbnQzMl90IHBlX251bWJlcik7CitpbnQ2NF90IG9wYWxfcGNpX3NldF9tdmVfZW5hYmxlKHVpbnQ2NF90IHBoYl9pZCwgdWludDMyX3QgbXZlX251bWJlciwKKwkJCQl1aW50MzJfdCBzdGF0ZSk7CitpbnQ2NF90IG9wYWxfcGNpX2dldF94aXZlX3JlaXNzdWUodWludDY0X3QgcGhiX2lkLCB1aW50MzJfdCB4aXZlX251bWJlciwKKwkJCQkgIHVpbnQ4X3QgKnBfYml0LCB1aW50OF90ICpxX2JpdCk7CitpbnQ2NF90IG9wYWxfcGNpX3NldF94aXZlX3JlaXNzdWUodWludDY0X3QgcGhiX2lkLCB1aW50MzJfdCB4aXZlX251bWJlciwKKwkJCQkgIHVpbnQ4X3QgcF9iaXQsIHVpbnQ4X3QgcV9iaXQpOworaW50NjRfdCBvcGFsX3BjaV9zZXRfeGl2ZV9wZSh1aW50NjRfdCBwaGJfaWQsIHVpbnQzMl90IHBlX251bWJlciwKKwkJCSAgICAgdWludDMyX3QgeGl2ZV9udW0pOworaW50NjRfdCBvcGFsX2dldF94aXZlX3NvdXJjZSh1aW50NjRfdCBwaGJfaWQsIHVpbnQzMl90IHhpdmVfbnVtLAorCQkJICAgICBpbnQzMl90ICppbnRlcnJ1cHRfc291cmNlX251bWJlcik7CitpbnQ2NF90IG9wYWxfZ2V0X21zaV8zMih1aW50NjRfdCBwaGJfaWQsIHVpbnQzMl90IG12ZV9udW1iZXIsIHVpbnQzMl90IHhpdmVfbnVtLAorCQkJdWludDhfdCBtc2lfcmFuZ2UsIHVpbnQzMl90ICptc2lfYWRkcmVzcywKKwkJCXVpbnQzMl90ICptZXNzYWdlX2RhdGEpOworaW50NjRfdCBvcGFsX2dldF9tc2lfNjQodWludDY0X3QgcGhiX2lkLCB1aW50MzJfdCBtdmVfbnVtYmVyLAorCQkJdWludDMyX3QgeGl2ZV9udW0sIHVpbnQ4X3QgbXNpX3JhbmdlLAorCQkJdWludDY0X3QgKm1zaV9hZGRyZXNzLCB1aW50MzJfdCAqbWVzc2FnZV9kYXRhKTsKK2ludDY0X3Qgb3BhbF9zdGFydF9jcHUodWludDY0X3QgdGhyZWFkX251bWJlciwgdWludDY0X3Qgc3RhcnRfYWRkcmVzcyk7CitpbnQ2NF90IG9wYWxfcXVlcnlfY3B1X3N0YXR1cyh1aW50NjRfdCB0aHJlYWRfbnVtYmVyLCB1aW50OF90ICp0aHJlYWRfc3RhdHVzKTsKK2ludDY0X3Qgb3BhbF93cml0ZV9vcHBhbmVsKG9wcGFuZWxfbGluZV90ICpsaW5lcywgdWludDY0X3QgbnVtX2xpbmVzKTsKK2ludDY0X3Qgb3BhbF9wY2lfbWFwX3BlX2RtYV93aW5kb3codWludDY0X3QgcGhiX2lkLCB1aW50MTZfdCBwZV9udW1iZXIsIHVpbnQxNl90IHdpbmRvd19pZCwKKwkJCQkgICB1aW50MTZfdCB0Y2VfbGV2ZWxzLCB1aW50NjRfdCB0Y2VfdGFibGVfYWRkciwKKwkJCQkgICB1aW50NjRfdCB0Y2VfdGFibGVfc2l6ZSwgdWludDY0X3QgdGNlX3BhZ2Vfc2l6ZSk7CitpbnQ2NF90IG9wYWxfcGNpX21hcF9wZV9kbWFfd2luZG93X3JlYWwodWludDY0X3QgcGhiX2lkLCB1aW50MTZfdCBwZV9udW1iZXIsCisJCQkJCXVpbnQxNl90IGRtYV93aW5kb3dfbnVtYmVyLCB1aW50NjRfdCBwY2lfc3RhcnRfYWRkciwKKwkJCQkJdWludDY0X3QgcGNpX21lbV9zaXplKTsKK2ludDY0X3Qgb3BhbF9wY2lfcmVzZXQodWludDY0X3QgcGhiX2lkLCB1aW50OF90IHJlc2V0X3Njb3BlLCB1aW50OF90IGFzc2VydF9zdGF0ZSk7CisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBlYXJseV9pbml0X2R0X3NjYW5fb3BhbCh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpOworCitleHRlcm4gaW50IG9wYWxfZ2V0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgb3BhbF9wdXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY29uc3QgY2hhciAqYnVmLCBpbnQgdG90YWxfbGVuKTsKKworZXh0ZXJuIHZvaWQgaHZjX29wYWxfaW5pdF9lYXJseSh2b2lkKTsKKworLyogSW50ZXJuYWwgZnVuY3Rpb25zICovCitleHRlcm4gaW50IGVhcmx5X2luaXRfZHRfc2Nhbl9vcGFsKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqdW5hbWUsCisJCQkJICAgaW50IGRlcHRoLCB2b2lkICpkYXRhKTsKKworZXh0ZXJuIGludCBvcGFsX2dldF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCk7CitleHRlcm4gaW50IG9wYWxfcHV0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IHRvdGFsX2xlbik7CisKK2V4dGVybiB2b2lkIGh2Y19vcGFsX2luaXRfZWFybHkodm9pZCk7CisKK3N0cnVjdCBydGNfdGltZTsKK2V4dGVybiBpbnQgb3BhbF9zZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0bSk7CitleHRlcm4gdm9pZCBvcGFsX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG9wYWxfZ2V0X2Jvb3RfdGltZSh2b2lkKTsKK2V4dGVybiB2b2lkIG9wYWxfbnZyYW1faW5pdCh2b2lkKTsKKworZXh0ZXJuIGludCBvcGFsX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfX09QQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKaW5kZXggNTE2YmZiMy4uMTc3MjJjNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCkBAIC00Myw2ICs0Myw3IEBACiAjZGVmaW5lIGdldF9zbGJfc2hhZG93KCkJKGdldF9wYWNhKCktPnNsYl9zaGFkb3dfcHRyKQogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CitzdHJ1Y3Qgb3BhbF9tYWNoaW5lX2NoZWNrX2V2ZW50OwogCiAvKgogICogRGVmaW5lcyB0aGUgbGF5b3V0IG9mIHRoZSBwYWNhLgpAQCAtMTM1LDYgKzEzNiwxMyBAQAogCXU4IGlvX3N5bmM7CQkJLyogd3JpdGVsKCkgbmVlZHMgc3Bpbl91bmxvY2sgc3luYyAqLwogCXU4IGlycV93b3JrX3BlbmRpbmc7CQkvKiBJUlFfV09SSyBpbnRlcnJ1cHQgd2hpbGUgc29mdC1kaXNhYmxlICovCiAKKyNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlYKKwkvKiBQb2ludGVyIHRvIE9QQUwgbWFjaGluZSBjaGVjayBldmVudCBzdHJ1Y3R1cmUgc2V0IGJ5IHRoZQorCSAqIGVhcmx5IGV4Y2VwdGlvbiBoYW5kbGVyIGZvciB1c2UgYnkgaGlnaCBsZXZlbCBDIGhhbmRsZXIKKwkgKi8KKwlzdHJ1Y3Qgb3BhbF9tYWNoaW5lX2NoZWNrX2V2ZW50ICpvcGFsX21jX2V2dDsKKyNlbmRpZgorCiAJLyogU3R1ZmYgZm9yIGFjY3VyYXRlIHRpbWUgYWNjb3VudGluZyAqLwogCXU2NCB1c2VyX3RpbWU7CQkJLyogYWNjdW11bGF0ZWQgdXNlcm1vZGUgVEIgdGlja3MgKi8KIAl1NjQgc3lzdGVtX3RpbWU7CQkvKiBhY2N1bXVsYXRlZCBzeXN0ZW0gVEIgdGlja3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IDJjZDY2NGUuLmRkOWM0ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMzYsNiArMzYsMTggQEAKIAogI2RlZmluZSBQQUdFX1NJWkUJCShBU01fQ09OU1QoMSkgPDwgUEFHRV9TSElGVCkKIAorI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCitleHRlcm4gdW5zaWduZWQgaW50IEhQQUdFX1NISUZUOworI2Vsc2UKKyNkZWZpbmUgSFBBR0VfU0hJRlQgUEFHRV9TSElGVAorI2VuZGlmCisjZGVmaW5lIEhQQUdFX1NJWkUJCSgoMVVMKSA8PCBIUEFHRV9TSElGVCkKKyNkZWZpbmUgSFBBR0VfTUFTSwkJKH4oSFBBR0VfU0laRSAtIDEpKQorI2RlZmluZSBIVUdFVExCX1BBR0VfT1JERVIJKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCkKKyNkZWZpbmUgSFVHRV9NQVhfSFNUQVRFCQkoTU1VX1BBR0VfQ09VTlQtMSkKKyNlbmRpZgorCiAvKiBXZSBkbyBkZWZpbmUgQVRfU1lTSU5GT19FSERSIGJ1dCBkb24ndCB1c2UgdGhlIGdhdGUgbWVjaGFuaXNtICovCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0dBVEVfQVJFQQkJMQogCkBAIC0xNTgsNiArMTcwLDI0IEBACiAjZGVmaW5lIGlzX2tlcm5lbF9hZGRyKHgpCSgoeCkgPj0gUEFHRV9PRkZTRVQpCiAjZW5kaWYKIAorLyoKKyAqIFVzZSB0aGUgdG9wIGJpdCBvZiB0aGUgaGlnaGVyLWxldmVsIHBhZ2UgdGFibGUgZW50cmllcyB0byBpbmRpY2F0ZSB3aGV0aGVyCisgKiB0aGUgZW50cmllcyB3ZSBwb2ludCB0byBjb250YWluIGh1Z2VwYWdlcy4gIFRoaXMgd29ya3MgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKyAqIHRoZSBwYWdlIHRhYmxlcyBsaXZlIGluIGtlcm5lbCBzcGFjZS4gIElmIHdlIGV2ZXIgZGVjaWRlIHRvIHN1cHBvcnQgaGF2aW5nCisgKiBwYWdlIHRhYmxlcyBhdCBhcmJpdHJhcnkgYWRkcmVzc2VzLCB0aGlzIGJyZWFrcyBhbmQgd2lsbCBoYXZlIHRvIGNoYW5nZS4KKyAqLworI2lmZGVmIENPTkZJR19QUEM2NAorI2RlZmluZSBQRF9IVUdFIDB4ODAwMDAwMDAwMDAwMDAwMAorI2Vsc2UKKyNkZWZpbmUgUERfSFVHRSAweDgwMDAwMDAwCisjZW5kaWYKKworLyoKKyAqIFNvbWUgbnVtYmVyIG9mIGJpdHMgYXQgdGhlIGxldmVsIG9mIHRoZSBwYWdlIHRhYmxlIHRoYXQgcG9pbnRzIHRvCisgKiBhIGh1Z2VwdGUgYXJlIHVzZWQgdG8gZW5jb2RlIHRoZSBzaXplLiAgVGhpcyBtYXNrcyB0aG9zZSBiaXRzLgorICovCisjZGVmaW5lIEhVR0VQRF9TSElGVF9NQVNLICAgICAweDNmCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKICN1bmRlZiBTVFJJQ1RfTU1fVFlQRUNIRUNLUwpAQCAtMjQzLDcgKzI3Myw2IEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgeyBzaWduZWQgbG9uZyBwZDsgfSBodWdlcGRfdDsKLSNkZWZpbmUgSFVHRVBEX1NISUZUX01BU0sgICAgIDB4M2YKIAogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKIHN0YXRpYyBpbmxpbmUgaW50IGh1Z2VwZF9vayhodWdlcGRfdCBocGQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZV82NC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2VfNjQuaAppbmRleCA5MzU2MjYyLi5mYjQwZWRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZV82NC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKQEAgLTY0LDE3ICs2NCw2IEBACiAvKiBMb2cgMiBvZiBwYWdlIHRhYmxlIHNpemUgKi8KIGV4dGVybiB1NjQgcHBjNjRfcGZ0X3NpemU7CiAKLS8qIExhcmdlIHBhZ2VzIHNpemUgKi8KLSNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCi1leHRlcm4gdW5zaWduZWQgaW50IEhQQUdFX1NISUZUOwotI2Vsc2UKLSNkZWZpbmUgSFBBR0VfU0hJRlQgUEFHRV9TSElGVAotI2VuZGlmCi0jZGVmaW5lIEhQQUdFX1NJWkUJCSgoMVVMKSA8PCBIUEFHRV9TSElGVCkKLSNkZWZpbmUgSFBBR0VfTUFTSwkJKH4oSFBBR0VfU0laRSAtIDEpKQotI2RlZmluZSBIVUdFVExCX1BBR0VfT1JERVIJKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCkKLSNkZWZpbmUgSFVHRV9NQVhfSFNUQVRFCQkoTU1VX1BBR0VfQ09VTlQtMSkKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjaWZkZWYgQ09ORklHX1BQQ19NTV9TTElDRVMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wdGUtYm9vazNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHRlLWJvb2szZS5oCmluZGV4IDA4MmQ1MTUuLjAxNTY3MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wdGUtYm9vazNlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS1ib29rM2UuaApAQCAtNzIsNiArNzIsOSBAQAogI2RlZmluZQlQVEVfUlBOX1NISUZUCSgyNCkKICNlbmRpZgogCisjZGVmaW5lIFBURV9XSU1HRV9TSElGVCAoMTkpCisjZGVmaW5lIFBURV9CQVBfU0hJRlQJKDIpCisKIC8qIE9uIDMyLWJpdCwgd2UgbmV2ZXIgY2xlYXIgdGhlIHRvcCBwYXJ0IG9mIHRoZSBQVEUgKi8KICNpZmRlZiBDT05GSUdfUFBDMzIKICNkZWZpbmUgX1BURV9OT05FX01BU0sJMHhmZmZmZmZmZjAwMDAwMDAwVUxMCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmgKaW5kZXggOWVjMGIzOS4uMjhjZGJkOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZ19ib29rZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfYm9va2UuaApAQCAtNTQ4LDYgKzU0OCw5IEBACiAjZGVmaW5lIEwxQ1NSMV9JQ0ZJCTB4MDAwMDAwMDIJLyogSW5zdHIgQ2FjaGUgRmxhc2ggSW52YWxpZGF0ZSAqLwogI2RlZmluZSBMMUNTUjFfSUNFCTB4MDAwMDAwMDEJLyogSW5zdHIgQ2FjaGUgRW5hYmxlICovCiAKKy8qIEJpdCBkZWZpbml0aW9ucyBmb3IgTDFDU1IyLiAqLworI2RlZmluZSBMMUNTUjJfRENXUwkweDQwMDAwMDAwCS8qIERhdGEgQ2FjaGUgd3JpdGUgc2hhZG93ICovCisKIC8qIEJpdCBkZWZpbml0aW9ucyBmb3IgTDJDU1IwLiAqLwogI2RlZmluZSBMMkNTUjBfTDJFCTB4ODAwMDAwMDAJLyogTDIgQ2FjaGUgRW5hYmxlICovCiAjZGVmaW5lIEwyQ1NSMF9MMlBFCTB4NDAwMDAwMDAJLyogTDIgQ2FjaGUgUGFyaXR5L0VDQyBFbmFibGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcnRhcy5oCmluZGV4IDU4NjI1ZDEuLjQxZjY5YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaApAQCAtMjQ5LDEwICsyNDksMTIgQEAKICNkZWZpbmUgRVJSX0ZMQUdfQUxSRUFEWV9MT0dHRUQJMHgwCiAjZGVmaW5lIEVSUl9GTEFHX0JPT1QJCTB4MSAJLyogbG9nIHdhcyBwdWxsZWQgZnJvbSBOVlJBTSBvbiBib290ICovCiAjZGVmaW5lIEVSUl9UWVBFX1JUQVNfTE9HCTB4MgkvKiBmcm9tIHJ0YXMgZXZlbnQtc2NhbiAqLwotI2RlZmluZSBFUlJfVFlQRV9LRVJORUxfUEFOSUMJMHg0CS8qIGZyb20gcGFuaWMoKSAqLworI2RlZmluZSBFUlJfVFlQRV9LRVJORUxfUEFOSUMJMHg0CS8qIGZyb20gZGllKCkvcGFuaWMoKSAqLworI2RlZmluZSBFUlJfVFlQRV9LRVJORUxfUEFOSUNfR1ogMHg4CS8qIGRpdHRvLCBjb21wcmVzc2VkICovCiAKIC8qIEFsbCB0aGUgdHlwZXMgYW5kIG5vdCBmbGFncyAqLwotI2RlZmluZSBFUlJfVFlQRV9NQVNLCShFUlJfVFlQRV9SVEFTX0xPRyB8IEVSUl9UWVBFX0tFUk5FTF9QQU5JQykKKyNkZWZpbmUgRVJSX1RZUEVfTUFTSyBcCisJKEVSUl9UWVBFX1JUQVNfTE9HIHwgRVJSX1RZUEVfS0VSTkVMX1BBTklDIHwgRVJSX1RZUEVfS0VSTkVMX1BBTklDX0daKQogCiAjZGVmaW5lIFJUQVNfREVCVUcgS0VSTl9ERUJVRyAiUlRBUzogIgogIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IDE1YTcwYjcuLmFkYmE5NzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmgKQEAgLTY1LDYgKzY1LDcgQEAKIHZvaWQgZ2VuZXJpY19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpOwogdm9pZCBnZW5lcmljX21hY2hfY3B1X2RpZSh2b2lkKTsKIHZvaWQgZ2VuZXJpY19zZXRfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSk7CitpbnQgZ2VuZXJpY19jaGVja19jcHVfcmVzdGFydCh1bnNpZ25lZCBpbnQgY3B1KTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQzY0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggODY2Zjc2MC4uMmZjMmFmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNjksNCArNjksNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwYXJzZW1lbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwYXJzZW1lbS5oCmluZGV4IDU0YTQ3ZWEuLjBjNWZhMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3BhcnNlbWVtLmgKQEAgLTE2LDcgKzE2LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfU1BBUlNFTUVNICovCiAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKLWV4dGVybiB2b2lkIGNyZWF0ZV9zZWN0aW9uX21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworZXh0ZXJuIGludCBjcmVhdGVfc2VjdGlvbl9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIGV4dGVybiBpbnQgcmVtb3ZlX3NlY3Rpb25fbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiBpbnQgaG90X2FkZF9zY25fdG9fbmlkKHVuc2lnbmVkIGxvbmcgc2NuX2FkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwdS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwdS5oCmluZGV4IDBjOGIzNWQuLjRlMzYwYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zcHUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3B1LmgKQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNkZWZpbmUgTFNfU0laRSAoMjU2ICogMTAyNCkKICNkZWZpbmUgTFNfQUREUl9NQVNLIChMU19TSVpFIC0gMSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaAppbmRleCBmYTBkMjdhLi41NTlhZTFlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGJsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oCkBAIC0zNTQsMyArMzU0LDUgQEAKIFNZU0NBTExfU1BVKHN5bmNmcykKIENPTVBBVF9TWVNfU1BVKHNlbmRtbXNnKQogU1lTQ0FMTF9TUFUoc2V0bnMpCitDT01QQVRfU1lTKHByb2Nlc3Nfdm1fcmVhZHYpCitDT01QQVRfU1lTKHByb2Nlc3Nfdm1fd3JpdGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCA3ZWYwZDkwLi4xZTEwNGFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApAQCAtMTksMTQgKzE5LDEwIEBACiAjZGVmaW5lIFJFQ0xBSU1fRElTVEFOQ0UgMTAKIAogLyoKLSAqIEJlZm9yZSBnb2luZyBvZmYgbm9kZSB3ZSB3YW50IHRoZSBWTSB0byB0cnkgYW5kIHJlY2xhaW0gZnJvbSB0aGUgbG9jYWwKLSAqIG5vZGUuIEl0IGRvZXMgdGhpcyBpZiB0aGUgcmVtb3RlIGRpc3RhbmNlIGlzIGxhcmdlciB0aGFuIFJFQ0xBSU1fRElTVEFOQ0UuCi0gKiBXaXRoIHRoZSBkZWZhdWx0IFJFTU9URV9ESVNUQU5DRSBvZiAyMCBhbmQgdGhlIGRlZmF1bHQgUkVDTEFJTV9ESVNUQU5DRSBvZgotICogMjAsIHdlIG5ldmVyIHJlY2xhaW0gYW5kIGdvIG9mZiBub2RlIHN0cmFpZ2h0IGF3YXkuCi0gKgotICogVG8gZml4IHRoaXMgd2UgY2hvb3NlIGEgc21hbGxlciB2YWx1ZSBvZiBSRUNMQUlNX0RJU1RBTkNFLgorICogQXZvaWQgY3JlYXRpbmcgYW4gZXh0cmEgbGV2ZWwgb2YgYmFsYW5jaW5nIChTRF9BTExOT0RFUykgb24gdGhlIGxhcmdlc3QKKyAqIFBPV0VSNyBib3hlcyB3aGljaCBoYXZlIGEgbWF4aW11bSBvZiAzMiBub2Rlcy4KICAqLwotI2RlZmluZSBSRUNMQUlNX0RJU1RBTkNFIDEwCisjZGVmaW5lIFNEX05PREVTX1BFUl9ET01BSU4gMzIKIAogI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KIApAQCAtNjksMTEgKzY1LDExIEBACiAJLmZvcmtleGVjX2lkeAkJPSAwLAkJCQkJXAogCQkJCQkJCQkJXAogCS5mbGFncwkJCT0gMSpTRF9MT0FEX0JBTEFOQ0UJCQlcCi0JCQkJfCAxKlNEX0JBTEFOQ0VfTkVXSURMRQkJCVwKKwkJCQl8IDAqU0RfQkFMQU5DRV9ORVdJRExFCQkJXAogCQkJCXwgMSpTRF9CQUxBTkNFX0VYRUMJCQlcCiAJCQkJfCAxKlNEX0JBTEFOQ0VfRk9SSwkJCVwKIAkJCQl8IDAqU0RfQkFMQU5DRV9XQUtFCQkJXAotCQkJCXwgMCpTRF9XQUtFX0FGRklORQkJCVwKKwkJCQl8IDEqU0RfV0FLRV9BRkZJTkUJCQlcCiAJCQkJfCAwKlNEX1BSRUZFUl9MT0NBTAkJCVwKIAkJCQl8IDAqU0RfU0hBUkVfQ1BVUE9XRVIJCQlcCiAJCQkJfCAwKlNEX1BPV0VSU0FWSU5HU19CQUxBTkNFCQlcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdWRiZy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VkYmcuaAppbmRleCA1MzU0YWU5Li44MzM4YWVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdWRiZy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91ZGJnLmgKQEAgLTU1LDYgKzU1LDkgQEAKIGV4dGVybiB2b2lkIF9faW5pdCB1ZGJnX2luaXRfdXNiZ2Vja28odm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19pbml0X3dzcCh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCB1ZGJnX2luaXRfZWh2X2JjKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IHVkYmdfaW5pdF9wczNnZWxpYyh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCB1ZGJnX2luaXRfZGVidWdfb3BhbF9yYXcodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19pbml0X2RlYnVnX29wYWxfaHZzaSh2b2lkKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfVURCR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggYjhiM2Y1OS4uZDNkMWI1ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMzczLDEwICszNzMsMTIgQEAKICNkZWZpbmUgX19OUl9zeW5jZnMJCTM0OAogI2RlZmluZSBfX05SX3NlbmRtbXNnCQkzNDkKICNkZWZpbmUgX19OUl9zZXRucwkJMzUwCisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV9yZWFkdgkzNTEKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgkzNTIKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBfX05SX3N5c2NhbGxzCQkzNTEKKyNkZWZpbmUgX19OUl9zeXNjYWxscwkJMzUzCiAKICNkZWZpbmUgX19OUl9fZXhpdCBfX05SX2V4aXQKICNkZWZpbmUgTlJfc3lzY2FsbHMJX19OUl9zeXNjYWxscwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3hpY3MuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS94aWNzLmgKaW5kZXggYjE4M2E0MC4uYzQ4ZGU5OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3hpY3MuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20veGljcy5oCkBAIC0xNSw4ICsxNSw4IEBACiAjZGVmaW5lCURFRkFVTFRfUFJJT1JJVFkJNQogCiAvKgotICogTWFyayBJUElzIGFzIGhpZ2hlciBwcmlvcml0eSBzbyB3ZSBjYW4gdGFrZSB0aGVtIGluc2lkZSBpbnRlcnJ1cHRzIHRoYXQKLSAqIGFyZW50IG1hcmtlZCBJUlFGX0RJU0FCTEVECisgKiBNYXJrIElQSXMgYXMgaGlnaGVyIHByaW9yaXR5IHNvIHdlIGNhbiB0YWtlIHRoZW0gaW5zaWRlIGludGVycnVwdHMKKyAqIEZJWE1FOiBzdGlsbCB0cnVlIG5vdz8KICAqLwogI2RlZmluZSBJUElfUFJJT1JJVFkJCTQKIApAQCAtMjcsMTAgKzI3LDE4IEBACiAjZGVmaW5lIE1BWF9OVU1fUFJJT1JJVElFUwkzCiAKIC8qIE5hdGl2ZSBJQ1AgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0lDUF9OQVRJVkUKIGV4dGVybiBpbnQgaWNwX25hdGl2ZV9pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGljcF9uYXRpdmVfaW5pdCh2b2lkKSB7IHJldHVybiAtRU5PREVWOyB9CisjZW5kaWYKIAogLyogUEFQUiBJQ1AgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0lDUF9IVgogZXh0ZXJuIGludCBpY3BfaHZfaW5pdCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpY3BfaHZfaW5pdCh2b2lkKSB7IHJldHVybiAtRU5PREVWOyB9CisjZW5kaWYKIAogLyogSUNQIG9wcyAqLwogc3RydWN0IGljcF9vcHMgewpAQCAtNTEsNyArNTksMTggQEAKIGV4dGVybiBpbnQgaWNzX25hdGl2ZV9pbml0KHZvaWQpOwogCiAvKiBSVEFTIElDUyAqLworI2lmZGVmIENPTkZJR19QUENfSUNTX1JUQVMKIGV4dGVybiBpbnQgaWNzX3J0YXNfaW5pdCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpY3NfcnRhc19pbml0KHZvaWQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KKyNlbmRpZgorCisvKiBIQUwgSUNTICovCisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WCitleHRlcm4gaW50IGljc19vcGFsX2luaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaWNzX29wYWxfaW5pdCh2b2lkKSB7IHJldHVybiAtRU5PREVWOyB9CisjZW5kaWYKIAogLyogSUNTIGluc3RhbmNlLCBob29rZWQgdXAgdG8gY2hpcF9kYXRhIG9mIGFuIGlycSAqLwogc3RydWN0IGljcyB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggNWYwNzhiYy4uN2M1MzI0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNDQsMTAgKzQ0LDE0IEBACiAjaW5jbHVkZSA8YXNtL2NvbXBhdC5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3hpY3MuaD4KICNlbmRpZgogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2FscGFjYS5oPgogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WCisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0tWTSkgfHwgZGVmaW5lZChDT05GSUdfS1ZNX0dVRVNUKQogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjZW5kaWYKQEAgLTQ0OSw4ICs0NTMsNiBAQAogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTCiAJREVGSU5FKFZDUFVfS1ZNLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGt2bSkpOwogCURFRklORShWQ1BVX1ZDUFVJRCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCB2Y3B1X2lkKSk7Ci0JREVGSU5FKFZDUFVfSE9TVF9SRVRJUCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmhvc3RfcmV0aXApKTsKLQlERUZJTkUoVkNQVV9IT1NUX01TUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmhvc3RfbXNyKSk7CiAJREVGSU5FKFZDUFVfUFVSUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnB1cnIpKTsKIAlERUZJTkUoVkNQVV9TUFVSUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNwdXJyKSk7CiAJREVGSU5FKFZDUFVfRFNDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmRzY3IpKTsKQEAgLTQ1OCwxNCArNDYwLDEyIEBACiAJREVGSU5FKFZDUFVfVUFNT1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC51YW1vcikpOwogCURFRklORShWQ1BVX0NUUkwsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5jdHJsKSk7CiAJREVGSU5FKFZDUFVfREFCUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmRhYnIpKTsKLQlERUZJTkUoVkNQVV9UUkFNUE9MSU5FX0xPV01FTSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnRyYW1wb2xpbmVfbG93bWVtKSk7Ci0JREVGSU5FKFZDUFVfVFJBTVBPTElORV9FTlRFUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnRyYW1wb2xpbmVfZW50ZXIpKTsKLQlERUZJTkUoVkNQVV9ISUdITUVNX0hBTkRMRVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5oaWdobWVtX2hhbmRsZXIpKTsKLQlERUZJTkUoVkNQVV9STUNBTEwsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ybWNhbGwpKTsKIAlERUZJTkUoVkNQVV9IRkxBR1MsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5oZmxhZ3MpKTsKIAlERUZJTkUoVkNQVV9ERUMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kZWMpKTsKIAlERUZJTkUoVkNQVV9ERUNfRVhQSVJFUywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmRlY19leHBpcmVzKSk7CiAJREVGSU5FKFZDUFVfUEVORElOR19FWEMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpKTsKKwlERUZJTkUoVkNQVV9DRURFRCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmNlZGVkKSk7CisJREVGSU5FKFZDUFVfUFJPRERFRCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnByb2RkZWQpKTsKIAlERUZJTkUoVkNQVV9WUEEsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC52cGEpKTsKIAlERUZJTkUoVkNQVV9NTUNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gubW1jcikpOwogCURFRklORShWQ1BVX1BNQywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnBtYykpOwpAQCAtNDgxLDYgKzQ4MSw3IEBACiAJREVGSU5FKFZDT1JFX0VOVFJZX0VYSVQsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIGVudHJ5X2V4aXRfY291bnQpKTsKIAlERUZJTkUoVkNPUkVfTkFQX0NPVU5ULCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCBuYXBfY291bnQpKTsKIAlERUZJTkUoVkNPUkVfSU5fR1VFU1QsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIGluX2d1ZXN0KSk7CisJREVGSU5FKFZDT1JFX05BUFBJTkdfVEhSRUFEUywgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY192Y29yZSwgbmFwcGluZ190aHJlYWRzKSk7CiAJREVGSU5FKFZDUFVfU1ZDUFUsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MsIHNoYWRvd192Y3B1KSAtCiAJCQkgICBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzLCB2Y3B1KSk7CiAJREVGSU5FKFZDUFVfU0xCX0UsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfc2xiLCBvcmlnZSkpOwpAQCAtNTM3LDYgKzUzOCw4IEBACiAJSFNUQVRFX0ZJRUxEKEhTVEFURV9TQ1JBVENIMCwgc2NyYXRjaDApOwogCUhTVEFURV9GSUVMRChIU1RBVEVfU0NSQVRDSDEsIHNjcmF0Y2gxKTsKIAlIU1RBVEVfRklFTEQoSFNUQVRFX0lOX0dVRVNULCBpbl9ndWVzdCk7CisJSFNUQVRFX0ZJRUxEKEhTVEFURV9SRVNUT1JFX0hJRDUsIHJlc3RvcmVfaGlkNSk7CisJSFNUQVRFX0ZJRUxEKEhTVEFURV9OQVBQSU5HLCBuYXBwaW5nKTsKIAogI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWCiAJSFNUQVRFX0ZJRUxEKEhTVEFURV9LVk1fVkNQVSwga3ZtX3ZjcHUpOwpAQCAtNTQ5LDYgKzU1Miw3IEBACiAJSFNUQVRFX0ZJRUxEKEhTVEFURV9EU0NSLCBob3N0X2RzY3IpOwogCUhTVEFURV9GSUVMRChIU1RBVEVfREFCUiwgZGFicik7CiAJSFNUQVRFX0ZJRUxEKEhTVEFURV9ERUNFWFAsIGRlY19leHBpcmVzKTsKKwlERUZJTkUoSVBJX1BSSU9SSVRZLCBJUElfUFJJT1JJVFkpOwogI2VuZGlmIC8qIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWICovCiAKICNlbHNlIC8qIENPTkZJR19QUENfQk9PSzNTICovCkBAIC02MDksNSArNjEzLDEyIEBACiAJCQkJCWFyY2gudGltaW5nX2xhc3RfZW50ZXIudHYzMi50YmwpKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WCisJREVGSU5FKE9QQUxfTUNfR1BSMywgb2Zmc2V0b2Yoc3RydWN0IG9wYWxfbWFjaGluZV9jaGVja19ldmVudCwgZ3ByMykpOworCURFRklORShPUEFMX01DX1NSUjAsIG9mZnNldG9mKHN0cnVjdCBvcGFsX21hY2hpbmVfY2hlY2tfZXZlbnQsIHNycjApKTsKKwlERUZJTkUoT1BBTF9NQ19TUlIxLCBvZmZzZXRvZihzdHJ1Y3Qgb3BhbF9tYWNoaW5lX2NoZWNrX2V2ZW50LCBzcnIxKSk7CisJREVGSU5FKFBBQ0FfT1BBTF9NQ19FVlQsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgb3BhbF9tY19ldnQpKTsKKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2J0ZXh0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2J0ZXh0LmMKaW5kZXggNjBiM2UzNy4uYWM4ZjUyNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYwpAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KIAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jbG9jay5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jbG9jay5jCmluZGV4IGNlNjY4ZjUuLmE3NjRiNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2xvY2suYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2Nsb2NrLmMKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vY2xrX2ludGVyZmFjZS5oPgogCiBzdHJ1Y3QgY2xrX2ludGVyZmFjZSBjbGtfZnVuY3Rpb25zOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IGZhNDRmZjUuLmVkYWU1YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vb3Byb2ZpbGVfaW1wbC5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCmluZGV4IGNjNmE5ZDUuLmQ4Nzk4MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1pb21tdS5jCmluZGV4IGU3NTU0MTUuLjNmNjQ2NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtaW9tbXUuYwpAQCAtNSw2ICs1LDcgQEAKICAqIGJ1c3NlcyB1c2luZyB0aGUgaW9tbXUgaW5mcmFzdHJ1Y3R1cmUKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAKIC8qCkBAIC05MCwxMyArOTEsMjcgQEAKIAkJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyB1NjQgZG1hX2lvbW11X2dldF9yZXF1aXJlZF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGdldF9pb21tdV90YWJsZV9iYXNlKGRldik7CisJdTY0IG1hc2s7CisJaWYgKCF0YmwpCisJCXJldHVybiAwOworCisJbWFzayA9IDFVTEwgPCAoZmxzX2xvbmcodGJsLT5pdF9vZmZzZXQgKyB0YmwtPml0X3NpemUpIC0gMSk7CisJbWFzayArPSBtYXNrIC0gMTsKKworCXJldHVybiBtYXNrOworfQorCiBzdHJ1Y3QgZG1hX21hcF9vcHMgZG1hX2lvbW11X29wcyA9IHsKLQkuYWxsb2NfY29oZXJlbnQJPSBkbWFfaW9tbXVfYWxsb2NfY29oZXJlbnQsCi0JLmZyZWVfY29oZXJlbnQJPSBkbWFfaW9tbXVfZnJlZV9jb2hlcmVudCwKLQkubWFwX3NnCQk9IGRtYV9pb21tdV9tYXBfc2csCi0JLnVubWFwX3NnCT0gZG1hX2lvbW11X3VubWFwX3NnLAotCS5kbWFfc3VwcG9ydGVkCT0gZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQsCi0JLm1hcF9wYWdlCT0gZG1hX2lvbW11X21hcF9wYWdlLAotCS51bm1hcF9wYWdlCT0gZG1hX2lvbW11X3VubWFwX3BhZ2UsCisJLmFsbG9jX2NvaGVyZW50CQk9IGRtYV9pb21tdV9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudAkJPSBkbWFfaW9tbXVfZnJlZV9jb2hlcmVudCwKKwkubWFwX3NnCQkJPSBkbWFfaW9tbXVfbWFwX3NnLAorCS51bm1hcF9zZwkJPSBkbWFfaW9tbXVfdW5tYXBfc2csCisJLmRtYV9zdXBwb3J0ZWQJCT0gZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQsCisJLm1hcF9wYWdlCQk9IGRtYV9pb21tdV9tYXBfcGFnZSwKKwkudW5tYXBfcGFnZQkJPSBkbWFfaW9tbXVfdW5tYXBfcGFnZSwKKwkuZ2V0X3JlcXVpcmVkX21hc2sJPSBkbWFfaW9tbXVfZ2V0X3JlcXVpcmVkX21hc2ssCiB9OwogRVhQT1JUX1NZTUJPTChkbWFfaW9tbXVfb3BzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLXN3aW90bGIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLXN3aW90bGIuYwppbmRleCA0Mjk1ZTBiLi4xZWJjOTE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1zd2lvdGxiLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtc3dpb3RsYi5jCkBAIC0yNCw2ICsyNCwyMSBAQAogCiB1bnNpZ25lZCBpbnQgcHBjX3N3aW90bGJfZW5hYmxlOwogCitzdGF0aWMgdTY0IHN3aW90bGJfcG93ZXJwY19nZXRfcmVxdWlyZWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXU2NCBlbmQsIG1hc2ssIG1heF9kaXJlY3RfZG1hX2FkZHIgPSBkZXYtPmFyY2hkYXRhLm1heF9kaXJlY3RfZG1hX2FkZHI7CisKKwllbmQgPSBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpOworCWlmIChtYXhfZGlyZWN0X2RtYV9hZGRyICYmIGVuZCA+IG1heF9kaXJlY3RfZG1hX2FkZHIpCisJCWVuZCA9IG1heF9kaXJlY3RfZG1hX2FkZHI7CisJZW5kICs9IGdldF9kbWFfb2Zmc2V0KGRldik7CisKKwltYXNrID0gMVVMTCA8PCAoZmxzNjQoZW5kKSAtIDEpOworCW1hc2sgKz0gbWFzayAtIDE7CisKKwlyZXR1cm4gbWFzazsKK30KKwogLyoKICAqIEF0IHRoZSBtb21lbnQsIGFsbCBwbGF0Zm9ybXMgdGhhdCB1c2UgdGhpcyBjb2RlIG9ubHkgcmVxdWlyZQogICogc3dpb3RsYiB0byBiZSB1c2VkIGlmIHdlJ3JlIG9wZXJhdGluZyBvbiBISUdITUVNLiAgU2luY2UKQEAgLTQ0LDYgKzU5LDcgQEAKIAkuc3luY19zZ19mb3JfY3B1ID0gc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUsCiAJLnN5bmNfc2dfZm9yX2RldmljZSA9IHN3aW90bGJfc3luY19zZ19mb3JfZGV2aWNlLAogCS5tYXBwaW5nX2Vycm9yID0gc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvciwKKwkuZ2V0X3JlcXVpcmVkX21hc2sgPSBzd2lvdGxiX3Bvd2VycGNfZ2V0X3JlcXVpcmVkLAogfTsKIAogdm9pZCBwY2lfZG1hX2Rldl9zZXR1cF9zd2lvdGxiKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLmMKaW5kZXggNGYwOTU5Zi4uN2QwMjMzYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+CiAjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KQEAgLTk2LDYgKzk3LDE4IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHU2NCBkbWFfZGlyZWN0X2dldF9yZXF1aXJlZF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1NjQgZW5kLCBtYXNrOworCisJZW5kID0gbWVtYmxvY2tfZW5kX29mX0RSQU0oKSArIGdldF9kbWFfb2Zmc2V0KGRldik7CisKKwltYXNrID0gMVVMTCA8PCAoZmxzNjQoZW5kKSAtIDEpOworCW1hc2sgKz0gbWFzayAtIDE7CisKKwlyZXR1cm4gbWFzazsKK30KKwogc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGRtYV9kaXJlY3RfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgICAgIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LApAQCAtMTM3LDEzICsxNTAsMTQgQEAKICNlbmRpZgogCiBzdHJ1Y3QgZG1hX21hcF9vcHMgZG1hX2RpcmVjdF9vcHMgPSB7Ci0JLmFsbG9jX2NvaGVyZW50CT0gZG1hX2RpcmVjdF9hbGxvY19jb2hlcmVudCwKLQkuZnJlZV9jb2hlcmVudAk9IGRtYV9kaXJlY3RfZnJlZV9jb2hlcmVudCwKLQkubWFwX3NnCQk9IGRtYV9kaXJlY3RfbWFwX3NnLAotCS51bm1hcF9zZwk9IGRtYV9kaXJlY3RfdW5tYXBfc2csCi0JLmRtYV9zdXBwb3J0ZWQJPSBkbWFfZGlyZWN0X2RtYV9zdXBwb3J0ZWQsCi0JLm1hcF9wYWdlCT0gZG1hX2RpcmVjdF9tYXBfcGFnZSwKLQkudW5tYXBfcGFnZQk9IGRtYV9kaXJlY3RfdW5tYXBfcGFnZSwKKwkuYWxsb2NfY29oZXJlbnQJCQk9IGRtYV9kaXJlY3RfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQJCQk9IGRtYV9kaXJlY3RfZnJlZV9jb2hlcmVudCwKKwkubWFwX3NnCQkJCT0gZG1hX2RpcmVjdF9tYXBfc2csCisJLnVubWFwX3NnCQkJPSBkbWFfZGlyZWN0X3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkCQkJPSBkbWFfZGlyZWN0X2RtYV9zdXBwb3J0ZWQsCisJLm1hcF9wYWdlCQkJPSBkbWFfZGlyZWN0X21hcF9wYWdlLAorCS51bm1hcF9wYWdlCQkJPSBkbWFfZGlyZWN0X3VubWFwX3BhZ2UsCisJLmdldF9yZXF1aXJlZF9tYXNrCQk9IGRtYV9kaXJlY3RfZ2V0X3JlcXVpcmVkX21hc2ssCiAjaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQogCS5zeW5jX3NpbmdsZV9mb3JfY3B1IAkJPSBkbWFfZGlyZWN0X3N5bmNfc2luZ2xlLAogCS5zeW5jX3NpbmdsZV9mb3JfZGV2aWNlIAk9IGRtYV9kaXJlY3Rfc3luY19zaW5nbGUsCkBAIC0xNzAsNiArMTg0LDIzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGRtYV9zZXRfbWFzayk7CiAKK3U2NCBkbWFfZ2V0X3JlcXVpcmVkX21hc2soc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFfbWFwX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlpZiAocHBjX21kLmRtYV9nZXRfcmVxdWlyZWRfbWFzaykKKwkJcmV0dXJuIHBwY19tZC5kbWFfZ2V0X3JlcXVpcmVkX21hc2soZGV2KTsKKworCWlmICh1bmxpa2VseShkbWFfb3BzID09IE5VTEwpKQorCQlyZXR1cm4gMDsKKworCWlmIChkbWFfb3BzLT5nZXRfcmVxdWlyZWRfbWFzaykKKwkJcmV0dXJuIGRtYV9vcHMtPmdldF9yZXF1aXJlZF9tYXNrKGRldik7CisKKwlyZXR1cm4gRE1BX0JJVF9NQVNLKDggKiBzaXplb2YoZG1hX2FkZHJfdCkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1hX2dldF9yZXF1aXJlZF9tYXNrKTsKKwogc3RhdGljIGludCBfX2luaXQgZG1hX2luaXQodm9pZCkKIHsKICAgICAgICBkbWFfZGVidWdfaW5pdChQUkVBTExPQ19ETUFfREVCVUdfRU5UUklFUyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKaW5kZXggNDFiMDJjNy4uY2Y5YzY5YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAKICNpZmRlZiBDT05GSUdfQ0JFX1JBUwogCVNURF9FWENFUFRJT05fSFYoMHgxMjAwLCAweDEyMDIsIGNiZV9zeXN0ZW1fZXJyb3IpCi0JS1ZNX0hBTkRMRVJfUFJfU0tJUChQQUNBX0VYR0VOLCBFWENfSFYsIDB4MTIwMikKKwlLVk1fSEFORExFUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHgxMjAyKQogI2VuZGlmIC8qIENPTkZJR19DQkVfUkFTICovCiAKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHgxMzAwLCAweDEzMDAsIGluc3RydWN0aW9uX2JyZWFrcG9pbnQpCkBAIC0yNzUsNyArMjc1LDcgQEAKIAogI2lmZGVmIENPTkZJR19DQkVfUkFTCiAJU1REX0VYQ0VQVElPTl9IVigweDE2MDAsIDB4MTYwMiwgY2JlX21haW50ZW5hbmNlKQotCUtWTV9IQU5ETEVSX1BSX1NLSVAoUEFDQV9FWEdFTiwgRVhDX0hWLCAweDE2MDIpCisJS1ZNX0hBTkRMRVJfU0tJUChQQUNBX0VYR0VOLCBFWENfSFYsIDB4MTYwMikKICNlbmRpZiAvKiBDT05GSUdfQ0JFX1JBUyAqLwogCiAJU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4MTcwMCwgMHgxNzAwLCBhbHRpdmVjX2Fzc2lzdCkKQEAgLTI4Myw3ICsyODMsNyBAQAogCiAjaWZkZWYgQ09ORklHX0NCRV9SQVMKIAlTVERfRVhDRVBUSU9OX0hWKDB4MTgwMCwgMHgxODAyLCBjYmVfdGhlcm1hbCkKLQlLVk1fSEFORExFUl9QUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHgxODAyKQorCUtWTV9IQU5ETEVSX1NLSVAoUEFDQV9FWEdFTiwgRVhDX0hWLCAweDE4MDIpCiAjZW5kaWYgLyogQ09ORklHX0NCRV9SQVMgKi8KIAogCS4gPSAweDMwMDAKQEAgLTQyNywxNiArNDI3LDYgQEAKIAliCS4JCQkJLyogcHJldmVudCBzcGVjLiBleGVjdXRpb24gKi8KICNlbmRpZiAvKiBfX0RJU0FCTEVEX18gKi8KIAotLyogS1ZNJ3MgdHJhbXBvbGluZSBjb2RlIG5lZWRzIHRvIGJlIGNsb3NlIHRvIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLQotI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIKLSNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19QUgotI2luY2x1ZGUgIi4uL2t2bS9ib29rM3Nfcm1oYW5kbGVycy5TIgotI2Vsc2UKLSNpbmNsdWRlICIuLi9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUyIKLSNlbmRpZgotI2VuZGlmCi0KIAkuYWxpZ24JNwogCS5nbG9ibAlfX2VuZF9pbnRlcnJ1cHRzCiBfX2VuZF9pbnRlcnJ1cHRzOgpAQCAtMTE0Myw3ICsxMTMzLDcgQEAKIAlyZmlkCiAJYgkuCS8qIHByZXZlbnQgc3BlY3VsYXRpdmUgZXhlY3V0aW9uICovCiAKLSNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfUFNFUklFUykgfHwgZGVmaW5lZChDT05GSUdfUFBDX1BPV0VSTlYpCiAvKgogICogRGF0YSBhcmVhIHJlc2VydmVkIGZvciBGV05NSSBvcHRpb24uCiAgKiBUaGlzIGFkZHJlc3MgKDB4NzAwMCkgaXMgZml4ZWQgYnkgdGhlIFJQQS4KQEAgLTExNTEsNyArMTE0MSw3IEBACiAJLj0gMHg3MDAwCiAJLmdsb2JsIGZ3bm1pX2RhdGFfYXJlYQogZndubWlfZGF0YV9hcmVhOgotI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BQQ19QU0VSSUVTKSB8fCBkZWZpbmVkKENPTkZJR19QUENfUE9XRVJOVikgKi8KIAogCS8qIGlTZXJpZXMgZG9lcyBub3QgdXNlIHRoZSBGV05NSSBzdHVmZiwgc28gaXQgaXMgc2FmZSB0byBwdXQKIAkgKiB0aGlzIGhlcmUsIGV2ZW4gaWYgd2UgbGF0ZXIgYWxsb3cga2VybmVscyB0aGF0IHdpbGwgYm9vdCBvbgpAQCAtMTE3Niw5ICsxMTY2LDEyIEBACiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KIAotI2lmZGVmIENPTkZJR19QUENfUFNFUklFUworI2lmIGRlZmluZWQoQ09ORklHX1BQQ19QU0VSSUVTKSB8fCBkZWZpbmVkKENPTkZJR19QUENfUE9XRVJOVikKKwkvKiBwc2VyaWVzIGFuZCBwb3dlcm52IG5lZWQgdG8ga2VlcCB0aGUgd2hvbGUgcGFnZSBmcm9tCisJICogMHg3MDAwIHRvIDB4ODAwMCBmcmVlIGZvciB1c2UgYnkgdGhlIGZpcm13YXJlCisJICovCiAgICAgICAgIC4gPSAweDgwMDAKLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QUENfUFNFUklFUykgfHwgZGVmaW5lZChDT05GSUdfUFBDX1BPV0VSTlYpICovCiAKIC8qCiAgKiBTcGFjZSBmb3IgQ1BVMCdzIHNlZ21lbnQgdGFibGUuCkBAIC0xMTkzLDMgKzExODYsMTkgQEAKIAkuZ2xvYmwgaW5pdGlhbF9zdGFiCiBpbml0aWFsX3N0YWI6CiAJLnNwYWNlCTQwOTYKKyNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlYKK19HTE9CQUwob3BhbF9tY19zZWNvbmRhcnlfaGFuZGxlcikKKwlITVRfTUVESVVNCisJU0VUX1NDUkFUQ0gwKHIxMykKKwlHRVRfUEFDQShyMTMpCisJY2xybGRpCXIzLHIzLDIKKwl0b3ZpcnQocjMscjMpCisJc3RkCXIzLFBBQ0FfT1BBTF9NQ19FVlQocjEzKQorCWxkCXIxMyxPUEFMX01DX1NSUjAocjMpCisJbXRzcHIJU1BSTl9TUlIwLHIxMworCWxkCXIxMyxPUEFMX01DX1NSUjEocjMpCisJbXRzcHIJU1BSTl9TUlIxLHIxMworCWxkCXIzLE9QQUxfTUNfR1BSMyhyMykKKwlHRVRfU0NSQVRDSDAocjEzKQorCWIJbWFjaGluZV9jaGVja19wU2VyaWVzCisjZW5kaWYgLyogQ09ORklHX1BQQ19QT1dFUk5WICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2Zpcm13YXJlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2Zpcm13YXJlLmMKaW5kZXggNmIxZjQyNy4uMmVhZTQ0NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9maXJtd2FyZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZmlybXdhcmUuYwpAQCAtMTMsNyArMTMsOCBAQAogICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUwppbmRleCBiYTI1MGQ1Li4wNjU0ZGJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUwpAQCAtMTM5LDggKzEzOSw3IEBACiAJdHJhcAogI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCi0xOgltcglyMzEscjMJCQkvKiBzYXZlIHBhcmFtZXRlcnMgKi8KLQltcglyMzAscjQKKzE6CW1yCXIzMSxyMwkJCS8qIHNhdmUgZGV2aWNlIHRyZWUgcHRyICovCiAJbGkJcjI0LDAJCQkvKiBjcHUgIyAqLwogCiAvKgpAQCAtOTY0LDggKzk2Myw4IEBACiAgKiBEbyBlYXJseSBwbGF0Zm9ybS1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiwKICAqIGFuZCBzZXQgdXAgdGhlIE1NVS4KICAqLwotCW1yCXIzLHIzMQotCW1yCXI0LHIzMAorCWxpCXIzLDAKKwltcglyNCxyMzEKIAlibAltYWNoaW5lX2luaXQKIAlibAlfX3NhdmVfY3B1X3NldHVwCiAJYmwJTU1VX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80MHguUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80MHguUwppbmRleCBhOTE2MjZkLi44NzJhNmFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDB4LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQweC5TCkBAIC01OCwxMyArNTgsNyBAQAogX0VOVFJZKF9zdGV4dCk7CiBfRU5UUlkoX3N0YXJ0KTsKIAotCS8qIFNhdmUgcGFyYW1ldGVycyB3ZSBhcmUgcGFzc2VkLgotCSovCi0JbXIJcjMxLHIzCi0JbXIJcjMwLHI0Ci0JbXIJcjI5LHI1Ci0JbXIJcjI4LHI2Ci0JbXIJcjI3LHI3CisJbXIJcjMxLHIzCQkJLyogc2F2ZSBkZXZpY2UgdHJlZSBwdHIgKi8KIAogCS8qIFdlIGhhdmUgdG8gdHVybiBvbiB0aGUgTU1VIHJpZ2h0IGF3YXkgc28gd2UgZ2V0IGNhY2hlIG1vZGVzCiAJICogc2V0IGNvcnJlY3RseS4KQEAgLTg0OSwxMSArODQzLDggQEAKIC8qCiAgKiBEZWNpZGUgd2hhdCBzb3J0IG9mIG1hY2hpbmUgdGhpcyBpcyBhbmQgaW5pdGlhbGl6ZSB0aGUgTU1VLgogICovCi0JbXIJcjMscjMxCi0JbXIJcjQscjMwCi0JbXIJcjUscjI5Ci0JbXIJcjYscjI4Ci0JbXIJcjcscjI3CisJbGkJcjMsMAorCW1yCXI0LHIzMQogCWJsCW1hY2hpbmVfaW5pdAogCWJsCU1NVV9pbml0CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80NHguUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80NHguUwppbmRleCBmOGU5NzFiLi5iNzI1ZGFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDR4LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQ0eC5TCkBAIC02MSwxNCArNjEsNyBAQAogCSAqIG9mIGFiYXRyb25fcHRlcHRycwogCSAqLwogCW5vcAotLyoKLSAqIFNhdmUgcGFyYW1ldGVycyB3ZSBhcmUgcGFzc2VkCi0gKi8KLQltcglyMzEscjMKLQltcglyMzAscjQKLQltcglyMjkscjUKLQltcglyMjgscjYKLQltcglyMjcscjcKKwltcglyMzEscjMJCS8qIHNhdmUgZGV2aWNlIHRyZWUgcHRyICovCiAJbGkJcjI0LDAJCS8qIENQVSBudW1iZXIgKi8KIAogCWJsCWluaXRfY3B1X3N0YXRlCkBAIC0xMjAsMTEgKzExMyw4IEBACiAvKgogICogRGVjaWRlIHdoYXQgc29ydCBvZiBtYWNoaW5lIHRoaXMgaXMgYW5kIGluaXRpYWxpemUgdGhlIE1NVS4KICAqLwotCW1yCXIzLHIzMQotCW1yCXI0LHIzMAotCW1yCXI1LHIyOQotCW1yCXI2LHIyOAotCW1yCXI3LHIyNworCWxpCXIzLDAKKwltcglyNCxyMzEKIAlibAltYWNoaW5lX2luaXQKIAlibAlNTVVfaW5pdAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCmluZGV4IDM1NjRjNDkuLjA2YzcyNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCkBAIC01MSw2ICs1MSwxMSBAQAogICogIEZvciBwU2VyaWVzIG9yIHNlcnZlciBwcm9jZXNzb3JzOgogICogICAxLiBUaGUgTU1VIGlzIG9mZiAmIG9wZW4gZmlybXdhcmUgaXMgcnVubmluZyBpbiByZWFsIG1vZGUuCiAgKiAgIDIuIFRoZSBrZXJuZWwgaXMgZW50ZXJlZCBhdCBfX3N0YXJ0CisgKiAtb3ItIEZvciBPUEFMIGVudHJ5OgorICogICAxLiBUaGUgTU1VIGlzIG9mZiwgcHJvY2Vzc29yIGluIEhWIG1vZGUsIHByaW1hcnkgQ1BVIGVudGVycyBhdCAwCisgKiAgICAgIHdpdGggZGV2aWNlLXRyZWUgaW4gZ3ByMy4gV2UgYWxzbyBnZXQgT1BBTCBiYXNlIGluIHI4IGFuZAorICoJZW50cnkgaW4gcjkgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICogICAyLiBTZWNvbmRhcnkgcHJvY2Vzc29ycyBlbnRlciBhdCAweDYwIHdpdGggUElSIGluIGdwcjMKICAqCiAgKiAgRm9yIGlTZXJpZXM6CiAgKiAgIDEuIFRoZSBNTVUgaXMgb24gKGFzIGl0IGFsd2F5cyBpcyBmb3IgaVNlcmllcykKQEAgLTMzMSw2ICszMzYsMTEgQEAKIAkvKiBTYXZlIHBhcmFtZXRlcnMgKi8KIAltcglyMzEscjMKIAltcglyMzAscjQKKyNpZmRlZiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX09QQUwKKwkvKiBTYXZlIE9QQUwgZW50cnkgKi8KKwltcglyMjgscjgKKwltcglyMjkscjkKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKIAlibAkuc3RhcnRfaW5pdGlhbGl6YXRpb25fYm9vazNlCkBAIC02NzQsOSArNjg0LDkgQEAKIF9HTE9CQUwocmVsYXRpdmVfdG9jKQogCW1mbHIJcjAKIAliY2wJMjAsMzEsJCs0Ci0wOgltZmxyCXI5Ci0JbGQJcjIsKHBfdG9jIC0gMGIpKHI5KQotCWFkZAlyMixyMixyOQorMDoJbWZscglyMTEKKwlsZAlyMiwocF90b2MgLSAwYikocjExKQorCWFkZAlyMixyMixyMTEKIAltdGxyCXIwCiAJYmxyCiAKQEAgLTcwNyw2ICs3MTcsMTIgQEAKIAliZG56CTNiCiA0OgogCisjaWZkZWYgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMCisJLyogU2V0dXAgT1BBTCBlbnRyeSAqLworCXN0ZAlyMjgsMChyMTEpOworCXN0ZAlyMjksOChyMTEpOworI2VuZGlmCisKICNpZm5kZWYgQ09ORklHX1BQQ19CT09LM0UKIAltZm1zcglyNgogCW9yaQlyNixyNixNU1JfUkkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF84eHguUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF84eHguUwppbmRleCAxY2JmNjRlLi5iNjhjYjE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfOHh4LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5TCkBAIC03NiwxMSArNzYsNyBAQAogICovCiAJLmdsb2JsCV9fc3RhcnQKIF9fc3RhcnQ6Ci0JbXIJcjMxLHIzCQkJLyogc2F2ZSBwYXJhbWV0ZXJzICovCi0JbXIJcjMwLHI0Ci0JbXIJcjI5LHI1Ci0JbXIJcjI4LHI2Ci0JbXIJcjI3LHI3CisJbXIJcjMxLHIzCQkJLyogc2F2ZSBkZXZpY2UgdHJlZSBwdHIgKi8KIAogCS8qIFdlIGhhdmUgdG8gdHVybiBvbiB0aGUgTU1VIHJpZ2h0IGF3YXkgc28gd2UgZ2V0IGNhY2hlIG1vZGVzCiAJICogc2V0IGNvcnJlY3RseS4KQEAgLTcyMywxMSArNzE5LDggQEAKIC8qCiAgKiBEZWNpZGUgd2hhdCBzb3J0IG9mIG1hY2hpbmUgdGhpcyBpcyBhbmQgaW5pdGlhbGl6ZSB0aGUgTU1VLgogICovCi0JbXIJcjMscjMxCi0JbXIJcjQscjMwCi0JbXIJcjUscjI5Ci0JbXIJcjYscjI4Ci0JbXIJcjcscjI3CisJbGkJcjMsMAorCW1yCXI0LHIzMQogCWJsCW1hY2hpbmVfaW5pdAogCWJsCU1NVV9pbml0CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwppbmRleCA1MDg0NTkyLi45ZjVkMjEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCkBAIC02MywxNyArNjMsMzAgQEAKIAkgKiBvZiBhYmF0cm9uX3B0ZXB0cnMKIAkgKi8KIAlub3AKLS8qCi0gKiBTYXZlIHBhcmFtZXRlcnMgd2UgYXJlIHBhc3NlZAotICovCi0JbXIJcjMxLHIzCi0JbXIJcjMwLHI0Ci0JbXIJcjI5LHI1Ci0JbXIJcjI4LHI2Ci0JbXIJcjI3LHI3Ci0JbGkJcjI1LDAJCS8qIHBoeXMga2VybmVsIHN0YXJ0IChsb3cpICovCi0JbGkJcjI0LDAJCS8qIENQVSBudW1iZXIgKi8KLQlsaQlyMjMsMAkJLyogcGh5cyBrZXJuZWwgc3RhcnQgKGhpZ2gpICovCisKKwkvKiBUcmFuc2xhdGUgZGV2aWNlIHRyZWUgYWRkcmVzcyB0byBwaHlzaWNhbCwgc2F2ZSBpbiByMzAvcjMxICovCisJbWZtc3IJcjE2CisJbWZzcHIJcjE3LFNQUk5fUElECisJcmx3aW5tCXIxNyxyMTcsMTYsMHgzZmZmMDAwMAkvKiB0dXJuIFBJRCBpbnRvIE1BUzZbU1BJRF0gKi8KKwlybHdpbWkJcjE3LHIxNiwyOCwweDAwMDAwMDAxCS8qIHR1cm4gTVNSW0RTXSBpbnRvIE1BUzZbU0FTXSAqLworCW10c3ByCVNQUk5fTUFTNixyMTcKKworCXRsYnN4CTAscjMJCQkvKiBtdXN0IHN1Y2NlZWQgKi8KKworCW1mc3ByCXIxNixTUFJOX01BUzEKKwltZnNwcglyMjAsU1BSTl9NQVMzCisJcmx3aW5tCXIxNyxyMTYsMjUsMHgxZgkJLyogcjE3ID0gbG9nMihwYWdlIHNpemUpICovCisJbGkJcjE4LDEwMjQKKwlzbHcJcjE4LHIxOCxyMTcJCS8qIHIxOCA9IHBhZ2Ugc2l6ZSAqLworCWFkZGkJcjE4LHIxOCwtMQorCWFuZAlyMTkscjMscjE4CQkvKiByMTkgPSBwYWdlIG9mZnNldCAqLworCWFuZGMJcjMxLHIyMCxyMTgJCS8qIHIzMSA9IHBhZ2UgYmFzZSAqLworCW9yCXIzMSxyMzEscjE5CQkvKiByMzEgPSBkZXZ0cmVlIHBoeXMgYWRkciAqLworCW1mc3ByCXIzMCxTUFJOX01BUzcKKworCWxpCXIyNSwwCQkJLyogcGh5cyBrZXJuZWwgc3RhcnQgKGxvdykgKi8KKwlsaQlyMjQsMAkJCS8qIENQVSBudW1iZXIgKi8KKwlsaQlyMjMsMAkJCS8qIHBoeXMga2VybmVsIHN0YXJ0IChoaWdoKSAqLwogCiAvKiBXZSB0cnkgdG8gbm90IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IGhvdyB0aGUgYm9vdCBsb2FkZXIKICAqIHNldHVwIG9yIHVzZWQgdGhlIFRMQnMuICBXZSBpbnZhbGlkYXRlIGFsbCBtYXBwaW5ncyBmcm9tIHRoZQpAQCAtMTk4LDExICsyMTEsOCBAQAogLyoKICAqIERlY2lkZSB3aGF0IHNvcnQgb2YgbWFjaGluZSB0aGlzIGlzIGFuZCBpbml0aWFsaXplIHRoZSBNTVUuCiAgKi8KLQltcglyMyxyMzEKLQltcglyNCxyMzAKLQltcglyNSxyMjkKLQltcglyNixyMjgKLQltcglyNyxyMjcKKwltcglyMyxyMzAKKwltcglyNCxyMzEKIAlibAltYWNoaW5lX2luaXQKIAlibAlNTVVfaW5pdAogCkBAIC0yMzYsOCArMjQ2LDI0IEBACiAgKiBpZiB3ZSBmaW5kIHRoZSBwdGUgKGZhbGwgdGhyb3VnaCk6CiAgKiAgIHIxMSBpcyBsb3cgcHRlIHdvcmQKICAqICAgcjEyIGlzIHBvaW50ZXIgdG8gdGhlIHB0ZQorICogICByMTAgaXMgdGhlIHBzaGlmdCBmcm9tIHRoZSBQR0QsIGlmIHdlJ3JlIGEgaHVnZXBhZ2UKICAqLwogI2lmZGVmIENPTkZJR19QVEVfNjRCSVQKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisjZGVmaW5lIEZJTkRfUFRFCVwKKwlybHdpbm0JcjEyLCByMTAsIDEzLCAxOSwgMjk7CS8qIENvbXB1dGUgcGdkaXIvcG1kIG9mZnNldCAqLwlcCisJbHd6eAlyMTEsIHIxMiwgcjExOwkJLyogR2V0IHBnZC9wbWQgZW50cnkgKi8JCVwKKwlybHdpbm0uCXIxMiwgcjExLCAwLCAwLCAyMDsJLyogRXh0cmFjdCBwdCBiYXNlIGFkZHJlc3MgKi8JXAorCWJsdAkxMDAwZjsJCQkvKiBOb3JtYWwgbm9uLWh1Z2UgcGFnZSAqLwlcCisJYmVxCTJmOwkJCS8qIEJhaWwgaWYgbm8gdGFibGUgKi8JCVwKKwlvcmlzCXIxMSwgcjExLCBQRF9IVUdFQGg7CS8qIFB1dCBiYWNrIGFkZHJlc3MgYml0ICovCVwKKwlhbmRpLglyMTAsIHIxMSwgSFVHRVBEX1NISUZUX01BU0tAbDsgLyogZXh0cmFjdCBzaXplIGZpZWxkICovCVwKKwl4b3IJcjEyLCByMTAsIHIxMTsJCS8qIGRyb3Agc2l6ZSBiaXRzIGZyb20gcG9pbnRlciAqLyBcCisJYgkxMDAxZjsJCQkJCQkJXAorMTAwMDoJcmx3aW1pCXIxMiwgcjEwLCAyMywgMjAsIDI4OwkvKiBDb21wdXRlIHB0ZSBhZGRyZXNzICovCVwKKwlsaQlyMTAsIDA7CQkJLyogY2xlYXIgcjEwICovCQkJXAorMTAwMToJbHd6CXIxMSwgNChyMTIpOwkJLyogR2V0IHB0ZSBlbnRyeSAqLworI2Vsc2UKICNkZWZpbmUgRklORF9QVEUJXAogCXJsd2lubQlyMTIsIHIxMCwgMTMsIDE5LCAyOTsJLyogQ29tcHV0ZSBwZ2Rpci9wbWQgb2Zmc2V0ICovCVwKIAlsd3p4CXIxMSwgcjEyLCByMTE7CQkvKiBHZXQgcGdkL3BtZCBlbnRyeSAqLwkJXApAQCAtMjQ1LDcgKzI3MSw4IEBACiAJYmVxCTJmOwkJCS8qIEJhaWwgaWYgbm8gdGFibGUgKi8JCVwKIAlybHdpbWkJcjEyLCByMTAsIDIzLCAyMCwgMjg7CS8qIENvbXB1dGUgcHRlIGFkZHJlc3MgKi8JXAogCWx3eglyMTEsIDQocjEyKTsJCS8qIEdldCBwdGUgZW50cnkgKi8KLSNlbHNlCisjZW5kaWYgLyogSFVHRVBBR0UgKi8KKyNlbHNlIC8qICFQVEVfNjRCSVQgKi8KICNkZWZpbmUgRklORF9QVEUJXAogCXJsd2ltaQlyMTEsIHIxMCwgMTIsIDIwLCAyOTsJLyogQ3JlYXRlIEwxIChwZ2Rpci9wbWQpIGFkZHJlc3MgKi8JXAogCWx3eglyMTEsIDAocjExKTsJCS8qIEdldCBMMSBlbnRyeSAqLwkJCVwKQEAgLTQwMiw4ICs0MjksOCBAQAogCiAjaWZkZWYgQ09ORklHX1BURV82NEJJVAogI2lmZGVmIENPTkZJR19TTVAKLQlzdWJmCXIxMCxyMTEscjEyCQkvKiBjcmVhdGUgZmFsc2UgZGF0YSBkZXAgKi8KLQlsd3p4CXIxMyxyMTEscjEwCQkvKiBHZXQgdXBwZXIgcHRlIGJpdHMgKi8KKwlzdWJmCXIxMyxyMTEscjEyCQkvKiBjcmVhdGUgZmFsc2UgZGF0YSBkZXAgKi8KKwlsd3p4CXIxMyxyMTEscjEzCQkvKiBHZXQgdXBwZXIgcHRlIGJpdHMgKi8KICNlbHNlCiAJbHd6CXIxMywwKHIxMikJCS8qIEdldCB1cHBlciBwdGUgYml0cyAqLwogI2VuZGlmCkBAIC00ODMsOCArNTEwLDggQEAKIAogI2lmZGVmIENPTkZJR19QVEVfNjRCSVQKICNpZmRlZiBDT05GSUdfU01QCi0Jc3ViZglyMTAscjExLHIxMgkJLyogY3JlYXRlIGZhbHNlIGRhdGEgZGVwICovCi0JbHd6eAlyMTMscjExLHIxMAkJLyogR2V0IHVwcGVyIHB0ZSBiaXRzICovCisJc3ViZglyMTMscjExLHIxMgkJLyogY3JlYXRlIGZhbHNlIGRhdGEgZGVwICovCisJbHd6eAlyMTMscjExLHIxMwkJLyogR2V0IHVwcGVyIHB0ZSBiaXRzICovCiAjZWxzZQogCWx3eglyMTMsMChyMTIpCQkvKiBHZXQgdXBwZXIgcHRlIGJpdHMgKi8KICNlbmRpZgpAQCAtNTQ4LDcgKzU3NSw3IEBACiAvKgogICogQm90aCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgVExCIG1pc3MgZ2V0IHRvIHRoaXMKICAqIHBvaW50IHRvIGxvYWQgdGhlIFRMQi4KLSAqCXIxMCAtIGF2YWlsYWJsZSB0byB1c2UKKyAqCXIxMCAtIHRzaXplIGVuY29kaW5nIChpZiBIVUdFVExCX1BBR0UpIG9yIGF2YWlsYWJsZSB0byB1c2UKICAqCXIxMSAtIFRMQiAoaW5mbyBmcm9tIExpbnV4IFBURSkKICAqCXIxMiAtIGF2YWlsYWJsZSB0byB1c2UKICAqCXIxMyAtIHVwcGVyIGJpdHMgb2YgUFRFIChpZiBQVEVfNjRCSVQpIG9yIGF2YWlsYWJsZSB0byB1c2UKQEAgLTU1OCwyMSArNTg1LDczIEBACiAgKglVcG9uIGV4aXQsIHdlIHJlbG9hZCBldmVyeXRoaW5nIGFuZCBSRkkuCiAgKi8KIGZpbmlzaF90bGJfbG9hZDoKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisJY21wd2kJNiwgcjEwLCAwCQkJLyogY2hlY2sgZm9yIGh1Z2UgcGFnZSAqLworCWJlcQk2LCBmaW5pc2hfdGxiX2xvYWRfY29udCAgICAJLyogIWh1Z2UgKi8KKworCS8qIEFsYXMsIHdlIG5lZWQgbW9yZSBzY3JhdGNoIHJlZ2lzdGVycyBmb3IgaHVnZXBhZ2VzICovCisJbWZzcHIJcjEyLCBTUFJOX1NQUkdfVEhSRUFECisJc3R3CXIxNCwgVEhSRUFEX05PUk1TQVZFKDQpKHIxMikKKwlzdHcJcjE1LCBUSFJFQURfTk9STVNBVkUoNSkocjEyKQorCXN0dwlyMTYsIFRIUkVBRF9OT1JNU0FWRSg2KShyMTIpCisJc3R3CXIxNywgVEhSRUFEX05PUk1TQVZFKDcpKHIxMikKKworCS8qIEdldCB0aGUgbmV4dF90bGJjYW1faWR4IHBlcmNwdSB2YXIgKi8KKyNpZmRlZiBDT05GSUdfU01QCisJbHd6CXIxMiwgVEhSRUFEX0lORk8tVEhSRUFEKHIxMikKKwlsd3oJcjE1LCBUSV9DUFUocjEyKQorCWxpcyAgICAgcjE0LCBfX3Blcl9jcHVfb2Zmc2V0QGgKKwlvcmkgICAgIHIxNCwgcjE0LCBfX3Blcl9jcHVfb2Zmc2V0QGwKKwlybHdpbm0gIHIxNSwgcjE1LCAyLCAwLCAyOQorCWx3enggICAgcjE2LCByMTQsIHIxNQorI2Vsc2UKKwlsaQlyMTYsIDAKKyNlbmRpZgorCWxpcyAgICAgcjE3LCBuZXh0X3RsYmNhbV9pZHhAaAorCW9yaQlyMTcsIHIxNywgbmV4dF90bGJjYW1faWR4QGwKKwlhZGQJcjE3LCByMTcsIHIxNgkJCS8qIHIxNyA9ICpuZXh0X3RsYmNhbV9pZHggKi8KKwlsd3ogICAgIHIxNSwgMChyMTcpCQkJLyogcjE1ID0gbmV4dF90bGJjYW1faWR4ICovCisKKwlsaXMJcjE0LCBNQVMwX1RMQlNFTCgxKUBoCQkvKiBzZWxlY3QgVExCMSAoVExCQ0FNKSAqLworCXJsd2ltaQlyMTQsIHIxNSwgMTYsIDQsIDE1CQkvKiBuZXh0X3RsYmNhbV9pZHggZW50cnkgKi8KKwltdHNwcglTUFJOX01BUzAsIHIxNAorCisJLyogRXh0cmFjdCBUTEIxQ0ZHKE5FTlRSWSkgKi8KKwltZnNwcglyMTYsIFNQUk5fVExCMUNGRworCWFuZGkuCXIxNiwgcjE2LCAweGZmZgorCisJLyogVXBkYXRlIG5leHRfdGxiY2FtX2lkeCwgd3JhcHBpbmcgd2hlbiBuZWNlc3NhcnkgKi8KKwlhZGRpCXIxNSwgcjE1LCAxCisJY21wdwlyMTUsIHIxNgorCWJsdCAJMTAwZgorCWxpcwlyMTQsIHRsYmNhbV9pbmRleEBoCisJb3JpCXIxNCwgcjE0LCB0bGJjYW1faW5kZXhAbAorCWx3eglyMTUsIDAocjE0KQorMTAwOglzdHcJcjE1LCAwKHIxNykKKworCS8qCisJICogQ2FsYyBNQVMxX1RTSVpFIGZyb20gcjEwICh3aGljaCBoYXMgcHNoaWZ0IGVuY29kZWQpCisJICogdGxiX2VuYyA9IChwc2hpZnQgLSAxMCkuCisJICovCisJc3ViaQlyMTUsIHIxMCwgMTAKKwltZnNwcglyMTYsIFNQUk5fTUFTMQorCXJsd2ltaQlyMTYsIHIxNSwgNywgMjAsIDI0CisJbXRzcHIJU1BSTl9NQVMxLCByMTYKKworCS8qIGNvcHkgdGhlIHBzaGlmdCBmb3IgdXNlIGxhdGVyICovCisJbXIJcjE0LCByMTAKKworCS8qIGZhbGwgdGhyb3VnaCAqLworCisjZW5kaWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLworCiAJLyoKIAkgKiBXZSBzZXQgZXhlY3V0ZSwgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoZSBncmFudWxhcml0eSB0bwogCSAqIHByb3Blcmx5IHNldCB0aGlzIGF0IHRoZSBwYWdlIGxldmVsIChMaW51eCBwcm9ibGVtKS4KIAkgKiBNYW55IG9mIHRoZXNlIGJpdHMgYXJlIHNvZnR3YXJlIG9ubHkuICBCaXRzIHdlIGRvbid0IHNldAogCSAqIGhlcmUgd2UgKHByb3Blcmx5IHNob3VsZCkgYXNzdW1lIGhhdmUgdGhlIGFwcHJvcHJpYXRlIHZhbHVlLgogCSAqLwotCi0JbWZzcHIJcjEyLCBTUFJOX01BUzIKLSNpZmRlZiBDT05GSUdfUFRFXzY0QklUCi0Jcmx3aW1pCXIxMiwgcjExLCAzMi0xOSwgMjcsIDMxCS8qIGV4dHJhY3QgV0lNR0UgZnJvbSBwdGUgKi8KLSNlbHNlCi0Jcmx3aW1pCXIxMiwgcjExLCAyNiwgMjcsIDMxCS8qIGV4dHJhY3QgV0lNR0UgZnJvbSBwdGUgKi8KLSNlbmRpZgotCW10c3ByCVNQUk5fTUFTMiwgcjEyCi0KK2ZpbmlzaF90bGJfbG9hZF9jb250OgogI2lmZGVmIENPTkZJR19QVEVfNjRCSVQKIAlybHdpbm0JcjEyLCByMTEsIDMyLTIsIDI2LCAzMQkvKiBNb3ZlIGluIHBlcm0gYml0cyAqLwogCWFuZGkuCXIxMCwgcjExLCBfUEFHRV9ESVJUWQpAQCAtNTgxLDIyICs2NjAsNDAgQEAKIAlhbmRjCXIxMiwgcjEyLCByMTAKIDE6CXJsd2ltaQlyMTIsIHIxMywgMjAsIDAsIDExCS8qIGdyYWIgUlBOWzMyOjQzXSAqLwogCXJsd2ltaQlyMTIsIHIxMSwgMjAsIDEyLCAxOQkvKiBncmFiIFJQTls0NDo1MV0gKi8KLQltdHNwcglTUFJOX01BUzMsIHIxMgorMjoJbXRzcHIJU1BSTl9NQVMzLCByMTIKIEJFR0lOX01NVV9GVFJfU0VDVElPTgogCXNyd2kJcjEwLCByMTMsIDEyCQkvKiBncmFiIFJQTlsxMjozMV0gKi8KIAltdHNwcglTUFJOX01BUzcsIHIxMAogRU5EX01NVV9GVFJfU0VDVElPTl9JRlNFVChNTVVfRlRSX0JJR19QSFlTKQogI2Vsc2UKIAlsaQlyMTAsIChfUEFHRV9FWEVDIHwgX1BBR0VfUFJFU0VOVCkKKwltcglyMTMsIHIxMQogCXJsd2ltaQlyMTAsIHIxMSwgMzEsIDI5LCAyOQkvKiBleHRyYWN0IF9QQUdFX0RJUlRZIGludG8gU1cgKi8KIAlhbmQJcjEyLCByMTEsIHIxMAogCWFuZGkuCXIxMCwgcjExLCBfUEFHRV9VU0VSCS8qIFRlc3QgZm9yIF9QQUdFX1VTRVIgKi8KIAlzbHdpCXIxMCwgcjEyLCAxCiAJb3IJcjEwLCByMTAsIHIxMgogCWlzZWxlcQlyMTIsIHIxMiwgcjEwCi0Jcmx3aW1pCXIxMSwgcjEyLCAwLCAyMCwgMzEJLyogRXh0cmFjdCBSUE4gZnJvbSBQVEUgYW5kIG1lcmdlIHdpdGggcGVybXMgKi8KLQltdHNwcglTUFJOX01BUzMsIHIxMQorCXJsd2ltaQlyMTMsIHIxMiwgMCwgMjAsIDMxCS8qIEdldCBSUE4gZnJvbSBQVEUsIG1lcmdlIHcvIHBlcm1zICovCisJbXRzcHIJU1BSTl9NQVMzLCByMTMKICNlbmRpZgorCisJbWZzcHIJcjEyLCBTUFJOX01BUzIKKyNpZmRlZiBDT05GSUdfUFRFXzY0QklUCisJcmx3aW1pCXIxMiwgcjExLCAzMi0xOSwgMjcsIDMxCS8qIGV4dHJhY3QgV0lNR0UgZnJvbSBwdGUgKi8KKyNlbHNlCisJcmx3aW1pCXIxMiwgcjExLCAyNiwgMjcsIDMxCS8qIGV4dHJhY3QgV0lNR0UgZnJvbSBwdGUgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKKwliZXEJNiwgM2YJCQkvKiBkb24ndCBtYXNrIGlmIHBhZ2UgaXNuJ3QgaHVnZSAqLworCWxpCXIxMywgMQorCXNsdwlyMTMsIHIxMywgcjE0CisJc3ViaQlyMTMsIHIxMywgMQorCXJsd2lubQlyMTMsIHIxMywgMCwgMCwgMTkJLyogYm90dG9tIGJpdHMgdXNlZCBmb3IgV0lNR0UvZXRjICovCisJYW5kYwlyMTIsIHIxMiwgcjEzCQkvKiBtYXNrIG9mZiBlYSBiaXRzIHdpdGhpbiB0aGUgcGFnZSAqLworI2VuZGlmCiszOgltdHNwcglTUFJOX01BUzIsIHIxMgorCiAjaWZkZWYgQ09ORklHX0UyMDAKIAkvKiBSb3VuZCByb2JpbiBUTEIxIGVudHJpZXMgYXNzaWdubWVudCAqLwogCW1mc3ByCXIxMiwgU1BSTl9NQVMwCkBAIC02MjIsMTEgKzcxOSwxOSBAQAogCW10c3ByCVNQUk5fTUFTMCxyMTIKICNlbmRpZiAvKiBDT05GSUdfRTIwMCAqLwogCit0bGJfd3JpdGVfZW50cnk6CiAJdGxid2UKIAogCS8qIERvbmUuLi5yZXN0b3JlIHJlZ2lzdGVycyBhbmQgZ2V0IG91dCBvZiBoZXJlLiAgKi8KIAltZnNwcglyMTAsIFNQUk5fU1BSR19USFJFQUQKLQlsd3oJcjExLCBUSFJFQURfTk9STVNBVkUoMykocjEwKQorI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKKwliZXEJNiwgOGYgLyogc2tpcCByZXN0b3JlIGZvciA0ayBwYWdlIGZhdWx0cyAqLworCWx3eglyMTQsIFRIUkVBRF9OT1JNU0FWRSg0KShyMTApCisJbHd6CXIxNSwgVEhSRUFEX05PUk1TQVZFKDUpKHIxMCkKKwlsd3oJcjE2LCBUSFJFQURfTk9STVNBVkUoNikocjEwKQorCWx3eglyMTcsIFRIUkVBRF9OT1JNU0FWRSg3KShyMTApCisjZW5kaWYKKzg6CWx3eglyMTEsIFRIUkVBRF9OT1JNU0FWRSgzKShyMTApCiAJbXRjcglyMTEKIAlsd3oJcjEzLCBUSFJFQURfTk9STVNBVkUoMikocjEwKQogCWx3eglyMTIsIFRIUkVBRF9OT1JNU0FWRSgxKShyMTApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2h3X2JyZWFrcG9pbnQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCmluZGV4IDVlY2QwNDAuLjJiYzA1ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pYm1lYnVzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYwppbmRleCAyODU4MWYxLi5kMzlhZTYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYwpAQCAtMzcsMTIgKzM3LDE0IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL2libWVidXMuaD4KICNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KQEAgLTEyNSwxNyArMTI3LDIzIEBACiAKIHN0YXRpYyBpbnQgaWJtZWJ1c19kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCiB7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIG1hc2sgPT0gRE1BX0JJVF9NQVNLKDY0KTsKK30KKworc3RhdGljIHU2NCBpYm1lYnVzX2RtYV9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIERNQV9CSVRfTUFTSyg2NCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZG1hX21hcF9vcHMgaWJtZWJ1c19kbWFfb3BzID0gewotCS5hbGxvY19jb2hlcmVudCA9IGlibWVidXNfYWxsb2NfY29oZXJlbnQsCi0JLmZyZWVfY29oZXJlbnQgID0gaWJtZWJ1c19mcmVlX2NvaGVyZW50LAotCS5tYXBfc2cgICAgICAgICA9IGlibWVidXNfbWFwX3NnLAotCS51bm1hcF9zZyAgICAgICA9IGlibWVidXNfdW5tYXBfc2csCi0JLmRtYV9zdXBwb3J0ZWQgID0gaWJtZWJ1c19kbWFfc3VwcG9ydGVkLAotCS5tYXBfcGFnZSAgICAgICA9IGlibWVidXNfbWFwX3BhZ2UsCi0JLnVubWFwX3BhZ2UgICAgID0gaWJtZWJ1c191bm1hcF9wYWdlLAorCS5hbGxvY19jb2hlcmVudCAgICAgPSBpYm1lYnVzX2FsbG9jX2NvaGVyZW50LAorCS5mcmVlX2NvaGVyZW50ICAgICAgPSBpYm1lYnVzX2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zZyAgICAgICAgICAgICA9IGlibWVidXNfbWFwX3NnLAorCS51bm1hcF9zZyAgICAgICAgICAgPSBpYm1lYnVzX3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkICAgICAgPSBpYm1lYnVzX2RtYV9zdXBwb3J0ZWQsCisJLmdldF9yZXF1aXJlZF9tYXNrICA9IGlibWVidXNfZG1hX2dldF9yZXF1aXJlZF9tYXNrLAorCS5tYXBfcGFnZSAgICAgICAgICAgPSBpYm1lYnVzX21hcF9wYWdlLAorCS51bm1hcF9wYWdlICAgICAgICAgPSBpYm1lYnVzX3VubWFwX3BhZ2UsCiB9OwogCiBzdGF0aWMgaW50IGlibWVidXNfbWF0Y2hfcGF0aChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfZTUwMC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX2U1MDAuUwppbmRleCAzZTJiOTVjLi40ZjBhYjg1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfZTUwMC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9lNTAwLlMKQEAgLTI2LDcgKzI2LDcgQEAKIAlvcmkJcjQscjQsX1RMRl9OQVBQSU5HCS8qIHNvIHdoZW4gd2UgdGFrZSBhbiBleGNlcHRpb24gKi8KIAlzdHcJcjQsVElfTE9DQUxfRkxBR1MocjMpCS8qIGl0IHdpbGwgcmV0dXJuIHRvIG91ciBjYWxsZXIgKi8KIAotI2lmZGVmIENPTkZJR19FNTAwTUMKKyNpZmRlZiBDT05GSUdfUFBDX0U1MDBNQwogCXdydGVlaQkxCiAxOgl3YWl0CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2luaXRfdGFzay5jCmluZGV4IDIzNzViN2UuLmQwNzZkNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby13b3JrYXJvdW5kcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby13b3JrYXJvdW5kcy5jCmluZGV4IGZmYWZhZWEuLjEyZDMyOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8td29ya2Fyb3VuZHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvLXdvcmthcm91bmRzLmMKQEAgLTEyLDYgKzEyLDcgQEAKICN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogZm9yIGluaXRfbW0gKi8KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKaW5kZXggOGRjNzU0N2MuLjg4NjM4MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tYXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tYXAuYwppbmRleCBiMjVmNjMyLi4yNjI3OTE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvbWFwLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21hcC5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYwppbmRleCA5NjFiYjAzLi4wY2ZjZjk4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCkBAIC01MDEsNiArNTAxLDE0IEBACiAJdGJsLT5pdF9tYXAgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAJbWVtc2V0KHRibC0+aXRfbWFwLCAwLCBzeik7CiAKKwkvKgorCSAqIFJlc2VydmUgcGFnZSAwIHNvIGl0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGFueSBtYXBwaW5ncy4KKwkgKiBUaGlzIGF2b2lkcyBidWdneSBkcml2ZXJzIHRoYXQgY29uc2lkZXIgcGFnZSAwIHRvIGJlIGludmFsaWQKKwkgKiB0byBjcmFzaCB0aGUgbWFjaGluZSBvciBldmVuIGxvc2UgZGF0YS4KKwkgKi8KKwlpZiAodGJsLT5pdF9vZmZzZXQgPT0gMCkKKwkJc2V0X2JpdCgwLCB0YmwtPml0X21hcCk7CisKIAl0YmwtPml0X2hpbnQgPSAwOwogCXRibC0+aXRfbGFyZ2VoaW50ID0gdGJsLT5pdF9oYWxmcG9pbnQ7CiAJc3Bpbl9sb2NrX2luaXQoJnRibC0+aXRfbG9jayk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCBkMjgxZmI2Li41YzNjNDY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI3VuZGVmIERFQlVHCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXNhLWJyaWRnZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pc2EtYnJpZGdlLmMKaW5kZXggNGQ1NzMxYi4uNDc5NzUyOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pc2EtYnJpZGdlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pc2EtYnJpZGdlLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rdm0uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3ZtLmMKaW5kZXggYjA2YmRhZS4uMzVmMjc2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rdm0uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2t2bS5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rdm1fcGFyYS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9sZWdhY3lfc2VyaWFsLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYwppbmRleCAyYjk3YjgwLi5jN2I1YWZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtNDcsNiArNDgsMjQgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGVnYWN5X3NlcmlhbF9jb3VudDsKIHN0YXRpYyBpbnQgbGVnYWN5X3NlcmlhbF9jb25zb2xlID0gLTE7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHNpX3NlcmlhbF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwLCBpbnQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGludCB0bXA7CisJb2Zmc2V0ID0gb2Zmc2V0IDw8IHAtPnJlZ3NoaWZ0OworCWlmIChvZmZzZXQgPT0gVUFSVF9JSVIpIHsKKwkJdG1wID0gcmVhZGwocC0+bWVtYmFzZSArIChVQVJUX0lJUiAmIH4zKSk7CisJCXJldHVybiAodG1wID4+IDE2KSAmIDB4ZmY7IC8qIFVBUlRfSUlSICUgNCA9PSAyICovCisJfSBlbHNlCisJCXJldHVybiByZWFkYihwLT5tZW1iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgdHNpX3NlcmlhbF9vdXQoc3RydWN0IHVhcnRfcG9ydCAqcCwgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworCW9mZnNldCA9IG9mZnNldCA8PCBwLT5yZWdzaGlmdDsKKwlpZiAoISgob2Zmc2V0ID09IFVBUlRfSUVSKSAmJiAodmFsdWUgJiBVQVJUX0lFUl9VVUUpKSkKKwkJd3JpdGViKHZhbHVlLCBwLT5tZW1iYXNlICsgb2Zmc2V0KTsKK30KKwogc3RhdGljIGludCBfX2luaXQgYWRkX2xlZ2FjeV9wb3J0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCB3YW50X2luZGV4LAogCQkJCSAgaW50IGlvdHlwZSwgcGh5c19hZGRyX3QgYmFzZSwKIAkJCQkgIHBoeXNfYWRkcl90IHRhZGRyLCB1bnNpZ25lZCBsb25nIGlycSwKQEAgLTEwMiw2ICsxMjEsNyBAQAogCQlsZWdhY3lfc2VyaWFsX3BvcnRzW2luZGV4XS5pb2Jhc2UgPSBiYXNlOwogCWVsc2UKIAkJbGVnYWN5X3NlcmlhbF9wb3J0c1tpbmRleF0ubWFwYmFzZSA9IGJhc2U7CisKIAlsZWdhY3lfc2VyaWFsX3BvcnRzW2luZGV4XS5pb3R5cGUgPSBpb3R5cGU7CiAJbGVnYWN5X3NlcmlhbF9wb3J0c1tpbmRleF0udWFydGNsayA9IGNsb2NrOwogCWxlZ2FjeV9zZXJpYWxfcG9ydHNbaW5kZXhdLmlycSA9IGlycTsKQEAgLTExMiw2ICsxMzIsMTEgQEAKIAlsZWdhY3lfc2VyaWFsX2luZm9zW2luZGV4XS5zcGVlZCA9IHNwZCA/IGJlMzJfdG9fY3B1cChzcGQpIDogMDsKIAlsZWdhY3lfc2VyaWFsX2luZm9zW2luZGV4XS5pcnFfY2hlY2tfcGFyZW50ID0gaXJxX2NoZWNrX3BhcmVudDsKIAorCWlmIChpb3R5cGUgPT0gVVBJT19UU0kpIHsKKwkJbGVnYWN5X3NlcmlhbF9wb3J0c1tpbmRleF0uc2VyaWFsX2luID0gdHNpX3NlcmlhbF9pbjsKKwkJbGVnYWN5X3NlcmlhbF9wb3J0c1tpbmRleF0uc2VyaWFsX291dCA9IHRzaV9zZXJpYWxfb3V0OworCX0KKwogCXByaW50ayhLRVJOX0RFQlVHICJGb3VuZCBsZWdhY3kgc2VyaWFsIHBvcnQgJWQgZm9yICVzXG4iLAogCSAgICAgICBpbmRleCwgbnAtPmZ1bGxfbmFtZSk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiAgJXM9JWxseCwgdGFkZHI9JWxseCwgaXJxPSVseCwgY2xrPSVkLCBzcGVlZD0lZFxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKaW5kZXggNTgzYWY3MC4uMjZjY2JmNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKQEAgLTc0LDggKzc0LDcgQEAKIAl9CiAKIAkvKiBXZSBhbHNvIHNob3VsZCBub3Qgb3ZlcndyaXRlIHRoZSB0Y2UgdGFibGVzICovCi0JZm9yIChub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInBjaSIpOyBub2RlICE9IE5VTEw7Ci0JCQlub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobm9kZSwgInBjaSIpKSB7CisJZm9yX2VhY2hfbm9kZV9ieV90eXBlKG5vZGUsICJwY2kiKSB7CiAJCWJhc2VwID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCx0Y2UtYmFzZSIsIE5VTEwpOwogCQlzaXplcCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAibGludXgsdGNlLXNpemUiLCBOVUxMKTsKIAkJaWYgKGJhc2VwID09IE5VTEwgfHwgc2l6ZXAgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKaW5kZXggOTk4YTEwMC4uZjdkNzYwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKQEAgLTgsNiArOCw4IEBACiAgKiBrZXhlYyBiaXRzOgogICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRXJpYyBCaWVkZXJtYW4gIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CiAgKiBHYW1lQ3ViZS9wcGMzMiBwb3J0IENvcHlyaWdodCAoQykgMjAwNCBBbGJlcnQgSGVycmFuegorICogUFBDNDR4IHBvcnQuIENvcHlyaWdodCAoQykgMjAxMSwgIElCTSBDb3Jwb3JhdGlvbgorICogCQlBdXRob3I6IFN1enVraSBQb3Vsb3NlIDxzdXp1a2lAaW4uaWJtLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtNzM2LDYgKzczOCwxNzUgQEAKIAltciAgICAgIHI1LCByMzEKIAogCWxpCXIwLCAwCisjZWxpZiBkZWZpbmVkKENPTkZJR180NHgpICAmJiAhZGVmaW5lZChDT05GSUdfNDd4KQorCisvKgorICogQ29kZSBmb3Igc2V0dGluZyB1cCAxOjEgbWFwcGluZyBmb3IgUFBDNDQweCBmb3IgS0VYRUMKKyAqCisgKiBXZSBjYW5ub3Qgc3dpdGNoIG9mZiB0aGUgTU1VIG9uIFBQQzQ0eC4KKyAqIFNvIHdlOgorICogMSkgSW52YWxpZGF0ZSBhbGwgdGhlIG1hcHBpbmdzIGV4Y2VwdCB0aGUgb25lIHdlIGFyZSBydW5uaW5nIGZyb20uCisgKiAyKSBDcmVhdGUgYSB0bXAgbWFwcGluZyBmb3Igb3VyIGNvZGUgaW4gdGhlIG90aGVyIGFkZHJlc3Mgc3BhY2UoVFMpIGFuZAorICogICAganVtcCB0byBpdC4gSW52YWxpZGF0ZSB0aGUgZW50cnkgd2Ugc3RhcnRlZCBpbi4KKyAqIDMpIENyZWF0ZSBhIDE6MSBtYXBwaW5nIGZvciAwLTJHaUIgaW4gY2h1bmtzIG9mIDI1Nk0gaW4gb3JpZ2luYWwgVFMuCisgKiA0KSBKdW1wIHRvIHRoZSAxOjEgbWFwcGluZyBpbiBvcmlnaW5hbCBUUy4KKyAqIDUpIEludmFsaWRhdGUgdGhlIHRtcCBtYXBwaW5nLgorICoKKyAqIC0gQmFzZWQgb24gdGhlIGtleGVjIHN1cHBvcnQgY29kZSBmb3IgRlNMIEJvb2tFCisgKiAtIERvZXNuJ3Qgc3VwcG9ydCA0N3ggeWV0LgorICoKKyAqLworCS8qIFNhdmUgb3VyIHBhcmFtZXRlcnMgKi8KKwltcglyMjksIHIzCisJbXIJcjMwLCByNAorCW1yCXIzMSwgcjUKKworCS8qIExvYWQgb3VyIE1TUl9JUyBhbmQgVElEIHRvIE1NVUNSIGZvciBUTEIgc2VhcmNoICovCisJbWZzcHIJcjMsU1BSTl9QSUQKKwltZm1zcglyNAorCWFuZGkuCXI0LHI0LE1TUl9JU0BsCisJYmVxCXdtbXVjcgorCW9yaXMJcjMscjMsUFBDNDR4X01NVUNSX1NUU0BoCit3bW11Y3I6CisJbXRzcHIJU1BSTl9NTVVDUixyMworCXN5bmMKKworCS8qCisJICogSW52YWxpZGF0ZSBhbGwgdGhlIFRMQiBlbnRyaWVzIGV4Y2VwdCB0aGUgY3VycmVudCBlbnRyeQorCSAqIHdoZXJlIHdlIGFyZSBydW5uaW5nIGZyb20KKwkgKi8KKwlibAkwZgkJCQkvKiBGaW5kIG91ciBhZGRyZXNzICovCiswOgltZmxyCXI1CQkJCS8qIE1ha2UgaXQgYWNjZXNzaWJsZSAqLworCXRsYnN4CXIyMywwLHI1CQkJLyogRmluZCBlbnRyeSB3ZSBhcmUgaW4gKi8KKwlsaQlyNCwwCQkJCS8qIFN0YXJ0IGF0IFRMQiBlbnRyeSAwICovCisJbGkJcjMsMAkJCQkvKiBTZXQgUEFHRUlEIGludmFsIHZhbHVlICovCisxOgljbXB3CXIyMyxyNAkJCQkvKiBJcyB0aGlzIG91ciBlbnRyeT8gKi8KKwliZXEJc2tpcAkJCQkvKiBJZiBzbywgc2tpcCB0aGUgaW52YWwgKi8KKwl0bGJ3ZQlyMyxyNCxQUEM0NHhfVExCX1BBR0VJRAkJLyogSWYgbm90LCBpbnZhbCB0aGUgZW50cnkgKi8KK3NraXA6CisJYWRkaQlyNCxyNCwxCQkJCS8qIEluY3JlbWVudCAqLworCWNtcHdpCXI0LDY0CQkJCS8qIEFyZSB3ZSBkb25lPwkqLworCWJuZQkxYgkJCQkvKiBJZiBub3QsIHJlcGVhdCAqLworCWlzeW5jCisKKwkvKiBDcmVhdGUgYSB0ZW1wIG1hcHBpbmcgYW5kIGp1bXAgdG8gaXQgKi8KKwlhbmRpLglyNiwgcjIzLCAxCQkvKiBGaW5kIHRoZSBpbmRleCB0byB1c2UgKi8KKwlhZGRpCXIyNCwgcjYsIDEJCS8qIHIyNCB3aWxsIGNvbnRhaW4gMSBvciAyICovCisKKwltZm1zcglyOQkJCS8qIGdldCB0aGUgTVNSICovCisJcmx3aW5tCXI1LCByOSwgMjcsIDMxLCAzMQkvKiBFeHRyYWN0IHRoZSBNU1JbSVNdICovCisJeG9yaQlyNywgcjUsIDEJCS8qIFVzZSB0aGUgb3RoZXIgYWRkcmVzcyBzcGFjZSAqLworCisJLyogUmVhZCB0aGUgY3VycmVudCBtYXBwaW5nIGVudHJpZXMgKi8KKwl0bGJyZQlyMywgcjIzLCBQUEM0NHhfVExCX1BBR0VJRAorCXRsYnJlCXI0LCByMjMsIFBQQzQ0eF9UTEJfWExBVAorCXRsYnJlCXI1LCByMjMsIFBQQzQ0eF9UTEJfQVRUUklCCisKKwkvKiBTYXZlIG91ciBjdXJyZW50IFhMQVQgZW50cnkgKi8KKwltcglyMjUsIHI0CisKKwkvKiBFeHRyYWN0IHRoZSBUTEIgUGFnZVNpemUgKi8KKwlsaQlyMTAsIDEgCQkJLyogcjEwIHdpbGwgaG9sZCBQYWdlU2l6ZSAqLworCXJsd2lubQlyMTEsIHIzLCAwLCAyNCwgMjcJLyogYml0cyAyNC0yNyAqLworCisJLyogWFhYOiBBcyBvZiBub3cgd2UgdXNlIDI1Nk0sIDRLIHBhZ2VzICovCisJY21wd2kJcjExLCBQUEM0NHhfVExCXzI1Nk0KKwlibmUJdGxiXzRrCisJcm90bHdpCXIxMCwgcjEwLCAyOAkJLyogcjEwID0gMjU2TSAqLworCWIJd3JpdGVfb3V0Cit0bGJfNGs6CisJY21wd2kJcjExLCBQUEM0NHhfVExCXzRLCisJYm5lCWRlZmF1bHQKKwlyb3Rsd2kJcjEwLCByMTAsIDEyCQkvKiByMTAgPSA0SyAqLworCWIJd3JpdGVfb3V0CitkZWZhdWx0OgorCXJvdGx3aQlyMTAsIHIxMCwgMTAJCS8qIHIxMCA9IDFLICovCisKK3dyaXRlX291dDoKKwkvKgorCSAqIFdyaXRlIG91dCB0aGUgdG1wIDE6MSBtYXBwaW5nIGZvciB0aGlzIGNvZGUgaW4gb3RoZXIgYWRkcmVzcyBzcGFjZQorCSAqIEZpeHVwICBFUE4gPSBSUE4gLCBUUz1vdGhlciBhZGRyZXNzIHNwYWNlCisJICovCisJaW5zcndpCXIzLCByNywgMSwgMjMJCS8qIEJpdCAyMyBpcyBUUyBmb3IgUEFHRUlEIGZpZWxkICovCisKKwkvKiBXcml0ZSBvdXQgdGhlIHRtcCBtYXBwaW5nIGVudHJpZXMgKi8KKwl0bGJ3ZQlyMywgcjI0LCBQUEM0NHhfVExCX1BBR0VJRAorCXRsYndlCXI0LCByMjQsIFBQQzQ0eF9UTEJfWExBVAorCXRsYndlCXI1LCByMjQsIFBQQzQ0eF9UTEJfQVRUUklCCisKKwlzdWJpCXIxMSwgcjEwLCAxCQkvKiBQYWdlT2Zmc2V0IE1hc2sgPSBQYWdlU2l6ZSAtIDEgKi8KKwlub3QJcjEwLCByMTEJCS8qIE1hc2sgZm9yIFBhZ2VOdW0gKi8KKworCS8qIFN3aXRjaCB0byBvdGhlciBhZGRyZXNzIHNwYWNlIGluIE1TUiAqLworCWluc3J3aQlyOSwgcjcsIDEsIDI2CQkvKiBTZXQgTVNSW0lTXSA9IHI3ICovCisKKwlibAkxZgorMToJbWZscglyOAorCWFkZGkJcjgsIHI4LCAoMmYtMWIpCQkvKiBGaW5kIHRoZSB0YXJnZXQgb2Zmc2V0ICovCisKKwkvKiBKdW1wIHRvIHRoZSB0bXAgbWFwcGluZyAqLworCW10c3ByCVNQUk5fU1JSMCwgcjgKKwltdHNwcglTUFJOX1NSUjEsIHI5CisJcmZpCisKKzI6CisJLyogSW52YWxpZGF0ZSB0aGUgZW50cnkgd2Ugd2VyZSBleGVjdXRpbmcgZnJvbSAqLworCWxpCXIzLCAwCisJdGxid2UJcjMsIHIyMywgUFBDNDR4X1RMQl9QQUdFSUQKKworCS8qIGF0dHJpYnV0ZSBmaWVsZHMuIHJ3eCBmb3IgU1VQRVJWSVNPUiBtb2RlICovCisJbGkJcjUsIDAKKwlvcmkJcjUsIHI1LCAoUFBDNDR4X1RMQl9TVyB8IFBQQzQ0eF9UTEJfU1IgfCBQUEM0NHhfVExCX1NYIHwgUFBDNDR4X1RMQl9HKQorCisJLyogQ3JlYXRlIDE6MSBtYXBwaW5nIGluIDI1Nk0gcGFnZXMgKi8KKwl4b3JpCXI3LCByNywgMQkJCS8qIFJldmVydCBiYWNrIHRvIE9yaWdpbmFsIFRTICovCisKKwlsaQlyOCwgMAkJCQkvKiBQYWdlTnVtYmVyICovCisJbGkJcjYsIDMJCQkJLyogVExCIEluZGV4LCBzdGFydCBhdCAzICAqLworCituZXh0X3RsYjoKKwlyb3Rsd2kJcjMsIHI4LCAyOAkJCS8qIENyZWF0ZSBFUE4gKGJpdHMgMC0zKSAqLworCW1yCXI0LCByMwkJCQkvKiBSUE4gPSBFUE4gICovCisJb3JpCXIzLCByMywgKFBQQzQ0eF9UTEJfVkFMSUQgfCBQUEM0NHhfVExCXzI1Nk0pIC8qIFNJWkUgPSAyNTZNLCBWYWxpZCAqLworCWluc3J3aQlyMywgcjcsIDEsIDIzCQkJLyogU2V0IFRTIGZyb20gcjcgKi8KKworCXRsYndlCXIzLCByNiwgUFBDNDR4X1RMQl9QQUdFSUQJLyogUGFnZUlEIGZpZWxkIDogRVBOLCBWLCBTSVpFICovCisJdGxid2UJcjQsIHI2LCBQUEM0NHhfVExCX1hMQVQJCS8qIEFkZHJlc3MgdHJhbnNsYXRpb24gOiBSUE4gICAqLworCXRsYndlCXI1LCByNiwgUFBDNDR4X1RMQl9BVFRSSUIJLyogQXR0cmlidXRlcyAqLworCisJYWRkaQlyOCwgcjgsIDEJCQkvKiBJbmNyZW1lbnQgUE4gKi8KKwlhZGRpCXI2LCByNiwgMQkJCS8qIEluY3JlbWVudCBUTEIgSW5kZXggKi8KKwljbXB3aQlyOCwgOAkJCQkvKiBBcmUgd2UgZG9uZSA/ICovCisJYm5lCW5leHRfdGxiCisJaXN5bmMKKworCS8qIEp1bXAgdG8gdGhlIG5ldyBtYXBwaW5nIDE6MSAqLworCWxpCXI5LDAKKwlpbnNyd2kJcjksIHI3LCAxLCAyNgkJCS8qIFNldCBNU1JbSVNdID0gcjcgKi8KKworCWJsCTFmCisxOgltZmxyCXI4CisJYW5kCXI4LCByOCwgcjExCQkJLyogR2V0IG91ciBvZmZzZXQgd2l0aGluIHBhZ2UgKi8KKwlhZGRpCXI4LCByOCwgKDJmLTFiKQorCisJYW5kCXI1LCByMjUsIHIxMAkJCS8qIEdldCBvdXIgdGFyZ2V0IFBhZ2VOdW0gKi8KKwlvcglyOCwgcjgsIHI1CQkJLyogVGFyZ2V0IGp1bXAgYWRkcmVzcyAqLworCisJbXRzcHIJU1BSTl9TUlIwLCByOAorCW10c3ByCVNQUk5fU1JSMSwgcjkKKwlyZmkKKzI6CisJLyogSW52YWxpZGF0ZSB0aGUgdG1wIGVudHJ5IHdlIHVzZWQgKi8KKwlsaQlyMywgMAorCXRsYndlCXIzLCByMjQsIFBQQzQ0eF9UTEJfUEFHRUlECisJc3luYworCisJLyogUmVzdG9yZSB0aGUgcGFyYW1ldGVycyAqLworCW1yCXIzLCByMjkKKwltcglyNCwgcjMwCisJbXIJcjUsIHIzMQorCisJbGkJcjAsIDAKICNlbHNlCiAJbGkJcjAsIDAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlLmMKaW5kZXggYTFjZDcwMS4uMmQyNzU3MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZS5jCkBAIC0xNiw3ICsxNiw2IEBACiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZWxvYWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCmluZGV4IDU5ZGJmNmEuLmUxNjEyZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKaW5kZXggMGE1YTg5OS4uNDE0NTZmZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKQEAgLTgsNyArOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKaW5kZXggMzI2NTZmMS4uNDU4ZWQzYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtMTczMCw2ICsxNzMxLDE3IEBACiAKIAlpZiAobW9kZSA9PSBQQ0lfUFJPQkVfTk9STUFMKQogCQlob3NlLT5sYXN0X2J1c25vID0gYnVzLT5zdWJvcmRpbmF0ZSA9IHBjaV9zY2FuX2NoaWxkX2J1cyhidXMpOworCisJLyogQ29uZmlndXJlIFBDSSBFeHByZXNzIHNldHRpbmdzICovCisJaWYgKGJ1cyAmJiAhcGNpX2hhc19mbGFnKFBDSV9QUk9CRV9PTkxZKSkgeworCQlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQ7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZidXMtPmNoaWxkcmVuLCBub2RlKSB7CisJCQlzdHJ1Y3QgcGNpX2RldiAqc2VsZiA9IGNoaWxkLT5zZWxmOworCQkJaWYgKCFzZWxmKQorCQkJCWNvbnRpbnVlOworCQkJcGNpZV9idXNfY29uZmlndXJlX3NldHRpbmdzKGNoaWxkLCBzZWxmLT5wY2llX21wc3MpOworCQl9CisJfQogfQogCiBzdGF0aWMgdm9pZCBmaXh1cF9oaWRlX2hvc3RfcmVzb3VyY2VfZnNsKHN0cnVjdCBwY2lfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYwppbmRleCBiYjE1NDUxLi5mZGQxYTNkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwppbmRleCBhYjM0MDQ2Li5iY2Y0YmY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZG4uYwppbmRleCA0NzhmOGQ3OC4uNGU2OWRlYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZG4uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kbi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9vZl9zY2FuLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9vZl9zY2FuLmMKaW5kZXggZmUwYTVhZC4uYjM3ZDBiNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfb2Zfc2Nhbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX29mX3NjYW4uYwpAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG1jLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BtYy5jCmluZGV4IDQ2MTQ5OWIuLmE4NDFhOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG1jLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wbWMuYwpAQCAtMTQsNyArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNi1wbXUuYwppbmRleCAwM2I5NWUyLi4wYmJjOTAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNi1wbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNi1wbXUuYwpAQCAtNDg3LDggKzQ4Nyw4IEBACiAgKi8KIHN0YXRpYyBpbnQgcG93ZXI2X2NhY2hlX2V2ZW50c1tDKE1BWCldW0MoT1BfTUFYKV1bQyhSRVNVTFRfTUFYKV0gPSB7CiAJW0MoTDFEKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLwotCQlbQyhPUF9SRUFEKV0gPSB7CTB4ODAwODIsCTB4ODAwODAJCX0sCi0JCVtDKE9QX1dSSVRFKV0gPSB7CTB4ODAwODYsCTB4ODAwODgJCX0sCisJCVtDKE9QX1JFQUQpXSA9IHsJMHgyODAwMzAsCTB4ODAwODAJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CTB4MTgwMDMyLAkweDgwMDg4CQl9LAogCQlbQyhPUF9QUkVGRVRDSCldID0gewkweDgxMGE0LAkwCQl9LAogCX0sCiAJW0MoTDFJKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjctcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNy1wbXUuYwppbmRleCBkZTgzZDYwLi4xMjUxZTRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNy1wbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNy1wbXUuYwpAQCAtMjk3LDYgKzI5Nyw4IEBACiAKIHN0YXRpYyBpbnQgcG93ZXI3X2dlbmVyaWNfZXZlbnRzW10gPSB7CiAJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10gPSAweDFlLAorCVtQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5EXSA9IDB4MTAwZjgsIC8qIEdDVF9OT1NMT1RfQ1lDICovCisJW1BFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfQkFDS0VORF0gPSAweDQwMDBhLCAgLyogQ01QTFVfU1RBTEwgKi8KIAlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdID0gMiwKIAlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXSA9IDB4Yzg4MCwJLyogTERfUkVGX0wxX0xTVSovCiAJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXSA9IDB4NDAwZjAsCQkvKiBMRF9NSVNTX0wxCSovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCBmNWFlODcyLi5kMzExNGE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTEsNCArMSw0IEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDhmNTM5NTQuLjkwNTRjYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9tcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IDE3NGUxZTkuLmZhMTIzNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KQEAgLTU0LDYgKzU0LDggQEAKICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9waHlwX2R1bXAuaD4KICNpbmNsdWRlIDxhc20va2V4ZWMuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorCiAjaW5jbHVkZSA8bW0vbW11X2RlY2wuaD4KIAogI2lmZGVmIERFQlVHCkBAIC03MDcsMTEgKzcwOSwyMyBAQAogCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fcnRhcywgTlVMTCk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorCS8qIFNvbWUgbWFjaGluZXMgbWlnaHQgbmVlZCBPUEFMIGluZm8gZm9yIGRlYnVnZ2luZywgZ3JhYiBpdCBub3cuICovCisJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9vcGFsLCBOVUxMKTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BIWVBfRFVNUAogCS8qIHNjYW4gdHJlZSB0byBzZWUgaWYgZHVtcCBvY2N1cnJlZCBkdXJpbmcgbGFzdCBib290ICovCiAJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9waHlwX2R1bXAsIE5VTEwpOwogI2VuZGlmCiAKKwkvKiBQcmUtaW5pdGlhbGl6ZSB0aGUgY21kX2xpbmUgd2l0aCB0aGUgY29udGVudCBvZiBib290X2NvbW1tYW5kX2xpbmUsCisJICogd2hpY2ggd2lsbCBiZSBlbXB0eSBleGNlcHQgd2hlbiB0aGUgY29udGVudCBvZiB0aGUgdmFyaWFibGUgaGFzCisJICogYmVlbiBvdmVycmlkZW4gYnkgYSBib290bG9hZGluZyBtZWNoYW5pc20uIFRoaXMgaGFwcGVucyB0eXBpY2FsbHkKKwkgKiB3aXRoIEhBTCB0YWtlb3ZlcgorCSAqLworCXN0cmxjcHkoY21kX2xpbmUsIGJvb3RfY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisKIAkvKiBSZXRyaWV2ZSB2YXJpb3VzIGluZm9ybWF0aW9ucyBmcm9tIHRoZSAvY2hvc2VuIG5vZGUgb2YgdGhlCiAJICogZGV2aWNlLXRyZWUsIGluY2x1ZGluZyB0aGUgcGxhdGZvcm0gdHlwZSwgaW5pdHJkIGxvY2F0aW9uIGFuZAogCSAqIHNpemUsIFRDRSByZXNlcnZlLCBhbmQgbW9yZSAuLi4KQEAgLTcyMywxMiArNzM3LDE1IEBACiAKIAlvZl9zY2FuX2ZsYXRfZHQoZWFybHlfaW5pdF9kdF9zY2FuX3Jvb3QsIE5VTEwpOwogCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fbWVtb3J5X3BwYywgTlVMTCk7Ci0Jc2V0dXBfaW5pdGlhbF9tZW1vcnlfbGltaXQobWVtc3RhcnRfYWRkciwgZmlyc3RfbWVtYmxvY2tfc2l6ZSk7CiAKIAkvKiBTYXZlIGNvbW1hbmQgbGluZSBmb3IgL3Byb2MvY21kbGluZSBhbmQgdGhlbiBwYXJzZSBwYXJhbWV0ZXJzICovCiAJc3RybGNweShib290X2NvbW1hbmRfbGluZSwgY21kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCisJLyogbWFrZSBzdXJlIHdlJ3ZlIHBhcnNlZCBjbWRsaW5lIGZvciBtZW09IGJlZm9yZSB0aGlzICovCisJaWYgKG1lbW9yeV9saW1pdCkKKwkJZmlyc3RfbWVtYmxvY2tfc2l6ZSA9IG1pbihmaXJzdF9tZW1ibG9ja19zaXplLCBtZW1vcnlfbGltaXQpOworCXNldHVwX2luaXRpYWxfbWVtb3J5X2xpbWl0KG1lbXN0YXJ0X2FkZHIsIGZpcnN0X21lbWJsb2NrX3NpemUpOwogCS8qIFJlc2VydmUgTUVNQkxPQ0sgcmVnaW9ucyB1c2VkIGJ5IGtlcm5lbCwgaW5pdHJkLCBkdCwgZXRjLi4uICovCiAJbWVtYmxvY2tfcmVzZXJ2ZShQSFlTSUNBTF9TVEFSVCwgX19wYShrbGltaXQpIC0gUEhZU0lDQUxfU1RBUlQpOwogCS8qIElmIHJlbG9jYXRhYmxlLCByZXNlcnZlIGZpcnN0IDMyayBmb3IgaW50ZXJydXB0IHZlY3RvcnMgZXRjLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggYTkwOWY0ZS4uYjRmYTY2MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL2J0ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgogCiAjaW5jbHVkZSA8bGludXgvbGludXhfbG9nby5oPgogCkBAIC0xMzksNyArMTQwLDkgQEAKIAogdHlwZWRlZiB1MzIgY2VsbF90OwogCi1leHRlcm4gdm9pZCBfX3N0YXJ0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUpOworZXh0ZXJuIHZvaWQgX19zdGFydCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywgdW5zaWduZWQgbG9uZyByOCwKKwkJICAgIHVuc2lnbmVkIGxvbmcgcjkpOwogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiBleHRlcm4gaW50IGVudGVyX3Byb20oc3RydWN0IHByb21fYXJncyAqYXJncywgdW5zaWduZWQgbG9uZyBlbnRyeSk7CkBAIC0xODUsNiArMTg4LDcgQEAKICNkZWZpbmUgUExBVEZPUk1fTFBBUgkJMHgwMDAxCiAjZGVmaW5lIFBMQVRGT1JNX1BPV0VSTUFDCTB4MDQwMAogI2RlZmluZSBQTEFURk9STV9HRU5FUklDCTB4MDUwMAorI2RlZmluZSBQTEFURk9STV9PUEFMCQkweDA2MDAKIAogc3RhdGljIGludCBfX2luaXRkYXRhIG9mX3BsYXRmb3JtOwogCkBAIC02NDQsNyArNjQ4LDcgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfUFNFUklFUykgfHwgZGVmaW5lZChDT05GSUdfUFBDX1BPV0VSTlYpCiAvKgogICogVGhlcmUgYXJlIHR3byBtZXRob2RzIGZvciB0ZWxsaW5nIGZpcm13YXJlIHdoYXQgb3VyIGNhcGFiaWxpdGllcyBhcmUuCiAgKiBOZXdlciBtYWNoaW5lcyBoYXZlIGFuICJpYm0sY2xpZW50LWFyY2hpdGVjdHVyZS1zdXBwb3J0IiBtZXRob2Qgb24gdGhlCkBAIC0xMjc0LDYgKzEyNzgsMjg0IEBACiAJcHJvbV9wcmludGYoIiAgcmFtX3RvcCAgICAgIDogJXhcbiIsIFJFTE9DKHJhbV90b3ApKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHByb21fY2xvc2Vfc3RkaW4odm9pZCkKK3sKKwlzdHJ1Y3QgcHJvbV90ICpfcHJvbSA9ICZSRUxPQyhwcm9tKTsKKwlpaGFuZGxlIHZhbDsKKworCWlmIChwcm9tX2dldHByb3AoX3Byb20tPmNob3NlbiwgInN0ZGluIiwgJnZhbCwgc2l6ZW9mKHZhbCkpID4gMCkKKwkJY2FsbF9wcm9tKCJjbG9zZSIsIDEsIDAsIHZhbCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlYKKworc3RhdGljIHU2NCBfX2luaXRkYXRhIHByb21fb3BhbF9zaXplOworc3RhdGljIHU2NCBfX2luaXRkYXRhIHByb21fb3BhbF9hbGlnbjsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBwcm9tX3J0YXNfc3RhcnRfY3B1Oworc3RhdGljIHU2NCBfX2luaXRkYXRhIHByb21fcnRhc19kYXRhOworc3RhdGljIHU2NCBfX2luaXRkYXRhIHByb21fcnRhc19lbnRyeTsKKworI2lmZGVmIENPTkZJR19QUENfRUFSTFlfREVCVUdfT1BBTAorc3RhdGljIHU2NCBfX2luaXRkYXRhIHByb21fb3BhbF9iYXNlOworc3RhdGljIHU2NCBfX2luaXRkYXRhIHByb21fb3BhbF9lbnRyeTsKKyNlbmRpZgorCisvKiBYWFggRG9uJ3QgY2hhbmdlIHRoaXMgc3RydWN0dXJlIHdpdGhvdXQgdXBkYXRpbmcgb3BhbC10YWtlb3Zlci5TICovCitzdGF0aWMgc3RydWN0IG9wYWxfc2Vjb25kYXJ5X2RhdGEgeworCXM2NAkJCQlhY2s7CS8qICAwICovCisJdTY0CQkJCWdvOwkvKiAgOCAqLworCXN0cnVjdCBvcGFsX3Rha2VvdmVyX2FyZ3MJYXJnczsJLyogMTYgKi8KK30gb3BhbF9zZWNvbmRhcnlfZGF0YTsKKworZXh0ZXJuIGNoYXIgb3BhbF9zZWNvbmRhcnlfZW50cnk7CisKK3N0YXRpYyB2b2lkIHByb21fcXVlcnlfb3BhbCh2b2lkKQoreworCWxvbmcgcmM7CisKKwkvKiBXZSBtdXN0IG5vdCBxdWVyeSBmb3IgT1BBTCBwcmVzZW5jZSBvbiBhIG1hY2hpbmUgdGhhdAorCSAqIHN1cHBvcnRzIFROSyB0YWtlb3ZlciAoOTcwIGJsYWRlcyksIGFzIHRoaXMgdXNlcyB0aGUgc2FtZQorCSAqIGgtY2FsbCB3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMgYW5kIHdpbGwgY3Jhc2gKKwkgKi8KKwlpZiAoUEhBTkRMRV9WQUxJRChjYWxsX3Byb20oImZpbmRkZXZpY2UiLCAxLCAxLAorCQkJCSAgICBBRERSKCIvdG5rLW1lbW9yeS1tYXAiKSkpKSB7CisJCXByb21fcHJpbnRmKCJUTksgdGFrZW92ZXIgZGV0ZWN0ZWQsIHNraXBwaW5nIE9QQUwgY2hlY2tcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJvbV9wcmludGYoIlF1ZXJ5aW5nIGZvciBPUEFMIHByZXNlbmNlLi4uICIpOworCXJjID0gb3BhbF9xdWVyeV90YWtlb3ZlcigmUkVMT0MocHJvbV9vcGFsX3NpemUpLAorCQkJCSAmUkVMT0MocHJvbV9vcGFsX2FsaWduKSk7CisJcHJvbV9kZWJ1ZygiKHJjID0gJWxkKSAiLCByYyk7CisJaWYgKHJjICE9IDApIHsKKwkJcHJvbV9wcmludGYoIm5vdCB0aGVyZS5cbiIpOworCQlyZXR1cm47CisJfQorCVJFTE9DKG9mX3BsYXRmb3JtKSA9IFBMQVRGT1JNX09QQUw7CisJcHJvbV9wcmludGYoIiB0aGVyZSAhXG4iKTsKKwlwcm9tX2RlYnVnKCIgIG9wYWxfc2l6ZSAgPSAweCVseFxuIiwgUkVMT0MocHJvbV9vcGFsX3NpemUpKTsKKwlwcm9tX2RlYnVnKCIgIG9wYWxfYWxpZ24gPSAweCVseFxuIiwgUkVMT0MocHJvbV9vcGFsX2FsaWduKSk7CisJaWYgKFJFTE9DKHByb21fb3BhbF9hbGlnbikgPCAweDEwMDAwKQorCQlSRUxPQyhwcm9tX29wYWxfYWxpZ24pID0gMHgxMDAwMDsKK30KKworc3RhdGljIGludCBwcm9tX3J0YXNfY2FsbChpbnQgdG9rZW4sIGludCBuYXJncywgaW50IG5yZXQsIGludCAqb3V0cHV0cywgLi4uKQoreworCXN0cnVjdCBydGFzX2FyZ3MgcnRhc19hcmdzOworCXZhX2xpc3QgbGlzdDsKKwlpbnQgaTsKKworCXJ0YXNfYXJncy50b2tlbiA9IHRva2VuOworCXJ0YXNfYXJncy5uYXJncyA9IG5hcmdzOworCXJ0YXNfYXJncy5ucmV0ICA9IG5yZXQ7CisJcnRhc19hcmdzLnJldHMgID0gKHJ0YXNfYXJnX3QgKikmKHJ0YXNfYXJncy5hcmdzW25hcmdzXSk7CisJdmFfc3RhcnQobGlzdCwgb3V0cHV0cyk7CisJZm9yIChpID0gMDsgaSA8IG5hcmdzOyArK2kpCisJCXJ0YXNfYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHJ0YXNfYXJnX3QpOworCXZhX2VuZChsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucmV0OyArK2kpCisJCXJ0YXNfYXJncy5yZXRzW2ldID0gMDsKKworCW9wYWxfZW50ZXJfcnRhcygmcnRhc19hcmdzLCBSRUxPQyhwcm9tX3J0YXNfZGF0YSksCisJCQlSRUxPQyhwcm9tX3J0YXNfZW50cnkpKTsKKworCWlmIChucmV0ID4gMSAmJiBvdXRwdXRzICE9IE5VTEwpCisJCWZvciAoaSA9IDA7IGkgPCBucmV0LTE7ICsraSkKKwkJCW91dHB1dHNbaV0gPSBydGFzX2FyZ3MucmV0c1tpKzFdOworCXJldHVybiAobnJldCA+IDApPyBydGFzX2FyZ3MucmV0c1swXTogMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHByb21fb3BhbF9ob2xkX2NwdXModm9pZCkKK3sKKwlpbnQgaSwgY250LCBjcHUsIHJjOworCWxvbmcgajsKKwlwaGFuZGxlIG5vZGU7CisJY2hhciB0eXBlWzY0XTsKKwl1MzIgc2VydmVyc1s4XTsKKwlzdHJ1Y3QgcHJvbV90ICpfcHJvbSA9ICZSRUxPQyhwcm9tKTsKKwl2b2lkICplbnRyeSA9ICh1bnNpZ25lZCBsb25nICopJlJFTE9DKG9wYWxfc2Vjb25kYXJ5X2VudHJ5KTsKKwlzdHJ1Y3Qgb3BhbF9zZWNvbmRhcnlfZGF0YSAqZGF0YSA9ICZSRUxPQyhvcGFsX3NlY29uZGFyeV9kYXRhKTsKKworCXByb21fZGVidWcoInByb21fb3BhbF9ob2xkX2NwdXM6IHN0YXJ0Li4uXG4iKTsKKwlwcm9tX2RlYnVnKCIgICAgLSBlbnRyeSAgICAgICA9IDB4JXhcbiIsIGVudHJ5KTsKKwlwcm9tX2RlYnVnKCIgICAgLSBkYXRhICAgICAgICA9IDB4JXhcbiIsIGRhdGEpOworCisJZGF0YS0+YWNrID0gLTE7CisJZGF0YS0+Z28gPSAwOworCisJLyogbG9vayBmb3IgY3B1cyAqLworCWZvciAobm9kZSA9IDA7IHByb21fbmV4dF9ub2RlKCZub2RlKTsgKSB7CisJCXR5cGVbMF0gPSAwOworCQlwcm9tX2dldHByb3Aobm9kZSwgImRldmljZV90eXBlIiwgdHlwZSwgc2l6ZW9mKHR5cGUpKTsKKwkJaWYgKHN0cmNtcCh0eXBlLCBSRUxPQygiY3B1IikpICE9IDApCisJCQljb250aW51ZTsKKworCQkvKiBTa2lwIG5vbi1jb25maWd1cmVkIGNwdXMuICovCisJCWlmIChwcm9tX2dldHByb3Aobm9kZSwgInN0YXR1cyIsIHR5cGUsIHNpemVvZih0eXBlKSkgPiAwKQorCQkJaWYgKHN0cmNtcCh0eXBlLCBSRUxPQygib2theSIpKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCWNudCA9IHByb21fZ2V0cHJvcChub2RlLCAiaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MiLCBzZXJ2ZXJzLAorCQkJICAgICBzaXplb2Yoc2VydmVycykpOworCQlpZiAoY250ID09IFBST01fRVJST1IpCisJCQlicmVhazsKKwkJY250ID4+PSAyOworCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKwkJCWNwdSA9IHNlcnZlcnNbaV07CisJCQlwcm9tX2RlYnVnKCJDUFUgJWQgLi4uICIsIGNwdSk7CisJCQlpZiAoY3B1ID09IF9wcm9tLT5jcHUpIHsKKwkJCQlwcm9tX2RlYnVnKCJib290ZWQgIVxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwcm9tX2RlYnVnKCJzdGFydGluZyAuLi4gIik7CisKKwkJCS8qIEluaXQgdGhlIGFja25vd2xlZGdlIHZhciB3aGljaCB3aWxsIGJlIHJlc2V0IGJ5CisJCQkgKiB0aGUgc2Vjb25kYXJ5IGNwdSB3aGVuIGl0IGF3YWtlbnMgZnJvbSBpdHMgT0YKKwkJCSAqIHNwaW5sb29wLgorCQkJICovCisJCQlkYXRhLT5hY2sgPSAtMTsKKwkJCXJjID0gcHJvbV9ydGFzX2NhbGwoUkVMT0MocHJvbV9ydGFzX3N0YXJ0X2NwdSksIDMsIDEsCisJCQkJCSAgICBOVUxMLCBjcHUsIGVudHJ5LCBkYXRhKTsKKwkJCXByb21fZGVidWcoInJ0YXMgcmM9JWQgLi4uIiwgcmMpOworCisJCQlmb3IgKGogPSAwOyBqIDwgMTAwMDAwMDAwICYmIGRhdGEtPmFjayA9PSAtMTsgaisrKSB7CisJCQkJSE1UX2xvdygpOworCQkJCW1iKCk7CisJCQl9CisJCQlITVRfbWVkaXVtKCk7CisJCQlpZiAoZGF0YS0+YWNrICE9IC0xKQorCQkJCXByb21fZGVidWcoImRvbmUsIFBJUj0weCV4XG4iLCBkYXRhLT5hY2spOworCQkJZWxzZQorCQkJCXByb21fZGVidWcoInRpbWVvdXQgIVxuIik7CisJCX0KKwl9CisJcHJvbV9kZWJ1ZygicHJvbV9vcGFsX2hvbGRfY3B1czogZW5kLi4uXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJvbV9vcGFsX3Rha2VvdmVyKHZvaWQpCit7CisJc3RydWN0IG9wYWxfc2Vjb25kYXJ5X2RhdGEgKmRhdGEgPSAmUkVMT0Mob3BhbF9zZWNvbmRhcnlfZGF0YSk7CisJc3RydWN0IG9wYWxfdGFrZW92ZXJfYXJncyAqYXJncyA9ICZkYXRhLT5hcmdzOworCXU2NCBhbGlnbiA9IFJFTE9DKHByb21fb3BhbF9hbGlnbik7CisJdTY0IHRvcF9hZGRyLCBvcGFsX2FkZHI7CisKKwlhcmdzLT5rX2ltYWdlCT0gKHU2NClSRUxPQyhfc3RleHQpOworCWFyZ3MtPmtfc2l6ZQk9IF9lbmQgLSBfc3RleHQ7CisJYXJncy0+a19lbnRyeQk9IDA7CisJYXJncy0+a19lbnRyeTIJPSAweDYwOworCisJdG9wX2FkZHIgPSBfQUxJR05fVVAoYXJncy0+a19zaXplLCBhbGlnbik7CisKKwlpZiAoUkVMT0MocHJvbV9pbml0cmRfc3RhcnQpICE9IDApIHsKKwkJYXJncy0+cmRfaW1hZ2UgPSBSRUxPQyhwcm9tX2luaXRyZF9zdGFydCk7CisJCWFyZ3MtPnJkX3NpemUgPSBSRUxPQyhwcm9tX2luaXRyZF9lbmQpIC0gYXJncy0+cmRfaW1hZ2U7CisJCWFyZ3MtPnJkX2xvYyA9IHRvcF9hZGRyOworCQl0b3BfYWRkciA9IF9BTElHTl9VUChhcmdzLT5yZF9sb2MgKyBhcmdzLT5yZF9zaXplLCBhbGlnbik7CisJfQorCisJLyogUGlja3VwIGFuIGFkZHJlc3MgZm9yIHRoZSBIQUwuIFdlIHdhbnQgdG8gZ28gcmVhbGx5IGhpZ2gKKwkgKiB1cCB0byBhdm9pZCBwcm9ibGVtIHdpdGggZnV0dXJlIGtleGVjcy4gT24gdGhlIG90aGVyIGhhbmQKKwkgKiB3ZSBkb24ndCB3YW50IHRvIGJlIGFsbCBvdmVyIHRoZSBUQ0VzIG9uIFA1SU9DMiBtYWNoaW5lcworCSAqIHdoaWNoIGFyZSBnb2luZyB0byBiZSB1cCB0aGVyZSB0b28uIFdlIGFzc3VtZSB0aGUgbWFjaGluZQorCSAqIGhhcyBwbGVudHkgb2YgbWVtb3J5LCBhbmQgd2UgYXNrIGZvciB0aGUgSEFMIGZvciBub3cgdG8KKwkgKiBiZSBqdXN0IGJlbG93IHRoZSAxRyBwb2ludCwgb3IgYWJvdmUgdGhlIGluaXRyZAorCSAqLworCW9wYWxfYWRkciA9IF9BTElHTl9ET1dOKDB4NDAwMDAwMDAgLSBSRUxPQyhwcm9tX29wYWxfc2l6ZSksIGFsaWduKTsKKwlpZiAob3BhbF9hZGRyIDwgdG9wX2FkZHIpCisJCW9wYWxfYWRkciA9IHRvcF9hZGRyOworCWFyZ3MtPmhhbF9hZGRyID0gb3BhbF9hZGRyOworCisJLyogQ29weSB0aGUgY29tbWFuZCBsaW5lIHRvIHRoZSBrZXJuZWwgaW1hZ2UgKi8KKwlzdHJsY3B5KFJFTE9DKGJvb3RfY29tbWFuZF9saW5lKSwgUkVMT0MocHJvbV9jbWRfbGluZSksCisJCUNPTU1BTkRfTElORV9TSVpFKTsKKworCXByb21fZGVidWcoIiAga19pbWFnZSAgICA9IDB4JWx4XG4iLCBhcmdzLT5rX2ltYWdlKTsKKwlwcm9tX2RlYnVnKCIgIGtfc2l6ZSAgICAgPSAweCVseFxuIiwgYXJncy0+a19zaXplKTsKKwlwcm9tX2RlYnVnKCIgIGtfZW50cnkgICAgPSAweCVseFxuIiwgYXJncy0+a19lbnRyeSk7CisJcHJvbV9kZWJ1ZygiICBrX2VudHJ5MiAgID0gMHglbHhcbiIsIGFyZ3MtPmtfZW50cnkyKTsKKwlwcm9tX2RlYnVnKCIgIGhhbF9hZGRyICAgPSAweCVseFxuIiwgYXJncy0+aGFsX2FkZHIpOworCXByb21fZGVidWcoIiAgcmRfaW1hZ2UgICA9IDB4JWx4XG4iLCBhcmdzLT5yZF9pbWFnZSk7CisJcHJvbV9kZWJ1ZygiICByZF9zaXplICAgID0gMHglbHhcbiIsIGFyZ3MtPnJkX3NpemUpOworCXByb21fZGVidWcoIiAgcmRfbG9jICAgICA9IDB4JWx4XG4iLCBhcmdzLT5yZF9sb2MpOworCXByb21fcHJpbnRmKCJQZXJmb3JtaW5nIE9QQUwgdGFrZW92ZXIsdGhpcyBjYW4gdGFrZSBhIGZldyBtaW51dGVzLi5cbiIpOworCXByb21fY2xvc2Vfc3RkaW4oKTsKKwltYigpOworCWRhdGEtPmdvID0gMTsKKwlmb3IgKDs7KQorCQlvcGFsX2RvX3Rha2VvdmVyKGFyZ3MpOworfQorCisvKgorICogQWxsb2NhdGUgcm9vbSBmb3IgYW5kIGluc3RhbnRpYXRlIE9QQUwKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHByb21faW5zdGFudGlhdGVfb3BhbCh2b2lkKQoreworCXBoYW5kbGUgb3BhbF9ub2RlOworCWloYW5kbGUgb3BhbF9pbnN0OworCXU2NCBiYXNlLCBlbnRyeTsKKwl1NjQgc2l6ZSA9IDAsIGFsaWduID0gMHgxMDAwMDsKKwl1MzIgcmV0c1syXTsKKworCXByb21fZGVidWcoInByb21faW5zdGFudGlhdGVfb3BhbDogc3RhcnQuLi5cbiIpOworCisJb3BhbF9ub2RlID0gY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwgQUREUigiL2libSxvcGFsIikpOworCXByb21fZGVidWcoIm9wYWxfbm9kZTogJXhcbiIsIG9wYWxfbm9kZSk7CisJaWYgKCFQSEFORExFX1ZBTElEKG9wYWxfbm9kZSkpCisJCXJldHVybjsKKworCXByb21fZ2V0cHJvcChvcGFsX25vZGUsICJvcGFsLXJ1bnRpbWUtc2l6ZSIsICZzaXplLCBzaXplb2Yoc2l6ZSkpOworCWlmIChzaXplID09IDApCisJCXJldHVybjsKKwlwcm9tX2dldHByb3Aob3BhbF9ub2RlLCAib3BhbC1ydW50aW1lLWFsaWdubWVudCIsICZhbGlnbiwKKwkJICAgICBzaXplb2YoYWxpZ24pKTsKKworCWJhc2UgPSBhbGxvY19kb3duKHNpemUsIGFsaWduLCAwKTsKKwlpZiAoYmFzZSA9PSAwKSB7CisJCXByb21fcHJpbnRmKCJPUEFMIGFsbG9jYXRpb24gZmFpbGVkICFcbiIpOworCQlyZXR1cm47CisJfQorCisJb3BhbF9pbnN0ID0gY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgQUREUigiL2libSxvcGFsIikpOworCWlmICghSUhBTkRMRV9WQUxJRChvcGFsX2luc3QpKSB7CisJCXByb21fcHJpbnRmKCJvcGVuaW5nIG9wYWwgcGFja2FnZSBmYWlsZWQgKCV4KVxuIiwgb3BhbF9pbnN0KTsKKwkJcmV0dXJuOworCX0KKworCXByb21fcHJpbnRmKCJpbnN0YW50aWF0aW5nIG9wYWwgYXQgMHgleC4uLiIsIGJhc2UpOworCisJaWYgKGNhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgNCwgMywgcmV0cywKKwkJCSAgQUREUigibG9hZC1vcGFsLXJ1bnRpbWUiKSwKKwkJCSAgb3BhbF9pbnN0LAorCQkJICBiYXNlID4+IDMyLCBiYXNlICYgMHhmZmZmZmZmZikgIT0gMAorCSAgICB8fCAocmV0c1swXSA9PSAwICYmIHJldHNbMV0gPT0gMCkpIHsKKwkJcHJvbV9wcmludGYoIiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCWVudHJ5ID0gKCgodTY0KXJldHNbMF0pIDw8IDMyKSB8IHJldHNbMV07CisKKwlwcm9tX3ByaW50ZigiIGRvbmVcbiIpOworCisJcmVzZXJ2ZV9tZW0oYmFzZSwgc2l6ZSk7CisKKwlwcm9tX2RlYnVnKCJvcGFsIGJhc2UgICAgID0gMHgleFxuIiwgYmFzZSk7CisJcHJvbV9kZWJ1Zygib3BhbCBhbGlnbiAgICA9IDB4JXhcbiIsIGFsaWduKTsKKwlwcm9tX2RlYnVnKCJvcGFsIGVudHJ5ICAgID0gMHgleFxuIiwgZW50cnkpOworCXByb21fZGVidWcoIm9wYWwgc2l6ZSAgICAgPSAweCV4XG4iLCAobG9uZylzaXplKTsKKworCXByb21fc2V0cHJvcChvcGFsX25vZGUsICIvaWJtLG9wYWwiLCAib3BhbC1iYXNlLWFkZHJlc3MiLAorCQkgICAgICZiYXNlLCBzaXplb2YoYmFzZSkpOworCXByb21fc2V0cHJvcChvcGFsX25vZGUsICIvaWJtLG9wYWwiLCAib3BhbC1lbnRyeS1hZGRyZXNzIiwKKwkJICAgICAmZW50cnksIHNpemVvZihlbnRyeSkpOworCisjaWZkZWYgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMCisJUkVMT0MocHJvbV9vcGFsX2Jhc2UpID0gYmFzZTsKKwlSRUxPQyhwcm9tX29wYWxfZW50cnkpID0gZW50cnk7CisjZW5kaWYKKwlwcm9tX2RlYnVnKCJwcm9tX2luc3RhbnRpYXRlX29wYWw6IGVuZC4uLlxuIik7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BPV0VSTlYgKi8KIAogLyoKICAqIEFsbG9jYXRlIHJvb20gZm9yIGFuZCBpbnN0YW50aWF0ZSBSVEFTCkBAIC0xMzI2LDYgKzE2MDgsMTIgQEAKIAlwcm9tX3NldHByb3AocnRhc19ub2RlLCAiL3J0YXMiLCAibGludXgscnRhcy1lbnRyeSIsCiAJCSAgICAgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKIAorI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorCS8qIFBvd2VyVk4gdGFrZW92ZXIgaGFjayAqLworCVJFTE9DKHByb21fcnRhc19kYXRhKSA9IGJhc2U7CisJUkVMT0MocHJvbV9ydGFzX2VudHJ5KSA9IGVudHJ5OworCXByb21fZ2V0cHJvcChydGFzX25vZGUsICJzdGFydC1jcHUiLCAmUkVMT0MocHJvbV9ydGFzX3N0YXJ0X2NwdSksIDQpOworI2VuZGlmCiAJcHJvbV9kZWJ1ZygicnRhcyBiYXNlICAgICA9IDB4JXhcbiIsIGJhc2UpOwogCXByb21fZGVidWcoInJ0YXMgZW50cnkgICAgPSAweCV4XG4iLCBlbnRyeSk7CiAJcHJvbV9kZWJ1ZygicnRhcyBzaXplICAgICA9IDB4JXhcbiIsIChsb25nKXNpemUpOwpAQCAtMTU0Myw3ICsxODMxLDcgQEAKIAkJKmFja25vd2xlZGdlID0gKHVuc2lnbmVkIGxvbmcpLTE7CiAKIAkJaWYgKHJlZyAhPSBfcHJvbS0+Y3B1KSB7Ci0JCQkvKiBQcmltYXJ5IFRocmVhZCBvZiBub24tYm9vdCBjcHUgKi8KKwkJCS8qIFByaW1hcnkgVGhyZWFkIG9mIG5vbi1ib290IGNwdSBvciBhbnkgdGhyZWFkICovCiAJCQlwcm9tX3ByaW50Zigic3RhcnRpbmcgY3B1IGh3IGlkeCAlbHUuLi4gIiwgcmVnKTsKIAkJCWNhbGxfcHJvbSgic3RhcnQtY3B1IiwgMywgMCwgbm9kZSwKIAkJCQkgIHNlY29uZGFyeV9ob2xkLCByZWcpOwpAQCAtMTY1MiwxNSArMTk0MCw2IEBACiAJCXByb21fc2V0cHJvcCh2YWwsIHBhdGgsICJsaW51eCxib290LWRpc3BsYXkiLCBOVUxMLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHByb21fY2xvc2Vfc3RkaW4odm9pZCkKLXsKLQlzdHJ1Y3QgcHJvbV90ICpfcHJvbSA9ICZSRUxPQyhwcm9tKTsKLQlpaGFuZGxlIHZhbDsKLQotCWlmIChwcm9tX2dldHByb3AoX3Byb20tPmNob3NlbiwgInN0ZGluIiwgJnZhbCwgc2l6ZW9mKHZhbCkpID4gMCkKLQkJY2FsbF9wcm9tKCJjbG9zZSIsIDEsIDAsIHZhbCk7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IHByb21fZmluZF9tYWNoaW5lX3R5cGUodm9pZCkKIHsKIAlzdHJ1Y3QgcHJvbV90ICpfcHJvbSA9ICZSRUxPQyhwcm9tKTsKQEAgLTE2NzEsNyArMTk1MCw3IEBACiAJaW50IHg7CiAjZW5kaWYKIAotCS8qIExvb2sgZm9yIGEgUG93ZXJNYWMgKi8KKwkvKiBMb29rIGZvciBhIFBvd2VyTWFjIG9yIGEgQ2VsbCAqLwogCWxlbiA9IHByb21fZ2V0cHJvcChfcHJvbS0+cm9vdCwgImNvbXBhdGlibGUiLAogCQkJICAgY29tcGF0LCBzaXplb2YoY29tcGF0KS0xKTsKIAlpZiAobGVuID4gMCkgewpAQCAtMTY5Nyw3ICsxOTc2LDExIEBACiAJCX0KIAl9CiAjaWZkZWYgQ09ORklHX1BQQzY0Ci0JLyogSWYgbm90IGEgbWFjLCB0cnkgdG8gZmlndXJlIG91dCBpZiBpdCdzIGFuIElCTSBwU2VyaWVzIG9yIGFueSBvdGhlcgorCS8qIFRyeSB0byBkZXRlY3QgT1BBTCAqLworCWlmIChQSEFORExFX1ZBTElEKGNhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIEFERFIoIi9pYm0sb3BhbCIpKSkpCisJCXJldHVybiBQTEFURk9STV9PUEFMOworCisJLyogVHJ5IHRvIGZpZ3VyZSBvdXQgaWYgaXQncyBhbiBJQk0gcFNlcmllcyBvciBhbnkgb3RoZXIKIAkgKiBQQVBSIGNvbXBsaWFudCBwbGF0Zm9ybS4gV2UgYXNzdW1lIGl0IGlzIGlmIDoKIAkgKiAgLSAvZGV2aWNlX3R5cGUgaXMgImNocnAiIChwbGVhc2UsIGRvIE5PVCB1c2UgdGhhdCBmb3IgZnV0dXJlCiAJICogICAgbm9uLUlCTSBkZXNpZ25zICEKQEAgLTE5MjQsNyArMjIwNyw3IEBACiAJdW5zaWduZWQgbG9uZyBzb2ZmOwogCXVuc2lnbmVkIGNoYXIgKnZhbHA7CiAJc3RhdGljIGNoYXIgcG5hbWVbTUFYX1BST1BFUlRZX05BTUVdOwotCWludCBsLCByb29tOworCWludCBsLCByb29tLCBoYXNfcGhhbmRsZSA9IDA7CiAKIAlkdF9wdXNoX3Rva2VuKE9GX0RUX0JFR0lOX05PREUsIG1lbV9zdGFydCwgbWVtX2VuZCk7CiAKQEAgLTIwMDgsMTkgKzIyOTEsMjYgQEAKIAkJdmFscCA9IG1ha2Vfcm9vbShtZW1fc3RhcnQsIG1lbV9lbmQsIGwsIDQpOwogCQljYWxsX3Byb20oImdldHByb3AiLCA0LCAxLCBub2RlLCBSRUxPQyhwbmFtZSksIHZhbHAsIGwpOwogCQkqbWVtX3N0YXJ0ID0gX0FMSUdOKCptZW1fc3RhcnQsIDQpOworCisJCWlmICghc3RyY21wKFJFTE9DKHBuYW1lKSwgUkVMT0MoInBoYW5kbGUiKSkpCisJCQloYXNfcGhhbmRsZSA9IDE7CiAJfQogCi0JLyogQWRkIGEgImxpbnV4LHBoYW5kbGUiIHByb3BlcnR5LiAqLwotCXNvZmYgPSBkdF9maW5kX3N0cmluZyhSRUxPQygibGludXgscGhhbmRsZSIpKTsKLQlpZiAoc29mZiA9PSAwKQotCQlwcm9tX3ByaW50ZigiV0FSTklORzogQ2FuJ3QgZmluZCBzdHJpbmcgaW5kZXggZm9yIgotCQkJICAgICIgPGxpbnV4LXBoYW5kbGU+IG5vZGUgJXNcbiIsIHBhdGgpOwotCWVsc2UgewotCQlkdF9wdXNoX3Rva2VuKE9GX0RUX1BST1AsIG1lbV9zdGFydCwgbWVtX2VuZCk7Ci0JCWR0X3B1c2hfdG9rZW4oNCwgbWVtX3N0YXJ0LCBtZW1fZW5kKTsKLQkJZHRfcHVzaF90b2tlbihzb2ZmLCBtZW1fc3RhcnQsIG1lbV9lbmQpOwotCQl2YWxwID0gbWFrZV9yb29tKG1lbV9zdGFydCwgbWVtX2VuZCwgNCwgNCk7Ci0JCSoodTMyICopdmFscCA9IG5vZGU7CisJLyogQWRkIGEgImxpbnV4LHBoYW5kbGUiIHByb3BlcnR5IGlmIG5vICJwaGFuZGxlIiBwcm9wZXJ0eSBhbHJlYWR5CisJICogZXhpc3RlZCAoY2FuIGhhcHBlbiB3aXRoIE9QQUwpCisJICovCisJaWYgKCFoYXNfcGhhbmRsZSkgeworCQlzb2ZmID0gZHRfZmluZF9zdHJpbmcoUkVMT0MoImxpbnV4LHBoYW5kbGUiKSk7CisJCWlmIChzb2ZmID09IDApCisJCQlwcm9tX3ByaW50ZigiV0FSTklORzogQ2FuJ3QgZmluZCBzdHJpbmcgaW5kZXggZm9yIgorCQkJCSAgICAiIDxsaW51eC1waGFuZGxlPiBub2RlICVzXG4iLCBwYXRoKTsKKwkJZWxzZSB7CisJCQlkdF9wdXNoX3Rva2VuKE9GX0RUX1BST1AsIG1lbV9zdGFydCwgbWVtX2VuZCk7CisJCQlkdF9wdXNoX3Rva2VuKDQsIG1lbV9zdGFydCwgbWVtX2VuZCk7CisJCQlkdF9wdXNoX3Rva2VuKHNvZmYsIG1lbV9zdGFydCwgbWVtX2VuZCk7CisJCQl2YWxwID0gbWFrZV9yb29tKG1lbV9zdGFydCwgbWVtX2VuZCwgNCwgNCk7CisJCQkqKHUzMiAqKXZhbHAgPSBub2RlOworCQl9CiAJfQogCiAJLyogZG8gYWxsIG91ciBjaGlsZHJlbiAqLwpAQCAtMjUwNCw2ICsyNzk0LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KIH0KIAorCiAvKgogICogV2UgZW50ZXIgaGVyZSBlYXJseSBvbiwgd2hlbiB0aGUgT3BlbiBGaXJtd2FyZSBwcm9tIGlzIHN0aWxsCiAgKiBoYW5kbGluZyBleGNlcHRpb25zIGFuZCB0aGUgTU1VIGhhc2ggdGFibGUgZm9yIHVzLgpAQCAtMjU1Myw2ICsyODQ0LDcgQEAKIAkgKiBiZXR3ZWVuIHBTZXJpZXMgU01QIGFuZCBwU2VyaWVzIExQQVIKIAkgKi8KIAlSRUxPQyhvZl9wbGF0Zm9ybSkgPSBwcm9tX2ZpbmRfbWFjaGluZV90eXBlKCk7CisJcHJvbV9wcmludGYoIkRldGVjdGVkIG1hY2hpbmUgdHlwZTogJXhcbiIsIFJFTE9DKG9mX3BsYXRmb3JtKSk7CiAKICNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCiAJLyogQmFpbCBpZiB0aGlzIGlzIGEga2R1bXAga2VybmVsLiAqLwpAQCAtMjU2NSw3ICsyODU3LDcgQEAKIAkgKi8KIAlwcm9tX2NoZWNrX2luaXRyZChyMywgcjQpOwogCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX1BTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19QT1dFUk5WKQogCS8qCiAJICogT24gcFNlcmllcywgaW5mb3JtIHRoZSBmaXJtd2FyZSBhYm91dCBvdXIgY2FwYWJpbGl0aWVzCiAJICovCkBAIC0yNjExLDE0ICsyOTAzLDMzIEBACiAjZW5kaWYKIAogCS8qCi0JICogT24gbm9uLXBvd2VybWFjcywgdHJ5IHRvIGluc3RhbnRpYXRlIFJUQVMgYW5kIHB1dHMgYWxsIENQVXMKLQkgKiBpbiBzcGluLWxvb3BzLiBQb3dlck1hY3MgZG9uJ3QgaGF2ZSBhIHdvcmtpbmcgUlRBUyBhbmQgdXNlCi0JICogYSBkaWZmZXJlbnQgd2F5IHRvIHNwaW4gQ1BVcworCSAqIE9uIG5vbi1wb3dlcm1hY3MsIHRyeSB0byBpbnN0YW50aWF0ZSBSVEFTLiBQb3dlck1hY3MgZG9uJ3QKKwkgKiBoYXZlIGEgdXNhYmxlIFJUQVMgaW1wbGVtZW50YXRpb24uCiAJICovCi0JaWYgKFJFTE9DKG9mX3BsYXRmb3JtKSAhPSBQTEFURk9STV9QT1dFUk1BQykgeworCWlmIChSRUxPQyhvZl9wbGF0Zm9ybSkgIT0gUExBVEZPUk1fUE9XRVJNQUMgJiYKKwkgICAgUkVMT0Mob2ZfcGxhdGZvcm0pICE9IFBMQVRGT1JNX09QQUwpCiAJCXByb21faW5zdGFudGlhdGVfcnRhcygpOworCisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WCisJLyogRGV0ZWN0IEhBTCBhbmQgdHJ5IGluc3RhbmNpYXRpbmcgaXQgJiBkb2luZyB0YWtlb3ZlciAqLworCWlmIChSRUxPQyhvZl9wbGF0Zm9ybSkgPT0gUExBVEZPUk1fUFNFUklFU19MUEFSKSB7CisJCXByb21fcXVlcnlfb3BhbCgpOworCQlpZiAoUkVMT0Mob2ZfcGxhdGZvcm0pID09IFBMQVRGT1JNX09QQUwpIHsKKwkJCXByb21fb3BhbF9ob2xkX2NwdXMoKTsKKwkJCXByb21fb3BhbF90YWtlb3ZlcigpOworCQl9CisJfSBlbHNlIGlmIChSRUxPQyhvZl9wbGF0Zm9ybSkgPT0gUExBVEZPUk1fT1BBTCkKKwkJcHJvbV9pbnN0YW50aWF0ZV9vcGFsKCk7CisjZW5kaWYKKworCS8qCisJICogT24gbm9uLXBvd2VybWFjcywgcHV0IGFsbCBDUFVzIGluIHNwaW4tbG9vcHMuCisJICoKKwkgKiBQb3dlck1hY3MgdXNlIGEgZGlmZmVyZW50IG1lY2hhbmlzbSB0byBzcGluIENQVXMKKwkgKi8KKwlpZiAoUkVMT0Mob2ZfcGxhdGZvcm0pICE9IFBMQVRGT1JNX1BPV0VSTUFDICYmCisJICAgIFJFTE9DKG9mX3BsYXRmb3JtKSAhPSBQTEFURk9STV9PUEFMKQogCQlwcm9tX2hvbGRfY3B1cygpOwotCX0KIAogCS8qCiAJICogRmlsbCBpbiBzb21lIGluZm9zIGZvciB1c2UgYnkgdGhlIGtlcm5lbCBsYXRlciBvbgpAQCAtMjY4NSw3ICsyOTk2LDEzIEBACiAJcmVsb2NfZ290Migtb2Zmc2V0KTsKICNlbmRpZgogCi0JX19zdGFydChoZHIsIGtiYXNlLCAwKTsKKyNpZmRlZiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX09QQUwKKwkvKiBPUEFMIGVhcmx5IGRlYnVnIGdldHMgdGhlIE9QQUwgYmFzZSAmIGVudHJ5IGluIHI4IGFuZCByOSAqLworCV9fc3RhcnQoaGRyLCBrYmFzZSwgMCwgMCwgMCwKKwkJUkVMT0MocHJvbV9vcGFsX2Jhc2UpLCBSRUxPQyhwcm9tX29wYWxfZW50cnkpKTsKKyNlbHNlCisJX19zdGFydChoZHIsIGtiYXNlLCAwLCAwLCAwLCAwLCAwKTsKKyNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdF9jaGVjay5zaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0X2NoZWNrLnNoCmluZGV4IDlmODJmNDkuLjcwZjQyODYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0X2NoZWNrLnNoCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0X2NoZWNrLnNoCkBAIC0yMCw3ICsyMCw5IEBACiBfZW5kIGVudGVyX3Byb20gbWVtY3B5IG1lbXNldCByZWxvY19vZmZzZXQgX19zZWNvbmRhcnlfaG9sZAogX19zZWNvbmRhcnlfaG9sZF9hY2tub3dsZWRnZSBfX3NlY29uZGFyeV9ob2xkX3NwaW5sb29wIF9fc3RhcnQKIHN0cmNtcCBzdHJjcHkgc3RybGNweSBzdHJsZW4gc3RybmNtcCBzdHJzdHIgbG9nb19saW51eF9jbHV0MjI0Ci1yZWxvY19nb3QyIGtlcm5zdGFydF9hZGRyIG1lbXN0YXJ0X2FkZHIgbGludXhfYmFubmVyIgorcmVsb2NfZ290MiBrZXJuc3RhcnRfYWRkciBtZW1zdGFydF9hZGRyIGxpbnV4X2Jhbm5lciBfc3RleHQKK29wYWxfcXVlcnlfdGFrZW92ZXIgb3BhbF9kb190YWtlb3ZlciBvcGFsX2VudGVyX3J0YXMgb3BhbF9zZWNvbmRhcnlfZW50cnkKK2Jvb3RfY29tbWFuZF9saW5lIgogCiBOTT0iJDEiCiBPQko9IiQyIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwppbmRleCA0NzE4N2NjLi40ZTEzMzFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwpAQCAtMiw3ICsyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMDViN2RkMi4uNWRlNzNkYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCkBAIC0zMCw5ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8dHJhY2Uvc3lzY2FsbC5oPgotI2lmZGVmIENPTkZJR19QUEMzMgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvaHdfYnJlYWtwb2ludC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KIApAQCAtMTQ5Nyw5ICsxNDk0LDE0IEBACiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKIAkJCXRtcCA9IHB0cmFjZV9nZXRfcmVnKGNoaWxkLCAoaW50KSBpbmRleCk7CiAJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgZnBpZHggPSBpbmRleCAtIFBUX0ZQUjA7CisKIAkJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0JCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcikKLQkJCQlbVFNfRlBSV0lEVEggKiAoaW5kZXggLSBQVF9GUFIwKV07CisJCQlpZiAoZnBpZHggPCAoUFRfRlBTQ1IgLSBQVF9GUFIwKSkKKwkJCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcikKKwkJCQkJW2ZwaWR4ICogVFNfRlBSV0lEVEhdOworCQkJZWxzZQorCQkJCXRtcCA9IGNoaWxkLT50aHJlYWQuZnBzY3IudmFsOwogCQl9CiAJCXJldCA9IHB1dF91c2VyKHRtcCwgZGF0YWxwKTsKIAkJYnJlYWs7CkBAIC0xNTI1LDkgKzE1MjcsMTQgQEAKIAkJaWYgKGluZGV4IDwgUFRfRlBSMCkgewogCQkJcmV0ID0gcHRyYWNlX3B1dF9yZWcoY2hpbGQsIGluZGV4LCBkYXRhKTsKIAkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGludCBmcGlkeCA9IGluZGV4IC0gUFRfRlBSMDsKKwogCQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKLQkJCSgodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQuZnByKQotCQkJCVtUU19GUFJXSURUSCAqIChpbmRleCAtIFBUX0ZQUjApXSA9IGRhdGE7CisJCQlpZiAoZnBpZHggPCAoUFRfRlBTQ1IgLSBQVF9GUFIwKSkKKwkJCQkoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcikKKwkJCQkJW2ZwaWR4ICogVFNfRlBSV0lEVEhdID0gZGF0YTsKKwkJCWVsc2UKKwkJCQljaGlsZC0+dGhyZWFkLmZwc2NyLnZhbCA9IGRhdGE7CiAJCQlyZXQgPSAwOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwppbmRleCBkNWNhODIzLi41MTdiMWQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwppbmRleCBiMWQ3MzhkLi43N2JiNzdkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKQEAgLTEyLDcgKzEyLDcgQEAKIAogI3VuZGVmIERFQlVHCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYwppbmRleCAyMDkxMzVhLi5jMWNlODYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCkBAIC0xMTcsNyArMTE3LDcgQEAKICAqIFRoaXMgaXMgY2FsbGVkIHZlcnkgZWFybHkgb24gdGhlIGJvb3QgcHJvY2VzcywgYWZ0ZXIgYSBtaW5pbWFsCiAgKiBNTVUgZW52aXJvbm1lbnQgaGFzIGJlZW4gc2V0IHVwIGJ1dCBiZWZvcmUgTU1VX2luaXQgaXMgY2FsbGVkLgogICovCi1ub3RyYWNlIHZvaWQgX19pbml0IG1hY2hpbmVfaW5pdCh1bnNpZ25lZCBsb25nIGR0X3B0cikKK25vdHJhY2Ugdm9pZCBfX2luaXQgbWFjaGluZV9pbml0KHU2NCBkdF9wdHIpCiB7CiAJbG9ja2RlcF9pbml0KCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCBhZWJlZjEzLi4xYTlkZWE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC0xMiw3ICsxMiw3IEBACiAKICN1bmRlZiBERUJVRwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yNzgsMTQgKzI3OCwxNCBAQAogCiAJREJHKCIgLT4gaW5pdGlhbGl6ZV9jYWNoZV9pbmZvKClcbiIpOwogCi0JZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAiY3B1IikpOykgeworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgImNwdSIpIHsKIAkJbnVtX2NwdXMgKz0gMTsKIAotCQkvKiBXZSdyZSBhc3N1bWluZyAqYWxsKiBvZiB0aGUgQ1BVcyBoYXZlIHRoZSBzYW1lCisJCS8qCisJCSAqIFdlJ3JlIGFzc3VtaW5nICphbGwqIG9mIHRoZSBDUFVzIGhhdmUgdGhlIHNhbWUKIAkJICogZC1jYWNoZSBhbmQgaS1jYWNoZSBzaXplcy4uLiAtUGV0ZXIKIAkJICovCi0KLQkJaWYgKCBudW1fY3B1cyA9PSAxICkgeworCQlpZiAobnVtX2NwdXMgPT0gMSkgewogCQkJY29uc3QgdTMyICpzaXplcCwgKmxzaXplcDsKIAkJCXUzMiBzaXplLCBsc2l6ZTsKIApAQCAtMjk0LDEwICsyOTQsMTMgQEAKIAkJCXNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZC1jYWNoZS1zaXplIiwgTlVMTCk7CiAJCQlpZiAoc2l6ZXAgIT0gTlVMTCkKIAkJCQlzaXplID0gKnNpemVwOwotCQkJbHNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZC1jYWNoZS1ibG9jay1zaXplIiwgTlVMTCk7CisJCQlsc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkLWNhY2hlLWJsb2NrLXNpemUiLAorCQkJCQkJIE5VTEwpOwogCQkJLyogZmFsbGJhY2sgaWYgYmxvY2sgc2l6ZSBtaXNzaW5nICovCiAJCQlpZiAobHNpemVwID09IE5VTEwpCi0JCQkJbHNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZC1jYWNoZS1saW5lLXNpemUiLCBOVUxMKTsKKwkJCQlsc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkobnAsCisJCQkJCQkJICJkLWNhY2hlLWxpbmUtc2l6ZSIsCisJCQkJCQkJIE5VTEwpOwogCQkJaWYgKGxzaXplcCAhPSBOVUxMKQogCQkJCWxzaXplID0gKmxzaXplcDsKIAkJCWlmIChzaXplcCA9PSAwIHx8IGxzaXplcCA9PSAwKQpAQCAtMzE0LDkgKzMxNywxMiBAQAogCQkJc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpLWNhY2hlLXNpemUiLCBOVUxMKTsKIAkJCWlmIChzaXplcCAhPSBOVUxMKQogCQkJCXNpemUgPSAqc2l6ZXA7Ci0JCQlsc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpLWNhY2hlLWJsb2NrLXNpemUiLCBOVUxMKTsKKwkJCWxzaXplcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImktY2FjaGUtYmxvY2stc2l6ZSIsCisJCQkJCQkgTlVMTCk7CiAJCQlpZiAobHNpemVwID09IE5VTEwpCi0JCQkJbHNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaS1jYWNoZS1saW5lLXNpemUiLCBOVUxMKTsKKwkJCQlsc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkobnAsCisJCQkJCQkJICJpLWNhY2hlLWxpbmUtc2l6ZSIsCisJCQkJCQkJIE5VTEwpOwogCQkJaWYgKGxzaXplcCAhPSBOVUxMKQogCQkJCWxzaXplID0gKmxzaXplcDsKIAkJCWlmIChzaXplcCA9PSAwIHx8IGxzaXplcCA9PSAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKaW5kZXggZTkxYzczNi4uYTUwYjVlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKICNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKaW5kZXggN2JmMjE4Ny4uNmRmNzA5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCkBAIC0xOCw3ICsxOCw3IEBACiAjdW5kZWYgREVCVUcKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC03MCw2ICs3MCwxMCBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBpZGxlX3RocmVhZF9hcnJheSk7CiAjZGVmaW5lIGdldF9pZGxlX2Zvcl9jcHUoeCkgICAgICAocGVyX2NwdShpZGxlX3RocmVhZF9hcnJheSwgeCkpCiAjZGVmaW5lIHNldF9pZGxlX2Zvcl9jcHUoeCwgcCkgICAocGVyX2NwdShpZGxlX3RocmVhZF9hcnJheSwgeCkgPSAocCkpCisKKy8qIFN0YXRlIG9mIGVhY2ggQ1BVIGR1cmluZyBob3RwbHVnIHBoYXNlcyAqLworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgY3B1X3N0YXRlKSA9IHsgMCB9OworCiAjZWxzZQogc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZV90aHJlYWRfYXJyYXlbTlJfQ1BVU10gX19jcHVpbml0ZGF0YSA7CiAjZGVmaW5lIGdldF9pZGxlX2Zvcl9jcHUoeCkgICAgICAoaWRsZV90aHJlYWRfYXJyYXlbKHgpXSkKQEAgLTEwNCwxMiArMTA4LDI1IEBACiAJICogY3B1X3N0YXJ0IGZpZWxkIHRvIGJlY29tZSBub24temVybyBBZnRlciB3ZSBzZXQgY3B1X3N0YXJ0LAogCSAqIHRoZSBwcm9jZXNzb3Igd2lsbCBjb250aW51ZSBvbiB0byBzZWNvbmRhcnlfc3RhcnQKIAkgKi8KLQlwYWNhW25yXS5jcHVfc3RhcnQgPSAxOwotCXNtcF9tYigpOworCWlmICghcGFjYVtucl0uY3B1X3N0YXJ0KSB7CisJCXBhY2FbbnJdLmNwdV9zdGFydCA9IDE7CisJCXNtcF9tYigpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwkvKgorCSAqIE9rIGl0J3Mgbm90IHRoZXJlLCBzbyBpdCBtaWdodCBiZSBzb2Z0LXVucGx1Z2dlZCwgbGV0J3MKKwkgKiB0cnkgdG8gYnJpbmcgaXQgYmFjaworCSAqLworCXBlcl9jcHUoY3B1X3N0YXRlLCBucikgPSBDUFVfVVBfUFJFUEFSRTsKKwlzbXBfd21iKCk7CisJc21wX3NlbmRfcmVzY2hlZHVsZShucik7CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgY2FsbF9mdW5jdGlvbl9hY3Rpb24oaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKQEAgLTE3MCw3ICsxODcsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAjZW5kaWYKLQllcnIgPSByZXF1ZXN0X2lycSh2aXJxLCBzbXBfaXBpX2FjdGlvblttc2ddLCBJUlFGX0RJU0FCTEVEfElSUUZfUEVSQ1BVLAorCWVyciA9IHJlcXVlc3RfaXJxKHZpcnEsIHNtcF9pcGlfYWN0aW9uW21zZ10sIElSUUZfUEVSQ1BVLAogCQkJICBzbXBfaXBpX25hbWVbbXNnXSwgMCk7CiAJV0FSTihlcnIgPCAwLCAidW5hYmxlIHRvIHJlcXVlc3RfaXJxICVkIGZvciAlcyAocmMgJWQpXG4iLAogCQl2aXJxLCBzbXBfaXBpX25hbWVbbXNnXSwgZXJyKTsKQEAgLTM1Nyw4ICszNzQsNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0vKiBTdGF0ZSBvZiBlYWNoIENQVSBkdXJpbmcgaG90cGx1ZyBwaGFzZXMgKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGNwdV9zdGF0ZSkgPSB7IDAgfTsKIAogaW50IGdlbmVyaWNfY3B1X2Rpc2FibGUodm9pZCkKIHsKQEAgLTQwNiw2ICs0MjEsMTEgQEAKIHsKIAlwZXJfY3B1KGNwdV9zdGF0ZSwgY3B1KSA9IENQVV9ERUFEOwogfQorCitpbnQgZ2VuZXJpY19jaGVja19jcHVfcmVzdGFydCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBwZXJfY3B1KGNwdV9zdGF0ZSwgY3B1KSA9PSBDUFVfVVBfUFJFUEFSRTsKK30KICNlbmRpZgogCiBzdHJ1Y3QgY3JlYXRlX2lkbGUgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zdGFja3RyYWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N0YWNrdHJhY2UuYwppbmRleCBiMGRiYjFkLi4zZDMwZWYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtMTAsNyArMTAsNyBAQAogICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zd3N1c3AuYwppbmRleCBhYTE3Yjc2Li42NDFmOWFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3dzdXNwLmMKQEAgLTMzLDYgKzMzLDYgQEAKIHZvaWQgcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUFBDMzIKLQlzd2l0Y2hfbW11X2NvbnRleHQoTlVMTCwgY3VycmVudC0+YWN0aXZlX21tKTsKKwlzd2l0Y2hfbW11X2NvbnRleHQoY3VycmVudC0+YWN0aXZlX21tLCBjdXJyZW50LT5hY3RpdmVfbW0pOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zd3N1c3BfNjQuYwppbmRleCA2ZjNmMDY5Li4xNjhlODg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3dzdXNwXzY0LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIHZvaWQgZG9fYWZ0ZXJfY29weWJhY2sodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwppbmRleCBmMGYyMTk5Li5jZTAzNWMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCkBAIC00LDcgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IDAzYjI5YTYuLjUyMmJiMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCkBAIC0zMyw3ICszMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IGYxOWQ5NzcuLjRlNTkwODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTQ1Nyw3ICs0NTcsMTQgQEAKIAogCWlmIChyZWFzb24gJiBNQ1NSX0RDUEVSUl9NQykgewogCQlwcmludGsoIkRhdGEgQ2FjaGUgUGFyaXR5IEVycm9yXG4iKTsKLQkJcmVjb3ZlcmFibGUgPSAwOworCisJCS8qCisJCSAqIEluIHdyaXRlIHNoYWRvdyBtb2RlIHdlIGF1dG8tcmVjb3ZlciBmcm9tIHRoZSBlcnJvciwgYnV0IGl0CisJCSAqIG1heSBzdGlsbCBnZXQgbG9nZ2VkIGFuZCBjYXVzZSBhIG1hY2hpbmUgY2hlY2suICBXZSBzaG91bGQKKwkJICogb25seSB0cmVhdCB0aGUgbm9uLXdyaXRlIHNoYWRvdyBjYXNlIGFzIG5vbi1yZWNvdmVyYWJsZS4KKwkJICovCisJCWlmICghKG1mc3ByKFNQUk5fTDFDU1IyKSAmIEwxQ1NSMl9EQ1dTKSkKKwkJCXJlY292ZXJhYmxlID0gMDsKIAl9CiAKIAlpZiAocmVhc29uICYgTUNTUl9MMk1NVV9NSElUKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmcuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZy5jCmluZGV4IGI0NjA3YTkuLjU3ZmEyYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZy5jCkBAIC02OSw2ICs2OSwxMiBAQAogCXVkYmdfaW5pdF93c3AoKTsKICNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19FQVJMWV9ERUJVR19FSFZfQkMpCiAJdWRiZ19pbml0X2Vodl9iYygpOworI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1BTM0dFTElDKQorCXVkYmdfaW5pdF9wczNnZWxpYygpOworI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0VBUkxZX0RFQlVHX09QQUxfUkFXKQorCXVkYmdfaW5pdF9kZWJ1Z19vcGFsX3JhdygpOworI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0VBUkxZX0RFQlVHX09QQUxfSFZTSSkKKwl1ZGJnX2luaXRfZGVidWdfb3BhbF9odnNpKCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUENfRUFSTFlfREVCVUcKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMKaW5kZXggMTQyYWIxMC4uN2QxNGJiNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCkBAIC05LDcgKzksNiBAQAogICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCmluZGV4IDFiNjk1ZmQuLmY2NWFmNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwpAQCAtMTUsMTEgKzE1LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CkBAIC02MDUsMTUgKzYwNiwyMCBAQAogICAgICAgICByZXR1cm4gZG1hX2lvbW11X29wcy5kbWFfc3VwcG9ydGVkKGRldiwgbWFzayk7CiB9CiAKLXN0cnVjdCBkbWFfbWFwX29wcyB2aW9fZG1hX21hcHBpbmdfb3BzID0gewotCS5hbGxvY19jb2hlcmVudCA9IHZpb19kbWFfaW9tbXVfYWxsb2NfY29oZXJlbnQsCi0JLmZyZWVfY29oZXJlbnQgID0gdmlvX2RtYV9pb21tdV9mcmVlX2NvaGVyZW50LAotCS5tYXBfc2cgICAgICAgICA9IHZpb19kbWFfaW9tbXVfbWFwX3NnLAotCS51bm1hcF9zZyAgICAgICA9IHZpb19kbWFfaW9tbXVfdW5tYXBfc2csCi0JLm1hcF9wYWdlICAgICAgID0gdmlvX2RtYV9pb21tdV9tYXBfcGFnZSwKLQkudW5tYXBfcGFnZSAgICAgPSB2aW9fZG1hX2lvbW11X3VubWFwX3BhZ2UsCi0JLmRtYV9zdXBwb3J0ZWQgID0gdmlvX2RtYV9pb21tdV9kbWFfc3VwcG9ydGVkLAorc3RhdGljIHU2NCB2aW9fZG1hX2dldF9yZXF1aXJlZF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyAgICAgICAgcmV0dXJuIGRtYV9pb21tdV9vcHMuZ2V0X3JlcXVpcmVkX21hc2soZGV2KTsKK30KIAorc3RydWN0IGRtYV9tYXBfb3BzIHZpb19kbWFfbWFwcGluZ19vcHMgPSB7CisJLmFsbG9jX2NvaGVyZW50ICAgID0gdmlvX2RtYV9pb21tdV9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudCAgICAgPSB2aW9fZG1hX2lvbW11X2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zZyAgICAgICAgICAgID0gdmlvX2RtYV9pb21tdV9tYXBfc2csCisJLnVubWFwX3NnICAgICAgICAgID0gdmlvX2RtYV9pb21tdV91bm1hcF9zZywKKwkubWFwX3BhZ2UgICAgICAgICAgPSB2aW9fZG1hX2lvbW11X21hcF9wYWdlLAorCS51bm1hcF9wYWdlICAgICAgICA9IHZpb19kbWFfaW9tbXVfdW5tYXBfcGFnZSwKKwkuZG1hX3N1cHBvcnRlZCAgICAgPSB2aW9fZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQsCisJLmdldF9yZXF1aXJlZF9tYXNrID0gdmlvX2RtYV9nZXRfcmVxdWlyZWRfbWFzaywKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS80NHguYyBiL2FyY2gvcG93ZXJwYy9rdm0vNDR4LmMKaW5kZXggZGEzYTEyMi4uN2I2MTJhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS80NHguYworKysgYi9hcmNoL3Bvd2VycGMva3ZtLzQ0eC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcmVnLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CkBAIC03OCw2ICs3OSw4IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmNwdV80NHgtPnNoYWRvd19yZWZzKTsgaSsrKQogCQl2Y3B1XzQ0eC0+c2hhZG93X3JlZnNbaV0uZ3RsYl9pbmRleCA9IC0xOwogCisJdmNwdS0+YXJjaC5jcHVfdHlwZSA9IEtWTV9DUFVfNDQwOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlCmluZGV4IDA4NDI4ZTIuLjM2ODhhZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZQpAQCAtNDMsMTggKzQzLDIyIEBACiAJZnB1Lm8gXAogCWJvb2szc19wYWlyZWRfc2luZ2xlcy5vIFwKIAlib29rM3NfcHIubyBcCisJYm9vazNzX3ByX3BhcHIubyBcCiAJYm9vazNzX2VtdWxhdGUubyBcCiAJYm9vazNzX2ludGVycnVwdHMubyBcCiAJYm9vazNzX21tdV9ocHRlLm8gXAogCWJvb2szc182NF9tbXVfaG9zdC5vIFwKIAlib29rM3NfNjRfbW11Lm8gXAogCWJvb2szc18zMl9tbXUubwora3ZtLWJvb2szc182NC1idWlsdGluLW9ianMtJChDT05GSUdfS1ZNX0JPT0szU182NF9QUikgOj0gXAorCWJvb2szc19ybWhhbmRsZXJzLm8KIAoga3ZtLWJvb2szc182NC1vYmpzLSQoQ09ORklHX0tWTV9CT09LM1NfNjRfSFYpIDo9IFwKIAlib29rM3NfaHYubyBcCiAJYm9vazNzX2h2X2ludGVycnVwdHMubyBcCiAJYm9vazNzXzY0X21tdV9odi5vCiBrdm0tYm9vazNzXzY0LWJ1aWx0aW4tb2Jqcy0kKENPTkZJR19LVk1fQk9PSzNTXzY0X0hWKSA6PSBcCisJYm9vazNzX2h2X3JtaGFuZGxlcnMubyBcCiAJYm9vazNzX2h2X3JtX21tdS5vIFwKIAlib29rM3NfNjRfdmlvX2h2Lm8gXAogCWJvb2szc19odl9idWlsdGluLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jCmluZGV4IGY2OGEzNGQuLmE0NTk0NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vcmVnLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc18zMl9zci5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfMzJfc3IuUwppbmRleCAzNjA4NDcxLi43ZTA2YTZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc18zMl9zci5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzMyX3NyLlMKQEAgLTMxLDcgKzMxLDcgQEAKIAkgKiBSMSA9IGhvc3QgUjEKIAkgKiBSMiA9IGhvc3QgUjIKIAkgKiBSMyA9IHNoYWRvdyB2Y3B1Ci0JICogYWxsIG90aGVyIHZvbGF0aWxlIEdQUlMgPSBmcmVlCisJICogYWxsIG90aGVyIHZvbGF0aWxlIEdQUlMgPSBmcmVlIGV4Y2VwdCBSNCwgUjYKIAkgKiBTVkNQVVtDUl0gID0gZ3Vlc3QgQ1IKIAkgKiBTVkNQVVtYRVJdID0gZ3Vlc3QgWEVSCiAJICogU1ZDUFVbQ1RSXSA9IGd1ZXN0IENUUgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11LmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXUuYwppbmRleCBjNmQzZTE5Li5iODcxNzIxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXUuYwpAQCAtMTI4LDcgKzEyOCwxMyBAQAogCWRwcmludGsoIk1NVTogcGFnZT0weCV4IHNkcjE9MHglbGx4IHB0ZWc9MHglbGx4IHZzaWQ9MHglbGx4XG4iLAogCQlwYWdlLCB2Y3B1X2Jvb2szcy0+c2RyMSwgcHRlZywgc2xiZS0+dnNpZCk7CiAKLQlyID0gZ2ZuX3RvX2h2YSh2Y3B1X2Jvb2szcy0+dmNwdS5rdm0sIHB0ZWcgPj4gUEFHRV9TSElGVCk7CisJLyogV2hlbiBydW5uaW5nIGEgUEFQUiBndWVzdCwgU0RSMSBjb250YWlucyBhIEhWQSBhZGRyZXNzIGluc3RlYWQKKyAgICAgICAgICAgb2YgYSBHUEEgKi8KKwlpZiAodmNwdV9ib29rM3MtPnZjcHUuYXJjaC5wYXByX2VuYWJsZWQpCisJCXIgPSBwdGVnOworCWVsc2UKKwkJciA9IGdmbl90b19odmEodmNwdV9ib29rM3MtPnZjcHUua3ZtLCBwdGVnID4+IFBBR0VfU0hJRlQpOworCiAJaWYgKGt2bV9pc19lcnJvcl9odmEocikpCiAJCXJldHVybiByOwogCXJldHVybiByIHwgKHB0ZWcgJiB+UEFHRV9NQVNLKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X3NsYi5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfc2xiLlMKaW5kZXggMDRlN2QzYi4uZjJlNmU0OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfc2xiLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfc2xiLlMKQEAgLTUzLDcgKzUzLDcgQEAKIAkgKiBSMSA9IGhvc3QgUjEKIAkgKiBSMiA9IGhvc3QgUjIKIAkgKiBSMyA9IHNoYWRvdyB2Y3B1Ci0JICogYWxsIG90aGVyIHZvbGF0aWxlIEdQUlMgPSBmcmVlCisJICogYWxsIG90aGVyIHZvbGF0aWxlIEdQUlMgPSBmcmVlIGV4Y2VwdCBSNCwgUjYKIAkgKiBTVkNQVVtDUl0gID0gZ3Vlc3QgQ1IKIAkgKiBTVkNQVVtYRVJdID0gZ3Vlc3QgWEVSCiAJICogU1ZDUFVbQ1RSXSA9IGd1ZXN0IENUUgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfZW11bGF0ZS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfZW11bGF0ZS5jCmluZGV4IDQ2Njg0NjUuLjBjOWRjNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2VtdWxhdGUuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19lbXVsYXRlLmMKQEAgLTYzLDYgKzYzLDI1IEBACiAgKiBmdW5jdGlvbiBwb2ludGVycywgc28gbGV0J3MganVzdCBkaXNhYmxlIHRoZSBkZWZpbmUuICovCiAjdW5kZWYgbWZzcmluCiAKK2VudW0gcHJpdl9sZXZlbCB7CisJUFJJVl9QUk9CTEVNID0gMCwKKwlQUklWX1NVUEVSID0gMSwKKwlQUklWX0hZUEVSID0gMiwKK307CisKK3N0YXRpYyBib29sIHNwcl9hbGxvd2VkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZW51bSBwcml2X2xldmVsIGxldmVsKQoreworCS8qIFBBUFIgVk1zIG9ubHkgYWNjZXNzIHN1cGVydmlzb3IgU1BScyAqLworCWlmICh2Y3B1LT5hcmNoLnBhcHJfZW5hYmxlZCAmJiAobGV2ZWwgPiBQUklWX1NVUEVSKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogTGltaXQgdXNlciBzcGFjZSB0byBpdHMgb3duIHNtYWxsIFNQUiBzZXQgKi8KKwlpZiAoKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfUFIpICYmIGxldmVsID4gUFJJVl9QUk9CTEVNKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogaW50IGt2bXBwY19jb3JlX2VtdWxhdGVfb3Aoc3RydWN0IGt2bV9ydW4gKnJ1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluc3QsIGludCAqYWR2YW5jZSkKIHsKQEAgLTI5Niw2ICszMTUsOCBAQAogCiAJc3dpdGNoIChzcHJuKSB7CiAJY2FzZSBTUFJOX1NEUjE6CisJCWlmICghc3ByX2FsbG93ZWQodmNwdSwgUFJJVl9IWVBFUikpCisJCQlnb3RvIHVucHJpdmlsZWdlZDsKIAkJdG9fYm9vazNzKHZjcHUpLT5zZHIxID0gc3ByX3ZhbDsKIAkJYnJlYWs7CiAJY2FzZSBTUFJOX0RTSVNSOgpAQCAtMzkwLDYgKzQxMSw3IEBACiAJY2FzZSBTUFJOX1BNQzRfR0VLS086CiAJY2FzZSBTUFJOX1dQQVJfR0VLS086CiAJCWJyZWFrOwordW5wcml2aWxlZ2VkOgogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0lORk8gIktWTTogaW52YWxpZCBTUFIgd3JpdGU6ICVkXG4iLCBzcHJuKTsKICNpZm5kZWYgREVCVUdfU1BSCkBAIC00MjEsNiArNDQzLDggQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgU1BSTl9TRFIxOgorCQlpZiAoIXNwcl9hbGxvd2VkKHZjcHUsIFBSSVZfSFlQRVIpKQorCQkJZ290byB1bnByaXZpbGVnZWQ7CiAJCWt2bXBwY19zZXRfZ3ByKHZjcHUsIHJ0LCB0b19ib29rM3ModmNwdSktPnNkcjEpOwogCQlicmVhazsKIAljYXNlIFNQUk5fRFNJU1I6CkBAIC00NDksNiArNDczLDEwIEBACiAJY2FzZSBTUFJOX0hJRDU6CiAJCWt2bXBwY19zZXRfZ3ByKHZjcHUsIHJ0LCB0b19ib29rM3ModmNwdSktPmhpZFs1XSk7CiAJCWJyZWFrOworCWNhc2UgU1BSTl9DRkFSOgorCWNhc2UgU1BSTl9QVVJSOgorCQlrdm1wcGNfc2V0X2dwcih2Y3B1LCBydCwgMCk7CisJCWJyZWFrOwogCWNhc2UgU1BSTl9HUVIwOgogCWNhc2UgU1BSTl9HUVIxOgogCWNhc2UgU1BSTl9HUVIyOgpAQCAtNDc2LDYgKzUwNCw3IEBACiAJCWt2bXBwY19zZXRfZ3ByKHZjcHUsIHJ0LCAwKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKK3VucHJpdmlsZWdlZDoKIAkJcHJpbnRrKEtFUk5fSU5GTyAiS1ZNOiBpbnZhbGlkIFNQUiByZWFkOiAlZFxuIiwgc3Bybik7CiAjaWZuZGVmIERFQlVHX1NQUgogCQllbXVsYXRlZCA9IEVNVUxBVEVfRkFJTDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2V4cG9ydHMuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2V4cG9ydHMuYwppbmRleCA4OGM4ZjI2Li5hMTUwODE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19leHBvcnRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfZXhwb3J0cy5jCkBAIC0xNywxNSArMTcsMTMgQEAKICAqIEF1dGhvcnM6IEFsZXhhbmRlciBHcmFmIDxhZ3JhZkBzdXNlLmRlPgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgogCiAjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSFYKIEVYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19odl9lbnRyeV90cmFtcG9saW5lKTsKICNlbHNlCi1FWFBPUlRfU1lNQk9MX0dQTChrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2VudGVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19oYW5kbGVyX2xvd21lbV90cmFtcG9saW5lKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19ybWNhbGwpOworRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX2VudHJ5X3RyYW1wb2xpbmUpOwogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX2xvYWRfdXBfZnB1KTsKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX2xvYWRfdXBfYWx0aXZlYyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYwppbmRleCBjYzBkN2YxLi4wY2RiYzA3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYW5vbl9pbm9kZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CkBAIC02Miw2ICs2Myw4IEBACiAvKiAjZGVmaW5lIEVYSVRfREVCVUdfU0lNUExFICovCiAvKiAjZGVmaW5lIEVYSVRfREVCVUdfSU5UICovCiAKK3N0YXRpYyB2b2lkIGt2bXBwY19lbmRfY2VkZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCiB2b2lkIGt2bXBwY19jb3JlX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcHUpCiB7CiAJbG9jYWxfcGFjYS0+a3ZtX2hzdGF0ZS5rdm1fdmNwdSA9IHZjcHU7CkBAIC03Miw0MCArNzUsMTAgQEAKIHsKIH0KIAotc3RhdGljIHZvaWQga3ZtcHBjX3ZjcHVfYmxvY2tlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwotc3RhdGljIHZvaWQga3ZtcHBjX3ZjcHVfdW5ibG9ja2VkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci0KLXZvaWQga3ZtcHBjX3ZjcHVfYmxvY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXU2NCBub3c7Ci0JdW5zaWduZWQgbG9uZyBkZWNfbnNlYzsKLQotCW5vdyA9IGdldF90YigpOwotCWlmIChub3cgPj0gdmNwdS0+YXJjaC5kZWNfZXhwaXJlcyAmJiAha3ZtcHBjX2NvcmVfcGVuZGluZ19kZWModmNwdSkpCi0JCWt2bXBwY19jb3JlX3F1ZXVlX2RlYyh2Y3B1KTsKLQlpZiAodmNwdS0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpCi0JCXJldHVybjsKLQlpZiAodmNwdS0+YXJjaC5kZWNfZXhwaXJlcyAhPSB+KHU2NCkwKSB7Ci0JCWRlY19uc2VjID0gKHZjcHUtPmFyY2guZGVjX2V4cGlyZXMgLSBub3cpICogTlNFQ19QRVJfU0VDIC8KLQkJCXRiX3RpY2tzX3Blcl9zZWM7Ci0JCWhydGltZXJfc3RhcnQoJnZjcHUtPmFyY2guZGVjX3RpbWVyLCBrdGltZV9zZXQoMCwgZGVjX25zZWMpLAotCQkJICAgICAgSFJUSU1FUl9NT0RFX1JFTCk7Ci0JfQotCi0Ja3ZtcHBjX3ZjcHVfYmxvY2tlZCh2Y3B1KTsKLQotCWt2bV92Y3B1X2Jsb2NrKHZjcHUpOwotCXZjcHUtPnN0YXQuaGFsdF93YWtldXArKzsKLQotCWlmICh2Y3B1LT5hcmNoLmRlY19leHBpcmVzICE9IH4odTY0KTApCi0JCWhydGltZXJfdHJ5X3RvX2NhbmNlbCgmdmNwdS0+YXJjaC5kZWNfdGltZXIpOwotCi0Ja3ZtcHBjX3ZjcHVfdW5ibG9ja2VkKHZjcHUpOwotfQotCiB2b2lkIGt2bXBwY19zZXRfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG1zcikKIHsKIAl2Y3B1LT5hcmNoLnNocmVncy5tc3IgPSBtc3I7CisJa3ZtcHBjX2VuZF9jZWRlKHZjcHUpOwogfQogCiB2b2lkIGt2bXBwY19zZXRfcHZyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIHB2cikKQEAgLTI1NywxNSArMjMwLDYgQEAKIAogCXN3aXRjaCAocmVxKSB7CiAJY2FzZSBIX0NFREU6Ci0JCXZjcHUtPmFyY2guc2hyZWdzLm1zciB8PSBNU1JfRUU7Ci0JCXZjcHUtPmFyY2guY2VkZWQgPSAxOwotCQlzbXBfbWIoKTsKLQkJaWYgKCF2Y3B1LT5hcmNoLnByb2RkZWQpCi0JCQlrdm1wcGNfdmNwdV9ibG9jayh2Y3B1KTsKLQkJZWxzZQotCQkJdmNwdS0+YXJjaC5wcm9kZGVkID0gMDsKLQkJc21wX21iKCk7Ci0JCXZjcHUtPmFyY2guY2VkZWQgPSAwOwogCQlicmVhazsKIAljYXNlIEhfUFJPRDoKIAkJdGFyZ2V0ID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgNCk7CkBAIC0zODgsMjAgKzM1Miw2IEBACiAJCWJyZWFrOwogCX0KIAotCi0JaWYgKCEociAmIFJFU1VNRV9IT1NUKSkgewotCQkvKiBUbyBhdm9pZCBjbG9iYmVyaW5nIGV4aXRfcmVhc29uLCBvbmx5IGNoZWNrIGZvciBzaWduYWxzIGlmCi0JCSAqIHdlIGFyZW4ndCBhbHJlYWR5IGV4aXRpbmcgdG8gdXNlcnNwYWNlIGZvciBzb21lIG90aGVyCi0JCSAqIHJlYXNvbi4gKi8KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKHRzaykpIHsKLQkJCXZjcHUtPnN0YXQuc2lnbmFsX2V4aXRzKys7Ci0JCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKLQkJCXIgPSAtRUlOVFI7Ci0JCX0gZWxzZSB7Ci0JCQlrdm1wcGNfY29yZV9kZWxpdmVyX2ludGVycnVwdHModmNwdSk7Ci0JCX0KLQl9Ci0KIAlyZXR1cm4gcjsKIH0KIApAQCAtNDc5LDEzICs0MjksOSBAQAogCWt2bXBwY19tbXVfYm9vazNzX2h2X2luaXQodmNwdSk7CiAKIAkvKgotCSAqIFNvbWUgdmNwdXMgbWF5IHN0YXJ0IG91dCBpbiBzdG9wcGVkIHN0YXRlLiAgSWYgd2UgaW5pdGlhbGl6ZQotCSAqIHRoZW0gdG8gYnVzeS1pbi1ob3N0IHN0YXRlIHRoZXkgd2lsbCBzdG9wIG90aGVyIHZjcHVzIGluIHRoZQotCSAqIHZjb3JlIGZyb20gcnVubmluZy4gIEluc3RlYWQgd2UgaW5pdGlhbGl6ZSB0aGVtIHRvIGJsb2NrZWQKLQkgKiBzdGF0ZSwgZWZmZWN0aXZlbHkgY29uc2lkZXJpbmcgdGhlbSB0byBiZSBzdG9wcGVkIHVudGlsIHdlCi0JICogc2VlIHRoZSBmaXJzdCBydW4gaW9jdGwgZm9yIHRoZW0uCisJICogV2UgY29uc2lkZXIgdGhlIHZjcHUgc3RvcHBlZCB1bnRpbCB3ZSBzZWUgdGhlIGZpcnN0IHJ1biBpb2N0bCBmb3IgaXQuCiAJICovCi0JdmNwdS0+YXJjaC5zdGF0ZSA9IEtWTVBQQ19WQ1BVX0JMT0NLRUQ7CisJdmNwdS0+YXJjaC5zdGF0ZSA9IEtWTVBQQ19WQ1BVX1NUT1BQRUQ7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2Y3B1LT5hcmNoLmNwdV9ydW4pOwogCkBAIC00OTYsNiArNDQyLDcgQEAKIAkJaWYgKHZjb3JlKSB7CiAJCQlJTklUX0xJU1RfSEVBRCgmdmNvcmUtPnJ1bm5hYmxlX3RocmVhZHMpOwogCQkJc3Bpbl9sb2NrX2luaXQoJnZjb3JlLT5sb2NrKTsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZjb3JlLT53cSk7CiAJCX0KIAkJa3ZtLT5hcmNoLnZjb3Jlc1tjb3JlXSA9IHZjb3JlOwogCX0KQEAgLTUwNiwxMCArNDUzLDEyIEBACiAKIAlzcGluX2xvY2soJnZjb3JlLT5sb2NrKTsKIAkrK3Zjb3JlLT5udW1fdGhyZWFkczsKLQkrK3Zjb3JlLT5uX2Jsb2NrZWQ7CiAJc3Bpbl91bmxvY2soJnZjb3JlLT5sb2NrKTsKIAl2Y3B1LT5hcmNoLnZjb3JlID0gdmNvcmU7CiAKKwl2Y3B1LT5hcmNoLmNwdV90eXBlID0gS1ZNX0NQVV8zU182NDsKKwlrdm1wcGNfc2FuaXR5X2NoZWNrKHZjcHUpOworCiAJcmV0dXJuIHZjcHU7CiAKIGZyZWVfdmNwdToKQEAgLTUyNCwzMCArNDczLDMxIEBACiAJa2ZyZWUodmNwdSk7CiB9CiAKLXN0YXRpYyB2b2lkIGt2bXBwY192Y3B1X2Jsb2NrZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIHZvaWQga3ZtcHBjX3NldF90aW1lcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Jc3RydWN0IGt2bXBwY192Y29yZSAqdmMgPSB2Y3B1LT5hcmNoLnZjb3JlOworCXVuc2lnbmVkIGxvbmcgZGVjX25zZWMsIG5vdzsKIAotCXNwaW5fbG9jaygmdmMtPmxvY2spOwotCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9CTE9DS0VEOwotCSsrdmMtPm5fYmxvY2tlZDsKLQlpZiAodmMtPm5fcnVubmFibGUgPiAwICYmCi0JICAgIHZjLT5uX3J1bm5hYmxlICsgdmMtPm5fYmxvY2tlZCA9PSB2Yy0+bnVtX3RocmVhZHMpIHsKLQkJdmNwdSA9IGxpc3RfZmlyc3RfZW50cnkoJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBzdHJ1Y3Qga3ZtX3ZjcHUsCi0JCQkJCWFyY2gucnVuX2xpc3QpOwotCQl3YWtlX3VwKCZ2Y3B1LT5hcmNoLmNwdV9ydW4pOworCW5vdyA9IGdldF90YigpOworCWlmIChub3cgPiB2Y3B1LT5hcmNoLmRlY19leHBpcmVzKSB7CisJCS8qIGRlY3JlbWVudGVyIGhhcyBhbHJlYWR5IGdvbmUgbmVnYXRpdmUgKi8KKwkJa3ZtcHBjX2NvcmVfcXVldWVfZGVjKHZjcHUpOworCQlrdm1wcGNfY29yZV9kZWxpdmVyX2ludGVycnVwdHModmNwdSk7CisJCXJldHVybjsKIAl9Ci0Jc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKKwlkZWNfbnNlYyA9ICh2Y3B1LT5hcmNoLmRlY19leHBpcmVzIC0gbm93KSAqIE5TRUNfUEVSX1NFQworCQkgICAvIHRiX3RpY2tzX3Blcl9zZWM7CisJaHJ0aW1lcl9zdGFydCgmdmNwdS0+YXJjaC5kZWNfdGltZXIsIGt0aW1lX3NldCgwLCBkZWNfbnNlYyksCisJCSAgICAgIEhSVElNRVJfTU9ERV9SRUwpOworCXZjcHUtPmFyY2gudGltZXJfcnVubmluZyA9IDE7CiB9CiAKLXN0YXRpYyB2b2lkIGt2bXBwY192Y3B1X3VuYmxvY2tlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgdm9pZCBrdm1wcGNfZW5kX2NlZGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjID0gdmNwdS0+YXJjaC52Y29yZTsKLQotCXNwaW5fbG9jaygmdmMtPmxvY2spOwotCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9CVVNZX0lOX0hPU1Q7Ci0JLS12Yy0+bl9ibG9ja2VkOwotCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7CisJdmNwdS0+YXJjaC5jZWRlZCA9IDA7CisJaWYgKHZjcHUtPmFyY2gudGltZXJfcnVubmluZykgeworCQlocnRpbWVyX3RyeV90b19jYW5jZWwoJnZjcHUtPmFyY2guZGVjX3RpbWVyKTsKKwkJdmNwdS0+YXJjaC50aW1lcl9ydW5uaW5nID0gMDsKKwl9CiB9CiAKIGV4dGVybiBpbnQgX19rdm1wcGNfdmNvcmVfZW50cnkoc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CkBAIC01NjIsNiArNTEyLDcgQEAKIAkJcmV0dXJuOwogCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9CVVNZX0lOX0hPU1Q7CiAJLS12Yy0+bl9ydW5uYWJsZTsKKwkrK3ZjLT5uX2J1c3k7CiAJLyogZGVjcmVtZW50IHRoZSBwaHlzaWNhbCB0aHJlYWQgaWQgb2YgZWFjaCBmb2xsb3dpbmcgdmNwdSAqLwogCXYgPSB2Y3B1OwogCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUodiwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBhcmNoLnJ1bl9saXN0KQpAQCAtNTc1LDE1ICs1MjYsMjAgQEAKIAlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKnRwYWNhOwogCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjID0gdmNwdS0+YXJjaC52Y29yZTsKIAorCWlmICh2Y3B1LT5hcmNoLnRpbWVyX3J1bm5pbmcpIHsKKwkJaHJ0aW1lcl90cnlfdG9fY2FuY2VsKCZ2Y3B1LT5hcmNoLmRlY190aW1lcik7CisJCXZjcHUtPmFyY2gudGltZXJfcnVubmluZyA9IDA7CisJfQogCWNwdSA9IHZjLT5wY3B1ICsgdmNwdS0+YXJjaC5wdGlkOwogCXRwYWNhID0gJnBhY2FbY3B1XTsKIAl0cGFjYS0+a3ZtX2hzdGF0ZS5rdm1fdmNwdSA9IHZjcHU7CiAJdHBhY2EtPmt2bV9oc3RhdGUua3ZtX3Zjb3JlID0gdmM7CisJdHBhY2EtPmt2bV9oc3RhdGUubmFwcGluZyA9IDA7CisJdmNwdS0+Y3B1ID0gdmMtPnBjcHU7CiAJc21wX3dtYigpOwogI2lmZGVmIENPTkZJR19QUENfSUNQX05BVElWRQogCWlmICh2Y3B1LT5hcmNoLnB0aWQpIHsKIAkJdHBhY2EtPmNwdV9zdGFydCA9IDB4ODA7Ci0JCXRwYWNhLT5rdm1faHN0YXRlLmluX2d1ZXN0ID0gS1ZNX0dVRVNUX01PREVfR1VFU1Q7CiAJCXdtYigpOwogCQl4aWNzX3dha2VfY3B1KGNwdSk7CiAJCSsrdmMtPm5fd29rZW47CkBAIC02MzEsOSArNTg3LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQga3ZtcHBjX3J1bl9jb3JlKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjKQogewotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgKnZuZXh0OworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgKnZjcHUwLCAqdm5leHQ7CiAJbG9uZyByZXQ7CiAJdTY0IG5vdzsKKwlpbnQgcHRpZDsKIAogCS8qIGRvbid0IHN0YXJ0IGlmIGFueSB0aHJlYWRzIGhhdmUgYSBzaWduYWwgcGVuZGluZyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkodmNwdSwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBhcmNoLnJ1bl9saXN0KQpAQCAtNjUyLDI5ICs2MDksNTAgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJLyoKKwkgKiBBc3NpZ24gcGh5c2ljYWwgdGhyZWFkIElEcywgZmlyc3QgdG8gbm9uLWNlZGVkIHZjcHVzCisJICogYW5kIHRoZW4gdG8gY2VkZWQgb25lcy4KKwkgKi8KKwlwdGlkID0gMDsKKwl2Y3B1MCA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2Y3B1LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsIGFyY2gucnVuX2xpc3QpIHsKKwkJaWYgKCF2Y3B1LT5hcmNoLmNlZGVkKSB7CisJCQlpZiAoIXB0aWQpCisJCQkJdmNwdTAgPSB2Y3B1OworCQkJdmNwdS0+YXJjaC5wdGlkID0gcHRpZCsrOworCQl9CisJfQorCWlmICghdmNwdTApCisJCXJldHVybiAwOwkJLyogbm90aGluZyB0byBydW4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZjcHUsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywgYXJjaC5ydW5fbGlzdCkKKwkJaWYgKHZjcHUtPmFyY2guY2VkZWQpCisJCQl2Y3B1LT5hcmNoLnB0aWQgPSBwdGlkKys7CisKIAl2Yy0+bl93b2tlbiA9IDA7CiAJdmMtPm5hcF9jb3VudCA9IDA7CiAJdmMtPmVudHJ5X2V4aXRfY291bnQgPSAwOwotCXZjLT52Y29yZV9ydW5uaW5nID0gMTsKKwl2Yy0+dmNvcmVfc3RhdGUgPSBWQ09SRV9SVU5OSU5HOwogCXZjLT5pbl9ndWVzdCA9IDA7CiAJdmMtPnBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdmMtPm5hcHBpbmdfdGhyZWFkcyA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh2Y3B1LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsIGFyY2gucnVuX2xpc3QpCiAJCWt2bXBwY19zdGFydF90aHJlYWQodmNwdSk7Ci0JdmNwdSA9IGxpc3RfZmlyc3RfZW50cnkoJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBzdHJ1Y3Qga3ZtX3ZjcHUsCi0JCQkJYXJjaC5ydW5fbGlzdCk7Ci0KLQlzcGluX3VubG9jaygmdmMtPmxvY2spOwogCiAJcHJlZW1wdF9kaXNhYmxlKCk7Ci0Ja3ZtX2d1ZXN0X2VudGVyKCk7Ci0JX19rdm1wcGNfdmNvcmVfZW50cnkoTlVMTCwgdmNwdSk7CisJc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKIAotCS8qIHdhaXQgZm9yIHNlY29uZGFyeSB0aHJlYWRzIHRvIGZpbmlzaCB3cml0aW5nIHRoZWlyIHN0YXRlIHRvIG1lbW9yeSAqLworCWt2bV9ndWVzdF9lbnRlcigpOworCV9fa3ZtcHBjX3Zjb3JlX2VudHJ5KE5VTEwsIHZjcHUwKTsKKwogCXNwaW5fbG9jaygmdmMtPmxvY2spOworCS8qIGRpc2FibGUgc2VuZGluZyBvZiBJUElzIG9uIHZpcnR1YWwgZXh0ZXJuYWwgaXJxcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodmNwdSwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBhcmNoLnJ1bl9saXN0KQorCQl2Y3B1LT5jcHUgPSAtMTsKKwkvKiB3YWl0IGZvciBzZWNvbmRhcnkgdGhyZWFkcyB0byBmaW5pc2ggd3JpdGluZyB0aGVpciBzdGF0ZSB0byBtZW1vcnkgKi8KIAlpZiAodmMtPm5hcF9jb3VudCA8IHZjLT5uX3dva2VuKQogCQlrdm1wcGNfd2FpdF9mb3JfbmFwKHZjKTsKIAkvKiBwcmV2ZW50IG90aGVyIHZjcHUgdGhyZWFkcyBmcm9tIGRvaW5nIGt2bXBwY19zdGFydF90aHJlYWQoKSBub3cgKi8KLQl2Yy0+dmNvcmVfcnVubmluZyA9IDI7CisJdmMtPnZjb3JlX3N0YXRlID0gVkNPUkVfRVhJVElORzsKIAlzcGluX3VubG9jaygmdmMtPmxvY2spOwogCiAJLyogbWFrZSBzdXJlIHVwZGF0ZXMgdG8gc2Vjb25kYXJ5IHZjcHUgc3RydWN0cyBhcmUgdmlzaWJsZSBub3cgKi8KQEAgLTY5MCwyMiArNjY4LDI2IEBACiAJCWlmIChub3cgPCB2Y3B1LT5hcmNoLmRlY19leHBpcmVzICYmCiAJCSAgICBrdm1wcGNfY29yZV9wZW5kaW5nX2RlYyh2Y3B1KSkKIAkJCWt2bXBwY19jb3JlX2RlcXVldWVfZGVjKHZjcHUpOwotCQlpZiAoIXZjcHUtPmFyY2gudHJhcCkgewotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKHZjcHUtPmFyY2gucnVuX3Rhc2spKSB7Ci0JCQkJdmNwdS0+YXJjaC5rdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7Ci0JCQkJdmNwdS0+YXJjaC5yZXQgPSAtRUlOVFI7Ci0JCQl9Ci0JCQljb250aW51ZTsJCS8qIGRpZG4ndCBnZXQgdG8gcnVuICovCi0JCX0KLQkJcmV0ID0ga3ZtcHBjX2hhbmRsZV9leGl0KHZjcHUtPmFyY2gua3ZtX3J1biwgdmNwdSwKLQkJCQkJIHZjcHUtPmFyY2gucnVuX3Rhc2spOworCisJCXJldCA9IFJFU1VNRV9HVUVTVDsKKwkJaWYgKHZjcHUtPmFyY2gudHJhcCkKKwkJCXJldCA9IGt2bXBwY19oYW5kbGVfZXhpdCh2Y3B1LT5hcmNoLmt2bV9ydW4sIHZjcHUsCisJCQkJCQkgdmNwdS0+YXJjaC5ydW5fdGFzayk7CisKIAkJdmNwdS0+YXJjaC5yZXQgPSByZXQ7CiAJCXZjcHUtPmFyY2gudHJhcCA9IDA7CisKKwkJaWYgKHZjcHUtPmFyY2guY2VkZWQpIHsKKwkJCWlmIChyZXQgIT0gUkVTVU1FX0dVRVNUKQorCQkJCWt2bXBwY19lbmRfY2VkZSh2Y3B1KTsKKwkJCWVsc2UKKwkJCQlrdm1wcGNfc2V0X3RpbWVyKHZjcHUpOworCQl9CiAJfQogCiAJc3Bpbl9sb2NrKCZ2Yy0+bG9jayk7CiAgb3V0OgotCXZjLT52Y29yZV9ydW5uaW5nID0gMDsKKwl2Yy0+dmNvcmVfc3RhdGUgPSBWQ09SRV9JTkFDVElWRTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmNwdSwgdm5leHQsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywKIAkJCQkgYXJjaC5ydW5fbGlzdCkgewogCQlpZiAodmNwdS0+YXJjaC5yZXQgIT0gUkVTVU1FX0dVRVNUKSB7CkBAIC03MTcsMTYgKzY5OSwxNDUgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBrdm1wcGNfcnVuX3ZjcHUoc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKKy8qCisgKiBXYWl0IGZvciBzb21lIG90aGVyIHZjcHUgdGhyZWFkIHRvIGV4ZWN1dGUgdXMsIGFuZAorICogd2FrZSB1cyB1cCB3aGVuIHdlIG5lZWQgdG8gaGFuZGxlIHNvbWV0aGluZyBpbiB0aGUgaG9zdC4KKyAqLworc3RhdGljIHZvaWQga3ZtcHBjX3dhaXRfZm9yX2V4ZWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgd2FpdF9zdGF0ZSkKIHsKLQlpbnQgcHRpZDsKLQlpbnQgd2FpdF9zdGF0ZTsKLQlzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2YzsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAotCS8qIE5vIG5lZWQgdG8gZ28gaW50byB0aGUgZ3Vlc3Qgd2hlbiBhbGwgd2UgZG8gaXMgZ29pbmcgb3V0ICovCisJcHJlcGFyZV90b193YWl0KCZ2Y3B1LT5hcmNoLmNwdV9ydW4sICZ3YWl0LCB3YWl0X3N0YXRlKTsKKwlpZiAodmNwdS0+YXJjaC5zdGF0ZSA9PSBLVk1QUENfVkNQVV9SVU5OQUJMRSkKKwkJc2NoZWR1bGUoKTsKKwlmaW5pc2hfd2FpdCgmdmNwdS0+YXJjaC5jcHVfcnVuLCAmd2FpdCk7Cit9CisKKy8qCisgKiBBbGwgdGhlIHZjcHVzIGluIHRoaXMgdmNvcmUgYXJlIGlkbGUsIHNvIHdhaXQgZm9yIGEgZGVjcmVtZW50ZXIKKyAqIG9yIGV4dGVybmFsIGludGVycnVwdCB0byBvbmUgb2YgdGhlIHZjcHVzLiAgdmMtPmxvY2sgaXMgaGVsZC4KKyAqLworc3RhdGljIHZvaWQga3ZtcHBjX3Zjb3JlX2Jsb2NrZWQoc3RydWN0IGt2bXBwY192Y29yZSAqdmMpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJc3RydWN0IGt2bV92Y3B1ICp2OworCWludCBhbGxfaWRsZSA9IDE7CisKKwlwcmVwYXJlX3RvX3dhaXQoJnZjLT53cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJdmMtPnZjb3JlX3N0YXRlID0gVkNPUkVfU0xFRVBJTkc7CisJc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHYsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywgYXJjaC5ydW5fbGlzdCkgeworCQlpZiAoIXYtPmFyY2guY2VkZWQgfHwgdi0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpIHsKKwkJCWFsbF9pZGxlID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChhbGxfaWRsZSkKKwkJc2NoZWR1bGUoKTsKKwlmaW5pc2hfd2FpdCgmdmMtPndxLCAmd2FpdCk7CisJc3Bpbl9sb2NrKCZ2Yy0+bG9jayk7CisJdmMtPnZjb3JlX3N0YXRlID0gVkNPUkVfSU5BQ1RJVkU7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX3J1bl92Y3B1KHN0cnVjdCBrdm1fcnVuICprdm1fcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaW50IG5fY2VkZWQ7CisJaW50IHByZXZfc3RhdGU7CisJc3RydWN0IGt2bXBwY192Y29yZSAqdmM7CisJc3RydWN0IGt2bV92Y3B1ICp2LCAqdm47CisKKwlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IDA7CisJdmNwdS0+YXJjaC5yZXQgPSBSRVNVTUVfR1VFU1Q7CisJdmNwdS0+YXJjaC50cmFwID0gMDsKKworCS8qCisJICogU3luY2hyb25pemUgd2l0aCBvdGhlciB0aHJlYWRzIGluIHRoaXMgdmlydHVhbCBjb3JlCisJICovCisJdmMgPSB2Y3B1LT5hcmNoLnZjb3JlOworCXNwaW5fbG9jaygmdmMtPmxvY2spOworCXZjcHUtPmFyY2guY2VkZWQgPSAwOworCXZjcHUtPmFyY2gucnVuX3Rhc2sgPSBjdXJyZW50OworCXZjcHUtPmFyY2gua3ZtX3J1biA9IGt2bV9ydW47CisJcHJldl9zdGF0ZSA9IHZjcHUtPmFyY2guc3RhdGU7CisJdmNwdS0+YXJjaC5zdGF0ZSA9IEtWTVBQQ19WQ1BVX1JVTk5BQkxFOworCWxpc3RfYWRkX3RhaWwoJnZjcHUtPmFyY2gucnVuX2xpc3QsICZ2Yy0+cnVubmFibGVfdGhyZWFkcyk7CisJKyt2Yy0+bl9ydW5uYWJsZTsKKworCS8qCisJICogVGhpcyBoYXBwZW5zIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkIGZvciBhIHZjcHUuCisJICogSWYgdGhlIHZjb3JlIGlzIGFscmVhZHkgcnVubmluZywgd2UgbWF5IGJlIGFibGUgdG8gc3RhcnQKKwkgKiB0aGlzIHRocmVhZCBzdHJhaWdodCBhd2F5IGFuZCBoYXZlIGl0IGpvaW4gaW4uCisJICovCisJaWYgKHByZXZfc3RhdGUgPT0gS1ZNUFBDX1ZDUFVfU1RPUFBFRCkgeworCQlpZiAodmMtPnZjb3JlX3N0YXRlID09IFZDT1JFX1JVTk5JTkcgJiYKKwkJICAgIFZDT1JFX0VYSVRfQ09VTlQodmMpID09IDApIHsKKwkJCXZjcHUtPmFyY2gucHRpZCA9IHZjLT5uX3J1bm5hYmxlIC0gMTsKKwkJCWt2bXBwY19zdGFydF90aHJlYWQodmNwdSk7CisJCX0KKworCX0gZWxzZSBpZiAocHJldl9zdGF0ZSA9PSBLVk1QUENfVkNQVV9CVVNZX0lOX0hPU1QpCisJCS0tdmMtPm5fYnVzeTsKKworCXdoaWxlICh2Y3B1LT5hcmNoLnN0YXRlID09IEtWTVBQQ19WQ1BVX1JVTk5BQkxFICYmCisJICAgICAgICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlpZiAodmMtPm5fYnVzeSB8fCB2Yy0+dmNvcmVfc3RhdGUgIT0gVkNPUkVfSU5BQ1RJVkUpIHsKKwkJCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7CisJCQlrdm1wcGNfd2FpdF9mb3JfZXhlYyh2Y3B1LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl9sb2NrKCZ2Yy0+bG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQluX2NlZGVkID0gMDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsIGFyY2gucnVuX2xpc3QpCisJCQluX2NlZGVkICs9IHYtPmFyY2guY2VkZWQ7CisJCWlmIChuX2NlZGVkID09IHZjLT5uX3J1bm5hYmxlKQorCQkJa3ZtcHBjX3Zjb3JlX2Jsb2NrZWQodmMpOworCQllbHNlCisJCQlrdm1wcGNfcnVuX2NvcmUodmMpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2LCB2biwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLAorCQkJCQkgYXJjaC5ydW5fbGlzdCkgeworCQkJa3ZtcHBjX2NvcmVfZGVsaXZlcl9pbnRlcnJ1cHRzKHYpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKHYtPmFyY2gucnVuX3Rhc2spKSB7CisJCQkJa3ZtcHBjX3JlbW92ZV9ydW5uYWJsZSh2Yywgdik7CisJCQkJdi0+c3RhdC5zaWduYWxfZXhpdHMrKzsKKwkJCQl2LT5hcmNoLmt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKKwkJCQl2LT5hcmNoLnJldCA9IC1FSU5UUjsKKwkJCQl3YWtlX3VwKCZ2LT5hcmNoLmNwdV9ydW4pOworCQkJfQorCQl9CisJfQorCiAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKKwkJaWYgKHZjLT52Y29yZV9zdGF0ZSA9PSBWQ09SRV9SVU5OSU5HIHx8CisJCSAgICB2Yy0+dmNvcmVfc3RhdGUgPT0gVkNPUkVfRVhJVElORykgeworCQkJc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKKwkJCWt2bXBwY193YWl0X2Zvcl9leGVjKHZjcHUsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fbG9jaygmdmMtPmxvY2spOworCQl9CisJCWlmICh2Y3B1LT5hcmNoLnN0YXRlID09IEtWTVBQQ19WQ1BVX1JVTk5BQkxFKSB7CisJCQlrdm1wcGNfcmVtb3ZlX3J1bm5hYmxlKHZjLCB2Y3B1KTsKKwkJCXZjcHUtPnN0YXQuc2lnbmFsX2V4aXRzKys7CisJCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CisJCQl2Y3B1LT5hcmNoLnJldCA9IC1FSU5UUjsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7CisJcmV0dXJuIHZjcHUtPmFyY2gucmV0OworfQorCitpbnQga3ZtcHBjX3ZjcHVfcnVuKHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgcjsKKworCWlmICghdmNwdS0+YXJjaC5zYW5lKSB7CisJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTm8gbmVlZCB0byBnbyBpbnRvIHRoZSBndWVzdCB3aGVuIGFsbCB3ZSdsbCBkbyBpcyBjb21lIGJhY2sgb3V0ICovCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwogCQlyZXR1cm4gLUVJTlRSOwogCX0KIApAQCAtNzM0LDcxICs4NDUsMTAgQEAKIAlpZiAoIXZjcHUtPmt2bS0+YXJjaC5ybWEgJiYgY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDEpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Ja3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSAwOwotCXZjcHUtPmFyY2gucmV0ID0gUkVTVU1FX0dVRVNUOwotCXZjcHUtPmFyY2gudHJhcCA9IDA7Ci0KIAlmbHVzaF9mcF90b190aHJlYWQoY3VycmVudCk7CiAJZmx1c2hfYWx0aXZlY190b190aHJlYWQoY3VycmVudCk7CiAJZmx1c2hfdnN4X3RvX3RocmVhZChjdXJyZW50KTsKLQotCS8qCi0JICogU3luY2hyb25pemUgd2l0aCBvdGhlciB0aHJlYWRzIGluIHRoaXMgdmlydHVhbCBjb3JlCi0JICovCi0JdmMgPSB2Y3B1LT5hcmNoLnZjb3JlOwotCXNwaW5fbG9jaygmdmMtPmxvY2spOwotCS8qIFRoaXMgaGFwcGVucyB0aGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCBmb3IgYSB2Y3B1ICovCi0JaWYgKHZjcHUtPmFyY2guc3RhdGUgPT0gS1ZNUFBDX1ZDUFVfQkxPQ0tFRCkKLQkJLS12Yy0+bl9ibG9ja2VkOwotCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9SVU5OQUJMRTsKLQlwdGlkID0gdmMtPm5fcnVubmFibGU7Ci0JdmNwdS0+YXJjaC5ydW5fdGFzayA9IGN1cnJlbnQ7Ci0JdmNwdS0+YXJjaC5rdm1fcnVuID0ga3ZtX3J1bjsKLQl2Y3B1LT5hcmNoLnB0aWQgPSBwdGlkOwotCWxpc3RfYWRkX3RhaWwoJnZjcHUtPmFyY2gucnVuX2xpc3QsICZ2Yy0+cnVubmFibGVfdGhyZWFkcyk7Ci0JKyt2Yy0+bl9ydW5uYWJsZTsKLQotCXdhaXRfc3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jd2hpbGUgKHZjcHUtPmFyY2guc3RhdGUgPT0gS1ZNUFBDX1ZDUFVfUlVOTkFCTEUpIHsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlpZiAoIXZjLT52Y29yZV9ydW5uaW5nKSB7Ci0JCQkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwotCQkJCXZjcHUtPmFyY2gucmV0ID0gLUVJTlRSOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogaGF2ZSB0byB3YWl0IGZvciB2Y29yZSB0byBzdG9wIGV4ZWN1dGluZyBndWVzdCAqLwotCQkJd2FpdF9zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwotCQkJc21wX3NlbmRfcmVzY2hlZHVsZSh2Yy0+cGNwdSk7Ci0JCX0KLQotCQlpZiAoIXZjLT52Y29yZV9ydW5uaW5nICYmCi0JCSAgICB2Yy0+bl9ydW5uYWJsZSArIHZjLT5uX2Jsb2NrZWQgPT0gdmMtPm51bV90aHJlYWRzKSB7Ci0JCQkvKiB3ZSBjYW4gcnVuIG5vdyAqLwotCQkJaWYgKGt2bXBwY19ydW5fY29yZSh2YykpCi0JCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAodmMtPnZjb3JlX3J1bm5pbmcgPT0gMSAmJiBWQ09SRV9FWElUX0NPVU5UKHZjKSA9PSAwKQotCQkJa3ZtcHBjX3N0YXJ0X3RocmVhZCh2Y3B1KTsKLQotCQkvKiB3YWl0IGZvciBvdGhlciB0aHJlYWRzIHRvIGNvbWUgaW4sIG9yIHdhaXQgZm9yIHZjb3JlICovCi0JCXByZXBhcmVfdG9fd2FpdCgmdmNwdS0+YXJjaC5jcHVfcnVuLCAmd2FpdCwgd2FpdF9zdGF0ZSk7Ci0JCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7Ci0JCXNjaGVkdWxlKCk7Ci0JCWZpbmlzaF93YWl0KCZ2Y3B1LT5hcmNoLmNwdV9ydW4sICZ3YWl0KTsKLQkJc3Bpbl9sb2NrKCZ2Yy0+bG9jayk7Ci0JfQotCi0JaWYgKHZjcHUtPmFyY2guc3RhdGUgPT0gS1ZNUFBDX1ZDUFVfUlVOTkFCTEUpCi0JCWt2bXBwY19yZW1vdmVfcnVubmFibGUodmMsIHZjcHUpOwotCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7Ci0KLQlyZXR1cm4gdmNwdS0+YXJjaC5yZXQ7Ci19Ci0KLWludCBrdm1wcGNfdmNwdV9ydW4oc3RydWN0IGt2bV9ydW4gKnJ1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCWludCByOworCXZjcHUtPmFyY2gud3FwID0gJnZjcHUtPmFyY2gudmNvcmUtPndxOwogCiAJZG8gewogCQlyID0ga3ZtcHBjX3J1bl92Y3B1KHJ1biwgdmNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9idWlsdGluLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9idWlsdGluLmMKaW5kZXggZDQzMTIwMy4uMjg2ZjEzZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfYnVpbHRpbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X2J1aWx0aW4uYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybV9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtX21tdS5jCmluZGV4IGZjZmU2YjAuLmJhY2IwY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtX21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtX21tdS5jCkBAIC0xMTAsMzkgKzExMCw2IEBACiAJcmV0dXJuIEhfU1VDQ0VTUzsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY29tcHV0ZV90bGJpZV9yYih1bnNpZ25lZCBsb25nIHYsIHVuc2lnbmVkIGxvbmcgciwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHB0ZV9pbmRleCkKLXsKLQl1bnNpZ25lZCBsb25nIHJiLCB2YV9sb3c7Ci0KLQlyYiA9ICh2ICYgfjB4N2ZVTCkgPDwgMTY7CQkvKiBBVkEgZmllbGQgKi8KLQl2YV9sb3cgPSBwdGVfaW5kZXggPj4gMzsKLQlpZiAodiAmIEhQVEVfVl9TRUNPTkRBUlkpCi0JCXZhX2xvdyA9IH52YV9sb3c7Ci0JLyogeG9yIHZzaWQgZnJvbSBBVkEgKi8KLQlpZiAoISh2ICYgSFBURV9WXzFUQl9TRUcpKQotCQl2YV9sb3cgXj0gdiA+PiAxMjsKLQllbHNlCi0JCXZhX2xvdyBePSB2ID4+IDI0OwotCXZhX2xvdyAmPSAweDdmZjsKLQlpZiAodiAmIEhQVEVfVl9MQVJHRSkgewotCQlyYiB8PSAxOwkJCS8qIEwgZmllbGQgKi8KLQkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjA2KSAmJgotCQkgICAgKHIgJiAweGZmMDAwKSkgewotCQkJLyogbm9uLTE2TUIgbGFyZ2UgcGFnZSwgbXVzdCBiZSA2NGsgKi8KLQkJCS8qIChtYXNrcyBkZXBlbmQgb24gcGFnZSBzaXplKSAqLwotCQkJcmIgfD0gMHgxMDAwOwkJLyogcGFnZSBlbmNvZGluZyBpbiBMUCBmaWVsZCAqLwotCQkJcmIgfD0gKHZhX2xvdyAmIDB4N2YpIDw8IDE2OyAvKiA3YiBvZiBWQSBpbiBBVkEvTFAgZmllbGQgKi8KLQkJCXJiIHw9ICh2YV9sb3cgJiAweGZlKTsJLyogQVZBTCBmaWVsZCAoUDcgZG9lc24ndCBzZWVtIHRvIGNhcmUpICovCi0JCX0KLQl9IGVsc2UgewotCQkvKiA0a0IgcGFnZSAqLwotCQlyYiB8PSAodmFfbG93ICYgMHg3ZmYpIDw8IDEyOwkvKiByZW1haW5pbmcgMTFiIG9mIFZBICovCi0JfQotCXJiIHw9ICh2ID4+IDU0KSAmIDB4MzAwOwkJLyogQiBmaWVsZCAqLwotCXJldHVybiByYjsKLX0KLQogI2RlZmluZSBMT0NLX1RPS0VOCSgqKHUzMiAqKSgmZ2V0X3BhY2EoKS0+bG9ja190b2tlbikpCiAKIHN0YXRpYyBpbmxpbmUgaW50IHRyeV9sb2NrX3RsYmllKHVuc2lnbmVkIGludCAqbG9jaykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUwppbmRleCBkZTI5NTAxLi40NGQ4ODI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCkBAIC0yMCw3ICsyMCwxMCBAQAogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9hc20uaD4KICNpbmNsdWRlIDxhc20vcmVnLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vZXhjZXB0aW9uLTY0cy5oPgogCkBAIC00OSw3ICs1Miw3IEBACiAJYgkuCiAKIC8qCi0gKiBDYWxsIGt2bXBwY19oYW5kbGVyX3RyYW1wb2xpbmVfZW50ZXIgaW4gcmVhbCBtb2RlLgorICogQ2FsbCBrdm1wcGNfaHZfZW50cnkgaW4gcmVhbCBtb2RlLgogICogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGhhcmQtZGlzYWJsZWQuCiAgKgogICogSW5wdXQgUmVnaXN0ZXJzOgpAQCAtODksNiArOTIsMTIgQEAKIGt2bV9zdGFydF9ndWVzdDoKIAlsZAlyMSxQQUNBRU1FUkdTUChyMTMpCiAJc3ViaQlyMSxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWxkCXIyLFBBQ0FUT0MocjEzKQorCisJLyogd2VyZSB3ZSBuYXBwaW5nIGR1ZSB0byBjZWRlPyAqLworCWxieglyMCxIU1RBVEVfTkFQUElORyhyMTMpCisJY21wd2kJcjAsMAorCWJuZQlrdm1fZW5kX2NlZGUKIAogCS8qIGdldCB2Y3B1IHBvaW50ZXIgKi8KIAlsZAlyNCwgSFNUQVRFX0tWTV9WQ1BVKHIxMykKQEAgLTI3NiwxNSArMjg1LDkgQEAKIAljbXB3aQlyMCwwCiAJYmVxCTIwYgogCi0JLyogU2V0IExQQ1IuICBTZXQgdGhlIE1FUiBiaXQgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIGV4dGVybmFsIGlycS4gKi8KKwkvKiBTZXQgTFBDUiBhbmQgUk1PUi4gKi8KIDEwOglsZAlyOCxLVk1fTFBDUihyOSkKLQlsZAlyMCxWQ1BVX1BFTkRJTkdfRVhDKHI0KQotCWxpCXI3LCgxIDw8IEJPT0szU19JUlFQUklPX0VYVEVSTkFMKQotCW9yaXMJcjcscjcsKDEgPDwgQk9PSzNTX0lSUVBSSU9fRVhURVJOQUxfTEVWRUwpQGgKLQlhbmQuCXIwLHIwLHI3Ci0JYmVxCTExZgotCW9yaQlyOCxyOCxMUENSX01FUgotMTE6CW10c3ByCVNQUk5fTFBDUixyOAorCW10c3ByCVNQUk5fTFBDUixyOAogCWxkCXI4LEtWTV9STU9SKHI5KQogCW10c3ByCVNQUk5fUk1PUixyOAogCWlzeW5jCkBAIC00NDgsMTkgKzQ1MSw1MCBAQAogCW10Y3RyCXI2CiAJbXR4ZXIJcjcKIAotCS8qIE1vdmUgU1JSMCBhbmQgU1JSMSBpbnRvIHRoZSByZXNwZWN0aXZlIHJlZ3MgKi8KK2t2bXBwY19jZWRlX3JlZW50cnk6CQkvKiByNCA9IHZjcHUsIHIxMyA9IHBhY2EgKi8KIAlsZAlyNiwgVkNQVV9TUlIwKHI0KQogCWxkCXI3LCBWQ1BVX1NSUjEocjQpCi0JbXRzcHIJU1BSTl9TUlIwLCByNgotCW10c3ByCVNQUk5fU1JSMSwgcjcKLQogCWxkCXIxMCwgVkNQVV9QQyhyNCkKKwlsZAlyMTEsIFZDUFVfTVNSKHI0KQkvKiByMTEgPSB2Y3B1LT5hcmNoLm1zciAmIH5NU1JfSFYgKi8KIAotCWxkCXIxMSwgVkNQVV9NU1IocjQpCS8qIHIxMCA9IHZjcHUtPmFyY2gubXNyICYgfk1TUl9IViAqLwogCXJsZGljbAlyMTEsIHIxMSwgNjMgLSBNU1JfSFZfTEcsIDEKIAlyb3RsZGkJcjExLCByMTEsIDEgKyBNU1JfSFZfTEcKIAlvcmkJcjExLCByMTEsIE1TUl9NRQogCisJLyogQ2hlY2sgaWYgd2UgY2FuIGRlbGl2ZXIgYW4gZXh0ZXJuYWwgb3IgZGVjcmVtZW50ZXIgaW50ZXJydXB0IG5vdyAqLworCWxkCXIwLFZDUFVfUEVORElOR19FWEMocjQpCisJbGkJcjgsKDEgPDwgQk9PSzNTX0lSUVBSSU9fRVhURVJOQUwpCisJb3JpcwlyOCxyOCwoMSA8PCBCT09LM1NfSVJRUFJJT19FWFRFUk5BTF9MRVZFTClAaAorCWFuZAlyMCxyMCxyOAorCWNtcGRpCWNyMSxyMCwwCisJYW5kaS4JcjAscjExLE1TUl9FRQorCWJlcQljcjEsMTFmCitCRUdJTl9GVFJfU0VDVElPTgorCW1mc3ByCXI4LFNQUk5fTFBDUgorCW9yaQlyOCxyOCxMUENSX01FUgorCW10c3ByCVNQUk5fTFBDUixyOAorCWlzeW5jCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKKwliZXEJNWYKKwlsaQlyMCxCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCisxMjoJbXIJcjYscjEwCisJbXIJcjEwLHIwCisJbXIJcjcscjExCisJbGkJcjExLChNU1JfTUUgPDwgMSkgfCAxCS8qIHN5bnRoZXNpemUgTVNSX1NGIHwgTVNSX01FICovCisJcm90bGRpCXIxMSxyMTEsNjMKKwliCTVmCisxMToJYmVxCTVmCisJbWZzcHIJcjAsU1BSTl9ERUMKKwljbXB3aQlyMCwwCisJbGkJcjAsQk9PSzNTX0lOVEVSUlVQVF9ERUNSRU1FTlRFUgorCWJsdAkxMmIKKworCS8qIE1vdmUgU1JSMCBhbmQgU1JSMSBpbnRvIHRoZSByZXNwZWN0aXZlIHJlZ3MgKi8KKzU6CW10c3ByCVNQUk5fU1JSMCwgcjYKKwltdHNwcglTUFJOX1NSUjEsIHI3CisJbGkJcjAsMAorCXN0YglyMCxWQ1BVX0NFREVEKHI0KQkvKiBjYW5jZWwgY2VkZSAqLworCiBmYXN0X2d1ZXN0X3JldHVybjoKIAltdHNwcglTUFJOX0hTUlIwLHIxMAogCW10c3ByCVNQUk5fSFNSUjEscjExCkBAIC01NzQsMjEgKzYwOCwyMCBAQAogCS8qIFNlZSBpZiB0aGlzIGlzIHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlIGluIHJlYWwgbW9kZSAqLwogCWNtcHdpCXIxMixCT09LM1NfSU5URVJSVVBUX1NZU0NBTEwKIAliZXEJaGNhbGxfdHJ5X3JlYWxfbW9kZQotaGNhbGxfcmVhbF9jb250OgogCiAJLyogQ2hlY2sgZm9yIG1lZGlhdGVkIGludGVycnVwdHMgKGNvdWxkIGJlIGRvbmUgZWFybGllciByZWFsbHkgLi4uKSAqLwogQkVHSU5fRlRSX1NFQ1RJT04KIAljbXB3aQlyMTIsQk9PSzNTX0lOVEVSUlVQVF9FWFRFUk5BTAogCWJuZSsJMWYKLQlsZAlyNSxWQ1BVX0tWTShyOSkKLQlsZAlyNSxLVk1fTFBDUihyNSkKIAlhbmRpLglyMCxyMTEsTVNSX0VFCiAJYmVxCTFmCisJbWZzcHIJcjUsU1BSTl9MUENSCiAJYW5kaS4JcjAscjUsTFBDUl9NRVIKIAlibmUJYm91bmNlX2V4dF9pbnRlcnJ1cHQKIDE6CiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwNikKIAoraGNhbGxfcmVhbF9jb250OgkJLyogcjkgPSB2Y3B1LCByMTIgPSB0cmFwLCByMTMgPSBwYWNhICovCiAJLyogU2F2ZSBERUMgKi8KIAltZnNwcglyNSxTUFJOX0RFQwogCW1mdGIJcjYKQEAgLTY4Miw3ICs3MTUsNyBAQAogCXNsYmlhCiAJcHRlc3luYwogCi1oZGVjX3Nvb246CitoZGVjX3Nvb246CQkJLyogcjkgPSB2Y3B1LCByMTIgPSB0cmFwLCByMTMgPSBwYWNhICovCiBCRUdJTl9GVFJfU0VDVElPTgogCWIJMzJmCiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwMSkKQEAgLTcwMCw2ICs3MzMsNyBAQAogCWFkZGkJcjAscjMsMHgxMDAKIAlzdHdjeC4JcjAsMCxyNgogCWJuZQk0MWIKKwlsd3N5bmMKIAogCS8qCiAJICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFuIGludGVycnVwdCB0aGF0IHdlIGhhdmUgdG8gcGFzcwpAQCAtNzEzLDE4ICs3NDcsMzkgQEAKIAkgKiBpbnRlcnJ1cHQsIHNpbmNlIHRoZSBvdGhlciB0aHJlYWRzIHdpbGwgYWxyZWFkeSBiZSBvbiB0aGVpcgogCSAqIHdheSBoZXJlIGluIHRoYXQgY2FzZS4KIAkgKi8KKwljbXB3aQlyMywweDEwMAkvKiBBcmUgd2UgdGhlIGZpcnN0IGhlcmU/ICovCisJYmdlCTQzZgorCWNtcHdpCXIzLDEJCS8qIEFyZSBhbnkgb3RoZXIgdGhyZWFkcyBpbiB0aGUgZ3Vlc3Q/ICovCisJYmxlCTQzZgogCWNtcHdpCXIxMixCT09LM1NfSU5URVJSVVBUX0hWX0RFQ1JFTUVOVEVSCiAJYmVxCTQwZgotCWNtcHdpCXIzLDB4MTAwCS8qIEFyZSB3ZSB0aGUgZmlyc3QgaGVyZT8gKi8KLQliZ2UJNDBmCi0JY21wd2kJcjMsMQotCWJsZQk0MGYKIAlsaQlyMCwwCiAJbXRzcHIJU1BSTl9IREVDLHIwCiA0MDoKKwkvKgorCSAqIFNlbmQgYW4gSVBJIHRvIGFueSBuYXBwaW5nIHRocmVhZHMsIHNpbmNlIGFuIEhERUMgaW50ZXJydXB0CisJICogZG9lc24ndCB3YWtlIENQVXMgdXAgZnJvbSBuYXAuCisJICovCisJbHd6CXIzLFZDT1JFX05BUFBJTkdfVEhSRUFEUyhyNSkKKwlsd3oJcjQsVkNQVV9QVElEKHI5KQorCWxpCXIwLDEKKwlzbGRpCXIwLHIwLHI0CisJYW5kYy4JcjMscjMscjAJCS8qIG5vIHNlbnNlIElQSSdpbmcgb3Vyc2VsdmVzICovCisJYmVxCTQzZgorCW11bGxpCXI0LHI0LFBBQ0FfU0laRQkJLyogZ2V0IHBhY2EgZm9yIHRocmVhZCAwICovCisJc3ViZglyNixyNCxyMTMKKzQyOglhbmRpLglyMCxyMywxCisJYmVxCTQ0ZgorCWxkCXI4LEhTVEFURV9YSUNTX1BIWVMocjYpCS8qIGdldCB0aHJlYWQncyBYSUNTIHJlZyBhZGRyICovCisJbGkJcjAsSVBJX1BSSU9SSVRZCisJbGkJcjcsWElDU19RSVJSCisJc3RiY2l4CXIwLHI3LHI4CQkvKiB0cmlnZ2VyIHRoZSBJUEkgKi8KKzQ0OglzcmRpLglyMyxyMywxCisJYWRkaQlyNixyNixQQUNBX1NJWkUKKwlibmUJNDJiCiAKIAkvKiBTZWNvbmRhcnkgdGhyZWFkcyB3YWl0IGZvciBwcmltYXJ5IHRvIGRvIHBhcnRpdGlvbiBzd2l0Y2ggKi8KLQlsZAlyNCxWQ1BVX0tWTShyOSkJCS8qIHBvaW50ZXIgdG8gc3RydWN0IGt2bSAqLworNDM6CWxkCXI0LFZDUFVfS1ZNKHI5KQkJLyogcG9pbnRlciB0byBzdHJ1Y3Qga3ZtICovCiAJbGQJcjUsSFNUQVRFX0tWTV9WQ09SRShyMTMpCiAJbHd6CXIzLFZDUFVfUFRJRChyOSkKIAljbXB3aQlyMywwCkBAIC0xMDc3LDcgKzExMzIsNiBAQAogaGNhbGxfcmVhbF9mYWxsYmFjazoKIAlsaQlyMTIsQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMCiAJbGQJcjksIEhTVEFURV9LVk1fVkNQVShyMTMpCi0JbGQJcjExLCBWQ1BVX01TUihyOSkKIAogCWIJaGNhbGxfcmVhbF9jb250CiAKQEAgLTExMzksNyArMTE5Myw3IEBACiAJLmxvbmcJMAkJLyogMHhkNCAqLwogCS5sb25nCTAJCS8qIDB4ZDggKi8KIAkubG9uZwkwCQkvKiAweGRjICovCi0JLmxvbmcJMAkJLyogMHhlMCAqLworCS5sb25nCS5rdm1wcGNfaF9jZWRlIC0gaGNhbGxfcmVhbF90YWJsZQogCS5sb25nCTAJCS8qIDB4ZTQgKi8KIAkubG9uZwkwCQkvKiAweGU4ICovCiAJLmxvbmcJMAkJLyogMHhlYyAqLwpAQCAtMTE2OCw3ICsxMjIyLDggQEAKIAltdHNwcglTUFJOX1NSUjAscjEwCiAJbXRzcHIJU1BSTl9TUlIxLHIxMQogCWxpCXIxMCxCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCi0JTE9BRF9SRUdfSU1NRURJQVRFKHIxMSxNU1JfU0YgfCBNU1JfTUUpOworCWxpCXIxMSwoTVNSX01FIDw8IDEpIHwgMQkvKiBzeW50aGVzaXplIE1TUl9TRiB8IE1TUl9NRSAqLworCXJvdGxkaQlyMTEscjExLDYzCiAJYglmYXN0X2d1ZXN0X3JldHVybgogCiBfR0xPQkFMKGt2bXBwY19oX3NldF9kYWJyKQpAQCAtMTE3Nyw2ICsxMjMyLDE3OCBAQAogCWxpCXIzLDAKIAlibHIKIAorX0dMT0JBTChrdm1wcGNfaF9jZWRlKQorCW9yaQlyMTEscjExLE1TUl9FRQorCXN0ZAlyMTEsVkNQVV9NU1IocjMpCisJbGkJcjAsMQorCXN0YglyMCxWQ1BVX0NFREVEKHIzKQorCXN5bmMJCQkvKiBvcmRlciBzZXR0aW5nIGNlZGVkIHZzLiB0ZXN0aW5nIHByb2RkZWQgKi8KKwlsYnoJcjUsVkNQVV9QUk9EREVEKHIzKQorCWNtcHdpCXI1LDAKKwlibmUJMWYKKwlsaQlyMCwwCQkvKiBzZXQgdHJhcCB0byAwIHRvIHNheSBoY2FsbCBpcyBoYW5kbGVkICovCisJc3R3CXIwLFZDUFVfVFJBUChyMykKKwlsaQlyMCxIX1NVQ0NFU1MKKwlzdGQJcjAsVkNQVV9HUFIocjMpKHIzKQorQkVHSU5fRlRSX1NFQ1RJT04KKwliCTJmCQkvKiBqdXN0IHNlbmQgaXQgdXAgdG8gaG9zdCBvbiA5NzAgKi8KK0VORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX0FSQ0hfMjA2KQorCisJLyoKKwkgKiBTZXQgb3VyIGJpdCBpbiB0aGUgYml0bWFzayBvZiBuYXBwaW5nIHRocmVhZHMgdW5sZXNzIGFsbCB0aGUKKwkgKiBvdGhlciB0aHJlYWRzIGFyZSBhbHJlYWR5IG5hcHBpbmcsIGluIHdoaWNoIGNhc2Ugd2Ugc2VuZCB0aGlzCisJICogdXAgdG8gdGhlIGhvc3QuCisJICovCisJbGQJcjUsSFNUQVRFX0tWTV9WQ09SRShyMTMpCisJbHd6CXI2LFZDUFVfUFRJRChyMykKKwlsd3oJcjgsVkNPUkVfRU5UUllfRVhJVChyNSkKKwljbHJsZGkJcjgscjgsNTYKKwlsaQlyMCwxCisJc2xkCXIwLHIwLHI2CisJYWRkaQlyNixyNSxWQ09SRV9OQVBQSU5HX1RIUkVBRFMKKzMxOglsd2FyeAlyNCwwLHI2CisJb3IJcjQscjQscjAKKwlQUENfUE9QQ05UVyhyNyxyNCkKKwljbXB3CXI3LHI4CisJYmdlCTJmCisJc3R3Y3guCXI0LDAscjYKKwlibmUJMzFiCisJbGkJcjAsMQorCXN0YglyMCxIU1RBVEVfTkFQUElORyhyMTMpCisJLyogb3JkZXIgbmFwcGluZ190aHJlYWRzIHVwZGF0ZSB2cyB0ZXN0aW5nIGVudHJ5X2V4aXRfY291bnQgKi8KKwlsd3N5bmMKKwltcglyNCxyMworCWx3eglyNyxWQ09SRV9FTlRSWV9FWElUKHI1KQorCWNtcHdpCXI3LDB4MTAwCisJYmdlCTMzZgkJLyogYW5vdGhlciB0aHJlYWQgYWxyZWFkeSBleGl0aW5nICovCisKKy8qCisgKiBBbHRob3VnaCBub3Qgc3BlY2lmaWNhbGx5IHJlcXVpcmVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUsIFBPV0VSNworICogcHJlc2VydmVzIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGluIG5hcCBtb2RlLCBldmVuIGlmIGFuIFNNVCBtb2RlCisgKiBzd2l0Y2ggb2NjdXJzOiBTTEIgZW50cmllcywgUFVSUiwgU1BVUlIsIEFNT1IsIFVBTU9SLCBBTVIsIFNQUkcwLTMsCisgKiBEQVIsIERTSVNSLCBEQUJSLCBEQUJSWCwgRFNDUiwgUE1DeCwgTU1DUngsIFNJQVIsIFNEQVIuCisgKi8KKwkvKiBTYXZlIG5vbi12b2xhdGlsZSBHUFJzICovCisJc3RkCXIxNCwgVkNQVV9HUFIocjE0KShyMykKKwlzdGQJcjE1LCBWQ1BVX0dQUihyMTUpKHIzKQorCXN0ZAlyMTYsIFZDUFVfR1BSKHIxNikocjMpCisJc3RkCXIxNywgVkNQVV9HUFIocjE3KShyMykKKwlzdGQJcjE4LCBWQ1BVX0dQUihyMTgpKHIzKQorCXN0ZAlyMTksIFZDUFVfR1BSKHIxOSkocjMpCisJc3RkCXIyMCwgVkNQVV9HUFIocjIwKShyMykKKwlzdGQJcjIxLCBWQ1BVX0dQUihyMjEpKHIzKQorCXN0ZAlyMjIsIFZDUFVfR1BSKHIyMikocjMpCisJc3RkCXIyMywgVkNQVV9HUFIocjIzKShyMykKKwlzdGQJcjI0LCBWQ1BVX0dQUihyMjQpKHIzKQorCXN0ZAlyMjUsIFZDUFVfR1BSKHIyNSkocjMpCisJc3RkCXIyNiwgVkNQVV9HUFIocjI2KShyMykKKwlzdGQJcjI3LCBWQ1BVX0dQUihyMjcpKHIzKQorCXN0ZAlyMjgsIFZDUFVfR1BSKHIyOCkocjMpCisJc3RkCXIyOSwgVkNQVV9HUFIocjI5KShyMykKKwlzdGQJcjMwLCBWQ1BVX0dQUihyMzApKHIzKQorCXN0ZAlyMzEsIFZDUFVfR1BSKHIzMSkocjMpCisKKwkvKiBzYXZlIEZQIHN0YXRlICovCisJYmwJLmt2bXBwY19zYXZlX2ZwCisKKwkvKgorCSAqIFRha2UgYSBuYXAgdW50aWwgYSBkZWNyZW1lbnRlciBvciBleHRlcm5hbCBpbnRlcnJ1cHQgb2NjdXJzLAorCSAqIHdpdGggUEVDRTEgKHdha2Ugb24gZGVjcikgYW5kIFBFQ0UwICh3YWtlIG9uIGV4dGVybmFsKSBzZXQgaW4gTFBDUgorCSAqLworCWxpCXIwLDB4ODAKKwlzdGIJcjAsUEFDQVBST0NTVEFSVChyMTMpCisJbWZzcHIJcjUsU1BSTl9MUENSCisJb3JpCXI1LHI1LExQQ1JfUEVDRTAgfCBMUENSX1BFQ0UxCisJbXRzcHIJU1BSTl9MUENSLHI1CisJaXN5bmMKKwlsaQlyMCwgMAorCXN0ZAlyMCwgSFNUQVRFX1NDUkFUQ0gwKHIxMykKKwlwdGVzeW5jCisJbGQJcjAsIEhTVEFURV9TQ1JBVENIMChyMTMpCisxOgljbXBkCXIwLCByMAorCWJuZQkxYgorCW5hcAorCWIJLgorCitrdm1fZW5kX2NlZGU6CisJLyogV29rZW4gYnkgZXh0ZXJuYWwgb3IgZGVjcmVtZW50ZXIgaW50ZXJydXB0ICovCisJbGQJcjEsIEhTVEFURV9IT1NUX1IxKHIxMykKKwlsZAlyMiwgUEFDQVRPQyhyMTMpCisKKwkvKiBJZiB3ZSdyZSBhIHNlY29uZGFyeSB0aHJlYWQgYW5kIHdlIGdvdCBoZXJlIGJ5IGFuIElQSSwgYWNrIGl0ICovCisJbGQJcjQsSFNUQVRFX0tWTV9WQ1BVKHIxMykKKwlsd3oJcjMsVkNQVV9QVElEKHI0KQorCWNtcHdpCXIzLDAKKwliZXEJMjdmCisJbWZzcHIJcjMsU1BSTl9TUlIxCisJcmx3aW5tCXIzLHIzLDQ0LTMxLDB4NwkJLyogZXh0cmFjdCB3YWtlIHJlYXNvbiBmaWVsZCAqLworCWNtcHdpCXIzLDQJCQkvKiB3YXMgaXQgYW4gZXh0ZXJuYWwgaW50ZXJydXB0PyAqLworCWJuZQkyN2YKKwlsZAlyNSwgSFNUQVRFX1hJQ1NfUEhZUyhyMTMpCisJbGkJcjAsMHhmZgorCWxpCXI2LFhJQ1NfUUlSUgorCWxpCXI3LFhJQ1NfWElSUgorCWx3emNpeAlyOCxyNSxyNwkJLyogYWNrIHRoZSBpbnRlcnJ1cHQgKi8KKwlzeW5jCisJc3RiY2l4CXIwLHI1LHI2CQkvKiBjbGVhciBpdCAqLworCXN0d2NpeAlyOCxyNSxyNwkJLyogRU9JIGl0ICovCisyNzoKKwkvKiBsb2FkIHVwIEZQIHN0YXRlICovCisJYmwJa3ZtcHBjX2xvYWRfZnAKKworCS8qIExvYWQgTlYgR1BSUyAqLworCWxkCXIxNCwgVkNQVV9HUFIocjE0KShyNCkKKwlsZAlyMTUsIFZDUFVfR1BSKHIxNSkocjQpCisJbGQJcjE2LCBWQ1BVX0dQUihyMTYpKHI0KQorCWxkCXIxNywgVkNQVV9HUFIocjE3KShyNCkKKwlsZAlyMTgsIFZDUFVfR1BSKHIxOCkocjQpCisJbGQJcjE5LCBWQ1BVX0dQUihyMTkpKHI0KQorCWxkCXIyMCwgVkNQVV9HUFIocjIwKShyNCkKKwlsZAlyMjEsIFZDUFVfR1BSKHIyMSkocjQpCisJbGQJcjIyLCBWQ1BVX0dQUihyMjIpKHI0KQorCWxkCXIyMywgVkNQVV9HUFIocjIzKShyNCkKKwlsZAlyMjQsIFZDUFVfR1BSKHIyNCkocjQpCisJbGQJcjI1LCBWQ1BVX0dQUihyMjUpKHI0KQorCWxkCXIyNiwgVkNQVV9HUFIocjI2KShyNCkKKwlsZAlyMjcsIFZDUFVfR1BSKHIyNykocjQpCisJbGQJcjI4LCBWQ1BVX0dQUihyMjgpKHI0KQorCWxkCXIyOSwgVkNQVV9HUFIocjI5KShyNCkKKwlsZAlyMzAsIFZDUFVfR1BSKHIzMCkocjQpCisJbGQJcjMxLCBWQ1BVX0dQUihyMzEpKHI0KQorCisJLyogY2xlYXIgb3VyIGJpdCBpbiB2Y29yZS0+bmFwcGluZ190aHJlYWRzICovCiszMzoJbGQJcjUsSFNUQVRFX0tWTV9WQ09SRShyMTMpCisJbHd6CXIzLFZDUFVfUFRJRChyNCkKKwlsaQlyMCwxCisJc2xkCXIwLHIwLHIzCisJYWRkaQlyNixyNSxWQ09SRV9OQVBQSU5HX1RIUkVBRFMKKzMyOglsd2FyeAlyNywwLHI2CisJYW5kYwlyNyxyNyxyMAorCXN0d2N4LglyNywwLHI2CisJYm5lCTMyYgorCWxpCXIwLDAKKwlzdGIJcjAsSFNUQVRFX05BUFBJTkcocjEzKQorCisJLyogc2VlIGlmIGFueSBvdGhlciB0aHJlYWQgaXMgYWxyZWFkeSBleGl0aW5nICovCisJbHd6CXIwLFZDT1JFX0VOVFJZX0VYSVQocjUpCisJY21wd2kJcjAsMHgxMDAKKwlibHQJa3ZtcHBjX2NlZGVfcmVlbnRyeQkvKiBpZiBub3QgZ28gYmFjayB0byBndWVzdCAqLworCisJLyogc29tZSB0aHJlYWRzIGFyZSBleGl0aW5nLCBzbyBnbyB0byB0aGUgZ3Vlc3QgZXhpdCBwYXRoICovCisJYgloY2FsbF9yZWFsX2ZhbGxiYWNrCisKKwkvKiBjZWRlIHdoZW4gYWxyZWFkeSBwcmV2aW91c2x5IHByb2RkZWQgY2FzZSAqLworMToJbGkJcjAsMAorCXN0YglyMCxWQ1BVX1BST0RERUQocjMpCisJc3luYwkJCS8qIG9yZGVyIHRlc3RpbmcgcHJvZGRlZCB2cy4gY2xlYXJpbmcgY2VkZWQgKi8KKwlzdGIJcjAsVkNQVV9DRURFRChyMykKKwlsaQlyMyxIX1NVQ0NFU1MKKwlibHIKKworCS8qIHdlJ3ZlIGNlZGVkIGJ1dCB3ZSB3YW50IHRvIGdpdmUgY29udHJvbCB0byB0aGUgaG9zdCAqLworMjoJbGkJcjMsSF9UT09fSEFSRAorCWJscgorCiBzZWNvbmRhcnlfdG9vX2xhdGU6CiAJbGQJcjUsSFNUQVRFX0tWTV9WQ09SRShyMTMpCiAJSE1UX0xPVwpAQCAtMTE5NCwxNCArMTQyMSwyMCBAQAogCXNsYm10ZQlyNixyNQogMToJYWRkaQlyMTEscjExLDE2CiAJLmVuZHIKLQliCTUwZgogCiBzZWNvbmRhcnlfbmFwOgotCS8qIENsZWFyIGFueSBwZW5kaW5nIElQSSAqLwotNTA6CWxkCXI1LCBIU1RBVEVfWElDU19QSFlTKHIxMykKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBJUEkgLSBhc3N1bWUgd2UncmUgYSBzZWNvbmRhcnkgdGhyZWFkICovCisJbGQJcjUsIEhTVEFURV9YSUNTX1BIWVMocjEzKQorCWxpCXI3LCBYSUNTX1hJUlIKKwlsd3pjaXgJcjMsIHI1LCByNwkJLyogYWNrIGFueSBwZW5kaW5nIGludGVycnVwdCAqLworCXJsd2lubS4JcjAsIHIzLCAwLCAweGZmZmZmZgkvKiBhbnkgcGVuZGluZz8gKi8KKwliZXEJMzdmCisJc3luYwogCWxpCXIwLCAweGZmCiAJbGkJcjYsIFhJQ1NfUUlSUgotCXN0YmNpeAlyMCwgcjUsIHI2CisJc3RiY2l4CXIwLCByNSwgcjYJCS8qIGNsZWFyIHRoZSBJUEkgKi8KKwlzdHdjaXgJcjMsIHI1LCByNwkJLyogRU9JIGl0ICovCiszNzoJc3luYwogCiAJLyogaW5jcmVtZW50IHRoZSBuYXAgY291bnQgYW5kIHRoZW4gZ28gdG8gbmFwIG1vZGUgKi8KIAlsZAlyNCwgSFNUQVRFX0tWTV9WQ09SRShyMTMpCkBAIC0xMjExLDEzICsxNDQ0LDEyIEBACiAJYWRkaQlyMywgcjMsIDEKIAlzdHdjeC4JcjMsIDAsIHI0CiAJYm5lCTUxYgotCWlzeW5jCiAKKwlsaQlyMywgTFBDUl9QRUNFMAogCW1mc3ByCXI0LCBTUFJOX0xQQ1IKLQlsaQlyMCwgTFBDUl9QRUNFCi0JYW5kYwlyNCwgcjQsIHIwCi0Jb3JpCXI0LCByNCwgTFBDUl9QRUNFMAkvKiBleGl0IG5hcCBvbiBpbnRlcnJ1cHQgKi8KKwlybHdpbWkJcjQsIHIzLCAwLCBMUENSX1BFQ0UwIHwgTFBDUl9QRUNFMQogCW10c3ByCVNQUk5fTFBDUiwgcjQKKwlpc3luYwogCWxpCXIwLCAwCiAJc3RkCXIwLCBIU1RBVEVfU0NSQVRDSDAocjEzKQogCXB0ZXN5bmMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2ludGVycnVwdHMuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2ludGVycnVwdHMuUwppbmRleCBjNTRiMGUzLi4wYTg1MTVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19pbnRlcnJ1cHRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaW50ZXJydXB0cy5TCkBAIC0yOSwyNyArMjksMTEgQEAKICNkZWZpbmUgVUxPTkdfU0laRSAJCTgKICNkZWZpbmUgRlVOQyhuYW1lKSAJCUdMVUUoLixuYW1lKQogCi0jZGVmaW5lIEdFVF9TSEFET1dfVkNQVV9SMTMKLQotI2RlZmluZSBESVNBQkxFX0lOVEVSUlVQVFMJXAotCW1mbXNyICAgcjA7CQlcCi0JcmxkaWNsICByMCxyMCw0OCwxOwlcCi0Jcm90bGRpICByMCxyMCwxNjsJXAotCW10bXNyZCAgcjAsMTsJCVwKLQogI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szU18zMikKIAogI2RlZmluZSBVTE9OR19TSVpFICAgICAgICAgICAgICA0CiAjZGVmaW5lIEZVTkMobmFtZSkJCW5hbWUKIAotI2RlZmluZSBHRVRfU0hBRE9XX1ZDUFVfUjEzCVwKLQlsd3oJcjEzLCAoVEhSRUFEICsgVEhSRUFEX0tWTV9TVkNQVSkocjIpCi0KLSNkZWZpbmUgRElTQUJMRV9JTlRFUlJVUFRTCVwKLQltZm1zciAgIHIwOwkJXAotCXJsd2lubSAgcjAscjAsMCwxNywxNTsJXAotCW10bXNyICAgcjA7CQlcCi0KICNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szU19YWCAqLwogCiAKQEAgLTEwOCw0NCArOTIsMTcgQEAKIAoga3ZtX3N0YXJ0X2xpZ2h0d2VpZ2h0OgogCi0JR0VUX1NIQURPV19WQ1BVX1IxMwotCVBQQ19MTAlyMywgVkNQVV9ISUdITUVNX0hBTkRMRVIocjQpCi0JUFBDX1NUTAlyMywgSFNUQVRFX1ZNSEFORExFUihyMTMpCi0KLQlQUENfTEwJcjEwLCBWQ1BVX1NIQURPV19NU1IocjQpCS8qIHIxMCA9IHZjcHUtPmFyY2guc2hhZG93X21zciAqLwotCi0JRElTQUJMRV9JTlRFUlJVUFRTCi0KICNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAotCS8qIFNvbWUgZ3Vlc3RzIG1heSBuZWVkIHRvIGhhdmUgZGNieiBzZXQgdG8gMzIgYnl0ZSBsZW5ndGguCi0JICoKLQkgKiBVc3VhbGx5IHdlIGVuc3VyZSB0aGF0IGJ5IHBhdGNoaW5nIHRoZSBndWVzdCdzIGluc3RydWN0aW9ucwotCSAqIHRvIHRyYXAgb24gZGNieiBhbmQgZW11bGF0ZSBpdCBpbiB0aGUgaHlwZXJ2aXNvci4KLQkgKgotCSAqIElmIHdlIGNhbiwgd2Ugc2hvdWxkIHRlbGwgdGhlIENQVSB0byB1c2UgMzIgYnl0ZSBkY2J6IHRob3VnaCwKLQkgKiBiZWNhdXNlIHRoYXQncyBhIGxvdCBmYXN0ZXIuCi0JICovCi0KIAlQUENfTEwJcjMsIFZDUFVfSEZMQUdTKHI0KQotCXJsZGljbC4JcjMsIHIzLCAwLCA2MwkJLyogQ1IgPSAoKHIzICYgMSkgPT0gMCkgKi8KLQliZXEJbm9fZGNiejMyX29uCi0KLQltZnNwciAgIHIzLFNQUk5fSElENQotCW9yaSAgICAgcjMsIHIzLCAweDgwCQkvKiBYWFggSElENV9kY2J6MzIgPSAweDgwICovCi0JbXRzcHIgICBTUFJOX0hJRDUscjMKLQotbm9fZGNiejMyX29uOgotCisJcmxkaWNsCXIzLCByMywgMCwgNjMJCS8qIHIzICY9IDEgKi8KKwlzdGIJcjMsIEhTVEFURV9SRVNUT1JFX0hJRDUocjEzKQogI2VuZGlmIC8qIENPTkZJR19QUENfQk9PSzNTXzY0ICovCiAKLQlQUENfTEwJcjYsIFZDUFVfUk1DQUxMKHI0KQotCW10Y3RyCXI2Ci0KLQlQUENfTEwJcjMsIFZDUFVfVFJBTVBPTElORV9FTlRFUihyNCkKLQlMT0FEX1JFR19JTU1FRElBVEUocjQsIE1TUl9LRVJORUwgJiB+KE1TUl9JUiB8IE1TUl9EUikpCisJUFBDX0xMCXI0LCBWQ1BVX1NIQURPV19NU1IocjQpCS8qIGdldCBzaGFkb3dfbXNyICovCiAKIAkvKiBKdW1wIHRvIHNlZ21lbnQgcGF0Y2hpbmcgaGFuZGxlciBhbmQgaW50byBvdXIgZ3Vlc3QgKi8KLQliY3RyCisJYmwJRlVOQyhrdm1wcGNfZW50cnlfdHJhbXBvbGluZSkKKwlub3AKIAogLyoKICAqIFRoaXMgaXMgdGhlIGhhbmRsZXIgaW4gbW9kdWxlIG1lbW9yeS4gSXQgZ2V0cyBqdW1wZWQgYXQgZnJvbSB0aGUKQEAgLTE3MCwyMSArMTI3LDYgQEAKIAkvKiBSNyA9IHZjcHUgKi8KIAlQUENfTEwJcjcsIEdQUjQocjEpCiAKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAotCi0JUFBDX0xMCXI1LCBWQ1BVX0hGTEFHUyhyNykKLQlybGRpY2wuCXI1LCByNSwgMCwgNjMJCS8qIENSID0gKChyNSAmIDEpID09IDApICovCi0JYmVxCW5vX2RjYnozMl9vZmYKLQotCWxpCXI0LCAwCi0JbWZzcHIgICByNSxTUFJOX0hJRDUKLQlybGRpbWkgIHI1LHI0LDYsNTYKLQltdHNwciAgIFNQUk5fSElENSxyNQotCi1ub19kY2J6MzJfb2ZmOgotCi0jZW5kaWYgLyogQ09ORklHX1BQQ19CT09LM1NfNjQgKi8KLQogCVBQQ19TVEwJcjE0LCBWQ1BVX0dQUihyMTQpKHI3KQogCVBQQ19TVEwJcjE1LCBWQ1BVX0dQUihyMTUpKHI3KQogCVBQQ19TVEwJcjE2LCBWQ1BVX0dQUihyMTYpKHI3KQpAQCAtMjA0LDY3ICsxNDYsNiBAQAogCVBQQ19TVEwJcjMwLCBWQ1BVX0dQUihyMzApKHI3KQogCVBQQ19TVEwJcjMxLCBWQ1BVX0dQUihyMzEpKHI3KQogCi0JLyogUmVzdG9yZSBob3N0IG1zciAtPiBTUlIxICovCi0JUFBDX0xMCXI2LCBWQ1BVX0hPU1RfTVNSKHI3KQotCi0JLyoKLQkgKiBGb3Igc29tZSBpbnRlcnJ1cHRzLCB3ZSBuZWVkIHRvIGNhbGwgdGhlIHJlYWwgTGludXgKLQkgKiBoYW5kbGVyLCBzbyBpdCBjYW4gZG8gd29yayBmb3IgdXMuIFRoaXMgaGFzIHRvIGhhcHBlbgotCSAqIGFzIGlmIHRoZSBpbnRlcnJ1cHQgYXJyaXZlZCBmcm9tIHRoZSBrZXJuZWwgdGhvdWdoLAotCSAqIHNvIGxldCdzIGZha2UgaXQgaGVyZSB3aGVyZSBtb3N0IHN0YXRlIGlzIHJlc3RvcmVkLgotCSAqCi0JICogQ2FsbCBMaW51eCBmb3IgaGFyZHdhcmUgaW50ZXJydXB0cy9kZWNyZW1lbnRlcgotCSAqIHIzID0gYWRkcmVzcyBvZiBpbnRlcnJ1cHQgaGFuZGxlciAoZXhpdCByZWFzb24pCi0JICovCi0KLQljbXB3aQlyMTIsIEJPT0szU19JTlRFUlJVUFRfRVhURVJOQUwKLQliZXEJY2FsbF9saW51eF9oYW5kbGVyCi0JY21wd2kJcjEyLCBCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSCi0JYmVxCWNhbGxfbGludXhfaGFuZGxlcgotCWNtcHdpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9QRVJGTU9OCi0JYmVxCWNhbGxfbGludXhfaGFuZGxlcgotCi0JLyogQmFjayB0byBFRT0xICovCi0JbXRtc3IJcjYKLQlzeW5jCi0JYglrdm1fcmV0dXJuX3BvaW50Ci0KLWNhbGxfbGludXhfaGFuZGxlcjoKLQotCS8qCi0JICogSWYgd2UgbGFuZCBoZXJlIHdlIG5lZWQgdG8ganVtcCBiYWNrIHRvIHRoZSBoYW5kbGVyIHdlCi0JICogY2FtZSBmcm9tLgotCSAqCi0JICogV2UgaGF2ZSBhIHBhZ2UgdGhhdCB3ZSBjYW4gYWNjZXNzIGZyb20gcmVhbCBtb2RlLCBzbyBsZXQncwotCSAqIGp1bXAgYmFjayB0byB0aGF0IGFuZCB1c2UgaXQgYXMgYSB0cmFtcG9saW5lIHRvIGdldCBiYWNrIGludG8gdGhlCi0JICogaW50ZXJydXB0IGhhbmRsZXIhCi0JICoKLQkgKiBSMyBzdGlsbCBjb250YWlucyB0aGUgZXhpdCBjb2RlLAotCSAqIFI1IFZDUFVfSE9TVF9SRVRJUCBhbmQKLQkgKiBSNiBWQ1BVX0hPU1RfTVNSCi0JICovCi0KLQkvKiBSZXN0b3JlIGhvc3QgSVAgLT4gU1JSMCAqLwotCVBQQ19MTAlyNSwgVkNQVV9IT1NUX1JFVElQKHI3KQotCi0JLyogWFhYIEJldHRlciBtb3ZlIHRvIGEgc2FmZSBmdW5jdGlvbj8KLQkgKiAgICAgV2hhdCBpZiB3ZSBnZXQgYW4gSFRBQiBmbHVzaCBpbiBiZXR3ZWVuIG10c3JyMCBhbmQgbXRzcnIxPyAqLwotCi0JbXRscglyMTIKLQotCVBQQ19MTAlyNCwgVkNQVV9UUkFNUE9MSU5FX0xPV01FTShyNykKLQltdHNycjAJcjQKLQlMT0FEX1JFR19JTU1FRElBVEUocjMsIE1TUl9LRVJORUwgJiB+KE1TUl9JUiB8IE1TUl9EUikpCi0JbXRzcnIxCXIzCi0KLQlSRkkKLQotLmdsb2JhbCBrdm1fcmV0dXJuX3BvaW50Ci1rdm1fcmV0dXJuX3BvaW50OgotCi0JLyogSnVtcCBiYWNrIHRvIGxpZ2h0d2VpZ2h0IGVudHJ5IGlmIHdlJ3JlIHN1cHBvc2VkIHRvICovCi0JLyogZ28gYmFjayBpbnRvIHRoZSBndWVzdCAqLwotCiAJLyogUGFzcyB0aGUgZXhpdCBudW1iZXIgYXMgM3JkIGFyZ3VtZW50IHRvIGt2bXBwY19oYW5kbGVfZXhpdCAqLwogCW1yCXI1LCByMTIKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHIuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMKaW5kZXggMGMwZDNmMi4uYmM0ZDUwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHIuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19wci5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC0xNTAsMTYgKzE1MSwyMiBAQAogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CiAJaWYgKChwdnIgPj0gMHgzMzAwMDApICYmIChwdnIgPCAweDcwMzMwMDAwKSkgewogCQlrdm1wcGNfbW11X2Jvb2szc182NF9pbml0KHZjcHUpOwotCQl0b19ib29rM3ModmNwdSktPmhpb3IgPSAweGZmZjAwMDAwOworCQlpZiAoIXRvX2Jvb2szcyh2Y3B1KS0+aGlvcl9zcmVncykKKwkJCXRvX2Jvb2szcyh2Y3B1KS0+aGlvciA9IDB4ZmZmMDAwMDA7CiAJCXRvX2Jvb2szcyh2Y3B1KS0+bXNyX21hc2sgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CisJCXZjcHUtPmFyY2guY3B1X3R5cGUgPSBLVk1fQ1BVXzNTXzY0OwogCX0gZWxzZQogI2VuZGlmCiAJewogCQlrdm1wcGNfbW11X2Jvb2szc18zMl9pbml0KHZjcHUpOwotCQl0b19ib29rM3ModmNwdSktPmhpb3IgPSAwOworCQlpZiAoIXRvX2Jvb2szcyh2Y3B1KS0+aGlvcl9zcmVncykKKwkJCXRvX2Jvb2szcyh2Y3B1KS0+aGlvciA9IDA7CiAJCXRvX2Jvb2szcyh2Y3B1KS0+bXNyX21hc2sgPSAweGZmZmZmZmZmVUxMOworCQl2Y3B1LT5hcmNoLmNwdV90eXBlID0gS1ZNX0NQVV8zU18zMjsKIAl9CiAKKwlrdm1wcGNfc2FuaXR5X2NoZWNrKHZjcHUpOworCiAJLyogSWYgd2UgYXJlIGluIGh5cGVydmlzb3IgbGV2ZWwgb24gOTcwLCB3ZSBjYW4gdGVsbCB0aGUgQ1BVIHRvCiAJICogdHJlYXQgRENCWiBhcyAzMiBieXRlcyBzdG9yZSAqLwogCXZjcHUtPmFyY2guaGZsYWdzICY9IH5CT09LM1NfSEZMQUdfRENCWjMyOwpAQCAtNjQ2LDcgKzY1MywyNyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBCT09LM1NfSU5URVJSVVBUX1NZU0NBTEw6Ci0JCWlmICh2Y3B1LT5hcmNoLm9zaV9lbmFibGVkICYmCisJCWlmICh2Y3B1LT5hcmNoLnBhcHJfZW5hYmxlZCAmJgorCQkgICAgKGt2bXBwY19nZXRfbGFzdF9pbnN0KHZjcHUpID09IDB4NDQwMDAwMjIpICYmCisJCSAgICAhKHZjcHUtPmFyY2guc2hhcmVkLT5tc3IgJiBNU1JfUFIpKSB7CisJCQkvKiBTQyAxIHBhcHIgaHlwZXJjYWxscyAqLworCQkJdWxvbmcgY21kID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgMyk7CisJCQlpbnQgaTsKKworCQkJaWYgKGt2bXBwY19oX3ByKHZjcHUsIGNtZCkgPT0gRU1VTEFURV9ET05FKSB7CisJCQkJciA9IFJFU1VNRV9HVUVTVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcnVuLT5wYXByX2hjYWxsLm5yID0gY21kOworCQkJZm9yIChpID0gMDsgaSA8IDk7ICsraSkgeworCQkJCXVsb25nIGdwciA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDQgKyBpKTsKKwkJCQlydW4tPnBhcHJfaGNhbGwuYXJnc1tpXSA9IGdwcjsKKwkJCX0KKwkJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9QQVBSX0hDQUxMOworCQkJdmNwdS0+YXJjaC5oY2FsbF9uZWVkZWQgPSAxOworCQkJciA9IFJFU1VNRV9IT1NUOworCQl9IGVsc2UgaWYgKHZjcHUtPmFyY2gub3NpX2VuYWJsZWQgJiYKIAkJICAgICgoKHUzMilrdm1wcGNfZ2V0X2dwcih2Y3B1LCAzKSkgPT0gT1NJX1NDX01BR0lDX1IzKSAmJgogCQkgICAgKCgodTMyKWt2bXBwY19nZXRfZ3ByKHZjcHUsIDQpKSA9PSBPU0lfU0NfTUFHSUNfUjQpKSB7CiAJCQkvKiBNT0wgaHlwZXJjYWxscyAqLwpAQCAtNzcwLDYgKzc5Nyw5IEBACiAJCX0KIAl9CiAKKwlpZiAoc3JlZ3MtPnUucy5mbGFncyAmIEtWTV9TUkVHU19TX0hJT1IpCisJCXNyZWdzLT51LnMuaGlvciA9IHRvX2Jvb2szcyh2Y3B1KS0+aGlvcjsKKwogCXJldHVybiAwOwogfQogCkBAIC04MDYsNiArODM2LDExIEBACiAJLyogRmx1c2ggdGhlIE1NVSBhZnRlciBtZXNzaW5nIHdpdGggdGhlIHNlZ21lbnRzICovCiAJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgMCwgMCk7CiAKKwlpZiAoc3JlZ3MtPnUucy5mbGFncyAmIEtWTV9TUkVHU19TX0hJT1IpIHsKKwkJdG9fYm9vazNzKHZjcHUpLT5oaW9yX3NyZWdzID0gdHJ1ZTsKKwkJdG9fYm9vazNzKHZjcHUpLT5oaW9yID0gc3JlZ3MtPnUucy5oaW9yOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC04NDEsOCArODc2LDYgQEAKIAlpZiAoIXApCiAJCWdvdG8gdW5pbml0X3ZjcHU7CiAKLQl2Y3B1LT5hcmNoLmhvc3RfcmV0aXAgPSBrdm1fcmV0dXJuX3BvaW50OwotCXZjcHUtPmFyY2guaG9zdF9tc3IgPSBtZm1zcigpOwogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CiAJLyogZGVmYXVsdCB0byBib29rM3NfNjQgKDk3MGZ4KSAqLwogCXZjcHUtPmFyY2gucHZyID0gMHgzQzAzMDE7CkBAIC04NTMsMTYgKzg4Niw2IEBACiAJa3ZtcHBjX3NldF9wdnIodmNwdSwgdmNwdS0+YXJjaC5wdnIpOwogCXZjcHUtPmFyY2guc2xiX25yID0gNjQ7CiAKLQkvKiByZW1lbWJlciB3aGVyZSBzb21lIHJlYWwtbW9kZSBoYW5kbGVycyBhcmUgKi8KLQl2Y3B1LT5hcmNoLnRyYW1wb2xpbmVfbG93bWVtID0gX19wYShrdm1wcGNfaGFuZGxlcl9sb3dtZW1fdHJhbXBvbGluZSk7Ci0JdmNwdS0+YXJjaC50cmFtcG9saW5lX2VudGVyID0gX19wYShrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2VudGVyKTsKLQl2Y3B1LT5hcmNoLmhpZ2htZW1faGFuZGxlciA9ICh1bG9uZylrdm1wcGNfaGFuZGxlcl9oaWdobWVtOwotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0Ci0JdmNwdS0+YXJjaC5ybWNhbGwgPSAqKHVsb25nKilrdm1wcGNfcm1jYWxsOwotI2Vsc2UKLQl2Y3B1LT5hcmNoLnJtY2FsbCA9ICh1bG9uZylrdm1wcGNfcm1jYWxsOwotI2VuZGlmCi0KIAl2Y3B1LT5hcmNoLnNoYWRvd19tc3IgPSBNU1JfVVNFUjY0OwogCiAJZXJyID0ga3ZtcHBjX21tdV9pbml0KHZjcHUpOwpAQCAtOTA4LDYgKzkzMSwxMiBAQAogI2VuZGlmCiAJdWxvbmcgZXh0X21zcjsKIAorCS8qIENoZWNrIGlmIHdlIGNhbiBydW4gdGhlIHZjcHUgYXQgYWxsICovCisJaWYgKCF2Y3B1LT5hcmNoLnNhbmUpIHsKKwkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogTm8gbmVlZCB0byBnbyBpbnRvIHRoZSBndWVzdCB3aGVuIGFsbCB3ZSBkbyBpcyBnb2luZyBvdXQgKi8KIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHJfcGFwci5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHJfcGFwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NTg5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19wcl9wYXByLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEuIEZyZWVzY2FsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQXV0aG9yczoKKyAqICAgIEFsZXhhbmRlciBHcmFmIDxhZ3JhZkBzdXNlLmRlPgorICogICAgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+CisgKgorICogRGVzY3JpcHRpb246CisgKgorICogSHlwZXJjYWxsIGhhbmRsaW5nIGZvciBydW5uaW5nIFBBUFIgZ3Vlc3RzIGluIFBSIEtWTSBvbiBCb29rIDNTCisgKiBwcm9jZXNzb3JzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20va3ZtX3BwYy5oPgorI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9wdGVnX2FkZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBsb25nIHB0ZV9pbmRleCkKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1X2Jvb2szcyA9IHRvX2Jvb2szcyh2Y3B1KTsKKwl1bnNpZ25lZCBsb25nIHB0ZWdfYWRkcjsKKworCXB0ZV9pbmRleCA8PD0gNDsKKwlwdGVfaW5kZXggJj0gKCgxIDw8ICgodmNwdV9ib29rM3MtPnNkcjEgJiAweDFmKSArIDExKSkgLSAxKSA8PCA3IHwgMHg3MDsKKwlwdGVnX2FkZHIgPSB2Y3B1X2Jvb2szcy0+c2RyMSAmIDB4ZmZmZmZmZmZmZmZjMDAwMFVMTDsKKwlwdGVnX2FkZHIgfD0gcHRlX2luZGV4OworCisJcmV0dXJuIHB0ZWdfYWRkcjsKK30KKworc3RhdGljIGludCBrdm1wcGNfaF9wcl9lbnRlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJbG9uZyBmbGFncyA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDQpOworCWxvbmcgcHRlX2luZGV4ID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgNSk7CisJdW5zaWduZWQgbG9uZyBwdGVnWzIgKiA4XTsKKwl1bnNpZ25lZCBsb25nIHB0ZWdfYWRkciwgaSwgKmhwdGU7CisKKwlwdGVfaW5kZXggJj0gfjdVTDsKKwlwdGVnX2FkZHIgPSBnZXRfcHRlZ19hZGRyKHZjcHUsIHB0ZV9pbmRleCk7CisKKwljb3B5X2Zyb21fdXNlcihwdGVnLCAodm9pZCBfX3VzZXIgKilwdGVnX2FkZHIsIHNpemVvZihwdGVnKSk7CisJaHB0ZSA9IHB0ZWc7CisKKwlpZiAobGlrZWx5KChmbGFncyAmIEhfRVhBQ1QpID09IDApKSB7CisJCXB0ZV9pbmRleCAmPSB+N1VMOworCQlmb3IgKGkgPSAwOyA7ICsraSkgeworCQkJaWYgKGkgPT0gOCkKKwkJCQlyZXR1cm4gSF9QVEVHX0ZVTEw7CisJCQlpZiAoKCpocHRlICYgSFBURV9WX1ZBTElEKSA9PSAwKQorCQkJCWJyZWFrOworCQkJaHB0ZSArPSAyOworCQl9CisJfSBlbHNlIHsKKwkJaSA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDUpICYgN1VMOworCQlocHRlICs9IGkgKiAyOworCX0KKworCWhwdGVbMF0gPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCA2KTsKKwlocHRlWzFdID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgNyk7CisJY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXB0ZWdfYWRkciwgcHRlZywgc2l6ZW9mKHB0ZWcpKTsKKwlrdm1wcGNfc2V0X2dwcih2Y3B1LCAzLCBIX1NVQ0NFU1MpOworCWt2bXBwY19zZXRfZ3ByKHZjcHUsIDQsIHB0ZV9pbmRleCB8IGkpOworCisJcmV0dXJuIEVNVUxBVEVfRE9ORTsKK30KKworc3RhdGljIGludCBrdm1wcGNfaF9wcl9yZW1vdmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDQpOworCXVuc2lnbmVkIGxvbmcgcHRlX2luZGV4ID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgNSk7CisJdW5zaWduZWQgbG9uZyBhdnBuID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgNik7CisJdW5zaWduZWQgbG9uZyB2ID0gMCwgcHRlZywgcmI7CisJdW5zaWduZWQgbG9uZyBwdGVbMl07CisKKwlwdGVnID0gZ2V0X3B0ZWdfYWRkcih2Y3B1LCBwdGVfaW5kZXgpOworCWNvcHlfZnJvbV91c2VyKHB0ZSwgKHZvaWQgX191c2VyICopcHRlZywgc2l6ZW9mKHB0ZSkpOworCisJaWYgKChwdGVbMF0gJiBIUFRFX1ZfVkFMSUQpID09IDAgfHwKKwkgICAgKChmbGFncyAmIEhfQVZQTikgJiYgKHB0ZVswXSAmIH4weDdmVUwpICE9IGF2cG4pIHx8CisJICAgICgoZmxhZ3MgJiBIX0FORENPTkQpICYmIChwdGVbMF0gJiBhdnBuKSAhPSAwKSkgeworCQlrdm1wcGNfc2V0X2dwcih2Y3B1LCAzLCBIX05PVF9GT1VORCk7CisJCXJldHVybiBFTVVMQVRFX0RPTkU7CisJfQorCisJY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXB0ZWcsICZ2LCBzaXplb2YodikpOworCisJcmIgPSBjb21wdXRlX3RsYmllX3JiKHB0ZVswXSwgcHRlWzFdLCBwdGVfaW5kZXgpOworCXZjcHUtPmFyY2gubW11LnRsYmllKHZjcHUsIHJiLCByYiAmIDEgPyB0cnVlIDogZmFsc2UpOworCisJa3ZtcHBjX3NldF9ncHIodmNwdSwgMywgSF9TVUNDRVNTKTsKKwlrdm1wcGNfc2V0X2dwcih2Y3B1LCA0LCBwdGVbMF0pOworCWt2bXBwY19zZXRfZ3ByKHZjcHUsIDUsIHB0ZVsxXSk7CisKKwlyZXR1cm4gRU1VTEFURV9ET05FOworfQorCitzdGF0aWMgaW50IGt2bXBwY19oX3ByX3Byb3RlY3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCA0KTsKKwl1bnNpZ25lZCBsb25nIHB0ZV9pbmRleCA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDUpOworCXVuc2lnbmVkIGxvbmcgYXZwbiA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDYpOworCXVuc2lnbmVkIGxvbmcgcmIsIHB0ZWcsIHIsIHY7CisJdW5zaWduZWQgbG9uZyBwdGVbMl07CisKKwlwdGVnID0gZ2V0X3B0ZWdfYWRkcih2Y3B1LCBwdGVfaW5kZXgpOworCWNvcHlfZnJvbV91c2VyKHB0ZSwgKHZvaWQgX191c2VyICopcHRlZywgc2l6ZW9mKHB0ZSkpOworCisJaWYgKChwdGVbMF0gJiBIUFRFX1ZfVkFMSUQpID09IDAgfHwKKwkgICAgKChmbGFncyAmIEhfQVZQTikgJiYgKHB0ZVswXSAmIH4weDdmVUwpICE9IGF2cG4pKSB7CisJCWt2bXBwY19zZXRfZ3ByKHZjcHUsIDMsIEhfTk9UX0ZPVU5EKTsKKwkJcmV0dXJuIEVNVUxBVEVfRE9ORTsKKwl9CisKKwl2ID0gcHRlWzBdOworCXIgPSBwdGVbMV07CisJciAmPSB+KEhQVEVfUl9QUDAgfCBIUFRFX1JfUFAgfCBIUFRFX1JfTiB8IEhQVEVfUl9LRVlfSEkgfAorCSAgICAgICBIUFRFX1JfS0VZX0xPKTsKKwlyIHw9IChmbGFncyA8PCA1NSkgJiBIUFRFX1JfUFAwOworCXIgfD0gKGZsYWdzIDw8IDQ4KSAmIEhQVEVfUl9LRVlfSEk7CisJciB8PSBmbGFncyAmIChIUFRFX1JfUFAgfCBIUFRFX1JfTiB8IEhQVEVfUl9LRVlfTE8pOworCisJcHRlWzFdID0gcjsKKworCXJiID0gY29tcHV0ZV90bGJpZV9yYih2LCByLCBwdGVfaW5kZXgpOworCXZjcHUtPmFyY2gubW11LnRsYmllKHZjcHUsIHJiLCByYiAmIDEgPyB0cnVlIDogZmFsc2UpOworCWNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilwdGVnLCBwdGUsIHNpemVvZihwdGUpKTsKKworCWt2bXBwY19zZXRfZ3ByKHZjcHUsIDMsIEhfU1VDQ0VTUyk7CisKKwlyZXR1cm4gRU1VTEFURV9ET05FOworfQorCitpbnQga3ZtcHBjX2hfcHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSF9FTlRFUjoKKwkJcmV0dXJuIGt2bXBwY19oX3ByX2VudGVyKHZjcHUpOworCWNhc2UgSF9SRU1PVkU6CisJCXJldHVybiBrdm1wcGNfaF9wcl9yZW1vdmUodmNwdSk7CisJY2FzZSBIX1BST1RFQ1Q6CisJCXJldHVybiBrdm1wcGNfaF9wcl9wcm90ZWN0KHZjcHUpOworCWNhc2UgSF9CVUxLX1JFTU9WRToKKwkJLyogV2UganVzdCBmbHVzaCBhbGwgUFRFcywgc28gdXNlciBzcGFjZSBjYW4KKwkJICAgaGFuZGxlIHRoZSBIUFQgbW9kaWZpY2F0aW9ucyAqLworCQlrdm1wcGNfbW11X3B0ZV9mbHVzaCh2Y3B1LCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBIX0NFREU6CisJCWt2bV92Y3B1X2Jsb2NrKHZjcHUpOworCQl2Y3B1LT5zdGF0LmhhbHRfd2FrZXVwKys7CisJCXJldHVybiBFTVVMQVRFX0RPTkU7CisJfQorCisJcmV0dXJuIEVNVUxBVEVfRkFJTDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3JtaGFuZGxlcnMuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3JtaGFuZGxlcnMuUwppbmRleCBjMWY4NzdjLi4zNDE4NzU4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19ybWhhbmRsZXJzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3Nfcm1oYW5kbGVycy5TCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20va3ZtX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9yZWcuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIApAQCAtMzUsMTAgKzM2LDEwIEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfQk9PSzNTXzY0KQogCi0jZGVmaW5lIExPQURfU0hBRE9XX1ZDUFUocmVnKQlHRVRfUEFDQShyZWcpCQkJCQkKLSNkZWZpbmUgTVNSX05PSVJRCQlNU1JfS0VSTkVMICYgfihNU1JfSVIgfCBNU1JfRFIpCiAjZGVmaW5lIEZVTkMobmFtZSkgCQlHTFVFKC4sbmFtZSkKKyNkZWZpbmUgTVRNU1JfRUVSSShyZWcpCQltdG1zcmQJKHJlZyksMQogCisJLmdsb2JsCWt2bXBwY19za2lwX2ludGVycnVwdAoga3ZtcHBjX3NraXBfaW50ZXJydXB0OgogCS8qCiAJICogSGVyZSBhbGwgR1BScyBhcmUgdW5jaGFuZ2VkIGZyb20gd2hlbiB0aGUgaW50ZXJydXB0IGhhcHBlbmVkCkBAIC01MSw2ICs1Miw3IEBACiAJcmZpZAogCWIJLgogCisJLmdsb2JsCWt2bXBwY19za2lwX0hpbnRlcnJ1cHQKIGt2bXBwY19za2lwX0hpbnRlcnJ1cHQ6CiAJLyoKIAkgKiBIZXJlIGFsbCBHUFJzIGFyZSB1bmNoYW5nZWQgZnJvbSB3aGVuIHRoZSBpbnRlcnJ1cHQgaGFwcGVuZWQKQEAgLTY1LDggKzY3LDggQEAKIAogI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szU18zMikKIAotI2RlZmluZSBNU1JfTk9JUlEJCU1TUl9LRVJORUwKICNkZWZpbmUgRlVOQyhuYW1lKQkJbmFtZQorI2RlZmluZSBNVE1TUl9FRVJJKHJlZykJCW10bXNyCShyZWcpCiAKIC5tYWNybyBJTlRFUlJVUFRfVFJBTVBPTElORSBpbnRubwogCkBAIC0xNjcsNDAgKzE2OSwyNCBAQAogI2VuZGlmCiAKIC8qCi0gKiBUaGlzIHRyYW1wb2xpbmUgYnJpbmdzIHVzIGJhY2sgdG8gYSByZWFsIG1vZGUgaGFuZGxlcgorICogQ2FsbCBrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2VudGVyIGluIHJlYWwgbW9kZQogICoKLSAqIElucHV0IFJlZ2lzdGVyczoKLSAqCi0gKiBSNSA9IFNSUjAKLSAqIFI2ID0gU1JSMQotICogTFIgPSByZWFsLW1vZGUgSVAKLSAqCisgKiBPbiBlbnRyeSwgcjQgY29udGFpbnMgdGhlIGd1ZXN0IHNoYWRvdyBNU1IKICAqLwotLmdsb2JhbCBrdm1wcGNfaGFuZGxlcl9sb3dtZW1fdHJhbXBvbGluZQota3ZtcHBjX2hhbmRsZXJfbG93bWVtX3RyYW1wb2xpbmU6CitfR0xPQkFMKGt2bXBwY19lbnRyeV90cmFtcG9saW5lKQorCW1mbXNyCXI1CisJTE9BRF9SRUdfQUREUihyNywga3ZtcHBjX2hhbmRsZXJfdHJhbXBvbGluZV9lbnRlcikKKwl0b3JlYWwocjcpCiAKLQltdHNycjAJcjUKKwlsaQlyOSwgTVNSX1JJCisJb3JpCXI5LCByOSwgTVNSX0VFCisJYW5kYwlyOSwgcjUsIHI5CS8qIENsZWFyIEVFIGFuZCBSSSBpbiBNU1IgdmFsdWUgKi8KKwlsaQlyNiwgTVNSX0lSIHwgTVNSX0RSCisJb3JpCXI2LCByNiwgTVNSX0VFCisJYW5kYwlyNiwgcjUsIHI2CS8qIENsZWFyIEVFLCBEUiBhbmQgSVIgaW4gTVNSIHZhbHVlICovCisJTVRNU1JfRUVSSShyOSkJCS8qIENsZWFyIEVFIGFuZCBSSSBpbiBNU1IgKi8KKwltdHNycjAJcjcJCS8qIGJlZm9yZSB3ZSBzZXQgc3JyMC8xICovCiAJbXRzcnIxCXI2Ci0JYmxyCi1rdm1wcGNfaGFuZGxlcl9sb3dtZW1fdHJhbXBvbGluZV9lbmQ6Ci0KLS8qCi0gKiBDYWxsIGEgZnVuY3Rpb24gaW4gcmVhbCBtb2RlCi0gKgotICogSW5wdXQgUmVnaXN0ZXJzOgotICoKLSAqIFIzID0gZnVuY3Rpb24KLSAqIFI0ID0gTVNSCi0gKiBSNSA9IHNjcmF0Y2ggcmVnaXN0ZXIKLSAqCi0gKi8KLV9HTE9CQUwoa3ZtcHBjX3JtY2FsbCkKLQlMT0FEX1JFR19JTU1FRElBVEUocjUsIE1TUl9OT0lSUSkKLQltdG1zcglyNQkJLyogRGlzYWJsZSByZWxvY2F0aW9uIGFuZCBpbnRlcnJ1cHRzLCBzbyBtdHNycgotCQkJCSAgIGRvZXNuJ3QgZ2V0IGludGVycnVwdGVkICovCi0Jc3luYwotCW10c3JyMAlyMwotCW10c3JyMQlyNAogCVJGSQogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szU18zMikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3NlZ21lbnQuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3NlZ21lbnQuUwppbmRleCBhZWQzMmU1Li4wNjc2YWUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19zZWdtZW50LlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3Nfc2VnbWVudC5TCkBAIC0yMyw2ICsyMyw3IEBACiAKICNkZWZpbmUgR0VUX1NIQURPV19WQ1BVKHJlZykgICAgXAogCW1yCXJlZywgcjEzCisjZGVmaW5lIE1UTVNSX0VFUkkocmVnKQkJbXRtc3JkCShyZWcpLDEKIAogI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szU18zMikKIApAQCAtMzAsNiArMzEsNyBAQAogCXRvcGh5cyhyZWcsIHIyKTsgICAgICAgCQkJXAogCWx3eiAgICAgcmVnLCAoVEhSRUFEICsgVEhSRUFEX0tWTV9TVkNQVSkocmVnKTsJXAogCXRvcGh5cyhyZWcsIHJlZykKKyNkZWZpbmUgTVRNU1JfRUVSSShyZWcpCQltdG1zcgkocmVnKQogCiAjZW5kaWYKIApAQCAtNTcsMTAgKzU5LDEyIEBACiAJLyogUmVxdWlyZWQgc3RhdGU6CiAJICoKIAkgKiBNU1IgPSB+SVJ8RFIKLQkgKiBSMTMgPSBQQUNBCiAJICogUjEgPSBob3N0IFIxCiAJICogUjIgPSBob3N0IFIyCi0JICogUjEwID0gZ3Vlc3QgTVNSCisJICogUjQgPSBndWVzdCBzaGFkb3cgTVNSCisJICogUjUgPSBub3JtYWwgaG9zdCBNU1IKKwkgKiBSNiA9IGN1cnJlbnQgaG9zdCBNU1IgKEVFLCBJUiwgRFIgb2ZmKQorCSAqIExSID0gaGlnaG1lbSBndWVzdCBleGl0IGNvZGUKIAkgKiBhbGwgb3RoZXIgdm9sYXRpbGUgR1BSUyA9IGZyZWUKIAkgKiBTVkNQVVtDUl0gPSBndWVzdCBDUgogCSAqIFNWQ1BVW1hFUl0gPSBndWVzdCBYRVIKQEAgLTcxLDE1ICs3NSwxNSBAQAogCS8qIHIzID0gc2hhZG93IHZjcHUgKi8KIAlHRVRfU0hBRE9XX1ZDUFUocjMpCiAKKwkvKiBTYXZlIGd1ZXN0IGV4aXQgaGFuZGxlciBhZGRyZXNzIGFuZCBNU1IgKi8KKwltZmxyCXIwCisJUFBDX1NUTAlyMCwgSFNUQVRFX1ZNSEFORExFUihyMykKKwlQUENfU1RMCXI1LCBIU1RBVEVfSE9TVF9NU1IocjMpCisKIAkvKiBTYXZlIFIxL1IyIGluIHRoZSBQQUNBICg2NC1iaXQpIG9yIHNoYWRvd192Y3B1ICgzMi1iaXQpICovCiAJUFBDX1NUTAlyMSwgSFNUQVRFX0hPU1RfUjEocjMpCiAJUFBDX1NUTAlyMiwgSFNUQVRFX0hPU1RfUjIocjMpCiAKLQkvKiBNb3ZlIFNSUjAgYW5kIFNSUjEgaW50byB0aGUgcmVzcGVjdGl2ZSByZWdzICovCi0JUFBDX0xMICByOSwgU1ZDUFVfUEMocjMpCi0JbXRzcnIwCXI5Ci0JbXRzcnIxCXIxMAotCiAJLyogQWN0aXZhdGUgZ3Vlc3QgbW9kZSwgc28gZmF1bHRzIGdldCBoYW5kbGVkIGJ5IEtWTSAqLwogCWxpCXIxMSwgS1ZNX0dVRVNUX01PREVfR1VFU1QKIAlzdGIJcjExLCBIU1RBVEVfSU5fR1VFU1QocjMpCkBAIC04NywxNyArOTEsNDYgQEAKIAkvKiBTd2l0Y2ggdG8gZ3Vlc3Qgc2VnbWVudC4gVGhpcyBpcyBzdWJhcmNoIHNwZWNpZmljLiAqLwogCUxPQURfR1VFU1RfU0VHTUVOVFMKIAorI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CisJLyogU29tZSBndWVzdHMgbWF5IG5lZWQgdG8gaGF2ZSBkY2J6IHNldCB0byAzMiBieXRlIGxlbmd0aC4KKwkgKgorCSAqIFVzdWFsbHkgd2UgZW5zdXJlIHRoYXQgYnkgcGF0Y2hpbmcgdGhlIGd1ZXN0J3MgaW5zdHJ1Y3Rpb25zCisJICogdG8gdHJhcCBvbiBkY2J6IGFuZCBlbXVsYXRlIGl0IGluIHRoZSBoeXBlcnZpc29yLgorCSAqCisJICogSWYgd2UgY2FuLCB3ZSBzaG91bGQgdGVsbCB0aGUgQ1BVIHRvIHVzZSAzMiBieXRlIGRjYnogdGhvdWdoLAorCSAqIGJlY2F1c2UgdGhhdCdzIGEgbG90IGZhc3Rlci4KKwkgKi8KKwlsYnoJcjAsIEhTVEFURV9SRVNUT1JFX0hJRDUocjMpCisJY21wd2kJcjAsIDAKKwliZXEJbm9fZGNiejMyX29uCisKKwltZnNwciAgIHIwLFNQUk5fSElENQorCW9yaSAgICAgcjAsIHIwLCAweDgwCQkvKiBYWFggSElENV9kY2J6MzIgPSAweDgwICovCisJbXRzcHIgICBTUFJOX0hJRDUscjAKK25vX2RjYnozMl9vbjoKKworI2VuZGlmIC8qIENPTkZJR19QUENfQk9PSzNTXzY0ICovCisKIAkvKiBFbnRlciBndWVzdCAqLwogCi0JUFBDX0xMCXI0LCBTVkNQVV9DVFIocjMpCi0JUFBDX0xMCXI1LCBTVkNQVV9MUihyMykKLQlsd3oJcjYsIFNWQ1BVX0NSKHIzKQotCWx3eglyNywgU1ZDUFVfWEVSKHIzKQorCVBQQ19MTAlyOCwgU1ZDUFVfQ1RSKHIzKQorCVBQQ19MTAlyOSwgU1ZDUFVfTFIocjMpCisJbHd6CXIxMCwgU1ZDUFVfQ1IocjMpCisJbHd6CXIxMSwgU1ZDUFVfWEVSKHIzKQogCi0JbXRjdHIJcjQKLQltdGxyCXI1Ci0JbXRjcglyNgotCW10eGVyCXI3CisJbXRjdHIJcjgKKwltdGxyCXI5CisJbXRjcglyMTAKKwltdHhlcglyMTEKKworCS8qIE1vdmUgU1JSMCBhbmQgU1JSMSBpbnRvIHRoZSByZXNwZWN0aXZlIHJlZ3MgKi8KKwlQUENfTEwgIHI5LCBTVkNQVV9QQyhyMykKKwkvKiBGaXJzdCBjbGVhciBSSSBpbiBvdXIgY3VycmVudCBNU1IgdmFsdWUgKi8KKwlsaQlyMCwgTVNSX1JJCisJYW5kYwlyNiwgcjYsIHIwCisJTVRNU1JfRUVSSShyNikKKwltdHNycjAJcjkKKwltdHNycjEJcjQKIAogCVBQQ19MTAlyMCwgU1ZDUFVfUjAocjMpCiAJUFBDX0xMCXIxLCBTVkNQVV9SMShyMykKQEAgLTIxMywxMSArMjQ2LDE2IEBACiAJYmVxCWxkX2xhc3RfaW5zdAogCWNtcHdpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9QUk9HUkFNCiAJYmVxCWxkX2xhc3RfaW5zdAorCWNtcHdpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMCisJYmVxCWxkX2xhc3RfcHJldl9pbnN0CiAJY21wd2kJcjEyLCBCT09LM1NfSU5URVJSVVBUX0FMSUdOTUVOVAogCWJlcS0JbGRfbGFzdF9pbnN0CiAKIAliCW5vX2xkX2xhc3RfaW5zdAogCitsZF9sYXN0X3ByZXZfaW5zdDoKKwlhZGRpCXIzLCByMywgLTQKKwogbGRfbGFzdF9pbnN0OgogCS8qIFNhdmUgb2ZmIHRoZSBndWVzdCBpbnN0cnVjdGlvbiB3ZSdyZSBhdCAqLwogCkBAIC0yNTQsNiArMjkyLDQzIEBACiAJLyogU3dpdGNoIGJhY2sgdG8gaG9zdCBNTVUgKi8KIAlMT0FEX0hPU1RfU0VHTUVOVFMKIAorI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CisKKwlsYnoJcjUsIEhTVEFURV9SRVNUT1JFX0hJRDUocjEzKQorCWNtcHdpCXI1LCAwCisJYmVxCW5vX2RjYnozMl9vZmYKKworCWxpCXI0LCAwCisJbWZzcHIgICByNSxTUFJOX0hJRDUKKwlybGRpbWkgIHI1LHI0LDYsNTYKKwltdHNwciAgIFNQUk5fSElENSxyNQorCitub19kY2J6MzJfb2ZmOgorCisjZW5kaWYgLyogQ09ORklHX1BQQ19CT09LM1NfNjQgKi8KKworCS8qCisJICogRm9yIHNvbWUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBjYWxsIHRoZSByZWFsIExpbnV4CisJICogaGFuZGxlciwgc28gaXQgY2FuIGRvIHdvcmsgZm9yIHVzLiBUaGlzIGhhcyB0byBoYXBwZW4KKwkgKiBhcyBpZiB0aGUgaW50ZXJydXB0IGFycml2ZWQgZnJvbSB0aGUga2VybmVsIHRob3VnaCwKKwkgKiBzbyBsZXQncyBmYWtlIGl0IGhlcmUgd2hlcmUgbW9zdCBzdGF0ZSBpcyByZXN0b3JlZC4KKwkgKgorCSAqIEhhdmluZyBzZXQgdXAgU1JSMC8xIHdpdGggdGhlIGFkZHJlc3Mgd2hlcmUgd2Ugd2FudAorCSAqIHRvIGNvbnRpbnVlIHdpdGggcmVsb2NhdGlvbiBvbiAocG90ZW50aWFsbHkgaW4gbW9kdWxlCisJICogc3BhY2UpLCB3ZSBlaXRoZXIganVzdCBnbyBzdHJhaWdodCB0aGVyZSB3aXRoIHJmaVtkXSwKKwkgKiBvciB3ZSBqdW1wIHRvIGFuIGludGVycnVwdCBoYW5kbGVyIHdpdGggYmN0ciBpZiB0aGVyZQorCSAqIGlzIGFuIGludGVycnVwdCB0byBiZSBoYW5kbGVkIGZpcnN0LiAgSW4gdGhlIGxhdHRlcgorCSAqIGNhc2UsIHRoZSByZmlbZF0gYXQgdGhlIGVuZCBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKwkgKiB3aWxsIGdldCB1cyBiYWNrIHRvIHdoZXJlIHdlIHdhbnQgdG8gY29udGludWUuCisJICovCisKKwljbXB3aQlyMTIsIEJPT0szU19JTlRFUlJVUFRfRVhURVJOQUwKKwliZXEJMWYKKwljbXB3aQlyMTIsIEJPT0szU19JTlRFUlJVUFRfREVDUkVNRU5URVIKKwliZXEJMWYKKwljbXB3aQlyMTIsIEJPT0szU19JTlRFUlJVUFRfUEVSRk1PTgorMToJbXRjdHIJcjEyCisKIAkvKiBSZWdpc3RlciB1c2FnZSBhdCB0aGlzIHBvaW50OgogCSAqCiAJICogUjEgICAgICAgPSBob3N0IFIxCkBAIC0yNjQsMTMgKzMzOSwxNSBAQAogCSAqCiAJICovCiAKLQkvKiBSRkkgaW50byB0aGUgaGlnaG1lbSBoYW5kbGVyICovCi0JbWZtc3IJcjcKLQlvcmkJcjcsIHI3LCBNU1JfSVJ8TVNSX0RSfE1TUl9SSXxNU1JfTUUJLyogRW5hYmxlIHBhZ2luZyAqLwotCW10c3JyMQlyNwotCS8qIExvYWQgaGlnaG1lbSBoYW5kbGVyIGFkZHJlc3MgKi8KKwlQUENfTEwJcjYsIEhTVEFURV9IT1NUX01TUihyMTMpCiAJUFBDX0xMCXI4LCBIU1RBVEVfVk1IQU5ETEVSKHIxMykKKworCS8qIFJlc3RvcmUgaG9zdCBtc3IgLT4gU1JSMSAqLworCW10c3JyMQlyNgorCS8qIExvYWQgaGlnaG1lbSBoYW5kbGVyIGFkZHJlc3MgKi8KIAltdHNycjAJcjgKIAorCS8qIFJGSSBpbnRvIHRoZSBoaWdobWVtIGhhbmRsZXIsIG9yIGp1bXAgdG8gaW50ZXJydXB0IGhhbmRsZXIgKi8KKwliZXFjdHIKIAlSRkkKIGt2bXBwY19oYW5kbGVyX3RyYW1wb2xpbmVfZXhpdF9lbmQ6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMKaW5kZXggZWU0NWZhMC4uYmI2Yzk4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYwpAQCAtMzE2LDYgKzMxNiwxMSBAQAogewogCWludCByZXQ7CiAKKwlpZiAoIXZjcHUtPmFyY2guc2FuZSkgeworCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVEVSTkFMX0VSUk9SOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWt2bV9ndWVzdF9lbnRlcigpOwogCXJldCA9IF9fa3ZtcHBjX3ZjcHVfcnVuKGt2bV9ydW4sIHZjcHUpOwpAQCAtNjE4LDYgKzYyMyw3IEBACiBpbnQga3ZtX2FyY2hfdmNwdV9zZXR1cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJaW50IGk7CisJaW50IHI7CiAKIAl2Y3B1LT5hcmNoLnBjID0gMDsKIAl2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyID0gMDsKQEAgLTYzNCw3ICs2NDAsOSBAQAogCiAJa3ZtcHBjX2luaXRfdGltaW5nX3N0YXRzKHZjcHUpOwogCi0JcmV0dXJuIGt2bXBwY19jb3JlX3ZjcHVfc2V0dXAodmNwdSk7CisJciA9IGt2bXBwY19jb3JlX3ZjcHVfc2V0dXAodmNwdSk7CisJa3ZtcHBjX3Nhbml0eV9jaGVjayh2Y3B1KTsKKwlyZXR1cm4gcjsKIH0KIAogaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfZ2V0X3JlZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDAuYyBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jCmluZGV4IDc5N2E3NDQuLjI2ZDIwOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jCkBAIC03Myw2ICs3Myw4IEBACiAJLyogU2luY2UgYm9va2Uga3ZtIG9ubHkgc3VwcG9ydCBvbmUgY29yZSwgdXBkYXRlIGFsbCB2Y3B1cycgUElSIHRvIDAgKi8KIAl2Y3B1LT52Y3B1X2lkID0gMDsKIAorCXZjcHUtPmFyY2guY3B1X3R5cGUgPSBLVk1fQ1BVX0U1MDBWMjsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYyBiL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jCmluZGV4IGExMDdjOWIuLmVmYmY5YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTM5LDEyICszOCw4IEBACiAKIGludCBrdm1fYXJjaF92Y3B1X3J1bm5hYmxlKHN0cnVjdCBrdm1fdmNwdSAqdikKIHsKLSNpZm5kZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSFYKIAlyZXR1cm4gISh2LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX1dFKSB8fAogCSAgICAgICAhISh2LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9ucyk7Ci0jZWxzZQotCXJldHVybiAhKHYtPmFyY2guY2VkZWQpIHx8ICEhKHYtPmFyY2gucGVuZGluZ19leGNlcHRpb25zKTsKLSNlbmRpZgogfQogCiBpbnQga3ZtcHBjX2t2bV9wdihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC05NSw2ICs5MCwzMSBAQAogCXJldHVybiByOwogfQogCitpbnQga3ZtcHBjX3Nhbml0eV9jaGVjayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaW50IHIgPSBmYWxzZTsKKworCS8qIFdlIGhhdmUgdG8ga25vdyB3aGF0IENQVSB0byB2aXJ0dWFsaXplICovCisJaWYgKCF2Y3B1LT5hcmNoLnB2cikKKwkJZ290byBvdXQ7CisKKwkvKiBQQVBSIG9ubHkgd29ya3Mgd2l0aCBib29rM3NfNjQgKi8KKwlpZiAoKHZjcHUtPmFyY2guY3B1X3R5cGUgIT0gS1ZNX0NQVV8zU182NCkgJiYgdmNwdS0+YXJjaC5wYXByX2VuYWJsZWQpCisJCWdvdG8gb3V0OworCisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSFYKKwkvKiBIViBLVk0gY2FuIG9ubHkgZG8gUEFQUiBtb2RlIGZvciBub3cgKi8KKwlpZiAoIXZjcHUtPmFyY2gucGFwcl9lbmFibGVkKQorCQlnb3RvIG91dDsKKyNlbmRpZgorCisJciA9IHRydWU7CisKK291dDoKKwl2Y3B1LT5hcmNoLnNhbmUgPSByOworCXJldHVybiByID8gMCA6IC1FSU5WQUw7Cit9CisKIGludCBrdm1wcGNfZW11bGF0ZV9tbWlvKHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAllbnVtIGVtdWxhdGlvbl9yZXN1bHQgZXI7CkBAIC0xODgsNiArMjA4LDggQEAKIAljYXNlIEtWTV9DQVBfUFBDX0JPT0tFX1NSRUdTOgogI2Vsc2UKIAljYXNlIEtWTV9DQVBfUFBDX1NFR1NUQVRFOgorCWNhc2UgS1ZNX0NBUF9QUENfSElPUjoKKwljYXNlIEtWTV9DQVBfUFBDX1BBUFI6CiAjZW5kaWYKIAljYXNlIEtWTV9DQVBfUFBDX1VOU0VUX0lSUToKIAljYXNlIEtWTV9DQVBfUFBDX0lSUV9MRVZFTDoKQEAgLTI1OCw2ICsyODAsNyBAQAogewogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKIAl2Y3B1ID0ga3ZtcHBjX2NvcmVfdmNwdV9jcmVhdGUoa3ZtLCBpZCk7CisJdmNwdS0+YXJjaC53cXAgPSAmdmNwdS0+d3E7CiAJaWYgKCFJU19FUlIodmNwdSkpCiAJCWt2bXBwY19jcmVhdGVfdmNwdV9kZWJ1Z2ZzKHZjcHUsIGlkKTsKIAlyZXR1cm4gdmNwdTsKQEAgLTI4OSw4ICszMTIsOCBAQAogCiAJa3ZtcHBjX2NvcmVfcXVldWVfZGVjKHZjcHUpOwogCi0JaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnZjcHUtPndxKSkgewotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnZjcHUtPndxKTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSh2Y3B1LT5hcmNoLndxcCkpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHZjcHUtPmFyY2gud3FwKTsKIAkJdmNwdS0+c3RhdC5oYWx0X3dha2V1cCsrOwogCX0KIH0KQEAgLTU0MywxMyArNTY2LDE1IEBACiAKIGludCBrdm1fdmNwdV9pb2N0bF9pbnRlcnJ1cHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2ludGVycnVwdCAqaXJxKQogewotCWlmIChpcnEtPmlycSA9PSBLVk1fSU5URVJSVVBUX1VOU0VUKQorCWlmIChpcnEtPmlycSA9PSBLVk1fSU5URVJSVVBUX1VOU0VUKSB7CiAJCWt2bXBwY19jb3JlX2RlcXVldWVfZXh0ZXJuYWwodmNwdSwgaXJxKTsKLQllbHNlCi0JCWt2bXBwY19jb3JlX3F1ZXVlX2V4dGVybmFsKHZjcHUsIGlycSk7CisJCXJldHVybiAwOworCX0KIAotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ2Y3B1LT53cSkpIHsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2Y3B1LT53cSk7CisJa3ZtcHBjX2NvcmVfcXVldWVfZXh0ZXJuYWwodmNwdSwgaXJxKTsKKworCWlmICh3YWl0cXVldWVfYWN0aXZlKHZjcHUtPmFyY2gud3FwKSkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUodmNwdS0+YXJjaC53cXApOwogCQl2Y3B1LT5zdGF0LmhhbHRfd2FrZXVwKys7CiAJfSBlbHNlIGlmICh2Y3B1LT5jcHUgIT0gLTEpIHsKIAkJc21wX3NlbmRfcmVzY2hlZHVsZSh2Y3B1LT5jcHUpOwpAQCAtNTcxLDExICs1OTYsMTggQEAKIAkJciA9IDA7CiAJCXZjcHUtPmFyY2gub3NpX2VuYWJsZWQgPSB0cnVlOwogCQlicmVhazsKKwljYXNlIEtWTV9DQVBfUFBDX1BBUFI6CisJCXIgPSAwOworCQl2Y3B1LT5hcmNoLnBhcHJfZW5hYmxlZCA9IHRydWU7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXIgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CiAKKwlpZiAoIXIpCisJCXIgPSBrdm1wcGNfc2FuaXR5X2NoZWNrKHZjcHUpOworCiAJcmV0dXJuIHI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvY2hlY2tzdW1fd3JhcHBlcnNfNjQuYyBiL2FyY2gvcG93ZXJwYy9saWIvY2hlY2tzdW1fd3JhcHBlcnNfNjQuYwppbmRleCA3NjliODE3Li4wOGUzYTMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL2NoZWNrc3VtX3dyYXBwZXJzXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9jaGVja3N1bV93cmFwcGVyc182NC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogQXV0aG9yOiBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+CiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2RldnJlcy5jIGIvYXJjaC9wb3dlcnBjL2xpYi9kZXZyZXMuYwppbmRleCBlOTE2MTVhLi44ZGY1NWZjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL2RldnJlcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvZGV2cmVzLmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4JLyogZGV2cmVzXyooKSwgZGV2bV9pb3JlbWFwX3JlbGVhc2UoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBpb3JlbWFwX3Byb3QoKSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBFWFBPUlRfU1lNQk9MKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4JLyogRVhQT1JUX1NZTUJPTCgpICovCiAKIC8qKgogICogZGV2bV9pb3JlbWFwX3Byb3QgLSBNYW5hZ2VkIGlvcmVtYXBfcHJvdCgpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2xvY2tzLmMgYi9hcmNoL3Bvd2VycGMvbGliL2xvY2tzLmMKaW5kZXggOWI4MTgyZS4uYTZlYmJhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9sb2Nrcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvbG9ja3MuYwpAQCAtMTQsNyArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9yaGVhcC5jIGIvYXJjaC9wb3dlcnBjL2xpYi9yaGVhcC5jCmluZGV4IDQ1OTA3YzEuLmExMDYwYTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvcmhlYXAuYworKysgYi9hcmNoL3Bvd2VycGMvbGliL3JoZWFwLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbWF0aF9lZnAuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tYXRoX2VmcC5jCmluZGV4IDYyMjc5MjAuLmE3M2YwODggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tYXRoX2VmcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tYXRoX2VmcC5jCkBAIC0xNzEsMTAgKzE3MSw2IEBACiAJY2FzZSBFRkROQUJTOglyZXQgPSBYQTsJYnJlYWs7CiAJY2FzZSBFRkRORUc6CXJldCA9IFhBOwlicmVhazsKIAljYXNlIEVGRFNVQjoJcmV0ID0gQUI7CWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJcbk9vb3BzISBTUEUgaW5zdHJ1Y3Rpb24gbm8gdHlwZSBmb3VuZC4iKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJcbmluc3QgY29kZTogJTA4bHhcbiIsIHNwZWluc24pOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xOTUsNyArMTkxLDcgQEAKIAogCXR5cGUgPSBpbnNuX3R5cGUoc3BlaW5zbik7CiAJaWYgKHR5cGUgPT0gTk9UWVBFKQotCQlyZXR1cm4gLUVOT1NZUzsKKwkJZ290byBpbGxlZ2FsOwogCiAJZnVuYyA9IHNwZWluc24gJiAweDdmZjsKIAlmYyA9IChzcGVpbnNuID4+IDIxKSAmIDB4MWY7CkBAIC0yMTIsMTIgKzIwOCwxMCBAQAogCiAJX19GUFVfRlBTQ1IgPSBtZnNwcihTUFJOX1NQRUZTQ1IpOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInNwZWluc246JTA4bHggc3BlZnNjcjolMDhseFxuIiwgc3BlaW5zbiwgX19GUFVfRlBTQ1IpOwotCXByaW50aygidmM6ICUwOHggICUwOHhcbiIsIHZjLndwWzBdLCB2Yy53cFsxXSk7Ci0JcHJpbnRrKCJ2YTogJTA4eCAgJTA4eFxuIiwgdmEud3BbMF0sIHZhLndwWzFdKTsKLQlwcmludGsoInZiOiAlMDh4ICAlMDh4XG4iLCB2Yi53cFswXSwgdmIud3BbMV0pOwotI2VuZGlmCisJcHJfZGVidWcoInNwZWluc246JTA4bHggc3BlZnNjcjolMDhseFxuIiwgc3BlaW5zbiwgX19GUFVfRlBTQ1IpOworCXByX2RlYnVnKCJ2YzogJTA4eCAgJTA4eFxuIiwgdmMud3BbMF0sIHZjLndwWzFdKTsKKwlwcl9kZWJ1ZygidmE6ICUwOHggICUwOHhcbiIsIHZhLndwWzBdLCB2YS53cFsxXSk7CisJcHJfZGVidWcoInZiOiAlMDh4ICAlMDh4XG4iLCB2Yi53cFswXSwgdmIud3BbMV0pOwogCiAJc3dpdGNoIChzcmMpIHsKIAljYXNlIFNQRlA6IHsKQEAgLTIzNSwxMCArMjI5LDggQEAKIAkJCWJyZWFrOwogCQl9CiAKLSNpZmRlZiBERUJVRwotCQlwcmludGsoIlNBOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTQV9zLCBTQV9mLCBTQV9lLCBTQV9jKTsKLQkJcHJpbnRrKCJTQjogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwgU0JfcywgU0JfZiwgU0JfZSwgU0JfYyk7Ci0jZW5kaWYKKwkJcHJfZGVidWcoIlNBOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTQV9zLCBTQV9mLCBTQV9lLCBTQV9jKTsKKwkJcHJfZGVidWcoIlNCOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTQl9zLCBTQl9mLCBTQl9lLCBTQl9jKTsKIAogCQlzd2l0Y2ggKGZ1bmMpIHsKIAkJY2FzZSBFRlNBQlM6CkBAIC0zMDUsMTAgKzI5NywxMCBAQAogCQkJRlBfREVDTF9EKERCKTsKIAkJCUZQX0NMRUFSX0VYQ0VQVElPTlM7CiAJCQlGUF9VTlBBQ0tfRFAoREIsIHZiLmRwKTsKLSNpZmRlZiBERUJVRwotCQkJcHJpbnRrKCJEQjogJWxkICUwOGx4ICUwOGx4ICVsZCAoJWxkKVxuIiwKKworCQkJcHJfZGVidWcoIkRCOiAlbGQgJTA4bHggJTA4bHggJWxkICglbGQpXG4iLAogCQkJCQlEQl9zLCBEQl9mMSwgREJfZjAsIERCX2UsIERCX2MpOwotI2VuZGlmCisKIAkJCUZQX0NPTlYoUywgRCwgMSwgMiwgU1IsIERCKTsKIAkJCWdvdG8gcGFja19zOwogCQl9CkBAIC0zMzIsOSArMzI0LDggQEAKIAkJYnJlYWs7CiAKIHBhY2tfczoKLSNpZmRlZiBERUJVRwotCQlwcmludGsoIlNSOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTUl9zLCBTUl9mLCBTUl9lLCBTUl9jKTsKLSNlbmRpZgorCQlwcl9kZWJ1ZygiU1I6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsIFNSX3MsIFNSX2YsIFNSX2UsIFNSX2MpOworCiAJCUZQX1BBQ0tfU1AodmMud3AgKyAxLCBTUik7CiAJCWdvdG8gdXBkYXRlX3JlZ3M7CiAKQEAgLTM2NSwxMiArMzU2LDEwIEBACiAJCQlicmVhazsKIAkJfQogCi0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJEQTogJWxkICUwOGx4ICUwOGx4ICVsZCAoJWxkKVxuIiwKKwkJcHJfZGVidWcoIkRBOiAlbGQgJTA4bHggJTA4bHggJWxkICglbGQpXG4iLAogCQkJCURBX3MsIERBX2YxLCBEQV9mMCwgREFfZSwgREFfYyk7Ci0JCXByaW50aygiREI6ICVsZCAlMDhseCAlMDhseCAlbGQgKCVsZClcbiIsCisJCXByX2RlYnVnKCJEQjogJWxkICUwOGx4ICUwOGx4ICVsZCAoJWxkKVxuIiwKIAkJCQlEQl9zLCBEQl9mMSwgREJfZjAsIERCX2UsIERCX2MpOwotI2VuZGlmCiAKIAkJc3dpdGNoIChmdW5jKSB7CiAJCWNhc2UgRUZEQUJTOgpAQCAtNDM4LDEwICs0MjcsMTAgQEAKIAkJCUZQX0RFQ0xfUyhTQik7CiAJCQlGUF9DTEVBUl9FWENFUFRJT05TOwogCQkJRlBfVU5QQUNLX1NQKFNCLCB2Yi53cCArIDEpOwotI2lmZGVmIERFQlVHCi0JCQlwcmludGsoIlNCOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLAorCisJCQlwcl9kZWJ1ZygiU0I6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsCiAJCQkJCVNCX3MsIFNCX2YsIFNCX2UsIFNCX2MpOwotI2VuZGlmCisKIAkJCUZQX0NPTlYoRCwgUywgMiwgMSwgRFIsIFNCKTsKIAkJCWdvdG8gcGFja19kOwogCQl9CkBAIC00NzEsMTAgKzQ2MCw5IEBACiAJCWJyZWFrOwogCiBwYWNrX2Q6Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJEUjogJWxkICUwOGx4ICUwOGx4ICVsZCAoJWxkKVxuIiwKKwkJcHJfZGVidWcoIkRSOiAlbGQgJTA4bHggJTA4bHggJWxkICglbGQpXG4iLAogCQkJCURSX3MsIERSX2YxLCBEUl9mMCwgRFJfZSwgRFJfYyk7Ci0jZW5kaWYKKwogCQlGUF9QQUNLX0RQKHZjLmRwLCBEUik7CiAJCWdvdG8gdXBkYXRlX3JlZ3M7CiAKQEAgLTUxMSwxMiArNDk5LDE0IEBACiAJCQlicmVhazsKIAkJfQogCi0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJTQTA6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsIFNBMF9zLCBTQTBfZiwgU0EwX2UsIFNBMF9jKTsKLQkJcHJpbnRrKCJTQTE6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsIFNBMV9zLCBTQTFfZiwgU0ExX2UsIFNBMV9jKTsKLQkJcHJpbnRrKCJTQjA6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsIFNCMF9zLCBTQjBfZiwgU0IwX2UsIFNCMF9jKTsKLQkJcHJpbnRrKCJTQjE6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsIFNCMV9zLCBTQjFfZiwgU0IxX2UsIFNCMV9jKTsKLSNlbmRpZgorCQlwcl9kZWJ1ZygiU0EwOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLAorCQkJCVNBMF9zLCBTQTBfZiwgU0EwX2UsIFNBMF9jKTsKKwkJcHJfZGVidWcoIlNBMTogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwKKwkJCQlTQTFfcywgU0ExX2YsIFNBMV9lLCBTQTFfYyk7CisJCXByX2RlYnVnKCJTQjA6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsCisJCQkJU0IwX3MsIFNCMF9mLCBTQjBfZSwgU0IwX2MpOworCQlwcl9kZWJ1ZygiU0IxOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLAorCQkJCVNCMV9zLCBTQjFfZiwgU0IxX2UsIFNCMV9jKTsKIAogCQlzd2l0Y2ggKGZ1bmMpIHsKIAkJY2FzZSBFVkZTQUJTOgpAQCAtNjA1LDEwICs1OTUsMTEgQEAKIAkJYnJlYWs7CiAKIHBhY2tfdnM6Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJTUjA6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsIFNSMF9zLCBTUjBfZiwgU1IwX2UsIFNSMF9jKTsKLQkJcHJpbnRrKCJTUjE6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsIFNSMV9zLCBTUjFfZiwgU1IxX2UsIFNSMV9jKTsKLSNlbmRpZgorCQlwcl9kZWJ1ZygiU1IwOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLAorCQkJCVNSMF9zLCBTUjBfZiwgU1IwX2UsIFNSMF9jKTsKKwkJcHJfZGVidWcoIlNSMTogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwKKwkJCQlTUjFfcywgU1IxX2YsIFNSMV9lLCBTUjFfYyk7CisKIAkJRlBfUEFDS19TUCh2Yy53cCwgU1IwKTsKIAkJRlBfUEFDS19TUCh2Yy53cCArIDEsIFNSMSk7CiAJCWdvdG8gdXBkYXRlX3JlZ3M7CkBAIC02NDYsMTQgKzYzNywxMiBAQAogCWN1cnJlbnQtPnRocmVhZC5ldnJbZmNdID0gdmMud3BbMF07CiAJcmVncy0+Z3ByW2ZjXSA9IHZjLndwWzFdOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoImNjciA9ICUwOGx4XG4iLCByZWdzLT5jY3IpOwotCXByaW50aygiY3VyIGV4Y2VwdGlvbnMgPSAlMDh4IHNwZWZzY3IgPSAlMDhseFxuIiwKKwlwcl9kZWJ1ZygiY2NyID0gJTA4bHhcbiIsIHJlZ3MtPmNjcik7CisJcHJfZGVidWcoImN1ciBleGNlcHRpb25zID0gJTA4eCBzcGVmc2NyID0gJTA4bHhcbiIsCiAJCQlGUF9DVVJfRVhDRVBUSU9OUywgX19GUFVfRlBTQ1IpOwotCXByaW50aygidmM6ICUwOHggICUwOHhcbiIsIHZjLndwWzBdLCB2Yy53cFsxXSk7Ci0JcHJpbnRrKCJ2YTogJTA4eCAgJTA4eFxuIiwgdmEud3BbMF0sIHZhLndwWzFdKTsKLQlwcmludGsoInZiOiAlMDh4ICAlMDh4XG4iLCB2Yi53cFswXSwgdmIud3BbMV0pOwotI2VuZGlmCisJcHJfZGVidWcoInZjOiAlMDh4ICAlMDh4XG4iLCB2Yy53cFswXSwgdmMud3BbMV0pOworCXByX2RlYnVnKCJ2YTogJTA4eCAgJTA4eFxuIiwgdmEud3BbMF0sIHZhLndwWzFdKTsKKwlwcl9kZWJ1ZygidmI6ICUwOHggICUwOHhcbiIsIHZiLndwWzBdLCB2Yi53cFsxXSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtNjYxLDkgKzY1MCw3IEBACiAJaWYgKGhhdmVfZTUwMF9jcHVfYTAwNV9lcnJhdHVtKSB7CiAJCS8qIGFjY29yZGluZyB0byBlNTAwIGNwdSBhMDA1IGVycmF0dW0sIHJlaXNzdWUgZWZwIGluc3QgKi8KIAkJcmVncy0+bmlwIC09IDQ7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJlLWlzc3VlIGVmcCBpbnN0OiAlMDhseFxuIiwgc3BlaW5zbik7Ci0jZW5kaWYKKwkJcHJfZGVidWcoInJlLWlzc3VlIGVmcCBpbnN0OiAlMDhseFxuIiwgc3BlaW5zbik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNjg1LDEzICs2NzIsMjAgQEAKIAl0eXBlID0gaW5zbl90eXBlKHNwZWluc24gJiAweDdmZik7CiAJaWYgKHR5cGUgPT0gWENSKSByZXR1cm4gLUVOT1NZUzsKIAorCV9fRlBVX0ZQU0NSID0gbWZzcHIoU1BSTl9TUEVGU0NSKTsKKwlwcl9kZWJ1Zygic3BlaW5zbjolMDhseCBzcGVmc2NyOiUwOGx4XG4iLCBzcGVpbnNuLCBfX0ZQVV9GUFNDUik7CisKKwkvKiBObyBuZWVkIHRvIHJvdW5kIGlmIHRoZSByZXN1bHQgaXMgZXhhY3QgKi8KKwlpZiAoIShfX0ZQVV9GUFNDUiAmIEZQX0VYX0lORVhBQ1QpKQorCQlyZXR1cm4gMDsKKwogCWZjID0gKHNwZWluc24gPj4gMjEpICYgMHgxZjsKIAlzX2xvID0gcmVncy0+Z3ByW2ZjXSAmIFNJR05fQklUX1M7CiAJc19oaSA9IGN1cnJlbnQtPnRocmVhZC5ldnJbZmNdICYgU0lHTl9CSVRfUzsKIAlmZ3ByLndwWzBdID0gY3VycmVudC0+dGhyZWFkLmV2cltmY107CiAJZmdwci53cFsxXSA9IHJlZ3MtPmdwcltmY107CiAKLQlfX0ZQVV9GUFNDUiA9IG1mc3ByKFNQUk5fU1BFRlNDUik7CisJcHJfZGVidWcoInJvdW5kIGZncHI6ICUwOHggICUwOHhcbiIsIGZncHIud3BbMF0sIGZncHIud3BbMV0pOwogCiAJc3dpdGNoICgoc3BlaW5zbiA+PiA1KSAmIDB4NykgewogCS8qIFNpbmNlIFNQRSBpbnN0cnVjdGlvbnMgb24gRTUwMCBjb3JlIGNhbiBoYW5kbGUgcm91bmQgdG8gbmVhcmVzdApAQCAtNzMxLDYgKzcyNSw4IEBACiAJY3VycmVudC0+dGhyZWFkLmV2cltmY10gPSBmZ3ByLndwWzBdOwogCXJlZ3MtPmdwcltmY10gPSBmZ3ByLndwWzFdOwogCisJcHJfZGVidWcoIiAgdG8gZmdwcjogJTA4eCAgJTA4eFxuIiwgZmdwci53cFswXSwgZmdwci53cFsxXSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCmluZGV4IGJkY2E0NmUuLjk5MWVlODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKQEAgLTI5LDYgKzI5LDcgQEAKIGlmZXEgKCQoQ09ORklHX0hVR0VUTEJfUEFHRSkseSkKIG9iai15CQkJCSs9IGh1Z2V0bGJwYWdlLm8KIG9iai0kKENPTkZJR19QUENfU1REX01NVV82NCkJKz0gaHVnZXRsYnBhZ2UtaGFzaDY0Lm8KK29iai0kKENPTkZJR19QUENfQk9PSzNFX01NVSkJKz0gaHVnZXRsYnBhZ2UtYm9vazNlLm8KIGVuZGlmCiBvYmotJChDT05GSUdfUFBDX1NVQlBBR0VfUFJPVCkJKz0gc3VicGFnZS1wcm90Lm8KIG9iai0kKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpICs9IGRtYS1ub25jb2hlcmVudC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZG1hLW5vbmNvaGVyZW50LmMgYi9hcmNoL3Bvd2VycGMvbW0vZG1hLW5vbmNvaGVyZW50LmMKaW5kZXggYjQyZjc2Yy4uMzI5YmUzNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2RtYS1ub25jb2hlcmVudC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9kbWEtbm9uY29oZXJlbnQuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKaW5kZXggZjc4MDJjOC4uNjZhNmZkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jCkBAIC0xMDEsMTcgKzEwMSwxNyBAQAogCiAvKgogICogU2V0IHVwIGEgdmFyaWFibGUtc2l6ZSBUTEIgZW50cnkgKHRsYmNhbSkuIFRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgY2hlY2tlZDsKLSAqIGluIHBhcnRpY3VsYXIgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgNCBiZXR3ZWVuIDRrIGFuZCAyNTZNIChvciAxRywgZm9yIGNwdXMKLSAqIHRoYXQgc3VwcG9ydCBleHRlbmRlZCBwYWdlIHNpemVzKS4gIE5vdGUgdGhhdCB3aGlsZSBzb21lIGNwdXMgc3VwcG9ydCBhCi0gKiBwYWdlIHNpemUgb2YgNEcsIHdlIGRvbid0IGFsbG93IGl0cyB1c2UgaGVyZS4KKyAqIGluIHBhcnRpY3VsYXIgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgNCBiZXR3ZWVuIDRrIGFuZCB0aGUgbWF4IHN1cHBvcnRlZCBieQorICogYW4gaW1wbGVtZW50YXRpb247IG1heCBtYXkgZnVydGhlciBiZSBsaW1pdGVkIGJ5IHdoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGluCisgKiBhbiB1bnNpZ25lZCBsb25nIChmb3IgZXhhbXBsZSwgMzItYml0IGltcGxlbWVudGF0aW9ucyBjYW5ub3Qgc3VwcG9ydCBhIDRHQgorICogc2l6ZSkuCiAgKi8KIHN0YXRpYyB2b2lkIHNldHRsYmNhbShpbnQgaW5kZXgsIHVuc2lnbmVkIGxvbmcgdmlydCwgcGh5c19hZGRyX3QgcGh5cywKIAkJdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBpbnQgcGlkKQogewotCXVuc2lnbmVkIGludCB0c2l6ZSwgbHo7CisJdW5zaWduZWQgaW50IHRzaXplOwogCi0JYXNtIChQUENfQ05UTFpMICIlMCwlMSIgOiAiPXIiIChseikgOiAiciIgKHNpemUpKTsKLQl0c2l6ZSA9IDIxIC0gbHo7CisJdHNpemUgPSBfX2lsb2cyKHNpemUpIC0gMTA7CiAKICNpZmRlZiBDT05GSUdfU01QCiAJaWYgKChmbGFncyAmIF9QQUdFX05PX0NBQ0hFKSA9PSAwKQpAQCAtMTQ2LDI5ICsxNDYsMzYgQEAKIAlsb2FkY2FtX2VudHJ5KGluZGV4KTsKIH0KIAordW5zaWduZWQgbG9uZyBjYWxjX2NhbV9zeih1bnNpZ25lZCBsb25nIHJhbSwgdW5zaWduZWQgbG9uZyB2aXJ0LAorCQkJICBwaHlzX2FkZHJfdCBwaHlzKQoreworCXVuc2lnbmVkIGludCBjYW1zaXplID0gX19pbG9nMihyYW0pICYgfjFVOworCXVuc2lnbmVkIGludCBhbGlnbiA9IF9fZmZzKHZpcnQgfCBwaHlzKSAmIH4xVTsKKwl1bnNpZ25lZCBsb25nIG1heF9jYW0gPSAobWZzcHIoU1BSTl9UTEIxQ0ZHKSA+PiAxNikgJiAweGY7CisKKwkvKiBDb252ZXJ0ICg0Xm1heCkga0IgdG8gKDJebWF4KSBieXRlcyAqLworCW1heF9jYW0gPSBtYXhfY2FtICogMiArIDEwOworCisJaWYgKGNhbXNpemUgPiBhbGlnbikKKwkJY2Ftc2l6ZSA9IGFsaWduOworCWlmIChjYW1zaXplID4gbWF4X2NhbSkKKwkJY2Ftc2l6ZSA9IG1heF9jYW07CisKKwlyZXR1cm4gMVVMIDw8IGNhbXNpemU7Cit9CisKIHVuc2lnbmVkIGxvbmcgbWFwX21lbV9pbl9jYW1zKHVuc2lnbmVkIGxvbmcgcmFtLCBpbnQgbWF4X2NhbV9pZHgpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyB2aXJ0ID0gUEFHRV9PRkZTRVQ7CiAJcGh5c19hZGRyX3QgcGh5cyA9IG1lbXN0YXJ0X2FkZHI7CiAJdW5zaWduZWQgbG9uZyBhbW91bnRfbWFwcGVkID0gMDsKLQl1bnNpZ25lZCBsb25nIG1heF9jYW0gPSAobWZzcHIoU1BSTl9UTEIxQ0ZHKSA+PiAxNikgJiAweGY7Ci0KLQkvKiBDb252ZXJ0ICg0Xm1heCkga0IgdG8gKDJebWF4KSBieXRlcyAqLwotCW1heF9jYW0gPSBtYXhfY2FtICogMiArIDEwOwogCiAJLyogQ2FsY3VsYXRlIENBTSB2YWx1ZXMgKi8KIAlmb3IgKGkgPSAwOyByYW0gJiYgaSA8IG1heF9jYW1faWR4OyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGNhbXNpemUgPSBfX2lsb2cyKHJhbSkgJiB+MVU7Ci0JCXVuc2lnbmVkIGludCBhbGlnbiA9IF9fZmZzKHZpcnQgfCBwaHlzKSAmIH4xVTsKIAkJdW5zaWduZWQgbG9uZyBjYW1fc3o7CiAKLQkJaWYgKGNhbXNpemUgPiBhbGlnbikKLQkJCWNhbXNpemUgPSBhbGlnbjsKLQkJaWYgKGNhbXNpemUgPiBtYXhfY2FtKQotCQkJY2Ftc2l6ZSA9IG1heF9jYW07Ci0KLQkJY2FtX3N6ID0gMVVMIDw8IGNhbXNpemU7CisJCWNhbV9zeiA9IGNhbGNfY2FtX3N6KHJhbSwgdmlydCwgcGh5cyk7CiAJCXNldHRsYmNhbShpLCB2aXJ0LCBwaHlzLCBjYW1fc3osIFBBR0VfS0VSTkVMX1gsIDApOwogCiAJCXJhbSAtPSBjYW1fc3o7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZ3VwLmMgYi9hcmNoL3Bvd2VycGMvbW0vZ3VwLmMKaW5kZXggZmVjMTMyMC4uZDdlZmRiZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2d1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9ndXAuYwpAQCAtMTYsMTYgKzE2LDYgQEAKIAogI2lmZGVmIF9fSEFWRV9BUkNIX1BURV9TUEVDSUFMCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfaHVnZV9wYWdlX3RhaWwoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JLyoKLQkgKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCgpIGNhbm5vdCBydW4KLQkgKiBmcm9tIHVuZGVyIHVzLgotCSAqLwotCVZNX0JVR19PTihhdG9taWNfcmVhZCgmcGFnZS0+X2NvdW50KSA8IDApOwotCWF0b21pY19pbmMoJnBhZ2UtPl9jb3VudCk7Ci19Ci0KIC8qCiAgKiBUaGUgcGVyZm9ybWFuY2UgY3JpdGljYWwgbGVhZiBmdW5jdGlvbnMgYXJlIG1hZGUgbm9pbmxpbmUgb3RoZXJ3aXNlIGdjYwogICogaW5saW5lcyBldmVyeXRoaW5nIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gd2hpY2ggcmVzdWx0cyBpbiB0b28gbXVjaApAQCAtNTcsOCArNDcsNiBAQAogCQkJcHV0X3BhZ2UocGFnZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlpZiAoUGFnZVRhaWwocGFnZSkpCi0JCQlnZXRfaHVnZV9wYWdlX3RhaWwocGFnZSk7CiAJCXBhZ2VzWypucl0gPSBwYWdlOwogCQkoKm5yKSsrOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYwppbmRleCAyNmIyODcyLi4yZDI4MjE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xMDUsOSArMTA2LDYgQEAKIGludCBtbXVfaGlnaHVzZXJfc3NpemUgPSBNTVVfU0VHU0laRV8yNTZNOwogdTE2IG1tdV9zbGJfc2l6ZSA9IDY0OwogRVhQT1JUX1NZTUJPTF9HUEwobW11X3NsYl9zaXplKTsKLSNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCi11bnNpZ25lZCBpbnQgSFBBR0VfU0hJRlQ7Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwogaW50IG1tdV9jaV9yZXN0cmljdGlvbnM7CiAjZW5kaWYKQEAgLTUzNCwxMSArNTMyLDExIEBACiB9CiAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKLXZvaWQgY3JlYXRlX3NlY3Rpb25fbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK2ludCBjcmVhdGVfc2VjdGlvbl9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewotCUJVR19PTihodGFiX2JvbHRfbWFwcGluZyhzdGFydCwgZW5kLCBfX3BhKHN0YXJ0KSwKKwlyZXR1cm4gaHRhYl9ib2x0X21hcHBpbmcoc3RhcnQsIGVuZCwgX19wYShzdGFydCksCiAJCQkJIHBncHJvdF92YWwoUEFHRV9LRVJORUwpLCBtbXVfbGluZWFyX3BzaXplLAotCQkJCSBtbXVfa2VybmVsX3NzaXplKSk7CisJCQkJIG1tdV9rZXJuZWxfc3NpemUpOwogfQogCiBpbnQgcmVtb3ZlX3NlY3Rpb25fbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS1ib29rM2UuYyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS1ib29rM2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNhZDBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLWJvb2szZS5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogUFBDIEh1Z2UgVExCIFBhZ2UgU3VwcG9ydCBmb3IgQm9vazNFIE1NVQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBCZWNreSBCcnVjZSwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKworc3RhdGljIGlubGluZSBpbnQgbW11X2dldF90c2l6ZShpbnQgcHNpemUpCit7CisJcmV0dXJuIG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5lbmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJvb2szZV90bGJfZXhpc3RzKHVuc2lnbmVkIGxvbmcgZWEsIHVuc2lnbmVkIGxvbmcgcGlkKQoreworCWludCBmb3VuZCA9IDA7CisKKwltdHNwcihTUFJOX01BUzYsIHBpZCA8PCAxNik7CisJaWYgKG1tdV9oYXNfZmVhdHVyZShNTVVfRlRSX1VTRV9UTEJSU1JWKSkgeworCQlhc20gdm9sYXRpbGUoCisJCQkibGkJJTAsMFxuIgorCQkJInRsYnN4LgkwLCUxXG4iCisJCQkiYm5lCTFmXG4iCisJCQkibGkJJTAsMVxuIgorCQkJIjE6XG4iCisJCQk6ICI9JnIiKGZvdW5kKSA6ICJyIihlYSkpOworCX0gZWxzZSB7CisJCWFzbSB2b2xhdGlsZSgKKwkJCSJ0bGJzeAkwLCUxXG4iCisJCQkibWZzcHIJJTAsMHgyNzFcbiIKKwkJCSJzcndpCSUwLCUwLDMxXG4iCisJCQk6ICI9JnIiKGZvdW5kKSA6ICJyIihlYSkpOworCX0KKworCXJldHVybiBmb3VuZDsKK30KKwordm9pZCBib29rM2VfaHVnZXRsYl9wcmVsb2FkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGVhLCBwdGVfdCBwdGUpCit7CisJdW5zaWduZWQgbG9uZyBtYXMxLCBtYXMyOworCXU2NCBtYXM3XzM7CisJdW5zaWduZWQgbG9uZyBwc2l6ZSwgdHNpemUsIHNoaWZ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKKwlpbnQgaW5kZXgsIGx6LCBuY2FtczsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKyNlbmRpZgorCisJaWYgKHVubGlrZWx5KGlzX2tlcm5lbF9hZGRyKGVhKSkpCisJCXJldHVybjsKKworI2lmZGVmIENPTkZJR19QUENfTU1fU0xJQ0VTCisJcHNpemUgPSBtbXVfZ2V0X3RzaXplKGdldF9zbGljZV9wc2l6ZShtbSwgZWEpKTsKKwl0c2l6ZSA9IG1tdV9nZXRfcHNpemUocHNpemUpOworCXNoaWZ0ID0gbW11X3BzaXplX2RlZnNbcHNpemVdLnNoaWZ0OworI2Vsc2UKKwl2bWEgPSBmaW5kX3ZtYShtbSwgZWEpOworCXBzaXplID0gdm1hX21tdV9wYWdlc2l6ZSh2bWEpOwkvKiByZXR1cm5zIGFjdHVhbCBzaXplIGluIGJ5dGVzICovCisJYXNtIChQUENfQ05UTFpMICIlMCwlMSIgOiAiPXIiIChseikgOiAiciIgKHBzaXplKSk7CisJc2hpZnQgPSAzMSAtIGx6OworCXRzaXplID0gMjEgLSBsejsKKyNlbmRpZgorCisJLyoKKwkgKiBXZSBjYW4ndCBiZSBpbnRlcnJ1cHRlZCB3aGlsZSB3ZSdyZSBzZXR0aW5nIHVwIHRoZSBNQVMKKwkgKiByZWd1c3RlcnMgb3IgYWZ0ZXIgd2UndmUgY29uZmlybWVkIHRoYXQgbm8gdGxiIGV4aXN0cy4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAodW5saWtlbHkoYm9vazNlX3RsYl9leGlzdHMoZWEsIG1tLT5jb250ZXh0LmlkKSkpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCisJbmNhbXMgPSBtZnNwcihTUFJOX1RMQjFDRkcpICYgVExCbkNGR19OX0VOVFJZOworCisJLyogV2UgaGF2ZSB0byB1c2UgdGhlIENBTShUTEIxKSBvbiBGU0wgcGFydHMgZm9yIGh1Z2VwYWdlcyAqLworCWluZGV4ID0gX19nZXRfY3B1X3ZhcihuZXh0X3RsYmNhbV9pZHgpOworCW10c3ByKFNQUk5fTUFTMCwgTUFTMF9FU0VMKGluZGV4KSB8IE1BUzBfVExCU0VMKDEpKTsKKworCS8qIEp1c3Qgcm91bmQtcm9iaW4gdGhlIGVudHJpZXMgYW5kIHdyYXAgd2hlbiB3ZSBoaXQgdGhlIGVuZCAqLworCWlmICh1bmxpa2VseShpbmRleCA9PSBuY2FtcyAtIDEpKQorCQlfX2dldF9jcHVfdmFyKG5leHRfdGxiY2FtX2lkeCkgPSB0bGJjYW1faW5kZXg7CisJZWxzZQorCQlfX2dldF9jcHVfdmFyKG5leHRfdGxiY2FtX2lkeCkrKzsKKyNlbmRpZgorCW1hczEgPSBNQVMxX1ZBTElEIHwgTUFTMV9USUQobW0tPmNvbnRleHQuaWQpIHwgTUFTMV9UU0laRSh0c2l6ZSk7CisJbWFzMiA9IGVhICYgfigoMVVMIDw8IHNoaWZ0KSAtIDEpOworCW1hczIgfD0gKHB0ZV92YWwocHRlKSA+PiBQVEVfV0lNR0VfU0hJRlQpICYgTUFTMl9XSU1HRV9NQVNLOworCW1hczdfMyA9ICh1NjQpcHRlX3BmbihwdGUpIDw8IFBBR0VfU0hJRlQ7CisJbWFzN18zIHw9IChwdGVfdmFsKHB0ZSkgPj4gUFRFX0JBUF9TSElGVCkgJiBNQVMzX0JBUF9NQVNLOworCWlmICghcHRlX2RpcnR5KHB0ZSkpCisJCW1hczdfMyAmPSB+KE1BUzNfU1d8TUFTM19VVyk7CisKKwltdHNwcihTUFJOX01BUzEsIG1hczEpOworCW10c3ByKFNQUk5fTUFTMiwgbWFzMik7CisKKwlpZiAobW11X2hhc19mZWF0dXJlKE1NVV9GVFJfVVNFX1BBSVJFRF9NQVMpKSB7CisJCW10c3ByKFNQUk5fTUFTN19NQVMzLCBtYXM3XzMpOworCX0gZWxzZSB7CisJCW10c3ByKFNQUk5fTUFTNywgdXBwZXJfMzJfYml0cyhtYXM3XzMpKTsKKwkJbXRzcHIoU1BSTl9NQVMzLCBsb3dlcl8zMl9iaXRzKG1hczdfMykpOworCX0KKworCWFzbSB2b2xhdGlsZSAoInRsYndlIik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3ZvaWQgZmx1c2hfaHVnZXRsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHZtYWRkcikKK3sKKwlzdHJ1Y3QgaHN0YXRlICpoc3RhdGUgPSBoc3RhdGVfZmlsZSh2bWEtPnZtX2ZpbGUpOworCXVuc2lnbmVkIGxvbmcgdHNpemUgPSBodWdlX3BhZ2Vfc2hpZnQoaHN0YXRlKSAtIDEwOworCisJX19mbHVzaF90bGJfcGFnZSh2bWEgPyB2bWEtPnZtX21tIDogTlVMTCwgdm1hZGRyLCB0c2l6ZSwgMCk7CisKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMKaW5kZXggMGI5YTVjMS4uNTk2NDM3MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMKQEAgLTEsNyArMSw4IEBACiAvKgotICogUFBDNjQgKFBPV0VSNCkgSHVnZSBUTEIgUGFnZSBTdXBwb3J0IGZvciBLZXJuZWwuCisgKiBQUEMgSHVnZSBUTEIgUGFnZSBTdXBwb3J0IGZvciBLZXJuZWwuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEdpYnNvbiwgSUJNIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDExIEJlY2t5IEJydWNlLCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvcgogICoKICAqIEJhc2VkIG9uIHRoZSBJQS0zMiB2ZXJzaW9uOgogICogQ29weXJpZ2h0IChDKSAyMDAyLCBSb2hpdCBTZXRoIDxyb2hpdC5zZXRoQGludGVsLmNvbT4KQEAgLTExLDI0ICsxMiwzOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCiAjZGVmaW5lIFBBR0VfU0hJRlRfNjRLCTE2CiAjZGVmaW5lIFBBR0VfU0hJRlRfMTZNCTI0CiAjZGVmaW5lIFBBR0VfU0hJRlRfMTZHCTM0CiAKK3Vuc2lnbmVkIGludCBIUEFHRV9TSElGVDsKKworLyoKKyAqIFRyYWNrcyBncGFnZXMgYWZ0ZXIgdGhlIGRldmljZSB0cmVlIGlzIHNjYW5uZWQgYW5kIGJlZm9yZSB0aGUKKyAqIGh1Z2VfYm9vdF9wYWdlcyBsaXN0IGlzIHJlYWR5LiAgT24gNjQtYml0IGltcGxlbWVudGF0aW9ucywgdGhpcyBpcworICoganVzdCB1c2VkIHRvIHRyYWNrIDE2RyBwYWdlcyBhbmQgc28gaXMgYSBzaW5nbGUgYXJyYXkuICAzMi1iaXQKKyAqIGltcGxlbWVudGF0aW9ucyBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIGdwYWdlIHNpemUgZHVlIHRvIGxpbWl0YXRpb25zCisgKiBvZiB0aGUgbWVtb3J5IGFsbG9jYXRvcnMsIHNvIHdlIG5lZWQgbXVsdGlwbGUgYXJyYXlzCisgKi8KKyNpZmRlZiBDT05GSUdfUFBDNjQKICNkZWZpbmUgTUFYX05VTUJFUl9HUEFHRVMJMTAyNAotCi0vKiBUcmFja3MgdGhlIDE2RyBwYWdlcyBhZnRlciB0aGUgZGV2aWNlIHRyZWUgaXMgc2Nhbm5lZCBhbmQgYmVmb3JlIHRoZQotICogaHVnZV9ib290X3BhZ2VzIGxpc3QgaXMgcmVhZHkuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3BhZ2VfZnJlZWFycmF5W01BWF9OVU1CRVJfR1BBR0VTXTsKK3N0YXRpYyB1NjQgZ3BhZ2VfZnJlZWFycmF5W01BWF9OVU1CRVJfR1BBR0VTXTsKIHN0YXRpYyB1bnNpZ25lZCBucl9ncGFnZXM7Ci0KLS8qIEZsYWcgdG8gbWFyayBodWdlIFBEIHBvaW50ZXJzLiAgVGhpcyBtZWFucyBwbWRfYmFkKCkgYW5kIHB1ZF9iYWQoKQotICogd2lsbCBjaG9rZSBvbiBwb2ludGVycyB0byBodWdlcHRlIHRhYmxlcywgd2hpY2ggaXMgaGFuZHkgZm9yCi0gKiBjYXRjaGluZyBzY3Jld3VwcyBlYXJseS4gKi8KKyNlbHNlCisjZGVmaW5lIE1BWF9OVU1CRVJfR1BBR0VTCTEyOAorc3RydWN0IHBzaXplX2dwYWdlcyB7CisJdTY0IGdwYWdlX2xpc3RbTUFYX05VTUJFUl9HUEFHRVNdOworCXVuc2lnbmVkIGludCBucl9ncGFnZXM7Cit9Oworc3RhdGljIHN0cnVjdCBwc2l6ZV9ncGFnZXMgZ3BhZ2VfZnJlZWFycmF5W01NVV9QQUdFX0NPVU5UXTsKKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBzaGlmdF90b19tbXVfcHNpemUodW5zaWduZWQgaW50IHNoaWZ0KQogewpAQCAtNDksMjUgKzY1LDYgQEAKIAogI2RlZmluZSBodWdlcGRfbm9uZShocGQpCSgoaHBkKS5wZCA9PSAwKQogCi1zdGF0aWMgaW5saW5lIHB0ZV90ICpodWdlcGRfcGFnZShodWdlcGRfdCBocGQpCi17Ci0JQlVHX09OKCFodWdlcGRfb2soaHBkKSk7Ci0JcmV0dXJuIChwdGVfdCAqKSgoaHBkLnBkICYgfkhVR0VQRF9TSElGVF9NQVNLKSB8IDB4YzAwMDAwMDAwMDAwMDAwMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh1Z2VwZF9zaGlmdChodWdlcGRfdCBocGQpCi17Ci0JcmV0dXJuIGhwZC5wZCAmIEhVR0VQRF9TSElGVF9NQVNLOwotfQotCi1zdGF0aWMgaW5saW5lIHB0ZV90ICpodWdlcHRlX29mZnNldChodWdlcGRfdCAqaHBkcCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBwZHNoaWZ0KQotewotCXVuc2lnbmVkIGxvbmcgaWR4ID0gKGFkZHIgJiAoKDFVTCA8PCBwZHNoaWZ0KSAtIDEpKSA+PiBodWdlcGRfc2hpZnQoKmhwZHApOwotCXB0ZV90ICpkaXIgPSBodWdlcGRfcGFnZSgqaHBkcCk7Ci0KLQlyZXR1cm4gZGlyICsgaWR4OwotfQotCiBwdGVfdCAqZmluZF9saW51eF9wdGVfb3JfaHVnZXB0ZShwZ2RfdCAqcGdkaXIsIHVuc2lnbmVkIGxvbmcgZWEsIHVuc2lnbmVkICpzaGlmdCkKIHsKIAlwZ2RfdCAqcGc7CkBAIC05Myw3ICs5MCw3IEBACiAJCQlpZiAoaXNfaHVnZXBkKHBtKSkKIAkJCQlocGRwID0gKGh1Z2VwZF90ICopcG07CiAJCQllbHNlIGlmICghcG1kX25vbmUoKnBtKSkgewotCQkJCXJldHVybiBwdGVfb2Zmc2V0X21hcChwbSwgZWEpOworCQkJCXJldHVybiBwdGVfb2Zmc2V0X2tlcm5lbChwbSwgZWEpOwogCQkJfQogCQl9CiAJfQpAQCAtMTE0LDggKzExMSwxOCBAQAogc3RhdGljIGludCBfX2h1Z2VwdGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIGh1Z2VwZF90ICpocGRwLAogCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBwZHNoaWZ0LCB1bnNpZ25lZCBwc2hpZnQpCiB7Ci0JcHRlX3QgKm5ldyA9IGttZW1fY2FjaGVfemFsbG9jKFBHVF9DQUNIRShwZHNoaWZ0IC0gcHNoaWZ0KSwKLQkJCQkgICAgICAgR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOworCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7CisJcHRlX3QgKm5ldzsKKworI2lmZGVmIENPTkZJR19QUEM2NAorCWNhY2hlcCA9IFBHVF9DQUNIRShwZHNoaWZ0IC0gcHNoaWZ0KTsKKyNlbHNlCisJaW50IGk7CisJaW50IG51bV9odWdlcGQgPSAxIDw8IChwc2hpZnQgLSBwZHNoaWZ0KTsKKwljYWNoZXAgPSBodWdlcHRlX2NhY2hlOworI2VuZGlmCisKKwluZXcgPSBrbWVtX2NhY2hlX3phbGxvYyhjYWNoZXAsIEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKIAogCUJVR19PTihwc2hpZnQgPiBIVUdFUERfU0hJRlRfTUFTSyk7CiAJQlVHX09OKCh1bnNpZ25lZCBsb25nKW5ldyAmIEhVR0VQRF9TSElGVF9NQVNLKTsKQEAgLTEyNCwxMCArMTMxLDMxIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKyNpZmRlZiBDT05GSUdfUFBDNjQKIAlpZiAoIWh1Z2VwZF9ub25lKCpocGRwKSkKLQkJa21lbV9jYWNoZV9mcmVlKFBHVF9DQUNIRShwZHNoaWZ0IC0gcHNoaWZ0KSwgbmV3KTsKKwkJa21lbV9jYWNoZV9mcmVlKGNhY2hlcCwgbmV3KTsKIAllbHNlCi0JCWhwZHAtPnBkID0gKCh1bnNpZ25lZCBsb25nKW5ldyAmIH4weDgwMDAwMDAwMDAwMDAwMDApIHwgcHNoaWZ0OworCQlocGRwLT5wZCA9ICgodW5zaWduZWQgbG9uZyluZXcgJiB+UERfSFVHRSkgfCBwc2hpZnQ7CisjZWxzZQorCS8qCisJICogV2UgaGF2ZSBtdWx0aXBsZSBoaWdoZXItbGV2ZWwgZW50cmllcyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lCisJICogYWN0dWFsIHB0ZSBsb2NhdGlvbi4gIEZpbGwgaW4gZWFjaCBhcyB3ZSBnbyBhbmQgYmFja3RyYWNrIG9uIGVycm9yLgorCSAqIFdlIG5lZWQgYWxsIG9mIHRoZXNlIHNvIHRoZSBEVExCIHBndGFibGUgd2FsayBjb2RlIGNhbiBmaW5kIHRoZQorCSAqIHJpZ2h0IGhpZ2hlci1sZXZlbCBlbnRyeSB3aXRob3V0IGtub3dpbmcgaWYgaXQncyBhIGh1Z2VwYWdlIG9yIG5vdC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2h1Z2VwZDsgaSsrLCBocGRwKyspIHsKKwkJaWYgKHVubGlrZWx5KCFodWdlcGRfbm9uZSgqaHBkcCkpKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCWhwZHAtPnBkID0gKCh1bnNpZ25lZCBsb25nKW5ldyAmIH5QRF9IVUdFKSB8IHBzaGlmdDsKKwl9CisJLyogSWYgd2UgYmFpbGVkIGZyb20gdGhlIGZvciBsb29wIGVhcmx5LCBhbiBlcnJvciBvY2N1cnJlZCwgY2xlYW4gdXAgKi8KKwlpZiAoaSA8IG51bV9odWdlcGQpIHsKKwkJZm9yIChpID0gaSAtIDEgOyBpID49IDA7IGktLSwgaHBkcC0tKQorCQkJaHBkcC0+cGQgPSAwOworCQlrbWVtX2NhY2hlX2ZyZWUoY2FjaGVwLCBuZXcpOworCX0KKyNlbmRpZgogCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE2OSwxMSArMTk3LDEzMiBAQAogCXJldHVybiBodWdlcHRlX29mZnNldChocGRwLCBhZGRyLCBwZHNoaWZ0KTsKIH0KIAorI2lmZGVmIENPTkZJR19QUEMzMgogLyogQnVpbGQgbGlzdCBvZiBhZGRyZXNzZXMgb2YgZ2lnYW50aWMgcGFnZXMuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gZWFybHkKICAqIGJvb3QgYmVmb3JlIHRoZSBidWRkeSBvciBib290bWVtIGFsbG9jYXRvciBpcyBzZXR1cC4KICAqLwotdm9pZCBhZGRfZ3BhZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZSwKLQl1bnNpZ25lZCBsb25nIG51bWJlcl9vZl9wYWdlcykKK3ZvaWQgYWRkX2dwYWdlKHU2NCBhZGRyLCB1NjQgcGFnZV9zaXplLCB1bnNpZ25lZCBsb25nIG51bWJlcl9vZl9wYWdlcykKK3sKKwl1bnNpZ25lZCBpbnQgaWR4ID0gc2hpZnRfdG9fbW11X3BzaXplKF9fZmZzKHBhZ2Vfc2l6ZSkpOworCWludCBpOworCisJaWYgKGFkZHIgPT0gMCkKKwkJcmV0dXJuOworCisJZ3BhZ2VfZnJlZWFycmF5W2lkeF0ubnJfZ3BhZ2VzID0gbnVtYmVyX29mX3BhZ2VzOworCisJZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9wYWdlczsgaSsrKSB7CisJCWdwYWdlX2ZyZWVhcnJheVtpZHhdLmdwYWdlX2xpc3RbaV0gPSBhZGRyOworCQlhZGRyICs9IHBhZ2Vfc2l6ZTsKKwl9Cit9CisKKy8qCisgKiBNb3ZlcyB0aGUgZ2lnYW50aWMgcGFnZSBhZGRyZXNzZXMgZnJvbSB0aGUgdGVtcG9yYXJ5IGxpc3QgdG8gdGhlCisgKiBodWdlX2Jvb3RfcGFnZXMgbGlzdC4KKyAqLworaW50IGFsbG9jX2Jvb3RtZW1faHVnZV9wYWdlKHN0cnVjdCBoc3RhdGUgKmhzdGF0ZSkKK3sKKwlzdHJ1Y3QgaHVnZV9ib290bWVtX3BhZ2UgKm07CisJaW50IGlkeCA9IHNoaWZ0X3RvX21tdV9wc2l6ZShoc3RhdGUtPm9yZGVyICsgUEFHRV9TSElGVCk7CisJaW50IG5yX2dwYWdlcyA9IGdwYWdlX2ZyZWVhcnJheVtpZHhdLm5yX2dwYWdlczsKKworCWlmIChucl9ncGFnZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCS8qCisJICogSWYgZ3BhZ2VzIGNhbiBiZSBpbiBoaWdobWVtIHdlIGNhbid0IHVzZSB0aGUgdHJpY2sgb2Ygc3RvcmluZyB0aGUKKwkgKiBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgcGFnZTsgYWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMKKwkgKi8KKwltID0gYWxsb2NfYm9vdG1lbShzaXplb2Yoc3RydWN0IGh1Z2VfYm9vdG1lbV9wYWdlKSk7CisJbS0+cGh5cyA9IGdwYWdlX2ZyZWVhcnJheVtpZHhdLmdwYWdlX2xpc3RbLS1ucl9ncGFnZXNdOworI2Vsc2UKKwltID0gcGh5c190b192aXJ0KGdwYWdlX2ZyZWVhcnJheVtpZHhdLmdwYWdlX2xpc3RbLS1ucl9ncGFnZXNdKTsKKyNlbmRpZgorCisJbGlzdF9hZGQoJm0tPmxpc3QsICZodWdlX2Jvb3RfcGFnZXMpOworCWdwYWdlX2ZyZWVhcnJheVtpZHhdLm5yX2dwYWdlcyA9IG5yX2dwYWdlczsKKwlncGFnZV9mcmVlYXJyYXlbaWR4XS5ncGFnZV9saXN0W25yX2dwYWdlc10gPSAwOworCW0tPmhzdGF0ZSA9IGhzdGF0ZTsKKworCXJldHVybiAxOworfQorLyoKKyAqIFNjYW4gdGhlIGNvbW1hbmQgbGluZSBodWdlcGFnZXN6PSBvcHRpb25zIGZvciBnaWdhbnRpYyBwYWdlczsgc3RvcmUgdGhvc2UgaW4KKyAqIGEgbGlzdCB0aGF0IHdlIHVzZSB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IG9uY2UgYWxsIG9wdGlvbnMgYXJlIHBhcnNlZC4KKyAqLworCit1bnNpZ25lZCBsb25nIGdwYWdlX25wYWdlc1tNTVVfUEFHRV9DT1VOVF07CisKK3N0YXRpYyBpbnQgX19pbml0IGRvX2dwYWdlX2Vhcmx5X3NldHVwKGNoYXIgKnBhcmFtLCBjaGFyICp2YWwpCit7CisJc3RhdGljIHBoeXNfYWRkcl90IHNpemU7CisJdW5zaWduZWQgbG9uZyBucGFnZXM7CisKKwkvKgorCSAqIFRoZSBodWdlcGFnZXN6IGFuZCBodWdlcGFnZXMgY21kbGluZSBvcHRpb25zIGFyZSBpbnRlcmxlYXZlZC4gIFdlCisJICogdXNlIHRoZSBzaXplIHZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3QgdGhpcyB3YXMgZG9uZQorCSAqIHByb3Blcmx5IGFuZCBza2lwIG92ZXIgaW5zdGFuY2VzIHdoZXJlIGl0IGlzIGluY29ycmVjdC4gIE90aGVyCisJICogY29tbWFuZC1saW5lIHBhcnNpbmcgY29kZSB3aWxsIGlzc3VlIHdhcm5pbmdzLCBzbyB3ZSBkb24ndCBuZWVkIHRvLgorCSAqCisJICovCisJaWYgKChzdHJjbXAocGFyYW0sICJkZWZhdWx0X2h1Z2VwYWdlc3oiKSA9PSAwKSB8fAorCSAgICAoc3RyY21wKHBhcmFtLCAiaHVnZXBhZ2VzeiIpID09IDApKSB7CisJCXNpemUgPSBtZW1wYXJzZSh2YWwsIE5VTEwpOworCX0gZWxzZSBpZiAoc3RyY21wKHBhcmFtLCAiaHVnZXBhZ2VzIikgPT0gMCkgeworCQlpZiAoc2l6ZSAhPSAwKSB7CisJCQlpZiAoc3NjYW5mKHZhbCwgIiVsdSIsICZucGFnZXMpIDw9IDApCisJCQkJbnBhZ2VzID0gMDsKKwkJCWdwYWdlX25wYWdlc1tzaGlmdF90b19tbXVfcHNpemUoX19mZnMoc2l6ZSkpXSA9IG5wYWdlczsKKwkJCXNpemUgPSAwOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBwaHlzaWNhbCBzcGFjZSBmb3IgcGFnZXMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gdGhlCisgKiBidWRkeSBhbGxvY2F0b3IgY2FuIGhhbmRsZS4gIFdlIHdhbnQgdG8gYWxsb2NhdGUgdGhlc2UgaW4gaGlnaG1lbSBiZWNhdXNlCisgKiB0aGUgYW1vdW50IG9mIGxvd21lbSBpcyBsaW1pdGVkLiAgVGhpcyBtZWFucyB0aGF0IHRoaXMgZnVuY3Rpb24gTVVTVCBiZQorICogY2FsbGVkIGJlZm9yZSBsb3dtZW1fZW5kX2FkZHIgaXMgc2V0IHVwIGluIE1NVV9pbml0KCkgaW4gb3JkZXIgZm9yIHRoZSBsbWIKKyAqIGFsbG9jYXRlIHRvIGdyYWIgaGlnaG1lbS4KKyAqLwordm9pZCBfX2luaXQgcmVzZXJ2ZV9odWdldGxiX2dwYWdlcyh2b2lkKQoreworCXN0YXRpYyBfX2luaXRkYXRhIGNoYXIgY21kbGluZVtDT01NQU5EX0xJTkVfU0laRV07CisJcGh5c19hZGRyX3Qgc2l6ZSwgYmFzZTsKKwlpbnQgaTsKKworCXN0cmxjcHkoY21kbGluZSwgYm9vdF9jb21tYW5kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKKwlwYXJzZV9hcmdzKCJodWdldGxiIGdwYWdlcyIsIGNtZGxpbmUsIE5VTEwsIDAsICZkb19ncGFnZV9lYXJseV9zZXR1cCk7CisKKwkvKgorCSAqIFdhbGsgZ3BhZ2UgbGlzdCBpbiByZXZlcnNlLCBhbGxvY2F0aW5nIGxhcmdlciBwYWdlIHNpemVzIGZpcnN0LgorCSAqIFNraXAgb3ZlciB1bnN1cHBvcnRlZCBzaXplcywgb3Igc2l6ZXMgdGhhdCBoYXZlIDAgZ3BhZ2VzIGFsbG9jYXRlZC4KKwkgKiBXaGVuIHdlIHJlYWNoIHRoZSBwb2ludCBpbiB0aGUgbGlzdCB3aGVyZSBwYWdlcyBhcmUgbm8gbG9uZ2VyCisJICogY29uc2lkZXJlZCBncGFnZXMsIHdlJ3JlIGRvbmUuCisJICovCisJZm9yIChpID0gTU1VX1BBR0VfQ09VTlQtMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKG1tdV9wc2l6ZV9kZWZzW2ldLnNoaWZ0ID09IDAgfHwgZ3BhZ2VfbnBhZ2VzW2ldID09IDApCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAobW11X3BzaXplX3RvX3NoaWZ0KGkpIDwgKE1BWF9PUkRFUiArIFBBR0VfU0hJRlQpKQorCQkJYnJlYWs7CisKKwkJc2l6ZSA9IChwaHlzX2FkZHJfdCkoMVVMTCA8PCBtbXVfcHNpemVfdG9fc2hpZnQoaSkpOworCQliYXNlID0gbWVtYmxvY2tfYWxsb2NfYmFzZShzaXplICogZ3BhZ2VfbnBhZ2VzW2ldLCBzaXplLAorCQkJCQkgICBNRU1CTE9DS19BTExPQ19BTllXSEVSRSk7CisJCWFkZF9ncGFnZShiYXNlLCBzaXplLCBncGFnZV9ucGFnZXNbaV0pOworCX0KK30KKworI2Vsc2UgLyogUFBDNjQgKi8KKworLyogQnVpbGQgbGlzdCBvZiBhZGRyZXNzZXMgb2YgZ2lnYW50aWMgcGFnZXMuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gZWFybHkKKyAqIGJvb3QgYmVmb3JlIHRoZSBidWRkeSBvciBib290bWVtIGFsbG9jYXRvciBpcyBzZXR1cC4KKyAqLwordm9pZCBhZGRfZ3BhZ2UodTY0IGFkZHIsIHU2NCBwYWdlX3NpemUsIHVuc2lnbmVkIGxvbmcgbnVtYmVyX29mX3BhZ2VzKQogewogCWlmICghYWRkcikKIAkJcmV0dXJuOwpAQCAtMTk5LDE5ICszNDgsNzkgQEAKIAltLT5oc3RhdGUgPSBoc3RhdGU7CiAJcmV0dXJuIDE7CiB9CisjZW5kaWYKIAogaW50IGh1Z2VfcG1kX3Vuc2hhcmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgKmFkZHIsIHB0ZV90ICpwdGVwKQogewogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BQQzMyCisjZGVmaW5lIEhVR0VQRF9GUkVFTElTVF9TSVpFIFwKKwkoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgaHVnZXBkX2ZyZWVsaXN0KSkgLyBzaXplb2YocHRlX3QpKQorCitzdHJ1Y3QgaHVnZXBkX2ZyZWVsaXN0IHsKKwlzdHJ1Y3QgcmN1X2hlYWQJcmN1OworCXVuc2lnbmVkIGludCBpbmRleDsKKwl2b2lkICpwdGVzWzBdOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBodWdlcGRfZnJlZWxpc3QgKiwgaHVnZXBkX2ZyZWVsaXN0X2N1cik7CisKK3N0YXRpYyB2b2lkIGh1Z2VwZF9mcmVlX3JjdV9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGh1Z2VwZF9mcmVlbGlzdCAqYmF0Y2ggPQorCQljb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGh1Z2VwZF9mcmVlbGlzdCwgcmN1KTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBiYXRjaC0+aW5kZXg7IGkrKykKKwkJa21lbV9jYWNoZV9mcmVlKGh1Z2VwdGVfY2FjaGUsIGJhdGNoLT5wdGVzW2ldKTsKKworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyliYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIGh1Z2VwZF9mcmVlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHZvaWQgKmh1Z2VwdGUpCit7CisJc3RydWN0IGh1Z2VwZF9mcmVlbGlzdCAqKmJhdGNocDsKKworCWJhdGNocCA9ICZfX2dldF9jcHVfdmFyKGh1Z2VwZF9mcmVlbGlzdF9jdXIpOworCisJaWYgKGF0b21pY19yZWFkKCZ0bGItPm1tLT5tbV91c2VycykgPCAyIHx8CisJICAgIGNwdW1hc2tfZXF1YWwobW1fY3B1bWFzayh0bGItPm1tKSwKKwkJCSAgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkgeworCQlrbWVtX2NhY2hlX2ZyZWUoaHVnZXB0ZV9jYWNoZSwgaHVnZXB0ZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKmJhdGNocCA9PSBOVUxMKSB7CisJCSpiYXRjaHAgPSAoc3RydWN0IGh1Z2VwZF9mcmVlbGlzdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKKwkJKCpiYXRjaHApLT5pbmRleCA9IDA7CisJfQorCisJKCpiYXRjaHApLT5wdGVzWygqYmF0Y2hwKS0+aW5kZXgrK10gPSBodWdlcHRlOworCWlmICgoKmJhdGNocCktPmluZGV4ID09IEhVR0VQRF9GUkVFTElTVF9TSVpFKSB7CisJCWNhbGxfcmN1X3NjaGVkKCYoKmJhdGNocCktPnJjdSwgaHVnZXBkX2ZyZWVfcmN1X2NhbGxiYWNrKTsKKwkJKmJhdGNocCA9IE5VTEw7CisJfQorfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIGZyZWVfaHVnZXBkX3JhbmdlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIGh1Z2VwZF90ICpocGRwLCBpbnQgcGRzaGlmdCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBmbG9vciwgdW5zaWduZWQgbG9uZyBjZWlsaW5nKQogewogCXB0ZV90ICpodWdlcHRlID0gaHVnZXBkX3BhZ2UoKmhwZHApOwotCXVuc2lnbmVkIHNoaWZ0ID0gaHVnZXBkX3NoaWZ0KCpocGRwKTsKKwlpbnQgaTsKKwogCXVuc2lnbmVkIGxvbmcgcGRtYXNrID0gfigoMVVMIDw8IHBkc2hpZnQpIC0gMSk7CisJdW5zaWduZWQgaW50IG51bV9odWdlcGQgPSAxOworCisjaWZkZWYgQ09ORklHX1BQQzY0CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gaHVnZXBkX3NoaWZ0KCpocGRwKTsKKyNlbHNlCisJLyogTm90ZTogT24gMzItYml0IHRoZSBocGRwIG1heSBiZSB0aGUgZmlyc3Qgb2Ygc2V2ZXJhbCAqLworCW51bV9odWdlcGQgPSAoMSA8PCAoaHVnZXBkX3NoaWZ0KCpocGRwKSAtIHBkc2hpZnQpKTsKKyNlbmRpZgogCiAJc3RhcnQgJj0gcGRtYXNrOwogCWlmIChzdGFydCA8IGZsb29yKQpAQCAtMjI0LDkgKzQzMywxNSBAQAogCWlmIChlbmQgLSAxID4gY2VpbGluZyAtIDEpCiAJCXJldHVybjsKIAotCWhwZHAtPnBkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2h1Z2VwZDsgaSsrLCBocGRwKyspCisJCWhwZHAtPnBkID0gMDsKKwogCXRsYi0+bmVlZF9mbHVzaCA9IDE7CisjaWZkZWYgQ09ORklHX1BQQzY0CiAJcGd0YWJsZV9mcmVlX3RsYih0bGIsIGh1Z2VwdGUsIHBkc2hpZnQgLSBzaGlmdCk7CisjZWxzZQorCWh1Z2VwZF9mcmVlKHRsYiwgaHVnZXB0ZSk7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgaHVnZXRsYl9mcmVlX3BtZF9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwdWRfdCAqcHVkLApAQCAtMzMxLDE4ICs1NDYsMjcgQEAKIAkgKiB0b28uCiAJICovCiAKLQlwZ2QgPSBwZ2Rfb2Zmc2V0KHRsYi0+bW0sIGFkZHIpOwogCWRvIHsKIAkJbmV4dCA9IHBnZF9hZGRyX2VuZChhZGRyLCBlbmQpOworCQlwZ2QgPSBwZ2Rfb2Zmc2V0KHRsYi0+bW0sIGFkZHIpOwogCQlpZiAoIWlzX2h1Z2VwZChwZ2QpKSB7CiAJCQlpZiAocGdkX25vbmVfb3JfY2xlYXJfYmFkKHBnZCkpCiAJCQkJY29udGludWU7CiAJCQlodWdldGxiX2ZyZWVfcHVkX3JhbmdlKHRsYiwgcGdkLCBhZGRyLCBuZXh0LCBmbG9vciwgY2VpbGluZyk7CiAJCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX1BQQzMyCisJCQkvKgorCQkJICogSW5jcmVtZW50IG5leHQgYnkgdGhlIHNpemUgb2YgdGhlIGh1Z2UgbWFwcGluZyBzaW5jZQorCQkJICogb24gMzItYml0IHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGVudHJ5IGF0IHRoZSBwZ2QKKwkJCSAqIGxldmVsIGZvciBhIHNpbmdsZSBodWdlcGFnZSwgYnV0IGFsbCBvZiB0aGVtIHBvaW50IHRvCisJCQkgKiB0aGUgc2FtZSBrbWVtIGNhY2hlIHRoYXQgaG9sZHMgdGhlIGh1Z2VwdGUuCisJCQkgKi8KKwkJCW5leHQgPSBhZGRyICsgKDEgPDwgaHVnZXBkX3NoaWZ0KCooaHVnZXBkX3QgKilwZ2QpKTsKKyNlbmRpZgogCQkJZnJlZV9odWdlcGRfcmFuZ2UodGxiLCAoaHVnZXBkX3QgKilwZ2QsIFBHRElSX1NISUZULAogCQkJCQkgIGFkZHIsIG5leHQsIGZsb29yLCBjZWlsaW5nKTsKIAkJfQotCX0gd2hpbGUgKHBnZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCX0gd2hpbGUgKGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CiB9CiAKIHN0cnVjdCBwYWdlICoKQEAgLTM5MCw3ICs2MTQsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgbWFzazsKIAl1bnNpZ25lZCBsb25nIHB0ZV9lbmQ7Ci0Jc3RydWN0IHBhZ2UgKmhlYWQsICpwYWdlOworCXN0cnVjdCBwYWdlICpoZWFkLCAqcGFnZSwgKnRhaWw7CiAJcHRlX3QgcHRlOwogCWludCByZWZzOwogCkBAIC00MTMsNiArNjM3LDcgQEAKIAloZWFkID0gcHRlX3BhZ2UocHRlKTsKIAogCXBhZ2UgPSBoZWFkICsgKChhZGRyICYgKHN6LTEpKSA+PiBQQUdFX1NISUZUKTsKKwl0YWlsID0gcGFnZTsKIAlkbyB7CiAJCVZNX0JVR19PTihjb21wb3VuZF9oZWFkKHBhZ2UpICE9IGhlYWQpOwogCQlwYWdlc1sqbnJdID0gcGFnZTsKQEAgLTQyOCwxMCArNjUzLDIwIEBACiAKIAlpZiAodW5saWtlbHkocHRlX3ZhbChwdGUpICE9IHB0ZV92YWwoKnB0ZXApKSkgewogCQkvKiBDb3VsZCBiZSBvcHRpbWl6ZWQgYmV0dGVyICovCi0JCXdoaWxlICgqbnIpIHsKLQkJCXB1dF9wYWdlKHBhZ2UpOwotCQkJKCpuciktLTsKLQkJfQorCQkqbnIgLT0gcmVmczsKKwkJd2hpbGUgKHJlZnMtLSkKKwkJCXB1dF9wYWdlKGhlYWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEFueSB0YWlsIHBhZ2UgbmVlZCB0aGVpciBtYXBjb3VudCByZWZlcmVuY2UgdGFrZW4gYmVmb3JlIHdlCisJICogcmV0dXJuLgorCSAqLworCXdoaWxlIChyZWZzLS0pIHsKKwkJaWYgKFBhZ2VUYWlsKHRhaWwpKQorCQkJZ2V0X2h1Z2VfcGFnZV90YWlsKHRhaWwpOworCQl0YWlsKys7CiAJfQogCiAJcmV0dXJuIDE7CkBAIC00NjYsMTcgKzcwMSwzNSBAQAogCQkJCQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwZ29mZiwKIAkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKIHsKKyNpZmRlZiBDT05GSUdfUFBDX01NX1NMSUNFUwogCXN0cnVjdCBoc3RhdGUgKmhzdGF0ZSA9IGhzdGF0ZV9maWxlKGZpbGUpOwogCWludCBtbXVfcHNpemUgPSBzaGlmdF90b19tbXVfcHNpemUoaHVnZV9wYWdlX3NoaWZ0KGhzdGF0ZSkpOwogCiAJcmV0dXJuIHNsaWNlX2dldF91bm1hcHBlZF9hcmVhKGFkZHIsIGxlbiwgZmxhZ3MsIG1tdV9wc2l6ZSwgMSwgMCk7CisjZWxzZQorCXJldHVybiBnZXRfdW5tYXBwZWRfYXJlYShmaWxlLCBhZGRyLCBsZW4sIHBnb2ZmLCBmbGFncyk7CisjZW5kaWYKIH0KIAogdW5zaWduZWQgbG9uZyB2bWFfbW11X3BhZ2VzaXplKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogeworI2lmZGVmIENPTkZJR19QUENfTU1fU0xJQ0VTCiAJdW5zaWduZWQgaW50IHBzaXplID0gZ2V0X3NsaWNlX3BzaXplKHZtYS0+dm1fbW0sIHZtYS0+dm1fc3RhcnQpOwogCiAJcmV0dXJuIDFVTCA8PCBtbXVfcHNpemVfdG9fc2hpZnQocHNpemUpOworI2Vsc2UKKwlpZiAoIWlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKQorCQlyZXR1cm4gUEFHRV9TSVpFOworCisJcmV0dXJuIGh1Z2VfcGFnZV9zaXplKGhzdGF0ZV92bWEodm1hKSk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX3Bvd2VyX29mXzQodW5zaWduZWQgbG9uZyB4KQoreworCWlmIChpc19wb3dlcl9vZl8yKHgpKQorCQlyZXR1cm4gKF9faWxvZzIoeCkgJSAyKSA/IGZhbHNlIDogdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFkZF9odWdlX3BhZ2Vfc2l6ZSh1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSkKQEAgLTQ4Niw5ICs3MzksMTQgQEAKIAogCS8qIENoZWNrIHRoYXQgaXQgaXMgYSBwYWdlIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQKIAkgKiB0aGF0IGl0IGZpdHMgd2l0aGluIHBhZ2V0YWJsZSBhbmQgc2xpY2UgbGltaXRzLiAqLworI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQorCWlmICgoc2l6ZSA8IFBBR0VfU0laRSkgfHwgIWlzX3Bvd2VyX29mXzQoc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworI2Vsc2UKIAlpZiAoIWlzX3Bvd2VyX29mXzIoc2l6ZSkKIAkgICAgfHwgKHNoaWZ0ID4gU0xJQ0VfSElHSF9TSElGVCkgfHwgKHNoaWZ0IDw9IFBBR0VfU0hJRlQpKQogCQlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgogCiAJaWYgKChtbXVfcHNpemUgPSBzaGlmdF90b19tbXVfcHNpemUoc2hpZnQpKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTI1LDYgKzc4Myw0NiBAQAogfQogX19zZXR1cCgiaHVnZXBhZ2Vzej0iLCBodWdlcGFnZV9zZXR1cF9zeik7CiAKKyNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCitzdHJ1Y3Qga21lbV9jYWNoZSAqaHVnZXB0ZV9jYWNoZTsKK3N0YXRpYyBpbnQgX19pbml0IGh1Z2V0bGJwYWdlX2luaXQodm9pZCkKK3sKKwlpbnQgcHNpemU7CisKKwlmb3IgKHBzaXplID0gMDsgcHNpemUgPCBNTVVfUEFHRV9DT1VOVDsgKytwc2l6ZSkgeworCQl1bnNpZ25lZCBzaGlmdDsKKworCQlpZiAoIW1tdV9wc2l6ZV9kZWZzW3BzaXplXS5zaGlmdCkKKwkJCWNvbnRpbnVlOworCisJCXNoaWZ0ID0gbW11X3BzaXplX3RvX3NoaWZ0KHBzaXplKTsKKworCQkvKiBEb24ndCB0cmVhdCBub3JtYWwgcGFnZSBzaXplcyBhcyBodWdlLi4uICovCisJCWlmIChzaGlmdCAhPSBQQUdFX1NISUZUKQorCQkJaWYgKGFkZF9odWdlX3BhZ2Vfc2l6ZSgxVUxMIDw8IHNoaWZ0KSA8IDApCisJCQkJY29udGludWU7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgYSBrbWVtIGNhY2hlIGZvciBodWdlcHRlcy4gIFRoZSBib3R0b20gYml0cyBpbiB0aGUgcHRlIGhhdmUKKwkgKiBzaXplIGluZm9ybWF0aW9uIGVuY29kZWQgaW4gdGhlbSwgc28gYWxpZ24gdGhlbSB0byBhbGxvdyB0aGlzCisJICovCisJaHVnZXB0ZV9jYWNoZSA9ICBrbWVtX2NhY2hlX2NyZWF0ZSgiaHVnZXB0ZS1jYWNoZSIsIHNpemVvZihwdGVfdCksCisJCQkJCSAgIEhVR0VQRF9TSElGVF9NQVNLICsgMSwgMCwgTlVMTCk7CisJaWYgKGh1Z2VwdGVfY2FjaGUgPT0gTlVMTCkKKwkJcGFuaWMoIiVzOiBVbmFibGUgdG8gY3JlYXRlIGttZW0gY2FjaGUgZm9yIGh1Z2VwdGVzXG4iLAorCQkgICAgICBfX2Z1bmNfXyk7CisKKwkvKiBEZWZhdWx0IGhwYWdlIHNpemUgPSA0TSAqLworCWlmIChtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV80TV0uc2hpZnQpCisJCUhQQUdFX1NISUZUID0gbW11X3BzaXplX2RlZnNbTU1VX1BBR0VfNE1dLnNoaWZ0OworCWVsc2UKKwkJcGFuaWMoIiVzOiBVbmFibGUgdG8gc2V0IGRlZmF1bHQgaHVnZSBwYWdlIHNpemVcbiIsIF9fZnVuY19fKTsKKworCisJcmV0dXJuIDA7Cit9CisjZWxzZQogc3RhdGljIGludCBfX2luaXQgaHVnZXRsYnBhZ2VfaW5pdCh2b2lkKQogewogCWludCBwc2l6ZTsKQEAgLTU2NywxNSArODY1LDIzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQorI2VuZGlmCiBtb2R1bGVfaW5pdChodWdldGxicGFnZV9pbml0KTsKIAogdm9pZCBmbHVzaF9kY2FjaGVfaWNhY2hlX2h1Z2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWludCBpOworCXZvaWQgKnN0YXJ0OwogCiAJQlVHX09OKCFQYWdlQ29tcG91bmQocGFnZSkpOwogCi0JZm9yIChpID0gMDsgaSA8ICgxVUwgPDwgY29tcG91bmRfb3JkZXIocGFnZSkpOyBpKyspCi0JCV9fZmx1c2hfZGNhY2hlX2ljYWNoZShwYWdlX2FkZHJlc3MocGFnZStpKSk7CisJZm9yIChpID0gMDsgaSA8ICgxVUwgPDwgY29tcG91bmRfb3JkZXIocGFnZSkpOyBpKyspIHsKKwkJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkgeworCQkJX19mbHVzaF9kY2FjaGVfaWNhY2hlKHBhZ2VfYWRkcmVzcyhwYWdlK2kpKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXJ0ID0ga21hcF9hdG9taWMocGFnZStpLCBLTV9QUENfU1lOQ19JQ0FDSEUpOworCQkJX19mbHVzaF9kY2FjaGVfaWNhY2hlKHN0YXJ0KTsKKwkJCWt1bm1hcF9hdG9taWMoc3RhcnQsIEtNX1BQQ19TWU5DX0lDQUNIRSk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwppbmRleCBjNzdmZWY1Li4xNjFjZWZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKQEAgLTMyLDYgKzMyLDggQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtNDQsNiArNDYsNyBAQAogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2h1Z2V0bGIuaD4KIAogI2luY2x1ZGUgIm1tdV9kZWNsLmgiCiAKQEAgLTEyMyw2ICsxMjYsMTIgQEAKIAkvKiBwYXJzZSBhcmdzIGZyb20gY29tbWFuZCBsaW5lICovCiAJTU1VX3NldHVwKCk7CiAKKwkvKgorCSAqIFJlc2VydmUgZ2lnYW50aWMgcGFnZXMgZm9yIGh1Z2V0bGIuICBUaGlzIE1VU1Qgb2NjdXIgYmVmb3JlCisJICogbG93bWVtX2VuZF9hZGRyIGlzIGluaXRpYWxpemVkIGJlbG93LgorCSAqLworCXJlc2VydmVfaHVnZXRsYl9ncGFnZXMoKTsKKwogCWlmIChtZW1ibG9jay5tZW1vcnkuY250ID4gMSkgewogI2lmbmRlZiBDT05GSUdfV0lJCiAJCW1lbWJsb2NrLm1lbW9yeS5jbnQgPSAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IGM3ODFiYmMuLjJkZDZiZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtMTIzLDcgKzEyNCw4IEBACiAJcGdkYXRhID0gTk9ERV9EQVRBKG5pZCk7CiAKIAlzdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoc3RhcnQpOwotCWNyZWF0ZV9zZWN0aW9uX21hcHBpbmcoc3RhcnQsIHN0YXJ0ICsgc2l6ZSk7CisJaWYgKGNyZWF0ZV9zZWN0aW9uX21hcHBpbmcoc3RhcnQsIHN0YXJ0ICsgc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogdGhpcyBzaG91bGQgd29yayBmb3IgbW9zdCBub24taGlnaG1lbSBwbGF0Zm9ybXMgKi8KIAl6b25lID0gcGdkYXRhLT5ub2RlX3pvbmVzOwpAQCAtNTQ4LDQgKzU1MCwzOCBAQAogCQlyZXR1cm47CiAJaGFzaF9wcmVsb2FkKHZtYS0+dm1fbW0sIGFkZHJlc3MsIGFjY2VzcywgdHJhcCk7CiAjZW5kaWYgLyogQ09ORklHX1BQQ19TVERfTU1VICovCisjaWYgKGRlZmluZWQoQ09ORklHX1BQQ19CT09LM0VfNjQpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19GU0xfQk9PSzNFKSkgXAorCSYmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRSkKKwlpZiAoaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpCisJCWJvb2szZV9odWdldGxiX3ByZWxvYWQodm1hLT52bV9tbSwgYWRkcmVzcywgKnB0ZXApOworI2VuZGlmCiB9CisKKy8qCisgKiBTeXN0ZW0gbWVtb3J5IHNob3VsZCBub3QgYmUgaW4gL3Byb2MvaW9tZW0gYnV0IHZhcmlvdXMgdG9vbHMgZXhwZWN0IGl0CisgKiAoZWcga2R1bXApLgorICovCitzdGF0aWMgaW50IGFkZF9zeXN0ZW1fcmFtX3Jlc291cmNlcyh2b2lkKQoreworCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJlZzsKKworCWZvcl9lYWNoX21lbWJsb2NrKG1lbW9yeSwgcmVnKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCQl1bnNpZ25lZCBsb25nIGJhc2UgPSByZWctPmJhc2U7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHJlZy0+c2l6ZTsKKworCQlyZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKwkJV0FSTl9PTighcmVzKTsKKworCQlpZiAocmVzKSB7CisJCQlyZXMtPm5hbWUgPSAiU3lzdGVtIFJBTSI7CisJCQlyZXMtPnN0YXJ0ID0gYmFzZTsKKwkJCXJlcy0+ZW5kID0gYmFzZSArIHNpemUgLSAxOworCQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCQkJV0FSTl9PTihyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzKSA8IDApOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwoYWRkX3N5c3RlbV9yYW1fcmVzb3VyY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9oYXNoMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9oYXNoMzIuYwppbmRleCBkMGVlNTU0Li43OGZlZjY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfaGFzaDMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X2hhc2gzMi5jCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X2hhc2g2NC5jIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X2hhc2g2NC5jCmluZGV4IDNiYWZjM2QuLmNhOTg4YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9oYXNoNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfaGFzaDY0LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC0xMzYsOCArMTM2LDggQEAKIAlpZiAoIW1tIHx8ICFhY29wKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIG1tX3VzZXJzIGRvZXNuJ3QgY2hhbmdlICovCi0JZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCS8qIFRoZSBwYWdlX3RhYmxlX2xvY2sgZW5zdXJlcyBtbV91c2VycyB3b24ndCBjaGFuZ2UgdW5kZXIgdXMgKi8KKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCXNwaW5fbG9jayhtbS0+Y29udGV4dC5jb3BfbG9ja3ApOwogCiAJaWYgKG1tLT5jb250ZXh0LmNvcF9waWQgPT0gQ09QX1BJRF9OT05FKSB7CkBAIC0xNjQsNyArMTY0LDcgQEAKIAogb3V0OgogCXNwaW5fdW5sb2NrKG1tLT5jb250ZXh0LmNvcF9sb2NrcCk7Ci0JdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTg1LDggKzE4NSw4IEBACiAJaWYgKFdBUk5fT05fT05DRSghbW0pKQogCQlyZXR1cm47CiAKLQkvKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSBtbV91c2VycyBkb2Vzbid0IGNoYW5nZSAqLwotCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkvKiBUaGUgcGFnZV90YWJsZV9sb2NrIGVuc3VyZXMgbW1fdXNlcnMgd29uJ3QgY2hhbmdlIHVuZGVyIHVzICovCisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlzcGluX2xvY2sobW0tPmNvbnRleHQuY29wX2xvY2twKTsKIAogCW1tLT5jb250ZXh0LmFjb3AgJj0gfmFjb3A7CkBAIC0yMTMsNyArMjEzLDcgQEAKIAl9CiAKIAlzcGluX3VubG9jayhtbS0+Y29udGV4dC5jb3BfbG9ja3ApOwotCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZHJvcF9jb3ApOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMKaW5kZXggMzM2ODA3ZC4uNWI2M2JkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9ub2hhc2guYwpAQCAtMjkyLDYgKzI5MiwxMSBAQAogCW1tLT5jb250ZXh0LmlkID0gTU1VX05PX0NPTlRFWFQ7CiAJbW0tPmNvbnRleHQuYWN0aXZlID0gMDsKIAorI2lmZGVmIENPTkZJR19QUENfTU1fU0xJQ0VTCisJaWYgKHNsaWNlX21tX25ld19jb250ZXh0KG1tKSkKKwkJc2xpY2Vfc2V0X3VzZXJfcHNpemUobW0sIG1tdV92aXJ0dWFsX3BzaXplKTsKKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oIGIvYXJjaC9wb3dlcnBjL21tL21tdV9kZWNsLmgKaW5kZXggZGQwYTI1OC4uODNlYjVkNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tdV9kZWNsLmgKKysrIGIvYXJjaC9wb3dlcnBjL21tL21tdV9kZWNsLmgKQEAgLTE0Miw2ICsxNDIsOCBAQAogCiAjZWxpZiBkZWZpbmVkKENPTkZJR19QUENfRlNMX0JPT0szRSkKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1hcF9tZW1faW5fY2Ftcyh1bnNpZ25lZCBsb25nIHJhbSwgaW50IG1heF9jYW1faWR4KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNhbGNfY2FtX3N6KHVuc2lnbmVkIGxvbmcgcmFtLCB1bnNpZ25lZCBsb25nIHZpcnQsCisJCQkJIHBoeXNfYWRkcl90IHBoeXMpOwogI2lmZGVmIENPTkZJR19QUEMzMgogZXh0ZXJuIHZvaWQgTU1VX2luaXRfaHcodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtbXVfbWFwaW5fcmFtKHVuc2lnbmVkIGxvbmcgdG9wKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCmluZGV4IDIxNjQwMDYuLmIyMmE4M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KQEAgLTMxNSw3ICszMTUsMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CiAJY29uc3QgY2hhciAqdmVjNTsKIAotCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL3J0YXMiKTsKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9PUEFMKSkKKwkJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvaWJtLG9wYWwiKTsKKwllbHNlCisJCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL3J0YXMiKTsKIAlpZiAoIXJvb3QpCiAJCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCkBAIC0zNDQsMTIgKzM0NywxOSBAQAogCiAjZGVmaW5lIFZFQzVfQUZGSU5JVFlfQllURQk1CiAjZGVmaW5lIFZFQzVfQUZGSU5JVFkJCTB4ODAKLQljaG9zZW4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2Nob3NlbiIpOwotCWlmIChjaG9zZW4pIHsKLQkJdmVjNSA9IG9mX2dldF9wcm9wZXJ0eShjaG9zZW4sICJpYm0sYXJjaGl0ZWN0dXJlLXZlYy01IiwgTlVMTCk7Ci0JCWlmICh2ZWM1ICYmICh2ZWM1W1ZFQzVfQUZGSU5JVFlfQllURV0gJiBWRUM1X0FGRklOSVRZKSkgewotCQkJZGJnKCJVc2luZyBmb3JtIDEgYWZmaW5pdHlcbiIpOwotCQkJZm9ybTFfYWZmaW5pdHkgPSAxOworCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTCkpCisJCWZvcm0xX2FmZmluaXR5ID0gMTsKKwllbHNlIHsKKwkJY2hvc2VuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jaG9zZW4iKTsKKwkJaWYgKGNob3NlbikgeworCQkJdmVjNSA9IG9mX2dldF9wcm9wZXJ0eShjaG9zZW4sCisJCQkJCSAgICAgICAiaWJtLGFyY2hpdGVjdHVyZS12ZWMtNSIsIE5VTEwpOworCQkJaWYgKHZlYzUgJiYgKHZlYzVbVkVDNV9BRkZJTklUWV9CWVRFXSAmCisJCQkJCQkJVkVDNV9BRkZJTklUWSkpIHsKKwkJCQlkYmcoIlVzaW5nIGZvcm0gMSBhZmZpbml0eVxuIik7CisJCQkJZm9ybTFfYWZmaW5pdHkgPSAxOworCQkJfQogCQl9CiAJfQogCkBAIC03MDksOCArNzE5LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgcGFyc2VfbnVtYV9wcm9wZXJ0aWVzKHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjcHUgPSBOVUxMOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWVtb3J5ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbW9yeTsKIAlpbnQgZGVmYXVsdF9uaWQgPSAwOwogCXVuc2lnbmVkIGxvbmcgaTsKIApAQCAtNzMyLDYgKzc0MSw3IEBACiAJICogZWFjaCBub2RlIHRvIGJlIG9ubGluZWQgbXVzdCBoYXZlIE5PREVfREFUQSBldGMgYmFja2luZyBpdC4KIAkgKi8KIAlmb3JfZWFjaF9wcmVzZW50X2NwdShpKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OwogCQlpbnQgbmlkOwogCiAJCWNwdSA9IG9mX2dldF9jcHVfbm9kZShpLCBOVUxMKTsKQEAgLTc1MCw4ICs3NjAsOCBAQAogCX0KIAogCWdldF9uX21lbV9jZWxscygmbl9tZW1fYWRkcl9jZWxscywgJm5fbWVtX3NpemVfY2VsbHMpOwotCW1lbW9yeSA9IE5VTEw7Ci0Jd2hpbGUgKChtZW1vcnkgPSBvZl9maW5kX25vZGVfYnlfdHlwZShtZW1vcnksICJtZW1vcnkiKSkgIT0gTlVMTCkgeworCisJZm9yX2VhY2hfbm9kZV9ieV90eXBlKG1lbW9yeSwgIm1lbW9yeSIpIHsKIAkJdW5zaWduZWQgbG9uZyBzdGFydDsKIAkJdW5zaWduZWQgbG9uZyBzaXplOwogCQlpbnQgbmlkOwpAQCAtODAwLDggKzgxMCw5IEBACiAJfQogCiAJLyoKLQkgKiBOb3cgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGVhY2ggTUVNQkxPQ0sgbGlzdGVkIGluIHRoZSBpYm0sZHluYW1pYy1tZW1vcnkKLQkgKiBwcm9wZXJ0eSBpbiB0aGUgaWJtLGR5bmFtaWMtcmVjb25maWd1cmF0aW9uLW1lbW9yeSBub2RlLgorCSAqIE5vdyBkbyB0aGUgc2FtZSB0aGluZyBmb3IgZWFjaCBNRU1CTE9DSyBsaXN0ZWQgaW4gdGhlCisJICogaWJtLGR5bmFtaWMtbWVtb3J5IHByb3BlcnR5IGluIHRoZQorCSAqIGlibSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkgbm9kZS4KIAkgKi8KIAltZW1vcnkgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkiKTsKIAlpZiAobWVtb3J5KQpAQCAtMTE4NywxMCArMTE5OCwxMCBAQAogICovCiBpbnQgaG90X2FkZF9ub2RlX3Njbl90b19uaWQodW5zaWduZWQgbG9uZyBzY25fYWRkcikKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbW9yeSA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICptZW1vcnk7CiAJaW50IG5pZCA9IC0xOwogCi0Jd2hpbGUgKChtZW1vcnkgPSBvZl9maW5kX25vZGVfYnlfdHlwZShtZW1vcnksICJtZW1vcnkiKSkgIT0gTlVMTCkgeworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShtZW1vcnksICJtZW1vcnkiKSB7CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemU7CiAJCWludCByYW5nZXM7CiAJCWNvbnN0IHVuc2lnbmVkIGludCAqbWVtY2VsbF9idWY7CkBAIC0xMjE0LDExICsxMjI1LDEyIEBACiAJCQlicmVhazsKIAkJfQogCi0JCW9mX25vZGVfcHV0KG1lbW9yeSk7CiAJCWlmIChuaWQgPj0gMCkKIAkJCWJyZWFrOwogCX0KIAorCW9mX25vZGVfcHV0KG1lbW9yeSk7CisKIAlyZXR1cm4gbmlkOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGUuYwppbmRleCBhZjQwYzg3Li4yMTQxMzBhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KQEAgLTIxMiw3ICsyMTMsNyBAQAogCWVudHJ5ID0gc2V0X2FjY2Vzc19mbGFnc19maWx0ZXIoZW50cnksIHZtYSwgZGlydHkpOwogCWNoYW5nZWQgPSAhcHRlX3NhbWUoKihwdGVwKSwgZW50cnkpOwogCWlmIChjaGFuZ2VkKSB7Ci0JCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9IVUdFVExCKSkKKwkJaWYgKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSkKIAkJCWFzc2VydF9wdGVfbG9ja2VkKHZtYS0+dm1fbW0sIGFkZHJlc3MpOwogCQlfX3B0ZXBfc2V0X2FjY2Vzc19mbGFncyhwdGVwLCBlbnRyeSk7CiAJCWZsdXNoX3RsYl9wYWdlX25vaGFzaCh2bWEsIGFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKaW5kZXggNmU1OTVmNi4uYWQzNmVkZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9zbGljZS5jIGIvYXJjaC9wb3dlcnBjL21tL3NsaWNlLmMKaW5kZXggYmE1MTk0OC4uNzM3MDlmNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3NsaWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3NsaWNlLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vbW1hbi5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vc3B1Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2hhc2gzMi5jIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9oYXNoMzIuYwppbmRleCA5YTQ0NWY2Li41NThlMzBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2hhc2gzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfaGFzaDMyLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9sb3dfNjRlLlMKaW5kZXggNGViYjM0Yi4uZGM0YTVmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl9sb3dfNjRlLlMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9sb3dfNjRlLlMKQEAgLTU1MywyNCArNTUzLDI0IEBACiAJcmxkaWNsCXIxMSxyMTYsNjQtVlBURV9QR0RfU0hJRlQsNjQtUEdEX0lOREVYX1NJWkUtMwogCWNscnJkaQlyMTAscjExLDMKIAlsZHgJcjE1LHIxMCxyMTUKLQljbXBsZGkJY3IwLHIxNSwwCi0JYmVxCXZpcnRfcGFnZV90YWJsZV90bGJfbWlzc19mYXVsdAorCWNtcGRpCWNyMCxyMTUsMAorCWJnZQl2aXJ0X3BhZ2VfdGFibGVfdGxiX21pc3NfZmF1bHQKIAogI2lmbmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwogCS8qIEdldCB0byBQVUQgZW50cnkgKi8KIAlybGRpY2wJcjExLHIxNiw2NC1WUFRFX1BVRF9TSElGVCw2NC1QVURfSU5ERVhfU0laRS0zCiAJY2xycmRpCXIxMCxyMTEsMwogCWxkeAlyMTUscjEwLHIxNQotCWNtcGxkaQljcjAscjE1LDAKLQliZXEJdmlydF9wYWdlX3RhYmxlX3RsYl9taXNzX2ZhdWx0CisJY21wZGkJY3IwLHIxNSwwCisJYmdlCXZpcnRfcGFnZV90YWJsZV90bGJfbWlzc19mYXVsdAogI2VuZGlmIC8qIENPTkZJR19QUENfNjRLX1BBR0VTICovCiAKIAkvKiBHZXQgdG8gUE1EIGVudHJ5ICovCiAJcmxkaWNsCXIxMSxyMTYsNjQtVlBURV9QTURfU0hJRlQsNjQtUE1EX0lOREVYX1NJWkUtMwogCWNscnJkaQlyMTAscjExLDMKIAlsZHgJcjE1LHIxMCxyMTUKLQljbXBsZGkJY3IwLHIxNSwwCi0JYmVxCXZpcnRfcGFnZV90YWJsZV90bGJfbWlzc19mYXVsdAorCWNtcGRpCWNyMCxyMTUsMAorCWJnZQl2aXJ0X3BhZ2VfdGFibGVfdGxiX21pc3NfZmF1bHQKIAogCS8qIE9rLCB3ZSdyZSBhbGwgcmlnaHQsIHdlIGNhbiBub3cgY3JlYXRlIGEga2VybmVsIHRyYW5zbGF0aW9uIGZvcgogCSAqIGEgNEsgb3IgNjRLIHBhZ2UgZnJvbSByMTYgLT4gcjE1LgpAQCAtODAyLDI0ICs4MDIsMjQgQEAKIAlybGRpY2wJcjExLHIxNiw2NC0oUEdESVJfU0hJRlQtMyksNjQtUEdEX0lOREVYX1NJWkUtMwogCWNscnJkaQlyMTAscjExLDMKIAlsZHgJcjE1LHIxMCxyMTUKLQljbXBsZGkJY3IwLHIxNSwwCi0JYmVxCWh0d190bGJfbWlzc19mYXVsdAorCWNtcGRpCWNyMCxyMTUsMAorCWJnZQlodHdfdGxiX21pc3NfZmF1bHQKIAogI2lmbmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwogCS8qIEdldCB0byBQVUQgZW50cnkgKi8KIAlybGRpY2wJcjExLHIxNiw2NC0oUFVEX1NISUZULTMpLDY0LVBVRF9JTkRFWF9TSVpFLTMKIAljbHJyZGkJcjEwLHIxMSwzCiAJbGR4CXIxNSxyMTAscjE1Ci0JY21wbGRpCWNyMCxyMTUsMAotCWJlcQlodHdfdGxiX21pc3NfZmF1bHQKKwljbXBkaQljcjAscjE1LDAKKwliZ2UJaHR3X3RsYl9taXNzX2ZhdWx0CiAjZW5kaWYgLyogQ09ORklHX1BQQ182NEtfUEFHRVMgKi8KIAogCS8qIEdldCB0byBQTUQgZW50cnkgKi8KIAlybGRpY2wJcjExLHIxNiw2NC0oUE1EX1NISUZULTMpLDY0LVBNRF9JTkRFWF9TSVpFLTMKIAljbHJyZGkJcjEwLHIxMSwzCiAJbGR4CXIxNSxyMTAscjE1Ci0JY21wbGRpCWNyMCxyMTUsMAotCWJlcQlodHdfdGxiX21pc3NfZmF1bHQKKwljbXBkaQljcjAscjE1LDAKKwliZ2UJaHR3X3RsYl9taXNzX2ZhdWx0CiAKIAkvKiBPaywgd2UncmUgYWxsIHJpZ2h0LCB3ZSBjYW4gbm93IGNyZWF0ZSBhbiBpbmRpcmVjdCBlbnRyeSBmb3IKIAkgKiBhIDFNIG9yIDI1Nk0gcGFnZS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCmluZGV4IGQzMmVjNjQuLjRlMTNkNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwpAQCAtMjgsNiArMjgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CkBAIC0zNiwxNCArMzcsNDkgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgogI2luY2x1ZGUgPGFzbS9jb2RlLXBhdGNoaW5nLmg+CisjaW5jbHVkZSA8YXNtL2h1Z2V0bGIuaD4KIAogI2luY2x1ZGUgIm1tdV9kZWNsLmgiCiAKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szRQorLyoKKyAqIFRoaXMgc3RydWN0IGxpc3RzIHRoZSBzdy1zdXBwb3J0ZWQgcGFnZSBzaXplcy4gIFRoZSBoYXJkYXdyZSBNTVUgbWF5IHN1cHBvcnQKKyAqIG90aGVyIHNpemVzIG5vdCBsaXN0ZWQgaGVyZS4gICBUaGUgLmluZCBmaWVsZCBpcyBvbmx5IHVzZWQgb24gTU1VcyB0aGF0IGhhdmUKKyAqIGluZGlyZWN0IHBhZ2UgdGFibGUgZW50cmllcy4KKyAqLworI2lmZGVmIENPTkZJR19QUENfQk9PSzNFX01NVQorI2lmZGVmIENPTkZJR19GU0xfQk9PS0UKK3N0cnVjdCBtbXVfcHNpemVfZGVmIG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFX0NPVU5UXSA9IHsKKwlbTU1VX1BBR0VfNEtdID0geworCQkuc2hpZnQJPSAxMiwKKwkJLmVuYwk9IEJPT0szRV9QQUdFU1pfNEssCisJfSwKKwlbTU1VX1BBR0VfNE1dID0geworCQkuc2hpZnQJPSAyMiwKKwkJLmVuYwk9IEJPT0szRV9QQUdFU1pfNE0sCisJfSwKKwlbTU1VX1BBR0VfMTZNXSA9IHsKKwkJLnNoaWZ0CT0gMjQsCisJCS5lbmMJPSBCT09LM0VfUEFHRVNaXzE2TSwKKwl9LAorCVtNTVVfUEFHRV82NE1dID0geworCQkuc2hpZnQJPSAyNiwKKwkJLmVuYwk9IEJPT0szRV9QQUdFU1pfNjRNLAorCX0sCisJW01NVV9QQUdFXzI1Nk1dID0geworCQkuc2hpZnQJPSAyOCwKKwkJLmVuYwk9IEJPT0szRV9QQUdFU1pfMjU2TSwKKwl9LAorCVtNTVVfUEFHRV8xR10gPSB7CisJCS5zaGlmdAk9IDMwLAorCQkuZW5jCT0gQk9PSzNFX1BBR0VTWl8xR0IsCisJfSwKK307CisjZWxzZQogc3RydWN0IG1tdV9wc2l6ZV9kZWYgbW11X3BzaXplX2RlZnNbTU1VX1BBR0VfQ09VTlRdID0gewogCVtNTVVfUEFHRV80S10gPSB7CiAJCS5zaGlmdAk9IDEyLApAQCAtNzcsNiArMTEzLDggQEAKIAkJLmVuYwk9IEJPT0szRV9QQUdFU1pfMUdCLAogCX0sCiB9OworI2VuZGlmIC8qIENPTkZJR19GU0xfQk9PS0UgKi8KKwogc3RhdGljIGlubGluZSBpbnQgbW11X2dldF90c2l6ZShpbnQgcHNpemUpCiB7CiAJcmV0dXJuIG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5lbmM7CkBAIC04Nyw3ICsxMjUsNyBAQAogCS8qIFRoaXMgaXNuJ3QgdXNlZCBvbiAhQm9vazNFIGZvciBub3cgKi8KIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19QUENfQk9PSzNFX01NVSAqLwogCiAvKiBUaGUgdmFyaWFibGVzIGJlbG93IGFyZSBjdXJyZW50bHkgb25seSB1c2VkIG9uIDY0LWJpdCBCb29rM0UKICAqIHRob3VnaCB0aGlzIHdpbGwgcHJvYmFibHkgYmUgbWFkZSBjb21tb24gd2l0aCBvdGhlciBub2hhc2gKQEAgLTI2Niw2ICszMDQsMTEgQEAKIAogdm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB2bWFkZHIpCiB7CisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQorCWlmIChpc192bV9odWdldGxiX3BhZ2Uodm1hKSkKKwkJZmx1c2hfaHVnZXRsYl9wYWdlKHZtYSwgdm1hZGRyKTsKKyNlbmRpZgorCiAJX19mbHVzaF90bGJfcGFnZSh2bWEgPyB2bWEtPnZtX21tIDogTlVMTCwgdm1hZGRyLAogCQkJIG1tdV9nZXRfdHNpemUobW11X3ZpcnR1YWxfcHNpemUpLCAwKTsKIH0KQEAgLTYwMCwxMyArNjQzLDI4IEBACiB2b2lkIHNldHVwX2luaXRpYWxfbWVtb3J5X2xpbWl0KHBoeXNfYWRkcl90IGZpcnN0X21lbWJsb2NrX2Jhc2UsCiAJCQkJcGh5c19hZGRyX3QgZmlyc3RfbWVtYmxvY2tfc2l6ZSkKIHsKLQkvKiBPbiBFbWJlZGRlZCA2NC1iaXQsIHdlIGFkanVzdCB0aGUgUk1BIHNpemUgdG8gbWF0Y2gKKwkvKiBPbiBub24tRlNMIEVtYmVkZGVkIDY0LWJpdCwgd2UgYWRqdXN0IHRoZSBSTUEgc2l6ZSB0byBtYXRjaAogCSAqIHRoZSBib2x0ZWQgVExCIGVudHJ5LiBXZSBrbm93IGZvciBub3cgdGhhdCBvbmx5IDFHCiAJICogZW50cmllcyBhcmUgc3VwcG9ydGVkIHRob3VnaCB0aGF0IG1heSBldmVudHVhbGx5Ci0JICogY2hhbmdlLiBXZSBjcm9wIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBNRU1CTE9DSyB0bworCSAqIGNoYW5nZS4KKwkgKgorCSAqIG9uIEZTTCBFbWJlZGRlZCA2NC1iaXQsIHdlIGFkanVzdCB0aGUgUk1BIHNpemUgdG8gbWF0Y2ggdGhlCisJICogZmlyc3QgYm9sdGVkIFRMQiBlbnRyeSBzaXplLiAgV2Ugc3RpbGwgbGltaXQgbWF4IHRvIDFHIGV2ZW4gaWYKKwkgKiB0aGUgVExCIGNvdWxkIGNvdmVyIG1vcmUuICBUaGlzIGlzIGR1ZSB0byB3aGF0IHRoZSBlYXJseSBpbml0CisJICogY29kZSBpcyBzZXR1cCB0byBkby4KKwkgKgorCSAqIFdlIGNyb3AgaXQgdG8gdGhlIHNpemUgb2YgdGhlIGZpcnN0IE1FTUJMT0NLIHRvCiAJICogYXZvaWQgZ29pbmcgb3ZlciB0b3RhbCBhdmFpbGFibGUgbWVtb3J5IGp1c3QgaW4gY2FzZS4uLgogCSAqLwotCXBwYzY0X3JtYV9zaXplID0gbWluX3QodTY0LCBmaXJzdF9tZW1ibG9ja19zaXplLCAweDQwMDAwMDAwKTsKKyNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKKwlpZiAobW11X2hhc19mZWF0dXJlKE1NVV9GVFJfVFlQRV9GU0xfRSkpIHsKKwkJdW5zaWduZWQgbG9uZyBsaW5lYXJfc3o7CisJCWxpbmVhcl9zeiA9IGNhbGNfY2FtX3N6KGZpcnN0X21lbWJsb2NrX3NpemUsIFBBR0VfT0ZGU0VULAorCQkJCQlmaXJzdF9tZW1ibG9ja19iYXNlKTsKKwkJcHBjNjRfcm1hX3NpemUgPSBtaW5fdCh1NjQsIGxpbmVhcl9zeiwgMHg0MDAwMDAwMCk7CisJfSBlbHNlCisjZW5kaWYKKwkJcHBjNjRfcm1hX3NpemUgPSBtaW5fdCh1NjQsIGZpcnN0X21lbWJsb2NrX3NpemUsIDB4NDAwMDAwMDApOwogCiAJLyogRmluYWxseSBsaW1pdCBzdWJzZXF1ZW50IGFsbG9jYXRpb25zICovCiAJbWVtYmxvY2tfc2V0X2N1cnJlbnRfbGltaXQoZmlyc3RfbWVtYmxvY2tfYmFzZSArIHBwYzY0X3JtYV9zaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9LY29uZmlnCmluZGV4IGI1ZDg3MDYuLjE1MzAyMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvS2NvbmZpZwpAQCAtMzIsMTQgKzMyLDYgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBFUDQwNS9FUDQwNVBDIGJvYXJkcy4KIAotY29uZmlnIEhDVTQKLQlib29sICJIY3U0IgotCWRlcGVuZHMgb24gNDB4Ci0JZGVmYXVsdCBuCi0Jc2VsZWN0IDQwNUdQUgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE5lc3RhbCBNYXNjaGluZW4gSENVNCBib2FyZC4KLQogY29uZmlnIEhPVEZPT1QKICAgICAgICAgYm9vbCAiSG90Zm9vdCIKIAlkZXBlbmRzIG9uIDQweApAQCAtMTE1LDExICsxMDcsNiBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIHNpbXBsZSBQb3dlclBDIDQweCBwbGF0Zm9ybSBzdXBwb3J0LgogCi0jIDQweCBzcGVjaWZpYyBDUFUgbW9kdWxlcywgc2VsZWN0ZWQgYmFzZWQgb24gdGhlIGJvYXJkIGFib3ZlLgotY29uZmlnIE5QNDA1SAotCWJvb2wKLQkjZGVwZW5kcyBvbiBBU0gKLQogIyBPQUsgZG9lc24ndCBleGlzdCBidXQgd2FudGVkIHRvIGtlZXAgdGhpcyBhcm91bmQgZm9yIGFueSBmdXR1cmUgNDAzR0NYIGJvYXJkcwogY29uZmlnIDQwM0dDWAogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvTWFrZWZpbGUKaW5kZXggNTZlODkwMC4uODhjMjJkZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvTWFrZWZpbGUKQEAgLTEsNCArMSwzIEBACi1vYmotJChDT05GSUdfSENVNCkJCQkJKz0gaGN1NC5vCiBvYmotJChDT05GSUdfV0FMTlVUKQkJCQkrPSB3YWxudXQubwogb2JqLSQoQ09ORklHX1hJTElOWF9WSVJURVhfR0VORVJJQ19CT0FSRCkJKz0gdmlydGV4Lm8KIG9iai0kKENPTkZJR19FUDQwNSkJCQkJKz0gZXA0MDUubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvaGN1NC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvaGN1NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGIyYWZlLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L2hjdTQuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBBcmNoaXRlY3R1cmUtIC8gcGxhdGZvcm0tc3BlY2lmaWMgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yCi0gKiBJQk0gUG93ZXJQQyA0eHggYmFzZWQgYm9hcmRzLiBBZGFwdGVkIGZyb20gb3JpZ2luYWwKLSAqIGNvZGUgYnkgR2FyeSBUaG9tYXMsIENvcnQgRG91Z2FuIDxjb3J0QGZzbWxhYnMuY29tPiwgYW5kIERhbiBNYWxlawotICogPGRhbkBuZXQ0eC5jb20+LgotICoKLSAqIENvcHlyaWdodChjKSAxOTk5LTIwMDAgR3JhbnQgRXJpY2tzb24gPGdyYW50QGxjc2UudW1uLmVkdT4KLSAqCi0gKiBSZXdyaXR0ZW4gYW5kIHBvcnRlZCB0byB0aGUgbWVyZ2VkIHBvd2VycGMgdHJlZToKLSAqIENvcHlyaWdodCAyMDA3IElCTSBDb3Jwb3JhdGlvbgotICogSm9zaCBCb3llciA8andib3llckBsaW51eC52bmV0LmlibS5jb20+Ci0gKgotICogMjAwMiAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgotICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KLSAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3VkYmcuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS91aWMuaD4KLSNpbmNsdWRlIDxhc20vcHBjNHh4Lmg+Ci0KLXN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvZl9kZXZpY2VfaWQgaGN1NF9vZl9idXNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImlibSxwbGIzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImlibSxvcGIiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiaWJtLGViYyIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBoY3U0X2RldmljZV9wcm9iZSh2b2lkKQotewotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBoY3U0X29mX2J1cywgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChoY3U0LCBoY3U0X2RldmljZV9wcm9iZSk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGhjdTRfcHJvYmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0KLQlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAibmV0c3RhbCxoY3U0IikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWRlZmluZV9tYWNoaW5lKGhjdTQpIHsKLQkubmFtZQkJCT0gIkhDVTQiLAotCS5wcm9iZQkJCT0gaGN1NF9wcm9iZSwKLQkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKLQkuaW5pdF9JUlEJCT0gdWljX2luaXRfdHJlZSwKLQkuZ2V0X2lycQkJPSB1aWNfZ2V0X2lycSwKLQkucmVzdGFydAkJPSBwcGM0eHhfcmVzZXRfc3lzdGVtLAotCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3dhcnAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3dhcnAuYwppbmRleCA4Zjc3MTM5Li40Y2ZhNDk5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC93YXJwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvd2FycC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L0tjb25maWcKaW5kZXggMjdiMDY1MS4uYjNlYmNlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L0tjb25maWcKQEAgLTYsNiArNiw3IEBACiAJc2VsZWN0IFBQQ19DTE9DSwogCXNlbGVjdCBQUENfUENJX0NIT0lDRQogCXNlbGVjdCBGU0xfUENJIGlmIFBDSQorCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCiBjb25maWcgTVBDNTEyMV9BRFMKIAlib29sICJGcmVlc2NhbGUgTVBDNTEyMUUgQURTIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L2Nsb2NrLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvY2xvY2suYwppbmRleCAzZGMyYThkLi4xZDg3MDBmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvY2xvY2suYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvY2xvY2suYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4X3NoYXJlZC5jCmluZGV4IGU0MWViYmQuLmNmZTk1OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4X3NoYXJlZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4X3NoYXJlZC5jCkBAIC02Niw4ICs2Niw4IEBACiAJYm9vbAkJaW5fdXNlOwogfTsKIAotdW5zaWduZWQgaW50IG1wYzUxMnhfZ2V0X3BpeGVsX2Zvcm1hdCh1bnNpZ25lZCBpbnQgYml0c19wZXJfcGl4ZWwsCi0JCQkJICAgICAgaW50IG1vbml0b3JfcG9ydCkKK3UzMiBtcGM1MTJ4X2dldF9waXhlbF9mb3JtYXQoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0LAorCQkJICAgICB1bnNpZ25lZCBpbnQgYml0c19wZXJfcGl4ZWwpCiB7CiAJc3dpdGNoIChiaXRzX3Blcl9waXhlbCkgewogCWNhc2UgMzI6CkBAIC04MCwxMSArODAsMTIgQEAKIAlyZXR1cm4gMHgwMDAwMDQwMDsKIH0KIAotdm9pZCBtcGM1MTJ4X3NldF9nYW1tYV90YWJsZShpbnQgbW9uaXRvcl9wb3J0LCBjaGFyICpnYW1tYV90YWJsZV9iYXNlKQordm9pZCBtcGM1MTJ4X3NldF9nYW1tYV90YWJsZShlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQsCisJCQkgICAgIGNoYXIgKmdhbW1hX3RhYmxlX2Jhc2UpCiB7CiB9CiAKLXZvaWQgbXBjNTEyeF9zZXRfbW9uaXRvcl9wb3J0KGludCBtb25pdG9yX3BvcnQpCit2b2lkIG1wYzUxMnhfc2V0X21vbml0b3JfcG9ydChlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQpCiB7CiB9CiAKQEAgLTE4MiwxNCArMTgzLDEwIEBACiAJaW91bm1hcChjY20pOwogfQogCi1zc2l6ZV90IG1wYzUxMnhfc2hvd19tb25pdG9yX3BvcnQoaW50IG1vbml0b3JfcG9ydCwgY2hhciAqYnVmKQorZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydAorbXBjNTEyeF92YWxpZF9tb25pdG9yX3BvcnQoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0KQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjAgLSA1MTIxIExDRFxuIik7Ci19Ci0KLWludCBtcGM1MTJ4X3NldF9zeXNmc19tb25pdG9yX3BvcnQoaW50IHZhbCkKLXsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gRlNMX0RJVV9QT1JUX0RWSTsKIH0KIAogc3RhdGljIHN0cnVjdCBmc2xfZGl1X3NoYXJlZF9mYiBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oOCkpKSBkaXVfc2hhcmVkX2ZiOwpAQCAtMjU2LDcgKzI1Myw3IEBACiAJfQogCiAJbW9kZSA9IGluX2JlMzIoJmRpdV9yZWctPmRpdV9tb2RlKTsKLQlpZiAobW9kZSAhPSBNRkJfTU9ERTEpIHsKKwlpZiAobW9kZSA9PSBNRkJfTU9ERTApIHsKIAkJcHJfaW5mbygiJXM6IERJVSBPRkZcbiIsIF9fZnVuY19fKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzMyLDggKzMyOSw3IEBACiAJZGl1X29wcy5zZXRfZ2FtbWFfdGFibGUJCT0gbXBjNTEyeF9zZXRfZ2FtbWFfdGFibGU7CiAJZGl1X29wcy5zZXRfbW9uaXRvcl9wb3J0CT0gbXBjNTEyeF9zZXRfbW9uaXRvcl9wb3J0OwogCWRpdV9vcHMuc2V0X3BpeGVsX2Nsb2NrCQk9IG1wYzUxMnhfc2V0X3BpeGVsX2Nsb2NrOwotCWRpdV9vcHMuc2hvd19tb25pdG9yX3BvcnQJPSBtcGM1MTJ4X3Nob3dfbW9uaXRvcl9wb3J0OwotCWRpdV9vcHMuc2V0X3N5c2ZzX21vbml0b3JfcG9ydAk9IG1wYzUxMnhfc2V0X3N5c2ZzX21vbml0b3JfcG9ydDsKKwlkaXVfb3BzLnZhbGlkX21vbml0b3JfcG9ydAk9IG1wYzUxMnhfdmFsaWRfbW9uaXRvcl9wb3J0OwogCWRpdV9vcHMucmVsZWFzZV9ib290bWVtCQk9IG1wYzUxMnhfcmVsZWFzZV9ib290bWVtOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCmluZGV4IGUzNmQ2ZTIuLjg0NmI3ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCkBAIC01MCw2ICs1MCw3IEBACiAKIC8qIGxpc3Qgb2YgdGhlIHN1cHBvcnRlZCBib2FyZHMgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CisJImFub24sY2hhcm9uIiwKIAkiaW50ZXJjb250cm9sLGRpZ3N5LW10YyIsCiAJIm1hbnJvbGFuZCxtdWNtYzUyIiwKIAkibWFucm9sYW5kLHVjMTAxIiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2NvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMKaW5kZXggNDFmM2E3ZS4uMzY5ZmQ1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3B0LmMKaW5kZXggNmMzOWI5Yy4uZjk0ZjA2ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3B0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3B0LmMKQEAgLTY3LDYgKzY3LDcgQEAKICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfbHBiZmlmby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfbHBiZmlmby5jCmluZGV4IDk5NDBjZTguLmQ2MWZiMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2xwYmZpZm8uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9scGJmaWZvLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tcGM1Mnh4Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgva204Mnh4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgva204Mnh4LmMKaW5kZXggNDI4YzVlMC4uMzY2MWJjZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L2ttODJ4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9rbTgyeHguYwpAQCAtNDksNiArNDksOSBAQAogfTsKIAogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGNwbV9waW4ga204Mnh4X3BpbnNbXSA9IHsKKwkvKiBTTUMxICovCisJezIsIDQsIENQTV9QSU5fSU5QVVQgfCBDUE1fUElOX1BSSU1BUll9LAorCXsyLCA1LCBDUE1fUElOX09VVFBVVCB8IENQTV9QSU5fUFJJTUFSWX0sCiAKIAkvKiBTTUMyICovCiAJezAsIDgsIENQTV9QSU5fSU5QVVQgfCBDUE1fUElOX1BSSU1BUll9LApAQCAtMTM3LDYgKzE0MCw3IEBACiAJfQogCiAJY3BtMl9zbWNfY2xrX3NldHVwKENQTV9DTEtfU01DMiwgQ1BNX0JSRzgpOworCWNwbTJfc21jX2Nsa19zZXR1cChDUE1fQ0xLX1NNQzEsIENQTV9CUkc3KTsKIAljcG0yX2Nsa19zZXR1cChDUE1fQ0xLX1NDQzEsIENQTV9DTEsxMSwgQ1BNX0NMS19SWCk7CiAJY3BtMl9jbGtfc2V0dXAoQ1BNX0NMS19TQ0MxLCBDUE1fQ0xLMTEsIENQTV9DTEtfVFgpOwogCWNwbTJfY2xrX3NldHVwKENQTV9DTEtfU0NDMywgQ1BNX0NMSzUsIENQTV9DTEtfUlRYKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKaW5kZXggNzNmNDEzNWYuLjY3MGEwMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCkBAIC0xMTQsMTggKzExNCwyMSBAQAogCiBlbmRpZgogCi0jIHVzZWQgZm9yIHVzYgorIyB1c2VkIGZvciB1c2IgJiBncGlvCiBjb25maWcgUFBDX01QQzgzMXgKIAlib29sCisJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAKICMgdXNlZCBmb3IgbWF0aC1lbXUKIGNvbmZpZyBQUENfTVBDODMyeAogCWJvb2wKIAotIyB1c2VkIGZvciB1c2IKKyMgdXNlZCBmb3IgdXNiICYgZ3BpbwogY29uZmlnIFBQQ19NUEM4MzR4CiAJYm9vbAorCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCi0jIHVzZWQgZm9yIHVzYgorIyB1c2VkIGZvciB1c2IgJiBncGlvCiBjb25maWcgUFBDX01QQzgzN3gKIAlib29sCisJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbWN1X21wYzgzNDllbWl0eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21jdV9tcGM4MzQ5ZW1pdHguYwppbmRleCA3MDc5OGFjLi5lZjY1MzdiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbWN1X21wYzgzNDllbWl0eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KIApAQCAtMzAsNiArMzIsNyBAQAogICovCiAjZGVmaW5lIE1DVV9SRUdfQ1RSTAkweDIwCiAjZGVmaW5lIE1DVV9DVFJMX1BPRkYJMHg0MAorI2RlZmluZSBNQ1VfQ1RSTF9CVE4JMHg4MAogCiAjZGVmaW5lIE1DVV9OVU1fR1BJTwkyCiAKQEAgLTQyLDEzICs0NSw1NSBAQAogCiBzdGF0aWMgc3RydWN0IG1jdSAqZ2xvYl9tY3U7CiAKK3N0cnVjdCB0YXNrX3N0cnVjdCAqc2h1dGRvd25fdGhyZWFkOworc3RhdGljIGludCBzaHV0ZG93bl90aHJlYWRfZm4odm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtY3UgKm1jdSA9IGdsb2JfbWN1OworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG1jdS0+Y2xpZW50LCBNQ1VfUkVHX0NUUkwpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiTUNVIHN0YXR1cyByZWcgcmVhZCBmYWlsZWQuXG4iKTsKKwkJbWN1LT5yZWdfY3RybCA9IHJldDsKKworCisJCWlmIChtY3UtPnJlZ19jdHJsICYgTUNVX0NUUkxfQlROKSB7CisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKG1jdS0+Y2xpZW50LCBNQ1VfUkVHX0NUUkwsCisJCQkJCQkgIG1jdS0+cmVnX2N0cmwgJiB+TUNVX0NUUkxfQlROKTsKKworCQkJY3RybF9hbHRfZGVsKCk7CisJCX0KKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19zdGF0dXMoc3RydWN0IGRldmljZSAqZCwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbWN1ICptY3UgPSBnbG9iX21jdTsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShtY3UtPmNsaWVudCwgTUNVX1JFR19DVFJMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbWN1LT5yZWdfY3RybCA9IHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwMnhcbiIsIHJldCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzLCBTX0lSVUdPLCBzaG93X3N0YXR1cywgTlVMTCk7CisKIHN0YXRpYyB2b2lkIG1jdV9wb3dlcl9vZmYodm9pZCkKIHsKIAlzdHJ1Y3QgbWN1ICptY3UgPSBnbG9iX21jdTsKIAogCXByX2luZm8oIlNlbmRpbmcgcG93ZXItb2ZmIHJlcXVlc3QgdG8gdGhlIE1DVS4uLlxuIik7CiAJbXV0ZXhfbG9jaygmbWN1LT5sb2NrKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGdsb2JfbWN1LT5jbGllbnQsIE1DVV9SRUdfQ1RSTCwKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKG1jdS0+Y2xpZW50LCBNQ1VfUkVHX0NUUkwsCiAJCQkJICBtY3UtPnJlZ19jdHJsIHwgTUNVX0NUUkxfUE9GRik7CiAJbXV0ZXhfdW5sb2NrKCZtY3UtPmxvY2spOwogfQpAQCAtMTMwLDYgKzE3NSwxMyBAQAogCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJ3aWxsIHByb3ZpZGUgcG93ZXItb2ZmIHNlcnZpY2VcbiIpOwogCX0KIAorCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfc3RhdHVzKSkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiY291bGRuJ3QgY3JlYXRlIGRldmljZSBmaWxlIGZvciBzdGF0dXNcbiIpOworCisJc2h1dGRvd25fdGhyZWFkID0ga3RocmVhZF9ydW4oc2h1dGRvd25fdGhyZWFkX2ZuLCBOVUxMLAorCQkJCSAgICAgICJtY3UtaTJjLXNoZG4iKTsKKwogCXJldHVybiAwOwogZXJyOgogCWtmcmVlKG1jdSk7CkBAIC0xNDEsNiArMTkzLDEwIEBACiAJc3RydWN0IG1jdSAqbWN1ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IHJldDsKIAorCWt0aHJlYWRfc3RvcChzaHV0ZG93bl90aHJlYWQpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3N0YXR1cyk7CisKIAlpZiAoZ2xvYl9tY3UgPT0gbWN1KSB7CiAJCXBwY19tZC5wb3dlcl9vZmYgPSBOVUxMOwogCQlnbG9iX21jdSA9IE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQuYwppbmRleCAxMDRmYWE4Li5lZGY2Njg3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9zdXNwZW5kLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3JlZy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZwppbmRleCAxMmY1OTMyLi40NTAyM2UyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZwpAQCAtMTcxLDE3ICsxNzEsMTggQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBXaW5kIFJpdmVyIFNCQzg1NjAgYm9hcmQKIAotY29uZmlnIFAyMDQwX1JEQgotCWJvb2wgIkZyZWVzY2FsZSBQMjA0MCBSREIiCitjb25maWcgUDIwNDFfUkRCCisJYm9vbCAiRnJlZXNjYWxlIFAyMDQxIFJEQiIKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKIAlzZWxlY3QgUFBDX0U1MDBNQwogCXNlbGVjdCBQSFlTXzY0QklUCiAJc2VsZWN0IFNXSU9UTEIKLQlzZWxlY3QgTVBDOHh4eF9HUElPCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IEdQSU9fTVBDOFhYWAogCXNlbGVjdCBIQVNfUkFQSURJTwogCXNlbGVjdCBQUENfRVBBUFJfSFZfUElDCiAJaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUDIwNDAgUkRCIGJvYXJkCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBQMjA0MSBSREIgYm9hcmQKIAogY29uZmlnIFAzMDQxX0RTCiAJYm9vbCAiRnJlZXNjYWxlIFAzMDQxIERTIgpAQCAtMTg5LDE5ICsxOTAsMzMgQEAKIAlzZWxlY3QgUFBDX0U1MDBNQwogCXNlbGVjdCBQSFlTXzY0QklUCiAJc2VsZWN0IFNXSU9UTEIKLQlzZWxlY3QgTVBDOHh4eF9HUElPCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IEdQSU9fTVBDOFhYWAogCXNlbGVjdCBIQVNfUkFQSURJTwogCXNlbGVjdCBQUENfRVBBUFJfSFZfUElDCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUDMwNDEgRFMgYm9hcmQKIAorY29uZmlnIFAzMDYwX1FEUworCWJvb2wgIkZyZWVzY2FsZSBQMzA2MCBRRFMiCisJc2VsZWN0IERFRkFVTFRfVUlNQUdFCisJc2VsZWN0IFBQQ19FNTAwTUMKKwlzZWxlY3QgUEhZU182NEJJVAorCXNlbGVjdCBTV0lPVExCCisJc2VsZWN0IE1QQzh4eHhfR1BJTworCXNlbGVjdCBIQVNfUkFQSURJTworCXNlbGVjdCBQUENfRVBBUFJfSFZfUElDCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUDMwNjAgUURTIGJvYXJkCisKIGNvbmZpZyBQNDA4MF9EUwogCWJvb2wgIkZyZWVzY2FsZSBQNDA4MCBEUyIKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKIAlzZWxlY3QgUFBDX0U1MDBNQwogCXNlbGVjdCBQSFlTXzY0QklUCiAJc2VsZWN0IFNXSU9UTEIKLQlzZWxlY3QgTVBDOHh4eF9HUElPCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IEdQSU9fTVBDOFhYWAogCXNlbGVjdCBIQVNfUkFQSURJTwogCXNlbGVjdCBQUENfRVBBUFJfSFZfUElDCiAJaGVscApAQCAtMjE2LDcgKzIzMSw4IEBACiAJc2VsZWN0IFBQQ19FNTAwTUMKIAlzZWxlY3QgUEhZU182NEJJVAogCXNlbGVjdCBTV0lPVExCCi0Jc2VsZWN0IE1QQzh4eHhfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBHUElPX01QQzhYWFgKIAlzZWxlY3QgSEFTX1JBUElESU8KIAlzZWxlY3QgUFBDX0VQQVBSX0hWX1BJQwogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZQppbmRleCBhOTcxYjMyLi5iYzVhY2I5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCkBAIC0xMyw4ICsxMyw5IEBACiBvYmotJChDT05GSUdfUDEwMTBfUkRCKSAgICs9IHAxMDEwcmRiLm8KIG9iai0kKENPTkZJR19QMTAyMl9EUykgICAgKz0gcDEwMjJfZHMubwogb2JqLSQoQ09ORklHX1AxMDIzX1JEUykgICArPSBwMTAyM19yZHMubwotb2JqLSQoQ09ORklHX1AyMDQwX1JEQikgICArPSBwMjA0MF9yZGIubyBjb3JlbmV0X2RzLm8KK29iai0kKENPTkZJR19QMjA0MV9SREIpICAgKz0gcDIwNDFfcmRiLm8gY29yZW5ldF9kcy5vCiBvYmotJChDT05GSUdfUDMwNDFfRFMpICAgICs9IHAzMDQxX2RzLm8gY29yZW5ldF9kcy5vCitvYmotJChDT05GSUdfUDMwNjBfUURTKSAgICs9IHAzMDYwX3Fkcy5vIGNvcmVuZXRfZHMubwogb2JqLSQoQ09ORklHX1A0MDgwX0RTKSAgICArPSBwNDA4MF9kcy5vIGNvcmVuZXRfZHMubwogb2JqLSQoQ09ORklHX1A1MDIwX0RTKSAgICArPSBwNTAyMF9kcy5vIGNvcmVuZXRfZHMubwogb2JqLSQoQ09ORklHX1NUWF9HUDMpCSAgKz0gc3R4X2dwMy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCmluZGV4IDJiZjk5NzguLjY2Y2I4ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKaW5kZXggOTczYjNmNC4uYTIzYTNmZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfZHMuYwppbmRleCAyNjZiM2FhLi5mZGExNTcxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfZHMuYwpAQCAtOTMsOCArOTMsOCBAQAogICogVGhlIEFyZWEgRGVzY3JpcHRvciBpcyBhIDMyLWJpdCB2YWx1ZSB0aGF0IGRldGVybWluZSB3aGljaCBiaXRzIGluIGVhY2gKICAqIHBpeGVsIGFyZSB0byBiZSB1c2VkIGZvciBlYWNoIGNvbG9yLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHAxMDIyZHNfZ2V0X3BpeGVsX2Zvcm1hdCh1bnNpZ25lZCBpbnQgYml0c19wZXJfcGl4ZWwsCi0JaW50IG1vbml0b3JfcG9ydCkKK3N0YXRpYyB1MzIgcDEwMjJkc19nZXRfcGl4ZWxfZm9ybWF0KGVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgcG9ydCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGJpdHNfcGVyX3BpeGVsKQogewogCXN3aXRjaCAoYml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDMyOgpAQCAtMTE4LDcgKzExOCw4IEBACiAgKiBPbiBzb21lIGJvYXJkcywgdGhlIGdhbW1hIHRhYmxlIGZvciBzb21lIHBvcnRzIG1heSBuZWVkIHRvIGJlIG1vZGlmaWVkLgogICogVGhpcyBpcyBub3QgdGhlIGNhc2Ugb24gdGhlIFAxMDIyRFMsIHNvIHdlIGRvIG5vdGhpbmcuCiAqLwotc3RhdGljIHZvaWQgcDEwMjJkc19zZXRfZ2FtbWFfdGFibGUoaW50IG1vbml0b3JfcG9ydCwgY2hhciAqZ2FtbWFfdGFibGVfYmFzZSkKK3N0YXRpYyB2b2lkIHAxMDIyZHNfc2V0X2dhbW1hX3RhYmxlKGVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgcG9ydCwKKwkJCQkgICAgY2hhciAqZ2FtbWFfdGFibGVfYmFzZSkKIHsKIH0KIApAQCAtMTI2LDM4ICsxMjcsNDMgQEAKICAqIHAxMDIyZHNfc2V0X21vbml0b3JfcG9ydDogc3dpdGNoIHRoZSBvdXRwdXQgdG8gYSBkaWZmZXJlbnQgbW9uaXRvciBwb3J0CiAgKgogICovCi1zdGF0aWMgdm9pZCBwMTAyMmRzX3NldF9tb25pdG9yX3BvcnQoaW50IG1vbml0b3JfcG9ydCkKK3N0YXRpYyB2b2lkIHAxMDIyZHNfc2V0X21vbml0b3JfcG9ydChlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwaXhpc19ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJdm9pZCBfX2lvbWVtICpwaXhpczsKIAl1OCBfX2lvbWVtICpicmRjZmcxOwogCi0JcGl4aXNfbm9kZSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscDEwMjJkcy1waXhpcyIpOwotCWlmICghcGl4aXNfbm9kZSkgeworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxwMTAyMmRzLWZwZ2EiKTsKKwlpZiAoIW5wKQorCQkvKiBvbGRlciBkZXZpY2UgdHJlZXMgdXNlZCAiZnNsLHAxMDIyZHMtcGl4aXMiICovCisJCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxwMTAyMmRzLXBpeGlzIik7CisJaWYgKCFucCkgewogCQlwcl9lcnIoInAxMDIyZHM6IG1pc3NpbmcgbmdQSVhJUyBub2RlXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXBpeGlzID0gb2ZfaW9tYXAocGl4aXNfbm9kZSwgMCk7CisJcGl4aXMgPSBvZl9pb21hcChucCwgMCk7CiAJaWYgKCFwaXhpcykgewogCQlwcl9lcnIoInAxMDIyZHM6IGNvdWxkIG5vdCBtYXAgbmdQSVhJUyByZWdpc3RlcnNcbiIpOwogCQlyZXR1cm47CiAJfQogCWJyZGNmZzEgPSBwaXhpcyArIDk7CS8qIEJSRENGRzEgaXMgYXQgb2Zmc2V0IDkgaW4gdGhlIG5nUElYSVMgKi8KIAotCXN3aXRjaCAobW9uaXRvcl9wb3J0KSB7Ci0JY2FzZSAwOiAvKiBEVkkgKi8KKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIEZTTF9ESVVfUE9SVF9EVkk6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkvKiBFbmFibGUgdGhlIERWSSBwb3J0LCBkaXNhYmxlIHRoZSBERlAgYW5kIHRoZSBiYWNrbGlnaHQgKi8KIAkJY2xyc2V0Yml0c184KGJyZGNmZzEsIFBYX0JSRENGRzFfREZQRU4gfCBQWF9CUkRDRkcxX0JBQ0tMSUdIVCwKIAkJCSAgICAgUFhfQlJEQ0ZHMV9EVklFTik7CiAJCWJyZWFrOwotCWNhc2UgMTogLyogU2luZ2xlIGxpbmsgTFZEUyAqLworCWNhc2UgRlNMX0RJVV9QT1JUX0xWRFM6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkvKiBFbmFibGUgdGhlIERGUCBwb3J0LCBkaXNhYmxlIHRoZSBEVkkgYW5kIHRoZSBiYWNrbGlnaHQgKi8KIAkJY2xyc2V0Yml0c184KGJyZGNmZzEsIFBYX0JSRENGRzFfRFZJRU4gfCBQWF9CUkRDRkcxX0JBQ0tMSUdIVCwKIAkJCSAgICAgUFhfQlJEQ0ZHMV9ERlBFTik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2VycigicDEwMjJkczogdW5zdXBwb3J0ZWQgbW9uaXRvciBwb3J0ICVpXG4iLCBtb25pdG9yX3BvcnQpOworCQlwcl9lcnIoInAxMDIyZHM6IHVuc3VwcG9ydGVkIG1vbml0b3IgcG9ydCAlaVxuIiwgcG9ydCk7CiAJfQogCiAJaW91bm1hcChwaXhpcyk7CkBAIC0yMTQsMjMgKzIyMCwxOCBAQAogfQogCiAvKioKLSAqIHAxMDIyZHNfc2hvd19tb25pdG9yX3BvcnQ6IHNob3cgdGhlIGN1cnJlbnQgbW9uaXRvcgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgbW9uaXRvciBpcwotICogc2V0IHRvIERWSSBvciBMVkRTLgorICogcDEwMjJkc192YWxpZF9tb25pdG9yX3BvcnQ6IHNldCB0aGUgbW9uaXRvciBwb3J0IGZvciBzeXNmcwogICovCi1zc2l6ZV90IHAxMDIyZHNfc2hvd19tb25pdG9yX3BvcnQoaW50IG1vbml0b3JfcG9ydCwgY2hhciAqYnVmKQorZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydAorcDEwMjJkc192YWxpZF9tb25pdG9yX3BvcnQoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0KQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjMCAtIERWSVxuJWMxIC0gU2luZ2xlIGxpbmsgTFZEU1xuIiwKLQkJbW9uaXRvcl9wb3J0ID09IDAgPyAnKicgOiAnICcsIG1vbml0b3JfcG9ydCA9PSAxID8gJyonIDogJyAnKTsKLX0KLQotLyoqCi0gKiBwMTAyMmRzX3NldF9zeXNmc19tb25pdG9yX3BvcnQ6IHNldCB0aGUgbW9uaXRvciBwb3J0IGZvciBzeXNmcwotICovCi1pbnQgcDEwMjJkc19zZXRfc3lzZnNfbW9uaXRvcl9wb3J0KGludCB2YWwpCi17Ci0JcmV0dXJuIHZhbCA8IDIgPyB2YWwgOiAwOworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgRlNMX0RJVV9QT1JUX0RWSToKKwljYXNlIEZTTF9ESVVfUE9SVF9MVkRTOgorCQlyZXR1cm4gcG9ydDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRlNMX0RJVV9QT1JUX0RWSTsgLyogRHVhbC1saW5rIExWRFMgaXMgbm90IHN1cHBvcnRlZCAqLworCX0KIH0KIAogI2VuZGlmCkBAIC0zMDUsOCArMzA2LDcgQEAKIAlkaXVfb3BzLnNldF9nYW1tYV90YWJsZQkJPSBwMTAyMmRzX3NldF9nYW1tYV90YWJsZTsKIAlkaXVfb3BzLnNldF9tb25pdG9yX3BvcnQJPSBwMTAyMmRzX3NldF9tb25pdG9yX3BvcnQ7CiAJZGl1X29wcy5zZXRfcGl4ZWxfY2xvY2sJCT0gcDEwMjJkc19zZXRfcGl4ZWxfY2xvY2s7Ci0JZGl1X29wcy5zaG93X21vbml0b3JfcG9ydAk9IHAxMDIyZHNfc2hvd19tb25pdG9yX3BvcnQ7Ci0JZGl1X29wcy5zZXRfc3lzZnNfbW9uaXRvcl9wb3J0CT0gcDEwMjJkc19zZXRfc3lzZnNfbW9uaXRvcl9wb3J0OworCWRpdV9vcHMudmFsaWRfbW9uaXRvcl9wb3J0CT0gcDEwMjJkc192YWxpZF9tb25pdG9yX3BvcnQ7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMjA0MF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMjA0MF9yZGIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiNTZhYy4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDIwNDBfcmRiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogUDIwNDAgUkRCIFNldHVwCi0gKgotICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGh5Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8bW0vbW11X2RlY2wuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS91ZGJnLmg+Ci0jaW5jbHVkZSA8YXNtL21waWMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0jaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KLSNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgotI2luY2x1ZGUgPGFzbS9laHZfcGljLmg+Ci0KLSNpbmNsdWRlICJjb3JlbmV0X2RzLmgiCi0KLS8qCi0gKiBDYWxsZWQgdmVyeSBlYXJseSwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKLSAqLwotc3RhdGljIGludCBfX2luaXQgcDIwNDBfcmRiX3Byb2JlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotI2lmZGVmIENPTkZJR19TTVAKLQlleHRlcm4gc3RydWN0IHNtcF9vcHNfdCBzbXBfODV4eF9vcHM7Ci0jZW5kaWYKLQotCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxQMjA0MFJEQiIpKQotCQlyZXR1cm4gMTsKLQotCS8qIENoZWNrIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgdGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yICovCi0JaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFAyMDQwUkRCLWh2IikpIHsKLQkJcHBjX21kLmluaXRfSVJRID0gZWh2X3BpY19pbml0OwotCQlwcGNfbWQuZ2V0X2lycSA9IGVodl9waWNfZ2V0X2lycTsKLQkJcHBjX21kLnJlc3RhcnQgPSBmc2xfaHZfcmVzdGFydDsKLQkJcHBjX21kLnBvd2VyX29mZiA9IGZzbF9odl9oYWx0OwotCQlwcGNfbWQuaGFsdCA9IGZzbF9odl9oYWx0OwotI2lmZGVmIENPTkZJR19TTVAKLQkJLyoKLQkJICogRGlzYWJsZSB0aGUgdGltZWJhc2Ugc3luYyBvcGVyYXRpb25zIGJlY2F1c2Ugd2UgY2FuJ3Qgd3JpdGUKLQkJICogdG8gdGhlIHRpbWViYXNlIHJlZ2lzdGVycyB1bmRlciB0aGUgaHlwZXJ2aXNvci4KLQkJICAqLwotCQlzbXBfODV4eF9vcHMuZ2l2ZV90aW1lYmFzZSA9IE5VTEw7Ci0JCXNtcF84NXh4X29wcy50YWtlX3RpbWViYXNlID0gTlVMTDsKLSNlbmRpZgotCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotZGVmaW5lX21hY2hpbmUocDIwNDBfcmRiKSB7Ci0JLm5hbWUJCQk9ICJQMjA0MCBSREIiLAotCS5wcm9iZQkJCT0gcDIwNDBfcmRiX3Byb2JlLAotCS5zZXR1cF9hcmNoCQk9IGNvcmVuZXRfZHNfc2V0dXBfYXJjaCwKLQkuaW5pdF9JUlEJCT0gY29yZW5ldF9kc19waWNfaW5pdCwKLSNpZmRlZiBDT05GSUdfUENJCi0JLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAotI2VuZGlmCi0JLmdldF9pcnEJCT0gbXBpY19nZXRfY29yZWludF9pcnEsCi0JLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCi0JLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCi0JLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCi0JLnBvd2VyX3NhdmUJCT0gZTUwMF9pZGxlLAotfTsKLQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwocDIwNDBfcmRiLCBjb3JlbmV0X2RzX3B1Ymxpc2hfZGV2aWNlcyk7Ci0KLSNpZmRlZiBDT05GSUdfU1dJT1RMQgotbWFjaGluZV9hcmNoX2luaXRjYWxsKHAyMDQwX3JkYiwgc3dpb3RsYl9zZXR1cF9idXNfbm90aWZpZXIpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDIwNDFfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDIwNDFfcmRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhNmVkNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMjA0MV9yZGIuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogUDIwNDEgUkRCIFNldHVwCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8bW0vbW11X2RlY2wuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL21waWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgorI2luY2x1ZGUgPGFzbS9laHZfcGljLmg+CisKKyNpbmNsdWRlICJjb3JlbmV0X2RzLmgiCisKKy8qCisgKiBDYWxsZWQgdmVyeSBlYXJseSwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKKyAqLworc3RhdGljIGludCBfX2luaXQgcDIwNDFfcmRiX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOworI2lmZGVmIENPTkZJR19TTVAKKwlleHRlcm4gc3RydWN0IHNtcF9vcHNfdCBzbXBfODV4eF9vcHM7CisjZW5kaWYKKworCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxQMjA0MVJEQiIpKQorCQlyZXR1cm4gMTsKKworCS8qIENoZWNrIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgdGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yICovCisJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFAyMDQxUkRCLWh2IikpIHsKKwkJcHBjX21kLmluaXRfSVJRID0gZWh2X3BpY19pbml0OworCQlwcGNfbWQuZ2V0X2lycSA9IGVodl9waWNfZ2V0X2lycTsKKwkJcHBjX21kLnJlc3RhcnQgPSBmc2xfaHZfcmVzdGFydDsKKwkJcHBjX21kLnBvd2VyX29mZiA9IGZzbF9odl9oYWx0OworCQlwcGNfbWQuaGFsdCA9IGZzbF9odl9oYWx0OworI2lmZGVmIENPTkZJR19TTVAKKwkJLyoKKwkJICogRGlzYWJsZSB0aGUgdGltZWJhc2Ugc3luYyBvcGVyYXRpb25zIGJlY2F1c2Ugd2UgY2FuJ3Qgd3JpdGUKKwkJICogdG8gdGhlIHRpbWViYXNlIHJlZ2lzdGVycyB1bmRlciB0aGUgaHlwZXJ2aXNvci4KKwkJICAqLworCQlzbXBfODV4eF9vcHMuZ2l2ZV90aW1lYmFzZSA9IE5VTEw7CisJCXNtcF84NXh4X29wcy50YWtlX3RpbWViYXNlID0gTlVMTDsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworZGVmaW5lX21hY2hpbmUocDIwNDFfcmRiKSB7CisJLm5hbWUJCQk9ICJQMjA0MSBSREIiLAorCS5wcm9iZQkJCT0gcDIwNDFfcmRiX3Byb2JlLAorCS5zZXR1cF9hcmNoCQk9IGNvcmVuZXRfZHNfc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEJCT0gY29yZW5ldF9kc19waWNfaW5pdCwKKyNpZmRlZiBDT05GSUdfUENJCisJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorI2VuZGlmCisJLmdldF9pcnEJCT0gbXBpY19nZXRfY29yZWludF9pcnEsCisJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCisJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCisJLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCisJLnBvd2VyX3NhdmUJCT0gZTUwMF9pZGxlLAorfTsKKworbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwocDIwNDFfcmRiLCBjb3JlbmV0X2RzX3B1Ymxpc2hfZGV2aWNlcyk7CisKKyNpZmRlZiBDT05GSUdfU1dJT1RMQgorbWFjaGluZV9hcmNoX2luaXRjYWxsKHAyMDQxX3JkYiwgc3dpb3RsYl9zZXR1cF9idXNfbm90aWZpZXIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDMwNjBfcWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDMwNjBfcWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkY2Y0NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMzA2MF9xZHMuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogUDMwNjAgUURTIFNldHVwCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vbXBpYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgorI2luY2x1ZGUgPGFzbS9laHZfcGljLmg+CisjaW5jbHVkZSAiY29yZW5ldF9kcy5oIgorCisvKgorICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHAzMDYwX3Fkc19wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKyNpZmRlZiBDT05GSUdfU01QCisJZXh0ZXJuIHN0cnVjdCBzbXBfb3BzX3Qgc21wXzg1eHhfb3BzOworI2VuZGlmCisKKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsUDMwNjBRRFMiKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvciAqLworCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxQMzA2MFFEUy1odiIpKSB7CisJCXBwY19tZC5pbml0X0lSUSA9IGVodl9waWNfaW5pdDsKKwkJcHBjX21kLmdldF9pcnEgPSBlaHZfcGljX2dldF9pcnE7CisJCXBwY19tZC5yZXN0YXJ0ID0gZnNsX2h2X3Jlc3RhcnQ7CisJCXBwY19tZC5wb3dlcl9vZmYgPSBmc2xfaHZfaGFsdDsKKwkJcHBjX21kLmhhbHQgPSBmc2xfaHZfaGFsdDsKKyNpZmRlZiBDT05GSUdfU01QCisJCS8qCisJCSAqIERpc2FibGUgdGhlIHRpbWViYXNlIHN5bmMgb3BlcmF0aW9ucyBiZWNhdXNlIHdlIGNhbid0IHdyaXRlCisJCSAqIHRvIHRoZSB0aW1lYmFzZSByZWdpc3RlcnMgdW5kZXIgdGhlIGh5cGVydmlzb3IuCisJCSAqLworCQlzbXBfODV4eF9vcHMuZ2l2ZV90aW1lYmFzZSA9IE5VTEw7CisJCXNtcF84NXh4X29wcy50YWtlX3RpbWViYXNlID0gTlVMTDsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworZGVmaW5lX21hY2hpbmUocDMwNjBfcWRzKSB7CisJLm5hbWUJCQk9ICJQMzA2MCBRRFMiLAorCS5wcm9iZQkJCT0gcDMwNjBfcWRzX3Byb2JlLAorCS5zZXR1cF9hcmNoCQk9IGNvcmVuZXRfZHNfc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEJCT0gY29yZW5ldF9kc19waWNfaW5pdCwKKyNpZmRlZiBDT05GSUdfUENJCisJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorI2VuZGlmCisJLmdldF9pcnEJCT0gbXBpY19nZXRfY29yZWludF9pcnEsCisJLnJlc3RhcnQJCT0gZnNsX3JzdGNyX3Jlc3RhcnQsCisJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCisJLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCisJLnBvd2VyX3NhdmUJCT0gZTUwMF9pZGxlLAorfTsKKworbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwocDMwNjBfcWRzLCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOworCisjaWZkZWYgQ09ORklHX1NXSU9UTEIKK21hY2hpbmVfYXJjaF9pbml0Y2FsbChwMzA2MF9xZHMsIHN3aW90bGJfc2V0dXBfYnVzX25vdGlmaWVyKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NDguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTQ4LmMKaW5kZXggZDA3ZGNiNy4uMTQ2MzJhOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NDguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU0OC5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCmluZGV4IDA5Y2VkNzIuLmNlYmQ3ODYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYwpAQCAtMjgzLDcgKzI4Myw3IEBACiAKIAlvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKIAotCXByaW50ayhLRVJOX0lORk8gInNiYzg1NjA6IEZvdW5kIEJSU1RDUiBhdCBpL28gMHgleFxuIiwgcmVzLnN0YXJ0KTsKKwlwcmludGsoS0VSTl9JTkZPICJzYmM4NTYwOiBGb3VuZCBCUlNUQ1IgYXQgJXBSXG4iLCAmcmVzKTsKIAogCWJyc3RjciA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKIAlpZighYnJzdGNyKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NtcC5jCmluZGV4IDViOWI5MDEuLjJkZjQ3ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMKQEAgLTQ4LDEwICs0OCwxMSBAQAogCWNvbnN0IHU2NCAqY3B1X3JlbF9hZGRyOwogCV9faW9tZW0gdTMyICpicHRyX3ZhZGRyOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JaW50IG4gPSAwOworCWludCBuID0gMCwgaHdfY3B1ID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChucik7CiAJaW50IGlvcmVtYXBwYWJsZTsKIAotCVdBUk5fT04gKG5yIDwgMCB8fCBuciA+PSBOUl9DUFVTKTsKKwlXQVJOX09OKG5yIDwgMCB8fCBuciA+PSBOUl9DUFVTKTsKKwlXQVJOX09OKGh3X2NwdSA8IDAgfHwgaHdfY3B1ID49IE5SX0NQVVMpOwogCiAJcHJfZGVidWcoInNtcF84NXh4X2tpY2tfY3B1OiBraWNrIENQVSAjJWRcbiIsIG5yKTsKIApAQCAtNzksNyArODAsNyBAQAogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0Jb3V0X2JlMzIoYnB0cl92YWRkciArIEJPT1RfRU5UUllfUElSLCBucik7CisJb3V0X2JlMzIoYnB0cl92YWRkciArIEJPT1RfRU5UUllfUElSLCBod19jcHUpOwogI2lmZGVmIENPTkZJR19QUEMzMgogCW91dF9iZTMyKGJwdHJfdmFkZHIgKyBCT09UX0VOVFJZX0FERFJfTE9XRVIsIF9fcGEoX19lYXJseV9zdGFydCkpOwogCkBAIC04OCw3ICs4OSw3IEBACiAJCQkJKHVsb25nKShicHRyX3ZhZGRyICsgU0laRV9CT09UX0VOVFJZKSk7CiAKIAkvKiBXYWl0IGEgYml0IGZvciB0aGUgQ1BVIHRvIGFjay4gKi8KLQl3aGlsZSAoKF9fc2Vjb25kYXJ5X2hvbGRfYWNrbm93bGVkZ2UgIT0gbnIpICYmICgrK24gPCAxMDAwKSkKKwl3aGlsZSAoKF9fc2Vjb25kYXJ5X2hvbGRfYWNrbm93bGVkZ2UgIT0gaHdfY3B1KSAmJiAoKytuIDwgMTAwMCkpCiAJCW1kZWxheSgxKTsKICNlbHNlCiAJc21wX2dlbmVyaWNfa2lja19jcHUobnIpOwpAQCAtMjA2LDcgKzIwNyw3IEBACiAJaWYgKCAhdGltZW91dCApCiAJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGJyaW5nIGRvd24gc2Vjb25kYXJ5IGNwdShzKSIpOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9jcHVzOyBpKyspCisJZm9yX2VhY2hfb25saW5lX2NwdShpKQogCXsKIAkJaWYgKCBpID09IHNtcF9wcm9jZXNzb3JfaWQoKSApIGNvbnRpbnVlOwogCQltcGljX3Jlc2V0X2NvcmUoaSk7CkBAIC0yNDMsNiArMjQ0LDcgQEAKIAkJICogSWYgbGVmdCBOVUxMLCAubWVzc2FnZV9wYXNzIGRlZmF1bHRzIHRvCiAJCSAqIHNtcF9tdXhlZF9pcGlfbWVzc2FnZV9wYXNzCiAJCSAqLworCQlzbXBfODV4eF9vcHMubWVzc2FnZV9wYXNzID0gTlVMTDsKIAkJc21wXzg1eHhfb3BzLmNhdXNlX2lwaSA9IGRvb3JiZWxsX2NhdXNlX2lwaTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKaW5kZXggYTBiNTYzOC4uOGQ2NTk5ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKQEAgLTQsNiArNCw3IEBACiAJZGVwZW5kcyBvbiA2eHgKIAlzZWxlY3QgRlNMX1NPQwogCXNlbGVjdCBBTFRJVkVDCisJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAJaGVscAogCSAgVGhlIEZyZWVzY2FsZSBFNjAwIFNvQ3MgaGF2ZSA3NHh4IGNvcmVzLgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfZ3Bpby5jCmluZGV4IDRmZjdiMWUuLjJhNzAzMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfZ3Bpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfZ3Bpby5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgR0VGX0dQSU9fRElSRUNUCQkweDAwCiAjZGVmaW5lIEdFRl9HUElPX0lOCQkweDA0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODYxMF9ocGNkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODYxMF9ocGNkLmMKaW5kZXggNzRlMDE4ZS4uMTNmYTlhNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2MTBfaHBjZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4NjEwX2hwY2QuYwpAQCAtMTUyLDEwICsxNTIsMTAgQEAKIAkoYzIgPDwgQURfQ09NUF8yX1NISUZUKSB8IChjMSA8PCBBRF9DT01QXzFfU0hJRlQpIHwgXAogCShjMCA8PCBBRF9DT01QXzBfU0hJRlQpIHwgKHNpemUgPDwgQURfUElYRUxfU19TSElGVCkpCiAKLXVuc2lnbmVkIGludCBtcGM4NjEwaHBjZF9nZXRfcGl4ZWxfZm9ybWF0KHVuc2lnbmVkIGludCBiaXRzX3Blcl9waXhlbCwKLQkJCQkJCWludCBtb25pdG9yX3BvcnQpCit1MzIgbXBjODYxMGhwY2RfZ2V0X3BpeGVsX2Zvcm1hdChlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQsCisJCQkJIHVuc2lnbmVkIGludCBiaXRzX3Blcl9waXhlbCkKIHsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBwaXhlbGZvcm1hdFtdWzNdID0geworCXN0YXRpYyBjb25zdCB1MzIgcGl4ZWxmb3JtYXRbXVszXSA9IHsKIAkJewogCQkJTUFLRV9BRCgzLCAwLCAyLCAxLCAzLCA4LCA4LCA4LCA4KSwKIAkJCU1BS0VfQUQoNCwgMiwgMCwgMSwgMiwgOCwgOCwgOCwgMCksCkBAIC0xNzAsNyArMTcwLDggQEAKIAl1bnNpZ25lZCBpbnQgYXJjaF9tb25pdG9yOwogCiAJLyogVGhlIERWSSBwb3J0IGlzIG1pcy13aXJlZCBvbiByZXZpc2lvbiAxIG9mIHRoaXMgYm9hcmQuICovCi0JYXJjaF9tb25pdG9yID0gKCgqcGl4aXNfYXJjaCA9PSAweDAxKSAmJiAobW9uaXRvcl9wb3J0ID09IDApKT8gMCA6IDE7CisJYXJjaF9tb25pdG9yID0KKwkJKCgqcGl4aXNfYXJjaCA9PSAweDAxKSAmJiAocG9ydCA9PSBGU0xfRElVX1BPUlRfRFZJKSkgPyAwIDogMTsKIAogCXN3aXRjaCAoYml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDMyOgpAQCAtMTg1LDEwICsxODYsMTEgQEAKIAl9CiB9CiAKLXZvaWQgbXBjODYxMGhwY2Rfc2V0X2dhbW1hX3RhYmxlKGludCBtb25pdG9yX3BvcnQsIGNoYXIgKmdhbW1hX3RhYmxlX2Jhc2UpCit2b2lkIG1wYzg2MTBocGNkX3NldF9nYW1tYV90YWJsZShlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQsCisJCQkJIGNoYXIgKmdhbW1hX3RhYmxlX2Jhc2UpCiB7CiAJaW50IGk7Ci0JaWYgKG1vbml0b3JfcG9ydCA9PSAyKSB7CQkvKiBkdWFsIGxpbmsgTFZEUyAqLworCWlmIChwb3J0ID09IEZTTF9ESVVfUE9SVF9ETFZEUykgewogCQlmb3IgKGkgPSAwOyBpIDwgMjU2KjM7IGkrKykKIAkJCWdhbW1hX3RhYmxlX2Jhc2VbaV0gPSAoZ2FtbWFfdGFibGVfYmFzZVtpXSA8PCAyKSB8CiAJCQkJCSAoKGdhbW1hX3RhYmxlX2Jhc2VbaV0gPj4gNikgJiAweDAzKTsKQEAgLTE5OSwxNyArMjAxLDIxIEBACiAjZGVmaW5lIFBYX0JSRENGRzBfRExJTksJKDEgPDwgNCkKICNkZWZpbmUgUFhfQlJEQ0ZHMF9ESVVfTUFTSwkoUFhfQlJEQ0ZHMF9EVklTRUwgfCBQWF9CUkRDRkcwX0RMSU5LKQogCi12b2lkIG1wYzg2MTBocGNkX3NldF9tb25pdG9yX3BvcnQoaW50IG1vbml0b3JfcG9ydCkKK3ZvaWQgbXBjODYxMGhwY2Rfc2V0X21vbml0b3JfcG9ydChlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQpCiB7Ci0Jc3RhdGljIGNvbnN0IHU4IGJkY2ZnW10gPSB7Ci0JCVBYX0JSRENGRzBfRFZJU0VMIHwgUFhfQlJEQ0ZHMF9ETElOSywKLQkJUFhfQlJEQ0ZHMF9ETElOSywKLQkJMCwKLQl9OwotCi0JaWYgKG1vbml0b3JfcG9ydCA8IDMpCisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSBGU0xfRElVX1BPUlRfRFZJOgogCQljbHJzZXRiaXRzXzgocGl4aXNfYmRjZmcwLCBQWF9CUkRDRkcwX0RJVV9NQVNLLAotCQkJICAgICBiZGNmZ1ttb25pdG9yX3BvcnRdKTsKKwkJCSAgICAgUFhfQlJEQ0ZHMF9EVklTRUwgfCBQWF9CUkRDRkcwX0RMSU5LKTsKKwkJYnJlYWs7CisJY2FzZSBGU0xfRElVX1BPUlRfTFZEUzoKKwkJY2xyc2V0Yml0c184KHBpeGlzX2JkY2ZnMCwgUFhfQlJEQ0ZHMF9ESVVfTUFTSywKKwkJCSAgICAgUFhfQlJEQ0ZHMF9ETElOSyk7CisJCWJyZWFrOworCWNhc2UgRlNMX0RJVV9QT1JUX0RMVkRTOgorCQljbHJiaXRzOChwaXhpc19iZGNmZzAsIFBYX0JSRENGRzBfRElVX01BU0spOworCQlicmVhazsKKwl9CiB9CiAKIC8qKgpAQCAtMjYyLDIwICsyNjgsMTAgQEAKIAlpb3VubWFwKGd1dHMpOwogfQogCi1zc2l6ZV90IG1wYzg2MTBocGNkX3Nob3dfbW9uaXRvcl9wb3J0KGludCBtb25pdG9yX3BvcnQsIGNoYXIgKmJ1ZikKK2VudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQKK21wYzg2MTBocGNkX3ZhbGlkX21vbml0b3JfcG9ydChlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQpCiB7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLAotCQkJIiVjMCAtIERWSVxuIgotCQkJIiVjMSAtIFNpbmdsZSBsaW5rIExWRFNcbiIKLQkJCSIlYzIgLSBEdWFsIGxpbmsgTFZEU1xuIiwKLQkJCW1vbml0b3JfcG9ydCA9PSAwID8gJyonIDogJyAnLAotCQkJbW9uaXRvcl9wb3J0ID09IDEgPyAnKicgOiAnICcsCi0JCQltb25pdG9yX3BvcnQgPT0gMiA/ICcqJyA6ICcgJyk7Ci19Ci0KLWludCBtcGM4NjEwaHBjZF9zZXRfc3lzZnNfbW9uaXRvcl9wb3J0KGludCB2YWwpCi17Ci0JcmV0dXJuIHZhbCA8IDMgPyB2YWwgOiAwOworCXJldHVybiBwb3J0OwogfQogCiAjZW5kaWYKQEAgLTMwNyw4ICszMDMsNyBAQAogCWRpdV9vcHMuc2V0X2dhbW1hX3RhYmxlCQk9IG1wYzg2MTBocGNkX3NldF9nYW1tYV90YWJsZTsKIAlkaXVfb3BzLnNldF9tb25pdG9yX3BvcnQJPSBtcGM4NjEwaHBjZF9zZXRfbW9uaXRvcl9wb3J0OwogCWRpdV9vcHMuc2V0X3BpeGVsX2Nsb2NrCQk9IG1wYzg2MTBocGNkX3NldF9waXhlbF9jbG9jazsKLQlkaXVfb3BzLnNob3dfbW9uaXRvcl9wb3J0CT0gbXBjODYxMGhwY2Rfc2hvd19tb25pdG9yX3BvcnQ7Ci0JZGl1X29wcy5zZXRfc3lzZnNfbW9uaXRvcl9wb3J0CT0gbXBjODYxMGhwY2Rfc2V0X3N5c2ZzX21vbml0b3JfcG9ydDsKKwlkaXVfb3BzLnZhbGlkX21vbml0b3JfcG9ydAk9IG1wYzg2MTBocGNkX3ZhbGlkX21vbml0b3JfcG9ydDsKICNlbmRpZgogCiAJcGl4aXNfbm9kZSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsZnBnYS1waXhpcyIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvdHFtOHh4X3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC90cW04eHhfc2V0dXAuYwppbmRleCBiNzFjNjUwLi41MjhlMDBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC90cW04eHhfc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC90cW04eHhfc2V0dXAuYwpAQCAtMTgsNyArMTgsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwppbmRleCBiOWJhODYxLi5lNDU4ODcyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogbWVudSAiUGxhdGZvcm0gc3VwcG9ydCIKIAorc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWciCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9LY29uZmlnIgogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZyIKQEAgLTMzMywxNiArMzM0LDYgQEAKIAogc291cmNlICJhcmNoL3Bvd2VycGMvc3lzZGV2L2Jlc3Rjb21tL0tjb25maWciCiAKLWNvbmZpZyBNUEM4eHh4X0dQSU8KLQlib29sICJNUEM1MTJ4L01QQzh4eHggR1BJTyBzdXBwb3J0IgotCWRlcGVuZHMgb24gUFBDX01QQzUxMnggfHwgUFBDX01QQzgzMXggfHwgUFBDX01QQzgzNHggfHwgUFBDX01QQzgzN3ggfHwgXAotCQkgICBGU0xfU09DX0JPT0tFIHx8IFBQQ184Nnh4Ci0Jc2VsZWN0IEdFTkVSSUNfR1BJTwotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91J3JlIGdvaW5nIHRvIHVzZSBoYXJkd2FyZSB0aGF0IGNvbm5lY3RzIHRvIHRoZQotCSAgTVBDNTEyeC84MzF4LzgzNHgvODM3eC84NTcyLzg2MTAgR1BJT3MuCi0KIGNvbmZpZyBTSU1QTEVfR1BJTwogCWJvb2wgIlN1cHBvcnQgZm9yIHNpbXBsZSwgbWVtb3J5LW1hcHBlZCBHUElPIGNvbnRyb2xsZXJzIgogCWRlcGVuZHMgb24gUFBDCkBAIC0zNTUsNyArMzQ2LDcgQEAKIAkgIG9uLWJvYXJkIHBlcmlwaGVyYWxzLgogCiBjb25maWcgTUNVX01QQzgzNDlFTUlUWAotCXRyaXN0YXRlICJNUEM4MzQ5RS1tSVRYIE1DVSBkcml2ZXIiCisJYm9vbCAiTVBDODM0OUUtbUlUWCBNQ1UgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDICYmIFBQQ184M3h4CiAJc2VsZWN0IEdFTkVSSUNfR1BJTwogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQppbmRleCBlMDZlMzk1Li5mYmVjYWUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpAQCAtNjksNiArNjksNyBAQAogCWJvb2wgIlNlcnZlciBwcm9jZXNzb3JzIgogCXNlbGVjdCBQUENfRlBVCiAJc2VsZWN0IFBQQ19IQVZFX1BNVV9TVVBQT1JUCisJc2VsZWN0IFNZU19TVVBQT1JUU19IVUdFVExCRlMKIAogY29uZmlnIFBQQ19CT09LM0VfNjQKIAlib29sICJFbWJlZGRlZCBwcm9jZXNzb3JzIgpAQCAtMTczLDYgKzE3NCw3IEBACiBjb25maWcgRlNMX0JPT0tFCiAJYm9vbAogCWRlcGVuZHMgb24gKEUyMDAgfHwgRTUwMCkgJiYgUFBDMzIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUyBpZiBQSFlTXzY0QklUCiAJZGVmYXVsdCB5CiAKICMgdGhpcyBpcyBmb3IgY29tbW9uIGNvZGUgYmV0d2VlbiBQUEMzMiAmIFBQQzY0IEZTTCBCT09LRQpAQCAtMjgyLDIxICsyODQsMTMgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiAhUFBDX1NURF9NTVUKIAotY29uZmlnIFBQQ19NTVVfTk9IQVNIXzMyCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gUFBDX01NVV9OT0hBU0ggJiYgUFBDMzIKLQotY29uZmlnIFBQQ19NTVVfTk9IQVNIXzY0Ci0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gUFBDX01NVV9OT0hBU0ggJiYgUFBDNjQKLQogY29uZmlnIFBQQ19CT09LM0VfTU1VCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gRlNMX0JPT0tFIHx8IFBQQ19CT09LM0UKIAogY29uZmlnIFBQQ19NTV9TTElDRVMKIAlib29sCi0JZGVmYXVsdCB5IGlmIEhVR0VUTEJfUEFHRSB8fCAoUFBDX1NURF9NTVVfNjQgJiYgUFBDXzY0S19QQUdFUykKKwlkZWZhdWx0IHkgaWYgKFBQQzY0ICYmIEhVR0VUTEJfUEFHRSkgfHwgKFBQQ19TVERfTU1VXzY0ICYmIFBQQ182NEtfUEFHRVMpCiAJZGVmYXVsdCBuCiAKIGNvbmZpZyBWSVJUX0NQVV9BQ0NPVU5USU5HCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZQppbmRleCA3M2UyMTE2Li4yNjM1YTIyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDcgQEAKIG9iai0kKENPTkZJR19QUENfODN4eCkJCSs9IDgzeHgvCiBvYmotJChDT05GSUdfRlNMX1NPQ19CT09LRSkJKz0gODV4eC8KIG9iai0kKENPTkZJR19QUENfODZ4eCkJCSs9IDg2eHgvCitvYmotJChDT05GSUdfUFBDX1BPV0VSTlYpCSs9IHBvd2VybnYvCiBvYmotJChDT05GSUdfUFBDX1BTRVJJRVMpCSs9IHBzZXJpZXMvCiBvYmotJChDT05GSUdfUFBDX0lTRVJJRVMpCSs9IGlzZXJpZXMvCiBvYmotJChDT05GSUdfUFBDX01BUExFKQkJKz0gbWFwbGUvCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYXhvbl9tc2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCmluZGV4IGFjMDY5MDMuLjQwYTZlMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0LmMKaW5kZXggNDhjNjkwZS4uODUyNTkyYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdC5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CkBAIC0yMzAsNyArMjMwLDcgQEAKIAkJfQogCQlldi0+dmlycSA9IHZpcnE7CiAKLQkJcmMgPSByZXF1ZXN0X2lycSh2aXJxLCBldi0+aGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwkJcmMgPSByZXF1ZXN0X2lycSh2aXJxLCBldi0+aGFuZGxlciwgMCwKIAkJCQkgICAgICBldi0+dHlwZWNvZGUsIE5VTEwpOwogCQlpZiAocmMgIT0gMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJCZWF0OiBmYWlsZWQgdG8gcmVxdWVzdCB2aXJ0dWFsIElSUSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3NwdV9wcml2MS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfc3B1X3ByaXYxLmMKaW5kZXggYmNjMTdmNy4uMTNmNTI1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfc3B1X3ByaXYxLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfc3B1X3ByaXYxLmMKQEAgLTE4LDggKzE4LDYgQEAKICAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3dyYXBwZXIuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3dyYXBwZXIuaAppbmRleCBiNDdkZmRhLi5jMTEwOTk2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF93cmFwcGVyLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfd3JhcHBlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogICovCiAjaWZuZGVmIEJFQVRfSENBTEwKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlICJiZWF0X3N5c2NhbGwuaCIKIAogLyogZGVmaW5lZCBpbiBodkNhbGwuUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXEuYwppbmRleCBiZmEyYzBjLi5kNGMzOWUzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXEuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXFfcG1pLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXFfcG1pLmMKaW5kZXggMzIzM2ZlOC4uNjBhMDdhNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxX3BtaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcV9wbWkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9wb3dlcmJ1dHRvbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9wb3dlcmJ1dHRvbi5jCmluZGV4IGY3NWE0ZGEuLjJiYjgwMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcG93ZXJidXR0b24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3Bvd2VyYnV0dG9uLmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vcG1pLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKaW5kZXggZjM5MTdlNy4uMTQyOGQ1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2NjX3BjaWV4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NjY19wY2lleC5jCmluZGV4IGFlNzkwYWMuLjE0YmUyYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2NjX3BjaWV4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NlbGxlYl9zY2NfcGNpZXguYwpAQCAtNTE0LDcgKzUxNCw3IEBACiAJdmlycSA9IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhvaXJxLmNvbnRyb2xsZXIsIG9pcnEuc3BlY2lmaWVyLAogCQkJCSAgICAgb2lycS5zaXplKTsKIAlpZiAocmVxdWVzdF9pcnEodmlycSwgcGNpZXhfaGFuZGxlX2ludGVybmFsX2lycSwKLQkJCUlSUUZfRElTQUJMRUQsICJwY2lleCIsICh2b2lkICopcGhiKSkgeworCQkJMCwgInBjaWV4IiwgKHZvaWQgKilwaGIpKSB7CiAJCXByX2VycigiUENJRVhDOkZhaWxlZCB0byByZXF1ZXN0IGlycVxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NlbGxlYl9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NlbGxlYl9zZXR1cC5jCmluZGV4IGQ1OGQ5YmEuLjFkNWE0ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NldHVwLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY3B1ZnJlcV9zcHVkZW1hbmQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jcHVmcmVxX3NwdWRlbWFuZC5jCmluZGV4IDdmOTIwOTYuLjIzYmM5ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jcHVmcmVxX3NwdWRlbWFuZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jcHVmcmVxX3NwdWRlbWFuZC5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCmluZGV4IDNlNGViYTYuLjk2YTQzM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCmluZGV4IDI2YTA2NzEuLjU5MmMzZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCkBAIC00MTIsOCArNDEyLDcgQEAKIAkJCUlJQ19JUlFfSU9FWF9BVEkgfCAoaW9tbXUtPm5pZCA8PCBJSUNfSVJRX05PREVfU0hJRlQpKTsKIAlCVUdfT04odmlycSA9PSBOT19JUlEpOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEodmlycSwgaW9jX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKLQkJCWlvbW11LT5uYW1lLCBpb21tdSk7CisJcmV0ID0gcmVxdWVzdF9pcnEodmlycSwgaW9jX2ludGVycnVwdCwgMCwgaW9tbXUtPm5hbWUsIGlvbW11KTsKIAlCVUdfT04ocmV0KTsKIAogCS8qIHNldCB0aGUgSU9DIHNlZ21lbnQgdGFibGUgb3JpZ2luIHJlZ2lzdGVyIChhbmQgdHVybiBvbiB0aGUgaW9tbXUpICovCkBAIC0xMTU5LDYgKzExNTgsMjYgQEAKIH0KIF9fc2V0dXAoImlvbW11X2ZpeGVkPSIsIHNldHVwX2lvbW11X2ZpeGVkKTsKIAorc3RhdGljIHU2NCBjZWxsX2RtYV9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRtYV9tYXBfb3BzICpkbWFfb3BzOworCisJaWYgKCFkZXYtPmRtYV9tYXNrKQorCQlyZXR1cm4gMDsKKworCWlmICghaW9tbXVfZml4ZWRfZGlzYWJsZWQgJiYKKwkJCWNlbGxfaW9tbXVfZ2V0X2ZpeGVkX2FkZHJlc3MoZGV2KSAhPSBPRl9CQURfQUREUikKKwkJcmV0dXJuIERNQV9CSVRfTUFTSyg2NCk7CisKKwlkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKwlpZiAoZG1hX29wcy0+Z2V0X3JlcXVpcmVkX21hc2spCisJCXJldHVybiBkbWFfb3BzLT5nZXRfcmVxdWlyZWRfbWFzayhkZXYpOworCisJV0FSTl9PTkNFKDEsICJubyBnZXRfcmVxdWlyZWRfbWFzayBpbiAlcCBvcHMiLCBkbWFfb3BzKTsKKworCXJldHVybiBETUFfQklUX01BU0soNjQpOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBjZWxsX2lvbW11X2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwpAQCAtMTE3NSw2ICsxMTk0LDcgQEAKIAogCS8qIFNldHVwIHZhcmlvdXMgcHBjX21kLiBjYWxsYmFja3MgKi8KIAlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBjZWxsX3BjaV9kbWFfZGV2X3NldHVwOworCXBwY19tZC5kbWFfZ2V0X3JlcXVpcmVkX21hc2sgPSBjZWxsX2RtYV9nZXRfcmVxdWlyZWRfbWFzazsKIAlwcGNfbWQudGNlX2J1aWxkID0gdGNlX2J1aWxkX2NlbGw7CiAJcHBjX21kLnRjZV9mcmVlID0gdGNlX2ZyZWVfY2VsbDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BtdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BtdS5jCmluZGV4IDY5ZWQwZDdmLi41OWMxYTE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcG11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BtdS5jCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CkBAIC0zOTEsNyArMzkyLDcgQEAKIAkJfQogCiAJCXJjID0gcmVxdWVzdF9pcnEoaXJxLCBjYmVfcG1faXJxLAotCQkJCSBJUlFGX0RJU0FCTEVELCAiY2JlLXBtdS0wIiwgTlVMTCk7CisJCQkJIDAsICJjYmUtcG11LTAiLCBOVUxMKTsKIAkJaWYgKHJjKSB7CiAJCQlwcmludGsoIkVSUk9SOiBSZXF1ZXN0IGZvciBpcnEgb24gbm9kZSAlZCBmYWlsZWRcbiIsCiAJCQkgICAgICAgbm9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcXBhY2Vfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9xcGFjZV9zZXR1cC5jCmluZGV4IDUxZTI5MDEuLjdmOWI2NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9xcGFjZV9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9xcGFjZV9zZXR1cC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCmluZGV4IGM3M2NmNGMuLjBmYzliNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc21wLmMKaW5kZXggZjJlMWRmZS4uZjVjNWM3NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zbXAuYwpAQCAtMTUsNyArMTUsNiBAQAogI3VuZGVmIERFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwppbmRleCAzNjc1ZGE3Li5lOTRkM2VjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwpAQCAtNDQyLDggKzQ0Miw3IEBACiAJCXNucHJpbnRmKHNwdS0+aXJxX2MwLCBzaXplb2YgKHNwdS0+aXJxX2MwKSwgInNwZSUwMmQuMCIsCiAJCQkgc3B1LT5udW1iZXIpOwogCQlyZXQgPSByZXF1ZXN0X2lycShzcHUtPmlycXNbMF0sIHNwdV9pcnFfY2xhc3NfMCwKLQkJCQkgIElSUUZfRElTQUJMRUQsCi0JCQkJICBzcHUtPmlycV9jMCwgc3B1KTsKKwkJCQkgIDAsIHNwdS0+aXJxX2MwLCBzcHUpOwogCQlpZiAocmV0KQogCQkJZ290byBiYWlsMDsKIAl9CkBAIC00NTEsOCArNDUwLDcgQEAKIAkJc25wcmludGYoc3B1LT5pcnFfYzEsIHNpemVvZiAoc3B1LT5pcnFfYzEpLCAic3BlJTAyZC4xIiwKIAkJCSBzcHUtPm51bWJlcik7CiAJCXJldCA9IHJlcXVlc3RfaXJxKHNwdS0+aXJxc1sxXSwgc3B1X2lycV9jbGFzc18xLAotCQkJCSAgSVJRRl9ESVNBQkxFRCwKLQkJCQkgIHNwdS0+aXJxX2MxLCBzcHUpOworCQkJCSAgMCwgc3B1LT5pcnFfYzEsIHNwdSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGJhaWwxOwogCX0KQEAgLTQ2MCw4ICs0NTgsNyBAQAogCQlzbnByaW50ZihzcHUtPmlycV9jMiwgc2l6ZW9mIChzcHUtPmlycV9jMiksICJzcGUlMDJkLjIiLAogCQkJIHNwdS0+bnVtYmVyKTsKIAkJcmV0ID0gcmVxdWVzdF9pcnEoc3B1LT5pcnFzWzJdLCBzcHVfaXJxX2NsYXNzXzIsCi0JCQkJICBJUlFGX0RJU0FCTEVELAotCQkJCSAgc3B1LT5pcnFfYzIsIHNwdSk7CisJCQkJICAwLCBzcHUtPmlycV9jMiwgc3B1KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gYmFpbDI7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jYWxsYmFja3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfY2FsbGJhY2tzLmMKaW5kZXggZmVjMTQ5NS4uNzVkNjEzMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jYWxsYmFja3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2NhbGxiYWNrcy5jCkBAIC01LDcgKzUsNyBAQAogI3VuZGVmIERFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAKICNpbmNsdWRlIDxhc20vc3B1Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2ZhdWx0LmMKaW5kZXggZDA2YmE4Ny4uNjQxZTcyNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9mYXVsdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfZmF1bHQuYwpAQCAtMjIsNyArMjIsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYwppbmRleCA0ZTVjOTE0Li4yYmI2OTc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbm90aWZ5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X25vdGlmeS5jCmluZGV4IDM0ZDE1NjkuLmFmZGY4NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbm90aWZ5LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9ub3RpZnkuYwpAQCAtMjEsNyArMjEsOCBAQAogCiAjdW5kZWYgREVCVUcKIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgInNwdWZzL3NwdWZzLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9wcml2MV9tbWlvLmMKaW5kZXggMTIxYWVjMy4uNjZkMzM3MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9wcml2MV9tbWlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9wcml2MV9tbWlvLmMKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKaW5kZXggNjRlYjE1Yi4uNmU4YTllZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKQEAgLTIxLDcgKzIxLDYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYwppbmRleCBiZjRkNDFkLi45YzY3OTBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKQEAgLTIyLDkgKzIyLDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vc3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KICNpbmNsdWRlICJzcHVmcy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvcmVkdW1wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29yZWR1bXAuYwppbmRleCA2Y2YzZWM2Li4wM2M1ZmNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29yZWR1bXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29yZWR1bXAuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwppbmRleCBhNGRkM2FlLi44Y2I2MjYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwpAQCAtMjEsNyArMjEsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwppbmRleCBmYjU5YzQ2Li4wY2ZlY2U0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jCmluZGV4IDY0Zjg1NDAuLjg2NTVjNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMKQEAgLTE4LDcgKzE4LDYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jCmluZGV4IDMyY2I0ZTYuLjk2NWQzODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jCkBAIC0yMiw3ICsyMiw2IEBACiAKICN1bmRlZiBERUJVRwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCmluZGV4IDNkZjlhMzYuLmRkZTM1NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKQEAgLTMyLDcgKzMyLDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N5c2NhbGxzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3lzY2FsbHMuYwppbmRleCA2MDllMDE2Li43MWE1YjUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3lzY2FsbHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3lzY2FsbHMuYwpAQCAtMSw2ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCmluZGV4IDUyNGQ5NzEuLjVhOGY1MGE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCkBAIC04NywxMCArODcsNiBAQAogY29uZmlnIE1QQzEwWF9PUEVOUElDCiAJYm9vbAogCi1jb25maWcgTVBDMTBYX1NUT1JFX0dBVEhFUklORwotCWJvb2wgIkVuYWJsZSBNUEMxMHggc3RvcmUgZ2F0aGVyaW5nIgotCWRlcGVuZHMgb24gTVBDMTBYX0JSSURHRQotCiBjb25maWcgR0FNRUNVQkVfQ09NTU9OCiAJYm9vbAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKaW5kZXggNDg3YmRhMC4uMmU5YmNmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKaW5kZXggMWNiOTA3Yy4uZjhmMzNlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odmxwY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHZscGNvbmZpZy5jCmluZGV4IGYwNDc1ZjAuLmY2MmEwYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odmxwY29uZmlnLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2h2bHBjb25maWcuYwpAQCAtMTYsNyArMTYsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2h2X2xwX2NvbmZpZy5oPgogI2luY2x1ZGUgIml0X2xwX25hY2EuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwppbmRleCBkOGI3NjMzLi4yZjNkOTExIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMva3N5bXMuYwppbmRleCAyNDMwODQ4Li45OTdlMjM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMva3N5bXMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMva3N5bXMuYwpAQCAtNiw3ICs2LDcgQEAKICAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KICNpbmNsdWRlIDxhc20vaXNlcmllcy9odl9jYWxsX3NjLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBhcmRhdGEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9scGFyZGF0YS5jCmluZGV4IDk4YmQyZDMuLjAwZTBlYzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9scGFyZGF0YS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9scGFyZGF0YS5jCkBAIC04LDcgKzgsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9scGV2ZW50cy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwZXZlbnRzLmMKaW5kZXggYjBmOGE4NS4uMjAyZTIyNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwZXZlbnRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwZXZlbnRzLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BhY2EuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKaW5kZXggNjJkYWJlMy4uMjU0YzFmYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKaW5kZXggYWIzOTYyYi4uYzc1NDEyOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKaW5kZXggYzI1YTA4MS4uZWEwYWNiZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zbXAuYwppbmRleCA4YmRhOWJlLi43ZTJhNTUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NtcC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjdW5kZWYgREVCVUcKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvLmMKaW5kZXggYjZkYjdjZS4uMDRiZTYyZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW8uYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3Zpby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW9wYXRoLmMKaW5kZXggMjM3NjA2OS4uNDBkYWQwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvcGF0aC5jCkBAIC0yNyw3ICsyNyw3IEBACiAgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICoKICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCmluZGV4IDViMzM4OGIuLjRjMzcyMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2NwdWZyZXEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2NwdWZyZXEuYwppbmRleCBjMTY1MzdiLi45NWQwMDE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvY3B1ZnJlcS5jCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2RtYV9saWIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2RtYV9saWIuYwppbmRleCA3NTYxMjNiLi5mM2RlZmQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9kbWFfbGliLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZG1hX2xpYi5jCkBAIC0xOSwxMCArMTksMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSA8YXNtL3Bhc2VtaV9kbWEuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKaW5kZXggN2M4NThlNi4uNmYzNTU4MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2JhY2tsaWdodC5jCmluZGV4IGMyZjNlODYuLmEwMDA5NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9iYWNrbGlnaHQuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2JhY2tsaWdodC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jCmluZGV4IGRmNDIzOTkuLjYzZDgyYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvYWRiLmg+CiAjaW5jbHVkZSA8bGludXgvcG11Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCmluZGV4IGU5YzhhNjAuLjk5NmM1ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9hZGIuaD4KICNpbmNsdWRlIDxsaW51eC9wbXUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9udnJhbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9udnJhbS5jCmluZGV4IDY5NTQ0M2IuLjU0ZDIyNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbnZyYW0uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL252cmFtLmMKQEAgLTgsNyArOCw3IEBACiAgKgogICogIFRvZG86IC0gYWRkIHN1cHBvcnQgZm9yIHRoZSBPRiBwZXJzaXN0ZW50IHByb3BlcnRpZXMKICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKaW5kZXggNzY2N2RiNC4uOTAxYmZiZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9hZGIuaD4KICNpbmNsdWRlIDxsaW51eC9wbXUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMjczLDcgKzI3Miw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGdhdHdpY2tfY2FzY2FkZV9hY3Rpb24gPSB7CiAJLmhhbmRsZXIJPSBnYXR3aWNrX2FjdGlvbiwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCwKIAkubmFtZQkJPSAiY2FzY2FkZSIsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKaW5kZXggYTAyOGYwOC4uOTY1ODBiMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCmluZGV4IDlhNTIxZGMuLjliNmE4MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAKIAlpZiAocHN1cmdlX3NlY29uZGFyeV92aXJxKQogCQlyYyA9IHJlcXVlc3RfaXJxKHBzdXJnZV9zZWNvbmRhcnlfdmlycSwgcHN1cmdlX2lwaV9pbnRyLAotCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1BFUkNQVSwgIklQSSIsIE5VTEwpOworCQkJSVJRRl9QRVJDUFUsICJJUEkiLCBOVUxMKTsKIAogCWlmIChyYykKIAkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0dXAgc2Vjb25kYXJ5IGNwdSBJUElcbiIpOwpAQCAtNDA4LDcgKzQwOCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHBzdXJnZV9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPSBwc3VyZ2VfaXBpX2ludHIsCi0JLmZsYWdzID0gSVJRRl9ESVNBQkxFRHxJUlFGX1BFUkNQVSwKKwkuZmxhZ3MgPSBJUlFGX1BFUkNQVSwKIAkubmFtZSA9ICJwcmltYXJ5IElQSSIsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZmVhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvS2NvbmZpZwpAQCAtMCwwICsxLDE2IEBACitjb25maWcgUFBDX1BPV0VSTlYKKwlkZXBlbmRzIG9uIFBQQzY0ICYmIFBQQ19CT09LM1MKKwlib29sICJJQk0gUG93ZXJOViAoTm9uLVZpcnR1YWxpemVkKSBwbGF0Zm9ybSBzdXBwb3J0IgorCXNlbGVjdCBQUENfTkFUSVZFCisJc2VsZWN0IFBQQ19YSUNTCisJc2VsZWN0IFBQQ19JQ1BfTkFUSVZFCisJc2VsZWN0IFBQQ19QN19OQVAKKwlzZWxlY3QgUFBDX1BDSV9DSE9JQ0UgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKworY29uZmlnIFBQQ19QT1dFUk5WX1JUQVMKKwlkZXBlbmRzIG9uIFBQQ19QT1dFUk5WCisJYm9vbCAiU3VwcG9ydCBmb3IgUlRBUyBiYXNlZCBQb3dlck5WIHBsYXRmb3JtcyBzdWNoIGFzIEJNTCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUFBDX0lDU19SVEFTCisJc2VsZWN0IFBQQ19SVEFTCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4NTMwMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai15CQkJKz0gc2V0dXAubyBvcGFsLXRha2VvdmVyLm8gb3BhbC13cmFwcGVycy5vIG9wYWwubworb2JqLXkJCQkrPSBvcGFsLXJ0Yy5vIG9wYWwtbnZyYW0ubworCitvYmotJChDT05GSUdfU01QKQkrPSBzbXAubworb2JqLSQoQ09ORklHX1BDSSkJKz0gcGNpLm8gcGNpLXA1aW9jMi5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1udnJhbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtbnZyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjgzZTFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtbnZyYW0uYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogUG93ZXJOViBudnJhbSBjb2RlLgorICoKKyAqIENvcHlyaWdodCAyMDExIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisKKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnZyYW1fc2l6ZTsKKworc3RhdGljIHNzaXplX3Qgb3BhbF9udnJhbV9zaXplKHZvaWQpCit7CisJcmV0dXJuIG52cmFtX3NpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9wYWxfbnZyYW1fcmVhZChjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICppbmRleCkKK3sKKwlzNjQgcmM7CisJaW50IG9mZjsKKworCWlmICgqaW5kZXggPj0gbnZyYW1fc2l6ZSkKKwkJcmV0dXJuIDA7CisJb2ZmID0gKmluZGV4OworCWlmICgob2ZmICsgY291bnQpID4gbnZyYW1fc2l6ZSkKKwkJY291bnQgPSBudnJhbV9zaXplIC0gb2ZmOworCXJjID0gb3BhbF9yZWFkX252cmFtKF9fcGEoYnVmKSwgY291bnQsIG9mZik7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKKwkJcmV0dXJuIC1FSU87CisJKmluZGV4ICs9IGNvdW50OworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgb3BhbF9udnJhbV93cml0ZShjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICppbmRleCkKK3sKKwlzNjQgcmMgPSBPUEFMX0JVU1k7CisJaW50IG9mZjsKKworCWlmICgqaW5kZXggPj0gbnZyYW1fc2l6ZSkKKwkJcmV0dXJuIDA7CisJb2ZmID0gKmluZGV4OworCWlmICgob2ZmICsgY291bnQpID4gbnZyYW1fc2l6ZSkKKwkJY291bnQgPSBudnJhbV9zaXplIC0gb2ZmOworCisJd2hpbGUgKHJjID09IE9QQUxfQlVTWSB8fCByYyA9PSBPUEFMX0JVU1lfRVZFTlQpIHsKKwkJcmMgPSBvcGFsX3dyaXRlX252cmFtKF9fcGEoYnVmKSwgY291bnQsIG9mZik7CisJCWlmIChyYyA9PSBPUEFMX0JVU1lfRVZFTlQpCisJCQlvcGFsX3BvbGxfZXZlbnRzKE5VTEwpOworCX0KKwkqaW5kZXggKz0gY291bnQ7CisJcmV0dXJuIGNvdW50OworfQorCit2b2lkIF9faW5pdCBvcGFsX252cmFtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWNvbnN0IHUzMiAqbmJ5dGVzX3A7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJpYm0sb3BhbC1udnJhbSIpOworCWlmIChucCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwluYnl0ZXNfcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIiNieXRlcyIsIE5VTEwpOworCWlmICghbmJ5dGVzX3ApIHsKKwkJb2Zfbm9kZV9wdXQobnApOworCQlyZXR1cm47CisJfQorCW52cmFtX3NpemUgPSAqbmJ5dGVzX3A7CisKKwlwcmludGsoS0VSTl9JTkZPICJPUEFMIG52cmFtIHNldHVwLCAldSBieXRlc1xuIiwgbnZyYW1fc2l6ZSk7CisJb2Zfbm9kZV9wdXQobnApOworCisJcHBjX21kLm52cmFtX3JlYWQgPSBvcGFsX252cmFtX3JlYWQ7CisJcHBjX21kLm52cmFtX3dyaXRlID0gb3BhbF9udnJhbV93cml0ZTsKKwlwcGNfbWQubnZyYW1fc2l6ZSA9IG9wYWxfbnZyYW1fc2l6ZTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtcnRjLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1ydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE3NjQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtcnRjLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIFBvd2VyTlYgUmVhbCBUaW1lIENsb2NrLgorICoKKyAqIENvcHlyaWdodCAyMDExIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorCitzdGF0aWMgdm9pZCBvcGFsX3RvX3RtKHUzMiB5X21fZCwgdTY0IGhfbV9zX21zLCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXRtLT50bV95ZWFyCT0gKChiY2QyYmluKHlfbV9kID4+IDI0KSAqIDEwMCkgKworCQkJICAgYmNkMmJpbigoeV9tX2QgPj4gMTYpICYgMHhmZikpIC0gMTkwMDsKKwl0bS0+dG1fbW9uCT0gYmNkMmJpbigoeV9tX2QgPj4gOCkgJiAweGZmKSAtIDE7CisJdG0tPnRtX21kYXkJPSBiY2QyYmluKHlfbV9kICYgMHhmZik7CisJdG0tPnRtX2hvdXIJPSBiY2QyYmluKChoX21fc19tcyA+PiA1NikgJiAweGZmKTsKKwl0bS0+dG1fbWluCT0gYmNkMmJpbigoaF9tX3NfbXMgPj4gNDgpICYgMHhmZik7CisJdG0tPnRtX3NlYwk9IGJjZDJiaW4oKGhfbV9zX21zID4+IDQwKSAmIDB4ZmYpOworCisgICAgICAgIEdyZWdvcmlhbkRheSh0bSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgX19pbml0IG9wYWxfZ2V0X2Jvb3RfdGltZSh2b2lkKQoreworCXN0cnVjdCBydGNfdGltZSB0bTsKKwl1MzIgeV9tX2Q7CisJdTY0IGhfbV9zX21zOworCWxvbmcgcmMgPSBPUEFMX0JVU1k7CisKKwl3aGlsZSAocmMgPT0gT1BBTF9CVVNZIHx8IHJjID09IE9QQUxfQlVTWV9FVkVOVCkgeworCQlyYyA9IG9wYWxfcnRjX3JlYWQoJnlfbV9kLCAmaF9tX3NfbXMpOworCQlpZiAocmMgPT0gT1BBTF9CVVNZX0VWRU5UKQorCQkJb3BhbF9wb2xsX2V2ZW50cyhOVUxMKTsKKwkJZWxzZQorCQkJbWRlbGF5KDEwKTsKKwl9CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKKwkJcmV0dXJuIDA7CisJb3BhbF90b190bSh5X21fZCwgaF9tX3NfbXMsICZ0bSk7CisJcmV0dXJuIG1rdGltZSh0bS50bV95ZWFyICsgMTkwMCwgdG0udG1fbW9uICsgMSwgdG0udG1fbWRheSwKKwkJICAgICAgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworfQorCit2b2lkIG9wYWxfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJbG9uZyByYyA9IE9QQUxfQlVTWTsKKwl1MzIgeV9tX2Q7CisJdTY0IGhfbV9zX21zOworCisJd2hpbGUgKHJjID09IE9QQUxfQlVTWSB8fCByYyA9PSBPUEFMX0JVU1lfRVZFTlQpIHsKKwkJcmMgPSBvcGFsX3J0Y19yZWFkKCZ5X21fZCwgJmhfbV9zX21zKTsKKwkJaWYgKHJjID09IE9QQUxfQlVTWV9FVkVOVCkKKwkJCW9wYWxfcG9sbF9ldmVudHMoTlVMTCk7CisJCWVsc2UKKwkJCW1kZWxheSgxMCk7CisJfQorCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpCisJCXJldHVybjsKKwlvcGFsX3RvX3RtKHlfbV9kLCBoX21fc19tcywgdG0pOworfQorCitpbnQgb3BhbF9zZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlsb25nIHJjID0gT1BBTF9CVVNZOworCXUzMiB5X21fZCA9IDA7CisJdTY0IGhfbV9zX21zID0gMDsKKworCXlfbV9kIHw9ICgodTMyKWJpbjJiY2QoKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDApKSA8PCAyNDsKKwl5X21fZCB8PSAoKHUzMiliaW4yYmNkKCh0bS0+dG1feWVhciArIDE5MDApICUgMTAwKSkgPDwgMTY7CisJeV9tX2QgfD0gKCh1MzIpYmluMmJjZCgodG0tPnRtX21vbiArIDEpKSkgPDwgODsKKwl5X21fZCB8PSAoKHUzMiliaW4yYmNkKHRtLT50bV9tZGF5KSk7CisKKwloX21fc19tcyB8PSAoKHU2NCliaW4yYmNkKHRtLT50bV9ob3VyKSkgPDwgNTY7CisJaF9tX3NfbXMgfD0gKCh1NjQpYmluMmJjZCh0bS0+dG1fbWluKSkgPDwgNDg7CisJaF9tX3NfbXMgfD0gKCh1NjQpYmluMmJjZCh0bS0+dG1fc2VjKSkgPDwgNDA7CisKKwl3aGlsZSAocmMgPT0gT1BBTF9CVVNZIHx8IHJjID09IE9QQUxfQlVTWV9FVkVOVCkgeworCQlyYyA9IG9wYWxfcnRjX3dyaXRlKHlfbV9kLCBoX21fc19tcyk7CisJCWlmIChyYyA9PSBPUEFMX0JVU1lfRVZFTlQpCisJCQlvcGFsX3BvbGxfZXZlbnRzKE5VTEwpOworCQllbHNlCisJCQltZGVsYXkoMTApOworCX0KKwlyZXR1cm4gcmMgPT0gT1BBTF9TVUNDRVNTID8gMCA6IC1FSU87Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC10YWtlb3Zlci5TIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtdGFrZW92ZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2I0OGIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtdGFrZW92ZXIuUwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIFBvd2VyTlYgT1BBTCB0YWtlb3ZlciBhc3NlbWJseSBjb2RlLCBmb3IgdXNlIGJ5IHByb21faW5pdC5jCisgKgorICogQ29weXJpZ2h0IDIwMTEgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKyNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKworI2RlZmluZSBTVEtfUEFSQU0oaSkJKDQ4ICsgKChpKS0zKSo4KQorCisjZGVmaW5lIEhfSEFMX1RBS0VPVkVSCQkJMHg1MTI0CisjZGVmaW5lIEhfSEFMX1RBS0VPVkVSX1FVRVJZX01BR0lDCS0xCisKKwkudGV4dAorX0dMT0JBTChvcGFsX3F1ZXJ5X3Rha2VvdmVyKQorCW1mY3IJcjAKKwlzdHcJcjAsOChyMSkKKwlzdGQJcjMsU1RLX1BBUkFNKHIzKShyMSkKKwlzdGQJcjQsU1RLX1BBUkFNKHI0KShyMSkKKwlsaQlyMyxIX0hBTF9UQUtFT1ZFUgorCWxpCXI0LEhfSEFMX1RBS0VPVkVSX1FVRVJZX01BR0lDCisJSFZTQworCWxkCXIxMCxTVEtfUEFSQU0ocjMpKHIxKQorCXN0ZAlyNCwwKHIxMCkKKwlsZAlyMTAsU1RLX1BBUkFNKHI0KShyMSkKKwlzdGQJcjUsMChyMTApCisJbHd6CXIwLDgocjEpCisJbXRjcmYJMHhmZixyMAorCWJscgorCitfR0xPQkFMKG9wYWxfZG9fdGFrZW92ZXIpCisJbWZjcglyMAorCXN0dwlyMCw4KHIxKQorCW1mbHIJcjAKKwlzdGQJcjAsMTYocjEpCisJYmwJX19vcGFsX2RvX3Rha2VvdmVyCisJbGQJcjAsMTYocjEpCisJbXRscglyMAorCWx3eglyMCw4KHIxKQorCW10Y3JmCTB4ZmYscjAKKwlibHIKKworX19vcGFsX2RvX3Rha2VvdmVyOgorCWxkCXI0LDAocjMpCisJbGQJcjUsMHg4KHIzKQorCWxkCXI2LDB4MTAocjMpCisJbGQJcjcsMHgxOChyMykKKwlsZAlyOCwweDIwKHIzKQorCWxkCXI5LDB4MjgocjMpCisJbGQJcjEwLDB4MzAocjMpCisJbGQJcjExLDB4MzgocjMpCisJbGkJcjMsSF9IQUxfVEFLRU9WRVIKKwlIVlNDCisJYmxyCisKKwkuZ2xvYmwgb3BhbF9zZWNvbmRhcnlfZW50cnkKK29wYWxfc2Vjb25kYXJ5X2VudHJ5OgorCW1yCXIzMSxyMworCW1mbXNyCXIxMQorCWxpCXIxMiwoTVNSX1NGIHwgTVNSX0lTRilAaGlnaGVzdAorCXNsZGkJcjEyLHIxMiw0OAorCW9yCXIxMSxyMTEscjEyCisJbXRtc3JkCXIxMQorCWlzeW5jCisJbWZzcHIJcjQsU1BSTl9QSVIKKwlzdGQJcjQsMChyMykKKzE6CUhNVF9MT1cKKwlsZAlyNCw4KHIzKQorCWNtcGxpCWNyMCxyNCwwCisJYmVxCTFiCisJSE1UX01FRElVTQorMToJYWRkaQlyMyxyMzEsMTYKKwlibAlfX29wYWxfZG9fdGFrZW92ZXIKKwliCTFiCisKK19HTE9CQUwob3BhbF9lbnRlcl9ydGFzKQorCW1mbHIJcjAKKwlzdGQJcjAsMTYocjEpCisgICAgICAgIHN0ZHUJcjEsLVBST01fRlJBTUVfU0laRShyMSkJLyogU2F2ZSBTUCBhbmQgY3JlYXRlIHN0YWNrIHNwYWNlICovCisKKwkvKiBCZWNhdXNlIFBST00gaXMgcnVubmluZyBpbiAzMmIgbW9kZSwgaXQgY2xvYmJlcnMgdGhlIGhpZ2ggb3JkZXIgaGFsZgorCSAqIG9mIGFsbCByZWdpc3RlcnMgdGhhdCBpdCBzYXZlcy4gIFdlIHRoZXJlZm9yZSBzYXZlIHRob3NlIHJlZ2lzdGVycworCSAqIFBST00gbWlnaHQgdG91Y2ggdG8gdGhlIHN0YWNrLiAgKHIwLCByMy1yMTMgYXJlIGNhbGxlciBzYXZlZCkKKwkqLworCVNBVkVfR1BSKDIsIHIxKQorCVNBVkVfR1BSKDEzLCByMSkKKwlTQVZFXzhHUFJTKDE0LCByMSkKKwlTQVZFXzEwR1BSUygyMiwgcjEpCisJbWZjcglyMTAKKwltZm1zcglyMTEKKwlzdGQJcjEwLF9DQ1IocjEpCisJc3RkCXIxMSxfTVNSKHIxKQorCisJLyogR2V0IHRoZSBQUk9NIGVudHJ5cG9pbnQgKi8KKwltdGxyCXI1CisKKwkvKiBTd2l0Y2ggTVNSIHRvIDMyIGJpdHMgbW9kZQorCSAqLworICAgICAgICBsaSAgICAgIHIxMiwxCisgICAgICAgIHJsZGljciAgcjEyLHIxMixNU1JfU0ZfTEcsKDYzLU1TUl9TRl9MRykKKyAgICAgICAgYW5kYyAgICByMTEscjExLHIxMgorICAgICAgICBsaSAgICAgIHIxMiwxCisgICAgICAgIHJsZGljciAgcjEyLHIxMixNU1JfSVNGX0xHLCg2My1NU1JfSVNGX0xHKQorICAgICAgICBhbmRjICAgIHIxMSxyMTEscjEyCisgICAgICAgIG10bXNyZCAgcjExCisgICAgICAgIGlzeW5jCisKKwkvKiBFbnRlciBSVEFTIGhlcmUuLi4gKi8KKwlibHJsCisKKwkvKiBKdXN0IG1ha2Ugc3VyZSB0aGF0IHIxIHRvcCAzMiBiaXRzIGRpZG4ndCBnZXQKKwkgKiBjb3JydXB0IGJ5IE9GCisJICovCisJcmxkaWNsCXIxLHIxLDAsMzIKKworCS8qIFJlc3RvcmUgdGhlIE1TUiAoYmFjayB0byA2NCBiaXRzKSAqLworCWxkCXIwLF9NU1IocjEpCisJTVRNU1JEKHIwKQorICAgICAgICBpc3luYworCisJLyogUmVzdG9yZSBvdGhlciByZWdpc3RlcnMgKi8KKwlSRVNUX0dQUigyLCByMSkKKwlSRVNUX0dQUigxMywgcjEpCisJUkVTVF84R1BSUygxNCwgcjEpCisJUkVTVF8xMEdQUlMoMjIsIHIxKQorCWxkCXI0LF9DQ1IocjEpCisJbXRjcglyNAorCisgICAgICAgIGFkZGkJcjEscjEsUFJPTV9GUkFNRV9TSVpFCisJbGQJcjAsMTYocjEpCisJbXRsciAgICByMAorCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzZjQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBQb3dlck5WIE9QQUwgQVBJIHdyYXBwZXJzCisgKgorICogQ29weXJpZ2h0IDIwMTEgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKyNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKworLyogVE9ETzoKKyAqCisgKiAtIFRyYWNlIGlycXMgaW4vb2ZmIChuZWVkcyBzYXZpbmcvcmVzdG9yaW5nIGFsbCBhcmdzLCBhcmdoLi4uKQorICogLSBHZXQgcjExIGZlZWQgdXAgYnkgRGF2ZSBzbyBJIGNhbiBoYXZlIGJldHRlciByZWdpc3RlciB1c2FnZQorICovCisjZGVmaW5lIE9QQUxfQ0FMTChuYW1lLCB0b2tlbikJCVwKKyBfR0xPQkFMKG5hbWUpOwkJCQlcCisJbWZscglyMDsJCQlcCisJbWZjcglyMTI7CQkJXAorCXN0ZAlyMCwxNihyMSk7CQlcCisJc3RkCXIxMiw4KHIxKTsJCVwKKwlzdGQJcjEsUEFDQVIxKHIxMyk7CQlcCisJbGkJcjAsMDsJCQlcCisJbWZtc3IJcjEyOwkJCVwKKwlvcmkJcjAscjAsTVNSX0VFOwkJXAorCXN0ZAlyMTIsUEFDQVNBVkVETVNSKHIxMyk7CVwKKwlhbmRjCXIxMixyMTIscjA7CQlcCisJbXRtc3JkCXIxMiwxOwkJCVwKKwlMT0FEX1JFR19BRERSKHIwLC5vcGFsX3JldHVybik7CVwKKwltdGxyCXIwOwkJCVwKKwlsaQlyMCxNU1JfRFJ8TVNSX0lSOwlcCisJYW5kYwlyMTIscjEyLHIwOwkJXAorCWxpCXIwLHRva2VuOwkJXAorCW10c3ByCVNQUk5fSFNSUjEscjEyOwkJXAorCUxPQURfUkVHX0FERFIocjExLG9wYWwpOwlcCisJbGQJcjEyLDgocjExKTsJCVwKKwlsZAlyMiwwKHIxMSk7CQlcCisJbXRzcHIJU1BSTl9IU1JSMCxyMTI7CQlcCisJaHJmaWQKKworX1NUQVRJQyhvcGFsX3JldHVybikKKwlsZAlyMixQQUNBVE9DKHIxMyk7CisJbGQJcjQsOChyMSk7CisJbGQJcjUsMTYocjEpOworCWxkCXI2LFBBQ0FTQVZFRE1TUihyMTMpOworCW10c3ByCVNQUk5fU1JSMCxyNTsKKwltdHNwcglTUFJOX1NSUjEscjY7CisJbXRjcglyNDsKKwlyZmlkCisKK09QQUxfQ0FMTChvcGFsX2NvbnNvbGVfd3JpdGUsCQkJT1BBTF9DT05TT0xFX1dSSVRFKTsKK09QQUxfQ0FMTChvcGFsX2NvbnNvbGVfcmVhZCwJCQlPUEFMX0NPTlNPTEVfUkVBRCk7CitPUEFMX0NBTEwob3BhbF9jb25zb2xlX3dyaXRlX2J1ZmZlcl9zcGFjZSwJT1BBTF9DT05TT0xFX1dSSVRFX0JVRkZFUl9TUEFDRSk7CitPUEFMX0NBTEwob3BhbF9ydGNfcmVhZCwJCQlPUEFMX1JUQ19SRUFEKTsKK09QQUxfQ0FMTChvcGFsX3J0Y193cml0ZSwJCQlPUEFMX1JUQ19XUklURSk7CitPUEFMX0NBTEwob3BhbF9jZWNfcG93ZXJfZG93biwJCQlPUEFMX0NFQ19QT1dFUl9ET1dOKTsKK09QQUxfQ0FMTChvcGFsX2NlY19yZWJvb3QsCQkJT1BBTF9DRUNfUkVCT09UKTsKK09QQUxfQ0FMTChvcGFsX3JlYWRfbnZyYW0sCQkJT1BBTF9SRUFEX05WUkFNKTsKK09QQUxfQ0FMTChvcGFsX3dyaXRlX252cmFtLAkJCU9QQUxfV1JJVEVfTlZSQU0pOworT1BBTF9DQUxMKG9wYWxfaGFuZGxlX2ludGVycnVwdCwJCU9QQUxfSEFORExFX0lOVEVSUlVQVCk7CitPUEFMX0NBTEwob3BhbF9wb2xsX2V2ZW50cywJCQlPUEFMX1BPTExfRVZFTlRTKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9zZXRfaHViX3RjZV9tZW1vcnksCQlPUEFMX1BDSV9TRVRfSFVCX1RDRV9NRU1PUlkpOworT1BBTF9DQUxMKG9wYWxfcGNpX3NldF9waGJfdGNlX21lbW9yeSwJCU9QQUxfUENJX1NFVF9QSEJfVENFX01FTU9SWSk7CitPUEFMX0NBTEwob3BhbF9wY2lfY29uZmlnX3JlYWRfYnl0ZSwJCU9QQUxfUENJX0NPTkZJR19SRUFEX0JZVEUpOworT1BBTF9DQUxMKG9wYWxfcGNpX2NvbmZpZ19yZWFkX2hhbGZfd29yZCwJT1BBTF9QQ0lfQ09ORklHX1JFQURfSEFMRl9XT1JEKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9jb25maWdfcmVhZF93b3JkLAkJT1BBTF9QQ0lfQ09ORklHX1JFQURfV09SRCk7CitPUEFMX0NBTEwob3BhbF9wY2lfY29uZmlnX3dyaXRlX2J5dGUsCQlPUEFMX1BDSV9DT05GSUdfV1JJVEVfQllURSk7CitPUEFMX0NBTEwob3BhbF9wY2lfY29uZmlnX3dyaXRlX2hhbGZfd29yZCwJT1BBTF9QQ0lfQ09ORklHX1dSSVRFX0hBTEZfV09SRCk7CitPUEFMX0NBTEwob3BhbF9wY2lfY29uZmlnX3dyaXRlX3dvcmQsCQlPUEFMX1BDSV9DT05GSUdfV1JJVEVfV09SRCk7CitPUEFMX0NBTEwob3BhbF9zZXRfeGl2ZSwJCQlPUEFMX1NFVF9YSVZFKTsKK09QQUxfQ0FMTChvcGFsX2dldF94aXZlLAkJCU9QQUxfR0VUX1hJVkUpOworT1BBTF9DQUxMKG9wYWxfcmVnaXN0ZXJfZXhjZXB0aW9uX2hhbmRsZXIsCU9QQUxfUkVHSVNURVJfT1BBTF9FWENFUFRJT05fSEFORExFUik7CitPUEFMX0NBTEwob3BhbF9wY2lfZWVoX2ZyZWV6ZV9zdGF0dXMsCQlPUEFMX1BDSV9FRUhfRlJFRVpFX1NUQVRVUyk7CitPUEFMX0NBTEwob3BhbF9wY2lfZWVoX2ZyZWV6ZV9jbGVhciwJCU9QQUxfUENJX0VFSF9GUkVFWkVfQ0xFQVIpOworT1BBTF9DQUxMKG9wYWxfcGNpX3NocGMsCQkJT1BBTF9QQ0lfU0hQQyk7CitPUEFMX0NBTEwob3BhbF9wY2lfcGhiX21taW9fZW5hYmxlLAkJT1BBTF9QQ0lfUEhCX01NSU9fRU5BQkxFKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9zZXRfcGhiX21lbV93aW5kb3csCQlPUEFMX1BDSV9TRVRfUEhCX01FTV9XSU5ET1cpOworT1BBTF9DQUxMKG9wYWxfcGNpX21hcF9wZV9tbWlvX3dpbmRvdywJCU9QQUxfUENJX01BUF9QRV9NTUlPX1dJTkRPVyk7CitPUEFMX0NBTEwob3BhbF9wY2lfc2V0X3BoYl90YWJsZV9tZW1vcnksCU9QQUxfUENJX1NFVF9QSEJfVEFCTEVfTUVNT1JZKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9zZXRfcGUsCQkJT1BBTF9QQ0lfU0VUX1BFKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9zZXRfcGVsdHYsCQkJT1BBTF9QQ0lfU0VUX1BFTFRWKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9zZXRfbXZlLAkJCU9QQUxfUENJX1NFVF9NVkUpOworT1BBTF9DQUxMKG9wYWxfcGNpX3NldF9tdmVfZW5hYmxlLAkJT1BBTF9QQ0lfU0VUX01WRV9FTkFCTEUpOworT1BBTF9DQUxMKG9wYWxfcGNpX2dldF94aXZlX3JlaXNzdWUsCQlPUEFMX1BDSV9HRVRfWElWRV9SRUlTU1VFKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9zZXRfeGl2ZV9yZWlzc3VlLAkJT1BBTF9QQ0lfU0VUX1hJVkVfUkVJU1NVRSk7CitPUEFMX0NBTEwob3BhbF9wY2lfc2V0X3hpdmVfcGUsCQkJT1BBTF9QQ0lfU0VUX1hJVkVfUEUpOworT1BBTF9DQUxMKG9wYWxfZ2V0X3hpdmVfc291cmNlLAkJCU9QQUxfR0VUX1hJVkVfU09VUkNFKTsKK09QQUxfQ0FMTChvcGFsX2dldF9tc2lfMzIsCQkJT1BBTF9HRVRfTVNJXzMyKTsKK09QQUxfQ0FMTChvcGFsX2dldF9tc2lfNjQsCQkJT1BBTF9HRVRfTVNJXzY0KTsKK09QQUxfQ0FMTChvcGFsX3N0YXJ0X2NwdSwJCQlPUEFMX1NUQVJUX0NQVSk7CitPUEFMX0NBTEwob3BhbF9xdWVyeV9jcHVfc3RhdHVzLAkJT1BBTF9RVUVSWV9DUFVfU1RBVFVTKTsKK09QQUxfQ0FMTChvcGFsX3dyaXRlX29wcGFuZWwsCQkJT1BBTF9XUklURV9PUFBBTkVMKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9tYXBfcGVfZG1hX3dpbmRvdywJCU9QQUxfUENJX01BUF9QRV9ETUFfV0lORE9XKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9tYXBfcGVfZG1hX3dpbmRvd19yZWFsLAlPUEFMX1BDSV9NQVBfUEVfRE1BX1dJTkRPV19SRUFMKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9yZXNldCwJCQlPUEFMX1BDSV9SRVNFVCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWEwZGJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwuYwpAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqIFBvd2VyTlYgT1BBTCBoaWdoIGxldmVsIGludGVyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKworI2luY2x1ZGUgInBvd2VybnYuaCIKKworc3RydWN0IG9wYWwgeworCXU2NCBiYXNlOworCXU2NCBlbnRyeTsKK30gb3BhbDsKKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb3BhbF9ub2RlOworc3RhdGljIERFRklORV9TUElOTE9DSyhvcGFsX3dyaXRlX2xvY2spOworZXh0ZXJuIHU2NCBvcGFsX21jX3NlY29uZGFyeV9oYW5kbGVyW107CisKK2ludCBfX2luaXQgZWFybHlfaW5pdF9kdF9zY2FuX29wYWwodW5zaWduZWQgbG9uZyBub2RlLAorCQkJCSAgIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpCit7CisJY29uc3Qgdm9pZCAqYmFzZXAsICplbnRyeXA7CisJdW5zaWduZWQgbG9uZyBiYXNlc3osIGVudHJ5c3o7CisJdTY0IGdsdWU7CisKKwlpZiAoZGVwdGggIT0gMSB8fCBzdHJjbXAodW5hbWUsICJpYm0sb3BhbCIpICE9IDApCisJCXJldHVybiAwOworCisJYmFzZXAgID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAib3BhbC1iYXNlLWFkZHJlc3MiLCAmYmFzZXN6KTsKKwllbnRyeXAgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJvcGFsLWVudHJ5LWFkZHJlc3MiLCAmZW50cnlzeik7CisKKwlpZiAoIWJhc2VwIHx8ICFlbnRyeXApCisJCXJldHVybiAxOworCisJb3BhbC5iYXNlID0gb2ZfcmVhZF9udW1iZXIoYmFzZXAsIGJhc2Vzei80KTsKKwlvcGFsLmVudHJ5ID0gb2ZfcmVhZF9udW1iZXIoZW50cnlwLCBlbnRyeXN6LzQpOworCisJcHJfZGVidWcoIk9QQUwgQmFzZSAgPSAweCVsbHggKGJhc2VwPSVwIGJhc2Vzej0lbGQpXG4iLAorCQkgb3BhbC5iYXNlLCBiYXNlcCwgYmFzZXN6KTsKKwlwcl9kZWJ1ZygiT1BBTCBFbnRyeSA9IDB4JWxseCAoZW50cnlwPSVwIGJhc2Vzej0lbGQpXG4iLAorCQkgb3BhbC5lbnRyeSwgZW50cnlwLCBlbnRyeXN6KTsKKworCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgfD0gRldfRkVBVFVSRV9PUEFMOworCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUobm9kZSwgImlibSxvcGFsLXYyIikpIHsKKwkJcG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcyB8PSBGV19GRUFUVVJFX09QQUx2MjsKKwkJcHJpbnRrKCJPUEFMIFYyIGRldGVjdGVkICFcbiIpOworCX0gZWxzZSB7CisJCXByaW50aygiT1BBTCBWMSBkZXRlY3RlZCAhXG4iKTsKKwl9CisKKwkvKiBIb29rdXAgc29tZSBleGNlcHRpb24gaGFuZGxlcnMuIFdlIHVzZSB0aGUgZndubWkgYXJlYSBhdCAweDcwMDAKKwkgKiB0byBwcm92aWRlIHRoZSBnbHVlIHNwYWNlIHRvIE9QQUwKKwkgKi8KKwlnbHVlID0gMHg3MDAwOworCW9wYWxfcmVnaXN0ZXJfZXhjZXB0aW9uX2hhbmRsZXIoT1BBTF9NQUNISU5FX0NIRUNLX0hBTkRMRVIsCisJCQkJCV9fcGEob3BhbF9tY19zZWNvbmRhcnlfaGFuZGxlclswXSksCisJCQkJCWdsdWUpOworCWdsdWUgKz0gMTI4OworCW9wYWxfcmVnaXN0ZXJfZXhjZXB0aW9uX2hhbmRsZXIoT1BBTF9IWVBFUlZJU09SX01BSU5URU5BTkNFX0hBTkRMRVIsCisJCQkJCTAsIGdsdWUpOworCWdsdWUgKz0gMTI4OworCW9wYWxfcmVnaXN0ZXJfZXhjZXB0aW9uX2hhbmRsZXIoT1BBTF9TT0ZUUEFUQ0hfSEFORExFUiwgMCwgZ2x1ZSk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IG9wYWxfZ2V0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXM2NCBsZW4sIHJjOworCXU2NCBldnQ7CisKKwlpZiAoIW9wYWwuZW50cnkpCisJCXJldHVybiAtRU5PREVWOworCW9wYWxfcG9sbF9ldmVudHMoJmV2dCk7CisJaWYgKChldnQgJiBPUEFMX0VWRU5UX0NPTlNPTEVfSU5QVVQpID09IDApCisJCXJldHVybiAwOworCWxlbiA9IGNvdW50OworCXJjID0gb3BhbF9jb25zb2xlX3JlYWQodnRlcm1ubywgJmxlbiwgYnVmKTsKKwlpZiAocmMgPT0gT1BBTF9TVUNDRVNTKQorCQlyZXR1cm4gbGVuOworCXJldHVybiAwOworfQorCitpbnQgb3BhbF9wdXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY29uc3QgY2hhciAqZGF0YSwgaW50IHRvdGFsX2xlbikKK3sKKwlpbnQgd3JpdHRlbiA9IDA7CisJczY0IGxlbiwgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgZXZ0OworCisJaWYgKCFvcGFsLmVudHJ5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFdlIHdhbnQgcHV0X2NoYXJzIHRvIGJlIGF0b21pYyB0byBhdm9pZCBtYW5nbGluZyBvZiBodnNpCisJICogcGFja2V0cy4gVG8gZG8gdGhhdCwgd2UgZmlyc3QgdGVzdCBmb3Igcm9vbSBhbmQgcmV0dXJuCisJICogLUVBR0FJTiBpZiB0aGVyZSBpc24ndCBlbm91Z2guCisJICoKKwkgKiBVbmZvcnR1bmF0ZWx5LCBvcGFsX2NvbnNvbGVfd3JpdGVfYnVmZmVyX3NwYWNlKCkgZG9lc24ndAorCSAqIGFwcGVhciB0byB3b3JrIG9uIG9wYWwgdjEsIHNvIHdlIGp1c3QgYXNzdW1lIHRoZXJlIGlzCisJICogZW5vdWdoIHJvb20gYW5kIGJlIGRvbmUgd2l0aCBpdAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZvcGFsX3dyaXRlX2xvY2ssIGZsYWdzKTsKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9PUEFMdjIpKSB7CisJCXJjID0gb3BhbF9jb25zb2xlX3dyaXRlX2J1ZmZlcl9zcGFjZSh2dGVybW5vLCAmbGVuKTsKKwkJaWYgKHJjIHx8IGxlbiA8IHRvdGFsX2xlbikgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BhbF93cml0ZV9sb2NrLCBmbGFncyk7CisJCQkvKiBDbG9zZWQgLT4gZHJvcCBjaGFyYWN0ZXJzICovCisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHRvdGFsX2xlbjsKKwkJCW9wYWxfcG9sbF9ldmVudHMoJmV2dCk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKworCS8qIFdlIHN0aWxsIHRyeSB0byBoYW5kbGUgcGFydGlhbCBjb21wbGV0aW9ucywgdGhvdWdoIHRoZXkKKwkgKiBzaG91bGQgbm8gbG9uZ2VyIGhhcHBlbi4KKwkgKi8KKwlyYyA9IE9QQUxfQlVTWTsKKwl3aGlsZSh0b3RhbF9sZW4gPiAwICYmIChyYyA9PSBPUEFMX0JVU1kgfHwKKwkJCQlyYyA9PSBPUEFMX0JVU1lfRVZFTlQgfHwgcmMgPT0gT1BBTF9TVUNDRVNTKSkgeworCQlsZW4gPSB0b3RhbF9sZW47CisJCXJjID0gb3BhbF9jb25zb2xlX3dyaXRlKHZ0ZXJtbm8sICZsZW4sIGRhdGEpOworCQlpZiAocmMgPT0gT1BBTF9TVUNDRVNTKSB7CisJCQl0b3RhbF9sZW4gLT0gbGVuOworCQkJZGF0YSArPSBsZW47CisJCQl3cml0dGVuICs9IGxlbjsKKwkJfQorCQkvKiBUaGlzIGlzIGEgYml0IG5hc3R5IGJ1dCB3ZSBuZWVkIHRoYXQgZm9yIHRoZSBjb25zb2xlIHRvCisJCSAqIGZsdXNoIHdoZW4gdGhlcmUgYXJlbid0IGFueSBpbnRlcnJ1cHRzLiBXZSB3aWxsIGNsZWFuCisJCSAqIHRoaW5ncyBhIGJpdCBsYXRlciB0byBsaW1pdCB0aGF0IHRvIHN5bmNocm9ub3VzIHBhdGgKKwkJICogc3VjaCBhcyB0aGUga2VybmVsIGNvbnNvbGUgYW5kIHhtb24vdWRiZworCQkgKi8KKwkJZG8KKwkJCW9wYWxfcG9sbF9ldmVudHMoJmV2dCk7CisJCXdoaWxlKHJjID09IE9QQUxfU1VDQ0VTUyAmJiAoZXZ0ICYgT1BBTF9FVkVOVF9DT05TT0xFX09VVFBVVCkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcGFsX3dyaXRlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gd3JpdHRlbjsKK30KKworaW50IG9wYWxfbWFjaGluZV9jaGVjayhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgb3BhbF9tYWNoaW5lX2NoZWNrX2V2ZW50ICpvcGFsX2V2dCA9IGdldF9wYWNhKCktPm9wYWxfbWNfZXZ0OworCXN0cnVjdCBvcGFsX21hY2hpbmVfY2hlY2tfZXZlbnQgZXZ0OworCWNvbnN0IGNoYXIgKmxldmVsLCAqc2V2c3RyLCAqc3VidHlwZTsKKwlzdGF0aWMgY29uc3QgY2hhciAqb3BhbF9tY191ZV90eXBlc1tdID0geworCQkiSW5kZXRlcm1pbmF0ZSIsCisJCSJJbnN0cnVjdGlvbiBmZXRjaCIsCisJCSJQYWdlIHRhYmxlIHdhbGsgaWZldGNoIiwKKwkJIkxvYWQvU3RvcmUiLAorCQkiUGFnZSB0YWJsZSB3YWxrIExvYWQvU3RvcmUiLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm9wYWxfbWNfc2xiX3R5cGVzW10gPSB7CisJCSJJbmRldGVybWluYXRlIiwKKwkJIlBhcml0eSIsCisJCSJNdWx0aWhpdCIsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqb3BhbF9tY19lcmF0X3R5cGVzW10gPSB7CisJCSJJbmRldGVybWluYXRlIiwKKwkJIlBhcml0eSIsCisJCSJNdWx0aWhpdCIsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqb3BhbF9tY190bGJfdHlwZXNbXSA9IHsKKwkJIkluZGV0ZXJtaW5hdGUiLAorCQkiUGFyaXR5IiwKKwkJIk11bHRpaGl0IiwKKwl9OworCisJLyogQ29weSB0aGUgZXZlbnQgc3RydWN0dXJlIGFuZCByZWxlYXNlIHRoZSBvcmlnaW5hbCAqLworCWV2dCA9ICpvcGFsX2V2dDsKKwlvcGFsX2V2dC0+aW5fdXNlID0gMDsKKworCS8qIFByaW50IHRoaW5ncyBvdXQgKi8KKwlpZiAoZXZ0LnZlcnNpb24gIT0gT3BhbE1DRV9WMSkgeworCQlwcl9lcnIoIk1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uLCBVbmtub3duIGV2ZW50IHZlcnNpb24gJWQgIVxuIiwKKwkJICAgICAgIGV2dC52ZXJzaW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCXN3aXRjaChldnQuc2V2ZXJpdHkpIHsKKwljYXNlIE9wYWxNQ0VfU0VWX05PX0VSUk9SOgorCQlsZXZlbCA9IEtFUk5fSU5GTzsKKwkJc2V2c3RyID0gIkhhcm1sZXNzIjsKKwkJYnJlYWs7CisJY2FzZSBPcGFsTUNFX1NFVl9XQVJOSU5HOgorCQlsZXZlbCA9IEtFUk5fV0FSTklORzsKKwkJc2V2c3RyID0gIiI7CisJCWJyZWFrOworCWNhc2UgT3BhbE1DRV9TRVZfRVJST1JfU1lOQzoKKwkJbGV2ZWwgPSBLRVJOX0VSUjsKKwkJc2V2c3RyID0gIlNldmVyZSI7CisJCWJyZWFrOworCWNhc2UgT3BhbE1DRV9TRVZfRkFUQUw6CisJZGVmYXVsdDoKKwkJbGV2ZWwgPSBLRVJOX0VSUjsKKwkJc2V2c3RyID0gIkZhdGFsIjsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrKCIlcyVzIE1hY2hpbmUgY2hlY2sgaW50ZXJydXB0IFslc11cbiIsIGxldmVsLCBzZXZzdHIsCisJICAgICAgIGV2dC5kaXNwb3NpdGlvbiA9PSBPcGFsTUNFX0RJU1BPU0lUSU9OX1JFQ09WRVJFRCA/CisJICAgICAgICJSZWNvdmVyZWQiIDogIltOb3QgcmVjb3ZlcmVkIik7CisJcHJpbnRrKCIlcyAgSW5pdGlhdG9yOiAlc1xuIiwgbGV2ZWwsCisJICAgICAgIGV2dC5pbml0aWF0b3IgPT0gT3BhbE1DRV9JTklUSUFUT1JfQ1BVID8gIkNQVSIgOiAiVW5rbm93biIpOworCXN3aXRjaChldnQuZXJyb3JfdHlwZSkgeworCWNhc2UgT3BhbE1DRV9FUlJPUl9UWVBFX1VFOgorCQlzdWJ0eXBlID0gZXZ0LnUudWVfZXJyb3IudWVfZXJyb3JfdHlwZSA8CisJCQlBUlJBWV9TSVpFKG9wYWxfbWNfdWVfdHlwZXMpID8KKwkJCW9wYWxfbWNfdWVfdHlwZXNbZXZ0LnUudWVfZXJyb3IudWVfZXJyb3JfdHlwZV0KKwkJCTogIlVua25vd24iOworCQlwcmludGsoIiVzICBFcnJvciB0eXBlOiBVRSBbJXNdXG4iLCBsZXZlbCwgc3VidHlwZSk7CisJCWlmIChldnQudS51ZV9lcnJvci5lZmZlY3RpdmVfYWRkcmVzc19wcm92aWRlZCkKKwkJCXByaW50aygiJXMgICAgRWZmZWN0aXZlIGFkZHJlc3M6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgbGV2ZWwsIGV2dC51LnVlX2Vycm9yLmVmZmVjdGl2ZV9hZGRyZXNzKTsKKwkJaWYgKGV2dC51LnVlX2Vycm9yLnBoeXNpY2FsX2FkZHJlc3NfcHJvdmlkZWQpCisJCQlwcmludGsoIiVzICAgICAgUGh5c2lhbCBhZGRyZXNzOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIGxldmVsLCBldnQudS51ZV9lcnJvci5waHlzaWNhbF9hZGRyZXNzKTsKKwkJYnJlYWs7CisJY2FzZSBPcGFsTUNFX0VSUk9SX1RZUEVfU0xCOgorCQlzdWJ0eXBlID0gZXZ0LnUuc2xiX2Vycm9yLnNsYl9lcnJvcl90eXBlIDwKKwkJCUFSUkFZX1NJWkUob3BhbF9tY19zbGJfdHlwZXMpID8KKwkJCW9wYWxfbWNfc2xiX3R5cGVzW2V2dC51LnNsYl9lcnJvci5zbGJfZXJyb3JfdHlwZV0KKwkJCTogIlVua25vd24iOworCQlwcmludGsoIiVzICBFcnJvciB0eXBlOiBTTEIgWyVzXVxuIiwgbGV2ZWwsIHN1YnR5cGUpOworCQlpZiAoZXZ0LnUuc2xiX2Vycm9yLmVmZmVjdGl2ZV9hZGRyZXNzX3Byb3ZpZGVkKQorCQkJcHJpbnRrKCIlcyAgICBFZmZlY3RpdmUgYWRkcmVzczogJTAxNmxseFxuIiwKKwkJCSAgICAgICBsZXZlbCwgZXZ0LnUuc2xiX2Vycm9yLmVmZmVjdGl2ZV9hZGRyZXNzKTsKKwkJYnJlYWs7CisJY2FzZSBPcGFsTUNFX0VSUk9SX1RZUEVfRVJBVDoKKwkJc3VidHlwZSA9IGV2dC51LmVyYXRfZXJyb3IuZXJhdF9lcnJvcl90eXBlIDwKKwkJCUFSUkFZX1NJWkUob3BhbF9tY19lcmF0X3R5cGVzKSA/CisJCQlvcGFsX21jX2VyYXRfdHlwZXNbZXZ0LnUuZXJhdF9lcnJvci5lcmF0X2Vycm9yX3R5cGVdCisJCQk6ICJVbmtub3duIjsKKwkJcHJpbnRrKCIlcyAgRXJyb3IgdHlwZTogRVJBVCBbJXNdXG4iLCBsZXZlbCwgc3VidHlwZSk7CisJCWlmIChldnQudS5lcmF0X2Vycm9yLmVmZmVjdGl2ZV9hZGRyZXNzX3Byb3ZpZGVkKQorCQkJcHJpbnRrKCIlcyAgICBFZmZlY3RpdmUgYWRkcmVzczogJTAxNmxseFxuIiwKKwkJCSAgICAgICBsZXZlbCwgZXZ0LnUuZXJhdF9lcnJvci5lZmZlY3RpdmVfYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgT3BhbE1DRV9FUlJPUl9UWVBFX1RMQjoKKwkJc3VidHlwZSA9IGV2dC51LnRsYl9lcnJvci50bGJfZXJyb3JfdHlwZSA8CisJCQlBUlJBWV9TSVpFKG9wYWxfbWNfdGxiX3R5cGVzKSA/CisJCQlvcGFsX21jX3RsYl90eXBlc1tldnQudS50bGJfZXJyb3IudGxiX2Vycm9yX3R5cGVdCisJCQk6ICJVbmtub3duIjsKKwkJcHJpbnRrKCIlcyAgRXJyb3IgdHlwZTogVExCIFslc11cbiIsIGxldmVsLCBzdWJ0eXBlKTsKKwkJaWYgKGV2dC51LnRsYl9lcnJvci5lZmZlY3RpdmVfYWRkcmVzc19wcm92aWRlZCkKKwkJCXByaW50aygiJXMgICAgRWZmZWN0aXZlIGFkZHJlc3M6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgbGV2ZWwsIGV2dC51LnRsYl9lcnJvci5lZmZlY3RpdmVfYWRkcmVzcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBPcGFsTUNFX0VSUk9SX1RZUEVfVU5LTk9XTjoKKwkJcHJpbnRrKCIlcyAgRXJyb3IgdHlwZTogVW5rbm93blxuIiwgbGV2ZWwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGV2dC5zZXZlcml0eSA9PSBPcGFsTUNFX1NFVl9GQVRBTCA/IDAgOiAxOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgb3BhbF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwl1aW50NjRfdCBldmVudHM7CisKKwlvcGFsX2hhbmRsZV9pbnRlcnJ1cHQodmlycV90b19odyhpcnEpLCAmZXZlbnRzKTsKKworCS8qIFhYWCBUT0RPOiBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZXZlbnRzICovCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9wYWxfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpjb25zb2xlczsKKwljb25zdCB1MzIgKmlycXM7CisJaW50IHJjLCBpLCBpcnFsZW47CisKKwlvcGFsX25vZGUgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxvcGFsIik7CisJaWYgKCFvcGFsX25vZGUpIHsKKwkJcHJfd2Fybigib3BhbDogTm9kZSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTHYyKSkKKwkJY29uc29sZXMgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxvcGFsL2NvbnNvbGVzIik7CisJZWxzZQorCQljb25zb2xlcyA9IG9mX25vZGVfZ2V0KG9wYWxfbm9kZSk7CisKKwkvKiBSZWdpc3RlciBzZXJpYWwgcG9ydHMgKi8KKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGNvbnNvbGVzLCBucCkgeworCQlpZiAoc3RyY21wKG5wLT5uYW1lLCAic2VyaWFsIikpCisJCQljb250aW51ZTsKKwkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgTlVMTCwgTlVMTCk7CisJfQorCW9mX25vZGVfcHV0KGNvbnNvbGVzKTsKKworCS8qIEZpbmQgYWxsIE9QQUwgaW50ZXJydXB0cyBhbmQgcmVxdWVzdCB0aGVtICovCisJaXJxcyA9IG9mX2dldF9wcm9wZXJ0eShvcGFsX25vZGUsICJvcGFsLWludGVycnVwdHMiLCAmaXJxbGVuKTsKKwlwcl9kZWJ1Zygib3BhbDogRm91bmQgJWQgaW50ZXJydXB0cyByZXNlcnZlZCBmb3IgT1BBTFxuIiwKKwkJIGlycXMgPyAoaXJxbGVuIC8gNCkgOiAwKTsKKwlmb3IgKGkgPSAwOyBpcnFzICYmIGkgPCAoaXJxbGVuIC8gNCk7IGkrKywgaXJxcysrKSB7CisJCXVuc2lnbmVkIGludCBod2lycSA9IGJlMzJfdG9fY3B1cChpcnFzKTsKKwkJdW5zaWduZWQgaW50IGlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBod2lycSk7CisJCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCQlwcl93YXJuaW5nKCJvcGFsOiBGYWlsZWQgdG8gbWFwIGlycSAweCV4XG4iLCBod2lycSk7CisJCQljb250aW51ZTsKKwkJfQorCQlyYyA9IHJlcXVlc3RfaXJxKGlycSwgb3BhbF9pbnRlcnJ1cHQsIDAsICJvcGFsIiwgTlVMTCk7CisJCWlmIChyYykKKwkJCXByX3dhcm5pbmcoIm9wYWw6IEVycm9yICVkIHJlcXVlc3RpbmcgaXJxICVkIgorCQkJCSAgICIgKDB4JXgpXG4iLCByYywgaXJxLCBod2lycSk7CisJfQorCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKG9wYWxfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLXA1aW9jMi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1wNWlvYzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgwZjdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1wNWlvYzIuYwpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIFN1cHBvcnQgUENJL1BDSWUgb24gUG93ZXJOViBwbGF0Zm9ybXMKKyAqCisgKiBDdXJyZW50bHkgc3VwcG9ydHMgb25seSBQNUlPQzIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tc2kuaD4KKworI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vdGNlLmg+CisjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CisKKyNpbmNsdWRlICJwb3dlcm52LmgiCisjaW5jbHVkZSAicGNpLmgiCisKKy8qIEZvciBub3csIHVzZSBhIGZpeGVkIGFtb3VudCBvZiBUQ0UgbWVtb3J5IGZvciBlYWNoIHA1aW9jMgorICogaHViLCAxNk0gd2lsbCBkbworICovCisjZGVmaW5lIFA1SU9DMl9UQ0VfTUVNT1JZCTB4MDEwMDAwMDAKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCitzdGF0aWMgaW50IHBudl9wY2lfcDVpb2MyX21zaV9zZXR1cChzdHJ1Y3QgcG52X3BoYiAqcGhiLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgaHdpcnEsIHVuc2lnbmVkIGludCBpc182NCwKKwkJCQkgICAgc3RydWN0IG1zaV9tc2cgKm1zZykKK3sKKwlpZiAoV0FSTl9PTighaXNfNjQpKQorCQlyZXR1cm4gLUVOWElPOworCW1zZy0+ZGF0YSA9IGh3aXJxIC0gcGhiLT5tc2lfYmFzZTsKKwltc2ctPmFkZHJlc3NfaGkgPSAweDEwMDAwMDAwOworCW1zZy0+YWRkcmVzc19sbyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG52X3BjaV9pbml0X3A1aW9jMl9tc2lzKHN0cnVjdCBwbnZfcGhiICpwaGIpCit7CisJdW5zaWduZWQgaW50IGJtYXBfc2l6ZTsKKwljb25zdCBfX2JlMzIgKnByb3AgPSBvZl9nZXRfcHJvcGVydHkocGhiLT5ob3NlLT5kbiwKKwkJCQkJICAgICAiaWJtLG9wYWwtbXNpLXJhbmdlcyIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJLyogRG9uJ3QgZG8gTVNJJ3Mgb24gcDVpb2MyIFBDSS1YIGFyZSB0aGV5IGFyZSBub3QgcHJvcGVybHkKKwkgKiB2ZXJpZmllZCBpbiBIVworCSAqLworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwaGItPmhvc2UtPmRuLCAiaWJtLHA1aW9jMi1wY2l4IikpCisJCXJldHVybjsKKwlwaGItPm1zaV9iYXNlID0gYmUzMl90b19jcHVwKHByb3ApOworCXBoYi0+bXNpX2NvdW50ID0gYmUzMl90b19jcHVwKHByb3AgKyAxKTsKKwlibWFwX3NpemUgPSBCSVRTX1RPX0xPTkdTKHBoYi0+bXNpX2NvdW50KSAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwlwaGItPm1zaV9tYXAgPSB6YWxsb2NfbWF5YmVfYm9vdG1lbShibWFwX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcGhiLT5tc2lfbWFwKSB7CisJCXByX2VycigiUENJICVkOiBGYWlsZWQgdG8gYWxsb2NhdGUgTVNJIGJpdG1hcCAhXG4iLAorCQkgICAgICAgcGhiLT5ob3NlLT5nbG9iYWxfbnVtYmVyKTsKKwkJcmV0dXJuOworCX0KKwlwaGItPm1zaV9zZXR1cCA9IHBudl9wY2lfcDVpb2MyX21zaV9zZXR1cDsKKwlwaGItPm1zaTMyX3N1cHBvcnQgPSAwOworCXByX2luZm8oIiBBbGxvY2F0ZWQgYml0bWFwIGZvciAlZCBNU0lzIChiYXNlIElSUSAweCV4KVxuIiwKKwkJcGhiLT5tc2lfY291bnQsIHBoYi0+bXNpX2Jhc2UpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHBudl9wY2lfaW5pdF9wNWlvYzJfbXNpcyhzdHJ1Y3QgcG52X3BoYiAqcGhiKSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcG52X3BjaV9wNWlvYzJfZG1hX2Rldl9zZXR1cChzdHJ1Y3QgcG52X3BoYiAqcGhiLAorCQkJCQkJICAgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHBoYi0+cDVpb2MyLmlvbW11X3RhYmxlLml0X21hcCA9PSBOVUxMKQorCQlpb21tdV9pbml0X3RhYmxlKCZwaGItPnA1aW9jMi5pb21tdV90YWJsZSwgcGhiLT5ob3NlLT5ub2RlKTsKKworCXNldF9pb21tdV90YWJsZV9iYXNlKCZwZGV2LT5kZXYsICZwaGItPnA1aW9jMi5pb21tdV90YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbnZfcGNpX2luaXRfcDVpb2MyX3BoYihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgICB2b2lkICp0Y2VfbWVtLCB1NjQgdGNlX3NpemUpCit7CisJc3RydWN0IHBudl9waGIgKnBoYjsKKwljb25zdCB1NjQgKnByb3A2NDsKKwl1NjQgcGhiX2lkOworCWludDY0X3QgcmM7CisJc3RhdGljIGludCBwcmltYXJ5ID0gMTsKKworCXByX2luZm8oIiBJbml0aWFsaXppbmcgcDVpb2MyIFBIQiAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisKKwlwcm9wNjQgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0sb3BhbC1waGJpZCIsIE5VTEwpOworCWlmICghcHJvcDY0KSB7CisJCXByX2VycigiICBNaXNzaW5nIFwiaWJtLG9wYWwtcGhiaWRcIiBwcm9wZXJ0eSAhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwaGJfaWQgPSBiZTY0X3RvX2NwdXAocHJvcDY0KTsKKwlwcl9kZXZlbCgiICBQSEItSUQgIDogMHglMDE2bGx4XG4iLCBwaGJfaWQpOworCXByX2RldmVsKCIgIFRDRSBBVCAgOiAweCUwMTZseFxuIiwgX19wYSh0Y2VfbWVtKSk7CisJcHJfZGV2ZWwoIiAgVENFIFNaICA6IDB4JTAxNmxseFxuIiwgdGNlX3NpemUpOworCisJcmMgPSBvcGFsX3BjaV9zZXRfcGhiX3RjZV9tZW1vcnkocGhiX2lkLCBfX3BhKHRjZV9tZW0pLCB0Y2Vfc2l6ZSk7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykgeworCQlwcl9lcnIoIiAgRmFpbGVkIHRvIHNldCBUQ0UgbWVtb3J5LCBPUEFMIGVycm9yICVsbGRcbiIsIHJjKTsKKwkJcmV0dXJuOworCX0KKworCXBoYiA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCBwbnZfcGhiKSk7CisJaWYgKHBoYikgeworCQltZW1zZXQocGhiLCAwLCBzaXplb2Yoc3RydWN0IHBudl9waGIpKTsKKwkJcGhiLT5ob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG5wKTsKKwl9CisJaWYgKCFwaGIgfHwgIXBoYi0+aG9zZSkgeworCQlwcl9lcnIoIiAgRmFpbGVkIHRvIGFsbG9jYXRlIFBDSSBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pbml0KCZwaGItPmxvY2spOworCXBoYi0+aG9zZS0+Zmlyc3RfYnVzbm8gPSAwOworCXBoYi0+aG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CisJcGhiLT5ob3NlLT5wcml2YXRlX2RhdGEgPSBwaGI7CisJcGhiLT5vcGFsX2lkID0gcGhiX2lkOworCXBoYi0+dHlwZSA9IFBOVl9QSEJfUDVJT0MyOworCisJcGhiLT5yZWdzID0gb2ZfaW9tYXAobnAsIDApOworCisJaWYgKHBoYi0+cmVncyA9PSBOVUxMKQorCQlwcl9lcnIoIiAgRmFpbGVkIHRvIG1hcCByZWdpc3RlcnMgIVxuIik7CisJZWxzZSB7CisJCXByX2RldmVsKCIgIFBfQlVJRCAgICAgPSAweCUwOHhcbiIsIGluX2JlMzIocGhiLT5yZWdzICsgMHgxMDApKTsKKwkJcHJfZGV2ZWwoIiAgUF9JT1NaICAgICA9IDB4JTA4eFxuIiwgaW5fYmUzMihwaGItPnJlZ3MgKyAweDFiMCkpOworCQlwcl9kZXZlbCgiICBQX0lPX1NUICAgID0gMHglMDh4XG4iLCBpbl9iZTMyKHBoYi0+cmVncyArIDB4MWUwKSk7CisJCXByX2RldmVsKCIgIFBfTUVNMV9IICAgPSAweCUwOHhcbiIsIGluX2JlMzIocGhiLT5yZWdzICsgMHgxYTApKTsKKwkJcHJfZGV2ZWwoIiAgUF9NRU0xX0wgICA9IDB4JTA4eFxuIiwgaW5fYmUzMihwaGItPnJlZ3MgKyAweDE5MCkpOworCQlwcl9kZXZlbCgiICBQX01TWjFfTCAgID0gMHglMDh4XG4iLCBpbl9iZTMyKHBoYi0+cmVncyArIDB4MWMwKSk7CisJCXByX2RldmVsKCIgIFBfTUVNX1NUICAgPSAweCUwOHhcbiIsIGluX2JlMzIocGhiLT5yZWdzICsgMHgxZDApKTsKKwkJcHJfZGV2ZWwoIiAgUF9NRU0yX0ggICA9IDB4JTA4eFxuIiwgaW5fYmUzMihwaGItPnJlZ3MgKyAweDJjMCkpOworCQlwcl9kZXZlbCgiICBQX01FTTJfTCAgID0gMHglMDh4XG4iLCBpbl9iZTMyKHBoYi0+cmVncyArIDB4MmIwKSk7CisJCXByX2RldmVsKCIgIFBfTVNaMl9IICAgPSAweCUwOHhcbiIsIGluX2JlMzIocGhiLT5yZWdzICsgMHgyZDApKTsKKwkJcHJfZGV2ZWwoIiAgUF9NU1oyX0wgICA9IDB4JTA4eFxuIiwgaW5fYmUzMihwaGItPnJlZ3MgKyAweDJlMCkpOworCX0KKworCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KKwkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KKwlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHBoYi0+aG9zZSwgbnAsIHByaW1hcnkpOworCXByaW1hcnkgPSAwOworCisJcGhiLT5ob3NlLT5vcHMgPSAmcG52X3BjaV9vcHM7CisKKwkvKiBTZXR1cCBNU0kgc3VwcG9ydCAqLworCXBudl9wY2lfaW5pdF9wNWlvYzJfbXNpcyhwaGIpOworCisJLyogU2V0dXAgVENFcyAqLworCXBoYi0+ZG1hX2Rldl9zZXR1cCA9IHBudl9wY2lfcDVpb2MyX2RtYV9kZXZfc2V0dXA7CisJcG52X3BjaV9zZXR1cF9pb21tdV90YWJsZSgmcGhiLT5wNWlvYzIuaW9tbXVfdGFibGUsCisJCQkJICB0Y2VfbWVtLCB0Y2Vfc2l6ZSwgMCk7Cit9CisKK3ZvaWQgX19pbml0IHBudl9wY2lfaW5pdF9wNWlvYzJfaHViKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGRldmljZV9ub2RlICpwaGJuOworCWNvbnN0IHU2NCAqcHJvcDY0OworCXU2NCBodWJfaWQ7CisJdm9pZCAqdGNlX21lbTsKKwl1aW50NjRfdCB0Y2VfcGVyX3BoYjsKKwlpbnQ2NF90IHJjOworCWludCBwaGJfY291bnQgPSAwOworCisJcHJfaW5mbygiUHJvYmluZyBwNWlvYzIgSU8tSHViICVzXG4iLCBucC0+ZnVsbF9uYW1lKTsKKworCXByb3A2NCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImlibSxvcGFsLWh1YmlkIiwgTlVMTCk7CisJaWYgKCFwcm9wNjQpIHsKKwkJcHJfZXJyKCIgTWlzc2luZyBcImlibSxvcGFsLWh1YmlkXCIgcHJvcGVydHkgIVxuIik7CisJCXJldHVybjsKKwl9CisJaHViX2lkID0gYmU2NF90b19jcHVwKHByb3A2NCk7CisJcHJfaW5mbygiIEhVQi1JRCA6IDB4JTAxNmxseFxuIiwgaHViX2lkKTsKKworCS8qIEN1cnJlbnRseSBhbGxvY2F0ZSAxNk0gb2YgVENFIG1lbW9yeSBmb3IgZXZlcnkgSHViCisJICoKKwkgKiBYWFggVE9ETzogTWFrZSBpdCBjaGlwIGxvY2FsIGlmIHBvc3NpYmxlCisJICovCisJdGNlX21lbSA9IF9fYWxsb2NfYm9vdG1lbShQNUlPQzJfVENFX01FTU9SWSwgUDVJT0MyX1RDRV9NRU1PUlksCisJCQkJICBfX3BhKE1BWF9ETUFfQUREUkVTUykpOworCWlmICghdGNlX21lbSkgeworCQlwcl9lcnIoIiBGYWlsZWQgdG8gYWxsb2NhdGUgVENFIE1lbW9yeSAhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcl9kZWJ1ZygiIFRDRSAgICA6IDB4JTAxNmx4Li4weCUwMTZseFxuIiwKKwkJX19wYSh0Y2VfbWVtKSwgX19wYSh0Y2VfbWVtKSArIFA1SU9DMl9UQ0VfTUVNT1JZIC0gMSk7CisJcmMgPSBvcGFsX3BjaV9zZXRfaHViX3RjZV9tZW1vcnkoaHViX2lkLCBfX3BhKHRjZV9tZW0pLAorCQkJCQlQNUlPQzJfVENFX01FTU9SWSk7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykgeworCQlwcl9lcnIoIiBGYWlsZWQgdG8gYWxsb2NhdGUgVENFIG1lbW9yeSwgT1BBTCBlcnJvciAlbGxkXG4iLCByYyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb3VudCBjaGlsZCBQSEJzICovCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShucCwgcGhibikgeworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGhibiwgImlibSxwNWlvYzItcGNpeCIpIHx8CisJCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwaGJuLCAiaWJtLHA1aW9jMi1wY2lleCIpKQorCQkJcGhiX2NvdW50Kys7CisJfQorCisJLyogQ2FsY3VsYXRlIGhvdyBtdWNoIFRDRSBzcGFjZSB3ZSBjYW4gZ2l2ZSBwZXIgUEhCICovCisJdGNlX3Blcl9waGIgPSBfX3JvdW5kZG93bl9wb3dfb2ZfdHdvKFA1SU9DMl9UQ0VfTUVNT1JZIC8gcGhiX2NvdW50KTsKKwlwcl9pbmZvKCIgQWxsb2NhdGluZyAlbGxkIE1CIG9mIFRDRSBtZW1vcnkgcGVyIFBIQlxuIiwKKwkJdGNlX3Blcl9waGIgPj4gMjApOworCisJLyogSW5pdGlhbGl6ZSBQSEJzICovCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShucCwgcGhibikgeworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGhibiwgImlibSxwNWlvYzItcGNpeCIpIHx8CisJCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwaGJuLCAiaWJtLHA1aW9jMi1wY2lleCIpKSB7CisJCQlwbnZfcGNpX2luaXRfcDVpb2MyX3BoYihwaGJuLCB0Y2VfbWVtLCB0Y2VfcGVyX3BoYik7CisJCQl0Y2VfbWVtICs9IHRjZV9wZXJfcGhiOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YmI2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qCisgKiBTdXBwb3J0IFBDSS9QQ0llIG9uIFBvd2VyTlYgcGxhdGZvcm1zCisgKgorICogQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgUDVJT0MyCisgKgorICogQ29weXJpZ2h0IDIwMTEgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisKKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisjaW5jbHVkZSA8YXNtL3RjZS5oPgorI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgorCisjaW5jbHVkZSAicG93ZXJudi5oIgorI2luY2x1ZGUgInBjaS5oIgorCisvKiBEZWxheSBpbiB1c2VjICovCisjZGVmaW5lIFBDSV9SRVNFVF9ERUxBWV9VUwkzMDAwMDAwCisKKyNkZWZpbmUgY2ZnX2RiZyhmbXQuLi4pCWRvIHsgfSB3aGlsZSgwKQorLy8jZGVmaW5lIGNmZ19kYmcoZm10Li4uKQlwcmludGsoZm10KQorCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK3N0YXRpYyBpbnQgcG52X21zaV9jaGVja19kZXZpY2Uoc3RydWN0IHBjaV9kZXYqIHBkZXYsIGludCBudmVjLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QocGRldi0+YnVzKTsKKwlzdHJ1Y3QgcG52X3BoYiAqcGhiID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIChwaGIgJiYgcGhiLT5tc2lfbWFwKSA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBudl9nZXRfb25lX21zaShzdHJ1Y3QgcG52X3BoYiAqcGhiKQoreworCXVuc2lnbmVkIGludCBpZDsKKworCXNwaW5fbG9jaygmcGhiLT5sb2NrKTsKKwlpZCA9IGZpbmRfbmV4dF96ZXJvX2JpdChwaGItPm1zaV9tYXAsIHBoYi0+bXNpX2NvdW50LCBwaGItPm1zaV9uZXh0KTsKKwlpZiAoaWQgPj0gcGhiLT5tc2lfY291bnQgJiYgcGhiLT5tc2lfbmV4dCkKKwkJaWQgPSBmaW5kX25leHRfemVyb19iaXQocGhiLT5tc2lfbWFwLCBwaGItPm1zaV9jb3VudCwgMCk7CisJaWYgKGlkID49IHBoYi0+bXNpX2NvdW50KSB7CisJCXNwaW5fdW5sb2NrKCZwaGItPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisJX19zZXRfYml0KGlkLCBwaGItPm1zaV9tYXApOworCXNwaW5fdW5sb2NrKCZwaGItPmxvY2spOworCXJldHVybiBpZCArIHBoYi0+bXNpX2Jhc2U7Cit9CisKK3N0YXRpYyB2b2lkIHBudl9wdXRfbXNpKHN0cnVjdCBwbnZfcGhiICpwaGIsIHVuc2lnbmVkIGludCBod2lycSkKK3sKKwl1bnNpZ25lZCBpbnQgaWQ7CisKKwlpZiAoV0FSTl9PTihod2lycSA8IHBoYi0+bXNpX2Jhc2UgfHwKKwkJICAgIGh3aXJxID49IChwaGItPm1zaV9iYXNlICsgcGhiLT5tc2lfY291bnQpKSkKKwkJcmV0dXJuOworCWlkID0gaHdpcnEgLSBwaGItPm1zaV9iYXNlOworCXNwaW5fbG9jaygmcGhiLT5sb2NrKTsKKwlfX2NsZWFyX2JpdChpZCwgcGhiLT5tc2lfbWFwKTsKKwlzcGluX3VubG9jaygmcGhiLT5sb2NrKTsKK30KKworc3RhdGljIGludCBwbnZfc2V0dXBfbXNpX2lycXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudmVjLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QocGRldi0+YnVzKTsKKwlzdHJ1Y3QgcG52X3BoYiAqcGhiID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtc2lfZGVzYyAqZW50cnk7CisJc3RydWN0IG1zaV9tc2cgbXNnOworCXVuc2lnbmVkIGludCBod2lycSwgdmlycTsKKwlpbnQgcmM7CisKKwlpZiAoV0FSTl9PTighcGhiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmcGRldi0+bXNpX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFlbnRyeS0+bXNpX2F0dHJpYi5pc182NCAmJiAhcGhiLT5tc2kzMl9zdXBwb3J0KSB7CisJCQlwcl93YXJuKCIlczogU3VwcG9ydHMgb25seSA2NC1iaXQgTVNJc1xuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCWh3aXJxID0gcG52X2dldF9vbmVfbXNpKHBoYik7CisJCWlmICghaHdpcnEpIHsKKwkJCXByX3dhcm4oIiVzOiBGYWlsZWQgdG8gZmluZCBhIGZyZWUgTVNJXG4iLAorCQkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJCXJldHVybiAtRU5PU1BDOworCQl9CisJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgaHdpcnEpOworCQlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJCXByX3dhcm4oIiVzOiBGYWlsZWQgdG8gbWFwIE1TSSB0byBsaW51eCBpcnFcbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQkJcG52X3B1dF9tc2kocGhiLCBod2lycSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlyYyA9IHBoYi0+bXNpX3NldHVwKHBoYiwgcGRldiwgaHdpcnEsIGVudHJ5LT5tc2lfYXR0cmliLmlzXzY0LAorCQkJCSAgICAmbXNnKTsKKwkJaWYgKHJjKSB7CisJCQlwcl93YXJuKCIlczogRmFpbGVkIHRvIHNldHVwIE1TSVxuIiwgcGNpX25hbWUocGRldikpOworCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyh2aXJxKTsKKwkJCXBudl9wdXRfbXNpKHBoYiwgaHdpcnEpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWlycV9zZXRfbXNpX2Rlc2ModmlycSwgZW50cnkpOworCQl3cml0ZV9tc2lfbXNnKHZpcnEsICZtc2cpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG52X3RlYXJkb3duX21zaV9pcnFzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChwZGV2LT5idXMpOworCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKKworCWlmIChXQVJOX09OKCFwaGIpKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmcGRldi0+bXNpX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGVudHJ5LT5pcnEgPT0gTk9fSVJRKQorCQkJY29udGludWU7CisJCWlycV9zZXRfbXNpX2Rlc2MoZW50cnktPmlycSwgTlVMTCk7CisJCXBudl9wdXRfbXNpKHBoYiwgdmlycV90b19odyhlbnRyeS0+aXJxKSk7CisJCWlycV9kaXNwb3NlX21hcHBpbmcoZW50cnktPmlycSk7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKK3N0YXRpYyB2b2lkIHBudl9wY2lfY29uZmlnX2NoZWNrX2VlaChzdHJ1Y3QgcG52X3BoYiAqcGhiLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCSAgICAgdTMyIGJkZm4pCit7CisJczY0CXJjOworCXU4CWZzdGF0ZTsKKwl1MTYJcGNpZXJyOworCXUzMglwZV9ubzsKKworCS8qIEdldCBQRSMgaWYgd2Ugc3VwcG9ydCBJT0RBICovCisJcGVfbm8gPSBwaGItPmJkZm5fdG9fcGUgPyBwaGItPmJkZm5fdG9fcGUocGhiLCBidXMsIGJkZm4gJiAweGZmKSA6IDA7CisKKwkvKiBSZWFkIGZyZWV6ZSBzdGF0dXMgKi8KKwlyYyA9IG9wYWxfcGNpX2VlaF9mcmVlemVfc3RhdHVzKHBoYi0+b3BhbF9pZCwgcGVfbm8sICZmc3RhdGUsICZwY2llcnIsCisJCQkJCU5VTEwpOworCWlmIChyYykgeworCQlwcl93YXJuaW5nKCJQQ0kgJWQ6IEZhaWxlZCB0byByZWFkIEVFSCBzdGF0dXMgZm9yIFBFIyVkLCIKKwkJCSAgICIgZXJyICVsbGRcbiIsIHBoYi0+aG9zZS0+Z2xvYmFsX251bWJlciwgcGVfbm8sIHJjKTsKKwkJcmV0dXJuOworCX0KKwljZmdfZGJnKCIgLT4gRUVIIGNoZWNrLCBiZGZuPSUwNHggUEUlZCBmc3RhdGU9JXhcbiIsCisJCWJkZm4sIHBlX25vLCBmc3RhdGUpOworCWlmIChmc3RhdGUgIT0gMCkgeworCQlyYyA9IG9wYWxfcGNpX2VlaF9mcmVlemVfY2xlYXIocGhiLT5vcGFsX2lkLCBwZV9ubywKKwkJCQkJICAgICAgT1BBTF9FRUhfQUNUSU9OX0NMRUFSX0ZSRUVaRV9BTEwpOworCQlpZiAocmMpIHsKKwkJCXByX3dhcm5pbmcoIlBDSSAlZDogRmFpbGVkIHRvIGNsZWFyIEVFSCBmcmVlemUgc3RhdGUiCisJCQkJICAgIiBmb3IgUEUjJWQsIGVyciAlbGxkXG4iLAorCQkJCSAgIHBoYi0+aG9zZS0+Z2xvYmFsX251bWJlciwgcGVfbm8sIHJjKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBwbnZfcGNpX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJdTMyIGJkZm4gPSAoKCh1aW50NjRfdClidXMtPm51bWJlcikgPDwgOCkgfCBkZXZmbjsKKwlzNjQgcmM7CisKKwlpZiAoaG9zZSA9PSBOVUxMKQorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOiB7CisJCXU4IHY4OworCQlyYyA9IG9wYWxfcGNpX2NvbmZpZ19yZWFkX2J5dGUocGhiLT5vcGFsX2lkLCBiZGZuLCB3aGVyZSwgJnY4KTsKKwkJKnZhbCA9IChyYyA9PSBPUEFMX1NVQ0NFU1MpID8gdjggOiAweGZmOworCQlicmVhazsKKwl9CisJY2FzZSAyOiB7CisJCXUxNiB2MTY7CisJCXJjID0gb3BhbF9wY2lfY29uZmlnX3JlYWRfaGFsZl93b3JkKHBoYi0+b3BhbF9pZCwgYmRmbiwgd2hlcmUsCisJCQkJCQkgICAmdjE2KTsKKwkJKnZhbCA9IChyYyA9PSBPUEFMX1NVQ0NFU1MpID8gdjE2IDogMHhmZmZmOworCQlicmVhazsKKwl9CisJY2FzZSA0OiB7CisJCXUzMiB2MzI7CisJCXJjID0gb3BhbF9wY2lfY29uZmlnX3JlYWRfd29yZChwaGItPm9wYWxfaWQsIGJkZm4sIHdoZXJlLCAmdjMyKTsKKwkJKnZhbCA9IChyYyA9PSBPUEFMX1NVQ0NFU1MpID8gdjMyIDogMHhmZmZmZmZmZjsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiBQQ0lCSU9TX0ZVTkNfTk9UX1NVUFBPUlRFRDsKKwl9CisJY2ZnX2RiZygicG52X3BjaV9yZWFkX2NvbmZpZyBidXM6ICV4IGRldmZuOiAleCArJXgvJXggLT4gJTA4eFxuIiwKKwkJYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSwgc2l6ZSwgKnZhbCk7CisKKwkvKiBDaGVjayBpZiB0aGUgUEhCIGdvdCBmcm96ZW4gZHVlIHRvIGFuIGVycm9yIChubyByZXNwb25zZSkgKi8KKwlwbnZfcGNpX2NvbmZpZ19jaGVja19lZWgocGhiLCBidXMsIGJkZm4pOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCBwbnZfcGNpX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCXVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQlpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJdTMyIGJkZm4gPSAoKCh1aW50NjRfdClidXMtPm51bWJlcikgPDwgOCkgfCBkZXZmbjsKKworCWlmIChob3NlID09IE5VTEwpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwljZmdfZGJnKCJwbnZfcGNpX3dyaXRlX2NvbmZpZyBidXM6ICV4IGRldmZuOiAleCArJXgvJXggLT4gJTA4eFxuIiwKKwkJYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSwgc2l6ZSwgdmFsKTsKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6CisJCW9wYWxfcGNpX2NvbmZpZ193cml0ZV9ieXRlKHBoYi0+b3BhbF9pZCwgYmRmbiwgd2hlcmUsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb3BhbF9wY2lfY29uZmlnX3dyaXRlX2hhbGZfd29yZChwaGItPm9wYWxfaWQsIGJkZm4sIHdoZXJlLCB2YWwpOworCQlicmVhazsKKwljYXNlIDQ6CisJCW9wYWxfcGNpX2NvbmZpZ193cml0ZV93b3JkKHBoYi0+b3BhbF9pZCwgYmRmbiwgd2hlcmUsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBQQ0lCSU9TX0ZVTkNfTk9UX1NVUFBPUlRFRDsKKwl9CisJLyogQ2hlY2sgaWYgdGhlIFBIQiBnb3QgZnJvemVuIGR1ZSB0byBhbiBlcnJvciAobm8gcmVzcG9uc2UpICovCisJcG52X3BjaV9jb25maWdfY2hlY2tfZWVoKHBoYiwgYnVzLCBiZGZuKTsKKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0cnVjdCBwY2lfb3BzIHBudl9wY2lfb3BzID0geworCS5yZWFkID0gcG52X3BjaV9yZWFkX2NvbmZpZywKKwkud3JpdGUgPSBwbnZfcGNpX3dyaXRlX2NvbmZpZywKK307CisKK3N0YXRpYyBpbnQgcG52X3RjZV9idWlsZChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwgbG9uZyBucGFnZXMsCisJCQkgdW5zaWduZWQgbG9uZyB1YWRkciwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAorCQkJIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCXU2NCBwcm90b190Y2U7CisJdTY0ICp0Y2VwOworCXU2NCBycG47CisKKwlwcm90b190Y2UgPSBUQ0VfUENJX1JFQUQ7IC8vIFJlYWQgYWxsb3dlZAorCisJaWYgKGRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQorCQlwcm90b190Y2UgfD0gVENFX1BDSV9XUklURTsKKworCXRjZXAgPSAoKHU2NCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKKworCXdoaWxlIChucGFnZXMtLSkgeworCQkvKiBjYW4ndCBtb3ZlIHRoaXMgb3V0IHNpbmNlIHdlIG1pZ2h0IGNyb3NzIExNQiBib3VuZGFyeSAqLworCQlycG4gPSAodmlydF90b19hYnModWFkZHIpKSA+PiBUQ0VfU0hJRlQ7CisJCSp0Y2VwID0gcHJvdG9fdGNlIHwgKHJwbiAmIFRDRV9SUE5fTUFTSykgPDwgVENFX1JQTl9TSElGVDsKKworCQl1YWRkciArPSBUQ0VfUEFHRV9TSVpFOworCQl0Y2VwKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbnZfdGNlX2ZyZWUoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGxvbmcgaW5kZXgsIGxvbmcgbnBhZ2VzKQoreworCXU2NCAqdGNlcCA9ICgodTY0ICopdGJsLT5pdF9iYXNlKSArIGluZGV4OworCisJd2hpbGUgKG5wYWdlcy0tKQorCQkqKHRjZXArKykgPSAwOworfQorCit2b2lkIHBudl9wY2lfc2V0dXBfaW9tbXVfdGFibGUoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsCisJCQkgICAgICAgdm9pZCAqdGNlX21lbSwgdTY0IHRjZV9zaXplLAorCQkJICAgICAgIHU2NCBkbWFfb2Zmc2V0KQoreworCXRibC0+aXRfYmxvY2tzaXplID0gMTY7CisJdGJsLT5pdF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpdGNlX21lbTsKKwl0YmwtPml0X29mZnNldCA9IGRtYV9vZmZzZXQgPj4gSU9NTVVfUEFHRV9TSElGVDsKKwl0YmwtPml0X2luZGV4ID0gMDsKKwl0YmwtPml0X3NpemUgPSB0Y2Vfc2l6ZSA+PiAzOworCXRibC0+aXRfYnVzbm8gPSAwOworCXRibC0+aXRfdHlwZSA9IFRDRV9QQ0k7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfdGFibGUgKiBfX2RldmluaXQKK3Budl9wY2lfc2V0dXBfYm1sX2lvbW11KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibDsKKwljb25zdCBfX2JlNjQgKmJhc2VwOworCWNvbnN0IF9fYmUzMiAqc2l6ZXA7CisKKwliYXNlcCA9IG9mX2dldF9wcm9wZXJ0eShob3NlLT5kbiwgImxpbnV4LHRjZS1iYXNlIiwgTlVMTCk7CisJc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkoaG9zZS0+ZG4sICJsaW51eCx0Y2Utc2l6ZSIsIE5VTEwpOworCWlmIChiYXNlcCA9PSBOVUxMIHx8IHNpemVwID09IE5VTEwpIHsKKwkJcHJfZXJyKCJQQ0k6ICVzIGhhcyBtaXNzaW5nIHRjZSBlbnRyaWVzICFcbiIsIGhvc2UtPmRuLT5mdWxsX25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJdGJsID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLCBHRlBfS0VSTkVMLCBob3NlLT5ub2RlKTsKKwlpZiAoV0FSTl9PTighdGJsKSkKKwkJcmV0dXJuIE5VTEw7CisJcG52X3BjaV9zZXR1cF9pb21tdV90YWJsZSh0YmwsIF9fdmEoYmU2NF90b19jcHVwKGJhc2VwKSksCisJCQkJICBiZTMyX3RvX2NwdXAoc2l6ZXApLCAwKTsKKwlpb21tdV9pbml0X3RhYmxlKHRibCwgaG9zZS0+bm9kZSk7CisJcmV0dXJuIHRibDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9wY2lfZG1hX2ZhbGxiYWNrX3NldHVwKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkJCSBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGNpX2J1c190b19PRl9ub2RlKGhvc2UtPmJ1cyk7CisJc3RydWN0IHBjaV9kbiAqcGRuOworCisJaWYgKG5wID09IE5VTEwpCisJCXJldHVybjsKKwlwZG4gPSBQQ0lfRE4obnApOworCWlmICghcGRuLT5pb21tdV90YWJsZSkKKwkJcGRuLT5pb21tdV90YWJsZSA9IHBudl9wY2lfc2V0dXBfYm1sX2lvbW11KGhvc2UpOworCWlmICghcGRuLT5pb21tdV90YWJsZSkKKwkJcmV0dXJuOworCXNldF9pb21tdV90YWJsZV9iYXNlKCZwZGV2LT5kZXYsIHBkbi0+aW9tbXVfdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcG52X3BjaV9kbWFfZGV2X3NldHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChwZGV2LT5idXMpOworCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisKKwkvKiBJZiB3ZSBoYXZlIG5vIHBoYiBzdHJ1Y3R1cmUsIHRyeSB0byBzZXR1cCBhIGZhbGxiYWNrIGJhc2VkIG9uCisJICogdGhlIGRldmljZS10cmVlIChSVEFTIFBDSSBmb3IgZXhhbXBsZSkKKwkgKi8KKwlpZiAocGhiICYmIHBoYi0+ZG1hX2Rldl9zZXR1cCkKKwkJcGhiLT5kbWFfZGV2X3NldHVwKHBoYiwgcGRldik7CisJZWxzZQorCQlwbnZfcGNpX2RtYV9mYWxsYmFja19zZXR1cChob3NlLCBwZGV2KTsKK30KKworc3RhdGljIGludCBwbnZfcGNpX3Byb2JlX21vZGUoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKwljb25zdCBfX2JlNjQgKnRzdGFtcDsKKwl1NjQgbm93LCB0YXJnZXQ7CisKKworCS8qIFdlIGhpamFjayB0aGlzIGFzIGEgd2F5IHRvIGVuc3VyZSB3ZSBoYXZlIHdhaXRlZCBsb25nCisJICogZW5vdWdoIHNpbmNlIHRoZSByZXNldCB3YXMgbGlmdGVkIG9uIHRoZSBQQ0kgYnVzCisJICovCisJaWYgKGJ1cyAhPSBob3NlLT5idXMpCisJCXJldHVybiBQQ0lfUFJPQkVfTk9STUFMOworCXRzdGFtcCA9IG9mX2dldF9wcm9wZXJ0eShob3NlLT5kbiwgInJlc2V0LWNsZWFyLXRpbWVzdGFtcCIsIE5VTEwpOworCWlmICghdHN0YW1wIHx8ICEqdHN0YW1wKQorCQlyZXR1cm4gUENJX1BST0JFX05PUk1BTDsKKworCW5vdyA9IG1mdGIoKSAvIHRiX3RpY2tzX3Blcl91c2VjOworCXRhcmdldCA9IChiZTY0X3RvX2NwdXAodHN0YW1wKSAvIHRiX3RpY2tzX3Blcl91c2VjKQorCQkrIFBDSV9SRVNFVF9ERUxBWV9VUzsKKworCXByX2RldmVsKCJwY2kgJTA0ZDogUmVzZXQgdGFyZ2V0OiAweCVsbHggbm93OiAweCVsbHhcbiIsCisJCSBob3NlLT5nbG9iYWxfbnVtYmVyLCB0YXJnZXQsIG5vdyk7CisKKwlpZiAobm93IDwgdGFyZ2V0KQorCQltc2xlZXAoKHRhcmdldCAtIG5vdyArIDk5OSkgLyAxMDAwKTsKKworCXJldHVybiBQQ0lfUFJPQkVfTk9STUFMOworfQorCit2b2lkIF9faW5pdCBwbnZfcGNpX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJcGNpX3NldF9mbGFncyhQQ0lfQ0FOX1NLSVBfSVNBX0FMSUdOKTsKKworCS8qIFdlIGRvIG5vdCB3YW50IHRvIGp1c3QgcHJvYmUgKi8KKwlwY2lfcHJvYmVfb25seSA9IDA7CisKKwkvKiBPUEFMIGFic2VudCwgdHJ5IFBPUEFMIGZpcnN0IHRoZW4gUlRBUyBkZXRlY3Rpb24gb2YgUEhCcyAqLworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9PUEFMKSkgeworI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVl9SVEFTCisJCWluaXRfcGNpX2NvbmZpZ190b2tlbnMoKTsKKwkJZmluZF9hbmRfaW5pdF9waGJzKCk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19QT1dFUk5WX1JUQVMgKi8KKwl9IGVsc2UgeworCQkvKiBPUEFMIGlzIGhlcmUsIGRvIG91ciBub3JtYWwgc3R1ZmYgKi8KKworCQkvKiBMb29rIGZvciBwNWlvYzIgSU8tSHVicyAqLworCQlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsIE5VTEwsICJpYm0scDVpb2MyIikKKwkJCXBudl9wY2lfaW5pdF9wNWlvYzJfaHViKG5wKTsKKwl9CisKKwkvKiBTZXR1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIE9GIG5vZGVzIGFuZCBQSEJzICovCisJcGNpX2RldnNfcGhiX2luaXQoKTsKKworCS8qIENvbmZpZ3VyZSBJT01NVSBETUEgaG9va3MgKi8KKwlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBwbnZfcGNpX2RtYV9kZXZfc2V0dXA7CisJcHBjX21kLnRjZV9idWlsZCA9IHBudl90Y2VfYnVpbGQ7CisJcHBjX21kLnRjZV9mcmVlID0gcG52X3RjZV9mcmVlOworCXBwY19tZC5wY2lfcHJvYmVfbW9kZSA9IHBudl9wY2lfcHJvYmVfbW9kZTsKKwlzZXRfcGNpX2RtYV9vcHMoJmRtYV9pb21tdV9vcHMpOworCisJLyogQ29uZmlndXJlIE1TSXMgKi8KKyNpZmRlZiBDT05GSUdfUENJX01TSQorCXBwY19tZC5tc2lfY2hlY2tfZGV2aWNlID0gcG52X21zaV9jaGVja19kZXZpY2U7CisJcHBjX21kLnNldHVwX21zaV9pcnFzID0gcG52X3NldHVwX21zaV9pcnFzOworCXBwY19tZC50ZWFyZG93bl9tc2lfaXJxcyA9IHBudl90ZWFyZG93bl9tc2lfaXJxczsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGJjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfX1BPV0VSTlZfUENJX0gKKyNkZWZpbmUgX19QT1dFUk5WX1BDSV9ICisKK3N0cnVjdCBwY2lfZG47CisKK2VudW0gcG52X3BoYl90eXBlIHsKKwlQTlZfUEhCX1A1SU9DMiwKKwlQTlZfUEhCX0lPREExLAorCVBOVl9QSEJfSU9EQTIsCit9OworCitzdHJ1Y3QgcG52X3BoYiB7CisJc3RydWN0IHBjaV9jb250cm9sbGVyCSpob3NlOworCWVudW0gcG52X3BoYl90eXBlCXR5cGU7CisJdTY0CQkJb3BhbF9pZDsKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCXNwaW5sb2NrX3QJCWxvY2s7CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCXVuc2lnbmVkIGxvbmcJCSptc2lfbWFwOworCXVuc2lnbmVkIGludAkJbXNpX2Jhc2U7CisJdW5zaWduZWQgaW50CQltc2lfY291bnQ7CisJdW5zaWduZWQgaW50CQltc2lfbmV4dDsKKwl1bnNpZ25lZCBpbnQJCW1zaTMyX3N1cHBvcnQ7CisjZW5kaWYKKwlpbnQgKCptc2lfc2V0dXApKHN0cnVjdCBwbnZfcGhiICpwaGIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkgdW5zaWduZWQgaW50IGh3aXJxLCB1bnNpZ25lZCBpbnQgaXNfNjQsCisJCQkgc3RydWN0IG1zaV9tc2cgKm1zZyk7CisJdm9pZCAoKmRtYV9kZXZfc2V0dXApKHN0cnVjdCBwbnZfcGhiICpwaGIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKwl2b2lkICgqZml4dXBfcGhiKShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXUzMiAoKmJkZm5fdG9fcGUpKHN0cnVjdCBwbnZfcGhiICpwaGIsIHN0cnVjdCBwY2lfYnVzICpidXMsIHUzMiBkZXZmbik7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgaW9tbXVfdGFibGUgaW9tbXVfdGFibGU7CisJCX0gcDVpb2MyOworCX07Cit9OworCitleHRlcm4gc3RydWN0IHBjaV9vcHMgcG52X3BjaV9vcHM7CisKK2V4dGVybiB2b2lkIHBudl9wY2lfc2V0dXBfaW9tbXVfdGFibGUoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsCisJCQkJICAgICAgdm9pZCAqdGNlX21lbSwgdTY0IHRjZV9zaXplLAorCQkJCSAgICAgIHU2NCBkbWFfb2Zmc2V0KTsKK2V4dGVybiB2b2lkIHBudl9wY2lfaW5pdF9wNWlvYzJfaHViKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworCisKKyNlbmRpZiAvKiBfX1BPV0VSTlZfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wb3dlcm52LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcG93ZXJudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWRmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcG93ZXJudi5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX1BPV0VSTlZfSAorI2RlZmluZSBfUE9XRVJOVl9ICisKKyNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdm9pZCBwbnZfc21wX2luaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHBudl9zbXBfaW5pdCh2b2lkKSB7IH0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorZXh0ZXJuIHZvaWQgcG52X3BjaV9pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbnZfcGNpX2luaXQodm9pZCkgeyB9CisjZW5kaWYKKworI2VuZGlmIC8qIF9QT1dFUk5WX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3YmQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zZXR1cC5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogUG93ZXJOViBzZXR1cCBjb2RlLgorICoKKyAqIENvcHlyaWdodCAyMDExIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL3hpY3MuaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisjaW5jbHVkZSA8YXNtL3hpY3MuaD4KKworI2luY2x1ZGUgInBvd2VybnYuaCIKKworc3RhdGljIHZvaWQgX19pbml0IHBudl9zZXR1cF9hcmNoKHZvaWQpCit7CisJLyogSW5pdGlhbGl6ZSBTTVAgKi8KKwlwbnZfc21wX2luaXQoKTsKKworCS8qIFNldHVwIFBDSSAqLworCXBudl9wY2lfaW5pdCgpOworCisJLyogU2V0dXAgUlRDIGFuZCBOVlJBTSBjYWxsYmFja3MgKi8KKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9PUEFMKSkKKwkJb3BhbF9udnJhbV9pbml0KCk7CisKKwkvKiBFbmFibGUgTkFQIG1vZGUgKi8KKwlwb3dlcnNhdmVfbmFwID0gMTsKKworCS8qIFhYWCBQTUNTICovCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbnZfaW5pdF9lYXJseSh2b2lkKQoreworI2lmZGVmIENPTkZJR19IVkNfT1BBTAorCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUwpKQorCQlodmNfb3BhbF9pbml0X2Vhcmx5KCk7CisJZWxzZQorI2VuZGlmCisJCWFkZF9wcmVmZXJyZWRfY29uc29sZSgiaHZjIiwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbnZfaW5pdF9JUlEodm9pZCkKK3sKKwl4aWNzX2luaXQoKTsKKworCVdBUk5fT04oIXBwY19tZC5nZXRfaXJxKTsKK30KKworc3RhdGljIHZvaWQgcG52X3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc3RydWN0IGRldmljZV9ub2RlICpyb290OworCWNvbnN0IGNoYXIgKm1vZGVsID0gIiI7CisKKwlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKKwlpZiAocm9vdCkKKwkJbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7CisJc2VxX3ByaW50ZihtLCAibWFjaGluZVx0XHQ6IFBvd2VyTlYgJXNcbiIsIG1vZGVsKTsKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9PUEFMdjIpKQorCQlzZXFfcHJpbnRmKG0sICJmaXJtd2FyZVx0OiBPUEFMIHYyXG4iKTsKKwllbHNlIGlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUwpKQorCQlzZXFfcHJpbnRmKG0sICJmaXJtd2FyZVx0OiBPUEFMIHYxXG4iKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgImZpcm13YXJlXHQ6IEJNTFxuIik7CisJb2Zfbm9kZV9wdXQocm9vdCk7Cit9CisKK3N0YXRpYyB2b2lkICBfX25vcmV0dXJuIHBudl9yZXN0YXJ0KGNoYXIgKmNtZCkKK3sKKwlsb25nIHJjID0gT1BBTF9CVVNZOworCisJd2hpbGUgKHJjID09IE9QQUxfQlVTWSB8fCByYyA9PSBPUEFMX0JVU1lfRVZFTlQpIHsKKwkJcmMgPSBvcGFsX2NlY19yZWJvb3QoKTsKKwkJaWYgKHJjID09IE9QQUxfQlVTWV9FVkVOVCkKKwkJCW9wYWxfcG9sbF9ldmVudHMoTlVMTCk7CisJCWVsc2UKKwkJCW1kZWxheSgxMCk7CisJfQorCWZvciAoOzspCisJCW9wYWxfcG9sbF9ldmVudHMoTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbm9yZXR1cm4gcG52X3Bvd2VyX29mZih2b2lkKQoreworCWxvbmcgcmMgPSBPUEFMX0JVU1k7CisKKwl3aGlsZSAocmMgPT0gT1BBTF9CVVNZIHx8IHJjID09IE9QQUxfQlVTWV9FVkVOVCkgeworCQlyYyA9IG9wYWxfY2VjX3Bvd2VyX2Rvd24oMCk7CisJCWlmIChyYyA9PSBPUEFMX0JVU1lfRVZFTlQpCisJCQlvcGFsX3BvbGxfZXZlbnRzKE5VTEwpOworCQllbHNlCisJCQltZGVsYXkoMTApOworCX0KKwlmb3IgKDs7KQorCQlvcGFsX3BvbGxfZXZlbnRzKE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBfX25vcmV0dXJuIHBudl9oYWx0KHZvaWQpCit7CisJcG52X3Bvd2VyX29mZigpOworfQorCitzdGF0aWMgdm9pZCBwbnZfcHJvZ3Jlc3MoY2hhciAqcywgdW5zaWduZWQgc2hvcnQgaGV4KQoreworfQorCisjaWZkZWYgQ09ORklHX0tFWEVDCitzdGF0aWMgdm9pZCBwbnZfa2V4ZWNfY3B1X2Rvd24oaW50IGNyYXNoX3NodXRkb3duLCBpbnQgc2Vjb25kYXJ5KQoreworCXhpY3Nfa2V4ZWNfdGVhcmRvd25fY3B1KHNlY29uZGFyeSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0tFWEVDICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbnZfc2V0dXBfbWFjaGRlcF9vcGFsKHZvaWQpCit7CisJcHBjX21kLmdldF9ib290X3RpbWUgPSBvcGFsX2dldF9ib290X3RpbWU7CisJcHBjX21kLmdldF9ydGNfdGltZSA9IG9wYWxfZ2V0X3J0Y190aW1lOworCXBwY19tZC5zZXRfcnRjX3RpbWUgPSBvcGFsX3NldF9ydGNfdGltZTsKKwlwcGNfbWQucmVzdGFydCA9IHBudl9yZXN0YXJ0OworCXBwY19tZC5wb3dlcl9vZmYgPSBwbnZfcG93ZXJfb2ZmOworCXBwY19tZC5oYWx0ID0gcG52X2hhbHQ7CisJcHBjX21kLm1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uID0gb3BhbF9tYWNoaW5lX2NoZWNrOworfQorCisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WX1JUQVMKK3N0YXRpYyB2b2lkIF9faW5pdCBwbnZfc2V0dXBfbWFjaGRlcF9ydGFzKHZvaWQpCit7CisJaWYgKHJ0YXNfdG9rZW4oImdldC10aW1lLW9mLWRheSIpICE9IFJUQVNfVU5LTk9XTl9TRVJWSUNFKSB7CisJCXBwY19tZC5nZXRfYm9vdF90aW1lID0gcnRhc19nZXRfYm9vdF90aW1lOworCQlwcGNfbWQuZ2V0X3J0Y190aW1lID0gcnRhc19nZXRfcnRjX3RpbWU7CisJCXBwY19tZC5zZXRfcnRjX3RpbWUgPSBydGFzX3NldF9ydGNfdGltZTsKKwl9CisJcHBjX21kLnJlc3RhcnQgPSBydGFzX3Jlc3RhcnQ7CisJcHBjX21kLnBvd2VyX29mZiA9IHJ0YXNfcG93ZXJfb2ZmOworCXBwY19tZC5oYWx0ID0gcnRhc19oYWx0OworfQorI2VuZGlmIC8qIENPTkZJR19QUENfUE9XRVJOVl9SVEFTICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBudl9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKworCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJpYm0scG93ZXJudiIpKQorCQlyZXR1cm4gMDsKKworCWhwdGVfaW5pdF9uYXRpdmUoKTsKKworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUwpKQorCQlwbnZfc2V0dXBfbWFjaGRlcF9vcGFsKCk7CisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WX1JUQVMKKwllbHNlIGlmIChydGFzLmJhc2UpCisJCXBudl9zZXR1cF9tYWNoZGVwX3J0YXMoKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BPV0VSTlZfUlRBUyAqLworCisJcHJfZGVidWcoIlBvd2VyTlYgZGV0ZWN0ZWQgIVxuIik7CisKKwlyZXR1cm4gMTsKK30KKworZGVmaW5lX21hY2hpbmUocG93ZXJudikgeworCS5uYW1lCQkJPSAiUG93ZXJOViIsCisJLnByb2JlCQkJPSBwbnZfcHJvYmUsCisJLmluaXRfZWFybHkJCT0gcG52X2luaXRfZWFybHksCisJLnNldHVwX2FyY2gJCT0gcG52X3NldHVwX2FyY2gsCisJLmluaXRfSVJRCQk9IHBudl9pbml0X0lSUSwKKwkuc2hvd19jcHVpbmZvCQk9IHBudl9zaG93X2NwdWluZm8sCisJLnByb2dyZXNzCQk9IHBudl9wcm9ncmVzcywKKwkucG93ZXJfc2F2ZSAgICAgICAgICAgICA9IHBvd2VyN19pZGxlLAorCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorI2lmZGVmIENPTkZJR19LRVhFQworCS5rZXhlY19jcHVfZG93bgkJPSBwbnZfa2V4ZWNfY3B1X2Rvd24sCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NzM2NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zbXAuYwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIFNNUCBzdXBwb3J0IGZvciBQb3dlck5WIG1hY2hpbmVzLgorICoKKyAqIENvcHlyaWdodCAyMDExIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL3BhY2EuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgorI2luY2x1ZGUgPGFzbS92ZHNvX2RhdGFwYWdlLmg+CisjaW5jbHVkZSA8YXNtL2NwdXRocmVhZHMuaD4KKyNpbmNsdWRlIDxhc20veGljcy5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisKKyNpbmNsdWRlICJwb3dlcm52LmgiCisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pCisjZW5kaWYKKworc3RhdGljIHZvaWQgX19jcHVpbml0IHBudl9zbXBfc2V0dXBfY3B1KGludCBjcHUpCit7CisJaWYgKGNwdSAhPSBib290X2NwdWlkKQorCQl4aWNzX3NldHVwX2NwdSgpOworfQorCitzdGF0aWMgaW50IHBudl9zbXBfY3B1X2Jvb3RhYmxlKHVuc2lnbmVkIGludCBucikKK3sKKwkvKiBTcGVjaWFsIGNhc2UgLSB3ZSBpbmhpYml0IHNlY29uZGFyeSB0aHJlYWQgc3RhcnR1cAorCSAqIGR1cmluZyBib290IGlmIHRoZSB1c2VyIHJlcXVlc3RzIGl0LgorCSAqLworCWlmIChzeXN0ZW1fc3RhdGUgPCBTWVNURU1fUlVOTklORyAmJiBjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKSB7CisJCWlmICghc210X2VuYWJsZWRfYXRfYm9vdCAmJiBjcHVfdGhyZWFkX2luX2NvcmUobnIpICE9IDApCisJCQlyZXR1cm4gMDsKKwkJaWYgKHNtdF9lbmFibGVkX2F0X2Jvb3QKKwkJICAgICYmIGNwdV90aHJlYWRfaW5fY29yZShucikgPj0gc210X2VuYWJsZWRfYXRfYm9vdCkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgX19kZXZpbml0IHBudl9zbXBfa2lja19jcHUoaW50IG5yKQoreworCXVuc2lnbmVkIGludCBwY3B1ID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChucik7CisJdW5zaWduZWQgbG9uZyBzdGFydF9oZXJlID0gX19wYSgqKCh1bnNpZ25lZCBsb25nICopCisJCQkJCSAgZ2VuZXJpY19zZWNvbmRhcnlfc21wX2luaXQpKTsKKwlsb25nIHJjOworCisJQlVHX09OKG5yIDwgMCB8fCBuciA+PSBOUl9DUFVTKTsKKworCS8qIE9uIE9QQUwgdjIgdGhlIENQVSBhcmUgc3RpbGwgc3Bpbm5pbmcgaW5zaWRlIE9QQUwgaXRzZWxmLAorCSAqIGdldCB0aGVtIGJhY2sgbm93CisJICovCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTHYyKSkgeworCQlwcl9kZXZlbCgiT1BBTDogU3RhcnRpbmcgQ1BVICVkIChIVyAweCV4KS4uLlxuIiwgbnIsIHBjcHUpOworCQlyYyA9IG9wYWxfc3RhcnRfY3B1KHBjcHUsIHN0YXJ0X2hlcmUpOworCQlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKQorCQkJcHJfd2FybigiT1BBTCBFcnJvciAlbGQgc3RhcnRpbmcgQ1BVICVkXG4iLAorCQkJCXJjLCBucik7CisJfQorCXJldHVybiBzbXBfZ2VuZXJpY19raWNrX2NwdShucik7Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworc3RhdGljIGludCBwbnZfc21wX2NwdV9kaXNhYmxlKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHBTZXJpZXMuLi4gbWlnaHQgY29uc29saWRhdGUgYnkKKwkgKiBtb3ZpbmcgbWlncmF0ZV9pcnFzX2F3YXkgdG8gYSBwcGNfbWQgd2l0aCBkZWZhdWx0IHRvCisJICogdGhlIGdlbmVyaWMgZml4dXBfaXJxcy4gLS1CZW5ILgorCSAqLworCXNldF9jcHVfb25saW5lKGNwdSwgZmFsc2UpOworCXZkc29fZGF0YS0+cHJvY2Vzc29yQ291bnQtLTsKKwlpZiAoY3B1ID09IGJvb3RfY3B1aWQpCisJCWJvb3RfY3B1aWQgPSBjcHVtYXNrX2FueShjcHVfb25saW5lX21hc2spOworCXhpY3NfbWlncmF0ZV9pcnFzX2F3YXkoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG52X3NtcF9jcHVfa2lsbF9zZWxmKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKworCS8qIElmIHBvd2Vyc2F2ZV9uYXAgaXMgZW5hYmxlZCwgdXNlIE5BUCBtb2RlLCBlbHNlIGp1c3QKKwkgKiBzcGluIGFpbWxlc3NseQorCSAqLworCWlmICghcG93ZXJzYXZlX25hcCkgeworCQlnZW5lcmljX21hY2hfY3B1X2RpZSgpOworCQlyZXR1cm47CisJfQorCisJLyogU3RhbmRhcmQgaG90IHVucGx1ZyBwcm9jZWR1cmUgKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWlkbGVfdGFza19leGl0KCk7CisJY3VycmVudC0+YWN0aXZlX21tID0gTlVMTDsgLyogZm9yIHNhbml0eSAqLworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlEQkcoIkNQVSVkIG9mZmxpbmVcbiIsIGNwdSk7CisJZ2VuZXJpY19zZXRfY3B1X2RlYWQoY3B1KTsKKwlzbXBfd21iKCk7CisKKwkvKiBXZSBkb24ndCB3YW50IHRvIHRha2UgZGVjcmVtZW50ZXIgaW50ZXJydXB0cyB3aGlsZSB3ZSBhcmUgb2ZmbGluZSwKKwkgKiBzbyBjbGVhciBMUENSOlBFQ0UxLiBXZSBrZWVwIFBFQ0UyIGVuYWJsZWQuCisJICovCisJbXRzcHIoU1BSTl9MUENSLCBtZnNwcihTUFJOX0xQQ1IpICYgfih1NjQpTFBDUl9QRUNFMSk7CisJd2hpbGUgKCFnZW5lcmljX2NoZWNrX2NwdV9yZXN0YXJ0KGNwdSkpIHsKKwkJcG93ZXI3X2lkbGUoKTsKKwkJaWYgKCFnZW5lcmljX2NoZWNrX2NwdV9yZXN0YXJ0KGNwdSkpIHsKKwkJCURCRygiQ1BVJWQgVW5leHBlY3RlZCBleGl0IHdoaWxlIG9mZmxpbmUgIVxuIiwgY3B1KTsKKwkJCS8qIFdlIG1heSBiZSBnZXR0aW5nIGFuIElQSSwgc28gd2UgcmUtZW5hYmxlCisJCQkgKiBpbnRlcnJ1cHRzIHRvIHByb2Nlc3MgaXQsIGl0IHdpbGwgYmUgaWdub3JlZAorCQkJICogc2luY2Ugd2UgYXJlbid0IG9ubGluZSAoaG9wZWZ1bGx5KQorCQkJICovCisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQl9CisJfQorCW10c3ByKFNQUk5fTFBDUiwgbWZzcHIoU1BSTl9MUENSKSB8IExQQ1JfUEVDRTEpOworCURCRygiQ1BVJWQgY29taW5nIG9ubGluZS4uLlxuIiwgY3B1KTsKK30KKworI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCitzdGF0aWMgc3RydWN0IHNtcF9vcHNfdCBwbnZfc21wX29wcyA9IHsKKwkubWVzc2FnZV9wYXNzCT0gc21wX211eGVkX2lwaV9tZXNzYWdlX3Bhc3MsCisJLmNhdXNlX2lwaQk9IE5VTEwsCS8qIEZpbGxlZCBhdCBydW50aW1lIGJ5IHhpY3Nfc21wX3Byb2JlKCkgKi8KKwkucHJvYmUJCT0geGljc19zbXBfcHJvYmUsCisJLmtpY2tfY3B1CT0gcG52X3NtcF9raWNrX2NwdSwKKwkuc2V0dXBfY3B1CT0gcG52X3NtcF9zZXR1cF9jcHUsCisJLmNwdV9ib290YWJsZQk9IHBudl9zbXBfY3B1X2Jvb3RhYmxlLAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCS5jcHVfZGlzYWJsZQk9IHBudl9zbXBfY3B1X2Rpc2FibGUsCisJLmNwdV9kaWUJPSBnZW5lcmljX2NwdV9kaWUsCisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCit9OworCisvKiBUaGlzIGlzIGNhbGxlZCB2ZXJ5IGVhcmx5IGR1cmluZyBwbGF0Zm9ybSBzZXR1cF9hcmNoICovCit2b2lkIF9faW5pdCBwbnZfc21wX2luaXQodm9pZCkKK3sKKwlzbXBfb3BzID0gJnBudl9zbXBfb3BzOworCisJLyogWFhYIFdlIGRvbid0IHlldCBoYXZlIGEgcHJvcGVyIGVudHJ5IHBvaW50IGZyb20gSEFMLCBmb3IKKwkgKiBub3cgd2UgcmVseSBvbiBrZXhlYy1zdHlsZSBlbnRyeSBmcm9tIEJNTAorCSAqLworCisjaWZkZWYgQ09ORklHX1BQQ19SVEFTCisJLyogTm9uLWxwYXIgaGFzIGFkZGl0aW9uYWwgdGFrZS9naXZlIHRpbWViYXNlICovCisJaWYgKHJ0YXNfdG9rZW4oImZyZWV6ZS10aW1lLWJhc2UiKSAhPSBSVEFTX1VOS05PV05fU0VSVklDRSkgeworCQlzbXBfb3BzLT5naXZlX3RpbWViYXNlID0gcnRhc19naXZlX3RpbWViYXNlOworCQlzbXBfb3BzLT50YWtlX3RpbWViYXNlID0gcnRhc190YWtlX3RpbWViYXNlOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1JUQVMgKi8KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCXBwY19tZC5jcHVfZGllCT0gcG52X3NtcF9jcHVfa2lsbF9zZWxmOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3ByZXAvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHJlcC9LY29uZmlnCmluZGV4IGYwNTM2YzcuLjE1NDdmNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHJlcC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHJlcC9LY29uZmlnCkBAIC0yMSwxMiArMjEsMyBAQAogCSAgb3IgcGFzcyB0aGUgJ25vcmVzaWR1YWwnIG9wdGlvbiB0byB0aGUga2VybmVsLgogCiAJICBJZiB5b3UgYXJlIHJ1bm5pbmcgYSBQUmVQIHN5c3RlbSwgc2F5IFkgaGVyZSwgb3RoZXJ3aXNlIHNheSBOLgotCi1jb25maWcgUFJPQ19QUkVQUkVTSURVQUwKLQlib29sICJTdXBwb3J0IGZvciByZWFkaW5nIG9mIFBSZVAgUmVzaWR1YWwgRGF0YSBpbiAvcHJvYyIKLQlkZXBlbmRzIG9uIFBSRVBfUkVTSURVQUwgJiYgUFJPQ19GUwotCWhlbHAKLQkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgY3JlYXRlIGEgL3Byb2MvcmVzaWR1YWwgZmlsZSB3aGljaCBhbGxvd3MKLQkgIHlvdSB0byBnZXQgYXQgdGhlIHJlc2lkdWFsIGRhdGEgb24gUFJlUCBzeXN0ZW1zLiAgWW91IHdpbGwgbmVlZCBhIHRvb2wKLQkgIChsc3Jlc2lkdWFsKSB0byBwYXJzZSBpdC4gIElmIHlvdSBhcmVuJ3Qgb24gYSBQUmVQIHN5c3RlbSwgeW91IGRvbid0Ci0JICB3YW50IHRoaXMuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZwppbmRleCBkZmUzMTZiLi40NzZkOWQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKQEAgLTE0OCw0ICsxNDgsMTYgQEAKIAkgIHByb2ZpbGluZyBzdXBwb3J0IG9mIHRoZSBDZWxsIHByb2Nlc3NvciB3aXRoIHByb2dyYW1zIGxpa2UKIAkgIG9wcm9maWxlIGFuZCBwZXJmbW9uMiwgdGhlbiBzYXkgWSBvciBNLCBvdGhlcndpc2Ugc2F5IE4uCiAKK2NvbmZpZyBQUzNHRUxJQ19VREJHCisJYm9vbCAiUFMzIHVkYmcgb3V0cHV0IHZpYSBVRFAgYnJvYWRjYXN0cyBvbiBFdGhlcm5ldCIKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKwloZWxwCisJICBFbmFibGVzIHVkYmcgZWFybHkgZGVidWdnaW5nIG91dHB1dCBieSBzZW5kaW5nIGJyb2FkY2FzdCBVRFAKKwkgIHZpYSB0aGUgRXRoZXJuZXQgcG9ydCAoVURQIHBvcnQgbnVtYmVyIDE4MTk0KS4KKworCSAgVGhpcyBkcml2ZXIgdXNlcyBhIHRyaXZpYWwgaW1wbGVtZW50YXRpb24gYW5kIGlzIGluZGVwZW5kZW50CisJICBmcm9tIHRoZSBtYWluIG5ldHdvcmsgZHJpdmVyLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZQppbmRleCBhYzFiZGY4Li4wMmI5ZTYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZQpAQCAtMiw2ICsyLDcgQEAKIG9iai15ICs9IGludGVycnVwdC5vIGV4cG9ydHMubyBvcy1hcmVhLm8KIG9iai15ICs9IHN5c3RlbS1idXMubwogCitvYmotJChDT05GSUdfUFMzR0VMSUNfVURCRykgKz0gZ2VsaWNfdWRiZy5vCiBvYmotJChDT05GSUdfU01QKSArPSBzbXAubwogb2JqLSQoQ09ORklHX1NQVV9CQVNFKSArPSBzcHUubwogb2JqLXkgKz0gZGV2aWNlLWluaXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKaW5kZXggNmM0YjU4My4uM2YxNzVlOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jCkBAIC04MjUsNyArODI1LDcgQEAKIAogCXNwaW5fbG9ja19pbml0KCZkZXYubG9jayk7CiAKLQlyZXMgPSByZXF1ZXN0X2lycShpcnEsIHBzM19ub3RpZmljYXRpb25faW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCXJlcyA9IHJlcXVlc3RfaXJxKGlycSwgcHMzX25vdGlmaWNhdGlvbl9pbnRlcnJ1cHQsIDAsCiAJCQkgICJwczNfbm90aWZpY2F0aW9uIiwgJmRldik7CiAJaWYgKHJlcykgewogCQlwcl9lcnIoIiVzOiV1OiByZXF1ZXN0X2lycSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2V4cG9ydHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2V4cG9ydHMuYwppbmRleCBhN2U4ZmZkLi43ZGY1YjdkOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZXhwb3J0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2V4cG9ydHMuYwpAQCAtMTgsOCArMTgsNiBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNkZWZpbmUgTFYxX0NBTEwobmFtZSwgaW4sIG91dCwgbnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBleHRlcm4gczY0IF9sdjFfIyNuYW1lKExWMV8jI2luIyNfSU5fIyNvdXQjI19PVVRfQVJHX0RFQ0wpOyBcCiAgIEVYUE9SVF9TWU1CT0woX2x2MV8jI25hbWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZ2VsaWNfdWRiZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZ2VsaWNfdWRiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjQ2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9nZWxpY191ZGJnLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiB1ZGJnIGRlYnVnIG91dHB1dCByb3V0aW5lIHZpYSBHRUxJQyBVRFAgYnJvYWRjYXN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDcgU29ueSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDEwIEhlY3RvciBNYXJ0aW4gPGhlY3RvckBtYXJjYW5zb2Z0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZSBIZWlkZXIgPGEuaGVpZGVyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorCisjZGVmaW5lIEdFTElDX0JVU19JRCAxCisjZGVmaW5lIEdFTElDX0RFVklDRV9JRCAwCisjZGVmaW5lIEdFTElDX0RFQlVHX1BPUlQgMTgxOTQKKyNkZWZpbmUgR0VMSUNfTUFYX01FU1NBR0VfU0laRSAxMDAwCisKKyNkZWZpbmUgR0VMSUNfTFYxX0dFVF9NQUNfQUREUkVTUyAxCisjZGVmaW5lIEdFTElDX0xWMV9HRVRfVkxBTl9JRCA0CisjZGVmaW5lIEdFTElDX0xWMV9WTEFOX1RYX0VUSEVSTkVUXzAgMgorCisjZGVmaW5lIEdFTElDX0RFU0NSX0RNQV9TVEFUX01BU0sgMHhmMDAwMDAwMAorI2RlZmluZSBHRUxJQ19ERVNDUl9ETUFfQ0FSRE9XTkVEIDB4YTAwMDAwMDAKKworI2RlZmluZSBHRUxJQ19ERVNDUl9UWF9ETUFfSUtFIDB4MDAwODAwMDAKKyNkZWZpbmUgR0VMSUNfREVTQ1JfVFhfRE1BX05PX0NIS1NVTSAweDAwMDAwMDAwCisjZGVmaW5lIEdFTElDX0RFU0NSX1RYX0RNQV9GUkFNRV9UQUlMIDB4MDAwNDAwMDAKKworI2RlZmluZSBHRUxJQ19ERVNDUl9ETUFfQ01EX05PX0NIS1NVTSAoR0VMSUNfREVTQ1JfRE1BX0NBUkRPV05FRCB8IFwKKwkJCQkgICAgICAgR0VMSUNfREVTQ1JfVFhfRE1BX0lLRSB8IFwKKwkJCQkgICAgICAgR0VMSUNfREVTQ1JfVFhfRE1BX05PX0NIS1NVTSkKKworc3RhdGljIHU2NCBidXNfYWRkcjsKKworc3RydWN0IGdlbGljX2Rlc2NyIHsKKwkvKiBhcyBkZWZpbmVkIGJ5IHRoZSBoYXJkd2FyZSAqLworCV9fYmUzMiBidWZfYWRkcjsKKwlfX2JlMzIgYnVmX3NpemU7CisJX19iZTMyIG5leHRfZGVzY3JfYWRkcjsKKwlfX2JlMzIgZG1hY19jbWRfc3RhdHVzOworCV9fYmUzMiByZXN1bHRfc2l6ZTsKKwlfX2JlMzIgdmFsaWRfc2l6ZTsJLyogYWxsIHplcm9lcyBmb3IgdHggKi8KKwlfX2JlMzIgZGF0YV9zdGF0dXM7CisJX19iZTMyIGRhdGFfZXJyb3I7CS8qIGFsbCB6ZXJvZXMgZm9yIHR4ICovCit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisKK3N0cnVjdCBkZWJ1Z19ibG9jayB7CisJc3RydWN0IGdlbGljX2Rlc2NyIGRlc2NyOworCXU4IHBrdFsxNTIwXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBldGhoZHIgeworCXU4IGRlc3RbNl07CisJdTggc3JjWzZdOworCXUxNiB0eXBlOworfSBfX3BhY2tlZDsKKworc3RydWN0IHZsYW50YWcgeworCXUxNiB2bGFuOworCXUxNiBzdWJ0eXBlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlwaGRyIHsKKwl1OCB2ZXJfbGVuOworCXU4IGRzY3BfZWNuOworCXUxNiB0b3RhbF9sZW5ndGg7CisJdTE2IGlkZW50OworCXUxNiBmcmFnX29mZl9mbGFnczsKKwl1OCB0dGw7CisJdTggcHJvdG87CisJdTE2IGNoZWNrc3VtOworCXUzMiBzcmM7CisJdTMyIGRlc3Q7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgdWRwaGRyIHsKKwl1MTYgc3JjOworCXUxNiBkZXN0OworCXUxNiBsZW47CisJdTE2IGNoZWNrc3VtOworfSBfX3BhY2tlZDsKKworc3RhdGljIF9faW9tZW0gc3RydWN0IGV0aGhkciAqaF9ldGg7CitzdGF0aWMgX19pb21lbSBzdHJ1Y3QgdmxhbnRhZyAqaF92bGFuOworc3RhdGljIF9faW9tZW0gc3RydWN0IGlwaGRyICpoX2lwOworc3RhdGljIF9faW9tZW0gc3RydWN0IHVkcGhkciAqaF91ZHA7CisKK3N0YXRpYyBfX2lvbWVtIGNoYXIgKnBtc2c7CitzdGF0aWMgX19pb21lbSBjaGFyICpwbXNnYzsKKworc3RhdGljIF9faW9tZW0gc3RydWN0IGRlYnVnX2Jsb2NrIGRiZyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCitzdGF0aWMgaW50IGhlYWRlcl9zaXplOworCitzdGF0aWMgdm9pZCBtYXBfZG1hX21lbShpbnQgYnVzX2lkLCBpbnQgZGV2X2lkLCB2b2lkICpzdGFydCwgc2l6ZV90IGxlbiwKKwkJCXU2NCAqcmVhbF9idXNfYWRkcikKK3sKKwlzNjQgcmVzdWx0OworCXU2NCByZWFsX2FkZHIgPSAoKHU2NClzdGFydCkgJiAweDBmZmZmZmZmZmZmZmZmZmZVTDsKKwl1NjQgcmVhbF9lbmQgPSByZWFsX2FkZHIgKyBsZW47CisJdTY0IG1hcF9zdGFydCA9IHJlYWxfYWRkciAmIH4weGZmZjsKKwl1NjQgbWFwX2VuZCA9IChyZWFsX2VuZCArIDB4ZmZmKSAmIH4weGZmZjsKKwl1NjQgYnVzX2FkZHIgPSAwOworCisJdTY0IGZsYWdzID0gMHhmODAwMDAwMDAwMDAwMDAwVUw7CisKKwlyZXN1bHQgPSBsdjFfYWxsb2NhdGVfZGV2aWNlX2RtYV9yZWdpb24oYnVzX2lkLCBkZXZfaWQsCisJCQkJCQltYXBfZW5kIC0gbWFwX3N0YXJ0LCAxMiwgMCwKKwkJCQkJCSZidXNfYWRkcik7CisJaWYgKHJlc3VsdCkKKwkJbHYxX3BhbmljKDApOworCisJcmVzdWx0ID0gbHYxX21hcF9kZXZpY2VfZG1hX3JlZ2lvbihidXNfaWQsIGRldl9pZCwgbWFwX3N0YXJ0LAorCQkJCQkgICBidXNfYWRkciwgbWFwX2VuZCAtIG1hcF9zdGFydCwKKwkJCQkJICAgZmxhZ3MpOworCWlmIChyZXN1bHQpCisJCWx2MV9wYW5pYygwKTsKKworCSpyZWFsX2J1c19hZGRyID0gYnVzX2FkZHIgKyByZWFsX2FkZHIgLSBtYXBfc3RhcnQ7Cit9CisKK3N0YXRpYyBpbnQgdW5tYXBfZG1hX21lbShpbnQgYnVzX2lkLCBpbnQgZGV2X2lkLCB1NjQgYnVzX2FkZHIsIHNpemVfdCBsZW4pCit7CisJczY0IHJlc3VsdDsKKwl1NjQgcmVhbF9idXNfYWRkcjsKKworCXJlYWxfYnVzX2FkZHIgPSBidXNfYWRkciAmIH4weGZmZjsKKwlsZW4gKz0gYnVzX2FkZHIgLSByZWFsX2J1c19hZGRyOworCWxlbiA9IChsZW4gKyAweGZmZikgJiB+MHhmZmY7CisKKwlyZXN1bHQgPSBsdjFfdW5tYXBfZGV2aWNlX2RtYV9yZWdpb24oYnVzX2lkLCBkZXZfaWQsIHJlYWxfYnVzX2FkZHIsCisJCQkJCSAgICAgbGVuKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJcmV0dXJuIGx2MV9mcmVlX2RldmljZV9kbWFfcmVnaW9uKGJ1c19pZCwgZGV2X2lkLCByZWFsX2J1c19hZGRyKTsKK30KKworc3RhdGljIHZvaWQgZ2VsaWNfZGVidWdfaW5pdCh2b2lkKQoreworCXM2NCByZXN1bHQ7CisJdTY0IHYyOworCXU2NCBtYWM7CisJdTY0IHZsYW5faWQ7CisKKwlyZXN1bHQgPSBsdjFfb3Blbl9kZXZpY2UoR0VMSUNfQlVTX0lELCBHRUxJQ19ERVZJQ0VfSUQsIDApOworCWlmIChyZXN1bHQpCisJCWx2MV9wYW5pYygwKTsKKworCW1hcF9kbWFfbWVtKEdFTElDX0JVU19JRCwgR0VMSUNfREVWSUNFX0lELCAmZGJnLCBzaXplb2YoZGJnKSwKKwkJICAgICZidXNfYWRkcik7CisKKwltZW1zZXQoJmRiZywgMCwgc2l6ZW9mKGRiZykpOworCisJZGJnLmRlc2NyLmJ1Zl9hZGRyID0gYnVzX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgZGVidWdfYmxvY2ssIHBrdCk7CisKKwl3bWIoKTsKKworCXJlc3VsdCA9IGx2MV9uZXRfY29udHJvbChHRUxJQ19CVVNfSUQsIEdFTElDX0RFVklDRV9JRCwKKwkJCQkgR0VMSUNfTFYxX0dFVF9NQUNfQUREUkVTUywgMCwgMCwgMCwKKwkJCQkgJm1hYywgJnYyKTsKKwlpZiAocmVzdWx0KQorCQlsdjFfcGFuaWMoMCk7CisKKwltYWMgPDw9IDE2OworCisJaF9ldGggPSAoc3RydWN0IGV0aGhkciAqKWRiZy5wa3Q7CisKKwltZW1zZXQoJmhfZXRoLT5kZXN0LCAweGZmLCA2KTsKKwltZW1jcHkoJmhfZXRoLT5zcmMsICZtYWMsIDYpOworCisJaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IGV0aGhkcik7CisKKwlyZXN1bHQgPSBsdjFfbmV0X2NvbnRyb2woR0VMSUNfQlVTX0lELCBHRUxJQ19ERVZJQ0VfSUQsCisJCQkJIEdFTElDX0xWMV9HRVRfVkxBTl9JRCwKKwkJCQkgR0VMSUNfTFYxX1ZMQU5fVFhfRVRIRVJORVRfMCwgMCwgMCwKKwkJCQkgJnZsYW5faWQsICZ2Mik7CisJaWYgKCFyZXN1bHQpIHsKKwkJaF9ldGgtPnR5cGUgPSAweDgxMDA7CisKKwkJaGVhZGVyX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCB2bGFudGFnKTsKKwkJaF92bGFuID0gKHN0cnVjdCB2bGFudGFnICopKGhfZXRoICsgMSk7CisJCWhfdmxhbi0+dmxhbiA9IHZsYW5faWQ7CisJCWhfdmxhbi0+c3VidHlwZSA9IDB4MDgwMDsKKwkJaF9pcCA9IChzdHJ1Y3QgaXBoZHIgKikoaF92bGFuICsgMSk7CisJfSBlbHNlIHsKKwkJaF9ldGgtPnR5cGUgPSAweDA4MDA7CisJCWhfaXAgPSAoc3RydWN0IGlwaGRyICopKGhfZXRoICsgMSk7CisJfQorCisJaGVhZGVyX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJaF9pcC0+dmVyX2xlbiA9IDB4NDU7CisJaF9pcC0+dHRsID0gMTA7CisJaF9pcC0+cHJvdG8gPSAweDExOworCWhfaXAtPnNyYyA9IDB4MDAwMDAwMDA7CisJaF9pcC0+ZGVzdCA9IDB4ZmZmZmZmZmY7CisKKwloZWFkZXJfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJaF91ZHAgPSAoc3RydWN0IHVkcGhkciAqKShoX2lwICsgMSk7CisJaF91ZHAtPnNyYyA9IEdFTElDX0RFQlVHX1BPUlQ7CisJaF91ZHAtPmRlc3QgPSBHRUxJQ19ERUJVR19QT1JUOworCisJcG1zZ2MgPSBwbXNnID0gKGNoYXIgKikoaF91ZHAgKyAxKTsKK30KKworc3RhdGljIHZvaWQgZ2VsaWNfZGVidWdfc2h1dGRvd24odm9pZCkKK3sKKwlpZiAoYnVzX2FkZHIpCisJCXVubWFwX2RtYV9tZW0oR0VMSUNfQlVTX0lELCBHRUxJQ19ERVZJQ0VfSUQsCisJCQkgICAgICBidXNfYWRkciwgc2l6ZW9mKGRiZykpOworCWx2MV9jbG9zZV9kZXZpY2UoR0VMSUNfQlVTX0lELCBHRUxJQ19ERVZJQ0VfSUQpOworfQorCitzdGF0aWMgdm9pZCBnZWxpY19zZW5kYnVmKGludCBtc2dzaXplKQoreworCXUxNiAqcDsKKwl1MzIgc3VtOworCWludCBpOworCisJZGJnLmRlc2NyLmJ1Zl9zaXplID0gaGVhZGVyX3NpemUgKyBtc2dzaXplOworCWhfaXAtPnRvdGFsX2xlbmd0aCA9IG1zZ3NpemUgKyBzaXplb2Yoc3RydWN0IHVkcGhkcikgKworCQkJICAgICBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwloX3VkcC0+bGVuID0gbXNnc2l6ZSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKworCWhfaXAtPmNoZWNrc3VtID0gMDsKKwlzdW0gPSAwOworCXAgPSAodTE2ICopaF9pcDsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlzdW0gKz0gKnArKzsKKwloX2lwLT5jaGVja3N1bSA9IH4oc3VtICsgKHN1bSA+PiAxNikpOworCisJZGJnLmRlc2NyLmRtYWNfY21kX3N0YXR1cyA9IEdFTElDX0RFU0NSX0RNQV9DTURfTk9fQ0hLU1VNIHwKKwkJCQkgICAgR0VMSUNfREVTQ1JfVFhfRE1BX0ZSQU1FX1RBSUw7CisJZGJnLmRlc2NyLnJlc3VsdF9zaXplID0gMDsKKwlkYmcuZGVzY3IuZGF0YV9zdGF0dXMgPSAwOworCisJd21iKCk7CisKKwlsdjFfbmV0X3N0YXJ0X3R4X2RtYShHRUxJQ19CVVNfSUQsIEdFTElDX0RFVklDRV9JRCwgYnVzX2FkZHIsIDApOworCisJd2hpbGUgKChkYmcuZGVzY3IuZG1hY19jbWRfc3RhdHVzICYgR0VMSUNfREVTQ1JfRE1BX1NUQVRfTUFTSykgPT0KKwkgICAgICAgR0VMSUNfREVTQ1JfRE1BX0NBUkRPV05FRCkKKwkJY3B1X3JlbGF4KCk7Cit9CisKK3N0YXRpYyB2b2lkIHBzM2dlbGljX3VkYmdfcHV0YyhjaGFyIGNoKQoreworCSpwbXNnYysrID0gY2g7CisJaWYgKGNoID09ICdcbicgfHwgKHBtc2djLXBtc2cpID49IEdFTElDX01BWF9NRVNTQUdFX1NJWkUpIHsKKwkJZ2VsaWNfc2VuZGJ1ZihwbXNnYy1wbXNnKTsKKwkJcG1zZ2MgPSBwbXNnOworCX0KK30KKwordm9pZCBfX2luaXQgdWRiZ19pbml0X3BzM2dlbGljKHZvaWQpCit7CisJZ2VsaWNfZGVidWdfaW5pdCgpOworCXVkYmdfcHV0YyA9IHBzM2dlbGljX3VkYmdfcHV0YzsKK30KKwordm9pZCB1ZGJnX3NodXRkb3duX3BzM2dlbGljKHZvaWQpCit7CisJdWRiZ19wdXRjID0gTlVMTDsKKwlnZWxpY19kZWJ1Z19zaHV0ZG93bigpOworfQorRVhQT1JUX1NZTUJPTCh1ZGJnX3NodXRkb3duX3BzM2dlbGljKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMKaW5kZXggNjAwZWQyYy4uNDA0YmM1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKaW5kZXggYzIwNDU4OC4uNzI3MTRhZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKaW5kZXggNWI3NTliNi4uNTZkMjZiYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYwppbmRleCA1ZTMwNGMyLi5jYTQwZjZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAllbnVtIHBzM19idXNfdHlwZSAqYnVzX3R5cGUpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCkBAIC0xOTksNyArMTk5LDcgQEAKIAl1bnNpZ25lZCBpbnQgKm51bV9kZXYpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCkBAIC0yMzksNyArMjM5LDcgQEAKIAl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCBlbnVtIHBzM19kZXZfdHlwZSAqZGV2X3R5cGUpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCkBAIC0yNTYsOCArMjU2LDggQEAKIAllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSAqaW50cl90eXBlLCB1bnNpZ25lZCBpbnQgKmludGVycnVwdF9pZCkKIHsKIAlpbnQgcmVzdWx0OwotCXU2NCB2MTsKLQl1NjQgdjI7CisJdTY0IHYxID0gMDsKKwl1NjQgdjIgPSAwOwogCiAJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKIAkJbWFrZV9maXJzdF9maWVsZCgiYnVzIiwgYnVzX2luZGV4KSwKQEAgLTI3NSw3ICsyNzUsNyBAQAogCWVudW0gcHMzX3JlZ190eXBlICpyZWdfdHlwZSkKIHsKIAlpbnQgcmVzdWx0OwotCXU2NCB2MTsKKwl1NjQgdjEgPSAwOwogCiAJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKIAkJbWFrZV9maXJzdF9maWVsZCgiYnVzIiwgYnVzX2luZGV4KSwKQEAgLTYxNSw3ICs2MTUsNyBAQAogCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIHVuc2lnbmVkIGludCAqbnVtX3JlZ2lvbnMpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCkBAIC02MzEsNyArNjMxLDcgQEAKIAl1bnNpZ25lZCBpbnQgKnJlZ2lvbl9pZCkKIHsKIAlpbnQgcmVzdWx0OwotCXU2NCB2MTsKKwl1NjQgdjEgPSAwOwogCiAJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKIAkgICAgbWFrZV9maXJzdF9maWVsZCgiYnVzIiwgYnVzX2luZGV4KSwKQEAgLTc4Niw3ICs3ODYsNyBAQAogaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfbnVtX3NwdV9yZXNlcnZlZCh1bnNpZ25lZCBpbnQgKm51bV9zcHVfcmVzZXJ2ZWQpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAogCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLApAQCAtODA1LDcgKzgwNSw3IEBACiBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fc3B1X3Jlc291cmNlX2lkKHVuc2lnbmVkIGludCAqbnVtX3Jlc291cmNlX2lkKQogewogCWludCByZXN1bHQ7Ci0JdTY0IHYxOworCXU2NCB2MSA9IDA7CiAKIAlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfQ1VSUkVOVCwKIAkJbWFrZV9maXJzdF9maWVsZCgiYmkiLCAwKSwKQEAgLTgyNyw4ICs4MjcsOCBAQAogCWVudW0gcHMzX3NwdV9yZXNvdXJjZV90eXBlICpyZXNvdXJjZV90eXBlLCB1bnNpZ25lZCBpbnQgKnJlc291cmNlX2lkKQogewogCWludCByZXN1bHQ7Ci0JdTY0IHYxOwotCXU2NCB2MjsKKwl1NjQgdjEgPSAwOworCXU2NCB2MiA9IDA7CiAKIAlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfQ1VSUkVOVCwKIAkJbWFrZV9maXJzdF9maWVsZCgiYmkiLCAwKSwKQEAgLTg1NCw3ICs4NTQsNyBAQAogaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYm9vdF9kYXRfc2l6ZSh1bnNpZ25lZCBpbnQgKnNpemUpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAogCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLApAQCAtODY5LDcgKzg2OSw3IEBACiBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9hdl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCkKIHsKIAlpbnQgcmVzdWx0OwotCXU2NCB2MTsKKwl1NjQgdjEgPSAwOwogCiAJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCkBAIC04ODQsNyArODg0LDcgQEAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X3N5c21ncl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCkKIHsKIAlpbnQgcmVzdWx0OwotCXU2NCB2MTsKKwl1NjQgdjEgPSAwOwogCiAJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCkBAIC05MTksNyArOTE5LDcgQEAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX251bV9iZSh1bnNpZ25lZCBpbnQgKm51bV9iZSkKIHsKIAlpbnQgcmVzdWx0OwotCXU2NCB2MTsKKwl1NjQgdjEgPSAwOwogCiAJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKIAkJbWFrZV9maXJzdF9maWVsZCgiYmVuIiwgMCksCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYwppbmRleCAxNDliZWEyLi5lOGVjMWIyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCmluZGV4IDM3NWE5ZjkuLjQ1MWZhZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYwppbmRleCAyMzA4M2MzLi44ODBlYjljIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC02OTUsMTIgKzY5NSwxOCBAQAogCXJldHVybiBtYXNrID49IERNQV9CSVRfTUFTSygzMik7CiB9CiAKK3N0YXRpYyB1NjQgcHMzX2RtYV9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCXJldHVybiBETUFfQklUX01BU0soMzIpOworfQorCiBzdGF0aWMgc3RydWN0IGRtYV9tYXBfb3BzIHBzM19zYl9kbWFfb3BzID0gewogCS5hbGxvY19jb2hlcmVudCA9IHBzM19hbGxvY19jb2hlcmVudCwKIAkuZnJlZV9jb2hlcmVudCA9IHBzM19mcmVlX2NvaGVyZW50LAogCS5tYXBfc2cgPSBwczNfc2JfbWFwX3NnLAogCS51bm1hcF9zZyA9IHBzM19zYl91bm1hcF9zZywKIAkuZG1hX3N1cHBvcnRlZCA9IHBzM19kbWFfc3VwcG9ydGVkLAorCS5nZXRfcmVxdWlyZWRfbWFzayA9IHBzM19kbWFfZ2V0X3JlcXVpcmVkX21hc2ssCiAJLm1hcF9wYWdlID0gcHMzX3NiX21hcF9wYWdlLAogCS51bm1hcF9wYWdlID0gcHMzX3VubWFwX3BhZ2UsCiB9OwpAQCAtNzExLDYgKzcxNyw3IEBACiAJLm1hcF9zZyA9IHBzM19pb2MwX21hcF9zZywKIAkudW5tYXBfc2cgPSBwczNfaW9jMF91bm1hcF9zZywKIAkuZG1hX3N1cHBvcnRlZCA9IHBzM19kbWFfc3VwcG9ydGVkLAorCS5nZXRfcmVxdWlyZWRfbWFzayA9IHBzM19kbWFfZ2V0X3JlcXVpcmVkX21hc2ssCiAJLm1hcF9wYWdlID0gcHMzX2lvYzBfbWFwX3BhZ2UsCiAJLnVubWFwX3BhZ2UgPSBwczNfdW5tYXBfcGFnZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCmluZGV4IDA1Y2Y0NzYuLmM4MWY2YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCkBAIC0xNSw2ICsxNSw3IEBACiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IFBQQ19OQVRJVkUKIAlzZWxlY3QgUFBDX1BDSV9DSE9JQ0UgaWYgRVhQRVJUCisJc2VsZWN0IFpMSUJfREVGTEFURQogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX1NQTFBBUgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZGxwYXIuYwppbmRleCBlOWJlMjViLi4wZjFiNzA2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZGxwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZGxwYXIuYwpAQCAtMTEyLDYgKzExMiw3IEBACiAJZGxwYXJfZnJlZV9vbmVfY2Nfbm9kZShkbik7CiB9CiAKKyNkZWZpbmUgQ09NUExFVEUJMAogI2RlZmluZSBORVhUX1NJQkxJTkcgICAgMQogI2RlZmluZSBORVhUX0NISUxEICAgICAgMgogI2RlZmluZSBORVhUX1BST1BFUlRZICAgMwpAQCAtMTU4LDYgKzE1OSw5IEBACiAJCXNwaW5fdW5sb2NrKCZydGFzX2RhdGFfYnVmX2xvY2spOwogCiAJCXN3aXRjaCAocmMpIHsKKwkJY2FzZSBDT01QTEVURToKKwkJCWJyZWFrOworCiAJCWNhc2UgTkVYVF9TSUJMSU5HOgogCQkJZG4gPSBkbHBhcl9wYXJzZV9jY19ub2RlKGNjd2EpOwogCQkJaWYgKCFkbikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYwppbmRleCBhZGE2ZTA3Li41NjU4NjkwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogZm9yIGluaXRfbW0gKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtMjksNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CkBAIC0xMzM4LDcgKzEzNDAsNyBAQAogc3RhdGljIGludCBfX2luaXQgZWVoX2luaXRfcHJvYyh2b2lkKQogewogCWlmIChtYWNoaW5lX2lzKHBzZXJpZXMpKQotCQlwcm9jX2NyZWF0ZSgicHBjNjQvZWVoIiwgMCwgTlVMTCwgJnByb2NfZWVoX29wZXJhdGlvbnMpOworCQlwcm9jX2NyZWF0ZSgicG93ZXJwYy9lZWgiLCAwLCBOVUxMLCAmcHJvY19lZWhfb3BlcmF0aW9ucyk7CiAJcmV0dXJuIDA7CiB9CiBfX2luaXRjYWxsKGVlaF9pbml0X3Byb2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9ldmVudC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9ldmVudC5jCmluZGV4IDJlYzUwMGMuLmQyMzgzY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZXZlbnQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2V2ZW50LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9zeXNmcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9zeXNmcy5jCmluZGV4IDIzOTgyYzcuLmViNzQ0ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKQEAgLTIzLDYgKzIzLDcgQEAKICAqIFNlbmQgY29tbWVudHMgYW5kIGZlZWRiYWNrIHRvIExpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPgogICovCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwppbmRleCA4M2EzY2EyLi5jOTg2ZDA4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogZm9yIGlkbGVfdGFza19leGl0ICovCiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZjb25zb2xlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZjb25zb2xlLmMKaW5kZXggMDQxZTg3Yy4uYjM0NGY5NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Y29uc29sZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNvbnNvbGUuYwpAQCAtMjQsNyArMjQsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KICNpbmNsdWRlIDxhc20vaHZjb25zb2xlLmg+CiAjaW5jbHVkZSAicGxwYXJfd3JhcHBlcnMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb19ldmVudF9pcnEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb19ldmVudF9pcnEuYwppbmRleCAyYzRkZDFmLi4xYTcwOWJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9fZXZlbnRfaXJxLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvX2V2ZW50X2lycS5jCkBAIC05LDcgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKaW5kZXggMDFmYWFiOS4uYjcxOWQ5NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGZvciBzaG93X3N0YWNrICovCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KQEAgLTkzOSwxNCArOTQwLDE0IEBACiAJaWYgKHJldCkgewogCQlkZXZfaW5mbygmZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIGRpcmVjdCB3aW5kb3cgZm9yICVzOiAlZFxuIiwKIAkJCSBkbi0+ZnVsbF9uYW1lLCByZXQpOwotCQlnb3RvIG91dF9jbGVhcl93aW5kb3c7CisJCWdvdG8gb3V0X2ZyZWVfd2luZG93OwogCX0KIAogCXJldCA9IHByb21fYWRkX3Byb3BlcnR5KHBkbiwgd2luNjQpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJ1bmFibGUgdG8gYWRkIGRtYSB3aW5kb3cgcHJvcGVydHkgZm9yICVzOiAlZCIsCiAJCQkgcGRuLT5mdWxsX25hbWUsIHJldCk7Ci0JCWdvdG8gb3V0X2NsZWFyX3dpbmRvdzsKKwkJZ290byBvdXRfZnJlZV93aW5kb3c7CiAJfQogCiAJd2luZG93LT5kZXZpY2UgPSBwZG47CkBAIC05NTgsNiArOTU5LDkgQEAKIAlkbWFfYWRkciA9IG9mX3JlYWRfbnVtYmVyKCZjcmVhdGUuYWRkcl9oaSwgMik7CiAJZ290byBvdXRfdW5sb2NrOwogCitvdXRfZnJlZV93aW5kb3c6CisJa2ZyZWUod2luZG93KTsKKwogb3V0X2NsZWFyX3dpbmRvdzoKIAlyZW1vdmVfZGR3KHBkbik7CiAKQEAgLTEwNzcsMTIgKzEwODEsMzggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHU2NCBkbWFfZ2V0X3JlcXVpcmVkX21hc2tfcFNlcmllc0xQKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoIWRldi0+ZG1hX21hc2spCisJCXJldHVybiAwOworCisJaWYgKCFkaXNhYmxlX2RkdyAmJiBkZXZfaXNfcGNpKGRldikpIHsKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CisKKwkJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CisKKwkJLyogc2VhcmNoIHVwd2FyZHMgZm9yIGlibSxkbWEtd2luZG93ICovCisJCWZvciAoOyBkbiAmJiBQQ0lfRE4oZG4pICYmICFQQ0lfRE4oZG4pLT5pb21tdV90YWJsZTsKKwkJCQlkbiA9IGRuLT5wYXJlbnQpCisJCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKSkKKwkJCQlicmVhazsKKwkJLyogaWYgdGhlcmUgaXMgYSBpYm0sZGR3LWFwcGxpY2FibGUgcHJvcGVydHkgcmVxdWlyZSA2NCBiaXRzICovCisJCWlmIChkbiAmJiBQQ0lfRE4oZG4pICYmCisJCQkJb2ZfZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLGRkdy1hcHBsaWNhYmxlIiwgTlVMTCkpCisJCQlyZXR1cm4gRE1BX0JJVF9NQVNLKDY0KTsKKwl9CisKKwlyZXR1cm4gZG1hX2lvbW11X29wcy5nZXRfcmVxdWlyZWRfbWFzayhkZXYpOworfQorCiAjZWxzZSAgLyogQ09ORklHX1BDSSAqLwogI2RlZmluZSBwY2lfZG1hX2J1c19zZXR1cF9wU2VyaWVzCU5VTEwKICNkZWZpbmUgcGNpX2RtYV9kZXZfc2V0dXBfcFNlcmllcwlOVUxMCiAjZGVmaW5lIHBjaV9kbWFfYnVzX3NldHVwX3BTZXJpZXNMUAlOVUxMCiAjZGVmaW5lIHBjaV9kbWFfZGV2X3NldHVwX3BTZXJpZXNMUAlOVUxMCiAjZGVmaW5lIGRtYV9zZXRfbWFza19wU2VyaWVzTFAJCU5VTEwKKyNkZWZpbmUgZG1hX2dldF9yZXF1aXJlZF9tYXNrX3BTZXJpZXNMUAlOVUxMCiAjZW5kaWYgLyogIUNPTkZJR19QQ0kgKi8KIAogc3RhdGljIGludCBpb21tdV9tZW1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCkBAIC0xMTg2LDYgKzEyMTYsNyBAQAogCQlwcGNfbWQucGNpX2RtYV9idXNfc2V0dXAgPSBwY2lfZG1hX2J1c19zZXR1cF9wU2VyaWVzTFA7CiAJCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IHBjaV9kbWFfZGV2X3NldHVwX3BTZXJpZXNMUDsKIAkJcHBjX21kLmRtYV9zZXRfbWFzayA9IGRtYV9zZXRfbWFza19wU2VyaWVzTFA7CisJCXBwY19tZC5kbWFfZ2V0X3JlcXVpcmVkX21hc2sgPSBkbWFfZ2V0X3JlcXVpcmVkX21hc2tfcFNlcmllc0xQOwogCX0gZWxzZSB7CiAJCXBwY19tZC50Y2VfYnVpbGQgPSB0Y2VfYnVpbGRfcFNlcmllczsKIAkJcHBjX21kLnRjZV9mcmVlICA9IHRjZV9mcmVlX3BTZXJpZXM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwppbmRleCBjOWEyOWRhLi4yN2E0OTUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tb2JpbGl0eS5jCmluZGV4IDNlN2Y2NTEuLjAyOWE1NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tb2JpbGl0eS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tb2JpbGl0eS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9udnJhbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMKaW5kZXggMDBjYzNhMC4uYTc2YjIyOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMKQEAgLTE4LDYgKzE4LDggQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rbXNnX2R1bXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9udnJhbS5oPgogI2luY2x1ZGUgPGFzbS9ydGFzLmg+CkBAIC03OCw4ICs4MCw0MSBAQAogI2RlZmluZSBOVlJBTV9SVEFTX1JFQURfVElNRU9VVCA1CQkvKiBzZWNvbmRzICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3VucmVhZF9ydGFzX2V2ZW50OwkvKiB0aW1lc3RhbXAgKi8KIAotLyogV2UgcHJlYWxsb2NhdGUgb29wc19idWYgZHVyaW5nIGluaXQgdG8gYXZvaWQga21hbGxvYyBkdXJpbmcgb29wcy9wYW5pYy4gKi8KLXN0YXRpYyBjaGFyICpvb3BzX2J1ZjsKKy8qCisgKiBGb3IgY2FwdHVyaW5nIGFuZCBjb21wcmVzc2luZyBhbiBvb3BzIG9yIHBhbmljIHJlcG9ydC4uLgorCisgKiBiaWdfb29wc19idWZbXSBob2xkcyB0aGUgdW5jb21wcmVzc2VkIHRleHQgd2UncmUgY2FwdHVyaW5nLgorICoKKyAqIG9vcHNfYnVmW10gaG9sZHMgdGhlIGNvbXByZXNzZWQgdGV4dCwgcHJlY2VkZWQgYnkgYSBwcmVmaXguCisgKiBUaGUgcHJlZml4IGlzIGp1c3QgYSB1MTYgaG9sZGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkKiB0ZXh0LgorICogKCpPciB1bmNvbXByZXNzZWQsIGlmIGNvbXByZXNzaW9uIGZhaWxzLikgIG9vcHNfYnVmW10gZ2V0cyB3cml0dGVuCisgKiB0byBOVlJBTS4KKyAqCisgKiBvb3BzX2xlbiBwb2ludHMgdG8gdGhlIHByZWZpeC4gIG9vcHNfZGF0YSBwb2ludHMgdG8gdGhlIGNvbXByZXNzZWQgdGV4dC4KKyAqCisgKiArLSBvb3BzX2J1ZgorICogfAkJKy0gb29wc19kYXRhCisgKiB2CQl2CisgKiArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBsZW5ndGgJfCB0ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAoMiBieXRlcykJfCAob29wc19kYXRhX3N6IGJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIF4KKyAqICstIG9vcHNfbGVuCisgKgorICogV2UgcHJlYWxsb2NhdGUgdGhlc2UgYnVmZmVycyBkdXJpbmcgaW5pdCB0byBhdm9pZCBrbWFsbG9jIGR1cmluZyBvb3BzL3BhbmljLgorICovCitzdGF0aWMgc2l6ZV90IGJpZ19vb3BzX2J1Zl9zejsKK3N0YXRpYyBjaGFyICpiaWdfb29wc19idWYsICpvb3BzX2J1ZjsKK3N0YXRpYyB1MTYgKm9vcHNfbGVuOworc3RhdGljIGNoYXIgKm9vcHNfZGF0YTsKK3N0YXRpYyBzaXplX3Qgb29wc19kYXRhX3N6OworCisvKiBDb21wcmVzc2lvbiBwYXJhbWV0ZXJzICovCisjZGVmaW5lIENPTVBSX0xFVkVMIDYKKyNkZWZpbmUgV0lORE9XX0JJVFMgMTIKKyNkZWZpbmUgTUVNX0xFVkVMIDQKK3N0YXRpYyBzdHJ1Y3Qgel9zdHJlYW1fcyBzdHJlYW07CiAKIHN0YXRpYyBzc2l6ZV90IHBTZXJpZXNfbnZyYW1fcmVhZChjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICppbmRleCkKIHsKQEAgLTM4NywxMSArNDIyLDQ0IEBACiAJCQkJCQlzaXplb2YocnRhc19sb2dfcGFydGl0aW9uKSk7CiAJfQogCW9vcHNfYnVmID0ga21hbGxvYyhvb3BzX2xvZ19wYXJ0aXRpb24uc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvb3BzX2J1ZikgeworCQlwcl9lcnIoIm52cmFtOiBObyBtZW1vcnkgZm9yICVzIHBhcnRpdGlvblxuIiwKKwkJCQkJCW9vcHNfbG9nX3BhcnRpdGlvbi5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlvb3BzX2xlbiA9ICh1MTYqKSBvb3BzX2J1ZjsKKwlvb3BzX2RhdGEgPSBvb3BzX2J1ZiArIHNpemVvZih1MTYpOworCW9vcHNfZGF0YV9zeiA9IG9vcHNfbG9nX3BhcnRpdGlvbi5zaXplIC0gc2l6ZW9mKHUxNik7CisKKwkvKgorCSAqIEZpZ3VyZSBjb21wcmVzc2lvbiAocHJlY2VkZWQgYnkgZWxpbWluYXRpb24gb2YgZWFjaCBsaW5lJ3MgPG4+CisJICogc2V2ZXJpdHkgcHJlZml4KSB3aWxsIHJlZHVjZSB0aGUgb29wcy9wYW5pYyByZXBvcnQgdG8gYXQgbW9zdAorCSAqIDQ1JSBvZiBpdHMgb3JpZ2luYWwgc2l6ZS4KKwkgKi8KKwliaWdfb29wc19idWZfc3ogPSAob29wc19kYXRhX3N6ICogMTAwKSAvIDQ1OworCWJpZ19vb3BzX2J1ZiA9IGttYWxsb2MoYmlnX29vcHNfYnVmX3N6LCBHRlBfS0VSTkVMKTsKKwlpZiAoYmlnX29vcHNfYnVmKSB7CisJCXN0cmVhbS53b3Jrc3BhY2UgPSBrbWFsbG9jKHpsaWJfZGVmbGF0ZV93b3Jrc3BhY2VzaXplKAorCQkJCVdJTkRPV19CSVRTLCBNRU1fTEVWRUwpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzdHJlYW0ud29ya3NwYWNlKSB7CisJCQlwcl9lcnIoIm52cmFtOiBObyBtZW1vcnkgZm9yIGNvbXByZXNzaW9uIHdvcmtzcGFjZTsgIgorCQkJCSJza2lwcGluZyBjb21wcmVzc2lvbiBvZiAlcyBwYXJ0aXRpb24gZGF0YVxuIiwKKwkJCQlvb3BzX2xvZ19wYXJ0aXRpb24ubmFtZSk7CisJCQlrZnJlZShiaWdfb29wc19idWYpOworCQkJYmlnX29vcHNfYnVmID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCXByX2VycigiTm8gbWVtb3J5IGZvciB1bmNvbXByZXNzZWQgJXMgZGF0YTsgIgorCQkJInNraXBwaW5nIGNvbXByZXNzaW9uXG4iLCBvb3BzX2xvZ19wYXJ0aXRpb24ubmFtZSk7CisJCXN0cmVhbS53b3Jrc3BhY2UgPSBOVUxMOworCX0KKwogCXJjID0ga21zZ19kdW1wX3JlZ2lzdGVyKCZudnJhbV9rbXNnX2R1bXBlcik7CiAJaWYgKHJjICE9IDApIHsKIAkJcHJfZXJyKCJudnJhbToga21zZ19kdW1wX3JlZ2lzdGVyKCkgZmFpbGVkOyByZXR1cm5lZCAlZFxuIiwgcmMpOwogCQlrZnJlZShvb3BzX2J1Zik7Ci0JCXJldHVybjsKKwkJa2ZyZWUoYmlnX29vcHNfYnVmKTsKKwkJa2ZyZWUoc3RyZWFtLndvcmtzcGFjZSk7CiAJfQogfQogCkBAIC00NzMsNyArNTQxLDgzIEBACiAJCQkJCQlOVlJBTV9SVEFTX1JFQURfVElNRU9VVCk7CiB9CiAKLS8qIG91ciBrbXNnX2R1bXAgY2FsbGJhY2sgKi8KKy8qIFNxdWVlemUgb3V0IGVhY2ggbGluZSdzIDxuPiBzZXZlcml0eSBwcmVmaXguICovCitzdGF0aWMgc2l6ZV90IGVsaWRlX3NldmVyaXRpZXMoY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWNoYXIgKmluLCAqb3V0LCAqYnVmX2VuZCA9IGJ1ZiArIGxlbjsKKwkvKiBBc3N1bWUgYSA8bj4gYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG1hcmtzIHRoZSBzdGFydCBvZiBhIGxpbmUuICovCisJaW50IG5ld2xpbmUgPSAxOworCisJaW4gPSBvdXQgPSBidWY7CisJd2hpbGUgKGluIDwgYnVmX2VuZCkgeworCQlpZiAobmV3bGluZSAmJiBpbiszIDw9IGJ1Zl9lbmQgJiYKKwkJCQkqaW4gPT0gJzwnICYmIGlzZGlnaXQoaW5bMV0pICYmIGluWzJdID09ICc+JykgeworCQkJaW4gKz0gMzsKKwkJCW5ld2xpbmUgPSAwOworCQl9IGVsc2UgeworCQkJbmV3bGluZSA9ICgqaW4gPT0gJ1xuJyk7CisJCQkqb3V0KysgPSAqaW4rKzsKKwkJfQorCX0KKwlyZXR1cm4gb3V0IC0gYnVmOworfQorCisvKiBEZXJpdmVkIGZyb20gbG9nZnNfY29tcHJlc3MoKSAqLworc3RhdGljIGludCBudnJhbV9jb21wcmVzcyhjb25zdCB2b2lkICppbiwgdm9pZCAqb3V0LCBzaXplX3QgaW5sZW4sCisJCQkJCQkJc2l6ZV90IG91dGxlbikKK3sKKwlpbnQgZXJyLCByZXQ7CisKKwlyZXQgPSAtRUlPOworCWVyciA9IHpsaWJfZGVmbGF0ZUluaXQyKCZzdHJlYW0sIENPTVBSX0xFVkVMLCBaX0RFRkxBVEVELCBXSU5ET1dfQklUUywKKwkJCQkJCU1FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZKTsKKwlpZiAoZXJyICE9IFpfT0spCisJCWdvdG8gZXJyb3I7CisKKwlzdHJlYW0ubmV4dF9pbiA9IGluOworCXN0cmVhbS5hdmFpbF9pbiA9IGlubGVuOworCXN0cmVhbS50b3RhbF9pbiA9IDA7CisJc3RyZWFtLm5leHRfb3V0ID0gb3V0OworCXN0cmVhbS5hdmFpbF9vdXQgPSBvdXRsZW47CisJc3RyZWFtLnRvdGFsX291dCA9IDA7CisKKwllcnIgPSB6bGliX2RlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCWlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKQorCQlnb3RvIGVycm9yOworCisJZXJyID0gemxpYl9kZWZsYXRlRW5kKCZzdHJlYW0pOworCWlmIChlcnIgIT0gWl9PSykKKwkJZ290byBlcnJvcjsKKworCWlmIChzdHJlYW0udG90YWxfb3V0ID49IHN0cmVhbS50b3RhbF9pbikKKwkJZ290byBlcnJvcjsKKworCXJldCA9IHN0cmVhbS50b3RhbF9vdXQ7CitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCisvKiBDb21wcmVzcyB0aGUgdGV4dCBmcm9tIGJpZ19vb3BzX2J1ZiBpbnRvIG9vcHNfYnVmLiAqLworc3RhdGljIGludCB6aXBfb29wcyhzaXplX3QgdGV4dF9sZW4pCit7CisJaW50IHppcHBlZF9sZW4gPSBudnJhbV9jb21wcmVzcyhiaWdfb29wc19idWYsIG9vcHNfZGF0YSwgdGV4dF9sZW4sCisJCQkJCQkJCW9vcHNfZGF0YV9zeik7CisJaWYgKHppcHBlZF9sZW4gPCAwKSB7CisJCXByX2VycigibnZyYW06IGNvbXByZXNzaW9uIGZhaWxlZDsgcmV0dXJuZWQgJWRcbiIsIHppcHBlZF9sZW4pOworCQlwcl9lcnIoIm52cmFtOiBsb2dnaW5nIHVuY29tcHJlc3NlZCBvb3BzL3BhbmljIHJlcG9ydFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJKm9vcHNfbGVuID0gKHUxNikgemlwcGVkX2xlbjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgb3VyIGttc2dfZHVtcCBjYWxsYmFjaywgY2FsbGVkIGFmdGVyIGFuIG9vcHMgb3IgcGFuaWMgcmVwb3J0CisgKiBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBwcmludGsgYnVmZmVyLiAgV2Ugd2FudCB0byBjYXB0dXJlIGFzIG11Y2gKKyAqIG9mIHRoZSBwcmludGsgYnVmZmVyIGFzIHBvc3NpYmxlLiAgRmlyc3QsIGNhcHR1cmUgYXMgbXVjaCBhcyB3ZSBjYW4KKyAqIHRoYXQgd2UgdGhpbmsgd2lsbCBjb21wcmVzcyBzdWZmaWNpZW50bHkgdG8gZml0IGluIHRoZSBsbngsb29wcy1sb2cKKyAqIHBhcnRpdGlvbi4gIElmIHRoYXQncyB0b28gbXVjaCwgZ28gYmFjayBhbmQgY2FwdHVyZSB1bmNvbXByZXNzZWQgdGV4dC4KKyAqLwogc3RhdGljIHZvaWQgb29wc190b19udnJhbShzdHJ1Y3Qga21zZ19kdW1wZXIgKmR1bXBlciwKIAkJZW51bSBrbXNnX2R1bXBfcmVhc29uIHJlYXNvbiwKIAkJY29uc3QgY2hhciAqb2xkX21zZ3MsIHVuc2lnbmVkIGxvbmcgb2xkX2xlbiwKQEAgLTQ4Miw2ICs2MjYsOCBAQAogCXN0YXRpYyB1bnNpZ25lZCBpbnQgb29wc19jb3VudCA9IDA7CiAJc3RhdGljIGJvb2wgcGFuaWNraW5nID0gZmFsc2U7CiAJc2l6ZV90IHRleHRfbGVuOworCXVuc2lnbmVkIGludCBlcnJfdHlwZSA9IEVSUl9UWVBFX0tFUk5FTF9QQU5JQ19HWjsKKwlpbnQgcmMgPSAtMTsKIAogCXN3aXRjaCAocmVhc29uKSB7CiAJY2FzZSBLTVNHX0RVTVBfUkVTVEFSVDoKQEAgLTUwOSw4ICs2NTUsMTkgQEAKIAlpZiAoY2xvYmJlcmluZ191bnJlYWRfcnRhc19ldmVudCgpKQogCQlyZXR1cm47CiAKLQl0ZXh0X2xlbiA9IGNhcHR1cmVfbGFzdF9tc2dzKG9sZF9tc2dzLCBvbGRfbGVuLCBuZXdfbXNncywgbmV3X2xlbiwKLQkJCQkJb29wc19idWYsIG9vcHNfbG9nX3BhcnRpdGlvbi5zaXplKTsKKwlpZiAoYmlnX29vcHNfYnVmKSB7CisJCXRleHRfbGVuID0gY2FwdHVyZV9sYXN0X21zZ3Mob2xkX21zZ3MsIG9sZF9sZW4sCisJCQluZXdfbXNncywgbmV3X2xlbiwgYmlnX29vcHNfYnVmLCBiaWdfb29wc19idWZfc3opOworCQl0ZXh0X2xlbiA9IGVsaWRlX3NldmVyaXRpZXMoYmlnX29vcHNfYnVmLCB0ZXh0X2xlbik7CisJCXJjID0gemlwX29vcHModGV4dF9sZW4pOworCX0KKwlpZiAocmMgIT0gMCkgeworCQl0ZXh0X2xlbiA9IGNhcHR1cmVfbGFzdF9tc2dzKG9sZF9tc2dzLCBvbGRfbGVuLAorCQkJCW5ld19tc2dzLCBuZXdfbGVuLCBvb3BzX2RhdGEsIG9vcHNfZGF0YV9zeik7CisJCWVycl90eXBlID0gRVJSX1RZUEVfS0VSTkVMX1BBTklDOworCQkqb29wc19sZW4gPSAodTE2KSB0ZXh0X2xlbjsKKwl9CisKIAkodm9pZCkgbnZyYW1fd3JpdGVfb3NfcGFydGl0aW9uKCZvb3BzX2xvZ19wYXJ0aXRpb24sIG9vcHNfYnVmLAotCQkoaW50KSB0ZXh0X2xlbiwgRVJSX1RZUEVfS0VSTkVMX1BBTklDLCArK29vcHNfY291bnQpOworCQkoaW50KSAoc2l6ZW9mKCpvb3BzX2xlbikgKyAqb29wc19sZW4pLCBlcnJfdHlwZSwgKytvb3BzX2NvdW50KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwppbmRleCAzYmY0NDg4Li41NWQ0ZWMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCkBAIC0yNiw2ICsyNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BscGFyX3dyYXBwZXJzLmgKaW5kZXggNDFjMjRjMS4uMzQyNzk3ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BscGFyX3dyYXBwZXJzLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BscGFyX3dyYXBwZXJzLmgKQEAgLTEsNyArMSwxMCBAQAogI2lmbmRlZiBfUFNFUklFU19QTFBBUl9XUkFQUEVSU19ICiAjZGVmaW5lIF9QU0VSSUVTX1BMUEFSX1dSQVBQRVJTX0gKIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCiAjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS9wYWNhLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogLyogR2V0IHN0YXRlIG9mIHBoeXNpY2FsIENQVSBmcm9tIHF1ZXJ5X2NwdV9zdG9wcGVkICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCmluZGV4IDA5NjlmZDkuLmMzNDA4Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYwppbmRleCA0ZTQ0YzRkLi4yNmU5M2ZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jCkBAIC0xNCw3ICsxNCw2IEBACiAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc3VzcGVuZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3N1c3BlbmQuYwppbmRleCBhOGNhMjg5Li5kM2RlMDg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc3VzcGVuZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zdXNwZW5kLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9LY29uZmlnCmluZGV4IGMzYzQ4ZWIuLmJkNTYwYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvS2NvbmZpZwpAQCAtMSw1ICsxLDEyIEBACiBjb25maWcgUFBDX1dTUAogCWJvb2wKKwlzZWxlY3QgUFBDX0EyCisJc2VsZWN0IFBQQ19TQ09NCisJc2VsZWN0IFBQQ19YSUNTCisJc2VsZWN0IFBQQ19JQ1BfTkFUSVZFCisJc2VsZWN0IFBDSQorCXNlbGVjdCBQUENfSU9fV09SS0FST1VORFMgaWYgUENJCisJc2VsZWN0IFBQQ19JTkRJUkVDVF9QSU8gaWYgUENJCiAJZGVmYXVsdCBuCiAKIG1lbnUgIldTUCBwbGF0Zm9ybSBzZWxlY3Rpb24iCkBAIC03LDEzICsxNCw5IEBACiAKIGNvbmZpZyBQUENfUFNSMgogCWJvb2wgIlBTUi0yIHBsYXRmb3JtIgotCXNlbGVjdCBQUENfQTIKIAlzZWxlY3QgR0VORVJJQ19UQlNZTkMKLQlzZWxlY3QgUFBDX1NDT00KIAlzZWxlY3QgRVBBUFJfQk9PVAogCXNlbGVjdCBQUENfV1NQCi0Jc2VsZWN0IFBQQ19YSUNTCi0Jc2VsZWN0IFBQQ19JQ1BfTkFUSVZFCiAJZGVmYXVsdCB5CiAKIGVuZG1lbnUKQEAgLTIxLDggKzI0LDMgQEAKIGNvbmZpZyBQUENfQTJfREQyCiAJYm9vbCAiU3VwcG9ydCBmb3IgREQyIGJhc2VkIEEyL1dTUCBzeXN0ZW1zIgogCWRlcGVuZHMgb24gUFBDX0EyCi0KLWNvbmZpZyBXT1JLQVJPVU5EX0VSUkFUVU1fNDYzCi0JZGVwZW5kcyBvbiBQUENfQTJfREQyCi0JYm9vbCAiV29ya2Fyb3VuZCBlcnJhdHVtIDQ2MyIKLQlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvTWFrZWZpbGUKaW5kZXggMDk1YmU3My4uYTE0ODZiNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvTWFrZWZpbGUKQEAgLTQsMyArNCw1IEBACiBvYmotJChDT05GSUdfUFBDX1BTUjIpCQkrPSBwc3IyLm8gb3BiX3BpYy5vCiBvYmotJChDT05GSUdfUFBDX1dTUCkJCSs9IHNjb21fd3NwLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubyBzY29tX3NtcC5vCitvYmotJChDT05GSUdfUENJKQkJKz0gd3NwX3BjaS5vCitvYmotJChDT05GSUdfUENJX01TSSkJCSs9IG1zaS5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaWNzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9pY3MuYwppbmRleCBlNTNiZDllLi41NzY4NzQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9pY3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9pY3MuYwpAQCAtNzEwLDMgKzcxMCw1MSBAQAogCS8qIFdlIG5lZWQgdG8gcGF0Y2ggb3VyIGlycSBjaGlwJ3MgRU9JIHRvIHBvaW50IHRvIHRoZSByaWdodCBJQ1AgKi8KIAl3c3BfaXJxX2NoaXAuaXJxX2VvaSA9IGljcF9vcHMtPmVvaTsKIH0KKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCitzdGF0aWMgdm9pZCB3c3BfaWNzX21zaV91bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl3c3BfY2hpcF91bm1hc2tfaXJxKGQpOworCXVubWFza19tc2lfaXJxKGQpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHdzcF9pY3NfbXNpX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkKQoreworCXdzcF9pY3NfbXNpX3VubWFza19pcnEoZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdzcF9pY3NfbXNpX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwltYXNrX21zaV9pcnEoZCk7CisJd3NwX2NoaXBfbWFza19pcnEoZCk7Cit9CisKKy8qCisgKiB3ZSBkbyBpdCB0aGlzIHdheSBiZWNhdXNlIHdlIHJlYXNzaW5nZSBkZWZhdWx0IEVPSSBoYW5kbGluZyBpbgorICogaXJxX2luaXQoKSBhYm92ZQorICovCitzdGF0aWMgdm9pZCB3c3BfaWNzX2VvaShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJd3NwX2lycV9jaGlwLmlycV9lb2koZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgd3NwX2ljc19tc2kgPSB7CisJLm5hbWUgPSAiV1NQIElDUyBNU0kiLAorCS5pcnFfc3RhcnR1cCA9IHdzcF9pY3NfbXNpX3N0YXJ0dXAsCisJLmlycV9tYXNrID0gd3NwX2ljc19tc2lfbWFza19pcnEsCisJLmlycV91bm1hc2sgPSB3c3BfaWNzX21zaV91bm1hc2tfaXJxLAorCS5pcnFfZW9pID0gd3NwX2ljc19lb2ksCisJLmlycV9zZXRfYWZmaW5pdHkgPSB3c3BfY2hpcF9zZXRfYWZmaW5pdHkKK307CisKK3ZvaWQgd3NwX2ljc19zZXRfbXNpX2NoaXAodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnFfc2V0X2NoaXAoaXJxLCAmd3NwX2ljc19tc2kpOworfQorCit2b2lkIHdzcF9pY3Nfc2V0X3N0ZF9jaGlwKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxX3NldF9jaGlwKGlycSwgJndzcF9pcnFfY2hpcCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2ljcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaWNzLmgKaW5kZXggZTM0ZDUzMS4uMDdiNjQ0ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaWNzLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaWNzLmgKQEAgLTE3LDQgKzE3LDkgQEAKIGV4dGVybiBpbnQgd3NwX2ljc19hbGxvY19pcnEoc3RydWN0IGRldmljZV9ub2RlICpkbiwgaW50IG51bSk7CiBleHRlcm4gdm9pZCB3c3BfaWNzX2ZyZWVfaXJxKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIHVuc2lnbmVkIGludCBpcnEpOwogCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK2V4dGVybiB2b2lkIHdzcF9pY3Nfc2V0X21zaV9jaGlwKHVuc2lnbmVkIGludCBpcnEpOworZXh0ZXJuIHZvaWQgd3NwX2ljc19zZXRfc3RkX2NoaXAodW5zaWduZWQgaW50IGlycSk7CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KKwogI2VuZGlmIC8qIF9fSUNTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL21zaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvbXNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwODgyZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL21zaS5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJtc2kuaCIKKyNpbmNsdWRlICJpY3MuaCIKKyNpbmNsdWRlICJ3c3BfcGNpLmgiCisKKy8qIE1hZ2ljIGFkZHJlc3NlcyBmb3IgMzIgJiA2NC1iaXQgTVNJcyB3aXRoIGhhcmRjb2RlZCBNVkUgMCAqLworI2RlZmluZSBNU0lfQUREUl8zMgkJMHhGRkZGMDAwMHVsCisjZGVmaW5lIE1TSV9BRERSXzY0CQkweDEwMDAwMDAwMDAwMDAwMDB1bAorCitpbnQgd3NwX3NldHVwX21zaV9pcnFzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBudmVjLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKKwlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OworCXN0cnVjdCBtc2lfbXNnIG1zZzsKKwl1bnNpZ25lZCBpbnQgdmlycTsKKwlpbnQgaHdpcnE7CisKKwlwaGIgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCWlmICghcGhiKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmZGV2LT5tc2lfbGlzdCwgc3RydWN0IG1zaV9kZXNjLCBsaXN0KTsKKwlpZiAoZW50cnktPm1zaV9hdHRyaWIuaXNfNjQpIHsKKwkJbXNnLmFkZHJlc3NfbG8gPSAwOworCQltc2cuYWRkcmVzc19oaSA9IE1TSV9BRERSXzY0ID4+IDMyOworCX0gZWxzZSB7CisJCW1zZy5hZGRyZXNzX2xvID0gTVNJX0FERFJfMzI7CisJCW1zZy5hZGRyZXNzX2hpID0gMDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5tc2lfbGlzdCwgbGlzdCkgeworCQlod2lycSA9IHdzcF9pY3NfYWxsb2NfaXJxKHBoYi0+ZG4sIDEpOworCQlpZiAoaHdpcnEgPCAwKSB7CisJCQlkZXZfd2FybigmZGV2LT5kZXYsICJ3c3BfbXNpOiBod2lycSBhbGxvYyBmYWlsZWQhXG4iKTsKKwkJCXJldHVybiBod2lycTsKKwkJfQorCisJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgaHdpcnEpOworCQlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJCWRldl93YXJuKCZkZXYtPmRldiwgIndzcF9tc2k6IHZpcnEgYWxsb2MgZmFpbGVkIVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlkZXZfZGJnKCZkZXYtPmRldiwgIndzcF9tc2k6IGFsbG9jYXRlZCBpcnEgJSN4LyUjeFxuIiwKKwkJCWh3aXJxLCB2aXJxKTsKKworCQl3c3BfaWNzX3NldF9tc2lfY2hpcCh2aXJxKTsKKwkJaXJxX3NldF9tc2lfZGVzYyh2aXJxLCBlbnRyeSk7CisJCW1zZy5kYXRhID0gaHdpcnEgJiBYSVZFX0FERFJfTUFTSzsKKwkJd3JpdGVfbXNpX21zZyh2aXJxLCAmbXNnKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB3c3BfdGVhcmRvd25fbXNpX2lycXMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKKwlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OworCWludCBod2lycTsKKworCXBoYiA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7CisKKwlkZXZfZGJnKCZkZXYtPmRldiwgIndzcF9tc2k6IHRlYXJpbmcgZG93biBtc2kgaXJxc1xuIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5tc2lfbGlzdCwgbGlzdCkgeworCQlpZiAoZW50cnktPmlycSA9PSBOT19JUlEpCisJCQljb250aW51ZTsKKworCQlpcnFfc2V0X21zaV9kZXNjKGVudHJ5LT5pcnEsIE5VTEwpOworCQl3c3BfaWNzX3NldF9zdGRfY2hpcChlbnRyeS0+aXJxKTsKKworCQlod2lycSA9IHZpcnFfdG9faHcoZW50cnktPmlycSk7CisJCS8qIEluIHRoaXMgb3JkZXIgdG8gYXZvaWQgcmFjaW5nIHdpdGggaXJxX2NyZWF0ZV9tYXBwaW5nKCkgKi8KKwkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhlbnRyeS0+aXJxKTsKKwkJd3NwX2ljc19mcmVlX2lycShwaGItPmRuLCBod2lycSk7CisJfQorfQorCit2b2lkIHdzcF9zZXR1cF9waGJfbXNpKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQoreworCS8qIENyZWF0ZSBhIHNpbmdsZSBNVkUgYXQgb2Zmc2V0IDAgdGhhdCBtYXRjaGVzIGV2ZXJ5dGhpbmcgKi8KKwlvdXRfYmU2NChwaGItPmNmZ19kYXRhICsgUENJRV9SRUdfSU9EQV9BRERSLCBQQ0lFX1JFR19JT0RBX0FEX1RCTF9NVlQpOworCW91dF9iZTY0KHBoYi0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19JT0RBX0RBVEEwLCAxdWxsIDw8IDYzKTsKKworCXBwY19tZC5zZXR1cF9tc2lfaXJxcyA9IHdzcF9zZXR1cF9tc2lfaXJxczsKKwlwcGNfbWQudGVhcmRvd25fbXNpX2lycXMgPSB3c3BfdGVhcmRvd25fbXNpX2lycXM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9tc2kuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL21zaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjI3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9tc2kuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX1dTUF9NU0lfSAorI2RlZmluZSBfX1dTUF9NU0lfSAorCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK2V4dGVybiB2b2lkIHdzcF9zZXR1cF9waGJfbXNpKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgd3NwX3NldHVwX3BoYl9tc2koc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpIHsgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1dTUF9NU0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvcHNyMi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvcHNyMi5jCmluZGV4IDQwZjI4OTEuLjE2NmYyZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3BzcjIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9wc3IyLmMKQEAgLTYzLDYgKzYzLDEwIEBACiAjaWZkZWYgQ09ORklHX1NNUAogCWEyX3NldHVwX3NtcCgpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSQorCXdzcF9zZXR1cF9wY2koKTsKKyNlbmRpZgorCiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBzcjJfcHJvYmUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwLmgKaW5kZXggN2MzZTA4Ny4uMzM0Nzk4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwLmgKQEAgLTMsNiArMyw5IEBACiAKICNpbmNsdWRlIDxhc20vd3NwLmg+CiAKKy8qIERldnRyZWUgY29tcGF0aWJsZSBzdHJpbmdzIGZvciBtYWpvciBkZXZpY2VzICovCisjZGVmaW5lIFBDSUVfQ09NUEFUSUJMRSAgICAgImlibSx3c3AtcGNpZXgiCisKIGV4dGVybiB2b2lkIHdzcF9zZXR1cF9wY2kodm9pZCk7CiBleHRlcm4gdm9pZCBzY29tX2luaXRfd3NwKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3BfcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3BfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyNjJjZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcF9wY2kuYwpAQCAtMCwwICsxLDExMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBCZW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorCisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vaW8td29ya2Fyb3VuZHMuaD4KKworI2luY2x1ZGUgIndzcC5oIgorI2luY2x1ZGUgIndzcF9wY2kuaCIKKyNpbmNsdWRlICJtc2kuaCIKKworCisvKiBNYXggbnVtYmVyIG9mIFRWVHMgZm9yIG9uZSB0YWJsZS4gT25seSAzMi1iaXQgdGFibGVzIGNhbiB1c2UKKyAqIG11bHRpcGxlIFRWVHMgYW5kIHNvIHRoZSBtYXggY3VycmVudGx5IHN1cHBvcnRlZCBpcyB0aHVzIDgKKyAqIHNpbmNlIG9ubHkgMkcgb2YgRE1BIHNwYWNlIGlzIHN1cHBvcnRlZAorICovCisjZGVmaW5lIE1BWF9UQUJMRV9UVlRfQ09VTlQJCTgKKworc3RydWN0IHdzcF9kbWFfdGFibGUgeworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUJdGFibGU7CisJc3RydWN0IHdzcF9waGIJKnBoYjsKKwlzdHJ1Y3QgcGFnZQkJKnRjZXNbTUFYX1RBQkxFX1RWVF9DT1VOVF07Cit9OworCisvKiBXZSBzdXBwb3J0IERNQSByZWdpb25zIGZyb20gMC4uLjJHIGluIDMyYml0IHNwYWNlIChubyBzdXBwb3J0IGZvcgorICogNjQtYml0IERNQSBqdXN0IHlldCkuIEVhY2ggZGV2aWNlIGdldHMgYSBzZXBhcmF0ZSBUQ0UgdGFibGUgKFRWVAorICogZW50cnkpIHdpdGggdmFsaWRhdGlvbiBlbmFibGVkICh0aG91Z2ggbm90IHN1cHBvcnRlZCBieSBTaW1pQ1MKKyAqIGp1c3QgeWV0KS4KKyAqCisgKiBUbyBzaW1wbGlmeSB0aGluZ3MsIHdlIGRpdmlkZSB0aGlzIDJHIHNwYWNlIGludG8gTiByZWdpb25zIGJhc2VkCisgKiBvbiB0aGUgY29uc3RhbnQgYmVsb3cgd2hpY2ggY291bGQgYmUgdHVybmVkIGludG8gYSB0dW5hYmxlIGV2ZW50dWFsbHkKKyAqCisgKiBXZSB0aGVuIGFzc2lnbiBkeW5hbWljYWxseSB0aG9zZSByZWdpb25zIHRvIGRldmljZXMgYXMgdGhleSBzaG93IHVwLgorICoKKyAqIFdlIHVzZSBhIGJpdG1hcCBhcyBhbiBhbGxvY2F0b3IgZm9yIHRoZXNlLgorICoKKyAqIFRhYmxlcyBhcmUgYWxsb2NhdGVkL2NyZWF0ZWQgZHluYW1pY2FsbHkgYXMgZGV2aWNlcyBhcmUgZGlzY292ZXJlZCwKKyAqIG11bHRpcGxlIFRWVCBlbnRyaWVzIGFyZSB1c2VkIGlmIG5lZWRlZAorICoKKyAqIFdoZW4gNjQtYml0IERNQSBzdXBwb3J0IGlzIGFkZGVkIHdlIHNob3VsZCBzaW1wbHkgdXNlIGEgc2VwYXJhdGUgc2V0CisgKiBvZiBsYXJnZXIgcmVnaW9ucyAodGhlIEhXIHN1cHBvcnRzIDY0IFRWVCBlbnRyaWVzKS4gV2UgY2FuCisgKiBhZGRpdGlvbmFsbHkgY3JlYXRlIGEgYnlwYXNzIHJlZ2lvbiBpbiA2NC1iaXQgc3BhY2UgZm9yIHBlcmZvcm1hbmNlcworICogdGhvdWdoIHRoYXQgd291bGQgaGF2ZSBhIGNvc3QgaW4gdGVybSBvZiBzZWN1cml0eS4KKyAqCisgKiBJZiB5b3Ugc2V0IE5VTV9ETUEzMl9SRUdJT05TIHRvIDEsIHRoZW4gYSBzaW5nbGUgdGFibGUgaXMgc2hhcmVkCisgKiBmb3IgYWxsIGRldmljZXMgYW5kIGJ1cy9kZXYvZm4gdmFsaWRhdGlvbiBpcyBkaXNhYmxlZAorICoKKyAqIE5vdGUgdGhhdCBhIERNQTMyIHJlZ2lvbiBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDI1Nk0gc28gdGhlIG1heAorICogc3VwcG9ydGVkIGhlcmUgZm9yIG5vdyBpcyA4LiBXZSBkb24ndCB5ZXQgc3VwcG9ydCBzaGFyaW5nIHJlZ2lvbnMKKyAqIGJldHdlZW4gbXVsdGlwbGUgZGV2aWNlcyBzbyB0aGUgbWF4IG51bWJlciBvZiBkZXZpY2VzIHN1cHBvcnRlZAorICogaXMgTUFYX1RBQkxFX1RWVF9DT1VOVC4KKyAqLworI2RlZmluZSBOVU1fRE1BMzJfUkVHSU9OUwkxCisKK3N0cnVjdCB3c3BfcGhiIHsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIJKmhvc2U7CisKKwkvKiBMb2NrIGNvbnRyb2xsaW5nIGFjY2VzcyB0byB0aGUgbGlzdCBvZiBkbWEgdGFibGVzLgorCSAqIEl0IGRvZXMgLW5vdC0gcHJvdGVjdCBhZ2FpbnN0IGRtYV8qIG9wZXJhdGlvbnMgb24KKwkgKiB0aG9zZSB0YWJsZXMsIHRob3NlIHNob3VsZCBiZSBzdG9wcGVkIGJlZm9yZSBhbiBlbnRyeQorCSAqIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KKwkgKgorCSAqIFRoZSBsb2NrIGlzIGFsc28gdXNlZCBmb3IgZXJyb3IgaGFuZGxpbmcgb3BlcmF0aW9ucworCSAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IGxpc3RfaGVhZAlkbWFfdGFibGVzOworCXVuc2lnbmVkIGxvbmcJCWRtYTMyX21hcDsKKwl1bnNpZ25lZCBsb25nCQlkbWEzMl9iYXNlOworCXVuc2lnbmVkIGludAkJZG1hMzJfbnVtX3JlZ2lvbnM7CisJdW5zaWduZWQgbG9uZwkJZG1hMzJfcmVnaW9uX3NpemU7CisKKwkvKiBEZWJ1Z2ZzIHN0dWZmICovCisJc3RydWN0IGRlbnRyeQkJKmRkaXI7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFsbDsKK307CitzdGF0aWMgTElTVF9IRUFEKHdzcF9waGJzKTsKKworLy8jZGVmaW5lIGNmZ19kZWJ1ZyhmbXQuLi4pCXByX2RlYnVnKGZtdCkKKyNkZWZpbmUgY2ZnX2RlYnVnKGZtdC4uLikKKworCitzdGF0aWMgaW50IHdzcF9wY2llX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkgIGludCBvZmZzZXQsIGludCBsZW4sIHUzMiAqdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlpbnQgc3Vib2ZmOworCXU2NCBhZGRyOworCisJaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCWlmIChob3NlID09IE5VTEwpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJaWYgKG9mZnNldCA+PSAweDEwMDApCisJCXJldHVybiAgUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOworCWFkZHIgPSBQQ0lFX1JFR19DQV9FTkFCTEUgfAorCQkoKHU2NClidXMtPm51bWJlcikgPDwgUENJRV9SRUdfQ0FfQlVTX1NISUZUIHwKKwkJKCh1NjQpZGV2Zm4pIDw8IFBDSUVfUkVHX0NBX0ZVTkNfU0hJRlQgfAorCQkoKHU2NClvZmZzZXQgJiB+MykgPDwgUENJRV9SRUdfQ0FfUkVHX1NISUZUOworCXN1Ym9mZiA9IG9mZnNldCAmIDM7CisKKwkvKgorCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcworCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KKwkgKi8KKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQlhZGRyIHw9ICgweDh1bCA+PiBzdWJvZmYpIDw8IFBDSUVfUkVHX0NBX0JFX1NISUZUOworCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19BRERSRVNTLCBhZGRyKTsKKwkJKnZhbCA9IChpbl9sZTMyKGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0RBVEEpCisJCQk+PiAoc3Vib2ZmIDw8IDMpKSAmIDB4ZmY7CisJCWNmZ19kZWJ1ZygicmVhZCAxICUwMng6JTAyeDolMDJ4ICsgJTAyeC8leCBhZGRyPTB4JWxseCB2YWw9JTAyeFxuIiwKKwkJCSAgYnVzLT5udW1iZXIsIGRldmZuID4+IDMsIGRldmZuICYgNywKKwkJCSAgb2Zmc2V0LCBzdWJvZmYsIGFkZHIsICp2YWwpOworCQlicmVhazsKKwljYXNlIDI6CisJCWFkZHIgfD0gKDB4Y3VsID4+IHN1Ym9mZikgPDwgUENJRV9SRUdfQ0FfQkVfU0hJRlQ7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0FERFJFU1MsIGFkZHIpOworCQkqdmFsID0gKGluX2xlMzIoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfREFUQSkKKwkJCT4+IChzdWJvZmYgPDwgMykpICYgMHhmZmZmOworCQljZmdfZGVidWcoInJlYWQgMiAlMDJ4OiUwMng6JTAyeCArICUwMngvJXggYWRkcj0weCVsbHggdmFsPSUwNHhcbiIsCisJCQkgIGJ1cy0+bnVtYmVyLCBkZXZmbiA+PiAzLCBkZXZmbiAmIDcsCisJCQkgIG9mZnNldCwgc3Vib2ZmLCBhZGRyLCAqdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYWRkciB8PSAweGZ1bCA8PCBQQ0lFX1JFR19DQV9CRV9TSElGVDsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfQUREUkVTUywgYWRkcik7CisJCSp2YWwgPSBpbl9sZTMyKGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0RBVEEpOworCQljZmdfZGVidWcoInJlYWQgNCAlMDJ4OiUwMng6JTAyeCArICUwMngvJXggYWRkcj0weCVsbHggdmFsPSUwOHhcbiIsCisJCQkgIGJ1cy0+bnVtYmVyLCBkZXZmbiA+PiAzLCBkZXZmbiAmIDcsCisJCQkgIG9mZnNldCwgc3Vib2ZmLCBhZGRyLCAqdmFsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgd3NwX3BjaWVfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkgICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlpbnQgc3Vib2ZmOworCXU2NCBhZGRyOworCisJaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCWlmIChob3NlID09IE5VTEwpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJaWYgKG9mZnNldCA+PSAweDEwMDApCisJCXJldHVybiAgUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOworCWFkZHIgPSBQQ0lFX1JFR19DQV9FTkFCTEUgfAorCQkoKHU2NClidXMtPm51bWJlcikgPDwgUENJRV9SRUdfQ0FfQlVTX1NISUZUIHwKKwkJKCh1NjQpZGV2Zm4pIDw8IFBDSUVfUkVHX0NBX0ZVTkNfU0hJRlQgfAorCQkoKHU2NClvZmZzZXQgJiB+MykgPDwgUENJRV9SRUdfQ0FfUkVHX1NISUZUOworCXN1Ym9mZiA9IG9mZnNldCAmIDM7CisKKwkvKgorCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcworCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KKwkgKi8KKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJYWRkciB8PSAoMHg4dWwgPj4gc3Vib2ZmKSA8PCBQQ0lFX1JFR19DQV9CRV9TSElGVDsKKwkJdmFsIDw8PSBzdWJvZmYgPDwgMzsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfQUREUkVTUywgYWRkcik7CisJCW91dF9sZTMyKGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0RBVEEsIHZhbCk7CisJCWNmZ19kZWJ1Zygid3JpdGUgMSAlMDJ4OiUwMng6JTAyeCArICUwMngvJXggYWRkcj0weCVsbHggdmFsPSUwMnhcbiIsCisJCQkgIGJ1cy0+bnVtYmVyLCBkZXZmbiA+PiAzLCBkZXZmbiAmIDcsCisJCQkgIG9mZnNldCwgc3Vib2ZmLCBhZGRyLCB2YWwpOworCQlicmVhazsKKwljYXNlIDI6CisJCWFkZHIgfD0gKDB4Y3VsID4+IHN1Ym9mZikgPDwgUENJRV9SRUdfQ0FfQkVfU0hJRlQ7CisJCXZhbCA8PD0gc3Vib2ZmIDw8IDM7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0FERFJFU1MsIGFkZHIpOworCQlvdXRfbGUzMihob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19EQVRBLCB2YWwpOworCQljZmdfZGVidWcoIndyaXRlIDIgJTAyeDolMDJ4OiUwMnggKyAlMDJ4LyV4IGFkZHI9MHglbGx4IHZhbD0lMDR4XG4iLAorCQkJICBidXMtPm51bWJlciwgZGV2Zm4gPj4gMywgZGV2Zm4gJiA3LAorCQkJICBvZmZzZXQsIHN1Ym9mZiwgYWRkciwgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYWRkciB8PSAweGZ1bCA8PCBQQ0lFX1JFR19DQV9CRV9TSElGVDsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfQUREUkVTUywgYWRkcik7CisJCW91dF9sZTMyKGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0RBVEEsIHZhbCk7CisJCWNmZ19kZWJ1Zygid3JpdGUgNCAlMDJ4OiUwMng6JTAyeCArICUwMngvJXggYWRkcj0weCVsbHggdmFsPSUwOHhcbiIsCisJCQkgIGJ1cy0+bnVtYmVyLCBkZXZmbiA+PiAzLCBkZXZmbiAmIDcsCisJCQkgIG9mZnNldCwgc3Vib2ZmLCBhZGRyLCB2YWwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIHdzcF9wY2llX3BjaV9vcHMgPQoreworCS5yZWFkID0gd3NwX3BjaWVfcmVhZF9jb25maWcsCisJLndyaXRlID0gd3NwX3BjaWVfd3JpdGVfY29uZmlnLAorfTsKKworI2RlZmluZSBUQ0VfU0hJRlQJCTEyCisjZGVmaW5lIFRDRV9QQUdFX1NJWkUJCSgxIDw8IFRDRV9TSElGVCkKKyNkZWZpbmUgVENFX1BDSV9XUklURQkJMHgyCQkgLyogd3JpdGUgZnJvbSBQQ0kgYWxsb3dlZCAqLworI2RlZmluZSBUQ0VfUENJX1JFQUQJCTB4MQkgCSAvKiByZWFkIGZyb20gUENJIGFsbG93ZWQgKi8KKyNkZWZpbmUgVENFX1JQTl9NQVNLCQkweDNmZmZmZmZmZmZmdWwgIC8qIDQyLWJpdCBSUE4gKDRLIHBhZ2VzKSAqLworI2RlZmluZSBUQ0VfUlBOX1NISUZUCQkxMgorCisvLyNkZWZpbmUgZG1hX2RlYnVnKGZtdC4uLikJcHJfZGVidWcoZm10KQorI2RlZmluZSBkbWFfZGVidWcoZm10Li4uKQorCitzdGF0aWMgaW50IHRjZV9idWlsZF93c3Aoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGxvbmcgaW5kZXgsIGxvbmcgbnBhZ2VzLAorCQkJICAgdW5zaWduZWQgbG9uZyB1YWRkciwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAorCQkJICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJc3RydWN0IHdzcF9kbWFfdGFibGUgKnB0YmwgPSBjb250YWluZXJfb2YodGJsLAorCQkJCQkJICAgIHN0cnVjdCB3c3BfZG1hX3RhYmxlLAorCQkJCQkJICAgIHRhYmxlKTsKKwl1NjQgcHJvdG9fdGNlOworCXU2NCAqdGNlcDsKKwl1NjQgcnBuOworCisJcHJvdG9fdGNlID0gVENFX1BDSV9SRUFEOworI2lmZGVmIENPTkZJR19XU1BfREQxX1dPUktBUk9VTkRfREQxX1RDRV9CVUdTCisJcHJvdG9fdGNlIHw9IFRDRV9QQ0lfV1JJVEU7CisjZWxzZQorCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKKwkJcHJvdG9fdGNlIHw9IFRDRV9QQ0lfV1JJVEU7CisjZW5kaWYKKworCS8qIFhYWCBNYWtlIHRoaXMgZmFzdGVyIGJ5IGZhY3RvcmluZyBvdXQgdGhlIHBhZ2UgYWRkcmVzcyBmb3IKKwkgKiB3aXRoaW4gYSBUQ0UgdGFibGUKKwkgKi8KKwl3aGlsZSAobnBhZ2VzLS0pIHsKKwkJLyogV2UgZG9uJ3QgdXNlIGl0LT5iYXNlIGFzIHRoZSB0YWJsZSBjYW4gYmUgc2NhdHRlcmVkICovCisJCXRjZXAgPSAodTY0ICopcGFnZV9hZGRyZXNzKHB0YmwtPnRjZXNbaW5kZXggPj4gMTZdKTsKKwkJdGNlcCArPSAoaW5kZXggJiAweGZmZmYpOworCisJCS8qIGNhbid0IG1vdmUgdGhpcyBvdXQgc2luY2Ugd2UgbWlnaHQgY3Jvc3MgTE1CIGJvdW5kYXJ5ICovCisJCXJwbiA9IF9fcGEodWFkZHIpID4+IFRDRV9TSElGVDsKKwkJKnRjZXAgPSBwcm90b190Y2UgfCAocnBuICYgVENFX1JQTl9NQVNLKSA8PCBUQ0VfUlBOX1NISUZUOworCisJCWRtYV9kZWJ1ZygiW0RNQV0gVENFICVwIHNldCB0byAweCUwMTZsbHggKGRtYSBhZGRyOiAweCVseClcbiIsCisJCQkgIHRjZXAsICp0Y2VwLCAodGJsLT5pdF9vZmZzZXQgKyBpbmRleCkgPDwgSU9NTVVfUEFHRV9TSElGVCk7CisKKwkJdWFkZHIgKz0gVENFX1BBR0VfU0laRTsKKwkJaW5kZXgrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRjZV9mcmVlX3dzcChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwgbG9uZyBucGFnZXMpCit7CisJc3RydWN0IHdzcF9kbWFfdGFibGUgKnB0YmwgPSBjb250YWluZXJfb2YodGJsLAorCQkJCQkJICAgIHN0cnVjdCB3c3BfZG1hX3RhYmxlLAorCQkJCQkJICAgIHRhYmxlKTsKKyNpZm5kZWYgQ09ORklHX1dTUF9ERDFfV09SS0FST1VORF9ERDFfVENFX0JVR1MKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwdGJsLT5waGItPmhvc2U7CisjZW5kaWYKKwl1NjQgKnRjZXA7CisKKwkvKiBYWFggTWFrZSB0aGlzIGZhc3RlciBieSBmYWN0b3Jpbmcgb3V0IHRoZSBwYWdlIGFkZHJlc3MgZm9yCisJICogd2l0aGluIGEgVENFIHRhYmxlLiBBbHNvIHVzZSBsaW5lLWtpbGwgb3B0aW9uIHRvIGtpbGwgbXVsdGlwbGUKKwkgKiBUQ0VzIGF0IG9uY2UKKwkgKi8KKwl3aGlsZSAobnBhZ2VzLS0pIHsKKwkJLyogV2UgZG9uJ3QgdXNlIGl0LT5iYXNlIGFzIHRoZSB0YWJsZSBjYW4gYmUgc2NhdHRlcmVkICovCisJCXRjZXAgPSAodTY0ICopcGFnZV9hZGRyZXNzKHB0YmwtPnRjZXNbaW5kZXggPj4gMTZdKTsKKwkJdGNlcCArPSAoaW5kZXggJiAweGZmZmYpOworCQlkbWFfZGVidWcoIltETUFdIFRDRSAlcCBjbGVhcmVkXG4iLCB0Y2VwKTsKKwkJKnRjZXAgPSAwOworI2lmbmRlZiBDT05GSUdfV1NQX0REMV9XT1JLQVJPVU5EX0REMV9UQ0VfQlVHUworCQkvKiBEb24ndCB3cml0ZSB0aGVyZSBzaW5jZSBpdCB3b3VsZCBwb2xsdXRlIG90aGVyIE1NSU8gYWNjZXNzZXMgKi8KKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19UQ0VfS0lMTCwKKwkJCSBQQ0lFX1JFR19UQ0VLSUxMX1NJTkdMRSB8IFBDSUVfUkVHX1RDRUtJTExfUFNfNEsgfAorCQkJIChfX3BhKHRjZXApICYgUENJRV9SRUdfVENFS0lMTF9BRERSX01BU0spKTsKKyNlbmRpZgorCQlpbmRleCsrOworCX0KK30KKworc3RhdGljIHN0cnVjdCB3c3BfZG1hX3RhYmxlICp3c3BfcGNpX2NyZWF0ZV9kbWEzMl90YWJsZShzdHJ1Y3Qgd3NwX3BoYiAqcGhiLAorCQkJCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVnaW9uLAorCQkJCQkJCSAgICBzdHJ1Y3QgcGNpX2RldiAqdmFsaWRhdGUpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGhiLT5ob3NlOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHBoYi0+ZG1hMzJfcmVnaW9uX3NpemU7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gcGhiLT5kbWEzMl9yZWdpb25fc2l6ZSAqIHJlZ2lvbiArIHBoYi0+ZG1hMzJfYmFzZTsKKwlzdHJ1Y3Qgd3NwX2RtYV90YWJsZSAqdGJsOworCWludCB0dnRzX3Blcl90YWJsZSwgaSwgdHZ0LCBuaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5pZCA9IG9mX25vZGVfdG9fbmlkKHBoYi0+aG9zZS0+ZG4pOworCisJLyogQ2FsY3VsYXRlIGhvdyBtYW55IFRWVHMgYXJlIG5lZWRlZCAqLworCXR2dHNfcGVyX3RhYmxlID0gc2l6ZSAvIDB4MTAwMDAwMDA7CisJaWYgKHR2dHNfcGVyX3RhYmxlID09IDApCisJCXR2dHNfcGVyX3RhYmxlID0gMTsKKworCS8qIENhbGN1bGF0ZSB0aGUgYmFzZSBUVlQgaW5kZXguIFdlIGtub3cgYWxsIHRhYmxlcyBoYXZlIHRoZSBzYW1lCisJICogc2l6ZSBzbyB3ZSBqdXN0IGRvIGEgc2ltcGxlIG11bHRpcGx5IGhlcmUKKwkgKi8KKwl0dnQgPSByZWdpb24gKiB0dnRzX3Blcl90YWJsZTsKKworCXByX2RlYnVnKCIgICAgICAgICBSZWdpb24gOiAlZFxuIiwgcmVnaW9uKTsKKwlwcl9kZWJ1ZygiICAgICAgRE1BIHJhbmdlIDogMHglMDhseC4uMHglMDhseFxuIiwgYWRkciwgYWRkciArIHNpemUgLSAxKTsKKwlwcl9kZWJ1ZygiIE51bWJlciBvZiBUVlRzIDogJWRcbiIsIHR2dHNfcGVyX3RhYmxlKTsKKwlwcl9kZWJ1ZygiICAgICAgIEJhc2UgVFZUIDogJWRcbiIsIHR2dCk7CisJcHJfZGVidWcoIiAgICAgICAgIE5vZGUgICA6ICVkXG4iLCBuaWQpOworCisJdGJsID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgd3NwX2RtYV90YWJsZSksIEdGUF9LRVJORUwsIG5pZCk7CisJaWYgKCF0YmwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXRibC0+cGhiID0gcGhiOworCisJLyogQ3JlYXRlIGFzIG1hbnkgVFZUcyBhcyBuZWVkZWQsIGVhY2ggcmVwcmVzZW50cyAyNTZNIGF0IG1vc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdHZ0c19wZXJfdGFibGU7IGkrKykgeworCQl1NjQgdHZ0X2RhdGExLCB0dnRfZGF0YTA7CisKKwkJLyogQWxsb2NhdGUgdGFibGUuIFdlIHVzZSBhIDRLIFRDRSBzaXplIGZvciBub3cgYWx3YXlzIHNvCisJCSAqIG9uZSB0YWJsZSBpcyBhbHdheXMgOCAqICgyNThNIC8gNEspID09IDUxMksKKwkJICovCisJCXRibC0+dGNlc1tpXSA9IGFsbG9jX3BhZ2VzX25vZGUobmlkLCBHRlBfS0VSTkVMLCBnZXRfb3JkZXIoMHg4MDAwMCkpOworCQlpZiAodGJsLT50Y2VzW2ldID09IE5VTEwpCisJCQlnb3RvIGZhaWw7CisJCW1lbXNldChwYWdlX2FkZHJlc3ModGJsLT50Y2VzW2ldKSwgMCwgMHg4MDAwMCk7CisKKwkJcHJfZGVidWcoIiBUQ0UgdGFibGUgJWQgYXQgOiAlcFxuIiwgaSwgcGFnZV9hZGRyZXNzKHRibC0+dGNlc1tpXSkpOworCisJCS8qIFRhYmxlIHNpemUuIFdlIGN1cnJlbnRseSBzZXQgaXQgdG8gYmUgdGhlIHdob2xlIDI1Nk0gcmVnaW9uICovCisJCXR2dF9kYXRhMCA9IDJ1bGwgPDwgSU9EQV9UVlQwX1RDRV9UQUJMRV9TSVpFX1NISUZUOworCQkvKiBJTyBwYWdlIHNpemUgc2V0IHRvIDRLICovCisJCXR2dF9kYXRhMSA9IDF1bGwgPDwgSU9EQV9UVlQxX0lPX1BBR0VfU0laRV9TSElGVDsKKwkJLyogU2hpZnQgaW4gdGhlIGFkZHJlc3MgKi8KKwkJdHZ0X2RhdGEwIHw9IF9fcGEocGFnZV9hZGRyZXNzKHRibC0+dGNlc1tpXSkpIDw8IElPREFfVFZUMF9UVEFfU0hJRlQ7CisKKwkJLyogVmFsaWRhdGlvbiBzdHVmZi4gV2Ugb25seSB2YWxpZGF0ZSBmdWxseSBidXMvZGV2L2ZuIGZvciBub3cKKwkJICogb25lIGRheSBtYXliZSB3ZSBjYW4gZ3JvdXAgZGV2aWNlcyBidXQgdGhhdCBpc24ndCB0aGUgY2FzZQorCQkgKiBhdCB0aGUgbW9tZW50CisJCSAqLworCQlpZiAodmFsaWRhdGUpIHsKKwkJCXR2dF9kYXRhMCB8PSBJT0RBX1RWVDBfQlVTTlVNX1ZBTElEX01BU0s7CisJCQl0dnRfZGF0YTAgfD0gdmFsaWRhdGUtPmJ1cy0+bnVtYmVyOworCQkJdHZ0X2RhdGExIHw9IElPREFfVFZUMV9ERVZOVU1fVkFMSUQ7CisJCQl0dnRfZGF0YTEgfD0gKCh1NjQpUENJX1NMT1QodmFsaWRhdGUtPmRldmZuKSkKKwkJCQk8PCBJT0RBX1RWVDFfREVWTlVNX1ZBTFVFX1NISUZUOworCQkJdHZ0X2RhdGExIHw9IElPREFfVFZUMV9GVU5DTlVNX1ZBTElEOworCQkJdHZ0X2RhdGExIHw9ICgodTY0KVBDSV9GVU5DKHZhbGlkYXRlLT5kZXZmbikpCisJCQkJPDwgSU9EQV9UVlQxX0ZVTkNOVU1fVkFMVUVfU0hJRlQ7CisJCX0KKworCQkvKiBYWCBQRSBudW1iZXIgaXMgYWx3YXlzIDAgZm9yIG5vdyAqLworCisJCS8qIFByb2dyYW0gdGhlIHZhbHVlcyB1c2luZyB0aGUgUEhCIGxvY2sgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYi0+bG9jaywgZmxhZ3MpOworCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPREFfQUREUiwKKwkJCSAodHZ0ICsgaSkgfCBQQ0lFX1JFR19JT0RBX0FEX1RCTF9UVlQpOworCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPREFfREFUQTEsIHR2dF9kYXRhMSk7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9EQV9EQVRBMCwgdHZ0X2RhdGEwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiLT5sb2NrLCBmbGFncyk7CisJfQorCisJLyogSW5pdCBiaXRzIGFuZCBwaWVjZXMgKi8KKwl0YmwtPnRhYmxlLml0X2Jsb2Nrc2l6ZSA9IDE2OworCXRibC0+dGFibGUuaXRfb2Zmc2V0ID0gYWRkciA+PiBJT01NVV9QQUdFX1NISUZUOworCXRibC0+dGFibGUuaXRfc2l6ZSA9IHNpemUgPj4gSU9NTVVfUEFHRV9TSElGVDsKKworCS8qCisJICogSXQncyBhbHJlYWR5IGJsYW5rIGJ1dCB3ZSBjbGVhciBpdCBhbnl3YXkuCisJICogQ29uc2lkZXIgYW4gYWRpdGlvbmEgaW50ZXJmYWNlIHRoYXQgbWFrZXMgY2xlYWluZyBvcHRpb25hbAorCSAqLworCWlvbW11X2luaXRfdGFibGUoJnRibC0+dGFibGUsIG5pZCk7CisKKwlsaXN0X2FkZCgmdGJsLT5saW5rLCAmcGhiLT5kbWFfdGFibGVzKTsKKwlyZXR1cm4gdGJsOworCisgZmFpbDoKKwlwcl9kZWJ1ZygiICBGYWlsZWQgdG8gYWxsb2NhdGUgYSAyNTZNIFRDRSB0YWJsZSAhXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgdHZ0c19wZXJfdGFibGU7IGkrKykKKwkJaWYgKHRibC0+dGNlc1tpXSkKKwkJCV9fZnJlZV9wYWdlcyh0YmwtPnRjZXNbaV0sIGdldF9vcmRlcigweDgwMDAwKSk7CisJa2ZyZWUodGJsKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHdzcF9wY2lfZG1hX2Rldl9zZXR1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2X2FyY2hkYXRhICphcmNoZGF0YSA9ICZwZGV2LT5kZXYuYXJjaGRhdGE7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7CisJc3RydWN0IHdzcF9waGIgKnBoYiA9IGhvc2UtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgd3NwX2RtYV90YWJsZSAqdGFibGUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwkvKiBEb24ndCBhc3NpZ24gYW4gaW9tbXUgdGFibGUgdG8gYSBicmlkZ2UgKi8KKwlpZiAocGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkKKwkJcmV0dXJuOworCisJcHJfZGVidWcoIiVzOiBTZXR0aW5nIHVwIERNQS4uLlxuIiwgcGNpX25hbWUocGRldikpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYi0+bG9jaywgZmxhZ3MpOworCisJLyogSWYgb25seSBvbmUgcmVnaW9uLCBjaGVjayBpZiBpdCBhbHJlYWR5IGV4aXN0ICovCisJaWYgKHBoYi0+ZG1hMzJfbnVtX3JlZ2lvbnMgPT0gMSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGItPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnBoYi0+ZG1hX3RhYmxlcykpCisJCQl0YWJsZSA9IHdzcF9wY2lfY3JlYXRlX2RtYTMyX3RhYmxlKHBoYiwgMCwgTlVMTCk7CisJCWVsc2UKKwkJCXRhYmxlID0gbGlzdF9maXJzdF9lbnRyeSgmcGhiLT5kbWFfdGFibGVzLAorCQkJCQkJIHN0cnVjdCB3c3BfZG1hX3RhYmxlLAorCQkJCQkJIGxpbmspOworCX0gZWxzZSB7CisJCS8qIGVsc2UgZmluZCBhIGZyZWUgcmVnaW9uICovCisJCWZvciAoaSA9IDA7IGkgPCBwaGItPmRtYTMyX251bV9yZWdpb25zICYmICF0YWJsZTsgaSsrKSB7CisJCQlpZiAoX190ZXN0X2FuZF9zZXRfYml0KGksICZwaGItPmRtYTMyX21hcCkpCisJCQkJY29udGludWU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGItPmxvY2ssIGZsYWdzKTsKKwkJCXRhYmxlID0gd3NwX3BjaV9jcmVhdGVfZG1hMzJfdGFibGUocGhiLCBpLCBwZGV2KTsKKwkJfQorCX0KKworCS8qIENoZWNrIGlmIHdlIGdvdCBhbiBlcnJvciAqLworCWlmIChJU19FUlIodGFibGUpKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBjcmVhdGUgRE1BIHRhYmxlLCBlcnIgJWxkICFcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgUFRSX0VSUih0YWJsZSkpOworCQlyZXR1cm47CisJfQorCisJLyogT3IgYSB2YWxpZCB0YWJsZSAqLworCWlmICh0YWJsZSkgeworCQlwcl9pbmZvKCIlczogU2V0dXAgaW9tbXU6IDMyLWJpdCBETUEgcmVnaW9uIDB4JTA4bHguLjB4JTA4bHhcbiIsCisJCQlwY2lfbmFtZShwZGV2KSwKKwkJCXRhYmxlLT50YWJsZS5pdF9vZmZzZXQgPDwgSU9NTVVfUEFHRV9TSElGVCwKKwkJCSh0YWJsZS0+dGFibGUuaXRfb2Zmc2V0IDw8IElPTU1VX1BBR0VfU0hJRlQpCisJCQkrIHBoYi0+ZG1hMzJfcmVnaW9uX3NpemUgLSAxKTsKKwkJYXJjaGRhdGEtPmRtYV9kYXRhLmlvbW11X3RhYmxlX2Jhc2UgPSAmdGFibGUtPnRhYmxlOworCQlyZXR1cm47CisJfQorCisJLyogT3Igbm8gcm9vbSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYi0+bG9jaywgZmxhZ3MpOworCXByX2VycigiJXM6IE91dCBvZiBETUEgc3BhY2UgIVxuIiwgcGNpX25hbWUocGRldikpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgd3NwX3BjaWVfY29uZmlndXJlX2h3KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwl1NjQgdmFsOworCWludCBpOworCisjZGVmaW5lIERVTVBfUkVHKHgpIFwKKwlwcl9kZWJ1ZygiJS0zMHMgOiAweCUwMTZsbHhcbiIsICN4LCBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgeCkpCisKKyNpZmRlZiBDT05GSUdfV1NQX0REMV9XT1JLQVJPVU5EX0JBRF9QQ0lFX0NMQVNTCisJLyogV1NQIEREMSBoYXMgYSBib2d1cyBjbGFzcyBjb2RlIGJ5IGRlZmF1bHQgaW4gdGhlIFBDSS1FCisJICogcm9vdCBjb21wbGV4J3MgYnVpbHQtaW4gUDJQIGJyaWRnZSAqLworCXZhbCA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19TWVNfQ0ZHMSk7CisJcHJfZGVidWcoIlBDSS1FIFNZU19DRkcxIDogMHglbGx4XG4iLCB2YWwpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfU1lTX0NGRzEsCisJCSAodmFsICYgflBDSUVfUkVHX1NZU19DRkcxX0NMQVNTX0NPREUpIHwgKFBDSV9DTEFTU19CUklER0VfUENJIDw8IDgpKTsKKwlwcl9kZWJ1ZygiUENJLUUgU1lTX0NGRzEgOiAweCVsbHhcbiIsIGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19TWVNfQ0ZHMSkpOworI2VuZGlmIC8qIENPTkZJR19XU1BfREQxX1dPUktBUk9VTkRfQkFEX1BDSUVfQ0xBU1MgKi8KKworI2lmZGVmIENPTkZJR19XU1BfREQxX1dPUktBUk9VTkRfREQxX1RDRV9CVUdTCisJLyogWFhYIERpc2FibGUgVENFIGNhY2hpbmcsIGl0IGRvZXNuJ3Qgd29yayBvbiBERDEgKi8KKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIDB4ZTUwLAorCQkgaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIDB4ZTUwKSB8ICgzdWxsIDw8IDYyKSk7CisJcHJpbnRrKCJQQ0ktRSBERUJVRyBDT05UUk9MIDUgPSAweCVsbHhcbiIsIGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyAweGU1MCkpOworI2VuZGlmCisKKwkvKiBDb25maWd1cmUgTTMyQSBhbmQgSU8uIElPIGlzIGhhcmQgd2lyZWQgdG8gYmUgMU0gZm9yIG5vdyAqLworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9fQkFTRV9BRERSLCBob3NlLT5pb19iYXNlX3BoeXMpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9fQkFTRV9NQVNLLAorCQkgKH4oaG9zZS0+aW9fcmVzb3VyY2UuZW5kIC0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQpKSAmCisJCSAweDNmZmZmZmZmMDAwdWwpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9fU1RBUlRfQUREUiwgMCB8IDEpOworCisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NMzJBX0JBU0VfQUREUiwKKwkJIGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQpOworCXByaW50aygiV2FudCB0byB3cml0ZSB0byBNMzJBX0JBU0VfTUFTSyA6IDB4JWxseFxuIiwKKwkJICh+KGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uZW5kIC0KKwkJICAgIGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQpKSAmIDB4M2ZmZmZmZjAwMDB1bCk7CisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NMzJBX0JBU0VfTUFTSywKKwkJICh+KGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uZW5kIC0KKwkJICAgIGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQpKSAmIDB4M2ZmZmZmZjAwMDB1bCk7CisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NMzJBX1NUQVJUX0FERFIsCisJCSAoaG9zZS0+bWVtX3Jlc291cmNlc1swXS5zdGFydCAtIGhvc2UtPnBjaV9tZW1fb2Zmc2V0KSB8IDEpOworCisJLyogQ2xlYXIgYWxsIFRWVCBlbnRyaWVzCisJICoKKwkgKiBYWCBNaWdodCBnZXQgVFZUIGNvdW50IGZyb20gZGV2aWNlLXRyZWUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSU9EQV9UVlRfQ09VTlQ7IGkrKykgeworCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPREFfQUREUiwKKwkJCSBQQ0lFX1JFR19JT0RBX0FEX1RCTF9UVlQgfCBpKTsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19JT0RBX0RBVEExLCAwKTsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19JT0RBX0RBVEEwLCAwKTsKKwl9CisKKwkvKiBLaWxsIHRoZSBUQ0UgY2FjaGUgKi8KKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9DT05GSUcsCisJCSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0NPTkZJRykgfAorCQkgUENJRV9SRUdfUEhCQ182NEJfVENFX0VOKTsKKworCS8qIEVuYWJsZSAzMiAmIDY0LWJpdCBNU0lzLCBJTyBzcGFjZSBhbmQgTTMyQSAqLworCXZhbCA9IFBDSUVfUkVHX1BIQkNfMzJCSVRfTVNJX0VOIHwKKwkgICAgICBQQ0lFX1JFR19QSEJDX0lPX0VOIHwKKwkgICAgICBQQ0lFX1JFR19QSEJDXzY0QklUX01TSV9FTiB8CisJICAgICAgUENJRV9SRUdfUEhCQ19NMzJBX0VOOworCWlmIChpb21tdV9pc19vZmYpCisJCXZhbCB8PSBQQ0lFX1JFR19QSEJDX0RNQV9YTEFURV9CWVBBU1M7CisJcHJfZGVidWcoIldpbGwgd3JpdGUgY29uZmlnOiAweCVsbHhcbiIsIHZhbCk7CisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19QSEJfQ09ORklHLCB2YWwpOworCisJLyogRW5hYmxlIGVycm9yIHJlcG9ydGluZyAqLworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgMHhlMDAsCisJCSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgMHhlMDApIHwgMHgwMDA4MDAwMDAwMDAwMDAwdWxsKTsKKworCS8qIE1hc2sgYW4gZXJyb3IgdGhhdCdzIGdlbmVyYXRlZCB3aGVuIGRvaW5nIGNvbmZpZyBzcGFjZSBwcm9iZQorCSAqCisJICogWFhYIE1heWJlIHdlIHNob3VsZCBvbmx5IG1hc2sgaXQgYXJvdW5kIGNvbmZpZyBzcGFjZSBjeWNsZXMuLi4gdGhhdCBvcgorCSAqIGlnbm9yZSBpdCB3aGVuIHdlIGtub3cgd2UgaGFkIGEgY29uZmlnIHNwYWNlIGN5Y2xlIHJlY2VudGx5ID8KKwkgKi8KKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0RNQV9FUlJfU1RBVFVTX01BU0ssIDB4ODAwMDAwMDAwMDAwMDAwMHVsbCk7CisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19ETUFfRVJSMV9TVEFUVVNfTUFTSywgMHg4MDAwMDAwMDAwMDAwMDAwdWxsKTsKKworCS8qIEVuYWJsZSBVVEwgZXJyb3JzLCBmb3Igbm93LCBhbGwgb2YgdGhlbSBnb3QgdG8gVVRMIGlycSAxCisJICoKKwkgKiBXZSBzaW1pbGFyaWx5IG1hc2sgb25lIFVUTCBlcnJvciBjYXVzZWQgYXBwYXJlbnRseSBkdXJpbmcgbm9ybWFsCisJICogcHJvYmluZy4gV2UgYWxzbyBtYXNrIHRoZSBsaW5rIHVwIGVycm9yCisJICovCisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9TWVNfQlVTX0FHRU5UX0VSUl9TRVYsIDApOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfUkNfRVJSX1NFVkVSSVRZLCAwKTsKKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1BDSUVfUE9SVF9FUlJPUl9TRVYsIDApOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfU1lTX0JVU19BR0VOVF9JUlFfRU4sIDB4ZmZmZmZmZmYwMDAwMDAwMHVsbCk7CisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9QQ0lFX1BPUlRfSVJRX0VOLCAweGZmNWZmZmZmMDAwMDAwMDB1bGwpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfRVBfRVJSX0lSUV9FTiwgMHhmZmZmZmZmZjAwMDAwMDAwdWxsKTsKKworCURVTVBfUkVHKFBDSUVfUkVHX0lPX0JBU0VfQUREUik7CisJRFVNUF9SRUcoUENJRV9SRUdfSU9fQkFTRV9NQVNLKTsKKwlEVU1QX1JFRyhQQ0lFX1JFR19JT19TVEFSVF9BRERSKTsKKwlEVU1QX1JFRyhQQ0lFX1JFR19NMzJBX0JBU0VfQUREUik7CisJRFVNUF9SRUcoUENJRV9SRUdfTTMyQV9CQVNFX01BU0spOworCURVTVBfUkVHKFBDSUVfUkVHX00zMkFfU1RBUlRfQUREUik7CisJRFVNUF9SRUcoUENJRV9SRUdfTTMyQl9CQVNFX0FERFIpOworCURVTVBfUkVHKFBDSUVfUkVHX00zMkJfQkFTRV9NQVNLKTsKKwlEVU1QX1JFRyhQQ0lFX1JFR19NMzJCX1NUQVJUX0FERFIpOworCURVTVBfUkVHKFBDSUVfUkVHX002NF9CQVNFX0FERFIpOworCURVTVBfUkVHKFBDSUVfUkVHX002NF9CQVNFX01BU0spOworCURVTVBfUkVHKFBDSUVfUkVHX002NF9TVEFSVF9BRERSKTsKKwlEVU1QX1JFRyhQQ0lFX1JFR19QSEJfQ09ORklHKTsKK30KKworc3RhdGljIHZvaWQgd3NwX3BjaV93YWl0X2lvX2lkbGUoc3RydWN0IHdzcF9waGIgKnBoYiwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXU2NCB2YWw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl2YWwgPSBpbl9iZTY0KHBoYi0+aG9zZS0+Y2ZnX2RhdGEgKyAweGUwOCk7CisJCWlmICgodmFsICYgMHgxOTAwMDAwMDAwMDAwMDAwdWxsKSA9PSAweDAxMDAwMDAwMDAwMDAwMDB1bGwpCisJCQlyZXR1cm47CisJCXVkZWxheSgxKTsKKwl9CisJcHJfd2FybmluZygiUENJIElPIHRpbWVvdXQgb24gZG9tYWluICVkIHBvcnQgMHglbHhcbiIsCisJCSAgIHBoYi0+aG9zZS0+Z2xvYmFsX251bWJlciwgcG9ydCk7Cit9CisKKyNkZWZpbmUgREVGX1BDSV9BQ19SRVRfcGlvKG5hbWUsIHJldCwgYXQsIGFsLCBhYSkJCVwKK3N0YXRpYyByZXQgd3NwX3BjaV8jI25hbWUgYXQJCQkJCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgaW93YV9idXMgKmJ1czsJCQkJCVwKKwlzdHJ1Y3Qgd3NwX3BoYiAqcGhiOwkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQlcCisJcmV0IHJ2YWw7CQkJCQkJXAorCWJ1cyA9IGlvd2FfcGlvX2ZpbmRfYnVzKGFhKTsJCQkJXAorCVdBUk5fT04oIWJ1cyk7CQkJCQkJXAorCXBoYiA9IGJ1cy0+cHJpdmF0ZTsJCQkJCVwKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiLT5sb2NrLCBmbGFncyk7CQkJXAorCXdzcF9wY2lfd2FpdF9pb19pZGxlKHBoYiwgYWEpOwkJCQlcCisJcnZhbCA9IF9fZG9fIyNuYW1lIGFsOwkJCQkJXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYi0+bG9jaywgZmxhZ3MpOwkJXAorCXJldHVybiBydmFsOwkJCQkJCVwKK30KKworI2RlZmluZSBERUZfUENJX0FDX05PUkVUX3BpbyhuYW1lLCBhdCwgYWwsIGFhKQkJCVwKK3N0YXRpYyB2b2lkIHdzcF9wY2lfIyNuYW1lIGF0CQkJCQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGlvd2FfYnVzICpidXM7CQkJCQlcCisJc3RydWN0IHdzcF9waGIgKnBoYjsJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkJXAorCWJ1cyA9IGlvd2FfcGlvX2ZpbmRfYnVzKGFhKTsJCQkJXAorCVdBUk5fT04oIWJ1cyk7CQkJCQkJXAorCXBoYiA9IGJ1cy0+cHJpdmF0ZTsJCQkJCVwKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiLT5sb2NrLCBmbGFncyk7CQkJXAorCXdzcF9wY2lfd2FpdF9pb19pZGxlKHBoYiwgYWEpOwkJCQlcCisJX19kb18jI25hbWUgYWw7CQkJCQkJXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYi0+bG9jaywgZmxhZ3MpOwkJXAorfQorCisjZGVmaW5lIERFRl9QQ0lfQUNfUkVUX21lbShuYW1lLCByZXQsIGF0LCBhbCwgYWEpCisjZGVmaW5lIERFRl9QQ0lfQUNfTk9SRVRfbWVtKG5hbWUsIGF0LCBhbCwgYWEpCisKKyNkZWZpbmUgREVGX1BDSV9BQ19SRVQobmFtZSwgcmV0LCBhdCwgYWwsIHNwYWNlLCBhYSkJCVwKKwlERUZfUENJX0FDX1JFVF8jI3NwYWNlKG5hbWUsIHJldCwgYXQsIGFsLCBhYSkKKworI2RlZmluZSBERUZfUENJX0FDX05PUkVUKG5hbWUsIGF0LCBhbCwgc3BhY2UsIGFhKQkJXAorCURFRl9QQ0lfQUNfTk9SRVRfIyNzcGFjZShuYW1lLCBhdCwgYWwsIGFhKQkJXAorCisKKyNpbmNsdWRlIDxhc20vaW8tZGVmcy5oPgorCisjdW5kZWYgREVGX1BDSV9BQ19SRVQKKyN1bmRlZiBERUZfUENJX0FDX05PUkVUCisKK3N0YXRpYyBzdHJ1Y3QgcHBjX3BjaV9pbyB3c3BfcGNpX2lvcHMgPSB7CisJLmluYiA9IHdzcF9wY2lfaW5iLAorCS5pbncgPSB3c3BfcGNpX2ludywKKwkuaW5sID0gd3NwX3BjaV9pbmwsCisJLm91dGIgPSB3c3BfcGNpX291dGIsCisJLm91dHcgPSB3c3BfcGNpX291dHcsCisJLm91dGwgPSB3c3BfcGNpX291dGwsCisJLmluc2IgPSB3c3BfcGNpX2luc2IsCisJLmluc3cgPSB3c3BfcGNpX2luc3csCisJLmluc2wgPSB3c3BfcGNpX2luc2wsCisJLm91dHNiID0gd3NwX3BjaV9vdXRzYiwKKwkub3V0c3cgPSB3c3BfcGNpX291dHN3LAorCS5vdXRzbCA9IHdzcF9wY2lfb3V0c2wsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3c3Bfc2V0dXBfb25lX3BoYihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3Qgd3NwX3BoYiAqcGhiOworCisJcHJfaW5mbygiUENJOiBTZXR0aW5nIHVwIFBDSWUgaG9zdCBicmlkZ2UgMHglc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisKKwlwaGIgPSB6YWxsb2NfbWF5YmVfYm9vdG1lbShzaXplb2Yoc3RydWN0IHdzcF9waGIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBoYikKKwkJcmV0dXJuIC1FTk9NRU07CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihucCk7CisJaWYgKCFob3NlKSB7CisJCS8qIENhbid0IHJlYWxseSBmcmVlIHRoZSBwaGIgKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWhvc2UtPnByaXZhdGVfZGF0YSA9IHBoYjsKKwlwaGItPmhvc2UgPSBob3NlOworCisJSU5JVF9MSVNUX0hFQUQoJnBoYi0+ZG1hX3RhYmxlcyk7CisJc3Bpbl9sb2NrX2luaXQoJnBoYi0+bG9jayk7CisKKwkvKiBYWFggVXNlIGJ1cy1yYW5nZSBwcm9wZXJ0eSA/ICovCisJaG9zZS0+Zmlyc3RfYnVzbm8gPSAwOworCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCisJLyogV2UgdXNlIGNmZ19kYXRhIGFzIHRoZSBhZGRyZXNzIGZvciB0aGUgd2hvbGUgYnJpZGdlIE1NSU8gc3BhY2UKKwkgKi8KKwlob3NlLT5jZmdfZGF0YSA9IG9mX2lvbWFwKGhvc2UtPmRuLCAwKTsKKworCXByX2RlYnVnKCJQQ0llIHJlZ2lzdGVycyBtYXBwZWQgYXQgMHglcFxuIiwgaG9zZS0+Y2ZnX2RhdGEpOworCisJLyogR2V0IHRoZSByYW5nZXMgb2YgdGhlIGRldmljZS10cmVlICovCisJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3Jhbmdlcyhob3NlLCBucCwgMCk7CisKKwkvKiBYWFggRm9yY2UgcmUtYXNzaWduaW5nIG9mIGV2ZXJ5dGhpbmcgZm9yIG5vdyAqLworCXBjaV9hZGRfZmxhZ3MoUENJX1JFQVNTSUdOX0FMTF9CVVMgfCBQQ0lfUkVBU1NJR05fQUxMX1JTUkMgfAorCQkgICAgICBQQ0lfRU5BQkxFX1BST0NfRE9NQUlOUyk7CisJcGNpX3Byb2JlX29ubHkgPSAwOworCisJLyogQ2FsY3VsYXRlIGhvdyB0aGUgVENFIHNwYWNlIGlzIGRpdmlkZWQgKi8KKwlwaGItPmRtYTMyX2Jhc2UJCT0gMDsKKwlwaGItPmRtYTMyX251bV9yZWdpb25zCT0gTlVNX0RNQTMyX1JFR0lPTlM7CisJaWYgKHBoYi0+ZG1hMzJfbnVtX3JlZ2lvbnMgPiBNQVhfVEFCTEVfVFZUX0NPVU5UKSB7CisJCXByX3dhcm5pbmcoIklPTU1VOiBDbGFtcGVkIHRvICVkIERNQTMyIHJlZ2lvbnNcbiIsCisJCQkgICBNQVhfVEFCTEVfVFZUX0NPVU5UKTsKKwkJcGhiLT5kbWEzMl9udW1fcmVnaW9ucyA9IE1BWF9UQUJMRV9UVlRfQ09VTlQ7CisJfQorCXBoYi0+ZG1hMzJfcmVnaW9uX3NpemUJPSAweDgwMDAwMDAwIC8gcGhiLT5kbWEzMl9udW1fcmVnaW9uczsKKworCUJVR19PTighaXNfcG93ZXJfb2ZfMihwaGItPmRtYTMyX3JlZ2lvbl9zaXplKSk7CisKKwkvKiBTZXR1cCBjb25maWcgb3BzICovCisJaG9zZS0+b3BzID0gJndzcF9wY2llX3BjaV9vcHM7CisKKwkvKiBDb25maWd1cmUgdGhlIEhXICovCisJd3NwX3BjaWVfY29uZmlndXJlX2h3KGhvc2UpOworCisJLyogSW5zdGFuY2lhdGUgSU8gd29ya2Fyb3VuZHMgKi8KKwlpb3dhX3JlZ2lzdGVyX2J1cyhob3NlLCAmd3NwX3BjaV9pb3BzLCBOVUxMLCBwaGIpOworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJd3NwX3NldHVwX3BoYl9tc2koaG9zZSk7CisjZW5kaWYKKworCS8qIEFkZCB0byBnbG9iYWwgbGlzdCAqLworCWxpc3RfYWRkKCZwaGItPmFsbCwgJndzcF9waGJzKTsKKworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCB3c3Bfc2V0dXBfcGNpKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlpbnQgcmM7CisKKwkvKiBGaW5kIGhvc3QgYnJpZGdlcyAqLworCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaWV4IiwgUENJRV9DT01QQVRJQkxFKSB7CisJCXJjID0gd3NwX3NldHVwX29uZV9waGIobnApOworCQlpZiAocmMpCisJCQlwcl9lcnIoIkZhaWxlZCB0byBzZXR1cCBQQ0llIGJyaWRnZSAlcywgcmM9JWRcbiIsCisJCQkgICAgICAgbnAtPmZ1bGxfbmFtZSwgcmMpOworCX0KKworCS8qIEVzdGFibGlzaCBkZXZpY2UtdHJlZSBsaW5rYWdlICovCisJcGNpX2RldnNfcGhiX2luaXQoKTsKKworCS8qIFNldCBETUEgb3BzIHRvIHVzZSBUQ0VzICovCisJaWYgKGlvbW11X2lzX29mZikgeworCQlwcl9pbmZvKCJQQ0ktRTogRGlzYWJsZWQgVENFcywgdXNpbmcgZGlyZWN0IERNQVxuIik7CisJCXNldF9wY2lfZG1hX29wcygmZG1hX2RpcmVjdF9vcHMpOworCX0gZWxzZSB7CisJCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IHdzcF9wY2lfZG1hX2Rldl9zZXR1cDsKKwkJcHBjX21kLnRjZV9idWlsZCA9IHRjZV9idWlsZF93c3A7CisJCXBwY19tZC50Y2VfZnJlZSA9IHRjZV9mcmVlX3dzcDsKKwkJc2V0X3BjaV9kbWFfb3BzKCZkbWFfaW9tbXVfb3BzKTsKKwl9Cit9CisKKyNkZWZpbmUgZXJyX2RlYnVnKGZtdC4uLikJcHJfZGVidWcoZm10KQorLy8jZGVmaW5lIGVycl9kZWJ1ZyhmbXQuLi4pCisKK3N0YXRpYyBpbnQgX19pbml0IHdzcF9wY2lfZ2V0X2Vycl9pcnFfbm9fZHQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwljb25zdCB1MzIgKnByb3A7CisJaW50IGh3X2lycTsKKworCS8qIE9rLCBubyBpbnRlcnJ1cHRzIHByb3BlcnR5LCBsZXQncyB0cnkgdG8gZmluZCBvdXIgY2hpbGQgUDJQICovCisJbnAgPSBvZl9nZXRfbmV4dF9jaGlsZChucCwgTlVMTCk7CisJaWYgKG5wID09IE5VTEwpCisJCXJldHVybiAwOworCisJLyogR3JhYiBpdCdzIGludGVycnVwdCBtYXAgKi8KKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaW50ZXJydXB0LW1hcCIsIE5VTEwpOworCWlmIChwcm9wID09IE5VTEwpCisJCXJldHVybiAwOworCisJLyogR3JhYiBvbmUgb2YgdGhlIGludGVycnVwdHMgaW4gdGhlcmUsIGtlZXAgdGhlIGxvdyA0IGJpdHMgKi8KKwlod19pcnEgPSBwcm9wWzVdICYgMHhmOworCisJLyogMC4uNCBmb3IgUEhCIDAgYW5kIDUuLjkgZm9yIFBIQiAxICovCisJaWYgKGh3X2lycSA8IDUpCisJCWh3X2lycSA9IDQ7CisJZWxzZQorCQlod19pcnEgPSA5OworCWh3X2lycSB8PSBwcm9wWzVdICYgfjB4ZjsKKworCWVycl9kZWJ1ZygiUENJOiBVc2luZyAweCV4IGFzIGVycm9yIElSUSBmb3IgJXNcbiIsCisJCSAgaHdfaXJxLCBucC0+cGFyZW50LT5mdWxsX25hbWUpOworCXJldHVybiBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgaHdfaXJxKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTMyIG9mZnNldDsKKwljb25zdCBjaGFyICpuYW1lOworfSB3c3BfcGNpX3JlZ3NbXSA9IHsKKyNkZWZpbmUgRFJFRyh4KSB7IFBDSUVfUkVHXyMjeCwgI3ggfQorI2RlZmluZSBEVVRMKHgpIHsgUENJRV9VVExfIyN4LCAiVVRMXyIgI3ggfQorCS8qIEFyY2hpdGVjdGVkIHJlZ2lzdGVycyBleGNlcHQgQ09ORklHXyBhbmQgSU9EQQorICAgICAgICAgKiB0byBhdm9pZCBzaWRlIGVmZmVjdHMKKwkgKi8KKwlEUkVHKERNQV9DSEFOX1NUQVRVUyksCisJRFJFRyhDUFVfTE9BRFNUT1JFX1NUQVRVUyksCisJRFJFRyhMT0NLMCksCisJRFJFRyhMT0NLMSksCisJRFJFRyhQSEJfQ09ORklHKSwKKwlEUkVHKElPX0JBU0VfQUREUiksCisJRFJFRyhJT19CQVNFX01BU0spLAorCURSRUcoSU9fU1RBUlRfQUREUiksCisJRFJFRyhNMzJBX0JBU0VfQUREUiksCisJRFJFRyhNMzJBX0JBU0VfTUFTSyksCisJRFJFRyhNMzJBX1NUQVJUX0FERFIpLAorCURSRUcoTTMyQl9CQVNFX0FERFIpLAorCURSRUcoTTMyQl9CQVNFX01BU0spLAorCURSRUcoTTMyQl9TVEFSVF9BRERSKSwKKwlEUkVHKE02NF9CQVNFX0FERFIpLAorCURSRUcoTTY0X0JBU0VfTUFTSyksCisJRFJFRyhNNjRfU1RBUlRfQUREUiksCisJRFJFRyhUQ0VfS0lMTCksCisJRFJFRyhMT0NLMiksCisJRFJFRyhQSEJfR0VOX0NBUCksCisJRFJFRyhQSEJfVENFX0NBUCksCisJRFJFRyhQSEJfSVJRX0NBUCksCisJRFJFRyhQSEJfRUVIX0NBUCksCisJRFJFRyhQQVBSX0VSUl9JTkpfQ09OVFJPTCksCisJRFJFRyhQQVBSX0VSUl9JTkpfQUREUiksCisJRFJFRyhQQVBSX0VSUl9JTkpfTUFTSyksCisKKwkvKiBVVEwgY29yZSByZWdzICovCisJRFVUTChTWVNfQlVTX0NPTlRST0wpLAorCURVVEwoU1RBVFVTKSwKKwlEVVRMKFNZU19CVVNfQUdFTlRfU1RBVFVTKSwKKwlEVVRMKFNZU19CVVNfQUdFTlRfRVJSX1NFViksCisJRFVUTChTWVNfQlVTX0FHRU5UX0lSUV9FTiksCisJRFVUTChTWVNfQlVTX0JVUlNUX1NaX0NPTkYpLAorCURVVEwoUkVWSVNJT05fSUQpLAorCURVVEwoT1VUX1BPU1RfSERSX0JVRl9BTExPQyksCisJRFVUTChPVVRfUE9TVF9EQVRfQlVGX0FMTE9DKSwKKwlEVVRMKElOX1BPU1RfSERSX0JVRl9BTExPQyksCisJRFVUTChJTl9QT1NUX0RBVF9CVUZfQUxMT0MpLAorCURVVEwoT1VUX05QX0JVRl9BTExPQyksCisJRFVUTChJTl9OUF9CVUZfQUxMT0MpLAorCURVVEwoUENJRV9UQUdTX0FMTE9DKSwKKwlEVVRMKEdCSUZfUkVBRF9UQUdTX0FMTE9DKSwKKworCURVVEwoUENJRV9QT1JUX0NPTlRST0wpLAorCURVVEwoUENJRV9QT1JUX1NUQVRVUyksCisJRFVUTChQQ0lFX1BPUlRfRVJST1JfU0VWKSwKKwlEVVRMKFBDSUVfUE9SVF9JUlFfRU4pLAorCURVVEwoUkNfU1RBVFVTKSwKKwlEVVRMKFJDX0VSUl9TRVZFUklUWSksCisJRFVUTChSQ19JUlFfRU4pLAorCURVVEwoRVBfU1RBVFVTKSwKKwlEVVRMKEVQX0VSUl9TRVZFUklUWSksCisJRFVUTChFUF9FUlJfSVJRX0VOKSwKKwlEVVRMKFBDSV9QTV9DVFJMMSksCisJRFVUTChQQ0lfUE1fQ1RSTDIpLAorCisJLyogUENJZSBzdGFjayByZWdzICovCisJRFJFRyhTWVNURU1fQ09ORklHMSksCisJRFJFRyhTWVNURU1fQ09ORklHMiksCisJRFJFRyhFUF9TWVNURU1fQ09ORklHKSwKKwlEUkVHKEVQX0ZMUiksCisJRFJFRyhFUF9CQVJfQ09ORklHKSwKKwlEUkVHKExJTktfQ09ORklHKSwKKwlEUkVHKFBNX0NPTkZJRyksCisJRFJFRyhETFBfQ09OVFJPTCksCisJRFJFRyhETFBfU1RBVFVTKSwKKwlEUkVHKEVSUl9SRVBPUlRfQ09OVFJPTCksCisJRFJFRyhTTE9UX0NPTlRST0wxKSwKKwlEUkVHKFNMT1RfQ09OVFJPTDIpLAorCURSRUcoVVRMX0NPTkZJRyksCisJRFJFRyhCVUZGRVJTX0NPTkZJRyksCisJRFJFRyhFUlJPUl9JTkpFQ1QpLAorCURSRUcoU1JJT1ZfQ09ORklHKSwKKwlEUkVHKFBGMF9TUklPVl9TVEFUVVMpLAorCURSRUcoUEYxX1NSSU9WX1NUQVRVUyksCisJRFJFRyhQT1JUX05VTUJFUiksCisJRFJFRyhQT1JfU1lTVEVNX0NPTkZJRyksCisKKwkvKiBJbnRlcm5hbCBsb2dpYyByZWdzICovCisJRFJFRyhQSEJfVkVSU0lPTiksCisJRFJFRyhSRVNFVCksCisJRFJFRyhQSEJfQ09OVFJPTCksCisJRFJFRyhQSEJfVElNRU9VVF9DT05UUk9MMSksCisJRFJFRyhQSEJfUVVJRVNDRV9ETUEpLAorCURSRUcoUEhCX0RNQV9SRUFEX1RBR19BQ1RWKSwKKwlEUkVHKFBIQl9UQ0VfUkVBRF9UQUdfQUNUViksCisKKwkvKiBGSVIgcmVnaXN0ZXJzICovCisJRFJFRyhMRU1fRklSX0FDQ1VNKSwKKwlEUkVHKExFTV9GSVJfQU5EX01BU0spLAorCURSRUcoTEVNX0ZJUl9PUl9NQVNLKSwKKwlEUkVHKExFTV9BQ1RJT04wKSwKKwlEUkVHKExFTV9BQ1RJT04xKSwKKwlEUkVHKExFTV9FUlJPUl9NQVNLKSwKKwlEUkVHKExFTV9FUlJPUl9BTkRfTUFTSyksCisJRFJFRyhMRU1fRVJST1JfT1JfTUFTSyksCisKKwkvKiBFcnJvciB0cmFwcyByZWdpc3RlcnMgKi8KKwlEUkVHKFBIQl9FUlJfU1RBVFVTKSwKKwlEUkVHKFBIQl9FUlJfU1RBVFVTKSwKKwlEUkVHKFBIQl9FUlIxX1NUQVRVUyksCisJRFJFRyhQSEJfRVJSX0lOSkVDVCksCisJRFJFRyhQSEJfRVJSX0xFTV9FTkFCTEUpLAorCURSRUcoUEhCX0VSUl9JUlFfRU5BQkxFKSwKKwlEUkVHKFBIQl9FUlJfRlJFRVpFX0VOQUJMRSksCisJRFJFRyhQSEJfRVJSX1NJREVfRU5BQkxFKSwKKwlEUkVHKFBIQl9FUlJfTE9HXzApLAorCURSRUcoUEhCX0VSUl9MT0dfMSksCisJRFJFRyhQSEJfRVJSX1NUQVRVU19NQVNLKSwKKwlEUkVHKFBIQl9FUlIxX1NUQVRVU19NQVNLKSwKKwlEUkVHKE1NSU9fRVJSX1NUQVRVUyksCisJRFJFRyhNTUlPX0VSUjFfU1RBVFVTKSwKKwlEUkVHKE1NSU9fRVJSX0lOSkVDVCksCisJRFJFRyhNTUlPX0VSUl9MRU1fRU5BQkxFKSwKKwlEUkVHKE1NSU9fRVJSX0lSUV9FTkFCTEUpLAorCURSRUcoTU1JT19FUlJfRlJFRVpFX0VOQUJMRSksCisJRFJFRyhNTUlPX0VSUl9TSURFX0VOQUJMRSksCisJRFJFRyhNTUlPX0VSUl9MT0dfMCksCisJRFJFRyhNTUlPX0VSUl9MT0dfMSksCisJRFJFRyhNTUlPX0VSUl9TVEFUVVNfTUFTSyksCisJRFJFRyhNTUlPX0VSUjFfU1RBVFVTX01BU0spLAorCURSRUcoRE1BX0VSUl9TVEFUVVMpLAorCURSRUcoRE1BX0VSUjFfU1RBVFVTKSwKKwlEUkVHKERNQV9FUlJfSU5KRUNUKSwKKwlEUkVHKERNQV9FUlJfTEVNX0VOQUJMRSksCisJRFJFRyhETUFfRVJSX0lSUV9FTkFCTEUpLAorCURSRUcoRE1BX0VSUl9GUkVFWkVfRU5BQkxFKSwKKwlEUkVHKERNQV9FUlJfU0lERV9FTkFCTEUpLAorCURSRUcoRE1BX0VSUl9MT0dfMCksCisJRFJFRyhETUFfRVJSX0xPR18xKSwKKwlEUkVHKERNQV9FUlJfU1RBVFVTX01BU0spLAorCURSRUcoRE1BX0VSUjFfU1RBVFVTX01BU0spLAorCisJLyogRGVidWcgYW5kIFRyYWNlIHJlZ2lzdGVycyAqLworCURSRUcoUEhCX0RFQlVHX0NPTlRST0wwKSwKKwlEUkVHKFBIQl9ERUJVR19TVEFUVVMwKSwKKwlEUkVHKFBIQl9ERUJVR19DT05UUk9MMSksCisJRFJFRyhQSEJfREVCVUdfU1RBVFVTMSksCisJRFJFRyhQSEJfREVCVUdfQ09OVFJPTDIpLAorCURSRUcoUEhCX0RFQlVHX1NUQVRVUzIpLAorCURSRUcoUEhCX0RFQlVHX0NPTlRST0wzKSwKKwlEUkVHKFBIQl9ERUJVR19TVEFUVVMzKSwKKwlEUkVHKFBIQl9ERUJVR19DT05UUk9MNCksCisJRFJFRyhQSEJfREVCVUdfU1RBVFVTNCksCisJRFJFRyhQSEJfREVCVUdfQ09OVFJPTDUpLAorCURSRUcoUEhCX0RFQlVHX1NUQVRVUzUpLAorCisJLyogRG9uJ3Qgc2VlbSB0byBleGlzdCAuLi4KKwlEUkVHKFBIQl9ERUJVR19DT05UUk9MNiksCisJRFJFRyhQSEJfREVCVUdfU1RBVFVTNiksCisJKi8KK307CisKK3N0YXRpYyBpbnQgd3NwX3BjaV9yZWdzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCB3c3BfcGhiICpwaGIgPSBtLT5wcml2YXRlOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBoYi0+aG9zZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdzcF9wY2lfcmVncyk7IGkrKykgeworCQkvKiBTa2lwIHdyaXRlLW9ubHkgcmVncyAqLworCQlpZiAod3NwX3BjaV9yZWdzW2ldLm9mZnNldCA9PSAweGMwOCB8fAorCQkgICAgd3NwX3BjaV9yZWdzW2ldLm9mZnNldCA9PSAweGMxMCB8fAorCQkgICAgd3NwX3BjaV9yZWdzW2ldLm9mZnNldCA9PSAweGMzOCB8fAorCQkgICAgd3NwX3BjaV9yZWdzW2ldLm9mZnNldCA9PSAweGM0MCkKKwkJCWNvbnRpbnVlOworCQlzZXFfcHJpbnRmKG0sICIweCUwM3g6IDB4JTAxNmxseCAlc1xuIiwKKwkJCSAgIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQsCisJCQkgICBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgd3NwX3BjaV9yZWdzW2ldLm9mZnNldCksCisJCQkgICB3c3BfcGNpX3JlZ3NbaV0ubmFtZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzcF9wY2lfcmVnc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB3c3BfcGNpX3JlZ3Nfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdzcF9wY2lfcmVnc19mb3BzID0geworCS5vcGVuID0gd3NwX3BjaV9yZWdzX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHdzcF9wY2lfcmVnX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCW91dF9iZTY0KCh2b2lkIF9faW9tZW0gKilkYXRhLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzcF9wY2lfcmVnX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwkqdmFsID0gaW5fYmU2NCgodm9pZCBfX2lvbWVtICopZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHdzcF9wY2lfcmVnX2ZvcHMsIHdzcF9wY2lfcmVnX2dldCwgd3NwX3BjaV9yZWdfc2V0LCAiMHglbGx4XG4iKTsKKworc3RhdGljIGlycXJldHVybl90IHdzcF9wY2lfZXJyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHdzcF9waGIgKnBoYiA9IGRldl9pZDsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwaGItPmhvc2U7CisJaXJxcmV0dXJuX3QgaGFuZGxlZCA9IElSUV9OT05FOworCXN0cnVjdCB3c3BfcGNpZV9lcnJfbG9nX2RhdGEgZWQ7CisKKwlwcl9lcnIoIlBDSTogRXJyb3IgaW50ZXJydXB0IG9uICVzIChQSEIgJWQpXG4iLAorCSAgICAgICBob3NlLT5kbi0+ZnVsbF9uYW1lLCBob3NlLT5nbG9iYWxfbnVtYmVyKTsKKyBhZ2FpbjoKKwltZW1zZXQoJmVkLCAwLCBzaXplb2YoZWQpKTsKKworCS8qIFJlYWQgYW5kIGNsZWFyIFVUTCBlcnJvcnMgKi8KKwllZC51dGxfc3lzX2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9TWVNfQlVTX0FHRU5UX1NUQVRVUyk7CisJaWYgKGVkLnV0bF9zeXNfZXJyKQorCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1NZU19CVVNfQUdFTlRfU1RBVFVTLCBlZC51dGxfc3lzX2Vycik7CisJZWQudXRsX3BvcnRfZXJyID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1BDSUVfUE9SVF9TVEFUVVMpOworCWlmIChlZC51dGxfcG9ydF9lcnIpCisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfUENJRV9QT1JUX1NUQVRVUywgZWQudXRsX3BvcnRfZXJyKTsKKwllZC51dGxfcmNfZXJyID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1JDX1NUQVRVUyk7CisJaWYgKGVkLnV0bF9yY19lcnIpCisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfUkNfU1RBVFVTLCBlZC51dGxfcmNfZXJyKTsKKworCS8qIFJlYWQgYW5kIGNsZWFyIG1haW4gdHJhcCBlcnJvcnMgKi8KKwllZC5waGJfZXJyID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9FUlJfU1RBVFVTKTsKKwlpZiAoZWQucGhiX2VycikgeworCQllZC5waGJfZXJyMSA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19QSEJfRVJSMV9TVEFUVVMpOworCQllZC5waGJfbG9nMCA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19QSEJfRVJSX0xPR18wKTsKKwkJZWQucGhiX2xvZzEgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0VSUl9MT0dfMSk7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0VSUjFfU1RBVFVTLCAwKTsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19QSEJfRVJSX1NUQVRVUywgMCk7CisJfQorCWVkLm1taW9fZXJyID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX01NSU9fRVJSX1NUQVRVUyk7CisJaWYgKGVkLm1taW9fZXJyKSB7CisJCWVkLm1taW9fZXJyMSA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NTUlPX0VSUjFfU1RBVFVTKTsKKwkJZWQubW1pb19sb2cwID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX01NSU9fRVJSX0xPR18wKTsKKwkJZWQubW1pb19sb2cxID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX01NSU9fRVJSX0xPR18xKTsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NTUlPX0VSUjFfU1RBVFVTLCAwKTsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NTUlPX0VSUl9TVEFUVVMsIDApOworCX0KKwllZC5kbWFfZXJyID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0RNQV9FUlJfU1RBVFVTKTsKKwlpZiAoZWQuZG1hX2VycikgeworCQllZC5kbWFfZXJyMSA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19ETUFfRVJSMV9TVEFUVVMpOworCQllZC5kbWFfbG9nMCA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19ETUFfRVJSX0xPR18wKTsKKwkJZWQuZG1hX2xvZzEgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUl9MT0dfMSk7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUjFfU1RBVFVTLCAwKTsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19ETUFfRVJSX1NUQVRVUywgMCk7CisJfQorCisJLyogTm93IHByaW50IHRoaW5ncyBvdXQgKi8KKwlpZiAoZWQucGhiX2VycikgeworCQlwcl9lcnIoIiAgIFBIQiBFcnJvciBTdGF0dXMgICAgICA6IDB4JTAxNmxseFxuIiwgZWQucGhiX2Vycik7CisJCXByX2VycigiICAgUEhCIEZpcnN0IEVycm9yIFN0YXR1czogMHglMDE2bGx4XG4iLCBlZC5waGJfZXJyMSk7CisJCXByX2VycigiICAgUEhCIEVycm9yIExvZyAwICAgICAgIDogMHglMDE2bGx4XG4iLCBlZC5waGJfbG9nMCk7CisJCXByX2VycigiICAgUEhCIEVycm9yIExvZyAxICAgICAgIDogMHglMDE2bGx4XG4iLCBlZC5waGJfbG9nMSk7CisJfQorCWlmIChlZC5tbWlvX2VycikgeworCQlwcl9lcnIoIiAgTU1JTyBFcnJvciBTdGF0dXMgICAgICA6IDB4JTAxNmxseFxuIiwgZWQubW1pb19lcnIpOworCQlwcl9lcnIoIiAgTU1JTyBGaXJzdCBFcnJvciBTdGF0dXM6IDB4JTAxNmxseFxuIiwgZWQubW1pb19lcnIxKTsKKwkJcHJfZXJyKCIgIE1NSU8gRXJyb3IgTG9nIDAgICAgICAgOiAweCUwMTZsbHhcbiIsIGVkLm1taW9fbG9nMCk7CisJCXByX2VycigiICBNTUlPIEVycm9yIExvZyAxICAgICAgIDogMHglMDE2bGx4XG4iLCBlZC5tbWlvX2xvZzEpOworCX0KKwlpZiAoZWQuZG1hX2VycikgeworCQlwcl9lcnIoIiAgIERNQSBFcnJvciBTdGF0dXMgICAgICA6IDB4JTAxNmxseFxuIiwgZWQuZG1hX2Vycik7CisJCXByX2VycigiICAgRE1BIEZpcnN0IEVycm9yIFN0YXR1czogMHglMDE2bGx4XG4iLCBlZC5kbWFfZXJyMSk7CisJCXByX2VycigiICAgRE1BIEVycm9yIExvZyAwICAgICAgIDogMHglMDE2bGx4XG4iLCBlZC5kbWFfbG9nMCk7CisJCXByX2VycigiICAgRE1BIEVycm9yIExvZyAxICAgICAgIDogMHglMDE2bGx4XG4iLCBlZC5kbWFfbG9nMSk7CisJfQorCWlmIChlZC51dGxfc3lzX2VycikKKwkJcHJfZXJyKCIgICBVVEwgU3lzIEVycm9yIFN0YXR1cyAgOiAweCUwMTZsbHhcbiIsIGVkLnV0bF9zeXNfZXJyKTsKKwlpZiAoZWQudXRsX3BvcnRfZXJyKQorCQlwcl9lcnIoIiAgIFVUTCBQb3J0IEVycm9yIFN0YXR1cyA6IDB4JTAxNmxseFxuIiwgZWQudXRsX3BvcnRfZXJyKTsKKwlpZiAoZWQudXRsX3JjX2VycikKKwkJcHJfZXJyKCIgICBVVEwgUkMgRXJyb3IgU3RhdHVzICAgOiAweCUwMTZsbHhcbiIsIGVkLnV0bF9yY19lcnIpOworCisJLyogSW50ZXJydXB0cyBhcmUgY2F1c2VkIGJ5IHRoZSBlcnJvciB0cmFwcy4gSWYgd2UgaGFkIGFueSBlcnJvciB0aGVyZQorCSAqIHdlIGxvb3AgYWdhaW4gaW4gY2FzZSB0aGUgVVRMIGJ1ZmZlcmVkIHNvbWUgbmV3IHN0dWZmIGJldHdlZW4KKwkgKiBnb2luZyB0aGVyZSBhbmQgZ29pbmcgdG8gdGhlIHRyYXBzCisJICovCisJaWYgKGVkLmRtYV9lcnIgfHwgZWQubW1pb19lcnIgfHwgZWQucGhiX2VycikgeworCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisJCWdvdG8gYWdhaW47CisJfQorCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgd3NwX3NldHVwX3BjaV9lcnJfcmVwb3J0aW5nKHN0cnVjdCB3c3BfcGhiICpwaGIpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGhiLT5ob3NlOworCWludCBlcnJfaXJxLCBpLCByYzsKKwljaGFyIGZuYW1lWzE2XTsKKworCS8qIENyZWF0ZSBhIGRlYnVnZnMgZmlsZSBmb3IgdGhhdCBQSEIgKi8KKwlzcHJpbnRmKGZuYW1lLCAicGhiJWQiLCBwaGItPmhvc2UtPmdsb2JhbF9udW1iZXIpOworCXBoYi0+ZGRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihmbmFtZSwgcG93ZXJwY19kZWJ1Z2ZzX3Jvb3QpOworCisJLyogU29tZSB1c2VmdWwgZGVidWcgb3V0cHV0ICovCisJaWYgKHBoYi0+ZGRpcikgeworCQlzdHJ1Y3QgZGVudHJ5ICpkID0gZGVidWdmc19jcmVhdGVfZGlyKCJyZWdzIiwgcGhiLT5kZGlyKTsKKwkJY2hhciB0bXBbNjRdOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdzcF9wY2lfcmVncyk7IGkrKykgeworCQkJc3ByaW50Zih0bXAsICIlMDN4XyVzIiwgd3NwX3BjaV9yZWdzW2ldLm9mZnNldCwKKwkJCQl3c3BfcGNpX3JlZ3NbaV0ubmFtZSk7CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKHRtcCwgMDYwMCwgZCwKKwkJCQkJICAgIGhvc2UtPmNmZ19kYXRhICsgd3NwX3BjaV9yZWdzW2ldLm9mZnNldCwKKwkJCQkJICAgICZ3c3BfcGNpX3JlZ19mb3BzKTsKKwkJfQorCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhbGxfcmVncyIsIDA2MDAsIHBoYi0+ZGRpciwgcGhiLCAmd3NwX3BjaV9yZWdzX2ZvcHMpOworCX0KKworCS8qIEZpbmQgdGhlIElSUSBudW1iZXIgZm9yIHRoYXQgUEhCICovCisJZXJyX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGhvc2UtPmRuLCAwKTsKKwlpZiAoZXJyX2lycSA9PSAwKQorCQkvKiBYWFggRXJyb3IgSVJRIGxhY2tpbmcgZnJvbSBkZXZpY2UtdHJlZSAqLworCQllcnJfaXJxID0gd3NwX3BjaV9nZXRfZXJyX2lycV9ub19kdChob3NlLT5kbik7CisJaWYgKGVycl9pcnEgPT0gMCkgeworCQlwcl9lcnIoIlBDSTogRmFpbGVkIHRvIGZldGNoIGVycm9yIGludGVycnVwdCBmb3IgJXNcbiIsCisJCSAgICAgICBob3NlLT5kbi0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuOworCX0KKwkvKiBSZXF1ZXN0IGl0ICovCisJcmMgPSByZXF1ZXN0X2lycShlcnJfaXJxLCB3c3BfcGNpX2Vycl9pcnEsIDAsICJ3c3BfcGNpIGVycm9yIiwgcGhiKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCJQQ0k6IEZhaWxlZCB0byByZXF1ZXN0IGludGVycnVwdCBmb3IgJXNcbiIsCisJCSAgICAgICBob3NlLT5kbi0+ZnVsbF9uYW1lKTsKKwl9CisJLyogRW5hYmxlIGludGVycnVwdHMgZm9yIGFsbCBlcnJvcnMgZm9yIG5vdyAqLworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0VSUl9JUlFfRU5BQkxFLCAweGZmZmZmZmZmZmZmZmZmZmZ1bGwpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTU1JT19FUlJfSVJRX0VOQUJMRSwgMHhmZmZmZmZmZmZmZmZmZmZmdWxsKTsKKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0RNQV9FUlJfSVJRX0VOQUJMRSwgMHhmZmZmZmZmZmZmZmZmZmZmdWxsKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGxhdGVyIHRvIGhvb2t1cCB3aXRoIHRoZSBlcnJvciBpbnRlcnJ1cHQKKyAqLworc3RhdGljIGludCBfX2luaXQgd3NwX3NldHVwX3BjaV9sYXRlKHZvaWQpCit7CisJc3RydWN0IHdzcF9waGIgKnBoYjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGhiLCAmd3NwX3BoYnMsIGFsbCkKKwkJd3NwX3NldHVwX3BjaV9lcnJfcmVwb3J0aW5nKHBoYik7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwod3NwX3NldHVwX3BjaV9sYXRlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcF9wY2kuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcF9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmU5YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwX3BjaS5oCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgQmVuIEhlcnJlbnNjaG1pZHQsIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX1dTUF9QQ0lfSAorI2RlZmluZSBfX1dTUF9QQ0lfSAorCisvKiBBcmNoaXRlY3RlZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJRV9SRUdfRE1BX0NIQU5fU1RBVFVTCTB4MTEwCisjZGVmaW5lIFBDSUVfUkVHX0NQVV9MT0FEU1RPUkVfU1RBVFVTCTB4MTIwCisKKyNkZWZpbmUgUENJRV9SRUdfQ09ORklHX0RBVEEJCTB4MTMwCisjZGVmaW5lIFBDSUVfUkVHX0xPQ0swCQkJMHgxMzgKKyNkZWZpbmUgUENJRV9SRUdfQ09ORklHX0FERFJFU1MJCTB4MTQwCisjZGVmaW5lICAgUENJRV9SRUdfQ0FfRU5BQkxFCQkJMHg4MDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lCSAgUENJRV9SRUdfQ0FfQlVTX01BU0sJCQkweDBmZjAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19DQV9CVVNfU0hJRlQJCQkoMjArMzIpCisjZGVmaW5lICAgUENJRV9SRUdfQ0FfREVWX01BU0sJCQkweDAwMGY4MDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19DQV9ERVZfU0hJRlQJCQkoMTUrMzIpCisjZGVmaW5lICAgUENJRV9SRUdfQ0FfRlVOQ19NQVNLCQkJMHgwMDAwNzAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfQ0FfRlVOQ19TSElGVAkJKDEyKzMyKQorI2RlZmluZSAgIFBDSUVfUkVHX0NBX1JFR19NQVNLCQkJMHgwMDAwMGZmZjAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfQ0FfUkVHX1NISUZUCQkJKCAwKzMyKQorI2RlZmluZSAgIFBDSUVfUkVHX0NBX0JFX01BU0sJCQkweDAwMDAwMDAwZjAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19DQV9CRV9TSElGVAkJCSggICAyOCkKKyNkZWZpbmUgUENJRV9SRUdfTE9DSzEJCQkweDE0OAorCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9DT05GSUcJCTB4MTYwCisjZGVmaW5lICAgUENJRV9SRUdfUEhCQ182NEJfVENFX0VOCQkweDIwMDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19QSEJDX01NSU9fRE1BX0ZSRUVaRV9FTgkweDEwMDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19QSEJDXzMyQklUX01TSV9FTgkJMHgwMDgwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfUEhCQ19NNjRfRU4JCQkweDAwNDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19QSEJDX0lPX0VOCQkJMHgwMDA4MDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfUEhCQ182NEJJVF9NU0lfRU4JCTB4MDAwMjAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfTTMyQV9FTgkJCTB4MDAwMDgwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfTTMyQl9FTgkJCTB4MDAwMDQwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfTVNJX1BFX1ZBTElEQVRFCQkweDAwMDAyMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19QSEJDX0RNQV9YTEFURV9CWVBBU1MJMHgwMDAwMTAwMDAwMDAwMDAwdWxsCisKKyNkZWZpbmUgUENJRV9SRUdfSU9fQkFTRV9BRERSCQkweDE3MAorI2RlZmluZSBQQ0lFX1JFR19JT19CQVNFX01BU0sJCTB4MTc4CisjZGVmaW5lIFBDSUVfUkVHX0lPX1NUQVJUX0FERFIJCTB4MTgwCisKKyNkZWZpbmUgUENJRV9SRUdfTTMyQV9CQVNFX0FERFIJCTB4MTkwCisjZGVmaW5lIFBDSUVfUkVHX00zMkFfQkFTRV9NQVNLCQkweDE5OAorI2RlZmluZSBQQ0lFX1JFR19NMzJBX1NUQVJUX0FERFIJMHgxYTAKKworI2RlZmluZSBQQ0lFX1JFR19NMzJCX0JBU0VfQUREUgkJMHgxYjAKKyNkZWZpbmUgUENJRV9SRUdfTTMyQl9CQVNFX01BU0sJCTB4MWI4CisjZGVmaW5lIFBDSUVfUkVHX00zMkJfU1RBUlRfQUREUgkweDFjMAorCisjZGVmaW5lIFBDSUVfUkVHX002NF9CQVNFX0FERFIJCTB4MWUwCisjZGVmaW5lIFBDSUVfUkVHX002NF9CQVNFX01BU0sJCTB4MWU4CisjZGVmaW5lIFBDSUVfUkVHX002NF9TVEFSVF9BRERSCQkweDFmMAorCisjZGVmaW5lIFBDSUVfUkVHX1RDRV9LSUxMCQkweDIxMAorI2RlZmluZSAgIFBDSUVfUkVHX1RDRUtJTExfU0lOR0xFCTB4ODAwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX1RDRUtJTExfQUREUl9NQVNLCTB4MDAwMDAzZmZmZmZmZmZmOHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX1RDRUtJTExfUFNfNEsJMAorI2RlZmluZSAgIFBDSUVfUkVHX1RDRUtJTExfUFNfNjRLCTEKKyNkZWZpbmUgICBQQ0lFX1JFR19UQ0VLSUxMX1BTXzE2TQkyCisjZGVmaW5lICAgUENJRV9SRUdfVENFS0lMTF9QU18xNkcJMworCisjZGVmaW5lIFBDSUVfUkVHX0lPREFfQUREUgkJMHgyMjAKKyNkZWZpbmUgICBQQ0lFX1JFR19JT0RBX0FEX0FVVE9JTkMJMHg4MDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfSU9EQV9BRF9UQkxfTVZUCTB4MDAwNTAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX0lPREFfQURfVEJMX1BFTFQJMHgwMDA2MDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfSU9EQV9BRF9UQkxfUEVTVEEJMHgwMDA3MDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfSU9EQV9BRF9UQkxfUEVTVEIJMHgwMDA4MDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfSU9EQV9BRF9UQkxfVFZUCTB4MDAwOTAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX0lPREFfQURfVEJMX1RDRQkweDAwMGEwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgUENJRV9SRUdfSU9EQV9EQVRBMAkJMHgyMjgKKyNkZWZpbmUgUENJRV9SRUdfSU9EQV9EQVRBMQkJMHgyMzAKKworI2RlZmluZSBQQ0lFX1JFR19MT0NLMgkJCTB4MjQwCisKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0dFTl9DQVAJCTB4MjUwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9UQ0VfQ0FQCQkweDI1OAorI2RlZmluZSBQQ0lFX1JFR19QSEJfSVJRX0NBUAkJMHgyNjAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0VFSF9DQVAJCTB4MjY4CisKKyNkZWZpbmUgUENJRV9SRUdfUEFQUl9FUlJfSU5KX0NPTlRST0wJMHgyYjAKKyNkZWZpbmUgUENJRV9SRUdfUEFQUl9FUlJfSU5KX0FERFIJMHgyYjgKKyNkZWZpbmUgUENJRV9SRUdfUEFQUl9FUlJfSU5KX01BU0sJMHgyYzAKKworCisjZGVmaW5lIFBDSUVfUkVHX1NZU19DRkcxCQkweDYwMAorI2RlZmluZSAgIFBDSUVfUkVHX1NZU19DRkcxX0NMQVNTX0NPREUJMHgwMDAwMDAwMDAwZmZmZmZmdWxsCisKKyNkZWZpbmUgSU9EQV9UVlQwX1RUQV9NQVNLCQkweDAwMGZmZmZmZmZmZjAwMDB1bGwKKyNkZWZpbmUgSU9EQV9UVlQwX1RUQV9TSElGVAkJNAorI2RlZmluZSBJT0RBX1RWVDBfQlVTTlVNX1ZBTElEX01BU0sJMHgwMDAwMDAwMDAwMDBlMDAwdWxsCisjZGVmaW5lIElPREFfVFZUMF9UQ0VfVEFCTEVfU0laRV9NQVNLCTB4MDAwMDAwMDAwMDAwMWYwMHVsbAorI2RlZmluZSBJT0RBX1RWVDBfVENFX1RBQkxFX1NJWkVfU0hJRlQJOAorI2RlZmluZSBJT0RBX1RWVDBfQlVTTlVNX1ZBTFVFX01BU0sJMHgwMDAwMDAwMDAwMDAwMGZmdWxsCisjZGVmaW5lIElPREFfVFZUMF9CVVNOVU1fVkFMSURfU0hJRlQJMAorI2RlZmluZSBJT0RBX1RWVDFfREVWTlVNX1ZBTElECQkweDIwMDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgSU9EQV9UVlQxX0RFVk5VTV9WQUxVRV9NQVNLCTB4MWYwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBJT0RBX1RWVDFfREVWTlVNX1ZBTFVFX1NISUZUCTU2CisjZGVmaW5lIElPREFfVFZUMV9GVU5DTlVNX1ZBTElECQkweDAwMDgwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgSU9EQV9UVlQxX0ZVTkNOVU1fVkFMVUVfTUFTSwkweDAwMDcwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgSU9EQV9UVlQxX0ZVTkNOVU1fVkFMVUVfU0hJRlQJNDgKKyNkZWZpbmUgSU9EQV9UVlQxX0lPX1BBR0VfU0laRV9NQVNLCTB4MDAwMDFmMDAwMDAwMDAwMHVsbAorI2RlZmluZSBJT0RBX1RWVDFfSU9fUEFHRV9TSVpFX1NISUZUCTQwCisjZGVmaW5lIElPREFfVFZUMV9QRV9OVU1CRVJfTUFTSwkweDAwMDAwMDAwMDAwMDAwM2Z1bGwKKyNkZWZpbmUgSU9EQV9UVlQxX1BFX05VTUJFUl9TSElGVAkwCisKKyNkZWZpbmUgSU9EQV9UVlRfQ09VTlQJCQk2NAorCisvKiBVVEwgQ29yZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJRV9VVExfU1lTX0JVU19DT05UUk9MCTB4NDAwCisjZGVmaW5lIFBDSUVfVVRMX1NUQVRVUwkJCTB4NDA4CisjZGVmaW5lIFBDSUVfVVRMX1NZU19CVVNfQUdFTlRfU1RBVFVTCTB4NDEwCisjZGVmaW5lIFBDSUVfVVRMX1NZU19CVVNfQUdFTlRfRVJSX1NFVgkweDQxOAorI2RlZmluZSBQQ0lFX1VUTF9TWVNfQlVTX0FHRU5UX0lSUV9FTgkweDQyMAorI2RlZmluZSBQQ0lFX1VUTF9TWVNfQlVTX0JVUlNUX1NaX0NPTkYJMHg0NDAKKyNkZWZpbmUgUENJRV9VVExfUkVWSVNJT05fSUQJCTB4NDQ4CisKKyNkZWZpbmUgUENJRV9VVExfT1VUX1BPU1RfSERSX0JVRl9BTExPQwkweDRjMAorI2RlZmluZSBQQ0lFX1VUTF9PVVRfUE9TVF9EQVRfQlVGX0FMTE9DCTB4NGQwCisjZGVmaW5lIFBDSUVfVVRMX0lOX1BPU1RfSERSX0JVRl9BTExPQwkweDRlMAorI2RlZmluZSBQQ0lFX1VUTF9JTl9QT1NUX0RBVF9CVUZfQUxMT0MJMHg0ZjAKKyNkZWZpbmUgUENJRV9VVExfT1VUX05QX0JVRl9BTExPQwkweDUwMAorI2RlZmluZSBQQ0lFX1VUTF9JTl9OUF9CVUZfQUxMT0MJMHg1MTAKKyNkZWZpbmUgUENJRV9VVExfUENJRV9UQUdTX0FMTE9DCTB4NTIwCisjZGVmaW5lIFBDSUVfVVRMX0dCSUZfUkVBRF9UQUdTX0FMTE9DCTB4NTMwCisKKyNkZWZpbmUgUENJRV9VVExfUENJRV9QT1JUX0NPTlRST0wJMHg1NDAKKyNkZWZpbmUgUENJRV9VVExfUENJRV9QT1JUX1NUQVRVUwkweDU0OAorI2RlZmluZSBQQ0lFX1VUTF9QQ0lFX1BPUlRfRVJST1JfU0VWCTB4NTUwCisjZGVmaW5lIFBDSUVfVVRMX1BDSUVfUE9SVF9JUlFfRU4JMHg1NTgKKyNkZWZpbmUgUENJRV9VVExfUkNfU1RBVFVTCQkweDU2MAorI2RlZmluZSBQQ0lFX1VUTF9SQ19FUlJfU0VWRVJJVFkJMHg1NjgKKyNkZWZpbmUgUENJRV9VVExfUkNfSVJRX0VOCQkweDU3MAorI2RlZmluZSBQQ0lFX1VUTF9FUF9TVEFUVVMJCTB4NTc4CisjZGVmaW5lIFBDSUVfVVRMX0VQX0VSUl9TRVZFUklUWQkweDU4MAorI2RlZmluZSBQQ0lFX1VUTF9FUF9FUlJfSVJRX0VOCQkweDU4OAorCisjZGVmaW5lIFBDSUVfVVRMX1BDSV9QTV9DVFJMMQkJMHg1OTAKKyNkZWZpbmUgUENJRV9VVExfUENJX1BNX0NUUkwyCQkweDU5OAorCisvKiBQQ0llIHN0YWNrIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lFX1JFR19TWVNURU1fQ09ORklHMQkJMHg2MDAKKyNkZWZpbmUgUENJRV9SRUdfU1lTVEVNX0NPTkZJRzIJCTB4NjA4CisjZGVmaW5lIFBDSUVfUkVHX0VQX1NZU1RFTV9DT05GSUcJMHg2MTgKKyNkZWZpbmUgUENJRV9SRUdfRVBfRkxSCQkJMHg2MjAKKyNkZWZpbmUgUENJRV9SRUdfRVBfQkFSX0NPTkZJRwkJMHg2MjgKKyNkZWZpbmUgUENJRV9SRUdfTElOS19DT05GSUcJCTB4NjMwCisjZGVmaW5lIFBDSUVfUkVHX1BNX0NPTkZJRwkJMHg2NDAKKyNkZWZpbmUgUENJRV9SRUdfRExQX0NPTlRST0wJCTB4NjUwCisjZGVmaW5lIFBDSUVfUkVHX0RMUF9TVEFUVVMJCTB4NjU4CisjZGVmaW5lIFBDSUVfUkVHX0VSUl9SRVBPUlRfQ09OVFJPTAkweDY2MAorI2RlZmluZSBQQ0lFX1JFR19TTE9UX0NPTlRST0wxCQkweDY3MAorI2RlZmluZSBQQ0lFX1JFR19TTE9UX0NPTlRST0wyCQkweDY3OAorI2RlZmluZSBQQ0lFX1JFR19VVExfQ09ORklHCQkweDY4MAorI2RlZmluZSBQQ0lFX1JFR19CVUZGRVJTX0NPTkZJRwkJMHg2OTAKKyNkZWZpbmUgUENJRV9SRUdfRVJST1JfSU5KRUNUCQkweDY5OAorI2RlZmluZSBQQ0lFX1JFR19TUklPVl9DT05GSUcJCTB4NmEwCisjZGVmaW5lIFBDSUVfUkVHX1BGMF9TUklPVl9TVEFUVVMJMHg2YTgKKyNkZWZpbmUgUENJRV9SRUdfUEYxX1NSSU9WX1NUQVRVUwkweDZiMAorI2RlZmluZSBQQ0lFX1JFR19QT1JUX05VTUJFUgkJMHg3MDAKKyNkZWZpbmUgUENJRV9SRUdfUE9SX1NZU1RFTV9DT05GSUcJMHg3MDgKKworLyogUEhCIGludGVybmFsIGxvZ2ljIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lFX1JFR19QSEJfVkVSU0lPTgkJMHg4MDAKKyNkZWZpbmUgUENJRV9SRUdfUkVTRVQJCQkweDgwOAorI2RlZmluZSBQQ0lFX1JFR19QSEJfQ09OVFJPTAkJMHg4MTAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX1RJTUVPVVRfQ09OVFJPTDEJMHg4NzgKKyNkZWZpbmUgUENJRV9SRUdfUEhCX1FVSUVTQ0VfRE1BCTB4ODg4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ETUFfUkVBRF9UQUdfQUNUVgkweDkwMAorI2RlZmluZSBQQ0lFX1JFR19QSEJfVENFX1JFQURfVEFHX0FDVFYJMHg5MDgKKworLyogRklSIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lFX1JFR19MRU1fRklSX0FDQ1VNCQkweGMwMAorI2RlZmluZSBQQ0lFX1JFR19MRU1fRklSX0FORF9NQVNLCTB4YzA4CisjZGVmaW5lIFBDSUVfUkVHX0xFTV9GSVJfT1JfTUFTSwkweGMxMAorI2RlZmluZSBQQ0lFX1JFR19MRU1fQUNUSU9OMAkJMHhjMTgKKyNkZWZpbmUgUENJRV9SRUdfTEVNX0FDVElPTjEJCTB4YzIwCisjZGVmaW5lIFBDSUVfUkVHX0xFTV9FUlJPUl9NQVNLCQkweGMzMAorI2RlZmluZSBQQ0lFX1JFR19MRU1fRVJST1JfQU5EX01BU0sJMHhjMzgKKyNkZWZpbmUgUENJRV9SRUdfTEVNX0VSUk9SX09SX01BU0sJMHhjNDAKKworLyogUEhCIEVycm9yIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSX1NUQVRVUwkJMHhjODAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUjFfU1RBVFVTCTB4Yzg4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlJfSU5KRUNUCQkweGM5MAorI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSX0xFTV9FTkFCTEUJMHhjOTgKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUl9JUlFfRU5BQkxFCTB4Y2EwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlJfRlJFRVpFX0VOQUJMRQkweGNhOAorI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSX1NJREVfRU5BQkxFCTB4Y2I4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlJfTE9HXzAJCTB4Y2MwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlJfTE9HXzEJCTB4Y2M4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlJfU1RBVFVTX01BU0sJMHhjZDAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUjFfU1RBVFVTX01BU0sJMHhjZDgKKworI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUl9TVEFUVVMJMHhkMDAKKyNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlIxX1NUQVRVUwkweGQwOAorI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUl9JTkpFQ1QJMHhkMTAKKyNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlJfTEVNX0VOQUJMRQkweGQxOAorI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUl9JUlFfRU5BQkxFCTB4ZDIwCisjZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSX0ZSRUVaRV9FTkFCTEUJMHhkMjgKKyNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlJfU0lERV9FTkFCTEUJMHhkMzgKKyNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlJfTE9HXzAJCTB4ZDQwCisjZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSX0xPR18xCQkweGQ0OAorI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUl9TVEFUVVNfTUFTSwkweGQ1MAorI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUjFfU1RBVFVTX01BU0sJMHhkNTgKKworI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSX1NUQVRVUwkJMHhkODAKKyNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUjFfU1RBVFVTCTB4ZDg4CisjZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlJfSU5KRUNUCQkweGQ5MAorI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSX0xFTV9FTkFCTEUJMHhkOTgKKyNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUl9JUlFfRU5BQkxFCTB4ZGEwCisjZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlJfRlJFRVpFX0VOQUJMRQkweGRhOAorI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSX1NJREVfRU5BQkxFCTB4ZGI4CisjZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlJfTE9HXzAJCTB4ZGMwCisjZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlJfTE9HXzEJCTB4ZGM4CisjZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlJfU1RBVFVTX01BU0sJMHhkZDAKKyNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUjFfU1RBVFVTX01BU0sJMHhkZDgKKworLyogU2hvcnRjdXRzIGZvciBhY2Nlc3MgdG8gdGhlIGFib3ZlIHVzaW5nIHRoZSBQSEIgZGVmaW5pdGlvbnMKKyAqIHdpdGggYW4gb2Zmc2V0CisgKi8KKyNkZWZpbmUgUENJRV9SRUdfRVJSX1BIQl9PRkZTRVQJCTB4MAorI2RlZmluZSBQQ0lFX1JFR19FUlJfTU1JT19PRkZTRVQJMHg4MAorI2RlZmluZSBQQ0lFX1JFR19FUlJfRE1BX09GRlNFVAkJMHgxMDAKKworLyogRGVidWcgYW5kIFRyYWNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfQ09OVFJPTDAJMHhlMDAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX1NUQVRVUzAJMHhlMDgKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX0NPTlRST0wxCTB4ZTEwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19TVEFUVVMxCTB4ZTE4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19DT05UUk9MMgkweGUyMAorI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfU1RBVFVTMgkweGUyOAorI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfQ09OVFJPTDMJMHhlMzAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX1NUQVRVUzMJMHhlMzgKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX0NPTlRST0w0CTB4ZTQwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19TVEFUVVM0CTB4ZTQ4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19DT05UUk9MNQkweGU1MAorI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfU1RBVFVTNQkweGU1OAorI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfQ09OVFJPTDYJMHhlNjAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX1NUQVRVUzYJMHhlNjgKKworLyogRGVmaW5pdGlvbiBmb3IgUENJZSBlcnJvcnMgKi8KK3N0cnVjdCB3c3BfcGNpZV9lcnJfbG9nX2RhdGEgeworCV9fdTY0CXBoYl9lcnI7CisJX191NjQJcGhiX2VycjE7CisJX191NjQJcGhiX2xvZzA7CisJX191NjQJcGhiX2xvZzE7CisJX191NjQJbW1pb19lcnI7CisJX191NjQJbW1pb19lcnIxOworCV9fdTY0CW1taW9fbG9nMDsKKwlfX3U2NAltbWlvX2xvZzE7CisJX191NjQJZG1hX2VycjsKKwlfX3U2NAlkbWFfZXJyMTsKKwlfX3U2NAlkbWFfbG9nMDsKKwlfX3U2NAlkbWFfbG9nMTsKKwlfX3U2NAl1dGxfc3lzX2VycjsKKwlfX3U2NAl1dGxfcG9ydF9lcnI7CisJX191NjQJdXRsX3JjX2VycjsKKwlfX3U2NAl1bnVzZWQ7Cit9OworCisjZW5kaWYgLyogX19XU1BfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCmluZGV4IGNmNzM2Y2EuLjg0ZTEzMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQpAQCAtMTgsNyArMTgsNiBAQAogb2JqLSQoQ09ORklHX0ZTTF9QTUMpCQkrPSBmc2xfcG1jLm8KIG9iai0kKENPTkZJR19GU0xfTEJDKQkJKz0gZnNsX2xiYy5vCiBvYmotJChDT05GSUdfRlNMX0dUTSkJCSs9IGZzbF9ndG0ubwotb2JqLSQoQ09ORklHX01QQzh4eHhfR1BJTykJKz0gbXBjOHh4eF9ncGlvLm8KIG9iai0kKENPTkZJR19GU0xfODVYWF9DQUNIRV9TUkFNKQkrPSBmc2xfODV4eF9sMmN0bHIubyBmc2xfODV4eF9jYWNoZV9zcmFtLm8KIG9iai0kKENPTkZJR19TSU1QTEVfR1BJTykJKz0gc2ltcGxlX2dwaW8ubwogb2JqLSQoQ09ORklHX0ZTTF9SSU8pCQkrPSBmc2xfcmlvLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKaW5kZXggMjY1ZjBmMC4uYmE0MjcxOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogICogYXhvbl9yYW1fbWFrZV9yZXF1ZXN0IC0gbWFrZV9yZXF1ZXN0KCkgbWV0aG9kIGZvciBibG9jayBkZXZpY2UKICAqIEBxdWV1ZSwgQGJpbzogc2VlIGJsa19xdWV1ZV9tYWtlX3JlcXVlc3QoKQogICovCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogYXhvbl9yYW1fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBheG9uX3JhbV9iYW5rICpiYW5rID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CkBAIC0xMTMsNyArMTEzLDYgQEAKIAlzdHJ1Y3QgYmlvX3ZlYyAqdmVjOwogCXVuc2lnbmVkIGludCB0cmFuc2ZlcmVkOwogCXVuc2lnbmVkIHNob3J0IGlkeDsKLQlpbnQgcmMgPSAwOwogCiAJcGh5c19tZW0gPSBiYW5rLT5pb19hZGRyICsgKGJpby0+Ymlfc2VjdG9yIDw8IEFYT05fUkFNX1NFQ1RPUl9TSElGVCk7CiAJcGh5c19lbmQgPSBiYW5rLT5pb19hZGRyICsgYmFuay0+c2l6ZTsKQEAgLTEyMSw4ICsxMjAsNyBAQAogCWJpb19mb3JfZWFjaF9zZWdtZW50KHZlYywgYmlvLCBpZHgpIHsKIAkJaWYgKHVubGlrZWx5KHBoeXNfbWVtICsgdmVjLT5idl9sZW4gPiBwaHlzX2VuZCkpIHsKIAkJCWJpb19pb19lcnJvcihiaW8pOwotCQkJcmMgPSAtRVJBTkdFOwotCQkJYnJlYWs7CisJCQlyZXR1cm47CiAJCX0KIAogCQl1c2VyX21lbSA9IHBhZ2VfYWRkcmVzcyh2ZWMtPmJ2X3BhZ2UpICsgdmVjLT5idl9vZmZzZXQ7CkBAIC0xMzUsOCArMTMzLDYgQEAKIAkJdHJhbnNmZXJlZCArPSB2ZWMtPmJ2X2xlbjsKIAl9CiAJYmlvX2VuZGlvKGJpbywgMCk7Ci0KLQlyZXR1cm4gcmM7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9iZXN0Y29tbS9zcmFtLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Jlc3Rjb21tL3NyYW0uYwppbmRleCAxMjI1MDEyLi5iNmRiMjNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2Jlc3Rjb21tL3NyYW0uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Jlc3Rjb21tL3NyYW0uYwpAQCAtMTMsNyArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCmluZGV4IGQ1NWQwYWQuLmJmNmM3Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIEF1dGhvcjogU2NvdHQgV29vZCA8c2NvdHR3b29kQGZyZWVzY2FsZS5jb20+CiAgKgotICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMDgsMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgogICoKICAqIFNvbWUgcGFydHMgZGVyaXZlZCBmcm9tIGNvbW1wcm9jLmMvY3BtMl9jb21tb24uYywgd2hpY2ggaXM6CiAgKiBDb3B5cmlnaHQgKGMpIDE5OTcgRGFuIGVycm9yX2FjdCAoZG1hbGVrQGpsYy5uZXQpCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKQEAgLTE0Niw2ICsxNDcsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcG1fbXVyYW1fbG9jaywgZmxhZ3MpOwogCWNwbV9tdXJhbV9pbmZvLmFsaWdubWVudCA9IGFsaWduOwogCXN0YXJ0ID0gcmhfYWxsb2MoJmNwbV9tdXJhbV9pbmZvLCBzaXplLCAiY29tbXByb2MiKTsKKwltZW1zZXQoY3BtX211cmFtX2FkZHIoc3RhcnQpLCAwLCBzaXplKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcG1fbXVyYW1fbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHN0YXJ0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLmMKaW5kZXggYmI0NGFhOS4uMWJkMGViYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Rjci5jCkBAIC0yMCw2ICsyMCw3IEBACiAjdW5kZWYgREVCVUcKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2Rjci5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9ndG0uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2d0bS5jCmluZGV4IDdkZDI4ODUuLjAyY2YxZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2d0bS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2d0bS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2ZzbF9ndG0uaD4KIAogI2RlZmluZSBHVENGUl9TVFAoeCkJCSgoeCkgJiAxID8gMSA8PCA1IDogMSA8PCAxKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYwppbmRleCBkOTE3NTczLi5jNGQ5NmZhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5jCmluZGV4IDQxOWE3NzIuLmU1YzM0NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5jCkBAIC0zMCw3ICszMCw3IEBACiAKIHN0cnVjdCBmc2xfbXNpX2ZlYXR1cmUgewogCXUzMiBmc2xfcGljX2lwOwotCXUzMiBtc2lpcl9vZmZzZXQ7CisJdTMyIG1zaWlyX29mZnNldDsgLyogT2Zmc2V0IG9mIE1TSUlSLCByZWxhdGl2ZSB0byBzdGFydCBvZiBNU0lSIGJhbmsgKi8KIH07CiAKIHN0cnVjdCBmc2xfbXNpX2Nhc2NhZGVfZGF0YSB7CkBAIC0xMjYsMTAgKzEyNiwxOSBAQAogewogCXN0cnVjdCBmc2xfbXNpICptc2lfZGF0YSA9IGZzbF9tc2lfZGF0YTsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QocGRldi0+YnVzKTsKLQl1NjQgYmFzZSA9IGZzbF9wY2lfaW1tcmJhcl9iYXNlKGhvc2UpOworCXU2NCBhZGRyZXNzOyAvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBNU0lJUiAqLworCWludCBsZW47CisJY29uc3QgdTY0ICpyZWc7CiAKLQltc2ctPmFkZHJlc3NfbG8gPSBtc2lfZGF0YS0+bXNpX2FkZHJfbG8gKyBsb3dlcl8zMl9iaXRzKGJhc2UpOwotCW1zZy0+YWRkcmVzc19oaSA9IG1zaV9kYXRhLT5tc2lfYWRkcl9oaSArIHVwcGVyXzMyX2JpdHMoYmFzZSk7CisJLyogSWYgdGhlIG1zaS1hZGRyZXNzLTY0IHByb3BlcnR5IGV4aXN0cywgdGhlbiB1c2UgaXQgKi8KKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkoaG9zZS0+ZG4sICJtc2ktYWRkcmVzcy02NCIsICZsZW4pOworCWlmIChyZWcgJiYgKGxlbiA9PSBzaXplb2YodTY0KSkpCisJCWFkZHJlc3MgPSBiZTY0X3RvX2NwdXAocmVnKTsKKwllbHNlCisJCWFkZHJlc3MgPSBmc2xfcGNpX2ltbXJiYXJfYmFzZShob3NlKSArIG1zaV9kYXRhLT5tc2lpcl9vZmZzZXQ7CisKKwltc2ctPmFkZHJlc3NfbG8gPSBsb3dlcl8zMl9iaXRzKGFkZHJlc3MpOworCW1zZy0+YWRkcmVzc19oaSA9IHVwcGVyXzMyX2JpdHMoYWRkcmVzcyk7CiAKIAltc2ctPmRhdGEgPSBod2lycTsKIApAQCAtMjk2LDcgKzMwNSw3IEBACiAJfQogCiAJbXNpLT5tc2lfdmlycXNbaXJxX2luZGV4XSA9IHZpcnRfbXNpcjsKLQljYXNjYWRlX2RhdGEtPmluZGV4ID0gb2Zmc2V0ICsgaXJxX2luZGV4OworCWNhc2NhZGVfZGF0YS0+aW5kZXggPSBvZmZzZXQ7CiAJY2FzY2FkZV9kYXRhLT5tc2lfZGF0YSA9IG1zaTsKIAlpcnFfc2V0X2hhbmRsZXJfZGF0YSh2aXJ0X21zaXIsIGNhc2NhZGVfZGF0YSk7CiAJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIodmlydF9tc2lyLCBmc2xfbXNpX2Nhc2NhZGUpOwpAQCAtMzU5LDggKzM2OCw3IEBACiAKIAltc2ktPmlycWhvc3QtPmhvc3RfZGF0YSA9IG1zaTsKIAotCW1zaS0+bXNpX2FkZHJfaGkgPSAweDA7Ci0JbXNpLT5tc2lfYWRkcl9sbyA9IGZlYXR1cmVzLT5tc2lpcl9vZmZzZXQgKyAocmVzLnN0YXJ0ICYgMHhmZmZmZik7CisJbXNpLT5tc2lpcl9vZmZzZXQgPSBmZWF0dXJlcy0+bXNpaXJfb2Zmc2V0ICsgKHJlcy5zdGFydCAmIDB4ZmZmZmYpOwogCiAJcmMgPSBmc2xfbXNpX2luaXRfYWxsb2NhdG9yKG1zaSk7CiAJaWYgKHJjKSB7CkBAIC0zNzYsOCArMzg0LDEwIEBACiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAotCWlmICghcCkKKwlpZiAoIXApIHsKIAkJcCA9IGFsbF9hdmFpbDsKKwkJbGVuID0gc2l6ZW9mKGFsbF9hdmFpbCk7CisJfQogCiAJZm9yIChpcnFfaW5kZXggPSAwLCBpID0gMDsgaSA8IGxlbiAvICgyICogc2l6ZW9mKHUzMikpOyBpKyspIHsKIAkJaWYgKHBbaSAqIDJdICUgSVJRU19QRVJfTVNJX1JFRyB8fApAQCAtMzkzLDcgKzQwMyw3IEBACiAJCWNvdW50ID0gcFtpICogMiArIDFdIC8gSVJRU19QRVJfTVNJX1JFRzsKIAogCQlmb3IgKGogPSAwOyBqIDwgY291bnQ7IGorKywgaXJxX2luZGV4KyspIHsKLQkJCWVyciA9IGZzbF9tc2lfc2V0dXBfaHdpcnEobXNpLCBkZXYsIG9mZnNldCwgaXJxX2luZGV4KTsKKwkJCWVyciA9IGZzbF9tc2lfc2V0dXBfaHdpcnEobXNpLCBkZXYsIG9mZnNldCArIGosIGlycV9pbmRleCk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXJyb3Jfb3V0OwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5oCmluZGV4IDYyNDU4MGMuLjEzMTNhYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5oCkBAIC0yOCw4ICsyOCw3IEBACiAKIAl1bnNpZ25lZCBsb25nIGNhc2NhZGVfaXJxOwogCi0JdTMyIG1zaV9hZGRyX2xvOwotCXUzMiBtc2lfYWRkcl9oaTsKKwl1MzIgbXNpaXJfb2Zmc2V0OyAvKiBPZmZzZXQgb2YgTVNJSVIsIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIENDU1IgKi8KIAl2b2lkIF9faW9tZW0gKm1zaV9yZWdzOwogCXUzMiBmZWF0dXJlOwogCWludCBtc2lfdmlycXNbTlJfTVNJX1JFR107CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BtYy5jCmluZGV4IGYxMjJlODkuLjU5MmEwZjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BtYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BtYy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKaW5kZXggYzY1Zjc1YS4uMjJmZmNjZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKQEAgLTE2MDgsNiArMTYwOCw3IEBACiAJcmV0dXJuIDA7CiBlcnI6CiAJaW91bm1hcChwcml2LT5yZWdzX3dpbik7CisJcmVsZWFzZV9yZXNvdXJjZSgmcG9ydC0+aW9yZXMpOwogZXJyX3JlczoKIAlrZnJlZShwcml2KTsKIGVycl9wcml2OgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwppbmRleCAyZDY2Mjc1Li5lOGYzODVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuaAppbmRleCAyZWNlMDJiLi5jNmQwMDczIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuaAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuaApAQCAtMjIsMTUgKzIyLDI0IEBACiBleHRlcm4gdm9pZCBmc2xfcnN0Y3JfcmVzdGFydChjaGFyICpjbWQpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfRlNMX0RJVSkgfHwgZGVmaW5lZChDT05GSUdfRkJfRlNMX0RJVV9NT0RVTEUpCisKKy8qIFRoZSBkaWZmZXJlbnQgcG9ydHMgdGhhdCB0aGUgRElVIGNhbiBiZSBjb25uZWN0ZWQgdG8gKi8KK2VudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgeworCUZTTF9ESVVfUE9SVF9EVkksCS8qIERWSSAqLworCUZTTF9ESVVfUE9SVF9MVkRTLAkvKiBTaW5nbGUtbGluayBMVkRTICovCisJRlNMX0RJVV9QT1JUX0RMVkRTCS8qIER1YWwtbGluayBMVkRTICovCit9OworCiBzdHJ1Y3QgcGxhdGZvcm1fZGl1X2RhdGFfb3BzIHsKLQl1bnNpZ25lZCBpbnQgKCpnZXRfcGl4ZWxfZm9ybWF0KSAodW5zaWduZWQgaW50IGJpdHNfcGVyX3BpeGVsLAotCQlpbnQgbW9uaXRvcl9wb3J0KTsKLQl2b2lkICgqc2V0X2dhbW1hX3RhYmxlKSAoaW50IG1vbml0b3JfcG9ydCwgY2hhciAqZ2FtbWFfdGFibGVfYmFzZSk7Ci0Jdm9pZCAoKnNldF9tb25pdG9yX3BvcnQpIChpbnQgbW9uaXRvcl9wb3J0KTsKLQl2b2lkICgqc2V0X3BpeGVsX2Nsb2NrKSAodW5zaWduZWQgaW50IHBpeGNsb2NrKTsKLQlzc2l6ZV90ICgqc2hvd19tb25pdG9yX3BvcnQpIChpbnQgbW9uaXRvcl9wb3J0LCBjaGFyICpidWYpOwotCWludCAoKnNldF9zeXNmc19tb25pdG9yX3BvcnQpIChpbnQgdmFsKTsKLQl2b2lkICgqcmVsZWFzZV9ib290bWVtKSAodm9pZCk7CisJdTMyICgqZ2V0X3BpeGVsX2Zvcm1hdCkoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0LAorCQl1bnNpZ25lZCBpbnQgYnBwKTsKKwl2b2lkICgqc2V0X2dhbW1hX3RhYmxlKShlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQsCisJCWNoYXIgKmdhbW1hX3RhYmxlX2Jhc2UpOworCXZvaWQgKCpzZXRfbW9uaXRvcl9wb3J0KShlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQpOworCXZvaWQgKCpzZXRfcGl4ZWxfY2xvY2spKHVuc2lnbmVkIGludCBwaXhjbG9jayk7CisJZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCAoKnZhbGlkX21vbml0b3JfcG9ydCkKKwkJKGVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgcG9ydCk7CisJdm9pZCAoKnJlbGVhc2VfYm9vdG1lbSkodm9pZCk7CiB9OwogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RpdV9kYXRhX29wcyBkaXVfb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM1eHh4X2Nsb2Nrcy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM1eHh4X2Nsb2Nrcy5jCmluZGV4IDM0ZTEyZjkuLjk2ZjgxNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjNXh4eF9jbG9ja3MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzV4eHhfY2xvY2tzLmMKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiB1bnNpZ25lZCBpbnQKIG1wYzV4eHhfZ2V0X2J1c19mcmVxdWVuY3koc3RydWN0IGRldmljZV9ub2RlICpub2RlKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eF9waWMuYwppbmRleCAyMmU0OGUyZC4uMmNhMGE4NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMKQEAgLTEsNSArMSw0IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eHhfZ3Bpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0OTYzYS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eHhfZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8qCi0gKiBHUElPcyBvbiBNUEM1MTJ4LzgzNDkvODU3Mi84NjEwIGFuZCBjb21wYXRpYmxlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+Ci0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQotICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2RlZmluZSBNUEM4WFhYX0dQSU9fUElOUwkzMgotCi0jZGVmaW5lIEdQSU9fRElSCQkweDAwCi0jZGVmaW5lIEdQSU9fT0RSCQkweDA0Ci0jZGVmaW5lIEdQSU9fREFUCQkweDA4Ci0jZGVmaW5lIEdQSU9fSUVSCQkweDBjCi0jZGVmaW5lIEdQSU9fSU1SCQkweDEwCi0jZGVmaW5lIEdQSU9fSUNSCQkweDE0Ci0jZGVmaW5lIEdQSU9fSUNSMgkJMHgxOAotCi1zdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgewotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgbW1fZ2M7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCi0JLyoKLQkgKiBzaGFkb3dlZCBkYXRhIHJlZ2lzdGVyIHRvIGJlIGFibGUgdG8gY2xlYXIvc2V0IG91dHB1dCBwaW5zIGluCi0JICogb3BlbiBkcmFpbiBtb2RlIHNhZmVseQotCSAqLwotCXUzMiBkYXRhOwotCXN0cnVjdCBpcnFfaG9zdCAqaXJxOwotCXZvaWQgKm9mX2Rldl9pZF9kYXRhOwotfTsKLQotc3RhdGljIGlubGluZSB1MzIgbXBjOHh4eF9ncGlvMm1hc2sodW5zaWduZWQgaW50IGdwaW8pCi17Ci0JcmV0dXJuIDF1IDw8IChNUEM4WFhYX0dQSU9fUElOUyAtIDEgLSBncGlvKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKgotdG9fbXBjOHh4eF9ncGlvX2NoaXAoc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0pCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihtbSwgc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwLCBtbV9nYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wYzh4eHhfZ3Bpb19zYXZlX3JlZ3Moc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0pCi17Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOwotCi0JbXBjOHh4eF9nYy0+ZGF0YSA9IGluX2JlMzIobW0tPnJlZ3MgKyBHUElPX0RBVCk7Ci19Ci0KLS8qIFdvcmthcm91bmQgR1BJTyAxIGVycmF0YSBvbiBNUEM4NTcyL01QQzg1MzYuIFRoZSBzdGF0dXMgb2YgR1BJT3MKLSAqIGRlZmluZWQgYXMgb3V0cHV0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgR1BEQVQgcmVnaXN0ZXIsCi0gKiBzbyB3ZSB1c2Ugc2hhZG93IGRhdGEgcmVnaXN0ZXIgaW5zdGVhZC4gVGhlIHN0YXR1cyBvZiBpbnB1dCBwaW5zCi0gKiBpcyBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgR1BEQVQgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyBpbnQgbXBjODU3Ml9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCi17Ci0JdTMyIHZhbDsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOwotCi0JdmFsID0gaW5fYmUzMihtbS0+cmVncyArIEdQSU9fREFUKSAmIH5pbl9iZTMyKG1tLT5yZWdzICsgR1BJT19ESVIpOwotCi0JcmV0dXJuICh2YWwgfCBtcGM4eHh4X2djLT5kYXRhKSAmIG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pOwotfQotCi1zdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQotewotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKLQotCXJldHVybiBpbl9iZTMyKG1tLT5yZWdzICsgR1BJT19EQVQpICYgbXBjOHh4eF9ncGlvMm1hc2soZ3Bpbyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wYzh4eHhfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQotewotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKLQlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSB0b19tcGM4eHh4X2dwaW9fY2hpcChtbSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAodmFsKQotCQltcGM4eHh4X2djLT5kYXRhIHw9IG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pOwotCWVsc2UKLQkJbXBjOHh4eF9nYy0+ZGF0YSAmPSB+bXBjOHh4eF9ncGlvMm1hc2soZ3Bpbyk7Ci0KLQlvdXRfYmUzMihtbS0+cmVncyArIEdQSU9fREFULCBtcGM4eHh4X2djLT5kYXRhKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBtcGM4eHh4X2dwaW9fZGlyX2luKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKLXsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOwotCi0JY2xyYml0czMyKG1tLT5yZWdzICsgR1BJT19ESVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKLXsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltcGM4eHh4X2dwaW9fc2V0KGdjLCBncGlvLCB2YWwpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQotCXNldGJpdHMzMihtbS0+cmVncyArIEdQSU9fRElSLCBtcGM4eHh4X2dwaW8ybWFzayhncGlvKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtcGM4eHh4X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IHRvX21wYzh4eHhfZ3Bpb19jaGlwKG1tKTsKLQotCWlmIChtcGM4eHh4X2djLT5pcnEgJiYgb2Zmc2V0IDwgTVBDOFhYWF9HUElPX1BJTlMpCi0JCXJldHVybiBpcnFfY3JlYXRlX21hcHBpbmcobXBjOHh4eF9nYy0+aXJxLCBvZmZzZXQpOwotCWVsc2UKLQkJcmV0dXJuIC1FTlhJTzsKLX0KLQotc3RhdGljIHZvaWQgbXBjOHh4eF9ncGlvX2lycV9jYXNjYWRlKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOwotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOwotCXVuc2lnbmVkIGludCBtYXNrOwotCi0JbWFzayA9IGluX2JlMzIobW0tPnJlZ3MgKyBHUElPX0lFUikgJiBpbl9iZTMyKG1tLT5yZWdzICsgR1BJT19JTVIpOwotCWlmIChtYXNrKQotCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX2xpbmVhcl9yZXZtYXAobXBjOHh4eF9nYy0+aXJxLAotCQkJCQkJICAgICAzMiAtIGZmcyhtYXNrKSkpOwotfQotCi1zdGF0aWMgdm9pZCBtcGM4eHh4X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOwotCi0Jc2V0Yml0czMyKG1tLT5yZWdzICsgR1BJT19JTVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXBjOHh4eF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSAmbXBjOHh4eF9nYy0+bW1fZ2M7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0KLQljbHJiaXRzMzIobW0tPnJlZ3MgKyBHUElPX0lNUiwgbXBjOHh4eF9ncGlvMm1hc2soaXJxZF90b19od2lycShkKSkpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBtcGM4eHh4X2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOwotCi0Jb3V0X2JlMzIobW0tPnJlZ3MgKyBHUElPX0lFUiwgbXBjOHh4eF9ncGlvMm1hc2soaXJxZF90b19od2lycShkKSkpOwotfQotCi1zdGF0aWMgaW50IG1wYzh4eHhfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKLXsKLQlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9ICZtcGM4eHh4X2djLT5tbV9nYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3dpdGNoIChmbG93X3R5cGUpIHsKLQljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQkJc2V0Yml0czMyKG1tLT5yZWdzICsgR1BJT19JQ1IsCi0JCQkgIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQotCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOwotCQljbHJiaXRzMzIobW0tPnJlZ3MgKyBHUElPX0lDUiwKLQkJCSAgbXBjOHh4eF9ncGlvMm1hc2soaXJxZF90b19od2lycShkKSkpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXBjNTEyeF9pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQotewotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOwotCXVuc2lnbmVkIGxvbmcgZ3BpbyA9IGlycWRfdG9faHdpcnEoZCk7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7Ci0JdW5zaWduZWQgaW50IHNoaWZ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoZ3BpbyA8IDE2KSB7Ci0JCXJlZyA9IG1tLT5yZWdzICsgR1BJT19JQ1I7Ci0JCXNoaWZ0ID0gKDE1IC0gZ3BpbykgKiAyOwotCX0gZWxzZSB7Ci0JCXJlZyA9IG1tLT5yZWdzICsgR1BJT19JQ1IyOwotCQlzaGlmdCA9ICgxNSAtIChncGlvICUgMTYpKSAqIDI7Ci0JfQotCi0Jc3dpdGNoIChmbG93X3R5cGUpIHsKLQljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKLQljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQkJY2xyc2V0Yml0c19iZTMyKHJlZywgMyA8PCBzaGlmdCwgMiA8PCBzaGlmdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgotCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQkJY2xyc2V0Yml0c19iZTMyKHJlZywgMyA8PCBzaGlmdCwgMSA8PCBzaGlmdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQkJY2xyYml0czMyKHJlZywgMyA8PCBzaGlmdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtcGM4eHh4X2lycV9jaGlwID0gewotCS5uYW1lCQk9ICJtcGM4eHh4LWdwaW8iLAotCS5pcnFfdW5tYXNrCT0gbXBjOHh4eF9pcnFfdW5tYXNrLAotCS5pcnFfbWFzawk9IG1wYzh4eHhfaXJxX21hc2ssCi0JLmlycV9hY2sJPSBtcGM4eHh4X2lycV9hY2ssCi0JLmlycV9zZXRfdHlwZQk9IG1wYzh4eHhfaXJxX3NldF90eXBlLAotfTsKLQotc3RhdGljIGludCBtcGM4eHh4X2dwaW9faXJxX21hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxLAotCQkJCWlycV9od19udW1iZXJfdCBodykKLXsKLQlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBoLT5ob3N0X2RhdGE7Ci0KLQlpZiAobXBjOHh4eF9nYy0+b2ZfZGV2X2lkX2RhdGEpCi0JCW1wYzh4eHhfaXJxX2NoaXAuaXJxX3NldF90eXBlID0gbXBjOHh4eF9nYy0+b2ZfZGV2X2lkX2RhdGE7Ci0KLQlpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCBoLT5ob3N0X2RhdGEpOwotCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmbXBjOHh4eF9pcnFfY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7Ci0JaXJxX3NldF9pcnFfdHlwZSh2aXJxLCBJUlFfVFlQRV9OT05FKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19pcnFfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAotCQkJCSAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKLQkJCQkgIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLAotCQkJCSAgdW5zaWduZWQgaW50ICpvdXRfZmxhZ3MpCi0KLXsKLQkvKiBpbnRlcnJ1cHQgc2Vuc2UgdmFsdWVzIGNvbWluZyBmcm9tIHRoZSBkZXZpY2UgdHJlZSBlcXVhbCBlaXRoZXIKLQkgKiBFREdFX0ZBTExJTkcgb3IgRURHRV9CT1RICi0JICovCi0JKm91dF9od2lycSA9IGludHNwZWNbMF07Ci0JKm91dF9mbGFncyA9IGludHNwZWNbMV07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfaG9zdF9vcHMgbXBjOHh4eF9ncGlvX2lycV9vcHMgPSB7Ci0JLm1hcAk9IG1wYzh4eHhfZ3Bpb19pcnFfbWFwLAotCS54bGF0ZQk9IG1wYzh4eHhfZ3Bpb19pcnFfeGxhdGUsCi19OwotCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4eHh4X2dwaW9faWRzW10gX19pbml0ZGF0YSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWdwaW8iLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZ3BpbyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODYxMC1ncGlvIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWdwaW8iLCAuZGF0YSA9IG1wYzUxMnhfaXJxX3NldF90eXBlLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWdwaW8iLCAgIH0sCi0Je30KLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBtcGM4eHh4X2FkZF9jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djOwotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djOwotCXN0cnVjdCBncGlvX2NoaXAgKmdjOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkOwotCXVuc2lnbmVkIGh3aXJxOwotCWludCByZXQ7Ci0KLQltcGM4eHh4X2djID0ga3phbGxvYyhzaXplb2YoKm1wYzh4eHhfZ2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1wYzh4eHhfZ2MpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJm1wYzh4eHhfZ2MtPmxvY2spOwotCi0JbW1fZ2MgPSAmbXBjOHh4eF9nYy0+bW1fZ2M7Ci0JZ2MgPSAmbW1fZ2MtPmdjOwotCi0JbW1fZ2MtPnNhdmVfcmVncyA9IG1wYzh4eHhfZ3Bpb19zYXZlX3JlZ3M7Ci0JZ2MtPm5ncGlvID0gTVBDOFhYWF9HUElPX1BJTlM7Ci0JZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IG1wYzh4eHhfZ3Bpb19kaXJfaW47Ci0JZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtcGM4eHh4X2dwaW9fZGlyX291dDsKLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsbXBjODU3Mi1ncGlvIikpCi0JCWdjLT5nZXQgPSBtcGM4NTcyX2dwaW9fZ2V0OwotCWVsc2UKLQkJZ2MtPmdldCA9IG1wYzh4eHhfZ3Bpb19nZXQ7Ci0JZ2MtPnNldCA9IG1wYzh4eHhfZ3Bpb19zZXQ7Ci0JZ2MtPnRvX2lycSA9IG1wYzh4eHhfZ3Bpb190b19pcnE7Ci0KLQlyZXQgPSBvZl9tbV9ncGlvY2hpcF9hZGQobnAsIG1tX2djKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCWh3aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCWlmIChod2lycSA9PSBOT19JUlEpCi0JCWdvdG8gc2tpcF9pcnE7Ci0KLQltcGM4eHh4X2djLT5pcnEgPQotCQlpcnFfYWxsb2NfaG9zdChucCwgSVJRX0hPU1RfTUFQX0xJTkVBUiwgTVBDOFhYWF9HUElPX1BJTlMsCi0JCQkgICAgICAgJm1wYzh4eHhfZ3Bpb19pcnFfb3BzLCBNUEM4WFhYX0dQSU9fUElOUyk7Ci0JaWYgKCFtcGM4eHh4X2djLT5pcnEpCi0JCWdvdG8gc2tpcF9pcnE7Ci0KLQlpZCA9IG9mX21hdGNoX25vZGUobXBjOHh4eF9ncGlvX2lkcywgbnApOwotCWlmIChpZCkKLQkJbXBjOHh4eF9nYy0+b2ZfZGV2X2lkX2RhdGEgPSBpZC0+ZGF0YTsKLQotCW1wYzh4eHhfZ2MtPmlycS0+aG9zdF9kYXRhID0gbXBjOHh4eF9nYzsKLQotCS8qIGFjayBhbmQgbWFzayBhbGwgaXJxcyAqLwotCW91dF9iZTMyKG1tX2djLT5yZWdzICsgR1BJT19JRVIsIDB4ZmZmZmZmZmYpOwotCW91dF9iZTMyKG1tX2djLT5yZWdzICsgR1BJT19JTVIsIDApOwotCi0JaXJxX3NldF9oYW5kbGVyX2RhdGEoaHdpcnEsIG1wYzh4eHhfZ2MpOwotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGh3aXJxLCBtcGM4eHh4X2dwaW9faXJxX2Nhc2NhZGUpOwotCi1za2lwX2lycToKLQlyZXR1cm47Ci0KLWVycjoKLQlwcl9lcnIoIiVzOiByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLAotCSAgICAgICBucC0+ZnVsbF9uYW1lLCByZXQpOwotCWtmcmVlKG1wYzh4eHhfZ2MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBtcGM4eHh4X2FkZF9ncGlvY2hpcHModm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JZm9yX2VhY2hfbWF0Y2hpbmdfbm9kZShucCwgbXBjOHh4eF9ncGlvX2lkcykKLQkJbXBjOHh4eF9hZGRfY29udHJvbGxlcihucCk7Ci0KLQlyZXR1cm4gMDsKLX0KLWFyY2hfaW5pdGNhbGwobXBjOHh4eF9hZGRfZ3Bpb2NoaXBzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKaW5kZXggZDVkM2ZmMy4uOGM3ZTg1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKQEAgLTgwMCw4ICs4MDAsNiBAQAogCSAqIElQSXMgYXJlIG1hcmtlZCBJUlFfUEVSX0NQVS4gVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mCiAJICogcHJldmVudGluZyB0aGUgSVJRX1BFTkRJTkcvSVJRX0lOUFJPR1JFU1MgbG9naWMgZnJvbQogCSAqIGFwcGx5aW5nIHRvIHRoZW0uIFdlIEVPSSB0aGVtIGxhdGUgdG8gYXZvaWQgcmUtZW50ZXJpbmcuCi0JICogV2UgbWFyayBJUEkncyB3aXRoIElSUUZfRElTQUJMRUQgYXMgdGhleSBtdXN0IHJ1biB3aXRoCi0JICogaXJxcyBkaXNhYmxlZC4KIAkgKi8KIAltcGljX2VvaShtcGljKTsKIH0KQEAgLTEyODUsMTMgKzEyODMsMTEgQEAKIAkJCSAgIG1waWNfcmVhZChtcGljLT5ncmVncywgTVBJQ19JTkZPKEdSRUdfR0xPQkFMX0NPTkZfMCkpCiAJCQkgICB8IE1QSUNfR1JFR19HQ09ORl9NQ0spOwogCi0JLyogUmVhZCBmZWF0dXJlIHJlZ2lzdGVyLCBjYWxjdWxhdGUgbnVtIENQVXMgYW5kLCBmb3Igbm9uLUlTVQotCSAqIE1QSUNzLCBudW0gc291cmNlcyBhcyB3ZWxsLiBPbiBJU1UgTVBJQ3MsIHNvdXJjZXMgYXJlIGNvdW50ZWQKLQkgKiBhcyBJU1VzIGFyZSBhZGRlZAorCS8qCisJICogUmVhZCBmZWF0dXJlIHJlZ2lzdGVyLiAgRm9yIG5vbi1JU1UgTVBJQ3MsIG51bSBzb3VyY2VzIGFzIHdlbGwuIE9uCisJICogSVNVIE1QSUNzLCBzb3VyY2VzIGFyZSBjb3VudGVkIGFzIElTVXMgYXJlIGFkZGVkCiAJICovCiAJZ3JlZ19mZWF0dXJlID0gbXBpY19yZWFkKG1waWMtPmdyZWdzLCBNUElDX0lORk8oR1JFR19GRUFUVVJFXzApKTsKLQltcGljLT5udW1fY3B1cyA9ICgoZ3JlZ19mZWF0dXJlICYgTVBJQ19HUkVHX0ZFQVRVUkVfTEFTVF9DUFVfTUFTSykKLQkJCSAgPj4gTVBJQ19HUkVHX0ZFQVRVUkVfTEFTVF9DUFVfU0hJRlQpICsgMTsKIAlpZiAoaXN1X3NpemUgPT0gMCkgewogCQlpZiAoZmxhZ3MgJiBNUElDX0JST0tFTl9GUlJfTklSUVMpCiAJCQltcGljLT5udW1fc291cmNlcyA9IG1waWMtPmlycV9jb3VudDsKQEAgLTEzMDEsMTAgKzEyOTcsMTggQEAKIAkJCQkgPj4gTVBJQ19HUkVHX0ZFQVRVUkVfTEFTVF9TUkNfU0hJRlQpICsgMTsKIAl9CiAKKwkvKgorCSAqIFRoZSBNUElDIGRyaXZlciB3aWxsIGNyYXNoIGlmIHRoZXJlIGFyZSBtb3JlIGNvcmVzIHRoYW4gd2UKKwkgKiBjYW4gaW5pdGlhbGl6ZSwgc28gd2UgbWF5IGFzIHdlbGwgY2F0Y2ggdGhhdCBwcm9ibGVtIGhlcmUuCisJICovCisJQlVHX09OKG51bV9wb3NzaWJsZV9jcHVzKCkgPiBNUElDX01BWF9DUFVTKTsKKwogCS8qIE1hcCB0aGUgcGVyLUNQVSByZWdpc3RlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbXBpYy0+bnVtX2NwdXM7IGkrKykgewotCQltcGljX21hcChtcGljLCBub2RlLCBwYWRkciwgJm1waWMtPmNwdXJlZ3NbaV0sCi0JCQkgTVBJQ19JTkZPKENQVV9CQVNFKSArIGkgKiBNUElDX0lORk8oQ1BVX1NUUklERSksCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJdW5zaWduZWQgaW50IGNwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoaSk7CisKKwkJbXBpY19tYXAobXBpYywgbm9kZSwgcGFkZHIsICZtcGljLT5jcHVyZWdzW2NwdV0sCisJCQkgTVBJQ19JTkZPKENQVV9CQVNFKSArIGNwdSAqIE1QSUNfSU5GTyhDUFVfU1RSSURFKSwKIAkJCSAweDEwMDApOwogCX0KIApAQCAtMTM0Myw3ICsxMzQ3LDcgQEAKIAl9CiAJcHJpbnRrKEtFUk5fSU5GTyAibXBpYzogU2V0dGluZyB1cCBNUElDIFwiJXNcIiB2ZXJzaW9uICVzIGF0ICVsbHgsIgogCSAgICAgICAiIG1heCAlZCBDUFVzXG4iLAotCSAgICAgICBuYW1lLCB2ZXJzLCAodW5zaWduZWQgbG9uZyBsb25nKXBhZGRyLCBtcGljLT5udW1fY3B1cyk7CisJICAgICAgIG5hbWUsIHZlcnMsICh1bnNpZ25lZCBsb25nIGxvbmcpcGFkZHIsIG51bV9wb3NzaWJsZV9jcHVzKCkpOwogCXByaW50ayhLRVJOX0lORk8gIm1waWM6IElTVSBzaXplOiAlZCwgc2hpZnQ6ICVkLCBtYXNrOiAleFxuIiwKIAkgICAgICAgbXBpYy0+aXN1X3NpemUsIG1waWMtPmlzdV9zaGlmdCwgbXBpYy0+aXN1X21hc2spOwogCkBAIC0xNzQyLDYgKzE3NDYsNyBAQAogCXN0cnVjdCBtcGljICptcGljID0gbXBpY19wcmltYXJ5OwogCXUzMiBwaXI7CiAJaW50IGNwdWlkID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOworCWludCBpOwogCiAJLyogU2V0IHRhcmdldCBiaXQgZm9yIGNvcmUgcmVzZXQgKi8KIAlwaXIgPSBtcGljX3JlYWQobXBpYy0+Z3JlZ3MsIE1QSUNfSU5GTyhHUkVHX1BST0NFU1NPUl9JTklUKSk7CkBAIC0xNzUzLDYgKzE3NTgsMTUgQEAKIAlwaXIgJj0gfigxIDw8IGNwdWlkKTsKIAltcGljX3dyaXRlKG1waWMtPmdyZWdzLCBNUElDX0lORk8oR1JFR19QUk9DRVNTT1JfSU5JVCksIHBpcik7CiAJbXBpY19yZWFkKG1waWMtPmdyZWdzLCBNUElDX0lORk8oR1JFR19QUk9DRVNTT1JfSU5JVCkpOworCisJLyogUGVyZm9ybSAxNSBFT0kgb24gZWFjaCByZXNldCBjb3JlIHRvIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4KKwkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBGU0wgQ29yZU5ldCBiYXNlZCBkZXZpY2VzICovCisJaWYgKG1waWMtPmZsYWdzICYgTVBJQ19GU0wpIHsKKwkJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKKwkJCV9tcGljX3dyaXRlKG1waWMtPnJlZ190eXBlLCAmbXBpYy0+Y3B1cmVnc1tjcHVpZF0sCisJCQkJICAgICAgTVBJQ19DUFVfRU9JLCAwKTsKKwkJfQorCX0KIH0KICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYwppbmRleCA3N2JiM2Y0Li5iMDAzN2NlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BtaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wbWkuYwppbmRleCA4Y2U0ZmMzLi44ZjA0NjU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BtaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcG1pLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X21zaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfbXNpLmMKaW5kZXggMzY3YWYwMi4uMWMyZDdhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfbXNpLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jCmluZGV4IGRiZmU5NmIuLjg2MmYxMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jCkBAIC04MzQsNyArODM0LDcgQEAKIAlyZXR1cm4gMzsKIH0KIAotc3RhdGljIGludCBwcGM0NDBzcGVfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgX19pbml0IHBwYzQ0MHNwZV9wY2lleF9pbml0X3BvcnRfaHcoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0KQogewogCXUzMiB2YWwgPSAxIDw8IDI0OwogCkBAIC04NzIsMTIgKzg3MiwxMiBAQAogCXJldHVybiBwcGM0eHhfcGNpZXhfcG9ydF9yZXNldF9zZHIocG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQgcHBjNDQwc3BlQV9wY2lleF9pbml0X3BvcnRfaHcoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0KQorc3RhdGljIGludCBfX2luaXQgcHBjNDQwc3BlQV9wY2lleF9pbml0X3BvcnRfaHcoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0KQogewogCXJldHVybiBwcGM0NDBzcGVfcGNpZXhfaW5pdF9wb3J0X2h3KHBvcnQpOwogfQogCi1zdGF0aWMgaW50IHBwYzQ0MHNwZUJfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgX19pbml0IHBwYzQ0MHNwZUJfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKIHsKIAlpbnQgcmMgPSBwcGM0NDBzcGVfcGNpZXhfaW5pdF9wb3J0X2h3KHBvcnQpOwogCkBAIC05MzYsNyArOTM2LDcgQEAKIAlyZXR1cm4gMjsKIH0KIAotc3RhdGljIGludCBwcGM0NjBleF9wY2lleF9pbml0X3BvcnRfaHcoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0KQorc3RhdGljIGludCBfX2luaXQgcHBjNDYwZXhfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKIHsKIAl1MzIgdmFsOwogCXUzMiB1dGxzZXQxOwpAQCAtMTA5Miw2ICsxMDkyLDEwIEBACiAJbXRkY3JpKFNEUjAsIFBFU0RSMV80NjBTWF9IU1NTTEVXLCAweEZGRkYwMDAwKTsKIAltdGRjcmkoU0RSMCwgUEVTRFIyXzQ2MFNYX0hTU1NMRVcsIDB4RkZGRjAwMDApOwogCisJLyogU2V0IEhTUyBQUkJTIGVuYWJsZWQgKi8KKwltdGRjcmkoU0RSMCwgUEVTRFIwXzQ2MFNYX0hTU0NUTFNFVCwgMHgwMDAwMTEzMCk7CisJbXRkY3JpKFNEUjAsIFBFU0RSMl80NjBTWF9IU1NDVExTRVQsIDB4MDAwMDExMzApOworCiAJdWRlbGF5KDEwMCk7CiAKIAkvKiBEZS1hc3NlcnQgUExMUkVTRVQgKi8KQEAgLTExMjIsNyArMTEyNiw3IEBACiAJcmV0dXJuIDI7CiB9CiAKLXN0YXRpYyBpbnQgcHBjNDYwc3hfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgX19pbml0IHBwYzQ2MHN4X3BjaWV4X2luaXRfcG9ydF9odyhzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCiB7CiAKIAlpZiAocG9ydC0+ZW5kcG9pbnQpCkBAIC0xMTMyLDkgKzExMzYsNiBAQAogCQlkY3JpX2NscnNldChTRFIwLCBwb3J0LT5zZHJfYmFzZSArIFBFU0RSbl9VVExTRVQyLAogCQkJCTAsIDB4MDEwMDAwMDApOwogCi0JLypHZW4tMSovCi0JbXRkY3JpKFNEUjAsIHBvcnQtPnNkcl9iYXNlICsgUEVTRFJuXzQ2MFNYX1JDRUksIDB4MDgwMDAwMDApOwotCiAJZGNyaV9jbHJzZXQoU0RSMCwgcG9ydC0+c2RyX2Jhc2UgKyBQRVNEUm5fUkNTU0VULAogCQkJKFBFU0RSeF9SQ1NTRVRfUlNUR1UgfCBQRVNEUnhfUkNTU0VUX1JTVERMKSwKIAkJCVBFU0RSeF9SQ1NTRVRfUlNUUFlOKTsKQEAgLTExNDgsMTQgKzExNDksNDIgQEAKIHsKIAkvKiBNYXggMTI4IEJ5dGVzICovCiAJb3V0X2JlMzIgKHBvcnQtPnV0bF9iYXNlICsgUEVVVExfUEJCU1osICAgMHgwMDAwMDAwMCk7CisJLyogQXNzZXJ0IFZSQiBhbmQgVFhFIC0gcGVyIGRhdGFzaGVldCB0dXJuIG9mZiBhZGRyIHZhbGlkYXRpb24gKi8KKwlvdXRfYmUzMihwb3J0LT51dGxfYmFzZSArIFBFVVRMX1BDVEwsICAweDgwODAwMDAwKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHBwYzQ2MHN4X3BjaWV4X2NoZWNrX2xpbmsoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0KQoreworCXZvaWQgX19pb21lbSAqbWJhc2U7CisJaW50IGF0dGVtcHQgPSA1MDsKKworCXBvcnQtPmxpbmsgPSAwOworCisJbWJhc2UgPSBpb3JlbWFwKHBvcnQtPmNmZ19zcGFjZS5zdGFydCArIDB4MTAwMDAwMDAsIDB4MTAwMCk7CisJaWYgKG1iYXNlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgbWFwIGludGVybmFsIGNvbmZpZyBzcGFjZSAhIiwKKwkJCXBvcnQtPm5vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3aGlsZSAoYXR0ZW1wdCAmJiAoMCA9PSAoaW5fbGUzMihtYmFzZSArIFBFQ0ZHXzQ2MFNYX0RMTFNUQSkKKwkJCSYgUEVDRkdfNDYwU1hfRExMU1RBX0xJTktVUCkpKSB7CisJCWF0dGVtcHQtLTsKKwkJbWRlbGF5KDEwKTsKKwl9CisJaWYgKGF0dGVtcHQpCisJCXBvcnQtPmxpbmsgPSAxOworZG9uZToKKwlpb3VubWFwKG1iYXNlKTsKKworfQorCiBzdGF0aWMgc3RydWN0IHBwYzR4eF9wY2lleF9od29wcyBwcGM0NjBzeF9wY2llX2h3b3BzIF9faW5pdGRhdGEgPSB7CiAJLmNvcmVfaW5pdAk9IHBwYzQ2MHN4X3BjaWV4X2NvcmVfaW5pdCwKIAkucG9ydF9pbml0X2h3CT0gcHBjNDYwc3hfcGNpZXhfaW5pdF9wb3J0X2h3LAogCS5zZXR1cF91dGwJPSBwcGM0NjBzeF9wY2lleF9pbml0X3V0bCwKLQkuY2hlY2tfbGluawk9IHBwYzR4eF9wY2lleF9jaGVja19saW5rX3NkciwKKwkuY2hlY2tfbGluawk9IHBwYzQ2MHN4X3BjaWV4X2NoZWNrX2xpbmssCiB9OwogCiAjZW5kaWYgLyogQ09ORklHXzQ0eCAqLwpAQCAtMTE4OSw3ICsxMjE4LDcgQEAKIAltdGRjcmkoU0RSMCwgcG9ydC0+c2RyX2Jhc2UgKyBQRVNEUm5fUkNTU0VULCAweDAwMTAxMDAwKTsKIH0KIAotc3RhdGljIGludCBwcGM0MDVleF9wY2lleF9pbml0X3BvcnRfaHcoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0KQorc3RhdGljIGludCBfX2luaXQgcHBjNDA1ZXhfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKIHsKIAl1MzIgdmFsOwogCkBAIC0xMzM4LDE1ICsxMzY3LDE1IEBACiAJaWYgKHJjICE9IDApCiAJCXJldHVybiByYzsKIAotCWlmIChwcGM0eHhfcGNpZXhfaHdvcHMtPmNoZWNrX2xpbmspCi0JCXBwYzR4eF9wY2lleF9od29wcy0+Y2hlY2tfbGluayhwb3J0KTsKLQogCS8qCiAJICogSW5pdGlhbGl6ZSBtYXBwaW5nOiBkaXNhYmxlIGFsbCByZWdpb25zIGFuZCBjb25maWd1cmUKIAkgKiBDRkcgYW5kIFJFRyByZWdpb25zIGJhc2VkIG9uIHJlc291cmNlcyBpbiB0aGUgZGV2aWNlIHRyZWUKIAkgKi8KIAlwcGM0eHhfcGNpZXhfcG9ydF9pbml0X21hcHBpbmcocG9ydCk7CiAKKwlpZiAocHBjNHh4X3BjaWV4X2h3b3BzLT5jaGVja19saW5rKQorCQlwcGM0eHhfcGNpZXhfaHdvcHMtPmNoZWNrX2xpbmsocG9ydCk7CisKIAkvKgogCSAqIE1hcCBVVEwKIAkgKi8KQEAgLTEzNjAsMTMgKzEzODksMjMgQEAKIAkJcHBjNHh4X3BjaWV4X2h3b3BzLT5zZXR1cF91dGwocG9ydCk7CiAKIAkvKgotCSAqIENoZWNrIGZvciBWQzAgYWN0aXZlIGFuZCBhc3NlcnQgUkRZLgorCSAqIENoZWNrIGZvciBWQzAgYWN0aXZlIG9yIFBMTCBMb2NrZWQgYW5kIGFzc2VydCBSRFkuCiAJICovCiAJaWYgKHBvcnQtPnNkcl9iYXNlKSB7Ci0JCWlmIChwb3J0LT5saW5rICYmCi0JCSAgICBwcGM0eHhfcGNpZXhfd2FpdF9vbl9zZHIocG9ydCwgUEVTRFJuX1JDU1NUUywKLQkJCQkJICAgICAxIDw8IDE2LCAxIDw8IDE2LCA1MDAwKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJRSVkOiBWQzAgbm90IGFjdGl2ZVxuIiwgcG9ydC0+aW5kZXgpOworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocG9ydC0+bm9kZSwKKwkJCQkiaWJtLHBsYi1wY2lleC00NjBzeCIpKXsKKwkJCWlmIChwb3J0LT5saW5rICYmIHBwYzR4eF9wY2lleF93YWl0X29uX3Nkcihwb3J0LAorCQkJCQlQRVNEUm5fUkNTU1RTLAorCQkJCQkxIDw8IDEyLCAxIDw8IDEyLCA1MDAwKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIlBDSUUlZDogUExMIG5vdCBsb2NrZWRcbiIsCisJCQkJCQlwb3J0LT5pbmRleCk7CisJCQkJcG9ydC0+bGluayA9IDA7CisJCQl9CisJCX0gZWxzZSBpZiAocG9ydC0+bGluayAmJgorCQkJcHBjNHh4X3BjaWV4X3dhaXRfb25fc2RyKHBvcnQsIFBFU0RSbl9SQ1NTVFMsCisJCQkJMSA8PCAxNiwgMSA8PCAxNiwgNTAwMCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIlBDSUUlZDogVkMwIG5vdCBhY3RpdmVcbiIsCisJCQkJCXBvcnQtPmluZGV4KTsKIAkJCXBvcnQtPmxpbmsgPSAwOwogCQl9CiAKQEAgLTE1NzMsOCArMTYxMiwxNSBAQAogCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIxQkFILCBsYWgpOwogCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIxQkFMLCBsYWwpOwogCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIxTVNLSCwgMHg3ZmZmZmZmZik7Ci0JCS8qIE5vdGUgdGhhdCAzIGhlcmUgbWVhbnMgZW5hYmxlZCB8IHNpbmdsZSByZWdpb24gKi8KLQkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SMU1TS0wsIHNhIHwgMyk7CisJCS8qRW5hYmxlZCBhbmQgc2luZ2xlIHJlZ2lvbiAqLworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocG9ydC0+bm9kZSwgImlibSxwbGItcGNpZXgtNDYwc3giKSkKKwkJCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjFNU0tMLAorCQkJCXNhIHwgRENST19QRUdQTF80NjBTWF9PTVIxTVNLTF9VT1QKKwkJCQkJfCBEQ1JPX1BFR1BMX09NUnhNU0tMX1ZBTCk7CisJCWVsc2UKKwkJCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjFNU0tMLAorCQkJCXNhIHwgRENST19QRUdQTF9PTVIxTVNLTF9VT1QKKwkJCQkJfCBEQ1JPX1BFR1BMX09NUnhNU0tMX1ZBTCk7CiAJCWJyZWFrOwogCWNhc2UgMToKIAkJb3V0X2xlMzIobWJhc2UgKyBQRUNGR19QT00xTEFILCBwY2lhaCk7CkBAIC0xNTgyLDggKzE2MjgsOCBAQAogCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIyQkFILCBsYWgpOwogCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIyQkFMLCBsYWwpOwogCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIyTVNLSCwgMHg3ZmZmZmZmZik7Ci0JCS8qIE5vdGUgdGhhdCAzIGhlcmUgbWVhbnMgZW5hYmxlZCB8IHNpbmdsZSByZWdpb24gKi8KLQkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SMk1TS0wsIHNhIHwgMyk7CisJCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjJNU0tMLAorCQkJCXNhIHwgRENST19QRUdQTF9PTVJ4TVNLTF9WQUwpOwogCQlicmVhazsKIAljYXNlIDI6CiAJCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfUE9NMkxBSCwgcGNpYWgpOwpAQCAtMTU5Miw3ICsxNjM4LDkgQEAKIAkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SM0JBTCwgbGFsKTsKIAkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SM01TS0gsIDB4N2ZmZmZmZmYpOwogCQkvKiBOb3RlIHRoYXQgMyBoZXJlIG1lYW5zIGVuYWJsZWQgfCBJTyBzcGFjZSAhISEgKi8KLQkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SM01TS0wsIHNhIHwgMyk7CisJCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjNNU0tMLAorCQkJCXNhIHwgRENST19QRUdQTF9PTVIzTVNLTF9JTworCQkJCQl8IERDUk9fUEVHUExfT01SeE1TS0xfVkFMKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNjkzLDYgKzE3NDEsOSBAQAogCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCiAJCQlzYSB8PSAweDg7CiAKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBvcnQtPm5vZGUsICJpYm0scGxiLXBjaWV4LTQ2MHN4IikpCisJCQlzYSB8PSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0OworCiAJCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfQkFSMEhNUEEsIFJFU19UT19VMzJfSElHSChzYSkpOwogCQlvdXRfbGUzMihtYmFzZSArIFBFQ0ZHX0JBUjBMTVBBLCBSRVNfVE9fVTMyX0xPVyhzYSkpOwogCkBAIC0xODU0LDYgKzE5MDUsMTAgQEAKIAl9CiAJb3V0X2xlMTYobWJhc2UgKyAweDIwMiwgdmFsKTsKIAorCS8qIEVuYWJsZSBCdXMgbWFzdGVyLCBtZW1vcnksIGFuZCBpbyBzcGFjZSAqLworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwb3J0LT5ub2RlLCAiaWJtLHBsYi1wY2lleC00NjBzeCIpKQorCQlvdXRfbGUxNihtYmFzZSArIDB4MjA0LCAweDcpOworCiAJaWYgKCFwb3J0LT5lbmRwb2ludCkgewogCQkvKiBTZXQgQ2xhc3MgQ29kZSB0byBQQ0ktUENJIGJyaWRnZSBhbmQgUmV2aXNpb24gSWQgdG8gMSAqLwogCQlvdXRfbGUzMihtYmFzZSArIDB4MjA4LCAweDA2MDQwMDAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmgKaW5kZXggYzM5YTEzNC4uMzJjZTc2MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmgKQEAgLTQ2NCw2ICs0NjQsMTggQEAKICNkZWZpbmUgUEVDRkdfUE9NMkxBTAkJMHgzOTAKICNkZWZpbmUgUEVDRkdfUE9NMkxBSAkJMHgzOTQKIAorLyogNDYwc3ggb25seSAqLworI2RlZmluZSBQRUNGR180NjBTWF9ETExTVEEgICAgIDB4M2Y4CisKKy8qIDQ2MHN4IEJpdCBNYXBwaW5ncyAqLworI2RlZmluZSBQRUNGR180NjBTWF9ETExTVEFfTElOS1VQCSAweDAwMDAwMDEwCisjZGVmaW5lIERDUk9fUEVHUExfNDYwU1hfT01SMU1TS0xfVU9UCSAweDAwMDAwMDA0CisKKy8qIFBFR1BMIEJpdCBNYXBwaW5ncyAqLworI2RlZmluZSBEQ1JPX1BFR1BMX09NUnhNU0tMX1ZBTAkgMHgwMDAwMDAwMQorI2RlZmluZSBEQ1JPX1BFR1BMX09NUjFNU0tMX1VPVAkgMHgwMDAwMDAwMgorI2RlZmluZSBEQ1JPX1BFR1BMX09NUjNNU0tMX0lPCSAweDAwMDAwMDAyCisKIC8qIFNEUiBCaXQgTWFwcGluZ3MgKi8KICNkZWZpbmUgUEVTRFJ4X1JDU1NFVF9ITERQTEIJMHgxMDAwMDAwMAogI2RlZmluZSBQRVNEUnhfUkNTU0VUX1JTVEdVCTB4MDEwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3NvYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfc29jLmMKaW5kZXggZDNkNmNlMy4uMGRlYmNjMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfc29jLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfc29jLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCX0KIAogCS8qIEluc3RhbGwgZXJyb3IgaGFuZGxlciAqLwotCWlmIChyZXF1ZXN0X2lycShpcnEsIGwyY19lcnJvcl9oYW5kbGVyLCBJUlFGX0RJU0FCTEVELCAiTDJDIiwgMCkgPCAwKSB7CisJaWYgKHJlcXVlc3RfaXJxKGlycSwgbDJjX2Vycm9yX2hhbmRsZXIsIDAsICJMMkMiLCAwKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgaW5zdGFsbCBMMkMgZXJyb3IgaGFuZGxlciIKIAkJICAgICAgICIsIGNhY2hlIGlzIG5vdCBlbmFibGVkXG4iKTsKIAkJb2Zfbm9kZV9wdXQobnApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvZ3Bpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvZ3Bpby5jCmluZGV4IDM2YmY4NDUuLmUyM2YyM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL2dwaW8uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9ncGlvLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcWUuaD4KIAogc3RydWN0IHFlX2dwaW9fY2hpcCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjYy5jCmluZGV4IGZhNTg5YjIuLjA0Njc3NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjYy5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKaW5kZXggMjVmYmJmYS4uZmJhMDI0NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaW1tYXBfcWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19zbG93LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2Nfc2xvdy5jCmluZGV4IGUxZDZhMTMuLjUyNGMwZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19zbG93LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX3Nsb3cuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2ltbWFwX3FlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91c2IuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VzYi5jCmluZGV4IDgxMDU0NjIuLjkxNjI4MjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VzYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VzYi5jCkBAIC0xNSw2ICsxNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2ltbWFwX3FlLmg+CiAjaW5jbHVkZSA8YXNtL3FlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3J0Y19jbW9zX3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3J0Y19jbW9zX3NldHVwLmMKaW5kZXggYzE4NzllYi4uOWFmYmE5MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9ydGNfY21vc19zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2NvbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9zY29tLmMKaW5kZXggYjI1OTNjZS4uNDlhM2VjZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9zY29tLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9zY29tLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3Njb20uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5jCmluZGV4IGI2ZGVmZGEuLmZmNWU3MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2ltcGxlX2dwaW8uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmMKQEAgLTEzLDcgKzEzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jCmluZGV4IDlmNTFmOTcuLjIzNzBlMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL01ha2VmaWxlCmluZGV4IGI3NWE2MDUuLmM2MDZhYTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvTWFrZWZpbGUKQEAgLTQsMyArNCw0IEBACiBvYmotJChDT05GSUdfUFBDX0lDUF9OQVRJVkUpCSs9IGljcC1uYXRpdmUubwogb2JqLSQoQ09ORklHX1BQQ19JQ1BfSFYpCSs9IGljcC1odi5vCiBvYmotJChDT05GSUdfUFBDX0lDU19SVEFTKQkrPSBpY3MtcnRhcy5vCitvYmotJChDT05GSUdfUFBDX1BPV0VSTlYpCSs9IGljcy1vcGFsLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3AtbmF0aXZlLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW5hdGl2ZS5jCmluZGV4IDUwZTMyYWYuLjRjNzliNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3AtbmF0aXZlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1uYXRpdmUuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAjZW5kaWYKIH07CiAKLWludCBpY3BfbmF0aXZlX2luaXQodm9pZCkKK2ludCBfX2luaXQgaWNwX25hdGl2ZV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAl1MzIgaW5keCA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNzLW9wYWwuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3Mtb3BhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTg2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNzLW9wYWwuYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIElDUyBiYWNrZW5kIGZvciBPUEFMIG1hbmFnZWQgaW50ZXJydXB0cy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3hpY3MuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorCitzdGF0aWMgaW50IGljc19vcGFsX21hbmdsZV9zZXJ2ZXIoaW50IHNlcnZlcikKK3sKKwkvKiBObyBsaW5rIGZvciBub3cgKi8KKwlyZXR1cm4gc2VydmVyIDw8IDI7Cit9CisKK3N0YXRpYyBpbnQgaWNzX29wYWxfdW5tYW5nbGVfc2VydmVyKGludCBzZXJ2ZXIpCit7CisJLyogTm8gbGluayBmb3Igbm93ICovCisJcmV0dXJuIHNlcnZlciA+PiAyOworfQorCitzdGF0aWMgdm9pZCBpY3Nfb3BhbF91bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1bnNpZ25lZCBpbnQgaHdfaXJxID0gKHVuc2lnbmVkIGludClpcnFkX3RvX2h3aXJxKGQpOworCWludDY0X3QgcmM7CisJaW50IHNlcnZlcjsKKworCXByX2RldmVsKCJpY3MtaGFsOiB1bm1hc2sgdmlycSAlZCBbaHcgMHgleF1cbiIsIGQtPmlycSwgaHdfaXJxKTsKKworCWlmIChod19pcnEgPT0gWElDU19JUEkgfHwgaHdfaXJxID09IFhJQ1NfSVJRX1NQVVJJT1VTKQorCQlyZXR1cm47CisKKwlzZXJ2ZXIgPSB4aWNzX2dldF9pcnFfc2VydmVyKGQtPmlycSwgZC0+YWZmaW5pdHksIDApOworCXNlcnZlciA9IGljc19vcGFsX21hbmdsZV9zZXJ2ZXIoc2VydmVyKTsKKworCXJjID0gb3BhbF9zZXRfeGl2ZShod19pcnEsIHNlcnZlciwgREVGQVVMVF9QUklPUklUWSk7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKKwkJcHJfZXJyKCIlczogb3BhbF9zZXRfeGl2ZShpcnE9JWQgW2h3IDB4JXhdIHNlcnZlcj0leCkiCisJCSAgICAgICAiIGVycm9yICVsbGRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgZC0+aXJxLCBod19pcnEsIHNlcnZlciwgcmMpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGljc19vcGFsX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkKQoreworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJLyoKKwkgKiBUaGUgZ2VuZXJpYyBNU0kgY29kZSByZXR1cm5zIHdpdGggdGhlIGludGVycnVwdCBkaXNhYmxlZCBvbiB0aGUKKwkgKiBjYXJkLCB1c2luZyB0aGUgTVNJIG1hc2sgYml0cy4gRmlybXdhcmUgZG9lc24ndCBhcHBlYXIgdG8gdW5tYXNrCisJICogYXQgdGhhdCBsZXZlbCwgc28gd2UgZG8gaXQgaGVyZSBieSBoYW5kLgorCSAqLworCWlmIChkLT5tc2lfZGVzYykKKwkJdW5tYXNrX21zaV9pcnEoZCk7CisjZW5kaWYKKworCS8qIHVubWFzayBpdCAqLworCWljc19vcGFsX3VubWFza19pcnEoZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGljc19vcGFsX21hc2tfcmVhbF9pcnEodW5zaWduZWQgaW50IGh3X2lycSkKK3sKKwlpbnQgc2VydmVyID0gaWNzX29wYWxfbWFuZ2xlX3NlcnZlcih4aWNzX2RlZmF1bHRfc2VydmVyKTsKKwlpbnQ2NF90IHJjOworCisJaWYgKGh3X2lycSA9PSBYSUNTX0lQSSkKKwkJcmV0dXJuOworCisJLyogSGF2ZSB0byBzZXQgWElWRSB0byAweGZmIHRvIGJlIGFibGUgdG8gcmVtb3ZlIGEgc2xvdCAqLworCXJjID0gb3BhbF9zZXRfeGl2ZShod19pcnEsIHNlcnZlciwgMHhmZik7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKKwkJcHJfZXJyKCIlczogb3BhbF9zZXRfeGl2ZSgweGZmKSBpcnE9JXUgcmV0dXJuZWQgJWxsZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBod19pcnEsIHJjKTsKK30KKworc3RhdGljIHZvaWQgaWNzX29wYWxfbWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQoreworCXVuc2lnbmVkIGludCBod19pcnEgPSAodW5zaWduZWQgaW50KWlycWRfdG9faHdpcnEoZCk7CisKKwlwcl9kZXZlbCgiaWNzLWhhbDogbWFzayB2aXJxICVkIFtodyAweCV4XVxuIiwgZC0+aXJxLCBod19pcnEpOworCisJaWYgKGh3X2lycSA9PSBYSUNTX0lQSSB8fCBod19pcnEgPT0gWElDU19JUlFfU1BVUklPVVMpCisJCXJldHVybjsKKwlpY3Nfb3BhbF9tYXNrX3JlYWxfaXJxKGh3X2lycSk7Cit9CisKK3N0YXRpYyBpbnQgaWNzX29wYWxfc2V0X2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZCwKKwkJCQkgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssCisJCQkJIGJvb2wgZm9yY2UpCit7CisJdW5zaWduZWQgaW50IGh3X2lycSA9ICh1bnNpZ25lZCBpbnQpaXJxZF90b19od2lycShkKTsKKwlpbnQxNl90IHNlcnZlcjsKKwlpbnQ4X3QgcHJpb3JpdHk7CisJaW50NjRfdCByYzsKKwlpbnQgd2FudGVkX3NlcnZlcjsKKworCWlmIChod19pcnEgPT0gWElDU19JUEkgfHwgaHdfaXJxID09IFhJQ1NfSVJRX1NQVVJJT1VTKQorCQlyZXR1cm4gLTE7CisKKwlyYyA9IG9wYWxfZ2V0X3hpdmUoaHdfaXJxLCAmc2VydmVyLCAmcHJpb3JpdHkpOworCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogb3BhbF9zZXRfeGl2ZShpcnE9JWQgW2h3IDB4JXhdIHNlcnZlcj0leCkiCisJCSAgICAgICAiIGVycm9yICVsbGRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgZC0+aXJxLCBod19pcnEsIHNlcnZlciwgcmMpOworCQlyZXR1cm4gLTE7CisJfQorCisJd2FudGVkX3NlcnZlciA9IHhpY3NfZ2V0X2lycV9zZXJ2ZXIoZC0+aXJxLCBjcHVtYXNrLCAxKTsKKwlpZiAod2FudGVkX3NlcnZlciA8IDApIHsKKwkJY2hhciBjcHVsaXN0WzEyOF07CisJCWNwdW1hc2tfc2NucHJpbnRmKGNwdWxpc3QsIHNpemVvZihjcHVsaXN0KSwgY3B1bWFzayk7CisJCXByX3dhcm5pbmcoIiVzOiBObyBvbmxpbmUgY3B1cyBpbiB0aGUgbWFzayAlcyBmb3IgaXJxICVkXG4iLAorCQkJICAgX19mdW5jX18sIGNwdWxpc3QsIGQtPmlycSk7CisJCXJldHVybiAtMTsKKwl9CisJc2VydmVyID0gaWNzX29wYWxfbWFuZ2xlX3NlcnZlcih3YW50ZWRfc2VydmVyKTsKKworCXByX2RldmVsKCJpY3MtaGFsOiBzZXQtYWZmaW5pdHkgaXJxICVkIFtodyAweCV4XSBzZXJ2ZXI6IDB4JXgvMHgleFxuIiwKKwkJIGQtPmlycSwgaHdfaXJxLCB3YW50ZWRfc2VydmVyLCBzZXJ2ZXIpOworCisJcmMgPSBvcGFsX3NldF94aXZlKGh3X2lycSwgc2VydmVyLCBwcmlvcml0eSk7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykgeworCQlwcl9lcnIoIiVzOiBvcGFsX3NldF94aXZlKGlycT0lZCBbaHcgMHgleF0gc2VydmVyPSV4KSIKKwkJICAgICAgICIgZXJyb3IgJWxsZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBkLT5pcnEsIGh3X2lycSwgc2VydmVyLCByYyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaWNzX29wYWxfaXJxX2NoaXAgPSB7CisJLm5hbWUgPSAiT1BBTCBJQ1MiLAorCS5pcnFfc3RhcnR1cCA9IGljc19vcGFsX3N0YXJ0dXAsCisJLmlycV9tYXNrID0gaWNzX29wYWxfbWFza19pcnEsCisJLmlycV91bm1hc2sgPSBpY3Nfb3BhbF91bm1hc2tfaXJxLAorCS5pcnFfZW9pID0gTlVMTCwgLyogUGF0Y2hlZCBhdCBpbml0IHRpbWUgKi8KKwkuaXJxX3NldF9hZmZpbml0eSA9IGljc19vcGFsX3NldF9hZmZpbml0eQorfTsKKworc3RhdGljIGludCBpY3Nfb3BhbF9tYXAoc3RydWN0IGljcyAqaWNzLCB1bnNpZ25lZCBpbnQgdmlycSk7CitzdGF0aWMgdm9pZCBpY3Nfb3BhbF9tYXNrX3Vua25vd24oc3RydWN0IGljcyAqaWNzLCB1bnNpZ25lZCBsb25nIHZlYyk7CitzdGF0aWMgbG9uZyBpY3Nfb3BhbF9nZXRfc2VydmVyKHN0cnVjdCBpY3MgKmljcywgdW5zaWduZWQgbG9uZyB2ZWMpOworCitzdGF0aWMgaW50IGljc19vcGFsX2hvc3RfbWF0Y2goc3RydWN0IGljcyAqaWNzLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qIE9ubHkgb25lIGdsb2JhbCAmIHN0YXRlIHN0cnVjdCBpY3MgKi8KK3N0YXRpYyBzdHJ1Y3QgaWNzIGljc19oYWwgPSB7CisJLm1hcAkJPSBpY3Nfb3BhbF9tYXAsCisJLm1hc2tfdW5rbm93bgk9IGljc19vcGFsX21hc2tfdW5rbm93biwKKwkuZ2V0X3NlcnZlcgk9IGljc19vcGFsX2dldF9zZXJ2ZXIsCisJLmhvc3RfbWF0Y2gJPSBpY3Nfb3BhbF9ob3N0X21hdGNoLAorfTsKKworc3RhdGljIGludCBpY3Nfb3BhbF9tYXAoc3RydWN0IGljcyAqaWNzLCB1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwl1bnNpZ25lZCBpbnQgaHdfaXJxID0gKHVuc2lnbmVkIGludCl2aXJxX3RvX2h3KHZpcnEpOworCWludDY0X3QgcmM7CisJaW50MTZfdCBzZXJ2ZXI7CisJaW50OF90IHByaW9yaXR5OworCisJaWYgKFdBUk5fT04oaHdfaXJxID09IFhJQ1NfSVBJIHx8IGh3X2lycSA9PSBYSUNTX0lSUV9TUFVSSU9VUykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgaWYgSEFMIGtub3dzIGFib3V0IHRoaXMgaW50ZXJydXB0ICovCisJcmMgPSBvcGFsX2dldF94aXZlKGh3X2lycSwgJnNlcnZlciwgJnByaW9yaXR5KTsKKwlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKQorCQlyZXR1cm4gLUVOWElPOworCisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZpY3Nfb3BhbF9pcnFfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKKwlpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCAmaWNzX2hhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaWNzX29wYWxfbWFza191bmtub3duKHN0cnVjdCBpY3MgKmljcywgdW5zaWduZWQgbG9uZyB2ZWMpCit7CisJaW50NjRfdCByYzsKKwlpbnQxNl90IHNlcnZlcjsKKwlpbnQ4X3QgcHJpb3JpdHk7CisKKwkvKiBDaGVjayBpZiBIQUwga25vd3MgYWJvdXQgdGhpcyBpbnRlcnJ1cHQgKi8KKwlyYyA9IG9wYWxfZ2V0X3hpdmUodmVjLCAmc2VydmVyLCAmcHJpb3JpdHkpOworCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpCisJCXJldHVybjsKKworCWljc19vcGFsX21hc2tfcmVhbF9pcnEodmVjKTsKK30KKworc3RhdGljIGxvbmcgaWNzX29wYWxfZ2V0X3NlcnZlcihzdHJ1Y3QgaWNzICppY3MsIHVuc2lnbmVkIGxvbmcgdmVjKQoreworCWludDY0X3QgcmM7CisJaW50MTZfdCBzZXJ2ZXI7CisJaW50OF90IHByaW9yaXR5OworCisJLyogQ2hlY2sgaWYgSEFMIGtub3dzIGFib3V0IHRoaXMgaW50ZXJydXB0ICovCisJcmMgPSBvcGFsX2dldF94aXZlKHZlYywgJnNlcnZlciwgJnByaW9yaXR5KTsKKwlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGljc19vcGFsX3VubWFuZ2xlX3NlcnZlcihzZXJ2ZXIpOworfQorCitpbnQgX19pbml0IGljc19vcGFsX2luaXQodm9pZCkKK3sKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogV2UgbmVlZCB0byBwYXRjaCBvdXIgaXJxIGNoaXAncyBFT0kgdG8gcG9pbnQgdG8gdGhlCisJICogcmlnaHQgSUNQCisJICovCisJaWNzX29wYWxfaXJxX2NoaXAuaXJxX2VvaSA9IGljcF9vcHMtPmVvaTsKKworCS8qIFJlZ2lzdGVyIG91cnNlbHZlcyAqLworCXhpY3NfcmVnaXN0ZXJfaWNzKCZpY3NfaGFsKTsKKworCXByX2luZm8oIklDUyBPUEFMIGJhY2tlbmQgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy94aWNzLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL3hpY3MtY29tbW9uLmMKaW5kZXggNDQ1YzVhMC4uNjM3NjJjNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL3hpY3MtY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL3hpY3MtY29tbW9uLmMKQEAgLTEzNCwxMSArMTM0LDEwIEBACiAJQlVHX09OKGlwaSA9PSBOT19JUlEpOwogCiAJLyoKLQkgKiBJUElzIGFyZSBtYXJrZWQgSVJRRl9ESVNBQkxFRCBhcyB0aGV5IG11c3QgcnVuIHdpdGggaXJxcwotCSAqIGRpc2FibGVkLCBhbmQgUEVSQ1BVLiAgVGhlIGhhbmRsZXIgd2FzIHNldCBpbiBtYXAuCisJICogSVBJcyBhcmUgbWFya2VkIElSUUZfUEVSQ1BVLiBUaGUgaGFuZGxlciB3YXMgc2V0IGluIG1hcC4KIAkgKi8KIAlCVUdfT04ocmVxdWVzdF9pcnEoaXBpLCBpY3Bfb3BzLT5pcGlfYWN0aW9uLAotCQkJICAgSVJRRl9ESVNBQkxFRHxJUlFGX1BFUkNQVSwgIklQSSIsIE5VTEwpKTsKKwkJCSAgIElSUUZfUEVSQ1BVLCAiSVBJIiwgTlVMTCkpOwogfQogCiBpbnQgX19pbml0IHhpY3Nfc21wX3Byb2JlKHZvaWQpCkBAIC00MDksMTQgKzQwOCwxMCBAQAogCWludCByYyA9IC0xOwogCiAJLyogRmlzdCBsb2NhdGUgSUNQICovCi0jaWZkZWYgQ09ORklHX1BQQ19JQ1BfSFYKIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSkKIAkJcmMgPSBpY3BfaHZfaW5pdCgpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BQQ19JQ1BfTkFUSVZFCiAJaWYgKHJjIDwgMCkKIAkJcmMgPSBpY3BfbmF0aXZlX2luaXQoKTsKLSNlbmRpZgogCWlmIChyYyA8IDApIHsKIAkJcHJfd2FybmluZygiWElDUzogQ2Fubm90IGZpbmQgYSBQcmVzZW50YXRpb24gQ29udHJvbGxlciAhXG4iKTsKIAkJcmV0dXJuOwpAQCAtNDI5LDkgKzQyNCw5IEBACiAJeGljc19pcGlfY2hpcC5pcnFfZW9pID0gaWNwX29wcy0+ZW9pOwogCiAJLyogTm93IGxvY2F0ZSBJQ1MgKi8KLSNpZmRlZiBDT05GSUdfUFBDX0lDU19SVEFTCiAJcmMgPSBpY3NfcnRhc19pbml0KCk7Ci0jZW5kaWYKKwlpZiAocmMgPCAwKQorCQlyYyA9IGljc19vcGFsX2luaXQoKTsKIAlpZiAocmMgPCAwKQogCQlwcl93YXJuaW5nKCJYSUNTOiBDYW5ub3QgZmluZCBhIFNvdXJjZSBDb250cm9sbGVyICFcbiIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKaW5kZXggNDI1NDFiYi4uMDNhMjE3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KQEAgLTM0MCw4ICszNDAsOCBAQAogCiBzdGF0aWMgaW5saW5lIGludCB1bnJlY292ZXJhYmxlX2V4Y3Aoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWZkZWYgQ09ORklHXzR4eAotCS8qIFdlIGhhdmUgbm8gTVNSX1JJIGJpdCBvbiA0eHgsIHNvIHdlIHNpbXBseSByZXR1cm4gZmFsc2UgKi8KKyNpZiBkZWZpbmVkKENPTkZJR180eHgpIHx8IGRlZmluZWQoQ09ORklHX0JPT0szRSkKKwkvKiBXZSBoYXZlIG5vIE1TUl9SSSBiaXQgb24gNHh4IG9yIEJvb2szZSwgc28gd2Ugc2ltcGx5IHJldHVybiBmYWxzZSAqLwogCXJldHVybiAwOwogI2Vsc2UKIAlyZXR1cm4gKChyZWdzLT5tc3IgJiBNU1JfUkkpID09IDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCA2Yjk5ZmMzLi5hOWZiZDQzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2NvbmZpZworKysgYi9hcmNoL3MzOTAvS2NvbmZpZwpAQCAtNTY5LDYgKzU2OSwxNiBAQAogCSAgY3VycmVudCBrZXJuZWwsIGFuZCB0byBzdGFydCBhbm90aGVyIGtlcm5lbC4gIEl0IGlzIGxpa2UgYSByZWJvb3QKIAkgIGJ1dCBpcyBpbmRlcGVuZGVudCBvZiBoYXJkd2FyZS9taWNyb2NvZGUgc3VwcG9ydC4KIAorY29uZmlnIENSQVNIX0RVTVAKKwlib29sICJrZXJuZWwgY3Jhc2ggZHVtcHMiCisJZGVwZW5kcyBvbiA2NEJJVAorCWhlbHAKKwkgIEdlbmVyYXRlIGNyYXNoIGR1bXAgYWZ0ZXIgYmVpbmcgc3RhcnRlZCBieSBrZXhlYy4KKwkgIENyYXNoIGR1bXAga2VybmVscyBhcmUgbG9hZGVkIGluIHRoZSBtYWluIGtlcm5lbCB3aXRoIGtleGVjLXRvb2xzCisJICBpbnRvIGEgc3BlY2lhbGx5IHJlc2VydmVkIHJlZ2lvbiBhbmQgdGhlbiBsYXRlciBleGVjdXRlZCBhZnRlcgorCSAgYSBjcmFzaCBieSBrZHVtcC9rZXhlYy4KKwkgIEZvciBtb3JlIGRldGFpbHMgc2VlIERvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0CisKIGNvbmZpZyBaRkNQRFVNUAogCWRlZl9ib29sIG4KIAlwcm9tcHQgInpmY3BkdW1wIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvbWlzYy5jCmluZGV4IDAyOGYyM2UuLjQ2NWVjYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC02MSw3ICs2MSw3IEBACiAKIGV4dGVybiBfc2NscF9wcmludF9lYXJseShjb25zdCBjaGFyICopOwogCi1pbnQgcHV0cyhjb25zdCBjaGFyICpzKQorc3RhdGljIGludCBwdXRzKGNvbnN0IGNoYXIgKnMpCiB7CiAJX3NjbHBfcHJpbnRfZWFybHkocyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL3NoYV9jb21tb24uYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhX2NvbW1vbi5jCmluZGV4IDQ4ODg0ZjguLmJkMzdkMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhX2NvbW1vbi5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhX2NvbW1vbi5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAic2hhLmgiCiAjaW5jbHVkZSAiY3J5cHRfczM5MC5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvZGVmY29uZmlnIGIvYXJjaC9zMzkwL2RlZmNvbmZpZwppbmRleCAyOWM4MmM2Li42Y2Y4ZTI2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9kZWZjb25maWcKQEAgLTY4LDcgKzY4LDcgQEAKIENPTkZJR19ORVRfQ0xTX0FDVD15CiBDT05GSUdfTkVUX0FDVF9QT0xJQ0U9eQogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLSMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQogQ09ORklHX0JMS19ERVZfTE9PUD1tCiBDT05GSUdfQkxLX0RFVl9OQkQ9bQogQ09ORklHX0JMS19ERVZfUkFNPXkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jIGIvYXJjaC9zMzkwL2h5cGZzL2lub2RlLmMKaW5kZXggNmZlODc0Zi4uNDgxZjRmNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2h5cGZzL2lub2RlLmMKKysrIGIvYXJjaC9zMzkwL2h5cGZzL2lub2RlLmMKQEAgLTEwOCw5ICsxMDgsNyBAQAogCQlyZXQtPmlfZ2lkID0gaHlwZnNfaW5mby0+Z2lkOwogCQlyZXQtPmlfYXRpbWUgPSByZXQtPmlfbXRpbWUgPSByZXQtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCWlmIChtb2RlICYgU19JRkRJUikKLQkJCXJldC0+aV9ubGluayA9IDI7Ci0JCWVsc2UKLQkJCXJldC0+aV9ubGluayA9IDE7CisJCQlzZXRfbmxpbmsocmV0LCAyKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTM2MSw3ICszNTksNyBAQAogCX0gZWxzZSBpZiAobW9kZSAmIFNfSUZESVIpIHsKIAkJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwotCQlwYXJlbnQtPmRfaW5vZGUtPmlfbmxpbmsrKzsKKwkJaW5jX25saW5rKHBhcmVudC0+ZF9pbm9kZSk7CiAJfSBlbHNlCiAJCUJVRygpOwogCWlub2RlLT5pX3ByaXZhdGUgPSBkYXRhOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2Rldi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2Rldi5oCmluZGV4IDYyM2YyZmIuLjkzODFjOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dkZXYuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3ZGV2LmgKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxhc20vZmN4Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAvKiBzdHJ1Y3RzIGZyb20gYXNtL2Npby5oICovCiBzdHJ1Y3QgaXJiOwpAQCAtMTI3LDYgKzEyOCw3IEBACiAgKiBAcmVzdG9yZTogY2FsbGJhY2sgZm9yIHJlc3RvcmluZyBhZnRlciBoaWJlcm5hdGlvbgogICogQHVjX2hhbmRsZXI6IGNhbGxiYWNrIGZvciB1bml0IGNoZWNrIGhhbmRsZXIKICAqIEBkcml2ZXI6IGVtYmVkZGVkIGRldmljZSBkcml2ZXIgc3RydWN0dXJlCisgKiBAaW50X2NsYXNzOiBpbnRlcnJ1cHRpb24gY2xhc3MgdG8gdXNlIGZvciBhY2NvdW50aW5nIGludGVycnVwdHMKICAqLwogc3RydWN0IGNjd19kcml2ZXIgewogCXN0cnVjdCBjY3dfZGV2aWNlX2lkICppZHM7CkBAIC0xNDQsNiArMTQ2LDcgQEAKIAlpbnQgKCpyZXN0b3JlKShzdHJ1Y3QgY2N3X2RldmljZSAqKTsKIAllbnVtIHVjX3RvZG8gKCp1Y19oYW5kbGVyKSAoc3RydWN0IGNjd19kZXZpY2UgKiwgc3RydWN0IGlyYiAqKTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisJZW51bSBpbnRlcnJ1cHRpb25fY2xhc3MgaW50X2NsYXNzOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBjY3dfZGV2aWNlICpnZXRfY2N3ZGV2X2J5X2J1c2lkKHN0cnVjdCBjY3dfZHJpdmVyICpjZHJ2LApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NvbXBhdC5oCmluZGV4IGRhMzU5Y2EuLjJlNDk3NDhiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NvbXBhdC5oCkBAIC0xMiw2ICsxMiw3IEBACiAjZGVmaW5lIFBTVzMyX01BU0tfSU8JCTB4MDIwMDAwMDBVTAogI2RlZmluZSBQU1czMl9NQVNLX0VYVAkJMHgwMTAwMDAwMFVMCiAjZGVmaW5lIFBTVzMyX01BU0tfS0VZCQkweDAwRjAwMDAwVUwKKyNkZWZpbmUgUFNXMzJfTUFTS19CQVNFCQkweDAwMDgwMDAwVUwJLyogQWx3YXlzIG9uZSAqLwogI2RlZmluZSBQU1czMl9NQVNLX01DSEVDSwkweDAwMDQwMDAwVUwKICNkZWZpbmUgUFNXMzJfTUFTS19XQUlUCQkweDAwMDIwMDAwVUwKICNkZWZpbmUgUFNXMzJfTUFTS19QU1RBVEUJMHgwMDAxMDAwMFVMCkBAIC0xOSwyMSArMjAsMTkgQEAKICNkZWZpbmUgUFNXMzJfTUFTS19DQwkJMHgwMDAwMzAwMFVMCiAjZGVmaW5lIFBTVzMyX01BU0tfUE0JCTB4MDAwMDBmMDBVTAogCi0jZGVmaW5lIFBTVzMyX0FERFJfQU1PREUzMQkweDgwMDAwMDAwVUwKKyNkZWZpbmUgUFNXMzJfTUFTS19VU0VSCQkweDAwMDAzRjAwVUwKKworI2RlZmluZSBQU1czMl9BRERSX0FNT0RFCTB4ODAwMDAwMDBVTAogI2RlZmluZSBQU1czMl9BRERSX0lOU04JCTB4N0ZGRkZGRkZVTAogCi0jZGVmaW5lIFBTVzMyX0JBU0VfQklUUwkJMHgwMDA4MDAwMFVMCisjZGVmaW5lIFBTVzMyX0RFRkFVTFRfS0VZCSgoKHUzMikgUEFHRV9ERUZBVUxUX0FDQykgPDwgMjApCiAKICNkZWZpbmUgUFNXMzJfQVNDX1BSSU1BUlkJMHgwMDAwMDAwMFVMCiAjZGVmaW5lIFBTVzMyX0FTQ19BQ0NSRUcJMHgwMDAwNDAwMFVMCiAjZGVmaW5lIFBTVzMyX0FTQ19TRUNPTkRBUlkJMHgwMDAwODAwMFVMCiAjZGVmaW5lIFBTVzMyX0FTQ19IT01FCQkweDAwMDBDMDAwVUwKIAotI2RlZmluZSBQU1czMl9NQVNLX01FUkdFKENVUlJFTlQsTkVXKSBcCi0JKCgoQ1VSUkVOVCkgJiB+KFBTVzMyX01BU0tfQ0N8UFNXMzJfTUFTS19QTSkpIHwgXAotCSAoKE5FVykgJiAoUFNXMzJfTUFTS19DQ3xQU1czMl9NQVNLX1BNKSkpCi0KLWV4dGVybiBsb25nIHBzdzMyX3VzZXJfYml0czsKK2V4dGVybiB1MzIgcHN3MzJfdXNlcl9iaXRzOwogCiAjZGVmaW5lIENPTVBBVF9VU0VSX0haCQkxMDAKICNkZWZpbmUgQ09NUEFUX1VUU19NQUNISU5FCSJzMzkwXDBcMFwwXDAiCkBAIC0xMzEsNyArMTMwLDggQEAKIAljb21wYXRfZnNpZF90CWZfZnNpZDsKIAlzMzIJCWZfbmFtZWxlbjsKIAlzMzIJCWZfZnJzaXplOwotCXMzMgkJZl9zcGFyZVs2XTsKKwlzMzIJCWZfZmxhZ3M7CisJczMyCQlmX3NwYXJlWzVdOwogfTsKIAogI2RlZmluZSBDT01QQVRfUkxJTV9PTERfSU5GSU5JVFkJMHg3ZmZmZmZmZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lwbC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lwbC5oCmluZGV4IDk3Y2M0NDAuLjY5NDBhYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcGwuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXBsLmgKQEAgLTE2OCw1ICsxNjgsNiBAQAogCiBleHRlcm4gaW50IGRpYWczMDgodW5zaWduZWQgbG9uZyBzdWJjb2RlLCB2b2lkICphZGRyKTsKIGV4dGVybiB2b2lkIGRpYWczMDhfcmVzZXQodm9pZCk7CitleHRlcm4gdm9pZCBzdG9yZV9zdGF0dXModm9pZCk7CiAKICNlbmRpZiAvKiBfQVNNX1MzOTBfSVBMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcnEuaAppbmRleCBiYTdiMDFjLi5iYTZkODVmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXJxLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lycS5oCkBAIC04LDcgKzgsOCBAQAogCUVYVEVSTkFMX0lOVEVSUlVQVCwKIAlJT19JTlRFUlJVUFQsCiAJRVhUSU5UX0NMSywKLQlFWFRJTlRfSVBJLAorCUVYVElOVF9FWEMsCisJRVhUSU5UX0VNUywKIAlFWFRJTlRfVE1SLAogCUVYVElOVF9UTEEsCiAJRVhUSU5UX1BGTCwKQEAgLTE3LDggKzE4LDggQEAKIAlFWFRJTlRfU0NQLAogCUVYVElOVF9JVUMsCiAJRVhUSU5UX0NQTSwKKwlJT0lOVF9DSU8sCiAJSU9JTlRfUUFJLAotCUlPSU5UX1FESSwKIAlJT0lOVF9EQVMsCiAJSU9JTlRfQzE1LAogCUlPSU5UX0M3MCwKQEAgLTI4LDYgKzI5LDcgQEAKIAlJT0lOVF9DTFcsCiAJSU9JTlRfQ1RDLAogCUlPSU5UX0FQQiwKKwlJT0lOVF9DU0MsCiAJTk1JX05NSSwKIAlOUl9JUlFTLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rZXhlYy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2tleGVjLmgKaW5kZXggYmI3MjliOC4uY2Y0ZTQ3YiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2tleGVjLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2tleGVjLmgKQEAgLTMwLDkgKzMwLDE1IEBACiAvKiBOb3QgbW9yZSB0aGFuIDJHQiAqLwogI2RlZmluZSBLRVhFQ19DT05UUk9MX01FTU9SWV9MSU1JVCAoMVVMPDwzMSkKIAorLyogTWF4aW11bSBhZGRyZXNzIHdlIGNhbiB1c2UgZm9yIHRoZSBjcmFzaCBjb250cm9sIHBhZ2VzICovCisjZGVmaW5lIEtFWEVDX0NSQVNIX0NPTlRST0xfTUVNT1JZX0xJTUlUICgtMVVMKQorCiAvKiBBbGxvY2F0ZSBvbmUgcGFnZSBmb3IgdGhlIHBkcCBhbmQgdGhlIHNlY29uZCBmb3IgdGhlIGNvZGUgKi8KICNkZWZpbmUgS0VYRUNfQ09OVFJPTF9QQUdFX1NJWkUgNDA5NgogCisvKiBBbGlnbm1lbnQgb2YgY3Jhc2hrZXJuZWwgbWVtb3J5ICovCisjZGVmaW5lIEtFWEVDX0NSQVNIX01FTV9BTElHTiBIUEFHRV9TSVpFCisKIC8qIFRoZSBuYXRpdmUgYXJjaGl0ZWN0dXJlICovCiAjZGVmaW5lIEtFWEVDX0FSQ0ggS0VYRUNfQVJDSF9TMzkwCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggMDBmZjAwZC4uMjRlMTg0NyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTExOSw2ICsxMTksNyBAQAogCXUzMiBpbnN0cnVjdGlvbl9sY3RsZzsKIAl1MzIgZXhpdF9wcm9ncmFtX2ludGVycnVwdGlvbjsKIAl1MzIgZXhpdF9pbnN0cl9hbmRfcHJvZ3JhbTsKKwl1MzIgZGVsaXZlcl9leHRlcm5hbF9jYWxsOwogCXUzMiBkZWxpdmVyX2VtZXJnZW5jeV9zaWduYWw7CiAJdTMyIGRlbGl2ZXJfc2VydmljZV9zaWduYWw7CiAJdTMyIGRlbGl2ZXJfdmlydGlvX2ludGVycnVwdDsKQEAgLTEzOCwxMSArMTM5LDEzIEBACiAJdTMyIGluc3RydWN0aW9uX3N0Zmw7CiAJdTMyIGluc3RydWN0aW9uX3Rwcm90OwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3NlbnNlOworCXUzMiBpbnN0cnVjdGlvbl9zaWdwX2V4dGVybmFsX2NhbGw7CiAJdTMyIGluc3RydWN0aW9uX3NpZ3BfZW1lcmdlbmN5OwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3N0b3A7CiAJdTMyIGluc3RydWN0aW9uX3NpZ3BfYXJjaDsKIAl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9wcmVmaXg7CiAJdTMyIGluc3RydWN0aW9uX3NpZ3BfcmVzdGFydDsKKwl1MzIgZGlhZ25vc2VfMTA7CiAJdTMyIGRpYWdub3NlXzQ0OwogfTsKIApAQCAtMTc0LDYgKzE3NywxMCBAQAogCV9fdTMyIGFkZHJlc3M7CiB9OwogCitzdHJ1Y3Qga3ZtX3MzOTBfZXh0Y2FsbF9pbmZvIHsKKwlfX3UxNiBjb2RlOworfTsKKwogc3RydWN0IGt2bV9zMzkwX2VtZXJnX2luZm8gewogCV9fdTE2IGNvZGU7CiB9OwpAQCAtMTg2LDYgKzE5Myw3IEBACiAJCXN0cnVjdCBrdm1fczM5MF9leHRfaW5mbyBleHQ7CiAJCXN0cnVjdCBrdm1fczM5MF9wZ21faW5mbyBwZ207CiAJCXN0cnVjdCBrdm1fczM5MF9lbWVyZ19pbmZvIGVtZXJnOworCQlzdHJ1Y3Qga3ZtX3MzOTBfZXh0Y2FsbF9pbmZvIGV4dGNhbGw7CiAJCXN0cnVjdCBrdm1fczM5MF9wcmVmaXhfaW5mbyBwcmVmaXg7CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaAppbmRleCBlODVjOTExLi45ZTEzYzdkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKQEAgLTE1MSwxMCArMTUxLDggQEAKIAkgKi8KIAlfX3UzMglpcGliOwkJCQkvKiAweDBlMDAgKi8KIAlfX3UzMglpcGliX2NoZWNrc3VtOwkJCS8qIDB4MGUwNCAqLwotCi0JLyogNjQgYml0IHNhdmUgYXJlYSAqLwotCV9fdTY0CXNhdmVfYXJlYV82NDsJCQkvKiAweDBlMDggKi8KLQlfX3U4CXBhZF8weDBlMTBbMHgwZjAwLTB4MGUxMF07CS8qIDB4MGUxMCAqLworCV9fdTMyCXZtY29yZV9pbmZvOwkJCS8qIDB4MGUwOCAqLworCV9fdTgJcGFkXzB4MGUwY1sweDBmMDAtMHgwZTBjXTsJLyogMHgwZTBjICovCiAKIAkvKiBFeHRlbmRlZCBmYWNpbGl0eSBsaXN0ICovCiAJX191NjQJc3RmbGVfZmFjX2xpc3RbMzJdOwkJLyogMHgwZjAwICovCkBAIC0yOTAsOSArMjg4LDcgQEAKIAkgKi8KIAlfX3U2NAlpcGliOwkJCQkvKiAweDBlMDAgKi8KIAlfX3UzMglpcGliX2NoZWNrc3VtOwkJCS8qIDB4MGUwOCAqLwotCi0JLyogNjQgYml0IHNhdmUgYXJlYSAqLwotCV9fdTY0CXNhdmVfYXJlYV82NDsJCQkvKiAweDBlMGMgKi8KKwlfX3U2NAl2bWNvcmVfaW5mbzsJCQkvKiAweDBlMGMgKi8KIAlfX3U4CXBhZF8weDBlMTRbMHgwZjAwLTB4MGUxNF07CS8qIDB4MGUxNCAqLwogCiAJLyogRXh0ZW5kZWQgZmFjaWxpdHkgbGlzdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggYWNjYjM3Mi4uZjdlYzU0OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0xNzcsNiArMTc3LDcgQEAKIHN0cnVjdCBwYWdlOwogdm9pZCBhcmNoX2ZyZWVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKTsKIHZvaWQgYXJjaF9hbGxvY19wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3JkZXIpOwordm9pZCBhcmNoX3NldF9wYWdlX3N0YXRlcyhpbnQgbWFrZV9zdGFibGUpOwogCiBzdGF0aWMgaW5saW5lIGludCBkZXZtZW1faXNfYWxsb3dlZCh1bnNpZ25lZCBsb25nIHBmbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGMwY2I3OTQuLjM0ZWRlMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtNjk2LDcgKzY5Niw5IEBACiBpbnQgZ21hcF9tYXBfc2VnbWVudChzdHJ1Y3QgZ21hcCAqZ21hcCwgdW5zaWduZWQgbG9uZyBmcm9tLAogCQkgICAgIHVuc2lnbmVkIGxvbmcgdG8sIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKIGludCBnbWFwX3VubWFwX3NlZ21lbnQoc3RydWN0IGdtYXAgKmdtYXAsIHVuc2lnbmVkIGxvbmcgdG8sIHVuc2lnbmVkIGxvbmcgbGVuKTsKK3Vuc2lnbmVkIGxvbmcgX19nbWFwX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGdtYXAgKik7CiB1bnNpZ25lZCBsb25nIGdtYXBfZmF1bHQodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZ21hcCAqKTsKK3ZvaWQgZ21hcF9kaXNjYXJkKHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyB0bywgc3RydWN0IGdtYXAgKik7CiAKIC8qCiAgKiBDZXJ0YWluIGFyY2hpdGVjdHVyZXMgbmVlZCB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuIFBURXMKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBhNGI2MjI5Li41ZjMzZDM3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0zMyw2ICszMyw4IEBACiAKIGV4dGVybiB2b2lkIHMzOTBfYWRqdXN0X2ppZmZpZXModm9pZCk7CiBleHRlcm4gaW50IGdldF9jcHVfY2FwYWJpbGl0eSh1bnNpZ25lZCBpbnQgKik7CitleHRlcm4gY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3A7CitleHRlcm4gaW50IHN5c2N0bF9pZWVlX2VtdWxhdGlvbl93YXJuaW5nczsKIAogLyoKICAqIFVzZXIgc3BhY2UgcHJvY2VzcyBzaXplOiAyR0IgZm9yIDMxIGJpdCwgNFRCIG9yIDhQVCBmb3IgNjQgYml0LgpAQCAtMTE4LDE3ICsxMjAsMTcgQEAKIC8qCiAgKiBEbyBuZWNlc3Nhcnkgc2V0dXAgdG8gc3RhcnQgdXAgYSBuZXcgdGhyZWFkLgogICovCi0jZGVmaW5lIHN0YXJ0X3RocmVhZChyZWdzLCBuZXdfcHN3LCBuZXdfc3RhY2twKSBkbyB7CQlcCi0JcmVncy0+cHN3Lm1hc2sJPSBwc3dfdXNlcl9iaXRzOwkJCVwKLQlyZWdzLT5wc3cuYWRkcgk9IG5ld19wc3cgfCBQU1dfQUREUl9BTU9ERTsJCVwKLQlyZWdzLT5ncHJzWzE1XQk9IG5ld19zdGFja3A7CQkJCVwKKyNkZWZpbmUgc3RhcnRfdGhyZWFkKHJlZ3MsIG5ld19wc3csIG5ld19zdGFja3ApIGRvIHsJCQlcCisJcmVncy0+cHN3Lm1hc2sJPSBwc3dfdXNlcl9iaXRzIHwgUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQTsJXAorCXJlZ3MtPnBzdy5hZGRyCT0gbmV3X3BzdyB8IFBTV19BRERSX0FNT0RFOwkJCVwKKwlyZWdzLT5ncHJzWzE1XQk9IG5ld19zdGFja3A7CQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIHN0YXJ0X3RocmVhZDMxKHJlZ3MsIG5ld19wc3csIG5ld19zdGFja3ApIGRvIHsJCVwKLQlyZWdzLT5wc3cubWFzawk9IHBzd191c2VyMzJfYml0czsJCQlcCi0JcmVncy0+cHN3LmFkZHIJPSBuZXdfcHN3IHwgUFNXX0FERFJfQU1PREU7CQlcCi0JcmVncy0+Z3Byc1sxNV0JPSBuZXdfc3RhY2twOwkJCQlcCi0JY3JzdF90YWJsZV9kb3duZ3JhZGUoY3VycmVudC0+bW0sIDFVTCA8PCAzMSk7CQlcCisjZGVmaW5lIHN0YXJ0X3RocmVhZDMxKHJlZ3MsIG5ld19wc3csIG5ld19zdGFja3ApIGRvIHsJCQlcCisJcmVncy0+cHN3Lm1hc2sJPSBwc3dfdXNlcl9iaXRzIHwgUFNXX01BU0tfQkE7CQkJXAorCXJlZ3MtPnBzdy5hZGRyCT0gbmV3X3BzdyB8IFBTV19BRERSX0FNT0RFOwkJCVwKKwlyZWdzLT5ncHJzWzE1XQk9IG5ld19zdGFja3A7CQkJCQlcCisJY3JzdF90YWJsZV9kb3duZ3JhZGUoY3VycmVudC0+bW0sIDFVTCA8PCAzMSk7CQkJXAogfSB3aGlsZSAoMCkKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiwgYSBzdHJhbmdlIEMgdGhpbmcgKi8KQEAgLTE4Nyw3ICsxODksNiBAQAogICogU2V0IFBTVyBtYXNrIHRvIHNwZWNpZmllZCB2YWx1ZSwgd2hpbGUgbGVhdmluZyB0aGUKICAqIFBTVyBhZGRyIHBvaW50aW5nIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLgogICovCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2xvYWRfcHN3X21hc2sgKHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CkBAIC0yMTIsMjYgKzIxMywzNyBAQAogCQk6ICI9JmQiIChhZGRyKSwgIj1RIiAocHN3KSA6ICJRIiAocHN3KSA6ICJtZW1vcnkiLCAiY2MiKTsKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KIH0KLSAKLS8qCi0gKiBGdW5jdGlvbiB0byBzdG9wIGEgcHJvY2Vzc29yIHVudGlsIGFuIGludGVycnVwdGlvbiBvY2N1cnJlZAotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlZF93YWl0KHZvaWQpCi17Ci0JX19sb2FkX3Bzd19tYXNrKFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19JTyB8IFBTV19NQVNLX0VYVCB8Ci0JCQlQU1dfTUFTS19NQ0hFQ0sgfCBQU1dfTUFTS19XQUlUIHwgUFNXX0RFRkFVTFRfS0VZKTsKLX0KIAogLyoKKyAqIFJld2luZCBQU1cgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBieSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yZXdpbmRfcHN3KHBzd190IHBzdywgdW5zaWduZWQgbG9uZyBpbGMpCit7CisjaWZuZGVmIF9fczM5MHhfXworCWlmIChwc3cuYWRkciAmIFBTV19BRERSX0FNT0RFKQorCQkvKiAzMSBiaXQgbW9kZSAqLworCQlyZXR1cm4gKHBzdy5hZGRyIC0gaWxjKSB8IFBTV19BRERSX0FNT0RFOworCS8qIDI0IGJpdCBtb2RlICovCisJcmV0dXJuIChwc3cuYWRkciAtIGlsYykgJiAoKDFVTCA8PCAyNCkgLSAxKTsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJbWFzayA9IChwc3cubWFzayAmIFBTV19NQVNLX0VBKSA/IC0xVUwgOgorCSAgICAgICAocHN3Lm1hc2sgJiBQU1dfTUFTS19CQSkgPyAoMVVMIDw8IDMxKSAtIDEgOgorCQkJCQkgICgxVUwgPDwgMjQpIC0gMTsKKwlyZXR1cm4gKHBzdy5hZGRyIC0gaWxjKSAmIG1hc2s7CisjZW5kaWYKK30KKyAKKy8qCiAgKiBGdW5jdGlvbiB0byBkcm9wIGEgcHJvY2Vzc29yIGludG8gZGlzYWJsZWQgd2FpdCBzdGF0ZQogICovCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBBVFRSSUJfTk9SRVQgZGlzYWJsZWRfd2FpdCh1bnNpZ25lZCBsb25nIGNvZGUpCiB7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgY3RsX2J1ZjsKICAgICAgICAgcHN3X3QgZHdfcHN3OwogCi0gICAgICAgIGR3X3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19NQVNLX1dBSVQ7CisJZHdfcHN3Lm1hc2sgPSBQU1dfTUFTS19CQVNFIHwgUFNXX01BU0tfV0FJVCB8IFBTV19NQVNLX0JBIHwgUFNXX01BU0tfRUE7CiAgICAgICAgIGR3X3Bzdy5hZGRyID0gY29kZTsKICAgICAgICAgLyogCiAgICAgICAgICAqIFN0b3JlIHN0YXR1cyBhbmQgdGhlbiBsb2FkIGRpc2FibGVkIHdhaXQgcHN3LApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IDYyZmQ4MGMuLmE2NTg0NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTIzMCwxNyArMjMwLDIxIEBACiAjZGVmaW5lIFBTV19NQVNLX0lPCQkweDAyMDAwMDAwVUwKICNkZWZpbmUgUFNXX01BU0tfRVhUCQkweDAxMDAwMDAwVUwKICNkZWZpbmUgUFNXX01BU0tfS0VZCQkweDAwRjAwMDAwVUwKKyNkZWZpbmUgUFNXX01BU0tfQkFTRQkJMHgwMDA4MDAwMFVMCS8qIGFsd2F5cyBvbmUgKi8KICNkZWZpbmUgUFNXX01BU0tfTUNIRUNLCQkweDAwMDQwMDAwVUwKICNkZWZpbmUgUFNXX01BU0tfV0FJVAkJMHgwMDAyMDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX1BTVEFURQkJMHgwMDAxMDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX0FTQwkJMHgwMDAwQzAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX0NDCQkweDAwMDAzMDAwVUwKICNkZWZpbmUgUFNXX01BU0tfUE0JCTB4MDAwMDBGMDBVTAorI2RlZmluZSBQU1dfTUFTS19FQQkJMHgwMDAwMDAwMFVMCisjZGVmaW5lIFBTV19NQVNLX0JBCQkweDAwMDAwMDAwVUwKKworI2RlZmluZSBQU1dfTUFTS19VU0VSCQkweDAwMDAzRjAwVUwKIAogI2RlZmluZSBQU1dfQUREUl9BTU9ERQkJMHg4MDAwMDAwMFVMCiAjZGVmaW5lIFBTV19BRERSX0lOU04JCTB4N0ZGRkZGRkZVTAogCi0jZGVmaW5lIFBTV19CQVNFX0JJVFMJCTB4MDAwODAwMDBVTAogI2RlZmluZSBQU1dfREVGQVVMVF9LRVkJCSgoKHVuc2lnbmVkIGxvbmcpIFBBR0VfREVGQVVMVF9BQ0MpIDw8IDIwKQogCiAjZGVmaW5lIFBTV19BU0NfUFJJTUFSWQkJMHgwMDAwMDAwMFVMCkBAIC0yNTQsNiArMjU4LDcgQEAKICNkZWZpbmUgUFNXX01BU0tfREFUCQkweDA0MDAwMDAwMDAwMDAwMDBVTAogI2RlZmluZSBQU1dfTUFTS19JTwkJMHgwMjAwMDAwMDAwMDAwMDAwVUwKICNkZWZpbmUgUFNXX01BU0tfRVhUCQkweDAxMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBQU1dfTUFTS19CQVNFCQkweDAwMDAwMDAwMDAwMDAwMDBVTAogI2RlZmluZSBQU1dfTUFTS19LRVkJCTB4MDBGMDAwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX01DSEVDSwkJMHgwMDA0MDAwMDAwMDAwMDAwVUwKICNkZWZpbmUgUFNXX01BU0tfV0FJVAkJMHgwMDAyMDAwMDAwMDAwMDAwVUwKQEAgLTI2MSwxMiArMjY2LDE0IEBACiAjZGVmaW5lIFBTV19NQVNLX0FTQwkJMHgwMDAwQzAwMDAwMDAwMDAwVUwKICNkZWZpbmUgUFNXX01BU0tfQ0MJCTB4MDAwMDMwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX1BNCQkweDAwMDAwRjAwMDAwMDAwMDBVTAorI2RlZmluZSBQU1dfTUFTS19FQQkJMHgwMDAwMDAwMTAwMDAwMDAwVUwKKyNkZWZpbmUgUFNXX01BU0tfQkEJCTB4MDAwMDAwMDA4MDAwMDAwMFVMCisKKyNkZWZpbmUgUFNXX01BU0tfVVNFUgkJMHgwMDAwM0YwMTgwMDAwMDAwVUwKIAogI2RlZmluZSBQU1dfQUREUl9BTU9ERQkJMHgwMDAwMDAwMDAwMDAwMDAwVUwKICNkZWZpbmUgUFNXX0FERFJfSU5TTgkJMHhGRkZGRkZGRkZGRkZGRkZGVUwKIAotI2RlZmluZSBQU1dfQkFTRV9CSVRTCQkweDAwMDAwMDAxODAwMDAwMDBVTAotI2RlZmluZSBQU1dfQkFTRTMyX0JJVFMJCTB4MDAwMDAwMDA4MDAwMDAwMFVMCiAjZGVmaW5lIFBTV19ERUZBVUxUX0tFWQkJKCgodW5zaWduZWQgbG9uZykgUEFHRV9ERUZBVUxUX0FDQykgPDwgNTIpCiAKICNkZWZpbmUgUFNXX0FTQ19QUklNQVJZCQkweDAwMDAwMDAwMDAwMDAwMDBVTApAQCAtMjc5LDE4ICsyODYsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIGV4dGVybiBsb25nIHBzd19rZXJuZWxfYml0czsKIGV4dGVybiBsb25nIHBzd191c2VyX2JpdHM7Ci0jaWZkZWYgQ09ORklHXzY0QklUCi1leHRlcm4gbG9uZyBwc3dfdXNlcjMyX2JpdHM7CiAjZW5kaWYKLSNlbmRpZgotCi0vKiBUaGlzIG1hY3JvIG1lcmdlcyBhIE5FVyBQU1cgbWFzayBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaW50bwotICAgdGhlIGN1cnJlbnRseSBhY3RpdmUgUFNXIG1hc2sgQ1VSUkVOVCwgbW9kaWZ5aW5nIG9ubHkgdGhvc2UKLSAgIGJpdHMgaW4gQ1VSUkVOVCB0aGF0IHRoZSB1c2VyIG1heSBiZSBhbGxvd2VkIHRvIGNoYW5nZTogdGhpcwotICAgaXMgdGhlIGNvbmRpdGlvbiBjb2RlIGFuZCB0aGUgcHJvZ3JhbSBtYXNrIGJpdHMuICAqLwotI2RlZmluZSBQU1dfTUFTS19NRVJHRShDVVJSRU5ULE5FVykgXAotCSgoKENVUlJFTlQpICYgfihQU1dfTUFTS19DQ3xQU1dfTUFTS19QTSkpIHwgXAotCSAoKE5FVykgJiAoUFNXX01BU0tfQ0N8UFNXX01BU0tfUE0pKSkKIAogLyoKICAqIFRoZSBzMzkwX3JlZ3Mgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBlbGZfZ3JlZ3NldF90LgpAQCAtMzI4LDggKzMyNCw3IEBACiAJcHN3X3QgcHN3OwogCXVuc2lnbmVkIGxvbmcgZ3Byc1tOVU1fR1BSU107CiAJdW5zaWduZWQgbG9uZyBvcmlnX2dwcjI7Ci0JdW5zaWduZWQgc2hvcnQgaWxjOwotCXVuc2lnbmVkIHNob3J0IHN2Y25yOworCXVuc2lnbmVkIGludCBzdmNfY29kZTsKIH07CiAKIC8qCkBAIC00ODcsNiArNDgyLDggQEAKICNkZWZpbmUgUFRSQUNFX1BPS0VURVhUX0FSRUEJICAgICAgMHg1MDA0CiAjZGVmaW5lIFBUUkFDRV9QT0tFREFUQV9BUkVBIAkgICAgICAweDUwMDUKICNkZWZpbmUgUFRSQUNFX0dFVF9MQVNUX0JSRUFLCSAgICAgIDB4NTAwNgorI2RlZmluZSBQVFJBQ0VfUEVFS19TWVNURU1fQ0FMTCAgICAgICAweDUwMDcKKyNkZWZpbmUgUFRSQUNFX1BPS0VfU1lTVEVNX0NBTEwJICAgICAgMHg1MDA4CiAKIC8qCiAgKiBQVF9QUk9UIGRlZmluaXRpb24gaXMgbG9vc2VseSBiYXNlZCBvbiBocHBhIGJzZCBkZWZpbml0aW9uIGluCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaAppbmRleCAyMTk5MzYyLi5lNjNkMTNkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmgKQEAgLTQ2LDYgKzQ2LDggQEAKIAl1MzIJIDogMTY7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorI2RlZmluZSBRRFJfQUNfTVVMVElfQlVGRkVSX0VOQUJMRSAweDAxCisKIC8qKgogICogc3RydWN0IHFkciAtIHF1ZXVlIGRlc2NyaXB0aW9uIHJlY29yZCAoUURSKQogICogQHFmbXQ6IHF1ZXVlIGZvcm1hdApAQCAtMjU2LDYgKzI1OCw4IEBACiAJdTggdmFsW1FESU9fTUFYX0JVRkZFUlNfUEVSX1FdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDI1NikpKTsKIAorI2RlZmluZSBDSFNDX0FDMl9NVUxUSV9CVUZGRVJfQVZBSUxBQkxFCTB4MDA4MAorI2RlZmluZSBDSFNDX0FDMl9NVUxUSV9CVUZGRVJfRU5BQkxFRAkweDAwNDAKICNkZWZpbmUgQ0hTQ19BQzJfREFUQV9ESVZfQVZBSUxBQkxFCTB4MDAxMAogI2RlZmluZSBDSFNDX0FDMl9EQVRBX0RJVl9FTkFCTEVECTB4MDAwMgogCkBAIC0zNTcsNiArMzYxLDcgQEAKIHN0cnVjdCBxZGlvX2luaXRpYWxpemUgewogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXVuc2lnbmVkIGNoYXIgcV9mb3JtYXQ7CisJdW5zaWduZWQgY2hhciBxZHJfYWM7CiAJdW5zaWduZWQgY2hhciBhZGFwdGVyX25hbWVbOF07CiAJdW5zaWduZWQgaW50IHFpYl9wYXJhbV9maWVsZF9mb3JtYXQ7CiAJdW5zaWduZWQgY2hhciAqcWliX3BhcmFtX2ZpZWxkOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Jlc2V0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcmVzZXQuaAppbmRleCBmNTg0ZjRhLi4zZDZhZDRhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcmVzZXQuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcmVzZXQuaApAQCAtMTcsNSArMTcsNSBAQAogCiBleHRlcm4gdm9pZCByZWdpc3Rlcl9yZXNldF9jYWxsKHN0cnVjdCByZXNldF9jYWxsICpyZXNldCk7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX3Jlc2V0X2NhbGwoc3RydWN0IHJlc2V0X2NhbGwgKnJlc2V0KTsKLWV4dGVybiB2b2lkIHMzOTBfcmVzZXRfc3lzdGVtKHZvaWQpOworZXh0ZXJuIHZvaWQgczM5MF9yZXNldF9zeXN0ZW0odm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEpOwogI2VuZGlmIC8qIF9BU01fUzM5MF9SRVNFVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2V0dXAuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IGQ1ZTJlZjEuLjVhMDk5NzEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oCkBAIC0yNiwxNSArMjYsMjEgQEAKICNkZWZpbmUgSVBMX0RFVklDRSAgICAgICAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MDQpKQogI2RlZmluZSBJTklUUkRfU1RBUlQgICAgICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQwQykpCiAjZGVmaW5lIElOSVRSRF9TSVpFICAgICAgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDE0KSkKKyNkZWZpbmUgT0xETUVNX0JBU0UJICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQxQykpCisjZGVmaW5lIE9MRE1FTV9TSVpFCSAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MjQpKQogI2Vsc2UgLyogX19zMzkweF9fICovCiAjZGVmaW5lIElQTF9ERVZJQ0UgICAgICAgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDAwKSkKICNkZWZpbmUgSU5JVFJEX1NUQVJUICAgICAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MDgpKQogI2RlZmluZSBJTklUUkRfU0laRSAgICAgICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQxMCkpCisjZGVmaW5lIE9MRE1FTV9CQVNFCSAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MTgpKQorI2RlZmluZSBPTERNRU1fU0laRQkgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDIwKSkKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KICNkZWZpbmUgQ09NTUFORF9MSU5FICAgICAgKChjaGFyICopICAgICAgICAgICAgKDB4MTA0ODApKQogCiAjZGVmaW5lIENIVU5LX1JFQURfV1JJVEUgMAogI2RlZmluZSBDSFVOS19SRUFEX09OTFkgIDEKKyNkZWZpbmUgQ0hVTktfT0xETUVNCSA0CisjZGVmaW5lIENIVU5LX0NSQVNISwkgNQogCiBzdHJ1Y3QgbWVtX2NodW5rIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CkBAIC00OCw2ICs1NCw4IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfZW5kOwogCiB2b2lkIGRldGVjdF9tZW1vcnlfbGF5b3V0KHN0cnVjdCBtZW1fY2h1bmsgY2h1bmtbXSk7Cit2b2lkIGNyZWF0ZV9tZW1faG9sZShzdHJ1Y3QgbWVtX2NodW5rIG1lbW9yeV9jaHVua1tdLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgdHlwZSk7CiAKICNkZWZpbmUgUFJJTUFSWV9TUEFDRV9NT0RFCTAKICNkZWZpbmUgQUNDRVNTX1JFR0lTVEVSX01PREUJMQpAQCAtMTA2LDYgKzExNCw3IEBACiAjZW5kaWYgLyogX19zMzkweF9fICovCiAKICNkZWZpbmUgWkZDUERVTVBfSFNBX1NJWkUJKDMyVUw8PDIwKQorI2RlZmluZSBaRkNQRFVNUF9IU0FfU0laRV9NQVgJKDY0VUw8PDIwKQogCiAvKgogICogQ29uc29sZSBtb2RlLiBPdmVycmlkZSB3aXRoIGNvbm1vZGU9CkBAIC0xMzQsMTAgKzE0MywxNCBAQAogI2RlZmluZSBJUExfREVWSUNFICAgICAgICAweDEwNDA0CiAjZGVmaW5lIElOSVRSRF9TVEFSVCAgICAgIDB4MTA0MEMKICNkZWZpbmUgSU5JVFJEX1NJWkUgICAgICAgMHgxMDQxNAorI2RlZmluZSBPTERNRU1fQkFTRQkgIDB4MTA0MUMKKyNkZWZpbmUgT0xETUVNX1NJWkUJICAweDEwNDI0CiAjZWxzZSAvKiBfX3MzOTB4X18gKi8KICNkZWZpbmUgSVBMX0RFVklDRSAgICAgICAgMHgxMDQwMAogI2RlZmluZSBJTklUUkRfU1RBUlQgICAgICAweDEwNDA4CiAjZGVmaW5lIElOSVRSRF9TSVpFICAgICAgIDB4MTA0MTAKKyNkZWZpbmUgT0xETUVNX0JBU0UJICAweDEwNDE4CisjZGVmaW5lIE9MRE1FTV9TSVpFCSAgMHgxMDQyMAogI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogI2RlZmluZSBDT01NQU5EX0xJTkUgICAgICAweDEwNDgwCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZnAtdXRpbC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NmcC11dGlsLmgKaW5kZXggMGFkZGM2NC4uY2EzZjg4MSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NmcC11dGlsLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NmcC11dGlsLmgKQEAgLTcyLDYgKzcyLDYgQEAKIAogI2RlZmluZSBVRElWX05FRURTX05PUk1BTElaQVRJT04gMAogCi0jZGVmaW5lIGFib3J0KCkgcmV0dXJuIDAKKyNkZWZpbmUgYWJvcnQoKSBCVUcoKQogCiAjZGVmaW5lIF9fQllURV9PUkRFUiBfX0JJR19FTkRJQU4KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zbXAuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCAwNDVlMDA5Zi4uYWI0N2E2OSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMzMsNiArMzMsNyBAQAogZXh0ZXJuIHZvaWQgc21wX3N3aXRjaF90b19pcGxfY3B1KHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICopOwogZXh0ZXJuIHZvaWQgc21wX3N3aXRjaF90b19jcHUodm9pZCAoKikodm9pZCAqKSwgdm9pZCAqLCB1bnNpZ25lZCBsb25nIHNwLAogCQkJICAgICAgaW50IGZyb20sIGludCB0byk7CitleHRlcm4gdm9pZCBzbXBfcmVzdGFydF93aXRoX29ubGluZV9jcHUodm9pZCk7CiBleHRlcm4gdm9pZCBzbXBfcmVzdGFydF9jcHUodm9pZCk7CiAKIC8qCkBAIC02NCw2ICs2NSwxMCBAQAogCWZ1bmMoZGF0YSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbXBfcmVzdGFydF93aXRoX29ubGluZV9jcHUodm9pZCkKK3sKK30KKwogI2RlZmluZSBzbXBfdmNwdV9zY2hlZHVsZWQJKDEpCiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggZmRmZjFlOS4uNjdiNWMxYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNzAsNCArNzAsNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggNTY2MTJmYy4uZmQ5NGRmZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTEzLDYgKzEzLDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCitleHRlcm4gaW50IHNwaW5fcmV0cnk7CisKIHN0YXRpYyBpbmxpbmUgaW50CiBfcmF3X2NvbXBhcmVfYW5kX3N3YXAodm9sYXRpbGUgdW5zaWduZWQgaW50ICpsb2NrLAogCQkgICAgICB1bnNpZ25lZCBpbnQgb2xkLCB1bnNpZ25lZCBpbnQgbmV3KQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c2NhbGwuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKaW5kZXggNWMwMjQ2Yi4uYjIzOWZmNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c2NhbGwuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzY2FsbC5oCkBAIC0xMyw2ICsxMyw3IEBACiAjZGVmaW5lIF9BU01fU1lTQ0FMTF9ICTEKIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAvKgpAQCAtMjUsNyArMjYsOCBAQAogc3RhdGljIGlubGluZSBsb25nIHN5c2NhbGxfZ2V0X25yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXJldHVybiByZWdzLT5zdmNuciA/IHJlZ3MtPnN2Y25yIDogLTE7CisJcmV0dXJuIHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TWVNDQUxMKSA/CisJCShyZWdzLT5zdmNfY29kZSAmIDB4ZmZmZikgOiAtMTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfcm9sbGJhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLApAQCAtMzcsNyArMzksNyBAQAogc3RhdGljIGlubGluZSBsb25nIHN5c2NhbGxfZ2V0X2Vycm9yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXJldHVybiAocmVncy0+Z3Byc1syXSA+PSAtNDA5NlVMKSA/IC1yZWdzLT5ncHJzWzJdIDogMDsKKwlyZXR1cm4gSVNfRVJSX1ZBTFVFKHJlZ3MtPmdwcnNbMl0pID8gcmVncy0+Z3Byc1syXSA6IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgbG9uZyBzeXNjYWxsX2dldF9yZXR1cm5fdmFsdWUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmluZGV4IDY1ODJmNjkuLmVmNTczYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTIwLDYgKzIwLDggQEAKIAogc3RydWN0IHRhc2tfc3RydWN0OwogCitleHRlcm4gaW50IHN5c2N0bF91c2VycHJvY2Vzc19kZWJ1ZzsKKwogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG8odm9pZCAqLCB2b2lkICopOwogZXh0ZXJuIHZvaWQgdXBkYXRlX3Blcl9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAKQEAgLTExNCw2ICsxMTYsOCBAQAogZXh0ZXJuIHZvaWQgY21tYV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBtZW1jcHlfcmVhbCh2b2lkICosIHZvaWQgKiwgc2l6ZV90KTsKIGV4dGVybiB2b2lkIGNvcHlfdG9fYWJzb2x1dGVfemVybyh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7CitleHRlcm4gaW50IGNvcHlfdG9fdXNlcl9yZWFsKHZvaWQgX191c2VyICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7CitleHRlcm4gaW50IGNvcHlfZnJvbV91c2VyX3JlYWwodm9pZCAqZGVzdCwgdm9pZCBfX3VzZXIgKnNyYywgc2l6ZV90IGNvdW50KTsKIAogI2RlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocHJldikgZG8gewkJCQkJICAgICBcCiAJc2V0X2ZzKGN1cnJlbnQtPnRocmVhZC5tbV9zZWdtZW50KTsJCQkJICAgICBcCkBAIC0yMTAsOCArMjE0LDEwIEBACiAJX19sb2FkX3Bzd19tYXNrKG1hc2sgfCAoYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKCkgJiB+KC0xVUwgPj4gOCkpKTsKIH0KIAotI2RlZmluZSBsb2NhbF9tY2NrX2VuYWJsZSgpICBfX3NldF9wc3dfbWFzayhwc3dfa2VybmVsX2JpdHMpCi0jZGVmaW5lIGxvY2FsX21jY2tfZGlzYWJsZSgpIF9fc2V0X3Bzd19tYXNrKHBzd19rZXJuZWxfYml0cyAmIH5QU1dfTUFTS19NQ0hFQ0spCisjZGVmaW5lIGxvY2FsX21jY2tfZW5hYmxlKCkgXAorCV9fc2V0X3Bzd19tYXNrKHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX0RBVCB8IFBTV19NQVNLX01DSEVDSykKKyNkZWZpbmUgbG9jYWxfbWNja19kaXNhYmxlKCkgXAorCV9fc2V0X3Bzd19tYXNrKHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX0RBVCkKIAogI2lmZGVmIENPTkZJR19TTVAKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCAxYTVkYmI2Li5hMjMxODM0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtNDgsNiArNDgsNyBAQAogCXVuc2lnbmVkIGludAkJY3B1OwkJLyogY3VycmVudCBDUFUgKi8KIAlpbnQJCQlwcmVlbXB0X2NvdW50OwkvKiAwID0+IHByZWVtcHRhYmxlLCA8MCA9PiBCVUcgKi8KIAlzdHJ1Y3QgcmVzdGFydF9ibG9jawlyZXN0YXJ0X2Jsb2NrOworCXVuc2lnbmVkIGludAkJc3lzdGVtX2NhbGw7CiAJX191NjQJCQl1c2VyX3RpbWVyOwogCV9fdTY0CQkJc3lzdGVtX3RpbWVyOwogCXVuc2lnbmVkIGxvbmcJCWxhc3RfYnJlYWs7CS8qIGxhc3QgYnJlYWtpbmctZXZlbnQtYWRkcmVzcy4gKi8KQEAgLTg0LDEwICs4NSwxMCBAQAogLyoKICAqIHRocmVhZCBpbmZvcm1hdGlvbiBmbGFncyBiaXQgbnVtYmVycwogICovCisjZGVmaW5lIFRJRl9TWVNDQUxMCQkwCS8qIGluc2lkZSBhIHN5c3RlbSBjYWxsICovCiAjZGVmaW5lIFRJRl9OT1RJRllfUkVTVU1FCTEJLyogY2FsbGJhY2sgYmVmb3JlIHJldHVybmluZyB0byB1c2VyICovCiAjZGVmaW5lIFRJRl9TSUdQRU5ESU5HCQkyCS8qIHNpZ25hbCBwZW5kaW5nICovCiAjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMwkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCi0jZGVmaW5lIFRJRl9SRVNUQVJUX1NWQwkJNAkvKiByZXN0YXJ0IHN2YyB3aXRoIG5ldyBzdmMgbnVtYmVyICovCiAjZGVmaW5lIFRJRl9QRVJfVFJBUAkJNgkvKiBkZWxpdmVyIHNpZ3RyYXAgb24gcmV0dXJuIHRvIHVzZXIgKi8KICNkZWZpbmUgVElGX01DQ0tfUEVORElORwk3CS8qIG1hY2hpbmUgY2hlY2sgaGFuZGxpbmcgaXMgcGVuZGluZyAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRQk4CS8qIHN5c2NhbGwgdHJhY2UgYWN0aXZlICovCkBAIC0xMDMsMTEgKzEwNCwxMSBAQAogI2RlZmluZSBUSUZfU0lOR0xFX1NURVAJCTIwCS8qIFRoaXMgdGFzayBpcyBzaW5nbGUgc3RlcHBlZCAqLwogI2RlZmluZSBUSUZfRlJFRVpFCQkyMQkvKiB0aHJlYWQgaXMgZnJlZXppbmcgZm9yIHN1c3BlbmQgKi8KIAorI2RlZmluZSBfVElGX1NZU0NBTEwJCSgxPDxUSUZfU1lTQ0FMTCkKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxPDxUSUZfTk9USUZZX1JFU1VNRSkKICNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sJKDE8PFRJRl9SRVNUT1JFX1NJR01BU0spCiAjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDE8PFRJRl9TSUdQRU5ESU5HKQogI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRAkoMTw8VElGX05FRURfUkVTQ0hFRCkKLSNkZWZpbmUgX1RJRl9SRVNUQVJUX1NWQwkoMTw8VElGX1JFU1RBUlRfU1ZDKQogI2RlZmluZSBfVElGX1BFUl9UUkFQCQkoMTw8VElGX1BFUl9UUkFQKQogI2RlZmluZSBfVElGX01DQ0tfUEVORElORwkoMTw8VElGX01DQ0tfUEVORElORykKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKQEAgLTExNyw3ICsxMTgsNyBAQAogI2RlZmluZSBfVElGX1NJRQkJKDE8PFRJRl9TSUUpCiAjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDE8PFRJRl9QT0xMSU5HX05SRkxBRykKICNkZWZpbmUgX1RJRl8zMUJJVAkJKDE8PFRJRl8zMUJJVCkKLSNkZWZpbmUgX1RJRl9TSU5HTEVfU1RFUAkoMTw8VElGX0ZSRUVaRSkKKyNkZWZpbmUgX1RJRl9TSU5HTEVfU1RFUAkoMTw8VElGX1NJTkdMRV9TVEVQKQogI2RlZmluZSBfVElGX0ZSRUVaRQkJKDE8PFRJRl9GUkVFWkUpCiAKICNpZmRlZiBDT05GSUdfNjRCSVQKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aW1leC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RpbWV4LmgKaW5kZXggODg4MjlhNC4uZDYxMGJlZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RpbWV4LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RpbWV4LmgKQEAgLTg2LDYgKzg2LDE3IEBACiAJYXNtIHZvbGF0aWxlKCJzdGNrZSAlMCIgOiAiPVEiICgqY2xrKSA6IDogImNjIik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGdldF9jbG9ja19mYXN0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGNsazsKKworCWlmICh0ZXN0X2ZhY2lsaXR5KDI1KSkKKwkJYXNtIHZvbGF0aWxlKCIuaW5zbglzLDB4YjI3YzAwMDAsJTAiIDogIj1RIiAoY2xrKSA6IDogImNjIik7CisJZWxzZQorCQljbGsgPSBnZXRfY2xvY2soKTsKKwlyZXR1cm4gY2xrOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBnZXRfY2xvY2tfeHQodm9pZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGNsa1sxNl07CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiZmx1c2guaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCmluZGV4IDMwNDQ0NTMuLjFkODY0OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCkBAIC01OSw2ICs1OSw3IEBACiB9CiAjZWxzZQogI2RlZmluZSBfX3RsYl9mbHVzaF9mdWxsKG1tKQlfX3RsYl9mbHVzaF9sb2NhbCgpCisjZGVmaW5lIF9fdGxiX2ZsdXNoX2dsb2JhbCgpCV9fdGxiX2ZsdXNoX2xvY2FsKCkKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZGYzNzMyMi4uZGQ0ZjA3NiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCkBAIC00OCw2ICs0OCw3IEBACiBvYmotJChDT05GSUdfRFlOQU1JQ19GVFJBQ0UpCSs9IGZ0cmFjZS5vCiBvYmotJChDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSKSArPSBmdHJhY2Uubwogb2JqLSQoQ09ORklHX0ZUUkFDRV9TWVNDQUxMUykgICs9IGZ0cmFjZS5vCitvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCiAKICMgS2V4ZWMgcGFydAogUzM5MF9LRVhFQ19PQkpTIDo9IG1hY2hpbmVfa2V4ZWMubyBjcmFzaC5vCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggMmI0NTU5MS4uNzUxMzE4NyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNDUsOCArNDUsNyBAQAogCURFRklORShfX1BUX1BTVywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHBzdykpOwogCURFRklORShfX1BUX0dQUlMsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBncHJzKSk7CiAJREVGSU5FKF9fUFRfT1JJR19HUFIyLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgb3JpZ19ncHIyKSk7Ci0JREVGSU5FKF9fUFRfSUxDLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgaWxjKSk7Ci0JREVGSU5FKF9fUFRfU1ZDTlIsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBzdmNucikpOworCURFRklORShfX1BUX1NWQ19DT0RFLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc3ZjX2NvZGUpKTsKIAlERUZJTkUoX19QVF9TSVpFLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKIAlCTEFOSygpOwogCURFRklORShfX1NGX0JBQ0tDSEFJTiwgb2Zmc2V0b2Yoc3RydWN0IHN0YWNrX2ZyYW1lLCBiYWNrX2NoYWluKSk7CkBAIC0xNDEsNyArMTQwLDYgQEAKIAlERUZJTkUoX19MQ19GUFJFR1NfU0FWRV9BUkVBLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGZsb2F0aW5nX3B0X3NhdmVfYXJlYSkpOwogCURFRklORShfX0xDX0dQUkVHU19TQVZFX0FSRUEsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgZ3ByZWdzX3NhdmVfYXJlYSkpOwogCURFRklORShfX0xDX0NSRUdTX1NBVkVfQVJFQSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBjcmVnc19zYXZlX2FyZWEpKTsKLQlERUZJTkUoX19MQ19TQVZFX0FSRUFfNjQsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgc2F2ZV9hcmVhXzY0KSk7CiAjaWZkZWYgQ09ORklHXzMyQklUCiAJREVGSU5FKFNBVkVfQVJFQV9CQVNFLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGV4dGVuZGVkX3NhdmVfYXJlYV9hZGRyKSk7CiAjZWxzZSAvKiBDT05GSUdfMzJCSVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMKaW5kZXggMjU1NDM1Ni4uZjg4MjhkMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMKQEAgLTg2LDYgKzg2LDggQEAKIEVOVFJZKGRpYWczMDhfcmVzZXQpCiAJbGFybAklcjQsLkxjdGxyZWdzCQkjIFNhdmUgY29udHJvbCByZWdpc3RlcnMKIAlzdGN0ZwklYzAsJWMxNSwwKCVyNCkKKwlsYXJsCSVyNCwuTGZwY3RsCQkjIEZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXIKKwlzdGZwYwkwKCVyNCkKIAlsYXJsCSVyNCwuTHJlc3RhcnRfcHN3CSMgU2V0dXAgcmVzdGFydCBQU1cgYXQgYWJzb2x1dGUgMAogCWxnaGkJJXIzLDAKIAlsZwklcjQsMCglcjQpCQkjIFNhdmUgUFNXCkBAIC05OSw2ICsxMDEsOCBAQAogCXNhbTY0CQkJCSMgU3dpdGNoIHRvIDY0IGJpdCBhZGRyZXNzaW5nIG1vZGUKIAlsYXJsCSVyNCwuTGN0bHJlZ3MJCSMgUmVzdG9yZSBjb250cm9sIHJlZ2lzdGVycwogCWxjdGxnCSVjMCwlYzE1LDAoJXI0KQorCWxhcmwJJXI0LC5MZnBjdGwJCSMgUmVzdG9yZSBmbG9hdGluZyBwb2ludCBjdGwgcmVnaXN0ZXIKKwlsZnBjCTAoJXI0KQogCWJyCSVyMTQKIC5hbGlnbiAxNgogLkxyZXN0YXJ0X3BzdzoKQEAgLTExMCw2ICsxMTQsOCBAQAogCS5yZXB0CTE2CiAJLnF1YWQJMAogCS5lbmRyCisuTGZwY3RsOgorCS5sb25nCTAKIAkucHJldmlvdXMKIAogI2Vsc2UgLyogQ09ORklHXzY0QklUICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwppbmRleCA1M2FjYWE4Li44NGE5ODI4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKQEAgLTYwLDEyICs2MCw5IEBACiAKICNpbmNsdWRlICJjb21wYXRfbGludXguaCIKIAotbG9uZyBwc3dfdXNlcjMyX2JpdHMJPSAoUFNXX0JBU0UzMl9CSVRTIHwgUFNXX01BU0tfREFUIHwgUFNXX0FTQ19IT01FIHwKLQkJCSAgIFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUIHwgUFNXX01BU0tfTUNIRUNLIHwKLQkJCSAgIFBTV19NQVNLX1BTVEFURSB8IFBTV19ERUZBVUxUX0tFWSk7Ci1sb25nIHBzdzMyX3VzZXJfYml0cwk9IChQU1czMl9CQVNFX0JJVFMgfCBQU1czMl9NQVNLX0RBVCB8IFBTVzMyX0FTQ19IT01FIHwKLQkJCSAgIFBTVzMyX01BU0tfSU8gfCBQU1czMl9NQVNLX0VYVCB8IFBTVzMyX01BU0tfTUNIRUNLIHwKLQkJCSAgIFBTVzMyX01BU0tfUFNUQVRFKTsKK3UzMiBwc3czMl91c2VyX2JpdHMgPSBQU1czMl9NQVNLX0RBVCB8IFBTVzMyX01BU0tfSU8gfCBQU1czMl9NQVNLX0VYVCB8CisJCSAgICAgIFBTVzMyX0RFRkFVTFRfS0VZIHwgUFNXMzJfTUFTS19CQVNFIHwgUFNXMzJfTUFTS19NQ0hFQ0sgfAorCQkgICAgICBQU1czMl9NQVNLX1BTVEFURSB8IFBTVzMyX0FTQ19IT01FOwogIAogLyogRm9yIHRoaXMgc291cmNlIGZpbGUsIHdlIHdhbnQgb3ZlcmZsb3cgaGFuZGxpbmcuICovCiAKQEAgLTM2NSwxMiArMzYyLDcgQEAKIAlpZiAoc2V0KSB7CiAJCWlmIChjb3B5X2Zyb21fdXNlciAoJnMzMiwgc2V0LCBzaXplb2YoY29tcGF0X3NpZ3NldF90KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJc3dpdGNoIChfTlNJR19XT1JEUykgewotCQljYXNlIDQ6IHMuc2lnWzNdID0gczMyLnNpZ1s2XSB8ICgoKGxvbmcpczMyLnNpZ1s3XSkgPDwgMzIpOwotCQljYXNlIDM6IHMuc2lnWzJdID0gczMyLnNpZ1s0XSB8ICgoKGxvbmcpczMyLnNpZ1s1XSkgPDwgMzIpOwotCQljYXNlIDI6IHMuc2lnWzFdID0gczMyLnNpZ1syXSB8ICgoKGxvbmcpczMyLnNpZ1szXSkgPDwgMzIpOwotCQljYXNlIDE6IHMuc2lnWzBdID0gczMyLnNpZ1swXSB8ICgoKGxvbmcpczMyLnNpZ1sxXSkgPDwgMzIpOwotCQl9CisJCXMuc2lnWzBdID0gczMyLnNpZ1swXSB8ICgoKGxvbmcpczMyLnNpZ1sxXSkgPDwgMzIpOwogCX0KIAlzZXRfZnMgKEtFUk5FTF9EUyk7CiAJcmV0ID0gc3lzX3J0X3NpZ3Byb2NtYXNrKGhvdywKQEAgLTM4MCwxMiArMzcyLDggQEAKIAlzZXRfZnMgKG9sZF9mcyk7CiAJaWYgKHJldCkgcmV0dXJuIHJldDsKIAlpZiAob3NldCkgewotCQlzd2l0Y2ggKF9OU0lHX1dPUkRTKSB7Ci0JCWNhc2UgNDogczMyLnNpZ1s3XSA9IChzLnNpZ1szXSA+PiAzMik7IHMzMi5zaWdbNl0gPSBzLnNpZ1szXTsKLQkJY2FzZSAzOiBzMzIuc2lnWzVdID0gKHMuc2lnWzJdID4+IDMyKTsgczMyLnNpZ1s0XSA9IHMuc2lnWzJdOwotCQljYXNlIDI6IHMzMi5zaWdbM10gPSAocy5zaWdbMV0gPj4gMzIpOyBzMzIuc2lnWzJdID0gcy5zaWdbMV07Ci0JCWNhc2UgMTogczMyLnNpZ1sxXSA9IChzLnNpZ1swXSA+PiAzMik7IHMzMi5zaWdbMF0gPSBzLnNpZ1swXTsKLQkJfQorCQlzMzIuc2lnWzFdID0gKHMuc2lnWzBdID4+IDMyKTsKKwkJczMyLnNpZ1swXSA9IHMuc2lnWzBdOwogCQlpZiAoY29weV90b191c2VyIChvc2V0LCAmczMyLCBzaXplb2YoY29tcGF0X3NpZ3NldF90KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC00MDQsMTIgKzM5Miw4IEBACiAJcmV0ID0gc3lzX3J0X3NpZ3BlbmRpbmcoKHNpZ3NldF90IF9fZm9yY2UgX191c2VyICopICZzLCBzaWdzZXRzaXplKTsKIAlzZXRfZnMgKG9sZF9mcyk7CiAJaWYgKCFyZXQpIHsKLQkJc3dpdGNoIChfTlNJR19XT1JEUykgewotCQljYXNlIDQ6IHMzMi5zaWdbN10gPSAocy5zaWdbM10gPj4gMzIpOyBzMzIuc2lnWzZdID0gcy5zaWdbM107Ci0JCWNhc2UgMzogczMyLnNpZ1s1XSA9IChzLnNpZ1syXSA+PiAzMik7IHMzMi5zaWdbNF0gPSBzLnNpZ1syXTsKLQkJY2FzZSAyOiBzMzIuc2lnWzNdID0gKHMuc2lnWzFdID4+IDMyKTsgczMyLnNpZ1syXSA9IHMuc2lnWzFdOwotCQljYXNlIDE6IHMzMi5zaWdbMV0gPSAocy5zaWdbMF0gPj4gMzIpOyBzMzIuc2lnWzBdID0gcy5zaWdbMF07Ci0JCX0KKwkJczMyLnNpZ1sxXSA9IChzLnNpZ1swXSA+PiAzMik7CisJCXMzMi5zaWdbMF0gPSBzLnNpZ1swXTsKIAkJaWYgKGNvcHlfdG9fdXNlciAoc2V0LCAmczMyLCBzaXplb2YoY29tcGF0X3NpZ3NldF90KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCmluZGV4IGE5YTI4NWIuLjRmNjhjODEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCkBAIC0xNDEsNyArMTQxLDggQEAKIAkJCWJyZWFrOwogCQljYXNlIF9fU0lfRkFVTFQgPj4gMTY6CiAJCQllcnIgfD0gX19nZXRfdXNlcih0bXAsICZmcm9tLT5zaV9hZGRyKTsKLQkJCXRvLT5zaV9hZGRyID0gKHZvaWQgX191c2VyICopKHU2NCkgKHRtcCAmIFBTVzMyX0FERFJfSU5TTik7CisJCQl0by0+c2lfYWRkciA9ICh2b2lkIF9fZm9yY2UgX191c2VyICopCisJCQkJKHU2NCkgKHRtcCAmIFBTVzMyX0FERFJfSU5TTik7CiAJCQlicmVhazsKIAkJY2FzZSBfX1NJX1BPTEwgPj4gMTY6CiAJCQllcnIgfD0gX19nZXRfdXNlcih0by0+c2lfYmFuZCwgJmZyb20tPnNpX2JhbmQpOwpAQCAtMjEzLDE2ICsyMTQsOCBAQAogCQlyZXQgPSBnZXRfdXNlcihzYV9oYW5kbGVyLCAmYWN0LT5zYV9oYW5kbGVyKTsKIAkJcmV0IHw9IF9fY29weV9mcm9tX3VzZXIoJnNldDMyLCAmYWN0LT5zYV9tYXNrLAogCQkJCQlzaXplb2YoY29tcGF0X3NpZ3NldF90KSk7Ci0JCXN3aXRjaCAoX05TSUdfV09SRFMpIHsKLQkJY2FzZSA0OiBuZXdfa2Euc2Euc2FfbWFzay5zaWdbM10gPSBzZXQzMi5zaWdbNl0KLQkJCQl8ICgoKGxvbmcpc2V0MzIuc2lnWzddKSA8PCAzMik7Ci0JCWNhc2UgMzogbmV3X2thLnNhLnNhX21hc2suc2lnWzJdID0gc2V0MzIuc2lnWzRdCi0JCQkJfCAoKChsb25nKXNldDMyLnNpZ1s1XSkgPDwgMzIpOwotCQljYXNlIDI6IG5ld19rYS5zYS5zYV9tYXNrLnNpZ1sxXSA9IHNldDMyLnNpZ1syXQotCQkJCXwgKCgobG9uZylzZXQzMi5zaWdbM10pIDw8IDMyKTsKLQkJY2FzZSAxOiBuZXdfa2Euc2Euc2FfbWFzay5zaWdbMF0gPSBzZXQzMi5zaWdbMF0KLQkJCQl8ICgoKGxvbmcpc2V0MzIuc2lnWzFdKSA8PCAzMik7Ci0JCX0KKwkJbmV3X2thLnNhLnNhX21hc2suc2lnWzBdID0KKwkJCXNldDMyLnNpZ1swXSB8ICgoKGxvbmcpc2V0MzIuc2lnWzFdKSA8PCAzMik7CiAJCXJldCB8PSBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpOwogCQkKIAkJaWYgKHJldCkKQEAgLTIzMywyMCArMjI2LDggQEAKIAlyZXQgPSBkb19zaWdhY3Rpb24oc2lnLCBhY3QgPyAmbmV3X2thIDogTlVMTCwgb2FjdCA/ICZvbGRfa2EgOiBOVUxMKTsKIAogCWlmICghcmV0ICYmIG9hY3QpIHsKLQkJc3dpdGNoIChfTlNJR19XT1JEUykgewotCQljYXNlIDQ6Ci0JCQlzZXQzMi5zaWdbN10gPSAob2xkX2thLnNhLnNhX21hc2suc2lnWzNdID4+IDMyKTsKLQkJCXNldDMyLnNpZ1s2XSA9IG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1szXTsKLQkJY2FzZSAzOgotCQkJc2V0MzIuc2lnWzVdID0gKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1syXSA+PiAzMik7Ci0JCQlzZXQzMi5zaWdbNF0gPSBvbGRfa2Euc2Euc2FfbWFzay5zaWdbMl07Ci0JCWNhc2UgMjoKLQkJCXNldDMyLnNpZ1szXSA9IChvbGRfa2Euc2Euc2FfbWFzay5zaWdbMV0gPj4gMzIpOwotCQkJc2V0MzIuc2lnWzJdID0gb2xkX2thLnNhLnNhX21hc2suc2lnWzFdOwotCQljYXNlIDE6Ci0JCQlzZXQzMi5zaWdbMV0gPSAob2xkX2thLnNhLnNhX21hc2suc2lnWzBdID4+IDMyKTsKLQkJCXNldDMyLnNpZ1swXSA9IG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXTsKLQkJfQorCQlzZXQzMi5zaWdbMV0gPSAob2xkX2thLnNhLnNhX21hc2suc2lnWzBdID4+IDMyKTsKKwkJc2V0MzIuc2lnWzBdID0gb2xkX2thLnNhLnNhX21hc2suc2lnWzBdOwogCQlyZXQgPSBwdXRfdXNlcigodW5zaWduZWQgbG9uZylvbGRfa2Euc2Euc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpOwogCQlyZXQgfD0gX19jb3B5X3RvX3VzZXIoJm9hY3QtPnNhX21hc2ssICZzZXQzMiwKIAkJCQkgICAgICBzaXplb2YoY29tcGF0X3NpZ3NldF90KSk7CkBAIC0zMDAsOSArMjgxLDEwIEBACiAJX3MzOTBfcmVnc19jb21tb24zMiByZWdzMzI7CiAJaW50IGVyciwgaTsKIAotCXJlZ3MzMi5wc3cubWFzayA9IFBTVzMyX01BU0tfTUVSR0UocHN3MzJfdXNlcl9iaXRzLAotCQkJCQkgICAoX191MzIpKHJlZ3MtPnBzdy5tYXNrID4+IDMyKSk7Ci0JcmVnczMyLnBzdy5hZGRyID0gUFNXMzJfQUREUl9BTU9ERTMxIHwgKF9fdTMyKSByZWdzLT5wc3cuYWRkcjsKKwlyZWdzMzIucHN3Lm1hc2sgPSBwc3czMl91c2VyX2JpdHMgfAorCQkoKF9fdTMyKShyZWdzLT5wc3cubWFzayA+PiAzMikgJiBQU1czMl9NQVNLX1VTRVIpOworCXJlZ3MzMi5wc3cuYWRkciA9IChfX3UzMikgcmVncy0+cHN3LmFkZHIgfAorCQkoX191MzIpKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfQkEpOwogCWZvciAoaSA9IDA7IGkgPCBOVU1fR1BSUzsgaSsrKQogCQlyZWdzMzIuZ3Byc1tpXSA9IChfX3UzMikgcmVncy0+Z3Byc1tpXTsKIAlzYXZlX2FjY2Vzc19yZWdzKGN1cnJlbnQtPnRocmVhZC5hY3JzKTsKQEAgLTMyNyw4ICszMDksOSBAQAogCWVyciA9IF9fY29weV9mcm9tX3VzZXIoJnJlZ3MzMiwgJnNyZWdzLT5yZWdzLCBzaXplb2YocmVnczMyKSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlyZWdzLT5wc3cubWFzayA9IFBTV19NQVNLX01FUkdFKHJlZ3MtPnBzdy5tYXNrLAotCQkJCSAgICAgICAgKF9fdTY0KXJlZ3MzMi5wc3cubWFzayA8PCAzMik7CisJcmVncy0+cHN3Lm1hc2sgPSAocmVncy0+cHN3Lm1hc2sgJiB+UFNXX01BU0tfVVNFUikgfAorCQkoX191NjQpKHJlZ3MzMi5wc3cubWFzayAmIFBTVzMyX01BU0tfVVNFUikgPDwgMzIgfAorCQkoX191NjQpKHJlZ3MzMi5wc3cuYWRkciAmIFBTVzMyX0FERFJfQU1PREUpOwogCXJlZ3MtPnBzdy5hZGRyID0gKF9fdTY0KShyZWdzMzIucHN3LmFkZHIgJiBQU1czMl9BRERSX0lOU04pOwogCWZvciAoaSA9IDA7IGkgPCBOVU1fR1BSUzsgaSsrKQogCQlyZWdzLT5ncHJzW2ldID0gKF9fdTY0KSByZWdzMzIuZ3Byc1tpXTsKQEAgLTM0Miw3ICszMjUsNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJcmVzdG9yZV9mcF9yZWdzKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncyk7Ci0JcmVncy0+c3ZjbnIgPSAwOwkvKiBkaXNhYmxlIHN5c2NhbGwgY2hlY2tzICovCisJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTEwpOwkvKiBObyBsb25nZXIgaW4gYSBzeXN0ZW0gY2FsbCAqLwogCXJldHVybiAwOwogfQogCkBAIC00OTYsMTEgKzQ3OSwxMSBAQAogCS8qIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICBJZiBwcm92aWRlZCwgdXNlIGEgc3R1YgogCSAgIGFscmVhZHkgaW4gdXNlcnNwYWNlLiAgKi8KIAlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpIHsKLQkJcmVncy0+Z3Byc1sxNF0gPSAoX191NjQpIGthLT5zYS5zYV9yZXN0b3JlcjsKKwkJcmVncy0+Z3Byc1sxNF0gPSAoX191NjQpIGthLT5zYS5zYV9yZXN0b3JlciB8IFBTVzMyX0FERFJfQU1PREU7CiAJfSBlbHNlIHsKLQkJcmVncy0+Z3Byc1sxNF0gPSAoX191NjQpIGZyYW1lLT5yZXRjb2RlOworCQlyZWdzLT5ncHJzWzE0XSA9IChfX3U2NCkgZnJhbWUtPnJldGNvZGUgfCBQU1czMl9BRERSX0FNT0RFOwogCQlpZiAoX19wdXRfdXNlcihTMzkwX1NZU0NBTExfT1BDT0RFIHwgX19OUl9zaWdyZXR1cm4sCi0JCSAgICAgICAgICAgICAgICh1MTYgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKSkpCisJCQkgICAgICAgKHUxNiBfX2ZvcmNlIF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSkpKQogCQkJZ290byBnaXZlX3NpZ3NlZ3Y7CiAgICAgICAgIH0KIApAQCAtNTA5LDExICs0OTIsMTIgQEAKIAkJZ290byBnaXZlX3NpZ3NlZ3Y7CiAKIAkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwotCXJlZ3MtPmdwcnNbMTVdID0gKF9fdTY0KSBmcmFtZTsKLQlyZWdzLT5wc3cuYWRkciA9IChfX3U2NCkga2EtPnNhLnNhX2hhbmRsZXI7CisJcmVncy0+Z3Byc1sxNV0gPSAoX19mb3JjZSBfX3U2NCkgZnJhbWU7CisJcmVncy0+cHN3Lm1hc2sgfD0gUFNXX01BU0tfQkE7CQkvKiBmb3JjZSBhbW9kZSAzMSAqLworCXJlZ3MtPnBzdy5hZGRyID0gKF9fZm9yY2UgX191NjQpIGthLT5zYS5zYV9oYW5kbGVyOwogCiAJcmVncy0+Z3Byc1syXSA9IG1hcF9zaWduYWwoc2lnKTsKLQlyZWdzLT5ncHJzWzNdID0gKF9fdTY0KSAmZnJhbWUtPnNjOworCXJlZ3MtPmdwcnNbM10gPSAoX19mb3JjZSBfX3U2NCkgJmZyYW1lLT5zYzsKIAogCS8qIFdlIGZvcmdvdCB0byBpbmNsdWRlIHRoZXNlIGluIHRoZSBzaWdjb250ZXh0LgogCSAgIFRvIGF2b2lkIGJyZWFraW5nIGJpbmFyeSBjb21wYXRpYmlsaXR5LCB0aGV5IGFyZSBwYXNzZWQgYXMgYXJncy4gKi8KQEAgLTUyMSw3ICs1MDUsNyBAQAogCXJlZ3MtPmdwcnNbNV0gPSBjdXJyZW50LT50aHJlYWQucHJvdF9hZGRyOwogCiAJLyogUGxhY2Ugc2lnbmFsIG51bWJlciBvbiBzdGFjayB0byBhbGxvdyBiYWNrdHJhY2UgZnJvbSBoYW5kbGVyLiAgKi8KLQlpZiAoX19wdXRfdXNlcihyZWdzLT5ncHJzWzJdLCAoaW50IF9fdXNlciAqKSAmZnJhbWUtPnNpZ25vKSkKKwlpZiAoX19wdXRfdXNlcihyZWdzLT5ncHJzWzJdLCAoaW50IF9fZm9yY2UgX191c2VyICopICZmcmFtZS0+c2lnbm8pKQogCQlnb3RvIGdpdmVfc2lnc2VndjsKIAlyZXR1cm4gMDsKIApAQCAtNTY0LDIwICs1NDgsMjEgQEAKIAl9IGVsc2UgewogCQlyZWdzLT5ncHJzWzE0XSA9IChfX3U2NCkgZnJhbWUtPnJldGNvZGU7CiAJCWVyciB8PSBfX3B1dF91c2VyKFMzOTBfU1lTQ0FMTF9PUENPREUgfCBfX05SX3J0X3NpZ3JldHVybiwKLQkJICAgICAgICAgICAgICAgICAgKHUxNiBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUpKTsKKwkJCQkgICh1MTYgX19mb3JjZSBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUpKTsKIAl9CiAKIAkvKiBTZXQgdXAgYmFja2NoYWluLiAqLwotCWlmIChfX3B1dF91c2VyKHJlZ3MtPmdwcnNbMTVdLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBmcmFtZSkpCisJaWYgKF9fcHV0X3VzZXIocmVncy0+Z3Byc1sxNV0sICh1bnNpZ25lZCBpbnQgX19mb3JjZSBfX3VzZXIgKikgZnJhbWUpKQogCQlnb3RvIGdpdmVfc2lnc2VndjsKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCi0JcmVncy0+Z3Byc1sxNV0gPSAoX191NjQpIGZyYW1lOworCXJlZ3MtPmdwcnNbMTVdID0gKF9fZm9yY2UgX191NjQpIGZyYW1lOworCXJlZ3MtPnBzdy5tYXNrIHw9IFBTV19NQVNLX0JBOwkJLyogZm9yY2UgYW1vZGUgMzEgKi8KIAlyZWdzLT5wc3cuYWRkciA9IChfX3U2NCkga2EtPnNhLnNhX2hhbmRsZXI7CiAKIAlyZWdzLT5ncHJzWzJdID0gbWFwX3NpZ25hbChzaWcpOwotCXJlZ3MtPmdwcnNbM10gPSAoX191NjQpICZmcmFtZS0+aW5mbzsKLQlyZWdzLT5ncHJzWzRdID0gKF9fdTY0KSAmZnJhbWUtPnVjOworCXJlZ3MtPmdwcnNbM10gPSAoX19mb3JjZSBfX3U2NCkgJmZyYW1lLT5pbmZvOworCXJlZ3MtPmdwcnNbNF0gPSAoX19mb3JjZSBfX3U2NCkgJmZyYW1lLT51YzsKIAlyZXR1cm4gMDsKIAogZ2l2ZV9zaWdzZWd2OgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCmluZGV4IDc1MjZkYjYuLjUwMDZhMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKQEAgLTE2MjMsOCArMTYyMyw3IEBACiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlqZwlzeXNfc3luY2ZzCiAKLQkuZ2xvYmwJc3lzX3NldG5zX3dyYXBwZXIKLXN5c19zZXRuc193cmFwcGVyOgorRU5UUlkoc3lzX3NldG5zX3dyYXBwZXIpCiAJbGdmcgklcjIsJXIyCQkJIyBpbnQKIAlsZ2ZyCSVyMywlcjMJCQkjIGludAogCWpnCXN5c19zZXRucwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jcmFzaF9kdW1wLmMgYi9hcmNoL3MzOTAva2VybmVsL2NyYXNoX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY4ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jcmFzaF9kdW1wLmMKQEAgLTAsMCArMSw0MjYgQEAKKy8qCisgKiBTMzkwIGtkdW1wIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDExCisgKiBBdXRob3Iocyk6IE1pY2hhZWwgSG9semhldSA8aG9semhldUBsaW51eC52bmV0LmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KKyNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGFzbS9pcGwuaD4KKworI2RlZmluZSBQVFJfQUREKHgsIHkpICgoKGNoYXIgKikgKHgpKSArICgodW5zaWduZWQgbG9uZykgKHkpKSkKKyNkZWZpbmUgUFRSX1NVQih4LCB5KSAoKChjaGFyICopICh4KSkgLSAoKHVuc2lnbmVkIGxvbmcpICh5KSkpCisjZGVmaW5lIFBUUl9ESUZGKHgsIHkpICgodW5zaWduZWQgbG9uZykoKChjaGFyICopICh4KSkgLSAoKHVuc2lnbmVkIGxvbmcpICh5KSkpKQorCisvKgorICogQ29weSBvbmUgcGFnZSBmcm9tICJvbGRtZW0iCisgKgorICogRm9yIHRoZSBrZHVtcCByZXNlcnZlZCBtZW1vcnkgdGhpcyBmdW5jdGlvbnMgcGVyZm9ybXMgYSBzd2FwIG9wZXJhdGlvbjoKKyAqICAtIFtPTERNRU1fQkFTRSAtIE9MRE1FTV9CQVNFICsgT0xETUVNX1NJWkVdIGlzIG1hcHBlZCB0byBbMCAtIE9MRE1FTV9TSVpFXS4KKyAqICAtIFswIC0gT0xETUVNX1NJWkVdIGlzIG1hcHBlZCB0byBbT0xETUVNX0JBU0UgLSBPTERNRU1fQkFTRSArIE9MRE1FTV9TSVpFXQorICovCitzc2l6ZV90IGNvcHlfb2xkbWVtX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4sIGNoYXIgKmJ1ZiwKKwkJCSBzaXplX3QgY3NpemUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgdXNlcmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIHNyYzsKKworCWlmICghY3NpemUpCisJCXJldHVybiAwOworCisJc3JjID0gKHBmbiA8PCBQQUdFX1NISUZUKSArIG9mZnNldDsKKwlpZiAoc3JjIDwgT0xETUVNX1NJWkUpCisJCXNyYyArPSBPTERNRU1fQkFTRTsKKwllbHNlIGlmIChzcmMgPiBPTERNRU1fQkFTRSAmJgorCQkgc3JjIDwgT0xETUVNX0JBU0UgKyBPTERNRU1fU0laRSkKKwkJc3JjIC09IE9MRE1FTV9CQVNFOworCWlmICh1c2VyYnVmKQorCQljb3B5X3RvX3VzZXJfcmVhbCgodm9pZCBfX2ZvcmNlIF9fdXNlciAqKSBidWYsICh2b2lkICopIHNyYywKKwkJCQkgIGNzaXplKTsKKwllbHNlCisJCW1lbWNweV9yZWFsKGJ1ZiwgKHZvaWQgKikgc3JjLCBjc2l6ZSk7CisJcmV0dXJuIGNzaXplOworfQorCisvKgorICogQ29weSBtZW1vcnkgZnJvbSBvbGQga2VybmVsCisgKi8KK3N0YXRpYyBpbnQgY29weV9mcm9tX29sZG1lbSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGNvcGllZCA9IDA7CisJaW50IHJjOworCisJaWYgKCh1bnNpZ25lZCBsb25nKSBzcmMgPCBPTERNRU1fU0laRSkgeworCQljb3BpZWQgPSBtaW4oY291bnQsIE9MRE1FTV9TSVpFIC0gKHVuc2lnbmVkIGxvbmcpIHNyYyk7CisJCXJjID0gbWVtY3B5X3JlYWwoZGVzdCwgc3JjICsgT0xETUVNX0JBU0UsIGNvcGllZCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIG1lbWNweV9yZWFsKGRlc3QgKyBjb3BpZWQsIHNyYyArIGNvcGllZCwgY291bnQgLSBjb3BpZWQpOworfQorCisvKgorICogQWxsb2MgbWVtb3J5IGFuZCBwYW5pYyBpbiBjYXNlIG9mIEVOT01FTQorICovCitzdGF0aWMgdm9pZCAqa3phbGxvY19wYW5pYyhpbnQgbGVuKQoreworCXZvaWQgKnJjOworCisJcmMgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYykKKwkJcGFuaWMoInMzOTAga2R1bXAga3phbGxvYyAoJWQpIGZhaWxlZCIsIGxlbik7CisJcmV0dXJuIHJjOworfQorCisvKgorICogR2V0IG1lbW9yeSBsYXlvdXQgYW5kIGNyZWF0ZSBob2xlIGZvciBvbGRtZW0KKyAqLworc3RhdGljIHN0cnVjdCBtZW1fY2h1bmsgKmdldF9tZW1vcnlfbGF5b3V0KHZvaWQpCit7CisJc3RydWN0IG1lbV9jaHVuayAqY2h1bmtfYXJyYXk7CisKKwljaHVua19hcnJheSA9IGt6YWxsb2NfcGFuaWMoTUVNT1JZX0NIVU5LUyAqIHNpemVvZihzdHJ1Y3QgbWVtX2NodW5rKSk7CisJZGV0ZWN0X21lbW9yeV9sYXlvdXQoY2h1bmtfYXJyYXkpOworCWNyZWF0ZV9tZW1faG9sZShjaHVua19hcnJheSwgT0xETUVNX0JBU0UsIE9MRE1FTV9TSVpFLCBDSFVOS19DUkFTSEspOworCXJldHVybiBjaHVua19hcnJheTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgRUxGIG5vdGUKKyAqLworc3RhdGljIHZvaWQgKm50X2luaXQodm9pZCAqYnVmLCBFbGY2NF9Xb3JkIHR5cGUsIHZvaWQgKmRlc2MsIGludCBkX2xlbiwKKwkJICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCUVsZjY0X05oZHIgKm5vdGU7CisJdTY0IGxlbjsKKworCW5vdGUgPSAoRWxmNjRfTmhkciAqKWJ1ZjsKKwlub3RlLT5uX25hbWVzeiA9IHN0cmxlbihuYW1lKSArIDE7CisJbm90ZS0+bl9kZXNjc3ogPSBkX2xlbjsKKwlub3RlLT5uX3R5cGUgPSB0eXBlOworCWxlbiA9IHNpemVvZihFbGY2NF9OaGRyKTsKKworCW1lbWNweShidWYgKyBsZW4sIG5hbWUsIG5vdGUtPm5fbmFtZXN6KTsKKwlsZW4gPSByb3VuZHVwKGxlbiArIG5vdGUtPm5fbmFtZXN6LCA0KTsKKworCW1lbWNweShidWYgKyBsZW4sIGRlc2MsIG5vdGUtPm5fZGVzY3N6KTsKKwlsZW4gPSByb3VuZHVwKGxlbiArIG5vdGUtPm5fZGVzY3N6LCA0KTsKKworCXJldHVybiBQVFJfQUREKGJ1ZiwgbGVuKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgcHJzdGF0dXMgbm90ZQorICovCitzdGF0aWMgdm9pZCAqbnRfcHJzdGF0dXModm9pZCAqcHRyLCBzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSkKK3sKKwlzdHJ1Y3QgZWxmX3Byc3RhdHVzIG50X3Byc3RhdHVzOworCXN0YXRpYyBpbnQgY3B1X25yID0gMTsKKworCW1lbXNldCgmbnRfcHJzdGF0dXMsIDAsIHNpemVvZihudF9wcnN0YXR1cykpOworCW1lbWNweSgmbnRfcHJzdGF0dXMucHJfcmVnLmdwcnMsIHNhLT5ncF9yZWdzLCBzaXplb2Yoc2EtPmdwX3JlZ3MpKTsKKwltZW1jcHkoJm50X3Byc3RhdHVzLnByX3JlZy5wc3csIHNhLT5wc3csIHNpemVvZihzYS0+cHN3KSk7CisJbWVtY3B5KCZudF9wcnN0YXR1cy5wcl9yZWcuYWNycywgc2EtPmFjY19yZWdzLCBzaXplb2Yoc2EtPmFjY19yZWdzKSk7CisJbnRfcHJzdGF0dXMucHJfcGlkID0gY3B1X25yOworCWNwdV9ucisrOworCisJcmV0dXJuIG50X2luaXQocHRyLCBOVF9QUlNUQVRVUywgJm50X3Byc3RhdHVzLCBzaXplb2YobnRfcHJzdGF0dXMpLAorCQkJICJDT1JFIik7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGZwcmVnc2V0IChmbG9hdGluZyBwb2ludCkgbm90ZQorICovCitzdGF0aWMgdm9pZCAqbnRfZnByZWdzZXQodm9pZCAqcHRyLCBzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSkKK3sKKwllbGZfZnByZWdzZXRfdCBudF9mcHJlZ3NldDsKKworCW1lbXNldCgmbnRfZnByZWdzZXQsIDAsIHNpemVvZihudF9mcHJlZ3NldCkpOworCW1lbWNweSgmbnRfZnByZWdzZXQuZnBjLCAmc2EtPmZwX2N0cmxfcmVnLCBzaXplb2Yoc2EtPmZwX2N0cmxfcmVnKSk7CisJbWVtY3B5KCZudF9mcHJlZ3NldC5mcHJzLCAmc2EtPmZwX3JlZ3MsIHNpemVvZihzYS0+ZnBfcmVncykpOworCisJcmV0dXJuIG50X2luaXQocHRyLCBOVF9QUkZQUkVHLCAmbnRfZnByZWdzZXQsIHNpemVvZihudF9mcHJlZ3NldCksCisJCSAgICAgICAiQ09SRSIpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aW1lciBub3RlCisgKi8KK3N0YXRpYyB2b2lkICpudF9zMzkwX3RpbWVyKHZvaWQgKnB0ciwgc3RydWN0IHNhdmVfYXJlYSAqc2EpCit7CisJcmV0dXJuIG50X2luaXQocHRyLCBOVF9TMzkwX1RJTUVSLCAmc2EtPnRpbWVyLCBzaXplb2Yoc2EtPnRpbWVyKSwKKwkJCSBLRVhFQ19DT1JFX05PVEVfTkFNRSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIFRPRCBjbG9jayBjb21wYXJhdG9yIG5vdGUKKyAqLworc3RhdGljIHZvaWQgKm50X3MzOTBfdG9kX2NtcCh2b2lkICpwdHIsIHN0cnVjdCBzYXZlX2FyZWEgKnNhKQoreworCXJldHVybiBudF9pbml0KHB0ciwgTlRfUzM5MF9UT0RDTVAsICZzYS0+Y2xrX2NtcCwKKwkJICAgICAgIHNpemVvZihzYS0+Y2xrX2NtcCksIEtFWEVDX0NPUkVfTk9URV9OQU1FKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgVE9EIHByb2dyYW1tYWJsZSByZWdpc3RlciBub3RlCisgKi8KK3N0YXRpYyB2b2lkICpudF9zMzkwX3RvZF9wcmVnKHZvaWQgKnB0ciwgc3RydWN0IHNhdmVfYXJlYSAqc2EpCit7CisJcmV0dXJuIG50X2luaXQocHRyLCBOVF9TMzkwX1RPRFBSRUcsICZzYS0+dG9kX3JlZywKKwkJICAgICAgIHNpemVvZihzYS0+dG9kX3JlZyksIEtFWEVDX0NPUkVfTk9URV9OQU1FKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgY29udHJvbCByZWdpc3RlciBub3RlCisgKi8KK3N0YXRpYyB2b2lkICpudF9zMzkwX2N0cnModm9pZCAqcHRyLCBzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSkKK3sKKwlyZXR1cm4gbnRfaW5pdChwdHIsIE5UX1MzOTBfQ1RSUywgJnNhLT5jdHJsX3JlZ3MsCisJCSAgICAgICBzaXplb2Yoc2EtPmN0cmxfcmVncyksIEtFWEVDX0NPUkVfTk9URV9OQU1FKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgcHJlZml4IHJlZ2lzdGVyIG5vdGUKKyAqLworc3RhdGljIHZvaWQgKm50X3MzOTBfcHJlZml4KHZvaWQgKnB0ciwgc3RydWN0IHNhdmVfYXJlYSAqc2EpCit7CisJcmV0dXJuIG50X2luaXQocHRyLCBOVF9TMzkwX1BSRUZJWCwgJnNhLT5wcmVmX3JlZywKKwkJCSBzaXplb2Yoc2EtPnByZWZfcmVnKSwgS0VYRUNfQ09SRV9OT1RFX05BTUUpOworfQorCisvKgorICogRmlsbCBFTEYgbm90ZXMgZm9yIG9uZSBDUFUgd2l0aCBzYXZlIGFyZWEgcmVnaXN0ZXJzCisgKi8KK3ZvaWQgKmZpbGxfY3B1X2VsZl9ub3Rlcyh2b2lkICpwdHIsIHN0cnVjdCBzYXZlX2FyZWEgKnNhKQoreworCXB0ciA9IG50X3Byc3RhdHVzKHB0ciwgc2EpOworCXB0ciA9IG50X2ZwcmVnc2V0KHB0ciwgc2EpOworCXB0ciA9IG50X3MzOTBfdGltZXIocHRyLCBzYSk7CisJcHRyID0gbnRfczM5MF90b2RfY21wKHB0ciwgc2EpOworCXB0ciA9IG50X3MzOTBfdG9kX3ByZWcocHRyLCBzYSk7CisJcHRyID0gbnRfczM5MF9jdHJzKHB0ciwgc2EpOworCXB0ciA9IG50X3MzOTBfcHJlZml4KHB0ciwgc2EpOworCXJldHVybiBwdHI7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHBycHNpbmZvIG5vdGUgKG5ldyBrZXJuZWwpCisgKi8KK3N0YXRpYyB2b2lkICpudF9wcnBzaW5mbyh2b2lkICpwdHIpCit7CisJc3RydWN0IGVsZl9wcnBzaW5mbyBwcnBzaW5mbzsKKworCW1lbXNldCgmcHJwc2luZm8sIDAsIHNpemVvZihwcnBzaW5mbykpOworCXBycHNpbmZvLnByX3NuYW1lID0gJ1InOworCXN0cmNweShwcnBzaW5mby5wcl9mbmFtZSwgInZtbGludXgiKTsKKwlyZXR1cm4gbnRfaW5pdChwdHIsIE5UX1BSUFNJTkZPLCAmcHJwc2luZm8sIHNpemVvZihwcnBzaW5mbyksCisJCSAgICAgICBLRVhFQ19DT1JFX05PVEVfTkFNRSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHZtY29yZWluZm8gbm90ZSAobmV3IGtlcm5lbCkKKyAqLworc3RhdGljIHZvaWQgKm50X3ZtY29yZWluZm8odm9pZCAqcHRyKQoreworCWNoYXIgbnRfbmFtZVsxMV0sICp2bWNvcmVpbmZvOworCUVsZjY0X05oZHIgbm90ZTsKKwl2b2lkICphZGRyOworCisJaWYgKGNvcHlfZnJvbV9vbGRtZW0oJmFkZHIsICZTMzkwX2xvd2NvcmUudm1jb3JlX2luZm8sIHNpemVvZihhZGRyKSkpCisJCXJldHVybiBwdHI7CisJbWVtc2V0KG50X25hbWUsIDAsIHNpemVvZihudF9uYW1lKSk7CisJaWYgKGNvcHlfZnJvbV9vbGRtZW0oJm5vdGUsIGFkZHIsIHNpemVvZihub3RlKSkpCisJCXJldHVybiBwdHI7CisJaWYgKGNvcHlfZnJvbV9vbGRtZW0obnRfbmFtZSwgYWRkciArIHNpemVvZihub3RlKSwgc2l6ZW9mKG50X25hbWUpIC0gMSkpCisJCXJldHVybiBwdHI7CisJaWYgKHN0cmNtcChudF9uYW1lLCAiVk1DT1JFSU5GTyIpICE9IDApCisJCXJldHVybiBwdHI7CisJdm1jb3JlaW5mbyA9IGt6YWxsb2NfcGFuaWMobm90ZS5uX2Rlc2NzeiArIDEpOworCWlmIChjb3B5X2Zyb21fb2xkbWVtKHZtY29yZWluZm8sIGFkZHIgKyAyNCwgbm90ZS5uX2Rlc2NzeikpCisJCXJldHVybiBwdHI7CisJdm1jb3JlaW5mb1tub3RlLm5fZGVzY3N6ICsgMV0gPSAwOworCXJldHVybiBudF9pbml0KHB0ciwgMCwgdm1jb3JlaW5mbywgbm90ZS5uX2Rlc2NzeiwgIlZNQ09SRUlORk8iKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgRUxGIGhlYWRlciAobmV3IGtlcm5lbCkKKyAqLworc3RhdGljIHZvaWQgKmVoZHJfaW5pdChFbGY2NF9FaGRyICplaGRyLCBpbnQgbWVtX2NodW5rX2NudCkKK3sKKwltZW1zZXQoZWhkciwgMCwgc2l6ZW9mKCplaGRyKSk7CisJbWVtY3B5KGVoZHItPmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRyk7CisJZWhkci0+ZV9pZGVudFtFSV9DTEFTU10gPSBFTEZDTEFTUzY0OworCWVoZHItPmVfaWRlbnRbRUlfREFUQV0gPSBFTEZEQVRBMk1TQjsKKwllaGRyLT5lX2lkZW50W0VJX1ZFUlNJT05dID0gRVZfQ1VSUkVOVDsKKwltZW1zZXQoZWhkci0+ZV9pZGVudCArIEVJX1BBRCwgMCwgRUlfTklERU5UIC0gRUlfUEFEKTsKKwllaGRyLT5lX3R5cGUgPSBFVF9DT1JFOworCWVoZHItPmVfbWFjaGluZSA9IEVNX1MzOTA7CisJZWhkci0+ZV92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKKwllaGRyLT5lX3Bob2ZmID0gc2l6ZW9mKEVsZjY0X0VoZHIpOworCWVoZHItPmVfZWhzaXplID0gc2l6ZW9mKEVsZjY0X0VoZHIpOworCWVoZHItPmVfcGhlbnRzaXplID0gc2l6ZW9mKEVsZjY0X1BoZHIpOworCWVoZHItPmVfcGhudW0gPSBtZW1fY2h1bmtfY250ICsgMTsKKwlyZXR1cm4gZWhkciArIDE7Cit9CisKKy8qCisgKiBSZXR1cm4gQ1BVIGNvdW50IGZvciBFTEYgaGVhZGVyIChuZXcga2VybmVsKQorICovCitzdGF0aWMgaW50IGdldF9jcHVfY250KHZvaWQpCit7CisJaW50IGksIGNwdXMgPSAwOworCisJZm9yIChpID0gMDsgemZjcGR1bXBfc2F2ZV9hcmVhc1tpXTsgaSsrKSB7CisJCWlmICh6ZmNwZHVtcF9zYXZlX2FyZWFzW2ldLT5wcmVmX3JlZyA9PSAwKQorCQkJY29udGludWU7CisJCWNwdXMrKzsKKwl9CisJcmV0dXJuIGNwdXM7Cit9CisKKy8qCisgKiBSZXR1cm4gbWVtb3J5IGNodW5rIGNvdW50IGZvciBFTEYgaGVhZGVyIChuZXcga2VybmVsKQorICovCitzdGF0aWMgaW50IGdldF9tZW1fY2h1bmtfY250KHZvaWQpCit7CisJc3RydWN0IG1lbV9jaHVuayAqY2h1bmtfYXJyYXksICptZW1fY2h1bms7CisJaW50IGksIGNudCA9IDA7CisKKwljaHVua19hcnJheSA9IGdldF9tZW1vcnlfbGF5b3V0KCk7CisJZm9yIChpID0gMDsgaSA8IE1FTU9SWV9DSFVOS1M7IGkrKykgeworCQltZW1fY2h1bmsgPSAmY2h1bmtfYXJyYXlbaV07CisJCWlmIChjaHVua19hcnJheVtpXS50eXBlICE9IENIVU5LX1JFQURfV1JJVEUgJiYKKwkJICAgIGNodW5rX2FycmF5W2ldLnR5cGUgIT0gQ0hVTktfUkVBRF9PTkxZKQorCQkJY29udGludWU7CisJCWlmIChtZW1fY2h1bmstPnNpemUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQljbnQrKzsKKwl9CisJa2ZyZWUoY2h1bmtfYXJyYXkpOworCXJldHVybiBjbnQ7Cit9CisKKy8qCisgKiBSZWxvY2F0ZSBwb2ludGVyIGluIG9yZGVyIHRvIGFsbG93IHZtY29yZSBjb2RlIGFjY2VzcyB0aGUgZGF0YQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVsb2NhdGUodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiBPTERNRU1fQkFTRSArIGFkZHI7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIEVMRiBsb2FkcyAobmV3IGtlcm5lbCkKKyAqLworc3RhdGljIGludCBsb2Fkc19pbml0KEVsZjY0X1BoZHIgKnBoZHIsIHU2NCBsb2Fkc19vZmZzZXQpCit7CisJc3RydWN0IG1lbV9jaHVuayAqY2h1bmtfYXJyYXksICptZW1fY2h1bms7CisJaW50IGk7CisKKwljaHVua19hcnJheSA9IGdldF9tZW1vcnlfbGF5b3V0KCk7CisJZm9yIChpID0gMDsgaSA8IE1FTU9SWV9DSFVOS1M7IGkrKykgeworCQltZW1fY2h1bmsgPSAmY2h1bmtfYXJyYXlbaV07CisJCWlmIChtZW1fY2h1bmstPnNpemUgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoY2h1bmtfYXJyYXlbaV0udHlwZSAhPSBDSFVOS19SRUFEX1dSSVRFICYmCisJCSAgICBjaHVua19hcnJheVtpXS50eXBlICE9IENIVU5LX1JFQURfT05MWSkKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQlwaGRyLT5wX2ZpbGVzeiA9IG1lbV9jaHVuay0+c2l6ZTsKKwkJcGhkci0+cF90eXBlID0gUFRfTE9BRDsKKwkJcGhkci0+cF9vZmZzZXQgPSBtZW1fY2h1bmstPmFkZHI7CisJCXBoZHItPnBfdmFkZHIgPSBtZW1fY2h1bmstPmFkZHI7CisJCXBoZHItPnBfcGFkZHIgPSBtZW1fY2h1bmstPmFkZHI7CisJCXBoZHItPnBfbWVtc3ogPSBtZW1fY2h1bmstPnNpemU7CisJCXBoZHItPnBfZmxhZ3MgPSBQRl9SIHwgUEZfVyB8IFBGX1g7CisJCXBoZHItPnBfYWxpZ24gPSBQQUdFX1NJWkU7CisJCXBoZHIrKzsKKwl9CisJa2ZyZWUoY2h1bmtfYXJyYXkpOworCXJldHVybiBpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBub3RlcyAobmV3IGtlcm5lbCkKKyAqLworc3RhdGljIHZvaWQgKm5vdGVzX2luaXQoRWxmNjRfUGhkciAqcGhkciwgdm9pZCAqcHRyLCB1NjQgbm90ZXNfb2Zmc2V0KQoreworCXN0cnVjdCBzYXZlX2FyZWEgKnNhOworCXZvaWQgKnB0cl9zdGFydCA9IHB0cjsKKwlpbnQgaTsKKworCXB0ciA9IG50X3BycHNpbmZvKHB0cik7CisKKwlmb3IgKGkgPSAwOyB6ZmNwZHVtcF9zYXZlX2FyZWFzW2ldOyBpKyspIHsKKwkJc2EgPSB6ZmNwZHVtcF9zYXZlX2FyZWFzW2ldOworCQlpZiAoc2EtPnByZWZfcmVnID09IDApCisJCQljb250aW51ZTsKKwkJcHRyID0gZmlsbF9jcHVfZWxmX25vdGVzKHB0ciwgc2EpOworCX0KKwlwdHIgPSBudF92bWNvcmVpbmZvKHB0cik7CisJbWVtc2V0KHBoZHIsIDAsIHNpemVvZigqcGhkcikpOworCXBoZHItPnBfdHlwZSA9IFBUX05PVEU7CisJcGhkci0+cF9vZmZzZXQgPSByZWxvY2F0ZShub3Rlc19vZmZzZXQpOworCXBoZHItPnBfZmlsZXN6ID0gKHVuc2lnbmVkIGxvbmcpIFBUUl9TVUIocHRyLCBwdHJfc3RhcnQpOworCXBoZHItPnBfbWVtc3ogPSBwaGRyLT5wX2ZpbGVzejsKKwlyZXR1cm4gcHRyOworfQorCisvKgorICogQ3JlYXRlIEVMRiBjb3JlIGhlYWRlciAobmV3IGtlcm5lbCkKKyAqLworc3RhdGljIHZvaWQgczM5MF9lbGZfY29yZWhkcl9jcmVhdGUoY2hhciAqKmVsZmNvcmVidWYsIHNpemVfdCAqZWxmY29yZWJ1Zl9zeikKK3sKKwlFbGY2NF9QaGRyICpwaGRyX25vdGVzLCAqcGhkcl9sb2FkczsKKwlpbnQgbWVtX2NodW5rX2NudDsKKwl2b2lkICpwdHIsICpoZHI7CisJdTMyIGFsbG9jX3NpemU7CisJdTY0IGhkcl9vZmY7CisKKwltZW1fY2h1bmtfY250ID0gZ2V0X21lbV9jaHVua19jbnQoKTsKKworCWFsbG9jX3NpemUgPSAweDEwMDAgKyBnZXRfY3B1X2NudCgpICogMHgzMDAgKworCQltZW1fY2h1bmtfY250ICogc2l6ZW9mKEVsZjY0X1BoZHIpOworCWhkciA9IGt6YWxsb2NfcGFuaWMoYWxsb2Nfc2l6ZSk7CisJLyogSW5pdCBlbGYgaGVhZGVyICovCisJcHRyID0gZWhkcl9pbml0KGhkciwgbWVtX2NodW5rX2NudCk7CisJLyogSW5pdCBwcm9ncmFtIGhlYWRlcnMgKi8KKwlwaGRyX25vdGVzID0gcHRyOworCXB0ciA9IFBUUl9BREQocHRyLCBzaXplb2YoRWxmNjRfUGhkcikpOworCXBoZHJfbG9hZHMgPSBwdHI7CisJcHRyID0gUFRSX0FERChwdHIsIHNpemVvZihFbGY2NF9QaGRyKSAqIG1lbV9jaHVua19jbnQpOworCS8qIEluaXQgbm90ZXMgKi8KKwloZHJfb2ZmID0gUFRSX0RJRkYocHRyLCBoZHIpOworCXB0ciA9IG5vdGVzX2luaXQocGhkcl9ub3RlcywgcHRyLCAoKHVuc2lnbmVkIGxvbmcpIGhkcikgKyBoZHJfb2ZmKTsKKwkvKiBJbml0IGxvYWRzICovCisJaGRyX29mZiA9IFBUUl9ESUZGKHB0ciwgaGRyKTsKKwlsb2Fkc19pbml0KHBoZHJfbG9hZHMsICgodW5zaWduZWQgbG9uZykgaGRyKSArIGhkcl9vZmYpOworCSplbGZjb3JlYnVmX3N6ID0gaGRyX29mZjsKKwkqZWxmY29yZWJ1ZiA9ICh2b2lkICopIHJlbG9jYXRlKCh1bnNpZ25lZCBsb25nKSBoZHIpOworCUJVR19PTigqZWxmY29yZWJ1Zl9zeiA+IGFsbG9jX3NpemUpOworfQorCisvKgorICogQ3JlYXRlIGtkdW1wIEVMRiBjb3JlIGhlYWRlciBpbiBuZXcga2VybmVsLCBpZiBpdCBoYXMgbm90IGJlZW4gcGFzc2VkIHZpYQorICogdGhlICJlbGZjb3JlaGRyIiBrZXJuZWwgcGFyYW1ldGVyCisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfa2R1bXBfZWxmY29yZWhkcih2b2lkKQoreworCXNpemVfdCBlbGZjb3JlYnVmX3N6OworCWNoYXIgKmVsZmNvcmVidWY7CisKKwlpZiAoIU9MRE1FTV9CQVNFIHx8IGlzX2tkdW1wX2tlcm5lbCgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzMzkwX2VsZl9jb3JlaGRyX2NyZWF0ZSgmZWxmY29yZWJ1ZiwgJmVsZmNvcmVidWZfc3opOworCWVsZmNvcmVoZHJfYWRkciA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIGVsZmNvcmVidWY7CisJZWxmY29yZWhkcl9zaXplID0gZWxmY29yZWJ1Zl9zejsKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHNldHVwX2tkdW1wX2VsZmNvcmVoZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCmluZGV4IGYyOTc0NTYuLjM3Mzk0YjMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKQEAgLTI1Miw3ICsyNTIsNyBAQAogewogCXBzd190IHBzdzsKIAotCXBzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19ERUZBVUxUX0tFWTsKKwlwc3cubWFzayA9IFBTV19NQVNLX0JBU0UgfCBQU1dfREVGQVVMVF9LRVkgfCBQU1dfTUFTS19FQSB8IFBTV19NQVNLX0JBOwogCXBzdy5hZGRyID0gUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgczM5MF9iYXNlX2V4dF9oYW5kbGVyOwogCVMzOTBfbG93Y29yZS5leHRlcm5hbF9uZXdfcHN3ID0gcHN3OwogCXBzdy5hZGRyID0gUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgczM5MF9iYXNlX3BnbV9oYW5kbGVyOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCmluZGV4IDAyZWM4ZmUuLmIxMzE1NzAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKQEAgLTQzLDE2ICs0MywxNSBAQAogU1BfUjE0CSAgICAgPQlTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDU2CiBTUF9SMTUJICAgICA9CVNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgNjAKIFNQX09SSUdfUjIgICA9CVNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9PUklHX0dQUjIKLVNQX0lMQwkgICAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0lMQwotU1BfU1ZDTlIgICAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX1NWQ05SCitTUF9TVkNfQ09ERSAgPQlTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU1ZDX0NPREUKIFNQX1NJWkUgICAgICA9CVNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFCiAKIF9USUZfV09SS19TVkMgPSAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9OT1RJRllfUkVTVU1FIHwgX1RJRl9ORUVEX1JFU0NIRUQgfCBcCi0JCSBfVElGX01DQ0tfUEVORElORyB8IF9USUZfUkVTVEFSVF9TVkMgfCBfVElGX1BFUl9UUkFQICkKKwkJIF9USUZfTUNDS19QRU5ESU5HIHwgX1RJRl9QRVJfVFJBUCApCiBfVElGX1dPUktfSU5UID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAogCQkgX1RJRl9NQ0NLX1BFTkRJTkcpCi1fVElGX1NZU0NBTEwgPSAoX1RJRl9TWVNDQUxMX1RSQUNFPj44IHwgX1RJRl9TWVNDQUxMX0FVRElUPj44IHwgXAotCQlfVElGX1NFQ0NPTVA+PjggfCBfVElGX1NZU0NBTExfVFJBQ0VQT0lOVD4+OCkKK19USUZfVFJBQ0UgICAgPSAoX1RJRl9TWVNDQUxMX1RSQUNFIHwgX1RJRl9TWVNDQUxMX0FVRElUIHwgX1RJRl9TRUNDT01QIHwgXAorCQkgX1RJRl9TWVNDQUxMX1RSQUNFUE9JTlQpCiAKIFNUQUNLX1NISUZUID0gUEFHRV9TSElGVCArIFRIUkVBRF9PUkRFUgogU1RBQ0tfU0laRSAgPSAxIDw8IFNUQUNLX1NISUZUCkBAIC0yMjgsOSArMjI3LDEwIEBACiBzeXNjX3NhdmVhbGw6CiAJU0FWRV9BTExfU1ZDIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEKIAlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19TQVZFX0FSRUEKLQltdmMJU1BfUFNXKDgsJXIxNSksX19MQ19TVkNfT0xEX1BTVwotCW12YwlTUF9JTEMoNCwlcjE1KSxfX0xDX1NWQ19JTEMKIAlsCSVyMTIsX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwltdmMJU1BfUFNXKDgsJXIxNSksX19MQ19TVkNfT0xEX1BTVworCW12YwlTUF9TVkNfQ09ERSg0LCVyMTUpLF9fTENfU1ZDX0lMQworCW9pCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1NZU0NBTEwKIHN5c2NfdnRpbWU6CiAJVVBEQVRFX1ZUSU1FIF9fTENfRVhJVF9USU1FUixfX0xDX1NZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCiBzeXNjX3N0aW1lOgpAQCAtMjM5LDE3ICsyMzksMTcgQEAKIAltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX1NZTkNfRU5URVJfVElNRVIKIHN5c2NfZG9fc3ZjOgogCXhyCSVyNywlcjcKLQlpY20JJXI3LDMsU1BfU1ZDTlIoJXIxNSkJIyBsb2FkIHN2YyBudW1iZXIgYW5kIHRlc3QgZm9yIHN2YyAwCisJaWNtCSVyNywzLFNQX1NWQ19DT0RFKzIoJXIxNSkjIGxvYWQgc3ZjIG51bWJlciBhbmQgdGVzdCBmb3Igc3ZjIDAKIAlibnoJQkFTRUQoc3lzY19ucl9vaykJIyBzdmMgbnVtYmVyID4gMAogCSMgc3ZjIDA6IHN5c3RlbSBjYWxsIG51bWJlciBpbiAlcjEKIAljbAklcjEsQkFTRUQoLkxucl9zeXNjYWxscykKIAlibmwJQkFTRUQoc3lzY19ucl9vaykKLQlzdGgJJXIxLFNQX1NWQ05SKCVyMTUpCisJc3RoCSVyMSxTUF9TVkNfQ09ERSsyKCVyMTUpCiAJbHIJJXI3LCVyMSAJICAjIGNvcHkgc3ZjIG51bWJlciB0byAlcjcKIHN5c2NfbnJfb2s6CiAJc2xsCSVyNywyCQkgICMgc3ZjIG51bWJlciAqNAogCWwJJXIxMCxCQVNFRCguTHN5c2NfdGFibGUpCi0JdG0JX19USV9mbGFncysyKCVyMTIpLF9USUZfU1lTQ0FMTAorCXRtCV9fVElfZmxhZ3MrMiglcjEyKSxfVElGX1RSQUNFID4+IDgKIAltdmMJU1BfQVJHUyg0LCVyMTUpLFNQX1I3KCVyMTUpCiAJbAklcjgsMCglcjcsJXIxMCkJICAjIGdldCBzeXN0ZW0gY2FsbCBhZGRyLgogCWJueglCQVNFRChzeXNjX3RyYWNlc3lzKQpAQCAtMjU5LDIzICsyNTksMTkgQEAKIHN5c2NfcmV0dXJuOgogCUxPQ0tERVBfU1lTX0VYSVQKIHN5c2NfdGlmOgorCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyByZXR1cm5pbmcgdG8gdXNlciA/CisJYm5vCUJBU0VEKHN5c2NfcmVzdG9yZSkKIAl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9XT1JLX1NWQwogCWJueglCQVNFRChzeXNjX3dvcmspICAjIHRoZXJlIGlzIHdvcmsgdG8gZG8gKHNpZ25hbHMgZXRjLikKKwluaQlfX1RJX2ZsYWdzKzMoJXIxMiksMjU1LV9USUZfU1lTQ0FMTAogc3lzY19yZXN0b3JlOgogCVJFU1RPUkVfQUxMIF9fTENfUkVUVVJOX1BTVywxCiBzeXNjX2RvbmU6CiAKICMKLSMgVGhlcmUgaXMgd29yayB0byBkbywgYnV0IGZpcnN0IHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgcmV0dXJuIHRvIHVzZXJzcGFjZS4KLSMKLXN5c2Nfd29yazoKLQl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgcmV0dXJuaW5nIHRvIHVzZXIgPwotCWJubwlCQVNFRChzeXNjX3Jlc3RvcmUpCi0KLSMKICMgT25lIG9mIHRoZSB3b3JrIGJpdHMgaXMgb24uIEZpbmQgb3V0IHdoaWNoIG9uZS4KICMKLXN5c2Nfd29ya190aWY6CitzeXNjX3dvcms6CiAJdG0JX19USV9mbGFncyszKCVyMTIpLF9USUZfTUNDS19QRU5ESU5HCiAJYm8JQkFTRUQoc3lzY19tY2NrX3BlbmRpbmcpCiAJdG0JX19USV9mbGFncyszKCVyMTIpLF9USUZfTkVFRF9SRVNDSEVECkBAIC0yODQsOCArMjgwLDYgQEAKIAlibwlCQVNFRChzeXNjX3NpZ3BlbmRpbmcpCiAJdG0JX19USV9mbGFncyszKCVyMTIpLF9USUZfTk9USUZZX1JFU1VNRQogCWJvCUJBU0VEKHN5c2Nfbm90aWZ5X3Jlc3VtZSkKLQl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9SRVNUQVJUX1NWQwotCWJvCUJBU0VEKHN5c2NfcmVzdGFydCkKIAl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9QRVJfVFJBUAogCWJvCUJBU0VEKHN5c2Nfc2luZ2xlc3RlcCkKIAliCUJBU0VEKHN5c2NfcmV0dXJuKQkjIGJld2FyZSBvZiBjcml0aWNhbCBzZWN0aW9uIGNsZWFudXAKQEAgLTMxNCwxMSArMzA4LDE0IEBACiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwogCWwJJXIxLEJBU0VEKC5MZG9fc2lnbmFsKQogCWJhc3IJJXIxNCwlcjEJCSMgY2FsbCBkb19zaWduYWwKLQl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9SRVNUQVJUX1NWQwotCWJvCUJBU0VEKHN5c2NfcmVzdGFydCkKLQl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9QRVJfVFJBUAotCWJvCUJBU0VEKHN5c2Nfc2luZ2xlc3RlcCkKLQliCUJBU0VEKHN5c2NfcmV0dXJuKQorCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1NZU0NBTEwKKwlibm8JQkFTRUQoc3lzY19yZXR1cm4pCisJbG0JJXIyLCVyNixTUF9SMiglcjE1KQkjIGxvYWQgc3ZjIGFyZ3VtZW50cworCXhyCSVyNywlcjcJCQkjIHN2YyAwIHJldHVybnMgLUVOT1NZUworCWNsYwlTUF9TVkNfQ09ERSsyKDIsJXIxNSksQkFTRUQoLkxucl9zeXNjYWxscysyKQorCWJubAlCQVNFRChzeXNjX25yX29rKQkjIGludmFsaWQgc3ZjIG51bWJlciAtPiBkbyBzdmMgMAorCWljbQklcjcsMyxTUF9TVkNfQ09ERSsyKCVyMTUpIyBsb2FkIG5ldyBzdmMgbnVtYmVyCisJYglCQVNFRChzeXNjX25yX29rKQkjIHJlc3RhcnQgc3ZjCiAKICMKICMgX1RJRl9OT1RJRllfUkVTVU1FIGlzIHNldCwgY2FsbCBkb19ub3RpZnlfcmVzdW1lCkBAIC0zMjksMjQgKzMyNiwxMSBAQAogCWxhCSVyMTQsQkFTRUQoc3lzY19yZXR1cm4pCiAJYnIJJXIxCQkJIyBjYWxsIGRvX25vdGlmeV9yZXN1bWUKIAotCi0jCi0jIF9USUZfUkVTVEFSVF9TVkMgaXMgc2V0LCBzZXQgdXAgcmVnaXN0ZXJzIGFuZCByZXN0YXJ0IHN2YwotIwotc3lzY19yZXN0YXJ0OgotCW5pCV9fVElfZmxhZ3MrMyglcjEyKSwyNTUtX1RJRl9SRVNUQVJUX1NWQyAjIGNsZWFyIFRJRl9SRVNUQVJUX1NWQwotCWwJJXI3LFNQX1IyKCVyMTUpIAkjIGxvYWQgbmV3IHN2YyBudW1iZXIKLQltdmMJU1BfUjIoNCwlcjE1KSxTUF9PUklHX1IyKCVyMTUpICMgcmVzdG9yZSBmaXJzdCBhcmd1bWVudAotCWxtCSVyMiwlcjYsU1BfUjIoJXIxNSkJIyBsb2FkIHN2YyBhcmd1bWVudHMKLQlzdGgJJXI3LFNQX1NWQ05SKCVyMTUpCi0JYglCQVNFRChzeXNjX25yX29rKQkjIHJlc3RhcnQgc3ZjCi0KICMKICMgX1RJRl9QRVJfVFJBUCBpcyBzZXQsIGNhbGwgZG9fcGVyX3RyYXAKICMKIHN5c2Nfc2luZ2xlc3RlcDoKLQluaQlfX1RJX2ZsYWdzKzMoJXIxMiksMjU1LV9USUZfUEVSX1RSQVAgIyBjbGVhciBUSUZfUEVSX1RSQVAKLQl4YwlTUF9TVkNOUigyLCVyMTUpLFNQX1NWQ05SKCVyMTUpCQkjIGNsZWFyIHN2YyBudW1iZXIKKwluaQlfX1RJX2ZsYWdzKzMoJXIxMiksMjU1LShfVElGX1NZU0NBTEwgfCBfVElGX1BFUl9UUkFQKQogCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBhZGRyZXNzIG9mIHJlZ2lzdGVyLXNhdmUgYXJlYQogCWwJJXIxLEJBU0VEKC5MaGFuZGxlX3BlcikJIyBsb2FkIGFkci4gb2YgcGVyIGhhbmRsZXIKIAlsYQklcjE0LEJBU0VEKHN5c2NfcmV0dXJuKQkjIGxvYWQgYWRyLiBvZiBzeXN0ZW0gcmV0dXJuCkBAIC0zNjEsNyArMzQ1LDcgQEAKIAlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCiAJbGEJJXIzLDAKIAl4cgklcjAsJXIwCi0JaWNtCSVyMCwzLFNQX1NWQ05SKCVyMTUpCisJaWNtCSVyMCwzLFNQX1NWQ19DT0RFKCVyMTUpCiAJc3QJJXIwLFNQX1IyKCVyMTUpCiAJYmFzcgklcjE0LCVyMQogCWNsCSVyMixCQVNFRCguTG5yX3N5c2NhbGxzKQpAQCAtMzc2LDcgKzM2MCw3IEBACiAJYmFzcgklcjE0LCVyOAkJIyBjYWxsIHN5c194eHgKIAlzdAklcjIsU1BfUjIoJXIxNSkJCSMgc3RvcmUgcmV0dXJuIHZhbHVlCiBzeXNjX3RyYWNlbm9nbzoKLQl0bQlfX1RJX2ZsYWdzKzIoJXIxMiksX1RJRl9TWVNDQUxMCisJdG0JX19USV9mbGFncysyKCVyMTIpLF9USUZfVFJBQ0UgPj4gOAogCWJ6CUJBU0VEKHN5c2NfcmV0dXJuKQogCWwJJXIxLEJBU0VEKC5MdHJhY2VfZXhpdCkKIAlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCkBAIC00NTQsNyArNDM4LDYgQEAKIAlibnoJQkFTRUQocGdtX3BlcikJCSMgZ290IHBlciBleGNlcHRpb24gLT4gc3BlY2lhbCBjYXNlCiAJU0FWRV9BTExfUEdNIF9fTENfUEdNX09MRF9QU1csX19MQ19TQVZFX0FSRUEKIAlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19TQVZFX0FSRUEKLQl4YwlTUF9JTEMoNCwlcjE1KSxTUF9JTEMoJXIxNSkKIAltdmMJU1BfUFNXKDgsJXIxNSksX19MQ19QR01fT0xEX1BTVwogCWwJJXIxMixfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KQEAgLTUzMCw5ICs1MTMsMTAgQEAKIHBnbV9zdmNwZXI6CiAJU0FWRV9BTExfUEdNIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEKIAlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19TQVZFX0FSRUEKLQltdmMJU1BfUFNXKDgsJXIxNSksX19MQ19TVkNfT0xEX1BTVwotCW12YwlTUF9JTEMoNCwlcjE1KSxfX0xDX1NWQ19JTEMKIAlsCSVyMTIsX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwltdmMJU1BfUFNXKDgsJXIxNSksX19MQ19TVkNfT0xEX1BTVworCW12YwlTUF9TVkNfQ09ERSg0LCVyMTUpLF9fTENfU1ZDX0lMQworCW9pCV9fVElfZmxhZ3MrMyglcjEyKSwoX1RJRl9TWVNDQUxMIHwgX1RJRl9QRVJfVFJBUCkKIAlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKIAlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKIAltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX1NZTkNfRU5URVJfVElNRVIKQEAgLTU0MCw3ICs1MjQsNiBAQAogCW12YwlfX1RIUkVBRF9wZXJfY2F1c2UoMiwlcjgpLF9fTENfUEVSX0NBVVNFCiAJbXZjCV9fVEhSRUFEX3Blcl9hZGRyZXNzKDQsJXI4KSxfX0xDX1BFUl9BRERSRVNTCiAJbXZjCV9fVEhSRUFEX3Blcl9wYWlkKDEsJXI4KSxfX0xDX1BFUl9QQUlECi0Jb2kJX19USV9mbGFncyszKCVyMTIpLF9USUZfUEVSX1RSQVAgIyBzZXQgVElGX1BFUl9UUkFQCiAJc3Rvc20JX19TRl9FTVBUWSglcjE1KSwweDAzCSMgcmVlbmFibGUgaW50ZXJydXB0cwogCWxtCSVyMiwlcjYsU1BfUjIoJXIxNSkJIyBsb2FkIHN2YyBhcmd1bWVudHMKIAliCUJBU0VEKHN5c2NfZG9fc3ZjKQpAQCAtNTUwLDcgKzUzMyw2IEBACiAjCiBrZXJuZWxfcGVyOgogCVJFRU5BQkxFX0lSUVMKLQl4YwlTUF9TVkNOUigyLCVyMTUpLFNQX1NWQ05SKCVyMTUpCiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGFkZHJlc3Mgb2YgcmVnaXN0ZXItc2F2ZSBhcmVhCiAJbAklcjEsQkFTRUQoLkxoYW5kbGVfcGVyKQkjIGxvYWQgYWRyLiBvZiBwZXIgaGFuZGxlcgogCWJhc3IJJXIxNCwlcjEJCSMgYnJhbmNoIHRvIGRvX3NpbmdsZV9zdGVwCkBAIC04NTMsMTMgKzgzNSwxMyBAQAogIyBQU1cgcmVzdGFydCBpbnRlcnJ1cHQgaGFuZGxlcgogIwogRU5UUlkocHN3X3Jlc3RhcnRfaW50X2hhbmRsZXIpCi0Jc3QJJXIxNSxfX0xDX1NBVkVfQVJFQV82NCglcjApCSMgc2F2ZSByMTUKKwlzdAklcjE1LF9fTENfU0FWRV9BUkVBKzQ4KCVyMCkJIyBzYXZlIHIxNQogCWJhc3IJJXIxNSwwCiAwOglsCSVyMTUsLkxyZXN0YXJ0X3N0YWNrLTBiKCVyMTUpCSMgbG9hZCByZXN0YXJ0IHN0YWNrCiAJbAklcjE1LDAoJXIxNSkKIAlhaGkJJXIxNSwtU1BfU0laRQkJCSMgbWFrZSByb29tIGZvciBwdF9yZWdzCiAJc3RtCSVyMCwlcjE0LFNQX1IwKCVyMTUpCQkjIHN0b3JlIGdwcnMgJXIwLSVyMTQgdG8gc3RhY2sKLQltdmMJU1BfUjE1KDQsJXIxNSksX19MQ19TQVZFX0FSRUFfNjQoJXIwKSMgc3RvcmUgc2F2ZWQgJXIxNSB0byBzdGFjaworCW12YwlTUF9SMTUoNCwlcjE1KSxfX0xDX1NBVkVfQVJFQSs0OCglcjApIyBzdG9yZSBzYXZlZCAlcjE1IHRvIHN0YWNrCiAJbXZjCVNQX1BTVyg4LCVyMTUpLF9fTENfUlNUX09MRF9QU1coJXIwKSAjIHN0b3JlIHJlc3RhcnQgb2xkIHBzdwogCXhjCV9fU0ZfQkFDS0NIQUlOKDQsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkgIyBzZXQgYmFja2NoYWluIHRvIDAKIAliYXNyCSVyMTQsMApAQCAtOTY1LDkgKzk0NywxMSBAQAogCXMJJXIxNSxCQVNFRCguTGNfc3BzaXplKQkjIG1ha2Ugcm9vbSBmb3IgcmVnaXN0ZXJzICYgcHN3CiAJc3QJJXIxNSwxMiglcjEyKQogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NBVkVfQVJFQQotCW12YwlTUF9QU1coOCwlcjE1KSxfX0xDX1NWQ19PTERfUFNXCi0JbXZjCVNQX0lMQyg0LCVyMTUpLF9fTENfU1ZDX0lMQwogCW12YwkwKDQsJXIxMiksX19MQ19USFJFQURfSU5GTworCWwJJXIxMixfX0xDX1RIUkVBRF9JTkZPCisJbXZjCVNQX1BTVyg4LCVyMTUpLF9fTENfU1ZDX09MRF9QU1cKKwltdmMJU1BfU1ZDX0NPREUoNCwlcjE1KSxfX0xDX1NWQ19JTEMKKwlvaQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9TWVNDQUxMCiBjbGVhbnVwX3Z0aW1lOgogCWNsYwlfX0xDX1JFVFVSTl9QU1crNCg0KSxCQVNFRChjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24rMTIpCiAJYmhlCUJBU0VEKGNsZWFudXBfc3RpbWUpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LmggYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LmgKaW5kZXggNjY3MjllYi4uZWY4ZmIxZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5oCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuaApAQCAtNSwyNCArNSwzMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAorCitleHRlcm4gdm9pZCAoKnBnbV9jaGVja190YWJsZVsxMjhdKShzdHJ1Y3QgcHRfcmVncyAqLCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkICpyZXN0YXJ0X3N0YWNrOworCithc21saW5rYWdlIGxvbmcgZG9fc3lzY2FsbF90cmFjZV9lbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Cithc21saW5rYWdlIHZvaWQgZG9fc3lzY2FsbF90cmFjZV9leGl0KHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKwogdm9pZCBkb19wcm90ZWN0aW9uX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIHZvaWQgZG9fZGF0X2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIHZvaWQgZG9fYXNjZV9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKiwgbG9uZywgdW5zaWduZWQgbG9uZyk7CiAKLWV4dGVybiBpbnQgc3lzY3RsX3VzZXJwcm9jZXNzX2RlYnVnOwotCiB2b2lkIGRvX3Blcl90cmFwKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHZvaWQgc3lzY2FsbF90cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVudHJ5ZXhpdCk7CiB2b2lkIGtlcm5lbF9zdGFja19vdmVyZmxvdyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOwogdm9pZCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogaW50IGhhbmRsZV9zaWduYWwzMih1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKIAkJICAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwordm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogdm9pZCBkb19leHRpbnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgZG9fcmVzdGFydCh2b2lkKTsKIGludCBfX2NwdWluaXQgc3RhcnRfc2Vjb25kYXJ5KHZvaWQgKmNwdXZvaWQpOwogdm9pZCBfX2luaXQgc3RhcnR1cF9pbml0KHZvaWQpOwogdm9pZCBkaWUoY29uc3QgY2hhciAqIHN0ciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycik7CiAKK3ZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKTsKKwogc3RydWN0IHMzOTBfbW1hcF9hcmdfc3RydWN0Owogc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzOwogc3RydWN0IG9sZF9zaWdhY3Rpb247CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCmluZGV4IDcxM2RhMDcuLjgzYTkzNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCkBAIC00MywxOSArNDMsMTggQEAKIFNQX1IxNAkgICAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyAxMTIKIFNQX1IxNQkgICAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyAxMjAKIFNQX09SSUdfUjIgICA9CVNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9PUklHX0dQUjIKLVNQX0lMQwkgICAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0lMQwotU1BfU1ZDTlIgICAgICA9CVNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TVkNOUgorU1BfU1ZDX0NPREUgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX1NWQ19DT0RFCiBTUF9TSVpFICAgICAgPQlTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU0laRQogCiBTVEFDS19TSElGVCA9IFBBR0VfU0hJRlQgKyBUSFJFQURfT1JERVIKIFNUQUNLX1NJWkUgID0gMSA8PCBTVEFDS19TSElGVAogCiBfVElGX1dPUktfU1ZDID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAotCQkgX1RJRl9NQ0NLX1BFTkRJTkcgfCBfVElGX1JFU1RBUlRfU1ZDIHwgX1RJRl9QRVJfVFJBUCApCisJCSBfVElGX01DQ0tfUEVORElORyB8IF9USUZfUEVSX1RSQVAgKQogX1RJRl9XT1JLX0lOVCA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX05FRURfUkVTQ0hFRCB8IFwKIAkJIF9USUZfTUNDS19QRU5ESU5HKQotX1RJRl9TWVNDQUxMID0gKF9USUZfU1lTQ0FMTF9UUkFDRT4+OCB8IF9USUZfU1lTQ0FMTF9BVURJVD4+OCB8IFwKLQkJX1RJRl9TRUNDT01QPj44IHwgX1RJRl9TWVNDQUxMX1RSQUNFUE9JTlQ+PjgpCitfVElGX1RSQUNFICAgID0gKF9USUZfU1lTQ0FMTF9UUkFDRSB8IF9USUZfU1lTQ0FMTF9BVURJVCB8IF9USUZfU0VDQ09NUCB8IFwKKwkJIF9USUZfU1lTQ0FMTF9UUkFDRVBPSU5UKQogX1RJRl9FWElUX1NJRSA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05FRURfUkVTQ0hFRCB8IF9USUZfTUNDS19QRU5ESU5HKQogCiAjZGVmaW5lIEJBU0VEKG5hbWUpIG5hbWUtc3lzdGVtX2NhbGwoJXIxMykKQEAgLTI0OSw5ICsyNDgsMTAgQEAKIHN5c2Nfc2F2ZWFsbDoKIAlTQVZFX0FMTF9TVkMgX19MQ19TVkNfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQQogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NBVkVfQVJFQQotCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19TVkNfT0xEX1BTVwotCW12YwlTUF9JTEMoNCwlcjE1KSxfX0xDX1NWQ19JTEMKIAlsZwklcjEyLF9fTENfVEhSRUFEX0lORk8JIyBsb2FkIHBvaW50ZXIgdG8gdGhyZWFkX2luZm8gc3RydWN0CisJbXZjCVNQX1BTVygxNiwlcjE1KSxfX0xDX1NWQ19PTERfUFNXCisJbXZjCVNQX1NWQ19DT0RFKDQsJXIxNSksX19MQ19TVkNfSUxDCisJb2kJX19USV9mbGFncys3KCVyMTIpLF9USUZfU1lTQ0FMTAogc3lzY192dGltZToKIAlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKIHN5c2Nfc3RpbWU6CkBAIC0yNjAsMTQgKzI2MCwxNCBAQAogCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgogCUxBU1RfQlJFQUsKIHN5c2NfZG9fc3ZjOgotCWxsZ2gJJXI3LFNQX1NWQ05SKCVyMTUpCisJbGxnaAklcjcsU1BfU1ZDX0NPREUrMiglcjE1KQogCXNsYWcJJXI3LCVyNywyCSMgc2hpZnQgYW5kIHRlc3QgZm9yIHN2YyAwCiAJam56CXN5c2NfbnJfb2sKIAkjIHN2YyAwOiBzeXN0ZW0gY2FsbCBudW1iZXIgaW4gJXIxCiAJbGxnZnIJJXIxLCVyMQkJIyBjbGVhciBoaWdoIHdvcmQgaW4gcjEKIAljZ2hpCSVyMSxOUl9zeXNjYWxscwogCWpubAlzeXNjX25yX29rCi0Jc3RoCSVyMSxTUF9TVkNOUiglcjE1KQorCXN0aAklcjEsU1BfU1ZDX0NPREUrMiglcjE1KQogCXNsYWcJJXI3LCVyMSwyCSMgc2hpZnQgYW5kIHRlc3QgZm9yIHN2YyAwCiBzeXNjX25yX29rOgogCWxhcmwJJXIxMCxzeXNfY2FsbF90YWJsZQpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJbGFybAklcjEwLHN5c19jYWxsX3RhYmxlX2VtdSAgIyB1c2UgMzEgYml0IGVtdWxhdGlvbiBzeXN0ZW0gY2FsbHMKIHN5c2Nfbm9lbXU6CiAjZW5kaWYKLQl0bQlfX1RJX2ZsYWdzKzYoJXIxMiksX1RJRl9TWVNDQUxMCisJdG0JX19USV9mbGFncys2KCVyMTIpLF9USUZfVFJBQ0UgPj4gOAogCW12YwlTUF9BUkdTKDgsJXIxNSksU1BfUjcoJXIxNSkKIAlsZ2YJJXI4LDAoJXI3LCVyMTApICMgbG9hZCBhZGRyZXNzIG9mIHN5c3RlbSBjYWxsIHJvdXRpbmUKIAlqbnoJc3lzY190cmFjZXN5cwpAQCAtMjg3LDIzICsyODcsMTkgQEAKIHN5c2NfcmV0dXJuOgogCUxPQ0tERVBfU1lTX0VYSVQKIHN5c2NfdGlmOgorCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyByZXR1cm5pbmcgdG8gdXNlciA/CisJam5vCXN5c2NfcmVzdG9yZQogCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX1dPUktfU1ZDCiAJam56CXN5c2Nfd29yawkjIHRoZXJlIGlzIHdvcmsgdG8gZG8gKHNpZ25hbHMgZXRjLikKKwluaQlfX1RJX2ZsYWdzKzcoJXIxMiksMjU1LV9USUZfU1lTQ0FMTAogc3lzY19yZXN0b3JlOgogCVJFU1RPUkVfQUxMIF9fTENfUkVUVVJOX1BTVywxCiBzeXNjX2RvbmU6CiAKICMKLSMgVGhlcmUgaXMgd29yayB0byBkbywgYnV0IGZpcnN0IHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgcmV0dXJuIHRvIHVzZXJzcGFjZS4KLSMKLXN5c2Nfd29yazoKLQl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgcmV0dXJuaW5nIHRvIHVzZXIgPwotCWpubwlzeXNjX3Jlc3RvcmUKLQotIwogIyBPbmUgb2YgdGhlIHdvcmsgYml0cyBpcyBvbi4gRmluZCBvdXQgd2hpY2ggb25lLgogIwotc3lzY193b3JrX3RpZjoKK3N5c2Nfd29yazoKIAl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9NQ0NLX1BFTkRJTkcKIAlqbwlzeXNjX21jY2tfcGVuZGluZwogCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX05FRURfUkVTQ0hFRApAQCAtMzEyLDggKzMwOCw2IEBACiAJam8Jc3lzY19zaWdwZW5kaW5nCiAJdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfTk9USUZZX1JFU1VNRQogCWpvCXN5c2Nfbm90aWZ5X3Jlc3VtZQotCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX1JFU1RBUlRfU1ZDCi0Jam8Jc3lzY19yZXN0YXJ0CiAJdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfUEVSX1RSQVAKIAlqbwlzeXNjX3NpbmdsZXN0ZXAKIAlqCXN5c2NfcmV0dXJuCQkjIGJld2FyZSBvZiBjcml0aWNhbCBzZWN0aW9uIGNsZWFudXAKQEAgLTMzOSwxMSArMzMzLDE1IEBACiAJbmkJX19USV9mbGFncys3KCVyMTIpLDI1NS1fVElGX1BFUl9UUkFQICMgY2xlYXIgVElGX1BFUl9UUkFQCiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwogCWJyYXNsCSVyMTQsZG9fc2lnbmFsCQkjIGNhbGwgZG9fc2lnbmFsCi0JdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfUkVTVEFSVF9TVkMKLQlqbwlzeXNjX3Jlc3RhcnQKLQl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9QRVJfVFJBUAotCWpvCXN5c2Nfc2luZ2xlc3RlcAotCWoJc3lzY19yZXR1cm4KKwl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9TWVNDQUxMCisJam5vCXN5c2NfcmV0dXJuCisJbG1nCSVyMiwlcjYsU1BfUjIoJXIxNSkJIyBsb2FkIHN2YyBhcmd1bWVudHMKKwlsZ2hpCSVyNywwCQkJIyBzdmMgMCByZXR1cm5zIC1FTk9TWVMKKwlsaAklcjEsU1BfU1ZDX0NPREUrMiglcjE1KQkjIGxvYWQgbmV3IHN2YyBudW1iZXIKKwljZ2hpCSVyMSxOUl9zeXNjYWxscworCWpubAlzeXNjX25yX29rCQkjIGludmFsaWQgc3ZjIG51bWJlciAtPiBkbyBzdmMgMAorCXNsYWcJJXI3LCVyMSwyCisJaglzeXNjX25yX29rCQkjIHJlc3RhcnQgc3ZjCiAKICMKICMgX1RJRl9OT1RJRllfUkVTVU1FIGlzIHNldCwgY2FsbCBkb19ub3RpZnlfcmVzdW1lCkBAIC0zNTQsMjMgKzM1MiwxMCBAQAogCWpnCWRvX25vdGlmeV9yZXN1bWUJIyBjYWxsIGRvX25vdGlmeV9yZXN1bWUKIAogIwotIyBfVElGX1JFU1RBUlRfU1ZDIGlzIHNldCwgc2V0IHVwIHJlZ2lzdGVycyBhbmQgcmVzdGFydCBzdmMKLSMKLXN5c2NfcmVzdGFydDoKLQluaQlfX1RJX2ZsYWdzKzcoJXIxMiksMjU1LV9USUZfUkVTVEFSVF9TVkMgIyBjbGVhciBUSUZfUkVTVEFSVF9TVkMKLQlsZwklcjcsU1BfUjIoJXIxNSkJCSMgbG9hZCBuZXcgc3ZjIG51bWJlcgotCW12YwlTUF9SMig4LCVyMTUpLFNQX09SSUdfUjIoJXIxNSkgIyByZXN0b3JlIGZpcnN0IGFyZ3VtZW50Ci0JbG1nCSVyMiwlcjYsU1BfUjIoJXIxNSkJIyBsb2FkIHN2YyBhcmd1bWVudHMKLQlzdGgJJXI3LFNQX1NWQ05SKCVyMTUpCi0Jc2xhZwklcjcsJXI3LDIKLQlqCXN5c2NfbnJfb2sJCSMgcmVzdGFydCBzdmMKLQotIwogIyBfVElGX1BFUl9UUkFQIGlzIHNldCwgY2FsbCBkb19wZXJfdHJhcAogIwogc3lzY19zaW5nbGVzdGVwOgotCW5pCV9fVElfZmxhZ3MrNyglcjEyKSwyNTUtX1RJRl9QRVJfVFJBUAkjIGNsZWFyIFRJRl9QRVJfVFJBUAotCXhjCVNQX1NWQ05SKDIsJXIxNSksU1BfU1ZDTlIoJXIxNSkJCSMgY2xlYXIgc3ZjIG51bWJlcgorCW5pCV9fVElfZmxhZ3MrNyglcjEyKSwyNTUtKF9USUZfU1lTQ0FMTCB8IF9USUZfUEVSX1RSQVApCiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGFkZHJlc3Mgb2YgcmVnaXN0ZXItc2F2ZSBhcmVhCiAJbGFybAklcjE0LHN5c2NfcmV0dXJuCSMgbG9hZCBhZHIuIG9mIHN5c3RlbSByZXR1cm4KIAlqZwlkb19wZXJfdHJhcApAQCAtMzgyLDcgKzM2Nyw3IEBACiBzeXNjX3RyYWNlc3lzOgogCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKIAlsYQklcjMsMAotCWxsZ2gJJXIwLFNQX1NWQ05SKCVyMTUpCisJbGxnaAklcjAsU1BfU1ZDX0NPREUrMiglcjE1KQogCXN0ZwklcjAsU1BfUjIoJXIxNSkKIAlicmFzbAklcjE0LGRvX3N5c2NhbGxfdHJhY2VfZW50ZXIKIAlsZ2hpCSVyMCxOUl9zeXNjYWxscwpAQCAtMzk3LDcgKzM4Miw3IEBACiAJYmFzcgklcjE0LCVyOAkJIyBjYWxsIHN5c194eHgKIAlzdGcJJXIyLFNQX1IyKCVyMTUpCQkjIHN0b3JlIHJldHVybiB2YWx1ZQogc3lzY190cmFjZW5vZ286Ci0JdG0JX19USV9mbGFncys2KCVyMTIpLF9USUZfU1lTQ0FMTAorCXRtCV9fVElfZmxhZ3MrNiglcjEyKSxfVElGX1RSQUNFID4+IDgKIAlqeglzeXNjX3JldHVybgogCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKIAlsYXJsCSVyMTQsc3lzY19yZXR1cm4JIyByZXR1cm4gcG9pbnQgaXMgc3lzY19yZXR1cm4KQEAgLTQ3MCw3ICs0NTUsNiBAQAogCWpueglwZ21fcGVyIAkJICMgZ290IHBlciBleGNlcHRpb24gLT4gc3BlY2lhbCBjYXNlCiAJU0FWRV9BTExfUEdNIF9fTENfUEdNX09MRF9QU1csX19MQ19TQVZFX0FSRUEKIAlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19TQVZFX0FSRUEKLQl4YwlTUF9JTEMoNCwlcjE1KSxTUF9JTEMoJXIxNSkKIAltdmMJU1BfUFNXKDE2LCVyMTUpLF9fTENfUEdNX09MRF9QU1cKIAlsZwklcjEyLF9fTENfVEhSRUFEX0lORk8JIyBsb2FkIHBvaW50ZXIgdG8gdGhyZWFkX2luZm8gc3RydWN0CiAJSEFORExFX1NJRV9JTlRFUkNFUFQKQEAgLTU1MCw5ICs1MzQsMTAgQEAKIHBnbV9zdmNwZXI6CiAJU0FWRV9BTExfUEdNIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEKIAlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19TQVZFX0FSRUEKLQltdmMJU1BfUFNXKDE2LCVyMTUpLF9fTENfU1ZDX09MRF9QU1cKLQltdmMJU1BfSUxDKDQsJXIxNSksX19MQ19TVkNfSUxDCiAJbGcJJXIxMixfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19TVkNfT0xEX1BTVworCW12YwlTUF9TVkNfQ09ERSg0LCVyMTUpLF9fTENfU1ZDX0lMQworCW9pCV9fVElfZmxhZ3MrNyglcjEyKSwoX1RJRl9TWVNDQUxMIHwgX1RJRl9QRVJfVFJBUCkKIAlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKIAlVUERBVEVfVlRJTUUgX19MQ19MQVNUX1VQREFURV9USU1FUixfX0xDX0VYSVRfVElNRVIsX19MQ19TWVNURU1fVElNRVIKIAltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX1NZTkNfRU5URVJfVElNRVIKQEAgLTU2MSw3ICs1NDYsNiBAQAogCW12YwlfX1RIUkVBRF9wZXJfY2F1c2UoMiwlcjgpLF9fTENfUEVSX0NBVVNFCiAJbXZjCV9fVEhSRUFEX3Blcl9hZGRyZXNzKDgsJXI4KSxfX0xDX1BFUl9BRERSRVNTCiAJbXZjCV9fVEhSRUFEX3Blcl9wYWlkKDEsJXI4KSxfX0xDX1BFUl9QQUlECi0Jb2kJX19USV9mbGFncys3KCVyMTIpLF9USUZfUEVSX1RSQVAgIyBzZXQgVElGX1BFUl9UUkFQCiAJc3Rvc20JX19TRl9FTVBUWSglcjE1KSwweDAzCSMgcmVlbmFibGUgaW50ZXJydXB0cwogCWxtZwklcjIsJXI2LFNQX1IyKCVyMTUpCSMgbG9hZCBzdmMgYXJndW1lbnRzCiAJaglzeXNjX2RvX3N2YwpAQCAtNTcxLDcgKzU1NSw2IEBACiAjCiBrZXJuZWxfcGVyOgogCVJFRU5BQkxFX0lSUVMKLQl4YwlTUF9TVkNOUigyLCVyMTUpLFNQX1NWQ05SKCVyMTUpCSMgY2xlYXIgc3ZjIG51bWJlcgogCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBhZGRyZXNzIG9mIHJlZ2lzdGVyLXNhdmUgYXJlYQogCWJyYXNsCSVyMTQsZG9fcGVyX3RyYXAKIAlqCXBnbV9leGl0CkBAIC04NjksMTIgKzg1MiwxMiBAQAogIyBQU1cgcmVzdGFydCBpbnRlcnJ1cHQgaGFuZGxlcgogIwogRU5UUlkocHN3X3Jlc3RhcnRfaW50X2hhbmRsZXIpCi0Jc3RnCSVyMTUsX19MQ19TQVZFX0FSRUFfNjQoJXIwKQkjIHNhdmUgcjE1CisJc3RnCSVyMTUsX19MQ19TQVZFX0FSRUErMTIwKCVyMCkJIyBzYXZlIHIxNQogCWxhcmwJJXIxNSxyZXN0YXJ0X3N0YWNrCQkjIGxvYWQgcmVzdGFydCBzdGFjawogCWxnCSVyMTUsMCglcjE1KQogCWFnaGkJJXIxNSwtU1BfU0laRQkJCSMgbWFrZSByb29tIGZvciBwdF9yZWdzCiAJc3RtZwklcjAsJXIxNCxTUF9SMCglcjE1KQkJIyBzdG9yZSBncHJzICVyMC0lcjE0IHRvIHN0YWNrCi0JbXZjCVNQX1IxNSg4LCVyMTUpLF9fTENfU0FWRV9BUkVBXzY0KCVyMCkjIHN0b3JlIHNhdmVkICVyMTUgdG8gc3RhY2sKKwltdmMJU1BfUjE1KDgsJXIxNSksX19MQ19TQVZFX0FSRUErMTIwKCVyMCkjIHN0b3JlIHNhdmVkICVyMTUgdG8gc3RhY2sKIAltdmMJU1BfUFNXKDE2LCVyMTUpLF9fTENfUlNUX09MRF9QU1coJXIwKSMgc3RvcmUgcmVzdGFydCBvbGQgcHN3CiAJeGMJX19TRl9CQUNLQ0hBSU4oOCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KSAjIHNldCBiYWNrY2hhaW4gdG8gMAogCWJyYXNsCSVyMTQsZG9fcmVzdGFydApAQCAtOTcyLDkgKzk1NSwxMSBAQAogCXN0ZwklcjE1LDMyKCVyMTIpCiAJc3RnCSVyMTEsMCglcjEyKQogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NBVkVfQVJFQQotCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19TVkNfT0xEX1BTVwotCW12YwlTUF9JTEMoNCwlcjE1KSxfX0xDX1NWQ19JTEMKIAltdmMJOCg4LCVyMTIpLF9fTENfVEhSRUFEX0lORk8KKwlsZwklcjEyLF9fTENfVEhSRUFEX0lORk8KKwltdmMJU1BfUFNXKDE2LCVyMTUpLF9fTENfU1ZDX09MRF9QU1cKKwltdmMJU1BfU1ZDX0NPREUoNCwlcjE1KSxfX0xDX1NWQ19JTEMKKwlvaQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9TWVNDQUxMCiBjbGVhbnVwX3Z0aW1lOgogCWNsYwlfX0xDX1JFVFVSTl9QU1crOCg4KSxCQVNFRChjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24rMjQpCiAJamhlCWNsZWFudXBfc3RpbWUKQEAgLTEwOTYsNiArMTA4MSw3IEBACiAJbGdoaQklcjIsMAogCWJyCSVyMTQKIHNpZV9mYXVsdDoKKwlsY3RsZwklYzEsJWMxLF9fTENfVVNFUl9BU0NFCQkjIGxvYWQgcHJpbWFyeSBhc2NlCiAJbGcJJXIxNCxfX0xDX1RIUkVBRF9JTkZPCQkjIHBvaW50ZXIgdGhyZWFkX2luZm8gc3RydWN0CiAJbmkJX19USV9mbGFncys2KCVyMTQpLDI1NS0oX1RJRl9TSUU+PjgpCiAJbGcJJXIxNCxfX1NGX0VNUFRZKzgoJXIxNSkJCSMgbG9hZCBndWVzdCByZWdpc3RlciBzYXZlIGFyZWEKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKaW5kZXggMmQ3ODFiYS4uOTAwMDY4ZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMKQEAgLTQ0OSwxMCArNDQ5LDI4IEBACiAjCiAJLm9yZwkweDEwMDAwCiBFTlRSWShzdGFydHVwKQorCWoJLkxlcF9zdGFydHVwX25vcm1hbAorCS5vcmcJMHgxMDAwOAorIworIyBUaGlzIGlzIGEgbGlzdCBvZiBzMzkwIGtlcm5lbCBlbnRyeSBwb2ludHMuIEF0IGFkZHJlc3MgMHgxMDAwZiB0aGUgbnVtYmVyIG9mCisjIHZhbGlkIGVudHJ5IHBvaW50cyBpcyBzdG9yZWQuCisjCisjIElNUE9SVEFOVDogRG8gbm90IGNoYW5nZSB0aGlzIHRhYmxlLCBpdCBpcyBzMzkwIGtlcm5lbCBBQkkhCisjCisJLmFzY2lpCSJTMzkwRVAiCisJLmJ5dGUJMHgwMCwweDAxCisjCisjIGtkdW1wIHN0YXJ0dXAtY29kZSBhdCAweDEwMDEwLCBydW5uaW5nIGluIDY0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzaW5nIG1vZGUKKyMKKwkub3JnCTB4MTAwMTAKK0VOVFJZKHN0YXJ0dXBfa2R1bXApCisJagkuTGVwX3N0YXJ0dXBfa2R1bXAKKy5MZXBfc3RhcnR1cF9ub3JtYWw6CiAJYmFzcgklcjEzLDAJCQkjIGdldCBiYXNlCiAuTFBHMDoKIAl4YwkweDIwMCgyNTYpLDB4MjAwCSMgcGFydGlhbGx5IGNsZWFyIGxvd2NvcmUKIAl4YwkweDMwMCgyNTYpLDB4MzAwCisJeGMJMHhlMDAoMjU2KSwweGUwMAogCXN0Y2sJX19MQ19MQVNUX1VQREFURV9DTE9DSwogCXNwdAk1Zi0uTFBHMCglcjEzKQogCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLDVmLS5MUEcwKCVyMTMpCkBAIC01MzQsNiArNTUyLDggQEAKIAkuYWxpZ24JOAogNToJLmxvbmcJMHg3ZmZmZmZmZiwweGZmZmZmZmZmCiAKKyNpbmNsdWRlICJoZWFkX2tkdW1wLlMiCisKICMKICMgcGFyYW1zIGF0IDEwNDAwIChzZXR1cC5oKQogIwpAQCAtNTQxLDYgKzU2MSw4IEBACiAJLmxvbmcJMCwwCQkJIyBJUExfREVWSUNFCiAJLmxvbmcJMCwwCQkJIyBJTklUUkRfU1RBUlQKIAkubG9uZwkwLDAJCQkjIElOSVRSRF9TSVpFCisJLmxvbmcJMCwwCQkJIyBPTERNRU1fQkFTRQorCS5sb25nCTAsMAkJCSMgT0xETUVNX1NJWkUKIAogCS5vcmcJQ09NTUFORF9MSU5FCiAJLmJ5dGUJInJvb3Q9L2Rldi9yYW0wIHJvIgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkMzEuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDMxLlMKaW5kZXggZjIxOTU0Yi4uZDNmMWFiNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkMzEuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQzMS5TCkBAIC05Miw3ICs5Miw3IEBACiAuTFBHMzoKICMgY2hlY2sgY29udHJvbCByZWdpc3RlcnMKIAlzdGN0bAklYzAsJWMxNSwwKCVyMTUpCi0Jb2kJMiglcjE1KSwweDQwCQkjIGVuYWJsZSBzaWdwIGVtZXJnZW5jeSBzaWduYWwKKwlvaQkyKCVyMTUpLDB4NjAJCSMgZW5hYmxlIHNpZ3AgZW1lcmdlbmN5ICYgZXh0ZXJuYWwgY2FsbAogCW9pCTAoJXIxNSksMHgxMAkJIyBzd2l0Y2ggb24gbG93IGFkZHJlc3MgcHJvdGVjdGlvbgogCWxjdGwJJWMwLCVjMTUsMCglcjE1KQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUwppbmRleCBhZTVkNDkyLi45OTM0OGMwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKQEAgLTkwLDcgKzkwLDcgQEAKIC5MUEczOgogIyBjaGVjayBjb250cm9sIHJlZ2lzdGVycwogCXN0Y3RnCSVjMCwlYzE1LDAoJXIxNSkKLQlvaQk2KCVyMTUpLDB4NDAJCSMgZW5hYmxlIHNpZ3AgZW1lcmdlbmN5IHNpZ25hbAorCW9pCTYoJXIxNSksMHg2MAkJIyBlbmFibGUgc2lncCBlbWVyZ2VuY3kgJiBleHRlcm5hbCBjYWxsCiAJb2kJNCglcjE1KSwweDEwCQkjIHN3aXRjaCBvbiBsb3cgYWRkcmVzcyBwcm9jdGVjdGlvbgogCWxjdGxnCSVjMCwlYzE1LDAoJXIxNSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkX2tkdW1wLlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWRfa2R1bXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFjMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkX2tkdW1wLlMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBTMzkwIGtkdW1wIGxvd2xldmVsIGZ1bmN0aW9ucyAobmV3IGtlcm5lbCkKKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMTEKKyAqIEF1dGhvcihzKTogTWljaGFlbCBIb2x6aGV1IDxob2x6aGV1QGxpbnV4LnZuZXQuaWJtLmNvbT4KKyAqLworCisjZGVmaW5lIERBVEFNT1ZFUl9BRERSCTB4NDAwMAorI2RlZmluZSBDT1BZX1BBR0VfQUREUgkweDYwMDAKKworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisKKyMKKyMga2R1bXAgZW50cnkgKG5ldyBrZXJuZWwgLSBub3QgeWV0IHJlbG9jYXRlZCkKKyMKKyMgTm90ZTogVGhpcyBjb2RlIGhhcyB0byBiZSBwb3NpdGlvbiBpbmRlcGVuZGVudAorIworCisuYWxpZ24gMgorLkxlcF9zdGFydHVwX2tkdW1wOgorCWxoaQklcjEsMgkJCQkjIG1vZGUgMiA9IGVzYW1lIChkdW1wKQorCXNpZ3AJJXIxLCVyMCwweDEyCQkJIyBTd2l0Y2ggdG8gZXNhbWUgbW9kZQorCXNhbTY0CQkJCQkjIFN3aXRjaCB0byA2NCBiaXQgYWRkcmVzc2luZworCWJhc3IJJXIxMywwCisuTGJhc2U6CisJbGFybAklcjIsLkxiYXNlX2FkZHIJCQkjIENoZWNrLCBpZiB3ZSBoYXZlIGJlZW4KKwlsZwklcjIsMCglcjIpCQkJIyBhbHJlYWR5IHJlbG9jYXRlZDoKKwljbGdyCSVyMiwlcjEzCQkJIworCWpuZQkuTHJlbG9jYXRlCQkJIyBObyA6IFN0YXJ0IGRhdGEgbW92ZXIKKwlsZ2hpCSVyMiwwCQkJCSMgWWVzOiBTdGFydCBrZHVtcCBrZXJuZWwKKwlicmFzbAklcjE0LHN0YXJ0dXBfa2R1bXBfcmVsb2NhdGVkCisKKy5McmVsb2NhdGU6CisJbGFybAklcjQsc3RhcnR1cAorCWxnCSVyMiwweDQxOCglcjQpCQkJIyBHZXQga2R1bXAgYmFzZQorCWxnCSVyMywweDQyMCglcjQpCQkJIyBHZXQga2R1bXAgc2l6ZQorCisJbGFybAklcjEwLC5MY29weV9zdGFydAkJIyBTb3VyY2Ugb2YgZGF0YSBtb3ZlcgorCWxnaGkJJXI4LERBVEFNT1ZFUl9BRERSCQkjIFRhcmdldCBvZiBkYXRhIG1vdmVyCisJbXZjCTAoMjU2LCVyOCksMCglcjEwKQkJIyBDb3B5IGRhdGEgbW92ZXIgY29kZQorCisJYWdyCSVyOCwlcjIJCQkJIyBDb3B5IGRhdGEgbW92ZXIgdG8KKwltdmMJMCgyNTYsJXI4KSwwKCVyMTApCQkjIHJlc2VydmVkIG1lbQorCisJbGdoaQklcjE0LERBVEFNT1ZFUl9BRERSCQkjIEp1bXAgdG8gY29waWVkIGRhdGEgbW92ZXIKKwliYXNyCSVyMTQsJXIxNAorLkxiYXNlX2FkZHI6CisJLnF1YWQJLkxiYXNlCisKKyMKKyMga2R1bXAgZGF0YSBtb3ZlciBjb2RlIChydW5zIGF0IGFkZHJlc3MgREFUQU1PVkVSX0FERFIpCisjCisjIHIyOiBrZHVtcCBiYXNlIGFkZHJlc3MKKyMgcjM6IGtkdW1wIHNpemUKKyMKKy5MY29weV9zdGFydDoKKwliYXNyCSVyMTMsMAkJCQkjIEJhc2UKKzA6CisJbGdyCSVyMTEsJXIyCQkJIyBTYXZlIGtkdW1wIGJhc2UgYWRkcmVzcworCWxncgklcjEyLCVyMgorCWFncgklcjEyLCVyMwkJCSMgQ29tcHV0ZSBrZHVtcCBlbmQgYWRkcmVzcworCisJbGdoaQklcjUsMAorCWxnaGkJJXIxMCxDT1BZX1BBR0VfQUREUgkJIyBMb2FkIGNvcHkgcGFnZSBhZGRyZXNzCisxOgorCW12YwkwKDI1NiwlcjEwKSwwKCVyNSkJCSMgQ29weSBvbGQga2VybmVsIHRvIHRtcAorCW12YwkwKDI1NiwlcjUpLDAoJXIxMSkJCSMgQ29weSBuZXcga2VybmVsIHRvIG9sZAorCW12YwkwKDI1NiwlcjExKSwwKCVyMTApCQkjIENvcHkgdG1wIHRvIG5ldworCWFnaGkJJXIxMSwyNTYKKwlhZ2hpCSVyNSwyNTYKKwljbGdyCSVyMTEsJXIxMgorCWpsCTFiCisKKwlsZwklcjE0LC5Mc3RhcnR1cF9rZHVtcC0wYiglcjEzKQorCWJhc3IJJXIxNCwlcjE0CQkJIyBTdGFydCByZWxvY2F0ZWQga2VybmVsCisuTHN0YXJ0dXBfa2R1bXA6CisJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwICsgc3RhcnR1cF9rZHVtcF9yZWxvY2F0ZWQKKy5MY29weV9lbmQ6CisKKyMKKyMgU3RhcnR1cCBvZiBrZHVtcCAocmVsb2NhdGVkIG5ldyBrZXJuZWwpCisjCisuYWxpZ24gMgorc3RhcnR1cF9rZHVtcF9yZWxvY2F0ZWQ6CisJYmFzcgklcjEzLDAKKzA6CisJbXZjCTAoOCwlcjApLC5McmVzdGFydF9wc3ctMGIoJXIxMykJIyBTZXR1cCByZXN0YXJ0IFBTVworCW12Ywk0NjQoMTYsJXIwKSwuTHBnbV9wc3ctMGIoJXIxMykJIyBTZXR1cCBwZ20gY2hlY2sgUFNXCisJbGhpCSVyMSwxCQkJCSMgU3RhcnQgbmV3IGtlcm5lbAorCWRpYWcJJXIxLCVyMSwweDMwOAkJCSMgd2l0aCBkaWFnIDMwOAorCisuTG5vX2RpYWczMDg6CQkJCQkjIE5vIGRpYWcgMzA4CisJc2FtMzEJCQkJCSMgU3dpdGNoIHRvIDMxIGJpdCBhZGRyIG1vZGUKKwlzcgklcjEsJXIxCQkJCSMgRXJhc2UgcmVnaXN0ZXIgcjEKKwlzcgklcjIsJXIyCQkJCSMgRXJhc2UgcmVnaXN0ZXIgcjIKKwlzaWdwCSVyMSwlcjIsMHgxMgkJCSMgU3dpdGNoIHRvIDMxIGJpdCBhcmNoIG1vZGUKKwlscHN3CTAJCQkJIyBTdGFydCBuZXcga2VybmVsLi4uCisuYWxpZ24JOAorLkxyZXN0YXJ0X3BzdzoKKwkubG9uZwkweDAwMDgwMDAwLDB4ODAwMDAwMDAgKyBzdGFydHVwCisuTHBnbV9wc3c6CisJLnF1YWQJMHgwMDAwMDAwMTgwMDAwMDAwLDB4MDAwMDAwMDAwMDAwMDAwMCArIC5Mbm9fZGlhZzMwOAorI2Vsc2UKKy5hbGlnbiAyCisuTGVwX3N0YXJ0dXBfa2R1bXA6CisjaWZkZWYgQ09ORklHXzY0QklUCisJbGFybAklcjEzLHN0YXJ0dXBfa2R1bXBfY3Jhc2gKKwlscHN3ZQkwKCVyMTMpCisuYWxpZ24gOAorc3RhcnR1cF9rZHVtcF9jcmFzaDoKKwkucXVhZAkweDAwMDIwMDAwODAwMDAwMDAsMHgwMDAwMDAwMDAwMDAwMDAwICsgc3RhcnR1cF9rZHVtcF9jcmFzaAorI2Vsc2UKKwliYXNyCSVyMTMsMAorMDoJbHBzdwlzdGFydHVwX2tkdW1wX2NyYXNoLTBiKCVyMTMpCisuYWxpZ24gOAorc3RhcnR1cF9rZHVtcF9jcmFzaDoKKwkubG9uZwkweDAwMGEwMDAwLDB4MDAwMDAwMDAgKyBzdGFydHVwX2tkdW1wX2NyYXNoCisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCisjZW5kaWYgLyogQ09ORklHX0NSQVNIX0RVTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMgYi9hcmNoL3MzOTAva2VybmVsL2lwbC5jCmluZGV4IDQ4YzcxMDIuLmFmZmE4ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CiAjaW5jbHVkZSA8YXNtL2lwbC5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTI2LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vc2NscC5oPgogI2luY2x1ZGUgPGFzbS9zaWdwLmg+CiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisjaW5jbHVkZSAiZW50cnkuaCIKIAogI2RlZmluZSBJUExfUEFSTV9CTE9DS19WRVJTSU9OIDAKIApAQCAtMjc1LDggKzI3Nyw4IEBACiBzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIHN5c19pcGxfdHlwZV9hdHRyID0gX19BVFRSX1JPKGlwbF90eXBlKTsKIAogLyogVk0gSVBMIFBBUk0gcm91dGluZXMgKi8KLXNpemVfdCByZWlwbF9nZXRfYXNjaWlfdm1wYXJtKGNoYXIgKmRlc3QsIHNpemVfdCBzaXplLAotCQkJCSAgIGNvbnN0IHN0cnVjdCBpcGxfcGFyYW1ldGVyX2Jsb2NrICppcGIpCitzdGF0aWMgc2l6ZV90IHJlaXBsX2dldF9hc2NpaV92bXBhcm0oY2hhciAqZGVzdCwgc2l6ZV90IHNpemUsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaXBsX3BhcmFtZXRlcl9ibG9jayAqaXBiKQogewogCWludCBpOwogCXNpemVfdCBsZW47CkBAIC0zMzgsOCArMzQwLDggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXNpemVfdCByZWlwbF9hcHBlbmRfYXNjaWlfc2NwZGF0YShjaGFyICpkZXN0LCBzaXplX3Qgc2l6ZSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBpcGxfcGFyYW1ldGVyX2Jsb2NrICppcGIpCitzdGF0aWMgc2l6ZV90IHJlaXBsX2FwcGVuZF9hc2NpaV9zY3BkYXRhKGNoYXIgKmRlc3QsIHNpemVfdCBzaXplLAorCQkJCQkgY29uc3Qgc3RydWN0IGlwbF9wYXJhbWV0ZXJfYmxvY2sgKmlwYikKIHsKIAlzaXplX3QgY291bnQ7CiAJc2l6ZV90IGk7CkBAIC0xNzM4LDcgKzE3NDAsMTEgQEAKIAogdm9pZCBkb19yZXN0YXJ0KHZvaWQpCiB7CisJc21wX3Jlc3RhcnRfd2l0aF9vbmxpbmVfY3B1KCk7CiAJc21wX3NlbmRfc3RvcCgpOworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJY3Jhc2hfa2V4ZWMoTlVMTCk7CisjZW5kaWYKIAlvbl9yZXN0YXJ0X3RyaWdnZXIuYWN0aW9uLT5mbigmb25fcmVzdGFydF90cmlnZ2VyKTsKIAlzdG9wX3J1bigmb25fcmVzdGFydF90cmlnZ2VyKTsKIH0KQEAgLTIwMDksNyArMjAxNSw3IEBACiAKIHUzMiBkdW1wX3ByZWZpeF9wYWdlOwogCi12b2lkIHMzOTBfcmVzZXRfc3lzdGVtKHZvaWQpCit2b2lkIHMzOTBfcmVzZXRfc3lzdGVtKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBfbG93Y29yZSAqbGM7CiAKQEAgLTIwMjgsMTUgKzIwMzQsMTkgQEAKIAlfX2N0bF9jbGVhcl9iaXQoMCwyOCk7CiAKIAkvKiBTZXQgbmV3IG1hY2hpbmUgY2hlY2sgaGFuZGxlciAqLwotCVMzOTBfbG93Y29yZS5tY2NrX25ld19wc3cubWFzayA9IHBzd19rZXJuZWxfYml0cyAmIH5QU1dfTUFTS19NQ0hFQ0s7CisJUzM5MF9sb3djb3JlLm1jY2tfbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfREFUOwogCVMzOTBfbG93Y29yZS5tY2NrX25ld19wc3cuYWRkciA9CiAJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHMzOTBfYmFzZV9tY2NrX2hhbmRsZXI7CiAKIAkvKiBTZXQgbmV3IHByb2dyYW0gY2hlY2sgaGFuZGxlciAqLwotCVMzOTBfbG93Y29yZS5wcm9ncmFtX25ld19wc3cubWFzayA9IHBzd19rZXJuZWxfYml0cyAmIH5QU1dfTUFTS19NQ0hFQ0s7CisJUzM5MF9sb3djb3JlLnByb2dyYW1fbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfREFUOwogCVMzOTBfbG93Y29yZS5wcm9ncmFtX25ld19wc3cuYWRkciA9CiAJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHMzOTBfYmFzZV9wZ21faGFuZGxlcjsKIAotCWRvX3Jlc2V0X2NhbGxzKCk7Ci19CisJLyogU3RvcmUgc3RhdHVzIGF0IGFic29sdXRlIHplcm8gKi8KKwlzdG9yZV9zdGF0dXMoKTsKIAorCWRvX3Jlc2V0X2NhbGxzKCk7CisJaWYgKGZ1bmMpCisJCWZ1bmMoZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2lycS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYwppbmRleCAxZjQwNTBkLi5iOWE3ZmRkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2lycS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMKQEAgLTMzLDcgKzMzLDggQEAKIAl7Lm5hbWUgPSAiRVhUIiB9LAogCXsubmFtZSA9ICJJL08iIH0sCiAJey5uYW1lID0gIkNMSyIsIC5kZXNjID0gIltFWFRdIENsb2NrIENvbXBhcmF0b3IiIH0sCi0Jey5uYW1lID0gIklQSSIsIC5kZXNjID0gIltFWFRdIFNpZ25hbCBQcm9jZXNzb3IiIH0sCisJey5uYW1lID0gIkVYQyIsIC5kZXNjID0gIltFWFRdIEV4dGVybmFsIENhbGwiIH0sCisJey5uYW1lID0gIkVNUyIsIC5kZXNjID0gIltFWFRdIEVtZXJnZW5jeSBTaWduYWwiIH0sCiAJey5uYW1lID0gIlRNUiIsIC5kZXNjID0gIltFWFRdIENQVSBUaW1lciIgfSwKIAl7Lm5hbWUgPSAiVEFMIiwgLmRlc2MgPSAiW0VYVF0gVGltaW5nIEFsZXJ0IiB9LAogCXsubmFtZSA9ICJQRkwiLCAuZGVzYyA9ICJbRVhUXSBQc2V1ZG8gUGFnZSBGYXVsdCIgfSwKQEAgLTQyLDggKzQzLDggQEAKIAl7Lm5hbWUgPSAiU0NQIiwgLmRlc2MgPSAiW0VYVF0gU2VydmljZSBDYWxsIiB9LAogCXsubmFtZSA9ICJJVUMiLCAuZGVzYyA9ICJbRVhUXSBJVUNWIiB9LAogCXsubmFtZSA9ICJDUE0iLCAuZGVzYyA9ICJbRVhUXSBDUFUgTWVhc3VyZW1lbnQiIH0sCisJey5uYW1lID0gIkNJTyIsIC5kZXNjID0gIltJL09dIENvbW1vbiBJL08gTGF5ZXIgSW50ZXJydXB0IiB9LAogCXsubmFtZSA9ICJRQUkiLCAuZGVzYyA9ICJbSS9PXSBRRElPIEFkYXB0ZXIgSW50ZXJydXB0IiB9LAotCXsubmFtZSA9ICJRREkiLCAuZGVzYyA9ICJbSS9PXSBRRElPIEludGVycnVwdCIgfSwKIAl7Lm5hbWUgPSAiREFTIiwgLmRlc2MgPSAiW0kvT10gREFTRCIgfSwKIAl7Lm5hbWUgPSAiQzE1IiwgLmRlc2MgPSAiW0kvT10gMzIxNSIgfSwKIAl7Lm5hbWUgPSAiQzcwIiwgLmRlc2MgPSAiW0kvT10gMzI3MCIgfSwKQEAgLTUzLDYgKzU0LDcgQEAKIAl7Lm5hbWUgPSAiQ0xXIiwgLmRlc2MgPSAiW0kvT10gQ0xBVyIgfSwKIAl7Lm5hbWUgPSAiQ1RDIiwgLmRlc2MgPSAiW0kvT10gQ1RDIiB9LAogCXsubmFtZSA9ICJBUEIiLCAuZGVzYyA9ICJbSS9PXSBBUCBCdXMiIH0sCisJey5uYW1lID0gIkNTQyIsIC5kZXNjID0gIltJL09dIENIU0MgU3ViY2hhbm5lbCIgfSwKIAl7Lm5hbWUgPSAiTk1JIiwgLmRlc2MgPSAiW05NSV0gTWFjaGluZSBDaGVjayIgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvanVtcF9sYWJlbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9qdW1wX2xhYmVsLmMKaW5kZXggNDRjYzA2Yi4uYjk4N2FiMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9qdW1wX2xhYmVsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9qdW1wX2xhYmVsLmMKQEAgLTE4LDI2ICsxOCwxNSBAQAogfSBfX3BhY2tlZDsKIAogc3RydWN0IGluc25fYXJncyB7Ci0JdW5zaWduZWQgbG9uZyAqdGFyZ2V0OwotCXN0cnVjdCBpbnNuICppbnNuOwotCXNzaXplX3Qgc2l6ZTsKKwlzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnk7CisJZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZTsKIH07CiAKLXN0YXRpYyBpbnQgX19hcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBfX2p1bXBfbGFiZWxfdHJhbnNmb3JtKHN0cnVjdCBqdW1wX2VudHJ5ICplbnRyeSwKKwkJCQkgICBlbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlKQogewotCXN0cnVjdCBpbnNuX2FyZ3MgKmFyZ3MgPSBkYXRhOwotCWludCByYzsKLQotCXJjID0gcHJvYmVfa2VybmVsX3dyaXRlKGFyZ3MtPnRhcmdldCwgYXJncy0+aW5zbiwgYXJncy0+c2l6ZSk7Ci0JV0FSTl9PTl9PTkNFKHJjIDwgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybShzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCi0JCQkgICAgICAgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgaW5zbl9hcmdzIGFyZ3M7CiAJc3RydWN0IGluc24gaW5zbjsKKwlpbnQgcmM7CiAKIAlpZiAodHlwZSA9PSBKVU1QX0xBQkVMX0VOQUJMRSkgewogCQkvKiBicmNsIDE1LG9mZnNldCAqLwpAQCAtNDksMTEgKzM4LDMzIEBACiAJCWluc24ub2Zmc2V0ID0gMDsKIAl9CiAKLQlhcmdzLnRhcmdldCA9ICh2b2lkICopIGVudHJ5LT5jb2RlOwotCWFyZ3MuaW5zbiA9ICZpbnNuOwotCWFyZ3Muc2l6ZSA9IEpVTVBfTEFCRUxfTk9QX1NJWkU7CisJcmMgPSBwcm9iZV9rZXJuZWxfd3JpdGUoKHZvaWQgKillbnRyeS0+Y29kZSwgJmluc24sIEpVTVBfTEFCRUxfTk9QX1NJWkUpOworCVdBUk5fT05fT05DRShyYyA8IDApOworfQogCi0Jc3RvcF9tYWNoaW5lKF9fYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybSwgJmFyZ3MsIE5VTEwpOworc3RhdGljIGludCBfX3NtX2FyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0odm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW5zbl9hcmdzICphcmdzID0gZGF0YTsKKworCV9fanVtcF9sYWJlbF90cmFuc2Zvcm0oYXJncy0+ZW50cnksIGFyZ3MtPnR5cGUpOworCXJldHVybiAwOworfQorCit2b2lkIGFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0oc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAorCQkJICAgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpCit7CisJc3RydWN0IGluc25fYXJncyBhcmdzOworCisJYXJncy5lbnRyeSA9IGVudHJ5OworCWFyZ3MudHlwZSA9IHR5cGU7CisKKwlzdG9wX21hY2hpbmUoX19zbV9hcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtLCAmYXJncywgTlVMTCk7Cit9CisKK3ZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAorCQkJCSAgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpCit7CisJX19qdW1wX2xhYmVsX3RyYW5zZm9ybShlbnRyeSwgdHlwZSk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwppbmRleCAxZDA1ZDY2Li42NGI3NjFhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwpAQCAtNjM1LDcgKzYzNSw3IEBACiAJYXNtIHZvbGF0aWxlKCIud29yZCAweDAwMDIiKTsKIH0KIAotdm9pZCBfX2twcm9iZXMganByb2JlX3JldHVybl9lbmQodm9pZCkKK3N0YXRpYyB2b2lkIF9fdXNlZCBfX2twcm9iZXMganByb2JlX3JldHVybl9lbmQodm9pZCkKIHsKIAlhc20gdm9sYXRpbGUoImJjciAwLDAiKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggYjA5YjljNi4uM2NkMGYyNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTEsMTAgKzEsMTEgQEAKIC8qCiAgKiBhcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYwogICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNSwyMDA2CisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDUsMjAxMQogICoKICAqIEF1dGhvcihzKTogUm9sZiBBZGVsc2JlcmdlciwKICAqCSAgICAgIEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tPgorICoJICAgICAgTWljaGFlbCBIb2x6aGV1IDxob2x6aGV1QGxpbnV4LnZuZXQuaWJtLmNvbT4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0yMSwxMiArMjIsMTYyIEBACiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9yZXNldC5oPgogI2luY2x1ZGUgPGFzbS9pcGwuaD4KKyNpbmNsdWRlIDxhc20vZGlhZy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiB0eXBlZGVmIHZvaWQgKCpyZWxvY2F0ZV9rZXJuZWxfdCkoa2ltYWdlX2VudHJ5X3QgKiwgdW5zaWduZWQgbG9uZyk7CiAKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX2tlcm5lbFtdOwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyByZWxvY2F0ZV9rZXJuZWxfbGVuOwogCisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwordm9pZCAqZmlsbF9jcHVfZWxmX25vdGVzKHZvaWQgKnB0ciwgc3RydWN0IHNhdmVfYXJlYSAqc2EpOworCisvKgorICogQ3JlYXRlIEVMRiBub3RlcyBmb3Igb25lIENQVQorICovCitzdGF0aWMgdm9pZCBhZGRfZWxmX25vdGVzKGludCBjcHUpCit7CisJc3RydWN0IHNhdmVfYXJlYSAqc2EgPSAodm9pZCAqKSA0NjA4ICsgc3RvcmVfcHJlZml4KCk7CisJdm9pZCAqcHRyOworCisJbWVtY3B5KCh2b2lkICopICg0NjA4VUwgKyBzYS0+cHJlZl9yZWcpLCBzYSwgc2l6ZW9mKCpzYSkpOworCXB0ciA9ICh1NjQgKikgcGVyX2NwdV9wdHIoY3Jhc2hfbm90ZXMsIGNwdSk7CisJcHRyID0gZmlsbF9jcHVfZWxmX25vdGVzKHB0ciwgc2EpOworCW1lbXNldChwdHIsIDAsIHNpemVvZihzdHJ1Y3QgZWxmX25vdGUpKTsKK30KKworLyoKKyAqIFN0b3JlIHN0YXR1cyBvZiBuZXh0IGF2YWlsYWJsZSBwaHlzaWNhbCBDUFUKKyAqLworc3RhdGljIGludCBzdG9yZV9zdGF0dXNfbmV4dChpbnQgc3RhcnRfY3B1LCBpbnQgdGhpc19jcHUpCit7CisJc3RydWN0IHNhdmVfYXJlYSAqc2EgPSAodm9pZCAqKSA0NjA4ICsgc3RvcmVfcHJlZml4KCk7CisJaW50IGNwdSwgcmM7CisKKwlmb3IgKGNwdSA9IHN0YXJ0X2NwdTsgY3B1IDwgNjU1MzY7IGNwdSsrKSB7CisJCWlmIChjcHUgPT0gdGhpc19jcHUpCisJCQljb250aW51ZTsKKwkJZG8geworCQkJcmMgPSByYXdfc2lncChjcHUsIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKKwkJfSB3aGlsZSAocmMgPT0gc2lncF9idXN5KTsKKwkJaWYgKHJjICE9IHNpZ3Bfb3JkZXJfY29kZV9hY2NlcHRlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc2EtPnByZWZfcmVnKQorCQkJcmV0dXJuIGNwdTsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICogSW5pdGlhbGl6ZSBDUFUgRUxGIG5vdGVzCisgKi8KK3ZvaWQgc2V0dXBfcmVncyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2EgPSBTMzkwX2xvd2NvcmUucHJlZml4cmVnX3NhdmVfYXJlYSArIFNBVkVfQVJFQV9CQVNFOworCWludCBjcHUsIHRoaXNfY3B1LCBwaHlzX2NwdSA9IDAsIGZpcnN0ID0gMTsKKworCXRoaXNfY3B1ID0gc3RhcCgpOworCisJaWYgKCFTMzkwX2xvd2NvcmUucHJlZml4cmVnX3NhdmVfYXJlYSkKKwkJZmlyc3QgPSAwOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWlmIChmaXJzdCkgeworCQkJYWRkX2VsZl9ub3RlcyhjcHUpOworCQkJZmlyc3QgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJcGh5c19jcHUgPSBzdG9yZV9zdGF0dXNfbmV4dChwaHlzX2NwdSwgdGhpc19jcHUpOworCQlpZiAocGh5c19jcHUgPT0gLTEpCisJCQlicmVhazsKKwkJYWRkX2VsZl9ub3RlcyhjcHUpOworCQlwaHlzX2NwdSsrOworCX0KKwkvKiBDb3B5IGR1bXAgQ1BVIHN0b3JlIHN0YXR1cyBpbmZvIHRvIGFic29sdXRlIHplcm8gKi8KKwltZW1jcHkoKHZvaWQgKikgU0FWRV9BUkVBX0JBU0UsICh2b2lkICopIHNhLCBzaXplb2Yoc3RydWN0IHNhdmVfYXJlYSkpOworfQorCisjZW5kaWYKKworLyoKKyAqIFN0YXJ0IGtkdW1wOiBXZSBleHBlY3QgaGVyZSB0aGF0IGEgc3RvcmUgc3RhdHVzIGhhcyBiZWVuIGRvbmUgb24gb3VyIENQVQorICovCitzdGF0aWMgdm9pZCBfX2RvX21hY2hpbmVfa2R1bXAodm9pZCAqaW1hZ2UpCit7CisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwlpbnQgKCpzdGFydF9rZHVtcCkoaW50KSA9ICh2b2lkICopKChzdHJ1Y3Qga2ltYWdlICopIGltYWdlKS0+c3RhcnQ7CisKKwlfX2xvYWRfcHN3X21hc2soUFNXX01BU0tfQkFTRSB8IFBTV19ERUZBVUxUX0tFWSB8IFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkEpOworCXNldHVwX3JlZ3MoKTsKKwlzdGFydF9rZHVtcCgxKTsKKyNlbmRpZgorfQorCisvKgorICogQ2hlY2sgaWYga2R1bXAgY2hlY2tzdW1zIGFyZSB2YWxpZDogV2UgY2FsbCBwdXJnYXRvcnkgd2l0aCBwYXJhbWV0ZXIgIjAiCisgKi8KK3N0YXRpYyBpbnQga2R1bXBfY3N1bV92YWxpZChzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCWludCAoKnN0YXJ0X2tkdW1wKShpbnQpID0gKHZvaWQgKilpbWFnZS0+c3RhcnQ7CisJaW50IHJjOworCisJX19hcmNoX2xvY2FsX2lycV9zdG5zbSgweGZiKTsgLyogZGlzYWJsZSBEQVQgKi8KKwlyYyA9IHN0YXJ0X2tkdW1wKDApOworCV9fYXJjaF9sb2NhbF9pcnFfc3Rvc20oMHgwNCk7IC8qIGVuYWJsZSBEQVQgKi8KKwlyZXR1cm4gcmMgPyAwIDogLUVJTlZBTDsKKyNlbHNlCisJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKK30KKworLyoKKyAqIE1hcCBvciB1bm1hcCBjcmFzaGtlcm5lbCBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgY3Jhc2hfbWFwX3BhZ2VzKGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gcmVzb3VyY2Vfc2l6ZSgmY3Jhc2hrX3Jlcyk7CisKKwlCVUdfT04oY3Jhc2hrX3Jlcy5zdGFydCAlIEtFWEVDX0NSQVNIX01FTV9BTElHTiB8fAorCSAgICAgICBzaXplICUgS0VYRUNfQ1JBU0hfTUVNX0FMSUdOKTsKKwlpZiAoZW5hYmxlKQorCQl2bWVtX2FkZF9tYXBwaW5nKGNyYXNoa19yZXMuc3RhcnQsIHNpemUpOworCWVsc2UKKwkJdm1lbV9yZW1vdmVfbWFwcGluZyhjcmFzaGtfcmVzLnN0YXJ0LCBzaXplKTsKK30KKworLyoKKyAqIE1hcCBjcmFzaGtlcm5lbCBtZW1vcnkKKyAqLwordm9pZCBjcmFzaF9tYXBfcmVzZXJ2ZWRfcGFnZXModm9pZCkKK3sKKwljcmFzaF9tYXBfcGFnZXMoMSk7Cit9CisKKy8qCisgKiBVbm1hcCBjcmFzaGtlcm5lbCBtZW1vcnkKKyAqLwordm9pZCBjcmFzaF91bm1hcF9yZXNlcnZlZF9wYWdlcyh2b2lkKQoreworCWNyYXNoX21hcF9wYWdlcygwKTsKK30KKworLyoKKyAqIEdpdmUgYmFjayBtZW1vcnkgdG8gaHlwZXJ2aXNvciBiZWZvcmUgbmV3IGtkdW1wIGlzIGxvYWRlZAorICovCitzdGF0aWMgaW50IG1hY2hpbmVfa2V4ZWNfcHJlcGFyZV9rZHVtcCh2b2lkKQoreworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJaWYgKE1BQ0hJTkVfSVNfVk0pCisJCWRpYWcxMF9yYW5nZShQRk5fRE9XTihjcmFzaGtfcmVzLnN0YXJ0KSwKKwkJCSAgICAgUEZOX0RPV04oY3Jhc2hrX3Jlcy5lbmQgLSBjcmFzaGtfcmVzLnN0YXJ0ICsgMSkpOworCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorfQorCiBpbnQgbWFjaGluZV9rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQogewogCXZvaWQgKnJlYm9vdF9jb2RlX2J1ZmZlcjsKQEAgLTM1LDYgKzE4Niw5IEBACiAJaWYgKGlwbF9mbGFncyAmIElQTF9OU1NfVkFMSUQpCiAJCXJldHVybiAtRU5PU1lTOwogCisJaWYgKGltYWdlLT50eXBlID09IEtFWEVDX1RZUEVfQ1JBU0gpCisJCXJldHVybiBtYWNoaW5lX2tleGVjX3ByZXBhcmVfa2R1bXAoKTsKKwogCS8qIFdlIGRvbid0IHN1cHBvcnQgYW55dGhpbmcgYnV0IHRoZSBkZWZhdWx0IGltYWdlIHR5cGUgZm9yIG5vdy4gKi8KIAlpZiAoaW1hZ2UtPnR5cGUgIT0gS0VYRUNfVFlQRV9ERUZBVUxUKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUxLDI3ICsyMDUsNTMgQEAKIHsKIH0KIAordm9pZCBhcmNoX2NyYXNoX3NhdmVfdm1jb3JlaW5mbyh2b2lkKQoreworCVZNQ09SRUlORk9fU1lNQk9MKGxvd2NvcmVfcHRyKTsKKwlWTUNPUkVJTkZPX0xFTkdUSChsb3djb3JlX3B0ciwgTlJfQ1BVUyk7Cit9CisKIHZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKQogewogfQogCi1zdGF0aWMgdm9pZCBfX21hY2hpbmVfa2V4ZWModm9pZCAqZGF0YSkKKy8qCisgKiBEbyBub3JtYWwga2V4ZWMKKyAqLworc3RhdGljIHZvaWQgX19kb19tYWNoaW5lX2tleGVjKHZvaWQgKmRhdGEpCiB7CiAJcmVsb2NhdGVfa2VybmVsX3QgZGF0YV9tb3ZlcjsKIAlzdHJ1Y3Qga2ltYWdlICppbWFnZSA9IGRhdGE7CiAKLQlwZmF1bHRfZmluaSgpOwotCXMzOTBfcmVzZXRfc3lzdGVtKCk7Ci0KIAlkYXRhX21vdmVyID0gKHJlbG9jYXRlX2tlcm5lbF90KSBwYWdlX3RvX3BoeXMoaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKTsKIAogCS8qIENhbGwgdGhlIG1vdmluZyByb3V0aW5lICovCiAJKCpkYXRhX21vdmVyKSgmaW1hZ2UtPmhlYWQsIGltYWdlLT5zdGFydCk7Ci0JZm9yICg7Oyk7CiB9CiAKKy8qCisgKiBSZXNldCBzeXN0ZW0gYW5kIGNhbGwgZWl0aGVyIGtkdW1wIG9yIG5vcm1hbCBrZXhlYworICovCitzdGF0aWMgdm9pZCBfX21hY2hpbmVfa2V4ZWModm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qga2ltYWdlICppbWFnZSA9IGRhdGE7CisKKwlwZmF1bHRfZmluaSgpOworCWlmIChpbWFnZS0+dHlwZSA9PSBLRVhFQ19UWVBFX0NSQVNIKQorCQlzMzkwX3Jlc2V0X3N5c3RlbShfX2RvX21hY2hpbmVfa2R1bXAsIGRhdGEpOworCWVsc2UKKwkJczM5MF9yZXNldF9zeXN0ZW0oX19kb19tYWNoaW5lX2tleGVjLCBkYXRhKTsKKwlkaXNhYmxlZF93YWl0KCh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworfQorCisvKgorICogRG8gZWl0aGVyIGtkdW1wIG9yIG5vcm1hbCBrZXhlYy4gSW4gY2FzZSBvZiBrZHVtcCB3ZSBmaXJzdCBhc2sKKyAqIHB1cmdhdG9yeSwgaWYga2R1bXAgY2hlY2tzdW1zIGFyZSB2YWxpZC4KKyAqLwogdm9pZCBtYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQogeworCWlmIChpbWFnZS0+dHlwZSA9PSBLRVhFQ19UWVBFX0NSQVNIICYmICFrZHVtcF9jc3VtX3ZhbGlkKGltYWdlKSkKKwkJcmV0dXJuOwogCXRyYWNlcl9kaXNhYmxlKCk7CiAJc21wX3NlbmRfc3RvcCgpOwogCXNtcF9zd2l0Y2hfdG9faXBsX2NwdShfX21hY2hpbmVfa2V4ZWMsIGltYWdlKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvbWVtX2RldGVjdC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9tZW1fZGV0ZWN0LmMKaW5kZXggMGZiZTRlMy4uMTliNDU2OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9tZW1fZGV0ZWN0LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9tZW1fZGV0ZWN0LmMKQEAgLTYyLDMgKzYyLDcyIEBACiAJYXJjaF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGRldGVjdF9tZW1vcnlfbGF5b3V0KTsKKworLyoKKyAqIENyZWF0ZSBtZW1vcnkgaG9sZSB3aXRoIGdpdmVuIGFkZHJlc3MsIHNpemUsIGFuZCB0eXBlCisgKi8KK3ZvaWQgY3JlYXRlX21lbV9ob2xlKHN0cnVjdCBtZW1fY2h1bmsgY2h1bmtzW10sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGludCB0eXBlKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZCwgbmV3X3NpemU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUzsgaSsrKSB7CisJCWlmIChjaHVua3NbaV0uc2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChhZGRyICsgc2l6ZSA8IGNodW5rc1tpXS5hZGRyKQorCQkJY29udGludWU7CisJCWlmIChhZGRyID49IGNodW5rc1tpXS5hZGRyICsgY2h1bmtzW2ldLnNpemUpCisJCQljb250aW51ZTsKKwkJc3RhcnQgPSBtYXgoYWRkciwgY2h1bmtzW2ldLmFkZHIpOworCQllbmQgPSBtaW4oYWRkciArIHNpemUsIGNodW5rc1tpXS5hZGRyICsgY2h1bmtzW2ldLnNpemUpOworCQluZXdfc2l6ZSA9IGVuZCAtIHN0YXJ0OworCQlpZiAobmV3X3NpemUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RhcnQgPT0gY2h1bmtzW2ldLmFkZHIgJiYKKwkJICAgIGVuZCA9PSBjaHVua3NbaV0uYWRkciArIGNodW5rc1tpXS5zaXplKSB7CisJCQkvKiBSZW1vdmUgY2h1bmsgKi8KKwkJCWNodW5rc1tpXS50eXBlID0gdHlwZTsKKwkJfSBlbHNlIGlmIChzdGFydCA9PSBjaHVua3NbaV0uYWRkcikgeworCQkJLyogTWFrZSBjaHVuayBzbWFsbGVyIGF0IHN0YXJ0ICovCisJCQlpZiAoaSA+PSBNRU1PUllfQ0hVTktTIC0gMSkKKwkJCQlwYW5pYygiVW5hYmxlIHRvIGNyZWF0ZSBtZW1vcnkgaG9sZSIpOworCQkJbWVtbW92ZSgmY2h1bmtzW2kgKyAxXSwgJmNodW5rc1tpXSwKKwkJCQlzaXplb2Yoc3RydWN0IG1lbV9jaHVuaykgKgorCQkJCShNRU1PUllfQ0hVTktTIC0gKGkgKyAxKSkpOworCQkJY2h1bmtzW2kgKyAxXS5hZGRyID0gY2h1bmtzW2ldLmFkZHIgKyBuZXdfc2l6ZTsKKwkJCWNodW5rc1tpICsgMV0uc2l6ZSA9IGNodW5rc1tpXS5zaXplIC0gbmV3X3NpemU7CisJCQljaHVua3NbaV0uc2l6ZSA9IG5ld19zaXplOworCQkJY2h1bmtzW2ldLnR5cGUgPSB0eXBlOworCQkJaSArPSAxOworCQl9IGVsc2UgaWYgKGVuZCA9PSBjaHVua3NbaV0uYWRkciArIGNodW5rc1tpXS5zaXplKSB7CisJCQkvKiBNYWtlIGNodW5rIHNtYWxsZXIgYXQgZW5kICovCisJCQlpZiAoaSA+PSBNRU1PUllfQ0hVTktTIC0gMSkKKwkJCQlwYW5pYygiVW5hYmxlIHRvIGNyZWF0ZSBtZW1vcnkgaG9sZSIpOworCQkJbWVtbW92ZSgmY2h1bmtzW2kgKyAxXSwgJmNodW5rc1tpXSwKKwkJCQlzaXplb2Yoc3RydWN0IG1lbV9jaHVuaykgKgorCQkJCShNRU1PUllfQ0hVTktTIC0gKGkgKyAxKSkpOworCQkJY2h1bmtzW2kgKyAxXS5hZGRyID0gc3RhcnQ7CisJCQljaHVua3NbaSArIDFdLnNpemUgPSBuZXdfc2l6ZTsKKwkJCWNodW5rc1tpICsgMV0udHlwZSA9IHR5cGU7CisJCQljaHVua3NbaV0uc2l6ZSAtPSBuZXdfc2l6ZTsKKwkJCWkgKz0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIENyZWF0ZSBtZW1vcnkgaG9sZSAqLworCQkJaWYgKGkgPj0gTUVNT1JZX0NIVU5LUyAtIDIpCisJCQkJcGFuaWMoIlVuYWJsZSB0byBjcmVhdGUgbWVtb3J5IGhvbGUiKTsKKwkJCW1lbW1vdmUoJmNodW5rc1tpICsgMl0sICZjaHVua3NbaV0sCisJCQkJc2l6ZW9mKHN0cnVjdCBtZW1fY2h1bmspICoKKwkJCQkoTUVNT1JZX0NIVU5LUyAtIChpICsgMikpKTsKKwkJCWNodW5rc1tpICsgMV0uYWRkciA9IGFkZHI7CisJCQljaHVua3NbaSArIDFdLnNpemUgPSBzaXplOworCQkJY2h1bmtzW2kgKyAxXS50eXBlID0gdHlwZTsKKwkJCWNodW5rc1tpICsgMl0uYWRkciA9IGFkZHIgKyBzaXplOworCQkJY2h1bmtzW2kgKyAyXS5zaXplID0KKwkJCQljaHVua3NbaV0uYWRkciArIGNodW5rc1tpXS5zaXplIC0gKGFkZHIgKyBzaXplKTsKKwkJCWNodW5rc1tpICsgMl0udHlwZSA9IGNodW5rc1tpXS50eXBlOworCQkJY2h1bmtzW2ldLnNpemUgPSBhZGRyIC0gY2h1bmtzW2ldLmFkZHI7CisJCQlpICs9IDI7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDU0MWE3NTAuLjk0NTFiMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xMTcsNyArMTE4LDggQEAKIAlzdHJ1Y3QgcHRfcmVncyByZWdzOwogCiAJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOwotCXJlZ3MucHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19JTyB8IFBTV19NQVNLX0VYVDsKKwlyZWdzLnBzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwKKwkJUFNXX01BU0tfREFUIHwgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19NQ0hFQ0s7CiAJcmVncy5wc3cuYWRkciA9ICh1bnNpZ25lZCBsb25nKSBrZXJuZWxfdGhyZWFkX3N0YXJ0ZXIgfCBQU1dfQUREUl9BTU9ERTsKIAlyZWdzLmdwcnNbOV0gPSAodW5zaWduZWQgbG9uZykgZm47CiAJcmVncy5ncHJzWzEwXSA9ICh1bnNpZ25lZCBsb25nKSBhcmc7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3Nvci5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzb3IuYwppbmRleCAzMTFlOWQ3Li42ZTAwNzNlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3Nvci5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzc29yLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAogc3RhdGljIHZvaWQgKmNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlyZXR1cm4gKnBvcyA8IE5SX0NQVVMgPyAodm9pZCAqKSgodW5zaWduZWQgbG9uZykgKnBvcyArIDEpIDogTlVMTDsKKwlyZXR1cm4gKnBvcyA8IG5yX2NwdV9pZHMgPyAodm9pZCAqKSgodW5zaWduZWQgbG9uZykgKnBvcyArIDEpIDogTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZWY4NmFkMi4uNDUwOTMxYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCkBAIC00MiwzNCArNDIsMzcgQEAKIAlSRUdTRVRfR0VORVJBTCwKIAlSRUdTRVRfRlAsCiAJUkVHU0VUX0xBU1RfQlJFQUssCisJUkVHU0VUX1NZU1RFTV9DQUxMLAogCVJFR1NFVF9HRU5FUkFMX0VYVEVOREVELAogfTsKIAogdm9pZCB1cGRhdGVfcGVyX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGVyX3JlZ3MgcGVyX3NpbmdsZV9zdGVwID0gewotCQkuY29udHJvbCA9IFBFUl9FVkVOVF9JRkVUQ0gsCi0JCS5zdGFydCA9IDAsCi0JCS5lbmQgPSBQU1dfQUREUl9JTlNOLAotCX07CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCA9ICZ0YXNrLT50aHJlYWQ7Ci0JY29uc3Qgc3RydWN0IHBlcl9yZWdzICpuZXc7Ci0Jc3RydWN0IHBlcl9yZWdzIG9sZDsKKwlzdHJ1Y3QgcGVyX3JlZ3Mgb2xkLCBuZXc7CiAKLQkvKiBUSUZfU0lOR0xFX1NURVAgb3ZlcnJpZGVzIHRoZSB1c2VyIHNwZWNpZmllZCBQRVIgcmVnaXN0ZXJzLiAqLwotCW5ldyA9IHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVfU1RFUCkgPwotCQkmcGVyX3NpbmdsZV9zdGVwIDogJnRocmVhZC0+cGVyX3VzZXI7CisJLyogQ29weSB1c2VyIHNwZWNpZmllZCBQRVIgcmVnaXN0ZXJzICovCisJbmV3LmNvbnRyb2wgPSB0aHJlYWQtPnBlcl91c2VyLmNvbnRyb2w7CisJbmV3LnN0YXJ0ID0gdGhyZWFkLT5wZXJfdXNlci5zdGFydDsKKwluZXcuZW5kID0gdGhyZWFkLT5wZXJfdXNlci5lbmQ7CisKKwkvKiBtZXJnZSBUSUZfU0lOR0xFX1NURVAgaW50byB1c2VyIHNwZWNpZmllZCBQRVIgcmVnaXN0ZXJzLiAqLworCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfU0lOR0xFX1NURVApKSB7CisJCW5ldy5jb250cm9sIHw9IFBFUl9FVkVOVF9JRkVUQ0g7CisJCW5ldy5zdGFydCA9IDA7CisJCW5ldy5lbmQgPSBQU1dfQUREUl9JTlNOOworCX0KIAogCS8qIFRha2UgY2FyZSBvZiB0aGUgUEVSIGVuYWJsZW1lbnQgYml0IGluIHRoZSBQU1cuICovCi0JaWYgKCEobmV3LT5jb250cm9sICYgUEVSX0VWRU5UX01BU0spKSB7CisJaWYgKCEobmV3LmNvbnRyb2wgJiBQRVJfRVZFTlRfTUFTSykpIHsKIAkJcmVncy0+cHN3Lm1hc2sgJj0gflBTV19NQVNLX1BFUjsKIAkJcmV0dXJuOwogCX0KIAlyZWdzLT5wc3cubWFzayB8PSBQU1dfTUFTS19QRVI7CiAJX19jdGxfc3RvcmUob2xkLCA5LCAxMSk7Ci0JaWYgKG1lbWNtcChuZXcsICZvbGQsIHNpemVvZihzdHJ1Y3QgcGVyX3JlZ3MpKSAhPSAwKQotCQlfX2N0bF9sb2FkKCpuZXcsIDksIDExKTsKKwlpZiAobWVtY21wKCZuZXcsICZvbGQsIHNpemVvZihzdHJ1Y3QgcGVyX3JlZ3MpKSAhPSAwKQorCQlfX2N0bF9sb2FkKG5ldywgOSwgMTEpOwogfQogCiB2b2lkIHVzZXJfZW5hYmxlX3NpbmdsZV9zdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTE2Niw4ICsxNjksOCBAQAogCQkgKi8KIAkJdG1wID0gKihhZGRyX3QgKikoKGFkZHJfdCkgJnRhc2tfcHRfcmVncyhjaGlsZCktPnBzdyArIGFkZHIpOwogCQlpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXktPnJlZ3MucHN3Lm1hc2spCi0JCQkvKiBSZW1vdmUgcGVyIGJpdCBmcm9tIHVzZXIgcHN3LiAqLwotCQkJdG1wICY9IH5QU1dfTUFTS19QRVI7CisJCQkvKiBSZXR1cm4gYSBjbGVhbiBwc3cgbWFzay4gKi8KKwkJCXRtcCA9IHBzd191c2VyX2JpdHMgfCAodG1wICYgUFNXX01BU0tfVVNFUik7CiAKIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAmZHVtbXktPnJlZ3Mub3JpZ19ncHIyKSB7CiAJCS8qCkBAIC0yODksMTggKzI5MiwxNyBAQAogCQkgKiBwc3cgYW5kIGdwcnMgYXJlIHN0b3JlZCBvbiB0aGUgc3RhY2sKIAkJICovCiAJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teS0+cmVncy5wc3cubWFzayAmJgotI2lmZGVmIENPTkZJR19DT01QQVQKLQkJICAgIGRhdGEgIT0gUFNXX01BU0tfTUVSR0UocHN3X3VzZXIzMl9iaXRzLCBkYXRhKSAmJgotI2VuZGlmCi0JCSAgICBkYXRhICE9IFBTV19NQVNLX01FUkdFKHBzd191c2VyX2JpdHMsIGRhdGEpKQorCQkgICAgKChkYXRhICYgflBTV19NQVNLX1VTRVIpICE9IHBzd191c2VyX2JpdHMgfHwKKwkJICAgICAoKGRhdGEgJiBQU1dfTUFTS19FQSkgJiYgIShkYXRhICYgUFNXX01BU0tfQkEpKSkpCiAJCQkvKiBJbnZhbGlkIHBzdyBtYXNrLiAqLwogCQkJcmV0dXJuIC1FSU5WQUw7Ci0jaWZuZGVmIENPTkZJR182NEJJVAogCQlpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXktPnJlZ3MucHN3LmFkZHIpCi0JCQkvKiBJJ2QgbGlrZSB0byByZWplY3QgYWRkcmVzc2VzIHdpdGhvdXQgdGhlCi0JCQkgICBoaWdoIG9yZGVyIGJpdCBidXQgb2xkZXIgZ2RiJ3MgcmVseSBvbiBpdCAqLwotCQkJZGF0YSB8PSBQU1dfQUREUl9BTU9ERTsKLSNlbmRpZgorCQkJLyoKKwkJCSAqIFRoZSBkZWJ1Z2dlciBjaGFuZ2VkIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzLAorCQkJICogcmVzZXQgc3lzdGVtIGNhbGwgcmVzdGFydCwgc2VlIHNpZ25hbC5jOmRvX3NpZ25hbAorCQkJICovCisJCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+c3lzdGVtX2NhbGwgPSAwOworCiAJCSooYWRkcl90ICopKChhZGRyX3QpICZ0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cgKyBhZGRyKSA9IGRhdGE7CiAKIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15LT5yZWdzLm9yaWdfZ3ByMikpIHsKQEAgLTQ5NSwyMSArNDk3LDIxIEBACiAJX191MzIgdG1wOwogCiAJaWYgKGFkZHIgPCAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5hY3JzKSB7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAkJLyoKIAkJICogcHN3IGFuZCBncHJzIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrCiAJCSAqLwogCQlpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5wc3cubWFzaykgewogCQkJLyogRmFrZSBhIDMxIGJpdCBwc3cgbWFzay4gKi8KLQkJCXRtcCA9IChfX3UzMikodGFza19wdF9yZWdzKGNoaWxkKS0+cHN3Lm1hc2sgPj4gMzIpOwotCQkJdG1wID0gUFNXMzJfTUFTS19NRVJHRShwc3czMl91c2VyX2JpdHMsIHRtcCk7CisJCQl0bXAgPSAoX191MzIpKHJlZ3MtPnBzdy5tYXNrID4+IDMyKTsKKwkJCXRtcCA9IHBzdzMyX3VzZXJfYml0cyB8ICh0bXAgJiBQU1czMl9NQVNLX1VTRVIpOwogCQl9IGVsc2UgaWYgKGFkZHIgPT0gKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MucHN3LmFkZHIpIHsKIAkJCS8qIEZha2UgYSAzMSBiaXQgcHN3IGFkZHJlc3MuICovCi0JCQl0bXAgPSAoX191MzIpIHRhc2tfcHRfcmVncyhjaGlsZCktPnBzdy5hZGRyIHwKLQkJCQlQU1czMl9BRERSX0FNT0RFMzE7CisJCQl0bXAgPSAoX191MzIpIHJlZ3MtPnBzdy5hZGRyIHwKKwkJCQkoX191MzIpKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfQkEpOwogCQl9IGVsc2UgewogCQkJLyogZ3ByIDAtMTUgKi8KLQkJCXRtcCA9ICooX191MzIgKikoKGFkZHJfdCkgJnRhc2tfcHRfcmVncyhjaGlsZCktPnBzdyArCi0JCQkJCSBhZGRyKjIgKyA0KTsKKwkJCXRtcCA9ICooX191MzIgKikoKGFkZHJfdCkgJnJlZ3MtPnBzdyArIGFkZHIqMiArIDQpOwogCQl9CiAJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teTMyLT5yZWdzLm9yaWdfZ3ByMikpIHsKIAkJLyoKQEAgLTU5NCwyNCArNTk2LDMyIEBACiAJYWRkcl90IG9mZnNldDsKIAogCWlmIChhZGRyIDwgKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MuYWNycykgeworCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7CiAJCS8qCiAJCSAqIHBzdywgZ3BycywgYWNycyBhbmQgb3JpZ19ncHIyIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrCiAJCSAqLwogCQlpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5wc3cubWFzaykgewogCQkJLyogQnVpbGQgYSA2NCBiaXQgcHN3IG1hc2sgZnJvbSAzMSBiaXQgbWFzay4gKi8KLQkJCWlmICh0bXAgIT0gUFNXMzJfTUFTS19NRVJHRShwc3czMl91c2VyX2JpdHMsIHRtcCkpCisJCQlpZiAoKHRtcCAmIH5QU1czMl9NQVNLX1VTRVIpICE9IHBzdzMyX3VzZXJfYml0cykKIAkJCQkvKiBJbnZhbGlkIHBzdyBtYXNrLiAqLwogCQkJCXJldHVybiAtRUlOVkFMOwotCQkJdGFza19wdF9yZWdzKGNoaWxkKS0+cHN3Lm1hc2sgPQotCQkJCVBTV19NQVNLX01FUkdFKHBzd191c2VyMzJfYml0cywgKF9fdTY0KSB0bXAgPDwgMzIpOworCQkJcmVncy0+cHN3Lm1hc2sgPSAocmVncy0+cHN3Lm1hc2sgJiB+UFNXX01BU0tfVVNFUikgfAorCQkJCShyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX0JBKSB8CisJCQkJKF9fdTY0KSh0bXAgJiBQU1czMl9NQVNLX1VTRVIpIDw8IDMyOwogCQl9IGVsc2UgaWYgKGFkZHIgPT0gKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MucHN3LmFkZHIpIHsKIAkJCS8qIEJ1aWxkIGEgNjQgYml0IHBzdyBhZGRyZXNzIGZyb20gMzEgYml0IGFkZHJlc3MuICovCi0JCQl0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cuYWRkciA9Ci0JCQkJKF9fdTY0KSB0bXAgJiBQU1czMl9BRERSX0lOU047CisJCQlyZWdzLT5wc3cuYWRkciA9IChfX3U2NCkgdG1wICYgUFNXMzJfQUREUl9JTlNOOworCQkJLyogVHJhbnNmZXIgMzEgYml0IGFtb2RlIGJpdCB0byBwc3cgbWFzay4gKi8KKwkJCXJlZ3MtPnBzdy5tYXNrID0gKHJlZ3MtPnBzdy5tYXNrICYgflBTV19NQVNLX0JBKSB8CisJCQkJKF9fdTY0KSh0bXAgJiBQU1czMl9BRERSX0FNT0RFKTsKKwkJCS8qCisJCQkgKiBUaGUgZGVidWdnZXIgY2hhbmdlZCB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcywKKwkJCSAqIHJlc2V0IHN5c3RlbSBjYWxsIHJlc3RhcnQsIHNlZSBzaWduYWwuYzpkb19zaWduYWwKKwkJCSAqLworCQkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPnN5c3RlbV9jYWxsID0gMDsKIAkJfSBlbHNlIHsKIAkJCS8qIGdwciAwLTE1ICovCi0JCQkqKF9fdTMyKikoKGFkZHJfdCkgJnRhc2tfcHRfcmVncyhjaGlsZCktPnBzdwotCQkJCSAgKyBhZGRyKjIgKyA0KSA9IHRtcDsKKwkJCSooX191MzIqKSgoYWRkcl90KSAmcmVncy0+cHN3ICsgYWRkcioyICsgNCkgPSB0bXA7CiAJCX0KIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15MzItPnJlZ3Mub3JpZ19ncHIyKSkgewogCQkvKgpAQCAtNzM1LDcgKzc0NSw3IEBACiAJCSAqIGRlYnVnZ2VyIHN0b3JlZCBhbiBpbnZhbGlkIHN5c3RlbSBjYWxsIG51bWJlci4gU2tpcAogCQkgKiB0aGUgc3lzdGVtIGNhbGwgYW5kIHRoZSBzeXN0ZW0gY2FsbCByZXN0YXJ0IGhhbmRsaW5nLgogCQkgKi8KLQkJcmVncy0+c3ZjbnIgPSAwOworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTCk7CiAJCXJldCA9IC0xOwogCX0KIApAQCAtODk3LDYgKzkwNywyNiBAQAogCiAjZW5kaWYKIAorc3RhdGljIGludCBzMzkwX3N5c3RlbV9jYWxsX2dldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJCQljb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJCQl1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQkJdm9pZCAqa2J1Ziwgdm9pZCBfX3VzZXIgKnVidWYpCit7CisJdW5zaWduZWQgaW50ICpkYXRhID0gJnRhc2tfdGhyZWFkX2luZm8odGFyZ2V0KS0+c3lzdGVtX2NhbGw7CisJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICAgZGF0YSwgMCwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworfQorCitzdGF0aWMgaW50IHMzOTBfc3lzdGVtX2NhbGxfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkJCWNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkJCXVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJCQljb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgKmRhdGEgPSAmdGFza190aHJlYWRfaW5mbyh0YXJnZXQpLT5zeXN0ZW1fY2FsbDsKKwlyZXR1cm4gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAgZGF0YSwgMCwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0IHMzOTBfcmVnc2V0c1tdID0gewogCVtSRUdTRVRfR0VORVJBTF0gPSB7CiAJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSU1RBVFVTLApAQCAtOTIzLDYgKzk1MywxNCBAQAogCQkuZ2V0ID0gczM5MF9sYXN0X2JyZWFrX2dldCwKIAl9LAogI2VuZGlmCisJW1JFR1NFVF9TWVNURU1fQ0FMTF0gPSB7CisJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1MzOTBfU1lTVEVNX0NBTEwsCisJCS5uID0gMSwKKwkJLnNpemUgPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLmFsaWduID0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5nZXQgPSBzMzkwX3N5c3RlbV9jYWxsX2dldCwKKwkJLnNldCA9IHMzOTBfc3lzdGVtX2NhbGxfc2V0LAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgdXNlcl9zMzkwX3ZpZXcgPSB7CkBAIC0xMTAyLDYgKzExNDAsMTQgQEAKIAkJLmFsaWduID0gc2l6ZW9mKGxvbmcpLAogCQkuZ2V0ID0gczM5MF9jb21wYXRfbGFzdF9icmVha19nZXQsCiAJfSwKKwlbUkVHU0VUX1NZU1RFTV9DQUxMXSA9IHsKKwkJLmNvcmVfbm90ZV90eXBlID0gTlRfUzM5MF9TWVNURU1fQ0FMTCwKKwkJLm4gPSAxLAorCQkuc2l6ZSA9IHNpemVvZihjb21wYXRfdWludF90KSwKKwkJLmFsaWduID0gc2l6ZW9mKGNvbXBhdF91aW50X3QpLAorCQkuZ2V0ID0gczM5MF9zeXN0ZW1fY2FsbF9nZXQsCisJCS5zZXQgPSBzMzkwX3N5c3RlbV9jYWxsX3NldCwKKwl9LAogCVtSRUdTRVRfR0VORVJBTF9FWFRFTkRFRF0gPSB7CiAJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1MzOTBfSElHSF9HUFJTLAogCQkubiA9IHNpemVvZihzMzkwX2NvbXBhdF9yZWdzX2hpZ2gpIC8gc2l6ZW9mKGNvbXBhdF9sb25nX3QpLApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbC5TCmluZGV4IDMwM2Q5NjFjLi5hZDY3YzIxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbC5TCkBAIC0xMCw2ICsxMCwxMiBAQAogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjCisjIHN0b3JlX3N0YXR1czogRW1wdHkgaW1wbGVtZW50YXRpb24gdW50aWwga2R1bXAgaXMgc3VwcG9ydGVkIG9uIDMxIGJpdAorIworRU5UUlkoc3RvcmVfc3RhdHVzKQorCQlicgklcjE0CisKKyMKICMgZG9fcmVpcGxfYXNtCiAjIFBhcmFtZXRlcjogcjIgPSBzY2hpZCBvZiByZWlwbCBkZXZpY2UKICMKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKaW5kZXggZTY5MDk3NS4uNzMyYTc5MyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKQEAgLTE3LDExICsxNywxMSBAQAogIwogRU5UUlkoc3RvcmVfc3RhdHVzKQogCS8qIFNhdmUgcmVnaXN0ZXIgb25lIGFuZCBsb2FkIHNhdmUgYXJlYSBiYXNlICovCi0Jc3RnCSVyMSxfX0xDX1NBVkVfQVJFQV82NCglcjApCisJc3RnCSVyMSxfX0xDX1NBVkVfQVJFQSsxMjAoJXIwKQogCWxnaGkJJXIxLFNBVkVfQVJFQV9CQVNFCiAJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwogCXN0bWcJJXIwLCVyMTUsX19MQ19HUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlsZwklcjIsX19MQ19TQVZFX0FSRUFfNjQoJXIwKQorCWxnCSVyMixfX0xDX1NBVkVfQVJFQSsxMjAoJXIwKQogCXN0ZwklcjIsX19MQ19HUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKzgoJXIxKQogCS8qIENvbnRyb2wgcmVnaXN0ZXJzICovCiAJc3RjdGcJJWMwLCVjMTUsX19MQ19DUkVHU19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQpAQCAtNjIsOCArNjIsMTEgQEAKIAlsYXJsCSVyMixzdG9yZV9zdGF0dXMKIAlzdGcJJXIyLF9fTENfUFNXX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSArIDgoJXIxKQogCWJyCSVyMTQKLS5hbGlnbgk4CisKKwkuc2VjdGlvbiAuYnNzCisJLmFsaWduCTgKIC5MY2xrY21wOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKKwkucHJldmlvdXMKIAogIwogIyBkb19yZWlwbF9hc20KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwppbmRleCA3YjM3MWMzLi44YWM2YmZhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCkBAIC00Miw2ICs0Miw5IEBACiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KIAogI2luY2x1ZGUgPGFzbS9pcGwuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNTcsMTIgKzYwLDEzIEBACiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgogI2luY2x1ZGUgPGFzbS9jb21wYXQuaD4KICNpbmNsdWRlIDxhc20va3ZtX3ZpcnRpby5oPgorI2luY2x1ZGUgPGFzbS9kaWFnLmg+CiAKLWxvbmcgcHN3X2tlcm5lbF9iaXRzCT0gKFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19EQVQgfCBQU1dfQVNDX1BSSU1BUlkgfAotCQkJICAgUFNXX01BU0tfTUNIRUNLIHwgUFNXX0RFRkFVTFRfS0VZKTsKLWxvbmcgcHN3X3VzZXJfYml0cwk9IChQU1dfQkFTRV9CSVRTIHwgUFNXX01BU0tfREFUIHwgUFNXX0FTQ19IT01FIHwKLQkJCSAgIFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUIHwgUFNXX01BU0tfTUNIRUNLIHwKLQkJCSAgIFBTV19NQVNLX1BTVEFURSB8IFBTV19ERUZBVUxUX0tFWSk7Citsb25nIHBzd19rZXJuZWxfYml0cwk9IFBTV19ERUZBVUxUX0tFWSB8IFBTV19NQVNLX0JBU0UgfCBQU1dfQVNDX1BSSU1BUlkgfAorCQkJICBQU1dfTUFTS19FQSB8IFBTV19NQVNLX0JBOworbG9uZyBwc3dfdXNlcl9iaXRzCT0gUFNXX01BU0tfREFUIHwgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQgfAorCQkJICBQU1dfREVGQVVMVF9LRVkgfCBQU1dfTUFTS19CQVNFIHwgUFNXX01BU0tfTUNIRUNLIHwKKwkJCSAgUFNXX01BU0tfUFNUQVRFIHwgUFNXX0FTQ19IT01FOwogCiAvKgogICogVXNlciBjb3B5IG9wZXJhdGlvbnMuCkBAIC0yNzQsMjIgKzI3OCwxNCBAQAogdW5zaWduZWQgaW50IHVzZXJfbW9kZSA9IEhPTUVfU1BBQ0VfTU9ERTsKIEVYUE9SVF9TWU1CT0xfR1BMKHVzZXJfbW9kZSk7CiAKLXN0YXRpYyBpbnQgc2V0X2Ftb2RlX2FuZF91YWNjZXNzKHVuc2lnbmVkIGxvbmcgdXNlcl9hbW9kZSwKLQkJCQkgdW5zaWduZWQgbG9uZyB1c2VyMzJfYW1vZGUpCitzdGF0aWMgaW50IHNldF9hbW9kZV9wcmltYXJ5KHZvaWQpCiB7Ci0JcHN3X3VzZXJfYml0cyA9IFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19EQVQgfCB1c2VyX2Ftb2RlIHwKLQkJCVBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUIHwgUFNXX01BU0tfTUNIRUNLIHwKLQkJCVBTV19NQVNLX1BTVEFURSB8IFBTV19ERUZBVUxUX0tFWTsKKwlwc3dfa2VybmVsX2JpdHMgPSAocHN3X2tlcm5lbF9iaXRzICYgflBTV19NQVNLX0FTQykgfCBQU1dfQVNDX0hPTUU7CisJcHN3X3VzZXJfYml0cyA9IChwc3dfdXNlcl9iaXRzICYgflBTV19NQVNLX0FTQykgfCBQU1dfQVNDX1BSSU1BUlk7CiAjaWZkZWYgQ09ORklHX0NPTVBBVAotCXBzd191c2VyMzJfYml0cyA9IFBTV19CQVNFMzJfQklUUyB8IFBTV19NQVNLX0RBVCB8IHVzZXJfYW1vZGUgfAotCQkJICBQU1dfTUFTS19JTyB8IFBTV19NQVNLX0VYVCB8IFBTV19NQVNLX01DSEVDSyB8Ci0JCQkgIFBTV19NQVNLX1BTVEFURSB8IFBTV19ERUZBVUxUX0tFWTsKLQlwc3czMl91c2VyX2JpdHMgPSBQU1czMl9CQVNFX0JJVFMgfCBQU1czMl9NQVNLX0RBVCB8IHVzZXIzMl9hbW9kZSB8Ci0JCQkgIFBTVzMyX01BU0tfSU8gfCBQU1czMl9NQVNLX0VYVCB8IFBTVzMyX01BU0tfTUNIRUNLIHwKLQkJCSAgUFNXMzJfTUFTS19QU1RBVEU7CisJcHN3MzJfdXNlcl9iaXRzID0KKwkJKHBzdzMyX3VzZXJfYml0cyAmIH5QU1czMl9NQVNLX0FTQykgfCBQU1czMl9BU0NfUFJJTUFSWTsKICNlbmRpZgotCXBzd19rZXJuZWxfYml0cyA9IFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19EQVQgfCBQU1dfQVNDX0hPTUUgfAotCQkJICBQU1dfTUFTS19NQ0hFQ0sgfCBQU1dfREVGQVVMVF9LRVk7CiAKIAlpZiAoTUFDSElORV9IQVNfTVZDT1MpIHsKIAkJbWVtY3B5KCZ1YWNjZXNzLCAmdWFjY2Vzc19tdmNvc19zd2l0Y2gsIHNpemVvZih1YWNjZXNzKSk7CkBAIC0zMjUsNyArMzIxLDcgQEAKIHN0YXRpYyB2b2lkIHNldHVwX2FkZHJlc3NpbmdfbW9kZSh2b2lkKQogewogCWlmICh1c2VyX21vZGUgPT0gUFJJTUFSWV9TUEFDRV9NT0RFKSB7Ci0JCWlmIChzZXRfYW1vZGVfYW5kX3VhY2Nlc3MoUFNXX0FTQ19QUklNQVJZLCBQU1czMl9BU0NfUFJJTUFSWSkpCisJCWlmIChzZXRfYW1vZGVfcHJpbWFyeSgpKQogCQkJcHJfaW5mbygiQWRkcmVzcyBzcGFjZXMgc3dpdGNoZWQsICIKIAkJCQkibXZjb3MgYXZhaWxhYmxlXG4iKTsKIAkJZWxzZQpAQCAtMzQ0LDI0ICszNDAsMjUgQEAKIAkgKi8KIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBfbG93Y29yZSkgIT0gTENfUEFHRVMgKiA0MDk2KTsKIAlsYyA9IF9fYWxsb2NfYm9vdG1lbV9sb3coTENfUEFHRVMgKiBQQUdFX1NJWkUsIExDX1BBR0VTICogUEFHRV9TSVpFLCAwKTsKLQlsYy0+cmVzdGFydF9wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVk7CisJbGMtPnJlc3RhcnRfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHM7CiAJbGMtPnJlc3RhcnRfcHN3LmFkZHIgPQogCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBwc3dfcmVzdGFydF9pbnRfaGFuZGxlcjsKLQlpZiAodXNlcl9tb2RlICE9IEhPTUVfU1BBQ0VfTU9ERSkKLQkJbGMtPnJlc3RhcnRfcHN3Lm1hc2sgfD0gUFNXX0FTQ19IT01FOwotCWxjLT5leHRlcm5hbF9uZXdfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHM7CisJbGMtPmV4dGVybmFsX25ld19wc3cubWFzayA9IHBzd19rZXJuZWxfYml0cyB8CisJCVBTV19NQVNLX0RBVCB8IFBTV19NQVNLX01DSEVDSzsKIAlsYy0+ZXh0ZXJuYWxfbmV3X3Bzdy5hZGRyID0KIAkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgZXh0X2ludF9oYW5kbGVyOwotCWxjLT5zdmNfbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQ7CisJbGMtPnN2Y19uZXdfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfAorCQlQU1dfTUFTS19EQVQgfCBQU1dfTUFTS19JTyB8IFBTV19NQVNLX0VYVCB8IFBTV19NQVNLX01DSEVDSzsKIAlsYy0+c3ZjX25ld19wc3cuYWRkciA9IFBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHN5c3RlbV9jYWxsOwotCWxjLT5wcm9ncmFtX25ld19wc3cubWFzayA9IHBzd19rZXJuZWxfYml0czsKKwlsYy0+cHJvZ3JhbV9uZXdfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfAorCQlQU1dfTUFTS19EQVQgfCBQU1dfTUFTS19NQ0hFQ0s7CiAJbGMtPnByb2dyYW1fbmV3X3Bzdy5hZGRyID0KLQkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZylwZ21fY2hlY2tfaGFuZGxlcjsKLQlsYy0+bWNja19uZXdfcHN3Lm1hc2sgPQotCQlwc3dfa2VybmVsX2JpdHMgJiB+UFNXX01BU0tfTUNIRUNLICYgflBTV19NQVNLX0RBVDsKKwkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgcGdtX2NoZWNrX2hhbmRsZXI7CisJbGMtPm1jY2tfbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzOwogCWxjLT5tY2NrX25ld19wc3cuYWRkciA9CiAJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIG1jY2tfaW50X2hhbmRsZXI7Ci0JbGMtPmlvX25ld19wc3cubWFzayA9IHBzd19rZXJuZWxfYml0czsKKwlsYy0+aW9fbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwKKwkJUFNXX01BU0tfREFUIHwgUFNXX01BU0tfTUNIRUNLOwogCWxjLT5pb19uZXdfcHN3LmFkZHIgPSBQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBpb19pbnRfaGFuZGxlcjsKIAlsYy0+Y2xvY2tfY29tcGFyYXRvciA9IC0xVUxMOwogCWxjLT5rZXJuZWxfc3RhY2sgPSAoKHVuc2lnbmVkIGxvbmcpICZpbml0X3RocmVhZF91bmlvbikgKyBUSFJFQURfU0laRTsKQEAgLTQzNSwxMCArNDMyLDE0IEBACiAJZm9yIChpID0gMDsgaSA8IE1FTU9SWV9DSFVOS1M7IGkrKykgewogCQlpZiAoIW1lbW9yeV9jaHVua1tpXS5zaXplKQogCQkJY29udGludWU7CisJCWlmIChtZW1vcnlfY2h1bmtbaV0udHlwZSA9PSBDSFVOS19PTERNRU0gfHwKKwkJICAgIG1lbW9yeV9jaHVua1tpXS50eXBlID09IENIVU5LX0NSQVNISykKKwkJCWNvbnRpbnVlOwogCQlyZXMgPSBhbGxvY19ib290bWVtX2xvdyhzaXplb2YoKnJlcykpOwogCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9NRU07CiAJCXN3aXRjaCAobWVtb3J5X2NodW5rW2ldLnR5cGUpIHsKIAkJY2FzZSBDSFVOS19SRUFEX1dSSVRFOgorCQljYXNlIENIVU5LX0NSQVNISzoKIAkJCXJlcy0+bmFtZSA9ICJTeXN0ZW0gUkFNIjsKIAkJCWJyZWFrOwogCQljYXNlIENIVU5LX1JFQURfT05MWToKQEAgLTQ3OSw2ICs0ODAsNyBAQAogCXVuc2lnbmVkIGxvbmcgbWF4X21lbTsKIAlpbnQgaTsKIAorCiAjaWZkZWYgQ09ORklHX1pGQ1BEVU1QCiAJaWYgKGlwbF9pbmZvLnR5cGUgPT0gSVBMX1RZUEVfRkNQX0RVTVApIHsKIAkJbWVtb3J5X2VuZCA9IFpGQ1BEVU1QX0hTQV9TSVpFOwpAQCAtNTQ1LDExICs1NDcsMjAxIEBACiAJICogU2V0dXAgcmVzdGFydCBQU1cgZm9yIGFic29sdXRlIHplcm8gbG93Y29yZS4gVGhpcyBpcyBuZWNlc2FyeQogCSAqIGlmIFBTVyByZXN0YXJ0IGlzIGRvbmUgb24gYW4gb2ZmbGluZSBDUFUgdGhhdCBoYXMgbG93Y29yZSB6ZXJvCiAJICovCi0JcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX0RFRkFVTFRfS0VZOworCXBzdy5tYXNrID0gUFNXX0RFRkFVTFRfS0VZIHwgUFNXX01BU0tfQkFTRSB8IFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkE7CiAJcHN3LmFkZHIgPSBQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBwc3dfcmVzdGFydF9pbnRfaGFuZGxlcjsKIAljb3B5X3RvX2Fic29sdXRlX3plcm8oJlMzOTBfbG93Y29yZS5yZXN0YXJ0X3BzdywgJnBzdywgc2l6ZW9mKHBzdykpOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfdm1jb3JlaW5mbyh2b2lkKQoreworI2lmZGVmIENPTkZJR19LRVhFQworCXVuc2lnbmVkIGxvbmcgcHRyID0gcGFkZHJfdm1jb3JlaW5mb19ub3RlKCk7CisKKwljb3B5X3RvX2Fic29sdXRlX3plcm8oJlMzOTBfbG93Y29yZS52bWNvcmVfaW5mbywgJnB0ciwgc2l6ZW9mKHB0cikpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCisvKgorICogRmluZCBzdWl0YWJsZSBsb2NhdGlvbiBmb3IgY3Jhc2hrZXJuZWwgbWVtb3J5CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBmaW5kX2NyYXNoX2Jhc2UodW5zaWduZWQgbG9uZyBjcmFzaF9zaXplLAorCQkJCQkgICAgY2hhciAqKm1zZykKK3sKKwl1bnNpZ25lZCBsb25nIGNyYXNoX2Jhc2U7CisJc3RydWN0IG1lbV9jaHVuayAqY2h1bms7CisJaW50IGk7CisKKwlpZiAobWVtb3J5X2NodW5rWzBdLnNpemUgPCBjcmFzaF9zaXplKSB7CisJCSptc2cgPSAiZmlyc3QgbWVtb3J5IGNodW5rIG11c3QgYmUgYXQgbGVhc3QgY3Jhc2hrZXJuZWwgc2l6ZSI7CisJCXJldHVybiAwOworCX0KKwlpZiAoaXNfa2R1bXBfa2VybmVsKCkgJiYgKGNyYXNoX3NpemUgPT0gT0xETUVNX1NJWkUpKQorCQlyZXR1cm4gT0xETUVNX0JBU0U7CisKKwlmb3IgKGkgPSBNRU1PUllfQ0hVTktTIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJY2h1bmsgPSAmbWVtb3J5X2NodW5rW2ldOworCQlpZiAoY2h1bmstPnNpemUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2h1bmstPnR5cGUgIT0gQ0hVTktfUkVBRF9XUklURSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2h1bmstPnNpemUgPCBjcmFzaF9zaXplKQorCQkJY29udGludWU7CisJCWNyYXNoX2Jhc2UgPSAoY2h1bmstPmFkZHIgKyBjaHVuay0+c2l6ZSkgLSBjcmFzaF9zaXplOworCQlpZiAoY3Jhc2hfYmFzZSA8IGNyYXNoX3NpemUpCisJCQljb250aW51ZTsKKwkJaWYgKGNyYXNoX2Jhc2UgPCBaRkNQRFVNUF9IU0FfU0laRV9NQVgpCisJCQljb250aW51ZTsKKwkJaWYgKGNyYXNoX2Jhc2UgPCAodW5zaWduZWQgbG9uZykgSU5JVFJEX1NUQVJUICsgSU5JVFJEX1NJWkUpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIGNyYXNoX2Jhc2U7CisJfQorCSptc2cgPSAibm8gc3VpdGFibGUgYXJlYSBmb3VuZCI7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayBpZiBjcmFzaF9iYXNlIGFuZCBjcmFzaF9zaXplIGlzIHZhbGlkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHZlcmlmeV9jcmFzaF9iYXNlKHVuc2lnbmVkIGxvbmcgY3Jhc2hfYmFzZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBjcmFzaF9zaXplLAorCQkJCSAgICBjaGFyICoqbXNnKQoreworCXN0cnVjdCBtZW1fY2h1bmsgKmNodW5rOworCWludCBpOworCisJLyoKKwkgKiBCZWNhdXNlIHdlIGRvIHRoZSBzd2FwIHRvIHplcm8sIHdlIG11c3QgaGF2ZSBhdCBsZWFzdCAnY3Jhc2hfc2l6ZScKKwkgKiBieXRlcyBmcmVlIHNwYWNlIGJlZm9yZSBjcmFzaF9iYXNlCisJICovCisJaWYgKGNyYXNoX3NpemUgPiBjcmFzaF9iYXNlKSB7CisJCSptc2cgPSAiY3Jhc2hrZXJuZWwgb2Zmc2V0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHNpemUiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaXJzdCBtZW1vcnkgY2h1bmsgbXVzdCBiZSBhdCBsZWFzdCBjcmFzaF9zaXplICovCisJaWYgKG1lbW9yeV9jaHVua1swXS5zaXplIDwgY3Jhc2hfc2l6ZSkgeworCQkqbXNnID0gImZpcnN0IG1lbW9yeSBjaHVuayBtdXN0IGJlIGF0IGxlYXN0IGNyYXNoa2VybmVsIHNpemUiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogQ2hlY2sgaWYgd2UgZml0IGludG8gdGhlIHJlc3BlY3RpdmUgbWVtb3J5IGNodW5rICovCisJZm9yIChpID0gMDsgaSA8IE1FTU9SWV9DSFVOS1M7IGkrKykgeworCQljaHVuayA9ICZtZW1vcnlfY2h1bmtbaV07CisJCWlmIChjaHVuay0+c2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChjcmFzaF9iYXNlIDwgY2h1bmstPmFkZHIpCisJCQljb250aW51ZTsKKwkJaWYgKGNyYXNoX2Jhc2UgPj0gY2h1bmstPmFkZHIgKyBjaHVuay0+c2l6ZSkKKwkJCWNvbnRpbnVlOworCQkvKiB3ZSBoYXZlIGZvdW5kIHRoZSBtZW1vcnkgY2h1bmsgKi8KKwkJaWYgKGNyYXNoX2Jhc2UgKyBjcmFzaF9zaXplID4gY2h1bmstPmFkZHIgKyBjaHVuay0+c2l6ZSkgeworCQkJKm1zZyA9ICJzZWxlY3RlZCBtZW1vcnkgY2h1bmsgaXMgdG9vIHNtYWxsIGZvciAiCisJCQkJImNyYXNoa2VybmVsIG1lbW9yeSI7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJKm1zZyA9ICJpbnZhbGlkIG1lbW9yeSByYW5nZSBzcGVjaWZpZWQiOworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogUmVzZXJ2ZSBrZHVtcCBtZW1vcnkgYnkgY3JlYXRpbmcgYSBtZW1vcnkgaG9sZSBpbiB0aGUgbWVtX2NodW5rIGFycmF5CisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByZXNlcnZlX2tkdW1wX2Jvb3RtZW0odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCSBpbnQgdHlwZSkKK3sKKworCWNyZWF0ZV9tZW1faG9sZShtZW1vcnlfY2h1bmssIGFkZHIsIHNpemUsIHR5cGUpOworfQorCisvKgorICogV2hlbiBrZHVtcCBpcyBlbmFibGVkLCB3ZSBoYXZlIHRvIGVuc3VyZSB0aGF0IG5vIG1lbW9yeSBmcm9tCisgKiB0aGUgYXJlYSBbMCAtIGNyYXNoa2VybmVsIG1lbW9yeSBzaXplXSBhbmQKKyAqIFtjcmFzaGtfcmVzLnN0YXJ0IC0gY3Jhc2hrX3Jlcy5lbmRdIGlzIHNldCBvZmZsaW5lLgorICovCitzdGF0aWMgaW50IGtkdW1wX21lbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1lbW9yeV9ub3RpZnkgKmFyZyA9IGRhdGE7CisKKwlpZiAoYXJnLT5zdGFydF9wZm4gPCBQRk5fRE9XTihyZXNvdXJjZV9zaXplKCZjcmFzaGtfcmVzKSkpCisJCXJldHVybiBOT1RJRllfQkFEOworCWlmIChhcmctPnN0YXJ0X3BmbiA+IFBGTl9ET1dOKGNyYXNoa19yZXMuZW5kKSkKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwlpZiAoYXJnLT5zdGFydF9wZm4gKyBhcmctPm5yX3BhZ2VzIC0gMSA8IFBGTl9ET1dOKGNyYXNoa19yZXMuc3RhcnQpKQorCQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiBOT1RJRllfQkFEOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGtkdW1wX21lbV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGtkdW1wX21lbV9ub3RpZmllciwKK307CisKKyNlbmRpZgorCisvKgorICogTWFrZSBzdXJlIHRoYXQgb2xkbWVtLCB3aGVyZSB0aGUgZHVtcCBpcyBzdG9yZWQsIGlzIHByb3RlY3RlZAorICovCitzdGF0aWMgdm9pZCByZXNlcnZlX29sZG1lbSh2b2lkKQoreworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJaWYgKCFPTERNRU1fQkFTRSkKKwkJcmV0dXJuOworCisJcmVzZXJ2ZV9rZHVtcF9ib290bWVtKE9MRE1FTV9CQVNFLCBPTERNRU1fU0laRSwgQ0hVTktfT0xETUVNKTsKKwlyZXNlcnZlX2tkdW1wX2Jvb3RtZW0oT0xETUVNX1NJWkUsIG1lbW9yeV9lbmQgLSBPTERNRU1fU0laRSwKKwkJCSAgICAgIENIVU5LX09MRE1FTSk7CisJaWYgKE9MRE1FTV9CQVNFICsgT0xETUVNX1NJWkUgPT0gcmVhbF9tZW1vcnlfc2l6ZSkKKwkJc2F2ZWRfbWF4X3BmbiA9IFBGTl9ET1dOKE9MRE1FTV9CQVNFKSAtIDE7CisJZWxzZQorCQlzYXZlZF9tYXhfcGZuID0gUEZOX0RPV04ocmVhbF9tZW1vcnlfc2l6ZSkgLSAxOworI2VuZGlmCit9CisKKy8qCisgKiBSZXNlcnZlIG1lbW9yeSBmb3Iga2R1bXAga2VybmVsIHRvIGJlIGxvYWRlZCB3aXRoIGtleGVjCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByZXNlcnZlX2NyYXNoa2VybmVsKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwl1bnNpZ25lZCBsb25nIGxvbmcgY3Jhc2hfYmFzZSwgY3Jhc2hfc2l6ZTsKKwljaGFyICptc2c7CisJaW50IHJjOworCisJcmMgPSBwYXJzZV9jcmFzaGtlcm5lbChib290X2NvbW1hbmRfbGluZSwgbWVtb3J5X2VuZCwgJmNyYXNoX3NpemUsCisJCQkgICAgICAgJmNyYXNoX2Jhc2UpOworCWlmIChyYyB8fCBjcmFzaF9zaXplID09IDApCisJCXJldHVybjsKKwljcmFzaF9iYXNlID0gQUxJR04oY3Jhc2hfYmFzZSwgS0VYRUNfQ1JBU0hfTUVNX0FMSUdOKTsKKwljcmFzaF9zaXplID0gQUxJR04oY3Jhc2hfc2l6ZSwgS0VYRUNfQ1JBU0hfTUVNX0FMSUdOKTsKKwlpZiAocmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKCZrZHVtcF9tZW1fbmIpKQorCQlyZXR1cm47CisJaWYgKCFjcmFzaF9iYXNlKQorCQljcmFzaF9iYXNlID0gZmluZF9jcmFzaF9iYXNlKGNyYXNoX3NpemUsICZtc2cpOworCWlmICghY3Jhc2hfYmFzZSkgeworCQlwcl9pbmZvKCJjcmFzaGtlcm5lbCByZXNlcnZhdGlvbiBmYWlsZWQ6ICVzXG4iLCBtc2cpOworCQl1bnJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcigma2R1bXBfbWVtX25iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodmVyaWZ5X2NyYXNoX2Jhc2UoY3Jhc2hfYmFzZSwgY3Jhc2hfc2l6ZSwgJm1zZykpIHsKKwkJcHJfaW5mbygiY3Jhc2hrZXJuZWwgcmVzZXJ2YXRpb24gZmFpbGVkOiAlc1xuIiwgbXNnKTsKKwkJdW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoJmtkdW1wX21lbV9uYik7CisJCXJldHVybjsKKwl9CisJaWYgKCFPTERNRU1fQkFTRSAmJiBNQUNISU5FX0lTX1ZNKQorCQlkaWFnMTBfcmFuZ2UoUEZOX0RPV04oY3Jhc2hfYmFzZSksIFBGTl9ET1dOKGNyYXNoX3NpemUpKTsKKwljcmFzaGtfcmVzLnN0YXJ0ID0gY3Jhc2hfYmFzZTsKKwljcmFzaGtfcmVzLmVuZCA9IGNyYXNoX2Jhc2UgKyBjcmFzaF9zaXplIC0gMTsKKwlpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmY3Jhc2hrX3Jlcyk7CisJcmVzZXJ2ZV9rZHVtcF9ib290bWVtKGNyYXNoX2Jhc2UsIGNyYXNoX3NpemUsIENIVU5LX0NSQVNISyk7CisJcHJfaW5mbygiUmVzZXJ2aW5nICVsbHVNQiBvZiBtZW1vcnkgYXQgJWxsdU1CICIKKwkJImZvciBjcmFzaGtlcm5lbCAoU3lzdGVtIFJBTTogJWx1TUIpXG4iLAorCQljcmFzaF9zaXplID4+IDIwLCBjcmFzaF9iYXNlID4+IDIwLCBtZW1vcnlfZW5kID4+IDIwKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgdm9pZCBfX2luaXQKIHNldHVwX21lbW9yeSh2b2lkKQogewpAQCAtNTgwLDYgKzc3MiwxNCBAQAogCQlpZiAoUEZOX1BIWVMoc3RhcnRfcGZuKSArIGJtYXBfc2l6ZSA+IElOSVRSRF9TVEFSVCkgewogCQkJc3RhcnQgPSBQRk5fUEhZUyhzdGFydF9wZm4pICsgYm1hcF9zaXplICsgUEFHRV9TSVpFOwogCisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwkJCWlmIChPTERNRU1fQkFTRSkgeworCQkJCS8qIE1vdmUgaW5pdHJkIGJlaGluZCBrZHVtcCBvbGRtZW0gKi8KKwkJCQlpZiAoc3RhcnQgKyBJTklUUkRfU0laRSA+IE9MRE1FTV9CQVNFICYmCisJCQkJICAgIHN0YXJ0IDwgT0xETUVNX0JBU0UgKyBPTERNRU1fU0laRSkKKwkJCQkJc3RhcnQgPSBPTERNRU1fQkFTRSArIE9MRE1FTV9TSVpFOworCQkJfQorI2VuZGlmCiAJCQlpZiAoc3RhcnQgKyBJTklUUkRfU0laRSA+IG1lbW9yeV9lbmQpIHsKIAkJCQlwcl9lcnIoImluaXRyZCBleHRlbmRzIGJleW9uZCBlbmQgb2YgIgogCQkJCSAgICAgICAibWVtb3J5ICgweCUwOGx4ID4gMHglMDhseCkgIgpAQCAtNjEwLDcgKzgxMCw4IEBACiAJZm9yIChpID0gMDsgaSA8IE1FTU9SWV9DSFVOS1MgJiYgbWVtb3J5X2NodW5rW2ldLnNpemUgPiAwOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9jaHVuaywgZW5kX2NodW5rLCBwZm47CiAKLQkJaWYgKG1lbW9yeV9jaHVua1tpXS50eXBlICE9IENIVU5LX1JFQURfV1JJVEUpCisJCWlmIChtZW1vcnlfY2h1bmtbaV0udHlwZSAhPSBDSFVOS19SRUFEX1dSSVRFICYmCisJCSAgICBtZW1vcnlfY2h1bmtbaV0udHlwZSAhPSBDSFVOS19DUkFTSEspCiAJCQljb250aW51ZTsKIAkJc3RhcnRfY2h1bmsgPSBQRk5fRE9XTihtZW1vcnlfY2h1bmtbaV0uYWRkcik7CiAJCWVuZF9jaHVuayA9IHN0YXJ0X2NodW5rICsgUEZOX0RPV04obWVtb3J5X2NodW5rW2ldLnNpemUpOwpAQCAtNjQ0LDYgKzg0NSwxNSBAQAogCXJlc2VydmVfYm9vdG1lbShzdGFydF9wZm4gPDwgUEFHRV9TSElGVCwgYm9vdG1hcF9zaXplLAogCQkJQk9PVE1FTV9ERUZBVUxUKTsKIAorI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJaWYgKGNyYXNoa19yZXMuc3RhcnQpCisJCXJlc2VydmVfYm9vdG1lbShjcmFzaGtfcmVzLnN0YXJ0LAorCQkJCWNyYXNoa19yZXMuZW5kIC0gY3Jhc2hrX3Jlcy5zdGFydCArIDEsCisJCQkJQk9PVE1FTV9ERUZBVUxUKTsKKwlpZiAoaXNfa2R1bXBfa2VybmVsKCkpCisJCXJlc2VydmVfYm9vdG1lbShlbGZjb3JlaGRyX2FkZHIgLSBPTERNRU1fQkFTRSwKKwkJCQlQQUdFX0FMSUdOKGVsZmNvcmVoZHJfc2l6ZSksIEJPT1RNRU1fREVGQVVMVCk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAoSU5JVFJEX1NUQVJUICYmIElOSVRSRF9TSVpFKSB7CiAJCWlmIChJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSA8PSBtZW1vcnlfZW5kKSB7CkBAIC04MTIsOCArMTAyMiwxMSBAQAogCXNldHVwX2lwbCgpOwogCXNldHVwX21lbW9yeV9lbmQoKTsKIAlzZXR1cF9hZGRyZXNzaW5nX21vZGUoKTsKKwlyZXNlcnZlX29sZG1lbSgpOworCXJlc2VydmVfY3Jhc2hrZXJuZWwoKTsKIAlzZXR1cF9tZW1vcnkoKTsKIAlzZXR1cF9yZXNvdXJjZXMoKTsKKwlzZXR1cF92bWNvcmVpbmZvKCk7CiAJc2V0dXBfcmVzdGFydF9wc3coKTsKIAlzZXR1cF9sb3djb3JlKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCmluZGV4IDlhNDBlMWMuLjA1YTg1YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vY29tcGF0Lmg+CiAjaW5jbHVkZSAiZW50cnkuaCIKIAogI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKQEAgLTExNiw3ICsxMTcsOCBAQAogCiAJLyogQ29weSBhICdjbGVhbicgUFNXIG1hc2sgdG8gdGhlIHVzZXIgdG8gYXZvaWQgbGVha2luZwogCSAgIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgUEVSIGlzIGN1cnJlbnRseSBvbi4gICovCi0JdXNlcl9zcmVncy5yZWdzLnBzdy5tYXNrID0gUFNXX01BU0tfTUVSR0UocHN3X3VzZXJfYml0cywgcmVncy0+cHN3Lm1hc2spOworCXVzZXJfc3JlZ3MucmVncy5wc3cubWFzayA9IHBzd191c2VyX2JpdHMgfAorCQkocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19VU0VSKTsKIAl1c2VyX3NyZWdzLnJlZ3MucHN3LmFkZHIgPSByZWdzLT5wc3cuYWRkcjsKIAltZW1jcHkoJnVzZXJfc3JlZ3MucmVncy5ncHJzLCAmcmVncy0+Z3Bycywgc2l6ZW9mKHNyZWdzLT5yZWdzLmdwcnMpKTsKIAltZW1jcHkoJnVzZXJfc3JlZ3MucmVncy5hY3JzLCBjdXJyZW50LT50aHJlYWQuYWNycywKQEAgLTE0Myw5ICsxNDUsMTMgQEAKIAllcnIgPSBfX2NvcHlfZnJvbV91c2VyKCZ1c2VyX3NyZWdzLCBzcmVncywgc2l6ZW9mKF9zaWdyZWdzKSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlyZWdzLT5wc3cubWFzayA9IFBTV19NQVNLX01FUkdFKHJlZ3MtPnBzdy5tYXNrLAotCQkJCQl1c2VyX3NyZWdzLnJlZ3MucHN3Lm1hc2spOwotCXJlZ3MtPnBzdy5hZGRyID0gUFNXX0FERFJfQU1PREUgfCB1c2VyX3NyZWdzLnJlZ3MucHN3LmFkZHI7CisJLyogVXNlIHJlZ3MtPnBzdy5tYXNrIGluc3RlYWQgb2YgcHN3X3VzZXJfYml0cyB0byBwcmVzZXJ2ZSBQRVIgYml0LiAqLworCXJlZ3MtPnBzdy5tYXNrID0gKHJlZ3MtPnBzdy5tYXNrICYgflBTV19NQVNLX1VTRVIpIHwKKwkJKHVzZXJfc3JlZ3MucmVncy5wc3cubWFzayAmIFBTV19NQVNLX1VTRVIpOworCS8qIENoZWNrIGZvciBpbnZhbGlkIGFtb2RlICovCisJaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfRUEpCisJCXJlZ3MtPnBzdy5tYXNrIHw9IFBTV19NQVNLX0JBOworCXJlZ3MtPnBzdy5hZGRyID0gdXNlcl9zcmVncy5yZWdzLnBzdy5hZGRyOwogCW1lbWNweSgmcmVncy0+Z3BycywgJnVzZXJfc3JlZ3MucmVncy5ncHJzLCBzaXplb2Yoc3JlZ3MtPnJlZ3MuZ3BycykpOwogCW1lbWNweSgmY3VycmVudC0+dGhyZWFkLmFjcnMsICZ1c2VyX3NyZWdzLnJlZ3MuYWNycywKIAkgICAgICAgc2l6ZW9mKHNyZWdzLT5yZWdzLmFjcnMpKTsKQEAgLTE1Niw3ICsxNjIsNyBAQAogCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmPSBGUENfVkFMSURfTUFTSzsKIAogCXJlc3RvcmVfZnBfcmVncygmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MpOwotCXJlZ3MtPnN2Y25yID0gMDsJLyogZGlzYWJsZSBzeXNjYWxsIGNoZWNrcyAqLworCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMKTsJLyogTm8gbG9uZ2VyIGluIGEgc3lzdGVtIGNhbGwgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjg4LDYgKzI5NCw3IEBACiAKIAkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPmdwcnNbMTVdID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCXJlZ3MtPnBzdy5tYXNrIHw9IFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkE7CS8qIDY0IGJpdCBhbW9kZSAqLwogCXJlZ3MtPnBzdy5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyIHwgUFNXX0FERFJfQU1PREU7CiAKIAlyZWdzLT5ncHJzWzJdID0gbWFwX3NpZ25hbChzaWcpOwpAQCAtMzU2LDYgKzM2Myw3IEBACiAKIAkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPmdwcnNbMTVdID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCXJlZ3MtPnBzdy5tYXNrIHw9IFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkE7CS8qIDY0IGJpdCBhbW9kZSAqLwogCXJlZ3MtPnBzdy5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyIHwgUFNXX0FERFJfQU1PREU7CiAKIAlyZWdzLT5ncHJzWzJdID0gbWFwX3NpZ25hbChzaWcpOwpAQCAtNDAxLDcgKzQwOSw2IEBACiAgKi8KIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXVuc2lnbmVkIGxvbmcgcmV0dmFsID0gMCwgY29udGludWVfYWRkciA9IDAsIHJlc3RhcnRfYWRkciA9IDA7CiAJc2lnaW5mb190IGluZm87CiAJaW50IHNpZ25yOwogCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKQEAgLTQyMSw1NCArNDI4LDQ1IEBACiAJZWxzZQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKIAotCS8qIEFyZSB3ZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCi0JaWYgKHJlZ3MtPnN2Y25yKSB7Ci0JCWNvbnRpbnVlX2FkZHIgPSByZWdzLT5wc3cuYWRkcjsKLQkJcmVzdGFydF9hZGRyID0gY29udGludWVfYWRkciAtIHJlZ3MtPmlsYzsKLQkJcmV0dmFsID0gcmVncy0+Z3Byc1syXTsKLQotCQkvKiBQcmVwYXJlIGZvciBzeXN0ZW0gY2FsbCByZXN0YXJ0LiAgV2UgZG8gdGhpcyBoZXJlIHNvIHRoYXQgYQotCQkgICBkZWJ1Z2dlciB3aWxsIHNlZSB0aGUgYWxyZWFkeSBjaGFuZ2VkIFBTVy4gKi8KLQkJc3dpdGNoIChyZXR2YWwpIHsKLQkJY2FzZSAtRVJFU1RBUlROT0hBTkQ6Ci0JCWNhc2UgLUVSRVNUQVJUU1lTOgotCQljYXNlIC1FUkVTVEFSVE5PSU5UUjoKLQkJCXJlZ3MtPmdwcnNbMl0gPSByZWdzLT5vcmlnX2dwcjI7Ci0JCQlyZWdzLT5wc3cuYWRkciA9IHJlc3RhcnRfYWRkcjsKLQkJCWJyZWFrOwotCQljYXNlIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s6Ci0JCQlyZWdzLT5ncHJzWzJdID0gLUVJTlRSOwotCQl9Ci0JCXJlZ3MtPnN2Y25yID0gMDsJLyogRG9uJ3QgZGVhbCB3aXRoIHRoaXMgYWdhaW4uICovCi0JfQotCi0JLyogR2V0IHNpZ25hbCB0byBkZWxpdmVyLiAgV2hlbiBydW5uaW5nIHVuZGVyIHB0cmFjZSwgYXQgdGhpcyBwb2ludAotCSAgIHRoZSBkZWJ1Z2dlciBtYXkgY2hhbmdlIGFsbCBvdXIgcmVnaXN0ZXJzIC4uLiAqLworCS8qCisJICogR2V0IHNpZ25hbCB0byBkZWxpdmVyLiBXaGVuIHJ1bm5pbmcgdW5kZXIgcHRyYWNlLCBhdCB0aGlzIHBvaW50CisJICogdGhlIGRlYnVnZ2VyIG1heSBjaGFuZ2UgYWxsIG91ciByZWdpc3RlcnMsIGluY2x1ZGluZyB0aGUgc3lzdGVtCisJICogY2FsbCBpbmZvcm1hdGlvbi4KKwkgKi8KKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c3RlbV9jYWxsID0KKwkJdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTCkgPyByZWdzLT5zdmNfY29kZSA6IDA7CiAJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CiAKLQkvKiBEZXBlbmRpbmcgb24gdGhlIHNpZ25hbCBzZXR0aW5ncyB3ZSBtYXkgbmVlZCB0byByZXZlcnQgdGhlCi0JICAgZGVjaXNpb24gdG8gcmVzdGFydCB0aGUgc3lzdGVtIGNhbGwuICovCi0JaWYgKHNpZ25yID4gMCAmJiByZWdzLT5wc3cuYWRkciA9PSByZXN0YXJ0X2FkZHIpIHsKLQkJaWYgKHJldHZhbCA9PSAtRVJFU1RBUlROT0hBTkQKLQkJICAgIHx8IChyZXR2YWwgPT0gLUVSRVNUQVJUU1lTCi0JCQkgJiYgIShjdXJyZW50LT5zaWdoYW5kLT5hY3Rpb25bc2lnbnItMV0uc2Euc2FfZmxhZ3MKLQkJCSAgICAgICYgU0FfUkVTVEFSVCkpKSB7Ci0JCQlyZWdzLT5ncHJzWzJdID0gLUVJTlRSOwotCQkJcmVncy0+cHN3LmFkZHIgPSBjb250aW51ZV9hZGRyOwotCQl9Ci0JfQotCiAJaWYgKHNpZ25yID4gMCkgewogCQkvKiBXaGVlISAgQWN0dWFsbHkgZGVsaXZlciB0aGUgc2lnbmFsLiAgKi8KLQkJaW50IHJldDsKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JCWlmIChpc19jb21wYXRfdGFzaygpKSB7Ci0JCQlyZXQgPSBoYW5kbGVfc2lnbmFsMzIoc2lnbnIsICZrYSwgJmluZm8sIG9sZHNldCwgcmVncyk7Ci0JICAgICAgICB9Ci0JCWVsc2UKLSNlbmRpZgotCQkJcmV0ID0gaGFuZGxlX3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKLQkJaWYgKCFyZXQpIHsKKwkJaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3lzdGVtX2NhbGwpIHsKKwkJCXJlZ3MtPnN2Y19jb2RlID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5zeXN0ZW1fY2FsbDsKKwkJCS8qIENoZWNrIGZvciBzeXN0ZW0gY2FsbCByZXN0YXJ0aW5nLiAqLworCQkJc3dpdGNoIChyZWdzLT5ncHJzWzJdKSB7CisJCQljYXNlIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s6CisJCQljYXNlIC1FUkVTVEFSVE5PSEFORDoKKwkJCQlyZWdzLT5ncHJzWzJdID0gLUVJTlRSOworCQkJCWJyZWFrOworCQkJY2FzZSAtRVJFU1RBUlRTWVM6CisJCQkJaWYgKCEoa2Euc2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkgeworCQkJCQlyZWdzLT5ncHJzWzJdID0gLUVJTlRSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CisJCQkJcmVncy0+Z3Byc1syXSA9IHJlZ3MtPm9yaWdfZ3ByMjsKKwkJCQlyZWdzLT5wc3cuYWRkciA9CisJCQkJCV9fcmV3aW5kX3BzdyhyZWdzLT5wc3csCisJCQkJCQkgICAgIHJlZ3MtPnN2Y19jb2RlID4+IDE2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIE5vIGxvbmdlciBpbiBhIHN5c3RlbSBjYWxsICovCisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTCk7CisJCX0KKworCQlpZiAoKGlzX2NvbXBhdF90YXNrKCkgPworCQkgICAgIGhhbmRsZV9zaWduYWwzMihzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKSA6CisJCSAgICAgaGFuZGxlX3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKSkgPT0gMCkgewogCQkJLyoKIAkJCSAqIEEgc2lnbmFsIHdhcyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkOyB0aGUgc2F2ZWQKIAkJCSAqIHNpZ21hc2sgd2lsbCBoYXZlIGJlZW4gc3RvcmVkIGluIHRoZSBzaWduYWwgZnJhbWUsCkBAIC00ODIsMTEgKzQ4MCwzMiBAQAogCQkJICogTGV0IHRyYWNpbmcga25vdyB0aGF0IHdlJ3ZlIGRvbmUgdGhlIGhhbmRsZXIgc2V0dXAuCiAJCQkgKi8KIAkJCXRyYWNlaG9va19zaWduYWxfaGFuZGxlcihzaWduciwgJmluZm8sICZrYSwgcmVncywKLQkJCQkJdGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFX1NURVApKTsKKwkJCQkJIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRV9TVEVQKSk7CiAJCX0KIAkJcmV0dXJuOwogCX0KIAorCS8qIE5vIGhhbmRsZXJzIHByZXNlbnQgLSBjaGVjayBmb3Igc3lzdGVtIGNhbGwgcmVzdGFydCAqLworCWlmIChjdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c3RlbV9jYWxsKSB7CisJCXJlZ3MtPnN2Y19jb2RlID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5zeXN0ZW1fY2FsbDsKKwkJc3dpdGNoIChyZWdzLT5ncHJzWzJdKSB7CisJCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKKwkJCS8qIFJlc3RhcnQgd2l0aCBzeXNfcmVzdGFydF9zeXNjYWxsICovCisJCQlyZWdzLT5zdmNfY29kZSA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOworCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIC1FUkVTVEFSVE5PSEFORDoKKwkJY2FzZSAtRVJFU1RBUlRTWVM6CisJCWNhc2UgLUVSRVNUQVJUTk9JTlRSOgorCQkJLyogUmVzdGFydCBzeXN0ZW0gY2FsbCB3aXRoIG1hZ2ljIFRJRiBiaXQuICovCisJCQlyZWdzLT5ncHJzWzJdID0gcmVncy0+b3JpZ19ncHIyOworCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTEwpOworCQkJYnJlYWs7CisJCX0KKwl9CisKIAkvKgogCSAqIElmIHRoZXJlJ3Mgbm8gc2lnbmFsIHRvIGRlbGl2ZXIsIHdlIGp1c3QgcHV0IHRoZSBzYXZlZCBzaWdtYXNrIGJhY2suCiAJICovCkBAIC00OTQsMTMgKzUxMyw2IEBACiAJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOwogCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOwogCX0KLQotCS8qIFJlc3RhcnQgYSBkaWZmZXJlbnQgc3lzdGVtIGNhbGwuICovCi0JaWYgKHJldHZhbCA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLCi0JICAgICYmIHJlZ3MtPnBzdy5hZGRyID09IGNvbnRpbnVlX2FkZHIpIHsKLQkJcmVncy0+Z3Byc1syXSA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOwotCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RBUlRfU1ZDKTsKLQl9CiB9CiAKIHZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCmluZGV4IDZhYjE2YWMuLjNlYTg3MjggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2lwbC5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtOTcsNiArOTgsMjkgQEAKIAlyZXR1cm4gcmF3X2NwdV9zdG9wcGVkKGNwdV9sb2dpY2FsX21hcChjcHUpKTsKIH0KIAorLyoKKyAqIEVuc3VyZSB0aGF0IFBTVyByZXN0YXJ0IGlzIGRvbmUgb24gYW4gb25saW5lIENQVQorICovCit2b2lkIHNtcF9yZXN0YXJ0X3dpdGhfb25saW5lX2NwdSh2b2lkKQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoc3RhcCgpID09IF9fY3B1X2xvZ2ljYWxfbWFwW2NwdV0pIHsKKwkJCS8qIFdlIGFyZSBvbmxpbmU6IEVuYWJsZSBEQVQgYWdhaW4gYW5kIHJldHVybiAqLworCQkJX19sb2FkX3Bzd19tYXNrKHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX0RBVCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJLyogV2UgYXJlIG5vdCBvbmxpbmU6IERvIFBTVyByZXN0YXJ0IG9uIGFuIG9ubGluZSBDUFUgKi8KKwl3aGlsZSAoc2lncChjcHUsIHNpZ3BfcmVzdGFydCkgPT0gc2lncF9idXN5KQorCQljcHVfcmVsYXgoKTsKKwkvKiBBbmQgc3RvcCBvdXJzZWxmICovCisJd2hpbGUgKHJhd19zaWdwKHN0YXAoKSwgc2lncF9zdG9wKSA9PSBzaWdwX2J1c3kpCisJCWNwdV9yZWxheCgpOworCWZvciAoOzspOworfQorCiB2b2lkIHNtcF9zd2l0Y2hfdG9faXBsX2NwdSh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgX2xvd2NvcmUgKmxjLCAqY3VycmVudF9sYzsKQEAgLTEwNiwxNCArMTMwLDE2IEBACiAKIAlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpID09IDApCiAJCWZ1bmMoZGF0YSk7Ci0JX19sb2FkX3Bzd19tYXNrKFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVkpOworCV9fbG9hZF9wc3dfbWFzayhQU1dfREVGQVVMVF9LRVkgfCBQU1dfTUFTS19CQVNFIHwKKwkJCVBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkEpOwogCS8qIERpc2FibGUgbG93Y29yZSBwcm90ZWN0aW9uICovCiAJX19jdGxfY2xlYXJfYml0KDAsIDI4KTsKIAljdXJyZW50X2xjID0gbG93Y29yZV9wdHJbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKIAlsYyA9IGxvd2NvcmVfcHRyWzBdOwogCWlmICghbGMpCiAJCWxjID0gY3VycmVudF9sYzsKLQlsYy0+cmVzdGFydF9wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVk7CisJbGMtPnJlc3RhcnRfcHN3Lm1hc2sgPQorCQlQU1dfREVGQVVMVF9LRVkgfCBQU1dfTUFTS19CQVNFIHwgUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQTsKIAlsYy0+cmVzdGFydF9wc3cuYWRkciA9IFBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHNtcF9yZXN0YXJ0X2NwdTsKIAlpZiAoIWNwdV9vbmxpbmUoMCkpCiAJCXNtcF9zd2l0Y2hfdG9fY3B1KGZ1bmMsIGRhdGEsIDAsIHN0YXAoKSwgX19jcHVfbG9naWNhbF9tYXBbMF0pOwpAQCAtMTM1LDcgKzE2MSw3IEBACiAJaW50IGNwdSwgcmM7CiAKIAkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzL21hY2hpbmUgY2hlY2tzICovCi0JX19sb2FkX3Bzd19tYXNrKHBzd19rZXJuZWxfYml0cyAmIH5QU1dfTUFTS19NQ0hFQ0spOworCV9fbG9hZF9wc3dfbWFzayhwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19EQVQpOwogCXRyYWNlX2hhcmRpcnFzX29mZigpOwogCiAJLyogc3RvcCBhbGwgcHJvY2Vzc29ycyAqLwpAQCAtMTYxLDcgKzE4NywxMCBAQAogewogCXVuc2lnbmVkIGxvbmcgYml0czsKIAotCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbRVhUSU5UX0lQSV0rKzsKKwlpZiAoZXh0X2ludF9jb2RlID09IDB4MTIwMikKKwkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tFWFRJTlRfRVhDXSsrOworCWVsc2UKKwkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tFWFRJTlRfRU1TXSsrOwogCS8qCiAJICogaGFuZGxlIGJpdCBzaWduYWwgZXh0ZXJuYWwgY2FsbHMKIAkgKi8KQEAgLTE4MywxMiArMjEyLDE5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNtcF9leHRfYml0Y2FsbChpbnQgY3B1LCBpbnQgc2lnKQogeworCWludCBvcmRlcjsKKwogCS8qCiAJICogU2V0IHNpZ25hbGluZyBiaXQgaW4gbG93Y29yZSBvZiB0YXJnZXQgY3B1IGFuZCBraWNrIGl0CiAJICovCiAJc2V0X2JpdChzaWcsICh1bnNpZ25lZCBsb25nICopICZsb3djb3JlX3B0cltjcHVdLT5leHRfY2FsbF9mYXN0KTsKLQl3aGlsZSAoc2lncChjcHUsIHNpZ3BfZW1lcmdlbmN5X3NpZ25hbCkgPT0gc2lncF9idXN5KQorCXdoaWxlICgxKSB7CisJCW9yZGVyID0gc21wX3ZjcHVfc2NoZWR1bGVkKGNwdSkgPworCQkJc2lncF9leHRlcm5hbF9jYWxsIDogc2lncF9lbWVyZ2VuY3lfc2lnbmFsOworCQlpZiAoc2lncChjcHUsIG9yZGVyKSAhPSBzaWdwX2J1c3kpCisJCQlicmVhazsKIAkJdWRlbGF5KDEwKTsKKwl9CiB9CiAKIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCkBAIC0yODEsMTEgKzMxNywxMyBAQAogfQogRVhQT1JUX1NZTUJPTChzbXBfY3RsX2NsZWFyX2JpdCk7CiAKLSNpZmRlZiBDT05GSUdfWkZDUERVTVAKKyNpZiBkZWZpbmVkKENPTkZJR19aRkNQRFVNUCkgfHwgZGVmaW5lZChDT05GSUdfQ1JBU0hfRFVNUCkKIAogc3RhdGljIHZvaWQgX19pbml0IHNtcF9nZXRfc2F2ZV9hcmVhKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBwaHlfY3B1KQogewotCWlmIChpcGxfaW5mby50eXBlICE9IElQTF9UWVBFX0ZDUF9EVU1QKQorCWlmIChpcGxfaW5mby50eXBlICE9IElQTF9UWVBFX0ZDUF9EVU1QICYmICFPTERNRU1fQkFTRSkKKwkJcmV0dXJuOworCWlmIChpc19rZHVtcF9rZXJuZWwoKSkKIAkJcmV0dXJuOwogCWlmIChjcHUgPj0gTlJfQ1BVUykgewogCQlwcl93YXJuaW5nKCJDUFUgJWkgZXhjZWVkcyB0aGUgbWF4aW11bSAlaSBhbmQgaXMgZXhjbHVkZWQgZnJvbSAiCkBAIC00MDMsNiArNDQxLDE4IEBACiAJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKQogCQlwYW5pYygic21wX2RldGVjdF9jcHVzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJaWYgKE9MRE1FTV9CQVNFICYmICFpc19rZHVtcF9rZXJuZWwoKSkgeworCQlzdHJ1Y3Qgc2F2ZV9hcmVhICpzYXZlX2FyZWE7CisKKwkJc2F2ZV9hcmVhID0ga21hbGxvYyhzaXplb2YoKnNhdmVfYXJlYSksIEdGUF9LRVJORUwpOworCQlpZiAoIXNhdmVfYXJlYSkKKwkJCXBhbmljKCJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzYXZlIGFyZWFcbiIpOworCQljb3B5X29sZG1lbV9wYWdlKDEsICh2b2lkICopIHNhdmVfYXJlYSwgc2l6ZW9mKCpzYXZlX2FyZWEpLAorCQkJCSAweDIwMCwgMCk7CisJCXpmY3BkdW1wX3NhdmVfYXJlYXNbMF0gPSBzYXZlX2FyZWE7CisJfQorI2VuZGlmCiAJLyogVXNlIHNpZ3AgZGV0ZWN0aW9uIGFsZ29yaXRobSBpZiBzY2xwIGRvZXNuJ3Qgd29yay4gKi8KIAlpZiAoc2NscF9nZXRfY3B1X2luZm8oaW5mbykpIHsKIAkJc21wX3VzZV9zaWdwX2RldGVjdGlvbiA9IDE7CkBAIC00NjMsNyArNTEzLDggQEAKIAlzZXRfY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCksIHRydWUpOwogCWlwaV9jYWxsX3VubG9jaygpOwogCV9fY3RsX2NsZWFyX2JpdCgwLCAyOCk7IC8qIERpc2FibGUgbG93Y29yZSBwcm90ZWN0aW9uICovCi0JUzM5MF9sb3djb3JlLnJlc3RhcnRfcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX0RFRkFVTFRfS0VZOworCVMzOTBfbG93Y29yZS5yZXN0YXJ0X3Bzdy5tYXNrID0KKwkJUFNXX0RFRkFVTFRfS0VZIHwgUFNXX01BU0tfQkFTRSB8IFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkE7CiAJUzM5MF9sb3djb3JlLnJlc3RhcnRfcHN3LmFkZHIgPQogCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBwc3dfcmVzdGFydF9pbnRfaGFuZGxlcjsKIAlfX2N0bF9zZXRfYml0KDAsIDI4KTsgLyogRW5hYmxlIGxvd2NvcmUgcHJvdGVjdGlvbiAqLwpAQCAtNTExLDcgKzU2Miw4IEBACiAJbWVtc2V0KChjaGFyICopbG93Y29yZSArIDUxMiwgMCwgc2l6ZW9mKCpsb3djb3JlKSAtIDUxMik7CiAJbG93Y29yZS0+YXN5bmNfc3RhY2sgPSBhc3luY19zdGFjayArIEFTWU5DX1NJWkU7CiAJbG93Y29yZS0+cGFuaWNfc3RhY2sgPSBwYW5pY19zdGFjayArIFBBR0VfU0laRTsKLQlsb3djb3JlLT5yZXN0YXJ0X3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19ERUZBVUxUX0tFWTsKKwlsb3djb3JlLT5yZXN0YXJ0X3Bzdy5tYXNrID0KKwkJUFNXX0RFRkFVTFRfS0VZIHwgUFNXX01BU0tfQkFTRSB8IFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkE7CiAJbG93Y29yZS0+cmVzdGFydF9wc3cuYWRkciA9CiAJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHJlc3RhcnRfaW50X2hhbmRsZXI7CiAJaWYgKHVzZXJfbW9kZSAhPSBIT01FX1NQQUNFX01PREUpCkBAIC03MTIsNiArNzY0LDkgQEAKIAkvKiByZXF1ZXN0IHRoZSAweDEyMDEgZW1lcmdlbmN5IHNpZ25hbCBleHRlcm5hbCBpbnRlcnJ1cHQgKi8KIAlpZiAocmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4MTIwMSwgZG9fZXh0X2NhbGxfaW50ZXJydXB0KSAhPSAwKQogCQlwYW5pYygiQ291bGRuJ3QgcmVxdWVzdCBleHRlcm5hbCBpbnRlcnJ1cHQgMHgxMjAxIik7CisJLyogcmVxdWVzdCB0aGUgMHgxMjAyIGV4dGVybmFsIGNhbGwgZXh0ZXJuYWwgaW50ZXJydXB0ICovCisJaWYgKHJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCgweDEyMDIsIGRvX2V4dF9jYWxsX2ludGVycnVwdCkgIT0gMCkKKwkJcGFuaWMoIkNvdWxkbid0IHJlcXVlc3QgZXh0ZXJuYWwgaW50ZXJydXB0IDB4MTIwMiIpOwogCiAJLyogUmVhbGxvY2F0ZSBjdXJyZW50IGxvd2NvcmUsIGJ1dCBrZWVwIGl0cyBjb250ZW50cy4gKi8KIAlsb3djb3JlID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgR0ZQX0RNQSwgTENfT1JERVIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zdXNwZW5kLmMgYi9hcmNoL3MzOTAva2VybmVsL3N1c3BlbmQuYwppbmRleCBiNmY5YWZlLi40N2RmNzc1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N1c3BlbmQuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3N1c3BlbmQuYwpAQCAtNyw2ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N5c2luZm8uYyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jCmluZGV4IDVjOWU0MzkuLjJhOTRiNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jCkBAIC00NDIsNyArNDQyLDcgQEAKIAkJICovCiAJCUZQX1VOUEFDS19TUChTQSwgJmZtaWwpOwogCQlpZiAoKGluZm8tPmNhcGFiaWxpdHkgPj4gMjMpID09IDApCi0JCQlGUF9GUk9NX0lOVF9TKFNCLCBpbmZvLT5jYXBhYmlsaXR5LCAzMiwgaW50KTsKKwkJCUZQX0ZST01fSU5UX1MoU0IsIChsb25nKSBpbmZvLT5jYXBhYmlsaXR5LCA2NCwgbG9uZyk7CiAJCWVsc2UKIAkJCUZQX1VOUEFDS19TUChTQiwgJmluZm8tPmNhcGFiaWxpdHkpOwogCQlGUF9ESVZfUyhTUiwgU0EsIFNCKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKaW5kZXggOGQ2NWJkMC4uZWJiZmFiMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxhc20vdGltZXIuaD4KICNpbmNsdWRlIDxhc20vZXRyLmg+CiAjaW5jbHVkZSA8YXNtL2Npby5oPgorI2luY2x1ZGUgImVudHJ5LmgiCiAKIC8qIGNoYW5nZSB0aGlzIGlmIHlvdSBoYXZlIHNvbWUgY29uc3RhbnQgdGltZSBkcmlmdCAqLwogI2RlZmluZSBVU0VDU19QRVJfSklGRlkgICAgICgodW5zaWduZWQgbG9uZykgMTAwMDAwMC9IWikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvczM5MC9rZXJuZWwvdG9wb2xvZ3kuYwppbmRleCAwY2QzNDBiNy4uNzdiODk0MiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMjk5LDggKzI5OSw4IEBACiB9CiBfX2luaXRjYWxsKGluaXRfdG9wb2xvZ3lfdXBkYXRlKTsKIAotc3RhdGljIHZvaWQgYWxsb2NfbWFza3Moc3RydWN0IHN5c2luZm9fMTVfMV94ICppbmZvLCBzdHJ1Y3QgbWFza19pbmZvICptYXNrLAotCQkJaW50IG9mZnNldCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhbGxvY19tYXNrcyhzdHJ1Y3Qgc3lzaW5mb18xNV8xX3ggKmluZm8sCisJCQkgICAgICAgc3RydWN0IG1hc2tfaW5mbyAqbWFzaywgaW50IG9mZnNldCkKIHsKIAlpbnQgaSwgbnJfbWFza3M7CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwppbmRleCBmZmFiY2Q5Li5hOTgwN2RkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAkgICAgICAgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX1BTVEFURSksIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19BU0MpLAogCSAgICAgICBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfQ0MpLCBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfUE0pKTsKICNpZmRlZiBDT05GSUdfNjRCSVQKLQlwcmludGsoIiBFQToleCIsIG1hc2tfYml0cyhyZWdzLCBQU1dfQkFTRV9CSVRTKSk7CisJcHJpbnRrKCIgRUE6JXgiLCBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQSkpOwogI2VuZGlmCiAJcHJpbnRrKCJcbiVzIEdQUlM6ICIgRk9VUkxPTkcsIG1vZGUsCiAJICAgICAgIHJlZ3MtPmdwcnNbMF0sIHJlZ3MtPmdwcnNbMV0sIHJlZ3MtPmdwcnNbMl0sIHJlZ3MtPmdwcnNbM10pOwpAQCAtMzM0LDcgKzMzNCw4IEBACiAJaW5mby5zaV9zaWdubyA9IFNJR1RSQVA7CiAJaW5mby5zaV9lcnJubyA9IDA7CiAJaW5mby5zaV9jb2RlID0gVFJBUF9IV0JLUFQ7Ci0JaW5mby5zaV9hZGRyID0gKHZvaWQgKikgY3VycmVudC0+dGhyZWFkLnBlcl9ldmVudC5hZGRyZXNzOworCWluZm8uc2lfYWRkciA9CisJCSh2b2lkIF9fZm9yY2UgX191c2VyICopIGN1cnJlbnQtPnRocmVhZC5wZXJfZXZlbnQuYWRkcmVzczsKIAlmb3JjZV9zaWdfaW5mbyhTSUdUUkFQLCAmaW5mbywgY3VycmVudCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYyBiL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYwppbmRleCAyZDYyMjhmLi5iYjQ4OTc3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jCkBAIC0xNzAsNyArMTcwLDggQEAKIAlwc3dfdCBwc3c7CiAKIAkvKiBXYWl0IGZvciBleHRlcm5hbCwgSS9PIG9yIG1hY2hpbmUgY2hlY2sgaW50ZXJydXB0LiAqLwotCXBzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfV0FJVCB8IFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUOworCXBzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfV0FJVCB8CisJCVBTV19NQVNLX0RBVCB8IFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUIHwgUFNXX01BU0tfTUNIRUNLOwogCiAJaWRsZS0+bm9oel9kZWxheSA9IDA7CiAKQEAgLTE4Myw3ICsxODQsOCBAQAogCQkgKglzZXRfY3B1X3RpbWVyKFZUSU1FUl9NQVhfU0xJQ0UpOwogCQkgKglpZGxlLT5pZGxlX2VudGVyID0gZ2V0X2Nsb2NrKCk7CiAJCSAqCV9fbG9hZF9wc3dfbWFzayhwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19XQUlUIHwKLQkJICoJCQkgICBQU1dfTUFTS19JTyB8IFBTV19NQVNLX0VYVCk7CisJCSAqCQkJICAgUFNXX01BU0tfREFUIHwgUFNXX01BU0tfSU8gfAorCQkgKgkJCSAgIFBTV19NQVNLX0VYVCB8IFBTV19NQVNLX01DSEVDSyk7CiAJCSAqIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIGlubGluZSBhc3NlbWJseSBtYWtlcyBzdXJlIHRoYXQKIAkJICogdGhlIGxhc3QgdGhyZWUgaW5zdHJ1Y3Rpb24gYXJlIHN0cHQsIHN0Y2sgYW5kIGxwc3cgaW4gdGhhdAogCQkgKiBvcmRlci4gVGhpcyBpcyBkb25lIHRvIGluY3JlYXNlIHRoZSBwcmVjaXNpb24uCkBAIC0yMTYsNyArMjE4LDggQEAKIAkJICoJdnEtPmlkbGUgPSBnZXRfY3B1X3RpbWVyKCk7CiAJCSAqCWlkbGUtPmlkbGVfZW50ZXIgPSBnZXRfY2xvY2soKTsKIAkJICoJX19sb2FkX3Bzd19tYXNrKHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX1dBSVQgfAotCQkgKgkJCSAgIFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUKTsKKwkJICoJCQkgICBQU1dfTUFTS19EQVQgfCBQU1dfTUFTS19JTyB8CisJCSAqCQkJICAgUFNXX01BU0tfRVhUIHwgUFNXX01BU0tfTUNIRUNLKTsKIAkJICogVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgaW5saW5lIGFzc2VtYmx5IG1ha2VzIHN1cmUgdGhhdAogCQkgKiB0aGUgbGFzdCB0aHJlZSBpbnN0cnVjdGlvbiBhcmUgc3RwdCwgc3RjayBhbmQgbHBzdyBpbiB0aGF0CiAJCSAqIG9yZGVyLiBUaGlzIGlzIGRvbmUgdG8gaW5jcmVhc2UgdGhlIHByZWNpc2lvbi4KQEAgLTQ1OCw3ICs0NjEsNyBAQAogfQogRVhQT1JUX1NZTUJPTChhZGRfdmlydF90aW1lcl9wZXJpb2RpYyk7CiAKLWludCBfX21vZF92dGltZXIoc3RydWN0IHZ0aW1lcl9saXN0ICp0aW1lciwgX191NjQgZXhwaXJlcywgaW50IHBlcmlvZGljKQorc3RhdGljIGludCBfX21vZF92dGltZXIoc3RydWN0IHZ0aW1lcl9saXN0ICp0aW1lciwgX191NjQgZXhwaXJlcywgaW50IHBlcmlvZGljKQogewogCXN0cnVjdCB2dGltZXJfcXVldWUgKnZxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2RpYWcuYyBiL2FyY2gvczM5MC9rdm0vZGlhZy5jCmluZGV4IDllNGM4NDEuLjg3Y2VkZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vZGlhZy5jCisrKyBiL2FyY2gvczM5MC9rdm0vZGlhZy5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGRpYWcuYyAtIGhhbmRsaW5nIGRpYWdub3NlIGluc3RydWN0aW9ucwogICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwOAorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA4LDIwMTEKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyIG9ubHkpCkBAIC0xNSw2ICsxNSwzNCBAQAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSAia3ZtLXMzOTAuaCIKIAorc3RhdGljIGludCBkaWFnX3JlbGVhc2VfcGFnZXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKwl1bnNpZ25lZCBsb25nIHByZWZpeCAgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cHJlZml4OworCisJc3RhcnQgPSB2Y3B1LT5hcmNoLmd1ZXN0X2dwcnNbKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pcGEgJiAweGYwKSA+PiA0XTsKKwllbmQgPSB2Y3B1LT5hcmNoLmd1ZXN0X2dwcnNbdmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwYSAmIDB4Zl0gKyA0MDk2OworCisJaWYgKHN0YXJ0ICYgflBBR0VfTUFTSyB8fCBlbmQgJiB+UEFHRV9NQVNLIHx8IHN0YXJ0ID4gZW5kCisJICAgIHx8IHN0YXJ0IDwgMiAqIFBBR0VfU0laRSkKKwkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7CisKKwlWQ1BVX0VWRU5UKHZjcHUsIDUsICJkaWFnIHJlbGVhc2UgcGFnZXMgJWxYICVsWCIsIHN0YXJ0LCBlbmQpOworCXZjcHUtPnN0YXQuZGlhZ25vc2VfMTArKzsKKworCS8qIHdlIGNoZWNrZWQgZm9yIHN0YXJ0ID4gZW5kIGFib3ZlICovCisJaWYgKGVuZCA8IHByZWZpeCB8fCBzdGFydCA+PSBwcmVmaXggKyAyICogUEFHRV9TSVpFKSB7CisJCWdtYXBfZGlzY2FyZChzdGFydCwgZW5kLCB2Y3B1LT5hcmNoLmdtYXApOworCX0gZWxzZSB7CisJCWlmIChzdGFydCA8IHByZWZpeCkKKwkJCWdtYXBfZGlzY2FyZChzdGFydCwgcHJlZml4LCB2Y3B1LT5hcmNoLmdtYXApOworCQlpZiAoZW5kID49IHByZWZpeCkKKwkJCWdtYXBfZGlzY2FyZChwcmVmaXggKyAyICogUEFHRV9TSVpFLAorCQkJCSAgICAgZW5kLCB2Y3B1LT5hcmNoLmdtYXApOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2RpYWdfdGltZV9zbGljZV9lbmQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCVZDUFVfRVZFTlQodmNwdSwgNSwgIiVzIiwgImRpYWcgdGltZSBzbGljZSBlbmQiKTsKQEAgLTU3LDYgKzg1LDggQEAKIAlpbnQgY29kZSA9ICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBiICYgMHhmZmYwMDAwKSA+PiAxNjsKIAogCXN3aXRjaCAoY29kZSkgeworCWNhc2UgMHgxMDoKKwkJcmV0dXJuIGRpYWdfcmVsZWFzZV9wYWdlcyh2Y3B1KTsKIAljYXNlIDB4NDQ6CiAJCXJldHVybiBfX2RpYWdfdGltZV9zbGljZV9lbmQodmNwdSk7CiAJY2FzZSAweDMwODoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMgYi9hcmNoL3MzOTAva3ZtL2ludGVycnVwdC5jCmluZGV4IGM5YWViNGIuLjg3YzE2NzAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMKKysrIGIvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYwpAQCAtMzgsNiArMzgsMTEgQEAKIAkJCQkgICAgICBzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGkpCiB7CiAJc3dpdGNoIChpbnRpLT50eXBlKSB7CisJY2FzZSBLVk1fUzM5MF9JTlRfRVhURVJOQUxfQ0FMTDoKKwkJaWYgKHBzd19leHRpbnRfZGlzYWJsZWQodmNwdSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbMF0gJiAweDIwMDB1bCkKKwkJCXJldHVybiAxOwogCWNhc2UgS1ZNX1MzOTBfSU5UX0VNRVJHRU5DWToKIAkJaWYgKHBzd19leHRpbnRfZGlzYWJsZWQodmNwdSkpCiAJCQlyZXR1cm4gMDsKQEAgLTk4LDYgKzEwMyw3IEBACiAJCQkJICAgICAgc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpKQogewogCXN3aXRjaCAoaW50aS0+dHlwZSkgeworCWNhc2UgS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEw6CiAJY2FzZSBLVk1fUzM5MF9JTlRfRU1FUkdFTkNZOgogCWNhc2UgS1ZNX1MzOTBfSU5UX1NFUlZJQ0U6CiAJY2FzZSBLVk1fUzM5MF9JTlRfVklSVElPOgpAQCAtMTQzLDYgKzE0OSwyOCBAQAogCQkJZXhjZXB0aW9uID0gMTsKIAkJYnJlYWs7CiAKKwljYXNlIEtWTV9TMzkwX0lOVF9FWFRFUk5BTF9DQUxMOgorCQlWQ1BVX0VWRU5UKHZjcHUsIDQsICIlcyIsICJpbnRlcnJ1cHQ6IHNpZ3AgZXh0IGNhbGwiKTsKKwkJdmNwdS0+c3RhdC5kZWxpdmVyX2V4dGVybmFsX2NhbGwrKzsKKwkJcmMgPSBwdXRfZ3Vlc3RfdTE2KHZjcHUsIF9fTENfRVhUX0lOVF9DT0RFLCAweDEyMDIpOworCQlpZiAocmMgPT0gLUVGQVVMVCkKKwkJCWV4Y2VwdGlvbiA9IDE7CisKKwkJcmMgPSBwdXRfZ3Vlc3RfdTE2KHZjcHUsIF9fTENfQ1BVX0FERFJFU1MsIGludGktPmV4dGNhbGwuY29kZSk7CisJCWlmIChyYyA9PSAtRUZBVUxUKQorCQkJZXhjZXB0aW9uID0gMTsKKworCQlyYyA9IGNvcHlfdG9fZ3Vlc3QodmNwdSwgX19MQ19FWFRfT0xEX1BTVywKKwkJCSAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3csIHNpemVvZihwc3dfdCkpOworCQlpZiAocmMgPT0gLUVGQVVMVCkKKwkJCWV4Y2VwdGlvbiA9IDE7CisKKwkJcmMgPSBjb3B5X2Zyb21fZ3Vlc3QodmNwdSwgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LAorCQkJX19MQ19FWFRfTkVXX1BTVywgc2l6ZW9mKHBzd190KSk7CisJCWlmIChyYyA9PSAtRUZBVUxUKQorCQkJZXhjZXB0aW9uID0gMTsKKwkJYnJlYWs7CisKIAljYXNlIEtWTV9TMzkwX0lOVF9TRVJWSUNFOgogCQlWQ1BVX0VWRU5UKHZjcHUsIDQsICJpbnRlcnJ1cHQ6IHNjbHAgcGFybToleCIsCiAJCQkgICBpbnRpLT5leHQuZXh0X3BhcmFtcyk7CkBAIC01MjIsNiArNTUwLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBLVk1fUzM5MF9QUk9HUkFNX0lOVDoKIAljYXNlIEtWTV9TMzkwX1NJR1BfU1RPUDoKKwljYXNlIEtWTV9TMzkwX0lOVF9FWFRFUk5BTF9DQUxMOgogCWNhc2UgS1ZNX1MzOTBfSU5UX0VNRVJHRU5DWToKIAlkZWZhdWx0OgogCQlrZnJlZShpbnRpKTsKQEAgLTU4MSw2ICs2MTAsNyBAQAogCQlicmVhazsKIAljYXNlIEtWTV9TMzkwX1NJR1BfU1RPUDoKIAljYXNlIEtWTV9TMzkwX1JFU1RBUlQ6CisJY2FzZSBLVk1fUzM5MF9JTlRfRVhURVJOQUxfQ0FMTDoKIAljYXNlIEtWTV9TMzkwX0lOVF9FTUVSR0VOQ1k6CiAJCVZDUFVfRVZFTlQodmNwdSwgMywgImluamVjdDogdHlwZSAleCIsIHMzOTBpbnQtPnR5cGUpOwogCQlpbnRpLT50eXBlID0gczM5MGludC0+dHlwZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwppbmRleCBkYzJiNTgwLi4wYmQzYmVhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCkBAIC00Niw2ICs0Niw3IEBACiAJeyAiaW5zdHJ1Y3Rpb25fbGN0bGciLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fbGN0bGcpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fbGN0bCIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9sY3RsKSB9LAogCXsgImRlbGl2ZXJfZW1lcmdlbmN5X3NpZ25hbCIsIFZDUFVfU1RBVChkZWxpdmVyX2VtZXJnZW5jeV9zaWduYWwpIH0sCisJeyAiZGVsaXZlcl9leHRlcm5hbF9jYWxsIiwgVkNQVV9TVEFUKGRlbGl2ZXJfZXh0ZXJuYWxfY2FsbCkgfSwKIAl7ICJkZWxpdmVyX3NlcnZpY2Vfc2lnbmFsIiwgVkNQVV9TVEFUKGRlbGl2ZXJfc2VydmljZV9zaWduYWwpIH0sCiAJeyAiZGVsaXZlcl92aXJ0aW9faW50ZXJydXB0IiwgVkNQVV9TVEFUKGRlbGl2ZXJfdmlydGlvX2ludGVycnVwdCkgfSwKIAl7ICJkZWxpdmVyX3N0b3Bfc2lnbmFsIiwgVkNQVV9TVEFUKGRlbGl2ZXJfc3RvcF9zaWduYWwpIH0sCkBAIC02NCwxMSArNjUsMTMgQEAKIAl7ICJpbnN0cnVjdGlvbl9zdGZsIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3N0ZmwpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fdHByb3QiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fdHByb3QpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fc2lncF9zZW5zZSIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zaWdwX3NlbnNlKSB9LAorCXsgImluc3RydWN0aW9uX3NpZ3BfZXh0ZXJuYWxfY2FsbCIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zaWdwX2V4dGVybmFsX2NhbGwpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fc2lncF9lbWVyZ2VuY3kiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9lbWVyZ2VuY3kpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fc2lncF9zdG9wIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3NpZ3Bfc3RvcCkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX3NldF9hcmNoIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3NpZ3BfYXJjaCkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX3NldF9wcmVmaXgiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9wcmVmaXgpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fc2lncF9yZXN0YXJ0IiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3NpZ3BfcmVzdGFydCkgfSwKKwl7ICJkaWFnbm9zZV8xMCIsIFZDUFVfU1RBVChkaWFnbm9zZV8xMCkgfSwKIAl7ICJkaWFnbm9zZV80NCIsIFZDUFVfU1RBVChkaWFnbm9zZV80NCkgfSwKIAl7IE5VTEwgfQogfTsKQEAgLTE3NSw2ICsxNzgsOCBAQAogCWlmIChyYykKIAkJZ290byBvdXRfZXJyOwogCisJcmMgPSAtRU5PTUVNOworCiAJa3ZtLT5hcmNoLnNjYSA9IChzdHJ1Y3Qgc2NhX2Jsb2NrICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWt2bS0+YXJjaC5zY2EpCiAJCWdvdG8gb3V0X2VycjsKQEAgLTMxMiwxMSArMzE3LDE3IEBACiBzdHJ1Y3Qga3ZtX3ZjcHUgKmt2bV9hcmNoX3ZjcHVfY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgaWQpCiB7Ci0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bV92Y3B1KSwgR0ZQX0tFUk5FTCk7Ci0JaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJaW50IHJjID0gLUVJTlZBTDsKIAorCWlmIChpZCA+PSBLVk1fTUFYX1ZDUFVTKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVOT01FTTsKKworCXZjcHUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX3ZjcHUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZjcHUpCi0JCWdvdG8gb3V0X25vbWVtOworCQlnb3RvIG91dDsKIAogCXZjcHUtPmFyY2guc2llX2Jsb2NrID0gKHN0cnVjdCBrdm1fczM5MF9zaWVfYmxvY2sgKikKIAkJCQkJZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwpAQCAtMzUyLDcgKzM2Myw3IEBACiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSh2Y3B1LT5hcmNoLnNpZV9ibG9jaykpOwogb3V0X2ZyZWVfY3B1OgogCWtmcmVlKHZjcHUpOwotb3V0X25vbWVtOgorb3V0OgogCXJldHVybiBFUlJfUFRSKHJjKTsKIH0KIApAQCAtMzg2LDYgKzM5Nyw3IEBACiB7CiAJbWVtY3B5KCZ2Y3B1LT5hcmNoLmd1ZXN0X2FjcnMsICZzcmVncy0+YWNycywgc2l6ZW9mKHNyZWdzLT5hY3JzKSk7CiAJbWVtY3B5KCZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyLCAmc3JlZ3MtPmNycywgc2l6ZW9mKHNyZWdzLT5jcnMpKTsKKwlyZXN0b3JlX2FjY2Vzc19yZWdzKHZjcHUtPmFyY2guZ3Vlc3RfYWNycyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwMSw2ICs0MTMsNyBAQAogewogCW1lbWNweSgmdmNwdS0+YXJjaC5ndWVzdF9mcHJlZ3MuZnBycywgJmZwdS0+ZnBycywgc2l6ZW9mKGZwdS0+ZnBycykpOwogCXZjcHUtPmFyY2guZ3Vlc3RfZnByZWdzLmZwYyA9IGZwdS0+ZnBjOworCXJlc3RvcmVfZnBfcmVncygmdmNwdS0+YXJjaC5ndWVzdF9mcHJlZ3MpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL3NpZ3AuYyBiL2FyY2gvczM5MC9rdm0vc2lncC5jCmluZGV4IGQ2YTUwYzEuLmY4MTUxMTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vc2lncC5jCisrKyBiL2FyY2gvczM5MC9rdm0vc2lncC5jCkBAIC04Nyw2ICs4Nyw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaW50aS0+dHlwZSA9IEtWTV9TMzkwX0lOVF9FTUVSR0VOQ1k7CisJaW50aS0+ZW1lcmcuY29kZSA9IHZjcHUtPnZjcHVfaWQ7CiAKIAlzcGluX2xvY2soJmZpLT5sb2NrKTsKIAlsaSA9IGZpLT5sb2NhbF9pbnRbY3B1X2FkZHJdOwpAQCAtMTAzLDkgKzEwNCw0NyBAQAogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxpLT53cSk7CiAJc3Bpbl91bmxvY2tfYmgoJmxpLT5sb2NrKTsKIAlyYyA9IDA7IC8qIG9yZGVyIGFjY2VwdGVkICovCisJVkNQVV9FVkVOVCh2Y3B1LCA0LCAic2VudCBzaWdwIGVtZXJnIHRvIGNwdSAleCIsIGNwdV9hZGRyKTsKIHVubG9jazoKIAlzcGluX3VubG9jaygmZmktPmxvY2spOwotCVZDUFVfRVZFTlQodmNwdSwgNCwgInNlbnQgc2lncCBlbWVyZyB0byBjcHUgJXgiLCBjcHVfYWRkcik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fc2lncF9leHRlcm5hbF9jYWxsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTE2IGNwdV9hZGRyKQoreworCXN0cnVjdCBrdm1fczM5MF9mbG9hdF9pbnRlcnJ1cHQgKmZpID0gJnZjcHUtPmt2bS0+YXJjaC5mbG9hdF9pbnQ7CisJc3RydWN0IGt2bV9zMzkwX2xvY2FsX2ludGVycnVwdCAqbGk7CisJc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpOworCWludCByYzsKKworCWlmIChjcHVfYWRkciA+PSBLVk1fTUFYX1ZDUFVTKQorCQlyZXR1cm4gMzsgLyogbm90IG9wZXJhdGlvbmFsICovCisKKwlpbnRpID0ga3phbGxvYyhzaXplb2YoKmludGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWludGkpCisJCXJldHVybiAtRU5PTUVNOworCisJaW50aS0+dHlwZSA9IEtWTV9TMzkwX0lOVF9FWFRFUk5BTF9DQUxMOworCWludGktPmV4dGNhbGwuY29kZSA9IHZjcHUtPnZjcHVfaWQ7CisKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKKwlsaSA9IGZpLT5sb2NhbF9pbnRbY3B1X2FkZHJdOworCWlmIChsaSA9PSBOVUxMKSB7CisJCXJjID0gMzsgLyogbm90IG9wZXJhdGlvbmFsICovCisJCWtmcmVlKGludGkpOworCQlnb3RvIHVubG9jazsKKwl9CisJc3Bpbl9sb2NrX2JoKCZsaS0+bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmaW50aS0+bGlzdCwgJmxpLT5saXN0KTsKKwlhdG9taWNfc2V0KCZsaS0+YWN0aXZlLCAxKTsKKwlhdG9taWNfc2V0X21hc2soQ1BVU1RBVF9FWFRfSU5ULCBsaS0+Y3B1ZmxhZ3MpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZsaS0+d3EpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxpLT53cSk7CisJc3Bpbl91bmxvY2tfYmgoJmxpLT5sb2NrKTsKKwlyYyA9IDA7IC8qIG9yZGVyIGFjY2VwdGVkICovCisJVkNQVV9FVkVOVCh2Y3B1LCA0LCAic2VudCBzaWdwIGV4dCBjYWxsIHRvIGNwdSAleCIsIGNwdV9hZGRyKTsKK3VubG9jazoKKwlzcGluX3VubG9jaygmZmktPmxvY2spOwogCXJldHVybiByYzsKIH0KIApAQCAtMjY3LDYgKzMwNiwxMCBAQAogCQlyYyA9IF9fc2lncF9zZW5zZSh2Y3B1LCBjcHVfYWRkciwKIAkJCQkgICZ2Y3B1LT5hcmNoLmd1ZXN0X2dwcnNbcjFdKTsKIAkJYnJlYWs7CisJY2FzZSBTSUdQX0VYVEVSTkFMX0NBTEw6CisJCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fc2lncF9leHRlcm5hbF9jYWxsKys7CisJCXJjID0gX19zaWdwX2V4dGVybmFsX2NhbGwodmNwdSwgY3B1X2FkZHIpOworCQlicmVhazsKIAljYXNlIFNJR1BfRU1FUkdFTkNZOgogCQl2Y3B1LT5zdGF0Lmluc3RydWN0aW9uX3NpZ3BfZW1lcmdlbmN5Kys7CiAJCXJjID0gX19zaWdwX2VtZXJnZW5jeSh2Y3B1LCBjcHVfYWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL2RlbGF5LmMgYi9hcmNoL3MzOTAvbGliL2RlbGF5LmMKaW5kZXggYTY1MjI5ZC4uZGI5MmYwNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi9kZWxheS5jCisrKyBiL2FyY2gvczM5MC9saWIvZGVsYXkuYwpAQCAtMzIsNyArMzIsOCBAQAogCXU2NCBjbG9ja19zYXZlZDsKIAl1NjQgZW5kOwogCi0JbWFzayA9IHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX1dBSVQgfCBQU1dfTUFTS19FWFQ7CisJbWFzayA9IHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX0RBVCB8IFBTV19NQVNLX1dBSVQgfAorCQlQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19NQ0hFQ0s7CiAJZW5kID0gZ2V0X2Nsb2NrKCkgKyAodXNlY3MgPDwgMTIpOwogCWNsb2NrX3NhdmVkID0gbG9jYWxfdGlja19kaXNhYmxlKCk7CiAJX19jdGxfc3RvcmUoY3IwX3NhdmVkLCAwLCAwKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvdWFjY2Vzc19wdC5jIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMKaW5kZXggNzQ4MzM4My4uMzQyYWUzNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMKKysrIGIvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMKQEAgLTM0Miw3ICszNDIsOCBAQAogCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKQogCQlyZXR1cm4gX19mdXRleF9hdG9taWNfb3BfcHQob3AsIHVhZGRyLCBvcGFyZywgb2xkKTsKIAlzcGluX2xvY2soJmN1cnJlbnQtPm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCXVhZGRyID0gKGludCBfX3VzZXIgKikgX19kYXRfdXNlcl9hZGRyKCh1bnNpZ25lZCBsb25nKSB1YWRkcik7CisJdWFkZHIgPSAodTMyIF9fZm9yY2UgX191c2VyICopCisJCV9fZGF0X3VzZXJfYWRkcigoX19mb3JjZSB1bnNpZ25lZCBsb25nKSB1YWRkcik7CiAJaWYgKCF1YWRkcikgewogCQlzcGluX3VubG9jaygmY3VycmVudC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMzc4LDcgKzM3OSw4IEBACiAJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpCiAJCXJldHVybiBfX2Z1dGV4X2F0b21pY19jbXB4Y2hnX3B0KHV2YWwsIHVhZGRyLCBvbGR2YWwsIG5ld3ZhbCk7CiAJc3Bpbl9sb2NrKCZjdXJyZW50LT5tbS0+cGFnZV90YWJsZV9sb2NrKTsKLQl1YWRkciA9IChpbnQgX191c2VyICopIF9fZGF0X3VzZXJfYWRkcigodW5zaWduZWQgbG9uZykgdWFkZHIpOworCXVhZGRyID0gKHUzMiBfX2ZvcmNlIF9fdXNlciAqKQorCQlfX2RhdF91c2VyX2FkZHIoKF9fZm9yY2UgdW5zaWduZWQgbG9uZykgdWFkZHIpOwogCWlmICghdWFkZHIpIHsKIAkJc3Bpbl91bmxvY2soJmN1cnJlbnQtPm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9mYXVsdC5jIGIvYXJjaC9zMzkwL21tL2ZhdWx0LmMKaW5kZXggOTU2NGZjNy4uMTc2NmRlZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9zMzkwL21tL2ZhdWx0LmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BHU1RFCiAJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGN1cnJlbnQsIFRJRl9TSUUpICYmIFMzOTBfbG93Y29yZS5nbWFwKSB7Ci0JCWFkZHJlc3MgPSBnbWFwX2ZhdWx0KGFkZHJlc3MsCisJCWFkZHJlc3MgPSBfX2dtYXBfZmF1bHQoYWRkcmVzcywKIAkJCQkgICAgIChzdHJ1Y3QgZ21hcCAqKSBTMzkwX2xvd2NvcmUuZ21hcCk7CiAJCWlmIChhZGRyZXNzID09IC1FRkFVTFQpIHsKIAkJCWZhdWx0ID0gVk1fRkFVTFRfQkFETUFQOwpAQCAtMzkzLDcgKzM5Myw3IEBACiAJaW50IGZhdWx0OwogCiAJLyogUHJvdGVjdGlvbiBleGNlcHRpb24gaXMgc3VwcHJlc3NpbmcsIGRlY3JlbWVudCBwc3cgYWRkcmVzcy4gKi8KLQlyZWdzLT5wc3cuYWRkciAtPSAocGdtX2ludF9jb2RlID4+IDE2KTsKKwlyZWdzLT5wc3cuYWRkciA9IF9fcmV3aW5kX3BzdyhyZWdzLT5wc3csIHBnbV9pbnRfY29kZSA+PiAxNik7CiAJLyoKIAkgKiBDaGVjayBmb3IgbG93LWFkZHJlc3MgcHJvdGVjdGlvbi4gIFRoaXMgbmVlZHMgdG8gYmUgdHJlYXRlZAogCSAqIGFzIGEgc3BlY2lhbCBjYXNlIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGV4Y2VwdGlvbiBjb2RlCkBAIC00NTQsNyArNDU0LDcgQEAKIAlzdHJ1Y3QgcHRfcmVncyByZWdzOwogCWludCBhY2Nlc3MsIGZhdWx0OwogCi0JcmVncy5wc3cubWFzayA9IHBzd19rZXJuZWxfYml0czsKKwlyZWdzLnBzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfREFUIHwgUFNXX01BU0tfTUNIRUNLOwogCWlmICghaXJxc19kaXNhYmxlZCgpKQogCQlyZWdzLnBzdy5tYXNrIHw9IFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUOwogCXJlZ3MucHN3LmFkZHIgPSAodW5zaWduZWQgbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2d1cC5jIGIvYXJjaC9zMzkwL21tL2d1cC5jCmluZGV4IDQ1YjQwNWMuLjY1Y2IwNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9ndXAuYworKysgYi9hcmNoL3MzOTAvbW0vZ3VwLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJdW5zaWduZWQgbG9uZyBlbmQsIGludCB3cml0ZSwgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50ICpucikKIHsKIAl1bnNpZ25lZCBsb25nIG1hc2ssIHJlc3VsdDsKLQlzdHJ1Y3QgcGFnZSAqaGVhZCwgKnBhZ2U7CisJc3RydWN0IHBhZ2UgKmhlYWQsICpwYWdlLCAqdGFpbDsKIAlpbnQgcmVmczsKIAogCXJlc3VsdCA9IHdyaXRlID8gMCA6IF9TRUdNRU5UX0VOVFJZX1JPOwpAQCAtNjQsNiArNjQsNyBAQAogCXJlZnMgPSAwOwogCWhlYWQgPSBwbWRfcGFnZShwbWQpOwogCXBhZ2UgPSBoZWFkICsgKChhZGRyICYgflBNRF9NQVNLKSA+PiBQQUdFX1NISUZUKTsKKwl0YWlsID0gcGFnZTsKIAlkbyB7CiAJCVZNX0JVR19PTihjb21wb3VuZF9oZWFkKHBhZ2UpICE9IGhlYWQpOwogCQlwYWdlc1sqbnJdID0gcGFnZTsKQEAgLTgxLDYgKzgyLDE3IEBACiAJCSpuciAtPSByZWZzOwogCQl3aGlsZSAocmVmcy0tKQogCQkJcHV0X3BhZ2UoaGVhZCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQW55IHRhaWwgcGFnZSBuZWVkIHRoZWlyIG1hcGNvdW50IHJlZmVyZW5jZSB0YWtlbiBiZWZvcmUgd2UKKwkgKiByZXR1cm4uCisJICovCisJd2hpbGUgKHJlZnMtLSkgeworCQlpZiAoUGFnZVRhaWwodGFpbCkpCisJCQlnZXRfaHVnZV9wYWdlX3RhaWwodGFpbCk7CisJCXRhaWwrKzsKIAl9CiAKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9pbml0LmMgYi9hcmNoL3MzOTAvbW0vaW5pdC5jCmluZGV4IDU5YjY2MzEuLmQ0YjlmYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9pbml0LmMKKysrIGIvYXJjaC9zMzkwL21tL2luaXQuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvaXNvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jIGIvYXJjaC9zMzkwL21tL21hY2Nlc3MuYwppbmRleCA1ZGJiYWE2Li4xY2I4NDI3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jCisrKyBiL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAvKgpAQCAtNjAsNiArNjEsOSBAQAogCXJldHVybiBjb3BpZWQgPCAwID8gLUVGQVVMVCA6IDA7CiB9CiAKKy8qCisgKiBDb3B5IG1lbW9yeSBpbiByZWFsIG1vZGUgKGtlcm5lbCB0byBrZXJuZWwpCisgKi8KIGludCBtZW1jcHlfcmVhbCh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9kZXN0IGFzbSgiMiIpID0gKHVuc2lnbmVkIGxvbmcpIGRlc3Q7CkBAIC0xMDEsMyArMTA1LDU1IEBACiAJX19jdGxfbG9hZChjcjAsIDAsIDApOwogCXByZWVtcHRfZW5hYmxlKCk7CiB9CisKKy8qCisgKiBDb3B5IG1lbW9yeSBmcm9tIGtlcm5lbCAocmVhbCkgdG8gdXNlciAodmlydHVhbCkKKyAqLworaW50IGNvcHlfdG9fdXNlcl9yZWFsKHZvaWQgX191c2VyICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgb2ZmcyA9IDAsIHNpemUsIHJjOworCWNoYXIgKmJ1ZjsKKworCWJ1ZiA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmMgPSAtRUZBVUxUOworCXdoaWxlIChvZmZzIDwgY291bnQpIHsKKwkJc2l6ZSA9IG1pbihQQUdFX1NJWkUsIGNvdW50IC0gb2Zmcyk7CisJCWlmIChtZW1jcHlfcmVhbChidWYsIHNyYyArIG9mZnMsIHNpemUpKQorCQkJZ290byBvdXQ7CisJCWlmIChjb3B5X3RvX3VzZXIoZGVzdCArIG9mZnMsIGJ1Ziwgc2l6ZSkpCisJCQlnb3RvIG91dDsKKwkJb2ZmcyArPSBzaXplOworCX0KKwlyYyA9IDA7CitvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIENvcHkgbWVtb3J5IGZyb20gdXNlciAodmlydHVhbCkgdG8ga2VybmVsIChyZWFsKQorICovCitpbnQgY29weV9mcm9tX3VzZXJfcmVhbCh2b2lkICpkZXN0LCB2b2lkIF9fdXNlciAqc3JjLCBzaXplX3QgY291bnQpCit7CisJaW50IG9mZnMgPSAwLCBzaXplLCByYzsKKwljaGFyICpidWY7CisKKwlidWYgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCXJjID0gLUVGQVVMVDsKKwl3aGlsZSAob2ZmcyA8IGNvdW50KSB7CisJCXNpemUgPSBtaW4oUEFHRV9TSVpFLCBjb3VudCAtIG9mZnMpOworCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBzcmMgKyBvZmZzLCBzaXplKSkKKwkJCWdvdG8gb3V0OworCQlpZiAobWVtY3B5X3JlYWwoZGVzdCArIG9mZnMsIGJ1Ziwgc2l6ZSkpCisJCQlnb3RvIG91dDsKKwkJb2ZmcyArPSBzaXplOworCX0KKwlyYyA9IDA7CitvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9tbWFwLmMgYi9hcmNoL3MzOTAvbW0vbW1hcC5jCmluZGV4IGM5YTlmN2YuLmYwOWM3NDggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9tbWFwLmMKKysrIGIvYXJjaC9zMzkwL21tL21tYXAuYwpAQCAtMjYsNiArMjYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMgYi9hcmNoL3MzOTAvbW0vcGFnZWF0dHIuYwppbmRleCBkMDEzZWQzLi5iMzY1MzdhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL3MzOTAvbW0vcGFnZWF0dHIuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKIHN0YXRpYyB2b2lkIGNoYW5nZV9wYWdlX2F0dHIodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwppbmRleCA1ZDU2YzJiLi4zMDFjODRkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3LDIwMDkKKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNywyMDExCiAgKiAgICBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSA8c2Nod2lkZWZza3lAZGUuaWJtLmNvbT4KICAqLwogCkBAIC0yMjIsNiArMjIyLDcgQEAKIAogCS8qIEZyZWUgYWxsIHNlZ21lbnQgJiByZWdpb24gdGFibGVzLiAqLwogCWRvd25fcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKKwlzcGluX2xvY2soJmdtYXAtPm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCBuZXh0LCAmZ21hcC0+Y3JzdF9saXN0LCBscnUpIHsKIAkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSBwYWdlX3RvX3BoeXMocGFnZSk7CiAJCWlmICgoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9UWVBFX01BU0spID09IDApCkBAIC0yMzAsNiArMjMxLDcgQEAKIAkJCQlnbWFwX3VubGlua19zZWdtZW50KGdtYXAsIHRhYmxlKTsKIAkJX19mcmVlX3BhZ2VzKHBhZ2UsIEFMTE9DX09SREVSKTsKIAl9CisJc3Bpbl91bmxvY2soJmdtYXAtPm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCXVwX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7CiAJbGlzdF9kZWwoJmdtYXAtPmxpc3QpOwogCWtmcmVlKGdtYXApOwpAQCAtMjU2LDYgKzI1OCw5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnbWFwX2Rpc2FibGUpOwogCisvKgorICogZ21hcF9hbGxvY190YWJsZSBpcyBhc3N1bWVkIHRvIGJlIGNhbGxlZCB3aXRoIG1tYXBfc2VtIGhlbGQKKyAqLwogc3RhdGljIGludCBnbWFwX2FsbG9jX3RhYmxlKHN0cnVjdCBnbWFwICpnbWFwLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnRhYmxlLCB1bnNpZ25lZCBsb25nIGluaXQpCiB7CkBAIC0yNjcsMTQgKzI3MiwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAluZXcgPSAodW5zaWduZWQgbG9uZyAqKSBwYWdlX3RvX3BoeXMocGFnZSk7CiAJY3JzdF90YWJsZV9pbml0KG5ldywgaW5pdCk7Ci0JZG93bl9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOwogCWlmICgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX0lOVikgewogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmZ21hcC0+Y3JzdF9saXN0KTsKIAkJKnRhYmxlID0gKHVuc2lnbmVkIGxvbmcpIG5ldyB8IF9SRUdJT05fRU5UUllfTEVOR1RIIHwKIAkJCSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX1RZUEVfTUFTSyk7CiAJfSBlbHNlCiAJCV9fZnJlZV9wYWdlcyhwYWdlLCBBTExPQ19PUkRFUik7Ci0JdXBfcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjk5LDYgKzMwMiw3IEBACiAKIAlmbHVzaCA9IDA7CiAJZG93bl9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCXNwaW5fbG9jaygmZ21hcC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJZm9yIChvZmYgPSAwOyBvZmYgPCBsZW47IG9mZiArPSBQTURfU0laRSkgewogCQkvKiBXYWxrIHRoZSBndWVzdCBhZGRyIHNwYWNlIHBhZ2UgdGFibGUgKi8KIAkJdGFibGUgPSBnbWFwLT50YWJsZSArICgoKHRvICsgb2ZmKSA+PiA1MykgJiAweDdmZik7CkBAIC0zMjAsNiArMzI0LDcgQEAKIAkJKnRhYmxlID0gX1NFR01FTlRfRU5UUllfSU5WOwogCX0KIG91dDoKKwlzcGluX3VubG9jaygmZ21hcC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJdXBfcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKIAlpZiAoZmx1c2gpCiAJCWdtYXBfZmx1c2hfdGxiKGdtYXApOwpAQCAtMzUwLDYgKzM1NSw3IEBACiAKIAlmbHVzaCA9IDA7CiAJZG93bl9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCXNwaW5fbG9jaygmZ21hcC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJZm9yIChvZmYgPSAwOyBvZmYgPCBsZW47IG9mZiArPSBQTURfU0laRSkgewogCQkvKiBXYWxrIHRoZSBnbWFwIGFkZHJlc3Mgc3BhY2UgcGFnZSB0YWJsZSAqLwogCQl0YWJsZSA9IGdtYXAtPnRhYmxlICsgKCgodG8gKyBvZmYpID4+IDUzKSAmIDB4N2ZmKTsKQEAgLTM3MywxOSArMzc5LDI0IEBACiAJCWZsdXNoIHw9IGdtYXBfdW5saW5rX3NlZ21lbnQoZ21hcCwgdGFibGUpOwogCQkqdGFibGUgPSBfU0VHTUVOVF9FTlRSWV9JTlYgfCBfU0VHTUVOVF9FTlRSWV9STyB8IChmcm9tICsgb2ZmKTsKIAl9CisJc3Bpbl91bmxvY2soJmdtYXAtPm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCXVwX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7CiAJaWYgKGZsdXNoKQogCQlnbWFwX2ZsdXNoX3RsYihnbWFwKTsKIAlyZXR1cm4gMDsKIAogb3V0X3VubWFwOgorCXNwaW5fdW5sb2NrKCZnbWFwLT5tbS0+cGFnZV90YWJsZV9sb2NrKTsKIAl1cF9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOwogCWdtYXBfdW5tYXBfc2VnbWVudChnbWFwLCB0bywgbGVuKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdtYXBfbWFwX3NlZ21lbnQpOwogCi11bnNpZ25lZCBsb25nIGdtYXBfZmF1bHQodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZ21hcCAqZ21hcCkKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIHdpdGggbW1hcF9zZW0gaGVsZAorICovCit1bnNpZ25lZCBsb25nIF9fZ21hcF9mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBnbWFwICpnbWFwKQogewogCXVuc2lnbmVkIGxvbmcgKnRhYmxlLCB2bWFkZHIsIHNlZ21lbnQ7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CkBAIC00NDUsMTYgKzQ1Niw3NSBAQAogCQlwYWdlID0gcG1kX3BhZ2UoKnBtZCk7CiAJCW1wID0gKHN0cnVjdCBnbWFwX3BndGFibGUgKikgcGFnZS0+aW5kZXg7CiAJCXJtYXAtPmVudHJ5ID0gdGFibGU7CisJCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJCWxpc3RfYWRkKCZybWFwLT5saXN0LCAmbXAtPm1hcHBlcik7CisJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAkJLyogU2V0IGdtYXAgc2VnbWVudCB0YWJsZSBlbnRyeSB0byBwYWdlIHRhYmxlLiAqLwogCQkqdGFibGUgPSBwbWRfdmFsKCpwbWQpICYgUEFHRV9NQVNLOwogCQlyZXR1cm4gdm1hZGRyIHwgKGFkZHJlc3MgJiB+UE1EX01BU0spOwogCX0KIAlyZXR1cm4gLUVGQVVMVDsKK30KIAordW5zaWduZWQgbG9uZyBnbWFwX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGdtYXAgKmdtYXApCit7CisJdW5zaWduZWQgbG9uZyByYzsKKworCWRvd25fcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKKwlyYyA9IF9fZ21hcF9mYXVsdChhZGRyZXNzLCBnbWFwKTsKKwl1cF9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCisJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ21hcF9mYXVsdCk7CiAKK3ZvaWQgZ21hcF9kaXNjYXJkKHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyB0bywgc3RydWN0IGdtYXAgKmdtYXApCit7CisKKwl1bnNpZ25lZCBsb25nICp0YWJsZSwgYWRkcmVzcywgc2l6ZTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgZ21hcF9wZ3RhYmxlICptcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWRvd25fcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKKwlhZGRyZXNzID0gZnJvbTsKKwl3aGlsZSAoYWRkcmVzcyA8IHRvKSB7CisJCS8qIFdhbGsgdGhlIGdtYXAgYWRkcmVzcyBzcGFjZSBwYWdlIHRhYmxlICovCisJCXRhYmxlID0gZ21hcC0+dGFibGUgKyAoKGFkZHJlc3MgPj4gNTMpICYgMHg3ZmYpOworCQlpZiAodW5saWtlbHkoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9JTlYpKSB7CisJCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9PUklHSU4pOworCQl0YWJsZSA9IHRhYmxlICsgKChhZGRyZXNzID4+IDQyKSAmIDB4N2ZmKTsKKwkJaWYgKHVubGlrZWx5KCp0YWJsZSAmIF9SRUdJT05fRU5UUllfSU5WKSkgeworCQkJYWRkcmVzcyA9IChhZGRyZXNzICsgUE1EX1NJWkUpICYgUE1EX01BU0s7CisJCQljb250aW51ZTsKKwkJfQorCQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopKCp0YWJsZSAmIF9SRUdJT05fRU5UUllfT1JJR0lOKTsKKwkJdGFibGUgPSB0YWJsZSArICgoYWRkcmVzcyA+PiAzMSkgJiAweDdmZik7CisJCWlmICh1bmxpa2VseSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX0lOVikpIHsKKwkJCWFkZHJlc3MgPSAoYWRkcmVzcyArIFBNRF9TSVpFKSAmIFBNRF9NQVNLOworCQkJY29udGludWU7CisJCX0KKwkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX09SSUdJTik7CisJCXRhYmxlID0gdGFibGUgKyAoKGFkZHJlc3MgPj4gMjApICYgMHg3ZmYpOworCQlpZiAodW5saWtlbHkoKnRhYmxlICYgX1NFR01FTlRfRU5UUllfSU5WKSkgeworCQkJYWRkcmVzcyA9IChhZGRyZXNzICsgUE1EX1NJWkUpICYgUE1EX01BU0s7CisJCQljb250aW51ZTsKKwkJfQorCQlwYWdlID0gcGZuX3RvX3BhZ2UoKnRhYmxlID4+IFBBR0VfU0hJRlQpOworCQltcCA9IChzdHJ1Y3QgZ21hcF9wZ3RhYmxlICopIHBhZ2UtPmluZGV4OworCQl2bWEgPSBmaW5kX3ZtYShnbWFwLT5tbSwgbXAtPnZtYWRkcik7CisJCXNpemUgPSBtaW4odG8gLSBhZGRyZXNzLCBQTURfU0laRSAtIChhZGRyZXNzICYgflBNRF9NQVNLKSk7CisJCXphcF9wYWdlX3JhbmdlKHZtYSwgbXAtPnZtYWRkciB8IChhZGRyZXNzICYgflBNRF9NQVNLKSwKKwkJCSAgICAgICBzaXplLCBOVUxMKTsKKwkJYWRkcmVzcyA9IChhZGRyZXNzICsgUE1EX1NJWkUpICYgUE1EX01BU0s7CisJfQorCXVwX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnbWFwX2Rpc2NhcmQpOworCiB2b2lkIGdtYXBfdW5tYXBfbm90aWZpZXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgKnRhYmxlKQogewogCXN0cnVjdCBnbWFwX3JtYXAgKnJtYXAsICpuZXh0OwpAQCAtNjYyLDggKzczMiw5IEBACiAKIHZvaWQgX190bGJfcmVtb3ZlX3RhYmxlKHZvaWQgKl90YWJsZSkKIHsKLQl2b2lkICp0YWJsZSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSBfdGFibGUgJiBQQUdFX01BU0spOwotCXVuc2lnbmVkIHR5cGUgPSAodW5zaWduZWQgbG9uZykgX3RhYmxlICYgflBBR0VfTUFTSzsKKwljb25zdCB1bnNpZ25lZCBsb25nIG1hc2sgPSAoRlJBR19NQVNLIDw8IDQpIHwgRlJBR19NQVNLOworCXZvaWQgKnRhYmxlID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpIF90YWJsZSAmIH5tYXNrKTsKKwl1bnNpZ25lZCB0eXBlID0gKHVuc2lnbmVkIGxvbmcpIF90YWJsZSAmIG1hc2s7CiAKIAlpZiAodHlwZSkKIAkJX19wYWdlX3RhYmxlX2ZyZWVfcmN1KHRhYmxlLCB0eXBlKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS92bWVtLmMgYi9hcmNoL3MzOTAvbW0vdm1lbS5jCmluZGV4IDc4MWZmNTEuLjQ3OTkzODMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS92bWVtLmMKKysrIGIvYXJjaC9zMzkwL21tL3ZtZW0uYwpAQCAtMzM1LDYgKzMzNSw5IEBACiAJcm9fc3RhcnQgPSAoKHVuc2lnbmVkIGxvbmcpJl9zdGV4dCkgJiBQQUdFX01BU0s7CiAJcm9fZW5kID0gUEZOX0FMSUdOKCh1bnNpZ25lZCBsb25nKSZfZXNoYXJlZCk7CiAJZm9yIChpID0gMDsgaSA8IE1FTU9SWV9DSFVOS1MgJiYgbWVtb3J5X2NodW5rW2ldLnNpemUgPiAwOyBpKyspIHsKKwkJaWYgKG1lbW9yeV9jaHVua1tpXS50eXBlID09IENIVU5LX0NSQVNISyB8fAorCQkgICAgbWVtb3J5X2NodW5rW2ldLnR5cGUgPT0gQ0hVTktfT0xETUVNKQorCQkJY29udGludWU7CiAJCXN0YXJ0ID0gbWVtb3J5X2NodW5rW2ldLmFkZHI7CiAJCWVuZCA9IG1lbW9yeV9jaHVua1tpXS5hZGRyICsgbWVtb3J5X2NodW5rW2ldLnNpemU7CiAJCWlmIChzdGFydCA+PSByb19lbmQgfHwgZW5kIDw9IHJvX3N0YXJ0KQpAQCAtMzY4LDYgKzM3MSw5IEBACiAJZm9yIChpID0gMDsgaSA8IE1FTU9SWV9DSFVOS1M7IGkrKykgewogCQlpZiAoIW1lbW9yeV9jaHVua1tpXS5zaXplKQogCQkJY29udGludWU7CisJCWlmIChtZW1vcnlfY2h1bmtbaV0udHlwZSA9PSBDSFVOS19DUkFTSEsgfHwKKwkJICAgIG1lbW9yeV9jaHVua1tpXS50eXBlID09IENIVU5LX09MRE1FTSkKKwkJCWNvbnRpbnVlOwogCQlzZWcgPSBremFsbG9jKHNpemVvZigqc2VnKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghc2VnKQogCQkJcGFuaWMoIk91dCBvZiBtZW1vcnkuLi5cbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL29wcm9maWxlL2h3c2FtcGxlci5jIGIvYXJjaC9zMzkwL29wcm9maWxlL2h3c2FtcGxlci5jCmluZGV4IDQ1NTJjZTQuLmY0M2MwZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9vcHJvZmlsZS9od3NhbXBsZXIuYworKysgYi9hcmNoL3MzOTAvb3Byb2ZpbGUvaHdzYW1wbGVyLmMKQEAgLTk5NCw3ICs5OTQsNyBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAhMCBvbiBmYWlsdXJlLgogICovCi1pbnQgaHdzYW1wbGVyX2RlYWxsb2NhdGUoKQoraW50IGh3c2FtcGxlcl9kZWFsbG9jYXRlKHZvaWQpCiB7CiAJaW50IHJjOwogCkBAIC0xMDM1LDcgKzEwMzUsNyBAQAogCXJldHVybiBjYi0+c2FtcGxlX292ZXJmbG93OwogfQogCi1pbnQgaHdzYW1wbGVyX3NldHVwKCkKK2ludCBod3NhbXBsZXJfc2V0dXAodm9pZCkKIHsKIAlpbnQgcmM7CiAJaW50IGNwdTsKQEAgLTExMDIsNyArMTEwMiw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgaHdzYW1wbGVyX3NodXRkb3duKCkKK2ludCBod3NhbXBsZXJfc2h1dGRvd24odm9pZCkKIHsKIAlpbnQgcmM7CiAKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsICEwIG9uIGZhaWx1cmUuCiAgKi8KLWludCBod3NhbXBsZXJfc3RvcF9hbGwoKQoraW50IGh3c2FtcGxlcl9zdG9wX2FsbCh2b2lkKQogewogCWludCB0bXBfcmMsIHJjLCBjcHU7CiAJc3RydWN0IGh3c19jcHVfYnVmZmVyICpjYjsKZGlmZiAtLWdpdCBhL2FyY2gvc2NvcmUvS2NvbmZpZyBiL2FyY2gvc2NvcmUvS2NvbmZpZwppbmRleCAyODhhZGQ4Li5kZjE2OWU4IDEwMDY0NAotLS0gYS9hcmNoL3Njb3JlL0tjb25maWcKKysrIGIvYXJjaC9zY29yZS9LY29uZmlnCkBAIC01MiwxNiArNTIsNiBAQAogY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBTQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVIKLQlkZWZfYm9vbCB5Ci0KLWNvbmZpZyBHRU5FUklDX1NZU0NBTExfVEFCTEUKLQlkZWZfYm9vbCB5Ci0KLWNvbmZpZyBTQ09SRV9MMV9DQUNIRV9TSElGVAotCWludAotCWRlZmF1bHQgIjQiCi0KIG1lbnUgIktlcm5lbCB0eXBlIgogCiBjb25maWcgMzJCSVQKQEAgLTk2LDE1ICs4Niw2IEBACiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCi1jb25maWcgUFJPQkVfSU5JVFJEX0hFQURFUgotCWJvb2wgIlByb2JlIGluaXRyZCBoZWFkZXIgY3JlYXRlZCBieSBhZGRpbml0cmQiCi0JZGVwZW5kcyBvbiBCTEtfREVWX0lOSVRSRAotCWhlbHAKLQkgIFByb2JlIGluaXRyZCBoZWFkZXIgYXQgdGhlIGxhc3QgcGFnZSBvZiBrZXJuZWwgaW1hZ2UuCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgYXJjaC9zY29yZS9ib290L2FkZGluaXRyZC5jIHRvCi0JICBhZGQgaW5pdHJkIG9yIGluaXRyYW1mcyBpbWFnZSB0byB0aGUga2VybmVsIGltYWdlLgotCSAgT3RoZXJ3aXNlLCBzYXkgTi4KLQogY29uZmlnIE1NVQogCWRlZl9ib29sIHkKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnIGIvYXJjaC9zaC9LY29uZmlnCmluZGV4IGZmOTE3N2MuLjU2MjllMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvS2NvbmZpZworKysgYi9hcmNoL3NoL0tjb25maWcKQEAgLTEwMSwxMCArMTAxLDYgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBTTVAgJiYgUFJFRU1QVAogCi1jb25maWcgU1lTX1NVUFBPUlRTX1BNCi0JYm9vbAotCWRlcGVuZHMgb24gIVNNUAotCiBjb25maWcgQVJDSF9TVVNQRU5EX1BPU1NJQkxFCiAJZGVmX2Jvb2wgbgogCkBAIC02NDksNyArNjQ1LDcgQEAKIAkgIGEgc3BlY2lhbGx5IHJlc2VydmVkIHJlZ2lvbiBhbmQgdGhlbiBsYXRlciBleGVjdXRlZCBhZnRlcgogCSAgYSBjcmFzaCBieSBrZHVtcC9rZXhlYy4gVGhlIGNyYXNoIGR1bXAga2VybmVsIG11c3QgYmUgY29tcGlsZWQKIAkgIHRvIGEgbWVtb3J5IGFkZHJlc3Mgbm90IHVzZWQgYnkgdGhlIG1haW4ga2VybmVsIHVzaW5nCi0JICBNRU1PUllfU1RBUlQuCisJICBQSFlTSUNBTF9TVEFSVC4KIAogCSAgRm9yIG1vcmUgZGV0YWlscyBzZWUgRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKIApAQCAtNjYwLDYgKzY1NiwxNyBAQAogCSAgSnVtcCBiZXR3ZWVuIG9yaWdpbmFsIGtlcm5lbCBhbmQga2V4ZWNlZCBrZXJuZWwgYW5kIGludm9rZQogCSAgY29kZSB2aWEgS0VYRUMKIAorY29uZmlnIFBIWVNJQ0FMX1NUQVJUCisJaGV4ICJQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkIiBpZiAoRVhQRVJUIHx8IENSQVNIX0RVTVApCisJZGVmYXVsdCBNRU1PUllfU1RBUlQKKwktLS1oZWxwLS0tCisJICBUaGlzIGdpdmVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkCisJICBhbmQgaXMgb3JkaW5hcmlseSB0aGUgc2FtZSBhcyBNRU1PUllfU1RBUlQuCisKKwkgIERpZmZlcmVudCB2YWx1ZXMgYXJlIHByaW1hcmlseSB1c2VkIGluIHRoZSBjYXNlIG9mIGtleGVjIG9uIHBhbmljCisJICB3aGVyZSB0aGUgZmFpbCBzYWZlIGtlcm5lbCBuZWVkcyB0byBydW4gYXQgYSBkaWZmZXJlbnQgYWRkcmVzcworCSAgdGhhbiB0aGUgcGFuaWMtZWQga2VybmVsLgorCiBjb25maWcgU0VDQ09NUAogCWJvb2wgIkVuYWJsZSBzZWNjb21wIHRvIHNhZmVseSBjb21wdXRlIHVudHJ1c3RlZCBieXRlY29kZSIKIAlkZXBlbmRzIG9uIFBST0NfRlMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvTWFrZWZpbGUgYi9hcmNoL3NoL01ha2VmaWxlCmluZGV4IDk5Mzg1ZDAuLjNmYzBmNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9NYWtlZmlsZQpAQCAtODAsNiArODAsNyBAQAogZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIX1VSUVVFTEwpCQk6PSB1SW1hZ2UKIGRlZmF1bHRpbWFnZS0kKENPTkZJR19TSF9NSUdPUikJCQk6PSB1SW1hZ2UKIGRlZmF1bHRpbWFnZS0kKENPTkZJR19TSF9BUDMyNVJYQSkJCTo9IHVJbWFnZQorZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIX1NINzc1N0xDUikJCTo9IHVJbWFnZQogZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIXzc3MjRfU09MVVRJT05fRU5HSU5FKQk6PSB1SW1hZ2UKIGRlZmF1bHRpbWFnZS0kKENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSkJOj0gdm1saW51eAogZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FKQk6PSB2bWxpbnV4CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1lc3B0LmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1lc3B0LmMKaW5kZXggOWRhOTJhYy4uYjNhZTlkMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtZXNwdC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWVzcHQuYwpAQCAtMTMsOSArMTMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaF9ldGguaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotI2luY2x1ZGUgPGFzbS9zaF9ldGguaD4KIAogLyogTk9SIEZsYXNoICovCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZXNwdF9ub3JfZmxhc2hfcGFydGl0aW9uc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2VjdXJlZWRnZTU0MTAuYyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNlY3VyZWVkZ2U1NDEwLmMKaW5kZXggZjk2OGYxNy4uMDM4MjBjMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2VjdXJlZWRnZTU0MTAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zZWN1cmVlZGdlNTQxMC5jCkBAIC00MSw4ICs0MSw3IEBACiAJcHJpbnRrKCJTbmFwR2VhcjogRXJhc2VDb25maWcgaW5pdFxuIik7CiAKIAkvKiBTZXR1cCAiRXJhc2VDb25maWciIHN3aXRjaCBvbiBleHRlcm5hbCBJUlEgMCAqLwotCWlmIChyZXF1ZXN0X2lycShpcnEsIGVyYXNlY29uZmlnX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKLQkJCQkiRXJhc2UgQ29uZmlnIiwgTlVMTCkpCisJaWYgKHJlcXVlc3RfaXJxKGlycSwgZXJhc2Vjb25maWdfaW50ZXJydXB0LCAwLCAiRXJhc2UgQ29uZmlnIiwgTlVMTCkpCiAJCXByaW50aygiU25hcEdlYXI6IGZhaWxlZCB0byByZWdpc3RlciBJUlElZCBmb3IgUmVzZXQgd2l0Y2hcbiIsCiAJCQkJaXJxKTsKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zaDc3NTdsY3IuYyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc1N2xjci5jCmluZGV4IGZhMmEyMDguLmVjOGM4NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc1N2xjci5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc1N2xjci5jCkBAIC0xOCw4ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2hfbW1jaWYuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF9ldGguaD4KICNpbmNsdWRlIDxjcHUvc2g3NzU3Lmg+Ci0jaW5jbHVkZSA8YXNtL3NoX2V0aC5oPgogI2luY2x1ZGUgPGFzbS9oZWFydGJlYXQuaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKaW5kZXggZDM2MjY1Ny4uNzAzMGY0YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwpAQCAtMzQ1LDkgKzM0NSwxMCBAQAogCQkud2lkdGggPSA2NDAsCiAJCS5oZWlnaHQgPSA0ODAsCiAJfSwKLQkuYnVzX3BhcmFtID0gU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAotCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fTUFTVEVSIHwgU09DQU1fREFUQVdJRFRIXzggfAotCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0gsCisJLm1idXNfcGFyYW0gPSBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX01BU1RFUiB8CisJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwKKwlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCwKKwkubWJ1c190eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMLAogCS5zZXRfY2FwdHVyZSA9IGNhbWVyYV9zZXRfY2FwdHVyZSwKIH07CiAKQEAgLTUwMSw4ICs1MDIsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBvdjc3MnhfY2FtZXJhX2luZm8gb3Y3NzI1X2luZm8gPSB7Ci0JLmZsYWdzCQk9IE9WNzcyWF9GTEFHX1ZGTElQIHwgT1Y3NzJYX0ZMQUdfSEZMSVAgfCBcCi0JCQkgIE9WNzcyWF9GTEFHXzhCSVQsCisJLmZsYWdzCQk9IE9WNzcyWF9GTEFHX1ZGTElQIHwgT1Y3NzJYX0ZMQUdfSEZMSVAsCiAJLmVkZ2VjdHJsCT0gT1Y3NzJYX0FVVE9fRURHRUNUUkwoMHhmLCAwKSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtY2F5bWFuL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vaXJxLmMKaW5kZXggMzExYmNlYi4uNzI0ZThiNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vaXJxLmMKQEAgLTQ2LDEzICs0NiwxMSBAQAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY2F5bWFuX2FjdGlvbl9zbXNjID0gewogCS5uYW1lCQk9ICJDYXltYW4gU01TQyBNdXgiLAogCS5oYW5kbGVyCT0gY2F5bWFuX2ludGVycnVwdF9zbXNjLAotCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVELAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY2F5bWFuX2FjdGlvbl9wY2kyID0gewogCS5uYW1lCQk9ICJDYXltYW4gUENJMiBNdXgiLAogCS5oYW5kbGVyCT0gY2F5bWFuX2ludGVycnVwdF9wY2kyLAotCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVELAogfTsKIAogc3RhdGljIHZvaWQgZW5hYmxlX2NheW1hbl9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCmluZGV4IGIyNGQ2OWQuLjkyZGRjZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKQEAgLTI4LDEzICsyOCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9tbWNfc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zaF9rZXlzYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX2V0aC5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CiAjaW5jbHVkZSA8c291bmQvc2hfZnNpLmg+CiAjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NldS5oPgogI2luY2x1ZGUgPG1lZGlhL3R3OTkxMC5oPgogI2luY2x1ZGUgPG1lZGlhL210OXQxMTIuaD4KICNpbmNsdWRlIDxhc20vaGVhcnRiZWF0Lmg+Ci0jaW5jbHVkZSA8YXNtL3NoX2V0aC5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8Y3B1L3NoNzcyNC5oPgpAQCAtMjQ4LDYgKzI0OCwxMCBAQAogCS5kcml2ZXJfcGFyYW0gPSB7CiAJCS5idXN3YWl0X2J3YWl0CQk9IDQsCiAJCS5kZXRlY3Rpb25fZGVsYXkJPSA1LAorCQkuZDBfdHhfaWQgPSBTSERNQV9TTEFWRV9VU0IxRDBfVFgsCisJCS5kMF9yeF9pZCA9IFNIRE1BX1NMQVZFX1VTQjFEMF9SWCwKKwkJLmQxX3R4X2lkID0gU0hETUFfU0xBVkVfVVNCMUQxX1RYLAorCQkuZDFfcnhfaWQgPSBTSERNQV9TTEFWRV9VU0IxRDFfUlgsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtaHA2eHgvaHA2eHhfYXBtLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWhwNnh4L2hwNnh4X2FwbS5jCmluZGV4IGI0OTUzNWMuLjg2NWQ4ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtaHA2eHgvaHA2eHhfYXBtLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1ocDZ4eC9ocDZ4eF9hcG0uYwpAQCAtODYsNyArODYsNyBAQAogCWludCByZXQ7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShIUDY4MF9CVE5fSVJRLCBocDZ4MF9hcG1faW50ZXJydXB0LAotCQkJICBJUlFGX0RJU0FCTEVELCBNT0ROQU1FLCBOVUxMKTsKKwkJCSAgMCwgTU9ETkFNRSwgTlVMTCk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CiAJCXByaW50ayhLRVJOX0VSUiBNT0ROQU1FICI6IElSUSAlZCByZXF1ZXN0IGZhaWxlZFxuIiwKIAkJICAgICAgIEhQNjgwX0JUTl9JUlEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZXR1cC5jCmluZGV4IDJkNGM5YzguLmU0YzgxMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtbWlnb3Ivc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NldHVwLmMKQEAgLTQ0OCw5ICs0NDgsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG92NzcyeF9jYW1lcmFfaW5mbyBvdjc3MjVfaW5mbyA9IHsKLQkuZmxhZ3MJCT0gT1Y3NzJYX0ZMQUdfOEJJVCwKLX07CitzdGF0aWMgc3RydWN0IG92NzcyeF9jYW1lcmFfaW5mbyBvdjc3MjVfaW5mbzsKIAogc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgb3Y3NzI1X2xpbmsgPSB7CiAJLnBvd2VyCQk9IG92NzcyNV9wb3dlciwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKaW5kZXggZDAwNzU2Ny4uYjc0N2MwYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKQEAgLTIzLDEyICsyMywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvc2hfa2V5c2MuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcjhhNjY1OTcuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF9ldGguaD4KICNpbmNsdWRlIDx2aWRlby9zaF9tb2JpbGVfbGNkYy5oPgogI2luY2x1ZGUgPG1lZGlhL3NoX21vYmlsZV9jZXUuaD4KICNpbmNsdWRlIDxzb3VuZC9zaF9mc2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaGVhcnRiZWF0Lmg+Ci0jaW5jbHVkZSA8YXNtL3NoX2V0aC5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8Y3B1L3NoNzcyNC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zaDc3NjNyZHAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2g3NzYzcmRwL3NldHVwLmMKaW5kZXggZjNkODI4Zi4uZGQwMzZmMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zaDc3NjNyZHAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNoNzc2M3JkcC9zZXR1cC5jCkBAIC0xNyw4ICsxNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2hfZXRoLmg+CiAjaW5jbHVkZSA8bWFjaC9zaDc3NjNyZHAuaD4KLSNpbmNsdWRlIDxhc20vc2hfZXRoLmg+CiAjaW5jbHVkZSA8YXNtL3NoNzc2MGZiLmg+CiAKIC8qIE5PUiBGbGFzaCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib290L01ha2VmaWxlIGIvYXJjaC9zaC9ib290L01ha2VmaWxlCmluZGV4IGJhNTE1ZDguLmU0ZWEzMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2Jvb3QvTWFrZWZpbGUKQEAgLTE5LDYgKzE5LDcgQEAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUCT89IDB4MDA4MDAwMDAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUCT89IDB4MDAwMDEwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQJPz0gMHgwMDAwMTAwMAorQ09ORklHX1BIWVNJQ0FMX1NUQVJUCT89ICQoQ09ORklHX01FTU9SWV9TVEFSVCkKIAogc3VmZml4LXkgOj0gYmluCiBzdWZmaXgtJChDT05GSUdfS0VSTkVMX0daSVApCTo9IGd6CkBAIC00OCw3ICs0OSw3IEBACiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChvYmopL3JvbWltYWdlICRACiAKIEtFUk5FTF9NRU1PUlkJOj0gJChzaGVsbCAvYmluL2Jhc2ggLWMgJ3ByaW50ZiAiMHglMDh4IiBcCi0JCSAgICAgJCRbJChDT05GSUdfTUVNT1JZX1NUQVJUKSAmIDB4MWZmZmZmZmZdJykKKwkJICAgICAkJFskKENPTkZJR19QSFlTSUNBTF9TVEFSVCkgJiAweDFmZmZmZmZmXScpCiAKIEtFUk5FTF9MT0FECTo9ICQoc2hlbGwgL2Jpbi9iYXNoIC1jICdwcmludGYgIjB4JTA4eCIgXAogCQkgICAgICQkWyQoQ09ORklHX1BBR0VfT0ZGU0VUKSAgKyBcCkBAIC0xMTQsNCArMTE1LDUgQEAKIAlAZWNobyAnICBJbWFnZSAkQCBpcyByZWFkeScKIAogZXhwb3J0IENPTkZJR19QQUdFX09GRlNFVCBDT05GSUdfTUVNT1JZX1NUQVJUIENPTkZJR19CT09UX0xJTktfT0ZGU0VUIFwKLSAgICAgICBDT05GSUdfWkVST19QQUdFX09GRlNFVCBDT05GSUdfRU5UUllfT0ZGU0VUIEtFUk5FTF9NRU1PUlkgc3VmZml4LXkKKyAgICAgICBDT05GSUdfUEhZU0lDQUxfU1RBUlQgQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQgQ09ORklHX0VOVFJZX09GRlNFVCBcCisgICAgICAgS0VSTkVMX01FTU9SWSBzdWZmaXgteQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtZzIuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLWcyLmMKaW5kZXggYWY3YmI1OC4uYmU5Y2E3YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtZzIuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1nMi5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoSFdfRVZFTlRfRzJfRE1BLCBnMl9kbWFfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKEhXX0VWRU5UX0cyX0RNQSwgZzJfZG1hX2ludGVycnVwdCwgMCwKIAkJCSAgImcyIERNQSBoYW5kbGVyIiwgJmcyX2RtYV9pbmZvKTsKIAlpZiAodW5saWtlbHkocmV0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1wdnIyLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1wdnIyLmMKaW5kZXggM2NlZTU4ZS4uNzA2YTM0MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtcHZyMi5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXB2cjIuYwpAQCAtNzAsNyArNzAsNiBAQAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcHZyMl9kbWFfaXJxID0gewogCS5uYW1lCQk9ICJwdnIyIERNQSBoYW5kbGVyIiwKIAkuaGFuZGxlcgk9IHB2cjJfZG1hX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZG1hX29wcyBwdnIyX2RtYV9vcHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc2guYwppbmRleCA4MjcyMDg3Li5hNjBkYTZkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMKQEAgLTk1LDcgKzk1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9ETUFfSVJRX01VTFRJKQogCQkJCUlSUUZfU0hBUkVELAogI2Vsc2UKLQkJCQlJUlFGX0RJU0FCTEVELAorCQkJCTAsCiAjZW5kaWYKIAkJCQljaGFuLT5kZXZfaWQsIGNoYW4pOwogfQpAQCAtMzA1LDcgKzMwNSw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU0hfRE1BX0lSUV9NVUxUSSkKIAkJCQlJUlFGX1NIQVJFRCwKICNlbHNlCi0JCQkJSVJRRl9ESVNBQkxFRCwKKwkJCQkwLAogI2VuZGlmCiAJCQkJZG1hZV9uYW1lW25dLCAodm9pZCAqKWRtYWVfbmFtZVtuXSk7CiAJCWlmICh1bmxpa2VseShpIDwgMCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXN5c2ZzLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zeXNmcy5jCmluZGV4IDFlZTYzMWQuLjgzY2M3MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXN5c2ZzLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc3lzZnMuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hYnJnLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYWJyZy5jCmluZGV4IDZhYjljNGEuLjNkNjZhMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hYnJnLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWFicmcuYwpAQCAtMTc0LDE3ICsxNzQsMTcgQEAKIAlvciA9IF9fcmF3X3JlYWRsKERNQU9SKTsKIAlfX3Jhd193cml0ZWwob3IgfCBETUFPUl9CUkcgfCBETUFPUl9ETUVOLCBETUFPUik7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShETUFCUkdJMCwgZG1hYnJnX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlyZXQgPSByZXF1ZXN0X2lycShETUFCUkdJMCwgZG1hYnJnX2lycSwgMCwKIAkJCSJETUFCUkcgVVNCIGFkZHJlc3MgZXJyb3IiLCBOVUxMKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDA7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShETUFCUkdJMSwgZG1hYnJnX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlyZXQgPSByZXF1ZXN0X2lycShETUFCUkdJMSwgZG1hYnJnX2lycSwgMCwKIAkJCSJETUFCUkcgVHJhbnNmZXIgRW5kIiwgTlVMTCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQxOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoRE1BQlJHSTIsIGRtYWJyZ19pcnEsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoRE1BQlJHSTIsIGRtYWJyZ19pcnEsIDAsCiAJCQkiRE1BQlJHIFRyYW5zZmVyIEhhbGYiLCBOVUxMKTsKIAlpZiAocmV0ID09IDApCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDUuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNS5jCmluZGV4IDBiZjI5NmMuLjE2YzFlNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNS5jCkBAIC0xMDcsMTMgKzEwNywxMyBAQAogCXUzMiB1dmFsOwogCiAgICAgICAgIGlmIChyZXF1ZXN0X2lycShJUlFfRVJSLCBwY2lzaDVfZXJyX2lycSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElSUUZfRElTQUJMRUQsICJQQ0kgRXJyb3IiLE5VTEwpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgMCwgIlBDSSBFcnJvciIsTlVMTCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJQQ0lTSDU6IENhbm5vdCBob29rIFBDSV9QRVJSIGludGVycnVwdFxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocmVxdWVzdF9pcnEoSVJRX1NFUlIsIHBjaXNoNV9zZXJyX2lycSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElSUUZfRElTQUJMRUQsICJQQ0kgU0VSUiBpbnRlcnJ1cHQiLCBOVUxMKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICJQQ0kgU0VSUiBpbnRlcnJ1cHQiLCBOVUxMKSA8IDApIHsKICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlBDSVNINTogQ2Fubm90IGhvb2sgUENJX1NFUlIgaW50ZXJydXB0XG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuYwppbmRleCBlZGI3Y2NhLi5mYTdiOTc4YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCQkgICAgIFBDSV9TVEFUVVNfU0lHX1RBUkdFVF9BQk9SVCB8IFwKIAkJICAgICBQQ0lfU1RBVFVTX1BBUklUWSwgaG9zZS0+cmVnX2Jhc2UgKyBQQ0lfU1RBVFVTKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGhvc2UtPnNlcnJfaXJxLCBzaDc3ODBfcGNpX3NlcnJfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKGhvc2UtPnNlcnJfaXJxLCBzaDc3ODBfcGNpX3NlcnJfaXJxLCAwLAogCQkJICAiUENJIFNFUlIgaW50ZXJydXB0IiwgaG9zZSk7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEZhaWxlZCBob29raW5nIFNFUlIgSVJRXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDE5NDIzMWMuLmMyNjkxYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiB1bnNpZ25lZCBsb25nIFBDSUJJT1NfTUlOX0lPID0gMHgwMDAwOwogdW5zaWduZWQgbG9uZyBQQ0lCSU9TX01JTl9NRU0gPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3B1c2gtc3dpdGNoLmMgYi9hcmNoL3NoL2RyaXZlcnMvcHVzaC1zd2l0Y2guYwppbmRleCBhZmMyNDU1Li42MzdiNzliIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcHVzaC1zd2l0Y2guYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcHVzaC1zd2l0Y2guYwpAQCAtNjMsNyArNjMsNyBAQAogCUJVR19PTighcHN3X2luZm8pOwogCiAJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBwc3dfaW5mby0+aXJxX2hhbmRsZXIsCi0JCQkgIElSUUZfRElTQUJMRUQgfCBwc3dfaW5mby0+aXJxX2ZsYWdzLAorCQkJICBwc3dfaW5mby0+aXJxX2ZsYWdzLAogCQkJICBwc3dfaW5mby0+bmFtZSA/IHBzd19pbmZvLT5uYW1lIDogRFJWX05BTUUsIHBkZXYpOwogCWlmICh1bmxpa2VseShyZXQgPCAwKSkKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IDgyMmQ2MDguLjE1ZDk3MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGFnZS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0xMTMsNiArMTEzLDE2IEBACiAjZGVmaW5lIF9fTUVNT1JZX1NJWkUJCUNPTkZJR19NRU1PUllfU0laRQogCiAvKgorICogUEhZU0lDQUxfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gcGh5c2ljYWwgbWVtb3J5IHdoZXJlIHRoZSBiYXNlCisgKiBvZiB0aGUga2VybmVsIGlzIGxvYWRlZC4KKyAqLworI2lmZGVmIENPTkZJR19QSFlTSUNBTF9TVEFSVAorI2RlZmluZSBQSFlTSUNBTF9PRkZTRVQgKENPTkZJR19QSFlTSUNBTF9TVEFSVCAtIF9fTUVNT1JZX1NUQVJUKQorI2Vsc2UKKyNkZWZpbmUgUEhZU0lDQUxfT0ZGU0VUIDAKKyNlbmRpZgorCisvKgogICogUEFHRV9PRkZTRVQgaXMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2Yga2VybmVsIGFkZHJlc3MKICAqIHNwYWNlLgogICovCkBAIC0xNDEsOCArMTUxLDEzIEBACiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCiAjaWZkZWYgQ09ORklHX1VOQ0FDSEVEX01BUFBJTkcKKyNpZiBkZWZpbmVkKENPTkZJR18yOUJJVCkKKyNkZWZpbmUgVU5DQUNfQUREUihhZGRyKQlQMlNFR0FERFIoYWRkcikKKyNkZWZpbmUgQ0FDX0FERFIoYWRkcikJCVAxU0VHQUREUihhZGRyKQorI2Vsc2UKICNkZWZpbmUgVU5DQUNfQUREUihhZGRyKQkoKGFkZHIpIC0gUEFHRV9PRkZTRVQgKyB1bmNhY2hlZF9zdGFydCkKICNkZWZpbmUgQ0FDX0FERFIoYWRkcikJCSgoYWRkcikgLSB1bmNhY2hlZF9zdGFydCArIFBBR0VfT0ZGU0VUKQorI2VuZGlmCiAjZWxzZQogI2RlZmluZSBVTkNBQ19BRERSKGFkZHIpCSgoYWRkcikpCiAjZGVmaW5lIENBQ19BRERSKGFkZHIpCQkoKGFkZHIpKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKaW5kZXggMzQzMjAwOC4uMTUyYjg2MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuaXN0ZF8zMi5oCkBAIC0zNzUsOCArMzc1LDEwIEBACiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkzNjIKICNkZWZpbmUgX19OUl9zZW5kbW1zZwkJMzYzCiAjZGVmaW5lIF9fTlJfc2V0bnMJCTM2NAorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJMzY1CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJMzY2CiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzY1CisjZGVmaW5lIE5SX3N5c2NhbGxzIDM2NwogCiAjaWZkZWYgX19LRVJORUxfXwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaAppbmRleCBlYzk4OTg2Li5jMzMwYzIzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKQEAgLTM5NiwxMCArMzk2LDEyIEBACiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkzNzMKICNkZWZpbmUgX19OUl9zZW5kbW1zZwkJMzc0CiAjZGVmaW5lIF9fTlJfc2V0bnMJCTM3NQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJMzc2CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJMzc3CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzc2CisjZGVmaW5lIE5SX3N5c2NhbGxzIDM3OAogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwMy5jCmluZGV4IGE0MzEyNGUuLjBiZDc0NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwMy5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwMy5jCkBAIC0xNzYsMTAgKzE3NiwxMiBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU4MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjc2NyCQk9IFNDU0NSX1JJRSB8IFNDU0NSX1RJRSB8IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfAorCQkJICBTQ1NDUl9SRUlFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSAgeyAxOTIsIDE5MiwgMTkyLCAxOTIgfSwKKwkucmVndHlwZQk9IFNDSXhfU0gyX1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYwX2RldmljZSA9IHsKQEAgLTE5MywxMCArMTk1LDEyIEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjFfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZmZTg4MDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NzY3IJCT0gU0NTQ1JfUklFIHwgU0NTQ1JfVElFIHwgU0NTQ1JfUkUgfCBTQ1NDUl9URSB8CisJCQkgIFNDU0NSX1JFSUUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9ICB7IDE5NiwgMTk2LCAxOTYsIDE5NiB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDJfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjFfZGV2aWNlID0gewpAQCAtMjEwLDEwICsyMTQsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmZlOTAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY3NjcgkJPSBTQ1NDUl9SSUUgfCBTQ1NDUl9USUUgfCBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwKKwkJCSAgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0gIHsgMjAwLCAyMDAsIDIwMCwgMjAwIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NIMl9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMl9kZXZpY2UgPSB7CkBAIC0yMjcsMTAgKzIzMywxMiBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYzX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU5ODAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjc2NyCQk9IFNDU0NSX1JJRSB8IFNDU0NSX1RJRSB8IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfAorCQkJICBTQ1NDUl9SRUlFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSAgeyAyMDQsIDIwNCwgMjA0LCAyMDQgfSwKKwkucmVndHlwZQk9IFNDSXhfU0gyX1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYzX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc1Ny5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzU3LmMKaW5kZXggM2IwOTdiMC4uMTkyMjJkYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzU3LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzU3LmMKQEAgLTExMyw3ICsxMTMsMTQgQEAKIAogCS8qIE1TVFAzMiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJzZGhpMCIsICZtc3RwX2Nsa3NbTVNUUDAwNF0pLAotCUNMS0RFVl9DT05fSUQoInJpaWMiLCAmbXN0cF9jbGtzW01TVFAwMDBdKSwKKwlDTEtERVZfQ09OX0lEKCJyaWljMCIsICZtc3RwX2Nsa3NbTVNUUDAwMF0pLAorCUNMS0RFVl9DT05fSUQoInJpaWMxIiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCisJQ0xLREVWX0NPTl9JRCgicmlpYzIiLCAmbXN0cF9jbGtzW01TVFAwMDBdKSwKKwlDTEtERVZfQ09OX0lEKCJyaWljMyIsICZtc3RwX2Nsa3NbTVNUUDAwMF0pLAorCUNMS0RFVl9DT05fSUQoInJpaWM0IiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCisJQ0xLREVWX0NPTl9JRCgicmlpYzUiLCAmbXN0cF9jbGtzW01TVFAwMDBdKSwKKwlDTEtERVZfQ09OX0lEKCJyaWljNiIsICZtc3RwX2Nsa3NbTVNUUDAwMF0pLAorCUNMS0RFVl9DT05fSUQoInJpaWM3IiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCiAKIAlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4wIiwgJm1zdHBfY2xrc1tNU1RQMTEzXSksCiAJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMSIsICZtc3RwX2Nsa3NbTVNUUDExNF0pLApAQCAtMTIxLDYgKzEyOCw3IEBACiAJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMSIsICZtc3RwX2Nsa3NbTVNUUDExMV0pLAogCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjAiLCAmbXN0cF9jbGtzW01TVFAxMTBdKSwKIAorCUNMS0RFVl9DT05fSUQoInVzYl9mY2siLCAmbXN0cF9jbGtzW01TVFAxMDNdKSwKIAlDTEtERVZfQ09OX0lEKCJ1c2IwIiwgJm1zdHBfY2xrc1tNU1RQMTAyXSksCiAJQ0xLREVWX0NPTl9JRCgibW1jMCIsICZtc3RwX2Nsa3NbTVNUUDIyMF0pLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NtcC1zaHgzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zbXAtc2h4My5jCmluZGV4IGRlODY1Y2EuLjAzZjJiNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NtcC1zaHgzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc21wLXNoeDMuYwpAQCAtNzksNyArNzksNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IFNNUF9NU0dfTlI7IGkrKykKIAkJcmVxdWVzdF9pcnEoMTA0ICsgaSwgaXBpX2ludGVycnVwdF9oYW5kbGVyLAotCQkJICAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1BFUkNQVSwgIklQSSIsICh2b2lkICopKGxvbmcpaSk7CisJCQkgICAgSVJRRl9QRVJDUFUsICJJUEkiLCAodm9pZCAqKShsb25nKWkpOwogCiAJZm9yIChpID0gMDsgaSA8IG1heF9jcHVzOyBpKyspCiAJCXNldF9jcHVfcHJlc2VudChpLCB0cnVlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9jcHVpZGxlLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvY3B1aWRsZS5jCmluZGV4IGU0NDY5ZTcyLi4xY2MyNTdjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvY3B1aWRsZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9jcHVpZGxlLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9od2Jsay5oPgpAQCAtMjUsMTEgKzI2LDEyIEBACiB9OwogCiBzdGF0aWMgaW50IGNwdWlkbGVfc2xlZXBfZW50ZXIoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKQorCQkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJCWludCBpbmRleCkKIHsKIAl1bnNpZ25lZCBsb25nIGFsbG93ZWRfbW9kZSA9IGFyY2hfaHdibGtfc2xlZXBfbW9kZSgpOwogCWt0aW1lX3QgYmVmb3JlLCBhZnRlcjsKLQlpbnQgcmVxdWVzdGVkX3N0YXRlID0gc3RhdGUgLSAmZGV2LT5zdGF0ZXNbMF07CisJaW50IHJlcXVlc3RlZF9zdGF0ZSA9IGluZGV4OwogCWludCBhbGxvd2VkX3N0YXRlOwogCWludCBrOwogCkBAIC00NiwxMSArNDgsMTMgQEAKIAkgKi8KIAlrID0gbWluX3QoaW50LCBhbGxvd2VkX3N0YXRlLCByZXF1ZXN0ZWRfc3RhdGUpOwogCi0JZGV2LT5sYXN0X3N0YXRlID0gJmRldi0+c3RhdGVzW2tdOwogCWJlZm9yZSA9IGt0aW1lX2dldCgpOwogCXNoX21vYmlsZV9jYWxsX3N0YW5kYnkoY3B1aWRsZV9tb2RlW2tdKTsKIAlhZnRlciA9IGt0aW1lX2dldCgpOwotCXJldHVybiBrdGltZV90b19ucyhrdGltZV9zdWIoYWZ0ZXIsIGJlZm9yZSkpID4+IDEwOworCisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IChpbnQpa3RpbWVfdG9fbnMoa3RpbWVfc3ViKGFmdGVyLCBiZWZvcmUpKSA+PiAxMDsKKworCXJldHVybiBrOwogfQogCiBzdGF0aWMgc3RydWN0IGNwdWlkbGVfZGV2aWNlIGNwdWlkbGVfZGV2OwpAQCAtNjIsMTkgKzY2LDE5IEBACiB2b2lkIHNoX21vYmlsZV9zZXR1cF9jcHVpZGxlKHZvaWQpCiB7CiAJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSAmY3B1aWRsZV9kZXY7CisJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYgPSAmY3B1aWRsZV9kcml2ZXI7CiAJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlOwogCWludCBpOwogCi0JY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJmNwdWlkbGVfZHJpdmVyKTsKIAogCWZvciAoaSA9IDA7IGkgPCBDUFVJRExFX1NUQVRFX01BWDsgaSsrKSB7Ci0JCWRldi0+c3RhdGVzW2ldLm5hbWVbMF0gPSAnXDAnOwotCQlkZXYtPnN0YXRlc1tpXS5kZXNjWzBdID0gJ1wwJzsKKwkJZHJ2LT5zdGF0ZXNbaV0ubmFtZVswXSA9ICdcMCc7CisJCWRydi0+c3RhdGVzW2ldLmRlc2NbMF0gPSAnXDAnOwogCX0KIAogCWkgPSBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsKIAotCXN0YXRlID0gJmRldi0+c3RhdGVzW2krK107CisJc3RhdGUgPSAmZHJ2LT5zdGF0ZXNbaSsrXTsKIAlzbnByaW50ZihzdGF0ZS0+bmFtZSwgQ1BVSURMRV9OQU1FX0xFTiwgIkMxIik7CiAJc3RybmNweShzdGF0ZS0+ZGVzYywgIlN1cGVySCBTbGVlcCBNb2RlIiwgQ1BVSURMRV9ERVNDX0xFTik7CiAJc3RhdGUtPmV4aXRfbGF0ZW5jeSA9IDE7CkBAIC04NCwxMCArODgsMTAgQEAKIAlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CiAJc3RhdGUtPmVudGVyID0gY3B1aWRsZV9zbGVlcF9lbnRlcjsKIAotCWRldi0+c2FmZV9zdGF0ZSA9IHN0YXRlOworCWRydi0+c2FmZV9zdGF0ZV9pbmRleCA9IGktMTsKIAogCWlmIChzaF9tb2JpbGVfc2xlZXBfc3VwcG9ydGVkICYgU1VTUF9TSF9TRikgewotCQlzdGF0ZSA9ICZkZXYtPnN0YXRlc1tpKytdOworCQlzdGF0ZSA9ICZkcnYtPnN0YXRlc1tpKytdOwogCQlzbnByaW50ZihzdGF0ZS0+bmFtZSwgQ1BVSURMRV9OQU1FX0xFTiwgIkMyIik7CiAJCXN0cm5jcHkoc3RhdGUtPmRlc2MsICJTdXBlckggU2xlZXAgTW9kZSBbU0ZdIiwKIAkJCUNQVUlETEVfREVTQ19MRU4pOwpAQCAtMTAwLDcgKzEwNCw3IEBACiAJfQogCiAJaWYgKHNoX21vYmlsZV9zbGVlcF9zdXBwb3J0ZWQgJiBTVVNQX1NIX1NUQU5EQlkpIHsKLQkJc3RhdGUgPSAmZGV2LT5zdGF0ZXNbaSsrXTsKKwkJc3RhdGUgPSAmZHJ2LT5zdGF0ZXNbaSsrXTsKIAkJc25wcmludGYoc3RhdGUtPm5hbWUsIENQVUlETEVfTkFNRV9MRU4sICJDMyIpOwogCQlzdHJuY3B5KHN0YXRlLT5kZXNjLCAiU3VwZXJIIE1vYmlsZSBTdGFuZGJ5IE1vZGUgW1NGXSIsCiAJCQlDUFVJRExFX0RFU0NfTEVOKTsKQEAgLTExMiw3ICsxMTYsMTAgQEAKIAkJc3RhdGUtPmVudGVyID0gY3B1aWRsZV9zbGVlcF9lbnRlcjsKIAl9CiAKKwlkcnYtPnN0YXRlX2NvdW50ID0gaTsKIAlkZXYtPnN0YXRlX2NvdW50ID0gaTsKIAorCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZjcHVpZGxlX2RyaXZlcik7CisKIAljcHVpZGxlX3JlZ2lzdGVyX2RldmljZShkZXYpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9zaC9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDJlZTIxYTQuLjEwYjE0ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKIHN0cnVjdCBjcHVfaHdfZXZlbnRzIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NldHVwLmMgYi9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCmluZGV4IDU4YmZmNDUuLjFhMGU5NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwpAQCAtMjExLDEzICsyMTEsMTYgQEAKIAl9CiAKIAkvKgotCSAqICBXZSBkb24ndCBrbm93IHdoaWNoIFJBTSByZWdpb24gY29udGFpbnMga2VybmVsIGRhdGEsCi0JICogIHNvIHdlIHRyeSBpdCByZXBlYXRlZGx5IGFuZCBsZXQgdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgKiAgdGVzdCBpdC4KKwkgKiBXZSBkb24ndCBrbm93IHdoaWNoIFJBTSByZWdpb24gY29udGFpbnMga2VybmVsIGRhdGEgb3IKKwkgKiB0aGUgcmVzZXJ2ZWQgY3Jhc2hrZXJuZWwgcmVnaW9uLCBzbyB0cnkgaXQgcmVwZWF0ZWRseQorCSAqIGFuZCBsZXQgdGhlIHJlc291cmNlIG1hbmFnZXIgdGVzdCBpdC4KIAkgKi8KIAlyZXF1ZXN0X3Jlc291cmNlKHJlcywgJmNvZGVfcmVzb3VyY2UpOwogCXJlcXVlc3RfcmVzb3VyY2UocmVzLCAmZGF0YV9yZXNvdXJjZSk7CiAJcmVxdWVzdF9yZXNvdXJjZShyZXMsICZic3NfcmVzb3VyY2UpOworI2lmZGVmIENPTkZJR19LRVhFQworCXJlcXVlc3RfcmVzb3VyY2UocmVzLCAmY3Jhc2hrX3Jlcyk7CisjZW5kaWYKIAogCS8qCiAJICogQWxzbyBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBhIFBNQiBtYXBwaW5nIHRoYXQgY292ZXJzIHRoaXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzMyLlMgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc18zMi5TCmluZGV4IDI5M2UzOWMuLmVlNTZhOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzMyLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfMzIuUwpAQCAtMzgyLDMgKzM4Miw1IEBACiAJLmxvbmcgc3lzX3N5bmNmcwogCS5sb25nIHN5c19zZW5kbW1zZwogCS5sb25nIHN5c19zZXRucworCS5sb25nIHN5c19wcm9jZXNzX3ZtX3JlYWR2CS8qIDM2NSAqLworCS5sb25nIHN5c19wcm9jZXNzX3ZtX3dyaXRldgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfNjQuUyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzY0LlMKaW5kZXggY2ViMzRiOS4uOWFmN2RlMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfNjQuUworKysgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc182NC5TCkBAIC00MDIsMyArNDAyLDUgQEAKIAkubG9uZyBzeXNfc3luY2ZzCiAJLmxvbmcgc3lzX3NlbmRtbXNnCiAJLmxvbmcgc3lzX3NldG5zCQkJLyogMzc1ICovCisJLmxvbmcgc3lzX3Byb2Nlc3Nfdm1fcmVhZHYKKwkubG9uZyBzeXNfcHJvY2Vzc192bV93cml0ZXYKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL3NoL2tlcm5lbC90b3BvbG9neS5jCmluZGV4IDM4ZTg2MjguLjQ2NDlhNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMTEsOCArMTEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZS5oPgogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1LCBjcHVfZGV2aWNlcyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDczMWMxMGMuLmM5ODkwNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMjMsNyArMjMsNyBAQAogRU5UUlkoX3N0YXJ0KQogU0VDVElPTlMKIHsKLQkuID0gUEFHRV9PRkZTRVQgKyBNRU1PUllfT0ZGU0VUICsgQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ7CisJLiA9IFBBR0VfT0ZGU0VUICsgTUVNT1JZX09GRlNFVCArIFBIWVNJQ0FMX09GRlNFVCArIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUOwogCiAJX3RleHQgPSAuOwkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9pbml0LmMgYi9hcmNoL3NoL21tL2luaXQuYwppbmRleCA1OGE5M2ZiMy4uOTM5Y2EwZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pbml0LmMKKysrIGIvYXJjaC9zaC9tbS9pbml0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAjaW5jbHVkZSA8YXNtL2tleGVjLmg+CkBAIC0yODcsNiArMjg4LDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9yZXNlcnZlX21lbSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOworCXUzMiB6ZXJvX2Jhc2UgPSAodTMyKV9fTUVNT1JZX1NUQVJUICsgKHUzMilQSFlTSUNBTF9PRkZTRVQ7CisJdTMyIHN0YXJ0ID0gemVyb19iYXNlICsgKHUzMilDT05GSUdfWkVST19QQUdFX09GRlNFVDsKIAogCS8qCiAJICogUGFydGlhbGx5IHVzZWQgcGFnZXMgYXJlIG5vdCB1c2FibGUgLSB0aHVzCkBAIC0zMDAsMTUgKzMwMywxMyBAQAogCSAqIHRoaXMgY2F0Y2hlcyB0aGUgKGRlZmluaXRlbHkgYnVnZ3kpIGNhc2Ugb2YgdXMgYWNjaWRlbnRhbGx5CiAJICogaW5pdGlhbGl6aW5nIHRoZSBib290bWVtIGFsbG9jYXRvciB3aXRoIGFuIGludmFsaWQgUkFNIGFyZWEuCiAJICovCi0JbWVtYmxvY2tfcmVzZXJ2ZShfX01FTU9SWV9TVEFSVCArIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VULAotCQkgICAgKFBGTl9QSFlTKHN0YXJ0X3BmbikgKyBQQUdFX1NJWkUgLSAxKSAtCi0JCSAgICAoX19NRU1PUllfU1RBUlQgKyBDT05GSUdfWkVST19QQUdFX09GRlNFVCkpOworCW1lbWJsb2NrX3Jlc2VydmUoc3RhcnQsIChQRk5fUEhZUyhzdGFydF9wZm4pICsgUEFHRV9TSVpFIC0gMSkgLSBzdGFydCk7CiAKIAkvKgogCSAqIFJlc2VydmUgcGh5c2ljYWwgcGFnZXMgYmVsb3cgQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQuCiAJICovCiAJaWYgKENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUICE9IDApCi0JCW1lbWJsb2NrX3Jlc2VydmUoX19NRU1PUllfU1RBUlQsIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUKTsKKwkJbWVtYmxvY2tfcmVzZXJ2ZSh6ZXJvX2Jhc2UsIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUKTsKIAogCS8qCiAJICogSGFuZGxlIGFkZGl0aW9uYWwgZWFybHkgcmVzZXJ2YXRpb25zCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggMWE2ZjIwZC4uZjkyNjAyZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtNTYwLDEyICs1NjAsNyBAQAogCSAgT25seSBjaG9vc2UgTiBpZiB5b3Uga25vdyBpbiBhZHZhbmNlIHRoYXQgeW91IHdpbGwgbm90IG5lZWQgdG8gbW9kaWZ5CiAJICBPcGVuUFJPTSBzZXR0aW5ncyBvbiB0aGUgcnVubmluZyBzeXN0ZW0uCiAKLSMgTWFrZWZpbGUgaGVscGVycwotY29uZmlnIFNQQVJDMzJfUENJCi0JYm9vbAotCWRlZmF1bHQgeQotCWRlcGVuZHMgb24gU1BBUkMzMiAmJiBQQ0kKLQorIyBNYWtlZmlsZSBoZWxwZXIKIGNvbmZpZyBTUEFSQzY0X1BDSQogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY29tcGF0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2NvbXBhdC5oCmluZGV4IDZmNTczMjUuLmI4YmUyMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9jb21wYXQuaApAQCAtMTM0LDcgKzEzNCw4IEBACiAJY29tcGF0X2ZzaWRfdAlmX2ZzaWQ7CiAJaW50CQlmX25hbWVsZW47CS8qIFN1bk9TIGlnbm9yZXMgdGhpcyBmaWVsZC4gKi8KIAlpbnQJCWZfZnJzaXplOwotCWludAkJZl9zcGFyZVs1XTsKKwlpbnQJCWZfZmxhZ3M7CisJaW50CQlmX3NwYXJlWzRdOwogfTsKIAogI2RlZmluZSBDT01QQVRfUkxJTV9JTkZJTklUWSAweDdmZmZmZmZmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCA5ZDNmZWZjLi44YWYxYjY0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTU4LDYgKzU4LDkgQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICAweDAwMjQKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJMHgwMDI1CisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogLyogU2VjdXJpdHkgbGV2ZWxzIC0gYXMgcGVyIE5STCBJUHY2IC0gZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgKi8KICNkZWZpbmUgU09fU0VDVVJJVFlfQVVUSEVOVElDQVRJT04JCTB4NTAwMQogI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX1RSQU5TUE9SVAkweDUwMDIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGVybWlvcy5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKaW5kZXggZThiYTk1My4uZTJmNDY3MCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKQEAgLTQwLDcgKzQwLDYgQEAKIH07CiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBjX2NjIGNoYXJhY3RlcnMgaW4gdGhlIHRlcm1pbyBzdHJ1Y3R1cmUuICBPaCwgaG93IEkgbG92ZSBiZWluZwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggNjI2MGQ1ZC4uYzdjYjBhZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC00MDYsOCArNDA2LDEwIEBACiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkzMzUKICNkZWZpbmUgX19OUl9zZW5kbW1zZwkJMzM2CiAjZGVmaW5lIF9fTlJfc2V0bnMJCTMzNworI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJMzM4CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJMzM5CiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMJCTMzOAorI2RlZmluZSBOUl9zeXNjYWxscwkJMzQwCiAKICNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCiAvKiBTcGFyYyAzMi1iaXQgb25seSBoYXMgdGhlICJzZXRyZXN1aWQzMiIsICJnZXRyZXN1aWQzMiIgdmFyaWFudHMsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jCmluZGV4IGNhZWY5ZGUuLjgxMmUxMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYwppbmRleCBhY2Y1MTUxLi5mN2VhOGYwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYnRleHQuYyBiL2FyY2gvc3BhcmMva2VybmVsL2J0ZXh0LmMKaW5kZXggODlhYTRlYi4uNTcwNzNlNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvYnRleHQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9idGV4dC5jCkBAIC02LDcgKzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAKICNpbmNsdWRlIDxhc20vYnRleHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2NlbnRyYWwuYyBiL2FyY2gvc3BhcmMva2VybmVsL2NlbnRyYWwuYwppbmRleCA3ZWVmM2Y3Li4zOGQ0OGE1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9jZW50cmFsLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvY2VudHJhbC5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2NwdS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMKaW5kZXggYmE5YjFjZS4uMmQxODE5NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMKQEAgLTYsNyArNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9jcHVtYXAuYyBiL2FyY2gvc3BhcmMva2VybmVsL2NwdW1hcC5jCmluZGV4IDkzMjNlYWYuLmU0ZGU3NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2NwdW1hcC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2NwdW1hcC5jCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA5IEhvbmcgSC4gUGhhbSA8aG9uZy5waGFtQHdpbmRyaXZlci5jb20+CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9kbWEuYyBiL2FyY2gvc3BhcmMva2VybmVsL2RtYS5jCmluZGV4IGUxYmE4ZWUuLmI2NjdhYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2RtYS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2RtYS5jCkBAIC0xLDUgKzEsNCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwppbmRleCA3N2RiZjZkLi5lMzA2ZmIwOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2h2YXBpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9odmFwaS5jCmluZGV4IGMyZDA1NWQuLjg1OTM2NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2h2YXBpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaHZhcGkuYwpAQCAtMyw3ICszLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaWRwcm9tLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pZHByb20uYwppbmRleCA1MmExNWZlLi45MTY3ZGI0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pZHByb20uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pZHByb20uYwpAQCAtOCw3ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lvbW11LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pb21tdS5jCmluZGV4IDZmMDFlOGMuLjQ2NDNkNjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lvbW11LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9tbXUuYwpAQCAtNSw3ICs1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lycV8zMi5jCmluZGV4IDliODlkODQyLi5iMjY2OGFmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfNjQuYwppbmRleCAwZGQ4NDIyLi5kNDViNzEwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfNjQuYwpAQCAtNSw3ICs1LDYgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OCAgSmFrdWIgSmVsaW5layAgICAoampAdWx0cmEubGludXguY3opCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvanVtcF9sYWJlbC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvanVtcF9sYWJlbC5jCmluZGV4IGVhMmRhZmMuLjk3MWZkNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2p1bXBfbGFiZWwuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9qdW1wX2xhYmVsLmMKQEAgLTM2LDEyICszNiw0IEBACiAJcHV0X29ubGluZV9jcHVzKCk7CiB9CiAKLXZvaWQgYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShqdW1wX2xhYmVsX3QgYWRkcikKLXsKLQl1MzIgKmluc25fcCA9ICh1MzIgKikgKHVuc2lnbmVkIGxvbmcpIGFkZHI7Ci0KLQkqaW5zbl9wID0gMHgwMTAwMDAwMDsKLQlmbHVzaGkoaW5zbl9wKTsKLX0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9sZGMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCmluZGV4IDczMmIwYmMuLjQzNWU0MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCkBAIC00LDcgKzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9rZXJuZWwuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fa2VybmVsLmMKaW5kZXggZDE3MjU1YS4uYTE5YzhhMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9rZXJuZWwuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX2tlcm5lbC5jCkBAIC00LDcgKzQsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaS5jCmluZGV4IGE4YTlhMjcuLmYxY2Y2ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vbGVvbi5oPgogI2luY2x1ZGUgPGFzbS9sZW9uX3BjaS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpX2dycGNpMi5jCmluZGV4IGZhZDFiZDAuLmIxYmMzODggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpX2dycGNpMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpX2dycGNpMi5jCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2xlb24uaD4KICNpbmNsdWRlIDxhc20vdmFkZHJzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYwppbmRleCBhY2FlYmI2Li42ZGM3OTYyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKQEAgLTExLDExICsxMSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20vbWRlc2MuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9ubWkuYyBiL2FyY2gvc3BhcmMva2VybmVsL25taS5jCmluZGV4IDMwMGY4MTAuLmM3NmZlMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL25taS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL25taS5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfMzIuYwppbmRleCBhMzEyYWY0Li40ZWU4Y2UwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfMzIuYwpAQCAtMiw3ICsyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKaW5kZXggM2JiMmVhYy4uN2EzYmU2ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKQEAgLTIsMTMgKzIsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgogCiAjaW5jbHVkZSAib2ZfZGV2aWNlX2NvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfY29tbW9uLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfY29tbW9uLmMKaW5kZXggY2IxNWJiZi4uZGUxOTliZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV9jb21tb24uYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwppbmRleCA4YWEwZDQ0Li4zMTExMWUzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwpAQCAtOCw3ICs4LDcgQEAKICAqIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucywgc2VlIHRoZXJlIGZvciBjcmVkaXRzLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2ZpcmUuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9maXJlLmMKaW5kZXggZDI5YTMyZi4uMTg4ZjkzNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2ZpcmUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfZmlyZS5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9wc3ljaG8uYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9wc3ljaG8uYwppbmRleCA4NmFlMDhkLi5mNGQyOWUxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfcHN5Y2hvLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3BzeWNoby5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zYWJyZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NhYnJlLmMKaW5kZXggZDE4NDBkYi4uM2VmYWE0NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NhYnJlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NhYnJlLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IGYwMzBiMDIuLjEzZDRhYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYwppbmRleCBiMDFhMDZlLi5iMjcyY2RhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCmluZGV4IDFhYWY4YzEuLmZjYzE0OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Bjci5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMKaW5kZXggMzQzYjBmOS4uYTI0MDcyYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMKQEAgLTMsNyArMyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL3BpbC5oPgogI2luY2x1ZGUgPGFzbS9wY3IuaD4KICNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CiAKIC8qIFRoaXMgY29kZSBpcyBzaGFyZWQgYmV0d2VlbiB2YXJpb3VzIHVzZXJzIG9mIHRoZSBwZXJmb3JtYW5jZQogICogY291bnRlcnMuICBVc2VycyB3aWxsIGJlIG9wcm9maWxlLCBwc2V1ZG8tTk1JIHdhdGNoZG9nLCBhbmQgdGhlCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wbWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BtYy5jCmluZGV4IDZhNTg1ZDMuLjBlMzIwMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BtYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BtYy5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcG93ZXIuYwppbmRleCBjYjRjMGY1Li4wZDM5MDc1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Bvd2VyLmMKQEAgLTQsNyArNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCBkOTU5Y2QwLi4zNzM5YTA2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21fMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fMzIuYwppbmRleCA1Y2UzZDE1Li5iNTFjYmI5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV8zMi5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV82NC5jCmluZGV4IDg2NTk3ZDkuLjM0MGM1YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21fNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzY0LmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9jb21tb24uYwppbmRleCBlZDI1ODM0Li40NjYxNDgwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fY29tbW9uLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3JlYm9vdC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcmVib290LmMKaW5kZXggZWY4OWQzZC4uMDA2YTQyZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcmVib290LmMKQEAgLTQsNyArNCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jCmluZGV4IGExNjFiOWMuLjEyNzFiM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NidXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zYnVzLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDNlM2UyOTEuLmZlMWUzZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCmluZGV4IDRhNDQyYzMuLjc1NjA3NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zXzY0LmMKaW5kZXggODNiNDdhYi4uMTJmZjA5OCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc182NC5jCkBAIC01LDcgKzUsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5IEpha3ViIEplbGluZWsgKGpqQHVsdHJhLmxpbnV4LmN6KQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zdGFja3RyYWNlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggM2UwODE1My4uZTc4Mzg2YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3RhY2t0cmFjZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyYzMyLmMKaW5kZXggMTcwY2Q4ZS4uMjljNDc4ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCmluZGV4IDkwOGI0N2EuLjQ0MTUyMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXBjLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3V0cmFwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzMyLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzMyLlMKaW5kZXggMDlkOGVjNC4uNjM0MDJmOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc18zMi5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfMzIuUwpAQCAtODQsNCArODQsNCBAQAogLyozMjAqLwkubG9uZyBzeXNfZHVwMywgc3lzX3BpcGUyLCBzeXNfaW5vdGlmeV9pbml0MSwgc3lzX2FjY2VwdDQsIHN5c19wcmVhZHYKIC8qMzI1Ki8JLmxvbmcgc3lzX3B3cml0ZXYsIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbywgc3lzX3BlcmZfZXZlbnRfb3Blbiwgc3lzX3JlY3ZtbXNnLCBzeXNfZmFub3RpZnlfaW5pdAogLyozMzAqLwkubG9uZyBzeXNfZmFub3RpZnlfbWFyaywgc3lzX3BybGltaXQ2NCwgc3lzX25hbWVfdG9faGFuZGxlX2F0LCBzeXNfb3Blbl9ieV9oYW5kbGVfYXQsIHN5c19jbG9ja19hZGp0aW1lCi0vKjMzNSovCS5sb25nIHN5c19zeW5jZnMsIHN5c19zZW5kbW1zZywgc3lzX3NldG5zCisvKjMzNSovCS5sb25nIHN5c19zeW5jZnMsIHN5c19zZW5kbW1zZywgc3lzX3NldG5zLCBzeXNfcHJvY2Vzc192bV9yZWFkdiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzY0LlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzY0LlMKaW5kZXggZWRiZWM0NS4uZGI4NmIxYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfNjQuUwpAQCAtODUsNyArODUsNyBAQAogLyozMjAqLwkud29yZCBzeXNfZHVwMywgc3lzX3BpcGUyLCBzeXNfaW5vdGlmeV9pbml0MSwgc3lzX2FjY2VwdDQsIGNvbXBhdF9zeXNfcHJlYWR2CiAJLndvcmQgY29tcGF0X3N5c19wd3JpdGV2LCBjb21wYXRfc3lzX3J0X3Rnc2lncXVldWVpbmZvLCBzeXNfcGVyZl9ldmVudF9vcGVuLCBjb21wYXRfc3lzX3JlY3ZtbXNnLCBzeXNfZmFub3RpZnlfaW5pdAogLyozMzAqLwkud29yZCBzeXMzMl9mYW5vdGlmeV9tYXJrLCBzeXNfcHJsaW1pdDY0LCBzeXNfbmFtZV90b19oYW5kbGVfYXQsIGNvbXBhdF9zeXNfb3Blbl9ieV9oYW5kbGVfYXQsIGNvbXBhdF9zeXNfY2xvY2tfYWRqdGltZQotCS53b3JkIHN5c19zeW5jZnMsIGNvbXBhdF9zeXNfc2VuZG1tc2csIHN5c19zZXRucworCS53b3JkIHN5c19zeW5jZnMsIGNvbXBhdF9zeXNfc2VuZG1tc2csIHN5c19zZXRucywgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3JlYWR2LCBjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CiAKICNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCiAKQEAgLTE2Miw0ICsxNjIsNCBAQAogLyozMjAqLwkud29yZCBzeXNfZHVwMywgc3lzX3BpcGUyLCBzeXNfaW5vdGlmeV9pbml0MSwgc3lzX2FjY2VwdDQsIHN5c19wcmVhZHYKIAkud29yZCBzeXNfcHdyaXRldiwgc3lzX3J0X3Rnc2lncXVldWVpbmZvLCBzeXNfcGVyZl9ldmVudF9vcGVuLCBzeXNfcmVjdm1tc2csIHN5c19mYW5vdGlmeV9pbml0CiAvKjMzMCovCS53b3JkIHN5c19mYW5vdGlmeV9tYXJrLCBzeXNfcHJsaW1pdDY0LCBzeXNfbmFtZV90b19oYW5kbGVfYXQsIHN5c19vcGVuX2J5X2hhbmRsZV9hdCwgc3lzX2Nsb2NrX2FkanRpbWUKLQkud29yZCBzeXNfc3luY2ZzLCBzeXNfc2VuZG1tc2csIHN5c19zZXRucworCS53b3JkIHN5c19zeW5jZnMsIHN5c19zZW5kbW1zZywgc3lzX3NldG5zLCBzeXNfcHJvY2Vzc192bV9yZWFkdiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKaW5kZXggMWRiNmIxOC4uZTg2MTA3MiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwpAQCAtOSw3ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfMzIuYwppbmRleCBjMDQ5MGM3Li41OTFmMjBjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzMyLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKaW5kZXggN2VmYmIyZi4uNGQwNDNhMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC92aW8uYyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpby5jCmluZGV4IDNjYjFkZWYuLmY2N2UyOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Zpby5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpby5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9tZGVzYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpb2hzLmMKaW5kZXggMjkzNDhlYS4uZjhlN2RkNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jCkBAIC00LDcgKzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC92aXNlbXVsLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC92aXNlbXVsLmMKaW5kZXggMzJiNjI2Yy4uNzMzNzA2NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlzZW11bC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpc2VtdWwuYwpAQCAtNzEzLDE3ICs3MTMsMTcgQEAKIAkJCXMxNiBiID0gKHJzMiA+PiAoaSAqIDE2KSkgJiAweGZmZmY7CiAKIAkJCWlmIChhID4gYikKLQkJCQlyZF92YWwgfD0gMSA8PCBpOworCQkJCXJkX3ZhbCB8PSA4ID4+IGk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEZDTVBHVDMyX09QRjoKIAkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJczMyIGEgPSAocnMxID4+IChpICogMzIpKSAmIDB4ZmZmZjsKLQkJCXMzMiBiID0gKHJzMiA+PiAoaSAqIDMyKSkgJiAweGZmZmY7CisJCQlzMzIgYSA9IChyczEgPj4gKGkgKiAzMikpICYgMHhmZmZmZmZmZjsKKwkJCXMzMiBiID0gKHJzMiA+PiAoaSAqIDMyKSkgJiAweGZmZmZmZmZmOwogCiAJCQlpZiAoYSA+IGIpCi0JCQkJcmRfdmFsIHw9IDEgPDwgaTsKKwkJCQlyZF92YWwgfD0gMiA+PiBpOwogCQl9CiAJCWJyZWFrOwogCkBAIC03MzMsMTcgKzczMywxNyBAQAogCQkJczE2IGIgPSAocnMyID4+IChpICogMTYpKSAmIDB4ZmZmZjsKIAogCQkJaWYgKGEgPD0gYikKLQkJCQlyZF92YWwgfD0gMSA8PCBpOworCQkJCXJkX3ZhbCB8PSA4ID4+IGk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEZDTVBMRTMyX09QRjoKIAkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJczMyIGEgPSAocnMxID4+IChpICogMzIpKSAmIDB4ZmZmZjsKLQkJCXMzMiBiID0gKHJzMiA+PiAoaSAqIDMyKSkgJiAweGZmZmY7CisJCQlzMzIgYSA9IChyczEgPj4gKGkgKiAzMikpICYgMHhmZmZmZmZmZjsKKwkJCXMzMiBiID0gKHJzMiA+PiAoaSAqIDMyKSkgJiAweGZmZmZmZmZmOwogCiAJCQlpZiAoYSA8PSBiKQotCQkJCXJkX3ZhbCB8PSAxIDw8IGk7CisJCQkJcmRfdmFsIHw9IDIgPj4gaTsKIAkJfQogCQlicmVhazsKIApAQCAtNzUzLDE3ICs3NTMsMTcgQEAKIAkJCXMxNiBiID0gKHJzMiA+PiAoaSAqIDE2KSkgJiAweGZmZmY7CiAKIAkJCWlmIChhICE9IGIpCi0JCQkJcmRfdmFsIHw9IDEgPDwgaTsKKwkJCQlyZF92YWwgfD0gOCA+PiBpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBGQ01QTkUzMl9PUEY6CiAJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJCXMzMiBhID0gKHJzMSA+PiAoaSAqIDMyKSkgJiAweGZmZmY7Ci0JCQlzMzIgYiA9IChyczIgPj4gKGkgKiAzMikpICYgMHhmZmZmOworCQkJczMyIGEgPSAocnMxID4+IChpICogMzIpKSAmIDB4ZmZmZmZmZmY7CisJCQlzMzIgYiA9IChyczIgPj4gKGkgKiAzMikpICYgMHhmZmZmZmZmZjsKIAogCQkJaWYgKGEgIT0gYikKLQkJCQlyZF92YWwgfD0gMSA8PCBpOworCQkJCXJkX3ZhbCB8PSAyID4+IGk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTc3MywxNyArNzczLDE3IEBACiAJCQlzMTYgYiA9IChyczIgPj4gKGkgKiAxNikpICYgMHhmZmZmOwogCiAJCQlpZiAoYSA9PSBiKQotCQkJCXJkX3ZhbCB8PSAxIDw8IGk7CisJCQkJcmRfdmFsIHw9IDggPj4gaTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgRkNNUEVRMzJfT1BGOgogCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlzMzIgYSA9IChyczEgPj4gKGkgKiAzMikpICYgMHhmZmZmOwotCQkJczMyIGIgPSAocnMyID4+IChpICogMzIpKSAmIDB4ZmZmZjsKKwkJCXMzMiBhID0gKHJzMSA+PiAoaSAqIDMyKSkgJiAweGZmZmZmZmZmOworCQkJczMyIGIgPSAocnMyID4+IChpICogMzIpKSAmIDB4ZmZmZmZmZmY7CiAKIAkJCWlmIChhID09IGIpCi0JCQkJcmRfdmFsIHw9IDEgPDwgaTsKKwkJCQlyZF92YWwgfD0gMiA+PiBpOwogCQl9CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL21lbWNweS5TIGIvYXJjaC9zcGFyYy9saWIvbWVtY3B5LlMKaW5kZXggMzRmZTY1Ny4uNGQ4YzQ5NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9saWIvbWVtY3B5LlMKKysrIGIvYXJjaC9zcGFyYy9saWIvbWVtY3B5LlMKQEAgLTcsNDAgKzcsMTIgQEAKICAqIENvcHlyaWdodCAoQykgMTk5NiBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQogICovCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgRlVOQyh4KSAJCQkJCQkJCQkJCVwKKyNkZWZpbmUgRlVOQyh4KSAJCVwKIAkuZ2xvYmwJeDsJCVwKIAkudHlwZQl4LEBmdW5jdGlvbjsJXAotCS5hbGlnbgk0OwkJCQkJCQkJCQkJXAorCS5hbGlnbgk0OwkJXAogeDoKIAotI3VuZGVmIEZBU1RFUl9SRVZFUlNFCi0jdW5kZWYgRkFTVEVSX05PTkFMSUdORUQKLSNkZWZpbmUgRkFTVEVSX0FMSUdORUQKLQotLyogSW4ga2VybmVsIHRoZXNlIGZ1bmN0aW9ucyBkb24ndCByZXR1cm4gYSB2YWx1ZS4KLSAqIE9uZSBzaG91bGQgdXNlIG1hY3JvcyBpbiBhc20vc3RyaW5nLmggZm9yIHRoYXQgcHVycG9zZS4KLSAqIFdlIHJldHVybiAwLCBzbyB0aGF0IGJ1Z3MgYXJlIG1vcmUgYXBwYXJlbnQuCi0gKi8KLSNkZWZpbmUgU0VUVVBfUkVUTAotI2RlZmluZSBSRVRMX0lOU04JY2xyCSVvMAotCi0jZWxzZQotCi0vKiBsaWJjICovCi0KLSNpbmNsdWRlICJERUZTLmgiCi0KLSNkZWZpbmUgRkFTVEVSX1JFVkVSU0UKLSNkZWZpbmUgRkFTVEVSX05PTkFMSUdORUQKLSNkZWZpbmUgRkFTVEVSX0FMSUdORUQKLQotI2RlZmluZSBTRVRVUF9SRVRMCW1vdgklbzAsICVnNgotI2RlZmluZSBSRVRMX0lOU04JbW92CSVnNiwgJW8wCi0KLSNlbmRpZgotCiAvKiBCb3RoIHRoZXNlIG1hY3JvcyBoYXZlIHRvIHN0YXJ0IHdpdGggZXhhY3RseSB0aGUgc2FtZSBpbnNuICovCiAjZGVmaW5lIE1PVkVfQklHQ0hVTksoc3JjLCBkc3QsIG9mZnNldCwgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3KSBcCiAJbGRkCVslc3JjICsgKG9mZnNldCkgKyAweDAwXSwgJXQwOyBcCkBAIC0xNjQsMzAgKzEzNiw2IEBACiAJLnRleHQKIAkuYWxpZ24JNAogCi0jaWZkZWYgRkFTVEVSX1JFVkVSU0UKLQotNzA6CS8qIHJkd29yZF9hbGlnbiAqLwotCi0JYW5kY2MJCSVvMSwgMSwgJWcwCi0JYmUJCTRmCi0JIGFuZGNjCQklbzEsIDIsICVnMAotCi0JbGR1YgkJWyVvMSAtIDFdLCAlZzIKLQlzdWIJCSVvMSwgMSwgJW8xCi0Jc3RiCQklZzIsIFslbzAgLSAxXQotCXN1YgkJJW8yLCAxLCAlbzIKLQliZQkJM2YKLQkgc3ViCQklbzAsIDEsICVvMAotNDoKLQlsZHVoCQlbJW8xIC0gMl0sICVnMgotCXN1YgkJJW8xLCAyLCAlbzEKLQlzdGgJCSVnMiwgWyVvMCAtIDJdCi0Jc3ViCQklbzIsIDIsICVvMgotCWIJCTNmCi0JIHN1YgkJJW8wLCAyLCAlbzAKLQotI2VuZGlmIC8qIEZBU1RFUl9SRVZFUlNFICovCi0KIDA6CiAJcmV0bAogCSBub3AJCSEgT25seSBiY29weSByZXR1cm5zIGhlcmUgYW5kIGl0IHJldHVucyB2b2lkLi4uCkBAIC0xOTgsNyArMTQ2LDcgQEAKICNlbmRpZgogRlVOQyhtZW1tb3ZlKQogCWNtcAkJJW8wLCAlbzEKLQlTRVRVUF9SRVRMCisJbW92CQklbzAsICVnNwogCWJsZXUJCTlmCiAJIHN1YgkJJW8wLCAlbzEsICVvNAogCkBAIC0yMDcsOCArMTU1LDYgQEAKIAlibGV1CQkwZgogCSBhbmRjYwkJJW80LCAzLCAlbzUKIAotI2lmbmRlZiBGQVNURVJfUkVWRVJTRQotCiAJYWRkCQklbzEsICVvMiwgJW8xCiAJYWRkCQklbzAsICVvMiwgJW8wCiAJc3ViCQklbzEsIDEsICVvMQpAQCAtMjI0LDI5NSArMTcwLDcgQEAKIAkgc3ViCQklbzAsIDEsICVvMAogCiAJcmV0bAotCSBSRVRMX0lOU04KLQotI2Vsc2UgLyogRkFTVEVSX1JFVkVSU0UgKi8KLQotCWFkZAkJJW8xLCAlbzIsICVvMQotCWFkZAkJJW8wLCAlbzIsICVvMAotCWJuZQkJNzdmCi0JIGNtcAkJJW8yLCAxNQotCWJsZXUJCTkxZgotCSBhbmRjYwkJJW8xLCAzLCAlZzAKLQlibmUJCTcwYgotMzoKLQkgYW5kY2MJCSVvMSwgNCwgJWcwCi0KLQliZQkJMmYKLQkgbW92CQklbzIsICVnMQotCi0JbGQJCVslbzEgLSA0XSwgJW80Ci0Jc3ViCQklZzEsIDQsICVnMQotCXN0CQklbzQsIFslbzAgLSA0XQotCXN1YgkJJW8xLCA0LCAlbzEKLQlzdWIJCSVvMCwgNCwgJW8wCi0yOgotCWFuZGNjCQklZzEsIDB4ZmZmZmZmODAsICVnNwotCWJlCQkzZgotCSBhbmRjYwkJJW8wLCA0LCAlZzAKLQotCWJlCQk3NGYgKyA0Ci01OgotCVJNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHgwMCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCVJNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHgyMCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCVJNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHg0MCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCVJNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHg2MCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCXN1YmNjCQklZzcsIDEyOCwgJWc3Ci0Jc3ViCQklbzEsIDEyOCwgJW8xCi0JYm5lCQk1YgotCSBzdWIJCSVvMCwgMTI4LCAlbzAKLTM6Ci0JYW5kY2MJCSVnMSwgMHg3MCwgJWc3Ci0JYmUJCTcyZgotCSBhbmRjYwkJJWcxLCA4LCAlZzAKLQotCXNldGhpCQklaGkoNzJmKSwgJW81Ci0Jc3JsCQklZzcsIDEsICVvNAotCWFkZAkJJWc3LCAlbzQsICVvNAotCXN1YgkJJW8xLCAlZzcsICVvMQotCXN1YgkJJW81LCAlbzQsICVvNQotCWptcGwJCSVvNSArICVsbyg3MmYpLCAlZzAKLQkgc3ViCQklbzAsICVnNywgJW8wCi0KLTcxOgkvKiBybWVtY3B5X3RhYmxlICovCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHg2MCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHg1MCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHg0MCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHgxMCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUpCi0KLTcyOgkvKiBybWVtY3B5X3RhYmxlX2VuZCAqLwotCi0JYmUJCTczZgotCSBhbmRjYwkJJWcxLCA0LCAlZzAKLQotCWxkZAkJWyVvMSAtIDB4MDhdLCAlZzIKLQlzdWIJCSVvMCwgOCwgJW8wCi0Jc3ViCQklbzEsIDgsICVvMQotCXN0CQklZzIsIFslbzBdCi0Jc3QJCSVnMywgWyVvMCArIDB4MDRdCi0KLTczOgkvKiBybWVtY3B5X2xhc3Q3ICovCi0KLQliZQkJMWYKLQkgYW5kY2MJCSVnMSwgMiwgJWcwCi0KLQlsZAkJWyVvMSAtIDRdLCAlZzIKLQlzdWIJCSVvMSwgNCwgJW8xCi0Jc3QJCSVnMiwgWyVvMCAtIDRdCi0Jc3ViCQklbzAsIDQsICVvMAotMToKLQliZQkJMWYKLQkgYW5kY2MJCSVnMSwgMSwgJWcwCi0KLQlsZHVoCQlbJW8xIC0gMl0sICVnMgotCXN1YgkJJW8xLCAyLCAlbzEKLQlzdGgJCSVnMiwgWyVvMCAtIDJdCi0Jc3ViCQklbzAsIDIsICVvMAotMToKLQliZQkJMWYKLQkgbm9wCi0KLQlsZHViCQlbJW8xIC0gMV0sICVnMgotCXN0YgkJJWcyLCBbJW8wIC0gMV0KLTE6Ci0JcmV0bAotIAkgUkVUTF9JTlNOCi0KLTc0OgkvKiBybGRkX3N0ZCAqLwotCVJNT1ZFX0JJR0FMSUdOQ0hVTksobzEsIG8wLCAweDAwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfQklHQUxJR05DSFVOSyhvMSwgbzAsIDB4MjAsIG8yLCBvMywgbzQsIG81LCBnMiwgZzMsIGc0LCBnNSkKLQlSTU9WRV9CSUdBTElHTkNIVU5LKG8xLCBvMCwgMHg0MCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCVJNT1ZFX0JJR0FMSUdOQ0hVTksobzEsIG8wLCAweDYwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCi0Jc3ViY2MJCSVnNywgMTI4LCAlZzcKLQlzdWIJCSVvMSwgMTI4LCAlbzEKLQlibmUJCTc0YgotCSBzdWIJCSVvMCwgMTI4LCAlbzAKLQotCWFuZGNjCQklZzEsIDB4NzAsICVnNwotCWJlCQk3MmIKLQkgYW5kY2MJCSVnMSwgOCwgJWcwCi0KLQlzZXRoaQkJJWhpKDcyYiksICVvNQotCXNybAkJJWc3LCAxLCAlbzQKLQlhZGQJCSVnNywgJW80LCAlbzQKLQlzdWIJCSVvMSwgJWc3LCAlbzEKLQlzdWIJCSVvNSwgJW80LCAlbzUKLQlqbXBsCQklbzUgKyAlbG8oNzJiKSwgJWcwCi0JIHN1YgkJJW8wLCAlZzcsICVvMAotCi03NToJLyogcnNob3J0X2VuZCAqLwotCi0JYW5kCQklbzIsIDB4ZSwgJW8zCi0yOgotCXNldGhpCQklaGkoNzZmKSwgJW81Ci0Jc2xsCQklbzMsIDMsICVvNAotCXN1YgkJJW8wLCAlbzMsICVvMAotCXN1YgkJJW81LCAlbzQsICVvNQotCXN1YgkJJW8xLCAlbzMsICVvMQotCWptcGwJCSVvNSArICVsbyg3NmYpLCAlZzAKLQkgYW5kY2MJCSVvMiwgMSwgJWcwCi0KLQlSTU9WRV9TSE9SVENIVU5LKG8xLCBvMCwgMHgwYywgZzIsIGczKQotCVJNT1ZFX1NIT1JUQ0hVTksobzEsIG8wLCAweDBhLCBnMiwgZzMpCi0JUk1PVkVfU0hPUlRDSFVOSyhvMSwgbzAsIDB4MDgsIGcyLCBnMykKLQlSTU9WRV9TSE9SVENIVU5LKG8xLCBvMCwgMHgwNiwgZzIsIGczKQotCVJNT1ZFX1NIT1JUQ0hVTksobzEsIG8wLCAweDA0LCBnMiwgZzMpCi0JUk1PVkVfU0hPUlRDSFVOSyhvMSwgbzAsIDB4MDIsIGcyLCBnMykKLQlSTU9WRV9TSE9SVENIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczKQotCi03NjoJLyogcnNob3J0X3RhYmxlX2VuZCAqLwotCi0JYmUJCTFmCi0JIG5vcAotCWxkdWIJCVslbzEgLSAxXSwgJWcyCi0Jc3RiCQklZzIsIFslbzAgLSAxXQotMToKLQlyZXRsCi0gCSBSRVRMX0lOU04KLQotOTE6CS8qIHJzaG9ydF9hbGlnbmVkX2VuZCAqLwotCi0JYm5lCQk3NWIKLQkgYW5kY2MJCSVvMiwgOCwgJWcwCi0KLQliZQkJMWYKLQkgYW5kY2MJCSVvMiwgNCwgJWcwCi0KLQlsZAkJWyVvMSAtIDB4MDhdLCAlZzIKLQlsZAkJWyVvMSAtIDB4MDRdLCAlZzMKLQlzdWIJCSVvMSwgOCwgJW8xCi0Jc3QJCSVnMiwgWyVvMCAtIDB4MDhdCi0Jc3QJCSVnMywgWyVvMCAtIDB4MDRdCi0Jc3ViCQklbzAsIDgsICVvMAotMToKLQliCQk3M2IKLQkgbW92CQklbzIsICVnMQotCi03NzoJLyogcm5vbl9hbGlnbmVkICovCi0JY21wCQklbzIsIDE1Ci0JYmxldQkJNzViCi0JIGFuZGNjCQklbzAsIDMsICVnMAotCWJlCQk2NGYKLQkgYW5kY2MJCSVvMCwgMSwgJWcwCi0JYmUJCTYzZgotCSBhbmRjYwkJJW8wLCAyLCAlZzAKLQlsZHViCQlbJW8xIC0gMV0sICVnNQotCXN1YgkJJW8xLCAxLCAlbzEKLQlzdGIJCSVnNSwgWyVvMCAtIDFdCi0Jc3ViCQklbzAsIDEsICVvMAotCWJlCQk2NGYKLQkgc3ViCQklbzIsIDEsICVvMgotNjM6Ci0JbGR1YgkJWyVvMSAtIDFdLCAlZzUKLQlzdWIJCSVvMSwgMiwgJW8xCi0Jc3RiCQklZzUsIFslbzAgLSAxXQotCXN1YgkJJW8wLCAyLCAlbzAKLQlsZHViCQlbJW8xXSwgJWc1Ci0Jc3ViCQklbzIsIDIsICVvMgotCXN0YgkJJWc1LCBbJW8wXQotNjQ6CQotCWFuZAkJJW8xLCAzLCAlZzIKLQlhbmQJCSVvMSwgLTQsICVvMQotCWFuZAkJJW8yLCAweGMsICVnMwotCWFkZAkJJW8xLCA0LCAlbzEKLQljbXAJCSVnMywgNAotCXNsbAkJJWcyLCAzLCAlZzQKLQltb3YJCTMyLCAlZzIKLQliZQkJNGYKLQkgc3ViCQklZzIsICVnNCwgJWc3Ci0KLQlibHUJCTNmCi0JIGNtcAkJJWczLCA4Ci0KLQliZQkJMmYKLQkgc3JsCQklbzIsIDIsICVnMwotCi0JbGQJCVslbzEgLSA0XSwgJW8zCi0JYWRkCQklbzAsIC04LCAlbzAKLQlsZAkJWyVvMSAtIDhdLCAlbzQKLQlhZGQJCSVvMSwgLTE2LCAlbzEKLQliCQk3ZgotCSBhZGQJCSVnMywgMSwgJWczCi0yOgotCWxkCQlbJW8xIC0gNF0sICVvNAotCWFkZAkJJW8wLCAtNCwgJW8wCi0JbGQJCVslbzEgLSA4XSwgJWcxCi0JYWRkCQklbzEsIC0xMiwgJW8xCi0JYgkJOGYKLQkgYWRkCQklZzMsIDIsICVnMwotMzoKLQlsZAkJWyVvMSAtIDRdLCAlbzUKLQlhZGQJCSVvMCwgLTEyLCAlbzAKLQlsZAkJWyVvMSAtIDhdLCAlbzMKLQlhZGQJCSVvMSwgLTIwLCAlbzEKLQliCQk2ZgotCSBzcmwJCSVvMiwgMiwgJWczCi00OgotCWxkCQlbJW8xIC0gNF0sICVnMQotCXNybAkJJW8yLCAyLCAlZzMKLQlsZAkJWyVvMSAtIDhdLCAlbzUKLQlhZGQJCSVvMSwgLTI0LCAlbzEKLQlhZGQJCSVvMCwgLTE2LCAlbzAKLQlhZGQJCSVnMywgLTEsICVnMwotCi0JbGQJCVslbzEgKyAxMl0sICVvMwotNToKLQlzbGwJCSVvNSwgJWc0LCAlZzIKLQlzcmwJCSVnMSwgJWc3LCAlZzUKLQlvcgkJJWcyLCAlZzUsICVnMgotCXN0CQklZzIsIFslbzAgKyAxMl0KLTY6Ci0JbGQJCVslbzEgKyA4XSwgJW80Ci0Jc2xsCQklbzMsICVnNCwgJWcyCi0Jc3JsCQklbzUsICVnNywgJWc1Ci0Jb3IJCSVnMiwgJWc1LCAlZzIKLQlzdAkJJWcyLCBbJW8wICsgOF0KLTc6Ci0JbGQJCVslbzEgKyA0XSwgJWcxCi0Jc2xsCQklbzQsICVnNCwgJWcyCi0Jc3JsCQklbzMsICVnNywgJWc1Ci0Jb3IJCSVnMiwgJWc1LCAlZzIKLQlzdAkJJWcyLCBbJW8wICsgNF0KLTg6Ci0JbGQJCVslbzFdLCAlbzUKLQlzbGwJCSVnMSwgJWc0LCAlZzIKLQlzcmwJCSVvNCwgJWc3LCAlZzUKLQlhZGRjYwkJJWczLCAtNCwgJWczCi0Jb3IJCSVnMiwgJWc1LCAlZzIKLQlhZGQJCSVvMSwgLTE2LCAlbzEKLQlzdAkJJWcyLCBbJW8wXQotCWFkZAkJJW8wLCAtMTYsICVvMAotCWJuZSxhCQk1YgkKLQkgbGQJCVslbzEgKyAxMl0sICVvMwotCXNsbAkJJW81LCAlZzQsICVnMgotCXNybAkJJWcxLCAlZzcsICVnNQotCXNybAkJJWc0LCAzLCAlZzMKLQlvcgkJJWcyLCAlZzUsICVnMgotCWFkZAkJJW8xLCAlZzMsICVvMQotCWFuZGNjCQklbzIsIDIsICVnMAotCXN0CQklZzIsIFslbzAgKyAxMl0KLQliZQkJMWYKLQkgYW5kY2MJCSVvMiwgMSwgJWcwCi0JCi0JbGR1YgkJWyVvMSArIDE1XSwgJWc1Ci0JYWRkCQklbzEsIC0yLCAlbzEKLQlzdGIJCSVnNSwgWyVvMCArIDExXQotCWFkZAkJJW8wLCAtMiwgJW8wCi0JbGR1YgkJWyVvMSArIDE2XSwgJWc1Ci0Jc3RiCQklZzUsIFslbzAgKyAxMl0KLTE6Ci0JYmUJCTFmCi0JIG5vcAotCWxkdWIJCVslbzEgKyAxNV0sICVnNQotCXN0YgkJJWc1LCBbJW8wICsgMTFdCi0xOgotCXJldGwKLQkgUkVUTF9JTlNOCi0KLSNlbmRpZiAvKiBGQVNURVJfUkVWRVJTRSAqLworCSBtb3YJCSVnNywgJW8wCiAKIC8qIE5PVEU6IFRoaXMgY29kZSBpcyBleGVjdXRlZCBqdXN0IGZvciB0aGUgY2FzZXMsCiAgICAgICAgICB3aGVyZSAlc3JjICg9JW8xKSAmIDMgaXMgIT0gMC4KQEAgLTU0Niw3ICsyMDQsNyBAQAogRlVOQyhtZW1jcHkpCS8qICVvMD1kc3QgJW8xPXNyYyAlbzI9bGVuICovCiAKIAlzdWIJCSVvMCwgJW8xLCAlbzQKLQlTRVRVUF9SRVRMCisJbW92CQklbzAsICVnNwogOToKIAlhbmRjYwkJJW80LCAzLCAlbzUKIDA6CkBAIC01NjksNyArMjI3LDcgQEAKIAlhZGQJCSVvMSwgNCwgJW8xCiAJYWRkCQklbzAsIDQsICVvMAogMjoKLQlhbmRjYwkJJWcxLCAweGZmZmZmZjgwLCAlZzcKKwlhbmRjYwkJJWcxLCAweGZmZmZmZjgwLCAlZzAKIAliZQkJM2YKIAkgYW5kY2MJCSVvMCwgNCwgJWcwCiAKQEAgLTU3OSwyMiArMjM3LDIzIEBACiAJTU9WRV9CSUdDSFVOSyhvMSwgbzAsIDB4MjAsIG8yLCBvMywgbzQsIG81LCBnMiwgZzMsIGc0LCBnNSkKIAlNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHg0MCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQogCU1PVkVfQklHQ0hVTksobzEsIG8wLCAweDYwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCi0Jc3ViY2MJCSVnNywgMTI4LCAlZzcKKwlzdWIJCSVnMSwgMTI4LCAlZzEKIAlhZGQJCSVvMSwgMTI4LCAlbzEKLQlibmUJCTViCisJY21wCQklZzEsIDEyOAorCWJnZQkJNWIKIAkgYWRkCQklbzAsIDEyOCwgJW8wCiAzOgotCWFuZGNjCQklZzEsIDB4NzAsICVnNworCWFuZGNjCQklZzEsIDB4NzAsICVnNAogCWJlCQk4MGYKIAkgYW5kY2MJCSVnMSwgOCwgJWcwCiAKIAlzZXRoaQkJJWhpKDgwZiksICVvNQotCXNybAkJJWc3LCAxLCAlbzQKLQlhZGQJCSVnNywgJW80LCAlbzQKLQlhZGQJCSVvMSwgJWc3LCAlbzEKKwlzcmwJCSVnNCwgMSwgJW80CisJYWRkCQklZzQsICVvNCwgJW80CisJYWRkCQklbzEsICVnNCwgJW8xCiAJc3ViCQklbzUsICVvNCwgJW81CiAJam1wbAkJJW81ICsgJWxvKDgwZiksICVnMAotCSBhZGQJCSVvMCwgJWc3LCAlbzAKKwkgYWRkCQklbzAsICVnNCwgJW8wCiAKIDc5OgkvKiBtZW1jcHlfdGFibGUgKi8KIApAQCAtNjQxLDQzICszMDAsMjggQEAKIAlzdGIJCSVnMiwgWyVvMF0KIDE6CiAJcmV0bAotIAkgUkVUTF9JTlNOCisJIG1vdgkJJWc3LCAlbzAKIAogODI6CS8qIGxkZF9zdGQgKi8KIAlNT1ZFX0JJR0FMSUdOQ0hVTksobzEsIG8wLCAweDAwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCiAJTU9WRV9CSUdBTElHTkNIVU5LKG8xLCBvMCwgMHgyMCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQogCU1PVkVfQklHQUxJR05DSFVOSyhvMSwgbzAsIDB4NDAsIG8yLCBvMywgbzQsIG81LCBnMiwgZzMsIGc0LCBnNSkKIAlNT1ZFX0JJR0FMSUdOQ0hVTksobzEsIG8wLCAweDYwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCi0Jc3ViY2MJCSVnNywgMTI4LCAlZzcKKwlzdWJjYwkJJWcxLCAxMjgsICVnMQogCWFkZAkJJW8xLCAxMjgsICVvMQotCWJuZQkJODJiCisJY21wCQklZzEsIDEyOAorCWJnZQkJODJiCiAJIGFkZAkJJW8wLCAxMjgsICVvMAogCi0jaWZuZGVmIEZBU1RFUl9BTElHTkVECi0KLQlhbmRjYwkJJWcxLCAweDcwLCAlZzcKLQliZQkJODBiCi0JIGFuZGNjCQklZzEsIDgsICVnMAotCi0Jc2V0aGkJCSVoaSg4MGIpLCAlbzUKLQlzcmwJCSVnNywgMSwgJW80Ci0JYWRkCQklZzcsICVvNCwgJW80Ci0JYWRkCQklbzEsICVnNywgJW8xCi0Jc3ViCQklbzUsICVvNCwgJW81Ci0Jam1wbAkJJW81ICsgJWxvKDgwYiksICVnMAotCSBhZGQJCSVvMCwgJWc3LCAlbzAKLQotI2Vsc2UgLyogRkFTVEVSX0FMSUdORUQgKi8KLQotCWFuZGNjCQklZzEsIDB4NzAsICVnNworCWFuZGNjCQklZzEsIDB4NzAsICVnNAogCWJlCQk4NGYKIAkgYW5kY2MJCSVnMSwgOCwgJWcwCiAKIAlzZXRoaQkJJWhpKDg0ZiksICVvNQotCWFkZAkJJW8xLCAlZzcsICVvMQotCXN1YgkJJW81LCAlZzcsICVvNQorCWFkZAkJJW8xLCAlZzQsICVvMQorCXN1YgkJJW81LCAlZzQsICVvNQogCWptcGwJCSVvNSArICVsbyg4NGYpLCAlZzAKLQkgYWRkCQklbzAsICVnNywgJW8wCisJIGFkZAkJJW8wLCAlZzQsICVvMAogCiA4MzoJLyogYW1lbWNweV90YWJsZSAqLwogCkBAIC03MjEsMzgyICszNjUsMTMyIEBACiAJc3RiCQklZzIsIFslbzBdCiAxOgogCXJldGwKLSAJIFJFVExfSU5TTgotCi0jZW5kaWYgLyogRkFTVEVSX0FMSUdORUQgKi8KKwkgbW92CQklZzcsICVvMAogCiA4NjoJLyogbm9uX2FsaWduZWQgKi8KIAljbXAJCSVvMiwgNgogCWJsZXUJCTg4ZgorCSBub3AKIAotI2lmZGVmIEZBU1RFUl9OT05BTElHTkVECi0KLQkgY21wCQklbzIsIDI1NgotCWJjYwkJODdmCi0KLSNlbmRpZiAvKiBGQVNURVJfTk9OQUxJR05FRCAqLwotCi0JIGFuZGNjCQklbzAsIDMsICVnMAorCXNhdmUJCSVzcCwgLTk2LCAlc3AKKwlhbmRjYwkJJWkwLCAzLCAlZzAKIAliZQkJNjFmCi0JIGFuZGNjCQklbzAsIDEsICVnMAorCSBhbmRjYwkJJWkwLCAxLCAlZzAKIAliZQkJNjBmCi0JIGFuZGNjCQklbzAsIDIsICVnMAorCSBhbmRjYwkJJWkwLCAyLCAlZzAKIAotCWxkdWIJCVslbzFdLCAlZzUKLQlhZGQJCSVvMSwgMSwgJW8xCi0Jc3RiCQklZzUsIFslbzBdCi0Jc3ViCQklbzIsIDEsICVvMgorCWxkdWIJCVslaTFdLCAlZzUKKwlhZGQJCSVpMSwgMSwgJWkxCisJc3RiCQklZzUsIFslaTBdCisJc3ViCQklaTIsIDEsICVpMgogCWJuZQkJNjFmCi0JIGFkZAkJJW8wLCAxLCAlbzAKKwkgYWRkCQklaTAsIDEsICVpMAogNjA6Ci0JbGR1YgkJWyVvMV0sICVnMwotCWFkZAkJJW8xLCAyLCAlbzEKLQlzdGIJCSVnMywgWyVvMF0KLQlzdWIJCSVvMiwgMiwgJW8yCi0JbGR1YgkJWyVvMSAtIDFdLCAlZzMKLQlhZGQJCSVvMCwgMiwgJW8wCi0Jc3RiCQklZzMsIFslbzAgLSAxXQorCWxkdWIJCVslaTFdLCAlZzMKKwlhZGQJCSVpMSwgMiwgJWkxCisJc3RiCQklZzMsIFslaTBdCisJc3ViCQklaTIsIDIsICVpMgorCWxkdWIJCVslaTEgLSAxXSwgJWczCisJYWRkCQklaTAsIDIsICVpMAorCXN0YgkJJWczLCBbJWkwIC0gMV0KIDYxOgotCWFuZAkJJW8xLCAzLCAlZzIKLQlhbmQJCSVvMiwgMHhjLCAlZzMKLQlhbmQJCSVvMSwgLTQsICVvMQorCWFuZAkJJWkxLCAzLCAlZzIKKwlhbmQJCSVpMiwgMHhjLCAlZzMKKwlhbmQJCSVpMSwgLTQsICVpMQogCWNtcAkJJWczLCA0CiAJc2xsCQklZzIsIDMsICVnNAogCW1vdgkJMzIsICVnMgogCWJlCQk0ZgotCSBzdWIJCSVnMiwgJWc0LCAlZzcKKwkgc3ViCQklZzIsICVnNCwgJWwwCiAJCiAJYmx1CQkzZgogCSBjbXAJCSVnMywgMHg4CiAKIAliZQkJMmYKLQkgc3JsCQklbzIsIDIsICVnMworCSBzcmwJCSVpMiwgMiwgJWczCiAKLQlsZAkJWyVvMV0sICVvMwotCWFkZAkJJW8wLCAtOCwgJW8wCi0JbGQJCVslbzEgKyA0XSwgJW80CisJbGQJCVslaTFdLCAlaTMKKwlhZGQJCSVpMCwgLTgsICVpMAorCWxkCQlbJWkxICsgNF0sICVpNAogCWIJCThmCiAJIGFkZAkJJWczLCAxLCAlZzMKIDI6Ci0JbGQJCVslbzFdLCAlbzQKLQlhZGQJCSVvMCwgLTEyLCAlbzAKLQlsZAkJWyVvMSArIDRdLCAlbzUKKwlsZAkJWyVpMV0sICVpNAorCWFkZAkJJWkwLCAtMTIsICVpMAorCWxkCQlbJWkxICsgNF0sICVpNQogCWFkZAkJJWczLCAyLCAlZzMKIAliCQk5ZgotCSBhZGQJCSVvMSwgLTQsICVvMQorCSBhZGQJCSVpMSwgLTQsICVpMQogMzoKLQlsZAkJWyVvMV0sICVnMQotCWFkZAkJJW8wLCAtNCwgJW8wCi0JbGQJCVslbzEgKyA0XSwgJW8zCi0Jc3JsCQklbzIsIDIsICVnMworCWxkCQlbJWkxXSwgJWcxCisJYWRkCQklaTAsIC00LCAlaTAKKwlsZAkJWyVpMSArIDRdLCAlaTMKKwlzcmwJCSVpMiwgMiwgJWczCiAJYgkJN2YKLQkgYWRkCQklbzEsIDQsICVvMQorCSBhZGQJCSVpMSwgNCwgJWkxCiA0OgotCWxkCQlbJW8xXSwgJW81Ci0JY21wCQklbzIsIDcKLQlsZAkJWyVvMSArIDRdLCAlZzEKLQlzcmwJCSVvMiwgMiwgJWczCisJbGQJCVslaTFdLCAlaTUKKwljbXAJCSVpMiwgNworCWxkCQlbJWkxICsgNF0sICVnMQorCXNybAkJJWkyLCAyLCAlZzMKIAlibGV1CQkxMGYKLQkgYWRkCQklbzEsIDgsICVvMQorCSBhZGQJCSVpMSwgOCwgJWkxCiAKLQlsZAkJWyVvMV0sICVvMworCWxkCQlbJWkxXSwgJWkzCiAJYWRkCQklZzMsIC0xLCAlZzMKIDU6Ci0Jc2xsCQklbzUsICVnNCwgJWcyCi0Jc3JsCQklZzEsICVnNywgJWc1CisJc2xsCQklaTUsICVnNCwgJWcyCisJc3JsCQklZzEsICVsMCwgJWc1CiAJb3IJCSVnMiwgJWc1LCAlZzIKLQlzdAkJJWcyLCBbJW8wXQorCXN0CQklZzIsIFslaTBdCiA3OgotCWxkCQlbJW8xICsgNF0sICVvNAorCWxkCQlbJWkxICsgNF0sICVpNAogCXNsbAkJJWcxLCAlZzQsICVnMgotCXNybAkJJW8zLCAlZzcsICVnNQorCXNybAkJJWkzLCAlbDAsICVnNQogCW9yCQklZzIsICVnNSwgJWcyCi0Jc3QJCSVnMiwgWyVvMCArIDRdCisJc3QJCSVnMiwgWyVpMCArIDRdCiA4OgotCWxkCQlbJW8xICsgOF0sICVvNQotCXNsbAkJJW8zLCAlZzQsICVnMgotCXNybAkJJW80LCAlZzcsICVnNQorCWxkCQlbJWkxICsgOF0sICVpNQorCXNsbAkJJWkzLCAlZzQsICVnMgorCXNybAkJJWk0LCAlbDAsICVnNQogCW9yCQklZzIsICVnNSwgJWcyCi0Jc3QJCSVnMiwgWyVvMCArIDhdCisJc3QJCSVnMiwgWyVpMCArIDhdCiA5OgotCWxkCQlbJW8xICsgMTJdLCAlZzEKLQlzbGwJCSVvNCwgJWc0LCAlZzIKLQlzcmwJCSVvNSwgJWc3LCAlZzUKKwlsZAkJWyVpMSArIDEyXSwgJWcxCisJc2xsCQklaTQsICVnNCwgJWcyCisJc3JsCQklaTUsICVsMCwgJWc1CiAJYWRkY2MJCSVnMywgLTQsICVnMwogCW9yCQklZzIsICVnNSwgJWcyCi0JYWRkCQklbzEsIDE2LCAlbzEKLQlzdAkJJWcyLCBbJW8wICsgMTJdCi0JYWRkCQklbzAsIDE2LCAlbzAKKwlhZGQJCSVpMSwgMTYsICVpMQorCXN0CQklZzIsIFslaTAgKyAxMl0KKwlhZGQJCSVpMCwgMTYsICVpMAogCWJuZSxhCQk1YgotCSBsZAkJWyVvMV0sICVvMworCSBsZAkJWyVpMV0sICVpMwogMTA6Ci0Jc2xsCQklbzUsICVnNCwgJWcyCi0Jc3JsCQklZzEsICVnNywgJWc1Ci0Jc3JsCQklZzcsIDMsICVnMworCXNsbAkJJWk1LCAlZzQsICVnMgorCXNybAkJJWcxLCAlbDAsICVnNQorCXNybAkJJWwwLCAzLCAlZzMKIAlvcgkJJWcyLCAlZzUsICVnMgotCXN1YgkJJW8xLCAlZzMsICVvMQotCWFuZGNjCQklbzIsIDIsICVnMAotCXN0CQklZzIsIFslbzBdCisJc3ViCQklaTEsICVnMywgJWkxCisJYW5kY2MJCSVpMiwgMiwgJWcwCisJc3QJCSVnMiwgWyVpMF0KIAliZQkJMWYKLQkgYW5kY2MJCSVvMiwgMSwgJWcwCisJIGFuZGNjCQklaTIsIDEsICVnMAogCi0JbGR1YgkJWyVvMV0sICVnMgotCWFkZAkJJW8xLCAyLCAlbzEKLQlzdGIJCSVnMiwgWyVvMCArIDRdCi0JYWRkCQklbzAsIDIsICVvMAotCWxkdWIJCVslbzEgLSAxXSwgJWcyCi0Jc3RiCQklZzIsIFslbzAgKyAzXQorCWxkdWIJCVslaTFdLCAlZzIKKwlhZGQJCSVpMSwgMiwgJWkxCisJc3RiCQklZzIsIFslaTAgKyA0XQorCWFkZAkJJWkwLCAyLCAlaTAKKwlsZHViCQlbJWkxIC0gMV0sICVnMgorCXN0YgkJJWcyLCBbJWkwICsgM10KIDE6CiAJYmUJCTFmCiAJIG5vcAotCWxkdWIJCVslbzFdLCAlZzIKLQlzdGIJCSVnMiwgWyVvMCArIDRdCisJbGR1YgkJWyVpMV0sICVnMgorCXN0YgkJJWcyLCBbJWkwICsgNF0KIDE6Ci0JcmV0bAotCSBSRVRMX0lOU04KLQotI2lmZGVmIEZBU1RFUl9OT05BTElHTkVECi0KLTg3OgkvKiBmYXN0ZXJfbm9uYWxpZ25lZCAqLwotCi0JYW5kY2MJCSVvMSwgMywgJWcwCi0JYmUJCTNmCi0JIGFuZGNjCQklbzEsIDEsICVnMAotCi0JYmUJCTRmCi0JIGFuZGNjCQklbzEsIDIsICVnMAotCi0JbGR1YgkJWyVvMV0sICVnMgotCWFkZAkJJW8xLCAxLCAlbzEKLQlzdGIJCSVnMiwgWyVvMF0KLQlzdWIJCSVvMiwgMSwgJW8yCi0JYm5lCQkzZgotCSBhZGQJCSVvMCwgMSwgJW8wCi00OgotCWxkdWgJCVslbzFdLCAlZzIKLQlhZGQJCSVvMSwgMiwgJW8xCi0Jc3JsCQklZzIsIDgsICVnMwotCXN1YgkJJW8yLCAyLCAlbzIKLQlzdGIJCSVnMywgWyVvMF0KLQlhZGQJCSVvMCwgMiwgJW8wCi0Jc3RiCQklZzIsIFslbzAgLSAxXQotMzoKLQkgYW5kY2MJCSVvMSwgNCwgJWcwCi0KLQlibmUJCTJmCi0JIGNtcAkJJW81LCAxCi0KLQlsZAkJWyVvMV0sICVvNAotCXNybAkJJW80LCAyNCwgJWcyCi0Jc3RiCQklZzIsIFslbzBdCi0Jc3JsCQklbzQsIDE2LCAlZzMKLQlzdGIJCSVnMywgWyVvMCArIDFdCi0Jc3JsCQklbzQsIDgsICVnMgotCXN0YgkJJWcyLCBbJW8wICsgMl0KLQlzdWIJCSVvMiwgNCwgJW8yCi0Jc3RiCQklbzQsIFslbzAgKyAzXQotCWFkZAkJJW8xLCA0LCAlbzEKLQlhZGQJCSVvMCwgNCwgJW8wCi0yOgotCWJlCQkzM2YKLQkgY21wCQklbzUsIDIKLQliZQkJMzJmCi0JIHN1YgkJJW8yLCA0LCAlbzIKLTMxOgotCWxkCQlbJW8xXSwgJWcyCi0JYWRkCQklbzEsIDQsICVvMQotCXNybAkJJWcyLCAyNCwgJWczCi0JYW5kCQklbzAsIDcsICVnNQotCXN0YgkJJWczLCBbJW8wXQotCWNtcAkJJWc1LCA3Ci0Jc2xsCQklZzIsIDgsICVnMQotCWFkZAkJJW8wLCA0LCAlbzAKLQliZQkJNDFmCi0JIGFuZAkJJW8yLCAweGZmZmZmZmMwLCAlbzMKLQlsZAkJWyVvMCAtIDddLCAlbzQKLTQ6Ci0JU01PVkVfQ0hVTksobzEsIG8wLCAweDAwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDgsIDI0LCAtMykKLQlTTU9WRV9DSFVOSyhvMSwgbzAsIDB4MTAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgOCwgMjQsIC0zKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCA4LCAyNCwgLTMpCi0JU01PVkVfQ0hVTksobzEsIG8wLCAweDMwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDgsIDI0LCAtMykKLQlzdWJjYwkJJW8zLCA2NCwgJW8zCi0JYWRkCQklbzEsIDY0LCAlbzEKLQlibmUJCTRiCi0JIGFkZAkJJW8wLCA2NCwgJW8wCi0KLQlhbmRjYwkJJW8yLCAweDMwLCAlbzMKLQliZSxhCQkxZgotCSBzcmwJCSVnMSwgMTYsICVnMgotNDoKLQlTTU9WRV9DSFVOSyhvMSwgbzAsIDB4MDAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgOCwgMjQsIC0zKQotCXN1YmNjCQklbzMsIDE2LCAlbzMKLQlhZGQJCSVvMSwgMTYsICVvMQotCWJuZQkJNGIKLQkgYWRkCQklbzAsIDE2LCAlbzAKLQotCXNybAkJJWcxLCAxNiwgJWcyCi0xOgotCXN0CQklbzQsIFslbzAgLSA3XQotCXN0aAkJJWcyLCBbJW8wIC0gM10KLQlzcmwJCSVnMSwgOCwgJWc0Ci0JYgkJODhmCi0JIHN0YgkJJWc0LCBbJW8wIC0gMV0KLTMyOgotCWxkCQlbJW8xXSwgJWcyCi0JYWRkCQklbzEsIDQsICVvMQotCXNybAkJJWcyLCAxNiwgJWczCi0JYW5kCQklbzAsIDcsICVnNQotCXN0aAkJJWczLCBbJW8wXQotCWNtcAkJJWc1LCA2Ci0Jc2xsCQklZzIsIDE2LCAlZzEKLQlhZGQJCSVvMCwgNCwgJW8wCi0JYmUJCTQyZgotCSBhbmQJCSVvMiwgMHhmZmZmZmZjMCwgJW8zCi0JbGQJCVslbzAgLSA2XSwgJW80Ci00OgotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgxMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCXN1YmNjCQklbzMsIDY0LCAlbzMKLQlhZGQJCSVvMSwgNjQsICVvMQotCWJuZQkJNGIKLQkgYWRkCQklbzAsIDY0LCAlbzAKLQotCWFuZGNjCQklbzIsIDB4MzAsICVvMwotCWJlLGEJCTFmCi0JIHNybAkJJWcxLCAxNiwgJWcyCi00OgotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCXN1YmNjCQklbzMsIDE2LCAlbzMKLQlhZGQJCSVvMSwgMTYsICVvMQotCWJuZQkJNGIKLQkgYWRkCQklbzAsIDE2LCAlbzAKLQotCXNybAkJJWcxLCAxNiwgJWcyCi0xOgotCXN0CQklbzQsIFslbzAgLSA2XQotCWIJCTg4ZgotCSBzdGgJCSVnMiwgWyVvMCAtIDJdCi0zMzoKLQlsZAkJWyVvMV0sICVnMgotCXN1YgkJJW8yLCA0LCAlbzIKLQlzcmwJCSVnMiwgMjQsICVnMwotCWFuZAkJJW8wLCA3LCAlZzUKLQlzdGIJCSVnMywgWyVvMF0KLQljbXAJCSVnNSwgNQotCXNybAkJJWcyLCA4LCAlZzQKLQlzbGwJCSVnMiwgMjQsICVnMQotCXN0aAkJJWc0LCBbJW8wICsgMV0KLQlhZGQJCSVvMSwgNCwgJW8xCi0JYmUJCTQzZgotCSBhbmQJCSVvMiwgMHhmZmZmZmZjMCwgJW8zCi0KLQlsZAkJWyVvMCAtIDFdLCAlbzQKLQlhZGQJCSVvMCwgNCwgJW8wCi00OgotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgLTEpCi0JU01PVkVfQ0hVTksobzEsIG8wLCAweDEwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDI0LCA4LCAtMSkKLQlTTU9WRV9DSFVOSyhvMSwgbzAsIDB4MjAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgMjQsIDgsIC0xKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgLTEpCi0Jc3ViY2MJCSVvMywgNjQsICVvMwotCWFkZAkJJW8xLCA2NCwgJW8xCi0JYm5lCQk0YgotCSBhZGQJCSVvMCwgNjQsICVvMAotCi0JYW5kY2MJCSVvMiwgMHgzMCwgJW8zCi0JYmUsYQkJMWYKLQkgc3JsCQklZzEsIDI0LCAlZzIKLTQ6Ci0JU01PVkVfQ0hVTksobzEsIG8wLCAweDAwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDI0LCA4LCAtMSkKLQlzdWJjYwkJJW8zLCAxNiwgJW8zCi0JYWRkCQklbzEsIDE2LCAlbzEKLQlibmUJCTRiCi0JIGFkZAkJJW8wLCAxNiwgJW8wCi0KLQlzcmwJCSVnMSwgMjQsICVnMgotMToKLQlzdAkJJW80LCBbJW8wIC0gNV0KLQliCQk4OGYKLQkgc3RiCQklZzIsIFslbzAgLSAxXQotNDE6Ci0JU01PVkVfQUxJR05DSFVOSyhvMSwgbzAsIDB4MDAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgOCwgMjQsIC0zKQotCVNNT1ZFX0FMSUdOQ0hVTksobzEsIG8wLCAweDEwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDgsIDI0LCAtMykKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCA4LCAyNCwgLTMpCi0JU01PVkVfQUxJR05DSFVOSyhvMSwgbzAsIDB4MzAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgOCwgMjQsIC0zKQotCXN1YmNjCQklbzMsIDY0LCAlbzMKLQlhZGQJCSVvMSwgNjQsICVvMQotCWJuZQkJNDFiCi0JIGFkZAkJJW8wLCA2NCwgJW8wCi0JIAotCWFuZGNjCQklbzIsIDB4MzAsICVvMwotCWJlLGEJCTFmCi0JIHNybAkJJWcxLCAxNiwgJWcyCi00OgotCVNNT1ZFX0FMSUdOQ0hVTksobzEsIG8wLCAweDAwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDgsIDI0LCAtMykKLQlzdWJjYwkJJW8zLCAxNiwgJW8zCi0JYWRkCQklbzEsIDE2LCAlbzEKLQlibmUJCTRiCi0JIGFkZAkJJW8wLCAxNiwgJW8wCi0KLQlzcmwJCSVnMSwgMTYsICVnMgotMToKLQlzdGgJCSVnMiwgWyVvMCAtIDNdCi0Jc3JsCQklZzEsIDgsICVnNAotCWIJCTg4ZgotCSBzdGIJCSVnNCwgWyVvMCAtIDFdCi00MzoKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgMykKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgxMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgMykKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgMykKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgMykKLQlzdWJjYwkJJW8zLCA2NCwgJW8zCi0JYWRkCQklbzEsIDY0LCAlbzEKLQlibmUJCTQzYgotCSBhZGQJCSVvMCwgNjQsICVvMAotCi0JYW5kY2MJCSVvMiwgMHgzMCwgJW8zCi0JYmUsYQkJMWYKLQkgc3JsCQklZzEsIDI0LCAlZzIKLTQ6Ci0JU01PVkVfQUxJR05DSFVOSyhvMSwgbzAsIDB4MDAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgMjQsIDgsIDMpCi0Jc3ViY2MJCSVvMywgMTYsICVvMwotCWFkZAkJJW8xLCAxNiwgJW8xCi0JYm5lCQk0YgotCSBhZGQJCSVvMCwgMTYsICVvMAotCi0Jc3JsCQklZzEsIDI0LCAlZzIKLTE6Ci0Jc3RiCQklZzIsIFslbzAgKyAzXQotCWIJCTg4ZgotCSBhZGQJCSVvMCwgNCwgJW8wCi00MjoKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCVNNT1ZFX0FMSUdOQ0hVTksobzEsIG8wLCAweDEwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDE2LCAxNiwgLTIpCi0JU01PVkVfQUxJR05DSFVOSyhvMSwgbzAsIDB4MjAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgMTYsIDE2LCAtMikKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCXN1YmNjCQklbzMsIDY0LCAlbzMKLQlhZGQJCSVvMSwgNjQsICVvMQotCWJuZQkJNDJiCi0JIGFkZAkJJW8wLCA2NCwgJW8wCi0JIAotCWFuZGNjCQklbzIsIDB4MzAsICVvMwotCWJlLGEJCTFmCi0JIHNybAkJJWcxLCAxNiwgJWcyCi00OgotCVNNT1ZFX0FMSUdOQ0hVTksobzEsIG8wLCAweDAwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDE2LCAxNiwgLTIpCi0Jc3ViY2MJCSVvMywgMTYsICVvMwotCWFkZAkJJW8xLCAxNiwgJW8xCi0JYm5lCQk0YgotCSBhZGQJCSVvMCwgMTYsICVvMAotCi0Jc3JsCQklZzEsIDE2LCAlZzIKLTE6Ci0Jc3RoCQklZzIsIFslbzAgLSAyXQotCi0JLyogRmFsbCB0aHJvdWdoICovCi0JIAotI2VuZGlmIC8qIEZBU1RFUl9OT05BTElHTkVEICovCisJcmV0CisJIHJlc3RvcmUJJWc3LCAlZzAsICVvMAogCiA4ODoJLyogc2hvcnRfZW5kICovCiAKQEAgLTExMjcsNyArNTIxLDcgQEAKIAlzdGIJCSVnMiwgWyVvMF0KIDE6CiAJcmV0bAotIAkgUkVUTF9JTlNOCisJIG1vdgkJJWc3LCAlbzAKIAogOTA6CS8qIHNob3J0X2FsaWduZWRfZW5kICovCiAJYm5lCQk4OGIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYyBiL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYwppbmRleCBhYTFjMWIxLi44MDIzZmQ3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2ZhdWx0XzMyLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF8zMi5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9nZW5lcmljXzMyLmMgYi9hcmNoL3NwYXJjL21tL2dlbmVyaWNfMzIuYwppbmRleCBlNjA2N2I3Li42Y2EzOWE2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2dlbmVyaWNfMzIuYworKysgYi9hcmNoL3NwYXJjL21tL2dlbmVyaWNfMzIuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2dlbmVyaWNfNjQuYyBiL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY182NC5jCmluZGV4IDNjYjAwZGYuLjliMzU3ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY182NC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY182NC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2d1cC5jIGIvYXJjaC9zcGFyYy9tbS9ndXAuYwppbmRleCBhOTg2YjVkLi40MmM1NWRmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2d1cC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vZ3VwLmMKQEAgLTU2LDYgKzU2LDggQEAKIAkJCXB1dF9wYWdlKGhlYWQpOwogCQkJcmV0dXJuIDA7CiAJCX0KKwkJaWYgKGhlYWQgIT0gcGFnZSkKKwkJCWdldF9odWdlX3BhZ2VfdGFpbChwYWdlKTsKIAogCQlwYWdlc1sqbnJdID0gcGFnZTsKIAkJKCpucikrKzsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaGlnaG1lbS5jIGIvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMKaW5kZXggNDczMGVhYy4uNzcxNDBhMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvc3BhcmMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCBmNGU5NzY0Li4wN2UxNDUzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9odWdldGxicGFnZS5jCkBAIC01LDcgKzUsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvS2J1aWxkIGIvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwZWEyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvS2J1aWxkCkBAIC0wLDAgKzEsMTcgQEAKK2hlYWRlci15ICs9IGFiaS5oCitoZWFkZXIteSArPSBjaGlwLmgKK2hlYWRlci15ICs9IGNoaXBfdGlsZTY0LmgKK2hlYWRlci15ICs9IGNoaXBfdGlsZWd4LmgKK2hlYWRlci15ICs9IGNoaXBfdGlsZXByby5oCitoZWFkZXIteSArPSBpY2FjaGUuaAoraGVhZGVyLXkgKz0gaW50ZXJydXB0cy5oCitoZWFkZXIteSArPSBpbnRlcnJ1cHRzXzMyLmgKK2hlYWRlci15ICs9IGludGVycnVwdHNfNjQuaAoraGVhZGVyLXkgKz0gb3Bjb2RlLmgKK2hlYWRlci15ICs9IG9wY29kZV90aWxlZ3guaAoraGVhZGVyLXkgKz0gb3Bjb2RlX3RpbGVwcm8uaAoraGVhZGVyLXkgKz0gc2ltLmgKK2hlYWRlci15ICs9IHNpbV9kZWYuaAoraGVhZGVyLXkgKz0gc3ByX2RlZi5oCitoZWFkZXIteSArPSBzcHJfZGVmXzMyLmgKK2hlYWRlci15ICs9IHNwcl9kZWZfNjQuaApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9hYmkuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvYWJpLmgKaW5kZXggOGFmZmM3Ni4uYzU1YTNkNCAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9hYmkuaAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hcmNoL2FiaS5oCkBAIC0xNSwxMyArMTUsNzggQEAKIC8qKgogICogQGZpbGUKICAqCi0gKiBBQkktcmVsYXRlZCByZWdpc3RlciBkZWZpbml0aW9ucyBoZWxwZnVsIHdoZW4gd3JpdGluZyBhc3NlbWJseSBjb2RlLgorICogQUJJLXJlbGF0ZWQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCiAgKi8KIAogI2lmbmRlZiBfX0FSQ0hfQUJJX0hfXwotI2RlZmluZSBfX0FSQ0hfQUJJX0hfXwogCi0jaW5jbHVkZSA8YXJjaC9jaGlwLmg+CisjaWYgIWRlZmluZWQgX19uZWVkX2ludF9yZWdfdCAmJiAhZGVmaW5lZCBfX0RPWFlHRU5fXworIyBkZWZpbmUgX19BUkNIX0FCSV9IX18KKyMgaW5jbHVkZSA8YXJjaC9jaGlwLmg+CisjZW5kaWYKKworLyogUHJvdmlkZSB0aGUgYmFzaWMgbWFjaGluZSB0eXBlcy4gKi8KKyNpZm5kZWYgX19JTlRfUkVHX0JJVFMKKworLyoqIE51bWJlciBvZiBiaXRzIGluIGEgcmVnaXN0ZXIuICovCisjaWYgZGVmaW5lZCBfX3RpbGVneF9fCisjIGRlZmluZSBfX0lOVF9SRUdfQklUUyA2NAorI2VsaWYgZGVmaW5lZCBfX3RpbGVwcm9fXworIyBkZWZpbmUgX19JTlRfUkVHX0JJVFMgMzIKKyNlbGlmICFkZWZpbmVkIF9fbmVlZF9pbnRfcmVnX3QKKyMgaW5jbHVkZSA8YXJjaC9jaGlwLmg+CisjIGRlZmluZSBfX0lOVF9SRUdfQklUUyBDSElQX1dPUkRfU0laRSgpCisjZWxzZQorIyBlcnJvciBVbnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlIHdpdGggX19uZWVkX2ludF9yZWdfdAorI2VuZGlmCisKKyNpZiBfX0lOVF9SRUdfQklUUyA9PSA2NAorCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKy8qKiBVbnNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdWludF9yZWdfdDsKKworLyoqIFNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KK3R5cGVkZWYgbG9uZyBsb25nIF9faW50X3JlZ190OworI2VuZGlmCisKKy8qKiBTdHJpbmcgcHJlZml4IHRvIHVzZSBmb3IgcHJpbnRmKCkuICovCisjZGVmaW5lIF9fSU5UX1JFR19GTVQgImxsIgorCisjZWxzZQorCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKy8qKiBVbnNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBfX3VpbnRfcmVnX3Q7CisKKy8qKiBTaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCit0eXBlZGVmIGxvbmcgX19pbnRfcmVnX3Q7CisjZW5kaWYKKworLyoqIFN0cmluZyBwcmVmaXggdG8gdXNlIGZvciBwcmludGYoKS4gKi8KKyNkZWZpbmUgX19JTlRfUkVHX0ZNVCAibCIKKworI2VuZGlmCisjZW5kaWYgLyogX19JTlRfUkVHX0JJVFMgKi8KKworCisjaWZuZGVmIF9fbmVlZF9pbnRfcmVnX3QKKworCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKy8qKiBVbnNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KK3R5cGVkZWYgX191aW50X3JlZ190IHVpbnRfcmVnX3Q7CisKKy8qKiBTaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCit0eXBlZGVmIF9faW50X3JlZ190IGludF9yZWdfdDsKKyNlbmRpZgorCisvKiogU3RyaW5nIHByZWZpeCB0byB1c2UgZm9yIHByaW50ZigpLiAqLworI2RlZmluZSBJTlRfUkVHX0ZNVCBfX0lOVF9SRUdfRk1UCisKKy8qKiBOdW1iZXIgb2YgYml0cyBpbiBhIHJlZ2lzdGVyLiAqLworI2RlZmluZSBJTlRfUkVHX0JJVFMgX19JTlRfUkVHX0JJVFMKKwogCiAvKiBSZWdpc3RlcnMgMCAtIDU1IGFyZSAibm9ybWFsIiwgYnV0IHNvbWUgcGVyZm9ybSBzcGVjaWFsIHJvbGVzLiAqLwogCkBAIC01OSw3ICsxMjQsNyBAQAogICogVGhlIEFCSSByZXF1aXJlcyBjYWxsZXJzIHRvIGFsbG9jYXRlIGEgY2FsbGVyIHN0YXRlIHNhdmUgYXJlYSBvZgogICogdGhpcyBtYW55IGJ5dGVzIGF0IHRoZSBib3R0b20gb2YgZWFjaCBzdGFjayBmcmFtZS4KICAqLwotI2RlZmluZSBDX0FCSV9TQVZFX0FSRUFfU0laRSAoMiAqIChDSElQX1dPUkRfU0laRSgpIC8gOCkpCisjZGVmaW5lIENfQUJJX1NBVkVfQVJFQV9TSVpFICgyICogKElOVF9SRUdfQklUUyAvIDgpKQogCiAvKioKICAqIFRoZSBvcGVyYW5kIHRvIGFuICdpbmZvJyBvcGNvZGUgZGlyZWN0aW5nIHRoZSBiYWNrdHJhY2VyIHRvIG5vdApAQCAtNjcsMzAgKzEzMiwxMCBAQAogICovCiAjZGVmaW5lIElORk9fT1BfQ0FOTk9UX0JBQ0tUUkFDRSAyCiAKLSNpZm5kZWYgX19BU1NFTUJMRVJfXwotI2lmIENISVBfV09SRF9TSVpFKCkgPiAzMgogCi0vKiogVW5zaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50X3JlZ190OworI2VuZGlmIC8qICFfX25lZWRfaW50X3JlZ190ICovCiAKLS8qKiBTaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCi10eXBlZGVmIGxvbmcgbG9uZyBpbnRfcmVnX3Q7Ci0KLS8qKiBTdHJpbmcgcHJlZml4IHRvIHVzZSBmb3IgcHJpbnRmKCkuICovCi0jZGVmaW5lIElOVF9SRUdfRk1UICJsbCIKLQotI2VsaWYgIWRlZmluZWQoX19MUDY0X18pICAgLyogYXZvaWQgY29uZnVzaW9uIHdpdGggTFA2NCBjcm9zcy1idWlsZCB0b29scyAqLwotCi0vKiogVW5zaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludF9yZWdfdDsKLQotLyoqIFNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KLXR5cGVkZWYgbG9uZyBpbnRfcmVnX3Q7Ci0KLS8qKiBTdHJpbmcgcHJlZml4IHRvIHVzZSBmb3IgcHJpbnRmKCkuICovCi0jZGVmaW5lIElOVF9SRUdfRk1UICJsIgotCi0jZW5kaWYKLSNlbmRpZiAvKiBfX0FTU0VNQkxFUl9fICovCisvKiBNYWtlIHN1cmUgd2UgbGF0ZXIgY2FuIGdldCBhbGwgdGhlIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMuICAqLworI3VuZGVmIF9fbmVlZF9pbnRfcmVnX3QKIAogI2VuZGlmIC8qICFfX0FSQ0hfQUJJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9vcGNvZGUuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkMTUyMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFRpbGVyYSBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWYgZGVmaW5lZChfX3RpbGVwcm9fXykKKyNpbmNsdWRlIDxhcmNoL29wY29kZV90aWxlcHJvLmg+CisjZWxpZiBkZWZpbmVkKF9fdGlsZWd4X18pCisjaW5jbHVkZSA8YXJjaC9vcGNvZGVfdGlsZWd4Lmg+CisjZWxzZQorI2Vycm9yIFVuZXhwZWN0ZWQgVGlsZXJhIGNoaXAgdHlwZQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hcmNoL29wY29kZV90aWxlZ3guaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlX3RpbGVneC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNGQwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hcmNoL29wY29kZV90aWxlZ3guaApAQCAtMCwwICsxLDE0MDUgQEAKKy8qIFRJTEUtR3ggb3Bjb2RlIGluZm9ybWF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDExIFRpbGVyYSBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICoKKyAqCisgKgorICovCisKKyNpZm5kZWYgX19BUkNIX09QQ09ERV9IX18KKyNkZWZpbmUgX19BUkNIX09QQ09ERV9IX18KKworI2lmbmRlZiBfX0FTU0VNQkxFUl9fCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHRpbGVneF9idW5kbGVfYml0czsKKworLyogVGhlc2UgYXJlIHRoZSBiaXRzIHRoYXQgZGV0ZXJtaW5lIGlmIGEgYnVuZGxlIGlzIGluIHRoZSBYIGVuY29kaW5nLiAqLworI2RlZmluZSBUSUxFR1hfQlVORExFX01PREVfTUFTSyAoKHRpbGVneF9idW5kbGVfYml0cykzIDw8IDYyKQorCitlbnVtCit7CisgIC8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiBhIGJ1bmRsZSAoMiBmb3IgWCwgMyBmb3IgWSkuICovCisgIFRJTEVHWF9NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEUgPSAzLAorCisgIC8qIEhvdyBtYW55IGRpZmZlcmVudCBwaXBlbGluZSBlbmNvZGluZ3MgYXJlIHRoZXJlPyBYMCwgWDEsIFkwLCBZMSwgWTIuICovCisgIFRJTEVHWF9OVU1fUElQRUxJTkVfRU5DT0RJTkdTID0gNSwKKworICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVHWF9CVU5ETEVfU0laRV9JTl9CWVRFUy4gKi8KKyAgVElMRUdYX0xPRzJfQlVORExFX1NJWkVfSU5fQllURVMgPSAzLAorCisgIC8qIEluc3RydWN0aW9ucyB0YWtlIHRoaXMgbWFueSBieXRlcy4gKi8KKyAgVElMRUdYX0JVTkRMRV9TSVpFX0lOX0JZVEVTID0gMSA8PCBUSUxFR1hfTE9HMl9CVU5ETEVfU0laRV9JTl9CWVRFUywKKworICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVHWF9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTLiAqLworICBUSUxFR1hfTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTID0gMywKKworICAvKiBCdW5kbGVzIHNob3VsZCBiZSBhbGlnbmVkIG1vZHVsbyB0aGlzIG51bWJlciBvZiBieXRlcy4gKi8KKyAgVElMRUdYX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgPQorICAgICgxIDw8IFRJTEVHWF9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMpLAorCisgIC8qIE51bWJlciBvZiByZWdpc3RlcnMgKHNvbWUgYXJlIG1hZ2ljLCBzdWNoIGFzIG5ldHdvcmsgSS9PKS4gKi8KKyAgVElMRUdYX05VTV9SRUdJU1RFUlMgPSA2NCwKK307CisKKy8qIE1ha2UgYSBmZXcgInRpbGVfIiB2YXJpYWJsZXMgdG8gc2ltcGxpZnkgY29tbW9uIGNvZGUgYmV0d2VlbgorICAgYXJjaGl0ZWN0dXJlcy4gICovCisKK3R5cGVkZWYgdGlsZWd4X2J1bmRsZV9iaXRzIHRpbGVfYnVuZGxlX2JpdHM7CisjZGVmaW5lIFRJTEVfQlVORExFX1NJWkVfSU5fQllURVMgVElMRUdYX0JVTkRMRV9TSVpFX0lOX0JZVEVTCisjZGVmaW5lIFRJTEVfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyBUSUxFR1hfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUworI2RlZmluZSBUSUxFX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyBcCisgIFRJTEVHWF9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMKKworLyogNjQtYml0IHBhdHRlcm4gZm9yIGEgeyBicHQgOyBub3AgfSBidW5kbGUuICovCisjZGVmaW5lIFRJTEVHWF9CUFRfQlVORExFIDB4Mjg2YTQ0YWU1MTQ4NTAwMFVMTAorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfQkZFbmRfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfQkZPcGNvZGVFeHRlbnNpb25fWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMjQpKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9CRlN0YXJ0X1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0JyT2ZmX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDAwMDAwMDNmKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4MDAwMWZmYzApOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfQnJUeXBlX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU0KSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0Rlc3RfSW1tOF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgwMDAwMDAzZikgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDAwMDAwMGMwKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0Rlc3RfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9EZXN0X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0Rlc3RfWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9EZXN0X1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbTE2X1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweGZmZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSW1tMTZfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW04T3Bjb2RlRXh0ZW5zaW9uX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDIwKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThPcGNvZGVFeHRlbnNpb25fWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTEpKSAmIDB4ZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSW1tOF9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxMikpICYgMHhmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW04X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSW1tOF9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHhmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9KdW1wT2ZmX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDdmZmZmZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSnVtcE9wY29kZUV4dGVuc2lvbl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1OCkpICYgMHgxKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X01GX0ltbTE0X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDNmZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfTVRfSW1tMTRfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDAwMDAwM2YpIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgwMDAwM2ZjMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9Nb2RlKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDYyKSkgJiAweDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDI4KSkgJiAweDcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU5KSkgJiAweDcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDI3KSkgJiAweGYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU4KSkgJiAweGYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1kyKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgobiA+PiAyNikpICYgMHgwMDAwMDAwMSkgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDU2KSkgJiAweDAwMDAwMDAyKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxOCkpICYgMHgzZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfUlJST3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDNmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDkpKSAmIDB4Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaGlmdE9wY29kZUV4dGVuc2lvbl9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxOCkpICYgMHgzZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU2hpZnRPcGNvZGVFeHRlbnNpb25fWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDkpKSAmIDB4M2ZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU2hpZnRPcGNvZGVFeHRlbnNpb25fWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDkpKSAmIDB4Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDYpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQV9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDYpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQV9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1kyKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDIwKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NyY0JEZXN0X1kyKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDUxKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NyY0JfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNCX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NyY0JfWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3NpZ25fZXh0ZW5kKGludCBuLCBpbnQgbnVtX2JpdHMpCit7CisgIGludCBzaGlmdCA9IChpbnQpKHNpemVvZihpbnQpICogOCAtIG51bV9iaXRzKTsKKyAgcmV0dXJuIChuIDw8IHNoaWZ0KSA+PiBzaGlmdDsKK30KKworCisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9CRkVuZF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfQkZPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZikgPDwgMjQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfQkZTdGFydF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfQnJPZmZfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAorICAgICAgICAgKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAxZmZjMCkpIDw8IDM3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0JyVHlwZV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDU0KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0Rlc3RfSW1tOF9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAzZikpIDw8IDMxKSB8CisgICAgICAgICAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAwMGMwKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9EZXN0X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9EZXN0X1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tMTZfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmZmZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tMTZfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4ZmZmZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0ltbThPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDIwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0ltbThPcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4ZmYpKSA8PCA1MSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW04X1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweGZmKSA8PCAxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW04X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweGZmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tOF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHhmZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tOF9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHhmZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0p1bXBPZmZfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4N2ZmZmZmZikpIDw8IDMxKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0p1bXBPcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MSkpIDw8IDU4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX01GX0ltbTE0X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmZmYpKSA8PCAzNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9NVF9JbW0xNF9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAzZikpIDw8IDMxKSB8CisgICAgICAgICAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAzZmMwKSkgPDwgMzcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfTW9kZShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzKSkgPDwgNjIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfT3Bjb2RlX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDcpIDw8IDI4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX09wY29kZV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHg3KSkgPDwgNTkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfT3Bjb2RlX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweGYpIDw8IDI3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX09wY29kZV9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHhmKSkgPDwgNTgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfT3Bjb2RlX1kyKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDAwMDAwMDAxKSA8PCAyNikgfAorICAgICAgICAgKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAwMikpIDw8IDU2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZmYpIDw8IDE4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZmYpKSA8PCA0OSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWTAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4MykgPDwgMTgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDMpKSA8PCA0OSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaEFtdF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfU2hBbXRfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaEFtdF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfU2hBbXRfWTEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaGlmdE9wY29kZUV4dGVuc2lvbl9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZmYpIDw8IDE4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmZikpIDw8IDQ5KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDMpIDw8IDE4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDMpKSA8PCA0OSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCA2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NyY0FfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCAzNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCA2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NyY0FfWTEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCAzNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kyKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCAyMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNCRGVzdF9ZMihpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDUxKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NyY0JfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NyY0JfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNCX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNCX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfVW5hcnlPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfVW5hcnlPcGNvZGVFeHRlbnNpb25fWTAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOworfQorCisKK2VudW0KK3sKKyAgQURESV9JTU04X09QQ09ERV9YMCA9IDEsCisgIEFERElfSU1NOF9PUENPREVfWDEgPSAxLAorICBBRERJX09QQ09ERV9ZMCA9IDAsCisgIEFERElfT1BDT0RFX1kxID0gMSwKKyAgQURETElfT1BDT0RFX1gwID0gMSwKKyAgQURETElfT1BDT0RFX1gxID0gMCwKKyAgQUREWElfSU1NOF9PUENPREVfWDAgPSAyLAorICBBRERYSV9JTU04X09QQ09ERV9YMSA9IDIsCisgIEFERFhJX09QQ09ERV9ZMCA9IDEsCisgIEFERFhJX09QQ09ERV9ZMSA9IDIsCisgIEFERFhMSV9PUENPREVfWDAgPSAyLAorICBBRERYTElfT1BDT0RFX1gxID0gMSwKKyAgQUREWFNDX1JSUl8wX09QQ09ERV9YMCA9IDEsCisgIEFERFhTQ19SUlJfMF9PUENPREVfWDEgPSAxLAorICBBRERYX1JSUl8wX09QQ09ERV9YMCA9IDIsCisgIEFERFhfUlJSXzBfT1BDT0RFX1gxID0gMiwKKyAgQUREWF9SUlJfMF9PUENPREVfWTAgPSAwLAorICBBRERYX1NQRUNJQUxfMF9PUENPREVfWTEgPSAwLAorICBBRERfUlJSXzBfT1BDT0RFX1gwID0gMywKKyAgQUREX1JSUl8wX09QQ09ERV9YMSA9IDMsCisgIEFERF9SUlJfMF9PUENPREVfWTAgPSAxLAorICBBRERfU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDEsCisgIEFORElfSU1NOF9PUENPREVfWDAgPSAzLAorICBBTkRJX0lNTThfT1BDT0RFX1gxID0gMywKKyAgQU5ESV9PUENPREVfWTAgPSAyLAorICBBTkRJX09QQ09ERV9ZMSA9IDMsCisgIEFORF9SUlJfMF9PUENPREVfWDAgPSA0LAorICBBTkRfUlJSXzBfT1BDT0RFX1gxID0gNCwKKyAgQU5EX1JSUl81X09QQ09ERV9ZMCA9IDAsCisgIEFORF9SUlJfNV9PUENPREVfWTEgPSAwLAorICBCRVFaVF9CUkFOQ0hfT1BDT0RFX1gxID0gMTYsCisgIEJFUVpfQlJBTkNIX09QQ09ERV9YMSA9IDE3LAorICBCRkVYVFNfQkZfT1BDT0RFX1gwID0gNCwKKyAgQkZFWFRVX0JGX09QQ09ERV9YMCA9IDUsCisgIEJGSU5TX0JGX09QQ09ERV9YMCA9IDYsCisgIEJGX09QQ09ERV9YMCA9IDMsCisgIEJHRVpUX0JSQU5DSF9PUENPREVfWDEgPSAxOCwKKyAgQkdFWl9CUkFOQ0hfT1BDT0RFX1gxID0gMTksCisgIEJHVFpUX0JSQU5DSF9PUENPREVfWDEgPSAyMCwKKyAgQkdUWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjEsCisgIEJMQkNUX0JSQU5DSF9PUENPREVfWDEgPSAyMiwKKyAgQkxCQ19CUkFOQ0hfT1BDT0RFX1gxID0gMjMsCisgIEJMQlNUX0JSQU5DSF9PUENPREVfWDEgPSAyNCwKKyAgQkxCU19CUkFOQ0hfT1BDT0RFX1gxID0gMjUsCisgIEJMRVpUX0JSQU5DSF9PUENPREVfWDEgPSAyNiwKKyAgQkxFWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjcsCisgIEJMVFpUX0JSQU5DSF9PUENPREVfWDEgPSAyOCwKKyAgQkxUWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjksCisgIEJORVpUX0JSQU5DSF9PUENPREVfWDEgPSAzMCwKKyAgQk5FWl9CUkFOQ0hfT1BDT0RFX1gxID0gMzEsCisgIEJSQU5DSF9PUENPREVfWDEgPSAyLAorICBDTU9WRVFaX1JSUl8wX09QQ09ERV9YMCA9IDUsCisgIENNT1ZFUVpfUlJSXzRfT1BDT0RFX1kwID0gMCwKKyAgQ01PVk5FWl9SUlJfMF9PUENPREVfWDAgPSA2LAorICBDTU9WTkVaX1JSUl80X09QQ09ERV9ZMCA9IDEsCisgIENNUEVRSV9JTU04X09QQ09ERV9YMCA9IDQsCisgIENNUEVRSV9JTU04X09QQ09ERV9YMSA9IDQsCisgIENNUEVRSV9PUENPREVfWTAgPSAzLAorICBDTVBFUUlfT1BDT0RFX1kxID0gNCwKKyAgQ01QRVFfUlJSXzBfT1BDT0RFX1gwID0gNywKKyAgQ01QRVFfUlJSXzBfT1BDT0RFX1gxID0gNSwKKyAgQ01QRVFfUlJSXzNfT1BDT0RFX1kwID0gMCwKKyAgQ01QRVFfUlJSXzNfT1BDT0RFX1kxID0gMiwKKyAgQ01QRVhDSDRfUlJSXzBfT1BDT0RFX1gxID0gNiwKKyAgQ01QRVhDSF9SUlJfMF9PUENPREVfWDEgPSA3LAorICBDTVBMRVNfUlJSXzBfT1BDT0RFX1gwID0gOCwKKyAgQ01QTEVTX1JSUl8wX09QQ09ERV9YMSA9IDgsCisgIENNUExFU19SUlJfMl9PUENPREVfWTAgPSAwLAorICBDTVBMRVNfUlJSXzJfT1BDT0RFX1kxID0gMCwKKyAgQ01QTEVVX1JSUl8wX09QQ09ERV9YMCA9IDksCisgIENNUExFVV9SUlJfMF9PUENPREVfWDEgPSA5LAorICBDTVBMRVVfUlJSXzJfT1BDT0RFX1kwID0gMSwKKyAgQ01QTEVVX1JSUl8yX09QQ09ERV9ZMSA9IDEsCisgIENNUExUU0lfSU1NOF9PUENPREVfWDAgPSA1LAorICBDTVBMVFNJX0lNTThfT1BDT0RFX1gxID0gNSwKKyAgQ01QTFRTSV9PUENPREVfWTAgPSA0LAorICBDTVBMVFNJX09QQ09ERV9ZMSA9IDUsCisgIENNUExUU19SUlJfMF9PUENPREVfWDAgPSAxMCwKKyAgQ01QTFRTX1JSUl8wX09QQ09ERV9YMSA9IDEwLAorICBDTVBMVFNfUlJSXzJfT1BDT0RFX1kwID0gMiwKKyAgQ01QTFRTX1JSUl8yX09QQ09ERV9ZMSA9IDIsCisgIENNUExUVUlfSU1NOF9PUENPREVfWDAgPSA2LAorICBDTVBMVFVJX0lNTThfT1BDT0RFX1gxID0gNiwKKyAgQ01QTFRVX1JSUl8wX09QQ09ERV9YMCA9IDExLAorICBDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gMTEsCisgIENNUExUVV9SUlJfMl9PUENPREVfWTAgPSAzLAorICBDTVBMVFVfUlJSXzJfT1BDT0RFX1kxID0gMywKKyAgQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gMTIsCisgIENNUE5FX1JSUl8wX09QQ09ERV9YMSA9IDEyLAorICBDTVBORV9SUlJfM19PUENPREVfWTAgPSAxLAorICBDTVBORV9SUlJfM19PUENPREVfWTEgPSAzLAorICBDTVVMQUZfUlJSXzBfT1BDT0RFX1gwID0gMTMsCisgIENNVUxBX1JSUl8wX09QQ09ERV9YMCA9IDE0LAorICBDTVVMRlJfUlJSXzBfT1BDT0RFX1gwID0gMTUsCisgIENNVUxGX1JSUl8wX09QQ09ERV9YMCA9IDE2LAorICBDTVVMSFJfUlJSXzBfT1BDT0RFX1gwID0gMTcsCisgIENNVUxIX1JSUl8wX09QQ09ERV9YMCA9IDE4LAorICBDTVVMX1JSUl8wX09QQ09ERV9YMCA9IDE5LAorICBDTlRMWl9VTkFSWV9PUENPREVfWDAgPSAxLAorICBDTlRMWl9VTkFSWV9PUENPREVfWTAgPSAxLAorICBDTlRUWl9VTkFSWV9PUENPREVfWDAgPSAyLAorICBDTlRUWl9VTkFSWV9PUENPREVfWTAgPSAyLAorICBDUkMzMl8zMl9SUlJfMF9PUENPREVfWDAgPSAyMCwKKyAgQ1JDMzJfOF9SUlJfMF9PUENPREVfWDAgPSAyMSwKKyAgREJMQUxJR04yX1JSUl8wX09QQ09ERV9YMCA9IDIyLAorICBEQkxBTElHTjJfUlJSXzBfT1BDT0RFX1gxID0gMTMsCisgIERCTEFMSUdONF9SUlJfMF9PUENPREVfWDAgPSAyMywKKyAgREJMQUxJR040X1JSUl8wX09QQ09ERV9YMSA9IDE0LAorICBEQkxBTElHTjZfUlJSXzBfT1BDT0RFX1gwID0gMjQsCisgIERCTEFMSUdONl9SUlJfMF9PUENPREVfWDEgPSAxNSwKKyAgREJMQUxJR05fUlJSXzBfT1BDT0RFX1gwID0gMjUsCisgIERSQUlOX1VOQVJZX09QQ09ERV9YMSA9IDEsCisgIERUTEJQUl9VTkFSWV9PUENPREVfWDEgPSAyLAorICBFWENINF9SUlJfMF9PUENPREVfWDEgPSAxNiwKKyAgRVhDSF9SUlJfMF9PUENPREVfWDEgPSAxNywKKyAgRkRPVUJMRV9BRERTVUJfUlJSXzBfT1BDT0RFX1gwID0gMjYsCisgIEZET1VCTEVfQUREX0ZMQUdTX1JSUl8wX09QQ09ERV9YMCA9IDI3LAorICBGRE9VQkxFX01VTF9GTEFHU19SUlJfMF9PUENPREVfWDAgPSAyOCwKKyAgRkRPVUJMRV9QQUNLMV9SUlJfMF9PUENPREVfWDAgPSAyOSwKKyAgRkRPVUJMRV9QQUNLMl9SUlJfMF9PUENPREVfWDAgPSAzMCwKKyAgRkRPVUJMRV9TVUJfRkxBR1NfUlJSXzBfT1BDT0RFX1gwID0gMzEsCisgIEZET1VCTEVfVU5QQUNLX01BWF9SUlJfMF9PUENPREVfWDAgPSAzMiwKKyAgRkRPVUJMRV9VTlBBQ0tfTUlOX1JSUl8wX09QQ09ERV9YMCA9IDMzLAorICBGRVRDSEFERDRfUlJSXzBfT1BDT0RFX1gxID0gMTgsCisgIEZFVENIQURER0VaNF9SUlJfMF9PUENPREVfWDEgPSAxOSwKKyAgRkVUQ0hBRERHRVpfUlJSXzBfT1BDT0RFX1gxID0gMjAsCisgIEZFVENIQUREX1JSUl8wX09QQ09ERV9YMSA9IDIxLAorICBGRVRDSEFORDRfUlJSXzBfT1BDT0RFX1gxID0gMjIsCisgIEZFVENIQU5EX1JSUl8wX09QQ09ERV9YMSA9IDIzLAorICBGRVRDSE9SNF9SUlJfMF9PUENPREVfWDEgPSAyNCwKKyAgRkVUQ0hPUl9SUlJfMF9PUENPREVfWDEgPSAyNSwKKyAgRklOVl9VTkFSWV9PUENPREVfWDEgPSAzLAorICBGTFVTSFdCX1VOQVJZX09QQ09ERV9YMSA9IDQsCisgIEZMVVNIX1VOQVJZX09QQ09ERV9YMSA9IDUsCisgIEZOT1BfVU5BUllfT1BDT0RFX1gwID0gMywKKyAgRk5PUF9VTkFSWV9PUENPREVfWDEgPSA2LAorICBGTk9QX1VOQVJZX09QQ09ERV9ZMCA9IDMsCisgIEZOT1BfVU5BUllfT1BDT0RFX1kxID0gOCwKKyAgRlNJTkdMRV9BREQxX1JSUl8wX09QQ09ERV9YMCA9IDM0LAorICBGU0lOR0xFX0FERFNVQjJfUlJSXzBfT1BDT0RFX1gwID0gMzUsCisgIEZTSU5HTEVfTVVMMV9SUlJfMF9PUENPREVfWDAgPSAzNiwKKyAgRlNJTkdMRV9NVUwyX1JSUl8wX09QQ09ERV9YMCA9IDM3LAorICBGU0lOR0xFX1BBQ0sxX1VOQVJZX09QQ09ERV9YMCA9IDQsCisgIEZTSU5HTEVfUEFDSzFfVU5BUllfT1BDT0RFX1kwID0gNCwKKyAgRlNJTkdMRV9QQUNLMl9SUlJfMF9PUENPREVfWDAgPSAzOCwKKyAgRlNJTkdMRV9TVUIxX1JSUl8wX09QQ09ERV9YMCA9IDM5LAorICBJQ09IX1VOQVJZX09QQ09ERV9YMSA9IDcsCisgIElMTF9VTkFSWV9PUENPREVfWDEgPSA4LAorICBJTExfVU5BUllfT1BDT0RFX1kxID0gOSwKKyAgSU1NOF9PUENPREVfWDAgPSA0LAorICBJTU04X09QQ09ERV9YMSA9IDMsCisgIElOVl9VTkFSWV9PUENPREVfWDEgPSA5LAorICBJUkVUX1VOQVJZX09QQ09ERV9YMSA9IDEwLAorICBKQUxSUF9VTkFSWV9PUENPREVfWDEgPSAxMSwKKyAgSkFMUlBfVU5BUllfT1BDT0RFX1kxID0gMTAsCisgIEpBTFJfVU5BUllfT1BDT0RFX1gxID0gMTIsCisgIEpBTFJfVU5BUllfT1BDT0RFX1kxID0gMTEsCisgIEpBTF9KVU1QX09QQ09ERV9YMSA9IDAsCisgIEpSUF9VTkFSWV9PUENPREVfWDEgPSAxMywKKyAgSlJQX1VOQVJZX09QQ09ERV9ZMSA9IDEyLAorICBKUl9VTkFSWV9PUENPREVfWDEgPSAxNCwKKyAgSlJfVU5BUllfT1BDT0RFX1kxID0gMTMsCisgIEpVTVBfT1BDT0RFX1gxID0gNCwKKyAgSl9KVU1QX09QQ09ERV9YMSA9IDEsCisgIExEMVNfQUREX0lNTThfT1BDT0RFX1gxID0gNywKKyAgTEQxU19PUENPREVfWTIgPSAwLAorICBMRDFTX1VOQVJZX09QQ09ERV9YMSA9IDE1LAorICBMRDFVX0FERF9JTU04X09QQ09ERV9YMSA9IDgsCisgIExEMVVfT1BDT0RFX1kyID0gMSwKKyAgTEQxVV9VTkFSWV9PUENPREVfWDEgPSAxNiwKKyAgTEQyU19BRERfSU1NOF9PUENPREVfWDEgPSA5LAorICBMRDJTX09QQ09ERV9ZMiA9IDIsCisgIExEMlNfVU5BUllfT1BDT0RFX1gxID0gMTcsCisgIExEMlVfQUREX0lNTThfT1BDT0RFX1gxID0gMTAsCisgIExEMlVfT1BDT0RFX1kyID0gMywKKyAgTEQyVV9VTkFSWV9PUENPREVfWDEgPSAxOCwKKyAgTEQ0U19BRERfSU1NOF9PUENPREVfWDEgPSAxMSwKKyAgTEQ0U19PUENPREVfWTIgPSAxLAorICBMRDRTX1VOQVJZX09QQ09ERV9YMSA9IDE5LAorICBMRDRVX0FERF9JTU04X09QQ09ERV9YMSA9IDEyLAorICBMRDRVX09QQ09ERV9ZMiA9IDIsCisgIExENFVfVU5BUllfT1BDT0RFX1gxID0gMjAsCisgIExETkFfVU5BUllfT1BDT0RFX1gxID0gMjEsCisgIExETlQxU19BRERfSU1NOF9PUENPREVfWDEgPSAxMywKKyAgTEROVDFTX1VOQVJZX09QQ09ERV9YMSA9IDIyLAorICBMRE5UMVVfQUREX0lNTThfT1BDT0RFX1gxID0gMTQsCisgIExETlQxVV9VTkFSWV9PUENPREVfWDEgPSAyMywKKyAgTEROVDJTX0FERF9JTU04X09QQ09ERV9YMSA9IDE1LAorICBMRE5UMlNfVU5BUllfT1BDT0RFX1gxID0gMjQsCisgIExETlQyVV9BRERfSU1NOF9PUENPREVfWDEgPSAxNiwKKyAgTEROVDJVX1VOQVJZX09QQ09ERV9YMSA9IDI1LAorICBMRE5UNFNfQUREX0lNTThfT1BDT0RFX1gxID0gMTcsCisgIExETlQ0U19VTkFSWV9PUENPREVfWDEgPSAyNiwKKyAgTEROVDRVX0FERF9JTU04X09QQ09ERV9YMSA9IDE4LAorICBMRE5UNFVfVU5BUllfT1BDT0RFX1gxID0gMjcsCisgIExETlRfQUREX0lNTThfT1BDT0RFX1gxID0gMTksCisgIExETlRfVU5BUllfT1BDT0RFX1gxID0gMjgsCisgIExEX0FERF9JTU04X09QQ09ERV9YMSA9IDIwLAorICBMRF9PUENPREVfWTIgPSAzLAorICBMRF9VTkFSWV9PUENPREVfWDEgPSAyOSwKKyAgTE5LX1VOQVJZX09QQ09ERV9YMSA9IDMwLAorICBMTktfVU5BUllfT1BDT0RFX1kxID0gMTQsCisgIExXTkFfQUREX0lNTThfT1BDT0RFX1gxID0gMjEsCisgIE1GU1BSX0lNTThfT1BDT0RFX1gxID0gMjIsCisgIE1GX1VOQVJZX09QQ09ERV9YMSA9IDMxLAorICBNTV9CRl9PUENPREVfWDAgPSA3LAorICBNTlpfUlJSXzBfT1BDT0RFX1gwID0gNDAsCisgIE1OWl9SUlJfMF9PUENPREVfWDEgPSAyNiwKKyAgTU5aX1JSUl80X09QQ09ERV9ZMCA9IDIsCisgIE1OWl9SUlJfNF9PUENPREVfWTEgPSAyLAorICBNT0RFX09QQ09ERV9ZQTIgPSAxLAorICBNT0RFX09QQ09ERV9ZQjIgPSAyLAorICBNT0RFX09QQ09ERV9ZQzIgPSAzLAorICBNVFNQUl9JTU04X09QQ09ERV9YMSA9IDIzLAorICBNVUxBWF9SUlJfMF9PUENPREVfWDAgPSA0MSwKKyAgTVVMQVhfUlJSXzNfT1BDT0RFX1kwID0gMiwKKyAgTVVMQV9IU19IU19SUlJfMF9PUENPREVfWDAgPSA0MiwKKyAgTVVMQV9IU19IU19SUlJfOV9PUENPREVfWTAgPSAwLAorICBNVUxBX0hTX0hVX1JSUl8wX09QQ09ERV9YMCA9IDQzLAorICBNVUxBX0hTX0xTX1JSUl8wX09QQ09ERV9YMCA9IDQ0LAorICBNVUxBX0hTX0xVX1JSUl8wX09QQ09ERV9YMCA9IDQ1LAorICBNVUxBX0hVX0hVX1JSUl8wX09QQ09ERV9YMCA9IDQ2LAorICBNVUxBX0hVX0hVX1JSUl85X09QQ09ERV9ZMCA9IDEsCisgIE1VTEFfSFVfTFNfUlJSXzBfT1BDT0RFX1gwID0gNDcsCisgIE1VTEFfSFVfTFVfUlJSXzBfT1BDT0RFX1gwID0gNDgsCisgIE1VTEFfTFNfTFNfUlJSXzBfT1BDT0RFX1gwID0gNDksCisgIE1VTEFfTFNfTFNfUlJSXzlfT1BDT0RFX1kwID0gMiwKKyAgTVVMQV9MU19MVV9SUlJfMF9PUENPREVfWDAgPSA1MCwKKyAgTVVMQV9MVV9MVV9SUlJfMF9PUENPREVfWDAgPSA1MSwKKyAgTVVMQV9MVV9MVV9SUlJfOV9PUENPREVfWTAgPSAzLAorICBNVUxYX1JSUl8wX09QQ09ERV9YMCA9IDUyLAorICBNVUxYX1JSUl8zX09QQ09ERV9ZMCA9IDMsCisgIE1VTF9IU19IU19SUlJfMF9PUENPREVfWDAgPSA1MywKKyAgTVVMX0hTX0hTX1JSUl84X09QQ09ERV9ZMCA9IDAsCisgIE1VTF9IU19IVV9SUlJfMF9PUENPREVfWDAgPSA1NCwKKyAgTVVMX0hTX0xTX1JSUl8wX09QQ09ERV9YMCA9IDU1LAorICBNVUxfSFNfTFVfUlJSXzBfT1BDT0RFX1gwID0gNTYsCisgIE1VTF9IVV9IVV9SUlJfMF9PUENPREVfWDAgPSA1NywKKyAgTVVMX0hVX0hVX1JSUl84X09QQ09ERV9ZMCA9IDEsCisgIE1VTF9IVV9MU19SUlJfMF9PUENPREVfWDAgPSA1OCwKKyAgTVVMX0hVX0xVX1JSUl8wX09QQ09ERV9YMCA9IDU5LAorICBNVUxfTFNfTFNfUlJSXzBfT1BDT0RFX1gwID0gNjAsCisgIE1VTF9MU19MU19SUlJfOF9PUENPREVfWTAgPSAyLAorICBNVUxfTFNfTFVfUlJSXzBfT1BDT0RFX1gwID0gNjEsCisgIE1VTF9MVV9MVV9SUlJfMF9PUENPREVfWDAgPSA2MiwKKyAgTVVMX0xVX0xVX1JSUl84X09QQ09ERV9ZMCA9IDMsCisgIE1aX1JSUl8wX09QQ09ERV9YMCA9IDYzLAorICBNWl9SUlJfMF9PUENPREVfWDEgPSAyNywKKyAgTVpfUlJSXzRfT1BDT0RFX1kwID0gMywKKyAgTVpfUlJSXzRfT1BDT0RFX1kxID0gMywKKyAgTkFQX1VOQVJZX09QQ09ERV9YMSA9IDMyLAorICBOT1BfVU5BUllfT1BDT0RFX1gwID0gNSwKKyAgTk9QX1VOQVJZX09QQ09ERV9YMSA9IDMzLAorICBOT1BfVU5BUllfT1BDT0RFX1kwID0gNSwKKyAgTk9QX1VOQVJZX09QQ09ERV9ZMSA9IDE1LAorICBOT1JfUlJSXzBfT1BDT0RFX1gwID0gNjQsCisgIE5PUl9SUlJfMF9PUENPREVfWDEgPSAyOCwKKyAgTk9SX1JSUl81X09QQ09ERV9ZMCA9IDEsCisgIE5PUl9SUlJfNV9PUENPREVfWTEgPSAxLAorICBPUklfSU1NOF9PUENPREVfWDAgPSA3LAorICBPUklfSU1NOF9PUENPREVfWDEgPSAyNCwKKyAgT1JfUlJSXzBfT1BDT0RFX1gwID0gNjUsCisgIE9SX1JSUl8wX09QQ09ERV9YMSA9IDI5LAorICBPUl9SUlJfNV9PUENPREVfWTAgPSAyLAorICBPUl9SUlJfNV9PUENPREVfWTEgPSAyLAorICBQQ05UX1VOQVJZX09QQ09ERV9YMCA9IDYsCisgIFBDTlRfVU5BUllfT1BDT0RFX1kwID0gNiwKKyAgUkVWQklUU19VTkFSWV9PUENPREVfWDAgPSA3LAorICBSRVZCSVRTX1VOQVJZX09QQ09ERV9ZMCA9IDcsCisgIFJFVkJZVEVTX1VOQVJZX09QQ09ERV9YMCA9IDgsCisgIFJFVkJZVEVTX1VOQVJZX09QQ09ERV9ZMCA9IDgsCisgIFJPVExJX1NISUZUX09QQ09ERV9YMCA9IDEsCisgIFJPVExJX1NISUZUX09QQ09ERV9YMSA9IDEsCisgIFJPVExJX1NISUZUX09QQ09ERV9ZMCA9IDAsCisgIFJPVExJX1NISUZUX09QQ09ERV9ZMSA9IDAsCisgIFJPVExfUlJSXzBfT1BDT0RFX1gwID0gNjYsCisgIFJPVExfUlJSXzBfT1BDT0RFX1gxID0gMzAsCisgIFJPVExfUlJSXzZfT1BDT0RFX1kwID0gMCwKKyAgUk9UTF9SUlJfNl9PUENPREVfWTEgPSAwLAorICBSUlJfMF9PUENPREVfWDAgPSA1LAorICBSUlJfMF9PUENPREVfWDEgPSA1LAorICBSUlJfMF9PUENPREVfWTAgPSA1LAorICBSUlJfMF9PUENPREVfWTEgPSA2LAorICBSUlJfMV9PUENPREVfWTAgPSA2LAorICBSUlJfMV9PUENPREVfWTEgPSA3LAorICBSUlJfMl9PUENPREVfWTAgPSA3LAorICBSUlJfMl9PUENPREVfWTEgPSA4LAorICBSUlJfM19PUENPREVfWTAgPSA4LAorICBSUlJfM19PUENPREVfWTEgPSA5LAorICBSUlJfNF9PUENPREVfWTAgPSA5LAorICBSUlJfNF9PUENPREVfWTEgPSAxMCwKKyAgUlJSXzVfT1BDT0RFX1kwID0gMTAsCisgIFJSUl81X09QQ09ERV9ZMSA9IDExLAorICBSUlJfNl9PUENPREVfWTAgPSAxMSwKKyAgUlJSXzZfT1BDT0RFX1kxID0gMTIsCisgIFJSUl83X09QQ09ERV9ZMCA9IDEyLAorICBSUlJfN19PUENPREVfWTEgPSAxMywKKyAgUlJSXzhfT1BDT0RFX1kwID0gMTMsCisgIFJSUl85X09QQ09ERV9ZMCA9IDE0LAorICBTSElGVF9PUENPREVfWDAgPSA2LAorICBTSElGVF9PUENPREVfWDEgPSA2LAorICBTSElGVF9PUENPREVfWTAgPSAxNSwKKyAgU0hJRlRfT1BDT0RFX1kxID0gMTQsCisgIFNITDE2SU5TTElfT1BDT0RFX1gwID0gNywKKyAgU0hMMTZJTlNMSV9PUENPREVfWDEgPSA3LAorICBTSEwxQUREWF9SUlJfMF9PUENPREVfWDAgPSA2NywKKyAgU0hMMUFERFhfUlJSXzBfT1BDT0RFX1gxID0gMzEsCisgIFNITDFBRERYX1JSUl83X09QQ09ERV9ZMCA9IDEsCisgIFNITDFBRERYX1JSUl83X09QQ09ERV9ZMSA9IDEsCisgIFNITDFBRERfUlJSXzBfT1BDT0RFX1gwID0gNjgsCisgIFNITDFBRERfUlJSXzBfT1BDT0RFX1gxID0gMzIsCisgIFNITDFBRERfUlJSXzFfT1BDT0RFX1kwID0gMCwKKyAgU0hMMUFERF9SUlJfMV9PUENPREVfWTEgPSAwLAorICBTSEwyQUREWF9SUlJfMF9PUENPREVfWDAgPSA2OSwKKyAgU0hMMkFERFhfUlJSXzBfT1BDT0RFX1gxID0gMzMsCisgIFNITDJBRERYX1JSUl83X09QQ09ERV9ZMCA9IDIsCisgIFNITDJBRERYX1JSUl83X09QQ09ERV9ZMSA9IDIsCisgIFNITDJBRERfUlJSXzBfT1BDT0RFX1gwID0gNzAsCisgIFNITDJBRERfUlJSXzBfT1BDT0RFX1gxID0gMzQsCisgIFNITDJBRERfUlJSXzFfT1BDT0RFX1kwID0gMSwKKyAgU0hMMkFERF9SUlJfMV9PUENPREVfWTEgPSAxLAorICBTSEwzQUREWF9SUlJfMF9PUENPREVfWDAgPSA3MSwKKyAgU0hMM0FERFhfUlJSXzBfT1BDT0RFX1gxID0gMzUsCisgIFNITDNBRERYX1JSUl83X09QQ09ERV9ZMCA9IDMsCisgIFNITDNBRERYX1JSUl83X09QQ09ERV9ZMSA9IDMsCisgIFNITDNBRERfUlJSXzBfT1BDT0RFX1gwID0gNzIsCisgIFNITDNBRERfUlJSXzBfT1BDT0RFX1gxID0gMzYsCisgIFNITDNBRERfUlJSXzFfT1BDT0RFX1kwID0gMiwKKyAgU0hMM0FERF9SUlJfMV9PUENPREVfWTEgPSAyLAorICBTSExJX1NISUZUX09QQ09ERV9YMCA9IDIsCisgIFNITElfU0hJRlRfT1BDT0RFX1gxID0gMiwKKyAgU0hMSV9TSElGVF9PUENPREVfWTAgPSAxLAorICBTSExJX1NISUZUX09QQ09ERV9ZMSA9IDEsCisgIFNITFhJX1NISUZUX09QQ09ERV9YMCA9IDMsCisgIFNITFhJX1NISUZUX09QQ09ERV9YMSA9IDMsCisgIFNITFhfUlJSXzBfT1BDT0RFX1gwID0gNzMsCisgIFNITFhfUlJSXzBfT1BDT0RFX1gxID0gMzcsCisgIFNITF9SUlJfMF9PUENPREVfWDAgPSA3NCwKKyAgU0hMX1JSUl8wX09QQ09ERV9YMSA9IDM4LAorICBTSExfUlJSXzZfT1BDT0RFX1kwID0gMSwKKyAgU0hMX1JSUl82X09QQ09ERV9ZMSA9IDEsCisgIFNIUlNJX1NISUZUX09QQ09ERV9YMCA9IDQsCisgIFNIUlNJX1NISUZUX09QQ09ERV9YMSA9IDQsCisgIFNIUlNJX1NISUZUX09QQ09ERV9ZMCA9IDIsCisgIFNIUlNJX1NISUZUX09QQ09ERV9ZMSA9IDIsCisgIFNIUlNfUlJSXzBfT1BDT0RFX1gwID0gNzUsCisgIFNIUlNfUlJSXzBfT1BDT0RFX1gxID0gMzksCisgIFNIUlNfUlJSXzZfT1BDT0RFX1kwID0gMiwKKyAgU0hSU19SUlJfNl9PUENPREVfWTEgPSAyLAorICBTSFJVSV9TSElGVF9PUENPREVfWDAgPSA1LAorICBTSFJVSV9TSElGVF9PUENPREVfWDEgPSA1LAorICBTSFJVSV9TSElGVF9PUENPREVfWTAgPSAzLAorICBTSFJVSV9TSElGVF9PUENPREVfWTEgPSAzLAorICBTSFJVWElfU0hJRlRfT1BDT0RFX1gwID0gNiwKKyAgU0hSVVhJX1NISUZUX09QQ09ERV9YMSA9IDYsCisgIFNIUlVYX1JSUl8wX09QQ09ERV9YMCA9IDc2LAorICBTSFJVWF9SUlJfMF9PUENPREVfWDEgPSA0MCwKKyAgU0hSVV9SUlJfMF9PUENPREVfWDAgPSA3NywKKyAgU0hSVV9SUlJfMF9PUENPREVfWDEgPSA0MSwKKyAgU0hSVV9SUlJfNl9PUENPREVfWTAgPSAzLAorICBTSFJVX1JSUl82X09QQ09ERV9ZMSA9IDMsCisgIFNIVUZGTEVCWVRFU19SUlJfMF9PUENPREVfWDAgPSA3OCwKKyAgU1QxX0FERF9JTU04X09QQ09ERV9YMSA9IDI1LAorICBTVDFfT1BDT0RFX1kyID0gMCwKKyAgU1QxX1JSUl8wX09QQ09ERV9YMSA9IDQyLAorICBTVDJfQUREX0lNTThfT1BDT0RFX1gxID0gMjYsCisgIFNUMl9PUENPREVfWTIgPSAxLAorICBTVDJfUlJSXzBfT1BDT0RFX1gxID0gNDMsCisgIFNUNF9BRERfSU1NOF9PUENPREVfWDEgPSAyNywKKyAgU1Q0X09QQ09ERV9ZMiA9IDIsCisgIFNUNF9SUlJfMF9PUENPREVfWDEgPSA0NCwKKyAgU1ROVDFfQUREX0lNTThfT1BDT0RFX1gxID0gMjgsCisgIFNUTlQxX1JSUl8wX09QQ09ERV9YMSA9IDQ1LAorICBTVE5UMl9BRERfSU1NOF9PUENPREVfWDEgPSAyOSwKKyAgU1ROVDJfUlJSXzBfT1BDT0RFX1gxID0gNDYsCisgIFNUTlQ0X0FERF9JTU04X09QQ09ERV9YMSA9IDMwLAorICBTVE5UNF9SUlJfMF9PUENPREVfWDEgPSA0NywKKyAgU1ROVF9BRERfSU1NOF9PUENPREVfWDEgPSAzMSwKKyAgU1ROVF9SUlJfMF9PUENPREVfWDEgPSA0OCwKKyAgU1RfQUREX0lNTThfT1BDT0RFX1gxID0gMzIsCisgIFNUX09QQ09ERV9ZMiA9IDMsCisgIFNUX1JSUl8wX09QQ09ERV9YMSA9IDQ5LAorICBTVUJYU0NfUlJSXzBfT1BDT0RFX1gwID0gNzksCisgIFNVQlhTQ19SUlJfMF9PUENPREVfWDEgPSA1MCwKKyAgU1VCWF9SUlJfMF9PUENPREVfWDAgPSA4MCwKKyAgU1VCWF9SUlJfMF9PUENPREVfWDEgPSA1MSwKKyAgU1VCWF9SUlJfMF9PUENPREVfWTAgPSAyLAorICBTVUJYX1JSUl8wX09QQ09ERV9ZMSA9IDIsCisgIFNVQl9SUlJfMF9PUENPREVfWDAgPSA4MSwKKyAgU1VCX1JSUl8wX09QQ09ERV9YMSA9IDUyLAorICBTVUJfUlJSXzBfT1BDT0RFX1kwID0gMywKKyAgU1VCX1JSUl8wX09QQ09ERV9ZMSA9IDMsCisgIFNXSU5UMF9VTkFSWV9PUENPREVfWDEgPSAzNCwKKyAgU1dJTlQxX1VOQVJZX09QQ09ERV9YMSA9IDM1LAorICBTV0lOVDJfVU5BUllfT1BDT0RFX1gxID0gMzYsCisgIFNXSU5UM19VTkFSWV9PUENPREVfWDEgPSAzNywKKyAgVEJMSURYQjBfVU5BUllfT1BDT0RFX1gwID0gOSwKKyAgVEJMSURYQjBfVU5BUllfT1BDT0RFX1kwID0gOSwKKyAgVEJMSURYQjFfVU5BUllfT1BDT0RFX1gwID0gMTAsCisgIFRCTElEWEIxX1VOQVJZX09QQ09ERV9ZMCA9IDEwLAorICBUQkxJRFhCMl9VTkFSWV9PUENPREVfWDAgPSAxMSwKKyAgVEJMSURYQjJfVU5BUllfT1BDT0RFX1kwID0gMTEsCisgIFRCTElEWEIzX1VOQVJZX09QQ09ERV9YMCA9IDEyLAorICBUQkxJRFhCM19VTkFSWV9PUENPREVfWTAgPSAxMiwKKyAgVU5BUllfUlJSXzBfT1BDT0RFX1gwID0gODIsCisgIFVOQVJZX1JSUl8wX09QQ09ERV9YMSA9IDUzLAorICBVTkFSWV9SUlJfMV9PUENPREVfWTAgPSAzLAorICBVTkFSWV9SUlJfMV9PUENPREVfWTEgPSAzLAorICBWMUFERElfSU1NOF9PUENPREVfWDAgPSA4LAorICBWMUFERElfSU1NOF9PUENPREVfWDEgPSAzMywKKyAgVjFBRERVQ19SUlJfMF9PUENPREVfWDAgPSA4MywKKyAgVjFBRERVQ19SUlJfMF9PUENPREVfWDEgPSA1NCwKKyAgVjFBRERfUlJSXzBfT1BDT0RFX1gwID0gODQsCisgIFYxQUREX1JSUl8wX09QQ09ERV9YMSA9IDU1LAorICBWMUFESUZGVV9SUlJfMF9PUENPREVfWDAgPSA4NSwKKyAgVjFBVkdVX1JSUl8wX09QQ09ERV9YMCA9IDg2LAorICBWMUNNUEVRSV9JTU04X09QQ09ERV9YMCA9IDksCisgIFYxQ01QRVFJX0lNTThfT1BDT0RFX1gxID0gMzQsCisgIFYxQ01QRVFfUlJSXzBfT1BDT0RFX1gwID0gODcsCisgIFYxQ01QRVFfUlJSXzBfT1BDT0RFX1gxID0gNTYsCisgIFYxQ01QTEVTX1JSUl8wX09QQ09ERV9YMCA9IDg4LAorICBWMUNNUExFU19SUlJfMF9PUENPREVfWDEgPSA1NywKKyAgVjFDTVBMRVVfUlJSXzBfT1BDT0RFX1gwID0gODksCisgIFYxQ01QTEVVX1JSUl8wX09QQ09ERV9YMSA9IDU4LAorICBWMUNNUExUU0lfSU1NOF9PUENPREVfWDAgPSAxMCwKKyAgVjFDTVBMVFNJX0lNTThfT1BDT0RFX1gxID0gMzUsCisgIFYxQ01QTFRTX1JSUl8wX09QQ09ERV9YMCA9IDkwLAorICBWMUNNUExUU19SUlJfMF9PUENPREVfWDEgPSA1OSwKKyAgVjFDTVBMVFVJX0lNTThfT1BDT0RFX1gwID0gMTEsCisgIFYxQ01QTFRVSV9JTU04X09QQ09ERV9YMSA9IDM2LAorICBWMUNNUExUVV9SUlJfMF9PUENPREVfWDAgPSA5MSwKKyAgVjFDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gNjAsCisgIFYxQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gOTIsCisgIFYxQ01QTkVfUlJSXzBfT1BDT0RFX1gxID0gNjEsCisgIFYxRERPVFBVQV9SUlJfMF9PUENPREVfWDAgPSAxNjEsCisgIFYxRERPVFBVU0FfUlJSXzBfT1BDT0RFX1gwID0gOTMsCisgIFYxRERPVFBVU19SUlJfMF9PUENPREVfWDAgPSA5NCwKKyAgVjFERE9UUFVfUlJSXzBfT1BDT0RFX1gwID0gMTYyLAorICBWMURPVFBBX1JSUl8wX09QQ09ERV9YMCA9IDk1LAorICBWMURPVFBVQV9SUlJfMF9PUENPREVfWDAgPSAxNjMsCisgIFYxRE9UUFVTQV9SUlJfMF9PUENPREVfWDAgPSA5NiwKKyAgVjFET1RQVVNfUlJSXzBfT1BDT0RFX1gwID0gOTcsCisgIFYxRE9UUFVfUlJSXzBfT1BDT0RFX1gwID0gMTY0LAorICBWMURPVFBfUlJSXzBfT1BDT0RFX1gwID0gOTgsCisgIFYxSU5UX0hfUlJSXzBfT1BDT0RFX1gwID0gOTksCisgIFYxSU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gNjIsCisgIFYxSU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTAwLAorICBWMUlOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDYzLAorICBWMU1BWFVJX0lNTThfT1BDT0RFX1gwID0gMTIsCisgIFYxTUFYVUlfSU1NOF9PUENPREVfWDEgPSAzNywKKyAgVjFNQVhVX1JSUl8wX09QQ09ERV9YMCA9IDEwMSwKKyAgVjFNQVhVX1JSUl8wX09QQ09ERV9YMSA9IDY0LAorICBWMU1JTlVJX0lNTThfT1BDT0RFX1gwID0gMTMsCisgIFYxTUlOVUlfSU1NOF9PUENPREVfWDEgPSAzOCwKKyAgVjFNSU5VX1JSUl8wX09QQ09ERV9YMCA9IDEwMiwKKyAgVjFNSU5VX1JSUl8wX09QQ09ERV9YMSA9IDY1LAorICBWMU1OWl9SUlJfMF9PUENPREVfWDAgPSAxMDMsCisgIFYxTU5aX1JSUl8wX09QQ09ERV9YMSA9IDY2LAorICBWMU1VTFRVX1JSUl8wX09QQ09ERV9YMCA9IDEwNCwKKyAgVjFNVUxVU19SUlJfMF9PUENPREVfWDAgPSAxMDUsCisgIFYxTVVMVV9SUlJfMF9PUENPREVfWDAgPSAxMDYsCisgIFYxTVpfUlJSXzBfT1BDT0RFX1gwID0gMTA3LAorICBWMU1aX1JSUl8wX09QQ09ERV9YMSA9IDY3LAorICBWMVNBREFVX1JSUl8wX09QQ09ERV9YMCA9IDEwOCwKKyAgVjFTQURVX1JSUl8wX09QQ09ERV9YMCA9IDEwOSwKKyAgVjFTSExJX1NISUZUX09QQ09ERV9YMCA9IDcsCisgIFYxU0hMSV9TSElGVF9PUENPREVfWDEgPSA3LAorICBWMVNITF9SUlJfMF9PUENPREVfWDAgPSAxMTAsCisgIFYxU0hMX1JSUl8wX09QQ09ERV9YMSA9IDY4LAorICBWMVNIUlNJX1NISUZUX09QQ09ERV9YMCA9IDgsCisgIFYxU0hSU0lfU0hJRlRfT1BDT0RFX1gxID0gOCwKKyAgVjFTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDExMSwKKyAgVjFTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDY5LAorICBWMVNIUlVJX1NISUZUX09QQ09ERV9YMCA9IDksCisgIFYxU0hSVUlfU0hJRlRfT1BDT0RFX1gxID0gOSwKKyAgVjFTSFJVX1JSUl8wX09QQ09ERV9YMCA9IDExMiwKKyAgVjFTSFJVX1JSUl8wX09QQ09ERV9YMSA9IDcwLAorICBWMVNVQlVDX1JSUl8wX09QQ09ERV9YMCA9IDExMywKKyAgVjFTVUJVQ19SUlJfMF9PUENPREVfWDEgPSA3MSwKKyAgVjFTVUJfUlJSXzBfT1BDT0RFX1gwID0gMTE0LAorICBWMVNVQl9SUlJfMF9PUENPREVfWDEgPSA3MiwKKyAgVjJBRERJX0lNTThfT1BDT0RFX1gwID0gMTQsCisgIFYyQURESV9JTU04X09QQ09ERV9YMSA9IDM5LAorICBWMkFERFNDX1JSUl8wX09QQ09ERV9YMCA9IDExNSwKKyAgVjJBRERTQ19SUlJfMF9PUENPREVfWDEgPSA3MywKKyAgVjJBRERfUlJSXzBfT1BDT0RFX1gwID0gMTE2LAorICBWMkFERF9SUlJfMF9PUENPREVfWDEgPSA3NCwKKyAgVjJBRElGRlNfUlJSXzBfT1BDT0RFX1gwID0gMTE3LAorICBWMkFWR1NfUlJSXzBfT1BDT0RFX1gwID0gMTE4LAorICBWMkNNUEVRSV9JTU04X09QQ09ERV9YMCA9IDE1LAorICBWMkNNUEVRSV9JTU04X09QQ09ERV9YMSA9IDQwLAorICBWMkNNUEVRX1JSUl8wX09QQ09ERV9YMCA9IDExOSwKKyAgVjJDTVBFUV9SUlJfMF9PUENPREVfWDEgPSA3NSwKKyAgVjJDTVBMRVNfUlJSXzBfT1BDT0RFX1gwID0gMTIwLAorICBWMkNNUExFU19SUlJfMF9PUENPREVfWDEgPSA3NiwKKyAgVjJDTVBMRVVfUlJSXzBfT1BDT0RFX1gwID0gMTIxLAorICBWMkNNUExFVV9SUlJfMF9PUENPREVfWDEgPSA3NywKKyAgVjJDTVBMVFNJX0lNTThfT1BDT0RFX1gwID0gMTYsCisgIFYyQ01QTFRTSV9JTU04X09QQ09ERV9YMSA9IDQxLAorICBWMkNNUExUU19SUlJfMF9PUENPREVfWDAgPSAxMjIsCisgIFYyQ01QTFRTX1JSUl8wX09QQ09ERV9YMSA9IDc4LAorICBWMkNNUExUVUlfSU1NOF9PUENPREVfWDAgPSAxNywKKyAgVjJDTVBMVFVJX0lNTThfT1BDT0RFX1gxID0gNDIsCisgIFYyQ01QTFRVX1JSUl8wX09QQ09ERV9YMCA9IDEyMywKKyAgVjJDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gNzksCisgIFYyQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gMTI0LAorICBWMkNNUE5FX1JSUl8wX09QQ09ERV9YMSA9IDgwLAorICBWMkRPVFBBX1JSUl8wX09QQ09ERV9YMCA9IDEyNSwKKyAgVjJET1RQX1JSUl8wX09QQ09ERV9YMCA9IDEyNiwKKyAgVjJJTlRfSF9SUlJfMF9PUENPREVfWDAgPSAxMjcsCisgIFYySU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gODEsCisgIFYySU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTI4LAorICBWMklOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDgyLAorICBWMk1BWFNJX0lNTThfT1BDT0RFX1gwID0gMTgsCisgIFYyTUFYU0lfSU1NOF9PUENPREVfWDEgPSA0MywKKyAgVjJNQVhTX1JSUl8wX09QQ09ERV9YMCA9IDEyOSwKKyAgVjJNQVhTX1JSUl8wX09QQ09ERV9YMSA9IDgzLAorICBWMk1JTlNJX0lNTThfT1BDT0RFX1gwID0gMTksCisgIFYyTUlOU0lfSU1NOF9PUENPREVfWDEgPSA0NCwKKyAgVjJNSU5TX1JSUl8wX09QQ09ERV9YMCA9IDEzMCwKKyAgVjJNSU5TX1JSUl8wX09QQ09ERV9YMSA9IDg0LAorICBWMk1OWl9SUlJfMF9PUENPREVfWDAgPSAxMzEsCisgIFYyTU5aX1JSUl8wX09QQ09ERV9YMSA9IDg1LAorICBWMk1VTEZTQ19SUlJfMF9PUENPREVfWDAgPSAxMzIsCisgIFYyTVVMU19SUlJfMF9PUENPREVfWDAgPSAxMzMsCisgIFYyTVVMVFNfUlJSXzBfT1BDT0RFX1gwID0gMTM0LAorICBWMk1aX1JSUl8wX09QQ09ERV9YMCA9IDEzNSwKKyAgVjJNWl9SUlJfMF9PUENPREVfWDEgPSA4NiwKKyAgVjJQQUNLSF9SUlJfMF9PUENPREVfWDAgPSAxMzYsCisgIFYyUEFDS0hfUlJSXzBfT1BDT0RFX1gxID0gODcsCisgIFYyUEFDS0xfUlJSXzBfT1BDT0RFX1gwID0gMTM3LAorICBWMlBBQ0tMX1JSUl8wX09QQ09ERV9YMSA9IDg4LAorICBWMlBBQ0tVQ19SUlJfMF9PUENPREVfWDAgPSAxMzgsCisgIFYyUEFDS1VDX1JSUl8wX09QQ09ERV9YMSA9IDg5LAorICBWMlNBREFTX1JSUl8wX09QQ09ERV9YMCA9IDEzOSwKKyAgVjJTQURBVV9SUlJfMF9PUENPREVfWDAgPSAxNDAsCisgIFYyU0FEU19SUlJfMF9PUENPREVfWDAgPSAxNDEsCisgIFYyU0FEVV9SUlJfMF9PUENPREVfWDAgPSAxNDIsCisgIFYyU0hMSV9TSElGVF9PUENPREVfWDAgPSAxMCwKKyAgVjJTSExJX1NISUZUX09QQ09ERV9YMSA9IDEwLAorICBWMlNITFNDX1JSUl8wX09QQ09ERV9YMCA9IDE0MywKKyAgVjJTSExTQ19SUlJfMF9PUENPREVfWDEgPSA5MCwKKyAgVjJTSExfUlJSXzBfT1BDT0RFX1gwID0gMTQ0LAorICBWMlNITF9SUlJfMF9PUENPREVfWDEgPSA5MSwKKyAgVjJTSFJTSV9TSElGVF9PUENPREVfWDAgPSAxMSwKKyAgVjJTSFJTSV9TSElGVF9PUENPREVfWDEgPSAxMSwKKyAgVjJTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDE0NSwKKyAgVjJTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDkyLAorICBWMlNIUlVJX1NISUZUX09QQ09ERV9YMCA9IDEyLAorICBWMlNIUlVJX1NISUZUX09QQ09ERV9YMSA9IDEyLAorICBWMlNIUlVfUlJSXzBfT1BDT0RFX1gwID0gMTQ2LAorICBWMlNIUlVfUlJSXzBfT1BDT0RFX1gxID0gOTMsCisgIFYyU1VCU0NfUlJSXzBfT1BDT0RFX1gwID0gMTQ3LAorICBWMlNVQlNDX1JSUl8wX09QQ09ERV9YMSA9IDk0LAorICBWMlNVQl9SUlJfMF9PUENPREVfWDAgPSAxNDgsCisgIFYyU1VCX1JSUl8wX09QQ09ERV9YMSA9IDk1LAorICBWNEFERFNDX1JSUl8wX09QQ09ERV9YMCA9IDE0OSwKKyAgVjRBRERTQ19SUlJfMF9PUENPREVfWDEgPSA5NiwKKyAgVjRBRERfUlJSXzBfT1BDT0RFX1gwID0gMTUwLAorICBWNEFERF9SUlJfMF9PUENPREVfWDEgPSA5NywKKyAgVjRJTlRfSF9SUlJfMF9PUENPREVfWDAgPSAxNTEsCisgIFY0SU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gOTgsCisgIFY0SU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTUyLAorICBWNElOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDk5LAorICBWNFBBQ0tTQ19SUlJfMF9PUENPREVfWDAgPSAxNTMsCisgIFY0UEFDS1NDX1JSUl8wX09QQ09ERV9YMSA9IDEwMCwKKyAgVjRTSExTQ19SUlJfMF9PUENPREVfWDAgPSAxNTQsCisgIFY0U0hMU0NfUlJSXzBfT1BDT0RFX1gxID0gMTAxLAorICBWNFNITF9SUlJfMF9PUENPREVfWDAgPSAxNTUsCisgIFY0U0hMX1JSUl8wX09QQ09ERV9YMSA9IDEwMiwKKyAgVjRTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDE1NiwKKyAgVjRTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDEwMywKKyAgVjRTSFJVX1JSUl8wX09QQ09ERV9YMCA9IDE1NywKKyAgVjRTSFJVX1JSUl8wX09QQ09ERV9YMSA9IDEwNCwKKyAgVjRTVUJTQ19SUlJfMF9PUENPREVfWDAgPSAxNTgsCisgIFY0U1VCU0NfUlJSXzBfT1BDT0RFX1gxID0gMTA1LAorICBWNFNVQl9SUlJfMF9PUENPREVfWDAgPSAxNTksCisgIFY0U1VCX1JSUl8wX09QQ09ERV9YMSA9IDEwNiwKKyAgV0g2NF9VTkFSWV9PUENPREVfWDEgPSAzOCwKKyAgWE9SSV9JTU04X09QQ09ERV9YMCA9IDIwLAorICBYT1JJX0lNTThfT1BDT0RFX1gxID0gNDUsCisgIFhPUl9SUlJfMF9PUENPREVfWDAgPSAxNjAsCisgIFhPUl9SUlJfMF9PUENPREVfWDEgPSAxMDcsCisgIFhPUl9SUlJfNV9PUENPREVfWTAgPSAzLAorICBYT1JfUlJSXzVfT1BDT0RFX1kxID0gMworfTsKKworCisjZW5kaWYgLyogX19BU1NFTUJMRVJfXyAqLworCisjZW5kaWYgLyogX19BUkNIX09QQ09ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlX3RpbGVwcm8uaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlX3RpbGVwcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWI3NjNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9vcGNvZGVfdGlsZXByby5oCkBAIC0wLDAgKzEsMTQ3MSBAQAorLyogVElMRVBybyBvcGNvZGUgaW5mb3JtYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMTEgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICAgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKgorICoKKyAqCisgKi8KKworI2lmbmRlZiBfX0FSQ0hfT1BDT0RFX0hfXworI2RlZmluZSBfX0FSQ0hfT1BDT0RFX0hfXworCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdGlsZXByb19idW5kbGVfYml0czsKKworLyogVGhpcyBpcyB0aGUgYml0IHRoYXQgZGV0ZXJtaW5lcyBpZiBhIGJ1bmRsZSBpcyBpbiB0aGUgWSBlbmNvZGluZy4gKi8KKyNkZWZpbmUgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLICgodGlsZXByb19idW5kbGVfYml0cykxIDw8IDYzKQorCitlbnVtCit7CisgIC8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiBhIGJ1bmRsZSAoMiBmb3IgWCwgMyBmb3IgWSkuICovCisgIFRJTEVQUk9fTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFID0gMywKKworICAvKiBIb3cgbWFueSBkaWZmZXJlbnQgcGlwZWxpbmUgZW5jb2RpbmdzIGFyZSB0aGVyZT8gWDAsIFgxLCBZMCwgWTEsIFkyLiAqLworICBUSUxFUFJPX05VTV9QSVBFTElORV9FTkNPRElOR1MgPSA1LAorCisgIC8qIExvZyBiYXNlIDIgb2YgVElMRVBST19CVU5ETEVfU0laRV9JTl9CWVRFUy4gKi8KKyAgVElMRVBST19MT0cyX0JVTkRMRV9TSVpFX0lOX0JZVEVTID0gMywKKworICAvKiBJbnN0cnVjdGlvbnMgdGFrZSB0aGlzIG1hbnkgYnl0ZXMuICovCisgIFRJTEVQUk9fQlVORExFX1NJWkVfSU5fQllURVMgPSAxIDw8IFRJTEVQUk9fTE9HMl9CVU5ETEVfU0laRV9JTl9CWVRFUywKKworICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVQUk9fQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUy4gKi8KKyAgVElMRVBST19MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgPSAzLAorCisgIC8qIEJ1bmRsZXMgc2hvdWxkIGJlIGFsaWduZWQgbW9kdWxvIHRoaXMgbnVtYmVyIG9mIGJ5dGVzLiAqLworICBUSUxFUFJPX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgPQorICAgICgxIDw8IFRJTEVQUk9fTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTKSwKKworICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVQUk9fU05fSU5TVFJVQ1RJT05fU0laRV9JTl9CWVRFUy4gKi8KKyAgVElMRVBST19MT0cyX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMgPSAxLAorCisgIC8qIFN0YXRpYyBuZXR3b3JrIGluc3RydWN0aW9ucyB0YWtlIHRoaXMgbWFueSBieXRlcy4gKi8KKyAgVElMRVBST19TTl9JTlNUUlVDVElPTl9TSVpFX0lOX0JZVEVTID0KKyAgICAoMSA8PCBUSUxFUFJPX0xPRzJfU05fSU5TVFJVQ1RJT05fU0laRV9JTl9CWVRFUyksCisKKyAgLyogTnVtYmVyIG9mIHJlZ2lzdGVycyAoc29tZSBhcmUgbWFnaWMsIHN1Y2ggYXMgbmV0d29yayBJL08pLiAqLworICBUSUxFUFJPX05VTV9SRUdJU1RFUlMgPSA2NCwKKworICAvKiBOdW1iZXIgb2Ygc3RhdGljIG5ldHdvcmsgcmVnaXN0ZXJzLiAqLworICBUSUxFUFJPX05VTV9TTl9SRUdJU1RFUlMgPSA0Cit9OworCisvKiBNYWtlIGEgZmV3ICJ0aWxlXyIgdmFyaWFibGVzIHRvIHNpbXBsaWZ5IGNvbW1vbiBjb2RlIGJldHdlZW4KKyAgIGFyY2hpdGVjdHVyZXMuICAqLworCit0eXBlZGVmIHRpbGVwcm9fYnVuZGxlX2JpdHMgdGlsZV9idW5kbGVfYml0czsKKyNkZWZpbmUgVElMRV9CVU5ETEVfU0laRV9JTl9CWVRFUyBUSUxFUFJPX0JVTkRMRV9TSVpFX0lOX0JZVEVTCisjZGVmaW5lIFRJTEVfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyBUSUxFUFJPX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMKKyNkZWZpbmUgVElMRV9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgXAorICBUSUxFUFJPX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUworCisvKiA2NC1iaXQgcGF0dGVybiBmb3IgYSB7IGJwdCA7IG5vcCB9IGJ1bmRsZS4gKi8KKyNkZWZpbmUgVElMRVBST19CUFRfQlVORExFIDB4NDAwYjNjYWU3MDE2NjAwMFVMTAorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfQnJPZmZfU04odGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDApKSAmIDB4M2ZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0JyT2ZmX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgwMDAwN2ZmZikgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDIwKSkgJiAweDAwMDE4MDAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0JyVHlwZV9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9EZXN0X0ltbThfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDAwMDAwMDNmKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4MDAwMDAwYzApOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfRGVzdF9TTih0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMikpICYgMHgzKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0Rlc3RfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDApKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfRGVzdF9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfRGVzdF9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9EZXN0X1kxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW0xNl9YMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW0xNl9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW04X1NOKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAwKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWTAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWTEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbU9wY29kZUV4dGVuc2lvbl9YMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMjApKSAmIDB4N2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSW1tT3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1MSkpICYgMHg3Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW1SUk9wY29kZUV4dGVuc2lvbl9TTih0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gOCkpICYgMHgzKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0pPZmZMb25nX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgwMDAwN2ZmZikgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDIwKSkgJiAweDAwMDE4MDAwKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMTQpKSAmIDB4MDAxZTAwMDApIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAxNikpICYgMHgwN2UwMDAwMCkgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDE4MDAwMDAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0pPZmZfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDAwMDA3ZmZmKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMjApKSAmIDB4MDAwMTgwMDApIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAxNCkpICYgMHgwMDFlMDAwMCkgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDE2KSkgJiAweDA3ZTAwMDAwKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDgwMDAwMDApOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfTUZfSW1tMTVfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDAwMDAzZmZmKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDQpKSAmIDB4MDAwMDQwMDApOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfTU1FbmRfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X01NRW5kX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OSkpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9NTVN0YXJ0X1gwKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAyMykpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9NTVN0YXJ0X1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1NCkpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9NVF9JbW0xNV9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDAwMDAwM2YpIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgwMDAwM2ZjMCkgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDQ0KSkgJiAweDAwMDA0MDAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X01vZGUodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDYzKSkgJiAweDEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfTm9SZWdPcGNvZGVFeHRlbnNpb25fU04odGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDApKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9PcGNvZGVfU04odGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEwKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X09wY29kZV9YMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMjgpKSAmIDB4Nyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9PcGNvZGVfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU5KSkgJiAweGYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1kwKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAyNykpICYgMHhmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X09wY29kZV9ZMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTkpKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9PcGNvZGVfWTIodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU2KSkgJiAweDcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfUlJPcGNvZGVFeHRlbnNpb25fU04odGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDQpKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDFmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDFmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWTAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfUlJST3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OSkpICYgMHgzKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1JvdXRlT3Bjb2RlRXh0ZW5zaW9uX1NOKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAwKSkgJiAweDNmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TX1gwKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAyNykpICYgMHgxKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU4KSkgJiAweDEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU2hBbXRfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NoQW10X1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4MWYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU2hBbXRfWTEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NyY0FfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDYpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQV9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQV9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gNikpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1kxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1kyKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKG4gPj4gMjYpKSAmIDB4MDAwMDAwMDEpIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA1MCkpICYgMHgwMDAwMDAzZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNCRGVzdF9ZMih0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMjApKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9YMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9ZMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjX1NOKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAwKSkgJiAweDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5PcGNvZGVFeHRlbnNpb25fWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1VuT3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9Vbk9wY29kZUV4dGVuc2lvbl9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4MWYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5PcGNvZGVFeHRlbnNpb25fWTEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1VuU2hPcGNvZGVFeHRlbnNpb25fWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE3KSkgJiAweDNmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9VblNoT3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OCkpICYgMHgzZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5TaE9wY29kZUV4dGVuc2lvbl9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTcpKSAmIDB4Nyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9VblNoT3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OCkpICYgMHg3KTsKK30KKworCitzdGF0aWMgX19pbmxpbmUgaW50CitzaWduX2V4dGVuZChpbnQgbiwgaW50IG51bV9iaXRzKQoreworICBpbnQgc2hpZnQgPSAoaW50KShzaXplb2YoaW50KSAqIDggLSBudW1fYml0cyk7CisgIHJldHVybiAobiA8PCBzaGlmdCkgPj4gc2hpZnQ7Cit9CisKKworCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0JyT2ZmX1NOKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfQnJPZmZfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDA3ZmZmKSkgPDwgNDMpIHwKKyAgICAgICAgICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDE4MDAwKSkgPDwgMjApOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0JyVHlwZV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4ZikpIDw8IDMxKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9EZXN0X0ltbThfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAwMDNmKSkgPDwgMzEpIHwKKyAgICAgICAgICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAwMGMwKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0Rlc3RfU04oaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4MykgPDwgMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCAzMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCAzMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tMTZfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmZmZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0ltbTE2X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHhmZmZmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0ltbThfU04oaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDApOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0ltbThfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDEyKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW04X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHhmZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW04X1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweGZmKSA8PCAxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tOF9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4ZmYpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tT3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDdmKSA8PCAyMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tT3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHg3ZikpIDw8IDUxKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW1SUk9wY29kZUV4dGVuc2lvbl9TTihpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzKSA8PCA4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9KT2ZmTG9uZ19YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDdmZmYpKSA8PCA0MykgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMTgwMDApKSA8PCAyMCkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAxZTAwMDApKSA8PCAxNCkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDdlMDAwMDApKSA8PCAxNikgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MTgwMDAwMDApKSA8PCAzMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSk9mZl9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDdmZmYpKSA8PCA0MykgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMTgwMDApKSA8PCAyMCkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAxZTAwMDApKSA8PCAxNCkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDdlMDAwMDApKSA8PCAxNikgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDgwMDAwMDApKSA8PCAzMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfTUZfSW1tMTVfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAzZmZmKSkgPDwgMzcpIHwKKyAgICAgICAgICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDA0MDAwKSkgPDwgNDQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX01NRW5kX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDFmKSA8PCAxOCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfTU1FbmRfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX01NU3RhcnRfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4MWYpIDw8IDIzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9NTVN0YXJ0X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDU0KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9NVF9JbW0xNV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDNmYzApKSA8PCAzNykgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDQwMDApKSA8PCA0NCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfTW9kZShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MSkpIDw8IDYzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9Ob1JlZ09wY29kZUV4dGVuc2lvbl9TTihpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHhmKSA8PCAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9PcGNvZGVfU04oaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9PcGNvZGVfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4NykgPDwgMjgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX09wY29kZV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4ZikpIDw8IDU5KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9PcGNvZGVfWTAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZikgPDwgMjcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX09wY29kZV9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4ZikpIDw8IDU5KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9PcGNvZGVfWTIoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDcpKSA8PCA1Nik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfUlJPcGNvZGVFeHRlbnNpb25fU04oaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZikgPDwgNCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDFmZikgPDwgMTgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MWZmKSkgPDwgNDkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzKSA8PCAxOCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgzKSkgPDwgNDkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1JvdXRlT3Bjb2RlRXh0ZW5zaW9uX1NOKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU19YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxKSA8PCAyNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU19YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MSkpIDw8IDU4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaEFtdF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1NoQW10X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaEFtdF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1NoQW10X1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCA2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDM3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCA2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDM3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kyKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDAwMDAwMDAxKSA8PCAyNikgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2UpKSA8PCA1MCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU3JjQkRlc3RfWTIoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDIwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNCX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU3JjQl9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU3JjQl9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1NyY0JfWTEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1NyY19TTihpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzKSA8PCAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9Vbk9wY29kZUV4dGVuc2lvbl9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1VuT3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9Vbk9wY29kZUV4dGVuc2lvbl9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1VuT3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9VblNoT3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmZikgPDwgMTcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1VuU2hPcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDNmZikpIDw8IDQ4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9VblNoT3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDcpIDw8IDE3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9VblNoT3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHg3KSkgPDwgNDgpOworfQorCisKK2VudW0KK3sKKyAgQUREQlNfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTgsCisgIEFEREJTX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY4LAorICBBRERCX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxLAorICBBRERCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxLAorICBBRERIU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTksCisgIEFEREhTX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2OSwKKyAgQURESF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMiwKKyAgQURESF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMiwKKyAgQURESUJfSU1NXzBfT1BDT0RFX1gwID0gMSwKKyAgQURESUJfSU1NXzBfT1BDT0RFX1gxID0gMSwKKyAgQURESUhfSU1NXzBfT1BDT0RFX1gwID0gMiwKKyAgQURESUhfSU1NXzBfT1BDT0RFX1gxID0gMiwKKyAgQURESV9JTU1fMF9PUENPREVfWDAgPSAzLAorICBBRERJX0lNTV8wX09QQ09ERV9YMSA9IDMsCisgIEFERElfSU1NXzFfT1BDT0RFX1NOID0gMSwKKyAgQURESV9PUENPREVfWTAgPSA5LAorICBBRERJX09QQ09ERV9ZMSA9IDcsCisgIEFERExJU19PUENPREVfWDAgPSAxLAorICBBRERMSVNfT1BDT0RFX1gxID0gMiwKKyAgQURETElfT1BDT0RFX1gwID0gMiwKKyAgQURETElfT1BDT0RFX1gxID0gMywKKyAgQUREU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTYsCisgIEFERFNfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY2LAorICBBRERfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDMsCisgIEFERF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMywKKyAgQUREX1NQRUNJQUxfMF9PUENPREVfWTAgPSAwLAorICBBRERfU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDAsCisgIEFESUZGQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0LAorICBBRElGRkhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDUsCisgIEFORElfSU1NXzBfT1BDT0RFX1gwID0gMSwKKyAgQU5ESV9JTU1fMF9PUENPREVfWDEgPSA0LAorICBBTkRJX09QQ09ERV9ZMCA9IDEwLAorICBBTkRJX09QQ09ERV9ZMSA9IDgsCisgIEFORF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNiwKKyAgQU5EX1NQRUNJQUxfMF9PUENPREVfWDEgPSA0LAorICBBTkRfU1BFQ0lBTF8yX09QQ09ERV9ZMCA9IDAsCisgIEFORF9TUEVDSUFMXzJfT1BDT0RFX1kxID0gMCwKKyAgQVVMSV9PUENPREVfWDAgPSAzLAorICBBVUxJX09QQ09ERV9YMSA9IDQsCisgIEFWR0JfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNywKKyAgQVZHSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOCwKKyAgQkJOU1RfQlJBTkNIX09QQ09ERV9YMSA9IDE1LAorICBCQk5TX0JSQU5DSF9PUENPREVfWDEgPSAxNCwKKyAgQkJOU19PUENPREVfU04gPSA2MywKKyAgQkJTVF9CUkFOQ0hfT1BDT0RFX1gxID0gMTMsCisgIEJCU19CUkFOQ0hfT1BDT0RFX1gxID0gMTIsCisgIEJCU19PUENPREVfU04gPSA2MiwKKyAgQkdFWlRfQlJBTkNIX09QQ09ERV9YMSA9IDcsCisgIEJHRVpfQlJBTkNIX09QQ09ERV9YMSA9IDYsCisgIEJHRVpfT1BDT0RFX1NOID0gNjEsCisgIEJHWlRfQlJBTkNIX09QQ09ERV9YMSA9IDUsCisgIEJHWl9CUkFOQ0hfT1BDT0RFX1gxID0gNCwKKyAgQkdaX09QQ09ERV9TTiA9IDU4LAorICBCSVRYX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDEsCisgIEJJVFhfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gMSwKKyAgQkxFWlRfQlJBTkNIX09QQ09ERV9YMSA9IDExLAorICBCTEVaX0JSQU5DSF9PUENPREVfWDEgPSAxMCwKKyAgQkxFWl9PUENPREVfU04gPSA1OSwKKyAgQkxaVF9CUkFOQ0hfT1BDT0RFX1gxID0gOSwKKyAgQkxaX0JSQU5DSF9PUENPREVfWDEgPSA4LAorICBCTFpfT1BDT0RFX1NOID0gNjAsCisgIEJOWlRfQlJBTkNIX09QQ09ERV9YMSA9IDMsCisgIEJOWl9CUkFOQ0hfT1BDT0RFX1gxID0gMiwKKyAgQk5aX09QQ09ERV9TTiA9IDU3LAorICBCUFRfTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMSwKKyAgQlJBTkNIX09QQ09ERV9YMSA9IDUsCisgIEJZVEVYX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDIsCisgIEJZVEVYX1VOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDIsCisgIEJaVF9CUkFOQ0hfT1BDT0RFX1gxID0gMSwKKyAgQlpfQlJBTkNIX09QQ09ERV9YMSA9IDAsCisgIEJaX09QQ09ERV9TTiA9IDU2LAorICBDTFpfVU5fMF9TSFVOXzBfT1BDT0RFX1gwID0gMywKKyAgQ0xaX1VOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDMsCisgIENSQzMyXzMyX1NQRUNJQUxfMF9PUENPREVfWDAgPSA5LAorICBDUkMzMl84X1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMCwKKyAgQ1RaX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDQsCisgIENUWl9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA0LAorICBEUkFJTl9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxLAorICBEVExCUFJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMiwKKyAgRFdPUkRfQUxJR05fU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDk1LAorICBGSU5WX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDMsCisgIEZMVVNIX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDQsCisgIEZOT1BfTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMywKKyAgRk5PUF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA1LAorICBGTk9QX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDUsCisgIEZOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gNSwKKyAgRk5PUF9VTl8wX1NIVU5fMF9PUENPREVfWTEgPSAxLAorICBIQUxUX05PUkVHX1JSX0lNTV8wX09QQ09ERV9TTiA9IDAsCisgIElDT0hfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gNiwKKyAgSUxMX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDcsCisgIElMTF9VTl8wX1NIVU5fMF9PUENPREVfWTEgPSAyLAorICBJTU1fMF9PUENPREVfU04gPSAwLAorICBJTU1fMF9PUENPREVfWDAgPSA0LAorICBJTU1fMF9PUENPREVfWDEgPSA2LAorICBJTU1fMV9PUENPREVfU04gPSAxLAorICBJTU1fT1BDT0RFXzBfWDAgPSA1LAorICBJTlRIQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTEsCisgIElOVEhCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1LAorICBJTlRISF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTIsCisgIElOVEhIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2LAorICBJTlRMQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTMsCisgIElOVExCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3LAorICBJTlRMSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTQsCisgIElOVExIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA4LAorICBJTlZfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gOCwKKyAgSVJFVF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSA5LAorICBKQUxCX09QQ09ERV9YMSA9IDEzLAorICBKQUxGX09QQ09ERV9YMSA9IDEyLAorICBKQUxSUF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gOSwKKyAgSkFMUlJfSU1NXzFfT1BDT0RFX1NOID0gMywKKyAgSkFMUl9SUl9JTU1fMF9PUENPREVfU04gPSA1LAorICBKQUxSX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxMCwKKyAgSkJfT1BDT0RFX1gxID0gMTEsCisgIEpGX09QQ09ERV9YMSA9IDEwLAorICBKUlBfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDExLAorICBKUlJfSU1NXzFfT1BDT0RFX1NOID0gMiwKKyAgSlJfUlJfSU1NXzBfT1BDT0RFX1NOID0gNCwKKyAgSlJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDEyLAorICBMQkFERF9JTU1fMF9PUENPREVfWDEgPSAyMiwKKyAgTEJBRERfVV9JTU1fMF9PUENPREVfWDEgPSAyMywKKyAgTEJfT1BDT0RFX1kyID0gMCwKKyAgTEJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTAsCisgIExCX1VfT1BDT0RFX1kyID0gMSwKKyAgTEJfVV9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxMSwKKyAgTEhBRERfSU1NXzBfT1BDT0RFX1gxID0gMjQsCisgIExIQUREX1VfSU1NXzBfT1BDT0RFX1gxID0gMjUsCisgIExIX09QQ09ERV9ZMiA9IDIsCisgIExIX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDEyLAorICBMSF9VX09QQ09ERV9ZMiA9IDMsCisgIExIX1VfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTMsCisgIExOS19TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTMsCisgIExXQUREX0lNTV8wX09QQ09ERV9YMSA9IDI2LAorICBMV0FERF9OQV9JTU1fMF9PUENPREVfWDEgPSAyNywKKyAgTFdfTkFfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjQsCisgIExXX09QQ09ERV9ZMiA9IDQsCisgIExXX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDE0LAorICBNQVhCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDE1LAorICBNQVhCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE0LAorICBNQVhIX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxNiwKKyAgTUFYSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTUsCisgIE1BWElCX1VfSU1NXzBfT1BDT0RFX1gwID0gNCwKKyAgTUFYSUJfVV9JTU1fMF9PUENPREVfWDEgPSA1LAorICBNQVhJSF9JTU1fMF9PUENPREVfWDAgPSA1LAorICBNQVhJSF9JTU1fMF9PUENPREVfWDEgPSA2LAorICBNRlNQUl9JTU1fMF9PUENPREVfWDEgPSA3LAorICBNRl9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxNSwKKyAgTUlOQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxNywKKyAgTUlOQl9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxNiwKKyAgTUlOSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTgsCisgIE1JTkhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE3LAorICBNSU5JQl9VX0lNTV8wX09QQ09ERV9YMCA9IDYsCisgIE1JTklCX1VfSU1NXzBfT1BDT0RFX1gxID0gOCwKKyAgTUlOSUhfSU1NXzBfT1BDT0RFX1gwID0gNywKKyAgTUlOSUhfSU1NXzBfT1BDT0RFX1gxID0gOSwKKyAgTU1fT1BDT0RFX1gwID0gNiwKKyAgTU1fT1BDT0RFX1gxID0gNywKKyAgTU5aQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTksCisgIE1OWkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE4LAorICBNTlpIX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyMCwKKyAgTU5aSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTksCisgIE1OWl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjEsCisgIE1OWl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjAsCisgIE1OWl9TUEVDSUFMXzFfT1BDT0RFX1kwID0gMCwKKyAgTU5aX1NQRUNJQUxfMV9PUENPREVfWTEgPSAxLAorICBNT1ZFSV9JTU1fMV9PUENPREVfU04gPSAwLAorICBNT1ZFX1JSX0lNTV8wX09QQ09ERV9TTiA9IDgsCisgIE1UU1BSX0lNTV8wX09QQ09ERV9YMSA9IDEwLAorICBNVUxISEFfU1NfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDIyLAorICBNVUxISEFfU1NfU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDAsCisgIE1VTEhIQV9TVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjMsCisgIE1VTEhIQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjQsCisgIE1VTEhIQV9VVV9TUEVDSUFMXzdfT1BDT0RFX1kwID0gMSwKKyAgTVVMSEhTQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjUsCisgIE1VTEhIX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyNiwKKyAgTVVMSEhfU1NfU1BFQ0lBTF82X09QQ09ERV9ZMCA9IDAsCisgIE1VTEhIX1NVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyNywKKyAgTVVMSEhfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDI4LAorICBNVUxISF9VVV9TUEVDSUFMXzZfT1BDT0RFX1kwID0gMSwKKyAgTVVMSExBX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyOSwKKyAgTVVMSExBX1NVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMCwKKyAgTVVMSExBX1VTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMSwKKyAgTVVMSExBX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMiwKKyAgTVVMSExTQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMzMsCisgIE1VTEhMU0FfVVVfU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDAsCisgIE1VTEhMX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzNCwKKyAgTVVMSExfU1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDM1LAorICBNVUxITF9VU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gMzYsCisgIE1VTEhMX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzNywKKyAgTVVMTExBX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzOCwKKyAgTVVMTExBX1NTX1NQRUNJQUxfN19PUENPREVfWTAgPSAyLAorICBNVUxMTEFfU1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDM5LAorICBNVUxMTEFfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQwLAorICBNVUxMTEFfVVVfU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDMsCisgIE1VTExMU0FfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQxLAorICBNVUxMTF9TU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDIsCisgIE1VTExMX1NTX1NQRUNJQUxfNl9PUENPREVfWTAgPSAyLAorICBNVUxMTF9TVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDMsCisgIE1VTExMX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0NCwKKyAgTVVMTExfVVVfU1BFQ0lBTF82X09QQ09ERV9ZMCA9IDMsCisgIE1WTlpfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQ1LAorICBNVk5aX1NQRUNJQUxfMV9PUENPREVfWTAgPSAxLAorICBNVlpfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQ2LAorICBNVlpfU1BFQ0lBTF8xX09QQ09ERV9ZMCA9IDIsCisgIE1aQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDcsCisgIE1aQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjEsCisgIE1aSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDgsCisgIE1aSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjIsCisgIE1aX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0OSwKKyAgTVpfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDIzLAorICBNWl9TUEVDSUFMXzFfT1BDT0RFX1kwID0gMywKKyAgTVpfU1BFQ0lBTF8xX09QQ09ERV9ZMSA9IDIsCisgIE5BUF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxNiwKKyAgTk9QX05PUkVHX1JSX0lNTV8wX09QQ09ERV9TTiA9IDIsCisgIE5PUF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA2LAorICBOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTcsCisgIE5PUF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA2LAorICBOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1kxID0gMywKKyAgTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMCwKKyAgTk9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MCwKKyAgTk9SX1NQRUNJQUxfMF9PUENPREVfWDEgPSAyNCwKKyAgTk9SX1NQRUNJQUxfMl9PUENPREVfWTAgPSAxLAorICBOT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDEsCisgIE9SSV9JTU1fMF9PUENPREVfWDAgPSA4LAorICBPUklfSU1NXzBfT1BDT0RFX1gxID0gMTEsCisgIE9SSV9PUENPREVfWTAgPSAxMSwKKyAgT1JJX09QQ09ERV9ZMSA9IDksCisgIE9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MSwKKyAgT1JfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDI1LAorICBPUl9TUEVDSUFMXzJfT1BDT0RFX1kwID0gMiwKKyAgT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDIsCisgIFBBQ0tCU19VX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMDMsCisgIFBBQ0tCU19VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3MywKKyAgUEFDS0hCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MiwKKyAgUEFDS0hCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAyNiwKKyAgUEFDS0hTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMDIsCisgIFBBQ0tIU19TUEVDSUFMXzBfT1BDT0RFX1gxID0gNzIsCisgIFBBQ0tMQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTMsCisgIFBBQ0tMQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjcsCisgIFBDTlRfVU5fMF9TSFVOXzBfT1BDT0RFX1gwID0gNywKKyAgUENOVF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA3LAorICBSTElfU0hVTl8wX09QQ09ERV9YMCA9IDEsCisgIFJMSV9TSFVOXzBfT1BDT0RFX1gxID0gMSwKKyAgUkxJX1NIVU5fMF9PUENPREVfWTAgPSAxLAorICBSTElfU0hVTl8wX09QQ09ERV9ZMSA9IDEsCisgIFJMX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1NCwKKyAgUkxfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDI4LAorICBSTF9TUEVDSUFMXzNfT1BDT0RFX1kwID0gMCwKKyAgUkxfU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDAsCisgIFJSX0lNTV8wX09QQ09ERV9TTiA9IDAsCisgIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTUsCisgIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjksCisgIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1kwID0gMSwKKyAgUzFBX1NQRUNJQUxfMF9PUENPREVfWTEgPSAxLAorICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDU2LAorICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDMwLAorICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9ZMCA9IDIsCisgIFMyQV9TUEVDSUFMXzBfT1BDT0RFX1kxID0gMiwKKyAgUzNBX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1NywKKyAgUzNBX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzMSwKKyAgUzNBX1NQRUNJQUxfNV9PUENPREVfWTAgPSAxLAorICBTM0FfU1BFQ0lBTF81X09QQ09ERV9ZMSA9IDEsCisgIFNBREFCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDU4LAorICBTQURBSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTksCisgIFNBREFIX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDYwLAorICBTQURCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDYxLAorICBTQURIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2MiwKKyAgU0FESF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2MywKKyAgU0JBRERfSU1NXzBfT1BDT0RFX1gxID0gMjgsCisgIFNCX09QQ09ERV9ZMiA9IDUsCisgIFNCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzMiwKKyAgU0VRQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjQsCisgIFNFUUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDMzLAorICBTRVFIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2NSwKKyAgU0VRSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMzQsCisgIFNFUUlCX0lNTV8wX09QQ09ERV9YMCA9IDksCisgIFNFUUlCX0lNTV8wX09QQ09ERV9YMSA9IDEyLAorICBTRVFJSF9JTU1fMF9PUENPREVfWDAgPSAxMCwKKyAgU0VRSUhfSU1NXzBfT1BDT0RFX1gxID0gMTMsCisgIFNFUUlfSU1NXzBfT1BDT0RFX1gwID0gMTEsCisgIFNFUUlfSU1NXzBfT1BDT0RFX1gxID0gMTQsCisgIFNFUUlfT1BDT0RFX1kwID0gMTIsCisgIFNFUUlfT1BDT0RFX1kxID0gMTAsCisgIFNFUV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjYsCisgIFNFUV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMzUsCisgIFNFUV9TUEVDSUFMXzVfT1BDT0RFX1kwID0gMiwKKyAgU0VRX1NQRUNJQUxfNV9PUENPREVfWTEgPSAyLAorICBTSEFERF9JTU1fMF9PUENPREVfWDEgPSAyOSwKKyAgU0hMOElJX0lNTV8wX09QQ09ERV9TTiA9IDMsCisgIFNITEJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDY3LAorICBTSExCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzNiwKKyAgU0hMSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjgsCisgIFNITEhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDM3LAorICBTSExJQl9TSFVOXzBfT1BDT0RFX1gwID0gMiwKKyAgU0hMSUJfU0hVTl8wX09QQ09ERV9YMSA9IDIsCisgIFNITElIX1NIVU5fMF9PUENPREVfWDAgPSAzLAorICBTSExJSF9TSFVOXzBfT1BDT0RFX1gxID0gMywKKyAgU0hMSV9TSFVOXzBfT1BDT0RFX1gwID0gNCwKKyAgU0hMSV9TSFVOXzBfT1BDT0RFX1gxID0gNCwKKyAgU0hMSV9TSFVOXzBfT1BDT0RFX1kwID0gMiwKKyAgU0hMSV9TSFVOXzBfT1BDT0RFX1kxID0gMiwKKyAgU0hMX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2OSwKKyAgU0hMX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzOCwKKyAgU0hMX1NQRUNJQUxfM19PUENPREVfWTAgPSAxLAorICBTSExfU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDEsCisgIFNIUjFfUlJfSU1NXzBfT1BDT0RFX1NOID0gOSwKKyAgU0hSQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNzAsCisgIFNIUkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDM5LAorICBTSFJIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3MSwKKyAgU0hSSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDAsCisgIFNIUklCX1NIVU5fMF9PUENPREVfWDAgPSA1LAorICBTSFJJQl9TSFVOXzBfT1BDT0RFX1gxID0gNSwKKyAgU0hSSUhfU0hVTl8wX09QQ09ERV9YMCA9IDYsCisgIFNIUklIX1NIVU5fMF9PUENPREVfWDEgPSA2LAorICBTSFJJX1NIVU5fMF9PUENPREVfWDAgPSA3LAorICBTSFJJX1NIVU5fMF9PUENPREVfWDEgPSA3LAorICBTSFJJX1NIVU5fMF9PUENPREVfWTAgPSAzLAorICBTSFJJX1NIVU5fMF9PUENPREVfWTEgPSAzLAorICBTSFJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDcyLAorICBTSFJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQxLAorICBTSFJfU1BFQ0lBTF8zX09QQ09ERV9ZMCA9IDIsCisgIFNIUl9TUEVDSUFMXzNfT1BDT0RFX1kxID0gMiwKKyAgU0hVTl8wX09QQ09ERV9YMCA9IDcsCisgIFNIVU5fMF9PUENPREVfWDEgPSA4LAorICBTSFVOXzBfT1BDT0RFX1kwID0gMTMsCisgIFNIVU5fMF9PUENPREVfWTEgPSAxMSwKKyAgU0hfT1BDT0RFX1kyID0gNiwKKyAgU0hfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQyLAorICBTTFRCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3MywKKyAgU0xUQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDMsCisgIFNMVEJfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNzQsCisgIFNMVEJfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDQsCisgIFNMVEVCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NSwKKyAgU0xURUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQ1LAorICBTTFRFQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NiwKKyAgU0xURUJfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDYsCisgIFNMVEVIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NywKKyAgU0xURUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQ3LAorICBTTFRFSF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3OCwKKyAgU0xURUhfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDgsCisgIFNMVEVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDc5LAorICBTTFRFX1NQRUNJQUxfMF9PUENPREVfWDEgPSA0OSwKKyAgU0xURV9TUEVDSUFMXzRfT1BDT0RFX1kwID0gMCwKKyAgU0xURV9TUEVDSUFMXzRfT1BDT0RFX1kxID0gMCwKKyAgU0xURV9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MCwKKyAgU0xURV9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MCwKKyAgU0xURV9VX1NQRUNJQUxfNF9PUENPREVfWTAgPSAxLAorICBTTFRFX1VfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDEsCisgIFNMVEhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDgxLAorICBTTFRIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MSwKKyAgU0xUSF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MiwKKyAgU0xUSF9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MiwKKyAgU0xUSUJfSU1NXzBfT1BDT0RFX1gwID0gMTIsCisgIFNMVElCX0lNTV8wX09QQ09ERV9YMSA9IDE1LAorICBTTFRJQl9VX0lNTV8wX09QQ09ERV9YMCA9IDEzLAorICBTTFRJQl9VX0lNTV8wX09QQ09ERV9YMSA9IDE2LAorICBTTFRJSF9JTU1fMF9PUENPREVfWDAgPSAxNCwKKyAgU0xUSUhfSU1NXzBfT1BDT0RFX1gxID0gMTcsCisgIFNMVElIX1VfSU1NXzBfT1BDT0RFX1gwID0gMTUsCisgIFNMVElIX1VfSU1NXzBfT1BDT0RFX1gxID0gMTgsCisgIFNMVElfSU1NXzBfT1BDT0RFX1gwID0gMTYsCisgIFNMVElfSU1NXzBfT1BDT0RFX1gxID0gMTksCisgIFNMVElfT1BDT0RFX1kwID0gMTQsCisgIFNMVElfT1BDT0RFX1kxID0gMTIsCisgIFNMVElfVV9JTU1fMF9PUENPREVfWDAgPSAxNywKKyAgU0xUSV9VX0lNTV8wX09QQ09ERV9YMSA9IDIwLAorICBTTFRJX1VfT1BDT0RFX1kwID0gMTUsCisgIFNMVElfVV9PUENPREVfWTEgPSAxMywKKyAgU0xUX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MywKKyAgU0xUX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MywKKyAgU0xUX1NQRUNJQUxfNF9PUENPREVfWTAgPSAyLAorICBTTFRfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDIsCisgIFNMVF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4NCwKKyAgU0xUX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU0LAorICBTTFRfVV9TUEVDSUFMXzRfT1BDT0RFX1kwID0gMywKKyAgU0xUX1VfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDMsCisgIFNORUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg1LAorICBTTkVCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1NSwKKyAgU05FSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gODYsCisgIFNORUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU2LAorICBTTkVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg3LAorICBTTkVfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU3LAorICBTTkVfU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDMsCisgIFNORV9TUEVDSUFMXzVfT1BDT0RFX1kxID0gMywKKyAgU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDAsCisgIFNQRUNJQUxfMF9PUENPREVfWDEgPSAxLAorICBTUEVDSUFMXzBfT1BDT0RFX1kwID0gMSwKKyAgU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDEsCisgIFNQRUNJQUxfMV9PUENPREVfWTAgPSAyLAorICBTUEVDSUFMXzFfT1BDT0RFX1kxID0gMiwKKyAgU1BFQ0lBTF8yX09QQ09ERV9ZMCA9IDMsCisgIFNQRUNJQUxfMl9PUENPREVfWTEgPSAzLAorICBTUEVDSUFMXzNfT1BDT0RFX1kwID0gNCwKKyAgU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDQsCisgIFNQRUNJQUxfNF9PUENPREVfWTAgPSA1LAorICBTUEVDSUFMXzRfT1BDT0RFX1kxID0gNSwKKyAgU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDYsCisgIFNQRUNJQUxfNV9PUENPREVfWTEgPSA2LAorICBTUEVDSUFMXzZfT1BDT0RFX1kwID0gNywKKyAgU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDgsCisgIFNSQUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg4LAorICBTUkFCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1OCwKKyAgU1JBSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gODksCisgIFNSQUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU5LAorICBTUkFJQl9TSFVOXzBfT1BDT0RFX1gwID0gOCwKKyAgU1JBSUJfU0hVTl8wX09QQ09ERV9YMSA9IDgsCisgIFNSQUlIX1NIVU5fMF9PUENPREVfWDAgPSA5LAorICBTUkFJSF9TSFVOXzBfT1BDT0RFX1gxID0gOSwKKyAgU1JBSV9TSFVOXzBfT1BDT0RFX1gwID0gMTAsCisgIFNSQUlfU0hVTl8wX09QQ09ERV9YMSA9IDEwLAorICBTUkFJX1NIVU5fMF9PUENPREVfWTAgPSA0LAorICBTUkFJX1NIVU5fMF9PUENPREVfWTEgPSA0LAorICBTUkFfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkwLAorICBTUkFfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYwLAorICBTUkFfU1BFQ0lBTF8zX09QQ09ERV9ZMCA9IDMsCisgIFNSQV9TUEVDSUFMXzNfT1BDT0RFX1kxID0gMywKKyAgU1VCQlNfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTAwLAorICBTVUJCU19VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3MCwKKyAgU1VCQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTEsCisgIFNVQkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYxLAorICBTVUJIU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTAxLAorICBTVUJIU19TUEVDSUFMXzBfT1BDT0RFX1gxID0gNzEsCisgIFNVQkhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkyLAorICBTVUJIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2MiwKKyAgU1VCU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTcsCisgIFNVQlNfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY3LAorICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkzLAorICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYzLAorICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9ZMCA9IDMsCisgIFNVQl9TUEVDSUFMXzBfT1BDT0RFX1kxID0gMywKKyAgU1dBRERfSU1NXzBfT1BDT0RFX1gxID0gMzAsCisgIFNXSU5UMF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxOCwKKyAgU1dJTlQxX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDE5LAorICBTV0lOVDJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjAsCisgIFNXSU5UM19VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAyMSwKKyAgU1dfT1BDT0RFX1kyID0gNywKKyAgU1dfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY0LAorICBUQkxJRFhCMF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA4LAorICBUQkxJRFhCMF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA4LAorICBUQkxJRFhCMV9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA5LAorICBUQkxJRFhCMV9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA5LAorICBUQkxJRFhCMl9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSAxMCwKKyAgVEJMSURYQjJfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gMTAsCisgIFRCTElEWEIzX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDExLAorICBUQkxJRFhCM19VTl8wX1NIVU5fMF9PUENPREVfWTAgPSAxMSwKKyAgVE5TX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDIyLAorICBVTl8wX1NIVU5fMF9PUENPREVfWDAgPSAxMSwKKyAgVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTEsCisgIFVOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDUsCisgIFVOXzBfU0hVTl8wX09QQ09ERV9ZMSA9IDUsCisgIFdINjRfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjMsCisgIFhPUklfSU1NXzBfT1BDT0RFX1gwID0gMiwKKyAgWE9SSV9JTU1fMF9PUENPREVfWDEgPSAyMSwKKyAgWE9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA5NCwKKyAgWE9SX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2NSwKKyAgWE9SX1NQRUNJQUxfMl9PUENPREVfWTAgPSAzLAorICBYT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDMKK307CisKKworI2VuZGlmIC8qIF9fQVNTRU1CTEVSX18gKi8KKworI2VuZGlmIC8qIF9fQVJDSF9PUENPREVfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBhZWM2MGRjLi4wYmI0MjY0IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsNSArMSw3IEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogCitoZWFkZXIteSArPSAuLi9hcmNoLworCiBoZWFkZXIteSArPSB1Y29udGV4dC5oCiBoZWFkZXIteSArPSBoYXJkd2FsbC5oCiAKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGUtdGlsZS5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZS10aWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzg5NTkuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZS10aWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTAgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqICAgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX0FTTV9USUxFX09QQ09ERV9USUxFX0gKLSNkZWZpbmUgX0FTTV9USUxFX09QQ09ERV9USUxFX0gKLQotI2luY2x1ZGUgPGFyY2gvY2hpcC5oPgotCi0jaWYgQ0hJUF9XT1JEX1NJWkUoKSA9PSA2NAotI2luY2x1ZGUgPGFzbS9vcGNvZGUtdGlsZV82NC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20vb3Bjb2RlLXRpbGVfMzIuaD4KLSNlbmRpZgotCi0vKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgbm90IGNvcnJlY3QgZm9yIFRJTEU2NCwgc28ganVzdCBhdm9pZCB0aGVtLiAqLwotI3VuZGVmIFRJTEVfRUxGX01BQ0hJTkVfQ09ERQotI3VuZGVmIFRJTEVfRUxGX05BTUUKLQotI2VuZGlmIC8qIF9BU01fVElMRV9PUENPREVfVElMRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlLXRpbGVfMzIuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGUtdGlsZV8zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2RmN2IxLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGUtdGlsZV8zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxMyArMCwwIEBACi0vKiB0aWxlLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJTEUgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBUaWxlcmEgQ29ycC4gKi8KLQotI2lmbmRlZiBvcGNvZGVfdGlsZV9oCi0jZGVmaW5lIG9wY29kZV90aWxlX2gKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdGlsZV9idW5kbGVfYml0czsKLQotCi1lbnVtCi17Ci0gIFRJTEVfTUFYX09QRVJBTkRTID0gNSAvKiBtbSAqLwotfTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gIFRJTEVfT1BDX0JQVCwKLSAgVElMRV9PUENfSU5GTywKLSAgVElMRV9PUENfSU5GT0wsCi0gIFRJTEVfT1BDX0osCi0gIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfTU9WRSwKLSAgVElMRV9PUENfTU9WRV9TTiwKLSAgVElMRV9PUENfTU9WRUksCi0gIFRJTEVfT1BDX01PVkVJX1NOLAotICBUSUxFX09QQ19NT1ZFTEksCi0gIFRJTEVfT1BDX01PVkVMSV9TTiwKLSAgVElMRV9PUENfTU9WRUxJUywKLSAgVElMRV9PUENfUFJFRkVUQ0gsCi0gIFRJTEVfT1BDX1JBSVNFLAotICBUSUxFX09QQ19BREQsCi0gIFRJTEVfT1BDX0FERF9TTiwKLSAgVElMRV9PUENfQUREQiwKLSAgVElMRV9PUENfQUREQl9TTiwKLSAgVElMRV9PUENfQUREQlNfVSwKLSAgVElMRV9PUENfQUREQlNfVV9TTiwKLSAgVElMRV9PUENfQURESCwKLSAgVElMRV9PUENfQURESF9TTiwKLSAgVElMRV9PUENfQURESFMsCi0gIFRJTEVfT1BDX0FEREhTX1NOLAotICBUSUxFX09QQ19BRERJLAotICBUSUxFX09QQ19BRERJX1NOLAotICBUSUxFX09QQ19BRERJQiwKLSAgVElMRV9PUENfQURESUJfU04sCi0gIFRJTEVfT1BDX0FERElILAotICBUSUxFX09QQ19BRERJSF9TTiwKLSAgVElMRV9PUENfQURETEksCi0gIFRJTEVfT1BDX0FERExJX1NOLAotICBUSUxFX09QQ19BRERMSVMsCi0gIFRJTEVfT1BDX0FERFMsCi0gIFRJTEVfT1BDX0FERFNfU04sCi0gIFRJTEVfT1BDX0FESUZGQl9VLAotICBUSUxFX09QQ19BRElGRkJfVV9TTiwKLSAgVElMRV9PUENfQURJRkZILAotICBUSUxFX09QQ19BRElGRkhfU04sCi0gIFRJTEVfT1BDX0FORCwKLSAgVElMRV9PUENfQU5EX1NOLAotICBUSUxFX09QQ19BTkRJLAotICBUSUxFX09QQ19BTkRJX1NOLAotICBUSUxFX09QQ19BVUxJLAotICBUSUxFX09QQ19BVkdCX1UsCi0gIFRJTEVfT1BDX0FWR0JfVV9TTiwKLSAgVElMRV9PUENfQVZHSCwKLSAgVElMRV9PUENfQVZHSF9TTiwKLSAgVElMRV9PUENfQkJOUywKLSAgVElMRV9PUENfQkJOU19TTiwKLSAgVElMRV9PUENfQkJOU1QsCi0gIFRJTEVfT1BDX0JCTlNUX1NOLAotICBUSUxFX09QQ19CQlMsCi0gIFRJTEVfT1BDX0JCU19TTiwKLSAgVElMRV9PUENfQkJTVCwKLSAgVElMRV9PUENfQkJTVF9TTiwKLSAgVElMRV9PUENfQkdFWiwKLSAgVElMRV9PUENfQkdFWl9TTiwKLSAgVElMRV9PUENfQkdFWlQsCi0gIFRJTEVfT1BDX0JHRVpUX1NOLAotICBUSUxFX09QQ19CR1osCi0gIFRJTEVfT1BDX0JHWl9TTiwKLSAgVElMRV9PUENfQkdaVCwKLSAgVElMRV9PUENfQkdaVF9TTiwKLSAgVElMRV9PUENfQklUWCwKLSAgVElMRV9PUENfQklUWF9TTiwKLSAgVElMRV9PUENfQkxFWiwKLSAgVElMRV9PUENfQkxFWl9TTiwKLSAgVElMRV9PUENfQkxFWlQsCi0gIFRJTEVfT1BDX0JMRVpUX1NOLAotICBUSUxFX09QQ19CTFosCi0gIFRJTEVfT1BDX0JMWl9TTiwKLSAgVElMRV9PUENfQkxaVCwKLSAgVElMRV9PUENfQkxaVF9TTiwKLSAgVElMRV9PUENfQk5aLAotICBUSUxFX09QQ19CTlpfU04sCi0gIFRJTEVfT1BDX0JOWlQsCi0gIFRJTEVfT1BDX0JOWlRfU04sCi0gIFRJTEVfT1BDX0JZVEVYLAotICBUSUxFX09QQ19CWVRFWF9TTiwKLSAgVElMRV9PUENfQlosCi0gIFRJTEVfT1BDX0JaX1NOLAotICBUSUxFX09QQ19CWlQsCi0gIFRJTEVfT1BDX0JaVF9TTiwKLSAgVElMRV9PUENfQ0xaLAotICBUSUxFX09QQ19DTFpfU04sCi0gIFRJTEVfT1BDX0NSQzMyXzMyLAotICBUSUxFX09QQ19DUkMzMl8zMl9TTiwKLSAgVElMRV9PUENfQ1JDMzJfOCwKLSAgVElMRV9PUENfQ1JDMzJfOF9TTiwKLSAgVElMRV9PUENfQ1RaLAotICBUSUxFX09QQ19DVFpfU04sCi0gIFRJTEVfT1BDX0RSQUlOLAotICBUSUxFX09QQ19EVExCUFIsCi0gIFRJTEVfT1BDX0RXT1JEX0FMSUdOLAotICBUSUxFX09QQ19EV09SRF9BTElHTl9TTiwKLSAgVElMRV9PUENfRklOViwKLSAgVElMRV9PUENfRkxVU0gsCi0gIFRJTEVfT1BDX0ZOT1AsCi0gIFRJTEVfT1BDX0lDT0gsCi0gIFRJTEVfT1BDX0lMTCwKLSAgVElMRV9PUENfSU5USEIsCi0gIFRJTEVfT1BDX0lOVEhCX1NOLAotICBUSUxFX09QQ19JTlRISCwKLSAgVElMRV9PUENfSU5USEhfU04sCi0gIFRJTEVfT1BDX0lOVExCLAotICBUSUxFX09QQ19JTlRMQl9TTiwKLSAgVElMRV9PUENfSU5UTEgsCi0gIFRJTEVfT1BDX0lOVExIX1NOLAotICBUSUxFX09QQ19JTlYsCi0gIFRJTEVfT1BDX0lSRVQsCi0gIFRJTEVfT1BDX0pBTEIsCi0gIFRJTEVfT1BDX0pBTEYsCi0gIFRJTEVfT1BDX0pBTFIsCi0gIFRJTEVfT1BDX0pBTFJQLAotICBUSUxFX09QQ19KQiwKLSAgVElMRV9PUENfSkYsCi0gIFRJTEVfT1BDX0pSLAotICBUSUxFX09QQ19KUlAsCi0gIFRJTEVfT1BDX0xCLAotICBUSUxFX09QQ19MQl9TTiwKLSAgVElMRV9PUENfTEJfVSwKLSAgVElMRV9PUENfTEJfVV9TTiwKLSAgVElMRV9PUENfTEJBREQsCi0gIFRJTEVfT1BDX0xCQUREX1NOLAotICBUSUxFX09QQ19MQkFERF9VLAotICBUSUxFX09QQ19MQkFERF9VX1NOLAotICBUSUxFX09QQ19MSCwKLSAgVElMRV9PUENfTEhfU04sCi0gIFRJTEVfT1BDX0xIX1UsCi0gIFRJTEVfT1BDX0xIX1VfU04sCi0gIFRJTEVfT1BDX0xIQURELAotICBUSUxFX09QQ19MSEFERF9TTiwKLSAgVElMRV9PUENfTEhBRERfVSwKLSAgVElMRV9PUENfTEhBRERfVV9TTiwKLSAgVElMRV9PUENfTE5LLAotICBUSUxFX09QQ19MTktfU04sCi0gIFRJTEVfT1BDX0xXLAotICBUSUxFX09QQ19MV19TTiwKLSAgVElMRV9PUENfTFdfTkEsCi0gIFRJTEVfT1BDX0xXX05BX1NOLAotICBUSUxFX09QQ19MV0FERCwKLSAgVElMRV9PUENfTFdBRERfU04sCi0gIFRJTEVfT1BDX0xXQUREX05BLAotICBUSUxFX09QQ19MV0FERF9OQV9TTiwKLSAgVElMRV9PUENfTUFYQl9VLAotICBUSUxFX09QQ19NQVhCX1VfU04sCi0gIFRJTEVfT1BDX01BWEgsCi0gIFRJTEVfT1BDX01BWEhfU04sCi0gIFRJTEVfT1BDX01BWElCX1UsCi0gIFRJTEVfT1BDX01BWElCX1VfU04sCi0gIFRJTEVfT1BDX01BWElILAotICBUSUxFX09QQ19NQVhJSF9TTiwKLSAgVElMRV9PUENfTUYsCi0gIFRJTEVfT1BDX01GU1BSLAotICBUSUxFX09QQ19NSU5CX1UsCi0gIFRJTEVfT1BDX01JTkJfVV9TTiwKLSAgVElMRV9PUENfTUlOSCwKLSAgVElMRV9PUENfTUlOSF9TTiwKLSAgVElMRV9PUENfTUlOSUJfVSwKLSAgVElMRV9PUENfTUlOSUJfVV9TTiwKLSAgVElMRV9PUENfTUlOSUgsCi0gIFRJTEVfT1BDX01JTklIX1NOLAotICBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU5aLAotICBUSUxFX09QQ19NTlpfU04sCi0gIFRJTEVfT1BDX01OWkIsCi0gIFRJTEVfT1BDX01OWkJfU04sCi0gIFRJTEVfT1BDX01OWkgsCi0gIFRJTEVfT1BDX01OWkhfU04sCi0gIFRJTEVfT1BDX01UU1BSLAotICBUSUxFX09QQ19NVUxISF9TUywKLSAgVElMRV9PUENfTVVMSEhfU1NfU04sCi0gIFRJTEVfT1BDX01VTEhIX1NVLAotICBUSUxFX09QQ19NVUxISF9TVV9TTiwKLSAgVElMRV9PUENfTVVMSEhfVVUsCi0gIFRJTEVfT1BDX01VTEhIX1VVX1NOLAotICBUSUxFX09QQ19NVUxISEFfU1MsCi0gIFRJTEVfT1BDX01VTEhIQV9TU19TTiwKLSAgVElMRV9PUENfTVVMSEhBX1NVLAotICBUSUxFX09QQ19NVUxISEFfU1VfU04sCi0gIFRJTEVfT1BDX01VTEhIQV9VVSwKLSAgVElMRV9PUENfTVVMSEhBX1VVX1NOLAotICBUSUxFX09QQ19NVUxISFNBX1VVLAotICBUSUxFX09QQ19NVUxISFNBX1VVX1NOLAotICBUSUxFX09QQ19NVUxITF9TUywKLSAgVElMRV9PUENfTVVMSExfU1NfU04sCi0gIFRJTEVfT1BDX01VTEhMX1NVLAotICBUSUxFX09QQ19NVUxITF9TVV9TTiwKLSAgVElMRV9PUENfTVVMSExfVVMsCi0gIFRJTEVfT1BDX01VTEhMX1VTX1NOLAotICBUSUxFX09QQ19NVUxITF9VVSwKLSAgVElMRV9PUENfTVVMSExfVVVfU04sCi0gIFRJTEVfT1BDX01VTEhMQV9TUywKLSAgVElMRV9PUENfTVVMSExBX1NTX1NOLAotICBUSUxFX09QQ19NVUxITEFfU1UsCi0gIFRJTEVfT1BDX01VTEhMQV9TVV9TTiwKLSAgVElMRV9PUENfTVVMSExBX1VTLAotICBUSUxFX09QQ19NVUxITEFfVVNfU04sCi0gIFRJTEVfT1BDX01VTEhMQV9VVSwKLSAgVElMRV9PUENfTVVMSExBX1VVX1NOLAotICBUSUxFX09QQ19NVUxITFNBX1VVLAotICBUSUxFX09QQ19NVUxITFNBX1VVX1NOLAotICBUSUxFX09QQ19NVUxMTF9TUywKLSAgVElMRV9PUENfTVVMTExfU1NfU04sCi0gIFRJTEVfT1BDX01VTExMX1NVLAotICBUSUxFX09QQ19NVUxMTF9TVV9TTiwKLSAgVElMRV9PUENfTVVMTExfVVUsCi0gIFRJTEVfT1BDX01VTExMX1VVX1NOLAotICBUSUxFX09QQ19NVUxMTEFfU1MsCi0gIFRJTEVfT1BDX01VTExMQV9TU19TTiwKLSAgVElMRV9PUENfTVVMTExBX1NVLAotICBUSUxFX09QQ19NVUxMTEFfU1VfU04sCi0gIFRJTEVfT1BDX01VTExMQV9VVSwKLSAgVElMRV9PUENfTVVMTExBX1VVX1NOLAotICBUSUxFX09QQ19NVUxMTFNBX1VVLAotICBUSUxFX09QQ19NVUxMTFNBX1VVX1NOLAotICBUSUxFX09QQ19NVk5aLAotICBUSUxFX09QQ19NVk5aX1NOLAotICBUSUxFX09QQ19NVlosCi0gIFRJTEVfT1BDX01WWl9TTiwKLSAgVElMRV9PUENfTVosCi0gIFRJTEVfT1BDX01aX1NOLAotICBUSUxFX09QQ19NWkIsCi0gIFRJTEVfT1BDX01aQl9TTiwKLSAgVElMRV9PUENfTVpILAotICBUSUxFX09QQ19NWkhfU04sCi0gIFRJTEVfT1BDX05BUCwKLSAgVElMRV9PUENfTk9QLAotICBUSUxFX09QQ19OT1IsCi0gIFRJTEVfT1BDX05PUl9TTiwKLSAgVElMRV9PUENfT1IsCi0gIFRJTEVfT1BDX09SX1NOLAotICBUSUxFX09QQ19PUkksCi0gIFRJTEVfT1BDX09SSV9TTiwKLSAgVElMRV9PUENfUEFDS0JTX1UsCi0gIFRJTEVfT1BDX1BBQ0tCU19VX1NOLAotICBUSUxFX09QQ19QQUNLSEIsCi0gIFRJTEVfT1BDX1BBQ0tIQl9TTiwKLSAgVElMRV9PUENfUEFDS0hTLAotICBUSUxFX09QQ19QQUNLSFNfU04sCi0gIFRJTEVfT1BDX1BBQ0tMQiwKLSAgVElMRV9PUENfUEFDS0xCX1NOLAotICBUSUxFX09QQ19QQ05ULAotICBUSUxFX09QQ19QQ05UX1NOLAotICBUSUxFX09QQ19STCwKLSAgVElMRV9PUENfUkxfU04sCi0gIFRJTEVfT1BDX1JMSSwKLSAgVElMRV9PUENfUkxJX1NOLAotICBUSUxFX09QQ19TMUEsCi0gIFRJTEVfT1BDX1MxQV9TTiwKLSAgVElMRV9PUENfUzJBLAotICBUSUxFX09QQ19TMkFfU04sCi0gIFRJTEVfT1BDX1MzQSwKLSAgVElMRV9PUENfUzNBX1NOLAotICBUSUxFX09QQ19TQURBQl9VLAotICBUSUxFX09QQ19TQURBQl9VX1NOLAotICBUSUxFX09QQ19TQURBSCwKLSAgVElMRV9PUENfU0FEQUhfU04sCi0gIFRJTEVfT1BDX1NBREFIX1UsCi0gIFRJTEVfT1BDX1NBREFIX1VfU04sCi0gIFRJTEVfT1BDX1NBREJfVSwKLSAgVElMRV9PUENfU0FEQl9VX1NOLAotICBUSUxFX09QQ19TQURILAotICBUSUxFX09QQ19TQURIX1NOLAotICBUSUxFX09QQ19TQURIX1UsCi0gIFRJTEVfT1BDX1NBREhfVV9TTiwKLSAgVElMRV9PUENfU0IsCi0gIFRJTEVfT1BDX1NCQURELAotICBUSUxFX09QQ19TRVEsCi0gIFRJTEVfT1BDX1NFUV9TTiwKLSAgVElMRV9PUENfU0VRQiwKLSAgVElMRV9PUENfU0VRQl9TTiwKLSAgVElMRV9PUENfU0VRSCwKLSAgVElMRV9PUENfU0VRSF9TTiwKLSAgVElMRV9PUENfU0VRSSwKLSAgVElMRV9PUENfU0VRSV9TTiwKLSAgVElMRV9PUENfU0VRSUIsCi0gIFRJTEVfT1BDX1NFUUlCX1NOLAotICBUSUxFX09QQ19TRVFJSCwKLSAgVElMRV9PUENfU0VRSUhfU04sCi0gIFRJTEVfT1BDX1NILAotICBUSUxFX09QQ19TSEFERCwKLSAgVElMRV9PUENfU0hMLAotICBUSUxFX09QQ19TSExfU04sCi0gIFRJTEVfT1BDX1NITEIsCi0gIFRJTEVfT1BDX1NITEJfU04sCi0gIFRJTEVfT1BDX1NITEgsCi0gIFRJTEVfT1BDX1NITEhfU04sCi0gIFRJTEVfT1BDX1NITEksCi0gIFRJTEVfT1BDX1NITElfU04sCi0gIFRJTEVfT1BDX1NITElCLAotICBUSUxFX09QQ19TSExJQl9TTiwKLSAgVElMRV9PUENfU0hMSUgsCi0gIFRJTEVfT1BDX1NITElIX1NOLAotICBUSUxFX09QQ19TSFIsCi0gIFRJTEVfT1BDX1NIUl9TTiwKLSAgVElMRV9PUENfU0hSQiwKLSAgVElMRV9PUENfU0hSQl9TTiwKLSAgVElMRV9PUENfU0hSSCwKLSAgVElMRV9PUENfU0hSSF9TTiwKLSAgVElMRV9PUENfU0hSSSwKLSAgVElMRV9PUENfU0hSSV9TTiwKLSAgVElMRV9PUENfU0hSSUIsCi0gIFRJTEVfT1BDX1NIUklCX1NOLAotICBUSUxFX09QQ19TSFJJSCwKLSAgVElMRV9PUENfU0hSSUhfU04sCi0gIFRJTEVfT1BDX1NMVCwKLSAgVElMRV9PUENfU0xUX1NOLAotICBUSUxFX09QQ19TTFRfVSwKLSAgVElMRV9PUENfU0xUX1VfU04sCi0gIFRJTEVfT1BDX1NMVEIsCi0gIFRJTEVfT1BDX1NMVEJfU04sCi0gIFRJTEVfT1BDX1NMVEJfVSwKLSAgVElMRV9PUENfU0xUQl9VX1NOLAotICBUSUxFX09QQ19TTFRFLAotICBUSUxFX09QQ19TTFRFX1NOLAotICBUSUxFX09QQ19TTFRFX1UsCi0gIFRJTEVfT1BDX1NMVEVfVV9TTiwKLSAgVElMRV9PUENfU0xURUIsCi0gIFRJTEVfT1BDX1NMVEVCX1NOLAotICBUSUxFX09QQ19TTFRFQl9VLAotICBUSUxFX09QQ19TTFRFQl9VX1NOLAotICBUSUxFX09QQ19TTFRFSCwKLSAgVElMRV9PUENfU0xURUhfU04sCi0gIFRJTEVfT1BDX1NMVEVIX1UsCi0gIFRJTEVfT1BDX1NMVEVIX1VfU04sCi0gIFRJTEVfT1BDX1NMVEgsCi0gIFRJTEVfT1BDX1NMVEhfU04sCi0gIFRJTEVfT1BDX1NMVEhfVSwKLSAgVElMRV9PUENfU0xUSF9VX1NOLAotICBUSUxFX09QQ19TTFRJLAotICBUSUxFX09QQ19TTFRJX1NOLAotICBUSUxFX09QQ19TTFRJX1UsCi0gIFRJTEVfT1BDX1NMVElfVV9TTiwKLSAgVElMRV9PUENfU0xUSUIsCi0gIFRJTEVfT1BDX1NMVElCX1NOLAotICBUSUxFX09QQ19TTFRJQl9VLAotICBUSUxFX09QQ19TTFRJQl9VX1NOLAotICBUSUxFX09QQ19TTFRJSCwKLSAgVElMRV9PUENfU0xUSUhfU04sCi0gIFRJTEVfT1BDX1NMVElIX1UsCi0gIFRJTEVfT1BDX1NMVElIX1VfU04sCi0gIFRJTEVfT1BDX1NORSwKLSAgVElMRV9PUENfU05FX1NOLAotICBUSUxFX09QQ19TTkVCLAotICBUSUxFX09QQ19TTkVCX1NOLAotICBUSUxFX09QQ19TTkVILAotICBUSUxFX09QQ19TTkVIX1NOLAotICBUSUxFX09QQ19TUkEsCi0gIFRJTEVfT1BDX1NSQV9TTiwKLSAgVElMRV9PUENfU1JBQiwKLSAgVElMRV9PUENfU1JBQl9TTiwKLSAgVElMRV9PUENfU1JBSCwKLSAgVElMRV9PUENfU1JBSF9TTiwKLSAgVElMRV9PUENfU1JBSSwKLSAgVElMRV9PUENfU1JBSV9TTiwKLSAgVElMRV9PUENfU1JBSUIsCi0gIFRJTEVfT1BDX1NSQUlCX1NOLAotICBUSUxFX09QQ19TUkFJSCwKLSAgVElMRV9PUENfU1JBSUhfU04sCi0gIFRJTEVfT1BDX1NVQiwKLSAgVElMRV9PUENfU1VCX1NOLAotICBUSUxFX09QQ19TVUJCLAotICBUSUxFX09QQ19TVUJCX1NOLAotICBUSUxFX09QQ19TVUJCU19VLAotICBUSUxFX09QQ19TVUJCU19VX1NOLAotICBUSUxFX09QQ19TVUJILAotICBUSUxFX09QQ19TVUJIX1NOLAotICBUSUxFX09QQ19TVUJIUywKLSAgVElMRV9PUENfU1VCSFNfU04sCi0gIFRJTEVfT1BDX1NVQlMsCi0gIFRJTEVfT1BDX1NVQlNfU04sCi0gIFRJTEVfT1BDX1NXLAotICBUSUxFX09QQ19TV0FERCwKLSAgVElMRV9PUENfU1dJTlQwLAotICBUSUxFX09QQ19TV0lOVDEsCi0gIFRJTEVfT1BDX1NXSU5UMiwKLSAgVElMRV9PUENfU1dJTlQzLAotICBUSUxFX09QQ19UQkxJRFhCMCwKLSAgVElMRV9PUENfVEJMSURYQjBfU04sCi0gIFRJTEVfT1BDX1RCTElEWEIxLAotICBUSUxFX09QQ19UQkxJRFhCMV9TTiwKLSAgVElMRV9PUENfVEJMSURYQjIsCi0gIFRJTEVfT1BDX1RCTElEWEIyX1NOLAotICBUSUxFX09QQ19UQkxJRFhCMywKLSAgVElMRV9PUENfVEJMSURYQjNfU04sCi0gIFRJTEVfT1BDX1ROUywKLSAgVElMRV9PUENfVE5TX1NOLAotICBUSUxFX09QQ19XSDY0LAotICBUSUxFX09QQ19YT1IsCi0gIFRJTEVfT1BDX1hPUl9TTiwKLSAgVElMRV9PUENfWE9SSSwKLSAgVElMRV9PUENfWE9SSV9TTiwKLSAgVElMRV9PUENfTk9ORQotfSB0aWxlX21uZW1vbmljOwotCi0vKiA2NC1iaXQgcGF0dGVybiBmb3IgYSB7IGJwdCA7IG5vcCB9IGJ1bmRsZS4gKi8KLSNkZWZpbmUgVElMRV9CUFRfQlVORExFIDB4NDAwYjNjYWU3MDE2NjAwMFVMTAotCi0KLSNkZWZpbmUgVElMRV9FTEZfTUFDSElORV9DT0RFIEVNX1RJTEVQUk8KLQotI2RlZmluZSBUSUxFX0VMRl9OQU1FICJlbGYzMi10aWxlcHJvIgotCi0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Cck9mZl9TTih0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfQnJPZmZfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDAwMDA3ZmZmKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMjApKSAmIDB4MDAwMTgwMDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfQnJUeXBlX1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0Rlc3RfSW1tOF9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDAwMDAwM2YpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgwMDAwMDBjMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1NOKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyKSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfRGVzdF9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAwKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0Rlc3RfWTEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbTE2X1gwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHhmZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbTE2X1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHhmZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbThfU04odGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9ZMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9ZMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tT3Bjb2RlRXh0ZW5zaW9uX1gwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyMCkpICYgMHg3Zik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9JbW1PcGNvZGVFeHRlbnNpb25fWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDUxKSkgJiAweDdmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbVJST3Bjb2RlRXh0ZW5zaW9uX1NOKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiA4KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSk9mZkxvbmdfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDAwMDA3ZmZmKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMjApKSAmIDB4MDAwMTgwMDApIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAxNCkpICYgMHgwMDFlMDAwMCkgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDE2KSkgJiAweDA3ZTAwMDAwKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MTgwMDAwMDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSk9mZl9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4MDAwMDdmZmYpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAyMCkpICYgMHgwMDAxODAwMCkgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDE0KSkgJiAweDAwMWUwMDAwKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMTYpKSAmIDB4MDdlMDAwMDApIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgwODAwMDAwMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9NRl9JbW0xNV9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4MDAwMDNmZmYpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA0NCkpICYgMHgwMDAwNDAwMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9NTUVuZF9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfTU1FbmRfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X01NU3RhcnRfWDAodGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDIzKSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X01NU3RhcnRfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU0KSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X01UX0ltbTE1X1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgwMDAwMDAzZikgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDAwMDAzZmMwKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDQpKSAmIDB4MDAwMDQwMDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfTW9kZSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNjMpKSAmIDB4MSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Ob1JlZ09wY29kZUV4dGVuc2lvbl9TTih0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9TTih0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTApKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfT3Bjb2RlX1gwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyOCkpICYgMHg3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTkpKSAmIDB4Zik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9PcGNvZGVfWTAodGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDI3KSkgJiAweGYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfT3Bjb2RlX1kxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1OSkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9ZMih0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTYpKSAmIDB4Nyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9SUk9wY29kZUV4dGVuc2lvbl9TTih0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gNCkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4MWZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDkpKSAmIDB4MWZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9ZMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9SUlJPcGNvZGVFeHRlbnNpb25fWTEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfUm91dGVPcGNvZGVFeHRlbnNpb25fU04odGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4M2ZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NfWDAodGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDI3KSkgJiAweDEpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU19YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTgpKSAmIDB4MSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TaEFtdF9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NoQW10X1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgxZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TaEFtdF9ZMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQV9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gNikpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNBX1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNBX1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiA2KSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0FfWTEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0FfWTIodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgobiA+PiAyNikpICYgMHgwMDAwMDAwMSkgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDUwKSkgJiAweDAwMDAwMDNlKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0JEZXN0X1kyKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyMCkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1gwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1kxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNfU04odGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Vbk9wY29kZUV4dGVuc2lvbl9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfVW5PcGNvZGVFeHRlbnNpb25fWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuT3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgxZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Vbk9wY29kZUV4dGVuc2lvbl9ZMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfVW5TaE9wY29kZUV4dGVuc2lvbl9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTcpKSAmIDB4M2ZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuU2hPcGNvZGVFeHRlbnNpb25fWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ4KSkgJiAweDNmZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9VblNoT3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxNykpICYgMHg3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuU2hPcGNvZGVFeHRlbnNpb25fWTEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ4KSkgJiAweDcpOwotfQotCi0KLXN0YXRpYyBfX2lubGluZSBpbnQKLXNpZ25fZXh0ZW5kKGludCBuLCBpbnQgbnVtX2JpdHMpCi17Ci0gIGludCBzaGlmdCA9IChpbnQpKHNpemVvZihpbnQpICogOCAtIG51bV9iaXRzKTsKLSAgcmV0dXJuIChuIDw8IHNoaWZ0KSA+PiBzaGlmdDsKLX0KLQotCi0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfQnJPZmZfU04oaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9Cck9mZl9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDdmZmYpKSA8PCA0MykgfAotICAgICAgICAgKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMTgwMDApKSA8PCAyMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfQnJUeXBlX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHhmKSkgPDwgMzEpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0Rlc3RfSW1tOF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAotICAgICAgICAgKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwYzApKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfRGVzdF9TTihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzKSA8PCAyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW0xNl9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmZmZmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tMTZfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweGZmZmYpKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tOF9TTihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmZikgPDwgMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tOF9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmZikgPDwgMTIpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0ltbThfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweGZmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0ltbThfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW04X1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHhmZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW1PcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4N2YpIDw8IDIwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW1PcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDdmKSkgPDwgNTEpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0ltbVJST3Bjb2RlRXh0ZW5zaW9uX1NOKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDMpIDw8IDgpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0pPZmZMb25nX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwN2ZmZikpIDw8IDQzKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAxODAwMCkpIDw8IDIwKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDFlMDAwMCkpIDw8IDE0KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwN2UwMDAwMCkpIDw8IDE2KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgxODAwMDAwMCkpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9KT2ZmX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwN2ZmZikpIDw8IDQzKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAxODAwMCkpIDw8IDIwKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDFlMDAwMCkpIDw8IDE0KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwN2UwMDAwMCkpIDw8IDE2KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwODAwMDAwMCkpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9NRl9JbW0xNV9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDNmZmYpKSA8PCAzNykgfAotICAgICAgICAgKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDQwMDApKSA8PCA0NCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfTU1FbmRfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4MWYpIDw8IDE4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9NTUVuZF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MWYpKSA8PCA0OSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfTU1TdGFydF9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgxZikgPDwgMjMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX01NU3RhcnRfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNTQpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX01UX0ltbTE1X1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAzZikpIDw8IDMxKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwM2ZjMCkpIDw8IDM3KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwNDAwMCkpIDw8IDQ0KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9Nb2RlKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgxKSkgPDwgNjMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX05vUmVnT3Bjb2RlRXh0ZW5zaW9uX1NOKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweGYpIDw8IDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9TTihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgMTApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHg3KSA8PCAyOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfT3Bjb2RlX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHhmKSkgPDwgNTkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmKSA8PCAyNyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfT3Bjb2RlX1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHhmKSkgPDwgNTkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9ZMihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4NykpIDw8IDU2KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUk9wY29kZUV4dGVuc2lvbl9TTihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmKSA8PCA0KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4MWZmKSA8PCAxOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgxZmYpKSA8PCA0OSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDMpIDw8IDE4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDMpKSA8PCA0OSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfUm91dGVPcGNvZGVFeHRlbnNpb25fU04oaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDEpIDw8IDI3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgxKSkgPDwgNTgpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NoQW10X1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDFmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hBbXRfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NoQW10X1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDFmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hBbXRfWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWTIoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4MDAwMDAwMDEpIDw8IDI2KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAzZSkpIDw8IDUwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCRGVzdF9ZMihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgMjApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0JfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjX1NOKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDMpIDw8IDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuT3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDFmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfVW5PcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuT3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDFmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfVW5PcGNvZGVFeHRlbnNpb25fWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuU2hPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAxNyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfVW5TaE9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4M2ZmKSkgPDwgNDgpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuU2hPcGNvZGVFeHRlbnNpb25fWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4NykgPDwgMTcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuU2hPcGNvZGVFeHRlbnNpb25fWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDcpKSA8PCA0OCk7Ci19Ci0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgVElMRV9QSVBFTElORV9YMCwKLSAgVElMRV9QSVBFTElORV9YMSwKLSAgVElMRV9QSVBFTElORV9ZMCwKLSAgVElMRV9QSVBFTElORV9ZMSwKLSAgVElMRV9QSVBFTElORV9ZMiwKLX0gdGlsZV9waXBlbGluZTsKLQotI2RlZmluZSB0aWxlX2lzX3hfcGlwZWxpbmUocCkgKChpbnQpKHApIDw9IChpbnQpVElMRV9QSVBFTElORV9YMSkKLQotdHlwZWRlZiBlbnVtCi17Ci0gIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwKLSAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwKLSAgVElMRV9PUF9UWVBFX0FERFJFU1MsCi0gIFRJTEVfT1BfVFlQRV9TUFIKLX0gdGlsZV9vcGVyYW5kX3R5cGU7Ci0KLS8qIFRoaXMgaXMgdGhlIGJpdCB0aGF0IGRldGVybWluZXMgaWYgYSBidW5kbGUgaXMgaW4gdGhlIFkgZW5jb2RpbmcuICovCi0jZGVmaW5lIFRJTEVfQlVORExFX1lfRU5DT0RJTkdfTUFTSyAoKHRpbGVfYnVuZGxlX2JpdHMpMSA8PCA2MykKLQotZW51bQotewotICAvKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW4gYSBidW5kbGUgKDIgZm9yIFgsIDMgZm9yIFkpLiAqLwotICBUSUxFX01BWF9JTlNUUlVDVElPTlNfUEVSX0JVTkRMRSA9IDMsCi0KLSAgLyogSG93IG1hbnkgZGlmZmVyZW50IHBpcGVsaW5lIGVuY29kaW5ncyBhcmUgdGhlcmU/IFgwLCBYMSwgWTAsIFkxLCBZMi4gKi8KLSAgVElMRV9OVU1fUElQRUxJTkVfRU5DT0RJTkdTID0gNSwKLQotICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVfQlVORExFX1NJWkVfSU5fQllURVMuICovCi0gIFRJTEVfTE9HMl9CVU5ETEVfU0laRV9JTl9CWVRFUyA9IDMsCi0KLSAgLyogSW5zdHJ1Y3Rpb25zIHRha2UgdGhpcyBtYW55IGJ5dGVzLiAqLwotICBUSUxFX0JVTkRMRV9TSVpFX0lOX0JZVEVTID0gMSA8PCBUSUxFX0xPRzJfQlVORExFX1NJWkVfSU5fQllURVMsCi0KLSAgLyogTG9nIGJhc2UgMiBvZiBUSUxFX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMuICovCi0gIFRJTEVfTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTID0gMywKLQotICAvKiBCdW5kbGVzIHNob3VsZCBiZSBhbGlnbmVkIG1vZHVsbyB0aGlzIG51bWJlciBvZiBieXRlcy4gKi8KLSAgVElMRV9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTID0KLSAgICAoMSA8PCBUSUxFX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyksCi0KLSAgLyogTG9nIGJhc2UgMiBvZiBUSUxFX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMuICovCi0gIFRJTEVfTE9HMl9TTl9JTlNUUlVDVElPTl9TSVpFX0lOX0JZVEVTID0gMSwKLQotICAvKiBTdGF0aWMgbmV0d29yayBpbnN0cnVjdGlvbnMgdGFrZSB0aGlzIG1hbnkgYnl0ZXMuICovCi0gIFRJTEVfU05fSU5TVFJVQ1RJT05fU0laRV9JTl9CWVRFUyA9Ci0gICAgKDEgPDwgVElMRV9MT0cyX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMpLAotCi0gIC8qIE51bWJlciBvZiByZWdpc3RlcnMgKHNvbWUgYXJlIG1hZ2ljLCBzdWNoIGFzIG5ldHdvcmsgSS9PKS4gKi8KLSAgVElMRV9OVU1fUkVHSVNURVJTID0gNjQsCi0KLSAgLyogTnVtYmVyIG9mIHN0YXRpYyBuZXR3b3JrIHJlZ2lzdGVycy4gKi8KLSAgVElMRV9OVU1fU05fUkVHSVNURVJTID0gNAotfTsKLQotCi1zdHJ1Y3QgdGlsZV9vcGVyYW5kCi17Ci0gIC8qIElzIHRoaXMgb3BlcmFuZCBhIHJlZ2lzdGVyLCBpbW1lZGlhdGUgb3IgYWRkcmVzcz8gKi8KLSAgdGlsZV9vcGVyYW5kX3R5cGUgdHlwZTsKLQotICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIHR5cGUgZm9yIHRoaXMgb3BlcmFuZC4gICovCi0gIHNpZ25lZCBpbnQgZGVmYXVsdF9yZWxvYyA6IDE2OwotCi0gIC8qIEhvdyBtYW55IGJpdHMgaXMgdGhpcyB2YWx1ZT8gKHVzZWQgZm9yIHJhbmdlIGNoZWNraW5nKSAqLwotICB1bnNpZ25lZCBpbnQgbnVtX2JpdHMgOiA1OwotCi0gIC8qIElzIHRoZSB2YWx1ZSBzaWduZWQ/ICh1c2VkIGZvciByYW5nZSBjaGVja2luZykgKi8KLSAgdW5zaWduZWQgaW50IGlzX3NpZ25lZCA6IDE7Ci0KLSAgLyogSXMgdGhpcyBvcGVyYW5kIGEgc291cmNlIHJlZ2lzdGVyPyAqLwotICB1bnNpZ25lZCBpbnQgaXNfc3JjX3JlZyA6IDE7Ci0KLSAgLyogSXMgdGhpcyBvcGVyYW5kIHdyaXR0ZW4/IChpLmUuIGlzIGl0IGEgZGVzdGluYXRpb24gcmVnaXN0ZXIpICovCi0gIHVuc2lnbmVkIGludCBpc19kZXN0X3JlZyA6IDE7Ci0KLSAgLyogSXMgdGhpcyBvcGVyYW5kIFBDLXJlbGF0aXZlPyAqLwotICB1bnNpZ25lZCBpbnQgaXNfcGNfcmVsYXRpdmUgOiAxOwotCi0gIC8qIEJ5IGhvdyBtYW55IGJpdHMgZG8gd2UgcmlnaHQgc2hpZnQgdGhlIHZhbHVlIGJlZm9yZSBpbnNlcnRpbmc/ICovCi0gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0IDogMjsKLQotICAvKiBSZXR1cm4gdGhlIGJpdHMgZm9yIHRoaXMgb3BlcmFuZCB0byBiZSBPUmVkIGludG8gYW4gZXhpc3RpbmcgYnVuZGxlLiAqLwotICB0aWxlX2J1bmRsZV9iaXRzICgqaW5zZXJ0KSAoaW50IG9wKTsKLQotICAvKiBFeHRyYWN0IHRoaXMgb3BlcmFuZCBhbmQgcmV0dXJuIGl0LiAqLwotICB1bnNpZ25lZCBpbnQgKCpleHRyYWN0KSAodGlsZV9idW5kbGVfYml0cyBidW5kbGUpOwotfTsKLQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHRpbGVfb3BlcmFuZCB0aWxlX29wZXJhbmRzW107Ci0KLS8qIE9uZSBmaW5pdGUtc3RhdGUgbWFjaGluZSBwZXIgcGlwZSBmb3IgcmFwaWQgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcuICovCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgKiBjb25zdAotdGlsZV9idW5kbGVfZGVjb2Rlcl9mc21zW1RJTEVfTlVNX1BJUEVMSU5FX0VOQ09ESU5HU107Ci0KLQotc3RydWN0IHRpbGVfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbW5lbW9uaWMsIGUuZy4gImFkZCIgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgZW51bSB2YWx1ZSBmb3IgdGhpcyBtbmVtb25pYy4gKi8KLSAgdGlsZV9tbmVtb25pYyBtbmVtb25pYzsKLQotICAvKiBBIGJpdCBtYXNrIG9mIHdoaWNoIG9mIHRoZSBmaXZlIHBpcGVzIHRoaXMgaW5zdHJ1Y3Rpb24KLSAgICAgaXMgY29tcGF0aWJsZSB3aXRoOgotICAgICBYMCAgMHgwMQotICAgICBYMSAgMHgwMgotICAgICBZMCAgMHgwNAotICAgICBZMSAgMHgwOAotICAgICBZMiAgMHgxMCAqLwotICB1bnNpZ25lZCBjaGFyIHBpcGVzOwotCi0gIC8qIEhvdyBtYW55IG9wZXJhbmRzIGFyZSB0aGVyZT8gKi8KLSAgdW5zaWduZWQgY2hhciBudW1fb3BlcmFuZHM7Ci0KLSAgLyogV2hpY2ggcmVnaXN0ZXIgZG9lcyB0aGlzIHdyaXRlIGltcGxpY2l0bHksIG9yIFRSRUdfWkVSTyBpZiBub25lPyAqLwotICB1bnNpZ25lZCBjaGFyIGltcGxpY2l0bHlfd3JpdHRlbl9yZWdpc3RlcjsKLQotICAvKiBDYW4gdGhpcyBiZSBidW5kbGVkIHdpdGggb3RoZXIgaW5zdHJ1Y3Rpb25zIChhbG1vc3QgYWx3YXlzIHRydWUpLiAqLwotICB1bnNpZ25lZCBjaGFyIGNhbl9idW5kbGU7Ci0KLSAgLyogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBvcGVyYW5kcy4gRWFjaCBvZiB0aGVzZSBpcyBhbgotICAgKiBpbmRleCBpbnRvIHRoZSB0aWxlX29wZXJhbmRzW10gdGFibGUuICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbVElMRV9OVU1fUElQRUxJTkVfRU5DT0RJTkdTXVtUSUxFX01BWF9PUEVSQU5EU107Ci0KLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGlsZV9vcGNvZGUgdGlsZV9vcGNvZGVzW107Ci0KLQotLyogVXNlZCBmb3Igbm9uLXRleHR1YWwgZGlzYXNzZW1ibHkgaW50byBzdHJ1Y3RzLiAqLwotc3RydWN0IHRpbGVfZGVjb2RlZF9pbnN0cnVjdGlvbgotewotICBjb25zdCBzdHJ1Y3QgdGlsZV9vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHRpbGVfb3BlcmFuZCAqb3BlcmFuZHNbVElMRV9NQVhfT1BFUkFORFNdOwotICBpbnQgb3BlcmFuZF92YWx1ZXNbVElMRV9NQVhfT1BFUkFORFNdOwotfTsKLQotCi0vKiBEaXNhc3NlbWJsZSBhIGJ1bmRsZSBpbnRvIGEgc3RydWN0IGZvciBtYWNoaW5lIHByb2Nlc3NpbmcuICovCi1leHRlcm4gaW50IHBhcnNlX2luc25fdGlsZSh0aWxlX2J1bmRsZV9iaXRzIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGlsZV9kZWNvZGVkX2luc3RydWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkW1RJTEVfTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFXSk7Ci0KLQotLyogR2l2ZW4gYSBzZXQgb2YgYnVuZGxlIGJpdHMgYW5kIGEgc3BlY2lmaWMgcGlwZSwgcmV0dXJucyB3aGljaAotICogaW5zdHJ1Y3Rpb24gdGhlIGJ1bmRsZSBjb250YWlucyBpbiB0aGF0IHBpcGUuCi0gKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGlsZV9vcGNvZGUgKgotZmluZF9vcGNvZGUodGlsZV9idW5kbGVfYml0cyBiaXRzLCB0aWxlX3BpcGVsaW5lIHBpcGUpOwotCi0KLQotI2VuZGlmIC8qIG9wY29kZV90aWxlX2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGUtdGlsZV82NC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZS10aWxlXzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNjMzNDYuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZS10aWxlXzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ4ICswLDAgQEAKLS8qIHRpbGUuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVElMRSBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAoQykgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFRpbGVyYSBDb3JwLiAqLwotCi0jaWZuZGVmIG9wY29kZV90aWxlX2gKLSNkZWZpbmUgb3Bjb2RlX3RpbGVfaAotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB0aWxlZ3hfYnVuZGxlX2JpdHM7Ci0KLQotZW51bQotewotICBUSUxFR1hfTUFYX09QRVJBTkRTID0gNCAvKiBiZmV4dHMgKi8KLX07Ci0KLXR5cGVkZWYgZW51bQotewotICBUSUxFR1hfT1BDX0JQVCwKLSAgVElMRUdYX09QQ19JTkZPLAotICBUSUxFR1hfT1BDX0lORk9MLAotICBUSUxFR1hfT1BDX01PVkUsCi0gIFRJTEVHWF9PUENfTU9WRUksCi0gIFRJTEVHWF9PUENfTU9WRUxJLAotICBUSUxFR1hfT1BDX1BSRUZFVENILAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0FERF9MMSwKLSAgVElMRUdYX09QQ19QUkVGRVRDSF9BRERfTDFfRkFVTFQsCi0gIFRJTEVHWF9PUENfUFJFRkVUQ0hfQUREX0wyLAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0FERF9MMl9GQVVMVCwKLSAgVElMRUdYX09QQ19QUkVGRVRDSF9BRERfTDMsCi0gIFRJTEVHWF9PUENfUFJFRkVUQ0hfQUREX0wzX0ZBVUxULAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wxLAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wxX0ZBVUxULAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wyLAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wyX0ZBVUxULAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wzLAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wzX0ZBVUxULAotICBUSUxFR1hfT1BDX1JBSVNFLAotICBUSUxFR1hfT1BDX0FERCwKLSAgVElMRUdYX09QQ19BRERJLAotICBUSUxFR1hfT1BDX0FERExJLAotICBUSUxFR1hfT1BDX0FERFgsCi0gIFRJTEVHWF9PUENfQUREWEksCi0gIFRJTEVHWF9PUENfQUREWExJLAotICBUSUxFR1hfT1BDX0FERFhTQywKLSAgVElMRUdYX09QQ19BTkQsCi0gIFRJTEVHWF9PUENfQU5ESSwKLSAgVElMRUdYX09QQ19CRVFaLAotICBUSUxFR1hfT1BDX0JFUVpULAotICBUSUxFR1hfT1BDX0JGRVhUUywKLSAgVElMRUdYX09QQ19CRkVYVFUsCi0gIFRJTEVHWF9PUENfQkZJTlMsCi0gIFRJTEVHWF9PUENfQkdFWiwKLSAgVElMRUdYX09QQ19CR0VaVCwKLSAgVElMRUdYX09QQ19CR1RaLAotICBUSUxFR1hfT1BDX0JHVFpULAotICBUSUxFR1hfT1BDX0JMQkMsCi0gIFRJTEVHWF9PUENfQkxCQ1QsCi0gIFRJTEVHWF9PUENfQkxCUywKLSAgVElMRUdYX09QQ19CTEJTVCwKLSAgVElMRUdYX09QQ19CTEVaLAotICBUSUxFR1hfT1BDX0JMRVpULAotICBUSUxFR1hfT1BDX0JMVFosCi0gIFRJTEVHWF9PUENfQkxUWlQsCi0gIFRJTEVHWF9PUENfQk5FWiwKLSAgVElMRUdYX09QQ19CTkVaVCwKLSAgVElMRUdYX09QQ19DTFosCi0gIFRJTEVHWF9PUENfQ01PVkVRWiwKLSAgVElMRUdYX09QQ19DTU9WTkVaLAotICBUSUxFR1hfT1BDX0NNUEVRLAotICBUSUxFR1hfT1BDX0NNUEVRSSwKLSAgVElMRUdYX09QQ19DTVBFWENILAotICBUSUxFR1hfT1BDX0NNUEVYQ0g0LAotICBUSUxFR1hfT1BDX0NNUExFUywKLSAgVElMRUdYX09QQ19DTVBMRVUsCi0gIFRJTEVHWF9PUENfQ01QTFRTLAotICBUSUxFR1hfT1BDX0NNUExUU0ksCi0gIFRJTEVHWF9PUENfQ01QTFRVLAotICBUSUxFR1hfT1BDX0NNUExUVUksCi0gIFRJTEVHWF9PUENfQ01QTkUsCi0gIFRJTEVHWF9PUENfQ01VTCwKLSAgVElMRUdYX09QQ19DTVVMQSwKLSAgVElMRUdYX09QQ19DTVVMQUYsCi0gIFRJTEVHWF9PUENfQ01VTEYsCi0gIFRJTEVHWF9PUENfQ01VTEZSLAotICBUSUxFR1hfT1BDX0NNVUxILAotICBUSUxFR1hfT1BDX0NNVUxIUiwKLSAgVElMRUdYX09QQ19DUkMzMl8zMiwKLSAgVElMRUdYX09QQ19DUkMzMl84LAotICBUSUxFR1hfT1BDX0NUWiwKLSAgVElMRUdYX09QQ19EQkxBTElHTiwKLSAgVElMRUdYX09QQ19EQkxBTElHTjIsCi0gIFRJTEVHWF9PUENfREJMQUxJR040LAotICBUSUxFR1hfT1BDX0RCTEFMSUdONiwKLSAgVElMRUdYX09QQ19EUkFJTiwKLSAgVElMRUdYX09QQ19EVExCUFIsCi0gIFRJTEVHWF9PUENfRVhDSCwKLSAgVElMRUdYX09QQ19FWENINCwKLSAgVElMRUdYX09QQ19GRE9VQkxFX0FERF9GTEFHUywKLSAgVElMRUdYX09QQ19GRE9VQkxFX0FERFNVQiwKLSAgVElMRUdYX09QQ19GRE9VQkxFX01VTF9GTEFHUywKLSAgVElMRUdYX09QQ19GRE9VQkxFX1BBQ0sxLAotICBUSUxFR1hfT1BDX0ZET1VCTEVfUEFDSzIsCi0gIFRJTEVHWF9PUENfRkRPVUJMRV9TVUJfRkxBR1MsCi0gIFRJTEVHWF9PUENfRkRPVUJMRV9VTlBBQ0tfTUFYLAotICBUSUxFR1hfT1BDX0ZET1VCTEVfVU5QQUNLX01JTiwKLSAgVElMRUdYX09QQ19GRVRDSEFERCwKLSAgVElMRUdYX09QQ19GRVRDSEFERDQsCi0gIFRJTEVHWF9PUENfRkVUQ0hBRERHRVosCi0gIFRJTEVHWF9PUENfRkVUQ0hBRERHRVo0LAotICBUSUxFR1hfT1BDX0ZFVENIQU5ELAotICBUSUxFR1hfT1BDX0ZFVENIQU5ENCwKLSAgVElMRUdYX09QQ19GRVRDSE9SLAotICBUSUxFR1hfT1BDX0ZFVENIT1I0LAotICBUSUxFR1hfT1BDX0ZJTlYsCi0gIFRJTEVHWF9PUENfRkxVU0gsCi0gIFRJTEVHWF9PUENfRkxVU0hXQiwKLSAgVElMRUdYX09QQ19GTk9QLAotICBUSUxFR1hfT1BDX0ZTSU5HTEVfQUREMSwKLSAgVElMRUdYX09QQ19GU0lOR0xFX0FERFNVQjIsCi0gIFRJTEVHWF9PUENfRlNJTkdMRV9NVUwxLAotICBUSUxFR1hfT1BDX0ZTSU5HTEVfTVVMMiwKLSAgVElMRUdYX09QQ19GU0lOR0xFX1BBQ0sxLAotICBUSUxFR1hfT1BDX0ZTSU5HTEVfUEFDSzIsCi0gIFRJTEVHWF9PUENfRlNJTkdMRV9TVUIxLAotICBUSUxFR1hfT1BDX0lDT0gsCi0gIFRJTEVHWF9PUENfSUxMLAotICBUSUxFR1hfT1BDX0lOViwKLSAgVElMRUdYX09QQ19JUkVULAotICBUSUxFR1hfT1BDX0osCi0gIFRJTEVHWF9PUENfSkFMLAotICBUSUxFR1hfT1BDX0pBTFIsCi0gIFRJTEVHWF9PUENfSkFMUlAsCi0gIFRJTEVHWF9PUENfSlIsCi0gIFRJTEVHWF9PUENfSlJQLAotICBUSUxFR1hfT1BDX0xELAotICBUSUxFR1hfT1BDX0xEMVMsCi0gIFRJTEVHWF9PUENfTEQxU19BREQsCi0gIFRJTEVHWF9PUENfTEQxVSwKLSAgVElMRUdYX09QQ19MRDFVX0FERCwKLSAgVElMRUdYX09QQ19MRDJTLAotICBUSUxFR1hfT1BDX0xEMlNfQURELAotICBUSUxFR1hfT1BDX0xEMlUsCi0gIFRJTEVHWF9PUENfTEQyVV9BREQsCi0gIFRJTEVHWF9PUENfTEQ0UywKLSAgVElMRUdYX09QQ19MRDRTX0FERCwKLSAgVElMRUdYX09QQ19MRDRVLAotICBUSUxFR1hfT1BDX0xENFVfQURELAotICBUSUxFR1hfT1BDX0xEX0FERCwKLSAgVElMRUdYX09QQ19MRE5BLAotICBUSUxFR1hfT1BDX0xETkFfQURELAotICBUSUxFR1hfT1BDX0xETlQsCi0gIFRJTEVHWF9PUENfTEROVDFTLAotICBUSUxFR1hfT1BDX0xETlQxU19BREQsCi0gIFRJTEVHWF9PUENfTEROVDFVLAotICBUSUxFR1hfT1BDX0xETlQxVV9BREQsCi0gIFRJTEVHWF9PUENfTEROVDJTLAotICBUSUxFR1hfT1BDX0xETlQyU19BREQsCi0gIFRJTEVHWF9PUENfTEROVDJVLAotICBUSUxFR1hfT1BDX0xETlQyVV9BREQsCi0gIFRJTEVHWF9PUENfTEROVDRTLAotICBUSUxFR1hfT1BDX0xETlQ0U19BREQsCi0gIFRJTEVHWF9PUENfTEROVDRVLAotICBUSUxFR1hfT1BDX0xETlQ0VV9BREQsCi0gIFRJTEVHWF9PUENfTEROVF9BREQsCi0gIFRJTEVHWF9PUENfTE5LLAotICBUSUxFR1hfT1BDX01GLAotICBUSUxFR1hfT1BDX01GU1BSLAotICBUSUxFR1hfT1BDX01NLAotICBUSUxFR1hfT1BDX01OWiwKLSAgVElMRUdYX09QQ19NVFNQUiwKLSAgVElMRUdYX09QQ19NVUxfSFNfSFMsCi0gIFRJTEVHWF9PUENfTVVMX0hTX0hVLAotICBUSUxFR1hfT1BDX01VTF9IU19MUywKLSAgVElMRUdYX09QQ19NVUxfSFNfTFUsCi0gIFRJTEVHWF9PUENfTVVMX0hVX0hVLAotICBUSUxFR1hfT1BDX01VTF9IVV9MUywKLSAgVElMRUdYX09QQ19NVUxfSFVfTFUsCi0gIFRJTEVHWF9PUENfTVVMX0xTX0xTLAotICBUSUxFR1hfT1BDX01VTF9MU19MVSwKLSAgVElMRUdYX09QQ19NVUxfTFVfTFUsCi0gIFRJTEVHWF9PUENfTVVMQV9IU19IUywKLSAgVElMRUdYX09QQ19NVUxBX0hTX0hVLAotICBUSUxFR1hfT1BDX01VTEFfSFNfTFMsCi0gIFRJTEVHWF9PUENfTVVMQV9IU19MVSwKLSAgVElMRUdYX09QQ19NVUxBX0hVX0hVLAotICBUSUxFR1hfT1BDX01VTEFfSFVfTFMsCi0gIFRJTEVHWF9PUENfTVVMQV9IVV9MVSwKLSAgVElMRUdYX09QQ19NVUxBX0xTX0xTLAotICBUSUxFR1hfT1BDX01VTEFfTFNfTFUsCi0gIFRJTEVHWF9PUENfTVVMQV9MVV9MVSwKLSAgVElMRUdYX09QQ19NVUxBWCwKLSAgVElMRUdYX09QQ19NVUxYLAotICBUSUxFR1hfT1BDX01aLAotICBUSUxFR1hfT1BDX05BUCwKLSAgVElMRUdYX09QQ19OT1AsCi0gIFRJTEVHWF9PUENfTk9SLAotICBUSUxFR1hfT1BDX09SLAotICBUSUxFR1hfT1BDX09SSSwKLSAgVElMRUdYX09QQ19QQ05ULAotICBUSUxFR1hfT1BDX1JFVkJJVFMsCi0gIFRJTEVHWF9PUENfUkVWQllURVMsCi0gIFRJTEVHWF9PUENfUk9UTCwKLSAgVElMRUdYX09QQ19ST1RMSSwKLSAgVElMRUdYX09QQ19TSEwsCi0gIFRJTEVHWF9PUENfU0hMMTZJTlNMSSwKLSAgVElMRUdYX09QQ19TSEwxQURELAotICBUSUxFR1hfT1BDX1NITDFBRERYLAotICBUSUxFR1hfT1BDX1NITDJBREQsCi0gIFRJTEVHWF9PUENfU0hMMkFERFgsCi0gIFRJTEVHWF9PUENfU0hMM0FERCwKLSAgVElMRUdYX09QQ19TSEwzQUREWCwKLSAgVElMRUdYX09QQ19TSExJLAotICBUSUxFR1hfT1BDX1NITFgsCi0gIFRJTEVHWF9PUENfU0hMWEksCi0gIFRJTEVHWF9PUENfU0hSUywKLSAgVElMRUdYX09QQ19TSFJTSSwKLSAgVElMRUdYX09QQ19TSFJVLAotICBUSUxFR1hfT1BDX1NIUlVJLAotICBUSUxFR1hfT1BDX1NIUlVYLAotICBUSUxFR1hfT1BDX1NIUlVYSSwKLSAgVElMRUdYX09QQ19TSFVGRkxFQllURVMsCi0gIFRJTEVHWF9PUENfU1QsCi0gIFRJTEVHWF9PUENfU1QxLAotICBUSUxFR1hfT1BDX1NUMV9BREQsCi0gIFRJTEVHWF9PUENfU1QyLAotICBUSUxFR1hfT1BDX1NUMl9BREQsCi0gIFRJTEVHWF9PUENfU1Q0LAotICBUSUxFR1hfT1BDX1NUNF9BREQsCi0gIFRJTEVHWF9PUENfU1RfQURELAotICBUSUxFR1hfT1BDX1NUTlQsCi0gIFRJTEVHWF9PUENfU1ROVDEsCi0gIFRJTEVHWF9PUENfU1ROVDFfQURELAotICBUSUxFR1hfT1BDX1NUTlQyLAotICBUSUxFR1hfT1BDX1NUTlQyX0FERCwKLSAgVElMRUdYX09QQ19TVE5UNCwKLSAgVElMRUdYX09QQ19TVE5UNF9BREQsCi0gIFRJTEVHWF9PUENfU1ROVF9BREQsCi0gIFRJTEVHWF9PUENfU1VCLAotICBUSUxFR1hfT1BDX1NVQlgsCi0gIFRJTEVHWF9PUENfU1VCWFNDLAotICBUSUxFR1hfT1BDX1NXSU5UMCwKLSAgVElMRUdYX09QQ19TV0lOVDEsCi0gIFRJTEVHWF9PUENfU1dJTlQyLAotICBUSUxFR1hfT1BDX1NXSU5UMywKLSAgVElMRUdYX09QQ19UQkxJRFhCMCwKLSAgVElMRUdYX09QQ19UQkxJRFhCMSwKLSAgVElMRUdYX09QQ19UQkxJRFhCMiwKLSAgVElMRUdYX09QQ19UQkxJRFhCMywKLSAgVElMRUdYX09QQ19WMUFERCwKLSAgVElMRUdYX09QQ19WMUFEREksCi0gIFRJTEVHWF9PUENfVjFBRERVQywKLSAgVElMRUdYX09QQ19WMUFESUZGVSwKLSAgVElMRUdYX09QQ19WMUFWR1UsCi0gIFRJTEVHWF9PUENfVjFDTVBFUSwKLSAgVElMRUdYX09QQ19WMUNNUEVRSSwKLSAgVElMRUdYX09QQ19WMUNNUExFUywKLSAgVElMRUdYX09QQ19WMUNNUExFVSwKLSAgVElMRUdYX09QQ19WMUNNUExUUywKLSAgVElMRUdYX09QQ19WMUNNUExUU0ksCi0gIFRJTEVHWF9PUENfVjFDTVBMVFUsCi0gIFRJTEVHWF9PUENfVjFDTVBMVFVJLAotICBUSUxFR1hfT1BDX1YxQ01QTkUsCi0gIFRJTEVHWF9PUENfVjFERE9UUFUsCi0gIFRJTEVHWF9PUENfVjFERE9UUFVBLAotICBUSUxFR1hfT1BDX1YxRERPVFBVUywKLSAgVElMRUdYX09QQ19WMURET1RQVVNBLAotICBUSUxFR1hfT1BDX1YxRE9UUCwKLSAgVElMRUdYX09QQ19WMURPVFBBLAotICBUSUxFR1hfT1BDX1YxRE9UUFUsCi0gIFRJTEVHWF9PUENfVjFET1RQVUEsCi0gIFRJTEVHWF9PUENfVjFET1RQVVMsCi0gIFRJTEVHWF9PUENfVjFET1RQVVNBLAotICBUSUxFR1hfT1BDX1YxSU5UX0gsCi0gIFRJTEVHWF9PUENfVjFJTlRfTCwKLSAgVElMRUdYX09QQ19WMU1BWFUsCi0gIFRJTEVHWF9PUENfVjFNQVhVSSwKLSAgVElMRUdYX09QQ19WMU1JTlUsCi0gIFRJTEVHWF9PUENfVjFNSU5VSSwKLSAgVElMRUdYX09QQ19WMU1OWiwKLSAgVElMRUdYX09QQ19WMU1VTFRVLAotICBUSUxFR1hfT1BDX1YxTVVMVSwKLSAgVElMRUdYX09QQ19WMU1VTFVTLAotICBUSUxFR1hfT1BDX1YxTVosCi0gIFRJTEVHWF9PUENfVjFTQURBVSwKLSAgVElMRUdYX09QQ19WMVNBRFUsCi0gIFRJTEVHWF9PUENfVjFTSEwsCi0gIFRJTEVHWF9PUENfVjFTSExJLAotICBUSUxFR1hfT1BDX1YxU0hSUywKLSAgVElMRUdYX09QQ19WMVNIUlNJLAotICBUSUxFR1hfT1BDX1YxU0hSVSwKLSAgVElMRUdYX09QQ19WMVNIUlVJLAotICBUSUxFR1hfT1BDX1YxU1VCLAotICBUSUxFR1hfT1BDX1YxU1VCVUMsCi0gIFRJTEVHWF9PUENfVjJBREQsCi0gIFRJTEVHWF9PUENfVjJBRERJLAotICBUSUxFR1hfT1BDX1YyQUREU0MsCi0gIFRJTEVHWF9PUENfVjJBRElGRlMsCi0gIFRJTEVHWF9PUENfVjJBVkdTLAotICBUSUxFR1hfT1BDX1YyQ01QRVEsCi0gIFRJTEVHWF9PUENfVjJDTVBFUUksCi0gIFRJTEVHWF9PUENfVjJDTVBMRVMsCi0gIFRJTEVHWF9PUENfVjJDTVBMRVUsCi0gIFRJTEVHWF9PUENfVjJDTVBMVFMsCi0gIFRJTEVHWF9PUENfVjJDTVBMVFNJLAotICBUSUxFR1hfT1BDX1YyQ01QTFRVLAotICBUSUxFR1hfT1BDX1YyQ01QTFRVSSwKLSAgVElMRUdYX09QQ19WMkNNUE5FLAotICBUSUxFR1hfT1BDX1YyRE9UUCwKLSAgVElMRUdYX09QQ19WMkRPVFBBLAotICBUSUxFR1hfT1BDX1YySU5UX0gsCi0gIFRJTEVHWF9PUENfVjJJTlRfTCwKLSAgVElMRUdYX09QQ19WMk1BWFMsCi0gIFRJTEVHWF9PUENfVjJNQVhTSSwKLSAgVElMRUdYX09QQ19WMk1JTlMsCi0gIFRJTEVHWF9PUENfVjJNSU5TSSwKLSAgVElMRUdYX09QQ19WMk1OWiwKLSAgVElMRUdYX09QQ19WMk1VTEZTQywKLSAgVElMRUdYX09QQ19WMk1VTFMsCi0gIFRJTEVHWF9PUENfVjJNVUxUUywKLSAgVElMRUdYX09QQ19WMk1aLAotICBUSUxFR1hfT1BDX1YyUEFDS0gsCi0gIFRJTEVHWF9PUENfVjJQQUNLTCwKLSAgVElMRUdYX09QQ19WMlBBQ0tVQywKLSAgVElMRUdYX09QQ19WMlNBREFTLAotICBUSUxFR1hfT1BDX1YyU0FEQVUsCi0gIFRJTEVHWF9PUENfVjJTQURTLAotICBUSUxFR1hfT1BDX1YyU0FEVSwKLSAgVElMRUdYX09QQ19WMlNITCwKLSAgVElMRUdYX09QQ19WMlNITEksCi0gIFRJTEVHWF9PUENfVjJTSExTQywKLSAgVElMRUdYX09QQ19WMlNIUlMsCi0gIFRJTEVHWF9PUENfVjJTSFJTSSwKLSAgVElMRUdYX09QQ19WMlNIUlUsCi0gIFRJTEVHWF9PUENfVjJTSFJVSSwKLSAgVElMRUdYX09QQ19WMlNVQiwKLSAgVElMRUdYX09QQ19WMlNVQlNDLAotICBUSUxFR1hfT1BDX1Y0QURELAotICBUSUxFR1hfT1BDX1Y0QUREU0MsCi0gIFRJTEVHWF9PUENfVjRJTlRfSCwKLSAgVElMRUdYX09QQ19WNElOVF9MLAotICBUSUxFR1hfT1BDX1Y0UEFDS1NDLAotICBUSUxFR1hfT1BDX1Y0U0hMLAotICBUSUxFR1hfT1BDX1Y0U0hMU0MsCi0gIFRJTEVHWF9PUENfVjRTSFJTLAotICBUSUxFR1hfT1BDX1Y0U0hSVSwKLSAgVElMRUdYX09QQ19WNFNVQiwKLSAgVElMRUdYX09QQ19WNFNVQlNDLAotICBUSUxFR1hfT1BDX1dINjQsCi0gIFRJTEVHWF9PUENfWE9SLAotICBUSUxFR1hfT1BDX1hPUkksCi0gIFRJTEVHWF9PUENfTk9ORQotfSB0aWxlZ3hfbW5lbW9uaWM7Ci0KLS8qIDY0LWJpdCBwYXR0ZXJuIGZvciBhIHsgYnB0IDsgbm9wIH0gYnVuZGxlLiAqLwotI2RlZmluZSBUSUxFR1hfQlBUX0JVTkRMRSAweDI4NmE0NGFlNTE0ODUwMDBVTEwKLQotCi0jZGVmaW5lIFRJTEVfRUxGX01BQ0hJTkVfQ09ERSBFTV9USUxFNjQKLQotI2RlZmluZSBUSUxFX0VMRl9OQU1FICJlbGYzMi10aWxlNjQiCi0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0JGRW5kX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0JGT3Bjb2RlRXh0ZW5zaW9uX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDI0KSkgJiAweGYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfQkZTdGFydF9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxOCkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Cck9mZl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgwMDAwMDAzZikgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDAwMDFmZmMwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0JyVHlwZV9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1NCkpICYgMHgxZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X0ltbThfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDAwMDAwM2YpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgwMDAwMDBjMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfRGVzdF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfRGVzdF9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9JbW0xNl9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHhmZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbTE2X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweGZmZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOE9wY29kZUV4dGVuc2lvbl9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyMCkpICYgMHhmZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9JbW04T3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDUxKSkgJiAweGZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbThfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHhmZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9JbW04X1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweGZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbThfWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSnVtcE9mZl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHg3ZmZmZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0p1bXBPcGNvZGVFeHRlbnNpb25fWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTgpKSAmIDB4MSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9NRl9JbW0xNF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X01UX0ltbTE0X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDAwMDAwMDNmKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4MDAwMDNmYzApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfTW9kZSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA2MikpICYgMHgzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyOCkpICYgMHg3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1OSkpICYgMHg3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyNykpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1OCkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9ZMih0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKG4gPj4gMjYpKSAmIDB4MDAwMDAwMDEpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA1NikpICYgMHgwMDAwMDAwMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9SUlJPcGNvZGVFeHRlbnNpb25fWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4M2ZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OSkpICYgMHgzZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfUlJST3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDE4KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfUlJST3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hpZnRPcGNvZGVFeHRlbnNpb25fWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4M2ZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDNmZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TaGlmdE9wY29kZUV4dGVuc2lvbl9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxOCkpICYgMHgzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQV9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiA2KSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0FfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQV9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiA2KSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0FfWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQV9ZMih0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyMCkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCRGVzdF9ZMih0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1MSkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0JfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQl9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDNmKTsKLX0KLQotCi1zdGF0aWMgX19pbmxpbmUgaW50Ci1zaWduX2V4dGVuZChpbnQgbiwgaW50IG51bV9iaXRzKQotewotICBpbnQgc2hpZnQgPSAoaW50KShzaXplb2YoaW50KSAqIDggLSBudW1fYml0cyk7Ci0gIHJldHVybiAobiA8PCBzaGlmdCkgPj4gc2hpZnQ7Ci19Ci0KLQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfQkZFbmRfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0JGT3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweGYpIDw8IDI0KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0JGU3RhcnRfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDE4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0JyT2ZmX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAwMDNmKSkgPDwgMzEpIHwKLSAgICAgICAgICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMWZmYzApKSA8PCAzNyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9CclR5cGVfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MWYpKSA8PCA1NCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X0ltbThfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAotICAgICAgICAgKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDBjMCkpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0Rlc3RfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfRGVzdF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0Rlc3RfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfRGVzdF9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0ltbTE2X1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweGZmZmYpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0ltbTE2X1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweGZmZmYpKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW04T3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweGZmKSA8PCAyMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW04T3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweGZmKSkgPDwgNTEpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tOF9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmZikgPDwgMTIpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tOF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHhmZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0ltbThfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0ltbThfWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4ZmYpKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9KdW1wT2ZmX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDdmZmZmZmYpKSA8PCAzMSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9KdW1wT3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDEpKSA8PCA1OCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9NRl9JbW0xNF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZmZmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfTVRfSW1tMTRfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAotICAgICAgICAgKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwM2ZjMCkpIDw8IDM3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX01vZGUoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MykpIDw8IDYyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHg3KSA8PCAyOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9PcGNvZGVfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4NykpIDw8IDU5KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmKSA8PCAyNyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9PcGNvZGVfWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4ZikpIDw8IDU4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9ZMihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgwMDAwMDAwMSkgPDwgMjYpIHwKLSAgICAgICAgICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwMDIpKSA8PCA1Nik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAxOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2ZmKSkgPDwgNDkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDMpIDw8IDE4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzKSkgPDwgNDkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hBbXRfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1NoQW10X1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hBbXRfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1NoQW10X1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hpZnRPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAxOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TaGlmdE9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZmYpKSA8PCA0OSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TaGlmdE9wY29kZUV4dGVuc2lvbl9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzKSA8PCAxOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TaGlmdE9wY29kZUV4dGVuc2lvbl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzKSkgPDwgNDkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQV9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgNik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNBX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQV9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgNik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNBX1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQV9ZMihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgMjApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQkRlc3RfWTIoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA1MSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQl9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9VbmFyeU9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9VbmFyeU9wY29kZUV4dGVuc2lvbl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDQzKTsKLX0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgVElMRUdYX1BJUEVMSU5FX1gwLAotICBUSUxFR1hfUElQRUxJTkVfWDEsCi0gIFRJTEVHWF9QSVBFTElORV9ZMCwKLSAgVElMRUdYX1BJUEVMSU5FX1kxLAotICBUSUxFR1hfUElQRUxJTkVfWTIsCi19IHRpbGVneF9waXBlbGluZTsKLQotI2RlZmluZSB0aWxlZ3hfaXNfeF9waXBlbGluZShwKSAoKGludCkocCkgPD0gKGludClUSUxFR1hfUElQRUxJTkVfWDEpCi0KLXR5cGVkZWYgZW51bQotewotICBUSUxFR1hfT1BfVFlQRV9SRUdJU1RFUiwKLSAgVElMRUdYX09QX1RZUEVfSU1NRURJQVRFLAotICBUSUxFR1hfT1BfVFlQRV9BRERSRVNTLAotICBUSUxFR1hfT1BfVFlQRV9TUFIKLX0gdGlsZWd4X29wZXJhbmRfdHlwZTsKLQotLyogVGhlc2UgYXJlIHRoZSBiaXRzIHRoYXQgZGV0ZXJtaW5lIGlmIGEgYnVuZGxlIGlzIGluIHRoZSBYIGVuY29kaW5nLiAqLwotI2RlZmluZSBUSUxFR1hfQlVORExFX01PREVfTUFTSyAoKHRpbGVneF9idW5kbGVfYml0cykzIDw8IDYyKQotCi1lbnVtCi17Ci0gIC8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiBhIGJ1bmRsZSAoMiBmb3IgWCwgMyBmb3IgWSkuICovCi0gIFRJTEVHWF9NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEUgPSAzLAotCi0gIC8qIEhvdyBtYW55IGRpZmZlcmVudCBwaXBlbGluZSBlbmNvZGluZ3MgYXJlIHRoZXJlPyBYMCwgWDEsIFkwLCBZMSwgWTIuICovCi0gIFRJTEVHWF9OVU1fUElQRUxJTkVfRU5DT0RJTkdTID0gNSwKLQotICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVHWF9CVU5ETEVfU0laRV9JTl9CWVRFUy4gKi8KLSAgVElMRUdYX0xPRzJfQlVORExFX1NJWkVfSU5fQllURVMgPSAzLAotCi0gIC8qIEluc3RydWN0aW9ucyB0YWtlIHRoaXMgbWFueSBieXRlcy4gKi8KLSAgVElMRUdYX0JVTkRMRV9TSVpFX0lOX0JZVEVTID0gMSA8PCBUSUxFR1hfTE9HMl9CVU5ETEVfU0laRV9JTl9CWVRFUywKLQotICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVHWF9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTLiAqLwotICBUSUxFR1hfTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTID0gMywKLQotICAvKiBCdW5kbGVzIHNob3VsZCBiZSBhbGlnbmVkIG1vZHVsbyB0aGlzIG51bWJlciBvZiBieXRlcy4gKi8KLSAgVElMRUdYX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgPQotICAgICgxIDw8IFRJTEVHWF9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMpLAotCi0gIC8qIE51bWJlciBvZiByZWdpc3RlcnMgKHNvbWUgYXJlIG1hZ2ljLCBzdWNoIGFzIG5ldHdvcmsgSS9PKS4gKi8KLSAgVElMRUdYX05VTV9SRUdJU1RFUlMgPSA2NCwKLX07Ci0KLQotc3RydWN0IHRpbGVneF9vcGVyYW5kCi17Ci0gIC8qIElzIHRoaXMgb3BlcmFuZCBhIHJlZ2lzdGVyLCBpbW1lZGlhdGUgb3IgYWRkcmVzcz8gKi8KLSAgdGlsZWd4X29wZXJhbmRfdHlwZSB0eXBlOwotCi0gIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBmb3IgdGhpcyBvcGVyYW5kLiAgKi8KLSAgc2lnbmVkIGludCBkZWZhdWx0X3JlbG9jIDogMTY7Ci0KLSAgLyogSG93IG1hbnkgYml0cyBpcyB0aGlzIHZhbHVlPyAodXNlZCBmb3IgcmFuZ2UgY2hlY2tpbmcpICovCi0gIHVuc2lnbmVkIGludCBudW1fYml0cyA6IDU7Ci0KLSAgLyogSXMgdGhlIHZhbHVlIHNpZ25lZD8gKHVzZWQgZm9yIHJhbmdlIGNoZWNraW5nKSAqLwotICB1bnNpZ25lZCBpbnQgaXNfc2lnbmVkIDogMTsKLQotICAvKiBJcyB0aGlzIG9wZXJhbmQgYSBzb3VyY2UgcmVnaXN0ZXI/ICovCi0gIHVuc2lnbmVkIGludCBpc19zcmNfcmVnIDogMTsKLQotICAvKiBJcyB0aGlzIG9wZXJhbmQgd3JpdHRlbj8gKGkuZS4gaXMgaXQgYSBkZXN0aW5hdGlvbiByZWdpc3RlcikgKi8KLSAgdW5zaWduZWQgaW50IGlzX2Rlc3RfcmVnIDogMTsKLQotICAvKiBJcyB0aGlzIG9wZXJhbmQgUEMtcmVsYXRpdmU/ICovCi0gIHVuc2lnbmVkIGludCBpc19wY19yZWxhdGl2ZSA6IDE7Ci0KLSAgLyogQnkgaG93IG1hbnkgYml0cyBkbyB3ZSByaWdodCBzaGlmdCB0aGUgdmFsdWUgYmVmb3JlIGluc2VydGluZz8gKi8KLSAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQgOiAyOwotCi0gIC8qIFJldHVybiB0aGUgYml0cyBmb3IgdGhpcyBvcGVyYW5kIHRvIGJlIE9SZWQgaW50byBhbiBleGlzdGluZyBidW5kbGUuICovCi0gIHRpbGVneF9idW5kbGVfYml0cyAoKmluc2VydCkgKGludCBvcCk7Ci0KLSAgLyogRXh0cmFjdCB0aGlzIG9wZXJhbmQgYW5kIHJldHVybiBpdC4gKi8KLSAgdW5zaWduZWQgaW50ICgqZXh0cmFjdCkgKHRpbGVneF9idW5kbGVfYml0cyBidW5kbGUpOwotfTsKLQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHRpbGVneF9vcGVyYW5kIHRpbGVneF9vcGVyYW5kc1tdOwotCi0vKiBPbmUgZmluaXRlLXN0YXRlIG1hY2hpbmUgcGVyIHBpcGUgZm9yIHJhcGlkIGluc3RydWN0aW9uIGRlY29kaW5nLiAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0ICogY29uc3QKLXRpbGVneF9idW5kbGVfZGVjb2Rlcl9mc21zW1RJTEVHWF9OVU1fUElQRUxJTkVfRU5DT0RJTkdTXTsKLQotCi1zdHJ1Y3QgdGlsZWd4X29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG1uZW1vbmljLCBlLmcuICJhZGQiICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIGVudW0gdmFsdWUgZm9yIHRoaXMgbW5lbW9uaWMuICovCi0gIHRpbGVneF9tbmVtb25pYyBtbmVtb25pYzsKLQotICAvKiBBIGJpdCBtYXNrIG9mIHdoaWNoIG9mIHRoZSBmaXZlIHBpcGVzIHRoaXMgaW5zdHJ1Y3Rpb24KLSAgICAgaXMgY29tcGF0aWJsZSB3aXRoOgotICAgICBYMCAgMHgwMQotICAgICBYMSAgMHgwMgotICAgICBZMCAgMHgwNAotICAgICBZMSAgMHgwOAotICAgICBZMiAgMHgxMCAqLwotICB1bnNpZ25lZCBjaGFyIHBpcGVzOwotCi0gIC8qIEhvdyBtYW55IG9wZXJhbmRzIGFyZSB0aGVyZT8gKi8KLSAgdW5zaWduZWQgY2hhciBudW1fb3BlcmFuZHM7Ci0KLSAgLyogV2hpY2ggcmVnaXN0ZXIgZG9lcyB0aGlzIHdyaXRlIGltcGxpY2l0bHksIG9yIFRSRUdfWkVSTyBpZiBub25lPyAqLwotICB1bnNpZ25lZCBjaGFyIGltcGxpY2l0bHlfd3JpdHRlbl9yZWdpc3RlcjsKLQotICAvKiBDYW4gdGhpcyBiZSBidW5kbGVkIHdpdGggb3RoZXIgaW5zdHJ1Y3Rpb25zIChhbG1vc3QgYWx3YXlzIHRydWUpLiAqLwotICB1bnNpZ25lZCBjaGFyIGNhbl9idW5kbGU7Ci0KLSAgLyogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBvcGVyYW5kcy4gRWFjaCBvZiB0aGVzZSBpcyBhbgotICAgKiBpbmRleCBpbnRvIHRoZSB0aWxlZ3hfb3BlcmFuZHNbXSB0YWJsZS4gKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1tUSUxFR1hfTlVNX1BJUEVMSU5FX0VOQ09ESU5HU11bVElMRUdYX01BWF9PUEVSQU5EU107Ci0KLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGlsZWd4X29wY29kZSB0aWxlZ3hfb3Bjb2Rlc1tdOwotCi0vKiBVc2VkIGZvciBub24tdGV4dHVhbCBkaXNhc3NlbWJseSBpbnRvIHN0cnVjdHMuICovCi1zdHJ1Y3QgdGlsZWd4X2RlY29kZWRfaW5zdHJ1Y3Rpb24KLXsKLSAgY29uc3Qgc3RydWN0IHRpbGVneF9vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHRpbGVneF9vcGVyYW5kICpvcGVyYW5kc1tUSUxFR1hfTUFYX09QRVJBTkRTXTsKLSAgbG9uZyBsb25nIG9wZXJhbmRfdmFsdWVzW1RJTEVHWF9NQVhfT1BFUkFORFNdOwotfTsKLQotCi0vKiBEaXNhc3NlbWJsZSBhIGJ1bmRsZSBpbnRvIGEgc3RydWN0IGZvciBtYWNoaW5lIHByb2Nlc3NpbmcuICovCi1leHRlcm4gaW50IHBhcnNlX2luc25fdGlsZWd4KHRpbGVneF9idW5kbGVfYml0cyBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aWxlZ3hfZGVjb2RlZF9pbnN0cnVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkW1RJTEVHWF9NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEVdKTsKLQotCi0KLSNlbmRpZiAvKiBvcGNvZGVfdGlsZWd4X2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGVfY29uc3RhbnRzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2E5ZjI5Li4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGVfY29uc3RhbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTAgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqICAgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX0FTTV9USUxFX09QQ09ERV9DT05TVEFOVFNfSAotI2RlZmluZSBfQVNNX1RJTEVfT1BDT0RFX0NPTlNUQU5UU19ICi0KLSNpbmNsdWRlIDxhcmNoL2NoaXAuaD4KLQotI2lmIENISVBfV09SRF9TSVpFKCkgPT0gNjQKLSNpbmNsdWRlIDxhc20vb3Bjb2RlX2NvbnN0YW50c182NC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20vb3Bjb2RlX2NvbnN0YW50c18zMi5oPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQVNNX1RJTEVfT1BDT0RFX0NPTlNUQU5UU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50c18zMi5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZV9jb25zdGFudHNfMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3ZDAzMy4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50c18zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMCBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogICBtb3JlIGRldGFpbHMuCi0gKi8KLQotLyogVGhpcyBmaWxlIGlzIG1hY2hpbmUtZ2VuZXJhdGVkOyBETyBOT1QgRURJVCEgKi8KLQotCi0jaWZuZGVmIF9USUxFX09QQ09ERV9DT05TVEFOVFNfSAotI2RlZmluZSBfVElMRV9PUENPREVfQ09OU1RBTlRTX0gKLWVudW0KLXsKLSAgQUREQlNfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTgsCi0gIEFEREJTX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY4LAotICBBRERCX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxLAotICBBRERCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxLAotICBBRERIU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTksCi0gIEFEREhTX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2OSwKLSAgQURESF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMiwKLSAgQURESF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMiwKLSAgQURESUJfSU1NXzBfT1BDT0RFX1gwID0gMSwKLSAgQURESUJfSU1NXzBfT1BDT0RFX1gxID0gMSwKLSAgQURESUhfSU1NXzBfT1BDT0RFX1gwID0gMiwKLSAgQURESUhfSU1NXzBfT1BDT0RFX1gxID0gMiwKLSAgQURESV9JTU1fMF9PUENPREVfWDAgPSAzLAotICBBRERJX0lNTV8wX09QQ09ERV9YMSA9IDMsCi0gIEFERElfSU1NXzFfT1BDT0RFX1NOID0gMSwKLSAgQURESV9PUENPREVfWTAgPSA5LAotICBBRERJX09QQ09ERV9ZMSA9IDcsCi0gIEFERExJU19PUENPREVfWDAgPSAxLAotICBBRERMSVNfT1BDT0RFX1gxID0gMiwKLSAgQURETElfT1BDT0RFX1gwID0gMiwKLSAgQURETElfT1BDT0RFX1gxID0gMywKLSAgQUREU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTYsCi0gIEFERFNfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY2LAotICBBRERfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDMsCi0gIEFERF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMywKLSAgQUREX1NQRUNJQUxfMF9PUENPREVfWTAgPSAwLAotICBBRERfU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDAsCi0gIEFESUZGQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0LAotICBBRElGRkhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDUsCi0gIEFORElfSU1NXzBfT1BDT0RFX1gwID0gMSwKLSAgQU5ESV9JTU1fMF9PUENPREVfWDEgPSA0LAotICBBTkRJX09QQ09ERV9ZMCA9IDEwLAotICBBTkRJX09QQ09ERV9ZMSA9IDgsCi0gIEFORF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNiwKLSAgQU5EX1NQRUNJQUxfMF9PUENPREVfWDEgPSA0LAotICBBTkRfU1BFQ0lBTF8yX09QQ09ERV9ZMCA9IDAsCi0gIEFORF9TUEVDSUFMXzJfT1BDT0RFX1kxID0gMCwKLSAgQVVMSV9PUENPREVfWDAgPSAzLAotICBBVUxJX09QQ09ERV9YMSA9IDQsCi0gIEFWR0JfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNywKLSAgQVZHSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOCwKLSAgQkJOU1RfQlJBTkNIX09QQ09ERV9YMSA9IDE1LAotICBCQk5TX0JSQU5DSF9PUENPREVfWDEgPSAxNCwKLSAgQkJOU19PUENPREVfU04gPSA2MywKLSAgQkJTVF9CUkFOQ0hfT1BDT0RFX1gxID0gMTMsCi0gIEJCU19CUkFOQ0hfT1BDT0RFX1gxID0gMTIsCi0gIEJCU19PUENPREVfU04gPSA2MiwKLSAgQkdFWlRfQlJBTkNIX09QQ09ERV9YMSA9IDcsCi0gIEJHRVpfQlJBTkNIX09QQ09ERV9YMSA9IDYsCi0gIEJHRVpfT1BDT0RFX1NOID0gNjEsCi0gIEJHWlRfQlJBTkNIX09QQ09ERV9YMSA9IDUsCi0gIEJHWl9CUkFOQ0hfT1BDT0RFX1gxID0gNCwKLSAgQkdaX09QQ09ERV9TTiA9IDU4LAotICBCSVRYX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDEsCi0gIEJJVFhfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gMSwKLSAgQkxFWlRfQlJBTkNIX09QQ09ERV9YMSA9IDExLAotICBCTEVaX0JSQU5DSF9PUENPREVfWDEgPSAxMCwKLSAgQkxFWl9PUENPREVfU04gPSA1OSwKLSAgQkxaVF9CUkFOQ0hfT1BDT0RFX1gxID0gOSwKLSAgQkxaX0JSQU5DSF9PUENPREVfWDEgPSA4LAotICBCTFpfT1BDT0RFX1NOID0gNjAsCi0gIEJOWlRfQlJBTkNIX09QQ09ERV9YMSA9IDMsCi0gIEJOWl9CUkFOQ0hfT1BDT0RFX1gxID0gMiwKLSAgQk5aX09QQ09ERV9TTiA9IDU3LAotICBCUFRfTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMSwKLSAgQlJBTkNIX09QQ09ERV9YMSA9IDUsCi0gIEJZVEVYX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDIsCi0gIEJZVEVYX1VOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDIsCi0gIEJaVF9CUkFOQ0hfT1BDT0RFX1gxID0gMSwKLSAgQlpfQlJBTkNIX09QQ09ERV9YMSA9IDAsCi0gIEJaX09QQ09ERV9TTiA9IDU2LAotICBDTFpfVU5fMF9TSFVOXzBfT1BDT0RFX1gwID0gMywKLSAgQ0xaX1VOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDMsCi0gIENSQzMyXzMyX1NQRUNJQUxfMF9PUENPREVfWDAgPSA5LAotICBDUkMzMl84X1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMCwKLSAgQ1RaX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDQsCi0gIENUWl9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA0LAotICBEUkFJTl9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxLAotICBEVExCUFJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMiwKLSAgRFdPUkRfQUxJR05fU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDk1LAotICBGSU5WX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDMsCi0gIEZMVVNIX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDQsCi0gIEZOT1BfTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMywKLSAgRk5PUF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA1LAotICBGTk9QX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDUsCi0gIEZOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gNSwKLSAgRk5PUF9VTl8wX1NIVU5fMF9PUENPREVfWTEgPSAxLAotICBIQUxUX05PUkVHX1JSX0lNTV8wX09QQ09ERV9TTiA9IDAsCi0gIElDT0hfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gNiwKLSAgSUxMX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDcsCi0gIElMTF9VTl8wX1NIVU5fMF9PUENPREVfWTEgPSAyLAotICBJTU1fMF9PUENPREVfU04gPSAwLAotICBJTU1fMF9PUENPREVfWDAgPSA0LAotICBJTU1fMF9PUENPREVfWDEgPSA2LAotICBJTU1fMV9PUENPREVfU04gPSAxLAotICBJTU1fT1BDT0RFXzBfWDAgPSA1LAotICBJTlRIQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTEsCi0gIElOVEhCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1LAotICBJTlRISF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTIsCi0gIElOVEhIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2LAotICBJTlRMQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTMsCi0gIElOVExCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3LAotICBJTlRMSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTQsCi0gIElOVExIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA4LAotICBJTlZfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gOCwKLSAgSVJFVF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSA5LAotICBKQUxCX09QQ09ERV9YMSA9IDEzLAotICBKQUxGX09QQ09ERV9YMSA9IDEyLAotICBKQUxSUF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gOSwKLSAgSkFMUlJfSU1NXzFfT1BDT0RFX1NOID0gMywKLSAgSkFMUl9SUl9JTU1fMF9PUENPREVfU04gPSA1LAotICBKQUxSX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxMCwKLSAgSkJfT1BDT0RFX1gxID0gMTEsCi0gIEpGX09QQ09ERV9YMSA9IDEwLAotICBKUlBfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDExLAotICBKUlJfSU1NXzFfT1BDT0RFX1NOID0gMiwKLSAgSlJfUlJfSU1NXzBfT1BDT0RFX1NOID0gNCwKLSAgSlJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDEyLAotICBMQkFERF9JTU1fMF9PUENPREVfWDEgPSAyMiwKLSAgTEJBRERfVV9JTU1fMF9PUENPREVfWDEgPSAyMywKLSAgTEJfT1BDT0RFX1kyID0gMCwKLSAgTEJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTAsCi0gIExCX1VfT1BDT0RFX1kyID0gMSwKLSAgTEJfVV9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxMSwKLSAgTEhBRERfSU1NXzBfT1BDT0RFX1gxID0gMjQsCi0gIExIQUREX1VfSU1NXzBfT1BDT0RFX1gxID0gMjUsCi0gIExIX09QQ09ERV9ZMiA9IDIsCi0gIExIX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDEyLAotICBMSF9VX09QQ09ERV9ZMiA9IDMsCi0gIExIX1VfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTMsCi0gIExOS19TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTMsCi0gIExXQUREX0lNTV8wX09QQ09ERV9YMSA9IDI2LAotICBMV0FERF9OQV9JTU1fMF9PUENPREVfWDEgPSAyNywKLSAgTFdfTkFfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjQsCi0gIExXX09QQ09ERV9ZMiA9IDQsCi0gIExXX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDE0LAotICBNQVhCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDE1LAotICBNQVhCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE0LAotICBNQVhIX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxNiwKLSAgTUFYSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTUsCi0gIE1BWElCX1VfSU1NXzBfT1BDT0RFX1gwID0gNCwKLSAgTUFYSUJfVV9JTU1fMF9PUENPREVfWDEgPSA1LAotICBNQVhJSF9JTU1fMF9PUENPREVfWDAgPSA1LAotICBNQVhJSF9JTU1fMF9PUENPREVfWDEgPSA2LAotICBNRlNQUl9JTU1fMF9PUENPREVfWDEgPSA3LAotICBNRl9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxNSwKLSAgTUlOQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxNywKLSAgTUlOQl9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxNiwKLSAgTUlOSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTgsCi0gIE1JTkhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE3LAotICBNSU5JQl9VX0lNTV8wX09QQ09ERV9YMCA9IDYsCi0gIE1JTklCX1VfSU1NXzBfT1BDT0RFX1gxID0gOCwKLSAgTUlOSUhfSU1NXzBfT1BDT0RFX1gwID0gNywKLSAgTUlOSUhfSU1NXzBfT1BDT0RFX1gxID0gOSwKLSAgTU1fT1BDT0RFX1gwID0gNiwKLSAgTU1fT1BDT0RFX1gxID0gNywKLSAgTU5aQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTksCi0gIE1OWkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE4LAotICBNTlpIX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyMCwKLSAgTU5aSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTksCi0gIE1OWl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjEsCi0gIE1OWl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjAsCi0gIE1OWl9TUEVDSUFMXzFfT1BDT0RFX1kwID0gMCwKLSAgTU5aX1NQRUNJQUxfMV9PUENPREVfWTEgPSAxLAotICBNT1ZFSV9JTU1fMV9PUENPREVfU04gPSAwLAotICBNT1ZFX1JSX0lNTV8wX09QQ09ERV9TTiA9IDgsCi0gIE1UU1BSX0lNTV8wX09QQ09ERV9YMSA9IDEwLAotICBNVUxISEFfU1NfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDIyLAotICBNVUxISEFfU1NfU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDAsCi0gIE1VTEhIQV9TVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjMsCi0gIE1VTEhIQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjQsCi0gIE1VTEhIQV9VVV9TUEVDSUFMXzdfT1BDT0RFX1kwID0gMSwKLSAgTVVMSEhTQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjUsCi0gIE1VTEhIX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyNiwKLSAgTVVMSEhfU1NfU1BFQ0lBTF82X09QQ09ERV9ZMCA9IDAsCi0gIE1VTEhIX1NVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyNywKLSAgTVVMSEhfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDI4LAotICBNVUxISF9VVV9TUEVDSUFMXzZfT1BDT0RFX1kwID0gMSwKLSAgTVVMSExBX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyOSwKLSAgTVVMSExBX1NVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMCwKLSAgTVVMSExBX1VTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMSwKLSAgTVVMSExBX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMiwKLSAgTVVMSExTQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMzMsCi0gIE1VTEhMU0FfVVVfU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDAsCi0gIE1VTEhMX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzNCwKLSAgTVVMSExfU1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDM1LAotICBNVUxITF9VU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gMzYsCi0gIE1VTEhMX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzNywKLSAgTVVMTExBX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzOCwKLSAgTVVMTExBX1NTX1NQRUNJQUxfN19PUENPREVfWTAgPSAyLAotICBNVUxMTEFfU1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDM5LAotICBNVUxMTEFfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQwLAotICBNVUxMTEFfVVVfU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDMsCi0gIE1VTExMU0FfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQxLAotICBNVUxMTF9TU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDIsCi0gIE1VTExMX1NTX1NQRUNJQUxfNl9PUENPREVfWTAgPSAyLAotICBNVUxMTF9TVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDMsCi0gIE1VTExMX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0NCwKLSAgTVVMTExfVVVfU1BFQ0lBTF82X09QQ09ERV9ZMCA9IDMsCi0gIE1WTlpfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQ1LAotICBNVk5aX1NQRUNJQUxfMV9PUENPREVfWTAgPSAxLAotICBNVlpfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQ2LAotICBNVlpfU1BFQ0lBTF8xX09QQ09ERV9ZMCA9IDIsCi0gIE1aQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDcsCi0gIE1aQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjEsCi0gIE1aSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDgsCi0gIE1aSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjIsCi0gIE1aX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0OSwKLSAgTVpfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDIzLAotICBNWl9TUEVDSUFMXzFfT1BDT0RFX1kwID0gMywKLSAgTVpfU1BFQ0lBTF8xX09QQ09ERV9ZMSA9IDIsCi0gIE5BUF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxNiwKLSAgTk9QX05PUkVHX1JSX0lNTV8wX09QQ09ERV9TTiA9IDIsCi0gIE5PUF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA2LAotICBOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTcsCi0gIE5PUF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA2LAotICBOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1kxID0gMywKLSAgTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMCwKLSAgTk9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MCwKLSAgTk9SX1NQRUNJQUxfMF9PUENPREVfWDEgPSAyNCwKLSAgTk9SX1NQRUNJQUxfMl9PUENPREVfWTAgPSAxLAotICBOT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDEsCi0gIE9SSV9JTU1fMF9PUENPREVfWDAgPSA4LAotICBPUklfSU1NXzBfT1BDT0RFX1gxID0gMTEsCi0gIE9SSV9PUENPREVfWTAgPSAxMSwKLSAgT1JJX09QQ09ERV9ZMSA9IDksCi0gIE9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MSwKLSAgT1JfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDI1LAotICBPUl9TUEVDSUFMXzJfT1BDT0RFX1kwID0gMiwKLSAgT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDIsCi0gIFBBQ0tCU19VX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMDMsCi0gIFBBQ0tCU19VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3MywKLSAgUEFDS0hCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MiwKLSAgUEFDS0hCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAyNiwKLSAgUEFDS0hTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMDIsCi0gIFBBQ0tIU19TUEVDSUFMXzBfT1BDT0RFX1gxID0gNzIsCi0gIFBBQ0tMQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTMsCi0gIFBBQ0tMQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjcsCi0gIFBDTlRfVU5fMF9TSFVOXzBfT1BDT0RFX1gwID0gNywKLSAgUENOVF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA3LAotICBSTElfU0hVTl8wX09QQ09ERV9YMCA9IDEsCi0gIFJMSV9TSFVOXzBfT1BDT0RFX1gxID0gMSwKLSAgUkxJX1NIVU5fMF9PUENPREVfWTAgPSAxLAotICBSTElfU0hVTl8wX09QQ09ERV9ZMSA9IDEsCi0gIFJMX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1NCwKLSAgUkxfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDI4LAotICBSTF9TUEVDSUFMXzNfT1BDT0RFX1kwID0gMCwKLSAgUkxfU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDAsCi0gIFJSX0lNTV8wX09QQ09ERV9TTiA9IDAsCi0gIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTUsCi0gIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjksCi0gIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1kwID0gMSwKLSAgUzFBX1NQRUNJQUxfMF9PUENPREVfWTEgPSAxLAotICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDU2LAotICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDMwLAotICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9ZMCA9IDIsCi0gIFMyQV9TUEVDSUFMXzBfT1BDT0RFX1kxID0gMiwKLSAgUzNBX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1NywKLSAgUzNBX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzMSwKLSAgUzNBX1NQRUNJQUxfNV9PUENPREVfWTAgPSAxLAotICBTM0FfU1BFQ0lBTF81X09QQ09ERV9ZMSA9IDEsCi0gIFNBREFCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDU4LAotICBTQURBSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTksCi0gIFNBREFIX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDYwLAotICBTQURCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDYxLAotICBTQURIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2MiwKLSAgU0FESF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2MywKLSAgU0JBRERfSU1NXzBfT1BDT0RFX1gxID0gMjgsCi0gIFNCX09QQ09ERV9ZMiA9IDUsCi0gIFNCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzMiwKLSAgU0VRQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjQsCi0gIFNFUUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDMzLAotICBTRVFIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2NSwKLSAgU0VRSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMzQsCi0gIFNFUUlCX0lNTV8wX09QQ09ERV9YMCA9IDksCi0gIFNFUUlCX0lNTV8wX09QQ09ERV9YMSA9IDEyLAotICBTRVFJSF9JTU1fMF9PUENPREVfWDAgPSAxMCwKLSAgU0VRSUhfSU1NXzBfT1BDT0RFX1gxID0gMTMsCi0gIFNFUUlfSU1NXzBfT1BDT0RFX1gwID0gMTEsCi0gIFNFUUlfSU1NXzBfT1BDT0RFX1gxID0gMTQsCi0gIFNFUUlfT1BDT0RFX1kwID0gMTIsCi0gIFNFUUlfT1BDT0RFX1kxID0gMTAsCi0gIFNFUV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjYsCi0gIFNFUV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMzUsCi0gIFNFUV9TUEVDSUFMXzVfT1BDT0RFX1kwID0gMiwKLSAgU0VRX1NQRUNJQUxfNV9PUENPREVfWTEgPSAyLAotICBTSEFERF9JTU1fMF9PUENPREVfWDEgPSAyOSwKLSAgU0hMOElJX0lNTV8wX09QQ09ERV9TTiA9IDMsCi0gIFNITEJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDY3LAotICBTSExCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzNiwKLSAgU0hMSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjgsCi0gIFNITEhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDM3LAotICBTSExJQl9TSFVOXzBfT1BDT0RFX1gwID0gMiwKLSAgU0hMSUJfU0hVTl8wX09QQ09ERV9YMSA9IDIsCi0gIFNITElIX1NIVU5fMF9PUENPREVfWDAgPSAzLAotICBTSExJSF9TSFVOXzBfT1BDT0RFX1gxID0gMywKLSAgU0hMSV9TSFVOXzBfT1BDT0RFX1gwID0gNCwKLSAgU0hMSV9TSFVOXzBfT1BDT0RFX1gxID0gNCwKLSAgU0hMSV9TSFVOXzBfT1BDT0RFX1kwID0gMiwKLSAgU0hMSV9TSFVOXzBfT1BDT0RFX1kxID0gMiwKLSAgU0hMX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2OSwKLSAgU0hMX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzOCwKLSAgU0hMX1NQRUNJQUxfM19PUENPREVfWTAgPSAxLAotICBTSExfU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDEsCi0gIFNIUjFfUlJfSU1NXzBfT1BDT0RFX1NOID0gOSwKLSAgU0hSQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNzAsCi0gIFNIUkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDM5LAotICBTSFJIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3MSwKLSAgU0hSSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDAsCi0gIFNIUklCX1NIVU5fMF9PUENPREVfWDAgPSA1LAotICBTSFJJQl9TSFVOXzBfT1BDT0RFX1gxID0gNSwKLSAgU0hSSUhfU0hVTl8wX09QQ09ERV9YMCA9IDYsCi0gIFNIUklIX1NIVU5fMF9PUENPREVfWDEgPSA2LAotICBTSFJJX1NIVU5fMF9PUENPREVfWDAgPSA3LAotICBTSFJJX1NIVU5fMF9PUENPREVfWDEgPSA3LAotICBTSFJJX1NIVU5fMF9PUENPREVfWTAgPSAzLAotICBTSFJJX1NIVU5fMF9PUENPREVfWTEgPSAzLAotICBTSFJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDcyLAotICBTSFJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQxLAotICBTSFJfU1BFQ0lBTF8zX09QQ09ERV9ZMCA9IDIsCi0gIFNIUl9TUEVDSUFMXzNfT1BDT0RFX1kxID0gMiwKLSAgU0hVTl8wX09QQ09ERV9YMCA9IDcsCi0gIFNIVU5fMF9PUENPREVfWDEgPSA4LAotICBTSFVOXzBfT1BDT0RFX1kwID0gMTMsCi0gIFNIVU5fMF9PUENPREVfWTEgPSAxMSwKLSAgU0hfT1BDT0RFX1kyID0gNiwKLSAgU0hfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQyLAotICBTTFRCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3MywKLSAgU0xUQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDMsCi0gIFNMVEJfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNzQsCi0gIFNMVEJfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDQsCi0gIFNMVEVCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NSwKLSAgU0xURUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQ1LAotICBTTFRFQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NiwKLSAgU0xURUJfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDYsCi0gIFNMVEVIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NywKLSAgU0xURUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQ3LAotICBTTFRFSF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3OCwKLSAgU0xURUhfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDgsCi0gIFNMVEVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDc5LAotICBTTFRFX1NQRUNJQUxfMF9PUENPREVfWDEgPSA0OSwKLSAgU0xURV9TUEVDSUFMXzRfT1BDT0RFX1kwID0gMCwKLSAgU0xURV9TUEVDSUFMXzRfT1BDT0RFX1kxID0gMCwKLSAgU0xURV9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MCwKLSAgU0xURV9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MCwKLSAgU0xURV9VX1NQRUNJQUxfNF9PUENPREVfWTAgPSAxLAotICBTTFRFX1VfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDEsCi0gIFNMVEhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDgxLAotICBTTFRIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MSwKLSAgU0xUSF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MiwKLSAgU0xUSF9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MiwKLSAgU0xUSUJfSU1NXzBfT1BDT0RFX1gwID0gMTIsCi0gIFNMVElCX0lNTV8wX09QQ09ERV9YMSA9IDE1LAotICBTTFRJQl9VX0lNTV8wX09QQ09ERV9YMCA9IDEzLAotICBTTFRJQl9VX0lNTV8wX09QQ09ERV9YMSA9IDE2LAotICBTTFRJSF9JTU1fMF9PUENPREVfWDAgPSAxNCwKLSAgU0xUSUhfSU1NXzBfT1BDT0RFX1gxID0gMTcsCi0gIFNMVElIX1VfSU1NXzBfT1BDT0RFX1gwID0gMTUsCi0gIFNMVElIX1VfSU1NXzBfT1BDT0RFX1gxID0gMTgsCi0gIFNMVElfSU1NXzBfT1BDT0RFX1gwID0gMTYsCi0gIFNMVElfSU1NXzBfT1BDT0RFX1gxID0gMTksCi0gIFNMVElfT1BDT0RFX1kwID0gMTQsCi0gIFNMVElfT1BDT0RFX1kxID0gMTIsCi0gIFNMVElfVV9JTU1fMF9PUENPREVfWDAgPSAxNywKLSAgU0xUSV9VX0lNTV8wX09QQ09ERV9YMSA9IDIwLAotICBTTFRJX1VfT1BDT0RFX1kwID0gMTUsCi0gIFNMVElfVV9PUENPREVfWTEgPSAxMywKLSAgU0xUX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MywKLSAgU0xUX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MywKLSAgU0xUX1NQRUNJQUxfNF9PUENPREVfWTAgPSAyLAotICBTTFRfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDIsCi0gIFNMVF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4NCwKLSAgU0xUX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU0LAotICBTTFRfVV9TUEVDSUFMXzRfT1BDT0RFX1kwID0gMywKLSAgU0xUX1VfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDMsCi0gIFNORUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg1LAotICBTTkVCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1NSwKLSAgU05FSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gODYsCi0gIFNORUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU2LAotICBTTkVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg3LAotICBTTkVfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU3LAotICBTTkVfU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDMsCi0gIFNORV9TUEVDSUFMXzVfT1BDT0RFX1kxID0gMywKLSAgU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDAsCi0gIFNQRUNJQUxfMF9PUENPREVfWDEgPSAxLAotICBTUEVDSUFMXzBfT1BDT0RFX1kwID0gMSwKLSAgU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDEsCi0gIFNQRUNJQUxfMV9PUENPREVfWTAgPSAyLAotICBTUEVDSUFMXzFfT1BDT0RFX1kxID0gMiwKLSAgU1BFQ0lBTF8yX09QQ09ERV9ZMCA9IDMsCi0gIFNQRUNJQUxfMl9PUENPREVfWTEgPSAzLAotICBTUEVDSUFMXzNfT1BDT0RFX1kwID0gNCwKLSAgU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDQsCi0gIFNQRUNJQUxfNF9PUENPREVfWTAgPSA1LAotICBTUEVDSUFMXzRfT1BDT0RFX1kxID0gNSwKLSAgU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDYsCi0gIFNQRUNJQUxfNV9PUENPREVfWTEgPSA2LAotICBTUEVDSUFMXzZfT1BDT0RFX1kwID0gNywKLSAgU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDgsCi0gIFNSQUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg4LAotICBTUkFCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1OCwKLSAgU1JBSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gODksCi0gIFNSQUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU5LAotICBTUkFJQl9TSFVOXzBfT1BDT0RFX1gwID0gOCwKLSAgU1JBSUJfU0hVTl8wX09QQ09ERV9YMSA9IDgsCi0gIFNSQUlIX1NIVU5fMF9PUENPREVfWDAgPSA5LAotICBTUkFJSF9TSFVOXzBfT1BDT0RFX1gxID0gOSwKLSAgU1JBSV9TSFVOXzBfT1BDT0RFX1gwID0gMTAsCi0gIFNSQUlfU0hVTl8wX09QQ09ERV9YMSA9IDEwLAotICBTUkFJX1NIVU5fMF9PUENPREVfWTAgPSA0LAotICBTUkFJX1NIVU5fMF9PUENPREVfWTEgPSA0LAotICBTUkFfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkwLAotICBTUkFfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYwLAotICBTUkFfU1BFQ0lBTF8zX09QQ09ERV9ZMCA9IDMsCi0gIFNSQV9TUEVDSUFMXzNfT1BDT0RFX1kxID0gMywKLSAgU1VCQlNfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTAwLAotICBTVUJCU19VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3MCwKLSAgU1VCQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTEsCi0gIFNVQkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYxLAotICBTVUJIU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTAxLAotICBTVUJIU19TUEVDSUFMXzBfT1BDT0RFX1gxID0gNzEsCi0gIFNVQkhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkyLAotICBTVUJIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2MiwKLSAgU1VCU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTcsCi0gIFNVQlNfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY3LAotICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkzLAotICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYzLAotICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9ZMCA9IDMsCi0gIFNVQl9TUEVDSUFMXzBfT1BDT0RFX1kxID0gMywKLSAgU1dBRERfSU1NXzBfT1BDT0RFX1gxID0gMzAsCi0gIFNXSU5UMF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxOCwKLSAgU1dJTlQxX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDE5LAotICBTV0lOVDJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjAsCi0gIFNXSU5UM19VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAyMSwKLSAgU1dfT1BDT0RFX1kyID0gNywKLSAgU1dfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY0LAotICBUQkxJRFhCMF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA4LAotICBUQkxJRFhCMF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA4LAotICBUQkxJRFhCMV9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA5LAotICBUQkxJRFhCMV9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA5LAotICBUQkxJRFhCMl9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSAxMCwKLSAgVEJMSURYQjJfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gMTAsCi0gIFRCTElEWEIzX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDExLAotICBUQkxJRFhCM19VTl8wX1NIVU5fMF9PUENPREVfWTAgPSAxMSwKLSAgVE5TX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDIyLAotICBVTl8wX1NIVU5fMF9PUENPREVfWDAgPSAxMSwKLSAgVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTEsCi0gIFVOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDUsCi0gIFVOXzBfU0hVTl8wX09QQ09ERV9ZMSA9IDUsCi0gIFdINjRfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjMsCi0gIFhPUklfSU1NXzBfT1BDT0RFX1gwID0gMiwKLSAgWE9SSV9JTU1fMF9PUENPREVfWDEgPSAyMSwKLSAgWE9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA5NCwKLSAgWE9SX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2NSwKLSAgWE9SX1NQRUNJQUxfMl9PUENPREVfWTAgPSAzLAotICBYT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDMKLX07Ci0KLSNlbmRpZiAvKiAhX1RJTEVfT1BDT0RFX0NPTlNUQU5UU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50c182NC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZV9jb25zdGFudHNfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwMTkyOC4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50c182NC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogICBtb3JlIGRldGFpbHMuCi0gKi8KLQotLyogVGhpcyBmaWxlIGlzIG1hY2hpbmUtZ2VuZXJhdGVkOyBETyBOT1QgRURJVCEgKi8KLQotCi0jaWZuZGVmIF9USUxFX09QQ09ERV9DT05TVEFOVFNfSAotI2RlZmluZSBfVElMRV9PUENPREVfQ09OU1RBTlRTX0gKLWVudW0KLXsKLSAgQURESV9JTU04X09QQ09ERV9YMCA9IDEsCi0gIEFERElfSU1NOF9PUENPREVfWDEgPSAxLAotICBBRERJX09QQ09ERV9ZMCA9IDAsCi0gIEFERElfT1BDT0RFX1kxID0gMSwKLSAgQURETElfT1BDT0RFX1gwID0gMSwKLSAgQURETElfT1BDT0RFX1gxID0gMCwKLSAgQUREWElfSU1NOF9PUENPREVfWDAgPSAyLAotICBBRERYSV9JTU04X09QQ09ERV9YMSA9IDIsCi0gIEFERFhJX09QQ09ERV9ZMCA9IDEsCi0gIEFERFhJX09QQ09ERV9ZMSA9IDIsCi0gIEFERFhMSV9PUENPREVfWDAgPSAyLAotICBBRERYTElfT1BDT0RFX1gxID0gMSwKLSAgQUREWFNDX1JSUl8wX09QQ09ERV9YMCA9IDEsCi0gIEFERFhTQ19SUlJfMF9PUENPREVfWDEgPSAxLAotICBBRERYX1JSUl8wX09QQ09ERV9YMCA9IDIsCi0gIEFERFhfUlJSXzBfT1BDT0RFX1gxID0gMiwKLSAgQUREWF9SUlJfMF9PUENPREVfWTAgPSAwLAotICBBRERYX1NQRUNJQUxfMF9PUENPREVfWTEgPSAwLAotICBBRERfUlJSXzBfT1BDT0RFX1gwID0gMywKLSAgQUREX1JSUl8wX09QQ09ERV9YMSA9IDMsCi0gIEFERF9SUlJfMF9PUENPREVfWTAgPSAxLAotICBBRERfU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDEsCi0gIEFORElfSU1NOF9PUENPREVfWDAgPSAzLAotICBBTkRJX0lNTThfT1BDT0RFX1gxID0gMywKLSAgQU5ESV9PUENPREVfWTAgPSAyLAotICBBTkRJX09QQ09ERV9ZMSA9IDMsCi0gIEFORF9SUlJfMF9PUENPREVfWDAgPSA0LAotICBBTkRfUlJSXzBfT1BDT0RFX1gxID0gNCwKLSAgQU5EX1JSUl81X09QQ09ERV9ZMCA9IDAsCi0gIEFORF9SUlJfNV9PUENPREVfWTEgPSAwLAotICBCRVFaVF9CUkFOQ0hfT1BDT0RFX1gxID0gMTYsCi0gIEJFUVpfQlJBTkNIX09QQ09ERV9YMSA9IDE3LAotICBCRkVYVFNfQkZfT1BDT0RFX1gwID0gNCwKLSAgQkZFWFRVX0JGX09QQ09ERV9YMCA9IDUsCi0gIEJGSU5TX0JGX09QQ09ERV9YMCA9IDYsCi0gIEJGX09QQ09ERV9YMCA9IDMsCi0gIEJHRVpUX0JSQU5DSF9PUENPREVfWDEgPSAxOCwKLSAgQkdFWl9CUkFOQ0hfT1BDT0RFX1gxID0gMTksCi0gIEJHVFpUX0JSQU5DSF9PUENPREVfWDEgPSAyMCwKLSAgQkdUWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjEsCi0gIEJMQkNUX0JSQU5DSF9PUENPREVfWDEgPSAyMiwKLSAgQkxCQ19CUkFOQ0hfT1BDT0RFX1gxID0gMjMsCi0gIEJMQlNUX0JSQU5DSF9PUENPREVfWDEgPSAyNCwKLSAgQkxCU19CUkFOQ0hfT1BDT0RFX1gxID0gMjUsCi0gIEJMRVpUX0JSQU5DSF9PUENPREVfWDEgPSAyNiwKLSAgQkxFWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjcsCi0gIEJMVFpUX0JSQU5DSF9PUENPREVfWDEgPSAyOCwKLSAgQkxUWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjksCi0gIEJORVpUX0JSQU5DSF9PUENPREVfWDEgPSAzMCwKLSAgQk5FWl9CUkFOQ0hfT1BDT0RFX1gxID0gMzEsCi0gIEJSQU5DSF9PUENPREVfWDEgPSAyLAotICBDTU9WRVFaX1JSUl8wX09QQ09ERV9YMCA9IDUsCi0gIENNT1ZFUVpfUlJSXzRfT1BDT0RFX1kwID0gMCwKLSAgQ01PVk5FWl9SUlJfMF9PUENPREVfWDAgPSA2LAotICBDTU9WTkVaX1JSUl80X09QQ09ERV9ZMCA9IDEsCi0gIENNUEVRSV9JTU04X09QQ09ERV9YMCA9IDQsCi0gIENNUEVRSV9JTU04X09QQ09ERV9YMSA9IDQsCi0gIENNUEVRSV9PUENPREVfWTAgPSAzLAotICBDTVBFUUlfT1BDT0RFX1kxID0gNCwKLSAgQ01QRVFfUlJSXzBfT1BDT0RFX1gwID0gNywKLSAgQ01QRVFfUlJSXzBfT1BDT0RFX1gxID0gNSwKLSAgQ01QRVFfUlJSXzNfT1BDT0RFX1kwID0gMCwKLSAgQ01QRVFfUlJSXzNfT1BDT0RFX1kxID0gMiwKLSAgQ01QRVhDSDRfUlJSXzBfT1BDT0RFX1gxID0gNiwKLSAgQ01QRVhDSF9SUlJfMF9PUENPREVfWDEgPSA3LAotICBDTVBMRVNfUlJSXzBfT1BDT0RFX1gwID0gOCwKLSAgQ01QTEVTX1JSUl8wX09QQ09ERV9YMSA9IDgsCi0gIENNUExFU19SUlJfMl9PUENPREVfWTAgPSAwLAotICBDTVBMRVNfUlJSXzJfT1BDT0RFX1kxID0gMCwKLSAgQ01QTEVVX1JSUl8wX09QQ09ERV9YMCA9IDksCi0gIENNUExFVV9SUlJfMF9PUENPREVfWDEgPSA5LAotICBDTVBMRVVfUlJSXzJfT1BDT0RFX1kwID0gMSwKLSAgQ01QTEVVX1JSUl8yX09QQ09ERV9ZMSA9IDEsCi0gIENNUExUU0lfSU1NOF9PUENPREVfWDAgPSA1LAotICBDTVBMVFNJX0lNTThfT1BDT0RFX1gxID0gNSwKLSAgQ01QTFRTSV9PUENPREVfWTAgPSA0LAotICBDTVBMVFNJX09QQ09ERV9ZMSA9IDUsCi0gIENNUExUU19SUlJfMF9PUENPREVfWDAgPSAxMCwKLSAgQ01QTFRTX1JSUl8wX09QQ09ERV9YMSA9IDEwLAotICBDTVBMVFNfUlJSXzJfT1BDT0RFX1kwID0gMiwKLSAgQ01QTFRTX1JSUl8yX09QQ09ERV9ZMSA9IDIsCi0gIENNUExUVUlfSU1NOF9PUENPREVfWDAgPSA2LAotICBDTVBMVFVJX0lNTThfT1BDT0RFX1gxID0gNiwKLSAgQ01QTFRVX1JSUl8wX09QQ09ERV9YMCA9IDExLAotICBDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gMTEsCi0gIENNUExUVV9SUlJfMl9PUENPREVfWTAgPSAzLAotICBDTVBMVFVfUlJSXzJfT1BDT0RFX1kxID0gMywKLSAgQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gMTIsCi0gIENNUE5FX1JSUl8wX09QQ09ERV9YMSA9IDEyLAotICBDTVBORV9SUlJfM19PUENPREVfWTAgPSAxLAotICBDTVBORV9SUlJfM19PUENPREVfWTEgPSAzLAotICBDTVVMQUZfUlJSXzBfT1BDT0RFX1gwID0gMTMsCi0gIENNVUxBX1JSUl8wX09QQ09ERV9YMCA9IDE0LAotICBDTVVMRlJfUlJSXzBfT1BDT0RFX1gwID0gMTUsCi0gIENNVUxGX1JSUl8wX09QQ09ERV9YMCA9IDE2LAotICBDTVVMSFJfUlJSXzBfT1BDT0RFX1gwID0gMTcsCi0gIENNVUxIX1JSUl8wX09QQ09ERV9YMCA9IDE4LAotICBDTVVMX1JSUl8wX09QQ09ERV9YMCA9IDE5LAotICBDTlRMWl9VTkFSWV9PUENPREVfWDAgPSAxLAotICBDTlRMWl9VTkFSWV9PUENPREVfWTAgPSAxLAotICBDTlRUWl9VTkFSWV9PUENPREVfWDAgPSAyLAotICBDTlRUWl9VTkFSWV9PUENPREVfWTAgPSAyLAotICBDUkMzMl8zMl9SUlJfMF9PUENPREVfWDAgPSAyMCwKLSAgQ1JDMzJfOF9SUlJfMF9PUENPREVfWDAgPSAyMSwKLSAgREJMQUxJR04yX1JSUl8wX09QQ09ERV9YMCA9IDIyLAotICBEQkxBTElHTjJfUlJSXzBfT1BDT0RFX1gxID0gMTMsCi0gIERCTEFMSUdONF9SUlJfMF9PUENPREVfWDAgPSAyMywKLSAgREJMQUxJR040X1JSUl8wX09QQ09ERV9YMSA9IDE0LAotICBEQkxBTElHTjZfUlJSXzBfT1BDT0RFX1gwID0gMjQsCi0gIERCTEFMSUdONl9SUlJfMF9PUENPREVfWDEgPSAxNSwKLSAgREJMQUxJR05fUlJSXzBfT1BDT0RFX1gwID0gMjUsCi0gIERSQUlOX1VOQVJZX09QQ09ERV9YMSA9IDEsCi0gIERUTEJQUl9VTkFSWV9PUENPREVfWDEgPSAyLAotICBFWENINF9SUlJfMF9PUENPREVfWDEgPSAxNiwKLSAgRVhDSF9SUlJfMF9PUENPREVfWDEgPSAxNywKLSAgRkRPVUJMRV9BRERTVUJfUlJSXzBfT1BDT0RFX1gwID0gMjYsCi0gIEZET1VCTEVfQUREX0ZMQUdTX1JSUl8wX09QQ09ERV9YMCA9IDI3LAotICBGRE9VQkxFX01VTF9GTEFHU19SUlJfMF9PUENPREVfWDAgPSAyOCwKLSAgRkRPVUJMRV9QQUNLMV9SUlJfMF9PUENPREVfWDAgPSAyOSwKLSAgRkRPVUJMRV9QQUNLMl9SUlJfMF9PUENPREVfWDAgPSAzMCwKLSAgRkRPVUJMRV9TVUJfRkxBR1NfUlJSXzBfT1BDT0RFX1gwID0gMzEsCi0gIEZET1VCTEVfVU5QQUNLX01BWF9SUlJfMF9PUENPREVfWDAgPSAzMiwKLSAgRkRPVUJMRV9VTlBBQ0tfTUlOX1JSUl8wX09QQ09ERV9YMCA9IDMzLAotICBGRVRDSEFERDRfUlJSXzBfT1BDT0RFX1gxID0gMTgsCi0gIEZFVENIQURER0VaNF9SUlJfMF9PUENPREVfWDEgPSAxOSwKLSAgRkVUQ0hBRERHRVpfUlJSXzBfT1BDT0RFX1gxID0gMjAsCi0gIEZFVENIQUREX1JSUl8wX09QQ09ERV9YMSA9IDIxLAotICBGRVRDSEFORDRfUlJSXzBfT1BDT0RFX1gxID0gMjIsCi0gIEZFVENIQU5EX1JSUl8wX09QQ09ERV9YMSA9IDIzLAotICBGRVRDSE9SNF9SUlJfMF9PUENPREVfWDEgPSAyNCwKLSAgRkVUQ0hPUl9SUlJfMF9PUENPREVfWDEgPSAyNSwKLSAgRklOVl9VTkFSWV9PUENPREVfWDEgPSAzLAotICBGTFVTSFdCX1VOQVJZX09QQ09ERV9YMSA9IDQsCi0gIEZMVVNIX1VOQVJZX09QQ09ERV9YMSA9IDUsCi0gIEZOT1BfVU5BUllfT1BDT0RFX1gwID0gMywKLSAgRk5PUF9VTkFSWV9PUENPREVfWDEgPSA2LAotICBGTk9QX1VOQVJZX09QQ09ERV9ZMCA9IDMsCi0gIEZOT1BfVU5BUllfT1BDT0RFX1kxID0gOCwKLSAgRlNJTkdMRV9BREQxX1JSUl8wX09QQ09ERV9YMCA9IDM0LAotICBGU0lOR0xFX0FERFNVQjJfUlJSXzBfT1BDT0RFX1gwID0gMzUsCi0gIEZTSU5HTEVfTVVMMV9SUlJfMF9PUENPREVfWDAgPSAzNiwKLSAgRlNJTkdMRV9NVUwyX1JSUl8wX09QQ09ERV9YMCA9IDM3LAotICBGU0lOR0xFX1BBQ0sxX1VOQVJZX09QQ09ERV9YMCA9IDQsCi0gIEZTSU5HTEVfUEFDSzFfVU5BUllfT1BDT0RFX1kwID0gNCwKLSAgRlNJTkdMRV9QQUNLMl9SUlJfMF9PUENPREVfWDAgPSAzOCwKLSAgRlNJTkdMRV9TVUIxX1JSUl8wX09QQ09ERV9YMCA9IDM5LAotICBJQ09IX1VOQVJZX09QQ09ERV9YMSA9IDcsCi0gIElMTF9VTkFSWV9PUENPREVfWDEgPSA4LAotICBJTExfVU5BUllfT1BDT0RFX1kxID0gOSwKLSAgSU1NOF9PUENPREVfWDAgPSA0LAotICBJTU04X09QQ09ERV9YMSA9IDMsCi0gIElOVl9VTkFSWV9PUENPREVfWDEgPSA5LAotICBJUkVUX1VOQVJZX09QQ09ERV9YMSA9IDEwLAotICBKQUxSUF9VTkFSWV9PUENPREVfWDEgPSAxMSwKLSAgSkFMUlBfVU5BUllfT1BDT0RFX1kxID0gMTAsCi0gIEpBTFJfVU5BUllfT1BDT0RFX1gxID0gMTIsCi0gIEpBTFJfVU5BUllfT1BDT0RFX1kxID0gMTEsCi0gIEpBTF9KVU1QX09QQ09ERV9YMSA9IDAsCi0gIEpSUF9VTkFSWV9PUENPREVfWDEgPSAxMywKLSAgSlJQX1VOQVJZX09QQ09ERV9ZMSA9IDEyLAotICBKUl9VTkFSWV9PUENPREVfWDEgPSAxNCwKLSAgSlJfVU5BUllfT1BDT0RFX1kxID0gMTMsCi0gIEpVTVBfT1BDT0RFX1gxID0gNCwKLSAgSl9KVU1QX09QQ09ERV9YMSA9IDEsCi0gIExEMVNfQUREX0lNTThfT1BDT0RFX1gxID0gNywKLSAgTEQxU19PUENPREVfWTIgPSAwLAotICBMRDFTX1VOQVJZX09QQ09ERV9YMSA9IDE1LAotICBMRDFVX0FERF9JTU04X09QQ09ERV9YMSA9IDgsCi0gIExEMVVfT1BDT0RFX1kyID0gMSwKLSAgTEQxVV9VTkFSWV9PUENPREVfWDEgPSAxNiwKLSAgTEQyU19BRERfSU1NOF9PUENPREVfWDEgPSA5LAotICBMRDJTX09QQ09ERV9ZMiA9IDIsCi0gIExEMlNfVU5BUllfT1BDT0RFX1gxID0gMTcsCi0gIExEMlVfQUREX0lNTThfT1BDT0RFX1gxID0gMTAsCi0gIExEMlVfT1BDT0RFX1kyID0gMywKLSAgTEQyVV9VTkFSWV9PUENPREVfWDEgPSAxOCwKLSAgTEQ0U19BRERfSU1NOF9PUENPREVfWDEgPSAxMSwKLSAgTEQ0U19PUENPREVfWTIgPSAxLAotICBMRDRTX1VOQVJZX09QQ09ERV9YMSA9IDE5LAotICBMRDRVX0FERF9JTU04X09QQ09ERV9YMSA9IDEyLAotICBMRDRVX09QQ09ERV9ZMiA9IDIsCi0gIExENFVfVU5BUllfT1BDT0RFX1gxID0gMjAsCi0gIExETkFfVU5BUllfT1BDT0RFX1gxID0gMjEsCi0gIExETlQxU19BRERfSU1NOF9PUENPREVfWDEgPSAxMywKLSAgTEROVDFTX1VOQVJZX09QQ09ERV9YMSA9IDIyLAotICBMRE5UMVVfQUREX0lNTThfT1BDT0RFX1gxID0gMTQsCi0gIExETlQxVV9VTkFSWV9PUENPREVfWDEgPSAyMywKLSAgTEROVDJTX0FERF9JTU04X09QQ09ERV9YMSA9IDE1LAotICBMRE5UMlNfVU5BUllfT1BDT0RFX1gxID0gMjQsCi0gIExETlQyVV9BRERfSU1NOF9PUENPREVfWDEgPSAxNiwKLSAgTEROVDJVX1VOQVJZX09QQ09ERV9YMSA9IDI1LAotICBMRE5UNFNfQUREX0lNTThfT1BDT0RFX1gxID0gMTcsCi0gIExETlQ0U19VTkFSWV9PUENPREVfWDEgPSAyNiwKLSAgTEROVDRVX0FERF9JTU04X09QQ09ERV9YMSA9IDE4LAotICBMRE5UNFVfVU5BUllfT1BDT0RFX1gxID0gMjcsCi0gIExETlRfQUREX0lNTThfT1BDT0RFX1gxID0gMTksCi0gIExETlRfVU5BUllfT1BDT0RFX1gxID0gMjgsCi0gIExEX0FERF9JTU04X09QQ09ERV9YMSA9IDIwLAotICBMRF9PUENPREVfWTIgPSAzLAotICBMRF9VTkFSWV9PUENPREVfWDEgPSAyOSwKLSAgTE5LX1VOQVJZX09QQ09ERV9YMSA9IDMwLAotICBMTktfVU5BUllfT1BDT0RFX1kxID0gMTQsCi0gIExXTkFfQUREX0lNTThfT1BDT0RFX1gxID0gMjEsCi0gIE1GU1BSX0lNTThfT1BDT0RFX1gxID0gMjIsCi0gIE1GX1VOQVJZX09QQ09ERV9YMSA9IDMxLAotICBNTV9CRl9PUENPREVfWDAgPSA3LAotICBNTlpfUlJSXzBfT1BDT0RFX1gwID0gNDAsCi0gIE1OWl9SUlJfMF9PUENPREVfWDEgPSAyNiwKLSAgTU5aX1JSUl80X09QQ09ERV9ZMCA9IDIsCi0gIE1OWl9SUlJfNF9PUENPREVfWTEgPSAyLAotICBNT0RFX09QQ09ERV9ZQTIgPSAxLAotICBNT0RFX09QQ09ERV9ZQjIgPSAyLAotICBNT0RFX09QQ09ERV9ZQzIgPSAzLAotICBNVFNQUl9JTU04X09QQ09ERV9YMSA9IDIzLAotICBNVUxBWF9SUlJfMF9PUENPREVfWDAgPSA0MSwKLSAgTVVMQVhfUlJSXzNfT1BDT0RFX1kwID0gMiwKLSAgTVVMQV9IU19IU19SUlJfMF9PUENPREVfWDAgPSA0MiwKLSAgTVVMQV9IU19IU19SUlJfOV9PUENPREVfWTAgPSAwLAotICBNVUxBX0hTX0hVX1JSUl8wX09QQ09ERV9YMCA9IDQzLAotICBNVUxBX0hTX0xTX1JSUl8wX09QQ09ERV9YMCA9IDQ0LAotICBNVUxBX0hTX0xVX1JSUl8wX09QQ09ERV9YMCA9IDQ1LAotICBNVUxBX0hVX0hVX1JSUl8wX09QQ09ERV9YMCA9IDQ2LAotICBNVUxBX0hVX0hVX1JSUl85X09QQ09ERV9ZMCA9IDEsCi0gIE1VTEFfSFVfTFNfUlJSXzBfT1BDT0RFX1gwID0gNDcsCi0gIE1VTEFfSFVfTFVfUlJSXzBfT1BDT0RFX1gwID0gNDgsCi0gIE1VTEFfTFNfTFNfUlJSXzBfT1BDT0RFX1gwID0gNDksCi0gIE1VTEFfTFNfTFNfUlJSXzlfT1BDT0RFX1kwID0gMiwKLSAgTVVMQV9MU19MVV9SUlJfMF9PUENPREVfWDAgPSA1MCwKLSAgTVVMQV9MVV9MVV9SUlJfMF9PUENPREVfWDAgPSA1MSwKLSAgTVVMQV9MVV9MVV9SUlJfOV9PUENPREVfWTAgPSAzLAotICBNVUxYX1JSUl8wX09QQ09ERV9YMCA9IDUyLAotICBNVUxYX1JSUl8zX09QQ09ERV9ZMCA9IDMsCi0gIE1VTF9IU19IU19SUlJfMF9PUENPREVfWDAgPSA1MywKLSAgTVVMX0hTX0hTX1JSUl84X09QQ09ERV9ZMCA9IDAsCi0gIE1VTF9IU19IVV9SUlJfMF9PUENPREVfWDAgPSA1NCwKLSAgTVVMX0hTX0xTX1JSUl8wX09QQ09ERV9YMCA9IDU1LAotICBNVUxfSFNfTFVfUlJSXzBfT1BDT0RFX1gwID0gNTYsCi0gIE1VTF9IVV9IVV9SUlJfMF9PUENPREVfWDAgPSA1NywKLSAgTVVMX0hVX0hVX1JSUl84X09QQ09ERV9ZMCA9IDEsCi0gIE1VTF9IVV9MU19SUlJfMF9PUENPREVfWDAgPSA1OCwKLSAgTVVMX0hVX0xVX1JSUl8wX09QQ09ERV9YMCA9IDU5LAotICBNVUxfTFNfTFNfUlJSXzBfT1BDT0RFX1gwID0gNjAsCi0gIE1VTF9MU19MU19SUlJfOF9PUENPREVfWTAgPSAyLAotICBNVUxfTFNfTFVfUlJSXzBfT1BDT0RFX1gwID0gNjEsCi0gIE1VTF9MVV9MVV9SUlJfMF9PUENPREVfWDAgPSA2MiwKLSAgTVVMX0xVX0xVX1JSUl84X09QQ09ERV9ZMCA9IDMsCi0gIE1aX1JSUl8wX09QQ09ERV9YMCA9IDYzLAotICBNWl9SUlJfMF9PUENPREVfWDEgPSAyNywKLSAgTVpfUlJSXzRfT1BDT0RFX1kwID0gMywKLSAgTVpfUlJSXzRfT1BDT0RFX1kxID0gMywKLSAgTkFQX1VOQVJZX09QQ09ERV9YMSA9IDMyLAotICBOT1BfVU5BUllfT1BDT0RFX1gwID0gNSwKLSAgTk9QX1VOQVJZX09QQ09ERV9YMSA9IDMzLAotICBOT1BfVU5BUllfT1BDT0RFX1kwID0gNSwKLSAgTk9QX1VOQVJZX09QQ09ERV9ZMSA9IDE1LAotICBOT1JfUlJSXzBfT1BDT0RFX1gwID0gNjQsCi0gIE5PUl9SUlJfMF9PUENPREVfWDEgPSAyOCwKLSAgTk9SX1JSUl81X09QQ09ERV9ZMCA9IDEsCi0gIE5PUl9SUlJfNV9PUENPREVfWTEgPSAxLAotICBPUklfSU1NOF9PUENPREVfWDAgPSA3LAotICBPUklfSU1NOF9PUENPREVfWDEgPSAyNCwKLSAgT1JfUlJSXzBfT1BDT0RFX1gwID0gNjUsCi0gIE9SX1JSUl8wX09QQ09ERV9YMSA9IDI5LAotICBPUl9SUlJfNV9PUENPREVfWTAgPSAyLAotICBPUl9SUlJfNV9PUENPREVfWTEgPSAyLAotICBQQ05UX1VOQVJZX09QQ09ERV9YMCA9IDYsCi0gIFBDTlRfVU5BUllfT1BDT0RFX1kwID0gNiwKLSAgUkVWQklUU19VTkFSWV9PUENPREVfWDAgPSA3LAotICBSRVZCSVRTX1VOQVJZX09QQ09ERV9ZMCA9IDcsCi0gIFJFVkJZVEVTX1VOQVJZX09QQ09ERV9YMCA9IDgsCi0gIFJFVkJZVEVTX1VOQVJZX09QQ09ERV9ZMCA9IDgsCi0gIFJPVExJX1NISUZUX09QQ09ERV9YMCA9IDEsCi0gIFJPVExJX1NISUZUX09QQ09ERV9YMSA9IDEsCi0gIFJPVExJX1NISUZUX09QQ09ERV9ZMCA9IDAsCi0gIFJPVExJX1NISUZUX09QQ09ERV9ZMSA9IDAsCi0gIFJPVExfUlJSXzBfT1BDT0RFX1gwID0gNjYsCi0gIFJPVExfUlJSXzBfT1BDT0RFX1gxID0gMzAsCi0gIFJPVExfUlJSXzZfT1BDT0RFX1kwID0gMCwKLSAgUk9UTF9SUlJfNl9PUENPREVfWTEgPSAwLAotICBSUlJfMF9PUENPREVfWDAgPSA1LAotICBSUlJfMF9PUENPREVfWDEgPSA1LAotICBSUlJfMF9PUENPREVfWTAgPSA1LAotICBSUlJfMF9PUENPREVfWTEgPSA2LAotICBSUlJfMV9PUENPREVfWTAgPSA2LAotICBSUlJfMV9PUENPREVfWTEgPSA3LAotICBSUlJfMl9PUENPREVfWTAgPSA3LAotICBSUlJfMl9PUENPREVfWTEgPSA4LAotICBSUlJfM19PUENPREVfWTAgPSA4LAotICBSUlJfM19PUENPREVfWTEgPSA5LAotICBSUlJfNF9PUENPREVfWTAgPSA5LAotICBSUlJfNF9PUENPREVfWTEgPSAxMCwKLSAgUlJSXzVfT1BDT0RFX1kwID0gMTAsCi0gIFJSUl81X09QQ09ERV9ZMSA9IDExLAotICBSUlJfNl9PUENPREVfWTAgPSAxMSwKLSAgUlJSXzZfT1BDT0RFX1kxID0gMTIsCi0gIFJSUl83X09QQ09ERV9ZMCA9IDEyLAotICBSUlJfN19PUENPREVfWTEgPSAxMywKLSAgUlJSXzhfT1BDT0RFX1kwID0gMTMsCi0gIFJSUl85X09QQ09ERV9ZMCA9IDE0LAotICBTSElGVF9PUENPREVfWDAgPSA2LAotICBTSElGVF9PUENPREVfWDEgPSA2LAotICBTSElGVF9PUENPREVfWTAgPSAxNSwKLSAgU0hJRlRfT1BDT0RFX1kxID0gMTQsCi0gIFNITDE2SU5TTElfT1BDT0RFX1gwID0gNywKLSAgU0hMMTZJTlNMSV9PUENPREVfWDEgPSA3LAotICBTSEwxQUREWF9SUlJfMF9PUENPREVfWDAgPSA2NywKLSAgU0hMMUFERFhfUlJSXzBfT1BDT0RFX1gxID0gMzEsCi0gIFNITDFBRERYX1JSUl83X09QQ09ERV9ZMCA9IDEsCi0gIFNITDFBRERYX1JSUl83X09QQ09ERV9ZMSA9IDEsCi0gIFNITDFBRERfUlJSXzBfT1BDT0RFX1gwID0gNjgsCi0gIFNITDFBRERfUlJSXzBfT1BDT0RFX1gxID0gMzIsCi0gIFNITDFBRERfUlJSXzFfT1BDT0RFX1kwID0gMCwKLSAgU0hMMUFERF9SUlJfMV9PUENPREVfWTEgPSAwLAotICBTSEwyQUREWF9SUlJfMF9PUENPREVfWDAgPSA2OSwKLSAgU0hMMkFERFhfUlJSXzBfT1BDT0RFX1gxID0gMzMsCi0gIFNITDJBRERYX1JSUl83X09QQ09ERV9ZMCA9IDIsCi0gIFNITDJBRERYX1JSUl83X09QQ09ERV9ZMSA9IDIsCi0gIFNITDJBRERfUlJSXzBfT1BDT0RFX1gwID0gNzAsCi0gIFNITDJBRERfUlJSXzBfT1BDT0RFX1gxID0gMzQsCi0gIFNITDJBRERfUlJSXzFfT1BDT0RFX1kwID0gMSwKLSAgU0hMMkFERF9SUlJfMV9PUENPREVfWTEgPSAxLAotICBTSEwzQUREWF9SUlJfMF9PUENPREVfWDAgPSA3MSwKLSAgU0hMM0FERFhfUlJSXzBfT1BDT0RFX1gxID0gMzUsCi0gIFNITDNBRERYX1JSUl83X09QQ09ERV9ZMCA9IDMsCi0gIFNITDNBRERYX1JSUl83X09QQ09ERV9ZMSA9IDMsCi0gIFNITDNBRERfUlJSXzBfT1BDT0RFX1gwID0gNzIsCi0gIFNITDNBRERfUlJSXzBfT1BDT0RFX1gxID0gMzYsCi0gIFNITDNBRERfUlJSXzFfT1BDT0RFX1kwID0gMiwKLSAgU0hMM0FERF9SUlJfMV9PUENPREVfWTEgPSAyLAotICBTSExJX1NISUZUX09QQ09ERV9YMCA9IDIsCi0gIFNITElfU0hJRlRfT1BDT0RFX1gxID0gMiwKLSAgU0hMSV9TSElGVF9PUENPREVfWTAgPSAxLAotICBTSExJX1NISUZUX09QQ09ERV9ZMSA9IDEsCi0gIFNITFhJX1NISUZUX09QQ09ERV9YMCA9IDMsCi0gIFNITFhJX1NISUZUX09QQ09ERV9YMSA9IDMsCi0gIFNITFhfUlJSXzBfT1BDT0RFX1gwID0gNzMsCi0gIFNITFhfUlJSXzBfT1BDT0RFX1gxID0gMzcsCi0gIFNITF9SUlJfMF9PUENPREVfWDAgPSA3NCwKLSAgU0hMX1JSUl8wX09QQ09ERV9YMSA9IDM4LAotICBTSExfUlJSXzZfT1BDT0RFX1kwID0gMSwKLSAgU0hMX1JSUl82X09QQ09ERV9ZMSA9IDEsCi0gIFNIUlNJX1NISUZUX09QQ09ERV9YMCA9IDQsCi0gIFNIUlNJX1NISUZUX09QQ09ERV9YMSA9IDQsCi0gIFNIUlNJX1NISUZUX09QQ09ERV9ZMCA9IDIsCi0gIFNIUlNJX1NISUZUX09QQ09ERV9ZMSA9IDIsCi0gIFNIUlNfUlJSXzBfT1BDT0RFX1gwID0gNzUsCi0gIFNIUlNfUlJSXzBfT1BDT0RFX1gxID0gMzksCi0gIFNIUlNfUlJSXzZfT1BDT0RFX1kwID0gMiwKLSAgU0hSU19SUlJfNl9PUENPREVfWTEgPSAyLAotICBTSFJVSV9TSElGVF9PUENPREVfWDAgPSA1LAotICBTSFJVSV9TSElGVF9PUENPREVfWDEgPSA1LAotICBTSFJVSV9TSElGVF9PUENPREVfWTAgPSAzLAotICBTSFJVSV9TSElGVF9PUENPREVfWTEgPSAzLAotICBTSFJVWElfU0hJRlRfT1BDT0RFX1gwID0gNiwKLSAgU0hSVVhJX1NISUZUX09QQ09ERV9YMSA9IDYsCi0gIFNIUlVYX1JSUl8wX09QQ09ERV9YMCA9IDc2LAotICBTSFJVWF9SUlJfMF9PUENPREVfWDEgPSA0MCwKLSAgU0hSVV9SUlJfMF9PUENPREVfWDAgPSA3NywKLSAgU0hSVV9SUlJfMF9PUENPREVfWDEgPSA0MSwKLSAgU0hSVV9SUlJfNl9PUENPREVfWTAgPSAzLAotICBTSFJVX1JSUl82X09QQ09ERV9ZMSA9IDMsCi0gIFNIVUZGTEVCWVRFU19SUlJfMF9PUENPREVfWDAgPSA3OCwKLSAgU1QxX0FERF9JTU04X09QQ09ERV9YMSA9IDI1LAotICBTVDFfT1BDT0RFX1kyID0gMCwKLSAgU1QxX1JSUl8wX09QQ09ERV9YMSA9IDQyLAotICBTVDJfQUREX0lNTThfT1BDT0RFX1gxID0gMjYsCi0gIFNUMl9PUENPREVfWTIgPSAxLAotICBTVDJfUlJSXzBfT1BDT0RFX1gxID0gNDMsCi0gIFNUNF9BRERfSU1NOF9PUENPREVfWDEgPSAyNywKLSAgU1Q0X09QQ09ERV9ZMiA9IDIsCi0gIFNUNF9SUlJfMF9PUENPREVfWDEgPSA0NCwKLSAgU1ROVDFfQUREX0lNTThfT1BDT0RFX1gxID0gMjgsCi0gIFNUTlQxX1JSUl8wX09QQ09ERV9YMSA9IDQ1LAotICBTVE5UMl9BRERfSU1NOF9PUENPREVfWDEgPSAyOSwKLSAgU1ROVDJfUlJSXzBfT1BDT0RFX1gxID0gNDYsCi0gIFNUTlQ0X0FERF9JTU04X09QQ09ERV9YMSA9IDMwLAotICBTVE5UNF9SUlJfMF9PUENPREVfWDEgPSA0NywKLSAgU1ROVF9BRERfSU1NOF9PUENPREVfWDEgPSAzMSwKLSAgU1ROVF9SUlJfMF9PUENPREVfWDEgPSA0OCwKLSAgU1RfQUREX0lNTThfT1BDT0RFX1gxID0gMzIsCi0gIFNUX09QQ09ERV9ZMiA9IDMsCi0gIFNUX1JSUl8wX09QQ09ERV9YMSA9IDQ5LAotICBTVUJYU0NfUlJSXzBfT1BDT0RFX1gwID0gNzksCi0gIFNVQlhTQ19SUlJfMF9PUENPREVfWDEgPSA1MCwKLSAgU1VCWF9SUlJfMF9PUENPREVfWDAgPSA4MCwKLSAgU1VCWF9SUlJfMF9PUENPREVfWDEgPSA1MSwKLSAgU1VCWF9SUlJfMF9PUENPREVfWTAgPSAyLAotICBTVUJYX1JSUl8wX09QQ09ERV9ZMSA9IDIsCi0gIFNVQl9SUlJfMF9PUENPREVfWDAgPSA4MSwKLSAgU1VCX1JSUl8wX09QQ09ERV9YMSA9IDUyLAotICBTVUJfUlJSXzBfT1BDT0RFX1kwID0gMywKLSAgU1VCX1JSUl8wX09QQ09ERV9ZMSA9IDMsCi0gIFNXSU5UMF9VTkFSWV9PUENPREVfWDEgPSAzNCwKLSAgU1dJTlQxX1VOQVJZX09QQ09ERV9YMSA9IDM1LAotICBTV0lOVDJfVU5BUllfT1BDT0RFX1gxID0gMzYsCi0gIFNXSU5UM19VTkFSWV9PUENPREVfWDEgPSAzNywKLSAgVEJMSURYQjBfVU5BUllfT1BDT0RFX1gwID0gOSwKLSAgVEJMSURYQjBfVU5BUllfT1BDT0RFX1kwID0gOSwKLSAgVEJMSURYQjFfVU5BUllfT1BDT0RFX1gwID0gMTAsCi0gIFRCTElEWEIxX1VOQVJZX09QQ09ERV9ZMCA9IDEwLAotICBUQkxJRFhCMl9VTkFSWV9PUENPREVfWDAgPSAxMSwKLSAgVEJMSURYQjJfVU5BUllfT1BDT0RFX1kwID0gMTEsCi0gIFRCTElEWEIzX1VOQVJZX09QQ09ERV9YMCA9IDEyLAotICBUQkxJRFhCM19VTkFSWV9PUENPREVfWTAgPSAxMiwKLSAgVU5BUllfUlJSXzBfT1BDT0RFX1gwID0gODIsCi0gIFVOQVJZX1JSUl8wX09QQ09ERV9YMSA9IDUzLAotICBVTkFSWV9SUlJfMV9PUENPREVfWTAgPSAzLAotICBVTkFSWV9SUlJfMV9PUENPREVfWTEgPSAzLAotICBWMUFERElfSU1NOF9PUENPREVfWDAgPSA4LAotICBWMUFERElfSU1NOF9PUENPREVfWDEgPSAzMywKLSAgVjFBRERVQ19SUlJfMF9PUENPREVfWDAgPSA4MywKLSAgVjFBRERVQ19SUlJfMF9PUENPREVfWDEgPSA1NCwKLSAgVjFBRERfUlJSXzBfT1BDT0RFX1gwID0gODQsCi0gIFYxQUREX1JSUl8wX09QQ09ERV9YMSA9IDU1LAotICBWMUFESUZGVV9SUlJfMF9PUENPREVfWDAgPSA4NSwKLSAgVjFBVkdVX1JSUl8wX09QQ09ERV9YMCA9IDg2LAotICBWMUNNUEVRSV9JTU04X09QQ09ERV9YMCA9IDksCi0gIFYxQ01QRVFJX0lNTThfT1BDT0RFX1gxID0gMzQsCi0gIFYxQ01QRVFfUlJSXzBfT1BDT0RFX1gwID0gODcsCi0gIFYxQ01QRVFfUlJSXzBfT1BDT0RFX1gxID0gNTYsCi0gIFYxQ01QTEVTX1JSUl8wX09QQ09ERV9YMCA9IDg4LAotICBWMUNNUExFU19SUlJfMF9PUENPREVfWDEgPSA1NywKLSAgVjFDTVBMRVVfUlJSXzBfT1BDT0RFX1gwID0gODksCi0gIFYxQ01QTEVVX1JSUl8wX09QQ09ERV9YMSA9IDU4LAotICBWMUNNUExUU0lfSU1NOF9PUENPREVfWDAgPSAxMCwKLSAgVjFDTVBMVFNJX0lNTThfT1BDT0RFX1gxID0gMzUsCi0gIFYxQ01QTFRTX1JSUl8wX09QQ09ERV9YMCA9IDkwLAotICBWMUNNUExUU19SUlJfMF9PUENPREVfWDEgPSA1OSwKLSAgVjFDTVBMVFVJX0lNTThfT1BDT0RFX1gwID0gMTEsCi0gIFYxQ01QTFRVSV9JTU04X09QQ09ERV9YMSA9IDM2LAotICBWMUNNUExUVV9SUlJfMF9PUENPREVfWDAgPSA5MSwKLSAgVjFDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gNjAsCi0gIFYxQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gOTIsCi0gIFYxQ01QTkVfUlJSXzBfT1BDT0RFX1gxID0gNjEsCi0gIFYxRERPVFBVQV9SUlJfMF9PUENPREVfWDAgPSAxNjEsCi0gIFYxRERPVFBVU0FfUlJSXzBfT1BDT0RFX1gwID0gOTMsCi0gIFYxRERPVFBVU19SUlJfMF9PUENPREVfWDAgPSA5NCwKLSAgVjFERE9UUFVfUlJSXzBfT1BDT0RFX1gwID0gMTYyLAotICBWMURPVFBBX1JSUl8wX09QQ09ERV9YMCA9IDk1LAotICBWMURPVFBVQV9SUlJfMF9PUENPREVfWDAgPSAxNjMsCi0gIFYxRE9UUFVTQV9SUlJfMF9PUENPREVfWDAgPSA5NiwKLSAgVjFET1RQVVNfUlJSXzBfT1BDT0RFX1gwID0gOTcsCi0gIFYxRE9UUFVfUlJSXzBfT1BDT0RFX1gwID0gMTY0LAotICBWMURPVFBfUlJSXzBfT1BDT0RFX1gwID0gOTgsCi0gIFYxSU5UX0hfUlJSXzBfT1BDT0RFX1gwID0gOTksCi0gIFYxSU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gNjIsCi0gIFYxSU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTAwLAotICBWMUlOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDYzLAotICBWMU1BWFVJX0lNTThfT1BDT0RFX1gwID0gMTIsCi0gIFYxTUFYVUlfSU1NOF9PUENPREVfWDEgPSAzNywKLSAgVjFNQVhVX1JSUl8wX09QQ09ERV9YMCA9IDEwMSwKLSAgVjFNQVhVX1JSUl8wX09QQ09ERV9YMSA9IDY0LAotICBWMU1JTlVJX0lNTThfT1BDT0RFX1gwID0gMTMsCi0gIFYxTUlOVUlfSU1NOF9PUENPREVfWDEgPSAzOCwKLSAgVjFNSU5VX1JSUl8wX09QQ09ERV9YMCA9IDEwMiwKLSAgVjFNSU5VX1JSUl8wX09QQ09ERV9YMSA9IDY1LAotICBWMU1OWl9SUlJfMF9PUENPREVfWDAgPSAxMDMsCi0gIFYxTU5aX1JSUl8wX09QQ09ERV9YMSA9IDY2LAotICBWMU1VTFRVX1JSUl8wX09QQ09ERV9YMCA9IDEwNCwKLSAgVjFNVUxVU19SUlJfMF9PUENPREVfWDAgPSAxMDUsCi0gIFYxTVVMVV9SUlJfMF9PUENPREVfWDAgPSAxMDYsCi0gIFYxTVpfUlJSXzBfT1BDT0RFX1gwID0gMTA3LAotICBWMU1aX1JSUl8wX09QQ09ERV9YMSA9IDY3LAotICBWMVNBREFVX1JSUl8wX09QQ09ERV9YMCA9IDEwOCwKLSAgVjFTQURVX1JSUl8wX09QQ09ERV9YMCA9IDEwOSwKLSAgVjFTSExJX1NISUZUX09QQ09ERV9YMCA9IDcsCi0gIFYxU0hMSV9TSElGVF9PUENPREVfWDEgPSA3LAotICBWMVNITF9SUlJfMF9PUENPREVfWDAgPSAxMTAsCi0gIFYxU0hMX1JSUl8wX09QQ09ERV9YMSA9IDY4LAotICBWMVNIUlNJX1NISUZUX09QQ09ERV9YMCA9IDgsCi0gIFYxU0hSU0lfU0hJRlRfT1BDT0RFX1gxID0gOCwKLSAgVjFTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDExMSwKLSAgVjFTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDY5LAotICBWMVNIUlVJX1NISUZUX09QQ09ERV9YMCA9IDksCi0gIFYxU0hSVUlfU0hJRlRfT1BDT0RFX1gxID0gOSwKLSAgVjFTSFJVX1JSUl8wX09QQ09ERV9YMCA9IDExMiwKLSAgVjFTSFJVX1JSUl8wX09QQ09ERV9YMSA9IDcwLAotICBWMVNVQlVDX1JSUl8wX09QQ09ERV9YMCA9IDExMywKLSAgVjFTVUJVQ19SUlJfMF9PUENPREVfWDEgPSA3MSwKLSAgVjFTVUJfUlJSXzBfT1BDT0RFX1gwID0gMTE0LAotICBWMVNVQl9SUlJfMF9PUENPREVfWDEgPSA3MiwKLSAgVjJBRERJX0lNTThfT1BDT0RFX1gwID0gMTQsCi0gIFYyQURESV9JTU04X09QQ09ERV9YMSA9IDM5LAotICBWMkFERFNDX1JSUl8wX09QQ09ERV9YMCA9IDExNSwKLSAgVjJBRERTQ19SUlJfMF9PUENPREVfWDEgPSA3MywKLSAgVjJBRERfUlJSXzBfT1BDT0RFX1gwID0gMTE2LAotICBWMkFERF9SUlJfMF9PUENPREVfWDEgPSA3NCwKLSAgVjJBRElGRlNfUlJSXzBfT1BDT0RFX1gwID0gMTE3LAotICBWMkFWR1NfUlJSXzBfT1BDT0RFX1gwID0gMTE4LAotICBWMkNNUEVRSV9JTU04X09QQ09ERV9YMCA9IDE1LAotICBWMkNNUEVRSV9JTU04X09QQ09ERV9YMSA9IDQwLAotICBWMkNNUEVRX1JSUl8wX09QQ09ERV9YMCA9IDExOSwKLSAgVjJDTVBFUV9SUlJfMF9PUENPREVfWDEgPSA3NSwKLSAgVjJDTVBMRVNfUlJSXzBfT1BDT0RFX1gwID0gMTIwLAotICBWMkNNUExFU19SUlJfMF9PUENPREVfWDEgPSA3NiwKLSAgVjJDTVBMRVVfUlJSXzBfT1BDT0RFX1gwID0gMTIxLAotICBWMkNNUExFVV9SUlJfMF9PUENPREVfWDEgPSA3NywKLSAgVjJDTVBMVFNJX0lNTThfT1BDT0RFX1gwID0gMTYsCi0gIFYyQ01QTFRTSV9JTU04X09QQ09ERV9YMSA9IDQxLAotICBWMkNNUExUU19SUlJfMF9PUENPREVfWDAgPSAxMjIsCi0gIFYyQ01QTFRTX1JSUl8wX09QQ09ERV9YMSA9IDc4LAotICBWMkNNUExUVUlfSU1NOF9PUENPREVfWDAgPSAxNywKLSAgVjJDTVBMVFVJX0lNTThfT1BDT0RFX1gxID0gNDIsCi0gIFYyQ01QTFRVX1JSUl8wX09QQ09ERV9YMCA9IDEyMywKLSAgVjJDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gNzksCi0gIFYyQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gMTI0LAotICBWMkNNUE5FX1JSUl8wX09QQ09ERV9YMSA9IDgwLAotICBWMkRPVFBBX1JSUl8wX09QQ09ERV9YMCA9IDEyNSwKLSAgVjJET1RQX1JSUl8wX09QQ09ERV9YMCA9IDEyNiwKLSAgVjJJTlRfSF9SUlJfMF9PUENPREVfWDAgPSAxMjcsCi0gIFYySU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gODEsCi0gIFYySU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTI4LAotICBWMklOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDgyLAotICBWMk1BWFNJX0lNTThfT1BDT0RFX1gwID0gMTgsCi0gIFYyTUFYU0lfSU1NOF9PUENPREVfWDEgPSA0MywKLSAgVjJNQVhTX1JSUl8wX09QQ09ERV9YMCA9IDEyOSwKLSAgVjJNQVhTX1JSUl8wX09QQ09ERV9YMSA9IDgzLAotICBWMk1JTlNJX0lNTThfT1BDT0RFX1gwID0gMTksCi0gIFYyTUlOU0lfSU1NOF9PUENPREVfWDEgPSA0NCwKLSAgVjJNSU5TX1JSUl8wX09QQ09ERV9YMCA9IDEzMCwKLSAgVjJNSU5TX1JSUl8wX09QQ09ERV9YMSA9IDg0LAotICBWMk1OWl9SUlJfMF9PUENPREVfWDAgPSAxMzEsCi0gIFYyTU5aX1JSUl8wX09QQ09ERV9YMSA9IDg1LAotICBWMk1VTEZTQ19SUlJfMF9PUENPREVfWDAgPSAxMzIsCi0gIFYyTVVMU19SUlJfMF9PUENPREVfWDAgPSAxMzMsCi0gIFYyTVVMVFNfUlJSXzBfT1BDT0RFX1gwID0gMTM0LAotICBWMk1aX1JSUl8wX09QQ09ERV9YMCA9IDEzNSwKLSAgVjJNWl9SUlJfMF9PUENPREVfWDEgPSA4NiwKLSAgVjJQQUNLSF9SUlJfMF9PUENPREVfWDAgPSAxMzYsCi0gIFYyUEFDS0hfUlJSXzBfT1BDT0RFX1gxID0gODcsCi0gIFYyUEFDS0xfUlJSXzBfT1BDT0RFX1gwID0gMTM3LAotICBWMlBBQ0tMX1JSUl8wX09QQ09ERV9YMSA9IDg4LAotICBWMlBBQ0tVQ19SUlJfMF9PUENPREVfWDAgPSAxMzgsCi0gIFYyUEFDS1VDX1JSUl8wX09QQ09ERV9YMSA9IDg5LAotICBWMlNBREFTX1JSUl8wX09QQ09ERV9YMCA9IDEzOSwKLSAgVjJTQURBVV9SUlJfMF9PUENPREVfWDAgPSAxNDAsCi0gIFYyU0FEU19SUlJfMF9PUENPREVfWDAgPSAxNDEsCi0gIFYyU0FEVV9SUlJfMF9PUENPREVfWDAgPSAxNDIsCi0gIFYyU0hMSV9TSElGVF9PUENPREVfWDAgPSAxMCwKLSAgVjJTSExJX1NISUZUX09QQ09ERV9YMSA9IDEwLAotICBWMlNITFNDX1JSUl8wX09QQ09ERV9YMCA9IDE0MywKLSAgVjJTSExTQ19SUlJfMF9PUENPREVfWDEgPSA5MCwKLSAgVjJTSExfUlJSXzBfT1BDT0RFX1gwID0gMTQ0LAotICBWMlNITF9SUlJfMF9PUENPREVfWDEgPSA5MSwKLSAgVjJTSFJTSV9TSElGVF9PUENPREVfWDAgPSAxMSwKLSAgVjJTSFJTSV9TSElGVF9PUENPREVfWDEgPSAxMSwKLSAgVjJTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDE0NSwKLSAgVjJTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDkyLAotICBWMlNIUlVJX1NISUZUX09QQ09ERV9YMCA9IDEyLAotICBWMlNIUlVJX1NISUZUX09QQ09ERV9YMSA9IDEyLAotICBWMlNIUlVfUlJSXzBfT1BDT0RFX1gwID0gMTQ2LAotICBWMlNIUlVfUlJSXzBfT1BDT0RFX1gxID0gOTMsCi0gIFYyU1VCU0NfUlJSXzBfT1BDT0RFX1gwID0gMTQ3LAotICBWMlNVQlNDX1JSUl8wX09QQ09ERV9YMSA9IDk0LAotICBWMlNVQl9SUlJfMF9PUENPREVfWDAgPSAxNDgsCi0gIFYyU1VCX1JSUl8wX09QQ09ERV9YMSA9IDk1LAotICBWNEFERFNDX1JSUl8wX09QQ09ERV9YMCA9IDE0OSwKLSAgVjRBRERTQ19SUlJfMF9PUENPREVfWDEgPSA5NiwKLSAgVjRBRERfUlJSXzBfT1BDT0RFX1gwID0gMTUwLAotICBWNEFERF9SUlJfMF9PUENPREVfWDEgPSA5NywKLSAgVjRJTlRfSF9SUlJfMF9PUENPREVfWDAgPSAxNTEsCi0gIFY0SU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gOTgsCi0gIFY0SU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTUyLAotICBWNElOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDk5LAotICBWNFBBQ0tTQ19SUlJfMF9PUENPREVfWDAgPSAxNTMsCi0gIFY0UEFDS1NDX1JSUl8wX09QQ09ERV9YMSA9IDEwMCwKLSAgVjRTSExTQ19SUlJfMF9PUENPREVfWDAgPSAxNTQsCi0gIFY0U0hMU0NfUlJSXzBfT1BDT0RFX1gxID0gMTAxLAotICBWNFNITF9SUlJfMF9PUENPREVfWDAgPSAxNTUsCi0gIFY0U0hMX1JSUl8wX09QQ09ERV9YMSA9IDEwMiwKLSAgVjRTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDE1NiwKLSAgVjRTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDEwMywKLSAgVjRTSFJVX1JSUl8wX09QQ09ERV9YMCA9IDE1NywKLSAgVjRTSFJVX1JSUl8wX09QQ09ERV9YMSA9IDEwNCwKLSAgVjRTVUJTQ19SUlJfMF9PUENPREVfWDAgPSAxNTgsCi0gIFY0U1VCU0NfUlJSXzBfT1BDT0RFX1gxID0gMTA1LAotICBWNFNVQl9SUlJfMF9PUENPREVfWDAgPSAxNTksCi0gIFY0U1VCX1JSUl8wX09QQ09ERV9YMSA9IDEwNiwKLSAgV0g2NF9VTkFSWV9PUENPREVfWDEgPSAzOCwKLSAgWE9SSV9JTU04X09QQ09ERV9YMCA9IDIwLAotICBYT1JJX0lNTThfT1BDT0RFX1gxID0gNDUsCi0gIFhPUl9SUlJfMF9PUENPREVfWDAgPSAxNjAsCi0gIFhPUl9SUlJfMF9PUENPREVfWDEgPSAxMDcsCi0gIFhPUl9SUlJfNV9PUENPREVfWTAgPSAzLAotICBYT1JfUlJSXzVfT1BDT0RFX1kxID0gMwotfTsKLQotI2VuZGlmIC8qICFfVElMRV9PUENPREVfQ09OU1RBTlRTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCmluZGV4IDVlMmQwMzMuLjYzNDhlNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApAQCAtMTUsNiArMTUsOCBAQAogI2lmbmRlZiBfQVNNX1RJTEVfU0lHQ09OVEVYVF9ICiAjZGVmaW5lIF9BU01fVElMRV9TSUdDT05URVhUX0gKIAorLyogRG9uJ3QgcG9sbHV0ZSB0aGUgbmFtZXNwYWNlIHNpbmNlIDxzaWduYWwuaD4gaW5jbHVkZXMgdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX25lZWRfaW50X3JlZ190CiAjaW5jbHVkZSA8YXJjaC9hYmkuaD4KIAogLyoKQEAgLTIyLDE0ICsyNCwxNCBAQAogICogYnV0IGlzIHNpbXBsaWZpZWQgc2luY2Ugd2Uga25vdyB0aGUgZmF1bHQgaXMgZnJvbSB1c2Vyc3BhY2UuCiAgKi8KIHN0cnVjdCBzaWdjb250ZXh0IHsKLQl1aW50X3JlZ190IGdyZWdzWzUzXTsJLyogR2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gICovCi0JdWludF9yZWdfdCB0cDsJCS8qIEFsaWFzZXMgZ3JlZ3NbVFJFR19UUF0uICAqLwotCXVpbnRfcmVnX3Qgc3A7CQkvKiBBbGlhc2VzIGdyZWdzW1RSRUdfU1BdLiAgKi8KLQl1aW50X3JlZ190IGxyOwkJLyogQWxpYXNlcyBncmVnc1tUUkVHX0xSXS4gICovCi0JdWludF9yZWdfdCBwYzsJCS8qIFByb2dyYW0gY291bnRlci4gICovCi0JdWludF9yZWdfdCBpY3M7CQkvKiBJbiBJbnRlcnJ1cHQgQ3JpdGljYWwgU2VjdGlvbj8gICovCi0JdWludF9yZWdfdCBmYXVsdG51bTsJLyogRmF1bHQgbnVtYmVyLiAgKi8KLQl1aW50X3JlZ190IHBhZFs1XTsKKwlfX3VpbnRfcmVnX3QgZ3JlZ3NbNTNdOwkvKiBHZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzLiAgKi8KKwlfX3VpbnRfcmVnX3QgdHA7CS8qIEFsaWFzZXMgZ3JlZ3NbVFJFR19UUF0uICAqLworCV9fdWludF9yZWdfdCBzcDsJLyogQWxpYXNlcyBncmVnc1tUUkVHX1NQXS4gICovCisJX191aW50X3JlZ190IGxyOwkvKiBBbGlhc2VzIGdyZWdzW1RSRUdfTFJdLiAgKi8KKwlfX3VpbnRfcmVnX3QgcGM7CS8qIFByb2dyYW0gY291bnRlci4gICovCisJX191aW50X3JlZ190IGljczsJLyogSW4gSW50ZXJydXB0IENyaXRpY2FsIFNlY3Rpb24/ICAqLworCV9fdWludF9yZWdfdCBmYXVsdG51bTsJLyogRmF1bHQgbnVtYmVyLiAgKi8KKwlfX3VpbnRfcmVnX3QgcGFkWzVdOwogfTsKIAogI2VuZGlmIC8qIF9BU01fVElMRV9TSUdDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aWxlLWRlc2MuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aWxlLWRlc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzg0OWJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3RpbGUtZGVzYy5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX3RpbGVneF9fCisjaW5jbHVkZSA8YXNtL3RpbGUtZGVzY18zMi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhc20vdGlsZS1kZXNjXzY0Lmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aWxlLWRlc2NfMzIuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aWxlLWRlc2NfMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDljNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3RpbGUtZGVzY18zMi5oCkBAIC0wLDAgKzEsNTUzIEBACisvKiBUSUxFUHJvIG9wY29kZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqCisgKgorICoKKyAqLworCisjaWZuZGVmIG9wY29kZV90aWxlcHJvX2gKKyNkZWZpbmUgb3Bjb2RlX3RpbGVwcm9faAorCisjaW5jbHVkZSA8YXJjaC9vcGNvZGUuaD4KKworCitlbnVtCit7CisgIFRJTEVQUk9fTUFYX09QRVJBTkRTID0gNSAvKiBtbSAqLworfTsKKwordHlwZWRlZiBlbnVtCit7CisgIFRJTEVQUk9fT1BDX0JQVCwKKyAgVElMRVBST19PUENfSU5GTywKKyAgVElMRVBST19PUENfSU5GT0wsCisgIFRJTEVQUk9fT1BDX0osCisgIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfTU9WRSwKKyAgVElMRVBST19PUENfTU9WRV9TTiwKKyAgVElMRVBST19PUENfTU9WRUksCisgIFRJTEVQUk9fT1BDX01PVkVJX1NOLAorICBUSUxFUFJPX09QQ19NT1ZFTEksCisgIFRJTEVQUk9fT1BDX01PVkVMSV9TTiwKKyAgVElMRVBST19PUENfTU9WRUxJUywKKyAgVElMRVBST19PUENfUFJFRkVUQ0gsCisgIFRJTEVQUk9fT1BDX1JBSVNFLAorICBUSUxFUFJPX09QQ19BREQsCisgIFRJTEVQUk9fT1BDX0FERF9TTiwKKyAgVElMRVBST19PUENfQUREQiwKKyAgVElMRVBST19PUENfQUREQl9TTiwKKyAgVElMRVBST19PUENfQUREQlNfVSwKKyAgVElMRVBST19PUENfQUREQlNfVV9TTiwKKyAgVElMRVBST19PUENfQURESCwKKyAgVElMRVBST19PUENfQURESF9TTiwKKyAgVElMRVBST19PUENfQURESFMsCisgIFRJTEVQUk9fT1BDX0FEREhTX1NOLAorICBUSUxFUFJPX09QQ19BRERJLAorICBUSUxFUFJPX09QQ19BRERJX1NOLAorICBUSUxFUFJPX09QQ19BRERJQiwKKyAgVElMRVBST19PUENfQURESUJfU04sCisgIFRJTEVQUk9fT1BDX0FERElILAorICBUSUxFUFJPX09QQ19BRERJSF9TTiwKKyAgVElMRVBST19PUENfQURETEksCisgIFRJTEVQUk9fT1BDX0FERExJX1NOLAorICBUSUxFUFJPX09QQ19BRERMSVMsCisgIFRJTEVQUk9fT1BDX0FERFMsCisgIFRJTEVQUk9fT1BDX0FERFNfU04sCisgIFRJTEVQUk9fT1BDX0FESUZGQl9VLAorICBUSUxFUFJPX09QQ19BRElGRkJfVV9TTiwKKyAgVElMRVBST19PUENfQURJRkZILAorICBUSUxFUFJPX09QQ19BRElGRkhfU04sCisgIFRJTEVQUk9fT1BDX0FORCwKKyAgVElMRVBST19PUENfQU5EX1NOLAorICBUSUxFUFJPX09QQ19BTkRJLAorICBUSUxFUFJPX09QQ19BTkRJX1NOLAorICBUSUxFUFJPX09QQ19BVUxJLAorICBUSUxFUFJPX09QQ19BVkdCX1UsCisgIFRJTEVQUk9fT1BDX0FWR0JfVV9TTiwKKyAgVElMRVBST19PUENfQVZHSCwKKyAgVElMRVBST19PUENfQVZHSF9TTiwKKyAgVElMRVBST19PUENfQkJOUywKKyAgVElMRVBST19PUENfQkJOU19TTiwKKyAgVElMRVBST19PUENfQkJOU1QsCisgIFRJTEVQUk9fT1BDX0JCTlNUX1NOLAorICBUSUxFUFJPX09QQ19CQlMsCisgIFRJTEVQUk9fT1BDX0JCU19TTiwKKyAgVElMRVBST19PUENfQkJTVCwKKyAgVElMRVBST19PUENfQkJTVF9TTiwKKyAgVElMRVBST19PUENfQkdFWiwKKyAgVElMRVBST19PUENfQkdFWl9TTiwKKyAgVElMRVBST19PUENfQkdFWlQsCisgIFRJTEVQUk9fT1BDX0JHRVpUX1NOLAorICBUSUxFUFJPX09QQ19CR1osCisgIFRJTEVQUk9fT1BDX0JHWl9TTiwKKyAgVElMRVBST19PUENfQkdaVCwKKyAgVElMRVBST19PUENfQkdaVF9TTiwKKyAgVElMRVBST19PUENfQklUWCwKKyAgVElMRVBST19PUENfQklUWF9TTiwKKyAgVElMRVBST19PUENfQkxFWiwKKyAgVElMRVBST19PUENfQkxFWl9TTiwKKyAgVElMRVBST19PUENfQkxFWlQsCisgIFRJTEVQUk9fT1BDX0JMRVpUX1NOLAorICBUSUxFUFJPX09QQ19CTFosCisgIFRJTEVQUk9fT1BDX0JMWl9TTiwKKyAgVElMRVBST19PUENfQkxaVCwKKyAgVElMRVBST19PUENfQkxaVF9TTiwKKyAgVElMRVBST19PUENfQk5aLAorICBUSUxFUFJPX09QQ19CTlpfU04sCisgIFRJTEVQUk9fT1BDX0JOWlQsCisgIFRJTEVQUk9fT1BDX0JOWlRfU04sCisgIFRJTEVQUk9fT1BDX0JZVEVYLAorICBUSUxFUFJPX09QQ19CWVRFWF9TTiwKKyAgVElMRVBST19PUENfQlosCisgIFRJTEVQUk9fT1BDX0JaX1NOLAorICBUSUxFUFJPX09QQ19CWlQsCisgIFRJTEVQUk9fT1BDX0JaVF9TTiwKKyAgVElMRVBST19PUENfQ0xaLAorICBUSUxFUFJPX09QQ19DTFpfU04sCisgIFRJTEVQUk9fT1BDX0NSQzMyXzMyLAorICBUSUxFUFJPX09QQ19DUkMzMl8zMl9TTiwKKyAgVElMRVBST19PUENfQ1JDMzJfOCwKKyAgVElMRVBST19PUENfQ1JDMzJfOF9TTiwKKyAgVElMRVBST19PUENfQ1RaLAorICBUSUxFUFJPX09QQ19DVFpfU04sCisgIFRJTEVQUk9fT1BDX0RSQUlOLAorICBUSUxFUFJPX09QQ19EVExCUFIsCisgIFRJTEVQUk9fT1BDX0RXT1JEX0FMSUdOLAorICBUSUxFUFJPX09QQ19EV09SRF9BTElHTl9TTiwKKyAgVElMRVBST19PUENfRklOViwKKyAgVElMRVBST19PUENfRkxVU0gsCisgIFRJTEVQUk9fT1BDX0ZOT1AsCisgIFRJTEVQUk9fT1BDX0lDT0gsCisgIFRJTEVQUk9fT1BDX0lMTCwKKyAgVElMRVBST19PUENfSU5USEIsCisgIFRJTEVQUk9fT1BDX0lOVEhCX1NOLAorICBUSUxFUFJPX09QQ19JTlRISCwKKyAgVElMRVBST19PUENfSU5USEhfU04sCisgIFRJTEVQUk9fT1BDX0lOVExCLAorICBUSUxFUFJPX09QQ19JTlRMQl9TTiwKKyAgVElMRVBST19PUENfSU5UTEgsCisgIFRJTEVQUk9fT1BDX0lOVExIX1NOLAorICBUSUxFUFJPX09QQ19JTlYsCisgIFRJTEVQUk9fT1BDX0lSRVQsCisgIFRJTEVQUk9fT1BDX0pBTEIsCisgIFRJTEVQUk9fT1BDX0pBTEYsCisgIFRJTEVQUk9fT1BDX0pBTFIsCisgIFRJTEVQUk9fT1BDX0pBTFJQLAorICBUSUxFUFJPX09QQ19KQiwKKyAgVElMRVBST19PUENfSkYsCisgIFRJTEVQUk9fT1BDX0pSLAorICBUSUxFUFJPX09QQ19KUlAsCisgIFRJTEVQUk9fT1BDX0xCLAorICBUSUxFUFJPX09QQ19MQl9TTiwKKyAgVElMRVBST19PUENfTEJfVSwKKyAgVElMRVBST19PUENfTEJfVV9TTiwKKyAgVElMRVBST19PUENfTEJBREQsCisgIFRJTEVQUk9fT1BDX0xCQUREX1NOLAorICBUSUxFUFJPX09QQ19MQkFERF9VLAorICBUSUxFUFJPX09QQ19MQkFERF9VX1NOLAorICBUSUxFUFJPX09QQ19MSCwKKyAgVElMRVBST19PUENfTEhfU04sCisgIFRJTEVQUk9fT1BDX0xIX1UsCisgIFRJTEVQUk9fT1BDX0xIX1VfU04sCisgIFRJTEVQUk9fT1BDX0xIQURELAorICBUSUxFUFJPX09QQ19MSEFERF9TTiwKKyAgVElMRVBST19PUENfTEhBRERfVSwKKyAgVElMRVBST19PUENfTEhBRERfVV9TTiwKKyAgVElMRVBST19PUENfTE5LLAorICBUSUxFUFJPX09QQ19MTktfU04sCisgIFRJTEVQUk9fT1BDX0xXLAorICBUSUxFUFJPX09QQ19MV19TTiwKKyAgVElMRVBST19PUENfTFdfTkEsCisgIFRJTEVQUk9fT1BDX0xXX05BX1NOLAorICBUSUxFUFJPX09QQ19MV0FERCwKKyAgVElMRVBST19PUENfTFdBRERfU04sCisgIFRJTEVQUk9fT1BDX0xXQUREX05BLAorICBUSUxFUFJPX09QQ19MV0FERF9OQV9TTiwKKyAgVElMRVBST19PUENfTUFYQl9VLAorICBUSUxFUFJPX09QQ19NQVhCX1VfU04sCisgIFRJTEVQUk9fT1BDX01BWEgsCisgIFRJTEVQUk9fT1BDX01BWEhfU04sCisgIFRJTEVQUk9fT1BDX01BWElCX1UsCisgIFRJTEVQUk9fT1BDX01BWElCX1VfU04sCisgIFRJTEVQUk9fT1BDX01BWElILAorICBUSUxFUFJPX09QQ19NQVhJSF9TTiwKKyAgVElMRVBST19PUENfTUYsCisgIFRJTEVQUk9fT1BDX01GU1BSLAorICBUSUxFUFJPX09QQ19NSU5CX1UsCisgIFRJTEVQUk9fT1BDX01JTkJfVV9TTiwKKyAgVElMRVBST19PUENfTUlOSCwKKyAgVElMRVBST19PUENfTUlOSF9TTiwKKyAgVElMRVBST19PUENfTUlOSUJfVSwKKyAgVElMRVBST19PUENfTUlOSUJfVV9TTiwKKyAgVElMRVBST19PUENfTUlOSUgsCisgIFRJTEVQUk9fT1BDX01JTklIX1NOLAorICBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU5aLAorICBUSUxFUFJPX09QQ19NTlpfU04sCisgIFRJTEVQUk9fT1BDX01OWkIsCisgIFRJTEVQUk9fT1BDX01OWkJfU04sCisgIFRJTEVQUk9fT1BDX01OWkgsCisgIFRJTEVQUk9fT1BDX01OWkhfU04sCisgIFRJTEVQUk9fT1BDX01UU1BSLAorICBUSUxFUFJPX09QQ19NVUxISF9TUywKKyAgVElMRVBST19PUENfTVVMSEhfU1NfU04sCisgIFRJTEVQUk9fT1BDX01VTEhIX1NVLAorICBUSUxFUFJPX09QQ19NVUxISF9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMSEhfVVUsCisgIFRJTEVQUk9fT1BDX01VTEhIX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxISEFfU1MsCisgIFRJTEVQUk9fT1BDX01VTEhIQV9TU19TTiwKKyAgVElMRVBST19PUENfTVVMSEhBX1NVLAorICBUSUxFUFJPX09QQ19NVUxISEFfU1VfU04sCisgIFRJTEVQUk9fT1BDX01VTEhIQV9VVSwKKyAgVElMRVBST19PUENfTVVMSEhBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxISFNBX1VVLAorICBUSUxFUFJPX09QQ19NVUxISFNBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxITF9TUywKKyAgVElMRVBST19PUENfTVVMSExfU1NfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMX1NVLAorICBUSUxFUFJPX09QQ19NVUxITF9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMSExfVVMsCisgIFRJTEVQUk9fT1BDX01VTEhMX1VTX1NOLAorICBUSUxFUFJPX09QQ19NVUxITF9VVSwKKyAgVElMRVBST19PUENfTVVMSExfVVVfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMQV9TUywKKyAgVElMRVBST19PUENfTVVMSExBX1NTX1NOLAorICBUSUxFUFJPX09QQ19NVUxITEFfU1UsCisgIFRJTEVQUk9fT1BDX01VTEhMQV9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMSExBX1VTLAorICBUSUxFUFJPX09QQ19NVUxITEFfVVNfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMQV9VVSwKKyAgVElMRVBST19PUENfTVVMSExBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxITFNBX1VVLAorICBUSUxFUFJPX09QQ19NVUxITFNBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxMTF9TUywKKyAgVElMRVBST19PUENfTVVMTExfU1NfU04sCisgIFRJTEVQUk9fT1BDX01VTExMX1NVLAorICBUSUxFUFJPX09QQ19NVUxMTF9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMTExfVVUsCisgIFRJTEVQUk9fT1BDX01VTExMX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxMTEFfU1MsCisgIFRJTEVQUk9fT1BDX01VTExMQV9TU19TTiwKKyAgVElMRVBST19PUENfTVVMTExBX1NVLAorICBUSUxFUFJPX09QQ19NVUxMTEFfU1VfU04sCisgIFRJTEVQUk9fT1BDX01VTExMQV9VVSwKKyAgVElMRVBST19PUENfTVVMTExBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxMTFNBX1VVLAorICBUSUxFUFJPX09QQ19NVUxMTFNBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVk5aLAorICBUSUxFUFJPX09QQ19NVk5aX1NOLAorICBUSUxFUFJPX09QQ19NVlosCisgIFRJTEVQUk9fT1BDX01WWl9TTiwKKyAgVElMRVBST19PUENfTVosCisgIFRJTEVQUk9fT1BDX01aX1NOLAorICBUSUxFUFJPX09QQ19NWkIsCisgIFRJTEVQUk9fT1BDX01aQl9TTiwKKyAgVElMRVBST19PUENfTVpILAorICBUSUxFUFJPX09QQ19NWkhfU04sCisgIFRJTEVQUk9fT1BDX05BUCwKKyAgVElMRVBST19PUENfTk9QLAorICBUSUxFUFJPX09QQ19OT1IsCisgIFRJTEVQUk9fT1BDX05PUl9TTiwKKyAgVElMRVBST19PUENfT1IsCisgIFRJTEVQUk9fT1BDX09SX1NOLAorICBUSUxFUFJPX09QQ19PUkksCisgIFRJTEVQUk9fT1BDX09SSV9TTiwKKyAgVElMRVBST19PUENfUEFDS0JTX1UsCisgIFRJTEVQUk9fT1BDX1BBQ0tCU19VX1NOLAorICBUSUxFUFJPX09QQ19QQUNLSEIsCisgIFRJTEVQUk9fT1BDX1BBQ0tIQl9TTiwKKyAgVElMRVBST19PUENfUEFDS0hTLAorICBUSUxFUFJPX09QQ19QQUNLSFNfU04sCisgIFRJTEVQUk9fT1BDX1BBQ0tMQiwKKyAgVElMRVBST19PUENfUEFDS0xCX1NOLAorICBUSUxFUFJPX09QQ19QQ05ULAorICBUSUxFUFJPX09QQ19QQ05UX1NOLAorICBUSUxFUFJPX09QQ19STCwKKyAgVElMRVBST19PUENfUkxfU04sCisgIFRJTEVQUk9fT1BDX1JMSSwKKyAgVElMRVBST19PUENfUkxJX1NOLAorICBUSUxFUFJPX09QQ19TMUEsCisgIFRJTEVQUk9fT1BDX1MxQV9TTiwKKyAgVElMRVBST19PUENfUzJBLAorICBUSUxFUFJPX09QQ19TMkFfU04sCisgIFRJTEVQUk9fT1BDX1MzQSwKKyAgVElMRVBST19PUENfUzNBX1NOLAorICBUSUxFUFJPX09QQ19TQURBQl9VLAorICBUSUxFUFJPX09QQ19TQURBQl9VX1NOLAorICBUSUxFUFJPX09QQ19TQURBSCwKKyAgVElMRVBST19PUENfU0FEQUhfU04sCisgIFRJTEVQUk9fT1BDX1NBREFIX1UsCisgIFRJTEVQUk9fT1BDX1NBREFIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NBREJfVSwKKyAgVElMRVBST19PUENfU0FEQl9VX1NOLAorICBUSUxFUFJPX09QQ19TQURILAorICBUSUxFUFJPX09QQ19TQURIX1NOLAorICBUSUxFUFJPX09QQ19TQURIX1UsCisgIFRJTEVQUk9fT1BDX1NBREhfVV9TTiwKKyAgVElMRVBST19PUENfU0IsCisgIFRJTEVQUk9fT1BDX1NCQURELAorICBUSUxFUFJPX09QQ19TRVEsCisgIFRJTEVQUk9fT1BDX1NFUV9TTiwKKyAgVElMRVBST19PUENfU0VRQiwKKyAgVElMRVBST19PUENfU0VRQl9TTiwKKyAgVElMRVBST19PUENfU0VRSCwKKyAgVElMRVBST19PUENfU0VRSF9TTiwKKyAgVElMRVBST19PUENfU0VRSSwKKyAgVElMRVBST19PUENfU0VRSV9TTiwKKyAgVElMRVBST19PUENfU0VRSUIsCisgIFRJTEVQUk9fT1BDX1NFUUlCX1NOLAorICBUSUxFUFJPX09QQ19TRVFJSCwKKyAgVElMRVBST19PUENfU0VRSUhfU04sCisgIFRJTEVQUk9fT1BDX1NILAorICBUSUxFUFJPX09QQ19TSEFERCwKKyAgVElMRVBST19PUENfU0hMLAorICBUSUxFUFJPX09QQ19TSExfU04sCisgIFRJTEVQUk9fT1BDX1NITEIsCisgIFRJTEVQUk9fT1BDX1NITEJfU04sCisgIFRJTEVQUk9fT1BDX1NITEgsCisgIFRJTEVQUk9fT1BDX1NITEhfU04sCisgIFRJTEVQUk9fT1BDX1NITEksCisgIFRJTEVQUk9fT1BDX1NITElfU04sCisgIFRJTEVQUk9fT1BDX1NITElCLAorICBUSUxFUFJPX09QQ19TSExJQl9TTiwKKyAgVElMRVBST19PUENfU0hMSUgsCisgIFRJTEVQUk9fT1BDX1NITElIX1NOLAorICBUSUxFUFJPX09QQ19TSFIsCisgIFRJTEVQUk9fT1BDX1NIUl9TTiwKKyAgVElMRVBST19PUENfU0hSQiwKKyAgVElMRVBST19PUENfU0hSQl9TTiwKKyAgVElMRVBST19PUENfU0hSSCwKKyAgVElMRVBST19PUENfU0hSSF9TTiwKKyAgVElMRVBST19PUENfU0hSSSwKKyAgVElMRVBST19PUENfU0hSSV9TTiwKKyAgVElMRVBST19PUENfU0hSSUIsCisgIFRJTEVQUk9fT1BDX1NIUklCX1NOLAorICBUSUxFUFJPX09QQ19TSFJJSCwKKyAgVElMRVBST19PUENfU0hSSUhfU04sCisgIFRJTEVQUk9fT1BDX1NMVCwKKyAgVElMRVBST19PUENfU0xUX1NOLAorICBUSUxFUFJPX09QQ19TTFRfVSwKKyAgVElMRVBST19PUENfU0xUX1VfU04sCisgIFRJTEVQUk9fT1BDX1NMVEIsCisgIFRJTEVQUk9fT1BDX1NMVEJfU04sCisgIFRJTEVQUk9fT1BDX1NMVEJfVSwKKyAgVElMRVBST19PUENfU0xUQl9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRFLAorICBUSUxFUFJPX09QQ19TTFRFX1NOLAorICBUSUxFUFJPX09QQ19TTFRFX1UsCisgIFRJTEVQUk9fT1BDX1NMVEVfVV9TTiwKKyAgVElMRVBST19PUENfU0xURUIsCisgIFRJTEVQUk9fT1BDX1NMVEVCX1NOLAorICBUSUxFUFJPX09QQ19TTFRFQl9VLAorICBUSUxFUFJPX09QQ19TTFRFQl9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRFSCwKKyAgVElMRVBST19PUENfU0xURUhfU04sCisgIFRJTEVQUk9fT1BDX1NMVEVIX1UsCisgIFRJTEVQUk9fT1BDX1NMVEVIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NMVEgsCisgIFRJTEVQUk9fT1BDX1NMVEhfU04sCisgIFRJTEVQUk9fT1BDX1NMVEhfVSwKKyAgVElMRVBST19PUENfU0xUSF9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRJLAorICBUSUxFUFJPX09QQ19TTFRJX1NOLAorICBUSUxFUFJPX09QQ19TTFRJX1UsCisgIFRJTEVQUk9fT1BDX1NMVElfVV9TTiwKKyAgVElMRVBST19PUENfU0xUSUIsCisgIFRJTEVQUk9fT1BDX1NMVElCX1NOLAorICBUSUxFUFJPX09QQ19TTFRJQl9VLAorICBUSUxFUFJPX09QQ19TTFRJQl9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRJSCwKKyAgVElMRVBST19PUENfU0xUSUhfU04sCisgIFRJTEVQUk9fT1BDX1NMVElIX1UsCisgIFRJTEVQUk9fT1BDX1NMVElIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NORSwKKyAgVElMRVBST19PUENfU05FX1NOLAorICBUSUxFUFJPX09QQ19TTkVCLAorICBUSUxFUFJPX09QQ19TTkVCX1NOLAorICBUSUxFUFJPX09QQ19TTkVILAorICBUSUxFUFJPX09QQ19TTkVIX1NOLAorICBUSUxFUFJPX09QQ19TUkEsCisgIFRJTEVQUk9fT1BDX1NSQV9TTiwKKyAgVElMRVBST19PUENfU1JBQiwKKyAgVElMRVBST19PUENfU1JBQl9TTiwKKyAgVElMRVBST19PUENfU1JBSCwKKyAgVElMRVBST19PUENfU1JBSF9TTiwKKyAgVElMRVBST19PUENfU1JBSSwKKyAgVElMRVBST19PUENfU1JBSV9TTiwKKyAgVElMRVBST19PUENfU1JBSUIsCisgIFRJTEVQUk9fT1BDX1NSQUlCX1NOLAorICBUSUxFUFJPX09QQ19TUkFJSCwKKyAgVElMRVBST19PUENfU1JBSUhfU04sCisgIFRJTEVQUk9fT1BDX1NVQiwKKyAgVElMRVBST19PUENfU1VCX1NOLAorICBUSUxFUFJPX09QQ19TVUJCLAorICBUSUxFUFJPX09QQ19TVUJCX1NOLAorICBUSUxFUFJPX09QQ19TVUJCU19VLAorICBUSUxFUFJPX09QQ19TVUJCU19VX1NOLAorICBUSUxFUFJPX09QQ19TVUJILAorICBUSUxFUFJPX09QQ19TVUJIX1NOLAorICBUSUxFUFJPX09QQ19TVUJIUywKKyAgVElMRVBST19PUENfU1VCSFNfU04sCisgIFRJTEVQUk9fT1BDX1NVQlMsCisgIFRJTEVQUk9fT1BDX1NVQlNfU04sCisgIFRJTEVQUk9fT1BDX1NXLAorICBUSUxFUFJPX09QQ19TV0FERCwKKyAgVElMRVBST19PUENfU1dJTlQwLAorICBUSUxFUFJPX09QQ19TV0lOVDEsCisgIFRJTEVQUk9fT1BDX1NXSU5UMiwKKyAgVElMRVBST19PUENfU1dJTlQzLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMCwKKyAgVElMRVBST19PUENfVEJMSURYQjBfU04sCisgIFRJTEVQUk9fT1BDX1RCTElEWEIxLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMV9TTiwKKyAgVElMRVBST19PUENfVEJMSURYQjIsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIyX1NOLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMywKKyAgVElMRVBST19PUENfVEJMSURYQjNfU04sCisgIFRJTEVQUk9fT1BDX1ROUywKKyAgVElMRVBST19PUENfVE5TX1NOLAorICBUSUxFUFJPX09QQ19XSDY0LAorICBUSUxFUFJPX09QQ19YT1IsCisgIFRJTEVQUk9fT1BDX1hPUl9TTiwKKyAgVElMRVBST19PUENfWE9SSSwKKyAgVElMRVBST19PUENfWE9SSV9TTiwKKyAgVElMRVBST19PUENfTk9ORQorfSB0aWxlcHJvX21uZW1vbmljOworCisKKworCit0eXBlZGVmIGVudW0KK3sKKyAgVElMRVBST19QSVBFTElORV9YMCwKKyAgVElMRVBST19QSVBFTElORV9YMSwKKyAgVElMRVBST19QSVBFTElORV9ZMCwKKyAgVElMRVBST19QSVBFTElORV9ZMSwKKyAgVElMRVBST19QSVBFTElORV9ZMiwKK30gdGlsZXByb19waXBlbGluZTsKKworI2RlZmluZSB0aWxlcHJvX2lzX3hfcGlwZWxpbmUocCkgKChpbnQpKHApIDw9IChpbnQpVElMRVBST19QSVBFTElORV9YMSkKKwordHlwZWRlZiBlbnVtCit7CisgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwKKyAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwKKyAgVElMRVBST19PUF9UWVBFX0FERFJFU1MsCisgIFRJTEVQUk9fT1BfVFlQRV9TUFIKK30gdGlsZXByb19vcGVyYW5kX3R5cGU7CisKK3N0cnVjdCB0aWxlcHJvX29wZXJhbmQKK3sKKyAgLyogSXMgdGhpcyBvcGVyYW5kIGEgcmVnaXN0ZXIsIGltbWVkaWF0ZSBvciBhZGRyZXNzPyAqLworICB0aWxlcHJvX29wZXJhbmRfdHlwZSB0eXBlOworCisgIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBmb3IgdGhpcyBvcGVyYW5kLiAgKi8KKyAgc2lnbmVkIGludCBkZWZhdWx0X3JlbG9jIDogMTY7CisKKyAgLyogSG93IG1hbnkgYml0cyBpcyB0aGlzIHZhbHVlPyAodXNlZCBmb3IgcmFuZ2UgY2hlY2tpbmcpICovCisgIHVuc2lnbmVkIGludCBudW1fYml0cyA6IDU7CisKKyAgLyogSXMgdGhlIHZhbHVlIHNpZ25lZD8gKHVzZWQgZm9yIHJhbmdlIGNoZWNraW5nKSAqLworICB1bnNpZ25lZCBpbnQgaXNfc2lnbmVkIDogMTsKKworICAvKiBJcyB0aGlzIG9wZXJhbmQgYSBzb3VyY2UgcmVnaXN0ZXI/ICovCisgIHVuc2lnbmVkIGludCBpc19zcmNfcmVnIDogMTsKKworICAvKiBJcyB0aGlzIG9wZXJhbmQgd3JpdHRlbj8gKGkuZS4gaXMgaXQgYSBkZXN0aW5hdGlvbiByZWdpc3RlcikgKi8KKyAgdW5zaWduZWQgaW50IGlzX2Rlc3RfcmVnIDogMTsKKworICAvKiBJcyB0aGlzIG9wZXJhbmQgUEMtcmVsYXRpdmU/ICovCisgIHVuc2lnbmVkIGludCBpc19wY19yZWxhdGl2ZSA6IDE7CisKKyAgLyogQnkgaG93IG1hbnkgYml0cyBkbyB3ZSByaWdodCBzaGlmdCB0aGUgdmFsdWUgYmVmb3JlIGluc2VydGluZz8gKi8KKyAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQgOiAyOworCisgIC8qIFJldHVybiB0aGUgYml0cyBmb3IgdGhpcyBvcGVyYW5kIHRvIGJlIE9SZWQgaW50byBhbiBleGlzdGluZyBidW5kbGUuICovCisgIHRpbGVwcm9fYnVuZGxlX2JpdHMgKCppbnNlcnQpIChpbnQgb3ApOworCisgIC8qIEV4dHJhY3QgdGhpcyBvcGVyYW5kIGFuZCByZXR1cm4gaXQuICovCisgIHVuc2lnbmVkIGludCAoKmV4dHJhY3QpICh0aWxlcHJvX2J1bmRsZV9iaXRzIGJ1bmRsZSk7Cit9OworCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdGlsZXByb19vcGVyYW5kIHRpbGVwcm9fb3BlcmFuZHNbXTsKKworLyogT25lIGZpbml0ZS1zdGF0ZSBtYWNoaW5lIHBlciBwaXBlIGZvciByYXBpZCBpbnN0cnVjdGlvbiBkZWNvZGluZy4gKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCAqIGNvbnN0Cit0aWxlcHJvX2J1bmRsZV9kZWNvZGVyX2ZzbXNbVElMRVBST19OVU1fUElQRUxJTkVfRU5DT0RJTkdTXTsKKworCitzdHJ1Y3QgdGlsZXByb19vcGNvZGUKK3sKKyAgLyogVGhlIG9wY29kZSBtbmVtb25pYywgZS5nLiAiYWRkIiAqLworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIFRoZSBlbnVtIHZhbHVlIGZvciB0aGlzIG1uZW1vbmljLiAqLworICB0aWxlcHJvX21uZW1vbmljIG1uZW1vbmljOworCisgIC8qIEEgYml0IG1hc2sgb2Ygd2hpY2ggb2YgdGhlIGZpdmUgcGlwZXMgdGhpcyBpbnN0cnVjdGlvbgorICAgICBpcyBjb21wYXRpYmxlIHdpdGg6CisgICAgIFgwICAweDAxCisgICAgIFgxICAweDAyCisgICAgIFkwICAweDA0CisgICAgIFkxICAweDA4CisgICAgIFkyICAweDEwICovCisgIHVuc2lnbmVkIGNoYXIgcGlwZXM7CisKKyAgLyogSG93IG1hbnkgb3BlcmFuZHMgYXJlIHRoZXJlPyAqLworICB1bnNpZ25lZCBjaGFyIG51bV9vcGVyYW5kczsKKworICAvKiBXaGljaCByZWdpc3RlciBkb2VzIHRoaXMgd3JpdGUgaW1wbGljaXRseSwgb3IgVFJFR19aRVJPIGlmIG5vbmU/ICovCisgIHVuc2lnbmVkIGNoYXIgaW1wbGljaXRseV93cml0dGVuX3JlZ2lzdGVyOworCisgIC8qIENhbiB0aGlzIGJlIGJ1bmRsZWQgd2l0aCBvdGhlciBpbnN0cnVjdGlvbnMgKGFsbW9zdCBhbHdheXMgdHJ1ZSkuICovCisgIHVuc2lnbmVkIGNoYXIgY2FuX2J1bmRsZTsKKworICAvKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhbmRzLiBFYWNoIG9mIHRoZXNlIGlzIGFuCisgICAqIGluZGV4IGludG8gdGhlIHRpbGVwcm9fb3BlcmFuZHNbXSB0YWJsZS4gKi8KKyAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1tUSUxFUFJPX05VTV9QSVBFTElORV9FTkNPRElOR1NdW1RJTEVQUk9fTUFYX09QRVJBTkRTXTsKKworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWxlcHJvX29wY29kZSB0aWxlcHJvX29wY29kZXNbXTsKKworCisvKiBVc2VkIGZvciBub24tdGV4dHVhbCBkaXNhc3NlbWJseSBpbnRvIHN0cnVjdHMuICovCitzdHJ1Y3QgdGlsZXByb19kZWNvZGVkX2luc3RydWN0aW9uCit7CisgIGNvbnN0IHN0cnVjdCB0aWxlcHJvX29wY29kZSAqb3Bjb2RlOworICBjb25zdCBzdHJ1Y3QgdGlsZXByb19vcGVyYW5kICpvcGVyYW5kc1tUSUxFUFJPX01BWF9PUEVSQU5EU107CisgIGludCBvcGVyYW5kX3ZhbHVlc1tUSUxFUFJPX01BWF9PUEVSQU5EU107Cit9OworCisKKy8qIERpc2Fzc2VtYmxlIGEgYnVuZGxlIGludG8gYSBzdHJ1Y3QgZm9yIG1hY2hpbmUgcHJvY2Vzc2luZy4gKi8KK2V4dGVybiBpbnQgcGFyc2VfaW5zbl90aWxlcHJvKHRpbGVwcm9fYnVuZGxlX2JpdHMgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aWxlcHJvX2RlY29kZWRfaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRbVElMRVBST19NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEVdKTsKKworCisvKiBHaXZlbiBhIHNldCBvZiBidW5kbGUgYml0cyBhbmQgYSBzcGVjaWZpYyBwaXBlLCByZXR1cm5zIHdoaWNoCisgKiBpbnN0cnVjdGlvbiB0aGUgYnVuZGxlIGNvbnRhaW5zIGluIHRoYXQgcGlwZS4KKyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWxlcHJvX29wY29kZSAqCitmaW5kX29wY29kZSh0aWxlcHJvX2J1bmRsZV9iaXRzIGJpdHMsIHRpbGVwcm9fcGlwZWxpbmUgcGlwZSk7CisKKworCisjZW5kaWYgLyogb3Bjb2RlX3RpbGVwcm9faCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3RpbGUtZGVzY182NC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3RpbGUtZGVzY182NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTllZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdGlsZS1kZXNjXzY0LmgKQEAgLTAsMCArMSw0ODMgQEAKKy8qIFRJTEUtR3ggb3Bjb2RlIGluZm9ybWF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDExIFRpbGVyYSBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICoKKyAqCisgKgorICovCisKKyNpZm5kZWYgb3Bjb2RlX3RpbGVfaAorI2RlZmluZSBvcGNvZGVfdGlsZV9oCisKKyNpbmNsdWRlIDxhcmNoL29wY29kZS5oPgorCisKK2VudW0KK3sKKyAgVElMRUdYX01BWF9PUEVSQU5EUyA9IDQgLyogYmZleHRzICovCit9OworCit0eXBlZGVmIGVudW0KK3sKKyAgVElMRUdYX09QQ19CUFQsCisgIFRJTEVHWF9PUENfSU5GTywKKyAgVElMRUdYX09QQ19JTkZPTCwKKyAgVElMRUdYX09QQ19NT1ZFLAorICBUSUxFR1hfT1BDX01PVkVJLAorICBUSUxFR1hfT1BDX01PVkVMSSwKKyAgVElMRUdYX09QQ19QUkVGRVRDSCwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9BRERfTDEsCisgIFRJTEVHWF9PUENfUFJFRkVUQ0hfQUREX0wxX0ZBVUxULAorICBUSUxFR1hfT1BDX1BSRUZFVENIX0FERF9MMiwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9BRERfTDJfRkFVTFQsCisgIFRJTEVHWF9PUENfUFJFRkVUQ0hfQUREX0wzLAorICBUSUxFR1hfT1BDX1BSRUZFVENIX0FERF9MM19GQVVMVCwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMSwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMV9GQVVMVCwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMiwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMl9GQVVMVCwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMywKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MM19GQVVMVCwKKyAgVElMRUdYX09QQ19SQUlTRSwKKyAgVElMRUdYX09QQ19BREQsCisgIFRJTEVHWF9PUENfQURESSwKKyAgVElMRUdYX09QQ19BRERMSSwKKyAgVElMRUdYX09QQ19BRERYLAorICBUSUxFR1hfT1BDX0FERFhJLAorICBUSUxFR1hfT1BDX0FERFhMSSwKKyAgVElMRUdYX09QQ19BRERYU0MsCisgIFRJTEVHWF9PUENfQU5ELAorICBUSUxFR1hfT1BDX0FOREksCisgIFRJTEVHWF9PUENfQkVRWiwKKyAgVElMRUdYX09QQ19CRVFaVCwKKyAgVElMRUdYX09QQ19CRkVYVFMsCisgIFRJTEVHWF9PUENfQkZFWFRVLAorICBUSUxFR1hfT1BDX0JGSU5TLAorICBUSUxFR1hfT1BDX0JHRVosCisgIFRJTEVHWF9PUENfQkdFWlQsCisgIFRJTEVHWF9PUENfQkdUWiwKKyAgVElMRUdYX09QQ19CR1RaVCwKKyAgVElMRUdYX09QQ19CTEJDLAorICBUSUxFR1hfT1BDX0JMQkNULAorICBUSUxFR1hfT1BDX0JMQlMsCisgIFRJTEVHWF9PUENfQkxCU1QsCisgIFRJTEVHWF9PUENfQkxFWiwKKyAgVElMRUdYX09QQ19CTEVaVCwKKyAgVElMRUdYX09QQ19CTFRaLAorICBUSUxFR1hfT1BDX0JMVFpULAorICBUSUxFR1hfT1BDX0JORVosCisgIFRJTEVHWF9PUENfQk5FWlQsCisgIFRJTEVHWF9PUENfQ0xaLAorICBUSUxFR1hfT1BDX0NNT1ZFUVosCisgIFRJTEVHWF9PUENfQ01PVk5FWiwKKyAgVElMRUdYX09QQ19DTVBFUSwKKyAgVElMRUdYX09QQ19DTVBFUUksCisgIFRJTEVHWF9PUENfQ01QRVhDSCwKKyAgVElMRUdYX09QQ19DTVBFWENINCwKKyAgVElMRUdYX09QQ19DTVBMRVMsCisgIFRJTEVHWF9PUENfQ01QTEVVLAorICBUSUxFR1hfT1BDX0NNUExUUywKKyAgVElMRUdYX09QQ19DTVBMVFNJLAorICBUSUxFR1hfT1BDX0NNUExUVSwKKyAgVElMRUdYX09QQ19DTVBMVFVJLAorICBUSUxFR1hfT1BDX0NNUE5FLAorICBUSUxFR1hfT1BDX0NNVUwsCisgIFRJTEVHWF9PUENfQ01VTEEsCisgIFRJTEVHWF9PUENfQ01VTEFGLAorICBUSUxFR1hfT1BDX0NNVUxGLAorICBUSUxFR1hfT1BDX0NNVUxGUiwKKyAgVElMRUdYX09QQ19DTVVMSCwKKyAgVElMRUdYX09QQ19DTVVMSFIsCisgIFRJTEVHWF9PUENfQ1JDMzJfMzIsCisgIFRJTEVHWF9PUENfQ1JDMzJfOCwKKyAgVElMRUdYX09QQ19DVFosCisgIFRJTEVHWF9PUENfREJMQUxJR04sCisgIFRJTEVHWF9PUENfREJMQUxJR04yLAorICBUSUxFR1hfT1BDX0RCTEFMSUdONCwKKyAgVElMRUdYX09QQ19EQkxBTElHTjYsCisgIFRJTEVHWF9PUENfRFJBSU4sCisgIFRJTEVHWF9PUENfRFRMQlBSLAorICBUSUxFR1hfT1BDX0VYQ0gsCisgIFRJTEVHWF9PUENfRVhDSDQsCisgIFRJTEVHWF9PUENfRkRPVUJMRV9BRERfRkxBR1MsCisgIFRJTEVHWF9PUENfRkRPVUJMRV9BRERTVUIsCisgIFRJTEVHWF9PUENfRkRPVUJMRV9NVUxfRkxBR1MsCisgIFRJTEVHWF9PUENfRkRPVUJMRV9QQUNLMSwKKyAgVElMRUdYX09QQ19GRE9VQkxFX1BBQ0syLAorICBUSUxFR1hfT1BDX0ZET1VCTEVfU1VCX0ZMQUdTLAorICBUSUxFR1hfT1BDX0ZET1VCTEVfVU5QQUNLX01BWCwKKyAgVElMRUdYX09QQ19GRE9VQkxFX1VOUEFDS19NSU4sCisgIFRJTEVHWF9PUENfRkVUQ0hBREQsCisgIFRJTEVHWF9PUENfRkVUQ0hBREQ0LAorICBUSUxFR1hfT1BDX0ZFVENIQURER0VaLAorICBUSUxFR1hfT1BDX0ZFVENIQURER0VaNCwKKyAgVElMRUdYX09QQ19GRVRDSEFORCwKKyAgVElMRUdYX09QQ19GRVRDSEFORDQsCisgIFRJTEVHWF9PUENfRkVUQ0hPUiwKKyAgVElMRUdYX09QQ19GRVRDSE9SNCwKKyAgVElMRUdYX09QQ19GSU5WLAorICBUSUxFR1hfT1BDX0ZMVVNILAorICBUSUxFR1hfT1BDX0ZMVVNIV0IsCisgIFRJTEVHWF9PUENfRk5PUCwKKyAgVElMRUdYX09QQ19GU0lOR0xFX0FERDEsCisgIFRJTEVHWF9PUENfRlNJTkdMRV9BRERTVUIyLAorICBUSUxFR1hfT1BDX0ZTSU5HTEVfTVVMMSwKKyAgVElMRUdYX09QQ19GU0lOR0xFX01VTDIsCisgIFRJTEVHWF9PUENfRlNJTkdMRV9QQUNLMSwKKyAgVElMRUdYX09QQ19GU0lOR0xFX1BBQ0syLAorICBUSUxFR1hfT1BDX0ZTSU5HTEVfU1VCMSwKKyAgVElMRUdYX09QQ19JQ09ILAorICBUSUxFR1hfT1BDX0lMTCwKKyAgVElMRUdYX09QQ19JTlYsCisgIFRJTEVHWF9PUENfSVJFVCwKKyAgVElMRUdYX09QQ19KLAorICBUSUxFR1hfT1BDX0pBTCwKKyAgVElMRUdYX09QQ19KQUxSLAorICBUSUxFR1hfT1BDX0pBTFJQLAorICBUSUxFR1hfT1BDX0pSLAorICBUSUxFR1hfT1BDX0pSUCwKKyAgVElMRUdYX09QQ19MRCwKKyAgVElMRUdYX09QQ19MRDFTLAorICBUSUxFR1hfT1BDX0xEMVNfQURELAorICBUSUxFR1hfT1BDX0xEMVUsCisgIFRJTEVHWF9PUENfTEQxVV9BREQsCisgIFRJTEVHWF9PUENfTEQyUywKKyAgVElMRUdYX09QQ19MRDJTX0FERCwKKyAgVElMRUdYX09QQ19MRDJVLAorICBUSUxFR1hfT1BDX0xEMlVfQURELAorICBUSUxFR1hfT1BDX0xENFMsCisgIFRJTEVHWF9PUENfTEQ0U19BREQsCisgIFRJTEVHWF9PUENfTEQ0VSwKKyAgVElMRUdYX09QQ19MRDRVX0FERCwKKyAgVElMRUdYX09QQ19MRF9BREQsCisgIFRJTEVHWF9PUENfTEROQSwKKyAgVElMRUdYX09QQ19MRE5BX0FERCwKKyAgVElMRUdYX09QQ19MRE5ULAorICBUSUxFR1hfT1BDX0xETlQxUywKKyAgVElMRUdYX09QQ19MRE5UMVNfQURELAorICBUSUxFR1hfT1BDX0xETlQxVSwKKyAgVElMRUdYX09QQ19MRE5UMVVfQURELAorICBUSUxFR1hfT1BDX0xETlQyUywKKyAgVElMRUdYX09QQ19MRE5UMlNfQURELAorICBUSUxFR1hfT1BDX0xETlQyVSwKKyAgVElMRUdYX09QQ19MRE5UMlVfQURELAorICBUSUxFR1hfT1BDX0xETlQ0UywKKyAgVElMRUdYX09QQ19MRE5UNFNfQURELAorICBUSUxFR1hfT1BDX0xETlQ0VSwKKyAgVElMRUdYX09QQ19MRE5UNFVfQURELAorICBUSUxFR1hfT1BDX0xETlRfQURELAorICBUSUxFR1hfT1BDX0xOSywKKyAgVElMRUdYX09QQ19NRiwKKyAgVElMRUdYX09QQ19NRlNQUiwKKyAgVElMRUdYX09QQ19NTSwKKyAgVElMRUdYX09QQ19NTlosCisgIFRJTEVHWF9PUENfTVRTUFIsCisgIFRJTEVHWF9PUENfTVVMX0hTX0hTLAorICBUSUxFR1hfT1BDX01VTF9IU19IVSwKKyAgVElMRUdYX09QQ19NVUxfSFNfTFMsCisgIFRJTEVHWF9PUENfTVVMX0hTX0xVLAorICBUSUxFR1hfT1BDX01VTF9IVV9IVSwKKyAgVElMRUdYX09QQ19NVUxfSFVfTFMsCisgIFRJTEVHWF9PUENfTVVMX0hVX0xVLAorICBUSUxFR1hfT1BDX01VTF9MU19MUywKKyAgVElMRUdYX09QQ19NVUxfTFNfTFUsCisgIFRJTEVHWF9PUENfTVVMX0xVX0xVLAorICBUSUxFR1hfT1BDX01VTEFfSFNfSFMsCisgIFRJTEVHWF9PUENfTVVMQV9IU19IVSwKKyAgVElMRUdYX09QQ19NVUxBX0hTX0xTLAorICBUSUxFR1hfT1BDX01VTEFfSFNfTFUsCisgIFRJTEVHWF9PUENfTVVMQV9IVV9IVSwKKyAgVElMRUdYX09QQ19NVUxBX0hVX0xTLAorICBUSUxFR1hfT1BDX01VTEFfSFVfTFUsCisgIFRJTEVHWF9PUENfTVVMQV9MU19MUywKKyAgVElMRUdYX09QQ19NVUxBX0xTX0xVLAorICBUSUxFR1hfT1BDX01VTEFfTFVfTFUsCisgIFRJTEVHWF9PUENfTVVMQVgsCisgIFRJTEVHWF9PUENfTVVMWCwKKyAgVElMRUdYX09QQ19NWiwKKyAgVElMRUdYX09QQ19OQVAsCisgIFRJTEVHWF9PUENfTk9QLAorICBUSUxFR1hfT1BDX05PUiwKKyAgVElMRUdYX09QQ19PUiwKKyAgVElMRUdYX09QQ19PUkksCisgIFRJTEVHWF9PUENfUENOVCwKKyAgVElMRUdYX09QQ19SRVZCSVRTLAorICBUSUxFR1hfT1BDX1JFVkJZVEVTLAorICBUSUxFR1hfT1BDX1JPVEwsCisgIFRJTEVHWF9PUENfUk9UTEksCisgIFRJTEVHWF9PUENfU0hMLAorICBUSUxFR1hfT1BDX1NITDE2SU5TTEksCisgIFRJTEVHWF9PUENfU0hMMUFERCwKKyAgVElMRUdYX09QQ19TSEwxQUREWCwKKyAgVElMRUdYX09QQ19TSEwyQURELAorICBUSUxFR1hfT1BDX1NITDJBRERYLAorICBUSUxFR1hfT1BDX1NITDNBREQsCisgIFRJTEVHWF9PUENfU0hMM0FERFgsCisgIFRJTEVHWF9PUENfU0hMSSwKKyAgVElMRUdYX09QQ19TSExYLAorICBUSUxFR1hfT1BDX1NITFhJLAorICBUSUxFR1hfT1BDX1NIUlMsCisgIFRJTEVHWF9PUENfU0hSU0ksCisgIFRJTEVHWF9PUENfU0hSVSwKKyAgVElMRUdYX09QQ19TSFJVSSwKKyAgVElMRUdYX09QQ19TSFJVWCwKKyAgVElMRUdYX09QQ19TSFJVWEksCisgIFRJTEVHWF9PUENfU0hVRkZMRUJZVEVTLAorICBUSUxFR1hfT1BDX1NULAorICBUSUxFR1hfT1BDX1NUMSwKKyAgVElMRUdYX09QQ19TVDFfQURELAorICBUSUxFR1hfT1BDX1NUMiwKKyAgVElMRUdYX09QQ19TVDJfQURELAorICBUSUxFR1hfT1BDX1NUNCwKKyAgVElMRUdYX09QQ19TVDRfQURELAorICBUSUxFR1hfT1BDX1NUX0FERCwKKyAgVElMRUdYX09QQ19TVE5ULAorICBUSUxFR1hfT1BDX1NUTlQxLAorICBUSUxFR1hfT1BDX1NUTlQxX0FERCwKKyAgVElMRUdYX09QQ19TVE5UMiwKKyAgVElMRUdYX09QQ19TVE5UMl9BREQsCisgIFRJTEVHWF9PUENfU1ROVDQsCisgIFRJTEVHWF9PUENfU1ROVDRfQURELAorICBUSUxFR1hfT1BDX1NUTlRfQURELAorICBUSUxFR1hfT1BDX1NVQiwKKyAgVElMRUdYX09QQ19TVUJYLAorICBUSUxFR1hfT1BDX1NVQlhTQywKKyAgVElMRUdYX09QQ19TV0lOVDAsCisgIFRJTEVHWF9PUENfU1dJTlQxLAorICBUSUxFR1hfT1BDX1NXSU5UMiwKKyAgVElMRUdYX09QQ19TV0lOVDMsCisgIFRJTEVHWF9PUENfVEJMSURYQjAsCisgIFRJTEVHWF9PUENfVEJMSURYQjEsCisgIFRJTEVHWF9PUENfVEJMSURYQjIsCisgIFRJTEVHWF9PUENfVEJMSURYQjMsCisgIFRJTEVHWF9PUENfVjFBREQsCisgIFRJTEVHWF9PUENfVjFBRERJLAorICBUSUxFR1hfT1BDX1YxQUREVUMsCisgIFRJTEVHWF9PUENfVjFBRElGRlUsCisgIFRJTEVHWF9PUENfVjFBVkdVLAorICBUSUxFR1hfT1BDX1YxQ01QRVEsCisgIFRJTEVHWF9PUENfVjFDTVBFUUksCisgIFRJTEVHWF9PUENfVjFDTVBMRVMsCisgIFRJTEVHWF9PUENfVjFDTVBMRVUsCisgIFRJTEVHWF9PUENfVjFDTVBMVFMsCisgIFRJTEVHWF9PUENfVjFDTVBMVFNJLAorICBUSUxFR1hfT1BDX1YxQ01QTFRVLAorICBUSUxFR1hfT1BDX1YxQ01QTFRVSSwKKyAgVElMRUdYX09QQ19WMUNNUE5FLAorICBUSUxFR1hfT1BDX1YxRERPVFBVLAorICBUSUxFR1hfT1BDX1YxRERPVFBVQSwKKyAgVElMRUdYX09QQ19WMURET1RQVVMsCisgIFRJTEVHWF9PUENfVjFERE9UUFVTQSwKKyAgVElMRUdYX09QQ19WMURPVFAsCisgIFRJTEVHWF9PUENfVjFET1RQQSwKKyAgVElMRUdYX09QQ19WMURPVFBVLAorICBUSUxFR1hfT1BDX1YxRE9UUFVBLAorICBUSUxFR1hfT1BDX1YxRE9UUFVTLAorICBUSUxFR1hfT1BDX1YxRE9UUFVTQSwKKyAgVElMRUdYX09QQ19WMUlOVF9ILAorICBUSUxFR1hfT1BDX1YxSU5UX0wsCisgIFRJTEVHWF9PUENfVjFNQVhVLAorICBUSUxFR1hfT1BDX1YxTUFYVUksCisgIFRJTEVHWF9PUENfVjFNSU5VLAorICBUSUxFR1hfT1BDX1YxTUlOVUksCisgIFRJTEVHWF9PUENfVjFNTlosCisgIFRJTEVHWF9PUENfVjFNVUxUVSwKKyAgVElMRUdYX09QQ19WMU1VTFUsCisgIFRJTEVHWF9PUENfVjFNVUxVUywKKyAgVElMRUdYX09QQ19WMU1aLAorICBUSUxFR1hfT1BDX1YxU0FEQVUsCisgIFRJTEVHWF9PUENfVjFTQURVLAorICBUSUxFR1hfT1BDX1YxU0hMLAorICBUSUxFR1hfT1BDX1YxU0hMSSwKKyAgVElMRUdYX09QQ19WMVNIUlMsCisgIFRJTEVHWF9PUENfVjFTSFJTSSwKKyAgVElMRUdYX09QQ19WMVNIUlUsCisgIFRJTEVHWF9PUENfVjFTSFJVSSwKKyAgVElMRUdYX09QQ19WMVNVQiwKKyAgVElMRUdYX09QQ19WMVNVQlVDLAorICBUSUxFR1hfT1BDX1YyQURELAorICBUSUxFR1hfT1BDX1YyQURESSwKKyAgVElMRUdYX09QQ19WMkFERFNDLAorICBUSUxFR1hfT1BDX1YyQURJRkZTLAorICBUSUxFR1hfT1BDX1YyQVZHUywKKyAgVElMRUdYX09QQ19WMkNNUEVRLAorICBUSUxFR1hfT1BDX1YyQ01QRVFJLAorICBUSUxFR1hfT1BDX1YyQ01QTEVTLAorICBUSUxFR1hfT1BDX1YyQ01QTEVVLAorICBUSUxFR1hfT1BDX1YyQ01QTFRTLAorICBUSUxFR1hfT1BDX1YyQ01QTFRTSSwKKyAgVElMRUdYX09QQ19WMkNNUExUVSwKKyAgVElMRUdYX09QQ19WMkNNUExUVUksCisgIFRJTEVHWF9PUENfVjJDTVBORSwKKyAgVElMRUdYX09QQ19WMkRPVFAsCisgIFRJTEVHWF9PUENfVjJET1RQQSwKKyAgVElMRUdYX09QQ19WMklOVF9ILAorICBUSUxFR1hfT1BDX1YySU5UX0wsCisgIFRJTEVHWF9PUENfVjJNQVhTLAorICBUSUxFR1hfT1BDX1YyTUFYU0ksCisgIFRJTEVHWF9PUENfVjJNSU5TLAorICBUSUxFR1hfT1BDX1YyTUlOU0ksCisgIFRJTEVHWF9PUENfVjJNTlosCisgIFRJTEVHWF9PUENfVjJNVUxGU0MsCisgIFRJTEVHWF9PUENfVjJNVUxTLAorICBUSUxFR1hfT1BDX1YyTVVMVFMsCisgIFRJTEVHWF9PUENfVjJNWiwKKyAgVElMRUdYX09QQ19WMlBBQ0tILAorICBUSUxFR1hfT1BDX1YyUEFDS0wsCisgIFRJTEVHWF9PUENfVjJQQUNLVUMsCisgIFRJTEVHWF9PUENfVjJTQURBUywKKyAgVElMRUdYX09QQ19WMlNBREFVLAorICBUSUxFR1hfT1BDX1YyU0FEUywKKyAgVElMRUdYX09QQ19WMlNBRFUsCisgIFRJTEVHWF9PUENfVjJTSEwsCisgIFRJTEVHWF9PUENfVjJTSExJLAorICBUSUxFR1hfT1BDX1YyU0hMU0MsCisgIFRJTEVHWF9PUENfVjJTSFJTLAorICBUSUxFR1hfT1BDX1YyU0hSU0ksCisgIFRJTEVHWF9PUENfVjJTSFJVLAorICBUSUxFR1hfT1BDX1YyU0hSVUksCisgIFRJTEVHWF9PUENfVjJTVUIsCisgIFRJTEVHWF9PUENfVjJTVUJTQywKKyAgVElMRUdYX09QQ19WNEFERCwKKyAgVElMRUdYX09QQ19WNEFERFNDLAorICBUSUxFR1hfT1BDX1Y0SU5UX0gsCisgIFRJTEVHWF9PUENfVjRJTlRfTCwKKyAgVElMRUdYX09QQ19WNFBBQ0tTQywKKyAgVElMRUdYX09QQ19WNFNITCwKKyAgVElMRUdYX09QQ19WNFNITFNDLAorICBUSUxFR1hfT1BDX1Y0U0hSUywKKyAgVElMRUdYX09QQ19WNFNIUlUsCisgIFRJTEVHWF9PUENfVjRTVUIsCisgIFRJTEVHWF9PUENfVjRTVUJTQywKKyAgVElMRUdYX09QQ19XSDY0LAorICBUSUxFR1hfT1BDX1hPUiwKKyAgVElMRUdYX09QQ19YT1JJLAorICBUSUxFR1hfT1BDX05PTkUKK30gdGlsZWd4X21uZW1vbmljOworCisKKwordHlwZWRlZiBlbnVtCit7CisgIFRJTEVHWF9QSVBFTElORV9YMCwKKyAgVElMRUdYX1BJUEVMSU5FX1gxLAorICBUSUxFR1hfUElQRUxJTkVfWTAsCisgIFRJTEVHWF9QSVBFTElORV9ZMSwKKyAgVElMRUdYX1BJUEVMSU5FX1kyLAorfSB0aWxlZ3hfcGlwZWxpbmU7CisKKyNkZWZpbmUgdGlsZWd4X2lzX3hfcGlwZWxpbmUocCkgKChpbnQpKHApIDw9IChpbnQpVElMRUdYX1BJUEVMSU5FX1gxKQorCit0eXBlZGVmIGVudW0KK3sKKyAgVElMRUdYX09QX1RZUEVfUkVHSVNURVIsCisgIFRJTEVHWF9PUF9UWVBFX0lNTUVESUFURSwKKyAgVElMRUdYX09QX1RZUEVfQUREUkVTUywKKyAgVElMRUdYX09QX1RZUEVfU1BSCit9IHRpbGVneF9vcGVyYW5kX3R5cGU7CisKK3N0cnVjdCB0aWxlZ3hfb3BlcmFuZAoreworICAvKiBJcyB0aGlzIG9wZXJhbmQgYSByZWdpc3RlciwgaW1tZWRpYXRlIG9yIGFkZHJlc3M/ICovCisgIHRpbGVneF9vcGVyYW5kX3R5cGUgdHlwZTsKKworICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIHR5cGUgZm9yIHRoaXMgb3BlcmFuZC4gICovCisgIHNpZ25lZCBpbnQgZGVmYXVsdF9yZWxvYyA6IDE2OworCisgIC8qIEhvdyBtYW55IGJpdHMgaXMgdGhpcyB2YWx1ZT8gKHVzZWQgZm9yIHJhbmdlIGNoZWNraW5nKSAqLworICB1bnNpZ25lZCBpbnQgbnVtX2JpdHMgOiA1OworCisgIC8qIElzIHRoZSB2YWx1ZSBzaWduZWQ/ICh1c2VkIGZvciByYW5nZSBjaGVja2luZykgKi8KKyAgdW5zaWduZWQgaW50IGlzX3NpZ25lZCA6IDE7CisKKyAgLyogSXMgdGhpcyBvcGVyYW5kIGEgc291cmNlIHJlZ2lzdGVyPyAqLworICB1bnNpZ25lZCBpbnQgaXNfc3JjX3JlZyA6IDE7CisKKyAgLyogSXMgdGhpcyBvcGVyYW5kIHdyaXR0ZW4/IChpLmUuIGlzIGl0IGEgZGVzdGluYXRpb24gcmVnaXN0ZXIpICovCisgIHVuc2lnbmVkIGludCBpc19kZXN0X3JlZyA6IDE7CisKKyAgLyogSXMgdGhpcyBvcGVyYW5kIFBDLXJlbGF0aXZlPyAqLworICB1bnNpZ25lZCBpbnQgaXNfcGNfcmVsYXRpdmUgOiAxOworCisgIC8qIEJ5IGhvdyBtYW55IGJpdHMgZG8gd2UgcmlnaHQgc2hpZnQgdGhlIHZhbHVlIGJlZm9yZSBpbnNlcnRpbmc/ICovCisgIHVuc2lnbmVkIGludCByaWdodHNoaWZ0IDogMjsKKworICAvKiBSZXR1cm4gdGhlIGJpdHMgZm9yIHRoaXMgb3BlcmFuZCB0byBiZSBPUmVkIGludG8gYW4gZXhpc3RpbmcgYnVuZGxlLiAqLworICB0aWxlZ3hfYnVuZGxlX2JpdHMgKCppbnNlcnQpIChpbnQgb3ApOworCisgIC8qIEV4dHJhY3QgdGhpcyBvcGVyYW5kIGFuZCByZXR1cm4gaXQuICovCisgIHVuc2lnbmVkIGludCAoKmV4dHJhY3QpICh0aWxlZ3hfYnVuZGxlX2JpdHMgYnVuZGxlKTsKK307CisKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWxlZ3hfb3BlcmFuZCB0aWxlZ3hfb3BlcmFuZHNbXTsKKworLyogT25lIGZpbml0ZS1zdGF0ZSBtYWNoaW5lIHBlciBwaXBlIGZvciByYXBpZCBpbnN0cnVjdGlvbiBkZWNvZGluZy4gKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCAqIGNvbnN0Cit0aWxlZ3hfYnVuZGxlX2RlY29kZXJfZnNtc1tUSUxFR1hfTlVNX1BJUEVMSU5FX0VOQ09ESU5HU107CisKKworc3RydWN0IHRpbGVneF9vcGNvZGUKK3sKKyAgLyogVGhlIG9wY29kZSBtbmVtb25pYywgZS5nLiAiYWRkIiAqLworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIFRoZSBlbnVtIHZhbHVlIGZvciB0aGlzIG1uZW1vbmljLiAqLworICB0aWxlZ3hfbW5lbW9uaWMgbW5lbW9uaWM7CisKKyAgLyogQSBiaXQgbWFzayBvZiB3aGljaCBvZiB0aGUgZml2ZSBwaXBlcyB0aGlzIGluc3RydWN0aW9uCisgICAgIGlzIGNvbXBhdGlibGUgd2l0aDoKKyAgICAgWDAgIDB4MDEKKyAgICAgWDEgIDB4MDIKKyAgICAgWTAgIDB4MDQKKyAgICAgWTEgIDB4MDgKKyAgICAgWTIgIDB4MTAgKi8KKyAgdW5zaWduZWQgY2hhciBwaXBlczsKKworICAvKiBIb3cgbWFueSBvcGVyYW5kcyBhcmUgdGhlcmU/ICovCisgIHVuc2lnbmVkIGNoYXIgbnVtX29wZXJhbmRzOworCisgIC8qIFdoaWNoIHJlZ2lzdGVyIGRvZXMgdGhpcyB3cml0ZSBpbXBsaWNpdGx5LCBvciBUUkVHX1pFUk8gaWYgbm9uZT8gKi8KKyAgdW5zaWduZWQgY2hhciBpbXBsaWNpdGx5X3dyaXR0ZW5fcmVnaXN0ZXI7CisKKyAgLyogQ2FuIHRoaXMgYmUgYnVuZGxlZCB3aXRoIG90aGVyIGluc3RydWN0aW9ucyAoYWxtb3N0IGFsd2F5cyB0cnVlKS4gKi8KKyAgdW5zaWduZWQgY2hhciBjYW5fYnVuZGxlOworCisgIC8qIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmFuZHMuIEVhY2ggb2YgdGhlc2UgaXMgYW4KKyAgICogaW5kZXggaW50byB0aGUgdGlsZWd4X29wZXJhbmRzW10gdGFibGUuICovCisgIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbVElMRUdYX05VTV9QSVBFTElORV9FTkNPRElOR1NdW1RJTEVHWF9NQVhfT1BFUkFORFNdOworCit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHRpbGVneF9vcGNvZGUgdGlsZWd4X29wY29kZXNbXTsKKworLyogVXNlZCBmb3Igbm9uLXRleHR1YWwgZGlzYXNzZW1ibHkgaW50byBzdHJ1Y3RzLiAqLworc3RydWN0IHRpbGVneF9kZWNvZGVkX2luc3RydWN0aW9uCit7CisgIGNvbnN0IHN0cnVjdCB0aWxlZ3hfb3Bjb2RlICpvcGNvZGU7CisgIGNvbnN0IHN0cnVjdCB0aWxlZ3hfb3BlcmFuZCAqb3BlcmFuZHNbVElMRUdYX01BWF9PUEVSQU5EU107CisgIGxvbmcgbG9uZyBvcGVyYW5kX3ZhbHVlc1tUSUxFR1hfTUFYX09QRVJBTkRTXTsKK307CisKKworLyogRGlzYXNzZW1ibGUgYSBidW5kbGUgaW50byBhIHN0cnVjdCBmb3IgbWFjaGluZSBwcm9jZXNzaW5nLiAqLworZXh0ZXJuIGludCBwYXJzZV9pbnNuX3RpbGVneCh0aWxlZ3hfYnVuZGxlX2JpdHMgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGlsZWd4X2RlY29kZWRfaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFtUSUxFR1hfTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFXSk7CisKKworCisjZW5kaWYgLyogb3Bjb2RlX3RpbGVneF9oICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL2JhY2t0cmFjZS5jIGIvYXJjaC90aWxlL2tlcm5lbC9iYWNrdHJhY2UuYwppbmRleCAxZGM3MWVhLi45MDkyY2U4IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL2JhY2t0cmFjZS5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvYmFja3RyYWNlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMTAgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTEgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtMTUsMTMgKzE1LDExIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNtL2JhY2t0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9vcGNvZGUtdGlsZS5oPgorI2luY2x1ZGUgPGFzbS90aWxlLWRlc2MuaD4KICNpbmNsdWRlIDxhcmNoL2FiaS5oPgogCiAjaWZkZWYgX190aWxlZ3hfXwotI2RlZmluZSB0aWxlX2J1bmRsZV9iaXRzIHRpbGVneF9idW5kbGVfYml0cwogI2RlZmluZSBUSUxFX01BWF9JTlNUUlVDVElPTlNfUEVSX0JVTkRMRSBUSUxFR1hfTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFCi0jZGVmaW5lIFRJTEVfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyBUSUxFR1hfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUwogI2RlZmluZSB0aWxlX2RlY29kZWRfaW5zdHJ1Y3Rpb24gdGlsZWd4X2RlY29kZWRfaW5zdHJ1Y3Rpb24KICNkZWZpbmUgdGlsZV9tbmVtb25pYyB0aWxlZ3hfbW5lbW9uaWMKICNkZWZpbmUgcGFyc2VfaW5zbl90aWxlIHBhcnNlX2luc25fdGlsZWd4CkBAIC0zNSw3ICszMywxOCBAQAogI2RlZmluZSBPUENPREVfU1RPUkUgVElMRUdYX09QQ19TVAogdHlwZWRlZiBsb25nIGxvbmcgYnRfaW50X3JlZ190OwogI2Vsc2UKLSNkZWZpbmUgT1BDT0RFX1NUT1JFIFRJTEVfT1BDX1NXCisjZGVmaW5lIFRJTEVfTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFIFRJTEVQUk9fTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFCisjZGVmaW5lIHRpbGVfZGVjb2RlZF9pbnN0cnVjdGlvbiB0aWxlcHJvX2RlY29kZWRfaW5zdHJ1Y3Rpb24KKyNkZWZpbmUgdGlsZV9tbmVtb25pYyB0aWxlcHJvX21uZW1vbmljCisjZGVmaW5lIHBhcnNlX2luc25fdGlsZSBwYXJzZV9pbnNuX3RpbGVwcm8KKyNkZWZpbmUgVElMRV9PUENfSVJFVCBUSUxFUFJPX09QQ19JUkVUCisjZGVmaW5lIFRJTEVfT1BDX0FEREkgVElMRVBST19PUENfQURESQorI2RlZmluZSBUSUxFX09QQ19BRERMSSBUSUxFUFJPX09QQ19BRERMSQorI2RlZmluZSBUSUxFX09QQ19JTkZPIFRJTEVQUk9fT1BDX0lORk8KKyNkZWZpbmUgVElMRV9PUENfSU5GT0wgVElMRVBST19PUENfSU5GT0wKKyNkZWZpbmUgVElMRV9PUENfSlJQIFRJTEVQUk9fT1BDX0pSUAorI2RlZmluZSBUSUxFX09QQ19NT1ZFIFRJTEVQUk9fT1BDX01PVkUKKyNkZWZpbmUgT1BDT0RFX1NUT1JFIFRJTEVQUk9fT1BDX1NXCiB0eXBlZGVmIGludCBidF9pbnRfcmVnX3Q7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvdGlsZS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggMjhmYTZlYy4uYjkwYWI5OSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3RpbGUva2VybmVsL21vZHVsZS5jCkBAIC0yMCw5ICsyMCw5IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxhc20vb3Bjb2RlLXRpbGUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9ob21lY2FjaGUuaD4KKyNpbmNsdWRlIDxhcmNoL29wY29kZS5oPgogCiAjaWZkZWYgX190aWxlZ3hfXwogIyBkZWZpbmUgRWxmX1JlbGEgRWxmNjRfUmVsYQpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9zaW5nbGVfc3RlcC5jIGIvYXJjaC90aWxlL2tlcm5lbC9zaW5nbGVfc3RlcC5jCmluZGV4IDQwMzJjYTguLmI3YTg3OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvc2luZ2xlX3N0ZXAuYworKysgYi9hcmNoL3RpbGUva2VybmVsL3NpbmdsZV9zdGVwLmMKQEAgLTI1LDkgKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL29wY29kZS10aWxlLmg+Ci0jaW5jbHVkZSA8YXNtL29wY29kZV9jb25zdGFudHMuaD4KICNpbmNsdWRlIDxhcmNoL2FiaS5oPgorI2luY2x1ZGUgPGFyY2gvb3Bjb2RlLmg+CiAKICNkZWZpbmUgc2lnbkV4dGVuZDE3KHZhbCkgc2lnbl9leHRlbmQoKHZhbCksIDE3KQogI2RlZmluZSBUSUxFX1gxX01BU0sgKDB4ZmZmZmZmZmZVTEwgPDwgMzEpCkBAIC0xMTgsNyArMTE3LDcgQEAKIAlpbnQgdmFsX3JlZywgYWRkcl9yZWcsIGVyciwgdmFsOwogCiAJLyogR2V0IGFkZHJlc3MgYW5kIHZhbHVlIHJlZ2lzdGVycyAqLwotCWlmIChidW5kbGUgJiBUSUxFX0JVTkRMRV9ZX0VOQ09ESU5HX01BU0spIHsKKwlpZiAoYnVuZGxlICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKSB7CiAJCWFkZHJfcmVnID0gZ2V0X1NyY0FfWTIoYnVuZGxlKTsKIAkJdmFsX3JlZyA9IGdldF9TcmNCRGVzdF9ZMihidW5kbGUpOwogCX0gZWxzZSBpZiAobWVtX29wID09IE1FTU9QX0xPQUQgfHwgbWVtX29wID09IE1FTU9QX0xPQURfUE9TVElOQ1IpIHsKQEAgLTIyOSw3ICsyMjgsNyBAQAogCX0KIAkrK3VuYWxpZ25lZF9maXh1cF9jb3VudDsKIAotCWlmIChidW5kbGUgJiBUSUxFX0JVTkRMRV9ZX0VOQ09ESU5HX01BU0spIHsKKwlpZiAoYnVuZGxlICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKSB7CiAJCS8qIENvbnZlcnQgdGhlIFkyIGluc3RydWN0aW9uIHRvIGEgcHJlZmV0Y2guICovCiAJCWJ1bmRsZSAmPSB+KGNyZWF0ZV9TcmNCRGVzdF9ZMigtMSkgfAogCQkJICAgIGNyZWF0ZV9PcGNvZGVfWTIoLTEpKTsKQEAgLTM4OSw3ICszODgsNyBAQAogCXN0YXRlLT5icmFuY2hfbmV4dF9wYyA9IDA7CiAJc3RhdGUtPnVwZGF0ZSA9IDA7CiAKLQlpZiAoIShidW5kbGUgJiBUSUxFX0JVTkRMRV9ZX0VOQ09ESU5HX01BU0spKSB7CisJaWYgKCEoYnVuZGxlICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKSkgewogCQkvKiB0d28gd2lkZSwgY2hlY2sgZm9yIGNvbnRyb2wgZmxvdyAqLwogCQlpbnQgb3Bjb2RlID0gZ2V0X09wY29kZV9YMShidW5kbGUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL3RpbGUtZGVzY18zMi5jIGIvYXJjaC90aWxlL2tlcm5lbC90aWxlLWRlc2NfMzIuYwppbmRleCA3ZTMxYTEyLi5kZDdiZDFkIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL3RpbGUtZGVzY18zMi5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvdGlsZS1kZXNjXzMyLmMKQEAgLTEsMyArMSwyMyBAQAorLyogVElMRVBybyBvcGNvZGUgaW5mb3JtYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMTEgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICAgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKgorICoKKyAqCisgKi8KKwogLyogVGhpcyBkZWZpbmUgaXMgQkZEX1JFTE9DXyMjeCBmb3IgcmVhbCBiZmQsIG9yIC0xIGZvciBldmVyeW9uZSBlbHNlLiAqLwogI2RlZmluZSBCRkRfUkVMT0MoeCkgLTEKIApAQCAtNiwxMjE3ICsyNiwxMjE3IEBACiAjZGVmaW5lIFRSRUdfU04gNTYKICNkZWZpbmUgVFJFR19aRVJPIDYzCiAKLS8qIEZJWE1FOiBSZW5hbWUgdGhpcy4gKi8KLSNpbmNsdWRlIDxhc20vb3Bjb2RlLXRpbGUuaD4KLQogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGFzbS90aWxlLWRlc2MuaD4KIAotY29uc3Qgc3RydWN0IHRpbGVfb3Bjb2RlIHRpbGVfb3Bjb2Rlc1szOTVdID0KK2NvbnN0IHN0cnVjdCB0aWxlcHJvX29wY29kZSB0aWxlcHJvX29wY29kZXNbMzk1XSA9CiB7Ci0geyAiYnB0IiwgVElMRV9PUENfQlBULCAweDIsIDAsIFRSRUdfWkVSTywgMCwKKyB7ICJicHQiLCBUSUxFUFJPX09QQ19CUFQsIDB4MiwgMCwgVFJFR19aRVJPLCAwLAogICAgIHsgeyAwLCB9LCB7ICB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImluZm8iLCBUSUxFX09QQ19JTkZPLCAweGYsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAiaW5mbyIsIFRJTEVQUk9fT1BDX0lORk8sIDB4ZiwgMSwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwIH0sIHsgMSB9LCB7IDIgfSwgeyAzIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJpbmZvbCIsIFRJTEVfT1BDX0lORk9MLCAweDMsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAiaW5mb2wiLCBUSUxFUFJPX09QQ19JTkZPTCwgMHgzLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDQgfSwgeyA1IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaiIsIFRJTEVfT1BDX0osIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJqIiwgVElMRVBST19PUENfSiwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImphbCIsIFRJTEVfT1BDX0pBTCwgMHgyLCAxLCBUUkVHX0xSLCAxLAorICB7ICJqYWwiLCBUSUxFUFJPX09QQ19KQUwsIDB4MiwgMSwgVFJFR19MUiwgMSwKICAgICB7IHsgMCwgfSwgeyA2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW92ZSIsIFRJTEVfT1BDX01PVkUsIDB4ZiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJtb3ZlIiwgVElMRVBST19PUENfTU9WRSwgMHhmLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDggfSwgeyA5LCAxMCB9LCB7IDExLCAxMiB9LCB7IDEzLCAxNCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW92ZS5zbiIsIFRJTEVfT1BDX01PVkVfU04sIDB4MywgMiwgVFJFR19TTiwgMSwKKyAgeyAibW92ZS5zbiIsIFRJTEVQUk9fT1BDX01PVkVfU04sIDB4MywgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCB9LCB7IDksIDEwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW92ZWkiLCBUSUxFX09QQ19NT1ZFSSwgMHhmLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1vdmVpIiwgVElMRVBST19PUENfTU9WRUksIDB4ZiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCAwIH0sIHsgOSwgMSB9LCB7IDExLCAyIH0sIHsgMTMsIDMgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1vdmVpLnNuIiwgVElMRV9PUENfTU9WRUlfU04sIDB4MywgMiwgVFJFR19TTiwgMSwKKyAgeyAibW92ZWkuc24iLCBUSUxFUFJPX09QQ19NT1ZFSV9TTiwgMHgzLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCAwIH0sIHsgOSwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1vdmVsaSIsIFRJTEVfT1BDX01PVkVMSSwgMHgzLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1vdmVsaSIsIFRJTEVQUk9fT1BDX01PVkVMSSwgMHgzLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDQgfSwgeyA5LCA1IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW92ZWxpLnNuIiwgVElMRV9PUENfTU9WRUxJX1NOLCAweDMsIDIsIFRSRUdfU04sIDEsCisgIHsgIm1vdmVsaS5zbiIsIFRJTEVQUk9fT1BDX01PVkVMSV9TTiwgMHgzLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA0IH0sIHsgOSwgNSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1vdmVsaXMiLCBUSUxFX09QQ19NT1ZFTElTLCAweDMsIDIsIFRSRUdfU04sIDEsCisgIHsgIm1vdmVsaXMiLCBUSUxFUFJPX09QQ19NT1ZFTElTLCAweDMsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDQgfSwgeyA5LCA1IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicHJlZmV0Y2giLCBUSUxFX09QQ19QUkVGRVRDSCwgMHgxMiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJwcmVmZXRjaCIsIFRJTEVQUk9fT1BDX1BSRUZFVENILCAweDEyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMTUgfSB9LAogICB9LAotICB7ICJyYWlzZSIsIFRJTEVfT1BDX1JBSVNFLCAweDIsIDAsIFRSRUdfWkVSTywgMSwKKyAgeyAicmFpc2UiLCBUSUxFUFJPX09QQ19SQUlTRSwgMHgyLCAwLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRkIiwgVElMRV9PUENfQURELCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkIiwgVElMRVBST19PUENfQURELCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRkLnNuIiwgVElMRV9PUENfQUREX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkZC5zbiIsIFRJTEVQUk9fT1BDX0FERF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGIiLCBUSUxFX09QQ19BRERCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkYiIsIFRJTEVQUk9fT1BDX0FEREIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGIuc24iLCBUSUxFX09QQ19BRERCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkZGIuc24iLCBUSUxFUFJPX09QQ19BRERCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRkYnNfdSIsIFRJTEVfT1BDX0FEREJTX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJhZGRic191IiwgVElMRVBST19PUENfQUREQlNfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRkYnNfdS5zbiIsIFRJTEVfT1BDX0FEREJTX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkYnNfdS5zbiIsIFRJTEVQUk9fT1BDX0FEREJTX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRoIiwgVElMRV9PUENfQURESCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImFkZGgiLCBUSUxFUFJPX09QQ19BRERILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRoLnNuIiwgVElMRV9PUENfQURESF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJhZGRoLnNuIiwgVElMRVBST19PUENfQURESF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGhzIiwgVElMRV9PUENfQURESFMsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJhZGRocyIsIFRJTEVQUk9fT1BDX0FEREhTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRocy5zbiIsIFRJTEVfT1BDX0FEREhTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkZGhzLnNuIiwgVElMRVBST19PUENfQURESFNfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRpIiwgVElMRV9PUENfQURESSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImFkZGkiLCBUSUxFUFJPX09QQ19BRERJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMTEsIDEyLCAyIH0sIHsgMTMsIDE0LCAzIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRpLnNuIiwgVElMRV9PUENfQURESV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJhZGRpLnNuIiwgVElMRVBST19PUENfQURESV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRpYiIsIFRJTEVfT1BDX0FERElCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkaWIiLCBUSUxFUFJPX09QQ19BRERJQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGliLnNuIiwgVElMRV9PUENfQURESUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkaWIuc24iLCBUSUxFUFJPX09QQ19BRERJQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRpaCIsIFRJTEVfT1BDX0FERElILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkaWgiLCBUSUxFUFJPX09QQ19BRERJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGloLnNuIiwgVElMRV9PUENfQURESUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkaWguc24iLCBUSUxFUFJPX09QQ19BRERJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRsaSIsIFRJTEVfT1BDX0FERExJLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkbGkiLCBUSUxFUFJPX09QQ19BRERMSSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDQgfSwgeyA5LCAxMCwgNSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGxpLnNuIiwgVElMRV9PUENfQURETElfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkbGkuc24iLCBUSUxFUFJPX09QQ19BRERMSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCA0IH0sIHsgOSwgMTAsIDUgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRsaXMiLCBUSUxFX09QQ19BRERMSVMsIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkbGlzIiwgVElMRVBST19PUENfQURETElTLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDQgfSwgeyA5LCAxMCwgNSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZHMiLCBUSUxFX09QQ19BRERTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkcyIsIFRJTEVQUk9fT1BDX0FERFMsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZHMuc24iLCBUSUxFX09QQ19BRERTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkZHMuc24iLCBUSUxFUFJPX09QQ19BRERTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRpZmZiX3UiLCBUSUxFX09QQ19BRElGRkJfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImFkaWZmYl91IiwgVElMRVBST19PUENfQURJRkZCX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRpZmZiX3Uuc24iLCBUSUxFX09QQ19BRElGRkJfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJhZGlmZmJfdS5zbiIsIFRJTEVQUk9fT1BDX0FESUZGQl9VX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGlmZmgiLCBUSUxFX09QQ19BRElGRkgsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJhZGlmZmgiLCBUSUxFUFJPX09QQ19BRElGRkgsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRpZmZoLnNuIiwgVElMRV9PUENfQURJRkZIX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkaWZmaC5zbiIsIFRJTEVQUk9fT1BDX0FESUZGSF9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYW5kIiwgVElMRV9PUENfQU5ELCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYW5kIiwgVElMRVBST19PUENfQU5ELCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYW5kLnNuIiwgVElMRV9PUENfQU5EX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFuZC5zbiIsIFRJTEVQUk9fT1BDX0FORF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFuZGkiLCBUSUxFX09QQ19BTkRJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYW5kaSIsIFRJTEVQUk9fT1BDX0FOREksIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAxMSwgMTIsIDIgfSwgeyAxMywgMTQsIDMgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFuZGkuc24iLCBUSUxFX09QQ19BTkRJX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFuZGkuc24iLCBUSUxFUFJPX09QQ19BTkRJX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImF1bGkiLCBUSUxFX09QQ19BVUxJLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYXVsaSIsIFRJTEVQUk9fT1BDX0FVTEksIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCA0IH0sIHsgOSwgMTAsIDUgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhdmdiX3UiLCBUSUxFX09QQ19BVkdCX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJhdmdiX3UiLCBUSUxFUFJPX09QQ19BVkdCX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYXZnYl91LnNuIiwgVElMRV9PUENfQVZHQl9VX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgImF2Z2JfdS5zbiIsIFRJTEVQUk9fT1BDX0FWR0JfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYXZnaCIsIFRJTEVfT1BDX0FWR0gsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJhdmdoIiwgVElMRVBST19PUENfQVZHSCwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhdmdoLnNuIiwgVElMRV9PUENfQVZHSF9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJhdmdoLnNuIiwgVElMRVBST19PUENfQVZHSF9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJucyIsIFRJTEVfT1BDX0JCTlMsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJiYm5zIiwgVElMRVBST19PUENfQkJOUywgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJucy5zbiIsIFRJTEVfT1BDX0JCTlNfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmJucy5zbiIsIFRJTEVQUk9fT1BDX0JCTlNfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiYm5zdCIsIFRJTEVfT1BDX0JCTlNULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYmJuc3QiLCBUSUxFUFJPX09QQ19CQk5TVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJuc3Quc24iLCBUSUxFX09QQ19CQk5TVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiYm5zdC5zbiIsIFRJTEVQUk9fT1BDX0JCTlNUX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJzIiwgVElMRV9PUENfQkJTLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYmJzIiwgVElMRVBST19PUENfQkJTLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiYnMuc24iLCBUSUxFX09QQ19CQlNfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmJzLnNuIiwgVElMRVBST19PUENfQkJTX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJzdCIsIFRJTEVfT1BDX0JCU1QsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJiYnN0IiwgVElMRVBST19PUENfQkJTVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJzdC5zbiIsIFRJTEVfT1BDX0JCU1RfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmJzdC5zbiIsIFRJTEVQUk9fT1BDX0JCU1RfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ2V6IiwgVElMRV9PUENfQkdFWiwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImJnZXoiLCBUSUxFUFJPX09QQ19CR0VaLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ2V6LnNuIiwgVElMRV9PUENfQkdFWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiZ2V6LnNuIiwgVElMRVBST19PUENfQkdFWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJnZXp0IiwgVElMRV9PUENfQkdFWlQsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJiZ2V6dCIsIFRJTEVQUk9fT1BDX0JHRVpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ2V6dC5zbiIsIFRJTEVfT1BDX0JHRVpUX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCisgIHsgImJnZXp0LnNuIiwgVElMRVBST19PUENfQkdFWlRfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ3oiLCBUSUxFX09QQ19CR1osIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJiZ3oiLCBUSUxFUFJPX09QQ19CR1osIDB4MiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJnei5zbiIsIFRJTEVfT1BDX0JHWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiZ3ouc24iLCBUSUxFUFJPX09QQ19CR1pfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ3p0IiwgVElMRV9PUENfQkdaVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImJnenQiLCBUSUxFUFJPX09QQ19CR1pULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ3p0LnNuIiwgVElMRV9PUENfQkdaVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiZ3p0LnNuIiwgVElMRVBST19PUENfQkdaVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJpdHgiLCBUSUxFX09QQ19CSVRYLCAweDUsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYml0eCIsIFRJTEVQUk9fT1BDX0JJVFgsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAxMSwgMTIgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYml0eC5zbiIsIFRJTEVfT1BDX0JJVFhfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYml0eC5zbiIsIFRJTEVQUk9fT1BDX0JJVFhfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmxleiIsIFRJTEVfT1BDX0JMRVosIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJibGV6IiwgVElMRVBST19PUENfQkxFWiwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmxlei5zbiIsIFRJTEVfT1BDX0JMRVpfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmxlei5zbiIsIFRJTEVQUk9fT1BDX0JMRVpfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibGV6dCIsIFRJTEVfT1BDX0JMRVpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYmxlenQiLCBUSUxFUFJPX09QQ19CTEVaVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmxlenQuc24iLCBUSUxFX09QQ19CTEVaVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJibGV6dC5zbiIsIFRJTEVQUk9fT1BDX0JMRVpUX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmx6IiwgVElMRV9PUENfQkxaLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYmx6IiwgVElMRVBST19PUENfQkxaLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibHouc24iLCBUSUxFX09QQ19CTFpfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmx6LnNuIiwgVElMRVBST19PUENfQkxaX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmx6dCIsIFRJTEVfT1BDX0JMWlQsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJibHp0IiwgVElMRVBST19PUENfQkxaVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmx6dC5zbiIsIFRJTEVfT1BDX0JMWlRfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmx6dC5zbiIsIFRJTEVQUk9fT1BDX0JMWlRfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibnoiLCBUSUxFX09QQ19CTlosIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJibnoiLCBUSUxFUFJPX09QQ19CTlosIDB4MiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJuei5zbiIsIFRJTEVfT1BDX0JOWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJibnouc24iLCBUSUxFUFJPX09QQ19CTlpfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibnp0IiwgVElMRV9PUENfQk5aVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImJuenQiLCBUSUxFUFJPX09QQ19CTlpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibnp0LnNuIiwgVElMRV9PUENfQk5aVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJibnp0LnNuIiwgVElMRVBST19PUENfQk5aVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJ5dGV4IiwgVElMRV9PUENfQllURVgsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJieXRleCIsIFRJTEVQUk9fT1BDX0JZVEVYLCAweDUsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCB9LCB7IDAsIH0sIHsgMTEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJ5dGV4LnNuIiwgVElMRV9PUENfQllURVhfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYnl0ZXguc24iLCBUSUxFUFJPX09QQ19CWVRFWF9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJieiIsIFRJTEVfT1BDX0JaLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYnoiLCBUSUxFUFJPX09QQ19CWiwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYnouc24iLCBUSUxFX09QQ19CWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiei5zbiIsIFRJTEVQUk9fT1BDX0JaX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYnp0IiwgVElMRV9PUENfQlpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYnp0IiwgVElMRVBST19PUENfQlpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJienQuc24iLCBUSUxFX09QQ19CWlRfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYnp0LnNuIiwgVElMRVBST19PUENfQlpUX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiY2x6IiwgVElMRV9PUENfQ0xaLCAweDUsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiY2x6IiwgVElMRVBST19PUENfQ0xaLCAweDUsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCB9LCB7IDAsIH0sIHsgMTEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImNsei5zbiIsIFRJTEVfT1BDX0NMWl9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAorICB7ICJjbHouc24iLCBUSUxFUFJPX09QQ19DTFpfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiY3JjMzJfMzIiLCBUSUxFX09QQ19DUkMzMl8zMiwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImNyYzMyXzMyIiwgVElMRVBST19PUENfQ1JDMzJfMzIsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiY3JjMzJfMzIuc24iLCBUSUxFX09QQ19DUkMzMl8zMl9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJjcmMzMl8zMi5zbiIsIFRJTEVQUk9fT1BDX0NSQzMyXzMyX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJjcmMzMl84IiwgVElMRV9PUENfQ1JDMzJfOCwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImNyYzMyXzgiLCBUSUxFUFJPX09QQ19DUkMzMl84LCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImNyYzMyXzguc24iLCBUSUxFX09QQ19DUkMzMl84X1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgImNyYzMyXzguc24iLCBUSUxFUFJPX09QQ19DUkMzMl84X1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJjdHoiLCBUSUxFX09QQ19DVFosIDB4NSwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJjdHoiLCBUSUxFUFJPX09QQ19DVFosIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAxMSwgMTIgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiY3R6LnNuIiwgVElMRV9PUENfQ1RaX1NOLCAweDEsIDIsIFRSRUdfU04sIDEsCisgIHsgImN0ei5zbiIsIFRJTEVQUk9fT1BDX0NUWl9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJkcmFpbiIsIFRJTEVfT1BDX0RSQUlOLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKKyAgeyAiZHJhaW4iLCBUSUxFUFJPX09QQ19EUkFJTiwgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiZHRsYnByIiwgVElMRV9PUENfRFRMQlBSLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAiZHRsYnByIiwgVElMRVBST19PUENfRFRMQlBSLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImR3b3JkX2FsaWduIiwgVElMRV9PUENfRFdPUkRfQUxJR04sIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJkd29yZF9hbGlnbiIsIFRJTEVQUk9fT1BDX0RXT1JEX0FMSUdOLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJkd29yZF9hbGlnbi5zbiIsIFRJTEVfT1BDX0RXT1JEX0FMSUdOX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgImR3b3JkX2FsaWduLnNuIiwgVElMRVBST19PUENfRFdPUkRfQUxJR05fU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJmaW52IiwgVElMRV9PUENfRklOViwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCisgIHsgImZpbnYiLCBUSUxFUFJPX09QQ19GSU5WLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImZsdXNoIiwgVElMRV9PUENfRkxVU0gsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJmbHVzaCIsIFRJTEVQUk9fT1BDX0ZMVVNILCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImZub3AiLCBUSUxFX09QQ19GTk9QLCAweGYsIDAsIFRSRUdfWkVSTywgMSwKKyAgeyAiZm5vcCIsIFRJTEVQUk9fT1BDX0ZOT1AsIDB4ZiwgMCwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAgfSwgeyAgfSwgeyAgfSwgeyAgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImljb2giLCBUSUxFX09QQ19JQ09ILCAweDIsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAiaWNvaCIsIFRJTEVQUk9fT1BDX0lDT0gsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaWxsIiwgVElMRV9PUENfSUxMLCAweGEsIDAsIFRSRUdfWkVSTywgMSwKKyAgeyAiaWxsIiwgVElMRVBST19PUENfSUxMLCAweGEsIDAsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAgfSwgeyAwLCB9LCB7ICB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaW50aGIiLCBUSUxFX09QQ19JTlRIQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImludGhiIiwgVElMRVBST19PUENfSU5USEIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImludGhiLnNuIiwgVElMRV9PUENfSU5USEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiaW50aGIuc24iLCBUSUxFUFJPX09QQ19JTlRIQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImludGhoIiwgVElMRV9PUENfSU5USEgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJpbnRoaCIsIFRJTEVQUk9fT1BDX0lOVEhILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJpbnRoaC5zbiIsIFRJTEVfT1BDX0lOVEhIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImludGhoLnNuIiwgVElMRVBST19PUENfSU5USEhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJpbnRsYiIsIFRJTEVfT1BDX0lOVExCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiaW50bGIiLCBUSUxFUFJPX09QQ19JTlRMQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaW50bGIuc24iLCBUSUxFX09QQ19JTlRMQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJpbnRsYi5zbiIsIFRJTEVQUk9fT1BDX0lOVExCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaW50bGgiLCBUSUxFX09QQ19JTlRMSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImludGxoIiwgVElMRVBST19PUENfSU5UTEgsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImludGxoLnNuIiwgVElMRV9PUENfSU5UTEhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiaW50bGguc24iLCBUSUxFUFJPX09QQ19JTlRMSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImludiIsIFRJTEVfT1BDX0lOViwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCisgIHsgImludiIsIFRJTEVQUk9fT1BDX0lOViwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJpcmV0IiwgVElMRV9PUENfSVJFVCwgMHgyLCAwLCBUUkVHX1pFUk8sIDEsCisgIHsgImlyZXQiLCBUSUxFUFJPX09QQ19JUkVULCAweDIsIDAsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJqYWxiIiwgVElMRV9PUENfSkFMQiwgMHgyLCAxLCBUUkVHX0xSLCAxLAorICB7ICJqYWxiIiwgVElMRVBST19PUENfSkFMQiwgMHgyLCAxLCBUUkVHX0xSLCAxLAogICAgIHsgeyAwLCB9LCB7IDIyIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiamFsZiIsIFRJTEVfT1BDX0pBTEYsIDB4MiwgMSwgVFJFR19MUiwgMSwKKyAgeyAiamFsZiIsIFRJTEVQUk9fT1BDX0pBTEYsIDB4MiwgMSwgVFJFR19MUiwgMSwKICAgICB7IHsgMCwgfSwgeyAyMiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImphbHIiLCBUSUxFX09QQ19KQUxSLCAweDIsIDEsIFRSRUdfTFIsIDEsCisgIHsgImphbHIiLCBUSUxFUFJPX09QQ19KQUxSLCAweDIsIDEsIFRSRUdfTFIsIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJqYWxycCIsIFRJTEVfT1BDX0pBTFJQLCAweDIsIDEsIFRSRUdfTFIsIDEsCisgIHsgImphbHJwIiwgVElMRVBST19PUENfSkFMUlAsIDB4MiwgMSwgVFJFR19MUiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImpiIiwgVElMRV9PUENfSkIsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJqYiIsIFRJTEVQUk9fT1BDX0pCLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAyMiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImpmIiwgVElMRV9PUENfSkYsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJqZiIsIFRJTEVQUk9fT1BDX0pGLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAyMiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImpyIiwgVElMRV9PUENfSlIsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJqciIsIFRJTEVQUk9fT1BDX0pSLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImpycCIsIFRJTEVfT1BDX0pSUCwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCisgIHsgImpycCIsIFRJTEVQUk9fT1BDX0pSUCwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsYiIsIFRJTEVfT1BDX0xCLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImxiIiwgVElMRVBST19PUENfTEIsIDB4MTIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAyMywgMTUgfSB9LAogICB9LAotICB7ICJsYi5zbiIsIFRJTEVfT1BDX0xCX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCisgIHsgImxiLnNuIiwgVElMRVBST19PUENfTEJfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxiX3UiLCBUSUxFX09QQ19MQl9VLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImxiX3UiLCBUSUxFUFJPX09QQ19MQl9VLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMjMsIDE1IH0gfSwKICAgfSwKLSAgeyAibGJfdS5zbiIsIFRJTEVfT1BDX0xCX1VfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAibGJfdS5zbiIsIFRJTEVQUk9fT1BDX0xCX1VfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxiYWRkIiwgVElMRV9PUENfTEJBREQsIDB4MiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJsYmFkZCIsIFRJTEVQUk9fT1BDX0xCQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAyNCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxiYWRkLnNuIiwgVElMRV9PUENfTEJBRERfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKKyAgeyAibGJhZGQuc24iLCBUSUxFUFJPX09QQ19MQkFERF9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibGJhZGRfdSIsIFRJTEVfT1BDX0xCQUREX1UsIDB4MiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJsYmFkZF91IiwgVElMRVBST19PUENfTEJBRERfVSwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMjQsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsYmFkZF91LnNuIiwgVElMRV9PUENfTEJBRERfVV9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAorICB7ICJsYmFkZF91LnNuIiwgVElMRVBST19PUENfTEJBRERfVV9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibGgiLCBUSUxFX09QQ19MSCwgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJsaCIsIFRJTEVQUk9fT1BDX0xILCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMjMsIDE1IH0gfSwKICAgfSwKLSAgeyAibGguc24iLCBUSUxFX09QQ19MSF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJsaC5zbiIsIFRJTEVQUk9fT1BDX0xIX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsaF91IiwgVElMRV9PUENfTEhfVSwgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJsaF91IiwgVElMRVBST19PUENfTEhfVSwgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDEwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDIzLCAxNSB9IH0sCiAgIH0sCi0gIHsgImxoX3Uuc24iLCBUSUxFX09QQ19MSF9VX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCisgIHsgImxoX3Uuc24iLCBUSUxFUFJPX09QQ19MSF9VX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsaGFkZCIsIFRJTEVfT1BDX0xIQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibGhhZGQiLCBUSUxFUFJPX09QQ19MSEFERCwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMjQsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsaGFkZC5zbiIsIFRJTEVfT1BDX0xIQUREX1NOLCAweDIsIDMsIFRSRUdfU04sIDEsCisgIHsgImxoYWRkLnNuIiwgVElMRVBST19PUENfTEhBRERfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAyNCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxoYWRkX3UiLCBUSUxFX09QQ19MSEFERF9VLCAweDIsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibGhhZGRfdSIsIFRJTEVQUk9fT1BDX0xIQUREX1UsIDB4MiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibGhhZGRfdS5zbiIsIFRJTEVfT1BDX0xIQUREX1VfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKKyAgeyAibGhhZGRfdS5zbiIsIFRJTEVQUk9fT1BDX0xIQUREX1VfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAyNCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxuayIsIFRJTEVfT1BDX0xOSywgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCisgIHsgImxuayIsIFRJTEVQUk9fT1BDX0xOSywgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxuay5zbiIsIFRJTEVfT1BDX0xOS19TTiwgMHgyLCAxLCBUUkVHX1NOLCAxLAorICB7ICJsbmsuc24iLCBUSUxFUFJPX09QQ19MTktfU04sIDB4MiwgMSwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibHciLCBUSUxFX09QQ19MVywgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJsdyIsIFRJTEVQUk9fT1BDX0xXLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMjMsIDE1IH0gfSwKICAgfSwKLSAgeyAibHcuc24iLCBUSUxFX09QQ19MV19TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJsdy5zbiIsIFRJTEVQUk9fT1BDX0xXX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsd19uYSIsIFRJTEVfT1BDX0xXX05BLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAibHdfbmEiLCBUSUxFUFJPX09QQ19MV19OQSwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsd19uYS5zbiIsIFRJTEVfT1BDX0xXX05BX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCisgIHsgImx3X25hLnNuIiwgVElMRVBST19PUENfTFdfTkFfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImx3YWRkIiwgVElMRV9PUENfTFdBREQsIDB4MiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJsd2FkZCIsIFRJTEVQUk9fT1BDX0xXQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAyNCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImx3YWRkLnNuIiwgVElMRV9PUENfTFdBRERfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKKyAgeyAibHdhZGQuc24iLCBUSUxFUFJPX09QQ19MV0FERF9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibHdhZGRfbmEiLCBUSUxFX09QQ19MV0FERF9OQSwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImx3YWRkX25hIiwgVElMRVBST19PUENfTFdBRERfTkEsIDB4MiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibHdhZGRfbmEuc24iLCBUSUxFX09QQ19MV0FERF9OQV9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAorICB7ICJsd2FkZF9uYS5zbiIsIFRJTEVQUk9fT1BDX0xXQUREX05BX1NOLCAweDIsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMjQsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhiX3UiLCBUSUxFX09QQ19NQVhCX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJtYXhiX3UiLCBUSUxFUFJPX09QQ19NQVhCX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1heGJfdS5zbiIsIFRJTEVfT1BDX01BWEJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtYXhiX3Uuc24iLCBUSUxFUFJPX09QQ19NQVhCX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhoIiwgVElMRV9PUENfTUFYSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1heGgiLCBUSUxFUFJPX09QQ19NQVhILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhoLnNuIiwgVElMRV9PUENfTUFYSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtYXhoLnNuIiwgVElMRVBST19PUENfTUFYSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1heGliX3UiLCBUSUxFX09QQ19NQVhJQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibWF4aWJfdSIsIFRJTEVQUk9fT1BDX01BWElCX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhpYl91LnNuIiwgVElMRV9PUENfTUFYSUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtYXhpYl91LnNuIiwgVElMRVBST19PUENfTUFYSUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhpaCIsIFRJTEVfT1BDX01BWElILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibWF4aWgiLCBUSUxFUFJPX09QQ19NQVhJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1heGloLnNuIiwgVElMRV9PUENfTUFYSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibWF4aWguc24iLCBUSUxFUFJPX09QQ19NQVhJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtZiIsIFRJTEVfT1BDX01GLCAweDIsIDAsIFRSRUdfWkVSTywgMSwKKyAgeyAibWYiLCBUSUxFUFJPX09QQ19NRiwgMHgyLCAwLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWZzcHIiLCBUSUxFX09QQ19NRlNQUiwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1mc3ByIiwgVElMRVBST19PUENfTUZTUFIsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI1IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluYl91IiwgVElMRV9PUENfTUlOQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibWluYl91IiwgVElMRVBST19PUENfTUlOQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtaW5iX3Uuc24iLCBUSUxFX09QQ19NSU5CX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibWluYl91LnNuIiwgVElMRVBST19PUENfTUlOQl9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluaCIsIFRJTEVfT1BDX01JTkgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJtaW5oIiwgVElMRVBST19PUENfTUlOSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluaC5zbiIsIFRJTEVfT1BDX01JTkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibWluaC5zbiIsIFRJTEVQUk9fT1BDX01JTkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtaW5pYl91IiwgVElMRV9PUENfTUlOSUJfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1pbmliX3UiLCBUSUxFUFJPX09QQ19NSU5JQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluaWJfdS5zbiIsIFRJTEVfT1BDX01JTklCX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibWluaWJfdS5zbiIsIFRJTEVQUk9fT1BDX01JTklCX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluaWgiLCBUSUxFX09QQ19NSU5JSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1pbmloIiwgVElMRVBST19PUENfTUlOSUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtaW5paC5zbiIsIFRJTEVfT1BDX01JTklIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgIm1pbmloLnNuIiwgVElMRVBST19PUENfTUlOSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW0iLCBUSUxFX09QQ19NTSwgMHgzLCA1LCBUUkVHX1pFUk8sIDEsCisgIHsgIm1tIiwgVElMRVBST19PUENfTU0sIDB4MywgNSwgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiwgMjYsIDI3IH0sIHsgOSwgMTAsIDE3LCAyOCwgMjkgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtbnoiLCBUSUxFX09QQ19NTlosIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtbnoiLCBUSUxFUFJPX09QQ19NTlosIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDExLCAxMiwgMTggfSwgeyAxMywgMTQsIDE5IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtbnouc24iLCBUSUxFX09QQ19NTlpfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibW56LnNuIiwgVElMRVBST19PUENfTU5aX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW56YiIsIFRJTEVfT1BDX01OWkIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJtbnpiIiwgVElMRVBST19PUENfTU5aQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW56Yi5zbiIsIFRJTEVfT1BDX01OWkJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibW56Yi5zbiIsIFRJTEVQUk9fT1BDX01OWkJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtbnpoIiwgVElMRV9PUENfTU5aSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1uemgiLCBUSUxFUFJPX09QQ19NTlpILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtbnpoLnNuIiwgVElMRV9PUENfTU5aSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtbnpoLnNuIiwgVElMRVBST19PUENfTU5aSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm10c3ByIiwgVElMRV9PUENfTVRTUFIsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJtdHNwciIsIFRJTEVQUk9fT1BDX01UU1BSLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAzMCwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxoaF9zcyIsIFRJTEVfT1BDX01VTEhIX1NTLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGhfc3MiLCBUSUxFUFJPX09QQ19NVUxISF9TUywgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoX3NzLnNuIiwgVElMRV9PUENfTVVMSEhfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsaGhfc3Muc24iLCBUSUxFUFJPX09QQ19NVUxISF9TU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGhfc3UiLCBUSUxFX09QQ19NVUxISF9TVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGhoX3N1IiwgVElMRVBST19PUENfTVVMSEhfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGhfc3Uuc24iLCBUSUxFX09QQ19NVUxISF9TVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxoaF9zdS5zbiIsIFRJTEVQUk9fT1BDX01VTEhIX1NVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxoaF91dSIsIFRJTEVfT1BDX01VTEhIX1VVLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGhfdXUiLCBUSUxFUFJPX09QQ19NVUxISF9VVSwgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoX3V1LnNuIiwgVElMRV9PUENfTVVMSEhfVVVfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsaGhfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxISF9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGhhX3NzIiwgVElMRV9PUENfTVVMSEhBX1NTLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGhhX3NzIiwgVElMRVBST19PUENfTVVMSEhBX1NTLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAzMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoYV9zcy5zbiIsIFRJTEVfT1BDX01VTEhIQV9TU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxoaGFfc3Muc24iLCBUSUxFUFJPX09QQ19NVUxISEFfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxoaGFfc3UiLCBUSUxFX09QQ19NVUxISEFfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxoaGFfc3UiLCBUSUxFUFJPX09QQ19NVUxISEFfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoYV9zdS5zbiIsIFRJTEVfT1BDX01VTEhIQV9TVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxoaGFfc3Uuc24iLCBUSUxFUFJPX09QQ19NVUxISEFfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxoaGFfdXUiLCBUSUxFX09QQ19NVUxISEFfVVUsIDB4NSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxoaGFfdXUiLCBUSUxFUFJPX09QQ19NVUxISEFfVVUsIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDMxLCAxMiwgMTggfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGhhX3V1LnNuIiwgVElMRV9PUENfTVVMSEhBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGhoYV91dS5zbiIsIFRJTEVQUk9fT1BDX01VTEhIQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoc2FfdXUiLCBUSUxFX09QQ19NVUxISFNBX1VVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGhzYV91dSIsIFRJTEVQUk9fT1BDX01VTEhIU0FfVVUsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoc2FfdXUuc24iLCBUSUxFX09QQ19NVUxISFNBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGhoc2FfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxISFNBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGxfc3MiLCBUSUxFX09QQ19NVUxITF9TUywgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGhsX3NzIiwgVElMRVBST19PUENfTVVMSExfU1MsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGxfc3Muc24iLCBUSUxFX09QQ19NVUxITF9TU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobF9zcy5zbiIsIFRJTEVQUk9fT1BDX01VTEhMX1NTX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobF9zdSIsIFRJTEVfT1BDX01VTEhMX1NVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGxfc3UiLCBUSUxFUFJPX09QQ19NVUxITF9TVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobF9zdS5zbiIsIFRJTEVfT1BDX01VTEhMX1NVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGhsX3N1LnNuIiwgVElMRVBST19PUENfTVVMSExfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsX3VzIiwgVElMRV9PUENfTVVMSExfVVMsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobF91cyIsIFRJTEVQUk9fT1BDX01VTEhMX1VTLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsX3VzLnNuIiwgVElMRV9PUENfTVVMSExfVVNfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsaGxfdXMuc24iLCBUSUxFUFJPX09QQ19NVUxITF9VU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGxfdXUiLCBUSUxFX09QQ19NVUxITF9VVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGhsX3V1IiwgVElMRVBST19PUENfTVVMSExfVVUsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGxfdXUuc24iLCBUSUxFX09QQ19NVUxITF9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobF91dS5zbiIsIFRJTEVQUk9fT1BDX01VTEhMX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobGFfc3MiLCBUSUxFX09QQ19NVUxITEFfU1MsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobGFfc3MiLCBUSUxFUFJPX09QQ19NVUxITEFfU1MsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsYV9zcy5zbiIsIFRJTEVfT1BDX01VTEhMQV9TU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobGFfc3Muc24iLCBUSUxFUFJPX09QQ19NVUxITEFfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobGFfc3UiLCBUSUxFX09QQ19NVUxITEFfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobGFfc3UiLCBUSUxFUFJPX09QQ19NVUxITEFfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsYV9zdS5zbiIsIFRJTEVfT1BDX01VTEhMQV9TVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobGFfc3Uuc24iLCBUSUxFUFJPX09QQ19NVUxITEFfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobGFfdXMiLCBUSUxFX09QQ19NVUxITEFfVVMsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobGFfdXMiLCBUSUxFUFJPX09QQ19NVUxITEFfVVMsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsYV91cy5zbiIsIFRJTEVfT1BDX01VTEhMQV9VU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobGFfdXMuc24iLCBUSUxFUFJPX09QQ19NVUxITEFfVVNfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobGFfdXUiLCBUSUxFX09QQ19NVUxITEFfVVUsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobGFfdXUiLCBUSUxFUFJPX09QQ19NVUxITEFfVVUsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsYV91dS5zbiIsIFRJTEVfT1BDX01VTEhMQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobGFfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxITEFfVVVfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobHNhX3V1IiwgVElMRV9PUENfTVVMSExTQV9VVSwgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGhsc2FfdXUiLCBUSUxFUFJPX09QQ19NVUxITFNBX1VVLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAzMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsc2FfdXUuc24iLCBUSUxFX09QQ19NVUxITFNBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGhsc2FfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxITFNBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsbGxfc3MiLCBUSUxFX09QQ19NVUxMTF9TUywgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGxsX3NzIiwgVElMRVBST19PUENfTVVMTExfU1MsIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMTEsIDEyLCAxOCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbF9zcy5zbiIsIFRJTEVfT1BDX01VTExMX1NTX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGxsX3NzLnNuIiwgVElMRVBST19PUENfTVVMTExfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGxsX3N1IiwgVElMRV9PUENfTVVMTExfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxsbF9zdSIsIFRJTEVQUk9fT1BDX01VTExMX1NVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGxsX3N1LnNuIiwgVElMRV9PUENfTVVMTExfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsbGxfc3Uuc24iLCBUSUxFUFJPX09QQ19NVUxMTF9TVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsbGxfdXUiLCBUSUxFX09QQ19NVUxMTF9VVSwgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGxsX3V1IiwgVElMRVBST19PUENfTVVMTExfVVUsIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMTEsIDEyLCAxOCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbF91dS5zbiIsIFRJTEVfT1BDX01VTExMX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGxsX3V1LnNuIiwgVElMRVBST19PUENfTVVMTExfVVVfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGxsYV9zcyIsIFRJTEVfT1BDX01VTExMQV9TUywgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGxsYV9zcyIsIFRJTEVQUk9fT1BDX01VTExMQV9TUywgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMzEsIDEyLCAxOCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbGFfc3Muc24iLCBUSUxFX09QQ19NVUxMTEFfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsbGxhX3NzLnNuIiwgVElMRVBST19PUENfTVVMTExBX1NTX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsbGxhX3N1IiwgVElMRV9PUENfTVVMTExBX1NVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsbGxhX3N1IiwgVElMRVBST19PUENfTVVMTExBX1NVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbGFfc3Uuc24iLCBUSUxFX09QQ19NVUxMTEFfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsbGxhX3N1LnNuIiwgVElMRVBST19PUENfTVVMTExBX1NVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsbGxhX3V1IiwgVElMRV9PUENfTVVMTExBX1VVLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsbGxhX3V1IiwgVElMRVBST19PUENfTVVMTExBX1VVLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAzMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGxsYV91dS5zbiIsIFRJTEVfT1BDX01VTExMQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxsbGFfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxMTEFfVVVfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbHNhX3V1IiwgVElMRV9PUENfTVVMTExTQV9VVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGxsc2FfdXUiLCBUSUxFUFJPX09QQ19NVUxMTFNBX1VVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbHNhX3V1LnNuIiwgVElMRV9PUENfTVVMTExTQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxsbHNhX3V1LnNuIiwgVElMRVBST19PUENfTVVMTExTQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm12bnoiLCBUSUxFX09QQ19NVk5aLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXZueiIsIFRJTEVQUk9fT1BDX01WTlosIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDMxLCAxMiwgMTggfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXZuei5zbiIsIFRJTEVfT1BDX01WTlpfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXZuei5zbiIsIFRJTEVQUk9fT1BDX01WTlpfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdnoiLCBUSUxFX09QQ19NVlosIDB4NSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdnoiLCBUSUxFUFJPX09QQ19NVlosIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDMxLCAxMiwgMTggfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXZ6LnNuIiwgVElMRV9PUENfTVZaX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm12ei5zbiIsIFRJTEVQUk9fT1BDX01WWl9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm16IiwgVElMRV9PUENfTVosIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJteiIsIFRJTEVQUk9fT1BDX01aLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXouc24iLCBUSUxFX09QQ19NWl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtei5zbiIsIFRJTEVQUk9fT1BDX01aX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXpiIiwgVElMRV9PUENfTVpCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXpiIiwgVElMRVBST19PUENfTVpCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtemIuc24iLCBUSUxFX09QQ19NWkJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibXpiLnNuIiwgVElMRVBST19PUENfTVpCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXpoIiwgVElMRV9PUENfTVpILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXpoIiwgVElMRVBST19PUENfTVpILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtemguc24iLCBUSUxFX09QQ19NWkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibXpoLnNuIiwgVElMRVBST19PUENfTVpIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibmFwIiwgVElMRV9PUENfTkFQLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKKyAgeyAibmFwIiwgVElMRVBST19PUENfTkFQLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKICAgICB7IHsgMCwgfSwgeyAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJub3AiLCBUSUxFX09QQ19OT1AsIDB4ZiwgMCwgVFJFR19aRVJPLCAxLAorICB7ICJub3AiLCBUSUxFUFJPX09QQ19OT1AsIDB4ZiwgMCwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAgfSwgeyAgfSwgeyAgfSwgeyAgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm5vciIsIFRJTEVfT1BDX05PUiwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm5vciIsIFRJTEVQUk9fT1BDX05PUiwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm5vci5zbiIsIFRJTEVfT1BDX05PUl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJub3Iuc24iLCBUSUxFUFJPX09QQ19OT1JfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJvciIsIFRJTEVfT1BDX09SLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAib3IiLCBUSUxFUFJPX09QQ19PUiwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm9yLnNuIiwgVElMRV9PUENfT1JfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAib3Iuc24iLCBUSUxFUFJPX09QQ19PUl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm9yaSIsIFRJTEVfT1BDX09SSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm9yaSIsIFRJTEVQUk9fT1BDX09SSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDExLCAxMiwgMiB9LCB7IDEzLCAxNCwgMyB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAib3JpLnNuIiwgVElMRV9PUENfT1JJX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgIm9yaS5zbiIsIFRJTEVQUk9fT1BDX09SSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwYWNrYnNfdSIsIFRJTEVfT1BDX1BBQ0tCU19VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicGFja2JzX3UiLCBUSUxFUFJPX09QQ19QQUNLQlNfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGFja2JzX3Uuc24iLCBUSUxFX09QQ19QQUNLQlNfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJwYWNrYnNfdS5zbiIsIFRJTEVQUk9fT1BDX1BBQ0tCU19VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGFja2hiIiwgVElMRV9PUENfUEFDS0hCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicGFja2hiIiwgVElMRVBST19PUENfUEFDS0hCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwYWNraGIuc24iLCBUSUxFX09QQ19QQUNLSEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAicGFja2hiLnNuIiwgVElMRVBST19PUENfUEFDS0hCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGFja2hzIiwgVElMRV9PUENfUEFDS0hTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicGFja2hzIiwgVElMRVBST19PUENfUEFDS0hTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwYWNraHMuc24iLCBUSUxFX09QQ19QQUNLSFNfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAicGFja2hzLnNuIiwgVElMRVBST19PUENfUEFDS0hTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGFja2xiIiwgVElMRV9PUENfUEFDS0xCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicGFja2xiIiwgVElMRVBST19PUENfUEFDS0xCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwYWNrbGIuc24iLCBUSUxFX09QQ19QQUNLTEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAicGFja2xiLnNuIiwgVElMRVBST19PUENfUEFDS0xCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGNudCIsIFRJTEVfT1BDX1BDTlQsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJwY250IiwgVElMRVBST19PUENfUENOVCwgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDggfSwgeyAwLCB9LCB7IDExLCAxMiB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwY250LnNuIiwgVElMRV9PUENfUENOVF9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAorICB7ICJwY250LnNuIiwgVElMRVBST19PUENfUENOVF9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJybCIsIFRJTEVfT1BDX1JMLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicmwiLCBUSUxFUFJPX09QQ19STCwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInJsLnNuIiwgVElMRV9PUENfUkxfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAicmwuc24iLCBUSUxFUFJPX09QQ19STF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInJsaSIsIFRJTEVfT1BDX1JMSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInJsaSIsIFRJTEVQUk9fT1BDX1JMSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMTEsIDEyLCAzNCB9LCB7IDEzLCAxNCwgMzUgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInJsaS5zbiIsIFRJTEVfT1BDX1JMSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJybGkuc24iLCBUSUxFUFJPX09QQ19STElfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzMWEiLCBUSUxFX09QQ19TMUEsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzMWEiLCBUSUxFUFJPX09QQ19TMUEsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDExLCAxMiwgMTggfSwgeyAxMywgMTQsIDE5IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzMWEuc24iLCBUSUxFX09QQ19TMUFfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiczFhLnNuIiwgVElMRVBST19PUENfUzFBX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiczJhIiwgVElMRV9PUENfUzJBLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiczJhIiwgVElMRVBST19PUENfUzJBLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiczJhLnNuIiwgVElMRV9PUENfUzJBX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInMyYS5zbiIsIFRJTEVQUk9fT1BDX1MyQV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInMzYSIsIFRJTEVfT1BDX1MzQSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInMzYSIsIFRJTEVQUk9fT1BDX1MzQSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInMzYS5zbiIsIFRJTEVfT1BDX1MzQV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzM2Euc24iLCBUSUxFUFJPX09QQ19TM0FfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhYl91IiwgVElMRV9PUENfU0FEQUJfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNhZGFiX3UiLCBUSUxFUFJPX09QQ19TQURBQl9VLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhYl91LnNuIiwgVElMRV9PUENfU0FEQUJfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzYWRhYl91LnNuIiwgVElMRVBST19PUENfU0FEQUJfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNhZGFoIiwgVElMRV9PUENfU0FEQUgsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzYWRhaCIsIFRJTEVQUk9fT1BDX1NBREFILCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhaC5zbiIsIFRJTEVfT1BDX1NBREFIX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgInNhZGFoLnNuIiwgVElMRVBST19PUENfU0FEQUhfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhaF91IiwgVElMRV9PUENfU0FEQUhfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNhZGFoX3UiLCBUSUxFUFJPX09QQ19TQURBSF9VLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhaF91LnNuIiwgVElMRV9PUENfU0FEQUhfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzYWRhaF91LnNuIiwgVElMRVBST19PUENfU0FEQUhfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNhZGJfdSIsIFRJTEVfT1BDX1NBREJfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNhZGJfdSIsIFRJTEVQUk9fT1BDX1NBREJfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRiX3Uuc24iLCBUSUxFX09QQ19TQURCX1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAic2FkYl91LnNuIiwgVElMRVBST19PUENfU0FEQl9VX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRoIiwgVElMRV9PUENfU0FESCwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNhZGgiLCBUSUxFUFJPX09QQ19TQURILCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNhZGguc24iLCBUSUxFX09QQ19TQURIX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgInNhZGguc24iLCBUSUxFUFJPX09QQ19TQURIX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRoX3UiLCBUSUxFX09QQ19TQURIX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzYWRoX3UiLCBUSUxFUFJPX09QQ19TQURIX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2FkaF91LnNuIiwgVElMRV9PUENfU0FESF9VX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgInNhZGhfdS5zbiIsIFRJTEVQUk9fT1BDX1NBREhfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2IiLCBUSUxFX09QQ19TQiwgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJzYiIsIFRJTEVQUk9fT1BDX1NCLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDE1LCAzNiB9IH0sCiAgIH0sCi0gIHsgInNiYWRkIiwgVElMRV9PUENfU0JBREQsIDB4MiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzYmFkZCIsIFRJTEVQUk9fT1BDX1NCQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAyNCwgMTcsIDM3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2VxIiwgVElMRV9PUENfU0VRLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2VxIiwgVElMRVBST19PUENfU0VRLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2VxLnNuIiwgVElMRV9PUENfU0VRX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNlcS5zbiIsIFRJTEVQUk9fT1BDX1NFUV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNlcWIiLCBUSUxFX09QQ19TRVFCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2VxYiIsIFRJTEVQUk9fT1BDX1NFUUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNlcWIuc24iLCBUSUxFX09QQ19TRVFCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNlcWIuc24iLCBUSUxFUFJPX09QQ19TRVFCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2VxaCIsIFRJTEVfT1BDX1NFUUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzZXFoIiwgVElMRVBST19PUENfU0VRSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2VxaC5zbiIsIFRJTEVfT1BDX1NFUUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2VxaC5zbiIsIFRJTEVQUk9fT1BDX1NFUUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzZXFpIiwgVElMRV9PUENfU0VRSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNlcWkiLCBUSUxFUFJPX09QQ19TRVFJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMTEsIDEyLCAyIH0sIHsgMTMsIDE0LCAzIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzZXFpLnNuIiwgVElMRV9PUENfU0VRSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzZXFpLnNuIiwgVElMRVBST19PUENfU0VRSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzZXFpYiIsIFRJTEVfT1BDX1NFUUlCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2VxaWIiLCBUSUxFUFJPX09QQ19TRVFJQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNlcWliLnNuIiwgVElMRV9PUENfU0VRSUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2VxaWIuc24iLCBUSUxFUFJPX09QQ19TRVFJQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzZXFpaCIsIFRJTEVfT1BDX1NFUUlILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2VxaWgiLCBUSUxFUFJPX09QQ19TRVFJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNlcWloLnNuIiwgVElMRV9PUENfU0VRSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2VxaWguc24iLCBUSUxFUFJPX09QQ19TRVFJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaCIsIFRJTEVfT1BDX1NILCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInNoIiwgVElMRVBST19PUENfU0gsIDB4MTIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMTUsIDM2IH0gfSwKICAgfSwKLSAgeyAic2hhZGQiLCBUSUxFX09QQ19TSEFERCwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNoYWRkIiwgVElMRVBST19PUENfU0hBREQsIDB4MiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDI0LCAxNywgMzcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGwiLCBUSUxFX09QQ19TSEwsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzaGwiLCBUSUxFUFJPX09QQ19TSEwsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDExLCAxMiwgMTggfSwgeyAxMywgMTQsIDE5IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGwuc24iLCBUSUxFX09QQ19TSExfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hsLnNuIiwgVElMRVBST19PUENfU0hMX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hsYiIsIFRJTEVfT1BDX1NITEIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzaGxiIiwgVElMRVBST19PUENfU0hMQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hsYi5zbiIsIFRJTEVfT1BDX1NITEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hsYi5zbiIsIFRJTEVQUk9fT1BDX1NITEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxoIiwgVElMRV9PUENfU0hMSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNobGgiLCBUSUxFUFJPX09QQ19TSExILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxoLnNuIiwgVElMRV9PUENfU0hMSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzaGxoLnNuIiwgVElMRVBST19PUENfU0hMSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNobGkiLCBUSUxFX09QQ19TSExJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hsaSIsIFRJTEVQUk9fT1BDX1NITEksIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDExLCAxMiwgMzQgfSwgeyAxMywgMTQsIDM1IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxpLnNuIiwgVElMRV9PUENfU0hMSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzaGxpLnNuIiwgVElMRVBST19PUENfU0hMSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNobGliIiwgVElMRV9PUENfU0hMSUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzaGxpYiIsIFRJTEVQUk9fT1BDX1NITElCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxpYi5zbiIsIFRJTEVfT1BDX1NITElCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNobGliLnNuIiwgVElMRVBST19PUENfU0hMSUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxpaCIsIFRJTEVfT1BDX1NITElILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hsaWgiLCBUSUxFUFJPX09QQ19TSExJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hsaWguc24iLCBUSUxFX09QQ19TSExJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzaGxpaC5zbiIsIFRJTEVQUk9fT1BDX1NITElIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyIiwgVElMRV9PUENfU0hSLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hyIiwgVElMRVBST19PUENfU0hSLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyLnNuIiwgVElMRV9PUENfU0hSX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNoci5zbiIsIFRJTEVQUk9fT1BDX1NIUl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNocmIiLCBUSUxFX09QQ19TSFJCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hyYiIsIFRJTEVQUk9fT1BDX1NIUkIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNocmIuc24iLCBUSUxFX09QQ19TSFJCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNocmIuc24iLCBUSUxFUFJPX09QQ19TSFJCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaCIsIFRJTEVfT1BDX1NIUkgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzaHJoIiwgVElMRVBST19PUENfU0hSSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaC5zbiIsIFRJTEVfT1BDX1NIUkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hyaC5zbiIsIFRJTEVQUk9fT1BDX1NIUkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaHJpIiwgVElMRV9PUENfU0hSSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNocmkiLCBUSUxFUFJPX09QQ19TSFJJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAxMSwgMTIsIDM0IH0sIHsgMTMsIDE0LCAzNSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaS5zbiIsIFRJTEVfT1BDX1NIUklfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hyaS5zbiIsIFRJTEVQUk9fT1BDX1NIUklfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaHJpYiIsIFRJTEVfT1BDX1NIUklCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hyaWIiLCBUSUxFUFJPX09QQ19TSFJJQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaWIuc24iLCBUSUxFX09QQ19TSFJJQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzaHJpYi5zbiIsIFRJTEVQUk9fT1BDX1NIUklCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaWgiLCBUSUxFX09QQ19TSFJJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNocmloIiwgVElMRVBST19PUENfU0hSSUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNocmloLnNuIiwgVElMRV9PUENfU0hSSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hyaWguc24iLCBUSUxFUFJPX09QQ19TSFJJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdCIsIFRJTEVfT1BDX1NMVCwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNsdCIsIFRJTEVQUk9fT1BDX1NMVCwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdC5zbiIsIFRJTEVfT1BDX1NMVF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHQuc24iLCBUSUxFUFJPX09QQ19TTFRfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRfdSIsIFRJTEVfT1BDX1NMVF9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0X3UiLCBUSUxFUFJPX09QQ19TTFRfVSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdF91LnNuIiwgVElMRV9PUENfU0xUX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0X3Uuc24iLCBUSUxFUFJPX09QQ19TTFRfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGIiLCBUSUxFX09QQ19TTFRCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0YiIsIFRJTEVQUk9fT1BDX1NMVEIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGIuc24iLCBUSUxFX09QQ19TTFRCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGIuc24iLCBUSUxFUFJPX09QQ19TTFRCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0Yl91IiwgVElMRV9PUENfU0xUQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0Yl91IiwgVElMRVBST19PUENfU0xUQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRiX3Uuc24iLCBUSUxFX09QQ19TTFRCX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0Yl91LnNuIiwgVElMRVBST19PUENfU0xUQl9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0ZSIsIFRJTEVfT1BDX1NMVEUsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRlIiwgVElMRVBST19PUENfU0xURSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGUuc24iLCBUSUxFX09QQ19TTFRFX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGUuc24iLCBUSUxFUFJPX09QQ19TTFRFX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0ZV91IiwgVElMRV9PUENfU0xURV9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0ZV91IiwgVElMRVBST19PUENfU0xURV9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0ZV91LnNuIiwgVElMRV9PUENfU0xURV9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGVfdS5zbiIsIFRJTEVQUk9fT1BDX1NMVEVfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGViIiwgVElMRV9PUENfU0xURUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRlYiIsIFRJTEVQUk9fT1BDX1NMVEVCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlYi5zbiIsIFRJTEVfT1BDX1NMVEVCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGViLnNuIiwgVElMRVBST19PUENfU0xURUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlYl91IiwgVElMRV9PUENfU0xURUJfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNsdGViX3UiLCBUSUxFUFJPX09QQ19TTFRFQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlYl91LnNuIiwgVElMRV9PUENfU0xURUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHRlYl91LnNuIiwgVElMRVBST19PUENfU0xURUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGVoIiwgVElMRV9PUENfU0xURUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRlaCIsIFRJTEVQUk9fT1BDX1NMVEVILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlaC5zbiIsIFRJTEVfT1BDX1NMVEVIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGVoLnNuIiwgVElMRVBST19PUENfU0xURUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlaF91IiwgVElMRV9PUENfU0xURUhfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNsdGVoX3UiLCBUSUxFUFJPX09QQ19TTFRFSF9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlaF91LnNuIiwgVElMRV9PUENfU0xURUhfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHRlaF91LnNuIiwgVElMRVBST19PUENfU0xURUhfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGgiLCBUSUxFX09QQ19TTFRILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aCIsIFRJTEVQUk9fT1BDX1NMVEgsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGguc24iLCBUSUxFX09QQ19TTFRIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGguc24iLCBUSUxFUFJPX09QQ19TTFRIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aF91IiwgVElMRV9PUENfU0xUSF9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aF91IiwgVElMRVBST19PUENfU0xUSF9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRoX3Uuc24iLCBUSUxFX09QQ19TTFRIX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aF91LnNuIiwgVElMRVBST19PUENfU0xUSF9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aSIsIFRJTEVfT1BDX1NMVEksIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRpIiwgVElMRVBST19PUENfU0xUSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDExLCAxMiwgMiB9LCB7IDEzLCAxNCwgMyB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aS5zbiIsIFRJTEVfT1BDX1NMVElfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aS5zbiIsIFRJTEVQUk9fT1BDX1NMVElfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aV91IiwgVElMRV9PUENfU0xUSV9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aV91IiwgVElMRVBST19PUENfU0xUSV9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMTEsIDEyLCAyIH0sIHsgMTMsIDE0LCAzIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRpX3Uuc24iLCBUSUxFX09QQ19TTFRJX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aV91LnNuIiwgVElMRVBST19PUENfU0xUSV9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGliIiwgVElMRV9PUENfU0xUSUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRpYiIsIFRJTEVQUk9fT1BDX1NMVElCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aWIuc24iLCBUSUxFX09QQ19TTFRJQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHRpYi5zbiIsIFRJTEVQUk9fT1BDX1NMVElCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGliX3UiLCBUSUxFX09QQ19TTFRJQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aWJfdSIsIFRJTEVQUk9fT1BDX1NMVElCX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRpYl91LnNuIiwgVElMRV9PUENfU0xUSUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHRpYl91LnNuIiwgVElMRVBST19PUENfU0xUSUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRpaCIsIFRJTEVfT1BDX1NMVElILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aWgiLCBUSUxFUFJPX09QQ19TTFRJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGloLnNuIiwgVElMRV9PUENfU0xUSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aWguc24iLCBUSUxFUFJPX09QQ19TTFRJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRpaF91IiwgVElMRV9PUENfU0xUSUhfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNsdGloX3UiLCBUSUxFUFJPX09QQ19TTFRJSF9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aWhfdS5zbiIsIFRJTEVfT1BDX1NMVElIX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aWhfdS5zbiIsIFRJTEVQUk9fT1BDX1NMVElIX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic25lIiwgVElMRV9PUENfU05FLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic25lIiwgVElMRVBST19PUENfU05FLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic25lLnNuIiwgVElMRV9PUENfU05FX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNuZS5zbiIsIFRJTEVQUk9fT1BDX1NORV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNuZWIiLCBUSUxFX09QQ19TTkVCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic25lYiIsIFRJTEVQUk9fT1BDX1NORUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNuZWIuc24iLCBUSUxFX09QQ19TTkVCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNuZWIuc24iLCBUSUxFUFJPX09QQ19TTkVCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic25laCIsIFRJTEVfT1BDX1NORUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbmVoIiwgVElMRVBST19PUENfU05FSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic25laC5zbiIsIFRJTEVfT1BDX1NORUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic25laC5zbiIsIFRJTEVQUk9fT1BDX1NORUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmEiLCBUSUxFX09QQ19TUkEsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzcmEiLCBUSUxFUFJPX09QQ19TUkEsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDExLCAxMiwgMTggfSwgeyAxMywgMTQsIDE5IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmEuc24iLCBUSUxFX09QQ19TUkFfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic3JhLnNuIiwgVElMRVBST19PUENfU1JBX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3JhYiIsIFRJTEVfT1BDX1NSQUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzcmFiIiwgVElMRVBST19PUENfU1JBQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3JhYi5zbiIsIFRJTEVfT1BDX1NSQUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic3JhYi5zbiIsIFRJTEVQUk9fT1BDX1NSQUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFoIiwgVElMRV9PUENfU1JBSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNyYWgiLCBUSUxFUFJPX09QQ19TUkFILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFoLnNuIiwgVElMRV9PUENfU1JBSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzcmFoLnNuIiwgVElMRVBST19PUENfU1JBSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNyYWkiLCBUSUxFX09QQ19TUkFJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3JhaSIsIFRJTEVQUk9fT1BDX1NSQUksIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDExLCAxMiwgMzQgfSwgeyAxMywgMTQsIDM1IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFpLnNuIiwgVElMRV9PUENfU1JBSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzcmFpLnNuIiwgVElMRVBST19PUENfU1JBSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNyYWliIiwgVElMRV9PUENfU1JBSUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzcmFpYiIsIFRJTEVQUk9fT1BDX1NSQUlCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFpYi5zbiIsIFRJTEVfT1BDX1NSQUlCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNyYWliLnNuIiwgVElMRVBST19PUENfU1JBSUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFpaCIsIFRJTEVfT1BDX1NSQUlILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3JhaWgiLCBUSUxFUFJPX09QQ19TUkFJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3JhaWguc24iLCBUSUxFX09QQ19TUkFJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzcmFpaC5zbiIsIFRJTEVQUk9fT1BDX1NSQUlIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3ViIiwgVElMRV9PUENfU1VCLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3ViIiwgVElMRVBST19PUENfU1VCLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3ViLnNuIiwgVElMRV9PUENfU1VCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInN1Yi5zbiIsIFRJTEVQUk9fT1BDX1NVQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN1YmIiLCBUSUxFX09QQ19TVUJCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3ViYiIsIFRJTEVQUk9fT1BDX1NVQkIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN1YmIuc24iLCBUSUxFX09QQ19TVUJCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInN1YmIuc24iLCBUSUxFUFJPX09QQ19TVUJCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3ViYnNfdSIsIFRJTEVfT1BDX1NVQkJTX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzdWJic191IiwgVElMRVBST19PUENfU1VCQlNfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3ViYnNfdS5zbiIsIFRJTEVfT1BDX1NVQkJTX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic3ViYnNfdS5zbiIsIFRJTEVQUk9fT1BDX1NVQkJTX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJoIiwgVElMRV9PUENfU1VCSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInN1YmgiLCBUSUxFUFJPX09QQ19TVUJILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJoLnNuIiwgVElMRV9PUENfU1VCSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzdWJoLnNuIiwgVElMRVBST19PUENfU1VCSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN1YmhzIiwgVElMRV9PUENfU1VCSFMsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzdWJocyIsIFRJTEVQUk9fT1BDX1NVQkhTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJocy5zbiIsIFRJTEVfT1BDX1NVQkhTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInN1YmhzLnNuIiwgVElMRVBST19PUENfU1VCSFNfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJzIiwgVElMRV9PUENfU1VCUywgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInN1YnMiLCBUSUxFUFJPX09QQ19TVUJTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJzLnNuIiwgVElMRV9PUENfU1VCU19TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzdWJzLnNuIiwgVElMRVBST19PUENfU1VCU19TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN3IiwgVElMRV9PUENfU1csIDB4MTIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAic3ciLCBUSUxFUFJPX09QQ19TVywgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAxNSwgMzYgfSB9LAogICB9LAotICB7ICJzd2FkZCIsIFRJTEVfT1BDX1NXQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3dhZGQiLCBUSUxFUFJPX09QQ19TV0FERCwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMjQsIDE3LCAzNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN3aW50MCIsIFRJTEVfT1BDX1NXSU5UMCwgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCisgIHsgInN3aW50MCIsIFRJTEVQUk9fT1BDX1NXSU5UMCwgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3dpbnQxIiwgVElMRV9PUENfU1dJTlQxLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKKyAgeyAic3dpbnQxIiwgVElMRVBST19PUENfU1dJTlQxLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKICAgICB7IHsgMCwgfSwgeyAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzd2ludDIiLCBUSUxFX09QQ19TV0lOVDIsIDB4MiwgMCwgVFJFR19aRVJPLCAwLAorICB7ICJzd2ludDIiLCBUSUxFUFJPX09QQ19TV0lOVDIsIDB4MiwgMCwgVFJFR19aRVJPLCAwLAogICAgIHsgeyAwLCB9LCB7ICB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN3aW50MyIsIFRJTEVfT1BDX1NXSU5UMywgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCisgIHsgInN3aW50MyIsIFRJTEVQUk9fT1BDX1NXSU5UMywgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidGJsaWR4YjAiLCBUSUxFX09QQ19UQkxJRFhCMCwgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInRibGlkeGIwIiwgVElMRVBST19PUENfVEJMSURYQjAsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMzEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRibGlkeGIwLnNuIiwgVElMRV9PUENfVEJMSURYQjBfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAidGJsaWR4YjAuc24iLCBUSUxFUFJPX09QQ19UQkxJRFhCMF9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidGJsaWR4YjEiLCBUSUxFX09QQ19UQkxJRFhCMSwgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInRibGlkeGIxIiwgVElMRVBST19PUENfVEJMSURYQjEsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMzEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRibGlkeGIxLnNuIiwgVElMRV9PUENfVEJMSURYQjFfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAidGJsaWR4YjEuc24iLCBUSUxFUFJPX09QQ19UQkxJRFhCMV9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidGJsaWR4YjIiLCBUSUxFX09QQ19UQkxJRFhCMiwgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInRibGlkeGIyIiwgVElMRVBST19PUENfVEJMSURYQjIsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMzEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRibGlkeGIyLnNuIiwgVElMRV9PUENfVEJMSURYQjJfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAidGJsaWR4YjIuc24iLCBUSUxFUFJPX09QQ19UQkxJRFhCMl9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidGJsaWR4YjMiLCBUSUxFX09QQ19UQkxJRFhCMywgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInRibGlkeGIzIiwgVElMRVBST19PUENfVEJMSURYQjMsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMzEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRibGlkeGIzLnNuIiwgVElMRV9PUENfVEJMSURYQjNfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAidGJsaWR4YjMuc24iLCBUSUxFUFJPX09QQ19UQkxJRFhCM19TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidG5zIiwgVElMRV9PUENfVE5TLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAidG5zIiwgVElMRVBST19PUENfVE5TLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRucy5zbiIsIFRJTEVfT1BDX1ROU19TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJ0bnMuc24iLCBUSUxFUFJPX09QQ19UTlNfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIndoNjQiLCBUSUxFX09QQ19XSDY0LCAweDIsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAid2g2NCIsIFRJTEVQUk9fT1BDX1dINjQsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAieG9yIiwgVElMRV9PUENfWE9SLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAieG9yIiwgVElMRVBST19PUENfWE9SLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAieG9yLnNuIiwgVElMRV9PUENfWE9SX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInhvci5zbiIsIFRJTEVQUk9fT1BDX1hPUl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInhvcmkiLCBUSUxFX09QQ19YT1JJLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAieG9yaSIsIFRJTEVQUk9fT1BDX1hPUkksIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJ4b3JpLnNuIiwgVElMRV9PUENfWE9SSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJ4b3JpLnNuIiwgVElMRVBST19PUENfWE9SSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7IE5VTEwsIFRJTEVfT1BDX05PTkUsIDAsIDAsIFRSRUdfWkVSTywgMCwgeyB7IDAsIH0gfSwKKyAgeyBOVUxMLCBUSUxFUFJPX09QQ19OT05FLCAwLCAwLCBUUkVHX1pFUk8sIDAsIHsgeyAwLCB9IH0sCiAgIH0KIH07CiAjZGVmaW5lIEJJVEZJRUxEKHN0YXJ0LCBzaXplKSAoKHN0YXJ0KSB8ICgoKDEgPDwgKHNpemUpKSAtIDEpIDw8IDYpKQotI2RlZmluZSBDSElMRChhcnJheV9pbmRleCkgKFRJTEVfT1BDX05PTkUgKyAoYXJyYXlfaW5kZXgpKQorI2RlZmluZSBDSElMRChhcnJheV9pbmRleCkgKFRJTEVQUk9fT1BDX05PTkUgKyAoYXJyYXlfaW5kZXgpKQogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGVjb2RlX1gwX2ZzbVsxMTUzXSA9CiB7CiAgIEJJVEZJRUxEKDIyLCA5KSAvKiBpbmRleCAwICovLAogICBDSElMRCg1MTMpLCBDSElMRCg1MzApLCBDSElMRCg1NDcpLCBDSElMRCg1NjQpLCBDSElMRCg1OTYpLCBDSElMRCg2MTMpLAotICBDSElMRCg2MzApLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBDSElMRCg2NjMpLCBDSElMRCg2ODApLCBDSElMRCg2OTcpLCBDSElMRCg3MTQpLCBDSElMRCg3NDYpLAotICBDSElMRCg3NjMpLCBDSElMRCg3ODApLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLAorICBDSElMRCg2MzApLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBDSElMRCg2NjMpLCBDSElMRCg2ODApLCBDSElMRCg2OTcpLAorICBDSElMRCg3MTQpLCBDSElMRCg3NDYpLCBDSElMRCg3NjMpLCBDSElMRCg3ODApLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLAogICBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLAogICBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLApAQCAtMTIyNyw3ICsxMjQ3LDcgQEAKICAgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwKICAgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwKICAgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwKLSAgQ0hJTEQoODEzKSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKKyAgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKICAgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKICAgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKICAgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKQEAgLTEyMzcsNyArMTI1Nyw4IEBACiAgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksCiAgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksCiAgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksCi0gIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDg0MyksCisgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksCisgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksCiAgIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksCiAgIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksCiAgIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksCkBAIC0xMjQ4LDMzMyArMTI2OSwzNzEgQEAKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKLSAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODczKSwgQ0hJTEQoODc4KSwgQ0hJTEQoODgzKSwKLSAgQ0hJTEQoOTAzKSwgQ0hJTEQoOTA4KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgQ0hJTEQoOTEzKSwKLSAgQ0hJTEQoOTE4KSwgQ0hJTEQoOTIzKSwgQ0hJTEQoOTQzKSwgQ0hJTEQoOTQ4KSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoOTUzKSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgQ0hJTEQoOTg4KSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIENISUxEKDk5MyksCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIENISUxEKDEwNzYpLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBDSElMRCg4NzMpLCBDSElMRCg4NzgpLCBDSElMRCg4ODMpLCBDSElMRCg5MDMpLCBDSElMRCg5MDgpLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBDSElMRCg5MTMpLAorICBDSElMRCg5MTgpLCBDSElMRCg5MjMpLCBDSElMRCg5NDMpLCBDSElMRCg5NDgpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBDSElMRCg5NTMpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBDSElMRCg5ODgpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgQ0hJTEQoOTkzKSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgQ0hJTEQoMTA3NiksIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE4LCA0KSAvKiBpbmRleCA1MTMgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX0FEREIsIFRJTEVfT1BDX0FEREgsIFRJTEVfT1BDX0FERCwKLSAgVElMRV9PUENfQURJRkZCX1UsIFRJTEVfT1BDX0FESUZGSCwgVElMRV9PUENfQU5ELCBUSUxFX09QQ19BVkdCX1UsCi0gIFRJTEVfT1BDX0FWR0gsIFRJTEVfT1BDX0NSQzMyXzMyLCBUSUxFX09QQ19DUkMzMl84LCBUSUxFX09QQ19JTlRIQiwKLSAgVElMRV9PUENfSU5USEgsIFRJTEVfT1BDX0lOVExCLCBUSUxFX09QQ19JTlRMSCwgVElMRV9PUENfTUFYQl9VLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19BRERCLCBUSUxFUFJPX09QQ19BRERILCBUSUxFUFJPX09QQ19BREQsCisgIFRJTEVQUk9fT1BDX0FESUZGQl9VLCBUSUxFUFJPX09QQ19BRElGRkgsIFRJTEVQUk9fT1BDX0FORCwKKyAgVElMRVBST19PUENfQVZHQl9VLCBUSUxFUFJPX09QQ19BVkdILCBUSUxFUFJPX09QQ19DUkMzMl8zMiwKKyAgVElMRVBST19PUENfQ1JDMzJfOCwgVElMRVBST19PUENfSU5USEIsIFRJTEVQUk9fT1BDX0lOVEhILAorICBUSUxFUFJPX09QQ19JTlRMQiwgVElMRVBST19PUENfSU5UTEgsIFRJTEVQUk9fT1BDX01BWEJfVSwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDUzMCAqLywKLSAgVElMRV9PUENfTUFYSCwgVElMRV9PUENfTUlOQl9VLCBUSUxFX09QQ19NSU5ILCBUSUxFX09QQ19NTlpCLCBUSUxFX09QQ19NTlpILAotICBUSUxFX09QQ19NTlosIFRJTEVfT1BDX01VTEhIQV9TUywgVElMRV9PUENfTVVMSEhBX1NVLCBUSUxFX09QQ19NVUxISEFfVVUsCi0gIFRJTEVfT1BDX01VTEhIU0FfVVUsIFRJTEVfT1BDX01VTEhIX1NTLCBUSUxFX09QQ19NVUxISF9TVSwKLSAgVElMRV9PUENfTVVMSEhfVVUsIFRJTEVfT1BDX01VTEhMQV9TUywgVElMRV9PUENfTVVMSExBX1NVLAotICBUSUxFX09QQ19NVUxITEFfVVMsCisgIFRJTEVQUk9fT1BDX01BWEgsIFRJTEVQUk9fT1BDX01JTkJfVSwgVElMRVBST19PUENfTUlOSCwgVElMRVBST19PUENfTU5aQiwKKyAgVElMRVBST19PUENfTU5aSCwgVElMRVBST19PUENfTU5aLCBUSUxFUFJPX09QQ19NVUxISEFfU1MsCisgIFRJTEVQUk9fT1BDX01VTEhIQV9TVSwgVElMRVBST19PUENfTVVMSEhBX1VVLCBUSUxFUFJPX09QQ19NVUxISFNBX1VVLAorICBUSUxFUFJPX09QQ19NVUxISF9TUywgVElMRVBST19PUENfTVVMSEhfU1UsIFRJTEVQUk9fT1BDX01VTEhIX1VVLAorICBUSUxFUFJPX09QQ19NVUxITEFfU1MsIFRJTEVQUk9fT1BDX01VTEhMQV9TVSwgVElMRVBST19PUENfTVVMSExBX1VTLAogICBCSVRGSUVMRCgxOCwgNCkgLyogaW5kZXggNTQ3ICovLAotICBUSUxFX09QQ19NVUxITEFfVVUsIFRJTEVfT1BDX01VTEhMU0FfVVUsIFRJTEVfT1BDX01VTEhMX1NTLAotICBUSUxFX09QQ19NVUxITF9TVSwgVElMRV9PUENfTVVMSExfVVMsIFRJTEVfT1BDX01VTEhMX1VVLCBUSUxFX09QQ19NVUxMTEFfU1MsCi0gIFRJTEVfT1BDX01VTExMQV9TVSwgVElMRV9PUENfTVVMTExBX1VVLCBUSUxFX09QQ19NVUxMTFNBX1VVLAotICBUSUxFX09QQ19NVUxMTF9TUywgVElMRV9PUENfTVVMTExfU1UsIFRJTEVfT1BDX01VTExMX1VVLCBUSUxFX09QQ19NVk5aLAotICBUSUxFX09QQ19NVlosIFRJTEVfT1BDX01aQiwKKyAgVElMRVBST19PUENfTVVMSExBX1VVLCBUSUxFUFJPX09QQ19NVUxITFNBX1VVLCBUSUxFUFJPX09QQ19NVUxITF9TUywKKyAgVElMRVBST19PUENfTVVMSExfU1UsIFRJTEVQUk9fT1BDX01VTEhMX1VTLCBUSUxFUFJPX09QQ19NVUxITF9VVSwKKyAgVElMRVBST19PUENfTVVMTExBX1NTLCBUSUxFUFJPX09QQ19NVUxMTEFfU1UsIFRJTEVQUk9fT1BDX01VTExMQV9VVSwKKyAgVElMRVBST19PUENfTVVMTExTQV9VVSwgVElMRVBST19PUENfTVVMTExfU1MsIFRJTEVQUk9fT1BDX01VTExMX1NVLAorICBUSUxFUFJPX09QQ19NVUxMTF9VVSwgVElMRVBST19PUENfTVZOWiwgVElMRVBST19PUENfTVZaLCBUSUxFUFJPX09QQ19NWkIsCiAgIEJJVEZJRUxEKDE4LCA0KSAvKiBpbmRleCA1NjQgKi8sCi0gIFRJTEVfT1BDX01aSCwgVElMRV9PUENfTVosIFRJTEVfT1BDX05PUiwgQ0hJTEQoNTgxKSwgVElMRV9PUENfUEFDS0hCLAotICBUSUxFX09QQ19QQUNLTEIsIFRJTEVfT1BDX1JMLCBUSUxFX09QQ19TMUEsIFRJTEVfT1BDX1MyQSwgVElMRV9PUENfUzNBLAotICBUSUxFX09QQ19TQURBQl9VLCBUSUxFX09QQ19TQURBSCwgVElMRV9PUENfU0FEQUhfVSwgVElMRV9PUENfU0FEQl9VLAotICBUSUxFX09QQ19TQURILCBUSUxFX09QQ19TQURIX1UsCisgIFRJTEVQUk9fT1BDX01aSCwgVElMRVBST19PUENfTVosIFRJTEVQUk9fT1BDX05PUiwgQ0hJTEQoNTgxKSwKKyAgVElMRVBST19PUENfUEFDS0hCLCBUSUxFUFJPX09QQ19QQUNLTEIsIFRJTEVQUk9fT1BDX1JMLCBUSUxFUFJPX09QQ19TMUEsCisgIFRJTEVQUk9fT1BDX1MyQSwgVElMRVBST19PUENfUzNBLCBUSUxFUFJPX09QQ19TQURBQl9VLCBUSUxFUFJPX09QQ19TQURBSCwKKyAgVElMRVBST19PUENfU0FEQUhfVSwgVElMRVBST19PUENfU0FEQl9VLCBUSUxFUFJPX09QQ19TQURILAorICBUSUxFUFJPX09QQ19TQURIX1UsCiAgIEJJVEZJRUxEKDEyLCAyKSAvKiBpbmRleCA1ODEgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIENISUxEKDU4NiksCisgIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIENISUxEKDU4NiksCiAgIEJJVEZJRUxEKDE0LCAyKSAvKiBpbmRleCA1ODYgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIENISUxEKDU5MSksCisgIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIENISUxEKDU5MSksCiAgIEJJVEZJRUxEKDE2LCAyKSAvKiBpbmRleCA1OTEgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX01PVkUsCisgIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX01PVkUsCiAgIEJJVEZJRUxEKDE4LCA0KSAvKiBpbmRleCA1OTYgKi8sCi0gIFRJTEVfT1BDX1NFUUIsIFRJTEVfT1BDX1NFUUgsIFRJTEVfT1BDX1NFUSwgVElMRV9PUENfU0hMQiwgVElMRV9PUENfU0hMSCwKLSAgVElMRV9PUENfU0hMLCBUSUxFX09QQ19TSFJCLCBUSUxFX09QQ19TSFJILCBUSUxFX09QQ19TSFIsIFRJTEVfT1BDX1NMVEIsCi0gIFRJTEVfT1BDX1NMVEJfVSwgVElMRV9PUENfU0xURUIsIFRJTEVfT1BDX1NMVEVCX1UsIFRJTEVfT1BDX1NMVEVILAotICBUSUxFX09QQ19TTFRFSF9VLCBUSUxFX09QQ19TTFRFLAorICBUSUxFUFJPX09QQ19TRVFCLCBUSUxFUFJPX09QQ19TRVFILCBUSUxFUFJPX09QQ19TRVEsIFRJTEVQUk9fT1BDX1NITEIsCisgIFRJTEVQUk9fT1BDX1NITEgsIFRJTEVQUk9fT1BDX1NITCwgVElMRVBST19PUENfU0hSQiwgVElMRVBST19PUENfU0hSSCwKKyAgVElMRVBST19PUENfU0hSLCBUSUxFUFJPX09QQ19TTFRCLCBUSUxFUFJPX09QQ19TTFRCX1UsIFRJTEVQUk9fT1BDX1NMVEVCLAorICBUSUxFUFJPX09QQ19TTFRFQl9VLCBUSUxFUFJPX09QQ19TTFRFSCwgVElMRVBST19PUENfU0xURUhfVSwKKyAgVElMRVBST19PUENfU0xURSwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDYxMyAqLywKLSAgVElMRV9PUENfU0xURV9VLCBUSUxFX09QQ19TTFRILCBUSUxFX09QQ19TTFRIX1UsIFRJTEVfT1BDX1NMVCwKLSAgVElMRV9PUENfU0xUX1UsIFRJTEVfT1BDX1NORUIsIFRJTEVfT1BDX1NORUgsIFRJTEVfT1BDX1NORSwgVElMRV9PUENfU1JBQiwKLSAgVElMRV9PUENfU1JBSCwgVElMRV9PUENfU1JBLCBUSUxFX09QQ19TVUJCLCBUSUxFX09QQ19TVUJILCBUSUxFX09QQ19TVUIsCi0gIFRJTEVfT1BDX1hPUiwgVElMRV9PUENfRFdPUkRfQUxJR04sCisgIFRJTEVQUk9fT1BDX1NMVEVfVSwgVElMRVBST19PUENfU0xUSCwgVElMRVBST19PUENfU0xUSF9VLCBUSUxFUFJPX09QQ19TTFQsCisgIFRJTEVQUk9fT1BDX1NMVF9VLCBUSUxFUFJPX09QQ19TTkVCLCBUSUxFUFJPX09QQ19TTkVILCBUSUxFUFJPX09QQ19TTkUsCisgIFRJTEVQUk9fT1BDX1NSQUIsIFRJTEVQUk9fT1BDX1NSQUgsIFRJTEVQUk9fT1BDX1NSQSwgVElMRVBST19PUENfU1VCQiwKKyAgVElMRVBST19PUENfU1VCSCwgVElMRVBST19PUENfU1VCLCBUSUxFUFJPX09QQ19YT1IsIFRJTEVQUk9fT1BDX0RXT1JEX0FMSUdOLAogICBCSVRGSUVMRCgxOCwgMykgLyogaW5kZXggNjMwICovLAogICBDSElMRCg2MzkpLCBDSElMRCg2NDIpLCBDSElMRCg2NDUpLCBDSElMRCg2NDgpLCBDSElMRCg2NTEpLCBDSElMRCg2NTQpLAogICBDSElMRCg2NTcpLCBDSElMRCg2NjApLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggNjM5ICovLAotICBUSUxFX09QQ19BRERTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19BRERTLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggNjQyICovLAotICBUSUxFX09QQ19TVUJTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TVUJTLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggNjQ1ICovLAotICBUSUxFX09QQ19BRERCU19VLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19BRERCU19VLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggNjQ4ICovLAotICBUSUxFX09QQ19BRERIUywgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQURESFMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA2NTEgKi8sCi0gIFRJTEVfT1BDX1NVQkJTX1UsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQkJTX1UsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA2NTQgKi8sCi0gIFRJTEVfT1BDX1NVQkhTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TVUJIUywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMjEsIDEpIC8qIGluZGV4IDY1NyAqLywKLSAgVElMRV9PUENfUEFDS0hTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19QQUNLSFMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA2NjAgKi8sCi0gIFRJTEVfT1BDX1BBQ0tCU19VLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19QQUNLQlNfVSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDY2MyAqLywKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfQUREQl9TTiwgVElMRV9PUENfQURESF9TTiwgVElMRV9PUENfQUREX1NOLAotICBUSUxFX09QQ19BRElGRkJfVV9TTiwgVElMRV9PUENfQURJRkZIX1NOLCBUSUxFX09QQ19BTkRfU04sCi0gIFRJTEVfT1BDX0FWR0JfVV9TTiwgVElMRV9PUENfQVZHSF9TTiwgVElMRV9PUENfQ1JDMzJfMzJfU04sCi0gIFRJTEVfT1BDX0NSQzMyXzhfU04sIFRJTEVfT1BDX0lOVEhCX1NOLCBUSUxFX09QQ19JTlRISF9TTiwKLSAgVElMRV9PUENfSU5UTEJfU04sIFRJTEVfT1BDX0lOVExIX1NOLCBUSUxFX09QQ19NQVhCX1VfU04sCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX0FEREJfU04sIFRJTEVQUk9fT1BDX0FEREhfU04sCisgIFRJTEVQUk9fT1BDX0FERF9TTiwgVElMRVBST19PUENfQURJRkZCX1VfU04sIFRJTEVQUk9fT1BDX0FESUZGSF9TTiwKKyAgVElMRVBST19PUENfQU5EX1NOLCBUSUxFUFJPX09QQ19BVkdCX1VfU04sIFRJTEVQUk9fT1BDX0FWR0hfU04sCisgIFRJTEVQUk9fT1BDX0NSQzMyXzMyX1NOLCBUSUxFUFJPX09QQ19DUkMzMl84X1NOLCBUSUxFUFJPX09QQ19JTlRIQl9TTiwKKyAgVElMRVBST19PUENfSU5USEhfU04sIFRJTEVQUk9fT1BDX0lOVExCX1NOLCBUSUxFUFJPX09QQ19JTlRMSF9TTiwKKyAgVElMRVBST19PUENfTUFYQl9VX1NOLAogICBCSVRGSUVMRCgxOCwgNCkgLyogaW5kZXggNjgwICovLAotICBUSUxFX09QQ19NQVhIX1NOLCBUSUxFX09QQ19NSU5CX1VfU04sIFRJTEVfT1BDX01JTkhfU04sIFRJTEVfT1BDX01OWkJfU04sCi0gIFRJTEVfT1BDX01OWkhfU04sIFRJTEVfT1BDX01OWl9TTiwgVElMRV9PUENfTVVMSEhBX1NTX1NOLAotICBUSUxFX09QQ19NVUxISEFfU1VfU04sIFRJTEVfT1BDX01VTEhIQV9VVV9TTiwgVElMRV9PUENfTVVMSEhTQV9VVV9TTiwKLSAgVElMRV9PUENfTVVMSEhfU1NfU04sIFRJTEVfT1BDX01VTEhIX1NVX1NOLCBUSUxFX09QQ19NVUxISF9VVV9TTiwKLSAgVElMRV9PUENfTVVMSExBX1NTX1NOLCBUSUxFX09QQ19NVUxITEFfU1VfU04sIFRJTEVfT1BDX01VTEhMQV9VU19TTiwKKyAgVElMRVBST19PUENfTUFYSF9TTiwgVElMRVBST19PUENfTUlOQl9VX1NOLCBUSUxFUFJPX09QQ19NSU5IX1NOLAorICBUSUxFUFJPX09QQ19NTlpCX1NOLCBUSUxFUFJPX09QQ19NTlpIX1NOLCBUSUxFUFJPX09QQ19NTlpfU04sCisgIFRJTEVQUk9fT1BDX01VTEhIQV9TU19TTiwgVElMRVBST19PUENfTVVMSEhBX1NVX1NOLAorICBUSUxFUFJPX09QQ19NVUxISEFfVVVfU04sIFRJTEVQUk9fT1BDX01VTEhIU0FfVVVfU04sCisgIFRJTEVQUk9fT1BDX01VTEhIX1NTX1NOLCBUSUxFUFJPX09QQ19NVUxISF9TVV9TTiwgVElMRVBST19PUENfTVVMSEhfVVVfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMQV9TU19TTiwgVElMRVBST19PUENfTVVMSExBX1NVX1NOLAorICBUSUxFUFJPX09QQ19NVUxITEFfVVNfU04sCiAgIEJJVEZJRUxEKDE4LCA0KSAvKiBpbmRleCA2OTcgKi8sCi0gIFRJTEVfT1BDX01VTEhMQV9VVV9TTiwgVElMRV9PUENfTVVMSExTQV9VVV9TTiwgVElMRV9PUENfTVVMSExfU1NfU04sCi0gIFRJTEVfT1BDX01VTEhMX1NVX1NOLCBUSUxFX09QQ19NVUxITF9VU19TTiwgVElMRV9PUENfTVVMSExfVVVfU04sCi0gIFRJTEVfT1BDX01VTExMQV9TU19TTiwgVElMRV9PUENfTVVMTExBX1NVX1NOLCBUSUxFX09QQ19NVUxMTEFfVVVfU04sCi0gIFRJTEVfT1BDX01VTExMU0FfVVVfU04sIFRJTEVfT1BDX01VTExMX1NTX1NOLCBUSUxFX09QQ19NVUxMTF9TVV9TTiwKLSAgVElMRV9PUENfTVVMTExfVVVfU04sIFRJTEVfT1BDX01WTlpfU04sIFRJTEVfT1BDX01WWl9TTiwgVElMRV9PUENfTVpCX1NOLAorICBUSUxFUFJPX09QQ19NVUxITEFfVVVfU04sIFRJTEVQUk9fT1BDX01VTEhMU0FfVVVfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMX1NTX1NOLCBUSUxFUFJPX09QQ19NVUxITF9TVV9TTiwgVElMRVBST19PUENfTVVMSExfVVNfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMX1VVX1NOLCBUSUxFUFJPX09QQ19NVUxMTEFfU1NfU04sIFRJTEVQUk9fT1BDX01VTExMQV9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMTExBX1VVX1NOLCBUSUxFUFJPX09QQ19NVUxMTFNBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxMTF9TU19TTiwgVElMRVBST19PUENfTVVMTExfU1VfU04sIFRJTEVQUk9fT1BDX01VTExMX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVk5aX1NOLCBUSUxFUFJPX09QQ19NVlpfU04sIFRJTEVQUk9fT1BDX01aQl9TTiwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDcxNCAqLywKLSAgVElMRV9PUENfTVpIX1NOLCBUSUxFX09QQ19NWl9TTiwgVElMRV9PUENfTk9SX1NOLCBDSElMRCg3MzEpLAotICBUSUxFX09QQ19QQUNLSEJfU04sIFRJTEVfT1BDX1BBQ0tMQl9TTiwgVElMRV9PUENfUkxfU04sIFRJTEVfT1BDX1MxQV9TTiwKLSAgVElMRV9PUENfUzJBX1NOLCBUSUxFX09QQ19TM0FfU04sIFRJTEVfT1BDX1NBREFCX1VfU04sIFRJTEVfT1BDX1NBREFIX1NOLAotICBUSUxFX09QQ19TQURBSF9VX1NOLCBUSUxFX09QQ19TQURCX1VfU04sIFRJTEVfT1BDX1NBREhfU04sCi0gIFRJTEVfT1BDX1NBREhfVV9TTiwKKyAgVElMRVBST19PUENfTVpIX1NOLCBUSUxFUFJPX09QQ19NWl9TTiwgVElMRVBST19PUENfTk9SX1NOLCBDSElMRCg3MzEpLAorICBUSUxFUFJPX09QQ19QQUNLSEJfU04sIFRJTEVQUk9fT1BDX1BBQ0tMQl9TTiwgVElMRVBST19PUENfUkxfU04sCisgIFRJTEVQUk9fT1BDX1MxQV9TTiwgVElMRVBST19PUENfUzJBX1NOLCBUSUxFUFJPX09QQ19TM0FfU04sCisgIFRJTEVQUk9fT1BDX1NBREFCX1VfU04sIFRJTEVQUk9fT1BDX1NBREFIX1NOLCBUSUxFUFJPX09QQ19TQURBSF9VX1NOLAorICBUSUxFUFJPX09QQ19TQURCX1VfU04sIFRJTEVQUk9fT1BDX1NBREhfU04sIFRJTEVQUk9fT1BDX1NBREhfVV9TTiwKICAgQklURklFTEQoMTIsIDIpIC8qIGluZGV4IDczMSAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgQ0hJTEQoNzM2KSwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwgQ0hJTEQoNzM2KSwKICAgQklURklFTEQoMTQsIDIpIC8qIGluZGV4IDczNiAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgQ0hJTEQoNzQxKSwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwgQ0hJTEQoNzQxKSwKICAgQklURklFTEQoMTYsIDIpIC8qIGluZGV4IDc0MSAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgVElMRV9PUENfTU9WRV9TTiwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwKKyAgVElMRVBST19PUENfTU9WRV9TTiwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDc0NiAqLywKLSAgVElMRV9PUENfU0VRQl9TTiwgVElMRV9PUENfU0VRSF9TTiwgVElMRV9PUENfU0VRX1NOLCBUSUxFX09QQ19TSExCX1NOLAotICBUSUxFX09QQ19TSExIX1NOLCBUSUxFX09QQ19TSExfU04sIFRJTEVfT1BDX1NIUkJfU04sIFRJTEVfT1BDX1NIUkhfU04sCi0gIFRJTEVfT1BDX1NIUl9TTiwgVElMRV9PUENfU0xUQl9TTiwgVElMRV9PUENfU0xUQl9VX1NOLCBUSUxFX09QQ19TTFRFQl9TTiwKLSAgVElMRV9PUENfU0xURUJfVV9TTiwgVElMRV9PUENfU0xURUhfU04sIFRJTEVfT1BDX1NMVEVIX1VfU04sCi0gIFRJTEVfT1BDX1NMVEVfU04sCisgIFRJTEVQUk9fT1BDX1NFUUJfU04sIFRJTEVQUk9fT1BDX1NFUUhfU04sIFRJTEVQUk9fT1BDX1NFUV9TTiwKKyAgVElMRVBST19PUENfU0hMQl9TTiwgVElMRVBST19PUENfU0hMSF9TTiwgVElMRVBST19PUENfU0hMX1NOLAorICBUSUxFUFJPX09QQ19TSFJCX1NOLCBUSUxFUFJPX09QQ19TSFJIX1NOLCBUSUxFUFJPX09QQ19TSFJfU04sCisgIFRJTEVQUk9fT1BDX1NMVEJfU04sIFRJTEVQUk9fT1BDX1NMVEJfVV9TTiwgVElMRVBST19PUENfU0xURUJfU04sCisgIFRJTEVQUk9fT1BDX1NMVEVCX1VfU04sIFRJTEVQUk9fT1BDX1NMVEVIX1NOLCBUSUxFUFJPX09QQ19TTFRFSF9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRFX1NOLAogICBCSVRGSUVMRCgxOCwgNCkgLyogaW5kZXggNzYzICovLAotICBUSUxFX09QQ19TTFRFX1VfU04sIFRJTEVfT1BDX1NMVEhfU04sIFRJTEVfT1BDX1NMVEhfVV9TTiwgVElMRV9PUENfU0xUX1NOLAotICBUSUxFX09QQ19TTFRfVV9TTiwgVElMRV9PUENfU05FQl9TTiwgVElMRV9PUENfU05FSF9TTiwgVElMRV9PUENfU05FX1NOLAotICBUSUxFX09QQ19TUkFCX1NOLCBUSUxFX09QQ19TUkFIX1NOLCBUSUxFX09QQ19TUkFfU04sIFRJTEVfT1BDX1NVQkJfU04sCi0gIFRJTEVfT1BDX1NVQkhfU04sIFRJTEVfT1BDX1NVQl9TTiwgVElMRV9PUENfWE9SX1NOLCBUSUxFX09QQ19EV09SRF9BTElHTl9TTiwKKyAgVElMRVBST19PUENfU0xURV9VX1NOLCBUSUxFUFJPX09QQ19TTFRIX1NOLCBUSUxFUFJPX09QQ19TTFRIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NMVF9TTiwgVElMRVBST19PUENfU0xUX1VfU04sIFRJTEVQUk9fT1BDX1NORUJfU04sCisgIFRJTEVQUk9fT1BDX1NORUhfU04sIFRJTEVQUk9fT1BDX1NORV9TTiwgVElMRVBST19PUENfU1JBQl9TTiwKKyAgVElMRVBST19PUENfU1JBSF9TTiwgVElMRVBST19PUENfU1JBX1NOLCBUSUxFUFJPX09QQ19TVUJCX1NOLAorICBUSUxFUFJPX09QQ19TVUJIX1NOLCBUSUxFUFJPX09QQ19TVUJfU04sIFRJTEVQUk9fT1BDX1hPUl9TTiwKKyAgVElMRVBST19PUENfRFdPUkRfQUxJR05fU04sCiAgIEJJVEZJRUxEKDE4LCAzKSAvKiBpbmRleCA3ODAgKi8sCiAgIENISUxEKDc4OSksIENISUxEKDc5MiksIENISUxEKDc5NSksIENISUxEKDc5OCksIENISUxEKDgwMSksIENISUxEKDgwNCksCiAgIENISUxEKDgwNyksIENISUxEKDgxMCksCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA3ODkgKi8sCi0gIFRJTEVfT1BDX0FERFNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FERFNfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA3OTIgKi8sCi0gIFRJTEVfT1BDX1NVQlNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQlNfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA3OTUgKi8sCi0gIFRJTEVfT1BDX0FEREJTX1VfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FEREJTX1VfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA3OTggKi8sCi0gIFRJTEVfT1BDX0FEREhTX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19BRERIU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMjEsIDEpIC8qIGluZGV4IDgwMSAqLywKLSAgVElMRV9PUENfU1VCQlNfVV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1VCQlNfVV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMjEsIDEpIC8qIGluZGV4IDgwNCAqLywKLSAgVElMRV9PUENfU1VCSFNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQkhTX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggODA3ICovLAotICBUSUxFX09QQ19QQUNLSFNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1BBQ0tIU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMjEsIDEpIC8qIGluZGV4IDgxMCAqLywKLSAgVElMRV9PUENfUEFDS0JTX1VfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1BBQ0tCU19VX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg2LCAyKSAvKiBpbmRleCA4MTMgKi8sCi0gIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfQURETElfU04sIENISUxEKDgxOCksCisgIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwgVElMRVBST19PUENfQURETElfU04sCisgIENISUxEKDgxOCksCiAgIEJJVEZJRUxEKDgsIDIpIC8qIGluZGV4IDgxOCAqLywKLSAgVElMRV9PUENfQURETElfU04sIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgQ0hJTEQoODIzKSwKKyAgVElMRVBST19PUENfQURETElfU04sIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwKKyAgQ0hJTEQoODIzKSwKICAgQklURklFTEQoMTAsIDIpIC8qIGluZGV4IDgyMyAqLywKLSAgVElMRV9PUENfQURETElfU04sIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfTU9WRUxJX1NOLAorICBUSUxFUFJPX09QQ19BRERMSV9TTiwgVElMRVBST19PUENfQURETElfU04sIFRJTEVQUk9fT1BDX0FERExJX1NOLAorICBUSUxFUFJPX09QQ19NT1ZFTElfU04sCiAgIEJJVEZJRUxEKDYsIDIpIC8qIGluZGV4IDgyOCAqLywKLSAgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBUSUxFX09QQ19BRERMSSwgQ0hJTEQoODMzKSwKKyAgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX0FERExJLCBUSUxFUFJPX09QQ19BRERMSSwgQ0hJTEQoODMzKSwKICAgQklURklFTEQoOCwgMikgLyogaW5kZXggODMzICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBDSElMRCg4MzgpLAorICBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX0FERExJLCBDSElMRCg4MzgpLAogICBCSVRGSUVMRCgxMCwgMikgLyogaW5kZXggODM4ICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBUSUxFX09QQ19NT1ZFTEksCisgIFRJTEVQUk9fT1BDX0FERExJLCBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX01PVkVMSSwKICAgQklURklFTEQoMCwgMikgLyogaW5kZXggODQzICovLAotICBUSUxFX09QQ19BVUxJLCBUSUxFX09QQ19BVUxJLCBUSUxFX09QQ19BVUxJLCBDSElMRCg4NDgpLAorICBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBDSElMRCg4NDgpLAogICBCSVRGSUVMRCgyLCAyKSAvKiBpbmRleCA4NDggKi8sCi0gIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIENISUxEKDg1MyksCisgIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIENISUxEKDg1MyksCiAgIEJJVEZJRUxEKDQsIDIpIC8qIGluZGV4IDg1MyAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODU4KSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODU4KSwKICAgQklURklFTEQoNiwgMikgLyogaW5kZXggODU4ICovLAotICBUSUxFX09QQ19BVUxJLCBUSUxFX09QQ19BVUxJLCBUSUxFX09QQ19BVUxJLCBDSElMRCg4NjMpLAorICBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBDSElMRCg4NjMpLAogICBCSVRGSUVMRCg4LCAyKSAvKiBpbmRleCA4NjMgKi8sCi0gIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIENISUxEKDg2OCksCisgIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIENISUxEKDg2OCksCiAgIEJJVEZJRUxEKDEwLCAyKSAvKiBpbmRleCA4NjggKi8sCi0gIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0lORk9MLAorICBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19JTkZPTCwKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDg3MyAqLywKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfQURESUIsIFRJTEVfT1BDX0FERElILCBUSUxFX09QQ19BRERJLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19BRERJQiwgVElMRVBST19PUENfQURESUgsIFRJTEVQUk9fT1BDX0FEREksCiAgIEJJVEZJRUxEKDIwLCAyKSAvKiBpbmRleCA4NzggKi8sCi0gIFRJTEVfT1BDX01BWElCX1UsIFRJTEVfT1BDX01BWElILCBUSUxFX09QQ19NSU5JQl9VLCBUSUxFX09QQ19NSU5JSCwKKyAgVElMRVBST19PUENfTUFYSUJfVSwgVElMRVBST19PUENfTUFYSUgsIFRJTEVQUk9fT1BDX01JTklCX1UsCisgIFRJTEVQUk9fT1BDX01JTklILAogICBCSVRGSUVMRCgyMCwgMikgLyogaW5kZXggODgzICovLAotICBDSElMRCg4ODgpLCBUSUxFX09QQ19TRVFJQiwgVElMRV9PUENfU0VRSUgsIFRJTEVfT1BDX1NFUUksCisgIENISUxEKDg4OCksIFRJTEVQUk9fT1BDX1NFUUlCLCBUSUxFUFJPX09QQ19TRVFJSCwgVElMRVBST19PUENfU0VRSSwKICAgQklURklFTEQoNiwgMikgLyogaW5kZXggODg4ICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBDSElMRCg4OTMpLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBDSElMRCg4OTMpLAogICBCSVRGSUVMRCg4LCAyKSAvKiBpbmRleCA4OTMgKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIENISUxEKDg5OCksCisgIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIENISUxEKDg5OCksCiAgIEJJVEZJRUxEKDEwLCAyKSAvKiBpbmRleCA4OTggKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIFRJTEVfT1BDX01PVkVJLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19NT1ZFSSwKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDkwMyAqLywKLSAgVElMRV9PUENfU0xUSUIsIFRJTEVfT1BDX1NMVElCX1UsIFRJTEVfT1BDX1NMVElILCBUSUxFX09QQ19TTFRJSF9VLAorICBUSUxFUFJPX09QQ19TTFRJQiwgVElMRVBST19PUENfU0xUSUJfVSwgVElMRVBST19PUENfU0xUSUgsCisgIFRJTEVQUk9fT1BDX1NMVElIX1UsCiAgIEJJVEZJRUxEKDIwLCAyKSAvKiBpbmRleCA5MDggKi8sCi0gIFRJTEVfT1BDX1NMVEksIFRJTEVfT1BDX1NMVElfVSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU0xUSSwgVElMRVBST19PUENfU0xUSV9VLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMCwgMikgLyogaW5kZXggOTEzICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19BRERJQl9TTiwgVElMRV9PUENfQURESUhfU04sIFRJTEVfT1BDX0FERElfU04sCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX0FERElCX1NOLCBUSUxFUFJPX09QQ19BRERJSF9TTiwKKyAgVElMRVBST19PUENfQURESV9TTiwKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDkxOCAqLywKLSAgVElMRV9PUENfTUFYSUJfVV9TTiwgVElMRV9PUENfTUFYSUhfU04sIFRJTEVfT1BDX01JTklCX1VfU04sCi0gIFRJTEVfT1BDX01JTklIX1NOLAorICBUSUxFUFJPX09QQ19NQVhJQl9VX1NOLCBUSUxFUFJPX09QQ19NQVhJSF9TTiwgVElMRVBST19PUENfTUlOSUJfVV9TTiwKKyAgVElMRVBST19PUENfTUlOSUhfU04sCiAgIEJJVEZJRUxEKDIwLCAyKSAvKiBpbmRleCA5MjMgKi8sCi0gIENISUxEKDkyOCksIFRJTEVfT1BDX1NFUUlCX1NOLCBUSUxFX09QQ19TRVFJSF9TTiwgVElMRV9PUENfU0VRSV9TTiwKKyAgQ0hJTEQoOTI4KSwgVElMRVBST19PUENfU0VRSUJfU04sIFRJTEVQUk9fT1BDX1NFUUlIX1NOLCBUSUxFUFJPX09QQ19TRVFJX1NOLAogICBCSVRGSUVMRCg2LCAyKSAvKiBpbmRleCA5MjggKi8sCi0gIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfT1JJX1NOLCBUSUxFX09QQ19PUklfU04sIENISUxEKDkzMyksCisgIFRJTEVQUk9fT1BDX09SSV9TTiwgVElMRVBST19PUENfT1JJX1NOLCBUSUxFUFJPX09QQ19PUklfU04sIENISUxEKDkzMyksCiAgIEJJVEZJRUxEKDgsIDIpIC8qIGluZGV4IDkzMyAqLywKLSAgVElMRV9PUENfT1JJX1NOLCBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgQ0hJTEQoOTM4KSwKKyAgVElMRVBST19PUENfT1JJX1NOLCBUSUxFUFJPX09QQ19PUklfU04sIFRJTEVQUk9fT1BDX09SSV9TTiwgQ0hJTEQoOTM4KSwKICAgQklURklFTEQoMTAsIDIpIC8qIGluZGV4IDkzOCAqLywKLSAgVElMRV9PUENfT1JJX1NOLCBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfTU9WRUlfU04sCisgIFRJTEVQUk9fT1BDX09SSV9TTiwgVElMRVBST19PUENfT1JJX1NOLCBUSUxFUFJPX09QQ19PUklfU04sCisgIFRJTEVQUk9fT1BDX01PVkVJX1NOLAogICBCSVRGSUVMRCgyMCwgMikgLyogaW5kZXggOTQzICovLAotICBUSUxFX09QQ19TTFRJQl9TTiwgVElMRV9PUENfU0xUSUJfVV9TTiwgVElMRV9PUENfU0xUSUhfU04sCi0gIFRJTEVfT1BDX1NMVElIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NMVElCX1NOLCBUSUxFUFJPX09QQ19TTFRJQl9VX1NOLCBUSUxFUFJPX09QQ19TTFRJSF9TTiwKKyAgVElMRVBST19PUENfU0xUSUhfVV9TTiwKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDk0OCAqLywKLSAgVElMRV9PUENfU0xUSV9TTiwgVElMRV9PUENfU0xUSV9VX1NOLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TTFRJX1NOLCBUSUxFUFJPX09QQ19TTFRJX1VfU04sIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIwLCAyKSAvKiBpbmRleCA5NTMgKi8sCi0gIFRJTEVfT1BDX05PTkUsIENISUxEKDk1OCksIFRJTEVfT1BDX1hPUkksIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDk1OCksIFRJTEVQUk9fT1BDX1hPUkksIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDAsIDIpIC8qIGluZGV4IDk1OCAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoOTYzKSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoOTYzKSwKICAgQklURklFTEQoMiwgMikgLyogaW5kZXggOTYzICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBDSElMRCg5NjgpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg5NjgpLAogICBCSVRGSUVMRCg0LCAyKSAvKiBpbmRleCA5NjggKi8sCi0gIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIENISUxEKDk3MyksCisgIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIENISUxEKDk3MyksCiAgIEJJVEZJRUxEKDYsIDIpIC8qIGluZGV4IDk3MyAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoOTc4KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoOTc4KSwKICAgQklURklFTEQoOCwgMikgLyogaW5kZXggOTc4ICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBDSElMRCg5ODMpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg5ODMpLAogICBCSVRGSUVMRCgxMCwgMikgLyogaW5kZXggOTgzICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19JTkZPLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19JTkZPLAogICBCSVRGSUVMRCgyMCwgMikgLyogaW5kZXggOTg4ICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19BTkRJX1NOLCBUSUxFX09QQ19YT1JJX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19BTkRJX1NOLCBUSUxFUFJPX09QQ19YT1JJX1NOLAorICBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNywgNSkgLyogaW5kZXggOTkzICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19STEksIFRJTEVfT1BDX1NITElCLCBUSUxFX09QQ19TSExJSCwgVElMRV9PUENfU0hMSSwKLSAgVElMRV9PUENfU0hSSUIsIFRJTEVfT1BDX1NIUklILCBUSUxFX09QQ19TSFJJLCBUSUxFX09QQ19TUkFJQiwKLSAgVElMRV9PUENfU1JBSUgsIFRJTEVfT1BDX1NSQUksIENISUxEKDEwMjYpLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19STEksIFRJTEVQUk9fT1BDX1NITElCLCBUSUxFUFJPX09QQ19TSExJSCwKKyAgVElMRVBST19PUENfU0hMSSwgVElMRVBST19PUENfU0hSSUIsIFRJTEVQUk9fT1BDX1NIUklILCBUSUxFUFJPX09QQ19TSFJJLAorICBUSUxFUFJPX09QQ19TUkFJQiwgVElMRVBST19PUENfU1JBSUgsIFRJTEVQUk9fT1BDX1NSQUksIENISUxEKDEwMjYpLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxMiwgNCkgLyogaW5kZXggMTAyNiAqLywKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoMTA0MyksIENISUxEKDEwNDYpLCBDSElMRCgxMDQ5KSwgQ0hJTEQoMTA1MiksCisgIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDEwNDMpLCBDSElMRCgxMDQ2KSwgQ0hJTEQoMTA0OSksIENISUxEKDEwNTIpLAogICBDSElMRCgxMDU1KSwgQ0hJTEQoMTA1OCksIENISUxEKDEwNjEpLCBDSElMRCgxMDY0KSwgQ0hJTEQoMTA2NyksCi0gIENISUxEKDEwNzApLCBDSElMRCgxMDczKSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwKKyAgQ0hJTEQoMTA3MCksIENISUxEKDEwNzMpLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA0MyAqLywKLSAgVElMRV9PUENfQklUWCwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQklUWCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDEwNDYgKi8sCi0gIFRJTEVfT1BDX0JZVEVYLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19CWVRFWCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDEwNDkgKi8sCi0gIFRJTEVfT1BDX0NMWiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQ0xaLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA1MiAqLywKLSAgVElMRV9PUENfQ1RaLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19DVFosIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE2LCAxKSAvKiBpbmRleCAxMDU1ICovLAotICBUSUxFX09QQ19GTk9QLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19GTk9QLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA1OCAqLywKLSAgVElMRV9PUENfTk9QLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT1AsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE2LCAxKSAvKiBpbmRleCAxMDYxICovLAotICBUSUxFX09QQ19QQ05ULCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19QQ05ULCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA2NCAqLywKLSAgVElMRV9PUENfVEJMSURYQjAsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIwLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA2NyAqLywKLSAgVElMRV9PUENfVEJMSURYQjEsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIxLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA3MCAqLywKLSAgVElMRV9PUENfVEJMSURYQjIsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIyLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA3MyAqLywKLSAgVElMRV9PUENfVEJMSURYQjMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIzLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNywgNSkgLyogaW5kZXggMTA3NiAqLywKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfUkxJX1NOLCBUSUxFX09QQ19TSExJQl9TTiwgVElMRV9PUENfU0hMSUhfU04sCi0gIFRJTEVfT1BDX1NITElfU04sIFRJTEVfT1BDX1NIUklCX1NOLCBUSUxFX09QQ19TSFJJSF9TTiwgVElMRV9PUENfU0hSSV9TTiwKLSAgVElMRV9PUENfU1JBSUJfU04sIFRJTEVfT1BDX1NSQUlIX1NOLCBUSUxFX09QQ19TUkFJX1NOLCBDSElMRCgxMTA5KSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfUkxJX1NOLCBUSUxFUFJPX09QQ19TSExJQl9TTiwKKyAgVElMRVBST19PUENfU0hMSUhfU04sIFRJTEVQUk9fT1BDX1NITElfU04sIFRJTEVQUk9fT1BDX1NIUklCX1NOLAorICBUSUxFUFJPX09QQ19TSFJJSF9TTiwgVElMRVBST19PUENfU0hSSV9TTiwgVElMRVBST19PUENfU1JBSUJfU04sCisgIFRJTEVQUk9fT1BDX1NSQUlIX1NOLCBUSUxFUFJPX09QQ19TUkFJX1NOLCBDSElMRCgxMTA5KSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTIsIDQpIC8qIGluZGV4IDExMDkgKi8sCi0gIFRJTEVfT1BDX05PTkUsIENISUxEKDExMjYpLCBDSElMRCgxMTI5KSwgQ0hJTEQoMTEzMiksIENISUxEKDExMzUpLAorICBUSUxFUFJPX09QQ19OT05FLCBDSElMRCgxMTI2KSwgQ0hJTEQoMTEyOSksIENISUxEKDExMzIpLCBDSElMRCgxMTM1KSwKICAgQ0hJTEQoMTA1NSksIENISUxEKDEwNTgpLCBDSElMRCgxMTM4KSwgQ0hJTEQoMTE0MSksIENISUxEKDExNDQpLAotICBDSElMRCgxMTQ3KSwgQ0hJTEQoMTE1MCksIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsCisgIENISUxEKDExNDcpLCBDSElMRCgxMTUwKSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExMjYgKi8sCi0gIFRJTEVfT1BDX0JJVFhfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0JJVFhfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE2LCAxKSAvKiBpbmRleCAxMTI5ICovLAotICBUSUxFX09QQ19CWVRFWF9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQllURVhfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE2LCAxKSAvKiBpbmRleCAxMTMyICovLAotICBUSUxFX09QQ19DTFpfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0NMWl9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExMzUgKi8sCi0gIFRJTEVfT1BDX0NUWl9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQ1RaX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTEzOCAqLywKLSAgVElMRV9PUENfUENOVF9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfUENOVF9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExNDEgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIwX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMF9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExNDQgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIxX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExNDcgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIyX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMl9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExNTAgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIzX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCM19TTiwgVElMRVBST19PUENfTk9ORSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZWNvZGVfWDFfZnNtWzE1NDBdID0KIHsKICAgQklURklFTEQoNTQsIDkpIC8qIGluZGV4IDAgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIENISUxEKDUxMyksIENISUxEKDU2MSksIENISUxEKDU5NCksCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIENISUxEKDY0MSksIENISUxEKDY4OSksCi0gIENISUxEKDcyMiksIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIENISUxEKDc2NiksCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIENISUxEKDUxMyksIENISUxEKDU2MSksIENISUxEKDU5NCksIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDY0MSksCisgIENISUxEKDY4OSksIENISUxEKDcyMiksIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDc2NiksCiAgIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksCiAgIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksCiAgIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksCkBAIC0xNTk2LDU5NCArMTY1NSw2NDEgQEAKICAgQ0hJTEQoODI2KSwgQ0hJTEQoODI2KSwgQ0hJTEQoODI2KSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKLSAgQ0hJTEQoODQzKSwgQ0hJTEQoODYwKSwgQ0hJTEQoODk5KSwgQ0hJTEQoOTIzKSwgQ0hJTEQoOTMyKSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoOTQxKSwgQ0hJTEQoOTUwKSwgQ0hJTEQoOTc0KSwgQ0hJTEQoOTgzKSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBDSElMRCg5OTIpLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBDSElMRCgxMzM0KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsCi0gIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLAotICBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsCi0gIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLAotICBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsCi0gIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLAotICBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsCi0gIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLAotICBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBDSElMRCg4NDMpLCBDSElMRCg4NjApLCBDSElMRCg4OTkpLCBDSElMRCg5MjMpLCBDSElMRCg5MzIpLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBDSElMRCg5NDEpLCBDSElMRCg5NTApLCBDSElMRCg5NzQpLCBDSElMRCg5ODMpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIENISUxEKDk5MiksCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDEzMzQpLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQ5LCA1KSAvKiBpbmRleCA1MTMgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX0FEREIsIFRJTEVfT1BDX0FEREgsIFRJTEVfT1BDX0FERCwgVElMRV9PUENfQU5ELAotICBUSUxFX09QQ19JTlRIQiwgVElMRV9PUENfSU5USEgsIFRJTEVfT1BDX0lOVExCLCBUSUxFX09QQ19JTlRMSCwKLSAgVElMRV9PUENfSkFMUlAsIFRJTEVfT1BDX0pBTFIsIFRJTEVfT1BDX0pSUCwgVElMRV9PUENfSlIsIFRJTEVfT1BDX0xOSywKLSAgVElMRV9PUENfTUFYQl9VLCBUSUxFX09QQ19NQVhILCBUSUxFX09QQ19NSU5CX1UsIFRJTEVfT1BDX01JTkgsCi0gIFRJTEVfT1BDX01OWkIsIFRJTEVfT1BDX01OWkgsIFRJTEVfT1BDX01OWiwgVElMRV9PUENfTVpCLCBUSUxFX09QQ19NWkgsCi0gIFRJTEVfT1BDX01aLCBUSUxFX09QQ19OT1IsIENISUxEKDU0NiksIFRJTEVfT1BDX1BBQ0tIQiwgVElMRV9PUENfUEFDS0xCLAotICBUSUxFX09QQ19STCwgVElMRV9PUENfUzFBLCBUSUxFX09QQ19TMkEsIFRJTEVfT1BDX1MzQSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfQUREQiwgVElMRVBST19PUENfQURESCwgVElMRVBST19PUENfQURELAorICBUSUxFUFJPX09QQ19BTkQsIFRJTEVQUk9fT1BDX0lOVEhCLCBUSUxFUFJPX09QQ19JTlRISCwgVElMRVBST19PUENfSU5UTEIsCisgIFRJTEVQUk9fT1BDX0lOVExILCBUSUxFUFJPX09QQ19KQUxSUCwgVElMRVBST19PUENfSkFMUiwgVElMRVBST19PUENfSlJQLAorICBUSUxFUFJPX09QQ19KUiwgVElMRVBST19PUENfTE5LLCBUSUxFUFJPX09QQ19NQVhCX1UsIFRJTEVQUk9fT1BDX01BWEgsCisgIFRJTEVQUk9fT1BDX01JTkJfVSwgVElMRVBST19PUENfTUlOSCwgVElMRVBST19PUENfTU5aQiwgVElMRVBST19PUENfTU5aSCwKKyAgVElMRVBST19PUENfTU5aLCBUSUxFUFJPX09QQ19NWkIsIFRJTEVQUk9fT1BDX01aSCwgVElMRVBST19PUENfTVosCisgIFRJTEVQUk9fT1BDX05PUiwgQ0hJTEQoNTQ2KSwgVElMRVBST19PUENfUEFDS0hCLCBUSUxFUFJPX09QQ19QQUNLTEIsCisgIFRJTEVQUk9fT1BDX1JMLCBUSUxFUFJPX09QQ19TMUEsIFRJTEVQUk9fT1BDX1MyQSwgVElMRVBST19PUENfUzNBLAogICBCSVRGSUVMRCg0MywgMikgLyogaW5kZXggNTQ2ICovLAotICBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBDSElMRCg1NTEpLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBDSElMRCg1NTEpLAogICBCSVRGSUVMRCg0NSwgMikgLyogaW5kZXggNTUxICovLAotICBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBDSElMRCg1NTYpLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBDSElMRCg1NTYpLAogICBCSVRGSUVMRCg0NywgMikgLyogaW5kZXggNTU2ICovLAotICBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBUSUxFX09QQ19NT1ZFLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19NT1ZFLAogICBCSVRGSUVMRCg0OSwgNSkgLyogaW5kZXggNTYxICovLAotICBUSUxFX09QQ19TQiwgVElMRV9PUENfU0VRQiwgVElMRV9PUENfU0VRSCwgVElMRV9PUENfU0VRLCBUSUxFX09QQ19TSExCLAotICBUSUxFX09QQ19TSExILCBUSUxFX09QQ19TSEwsIFRJTEVfT1BDX1NIUkIsIFRJTEVfT1BDX1NIUkgsIFRJTEVfT1BDX1NIUiwKLSAgVElMRV9PUENfU0gsIFRJTEVfT1BDX1NMVEIsIFRJTEVfT1BDX1NMVEJfVSwgVElMRV9PUENfU0xURUIsCi0gIFRJTEVfT1BDX1NMVEVCX1UsIFRJTEVfT1BDX1NMVEVILCBUSUxFX09QQ19TTFRFSF9VLCBUSUxFX09QQ19TTFRFLAotICBUSUxFX09QQ19TTFRFX1UsIFRJTEVfT1BDX1NMVEgsIFRJTEVfT1BDX1NMVEhfVSwgVElMRV9PUENfU0xULAotICBUSUxFX09QQ19TTFRfVSwgVElMRV9PUENfU05FQiwgVElMRV9PUENfU05FSCwgVElMRV9PUENfU05FLCBUSUxFX09QQ19TUkFCLAotICBUSUxFX09QQ19TUkFILCBUSUxFX09QQ19TUkEsIFRJTEVfT1BDX1NVQkIsIFRJTEVfT1BDX1NVQkgsIFRJTEVfT1BDX1NVQiwKKyAgVElMRVBST19PUENfU0IsIFRJTEVQUk9fT1BDX1NFUUIsIFRJTEVQUk9fT1BDX1NFUUgsIFRJTEVQUk9fT1BDX1NFUSwKKyAgVElMRVBST19PUENfU0hMQiwgVElMRVBST19PUENfU0hMSCwgVElMRVBST19PUENfU0hMLCBUSUxFUFJPX09QQ19TSFJCLAorICBUSUxFUFJPX09QQ19TSFJILCBUSUxFUFJPX09QQ19TSFIsIFRJTEVQUk9fT1BDX1NILCBUSUxFUFJPX09QQ19TTFRCLAorICBUSUxFUFJPX09QQ19TTFRCX1UsIFRJTEVQUk9fT1BDX1NMVEVCLCBUSUxFUFJPX09QQ19TTFRFQl9VLAorICBUSUxFUFJPX09QQ19TTFRFSCwgVElMRVBST19PUENfU0xURUhfVSwgVElMRVBST19PUENfU0xURSwKKyAgVElMRVBST19PUENfU0xURV9VLCBUSUxFUFJPX09QQ19TTFRILCBUSUxFUFJPX09QQ19TTFRIX1UsIFRJTEVQUk9fT1BDX1NMVCwKKyAgVElMRVBST19PUENfU0xUX1UsIFRJTEVQUk9fT1BDX1NORUIsIFRJTEVQUk9fT1BDX1NORUgsIFRJTEVQUk9fT1BDX1NORSwKKyAgVElMRVBST19PUENfU1JBQiwgVElMRVBST19PUENfU1JBSCwgVElMRVBST19PUENfU1JBLCBUSUxFUFJPX09QQ19TVUJCLAorICBUSUxFUFJPX09QQ19TVUJILCBUSUxFUFJPX09QQ19TVUIsCiAgIEJJVEZJRUxEKDQ5LCA0KSAvKiBpbmRleCA1OTQgKi8sCiAgIENISUxEKDYxMSksIENISUxEKDYxNCksIENISUxEKDYxNyksIENISUxEKDYyMCksIENISUxEKDYyMyksIENISUxEKDYyNiksCi0gIENISUxEKDYyOSksIENISUxEKDYzMiksIENISUxEKDYzNSksIENISUxEKDYzOCksIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCisgIENISUxEKDYyOSksIENISUxEKDYzMiksIENISUxEKDYzNSksIENISUxEKDYzOCksIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MTEgKi8sCi0gIFRJTEVfT1BDX1NXLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TVywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDYxNCAqLywKLSAgVElMRV9PUENfWE9SLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19YT1IsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MTcgKi8sCi0gIFRJTEVfT1BDX0FERFMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FERFMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MjAgKi8sCi0gIFRJTEVfT1BDX1NVQlMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQlMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MjMgKi8sCi0gIFRJTEVfT1BDX0FEREJTX1UsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FEREJTX1UsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MjYgKi8sCi0gIFRJTEVfT1BDX0FEREhTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19BRERIUywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDYyOSAqLywKLSAgVElMRV9PUENfU1VCQlNfVSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1VCQlNfVSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDYzMiAqLywKLSAgVElMRV9PUENfU1VCSFMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQkhTLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNjM1ICovLAotICBUSUxFX09QQ19QQUNLSFMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1BBQ0tIUywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDYzOCAqLywKLSAgVElMRV9PUENfUEFDS0JTX1UsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1BBQ0tCU19VLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0OSwgNSkgLyogaW5kZXggNjQxICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19BRERCX1NOLCBUSUxFX09QQ19BRERIX1NOLCBUSUxFX09QQ19BRERfU04sCi0gIFRJTEVfT1BDX0FORF9TTiwgVElMRV9PUENfSU5USEJfU04sIFRJTEVfT1BDX0lOVEhIX1NOLCBUSUxFX09QQ19JTlRMQl9TTiwKLSAgVElMRV9PUENfSU5UTEhfU04sIFRJTEVfT1BDX0pBTFJQLCBUSUxFX09QQ19KQUxSLCBUSUxFX09QQ19KUlAsIFRJTEVfT1BDX0pSLAotICBUSUxFX09QQ19MTktfU04sIFRJTEVfT1BDX01BWEJfVV9TTiwgVElMRV9PUENfTUFYSF9TTiwgVElMRV9PUENfTUlOQl9VX1NOLAotICBUSUxFX09QQ19NSU5IX1NOLCBUSUxFX09QQ19NTlpCX1NOLCBUSUxFX09QQ19NTlpIX1NOLCBUSUxFX09QQ19NTlpfU04sCi0gIFRJTEVfT1BDX01aQl9TTiwgVElMRV9PUENfTVpIX1NOLCBUSUxFX09QQ19NWl9TTiwgVElMRV9PUENfTk9SX1NOLAotICBDSElMRCg2NzQpLCBUSUxFX09QQ19QQUNLSEJfU04sIFRJTEVfT1BDX1BBQ0tMQl9TTiwgVElMRV9PUENfUkxfU04sCi0gIFRJTEVfT1BDX1MxQV9TTiwgVElMRV9PUENfUzJBX1NOLCBUSUxFX09QQ19TM0FfU04sCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX0FEREJfU04sIFRJTEVQUk9fT1BDX0FEREhfU04sCisgIFRJTEVQUk9fT1BDX0FERF9TTiwgVElMRVBST19PUENfQU5EX1NOLCBUSUxFUFJPX09QQ19JTlRIQl9TTiwKKyAgVElMRVBST19PUENfSU5USEhfU04sIFRJTEVQUk9fT1BDX0lOVExCX1NOLCBUSUxFUFJPX09QQ19JTlRMSF9TTiwKKyAgVElMRVBST19PUENfSkFMUlAsIFRJTEVQUk9fT1BDX0pBTFIsIFRJTEVQUk9fT1BDX0pSUCwgVElMRVBST19PUENfSlIsCisgIFRJTEVQUk9fT1BDX0xOS19TTiwgVElMRVBST19PUENfTUFYQl9VX1NOLCBUSUxFUFJPX09QQ19NQVhIX1NOLAorICBUSUxFUFJPX09QQ19NSU5CX1VfU04sIFRJTEVQUk9fT1BDX01JTkhfU04sIFRJTEVQUk9fT1BDX01OWkJfU04sCisgIFRJTEVQUk9fT1BDX01OWkhfU04sIFRJTEVQUk9fT1BDX01OWl9TTiwgVElMRVBST19PUENfTVpCX1NOLAorICBUSUxFUFJPX09QQ19NWkhfU04sIFRJTEVQUk9fT1BDX01aX1NOLCBUSUxFUFJPX09QQ19OT1JfU04sIENISUxEKDY3NCksCisgIFRJTEVQUk9fT1BDX1BBQ0tIQl9TTiwgVElMRVBST19PUENfUEFDS0xCX1NOLCBUSUxFUFJPX09QQ19STF9TTiwKKyAgVElMRVBST19PUENfUzFBX1NOLCBUSUxFUFJPX09QQ19TMkFfU04sIFRJTEVQUk9fT1BDX1MzQV9TTiwKICAgQklURklFTEQoNDMsIDIpIC8qIGluZGV4IDY3NCAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgQ0hJTEQoNjc5KSwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwgQ0hJTEQoNjc5KSwKICAgQklURklFTEQoNDUsIDIpIC8qIGluZGV4IDY3OSAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgQ0hJTEQoNjg0KSwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwgQ0hJTEQoNjg0KSwKICAgQklURklFTEQoNDcsIDIpIC8qIGluZGV4IDY4NCAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgVElMRV9PUENfTU9WRV9TTiwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwKKyAgVElMRVBST19PUENfTU9WRV9TTiwKICAgQklURklFTEQoNDksIDUpIC8qIGluZGV4IDY4OSAqLywKLSAgVElMRV9PUENfU0IsIFRJTEVfT1BDX1NFUUJfU04sIFRJTEVfT1BDX1NFUUhfU04sIFRJTEVfT1BDX1NFUV9TTiwKLSAgVElMRV9PUENfU0hMQl9TTiwgVElMRV9PUENfU0hMSF9TTiwgVElMRV9PUENfU0hMX1NOLCBUSUxFX09QQ19TSFJCX1NOLAotICBUSUxFX09QQ19TSFJIX1NOLCBUSUxFX09QQ19TSFJfU04sIFRJTEVfT1BDX1NILCBUSUxFX09QQ19TTFRCX1NOLAotICBUSUxFX09QQ19TTFRCX1VfU04sIFRJTEVfT1BDX1NMVEVCX1NOLCBUSUxFX09QQ19TTFRFQl9VX1NOLAotICBUSUxFX09QQ19TTFRFSF9TTiwgVElMRV9PUENfU0xURUhfVV9TTiwgVElMRV9PUENfU0xURV9TTiwKLSAgVElMRV9PUENfU0xURV9VX1NOLCBUSUxFX09QQ19TTFRIX1NOLCBUSUxFX09QQ19TTFRIX1VfU04sIFRJTEVfT1BDX1NMVF9TTiwKLSAgVElMRV9PUENfU0xUX1VfU04sIFRJTEVfT1BDX1NORUJfU04sIFRJTEVfT1BDX1NORUhfU04sIFRJTEVfT1BDX1NORV9TTiwKLSAgVElMRV9PUENfU1JBQl9TTiwgVElMRV9PUENfU1JBSF9TTiwgVElMRV9PUENfU1JBX1NOLCBUSUxFX09QQ19TVUJCX1NOLAotICBUSUxFX09QQ19TVUJIX1NOLCBUSUxFX09QQ19TVUJfU04sCisgIFRJTEVQUk9fT1BDX1NCLCBUSUxFUFJPX09QQ19TRVFCX1NOLCBUSUxFUFJPX09QQ19TRVFIX1NOLAorICBUSUxFUFJPX09QQ19TRVFfU04sIFRJTEVQUk9fT1BDX1NITEJfU04sIFRJTEVQUk9fT1BDX1NITEhfU04sCisgIFRJTEVQUk9fT1BDX1NITF9TTiwgVElMRVBST19PUENfU0hSQl9TTiwgVElMRVBST19PUENfU0hSSF9TTiwKKyAgVElMRVBST19PUENfU0hSX1NOLCBUSUxFUFJPX09QQ19TSCwgVElMRVBST19PUENfU0xUQl9TTiwKKyAgVElMRVBST19PUENfU0xUQl9VX1NOLCBUSUxFUFJPX09QQ19TTFRFQl9TTiwgVElMRVBST19PUENfU0xURUJfVV9TTiwKKyAgVElMRVBST19PUENfU0xURUhfU04sIFRJTEVQUk9fT1BDX1NMVEVIX1VfU04sIFRJTEVQUk9fT1BDX1NMVEVfU04sCisgIFRJTEVQUk9fT1BDX1NMVEVfVV9TTiwgVElMRVBST19PUENfU0xUSF9TTiwgVElMRVBST19PUENfU0xUSF9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRfU04sIFRJTEVQUk9fT1BDX1NMVF9VX1NOLCBUSUxFUFJPX09QQ19TTkVCX1NOLAorICBUSUxFUFJPX09QQ19TTkVIX1NOLCBUSUxFUFJPX09QQ19TTkVfU04sIFRJTEVQUk9fT1BDX1NSQUJfU04sCisgIFRJTEVQUk9fT1BDX1NSQUhfU04sIFRJTEVQUk9fT1BDX1NSQV9TTiwgVElMRVBST19PUENfU1VCQl9TTiwKKyAgVElMRVBST19PUENfU1VCSF9TTiwgVElMRVBST19PUENfU1VCX1NOLAogICBCSVRGSUVMRCg0OSwgNCkgLyogaW5kZXggNzIyICovLAogICBDSElMRCg2MTEpLCBDSElMRCg3MzkpLCBDSElMRCg3NDIpLCBDSElMRCg3NDUpLCBDSElMRCg3NDgpLCBDSElMRCg3NTEpLAotICBDSElMRCg3NTQpLCBDSElMRCg3NTcpLCBDSElMRCg3NjApLCBDSElMRCg3NjMpLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBDSElMRCg3NTQpLCBDSElMRCg3NTcpLCBDSElMRCg3NjApLCBDSElMRCg3NjMpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNzM5ICovLAotICBUSUxFX09QQ19YT1JfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1hPUl9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDc0MiAqLywKLSAgVElMRV9PUENfQUREU19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQUREU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDc0NSAqLywKLSAgVElMRV9PUENfU1VCU19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1VCU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDc0OCAqLywKLSAgVElMRV9PUENfQUREQlNfVV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQUREQlNfVV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDc1MSAqLywKLSAgVElMRV9PUENfQURESFNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FEREhTX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNzU0ICovLAotICBUSUxFX09QQ19TVUJCU19VX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TVUJCU19VX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNzU3ICovLAotICBUSUxFX09QQ19TVUJIU19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1VCSFNfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA3NjAgKi8sCi0gIFRJTEVfT1BDX1BBQ0tIU19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfUEFDS0hTX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNzYzICovLAotICBUSUxFX09QQ19QQUNLQlNfVV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfUEFDS0JTX1VfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDM3LCAyKSAvKiBpbmRleCA3NjYgKi8sCi0gIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfQURETElfU04sIENISUxEKDc3MSksCisgIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwgVElMRVBST19PUENfQURETElfU04sCisgIENISUxEKDc3MSksCiAgIEJJVEZJRUxEKDM5LCAyKSAvKiBpbmRleCA3NzEgKi8sCi0gIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfQURETElfU04sIENISUxEKDc3NiksCisgIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwgVElMRVBST19PUENfQURETElfU04sCisgIENISUxEKDc3NiksCiAgIEJJVEZJRUxEKDQxLCAyKSAvKiBpbmRleCA3NzYgKi8sCi0gIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfQURETElfU04sIFRJTEVfT1BDX01PVkVMSV9TTiwKKyAgVElMRVBST19PUENfQURETElfU04sIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwKKyAgVElMRVBST19PUENfTU9WRUxJX1NOLAogICBCSVRGSUVMRCgzNywgMikgLyogaW5kZXggNzgxICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBDSElMRCg3ODYpLAorICBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX0FERExJLCBDSElMRCg3ODYpLAogICBCSVRGSUVMRCgzOSwgMikgLyogaW5kZXggNzg2ICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBDSElMRCg3OTEpLAorICBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX0FERExJLCBDSElMRCg3OTEpLAogICBCSVRGSUVMRCg0MSwgMikgLyogaW5kZXggNzkxICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBUSUxFX09QQ19NT1ZFTEksCisgIFRJTEVQUk9fT1BDX0FERExJLCBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX01PVkVMSSwKICAgQklURklFTEQoMzEsIDIpIC8qIGluZGV4IDc5NiAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODAxKSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODAxKSwKICAgQklURklFTEQoMzMsIDIpIC8qIGluZGV4IDgwMSAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODA2KSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODA2KSwKICAgQklURklFTEQoMzUsIDIpIC8qIGluZGV4IDgwNiAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODExKSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODExKSwKICAgQklURklFTEQoMzcsIDIpIC8qIGluZGV4IDgxMSAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODE2KSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODE2KSwKICAgQklURklFTEQoMzksIDIpIC8qIGluZGV4IDgxNiAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODIxKSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODIxKSwKICAgQklURklFTEQoNDEsIDIpIC8qIGluZGV4IDgyMSAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfSU5GT0wsCisgIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0lORk9MLAogICBCSVRGSUVMRCgzMSwgNCkgLyogaW5kZXggODI2ICovLAotICBUSUxFX09QQ19CWiwgVElMRV9PUENfQlpULCBUSUxFX09QQ19CTlosIFRJTEVfT1BDX0JOWlQsIFRJTEVfT1BDX0JHWiwKLSAgVElMRV9PUENfQkdaVCwgVElMRV9PUENfQkdFWiwgVElMRV9PUENfQkdFWlQsIFRJTEVfT1BDX0JMWiwgVElMRV9PUENfQkxaVCwKLSAgVElMRV9PUENfQkxFWiwgVElMRV9PUENfQkxFWlQsIFRJTEVfT1BDX0JCUywgVElMRV9PUENfQkJTVCwgVElMRV9PUENfQkJOUywKLSAgVElMRV9PUENfQkJOU1QsCisgIFRJTEVQUk9fT1BDX0JaLCBUSUxFUFJPX09QQ19CWlQsIFRJTEVQUk9fT1BDX0JOWiwgVElMRVBST19PUENfQk5aVCwKKyAgVElMRVBST19PUENfQkdaLCBUSUxFUFJPX09QQ19CR1pULCBUSUxFUFJPX09QQ19CR0VaLCBUSUxFUFJPX09QQ19CR0VaVCwKKyAgVElMRVBST19PUENfQkxaLCBUSUxFUFJPX09QQ19CTFpULCBUSUxFUFJPX09QQ19CTEVaLCBUSUxFUFJPX09QQ19CTEVaVCwKKyAgVElMRVBST19PUENfQkJTLCBUSUxFUFJPX09QQ19CQlNULCBUSUxFUFJPX09QQ19CQk5TLCBUSUxFUFJPX09QQ19CQk5TVCwKICAgQklURklFTEQoMzEsIDQpIC8qIGluZGV4IDg0MyAqLywKLSAgVElMRV9PUENfQlpfU04sIFRJTEVfT1BDX0JaVF9TTiwgVElMRV9PUENfQk5aX1NOLCBUSUxFX09QQ19CTlpUX1NOLAotICBUSUxFX09QQ19CR1pfU04sIFRJTEVfT1BDX0JHWlRfU04sIFRJTEVfT1BDX0JHRVpfU04sIFRJTEVfT1BDX0JHRVpUX1NOLAotICBUSUxFX09QQ19CTFpfU04sIFRJTEVfT1BDX0JMWlRfU04sIFRJTEVfT1BDX0JMRVpfU04sIFRJTEVfT1BDX0JMRVpUX1NOLAotICBUSUxFX09QQ19CQlNfU04sIFRJTEVfT1BDX0JCU1RfU04sIFRJTEVfT1BDX0JCTlNfU04sIFRJTEVfT1BDX0JCTlNUX1NOLAorICBUSUxFUFJPX09QQ19CWl9TTiwgVElMRVBST19PUENfQlpUX1NOLCBUSUxFUFJPX09QQ19CTlpfU04sCisgIFRJTEVQUk9fT1BDX0JOWlRfU04sIFRJTEVQUk9fT1BDX0JHWl9TTiwgVElMRVBST19PUENfQkdaVF9TTiwKKyAgVElMRVBST19PUENfQkdFWl9TTiwgVElMRVBST19PUENfQkdFWlRfU04sIFRJTEVQUk9fT1BDX0JMWl9TTiwKKyAgVElMRVBST19PUENfQkxaVF9TTiwgVElMRVBST19PUENfQkxFWl9TTiwgVElMRVBST19PUENfQkxFWlRfU04sCisgIFRJTEVQUk9fT1BDX0JCU19TTiwgVElMRVBST19PUENfQkJTVF9TTiwgVElMRVBST19PUENfQkJOU19TTiwKKyAgVElMRVBST19PUENfQkJOU1RfU04sCiAgIEJJVEZJRUxEKDUxLCAzKSAvKiBpbmRleCA4NjAgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX0FERElCLCBUSUxFX09QQ19BRERJSCwgVElMRV9PUENfQURESSwgQ0hJTEQoODY5KSwKLSAgVElMRV9PUENfTUFYSUJfVSwgVElMRV9PUENfTUFYSUgsIFRJTEVfT1BDX01GU1BSLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19BRERJQiwgVElMRVBST19PUENfQURESUgsIFRJTEVQUk9fT1BDX0FEREksCisgIENISUxEKDg2OSksIFRJTEVQUk9fT1BDX01BWElCX1UsIFRJTEVQUk9fT1BDX01BWElILCBUSUxFUFJPX09QQ19NRlNQUiwKICAgQklURklFTEQoMzEsIDIpIC8qIGluZGV4IDg2OSAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODc0KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODc0KSwKICAgQklURklFTEQoMzMsIDIpIC8qIGluZGV4IDg3NCAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODc5KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODc5KSwKICAgQklURklFTEQoMzUsIDIpIC8qIGluZGV4IDg3OSAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODg0KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODg0KSwKICAgQklURklFTEQoMzcsIDIpIC8qIGluZGV4IDg4NCAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODg5KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODg5KSwKICAgQklURklFTEQoMzksIDIpIC8qIGluZGV4IDg4OSAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODk0KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODk0KSwKICAgQklURklFTEQoNDEsIDIpIC8qIGluZGV4IDg5NCAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfSU5GTywKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfSU5GTywKICAgQklURklFTEQoNTEsIDMpIC8qIGluZGV4IDg5OSAqLywKLSAgVElMRV9PUENfTUlOSUJfVSwgVElMRV9PUENfTUlOSUgsIFRJTEVfT1BDX01UU1BSLCBDSElMRCg5MDgpLAotICBUSUxFX09QQ19TRVFJQiwgVElMRV9PUENfU0VRSUgsIFRJTEVfT1BDX1NFUUksIFRJTEVfT1BDX1NMVElCLAorICBUSUxFUFJPX09QQ19NSU5JQl9VLCBUSUxFUFJPX09QQ19NSU5JSCwgVElMRVBST19PUENfTVRTUFIsIENISUxEKDkwOCksCisgIFRJTEVQUk9fT1BDX1NFUUlCLCBUSUxFUFJPX09QQ19TRVFJSCwgVElMRVBST19PUENfU0VRSSwgVElMRVBST19PUENfU0xUSUIsCiAgIEJJVEZJRUxEKDM3LCAyKSAvKiBpbmRleCA5MDggKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIENISUxEKDkxMyksCisgIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIENISUxEKDkxMyksCiAgIEJJVEZJRUxEKDM5LCAyKSAvKiBpbmRleCA5MTMgKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIENISUxEKDkxOCksCisgIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIENISUxEKDkxOCksCiAgIEJJVEZJRUxEKDQxLCAyKSAvKiBpbmRleCA5MTggKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIFRJTEVfT1BDX01PVkVJLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19NT1ZFSSwKICAgQklURklFTEQoNTEsIDMpIC8qIGluZGV4IDkyMyAqLywKLSAgVElMRV9PUENfU0xUSUJfVSwgVElMRV9PUENfU0xUSUgsIFRJTEVfT1BDX1NMVElIX1UsIFRJTEVfT1BDX1NMVEksCi0gIFRJTEVfT1BDX1NMVElfVSwgVElMRV9PUENfWE9SSSwgVElMRV9PUENfTEJBREQsIFRJTEVfT1BDX0xCQUREX1UsCisgIFRJTEVQUk9fT1BDX1NMVElCX1UsIFRJTEVQUk9fT1BDX1NMVElILCBUSUxFUFJPX09QQ19TTFRJSF9VLAorICBUSUxFUFJPX09QQ19TTFRJLCBUSUxFUFJPX09QQ19TTFRJX1UsIFRJTEVQUk9fT1BDX1hPUkksIFRJTEVQUk9fT1BDX0xCQURELAorICBUSUxFUFJPX09QQ19MQkFERF9VLAogICBCSVRGSUVMRCg1MSwgMykgLyogaW5kZXggOTMyICovLAotICBUSUxFX09QQ19MSEFERCwgVElMRV9PUENfTEhBRERfVSwgVElMRV9PUENfTFdBREQsIFRJTEVfT1BDX0xXQUREX05BLAotICBUSUxFX09QQ19TQkFERCwgVElMRV9PUENfU0hBREQsIFRJTEVfT1BDX1NXQURELCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19MSEFERCwgVElMRVBST19PUENfTEhBRERfVSwgVElMRVBST19PUENfTFdBREQsCisgIFRJTEVQUk9fT1BDX0xXQUREX05BLCBUSUxFUFJPX09QQ19TQkFERCwgVElMRVBST19PUENfU0hBREQsCisgIFRJTEVQUk9fT1BDX1NXQURELCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MSwgMykgLyogaW5kZXggOTQxICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19BRERJQl9TTiwgVElMRV9PUENfQURESUhfU04sIFRJTEVfT1BDX0FERElfU04sCi0gIFRJTEVfT1BDX0FORElfU04sIFRJTEVfT1BDX01BWElCX1VfU04sIFRJTEVfT1BDX01BWElIX1NOLCBUSUxFX09QQ19NRlNQUiwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfQURESUJfU04sIFRJTEVQUk9fT1BDX0FERElIX1NOLAorICBUSUxFUFJPX09QQ19BRERJX1NOLCBUSUxFUFJPX09QQ19BTkRJX1NOLCBUSUxFUFJPX09QQ19NQVhJQl9VX1NOLAorICBUSUxFUFJPX09QQ19NQVhJSF9TTiwgVElMRVBST19PUENfTUZTUFIsCiAgIEJJVEZJRUxEKDUxLCAzKSAvKiBpbmRleCA5NTAgKi8sCi0gIFRJTEVfT1BDX01JTklCX1VfU04sIFRJTEVfT1BDX01JTklIX1NOLCBUSUxFX09QQ19NVFNQUiwgQ0hJTEQoOTU5KSwKLSAgVElMRV9PUENfU0VRSUJfU04sIFRJTEVfT1BDX1NFUUlIX1NOLCBUSUxFX09QQ19TRVFJX1NOLCBUSUxFX09QQ19TTFRJQl9TTiwKKyAgVElMRVBST19PUENfTUlOSUJfVV9TTiwgVElMRVBST19PUENfTUlOSUhfU04sIFRJTEVQUk9fT1BDX01UU1BSLCBDSElMRCg5NTkpLAorICBUSUxFUFJPX09QQ19TRVFJQl9TTiwgVElMRVBST19PUENfU0VRSUhfU04sIFRJTEVQUk9fT1BDX1NFUUlfU04sCisgIFRJTEVQUk9fT1BDX1NMVElCX1NOLAogICBCSVRGSUVMRCgzNywgMikgLyogaW5kZXggOTU5ICovLAotICBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfT1JJX1NOLCBDSElMRCg5NjQpLAorICBUSUxFUFJPX09QQ19PUklfU04sIFRJTEVQUk9fT1BDX09SSV9TTiwgVElMRVBST19PUENfT1JJX1NOLCBDSElMRCg5NjQpLAogICBCSVRGSUVMRCgzOSwgMikgLyogaW5kZXggOTY0ICovLAotICBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfT1JJX1NOLCBDSElMRCg5NjkpLAorICBUSUxFUFJPX09QQ19PUklfU04sIFRJTEVQUk9fT1BDX09SSV9TTiwgVElMRVBST19PUENfT1JJX1NOLCBDSElMRCg5NjkpLAogICBCSVRGSUVMRCg0MSwgMikgLyogaW5kZXggOTY5ICovLAotICBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfT1JJX1NOLCBUSUxFX09QQ19NT1ZFSV9TTiwKKyAgVElMRVBST19PUENfT1JJX1NOLCBUSUxFUFJPX09QQ19PUklfU04sIFRJTEVQUk9fT1BDX09SSV9TTiwKKyAgVElMRVBST19PUENfTU9WRUlfU04sCiAgIEJJVEZJRUxEKDUxLCAzKSAvKiBpbmRleCA5NzQgKi8sCi0gIFRJTEVfT1BDX1NMVElCX1VfU04sIFRJTEVfT1BDX1NMVElIX1NOLCBUSUxFX09QQ19TTFRJSF9VX1NOLAotICBUSUxFX09QQ19TTFRJX1NOLCBUSUxFX09QQ19TTFRJX1VfU04sIFRJTEVfT1BDX1hPUklfU04sIFRJTEVfT1BDX0xCQUREX1NOLAotICBUSUxFX09QQ19MQkFERF9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRJQl9VX1NOLCBUSUxFUFJPX09QQ19TTFRJSF9TTiwgVElMRVBST19PUENfU0xUSUhfVV9TTiwKKyAgVElMRVBST19PUENfU0xUSV9TTiwgVElMRVBST19PUENfU0xUSV9VX1NOLCBUSUxFUFJPX09QQ19YT1JJX1NOLAorICBUSUxFUFJPX09QQ19MQkFERF9TTiwgVElMRVBST19PUENfTEJBRERfVV9TTiwKICAgQklURklFTEQoNTEsIDMpIC8qIGluZGV4IDk4MyAqLywKLSAgVElMRV9PUENfTEhBRERfU04sIFRJTEVfT1BDX0xIQUREX1VfU04sIFRJTEVfT1BDX0xXQUREX1NOLAotICBUSUxFX09QQ19MV0FERF9OQV9TTiwgVElMRV9PUENfU0JBREQsIFRJTEVfT1BDX1NIQURELCBUSUxFX09QQ19TV0FERCwKLSAgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTEhBRERfU04sIFRJTEVQUk9fT1BDX0xIQUREX1VfU04sIFRJTEVQUk9fT1BDX0xXQUREX1NOLAorICBUSUxFUFJPX09QQ19MV0FERF9OQV9TTiwgVElMRVBST19PUENfU0JBREQsIFRJTEVQUk9fT1BDX1NIQURELAorICBUSUxFUFJPX09QQ19TV0FERCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDYsIDcpIC8qIGluZGV4IDk5MiAqLywKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgQ0hJTEQoMTEyMSksCi0gIENISUxEKDExMjEpLCBDSElMRCgxMTIxKSwgQ0hJTEQoMTEyMSksIENISUxEKDExMjQpLCBDSElMRCgxMTI0KSwKLSAgQ0hJTEQoMTEyNCksIENISUxEKDExMjQpLCBDSElMRCgxMTI3KSwgQ0hJTEQoMTEyNyksIENISUxEKDExMjcpLAotICBDSElMRCgxMTI3KSwgQ0hJTEQoMTEzMCksIENISUxEKDExMzApLCBDSElMRCgxMTMwKSwgQ0hJTEQoMTEzMCksCi0gIENISUxEKDExMzMpLCBDSElMRCgxMTMzKSwgQ0hJTEQoMTEzMyksIENISUxEKDExMzMpLCBDSElMRCgxMTM2KSwKLSAgQ0hJTEQoMTEzNiksIENISUxEKDExMzYpLCBDSElMRCgxMTM2KSwgQ0hJTEQoMTEzOSksIENISUxEKDExMzkpLAotICBDSElMRCgxMTM5KSwgQ0hJTEQoMTEzOSksIENISUxEKDExNDIpLCBDSElMRCgxMTQyKSwgQ0hJTEQoMTE0MiksCi0gIENISUxEKDExNDIpLCBDSElMRCgxMTQ1KSwgQ0hJTEQoMTE0NSksIENISUxEKDExNDUpLCBDSElMRCgxMTQ1KSwKLSAgQ0hJTEQoMTE0OCksIENISUxEKDExNDgpLCBDSElMRCgxMTQ4KSwgQ0hJTEQoMTE0OCksIENISUxEKDExNTEpLAotICBDSElMRCgxMjQyKSwgQ0hJTEQoMTI5MCksIENISUxEKDEzMjMpLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBDSElMRCgxMTIxKSwgQ0hJTEQoMTEyMSksIENISUxEKDExMjEpLCBDSElMRCgxMTIxKSwgQ0hJTEQoMTEyNCksCisgIENISUxEKDExMjQpLCBDSElMRCgxMTI0KSwgQ0hJTEQoMTEyNCksIENISUxEKDExMjcpLCBDSElMRCgxMTI3KSwKKyAgQ0hJTEQoMTEyNyksIENISUxEKDExMjcpLCBDSElMRCgxMTMwKSwgQ0hJTEQoMTEzMCksIENISUxEKDExMzApLAorICBDSElMRCgxMTMwKSwgQ0hJTEQoMTEzMyksIENISUxEKDExMzMpLCBDSElMRCgxMTMzKSwgQ0hJTEQoMTEzMyksCisgIENISUxEKDExMzYpLCBDSElMRCgxMTM2KSwgQ0hJTEQoMTEzNiksIENISUxEKDExMzYpLCBDSElMRCgxMTM5KSwKKyAgQ0hJTEQoMTEzOSksIENISUxEKDExMzkpLCBDSElMRCgxMTM5KSwgQ0hJTEQoMTE0MiksIENISUxEKDExNDIpLAorICBDSElMRCgxMTQyKSwgQ0hJTEQoMTE0MiksIENISUxEKDExNDUpLCBDSElMRCgxMTQ1KSwgQ0hJTEQoMTE0NSksCisgIENISUxEKDExNDUpLCBDSElMRCgxMTQ4KSwgQ0hJTEQoMTE0OCksIENISUxEKDExNDgpLCBDSElMRCgxMTQ4KSwKKyAgQ0hJTEQoMTE1MSksIENISUxEKDEyNDIpLCBDSElMRCgxMjkwKSwgQ0hJTEQoMTMyMyksIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTIxICovLAotICBUSUxFX09QQ19STEksIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1JMSSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExMjQgKi8sCi0gIFRJTEVfT1BDX1NITElCLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSExJQiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExMjcgKi8sCi0gIFRJTEVfT1BDX1NITElILCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSExJSCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExMzAgKi8sCi0gIFRJTEVfT1BDX1NITEksIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NITEksIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTMzICovLAotICBUSUxFX09QQ19TSFJJQiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU0hSSUIsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTM2ICovLAotICBUSUxFX09QQ19TSFJJSCwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU0hSSUgsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTM5ICovLAotICBUSUxFX09QQ19TSFJJLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSFJJLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTE0MiAqLywKLSAgVElMRV9PUENfU1JBSUIsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NSQUlCLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTE0NSAqLywKLSAgVElMRV9PUENfU1JBSUgsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NSQUlILCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTE0OCAqLywKLSAgVElMRV9PUENfU1JBSSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1JBSSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDMsIDMpIC8qIGluZGV4IDExNTEgKi8sCi0gIFRJTEVfT1BDX05PTkUsIENISUxEKDExNjApLCBDSElMRCgxMTYzKSwgQ0hJTEQoMTE2NiksIENISUxEKDExNjkpLAorICBUSUxFUFJPX09QQ19OT05FLCBDSElMRCgxMTYwKSwgQ0hJTEQoMTE2MyksIENISUxEKDExNjYpLCBDSElMRCgxMTY5KSwKICAgQ0hJTEQoMTE3MiksIENISUxEKDExNzUpLCBDSElMRCgxMTc4KSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExNjAgKi8sCi0gIFRJTEVfT1BDX0RSQUlOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19EUkFJTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExNjMgKi8sCi0gIFRJTEVfT1BDX0RUTEJQUiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfRFRMQlBSLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTE2NiAqLywKLSAgVElMRV9PUENfRklOViwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfRklOViwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExNjkgKi8sCi0gIFRJTEVfT1BDX0ZMVVNILCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19GTFVTSCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExNzIgKi8sCi0gIFRJTEVfT1BDX0ZOT1AsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0ZOT1AsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTc1ICovLAotICBUSUxFX09QQ19JQ09ILCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19JQ09ILCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgzMSwgMikgLyogaW5kZXggMTE3OCAqLywKICAgQ0hJTEQoMTE4MyksIENISUxEKDEyMTEpLCBDSElMRCgxMjM5KSwgQ0hJTEQoMTIzOSksCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTgzICovLAotICBDSElMRCgxMTg2KSwgVElMRV9PUENfTk9ORSwKKyAgQ0hJTEQoMTE4NiksIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDMzLCAyKSAvKiBpbmRleCAxMTg2ICovLAotICBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLCBDSElMRCgxMTkxKSwKKyAgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwgQ0hJTEQoMTE5MSksCiAgIEJJVEZJRUxEKDM1LCAyKSAvKiBpbmRleCAxMTkxICovLAotICBUSUxFX09QQ19JTEwsIENISUxEKDExOTYpLCBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwKKyAgVElMRVBST19PUENfSUxMLCBDSElMRCgxMTk2KSwgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19JTEwsCiAgIEJJVEZJRUxEKDM3LCAyKSAvKiBpbmRleCAxMTk2ICovLAotICBUSUxFX09QQ19JTEwsIENISUxEKDEyMDEpLCBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwKKyAgVElMRVBST19PUENfSUxMLCBDSElMRCgxMjAxKSwgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19JTEwsCiAgIEJJVEZJRUxEKDM5LCAyKSAvKiBpbmRleCAxMjAxICovLAotICBUSUxFX09QQ19JTEwsIENISUxEKDEyMDYpLCBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwKKyAgVElMRVBST19PUENfSUxMLCBDSElMRCgxMjA2KSwgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19JTEwsCiAgIEJJVEZJRUxEKDQxLCAyKSAvKiBpbmRleCAxMjA2ICovLAotICBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfQlBULCBUSUxFX09QQ19JTEwsCisgIFRJTEVQUk9fT1BDX0lMTCwgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19CUFQsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEyMTEgKi8sCi0gIENISUxEKDEyMTQpLCBUSUxFX09QQ19OT05FLAorICBDSElMRCgxMjE0KSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMzMsIDIpIC8qIGluZGV4IDEyMTQgKi8sCi0gIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLCBUSUxFX09QQ19JTEwsIENISUxEKDEyMTkpLAorICBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwgVElMRVBST19PUENfSUxMLCBDSElMRCgxMjE5KSwKICAgQklURklFTEQoMzUsIDIpIC8qIGluZGV4IDEyMTkgKi8sCi0gIFRJTEVfT1BDX0lMTCwgQ0hJTEQoMTIyNCksIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLAorICBUSUxFUFJPX09QQ19JTEwsIENISUxEKDEyMjQpLCBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoMzcsIDIpIC8qIGluZGV4IDEyMjQgKi8sCi0gIFRJTEVfT1BDX0lMTCwgQ0hJTEQoMTIyOSksIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLAorICBUSUxFUFJPX09QQ19JTEwsIENISUxEKDEyMjkpLCBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoMzksIDIpIC8qIGluZGV4IDEyMjkgKi8sCi0gIFRJTEVfT1BDX0lMTCwgQ0hJTEQoMTIzNCksIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLAorICBUSUxFUFJPX09QQ19JTEwsIENISUxEKDEyMzQpLCBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoNDEsIDIpIC8qIGluZGV4IDEyMzQgKi8sCi0gIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLCBUSUxFX09QQ19SQUlTRSwgVElMRV9PUENfSUxMLAorICBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwgVElMRVBST19PUENfUkFJU0UsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEyMzkgKi8sCi0gIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0MywgMykgLyogaW5kZXggMTI0MiAqLywKICAgQ0hJTEQoMTI1MSksIENISUxEKDEyNTQpLCBDSElMRCgxMjU3KSwgQ0hJTEQoMTI3NSksIENISUxEKDEyNzgpLAogICBDSElMRCgxMjgxKSwgQ0hJTEQoMTI4NCksIENISUxEKDEyODcpLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTI1MSAqLywKLSAgVElMRV9PUENfSU5WLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19JTlYsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMjU0ICovLAotICBUSUxFX09QQ19JUkVULCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19JUkVULCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTI1NyAqLywKLSAgQ0hJTEQoMTI2MCksIFRJTEVfT1BDX05PTkUsCisgIENISUxEKDEyNjApLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgzMSwgMikgLyogaW5kZXggMTI2MCAqLywKLSAgVElMRV9PUENfTEIsIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgQ0hJTEQoMTI2NSksCisgIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgVElMRVBST19PUENfTEIsIENISUxEKDEyNjUpLAogICBCSVRGSUVMRCgzMywgMikgLyogaW5kZXggMTI2NSAqLywKLSAgVElMRV9PUENfTEIsIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgQ0hJTEQoMTI3MCksCisgIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgVElMRVBST19PUENfTEIsIENISUxEKDEyNzApLAogICBCSVRGSUVMRCgzNSwgMikgLyogaW5kZXggMTI3MCAqLywKLSAgVElMRV9PUENfTEIsIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgVElMRV9PUENfUFJFRkVUQ0gsCisgIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgVElMRVBST19PUENfTEIsIFRJTEVQUk9fT1BDX1BSRUZFVENILAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTI3NSAqLywKLSAgVElMRV9PUENfTEJfVSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTEJfVSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEyNzggKi8sCi0gIFRJTEVfT1BDX0xILCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19MSCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEyODEgKi8sCi0gIFRJTEVfT1BDX0xIX1UsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0xIX1UsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMjg0ICovLAotICBUSUxFX09QQ19MVywgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTFcsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMjg3ICovLAotICBUSUxFX09QQ19NRiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTUYsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQzLCAzKSAvKiBpbmRleCAxMjkwICovLAogICBDSElMRCgxMjk5KSwgQ0hJTEQoMTMwMiksIENISUxEKDEzMDUpLCBDSElMRCgxMzA4KSwgQ0hJTEQoMTMxMSksCiAgIENISUxEKDEzMTQpLCBDSElMRCgxMzE3KSwgQ0hJTEQoMTMyMCksCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMjk5ICovLAotICBUSUxFX09QQ19OQVAsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05BUCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEzMDIgKi8sCi0gIFRJTEVfT1BDX05PUCwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9QLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTMwNSAqLywKLSAgVElMRV9PUENfU1dJTlQwLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TV0lOVDAsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMzA4ICovLAotICBUSUxFX09QQ19TV0lOVDEsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NXSU5UMSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEzMTEgKi8sCi0gIFRJTEVfT1BDX1NXSU5UMiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1dJTlQyLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTMxNCAqLywKLSAgVElMRV9PUENfU1dJTlQzLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TV0lOVDMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMzE3ICovLAotICBUSUxFX09QQ19UTlMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1ROUywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEzMjAgKi8sCi0gIFRJTEVfT1BDX1dINjQsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1dINjQsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQzLCAyKSAvKiBpbmRleCAxMzIzICovLAotICBDSElMRCgxMzI4KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgQ0hJTEQoMTMyOCksIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQ1LCAxKSAvKiBpbmRleCAxMzI4ICovLAotICBDSElMRCgxMzMxKSwgVElMRV9PUENfTk9ORSwKKyAgQ0hJTEQoMTMzMSksIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMzMxICovLAotICBUSUxFX09QQ19MV19OQSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTFdfTkEsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQ2LCA3KSAvKiBpbmRleCAxMzM0ICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBDSElMRCgxNDYzKSwKLSAgQ0hJTEQoMTQ2MyksIENISUxEKDE0NjMpLCBDSElMRCgxNDYzKSwgQ0hJTEQoMTQ2NiksIENISUxEKDE0NjYpLAotICBDSElMRCgxNDY2KSwgQ0hJTEQoMTQ2NiksIENISUxEKDE0NjkpLCBDSElMRCgxNDY5KSwgQ0hJTEQoMTQ2OSksCi0gIENISUxEKDE0NjkpLCBDSElMRCgxNDcyKSwgQ0hJTEQoMTQ3MiksIENISUxEKDE0NzIpLCBDSElMRCgxNDcyKSwKLSAgQ0hJTEQoMTQ3NSksIENISUxEKDE0NzUpLCBDSElMRCgxNDc1KSwgQ0hJTEQoMTQ3NSksIENISUxEKDE0NzgpLAotICBDSElMRCgxNDc4KSwgQ0hJTEQoMTQ3OCksIENISUxEKDE0NzgpLCBDSElMRCgxNDgxKSwgQ0hJTEQoMTQ4MSksCi0gIENISUxEKDE0ODEpLCBDSElMRCgxNDgxKSwgQ0hJTEQoMTQ4NCksIENISUxEKDE0ODQpLCBDSElMRCgxNDg0KSwKLSAgQ0hJTEQoMTQ4NCksIENISUxEKDE0ODcpLCBDSElMRCgxNDg3KSwgQ0hJTEQoMTQ4NyksIENISUxEKDE0ODcpLAotICBDSElMRCgxNDkwKSwgQ0hJTEQoMTQ5MCksIENISUxEKDE0OTApLCBDSElMRCgxNDkwKSwgQ0hJTEQoMTE1MSksCi0gIENISUxEKDE0OTMpLCBDSElMRCgxNTE3KSwgQ0hJTEQoMTUyOSksIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIENISUxEKDE0NjMpLCBDSElMRCgxNDYzKSwgQ0hJTEQoMTQ2MyksIENISUxEKDE0NjMpLCBDSElMRCgxNDY2KSwKKyAgQ0hJTEQoMTQ2NiksIENISUxEKDE0NjYpLCBDSElMRCgxNDY2KSwgQ0hJTEQoMTQ2OSksIENISUxEKDE0NjkpLAorICBDSElMRCgxNDY5KSwgQ0hJTEQoMTQ2OSksIENISUxEKDE0NzIpLCBDSElMRCgxNDcyKSwgQ0hJTEQoMTQ3MiksCisgIENISUxEKDE0NzIpLCBDSElMRCgxNDc1KSwgQ0hJTEQoMTQ3NSksIENISUxEKDE0NzUpLCBDSElMRCgxNDc1KSwKKyAgQ0hJTEQoMTQ3OCksIENISUxEKDE0NzgpLCBDSElMRCgxNDc4KSwgQ0hJTEQoMTQ3OCksIENISUxEKDE0ODEpLAorICBDSElMRCgxNDgxKSwgQ0hJTEQoMTQ4MSksIENISUxEKDE0ODEpLCBDSElMRCgxNDg0KSwgQ0hJTEQoMTQ4NCksCisgIENISUxEKDE0ODQpLCBDSElMRCgxNDg0KSwgQ0hJTEQoMTQ4NyksIENISUxEKDE0ODcpLCBDSElMRCgxNDg3KSwKKyAgQ0hJTEQoMTQ4NyksIENISUxEKDE0OTApLCBDSElMRCgxNDkwKSwgQ0hJTEQoMTQ5MCksIENISUxEKDE0OTApLAorICBDSElMRCgxMTUxKSwgQ0hJTEQoMTQ5MyksIENISUxEKDE1MTcpLCBDSElMRCgxNTI5KSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE0NjMgKi8sCi0gIFRJTEVfT1BDX1JMSV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfUkxJX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTQ2NiAqLywKLSAgVElMRV9PUENfU0hMSUJfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NITElCX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTQ2OSAqLywKLSAgVElMRV9PUENfU0hMSUhfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NITElIX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTQ3MiAqLywKLSAgVElMRV9PUENfU0hMSV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU0hMSV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE0NzUgKi8sCi0gIFRJTEVfT1BDX1NIUklCX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSFJJQl9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE0NzggKi8sCi0gIFRJTEVfT1BDX1NIUklIX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSFJJSF9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE0ODEgKi8sCi0gIFRJTEVfT1BDX1NIUklfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NIUklfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNDg0ICovLAotICBUSUxFX09QQ19TUkFJQl9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1JBSUJfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNDg3ICovLAotICBUSUxFX09QQ19TUkFJSF9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1JBSUhfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNDkwICovLAotICBUSUxFX09QQ19TUkFJX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TUkFJX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0MywgMykgLyogaW5kZXggMTQ5MyAqLywKICAgQ0hJTEQoMTI1MSksIENISUxEKDEyNTQpLCBDSElMRCgxNTAyKSwgQ0hJTEQoMTUwNSksIENISUxEKDE1MDgpLAogICBDSElMRCgxNTExKSwgQ0hJTEQoMTUxNCksIENISUxEKDEyODcpLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTUwMiAqLywKLSAgVElMRV9PUENfTEJfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0xCX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTUwNSAqLywKLSAgVElMRV9PUENfTEJfVV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTEJfVV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE1MDggKi8sCi0gIFRJTEVfT1BDX0xIX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19MSF9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE1MTEgKi8sCi0gIFRJTEVfT1BDX0xIX1VfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0xIX1VfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNTE0ICovLAotICBUSUxFX09QQ19MV19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTFdfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQzLCAzKSAvKiBpbmRleCAxNTE3ICovLAogICBDSElMRCgxMjk5KSwgQ0hJTEQoMTMwMiksIENISUxEKDEzMDUpLCBDSElMRCgxMzA4KSwgQ0hJTEQoMTMxMSksCiAgIENISUxEKDEzMTQpLCBDSElMRCgxNTI2KSwgQ0hJTEQoMTMyMCksCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNTI2ICovLAotICBUSUxFX09QQ19UTlNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1ROU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDMsIDIpIC8qIGluZGV4IDE1MjkgKi8sCi0gIENISUxEKDE1MzQpLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBDSElMRCgxNTM0KSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDUsIDEpIC8qIGluZGV4IDE1MzQgKi8sCi0gIENISUxEKDE1MzcpLCBUSUxFX09QQ19OT05FLAorICBDSElMRCgxNTM3KSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE1MzcgKi8sCi0gIFRJTEVfT1BDX0xXX05BX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19MV19OQV9TTiwgVElMRVBST19PUENfTk9ORSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZWNvZGVfWTBfZnNtWzE2OF0gPQogewogICBCSVRGSUVMRCgyNywgNCkgLyogaW5kZXggMCAqLywKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoMTcpLCBDSElMRCgyMiksIENISUxEKDI3KSwgQ0hJTEQoNDcpLCBDSElMRCg1MiksCi0gIENISUxEKDU3KSwgQ0hJTEQoNjIpLCBDSElMRCg2NyksIFRJTEVfT1BDX0FEREksIENISUxEKDcyKSwgQ0hJTEQoMTAyKSwKLSAgVElMRV9PUENfU0VRSSwgQ0hJTEQoMTE3KSwgVElMRV9PUENfU0xUSSwgVElMRV9PUENfU0xUSV9VLAorICBUSUxFUFJPX09QQ19OT05FLCBDSElMRCgxNyksIENISUxEKDIyKSwgQ0hJTEQoMjcpLCBDSElMRCg0NyksIENISUxEKDUyKSwKKyAgQ0hJTEQoNTcpLCBDSElMRCg2MiksIENISUxEKDY3KSwgVElMRVBST19PUENfQURESSwgQ0hJTEQoNzIpLCBDSElMRCgxMDIpLAorICBUSUxFUFJPX09QQ19TRVFJLCBDSElMRCgxMTcpLCBUSUxFUFJPX09QQ19TTFRJLCBUSUxFUFJPX09QQ19TTFRJX1UsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCAxNyAqLywKLSAgVElMRV9PUENfQURELCBUSUxFX09QQ19TMUEsIFRJTEVfT1BDX1MyQSwgVElMRV9PUENfU1VCLAorICBUSUxFUFJPX09QQ19BREQsIFRJTEVQUk9fT1BDX1MxQSwgVElMRVBST19PUENfUzJBLCBUSUxFUFJPX09QQ19TVUIsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCAyMiAqLywKLSAgVElMRV9PUENfTU5aLCBUSUxFX09QQ19NVk5aLCBUSUxFX09QQ19NVlosIFRJTEVfT1BDX01aLAorICBUSUxFUFJPX09QQ19NTlosIFRJTEVQUk9fT1BDX01WTlosIFRJTEVQUk9fT1BDX01WWiwgVElMRVBST19PUENfTVosCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCAyNyAqLywKLSAgVElMRV9PUENfQU5ELCBUSUxFX09QQ19OT1IsIENISUxEKDMyKSwgVElMRV9PUENfWE9SLAorICBUSUxFUFJPX09QQ19BTkQsIFRJTEVQUk9fT1BDX05PUiwgQ0hJTEQoMzIpLCBUSUxFUFJPX09QQ19YT1IsCiAgIEJJVEZJRUxEKDEyLCAyKSAvKiBpbmRleCAzMiAqLywKLSAgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgQ0hJTEQoMzcpLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBDSElMRCgzNyksCiAgIEJJVEZJRUxEKDE0LCAyKSAvKiBpbmRleCAzNyAqLywKLSAgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgQ0hJTEQoNDIpLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBDSElMRCg0MiksCiAgIEJJVEZJRUxEKDE2LCAyKSAvKiBpbmRleCA0MiAqLywKLSAgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfTU9WRSwKKyAgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfTU9WRSwKICAgQklURklFTEQoMTgsIDIpIC8qIGluZGV4IDQ3ICovLAotICBUSUxFX09QQ19STCwgVElMRV9PUENfU0hMLCBUSUxFX09QQ19TSFIsIFRJTEVfT1BDX1NSQSwKKyAgVElMRVBST19PUENfUkwsIFRJTEVQUk9fT1BDX1NITCwgVElMRVBST19PUENfU0hSLCBUSUxFUFJPX09QQ19TUkEsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCA1MiAqLywKLSAgVElMRV9PUENfU0xURSwgVElMRV9PUENfU0xURV9VLCBUSUxFX09QQ19TTFQsIFRJTEVfT1BDX1NMVF9VLAorICBUSUxFUFJPX09QQ19TTFRFLCBUSUxFUFJPX09QQ19TTFRFX1UsIFRJTEVQUk9fT1BDX1NMVCwgVElMRVBST19PUENfU0xUX1UsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCA1NyAqLywKLSAgVElMRV9PUENfTVVMSExTQV9VVSwgVElMRV9PUENfUzNBLCBUSUxFX09QQ19TRVEsIFRJTEVfT1BDX1NORSwKKyAgVElMRVBST19PUENfTVVMSExTQV9VVSwgVElMRVBST19PUENfUzNBLCBUSUxFUFJPX09QQ19TRVEsIFRJTEVQUk9fT1BDX1NORSwKICAgQklURklFTEQoMTgsIDIpIC8qIGluZGV4IDYyICovLAotICBUSUxFX09QQ19NVUxISF9TUywgVElMRV9PUENfTVVMSEhfVVUsIFRJTEVfT1BDX01VTExMX1NTLCBUSUxFX09QQ19NVUxMTF9VVSwKKyAgVElMRVBST19PUENfTVVMSEhfU1MsIFRJTEVQUk9fT1BDX01VTEhIX1VVLCBUSUxFUFJPX09QQ19NVUxMTF9TUywKKyAgVElMRVBST19PUENfTVVMTExfVVUsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCA2NyAqLywKLSAgVElMRV9PUENfTVVMSEhBX1NTLCBUSUxFX09QQ19NVUxISEFfVVUsIFRJTEVfT1BDX01VTExMQV9TUywKLSAgVElMRV9PUENfTVVMTExBX1VVLAorICBUSUxFUFJPX09QQ19NVUxISEFfU1MsIFRJTEVQUk9fT1BDX01VTEhIQV9VVSwgVElMRVBST19PUENfTVVMTExBX1NTLAorICBUSUxFUFJPX09QQ19NVUxMTEFfVVUsCiAgIEJJVEZJRUxEKDAsIDIpIC8qIGluZGV4IDcyICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBDSElMRCg3NyksCisgIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIENISUxEKDc3KSwKICAgQklURklFTEQoMiwgMikgLyogaW5kZXggNzcgKi8sCi0gIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIENISUxEKDgyKSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODIpLAogICBCSVRGSUVMRCg0LCAyKSAvKiBpbmRleCA4MiAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODcpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg4NyksCiAgIEJJVEZJRUxEKDYsIDIpIC8qIGluZGV4IDg3ICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBDSElMRCg5MiksCisgIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIENISUxEKDkyKSwKICAgQklURklFTEQoOCwgMikgLyogaW5kZXggOTIgKi8sCi0gIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIENISUxEKDk3KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoOTcpLAogICBCSVRGSUVMRCgxMCwgMikgLyogaW5kZXggOTcgKi8sCi0gIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0lORk8sCisgIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0lORk8sCiAgIEJJVEZJRUxEKDYsIDIpIC8qIGluZGV4IDEwMiAqLywKLSAgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgQ0hJTEQoMTA3KSwKKyAgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgQ0hJTEQoMTA3KSwKICAgQklURklFTEQoOCwgMikgLyogaW5kZXggMTA3ICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBDSElMRCgxMTIpLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBDSElMRCgxMTIpLAogICBCSVRGSUVMRCgxMCwgMikgLyogaW5kZXggMTEyICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19NT1ZFSSwKKyAgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfTU9WRUksCiAgIEJJVEZJRUxEKDE1LCA1KSAvKiBpbmRleCAxMTcgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX1JMSSwKLSAgVElMRV9PUENfUkxJLCBUSUxFX09QQ19STEksIFRJTEVfT1BDX1JMSSwgVElMRV9PUENfU0hMSSwgVElMRV9PUENfU0hMSSwKLSAgVElMRV9PUENfU0hMSSwgVElMRV9PUENfU0hMSSwgVElMRV9PUENfU0hSSSwgVElMRV9PUENfU0hSSSwgVElMRV9PUENfU0hSSSwKLSAgVElMRV9PUENfU0hSSSwgVElMRV9PUENfU1JBSSwgVElMRV9PUENfU1JBSSwgVElMRV9PUENfU1JBSSwgVElMRV9PUENfU1JBSSwKLSAgQ0hJTEQoMTUwKSwgQ0hJTEQoMTU5KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfUkxJLCBUSUxFUFJPX09QQ19STEksIFRJTEVQUk9fT1BDX1JMSSwgVElMRVBST19PUENfUkxJLAorICBUSUxFUFJPX09QQ19TSExJLCBUSUxFUFJPX09QQ19TSExJLCBUSUxFUFJPX09QQ19TSExJLCBUSUxFUFJPX09QQ19TSExJLAorICBUSUxFUFJPX09QQ19TSFJJLCBUSUxFUFJPX09QQ19TSFJJLCBUSUxFUFJPX09QQ19TSFJJLCBUSUxFUFJPX09QQ19TSFJJLAorICBUSUxFUFJPX09QQ19TUkFJLCBUSUxFUFJPX09QQ19TUkFJLCBUSUxFUFJPX09QQ19TUkFJLCBUSUxFUFJPX09QQ19TUkFJLAorICBDSElMRCgxNTApLCBDSElMRCgxNTkpLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxMiwgMykgLyogaW5kZXggMTUwICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19CSVRYLCBUSUxFX09QQ19CWVRFWCwgVElMRV9PUENfQ0xaLCBUSUxFX09QQ19DVFosCi0gIFRJTEVfT1BDX0ZOT1AsIFRJTEVfT1BDX05PUCwgVElMRV9PUENfUENOVCwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfQklUWCwgVElMRVBST19PUENfQllURVgsIFRJTEVQUk9fT1BDX0NMWiwKKyAgVElMRVBST19PUENfQ1RaLCBUSUxFUFJPX09QQ19GTk9QLCBUSUxFUFJPX09QQ19OT1AsIFRJTEVQUk9fT1BDX1BDTlQsCiAgIEJJVEZJRUxEKDEyLCAzKSAvKiBpbmRleCAxNTkgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIwLCBUSUxFX09QQ19UQkxJRFhCMSwgVElMRV9PUENfVEJMSURYQjIsIFRJTEVfT1BDX1RCTElEWEIzLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMCwgVElMRVBST19PUENfVEJMSURYQjEsIFRJTEVQUk9fT1BDX1RCTElEWEIyLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMywgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZWNvZGVfWTFfZnNtWzE0MF0gPQogewogICBCSVRGSUVMRCg1OSwgNCkgLyogaW5kZXggMCAqLywKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoMTcpLCBDSElMRCgyMiksIENISUxEKDI3KSwgQ0hJTEQoNDcpLCBDSElMRCg1MiksCi0gIENISUxEKDU3KSwgVElMRV9PUENfQURESSwgQ0hJTEQoNjIpLCBDSElMRCg5MiksIFRJTEVfT1BDX1NFUUksIENISUxEKDEwNyksCi0gIFRJTEVfT1BDX1NMVEksIFRJTEVfT1BDX1NMVElfVSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgQ0hJTEQoMTcpLCBDSElMRCgyMiksIENISUxEKDI3KSwgQ0hJTEQoNDcpLCBDSElMRCg1MiksCisgIENISUxEKDU3KSwgVElMRVBST19PUENfQURESSwgQ0hJTEQoNjIpLCBDSElMRCg5MiksIFRJTEVQUk9fT1BDX1NFUUksCisgIENISUxEKDEwNyksIFRJTEVQUk9fT1BDX1NMVEksIFRJTEVQUk9fT1BDX1NMVElfVSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDksIDIpIC8qIGluZGV4IDE3ICovLAotICBUSUxFX09QQ19BREQsIFRJTEVfT1BDX1MxQSwgVElMRV9PUENfUzJBLCBUSUxFX09QQ19TVUIsCisgIFRJTEVQUk9fT1BDX0FERCwgVElMRVBST19PUENfUzFBLCBUSUxFUFJPX09QQ19TMkEsIFRJTEVQUk9fT1BDX1NVQiwKICAgQklURklFTEQoNDksIDIpIC8qIGluZGV4IDIyICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19NTlosIFRJTEVfT1BDX01aLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19NTlosIFRJTEVQUk9fT1BDX01aLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0OSwgMikgLyogaW5kZXggMjcgKi8sCi0gIFRJTEVfT1BDX0FORCwgVElMRV9PUENfTk9SLCBDSElMRCgzMiksIFRJTEVfT1BDX1hPUiwKKyAgVElMRVBST19PUENfQU5ELCBUSUxFUFJPX09QQ19OT1IsIENISUxEKDMyKSwgVElMRVBST19PUENfWE9SLAogICBCSVRGSUVMRCg0MywgMikgLyogaW5kZXggMzIgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIENISUxEKDM3KSwKKyAgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgQ0hJTEQoMzcpLAogICBCSVRGSUVMRCg0NSwgMikgLyogaW5kZXggMzcgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIENISUxEKDQyKSwKKyAgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgQ0hJTEQoNDIpLAogICBCSVRGSUVMRCg0NywgMikgLyogaW5kZXggNDIgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX01PVkUsCisgIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX01PVkUsCiAgIEJJVEZJRUxEKDQ5LCAyKSAvKiBpbmRleCA0NyAqLywKLSAgVElMRV9PUENfUkwsIFRJTEVfT1BDX1NITCwgVElMRV9PUENfU0hSLCBUSUxFX09QQ19TUkEsCisgIFRJTEVQUk9fT1BDX1JMLCBUSUxFUFJPX09QQ19TSEwsIFRJTEVQUk9fT1BDX1NIUiwgVElMRVBST19PUENfU1JBLAogICBCSVRGSUVMRCg0OSwgMikgLyogaW5kZXggNTIgKi8sCi0gIFRJTEVfT1BDX1NMVEUsIFRJTEVfT1BDX1NMVEVfVSwgVElMRV9PUENfU0xULCBUSUxFX09QQ19TTFRfVSwKKyAgVElMRVBST19PUENfU0xURSwgVElMRVBST19PUENfU0xURV9VLCBUSUxFUFJPX09QQ19TTFQsIFRJTEVQUk9fT1BDX1NMVF9VLAogICBCSVRGSUVMRCg0OSwgMikgLyogaW5kZXggNTcgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX1MzQSwgVElMRV9PUENfU0VRLCBUSUxFX09QQ19TTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX1MzQSwgVElMRVBST19PUENfU0VRLCBUSUxFUFJPX09QQ19TTkUsCiAgIEJJVEZJRUxEKDMxLCAyKSAvKiBpbmRleCA2MiAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoNjcpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg2NyksCiAgIEJJVEZJRUxEKDMzLCAyKSAvKiBpbmRleCA2NyAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoNzIpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg3MiksCiAgIEJJVEZJRUxEKDM1LCAyKSAvKiBpbmRleCA3MiAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoNzcpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg3NyksCiAgIEJJVEZJRUxEKDM3LCAyKSAvKiBpbmRleCA3NyAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODIpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg4MiksCiAgIEJJVEZJRUxEKDM5LCAyKSAvKiBpbmRleCA4MiAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODcpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg4NyksCiAgIEJJVEZJRUxEKDQxLCAyKSAvKiBpbmRleCA4NyAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfSU5GTywKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfSU5GTywKICAgQklURklFTEQoMzcsIDIpIC8qIGluZGV4IDkyICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBDSElMRCg5NyksCisgIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIENISUxEKDk3KSwKICAgQklURklFTEQoMzksIDIpIC8qIGluZGV4IDk3ICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBDSElMRCgxMDIpLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBDSElMRCgxMDIpLAogICBCSVRGSUVMRCg0MSwgMikgLyogaW5kZXggMTAyICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19NT1ZFSSwKKyAgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfTU9WRUksCiAgIEJJVEZJRUxEKDQ4LCAzKSAvKiBpbmRleCAxMDcgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX1JMSSwgVElMRV9PUENfU0hMSSwgVElMRV9PUENfU0hSSSwgVElMRV9PUENfU1JBSSwKLSAgQ0hJTEQoMTE2KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfUkxJLCBUSUxFUFJPX09QQ19TSExJLCBUSUxFUFJPX09QQ19TSFJJLAorICBUSUxFUFJPX09QQ19TUkFJLCBDSElMRCgxMTYpLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0MywgMykgLyogaW5kZXggMTE2ICovLAotICBUSUxFX09QQ19OT05FLCBDSElMRCgxMjUpLCBDSElMRCgxMzApLCBDSElMRCgxMzUpLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBDSElMRCgxMjUpLCBDSElMRCgxMzApLCBDSElMRCgxMzUpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0NiwgMikgLyogaW5kZXggMTI1ICovLAotICBUSUxFX09QQ19GTk9QLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19GTk9QLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0NiwgMikgLyogaW5kZXggMTMwICovLAotICBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0lMTCwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDYsIDIpIC8qIGluZGV4IDEzNSAqLywKLSAgVElMRV9PUENfTk9QLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT1AsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGVjb2RlX1kyX2ZzbVsyNF0gPQogewogICBCSVRGSUVMRCg1NiwgMykgLyogaW5kZXggMCAqLywKLSAgQ0hJTEQoOSksIFRJTEVfT1BDX0xCX1UsIFRJTEVfT1BDX0xILCBUSUxFX09QQ19MSF9VLCBUSUxFX09QQ19MVywKLSAgVElMRV9PUENfU0IsIFRJTEVfT1BDX1NILCBUSUxFX09QQ19TVywKKyAgQ0hJTEQoOSksIFRJTEVQUk9fT1BDX0xCX1UsIFRJTEVQUk9fT1BDX0xILCBUSUxFUFJPX09QQ19MSF9VLAorICBUSUxFUFJPX09QQ19MVywgVElMRVBST19PUENfU0IsIFRJTEVQUk9fT1BDX1NILCBUSUxFUFJPX09QQ19TVywKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDkgKi8sCi0gIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgVElMRV9PUENfTEIsIENISUxEKDE0KSwKKyAgVElMRVBST19PUENfTEIsIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgQ0hJTEQoMTQpLAogICBCSVRGSUVMRCgyMiwgMikgLyogaW5kZXggMTQgKi8sCi0gIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgVElMRV9PUENfTEIsIENISUxEKDE5KSwKKyAgVElMRVBST19PUENfTEIsIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgQ0hJTEQoMTkpLAogICBCSVRGSUVMRCgyNCwgMikgLyogaW5kZXggMTkgKi8sCi0gIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgVElMRV9PUENfTEIsIFRJTEVfT1BDX1BSRUZFVENILAorICBUSUxFUFJPX09QQ19MQiwgVElMRVBST19PUENfTEIsIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19QUkVGRVRDSCwKIH07CiAKICN1bmRlZiBCSVRGSUVMRAogI3VuZGVmIENISUxECiBjb25zdCB1bnNpZ25lZCBzaG9ydCAqIGNvbnN0Ci10aWxlX2J1bmRsZV9kZWNvZGVyX2ZzbXNbVElMRV9OVU1fUElQRUxJTkVfRU5DT0RJTkdTXSA9Cit0aWxlcHJvX2J1bmRsZV9kZWNvZGVyX2ZzbXNbVElMRVBST19OVU1fUElQRUxJTkVfRU5DT0RJTkdTXSA9CiB7CiAgIGRlY29kZV9YMF9mc20sCiAgIGRlY29kZV9YMV9mc20sCkBAIC0yMTkxLDIyMCArMjI5NywyMjAgQEAKICAgZGVjb2RlX1kxX2ZzbSwKICAgZGVjb2RlX1kyX2ZzbQogfTsKLWNvbnN0IHN0cnVjdCB0aWxlX29wZXJhbmQgdGlsZV9vcGVyYW5kc1s0M10gPQorY29uc3Qgc3RydWN0IHRpbGVwcm9fb3BlcmFuZCB0aWxlcHJvX29wZXJhbmRzWzQzXSA9CiB7CiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9JTU04X1gwKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRVBST19JTU04X1gwKSwKICAgICA4LCAxLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9JbW04X1gwLCBnZXRfSW1tOF9YMAogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVfSU1NOF9YMSksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fSU1NOF9YMSksCiAgICAgOCwgMSwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfSW1tOF9YMSwgZ2V0X0ltbThfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX0lNTThfWTApLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX0lNTThfWTApLAogICAgIDgsIDEsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX0ltbThfWTAsIGdldF9JbW04X1kwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9JTU04X1kxKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRVBST19JTU04X1kxKSwKICAgICA4LCAxLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9JbW04X1kxLCBnZXRfSW1tOF9ZMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVfSU1NMTZfWDApLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX0lNTTE2X1gwKSwKICAgICAxNiwgMSwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfSW1tMTZfWDAsIGdldF9JbW0xNl9YMAogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVfSU1NMTZfWDEpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX0lNTTE2X1gxKSwKICAgICAxNiwgMSwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfSW1tMTZfWDEsIGdldF9JbW0xNl9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0FERFJFU1MsIEJGRF9SRUxPQyhUSUxFX0pPRkZMT05HX1gxKSwKLSAgICAyOSwgMSwgMCwgMCwgMSwgVElMRV9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMsCisgICAgVElMRVBST19PUF9UWVBFX0FERFJFU1MsIEJGRF9SRUxPQyhUSUxFUFJPX0pPRkZMT05HX1gxKSwKKyAgICAyOSwgMSwgMCwgMCwgMSwgVElMRVBST19MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMsCiAgICAgY3JlYXRlX0pPZmZMb25nX1gxLCBnZXRfSk9mZkxvbmdfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDAsIDEsIDAsIDAsCiAgICAgY3JlYXRlX0Rlc3RfWDAsIGdldF9EZXN0X1gwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKICAgICA2LCAwLCAxLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9TcmNBX1gwLCBnZXRfU3JjQV9YMAogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMCwgMSwgMCwgMCwKICAgICBjcmVhdGVfRGVzdF9YMSwgZ2V0X0Rlc3RfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY0FfWDEsIGdldF9TcmNBX1gxCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKICAgICA2LCAwLCAwLCAxLCAwLCAwLAogICAgIGNyZWF0ZV9EZXN0X1kwLCBnZXRfRGVzdF9ZMAogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMCwgMCwgMCwKICAgICBjcmVhdGVfU3JjQV9ZMCwgZ2V0X1NyY0FfWTAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDAsIDEsIDAsIDAsCiAgICAgY3JlYXRlX0Rlc3RfWTEsIGdldF9EZXN0X1kxCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKICAgICA2LCAwLCAxLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9TcmNBX1kxLCBnZXRfU3JjQV9ZMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMCwgMCwgMCwKICAgICBjcmVhdGVfU3JjQV9ZMiwgZ2V0X1NyY0FfWTIKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY0JfWDAsIGdldF9TcmNCX1gwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKICAgICA2LCAwLCAxLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9TcmNCX1gxLCBnZXRfU3JjQl9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMCwgMCwgMCwKICAgICBjcmVhdGVfU3JjQl9ZMCwgZ2V0X1NyY0JfWTAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY0JfWTEsIGdldF9TcmNCX1kxCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfQUREUkVTUywgQkZEX1JFTE9DKFRJTEVfQlJPRkZfWDEpLAotICAgIDE3LCAxLCAwLCAwLCAxLCBUSUxFX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUywKKyAgICBUSUxFUFJPX09QX1RZUEVfQUREUkVTUywgQkZEX1JFTE9DKFRJTEVQUk9fQlJPRkZfWDEpLAorICAgIDE3LCAxLCAwLCAwLCAxLCBUSUxFUFJPX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUywKICAgICBjcmVhdGVfQnJPZmZfWDEsIGdldF9Cck9mZl9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMSwgMCwgMCwKICAgICBjcmVhdGVfRGVzdF9YMCwgZ2V0X0Rlc3RfWDAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9BRERSRVNTLCBCRkRfUkVMT0MoTk9ORSksCi0gICAgMjgsIDEsIDAsIDAsIDEsIFRJTEVfTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTLAorICAgIFRJTEVQUk9fT1BfVFlQRV9BRERSRVNTLCBCRkRfUkVMT0MoTk9ORSksCisgICAgMjgsIDEsIDAsIDAsIDEsIFRJTEVQUk9fTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTLAogICAgIGNyZWF0ZV9KT2ZmX1gxLCBnZXRfSk9mZl9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMCwgMSwgMCwgMCwKICAgICBjcmVhdGVfU3JjQkRlc3RfWTIsIGdldF9TcmNCRGVzdF9ZMgogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMSwgMCwgMCwKICAgICBjcmVhdGVfU3JjQV9YMSwgZ2V0X1NyY0FfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9TUFIsIEJGRF9SRUxPQyhUSUxFX01GX0lNTTE1X1gxKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfU1BSLCBCRkRfUkVMT0MoVElMRVBST19NRl9JTU0xNV9YMSksCiAgICAgMTUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01GX0ltbTE1X1gxLCBnZXRfTUZfSW1tMTVfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX01NU1RBUlRfWDApLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX01NU1RBUlRfWDApLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01NU3RhcnRfWDAsIGdldF9NTVN0YXJ0X1gwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9NTUVORF9YMCksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fTU1FTkRfWDApLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01NRW5kX1gwLCBnZXRfTU1FbmRfWDAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX01NU1RBUlRfWDEpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX01NU1RBUlRfWDEpLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01NU3RhcnRfWDEsIGdldF9NTVN0YXJ0X1gxCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9NTUVORF9YMSksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fTU1FTkRfWDEpLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01NRW5kX1gxLCBnZXRfTU1FbmRfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9TUFIsIEJGRF9SRUxPQyhUSUxFX01UX0lNTTE1X1gxKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfU1BSLCBCRkRfUkVMT0MoVElMRVBST19NVF9JTU0xNV9YMSksCiAgICAgMTUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01UX0ltbTE1X1gxLCBnZXRfTVRfSW1tMTVfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDEsIDAsIDAsCiAgICAgY3JlYXRlX0Rlc3RfWTAsIGdldF9EZXN0X1kwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9TSEFNVF9YMCksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fU0hBTVRfWDApLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NoQW10X1gwLCBnZXRfU2hBbXRfWDAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX1NIQU1UX1gxKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRVBST19TSEFNVF9YMSksCiAgICAgNSwgMCwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfU2hBbXRfWDEsIGdldF9TaEFtdF9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVfU0hBTVRfWTApLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX1NIQU1UX1kwKSwKICAgICA1LCAwLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9TaEFtdF9ZMCwgZ2V0X1NoQW10X1kwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9TSEFNVF9ZMSksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fU0hBTVRfWTEpLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NoQW10X1kxLCBnZXRfU2hBbXRfWTEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY0JEZXN0X1kyLCBnZXRfU3JjQkRlc3RfWTIKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRVBST19ERVNUX0lNTThfWDEpLAogICAgIDgsIDEsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX0Rlc3RfSW1tOF9YMSwgZ2V0X0Rlc3RfSW1tOF9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0FERFJFU1MsIEJGRF9SRUxPQyhUSUxFX1NOX0JST0ZGKSwKLSAgICAxMCwgMSwgMCwgMCwgMSwgVElMRV9MT0cyX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMsCisgICAgVElMRVBST19PUF9UWVBFX0FERFJFU1MsIEJGRF9SRUxPQyhOT05FKSwKKyAgICAxMCwgMSwgMCwgMCwgMSwgVElMRVBST19MT0cyX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMsCiAgICAgY3JlYXRlX0JyT2ZmX1NOLCBnZXRfQnJPZmZfU04KICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX1NOX1VJTU04KSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgOCwgMCwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfSW1tOF9TTiwgZ2V0X0ltbThfU04KICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX1NOX0lNTTgpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhOT05FKSwKICAgICA4LCAxLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9JbW04X1NOLCBnZXRfSW1tOF9TTgogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgMiwgMCwgMCwgMSwgMCwgMCwKICAgICBjcmVhdGVfRGVzdF9TTiwgZ2V0X0Rlc3RfU04KICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDIsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY19TTiwgZ2V0X1NyY19TTgogICB9CkBAIC0yNDE2LDEwICsyNTIyLDEwIEBACiAvKiBHaXZlbiBhIHNldCBvZiBidW5kbGUgYml0cyBhbmQgYSBzcGVjaWZpYyBwaXBlLCByZXR1cm5zIHdoaWNoCiAgKiBpbnN0cnVjdGlvbiB0aGUgYnVuZGxlIGNvbnRhaW5zIGluIHRoYXQgcGlwZS4KICAqLwotY29uc3Qgc3RydWN0IHRpbGVfb3Bjb2RlICoKLWZpbmRfb3Bjb2RlKHRpbGVfYnVuZGxlX2JpdHMgYml0cywgdGlsZV9waXBlbGluZSBwaXBlKQorY29uc3Qgc3RydWN0IHRpbGVwcm9fb3Bjb2RlICoKK2ZpbmRfb3Bjb2RlKHRpbGVwcm9fYnVuZGxlX2JpdHMgYml0cywgdGlsZXByb19waXBlbGluZSBwaXBlKQogewotICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqdGFibGUgPSB0aWxlX2J1bmRsZV9kZWNvZGVyX2ZzbXNbcGlwZV07CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICp0YWJsZSA9IHRpbGVwcm9fYnVuZGxlX2RlY29kZXJfZnNtc1twaXBlXTsKICAgaW50IGluZGV4ID0gMDsKIAogICB3aGlsZSAoMSkKQEAgLTI0MjksNTEgKzI1MzUsNTEgQEAKICAgICAgICgodW5zaWduZWQgaW50KShiaXRzID4+IChiaXRzcGVjICYgNjMpKSkgJiAoYml0c3BlYyA+PiA2KTsKIAogICAgIHVuc2lnbmVkIHNob3J0IG5leHQgPSB0YWJsZVtpbmRleCArIDEgKyBiaXRmaWVsZF07Ci0gICAgaWYgKG5leHQgPD0gVElMRV9PUENfTk9ORSkKLSAgICAgIHJldHVybiAmdGlsZV9vcGNvZGVzW25leHRdOworICAgIGlmIChuZXh0IDw9IFRJTEVQUk9fT1BDX05PTkUpCisgICAgICByZXR1cm4gJnRpbGVwcm9fb3Bjb2Rlc1tuZXh0XTsKIAotICAgIGluZGV4ID0gbmV4dCAtIFRJTEVfT1BDX05PTkU7CisgICAgaW5kZXggPSBuZXh0IC0gVElMRVBST19PUENfTk9ORTsKICAgfQogfQogCiAKIGludAotcGFyc2VfaW5zbl90aWxlKHRpbGVfYnVuZGxlX2JpdHMgYml0cywKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGMsCi0gICAgICAgICAgICAgICAgc3RydWN0IHRpbGVfZGVjb2RlZF9pbnN0cnVjdGlvbgotICAgICAgICAgICAgICAgIGRlY29kZWRbVElMRV9NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEVdKQorcGFyc2VfaW5zbl90aWxlcHJvKHRpbGVwcm9fYnVuZGxlX2JpdHMgYml0cywKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGMsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbGVwcm9fZGVjb2RlZF9pbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgIGRlY29kZWRbVElMRVBST19NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEVdKQogewogICBpbnQgbnVtX2luc3RydWN0aW9ucyA9IDA7CiAgIGludCBwaXBlOwogCiAgIGludCBtaW5fcGlwZSwgbWF4X3BpcGU7Ci0gIGlmICgoYml0cyAmIFRJTEVfQlVORExFX1lfRU5DT0RJTkdfTUFTSykgPT0gMCkKKyAgaWYgKChiaXRzICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKSA9PSAwKQogICB7Ci0gICAgbWluX3BpcGUgPSBUSUxFX1BJUEVMSU5FX1gwOwotICAgIG1heF9waXBlID0gVElMRV9QSVBFTElORV9YMTsKKyAgICBtaW5fcGlwZSA9IFRJTEVQUk9fUElQRUxJTkVfWDA7CisgICAgbWF4X3BpcGUgPSBUSUxFUFJPX1BJUEVMSU5FX1gxOwogICB9CiAgIGVsc2UKICAgewotICAgIG1pbl9waXBlID0gVElMRV9QSVBFTElORV9ZMDsKLSAgICBtYXhfcGlwZSA9IFRJTEVfUElQRUxJTkVfWTI7CisgICAgbWluX3BpcGUgPSBUSUxFUFJPX1BJUEVMSU5FX1kwOworICAgIG1heF9waXBlID0gVElMRVBST19QSVBFTElORV9ZMjsKICAgfQogCiAgIC8qIEZvciBlYWNoIHBpcGUsIGZpbmQgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBmaXRzLiAqLwogICBmb3IgKHBpcGUgPSBtaW5fcGlwZTsgcGlwZSA8PSBtYXhfcGlwZTsgcGlwZSsrKQogICB7Ci0gICAgY29uc3Qgc3RydWN0IHRpbGVfb3Bjb2RlICpvcGM7Ci0gICAgc3RydWN0IHRpbGVfZGVjb2RlZF9pbnN0cnVjdGlvbiAqZDsKKyAgICBjb25zdCBzdHJ1Y3QgdGlsZXByb19vcGNvZGUgKm9wYzsKKyAgICBzdHJ1Y3QgdGlsZXByb19kZWNvZGVkX2luc3RydWN0aW9uICpkOwogICAgIGludCBpOwogCiAgICAgZCA9ICZkZWNvZGVkW251bV9pbnN0cnVjdGlvbnMrK107Ci0gICAgb3BjID0gZmluZF9vcGNvZGUgKGJpdHMsICh0aWxlX3BpcGVsaW5lKXBpcGUpOworICAgIG9wYyA9IGZpbmRfb3Bjb2RlIChiaXRzLCAodGlsZXByb19waXBlbGluZSlwaXBlKTsKICAgICBkLT5vcGNvZGUgPSBvcGM7CiAKICAgICAvKiBEZWNvZGUgZWFjaCBvcGVyYW5kLCBzaWduIGV4dGVuZGluZywgZXRjLiBhcyBhcHByb3ByaWF0ZS4gKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgb3BjLT5udW1fb3BlcmFuZHM7IGkrKykKICAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgdGlsZV9vcGVyYW5kICpvcCA9Ci0gICAgICAgICZ0aWxlX29wZXJhbmRzW29wYy0+b3BlcmFuZHNbcGlwZV1baV1dOworICAgICAgY29uc3Qgc3RydWN0IHRpbGVwcm9fb3BlcmFuZCAqb3AgPQorICAgICAgICAmdGlsZXByb19vcGVyYW5kc1tvcGMtPm9wZXJhbmRzW3BpcGVdW2ldXTsKICAgICAgIGludCBvcHZhbCA9IG9wLT5leHRyYWN0IChiaXRzKTsKICAgICAgIGlmIChvcC0+aXNfc2lnbmVkKQogICAgICAgewpAQCAtMjQ4Myw5ICsyNTg5LDkgQEAKICAgICAgIH0KIAogICAgICAgLyogQWRqdXN0IFBDLXJlbGF0aXZlIHNjYWxlZCBicmFuY2ggb2Zmc2V0cy4gKi8KLSAgICAgIGlmIChvcC0+dHlwZSA9PSBUSUxFX09QX1RZUEVfQUREUkVTUykKKyAgICAgIGlmIChvcC0+dHlwZSA9PSBUSUxFUFJPX09QX1RZUEVfQUREUkVTUykKICAgICAgIHsKLSAgICAgICAgb3B2YWwgKj0gVElMRV9CVU5ETEVfU0laRV9JTl9CWVRFUzsKKyAgICAgICAgb3B2YWwgKj0gVElMRVBST19CVU5ETEVfU0laRV9JTl9CWVRFUzsKICAgICAgICAgb3B2YWwgKz0gKGludClwYzsKICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC90aWxlLWRlc2NfNjQuYyBiL2FyY2gvdGlsZS9rZXJuZWwvdGlsZS1kZXNjXzY0LmMKaW5kZXggZDU3MDA3YmUuLjY1YjVmOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvdGlsZS1kZXNjXzY0LmMKKysrIGIvYXJjaC90aWxlL2tlcm5lbC90aWxlLWRlc2NfNjQuYwpAQCAtMSwzICsxLDIzIEBACisvKiBUSUxFLUd4IG9wY29kZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqCisgKgorICoKKyAqLworCiAvKiBUaGlzIGRlZmluZSBpcyBCRkRfUkVMT0NfIyN4IGZvciByZWFsIGJmZCwgb3IgLTEgZm9yIGV2ZXJ5b25lIGVsc2UuICovCiAjZGVmaW5lIEJGRF9SRUxPQyh4KSAtMQogCkBAIC02LDEwICsyNiw4IEBACiAjZGVmaW5lIFRSRUdfU04gNTYKICNkZWZpbmUgVFJFR19aRVJPIDYzCiAKLS8qIEZJWE1FOiBSZW5hbWUgdGhpcy4gKi8KLSNpbmNsdWRlIDxhc20vb3Bjb2RlLXRpbGVfNjQuaD4KLQogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGFzbS90aWxlLWRlc2MuaD4KIAogY29uc3Qgc3RydWN0IHRpbGVneF9vcGNvZGUgdGlsZWd4X29wY29kZXNbMzM0XSA9CiB7CkBAIC0yMDQwLDEyICsyMDU4LDEyIEBACiAgICAgY3JlYXRlX0JyT2ZmX1gxLCBnZXRfQnJPZmZfWDEKICAgfSwKICAgewotICAgIFRJTEVHWF9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVHWF9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVHWF9NTVNUQVJUX1gwKSwKICAgICA2LCAwLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9CRlN0YXJ0X1gwLCBnZXRfQkZTdGFydF9YMAogICB9LAogICB7Ci0gICAgVElMRUdYX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRUdYX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRUdYX01NRU5EX1gwKSwKICAgICA2LCAwLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9CRkVuZF9YMCwgZ2V0X0JGRW5kX1gwCiAgIH0sCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL3RyYXBzLmMgYi9hcmNoL3RpbGUva2VybmVsL3RyYXBzLmMKaW5kZXggZjk4MDNkZi4uNGY0N2I4YSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvdHJhcHMuYwpAQCAtMTksMTMgKzE5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9vcGNvZGUtdGlsZS5oPgotI2luY2x1ZGUgPGFzbS9vcGNvZGVfY29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKICNpbmNsdWRlIDxhcmNoL2ludGVycnVwdHMuaD4KICNpbmNsdWRlIDxhcmNoL3Nwcl9kZWYuaD4KKyNpbmNsdWRlIDxhcmNoL29wY29kZS5oPgogCiB2b2lkIF9faW5pdCB0cmFwX2luaXQodm9pZCkKIHsKQEAgLTEzNSw3ICsxMzQsNyBAQAogCWlmIChnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWDEoYnVuZGxlKSAhPSBJTExfVU5BUllfT1BDT0RFX1gxKQogCQlyZXR1cm4gMDsKICNlbHNlCi0JaWYgKGJ1bmRsZSAmIFRJTEVfQlVORExFX1lfRU5DT0RJTkdfTUFTSykKKwlpZiAoYnVuZGxlICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKQogCQlyZXR1cm4gMDsKIAlpZiAoZ2V0X09wY29kZV9YMShidW5kbGUpICE9IFNIVU5fMF9PUENPREVfWDEpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2xpYi9leHBvcnRzLmMgYi9hcmNoL3RpbGUvbGliL2V4cG9ydHMuYwppbmRleCA0OTI4NGZhLi5hODdkMmE4IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvbGliL2V4cG9ydHMuYworKysgYi9hcmNoL3RpbGUvbGliL2V4cG9ydHMuYwpAQCAtNzksOCArNzksNiBAQAogaW50NjRfdCBfX21vZGRpMyhpbnQ2NF90IGRpdmlkZW5kLCBpbnQ2NF90IGRpdmlzb3IpOwogRVhQT1JUX1NZTUJPTChfX21vZGRpMyk7CiAjaWZuZGVmIF9fdGlsZWd4X18KLXVpbnQ2NF90IF9fbGxfbXVsKHVpbnQ2NF90IG4wLCB1aW50NjRfdCBuMSk7Ci1FWFBPUlRfU1lNQk9MKF9fbGxfbXVsKTsKIGludDY0X3QgX19tdWxkaTMoaW50NjRfdCwgaW50NjRfdCk7CiBFWFBPUlRfU1lNQk9MKF9fbXVsZGkzKTsKIHVpbnQ2NF90IF9fbHNocmRpMyh1aW50NjRfdCwgdW5zaWduZWQgaW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy5jaGFyIGIvYXJjaC91bS9LY29uZmlnLmNoYXIKaW5kZXggNzBkYWJkMS4uYjlkN2M0MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnLmNoYXIKKysrIGIvYXJjaC91bS9LY29uZmlnLmNoYXIKQEAgLTEsNSArMSw0IEBACi0KLW1lbnUgIkNoYXJhY3RlciBEZXZpY2VzIgorbWVudSAiVU1MIENoYXJhY3RlciBEZXZpY2VzIgogCiBjb25maWcgU1RERVJSX0NPTlNPTEUKIAlib29sICJzdGRlcnIgY29uc29sZSIKQEAgLTEwNSw5MiArMTA0LDYgQEAKICAgICAgICAgICB0aGlzIGlmIHlvdSBleHBlY3QgdGhlIFVNTCB0aGF0IHlvdSBidWlsZCB0byBiZSBydW4gaW4gZW52aXJvbm1lbnRzCiAgICAgICAgICAgd2hpY2ggZG9uJ3QgaGF2ZSBhIHNldCBvZiAvZGV2L3B0eSogZGV2aWNlcy4KIAotY29uZmlnIFVOSVg5OF9QVFlTCi0JYm9vbCAiVW5peDk4IFBUWSBzdXBwb3J0IgotCWhlbHAKLQkgIEEgcHNldWRvIHRlcm1pbmFsIChQVFkpIGlzIGEgc29mdHdhcmUgZGV2aWNlIGNvbnNpc3Rpbmcgb2YgdHdvCi0JICBoYWx2ZXM6IGEgbWFzdGVyIGFuZCBhIHNsYXZlLiBUaGUgc2xhdmUgZGV2aWNlIGJlaGF2ZXMgaWRlbnRpY2FsIHRvCi0JICBhIHBoeXNpY2FsIHRlcm1pbmFsOyB0aGUgbWFzdGVyIGRldmljZSBpcyB1c2VkIGJ5IGEgcHJvY2VzcyB0bwotCSAgcmVhZCBkYXRhIGZyb20gYW5kIHdyaXRlIGRhdGEgdG8gdGhlIHNsYXZlLCB0aGVyZWJ5IGVtdWxhdGluZyBhCi0JICB0ZXJtaW5hbC4gVHlwaWNhbCBwcm9ncmFtcyBmb3IgdGhlIG1hc3RlciBzaWRlIGFyZSB0ZWxuZXQgc2VydmVycwotCSAgYW5kIHh0ZXJtcy4KLQotCSAgTGludXggaGFzIHRyYWRpdGlvbmFsbHkgdXNlZCB0aGUgQlNELWxpa2UgbmFtZXMgL2Rldi9wdHl4eCBmb3IKLQkgIG1hc3RlcnMgYW5kIC9kZXYvdHR5eHggZm9yIHNsYXZlcyBvZiBwc2V1ZG8gdGVybWluYWxzLiBUaGlzIHNjaGVtZQotCSAgaGFzIGEgbnVtYmVyIG9mIHByb2JsZW1zLiBUaGUgR05VIEMgbGlicmFyeSBnbGliYyAyLjEgYW5kIGxhdGVyLAotCSAgaG93ZXZlciwgc3VwcG9ydHMgdGhlIFVuaXg5OCBuYW1pbmcgc3RhbmRhcmQ6IGluIG9yZGVyIHRvIGFjcXVpcmUgYQotCSAgcHNldWRvIHRlcm1pbmFsLCBhIHByb2Nlc3Mgb3BlbnMgL2Rldi9wdG14OyB0aGUgbnVtYmVyIG9mIHRoZSBwc2V1ZG8KLQkgIHRlcm1pbmFsIGlzIHRoZW4gbWFkZSBhdmFpbGFibGUgdG8gdGhlIHByb2Nlc3MgYW5kIHRoZSBwc2V1ZG8KLQkgIHRlcm1pbmFsIHNsYXZlIGNhbiBiZSBhY2Nlc3NlZCBhcyAvZGV2L3B0cy88bnVtYmVyPi4gV2hhdCB3YXMKLQkgIHRyYWRpdGlvbmFsbHkgL2Rldi90dHlwMiB3aWxsIHRoZW4gYmUgL2Rldi9wdHMvMiwgZm9yIGV4YW1wbGUuCi0KLQkgIEFsbCBtb2Rlcm4gTGludXggc3lzdGVtcyB1c2UgdGhlIFVuaXg5OCBwdHlzLiAgU2F5IFkgdW5sZXNzCi0JICB5b3UncmUgb24gYW4gZW1iZWRkZWQgc3lzdGVtIGFuZCB3YW50IHRvIGNvbnNlcnZlIG1lbW9yeS4KLQotY29uZmlnIExFR0FDWV9QVFlTCi0JYm9vbCAiTGVnYWN5IChCU0QpIFBUWSBzdXBwb3J0IgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIEEgcHNldWRvIHRlcm1pbmFsIChQVFkpIGlzIGEgc29mdHdhcmUgZGV2aWNlIGNvbnNpc3Rpbmcgb2YgdHdvCi0JICBoYWx2ZXM6IGEgbWFzdGVyIGFuZCBhIHNsYXZlLiBUaGUgc2xhdmUgZGV2aWNlIGJlaGF2ZXMgaWRlbnRpY2FsIHRvCi0JICBhIHBoeXNpY2FsIHRlcm1pbmFsOyB0aGUgbWFzdGVyIGRldmljZSBpcyB1c2VkIGJ5IGEgcHJvY2VzcyB0bwotCSAgcmVhZCBkYXRhIGZyb20gYW5kIHdyaXRlIGRhdGEgdG8gdGhlIHNsYXZlLCB0aGVyZWJ5IGVtdWxhdGluZyBhCi0JICB0ZXJtaW5hbC4gVHlwaWNhbCBwcm9ncmFtcyBmb3IgdGhlIG1hc3RlciBzaWRlIGFyZSB0ZWxuZXQgc2VydmVycwotCSAgYW5kIHh0ZXJtcy4KLQotCSAgTGludXggaGFzIHRyYWRpdGlvbmFsbHkgdXNlZCB0aGUgQlNELWxpa2UgbmFtZXMgL2Rldi9wdHl4eAotCSAgZm9yIG1hc3RlcnMgYW5kIC9kZXYvdHR5eHggZm9yIHNsYXZlcyBvZiBwc2V1ZG8KLQkgIHRlcm1pbmFscy4gVGhpcyBzY2hlbWUgaGFzIGEgbnVtYmVyIG9mIHByb2JsZW1zLCBpbmNsdWRpbmcKLQkgIHNlY3VyaXR5LiAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGVzZSBsZWdhY3kgZGV2aWNlczsgb24gbW9zdAotCSAgc3lzdGVtcywgaXQgaXMgc2FmZSB0byBzYXkgTi4KLQotY29uZmlnIFJBV19EUklWRVIKLSAgICAgICAgdHJpc3RhdGUgIlJBVyBkcml2ZXIgKC9kZXYvcmF3L3Jhd04pIgotCWRlcGVuZHMgb24gQkxPQ0sKLSAgICAgICAgaGVscAotICAgICAgICAgIFRoZSByYXcgZHJpdmVyIHBlcm1pdHMgYmxvY2sgZGV2aWNlcyB0byBiZSBib3VuZCB0byAvZGV2L3Jhdy9yYXdOLgotICAgICAgICAgIE9uY2UgYm91bmQsIEkvTyBhZ2FpbnN0IC9kZXYvcmF3L3Jhd04gdXNlcyBlZmZpY2llbnQgemVyby1jb3B5IEkvTy4KLSAgICAgICAgICBTZWUgdGhlIHJhdyg4KSBtYW5wYWdlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgICAgICBBcHBsaWNhdGlvbnMgc2hvdWxkIHByZWZlcmFibHkgb3BlbiB0aGUgZGV2aWNlIChlZyAvZGV2L2hkYTEpCi0gICAgICAgICAgd2l0aCB0aGUgT19ESVJFQ1QgZmxhZy4KLQotY29uZmlnIE1BWF9SQVdfREVWUwotICAgICAgICBpbnQgIk1heGltdW0gbnVtYmVyIG9mIFJBVyBkZXZpY2VzIHRvIHN1cHBvcnQgKDEtODE5MikiCi0gICAgICAgIGRlcGVuZHMgb24gUkFXX0RSSVZFUgotICAgICAgICBkZWZhdWx0ICIyNTYiCi0gICAgICAgIGhlbHAKLSAgICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgUkFXIGRldmljZXMgdGhhdCBhcmUgc3VwcG9ydGVkLgotICAgICAgICAgIERlZmF1bHQgaXMgMjU2LiBJbmNyZWFzZSB0aGlzIG51bWJlciBpbiBjYXNlIHlvdSBuZWVkIGxvdHMgb2YKLSAgICAgICAgICByYXcgZGV2aWNlcy4KLQotY29uZmlnIExFR0FDWV9QVFlfQ09VTlQKLQlpbnQgIk1heGltdW0gbnVtYmVyIG9mIGxlZ2FjeSBQVFkgaW4gdXNlIgotCWRlcGVuZHMgb24gTEVHQUNZX1BUWVMKLQlkZWZhdWx0ICIyNTYiCi0JaGVscAotCSAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGxlZ2FjeSBQVFlzIHRoYXQgY2FuIGJlIHVzZWQgYXQgYW55IG9uZSB0aW1lLgotCSAgVGhlIGRlZmF1bHQgaXMgMjU2LCBhbmQgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2guICBFbWJlZGRlZAotCSAgc3lzdGVtcyBtYXkgd2FudCB0byByZWR1Y2UgdGhpcyB0byBzYXZlIG1lbW9yeS4KLQotCSAgV2hlbiBub3QgaW4gdXNlLCBlYWNoIGxlZ2FjeSBQVFkgb2NjdXBpZXMgMTIgYnl0ZXMgb24gMzItYml0Ci0JICBhcmNoaXRlY3R1cmVzIGFuZCAyNCBieXRlcyBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcy4KLQotY29uZmlnIFdBVENIRE9HCi0JYm9vbCAiV2F0Y2hkb2cgVGltZXIgU3VwcG9ydCIKLQotY29uZmlnIFdBVENIRE9HX05PV0FZT1VUCi0JYm9vbCAiRGlzYWJsZSB3YXRjaGRvZyBzaHV0ZG93biBvbiBjbG9zZSIKLQlkZXBlbmRzIG9uIFdBVENIRE9HCi0KLWNvbmZpZyBTT0ZUX1dBVENIRE9HCi0JdHJpc3RhdGUgIlNvZnR3YXJlIFdhdGNoZG9nIgotCWRlcGVuZHMgb24gV0FUQ0hET0cKLQotY29uZmlnIFVNTF9XQVRDSERPRwotCXRyaXN0YXRlICJVTUwgd2F0Y2hkb2ciCi0JZGVwZW5kcyBvbiBXQVRDSERPRwotCiBjb25maWcgVU1MX1NPVU5ECiAJdHJpc3RhdGUgIlNvdW5kIHN1cHBvcnQiCiAJaGVscApAQCAtMjExLDI5ICsxMjQsNCBAQAogCXRyaXN0YXRlCiAJZGVmYXVsdCBVTUxfU09VTkQKIAotI0l0IGlzIHNlbGVjdGVkIGVsc2V3aGVyZSwgc28ga2NvbmZpZyB3b3VsZCB3YXJuIHdpdGhvdXQgdGhpcy4KLWNvbmZpZyBIV19SQU5ET00KLQl0cmlzdGF0ZQotCWRlZmF1bHQgbgotCi1jb25maWcgVU1MX1JBTkRPTQotCXRyaXN0YXRlICJIYXJkd2FyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciIKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIFVNTCdzICJoYXJkd2FyZSIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICBJdAotCSAgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBob3N0J3MgL2Rldi9yYW5kb20sIHN1cHBseWluZyBhcyBtdWNoIGVudHJvcHkKLQkgIGFzIHRoZSBob3N0IGhhcywgcmF0aGVyIHRoYW4gdGhlIHNtYWxsIGFtb3VudCB0aGUgVU1MIGdldHMgZnJvbSBpdHMKLQkgIG93biBkcml2ZXJzLiAgSXQgcmVnaXN0ZXJzIGl0c2VsZiBhcyBhIHN0YW5kYXJkIGhhcmR3YXJlIHJhbmRvbSBudW1iZXIKLQkgIGdlbmVyYXRvciwgbWFqb3IgMTAsIG1pbm9yIDE4MywgYW5kIHRoZSBjYW5vbmljYWwgZGV2aWNlIG5hbWUgaXMKLQkgIC9kZXYvaHdybmcuCi0JICBUaGUgd2F5IHRvIG1ha2UgdXNlIG9mIHRoaXMgaXMgdG8gaW5zdGFsbCB0aGUgcm5nLXRvb2xzIHBhY2thZ2UKLQkgIChjaGVjayB5b3VyIGRpc3Rybywgb3IgZG93bmxvYWQgZnJvbQotCSAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9na2VybmVsLykuICBybmdkIHBlcmlvZGljYWxseSByZWFkcwotCSAgL2Rldi9od3JuZyBhbmQgaW5qZWN0cyB0aGUgZW50cm9weSBpbnRvIC9kZXYvcmFuZG9tLgotCi1jb25maWcgTU1BUFBFUgotCXRyaXN0YXRlICJpb21lbSBlbXVsYXRpb24gZHJpdmVyIgotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIGFsbG93cyBhIGhvc3QgZmlsZSB0byBiZSB1c2VkIGFzIGVtdWxhdGVkIElPIG1lbW9yeSBpbnNpZGUKLQkgIFVNTC4KLQogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLnJlc3QgYi9hcmNoL3VtL0tjb25maWcucmVzdAppbmRleCAwY2NhZDBmLi41NjdlYjVmIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcucmVzdAorKysgYi9hcmNoL3VtL0tjb25maWcucmVzdApAQCAtMiwyMCArMiwxNCBAQAogCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLmZyZWV6ZXIiCiAKLXNvdXJjZSAiZHJpdmVycy9ibG9jay9LY29uZmlnIgotCiBzb3VyY2UgImFyY2gvdW0vS2NvbmZpZy5jaGFyIgogCi1zb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAibmV0L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnLm5ldCIKIAotc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvY29ubmVjdG9yL0tjb25maWciCi0KIHNvdXJjZSAiZnMvS2NvbmZpZyIKIAogc291cmNlICJzZWN1cml0eS9LY29uZmlnIgpAQCAtMjQsMTkgKzE4LDQgQEAKIAogc291cmNlICJsaWIvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3Njc2kvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL21kL0tjb25maWciCi0KLWlmIEJST0tFTgotCXNvdXJjZSAiZHJpdmVycy9tdGQvS2NvbmZpZyIKLWVuZGlmCi0KLXNvdXJjZSAiZHJpdmVycy9sZWRzL0tjb25maWciCi0KLSNUaGlzIGlzIGp1c3QgdG8gc2h1dCB1cCBzb21lIEtjb25maWcgd2FybmluZ3MsIHNvIG5vIHByb21wdC4KLWNvbmZpZyBJTlBVVAotCXRyaXN0YXRlCi0JZGVmYXVsdCBuCi0KIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnLmRlYnVnIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLnVtIGIvYXJjaC91bS9LY29uZmlnLnVtCmluZGV4IGI1ZTY3NWUuLjcwZmQ2OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZy51bQorKysgYi9hcmNoL3VtL0tjb25maWcudW0KQEAgLTE0OCw1ICsxNDgsMTEgQEAKIAkgIGJlIDEgPDwgb3JkZXIgcGFnZXMuICBUaGUgZGVmYXVsdCBpcyBPSyB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgVmFsZ3JpbmQKIAkgIG9uIFVNTCwgaW4gd2hpY2ggY2FzZSwgc2V0IHRoaXMgdG8gMy4KIAorY29uZmlnIE1NQVBQRVIKKwl0cmlzdGF0ZSAiaW9tZW0gZW11bGF0aW9uIGRyaXZlciIKKwloZWxwCisJICBUaGlzIGRyaXZlciBhbGxvd3MgYSBob3N0IGZpbGUgdG8gYmUgdXNlZCBhcyBlbXVsYXRlZCBJTyBtZW1vcnkgaW5zaWRlCisJICBVTUwuCisKIGNvbmZpZyBOT19ETUEKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcueDg2IGIvYXJjaC91bS9LY29uZmlnLng4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiZWJlNi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL0tjb25maWcueDg2CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotbWFpbm1lbnUgIlVzZXIgTW9kZSBMaW51eC8kU1VCQVJDSCAkS0VSTkVMVkVSU0lPTiBLZXJuZWwgQ29uZmlndXJhdGlvbiIKLQotc291cmNlICJhcmNoL3VtL0tjb25maWcuY29tbW9uIgotCi1tZW51ICJVTUwtc3BlY2lmaWMgb3B0aW9ucyIKLQotbWVudSAiSG9zdCBwcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMiCi0KLWNvbmZpZyBDTVBYQ0hHX0xPQ0FMCi0JYm9vbAotCWRlZmF1bHQgbgotCi1jb25maWcgQ01QWENIR19ET1VCTEUKLQlib29sCi0JZGVmYXVsdCBuCi0KLXNvdXJjZSAiYXJjaC94ODYvS2NvbmZpZy5jcHUiCi0KLWVuZG1lbnUKLQotY29uZmlnIFVNTF9YODYKLQlkZWZfYm9vbCB5Ci0Jc2VsZWN0IEdFTkVSSUNfRklORF9GSVJTVF9CSVQKLQotY29uZmlnIDY0QklUCi0JYm9vbAotCWRlZmF1bHQgU1VCQVJDSCA9ICJ4ODZfNjQiCi0KLWNvbmZpZyBYODZfMzIKLQlkZWZfYm9vbCAhNjRCSVQKLQlzZWxlY3QgSEFWRV9BT1VUCi0KLWNvbmZpZyBYODZfNjQKLQlkZWZfYm9vbCA2NEJJVAotCi1jb25maWcgUldTRU1fWENIR0FERF9BTEdPUklUSE0KLQlkZWZfYm9vbCBYODZfWEFERCAmJiA2NEJJVAotCi1jb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSwotCWRlZl9ib29sICFSV1NFTV9YQ0hHQUREX0FMR09SSVRITQotCi1jb25maWcgM19MRVZFTF9QR1RBQkxFUwotCWJvb2wgIlRocmVlLWxldmVsIHBhZ2V0YWJsZXMgKEVYUEVSSU1FTlRBTCkiIGlmICE2NEJJVAotCWRlZmF1bHQgNjRCSVQKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWhlbHAKLQlUaHJlZS1sZXZlbCBwYWdldGFibGVzIHdpbGwgbGV0IFVNTCBoYXZlIG1vcmUgdGhhbiA0RyBvZiBwaHlzaWNhbAotCW1lbW9yeS4gIEFsbCB0aGUgbWVtb3J5IHRoYXQgY2FuJ3QgYmUgbWFwcGVkIGRpcmVjdGx5IHdpbGwgYmUgdHJlYXRlZAotCWFzIGhpZ2ggbWVtb3J5LgotCi0JSG93ZXZlciwgdGhpcyBpdCBleHBlcmltZW50YWwgb24gMzItYml0IGFyY2hpdGVjdHVyZXMsIHNvIGlmIHVuc3VyZSBzYXkKLQlOIChvbiB4ODYtNjQgaXQncyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQsIGluc3RlYWQsIGFzIGl0J3Mgc2FmZSB0aGVyZSkuCi0KLWNvbmZpZyBBUkNIX0hBU19TQ19TSUdOQUxTCi0JZGVmX2Jvb2wgITY0QklUCi0KLWNvbmZpZyBBUkNIX1JFVVNFX0hPU1RfVlNZU0NBTExfQVJFQQotCWRlZl9ib29sICE2NEJJVAotCi1jb25maWcgU01QX0JST0tFTgotCWRlZl9ib29sIDY0QklUCi0KLWNvbmZpZyBHRU5FUklDX0hXRUlHSFQKLQlkZWZfYm9vbCB5Ci0KLXNvdXJjZSAiYXJjaC91bS9LY29uZmlnLnVtIgotCi1lbmRtZW51Ci0KLXNvdXJjZSAiYXJjaC91bS9LY29uZmlnLnJlc3QiCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlIGIvYXJjaC91bS9NYWtlZmlsZQppbmRleCBjMGY3MTJjLi43NzMwYWY2IDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlCisrKyBiL2FyY2gvdW0vTWFrZWZpbGUKQEAgLTIwLDE1ICsyMCwyNyBAQAogCiBNT0RFX0lOQ0xVREUJKz0gLUkkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL2luY2x1ZGUvc2hhcmVkL3NrYXMKIAorSEVBREVSX0FSQ0ggCTo9ICQoU1VCQVJDSCkKKworIyBBZGRpdGlvbmFsIEFSQ0ggc2V0dGluZ3MgZm9yIHg4NgoraWZlcSAoJChTVUJBUkNIKSxpMzg2KQorICAgICAgICBIRUFERVJfQVJDSCA6PSB4ODYKK2VuZGlmCitpZmVxICgkKFNVQkFSQ0gpLHg4Nl82NCkKKyAgICAgICAgSEVBREVSX0FSQ0ggOj0geDg2CitlbmRpZgorCitIT1NUX0RJUiA6PSBhcmNoLyQoSEVBREVSX0FSQ0gpCisKIGluY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS1za2FzCitpbmNsdWRlICQoc3JjdHJlZSkvJChIT1NUX0RJUikvTWFrZWZpbGUudW0KKworY29yZS15ICs9ICQoSE9TVF9ESVIpL3VtLwogCiBTSEFSRURfSEVBREVSUwk6PSAkKEFSQ0hfRElSKS9pbmNsdWRlL3NoYXJlZAogQVJDSF9JTkNMVURFCTo9IC1JJChzcmN0cmVlKS8kKFNIQVJFRF9IRUFERVJTKQotQVJDSF9JTkNMVURFCSs9IC1JJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKS9zaGFyZWQKLWlmbmVxICgkKEtCVUlMRF9TUkMpLCkKLUFSQ0hfSU5DTFVERQkrPSAtSSQoU0hBUkVEX0hFQURFUlMpCi1lbmRpZgotS0JVSUxEX0NQUEZMQUdTICs9IC1JJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKQorQVJDSF9JTkNMVURFCSs9IC1JJChzcmN0cmVlKS8kKEhPU1RfRElSKS91bS9zaGFyZWQKK0tCVUlMRF9DUFBGTEFHUyArPSAtSSQoc3JjdHJlZSkvJChIT1NUX0RJUikvdW0KIAogIyAtRHZtYXA9a2VybmVsX3ZtYXAgcHJldmVudHMgYW55dGhpbmcgZnJvbSByZWZlcmVuY2luZyB0aGUgbGlicGNhcC5vIHN5bWJvbCBzbwogIyBuYW1lZCAtIGl0J3MgYSBjb21tb24gc3ltYm9sIGluIGxpYnBjYXAsIHNvIHdlIGdldCBhIGJpbmFyeSB3aGljaCBjcmFzaGVzLgpAQCAtNDcsMTQgKzU5LDEyIEBACiAKIFVTRVJfQ0ZMQUdTID0gJChwYXRzdWJzdCAkKEtFUk5FTF9ERUZJTkVTKSwsJChwYXRzdWJzdCAtRF9fS0VSTkVMX18sLFwKIAkkKHBhdHN1YnN0IC1JJSwsJChLQlVJTERfQ0ZMQUdTKSkpKSAkKEFSQ0hfSU5DTFVERSkgJChNT0RFX0lOQ0xVREUpIFwKLQkkKGZpbHRlciAtSSUsJChDRkxBR1MpKSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0Ci0KLWluY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS0kKFNVQkFSQ0gpCisJJChmaWx0ZXIgLUklLCQoQ0ZMQUdTKSkgLURfRklMRV9PRkZTRVRfQklUUz02NCAtaWRpcmFmdGVyIGluY2x1ZGUKIAogI1RoaXMgd2lsbCBhZGp1c3QgKkZMQUdTIGFjY29yZGluZ2x5IHRvIHRoZSBwbGF0Zm9ybS4KIGluY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS1vcy0kKE9TKQogCi1LQlVJTERfQ1BQRkxBR1MgKz0gLUkkKHNyY3RyZWUpL2FyY2gvJChIRUFERVJfQVJDSCkvaW5jbHVkZQorS0JVSUxEX0NQUEZMQUdTICs9IC1JJChzcmN0cmVlKS8kKEhPU1RfRElSKS9pbmNsdWRlCiAKICMgLURlcnJubz1rZXJuZWxfZXJybm8gLSBUaGlzIHR1cm5zIGFsbCBrZXJuZWwgcmVmZXJlbmNlcyB0byBlcnJubyBpbnRvCiAjIGtlcm5lbF9lcnJubyB0byBzZXBhcmF0ZSB0aGVtIGZyb20gdGhlIGxpYmMgZXJybm8uICBUaGlzIGFsbG93cyAtZm5vLWNvbW1vbgpAQCAtODQsMTAgKzk0LDkgQEAKICAgZWNobyAnCQkgICBmaW5kIGluIHRoZSBrZXJuZWwgcm9vdC4nCiBlbmRlZgogCi1LQlVJTERfS0NPTkZJRyA6PSBhcmNoL3VtL0tjb25maWcuJChIRUFERVJfQVJDSCkKK0tCVUlMRF9LQ09ORklHIDo9ICQoSE9TVF9ESVIpL3VtL0tjb25maWcKIAotYXJjaHByZXBhcmU6ICQoU0hBUkVEX0hFQURFUlMpL3VzZXJfY29uc3RhbnRzLmgKLWFyY2hwcmVwYXJlOiAkKFNIQVJFRF9IRUFERVJTKS9rZXJuX2NvbnN0YW50cy5oCithcmNocHJlcGFyZTogaW5jbHVkZS9nZW5lcmF0ZWQvdXNlcl9jb25zdGFudHMuaAogCiBMSU5LLSQoQ09ORklHX0xEX1NDUklQVF9TVEFUSUMpICs9IC1zdGF0aWMKIExJTkstJChDT05GSUdfTERfU0NSSVBUX0RZTikgKz0gLVdsLC1ycGF0aCwvbGliCkBAIC0xMTgsOSArMTI3LDcgQEAKIAogIyBXaGVuIGNsZWFuaW5nIHdlIGRvbid0IGluY2x1ZGUgLmNvbmZpZywgc28gd2UgZG9uJ3QgaW5jbHVkZQogIyBUVCBvciBza2FzIG1ha2VmaWxlcyBhbmQgZG9uJ3QgY2xlYW4gc2thc19wdHJlZ3MuaC4KLUNMRUFOX0ZJTEVTICs9IGxpbnV4IHguaSBnbW9uLm91dCBcCi0JJChTSEFSRURfSEVBREVSUykvdXNlcl9jb25zdGFudHMuaCBcCi0JJChTSEFSRURfSEVBREVSUykva2Vybl9jb25zdGFudHMuaAorQ0xFQU5fRklMRVMgKz0gbGludXggeC5pIGdtb24ub3V0CiAKIGFyY2hjbGVhbjoKIAlAZmluZCAuIFwoIC1uYW1lICcqLmJiJyAtbyAtbmFtZSAnKi5iYmcnIC1vIC1uYW1lICcqLmRhJyBcCkBAIC0xMjgsOCArMTM1LDggQEAKIAogIyBHZW5lcmF0ZWQgZmlsZXMKIAotJChBUkNIX0RJUikvc3lzLSQoU1VCQVJDSCkvdXNlci1vZmZzZXRzLnM6IEZPUkNFCi0JJChRKSQoTUFLRSkgJChidWlsZCk9JChBUkNIX0RJUikvc3lzLSQoU1VCQVJDSCkgJEAKKyQoSE9TVF9ESVIpL3VtL3VzZXItb2Zmc2V0cy5zOiBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoSE9TVF9ESVIpL3VtICRACiAKIGRlZmluZSBmaWxlY2hrX2dlbi1hc20tb2Zmc2V0cwogICAgICAgICAoc2V0IC1lOyBcCkBAIC0xNDQsMTEgKzE1MSw3IEBACiAgICAgICAgICBlY2hvICIiOyApCiBlbmRlZgogCi0kKFNIQVJFRF9IRUFERVJTKS91c2VyX2NvbnN0YW50cy5oOiAkKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKS91c2VyLW9mZnNldHMucworaW5jbHVkZS9nZW5lcmF0ZWQvdXNlcl9jb25zdGFudHMuaDogJChIT1NUX0RJUikvdW0vdXNlci1vZmZzZXRzLnMKIAkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCiAKLSQoU0hBUkVEX0hFQURFUlMpL2tlcm5fY29uc3RhbnRzLmg6Ci0JJChRKW1rZGlyIC1wICQoZGlyICRAKQotCSQoUSllY2hvICcjaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9nZW5lcmF0ZWQvYXNtLW9mZnNldHMuaCInID4kQAotCi1leHBvcnQgU1VCQVJDSCBVU0VSX0NGTEFHUyBDRkxBR1NfTk9fSEFSREVOSU5HIE9TIEhFQURFUl9BUkNIIERFVl9OVUxMX1BBVEgKK2V4cG9ydCBTVUJBUkNIIFVTRVJfQ0ZMQUdTIENGTEFHU19OT19IQVJERU5JTkcgT1MgREVWX05VTExfUEFUSApkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS1pMzg2IGIvYXJjaC91bS9NYWtlZmlsZS1pMzg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDJjYmU1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vTWFrZWZpbGUtaTM4NgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLWNvcmUteSArPSBhcmNoL3VtL3N5cy1pMzg2LyBhcmNoL3g4Ni9jcnlwdG8vCi0KLVRPUF9BRERSIDo9ICQoQ09ORklHX1RPUF9BRERSKQotCi1TVEFSVCA6PSAweDgwNDgwMDAKLQotTERGTEFHUwkJCSs9IC1tIGVsZl9pMzg2Ci1FTEZfQVJDSAkJOj0gJChTVUJBUkNIKQotRUxGX0ZPUk1BVCAJCTo9IGVsZjMyLSQoU1VCQVJDSCkKLU9CSkNPUFlGTEFHUyAgCQk6PSAtTyBiaW5hcnkgLVIgLm5vdGUgLVIgLmNvbW1lbnQgLVMKLUhFQURFUl9BUkNICQk6PSB4ODYKLUNIRUNLRkxBR1MJKz0gLURfX2kzODZfXwotCi1pZmVxICgiJChvcmlnaW4gU1VCQVJDSCkiLCAiY29tbWFuZCBsaW5lIikKLWlmbmVxICgiJChzaGVsbCB1bmFtZSAtbSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8pIiwgIiQoU1VCQVJDSCkiKQotS0JVSUxEX0NGTEFHUwkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQotS0JVSUxEX0FGTEFHUwkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQotTElOSy15CQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQotVU1MX09CSkNPUFlGTEFHUwkrPSAtRiAkKEVMRl9GT1JNQVQpCi0KLWV4cG9ydCBMREZMQUdTIEhPU1RDRkxBR1MgSE9TVExERkxBR1MgVU1MX09CSkNPUFlGTEFHUwotZW5kaWYKLWVuZGlmCi0KLSMgRmlyc3Qgb2YgYWxsLCB0dW5lIENGTEFHUyBmb3IgdGhlIHNwZWNpZmljIENQVS4gVGhpcyBhY3R1YWxseSBzZXRzIGNmbGFncy15LgotaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gveDg2L01ha2VmaWxlXzMyLmNwdQotCi0jIHByZXZlbnQgZ2NjIGZyb20ga2VlcGluZyB0aGUgc3RhY2sgMTYgYnl0ZSBhbGlnbmVkLiBUYWtlbiBmcm9tIGkzODYuCi1jZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIpCi0KLSMgUHJldmVudCBzcHJpbnRmIGluIG5mc2QgZnJvbSBiZWluZyBjb252ZXJ0ZWQgdG8gc3RyY3B5IGFuZCByZXN1bHRpbmcgaW4KLSMgYW4gdW5yZXNvbHZlZCByZWZlcmVuY2UuCi1jZmxhZ3MteSArPSAtZmZyZWVzdGFuZGluZwotCi0jIERpc2FibGUgdW5pdC1hdC1hLXRpbWUgbW9kZSBvbiBwcmUtZ2NjLTQuMCBjb21waWxlcnMsIGl0IG1ha2VzIGdjYyB1c2UKLSMgYSBsb3QgbW9yZSBzdGFjayBkdWUgdG8gdGhlIGxhY2sgb2Ygc2hhcmluZyBvZiBzdGFja2xvdHMuICBBbHNvLCBnY2MKLSMgNC4zLjAgbmVlZHMgLWZ1bml0LWF0LWEtdGltZSBmb3IgZXh0ZXJuIGlubGluZSBmdW5jdGlvbnMuCi1LQlVJTERfQ0ZMQUdTICs9ICQoc2hlbGwgaWYgWyAkKGNhbGwgY2MtdmVyc2lvbikgLWx0IDA0MDAgXSA7IHRoZW4gXAotCQkJZWNobyAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tdW5pdC1hdC1hLXRpbWUpOyBcCi0JCQllbHNlIGVjaG8gJChjYWxsIGNjLW9wdGlvbiwtZnVuaXQtYXQtYS10aW1lKTsgZmkgOykKLQotS0JVSUxEX0NGTEFHUyArPSAkKGNmbGFncy15KQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQgYi9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljZDdlNy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDMgLSAyMDA0IFBhdGhzY2FsZSwgSW5jCi0jIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKLQotY29yZS15ICs9IGFyY2gvdW0vc3lzLXg4Nl82NC8gYXJjaC94ODYvY3J5cHRvLwotU1RBUlQgOj0gMHg2MDAwMDAwMAotCi1fZXh0cmFfZmxhZ3NfID0gLWZuby1idWlsdGluIC1tNjQKLQotS0JVSUxEX0NGTEFHUyArPSAkKF9leHRyYV9mbGFnc18pCi0KLUNIRUNLRkxBR1MgICs9IC1tNjQgLURfX3g4Nl82NF9fCi1LQlVJTERfQUZMQUdTICs9IC1tNjQKLUxERkxBR1MgKz0gLW0gZWxmX3g4Nl82NAotS0JVSUxEX0NQUEZMQUdTICs9IC1tNjQKLQotRUxGX0FSQ0ggOj0gaTM4Njp4ODYtNjQKLUVMRl9GT1JNQVQgOj0gZWxmNjQteDg2LTY0Ci1IRUFERVJfQVJDSCA6PSB4ODYKLQotIyBOb3Qgb24gYWxsIDY0LWJpdCBkaXN0cm9zIC9saWIgaXMgYSBzeW1saW5rIHRvIC9saWI2NC4gUExEIGlzIGFuIGV4YW1wbGUuCi0KLUxJTkstJChDT05GSUdfTERfU0NSSVBUX0RZTikgKz0gLVdsLC1ycGF0aCwvbGliNjQKLUxJTksteSArPSAtbTY0Ci0KLSMgRG8gdW5pdC1hdC1hLXRpbWUgdW5jb25kaXRpb25hbGx5IG9uIHg4Nl82NCwgZm9sbG93aW5nIHRoZSBob3N0Ci1LQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZ1bml0LWF0LWEtdGltZSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuLmggYi9hcmNoL3VtL2RyaXZlcnMvY2hhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjBmZDkwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW4uaApAQCAtMCwwICsxLDUwIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX0NIQU5fS0VSTl9IX18KKyNkZWZpbmUgX19DSEFOX0tFUk5fSF9fCisKKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgImNoYW5fdXNlci5oIgorI2luY2x1ZGUgImxpbmUuaCIKKworc3RydWN0IGNoYW4geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKKwlzdHJ1Y3QgbGluZSAqbGluZTsKKwljaGFyICpkZXY7CisJdW5zaWduZWQgaW50IHByaW1hcnk6MTsKKwl1bnNpZ25lZCBpbnQgaW5wdXQ6MTsKKwl1bnNpZ25lZCBpbnQgb3V0cHV0OjE7CisJdW5zaWduZWQgaW50IG9wZW5lZDoxOworCXVuc2lnbmVkIGludCBlbmFibGVkOjE7CisJaW50IGZkOworCWNvbnN0IHN0cnVjdCBjaGFuX29wcyAqb3BzOworCXZvaWQgKmRhdGE7Cit9OworCitleHRlcm4gdm9pZCBjaGFuX2ludGVycnVwdChzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgc3RydWN0IGRlbGF5ZWRfd29yayAqdGFzaywKKwkJCSAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBpcnEpOworZXh0ZXJuIGludCBwYXJzZV9jaGFuX3BhaXIoY2hhciAqc3RyLCBzdHJ1Y3QgbGluZSAqbGluZSwgaW50IGRldmljZSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjaGFuX29wdHMgKm9wdHMsIGNoYXIgKiplcnJvcl9vdXQpOworZXh0ZXJuIGludCB3cml0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4sCisJCQkgICAgIGludCB3cml0ZV9pcnEpOworZXh0ZXJuIGludCBjb25zb2xlX3dyaXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCQkgICAgICBpbnQgbGVuKTsKK2V4dGVybiBpbnQgY29uc29sZV9vcGVuX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUsIHN0cnVjdCBjb25zb2xlICpjbyk7CitleHRlcm4gdm9pZCBkZWFjdGl2YXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBpcnEpOworZXh0ZXJuIHZvaWQgcmVhY3RpdmF0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBpbnQgaXJxKTsKK2V4dGVybiB2b2lkIGNoYW5fZW5hYmxlX3dpbmNoKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiBpbnQgZW5hYmxlX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUpOworZXh0ZXJuIHZvaWQgY2xvc2VfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGRlbGF5X2ZyZWVfaXJxKTsKK2V4dGVybiBpbnQgY2hhbl93aW5kb3dfc2l6ZShzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgCisJCQkgICAgIHVuc2lnbmVkIHNob3J0ICpyb3dzX291dCwgCisJCQkgICAgIHVuc2lnbmVkIHNob3J0ICpjb2xzX291dCk7CitleHRlcm4gaW50IGNoYW5fY29uZmlnX3N0cmluZyhzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgY2hhciAqc3RyLCBpbnQgc2l6ZSwKKwkJCSAgICAgIGNoYXIgKiplcnJvcl9vdXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYwppbmRleCBkNDE5MWZlLi40MjBlMmM4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgImNoYW5fa2Vybi5oIgorI2luY2x1ZGUgImNoYW4uaCIKICNpbmNsdWRlICJvcy5oIgogCiAjaWZkZWYgQ09ORklHX05PQ09ORklHX0NIQU4KQEAgLTM1OCwxMSArMzU4LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfb25lX2NoYW4oc3RydWN0IGNoYW4gKmNoYW4sIGludCBkZWxheV9mcmVlX2lycSkKK3N0YXRpYyB2b2lkIGZyZWVfb25lX2NoYW4oc3RydWN0IGNoYW4gKmNoYW4pCiB7CiAJbGlzdF9kZWwoJmNoYW4tPmxpc3QpOwogCi0JY2xvc2Vfb25lX2NoYW4oY2hhbiwgZGVsYXlfZnJlZV9pcnEpOworCWNsb3NlX29uZV9jaGFuKGNoYW4sIDApOwogCiAJaWYgKGNoYW4tPm9wcy0+ZnJlZSAhPSBOVUxMKQogCQkoKmNoYW4tPm9wcy0+ZnJlZSkoY2hhbi0+ZGF0YSk7CkBAIC0zNzIsMTQgKzM3MiwxNCBAQAogCWtmcmVlKGNoYW4pOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBkZWxheV9mcmVlX2lycSkKK3N0YXRpYyB2b2lkIGZyZWVfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbGUsICpuZXh0OwogCXN0cnVjdCBjaGFuICpjaGFuOwogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKGVsZSwgbmV4dCwgY2hhbnMpIHsKIAkJY2hhbiA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3QgY2hhbiwgbGlzdCk7Ci0JCWZyZWVfb25lX2NoYW4oY2hhbiwgZGVsYXlfZnJlZV9pcnEpOworCQlmcmVlX29uZV9jaGFuKGNoYW4pOwogCX0KIH0KIApAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJY2hhciAqaW4sICpvdXQ7CiAKIAlpZiAoIWxpc3RfZW1wdHkoY2hhbnMpKSB7Ci0JCWZyZWVfY2hhbihjaGFucywgMCk7CisJCWZyZWVfY2hhbihjaGFucyk7CiAJCUlOSVRfTElTVF9IRUFEKGNoYW5zKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYwppbmRleCBjZmViM2Y0Li5mMTgwODEzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCkBAIC0xMSwxMCArMTEsOCBAQAogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiB2b2lkIGdlbmVyaWNfY2xvc2UoaW50IGZkLCB2b2lkICp1bnVzZWQpCiB7CkBAIC0yODMsNyArMjgxLDEyIEBACiAJCXJldHVybjsKIAogCXBpZCA9IHRjZ2V0cGdycChmZCk7Ci0JaWYgKCFpc19za2FzX3dpbmNoKHBpZCwgZmQsIHR0eSkgJiYgKHBpZCA9PSAtMSkpIHsKKwlpZiAoaXNfc2thc193aW5jaChwaWQsIGZkLCB0dHkpKSB7CisJCXJlZ2lzdGVyX3dpbmNoX2lycSgtMSwgZmQsIC0xLCB0dHksIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKHBpZCA9PSAtMSkgewogCQl0aHJlYWQgPSB3aW5jaF90cmFtcChmZCwgdHR5LCAmdGhyZWFkX2ZkLCAmc3RhY2spOwogCQlpZiAodGhyZWFkIDwgMCkKIAkJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY2hhbl91c2VyLmggYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY2hhbl91c2VyLmgKcmVuYW1lIHRvIGFyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuaApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaCBiL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmgKaW5kZXggZjU3MDFmZC4uN2YyZWQwYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaAorKysgYi9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oCkBAIC0zLDcgKzMsNiBAQAogCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqY293X21hbGxvYyhpbnQgc2l6ZSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKaW5kZXggZjhlODVlMC4uYTRmZDdiYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBlbnVtIHJlcXVlc3RfdHlwZSB7IFJFUV9ORVdfQ09OVFJPTCB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvZmQuYyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCmluZGV4IGY1YTk4MWEuLjViODFkMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9mZC5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCkBAIC05LDEwICs5LDggQEAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBzdHJ1Y3QgZmRfY2hhbiB7CiAJaW50IGZkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCmluZGV4IDg0ZGNlM2YuLjAzNDVkNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ191c2VyLmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RydWN0IGRvZ19kYXRhIHsKIAlpbnQgc3RkaW47CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwppbmRleCAzNjRjOGExLi5jMWNmMjIwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTcsNyArNyw3IEBACiAjaW5jbHVkZSAibGludXgva2QuaCIKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgogI2luY2x1ZGUgImxpbnV4L3NsYWIuaCIKLSNpbmNsdWRlICJjaGFuX2tlcm4uaCIKKyNpbmNsdWRlICJjaGFuLmgiCiAjaW5jbHVkZSAiaXJxX2tlcm4uaCIKICNpbmNsdWRlICJpcnFfdXNlci5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9saW5lLmggYi9hcmNoL3VtL2RyaXZlcnMvbGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2xpbmUuaApyZW5hbWUgdG8gYXJjaC91bS9kcml2ZXJzL2xpbmUuaApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9tY29uc29sZS5oIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9zaGFyZWQvbWNvbnNvbGUuaApyZW5hbWUgdG8gYXJjaC91bS9kcml2ZXJzL21jb25zb2xlLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvbWNvbnNvbGVfa2Vybi5oIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9tY29uc29sZV9rZXJuLmgKcmVuYW1lIHRvIGFyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jCmluZGV4IGY4Y2Y0YzguLjk5MjA5ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX3VzZXIuYwpAQCAtMTAsOSArMTAsNyBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvdWlvLmg+CiAjaW5jbHVkZSA8c3lzL3VuLmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJtY29uc29sZS5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RhdGljIHN0cnVjdCBtY29uc29sZV9jb21tYW5kIGNvbW1hbmRzW10gPSB7CiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKaW5kZXggNTIwMTE4OC4uMDUwOTBjMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKQEAgLTEyLDEwICsxMiw4IEBACiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSAibmV0X3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBpbnQgdGFwX29wZW5fY29tbW9uKHZvaWQgKmRldiwgY2hhciAqZ2F0ZV9hZGRyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCmluZGV4IDVmOTAzNTguLjcwMmE3NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKQEAgLTksOSArOSw3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSAibmV0X3VzZXIuaCIKICNpbmNsdWRlICJwY2FwX3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogI2RlZmluZSBQQ0FQX0ZEKHApICgqKGludCAqKShwKSkKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jCmluZGV4IGI0OWJmNTYuLjdiMDEwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKQEAgLTEwLDExICsxMCw5IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogI2luY2x1ZGUgImNoYW5fdXNlci5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJwb3J0LmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBzdHJ1Y3QgcG9ydF9jaGFuIHsKIAlpbnQgcmF3OwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3B0eS5jIGIvYXJjaC91bS9kcml2ZXJzL3B0eS5jCmluZGV4IDExMTM5MTEuLmNmZjJiNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wdHkuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKQEAgLTEyLDEwICsxMiw4IEBACiAjaW5jbHVkZSA8dGVybWlvcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RydWN0IHB0eV9jaGFuIHsKIAl2b2lkICgqYW5ub3VuY2UpKGNoYXIgKmRldl9uYW1lLCBpbnQgZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwppbmRleCBjYmFjZmM0Li45MzJiNGQ2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCkBAIC0xMSwxMiArMTEsMTAgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdGVybWlvcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAic2xpcC5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RhdGljIGludCBzbGlwX3VzZXJfaW5pdCh2b2lkICpkYXRhLCB2b2lkICpkZXYpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYwppbmRleCBhMGFkYThmLi5kYjRhZGI2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF91c2VyLmMKQEAgLTcsMTEgKzcsOSBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm5ldF91c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJzbGlycC5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RhdGljIGludCBzbGlycF91c2VyX2luaXQodm9pZCAqZGF0YSwgdm9pZCAqZGV2KQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3NzbC5jIGIvYXJjaC91bS9kcml2ZXJzL3NzbC5jCmluZGV4IGYxNzg2ZTYuLjlkOGMyMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zc2wuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvc3NsLmMKQEAgLTEyLDEwICsxMiw4IEBACiAjaW5jbHVkZSAibGludXgvY29uc29sZS5oIgogI2luY2x1ZGUgImFzbS90ZXJtYml0cy5oIgogI2luY2x1ZGUgImFzbS9pcnEuaCIKLSNpbmNsdWRlICJsaW5lLmgiCiAjaW5jbHVkZSAic3NsLmgiCi0jaW5jbHVkZSAiY2hhbl9rZXJuLmgiCi0jaW5jbHVkZSAia2Vybi5oIgorI2luY2x1ZGUgImNoYW4uaCIKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKICNpbmNsdWRlICJtY29uc29sZV9rZXJuLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jIGIvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYwppbmRleCA0OTI2NmY2Li4wODg3NzZmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMKQEAgLTIwLDggKzIwLDcgQEAKICNpbmNsdWRlICJhc20vY3VycmVudC5oIgogI2luY2x1ZGUgImFzbS9pcnEuaCIKICNpbmNsdWRlICJzdGRpb19jb25zb2xlLmgiCi0jaW5jbHVkZSAibGluZS5oIgotI2luY2x1ZGUgImNoYW5fa2Vybi5oIgorI2luY2x1ZGUgImNoYW4uaCIKICNpbmNsdWRlICJpcnFfdXNlci5oIgogI2luY2x1ZGUgIm1jb25zb2xlX2tlcm4uaCIKICNpbmNsdWRlICJpbml0LmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdHR5LmMgYi9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKaW5kZXggNDk1ODU4YS4uYTk3MzkxZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3R0eS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy90dHkuYwpAQCAtNywxMCArNyw4IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RydWN0IHR0eV9jaGFuIHsKIAljaGFyICpkZXY7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCmluZGV4IDYyMGY1YjcuLjk0NDQ1M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSAiYXNtL3RsYmZsdXNoLmgiCiAjaW5jbHVkZSAibWVtX3VzZXIuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKLSNpbmNsdWRlICJrZXJuLmgiCiAjaW5jbHVkZSAibWNvbnNvbGVfa2Vybi5oIgogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJpcnFfdXNlci5oIgpAQCAtNTQsNyArNTMsNiBAQAogI2luY2x1ZGUgInViZF91c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJtZW0uaCIKLSNpbmNsdWRlICJtZW1fa2Vybi5oIgogI2luY2x1ZGUgImNvdy5oIgogCiBlbnVtIHViZF9yZXEgeyBVQkRfUkVBRCwgVUJEX1dSSVRFIH07CkBAIC01MTMsOCArNTExLDM3IEBACiBzdGF0aWMgaW5saW5lIGludCB1YmRfZmlsZV9zaXplKHN0cnVjdCB1YmQgKnViZF9kZXYsIF9fdTY0ICpzaXplX291dCkKIHsKIAljaGFyICpmaWxlOworCWludCBmZDsKKwlpbnQgZXJyOwogCi0JZmlsZSA9IHViZF9kZXYtPmNvdy5maWxlID8gdWJkX2Rldi0+Y293LmZpbGUgOiB1YmRfZGV2LT5maWxlOworCV9fdTMyIHZlcnNpb247CisJX191MzIgYWxpZ247CisJY2hhciAqYmFja2luZ19maWxlOworCXRpbWVfdCBtdGltZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTsKKwlpbnQgc2VjdG9yX3NpemU7CisJaW50IGJpdG1hcF9vZmZzZXQ7CisKKwlpZiAodWJkX2Rldi0+ZmlsZSAmJiB1YmRfZGV2LT5jb3cuZmlsZSkgeworCQlmaWxlID0gdWJkX2Rldi0+Y293LmZpbGU7CisKKwkJZ290byBvdXQ7CisJfQorCisJZmQgPSBvc19vcGVuX2ZpbGUodWJkX2Rldi0+ZmlsZSwgZ2xvYmFsX29wZW5mbGFncywgMCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJZXJyID0gcmVhZF9jb3dfaGVhZGVyKGZpbGVfcmVhZGVyLCAmZmQsICZ2ZXJzaW9uLCAmYmFja2luZ19maWxlLCBcCisJCSZtdGltZSwgJnNpemUsICZzZWN0b3Jfc2l6ZSwgJmFsaWduLCAmYml0bWFwX29mZnNldCk7CisJb3NfY2xvc2VfZmlsZShmZCk7CisKKwlpZihlcnIgPT0gLUVJTlZBTCkKKwkJZmlsZSA9IHViZF9kZXYtPmZpbGU7CisJZWxzZQorCQlmaWxlID0gYmFja2luZ19maWxlOworCitvdXQ6CiAJcmV0dXJuIG9zX2ZpbGVfc2l6ZShmaWxlLCBzaXplX291dCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy91YmRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMKaW5kZXggYjU5MWJiOS4uMDA3Yjk0ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgogI2luY2x1ZGUgImFzbS90eXBlcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ1YmRfdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAiY293LmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3ViZF91c2VyLmggYi9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91YmRfdXNlci5oCnJlbmFtZSB0byBhcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuaApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3VtY2FzdF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvdW1jYXN0X3VzZXIuYwppbmRleCA1OWM1NmZkLi4wMTBmYTJkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdW1jYXN0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdW1jYXN0X3VzZXIuYwpAQCAtMTUsMTEgKzE1LDkgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInVtY2FzdC5oIgogI2luY2x1ZGUgIm5ldF91c2VyLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBzdGF0aWMgc3RydWN0IHNvY2thZGRyX2luICpuZXdfYWRkcihjaGFyICphZGRyLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ZkZV91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvdmRlX3VzZXIuYwppbmRleCBjNWM0MzI1Li5iOGMyODY3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdmRlX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdmRlX3VzZXIuYwpAQCAtNiwxMCArNiw4IEBACiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaWJ2ZGVwbHVnLmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ2ZGUuaCIKIAogc3RhdGljIGludCB2ZGVfdXNlcl9pbml0KHZvaWQgKmRhdGEsIHZvaWQgKmRldikKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy94dGVybS5jIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKaW5kZXggMmUxZGU1Ny4uOTY5MTEwZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKQEAgLTExLDEwICsxMSw4IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGVybWlvcy5oPgogI2luY2x1ZGUgImNoYW5fdXNlci5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAieHRlcm0uaCIKIAogc3RydWN0IHh0ZXJtX2NoYW4gewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTFmNDUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTAsMCArMSwzIEBACitnZW5lcmljLXkgKz0gYnVnLmggY3B1dGltZS5oIGRldmljZS5oIGVtZXJnZW5jeS1yZXN0YXJ0LmggZnV0ZXguaCBoYXJkaXJxLmgKK2dlbmVyaWMteSArPSBod19pcnEuaCBpcnFfcmVncy5oIGtkZWJ1Zy5oIHBlcmNwdS5oIHNlY3Rpb25zLmggdG9wb2xvZ3kuaCB4b3IuaAorZ2VuZXJpYy15ICs9IGZ0cmFjZS5oCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2J1Zy5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9idWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzM2I4Ni4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2J1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9fVU1fQlVHX0gKLSNkZWZpbmUgX19VTV9CVUdfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9jaGVja3N1bS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUwMTM2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vY2hlY2tzdW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX1VNX0NIRUNLU1VNX0gKLSNkZWZpbmUgX19VTV9DSEVDS1NVTV9ICi0KLSNpbmNsdWRlICJzeXNkZXAvY2hlY2tzdW0uaCIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vY3B1dGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRhY2JhLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9fVU1fQ1BVVElNRV9ICi0jZGVmaW5lIF9fVU1fQ1BVVElNRV9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+Ci0KLSNlbmRpZiAvKiBfX1VNX0NQVVRJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9kZXZpY2UuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Zjk4NzIuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9kZXZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLyoKLSAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCi0gKgotICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgotICovCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+Ci0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4ZDhjNC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2VtZXJnZW5jeS1yZXN0YXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9FTUVSR0VOQ1lfUkVTVEFSVF9ICi0jZGVmaW5lIF9BU01fRU1FUkdFTkNZX1JFU1RBUlRfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZW1lcmdlbmN5LXJlc3RhcnQuaD4KLQotI2VuZGlmIC8qIF9BU01fRU1FUkdFTkNZX1JFU1RBUlRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9mdXRleC5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9mdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTMzMmE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vZnV0ZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfQVNNX0ZVVEVYX0gKLSNkZWZpbmUgX0FTTV9GVVRFWF9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vaGFyZGlycS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiM2MwNWEuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGFyZGlycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9od19pcnEuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vaHdfaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjg0Y2YuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9od19pcnEuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1VNX0hXX0lSUV9ICi0jZGVmaW5lIF9BU01fVU1fSFdfSVJRX0gKLQotI2luY2x1ZGUgImFzbS9pcnEuaCIKLSNpbmNsdWRlICJhc20vYXJjaHBhcmFtLmgiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFfcmVncy5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFfcmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ5YzBiLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vaXJxX3JlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcnFfcmVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFmbGFncy5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCmluZGV4IDY1OWI5YWIuLmM3ODBkOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vaXJxZmxhZ3MuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKQEAgLTEsNiArMSw0MiBAQAogI2lmbmRlZiBfX1VNX0lSUUZMQUdTX0gKICNkZWZpbmUgX19VTV9JUlFGTEFHU19ICiAKLS8qIEVtcHR5IGZvciBub3cgKi8KK2V4dGVybiBpbnQgZ2V0X3NpZ25hbHModm9pZCk7CitleHRlcm4gaW50IHNldF9zaWduYWxzKGludCBlbmFibGUpOworZXh0ZXJuIHZvaWQgYmxvY2tfc2lnbmFscyh2b2lkKTsKK2V4dGVybiB2b2lkIHVuYmxvY2tfc2lnbmFscyh2b2lkKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfc2F2ZV9mbGFncyh2b2lkKQoreworCXJldHVybiBnZXRfc2lnbmFscygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXNldF9zaWduYWxzKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQoreworCXVuYmxvY2tfc2lnbmFscygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQoreworCWJsb2NrX3NpZ25hbHMoKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfaXJxX3NhdmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWZsYWdzID0gYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKCk7CisJYXJjaF9sb2NhbF9pcnFfZGlzYWJsZSgpOworCXJldHVybiBmbGFnczsKK30KKworc3RhdGljIGlubGluZSBib29sIGFyY2hfaXJxc19kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiBhcmNoX2xvY2FsX3NhdmVfZmxhZ3MoKSA9PSAwOworfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20va2RlYnVnLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNlMWIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20va2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMva2RlYnVnLmg+CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCBjZjI1OWRlLi4zMDUwOWI5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL21tdS5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vbW11LmgKQEAgLTEsMTIgKzEsMjQgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpZm5kZWYgX19NTVVfSAotI2RlZmluZSBfX01NVV9ICisjaWZuZGVmIF9fQVJDSF9VTV9NTVVfSAorI2RlZmluZSBfX0FSQ0hfVU1fTU1VX0gKIAotI2luY2x1ZGUgInVtX21tdS5oIgorI2luY2x1ZGUgIm1tX2lkLmgiCisjaW5jbHVkZSA8YXNtL21tX2NvbnRleHQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgbW1fY29udGV4dCB7CisJc3RydWN0IG1tX2lkIGlkOworCXN0cnVjdCB1bWxfYXJjaF9tbV9jb250ZXh0IGFyY2g7CisJc3RydWN0IHBhZ2UgKipzdHViX3BhZ2VzOworfSBtbV9jb250ZXh0X3Q7CisKK2V4dGVybiB2b2lkIF9fc3dpdGNoX21tKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCk7CisKKy8qIEF2b2lkIHRhbmdsZWQgaW5jbHVzaW9uIHdpdGggYXNtL2xkdC5oICovCitleHRlcm4gbG9uZyBpbml0X25ld19sZHQoc3RydWN0IG1tX2NvbnRleHQgKnRvX21tLCBzdHJ1Y3QgbW1fY29udGV4dCAqZnJvbV9tbSk7CitleHRlcm4gdm9pZCBmcmVlX2xkdChzdHJ1Y3QgbW1fY29udGV4dCAqbW0pOwogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IDM0ZDgxMzAuLjU5MWIzZDggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTYsMTUgKzYsMTIgQEAKICNpZm5kZWYgX19VTV9NTVVfQ09OVEVYVF9ICiAjZGVmaW5lIF9fVU1fTU1VX0NPTlRFWFRfSAogCi0jaW5jbHVkZSAibGludXgvc2NoZWQuaCIKLSNpbmNsdWRlICJ1bV9tbXUuaCIKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KIAogZXh0ZXJuIHZvaWQgYXJjaF9kdXBfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogZXh0ZXJuIHZvaWQgYXJjaF9leGl0X21tYXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogCi0jZGVmaW5lIGdldF9tbXVfY29udGV4dCh0YXNrKSBkbyA7IHdoaWxlKDApCi0jZGVmaW5lIGFjdGl2YXRlX2NvbnRleHQodHNrKSBkbyA7IHdoaWxlKDApCi0KICNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssbW0pCWRvIHsgfSB3aGlsZSAoMCkKIAogZXh0ZXJuIHZvaWQgZm9yY2VfZmx1c2hfYWxsKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCA0Y2M5YjZjLi43Y2ZjM2NlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMTksNyArMTksNyBAQAogc3RydWN0IHBhZ2U7CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPHN5c2RlcC92bS1mbGFncy5oPgorI2luY2x1ZGUgPGFzbS92bS1mbGFncy5oPgogCiAvKgogICogVGhlc2UgYXJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgQyB0eXBlLWNoZWNraW5nLi4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vcGFnZV9vZmZzZXQuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vcGFnZV9vZmZzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxNjhkZi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BhZ2Vfb2Zmc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIFBBR0VfT0ZGU0VUX1JBVyAodW1sX3BoeXNtZW0pCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BkYS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9wZGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjZDc3NC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BkYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVU1fUERBX1g4Nl82NF9ICi0jZGVmaW5lIF9fVU1fUERBX1g4Nl82NF9ICi0KLS8qIFhYWCAqLwotc3RydWN0IGZvbyB7Ci0JdW5zaWduZWQgaW50IF9fc29mdGlycV9wZW5kaW5nOwotCXVuc2lnbmVkIGludCBfX25taV9jb3VudDsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgZm9vIG1lOwotCi0jZGVmaW5lIHJlYWRfcGRhKG1lKSAoJm1lKQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wZXJjcHUuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vcGVyY3B1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTc1MDguLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wZXJjcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX1VNX1BFUkNQVV9ICi0jZGVmaW5lIF9fVU1fUEVSQ1BVX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BlcmNwdS5oPgotCi0jZW5kaWYgLyogX19VTV9QRVJDUFVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wdHJhY2UtZ2VuZXJpYy5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9wdHJhY2UtZ2VuZXJpYy5oCmluZGV4IDFhN2QyNzUuLmY2MDVkM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vcHRyYWNlLWdlbmVyaWMuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3B0cmFjZS1nZW5lcmljLmgKQEAgLTIzLDE3ICsyMywxMCBAQAogI2RlZmluZSBQVF9SRUdTX0lQKHIpIFVQVF9JUCgmKHIpLT5yZWdzKQogI2RlZmluZSBQVF9SRUdTX1NQKHIpIFVQVF9TUCgmKHIpLT5yZWdzKQogCi0jZGVmaW5lIFBUX1JFRyhyLCByZWcpIFVQVF9SRUcoJihyKS0+cmVncywgcmVnKQotI2RlZmluZSBQVF9SRUdTX1NFVChyLCByZWcsIHZhbCkgVVBUX1NFVCgmKHIpLT5yZWdzLCByZWcsIHZhbCkKLQotI2RlZmluZSBQVF9SRUdTX1NFVF9TWVNDQUxMX1JFVFVSTihyLCByZXMpIFwKLQlVUFRfU0VUX1NZU0NBTExfUkVUVVJOKCYociktPnJlZ3MsIHJlcykKICNkZWZpbmUgUFRfUkVHU19SRVNUQVJUX1NZU0NBTEwocikgVVBUX1JFU1RBUlRfU1lTQ0FMTCgmKHIpLT5yZWdzKQogCiAjZGVmaW5lIFBUX1JFR1NfU1lTQ0FMTF9OUihyKSBVUFRfU1lTQ0FMTF9OUigmKHIpLT5yZWdzKQogCi0jZGVmaW5lIFBUX1JFR1NfU0MocikgVVBUX1NDKCYociktPnJlZ3MpCi0KICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSBQVF9SRUdTX0lQKHJlZ3MpCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc2VjdGlvbnMuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vc2VjdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwMjMxZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX1VNX1NFQ1RJT05TX0gKLSNkZWZpbmUgX1VNX1NFQ1RJT05TX0gKLQotLyogbm90aGluZyB0byBzZWUsIG1vdmUgYWxvbmcgKi8KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc3lzdGVtLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE5MGVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jaWZuZGVmIF9fVU1fU1lTVEVNX0dFTkVSSUNfSAotI2RlZmluZSBfX1VNX1NZU1RFTV9HRU5FUklDX0gKLQotI2luY2x1ZGUgInN5c2RlcC9zeXN0ZW0uaCIKLQotZXh0ZXJuIGludCBnZXRfc2lnbmFscyh2b2lkKTsKLWV4dGVybiBpbnQgc2V0X3NpZ25hbHMoaW50IGVuYWJsZSk7Ci1leHRlcm4gdm9pZCBibG9ja19zaWduYWxzKHZvaWQpOwotZXh0ZXJuIHZvaWQgdW5ibG9ja19zaWduYWxzKHZvaWQpOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCi17Ci0JcmV0dXJuIGdldF9zaWduYWxzKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc2V0X3NpZ25hbHMoZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpCi17Ci0JdW5ibG9ja19zaWduYWxzKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCi17Ci0JYmxvY2tfc2lnbmFscygpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9pcnFfc2F2ZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JZmxhZ3MgPSBhcmNoX2xvY2FsX3NhdmVfZmxhZ3MoKTsKLQlhcmNoX2xvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmV0dXJuIGZsYWdzOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkKHZvaWQpCi17Ci0JcmV0dXJuIGFyY2hfbG9jYWxfc2F2ZV9mbGFncygpID09IDA7Ci19Ci0KLWV4dGVybiB2b2lkICpfc3dpdGNoX3RvKHZvaWQgKnByZXYsIHZvaWQgKm5leHQsIHZvaWQgKmxhc3QpOwotI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkgcHJldiA9IF9zd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDVlNGYuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9BU01fVU1fVE9QT0xPR1lfSAotI2RlZmluZSBfQVNNX1VNX1RPUE9MT0dZX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBiOWE4OTVkLi4zZjIyZmJmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtNiwxNSArNiwxNSBAQAogI2lmbmRlZiBfX1VNX1VBQ0NFU1NfSAogI2RlZmluZSBfX1VNX1VBQ0NFU1NfSAogCi0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCiAvKiB0aHJlYWRfaW5mbyBoYXMgYSBtbV9zZWdtZW50X3QgaW4gaXQsIHNvIHB1dCB0aGUgZGVmaW5pdGlvbiB1cCBoZXJlICovCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyBzZWc7CiB9IG1tX3NlZ21lbnRfdDsKIAotI2luY2x1ZGUgImxpbnV4L3RocmVhZF9pbmZvLmgiCisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAKICNkZWZpbmUgVkVSSUZZX1JFQUQgMAogI2RlZmluZSBWRVJJRllfV1JJVEUgMQpAQCAtMzgsNyArMzgsODYgQEAKIAogI2RlZmluZSBzZWdtZW50X2VxKGEsIGIpICgoYSkuc2VnID09IChiKS5zZWcpCiAKLSNpbmNsdWRlICJ1bV91YWNjZXNzLmgiCisjZGVmaW5lIF9fdW5kZXJfdGFza19zaXplKGFkZHIsIHNpemUpIFwKKwkoKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgPCBUQVNLX1NJWkUpICYmIFwKKwkgKCgodW5zaWduZWQgbG9uZykgKGFkZHIpICsgKHNpemUpKSA8IFRBU0tfU0laRSkpCisKKyNkZWZpbmUgX19hY2Nlc3Nfb2tfdnN5c2NhbGwodHlwZSwgYWRkciwgc2l6ZSkgXAorCSAoKHR5cGUgPT0gVkVSSUZZX1JFQUQpICYmIFwKKwkgICgodW5zaWduZWQgbG9uZykgKGFkZHIpID49IEZJWEFERFJfVVNFUl9TVEFSVCkgJiYgXAorCSAgKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgKyAoc2l6ZSkgPD0gRklYQUREUl9VU0VSX0VORCkgJiYgXAorCSAgKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgKyAoc2l6ZSkgPj0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpKSkKKworI2RlZmluZSBfX2FkZHJfcmFuZ2Vfbm93cmFwKGFkZHIsIHNpemUpIFwKKwkoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSA8PSAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSkpCisKKyNkZWZpbmUgYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpIFwKKwkoX19hZGRyX3JhbmdlX25vd3JhcChhZGRyLCBzaXplKSAmJiBcCisJIChfX3VuZGVyX3Rhc2tfc2l6ZShhZGRyLCBzaXplKSB8fCBcCisJICBfX2FjY2Vzc19va192c3lzY2FsbCh0eXBlLCBhZGRyLCBzaXplKSB8fCBcCisJICBzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKSkKKworZXh0ZXJuIGludCBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIGludCBuKTsKK2V4dGVybiBpbnQgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOworCisvKgorICogc3RybmNweV9mcm9tX3VzZXI6IC0gQ29weSBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZS4KKyAqIEBkc3Q6ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLiAgVGhpcyBidWZmZXIgbXVzdCBiZSBhdAorICogICAgICAgICBsZWFzdCBAY291bnQgYnl0ZXMgbG9uZy4KKyAqIEBzcmM6ICAgU291cmNlIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAY291bnQ6IE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHksIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLgorICoKKyAqIENvcGllcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgc3BhY2UuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nCisgKiBOVUwpLgorICoKKyAqIElmIGFjY2VzcyB0byB1c2Vyc3BhY2UgZmFpbHMsIHJldHVybnMgLUVGQVVMVCAoc29tZSBkYXRhIG1heSBoYXZlIGJlZW4KKyAqIGNvcGllZCkuCisgKgorICogSWYgQGNvdW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGNvcGllcyBAY291bnQgYnl0ZXMKKyAqIGFuZCByZXR1cm5zIEBjb3VudC4KKyAqLworCitleHRlcm4gaW50IHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgaW50IGNvdW50KTsKKworLyoKKyAqIF9fY2xlYXJfdXNlcjogLSBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KKyAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byB6ZXJvLgorICoKKyAqIFplcm8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCisgKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjbGVhcmVkLgorICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCisgKi8KK2V4dGVybiBpbnQgX19jbGVhcl91c2VyKHZvaWQgX191c2VyICptZW0sIGludCBsZW4pOworCisvKgorICogY2xlYXJfdXNlcjogLSBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UuCisgKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gemVyby4KKyAqCisgKiBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UuCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY2xlYXJlZC4KKyAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgorICovCitleHRlcm4gaW50IGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKm1lbSwgaW50IGxlbik7CisKKy8qCisgKiBzdHJsZW5fdXNlcjogLSBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgaW4gdXNlciBzcGFjZS4KKyAqIEBzdHI6IFRoZSBzdHJpbmcgdG8gbWVhc3VyZS4KKyAqIEBuOiAgIFRoZSBtYXhpbXVtIHZhbGlkIGxlbmd0aAorICoKKyAqIEdldCB0aGUgc2l6ZSBvZiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiB1c2VyIHNwYWNlLgorICoKKyAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBJTkNMVURJTkcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKyAqIE9uIGV4Y2VwdGlvbiwgcmV0dXJucyAwLgorICogSWYgdGhlIHN0cmluZyBpcyB0b28gbG9uZywgcmV0dXJucyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBAbi4KKyAqLworZXh0ZXJuIGludCBzdHJubGVuX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnN0ciwgaW50IGxlbik7CiAKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikgY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20veG9yLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3hvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTlkYjNlLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20veG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX19VTV9YT1JfSAotI2RlZmluZSBfX1VNX1hPUl9ICi0KLSNpbmNsdWRlICJhc20tZ2VuZXJpYy94b3IuaCIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2FzLWxheW91dC5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9hcy1sYXlvdXQuaAppbmRleCBhOTJiNjc4Li44OTZlMTY2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2FzLWxheW91dC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvYXMtbGF5b3V0LmgKQEAgLTYsNyArNiw3IEBACiAjaWZuZGVmIF9fU1RBUlRfSF9fCiAjZGVmaW5lIF9fU1RBUlRfSF9fCiAKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgPGdlbmVyYXRlZC9hc20tb2Zmc2V0cy5oPgogCiAvKgogICogU3RvbGVuIGZyb20gbGludXgvY29uc3QuaCwgd2hpY2ggY2FuJ3QgYmUgZGlyZWN0bHkgaW5jbHVkZWQgc2luY2UKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY2hhbl9rZXJuLmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2NoYW5fa2Vybi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTY1MTQ1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY2hhbl9rZXJuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX0NIQU5fS0VSTl9IX18KLSNkZWZpbmUgX19DSEFOX0tFUk5fSF9fCi0KLSNpbmNsdWRlICJsaW51eC90dHkuaCIKLSNpbmNsdWRlICJsaW51eC9saXN0LmgiCi0jaW5jbHVkZSAibGludXgvY29uc29sZS5oIgotI2luY2x1ZGUgImNoYW5fdXNlci5oIgotI2luY2x1ZGUgImxpbmUuaCIKLQotc3RydWN0IGNoYW4gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKLQlzdHJ1Y3QgbGluZSAqbGluZTsKLQljaGFyICpkZXY7Ci0JdW5zaWduZWQgaW50IHByaW1hcnk6MTsKLQl1bnNpZ25lZCBpbnQgaW5wdXQ6MTsKLQl1bnNpZ25lZCBpbnQgb3V0cHV0OjE7Ci0JdW5zaWduZWQgaW50IG9wZW5lZDoxOwotCXVuc2lnbmVkIGludCBlbmFibGVkOjE7Ci0JaW50IGZkOwotCWNvbnN0IHN0cnVjdCBjaGFuX29wcyAqb3BzOwotCXZvaWQgKmRhdGE7Ci19OwotCi1leHRlcm4gdm9pZCBjaGFuX2ludGVycnVwdChzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgc3RydWN0IGRlbGF5ZWRfd29yayAqdGFzaywKLQkJCSAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBpcnEpOwotZXh0ZXJuIGludCBwYXJzZV9jaGFuX3BhaXIoY2hhciAqc3RyLCBzdHJ1Y3QgbGluZSAqbGluZSwgaW50IGRldmljZSwKLQkJCSAgIGNvbnN0IHN0cnVjdCBjaGFuX29wdHMgKm9wdHMsIGNoYXIgKiplcnJvcl9vdXQpOwotZXh0ZXJuIGludCB3cml0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4sCi0JCQkgICAgIGludCB3cml0ZV9pcnEpOwotZXh0ZXJuIGludCBjb25zb2xlX3dyaXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGNvbnN0IGNoYXIgKmJ1ZiwgCi0JCQkgICAgICBpbnQgbGVuKTsKLWV4dGVybiBpbnQgY29uc29sZV9vcGVuX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUsIHN0cnVjdCBjb25zb2xlICpjbyk7Ci1leHRlcm4gdm9pZCBkZWFjdGl2YXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBpcnEpOwotZXh0ZXJuIHZvaWQgcmVhY3RpdmF0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBpbnQgaXJxKTsKLWV4dGVybiB2b2lkIGNoYW5fZW5hYmxlX3dpbmNoKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLWV4dGVybiBpbnQgZW5hYmxlX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUpOwotZXh0ZXJuIHZvaWQgY2xvc2VfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGRlbGF5X2ZyZWVfaXJxKTsKLWV4dGVybiBpbnQgY2hhbl93aW5kb3dfc2l6ZShzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgCi0JCQkgICAgIHVuc2lnbmVkIHNob3J0ICpyb3dzX291dCwgCi0JCQkgICAgIHVuc2lnbmVkIHNob3J0ICpjb2xzX291dCk7Ci1leHRlcm4gaW50IGNoYW5fY29uZmlnX3N0cmluZyhzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgY2hhciAqc3RyLCBpbnQgc2l6ZSwKLQkJCSAgICAgIGNoYXIgKiplcnJvcl9vdXQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY29tbW9uLW9mZnNldHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY29tbW9uLW9mZnNldHMuaAppbmRleCA3MjAwOWM3Li5kN2ZlNTYzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2NvbW1vbi1vZmZzZXRzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9jb21tb24tb2Zmc2V0cy5oCkBAIC0yLDcgKzIsNiBAQAogCiBERUZJTkUoS0VSTkVMX01BRFZfUkVNT1ZFLCBNQURWX1JFTU9WRSk7CiAKLU9GRlNFVChIT1NUX1RBU0tfUkVHUywgdGFza19zdHJ1Y3QsIHRocmVhZC5yZWdzKTsKIE9GRlNFVChIT1NUX1RBU0tfUElELCB0YXNrX3N0cnVjdCwgcGlkKTsKIAogREVGSU5FKFVNX0tFUk5fUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9pbml0cmQuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvaW5pdHJkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjczYmMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9pbml0cmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19JTklUUkRfVVNFUl9IX18KLSNkZWZpbmUgX19JTklUUkRfVVNFUl9IX18KLQotZXh0ZXJuIGludCBsb2FkX2luaXRyZChjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQva2Vybi5oCmluZGV4IDRjZTNmYzYuLjZjZDAxMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQva2Vybi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQva2Vybi5oCkBAIC0xMywyOCArMTMsMTAgQEAKICAqIGluY2x1ZGVzLgogICovCiAKLWV4dGVybiBpbnQgZXJybm87Ci0KLWV4dGVybiBpbnQgY2xvbmUoaW50ICgqcHJvYykodm9pZCAqKSwgdm9pZCAqc3AsIGludCBmbGFncywgdm9pZCAqZGF0YSk7Ci1leHRlcm4gaW50IHNsZWVwKGludCk7CiBleHRlcm4gaW50IHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1leHRlcm4gY2hhciAqc3RyZXJyb3IoaW50IGVycm51bSk7Ci1leHRlcm4gY2hhciAqcHRzbmFtZShpbnQgX19mZCk7Ci1leHRlcm4gaW50IG11bm1hcCh2b2lkICosIGludCk7CiBleHRlcm4gdm9pZCAqc2JyayhpbnQgaW5jcmVtZW50KTsKLWV4dGVybiB2b2lkICptYWxsb2MoaW50IHNpemUpOwotZXh0ZXJuIHZvaWQgcGVycm9yKGNoYXIgKmVycik7Ci1leHRlcm4gaW50IGtpbGwoaW50IHBpZCwgaW50IHNpZyk7Ci1leHRlcm4gaW50IGdldHVpZCh2b2lkKTsKLWV4dGVybiBpbnQgZ2V0Z2lkKHZvaWQpOwogZXh0ZXJuIGludCBwYXVzZSh2b2lkKTsKLWV4dGVybiBpbnQgd3JpdGUoaW50LCBjb25zdCB2b2lkICosIGludCk7CiBleHRlcm4gdm9pZCBleGl0KGludCk7Ci1leHRlcm4gaW50IGNsb3NlKGludCk7Ci1leHRlcm4gaW50IHJlYWQodW5zaWduZWQgaW50LCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50IHBpcGUoaW50ICopOwotZXh0ZXJuIGludCBzY2hlZF95aWVsZCh2b2lkKTsKLWV4dGVybiBpbnQgcHRyYWNlKGludCBvcCwgaW50IHBpZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9rZXJuX3V0aWwuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQva2Vybl91dGlsLmgKaW5kZXggM2MzNDEyMi4uMGYxNDgzOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9rZXJuX3V0aWwuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2tlcm5fdXRpbC5oCkBAIC0yMSw3ICsyMSw2IEBACiBleHRlcm4gdm9pZCBmcmVlX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3RhY2ssIGludCBvcmRlcik7CiAKIGV4dGVybiBpbnQgZG9fc2lnbmFsKHZvaWQpOwotZXh0ZXJuIHZvaWQgY29weV9zYyhzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MsIHZvaWQgKmZyb20pOwogZXh0ZXJuIHZvaWQgaW50ZXJydXB0X2VuZCh2b2lkKTsKIGV4dGVybiB2b2lkIHJlbGF5X3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2xkdC5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9sZHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmOTk5YS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2xkdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBGdWppdHN1IFNpZW1lbnMgQ29tcHV0ZXJzIEdtYkgKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqCi0gKiBBdXRob3I6IEJvZG8gU3Ryb2Vzc2VyIDxic3Ryb2Vzc2VyQGZ1aml0c3Utc2llbWVucy5jb20+Ci0gKi8KLQotI2lmbmRlZiBfX0FTTV9MRFRfSAotI2RlZmluZSBfX0FTTV9MRFRfSAotCi0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxzeXNkZXAvaG9zdF9sZHQuaD4KLQotZXh0ZXJuIHZvaWQgbGR0X2hvc3RfaW5mbyh2b2lkKTsKLQotI2RlZmluZSBMRFRfUEFHRVNfTUFYIFwKLQkoKExEVF9FTlRSSUVTICogTERUX0VOVFJZX1NJWkUpL1BBR0VfU0laRSkKLSNkZWZpbmUgTERUX0VOVFJJRVNfUEVSX1BBR0UgXAotCShQQUdFX1NJWkUvTERUX0VOVFJZX1NJWkUpCi0jZGVmaW5lIExEVF9ESVJFQ1RfRU5UUklFUyBcCi0JKChMRFRfUEFHRVNfTUFYKnNpemVvZih2b2lkICopKS9MRFRfRU5UUllfU0laRSkKLQotc3RydWN0IGxkdF9lbnRyeSB7Ci0JX191MzIgYTsKLQlfX3UzMiBiOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgdW1sX2xkdCB7Ci0JaW50IGVudHJ5X2NvdW50OwotCXN0cnVjdCBtdXRleCBsb2NrOwotCXVuaW9uIHsKLQkJc3RydWN0IGxkdF9lbnRyeSAqIHBhZ2VzW0xEVF9QQUdFU19NQVhdOwotCQlzdHJ1Y3QgbGR0X2VudHJ5IGVudHJpZXNbTERUX0RJUkVDVF9FTlRSSUVTXTsKLQl9IHU7Ci19IHVtbF9sZHRfdDsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL21lbV9rZXJuLmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL21lbV9rZXJuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YmUwZmQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9tZW1fa2Vybi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19NRU1fS0VSTl9IX18KLSNkZWZpbmUgX19NRU1fS0VSTl9IX18KLQotI2luY2x1ZGUgImxpbnV4L2xpc3QuaCIKLSNpbmNsdWRlICJsaW51eC90eXBlcy5oIgotCi1zdHJ1Y3QgcmVtYXBwZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgKCpwcm9jKShpbnQsIHVuc2lnbmVkIGxvbmcsIGludCwgX191NjQpOwotfTsKLQotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfcmVtYXBwZXIoc3RydWN0IHJlbWFwcGVyICppbmZvKTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvb3MuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvb3MuaAppbmRleCA4M2M3YzJlLi44OWI2ODZjMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9vcy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvb3MuaApAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgImlycV91c2VyLmgiCiAjaW5jbHVkZSAibG9uZ2ptcC5oIgogI2luY2x1ZGUgIm1tX2lkLmgiCi0jaW5jbHVkZSAic3lzZGVwL3Rscy5oIgogCiAjZGVmaW5lIENBVENIX0VJTlRSKGV4cHIpIHdoaWxlICgoZXJybm8gPSAwLCAoKGV4cHIpIDwgMCkpICYmIChlcnJubyA9PSBFSU5UUikpCiAKQEAgLTIwMywxMiArMjAyLDYgQEAKIGV4dGVybiBpbnQgY2FuX2Ryb3BfbWVtb3J5KHZvaWQpOwogZXh0ZXJuIHZvaWQgb3NfZmx1c2hfc3Rkb3V0KHZvaWQpOwogCi0vKiB1YWNjZXNzLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fZG9fdXNlcl9jb3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbiwKLQkJCQkgICAgdm9pZCAqKmZhdWx0X2FkZHIsIGptcF9idWYgKipmYXVsdF9jYXRjaGVyLAotCQkJCSAgICB2b2lkICgqb3ApKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLAotCQkJCQkgICAgICAgaW50IG4pLCBpbnQgKmZhdWx0ZWRfb3V0KTsKLQogLyogZXhlY3ZwLmMgKi8KIGV4dGVybiBpbnQgZXhlY3ZwX25vYWxsb2MoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmaWxlLCBjaGFyICpjb25zdCBhcmd2W10pOwogLyogaGVscGVyLmMgKi8KQEAgLTIxOCwxMCArMjExLDYgQEAKIGV4dGVybiBpbnQgaGVscGVyX3dhaXQoaW50IHBpZCk7CiAKIAotLyogdGxzLmMgKi8KLWV4dGVybiBpbnQgb3Nfc2V0X3RocmVhZF9hcmVhKHVzZXJfZGVzY190ICppbmZvLCBpbnQgcGlkKTsKLWV4dGVybiBpbnQgb3NfZ2V0X3RocmVhZF9hcmVhKHVzZXJfZGVzY190ICppbmZvLCBpbnQgcGlkKTsKLQogLyogdW1pZC5jICovCiBleHRlcm4gaW50IHVtaWRfZmlsZV9uYW1lKGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CiBleHRlcm4gaW50IHNldF91bWlkKGNoYXIgKm5hbWUpOwpAQCAtMjMxLDcgKzIyMCw3IEBACiBleHRlcm4gdm9pZCB0aW1lcl9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgc2V0X3NpZ3N0YWNrKHZvaWQgKnNpZ19zdGFjaywgaW50IHNpemUpOwogZXh0ZXJuIHZvaWQgcmVtb3ZlX3NpZ3N0YWNrKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0X2hhbmRsZXIoaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCksIGludCBmbGFncywgLi4uKTsKK2V4dGVybiB2b2lkIHNldF9oYW5kbGVyKGludCBzaWcpOwogZXh0ZXJuIGludCBjaGFuZ2Vfc2lnKGludCBzaWduYWwsIGludCBvbik7CiBleHRlcm4gdm9pZCBibG9ja19zaWduYWxzKHZvaWQpOwogZXh0ZXJuIHZvaWQgdW5ibG9ja19zaWduYWxzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9wcm9jZXNzLmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3Byb2Nlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4NzNhNS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3Byb2Nlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1BST0NFU1NfSF9fCi0jZGVmaW5lIF9fUFJPQ0VTU19IX18KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBDb3BpZWQgZnJvbSBsaW51eC9jb21waWxlci1nY2MuaCBzaW5jZSB3ZSBjYW4ndCBpbmNsdWRlIGl0IGRpcmVjdGx5ICovCi0jZGVmaW5lIGJhcnJpZXIoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjogOiA6Im1lbW9yeSIpCi0KLWV4dGVybiB2b2lkIHNpZ19oYW5kbGVyKGludCBzaWcsIHN0cnVjdCBzaWdjb250ZXh0ICpzYyk7Ci1leHRlcm4gdm9pZCBhbGFybV9oYW5kbGVyKGludCBzaWcsIHN0cnVjdCBzaWdjb250ZXh0ICpzYyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9wdHJhY2VfdXNlci5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9wdHJhY2VfdXNlci5oCmluZGV4IDdmZDg1MzkuLjU2YjJmMjggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvcHRyYWNlX3VzZXIuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3B0cmFjZV91c2VyLmgKQEAgLTYsNyArNiw4IEBACiAjaWZuZGVmIF9fUFRSQUNFX1VTRVJfSF9fCiAjZGVmaW5lIF9fUFRSQUNFX1VTRVJfSF9fCiAKLSNpbmNsdWRlICJzeXNkZXAvcHRyYWNlX3VzZXIuaCIKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8c3lzZGVwL3B0cmFjZV91c2VyLmg+CiAKIGV4dGVybiBpbnQgcHRyYWNlX2dldHJlZ3MobG9uZyBwaWQsIHVuc2lnbmVkIGxvbmcgKnJlZ3Nfb3V0KTsKIGV4dGVybiBpbnQgcHRyYWNlX3NldHJlZ3MobG9uZyBwaWQsIHVuc2lnbmVkIGxvbmcgKnJlZ3NfaW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9za2FzX3B0cmVncy5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9za2FzX3B0cmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMTllLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvc2thc19wdHJlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX1NLQVNfUFRfUkVHU18KLSNkZWZpbmUgX19TS0FTX1BUX1JFR1NfCi0KLSNpbmNsdWRlIDx1c2VyX2NvbnN0YW50cy5oPgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvc3lzY2FsbC5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9zeXNjYWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTFkZjkuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9zeXNjYWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTQ0FMTF9VU0VSX0gKLSNkZWZpbmUgX19TWVNDQUxMX1VTRVJfSAotCi1leHRlcm4gaW50IHJlY29yZF9zeXNjYWxsX3N0YXJ0KGludCBzeXNjYWxsKTsKLWV4dGVybiB2b2lkIHJlY29yZF9zeXNjYWxsX2VuZChpbnQgaW5kZXgsIGxvbmcgcmVzdWx0KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3Rhc2suaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvdGFzay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmU3MjZiLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvdGFzay5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9fVEFTS19ICi0jZGVmaW5lIF9fVEFTS19ICi0KLSNpbmNsdWRlIDxrZXJuX2NvbnN0YW50cy5oPgotCi0jZGVmaW5lIFRBU0tfUkVHUyh0YXNrKSAoKHN0cnVjdCB1bWxfcHRfcmVncyAqKSAmKCgoY2hhciAqKSAodGFzaykpW0hPU1RfVEFTS19SRUdTXSkpCi0jZGVmaW5lIFRBU0tfUElEKHRhc2spICooKGludCAqKSAmKCgoY2hhciAqKSAodGFzaykpW0hPU1RfVEFTS19QSURdKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3RsYi5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC90bGIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkMjI2NS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3RsYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19UTEJfSF9fCi0jZGVmaW5lIF9fVExCX0hfXwotCi0jaW5jbHVkZSAidW1fbW11LmgiCi0KLWV4dGVybiB2b2lkIGZvcmNlX2ZsdXNoX2FsbCh2b2lkKTsKLWV4dGVybiBpbnQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24odW5zaWduZWQgbG9uZyBzdGFydCwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgZW5kKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VtX21hbGxvYy5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91bV9tYWxsb2MuaAppbmRleCBjNTU0ZDcwLi42Mzk1ZmVmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VtX21hbGxvYy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvdW1fbWFsbG9jLmgKQEAgLTYsNyArNiw3IEBACiAjaWZuZGVmIF9fVU1fTUFMTE9DX0hfXwogI2RlZmluZSBfX1VNX01BTExPQ19IX18KIAotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCisjaW5jbHVkZSA8Z2VuZXJhdGVkL2FzbS1vZmZzZXRzLmg+CiAKIGV4dGVybiB2b2lkICp1bWxfa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKTsKIGV4dGVybiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKnB0cik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VtX21tdS5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91bV9tbXUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhN2U0Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VtX21tdS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fQVJDSF9VTV9NTVVfSAotI2RlZmluZSBfX0FSQ0hfVU1fTU1VX0gKLQotI2luY2x1ZGUgIm1tX2lkLmgiCi0jaW5jbHVkZSAibGR0LmgiCi0KLXR5cGVkZWYgc3RydWN0IG1tX2NvbnRleHQgewotCXN0cnVjdCBtbV9pZCBpZDsKLQlzdHJ1Y3QgdW1sX2xkdCBsZHQ7Ci0Jc3RydWN0IHBhZ2UgKipzdHViX3BhZ2VzOwotfSBtbV9jb250ZXh0X3Q7Ci0KLWV4dGVybiB2b2lkIF9fc3dpdGNoX21tKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCk7Ci0KLS8qIEF2b2lkIHRhbmdsZWQgaW5jbHVzaW9uIHdpdGggYXNtL2xkdC5oICovCi1leHRlcm4gbG9uZyBpbml0X25ld19sZHQoc3RydWN0IG1tX2NvbnRleHQgKnRvX21tLCBzdHJ1Y3QgbW1fY29udGV4dCAqZnJvbV9tbSk7Ci1leHRlcm4gdm9pZCBmcmVlX2xkdChzdHJ1Y3QgbW1fY29udGV4dCAqbW0pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvdW1fdWFjY2Vzcy5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91bV91YWNjZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzA0OTkuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91bV91YWNjZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19BUkNIX1VNX1VBQ0NFU1NfSAotI2RlZmluZSBfX0FSQ0hfVU1fVUFDQ0VTU19ICi0KLSNpbmNsdWRlIDxhc20vZWxmLmg+Ci0jaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgotI2luY2x1ZGUgInN5c2RlcC9hcmNoc2V0am1wLmgiCi0KLSNkZWZpbmUgX191bmRlcl90YXNrX3NpemUoYWRkciwgc2l6ZSkgXAotCSgoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSA8IFRBU0tfU0laRSkgJiYgXAotCSAoKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgKyAoc2l6ZSkpIDwgVEFTS19TSVpFKSkKLQotI2RlZmluZSBfX2FjY2Vzc19va192c3lzY2FsbCh0eXBlLCBhZGRyLCBzaXplKSBcCi0JICgodHlwZSA9PSBWRVJJRllfUkVBRCkgJiYgXAotCSAgKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgPj0gRklYQUREUl9VU0VSX1NUQVJUKSAmJiBcCi0JICAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSA8PSBGSVhBRERSX1VTRVJfRU5EKSAmJiBcCi0JICAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSA+PSAodW5zaWduZWQgbG9uZykoYWRkcikpKQotCi0jZGVmaW5lIF9fYWRkcl9yYW5nZV9ub3dyYXAoYWRkciwgc2l6ZSkgXAotCSgodW5zaWduZWQgbG9uZykgKGFkZHIpIDw9ICgodW5zaWduZWQgbG9uZykgKGFkZHIpICsgKHNpemUpKSkKLQotI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgXAotCShfX2FkZHJfcmFuZ2Vfbm93cmFwKGFkZHIsIHNpemUpICYmIFwKLQkgKF9fdW5kZXJfdGFza19zaXplKGFkZHIsIHNpemUpIHx8IFwKLQkgIF9fYWNjZXNzX29rX3ZzeXNjYWxsKHR5cGUsIGFkZHIsIHNpemUpIHx8IFwKLQkgIHNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpKQotCi1leHRlcm4gaW50IGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgaW50IG4pOwotZXh0ZXJuIGludCBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbik7Ci0KLWV4dGVybiBpbnQgX19kb19jb3B5X3RvX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuLAotCQkJICAgICB2b2lkICoqZmF1bHRfYWRkciwgam1wX2J1ZiAqKmZhdWx0X2NhdGNoZXIpOwotCi0vKgotICogc3RybmNweV9mcm9tX3VzZXI6IC0gQ29weSBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZS4KLSAqIEBkc3Q6ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLiAgVGhpcyBidWZmZXIgbXVzdCBiZSBhdAotICogICAgICAgICBsZWFzdCBAY291bnQgYnl0ZXMgbG9uZy4KLSAqIEBzcmM6ICAgU291cmNlIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCi0gKiBAY291bnQ6IE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHksIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLgotICoKLSAqIENvcGllcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgc3BhY2UuCi0gKgotICogT24gc3VjY2VzcywgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nCi0gKiBOVUwpLgotICoKLSAqIElmIGFjY2VzcyB0byB1c2Vyc3BhY2UgZmFpbHMsIHJldHVybnMgLUVGQVVMVCAoc29tZSBkYXRhIG1heSBoYXZlIGJlZW4KLSAqIGNvcGllZCkuCi0gKgotICogSWYgQGNvdW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGNvcGllcyBAY291bnQgYnl0ZXMKLSAqIGFuZCByZXR1cm5zIEBjb3VudC4KLSAqLwotCi1leHRlcm4gaW50IHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgaW50IGNvdW50KTsKLQotLyoKLSAqIF9fY2xlYXJfdXNlcjogLSBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KLSAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byB6ZXJvLgotICoKLSAqIFplcm8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCi0gKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjbGVhcmVkLgotICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCi0gKi8KLWV4dGVybiBpbnQgX19jbGVhcl91c2VyKHZvaWQgX191c2VyICptZW0sIGludCBsZW4pOwotCi0vKgotICogY2xlYXJfdXNlcjogLSBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UuCi0gKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KLSAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gemVyby4KLSAqCi0gKiBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UuCi0gKgotICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY2xlYXJlZC4KLSAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgotICovCi1leHRlcm4gaW50IGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKm1lbSwgaW50IGxlbik7Ci0KLS8qCi0gKiBzdHJsZW5fdXNlcjogLSBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgaW4gdXNlciBzcGFjZS4KLSAqIEBzdHI6IFRoZSBzdHJpbmcgdG8gbWVhc3VyZS4KLSAqIEBuOiAgIFRoZSBtYXhpbXVtIHZhbGlkIGxlbmd0aAotICoKLSAqIEdldCB0aGUgc2l6ZSBvZiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiB1c2VyIHNwYWNlLgotICoKLSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBJTkNMVURJTkcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KLSAqIE9uIGV4Y2VwdGlvbiwgcmV0dXJucyAwLgotICogSWYgdGhlIHN0cmluZyBpcyB0b28gbG9uZywgcmV0dXJucyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBAbi4KLSAqLwotZXh0ZXJuIGludCBzdHJubGVuX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnN0ciwgaW50IGxlbik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91c2VyLmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VzZXIuaAppbmRleCAyOTNmN2M3Li40ZmE4MmMwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VzZXIuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VzZXIuaApAQCAtNiw3ICs2LDcgQEAKICNpZm5kZWYgX19VU0VSX0hfXwogI2RlZmluZSBfX1VTRVJfSF9fCiAKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgPGdlbmVyYXRlZC9hc20tb2Zmc2V0cy5oPgogCiAvKgogICogVGhlIHVzdWFsIGRlZmluaXRpb24gLSBjb3BpZWQgaGVyZSBiZWNhdXNlIHRoZSBrZXJuZWwgcHJvdmlkZXMgaXRzIG93biwKQEAgLTM2LDEwICszNiwxMSBAQAogfQogI2VuZGlmCiAKLWV4dGVybiB2b2lkIHNjaGVkdWxlKHZvaWQpOwogZXh0ZXJuIGludCBpbl9hdG9uKGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IG9wZW5fZ2RiX2NoYW4odm9pZCk7CiBleHRlcm4gc2l6ZV90IHN0cmxjcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiBleHRlcm4gc2l6ZV90IHN0cmxjYXQoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiAKKy8qIENvcGllZCBmcm9tIGxpbnV4L2NvbXBpbGVyLWdjYy5oIHNpbmNlIHdlIGNhbid0IGluY2x1ZGUgaXQgZGlyZWN0bHkgKi8KKyNkZWZpbmUgYmFycmllcigpIF9fYXNtX18gX192b2xhdGlsZV9fKCIiOiA6IDoibWVtb3J5IikKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvdW0va2VybmVsL01ha2VmaWxlCmluZGV4IGM0NDkxYzEuLmJjNDk0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvdW0va2VybmVsL01ha2VmaWxlCkBAIC0xMSw3ICsxMSw3IEBACiAKIG9iai15ID0gY29uZmlnLm8gZXhlYy5vIGV4aXRjb2RlLm8gaW5pdF90YXNrLm8gaXJxLm8ga3N5bXMubyBtZW0ubyBcCiAJcGh5c21lbS5vIHByb2Nlc3MubyBwdHJhY2UubyByZWJvb3QubyBzaWdpby5vIFwKLQlzaWduYWwubyBzbXAubyBzeXNjYWxsLm8gc3lzcnEubyB0aW1lLm8gdGxiLm8gdHJhcC5vIHVhY2Nlc3MubyBcCisJc2lnbmFsLm8gc21wLm8gc3lzY2FsbC5vIHN5c3JxLm8gdGltZS5vIHRsYi5vIHRyYXAubyBcCiAJdW1fYXJjaC5vIHVtaWQubyBza2FzLwogCiBvYmotJChDT05GSUdfQkxLX0RFVl9JTklUUkQpICs9IGluaXRyZC5vCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9leGVjLmMgYi9hcmNoL3VtL2tlcm5lbC9leGVjLmMKaW5kZXggOTM5YTRhNi4uNmNhZGU5MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvZXhlYy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2V4ZWMuYwpAQCAtMywxNCArMywxNSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlICJsaW51eC9zdGRkZWYuaCIKLSNpbmNsdWRlICJsaW51eC9mcy5oIgotI2luY2x1ZGUgImxpbnV4L3B0cmFjZS5oIgotI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCi0jaW5jbHVkZSAibGludXgvc2xhYi5oIgotI2luY2x1ZGUgImFzbS9jdXJyZW50LmgiCi0jaW5jbHVkZSAiYXNtL3Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgImFzbS91YWNjZXNzLmgiCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgImFzLWxheW91dC5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCiAjaW5jbHVkZSAic2thcy5oIgpAQCAtNDEsNiArNDIsNyBAQAogCVBUX1JFR1NfSVAocmVncykgPSBlaXA7CiAJUFRfUkVHU19TUChyZWdzKSA9IGVzcDsKIH0KK0VYUE9SVF9TWU1CT0woc3RhcnRfdGhyZWFkKTsKIAogc3RhdGljIGxvbmcgZXhlY3ZlMShjb25zdCBjaGFyICpmaWxlLAogCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKmNvbnN0IF9fdXNlciAqYXJndiwKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL2dtb25fc3ltcy5jIGIvYXJjaC91bS9rZXJuZWwvZ21vbl9zeW1zLmMKaW5kZXggNzJlY2NkMi4uZTliY2YyNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2dtb25fc3ltcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2dtb25fc3ltcy5jCkBAIC03LDE4ICs3LDMgQEAKIAogZXh0ZXJuIHZvaWQgX19iYl9pbml0X2Z1bmModm9pZCAqKSAgX19hdHRyaWJ1dGVfXygod2VhaykpOwogRVhQT1JUX1NZTUJPTChfX2JiX2luaXRfZnVuYyk7Ci0KLS8qCi0gKiBUaGlzIGlzIGRlZmluZWQgKGFuZCByZWZlcnJlZCB0byBpbiBwcm9maWxpbmcgc3R1YiBjb2RlKSBvbmx5IGJ5IHNvbWUgR0NDCi0gKiB2ZXJzaW9ucyBpbiBsaWJnY292LgotICoKLSAqIFNpbmNlIFN1U0UgYmFja3BvcnRlZCB0aGUgZml4LCB3ZSBjYW5ub3QgaGFuZGxlIGl0IGRlcGVuZGluZyBvbiBHQ0MgdmVyc2lvbi4KLSAqIFNvLCB1bmNvbmRpdGlvbmFsbHkgZXhwb3J0IGl0LiBCdXQgYWxzbyBnaXZlIGl0IGEgd2VhayBkZWNsYXJhdGlvbiwgd2hpY2gKLSAqIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBhbnkgb3RoZXIgb25lLgotICovCi0KLWV4dGVybiB2b2lkIF9fZ2Nvdl9pbml0KHZvaWQgKikgX19hdHRyaWJ1dGVfXygod2VhaykpOwotRVhQT1JUX1NZTUJPTChfX2djb3ZfaW5pdCk7Ci0KLWV4dGVybiB2b2lkIF9fZ2Nvdl9tZXJnZV9hZGQodm9pZCAqKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci1FWFBPUlRfU1lNQk9MKF9fZ2Nvdl9tZXJnZV9hZGQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaW5pdHJkLmMgYi9hcmNoL3VtL2tlcm5lbC9pbml0cmQuYwppbmRleCBkMzg2Yzc1Li4xMGNjMThmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pbml0cmQuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pbml0cmQuYwpAQCAtNywxMiArNywxMiBAQAogI2luY2x1ZGUgImxpbnV4L2Jvb3RtZW0uaCIKICNpbmNsdWRlICJsaW51eC9pbml0cmQuaCIKICNpbmNsdWRlICJhc20vdHlwZXMuaCIKLSNpbmNsdWRlICJpbml0cmQuaCIKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAib3MuaCIKIAogLyogQ2hhbmdlZCBieSB1bWxfaW5pdHJkX3NldHVwLCB3aGljaCBpcyBhIHNldHVwICovCiBzdGF0aWMgY2hhciAqaW5pdHJkIF9faW5pdGRhdGEgPSBOVUxMOworc3RhdGljIGludCBsb2FkX2luaXRyZChjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHJlYWRfaW5pdHJkKHZvaWQpCiB7CkBAIC02Miw3ICs2Miw3IEBACiAiICAgIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW1hZ2UuXG5cbiIKICk7CiAKLWludCBsb2FkX2luaXRyZChjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgbG9hZF9pbml0cmQoY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCiB7CiAJaW50IGZkLCBuOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9pcnEuYyBiL2FyY2gvdW0va2VybmVsL2lycS5jCmluZGV4IDllNDg1YzcuLjcxYjhjOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvdW0va2VybmVsL2lycS5jCkBAIC0yNTgsNiArMjU4LDcgQEAKIAogCWlnbm9yZV9zaWdpb19mZChmZCk7CiB9CitFWFBPUlRfU1lNQk9MKGRlYWN0aXZhdGVfZmQpOwogCiAvKgogICogQ2FsbGVkIGp1c3QgYmVmb3JlIHNodXRkb3duIGluIG9yZGVyIHRvIHByb3ZpZGUgYSBjbGVhbiBleGVjCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jIGIvYXJjaC91bS9rZXJuZWwva3N5bXMuYwppbmRleCAwYWUwZGZjLi5lMTdiZWEwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2tzeW1zLmMKQEAgLTMsMzMgKzMsMTEgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0jaW5jbHVkZSAibGludXgvbW9kdWxlLmgiCi0jaW5jbHVkZSAibGludXgvc3lzY2FsbHMuaCIKLSNpbmNsdWRlICJhc20vdGxiZmx1c2guaCIKLSNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgotI2luY2x1ZGUgImFzLWxheW91dC5oIgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgotI2luY2x1ZGUgIm1lbV91c2VyLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAib3MuaCIKIAotRVhQT1JUX1NZTUJPTCh1bWxfcGh5c21lbSk7CiBFWFBPUlRfU1lNQk9MKHNldF9zaWduYWxzKTsKIEVYUE9SVF9TWU1CT0woZ2V0X3NpZ25hbHMpOwotRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKLUVYUE9SVF9TWU1CT0woc3lzX3dhaXRwaWQpOwotRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcmFuZ2UpOwotCi1FWFBPUlRfU1lNQk9MKGhpZ2hfcGh5c21lbSk7Ci1FWFBPUlRfU1lNQk9MKGVtcHR5X3plcm9fcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKGhhbmRsZV9wYWdlX2ZhdWx0KTsKLUVYUE9SVF9TWU1CT0woZmluZF9pb21lbSk7Ci0KLUVYUE9SVF9TWU1CT0woc3Rybmxlbl91c2VyKTsKLUVYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOwotRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXIpOwotRVhQT1JUX1NZTUJPTChjb3B5X2Zyb21fdXNlcik7Ci1FWFBPUlRfU1lNQk9MKGNsZWFyX3VzZXIpOwotRVhQT1JUX1NZTUJPTCh1bWxfc3RyZHVwKTsKIAogRVhQT1JUX1NZTUJPTChvc19zdGF0X2ZkKTsKIEVYUE9SVF9TWU1CT0wob3Nfc3RhdF9maWxlKTsKQEAgLTU3LDI0ICszNSwxMCBAQAogRVhQT1JUX1NZTUJPTChvc19hY2NlcHRfY29ubmVjdGlvbik7CiBFWFBPUlRfU1lNQk9MKG9zX3Jjdl9mZCk7CiBFWFBPUlRfU1lNQk9MKHJ1bl9oZWxwZXIpOwotRVhQT1JUX1NZTUJPTChzdGFydF90aHJlYWQpOwogRVhQT1JUX1NZTUJPTChvc19tYWpvcik7CiBFWFBPUlRfU1lNQk9MKG9zX21pbm9yKTsKIEVYUE9SVF9TWU1CT0wob3NfbWFrZWRldik7CiAKIEVYUE9SVF9TWU1CT0woYWRkX3NpZ2lvX2ZkKTsKIEVYUE9SVF9TWU1CT0woaWdub3JlX3NpZ2lvX2ZkKTsKLUVYUE9SVF9TWU1CT0woZGVhY3RpdmF0ZV9mZCk7CiBFWFBPUlRfU1lNQk9MKHNpZ2lvX2Jyb2tlbik7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0KLS8qIHJlcXVpcmVkIGZvciBTTVAgKi8KLQotZXh0ZXJuIHZvaWQgX193cml0ZV9sb2NrX2ZhaWxlZChyd2xvY2tfdCAqcncpOwotRVhQT1JUX1NZTUJPTChfX3dyaXRlX2xvY2tfZmFpbGVkKTsKLQotZXh0ZXJuIHZvaWQgX19yZWFkX2xvY2tfZmFpbGVkKHJ3bG9ja190ICpydyk7Ci1FWFBPUlRfU1lNQk9MKF9fcmVhZF9sb2NrX2ZhaWxlZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvbWVtLmMgYi9hcmNoL3VtL2tlcm5lbC9tZW0uYwppbmRleCA4MTM3Y2NjLi5lYmI4NmIyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9tZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9tZW0uYwpAQCAtNCw2ICs0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtMjAsNiArMjEsNyBAQAogCiAvKiBhbGxvY2F0ZWQgaW4gcGFnaW5nX2luaXQsIHplcm9lZCBpbiBtZW1faW5pdCwgYW5kIHVuY2hhbmdlZCB0aGVyZWFmdGVyICovCiB1bnNpZ25lZCBsb25nICplbXB0eV96ZXJvX3BhZ2UgPSBOVUxMOworRVhQT1JUX1NZTUJPTChlbXB0eV96ZXJvX3BhZ2UpOwogLyogYWxsb2NhdGVkIGluIHBhZ2luZ19pbml0IGFuZCB1bmNoYW5nZWQgdGhlcmVhZnRlciAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgKmVtcHR5X2JhZF9wYWdlID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jIGIvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jCmluZGV4IGExYTkwOTAuLmYxMTZkYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3BoeXNtZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMKQEAgLTMsMjAgKzMsMjIgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0jaW5jbHVkZSAibGludXgvYm9vdG1lbS5oIgotI2luY2x1ZGUgImxpbnV4L21tLmgiCi0jaW5jbHVkZSAibGludXgvcGZuLmgiCi0jaW5jbHVkZSAiYXNtL3BhZ2UuaCIKLSNpbmNsdWRlICJhcy1sYXlvdXQuaCIKLSNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAia2Vybi5oIgotI2luY2x1ZGUgIm1lbV91c2VyLmgiCi0jaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzLWxheW91dC5oPgorI2luY2x1ZGUgPGluaXQuaD4KKyNpbmNsdWRlIDxrZXJuLmg+CisjaW5jbHVkZSA8bWVtX3VzZXIuaD4KKyNpbmNsdWRlIDxvcy5oPgogCiBzdGF0aWMgaW50IHBoeXNtZW1fZmQgPSAtMTsKIAogLyogQ2hhbmdlZCBkdXJpbmcgZWFybHkgYm9vdCAqLwogdW5zaWduZWQgbG9uZyBoaWdoX3BoeXNtZW07CitFWFBPUlRfU1lNQk9MKGhpZ2hfcGh5c21lbSk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgcGh5c21lbV9zaXplOwogCkBAIC0xODQsNiArMTg2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChmaW5kX2lvbWVtKTsKIAogc3RhdGljIGludCBzZXR1cF9pb21lbSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDIxYzFhZTcuLmM1MzM4MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIwLDEyICsyMCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJhcy1sYXlvdXQuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInNrYXMuaCIKLSNpbmNsdWRlICJ0bGIuaCIKIAogLyoKICAqIFRoaXMgaXMgYSBwZXItY3B1IGFycmF5LiAgQSBwcm9jZXNzb3Igb25seSBtb2RpZmllcyBpdHMgZW50cnkgYW5kIGl0IG9ubHkKQEAgLTc4LDYgKzc4LDcgQEAKIAkJICAgICAgJmN1cnJlbnQtPnRocmVhZC5yZWdzLCAwLCBOVUxMLCBOVUxMKTsKIAlyZXR1cm4gcGlkOwogfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9jdXJyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKQEAgLTI4Niw2ICsyODcsNyBAQAogewogCXJldHVybiBrc3RyZHVwKHN0cmluZywgR0ZQX0tFUk5FTCk7CiB9CitFWFBPUlRfU1lNQk9MKHVtbF9zdHJkdXApOwogCiBpbnQgY29weV90b191c2VyX3Byb2Modm9pZCBfX3VzZXIgKnRvLCB2b2lkICpmcm9tLCBpbnQgc2l6ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NpZ25hbC5jIGIvYXJjaC91bS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYjVjMDk0Yy4uZThiODg5ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2lnbmFsLmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSAiZnJhbWVfa2Vybi5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgotI2luY2x1ZGUgPHN5c2RlcC9zaWdjb250ZXh0Lmg+CiAKIEVYUE9SVF9TWU1CT0woYmxvY2tfc2lnbmFscyk7CiBFWFBPUlRfU1lNQk9MKHVuYmxvY2tfc2lnbmFscyk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL2Nsb25lLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL2Nsb25lLmMKaW5kZXggMmM4NTgzYy4uZTFmZDA2NiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9jbG9uZS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvY2xvbmUuYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlICJhcy1sYXlvdXQuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCiAjaW5jbHVkZSAic3R1Yi1kYXRhLmgiCiAjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvdWFjY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy91YWNjZXNzLmMKaW5kZXggNjk2NjM0Mi4uOWZlZmQ5MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy91YWNjZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy91YWNjZXNzLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0xNDksNiArMTUwLDcgQEAKIAkgICAgICAgYnVmZmVyX29wKCh1bnNpZ25lZCBsb25nKSBmcm9tLCBuLCAwLCBjb3B5X2NodW5rX2Zyb21fdXNlciwgJnRvKToKIAkgICAgICAgbjsKIH0KK0VYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXIpOwogCiBzdGF0aWMgaW50IGNvcHlfY2h1bmtfdG9fdXNlcih1bnNpZ25lZCBsb25nIHRvLCBpbnQgbGVuLCB2b2lkICphcmcpCiB7CkBAIC0xNzAsNiArMTcyLDcgQEAKIAkgICAgICAgYnVmZmVyX29wKCh1bnNpZ25lZCBsb25nKSB0bywgbiwgMSwgY29weV9jaHVua190b191c2VyLCAmZnJvbSkgOgogCSAgICAgICBuOwogfQorRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXIpOwogCiBzdGF0aWMgaW50IHN0cm5jcHlfY2h1bmtfZnJvbV91c2VyKHVuc2lnbmVkIGxvbmcgZnJvbSwgaW50IGxlbiwgdm9pZCAqYXJnKQogewpAQCAtMjA0LDYgKzIwNyw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBzdHJubGVuKGRzdCwgY291bnQpOwogfQorRVhQT1JUX1NZTUJPTChzdHJuY3B5X2Zyb21fdXNlcik7CiAKIHN0YXRpYyBpbnQgY2xlYXJfY2h1bmsodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbGVuLCB2b2lkICp1bnVzZWQpCiB7CkBAIC0yMjYsNiArMjMwLDcgQEAKIAlyZXR1cm4gYWNjZXNzX29rKFZFUklGWV9XUklURSwgbWVtLCBsZW4pID8KIAkgICAgICAgYnVmZmVyX29wKCh1bnNpZ25lZCBsb25nKSBtZW0sIGxlbiwgMSwgY2xlYXJfY2h1bmssIE5VTEwpIDogbGVuOwogfQorRVhQT1JUX1NZTUJPTChjbGVhcl91c2VyKTsKIAogc3RhdGljIGludCBzdHJubGVuX2NodW5rKHVuc2lnbmVkIGxvbmcgc3RyLCBpbnQgbGVuLCB2b2lkICphcmcpCiB7CkBAIC0yNTEsMyArMjU2LDQgQEAKIAkJcmV0dXJuIGNvdW50ICsgMTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KK0VYUE9SVF9TWU1CT0woc3Rybmxlbl91c2VyKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RsYi5jIGIvYXJjaC91bS9rZXJuZWwvdGxiLmMKaW5kZXggZDE3NWQwNS4uN2YzZDRkODYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RsYi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3RsYi5jCkBAIC00LDYgKzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KQEAgLTExLDcgKzEyLDYgQEAKICNpbmNsdWRlICJtZW1fdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAic2thcy5oIgotI2luY2x1ZGUgInRsYi5oIgogCiBzdHJ1Y3QgaG9zdF92bV9jaGFuZ2UgewogCXN0cnVjdCBob3N0X3ZtX29wIHsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCX0KIH0KIAotaW50IGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQorc3RhdGljIGludCBmbHVzaF90bGJfa2VybmVsX3JhbmdlX2NvbW1vbih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAlwZ2RfdCAqcGdkOwpAQCAtNDk5LDYgKzQ5OSw3IEBACiAJCWZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHN0YXJ0LCBlbmQpOwogCWVsc2UgZml4X3JhbmdlKHZtYS0+dm1fbW0sIHN0YXJ0LCBlbmQsIDApOwogfQorRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcmFuZ2UpOwogCiB2b2lkIGZsdXNoX3RsYl9tbV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJCXVuc2lnbmVkIGxvbmcgZW5kKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHJhcC5jIGIvYXJjaC91bS9rZXJuZWwvdHJhcC5jCmluZGV4IDhjN2I4ODIuLmRhZmM5NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RyYXAuYworKysgYi9hcmNoL3VtL2tlcm5lbC90cmFwLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CkBAIC0xNCw3ICsxNSw2IEBACiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJza2FzLmgiCi0jaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKIAogLyoKICAqIE5vdGUgdGhpcyBpcyBjb25zdHJhaW5lZCB0byByZXR1cm4gMCwgLUVGQVVMVCwgLUVBQ0NFU1MsIC1FTk9NRU0gYnkKQEAgLTExMiw2ICsxMTIsNyBAQAogCXBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KCk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGhhbmRsZV9wYWdlX2ZhdWx0KTsKIAogc3RhdGljIHZvaWQgc2hvd19zZWd2X2luZm8oc3RydWN0IHVtbF9wdF9yZWdzICpyZWdzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdWFjY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvdWFjY2Vzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDMzZjA0Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3VhY2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXMgRW1lcnNvbiAoY2VtZXJzb25AY2hpYXJrLmdyZWVuZW5kLm9yZy51aykKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLS8qCi0gKiBUaGVzZSBhcmUgaGVyZSByYXRoZXIgdGhhbiB0dC91YWNjZXNzLmMgYmVjYXVzZSBza2FzIG1vZGUgbmVlZHMgdGhlbSBpbgotICogb3JkZXIgdG8gZG8gU0lHQlVTIHJlY292ZXJ5IHdoZW4gYSB0bXBmcyBtb3VudCBydW5zIG91dCBvZiByb29tLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlICJvcy5oIgotCi1zdGF0aWMgdm9pZCBfX2RvX2NvcHkodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuKQotewotCW1lbWNweSh0bywgZnJvbSwgbik7Ci19Ci0KLQotaW50IF9fZG9fY29weV90b191c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbiwKLQkJICAgICAgdm9pZCAqKmZhdWx0X2FkZHIsIGptcF9idWYgKipmYXVsdF9jYXRjaGVyKQotewotCXVuc2lnbmVkIGxvbmcgZmF1bHQ7Ci0JaW50IGZhdWx0ZWQ7Ci0KLQlmYXVsdCA9IF9fZG9fdXNlcl9jb3B5KHRvLCBmcm9tLCBuLCBmYXVsdF9hZGRyLCBmYXVsdF9jYXRjaGVyLAotCQkJICAgICAgIF9fZG9fY29weSwgJmZhdWx0ZWQpOwotCWlmICghZmF1bHRlZCkKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gbiAtIChmYXVsdCAtICh1bnNpZ25lZCBsb25nKSB0byk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMgYi9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMKaW5kZXggOGQ4NDI1MC4uYmEwMGVhZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdW1fYXJjaC5jCisrKyBiL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYwpAQCAtMTAyLDYgKzEwMiw4IEBACiAKIC8qIFNldCBpbiBsaW51eF9tYWluICovCiB1bnNpZ25lZCBsb25nIHVtbF9waHlzbWVtOworRVhQT1JUX1NZTUJPTCh1bWxfcGh5c21lbSk7CisKIHVuc2lnbmVkIGxvbmcgdW1sX3Jlc2VydmVkOyAvKiBBbHNvIG1vZGlmaWVkIGluIG1lbV9pbml0ICovCiB1bnNpZ25lZCBsb25nIHN0YXJ0X3ZtOwogdW5zaWduZWQgbG9uZyBlbmRfdm07CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlIGIvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQppbmRleCBiMzNmNGRmLi5kZDc2NDEwIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlCisrKyBiL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKQEAgLTQsMTQgKzQsMTQgQEAKICMKIAogb2JqLXkgPSBhaW8ubyBleGVjdnAubyBmaWxlLm8gaGVscGVyLm8gaXJxLm8gbWFpbi5vIG1lbS5vIHByb2Nlc3MubyBcCi0JcmVnaXN0ZXJzLm8gc2lnaW8ubyBzaWduYWwubyBzdGFydF91cC5vIHRpbWUubyB0dHkubyB1YWNjZXNzLm8gXAotCXVtaWQubyB0bHMubyB1c2VyX3N5bXMubyB1dGlsLm8gZHJpdmVycy8gc3lzLSQoU1VCQVJDSCkvIHNrYXMvCisJcmVnaXN0ZXJzLm8gc2lnaW8ubyBzaWduYWwubyBzdGFydF91cC5vIHRpbWUubyB0dHkubyBcCisJdW1pZC5vIHVzZXJfc3ltcy5vIHV0aWwubyBkcml2ZXJzLyBza2FzLwogCiBvYmotJChDT05GSUdfQVJDSF9SRVVTRV9IT1NUX1ZTWVNDQUxMX0FSRUEpICs9IGVsZl9hdXgubwogCiBVU0VSX09CSlMgOj0gJCh1c2VyLW9ianMteSkgYWlvLm8gZWxmX2F1eC5vIGV4ZWN2cC5vIGZpbGUubyBoZWxwZXIubyBpcnEubyBcCiAJbWFpbi5vIG1lbS5vIHByb2Nlc3MubyByZWdpc3RlcnMubyBzaWdpby5vIHNpZ25hbC5vIHN0YXJ0X3VwLm8gdGltZS5vIFwKLQl0dHkubyB0bHMubyB1YWNjZXNzLm8gdW1pZC5vIHV0aWwubworCXR0eS5vIHVtaWQubyB1dGlsLm8KIAogQ0ZMQUdTX3VzZXJfc3ltcy5vICs9IC1EU1VCQVJDSF8kKFNVQkFSQ0gpCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvYWlvLmMgYi9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCmluZGV4IDU3ZTNkNDYuLmM1ZDAzOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvYWlvLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9haW8uYwpAQCAtMTEsMTAgKzExLDggQEAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSAiYWlvLmgiCiAjaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIHN0cnVjdCBhaW9fdGhyZWFkX3JlcSB7CiAJZW51bSBhaW9fdHlwZSB0eXBlOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKaW5kZXggY2M3MmNiMi4uZGIzZDY0OCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCkBAIC0xMywxMSArMTMsOSBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgImV0YXAuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAibmV0X3VzZXIuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKICNkZWZpbmUgTUFYX1BBQ0tFVCBFVEhfTUFYX1BBQ0tFVAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jCmluZGV4IDI0NDhiZTAuLmEyYWFjZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jCkBAIC0xMywxMSArMTMsOSBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidHVudGFwLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBzdGF0aWMgaW50IHR1bnRhcF91c2VyX2luaXQodm9pZCAqZGF0YSwgdm9pZCAqZGV2KQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9lbGZfYXV4LmMgYi9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYwppbmRleCA5NTMzMjM3Li5kODk1MjcxIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJlbGZfdXNlci5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCi0jaW5jbHVkZSA8a2Vybl9jb25zdGFudHMuaD4KIAogdHlwZWRlZiBFbGYzMl9hdXh2X3QgZWxmX2F1eHZfdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9maWxlLmMgYi9hcmNoL3VtL29zLUxpbnV4L2ZpbGUuYwppbmRleCAxNDBlNTg3Li5iMDQ5YTYzIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2ZpbGUuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2ZpbGUuYwpAQCAtMTMsOSArMTMsNyBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy91bi5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIHN0YXRpYyB2b2lkIGNvcHlfc3RhdChzdHJ1Y3QgdW1sX3N0YXQgKmRzdCwgY29uc3Qgc3RydWN0IHN0YXQ2NCAqc3JjKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKaW5kZXggZmVmZjIyZC4uY2YyNmM0YSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCkBAIC0xMCwxMSArMTAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIHN0cnVjdCBoZWxwZXJfZGF0YSB7CiAJdm9pZCAoKnByZV9leGVjKSh2b2lkKik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2ludGVybmFsLmggYi9hcmNoL3VtL29zLUxpbnV4L2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzYzNlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vb3MtTGludXgvaW50ZXJuYWwuaApAQCAtMCwwICsxIEBACit2b2lkIGFsYXJtX2hhbmRsZXIoaW50LCBtY29udGV4dF90ICopOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9pcnEuYyBiL2FyY2gvdW0vb3MtTGludXgvaXJxLmMKaW5kZXggMDM0OGI5Ny4uOWE0OTkwOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9pcnEuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2lycS5jCkBAIC05LDExICs5LDggQEAKICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJpcnFfdXNlci5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiAvKgogICogTG9ja2VkIGJ5IGlycV9sb2NrIGluIGFyY2gvdW0va2VybmVsL2lycS5jLiAgQ2hhbmdlZCBieSBvc19jcmVhdGVfcG9sbGZkCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L21haW4uYyBiL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCmluZGV4IDg0NzFiODEuLjdhODZkZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAjaW5jbHVkZSAiYXMtbGF5b3V0LmgiCiAjaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvbWVtLmMgYi9hcmNoL3VtL29zLUxpbnV4L21lbS5jCmluZGV4IDYyODc4Y2YuLjhlNDIxZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvbWVtLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9tZW0uYwpAQCAtMTQsOSArMTQsNyBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAjaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIC8qIE1vZGlmaWVkIGJ5IHdoaWNoX3RtcGRpciwgd2hpY2ggaXMgY2FsbGVkIGR1cmluZyBlYXJseSBib290ICovCiBzdGF0aWMgY2hhciAqZGVmYXVsdF90bXBkaXIgPSAiL3RtcCI7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYyBiL2FyY2gvdW0vb3MtTGludXgvcHJvY2Vzcy5jCmluZGV4IDBjNDVkYzguLjMwN2YxNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvcHJvY2Vzcy5jCkBAIC0xMywxMiArMTMsOSBAQAogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgImluaXQuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgImxvbmdqbXAuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogI2RlZmluZSBBUkJJVFJBUllfQUREUiAtMQogI2RlZmluZSBGQUlMVVJFX1BJRCAgICAtMQpAQCAtMjM3LDIxICsyMzQsMTMgQEAKIAogdm9pZCBpbml0X25ld190aHJlYWRfc2lnbmFscyh2b2lkKQogewotCXNldF9oYW5kbGVyKFNJR1NFR1YsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIFNBX09OU1RBQ0ssCi0JCSAgICBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsIFNJR1ZUQUxSTSwgLTEpOwotCXNldF9oYW5kbGVyKFNJR1RSQVAsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIFNBX09OU1RBQ0ssCi0JCSAgICBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsIFNJR1ZUQUxSTSwgLTEpOwotCXNldF9oYW5kbGVyKFNJR0ZQRSwgKF9fc2lnaGFuZGxlcl90KSBzaWdfaGFuZGxlciwgU0FfT05TVEFDSywKLQkJICAgIFNJR1VTUjEsIFNJR0lPLCBTSUdXSU5DSCwgU0lHVlRBTFJNLCAtMSk7Ci0Jc2V0X2hhbmRsZXIoU0lHSUxMLCAoX19zaWdoYW5kbGVyX3QpIHNpZ19oYW5kbGVyLCBTQV9PTlNUQUNLLAotCQkgICAgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdWVEFMUk0sIC0xKTsKLQlzZXRfaGFuZGxlcihTSUdCVVMsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIFNBX09OU1RBQ0ssCi0JCSAgICBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsIFNJR1ZUQUxSTSwgLTEpOworCXNldF9oYW5kbGVyKFNJR1NFR1YpOworCXNldF9oYW5kbGVyKFNJR1RSQVApOworCXNldF9oYW5kbGVyKFNJR0ZQRSk7CisJc2V0X2hhbmRsZXIoU0lHSUxMKTsKKwlzZXRfaGFuZGxlcihTSUdCVVMpOwogCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotCi0Jc2V0X2hhbmRsZXIoU0lHSU8sIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsCi0JCSAgICBTQV9PTlNUQUNLIHwgU0FfUkVTVEFSVCwgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdBTFJNLAotCQkgICAgU0lHVlRBTFJNLCAtMSk7CisJc2V0X2hhbmRsZXIoU0lHSU8pOwogCXNpZ25hbChTSUdXSU5DSCwgU0lHX0lHTik7CiAJc2lnbmFsKFNJR1RFUk0sIFNJR19ERkwpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCmluZGV4IDYzZDI5OWQuLjNjMTYxMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKQEAgLTExLDE0ICsxMSwxMSBAQAogI2luY2x1ZGUgPHNjaGVkLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAic2lnaW8uaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIC8qCiAgKiBQcm90ZWN0ZWQgYnkgc2lnaW9fbG9jaygpLCBhbHNvIHVzZWQgYnkgc2lnaW9fY2xlYW51cCwgd2hpY2ggaXMgYW4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jCmluZGV4IDZhZTE4MDcuLjJkMjJmMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zaWduYWwuYwpAQCAtMTIsMTMgKzEyLDcgQEAKICNpbmNsdWRlICJhcy1sYXlvdXQuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKLSNpbmNsdWRlICJzeXNkZXAvYmFycmllci5oIgotI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCi0jaW5jbHVkZSAidXNlci5oIgotCi0vKiBDb3BpZWQgZnJvbSBsaW51eC9jb21waWxlci1nY2MuaCBzaW5jZSB3ZSBjYW4ndCBpbmNsdWRlIGl0IGRpcmVjdGx5ICovCi0jZGVmaW5lIGJhcnJpZXIoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjogOiA6Im1lbW9yeSIpCisjaW5jbHVkZSAic3lzZGVwL21jb250ZXh0LmgiCiAKIHZvaWQgKCpzaWdfaW5mb1tOU0lHXSkoaW50LCBzdHJ1Y3QgdW1sX3B0X3JlZ3MgKikgPSB7CiAJW1NJR1RSQVBdCT0gcmVsYXlfc2lnbmFsLApAQCAtMzAsNyArMjQsNyBAQAogCVtTSUdJT10JCT0gc2lnaW9faGFuZGxlciwKIAlbU0lHVlRBTFJNXQk9IHRpbWVyX2hhbmRsZXIgfTsKIAotc3RhdGljIHZvaWQgc2lnX2hhbmRsZXJfY29tbW9uKGludCBzaWcsIHN0cnVjdCBzaWdjb250ZXh0ICpzYykKK3N0YXRpYyB2b2lkIHNpZ19oYW5kbGVyX2NvbW1vbihpbnQgc2lnLCBtY29udGV4dF90ICptYykKIHsKIAlzdHJ1Y3QgdW1sX3B0X3JlZ3MgcjsKIAlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwpAQCAtMzgsOCArMzIsOCBAQAogCXIuaXNfdXNlciA9IDA7CiAJaWYgKHNpZyA9PSBTSUdTRUdWKSB7CiAJCS8qIEZvciBzZWdmYXVsdHMsIHdlIHdhbnQgdGhlIGRhdGEgZnJvbSB0aGUgc2lnY29udGV4dC4gKi8KLQkJY29weV9zYygmciwgc2MpOwotCQlHRVRfRkFVTFRJTkZPX0ZST01fU0Moci5mYXVsdGluZm8sIHNjKTsKKwkJZ2V0X3JlZ3NfZnJvbV9tYygmciwgbWMpOworCQlHRVRfRkFVTFRJTkZPX0ZST01fTUMoci5mYXVsdGluZm8sIG1jKTsKIAl9CiAKIAkvKiBlbmFibGUgc2lnbmFscyBpZiBzaWcgaXNuJ3QgSVJRIHNpZ25hbCAqLwpAQCAtNjYsNyArNjAsNyBAQAogc3RhdGljIGludCBzaWduYWxzX2VuYWJsZWQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IHNpZ25hbHNfcGVuZGluZzsKIAotdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpCit2b2lkIHNpZ19oYW5kbGVyKGludCBzaWcsIG1jb250ZXh0X3QgKm1jKQogewogCWludCBlbmFibGVkOwogCkBAIC03OCwyMyArNzIsMjMgQEAKIAogCWJsb2NrX3NpZ25hbHMoKTsKIAotCXNpZ19oYW5kbGVyX2NvbW1vbihzaWcsIHNjKTsKKwlzaWdfaGFuZGxlcl9jb21tb24oc2lnLCBtYyk7CiAKIAlzZXRfc2lnbmFscyhlbmFibGVkKTsKIH0KIAotc3RhdGljIHZvaWQgcmVhbF9hbGFybV9oYW5kbGVyKHN0cnVjdCBzaWdjb250ZXh0ICpzYykKK3N0YXRpYyB2b2lkIHJlYWxfYWxhcm1faGFuZGxlcihtY29udGV4dF90ICptYykKIHsKIAlzdHJ1Y3QgdW1sX3B0X3JlZ3MgcmVnczsKIAotCWlmIChzYyAhPSBOVUxMKQotCQljb3B5X3NjKCZyZWdzLCBzYyk7CisJaWYgKG1jICE9IE5VTEwpCisJCWdldF9yZWdzX2Zyb21fbWMoJnJlZ3MsIG1jKTsKIAlyZWdzLmlzX3VzZXIgPSAwOwogCXVuYmxvY2tfc2lnbmFscygpOwogCXRpbWVyX2hhbmRsZXIoU0lHVlRBTFJNLCAmcmVncyk7CiB9CiAKLXZvaWQgYWxhcm1faGFuZGxlcihpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpCit2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZywgbWNvbnRleHRfdCAqbWMpCiB7CiAJaW50IGVuYWJsZWQ7CiAKQEAgLTEwNiwxNCArMTAwLDEzIEBACiAKIAlibG9ja19zaWduYWxzKCk7CiAKLQlyZWFsX2FsYXJtX2hhbmRsZXIoc2MpOworCXJlYWxfYWxhcm1faGFuZGxlcihtYyk7CiAJc2V0X3NpZ25hbHMoZW5hYmxlZCk7CiB9CiAKIHZvaWQgdGltZXJfaW5pdCh2b2lkKQogewotCXNldF9oYW5kbGVyKFNJR1ZUQUxSTSwgKF9fc2lnaGFuZGxlcl90KSBhbGFybV9oYW5kbGVyLAotCQkgICAgU0FfT05TVEFDSyB8IFNBX1JFU1RBUlQsIFNJR1VTUjEsIFNJR0lPLCBTSUdXSU5DSCwgLTEpOworCXNldF9oYW5kbGVyKFNJR1ZUQUxSTSk7CiB9CiAKIHZvaWQgc2V0X3NpZ3N0YWNrKHZvaWQgKnNpZ19zdGFjaywgaW50IHNpemUpCkBAIC0xMjYsMTAgKzExOSwyMyBAQAogCQlwYW5pYygiZW5hYmxpbmcgc2lnbmFsIHN0YWNrIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgZXJybm8pOwogfQogCi1zdGF0aWMgdm9pZCAoKmhhbmRsZXJzW19OU0lHXSkoaW50IHNpZywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKTsKK3N0YXRpYyB2b2lkICgqaGFuZGxlcnNbX05TSUddKShpbnQgc2lnLCBtY29udGV4dF90ICptYykgPSB7CisJW1NJR1NFR1ZdID0gc2lnX2hhbmRsZXIsCisJW1NJR0JVU10gPSBzaWdfaGFuZGxlciwKKwlbU0lHSUxMXSA9IHNpZ19oYW5kbGVyLAorCVtTSUdGUEVdID0gc2lnX2hhbmRsZXIsCisJW1NJR1RSQVBdID0gc2lnX2hhbmRsZXIsCiAKLXZvaWQgaGFuZGxlX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpCisJW1NJR0lPXSA9IHNpZ19oYW5kbGVyLAorCVtTSUdXSU5DSF0gPSBzaWdfaGFuZGxlciwKKwlbU0lHVlRBTFJNXSA9IGFsYXJtX2hhbmRsZXIKK307CisKKworc3RhdGljIHZvaWQgaGFyZF9oYW5kbGVyKGludCBzaWcsIHNpZ2luZm9fdCAqaW5mbywgdm9pZCAqcCkKIHsKKwlzdHJ1Y3QgdWNvbnRleHQgKnVjID0gcDsKKwltY29udGV4dF90ICptYyA9ICZ1Yy0+dWNfbWNvbnRleHQ7CiAJdW5zaWduZWQgbG9uZyBwZW5kaW5nID0gMVVMIDw8IHNpZzsKIAogCWRvIHsKQEAgLTE1NSw3ICsxNjEsNyBAQAogCQl3aGlsZSAoKHNpZyA9IGZmcyhwZW5kaW5nKSkgIT0gMCl7CiAJCQlzaWctLTsKIAkJCXBlbmRpbmcgJj0gfigxIDw8IHNpZyk7Ci0JCQkoKmhhbmRsZXJzW3NpZ10pKHNpZywgc2MpOworCQkJKCpoYW5kbGVyc1tzaWddKShzaWcsIG1jKTsKIAkJfQogCiAJCS8qCkBAIC0xNjksMjggKzE3NSwyNiBAQAogCX0gd2hpbGUgKHBlbmRpbmcpOwogfQogCi1leHRlcm4gdm9pZCBoYXJkX2hhbmRsZXIoaW50IHNpZyk7Ci0KLXZvaWQgc2V0X2hhbmRsZXIoaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCksIGludCBmbGFncywgLi4uKQordm9pZCBzZXRfaGFuZGxlcihpbnQgc2lnKQogewogCXN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOwotCXZhX2xpc3QgYXA7CisJaW50IGZsYWdzID0gU0FfU0lHSU5GTyB8IFNBX09OU1RBQ0s7CiAJc2lnc2V0X3Qgc2lnX21hc2s7Ci0JaW50IG1hc2s7CiAKLQloYW5kbGVyc1tzaWddID0gKHZvaWQgKCopKGludCwgc3RydWN0IHNpZ2NvbnRleHQgKikpIGhhbmRsZXI7Ci0JYWN0aW9uLnNhX2hhbmRsZXIgPSBoYXJkX2hhbmRsZXI7CisJYWN0aW9uLnNhX3NpZ2FjdGlvbiA9IGhhcmRfaGFuZGxlcjsKIAorCS8qIGJsb2NrIGlycSBvbmVzICovCiAJc2lnZW1wdHlzZXQoJmFjdGlvbi5zYV9tYXNrKTsKLQotCXZhX3N0YXJ0KGFwLCBmbGFncyk7Ci0Jd2hpbGUgKChtYXNrID0gdmFfYXJnKGFwLCBpbnQpKSAhPSAtMSkKLQkJc2lnYWRkc2V0KCZhY3Rpb24uc2FfbWFzaywgbWFzayk7Ci0JdmFfZW5kKGFwKTsKKwlzaWdhZGRzZXQoJmFjdGlvbi5zYV9tYXNrLCBTSUdWVEFMUk0pOworCXNpZ2FkZHNldCgmYWN0aW9uLnNhX21hc2ssIFNJR0lPKTsKKwlzaWdhZGRzZXQoJmFjdGlvbi5zYV9tYXNrLCBTSUdXSU5DSCk7CiAKIAlpZiAoc2lnID09IFNJR1NFR1YpCiAJCWZsYWdzIHw9IFNBX05PREVGRVI7CiAKKwlpZiAoc2lnaXNtZW1iZXIoJmFjdGlvbi5zYV9tYXNrLCBzaWcpKQorCQlmbGFncyB8PSBTQV9SRVNUQVJUOyAvKiBpZiBpdCdzIGFuIGlycSBzaWduYWwgKi8KKwogCWFjdGlvbi5zYV9mbGFncyA9IGZsYWdzOwogCWFjdGlvbi5zYV9yZXN0b3JlciA9IE5VTEw7CiAJaWYgKHNpZ2FjdGlvbihzaWcsICZhY3Rpb24sIE5VTEwpIDwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9tZW0uYyBiL2FyY2gvdW0vb3MtTGludXgvc2thcy9tZW0uYwppbmRleCBlNzcxMzk4Li5jMGFmZmY3IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NrYXMvbWVtLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL21lbS5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiYXMtbGF5b3V0LmgiCiAjaW5jbHVkZSAibW1faWQuaCIKICNpbmNsdWRlICJvcy5oIgpAQCAtMTcsNyArMTYsNiBAQAogI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCiAjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCiAjaW5jbHVkZSAic2thcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCiAjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKaW5kZXggZGVlMGU4Yy4uY2Q2NTcyNyAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCkBAIC05LDMxICs5LDIzIEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlICJhcy1sYXlvdXQuaCIKLSNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJtZW0uaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJwcm9jX21tLmgiCiAjaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKICNpbmNsdWRlICJza2FzLmgiCiAjaW5jbHVkZSAic2thc19wdHJhY2UuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKIAogaW50IGlzX3NrYXNfd2luY2goaW50IHBpZCwgaW50IGZkLCB2b2lkICpkYXRhKQogewotCWlmIChwaWQgIT0gZ2V0cGdycCgpKQotCQlyZXR1cm4gMDsKLQotCXJlZ2lzdGVyX3dpbmNoX2lycSgtMSwgZmQsIC0xLCBkYXRhLCAwKTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gcGlkID09IGdldHBncnAoKTsKIH0KIAogc3RhdGljIGludCBwdHJhY2VfZHVtcF9yZWdzKGludCBwaWQpCkBAIC0xNjksNyArMTYxLDcgQEAKIAogCWlmICghbG9jYWxfdXNpbmdfc3lzZW11KQogCXsKLQkJZXJyID0gcHRyYWNlKFBUUkFDRV9QT0tFVVNSLCBwaWQsIFBUX1NZU0NBTExfTlJfT0ZGU0VULAorCQllcnIgPSBwdHJhY2UoUFRSQUNFX1BPS0VVU0VSLCBwaWQsIFBUX1NZU0NBTExfTlJfT0ZGU0VULAogCQkJICAgICBfX05SX2dldHBpZCk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlwcmludGsoVU1fS0VSTl9FUlIgImhhbmRsZV90cmFwIC0gbnVsbGlmeWluZyBzeXNjYWxsICIKQEAgLTI1Nyw4ICsyNDksOCBAQAogCiAJCXNldF9zaWdzdGFjaygodm9pZCAqKSBTVFVCX0RBVEEsIFVNX0tFUk5fUEFHRV9TSVpFKTsKIAkJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOwotCQlzYS5zYV9mbGFncyA9IFNBX09OU1RBQ0sgfCBTQV9OT0RFRkVSOwotCQlzYS5zYV9oYW5kbGVyID0gKHZvaWQgKikgdjsKKwkJc2Euc2FfZmxhZ3MgPSBTQV9PTlNUQUNLIHwgU0FfTk9ERUZFUiB8IFNBX1NJR0lORk87CisJCXNhLnNhX3NpZ2FjdGlvbiA9ICh2b2lkICopIHY7CiAJCXNhLnNhX3Jlc3RvcmVyID0gTlVMTDsKIAkJaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIE5VTEwpIDwgMCkgewogCQkJcHJpbnRrKFVNX0tFUk5fRVJSICJ1c2Vyc3BhY2VfdHJhbXAgLSBzZXR0aW5nIFNJR1NFR1YgIgpAQCAtNjYxLDggKzY1Myw3IEBACiB7CiAJaW50IG47CiAKLQlzZXRfaGFuZGxlcihTSUdXSU5DSCwgKF9fc2lnaGFuZGxlcl90KSBzaWdfaGFuZGxlciwKLQkJICAgIFNBX09OU1RBQ0sgfCBTQV9SRVNUQVJULCBTSUdVU1IxLCBTSUdJTywgU0lHVlRBTFJNLCAtMSk7CisJc2V0X2hhbmRsZXIoU0lHV0lOQ0gpOwogCiAJLyoKIAkgKiBDYW4ndCB1c2UgVU1MX1NFVEpNUCBvciBVTUxfTE9OR0pNUCBoZXJlIGJlY2F1c2UgdGhleSBzYXZlCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N0YXJ0X3VwLmMgYi9hcmNoL3VtL29zLUxpbnV4L3N0YXJ0X3VwLmMKaW5kZXggMDJlZTlhZC4uNDI1MTYyZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zdGFydF91cC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3RhcnRfdXAuYwpAQCAtMTMsMTIgKzEzLDEwIEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCiAjaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKQEAgLTIyNSw3ICsyMjMsNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JbiA9IHB0cmFjZShQVFJBQ0VfUE9LRVVTUiwgcGlkLCBQVF9TWVNDQUxMX1JFVF9PRkZTRVQsIG9zX2dldHBpZCgpKTsKKwluID0gcHRyYWNlKFBUUkFDRV9QT0tFVVNFUiwgcGlkLCBQVF9TWVNDQUxMX1JFVF9PRkZTRVQsIG9zX2dldHBpZCgpKTsKIAlpZiAobiA8IDApIHsKIAkJbm9uX2ZhdGFsKCJjaGVja19zeXNlbXUgOiBmYWlsZWQgdG8gbW9kaWZ5IHN5c3RlbSBjYWxsICIKIAkJCSAgInJldHVybiIpOwpAQCAtMjYxLDcgKzI1OSw3IEBACiAJCQkJCSAgImRvZXNuJ3Qgc2luZ2xlc3RlcCIpOwogCQkJCWdvdG8gZmFpbDsKIAkJCX0KLQkJCW4gPSBwdHJhY2UoUFRSQUNFX1BPS0VVU1IsIHBpZCwgUFRfU1lTQ0FMTF9SRVRfT0ZGU0VULAorCQkJbiA9IHB0cmFjZShQVFJBQ0VfUE9LRVVTRVIsIHBpZCwgUFRfU1lTQ0FMTF9SRVRfT0ZGU0VULAogCQkJCSAgIG9zX2dldHBpZCgpKTsKIAkJCWlmIChuIDwgMCkKIAkJCQlmYXRhbF9wZXJyb3IoImNoZWNrX3N5c2VtdSA6IGZhaWxlZCB0byBtb2RpZnkgIgpAQCAtMzE3LDEwICszMTUsMTAgQEAKIAkJCWZhdGFsKCJjaGVja19wdHJhY2UgOiBleHBlY3RlZCAoU0lHVFJBUHwweDgwKSwgIgogCQkJICAgICAgICJnb3Qgc3RhdHVzID0gJWQiLCBzdGF0dXMpOwogCi0JCXN5c2NhbGwgPSBwdHJhY2UoUFRSQUNFX1BFRUtVU1IsIHBpZCwgUFRfU1lTQ0FMTF9OUl9PRkZTRVQsCisJCXN5c2NhbGwgPSBwdHJhY2UoUFRSQUNFX1BFRUtVU0VSLCBwaWQsIFBUX1NZU0NBTExfTlJfT0ZGU0VULAogCQkJCSAwKTsKIAkJaWYgKHN5c2NhbGwgPT0gX19OUl9nZXRwaWQpIHsKLQkJCW4gPSBwdHJhY2UoUFRSQUNFX1BPS0VVU1IsIHBpZCwgUFRfU1lTQ0FMTF9OUl9PRkZTRVQsCisJCQluID0gcHRyYWNlKFBUUkFDRV9QT0tFVVNFUiwgcGlkLCBQVF9TWVNDQUxMX05SX09GRlNFVCwKIAkJCQkgICBfX05SX2dldHBwaWQpOwogCQkJaWYgKG4gPCAwKQogCQkJCWZhdGFsX3BlcnJvcigiY2hlY2tfcHRyYWNlIDogZmFpbGVkIHRvIG1vZGlmeSAiCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L01ha2VmaWxlIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiYzZhYy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotIwotCi1vYmoteSA9IHJlZ2lzdGVycy5vIHNpZ25hbC5vIHRhc2tfc2l6ZS5vIHRscy5vCi0KLVVTRVJfT0JKUyA6PSAkKG9iai15KQotCi1pbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvcmVnaXN0ZXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWY3YTUuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUGF0aFNjYWxlLCBJbmMKLSAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibG9uZ2ptcC5oIgotI2luY2x1ZGUgInVzZXIuaCIKLSNpbmNsdWRlICJzeXNkZXAvcHRyYWNlX3VzZXIuaCIKLQotaW50IHNhdmVfZnBfcmVnaXN0ZXJzKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgKmZwX3JlZ3MpCi17Ci0JaWYgKHB0cmFjZShQVFJBQ0VfR0VURlBSRUdTLCBwaWQsIDAsIGZwX3JlZ3MpIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHJlc3RvcmVfZnBfcmVnaXN0ZXJzKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgKmZwX3JlZ3MpCi17Ci0JaWYgKHB0cmFjZShQVFJBQ0VfU0VURlBSRUdTLCBwaWQsIDAsIGZwX3JlZ3MpIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHNhdmVfZnB4X3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpmcF9yZWdzKQotewotCWlmIChwdHJhY2UoUFRSQUNFX0dFVEZQWFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCXJldHVybiAwOwotfQotCi1pbnQgcmVzdG9yZV9mcHhfcmVnaXN0ZXJzKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgKmZwX3JlZ3MpCi17Ci0JaWYgKHB0cmFjZShQVFJBQ0VfU0VURlBYUkVHUywgcGlkLCAwLCBmcF9yZWdzKSA8IDApCi0JCXJldHVybiAtZXJybm87Ci0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X3RocmVhZF9yZWcoaW50IHJlZywgam1wX2J1ZiAqYnVmKQotewotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSBFSVA6Ci0JCXJldHVybiBidWZbMF0tPl9fZWlwOwotCWNhc2UgVUVTUDoKLQkJcmV0dXJuIGJ1ZlswXS0+X19lc3A7Ci0JY2FzZSBFQlA6Ci0JCXJldHVybiBidWZbMF0tPl9fZWJwOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhVTV9LRVJOX0VSUiAiZ2V0X3RocmVhZF9yZWdzIC0gdW5rbm93biByZWdpc3RlciAlZFxuIiwKLQkJICAgICAgIHJlZyk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotaW50IGhhdmVfZnB4X3JlZ3MgPSAxOwotCi1pbnQgZ2V0X2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQotewotCWlmIChoYXZlX2ZweF9yZWdzKQotCQlyZXR1cm4gc2F2ZV9mcHhfcmVnaXN0ZXJzKHBpZCwgcmVncyk7Ci0JZWxzZQotCQlyZXR1cm4gc2F2ZV9mcF9yZWdpc3RlcnMocGlkLCByZWdzKTsKLX0KLQotaW50IHB1dF9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKLXsKLQlpZiAoaGF2ZV9mcHhfcmVncykKLQkJcmV0dXJuIHJlc3RvcmVfZnB4X3JlZ2lzdGVycyhwaWQsIHJlZ3MpOwotCWVsc2UKLQkJcmV0dXJuIHJlc3RvcmVfZnBfcmVnaXN0ZXJzKHBpZCwgcmVncyk7Ci19Ci0KLXZvaWQgYXJjaF9pbml0X3JlZ2lzdGVycyhpbnQgcGlkKQotewotCXN0cnVjdCB1c2VyX2ZweHJlZ3Nfc3RydWN0IGZweF9yZWdzOwotCWludCBlcnI7Ci0KLQllcnIgPSBwdHJhY2UoUFRSQUNFX0dFVEZQWFJFR1MsIHBpZCwgMCwgJmZweF9yZWdzKTsKLQlpZiAoIWVycikKLQkJcmV0dXJuOwotCi0JaWYgKGVycm5vICE9IEVJTykKLQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IFBUUkFDRV9HRVRGUFhSRUdTIGZhaWxlZCwgZXJybm8gPSAlZCIsCi0JCSAgICAgIGVycm5vKTsKLQotCWhhdmVfZnB4X3JlZ3MgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9zaWduYWwuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTE2MDkuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9zaWduYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotZXh0ZXJuIHZvaWQgaGFuZGxlX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpOwotCi12b2lkIGhhcmRfaGFuZGxlcihpbnQgc2lnKQotewotCWhhbmRsZV9zaWduYWwoc2lnLCAoc3RydWN0IHNpZ2NvbnRleHQgKikgKCZzaWcgKyAxKSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3Rhc2tfc2l6ZS5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni90YXNrX3NpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwNGMxZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3Rhc2tfc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSAibG9uZ2ptcC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCi0KLXN0YXRpYyBqbXBfYnVmIGJ1ZjsKLQotc3RhdGljIHZvaWQgc2VnZmF1bHQoaW50IHNpZykKLXsKLQlsb25nam1wKGJ1ZiwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFnZV9vayh1bnNpZ25lZCBsb25nIHBhZ2UpCi17Ci0JdW5zaWduZWQgbG9uZyAqYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nICopIChwYWdlIDw8IFVNX0tFUk5fUEFHRV9TSElGVCk7Ci0JdW5zaWduZWQgbG9uZyBuID0gfjBVTDsKLQl2b2lkICptYXBwZWQgPSBOVUxMOwotCWludCBvayA9IDA7Ci0KLQkvKgotCSAqIEZpcnN0IHNlZSBpZiB0aGUgcGFnZSBpcyByZWFkYWJsZS4gIElmIGl0IGlzLCBpdCBtYXkgc3RpbGwKLQkgKiBiZSBhIFZEU08sIHNvIHdlIGdvIG9uIHRvIHNlZSBpZiBpdCdzIHdyaXRhYmxlLiAgSWYgbm90Ci0JICogdGhlbiB0cnkgbWFwcGluZyBtZW1vcnkgdGhlcmUuICBJZiB0aGF0IGZhaWxzLCB0aGVuIHdlJ3JlCi0JICogc3RpbGwgaW4gdGhlIGtlcm5lbCBhcmVhLiAgQXMgYSBzYW5pdHkgY2hlY2ssIHdlJ2xsIGZhaWwgaWYKLQkgKiB0aGUgbW1hcCBzdWNjZWVkcywgYnV0IGdpdmVzIHVzIGFuIGFkZHJlc3MgZGlmZmVyZW50IGZyb20KLQkgKiB3aGF0IHdlIHdhbnRlZC4KLQkgKi8KLQlpZiAoc2V0am1wKGJ1ZikgPT0gMCkKLQkJbiA9ICphZGRyZXNzOwotCWVsc2UgewotCQltYXBwZWQgPSBtbWFwKGFkZHJlc3MsIFVNX0tFUk5fUEFHRV9TSVpFLAotCQkJICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCSAgICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOwotCQlpZiAobWFwcGVkID09IE1BUF9GQUlMRUQpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKG1hcHBlZCAhPSBhZGRyZXNzKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBOb3csIGlzIGl0IHdyaXRlYWJsZT8gIElmIHNvLCB0aGVuIHdlJ3JlIGluIHVzZXIgYWRkcmVzcwotCSAqIHNwYWNlLiAgSWYgbm90LCB0aGVuIHRyeSBtcHJvdGVjdGluZyBpdCBhbmQgdHJ5IHRoZSB3cml0ZQotCSAqIGFnYWluLgotCSAqLwotCWlmIChzZXRqbXAoYnVmKSA9PSAwKSB7Ci0JCSphZGRyZXNzID0gbjsKLQkJb2sgPSAxOwotCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKG1wcm90ZWN0KGFkZHJlc3MsIFVNX0tFUk5fUEFHRV9TSVpFLAotCQkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpICE9IDApCi0JCWdvdG8gb3V0OwotCi0JaWYgKHNldGptcChidWYpID09IDApIHsKLQkJKmFkZHJlc3MgPSBuOwotCQlvayA9IDE7Ci0JfQotCi0gb3V0OgotCWlmIChtYXBwZWQgIT0gTlVMTCkKLQkJbXVubWFwKG1hcHBlZCwgVU1fS0VSTl9QQUdFX1NJWkUpOwotCXJldHVybiBvazsKLX0KLQotdW5zaWduZWQgbG9uZyBvc19nZXRfdG9wX2FkZHJlc3Modm9pZCkKLXsKLQlzdHJ1Y3Qgc2lnYWN0aW9uIHNhLCBvbGQ7Ci0JdW5zaWduZWQgbG9uZyBib3R0b20gPSAwOwotCS8qCi0JICogQSAzMi1iaXQgVU1MIG9uIGEgNjQtYml0IGhvc3QgZ2V0cyBjb25mdXNlZCBhYm91dCB0aGUgVkRTTyBhdAotCSAqIDB4ZmZmZmUwMDAuICBJdCBpcyBtYXBwZWQsIGlzIHJlYWRhYmxlLCBjYW4gYmUgcmVwcm90ZWN0ZWQgd3JpdGVhYmxlCi0JICogYW5kIHdyaXR0ZW4uICBIb3dldmVyLCBleGVjIGRpc2NvdmVycyBsYXRlciB0aGF0IGl0IGNhbid0IGJlCi0JICogdW5tYXBwZWQuICBTbywganVzdCBzZXQgdGhlIGhpZ2hlc3QgYWRkcmVzcyB0byBiZSBjaGVja2VkIHRvIGp1c3QKLQkgKiBiZWxvdyBpdC4gIFRoaXMgbWlnaHQgd2FzdGUgc29tZSBhZGRyZXNzIHNwYWNlIG9uIDRHLzRHIDMyLWJpdAotCSAqIGhvc3RzLCBidXQgc2hvdWxkbid0IGh1cnQgb3RoZXJ3aXNlLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgdG9wID0gMHhmZmZmZDAwMCA+PiBVTV9LRVJOX1BBR0VfU0hJRlQ7Ci0JdW5zaWduZWQgbG9uZyB0ZXN0LCBvcmlnaW5hbDsKLQotCXByaW50ZigiTG9jYXRpbmcgdGhlIGJvdHRvbSBvZiB0aGUgYWRkcmVzcyBzcGFjZSAuLi4gIik7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0KLQkvKgotCSAqIFdlJ3JlIGdvaW5nIHRvIGJlIGxvbmdqbXBpbmcgb3V0IG9mIHRoZSBzaWduYWwgaGFuZGxlciwgc28KLQkgKiBTQV9ERUZFUiBuZWVkcyB0byBiZSBzZXQuCi0JICovCi0Jc2Euc2FfaGFuZGxlciA9IHNlZ2ZhdWx0OwotCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLQlzYS5zYV9mbGFncyA9IFNBX05PREVGRVI7Ci0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsICZvbGQpKSB7Ci0JCXBlcnJvcigib3NfZ2V0X3RvcF9hZGRyZXNzIik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JLyogTWFudWFsbHkgc2NhbiB0aGUgYWRkcmVzcyBzcGFjZSwgYm90dG9tLXVwLCB1bnRpbCB3ZSBmaW5kCi0JICogdGhlIGZpcnN0IHZhbGlkIHBhZ2UgKG9yIHJ1biBvdXQgb2YgdGhlbSkuCi0JICovCi0JZm9yIChib3R0b20gPSAwOyBib3R0b20gPCB0b3A7IGJvdHRvbSsrKSB7Ci0JCWlmIChwYWdlX29rKGJvdHRvbSkpCi0JCQlicmVhazsKLQl9Ci0KLQkvKiBJZiB3ZSd2ZSBnb3QgdGhpcyBmYXIsIHdlIHJhbiBvdXQgb2YgcGFnZXMuICovCi0JaWYgKGJvdHRvbSA9PSB0b3ApIHsKLQkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZGV0ZXJtaW5lIGJvdHRvbSBvZiBhZGRyZXNzICIKLQkJCSJzcGFjZS5cbiIpOwotCQlleGl0KDEpOwotCX0KLQotCXByaW50ZigiMHgleFxuIiwgYm90dG9tIDw8IFVNX0tFUk5fUEFHRV9TSElGVCk7Ci0JcHJpbnRmKCJMb2NhdGluZyB0aGUgdG9wIG9mIHRoZSBhZGRyZXNzIHNwYWNlIC4uLiAiKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQotCW9yaWdpbmFsID0gYm90dG9tOwotCi0JLyogVGhpcyBjb3VsZCBoYXBwZW4gd2l0aCBhIDRHLzRHIHNwbGl0ICovCi0JaWYgKHBhZ2Vfb2sodG9wKSkKLQkJZ290byBvdXQ7Ci0KLQlkbyB7Ci0JCXRlc3QgPSBib3R0b20gKyAodG9wIC0gYm90dG9tKSAvIDI7Ci0JCWlmIChwYWdlX29rKHRlc3QpKQotCQkJYm90dG9tID0gdGVzdDsKLQkJZWxzZQotCQkJdG9wID0gdGVzdDsKLQl9IHdoaWxlICh0b3AgLSBib3R0b20gPiAxKTsKLQotb3V0OgotCS8qIFJlc3RvcmUgdGhlIG9sZCBTSUdTRUdWIGhhbmRsaW5nICovCi0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmb2xkLCBOVUxMKSkgewotCQlwZXJyb3IoIm9zX2dldF90b3BfYWRkcmVzcyIpOwotCQlleGl0KDEpOwotCX0KLQl0b3AgPDw9IFVNX0tFUk5fUEFHRV9TSElGVDsKLQlwcmludGYoIjB4JXhcbiIsIHRvcCk7Ci0KLQlyZXR1cm4gdG9wOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni90bHMuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvdGxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZWQ0MWUuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni90bHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgInN5c2RlcC90bHMuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0KLS8qIENoZWNrcyB3aGV0aGVyIGhvc3Qgc3VwcG9ydHMgVExTLCBhbmQgc2V0cyAqdGxzX21pbiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlCi0gKiB2YWxpZCBvbiB0aGUgaG9zdC4KLSAqIGkzODYgaG9zdCBoYXZlIGl0ID09IDY7IHg4Nl82NCBob3N0IGhhdmUgaXQgPT0gMTIsIGZvciBpMzg2IGVtdWxhdGlvbi4gKi8KLXZvaWQgY2hlY2tfaG9zdF9zdXBwb3J0c190bHMoaW50ICpzdXBwb3J0c190bHMsIGludCAqdGxzX21pbikgewotCS8qIFZhbHVlcyBmb3IgeDg2IGFuZCB4ODZfNjQuKi8KLQlpbnQgdmFsW10gPSB7R0RUX0VOVFJZX1RMU19NSU5fSTM4NiwgR0RUX0VOVFJZX1RMU19NSU5fWDg2XzY0fTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbCk7IGkrKykgewotCQl1c2VyX2Rlc2NfdCBpbmZvOwotCQlpbmZvLmVudHJ5X251bWJlciA9IHZhbFtpXTsKLQotCQlpZiAoc3lzY2FsbChfX05SX2dldF90aHJlYWRfYXJlYSwgJmluZm8pID09IDApIHsKLQkJCSp0bHNfbWluID0gdmFsW2ldOwotCQkJKnN1cHBvcnRzX3RscyA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZXJybm8gPT0gRUlOVkFMKQotCQkJCWNvbnRpbnVlOwotCQkJZWxzZSBpZiAoZXJybm8gPT0gRU5PU1lTKQotCQkJCSpzdXBwb3J0c190bHMgPSAwOwotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCSpzdXBwb3J0c190bHMgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L01ha2VmaWxlIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDRhNDdmLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSMKLQotb2JqLXkgPSByZWdpc3RlcnMubyBwcmN0bC5vIHNpZ25hbC5vIHRhc2tfc2l6ZS5vCi0KLVVTRVJfT0JKUyA6PSAkKG9iai15KQotCi1pbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRkOTdhLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9yZWdpc3RlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0jZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUwotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgImxvbmdqbXAuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0KLWludCBzYXZlX2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpmcF9yZWdzKQotewotCWlmIChwdHJhY2UoUFRSQUNFX0dFVEZQUkVHUywgcGlkLCAwLCBmcF9yZWdzKSA8IDApCi0JCXJldHVybiAtZXJybm87Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCByZXN0b3JlX2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpmcF9yZWdzKQotewotCWlmIChwdHJhY2UoUFRSQUNFX1NFVEZQUkVHUywgcGlkLCAwLCBmcF9yZWdzKSA8IDApCi0JCXJldHVybiAtZXJybm87Ci0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X3RocmVhZF9yZWcoaW50IHJlZywgam1wX2J1ZiAqYnVmKQotewotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSBSSVA6Ci0JCXJldHVybiBidWZbMF0tPl9fcmlwOwotCWNhc2UgUlNQOgotCQlyZXR1cm4gYnVmWzBdLT5fX3JzcDsKLQljYXNlIFJCUDoKLQkJcmV0dXJuIGJ1ZlswXS0+X19yYnA7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKFVNX0tFUk5fRVJSICJnZXRfdGhyZWFkX3JlZ3MgLSB1bmtub3duIHJlZ2lzdGVyICVkXG4iLAotCQkgICAgICAgcmVnKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1pbnQgZ2V0X2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQotewotCXJldHVybiBzYXZlX2ZwX3JlZ2lzdGVycyhwaWQsIHJlZ3MpOwotfQotCi1pbnQgcHV0X2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQotewotCXJldHVybiByZXN0b3JlX2ZwX3JlZ2lzdGVycyhwaWQsIHJlZ3MpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3NpZ25hbC5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3NpZ25hbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEzODg4Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9zaWduYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotZXh0ZXJuIHZvaWQgaGFuZGxlX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpOwotCi12b2lkIGhhcmRfaGFuZGxlcihpbnQgc2lnKQotewotCXN0cnVjdCB1Y29udGV4dCAqdWM7Ci0JYXNtKCJtb3ZxICUlcmR4LCAlMCIgOiAiPXIiICh1YykpOwotCi0JaGFuZGxlX3NpZ25hbChzaWcsIChzdHJ1Y3Qgc2lnY29udGV4dCAqKSAmdWMtPnVjX21jb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC90YXNrX3NpemUuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC90YXNrX3NpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhMGRkMS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvdGFza19zaXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXVuc2lnbmVkIGxvbmcgb3NfZ2V0X3RvcF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgc2hpZnQpCi17Ci0JLyogVGhlIG9sZCB2YWx1ZSBvZiBDT05GSUdfVE9QX0FERFIgKi8KLQlyZXR1cm4gMHg3ZmMwMDAwMDAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC90aW1lLmMgYi9hcmNoL3VtL29zLUxpbnV4L3RpbWUuYwppbmRleCA2ZTMzNTlkLi45MTA0OTlkIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3RpbWUuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3RpbWUuYwpAQCAtOCwxMSArOCw5IEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogaW50IHNldF9pbnRlcnZhbCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC90bHMuYyBiL2FyY2gvdW0vb3MtTGludXgvdGxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjc3ODAuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC90bHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlICJzeXNkZXAvdGxzLmgiCi0KLS8qIFRMUyBzdXBwb3J0IC0gd2UgYmFzaWNhbGx5IHJlbHkgb24gdGhlIGhvc3QncyBvbmUuKi8KLQotI2lmbmRlZiBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBCi0jZGVmaW5lIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUEgMjUKLSNlbmRpZgotCi0jaWZuZGVmIFBUUkFDRV9TRVRfVEhSRUFEX0FSRUEKLSNkZWZpbmUgUFRSQUNFX1NFVF9USFJFQURfQVJFQSAyNgotI2VuZGlmCi0KLWludCBvc19zZXRfdGhyZWFkX2FyZWEodXNlcl9kZXNjX3QgKmluZm8sIGludCBwaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHB0cmFjZShQVFJBQ0VfU0VUX1RIUkVBRF9BUkVBLCBwaWQsIGluZm8tPmVudHJ5X251bWJlciwKLQkJICAgICAodW5zaWduZWQgbG9uZykgaW5mbyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldCA9IC1lcnJubzsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgb3NfZ2V0X3RocmVhZF9hcmVhKHVzZXJfZGVzY190ICppbmZvLCBpbnQgcGlkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBwdHJhY2UoUFRSQUNFX0dFVF9USFJFQURfQVJFQSwgcGlkLCBpbmZvLT5lbnRyeV9udW1iZXIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIGluZm8pOwotCWlmIChyZXQgPCAwKQotCQlyZXQgPSAtZXJybm87Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdHR5LmMgYi9hcmNoL3VtL29zLUxpbnV4L3R0eS5jCmluZGV4IGIwOWZmNjYuLmRkMTJiOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdHR5LmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC90dHkuYwpAQCAtNywxMCArNyw4IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIHN0cnVjdCBncmFudHB0X2luZm8gewogCWludCBmZDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdWFjY2Vzcy5jIGIvYXJjaC91bS9vcy1MaW51eC91YWNjZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2VkNzQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC91YWNjZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAxIENocmlzIEVtZXJzb24gKGNlbWVyc29uQGNoaWFyay5ncmVlbmVuZC5vcmcudWspCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSAibG9uZ2ptcC5oIgotCi11bnNpZ25lZCBsb25nIF9fZG9fdXNlcl9jb3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbiwKLQkJCSAgICAgdm9pZCAqKmZhdWx0X2FkZHIsIGptcF9idWYgKipmYXVsdF9jYXRjaGVyLAotCQkJICAgICB2b2lkICgqb3ApKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLAotCQkJCQlpbnQgbiksIGludCAqZmF1bHRlZF9vdXQpCi17Ci0JdW5zaWduZWQgbG9uZyAqZmFkZHJwID0gKHVuc2lnbmVkIGxvbmcgKikgZmF1bHRfYWRkciwgcmV0OwotCi0Jam1wX2J1ZiBqYnVmOwotCSpmYXVsdF9jYXRjaGVyID0gJmpidWY7Ci0JaWYgKFVNTF9TRVRKTVAoJmpidWYpID09IDApIHsKLQkJKCpvcCkodG8sIGZyb20sIG4pOwotCQlyZXQgPSAwOwotCQkqZmF1bHRlZF9vdXQgPSAwOwotCX0KLQllbHNlIHsKLQkJcmV0ID0gKmZhZGRycDsKLQkJKmZhdWx0ZWRfb3V0ID0gMTsKLQl9Ci0JKmZhdWx0X2FkZHIgPSBOVUxMOwotCSpmYXVsdF9jYXRjaGVyID0gTlVMTDsKLQlyZXR1cm4gcmV0OwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3VtaWQuYyBiL2FyY2gvdW0vb3MtTGludXgvdW1pZC5jCmluZGV4IGEyN2RlZmIuLjQ4MzJlYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdW1pZC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdW1pZC5jCkBAIC0xMyw5ICsxMyw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogI2RlZmluZSBVTUxfRElSICJ+Ly51bWwvIgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3V0aWwuYyBiL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCmluZGV4IDU4MDNiMTguLjllM2I0M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCkBAIC0xMyw5ICsxMyw3IEBACiAjaW5jbHVkZSA8d2FpdC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiB2b2lkIHN0YWNrX3Byb3RlY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcyBiL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwppbmRleCA2MTEwN2I2Li4yZWIyODQzIDEwMDY0NAotLS0gYS9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKKysrIGIvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCkBAIC04LDcgKzgsNyBAQAogVVNFUl9PQkpTIDo9ICQoZm9yZWFjaCBmaWxlLCQoVVNFUl9PQkpTKSwkKG9iaikvJChmaWxlKSkKIAogJChVU0VSX09CSlM6Lm89LiUpOiBcCi0JY19mbGFncyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKFVTRVJfQ0ZMQUdTKSAkKENGTEFHU18kKGJhc2V0YXJnZXQpLm8pCisJY19mbGFncyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKFVTRVJfQ0ZMQUdTKSAtaW5jbHVkZSB1c2VyLmggJChDRkxBR1NfJChiYXNldGFyZ2V0KS5vKQogJChVU0VSX09CSlMpIDogQ0hFQ0tGTEFHUyA6PSAtRF9fbGludXhfXyAtRGxpbnV4IC1EX19TVERDX18gXAogCS1EdW5peCAtRF9fdW5peF9fIC1EX18kKFNVQkFSQ0gpX18gJChDRikKIApAQCAtMjUsOCArMjUsMyBAQAogZGVmaW5lIHVucHJvZmlsZQogCSQocGF0c3Vic3QgLXBnLCwkKHBhdHN1YnN0IC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSwsJCgxKSkpCiBlbmRlZgotCi1pZmRlZiBzdWJhcmNoLW9iai15Ci1vYmoteSArPSBzdWJhcmNoLm8KLXN1YmFyY2gteSA9ICQoYWRkcHJlZml4IC4uLy4uLyQoSEVBREVSX0FSQ0gpLywkKHN1YmFyY2gtb2JqLXkpKQotZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUgYi9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIzY2ZiLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotIwotCi1vYmoteSA9IGJ1Zy5vIGJ1Z3MubyBjaGVja3N1bS5vIGRlbGF5Lm8gZmF1bHQubyBrc3ltcy5vIGxkdC5vIHB0cmFjZS5vIFwKLQlwdHJhY2VfdXNlci5vIHNldGptcC5vIHNpZ25hbC5vIHN0dWIubyBzdHViX3NlZ3YubyBzeXNjYWxscy5vIHN5c3JxLm8gXAotCXN5c19jYWxsX3RhYmxlLm8gdGxzLm8gYXRvbWljNjRfY3g4XzMyLm8gbWVtLm8KLQotb2JqLSQoQ09ORklHX0JJTkZNVF9FTEYpICs9IGVsZmNvcmUubwotCi1zdWJhcmNoLW9iai15ID0gbGliL3N0cmluZ18zMi5vCi1zdWJhcmNoLW9iai0kKENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSkgKz0gbGliL3J3c2VtLm8KLXN1YmFyY2gtb2JqLSQoQ09ORklHX0hJR0hNRU0pICs9IG1tL2hpZ2htZW1fMzIubwotc3ViYXJjaC1vYmotJChDT05GSUdfTU9EVUxFUykgKz0ga2VybmVsL21vZHVsZS5vCi0KLVVTRVJfT0JKUyA6PSBidWdzLm8gcHRyYWNlX3VzZXIubyBmYXVsdC5vCi0KLVVTRVJfT0JKUyArPSB1c2VyLW9mZnNldHMucwotZXh0cmEteSArPSB1c2VyLW9mZnNldHMucwotCi1VTlBST0ZJTEVfT0JKUyA6PSBzdHViX3NlZ3YubwotQ0ZMQUdTX3N0dWJfc2Vndi5vIDo9ICQoQ0ZMQUdTX05PX0hBUkRFTklORykKLQotaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvYXNtL2FyY2hwYXJhbS5oIGIvYXJjaC91bS9zeXMtaTM4Ni9hc20vYXJjaHBhcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMThhODguLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9hc20vYXJjaHBhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDMgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVU1fQVJDSFBBUkFNX0kzODZfSAotI2RlZmluZSBfX1VNX0FSQ0hQQVJBTV9JMzg2X0gKLQotI2lmZGVmIENPTkZJR19YODZfUEFFCi0jZGVmaW5lIExBU1RfUEtNQVAgNTEyCi0jZWxzZQotI2RlZmluZSBMQVNUX1BLTUFQIDEwMjQKLSNlbmRpZgotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9hc20vZWxmLmggYi9hcmNoL3VtL3N5cy1pMzg2L2FzbS9lbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzMDU1NS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L2FzbS9lbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLSNpZm5kZWYgX19VTV9FTEZfSTM4Nl9ICi0jZGVmaW5lIF9fVU1fRUxGX0kzODZfSAotCi0jaW5jbHVkZSA8YXNtL3VzZXIuaD4KLSNpbmNsdWRlICJza2FzLmgiCi0KLSNkZWZpbmUgUl8zODZfTk9ORQkwCi0jZGVmaW5lIFJfMzg2XzMyCTEKLSNkZWZpbmUgUl8zODZfUEMzMgkyCi0jZGVmaW5lIFJfMzg2X0dPVDMyCTMKLSNkZWZpbmUgUl8zODZfUExUMzIJNAotI2RlZmluZSBSXzM4Nl9DT1BZCTUKLSNkZWZpbmUgUl8zODZfR0xPQl9EQVQJNgotI2RlZmluZSBSXzM4Nl9KTVBfU0xPVAk3Ci0jZGVmaW5lIFJfMzg2X1JFTEFUSVZFCTgKLSNkZWZpbmUgUl8zODZfR09UT0ZGCTkKLSNkZWZpbmUgUl8zODZfR09UUEMJMTAKLSNkZWZpbmUgUl8zODZfTlVNCTExCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBlbGZfZ3JlZ190OwotCi0jZGVmaW5lIEVMRl9OR1JFRyAoc2l6ZW9mIChzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCkgLyBzaXplb2YoZWxmX2dyZWdfdCkpCi10eXBlZGVmIGVsZl9ncmVnX3QgZWxmX2dyZWdzZXRfdFtFTEZfTkdSRUddOwotCi10eXBlZGVmIHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IGVsZl9mcHJlZ3NldF90OwotCi0vKgotICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KLSAqLwotI2RlZmluZSBlbGZfY2hlY2tfYXJjaCh4KSBcCi0JKCgoeCktPmVfbWFjaGluZSA9PSBFTV8zODYpIHx8ICgoeCktPmVfbWFjaGluZSA9PSBFTV80ODYpKQotCi0jZGVmaW5lIEVMRl9DTEFTUwlFTEZDTEFTUzMyCi0jZGVmaW5lIEVMRl9EQVRBICAgICAgICBFTEZEQVRBMkxTQgotI2RlZmluZSBFTEZfQVJDSCAgICAgICAgRU1fMzg2Ci0KLSNkZWZpbmUgRUxGX1BMQVRfSU5JVChyZWdzLCBsb2FkX2FkZHIpIGRvIHsgXAotCVBUX1JFR1NfRUJYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRUNYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRURYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRVNJKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRURJKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRUJQKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRUFYKHJlZ3MpID0gMDsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRSA0MDk2Ci0KLSNkZWZpbmUgRUxGX0VUX0RZTl9CQVNFICgyICogVEFTS19TSVpFIC8gMykKLQotLyogU2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gaW5jbHVkZS9hc20taTM4Ni9lbGYuaCAqLwotCi0jZGVmaW5lIEVMRl9DT1JFX0NPUFlfUkVHUyhwcl9yZWcsIHJlZ3MpIGRvIHsJXAotCXByX3JlZ1swXSA9IFBUX1JFR1NfRUJYKHJlZ3MpOwkJXAotCXByX3JlZ1sxXSA9IFBUX1JFR1NfRUNYKHJlZ3MpOwkJXAotCXByX3JlZ1syXSA9IFBUX1JFR1NfRURYKHJlZ3MpOwkJXAotCXByX3JlZ1szXSA9IFBUX1JFR1NfRVNJKHJlZ3MpOwkJXAotCXByX3JlZ1s0XSA9IFBUX1JFR1NfRURJKHJlZ3MpOwkJXAotCXByX3JlZ1s1XSA9IFBUX1JFR1NfRUJQKHJlZ3MpOwkJXAotCXByX3JlZ1s2XSA9IFBUX1JFR1NfRUFYKHJlZ3MpOwkJXAotCXByX3JlZ1s3XSA9IFBUX1JFR1NfRFMocmVncyk7CQlcCi0JcHJfcmVnWzhdID0gUFRfUkVHU19FUyhyZWdzKTsJCVwKLQkvKiBmYWtlIG9uY2UgdXNlZCBmcyBhbmQgZ3Mgc2VsZWN0b3JzPyAqLwlcCi0JcHJfcmVnWzldID0gUFRfUkVHU19EUyhyZWdzKTsJCVwKLQlwcl9yZWdbMTBdID0gUFRfUkVHU19EUyhyZWdzKTsJCVwKLQlwcl9yZWdbMTFdID0gUFRfUkVHU19TWVNDQUxMX05SKHJlZ3MpOwlcCi0JcHJfcmVnWzEyXSA9IFBUX1JFR1NfSVAocmVncyk7CQlcCi0JcHJfcmVnWzEzXSA9IFBUX1JFR1NfQ1MocmVncyk7CQlcCi0JcHJfcmVnWzE0XSA9IFBUX1JFR1NfRUZMQUdTKHJlZ3MpOwlcCi0JcHJfcmVnWzE1XSA9IFBUX1JFR1NfU1AocmVncyk7CQlcCi0JcHJfcmVnWzE2XSA9IFBUX1JFR1NfU1MocmVncyk7CQlcCi19IHdoaWxlICgwKTsKLQotI2RlZmluZSB0YXNrX3B0X3JlZ3ModCkgKCYodCktPnRocmVhZC5yZWdzKQotCi1zdHJ1Y3QgdGFza19zdHJ1Y3Q7Ci0KLWV4dGVybiBpbnQgZWxmX2NvcmVfY29weV9mcHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0LCBlbGZfZnByZWdzZXRfdCAqZnB1KTsKLQotI2RlZmluZSBFTEZfQ09SRV9DT1BZX0ZQUkVHUyh0LCBmcHUpIGVsZl9jb3JlX2NvcHlfZnByZWdzKHQsIGZwdSkKLQotZXh0ZXJuIGxvbmcgZWxmX2F1eF9od2NhcDsKLSNkZWZpbmUgRUxGX0hXQ0FQIChlbGZfYXV4X2h3Y2FwKQotCi1leHRlcm4gY2hhciAqIGVsZl9hdXhfcGxhdGZvcm07Ci0jZGVmaW5lIEVMRl9QTEFURk9STSAoZWxmX2F1eF9wbGF0Zm9ybSkKLQotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIGRvIHsgfSB3aGlsZSAoMCkKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdnN5c2NhbGxfZWhkcjsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHZzeXNjYWxsX2VuZDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fa2VybmVsX3ZzeXNjYWxsOwotCi0jZGVmaW5lIFZTWVNDQUxMX0JBU0UgdnN5c2NhbGxfZWhkcgotI2RlZmluZSBWU1lTQ0FMTF9FTkQgdnN5c2NhbGxfZW5kCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSByYW5nZSB0aGF0IGlzIHJlYWRhYmxlIGJ5IHVzZXIgbW9kZSwgYW5kIHRoaW5ncwotICogYWN0aW5nIGxpa2UgdXNlciBtb2RlIHN1Y2ggYXMgZ2V0X3VzZXJfcGFnZXMuCi0gKi8KLSNkZWZpbmUgRklYQUREUl9VU0VSX1NUQVJUICAgICAgVlNZU0NBTExfQkFTRQotI2RlZmluZSBGSVhBRERSX1VTRVJfRU5EICAgICAgICBWU1lTQ0FMTF9FTkQKLQotI2RlZmluZSBfX0hBVkVfQVJDSF9HQVRFX0FSRUEgMQotCi0vKgotICogQXJjaGl0ZWN0dXJlLW5ldXRyYWwgQVRfIHZhbHVlcyBpbiAwLTE3LCBsZWF2ZSBzb21lIHJvb20KLSAqIGZvciBtb3JlIG9mIHRoZW0sIHN0YXJ0IHRoZSB4ODYtc3BlY2lmaWMgb25lcyBhdCAzMi4KLSAqLwotI2RlZmluZSBBVF9TWVNJTkZPCQkzMgotI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJCTMzCi0KLSNkZWZpbmUgQVJDSF9ETElORk8JCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaWYgKCB2c3lzY2FsbF9laGRyICkgewkJCQkJXAotCQlORVdfQVVYX0VOVChBVF9TWVNJTkZPLAlfX2tlcm5lbF92c3lzY2FsbCk7CVwKLQkJTkVXX0FVWF9FTlQoQVRfU1lTSU5GT19FSERSLCB2c3lzY2FsbF9laGRyKTsJXAotCX0JCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2FzbS9tb2R1bGUuaCBiL2FyY2gvdW0vc3lzLWkzODYvYXNtL21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWFkNGEwLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvYXNtL21vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBfX1VNX01PRFVMRV9JMzg2X0gKLSNkZWZpbmUgX19VTV9NT0RVTEVfSTM4Nl9ICi0KLS8qIFVNTCBpcyBzaW1wbGUgKi8KLXN0cnVjdCBtb2RfYXJjaF9zcGVjaWZpYwotewotfTsKLQotI2RlZmluZSBFbGZfU2hkciBFbGYzMl9TaGRyCi0jZGVmaW5lIEVsZl9TeW0gRWxmMzJfU3ltCi0jZGVmaW5lIEVsZl9FaGRyIEVsZjMyX0VoZHIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvdW0vc3lzLWkzODYvYXNtL3Byb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmE5MDYxLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvYXNtL3Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1VNX1BST0NFU1NPUl9JMzg2X0gKLSNkZWZpbmUgX19VTV9QUk9DRVNTT1JfSTM4Nl9ICi0KLSNpbmNsdWRlICJsaW51eC9zdHJpbmcuaCIKLSNpbmNsdWRlIDxzeXNkZXAvaG9zdF9sZHQuaD4KLSNpbmNsdWRlICJhc20vc2VnbWVudC5oIgotCi1leHRlcm4gaW50IGhvc3RfaGFzX2Ntb3Y7Ci0KLS8qIGluY2x1ZGUgZmF1bHRpbmZvIHN0cnVjdHVyZSAqLwotI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKLQotc3RydWN0IHVtbF90bHNfc3RydWN0IHsKLQlzdHJ1Y3QgdXNlcl9kZXNjIHRsczsKLQl1bnNpZ25lZCBmbHVzaGVkOjE7Ci0JdW5zaWduZWQgcHJlc2VudDoxOwotfTsKLQotc3RydWN0IGFyY2hfdGhyZWFkIHsKLQlzdHJ1Y3QgdW1sX3Rsc19zdHJ1Y3QgdGxzX2FycmF5W0dEVF9FTlRSWV9UTFNfRU5UUklFU107Ci0JdW5zaWduZWQgbG9uZyBkZWJ1Z3JlZ3NbOF07Ci0JaW50IGRlYnVncmVnc19zZXE7Ci0Jc3RydWN0IGZhdWx0aW5mbyBmYXVsdGluZm87Ci19OwotCi0jZGVmaW5lIElOSVRfQVJDSF9USFJFQUQgeyBcCi0JLnRsc19hcnJheSAgCQk9IHsgWyAwIC4uLiBHRFRfRU5UUllfVExTX0VOVFJJRVMgLSAxIF0gPSBcCi0JCQkJICAgIHsgLnByZXNlbnQgPSAwLCAuZmx1c2hlZCA9IDAgfSB9LCBcCi0JLmRlYnVncmVncyAgCQk9IHsgWyAwIC4uLiA3IF0gPSAwIH0sIFwKLQkuZGVidWdyZWdzX3NlcQkJPSAwLCBcCi0JLmZhdWx0aW5mbwkJPSB7IDAsIDAsIDAgfSBcCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2ZsdXNoX3RocmVhZChzdHJ1Y3QgYXJjaF90aHJlYWQgKnRocmVhZCkKLXsKLQkvKiBDbGVhciBhbnkgVExTIHN0aWxsIGhhbmdpbmcgKi8KLQltZW1zZXQoJnRocmVhZC0+dGxzX2FycmF5LCAwLCBzaXplb2YodGhyZWFkLT50bHNfYXJyYXkpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfY29weV90aHJlYWQoc3RydWN0IGFyY2hfdGhyZWFkICpmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFyY2hfdGhyZWFkICp0bykKLXsKLSAgICAgICAgbWVtY3B5KCZ0by0+dGxzX2FycmF5LCAmZnJvbS0+dGxzX2FycmF5LCBzaXplb2YoZnJvbS0+dGxzX2FycmF5KSk7Ci19Ci0KLSNpbmNsdWRlIDxhc20vdXNlci5oPgotCi0vKiBSRVAgTk9QIChQQVVTRSkgaXMgYSBnb29kIHRoaW5nIHRvIGluc2VydCBpbnRvIGJ1c3ktd2FpdCBsb29wcy4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZXBfbm9wKHZvaWQpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInJlcDtub3AiOiA6IDoibWVtb3J5Iik7Ci19Ci0KLSNkZWZpbmUgY3B1X3JlbGF4KCkJcmVwX25vcCgpCi0KLS8qCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIG1hY3JvIHRoYXQgcmV0dXJucyBjdXJyZW50Ci0gKiBpbnN0cnVjdGlvbiBwb2ludGVyICgicHJvZ3JhbSBjb3VudGVyIikuIFN0b2xlbgotICogZnJvbSBhc20taTM4Ni9wcm9jZXNzb3IuaAotICovCi0jZGVmaW5lIGN1cnJlbnRfdGV4dF9hZGRyKCkgXAotCSh7IHZvaWQgKnBjOyBfX2FzbV9fKCJtb3ZsICQxZiwlMFxuMToiOiI9ZyIgKHBjKSk7IHBjOyB9KQotCi0jZGVmaW5lIEFSQ0hfSVNfU1RBQ0tHUk9XKGFkZHJlc3MpIFwKLSAgICAgICAoYWRkcmVzcyArIDMyID49IFVQVF9TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MucmVncykpCi0KLSNkZWZpbmUgS1NUS19FSVAodHNrKSBLU1RLX1JFRyh0c2ssIEVJUCkKLSNkZWZpbmUgS1NUS19FU1AodHNrKSBLU1RLX1JFRyh0c2ssIFVFU1ApCi0jZGVmaW5lIEtTVEtfRUJQKHRzaykgS1NUS19SRUcodHNrLCBFQlApCi0KLSNpbmNsdWRlICJhc20vcHJvY2Vzc29yLWdlbmVyaWMuaCIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2F0b21pYzY0X2N4OF8zMi5TIGIvYXJjaC91bS9zeXMtaTM4Ni9hdG9taWM2NF9jeDhfMzIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5MDFkMy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L2F0b21pYzY0X2N4OF8zMi5TCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBhdG9taWM2NF90IGZvciA1ODYrCi0gKgotICogQ29waWVkIGZyb20gYXJjaC94ODYvbGliL2F0b21pYzY0X2N4OF8zMi5TCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMTAgIEx1Y2EgQmFyYmllcmkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS1hc20uaD4KLSNpbmNsdWRlIDxhc20vZHdhcmYyLmg+Ci0KLS5tYWNybyBTQVZFIHJlZwotCXB1c2hsX2NmaSAlXHJlZwotCUNGSV9SRUxfT0ZGU0VUIFxyZWcsIDAKLS5lbmRtCi0KLS5tYWNybyBSRVNUT1JFIHJlZwotCXBvcGxfY2ZpICVccmVnCi0JQ0ZJX1JFU1RPUkUgXHJlZwotLmVuZG0KLQotLm1hY3JvIHJlYWQ2NCByZWcKLQltb3ZsICVlYngsICVlYXgKLQltb3ZsICVlY3gsICVlZHgKLS8qIHdlIG5lZWQgTE9DS19QUkVGSVggc2luY2Ugb3RoZXJ3aXNlIGNtcHhjaGc4YiBhbHdheXMgZG9lcyB0aGUgd3JpdGUgKi8KLQlMT0NLX1BSRUZJWAotCWNtcHhjaGc4YiAoXHJlZykKLS5lbmRtCi0KLUVOVFJZKGF0b21pYzY0X3JlYWRfY3g4KQotCUNGSV9TVEFSVFBST0MKLQotCXJlYWQ2NCAlZWN4Ci0JcmV0Ci0JQ0ZJX0VORFBST0MKLUVORFBST0MoYXRvbWljNjRfcmVhZF9jeDgpCi0KLUVOVFJZKGF0b21pYzY0X3NldF9jeDgpCi0JQ0ZJX1NUQVJUUFJPQwotCi0xOgotLyogd2UgZG9uJ3QgbmVlZCBMT0NLX1BSRUZJWCBzaW5jZSBhbGlnbmVkIDY0LWJpdCB3cml0ZXMKLSAqIGFyZSBhdG9taWMgb24gNTg2IGFuZCBuZXdlciAqLwotCWNtcHhjaGc4YiAoJWVzaSkKLQlqbmUgMWIKLQotCXJldAotCUNGSV9FTkRQUk9DCi1FTkRQUk9DKGF0b21pYzY0X3NldF9jeDgpCi0KLUVOVFJZKGF0b21pYzY0X3hjaGdfY3g4KQotCUNGSV9TVEFSVFBST0MKLQotCW1vdmwgJWVieCwgJWVheAotCW1vdmwgJWVjeCwgJWVkeAotMToKLQlMT0NLX1BSRUZJWAotCWNtcHhjaGc4YiAoJWVzaSkKLQlqbmUgMWIKLQotCXJldAotCUNGSV9FTkRQUk9DCi1FTkRQUk9DKGF0b21pYzY0X3hjaGdfY3g4KQotCi0ubWFjcm8gYWRkc3ViX3JldHVybiBmdW5jIGlucyBpbnNjCi1FTlRSWShhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQotCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVicAotCVNBVkUgZWJ4Ci0JU0FWRSBlc2kKLQlTQVZFIGVkaQotCi0JbW92bCAlZWF4LCAlZXNpCi0JbW92bCAlZWR4LCAlZWRpCi0JbW92bCAlZWN4LCAlZWJwCi0KLQlyZWFkNjQgJWVicAotMToKLQltb3ZsICVlYXgsICVlYngKLQltb3ZsICVlZHgsICVlY3gKLQlcaW5zXCgpbCAlZXNpLCAlZWJ4Ci0JXGluc2NcKClsICVlZGksICVlY3gKLQlMT0NLX1BSRUZJWAotCWNtcHhjaGc4YiAoJWVicCkKLQlqbmUgMWIKLQotMTA6Ci0JbW92bCAlZWJ4LCAlZWF4Ci0JbW92bCAlZWN4LCAlZWR4Ci0JUkVTVE9SRSBlZGkKLQlSRVNUT1JFIGVzaQotCVJFU1RPUkUgZWJ4Ci0JUkVTVE9SRSBlYnAKLQlyZXQKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQotLmVuZG0KLQotYWRkc3ViX3JldHVybiBhZGQgYWRkIGFkYwotYWRkc3ViX3JldHVybiBzdWIgc3ViIHNiYgotCi0ubWFjcm8gaW5jZGVjX3JldHVybiBmdW5jIGlucyBpbnNjCi1FTlRSWShhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQotCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVieAotCi0JcmVhZDY0ICVlc2kKLTE6Ci0JbW92bCAlZWF4LCAlZWJ4Ci0JbW92bCAlZWR4LCAlZWN4Ci0JXGluc1woKWwgJDEsICVlYngKLQlcaW5zY1woKWwgJDAsICVlY3gKLQlMT0NLX1BSRUZJWAotCWNtcHhjaGc4YiAoJWVzaSkKLQlqbmUgMWIKLQotMTA6Ci0JbW92bCAlZWJ4LCAlZWF4Ci0JbW92bCAlZWN4LCAlZWR4Ci0JUkVTVE9SRSBlYngKLQlyZXQKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQotLmVuZG0KLQotaW5jZGVjX3JldHVybiBpbmMgYWRkIGFkYwotaW5jZGVjX3JldHVybiBkZWMgc3ViIHNiYgotCi1FTlRSWShhdG9taWM2NF9kZWNfaWZfcG9zaXRpdmVfY3g4KQotCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVieAotCi0JcmVhZDY0ICVlc2kKLTE6Ci0JbW92bCAlZWF4LCAlZWJ4Ci0JbW92bCAlZWR4LCAlZWN4Ci0Jc3VibCAkMSwgJWVieAotCXNiYiAkMCwgJWVjeAotCWpzIDJmCi0JTE9DS19QUkVGSVgKLQljbXB4Y2hnOGIgKCVlc2kpCi0Jam5lIDFiCi0KLTI6Ci0JbW92bCAlZWJ4LCAlZWF4Ci0JbW92bCAlZWN4LCAlZWR4Ci0JUkVTVE9SRSBlYngKLQlyZXQKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhhdG9taWM2NF9kZWNfaWZfcG9zaXRpdmVfY3g4KQotCi1FTlRSWShhdG9taWM2NF9hZGRfdW5sZXNzX2N4OCkKLQlDRklfU1RBUlRQUk9DCi0JU0FWRSBlYnAKLQlTQVZFIGVieAotLyogdGhlc2UganVzdCBwdXNoIHRoZXNlIHR3byBwYXJhbWV0ZXJzIG9uIHRoZSBzdGFjayAqLwotCVNBVkUgZWRpCi0JU0FWRSBlc2kKLQotCW1vdmwgJWVjeCwgJWVicAotCW1vdmwgJWVheCwgJWVzaQotCW1vdmwgJWVkeCwgJWVkaQotCi0JcmVhZDY0ICVlYnAKLTE6Ci0JY21wbCAlZWF4LCAwKCVlc3ApCi0JamUgNGYKLTI6Ci0JbW92bCAlZWF4LCAlZWJ4Ci0JbW92bCAlZWR4LCAlZWN4Ci0JYWRkbCAlZXNpLCAlZWJ4Ci0JYWRjbCAlZWRpLCAlZWN4Ci0JTE9DS19QUkVGSVgKLQljbXB4Y2hnOGIgKCVlYnApCi0Jam5lIDFiCi0KLQltb3ZsICQxLCAlZWF4Ci0zOgotCWFkZGwgJDgsICVlc3AKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTgKLQlSRVNUT1JFIGVieAotCVJFU1RPUkUgZWJwCi0JcmV0Ci00OgotCWNtcGwgJWVkeCwgNCglZXNwKQotCWpuZSAyYgotCXhvcmwgJWVheCwgJWVheAotCWptcCAzYgotCUNGSV9FTkRQUk9DCi1FTkRQUk9DKGF0b21pYzY0X2FkZF91bmxlc3NfY3g4KQotCi1FTlRSWShhdG9taWM2NF9pbmNfbm90X3plcm9fY3g4KQotCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVieAotCi0JcmVhZDY0ICVlc2kKLTE6Ci0JdGVzdGwgJWVheCwgJWVheAotCWplIDRmCi0yOgotCW1vdmwgJWVheCwgJWVieAotCW1vdmwgJWVkeCwgJWVjeAotCWFkZGwgJDEsICVlYngKLQlhZGNsICQwLCAlZWN4Ci0JTE9DS19QUkVGSVgKLQljbXB4Y2hnOGIgKCVlc2kpCi0Jam5lIDFiCi0KLQltb3ZsICQxLCAlZWF4Ci0zOgotCVJFU1RPUkUgZWJ4Ci0JcmV0Ci00OgotCXRlc3RsICVlZHgsICVlZHgKLQlqbmUgMmIKLQlqbXAgM2IKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhhdG9taWM2NF9pbmNfbm90X3plcm9fY3g4KQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9idWcuYyBiL2FyY2gvdW0vc3lzLWkzODYvYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNGYyNzMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9idWcuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgVjIKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotCi0vKiBNb3N0bHkgY29waWVkIGZyb20gaTM4Ni94ODZfODYgLSBlbGltaW5hdGVkIHRoZSBlaXAgPCBQQUdFX09GRlNFVCBiZWNhdXNlCi0gKiB0aGF0J3Mgbm90IHJlbGV2YW50IGluIHNrYXMgbW9kZS4KLSAqLwotCi1pbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIGVpcCkKLXsKLQl1bnNpZ25lZCBzaG9ydCB1ZDI7Ci0KLQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKWVpcCwgdWQyKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gdWQyID09IDB4MGIwZjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvYnVncy5jIGIvYXJjaC91bS9zeXMtaTM4Ni9idWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNmQwZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9idWdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCi0jaW5jbHVkZSAibG9uZ2ptcC5oIgotI2luY2x1ZGUgInRhc2suaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgotCi0vKiBTZXQgZHVyaW5nIGVhcmx5IGJvb3QgKi8KLXN0YXRpYyBpbnQgaG9zdF9oYXNfY21vdiA9IDE7Ci1zdGF0aWMgam1wX2J1ZiBjbW92X3Rlc3RfcmV0dXJuOwotCi1zdGF0aWMgdm9pZCBjbW92X3NpZ2lsbF90ZXN0X2hhbmRsZXIoaW50IHNpZykKLXsKLQlob3N0X2hhc19jbW92ID0gMDsKLQlsb25nam1wKGNtb3ZfdGVzdF9yZXR1cm4sIDEpOwotfQotCi12b2lkIGFyY2hfY2hlY2tfYnVncyh2b2lkKQotewotCXN0cnVjdCBzaWdhY3Rpb24gb2xkLCBuZXc7Ci0KLQlwcmludGsoVU1fS0VSTl9JTkZPICJDaGVja2luZyBmb3IgaG9zdCBwcm9jZXNzb3IgY21vdiBzdXBwb3J0Li4uIik7Ci0JbmV3LnNhX2hhbmRsZXIgPSBjbW92X3NpZ2lsbF90ZXN0X2hhbmRsZXI7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCBTSUdJTEwgaXMgZW5hYmxlZCBhZnRlciB0aGUgaGFuZGxlciBsb25nam1wcyBiYWNrICovCi0JbmV3LnNhX2ZsYWdzID0gU0FfTk9ERUZFUjsKLQlzaWdlbXB0eXNldCgmbmV3LnNhX21hc2spOwotCXNpZ2FjdGlvbihTSUdJTEwsICZuZXcsICZvbGQpOwotCi0JaWYgKHNldGptcChjbW92X3Rlc3RfcmV0dXJuKSA9PSAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZm9vID0gMDsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImNtb3Z6ICUwLCAlMSIgOiAiPXIiIChmb28pIDogIjAiIChmb28pKTsKLQkJcHJpbnRrKFVNX0tFUk5fQ09OVCAiWWVzXG4iKTsKLQl9IGVsc2UKLQkJcHJpbnRrKFVNX0tFUk5fQ09OVCAiTm9cbiIpOwotCi0Jc2lnYWN0aW9uKFNJR0lMTCwgJm9sZCwgJm5ldyk7Ci19Ci0KLXZvaWQgYXJjaF9leGFtaW5lX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgY2hhciB0bXBbMl07Ci0KLQkvKgotCSAqIFRoaXMgaXMgdGVzdGluZyBmb3IgYSBjbW92ICgweDBmIDB4NHgpIGluc3RydWN0aW9uIGNhdXNpbmcgYQotCSAqIFNJR0lMTCBpbiBpbml0LgotCSAqLwotCWlmICgoc2lnICE9IFNJR0lMTCkgfHwgKFRBU0tfUElEKGdldF9jdXJyZW50KCkpICE9IDEpKQotCQlyZXR1cm47Ci0KLQlpZiAoY29weV9mcm9tX3VzZXJfcHJvYyh0bXAsICh2b2lkICopIFVQVF9JUChyZWdzKSwgMikpIHsKLQkJcHJpbnRrKFVNX0tFUk5fRVJSICJTSUdJTEwgaW4gaW5pdCwgY291bGQgbm90IHJlYWQgIgotCQkgICAgICAgImluc3RydWN0aW9ucyFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCh0bXBbMF0gIT0gMHgwZikgfHwgKCh0bXBbMV0gJiAweGYwKSAhPSAweDQwKSkKLQkJcmV0dXJuOwotCi0JaWYgKGhvc3RfaGFzX2Ntb3YgPT0gMCkKLQkJcHJpbnRrKFVNX0tFUk5fRVJSICJTSUdJTEwgY2F1c2VkIGJ5IGNtb3YsIHdoaWNoIHRoaXMgIgotCQkgICAgICAgInByb2Nlc3NvciBkb2Vzbid0IGltcGxlbWVudC4gIEJvb3QgYSBmaWxlc3lzdGVtICIKLQkJICAgICAgICJjb21waWxlZCBmb3Igb2xkZXIgcHJvY2Vzc29ycyIpOwotCWVsc2UgaWYgKGhvc3RfaGFzX2Ntb3YgPT0gMSkKLQkJcHJpbnRrKFVNX0tFUk5fRVJSICJTSUdJTEwgY2F1c2VkIGJ5IGNtb3YsIHdoaWNoIHRoaXMgIgotCQkgICAgICAgInByb2Nlc3NvciBjbGFpbXMgdG8gaW1wbGVtZW50Iik7Ci0JZWxzZQotCQlwcmludGsoVU1fS0VSTl9FUlIgIkJhZCB2YWx1ZSBmb3IgaG9zdF9oYXNfY21vdiAoJWQpIiwKLQkJCWhvc3RfaGFzX2Ntb3YpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9rc3ltcy5jIGIvYXJjaC91bS9zeXMtaTM4Ni9rc3ltcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmJlZmQzLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYva3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI2luY2x1ZGUgImxpbnV4L21vZHVsZS5oIgotI2luY2x1ZGUgImFzbS9jaGVja3N1bS5oIgotCi0vKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLUVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvbGR0LmMgYi9hcmNoL3VtL3N5cy1pMzg2L2xkdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjJiZjIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvbGR0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2NfbW0uaCIKLSNpbmNsdWRlICJza2FzLmgiCi0jaW5jbHVkZSAic2thc19wdHJhY2UuaCIKLSNpbmNsdWRlICJzeXNkZXAvdGxzLmgiCi0KLWV4dGVybiBpbnQgbW9kaWZ5X2xkdChpbnQgZnVuYywgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCk7Ci0KLXN0YXRpYyBsb25nIHdyaXRlX2xkdF9lbnRyeShzdHJ1Y3QgbW1faWQgKm1tX2lkcCwgaW50IGZ1bmMsCi0JCSAgICAgc3RydWN0IHVzZXJfZGVzYyAqZGVzYywgdm9pZCAqKmFkZHIsIGludCBkb25lKQotewotCWxvbmcgcmVzOwotCi0JaWYgKHByb2NfbW0pIHsKLQkJLyoKLQkJICogVGhpcyBpcyBhIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBjYXNlLCB0aGF0IHRoZSBtbSB0bwotCQkgKiBtb2RpZnkgaXNuJ3QgY3VycmVudC0+YWN0aXZlX21tLgotCQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBkaXJlY3RseSBieSBtb2RpZnlfbGR0LAotCQkgKiAgICAgKGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5za2FzLnUgPT0gbW1faWRwKQotCQkgKiB3aWxsIGJlIHRydWUuIFNvIG5vIGNhbGwgdG8gX19zd2l0Y2hfbW0obW1faWRwKSBpcyBkb25lLgotCQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBpbiBjYXNlIG9mIGluaXRfbmV3X2xkdCBvciBQVFJBQ0VfTERULAotCQkgKiBtbV9pZHAgd29uJ3QgYmVsb25nIHRvIGN1cnJlbnQtPmFjdGl2ZV9tbSwgYnV0IGNoaWxkLT5tbS4KLQkJICogU28gd2UgbmVlZCB0byBzd2l0Y2ggY2hpbGQncyBtbSBpbnRvIG91ciB1c2Vyc3BhY2UsIHRoZW4KLQkJICogbGF0ZXIgc3dpdGNoIGJhY2suCi0JCSAqCi0JCSAqIE5vdGU6IEknbSB1bnN1cmU6IHNob3VsZCBpbnRlcnJ1cHRzIGJlIGRpc2FibGVkIGhlcmU/Ci0JCSAqLwotCQlpZiAoIWN1cnJlbnQtPmFjdGl2ZV9tbSB8fCBjdXJyZW50LT5hY3RpdmVfbW0gPT0gJmluaXRfbW0gfHwKLQkJICAgIG1tX2lkcCAhPSAmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LmlkKQotCQkJX19zd2l0Y2hfbW0obW1faWRwKTsKLQl9Ci0KLQlpZiAocHRyYWNlX2xkdCkgewotCQlzdHJ1Y3QgcHRyYWNlX2xkdCBsZHRfb3AgPSAoc3RydWN0IHB0cmFjZV9sZHQpIHsKLQkJCS5mdW5jID0gZnVuYywKLQkJCS5wdHIgPSBkZXNjLAotCQkJLmJ5dGVjb3VudCA9IHNpemVvZigqZGVzYyl9OwotCQl1MzIgY3B1OwotCQlpbnQgcGlkOwotCi0JCWlmICghcHJvY19tbSkKLQkJCXBpZCA9IG1tX2lkcC0+dS5waWQ7Ci0JCWVsc2UgewotCQkJY3B1ID0gZ2V0X2NwdSgpOwotCQkJcGlkID0gdXNlcnNwYWNlX3BpZFtjcHVdOwotCQl9Ci0KLQkJcmVzID0gb3NfcHRyYWNlX2xkdChwaWQsIDAsICh1bnNpZ25lZCBsb25nKSAmbGR0X29wKTsKLQotCQlpZiAocHJvY19tbSkKLQkJCXB1dF9jcHUoKTsKLQl9Ci0JZWxzZSB7Ci0JCXZvaWQgKnN0dWJfYWRkcjsKLQkJcmVzID0gc3lzY2FsbF9zdHViX2RhdGEobW1faWRwLCAodW5zaWduZWQgbG9uZyAqKWRlc2MsCi0JCQkJCShzaXplb2YoKmRlc2MpICsgc2l6ZW9mKGxvbmcpIC0gMSkgJgotCQkJCQkgICAgfihzaXplb2YobG9uZykgLSAxKSwKLQkJCQkJYWRkciwgJnN0dWJfYWRkcik7Ci0JCWlmICghcmVzKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgZnVuYywKLQkJCQkJCSAodW5zaWduZWQgbG9uZylzdHViX2FkZHIsCi0JCQkJCQkgc2l6ZW9mKCpkZXNjKSwKLQkJCQkJCSAwLCAwLCAwIH07Ci0JCQlyZXMgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgX19OUl9tb2RpZnlfbGR0LCBhcmdzLAotCQkJCQkgICAgICAgMCwgYWRkciwgZG9uZSk7Ci0JCX0KLQl9Ci0KLQlpZiAocHJvY19tbSkgewotCQkvKgotCQkgKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFydCBvZiBzcGVjaWFsIGhhbmRsaW5nLCB0aGF0IG1ha2VzCi0JCSAqIFBUUkFDRV9MRFQgcG9zc2libGUgdG8gaW1wbGVtZW50LgotCQkgKi8KLQkJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSAmJiBjdXJyZW50LT5hY3RpdmVfbW0gIT0gJmluaXRfbW0gJiYKLQkJICAgIG1tX2lkcCAhPSAmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LmlkKQotCQkJX19zd2l0Y2hfbW0oJmN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5pZCk7Ci0JfQotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGxvbmcgcmVhZF9sZHRfZnJvbV9ob3N0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKLXsKLQlpbnQgcmVzLCBuOwotCXN0cnVjdCBwdHJhY2VfbGR0IHB0cmFjZV9sZHQgPSAoc3RydWN0IHB0cmFjZV9sZHQpIHsKLQkJCS5mdW5jID0gMCwKLQkJCS5ieXRlY291bnQgPSBieXRlY291bnQsCi0JCQkucHRyID0ga21hbGxvYyhieXRlY291bnQsIEdGUF9LRVJORUwpfTsKLQl1MzIgY3B1OwotCi0JaWYgKHB0cmFjZV9sZHQucHRyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyoKLQkgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHN5c19tb2RpZnlfbGR0IG9ubHksIHNvIHVzZXJzcGFjZV9waWQgZ2l2ZXMKLQkgKiB1cyB0aGUgcmlnaHQgbnVtYmVyCi0JICovCi0KLQljcHUgPSBnZXRfY3B1KCk7Ci0JcmVzID0gb3NfcHRyYWNlX2xkdCh1c2Vyc3BhY2VfcGlkW2NwdV0sIDAsICh1bnNpZ25lZCBsb25nKSAmcHRyYWNlX2xkdCk7Ci0JcHV0X2NwdSgpOwotCWlmIChyZXMgPCAwKQotCQlnb3RvIG91dDsKLQotCW4gPSBjb3B5X3RvX3VzZXIocHRyLCBwdHJhY2VfbGR0LnB0ciwgcmVzKTsKLQlpZiAobiAhPSAwKQotCQlyZXMgPSAtRUZBVUxUOwotCi0gIG91dDoKLQlrZnJlZShwdHJhY2VfbGR0LnB0cik7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogSW4gc2thcyBtb2RlLCB3ZSBob2xkIG91ciBvd24gbGR0IGRhdGEgaW4gVU1MLgotICogVGh1cywgdGhlIGNvZGUgaW1wbGVtZW50aW5nIHN5c19tb2RpZnlfbGR0X3NrYXMKLSAqIGlzIHZlcnkgc2ltaWxhciB0byAoYW5kIG1vc3RseSBzdG9sZW4gZnJvbSkgc3lzX21vZGlmeV9sZHQKLSAqIGZvciBhcmNoL2kzODYva2VybmVsL2xkdC5jCi0gKiBUaGUgcm91dGluZXMgY29waWVkIGFuZCBtb2RpZmllZCBpbiBwYXJ0IGFyZToKLSAqIC0gcmVhZF9sZHQKLSAqIC0gcmVhZF9kZWZhdWx0X2xkdAotICogLSB3cml0ZV9sZHQKLSAqIC0gc3lzX21vZGlmeV9sZHRfc2thcwotICovCi0KLXN0YXRpYyBpbnQgcmVhZF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQotewotCWludCBpLCBlcnIgPSAwOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bWxfbGR0X3QgKiBsZHQgPSAmY3VycmVudC0+bW0tPmNvbnRleHQubGR0OwotCi0JaWYgKCFsZHQtPmVudHJ5X2NvdW50KQotCQlnb3RvIG91dDsKLQlpZiAoYnl0ZWNvdW50ID4gTERUX0VOVFJZX1NJWkUqTERUX0VOVFJJRVMpCi0JCWJ5dGVjb3VudCA9IExEVF9FTlRSWV9TSVpFKkxEVF9FTlRSSUVTOwotCWVyciA9IGJ5dGVjb3VudDsKLQotCWlmIChwdHJhY2VfbGR0KQotCQlyZXR1cm4gcmVhZF9sZHRfZnJvbV9ob3N0KHB0ciwgYnl0ZWNvdW50KTsKLQotCW11dGV4X2xvY2soJmxkdC0+bG9jayk7Ci0JaWYgKGxkdC0+ZW50cnlfY291bnQgPD0gTERUX0RJUkVDVF9FTlRSSUVTKSB7Ci0JCXNpemUgPSBMRFRfRU5UUllfU0laRSpMRFRfRElSRUNUX0VOVFJJRVM7Ci0JCWlmIChzaXplID4gYnl0ZWNvdW50KQotCQkJc2l6ZSA9IGJ5dGVjb3VudDsKLQkJaWYgKGNvcHlfdG9fdXNlcihwdHIsIGxkdC0+dS5lbnRyaWVzLCBzaXplKSkKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCWJ5dGVjb3VudCAtPSBzaXplOwotCQlwdHIgKz0gc2l6ZTsKLQl9Ci0JZWxzZSB7Ci0JCWZvciAoaT0wOyBpPGxkdC0+ZW50cnlfY291bnQvTERUX0VOVFJJRVNfUEVSX1BBR0UgJiYgYnl0ZWNvdW50OwotCQkgICAgIGkrKykgewotCQkJc2l6ZSA9IFBBR0VfU0laRTsKLQkJCWlmIChzaXplID4gYnl0ZWNvdW50KQotCQkJCXNpemUgPSBieXRlY291bnQ7Ci0JCQlpZiAoY29weV90b191c2VyKHB0ciwgbGR0LT51LnBhZ2VzW2ldLCBzaXplKSkgewotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlieXRlY291bnQgLT0gc2l6ZTsKLQkJCXB0ciArPSBzaXplOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmbGR0LT5sb2NrKTsKLQotCWlmIChieXRlY291bnQgPT0gMCB8fCBlcnIgPT0gLUVGQVVMVCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoY2xlYXJfdXNlcihwdHIsIGJ5dGVjb3VudCkpCi0JCWVyciA9IC1FRkFVTFQ7Ci0KLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHJlYWRfZGVmYXVsdF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQotewotCWludCBlcnI7Ci0KLQlpZiAoYnl0ZWNvdW50ID4gNSpMRFRfRU5UUllfU0laRSkKLQkJYnl0ZWNvdW50ID0gNSpMRFRfRU5UUllfU0laRTsKLQotCWVyciA9IGJ5dGVjb3VudDsKLQkvKgotCSAqIFVNTCBkb2Vzbid0IHN1cHBvcnQgbGNhbGw3IGFuZCBsY2FsbDI3LgotCSAqIFNvLCB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhIGRlZmF1bHQgbGR0LCBidXQgZW11bGF0ZQotCSAqIGFuIGVtcHR5IGxkdCBvZiBjb21tb24gaG9zdCBkZWZhdWx0IGxkdCBzaXplLgotCSAqLwotCWlmIChjbGVhcl91c2VyKHB0ciwgYnl0ZWNvdW50KSkKLQkJZXJyID0gLUVGQVVMVDsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfbGR0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCwgaW50IGZ1bmMpCi17Ci0JdW1sX2xkdF90ICogbGR0ID0gJmN1cnJlbnQtPm1tLT5jb250ZXh0LmxkdDsKLQlzdHJ1Y3QgbW1faWQgKiBtbV9pZHAgPSAmY3VycmVudC0+bW0tPmNvbnRleHQuaWQ7Ci0JaW50IGksIGVycjsKLQlzdHJ1Y3QgdXNlcl9kZXNjIGxkdF9pbmZvOwotCXN0cnVjdCBsZHRfZW50cnkgZW50cnkwLCAqbGR0X3A7Ci0Jdm9pZCAqYWRkciA9IE5VTEw7Ci0KLQllcnIgPSAtRUlOVkFMOwotCWlmIChieXRlY291bnQgIT0gc2l6ZW9mKGxkdF9pbmZvKSkKLQkJZ290byBvdXQ7Ci0JZXJyID0gLUVGQVVMVDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmxkdF9pbmZvLCBwdHIsIHNpemVvZihsZHRfaW5mbykpKQotCQlnb3RvIG91dDsKLQotCWVyciA9IC1FSU5WQUw7Ci0JaWYgKGxkdF9pbmZvLmVudHJ5X251bWJlciA+PSBMRFRfRU5UUklFUykKLQkJZ290byBvdXQ7Ci0JaWYgKGxkdF9pbmZvLmNvbnRlbnRzID09IDMpIHsKLQkJaWYgKGZ1bmMgPT0gMSkKLQkJCWdvdG8gb3V0OwotCQlpZiAobGR0X2luZm8uc2VnX25vdF9wcmVzZW50ID09IDApCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoIXB0cmFjZV9sZHQpCi0JCW11dGV4X2xvY2soJmxkdC0+bG9jayk7Ci0KLQllcnIgPSB3cml0ZV9sZHRfZW50cnkobW1faWRwLCBmdW5jLCAmbGR0X2luZm8sICZhZGRyLCAxKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF91bmxvY2s7Ci0JZWxzZSBpZiAocHRyYWNlX2xkdCkgewotCQkvKiBXaXRoIFBUUkFDRV9MRFQgYXZhaWxhYmxlLCB0aGlzIGlzIHVzZWQgYXMgYSBmbGFnIG9ubHkgKi8KLQkJbGR0LT5lbnRyeV9jb3VudCA9IDE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChsZHRfaW5mby5lbnRyeV9udW1iZXIgPj0gbGR0LT5lbnRyeV9jb3VudCAmJgotCSAgICBsZHRfaW5mby5lbnRyeV9udW1iZXIgPj0gTERUX0RJUkVDVF9FTlRSSUVTKSB7Ci0JCWZvciAoaT1sZHQtPmVudHJ5X2NvdW50L0xEVF9FTlRSSUVTX1BFUl9QQUdFOwotCQkgICAgIGkqTERUX0VOVFJJRVNfUEVSX1BBR0UgPD0gbGR0X2luZm8uZW50cnlfbnVtYmVyOwotCQkgICAgIGkrKykgewotCQkJaWYgKGkgPT0gMCkKLQkJCQltZW1jcHkoJmVudHJ5MCwgbGR0LT51LmVudHJpZXMsCi0JCQkJICAgICAgIHNpemVvZihlbnRyeTApKTsKLQkJCWxkdC0+dS5wYWdlc1tpXSA9IChzdHJ1Y3QgbGR0X2VudHJ5ICopCi0JCQkJX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUx8X19HRlBfWkVSTyk7Ci0JCQlpZiAoIWxkdC0+dS5wYWdlc1tpXSkgewotCQkJCWVyciA9IC1FTk9NRU07Ci0JCQkJLyogVW5kbyB0aGUgY2hhbmdlIGluIGhvc3QgKi8KLQkJCQltZW1zZXQoJmxkdF9pbmZvLCAwLCBzaXplb2YobGR0X2luZm8pKTsKLQkJCQl3cml0ZV9sZHRfZW50cnkobW1faWRwLCAxLCAmbGR0X2luZm8sICZhZGRyLCAxKTsKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9Ci0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJbWVtY3B5KGxkdC0+dS5wYWdlc1swXSwgJmVudHJ5MCwKLQkJCQkgICAgICAgc2l6ZW9mKGVudHJ5MCkpOwotCQkJCW1lbWNweShsZHQtPnUucGFnZXNbMF0rMSwgbGR0LT51LmVudHJpZXMrMSwKLQkJCQkgICAgICAgc2l6ZW9mKGVudHJ5MCkqKExEVF9ESVJFQ1RfRU5UUklFUy0xKSk7Ci0JCQl9Ci0JCQlsZHQtPmVudHJ5X2NvdW50ID0gKGkgKyAxKSAqIExEVF9FTlRSSUVTX1BFUl9QQUdFOwotCQl9Ci0JfQotCWlmIChsZHQtPmVudHJ5X2NvdW50IDw9IGxkdF9pbmZvLmVudHJ5X251bWJlcikKLQkJbGR0LT5lbnRyeV9jb3VudCA9IGxkdF9pbmZvLmVudHJ5X251bWJlciArIDE7Ci0KLQlpZiAobGR0LT5lbnRyeV9jb3VudCA8PSBMRFRfRElSRUNUX0VOVFJJRVMpCi0JCWxkdF9wID0gbGR0LT51LmVudHJpZXMgKyBsZHRfaW5mby5lbnRyeV9udW1iZXI7Ci0JZWxzZQotCQlsZHRfcCA9IGxkdC0+dS5wYWdlc1tsZHRfaW5mby5lbnRyeV9udW1iZXIvTERUX0VOVFJJRVNfUEVSX1BBR0VdICsKLQkJCWxkdF9pbmZvLmVudHJ5X251bWJlciVMRFRfRU5UUklFU19QRVJfUEFHRTsKLQotCWlmIChsZHRfaW5mby5iYXNlX2FkZHIgPT0gMCAmJiBsZHRfaW5mby5saW1pdCA9PSAwICYmCi0JICAgKGZ1bmMgPT0gMSB8fCBMRFRfZW1wdHkoJmxkdF9pbmZvKSkpIHsKLQkJbGR0X3AtPmEgPSAwOwotCQlsZHRfcC0+YiA9IDA7Ci0JfQotCWVsc2V7Ci0JCWlmIChmdW5jID09IDEpCi0JCQlsZHRfaW5mby51c2VhYmxlID0gMDsKLQkJbGR0X3AtPmEgPSBMRFRfZW50cnlfYSgmbGR0X2luZm8pOwotCQlsZHRfcC0+YiA9IExEVF9lbnRyeV9iKCZsZHRfaW5mbyk7Ci0JfQotCWVyciA9IDA7Ci0KLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZsZHQtPmxvY2spOwotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBsb25nIGRvX21vZGlmeV9sZHRfc2thcyhpbnQgZnVuYywgdm9pZCBfX3VzZXIgKnB0ciwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKLXsKLQlpbnQgcmV0ID0gLUVOT1NZUzsKLQotCXN3aXRjaCAoZnVuYykgewotCQljYXNlIDA6Ci0JCQlyZXQgPSByZWFkX2xkdChwdHIsIGJ5dGVjb3VudCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQljYXNlIDB4MTE6Ci0JCQlyZXQgPSB3cml0ZV9sZHQocHRyLCBieXRlY291bnQsIGZ1bmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCXJldCA9IHJlYWRfZGVmYXVsdF9sZHQocHRyLCBieXRlY291bnQpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG9zdF9sZHRfbG9jayk7Ci1zdGF0aWMgc2hvcnQgZHVtbXlfbGlzdFs5XSA9IHswLCAtMX07Ci1zdGF0aWMgc2hvcnQgKiBob3N0X2xkdF9lbnRyaWVzID0gTlVMTDsKLQotc3RhdGljIHZvaWQgbGR0X2dldF9ob3N0X2luZm8odm9pZCkKLXsKLQlsb25nIHJldDsKLQlzdHJ1Y3QgbGR0X2VudHJ5ICogbGR0OwotCXNob3J0ICp0bXA7Ci0JaW50IGksIHNpemUsIGssIG9yZGVyOwotCi0Jc3Bpbl9sb2NrKCZob3N0X2xkdF9sb2NrKTsKLQotCWlmIChob3N0X2xkdF9lbnRyaWVzICE9IE5VTEwpIHsKLQkJc3Bpbl91bmxvY2soJmhvc3RfbGR0X2xvY2spOwotCQlyZXR1cm47Ci0JfQotCWhvc3RfbGR0X2VudHJpZXMgPSBkdW1teV9saXN0KzE7Ci0KLQlzcGluX3VubG9jaygmaG9zdF9sZHRfbG9jayk7Ci0KLQlmb3IgKGkgPSBMRFRfUEFHRVNfTUFYLTEsIG9yZGVyPTA7IGk7IGk+Pj0xLCBvcmRlcisrKQotCQk7Ci0KLQlsZHQgPSAoc3RydWN0IGxkdF9lbnRyeSAqKQotCSAgICAgIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLCBvcmRlcik7Ci0JaWYgKGxkdCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibGR0X2dldF9ob3N0X2luZm86IGNvdWxkbid0IGFsbG9jYXRlIGJ1ZmZlciAiCi0JCSAgICAgICAiZm9yIGhvc3QgbGR0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXJldCA9IG1vZGlmeV9sZHQoMCwgbGR0LCAoMTw8b3JkZXIpKlBBR0VfU0laRSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsZHRfZ2V0X2hvc3RfaW5mbzogY291bGRuJ3QgcmVhZCBob3N0IGxkdFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCWlmIChyZXQgPT0gMCkgewotCQkvKiBkZWZhdWx0X2xkdCBpcyBhY3RpdmUsIHNpbXBseSB3cml0ZSBhbiBlbXB0eSBlbnRyeSAwICovCi0JCWhvc3RfbGR0X2VudHJpZXMgPSBkdW1teV9saXN0OwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWZvciAoaT0wLCBzaXplPTA7IGk8cmV0L0xEVF9FTlRSWV9TSVpFOyBpKyspIHsKLQkJaWYgKGxkdFtpXS5hICE9IDAgfHwgbGR0W2ldLmIgIT0gMCkKLQkJCXNpemUrKzsKLQl9Ci0KLQlpZiAoc2l6ZSA8IEFSUkFZX1NJWkUoZHVtbXlfbGlzdCkpCi0JCWhvc3RfbGR0X2VudHJpZXMgPSBkdW1teV9saXN0OwotCWVsc2UgewotCQlzaXplID0gKHNpemUgKyAxKSAqIHNpemVvZihkdW1teV9saXN0WzBdKTsKLQkJdG1wID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImxkdF9nZXRfaG9zdF9pbmZvOiBjb3VsZG4ndCBhbGxvY2F0ZSAiCi0JCQkgICAgICAgImhvc3QgbGR0IGxpc3RcbiIpOwotCQkJZ290byBvdXRfZnJlZTsKLQkJfQotCQlob3N0X2xkdF9lbnRyaWVzID0gdG1wOwotCX0KLQotCWZvciAoaT0wLCBrPTA7IGk8cmV0L0xEVF9FTlRSWV9TSVpFOyBpKyspIHsKLQkJaWYgKGxkdFtpXS5hICE9IDAgfHwgbGR0W2ldLmIgIT0gMCkKLQkJCWhvc3RfbGR0X2VudHJpZXNbaysrXSA9IGk7Ci0JfQotCWhvc3RfbGR0X2VudHJpZXNba10gPSAtMTsKLQotb3V0X2ZyZWU6Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylsZHQsIG9yZGVyKTsKLX0KLQotbG9uZyBpbml0X25ld19sZHQoc3RydWN0IG1tX2NvbnRleHQgKm5ld19tbSwgc3RydWN0IG1tX2NvbnRleHQgKmZyb21fbW0pCi17Ci0Jc3RydWN0IHVzZXJfZGVzYyBkZXNjOwotCXNob3J0ICogbnVtX3A7Ci0JaW50IGk7Ci0JbG9uZyBwYWdlLCBlcnI9MDsKLQl2b2lkICphZGRyID0gTlVMTDsKLQlzdHJ1Y3QgcHJvY19tbV9vcCBjb3B5OwotCi0KLQlpZiAoIXB0cmFjZV9sZHQpCi0JCW11dGV4X2luaXQoJm5ld19tbS0+bGR0LmxvY2spOwotCi0JaWYgKCFmcm9tX21tKSB7Ci0JCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKLQkJLyoKLQkJICogV2UgaGF2ZSB0byBpbml0aWFsaXplIGEgY2xlYW4gbGR0LgotCQkgKi8KLQkJaWYgKHByb2NfbW0pIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgbmV3IG1tIHdhcyBjcmVhdGVkIHVzaW5nIHByb2NfbW0sIGhvc3QncwotCQkJICogZGVmYXVsdC1sZHQgY3VycmVudGx5IGlzIGFzc2lnbmVkLCB3aGljaCBub3JtYWxseQotCQkJICogY29udGFpbnMgdGhlIGNhbGwtZ2F0ZXMgZm9yIGxjYWxsNyBhbmQgbGNhbGwyNy4KLQkJCSAqIFRvIHJlbW92ZSB0aGVzZSBnYXRlcywgd2Ugc2ltcGx5IHdyaXRlIGFuIGVtcHR5Ci0JCQkgKiBlbnRyeSBhcyBudW1iZXIgMCB0byB0aGUgaG9zdC4KLQkJCSAqLwotCQkJZXJyID0gd3JpdGVfbGR0X2VudHJ5KCZuZXdfbW0tPmlkLCAxLCAmZGVzYywgJmFkZHIsIDEpOwotCQl9Ci0JCWVsc2V7Ci0JCQkvKgotCQkJICogTm93IHdlIHRyeSB0byByZXRyaWV2ZSBpbmZvIGFib3V0IHRoZSBsZHQsIHdlCi0JCQkgKiBpbmhlcml0ZWQgZnJvbSB0aGUgaG9zdC4gQWxsIGxkdC1lbnRyaWVzIGZvdW5kCi0JCQkgKiB3aWxsIGJlIHJlc2V0IGluIHRoZSBmb2xsb3dpbmcgbG9vcAotCQkJICovCi0JCQlsZHRfZ2V0X2hvc3RfaW5mbygpOwotCQkJZm9yIChudW1fcD1ob3N0X2xkdF9lbnRyaWVzOyAqbnVtX3AgIT0gLTE7IG51bV9wKyspIHsKLQkJCQlkZXNjLmVudHJ5X251bWJlciA9ICpudW1fcDsKLQkJCQllcnIgPSB3cml0ZV9sZHRfZW50cnkoJm5ld19tbS0+aWQsIDEsICZkZXNjLAotCQkJCQkJICAgICAgJmFkZHIsICoobnVtX3AgKyAxKSA9PSAtMSk7Ci0JCQkJaWYgKGVycikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbmV3X21tLT5sZHQuZW50cnlfY291bnQgPSAwOwotCi0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChwcm9jX21tKSB7Ci0JCS8qCi0JCSAqIFdlIGhhdmUgYSB2YWxpZCBmcm9tX21tLCBzbyB3ZSBub3cgaGF2ZSB0byBjb3B5IHRoZSBMRFQgb2YKLQkJICogZnJvbV9tbSB0byBuZXdfbW0sIGJlY2F1c2UgdXNpbmcgcHJvY19tbSBhbiBuZXcgbW0gd2l0aAotCQkgKiBhbiBlbXB0eS9kZWZhdWx0IExEVCB3YXMgY3JlYXRlZCBpbiBuZXdfbW0oKQotCQkgKi8KLQkJY29weSA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wIAk9IE1NX0NPUFlfU0VHTUVOVFMsCi0JCQkJCSAgICAgIC51IAk9Ci0JCQkJCSAgICAgIHsgLmNvcHlfc2VnbWVudHMgPQotCQkJCQkJCWZyb21fbW0tPmlkLnUubW1fZmQgfSB9ICk7Ci0JCWkgPSBvc193cml0ZV9maWxlKG5ld19tbS0+aWQudS5tbV9mZCwgJmNvcHksIHNpemVvZihjb3B5KSk7Ci0JCWlmIChpICE9IHNpemVvZihjb3B5KSkKLQkJCXByaW50ayhLRVJOX0VSUiAibmV3X21tIDogL3Byb2MvbW0gY29weV9zZWdtZW50cyAiCi0JCQkgICAgICAgImZhaWxlZCwgZXJyID0gJWRcbiIsIC1pKTsKLQl9Ci0KLQlpZiAoIXB0cmFjZV9sZHQpIHsKLQkJLyoKLQkJICogT3VyIGxvY2FsIExEVCBpcyB1c2VkIHRvIHN1cHBseSB0aGUgZGF0YSBmb3IKLQkJICogbW9kaWZ5X2xkdChSRUFETERUKSwgaWYgUFRSQUNFX0xEVCBpc24ndCBhdmFpbGFibGUsCi0JCSAqIGkuZS4sIHdlIGhhdmUgdG8gdXNlIHRoZSBzdHViIGZvciBtb2RpZnlfbGR0LCB3aGljaAotCQkgKiBjYW4ndCBoYW5kbGUgdGhlIGJpZyByZWFkIGJ1ZmZlciBvZiB1cCB0byA2NGtCLgotCQkgKi8KLQkJbXV0ZXhfbG9jaygmZnJvbV9tbS0+bGR0LmxvY2spOwotCQlpZiAoZnJvbV9tbS0+bGR0LmVudHJ5X2NvdW50IDw9IExEVF9ESVJFQ1RfRU5UUklFUykKLQkJCW1lbWNweShuZXdfbW0tPmxkdC51LmVudHJpZXMsIGZyb21fbW0tPmxkdC51LmVudHJpZXMsCi0JCQkgICAgICAgc2l6ZW9mKG5ld19tbS0+bGR0LnUuZW50cmllcykpOwotCQllbHNlIHsKLQkJCWkgPSBmcm9tX21tLT5sZHQuZW50cnlfY291bnQgLyBMRFRfRU5UUklFU19QRVJfUEFHRTsKLQkJCXdoaWxlIChpLS0+MCkgewotCQkJCXBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPKTsKLQkJCQlpZiAoIXBhZ2UpIHsKLQkJCQkJZXJyID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW5ld19tbS0+bGR0LnUucGFnZXNbaV0gPQotCQkJCQkoc3RydWN0IGxkdF9lbnRyeSAqKSBwYWdlOwotCQkJCW1lbWNweShuZXdfbW0tPmxkdC51LnBhZ2VzW2ldLAotCQkJCSAgICAgICBmcm9tX21tLT5sZHQudS5wYWdlc1tpXSwgUEFHRV9TSVpFKTsKLQkJCX0KLQkJfQotCQluZXdfbW0tPmxkdC5lbnRyeV9jb3VudCA9IGZyb21fbW0tPmxkdC5lbnRyeV9jb3VudDsKLQkJbXV0ZXhfdW5sb2NrKCZmcm9tX21tLT5sZHQubG9jayk7Ci0JfQotCi0gICAgb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLQotdm9pZCBmcmVlX2xkdChzdHJ1Y3QgbW1fY29udGV4dCAqbW0pCi17Ci0JaW50IGk7Ci0KLQlpZiAoIXB0cmFjZV9sZHQgJiYgbW0tPmxkdC5lbnRyeV9jb3VudCA+IExEVF9ESVJFQ1RfRU5UUklFUykgewotCQlpID0gbW0tPmxkdC5lbnRyeV9jb3VudCAvIExEVF9FTlRSSUVTX1BFUl9QQUdFOwotCQl3aGlsZSAoaS0tID4gMCkKLQkJCWZyZWVfcGFnZSgobG9uZykgbW0tPmxkdC51LnBhZ2VzW2ldKTsKLQl9Ci0JbW0tPmxkdC5lbnRyeV9jb3VudCA9IDA7Ci19Ci0KLWludCBzeXNfbW9kaWZ5X2xkdChpbnQgZnVuYywgdm9pZCBfX3VzZXIgKnB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQpCi17Ci0JcmV0dXJuIGRvX21vZGlmeV9sZHRfc2thcyhmdW5jLCBwdHIsIGJ5dGVjb3VudCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3B0cmFjZS5jIGIvYXJjaC91bS9zeXMtaTM4Ni9wdHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3NWMyNy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3B0cmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSAibGludXgvbW0uaCIKLSNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgotI2luY2x1ZGUgImFzbS91YWNjZXNzLmgiCi0jaW5jbHVkZSAic2thcy5oIgotCi1leHRlcm4gaW50IGFyY2hfc3dpdGNoX3RscyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRvKTsKLQotdm9pZCBhcmNoX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRvKQotewotCWludCBlcnIgPSBhcmNoX3N3aXRjaF90bHModG8pOwotCWlmICghZXJyKQotCQlyZXR1cm47Ci0KLQlpZiAoZXJyICE9IC1FSU5WQUwpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFyY2hfc3dpdGNoX3RscyBmYWlsZWQsIGVycm5vICVkLCAiCi0JCSAgICAgICAibm90IEVJTlZBTFxuIiwgLWVycik7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmNoX3N3aXRjaF90bHMgZmFpbGVkLCBlcnJubyA9IEVJTlZBTFxuIik7Ci19Ci0KLWludCBpc19zeXNjYWxsKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQl1bnNpZ25lZCBzaG9ydCBpbnN0cjsKLQlpbnQgbjsKLQotCW4gPSBjb3B5X2Zyb21fdXNlcigmaW5zdHIsICh2b2lkIF9fdXNlciAqKSBhZGRyLCBzaXplb2YoaW5zdHIpKTsKLQlpZiAobikgewotCQkvKiBhY2Nlc3NfcHJvY2Vzc192bSgpIGdyYW50cyBhY2Nlc3MgdG8gdnN5c2NhbGwgYW5kIHN0dWIsCi0JCSAqIHdoaWxlIGNvcHlfZnJvbV91c2VyIGRvZXNuJ3QuIE1heWJlIGFjY2Vzc19wcm9jZXNzX3ZtIGlzCi0JCSAqIHNsb3csIGJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyLCBzaW5jZSBpdCB3aWxsIGJlIGNhbGxlZCBvbmx5Ci0JCSAqIGluIGNhc2Ugb2Ygc2luZ2xlc3RlcHBpbmcsIGlmIGNvcHlfZnJvbV91c2VyIGZhaWxlZC4KLQkJICovCi0JCW4gPSBhY2Nlc3NfcHJvY2Vzc192bShjdXJyZW50LCBhZGRyLCAmaW5zdHIsIHNpemVvZihpbnN0ciksIDApOwotCQlpZiAobiAhPSBzaXplb2YoaW5zdHIpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImlzX3N5c2NhbGwgOiBmYWlsZWQgdG8gcmVhZCAiCi0JCQkgICAgICAgImluc3RydWN0aW9uIGZyb20gMHglbHhcbiIsIGFkZHIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JLyogaW50IDB4ODAgb3Igc3lzZW50ZXIgKi8KLQlyZXR1cm4gKGluc3RyID09IDB4ODBjZCkgfHwgKGluc3RyID09IDB4MzQwZik7Ci19Ci0KLS8qIGRldGVybWluZXMgd2hpY2ggZmxhZ3MgdGhlIHVzZXIgaGFzIGFjY2VzcyB0by4gKi8KLS8qIDEgPSBhY2Nlc3MgMCA9IG5vIGFjY2VzcyAqLwotI2RlZmluZSBGTEFHX01BU0sgMHgwMDA0NGRkNQotCi1pbnQgcHV0cmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGludCByZWdubywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQlyZWdubyA+Pj0gMjsKLQlzd2l0Y2ggKHJlZ25vKSB7Ci0JY2FzZSBGUzoKLQkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCi0JCQlyZXR1cm4gLUVJTzsKLQkJUFRfUkVHU19GUygmY2hpbGQtPnRocmVhZC5yZWdzKSA9IHZhbHVlOwotCQlyZXR1cm4gMDsKLQljYXNlIEdTOgotCQlpZiAodmFsdWUgJiYgKHZhbHVlICYgMykgIT0gMykKLQkJCXJldHVybiAtRUlPOwotCQlQVF9SRUdTX0dTKCZjaGlsZC0+dGhyZWFkLnJlZ3MpID0gdmFsdWU7Ci0JCXJldHVybiAwOwotCWNhc2UgRFM6Ci0JY2FzZSBFUzoKLQkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCi0JCQlyZXR1cm4gLUVJTzsKLQkJdmFsdWUgJj0gMHhmZmZmOwotCQlicmVhazsKLQljYXNlIFNTOgotCWNhc2UgQ1M6Ci0JCWlmICgodmFsdWUgJiAzKSAhPSAzKQotCQkJcmV0dXJuIC1FSU87Ci0JCXZhbHVlICY9IDB4ZmZmZjsKLQkJYnJlYWs7Ci0JY2FzZSBFRkw6Ci0JCXZhbHVlICY9IEZMQUdfTUFTSzsKLQkJdmFsdWUgfD0gUFRfUkVHU19FRkxBR1MoJmNoaWxkLT50aHJlYWQucmVncyk7Ci0JCWJyZWFrOwotCX0KLQlQVF9SRUdTX1NFVCgmY2hpbGQtPnRocmVhZC5yZWdzLCByZWdubywgdmFsdWUpOwotCXJldHVybiAwOwotfQotCi1pbnQgcG9rZV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQotewotCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmIChhZGRyIDwgTUFYX1JFR19PRkZTRVQpCi0JCXJldHVybiBwdXRyZWcoY2hpbGQsIGFkZHIsIGRhdGEpOwotCWVsc2UgaWYgKChhZGRyID49IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzBdKSkgJiYKLQkJIChhZGRyIDw9IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzddKSkpIHsKLQkJYWRkciAtPSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSk7Ci0JCWFkZHIgPSBhZGRyID4+IDI7Ci0JCWlmICgoYWRkciA9PSA0KSB8fCAoYWRkciA9PSA1KSkKLQkJCXJldHVybiAtRUlPOwotCQljaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdID0gZGF0YTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlPOwotfQotCi11bnNpZ25lZCBsb25nIGdldHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgcmVnbm8pCi17Ci0JdW5zaWduZWQgbG9uZyByZXR2YWwgPSB+MFVMOwotCi0JcmVnbm8gPj49IDI7Ci0Jc3dpdGNoIChyZWdubykgewotCWNhc2UgRlM6Ci0JY2FzZSBHUzoKLQljYXNlIERTOgotCWNhc2UgRVM6Ci0JY2FzZSBTUzoKLQljYXNlIENTOgotCQlyZXR2YWwgPSAweGZmZmY7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JCXJldHZhbCAmPSBQVF9SRUcoJmNoaWxkLT50aHJlYWQucmVncywgcmVnbm8pOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KLWludCBwZWVrX3VzZXIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQl0bXAgPSAwOyAgLyogRGVmYXVsdCByZXR1cm4gY29uZGl0aW9uICovCi0JaWYgKGFkZHIgPCBNQVhfUkVHX09GRlNFVCkgewotCQl0bXAgPSBnZXRyZWcoY2hpbGQsIGFkZHIpOwotCX0KLQllbHNlIGlmICgoYWRkciA+PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSkpICYmCi0JCSAoYWRkciA8PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1s3XSkpKSB7Ci0JCWFkZHIgLT0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pOwotCQlhZGRyID0gYWRkciA+PiAyOwotCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdOwotCX0KLQlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2ZwcmVncyhzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKLXsKLQlpbnQgZXJyLCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0Jc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZnByZWdzOwotCi0JZXJyID0gc2F2ZV9mcF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLCAodW5zaWduZWQgbG9uZyAqKSAmZnByZWdzKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JbiA9IGNvcHlfdG9fdXNlcihidWYsICZmcHJlZ3MsIHNpemVvZihmcHJlZ3MpKTsKLQlpZihuID4gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGludCBzZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQotewotCWludCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0Jc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZnByZWdzOwotCi0JbiA9IGNvcHlfZnJvbV91c2VyKCZmcHJlZ3MsIGJ1Ziwgc2l6ZW9mKGZwcmVncykpOwotCWlmIChuID4gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmVzdG9yZV9mcF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLAotCQkJCSAgICAodW5zaWduZWQgbG9uZyAqKSAmZnByZWdzKTsKLX0KLQotc3RhdGljIGludCBnZXRfZnB4cmVncyhzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKLXsKLQlpbnQgZXJyLCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0Jc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgZnByZWdzOwotCi0JZXJyID0gc2F2ZV9mcHhfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwgKHVuc2lnbmVkIGxvbmcgKikgJmZwcmVncyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCW4gPSBjb3B5X3RvX3VzZXIoYnVmLCAmZnByZWdzLCBzaXplb2YoZnByZWdzKSk7Ci0JaWYobiA+IDApCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2ZweHJlZ3Moc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCi17Ci0JaW50IG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKLQlzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBmcHJlZ3M7Ci0KLQluID0gY29weV9mcm9tX3VzZXIoJmZwcmVncywgYnVmLCBzaXplb2YoZnByZWdzKSk7Ci0JaWYgKG4gPiAwKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiByZXN0b3JlX2ZweF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLAotCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgKikgJmZwcmVncyk7Ci19Ci0KLWxvbmcgc3ViYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LAotCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JaW50IHJldCA9IC1FSU87Ci0Jdm9pZCBfX3VzZXIgKmRhdGFwID0gKHZvaWQgX191c2VyICopIGRhdGE7Ci0Jc3dpdGNoIChyZXF1ZXN0KSB7Ci0JY2FzZSBQVFJBQ0VfR0VURlBSRUdTOiAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KLQkJcmV0ID0gZ2V0X2ZwcmVncyhkYXRhcCwgY2hpbGQpOwotCQlicmVhazsKLQljYXNlIFBUUkFDRV9TRVRGUFJFR1M6IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLwotCQlyZXQgPSBzZXRfZnByZWdzKGRhdGFwLCBjaGlsZCk7Ci0JCWJyZWFrOwotCWNhc2UgUFRSQUNFX0dFVEZQWFJFR1M6IC8qIEdldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLwotCQlyZXQgPSBnZXRfZnB4cmVncyhkYXRhcCwgY2hpbGQpOwotCQlicmVhazsKLQljYXNlIFBUUkFDRV9TRVRGUFhSRUdTOiAvKiBTZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KLQkJcmV0ID0gc2V0X2ZweHJlZ3MoZGF0YXAsIGNoaWxkKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTzsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvcHRyYWNlX3VzZXIuYyBiL2FyY2gvdW0vc3lzLWkzODYvcHRyYWNlX3VzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxMGMzZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3B0cmFjZV91c2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotCi1pbnQgcHRyYWNlX2dldHJlZ3MobG9uZyBwaWQsIHVuc2lnbmVkIGxvbmcgKnJlZ3Nfb3V0KQotewotCWlmIChwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgcmVnc19vdXQpIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHB0cmFjZV9zZXRyZWdzKGxvbmcgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQotewotCWlmIChwdHJhY2UoUFRSQUNFX1NFVFJFR1MsIHBpZCwgMCwgcmVncykgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL2JhcnJpZXIuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9iYXJyaWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OGQ1MmMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL2JhcnJpZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI2lmbmRlZiBfX1NZU0RFUF9JMzg2X0JBUlJJRVJfSAotI2RlZmluZSBfX1NZU0RFUF9JMzg2X0JBUlJJRVJfSAotCi0vKiBDb3BpZWQgZnJvbSBpbmNsdWRlL2FzbS1pMzg2IGZvciB1c2UgYnkgdXNlcnNwYWNlLiAgaTM4NiBoYXMgdGhlIG9wdGlvbgotICogb2YgdXNpbmcgbWZlbmNlLCBidXQgSSdtIGp1c3QgdXNpbmcgdGhpcywgd2hpY2ggd29ya3MgZXZlcnl3aGVyZSwgZm9yIG5vdy4KLSAqLwotI2RlZmluZSBtYigpIGFzbSB2b2xhdGlsZSgibG9jazsgYWRkbCAkMCwwKCVlc3ApIikKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvY2hlY2tzdW0uaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9jaGVja3N1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDQ3NDQ1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9jaGVja3N1bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19VTV9TWVNERVBfQ0hFQ0tTVU1fSAotI2RlZmluZSBfX1VNX1NZU0RFUF9DSEVDS1NVTV9ICi0KLSNpbmNsdWRlICJsaW51eC9pbjYuaCIKLSNpbmNsdWRlICJsaW51eC9zdHJpbmcuaCIKLQotLyoKLSAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAotICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKLSAqCi0gKiByZXR1cm5zIGEgMzItYml0IG51bWJlciBzdWl0YWJsZSBmb3IgZmVlZGluZyBpbnRvIGl0c2VsZgotICogb3IgY3N1bV90Y3B1ZHBfbWFnaWMKLSAqCi0gKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLCBleGNlcHQKLSAqIGZvciB0aGUgbGFzdCBmcmFnbWVudCwgd2hpY2ggbWF5IGJlIG9kZAotICoKLSAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQotICovCi1fX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwotCi0vKgotICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQotICoJcGFzc2VkIGluIGFuIGluY29ycmVjdCBrZXJuZWwgYWRkcmVzcyB0byBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLgotICoKLSAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlCi0gKglhY2Nlc3Nfb2soKS4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXwotX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCi0JCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pCi17Ci0JbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7Ci19Ci0KLS8qCi0gKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKLSAqIGNoZWNrc3VtcywgYW5kIGhhbmRsZXMgdXNlci1zcGFjZSBwb2ludGVyIGV4Y2VwdGlvbnMgY29ycmVjdGx5LCB3aGVuIG5lZWRlZC4KLSAqCi0gKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KLSAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5Ci0gKi8KLQotc3RhdGljIF9faW5saW5lX18KLV9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAotCQkJCQkgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQotewotCWlmIChjb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbGVuKSkgewotCQkqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0JCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7Ci0JfQotCi0JcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKLX0KLQotLyoKLSAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKLSAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCi0gKgotICoJQnkgSm9yZ2UgQ3dpayA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+LCBhZGFwdGVkIGZvciBsaW51eCBieQotICoJQXJudCBHdWxicmFuZHNlbi4KLSAqLwotc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCi17Ci0JdW5zaWduZWQgaW50IHN1bTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSAgICAibW92bCAoJTEpLCAlMAk7XG4iCi0JICAgICJzdWJsICQ0LCAlMgk7XG4iCi0JICAgICJqYmUgMmYJCTtcbiIKLQkgICAgImFkZGwgNCglMSksICUwCTtcbiIKLQkgICAgImFkY2wgOCglMSksICUwCTtcbiIKLQkgICAgImFkY2wgMTIoJTEpLCAlMAk7XG4iCi0iMToJICAgIGFkY2wgMTYoJTEpLCAlMAk7XG4iCi0JICAgICJsZWEgNCglMSksICUxCTtcbiIKLQkgICAgImRlY2wgJTIJCTtcbiIKLQkgICAgImpuZSAxYgkJO1xuIgotCSAgICAiYWRjbCAkMCwgJTAJO1xuIgotCSAgICAibW92bCAlMCwgJTIJO1xuIgotCSAgICAic2hybCAkMTYsICUwCTtcbiIKLQkgICAgImFkZHcgJXcyLCAldzAJO1xuIgotCSAgICAiYWRjbCAkMCwgJTAJO1xuIgotCSAgICAibm90bCAlMAkJO1xuIgotIjI6CQkJCTtcbiIKLQkvKiBTaW5jZSB0aGUgaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBsb2FkZWQgd2l0aCBpcGggYW5kIGlwbAotCSAgIGFyZSBtb2RpZmllZCwgd2UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlbSBhcyBvdXRwdXRzLCBvciBnY2MKLQkgICB3aWxsIGFzc3VtZSB0aGV5IGNvbnRhaW4gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLiAqLwotCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKQotCTogIjEiIChpcGgpLCAiMiIgKGlobCkKLQk6ICJtZW1vcnkiKTsKLQlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07Ci19Ci0KLS8qCi0gKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQotICovCi0KLXN0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKLXsKLQlfX2FzbV9fKAotCQkiYWRkbCAlMSwgJTAJCTtcbiIKLQkJImFkY2wgJDB4ZmZmZiwgJTAJO1xuIgotCQk6ICI9ciIgKHN1bSkKLQkJOiAiciIgKChfX2ZvcmNlIHUzMilzdW0gPDwgMTYpLAotCQkgICIwIiAoKF9fZm9yY2UgdTMyKXN1bSAmIDB4ZmZmZjAwMDApCi0JKTsKLQlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwotfQotCi1zdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIF9fd3N1bSBzdW0pCi17Ci0gICAgX19hc21fXygKLQkiYWRkbCAlMSwgJTAJO1xuIgotCSJhZGNsICUyLCAlMAk7XG4iCi0JImFkY2wgJTMsICUwCTtcbiIKLQkiYWRjbCAkMCwgJTAJO1xuIgotCTogIj1yIiAoc3VtKQotCTogImciIChkYWRkciksICJnIihzYWRkciksICJnIigobGVuICsgcHJvdG8pIDw8IDgpLCAiMCIoc3VtKSk7Ci0gICAgcmV0dXJuIHN1bTsKLX0KLQotLyoKLSAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCi0gKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAotICovCi1zdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIF9fd3N1bSBzdW0pCi17Ci0JcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwotfQotCi0vKgotICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQotICogaW4gaWNtcC5jCi0gKi8KLQotc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQotewotICAgIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKLX0KLQotI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgX193c3VtIHN1bSkKLXsKLQlfX2FzbV9fKAotCQkiYWRkbCAwKCUxKSwgJTAJCTtcbiIKLQkJImFkY2wgNCglMSksICUwCQk7XG4iCi0JCSJhZGNsIDgoJTEpLCAlMAkJO1xuIgotCQkiYWRjbCAxMiglMSksICUwCTtcbiIKLQkJImFkY2wgMCglMiksICUwCQk7XG4iCi0JCSJhZGNsIDQoJTIpLCAlMAkJO1xuIgotCQkiYWRjbCA4KCUyKSwgJTAJCTtcbiIKLQkJImFkY2wgMTIoJTIpLCAlMAk7XG4iCi0JCSJhZGNsICUzLCAlMAkJO1xuIgotCQkiYWRjbCAlNCwgJTAJCTtcbiIKLQkJImFkY2wgJDAsICUwCQk7XG4iCi0JCTogIj0mciIgKHN1bSkKLQkJOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksCi0JCSAgInIiKGh0b25sKGxlbikpLCAiciIoaHRvbmwocHJvdG8pKSwgIjAiKHN1bSkpOwotCi0JcmV0dXJuIGNzdW1fZm9sZChzdW0pOwotfQotCi0vKgotICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgotICovCi0jZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKLXN0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLAotCQkJCQkJICAgICB2b2lkIF9fdXNlciAqZHN0LAotCQkJCQkJICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCi17Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkgewotCQlpZiAoY29weV90b191c2VyKGRzdCwgc3JjLCBsZW4pKSB7Ci0JCQkqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0JCQlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOwotCQl9Ci0KLQkJcmV0dXJuIGNzdW1fcGFydGlhbChzcmMsIGxlbiwgc3VtKTsKLQl9Ci0KLQlpZiAobGVuKQotCQkqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0KLQlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCi19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmggYi9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDM3Y2MuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBGdWppdHN1IFNpZW1lbnMgQ29tcHV0ZXJzIEdtYkgKLSAqIEF1dGhvcjogQm9kbyBTdHJvZXNzZXIgPGJzdHJvZXNzZXJAZnVqaXRzdS1zaWVtZW5zLmNvbT4KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fRkFVTFRJTkZPX0kzODZfSAotI2RlZmluZSBfX0ZBVUxUSU5GT19JMzg2X0gKLQotLyogdGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZ1bGwgYXJjaC1zcGVjaWZpYyBmYXVsdGluZm8KLSAqIGZyb20gdGhlIHRyYXBzLgotICogT24gaTM4NiwgcHRyYWNlX2ZhdWx0aW5mbyB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QgcHJvdmlkZQotICogYWxsIHRoZSBpbmZvLCBzaW5jZSB0cmFwX25vIGlzIG1pc3NpbmcuCi0gKiBBbGwgY29tbW9uIGVsZW1lbnRzIGFyZSBkZWZpbmVkIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluCi0gKiBib3RoIHN0cnVjdHVyZXMsIHRodXMgbWFraW5nIGl0IGVhc3kgdG8gY29weSB0aGUKLSAqIGNvbnRlbnRzIHdpdGhvdXQga25vd2xlZGdlIGFib3V0IHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMuCi0gKi8KLXN0cnVjdCBmYXVsdGluZm8gewotICAgICAgICBpbnQgZXJyb3JfY29kZTsgLyogaW4gcHRyYWNlX2ZhdWx0aW5mbyBtaXNsZWFkaW5nbHkgY2FsbGVkIGlzX3dyaXRlICovCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgY3IyOyAvKiBpbiBwdHJhY2VfZmF1bHRpbmZvIGNhbGxlZCBhZGRyICovCi0gICAgICAgIGludCB0cmFwX25vOyAvKiBtaXNzaW5nIGluIHB0cmFjZV9mYXVsdGluZm8gKi8KLX07Ci0KLSNkZWZpbmUgRkFVTFRfV1JJVEUoZmkpICgoZmkpLmVycm9yX2NvZGUgJiAyKQotI2RlZmluZSBGQVVMVF9BRERSRVNTKGZpKSAoKGZpKS5jcjIpCi0KLSNkZWZpbmUgUFRSQUNFX0ZVTExfRkFVTFRJTkZPIDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvaG9zdF9sZHQuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9ob3N0X2xkdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTUzY2M0Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9ob3N0X2xkdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9IT1NUX0xEVF9JMzg2X0gKLSNkZWZpbmUgX19BU01fSE9TVF9MRFRfSTM4Nl9ICi0KLSNpbmNsdWRlIDxhc20vbGR0Lmg+Ci0KLS8qCi0gKiBtYWNyb3Mgc3RvbGVuIGZyb20gaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKLSAqLwotI2RlZmluZSBMRFRfZW50cnlfYShpbmZvKSBcCi0JKCgoKGluZm8pLT5iYXNlX2FkZHIgJiAweDAwMDBmZmZmKSA8PCAxNikgfCAoKGluZm8pLT5saW1pdCAmIDB4MGZmZmYpKQotCi0jZGVmaW5lIExEVF9lbnRyeV9iKGluZm8pIFwKLQkoKChpbmZvKS0+YmFzZV9hZGRyICYgMHhmZjAwMDAwMCkgfCBcCi0JKCgoaW5mbyktPmJhc2VfYWRkciAmIDB4MDBmZjAwMDApID4+IDE2KSB8IFwKLQkoKGluZm8pLT5saW1pdCAmIDB4ZjAwMDApIHwgXAotCSgoKGluZm8pLT5yZWFkX2V4ZWNfb25seSBeIDEpIDw8IDkpIHwgXAotCSgoaW5mbyktPmNvbnRlbnRzIDw8IDEwKSB8IFwKLQkoKChpbmZvKS0+c2VnX25vdF9wcmVzZW50IF4gMSkgPDwgMTUpIHwgXAotCSgoaW5mbyktPnNlZ18zMmJpdCA8PCAyMikgfCBcCi0JKChpbmZvKS0+bGltaXRfaW5fcGFnZXMgPDwgMjMpIHwgXAotCSgoaW5mbyktPnVzZWFibGUgPDwgMjApIHwgXAotCTB4NzAwMCkKLQotI2RlZmluZSBMRFRfZW1wdHkoaW5mbykgKFwKLQkoaW5mbyktPmJhc2VfYWRkcgk9PSAwCSYmIFwKLQkoaW5mbyktPmxpbWl0CQk9PSAwCSYmIFwKLQkoaW5mbyktPmNvbnRlbnRzCT09IDAJJiYgXAotCShpbmZvKS0+cmVhZF9leGVjX29ubHkJPT0gMQkmJiBcCi0JKGluZm8pLT5zZWdfMzJiaXQJPT0gMAkmJiBcCi0JKGluZm8pLT5saW1pdF9pbl9wYWdlcwk9PSAwCSYmIFwKLQkoaW5mbyktPnNlZ19ub3RfcHJlc2VudAk9PSAxCSYmIFwKLQkoaW5mbyktPnVzZWFibGUJCT09IDAJKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9wdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5OGE1MC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvcHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNERVBfSTM4Nl9QVFJBQ0VfSAotI2RlZmluZSBfX1NZU0RFUF9JMzg2X1BUUkFDRV9ICi0KLSNpbmNsdWRlICJ1c2VyX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKLQotI2RlZmluZSBNQVhfUkVHX05SIChVTV9GUkFNRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotI2RlZmluZSBNQVhfUkVHX09GRlNFVCAoVU1fRlJBTUVfU0laRSkKLQotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9kZWJ1Z3JlZ3MoaW50IHNlcSkge30KLQotLyogc3lzY2FsbCBlbXVsYXRpb24gcGF0aCBpbiBwdHJhY2UgKi8KLQotI2lmbmRlZiBQVFJBQ0VfU1lTRU1VCi0jZGVmaW5lIFBUUkFDRV9TWVNFTVUgMzEKLSNlbmRpZgotCi12b2lkIHNldF91c2luZ19zeXNlbXUoaW50IHZhbHVlKTsKLWludCBnZXRfdXNpbmdfc3lzZW11KHZvaWQpOwotZXh0ZXJuIGludCBzeXNlbXVfc3VwcG9ydGVkOwotCi0jaW5jbHVkZSAic2thc19wdHJlZ3MuaCIKLQotI2RlZmluZSBSRUdTX0lQKHIpICgocilbSE9TVF9JUF0pCi0jZGVmaW5lIFJFR1NfU1AocikgKChyKVtIT1NUX1NQXSkKLSNkZWZpbmUgUkVHU19FRkxBR1MocikgKChyKVtIT1NUX0VGTEFHU10pCi0jZGVmaW5lIFJFR1NfRUFYKHIpICgocilbSE9TVF9FQVhdKQotI2RlZmluZSBSRUdTX0VCWChyKSAoKHIpW0hPU1RfRUJYXSkKLSNkZWZpbmUgUkVHU19FQ1gocikgKChyKVtIT1NUX0VDWF0pCi0jZGVmaW5lIFJFR1NfRURYKHIpICgocilbSE9TVF9FRFhdKQotI2RlZmluZSBSRUdTX0VTSShyKSAoKHIpW0hPU1RfRVNJXSkKLSNkZWZpbmUgUkVHU19FREkocikgKChyKVtIT1NUX0VESV0pCi0jZGVmaW5lIFJFR1NfRUJQKHIpICgocilbSE9TVF9FQlBdKQotI2RlZmluZSBSRUdTX0NTKHIpICgocilbSE9TVF9DU10pCi0jZGVmaW5lIFJFR1NfU1MocikgKChyKVtIT1NUX1NTXSkKLSNkZWZpbmUgUkVHU19EUyhyKSAoKHIpW0hPU1RfRFNdKQotI2RlZmluZSBSRUdTX0VTKHIpICgocilbSE9TVF9FU10pCi0jZGVmaW5lIFJFR1NfRlMocikgKChyKVtIT1NUX0ZTXSkKLSNkZWZpbmUgUkVHU19HUyhyKSAoKHIpW0hPU1RfR1NdKQotCi0jZGVmaW5lIFJFR1NfU0VUX1NZU0NBTExfUkVUVVJOKHIsIHJlcykgUkVHU19FQVgocikgPSAocmVzKQotCi0jZGVmaW5lIFJFR1NfUkVTVEFSVF9TWVNDQUxMKHIpIElQX1JFU1RBUlRfU1lTQ0FMTChSRUdTX0lQKHIpKQotCi0jaWZuZGVmIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUAotI2RlZmluZSBQVFJBQ0VfU1lTRU1VX1NJTkdMRVNURVAgMzIKLSNlbmRpZgotCi1zdHJ1Y3QgdW1sX3B0X3JlZ3MgewotCXVuc2lnbmVkIGxvbmcgZ3BbTUFYX1JFR19OUl07Ci0JdW5zaWduZWQgbG9uZyBmcFtIT1NUX0ZQWF9TSVpFXTsKLQlzdHJ1Y3QgZmF1bHRpbmZvIGZhdWx0aW5mbzsKLQlsb25nIHN5c2NhbGw7Ci0JaW50IGlzX3VzZXI7Ci19OwotCi0jZGVmaW5lIEVNUFRZX1VNTF9QVF9SRUdTIHsgfQotCi0jZGVmaW5lIFVQVF9JUChyKSBSRUdTX0lQKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9TUChyKSBSRUdTX1NQKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9FRkxBR1MocikgUkVHU19FRkxBR1MoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0VBWChyKSBSRUdTX0VBWCgociktPmdwKQotI2RlZmluZSBVUFRfRUJYKHIpIFJFR1NfRUJYKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9FQ1gocikgUkVHU19FQ1goKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0VEWChyKSBSRUdTX0VEWCgociktPmdwKQotI2RlZmluZSBVUFRfRVNJKHIpIFJFR1NfRVNJKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9FREkocikgUkVHU19FREkoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0VCUChyKSBSRUdTX0VCUCgociktPmdwKQotI2RlZmluZSBVUFRfT1JJR19FQVgocikgKChyKS0+c3lzY2FsbCkKLSNkZWZpbmUgVVBUX0NTKHIpIFJFR1NfQ1MoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1NTKHIpIFJFR1NfU1MoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0RTKHIpIFJFR1NfRFMoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0VTKHIpIFJFR1NfRVMoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0ZTKHIpIFJFR1NfRlMoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0dTKHIpIFJFR1NfR1MoKHIpLT5ncCkKLQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkcxKHIpIFVQVF9FQlgocikKLSNkZWZpbmUgVVBUX1NZU0NBTExfQVJHMihyKSBVUFRfRUNYKHIpCi0jZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzMocikgVVBUX0VEWChyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc0KHIpIFVQVF9FU0kocikKLSNkZWZpbmUgVVBUX1NZU0NBTExfQVJHNShyKSBVUFRfRURJKHIpCi0jZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzYocikgVVBUX0VCUChyKQotCi1leHRlcm4gaW50IHVzZXJfY29udGV4dCh1bnNpZ25lZCBsb25nIHNwKTsKLQotI2RlZmluZSBVUFRfSVNfVVNFUihyKSAoKHIpLT5pc191c2VyKQotCi1zdHJ1Y3Qgc3lzY2FsbF9hcmdzIHsKLQl1bnNpZ25lZCBsb25nIGFyZ3NbNl07Ci19OwotCi0jZGVmaW5lIFNZU0NBTExfQVJHUyhyKSAoKHN0cnVjdCBzeXNjYWxsX2FyZ3MpIFwKLQkJCSB7IC5hcmdzID0geyBVUFRfU1lTQ0FMTF9BUkcxKHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkcyKHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkczKHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc0KHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc1KHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc2KHIpIH0gfSApCi0KLSNkZWZpbmUgVVBUX1JFRyhyZWdzLCByZWcpIFwKLQkoewl1bnNpZ25lZCBsb25nIHZhbDsgXAotCQlzd2l0Y2gocmVnKXsgXAotCQljYXNlIEVJUDogdmFsID0gVVBUX0lQKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIFVFU1A6IHZhbCA9IFVQVF9TUChyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFQVg6IHZhbCA9IFVQVF9FQVgocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgRUJYOiB2YWwgPSBVUFRfRUJYKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIEVDWDogdmFsID0gVVBUX0VDWChyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFRFg6IHZhbCA9IFVQVF9FRFgocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgRVNJOiB2YWwgPSBVUFRfRVNJKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIEVESTogdmFsID0gVVBUX0VESShyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFQlA6IHZhbCA9IFVQVF9FQlAocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgT1JJR19FQVg6IHZhbCA9IFVQVF9PUklHX0VBWChyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBDUzogdmFsID0gVVBUX0NTKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIFNTOiB2YWwgPSBVUFRfU1MocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgRFM6IHZhbCA9IFVQVF9EUyhyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFUzogdmFsID0gVVBUX0VTKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIEZTOiB2YWwgPSBVUFRfRlMocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgR1M6IHZhbCA9IFVQVF9HUyhyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFRkw6IHZhbCA9IFVQVF9FRkxBR1MocmVncyk7IGJyZWFrOyBcCi0JCWRlZmF1bHQgOiAgXAotCQkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBVUFRfUkVHIDogJWRcbiIsIHJlZyk7ICBcCi0JCQl2YWwgPSAtMTsgXAotCQl9IFwKLQkgICAgICAgIHZhbDsgXAotCX0pCi0KLSNkZWZpbmUgVVBUX1NFVChyZWdzLCByZWcsIHZhbCkgXAotCWRvIHsgXAotCQlzd2l0Y2gocmVnKXsgXAotCQljYXNlIEVJUDogVVBUX0lQKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIFVFU1A6IFVQVF9TUChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFQVg6IFVQVF9FQVgocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgRUJYOiBVUFRfRUJYKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIEVDWDogVVBUX0VDWChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFRFg6IFVQVF9FRFgocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgRVNJOiBVUFRfRVNJKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIEVESTogVVBUX0VESShyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFQlA6IFVQVF9FQlAocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgT1JJR19FQVg6IFVQVF9PUklHX0VBWChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBDUzogVVBUX0NTKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIFNTOiBVUFRfU1MocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgRFM6IFVQVF9EUyhyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFUzogVVBUX0VTKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIEZTOiBVUFRfRlMocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgR1M6IFVQVF9HUyhyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFRkw6IFVQVF9FRkxBR1MocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWRlZmF1bHQgOiAgXAotCQkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBVUFRfU0VUIDogJWRcbiIsIHJlZyk7ICBcCi0JCQlicmVhazsgXAotCQl9IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVQVF9TRVRfU1lTQ0FMTF9SRVRVUk4ociwgcmVzKSBcCi0JUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4oKHIpLT5yZWdzLCAocmVzKSkKLQotI2RlZmluZSBVUFRfUkVTVEFSVF9TWVNDQUxMKHIpIFJFR1NfUkVTVEFSVF9TWVNDQUxMKChyKS0+Z3ApCi0KLSNkZWZpbmUgVVBUX09SSUdfU1lTQ0FMTChyKSBVUFRfRUFYKHIpCi0jZGVmaW5lIFVQVF9TWVNDQUxMX05SKHIpIFVQVF9PUklHX0VBWChyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9SRVQocikgVVBUX0VBWChyKQotCi0jZGVmaW5lIFVQVF9GQVVMVElORk8ocikgKCYociktPmZhdWx0aW5mbykKLQotZXh0ZXJuIHZvaWQgYXJjaF9pbml0X3JlZ2lzdGVycyhpbnQgcGlkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvcHRyYWNlX3VzZXIuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9wdHJhY2VfdXNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU2MjQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9wdHJhY2VfdXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNERVBfSTM4Nl9QVFJBQ0VfVVNFUl9IX18KLSNkZWZpbmUgX19TWVNERVBfSTM4Nl9QVFJBQ0VfVVNFUl9IX18KLQotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSAidXNlcl9jb25zdGFudHMuaCIKLQotI2RlZmluZSBQVF9PRkZTRVQocikgKChyKSAqIHNpemVvZihsb25nKSkKLQotI2RlZmluZSBQVF9TWVNDQUxMX05SKHJlZ3MpICgocmVncylbT1JJR19FQVhdKQotI2RlZmluZSBQVF9TWVNDQUxMX05SX09GRlNFVCBQVF9PRkZTRVQoT1JJR19FQVgpCi0KLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkcxX09GRlNFVCBQVF9PRkZTRVQoRUJYKQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzJfT0ZGU0VUIFBUX09GRlNFVChFQ1gpCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHM19PRkZTRVQgUFRfT0ZGU0VUKEVEWCkKLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkc0X09GRlNFVCBQVF9PRkZTRVQoRVNJKQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzVfT0ZGU0VUIFBUX09GRlNFVChFREkpCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNl9PRkZTRVQgUFRfT0ZGU0VUKEVCUCkKLQotI2RlZmluZSBQVF9TWVNDQUxMX1JFVF9PRkZTRVQgUFRfT0ZGU0VUKEVBWCkKLQotI2RlZmluZSBSRUdTX1NZU0NBTExfTlIgRUFYIC8qIFRoaXMgaXMgdXNlZCBiZWZvcmUgYSBzeXN0ZW0gY2FsbCAqLwotI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMSBFQlgKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzIgRUNYCi0jZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkczIEVEWAotI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNCBFU0kKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzUgRURJCi0jZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkc2IEVCUAotCi0jZGVmaW5lIFJFR1NfSVBfSU5ERVggRUlQCi0jZGVmaW5lIFJFR1NfU1BfSU5ERVggVUVTUAotCi0jZGVmaW5lIFBUX0lQX09GRlNFVCBQVF9PRkZTRVQoRUlQKQotI2RlZmluZSBQVF9JUChyZWdzKSAoKHJlZ3MpW0VJUF0pCi0jZGVmaW5lIFBUX1NQX09GRlNFVCBQVF9PRkZTRVQoVUVTUCkKLSNkZWZpbmUgUFRfU1AocmVncykgKChyZWdzKVtVRVNQXSkKLQotI2RlZmluZSBGUF9TSVpFICgoSE9TVF9GUFhfU0laRSA+IEhPU1RfRlBfU0laRSkgPyBIT1NUX0ZQWF9TSVpFIDogSE9TVF9GUF9TSVpFKQotCi0jaWZuZGVmIEZSQU1FX1NJWkUKLSNkZWZpbmUgRlJBTUVfU0laRSAoMTcpCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc2MuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTdkMTc4Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI2lmbmRlZiBfX1NZU0RFUF9JMzg2X1NDX0gKLSNkZWZpbmUgX19TWVNERVBfSTM4Nl9TQ19ICi0KLSNpbmNsdWRlIDx1c2VyX2NvbnN0YW50cy5oPgotCi0jZGVmaW5lIFNDX09GRlNFVChzYywgZmllbGQpIFwKLQkqKCh1bnNpZ25lZCBsb25nICopICYoKChjaGFyICopIChzYykpW0hPU1RfIyNmaWVsZF0pKQotI2RlZmluZSBTQ19GUF9PRkZTRVQoc2MsIGZpZWxkKSBcCi0JKigodW5zaWduZWQgbG9uZyAqKSAmKCgoY2hhciAqKSAoU0NfRlBTVEFURShzYykpKVtIT1NUXyMjZmllbGRdKSkKLSNkZWZpbmUgU0NfRlBfT0ZGU0VUX1BUUihzYywgZmllbGQsIHR5cGUpIFwKLQkoKHR5cGUgKikgJigoKGNoYXIgKikgKFNDX0ZQU1RBVEUoc2MpKSlbSE9TVF8jI2ZpZWxkXSkpCi0KLSNkZWZpbmUgU0NfSVAoc2MpIFNDX09GRlNFVChzYywgU0NfSVApCi0jZGVmaW5lIFNDX1NQKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1NQKQotI2RlZmluZSBTQ19GUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19GUykKLSNkZWZpbmUgU0NfR1Moc2MpIFNDX09GRlNFVChzYywgU0NfR1MpCi0jZGVmaW5lIFNDX0RTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0RTKQotI2RlZmluZSBTQ19FUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19FUykKLSNkZWZpbmUgU0NfU1Moc2MpIFNDX09GRlNFVChzYywgU0NfU1MpCi0jZGVmaW5lIFNDX0NTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0NTKQotI2RlZmluZSBTQ19FRkxBR1Moc2MpIFNDX09GRlNFVChzYywgU0NfRUZMQUdTKQotI2RlZmluZSBTQ19FQVgoc2MpIFNDX09GRlNFVChzYywgU0NfRUFYKQotI2RlZmluZSBTQ19FQlgoc2MpIFNDX09GRlNFVChzYywgU0NfRUJYKQotI2RlZmluZSBTQ19FQ1goc2MpIFNDX09GRlNFVChzYywgU0NfRUNYKQotI2RlZmluZSBTQ19FRFgoc2MpIFNDX09GRlNFVChzYywgU0NfRURYKQotI2RlZmluZSBTQ19FREkoc2MpIFNDX09GRlNFVChzYywgU0NfRURJKQotI2RlZmluZSBTQ19FU0koc2MpIFNDX09GRlNFVChzYywgU0NfRVNJKQotI2RlZmluZSBTQ19FQlAoc2MpIFNDX09GRlNFVChzYywgU0NfRUJQKQotI2RlZmluZSBTQ19UUkFQTk8oc2MpIFNDX09GRlNFVChzYywgU0NfVFJBUE5PKQotI2RlZmluZSBTQ19FUlIoc2MpIFNDX09GRlNFVChzYywgU0NfRVJSKQotI2RlZmluZSBTQ19DUjIoc2MpIFNDX09GRlNFVChzYywgU0NfQ1IyKQotI2RlZmluZSBTQ19GUFNUQVRFKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0ZQU1RBVEUpCi0jZGVmaW5lIFNDX1NJR01BU0soc2MpIFNDX09GRlNFVChzYywgU0NfU0lHTUFTSykKLSNkZWZpbmUgU0NfRlBfQ1coc2MpIFNDX0ZQX09GRlNFVChzYywgU0NfRlBfQ1cpCi0jZGVmaW5lIFNDX0ZQX1NXKHNjKSBTQ19GUF9PRkZTRVQoc2MsIFNDX0ZQX1NXKQotI2RlZmluZSBTQ19GUF9UQUcoc2MpIFNDX0ZQX09GRlNFVChzYywgU0NfRlBfVEFHKQotI2RlZmluZSBTQ19GUF9JUE9GRihzYykgU0NfRlBfT0ZGU0VUKHNjLCBTQ19GUF9JUE9GRikKLSNkZWZpbmUgU0NfRlBfQ1NTRUwoc2MpIFNDX0ZQX09GRlNFVChzYywgU0NfRlBfQ1NTRUwpCi0jZGVmaW5lIFNDX0ZQX0RBVEFPRkYoc2MpIFNDX0ZQX09GRlNFVChzYywgU0NfRlBfREFUQU9GRikKLSNkZWZpbmUgU0NfRlBfREFUQVNFTChzYykgU0NfRlBfT0ZGU0VUKHNjLCBTQ19GUF9EQVRBU0VMKQotI2RlZmluZSBTQ19GUF9TVChzYykgU0NfRlBfT0ZGU0VUX1BUUihzYywgU0NfRlBfU1QsIHN0cnVjdCBfZnBzdGF0ZSkKLSNkZWZpbmUgU0NfRlhTUl9FTlYoc2MpIFNDX0ZQX09GRlNFVF9QVFIoc2MsIFNDX0ZYU1JfRU5WLCB2b2lkKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zaWdjb250ZXh0LmggYi9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc2lnY29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTgzYzg3Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zaWdjb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNfU0lHQ09OVEVYVF9JMzg2X0gKLSNkZWZpbmUgX19TWVNfU0lHQ09OVEVYVF9JMzg2X0gKLQotI2luY2x1ZGUgInN5c2RlcC9zYy5oIgotCi0jZGVmaW5lIElQX1JFU1RBUlRfU1lTQ0FMTChpcCkgKChpcCkgLT0gMikKLQotI2RlZmluZSBHRVRfRkFVTFRJTkZPX0ZST01fU0MoZmksIHNjKSBcCi0JeyBcCi0JCShmaSkuY3IyID0gU0NfQ1IyKHNjKTsgXAotCQkoZmkpLmVycm9yX2NvZGUgPSBTQ19FUlIoc2MpOyBcCi0JCShmaSkudHJhcF9ubyA9IFNDX1RSQVBOTyhzYyk7IFwKLQl9Ci0KLS8qIFRoaXMgaXMgUGFnZSBGYXVsdCAqLwotI2RlZmluZSBTRUdWX0lTX0ZJWEFCTEUoZmkpCSgoZmkpLT50cmFwX25vID09IDE0KQotCi0vKiBTS0FTMyBoYXMgbm8gdHJhcF9ubyBvbiBpMzg2LCBidXQgZ2V0X3NrYXNfZmF1bHRpbmZvKCkgc2V0cyBpdCB0byAwLiAqLwotI2RlZmluZSBTRUdWX01BWUJFX0ZJWEFCTEUoZmkpCSgoZmkpLT50cmFwX25vID09IDAgJiYgcHRyYWNlX2ZhdWx0aW5mbykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc2thc19wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjdiOGE3Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9JMzg2X1NLQVNfUFRSQUNFX0gKLSNkZWZpbmUgX19TWVNERVBfSTM4Nl9TS0FTX1BUUkFDRV9ICi0KLXN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvIHsKLSAgICAgICAgaW50IGlzX3dyaXRlOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci19OwotCi1zdHJ1Y3QgcHRyYWNlX2xkdCB7Ci0gICAgICAgIGludCBmdW5jOwotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50OwotfTsKLQotI2RlZmluZSBQVFJBQ0VfTERUIDU0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N0dWIuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zdHViLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3N2RlZGQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N0dWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9TVFVCX0gKLSNkZWZpbmUgX19TWVNERVBfU1RVQl9ICi0KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSAiYXMtbGF5b3V0LmgiCi0jaW5jbHVkZSAic3R1Yi1kYXRhLmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKLQotZXh0ZXJuIHZvaWQgc3R1Yl9zZWd2X2hhbmRsZXIoaW50IHNpZyk7Ci1leHRlcm4gdm9pZCBzdHViX2Nsb25lX2hhbmRsZXIodm9pZCk7Ci0KLSNkZWZpbmUgU1RVQl9TWVNDQUxMX1JFVCBFQVgKLSNkZWZpbmUgU1RVQl9NTUFQX05SIF9fTlJfbW1hcDIKLSNkZWZpbmUgTU1BUF9PRkZTRVQobykgKChvKSA+PiBVTV9LRVJOX1BBR0VfU0hJRlQpCi0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwwKGxvbmcgc3lzY2FsbCkKLXsKLQlsb25nIHJldDsKLQotCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCkpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDEobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlICgiaW50ICQweDgwIiA6ICI9YSIgKHJldCkgOiAiMCIgKHN5c2NhbGwpLCAiYiIgKGFyZzEpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwyKGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlICgiaW50ICQweDgwIiA6ICI9YSIgKHJldCkgOiAiMCIgKHN5c2NhbGwpLCAiYiIgKGFyZzEpLAotCQkJImMiIChhcmcyKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMyhsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlICgiaW50ICQweDgwIiA6ICI9YSIgKHJldCkgOiAiMCIgKHN5c2NhbGwpLCAiYiIgKGFyZzEpLAotCQkJImMiIChhcmcyKSwgImQiIChhcmczKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNChsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCi0JCQkJIGxvbmcgYXJnNCkKLXsKLQlsb25nIHJldDsKLQotCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSksCi0JCQkiYyIgKGFyZzIpLCAiZCIgKGFyZzMpLCAiUyIgKGFyZzQpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw1KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKLQkJCQkgbG9uZyBhcmc0LCBsb25nIGFyZzUpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlICgiaW50ICQweDgwIiA6ICI9YSIgKHJldCkgOiAiMCIgKHN5c2NhbGwpLCAiYiIgKGFyZzEpLAotCQkJImMiIChhcmcyKSwgImQiIChhcmczKSwgIlMiIChhcmc0KSwgIkQiIChhcmc1KSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhcF9teXNlbGYodm9pZCkKLXsKLQlfX2FzbSgiaW50MyIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVtYXBfc3RhY2soaW50IGZkLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlfX2FzbV9fIHZvbGF0aWxlICgibW92bCAlJWVheCwlJWVicCA7IG1vdmwgJTAsJSVlYXggOyBpbnQgJDB4ODAgOyIKLQkJCSAgIm1vdmwgJTcsICUlZWJ4IDsgbW92bCAlJWVheCwgKCUlZWJ4KSIKLQkJCSAgOiA6ICJnIiAoU1RVQl9NTUFQX05SKSwgImIiIChTVFVCX0RBVEEpLAotCQkJICAgICJjIiAoVU1fS0VSTl9QQUdFX1NJWkUpLAotCQkJICAgICJkIiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSksCi0JCQkgICAgIlMiIChNQVBfRklYRUQgfCBNQVBfU0hBUkVEKSwgIkQiIChmZCksCi0JCQkgICAgImEiIChvZmZzZXQpLAotCQkJICAgICJpIiAoJigoc3RydWN0IHN0dWJfZGF0YSAqKSBTVFVCX0RBVEEpLT5lcnIpCi0JCQkgIDogIm1lbW9yeSIpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zeXN0ZW0uaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiOTNjNC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1g4Nl9TWVNURU1fSF8KLSNkZWZpbmUgX0FTTV9YODZfU1lTVEVNX0hfCi0KLSNpbmNsdWRlIDxhc20vYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KLSNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgotI2luY2x1ZGUgPGFzbS9jbXB4Y2hnLmg+Ci0jaW5jbHVkZSA8YXNtL25vcHMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+Ci0KLS8qIGVudHJpZXMgaW4gQVJDSF9ETElORk86ICovCi0jaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0jIGRlZmluZSBBVF9WRUNUT1JfU0laRV9BUkNIIDIKLSNlbHNlCi0jIGRlZmluZSBBVF9WRUNUT1JfU0laRV9BUkNIIDEKLSNlbmRpZgotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3ApOwotCi12b2lkIGRlZmF1bHRfaWRsZSh2b2lkKTsKLQotLyoKLSAqIEZvcmNlIHN0cmljdCBDUFUgb3JkZXJpbmcuCi0gKiBBbmQgeWVzLCB0aGlzIGlzIHJlcXVpcmVkIG9uIFVQIHRvbyB3aGVuIHdlJ3JlIHRhbGtpbmcKLSAqIHRvIGRldmljZXMuCi0gKi8KLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0vKgotICogU29tZSBub24tSW50ZWwgY2xvbmVzIHN1cHBvcnQgb3V0IG9mIG9yZGVyIHN0b3JlLiB3bWIoKSBjZWFzZXMgdG8gYmUgYQotICogbm9wIGZvciB0aGVzZS4KLSAqLwotI2RlZmluZSBtYigpIGFsdGVybmF0aXZlKCJsb2NrOyBhZGRsICQwLDAoJSVlc3ApIiwgIm1mZW5jZSIsIFg4Nl9GRUFUVVJFX1hNTTIpCi0jZGVmaW5lIHJtYigpIGFsdGVybmF0aXZlKCJsb2NrOyBhZGRsICQwLDAoJSVlc3ApIiwgImxmZW5jZSIsIFg4Nl9GRUFUVVJFX1hNTTIpCi0jZGVmaW5lIHdtYigpIGFsdGVybmF0aXZlKCJsb2NrOyBhZGRsICQwLDAoJSVlc3ApIiwgInNmZW5jZSIsIFg4Nl9GRUFUVVJFX1hNTSkKLSNlbHNlCi0jZGVmaW5lIG1iKCkgCWFzbSB2b2xhdGlsZSgibWZlbmNlIjo6OiJtZW1vcnkiKQotI2RlZmluZSBybWIoKQlhc20gdm9sYXRpbGUoImxmZW5jZSI6OjoibWVtb3J5IikKLSNkZWZpbmUgd21iKCkJYXNtIHZvbGF0aWxlKCJzZmVuY2UiIDo6OiAibWVtb3J5IikKLSNlbmRpZgotCi0vKioKLSAqIHJlYWRfYmFycmllcl9kZXBlbmRzIC0gRmx1c2ggYWxsIHBlbmRpbmcgcmVhZHMgdGhhdCBzdWJzZXF1ZW50cyByZWFkcwotICogZGVwZW5kIG9uLgotICoKLSAqIE5vIGRhdGEtZGVwZW5kZW50IHJlYWRzIGZyb20gbWVtb3J5LWxpa2UgcmVnaW9ucyBhcmUgZXZlciByZW9yZGVyZWQKLSAqIG92ZXIgdGhpcyBiYXJyaWVyLiAgQWxsIHJlYWRzIHByZWNlZGluZyB0aGlzIHByaW1pdGl2ZSBhcmUgZ3VhcmFudGVlZAotICogdG8gYWNjZXNzIG1lbW9yeSAoYnV0IG5vdCBuZWNlc3NhcmlseSBvdGhlciBDUFVzJyBjYWNoZXMpIGJlZm9yZSBhbnkKLSAqIHJlYWRzIGZvbGxvd2luZyB0aGlzIHByaW1pdGl2ZSB0aGF0IGRlcGVuZCBvbiB0aGUgZGF0YSByZXR1cm4gYnkKLSAqIGFueSBvZiB0aGUgcHJlY2VkaW5nIHJlYWRzLiAgVGhpcyBwcmltaXRpdmUgaXMgbXVjaCBsaWdodGVyIHdlaWdodCB0aGFuCi0gKiBybWIoKSBvbiBtb3N0IENQVXMsIGFuZCBpcyBuZXZlciBoZWF2aWVyIHdlaWdodCB0aGFuIGlzCi0gKiBybWIoKS4KLSAqCi0gKiBUaGVzZSBvcmRlcmluZyBjb25zdHJhaW50cyBhcmUgcmVzcGVjdGVkIGJ5IGJvdGggdGhlIGxvY2FsIENQVQotICogYW5kIHRoZSBjb21waWxlci4KLSAqCi0gKiBPcmRlcmluZyBpcyBub3QgZ3VhcmFudGVlZCBieSBhbnl0aGluZyBvdGhlciB0aGFuIHRoZXNlIHByaW1pdGl2ZXMsCi0gKiBub3QgZXZlbiBieSBkYXRhIGRlcGVuZGVuY2llcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKLSAqIG1lbW9yeV9iYXJyaWVyKCkgZm9yIGV4YW1wbGVzIGFuZCBVUkxzIHRvIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBmb3JjZSBvcmRlcmluZyAodGhlIGluaXRpYWwKLSAqIHZhbHVlIG9mICJhIiBpcyB6ZXJvLCAiYiIgaXMgb25lLCBhbmQgInAiIGlzICImYSIpOgotICoKLSAqIDxwcm9ncmFtbGlzdGluZz4KLSAqCUNQVSAwCQkJCUNQVSAxCi0gKgotICoJYiA9IDI7Ci0gKgltZW1vcnlfYmFycmllcigpOwotICoJcCA9ICZiOwkJCQlxID0gcDsKLSAqCQkJCQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotICoJCQkJCWQgPSAqcTsKLSAqIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gKgotICogYmVjYXVzZSB0aGUgcmVhZCBvZiAiKnEiIGRlcGVuZHMgb24gdGhlIHJlYWQgb2YgInAiIGFuZCB0aGVzZQotICogdHdvIHJlYWRzIGFyZSBzZXBhcmF0ZWQgYnkgYSByZWFkX2JhcnJpZXJfZGVwZW5kcygpLiAgSG93ZXZlciwKLSAqIHRoZSBmb2xsb3dpbmcgY29kZSwgd2l0aCB0aGUgc2FtZSBpbml0aWFsIHZhbHVlcyBmb3IgImEiIGFuZCAiYiI6Ci0gKgotICogPHByb2dyYW1saXN0aW5nPgotICoJQ1BVIDAJCQkJQ1BVIDEKLSAqCi0gKglhID0gMjsKLSAqCW1lbW9yeV9iYXJyaWVyKCk7Ci0gKgliID0gMzsJCQkJeSA9IGI7Ci0gKgkJCQkJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKLSAqCQkJCQl4ID0gYTsKLSAqIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gKgotICogZG9lcyBub3QgZW5mb3JjZSBvcmRlcmluZywgc2luY2UgdGhlcmUgaXMgbm8gZGF0YSBkZXBlbmRlbmN5IGJldHdlZW4KLSAqIHRoZSByZWFkIG9mICJhIiBhbmQgdGhlIHJlYWQgb2YgImIiLiAgVGhlcmVmb3JlLCBvbiBzb21lIENQVXMsIHN1Y2gKLSAqIGFzIEFscGhhLCAieSIgY291bGQgYmUgc2V0IHRvIDMgYW5kICJ4IiB0byAwLiAgVXNlIHJtYigpCi0gKiBpbiBjYXNlcyBsaWtlIHRoaXMgd2hlcmUgdGhlcmUgYXJlIG5vIGRhdGEgZGVwZW5kZW5jaWVzLgotICoqLwotCi0jZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlICgwKQotCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBzbXBfbWIoKQltYigpCi0jaWZkZWYgQ09ORklHX1g4Nl9QUFJPX0ZFTkNFCi0jIGRlZmluZSBzbXBfcm1iKCkJcm1iKCkKLSNlbHNlCi0jIGRlZmluZSBzbXBfcm1iKCkJYmFycmllcigpCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfWDg2X09PU1RPUkUKLSMgZGVmaW5lIHNtcF93bWIoKSAJd21iKCkKLSNlbHNlCi0jIGRlZmluZSBzbXBfd21iKCkJYmFycmllcigpCi0jZW5kaWYKLSNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQotI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyAodm9pZCl4Y2hnKCZ2YXIsIHZhbHVlKTsgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfcm1iKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyB2YXIgPSB2YWx1ZTsgYmFycmllcigpOyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLS8qCi0gKiBTdG9wIFJEVFNDIHNwZWN1bGF0aW9uLiBUaGlzIGlzIG5lZWRlZCB3aGVuIHlvdSBuZWVkIHRvIHVzZSBSRFRTQwotICogKG9yIGdldF9jeWNsZXMgb3IgdnJlYWQgdGhhdCBwb3NzaWJseSBhY2Nlc3NlcyB0aGUgVFNDKSBpbiBhIGRlZmluZWQKLSAqIGNvZGUgcmVnaW9uLgotICoKLSAqIChDb3VsZCB1c2UgYW4gYWx0ZXJuYXRpdmUgdGhyZWUgd2F5IGZvciB0aGlzIGlmIHRoZXJlIHdhcyBvbmUuKQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmR0c2NfYmFycmllcih2b2lkKQotewotCWFsdGVybmF0aXZlKEFTTV9OT1AzLCAibWZlbmNlIiwgWDg2X0ZFQVRVUkVfTUZFTkNFX1JEVFNDKTsKLQlhbHRlcm5hdGl2ZShBU01fTk9QMywgImxmZW5jZSIsIFg4Nl9GRUFUVVJFX0xGRU5DRV9SRFRTQyk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3Rscy5oIGIvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3Rscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU1MDc1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC90bHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSNpZm5kZWYgX1NZU0RFUF9UTFNfSAotI2RlZmluZSBfU1lTREVQX1RMU19ICi0KLSMgaWZuZGVmIF9fS0VSTkVMX18KLQotLyogQ2hhbmdlIG5hbWUgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIG9yaWdpbmFsIG9uZSBmcm9tIDxhc20vbGR0Lmg+LCB3aGljaAotICogbWF5IGJlIG5hbWVkIHVzZXJfZGVzYyAoYnV0IGluIDIuNCBhbmQgaW4gaGVhZGVyIG1hdGNoaW5nIGl0cyBBUEkgd2FzIG5hbWVkCi0gKiBtb2RpZnlfbGR0X2xkdF9zKS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdW1fZHVwX3VzZXJfZGVzYyB7Ci0JdW5zaWduZWQgaW50ICBlbnRyeV9udW1iZXI7Ci0JdW5zaWduZWQgaW50ICBiYXNlX2FkZHI7Ci0JdW5zaWduZWQgaW50ICBsaW1pdDsKLQl1bnNpZ25lZCBpbnQgIHNlZ18zMmJpdDoxOwotCXVuc2lnbmVkIGludCAgY29udGVudHM6MjsKLQl1bnNpZ25lZCBpbnQgIHJlYWRfZXhlY19vbmx5OjE7Ci0JdW5zaWduZWQgaW50ICBsaW1pdF9pbl9wYWdlczoxOwotCXVuc2lnbmVkIGludCAgc2VnX25vdF9wcmVzZW50OjE7Ci0JdW5zaWduZWQgaW50ICB1c2VhYmxlOjE7Ci19IHVzZXJfZGVzY190OwotCi0jIGVsc2UgLyogX19LRVJORUxfXyAqLwotCi0jICBpbmNsdWRlIDxsZHQuaD4KLXR5cGVkZWYgc3RydWN0IHVzZXJfZGVzYyB1c2VyX2Rlc2NfdDsKLQotIyBlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNkZWZpbmUgR0RUX0VOVFJZX1RMU19NSU5fSTM4NiA2Ci0jZGVmaW5lIEdEVF9FTlRSWV9UTFNfTUlOX1g4Nl82NCAxMgotCi0jZW5kaWYgLyogX1NZU0RFUF9UTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3ZtLWZsYWdzLmggYi9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvdm0tZmxhZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkMjRjNS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvdm0tZmxhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVk1fRkxBR1NfSTM4Nl9ICi0jZGVmaW5lIF9fVk1fRkxBR1NfSTM4Nl9ICi0KLSNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTIFwKLQkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgXAotCSgoY3VycmVudC0+cGVyc29uYWxpdHkgJiBSRUFEX0lNUExJRVNfRVhFQykgPyBWTV9FWEVDIDogMCApIHwgXAotCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jIGIvYXJjaC91bS9zeXMtaTM4Ni9zaWduYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhNDY2Mi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+Ci0jaW5jbHVkZSAiZnJhbWVfa2Vybi5oIgotI2luY2x1ZGUgInNrYXMuaCIKLQotdm9pZCBjb3B5X3NjKHN0cnVjdCB1bWxfcHRfcmVncyAqcmVncywgdm9pZCAqZnJvbSkKLXsKLQlzdHJ1Y3Qgc2lnY29udGV4dCAqc2MgPSBmcm9tOwotCi0JUkVHU19HUyhyZWdzLT5ncCkgPSBzYy0+Z3M7Ci0JUkVHU19GUyhyZWdzLT5ncCkgPSBzYy0+ZnM7Ci0JUkVHU19FUyhyZWdzLT5ncCkgPSBzYy0+ZXM7Ci0JUkVHU19EUyhyZWdzLT5ncCkgPSBzYy0+ZHM7Ci0JUkVHU19FREkocmVncy0+Z3ApID0gc2MtPmRpOwotCVJFR1NfRVNJKHJlZ3MtPmdwKSA9IHNjLT5zaTsKLQlSRUdTX0VCUChyZWdzLT5ncCkgPSBzYy0+YnA7Ci0JUkVHU19TUChyZWdzLT5ncCkgPSBzYy0+c3A7Ci0JUkVHU19FQlgocmVncy0+Z3ApID0gc2MtPmJ4OwotCVJFR1NfRURYKHJlZ3MtPmdwKSA9IHNjLT5keDsKLQlSRUdTX0VDWChyZWdzLT5ncCkgPSBzYy0+Y3g7Ci0JUkVHU19FQVgocmVncy0+Z3ApID0gc2MtPmF4OwotCVJFR1NfSVAocmVncy0+Z3ApID0gc2MtPmlwOwotCVJFR1NfQ1MocmVncy0+Z3ApID0gc2MtPmNzOwotCVJFR1NfRUZMQUdTKHJlZ3MtPmdwKSA9IHNjLT5mbGFnczsKLQlSRUdTX1NTKHJlZ3MtPmdwKSA9IHNjLT5zczsKLX0KLQotLyoKLSAqIEZQVSB0YWcgd29yZCBjb252ZXJzaW9ucy4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHR3ZF9pMzg3X3RvX2Z4c3IodW5zaWduZWQgc2hvcnQgdHdkKQotewotCXVuc2lnbmVkIGludCB0bXA7IC8qIHRvIGF2b2lkIDE2IGJpdCBwcmVmaXhlcyBpbiB0aGUgY29kZSAqLwotCi0JLyogVHJhbnNmb3JtIGVhY2ggcGFpciBvZiBiaXRzIGludG8gMDEgKHZhbGlkKSBvciAwMCAoZW1wdHkpICovCi0JdG1wID0gfnR3ZDsKLQl0bXAgPSAodG1wIHwgKHRtcD4+MSkpICYgMHg1NTU1OyAvKiAwVjBWMFYwVjBWMFYwVjBWICovCi0JLyogYW5kIG1vdmUgdGhlIHZhbGlkIGJpdHMgdG8gdGhlIGxvd2VyIGJ5dGUuICovCi0JdG1wID0gKHRtcCB8ICh0bXAgPj4gMSkpICYgMHgzMzMzOyAvKiAwMFZWMDBWVjAwVlYwMFZWICovCi0JdG1wID0gKHRtcCB8ICh0bXAgPj4gMikpICYgMHgwZjBmOyAvKiAwMDAwVlZWVjAwMDBWVlZWICovCi0JdG1wID0gKHRtcCB8ICh0bXAgPj4gNCkpICYgMHgwMGZmOyAvKiAwMDAwMDAwMFZWVlZWVlZWICovCi0JcmV0dXJuIHRtcDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHR3ZF9meHNyX3RvX2kzODcoc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgKmZ4c2F2ZSkKLXsKLQlzdHJ1Y3QgX2ZweHJlZyAqc3QgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgdHdkID0gKHVuc2lnbmVkIGxvbmcpIGZ4c2F2ZS0+dHdkOwotCXVuc2lnbmVkIGxvbmcgdGFnOwotCXVuc2lnbmVkIGxvbmcgcmV0ID0gMHhmZmZmMDAwMDsKLQlpbnQgaTsKLQotI2RlZmluZSBGUFJFR19BRERSKGYsIG4pCSgoY2hhciAqKSYoZiktPnN0X3NwYWNlICsgKG4pICogMTYpCi0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmICh0d2QgJiAweDEpIHsKLQkJCXN0ID0gKHN0cnVjdCBfZnB4cmVnICopIEZQUkVHX0FERFIoZnhzYXZlLCBpKTsKLQotCQkJc3dpdGNoIChzdC0+ZXhwb25lbnQgJiAweDdmZmYpIHsKLQkJCWNhc2UgMHg3ZmZmOgotCQkJCXRhZyA9IDI7CQkvKiBTcGVjaWFsICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MDAwMDoKLQkJCQlpZiAoICFzdC0+c2lnbmlmaWNhbmRbMF0gJiYKLQkJCQkgICAgICFzdC0+c2lnbmlmaWNhbmRbMV0gJiYKLQkJCQkgICAgICFzdC0+c2lnbmlmaWNhbmRbMl0gJiYKLQkJCQkgICAgICFzdC0+c2lnbmlmaWNhbmRbM10gKSB7Ci0JCQkJCXRhZyA9IDE7CS8qIFplcm8gKi8KLQkJCQl9IGVsc2UgewotCQkJCQl0YWcgPSAyOwkvKiBTcGVjaWFsICovCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAoc3QtPnNpZ25pZmljYW5kWzNdICYgMHg4MDAwKSB7Ci0JCQkJCXRhZyA9IDA7CS8qIFZhbGlkICovCi0JCQkJfSBlbHNlIHsKLQkJCQkJdGFnID0gMjsJLyogU3BlY2lhbCAqLwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRhZyA9IDM7CQkJLyogRW1wdHkgKi8KLQkJfQotCQlyZXQgfD0gKHRhZyA8PCAoMiAqIGkpKTsKLQkJdHdkID0gdHdkID4+IDE7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY29udmVydF9meHNyX3RvX3VzZXIoc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmLAotCQkJCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0ICpmeHNhdmUpCi17Ci0JdW5zaWduZWQgbG9uZyBlbnZbN107Ci0Jc3RydWN0IF9mcHJlZyBfX3VzZXIgKnRvOwotCXN0cnVjdCBfZnB4cmVnICpmcm9tOwotCWludCBpOwotCi0JZW52WzBdID0gKHVuc2lnbmVkIGxvbmcpZnhzYXZlLT5jd2QgfCAweGZmZmYwMDAwdWw7Ci0JZW52WzFdID0gKHVuc2lnbmVkIGxvbmcpZnhzYXZlLT5zd2QgfCAweGZmZmYwMDAwdWw7Ci0JZW52WzJdID0gdHdkX2Z4c3JfdG9faTM4NyhmeHNhdmUpOwotCWVudlszXSA9IGZ4c2F2ZS0+ZmlwOwotCWVudls0XSA9IGZ4c2F2ZS0+ZmNzIHwgKCh1bnNpZ25lZCBsb25nKWZ4c2F2ZS0+Zm9wIDw8IDE2KTsKLQllbnZbNV0gPSBmeHNhdmUtPmZvbzsKLQllbnZbNl0gPSBmeHNhdmUtPmZvczsKLQotCWlmIChfX2NvcHlfdG9fdXNlcihidWYsIGVudiwgNyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCi0JCXJldHVybiAxOwotCi0JdG8gPSAmYnVmLT5fc3RbMF07Ci0JZnJvbSA9IChzdHJ1Y3QgX2ZweHJlZyAqKSAmZnhzYXZlLT5zdF9zcGFjZVswXTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCB0bysrLCBmcm9tKyspIHsKLQkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnQgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKil0bzsKLQkJdW5zaWduZWQgbG9uZyAqZiA9ICh1bnNpZ25lZCBsb25nICopZnJvbTsKLQotCQlpZiAoX19wdXRfdXNlcigqZiwgdCkgfHwKLQkJCQlfX3B1dF91c2VyKCooZiArIDEpLCB0ICsgMSkgfHwKLQkJCQlfX3B1dF91c2VyKGZyb20tPmV4cG9uZW50LCAmdG8tPmV4cG9uZW50KSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjb252ZXJ0X2Z4c3JfZnJvbV91c2VyKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0ICpmeHNhdmUsCi0JCQkJICBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWYpCi17Ci0JdW5zaWduZWQgbG9uZyBlbnZbN107Ci0Jc3RydWN0IF9mcHhyZWcgKnRvOwotCXN0cnVjdCBfZnByZWcgX191c2VyICpmcm9tOwotCWludCBpOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCBlbnYsIGJ1ZiwgNyAqIHNpemVvZihsb25nKSkpCi0JCXJldHVybiAxOwotCi0JZnhzYXZlLT5jd2QgPSAodW5zaWduZWQgc2hvcnQpKGVudlswXSAmIDB4ZmZmZik7Ci0JZnhzYXZlLT5zd2QgPSAodW5zaWduZWQgc2hvcnQpKGVudlsxXSAmIDB4ZmZmZik7Ci0JZnhzYXZlLT50d2QgPSB0d2RfaTM4N190b19meHNyKCh1bnNpZ25lZCBzaG9ydCkoZW52WzJdICYgMHhmZmZmKSk7Ci0JZnhzYXZlLT5maXAgPSBlbnZbM107Ci0JZnhzYXZlLT5mb3AgPSAodW5zaWduZWQgc2hvcnQpKChlbnZbNF0gJiAweGZmZmYwMDAwdWwpID4+IDE2KTsKLQlmeHNhdmUtPmZjcyA9IChlbnZbNF0gJiAweGZmZmYpOwotCWZ4c2F2ZS0+Zm9vID0gZW52WzVdOwotCWZ4c2F2ZS0+Zm9zID0gZW52WzZdOwotCi0JdG8gPSAoc3RydWN0IF9mcHhyZWcgKikgJmZ4c2F2ZS0+c3Rfc3BhY2VbMF07Ci0JZnJvbSA9ICZidWYtPl9zdFswXTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCB0bysrLCBmcm9tKyspIHsKLQkJdW5zaWduZWQgbG9uZyAqdCA9ICh1bnNpZ25lZCBsb25nICopdG87Ci0JCXVuc2lnbmVkIGxvbmcgX191c2VyICpmID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopZnJvbTsKLQotCQlpZiAoX19nZXRfdXNlcigqdCwgZikgfHwKLQkJICAgIF9fZ2V0X3VzZXIoKih0ICsgMSksIGYgKyAxKSB8fAotCQkgICAgX19nZXRfdXNlcih0by0+ZXhwb25lbnQsICZmcm9tLT5leHBvbmVudCkpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBpbnQgaGF2ZV9mcHhfcmVnczsKLQotc3RhdGljIGludCBjb3B5X3NjX2Zyb21fdXNlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCSAgICAgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpmcm9tKQotewotCXN0cnVjdCBzaWdjb250ZXh0IHNjOwotCWludCBlcnIsIHBpZDsKLQotCWVyciA9IGNvcHlfZnJvbV91c2VyKCZzYywgZnJvbSwgc2l6ZW9mKHNjKSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXBpZCA9IHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdOwotCWNvcHlfc2MoJnJlZ3MtPnJlZ3MsICZzYyk7Ci0JaWYgKGhhdmVfZnB4X3JlZ3MpIHsKLQkJc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgZnB4OwotCi0JCWVyciA9IGNvcHlfZnJvbV91c2VyKCZmcHgsCi0JCQkmKChzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICopc2MuZnBzdGF0ZSktPl9meHNyX2VudlswXSwKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCkpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIDE7Ci0KLQkJZXJyID0gY29udmVydF9meHNyX2Zyb21fdXNlcigmZnB4LCBzYy5mcHN0YXRlKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiAxOwotCi0JCWVyciA9IHJlc3RvcmVfZnB4X3JlZ2lzdGVycyhwaWQsICh1bnNpZ25lZCBsb25nICopICZmcHgpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX2Zyb21fdXNlciAtICIKLQkJCSAgICAgICAicmVzdG9yZV9mcHhfcmVnaXN0ZXJzIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKLQkJCSAgICAgICAtZXJyKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCWVsc2UgewotCQlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcDsKLQotCQllcnIgPSBjb3B5X2Zyb21fdXNlcigmZnAsIHNjLmZwc3RhdGUsCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiAxOwotCi0JCWVyciA9IHJlc3RvcmVfZnBfcmVnaXN0ZXJzKHBpZCwgKHVuc2lnbmVkIGxvbmcgKikgJmZwKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiY29weV9zY19mcm9tX3VzZXIgLSAiCi0JCQkgICAgICAgInJlc3RvcmVfZnBfcmVnaXN0ZXJzIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKLQkJCSAgICAgICAtZXJyKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29weV9zY190b191c2VyKHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdG8sCi0JCQkgICBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICp0b19mcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgICB1bnNpZ25lZCBsb25nIHNwKQotewotCXN0cnVjdCBzaWdjb250ZXh0IHNjOwotCXN0cnVjdCBmYXVsdGluZm8gKiBmaSA9ICZjdXJyZW50LT50aHJlYWQuYXJjaC5mYXVsdGluZm87Ci0JaW50IGVyciwgcGlkOwotCi0Jc2MuZ3MgPSBSRUdTX0dTKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLmZzID0gUkVHU19GUyhyZWdzLT5yZWdzLmdwKTsKLQlzYy5lcyA9IFJFR1NfRVMocmVncy0+cmVncy5ncCk7Ci0Jc2MuZHMgPSBSRUdTX0RTKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLmRpID0gUkVHU19FREkocmVncy0+cmVncy5ncCk7Ci0Jc2Muc2kgPSBSRUdTX0VTSShyZWdzLT5yZWdzLmdwKTsKLQlzYy5icCA9IFJFR1NfRUJQKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLnNwID0gc3A7Ci0Jc2MuYnggPSBSRUdTX0VCWChyZWdzLT5yZWdzLmdwKTsKLQlzYy5keCA9IFJFR1NfRURYKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLmN4ID0gUkVHU19FQ1gocmVncy0+cmVncy5ncCk7Ci0Jc2MuYXggPSBSRUdTX0VBWChyZWdzLT5yZWdzLmdwKTsKLQlzYy5pcCA9IFJFR1NfSVAocmVncy0+cmVncy5ncCk7Ci0Jc2MuY3MgPSBSRUdTX0NTKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLmZsYWdzID0gUkVHU19FRkxBR1MocmVncy0+cmVncy5ncCk7Ci0Jc2Muc3BfYXRfc2lnbmFsID0gcmVncy0+cmVncy5ncFtVRVNQXTsKLQlzYy5zcyA9IHJlZ3MtPnJlZ3MuZ3BbU1NdOwotCXNjLmNyMiA9IGZpLT5jcjI7Ci0Jc2MuZXJyID0gZmktPmVycm9yX2NvZGU7Ci0Jc2MudHJhcG5vID0gZmktPnRyYXBfbm87Ci0KLQl0b19mcCA9ICh0b19mcCA/IHRvX2ZwIDogKHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKikgKHRvICsgMSkpOwotCXNjLmZwc3RhdGUgPSB0b19mcDsKLQotCXBpZCA9IHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdOwotCWlmIChoYXZlX2ZweF9yZWdzKSB7Ci0JCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IGZweDsKLQotCQllcnIgPSBzYXZlX2ZweF9yZWdpc3RlcnMocGlkLCAodW5zaWduZWQgbG9uZyAqKSAmZnB4KTsKLQkJaWYgKGVyciA8IDApewotCQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX3RvX3VzZXIgLSBzYXZlX2ZweF9yZWdpc3RlcnMgIgotCQkJICAgICAgICJmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCWVyciA9IGNvbnZlcnRfZnhzcl90b191c2VyKHRvX2ZwLCAmZnB4KTsKLQkJaWYgKGVycikKLQkJCXJldHVybiAxOwotCi0JCWVyciB8PSBfX3B1dF91c2VyKGZweC5zd2QsICZ0b19mcC0+c3RhdHVzKTsKLQkJZXJyIHw9IF9fcHV0X3VzZXIoWDg2X0ZYU1JfTUFHSUMsICZ0b19mcC0+bWFnaWMpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIDE7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigmdG9fZnAtPl9meHNyX2VudlswXSwgJmZweCwKLQkJCQkgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSkpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSB7Ci0JCXN0cnVjdCB1c2VyX2kzODdfc3RydWN0IGZwOwotCi0JCWVyciA9IHNhdmVfZnBfcmVnaXN0ZXJzKHBpZCwgKHVuc2lnbmVkIGxvbmcgKikgJmZwKTsKLQkJaWYgKGNvcHlfdG9fdXNlcih0b19mcCwgJmZwLCBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpKSkKLQkJCXJldHVybiAxOwotCX0KLQotCXJldHVybiBjb3B5X3RvX3VzZXIodG8sICZzYywgc2l6ZW9mKHNjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgY29weV91Y29udGV4dF90b191c2VyKHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjLAotCQkJCSBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpmcCwgc2lnc2V0X3QgKnNldCwKLQkJCQkgdW5zaWduZWQgbG9uZyBzcCkKLXsKLQlpbnQgZXJyID0gMDsKLQotCWVyciB8PSBwdXRfdXNlcihjdXJyZW50LT5zYXNfc3Nfc3AsICZ1Yy0+dWNfc3RhY2suc3Nfc3ApOwotCWVyciB8PSBwdXRfdXNlcihzYXNfc3NfZmxhZ3Moc3ApLCAmdWMtPnVjX3N0YWNrLnNzX2ZsYWdzKTsKLQllcnIgfD0gcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NpemUsICZ1Yy0+dWNfc3RhY2suc3Nfc2l6ZSk7Ci0JZXJyIHw9IGNvcHlfc2NfdG9fdXNlcigmdWMtPnVjX21jb250ZXh0LCBmcCwgJmN1cnJlbnQtPnRocmVhZC5yZWdzLCBzcCk7Ci0JZXJyIHw9IGNvcHlfdG9fdXNlcigmdWMtPnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdHJ1Y3Qgc2lnZnJhbWUKLXsKLQljaGFyIF9fdXNlciAqcHJldGNvZGU7Ci0JaW50IHNpZzsKLQlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKLQlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKLQljaGFyIHJldGNvZGVbOF07Ci19OwotCi1zdHJ1Y3QgcnRfc2lnZnJhbWUKLXsKLQljaGFyIF9fdXNlciAqcHJldGNvZGU7Ci0JaW50IHNpZzsKLQlzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKnBpbmZvOwotCXZvaWQgX191c2VyICpwdWM7Ci0Jc3RydWN0IHNpZ2luZm8gaW5mbzsKLQlzdHJ1Y3QgdWNvbnRleHQgdWM7Ci0Jc3RydWN0IF9mcHN0YXRlIGZwc3RhdGU7Ci0JY2hhciByZXRjb2RlWzhdOwotfTsKLQotaW50IHNldHVwX3NpZ25hbF9zdGFja19zYyh1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgaW50IHNpZywKLQkJCSAgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgIHNpZ3NldF90ICptYXNrKQotewotCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwotCXZvaWQgX191c2VyICpyZXN0b3JlcjsKLQl1bnNpZ25lZCBsb25nIHNhdmVfc3AgPSBQVF9SRUdTX1NQKHJlZ3MpOwotCWludCBlcnIgPSAwOwotCi0JLyogVGhpcyBpcyB0aGUgc2FtZSBjYWxjdWxhdGlvbiBhcyBpMzg2IC0gKChzcCArIDQpICYgMTUpID09IDAgKi8KLQlzdGFja190b3AgPSAoKHN0YWNrX3RvcCArIDQpICYgLTE2VUwpIC0gNDsKLQlmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopIHN0YWNrX3RvcCAtIDE7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQotCQlyZXR1cm4gMTsKLQotCXJlc3RvcmVyID0gZnJhbWUtPnJldGNvZGU7Ci0JaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKQotCQlyZXN0b3JlciA9IGthLT5zYS5zYV9yZXN0b3JlcjsKLQotCS8qIFVwZGF0ZSBTUCBub3cgYmVjYXVzZSB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyIHJlZnVzZXMgdG8gZXh0ZW5kCi0JICogdGhlIHN0YWNrIGlmIHRoZSBmYXVsdGluZyBhZGRyZXNzIGlzIHRvbyBmYXIgYmVsb3cgdGhlIGN1cnJlbnQKLQkgKiBTUCwgd2hpY2ggZnJhbWUgbm93IGNlcnRhaW5seSBpcy4gIElmIHRoZXJlJ3MgYW4gZXJyb3IsIHRoZSBvcmlnaW5hbAotCSAqIHZhbHVlIGlzIHJlc3RvcmVkIG9uIHRoZSB3YXkgb3V0LgotCSAqIFdoZW4gd3JpdGluZyB0aGUgc2lnY29udGV4dCB0byB0aGUgc3RhY2ssIHdlIGhhdmUgdG8gd3JpdGUgdGhlCi0JICogb3JpZ2luYWwgdmFsdWUsIHNvIHRoYXQncyBwYXNzZWQgdG8gY29weV9zY190b191c2VyLCB3aGljaCBkb2VzCi0JICogdGhlIHJpZ2h0IHRoaW5nIHdpdGggaXQuCi0JICovCi0JUFRfUkVHU19TUChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZTsKLQotCWVyciB8PSBfX3B1dF91c2VyKHJlc3RvcmVyLCAmZnJhbWUtPnByZXRjb2RlKTsKLQllcnIgfD0gX19wdXRfdXNlcihzaWcsICZmcmFtZS0+c2lnKTsKLQllcnIgfD0gY29weV9zY190b191c2VyKCZmcmFtZS0+c2MsIE5VTEwsIHJlZ3MsIHNhdmVfc3ApOwotCWVyciB8PSBfX3B1dF91c2VyKG1hc2stPnNpZ1swXSwgJmZyYW1lLT5zYy5vbGRtYXNrKTsKLQlpZiAoX05TSUdfV09SRFMgPiAxKQotCQllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT5leHRyYW1hc2ssICZtYXNrLT5zaWdbMV0sCi0JCQkJICAgICAgc2l6ZW9mKGZyYW1lLT5leHRyYW1hc2spKTsKLQotCS8qCi0JICogVGhpcyBpcyBwb3BsICVlYXggOyBtb3ZsICQsJWVheCA7IGludCAkMHg4MAotCSAqCi0JICogV0UgRE8gTk9UIFVTRSBJVCBBTlkgTU9SRSEgSXQncyBvbmx5IGxlZnQgaGVyZSBmb3IgaGlzdG9yaWNhbAotCSAqIHJlYXNvbnMgYW5kIGJlY2F1c2UgZ2RiIHVzZXMgaXQgYXMgYSBzaWduYXR1cmUgdG8gbm90aWNlCi0JICogc2lnbmFsIGhhbmRsZXIgc3RhY2sgZnJhbWVzLgotCSAqLwotCWVyciB8PSBfX3B1dF91c2VyKDB4Yjg1OCwgKHNob3J0IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSswKSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoX19OUl9zaWdyZXR1cm4sIChpbnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzIpKTsKLQllcnIgfD0gX19wdXRfdXNlcigweDgwY2QsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrNikpOwotCi0JaWYgKGVycikKLQkJZ290byBlcnI7Ci0KLQlQVF9SRUdTX1NQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwotCVBUX1JFR1NfSVAocmVncykgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7Ci0JUFRfUkVHU19FQVgocmVncykgPSAodW5zaWduZWQgbG9uZykgc2lnOwotCVBUX1JFR1NfRURYKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIDA7Ci0JUFRfUkVHU19FQ1gocmVncykgPSAodW5zaWduZWQgbG9uZykgMDsKLQotCWlmICgoY3VycmVudC0+cHRyYWNlICYgUFRfRFRSQUNFKSAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCi0JCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlQVF9SRUdTX1NQKHJlZ3MpID0gc2F2ZV9zcDsKLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgc2V0dXBfc2lnbmFsX3N0YWNrX3NpKHVuc2lnbmVkIGxvbmcgc3RhY2tfdG9wLCBpbnQgc2lnLAotCQkJICBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCSAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqbWFzaykKLXsKLQlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKLQl2b2lkIF9fdXNlciAqcmVzdG9yZXI7Ci0JdW5zaWduZWQgbG9uZyBzYXZlX3NwID0gUFRfUkVHU19TUChyZWdzKTsKLQlpbnQgZXJyID0gMDsKLQotCXN0YWNrX3RvcCAmPSAtOFVMOwotCWZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikgc3RhY2tfdG9wIC0gMTsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCi0JCXJldHVybiAxOwotCi0JcmVzdG9yZXIgPSBmcmFtZS0+cmV0Y29kZTsKLQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCi0JCXJlc3RvcmVyID0ga2EtPnNhLnNhX3Jlc3RvcmVyOwotCi0JLyogU2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgd2h5IHRoaXMgaXMgaGVyZSAqLwotCVBUX1JFR1NfU1AocmVncykgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7Ci0KLQllcnIgfD0gX19wdXRfdXNlcihyZXN0b3JlciwgJmZyYW1lLT5wcmV0Y29kZSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc2lnLCAmZnJhbWUtPnNpZyk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKTsKLQllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPnVjLCAmZnJhbWUtPnB1Yyk7Ci0JZXJyIHw9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgaW5mbyk7Ci0JZXJyIHw9IGNvcHlfdWNvbnRleHRfdG9fdXNlcigmZnJhbWUtPnVjLCAmZnJhbWUtPmZwc3RhdGUsIG1hc2ssCi0JCQkJICAgICBzYXZlX3NwKTsKLQotCS8qCi0JICogVGhpcyBpcyBtb3ZsICQsJWVheCA7IGludCAkMHg4MAotCSAqCi0JICogV0UgRE8gTk9UIFVTRSBJVCBBTlkgTU9SRSEgSXQncyBvbmx5IGxlZnQgaGVyZSBmb3IgaGlzdG9yaWNhbAotCSAqIHJlYXNvbnMgYW5kIGJlY2F1c2UgZ2RiIHVzZXMgaXQgYXMgYSBzaWduYXR1cmUgdG8gbm90aWNlCi0JICogc2lnbmFsIGhhbmRsZXIgc3RhY2sgZnJhbWVzLgotCSAqLwotCWVyciB8PSBfX3B1dF91c2VyKDB4YjgsIChjaGFyIF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSswKSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoX19OUl9ydF9zaWdyZXR1cm4sIChpbnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzEpKTsKLQllcnIgfD0gX19wdXRfdXNlcigweDgwY2QsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrNSkpOwotCi0JaWYgKGVycikKLQkJZ290byBlcnI7Ci0KLQlQVF9SRUdTX0lQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOwotCVBUX1JFR1NfRUFYKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIHNpZzsKLQlQVF9SRUdTX0VEWChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPmluZm87Ci0JUFRfUkVHU19FQ1gocmVncykgPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT51YzsKLQotCWlmICgoY3VycmVudC0+cHRyYWNlICYgUFRfRFRSQUNFKSAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCi0JCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlQVF9SRUdTX1NQKHJlZ3MpID0gc2F2ZV9zcDsKLQlyZXR1cm4gZXJyOwotfQotCi1sb25nIHN5c19zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIHNwID0gUFRfUkVHU19TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKikoc3AgLSA4KTsKLQlzaWdzZXRfdCBzZXQ7Ci0Jc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYyA9ICZmcmFtZS0+c2M7Ci0JdW5zaWduZWQgbG9uZyBfX3VzZXIgKm9sZG1hc2sgPSAmc2MtPm9sZG1hc2s7Ci0JdW5zaWduZWQgbG9uZyBfX3VzZXIgKmV4dHJhbWFzayA9IGZyYW1lLT5leHRyYW1hc2s7Ci0JaW50IHNpZ19zaXplID0gKF9OU0lHX1dPUkRTIC0gMSkgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnNldC5zaWdbMF0sIG9sZG1hc2ssIHNpemVvZihzZXQuc2lnWzBdKSkgfHwKLQkgICAgY29weV9mcm9tX3VzZXIoJnNldC5zaWdbMV0sIGV4dHJhbWFzaywgc2lnX3NpemUpKQotCQlnb3RvIHNlZ2ZhdWx0OwotCi0Jc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7Ci0KLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5ibG9ja2VkID0gc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQotCWlmIChjb3B5X3NjX2Zyb21fdXNlcigmY3VycmVudC0+dGhyZWFkLnJlZ3MsIHNjKSkKLQkJZ290byBzZWdmYXVsdDsKLQotCS8qIEF2b2lkIEVSRVNUQVJUIGhhbmRsaW5nICovCi0JUFRfUkVHU19TWVNDQUxMX05SKCZjdXJyZW50LT50aHJlYWQucmVncykgPSAtMTsKLQlyZXR1cm4gUFRfUkVHU19TWVNDQUxMX1JFVCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCi0gc2VnZmF1bHQ6Ci0JZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwotCXJldHVybiAwOwotfQotCi1sb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIHNwID0gUFRfUkVHU19TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0KLQkJKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikgKHNwIC0gNCk7Ci0Jc2lnc2V0X3Qgc2V0OwotCXN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjID0gJmZyYW1lLT51YzsKLQlpbnQgc2lnX3NpemUgPSBfTlNJR19XT1JEUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0LCAmdWMtPnVjX3NpZ21hc2ssIHNpZ19zaXplKSkKLQkJZ290byBzZWdmYXVsdDsKLQotCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCi0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlpZiAoY29weV9zY19mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5yZWdzLCAmdWMtPnVjX21jb250ZXh0KSkKLQkJZ290byBzZWdmYXVsdDsKLQotCS8qIEF2b2lkIEVSRVNUQVJUIGhhbmRsaW5nICovCi0JUFRfUkVHU19TWVNDQUxMX05SKCZjdXJyZW50LT50aHJlYWQucmVncykgPSAtMTsKLQlyZXR1cm4gUFRfUkVHU19TWVNDQUxMX1JFVCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCi0gc2VnZmF1bHQ6Ci0JZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYyBiL2FyY2gvdW0vc3lzLWkzODYvc3R1Yl9zZWd2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Y2NmNzMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKLSNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgotCi12b2lkIF9fYXR0cmlidXRlX18gKChfX3NlY3Rpb25fXyAoIi5fX3N5c2NhbGxfc3R1YiIpKSkKLXN0dWJfc2Vndl9oYW5kbGVyKGludCBzaWcpCi17Ci0Jc3RydWN0IHNpZ2NvbnRleHQgKnNjID0gKHN0cnVjdCBzaWdjb250ZXh0ICopICgmc2lnICsgMSk7Ci0KLQlHRVRfRkFVTFRJTkZPX0ZST01fU0MoKigoc3RydWN0IGZhdWx0aW5mbyAqKSBTVFVCX0RBVEEpLCBzYyk7Ci0KLQl0cmFwX215c2VsZigpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zeXNfY2FsbF90YWJsZS5TIGIvYXJjaC91bS9zeXMtaTM4Ni9zeXNfY2FsbF90YWJsZS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTI3NDA3MS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3N5c19jYWxsX3RhYmxlLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotLyogU3RlYWwgaTM4NiBzeXNjYWxsIHRhYmxlIGZvciBvdXIgcHVycG9zZXMsIGJ1dCB3aXRoIHNvbWUgc2xpZ2h0IGNoYW5nZXMuKi8KLQotI2RlZmluZSBzeXNfaW9wbCBzeXNfbmlfc3lzY2FsbAotI2RlZmluZSBzeXNfaW9wZXJtIHN5c19uaV9zeXNjYWxsCi0KLSNkZWZpbmUgc3lzX3ZtODZvbGQgc3lzX25pX3N5c2NhbGwKLSNkZWZpbmUgc3lzX3ZtODYgc3lzX25pX3N5c2NhbGwKLQotI2RlZmluZSBvbGRfbW1hcCBzeXNfb2xkX21tYXAKLQotI2RlZmluZSBwdHJlZ3NfZm9yayBzeXNfZm9yawotI2RlZmluZSBwdHJlZ3NfZXhlY3ZlIHN5c19leGVjdmUKLSNkZWZpbmUgcHRyZWdzX2lvcGwgc3lzX2lvcGwKLSNkZWZpbmUgcHRyZWdzX3ZtODZvbGQgc3lzX3ZtODZvbGQKLSNkZWZpbmUgcHRyZWdzX3NpZ3JldHVybiBzeXNfc2lncmV0dXJuCi0jZGVmaW5lIHB0cmVnc19jbG9uZSBzeXNfY2xvbmUKLSNkZWZpbmUgcHRyZWdzX3ZtODYgc3lzX3ZtODYKLSNkZWZpbmUgcHRyZWdzX3J0X3NpZ3JldHVybiBzeXNfcnRfc2lncmV0dXJuCi0jZGVmaW5lIHB0cmVnc19zaWdhbHRzdGFjayBzeXNfc2lnYWx0c3RhY2sKLSNkZWZpbmUgcHRyZWdzX3Zmb3JrIHN5c192Zm9yawotCi0uc2VjdGlvbiAucm9kYXRhLCJhIgotCi0jaW5jbHVkZSAiLi4vLi4veDg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlXzMyLlMiCi0KLUVOVFJZKHN5c2NhbGxfdGFibGVfc2l6ZSkKLS5sb25nIC4tc3lzX2NhbGxfdGFibGUKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvdXNlci1vZmZzZXRzLmMgYi9hcmNoL3VtL3N5cy1pMzg2L3VzZXItb2Zmc2V0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg4M2JmLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvdXNlci1vZmZzZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0KLSNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCi0JYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbCkpCi0KLSNkZWZpbmUgREVGSU5FX0xPTkdTKHN5bSwgdmFsKSBcCi0JYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbC9zaXplb2YodW5zaWduZWQgbG9uZykpKQotCi0jZGVmaW5lIE9GRlNFVChzeW0sIHN0ciwgbWVtKSBcCi0JREVGSU5FKHN5bSwgb2Zmc2V0b2Yoc3RydWN0IHN0ciwgbWVtKSk7Ci0KLXZvaWQgZm9vKHZvaWQpCi17Ci0JT0ZGU0VUKEhPU1RfU0NfVFJBUE5PLCBzaWdjb250ZXh0LCB0cmFwbm8pOwotCU9GRlNFVChIT1NUX1NDX0VSUiwgc2lnY29udGV4dCwgZXJyKTsKLQlPRkZTRVQoSE9TVF9TQ19DUjIsIHNpZ2NvbnRleHQsIGNyMik7Ci0KLQlERUZJTkVfTE9OR1MoSE9TVF9GUF9TSVpFLCBzaXplb2Yoc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdCkpOwotCURFRklORV9MT05HUyhIT1NUX0ZQWF9TSVpFLCBzaXplb2Yoc3RydWN0IHVzZXJfZnB4cmVnc19zdHJ1Y3QpKTsKLQotCURFRklORShIT1NUX0lQLCBFSVApOwotCURFRklORShIT1NUX1NQLCBVRVNQKTsKLQlERUZJTkUoSE9TVF9FRkxBR1MsIEVGTCk7Ci0JREVGSU5FKEhPU1RfRUFYLCBFQVgpOwotCURFRklORShIT1NUX0VCWCwgRUJYKTsKLQlERUZJTkUoSE9TVF9FQ1gsIEVDWCk7Ci0JREVGSU5FKEhPU1RfRURYLCBFRFgpOwotCURFRklORShIT1NUX0VTSSwgRVNJKTsKLQlERUZJTkUoSE9TVF9FREksIEVESSk7Ci0JREVGSU5FKEhPU1RfRUJQLCBFQlApOwotCURFRklORShIT1NUX0NTLCBDUyk7Ci0JREVGSU5FKEhPU1RfU1MsIFNTKTsKLQlERUZJTkUoSE9TVF9EUywgRFMpOwotCURFRklORShIT1NUX0ZTLCBGUyk7Ci0JREVGSU5FKEhPU1RfRVMsIEVTKTsKLQlERUZJTkUoSE9TVF9HUywgR1MpOwotCURFRklORShVTV9GUkFNRV9TSVpFLCBzaXplb2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpKTsKLQotCS8qIFhYWCBEdXBsaWNhdGVkIGJldHdlZW4gaTM4NiBhbmQgeDg2XzY0ICovCi0JREVGSU5FKFVNX1BPTExJTiwgUE9MTElOKTsKLQlERUZJTkUoVU1fUE9MTFBSSSwgUE9MTFBSSSk7Ci0JREVGSU5FKFVNX1BPTExPVVQsIFBPTExPVVQpOwotCi0JREVGSU5FKFVNX1BST1RfUkVBRCwgUFJPVF9SRUFEKTsKLQlERUZJTkUoVU1fUFJPVF9XUklURSwgUFJPVF9XUklURSk7Ci0JREVGSU5FKFVNX1BST1RfRVhFQywgUFJPVF9FWEVDKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0ZDFkMy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0jCi0KLW9iai15ID0gYnVnLm8gYnVncy5vIGRlbGF5Lm8gZmF1bHQubyBsZHQubyBwdHJhY2UubyBwdHJhY2VfdXNlci5vIG1lbS5vIFwKLQlzZXRqbXAubyBzaWduYWwubyBzdHViLm8gc3R1Yl9zZWd2Lm8gc3lzY2FsbHMubyBzeXNjYWxsX3RhYmxlLm8gXAotCXN5c3JxLm8ga3N5bXMubyB0bHMubwotCi1vYmoteSArPSB2ZHNvLwotCi1zdWJhcmNoLW9iai15ID0gbGliL2NzdW0tcGFydGlhbF82NC5vIGxpYi9tZW1jcHlfNjQubyBsaWIvdGh1bmtfNjQubyBcCi0JCWxpYi9yd3NlbS5vCi1zdWJhcmNoLW9iai0kKENPTkZJR19NT0RVTEVTKSArPSBrZXJuZWwvbW9kdWxlLm8KLQotbGR0LXkgPSAuLi9zeXMtaTM4Ni9sZHQubwotCi1VU0VSX09CSlMgOj0gcHRyYWNlX3VzZXIubwotCi1VU0VSX09CSlMgKz0gdXNlci1vZmZzZXRzLnMKLWV4dHJhLXkgKz0gdXNlci1vZmZzZXRzLnMKLQotVU5QUk9GSUxFX09CSlMgOj0gc3R1Yl9zZWd2Lm8KLUNGTEFHU19zdHViX3NlZ3YubyA6PSAkKENGTEFHU19OT19IQVJERU5JTkcpCi0KLWluY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2FyY2hwYXJhbS5oIGIvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9hcmNocGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwODM2Ni4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2FyY2hwYXJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVU1fQVJDSFBBUkFNX1g4Nl82NF9ICi0jZGVmaW5lIF9fVU1fQVJDSFBBUkFNX1g4Nl82NF9ICi0KLQotLyogTm8gdXNlci1hY2Nlc3NpYmxlIGZpeG1hcCBhZGRyZXNzZXMsIGkuZS4gdnN5c2NhbGwgKi8KLSNkZWZpbmUgRklYQUREUl9VU0VSX1NUQVJUCTAKLSNkZWZpbmUgRklYQUREUl9VU0VSX0VORAkwCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2VsZi5oIGIvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9lbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMmJmYi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2VsZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotI2lmbmRlZiBfX1VNX0VMRl9YODZfNjRfSAotI2RlZmluZSBfX1VNX0VMRl9YODZfNjRfSAotCi0jaW5jbHVkZSA8YXNtL3VzZXIuaD4KLSNpbmNsdWRlICJza2FzLmgiCi0KLS8qIHg4Ni02NCByZWxvY2F0aW9uIHR5cGVzLCB0YWtlbiBmcm9tIGFzbS14ODZfNjQvZWxmLmggKi8KLSNkZWZpbmUgUl9YODZfNjRfTk9ORQkJMAkvKiBObyByZWxvYyAqLwotI2RlZmluZSBSX1g4Nl82NF82NAkJMQkvKiBEaXJlY3QgNjQgYml0ICAqLwotI2RlZmluZSBSX1g4Nl82NF9QQzMyCQkyCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCBzaWduZWQgKi8KLSNkZWZpbmUgUl9YODZfNjRfR09UMzIJCTMJLyogMzIgYml0IEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX1g4Nl82NF9QTFQzMgkJNAkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9YODZfNjRfQ09QWQkJNQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0jZGVmaW5lIFJfWDg2XzY0X0dMT0JfREFUCTYJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX1g4Nl82NF9KVU1QX1NMT1QJNwkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0jZGVmaW5lIFJfWDg2XzY0X1JFTEFUSVZFCTgJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotI2RlZmluZSBSX1g4Nl82NF9HT1RQQ1JFTAk5CS8qIDMyIGJpdCBzaWduZWQgcGMgcmVsYXRpdmUKLQkJCQkJICAgb2Zmc2V0IHRvIEdPVCAqLwotI2RlZmluZSBSX1g4Nl82NF8zMgkJMTAJLyogRGlyZWN0IDMyIGJpdCB6ZXJvIGV4dGVuZGVkICovCi0jZGVmaW5lIFJfWDg2XzY0XzMyUwkJMTEJLyogRGlyZWN0IDMyIGJpdCBzaWduIGV4dGVuZGVkICovCi0jZGVmaW5lIFJfWDg2XzY0XzE2CQkxMgkvKiBEaXJlY3QgMTYgYml0IHplcm8gZXh0ZW5kZWQgKi8KLSNkZWZpbmUgUl9YODZfNjRfUEMxNgkJMTMJLyogMTYgYml0IHNpZ24gZXh0ZW5kZWQgcGMgcmVsYXRpdmUgKi8KLSNkZWZpbmUgUl9YODZfNjRfOAkJMTQJLyogRGlyZWN0IDggYml0IHNpZ24gZXh0ZW5kZWQgICovCi0jZGVmaW5lIFJfWDg2XzY0X1BDOAkJMTUJLyogOCBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLwotCi0jZGVmaW5lIFJfWDg2XzY0X05VTQkJMTYKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7Ci0KLSNkZWZpbmUgRUxGX05HUkVHIChzaXplb2YgKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSAvIHNpemVvZihlbGZfZ3JlZ190KSkKLXR5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107Ci0KLXR5cGVkZWYgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZWxmX2ZwcmVnc2V0X3Q7Ci0KLS8qCi0gKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlLgotICovCi0jZGVmaW5lIGVsZl9jaGVja19hcmNoKHgpIFwKLQkoKHgpLT5lX21hY2hpbmUgPT0gRU1fWDg2XzY0KQotCi0jZGVmaW5lIEVMRl9DTEFTUwlFTEZDTEFTUzY0Ci0jZGVmaW5lIEVMRl9EQVRBICAgICAgICBFTEZEQVRBMkxTQgotI2RlZmluZSBFTEZfQVJDSCAgICAgICAgRU1fWDg2XzY0Ci0KLSNkZWZpbmUgRUxGX1BMQVRfSU5JVChyZWdzLCBsb2FkX2FkZHIpICAgIGRvIHsgXAotCVBUX1JFR1NfUkJYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkNYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkRYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUlNJKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkRJKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkJQKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkFYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUjgocmVncykgPSAwOyBcCi0JUFRfUkVHU19SOShyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxMChyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxMShyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxMihyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxMyhyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxNChyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxNShyZWdzKSA9IDA7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRUxGX0NPUkVfQ09QWV9SRUdTKHByX3JlZywgX3JlZ3MpCQlcCi0JKHByX3JlZylbMF0gPSAoX3JlZ3MpLT5yZWdzLmdwWzBdOwkJCVwKLQkocHJfcmVnKVsxXSA9IChfcmVncyktPnJlZ3MuZ3BbMV07CQkJXAotCShwcl9yZWcpWzJdID0gKF9yZWdzKS0+cmVncy5ncFsyXTsJCQlcCi0JKHByX3JlZylbM10gPSAoX3JlZ3MpLT5yZWdzLmdwWzNdOwkJCVwKLQkocHJfcmVnKVs0XSA9IChfcmVncyktPnJlZ3MuZ3BbNF07CQkJXAotCShwcl9yZWcpWzVdID0gKF9yZWdzKS0+cmVncy5ncFs1XTsJCQlcCi0JKHByX3JlZylbNl0gPSAoX3JlZ3MpLT5yZWdzLmdwWzZdOwkJCVwKLQkocHJfcmVnKVs3XSA9IChfcmVncyktPnJlZ3MuZ3BbN107CQkJXAotCShwcl9yZWcpWzhdID0gKF9yZWdzKS0+cmVncy5ncFs4XTsJCQlcCi0JKHByX3JlZylbOV0gPSAoX3JlZ3MpLT5yZWdzLmdwWzldOwkJCVwKLQkocHJfcmVnKVsxMF0gPSAoX3JlZ3MpLT5yZWdzLmdwWzEwXTsJCQlcCi0JKHByX3JlZylbMTFdID0gKF9yZWdzKS0+cmVncy5ncFsxMV07CQkJXAotCShwcl9yZWcpWzEyXSA9IChfcmVncyktPnJlZ3MuZ3BbMTJdOwkJCVwKLQkocHJfcmVnKVsxM10gPSAoX3JlZ3MpLT5yZWdzLmdwWzEzXTsJCQlcCi0JKHByX3JlZylbMTRdID0gKF9yZWdzKS0+cmVncy5ncFsxNF07CQkJXAotCShwcl9yZWcpWzE1XSA9IChfcmVncyktPnJlZ3MuZ3BbMTVdOwkJCVwKLQkocHJfcmVnKVsxNl0gPSAoX3JlZ3MpLT5yZWdzLmdwWzE2XTsJCQlcCi0JKHByX3JlZylbMTddID0gKF9yZWdzKS0+cmVncy5ncFsxN107CQkJXAotCShwcl9yZWcpWzE4XSA9IChfcmVncyktPnJlZ3MuZ3BbMThdOwkJCVwKLQkocHJfcmVnKVsxOV0gPSAoX3JlZ3MpLT5yZWdzLmdwWzE5XTsJCQlcCi0JKHByX3JlZylbMjBdID0gKF9yZWdzKS0+cmVncy5ncFsyMF07CQkJXAotCShwcl9yZWcpWzIxXSA9IGN1cnJlbnQtPnRocmVhZC5hcmNoLmZzOwkJCVwKLQkocHJfcmVnKVsyMl0gPSAwOwkJCQkJXAotCShwcl9yZWcpWzIzXSA9IDA7CQkJCQlcCi0JKHByX3JlZylbMjRdID0gMDsJCQkJCVwKLQkocHJfcmVnKVsyNV0gPSAwOwkJCQkJXAotCShwcl9yZWcpWzI2XSA9IDA7Ci0KLSNkZWZpbmUgdGFza19wdF9yZWdzKHQpICgmKHQpLT50aHJlYWQucmVncykKLQotc3RydWN0IHRhc2tfc3RydWN0OwotCi1leHRlcm4gaW50IGVsZl9jb3JlX2NvcHlfZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgZWxmX2ZwcmVnc2V0X3QgKmZwdSk7Ci0KLSNkZWZpbmUgRUxGX0NPUkVfQ09QWV9GUFJFR1ModCwgZnB1KSBlbGZfY29yZV9jb3B5X2ZwcmVncyh0LCBmcHUpCi0KLSNpZmRlZiBUSUZfSUEzMiAvKiBYWFggKi8KLSNlcnJvciBYWFgsIGluZGVlZAotICAgICAgICBjbGVhcl90aHJlYWRfZmxhZyhUSUZfSUEzMik7Ci0jZW5kaWYKLQotI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRSA0MDk2Ci0KLSNkZWZpbmUgRUxGX0VUX0RZTl9CQVNFICgyICogVEFTS19TSVpFIC8gMykKLQotZXh0ZXJuIGxvbmcgZWxmX2F1eF9od2NhcDsKLSNkZWZpbmUgRUxGX0hXQ0FQIChlbGZfYXV4X2h3Y2FwKQotCi0jZGVmaW5lIEVMRl9QTEFURk9STSAieDg2XzY0IgotCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgZG8gOyB3aGlsZSgwKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX0dBVEVfQVJFQSAxCi0jZGVmaW5lIEFSQ0hfSEFTX1NFVFVQX0FERElUSU9OQUxfUEFHRVMgMQotc3RydWN0IGxpbnV4X2JpbnBybTsKLWV4dGVybiBpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sCi0JaW50IHVzZXNfaW50ZXJwKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdW1fdmRzb19hZGRyOwotI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIgMzMKLSNkZWZpbmUgQVJDSF9ETElORk8JTkVXX0FVWF9FTlQoQVRfU1lTSU5GT19FSERSLCB1bV92ZHNvX2FkZHIpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9tb2R1bGUuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9hc20vbW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjc5YzIuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9tb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1VNX01PRFVMRV9YODZfNjRfSAotI2RlZmluZSBfX1VNX01PRFVMRV9YODZfNjRfSAotCi0vKiBVTUwgaXMgc2ltcGxlICovCi1zdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMKLXsKLX07Ci0KLSNkZWZpbmUgRWxmX1NoZHIgRWxmNjRfU2hkcgotI2RlZmluZSBFbGZfU3ltIEVsZjY0X1N5bQotI2RlZmluZSBFbGZfRWhkciBFbGY2NF9FaGRyCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9wcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1YTI2YS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL3Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVU1fUFJPQ0VTU09SX1g4Nl82NF9ICi0jZGVmaW5lIF9fVU1fUFJPQ0VTU09SX1g4Nl82NF9ICi0KLS8qIGluY2x1ZGUgZmF1bHRpbmZvIHN0cnVjdHVyZSAqLwotI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKLQotc3RydWN0IGFyY2hfdGhyZWFkIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBkZWJ1Z3JlZ3NbOF07Ci0gICAgICAgIGludCBkZWJ1Z3JlZ3Nfc2VxOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZzOwotICAgICAgICBzdHJ1Y3QgZmF1bHRpbmZvIGZhdWx0aW5mbzsKLX07Ci0KLS8qIFJFUCBOT1AgKFBBVVNFKSBpcyBhIGdvb2QgdGhpbmcgdG8gaW5zZXJ0IGludG8gYnVzeS13YWl0IGxvb3BzLiAqLwotc3RhdGljIGlubGluZSB2b2lkIHJlcF9ub3Aodm9pZCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmVwO25vcCI6IDogOiJtZW1vcnkiKTsKLX0KLQotI2RlZmluZSBjcHVfcmVsYXgoKSAgIHJlcF9ub3AoKQotCi0jZGVmaW5lIElOSVRfQVJDSF9USFJFQUQgeyAuZGVidWdyZWdzICAJCT0geyBbIDAgLi4uIDcgXSA9IDAgfSwgXAotCQkJICAgLmRlYnVncmVnc19zZXEJPSAwLCBcCi0JCQkgICAuZnMJCQk9IDAsIFwKLQkJCSAgIC5mYXVsdGluZm8JCT0geyAwLCAwLCAwIH0gfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9mbHVzaF90aHJlYWQoc3RydWN0IGFyY2hfdGhyZWFkICp0aHJlYWQpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2NvcHlfdGhyZWFkKHN0cnVjdCBhcmNoX3RocmVhZCAqZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhcmNoX3RocmVhZCAqdG8pCi17Ci0JdG8tPmZzID0gZnJvbS0+ZnM7Ci19Ci0KLSNpbmNsdWRlIDxhc20vdXNlci5oPgotCi0jZGVmaW5lIGN1cnJlbnRfdGV4dF9hZGRyKCkgXAotCSh7IHZvaWQgKnBjOyBfX2FzbV9fKCJtb3ZxICQxZiwlMFxuMToiOiI9ZyIgKHBjKSk7IHBjOyB9KQotCi0jZGVmaW5lIEFSQ0hfSVNfU1RBQ0tHUk9XKGFkZHJlc3MpIFwKLSAgICAgICAgKGFkZHJlc3MgKyAxMjggPj0gVVBUX1NQKCZjdXJyZW50LT50aHJlYWQucmVncy5yZWdzKSkKLQotI2RlZmluZSBLU1RLX0VJUCh0c2spIEtTVEtfUkVHKHRzaywgUklQKQotI2RlZmluZSBLU1RLX0VTUCh0c2spIEtTVEtfUkVHKHRzaywgUlNQKQotCi0jaW5jbHVkZSAiYXNtL3Byb2Nlc3Nvci1nZW5lcmljLmgiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9hc20vcHRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDhjNDcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9wdHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1VNX1BUUkFDRV9YODZfNjRfSAotI2RlZmluZSBfX1VNX1BUUkFDRV9YODZfNjRfSAotCi0jaW5jbHVkZSAibGludXgvY29tcGlsZXIuaCIKLSNpbmNsdWRlICJhc20vZXJybm8uaCIKLQotI2RlZmluZSBfX0ZSQU1FX09GRlNFVFMgLyogTmVlZGVkIHRvIGdldCB0aGUgUiogbWFjcm9zICovCi0jaW5jbHVkZSAiYXNtL3B0cmFjZS1nZW5lcmljLmgiCi0KLSNkZWZpbmUgSE9TVF9BVURJVF9BUkNIIEFVRElUX0FSQ0hfWDg2XzY0Ci0KLSNkZWZpbmUgUFRfUkVHU19SQlgocikgVVBUX1JCWCgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1JDWChyKSBVUFRfUkNYKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUkRYKHIpIFVQVF9SRFgoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SU0kocikgVVBUX1JTSSgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1JESShyKSBVUFRfUkRJKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUkJQKHIpIFVQVF9SQlAoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SQVgocikgVVBUX1JBWCgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1I4KHIpIFVQVF9SOCgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1I5KHIpIFVQVF9SOSgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1IxMChyKSBVUFRfUjEwKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUjExKHIpIFVQVF9SMTEoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SMTIocikgVVBUX1IxMigmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1IxMyhyKSBVUFRfUjEzKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUjE0KHIpIFVQVF9SMTQoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SMTUocikgVVBUX1IxNSgmKHIpLT5yZWdzKQotCi0jZGVmaW5lIFBUX1JFR1NfRlMocikgVVBUX0ZTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfR1MocikgVVBUX0dTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfRFMocikgVVBUX0RTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfRVMocikgVVBUX0VTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfU1MocikgVVBUX1NTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfQ1MocikgVVBUX0NTKCYociktPnJlZ3MpCi0KLSNkZWZpbmUgUFRfUkVHU19PUklHX1JBWChyKSBVUFRfT1JJR19SQVgoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SSVAocikgVVBUX0lQKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUlNQKHIpIFVQVF9TUCgmKHIpLT5yZWdzKQotCi0jZGVmaW5lIFBUX1JFR1NfRUZMQUdTKHIpIFVQVF9FRkxBR1MoJihyKS0+cmVncykKLQotLyogWFhYICovCi0jZGVmaW5lIHVzZXJfbW9kZShyKSBVUFRfSVNfVVNFUigmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX09SSUdfU1lTQ0FMTChyKSBQVF9SRUdTX1JBWChyKQotI2RlZmluZSBQVF9SRUdTX1NZU0NBTExfUkVUKHIpIFBUX1JFR1NfUkFYKHIpCi0KLSNkZWZpbmUgUFRfRklYX0VYRUNfU1RBQ0soc3ApIGRvIDsgd2hpbGUoMCkKLQotI2RlZmluZSBwcm9maWxlX3BjKHJlZ3MpIFBUX1JFR1NfSVAocmVncykKLQotc3RydWN0IHVzZXJfZGVzYzsKLQotc3RhdGljIGlubGluZSBpbnQgcHRyYWNlX2dldF90aHJlYWRfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqdXNlcl9kZXNjKQotewotICAgICAgICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHRyYWNlX3NldF90aHJlYWRfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqdXNlcl9kZXNjKQotewotICAgICAgICByZXR1cm4gLUVOT1NZUzsKLX0KLQotZXh0ZXJuIGxvbmcgYXJjaF9wcmN0bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjb2RlLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmFkZHIpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvZGVsYXkuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9kZWxheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZlMWE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9kZWxheS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBSaWNoYXJkIFdlaW5iZXJnZXIgPHJpY2hyZEBub2QuYXQ+Ci0gKiBNb3N0bHkgY29waWVkIGZyb20gYXJjaC94ODYvbGliL2RlbGF5LmMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgotCi12b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKLXsKLQlhc20gdm9sYXRpbGUoCi0JCSJ0ZXN0ICUwLCUwXG4iCi0JCSJqeiAzZlxuIgotCQkiam1wIDFmXG4iCi0KLQkJIi5hbGlnbiAxNlxuIgotCQkiMTogam1wIDJmXG4iCi0KLQkJIi5hbGlnbiAxNlxuIgotCQkiMjogZGVjICUwXG4iCi0JCSIgam56IDJiXG4iCi0JCSIzOiBkZWMgJTBcbiIKLQotCQk6IC8qIHdlIGRvbid0IG5lZWQgb3V0cHV0ICovCi0JCTogImEiIChsb29wcykKLQkpOwotfQotRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKLQotaW5saW5lIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB4bG9vcHMpCi17Ci0JaW50IGQwOwotCi0JeGxvb3BzICo9IDQ7Ci0JYXNtKCJtdWxsICUlZWR4IgotCQk6ICI9ZCIgKHhsb29wcyksICI9JmEiIChkMCkKLQkJOiAiMSIgKHhsb29wcyksICIwIgotCQkobG9vcHNfcGVyX2ppZmZ5ICogKEhaLzQpKSk7Ci0KLQlfX2RlbGF5KCsreGxvb3BzKTsKLX0KLUVYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOwotCi12b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCi17Ci0JX19jb25zdF91ZGVsYXkodXNlY3MgKiAweDAwMDAxMGM3KTsgLyogMioqMzIgLyAxMDAwMDAwIChyb3VuZGVkIHVwKSAqLwotfQotRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7Ci0KLXZvaWQgX19uZGVsYXkodW5zaWduZWQgbG9uZyBuc2VjcykKLXsKLQlfX2NvbnN0X3VkZWxheShuc2VjcyAqIDB4MDAwMDUpOyAvKiAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCi19Ci1FWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9mYXVsdC5jIGIvYXJjaC91bS9zeXMteDg2XzY0L2ZhdWx0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODUxMTcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2ZhdWx0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgUGF0aFNjYWxlLCBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCi0KLS8qIFRoZXNlIHR3byBhcmUgZnJvbSBhc20tdW0vdWFjY2Vzcy5oIGFuZCBsaW51eC9tb2R1bGUuaCwgY2hlY2sgdGhlbS4gKi8KLXN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkKLXsKLQl1bnNpZ25lZCBsb25nIGluc247Ci0JdW5zaWduZWQgbG9uZyBmaXh1cDsKLX07Ci0KLWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKnNlYXJjaF9leGNlcHRpb25fdGFibGVzKHVuc2lnbmVkIGxvbmcgYWRkKTsKLQotaW50IGFyY2hfZml4dXAodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MpCi17Ci0JY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZml4dXA7Ci0KLQlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKGFkZHJlc3MpOwotCWlmIChmaXh1cCAhPSAwKSB7Ci0JCVVQVF9JUChyZWdzKSA9IGZpeHVwLT5maXh1cDsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2tzeW1zLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQva3N5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiMmZjZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQva3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+Ci0KLS8qWFhYOiB3ZSBuZWVkIHRoZW0gYmVjYXVzZSB0aGV5IHdvdWxkIGJlIGV4cG9ydGVkIGJ5IHg4Nl82NCAqLwotI2lmIChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpIHx8IF9fR05VQ19fID4gNAotRVhQT1JUX1NZTUJPTChtZW1jcHkpOwotI2Vsc2UKLUVYUE9SVF9TWU1CT0woX19tZW1jcHkpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvcHRyYWNlLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvcHRyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMDU1MDYuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3B0cmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUwotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0vKgotICogZGV0ZXJtaW5lcyB3aGljaCBmbGFncyB0aGUgdXNlciBoYXMgYWNjZXNzIHRvLgotICogMSA9IGFjY2VzcyAwID0gbm8gYWNjZXNzCi0gKi8KLSNkZWZpbmUgRkxBR19NQVNLIDB4NDRkZDVVTAotCi1pbnQgcHV0cmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGludCByZWdubywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotI2lmZGVmIFRJRl9JQTMyCi0JLyoKLQkgKiBTb21lIGNvZGUgaW4gdGhlIDY0Yml0IGVtdWxhdGlvbiBtYXkgbm90IGJlIDY0Yml0IGNsZWFuLgotCSAqIERvbid0IHRha2UgYW55IGNoYW5jZXMuCi0JICovCi0JaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfSUEzMikpCi0JCXZhbHVlICY9IDB4ZmZmZmZmZmY7Ci0jZW5kaWYKLQlzd2l0Y2ggKHJlZ25vKSB7Ci0JY2FzZSBGUzoKLQljYXNlIEdTOgotCWNhc2UgRFM6Ci0JY2FzZSBFUzoKLQljYXNlIFNTOgotCWNhc2UgQ1M6Ci0JCWlmICh2YWx1ZSAmJiAodmFsdWUgJiAzKSAhPSAzKQotCQkJcmV0dXJuIC1FSU87Ci0JCXZhbHVlICY9IDB4ZmZmZjsKLQkJYnJlYWs7Ci0KLQljYXNlIEZTX0JBU0U6Ci0JY2FzZSBHU19CQVNFOgotCQlpZiAoISgodmFsdWUgPj4gNDgpID09IDAgfHwgKHZhbHVlID4+IDQ4KSA9PSAweGZmZmYpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOwotCi0JY2FzZSBFRkxBR1M6Ci0JCXZhbHVlICY9IEZMQUdfTUFTSzsKLQkJdG1wID0gUFRfUkVHU19FRkxBR1MoJmNoaWxkLT50aHJlYWQucmVncykgJiB+RkxBR19NQVNLOwotCQl2YWx1ZSB8PSB0bXA7Ci0JCWJyZWFrOwotCX0KLQotCVBUX1JFR1NfU0VUKCZjaGlsZC0+dGhyZWFkLnJlZ3MsIHJlZ25vLCB2YWx1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBwb2tlX3VzZXIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCi17Ci0JaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKGFkZHIgPCBNQVhfUkVHX09GRlNFVCkKLQkJcmV0dXJuIHB1dHJlZyhjaGlsZCwgYWRkciwgZGF0YSk7Ci0JZWxzZSBpZiAoKGFkZHIgPj0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pKSAmJgotCQkoYWRkciA8PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1s3XSkpKSB7Ci0JCWFkZHIgLT0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pOwotCQlhZGRyID0gYWRkciA+PiAyOwotCQlpZiAoKGFkZHIgPT0gNCkgfHwgKGFkZHIgPT0gNSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJY2hpbGQtPnRocmVhZC5hcmNoLmRlYnVncmVnc1thZGRyXSA9IGRhdGE7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTzsKLX0KLQotdW5zaWduZWQgbG9uZyBnZXRyZWcoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgaW50IHJlZ25vKQotewotCXVuc2lnbmVkIGxvbmcgcmV0dmFsID0gfjBVTDsKLQlzd2l0Y2ggKHJlZ25vKSB7Ci0JY2FzZSBGUzoKLQljYXNlIEdTOgotCWNhc2UgRFM6Ci0JY2FzZSBFUzoKLQljYXNlIFNTOgotCWNhc2UgQ1M6Ci0JCXJldHZhbCA9IDB4ZmZmZjsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkJcmV0dmFsICY9IFBUX1JFRygmY2hpbGQtPnRocmVhZC5yZWdzLCByZWdubyk7Ci0jaWZkZWYgVElGX0lBMzIKLQkJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfSUEzMikpCi0JCQlyZXR2YWwgJj0gMHhmZmZmZmZmZjsKLSNlbmRpZgotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgcGVla191c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQotewotCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JdG1wID0gMDsgIC8qIERlZmF1bHQgcmV0dXJuIGNvbmRpdGlvbiAqLwotCWlmIChhZGRyIDwgTUFYX1JFR19PRkZTRVQpCi0JCXRtcCA9IGdldHJlZyhjaGlsZCwgYWRkcik7Ci0JZWxzZSBpZiAoKGFkZHIgPj0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pKSAmJgotCQkoYWRkciA8PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1s3XSkpKSB7Ci0JCWFkZHIgLT0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pOwotCQlhZGRyID0gYWRkciA+PiAyOwotCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdOwotCX0KLQlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLX0KLQotLyogWFhYIE1vc3RseSBjb3BpZWQgZnJvbSBzeXMtaTM4NiAqLwotaW50IGlzX3N5c2NhbGwodW5zaWduZWQgbG9uZyBhZGRyKQotewotCXVuc2lnbmVkIHNob3J0IGluc3RyOwotCWludCBuOwotCi0JbiA9IGNvcHlfZnJvbV91c2VyKCZpbnN0ciwgKHZvaWQgX191c2VyICopIGFkZHIsIHNpemVvZihpbnN0cikpOwotCWlmIChuKSB7Ci0JCS8qCi0JCSAqIGFjY2Vzc19wcm9jZXNzX3ZtKCkgZ3JhbnRzIGFjY2VzcyB0byB2c3lzY2FsbCBhbmQgc3R1YiwKLQkJICogd2hpbGUgY29weV9mcm9tX3VzZXIgZG9lc24ndC4gTWF5YmUgYWNjZXNzX3Byb2Nlc3Nfdm0gaXMKLQkJICogc2xvdywgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIsIHNpbmNlIGl0IHdpbGwgYmUgY2FsbGVkIG9ubHkKLQkJICogaW4gY2FzZSBvZiBzaW5nbGVzdGVwcGluZywgaWYgY29weV9mcm9tX3VzZXIgZmFpbGVkLgotCQkgKi8KLQkJbiA9IGFjY2Vzc19wcm9jZXNzX3ZtKGN1cnJlbnQsIGFkZHIsICZpbnN0ciwgc2l6ZW9mKGluc3RyKSwgMCk7Ci0JCWlmIChuICE9IHNpemVvZihpbnN0cikpIHsKLQkJCXByaW50aygiaXNfc3lzY2FsbCA6IGZhaWxlZCB0byByZWFkIGluc3RydWN0aW9uIGZyb20gIgotCQkJICAgICAgICIweCVseFxuIiwgYWRkcik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQkvKiBzeXNlbnRlciAqLwotCXJldHVybiBpbnN0ciA9PSAweDA1MGY7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2ZwcmVncyhzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKLXsKLQlpbnQgZXJyLCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0JbG9uZyBmcHJlZ3NbSE9TVF9GUF9TSVpFXTsKLQotCUJVR19PTihzaXplb2YoKmJ1ZikgIT0gc2l6ZW9mKGZwcmVncykpOwotCWVyciA9IHNhdmVfZnBfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwgZnByZWdzKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JbiA9IGNvcHlfdG9fdXNlcihidWYsIGZwcmVncywgc2l6ZW9mKGZwcmVncykpOwotCWlmIChuID4gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGludCBzZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQotewotCWludCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0JbG9uZyBmcHJlZ3NbSE9TVF9GUF9TSVpFXTsKLQotCUJVR19PTihzaXplb2YoKmJ1ZikgIT0gc2l6ZW9mKGZwcmVncykpOwotCW4gPSBjb3B5X2Zyb21fdXNlcihmcHJlZ3MsIGJ1Ziwgc2l6ZW9mKGZwcmVncykpOwotCWlmIChuID4gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmVzdG9yZV9mcF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLCBmcHJlZ3MpOwotfQotCi1sb25nIHN1YmFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwKLQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBkYXRhKQotewotCWludCByZXQgPSAtRUlPOwotCXZvaWQgX191c2VyICpkYXRhcCA9ICh2b2lkIF9fdXNlciAqKSBkYXRhOwotCi0Jc3dpdGNoIChyZXF1ZXN0KSB7Ci0JY2FzZSBQVFJBQ0VfR0VURlBSRUdTOiAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KLQkJcmV0ID0gZ2V0X2ZwcmVncyhkYXRhcCwgY2hpbGQpOwotCQlicmVhazsKLQljYXNlIFBUUkFDRV9TRVRGUFJFR1M6IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLwotCQlyZXQgPSBzZXRfZnByZWdzKGRhdGFwLCBjaGlsZCk7Ci0JCWJyZWFrOwotCWNhc2UgUFRSQUNFX0FSQ0hfUFJDVEw6Ci0JCS8qIFhYWCBDYWxscyBwdHJhY2Ugb24gdGhlIGhvc3QgLSBuZWVkcyBzb21lIFNNUCB0aGlua2luZyAqLwotCQlyZXQgPSBhcmNoX3ByY3RsKGNoaWxkLCBkYXRhLCAodm9pZCBfX3VzZXIgKikgYWRkcik7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvcHRyYWNlX3VzZXIuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9wdHJhY2VfdXNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTdhNDk2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9wdHJhY2VfdXNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgotCi1pbnQgcHRyYWNlX2dldHJlZ3MobG9uZyBwaWQsIHVuc2lnbmVkIGxvbmcgKnJlZ3Nfb3V0KQotewotCWlmIChwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgcmVnc19vdXQpIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQlyZXR1cm4oMCk7Ci19Ci0KLWludCBwdHJhY2Vfc2V0cmVncyhsb25nIHBpZCwgdW5zaWduZWQgbG9uZyAqcmVnc19vdXQpCi17Ci0JaWYgKHB0cmFjZShQVFJBQ0VfU0VUUkVHUywgcGlkLCAwLCByZWdzX291dCkgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCXJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2JhcnJpZXIuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2JhcnJpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2MTBiZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9iYXJyaWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19TWVNERVBfWDg2XzY0X0JBUlJJRVJfSAotI2RlZmluZSBfX1NZU0RFUF9YODZfNjRfQkFSUklFUl9ICi0KLS8qIENvcGllZCBmcm9tIGluY2x1ZGUvYXNtLXg4Nl82NCBmb3IgdXNlIGJ5IHVzZXJzcGFjZS4gKi8KLSNkZWZpbmUgbWIoKSAJYXNtIHZvbGF0aWxlKCJtZmVuY2UiOjo6Im1lbW9yeSIpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmggYi9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9mYXVsdGluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5MTdiMC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9mYXVsdGluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgRnVqaXRzdSBTaWVtZW5zIENvbXB1dGVycyBHbWJICi0gKiBBdXRob3I6IEJvZG8gU3Ryb2Vzc2VyIDxic3Ryb2Vzc2VyQGZ1aml0c3Utc2llbWVucy5jb20+Ci0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX0ZBVUxUSU5GT19YODZfNjRfSAotI2RlZmluZSBfX0ZBVUxUSU5GT19YODZfNjRfSAotCi0vKiB0aGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZnVsbCBhcmNoLXNwZWNpZmljIGZhdWx0aW5mbwotICogZnJvbSB0aGUgdHJhcHMuCi0gKiBPbiBpMzg2LCBwdHJhY2VfZmF1bHRpbmZvIHVuZm9ydHVuYXRlbHkgZG9lc24ndCBwcm92aWRlCi0gKiBhbGwgdGhlIGluZm8sIHNpbmNlIHRyYXBfbm8gaXMgbWlzc2luZy4KLSAqIEFsbCBjb21tb24gZWxlbWVudHMgYXJlIGRlZmluZWQgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4KLSAqIGJvdGggc3RydWN0dXJlcywgdGh1cyBtYWtpbmcgaXQgZWFzeSB0byBjb3B5IHRoZQotICogY29udGVudHMgd2l0aG91dCBrbm93bGVkZ2UgYWJvdXQgdGhlIHN0cnVjdHVyZSBlbGVtZW50cy4KLSAqLwotc3RydWN0IGZhdWx0aW5mbyB7Ci0gICAgICAgIGludCBlcnJvcl9jb2RlOyAvKiBpbiBwdHJhY2VfZmF1bHRpbmZvIG1pc2xlYWRpbmdseSBjYWxsZWQgaXNfd3JpdGUgKi8KLSAgICAgICAgdW5zaWduZWQgbG9uZyBjcjI7IC8qIGluIHB0cmFjZV9mYXVsdGluZm8gY2FsbGVkIGFkZHIgKi8KLSAgICAgICAgaW50IHRyYXBfbm87IC8qIG1pc3NpbmcgaW4gcHRyYWNlX2ZhdWx0aW5mbyAqLwotfTsKLQotI2RlZmluZSBGQVVMVF9XUklURShmaSkgKChmaSkuZXJyb3JfY29kZSAmIDIpCi0jZGVmaW5lIEZBVUxUX0FERFJFU1MoZmkpICgoZmkpLmNyMikKLQotI2RlZmluZSBQVFJBQ0VfRlVMTF9GQVVMVElORk8gMQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2hvc3RfbGR0LmggYi9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9ob3N0X2xkdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGIxYmUxLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2hvc3RfbGR0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX0hPU1RfTERUX1g4Nl82NF9ICi0jZGVmaW5lIF9fQVNNX0hPU1RfTERUX1g4Nl82NF9ICi0KLSNpbmNsdWRlIDxhc20vbGR0Lmg+Ci0KLS8qCi0gKiBtYWNyb3Mgc3RvbGVuIGZyb20gaW5jbHVkZS9hc20teDg2XzY0L2Rlc2MuaAotICovCi0jZGVmaW5lIExEVF9lbnRyeV9hKGluZm8pIFwKLQkoKCgoaW5mbyktPmJhc2VfYWRkciAmIDB4MDAwMGZmZmYpIDw8IDE2KSB8ICgoaW5mbyktPmxpbWl0ICYgMHgwZmZmZikpCi0KLS8qIERvbid0IGFsbG93IHNldHRpbmcgb2YgdGhlIGxtIGJpdC4gSXQgaXMgdXNlbGVzcyBhbnl3YXlzIGJlY2F1c2UKLSAqIDY0Yml0IHN5c3RlbSBjYWxscyByZXF1aXJlIF9fVVNFUl9DUy4gKi8KLSNkZWZpbmUgTERUX2VudHJ5X2IoaW5mbykgXAotCSgoKGluZm8pLT5iYXNlX2FkZHIgJiAweGZmMDAwMDAwKSB8IFwKLQkoKChpbmZvKS0+YmFzZV9hZGRyICYgMHgwMGZmMDAwMCkgPj4gMTYpIHwgXAotCSgoaW5mbyktPmxpbWl0ICYgMHhmMDAwMCkgfCBcCi0JKCgoaW5mbyktPnJlYWRfZXhlY19vbmx5IF4gMSkgPDwgOSkgfCBcCi0JKChpbmZvKS0+Y29udGVudHMgPDwgMTApIHwgXAotCSgoKGluZm8pLT5zZWdfbm90X3ByZXNlbnQgXiAxKSA8PCAxNSkgfCBcCi0JKChpbmZvKS0+c2VnXzMyYml0IDw8IDIyKSB8IFwKLQkoKGluZm8pLT5saW1pdF9pbl9wYWdlcyA8PCAyMykgfCBcCi0JKChpbmZvKS0+dXNlYWJsZSA8PCAyMCkgfCBcCi0JLyogKChpbmZvKS0+bG0gPDwgMjEpIHwgKi8gXAotCTB4NzAwMCkKLQotI2RlZmluZSBMRFRfZW1wdHkoaW5mbykgKFwKLQkoaW5mbyktPmJhc2VfYWRkcgk9PSAwCSYmIFwKLQkoaW5mbyktPmxpbWl0CQk9PSAwCSYmIFwKLQkoaW5mbyktPmNvbnRlbnRzCT09IDAJJiYgXAotCShpbmZvKS0+cmVhZF9leGVjX29ubHkJPT0gMQkmJiBcCi0JKGluZm8pLT5zZWdfMzJiaXQJPT0gMAkmJiBcCi0JKGluZm8pLT5saW1pdF9pbl9wYWdlcwk9PSAwCSYmIFwKLQkoaW5mbyktPnNlZ19ub3RfcHJlc2VudAk9PSAxCSYmIFwKLQkoaW5mbyktPnVzZWFibGUJCT09IDAJJiYgXAotCShpbmZvKS0+bG0gICAgICAgICAgICAgID09IDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAva2VybmVsLW9mZnNldHMuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2tlcm5lbC1vZmZzZXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDcyMzcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAva2VybmVsLW9mZnNldHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9lbGYuaD4KLSNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9tbWFuLmg+Ci0KLSNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCi0JYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbCkpCi0KLSNkZWZpbmUgREVGSU5FX1NUUjEoeCkgI3gKLSNkZWZpbmUgREVGSU5FX1NUUihzeW0sIHZhbCkgYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgIiBERUZJTkVfU1RSMSh2YWwpICIgIiAjdmFsOiA6ICkKLQotI2RlZmluZSBCTEFOSygpIGFzbSB2b2xhdGlsZSgiXG4tPiIgOiA6ICkKLQotI2RlZmluZSBPRkZTRVQoc3ltLCBzdHIsIG1lbSkgXAotCURFRklORShzeW0sIG9mZnNldG9mKHN0cnVjdCBzdHIsIG1lbSkpOwotCi12b2lkIGZvbyh2b2lkKQotewotI2luY2x1ZGUgPGNvbW1vbi1vZmZzZXRzLmg+Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3B0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU4ZjhlLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3B0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTREVQX1g4Nl82NF9QVFJBQ0VfSAotI2RlZmluZSBfX1NZU0RFUF9YODZfNjRfUFRSQUNFX0gKLQotI2luY2x1ZGUgInVzZXJfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAic3lzZGVwL2ZhdWx0aW5mby5oIgotCi0jZGVmaW5lIE1BWF9SRUdfT0ZGU0VUIChVTV9GUkFNRV9TSVpFKQotI2RlZmluZSBNQVhfUkVHX05SICgoTUFYX1JFR19PRkZTRVQpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCi0jaW5jbHVkZSAic2thc19wdHJlZ3MuaCIKLQotI2RlZmluZSBSRUdTX0lQKHIpICgocilbSE9TVF9JUF0pCi0jZGVmaW5lIFJFR1NfU1AocikgKChyKVtIT1NUX1NQXSkKLQotI2RlZmluZSBSRUdTX1JCWChyKSAoKHIpW0hPU1RfUkJYXSkKLSNkZWZpbmUgUkVHU19SQ1gocikgKChyKVtIT1NUX1JDWF0pCi0jZGVmaW5lIFJFR1NfUkRYKHIpICgocilbSE9TVF9SRFhdKQotI2RlZmluZSBSRUdTX1JTSShyKSAoKHIpW0hPU1RfUlNJXSkKLSNkZWZpbmUgUkVHU19SREkocikgKChyKVtIT1NUX1JESV0pCi0jZGVmaW5lIFJFR1NfUkJQKHIpICgocilbSE9TVF9SQlBdKQotI2RlZmluZSBSRUdTX1JBWChyKSAoKHIpW0hPU1RfUkFYXSkKLSNkZWZpbmUgUkVHU19SOChyKSAoKHIpW0hPU1RfUjhdKQotI2RlZmluZSBSRUdTX1I5KHIpICgocilbSE9TVF9SOV0pCi0jZGVmaW5lIFJFR1NfUjEwKHIpICgocilbSE9TVF9SMTBdKQotI2RlZmluZSBSRUdTX1IxMShyKSAoKHIpW0hPU1RfUjExXSkKLSNkZWZpbmUgUkVHU19SMTIocikgKChyKVtIT1NUX1IxMl0pCi0jZGVmaW5lIFJFR1NfUjEzKHIpICgocilbSE9TVF9SMTNdKQotI2RlZmluZSBSRUdTX1IxNChyKSAoKHIpW0hPU1RfUjE0XSkKLSNkZWZpbmUgUkVHU19SMTUocikgKChyKVtIT1NUX1IxNV0pCi0jZGVmaW5lIFJFR1NfQ1MocikgKChyKVtIT1NUX0NTXSkKLSNkZWZpbmUgUkVHU19FRkxBR1MocikgKChyKVtIT1NUX0VGTEFHU10pCi0jZGVmaW5lIFJFR1NfU1MocikgKChyKVtIT1NUX1NTXSkKLQotI2RlZmluZSBIT1NUX0ZTX0JBU0UgMjEKLSNkZWZpbmUgSE9TVF9HU19CQVNFIDIyCi0jZGVmaW5lIEhPU1RfRFMgMjMKLSNkZWZpbmUgSE9TVF9FUyAyNAotI2RlZmluZSBIT1NUX0ZTIDI1Ci0jZGVmaW5lIEhPU1RfR1MgMjYKLQotLyogQWxzbyBkZWZpbmVkIGluIGFzbS9wdHJhY2UteDg2XzY0LmgsIGJ1dCBub3QgaW4gbGliYyBoZWFkZXJzLiAgU28sIHRoZXNlCi0gKiBhcmUgYWxyZWFkeSBkZWZpbmVkIGZvciBrZXJuZWwgY29kZSwgYnV0IG5vdCBmb3IgdXNlcnNwYWNlIGNvZGUuCi0gKi8KLSNpZm5kZWYgRlNfQkFTRQotLyogVGhlc2UgYXJlbid0IGRlZmluZWQgaW4gcHRyYWNlLmgsIGJ1dCBleGlzdCBpbiBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCwKLSAqIHdoaWNoIGlzIHdoYXQgeDg2XzY0IHB0cmFjZSBhY3R1YWxseSB1c2VzLgotICovCi0jZGVmaW5lIEZTX0JBU0UgKEhPU1RfRlNfQkFTRSAqIHNpemVvZihsb25nKSkKLSNkZWZpbmUgR1NfQkFTRSAoSE9TVF9HU19CQVNFICogc2l6ZW9mKGxvbmcpKQotI2RlZmluZSBEUyAoSE9TVF9EUyAqIHNpemVvZihsb25nKSkKLSNkZWZpbmUgRVMgKEhPU1RfRVMgKiBzaXplb2YobG9uZykpCi0jZGVmaW5lIEZTIChIT1NUX0ZTICogc2l6ZW9mKGxvbmcpKQotI2RlZmluZSBHUyAoSE9TVF9HUyAqIHNpemVvZihsb25nKSkKLSNlbmRpZgotCi0jZGVmaW5lIFJFR1NfRlNfQkFTRShyKSAoKHIpW0hPU1RfRlNfQkFTRV0pCi0jZGVmaW5lIFJFR1NfR1NfQkFTRShyKSAoKHIpW0hPU1RfR1NfQkFTRV0pCi0jZGVmaW5lIFJFR1NfRFMocikgKChyKVtIT1NUX0RTXSkKLSNkZWZpbmUgUkVHU19FUyhyKSAoKHIpW0hPU1RfRVNdKQotI2RlZmluZSBSRUdTX0ZTKHIpICgocilbSE9TVF9GU10pCi0jZGVmaW5lIFJFR1NfR1MocikgKChyKVtIT1NUX0dTXSkKLQotI2RlZmluZSBSRUdTX09SSUdfUkFYKHIpICgocilbSE9TVF9PUklHX1JBWF0pCi0KLSNkZWZpbmUgUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4ociwgcmVzKSBSRUdTX1JBWChyKSA9IChyZXMpCi0KLSNkZWZpbmUgUkVHU19SRVNUQVJUX1NZU0NBTEwocikgSVBfUkVTVEFSVF9TWVNDQUxMKFJFR1NfSVAocikpCi0KLSNkZWZpbmUgUkVHU19TRUdWX0lTX0ZJWEFCTEUocikgU0VHVl9JU19GSVhBQkxFKChyKS0+dHJhcF90eXBlKQotCi0jZGVmaW5lIFJFR1NfRkFVTFRfQUREUihyKSAoKHIpLT5mYXVsdF9hZGRyKQotCi0jZGVmaW5lIFJFR1NfRkFVTFRfV1JJVEUocikgRkFVTFRfV1JJVEUoKHIpLT5mYXVsdF90eXBlKQotCi0jZGVmaW5lIFJFR1NfVFJBUChyKSAoKHIpLT50cmFwX3R5cGUpCi0KLSNkZWZpbmUgUkVHU19FUlIocikgKChyKS0+ZmF1bHRfdHlwZSkKLQotc3RydWN0IHVtbF9wdF9yZWdzIHsKLQl1bnNpZ25lZCBsb25nIGdwW01BWF9SRUdfTlJdOwotCXVuc2lnbmVkIGxvbmcgZnBbSE9TVF9GUF9TSVpFXTsKLQlzdHJ1Y3QgZmF1bHRpbmZvIGZhdWx0aW5mbzsKLQlsb25nIHN5c2NhbGw7Ci0JaW50IGlzX3VzZXI7Ci19OwotCi0jZGVmaW5lIEVNUFRZX1VNTF9QVF9SRUdTIHsgfQotCi0jZGVmaW5lIFVQVF9SQlgocikgUkVHU19SQlgoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1JDWChyKSBSRUdTX1JDWCgociktPmdwKQotI2RlZmluZSBVUFRfUkRYKHIpIFJFR1NfUkRYKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9SU0kocikgUkVHU19SU0koKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1JESShyKSBSRUdTX1JESSgociktPmdwKQotI2RlZmluZSBVUFRfUkJQKHIpIFJFR1NfUkJQKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9SQVgocikgUkVHU19SQVgoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1I4KHIpIFJFR1NfUjgoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1I5KHIpIFJFR1NfUjkoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1IxMChyKSBSRUdTX1IxMCgociktPmdwKQotI2RlZmluZSBVUFRfUjExKHIpIFJFR1NfUjExKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9SMTIocikgUkVHU19SMTIoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1IxMyhyKSBSRUdTX1IxMygociktPmdwKQotI2RlZmluZSBVUFRfUjE0KHIpIFJFR1NfUjE0KChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9SMTUocikgUkVHU19SMTUoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0NTKHIpIFJFR1NfQ1MoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0ZTX0JBU0UocikgUkVHU19GU19CQVNFKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9GUyhyKSBSRUdTX0ZTKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9HU19CQVNFKHIpIFJFR1NfR1NfQkFTRSgociktPmdwKQotI2RlZmluZSBVUFRfR1MocikgUkVHU19HUygociktPmdwKQotI2RlZmluZSBVUFRfRFMocikgUkVHU19EUygociktPmdwKQotI2RlZmluZSBVUFRfRVMocikgUkVHU19FUygociktPmdwKQotI2RlZmluZSBVUFRfQ1MocikgUkVHU19DUygociktPmdwKQotI2RlZmluZSBVUFRfU1MocikgUkVHU19TUygociktPmdwKQotI2RlZmluZSBVUFRfT1JJR19SQVgocikgUkVHU19PUklHX1JBWCgociktPmdwKQotCi0jZGVmaW5lIFVQVF9JUChyKSBSRUdTX0lQKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9TUChyKSBSRUdTX1NQKChyKS0+Z3ApCi0KLSNkZWZpbmUgVVBUX0VGTEFHUyhyKSBSRUdTX0VGTEFHUygociktPmdwKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9OUihyKSAoKHIpLT5zeXNjYWxsKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9SRVQocikgVVBUX1JBWChyKQotCi1leHRlcm4gaW50IHVzZXJfY29udGV4dCh1bnNpZ25lZCBsb25nIHNwKTsKLQotI2RlZmluZSBVUFRfSVNfVVNFUihyKSAoKHIpLT5pc191c2VyKQotCi0jZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzEocikgVVBUX1JESShyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkcyKHIpIFVQVF9SU0kocikKLSNkZWZpbmUgVVBUX1NZU0NBTExfQVJHMyhyKSBVUFRfUkRYKHIpCi0jZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzQocikgVVBUX1IxMChyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc1KHIpIFVQVF9SOChyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc2KHIpIFVQVF9SOShyKQotCi1zdHJ1Y3Qgc3lzY2FsbF9hcmdzIHsKLQl1bnNpZ25lZCBsb25nIGFyZ3NbNl07Ci19OwotCi0jZGVmaW5lIFNZU0NBTExfQVJHUyhyKSAoKHN0cnVjdCBzeXNjYWxsX2FyZ3MpIFwKLQkJCSB7IC5hcmdzID0geyBVUFRfU1lTQ0FMTF9BUkcxKHIpLAkgXAotCQkJCSAgICAgVVBUX1NZU0NBTExfQVJHMihyKSwJIFwKLQkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzMociksCSBcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc0KHIpLAkgXAotCQkJCSAgICAgVVBUX1NZU0NBTExfQVJHNShyKSwJIFwKLQkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzYocikgfSB9ICkKLQotI2RlZmluZSBVUFRfUkVHKHJlZ3MsIHJlZykgXAotCSh7ICAgICAgdW5zaWduZWQgbG9uZyB2YWw7CQlcCi0JCXN3aXRjaChyZWcpewkJCQkJCVwKLQkJY2FzZSBSODogdmFsID0gVVBUX1I4KHJlZ3MpOyBicmVhazsJCQlcCi0JCWNhc2UgUjk6IHZhbCA9IFVQVF9SOShyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxMDogdmFsID0gVVBUX1IxMChyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxMTogdmFsID0gVVBUX1IxMShyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxMjogdmFsID0gVVBUX1IxMihyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxMzogdmFsID0gVVBUX1IxMyhyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxNDogdmFsID0gVVBUX1IxNChyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxNTogdmFsID0gVVBUX1IxNShyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFJJUDogdmFsID0gVVBUX0lQKHJlZ3MpOyBicmVhazsJCQlcCi0JCWNhc2UgUlNQOiB2YWwgPSBVUFRfU1AocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSQVg6IHZhbCA9IFVQVF9SQVgocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSQlg6IHZhbCA9IFVQVF9SQlgocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSQ1g6IHZhbCA9IFVQVF9SQ1gocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSRFg6IHZhbCA9IFVQVF9SRFgocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSU0k6IHZhbCA9IFVQVF9SU0kocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSREk6IHZhbCA9IFVQVF9SREkocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSQlA6IHZhbCA9IFVQVF9SQlAocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBPUklHX1JBWDogdmFsID0gVVBUX09SSUdfUkFYKHJlZ3MpOyBicmVhazsJCVwKLQkJY2FzZSBDUzogdmFsID0gVVBUX0NTKHJlZ3MpOyBicmVhazsJCQlcCi0JCWNhc2UgU1M6IHZhbCA9IFVQVF9TUyhyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIEZTX0JBU0U6IHZhbCA9IFVQVF9GU19CQVNFKHJlZ3MpOyBicmVhazsJCVwKLQkJY2FzZSBHU19CQVNFOiB2YWwgPSBVUFRfR1NfQkFTRShyZWdzKTsgYnJlYWs7CQlcCi0JCWNhc2UgRFM6IHZhbCA9IFVQVF9EUyhyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIEVTOiB2YWwgPSBVUFRfRVMocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBGUyA6IHZhbCA9IFVQVF9GUyAocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBHUzogdmFsID0gVVBUX0dTKHJlZ3MpOyBicmVhazsJCQlcCi0JCWNhc2UgRUZMQUdTOiB2YWwgPSBVUFRfRUZMQUdTKHJlZ3MpOyBicmVhazsJCVwKLQkJZGVmYXVsdCA6CQkJCQkJXAotCQkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBVUFRfUkVHIDogJWRcbiIsIHJlZyk7CVwKLQkJCXZhbCA9IC0xOwkJCQkJXAotCQl9CQkJCQkJCVwKLQkJdmFsOwkJCQkJCQlcCi0JfSkKLQotCi0jZGVmaW5lIFVQVF9TRVQocmVncywgcmVnLCB2YWwpIFwKLQkoeyAgICAgIHVuc2lnbmVkIGxvbmcgX191cHRfdmFsID0gdmFsOwlcCi0JCXN3aXRjaChyZWcpewkJCQkJCVwKLQkJY2FzZSBSODogVVBUX1I4KHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSOTogVVBUX1I5KHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSMTA6IFVQVF9SMTAocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFIxMTogVVBUX1IxMShyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUjEyOiBVUFRfUjEyKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSMTM6IFVQVF9SMTMocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFIxNDogVVBUX1IxNChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUjE1OiBVUFRfUjE1KHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSSVA6IFVQVF9JUChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUlNQOiBVUFRfU1AocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFJBWDogVVBUX1JBWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUkJYOiBVUFRfUkJYKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSQ1g6IFVQVF9SQ1gocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFJEWDogVVBUX1JEWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUlNJOiBVUFRfUlNJKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSREk6IFVQVF9SREkocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFJCUDogVVBUX1JCUChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgT1JJR19SQVg6IFVQVF9PUklHX1JBWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CVwKLQkJY2FzZSBDUzogVVBUX0NTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBTUzogVVBUX1NTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBGU19CQVNFOiBVUFRfRlNfQkFTRShyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CVwKLQkJY2FzZSBHU19CQVNFOiBVUFRfR1NfQkFTRShyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CVwKLQkJY2FzZSBEUzogVVBUX0RTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBFUzogVVBUX0VTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBGUzogVVBUX0ZTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBHUzogVVBUX0dTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBFRkxBR1M6IFVQVF9FRkxBR1MocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwlcCi0JCWRlZmF1bHQgOgkJCQkJCVwKLQkJCXBhbmljKCJCYWQgcmVnaXN0ZXIgaW4gVVBUX1NFVCA6ICVkXG4iLCByZWcpOwlcCi0JCQlicmVhazsJCQkJCQlcCi0JCX0JCQkJCQkJXAotCQlfX3VwdF92YWw7CQkJCQkJXAotCX0pCi0KLSNkZWZpbmUgVVBUX1NFVF9TWVNDQUxMX1JFVFVSTihyLCByZXMpIFwKLQlSRUdTX1NFVF9TWVNDQUxMX1JFVFVSTigociktPnJlZ3MsIChyZXMpKQotCi0jZGVmaW5lIFVQVF9SRVNUQVJUX1NZU0NBTEwocikgUkVHU19SRVNUQVJUX1NZU0NBTEwoKHIpLT5ncCkKLQotI2RlZmluZSBVUFRfU0VHVl9JU19GSVhBQkxFKHIpIFJFR1NfU0VHVl9JU19GSVhBQkxFKCZyLT5za2FzKQotCi0jZGVmaW5lIFVQVF9GQVVMVElORk8ocikgKCYociktPmZhdWx0aW5mbykKLQotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaW5pdF9yZWdpc3RlcnMoaW50IHBpZCkKLXsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9wdHJhY2VfdXNlci5oIGIvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvcHRyYWNlX3VzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiY2NkYi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9wdHJhY2VfdXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTREVQX1g4Nl82NF9QVFJBQ0VfVVNFUl9IX18KLSNkZWZpbmUgX19TWVNERVBfWDg2XzY0X1BUUkFDRV9VU0VSX0hfXwotCi0jZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUwotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jdW5kZWYgX19GUkFNRV9PRkZTRVRTCi0jaW5jbHVkZSAidXNlcl9jb25zdGFudHMuaCIKLQotI2RlZmluZSBQVF9JTkRFWChvZmYpICgob2ZmKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkKLQotI2RlZmluZSBQVF9TWVNDQUxMX05SKHJlZ3MpICgocmVncylbUFRfSU5ERVgoT1JJR19SQVgpXSkKLSNkZWZpbmUgUFRfU1lTQ0FMTF9OUl9PRkZTRVQgKE9SSUdfUkFYKQotCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHMShyZWdzKSAoKCh1bnNpZ25lZCBsb25nICopIChyZWdzKSlbUFRfSU5ERVgoUkRJKV0pCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHMV9PRkZTRVQgKFJESSkKLQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzIocmVncykgKCgodW5zaWduZWQgbG9uZyAqKSAocmVncykpW1BUX0lOREVYKFJTSSldKQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzJfT0ZGU0VUIChSU0kpCi0KLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkczKHJlZ3MpICgoKHVuc2lnbmVkIGxvbmcgKikgKHJlZ3MpKVtQVF9JTkRFWChSRFgpXSkKLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkczX09GRlNFVCAoUkRYKQotCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNChyZWdzKSAoKCh1bnNpZ25lZCBsb25nICopIChyZWdzKSlbUFRfSU5ERVgoUkNYKV0pCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNF9PRkZTRVQgKFJDWCkKLQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzUocmVncykgKCgodW5zaWduZWQgbG9uZyAqKSAocmVncykpW1BUX0lOREVYKFI4KV0pCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNV9PRkZTRVQgKFI4KQotCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNihyZWdzKSAoKCh1bnNpZ25lZCBsb25nICopIChyZWdzKSlbUFRfSU5ERVgoUjkpXSkKLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkc2X09GRlNFVCAoUjkpCi0KLSNkZWZpbmUgUFRfU1lTQ0FMTF9SRVRfT0ZGU0VUIChSQVgpCi0KLSNkZWZpbmUgUFRfSVBfT0ZGU0VUIChSSVApCi0jZGVmaW5lIFBUX0lQKHJlZ3MpICgocmVncylbUFRfSU5ERVgoUklQKV0pCi0KLSNkZWZpbmUgUFRfU1BfT0ZGU0VUIChSU1ApCi0jZGVmaW5lIFBUX1NQKHJlZ3MpICgocmVncylbUFRfSU5ERVgoUlNQKV0pCi0KLSNkZWZpbmUgUFRfT1JJR19SQVhfT0ZGU0VUIChPUklHX1JBWCkKLSNkZWZpbmUgUFRfT1JJR19SQVgocmVncykgKChyZWdzKVtQVF9JTkRFWChPUklHX1JBWCldKQotCi0vKgotICogeDg2XzY0IEZDMyBkb2Vzbid0IGRlZmluZSB0aGlzIGluIC91c3IvaW5jbHVkZS9saW51eC9wdHJhY2UuaCBldmVuIHRob3VnaAotICogaXQncyBkZWZpbmVkIGluIHRoZSBrZXJuZWwncyBpbmNsdWRlL2xpbnV4L3B0cmFjZS5oLiBBZGRpdGlvbmFsbHksIHVzZSB0aGUKLSAqIDIuNCBuYW1lIGFuZCB2YWx1ZSBmb3IgMi40IGhvc3QgY29tcGF0aWJpbGl0eS4KLSAqLwotI2lmbmRlZiBQVFJBQ0VfT0xEU0VUT1BUSU9OUwotI2RlZmluZSBQVFJBQ0VfT0xEU0VUT1BUSU9OUyAyMQotI2VuZGlmCi0KLS8qCi0gKiBUaGVzZSBhcmUgYmVmb3JlIHRoZSBzeXN0ZW0gY2FsbCwgc28gdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpcyBSQVgKLSAqIHJhdGhlciB0aGFuIE9SSUdfUkFYLCBhbmQgYXJnNCBpcyBSMTAgcmF0aGVyIHRoYW4gUkNYCi0gKi8KLSNkZWZpbmUgUkVHU19TWVNDQUxMX05SIFBUX0lOREVYKFJBWCkKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzEgUFRfSU5ERVgoUkRJKQotI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMiBQVF9JTkRFWChSU0kpCi0jZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkczIFBUX0lOREVYKFJEWCkKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzQgUFRfSU5ERVgoUjEwKQotI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNSBQVF9JTkRFWChSOCkKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzYgUFRfSU5ERVgoUjkpCi0KLSNkZWZpbmUgUkVHU19JUF9JTkRFWCBQVF9JTkRFWChSSVApCi0jZGVmaW5lIFJFR1NfU1BfSU5ERVggUFRfSU5ERVgoUlNQKQotCi0jZGVmaW5lIEZQX1NJWkUgKEhPU1RfRlBfU0laRSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zYy5oIGIvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlZTQ1Yi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotI2lmbmRlZiBfX1NZU0RFUF9YODZfNjRfU0NfSAotI2RlZmluZSBfX1NZU0RFUF9YODZfNjRfU0NfSAotCi0vKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA0IFBhdGhTY2FsZSwgSW5jCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPHVzZXJfY29uc3RhbnRzLmg+Ci0KLSNkZWZpbmUgU0NfT0ZGU0VUKHNjLCBmaWVsZCkgXAotCSAqKCh1bnNpZ25lZCBsb25nICopICYoKChjaGFyICopIChzYykpW0hPU1RfIyNmaWVsZF0pKQotCi0jZGVmaW5lIFNDX1JCWChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SQlgpCi0jZGVmaW5lIFNDX1JDWChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SQ1gpCi0jZGVmaW5lIFNDX1JEWChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SRFgpCi0jZGVmaW5lIFNDX1JTSShzYykgU0NfT0ZGU0VUKHNjLCBTQ19SU0kpCi0jZGVmaW5lIFNDX1JESShzYykgU0NfT0ZGU0VUKHNjLCBTQ19SREkpCi0jZGVmaW5lIFNDX1JCUChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SQlApCi0jZGVmaW5lIFNDX1JBWChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SQVgpCi0jZGVmaW5lIFNDX1I4KHNjKSBTQ19PRkZTRVQoc2MsIFNDX1I4KQotI2RlZmluZSBTQ19SOShzYykgU0NfT0ZGU0VUKHNjLCBTQ19SOSkKLSNkZWZpbmUgU0NfUjEwKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxMCkKLSNkZWZpbmUgU0NfUjExKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxMSkKLSNkZWZpbmUgU0NfUjEyKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxMikKLSNkZWZpbmUgU0NfUjEzKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxMykKLSNkZWZpbmUgU0NfUjE0KHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxNCkKLSNkZWZpbmUgU0NfUjE1KHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxNSkKLSNkZWZpbmUgU0NfSVAoc2MpIFNDX09GRlNFVChzYywgU0NfSVApCi0jZGVmaW5lIFNDX1NQKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1NQKQotI2RlZmluZSBTQ19DUjIoc2MpIFNDX09GRlNFVChzYywgU0NfQ1IyKQotI2RlZmluZSBTQ19FUlIoc2MpIFNDX09GRlNFVChzYywgU0NfRVJSKQotI2RlZmluZSBTQ19UUkFQTk8oc2MpIFNDX09GRlNFVChzYywgU0NfVFJBUE5PKQotI2RlZmluZSBTQ19DUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19DUykKLSNkZWZpbmUgU0NfRlMoc2MpIFNDX09GRlNFVChzYywgU0NfRlMpCi0jZGVmaW5lIFNDX0dTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0dTKQotI2RlZmluZSBTQ19FRkxBR1Moc2MpIFNDX09GRlNFVChzYywgU0NfRUZMQUdTKQotI2RlZmluZSBTQ19TSUdNQVNLKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1NJR01BU0spCi0jZGVmaW5lIFNDX1NTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1NTKQotI2lmIDAKLSNkZWZpbmUgU0NfT1JJR19SQVgoc2MpIFNDX09GRlNFVChzYywgU0NfT1JJR19SQVgpCi0jZGVmaW5lIFNDX0RTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0RTKQotI2RlZmluZSBTQ19FUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19FUykKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3NpZ2NvbnRleHQuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3NpZ2NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1NTEzMy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zaWdjb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgUGF0aFNjYWxlLCBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNERVBfWDg2XzY0X1NJR0NPTlRFWFRfSAotI2RlZmluZSBfX1NZU0RFUF9YODZfNjRfU0lHQ09OVEVYVF9ICi0KLSNpbmNsdWRlIDxzeXNkZXAvc2MuaD4KLQotI2RlZmluZSBJUF9SRVNUQVJUX1NZU0NBTEwoaXApICgoaXApIC09IDIpCi0KLSNkZWZpbmUgR0VUX0ZBVUxUSU5GT19GUk9NX1NDKGZpLCBzYykgXAotCXsgXAotCQkoZmkpLmNyMiA9IFNDX0NSMihzYyk7IFwKLQkJKGZpKS5lcnJvcl9jb2RlID0gU0NfRVJSKHNjKTsgXAotCQkoZmkpLnRyYXBfbm8gPSBTQ19UUkFQTk8oc2MpOyBcCi0JfQotCi0vKiBUaGlzIGlzIFBhZ2UgRmF1bHQgKi8KLSNkZWZpbmUgU0VHVl9JU19GSVhBQkxFKGZpKQkoKGZpKS0+dHJhcF9ubyA9PSAxNCkKLQotLyogTm8gYnJva2VuIFNLQVMgQVBJLCB3aGljaCBkb2Vzbid0IHBhc3MgdHJhcF9ubywgaGVyZS4gKi8KLSNkZWZpbmUgU0VHVl9NQVlCRV9GSVhBQkxFKGZpKQkwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc2thc19wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3NrYXNfcHRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZGI0YmU3Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3NrYXNfcHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTREVQX1g4Nl82NF9TS0FTX1BUUkFDRV9ICi0jZGVmaW5lIF9fU1lTREVQX1g4Nl82NF9TS0FTX1BUUkFDRV9ICi0KLXN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvIHsKLSAgICAgICAgaW50IGlzX3dyaXRlOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci19OwotCi1zdHJ1Y3QgcHRyYWNlX2xkdCB7Ci0gICAgICAgIGludCBmdW5jOwotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50OwotfTsKLQotI2RlZmluZSBQVFJBQ0VfTERUIDU0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3R1Yi5oIGIvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMyYWEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3N0dWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9TVFVCX0gKLSNkZWZpbmUgX19TWVNERVBfU1RVQl9ICi0KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXNkZXAvcHRyYWNlX3VzZXIuaD4KLSNpbmNsdWRlICJhcy1sYXlvdXQuaCIKLSNpbmNsdWRlICJzdHViLWRhdGEuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgotCi1leHRlcm4gdm9pZCBzdHViX3NlZ3ZfaGFuZGxlcihpbnQgc2lnKTsKLWV4dGVybiB2b2lkIHN0dWJfY2xvbmVfaGFuZGxlcih2b2lkKTsKLQotI2RlZmluZSBTVFVCX1NZU0NBTExfUkVUIFBUX0lOREVYKFJBWCkKLSNkZWZpbmUgU1RVQl9NTUFQX05SIF9fTlJfbW1hcAotI2RlZmluZSBNTUFQX09GRlNFVChvKSAobykKLQotI2RlZmluZSBfX3N5c2NhbGxfY2xvYmJlciAicjExIiwicmN4IiwibWVtb3J5IgotI2RlZmluZSBfX3N5c2NhbGwgInN5c2NhbGwiCi0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwwKGxvbmcgc3lzY2FsbCkKLXsKLQlsb25nIHJldDsKLQotCV9fYXNtX18gdm9sYXRpbGUgKF9fc3lzY2FsbAotCQk6ICI9YSIgKHJldCkKLQkJOiAiMCIgKHN5c2NhbGwpIDogX19zeXNjYWxsX2Nsb2JiZXIgKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwyKGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlIChfX3N5c2NhbGwKLQkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChzeXNjYWxsKSwgIkQiIChhcmcxKSwgIlMiIChhcmcyKSA6IF9fc3lzY2FsbF9jbG9iYmVyICk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMyhsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlIChfX3N5c2NhbGwKLQkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChzeXNjYWxsKSwgIkQiIChhcmcxKSwgIlMiIChhcmcyKSwgImQiIChhcmczKQotCQk6IF9fc3lzY2FsbF9jbG9iYmVyICk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNChsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCi0JCQkJIGxvbmcgYXJnNCkKLXsKLQlsb25nIHJldDsKLQotCV9fYXNtX18gdm9sYXRpbGUgKCJtb3ZxICU1LCUlcjEwIDsgIiBfX3N5c2NhbGwKLQkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChzeXNjYWxsKSwgIkQiIChhcmcxKSwgIlMiIChhcmcyKSwgImQiIChhcmczKSwKLQkJICAiZyIgKGFyZzQpCi0JCTogX19zeXNjYWxsX2Nsb2JiZXIsICJyMTAiICk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNShsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCi0JCQkJIGxvbmcgYXJnNCwgbG9uZyBhcmc1KQotewotCWxvbmcgcmV0OwotCi0JX19hc21fXyB2b2xhdGlsZSAoIm1vdnEgJTUsJSVyMTAgOyBtb3ZxICU2LCUlcjggOyAiIF9fc3lzY2FsbAotCQk6ICI9YSIgKHJldCkKLQkJOiAiMCIgKHN5c2NhbGwpLCAiRCIgKGFyZzEpLCAiUyIgKGFyZzIpLCAiZCIgKGFyZzMpLAotCQkgICJnIiAoYXJnNCksICJnIiAoYXJnNSkKLQkJOiBfX3N5c2NhbGxfY2xvYmJlciwgInIxMCIsICJyOCIgKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFwX215c2VsZih2b2lkKQotewotCV9fYXNtKCJpbnQzIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1hcF9zdGFjayhsb25nIGZkLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlfX2FzbV9fIHZvbGF0aWxlICgibW92cSAlNCwlJXIxMCA7IG1vdnEgJTUsJSVyOCA7ICIKLQkJCSAgIm1vdnEgJTYsICUlcjk7ICIgX19zeXNjYWxsICI7IG1vdnEgJTcsICUlcmJ4IDsgIgotCQkJICAibW92cSAlJXJheCwgKCUlcmJ4KSI6Ci0JCQkgIDogImEiIChTVFVCX01NQVBfTlIpLCAiRCIgKFNUVUJfREFUQSksCi0JCQkgICAgIlMiIChVTV9LRVJOX1BBR0VfU0laRSksCi0JCQkgICAgImQiIChQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyIgKE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQpLCAiZyIgKGZkKSwKLQkJCSAgICAiZyIgKG9mZnNldCksCi0JCQkgICAgImkiICgmKChzdHJ1Y3Qgc3R1Yl9kYXRhICopIFNUVUJfREFUQSktPmVycikKLQkJCSAgOiBfX3N5c2NhbGxfY2xvYmJlciwgInIxMCIsICJyOCIsICJyOSIgKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zeXNjYWxscy5oIGIvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3lzY2FsbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmYjBiMDguLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3lzY2FsbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9YODZfNjRfU1lTQ0FMTFNfSF9fCi0jZGVmaW5lIF9fU1lTREVQX1g4Nl82NF9TWVNDQUxMU19IX18KLQotI2luY2x1ZGUgPGxpbnV4L21zZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NobS5oPgotI2luY2x1ZGUgPGtlcm5fY29uc3RhbnRzLmg+Ci0KLXR5cGVkZWYgbG9uZyBzeXNjYWxsX2hhbmRsZXJfdCh2b2lkKTsKLQotZXh0ZXJuIHN5c2NhbGxfaGFuZGxlcl90ICpzeXNfY2FsbF90YWJsZVtdOwotCi0jZGVmaW5lIEVYRUNVVEVfU1lTQ0FMTChzeXNjYWxsLCByZWdzKSBcCi0JKCgobG9uZyAoKikobG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZykpIFwKLQkgICgqc3lzX2NhbGxfdGFibGVbc3lzY2FsbF0pKShVUFRfU1lTQ0FMTF9BUkcxKCZyZWdzLT5yZWdzKSwgXAotCQkgCQkgICAgICBVUFRfU1lTQ0FMTF9BUkcyKCZyZWdzLT5yZWdzKSwgXAotCQkJCSAgICAgIFVQVF9TWVNDQUxMX0FSRzMoJnJlZ3MtPnJlZ3MpLCBcCi0JCQkJICAgICAgVVBUX1NZU0NBTExfQVJHNCgmcmVncy0+cmVncyksIFwKLQkJCQkgICAgICBVUFRfU1lTQ0FMTF9BUkc1KCZyZWdzLT5yZWdzKSwgXAotCQkJCSAgICAgIFVQVF9TWVNDQUxMX0FSRzYoJnJlZ3MtPnJlZ3MpKSkKLQotZXh0ZXJuIGxvbmcgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJICAgICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZik7Ci1leHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX21vZGlmeV9sZHQ7Ci1leHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX2FyY2hfcHJjdGw7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3lzdGVtLmggYi9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiOTNjNC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zeXN0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0jaWZuZGVmIF9BU01fWDg2X1NZU1RFTV9IXwotI2RlZmluZSBfQVNNX1g4Nl9TWVNURU1fSF8KLQotI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KLSNpbmNsdWRlIDxhc20vbm9wcy5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KLQotLyogZW50cmllcyBpbiBBUkNIX0RMSU5GTzogKi8KLSNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLSMgZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0FSQ0ggMgotI2Vsc2UKLSMgZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0FSQ0ggMQotI2VuZGlmCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCk7Ci0KLXZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOwotCi0vKgotICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KLSAqIEFuZCB5ZXMsIHRoaXMgaXMgcmVxdWlyZWQgb24gVVAgdG9vIHdoZW4gd2UncmUgdGFsa2luZwotICogdG8gZGV2aWNlcy4KLSAqLwotI2lmZGVmIENPTkZJR19YODZfMzIKLS8qCi0gKiBTb21lIG5vbi1JbnRlbCBjbG9uZXMgc3VwcG9ydCBvdXQgb2Ygb3JkZXIgc3RvcmUuIHdtYigpIGNlYXNlcyB0byBiZSBhCi0gKiBub3AgZm9yIHRoZXNlLgotICovCi0jZGVmaW5lIG1iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAibWZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NMikKLSNkZWZpbmUgcm1iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NMikKLSNkZWZpbmUgd21iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAic2ZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NKQotI2Vsc2UKLSNkZWZpbmUgbWIoKSAJYXNtIHZvbGF0aWxlKCJtZmVuY2UiOjo6Im1lbW9yeSIpCi0jZGVmaW5lIHJtYigpCWFzbSB2b2xhdGlsZSgibGZlbmNlIjo6OiJtZW1vcnkiKQotI2RlZmluZSB3bWIoKQlhc20gdm9sYXRpbGUoInNmZW5jZSIgOjo6ICJtZW1vcnkiKQotI2VuZGlmCi0KLS8qKgotICogcmVhZF9iYXJyaWVyX2RlcGVuZHMgLSBGbHVzaCBhbGwgcGVuZGluZyByZWFkcyB0aGF0IHN1YnNlcXVlbnRzIHJlYWRzCi0gKiBkZXBlbmQgb24uCi0gKgotICogTm8gZGF0YS1kZXBlbmRlbnQgcmVhZHMgZnJvbSBtZW1vcnktbGlrZSByZWdpb25zIGFyZSBldmVyIHJlb3JkZXJlZAotICogb3ZlciB0aGlzIGJhcnJpZXIuICBBbGwgcmVhZHMgcHJlY2VkaW5nIHRoaXMgcHJpbWl0aXZlIGFyZSBndWFyYW50ZWVkCi0gKiB0byBhY2Nlc3MgbWVtb3J5IChidXQgbm90IG5lY2Vzc2FyaWx5IG90aGVyIENQVXMnIGNhY2hlcykgYmVmb3JlIGFueQotICogcmVhZHMgZm9sbG93aW5nIHRoaXMgcHJpbWl0aXZlIHRoYXQgZGVwZW5kIG9uIHRoZSBkYXRhIHJldHVybiBieQotICogYW55IG9mIHRoZSBwcmVjZWRpbmcgcmVhZHMuICBUaGlzIHByaW1pdGl2ZSBpcyBtdWNoIGxpZ2h0ZXIgd2VpZ2h0IHRoYW4KLSAqIHJtYigpIG9uIG1vc3QgQ1BVcywgYW5kIGlzIG5ldmVyIGhlYXZpZXIgd2VpZ2h0IHRoYW4gaXMKLSAqIHJtYigpLgotICoKLSAqIFRoZXNlIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZSByZXNwZWN0ZWQgYnkgYm90aCB0aGUgbG9jYWwgQ1BVCi0gKiBhbmQgdGhlIGNvbXBpbGVyLgotICoKLSAqIE9yZGVyaW5nIGlzIG5vdCBndWFyYW50ZWVkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4gdGhlc2UgcHJpbWl0aXZlcywKLSAqIG5vdCBldmVuIGJ5IGRhdGEgZGVwZW5kZW5jaWVzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgotICogbWVtb3J5X2JhcnJpZXIoKSBmb3IgZXhhbXBsZXMgYW5kIFVSTHMgdG8gbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIGZvcmNlIG9yZGVyaW5nICh0aGUgaW5pdGlhbAotICogdmFsdWUgb2YgImEiIGlzIHplcm8sICJiIiBpcyBvbmUsIGFuZCAicCIgaXMgIiZhIik6Ci0gKgotICogPHByb2dyYW1saXN0aW5nPgotICoJQ1BVIDAJCQkJQ1BVIDEKLSAqCi0gKgliID0gMjsKLSAqCW1lbW9yeV9iYXJyaWVyKCk7Ci0gKglwID0gJmI7CQkJCXEgPSBwOwotICoJCQkJCXJlYWRfYmFycmllcl9kZXBlbmRzKCk7Ci0gKgkJCQkJZCA9ICpxOwotICogPC9wcm9ncmFtbGlzdGluZz4KLSAqCi0gKiBiZWNhdXNlIHRoZSByZWFkIG9mICIqcSIgZGVwZW5kcyBvbiB0aGUgcmVhZCBvZiAicCIgYW5kIHRoZXNlCi0gKiB0d28gcmVhZHMgYXJlIHNlcGFyYXRlZCBieSBhIHJlYWRfYmFycmllcl9kZXBlbmRzKCkuICBIb3dldmVyLAotICogdGhlIGZvbGxvd2luZyBjb2RlLCB3aXRoIHRoZSBzYW1lIGluaXRpYWwgdmFsdWVzIGZvciAiYSIgYW5kICJiIjoKLSAqCi0gKiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gKglDUFUgMAkJCQlDUFUgMQotICoKLSAqCWEgPSAyOwotICoJbWVtb3J5X2JhcnJpZXIoKTsKLSAqCWIgPSAzOwkJCQl5ID0gYjsKLSAqCQkJCQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotICoJCQkJCXggPSBhOwotICogPC9wcm9ncmFtbGlzdGluZz4KLSAqCi0gKiBkb2VzIG5vdCBlbmZvcmNlIG9yZGVyaW5nLCBzaW5jZSB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kgYmV0d2VlbgotICogdGhlIHJlYWQgb2YgImEiIGFuZCB0aGUgcmVhZCBvZiAiYiIuICBUaGVyZWZvcmUsIG9uIHNvbWUgQ1BVcywgc3VjaAotICogYXMgQWxwaGEsICJ5IiBjb3VsZCBiZSBzZXQgdG8gMyBhbmQgIngiIHRvIDAuICBVc2Ugcm1iKCkKLSAqIGluIGNhc2VzIGxpa2UgdGhpcyB3aGVyZSB0aGVyZSBhcmUgbm8gZGF0YSBkZXBlbmRlbmNpZXMuCi0gKiovCi0KLSNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUgKDApCi0KLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIHNtcF9tYigpCW1iKCkKLSNpZmRlZiBDT05GSUdfWDg2X1BQUk9fRkVOQ0UKLSMgZGVmaW5lIHNtcF9ybWIoKQlybWIoKQotI2Vsc2UKLSMgZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKLSNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfT09TVE9SRQotIyBkZWZpbmUgc21wX3dtYigpIAl3bWIoKQotI2Vsc2UKLSMgZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKLSNlbmRpZgotI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpCi0jZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7ICh2b2lkKXhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7IHZhciA9IHZhbHVlOyBiYXJyaWVyKCk7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotLyoKLSAqIFN0b3AgUkRUU0Mgc3BlY3VsYXRpb24uIFRoaXMgaXMgbmVlZGVkIHdoZW4geW91IG5lZWQgdG8gdXNlIFJEVFNDCi0gKiAob3IgZ2V0X2N5Y2xlcyBvciB2cmVhZCB0aGF0IHBvc3NpYmx5IGFjY2Vzc2VzIHRoZSBUU0MpIGluIGEgZGVmaW5lZAotICogY29kZSByZWdpb24uCi0gKgotICogKENvdWxkIHVzZSBhbiBhbHRlcm5hdGl2ZSB0aHJlZSB3YXkgZm9yIHRoaXMgaWYgdGhlcmUgd2FzIG9uZS4pCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZHRzY19iYXJyaWVyKHZvaWQpCi17Ci0JYWx0ZXJuYXRpdmUoQVNNX05PUDMsICJtZmVuY2UiLCBYODZfRkVBVFVSRV9NRkVOQ0VfUkRUU0MpOwotCWFsdGVybmF0aXZlKEFTTV9OT1AzLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC90bHMuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3Rscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGMwMDBkLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3Rscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI2lmbmRlZiBfU1lTREVQX1RMU19ICi0jZGVmaW5lIF9TWVNERVBfVExTX0gKLQotIyBpZm5kZWYgX19LRVJORUxfXwotCi0vKiBDaGFuZ2UgbmFtZSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgb3JpZ2luYWwgb25lIGZyb20gPGFzbS9sZHQuaD4sIHdoaWNoCi0gKiBtYXkgYmUgbmFtZWQgdXNlcl9kZXNjIChidXQgaW4gMi40IGFuZCBpbiBoZWFkZXIgbWF0Y2hpbmcgaXRzIEFQSSB3YXMgbmFtZWQKLSAqIG1vZGlmeV9sZHRfbGR0X3MpLiAqLwotCi10eXBlZGVmIHN0cnVjdCB1bV9kdXBfdXNlcl9kZXNjIHsKLQl1bnNpZ25lZCBpbnQgIGVudHJ5X251bWJlcjsKLQl1bnNpZ25lZCBpbnQgIGJhc2VfYWRkcjsKLQl1bnNpZ25lZCBpbnQgIGxpbWl0OwotCXVuc2lnbmVkIGludCAgc2VnXzMyYml0OjE7Ci0JdW5zaWduZWQgaW50ICBjb250ZW50czoyOwotCXVuc2lnbmVkIGludCAgcmVhZF9leGVjX29ubHk6MTsKLQl1bnNpZ25lZCBpbnQgIGxpbWl0X2luX3BhZ2VzOjE7Ci0JdW5zaWduZWQgaW50ICBzZWdfbm90X3ByZXNlbnQ6MTsKLQl1bnNpZ25lZCBpbnQgIHVzZWFibGU6MTsKLQl1bnNpZ25lZCBpbnQgIGxtOjE7Ci19IHVzZXJfZGVzY190OwotCi0jIGVsc2UgLyogX19LRVJORUxfXyAqLwotCi0jICBpbmNsdWRlIDxsZHQuaD4KLXR5cGVkZWYgc3RydWN0IHVzZXJfZGVzYyB1c2VyX2Rlc2NfdDsKLQotIyBlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogX1NZU0RFUF9UTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvdm0tZmxhZ3MuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3ZtLWZsYWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NzhlNTUuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvdm0tZmxhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19WTV9GTEFHU19YODZfNjRfSAotI2RlZmluZSBfX1ZNX0ZMQUdTX1g4Nl82NF9ICi0KLSNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTIChWTV9SRUFEIHwgVk1fV1JJVEUgfCBWTV9FWEVDIHwgXAotCVZNX01BWVJFQUQgfCBWTV9NQVlXUklURSB8IFZNX01BWUVYRUMpCi0jZGVmaW5lIFZNX1NUQUNLX0RFRkFVTFRfRkxBR1MgKFZNX0dST1dTRE9XTiB8IFZNX1JFQUQgfCBWTV9XUklURSB8IFwKLQlWTV9FWEVDIHwgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2lnbmFsLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YjY1YzcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3NpZ25hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgUGF0aFNjYWxlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KLSNpbmNsdWRlICJmcmFtZV9rZXJuLmgiCi0jaW5jbHVkZSAic2thcy5oIgotCi12b2lkIGNvcHlfc2Moc3RydWN0IHVtbF9wdF9yZWdzICpyZWdzLCB2b2lkICpmcm9tKQotewotCXN0cnVjdCBzaWdjb250ZXh0ICpzYyA9IGZyb207Ci0KLSNkZWZpbmUgR0VUUkVHKHJlZ3MsIHJlZ25vLCBzYywgcmVnbmFtZSkJCQkJXAotCShyZWdzKS0+Z3BbKHJlZ25vKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKV0gPSAoc2MpLT5yZWduYW1lCi0KLQlHRVRSRUcocmVncywgUjgsIHNjLCByOCk7Ci0JR0VUUkVHKHJlZ3MsIFI5LCBzYywgcjkpOwotCUdFVFJFRyhyZWdzLCBSMTAsIHNjLCByMTApOwotCUdFVFJFRyhyZWdzLCBSMTEsIHNjLCByMTEpOwotCUdFVFJFRyhyZWdzLCBSMTIsIHNjLCByMTIpOwotCUdFVFJFRyhyZWdzLCBSMTMsIHNjLCByMTMpOwotCUdFVFJFRyhyZWdzLCBSMTQsIHNjLCByMTQpOwotCUdFVFJFRyhyZWdzLCBSMTUsIHNjLCByMTUpOwotCUdFVFJFRyhyZWdzLCBSREksIHNjLCBkaSk7Ci0JR0VUUkVHKHJlZ3MsIFJTSSwgc2MsIHNpKTsKLQlHRVRSRUcocmVncywgUkJQLCBzYywgYnApOwotCUdFVFJFRyhyZWdzLCBSQlgsIHNjLCBieCk7Ci0JR0VUUkVHKHJlZ3MsIFJEWCwgc2MsIGR4KTsKLQlHRVRSRUcocmVncywgUkFYLCBzYywgYXgpOwotCUdFVFJFRyhyZWdzLCBSQ1gsIHNjLCBjeCk7Ci0JR0VUUkVHKHJlZ3MsIFJTUCwgc2MsIHNwKTsKLQlHRVRSRUcocmVncywgUklQLCBzYywgaXApOwotCUdFVFJFRyhyZWdzLCBFRkxBR1MsIHNjLCBmbGFncyk7Ci0JR0VUUkVHKHJlZ3MsIENTLCBzYywgY3MpOwotCi0jdW5kZWYgR0VUUkVHCi19Ci0KLXN0YXRpYyBpbnQgY29weV9zY19mcm9tX3VzZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgICAgIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqZnJvbSwKLQkJCSAgICAgc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqZnBwKQotewotCXN0cnVjdCB1c2VyX2kzODdfc3RydWN0IGZwOwotCWludCBlcnIgPSAwOwotCi0jZGVmaW5lIEdFVFJFRyhyZWdzLCByZWdubywgc2MsIHJlZ25hbWUpCQkJCVwKLQlfX2dldF91c2VyKChyZWdzKS0+cmVncy5ncFsocmVnbm8pIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXSwJXAotCQkgICAmKHNjKS0+cmVnbmFtZSkKLQotCWVyciB8PSBHRVRSRUcocmVncywgUjgsIGZyb20sIHI4KTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIFI5LCBmcm9tLCByOSk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTAsIGZyb20sIHIxMCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTEsIGZyb20sIHIxMSk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTIsIGZyb20sIHIxMik7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTMsIGZyb20sIHIxMyk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTQsIGZyb20sIHIxNCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTUsIGZyb20sIHIxNSk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSREksIGZyb20sIGRpKTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIFJTSSwgZnJvbSwgc2kpOwotCWVyciB8PSBHRVRSRUcocmVncywgUkJQLCBmcm9tLCBicCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSQlgsIGZyb20sIGJ4KTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIFJEWCwgZnJvbSwgZHgpOwotCWVyciB8PSBHRVRSRUcocmVncywgUkFYLCBmcm9tLCBheCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSQ1gsIGZyb20sIGN4KTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIFJTUCwgZnJvbSwgc3ApOwotCWVyciB8PSBHRVRSRUcocmVncywgUklQLCBmcm9tLCBpcCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBFRkxBR1MsIGZyb20sIGZsYWdzKTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIENTLCBmcm9tLCBjcyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIDE7Ci0KLSN1bmRlZiBHRVRSRUcKLQotCWVyciA9IGNvcHlfZnJvbV91c2VyKCZmcCwgZnBwLCBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gMTsKLQotCWVyciA9IHJlc3RvcmVfZnBfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdLAotCQkJCSAgICh1bnNpZ25lZCBsb25nICopICZmcCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX2Zyb21fdXNlciAtICIKLQkJICAgICAgICJyZXN0b3JlX2ZwX3JlZ2lzdGVycyBmYWlsZWQsIGVycm5vID0gJWRcbiIsCi0JCSAgICAgICAtZXJyKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29weV9zY190b191c2VyKHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdG8sCi0JCQkgICBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICp0b19mcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgICB1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgc3ApCi17Ci0Jc3RydWN0IGZhdWx0aW5mbyAqIGZpID0gJmN1cnJlbnQtPnRocmVhZC5hcmNoLmZhdWx0aW5mbzsKLQlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcDsKLQlpbnQgZXJyID0gMDsKLQotCWVyciB8PSBfX3B1dF91c2VyKDAsICZ0by0+Z3MpOwotCWVyciB8PSBfX3B1dF91c2VyKDAsICZ0by0+ZnMpOwotCi0jZGVmaW5lIFBVVFJFRyhyZWdzLCByZWdubywgc2MsIHJlZ25hbWUpCQkJCVwKLQlfX3B1dF91c2VyKChyZWdzKS0+cmVncy5ncFsocmVnbm8pIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXSwJXAotCQkgICAmKHNjKS0+cmVnbmFtZSkKLQotCWVyciB8PSBQVVRSRUcocmVncywgUkRJLCB0bywgZGkpOwotCWVyciB8PSBQVVRSRUcocmVncywgUlNJLCB0bywgc2kpOwotCWVyciB8PSBQVVRSRUcocmVncywgUkJQLCB0bywgYnApOwotCS8qCi0JICogTXVzdCB1c2Ugb3JpZ2luYWwgUlNQLCB3aGljaCBpcyBwYXNzZWQgaW4sIHJhdGhlciB0aGFuIHdoYXQncyBpbgotCSAqIHRoZSBwdF9yZWdzLCBiZWNhdXNlIHRoYXQncyBhbHJlYWR5IGJlZW4gdXBkYXRlZCB0byBwb2ludCBhdCB0aGUKLQkgKiBzaWduYWwgZnJhbWUuCi0JICovCi0JZXJyIHw9IF9fcHV0X3VzZXIoc3AsICZ0by0+c3ApOwotCWVyciB8PSBQVVRSRUcocmVncywgUkJYLCB0bywgYngpOwotCWVyciB8PSBQVVRSRUcocmVncywgUkRYLCB0bywgZHgpOwotCWVyciB8PSBQVVRSRUcocmVncywgUkNYLCB0bywgY3gpOwotCWVyciB8PSBQVVRSRUcocmVncywgUkFYLCB0bywgYXgpOwotCWVyciB8PSBQVVRSRUcocmVncywgUjgsIHRvLCByOCk7Ci0JZXJyIHw9IFBVVFJFRyhyZWdzLCBSOSwgdG8sIHI5KTsKLQllcnIgfD0gUFVUUkVHKHJlZ3MsIFIxMCwgdG8sIHIxMCk7Ci0JZXJyIHw9IFBVVFJFRyhyZWdzLCBSMTEsIHRvLCByMTEpOwotCWVyciB8PSBQVVRSRUcocmVncywgUjEyLCB0bywgcjEyKTsKLQllcnIgfD0gUFVUUkVHKHJlZ3MsIFIxMywgdG8sIHIxMyk7Ci0JZXJyIHw9IFBVVFJFRyhyZWdzLCBSMTQsIHRvLCByMTQpOwotCWVyciB8PSBQVVRSRUcocmVncywgUjE1LCB0bywgcjE1KTsKLQllcnIgfD0gUFVUUkVHKHJlZ3MsIENTLCB0bywgY3MpOyAvKiBYWFggeDg2XzY0IGRvZXNuJ3QgZG8gdGhpcyAqLwotCi0JZXJyIHw9IF9fcHV0X3VzZXIoZmktPmNyMiwgJnRvLT5jcjIpOwotCWVyciB8PSBfX3B1dF91c2VyKGZpLT5lcnJvcl9jb2RlLCAmdG8tPmVycik7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoZmktPnRyYXBfbm8sICZ0by0+dHJhcG5vKTsKLQotCWVyciB8PSBQVVRSRUcocmVncywgUklQLCB0bywgaXApOwotCWVyciB8PSBQVVRSRUcocmVncywgRUZMQUdTLCB0bywgZmxhZ3MpOwotI3VuZGVmIFBVVFJFRwotCi0JZXJyIHw9IF9fcHV0X3VzZXIobWFzaywgJnRvLT5vbGRtYXNrKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gMTsKLQotCWVyciA9IHNhdmVfZnBfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdLAotCQkJCSh1bnNpZ25lZCBsb25nICopICZmcCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX2Zyb21fdXNlciAtIHJlc3RvcmVfZnBfcmVnaXN0ZXJzICIKLQkJICAgICAgICJmYWlsZWQsIGVycm5vID0gJWRcbiIsIC1lcnIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoY29weV90b191c2VyKHRvX2ZwLCAmZnAsIHNpemVvZihzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCkpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0cnVjdCBydF9zaWdmcmFtZQotewotCWNoYXIgX191c2VyICpwcmV0Y29kZTsKLQlzdHJ1Y3QgdWNvbnRleHQgdWM7Ci0Jc3RydWN0IHNpZ2luZm8gaW5mbzsKLQlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKLX07Ci0KLWludCBzZXR1cF9zaWduYWxfc3RhY2tfc2kodW5zaWduZWQgbG9uZyBzdGFja190b3AsIGludCBzaWcsCi0JCQkgIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICogcmVncywKLQkJCSAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqc2V0KQotewotCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgc2F2ZV9zcCA9IFBUX1JFR1NfUlNQKHJlZ3MpOwotCWludCBlcnIgPSAwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OwotCi0JZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKQotCQlyb3VuZF9kb3duKHN0YWNrX3RvcCAtIHNpemVvZihzdHJ1Y3QgcnRfc2lnZnJhbWUpLCAxNik7Ci0JLyogU3VidHJhY3QgMTI4IGZvciBhIHJlZCB6b25lIGFuZCA4IGZvciBwcm9wZXIgYWxpZ25tZW50ICovCi0JZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKSAoKHVuc2lnbmVkIGxvbmcpIGZyYW1lIC0gMTI4IC0gOCk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pIHsKLQkJZXJyIHw9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgaW5mbyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIFVwZGF0ZSBTUCBub3cgYmVjYXVzZSB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyIHJlZnVzZXMgdG8gZXh0ZW5kCi0JICogdGhlIHN0YWNrIGlmIHRoZSBmYXVsdGluZyBhZGRyZXNzIGlzIHRvbyBmYXIgYmVsb3cgdGhlIGN1cnJlbnQKLQkgKiBTUCwgd2hpY2ggZnJhbWUgbm93IGNlcnRhaW5seSBpcy4gIElmIHRoZXJlJ3MgYW4gZXJyb3IsIHRoZSBvcmlnaW5hbAotCSAqIHZhbHVlIGlzIHJlc3RvcmVkIG9uIHRoZSB3YXkgb3V0LgotCSAqIFdoZW4gd3JpdGluZyB0aGUgc2lnY29udGV4dCB0byB0aGUgc3RhY2ssIHdlIGhhdmUgdG8gd3JpdGUgdGhlCi0JICogb3JpZ2luYWwgdmFsdWUsIHNvIHRoYXQncyBwYXNzZWQgdG8gY29weV9zY190b191c2VyLCB3aGljaCBkb2VzCi0JICogdGhlIHJpZ2h0IHRoaW5nIHdpdGggaXQuCi0JICovCi0JUFRfUkVHU19SU1AocmVncykgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7Ci0KLQkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KLQllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKLQllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2xpbmspOwotCWVyciB8PSBfX3B1dF91c2VyKG1lLT5zYXNfc3Nfc3AsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc3ApOwotCWVyciB8PSBfX3B1dF91c2VyKHNhc19zc19mbGFncyhzYXZlX3NwKSwKLQkJCSAgJmZyYW1lLT51Yy51Y19zdGFjay5zc19mbGFncyk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIobWUtPnNhc19zc19zaXplLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NpemUpOwotCWVyciB8PSBjb3B5X3NjX3RvX3VzZXIoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJmZyYW1lLT5mcHN0YXRlLCByZWdzLAotCQkJICAgICAgIHNldC0+c2lnWzBdLCBzYXZlX3NwKTsKLQllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPmZwc3RhdGUsICZmcmFtZS0+dWMudWNfbWNvbnRleHQuZnBzdGF0ZSk7Ci0JaWYgKHNpemVvZigqc2V0KSA9PSAxNikgewotCQlfX3B1dF91c2VyKHNldC0+c2lnWzBdLCAmZnJhbWUtPnVjLnVjX3NpZ21hc2suc2lnWzBdKTsKLQkJX19wdXRfdXNlcihzZXQtPnNpZ1sxXSwgJmZyYW1lLT51Yy51Y19zaWdtYXNrLnNpZ1sxXSk7Ci0JfQotCWVsc2UKLQkJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2V0LAotCQkJCSAgICAgIHNpemVvZigqc2V0KSk7Ci0KLQkvKgotCSAqIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICBJZiBwcm92aWRlZCwgdXNlIGEgc3R1YgotCSAqIGFscmVhZHkgaW4gdXNlcnNwYWNlLgotCSAqLwotCS8qIHg4Ni02NCBzaG91bGQgYWx3YXlzIHVzZSBTQV9SRVNUT1JFUi4gKi8KLQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCi0JCWVyciB8PSBfX3B1dF91c2VyKGthLT5zYS5zYV9yZXN0b3JlciwgJmZyYW1lLT5wcmV0Y29kZSk7Ci0JZWxzZQotCQkvKiBjb3VsZCB1c2UgYSB2c3R1YiBoZXJlICovCi0JCWdvdG8gcmVzdG9yZV9zcDsKLQotCWlmIChlcnIpCi0JCWdvdG8gcmVzdG9yZV9zcDsKLQotCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCi0JewotCQlzdHJ1Y3QgZXhlY19kb21haW4gKmVkID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbjsKLQkJaWYgKHVubGlrZWx5KGVkICYmIGVkLT5zaWduYWxfaW52bWFwICYmIHNpZyA8IDMyKSkKLQkJCXNpZyA9IGVkLT5zaWduYWxfaW52bWFwW3NpZ107Ci0JfQotCi0JUFRfUkVHU19SREkocmVncykgPSBzaWc7Ci0JLyogSW4gY2FzZSB0aGUgc2lnbmFsIGhhbmRsZXIgd2FzIGRlY2xhcmVkIHdpdGhvdXQgcHJvdG90eXBlcyAqLwotCVBUX1JFR1NfUkFYKHJlZ3MpID0gMDsKLQotCS8qCi0JICogVGhpcyBhbHNvIHdvcmtzIGZvciBub24gU0FfU0lHSU5GTyBoYW5kbGVycyBiZWNhdXNlIHRoZXkgZXhwZWN0IHRoZQotCSAqIG5leHQgYXJndW1lbnQgYWZ0ZXIgdGhlIHNpZ25hbCBudW1iZXIgb24gdGhlIHN0YWNrLgotCSAqLwotCVBUX1JFR1NfUlNJKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsKLQlQVF9SRUdTX1JEWChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOwotCVBUX1JFR1NfUklQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOwotIG91dDoKLQlyZXR1cm4gZXJyOwotCi1yZXN0b3JlX3NwOgotCVBUX1JFR1NfUlNQKHJlZ3MpID0gc2F2ZV9zcDsKLQlyZXR1cm4gZXJyOwotfQotCi1sb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyBzcCA9IFBUX1JFR1NfU1AoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKLQlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9Ci0JCShzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopKHNwIC0gOCk7Ci0Jc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMgPSAmZnJhbWUtPnVjOwotCXNpZ3NldF90IHNldDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0LCAmdWMtPnVjX3NpZ21hc2ssIHNpemVvZihzZXQpKSkKLQkJZ290byBzZWdmYXVsdDsKLQotCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCi0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlpZiAoY29weV9zY19mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5yZWdzLCAmdWMtPnVjX21jb250ZXh0LAotCQkJICAgICAgJmZyYW1lLT5mcHN0YXRlKSkKLQkJZ290byBzZWdmYXVsdDsKLQotCS8qIEF2b2lkIEVSRVNUQVJUIGhhbmRsaW5nICovCi0JUFRfUkVHU19TWVNDQUxMX05SKCZjdXJyZW50LT50aHJlYWQucmVncykgPSAtMTsKLQlyZXR1cm4gUFRfUkVHU19TWVNDQUxMX1JFVCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCi0gc2VnZmF1bHQ6Ci0JZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N0dWJfc2Vndi5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3N0dWJfc2Vndi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQwNTFhLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViX3NlZ3YuYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSAiYXMtbGF5b3V0LmgiCi0jaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKLSNpbmNsdWRlICJzeXNkZXAvZmF1bHRpbmZvLmgiCi0jaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKLQotdm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCi1zdHViX3NlZ3ZfaGFuZGxlcihpbnQgc2lnKQotewotCXN0cnVjdCB1Y29udGV4dCAqdWM7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92cSAlJXJkeCwgJTAiIDogIj1nIiAodWMpIDopOwotCUdFVF9GQVVMVElORk9fRlJPTV9TQygqKChzdHJ1Y3QgZmF1bHRpbmZvICopIFNUVUJfREFUQSksCi0JCQkgICAgICAmdWMtPnVjX21jb250ZXh0KTsKLQl0cmFwX215c2VsZigpOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbF90YWJsZS5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3N5c2NhbGxfdGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkNDY5ZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbF90YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIFN5c3RlbSBjYWxsIHRhYmxlIGZvciBVTUwveDg2LTY0LCBjb3BpZWQgZnJvbSBhcmNoL3g4Nl82NC9rZXJuZWwvc3lzY2FsbC5jCi0gKiB3aXRoIHNvbWUgY2hhbmdlcyBmb3IgVU1MLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KLSNpbmNsdWRlIDxrZXJuX2NvbnN0YW50cy5oPgotCi0jZGVmaW5lIF9fTk9fU1RVQlMKLQotLyoKLSAqIEJlbG93IHlvdSBjYW4gc2VlLCBpbiB0ZXJtcyBvZiAjZGVmaW5lJ3MsIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB4ODYtNjQKLSAqIGFuZCB0aGUgVU1MIHN5c2NhbGwgdGFibGUuCi0gKi8KLQotLyogTm90IGdvaW5nIHRvIGJlIGltcGxlbWVudGVkIGJ5IFVNTCwgc2luY2Ugd2UgaGF2ZSBubyBoYXJkd2FyZS4gKi8KLSNkZWZpbmUgc3R1Yl9pb3BsIHN5c19uaV9zeXNjYWxsCi0jZGVmaW5lIHN5c19pb3Blcm0gc3lzX25pX3N5c2NhbGwKLQotLyoKLSAqIFRoZSBVTUwgVExTIHByb2JsZW0uIE5vdGUgdGhhdCB4ODZfNjQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMsIHNvIHRoZSBiZWxvdwotICogaXMgbmVlZGVkIG9ubHkgZm9yIHRoZSBpYTMyIGNvbXBhdGliaWxpdHkuCi0gKi8KLQotLyogT24gVU1MIHdlIGNhbGwgaXQgdGhpcyB3YXkgKCJvbGQiIG1lYW5zIGl0J3Mgbm90IG1tYXAyKSAqLwotI2RlZmluZSBzeXNfbW1hcCBvbGRfbW1hcAotCi0jZGVmaW5lIHN0dWJfY2xvbmUgc3lzX2Nsb25lCi0jZGVmaW5lIHN0dWJfZm9yayBzeXNfZm9yawotI2RlZmluZSBzdHViX3Zmb3JrIHN5c192Zm9yawotI2RlZmluZSBzdHViX2V4ZWN2ZSBzeXNfZXhlY3ZlCi0jZGVmaW5lIHN0dWJfcnRfc2lnc3VzcGVuZCBzeXNfcnRfc2lnc3VzcGVuZAotI2RlZmluZSBzdHViX3NpZ2FsdHN0YWNrIHN5c19zaWdhbHRzdGFjawotI2RlZmluZSBzdHViX3J0X3NpZ3JldHVybiBzeXNfcnRfc2lncmV0dXJuCi0KLSNkZWZpbmUgX19TWVNDQUxMKG5yLCBzeW0pIGV4dGVybiBhc21saW5rYWdlIHZvaWQgc3ltKHZvaWQpIDsKLSN1bmRlZiBfQVNNX1g4Nl9VTklTVERfNjRfSAotI2luY2x1ZGUgIi4uLy4uL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaCIKLQotI3VuZGVmIF9fU1lTQ0FMTAotI2RlZmluZSBfX1NZU0NBTEwobnIsIHN5bSkgWyBuciBdID0gc3ltLAotI3VuZGVmIF9BU01fWDg2X1VOSVNURF82NF9ICi0KLXR5cGVkZWYgdm9pZCAoKnN5c19jYWxsX3B0cl90KSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgc3lzX25pX3N5c2NhbGwodm9pZCk7Ci0KLS8qCi0gKiBXZSB1c2VkIHRvIGhhdmUgYSB0cmljayBoZXJlIHdoaWNoIG1hZGUgc3VyZSB0aGF0IGhvbGVzIGluIHRoZQotICogeDg2XzY0IHRhYmxlIHdlcmUgZmlsbGVkIGluIHdpdGggc3lzX25pX3N5c2NhbGwsIGJ1dCBhIGNvbW1lbnQgaW4KLSAqIHVuaXN0ZF82NC5oIHNheXMgdGhhdCBob2xlcyBhcmVuJ3QgYWxsb3dlZCwgc28gdGhlIHRyaWNrIHdhcwotICogcmVtb3ZlZC4KLSAqIFRoZSB0cmljayBsb29rZWQgbGlrZSB0aGlzCi0gKglbMCAuLi4gVU1fTlJfc3lzY2FsbF9tYXhdID0gJnN5c19uaV9zeXNjYWxsCi0gKiBiZWZvcmUgaW5jbHVkaW5nIHVuaXN0ZF82NC5oIC0gdGhlIGxhdGVyIGluaXRpYWxpemF0aW9ucyBvdmVyd3JvdGUKLSAqIHRoZSBzeXNfbmlfc3lzY2FsbCBmaWxsZXIuCi0gKi8KLQotc3lzX2NhbGxfcHRyX3Qgc3lzX2NhbGxfdGFibGVbXSBfX2NhY2hlbGluZV9hbGlnbmVkID0gewotI2luY2x1ZGUgIi4uLy4uL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaCIKLX07Ci0KLWludCBzeXNjYWxsX3RhYmxlX3NpemUgPSBzaXplb2Yoc3lzX2NhbGxfdGFibGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N5c3JxLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3lzcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmODJiZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc3lzcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgotI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgInN5c3JxLmgiCi0KLXZvaWQgX19zaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcHJpbnRrKCJcbiIpOwotCXByaW50X21vZHVsZXMoKTsKLQlwcmludGsoS0VSTl9JTkZPICJQaWQ6ICVkLCBjb21tOiAlLjIwcyAlcyAlc1xuIiwgdGFza19waWRfbnIoY3VycmVudCksCi0JCWN1cnJlbnQtPmNvbW0sIHByaW50X3RhaW50ZWQoKSwgaW5pdF91dHNuYW1lKCktPnJlbGVhc2UpOwotCXByaW50ayhLRVJOX0lORk8gIlJJUDogJTA0bHg6WzwlMDE2bHg+XVxuIiwgUFRfUkVHU19DUyhyZWdzKSAmIDB4ZmZmZiwKLQkgICAgICAgUFRfUkVHU19SSVAocmVncykpOwotCXByaW50ayhLRVJOX0lORk8gIlJTUDogJTAxNmx4ICBFRkxBR1M6ICUwOGx4XG4iLCBQVF9SRUdTX1JTUChyZWdzKSwKLQkgICAgICAgUFRfUkVHU19FRkxBR1MocmVncykpOwotCXByaW50ayhLRVJOX0lORk8gIlJBWDogJTAxNmx4IFJCWDogJTAxNmx4IFJDWDogJTAxNmx4XG4iLAotCSAgICAgICBQVF9SRUdTX1JBWChyZWdzKSwgUFRfUkVHU19SQlgocmVncyksIFBUX1JFR1NfUkNYKHJlZ3MpKTsKLQlwcmludGsoS0VSTl9JTkZPICJSRFg6ICUwMTZseCBSU0k6ICUwMTZseCBSREk6ICUwMTZseFxuIiwKLQkgICAgICAgUFRfUkVHU19SRFgocmVncyksIFBUX1JFR1NfUlNJKHJlZ3MpLCBQVF9SRUdTX1JESShyZWdzKSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUkJQOiAlMDE2bHggUjA4OiAlMDE2bHggUjA5OiAlMDE2bHhcbiIsCi0JICAgICAgIFBUX1JFR1NfUkJQKHJlZ3MpLCBQVF9SRUdTX1I4KHJlZ3MpLCBQVF9SRUdTX1I5KHJlZ3MpKTsKLQlwcmludGsoS0VSTl9JTkZPICJSMTA6ICUwMTZseCBSMTE6ICUwMTZseCBSMTI6ICUwMTZseFxuIiwKLQkgICAgICAgUFRfUkVHU19SMTAocmVncyksIFBUX1JFR1NfUjExKHJlZ3MpLCBQVF9SRUdTX1IxMihyZWdzKSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUjEzOiAlMDE2bHggUjE0OiAlMDE2bHggUjE1OiAlMDE2bHhcbiIsCi0JICAgICAgIFBUX1JFR1NfUjEzKHJlZ3MpLCBQVF9SRUdTX1IxNChyZWdzKSwgUFRfUkVHU19SMTUocmVncykpOwotfQotCi12b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlfX3Nob3dfcmVncyhyZWdzKTsKLQlzaG93X3RyYWNlKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopICZyZWdzKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC91c2VyLW9mZnNldHMuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC91c2VyLW9mZnNldHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczNTg1NC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvdXNlci1vZmZzZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSNkZWZpbmUgX19GUkFNRV9PRkZTRVRTCi0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi0jZGVmaW5lIERFRklORShzeW0sIHZhbCkgXAotICAgICAgICBhc20gdm9sYXRpbGUoIlxuLT4iICNzeW0gIiAlMCAiICN2YWwgOiA6ICJpIiAodmFsKSkKLQotI2RlZmluZSBERUZJTkVfTE9OR1Moc3ltLCB2YWwpIFwKLSAgICAgICAgYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbC9zaXplb2YodW5zaWduZWQgbG9uZykpKQotCi0jZGVmaW5lIE9GRlNFVChzeW0sIHN0ciwgbWVtKSBcCi0JREVGSU5FKHN5bSwgb2Zmc2V0b2Yoc3RydWN0IHN0ciwgbWVtKSk7Ci0KLXZvaWQgZm9vKHZvaWQpCi17Ci0JT0ZGU0VUKEhPU1RfU0NfQ1IyLCBzaWdjb250ZXh0LCBjcjIpOwotCU9GRlNFVChIT1NUX1NDX0VSUiwgc2lnY29udGV4dCwgZXJyKTsKLQlPRkZTRVQoSE9TVF9TQ19UUkFQTk8sIHNpZ2NvbnRleHQsIHRyYXBubyk7Ci0KLQlERUZJTkUoSE9TVF9GUF9TSVpFLCBzaXplb2Yoc3RydWN0IF9mcHN0YXRlKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUkJYLCBSQlgpOwotCURFRklORV9MT05HUyhIT1NUX1JDWCwgUkNYKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9SREksIFJESSk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUlNJLCBSU0kpOwotCURFRklORV9MT05HUyhIT1NUX1JEWCwgUkRYKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9SQlAsIFJCUCk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUkFYLCBSQVgpOwotCURFRklORV9MT05HUyhIT1NUX1I4LCBSOCk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUjksIFI5KTsKLQlERUZJTkVfTE9OR1MoSE9TVF9SMTAsIFIxMCk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUjExLCBSMTEpOwotCURFRklORV9MT05HUyhIT1NUX1IxMiwgUjEyKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9SMTMsIFIxMyk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUjE0LCBSMTQpOwotCURFRklORV9MT05HUyhIT1NUX1IxNSwgUjE1KTsKLQlERUZJTkVfTE9OR1MoSE9TVF9PUklHX1JBWCwgT1JJR19SQVgpOwotCURFRklORV9MT05HUyhIT1NUX0NTLCBDUyk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfU1MsIFNTKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9FRkxBR1MsIEVGTEFHUyk7Ci0jaWYgMAotCURFRklORV9MT05HUyhIT1NUX0ZTLCBGUyk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfR1MsIEdTKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9EUywgRFMpOwotCURFRklORV9MT05HUyhIT1NUX0VTLCBFUyk7Ci0jZW5kaWYKLQotCURFRklORV9MT05HUyhIT1NUX0lQLCBSSVApOwotCURFRklORV9MT05HUyhIT1NUX1NQLCBSU1ApOwotCURFRklORShVTV9GUkFNRV9TSVpFLCBzaXplb2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpKTsKLQotCS8qIFhYWCBEdXBsaWNhdGVkIGJldHdlZW4gaTM4NiBhbmQgeDg2XzY0ICovCi0JREVGSU5FKFVNX1BPTExJTiwgUE9MTElOKTsKLQlERUZJTkUoVU1fUE9MTFBSSSwgUE9MTFBSSSk7Ci0JREVGSU5FKFVNX1BPTExPVVQsIFBPTExPVVQpOwotCi0JREVGSU5FKFVNX1BST1RfUkVBRCwgUFJPVF9SRUFEKTsKLQlERUZJTkUoVU1fUFJPVF9XUklURSwgUFJPVF9XUklURSk7Ci0JREVGSU5FKFVNX1BST1RfRVhFQywgUFJPVF9FWEVDKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL01ha2VmaWxlIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmZlNmQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0jCi0jIEJ1aWxkaW5nIHZEU08gaW1hZ2VzIGZvciB4ODYuCi0jCi0KLVZEU082NC15CQk6PSB5Ci0KLXZkc28taW5zdGFsbC0kKFZEU082NC15KQkrPSB2ZHNvLnNvCi0KLQotIyBmaWxlcyB0byBsaW5rIGludG8gdGhlIHZkc28KLXZvYmpzLXkgOj0gdmRzby1ub3RlLm8gdW1fdmRzby5vCi0KLSMgZmlsZXMgdG8gbGluayBpbnRvIGtlcm5lbAotb2JqLSQoVkRTTzY0LXkpCQkJKz0gdmRzby5vIHZtYS5vCi0KLXZvYmpzIDo9ICQoZm9yZWFjaCBGLCQodm9ianMteSksJChvYmopLyRGKQotCi0kKG9iaikvdmRzby5vOiAkKG9iaikvdmRzby5zbwotCi10YXJnZXRzICs9IHZkc28uc28gdmRzby5zby5kYmcgdmRzby5sZHMgJCh2b2Jqcy15KQotCi1leHBvcnQgQ1BQRkxBR1NfdmRzby5sZHMgKz0gLVAgLUMKLQotVkRTT19MREZMQUdTX3Zkc28ubGRzID0gLW02NCAtV2wsLXNvbmFtZT1saW51eC12ZHNvLnNvLjEgXAotICAgICAgIC1XbCwteixtYXgtcGFnZS1zaXplPTQwOTYgLVdsLC16LGNvbW1vbi1wYWdlLXNpemU9NDA5NgotCi0kKG9iaikvdmRzby5vOiAkKHNyYykvdmRzby5TICQob2JqKS92ZHNvLnNvCi0KLSQob2JqKS92ZHNvLnNvLmRiZzogJChzcmMpL3Zkc28ubGRzICQodm9ianMpIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsdmRzbykKLQotJChvYmopLyUuc286IE9CSkNPUFlGTEFHUyA6PSAtUwotJChvYmopLyUuc286ICQob2JqKS8lLnNvLmRiZyBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCi0KLSMKLSMgRG9uJ3Qgb21pdCBmcmFtZSBwb2ludGVycyBmb3IgZWFzZSBvZiB1c2Vyc3BhY2UgZGVidWdnaW5nLCBidXQgZG8KLSMgb3B0aW1pemUgc2libGluZyBjYWxscy4KLSMKLUNGTCA6PSAkKFBST0ZJTElORykgLW1jbW9kZWw9c21hbGwgLWZQSUMgLU8yIC1mYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCBcCi0gICAgICAgJChmaWx0ZXIgLWclLCQoS0JVSUxEX0NGTEFHUykpICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKSBcCi0gICAgICAgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZvcHRpbWl6ZS1zaWJsaW5nLWNhbGxzCi0KLSQodm9ianMpOiBLQlVJTERfQ0ZMQUdTICs9ICQoQ0ZMKQotCi0jCi0jIHZEU08gY29kZSBydW5zIGluIHVzZXJzcGFjZSBhbmQgLXBnIGRvZXNuJ3QgaGVscCB3aXRoIHByb2ZpbGluZyBhbnl3YXkuCi0jCi1DRkxBR1NfUkVNT1ZFX3Zkc28tbm90ZS5vID0gLXBnCi1DRkxBR1NfUkVNT1ZFX3VtX3Zkc28ubyA9IC1wZwotCi10YXJnZXRzICs9IHZkc28tc3ltcy5sZHMKLW9iai0kKFZEU082NC15KQkJCSs9IHZkc28tc3ltcy5sZHMKLQotIwotIyBNYXRjaCBzeW1ib2xzIGluIHRoZSBEU08gdGhhdCBsb29rIGxpa2UgVkRTTyo7IHByb2R1Y2UgYSBmaWxlIG9mIGNvbnN0YW50cy4KLSMKLXNlZC12ZHNvc3ltIDo9IC1lICdzL14wMCovMC8nIFwKLQktZSAncy9eXChbMC05YS1mQS1GXSpcKSAuIFwoVkRTT1thLXpBLVowLTlfXSpcKSQkL1wyID0gMHhcMTsvcCcKLXF1aWV0X2NtZF92ZHNvc3ltID0gVkRTT1NZTSAkQAotZGVmaW5lIGNtZF92ZHNvc3ltCi0JJChOTSkgJDwgfCBMQ19BTEw9QyBzZWQgLW4gJChzZWQtdmRzb3N5bSkgfCBMQ19BTEw9QyBzb3J0ID4gJEAKLWVuZGVmCi0KLSQob2JqKS8lLXN5bXMubGRzOiAkKG9iaikvJS5zby5kYmcgRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCx2ZHNvc3ltKQotCi0jCi0jIFRoZSBEU08gaW1hZ2VzIGFyZSBidWlsdCB1c2luZyBhIHNwZWNpYWwgbGlua2VyIHNjcmlwdC4KLSMKLXF1aWV0X2NtZF92ZHNvID0gVkRTTyAgICAkQAotICAgICAgY21kX3Zkc28gPSAkKENDKSAtbm9zdGRsaWIgLW8gJEAgXAotCQkgICAgICAgJChWRFNPX0xERkxBR1MpICQoVkRTT19MREZMQUdTXyQoZmlsdGVyICUubGRzLCQoXkYpKSkgXAotCQkgICAgICAgLVdsLC1ULCQoZmlsdGVyICUubGRzLCReKSAkKGZpbHRlciAlLm8sJF4pICYmIFwKLQkJIHNoICQoc3JjdHJlZSkvJChzcmMpL2NoZWNrdW5kZWYuc2ggJyQoTk0pJyAnJEAnCi0KLVZEU09fTERGTEFHUyA9IC1mUElDIC1zaGFyZWQgJChjYWxsIGNjLWxkb3B0aW9uLCAtV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1zeXN2KQotR0NPVl9QUk9GSUxFIDo9IG4KLQotIwotIyBJbnN0YWxsIHRoZSB1bnN0cmlwcGVkIGNvcHkgb2YgdmRzbyouc28gbGlzdGVkIGluICQodmRzby1pbnN0YWxsLXkpLgotIwotcXVpZXRfY21kX3Zkc29faW5zdGFsbCA9IElOU1RBTEwgJEAKLSAgICAgIGNtZF92ZHNvX2luc3RhbGwgPSBjcCAkKG9iaikvJEAuZGJnICQoTU9ETElCKS92ZHNvLyRACi0kKHZkc28taW5zdGFsbC15KTogJS5zbzogJChvYmopLyUuc28uZGJnIEZPUkNFCi0JQG1rZGlyIC1wICQoTU9ETElCKS92ZHNvCi0JJChjYWxsIGNtZCx2ZHNvX2luc3RhbGwpCi0KLVBIT05ZICs9IHZkc29faW5zdGFsbCAkKHZkc28taW5zdGFsbC15KQotdmRzb19pbnN0YWxsOiAkKHZkc28taW5zdGFsbC15KQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5TIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzgyYzE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3Zkc28uUworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLV9fSU5JVERBVEEKLQotCS5nbG9ibCB2ZHNvX3N0YXJ0LCB2ZHNvX2VuZAotdmRzb19zdGFydDoKLQkuaW5jYmluICJhcmNoL3VtL3N5cy14ODZfNjQvdmRzby92ZHNvLnNvIgotdmRzb19lbmQ6Ci0KLV9fRklOSVQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3ZtYS5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdm1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OTVjOGQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdm1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFJpY2hhcmQgV2VpbmJlcmdlciA8cmljaHJkQG5vZC5hdD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi11bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSB2ZHNvX2VuYWJsZWQgPSAxOwotdW5zaWduZWQgbG9uZyB1bV92ZHNvX2FkZHI7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIHRhc2tfc2l6ZTsKLWV4dGVybiBjaGFyIHZkc29fc3RhcnRbXSwgdmRzb19lbmRbXTsKLQotc3RhdGljIHN0cnVjdCBwYWdlICoqdmRzb3A7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfdmRzbyh2b2lkKQotewotCXN0cnVjdCBwYWdlICp1bV92ZHNvOwotCi0JQlVHX09OKHZkc29fZW5kIC0gdmRzb19zdGFydCA+IFBBR0VfU0laRSk7Ci0KLQl1bV92ZHNvX2FkZHIgPSB0YXNrX3NpemUgLSBQQUdFX1NJWkU7Ci0KLQl2ZHNvcCA9IGttYWxsb2MoR0ZQX0tFUk5FTCwgc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKLQlpZiAoIXZkc29wKQotCQlnb3RvIG9vbTsKLQotCXVtX3Zkc28gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwotCWlmICghdW1fdmRzbykgewotCQlrZnJlZSh2ZHNvcCk7Ci0KLQkJZ290byBvb207Ci0JfQotCi0JY29weV9wYWdlKHBhZ2VfYWRkcmVzcyh1bV92ZHNvKSwgdmRzb19zdGFydCk7Ci0JKnZkc29wID0gdW1fdmRzbzsKLQotCXJldHVybiAwOwotCi1vb206Ci0JcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgYWxsb2NhdGUgdmRzb1xuIik7Ci0JdmRzb19lbmFibGVkID0gMDsKLQotCXJldHVybiAtRU5PTUVNOwotfQotc3Vic3lzX2luaXRjYWxsKGluaXRfdmRzbyk7Ci0KLWludCBhcmNoX3NldHVwX2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgaW50IHVzZXNfaW50ZXJwKQotewotCWludCBlcnI7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQotCWlmICghdmRzb19lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0KLQllcnIgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgdW1fdmRzb19hZGRyLCBQQUdFX1NJWkUsCi0JCVZNX1JFQUR8Vk1fRVhFQ3wKLQkJVk1fTUFZUkVBRHxWTV9NQVlXUklURXxWTV9NQVlFWEVDfAotCQlWTV9BTFdBWVNEVU1QLAotCQl2ZHNvcCk7Ci0KLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQotCXJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9tbS9pbml0LmMgYi9hcmNoL3VuaWNvcmUzMi9tbS9pbml0LmMKaW5kZXggMmQzZTcxMS4uM2IzNzljZCAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIvbW0vaW5pdC5jCisrKyBiL2FyY2gvdW5pY29yZTMyL21tL2luaXQuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc29ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IGY0OTc2NzcuLmNiOWExMDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtMTk0LDkgKzE5NCw2IEBACiBjb25maWcgTkVFRF9QRVJfQ1BVX1BBR0VfRklSU1RfQ0hVTksKIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBIQVZFX0NQVU1BU0tfT0ZfQ1BVX01BUAotCWRlZl9ib29sIFg4Nl82NF9TTVAKLQogY29uZmlnIEFSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEUKIAlkZWZfYm9vbCB5CiAKQEAgLTE0NTQsNiArMTQ1MSwxNSBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl9QQVQKIAorY29uZmlnIEFSQ0hfUkFORE9NCisJZGVmX2Jvb2wgeQorCXByb21wdCAieDg2IGFyY2hpdGVjdHVyYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiIGlmIEVYUEVSVAorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSB0aGUgeDg2IGFyY2hpdGVjdHVyYWwgUkRSQU5EIGluc3RydWN0aW9uCisJICAoSW50ZWwgQnVsbCBNb3VudGFpbiB0ZWNobm9sb2d5KSB0byBnZW5lcmF0ZSByYW5kb20gbnVtYmVycy4KKwkgIElmIHN1cHBvcnRlZCwgdGhpcyBpcyBhIGhpZ2ggYmFuZHdpZHRoLCBjcnlwdG9ncmFwaGljYWxseQorCSAgc2VjdXJlIGhhcmR3YXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorCiBjb25maWcgRUZJCiAJYm9vbCAiRUZJIHJ1bnRpbWUgc2VydmljZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gQUNQSQpAQCAtMjA2Niw2ICsyMDcyLDIwIEBACiAJICAgLSBBQyBhZGFwdGVyIHN0YXR1cyB1cGRhdGVzCiAJICAgLSBCYXR0ZXJ5IHN0YXR1cyB1cGRhdGVzCiAKK2NvbmZpZyBBTElYCisJYm9vbCAiUENFbmdpbmVzIEFMSVggU3lzdGVtIFN1cHBvcnQgKExFRCBzZXR1cCkiCisJc2VsZWN0IEdQSU9MSUIKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN5c3RlbSBzdXBwb3J0IGZvciB0aGUgUENFbmdpbmVzIEFMSVguCisJICBBdCBwcmVzZW50IHRoaXMganVzdCBzZXRzIHVwIExFRHMgZm9yIEdQSU8gY29udHJvbCBvbgorCSAgQUxJWDIvMy82IGJvYXJkcy4gIEhvd2V2ZXIsIG90aGVyIHN5c3RlbSBzcGVjaWZpYyBzZXR1cCBzaG91bGQKKwkgIGdldCBhZGRlZCBoZXJlLgorCisJICBOb3RlOiBZb3UgbXVzdCBzdGlsbCBlbmFibGUgdGhlIGRyaXZlcnMgZm9yIEdQSU8gYW5kIExFRCBzdXBwb3J0CisJICAoR1BJT19DUzU1MzUgJiBMRURTX0dQSU8pIHRvIGFjdHVhbGx5IHVzZSB0aGUgTEVEcworCisJICBOb3RlOiBZb3UgaGF2ZSB0byBzZXQgYWxpeC5mb3JjZT0xIGZvciBib2FyZHMgd2l0aCBBd2FyZCBCSU9TLgorCiBlbmRpZiAjIFg4Nl8zMgogCiBjb25maWcgQU1EX05CCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9NYWtlZmlsZS51bSBiL2FyY2gveDg2L01ha2VmaWxlLnVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGRlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9NYWtlZmlsZS51bQpAQCAtMCwwICsxLDYxIEBACitjb3JlLXkgKz0gYXJjaC94ODYvY3J5cHRvLworCitpZmVxICgkKENPTkZJR19YODZfMzIpLHkpCitTVEFSVCA6PSAweDgwNDgwMDAKKworTERGTEFHUwkJCSs9IC1tIGVsZl9pMzg2CitFTEZfQVJDSAkJOj0gaTM4NgorRUxGX0ZPUk1BVCAJCTo9IGVsZjMyLWkzODYKK0NIRUNLRkxBR1MJKz0gLURfX2kzODZfXworCitpZmVxICgiJChvcmlnaW4gU1VCQVJDSCkiLCAiY29tbWFuZCBsaW5lIikKK2lmbmVxICgiJChzaGVsbCB1bmFtZSAtbSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8pIiwgIiQoU1VCQVJDSCkiKQorS0JVSUxEX0NGTEFHUwkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQorS0JVSUxEX0FGTEFHUwkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQorTElOSy15CQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQorCitleHBvcnQgTERGTEFHUworZW5kaWYKK2VuZGlmCisKKyMgRmlyc3Qgb2YgYWxsLCB0dW5lIENGTEFHUyBmb3IgdGhlIHNwZWNpZmljIENQVS4gVGhpcyBhY3R1YWxseSBzZXRzIGNmbGFncy15LgoraW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gveDg2L01ha2VmaWxlXzMyLmNwdQorCisjIHByZXZlbnQgZ2NjIGZyb20ga2VlcGluZyB0aGUgc3RhY2sgMTYgYnl0ZSBhbGlnbmVkLiBUYWtlbiBmcm9tIGkzODYuCitjZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIpCisKKyMgUHJldmVudCBzcHJpbnRmIGluIG5mc2QgZnJvbSBiZWluZyBjb252ZXJ0ZWQgdG8gc3RyY3B5IGFuZCByZXN1bHRpbmcgaW4KKyMgYW4gdW5yZXNvbHZlZCByZWZlcmVuY2UuCitjZmxhZ3MteSArPSAtZmZyZWVzdGFuZGluZworCisjIERpc2FibGUgdW5pdC1hdC1hLXRpbWUgbW9kZSBvbiBwcmUtZ2NjLTQuMCBjb21waWxlcnMsIGl0IG1ha2VzIGdjYyB1c2UKKyMgYSBsb3QgbW9yZSBzdGFjayBkdWUgdG8gdGhlIGxhY2sgb2Ygc2hhcmluZyBvZiBzdGFja2xvdHMuICBBbHNvLCBnY2MKKyMgNC4zLjAgbmVlZHMgLWZ1bml0LWF0LWEtdGltZSBmb3IgZXh0ZXJuIGlubGluZSBmdW5jdGlvbnMuCitLQlVJTERfQ0ZMQUdTICs9ICQoc2hlbGwgaWYgWyAkKGNhbGwgY2MtdmVyc2lvbikgLWx0IDA0MDAgXSA7IHRoZW4gXAorCQkJZWNobyAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tdW5pdC1hdC1hLXRpbWUpOyBcCisJCQllbHNlIGVjaG8gJChjYWxsIGNjLW9wdGlvbiwtZnVuaXQtYXQtYS10aW1lKTsgZmkgOykKKworS0JVSUxEX0NGTEFHUyArPSAkKGNmbGFncy15KQorCitlbHNlCisKK1NUQVJUIDo9IDB4NjAwMDAwMDAKKworS0JVSUxEX0NGTEFHUyArPSAtZm5vLWJ1aWx0aW4gLW02NCAKKworQ0hFQ0tGTEFHUyAgKz0gLW02NCAtRF9feDg2XzY0X18KK0tCVUlMRF9BRkxBR1MgKz0gLW02NAorTERGTEFHUyArPSAtbSBlbGZfeDg2XzY0CitLQlVJTERfQ1BQRkxBR1MgKz0gLW02NAorCitFTEZfQVJDSCA6PSBpMzg2Ong4Ni02NAorRUxGX0ZPUk1BVCA6PSBlbGY2NC14ODYtNjQKKworIyBOb3Qgb24gYWxsIDY0LWJpdCBkaXN0cm9zIC9saWIgaXMgYSBzeW1saW5rIHRvIC9saWI2NC4gUExEIGlzIGFuIGV4YW1wbGUuCisKK0xJTkstJChDT05GSUdfTERfU0NSSVBUX0RZTikgKz0gLVdsLC1ycGF0aCwvbGliNjQKK0xJTksteSArPSAtbTY0CisKKyMgRG8gdW5pdC1hdC1hLXRpbWUgdW5jb25kaXRpb25hbGx5IG9uIHg4Nl82NCwgZm9sbG93aW5nIHRoZSBob3N0CitLQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZ1bml0LWF0LWEtdGltZSkKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vTWFrZWZpbGUgYi9hcmNoL3g4Ni9jcnlwdG8vTWFrZWZpbGUKaW5kZXggYzA0ZjFiNy4uMzUzN2Q0YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2NyeXB0by9NYWtlZmlsZQpAQCAtNywyMSArNywzMyBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19TQUxTQTIwXzU4NikgKz0gc2Fsc2EyMC1pNTg2Lm8KIAogb2JqLSQoQ09ORklHX0NSWVBUT19BRVNfWDg2XzY0KSArPSBhZXMteDg2XzY0Lm8KK29iai0kKENPTkZJR19DUllQVE9fQkxPV0ZJU0hfWDg2XzY0KSArPSBibG93ZmlzaC14ODZfNjQubwogb2JqLSQoQ09ORklHX0NSWVBUT19UV09GSVNIX1g4Nl82NCkgKz0gdHdvZmlzaC14ODZfNjQubworb2JqLSQoQ09ORklHX0NSWVBUT19UV09GSVNIX1g4Nl82NF8zV0FZKSArPSB0d29maXNoLXg4Nl82NC0zd2F5Lm8KIG9iai0kKENPTkZJR19DUllQVE9fU0FMU0EyMF9YODZfNjQpICs9IHNhbHNhMjAteDg2XzY0Lm8KIG9iai0kKENPTkZJR19DUllQVE9fQUVTX05JX0lOVEVMKSArPSBhZXNuaS1pbnRlbC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0dIQVNIX0NMTVVMX05JX0lOVEVMKSArPSBnaGFzaC1jbG11bG5pLWludGVsLm8KIAogb2JqLSQoQ09ORklHX0NSWVBUT19DUkMzMkNfSU5URUwpICs9IGNyYzMyYy1pbnRlbC5vCitvYmotJChDT05GSUdfQ1JZUFRPX1NIQTFfU1NTRTMpICs9IHNoYTEtc3NzZTMubwogCiBhZXMtaTU4Ni15IDo9IGFlcy1pNTg2LWFzbV8zMi5vIGFlc19nbHVlLm8KIHR3b2Zpc2gtaTU4Ni15IDo9IHR3b2Zpc2gtaTU4Ni1hc21fMzIubyB0d29maXNoX2dsdWUubwogc2Fsc2EyMC1pNTg2LXkgOj0gc2Fsc2EyMC1pNTg2LWFzbV8zMi5vIHNhbHNhMjBfZ2x1ZS5vCiAKIGFlcy14ODZfNjQteSA6PSBhZXMteDg2XzY0LWFzbV82NC5vIGFlc19nbHVlLm8KK2Jsb3dmaXNoLXg4Nl82NC15IDo9IGJsb3dmaXNoLXg4Nl82NC1hc21fNjQubyBibG93ZmlzaF9nbHVlLm8KIHR3b2Zpc2gteDg2XzY0LXkgOj0gdHdvZmlzaC14ODZfNjQtYXNtXzY0Lm8gdHdvZmlzaF9nbHVlLm8KK3R3b2Zpc2gteDg2XzY0LTN3YXkteSA6PSB0d29maXNoLXg4Nl82NC1hc21fNjQtM3dheS5vIHR3b2Zpc2hfZ2x1ZV8zd2F5Lm8KIHNhbHNhMjAteDg2XzY0LXkgOj0gc2Fsc2EyMC14ODZfNjQtYXNtXzY0Lm8gc2Fsc2EyMF9nbHVlLm8KIAogYWVzbmktaW50ZWwteSA6PSBhZXNuaS1pbnRlbF9hc20ubyBhZXNuaS1pbnRlbF9nbHVlLm8gZnB1Lm8KIAogZ2hhc2gtY2xtdWxuaS1pbnRlbC15IDo9IGdoYXNoLWNsbXVsbmktaW50ZWxfYXNtLm8gZ2hhc2gtY2xtdWxuaS1pbnRlbF9nbHVlLm8KKworIyBlbmFibGUgQVZYIHN1cHBvcnQgb25seSB3aGVuICQoQVMpIGNhbiBhY3R1YWxseSBhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb25zCitpZmVxICgkKGNhbGwgYXMtaW5zdHIsdnB4b3IgJXhtbTAkKGNvbW1hKSV4bW0xJChjb21tYSkleG1tMix5ZXMsbm8pLHllcykKK0FGTEFHU19zaGExX3Nzc2UzX2FzbS5vICs9IC1EU0hBMV9FTkFCTEVfQVZYX1NVUFBPUlQKK0NGTEFHU19zaGExX3Nzc2UzX2dsdWUubyArPSAtRFNIQTFfRU5BQkxFX0FWWF9TVVBQT1JUCitlbmRpZgorc2hhMS1zc3NlMy15IDo9IHNoYTFfc3NzZTNfYXNtLm8gc2hhMV9zc3NlM19nbHVlLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9hZXNfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL2Flc19nbHVlLmMKaW5kZXggNDlhZTlmZS4uOGVmY2Y0MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL2Flc19nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL2Flc19nbHVlLmMKQEAgLTMsNyArMyw5IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxjcnlwdG8vYWVzLmg+CisjaW5jbHVkZSA8YXNtL2Flcy5oPgogCiBhc21saW5rYWdlIHZvaWQgYWVzX2VuY19ibGsoc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbik7CiBhc21saW5rYWdlIHZvaWQgYWVzX2RlY19ibGsoc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vYWVzbmktaW50ZWxfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL2Flc25pLWludGVsX2dsdWUuYwppbmRleCBmZWVlOGZmLi41NDVkMGNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vYWVzbmktaW50ZWxfZ2x1ZS5jCisrKyBiL2FyY2gveDg2L2NyeXB0by9hZXNuaS1pbnRlbF9nbHVlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxjcnlwdG8vYWxnYXBpLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL2Flcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL2Jsb3dmaXNoLXg4Nl82NC1hc21fNjQuUyBiL2FyY2gveDg2L2NyeXB0by9ibG93ZmlzaC14ODZfNjQtYXNtXzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxZDI0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2NyeXB0by9ibG93ZmlzaC14ODZfNjQtYXNtXzY0LlMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBCbG93ZmlzaCBDaXBoZXIgQWxnb3JpdGhtICh4ODZfNjQpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEp1c3NpIEtpdmlsaW5uYSA8anVzc2kua2l2aWxpbm5hQG1ibmV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiBVU0EKKyAqCisgKi8KKworLmZpbGUgImJsb3dmaXNoLXg4Nl82NC1hc20uUyIKKy50ZXh0CisKKy8qIHN0cnVjdHVyZSBvZiBjcnlwdG8gY29udGV4dCAqLworI2RlZmluZSBwCTAKKyNkZWZpbmUgczAJKCgxNiArIDIpICogNCkKKyNkZWZpbmUgczEJKCgxNiArIDIgKyAoMSAqIDI1NikpICogNCkKKyNkZWZpbmUgczIJKCgxNiArIDIgKyAoMiAqIDI1NikpICogNCkKKyNkZWZpbmUgczMJKCgxNiArIDIgKyAoMyAqIDI1NikpICogNCkKKworLyogcmVnaXN0ZXIgbWFjcm9zICovCisjZGVmaW5lIENUWCAlcmRpCisjZGVmaW5lIFJJTyAlcnNpCisKKyNkZWZpbmUgUlgwICVyYXgKKyNkZWZpbmUgUlgxICVyYngKKyNkZWZpbmUgUlgyICVyY3gKKyNkZWZpbmUgUlgzICVyZHgKKworI2RlZmluZSBSWDBkICVlYXgKKyNkZWZpbmUgUlgxZCAlZWJ4CisjZGVmaW5lIFJYMmQgJWVjeAorI2RlZmluZSBSWDNkICVlZHgKKworI2RlZmluZSBSWDBibCAlYWwKKyNkZWZpbmUgUlgxYmwgJWJsCisjZGVmaW5lIFJYMmJsICVjbAorI2RlZmluZSBSWDNibCAlZGwKKworI2RlZmluZSBSWDBiaCAlYWgKKyNkZWZpbmUgUlgxYmggJWJoCisjZGVmaW5lIFJYMmJoICVjaAorI2RlZmluZSBSWDNiaCAlZGgKKworI2RlZmluZSBSVDAgJXJicAorI2RlZmluZSBSVDEgJXJzaQorI2RlZmluZSBSVDIgJXI4CisjZGVmaW5lIFJUMyAlcjkKKworI2RlZmluZSBSVDBkICVlYnAKKyNkZWZpbmUgUlQxZCAlZXNpCisjZGVmaW5lIFJUMmQgJXI4ZAorI2RlZmluZSBSVDNkICVyOWQKKworI2RlZmluZSBSS0VZICVyMTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAxLXdheSBibG93ZmlzaAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGKCkgXAorCXJvcnEgJDE2LAkJUlgwOyBcCisJbW92emJsIFJYMGJoLAkJUlQwZDsgXAorCW1vdnpibCBSWDBibCwJCVJUMWQ7IFwKKwlyb2xxICQxNiwJCVJYMDsgXAorCW1vdmwgczAoQ1RYLFJUMCw0KSwJUlQwZDsgXAorCWFkZGwgczEoQ1RYLFJUMSw0KSwJUlQwZDsgXAorCW1vdnpibCBSWDBiaCwJCVJUMWQ7IFwKKwltb3Z6YmwgUlgwYmwsCQlSVDJkOyBcCisJcm9scSAkMzIsCQlSWDA7IFwKKwl4b3JsIHMyKENUWCxSVDEsNCksCVJUMGQ7IFwKKwlhZGRsIHMzKENUWCxSVDIsNCksCVJUMGQ7IFwKKwl4b3JxIFJUMCwJCVJYMDsKKworI2RlZmluZSBhZGRfcm91bmRrZXlfZW5jKG4pIFwKKwl4b3JxIHArNCoobikoQ1RYKSwgCVJYMDsKKworI2RlZmluZSByb3VuZF9lbmMobikgXAorCWFkZF9yb3VuZGtleV9lbmMobik7IFwKKwlcCisJRigpOyBcCisJRigpOworCisjZGVmaW5lIGFkZF9yb3VuZGtleV9kZWMobikgXAorCW1vdnEgcCs0KihuLTEpKENUWCksCVJUMDsgXAorCXJvcnEgJDMyLAkJUlQwOyBcCisJeG9ycSBSVDAsCQlSWDA7CisKKyNkZWZpbmUgcm91bmRfZGVjKG4pIFwKKwlhZGRfcm91bmRrZXlfZGVjKG4pOyBcCisJXAorCUYoKTsgXAorCUYoKTsgXAorCisjZGVmaW5lIHJlYWRfYmxvY2soKSBcCisJbW92cSAoUklPKSwgCQlSWDA7IFwKKwlyb3JxICQzMiwgCQlSWDA7IFwKKwlic3dhcHEgCQkJUlgwOworCisjZGVmaW5lIHdyaXRlX2Jsb2NrKCkgXAorCWJzd2FwcSAJCQlSWDA7IFwKKwltb3ZxIFJYMCwgCQkoUklPKTsKKworI2RlZmluZSB4b3JfYmxvY2soKSBcCisJYnN3YXBxIAkJCVJYMDsgXAorCXhvcnEgUlgwLCAJCShSSU8pOworCisuYWxpZ24gOAorLmdsb2JhbCBfX2Jsb3dmaXNoX2VuY19ibGsKKy50eXBlICAgX19ibG93ZmlzaF9lbmNfYmxrLEBmdW5jdGlvbjsKKworX19ibG93ZmlzaF9lbmNfYmxrOgorCS8qIGlucHV0OgorCSAqCSVyZGk6IGN0eCwgQ1RYCisJICoJJXJzaTogZHN0CisJICoJJXJkeDogc3JjCisJICoJJXJjeDogYm9vbCwgaWYgdHJ1ZTogeG9yIG91dHB1dAorCSAqLworCW1vdnEgJXJicCwgJXIxMTsKKworCW1vdnEgJXJzaSwgJXIxMDsKKwltb3ZxICVyZHgsIFJJTzsKKworCXJlYWRfYmxvY2soKTsKKworCXJvdW5kX2VuYygwKTsKKwlyb3VuZF9lbmMoMik7CisJcm91bmRfZW5jKDQpOworCXJvdW5kX2VuYyg2KTsKKwlyb3VuZF9lbmMoOCk7CisJcm91bmRfZW5jKDEwKTsKKwlyb3VuZF9lbmMoMTIpOworCXJvdW5kX2VuYygxNCk7CisJYWRkX3JvdW5ka2V5X2VuYygxNik7CisKKwltb3ZxICVyMTEsICVyYnA7CisKKwltb3ZxICVyMTAsIFJJTzsKKwl0ZXN0ICVjbCwgJWNsOworCWpueiBfX2VuY194b3I7CisKKwl3cml0ZV9ibG9jaygpOworCXJldDsKK19fZW5jX3hvcjoKKwl4b3JfYmxvY2soKTsKKwlyZXQ7CisKKy5hbGlnbiA4CisuZ2xvYmFsIGJsb3dmaXNoX2RlY19ibGsKKy50eXBlICAgYmxvd2Zpc2hfZGVjX2JsayxAZnVuY3Rpb247CisKK2Jsb3dmaXNoX2RlY19ibGs6CisJLyogaW5wdXQ6CisJICoJJXJkaTogY3R4LCBDVFgKKwkgKgklcnNpOiBkc3QKKwkgKgklcmR4OiBzcmMKKwkgKi8KKwltb3ZxICVyYnAsICVyMTE7CisKKwltb3ZxICVyc2ksICVyMTA7CisJbW92cSAlcmR4LCBSSU87CisKKwlyZWFkX2Jsb2NrKCk7CisKKwlyb3VuZF9kZWMoMTcpOworCXJvdW5kX2RlYygxNSk7CisJcm91bmRfZGVjKDEzKTsKKwlyb3VuZF9kZWMoMTEpOworCXJvdW5kX2RlYyg5KTsKKwlyb3VuZF9kZWMoNyk7CisJcm91bmRfZGVjKDUpOworCXJvdW5kX2RlYygzKTsKKwlhZGRfcm91bmRrZXlfZGVjKDEpOworCisJbW92cSAlcjEwLCBSSU87CisJd3JpdGVfYmxvY2soKTsKKworCW1vdnEgJXIxMSwgJXJicDsKKworCXJldDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgNC13YXkgYmxvd2Zpc2gsIGZvdXIgYmxvY2tzIHBhcmFsbGVsCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRigpIGZvciA0LXdheS4gU2xvd2VyIHdoZW4gdXNlZCBhbG9uZS8xLXdheSwgYnV0IGZhc3RlciB3aGVuIHVzZWQKKyAqIHBhcmFsbGVsLzQtd2F5ICh0ZXN0ZWQgb24gQU1EIFBoZW5vbSBJSSAmIEludGVsIFhlb24gRTczMzApLgorICovCisjZGVmaW5lIEY0KHgpIFwKKwltb3Z6YmwgeCAjIyBiaCwJCVJUMWQ7IFwKKwltb3Z6YmwgeCAjIyBibCwJCVJUM2Q7IFwKKwlyb3JxICQxNiwJCXg7IFwKKwltb3Z6YmwgeCAjIyBiaCwJCVJUMGQ7IFwKKwltb3Z6YmwgeCAjIyBibCwJCVJUMmQ7IFwKKwlyb3JxICQxNiwJCXg7IFwKKwltb3ZsIHMwKENUWCxSVDAsNCksCVJUMGQ7IFwKKwlhZGRsIHMxKENUWCxSVDIsNCksCVJUMGQ7IFwKKwl4b3JsIHMyKENUWCxSVDEsNCksCVJUMGQ7IFwKKwlhZGRsIHMzKENUWCxSVDMsNCksCVJUMGQ7IFwKKwl4b3JxIFJUMCwJCXg7CisKKyNkZWZpbmUgYWRkX3ByZWxvYWRlZF9yb3VuZGtleTQoKSBcCisJeG9ycSBSS0VZLAkJUlgwOyBcCisJeG9ycSBSS0VZLAkJUlgxOyBcCisJeG9ycSBSS0VZLAkJUlgyOyBcCisJeG9ycSBSS0VZLAkJUlgzOworCisjZGVmaW5lIHByZWxvYWRfcm91bmRrZXlfZW5jKG4pIFwKKwltb3ZxIHArNCoobikoQ1RYKSwJUktFWTsKKworI2RlZmluZSBhZGRfcm91bmRrZXlfZW5jNChuKSBcCisJYWRkX3ByZWxvYWRlZF9yb3VuZGtleTQoKTsgXAorCXByZWxvYWRfcm91bmRrZXlfZW5jKG4gKyAyKTsKKworI2RlZmluZSByb3VuZF9lbmM0KG4pIFwKKwlhZGRfcm91bmRrZXlfZW5jNChuKTsgXAorCVwKKwlGNChSWDApOyBcCisJRjQoUlgxKTsgXAorCUY0KFJYMik7IFwKKwlGNChSWDMpOyBcCisJXAorCUY0KFJYMCk7IFwKKwlGNChSWDEpOyBcCisJRjQoUlgyKTsgXAorCUY0KFJYMyk7CisKKyNkZWZpbmUgcHJlbG9hZF9yb3VuZGtleV9kZWMobikgXAorCW1vdnEgcCs0KigobiktMSkoQ1RYKSwJUktFWTsgXAorCXJvcnEgJDMyLAkJUktFWTsKKworI2RlZmluZSBhZGRfcm91bmRrZXlfZGVjNChuKSBcCisJYWRkX3ByZWxvYWRlZF9yb3VuZGtleTQoKTsgXAorCXByZWxvYWRfcm91bmRrZXlfZGVjKG4gLSAyKTsKKworI2RlZmluZSByb3VuZF9kZWM0KG4pIFwKKwlhZGRfcm91bmRrZXlfZGVjNChuKTsgXAorCVwKKwlGNChSWDApOyBcCisJRjQoUlgxKTsgXAorCUY0KFJYMik7IFwKKwlGNChSWDMpOyBcCisJXAorCUY0KFJYMCk7IFwKKwlGNChSWDEpOyBcCisJRjQoUlgyKTsgXAorCUY0KFJYMyk7CisKKyNkZWZpbmUgcmVhZF9ibG9jazQoKSBcCisJbW92cSAoUklPKSwJCVJYMDsgXAorCXJvcnEgJDMyLAkJUlgwOyBcCisJYnN3YXBxIAkJCVJYMDsgXAorCVwKKwltb3ZxIDgoUklPKSwJCVJYMTsgXAorCXJvcnEgJDMyLAkJUlgxOyBcCisJYnN3YXBxIAkJCVJYMTsgXAorCVwKKwltb3ZxIDE2KFJJTyksCQlSWDI7IFwKKwlyb3JxICQzMiwJCVJYMjsgXAorCWJzd2FwcSAJCQlSWDI7IFwKKwlcCisJbW92cSAyNChSSU8pLAkJUlgzOyBcCisJcm9ycSAkMzIsCQlSWDM7IFwKKwlic3dhcHEgCQkJUlgzOworCisjZGVmaW5lIHdyaXRlX2Jsb2NrNCgpIFwKKwlic3dhcHEgCQkJUlgwOyBcCisJbW92cSBSWDAsCQkoUklPKTsgXAorCVwKKwlic3dhcHEgCQkJUlgxOyBcCisJbW92cSBSWDEsCQk4KFJJTyk7IFwKKwlcCisJYnN3YXBxIAkJCVJYMjsgXAorCW1vdnEgUlgyLAkJMTYoUklPKTsgXAorCVwKKwlic3dhcHEgCQkJUlgzOyBcCisJbW92cSBSWDMsCQkyNChSSU8pOworCisjZGVmaW5lIHhvcl9ibG9jazQoKSBcCisJYnN3YXBxIAkJCVJYMDsgXAorCXhvcnEgUlgwLAkJKFJJTyk7IFwKKwlcCisJYnN3YXBxIAkJCVJYMTsgXAorCXhvcnEgUlgxLAkJOChSSU8pOyBcCisJXAorCWJzd2FwcSAJCQlSWDI7IFwKKwl4b3JxIFJYMiwJCTE2KFJJTyk7IFwKKwlcCisJYnN3YXBxIAkJCVJYMzsgXAorCXhvcnEgUlgzLAkJMjQoUklPKTsKKworLmFsaWduIDgKKy5nbG9iYWwgX19ibG93ZmlzaF9lbmNfYmxrXzR3YXkKKy50eXBlICAgX19ibG93ZmlzaF9lbmNfYmxrXzR3YXksQGZ1bmN0aW9uOworCitfX2Jsb3dmaXNoX2VuY19ibGtfNHdheToKKwkvKiBpbnB1dDoKKwkgKgklcmRpOiBjdHgsIENUWAorCSAqCSVyc2k6IGRzdAorCSAqCSVyZHg6IHNyYworCSAqCSVyY3g6IGJvb2wsIGlmIHRydWU6IHhvciBvdXRwdXQKKwkgKi8KKwlwdXNocSAlcmJwOworCXB1c2hxICVyYng7CisJcHVzaHEgJXJjeDsKKworCXByZWxvYWRfcm91bmRrZXlfZW5jKDApOworCisJbW92cSAlcnNpLCAlcjExOworCW1vdnEgJXJkeCwgUklPOworCisJcmVhZF9ibG9jazQoKTsKKworCXJvdW5kX2VuYzQoMCk7CisJcm91bmRfZW5jNCgyKTsKKwlyb3VuZF9lbmM0KDQpOworCXJvdW5kX2VuYzQoNik7CisJcm91bmRfZW5jNCg4KTsKKwlyb3VuZF9lbmM0KDEwKTsKKwlyb3VuZF9lbmM0KDEyKTsKKwlyb3VuZF9lbmM0KDE0KTsKKwlhZGRfcHJlbG9hZGVkX3JvdW5ka2V5NCgpOworCisJcG9wcSAlcmJwOworCW1vdnEgJXIxMSwgUklPOworCisJdGVzdCAlYnBsLCAlYnBsOworCWpueiBfX2VuY194b3I0OworCisJd3JpdGVfYmxvY2s0KCk7CisKKwlwb3BxICVyYng7CisJcG9wcSAlcmJwOworCXJldDsKKworX19lbmNfeG9yNDoKKwl4b3JfYmxvY2s0KCk7CisKKwlwb3BxICVyYng7CisJcG9wcSAlcmJwOworCXJldDsKKworLmFsaWduIDgKKy5nbG9iYWwgYmxvd2Zpc2hfZGVjX2Jsa180d2F5CisudHlwZSAgIGJsb3dmaXNoX2RlY19ibGtfNHdheSxAZnVuY3Rpb247CisKK2Jsb3dmaXNoX2RlY19ibGtfNHdheToKKwkvKiBpbnB1dDoKKwkgKgklcmRpOiBjdHgsIENUWAorCSAqCSVyc2k6IGRzdAorCSAqCSVyZHg6IHNyYworCSAqLworCXB1c2hxICVyYnA7CisJcHVzaHEgJXJieDsKKwlwcmVsb2FkX3JvdW5ka2V5X2RlYygxNyk7CisKKwltb3ZxICVyc2ksICVyMTE7CisJbW92cSAlcmR4LCBSSU87CisKKwlyZWFkX2Jsb2NrNCgpOworCisJcm91bmRfZGVjNCgxNyk7CisJcm91bmRfZGVjNCgxNSk7CisJcm91bmRfZGVjNCgxMyk7CisJcm91bmRfZGVjNCgxMSk7CisJcm91bmRfZGVjNCg5KTsKKwlyb3VuZF9kZWM0KDcpOworCXJvdW5kX2RlYzQoNSk7CisJcm91bmRfZGVjNCgzKTsKKwlhZGRfcHJlbG9hZGVkX3JvdW5ka2V5NCgpOworCisJbW92cSAlcjExLCBSSU87CisJd3JpdGVfYmxvY2s0KCk7CisKKwlwb3BxICVyYng7CisJcG9wcSAlcmJwOworCisJcmV0OworCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vYmxvd2Zpc2hfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL2Jsb3dmaXNoX2dsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDVhYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvY3J5cHRvL2Jsb3dmaXNoX2dsdWUuYwpAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIEdsdWUgQ29kZSBmb3IgYXNzZW1ibGVyIG9wdGltaXplZCB2ZXJzaW9uIG9mIEJsb3dmaXNoCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIEp1c3NpIEtpdmlsaW5uYSA8anVzc2kua2l2aWxpbm5hQG1ibmV0LmZpPgorICoKKyAqIENCQyAmIEVDQiBwYXJ0cyBiYXNlZCBvbiBjb2RlIChjcnlwdG8vY2JjLmMsZWNiLmMpIGJ5OgorICogICBDb3B5cmlnaHQgKGMpIDIwMDYgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogQ1RSIHBhcnQgYmFzZWQgb24gY29kZSAoY3J5cHRvL2N0ci5jKSBieToKKyAqICAgKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNyAtIEpveSBMYXR0ZW4gPGxhdHRlbkB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNyeXB0by9ibG93ZmlzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KKworLyogcmVndWxhciBibG9jayBjaXBoZXIgZnVuY3Rpb25zICovCithc21saW5rYWdlIHZvaWQgX19ibG93ZmlzaF9lbmNfYmxrKHN0cnVjdCBiZl9jdHggKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYywKKwkJCQkgICBib29sIHhvcik7Cithc21saW5rYWdlIHZvaWQgYmxvd2Zpc2hfZGVjX2JsayhzdHJ1Y3QgYmZfY3R4ICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworCisvKiA0LXdheSBwYXJhbGxlbCBjaXBoZXIgZnVuY3Rpb25zICovCithc21saW5rYWdlIHZvaWQgX19ibG93ZmlzaF9lbmNfYmxrXzR3YXkoc3RydWN0IGJmX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCQljb25zdCB1OCAqc3JjLCBib29sIHhvcik7Cithc21saW5rYWdlIHZvaWQgYmxvd2Zpc2hfZGVjX2Jsa180d2F5KHN0cnVjdCBiZl9jdHggKmN0eCwgdTggKmRzdCwKKwkJCQkgICAgICBjb25zdCB1OCAqc3JjKTsKKworc3RhdGljIGlubGluZSB2b2lkIGJsb3dmaXNoX2VuY19ibGsoc3RydWN0IGJmX2N0eCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCV9fYmxvd2Zpc2hfZW5jX2JsayhjdHgsIGRzdCwgc3JjLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibG93ZmlzaF9lbmNfYmxrX3hvcihzdHJ1Y3QgYmZfY3R4ICpjdHgsIHU4ICpkc3QsCisJCQkJCWNvbnN0IHU4ICpzcmMpCit7CisJX19ibG93ZmlzaF9lbmNfYmxrKGN0eCwgZHN0LCBzcmMsIHRydWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmxvd2Zpc2hfZW5jX2Jsa180d2F5KHN0cnVjdCBiZl9jdHggKmN0eCwgdTggKmRzdCwKKwkJCQkJIGNvbnN0IHU4ICpzcmMpCit7CisJX19ibG93ZmlzaF9lbmNfYmxrXzR3YXkoY3R4LCBkc3QsIHNyYywgZmFsc2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmxvd2Zpc2hfZW5jX2Jsa194b3JfNHdheShzdHJ1Y3QgYmZfY3R4ICpjdHgsIHU4ICpkc3QsCisJCQkJICAgICAgY29uc3QgdTggKnNyYykKK3sKKwlfX2Jsb3dmaXNoX2VuY19ibGtfNHdheShjdHgsIGRzdCwgc3JjLCB0cnVlKTsKK30KKworc3RhdGljIHZvaWQgYmxvd2Zpc2hfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCWJsb3dmaXNoX2VuY19ibGsoY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOworfQorCitzdGF0aWMgdm9pZCBibG93ZmlzaF9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CisJYmxvd2Zpc2hfZGVjX2JsayhjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIHNyYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBiZl9hbGcgPSB7CisJLmNyYV9uYW1lCQk9CSJibG93ZmlzaCIsCisJLmNyYV9kcml2ZXJfbmFtZQk9CSJibG93ZmlzaC1hc20iLAorCS5jcmFfcHJpb3JpdHkJCT0JMjAwLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlCRl9CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGJmX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMywKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYmZfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UJCQk9CXsKKwkJLmNpcGhlciA9IHsKKwkJCS5jaWFfbWluX2tleXNpemUJPQlCRl9NSU5fS0VZX1NJWkUsCisJCQkuY2lhX21heF9rZXlzaXplCT0JQkZfTUFYX0tFWV9TSVpFLAorCQkJLmNpYV9zZXRrZXkJCT0JYmxvd2Zpc2hfc2V0a2V5LAorCQkJLmNpYV9lbmNyeXB0CQk9CWJsb3dmaXNoX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJCT0JYmxvd2Zpc2hfZGVjcnlwdCwKKwkJfQorCX0KK307CisKK3N0YXRpYyBpbnQgZWNiX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrLAorCQkgICAgIHZvaWQgKCpmbikoc3RydWN0IGJmX2N0eCAqLCB1OCAqLCBjb25zdCB1OCAqKSwKKwkJICAgICB2b2lkICgqZm5fNHdheSkoc3RydWN0IGJmX2N0eCAqLCB1OCAqLCBjb25zdCB1OCAqKSkKK3sKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IEJGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlczsKKwlpbnQgZXJyOworCisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSkgeworCQl1OCAqd3NyYyA9IHdhbGstPnNyYy52aXJ0LmFkZHI7CisJCXU4ICp3ZHN0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKKworCQkvKiBQcm9jZXNzIGZvdXIgYmxvY2sgYmF0Y2ggKi8KKwkJaWYgKG5ieXRlcyA+PSBic2l6ZSAqIDQpIHsKKwkJCWRvIHsKKwkJCQlmbl80d2F5KGN0eCwgd2RzdCwgd3NyYyk7CisKKwkJCQl3c3JjICs9IGJzaXplICogNDsKKwkJCQl3ZHN0ICs9IGJzaXplICogNDsKKwkJCQluYnl0ZXMgLT0gYnNpemUgKiA0OworCQkJfSB3aGlsZSAobmJ5dGVzID49IGJzaXplICogNCk7CisKKwkJCWlmIChuYnl0ZXMgPCBic2l6ZSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKworCQkvKiBIYW5kbGUgbGVmdG92ZXJzICovCisJCWRvIHsKKwkJCWZuKGN0eCwgd2RzdCwgd3NyYyk7CisKKwkJCXdzcmMgKz0gYnNpemU7CisJCQl3ZHN0ICs9IGJzaXplOworCQkJbmJ5dGVzIC09IGJzaXplOworCQl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUpOworCitkb25lOgorCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlY2JfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwlyZXR1cm4gZWNiX2NyeXB0KGRlc2MsICZ3YWxrLCBibG93ZmlzaF9lbmNfYmxrLCBibG93ZmlzaF9lbmNfYmxrXzR3YXkpOworfQorCitzdGF0aWMgaW50IGVjYl9kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCXJldHVybiBlY2JfY3J5cHQoZGVzYywgJndhbGssIGJsb3dmaXNoX2RlY19ibGssIGJsb3dmaXNoX2RlY19ibGtfNHdheSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBibGtfZWNiX2FsZyA9IHsKKwkuY3JhX25hbWUJCT0gImVjYihibG93ZmlzaCkiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiZWNiLWJsb3dmaXNoLWFzbSIsCisJLmNyYV9wcmlvcml0eQkJPSAzMDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9IEJGX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgYmZfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPSAwLAorCS5jcmFfdHlwZQkJPSAmY3J5cHRvX2Jsa2NpcGhlcl90eXBlLAorCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5jcmFfbGlzdAkJPSBMSVNUX0hFQURfSU5JVChibGtfZWNiX2FsZy5jcmFfbGlzdCksCisJLmNyYV91ID0geworCQkuYmxrY2lwaGVyID0geworCQkJLm1pbl9rZXlzaXplCT0gQkZfTUlOX0tFWV9TSVpFLAorCQkJLm1heF9rZXlzaXplCT0gQkZfTUFYX0tFWV9TSVpFLAorCQkJLnNldGtleQkJPSBibG93ZmlzaF9zZXRrZXksCisJCQkuZW5jcnlwdAk9IGVjYl9lbmNyeXB0LAorCQkJLmRlY3J5cHQJPSBlY2JfZGVjcnlwdCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBfX2NiY19lbmNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKK3sKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IEJGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1NjQgKnNyYyA9ICh1NjQgKil3YWxrLT5zcmMudmlydC5hZGRyOworCXU2NCAqZHN0ID0gKHU2NCAqKXdhbGstPmRzdC52aXJ0LmFkZHI7CisJdTY0ICppdiA9ICh1NjQgKil3YWxrLT5pdjsKKworCWRvIHsKKwkJKmRzdCA9ICpzcmMgXiAqaXY7CisJCWJsb3dmaXNoX2VuY19ibGsoY3R4LCAodTggKilkc3QsICh1OCAqKWRzdCk7CisJCWl2ID0gZHN0OworCisJCXNyYyArPSAxOworCQlkc3QgKz0gMTsKKwkJbmJ5dGVzIC09IGJzaXplOworCX0gd2hpbGUgKG5ieXRlcyA+PSBic2l6ZSk7CisKKwkqKHU2NCAqKXdhbGstPml2ID0gKml2OworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2VuY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCWludCBlcnI7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCW5ieXRlcyA9IF9fY2JjX2VuY3J5cHQoZGVzYywgJndhbGspOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jYmNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IGJmX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgYnNpemUgPSBCRl9CTE9DS19TSVpFOworCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7CisJdTY0ICpzcmMgPSAodTY0ICopd2Fsay0+c3JjLnZpcnQuYWRkcjsKKwl1NjQgKmRzdCA9ICh1NjQgKil3YWxrLT5kc3QudmlydC5hZGRyOworCXU2NCBpdnNbNCAtIDFdOworCXU2NCBsYXN0X2l2OworCisJLyogU3RhcnQgb2YgdGhlIGxhc3QgYmxvY2suICovCisJc3JjICs9IG5ieXRlcyAvIGJzaXplIC0gMTsKKwlkc3QgKz0gbmJ5dGVzIC8gYnNpemUgLSAxOworCisJbGFzdF9pdiA9ICpzcmM7CisKKwkvKiBQcm9jZXNzIGZvdXIgYmxvY2sgYmF0Y2ggKi8KKwlpZiAobmJ5dGVzID49IGJzaXplICogNCkgeworCQlkbyB7CisJCQluYnl0ZXMgLT0gYnNpemUgKiA0IC0gYnNpemU7CisJCQlzcmMgLT0gNCAtIDE7CisJCQlkc3QgLT0gNCAtIDE7CisKKwkJCWl2c1swXSA9IHNyY1swXTsKKwkJCWl2c1sxXSA9IHNyY1sxXTsKKwkJCWl2c1syXSA9IHNyY1syXTsKKworCQkJYmxvd2Zpc2hfZGVjX2Jsa180d2F5KGN0eCwgKHU4ICopZHN0LCAodTggKilzcmMpOworCisJCQlkc3RbMV0gXj0gaXZzWzBdOworCQkJZHN0WzJdIF49IGl2c1sxXTsKKwkJCWRzdFszXSBePSBpdnNbMl07CisKKwkJCW5ieXRlcyAtPSBic2l6ZTsKKwkJCWlmIChuYnl0ZXMgPCBic2l6ZSkKKwkJCQlnb3RvIGRvbmU7CisKKwkJCSpkc3QgXj0gKihzcmMgLSAxKTsKKwkJCXNyYyAtPSAxOworCQkJZHN0IC09IDE7CisJCX0gd2hpbGUgKG5ieXRlcyA+PSBic2l6ZSAqIDQpOworCisJCWlmIChuYnl0ZXMgPCBic2l6ZSkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBIYW5kbGUgbGVmdG92ZXJzICovCisJZm9yICg7OykgeworCQlibG93ZmlzaF9kZWNfYmxrKGN0eCwgKHU4ICopZHN0LCAodTggKilzcmMpOworCisJCW5ieXRlcyAtPSBic2l6ZTsKKwkJaWYgKG5ieXRlcyA8IGJzaXplKQorCQkJYnJlYWs7CisKKwkJKmRzdCBePSAqKHNyYyAtIDEpOworCQlzcmMgLT0gMTsKKwkJZHN0IC09IDE7CisJfQorCitkb25lOgorCSpkc3QgXj0gKih1NjQgKil3YWxrLT5pdjsKKwkqKHU2NCAqKXdhbGstPml2ID0gbGFzdF9pdjsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCWludCBlcnI7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCW5ieXRlcyA9IF9fY2JjX2RlY3J5cHQoZGVzYywgJndhbGspOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBibGtfY2JjX2FsZyA9IHsKKwkuY3JhX25hbWUJCT0gImNiYyhibG93ZmlzaCkiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiY2JjLWJsb3dmaXNoLWFzbSIsCisJLmNyYV9wcmlvcml0eQkJPSAzMDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9IEJGX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgYmZfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPSAwLAorCS5jcmFfdHlwZQkJPSAmY3J5cHRvX2Jsa2NpcGhlcl90eXBlLAorCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5jcmFfbGlzdAkJPSBMSVNUX0hFQURfSU5JVChibGtfY2JjX2FsZy5jcmFfbGlzdCksCisJLmNyYV91ID0geworCQkuYmxrY2lwaGVyID0geworCQkJLm1pbl9rZXlzaXplCT0gQkZfTUlOX0tFWV9TSVpFLAorCQkJLm1heF9rZXlzaXplCT0gQkZfTUFYX0tFWV9TSVpFLAorCQkJLml2c2l6ZQkJPSBCRl9CTE9DS19TSVpFLAorCQkJLnNldGtleQkJPSBibG93ZmlzaF9zZXRrZXksCisJCQkuZW5jcnlwdAk9IGNiY19lbmNyeXB0LAorCQkJLmRlY3J5cHQJPSBjYmNfZGVjcnlwdCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgY3RyX2NyeXB0X2ZpbmFsKHN0cnVjdCBiZl9jdHggKmN0eCwgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQoreworCXU4ICpjdHJibGsgPSB3YWxrLT5pdjsKKwl1OCBrZXlzdHJlYW1bQkZfQkxPQ0tfU0laRV07CisJdTggKnNyYyA9IHdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTggKmRzdCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKworCWJsb3dmaXNoX2VuY19ibGsoY3R4LCBrZXlzdHJlYW0sIGN0cmJsayk7CisJY3J5cHRvX3hvcihrZXlzdHJlYW0sIHNyYywgbmJ5dGVzKTsKKwltZW1jcHkoZHN0LCBrZXlzdHJlYW0sIG5ieXRlcyk7CisKKwljcnlwdG9faW5jKGN0cmJsaywgQkZfQkxPQ0tfU0laRSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jdHJfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAorCQkJCXN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKK3sKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IEJGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1NjQgKnNyYyA9ICh1NjQgKil3YWxrLT5zcmMudmlydC5hZGRyOworCXU2NCAqZHN0ID0gKHU2NCAqKXdhbGstPmRzdC52aXJ0LmFkZHI7CisJdTY0IGN0cmJsayA9IGJlNjRfdG9fY3B1KCooX19iZTY0ICopd2Fsay0+aXYpOworCV9fYmU2NCBjdHJibG9ja3NbNF07CisKKwkvKiBQcm9jZXNzIGZvdXIgYmxvY2sgYmF0Y2ggKi8KKwlpZiAobmJ5dGVzID49IGJzaXplICogNCkgeworCQlkbyB7CisJCQlpZiAoZHN0ICE9IHNyYykgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJZHN0WzJdID0gc3JjWzJdOworCQkJCWRzdFszXSA9IHNyY1szXTsKKwkJCX0KKworCQkJLyogY3JlYXRlIGN0cmJsa3MgZm9yIHBhcmFsbGVsIGVuY3J5cHQgKi8KKwkJCWN0cmJsb2Nrc1swXSA9IGNwdV90b19iZTY0KGN0cmJsaysrKTsKKwkJCWN0cmJsb2Nrc1sxXSA9IGNwdV90b19iZTY0KGN0cmJsaysrKTsKKwkJCWN0cmJsb2Nrc1syXSA9IGNwdV90b19iZTY0KGN0cmJsaysrKTsKKwkJCWN0cmJsb2Nrc1szXSA9IGNwdV90b19iZTY0KGN0cmJsaysrKTsKKworCQkJYmxvd2Zpc2hfZW5jX2Jsa194b3JfNHdheShjdHgsICh1OCAqKWRzdCwKKwkJCQkJCSAgKHU4ICopY3RyYmxvY2tzKTsKKworCQkJc3JjICs9IDQ7CisJCQlkc3QgKz0gNDsKKwkJfSB3aGlsZSAoKG5ieXRlcyAtPSBic2l6ZSAqIDQpID49IGJzaXplICogNCk7CisKKwkJaWYgKG5ieXRlcyA8IGJzaXplKQorCQkJZ290byBkb25lOworCX0KKworCS8qIEhhbmRsZSBsZWZ0b3ZlcnMgKi8KKwlkbyB7CisJCWlmIChkc3QgIT0gc3JjKQorCQkJKmRzdCA9ICpzcmM7CisKKwkJY3RyYmxvY2tzWzBdID0gY3B1X3RvX2JlNjQoY3RyYmxrKyspOworCisJCWJsb3dmaXNoX2VuY19ibGtfeG9yKGN0eCwgKHU4ICopZHN0LCAodTggKiljdHJibG9ja3MpOworCisJCXNyYyArPSAxOworCQlkc3QgKz0gMTsKKwl9IHdoaWxlICgobmJ5dGVzIC09IGJzaXplKSA+PSBic2l6ZSk7CisKK2RvbmU6CisJKihfX2JlNjQgKil3YWxrLT5pdiA9IGNwdV90b19iZTY0KGN0cmJsayk7CisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIGludCBjdHJfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKwlpbnQgZXJyOworCisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydF9ibG9jayhkZXNjLCAmd2FsaywgQkZfQkxPQ0tfU0laRSk7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSA+PSBCRl9CTE9DS19TSVpFKSB7CisJCW5ieXRlcyA9IF9fY3RyX2NyeXB0KGRlc2MsICZ3YWxrKTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgbmJ5dGVzKTsKKwl9CisKKwlpZiAod2Fsay5uYnl0ZXMpIHsKKwkJY3RyX2NyeXB0X2ZpbmFsKGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSksICZ3YWxrKTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgMCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGJsa19jdHJfYWxnID0geworCS5jcmFfbmFtZQkJPSAiY3RyKGJsb3dmaXNoKSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9ICJjdHItYmxvd2Zpc2gtYXNtIiwKKwkuY3JhX3ByaW9yaXR5CQk9IDMwMCwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0gMSwKKwkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBiZl9jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJLmNyYV90eXBlCQk9ICZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCisJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9IExJU1RfSEVBRF9JTklUKGJsa19jdHJfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UgPSB7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJPSBCRl9NSU5fS0VZX1NJWkUsCisJCQkubWF4X2tleXNpemUJPSBCRl9NQVhfS0VZX1NJWkUsCisJCQkuaXZzaXplCQk9IEJGX0JMT0NLX1NJWkUsCisJCQkuc2V0a2V5CQk9IGJsb3dmaXNoX3NldGtleSwKKwkJCS5lbmNyeXB0CT0gY3RyX2NyeXB0LAorCQkJLmRlY3J5cHQJPSBjdHJfY3J5cHQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYmZfYWxnKTsKKwlpZiAoZXJyKQorCQlnb3RvIGJmX2VycjsKKwllcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZibGtfZWNiX2FsZyk7CisJaWYgKGVycikKKwkJZ290byBlY2JfZXJyOworCWVyciA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmJsa19jYmNfYWxnKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNiY19lcnI7CisJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYmxrX2N0cl9hbGcpOworCWlmIChlcnIpCisJCWdvdG8gY3RyX2VycjsKKworCXJldHVybiAwOworCitjdHJfZXJyOgorCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYmxrX2NiY19hbGcpOworY2JjX2VycjoKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19lY2JfYWxnKTsKK2VjYl9lcnI6CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZiZl9hbGcpOworYmZfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfY3RyX2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfY2JjX2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfZWNiX2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZiZl9hbGcpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJsb3dmaXNoIENpcGhlciBBbGdvcml0aG0sIGFzbSBvcHRpbWl6ZWQiKTsKK01PRFVMRV9BTElBUygiYmxvd2Zpc2giKTsKK01PRFVMRV9BTElBUygiYmxvd2Zpc2gtYXNtIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19hc20uUyBiL2FyY2gveDg2L2NyeXB0by9zaGExX3Nzc2UzX2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzJmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19hc20uUwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIFRoaXMgaXMgYSBTSU1EIFNIQS0xIGltcGxlbWVudGF0aW9uLiBJdCByZXF1aXJlcyB0aGUgSW50ZWwoUikgU3VwcGxlbWVudGFsCisgKiBTU0UzIGluc3RydWN0aW9uIHNldCBleHRlbnNpb25zIGludHJvZHVjZWQgaW4gSW50ZWwgQ29yZSBNaWNyb2FyY2hpdGVjdHVyZQorICogcHJvY2Vzc29ycy4gQ1BVcyBzdXBwb3J0aW5nIEludGVsKFIpIEFWWCBleHRlbnNpb25zIHdpbGwgZ2V0IGFuIGFkZGl0aW9uYWwKKyAqIGJvb3N0LgorICoKKyAqIFRoaXMgd29yayB3YXMgaW5zcGlyZWQgYnkgdGhlIHZlY3Rvcml6ZWQgaW1wbGVtZW50YXRpb24gb2YgRGVhbiBHYXVkZXQuCisgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGl0IGNhbiBiZSBmb3VuZCBhdDoKKyAqICAgIGh0dHA6Ly93d3cuYXJjdGljLm9yZy9+ZGVhbi9jcnlwdG8vc2hhMS5odG1sCisgKgorICogSXQgd2FzIGltcHJvdmVkIHVwb24gd2l0aCBtb3JlIGVmZmljaWVudCB2ZWN0b3JpemF0aW9uIG9mIHRoZSBtZXNzYWdlCisgKiBzY2hlZHVsaW5nLiBUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBhbHNvIGJlZW4gb3B0aW1pemVkIGZvciBhbGwgY3VycmVudCBhbmQKKyAqIHNldmVyYWwgZnV0dXJlIGdlbmVyYXRpb25zIG9mIEludGVsIENQVXMuCisgKgorICogU2VlIHRoaXMgYXJ0aWNsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlsczoKKyAqICAgaHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbXByb3ZpbmctdGhlLXBlcmZvcm1hbmNlLW9mLXRoZS1zZWN1cmUtaGFzaC1hbGdvcml0aG0tMS8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEludGVsIENvcnAuCisgKiAgIEF1dGhvcnM6IE1heGltIExvY2t0eXVraGluIDxtYXhpbS5sb2NrdHl1a2hpbkBpbnRlbC5jb20+CisgKiAgICAgICAgICAgIFJvbmVuIFpvaGFyIDxyb25lbi56b2hhckBpbnRlbC5jb20+CisgKgorICogQ29udmVydGVkIHRvIEFUJlQgc3ludGF4IGFuZCBhZGFwdGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIExpbnV4IGtlcm5lbDoKKyAqICAgQXV0aG9yOiBNYXRoaWFzIEtyYXVzZSA8bWluaXBsaUBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgQ1RYCSVyZGkJLy8gYXJnMQorI2RlZmluZSBCVUYJJXJzaQkvLyBhcmcyCisjZGVmaW5lIENOVAklcmR4CS8vIGFyZzMKKworI2RlZmluZSBSRUdfQQklZWN4CisjZGVmaW5lIFJFR19CCSVlc2kKKyNkZWZpbmUgUkVHX0MJJWVkaQorI2RlZmluZSBSRUdfRAklZWJwCisjZGVmaW5lIFJFR19FCSVlZHgKKworI2RlZmluZSBSRUdfVDEJJWVheAorI2RlZmluZSBSRUdfVDIJJWVieAorCisjZGVmaW5lIEtfQkFTRQkJJXI4CisjZGVmaW5lIEhBU0hfUFRSCSVyOQorI2RlZmluZSBCVUZGRVJfUFRSCSVyMTAKKyNkZWZpbmUgQlVGRkVSX0VORAklcjExCisKKyNkZWZpbmUgV19UTVAxCSV4bW0wCisjZGVmaW5lIFdfVE1QMgkleG1tOQorCisjZGVmaW5lIFcwCSV4bW0xCisjZGVmaW5lIFc0CSV4bW0yCisjZGVmaW5lIFc4CSV4bW0zCisjZGVmaW5lIFcxMgkleG1tNAorI2RlZmluZSBXMTYJJXhtbTUKKyNkZWZpbmUgVzIwCSV4bW02CisjZGVmaW5lIFcyNAkleG1tNworI2RlZmluZSBXMjgJJXhtbTgKKworI2RlZmluZSBYTU1fU0hVRkJfQlNXQVAJJXhtbTEwCisKKy8qIHdlIGtlZXAgd2luZG93IG9mIDY0IHdbaV0rSyBwcmUtY2FsY3VsYXRlZCB2YWx1ZXMgaW4gYSBjaXJjdWxhciBidWZmZXIgKi8KKyNkZWZpbmUgV0sodCkJKCgodCkgJiAxNSkgKiA0KSglcnNwKQorI2RlZmluZSBXX1BSRUNBTENfQUhFQUQJMTYKKworLyoKKyAqIFRoaXMgbWFjcm8gaW1wbGVtZW50cyB0aGUgU0hBLTEgZnVuY3Rpb24ncyBib2R5IGZvciBzaW5nbGUgNjQtYnl0ZSBibG9jaworICogcGFyYW06IGZ1bmN0aW9uJ3MgbmFtZQorICovCisubWFjcm8gU0hBMV9WRUNUT1JfQVNNICBuYW1lCisJLmdsb2JhbAlcbmFtZQorCS50eXBlCVxuYW1lLCBAZnVuY3Rpb24KKwkuYWxpZ24gMzIKK1xuYW1lOgorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCisJbW92CSVyc3AsICVyMTIKKwlzdWIJJDY0LCAlcnNwCQkjIGFsbG9jYXRlIHdvcmtzcGFjZQorCWFuZAkkfjE1LCAlcnNwCQkjIGFsaWduIHN0YWNrCisKKwltb3YJQ1RYLCBIQVNIX1BUUgorCW1vdglCVUYsIEJVRkZFUl9QVFIKKworCXNobAkkNiwgQ05UCQkJIyBtdWx0aXBseSBieSA2NAorCWFkZAlCVUYsIENOVAorCW1vdglDTlQsIEJVRkZFUl9FTkQKKworCWxlYQlLX1hNTV9BUiglcmlwKSwgS19CQVNFCisJeG1tX21vdglCU1dBUF9TSFVGQl9DVEwoJXJpcCksIFhNTV9TSFVGQl9CU1dBUAorCisJU0hBMV9QSVBFTElORURfTUFJTl9CT0RZCisKKwkjIGNsZWFudXAgd29ya3NwYWNlCisJbW92CSQ4LCAlZWN4CisJbW92CSVyc3AsICVyZGkKKwl4b3IJJXJheCwgJXJheAorCXJlcCBzdG9zcQorCisJbW92CSVyMTIsICVyc3AJCSMgZGVhbGxvY2F0ZSB3b3Jrc3BhY2UKKworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXJldAorCisJLnNpemUJXG5hbWUsIC4tXG5hbWUKKy5lbmRtCisKKy8qCisgKiBUaGlzIG1hY3JvIGltcGxlbWVudHMgODAgcm91bmRzIG9mIFNIQS0xIGZvciBvbmUgNjQtYnl0ZSBibG9jaworICovCisubWFjcm8gU0hBMV9QSVBFTElORURfTUFJTl9CT0RZCisJSU5JVF9SRUdBTExPQworCisJbW92CSAgKEhBU0hfUFRSKSwgQQorCW1vdgkgNChIQVNIX1BUUiksIEIKKwltb3YJIDgoSEFTSF9QVFIpLCBDCisJbW92CTEyKEhBU0hfUFRSKSwgRAorCW1vdgkxNihIQVNIX1BUUiksIEUKKworICAuc2V0IGksIDAKKyAgLnJlcHQgV19QUkVDQUxDX0FIRUFECisJV19QUkVDQUxDIGkKKyAgICAuc2V0IGksIChpKzEpCisgIC5lbmRyCisKKy5hbGlnbiA0CisxOgorCVJSIEYxLEEsQixDLEQsRSwwCisJUlIgRjEsRCxFLEEsQixDLDIKKwlSUiBGMSxCLEMsRCxFLEEsNAorCVJSIEYxLEUsQSxCLEMsRCw2CisJUlIgRjEsQyxELEUsQSxCLDgKKworCVJSIEYxLEEsQixDLEQsRSwxMAorCVJSIEYxLEQsRSxBLEIsQywxMgorCVJSIEYxLEIsQyxELEUsQSwxNAorCVJSIEYxLEUsQSxCLEMsRCwxNgorCVJSIEYxLEMsRCxFLEEsQiwxOAorCisJUlIgRjIsQSxCLEMsRCxFLDIwCisJUlIgRjIsRCxFLEEsQixDLDIyCisJUlIgRjIsQixDLEQsRSxBLDI0CisJUlIgRjIsRSxBLEIsQyxELDI2CisJUlIgRjIsQyxELEUsQSxCLDI4CisKKwlSUiBGMixBLEIsQyxELEUsMzAKKwlSUiBGMixELEUsQSxCLEMsMzIKKwlSUiBGMixCLEMsRCxFLEEsMzQKKwlSUiBGMixFLEEsQixDLEQsMzYKKwlSUiBGMixDLEQsRSxBLEIsMzgKKworCVJSIEYzLEEsQixDLEQsRSw0MAorCVJSIEYzLEQsRSxBLEIsQyw0MgorCVJSIEYzLEIsQyxELEUsQSw0NAorCVJSIEYzLEUsQSxCLEMsRCw0NgorCVJSIEYzLEMsRCxFLEEsQiw0OAorCisJUlIgRjMsQSxCLEMsRCxFLDUwCisJUlIgRjMsRCxFLEEsQixDLDUyCisJUlIgRjMsQixDLEQsRSxBLDU0CisJUlIgRjMsRSxBLEIsQyxELDU2CisJUlIgRjMsQyxELEUsQSxCLDU4CisKKwlhZGQJJDY0LCBCVUZGRVJfUFRSCQkjIG1vdmUgdG8gdGhlIG5leHQgNjQtYnl0ZSBibG9jaworCWNtcAlCVUZGRVJfRU5ELCBCVUZGRVJfUFRSCSMgaWYgdGhlIGN1cnJlbnQgaXMgdGhlIGxhc3Qgb25lIHVzZQorCWNtb3ZhZQlLX0JBU0UsIEJVRkZFUl9QVFIJIyBkdW1teSBzb3VyY2UgdG8gYXZvaWQgYnVmZmVyIG92ZXJydW4KKworCVJSIEY0LEEsQixDLEQsRSw2MAorCVJSIEY0LEQsRSxBLEIsQyw2MgorCVJSIEY0LEIsQyxELEUsQSw2NAorCVJSIEY0LEUsQSxCLEMsRCw2NgorCVJSIEY0LEMsRCxFLEEsQiw2OAorCisJUlIgRjQsQSxCLEMsRCxFLDcwCisJUlIgRjQsRCxFLEEsQixDLDcyCisJUlIgRjQsQixDLEQsRSxBLDc0CisJUlIgRjQsRSxBLEIsQyxELDc2CisJUlIgRjQsQyxELEUsQSxCLDc4CisKKwlVUERBVEVfSEFTSCAgIChIQVNIX1BUUiksIEEKKwlVUERBVEVfSEFTSCAgNChIQVNIX1BUUiksIEIKKwlVUERBVEVfSEFTSCAgOChIQVNIX1BUUiksIEMKKwlVUERBVEVfSEFTSCAxMihIQVNIX1BUUiksIEQKKwlVUERBVEVfSEFTSCAxNihIQVNIX1BUUiksIEUKKworCVJFU1RPUkVfUkVOQU1FRF9SRUdTCisJY21wCUtfQkFTRSwgQlVGRkVSX1BUUgkjIEtfQkFTRSBtZWFucywgd2UgcmVhY2hlZCB0aGUgZW5kCisJam5lCTFiCisuZW5kbQorCisubWFjcm8gSU5JVF9SRUdBTExPQworICAuc2V0IEEsIFJFR19BCisgIC5zZXQgQiwgUkVHX0IKKyAgLnNldCBDLCBSRUdfQworICAuc2V0IEQsIFJFR19ECisgIC5zZXQgRSwgUkVHX0UKKyAgLnNldCBUMSwgUkVHX1QxCisgIC5zZXQgVDIsIFJFR19UMgorLmVuZG0KKworLm1hY3JvIFJFU1RPUkVfUkVOQU1FRF9SRUdTCisJIyBvcmRlciBpcyBpbXBvcnRhbnQgKFJFR19DIGlzIHdoZXJlIGl0IHNob3VsZCBiZSkKKwltb3YJQiwgUkVHX0IKKwltb3YJRCwgUkVHX0QKKwltb3YJQSwgUkVHX0EKKwltb3YJRSwgUkVHX0UKKy5lbmRtCisKKy5tYWNybyBTV0FQX1JFR19OQU1FUyAgYSwgYgorICAuc2V0IF9ULCBcYQorICAuc2V0IFxhLCBcYgorICAuc2V0IFxiLCBfVAorLmVuZG0KKworLm1hY3JvIEYxICBiLCBjLCBkCisJbW92CVxjLCBUMQorCVNXQVBfUkVHX05BTUVTIFxjLCBUMQorCXhvcglcZCwgVDEKKwlhbmQJXGIsIFQxCisJeG9yCVxkLCBUMQorLmVuZG0KKworLm1hY3JvIEYyICBiLCBjLCBkCisJbW92CVxkLCBUMQorCVNXQVBfUkVHX05BTUVTIFxkLCBUMQorCXhvcglcYywgVDEKKwl4b3IJXGIsIFQxCisuZW5kbQorCisubWFjcm8gRjMgIGIsIGMgLGQKKwltb3YJXGMsIFQxCisJU1dBUF9SRUdfTkFNRVMgXGMsIFQxCisJbW92CVxiLCBUMgorCW9yCVxiLCBUMQorCWFuZAlcYywgVDIKKwlhbmQJXGQsIFQxCisJb3IJVDIsIFQxCisuZW5kbQorCisubWFjcm8gRjQgIGIsIGMsIGQKKwlGMiBcYiwgXGMsIFxkCisuZW5kbQorCisubWFjcm8gVVBEQVRFX0hBU0ggIGhhc2gsIHZhbAorCWFkZAlcaGFzaCwgXHZhbAorCW1vdglcdmFsLCBcaGFzaAorLmVuZG0KKworLyoKKyAqIFJSIGRvZXMgdHdvIHJvdW5kcyBvZiBTSEEtMSBiYWNrIHRvIGJhY2sgd2l0aCBXW10gcHJlLWNhbGMKKyAqICAgdDEgPSBGKGIsIGMsIGQpOyAgIGUgKz0gdyhpKQorICogICBlICs9IHQxOyAgICAgICAgICAgYiA8PD0gMzA7ICAgZCAgKz0gdyhpKzEpOworICogICB0MSA9IEYoYSwgYiwgYyk7CisgKiAgIGQgKz0gdDE7ICAgICAgICAgICBhIDw8PSA1OworICogICBlICs9IGE7CisgKiAgIHQxID0gZTsgICAgICAgICAgICBhID4+PSA3OworICogICB0MSA8PD0gNTsKKyAqICAgZCArPSB0MTsKKyAqLworLm1hY3JvIFJSICBGLCBhLCBiLCBjLCBkLCBlLCByb3VuZAorCWFkZAlXSyhccm91bmQpLCBcZQorCVxGICAgXGIsIFxjLCBcZAkJIyB0MSA9IEYoYiwgYywgZCk7CisJV19QUkVDQUxDIChccm91bmQgKyBXX1BSRUNBTENfQUhFQUQpCisJcm9sCSQzMCwgXGIKKwlhZGQJVDEsIFxlCisJYWRkCVdLKFxyb3VuZCArIDEpLCBcZAorCisJXEYgICBcYSwgXGIsIFxjCisJV19QUkVDQUxDIChccm91bmQgKyBXX1BSRUNBTENfQUhFQUQgKyAxKQorCXJvbAkkNSwgXGEKKwlhZGQJXGEsIFxlCisJYWRkCVQxLCBcZAorCXJvcgkkNywgXGEJCSMgKGEgPDxyIDUpID4+ciA3KSA9PiBhIDw8ciAzMCkKKworCW1vdglcZSwgVDEKKwlTV0FQX1JFR19OQU1FUyBcZSwgVDEKKworCXJvbAkkNSwgVDEKKwlhZGQJVDEsIFxkCisKKwkjIHdyaXRlOiAgXGEsIFxiCisJIyByb3RhdGU6IFxhPD1cZCwgXGI8PVxlLCBcYzw9XGEsIFxkPD1cYiwgXGU8PVxjCisuZW5kbQorCisubWFjcm8gV19QUkVDQUxDICByCisgIC5zZXQgaSwgXHIKKworICAuaWYgKGkgPCAyMCkKKyAgICAuc2V0IEtfWE1NLCAwCisgIC5lbHNlaWYgKGkgPCA0MCkKKyAgICAuc2V0IEtfWE1NLCAxNgorICAuZWxzZWlmIChpIDwgNjApCisgICAgLnNldCBLX1hNTSwgMzIKKyAgLmVsc2VpZiAoaSA8IDgwKQorICAgIC5zZXQgS19YTU0sIDQ4CisgIC5lbmRpZgorCisgIC5pZiAoKGkgPCAxNikgfHwgKChpID49IDgwKSAmJiAoaSA8ICg4MCArIFdfUFJFQ0FMQ19BSEVBRCkpKSkKKyAgICAuc2V0IGksICgoXHIpICUgODApCSAgICAjIHByZS1jb21wdXRlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KKyAgICAuaWYgKGkgPT0gMCkKKwlXX1BSRUNBTENfUkVTRVQKKyAgICAuZW5kaWYKKwlXX1BSRUNBTENfMDBfMTUKKyAgLmVsc2VpZiAoaTwzMikKKwlXX1BSRUNBTENfMTZfMzEKKyAgLmVsc2VpZiAoaSA8IDgwKSAgIC8vIHJvdW5kcyAzMi03OQorCVdfUFJFQ0FMQ18zMl83OQorICAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBXX1BSRUNBTENfUkVTRVQKKyAgLnNldCBXLCAgICAgICAgICBXMAorICAuc2V0IFdfbWludXNfMDQsIFc0CisgIC5zZXQgV19taW51c18wOCwgVzgKKyAgLnNldCBXX21pbnVzXzEyLCBXMTIKKyAgLnNldCBXX21pbnVzXzE2LCBXMTYKKyAgLnNldCBXX21pbnVzXzIwLCBXMjAKKyAgLnNldCBXX21pbnVzXzI0LCBXMjQKKyAgLnNldCBXX21pbnVzXzI4LCBXMjgKKyAgLnNldCBXX21pbnVzXzMyLCBXCisuZW5kbQorCisubWFjcm8gV19QUkVDQUxDX1JPVEFURQorICAuc2V0IFdfbWludXNfMzIsIFdfbWludXNfMjgKKyAgLnNldCBXX21pbnVzXzI4LCBXX21pbnVzXzI0CisgIC5zZXQgV19taW51c18yNCwgV19taW51c18yMAorICAuc2V0IFdfbWludXNfMjAsIFdfbWludXNfMTYKKyAgLnNldCBXX21pbnVzXzE2LCBXX21pbnVzXzEyCisgIC5zZXQgV19taW51c18xMiwgV19taW51c18wOAorICAuc2V0IFdfbWludXNfMDgsIFdfbWludXNfMDQKKyAgLnNldCBXX21pbnVzXzA0LCBXCisgIC5zZXQgVywgICAgICAgICAgV19taW51c18zMgorLmVuZG0KKworLm1hY3JvIFdfUFJFQ0FMQ19TU1NFMworCisubWFjcm8gV19QUkVDQUxDXzAwXzE1CisJV19QUkVDQUxDXzAwXzE1X1NTU0UzCisuZW5kbQorLm1hY3JvIFdfUFJFQ0FMQ18xNl8zMQorCVdfUFJFQ0FMQ18xNl8zMV9TU1NFMworLmVuZG0KKy5tYWNybyBXX1BSRUNBTENfMzJfNzkKKwlXX1BSRUNBTENfMzJfNzlfU1NTRTMKKy5lbmRtCisKKy8qIG1lc3NhZ2Ugc2NoZWR1bGluZyBwcmUtY29tcHV0ZSBmb3Igcm91bmRzIDAtMTUgKi8KKy5tYWNybyBXX1BSRUNBTENfMDBfMTVfU1NTRTMKKyAgLmlmICgoaSAmIDMpID09IDApCisJbW92ZHF1CShpKjQpKEJVRkZFUl9QVFIpLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAxKQorCXBzaHVmYglYTU1fU0hVRkJfQlNXQVAsIFdfVE1QMQorCW1vdmRxYQlXX1RNUDEsIFcKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAyKQorCXBhZGRkCShLX0JBU0UpLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAzKQorCW1vdmRxYSAgV19UTVAxLCBXSyhpJn4zKQorCVdfUFJFQ0FMQ19ST1RBVEUKKyAgLmVuZGlmCisuZW5kbQorCisvKiBtZXNzYWdlIHNjaGVkdWxpbmcgcHJlLWNvbXB1dGUgZm9yIHJvdW5kcyAxNi0zMQorICoKKyAqIC0gY2FsY3VsYXRpbmcgbGFzdCAzMiB3W2ldIHZhbHVlcyBpbiA4IFhNTSByZWdpc3RlcnMKKyAqIC0gcHJlLWNhbGN1bGF0ZSBLK3dbaV0gdmFsdWVzIGFuZCBzdG9yZSB0byBtZW0sIGZvciBsYXRlciBsb2FkIGJ5IEFMVSBhZGQKKyAqICAgaW5zdHJ1Y3Rpb24KKyAqCisgKiBzb21lICJoZWF2eS1saWZ0aW5nIiB2ZWN0b3JpemF0aW9uIGZvciByb3VuZHMgMTYtMzEgZHVlIHRvIHdbaV0tPndbaS0zXQorICogZGVwZW5kZW5jeSwgYnV0IGltcHJvdmVzIGZvciAzMi03OQorICovCisubWFjcm8gV19QUkVDQUxDXzE2XzMxX1NTU0UzCisgICMgYmxlbmRlZCBzY2hlZHVsaW5nIG9mIHZlY3RvciBhbmQgc2NhbGFyIGluc3RydWN0aW9uIHN0cmVhbXMsIG9uZSA0LXdpZGUKKyAgIyB2ZWN0b3IgaXRlcmF0aW9uIC8gNCBzY2FsYXIgcm91bmRzCisgIC5pZiAoKGkgJiAzKSA9PSAwKQorCW1vdmRxYQlXX21pbnVzXzEyLCBXCisJcGFsaWducgkkOCwgV19taW51c18xNiwgVwkjIHdbaS0xNF0KKwltb3ZkcWEJV19taW51c18wNCwgV19UTVAxCisJcHNybGRxCSQ0LCBXX1RNUDEJCSMgd1tpLTNdCisJcHhvcglXX21pbnVzXzA4LCBXCisgIC5lbHNlaWYgKChpICYgMykgPT0gMSkKKwlweG9yCVdfbWludXNfMTYsIFdfVE1QMQorCXB4b3IJV19UTVAxLCBXCisJbW92ZHFhCVcsIFdfVE1QMgorCW1vdmRxYQlXLCBXX1RNUDEKKwlwc2xsZHEJJDEyLCBXX1RNUDIKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAyKQorCXBzcmxkCSQzMSwgVworCXBzbGxkCSQxLCBXX1RNUDEKKwlwb3IJVywgV19UTVAxCisJbW92ZHFhCVdfVE1QMiwgVworCXBzcmxkCSQzMCwgV19UTVAyCisJcHNsbGQJJDIsIFcKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAzKQorCXB4b3IJVywgV19UTVAxCisJcHhvcglXX1RNUDIsIFdfVE1QMQorCW1vdmRxYQlXX1RNUDEsIFcKKwlwYWRkZAlLX1hNTShLX0JBU0UpLCBXX1RNUDEKKwltb3ZkcWEJV19UTVAxLCBXSyhpJn4zKQorCVdfUFJFQ0FMQ19ST1RBVEUKKyAgLmVuZGlmCisuZW5kbQorCisvKiBtZXNzYWdlIHNjaGVkdWxpbmcgcHJlLWNvbXB1dGUgZm9yIHJvdW5kcyAzMi03OQorICoKKyAqIGluIFNIQS0xIHNwZWNpZmljYXRpb246IHdbaV0gPSAod1tpLTNdIF4gd1tpLThdICBeIHdbaS0xNF0gXiB3W2ktMTZdKSByb2wgMQorICogaW5zdGVhZCB3ZSBkbyBlcXVhbDogICAgd1tpXSA9ICh3W2ktNl0gXiB3W2ktMTZdIF4gd1tpLTI4XSBeIHdbaS0zMl0pIHJvbCAyCisgKiBhbGxvd3MgbW9yZSBlZmZpY2llbnQgdmVjdG9yaXphdGlvbiBzaW5jZSB3W2ldPT53W2ktM10gZGVwZW5kZW5jeSBpcyBicm9rZW4KKyAqLworLm1hY3JvIFdfUFJFQ0FMQ18zMl83OV9TU1NFMworICAuaWYgKChpICYgMykgPT0gMCkKKwltb3ZkcWEJV19taW51c18wNCwgV19UTVAxCisJcHhvcglXX21pbnVzXzI4LCBXCQkjIFcgaXMgV19taW51c18zMiBiZWZvcmUgeG9yCisJcGFsaWducgkkOCwgV19taW51c18wOCwgV19UTVAxCisgIC5lbHNlaWYgKChpICYgMykgPT0gMSkKKwlweG9yCVdfbWludXNfMTYsIFcKKwlweG9yCVdfVE1QMSwgVworCW1vdmRxYQlXLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAyKQorCXBzcmxkCSQzMCwgVworCXBzbGxkCSQyLCBXX1RNUDEKKwlwb3IJVywgV19UTVAxCisgIC5lbHNlaWYgKChpICYgMykgPT0gMykKKwltb3ZkcWEJV19UTVAxLCBXCisJcGFkZGQJS19YTU0oS19CQVNFKSwgV19UTVAxCisJbW92ZHFhCVdfVE1QMSwgV0soaSZ+MykKKwlXX1BSRUNBTENfUk9UQVRFCisgIC5lbmRpZgorLmVuZG0KKworLmVuZG0JCS8vIFdfUFJFQ0FMQ19TU1NFMworCisKKyNkZWZpbmUgSzEJMHg1YTgyNzk5OQorI2RlZmluZSBLMgkweDZlZDllYmExCisjZGVmaW5lIEszCTB4OGYxYmJjZGMKKyNkZWZpbmUgSzQJMHhjYTYyYzFkNgorCisuc2VjdGlvbiAucm9kYXRhCisuYWxpZ24gMTYKKworS19YTU1fQVI6CisJLmxvbmcgSzEsIEsxLCBLMSwgSzEKKwkubG9uZyBLMiwgSzIsIEsyLCBLMgorCS5sb25nIEszLCBLMywgSzMsIEszCisJLmxvbmcgSzQsIEs0LCBLNCwgSzQKKworQlNXQVBfU0hVRkJfQ1RMOgorCS5sb25nIDB4MDAwMTAyMDMKKwkubG9uZyAweDA0MDUwNjA3CisJLmxvbmcgMHgwODA5MGEwYgorCS5sb25nIDB4MGMwZDBlMGYKKworCisuc2VjdGlvbiAudGV4dAorCitXX1BSRUNBTENfU1NTRTMKKy5tYWNybyB4bW1fbW92IGEsIGIKKwltb3ZkcXUJXGEsXGIKKy5lbmRtCisKKy8qIFNTU0UzIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbjoKKyAqICBleHRlcm4gIkMiIHZvaWQgc2hhMV90cmFuc2Zvcm1fc3NzZTModTMyICpkaWdlc3QsIGNvbnN0IGNoYXIgKmRhdGEsIHUzMiAqd3MsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByb3VuZHMpOworICovCitTSEExX1ZFQ1RPUl9BU00gICAgIHNoYTFfdHJhbnNmb3JtX3Nzc2UzCisKKyNpZmRlZiBTSEExX0VOQUJMRV9BVlhfU1VQUE9SVAorCisubWFjcm8gV19QUkVDQUxDX0FWWAorCisucHVyZ2VtIFdfUFJFQ0FMQ18wMF8xNQorLm1hY3JvICBXX1BSRUNBTENfMDBfMTUKKyAgICBXX1BSRUNBTENfMDBfMTVfQVZYCisuZW5kbQorLnB1cmdlbSBXX1BSRUNBTENfMTZfMzEKKy5tYWNybyAgV19QUkVDQUxDXzE2XzMxCisgICAgV19QUkVDQUxDXzE2XzMxX0FWWAorLmVuZG0KKy5wdXJnZW0gV19QUkVDQUxDXzMyXzc5CisubWFjcm8gIFdfUFJFQ0FMQ18zMl83OQorICAgIFdfUFJFQ0FMQ18zMl83OV9BVlgKKy5lbmRtCisKKy5tYWNybyBXX1BSRUNBTENfMDBfMTVfQVZYCisgIC5pZiAoKGkgJiAzKSA9PSAwKQorCXZtb3ZkcXUJKGkqNCkoQlVGRkVSX1BUUiksIFdfVE1QMQorICAuZWxzZWlmICgoaSAmIDMpID09IDEpCisJdnBzaHVmYglYTU1fU0hVRkJfQlNXQVAsIFdfVE1QMSwgVworICAuZWxzZWlmICgoaSAmIDMpID09IDIpCisJdnBhZGRkCShLX0JBU0UpLCBXLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAzKQorCXZtb3ZkcWEJV19UTVAxLCBXSyhpJn4zKQorCVdfUFJFQ0FMQ19ST1RBVEUKKyAgLmVuZGlmCisuZW5kbQorCisubWFjcm8gV19QUkVDQUxDXzE2XzMxX0FWWAorICAuaWYgKChpICYgMykgPT0gMCkKKwl2cGFsaWduciAkOCwgV19taW51c18xNiwgV19taW51c18xMiwgVwkjIHdbaS0xNF0KKwl2cHNybGRxCSQ0LCBXX21pbnVzXzA0LCBXX1RNUDEJCSMgd1tpLTNdCisJdnB4b3IJV19taW51c18wOCwgVywgVworCXZweG9yCVdfbWludXNfMTYsIFdfVE1QMSwgV19UTVAxCisgIC5lbHNlaWYgKChpICYgMykgPT0gMSkKKwl2cHhvcglXX1RNUDEsIFcsIFcKKwl2cHNsbGRxCSQxMiwgVywgV19UTVAyCisJdnBzbGxkCSQxLCBXLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAyKQorCXZwc3JsZAkkMzEsIFcsIFcKKwl2cG9yCVcsIFdfVE1QMSwgV19UTVAxCisJdnBzbGxkCSQyLCBXX1RNUDIsIFcKKwl2cHNybGQJJDMwLCBXX1RNUDIsIFdfVE1QMgorICAuZWxzZWlmICgoaSAmIDMpID09IDMpCisJdnB4b3IJVywgV19UTVAxLCBXX1RNUDEKKwl2cHhvcglXX1RNUDIsIFdfVE1QMSwgVworCXZwYWRkZAlLX1hNTShLX0JBU0UpLCBXLCBXX1RNUDEKKwl2bW92ZHF1CVdfVE1QMSwgV0soaSZ+MykKKwlXX1BSRUNBTENfUk9UQVRFCisgIC5lbmRpZgorLmVuZG0KKworLm1hY3JvIFdfUFJFQ0FMQ18zMl83OV9BVlgKKyAgLmlmICgoaSAmIDMpID09IDApCisJdnBhbGlnbnIgJDgsIFdfbWludXNfMDgsIFdfbWludXNfMDQsIFdfVE1QMQorCXZweG9yCVdfbWludXNfMjgsIFcsIFcJCSMgVyBpcyBXX21pbnVzXzMyIGJlZm9yZSB4b3IKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAxKQorCXZweG9yCVdfbWludXNfMTYsIFdfVE1QMSwgV19UTVAxCisJdnB4b3IJV19UTVAxLCBXLCBXCisgIC5lbHNlaWYgKChpICYgMykgPT0gMikKKwl2cHNsbGQJJDIsIFcsIFdfVE1QMQorCXZwc3JsZAkkMzAsIFcsIFcKKwl2cG9yCVcsIFdfVE1QMSwgVworICAuZWxzZWlmICgoaSAmIDMpID09IDMpCisJdnBhZGRkCUtfWE1NKEtfQkFTRSksIFcsIFdfVE1QMQorCXZtb3ZkcXUJV19UTVAxLCBXSyhpJn4zKQorCVdfUFJFQ0FMQ19ST1RBVEUKKyAgLmVuZGlmCisuZW5kbQorCisuZW5kbSAgICAvLyBXX1BSRUNBTENfQVZYCisKK1dfUFJFQ0FMQ19BVlgKKy5wdXJnZW0geG1tX21vdgorLm1hY3JvIHhtbV9tb3YgYSwgYgorCXZtb3ZkcXUJXGEsXGIKKy5lbmRtCisKKworLyogQVZYIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbjoKKyAqICBleHRlcm4gIkMiIHZvaWQgc2hhMV90cmFuc2Zvcm1fYXZ4KHUzMiAqZGlnZXN0LCBjb25zdCBjaGFyICpkYXRhLCB1MzIgKndzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJvdW5kcyk7CisgKi8KK1NIQTFfVkVDVE9SX0FTTSAgICAgc2hhMV90cmFuc2Zvcm1fYXZ4CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3NoYTFfc3NzZTNfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL3NoYTFfc3NzZTNfZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTY0OTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19nbHVlLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBHbHVlIGNvZGUgZm9yIHRoZSBTSEExIFNlY3VyZSBIYXNoIEFsZ29yaXRobSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24gdXNpbmcKKyAqIFN1cHBsZW1lbnRhbCBTU0UzIGluc3RydWN0aW9ucy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gc2hhMV9nZW5lcmljLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIEFsYW4gU21pdGhlZS4KKyAqIENvcHlyaWdodCAoYykgQW5kcmV3IE1jRG9uYWxkIDxhbmRyZXdAbWNkb25hbGQub3JnLnVrPgorICogQ29weXJpZ2h0IChjKSBKZWFuLUZyYW5jb2lzIERpdmUgPGplZkBsaW51eGJlLm9yZz4KKyAqIENvcHlyaWdodCAoYykgTWF0aGlhcyBLcmF1c2UgPG1pbmlwbGlAZ29vZ2xlbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KQlLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL3hjci5oPgorI2luY2x1ZGUgPGFzbS94c2F2ZS5oPgorCisKK2FzbWxpbmthZ2Ugdm9pZCBzaGExX3RyYW5zZm9ybV9zc3NlMyh1MzIgKmRpZ2VzdCwgY29uc3QgY2hhciAqZGF0YSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByb3VuZHMpOworI2lmZGVmIFNIQTFfRU5BQkxFX0FWWF9TVVBQT1JUCithc21saW5rYWdlIHZvaWQgc2hhMV90cmFuc2Zvcm1fYXZ4KHUzMiAqZGlnZXN0LCBjb25zdCBjaGFyICpkYXRhLAorCQkJCSAgIHVuc2lnbmVkIGludCByb3VuZHMpOworI2VuZGlmCisKK3N0YXRpYyBhc21saW5rYWdlIHZvaWQgKCpzaGExX3RyYW5zZm9ybV9hc20pKHUzMiAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCk7CisKKworc3RhdGljIGludCBzaGExX3Nzc2UzX2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCSpzY3R4ID0gKHN0cnVjdCBzaGExX3N0YXRlKXsKKwkJLnN0YXRlID0geyBTSEExX0gwLCBTSEExX0gxLCBTSEExX0gyLCBTSEExX0gzLCBTSEExX0g0IH0sCisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fc2hhMV9zc3NlM191cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBwYXJ0aWFsKQoreworCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCisJc2N0eC0+Y291bnQgKz0gbGVuOworCisJaWYgKHBhcnRpYWwpIHsKKwkJZG9uZSA9IFNIQTFfQkxPQ0tfU0laRSAtIHBhcnRpYWw7CisJCW1lbWNweShzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCBkYXRhLCBkb25lKTsKKwkJc2hhMV90cmFuc2Zvcm1fYXNtKHNjdHgtPnN0YXRlLCBzY3R4LT5idWZmZXIsIDEpOworCX0KKworCWlmIChsZW4gLSBkb25lID49IFNIQTFfQkxPQ0tfU0laRSkgeworCQljb25zdCB1bnNpZ25lZCBpbnQgcm91bmRzID0gKGxlbiAtIGRvbmUpIC8gU0hBMV9CTE9DS19TSVpFOworCisJCXNoYTFfdHJhbnNmb3JtX2FzbShzY3R4LT5zdGF0ZSwgZGF0YSArIGRvbmUsIHJvdW5kcyk7CisJCWRvbmUgKz0gcm91bmRzICogU0hBMV9CTE9DS19TSVpFOworCX0KKworCW1lbWNweShzY3R4LT5idWZmZXIsIGRhdGEgKyBkb25lLCBsZW4gLSBkb25lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoYTFfc3NzZTNfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gc2N0eC0+Y291bnQgJSBTSEExX0JMT0NLX1NJWkU7CisJaW50IHJlczsKKworCS8qIEhhbmRsZSB0aGUgZmFzdCBjYXNlIHJpZ2h0IGhlcmUgKi8KKwlpZiAocGFydGlhbCArIGxlbiA8IFNIQTFfQkxPQ0tfU0laRSkgeworCQlzY3R4LT5jb3VudCArPSBsZW47CisJCW1lbWNweShzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCBkYXRhLCBsZW4pOworCisJCXJldHVybiAwOworCX0KKworCWlmICghaXJxX2ZwdV91c2FibGUoKSkgeworCQlyZXMgPSBjcnlwdG9fc2hhMV91cGRhdGUoZGVzYywgZGF0YSwgbGVuKTsKKwl9IGVsc2UgeworCQlrZXJuZWxfZnB1X2JlZ2luKCk7CisJCXJlcyA9IF9fc2hhMV9zc3NlM191cGRhdGUoZGVzYywgZGF0YSwgbGVuLCBwYXJ0aWFsKTsKKwkJa2VybmVsX2ZwdV9lbmQoKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisKKy8qIEFkZCBwYWRkaW5nIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0LiAqLworc3RhdGljIGludCBzaGExX3Nzc2UzX2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQoreworCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJdW5zaWduZWQgaW50IGksIGluZGV4LCBwYWRsZW47CisJX19iZTMyICpkc3QgPSAoX19iZTMyICopb3V0OworCV9fYmU2NCBiaXRzOworCXN0YXRpYyBjb25zdCB1OCBwYWRkaW5nW1NIQTFfQkxPQ0tfU0laRV0gPSB7IDB4ODAsIH07CisKKwliaXRzID0gY3B1X3RvX2JlNjQoc2N0eC0+Y291bnQgPDwgMyk7CisKKwkvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NCBhbmQgYXBwZW5kIGxlbmd0aCAqLworCWluZGV4ID0gc2N0eC0+Y291bnQgJSBTSEExX0JMT0NLX1NJWkU7CisJcGFkbGVuID0gKGluZGV4IDwgNTYpID8gKDU2IC0gaW5kZXgpIDogKChTSEExX0JMT0NLX1NJWkUrNTYpIC0gaW5kZXgpOworCWlmICghaXJxX2ZwdV91c2FibGUoKSkgeworCQljcnlwdG9fc2hhMV91cGRhdGUoZGVzYywgcGFkZGluZywgcGFkbGVuKTsKKwkJY3J5cHRvX3NoYTFfdXBkYXRlKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cykpOworCX0gZWxzZSB7CisJCWtlcm5lbF9mcHVfYmVnaW4oKTsKKwkJLyogV2UgbmVlZCB0byBmaWxsIGEgd2hvbGUgYmxvY2sgZm9yIF9fc2hhMV9zc3NlM191cGRhdGUoKSAqLworCQlpZiAocGFkbGVuIDw9IDU2KSB7CisJCQlzY3R4LT5jb3VudCArPSBwYWRsZW47CisJCQltZW1jcHkoc2N0eC0+YnVmZmVyICsgaW5kZXgsIHBhZGRpbmcsIHBhZGxlbik7CisJCX0gZWxzZSB7CisJCQlfX3NoYTFfc3NzZTNfdXBkYXRlKGRlc2MsIHBhZGRpbmcsIHBhZGxlbiwgaW5kZXgpOworCQl9CisJCV9fc2hhMV9zc3NlM191cGRhdGUoZGVzYywgKGNvbnN0IHU4ICopJmJpdHMsIHNpemVvZihiaXRzKSwgNTYpOworCQlrZXJuZWxfZnB1X2VuZCgpOworCX0KKworCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWRzdFtpXSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlW2ldKTsKKworCS8qIFdpcGUgY29udGV4dCAqLworCW1lbXNldChzY3R4LCAwLCBzaXplb2YoKnNjdHgpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoYTFfc3NzZTNfZXhwb3J0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB2b2lkICpvdXQpCit7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCW1lbWNweShvdXQsIHNjdHgsIHNpemVvZigqc2N0eCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hhMV9zc3NlM19pbXBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHZvaWQgKmluKQoreworCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwltZW1jcHkoc2N0eCwgaW4sIHNpemVvZigqc2N0eCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2hhc2hfYWxnIGFsZyA9IHsKKwkuZGlnZXN0c2l6ZQk9CVNIQTFfRElHRVNUX1NJWkUsCisJLmluaXQJCT0Jc2hhMV9zc3NlM19pbml0LAorCS51cGRhdGUJCT0Jc2hhMV9zc3NlM191cGRhdGUsCisJLmZpbmFsCQk9CXNoYTFfc3NzZTNfZmluYWwsCisJLmV4cG9ydAkJPQlzaGExX3Nzc2UzX2V4cG9ydCwKKwkuaW1wb3J0CQk9CXNoYTFfc3NzZTNfaW1wb3J0LAorCS5kZXNjc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMV9zdGF0ZSksCisJLnN0YXRlc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMV9zdGF0ZSksCisJLmJhc2UJCT0JeworCQkuY3JhX25hbWUJPQkic2hhMSIsCisJCS5jcmFfZHJpdmVyX25hbWU9CSJzaGExLXNzc2UzIiwKKwkJLmNyYV9wcmlvcml0eQk9CTE1MCwKKwkJLmNyYV9mbGFncwk9CUNSWVBUT19BTEdfVFlQRV9TSEFTSCwKKwkJLmNyYV9ibG9ja3NpemUJPQlTSEExX0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfTsKKworI2lmZGVmIFNIQTFfRU5BQkxFX0FWWF9TVVBQT1JUCitzdGF0aWMgYm9vbCBfX2luaXQgYXZ4X3VzYWJsZSh2b2lkKQoreworCXU2NCB4Y3IwOworCisJaWYgKCFjcHVfaGFzX2F2eCB8fCAhY3B1X2hhc19vc3hzYXZlKQorCQlyZXR1cm4gZmFsc2U7CisKKwl4Y3IwID0geGdldGJ2KFhDUl9YRkVBVFVSRV9FTkFCTEVEX01BU0spOworCWlmICgoeGNyMCAmIChYU1RBVEVfU1NFIHwgWFNUQVRFX1lNTSkpICE9IChYU1RBVEVfU1NFIHwgWFNUQVRFX1lNTSkpIHsKKwkJcHJfaW5mbygiQVZYIGRldGVjdGVkIGJ1dCB1bnVzYWJsZS5cbiIpOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBzaGExX3Nzc2UzX21vZF9pbml0KHZvaWQpCit7CisJLyogdGVzdCBmb3IgU1NTRTMgZmlyc3QgKi8KKwlpZiAoY3B1X2hhc19zc3NlMykKKwkJc2hhMV90cmFuc2Zvcm1fYXNtID0gc2hhMV90cmFuc2Zvcm1fc3NzZTM7CisKKyNpZmRlZiBTSEExX0VOQUJMRV9BVlhfU1VQUE9SVAorCS8qIGFsbG93IEFWWCB0byBvdmVycmlkZSBTU1NFMywgaXQncyBhIGxpdHRsZSBmYXN0ZXIgKi8KKwlpZiAoYXZ4X3VzYWJsZSgpKQorCQlzaGExX3RyYW5zZm9ybV9hc20gPSBzaGExX3RyYW5zZm9ybV9hdng7CisjZW5kaWYKKworCWlmIChzaGExX3RyYW5zZm9ybV9hc20pIHsKKwkJcHJfaW5mbygiVXNpbmcgJXMgb3B0aW1pemVkIFNIQS0xIGltcGxlbWVudGF0aW9uXG4iLAorCQkgICAgICAgIHNoYTFfdHJhbnNmb3JtX2FzbSA9PSBzaGExX3RyYW5zZm9ybV9zc3NlMyA/ICJTU1NFMyIKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVZYIik7CisJCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfc2hhc2goJmFsZyk7CisJfQorCXByX2luZm8oIk5laXRoZXIgQVZYIG5vciBTU1NFMyBpcyBhdmFpbGFibGUvdXNhYmxlLlxuIik7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNoYTFfc3NzZTNfbW9kX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmYWxnKTsKK30KKworbW9kdWxlX2luaXQoc2hhMV9zc3NlM19tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChzaGExX3Nzc2UzX21vZF9maW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTSEExIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU3VwcGxlbWVudGFsIFNTRTMgYWNjZWxlcmF0ZWQiKTsKKworTU9EVUxFX0FMSUFTKCJzaGExIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC1pNTg2LWFzbV8zMi5TIGIvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2gtaTU4Ni1hc21fMzIuUwppbmRleCA1NzUzMzFjLi42NThhZjRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC1pNTg2LWFzbV8zMi5TCisrKyBiL2FyY2gveDg2L2NyeXB0by90d29maXNoLWk1ODYtYXNtXzMyLlMKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2RlZmluZSBpbl9ibGsgICAgMTIgIC8qIGlucHV0IGJ5dGUgYXJyYXkgYWRkcmVzcyBwYXJhbWV0ZXIqLwogI2RlZmluZSBvdXRfYmxrICAgOCAgLyogb3V0cHV0IGJ5dGUgYXJyYXkgYWRkcmVzcyBwYXJhbWV0ZXIqLwotI2RlZmluZSB0Zm0gICAgICAgNCAgLyogVHdvZmlzaCBjb250ZXh0IHN0cnVjdHVyZSAqLworI2RlZmluZSBjdHggICAgICAgNCAgLyogVHdvZmlzaCBjb250ZXh0IHN0cnVjdHVyZSAqLwogCiAjZGVmaW5lIGFfb2Zmc2V0CTAKICNkZWZpbmUgYl9vZmZzZXQJNApAQCAtMjI5LDggKzIyOSw4IEBACiAJcHVzaCAgICAlZXNpCiAJcHVzaCAgICAlZWRpCiAKLQltb3YJdGZtICsgMTYoJWVzcCksCSVlYnAJLyogYWJ1c2UgdGhlIGJhc2UgcG9pbnRlcjogc2V0IG5ldyBiYXNlIGJvaW50ZXIgdG8gdGhlIGNyeXB0byB0Zm0gKi8KLQlhZGQJJGNyeXB0b190Zm1fY3R4X29mZnNldCwgJWVicAkvKiBjdHggYWRkcmVzcyAqLworCW1vdgljdHggKyAxNiglZXNwKSwJJWVicAkvKiBhYnVzZSB0aGUgYmFzZSBwb2ludGVyOiBzZXQgbmV3IGJhc2UKKwkJCQkJICogcG9pbnRlciB0byB0aGUgY3R4IGFkZHJlc3MgKi8KIAltb3YgICAgIGluX2JsaysxNiglZXNwKSwlZWRpCS8qIGlucHV0IGFkZHJlc3MgaW4gZWRpICovCiAKIAltb3YJKCVlZGkpLAkJJWVheApAQCAtMjg1LDggKzI4NSw4IEBACiAJcHVzaCAgICAlZWRpCiAKIAotCW1vdgl0Zm0gKyAxNiglZXNwKSwJJWVicAkvKiBhYnVzZSB0aGUgYmFzZSBwb2ludGVyOiBzZXQgbmV3IGJhc2UgYm9pbnRlciB0byB0aGUgY3J5cHRvIHRmbSAqLwotCWFkZAkkY3J5cHRvX3RmbV9jdHhfb2Zmc2V0LCAlZWJwCS8qIGN0eCBhZGRyZXNzICovCisJbW92CWN0eCArIDE2KCVlc3ApLAklZWJwCS8qIGFidXNlIHRoZSBiYXNlIHBvaW50ZXI6IHNldCBuZXcgYmFzZQorCQkJCQkgKiBwb2ludGVyIHRvIHRoZSBjdHggYWRkcmVzcyAqLwogCW1vdiAgICAgaW5fYmxrKzE2KCVlc3ApLCVlZGkJLyogaW5wdXQgYWRkcmVzcyBpbiBlZGkgKi8KIAogCW1vdgkoJWVkaSksCQklZWF4CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC14ODZfNjQtYXNtXzY0LTN3YXkuUyBiL2FyY2gveDg2L2NyeXB0by90d29maXNoLXg4Nl82NC1hc21fNjQtM3dheS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMDEyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC14ODZfNjQtYXNtXzY0LTN3YXkuUwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIFR3b2Zpc2ggQ2lwaGVyIDMtd2F5IHBhcmFsbGVsIGFsZ29yaXRobSAoeDg2XzY0KQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKdXNzaSBLaXZpbGlubmEgPGp1c3NpLmtpdmlsaW5uYUBtYm5ldC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNworICogVVNBCisgKgorICovCisKKy5maWxlICJ0d29maXNoLXg4Nl82NC1hc20tM3dheS5TIgorLnRleHQKKworLyogc3RydWN0dXJlIG9mIGNyeXB0byBjb250ZXh0ICovCisjZGVmaW5lIHMwCTAKKyNkZWZpbmUgczEJMTAyNAorI2RlZmluZSBzMgkyMDQ4CisjZGVmaW5lIHMzCTMwNzIKKyNkZWZpbmUgdwk0MDk2CisjZGVmaW5lIGsJNDEyOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAzLXdheSB0d29maXNoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ1RYICVyZGkKKyNkZWZpbmUgUklPICVyZHgKKworI2RlZmluZSBSQUIwICVyYXgKKyNkZWZpbmUgUkFCMSAlcmJ4CisjZGVmaW5lIFJBQjIgJXJjeAorCisjZGVmaW5lIFJBQjBkICVlYXgKKyNkZWZpbmUgUkFCMWQgJWVieAorI2RlZmluZSBSQUIyZCAlZWN4CisKKyNkZWZpbmUgUkFCMGJoICVhaAorI2RlZmluZSBSQUIxYmggJWJoCisjZGVmaW5lIFJBQjJiaCAlY2gKKworI2RlZmluZSBSQUIwYmwgJWFsCisjZGVmaW5lIFJBQjFibCAlYmwKKyNkZWZpbmUgUkFCMmJsICVjbAorCisjZGVmaW5lIFJDRDAgJXI4CisjZGVmaW5lIFJDRDEgJXI5CisjZGVmaW5lIFJDRDIgJXIxMAorCisjZGVmaW5lIFJDRDBkICVyOGQKKyNkZWZpbmUgUkNEMWQgJXI5ZAorI2RlZmluZSBSQ0QyZCAlcjEwZAorCisjZGVmaW5lIFJYMCAlcmJwCisjZGVmaW5lIFJYMSAlcjExCisjZGVmaW5lIFJYMiAlcjEyCisKKyNkZWZpbmUgUlgwZCAlZWJwCisjZGVmaW5lIFJYMWQgJXIxMWQKKyNkZWZpbmUgUlgyZCAlcjEyZAorCisjZGVmaW5lIFJZMCAlcjEzCisjZGVmaW5lIFJZMSAlcjE0CisjZGVmaW5lIFJZMiAlcjE1CisKKyNkZWZpbmUgUlkwZCAlcjEzZAorI2RlZmluZSBSWTFkICVyMTRkCisjZGVmaW5lIFJZMmQgJXIxNWQKKworI2RlZmluZSBSVDAgJXJkeAorI2RlZmluZSBSVDEgJXJzaQorCisjZGVmaW5lIFJUMGQgJWVkeAorI2RlZmluZSBSVDFkICVlc2kKKworI2RlZmluZSBkbzE2Yml0X3Jvcihyb3QsIG9wMSwgb3AyLCBUMCwgVDEsIHRtcDEsIHRtcDIsIGFiLCBkc3QpIFwKKwltb3Z6YmwgYWIgIyMgYmwsCQl0bXAyICMjIGQ7IFwKKwltb3Z6YmwgYWIgIyMgYmgsCQl0bXAxICMjIGQ7IFwKKwlyb3JxICQocm90KSwJCQlhYjsgXAorCW9wMSMjbCBUMChDVFgsIHRtcDIsIDQpLAlkc3QgIyMgZDsgXAorCW9wMiMjbCBUMShDVFgsIHRtcDEsIDQpLAlkc3QgIyMgZDsKKworLyoKKyAqIENvbWJpbmVkIEcxICYgRzIgZnVuY3Rpb24uIFJlb3JkZXJlZCB3aXRoIGhlbHAgb2Ygcm90YXRlcyB0byBoYXZlIG1vdmVzCisgKiBhdCBiZWdpbmluZy4KKyAqLworI2RlZmluZSBnMWcyXzMoYWIsIGNkLCBUeDAsIFR4MSwgVHgyLCBUeDMsIFR5MCwgVHkxLCBUeTIsIFR5MywgeCwgeSkgXAorCS8qIEcxLDEgJiYgRzIsMSAqLyBcCisJZG8xNmJpdF9yb3IoMzIsIG1vdiwgeG9yLCBUeDAsIFR4MSwgUlQwLCB4ICMjIDAsIGFiICMjIDAsIHggIyMgMCk7IFwKKwlkbzE2Yml0X3Jvcig0OCwgbW92LCB4b3IsIFR5MSwgVHkyLCBSVDAsIHkgIyMgMCwgYWIgIyMgMCwgeSAjIyAwKTsgXAorCVwKKwlkbzE2Yml0X3JvcigzMiwgbW92LCB4b3IsIFR4MCwgVHgxLCBSVDAsIHggIyMgMSwgYWIgIyMgMSwgeCAjIyAxKTsgXAorCWRvMTZiaXRfcm9yKDQ4LCBtb3YsIHhvciwgVHkxLCBUeTIsIFJUMCwgeSAjIyAxLCBhYiAjIyAxLCB5ICMjIDEpOyBcCisJXAorCWRvMTZiaXRfcm9yKDMyLCBtb3YsIHhvciwgVHgwLCBUeDEsIFJUMCwgeCAjIyAyLCBhYiAjIyAyLCB4ICMjIDIpOyBcCisJZG8xNmJpdF9yb3IoNDgsIG1vdiwgeG9yLCBUeTEsIFR5MiwgUlQwLCB5ICMjIDIsIGFiICMjIDIsIHkgIyMgMik7IFwKKwlcCisJLyogRzEsMiAmJiBHMiwyICovIFwKKwlkbzE2Yml0X3JvcigzMiwgeG9yLCB4b3IsIFR4MiwgVHgzLCBSVDAsIFJUMSwgYWIgIyMgMCwgeCAjIyAwKTsgXAorCWRvMTZiaXRfcm9yKDE2LCB4b3IsIHhvciwgVHkzLCBUeTAsIFJUMCwgUlQxLCBhYiAjIyAwLCB5ICMjIDApOyBcCisJeGNoZ3EgY2QgIyMgMCwgYWIgIyMgMDsgXAorCVwKKwlkbzE2Yml0X3JvcigzMiwgeG9yLCB4b3IsIFR4MiwgVHgzLCBSVDAsIFJUMSwgYWIgIyMgMSwgeCAjIyAxKTsgXAorCWRvMTZiaXRfcm9yKDE2LCB4b3IsIHhvciwgVHkzLCBUeTAsIFJUMCwgUlQxLCBhYiAjIyAxLCB5ICMjIDEpOyBcCisJeGNoZ3EgY2QgIyMgMSwgYWIgIyMgMTsgXAorCVwKKwlkbzE2Yml0X3JvcigzMiwgeG9yLCB4b3IsIFR4MiwgVHgzLCBSVDAsIFJUMSwgYWIgIyMgMiwgeCAjIyAyKTsgXAorCWRvMTZiaXRfcm9yKDE2LCB4b3IsIHhvciwgVHkzLCBUeTAsIFJUMCwgUlQxLCBhYiAjIyAyLCB5ICMjIDIpOyBcCisJeGNoZ3EgY2QgIyMgMiwgYWIgIyMgMjsKKworI2RlZmluZSBlbmNfcm91bmRfZW5kKGFiLCB4LCB5LCBuKSBcCisJYWRkbCB5ICMjIGQsCQkJeCAjIyBkOyBcCisJYWRkbCB4ICMjIGQsCQkJeSAjIyBkOyBcCisJYWRkbCBrKzQqKDIqKG4pKShDVFgpLAkJeCAjIyBkOyBcCisJeG9ybCBhYiAjIyBkLAkJCXggIyMgZDsgXAorCWFkZGwgays0KigyKihuKSsxKShDVFgpLAl5ICMjIGQ7IFwKKwlzaHJxICQzMiwJCQlhYjsgXAorCXJvbGwgJDEsCQkJYWIgIyMgZDsgXAorCXhvcmwgeSAjIyBkLAkJCWFiICMjIGQ7IFwKKwlzaGxxICQzMiwJCQlhYjsgXAorCXJvcmwgJDEsCQkJeCAjIyBkOyBcCisJb3JxIHgsCQkJCWFiOworCisjZGVmaW5lIGRlY19yb3VuZF9lbmQoYmEsIHgsIHksIG4pIFwKKwlhZGRsIHkgIyMgZCwJCQl4ICMjIGQ7IFwKKwlhZGRsIHggIyMgZCwJCQl5ICMjIGQ7IFwKKwlhZGRsIGsrNCooMioobikpKENUWCksCQl4ICMjIGQ7IFwKKwlhZGRsIGsrNCooMioobikrMSkoQ1RYKSwJeSAjIyBkOyBcCisJeG9ybCBiYSAjIyBkLAkJCXkgIyMgZDsgXAorCXNocnEgJDMyLAkJCWJhOyBcCisJcm9sbCAkMSwJCQliYSAjIyBkOyBcCisJeG9ybCB4ICMjIGQsCQkJYmEgIyMgZDsgXAorCXNobHEgJDMyLAkJCWJhOyBcCisJcm9ybCAkMSwJCQl5ICMjIGQ7IFwKKwlvcnEgeSwJCQkJYmE7CisKKyNkZWZpbmUgZW5jcnlwdF9yb3VuZDMoYWIsIGNkLCBuKSBcCisJZzFnMl8zKGFiLCBjZCwgczAsIHMxLCBzMiwgczMsIHMwLCBzMSwgczIsIHMzLCBSWCwgUlkpOyBcCisJXAorCWVuY19yb3VuZF9lbmQoYWIgIyMgMCwgUlgwLCBSWTAsIG4pOyBcCisJZW5jX3JvdW5kX2VuZChhYiAjIyAxLCBSWDEsIFJZMSwgbik7IFwKKwllbmNfcm91bmRfZW5kKGFiICMjIDIsIFJYMiwgUlkyLCBuKTsKKworI2RlZmluZSBkZWNyeXB0X3JvdW5kMyhiYSwgZGMsIG4pIFwKKwlnMWcyXzMoYmEsIGRjLCBzMSwgczIsIHMzLCBzMCwgczMsIHMwLCBzMSwgczIsIFJZLCBSWCk7IFwKKwlcCisJZGVjX3JvdW5kX2VuZChiYSAjIyAwLCBSWDAsIFJZMCwgbik7IFwKKwlkZWNfcm91bmRfZW5kKGJhICMjIDEsIFJYMSwgUlkxLCBuKTsgXAorCWRlY19yb3VuZF9lbmQoYmEgIyMgMiwgUlgyLCBSWTIsIG4pOworCisjZGVmaW5lIGVuY3J5cHRfY3ljbGUzKGFiLCBjZCwgbikgXAorCWVuY3J5cHRfcm91bmQzKGFiLCBjZCwgbioyKTsgXAorCWVuY3J5cHRfcm91bmQzKGFiLCBjZCwgKG4qMikrMSk7CisKKyNkZWZpbmUgZGVjcnlwdF9jeWNsZTMoYmEsIGRjLCBuKSBcCisJZGVjcnlwdF9yb3VuZDMoYmEsIGRjLCAobioyKSsxKTsgXAorCWRlY3J5cHRfcm91bmQzKGJhLCBkYywgKG4qMikpOworCisjZGVmaW5lIGlucGFjazMoaW4sIG4sIHh5LCBtKSBcCisJbW92cSA0KihuKShpbiksCQkJeHkgIyMgMDsgXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDA7IFwKKwlcCisJbW92cSA0Kig0KyhuKSkoaW4pLAkJeHkgIyMgMTsgXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDE7IFwKKwlcCisJbW92cSA0Kig4KyhuKSkoaW4pLAkJeHkgIyMgMjsgXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDI7CisKKyNkZWZpbmUgb3V0dW5wYWNrMyhvcCwgb3V0LCBuLCB4eSwgbSkgXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDA7IFwKKwlvcCAjIyBxIHh5ICMjIDAsCQk0KihuKShvdXQpOyBcCisJXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDE7IFwKKwlvcCAjIyBxIHh5ICMjIDEsCQk0Kig0KyhuKSkob3V0KTsgXAorCVwKKwl4b3JxIHcrNCptKENUWCksCQl4eSAjIyAyOyBcCisJb3AgIyMgcSB4eSAjIyAyLAkJNCooOCsobikpKG91dCk7CisKKyNkZWZpbmUgaW5wYWNrX2VuYzMoKSBcCisJaW5wYWNrMyhSSU8sIDAsIFJBQiwgMCk7IFwKKwlpbnBhY2szKFJJTywgMiwgUkNELCAyKTsKKworI2RlZmluZSBvdXR1bnBhY2tfZW5jMyhvcCkgXAorCW91dHVucGFjazMob3AsIFJJTywgMiwgUkFCLCA2KTsgXAorCW91dHVucGFjazMob3AsIFJJTywgMCwgUkNELCA0KTsKKworI2RlZmluZSBpbnBhY2tfZGVjMygpIFwKKwlpbnBhY2szKFJJTywgMCwgUkFCLCA0KTsgXAorCXJvcnEgJDMyLAkJCVJBQjA7IFwKKwlyb3JxICQzMiwJCQlSQUIxOyBcCisJcm9ycSAkMzIsCQkJUkFCMjsgXAorCWlucGFjazMoUklPLCAyLCBSQ0QsIDYpOyBcCisJcm9ycSAkMzIsCQkJUkNEMDsgXAorCXJvcnEgJDMyLAkJCVJDRDE7IFwKKwlyb3JxICQzMiwJCQlSQ0QyOworCisjZGVmaW5lIG91dHVucGFja19kZWMzKCkgXAorCXJvcnEgJDMyLAkJCVJDRDA7IFwKKwlyb3JxICQzMiwJCQlSQ0QxOyBcCisJcm9ycSAkMzIsCQkJUkNEMjsgXAorCW91dHVucGFjazMobW92LCBSSU8sIDAsIFJDRCwgMCk7IFwKKwlyb3JxICQzMiwJCQlSQUIwOyBcCisJcm9ycSAkMzIsCQkJUkFCMTsgXAorCXJvcnEgJDMyLAkJCVJBQjI7IFwKKwlvdXR1bnBhY2szKG1vdiwgUklPLCAyLCBSQUIsIDIpOworCisuYWxpZ24gOAorLmdsb2JhbCBfX3R3b2Zpc2hfZW5jX2Jsa18zd2F5CisudHlwZSAgIF9fdHdvZmlzaF9lbmNfYmxrXzN3YXksQGZ1bmN0aW9uOworCitfX3R3b2Zpc2hfZW5jX2Jsa18zd2F5OgorCS8qIGlucHV0OgorCSAqCSVyZGk6IGN0eCwgQ1RYCisJICoJJXJzaTogZHN0CisJICoJJXJkeDogc3JjLCBSSU8KKwkgKgklcmN4OiBib29sLCBpZiB0cnVlOiB4b3Igb3V0cHV0CisJICovCisJcHVzaHEgJXIxNTsKKwlwdXNocSAlcjE0OworCXB1c2hxICVyMTM7CisJcHVzaHEgJXIxMjsKKwlwdXNocSAlcmJwOworCXB1c2hxICVyYng7CisKKwlwdXNocSAlcmN4OyAvKiBib29sIHhvciAqLworCXB1c2hxICVyc2k7IC8qIGRzdCAqLworCisJaW5wYWNrX2VuYzMoKTsKKworCWVuY3J5cHRfY3ljbGUzKFJBQiwgUkNELCAwKTsKKwllbmNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgMSk7CisJZW5jcnlwdF9jeWNsZTMoUkFCLCBSQ0QsIDIpOworCWVuY3J5cHRfY3ljbGUzKFJBQiwgUkNELCAzKTsKKwllbmNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgNCk7CisJZW5jcnlwdF9jeWNsZTMoUkFCLCBSQ0QsIDUpOworCWVuY3J5cHRfY3ljbGUzKFJBQiwgUkNELCA2KTsKKwllbmNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgNyk7CisKKwlwb3BxIFJJTzsgLyogZHN0ICovCisJcG9wcSAlcmJwOyAvKiBib29sIHhvciAqLworCisJdGVzdGIgJWJwbCwgJWJwbDsKKwlqbnogX19lbmNfeG9yMzsKKworCW91dHVucGFja19lbmMzKG1vdik7CisKKwlwb3BxICVyYng7CisJcG9wcSAlcmJwOworCXBvcHEgJXIxMjsKKwlwb3BxICVyMTM7CisJcG9wcSAlcjE0OworCXBvcHEgJXIxNTsKKwlyZXQ7CisKK19fZW5jX3hvcjM6CisJb3V0dW5wYWNrX2VuYzMoeG9yKTsKKworCXBvcHEgJXJieDsKKwlwb3BxICVyYnA7CisJcG9wcSAlcjEyOworCXBvcHEgJXIxMzsKKwlwb3BxICVyMTQ7CisJcG9wcSAlcjE1OworCXJldDsKKworLmdsb2JhbCB0d29maXNoX2RlY19ibGtfM3dheQorLnR5cGUgICB0d29maXNoX2RlY19ibGtfM3dheSxAZnVuY3Rpb247CisKK3R3b2Zpc2hfZGVjX2Jsa18zd2F5OgorCS8qIGlucHV0OgorCSAqCSVyZGk6IGN0eCwgQ1RYCisJICoJJXJzaTogZHN0CisJICoJJXJkeDogc3JjLCBSSU8KKwkgKi8KKwlwdXNocSAlcjE1OworCXB1c2hxICVyMTQ7CisJcHVzaHEgJXIxMzsKKwlwdXNocSAlcjEyOworCXB1c2hxICVyYnA7CisJcHVzaHEgJXJieDsKKworCXB1c2hxICVyc2k7IC8qIGRzdCAqLworCisJaW5wYWNrX2RlYzMoKTsKKworCWRlY3J5cHRfY3ljbGUzKFJBQiwgUkNELCA3KTsKKwlkZWNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgNik7CisJZGVjcnlwdF9jeWNsZTMoUkFCLCBSQ0QsIDUpOworCWRlY3J5cHRfY3ljbGUzKFJBQiwgUkNELCA0KTsKKwlkZWNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgMyk7CisJZGVjcnlwdF9jeWNsZTMoUkFCLCBSQ0QsIDIpOworCWRlY3J5cHRfY3ljbGUzKFJBQiwgUkNELCAxKTsKKwlkZWNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgMCk7CisKKwlwb3BxIFJJTzsgLyogZHN0ICovCisKKwlvdXR1bnBhY2tfZGVjMygpOworCisJcG9wcSAlcmJ4OworCXBvcHEgJXJicDsKKwlwb3BxICVyMTI7CisJcG9wcSAlcjEzOworCXBvcHEgJXIxNDsKKwlwb3BxICVyMTU7CisJcmV0OworCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC14ODZfNjQtYXNtXzY0LlMgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC14ODZfNjQtYXNtXzY0LlMKaW5kZXggNTczYWExMC4uN2JjZjNmYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2gteDg2XzY0LWFzbV82NC5TCisrKyBiL2FyY2gveDg2L2NyeXB0by90d29maXNoLXg4Nl82NC1hc21fNjQuUwpAQCAtMjIxLDEwICsyMjEsOSBAQAogdHdvZmlzaF9lbmNfYmxrOgogCXB1c2hxICAgIFIxCiAKLQkvKiAlcmRpIGNvbnRhaW5zIHRoZSBjcnlwdG8gdGZtIGFkZHJlc3MgKi8KKwkvKiAlcmRpIGNvbnRhaW5zIHRoZSBjdHggYWRkcmVzcyAqLwogCS8qICVyc2kgY29udGFpbnMgdGhlIG91dHB1dCBhZGRyZXNzICovCiAJLyogJXJkeCBjb250YWlucyB0aGUgaW5wdXQgYWRkcmVzcyAqLwotCWFkZAkkY3J5cHRvX3RmbV9jdHhfb2Zmc2V0LCAlcmRpCS8qIHNldCBjdHggYWRkcmVzcyAqLwogCS8qIGN0eCBhZGRyZXNzIGlzIG1vdmVkIHRvIGZyZWUgb25lIG5vbi1yZXggcmVnaXN0ZXIKIAlhcyB0YXJnZXQgZm9yIHRoZSA4Yml0IGhpZ2ggb3BlcmF0aW9ucyAqLwogCW1vdgklcmRpLAkJJXIxMQpAQCAtMjc0LDEwICsyNzMsOSBAQAogdHdvZmlzaF9kZWNfYmxrOgogCXB1c2hxICAgIFIxCiAKLQkvKiAlcmRpIGNvbnRhaW5zIHRoZSBjcnlwdG8gdGZtIGFkZHJlc3MgKi8KKwkvKiAlcmRpIGNvbnRhaW5zIHRoZSBjdHggYWRkcmVzcyAqLwogCS8qICVyc2kgY29udGFpbnMgdGhlIG91dHB1dCBhZGRyZXNzICovCiAJLyogJXJkeCBjb250YWlucyB0aGUgaW5wdXQgYWRkcmVzcyAqLwotCWFkZAkkY3J5cHRvX3RmbV9jdHhfb2Zmc2V0LCAlcmRpCS8qIHNldCBjdHggYWRkcmVzcyAqLwogCS8qIGN0eCBhZGRyZXNzIGlzIG1vdmVkIHRvIGZyZWUgb25lIG5vbi1yZXggcmVnaXN0ZXIKIAlhcyB0YXJnZXQgZm9yIHRoZSA4Yml0IGhpZ2ggb3BlcmF0aW9ucyAqLwogCW1vdgklcmRpLAkJJXIxMQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2hfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2hfZ2x1ZS5jCmluZGV4IGNlZmFmOGIuLmRjNmIzZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by90d29maXNoX2dsdWUuYworKysgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaF9nbHVlLmMKQEAgLTQ0LDE3ICs0NCwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLWFzbWxpbmthZ2Ugdm9pZCB0d29maXNoX2VuY19ibGsoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Ci1hc21saW5rYWdlIHZvaWQgdHdvZmlzaF9kZWNfYmxrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworYXNtbGlua2FnZSB2b2lkIHR3b2Zpc2hfZW5jX2JsayhzdHJ1Y3QgdHdvZmlzaF9jdHggKmN0eCwgdTggKmRzdCwKKwkJCQljb25zdCB1OCAqc3JjKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHR3b2Zpc2hfZW5jX2Jsayk7Cithc21saW5rYWdlIHZvaWQgdHdvZmlzaF9kZWNfYmxrKHN0cnVjdCB0d29maXNoX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCWNvbnN0IHU4ICpzcmMpOworRVhQT1JUX1NZTUJPTF9HUEwodHdvZmlzaF9kZWNfYmxrKTsKIAogc3RhdGljIHZvaWQgdHdvZmlzaF9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0JdHdvZmlzaF9lbmNfYmxrKHRmbSwgZHN0LCBzcmMpOworCXR3b2Zpc2hfZW5jX2JsayhjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIHNyYyk7CiB9CiAKIHN0YXRpYyB2b2lkIHR3b2Zpc2hfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCXR3b2Zpc2hfZGVjX2Jsayh0Zm0sIGRzdCwgc3JjKTsKKwl0d29maXNoX2RlY19ibGsoY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYWxnID0gewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2hfZ2x1ZV8zd2F5LmMgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaF9nbHVlXzN3YXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRlOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2hfZ2x1ZV8zd2F5LmMKQEAgLTAsMCArMSw0NzIgQEAKKy8qCisgKiBHbHVlIENvZGUgZm9yIDMtd2F5IHBhcmFsbGVsIGFzc2VtYmxlciBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBUd29maXNoCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIEp1c3NpIEtpdmlsaW5uYSA8anVzc2kua2l2aWxpbm5hQG1ibmV0LmZpPgorICoKKyAqIENCQyAmIEVDQiBwYXJ0cyBiYXNlZCBvbiBjb2RlIChjcnlwdG8vY2JjLmMsZWNiLmMpIGJ5OgorICogICBDb3B5cmlnaHQgKGMpIDIwMDYgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogQ1RSIHBhcnQgYmFzZWQgb24gY29kZSAoY3J5cHRvL2N0ci5jKSBieToKKyAqICAgKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNyAtIEpveSBMYXR0ZW4gPGxhdHRlbkB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KKyNpbmNsdWRlIDxjcnlwdG8vdHdvZmlzaC5oPgorI2luY2x1ZGUgPGNyeXB0by9iMTI4b3BzLmg+CisKKy8qIHJlZ3VsYXIgYmxvY2sgY2lwaGVyIGZ1bmN0aW9ucyBmcm9tIHR3b2Zpc2hfeDg2XzY0IG1vZHVsZSAqLworYXNtbGlua2FnZSB2b2lkIHR3b2Zpc2hfZW5jX2JsayhzdHJ1Y3QgdHdvZmlzaF9jdHggKmN0eCwgdTggKmRzdCwKKwkJCQljb25zdCB1OCAqc3JjKTsKK2FzbWxpbmthZ2Ugdm9pZCB0d29maXNoX2RlY19ibGsoc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHgsIHU4ICpkc3QsCisJCQkJY29uc3QgdTggKnNyYyk7CisKKy8qIDMtd2F5IHBhcmFsbGVsIGNpcGhlciBmdW5jdGlvbnMgKi8KK2FzbWxpbmthZ2Ugdm9pZCBfX3R3b2Zpc2hfZW5jX2Jsa18zd2F5KHN0cnVjdCB0d29maXNoX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCSAgICAgICBjb25zdCB1OCAqc3JjLCBib29sIHhvcik7Cithc21saW5rYWdlIHZvaWQgdHdvZmlzaF9kZWNfYmxrXzN3YXkoc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHgsIHU4ICpkc3QsCisJCQkJICAgICBjb25zdCB1OCAqc3JjKTsKKworc3RhdGljIGlubGluZSB2b2lkIHR3b2Zpc2hfZW5jX2Jsa18zd2F5KHN0cnVjdCB0d29maXNoX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCQljb25zdCB1OCAqc3JjKQoreworCV9fdHdvZmlzaF9lbmNfYmxrXzN3YXkoY3R4LCBkc3QsIHNyYywgZmFsc2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHdvZmlzaF9lbmNfYmxrX3hvcl8zd2F5KHN0cnVjdCB0d29maXNoX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCQkgICAgY29uc3QgdTggKnNyYykKK3sKKwlfX3R3b2Zpc2hfZW5jX2Jsa18zd2F5KGN0eCwgZHN0LCBzcmMsIHRydWUpOworfQorCitzdGF0aWMgaW50IGVjYl9jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaywKKwkJICAgICB2b2lkICgqZm4pKHN0cnVjdCB0d29maXNoX2N0eCAqLCB1OCAqLCBjb25zdCB1OCAqKSwKKwkJICAgICB2b2lkICgqZm5fM3dheSkoc3RydWN0IHR3b2Zpc2hfY3R4ICosIHU4ICosIGNvbnN0IHU4ICopKQoreworCXN0cnVjdCB0d29maXNoX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgYnNpemUgPSBURl9CTE9DS19TSVpFOworCXVuc2lnbmVkIGludCBuYnl0ZXM7CisJaW50IGVycjsKKworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykpIHsKKwkJdTggKndzcmMgPSB3YWxrLT5zcmMudmlydC5hZGRyOworCQl1OCAqd2RzdCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7CisKKwkJLyogUHJvY2VzcyB0aHJlZSBibG9jayBiYXRjaCAqLworCQlpZiAobmJ5dGVzID49IGJzaXplICogMykgeworCQkJZG8geworCQkJCWZuXzN3YXkoY3R4LCB3ZHN0LCB3c3JjKTsKKworCQkJCXdzcmMgKz0gYnNpemUgKiAzOworCQkJCXdkc3QgKz0gYnNpemUgKiAzOworCQkJCW5ieXRlcyAtPSBic2l6ZSAqIDM7CisJCQl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUgKiAzKTsKKworCQkJaWYgKG5ieXRlcyA8IGJzaXplKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8qIEhhbmRsZSBsZWZ0b3ZlcnMgKi8KKwkJZG8geworCQkJZm4oY3R4LCB3ZHN0LCB3c3JjKTsKKworCQkJd3NyYyArPSBic2l6ZTsKKwkJCXdkc3QgKz0gYnNpemU7CisJCQluYnl0ZXMgLT0gYnNpemU7CisJCX0gd2hpbGUgKG5ieXRlcyA+PSBic2l6ZSk7CisKK2RvbmU6CisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVjYl9lbmNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCXJldHVybiBlY2JfY3J5cHQoZGVzYywgJndhbGssIHR3b2Zpc2hfZW5jX2JsaywgdHdvZmlzaF9lbmNfYmxrXzN3YXkpOworfQorCitzdGF0aWMgaW50IGVjYl9kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCXJldHVybiBlY2JfY3J5cHQoZGVzYywgJndhbGssIHR3b2Zpc2hfZGVjX2JsaywgdHdvZmlzaF9kZWNfYmxrXzN3YXkpOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYmxrX2VjYl9hbGcgPSB7CisJLmNyYV9uYW1lCQk9ICJlY2IodHdvZmlzaCkiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiZWNiLXR3b2Zpc2gtM3dheSIsCisJLmNyYV9wcmlvcml0eQkJPSAzMDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9IFRGX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgdHdvZmlzaF9jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJLmNyYV90eXBlCQk9ICZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCisJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9IExJU1RfSEVBRF9JTklUKGJsa19lY2JfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UgPSB7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJPSBURl9NSU5fS0VZX1NJWkUsCisJCQkubWF4X2tleXNpemUJPSBURl9NQVhfS0VZX1NJWkUsCisJCQkuc2V0a2V5CQk9IHR3b2Zpc2hfc2V0a2V5LAorCQkJLmVuY3J5cHQJPSBlY2JfZW5jcnlwdCwKKwkJCS5kZWNyeXB0CT0gZWNiX2RlY3J5cHQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jYmNfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IFRGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1MTI4ICpzcmMgPSAodTEyOCAqKXdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTEyOCAqZHN0ID0gKHUxMjggKil3YWxrLT5kc3QudmlydC5hZGRyOworCXUxMjggKml2ID0gKHUxMjggKil3YWxrLT5pdjsKKworCWRvIHsKKwkJdTEyOF94b3IoZHN0LCBzcmMsIGl2KTsKKwkJdHdvZmlzaF9lbmNfYmxrKGN0eCwgKHU4ICopZHN0LCAodTggKilkc3QpOworCQlpdiA9IGRzdDsKKworCQlzcmMgKz0gMTsKKwkJZHN0ICs9IDE7CisJCW5ieXRlcyAtPSBic2l6ZTsKKwl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUpOworCisJdTEyOF94b3IoKHUxMjggKil3YWxrLT5pdiwgKHUxMjggKil3YWxrLT5pdiwgaXYpOworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2VuY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCWludCBlcnI7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCW5ieXRlcyA9IF9fY2JjX2VuY3J5cHQoZGVzYywgJndhbGspOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jYmNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IFRGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1MTI4ICpzcmMgPSAodTEyOCAqKXdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTEyOCAqZHN0ID0gKHUxMjggKil3YWxrLT5kc3QudmlydC5hZGRyOworCXUxMjggaXZzWzMgLSAxXTsKKwl1MTI4IGxhc3RfaXY7CisKKwkvKiBTdGFydCBvZiB0aGUgbGFzdCBibG9jay4gKi8KKwlzcmMgKz0gbmJ5dGVzIC8gYnNpemUgLSAxOworCWRzdCArPSBuYnl0ZXMgLyBic2l6ZSAtIDE7CisKKwlsYXN0X2l2ID0gKnNyYzsKKworCS8qIFByb2Nlc3MgdGhyZWUgYmxvY2sgYmF0Y2ggKi8KKwlpZiAobmJ5dGVzID49IGJzaXplICogMykgeworCQlkbyB7CisJCQluYnl0ZXMgLT0gYnNpemUgKiAoMyAtIDEpOworCQkJc3JjIC09IDMgLSAxOworCQkJZHN0IC09IDMgLSAxOworCisJCQlpdnNbMF0gPSBzcmNbMF07CisJCQlpdnNbMV0gPSBzcmNbMV07CisKKwkJCXR3b2Zpc2hfZGVjX2Jsa18zd2F5KGN0eCwgKHU4ICopZHN0LCAodTggKilzcmMpOworCisJCQl1MTI4X3hvcihkc3QgKyAxLCBkc3QgKyAxLCBpdnMgKyAwKTsKKwkJCXUxMjhfeG9yKGRzdCArIDIsIGRzdCArIDIsIGl2cyArIDEpOworCisJCQluYnl0ZXMgLT0gYnNpemU7CisJCQlpZiAobmJ5dGVzIDwgYnNpemUpCisJCQkJZ290byBkb25lOworCisJCQl1MTI4X3hvcihkc3QsIGRzdCwgc3JjIC0gMSk7CisJCQlzcmMgLT0gMTsKKwkJCWRzdCAtPSAxOworCQl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUgKiAzKTsKKworCQlpZiAobmJ5dGVzIDwgYnNpemUpCisJCQlnb3RvIGRvbmU7CisJfQorCisJLyogSGFuZGxlIGxlZnRvdmVycyAqLworCWZvciAoOzspIHsKKwkJdHdvZmlzaF9kZWNfYmxrKGN0eCwgKHU4ICopZHN0LCAodTggKilzcmMpOworCisJCW5ieXRlcyAtPSBic2l6ZTsKKwkJaWYgKG5ieXRlcyA8IGJzaXplKQorCQkJYnJlYWs7CisKKwkJdTEyOF94b3IoZHN0LCBkc3QsIHNyYyAtIDEpOworCQlzcmMgLT0gMTsKKwkJZHN0IC09IDE7CisJfQorCitkb25lOgorCXUxMjhfeG9yKGRzdCwgZHN0LCAodTEyOCAqKXdhbGstPml2KTsKKwkqKHUxMjggKil3YWxrLT5pdiA9IGxhc3RfaXY7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgaW50IGNiY19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKwlpbnQgZXJyOworCisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSkgeworCQluYnl0ZXMgPSBfX2NiY19kZWNyeXB0KGRlc2MsICZ3YWxrKTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgbmJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYmxrX2NiY19hbGcgPSB7CisJLmNyYV9uYW1lCQk9ICJjYmModHdvZmlzaCkiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiY2JjLXR3b2Zpc2gtM3dheSIsCisJLmNyYV9wcmlvcml0eQkJPSAzMDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9IFRGX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgdHdvZmlzaF9jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJLmNyYV90eXBlCQk9ICZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCisJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9IExJU1RfSEVBRF9JTklUKGJsa19jYmNfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UgPSB7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJPSBURl9NSU5fS0VZX1NJWkUsCisJCQkubWF4X2tleXNpemUJPSBURl9NQVhfS0VZX1NJWkUsCisJCQkuaXZzaXplCQk9IFRGX0JMT0NLX1NJWkUsCisJCQkuc2V0a2V5CQk9IHR3b2Zpc2hfc2V0a2V5LAorCQkJLmVuY3J5cHQJPSBjYmNfZW5jcnlwdCwKKwkJCS5kZWNyeXB0CT0gY2JjX2RlY3J5cHQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MTI4X3RvX2JlMTI4KGJlMTI4ICpkc3QsIGNvbnN0IHUxMjggKnNyYykKK3sKKwlkc3QtPmEgPSBjcHVfdG9fYmU2NChzcmMtPmEpOworCWRzdC0+YiA9IGNwdV90b19iZTY0KHNyYy0+Yik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZTEyOF90b191MTI4KHUxMjggKmRzdCwgY29uc3QgYmUxMjggKnNyYykKK3sKKwlkc3QtPmEgPSBiZTY0X3RvX2NwdShzcmMtPmEpOworCWRzdC0+YiA9IGJlNjRfdG9fY3B1KHNyYy0+Yik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MTI4X2luYyh1MTI4ICppKQoreworCWktPmIrKzsKKwlpZiAoIWktPmIpCisJCWktPmErKzsKK30KKworc3RhdGljIHZvaWQgY3RyX2NyeXB0X2ZpbmFsKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJCSAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXU4ICpjdHJibGsgPSB3YWxrLT5pdjsKKwl1OCBrZXlzdHJlYW1bVEZfQkxPQ0tfU0laRV07CisJdTggKnNyYyA9IHdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTggKmRzdCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKworCXR3b2Zpc2hfZW5jX2JsayhjdHgsIGtleXN0cmVhbSwgY3RyYmxrKTsKKwljcnlwdG9feG9yKGtleXN0cmVhbSwgc3JjLCBuYnl0ZXMpOworCW1lbWNweShkc3QsIGtleXN0cmVhbSwgbmJ5dGVzKTsKKworCWNyeXB0b19pbmMoY3RyYmxrLCBURl9CTE9DS19TSVpFKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2N0cl9jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQoreworCXN0cnVjdCB0d29maXNoX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgYnNpemUgPSBURl9CTE9DS19TSVpFOworCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7CisJdTEyOCAqc3JjID0gKHUxMjggKil3YWxrLT5zcmMudmlydC5hZGRyOworCXUxMjggKmRzdCA9ICh1MTI4ICopd2Fsay0+ZHN0LnZpcnQuYWRkcjsKKwl1MTI4IGN0cmJsazsKKwliZTEyOCBjdHJibG9ja3NbM107CisKKwliZTEyOF90b191MTI4KCZjdHJibGssIChiZTEyOCAqKXdhbGstPml2KTsKKworCS8qIFByb2Nlc3MgdGhyZWUgYmxvY2sgYmF0Y2ggKi8KKwlpZiAobmJ5dGVzID49IGJzaXplICogMykgeworCQlkbyB7CisJCQlpZiAoZHN0ICE9IHNyYykgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJZHN0WzJdID0gc3JjWzJdOworCQkJfQorCisJCQkvKiBjcmVhdGUgY3RyYmxrcyBmb3IgcGFyYWxsZWwgZW5jcnlwdCAqLworCQkJdTEyOF90b19iZTEyOCgmY3RyYmxvY2tzWzBdLCAmY3RyYmxrKTsKKwkJCXUxMjhfaW5jKCZjdHJibGspOworCQkJdTEyOF90b19iZTEyOCgmY3RyYmxvY2tzWzFdLCAmY3RyYmxrKTsKKwkJCXUxMjhfaW5jKCZjdHJibGspOworCQkJdTEyOF90b19iZTEyOCgmY3RyYmxvY2tzWzJdLCAmY3RyYmxrKTsKKwkJCXUxMjhfaW5jKCZjdHJibGspOworCisJCQl0d29maXNoX2VuY19ibGtfeG9yXzN3YXkoY3R4LCAodTggKilkc3QsCisJCQkJCQkgKHU4ICopY3RyYmxvY2tzKTsKKworCQkJc3JjICs9IDM7CisJCQlkc3QgKz0gMzsKKwkJCW5ieXRlcyAtPSBic2l6ZSAqIDM7CisJCX0gd2hpbGUgKG5ieXRlcyA+PSBic2l6ZSAqIDMpOworCisJCWlmIChuYnl0ZXMgPCBic2l6ZSkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBIYW5kbGUgbGVmdG92ZXJzICovCisJZG8geworCQlpZiAoZHN0ICE9IHNyYykKKwkJCSpkc3QgPSAqc3JjOworCisJCXUxMjhfdG9fYmUxMjgoJmN0cmJsb2Nrc1swXSwgJmN0cmJsayk7CisJCXUxMjhfaW5jKCZjdHJibGspOworCisJCXR3b2Zpc2hfZW5jX2JsayhjdHgsICh1OCAqKWN0cmJsb2NrcywgKHU4ICopY3RyYmxvY2tzKTsKKwkJdTEyOF94b3IoZHN0LCBkc3QsICh1MTI4ICopY3RyYmxvY2tzKTsKKworCQlzcmMgKz0gMTsKKwkJZHN0ICs9IDE7CisJCW5ieXRlcyAtPSBic2l6ZTsKKwl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUpOworCitkb25lOgorCXUxMjhfdG9fYmUxMjgoKGJlMTI4ICopd2Fsay0+aXYsICZjdHJibGspOworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY3RyX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJaW50IGVycjsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgJndhbGssIFRGX0JMT0NLX1NJWkUpOworCisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLm5ieXRlcykgPj0gVEZfQkxPQ0tfU0laRSkgeworCQluYnl0ZXMgPSBfX2N0cl9jcnlwdChkZXNjLCAmd2Fsayk7CisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssIG5ieXRlcyk7CisJfQorCisJaWYgKHdhbGsubmJ5dGVzKSB7CisJCWN0cl9jcnlwdF9maW5hbChkZXNjLCAmd2Fsayk7CisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssIDApOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBibGtfY3RyX2FsZyA9IHsKKwkuY3JhX25hbWUJCT0gImN0cih0d29maXNoKSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9ICJjdHItdHdvZmlzaC0zd2F5IiwKKwkuY3JhX3ByaW9yaXR5CQk9IDMwMCwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0gMSwKKwkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCB0d29maXNoX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0gMCwKKwkuY3JhX3R5cGUJCT0gJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0gTElTVF9IRUFEX0lOSVQoYmxrX2N0cl9hbGcuY3JhX2xpc3QpLAorCS5jcmFfdSA9IHsKKwkJLmJsa2NpcGhlciA9IHsKKwkJCS5taW5fa2V5c2l6ZQk9IFRGX01JTl9LRVlfU0laRSwKKwkJCS5tYXhfa2V5c2l6ZQk9IFRGX01BWF9LRVlfU0laRSwKKwkJCS5pdnNpemUJCT0gVEZfQkxPQ0tfU0laRSwKKwkJCS5zZXRrZXkJCT0gdHdvZmlzaF9zZXRrZXksCisJCQkuZW5jcnlwdAk9IGN0cl9jcnlwdCwKKwkJCS5kZWNyeXB0CT0gY3RyX2NyeXB0LAorCQl9LAorCX0sCit9OworCitpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYmxrX2VjYl9hbGcpOworCWlmIChlcnIpCisJCWdvdG8gZWNiX2VycjsKKwllcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZibGtfY2JjX2FsZyk7CisJaWYgKGVycikKKwkJZ290byBjYmNfZXJyOworCWVyciA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmJsa19jdHJfYWxnKTsKKwlpZiAoZXJyKQorCQlnb3RvIGN0cl9lcnI7CisKKwlyZXR1cm4gMDsKKworY3RyX2VycjoKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19jYmNfYWxnKTsKK2NiY19lcnI6CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfZWNiX2FsZyk7CitlY2JfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19jdHJfYWxnKTsKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19jYmNfYWxnKTsKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19lY2JfYWxnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUd29maXNoIENpcGhlciBBbGdvcml0aG0sIDMtd2F5IHBhcmFsbGVsIGFzbSBvcHRpbWl6ZWQiKTsKK01PRFVMRV9BTElBUygidHdvZmlzaCIpOworTU9EVUxFX0FMSUFTKCJ0d29maXNoLWFzbSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUyBiL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKaW5kZXggNTRlZGIyMDcuLmE2MjUzZWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKKysrIGIvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUwpAQCAtODUwLDQgKzg1MCw2IEBACiAJLnF1YWQgc3lzX3N5bmNmcwogCS5xdWFkIGNvbXBhdF9zeXNfc2VuZG1tc2cJLyogMzQ1ICovCiAJLnF1YWQgc3lzX3NldG5zCisJLnF1YWQgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3JlYWR2CisJLnF1YWQgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldgogaWEzMl9zeXNjYWxsX2VuZDoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9uYi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKaW5kZXggNjdmODdmMi4uOGU0MTA3MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKQEAgLTE5LDkgKzE5LDE1IEBACiBleHRlcm4gaW50IGFtZF9nZXRfc3ViY2FjaGVzKGludCk7CiBleHRlcm4gaW50IGFtZF9zZXRfc3ViY2FjaGVzKGludCwgaW50KTsKIAorc3RydWN0IGFtZF9sM19jYWNoZSB7CisJdW5zaWduZWQgaW5kaWNlczsKKwl1OAkgc3ViY2FjaGVzWzRdOworfTsKKwogc3RydWN0IGFtZF9ub3J0aGJyaWRnZSB7CiAJc3RydWN0IHBjaV9kZXYgKm1pc2M7CiAJc3RydWN0IHBjaV9kZXYgKmxpbms7CisJc3RydWN0IGFtZF9sM19jYWNoZSBsM19jYWNoZTsKIH07CiAKIHN0cnVjdCBhbWRfbm9ydGhicmlkZ2VfaW5mbyB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljZGVmLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljZGVmLmgKaW5kZXggMzQ1OTVkNS4uMzkyNWQ4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpY2RlZi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWNkZWYuaApAQCAtMTAwLDcgKzEwMCw5IEBACiAjZGVmaW5lCQlBUElDX1RJTUVSX0JBU0VfQ0xLSU4JCTB4MAogI2RlZmluZQkJQVBJQ19USU1FUl9CQVNFX1RNQkFTRQkJMHgxCiAjZGVmaW5lCQlBUElDX1RJTUVSX0JBU0VfRElWCQkweDIKKyNkZWZpbmUJCUFQSUNfTFZUX1RJTUVSX09ORVNIT1QJCSgwIDw8IDE3KQogI2RlZmluZQkJQVBJQ19MVlRfVElNRVJfUEVSSU9ESUMJCSgxIDw8IDE3KQorI2RlZmluZQkJQVBJQ19MVlRfVElNRVJfVFNDREVBRExJTkUJKDIgPDwgMTcpCiAjZGVmaW5lCQlBUElDX0xWVF9NQVNLRUQJCQkoMSA8PCAxNikKICNkZWZpbmUJCUFQSUNfTFZUX0xFVkVMX1RSSUdHRVIJCSgxIDw8IDE1KQogI2RlZmluZQkJQVBJQ19MVlRfUkVNT1RFX0lSUgkJKDEgPDwgMTQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcmNocmFuZG9tLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcmNocmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZWM3NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FyY2hyYW5kb20uaApAQCAtMCwwICsxLDc1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3JzOiBGZW5naHVhIFl1IDxmZW5naHVhLnl1QGludGVsLmNvbT4sCisgKiAgICAgICAgICBILiBQZXRlciBBbnZpbiA8aHBhQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEFTTV9YODZfQVJDSFJBTkRPTV9ICisjZGVmaW5lIEFTTV9YODZfQVJDSFJBTkRPTV9ICisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4KKyNpbmNsdWRlIDxhc20vbm9wcy5oPgorCisjZGVmaW5lIFJEUkFORF9SRVRSWV9MT09QUwkxMAorCisjZGVmaW5lIFJEUkFORF9JTlQJIi5ieXRlIDB4MGYsMHhjNywweGYwIgorI2lmZGVmIENPTkZJR19YODZfNjQKKyMgZGVmaW5lIFJEUkFORF9MT05HCSIuYnl0ZSAweDQ4LDB4MGYsMHhjNywweGYwIgorI2Vsc2UKKyMgZGVmaW5lIFJEUkFORF9MT05HCVJEUkFORF9JTlQKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfUkFORE9NCisKKyNkZWZpbmUgR0VUX1JBTkRPTShuYW1lLCB0eXBlLCByZHJhbmQsIG5vcCkJCQlcCitzdGF0aWMgaW5saW5lIGludCBuYW1lKHR5cGUgKnYpCQkJCQlcCit7CQkJCQkJCQlcCisJaW50IG9rOwkJCQkJCQlcCisJYWx0ZXJuYXRpdmVfaW8oIm1vdmwgJDAsICUwXG5cdCIJCQlcCisJCSAgICAgICBub3AsCQkJCQlcCisJCSAgICAgICAiXG4xOiAiIHJkcmFuZCAiXG5cdCIJCQlcCisJCSAgICAgICAiamMgMmZcblx0IgkJCQlcCisJCSAgICAgICAiZGVjbCAlMFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgICAgICJqbnogMWJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICAgICAgIjI6IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAgICAgICBYODZfRkVBVFVSRV9SRFJBTkQsICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgICAgIEFTTV9PVVRQVVQyKCI9ciIgKG9rKSwgIj1hIiAoKnYpKSwgICAgICAgXAorCQkgICAgICAgIjAiIChSRFJBTkRfUkVUUllfTE9PUFMpKTsJCVwKKwlyZXR1cm4gb2s7CQkJCQkJXAorfQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCitHRVRfUkFORE9NKGFyY2hfZ2V0X3JhbmRvbV9sb25nLCB1bnNpZ25lZCBsb25nLCBSRFJBTkRfTE9ORywgQVNNX05PUDUpOworR0VUX1JBTkRPTShhcmNoX2dldF9yYW5kb21faW50LCB1bnNpZ25lZCBpbnQsIFJEUkFORF9JTlQsIEFTTV9OT1A0KTsKKworI2Vsc2UKKworR0VUX1JBTkRPTShhcmNoX2dldF9yYW5kb21fbG9uZywgdW5zaWduZWQgbG9uZywgUkRSQU5EX0xPTkcsIEFTTV9OT1AzKTsKK0dFVF9SQU5ET00oYXJjaF9nZXRfcmFuZG9tX2ludCwgdW5zaWduZWQgaW50LCBSRFJBTkRfSU5ULCBBU01fTk9QMyk7CisKKyNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCisKKyNlbmRpZiAgLyogQ09ORklHX0FSQ0hfUkFORE9NICovCisKK2V4dGVybiB2b2lkIHg4Nl9pbml0X3JkcmFuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworCisjZW5kaWYgLyogQVNNX1g4Nl9BUkNIUkFORE9NX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggMTA1NzJlMy4uNThjYjZkNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE3MiwxOCArMTcyLDE0IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKIHsKLQlpbnQgX19pOwogI2lmZGVmIENPTkZJR19NMzg2CisJaW50IF9faTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWlmICh1bmxpa2VseShib290X2NwdV9kYXRhLng4NiA8PSAzKSkKIAkJZ290byBub194YWRkOwogI2VuZGlmCiAJLyogTW9kZXJuIDQ4NisgcHJvY2Vzc29yICovCi0JX19pID0gaTsKLQlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggInhhZGRsICUwLCAlMSIKLQkJICAgICA6ICIrciIgKGkpLCAiK20iICh2LT5jb3VudGVyKQotCQkgICAgIDogOiAibWVtb3J5Iik7Ci0JcmV0dXJuIGkgKyBfX2k7CisJcmV0dXJuIGkgKyB4YWRkKCZ2LT5jb3VudGVyLCBpKTsKIAogI2lmZGVmIENPTkZJR19NMzg2CiBub194YWRkOiAvKiBMZWdhY3kgMzg2IHByb2Nlc3NvciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljNjRfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pYzY0XzY0LmgKaW5kZXggMDE3NTk0ZC4uMGUxY2JmYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljNjRfNjQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWM2NF82NC5oCkBAIC0xNzAsMTEgKzE3MCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgbG9uZyBhdG9taWM2NF9hZGRfcmV0dXJuKGxvbmcgaSwgYXRvbWljNjRfdCAqdikKIHsKLQlsb25nIF9faSA9IGk7Ci0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICJ4YWRkcSAlMCwgJTE7IgotCQkgICAgIDogIityIiAoaSksICIrbSIgKHYtPmNvdW50ZXIpCi0JCSAgICAgOiA6ICJtZW1vcnkiKTsKLQlyZXR1cm4gaSArIF9faTsKKwlyZXR1cm4gaSArIHhhZGQoJnYtPmNvdW50ZXIsIGkpOwogfQogCiBzdGF0aWMgaW5saW5lIGxvbmcgYXRvbWljNjRfc3ViX3JldHVybihsb25nIGksIGF0b21pYzY0X3QgKnYpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKaW5kZXggYTQ2MGZhMC4uNWQzYWNkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGcuaApAQCAtMSw1ICsxLDIxMCBAQAorI2lmbmRlZiBBU01fWDg2X0NNUFhDSEdfSAorI2RlZmluZSBBU01fWDg2X0NNUFhDSEdfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4gLyogUHJvdmlkZXMgTE9DS19QUkVGSVggKi8KKworLyoKKyAqIE5vbi1leGlzdGFudCBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgdXNhZ2UgZXJyb3JzIGF0IGxpbmsgdGltZQorICogKG9yIGNvbXBpbGUtdGltZSBpZiB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBfX2NvbXBpbGV0aW1lX2Vycm9yKCkuCisgKi8KK2V4dGVybiB2b2lkIF9feGNoZ193cm9uZ19zaXplKHZvaWQpCisJX19jb21waWxldGltZV9lcnJvcigiQmFkIGFyZ3VtZW50IHNpemUgZm9yIHhjaGciKTsKK2V4dGVybiB2b2lkIF9fY21weGNoZ193cm9uZ19zaXplKHZvaWQpCisJX19jb21waWxldGltZV9lcnJvcigiQmFkIGFyZ3VtZW50IHNpemUgZm9yIGNtcHhjaGciKTsKK2V4dGVybiB2b2lkIF9feGFkZF93cm9uZ19zaXplKHZvaWQpCisJX19jb21waWxldGltZV9lcnJvcigiQmFkIGFyZ3VtZW50IHNpemUgZm9yIHhhZGQiKTsKKworLyoKKyAqIENvbnN0YW50cyBmb3Igb3BlcmF0aW9uIHNpemVzLiBPbiAzMi1iaXQsIHRoZSA2NC1iaXQgc2l6ZSBpdCBzZXQgdG8KKyAqIC0xIGJlY2F1c2Ugc2l6ZW9mIHdpbGwgbmV2ZXIgcmV0dXJuIC0xLCB0aGVyZWJ5IG1ha2luZyB0aG9zZSBzd2l0Y2gKKyAqIGNhc2Ugc3RhdGVtZW50cyBndWFyYW50ZWVlZCBkZWFkIGNvZGUgd2hpY2ggdGhlIGNvbXBpbGVyIHdpbGwKKyAqIGVsaW1pbmF0ZSwgYW5kIGFsbG93aW5nIHRoZSAibWlzc2luZyBzeW1ib2wgaW4gdGhlIGRlZmF1bHQgY2FzZSIgdG8KKyAqIGluZGljYXRlIGEgdXNhZ2UgZXJyb3IuCisgKi8KKyNkZWZpbmUgX19YODZfQ0FTRV9CCTEKKyNkZWZpbmUgX19YODZfQ0FTRV9XCTIKKyNkZWZpbmUgX19YODZfQ0FTRV9MCTQKKyNpZmRlZiBDT05GSUdfNjRCSVQKKyNkZWZpbmUgX19YODZfQ0FTRV9RCTgKKyNlbHNlCisjZGVmaW5lCV9fWDg2X0NBU0VfUQktMQkJLyogc2l6ZW9mIHdpbGwgbmV2ZXIgcmV0dXJuIC0xICovCisjZW5kaWYKKworLyoKKyAqIE5vdGU6IG5vICJsb2NrIiBwcmVmaXggZXZlbiBvbiBTTVA6IHhjaGcgYWx3YXlzIGltcGxpZXMgbG9jayBhbnl3YXkuCisgKiBTaW5jZSB0aGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIHByb3RlY3Qgb3RoZXIgbWVtb3J5IGluZm9ybWF0aW9uLCB3ZQorICogdXNlICJhc20gdm9sYXRpbGUiIGFuZCAibWVtb3J5IiBjbG9iYmVycyB0byBwcmV2ZW50IGdjYyBmcm9tIG1vdmluZworICogaW5mb3JtYXRpb24gYXJvdW5kLgorICovCisjZGVmaW5lIF9feGNoZyh4LCBwdHIsIHNpemUpCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJX190eXBlb2YoKihwdHIpKSBfX3ggPSAoeCk7CQkJCQlcCisJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKKwljYXNlIF9fWDg2X0NBU0VfQjoJCQkJCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1OCAqX19wdHIgPSAodm9sYXRpbGUgdTggKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKCJ4Y2hnYiAlMCwlMSIJCQkJXAorCQkJICAgICA6ICI9cSIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAorCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwljYXNlIF9fWDg2X0NBU0VfVzoJCQkJCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1MTYgKl9fcHRyID0gKHZvbGF0aWxlIHUxNiAqKShwdHIpOwkJXAorCQlhc20gdm9sYXRpbGUoInhjaGd3ICUwLCUxIgkJCQlcCisJCQkgICAgIDogIj1yIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAorCQkJICAgICA6ICIwIiAoX194KQkJCQlcCisJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWNhc2UgX19YODZfQ0FTRV9MOgkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCXZvbGF0aWxlIHUzMiAqX19wdHIgPSAodm9sYXRpbGUgdTMyICopKHB0cik7CQlcCisJCWFzbSB2b2xhdGlsZSgieGNoZ2wgJTAsJTEiCQkJCVwKKwkJCSAgICAgOiAiPXIiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogIjAiIChfX3gpCQkJCVwKKwkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJY2FzZSBfX1g4Nl9DQVNFX1E6CQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTY0ICpfX3B0ciA9ICh2b2xhdGlsZSB1NjQgKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKCJ4Y2hncSAlMCwlMSIJCQkJXAorCQkJICAgICA6ICI9ciIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAorCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlkZWZhdWx0OgkJCQkJCQlcCisJCV9feGNoZ193cm9uZ19zaXplKCk7CQkJCQlcCisJfQkJCQkJCQkJXAorCV9feDsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgeGNoZyhwdHIsIHYpCQkJCQkJCVwKKwlfX3hjaGcoKHYpLCAocHRyKSwgc2l6ZW9mKCpwdHIpKQorCisvKgorICogQXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgQ29tcGFyZSBPTEQgd2l0aCBNRU0sIGlmIGlkZW50aWNhbCwKKyAqIHN0b3JlIE5FVyBpbiBNRU0uICBSZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgaW4gTUVNLiAgU3VjY2VzcyBpcworICogaW5kaWNhdGVkIGJ5IGNvbXBhcmluZyBSRVRVUk4gd2l0aCBPTEQuCisgKi8KKyNkZWZpbmUgX19yYXdfY21weGNoZyhwdHIsIG9sZCwgbmV3LCBzaXplLCBsb2NrKQkJCVwKKyh7CQkJCQkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX3JldDsJCQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19vbGQgPSAob2xkKTsJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldyA9IChuZXcpOwkJCQlcCisJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKKwljYXNlIF9fWDg2X0NBU0VfQjoJCQkJCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1OCAqX19wdHIgPSAodm9sYXRpbGUgdTggKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGdiICUyLCUxIgkJCVwKKwkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAicSIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCisJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWNhc2UgX19YODZfQ0FTRV9XOgkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCXZvbGF0aWxlIHUxNiAqX19wdHIgPSAodm9sYXRpbGUgdTE2ICopKHB0cik7CQlcCisJCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hndyAlMiwlMSIJCQlcCisJCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogInIiIChfX25ldyksICIwIiAoX19vbGQpCQkJXAorCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1MzIgKl9fcHRyID0gKHZvbGF0aWxlIHUzMiAqKShwdHIpOwkJXAorCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ2wgJTIsJTEiCQkJXAorCQkJICAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAoKl9fcHRyKQkJXAorCQkJICAgICA6ICJyIiAoX19uZXcpLCAiMCIgKF9fb2xkKQkJCVwKKwkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJY2FzZSBfX1g4Nl9DQVNFX1E6CQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTY0ICpfX3B0ciA9ICh2b2xhdGlsZSB1NjQgKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGdxICUyLCUxIgkJCVwKKwkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiciIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCisJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWRlZmF1bHQ6CQkJCQkJCVwKKwkJX19jbXB4Y2hnX3dyb25nX3NpemUoKTsJCQkJCVwKKwl9CQkJCQkJCQlcCisJX19yZXQ7CQkJCQkJCQlcCit9KQorCisjZGVmaW5lIF9fY21weGNoZyhwdHIsIG9sZCwgbmV3LCBzaXplKQkJCQkJXAorCV9fcmF3X2NtcHhjaGcoKHB0ciksIChvbGQpLCAobmV3KSwgKHNpemUpLCBMT0NLX1BSRUZJWCkKKworI2RlZmluZSBfX3N5bmNfY21weGNoZyhwdHIsIG9sZCwgbmV3LCBzaXplKQkJCQlcCisJX19yYXdfY21weGNoZygocHRyKSwgKG9sZCksIChuZXcpLCAoc2l6ZSksICJsb2NrOyAiKQorCisjZGVmaW5lIF9fY21weGNoZ19sb2NhbChwdHIsIG9sZCwgbmV3LCBzaXplKQkJCQlcCisJX19yYXdfY21weGNoZygocHRyKSwgKG9sZCksIChuZXcpLCAoc2l6ZSksICIiKQorCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogIyBpbmNsdWRlICJjbXB4Y2hnXzMyLmgiCiAjZWxzZQogIyBpbmNsdWRlICJjbXB4Y2hnXzY0LmgiCiAjZW5kaWYKKworI2lmZGVmIF9fSEFWRV9BUkNIX0NNUFhDSEcKKyNkZWZpbmUgY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJCVwKKwlfX2NtcHhjaGcoKHB0ciksIChvbGQpLCAobmV3KSwgc2l6ZW9mKCpwdHIpKQorCisjZGVmaW5lIHN5bmNfY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJXAorCV9fc3luY19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKKworI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcpCQkJCQlcCisJX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKKyNlbmRpZgorCisjZGVmaW5lIF9feGFkZChwdHIsIGluYywgbG9jaykJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkgICAgICAgIF9fdHlwZW9mX18gKCoocHRyKSkgX19yZXQgPSAoaW5jKTsJCQlcCisJCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfQjoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAieGFkZGIgJWIwLCAlMVxuIgkJXAorCQkJCSAgICAgIDogIityIiAoX19yZXQpLCAiK20iICgqKHB0cikpCVwKKwkJCQkgICAgICA6IDogIm1lbW9yeSIsICJjYyIpOwkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfVzoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAieGFkZHcgJXcwLCAlMVxuIgkJXAorCQkJCSAgICAgIDogIityIiAoX19yZXQpLCAiK20iICgqKHB0cikpCVwKKwkJCQkgICAgICA6IDogIm1lbW9yeSIsICJjYyIpOwkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAieGFkZGwgJTAsICUxXG4iCQlcCisJCQkJICAgICAgOiAiK3IiIChfX3JldCksICIrbSIgKCoocHRyKSkJXAorCQkJCSAgICAgIDogOiAibWVtb3J5IiwgImNjIik7CQlcCisJCQlicmVhazsJCQkJCQlcCisJCWNhc2UgX19YODZfQ0FTRV9ROgkJCQkJXAorCQkJYXNtIHZvbGF0aWxlIChsb2NrICJ4YWRkcSAlcTAsICUxXG4iCQlcCisJCQkJICAgICAgOiAiK3IiIChfX3JldCksICIrbSIgKCoocHRyKSkJXAorCQkJCSAgICAgIDogOiAibWVtb3J5IiwgImNjIik7CQlcCisJCQlicmVhazsJCQkJCQlcCisJCWRlZmF1bHQ6CQkJCQkJXAorCQkJX194YWRkX3dyb25nX3NpemUoKTsJCQkJXAorCQl9CQkJCQkJCVwKKwkJX19yZXQ7CQkJCQkJCVwKKwl9KQorCisvKgorICogeGFkZCgpIGFkZHMgImluYyIgdG8gIipwdHIiIGFuZCBhdG9taWNhbGx5IHJldHVybnMgdGhlIHByZXZpb3VzCisgKiB2YWx1ZSBvZiAiKnB0ciIuCisgKgorICogeGFkZCgpIGlzIGxvY2tlZCB3aGVuIG11bHRpcGxlIENQVXMgYXJlIG9ubGluZQorICogeGFkZF9zeW5jKCkgaXMgYWx3YXlzIGxvY2tlZAorICogeGFkZF9sb2NhbCgpIGlzIG5ldmVyIGxvY2tlZAorICovCisjZGVmaW5lIHhhZGQocHRyLCBpbmMpCQlfX3hhZGQoKHB0ciksIChpbmMpLCBMT0NLX1BSRUZJWCkKKyNkZWZpbmUgeGFkZF9zeW5jKHB0ciwgaW5jKQlfX3hhZGQoKHB0ciksIChpbmMpLCAibG9jazsgIikKKyNkZWZpbmUgeGFkZF9sb2NhbChwdHIsIGluYykJX194YWRkKChwdHIpLCAoaW5jKSwgIiIpCisKKyNlbmRpZgkvKiBBU01fWDg2X0NNUFhDSEdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ18zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ18zMi5oCmluZGV4IDNkZWI3MjUuLmZiZWJiMDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfMzIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzMyLmgKQEAgLTEsNjEgKzEsMTEgQEAKICNpZm5kZWYgX0FTTV9YODZfQ01QWENIR18zMl9ICiAjZGVmaW5lIF9BU01fWDg2X0NNUFhDSEdfMzJfSAogCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+IC8qIGZvciBMT0NLX1BSRUZJWCAqLwotCiAvKgogICogTm90ZTogaWYgeW91IHVzZSBzZXQ2NF9iaXQoKSwgX19jbXB4Y2hnNjQoKSwgb3IgdGhlaXIgdmFyaWFudHMsIHlvdQogICogICAgICAgeW91IG5lZWQgdG8gdGVzdCBmb3IgdGhlIGZlYXR1cmUgaW4gYm9vdF9jcHVfZGF0YS4KICAqLwogCi1leHRlcm4gdm9pZCBfX3hjaGdfd3Jvbmdfc2l6ZSh2b2lkKTsKLQotLyoKLSAqIE5vdGU6IG5vICJsb2NrIiBwcmVmaXggZXZlbiBvbiBTTVA6IHhjaGcgYWx3YXlzIGltcGxpZXMgbG9jayBhbnl3YXkuCi0gKiBTaW5jZSB0aGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIHByb3RlY3Qgb3RoZXIgbWVtb3J5IGluZm9ybWF0aW9uLCB3ZQotICogdXNlICJhc20gdm9sYXRpbGUiIGFuZCAibWVtb3J5IiBjbG9iYmVycyB0byBwcmV2ZW50IGdjYyBmcm9tIG1vdmluZwotICogaW5mb3JtYXRpb24gYXJvdW5kLgotICovCi0jZGVmaW5lIF9feGNoZyh4LCBwdHIsIHNpemUpCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JX190eXBlb2YoKihwdHIpKSBfX3ggPSAoeCk7CQkJCQlcCi0Jc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKLQljYXNlIDE6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1OCAqX19wdHIgPSAodm9sYXRpbGUgdTggKikocHRyKTsJCVwKLQkJYXNtIHZvbGF0aWxlKCJ4Y2hnYiAlMCwlMSIJCQkJXAotCQkJICAgICA6ICI9cSIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKLQkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAotCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQljYXNlIDI6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1MTYgKl9fcHRyID0gKHZvbGF0aWxlIHUxNiAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUoInhjaGd3ICUwLCUxIgkJCQlcCi0JCQkgICAgIDogIj1yIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICIwIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWNhc2UgNDoJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHUzMiAqX19wdHIgPSAodm9sYXRpbGUgdTMyICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZSgieGNoZ2wgJTAsJTEiCQkJCVwKLQkJCSAgICAgOiAiPXIiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogIjAiIChfX3gpCQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JZGVmYXVsdDoJCQkJCQkJXAotCQlfX3hjaGdfd3Jvbmdfc2l6ZSgpOwkJCQkJXAotCX0JCQkJCQkJCVwKLQlfX3g7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIHhjaGcocHRyLCB2KQkJCQkJCQlcCi0JX194Y2hnKCh2KSwgKHB0ciksIHNpemVvZigqcHRyKSkKLQogLyoKICAqIENNUFhDSEc4QiBvbmx5IHdyaXRlcyB0byB0aGUgdGFyZ2V0IGlmIHdlIGhhZCB0aGUgcHJldmlvdXMKICAqIHZhbHVlIGluIHJlZ2lzdGVycywgb3RoZXJ3aXNlIGl0IGFjdHMgYXMgYSByZWFkIGFuZCBnaXZlcyB1cyB0aGUKQEAgLTg0LDcyICszNCw4IEBACiAJCSAgICAgOiAibWVtb3J5Iik7CiB9CiAKLWV4dGVybiB2b2lkIF9fY21weGNoZ193cm9uZ19zaXplKHZvaWQpOwotCi0vKgotICogQXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgQ29tcGFyZSBPTEQgd2l0aCBNRU0sIGlmIGlkZW50aWNhbCwKLSAqIHN0b3JlIE5FVyBpbiBNRU0uICBSZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgaW4gTUVNLiAgU3VjY2VzcyBpcwotICogaW5kaWNhdGVkIGJ5IGNvbXBhcmluZyBSRVRVUk4gd2l0aCBPTEQuCi0gKi8KLSNkZWZpbmUgX19yYXdfY21weGNoZyhwdHIsIG9sZCwgbmV3LCBzaXplLCBsb2NrKQkJCVwKLSh7CQkJCQkJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX3JldDsJCQkJCVwKLQlfX3R5cGVvZl9fKCoocHRyKSkgX19vbGQgPSAob2xkKTsJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldyA9IChuZXcpOwkJCQlcCi0Jc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKLQljYXNlIDE6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1OCAqX19wdHIgPSAodm9sYXRpbGUgdTggKikocHRyKTsJCVwKLQkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGdiICUyLCUxIgkJCVwKLQkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKLQkJCSAgICAgOiAicSIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWNhc2UgMjoJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHUxNiAqX19wdHIgPSAodm9sYXRpbGUgdTE2ICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hndyAlMiwlMSIJCQlcCi0JCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogInIiIChfX25ldyksICIwIiAoX19vbGQpCQkJXAotCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQljYXNlIDQ6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1MzIgKl9fcHRyID0gKHZvbGF0aWxlIHUzMiAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ2wgJTIsJTEiCQkJXAotCQkJICAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICJyIiAoX19uZXcpLCAiMCIgKF9fb2xkKQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JZGVmYXVsdDoJCQkJCQkJXAotCQlfX2NtcHhjaGdfd3Jvbmdfc2l6ZSgpOwkJCQkJXAotCX0JCQkJCQkJCVwKLQlfX3JldDsJCQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCQlcCi0JX19yYXdfY21weGNoZygocHRyKSwgKG9sZCksIChuZXcpLCAoc2l6ZSksIExPQ0tfUFJFRklYKQotCi0jZGVmaW5lIF9fc3luY19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCVwKLQlfX3Jhd19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIChzaXplKSwgImxvY2s7ICIpCi0KLSNkZWZpbmUgX19jbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCVwKLQlfX3Jhd19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIChzaXplKSwgIiIpCi0KICNpZmRlZiBDT05GSUdfWDg2X0NNUFhDSEcKICNkZWZpbmUgX19IQVZFX0FSQ0hfQ01QWENIRyAxCi0KLSNkZWZpbmUgY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJCVwKLQlfX2NtcHhjaGcoKHB0ciksIChvbGQpLCAobmV3KSwgc2l6ZW9mKCpwdHIpKQotCi0jZGVmaW5lIHN5bmNfY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJXAotCV9fc3luY19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKLQotI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcpCQkJCQlcCi0JX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl9DTVBYQ0hHNjQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfNjQuaAppbmRleCA3Y2Y1YzBhLi4yODVkYTAyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ182NC5oCkBAIC0xLDE0NCArMSwxMyBAQAogI2lmbmRlZiBfQVNNX1g4Nl9DTVBYQ0hHXzY0X0gKICNkZWZpbmUgX0FTTV9YODZfQ01QWENIR182NF9ICiAKLSNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4gLyogUHJvdmlkZXMgTE9DS19QUkVGSVggKi8KLQogc3RhdGljIGlubGluZSB2b2lkIHNldF82NGJpdCh2b2xhdGlsZSB1NjQgKnB0ciwgdTY0IHZhbCkKIHsKIAkqcHRyID0gdmFsOwogfQogCi1leHRlcm4gdm9pZCBfX3hjaGdfd3Jvbmdfc2l6ZSh2b2lkKTsKLWV4dGVybiB2b2lkIF9fY21weGNoZ193cm9uZ19zaXplKHZvaWQpOwotCi0vKgotICogTm90ZTogbm8gImxvY2siIHByZWZpeCBldmVuIG9uIFNNUDogeGNoZyBhbHdheXMgaW1wbGllcyBsb2NrIGFueXdheS4KLSAqIFNpbmNlIHRoaXMgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gcHJvdGVjdCBvdGhlciBtZW1vcnkgaW5mb3JtYXRpb24sIHdlCi0gKiB1c2UgImFzbSB2b2xhdGlsZSIgYW5kICJtZW1vcnkiIGNsb2JiZXJzIHRvIHByZXZlbnQgZ2NjIGZyb20gbW92aW5nCi0gKiBpbmZvcm1hdGlvbiBhcm91bmQuCi0gKi8KLSNkZWZpbmUgX194Y2hnKHgsIHB0ciwgc2l6ZSkJCQkJCQlcCi0oewkJCQkJCQkJCVwKLQlfX3R5cGVvZigqKHB0cikpIF9feCA9ICh4KTsJCQkJCVwKLQlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAotCWNhc2UgMToJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHU4ICpfX3B0ciA9ICh2b2xhdGlsZSB1OCAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUoInhjaGdiICUwLCUxIgkJCQlcCi0JCQkgICAgIDogIj1xIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICIwIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWNhc2UgMjoJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHUxNiAqX19wdHIgPSAodm9sYXRpbGUgdTE2ICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZSgieGNoZ3cgJTAsJTEiCQkJCVwKLQkJCSAgICAgOiAiPXIiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogIjAiIChfX3gpCQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JY2FzZSA0OgkJCQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJdm9sYXRpbGUgdTMyICpfX3B0ciA9ICh2b2xhdGlsZSB1MzIgKikocHRyKTsJCVwKLQkJYXNtIHZvbGF0aWxlKCJ4Y2hnbCAlMCwlMSIJCQkJXAotCQkJICAgICA6ICI9ciIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKLQkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAotCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQljYXNlIDg6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1NjQgKl9fcHRyID0gKHZvbGF0aWxlIHU2NCAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUoInhjaGdxICUwLCUxIgkJCQlcCi0JCQkgICAgIDogIj1yIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICIwIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWRlZmF1bHQ6CQkJCQkJCVwKLQkJX194Y2hnX3dyb25nX3NpemUoKTsJCQkJCVwKLQl9CQkJCQkJCQlcCi0JX194OwkJCQkJCQkJXAotfSkKLQotI2RlZmluZSB4Y2hnKHB0ciwgdikJCQkJCQkJXAotCV9feGNoZygodiksIChwdHIpLCBzaXplb2YoKnB0cikpCi0KICNkZWZpbmUgX19IQVZFX0FSQ0hfQ01QWENIRyAxCiAKLS8qCi0gKiBBdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBDb21wYXJlIE9MRCB3aXRoIE1FTSwgaWYgaWRlbnRpY2FsLAotICogc3RvcmUgTkVXIGluIE1FTS4gIFJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBpbiBNRU0uICBTdWNjZXNzIGlzCi0gKiBpbmRpY2F0ZWQgYnkgY29tcGFyaW5nIFJFVFVSTiB3aXRoIE9MRC4KLSAqLwotI2RlZmluZSBfX3Jhd19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUsIGxvY2spCQkJXAotKHsJCQkJCQkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fcmV0OwkJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX29sZCA9IChvbGQpOwkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fbmV3ID0gKG5ldyk7CQkJCVwKLQlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAotCWNhc2UgMToJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHU4ICpfX3B0ciA9ICh2b2xhdGlsZSB1OCAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ2IgJTIsJTEiCQkJXAotCQkJICAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICJxIiAoX19uZXcpLCAiMCIgKF9fb2xkKQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JY2FzZSAyOgkJCQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJdm9sYXRpbGUgdTE2ICpfX3B0ciA9ICh2b2xhdGlsZSB1MTYgKikocHRyKTsJCVwKLQkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGd3ICUyLCUxIgkJCVwKLQkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKLQkJCSAgICAgOiAiciIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWNhc2UgNDoJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHUzMiAqX19wdHIgPSAodm9sYXRpbGUgdTMyICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hnbCAlMiwlMSIJCQlcCi0JCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogInIiIChfX25ldyksICIwIiAoX19vbGQpCQkJXAotCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQljYXNlIDg6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1NjQgKl9fcHRyID0gKHZvbGF0aWxlIHU2NCAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ3EgJTIsJTEiCQkJXAotCQkJICAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICJyIiAoX19uZXcpLCAiMCIgKF9fb2xkKQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JZGVmYXVsdDoJCQkJCQkJXAotCQlfX2NtcHhjaGdfd3Jvbmdfc2l6ZSgpOwkJCQkJXAotCX0JCQkJCQkJCVwKLQlfX3JldDsJCQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCQlcCi0JX19yYXdfY21weGNoZygocHRyKSwgKG9sZCksIChuZXcpLCAoc2l6ZSksIExPQ0tfUFJFRklYKQotCi0jZGVmaW5lIF9fc3luY19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCVwKLQlfX3Jhd19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIChzaXplKSwgImxvY2s7ICIpCi0KLSNkZWZpbmUgX19jbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCVwKLQlfX3Jhd19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIChzaXplKSwgIiIpCi0KLSNkZWZpbmUgY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJCVwKLQlfX2NtcHhjaGcoKHB0ciksIChvbGQpLCAobmV3KSwgc2l6ZW9mKCpwdHIpKQotCi0jZGVmaW5lIHN5bmNfY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJXAotCV9fc3luY19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKLQotI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcpCQkJCQlcCi0JX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKLQogI2RlZmluZSBjbXB4Y2hnNjQocHRyLCBvLCBuKQkJCQkJCVwKICh7CQkJCQkJCQkJXAogCUJVSUxEX0JVR19PTihzaXplb2YoKihwdHIpKSAhPSA4KTsJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jb21wYXQuaAppbmRleCAxZDljZDI3Li4zMGQ3MzdlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jb21wYXQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jb21wYXQuaApAQCAtMTA4LDcgKzEwOCw4IEBACiAJY29tcGF0X2ZzaWRfdAlmX2ZzaWQ7CiAJaW50CQlmX25hbWVsZW47CS8qIFN1bk9TIGlnbm9yZXMgdGhpcyBmaWVsZC4gKi8KIAlpbnQJCWZfZnJzaXplOwotCWludAkJZl9zcGFyZVs1XTsKKwlpbnQJCWZfZmxhZ3M7CisJaW50CQlmX3NwYXJlWzRdOwogfTsKIAogI2RlZmluZSBDT01QQVRfUkxJTV9PTERfSU5GSU5JVFkJMHg3ZmZmZmZmZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCmluZGV4IDg4YjIzYTQuLmYzNDQ0ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKQEAgLTExNCwxMiArMTE0LDE0IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYMTYJKDQqMzIrMTMpIC8qIENNUFhDSEcxNkIgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWFRQUgkoNCozMisxNCkgLyogU2VuZCBUYXNrIFByaW9yaXR5IE1lc3NhZ2VzICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BEQ00JKDQqMzIrMTUpIC8qIFBlcmZvcm1hbmNlIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QQ0lECSg0KjMyKzE3KSAvKiBQcm9jZXNzIENvbnRleHQgSWRlbnRpZmllcnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfRENBCQkoNCozMisxOCkgLyogRGlyZWN0IENhY2hlIEFjY2VzcyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9YTU00XzEJKDQqMzIrMTkpIC8qICJzc2U0XzEiIFNTRS00LjEgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NNF8yCSg0KjMyKzIwKSAvKiAic3NlNF8yIiBTU0UtNC4yICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1gyQVBJQwkoNCozMisyMSkgLyogeDJBUElDICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX01PVkJFCSg0KjMyKzIyKSAvKiBNT1ZCRSBpbnN0cnVjdGlvbiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9QT1BDTlQgICAgICAoNCozMisyMykgLyogUE9QQ05UIGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1RTQ19ERUFETElORV9USU1FUgkoNCozMisyNCkgLyogVHNjIGRlYWRsaW5lIHRpbWVyICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FFUwkJKDQqMzIrMjUpIC8qIEFFUyBpbnN0cnVjdGlvbnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWFNBVkUJKDQqMzIrMjYpIC8qIFhTQVZFL1hSU1RPUi9YU0VUQlYvWEdFVEJWICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX09TWFNBVkUJKDQqMzIrMjcpIC8qICIiIFhTQVZFIGVuYWJsZWQgaW4gdGhlIE9TICovCkBAIC0yNTcsNyArMjU5LDkgQEAKICNkZWZpbmUgY3B1X2hhc194bW0JCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9YTU0pCiAjZGVmaW5lIGNwdV9oYXNfeG1tMgkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hNTTIpCiAjZGVmaW5lIGNwdV9oYXNfeG1tMwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hNTTMpCisjZGVmaW5lIGNwdV9oYXNfc3NzZTMJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9TU1NFMykKICNkZWZpbmUgY3B1X2hhc19hZXMJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BRVMpCisjZGVmaW5lIGNwdV9oYXNfYXZ4CQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYKQogI2RlZmluZSBjcHVfaGFzX2h0CQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfSFQpCiAjZGVmaW5lIGNwdV9oYXNfbXAJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9NUCkKICNkZWZpbmUgY3B1X2hhc19ueAkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX05YKQpAQCAtMjg1LDYgKzI4OSw3IEBACiAjZGVmaW5lIGNwdV9oYXNfeG1tNF8yCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWE1NNF8yKQogI2RlZmluZSBjcHVfaGFzX3gyYXBpYwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1gyQVBJQykKICNkZWZpbmUgY3B1X2hhc194c2F2ZQkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hTQVZFKQorI2RlZmluZSBjcHVfaGFzX29zeHNhdmUJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9PU1hTQVZFKQogI2RlZmluZSBjcHVfaGFzX2h5cGVydmlzb3IJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0hZUEVSVklTT1IpCiAjZGVmaW5lIGNwdV9oYXNfcGNsbXVscWRxCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QQ0xNVUxRRFEpCiAjZGVmaW5lIGNwdV9oYXNfcGVyZmN0cl9jb3JlCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QRVJGQ1RSX0NPUkUpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IGYyYWQyMTYuLjVmOTYyZGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oCkBAIC00LDYgKzQsNyBAQAogLyoKICAqIEVMRiByZWdpc3RlciBkZWZpbml0aW9ucy4uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS91c2VyLmg+CkBAIC0zMjAsNCArMzIxLDM0IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogI2RlZmluZSBhcmNoX3JhbmRvbWl6ZV9icmsgYXJjaF9yYW5kb21pemVfYnJrCiAKKy8qCisgKiBUcnVlIG9uIFg4Nl8zMiBvciB3aGVuIGVtdWxhdGluZyBJQTMyIG9uIFg4Nl82NAorICovCitzdGF0aWMgaW5saW5lIGludCBtbWFwX2lzX2lhMzIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJcmV0dXJuIDE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMikpCisJCXJldHVybiAxOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBmaXJzdCB0d28gdmFsdWVzIGFyZSBzcGVjaWFsLCBkbyBub3QgY2hhbmdlLiBTZWUgYWxpZ25fYWRkcigpICovCitlbnVtIGFsaWduX2ZsYWdzIHsKKwlBTElHTl9WQV8zMgk9IEJJVCgwKSwKKwlBTElHTl9WQV82NAk9IEJJVCgxKSwKKwlBTElHTl9WRFNPCT0gQklUKDIpLAorCUFMSUdOX1RPUERPV04JPSBCSVQoMyksCit9OworCitzdHJ1Y3QgdmFfYWxpZ25tZW50IHsKKwlpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBtYXNrOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK2V4dGVybiBzdHJ1Y3QgdmFfYWxpZ25tZW50IHZhX2FsaWduOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYWxpZ25fYWRkcih1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZmlsZSAqLCBlbnVtIGFsaWduX2ZsYWdzKTsKICNlbmRpZiAvKiBfQVNNX1g4Nl9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfc2N1X2lwYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfc2N1X2lwYy5oCmluZGV4IDI5ZjY2NzkuLjQ0MjA5OTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9zY3VfaXBjLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9BU01fWDg2X0lOVEVMX1NDVV9JUENfSF8KICNkZWZpbmUgIF9BU01fWDg2X0lOVEVMX1NDVV9JUENfSF8KIAorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKICNkZWZpbmUgSVBDTVNHX1ZSVEMJMHhGQQkgLyogU2V0IHZSVEMgZGV2aWNlICovCiAKIC8qIENvbW1hbmQgaWQgYXNzb2NpYXRlZCB3aXRoIG1lc3NhZ2UgSVBDTVNHX1ZSVEMgKi8KQEAgLTQ0LDQgKzQ2LDI0IEBACiAvKiBVcGRhdGUgRlcgdmVyc2lvbiAqLwogaW50IGludGVsX3NjdV9pcGNfZndfdXBkYXRlKHU4ICpidWZmZXIsIHUzMiBsZW5ndGgpOwogCitleHRlcm4gc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgaW50ZWxfc2N1X25vdGlmaWVyOworCitzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfc2N1X25vdGlmaWVyX2FkZChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCWJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZpbnRlbF9zY3Vfbm90aWZpZXIsIG5iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGludGVsX3NjdV9ub3RpZmllcl9yZW1vdmUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZpbnRlbF9zY3Vfbm90aWZpZXIsIG5iKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW50ZWxfc2N1X25vdGlmaWVyX3Bvc3QodW5zaWduZWQgbG9uZyB2LCB2b2lkICpwKQoreworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZpbnRlbF9zY3Vfbm90aWZpZXIsIHYsIHApOworfQorCisjZGVmaW5lCQlTQ1VfQVZBSUxBQkxFCQkxCisjZGVmaW5lCQlTQ1VfRE9XTgkJMgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCmluZGV4IDYwNDBkMTEuLmEwMjY1MDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaApAQCAtMjYyLDcgKzI2Miw3IEBACiAJc3RydWN0IG9wZXJhbmQgZHN0OwogCWJvb2wgaGFzX3NlZ19vdmVycmlkZTsKIAl1OCBzZWdfb3ZlcnJpZGU7Ci0JdW5zaWduZWQgaW50IGQ7CisJdTY0IGQ7CiAJaW50ICgqZXhlY3V0ZSkoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpOwogCWludCAoKmNoZWNrX3Blcm0pKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KTsKIAkvKiBtb2RybSAqLwpAQCAtMjc1LDYgKzI3NSw4IEBACiAJdW5zaWduZWQgbG9uZyBfZWlwOwogCS8qIEZpZWxkcyBhYm92ZSByZWdzIGFyZSBjbGVhcmVkIHRvZ2V0aGVyLiAqLwogCXVuc2lnbmVkIGxvbmcgcmVnc1tOUl9WQ1BVX1JFR1NdOworCXN0cnVjdCBvcGVyYW5kIG1lbW9wOworCXN0cnVjdCBvcGVyYW5kICptZW1vcHA7CiAJc3RydWN0IGZldGNoX2NhY2hlIGZldGNoOwogCXN0cnVjdCByZWFkX2NhY2hlIGlvX3JlYWQ7CiAJc3RydWN0IHJlYWRfY2FjaGUgbWVtX3JlYWQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCBkZDUxYzgzLi5iNDk3M2Y0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTI2LDcgKzI2LDggQEAKICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KIAotI2RlZmluZSBLVk1fTUFYX1ZDUFVTIDY0CisjZGVmaW5lIEtWTV9NQVhfVkNQVVMgMjU0CisjZGVmaW5lIEtWTV9TT0ZUX01BWF9WQ1BVUyA2NAogI2RlZmluZSBLVk1fTUVNT1JZX1NMT1RTIDMyCiAvKiBtZW1vcnkgc2xvdHMgdGhhdCBkb2VzIG5vdCBleHBvc2VkIHRvIHVzZXJzcGFjZSAqLwogI2RlZmluZSBLVk1fUFJJVkFURV9NRU1fU0xPVFMgNApAQCAtMjY0LDYgKzI2NSw3IEBACiAJdm9pZCAoKm5ld19jcjMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJdm9pZCAoKnNldF9jcjMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyByb290KTsKIAl1bnNpZ25lZCBsb25nICgqZ2V0X2NyMykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwl1NjQgKCpnZXRfcGRwdHIpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGluZGV4KTsKIAlpbnQgKCpwYWdlX2ZhdWx0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSwgdTMyIGVyciwKIAkJCSAgYm9vbCBwcmVmYXVsdCk7CiAJdm9pZCAoKmluamVjdF9wYWdlX2ZhdWx0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCkBAIC00MTEsOCArNDEzLDkgQEAKIAl1MzIgIHRzY19jYXRjaHVwX211bHQ7CiAJczggICB0c2NfY2F0Y2h1cF9zaGlmdDsKIAotCWJvb2wgbm1pX3BlbmRpbmc7Ci0JYm9vbCBubWlfaW5qZWN0ZWQ7CisJYXRvbWljX3Qgbm1pX3F1ZXVlZDsgIC8qIHVucHJvY2Vzc2VkIGFzeW5jaHJvbm91cyBOTUlzICovCisJdW5zaWduZWQgbm1pX3BlbmRpbmc7IC8qIE5NSSBxdWV1ZWQgYWZ0ZXIgY3VycmVudGx5IHJ1bm5pbmcgaGFuZGxlciAqLworCWJvb2wgbm1pX2luamVjdGVkOyAgICAvKiBUcnlpbmcgdG8gaW5qZWN0IGFuIE5NSSB0aGlzIGVudHJ5ICovCiAKIAlzdHJ1Y3QgbXRycl9zdGF0ZV90eXBlIG10cnJfc3RhdGU7CiAJdTMyIHBhdDsKQEAgLTYyOCwxNCArNjMxLDEzIEBACiAJdm9pZCAoKndyaXRlX3RzY19vZmZzZXQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG9mZnNldCk7CiAKIAl1NjQgKCpjb21wdXRlX3RzY19vZmZzZXQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHRhcmdldF90c2MpOworCXU2NCAoKnJlYWRfbDFfdHNjKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiAJdm9pZCAoKmdldF9leGl0X2luZm8pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0ICppbmZvMSwgdTY0ICppbmZvMik7CiAKIAlpbnQgKCpjaGVja19pbnRlcmNlcHQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCSAgICAgICBzdHJ1Y3QgeDg2X2luc3RydWN0aW9uX2luZm8gKmluZm8sCiAJCQkgICAgICAgZW51bSB4ODZfaW50ZXJjZXB0X3N0YWdlIHN0YWdlKTsKLQotCWNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyAqZXhpdF9yZWFzb25zX3N0cjsKIH07CiAKIHN0cnVjdCBrdm1fYXJjaF9hc3luY19wZiB7CkBAIC02NzIsNiArNjc0LDggQEAKIAogZXh0ZXJuIGJvb2wgdGRwX2VuYWJsZWQ7CiAKK3U2NCB2Y3B1X3RzY19raHooc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwogLyogY29udHJvbCBvZiBndWVzdCB0c2MgcmF0ZSBzdXBwb3J0ZWQ/ICovCiBleHRlcm4gYm9vbCBrdm1faGFzX3RzY19jb250cm9sOwogLyogbWluaW11bSBzdXBwb3J0ZWQgdHNjX2toeiBmb3IgZ3Vlc3RzICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCmluZGV4IGQ1MjYwOWEuLmE2OTYyZDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCkBAIC0yMjksNiArMjI5LDggQEAKICNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFCSgxPDwxMSkKICNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRQkJKDB4ZmZmZmY8PDEyKQogCisjZGVmaW5lIE1TUl9JQTMyX1RTQ0RFQURMSU5FCQkweDAwMDAwNmUwCisKICNkZWZpbmUgTVNSX0lBMzJfVUNPREVfV1JJVEUJCTB4MDAwMDAwNzkKICNkZWZpbmUgTVNSX0lBMzJfVUNPREVfUkVWCQkweDAwMDAwMDhiCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaAppbmRleCA3MDQ1MjY3Li5lMzgxOTc4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2lfeDg2LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpX3g4Ni5oCkBAIC05OSwxMCArOTksMTAgQEAKIAkJCQkJCWludCByZWcsIGludCBsZW4sIHUzMiB2YWwpOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBwY2lfcmF3X29wcyAqcmF3X3BjaV9vcHM7Ci1leHRlcm4gc3RydWN0IHBjaV9yYXdfb3BzICpyYXdfcGNpX2V4dF9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IHBjaV9yYXdfb3BzICpyYXdfcGNpX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgKnJhd19wY2lfZXh0X29wczsKIAotZXh0ZXJuIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxOwogZXh0ZXJuIGJvb2wgcG9ydF9jZjlfc2FmZTsKIAogLyogYXJjaF9pbml0Y2FsbCBsZXZlbCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCAwZDExNzFjLi5iNjUwNDM1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTExLDYgKzExMSw3IEBACiAJLyogSW5kZXggaW50byBwZXJfY3B1IGxpc3Q6ICovCiAJdTE2CQkJY3B1X2luZGV4OwogI2VuZGlmCisJdTMyCQkJbWljcm9jb2RlOwogfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhTTVBfQ0FDSEVfQllURVMpKSk7CiAKICNkZWZpbmUgWDg2X1ZFTkRPUl9JTlRFTAkwCkBAIC0xNzksNyArMTgwLDggQEAKIAkgICAgICAiPWIiICgqZWJ4KSwKIAkgICAgICAiPWMiICgqZWN4KSwKIAkgICAgICAiPWQiICgqZWR4KQotCSAgICA6ICIwIiAoKmVheCksICIyIiAoKmVjeCkpOworCSAgICA6ICIwIiAoKmVheCksICIyIiAoKmVjeCkKKwkgICAgOiAibWVtb3J5Iik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX2NyMyhwZ2RfdCAqcGdkaXIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yd3NlbS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcndzZW0uaAppbmRleCBkZjRjZDMyLi4yZGJlNGE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yd3NlbS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3J3c2VtLmgKQEAgLTIwNCwxMyArMjA0LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBsb25nIHJ3c2VtX2F0b21pY191cGRhdGUobG9uZyBkZWx0YSwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewotCWxvbmcgdG1wID0gZGVsdGE7Ci0KLQlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggInhhZGQgJTAsJTEiCi0JCSAgICAgOiAiK3IiICh0bXApLCAiK20iIChzZW0tPmNvdW50KQotCQkgICAgIDogOiAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gdG1wICsgZGVsdGE7CisJcmV0dXJuIGRlbHRhICsgeGFkZCgmc2VtLT5jb3VudCwgZGVsdGEpOwogfQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggZWU2N2VkZi4uOTcyYzI2MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC00OSwxMDkgKzQ5LDQ5IEBACiAgKiBpc3N1ZXMgYW5kIHNob3VsZCBiZSBvcHRpbWFsIGZvciB0aGUgdW5jb250ZW5kZWQgY2FzZS4gTm90ZSB0aGUgdGFpbCBtdXN0IGJlCiAgKiBpbiB0aGUgaGlnaCBwYXJ0LCBiZWNhdXNlIGEgd2lkZSB4YWRkIGluY3JlbWVudCBvZiB0aGUgbG93IHBhcnQgd291bGQgY2FycnkKICAqIHVwIGFuZCBjb250YW1pbmF0ZSB0aGUgaGlnaCBwYXJ0LgotICoKLSAqIFdpdGggZmV3ZXIgdGhhbiAyXjggcG9zc2libGUgQ1BVcywgd2UgY2FuIHVzZSB4ODYncyBwYXJ0aWFsIHJlZ2lzdGVycyB0bwotICogc2F2ZSBzb21lIGluc3RydWN0aW9ucyBhbmQgbWFrZSB0aGUgY29kZSBtb3JlIGVsZWdhbnQuIFRoZXJlIHJlYWxseSBpc24ndAotICogbXVjaCBiZXR3ZWVuIHRoZW0gaW4gcGVyZm9ybWFuY2UgdGhvdWdoLCBlc3BlY2lhbGx5IGFzIGxvY2tzIGFyZSBvdXQgb2YgbGluZS4KICAqLwotI2lmIChOUl9DUFVTIDwgMjU2KQotI2RlZmluZSBUSUNLRVRfU0hJRlQgOAotCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl9sb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlzaG9ydCBpbmMgPSAweDAxMDA7CisJcmVnaXN0ZXIgc3RydWN0IF9fcmF3X3RpY2tldHMgaW5jID0geyAudGFpbCA9IDEgfTsKIAotCWFzbSB2b2xhdGlsZSAoCi0JCUxPQ0tfUFJFRklYICJ4YWRkdyAldzAsICUxXG4iCi0JCSIxOlx0IgotCQkiY21wYiAlaDAsICViMFxuXHQiCi0JCSJqZSAyZlxuXHQiCi0JCSJyZXAgOyBub3Bcblx0IgotCQkibW92YiAlMSwgJWIwXG5cdCIKLQkJLyogZG9uJ3QgbmVlZCBsZmVuY2UgaGVyZSwgYmVjYXVzZSBsb2FkcyBhcmUgaW4tb3JkZXIgKi8KLQkJImptcCAxYlxuIgotCQkiMjoiCi0JCTogIitRIiAoaW5jKSwgIittIiAobG9jay0+c2xvY2spCi0JCToKLQkJOiAibWVtb3J5IiwgImNjIik7CisJaW5jID0geGFkZCgmbG9jay0+dGlja2V0cywgaW5jKTsKKworCWZvciAoOzspIHsKKwkJaWYgKGluYy5oZWFkID09IGluYy50YWlsKQorCQkJYnJlYWs7CisJCWNwdV9yZWxheCgpOworCQlpbmMuaGVhZCA9IEFDQ0VTU19PTkNFKGxvY2stPnRpY2tldHMuaGVhZCk7CisJfQorCWJhcnJpZXIoKTsJCS8qIG1ha2Ugc3VyZSBub3RoaW5nIGNyZWVwcyBiZWZvcmUgdGhlIGxvY2sgaXMgdGFrZW4gKi8KIH0KIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX190aWNrZXRfc3Bpbl90cnlsb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlpbnQgdG1wLCBuZXc7CisJYXJjaF9zcGlubG9ja190IG9sZCwgbmV3OwogCi0JYXNtIHZvbGF0aWxlKCJtb3Z6d2wgJTIsICUwXG5cdCIKLQkJICAgICAiY21wYiAlaDAsJWIwXG5cdCIKLQkJICAgICAibGVhbCAweDEwMCglIiBSRUdfUFRSX01PREUgIjApLCAlMVxuXHQiCi0JCSAgICAgImpuZSAxZlxuXHQiCi0JCSAgICAgTE9DS19QUkVGSVggImNtcHhjaGd3ICV3MSwlMlxuXHQiCi0JCSAgICAgIjE6IgotCQkgICAgICJzZXRlICViMVxuXHQiCi0JCSAgICAgIm1vdnpibCAlYjEsJTBcblx0IgotCQkgICAgIDogIj0mYSIgKHRtcCksICI9JnEiIChuZXcpLCAiK20iIChsb2NrLT5zbG9jaykKLQkJICAgICA6Ci0JCSAgICAgOiAibWVtb3J5IiwgImNjIik7CisJb2xkLnRpY2tldHMgPSBBQ0NFU1NfT05DRShsb2NrLT50aWNrZXRzKTsKKwlpZiAob2xkLnRpY2tldHMuaGVhZCAhPSBvbGQudGlja2V0cy50YWlsKQorCQlyZXR1cm4gMDsKIAotCXJldHVybiB0bXA7CisJbmV3LmhlYWRfdGFpbCA9IG9sZC5oZWFkX3RhaWwgKyAoMSA8PCBUSUNLRVRfU0hJRlQpOworCisJLyogY21weGNoZyBpcyBhIGZ1bGwgYmFycmllciwgc28gbm90aGluZyBjYW4gbW92ZSBiZWZvcmUgaXQgKi8KKwlyZXR1cm4gY21weGNoZygmbG9jay0+aGVhZF90YWlsLCBvbGQuaGVhZF90YWlsLCBuZXcuaGVhZF90YWlsKSA9PSBvbGQuaGVhZF90YWlsOwogfQogCisjaWYgKE5SX0NQVVMgPCAyNTYpCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl91bmxvY2soYXJjaF9zcGlubG9ja190ICpsb2NrKQogewogCWFzbSB2b2xhdGlsZShVTkxPQ0tfTE9DS19QUkVGSVggImluY2IgJTAiCi0JCSAgICAgOiAiK20iIChsb2NrLT5zbG9jaykKKwkJICAgICA6ICIrbSIgKGxvY2stPmhlYWRfdGFpbCkKIAkJICAgICA6CiAJCSAgICAgOiAibWVtb3J5IiwgImNjIik7CiB9CiAjZWxzZQotI2RlZmluZSBUSUNLRVRfU0hJRlQgMTYKLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIF9fdGlja2V0X3NwaW5fbG9jayhhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0JaW50IGluYyA9IDB4MDAwMTAwMDA7Ci0JaW50IHRtcDsKLQotCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAieGFkZGwgJTAsICUxXG4iCi0JCSAgICAgIm1vdnp3bCAldzAsICUyXG5cdCIKLQkJICAgICAic2hybCAkMTYsICUwXG5cdCIKLQkJICAgICAiMTpcdCIKLQkJICAgICAiY21wbCAlMCwgJTJcblx0IgotCQkgICAgICJqZSAyZlxuXHQiCi0JCSAgICAgInJlcCA7IG5vcFxuXHQiCi0JCSAgICAgIm1vdnp3bCAlMSwgJTJcblx0IgotCQkgICAgIC8qIGRvbid0IG5lZWQgbGZlbmNlIGhlcmUsIGJlY2F1c2UgbG9hZHMgYXJlIGluLW9yZGVyICovCi0JCSAgICAgImptcCAxYlxuIgotCQkgICAgICIyOiIKLQkJICAgICA6ICIrciIgKGluYyksICIrbSIgKGxvY2stPnNsb2NrKSwgIj0mciIgKHRtcCkKLQkJICAgICA6Ci0JCSAgICAgOiAibWVtb3J5IiwgImNjIik7Ci19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fdGlja2V0X3NwaW5fdHJ5bG9jayhhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0JaW50IHRtcDsKLQlpbnQgbmV3OwotCi0JYXNtIHZvbGF0aWxlKCJtb3ZsICUyLCUwXG5cdCIKLQkJICAgICAibW92bCAlMCwlMVxuXHQiCi0JCSAgICAgInJvbGwgJDE2LCAlMFxuXHQiCi0JCSAgICAgImNtcGwgJTAsJTFcblx0IgotCQkgICAgICJsZWFsIDB4MDAwMTAwMDAoJSIgUkVHX1BUUl9NT0RFICIwKSwgJTFcblx0IgotCQkgICAgICJqbmUgMWZcblx0IgotCQkgICAgIExPQ0tfUFJFRklYICJjbXB4Y2hnbCAlMSwlMlxuXHQiCi0JCSAgICAgIjE6IgotCQkgICAgICJzZXRlICViMVxuXHQiCi0JCSAgICAgIm1vdnpibCAlYjEsJTBcblx0IgotCQkgICAgIDogIj0mYSIgKHRtcCksICI9JnEiIChuZXcpLCAiK20iIChsb2NrLT5zbG9jaykKLQkJICAgICA6Ci0JCSAgICAgOiAibWVtb3J5IiwgImNjIik7Ci0KLQlyZXR1cm4gdG1wOwotfQotCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl91bmxvY2soYXJjaF9zcGlubG9ja190ICpsb2NrKQogewogCWFzbSB2b2xhdGlsZShVTkxPQ0tfTE9DS19QUkVGSVggImluY3cgJTAiCi0JCSAgICAgOiAiK20iIChsb2NrLT5zbG9jaykKKwkJICAgICA6ICIrbSIgKGxvY2stPmhlYWRfdGFpbCkKIAkJICAgICA6CiAJCSAgICAgOiAibWVtb3J5IiwgImNjIik7CiB9CkBAIC0xNTksMTYgKzk5LDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fdGlja2V0X3NwaW5faXNfbG9ja2VkKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlpbnQgdG1wID0gQUNDRVNTX09OQ0UobG9jay0+c2xvY2spOworCXN0cnVjdCBfX3Jhd190aWNrZXRzIHRtcCA9IEFDQ0VTU19PTkNFKGxvY2stPnRpY2tldHMpOwogCi0JcmV0dXJuICEhKCgodG1wID4+IFRJQ0tFVF9TSElGVCkgXiB0bXApICYgKCgxIDw8IFRJQ0tFVF9TSElGVCkgLSAxKSk7CisJcmV0dXJuICEhKHRtcC50YWlsIF4gdG1wLmhlYWQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX3RpY2tldF9zcGluX2lzX2NvbnRlbmRlZChhcmNoX3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0JaW50IHRtcCA9IEFDQ0VTU19PTkNFKGxvY2stPnNsb2NrKTsKKwlzdHJ1Y3QgX19yYXdfdGlja2V0cyB0bXAgPSBBQ0NFU1NfT05DRShsb2NrLT50aWNrZXRzKTsKIAotCXJldHVybiAoKCh0bXAgPj4gVElDS0VUX1NISUZUKSAtIHRtcCkgJiAoKDEgPDwgVElDS0VUX1NISUZUKSAtIDEpKSA+IDE7CisJcmV0dXJuICgodG1wLnRhaWwgLSB0bXAuaGVhZCkgJiBUSUNLRVRfTUFTSykgPiAxOwogfQogCiAjaWZuZGVmIENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCmluZGV4IDdjN2E0ODYuLjhlYmQ1ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApAQCAtNSwxMSArNSwyOSBAQAogIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgogI2VuZGlmCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaWYgKENPTkZJR19OUl9DUFVTIDwgMjU2KQordHlwZWRlZiB1OCAgX190aWNrZXRfdDsKK3R5cGVkZWYgdTE2IF9fdGlja2V0cGFpcl90OworI2Vsc2UKK3R5cGVkZWYgdTE2IF9fdGlja2V0X3Q7Cit0eXBlZGVmIHUzMiBfX3RpY2tldHBhaXJfdDsKKyNlbmRpZgorCisjZGVmaW5lIFRJQ0tFVF9TSElGVAkoc2l6ZW9mKF9fdGlja2V0X3QpICogOCkKKyNkZWZpbmUgVElDS0VUX01BU0sJKChfX3RpY2tldF90KSgoMSA8PCBUSUNLRVRfU0hJRlQpIC0gMSkpCisKIHR5cGVkZWYgc3RydWN0IGFyY2hfc3BpbmxvY2sgewotCXVuc2lnbmVkIGludCBzbG9jazsKKwl1bmlvbiB7CisJCV9fdGlja2V0cGFpcl90IGhlYWRfdGFpbDsKKwkJc3RydWN0IF9fcmF3X3RpY2tldHMgeworCQkJX190aWNrZXRfdCBoZWFkLCB0YWlsOworCQl9IHRpY2tldHM7CisJfTsKIH0gYXJjaF9zcGlubG9ja190OwogCi0jZGVmaW5lIF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KKyNkZWZpbmUgX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRAl7IHsgMCB9IH0KIAogI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaAppbmRleCA1OTM0ODViMy4uNTk5Yzc3ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKQEAgLTM1MiwxMCArMzUyLDEyIEBACiAjZGVmaW5lIF9fTlJfc3luY2ZzICAgICAgICAgICAgIDM0NAogI2RlZmluZSBfX05SX3NlbmRtbXNnCQkzNDUKICNkZWZpbmUgX19OUl9zZXRucwkJMzQ2CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV9yZWFkdgkzNDcKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgkzNDgKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9zeXNjYWxscyAzNDcKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzQ5CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKaW5kZXggMGE2YmEzMy4uMDQzMWYxOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKQEAgLTY4Miw2ICs2ODIsMTAgQEAKIF9fU1lTQ0FMTChfX05SX3NldG5zLCBzeXNfc2V0bnMpCiAjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkJCTMwOQogX19TWVNDQUxMKF9fTlJfZ2V0Y3B1LCBzeXNfZ2V0Y3B1KQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJCQkzMTAKK19fU1lTQ0FMTChfX05SX3Byb2Nlc3Nfdm1fcmVhZHYsIHN5c19wcm9jZXNzX3ZtX3JlYWR2KQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2CQkJMzExCitfX1NZU0NBTEwoX19OUl9wcm9jZXNzX3ZtX3dyaXRldiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KQogCiAjaWZuZGVmIF9fTk9fU1RVQlMKICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2JhdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKaW5kZXggMzdkMzY5OC4uOGU4NjJhYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKQEAgLTU1LDYgKzU1LDcgQEAKICNkZWZpbmUgVVZfQkFVX1RVTkFCTEVTX0RJUgkJInNnaV91diIKICNkZWZpbmUgVVZfQkFVX1RVTkFCTEVTX0ZJTEUJCSJiYXVfdHVuYWJsZXMiCiAjZGVmaW5lIFdISVRFU1BBQ0UJCQkiIFx0XG4iCisjZGVmaW5lIHV2X21tYXNrCQkJKCgxVUwgPDwgdXZfaHViX2luZm8tPm1fdmFsKSAtIDEpCiAjZGVmaW5lIHV2X3BoeXNub2RlYWRkcih4KQkJKChfX3BhKCh1bnNpZ25lZCBsb25nKSh4KSkgJiB1dl9tbWFzaykpCiAjZGVmaW5lIGNwdWJpdF9pc3NldChjcHUsIGJhdV9sb2NhbF9jcHVtYXNrKSBcCiAJdGVzdF9iaXQoKGNwdSksIChiYXVfbG9jYWxfY3B1bWFzaykuYml0cykKQEAgLTY1NiwxMSArNjU3LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgYXRvbV9hc3Ioc2hvcnQgaSwgc3RydWN0IGF0b21pY19zaG9ydCAqdikKIHsKLQlzaG9ydCBfX2kgPSBpOwotCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAieGFkZHcgJTAsICUxIgotCQkJOiAiK3IiIChpKSwgIittIiAodi0+Y291bnRlcikKLQkJCTogOiAibWVtb3J5Iik7Ci0JcmV0dXJuIGkgKyBfX2k7CisJcmV0dXJuIGkgKyB4YWRkKCZ2LT5jb3VudGVyLCBpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2h1Yi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKaW5kZXggZjI2NTQ0YS4uNTRhMTNhYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKQEAgLTQ2LDYgKzQ2LDEzIEBACiAgKglQTk9ERSAgIC0gdGhlIGxvdyBOIGJpdHMgb2YgdGhlIEdOT0RFLiBUaGUgUE5PREUgaXMgdGhlIG1vc3QgdXNlZnVsIHZhcmlhbnQKICAqCQkgIG9mIHRoZSBuYXNpZCBmb3Igc29ja2V0IHVzYWdlLgogICoKKyAqCUdQQQktIChnbG9iYWwgcGh5c2ljYWwgYWRkcmVzcykgYSBzb2NrZXQgcGh5c2ljYWwgYWRkcmVzcyBjb252ZXJ0ZWQKKyAqCQkgIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgdGhlIEdSVSBhcyBhIGdsb2JhbCBhZGRyZXNzLiBTb2NrZXQKKyAqCQkgIHBoeXNpY2FsIGFkZHJlc3NlcyAxKSBuZWVkIGFkZGl0aW9uYWwgTkFTSUQgKG5vZGUpIGJpdHMgYWRkZWQKKyAqCQkgIHRvIHRoZSBoaWdoIGVuZCBvZiB0aGUgYWRkcmVzcywgYW5kIDIpIHVuYWxpYXNlZCBpZiB0aGUKKyAqCQkgIHBhcnRpdGlvbiBkb2VzIG5vdCBoYXZlIGEgcGh5c2ljYWwgYWRkcmVzcyAwLiBJbiBhZGRpdGlvbiwgb24KKyAqCQkgIFVWMiByZXYgMSwgR1BBcyBuZWVkIHRoZSBnbm9kZSBsZWZ0IHNoaWZ0ZWQgdG8gYml0cyAzOSBvciA0MC4KKyAqCiAgKgogICogIE51bWFMaW5rIEdsb2JhbCBQaHlzaWNhbCBBZGRyZXNzIEZvcm1hdDoKICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpAQCAtMTQxLDYgKzE0OCw4IEBACiAJdW5zaWduZWQgaW50CQlnbm9kZV9leHRyYTsKIAl1bnNpZ25lZCBjaGFyCQlodWJfcmV2aXNpb247CiAJdW5zaWduZWQgY2hhcgkJYXBpY19wbm9kZV9zaGlmdDsKKwl1bnNpZ25lZCBjaGFyCQltX3NoaWZ0OworCXVuc2lnbmVkIGNoYXIJCW5fbHNoaWZ0OwogCXVuc2lnbmVkIGxvbmcJCWdub2RlX3VwcGVyOwogCXVuc2lnbmVkIGxvbmcJCWxvd21lbV9yZW1hcF90b3A7CiAJdW5zaWduZWQgbG9uZwkJbG93bWVtX3JlbWFwX2Jhc2U7CkBAIC0xNzcsNiArMTg2LDE2IEBACiAJcmV0dXJuIHV2X2h1Yl9pbmZvLT5odWJfcmV2aXNpb24gPj0gVVYyX0hVQl9SRVZJU0lPTl9CQVNFOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc191djJfMV9odWIodm9pZCkKK3sKKwlyZXR1cm4gdXZfaHViX2luZm8tPmh1Yl9yZXZpc2lvbiA9PSBVVjJfSFVCX1JFVklTSU9OX0JBU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3V2Ml8yX2h1Yih2b2lkKQoreworCXJldHVybiB1dl9odWJfaW5mby0+aHViX3JldmlzaW9uID09IFVWMl9IVUJfUkVWSVNJT05fQkFTRSArIDE7Cit9CisKIHVuaW9uIHV2aF9hcGljaWQgewogICAgIHVuc2lnbmVkIGxvbmcgICAgICAgdjsKICAgICBzdHJ1Y3QgdXZoX2FwaWNpZF9zIHsKQEAgLTI3Niw3ICsyOTUsMTAgQEAKIHsKIAlpZiAocGFkZHIgPCB1dl9odWJfaW5mby0+bG93bWVtX3JlbWFwX3RvcCkKIAkJcGFkZHIgfD0gdXZfaHViX2luZm8tPmxvd21lbV9yZW1hcF9iYXNlOwotCXJldHVybiBwYWRkciB8IHV2X2h1Yl9pbmZvLT5nbm9kZV91cHBlcjsKKwlwYWRkciB8PSB1dl9odWJfaW5mby0+Z25vZGVfdXBwZXI7CisJcGFkZHIgPSAoKHBhZGRyIDw8IHV2X2h1Yl9pbmZvLT5tX3NoaWZ0KSA+PiB1dl9odWJfaW5mby0+bV9zaGlmdCkgfAorCQkoKHBhZGRyID4+IHV2X2h1Yl9pbmZvLT5tX3ZhbCkgPDwgdXZfaHViX2luZm8tPm5fbHNoaWZ0KTsKKwlyZXR1cm4gcGFkZHI7CiB9CiAKIApAQCAtMzAwLDE2ICszMjIsMTkgQEAKIAl1bnNpZ25lZCBsb25nIHJlbWFwX2Jhc2UgPSB1dl9odWJfaW5mby0+bG93bWVtX3JlbWFwX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyByZW1hcF90b3AgPSAgdXZfaHViX2luZm8tPmxvd21lbV9yZW1hcF90b3A7CiAKKwlncGEgPSAoKGdwYSA8PCB1dl9odWJfaW5mby0+bV9zaGlmdCkgPj4gdXZfaHViX2luZm8tPm1fc2hpZnQpIHwKKwkJKChncGEgPj4gdXZfaHViX2luZm8tPm5fbHNoaWZ0KSA8PCB1dl9odWJfaW5mby0+bV92YWwpOworCWdwYSA9IGdwYSAmIHV2X2h1Yl9pbmZvLT5ncGFfbWFzazsKIAlpZiAocGFkZHIgPj0gcmVtYXBfYmFzZSAmJiBwYWRkciA8IHJlbWFwX2Jhc2UgKyByZW1hcF90b3ApCiAJCXBhZGRyIC09IHJlbWFwX2Jhc2U7CiAJcmV0dXJuIHBhZGRyOwogfQogCiAKLS8qIGdub2RlIC0+IHBub2RlICovCisvKiBncGEgLT4gcG5vZGUgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB1dl9ncGFfdG9fZ25vZGUodW5zaWduZWQgbG9uZyBncGEpCiB7Ci0JcmV0dXJuIGdwYSA+PiB1dl9odWJfaW5mby0+bV92YWw7CisJcmV0dXJuIGdwYSA+PiB1dl9odWJfaW5mby0+bl9sc2hpZnQ7CiB9CiAKIC8qIGdwYSAtPiBwbm9kZSAqLwpAQCAtMzIwLDYgKzM0NSwxMiBAQAogCXJldHVybiB1dl9ncGFfdG9fZ25vZGUoZ3BhKSAmIG5fbWFzazsKIH0KIAorLyogZ3BhIC0+IG5vZGUgb2Zmc2V0Ki8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB1dl9ncGFfdG9fb2Zmc2V0KHVuc2lnbmVkIGxvbmcgZ3BhKQoreworCXJldHVybiAoZ3BhIDw8IHV2X2h1Yl9pbmZvLT5tX3NoaWZ0KSA+PiB1dl9odWJfaW5mby0+bV9zaGlmdDsKK30KKwogLyogcG5vZGUsIG9mZnNldCAtLT4gc29ja2V0IHZpcnR1YWwgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqdXZfcG5vZGVfb2Zmc2V0X3RvX3ZhZGRyKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92bXguaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCmluZGV4IDJjYWYyOTAuLjMxZjE4MGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCkBAIC0zNTAsNiArMzUwLDE4IEBACiAjZGVmaW5lIERFQlVHX1JFR19BQ0NFU1NfUkVHKGVxKSAgICAgICAgKCgoZXEpID4+IDgpICYgMHhmKSAvKiAxMTo4LCBnZW5lcmFsIHB1cnBvc2UgcmVnLiAqLwogCiAKKy8qCisgKiBFeGl0IFF1YWxpZmljYXRpb25zIGZvciBBUElDLUFjY2VzcworICovCisjZGVmaW5lIEFQSUNfQUNDRVNTX09GRlNFVCAgICAgICAgICAgICAgMHhmZmYgICAvKiAxMTowLCBvZmZzZXQgd2l0aGluIHRoZSBBUElDIHBhZ2UgKi8KKyNkZWZpbmUgQVBJQ19BQ0NFU1NfVFlQRSAgICAgICAgICAgICAgICAweGYwMDAgIC8qIDE1OjEyLCBhY2Nlc3MgdHlwZSAqLworI2RlZmluZSBUWVBFX0xJTkVBUl9BUElDX0lOU1RfUkVBRCAgICAgICgwIDw8IDEyKQorI2RlZmluZSBUWVBFX0xJTkVBUl9BUElDX0lOU1RfV1JJVEUgICAgICgxIDw8IDEyKQorI2RlZmluZSBUWVBFX0xJTkVBUl9BUElDX0lOU1RfRkVUQ0ggICAgICgyIDw8IDEyKQorI2RlZmluZSBUWVBFX0xJTkVBUl9BUElDX0VWRU5UICAgICAgICAgICgzIDw8IDEyKQorI2RlZmluZSBUWVBFX1BIWVNJQ0FMX0FQSUNfRVZFTlQgICAgICAgICgxMCA8PCAxMikKKyNkZWZpbmUgVFlQRV9QSFlTSUNBTF9BUElDX0lOU1QgICAgICAgICAoMTUgPDwgMTIpCisKIC8qIHNlZ21lbnQgQVIgKi8KICNkZWZpbmUgU0VHTUVOVF9BUl9MX01BU0sgKDEgPDwgMTMpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9ncmFudF90YWJsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2dyYW50X3RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYmJiNDUuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2dyYW50X3RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9YODZfWEVOX0dSQU5UX1RBQkxFX0gKLSNkZWZpbmUgX0FTTV9YODZfWEVOX0dSQU5UX1RBQkxFX0gKLQotI2RlZmluZSB4ZW5fYWxsb2Nfdm1fYXJlYShzaXplKQlhbGxvY192bV9hcmVhKHNpemUpCi0jZGVmaW5lIHhlbl9mcmVlX3ZtX2FyZWEoYXJlYSkJZnJlZV92bV9hcmVhKGFyZWEpCi0KLSNlbmRpZiAvKiBfQVNNX1g4Nl9YRU5fR1JBTlRfVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVyY2FsbC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVyY2FsbC5oCmluZGV4IDQxNzc3N2QuLjU3Mjg4NTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcmNhbGwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJjYWxsLmgKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2Uvc2NoZWQuaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3BoeXNkZXYuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3BsYXRmb3JtLmg+CiAKIC8qCiAgKiBUaGUgaHlwZXJjYWxsIGFzbXMgaGF2ZSB0byBtZWV0IHNldmVyYWwgY29uc3RyYWludHM6CkBAIC0zMDEsNiArMzAyLDEzIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CitIWVBFUlZJU09SX2RvbTBfb3Aoc3RydWN0IHhlbl9wbGF0Zm9ybV9vcCAqcGxhdGZvcm1fb3ApCit7CisJcGxhdGZvcm1fb3AtPmludGVyZmFjZV92ZXJzaW9uID0gWEVOUEZfSU5URVJGQUNFX1ZFUlNJT047CisJcmV0dXJuIF9oeXBlcmNhbGwxKGludCwgZG9tMF9vcCwgcGxhdGZvcm1fb3ApOworfQorCitzdGF0aWMgaW5saW5lIGludAogSFlQRVJWSVNPUl9zZXRfZGVidWdyZWcoaW50IHJlZywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKIHsKIAlyZXR1cm4gX2h5cGVyY2FsbDIoaW50LCBzZXRfZGVidWdyZWcsIHJlZywgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2ludGVyZmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2ludGVyZmFjZS5oCmluZGV4IDVkNDkyMmEuLmExZjJkYjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9pbnRlcmZhY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaW50ZXJmYWNlLmgKQEAgLTU1LDYgKzU1LDcgQEAKIERFRklORV9HVUVTVF9IQU5ETEUoaW50KTsKIERFRklORV9HVUVTVF9IQU5ETEUobG9uZyk7CiBERUZJTkVfR1VFU1RfSEFORExFKHZvaWQpOworREVGSU5FX0dVRVNUX0hBTkRMRSh1aW50NjRfdCk7CiAjZW5kaWYKIAogI2lmbmRlZiBIWVBFUlZJU09SX1ZJUlRfU1RBUlQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IDc1YmUwMGUuLjYyYWUzMDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtODIwLDYgKzgyMCwxMCBAQAogCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+YXBpY19wbm9kZV9zaGlmdCA9IHV2aF9hcGljaWQucy5wbm9kZV9zaGlmdDsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPmh1Yl9yZXZpc2lvbiA9IHV2X2h1Yl9pbmZvLT5odWJfcmV2aXNpb247CiAKKwkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPm1fc2hpZnQgPSA2NCAtIG1fdmFsOworCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+bl9sc2hpZnQgPSBpc191djJfMV9odWIoKSA/CisJCQkJKG1fdmFsID09IDQwID8gNDAgOiAzOSkgOiBtX3ZhbDsKKwogCQlwbm9kZSA9IHV2X2FwaWNpZF90b19wbm9kZShhcGljaWQpOwogCQlibGFkZSA9IGJvb3RfcG5vZGVfdG9fYmxhZGUocG5vZGUpOwogCQlsY3B1ID0gdXZfYmxhZGVfaW5mb1tibGFkZV0ubnJfcG9zc2libGVfY3B1czsKQEAgLTg1MCw4ICs4NTQsNyBAQAogCQlpZiAodXZfbm9kZV90b19ibGFkZVtuaWRdID49IDApCiAJCQljb250aW51ZTsKIAkJcGFkZHIgPSBub2RlX3N0YXJ0X3BmbihuaWQpIDw8IFBBR0VfU0hJRlQ7Ci0JCXBhZGRyID0gdXZfc29jX3BoeXNfcmFtX3RvX2dwYShwYWRkcik7Ci0JCXBub2RlID0gKHBhZGRyID4+IG1fdmFsKSAmIHBub2RlX21hc2s7CisJCXBub2RlID0gdXZfZ3BhX3RvX3Bub2RlKHV2X3NvY19waHlzX3JhbV90b19ncGEocGFkZHIpKTsKIAkJYmxhZGUgPSBib290X3Bub2RlX3RvX2JsYWRlKHBub2RlKTsKIAkJdXZfbm9kZV90b19ibGFkZVtuaWRdID0gYmxhZGU7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKaW5kZXggZmU2ZWIxOS4uMjVmMjRkYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L01ha2VmaWxlCkBAIC0xNSw2ICsxNSw3IEBACiBvYmoteQkJCTo9IGludGVsX2NhY2hlaW5mby5vIHNjYXR0ZXJlZC5vIHRvcG9sb2d5Lm8KIG9iai15CQkJKz0gcHJvYy5vIGNhcGZsYWdzLm8gcG93ZXJmbGFncy5vIGNvbW1vbi5vCiBvYmoteQkJCSs9IHZtd2FyZS5vIGh5cGVydmlzb3IubyBzY2hlZC5vIG1zaHlwZXJ2Lm8KK29iai15CQkJKz0gcmRyYW5kLm8KIAogb2JqLSQoQ09ORklHX1g4Nl8zMikJKz0gYnVncy5vCiBvYmotJChDT05GSUdfWDg2XzY0KQkrPSBidWdzXzY0Lm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IGIxM2VkMzkuLmM3ZTQ2Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwpAQCAtMSw1ICsxLDcgQEAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC00MTAsOCArNDEyLDM4IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHZvaWQgX19jcHVpbml0IGJzcF9pbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKSkgeworCisJCWlmIChjLT54ODYgPiAweDEwIHx8CisJCSAgICAoYy0+eDg2ID09IDB4MTAgJiYgYy0+eDg2X21vZGVsID49IDB4MikpIHsKKwkJCXU2NCB2YWw7CisKKwkJCXJkbXNybChNU1JfSzdfSFdDUiwgdmFsKTsKKwkJCWlmICghKHZhbCAmIEJJVCgyNCkpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRldfQlVHICJUU0MgZG9lc24ndCBjb3VudCAiCisJCQkJCSJ3aXRoIFAwIGZyZXF1ZW5jeSFcbiIpOworCQl9CisJfQorCisJaWYgKGMtPng4NiA9PSAweDE1KSB7CisJCXVuc2lnbmVkIGxvbmcgdXBwZXJiaXQ7CisJCXUzMiBjcHVpZCwgYXNzb2M7CisKKwkJY3B1aWQJID0gY3B1aWRfZWR4KDB4ODAwMDAwMDUpOworCQlhc3NvYwkgPSBjcHVpZCA+PiAxNiAmIDB4ZmY7CisJCXVwcGVyYml0ID0gKChjcHVpZCA+PiAyNCkgPDwgMTApIC8gYXNzb2M7CisKKwkJdmFfYWxpZ24ubWFzawkgID0gKHVwcGVyYml0IC0gMSkgJiBQQUdFX01BU0s7CisJCXZhX2FsaWduLmZsYWdzICAgID0gQUxJR05fVkFfMzIgfCBBTElHTl9WQV82NDsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBlYXJseV9pbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CisJdTMyIGR1bW15OworCiAJZWFybHlfaW5pdF9hbWRfbWMoYyk7CiAKIAkvKgpAQCAtNDQyLDIyICs0NzQsNyBAQAogCX0KICNlbmRpZgogCi0JLyogV2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nIG9ubHkgb25jZSAqLwotCWlmIChjICE9ICZib290X2NwdV9kYXRhKQotCQlyZXR1cm47Ci0KLQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MpKSB7Ci0KLQkJaWYgKGMtPng4NiA+IDB4MTAgfHwKLQkJICAgIChjLT54ODYgPT0gMHgxMCAmJiBjLT54ODZfbW9kZWwgPj0gMHgyKSkgewotCQkJdTY0IHZhbDsKLQotCQkJcmRtc3JsKE1TUl9LN19IV0NSLCB2YWwpOwotCQkJaWYgKCEodmFsICYgQklUKDI0KSkpCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyBGV19CVUcgIlRTQyBkb2Vzbid0IGNvdW50ICIKLQkJCQkJIndpdGggUDAgZnJlcXVlbmN5IVxuIik7Ci0JCX0KLQl9CisJcmRtc3Jfc2FmZShNU1JfQU1ENjRfUEFUQ0hfTEVWRUwsICZjLT5taWNyb2NvZGUsICZkdW1teSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCkBAIC02NzksNiArNjk2LDcgQEAKIAkuY19zaXplX2NhY2hlCT0gYW1kX3NpemVfY2FjaGUsCiAjZW5kaWYKIAkuY19lYXJseV9pbml0ICAgPSBlYXJseV9pbml0X2FtZCwKKwkuY19ic3BfaW5pdAk9IGJzcF9pbml0X2FtZCwKIAkuY19pbml0CQk9IGluaXRfYW1kLAogCS5jX3g4Nl92ZW5kb3IJPSBYODZfVkVORE9SX0FNRCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCA2MjE4NDM5Li5hYTAwM2IxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vc3RhY2twcm90ZWN0b3IuaD4KICNpbmNsdWRlIDxhc20vcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9hcmNocmFuZG9tLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CkBAIC02ODEsNiArNjgyLDkgQEAKIAlmaWx0ZXJfY3B1aWRfZmVhdHVyZXMoYywgZmFsc2UpOwogCiAJc2V0dXBfc21lcChjKTsKKworCWlmICh0aGlzX2NwdS0+Y19ic3BfaW5pdCkKKwkJdGhpc19jcHUtPmNfYnNwX2luaXQoYyk7CiB9CiAKIHZvaWQgX19pbml0IGVhcmx5X2NwdV9pbml0KHZvaWQpCkBAIC04NTcsNiArODYxLDcgQEAKICNlbmRpZgogCiAJaW5pdF9oeXBlcnZpc29yKGMpOworCXg4Nl9pbml0X3JkcmFuZChjKTsKIAogCS8qCiAJICogQ2xlYXIvU2V0IGFsbCBmbGFncyBvdmVycmlkZW4gYnkgb3B0aW9ucywgbmVlZCBkbyBpdApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHUuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1LmgKaW5kZXggZTc2NTYzMy4uMWIyMmRjYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHUuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdS5oCkBAIC0xOCw2ICsxOCw3IEBACiAJc3RydWN0CQljcHVfbW9kZWxfaW5mbyBjX21vZGVsc1s0XTsKIAogCXZvaWQgICAgICAgICAgICAoKmNfZWFybHlfaW5pdCkoc3RydWN0IGNwdWluZm9feDg2ICopOworCXZvaWQJCSgqY19ic3BfaW5pdCkoc3RydWN0IGNwdWluZm9feDg2ICopOwogCXZvaWQJCSgqY19pbml0KShzdHJ1Y3QgY3B1aW5mb194ODYgKik7CiAJdm9pZAkJKCpjX2lkZW50aWZ5KShzdHJ1Y3QgY3B1aW5mb194ODYgKik7CiAJdW5zaWduZWQgaW50CSgqY19zaXplX2NhY2hlKShzdHJ1Y3QgY3B1aW5mb194ODYgKiwgdW5zaWduZWQgaW50KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCBlZDYwODZlLi41MjMxMzEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC00Nyw2ICs0NywxNSBAQAogCQkoYy0+eDg2ID09IDB4NiAmJiBjLT54ODZfbW9kZWwgPj0gMHgwZSkpCiAJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQyk7CiAKKwlpZiAoYy0+eDg2ID49IDYgJiYgIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfSUE2NCkpIHsKKwkJdW5zaWduZWQgbG93ZXJfd29yZDsKKworCQl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOworCQkvKiBSZXF1aXJlZCBieSB0aGUgU0RNICovCisJCXN5bmNfY29yZSgpOworCQlyZG1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIGxvd2VyX3dvcmQsIGMtPm1pY3JvY29kZSk7CisJfQorCiAJLyoKIAkgKiBBdG9tIGVycmF0dW0gQUFFNDQvQUFGNDAvQUFHMzgvQUFINDE6CiAJICoKQEAgLTU1LDE3ICs2NCwxMCBAQAogCSAqIG5lZWQgdGhlIG1pY3JvY29kZSB0byBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuLi4gc28gaWYgaXQgaXMKIAkgKiBub3QsIHJlY29tbWVuZCBhIEJJT1MgdXBkYXRlIGFuZCBkaXNhYmxlIGxhcmdlIHBhZ2VzLgogCSAqLwotCWlmIChjLT54ODYgPT0gNiAmJiBjLT54ODZfbW9kZWwgPT0gMHgxYyAmJiBjLT54ODZfbWFzayA8PSAyKSB7Ci0JCXUzMiB1Y29kZSwganVuazsKLQotCQl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOwotCQlzeW5jX2NvcmUoKTsKLQkJcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCBqdW5rLCB1Y29kZSk7Ci0KLQkJaWYgKHVjb2RlIDwgMHgyMGUpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkF0b20gUFNFIGVycmF0dW0gZGV0ZWN0ZWQsIEJJT1MgbWljcm9jb2RlIHVwZGF0ZSByZWNvbW1lbmRlZFxuIik7Ci0JCQljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1BTRSk7Ci0JCX0KKwlpZiAoYy0+eDg2ID09IDYgJiYgYy0+eDg2X21vZGVsID09IDB4MWMgJiYgYy0+eDg2X21hc2sgPD0gMiAmJgorCSAgICBjLT5taWNyb2NvZGUgPCAweDIwZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBdG9tIFBTRSBlcnJhdHVtIGRldGVjdGVkLCBCSU9TIG1pY3JvY29kZSB1cGRhdGUgcmVjb21tZW5kZWRcbiIpOworCQljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1BTRSk7CiAJfQogCiAjaWZkZWYgQ09ORklHX1g4Nl82NApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKaW5kZXggYzEwNWM1My4uYTNiMDgxMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCkBAIC0xNTEsMjggKzE1MSwxNyBAQAogCXUzMiBmdWxsOwogfTsKIAotc3RydWN0IGFtZF9sM19jYWNoZSB7Ci0Jc3RydWN0CSBhbWRfbm9ydGhicmlkZ2UgKm5iOwotCXVuc2lnbmVkIGluZGljZXM7Ci0JdTgJIHN1YmNhY2hlc1s0XTsKLX07Ci0KLXN0cnVjdCBfY3B1aWQ0X2luZm8gewotCXVuaW9uIF9jcHVpZDRfbGVhZl9lYXggZWF4OwotCXVuaW9uIF9jcHVpZDRfbGVhZl9lYnggZWJ4OwotCXVuaW9uIF9jcHVpZDRfbGVhZl9lY3ggZWN4OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlzdHJ1Y3QgYW1kX2wzX2NhY2hlICpsMzsKLQlERUNMQVJFX0JJVE1BUChzaGFyZWRfY3B1X21hcCwgTlJfQ1BVUyk7Ci19OwotCi0vKiBzdWJzZXQgb2YgYWJvdmUgX2NwdWlkNF9pbmZvIHcvbyBzaGFyZWRfY3B1X21hcCAqLwogc3RydWN0IF9jcHVpZDRfaW5mb19yZWdzIHsKIAl1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4IGVheDsKIAl1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4IGVieDsKIAl1bmlvbiBfY3B1aWQ0X2xlYWZfZWN4IGVjeDsKIAl1bnNpZ25lZCBsb25nIHNpemU7Ci0Jc3RydWN0IGFtZF9sM19jYWNoZSAqbDM7CisJc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmI7Cit9OworCitzdHJ1Y3QgX2NwdWlkNF9pbmZvIHsKKwlzdHJ1Y3QgX2NwdWlkNF9pbmZvX3JlZ3MgYmFzZTsKKwlERUNMQVJFX0JJVE1BUChzaGFyZWRfY3B1X21hcCwgTlJfQ1BVUyk7CiB9OwogCiB1bnNpZ25lZCBzaG9ydAkJCW51bV9jYWNoZV9sZWF2ZXM7CkBAIC0zMTQsMTYgKzMwMywyMyBAQAogLyoKICAqIEwzIGNhY2hlIGRlc2NyaXB0b3JzCiAgKi8KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBhbWRfY2FsY19sM19pbmRpY2VzKHN0cnVjdCBhbWRfbDNfY2FjaGUgKmwzKQorc3RhdGljIHZvaWQgX19jcHVpbml0IGFtZF9jYWxjX2wzX2luZGljZXMoc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmIpCiB7CisJc3RydWN0IGFtZF9sM19jYWNoZSAqbDMgPSAmbmItPmwzX2NhY2hlOwogCXVuc2lnbmVkIGludCBzYzAsIHNjMSwgc2MyLCBzYzM7CiAJdTMyIHZhbCA9IDA7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQobDMtPm5iLT5taXNjLCAweDFDNCwgJnZhbCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG5iLT5taXNjLCAweDFDNCwgJnZhbCk7CiAKIAkvKiBjYWxjdWxhdGUgc3ViY2FjaGUgc2l6ZXMgKi8KIAlsMy0+c3ViY2FjaGVzWzBdID0gc2MwID0gISh2YWwgJiBCSVQoMCkpOwogCWwzLT5zdWJjYWNoZXNbMV0gPSBzYzEgPSAhKHZhbCAmIEJJVCg0KSk7CisKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHgxNSkgeworCQlsMy0+c3ViY2FjaGVzWzBdID0gc2MwICs9ICEodmFsICYgQklUKDEpKTsKKwkJbDMtPnN1YmNhY2hlc1sxXSA9IHNjMSArPSAhKHZhbCAmIEJJVCg1KSk7CisJfQorCiAJbDMtPnN1YmNhY2hlc1syXSA9IHNjMiA9ICEodmFsICYgQklUKDgpKSAgKyAhKHZhbCAmIEJJVCg5KSk7CiAJbDMtPnN1YmNhY2hlc1szXSA9IHNjMyA9ICEodmFsICYgQklUKDEyKSkgKyAhKHZhbCAmIEJJVCgxMykpOwogCkBAIC0zMzMsMzMgKzMyOSwxNiBAQAogc3RhdGljIHZvaWQgX19jcHVpbml0IGFtZF9pbml0X2wzX2NhY2hlKHN0cnVjdCBfY3B1aWQ0X2luZm9fcmVncyAqdGhpc19sZWFmLAogCQkJCQlpbnQgaW5kZXgpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhbWRfbDNfY2FjaGUgKl9fY3B1aW5pdGRhdGEgbDNfY2FjaGVzOwogCWludCBub2RlOwogCiAJLyogb25seSBmb3IgTDMsIGFuZCBub3QgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzICovCi0JaWYgKGluZGV4IDwgMyB8fCBhbWRfbmJfbnVtKCkgPT0gMCkKKwlpZiAoaW5kZXggPCAzKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIFN0cmljdGx5IHNwZWFraW5nLCB0aGUgYW1vdW50IGluIEBzaXplIGJlbG93IGlzIGxlYWtlZCBzaW5jZSBpdCBpcwotCSAqIG5ldmVyIGZyZWVkIGJ1dCB0aGlzIGlzIGRvbmUgb25seSBvbiBzaHV0ZG93biBzbyBpdCBkb2Vzbid0IG1hdHRlci4KLQkgKi8KLQlpZiAoIWwzX2NhY2hlcykgewotCQlpbnQgc2l6ZSA9IGFtZF9uYl9udW0oKSAqIHNpemVvZihzdHJ1Y3QgYW1kX2wzX2NhY2hlKTsKLQotCQlsM19jYWNoZXMgPSBremFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWwzX2NhY2hlcykKLQkJCXJldHVybjsKLQl9Ci0KIAlub2RlID0gYW1kX2dldF9uYl9pZChzbXBfcHJvY2Vzc29yX2lkKCkpOwotCi0JaWYgKCFsM19jYWNoZXNbbm9kZV0ubmIpIHsKLQkJbDNfY2FjaGVzW25vZGVdLm5iID0gbm9kZV90b19hbWRfbmIobm9kZSk7Ci0JCWFtZF9jYWxjX2wzX2luZGljZXMoJmwzX2NhY2hlc1tub2RlXSk7Ci0JfQotCi0JdGhpc19sZWFmLT5sMyA9ICZsM19jYWNoZXNbbm9kZV07CisJdGhpc19sZWFmLT5uYiA9IG5vZGVfdG9fYW1kX25iKG5vZGUpOworCWlmICh0aGlzX2xlYWYtPm5iICYmICF0aGlzX2xlYWYtPm5iLT5sM19jYWNoZS5pbmRpY2VzKQorCQlhbWRfY2FsY19sM19pbmRpY2VzKHRoaXNfbGVhZi0+bmIpOwogfQogCiAvKgpAQCAtMzY5LDExICszNDgsMTEgQEAKICAqCiAgKiBAcmV0dXJuczogdGhlIGRpc2FibGVkIGluZGV4IGlmIHVzZWQgb3IgbmVnYXRpdmUgdmFsdWUgaWYgc2xvdCBmcmVlLgogICovCi1pbnQgYW1kX2dldF9sM19kaXNhYmxlX3Nsb3Qoc3RydWN0IGFtZF9sM19jYWNoZSAqbDMsIHVuc2lnbmVkIHNsb3QpCitpbnQgYW1kX2dldF9sM19kaXNhYmxlX3Nsb3Qoc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmIsIHVuc2lnbmVkIHNsb3QpCiB7CiAJdW5zaWduZWQgaW50IHJlZyA9IDA7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQobDMtPm5iLT5taXNjLCAweDFCQyArIHNsb3QgKiA0LCAmcmVnKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQobmItPm1pc2MsIDB4MUJDICsgc2xvdCAqIDQsICZyZWcpOwogCiAJLyogY2hlY2sgd2hldGhlciB0aGlzIHNsb3QgaXMgYWN0aXZhdGVkIGFscmVhZHkgKi8KIAlpZiAocmVnICYgKDNVTCA8PCAzMCkpCkBAIC0zODcsMTEgKzM2NiwxMCBAQAogewogCWludCBpbmRleDsKIAotCWlmICghdGhpc19sZWFmLT5sMyB8fAotCSAgICAhYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19JTkRFWF9ESVNBQkxFKSkKKwlpZiAoIXRoaXNfbGVhZi0+YmFzZS5uYiB8fCAhYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19JTkRFWF9ESVNBQkxFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpbmRleCA9IGFtZF9nZXRfbDNfZGlzYWJsZV9zbG90KHRoaXNfbGVhZi0+bDMsIHNsb3QpOworCWluZGV4ID0gYW1kX2dldF9sM19kaXNhYmxlX3Nsb3QodGhpc19sZWFmLT5iYXNlLm5iLCBzbG90KTsKIAlpZiAoaW5kZXggPj0gMCkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGluZGV4KTsKIApAQCAtNDA4LDcgKzM4Niw3IEBACiBTSE9XX0NBQ0hFX0RJU0FCTEUoMCkKIFNIT1dfQ0FDSEVfRElTQUJMRSgxKQogCi1zdGF0aWMgdm9pZCBhbWRfbDNfZGlzYWJsZV9pbmRleChzdHJ1Y3QgYW1kX2wzX2NhY2hlICpsMywgaW50IGNwdSwKK3N0YXRpYyB2b2lkIGFtZF9sM19kaXNhYmxlX2luZGV4KHN0cnVjdCBhbWRfbm9ydGhicmlkZ2UgKm5iLCBpbnQgY3B1LAogCQkJCSB1bnNpZ25lZCBzbG90LCB1bnNpZ25lZCBsb25nIGlkeCkKIHsKIAlpbnQgaTsKQEAgLTQyMSwxMCArMzk5LDEwIEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQl1MzIgcmVnID0gaWR4IHwgKGkgPDwgMjApOwogCi0JCWlmICghbDMtPnN1YmNhY2hlc1tpXSkKKwkJaWYgKCFuYi0+bDNfY2FjaGUuc3ViY2FjaGVzW2ldKQogCQkJY29udGludWU7CiAKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChsMy0+bmItPm1pc2MsIDB4MUJDICsgc2xvdCAqIDQsIHJlZyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQobmItPm1pc2MsIDB4MUJDICsgc2xvdCAqIDQsIHJlZyk7CiAKIAkJLyoKIAkJICogV2UgbmVlZCB0byBXQklOVkQgb24gYSBjb3JlIG9uIHRoZSBub2RlIGNvbnRhaW5pbmcgdGhlIEwzCkBAIC00MzQsNyArNDEyLDcgQEAKIAkJd2JpbnZkX29uX2NwdShjcHUpOwogCiAJCXJlZyB8PSBCSVQoMzEpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGwzLT5uYi0+bWlzYywgMHgxQkMgKyBzbG90ICogNCwgcmVnKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChuYi0+bWlzYywgMHgxQkMgKyBzbG90ICogNCwgcmVnKTsKIAl9CiB9CiAKQEAgLTQ0OCwyNCArNDI2LDI0IEBACiAgKgogICogQHJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBzdGF0dXMgb24gZmFpbHVyZQogICovCi1pbnQgYW1kX3NldF9sM19kaXNhYmxlX3Nsb3Qoc3RydWN0IGFtZF9sM19jYWNoZSAqbDMsIGludCBjcHUsIHVuc2lnbmVkIHNsb3QsCitpbnQgYW1kX3NldF9sM19kaXNhYmxlX3Nsb3Qoc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmIsIGludCBjcHUsIHVuc2lnbmVkIHNsb3QsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBpbmRleCkKIHsKIAlpbnQgcmV0ID0gMDsKIAogCS8qICBjaGVjayBpZiBAc2xvdCBpcyBhbHJlYWR5IHVzZWQgb3IgdGhlIGluZGV4IGlzIGFscmVhZHkgZGlzYWJsZWQgKi8KLQlyZXQgPSBhbWRfZ2V0X2wzX2Rpc2FibGVfc2xvdChsMywgc2xvdCk7CisJcmV0ID0gYW1kX2dldF9sM19kaXNhYmxlX3Nsb3QobmIsIHNsb3QpOwogCWlmIChyZXQgPj0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaW5kZXggPiBsMy0+aW5kaWNlcykKKwlpZiAoaW5kZXggPiBuYi0+bDNfY2FjaGUuaW5kaWNlcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBjaGVjayB3aGV0aGVyIHRoZSBvdGhlciBzbG90IGhhcyBkaXNhYmxlZCB0aGUgc2FtZSBpbmRleCBhbHJlYWR5ICovCi0JaWYgKGluZGV4ID09IGFtZF9nZXRfbDNfZGlzYWJsZV9zbG90KGwzLCAhc2xvdCkpCisJaWYgKGluZGV4ID09IGFtZF9nZXRfbDNfZGlzYWJsZV9zbG90KG5iLCAhc2xvdCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYW1kX2wzX2Rpc2FibGVfaW5kZXgobDMsIGNwdSwgc2xvdCwgaW5kZXgpOworCWFtZF9sM19kaXNhYmxlX2luZGV4KG5iLCBjcHUsIHNsb3QsIGluZGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNDgwLDggKzQ1OCw3IEBACiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKCF0aGlzX2xlYWYtPmwzIHx8Ci0JICAgICFhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX0lOREVYX0RJU0FCTEUpKQorCWlmICghdGhpc19sZWFmLT5iYXNlLm5iIHx8ICFhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX0lOREVYX0RJU0FCTEUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNwdSA9IGNwdW1hc2tfZmlyc3QodG9fY3B1bWFzayh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7CkBAIC00ODksNyArNDY2LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVyciA9IGFtZF9zZXRfbDNfZGlzYWJsZV9zbG90KHRoaXNfbGVhZi0+bDMsIGNwdSwgc2xvdCwgdmFsKTsKKwllcnIgPSBhbWRfc2V0X2wzX2Rpc2FibGVfc2xvdCh0aGlzX2xlYWYtPmJhc2UubmIsIGNwdSwgc2xvdCwgdmFsKTsKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPT0gLUVFWElTVCkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkwzIGRpc2FibGUgc2xvdCAlZCBpbiB1c2UhXG4iLApAQCAtNTE4LDcgKzQ5NSw3IEBACiBzdGF0aWMgc3NpemVfdAogc2hvd19zdWJjYWNoZXMoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JaWYgKCF0aGlzX2xlYWYtPmwzIHx8ICFhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX1BBUlRJVElPTklORykpCisJaWYgKCF0aGlzX2xlYWYtPmJhc2UubmIgfHwgIWFtZF9uYl9oYXNfZmVhdHVyZShBTURfTkJfTDNfUEFSVElUSU9OSU5HKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgYW1kX2dldF9zdWJjYWNoZXMoY3B1KSk7CkBAIC01MzMsNyArNTEwLDcgQEAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoIXRoaXNfbGVhZi0+bDMgfHwgIWFtZF9uYl9oYXNfZmVhdHVyZShBTURfTkJfTDNfUEFSVElUSU9OSU5HKSkKKwlpZiAoIXRoaXNfbGVhZi0+YmFzZS5uYiB8fCAhYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19QQVJUSVRJT05JTkcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmdmFsKSA8IDApCkBAIC03NjksNyArNzQ2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAl0aGlzX2xlYWYgPSBDUFVJRDRfSU5GT19JRFgoY3B1LCBpbmRleCk7Ci0JbnVtX3RocmVhZHNfc2hhcmluZyA9IDEgKyB0aGlzX2xlYWYtPmVheC5zcGxpdC5udW1fdGhyZWFkc19zaGFyaW5nOworCW51bV90aHJlYWRzX3NoYXJpbmcgPSAxICsgdGhpc19sZWFmLT5iYXNlLmVheC5zcGxpdC5udW1fdGhyZWFkc19zaGFyaW5nOwogCiAJaWYgKG51bV90aHJlYWRzX3NoYXJpbmcgPT0gMSkKIAkJY3B1bWFza19zZXRfY3B1KGNwdSwgdG9fY3B1bWFzayh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7CkBAIC04MjAsMjkgKzc5NywxOSBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fY2FjaGVfbGVhdmVzOyBpKyspCiAJCWNhY2hlX3JlbW92ZV9zaGFyZWRfY3B1X21hcChjcHUsIGkpOwogCi0Ja2ZyZWUocGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSktPmwzKTsKIAlrZnJlZShwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgY3B1KSk7CiAJcGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSkgPSBOVUxMOwogfQogCi1zdGF0aWMgaW50Ci1fX2NwdWluaXQgY3B1aWQ0X2NhY2hlX2xvb2t1cChpbnQgaW5kZXgsIHN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZikKLXsKLQlzdHJ1Y3QgX2NwdWlkNF9pbmZvX3JlZ3MgKmxlYWZfcmVncyA9Ci0JCShzdHJ1Y3QgX2NwdWlkNF9pbmZvX3JlZ3MgKil0aGlzX2xlYWY7Ci0KLQlyZXR1cm4gY3B1aWQ0X2NhY2hlX2xvb2t1cF9yZWdzKGluZGV4LCBsZWFmX3JlZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgZ2V0X2NwdV9sZWF2ZXModm9pZCAqX3JldHZhbCkKIHsKIAlpbnQgaiwgKnJldHZhbCA9IF9yZXR2YWwsIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCS8qIERvIGNwdWlkIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyAqLwogCWZvciAoaiA9IDA7IGogPCBudW1fY2FjaGVfbGVhdmVzOyBqKyspIHsKLQkJc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmOwotCQl0aGlzX2xlYWYgPSBDUFVJRDRfSU5GT19JRFgoY3B1LCBqKTsKLQkJKnJldHZhbCA9IGNwdWlkNF9jYWNoZV9sb29rdXAoaiwgdGhpc19sZWFmKTsKKwkJc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmID0gQ1BVSUQ0X0lORk9fSURYKGNwdSwgaik7CisKKwkJKnJldHZhbCA9IGNwdWlkNF9jYWNoZV9sb29rdXBfcmVncyhqLCAmdGhpc19sZWFmLT5iYXNlKTsKIAkJaWYgKHVubGlrZWx5KCpyZXR2YWwgPCAwKSkgewogCQkJaW50IGk7CiAKQEAgLTkwMCwxNiArODY3LDE2IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCAodW5zaWduZWQgbG9uZyl0aGlzX2xlYWYtPm9iamVjdCArIHZhbCk7IFwKIH0KIAotc2hvd19vbmVfcGx1cyhsZXZlbCwgZWF4LnNwbGl0LmxldmVsLCAwKTsKLXNob3dfb25lX3BsdXMoY29oZXJlbmN5X2xpbmVfc2l6ZSwgZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUsIDEpOwotc2hvd19vbmVfcGx1cyhwaHlzaWNhbF9saW5lX3BhcnRpdGlvbiwgZWJ4LnNwbGl0LnBoeXNpY2FsX2xpbmVfcGFydGl0aW9uLCAxKTsKLXNob3dfb25lX3BsdXMod2F5c19vZl9hc3NvY2lhdGl2aXR5LCBlYnguc3BsaXQud2F5c19vZl9hc3NvY2lhdGl2aXR5LCAxKTsKLXNob3dfb25lX3BsdXMobnVtYmVyX29mX3NldHMsIGVjeC5zcGxpdC5udW1iZXJfb2Zfc2V0cywgMSk7CitzaG93X29uZV9wbHVzKGxldmVsLCBiYXNlLmVheC5zcGxpdC5sZXZlbCwgMCk7CitzaG93X29uZV9wbHVzKGNvaGVyZW5jeV9saW5lX3NpemUsIGJhc2UuZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUsIDEpOworc2hvd19vbmVfcGx1cyhwaHlzaWNhbF9saW5lX3BhcnRpdGlvbiwgYmFzZS5lYnguc3BsaXQucGh5c2ljYWxfbGluZV9wYXJ0aXRpb24sIDEpOworc2hvd19vbmVfcGx1cyh3YXlzX29mX2Fzc29jaWF0aXZpdHksIGJhc2UuZWJ4LnNwbGl0LndheXNfb2ZfYXNzb2NpYXRpdml0eSwgMSk7CitzaG93X29uZV9wbHVzKG51bWJlcl9vZl9zZXRzLCBiYXNlLmVjeC5zcGxpdC5udW1iZXJfb2Zfc2V0cywgMSk7CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfc2l6ZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwKIAkJCSB1bnNpZ25lZCBpbnQgY3B1KQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdUtcbiIsIHRoaXNfbGVhZi0+c2l6ZSAvIDEwMjQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdUtcbiIsIHRoaXNfbGVhZi0+YmFzZS5zaXplIC8gMTAyNCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfc2hhcmVkX2NwdV9tYXBfZnVuYyhzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsCkBAIC05NDYsNyArOTEzLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwKIAkJCSB1bnNpZ25lZCBpbnQgY3B1KQogewotCXN3aXRjaCAodGhpc19sZWFmLT5lYXguc3BsaXQudHlwZSkgeworCXN3aXRjaCAodGhpc19sZWFmLT5iYXNlLmVheC5zcGxpdC50eXBlKSB7CiAJY2FzZSBDQUNIRV9UWVBFX0RBVEE6CiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkRhdGFcbiIpOwogCWNhc2UgQ0FDSEVfVFlQRV9JTlNUOgpAQCAtMTEzNSw3ICsxMTAyLDcgQEAKIAogCQlrdHlwZV9jYWNoZS5kZWZhdWx0X2F0dHJzID0gZGVmYXVsdF9hdHRyczsKICNpZmRlZiBDT05GSUdfQU1EX05CCi0JCWlmICh0aGlzX2xlYWYtPmwzKQorCQlpZiAodGhpc19sZWFmLT5iYXNlLm5iKQogCQkJa3R5cGVfY2FjaGUuZGVmYXVsdF9hdHRycyA9IGFtZF9sM19hdHRycygpOwogI2VuZGlmCiAJCXJldHZhbCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCYodGhpc19vYmplY3QtPmtvYmopLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLWFwZWkuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1hcGVpLmMKaW5kZXggODM5MzBkZS4uNTA3ZWE1OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLWFwZWkuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UtYXBlaS5jCkBAIC0yOCw2ICsyOCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9jcGVyLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCmluZGV4IGZjZTUxYWQxLi4zNjIwNTZhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYwpAQCAtMzYsOCArMzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZWRhY19tY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFfd29yay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KQEAgLTE0NCwyMyArMTQ0LDIwIEBACiB2b2lkIG1jZV9sb2coc3RydWN0IG1jZSAqbWNlKQogewogCXVuc2lnbmVkIG5leHQsIGVudHJ5OworCWludCByZXQgPSAwOwogCiAJLyogRW1pdCB0aGUgdHJhY2UgcmVjb3JkOiAqLwogCXRyYWNlX21jZV9yZWNvcmQobWNlKTsKIAorCXJldCA9IGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIDAsIG1jZSk7CisJaWYgKHJldCA9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuOworCiAJbWNlLT5maW5pc2hlZCA9IDA7CiAJd21iKCk7CiAJZm9yICg7OykgewogCQllbnRyeSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVja19tY2UobWNlbG9nLm5leHQpOwogCQlmb3IgKDs7KSB7Ci0JCQkvKgotCQkJICogSWYgZWRhY19tY2UgaXMgZW5hYmxlZCwgaXQgd2lsbCBjaGVjayB0aGUgZXJyb3IgdHlwZQotCQkJICogYW5kIHdpbGwgcHJvY2VzcyBpdCwgaWYgaXQgaXMgYSBrbm93biBlcnJvci4KLQkJCSAqIE90aGVyd2lzZSwgdGhlIGVycm9yIHdpbGwgYmUgc2VudCB0aHJvdWdoIG1jZWxvZwotCQkJICogaW50ZXJmYWNlCi0JCQkgKi8KLQkJCWlmIChlZGFjX21jZV9wYXJzZShtY2UpKQotCQkJCXJldHVybjsKIAogCQkJLyoKIAkJCSAqIFdoZW4gdGhlIGJ1ZmZlciBmaWxscyB1cCBkaXNjYXJkIG5ldyBlbnRyaWVzLgpAQCAtMjE3LDggKzIxNCwxMyBAQAogCQlwcl9jb250KCJNSVNDICVsbHggIiwgbS0+bWlzYyk7CiAKIAlwcl9jb250KCJcbiIpOwotCXByX2VtZXJnKEhXX0VSUiAiUFJPQ0VTU09SICV1OiV4IFRJTUUgJWxsdSBTT0NLRVQgJXUgQVBJQyAleFxuIiwKLQkJbS0+Y3B1dmVuZG9yLCBtLT5jcHVpZCwgbS0+dGltZSwgbS0+c29ja2V0aWQsIG0tPmFwaWNpZCk7CisJLyoKKwkgKiBOb3RlIHRoaXMgb3V0cHV0IGlzIHBhcnNlZCBieSBleHRlcm5hbCB0b29scyBhbmQgb2xkIGZpZWxkcworCSAqIHNob3VsZCBub3QgYmUgY2hhbmdlZC4KKwkgKi8KKwlwcl9lbWVyZyhIV19FUlIgIlBST0NFU1NPUiAldToleCBUSU1FICVsbHUgU09DS0VUICV1IEFQSUMgJXggbWljcm9jb2RlICV4XG4iLAorCQltLT5jcHV2ZW5kb3IsIG0tPmNwdWlkLCBtLT50aW1lLCBtLT5zb2NrZXRpZCwgbS0+YXBpY2lkLAorCQljcHVfZGF0YShtLT5leHRjcHUpLm1pY3JvY29kZSk7CiAKIAkvKgogCSAqIFByaW50IG91dCBodW1hbi1yZWFkYWJsZSBkZXRhaWxzIGFib3V0IHRoZSBNQ0UgZXJyb3IsCkBAIC01NTEsMTAgKzU1Myw4IEBACiAJCSAqIERvbid0IGdldCB0aGUgSVAgaGVyZSBiZWNhdXNlIGl0J3MgdW5saWtlbHkgdG8KIAkJICogaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoZSBhY3R1YWwgZXJyb3IgbG9jYXRpb24uCiAJCSAqLwotCQlpZiAoIShmbGFncyAmIE1DUF9ET05UTE9HKSAmJiAhbWNlX2RvbnRfbG9nX2NlKSB7CisJCWlmICghKGZsYWdzICYgTUNQX0RPTlRMT0cpICYmICFtY2VfZG9udF9sb2dfY2UpCiAJCQltY2VfbG9nKCZtKTsKLQkJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIDAsICZtKTsKLQkJfQogCiAJCS8qCiAJCSAqIENsZWFyIHN0YXRlIGZvciB0aGlzIGJhbmsuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYwppbmRleCAyN2M2MjUxLi43ODdlMDZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMKaW5kZXggZDk0NGJmNi4uMGE2MzBkZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tc2h5cGVydi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYwpAQCAtMTEsNiArMTEsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgpAQCAtMzYsNiArMzgsMjUgQEAKIAkJIW1lbWNtcCgiTWljcm9zb2Z0IEh2IiwgaHlwX3NpZ25hdHVyZSwgMTIpOwogfQogCitzdGF0aWMgY3ljbGVfdCByZWFkX2h2X2Nsb2NrKHN0cnVjdCBjbG9ja3NvdXJjZSAqYXJnKQoreworCWN5Y2xlX3QgY3VycmVudF90aWNrOworCS8qCisJICogUmVhZCB0aGUgcGFydGl0aW9uIGNvdW50ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IHRpY2sgY291bnQuIFRoaXMgY291bnQKKwkgKiBpcyBzZXQgdG8gMCB3aGVuIHRoZSBwYXJ0aXRpb24gaXMgY3JlYXRlZCBhbmQgaXMgaW5jcmVtZW50ZWQgaW4KKwkgKiAxMDAgbmFub3NlY29uZCB1bml0cy4KKwkgKi8KKwlyZG1zcmwoSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVCwgY3VycmVudF90aWNrKTsKKwlyZXR1cm4gY3VycmVudF90aWNrOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGh5cGVydl9jcyA9IHsKKwkubmFtZQkJPSAiaHlwZXJ2X2Nsb2Nrc291cmNlIiwKKwkucmF0aW5nCQk9IDQwMCwgLyogdXNlIHRoaXMgd2hlbiBydW5uaW5nIG9uIEh5cGVydiovCisJLnJlYWQJCT0gcmVhZF9odl9jbG9jaywKKwkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBtc19oeXBlcnZfaW5pdF9wbGF0Zm9ybSh2b2lkKQogewogCS8qCkBAIC00Niw2ICs2Nyw4IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJIeXBlclY6IGZlYXR1cmVzIDB4JXgsIGhpbnRzIDB4JXhcbiIsCiAJICAgICAgIG1zX2h5cGVydi5mZWF0dXJlcywgbXNfaHlwZXJ2LmhpbnRzKTsKKworCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZoeXBlcnZfY3MsIE5TRUNfUEVSX1NFQy8xMDApOwogfQogCiBjb25zdCBfX3JlZmNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfbXNfaHlwZXJ2ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYwppbmRleCBlMDljYTIwLi4yYmU1ZWJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3Byb2MuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcHJvYy5jCmluZGV4IDYyYWM4Y2IuLjE0YjIzMTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcHJvYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcHJvYy5jCkBAIC04NSw2ICs4NSw4IEBACiAJCXNlcV9wcmludGYobSwgInN0ZXBwaW5nXHQ6ICVkXG4iLCBjLT54ODZfbWFzayk7CiAJZWxzZQogCQlzZXFfcHJpbnRmKG0sICJzdGVwcGluZ1x0OiB1bmtub3duXG4iKTsKKwlpZiAoYy0+bWljcm9jb2RlKQorCQlzZXFfcHJpbnRmKG0sICJtaWNyb2NvZGVcdDogMHgleFxuIiwgYy0+bWljcm9jb2RlKTsKIAogCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1RTQykpIHsKIAkJdW5zaWduZWQgaW50IGZyZXEgPSBjcHVmcmVxX3F1aWNrX2dldChjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9yZHJhbmQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcmRyYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjYTI4NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcmRyYW5kLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yczogRmVuZ2h1YSBZdSA8ZmVuZ2h1YS55dUBpbnRlbC5jb20+LAorICogICAgICAgICAgSC4gUGV0ZXIgQW52aW4gPGhwYUBsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vYXJjaHJhbmRvbS5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorCitzdGF0aWMgaW50IF9faW5pdCB4ODZfcmRyYW5kX3NldHVwKGNoYXIgKnMpCit7CisJc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9SRFJBTkQpOworCXJldHVybiAxOworfQorX19zZXR1cCgibm9yZHJhbmQiLCB4ODZfcmRyYW5kX3NldHVwKTsKKworLyogV2UgY2FuJ3QgdXNlIGFyY2hfZ2V0X3JhbmRvbV9sb25nKCkgaGVyZSBzaW5jZSBhbHRlcm5hdGl2ZXMgaGF2ZW4ndCBydW4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJkcmFuZF9sb25nKHVuc2lnbmVkIGxvbmcgKnYpCit7CisJaW50IG9rOworCWFzbSB2b2xhdGlsZSgiMTogIiBSRFJBTkRfTE9ORyAiXG5cdCIKKwkJICAgICAiamMgMmZcblx0IgorCQkgICAgICJkZWNsICUwXG5cdCIKKwkJICAgICAiam56IDFiXG5cdCIKKwkJICAgICAiMjoiCisJCSAgICAgOiAiPXIiIChvayksICI9YSIgKCp2KQorCQkgICAgIDogIjAiIChSRFJBTkRfUkVUUllfTE9PUFMpKTsKKwlyZXR1cm4gb2s7Cit9CisKKy8qCisgKiBGb3JjZSBhIHJlc2VlZCBjeWNsZTsgd2UgYXJlIGFyY2hpdGVjdHVyYWxseSBndWFyYW50ZWVkIGEgcmVzZWVkCisgKiBhZnRlciBubyBtb3JlIHRoYW4gNTEyIDEyOC1iaXQgY2h1bmtzIG9mIHJhbmRvbSBkYXRhLiAgVGhpcyBhbHNvCisgKiBhY3RzIGFzIGEgdGVzdCBvZiB0aGUgQ1BVIGNhcGFiaWxpdHkuCisgKi8KKyNkZWZpbmUgUkVTRUVEX0xPT1AgKCg1MTIqMTI4KS9zaXplb2YodW5zaWduZWQgbG9uZykpCisKK3ZvaWQgX19jcHVpbml0IHg4Nl9pbml0X3JkcmFuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisjaWZkZWYgQ09ORklHX0FSQ0hfUkFORE9NCisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGksIGNvdW50LCBvazsKKworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9SRFJBTkQpKQorCQlyZXR1cm47CQkvKiBOb3RoaW5nIHRvIGRvICovCisKKwlmb3IgKGNvdW50ID0gaSA9IDA7IGkgPCBSRVNFRURfTE9PUDsgaSsrKSB7CisJCW9rID0gcmRyYW5kX2xvbmcoJnRtcCk7CisJCWlmIChvaykKKwkJCWNvdW50Kys7CisJfQorCisJaWYgKGNvdW50ICE9IFJFU0VFRF9MT09QKQorCQljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1JEUkFORCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZGV2aWNldHJlZS5jCmluZGV4IGE2MjFmMzQuLjUyODIxNzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYwpAQCAtMiw2ICsyLDcgQEAKICAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBPRiBjYWxsYmFja3MuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jIGIvYXJjaC94ODYva2VybmVsL2U4MjAuYwppbmRleCAzZTJlZjg0Li4zMDNhMGU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCmluZGV4IDRhZWNjNTQuLmI5NDZhOWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKaW5kZXggNmMwODAyZS4uNDI5ZTBjOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2p1bXBfbGFiZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9qdW1wX2xhYmVsLmMKaW5kZXggY2FjZGQ0Ni4uZWE5ZDVmMmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9qdW1wX2xhYmVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtMjQsOCArMjQsOSBAQAogCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiB9OwogCi12b2lkIGFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0oc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAotCQkJICAgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpCitzdGF0aWMgdm9pZCBfX2p1bXBfbGFiZWxfdHJhbnNmb3JtKHN0cnVjdCBqdW1wX2VudHJ5ICplbnRyeSwKKwkJCQkgICBlbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlLAorCQkJCSAgIHZvaWQgKigqcG9rZXIpKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpKQogewogCXVuaW9uIGp1bXBfY29kZV91bmlvbiBjb2RlOwogCkBAIC0zNSwxNyArMzYsMjQgQEAKIAkJCQkoZW50cnktPmNvZGUgKyBKVU1QX0xBQkVMX05PUF9TSVpFKTsKIAl9IGVsc2UKIAkJbWVtY3B5KCZjb2RlLCBpZGVhbF9ub3BzW05PUF9BVE9NSUM1XSwgSlVNUF9MQUJFTF9OT1BfU0laRSk7CisKKwkoKnBva2VyKSgodm9pZCAqKWVudHJ5LT5jb2RlLCAmY29kZSwgSlVNUF9MQUJFTF9OT1BfU0laRSk7Cit9CisKK3ZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybShzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCisJCQkgICAgICAgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSkKK3sKIAlnZXRfb25saW5lX2NwdXMoKTsKIAltdXRleF9sb2NrKCZ0ZXh0X211dGV4KTsKLQl0ZXh0X3Bva2Vfc21wKCh2b2lkICopZW50cnktPmNvZGUsICZjb2RlLCBKVU1QX0xBQkVMX05PUF9TSVpFKTsKKwlfX2p1bXBfbGFiZWxfdHJhbnNmb3JtKGVudHJ5LCB0eXBlLCB0ZXh0X3Bva2Vfc21wKTsKIAltdXRleF91bmxvY2soJnRleHRfbXV0ZXgpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCi12b2lkIF9faW5pdF9vcl9tb2R1bGUgYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShqdW1wX2xhYmVsX3QgYWRkcikKK3ZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAorCQkJCSAgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpCiB7Ci0JdGV4dF9wb2tlX2Vhcmx5KCh2b2lkICopYWRkciwgaWRlYWxfbm9wc1tOT1BfQVRPTUlDNV0sCi0JCQlKVU1QX0xBQkVMX05PUF9TSVpFKTsKKwlfX2p1bXBfbGFiZWxfdHJhbnNmb3JtKGVudHJ5LCB0eXBlLCB0ZXh0X3Bva2VfZWFybHkpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCmluZGV4IDU5MWJlMGUuLmQ0OTQ3OTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9hbWQuYwpAQCAtNzQsMTQgKzc0LDEzIEBACiBzdGF0aWMgaW50IGNvbGxlY3RfY3B1X2luZm9fYW1kKGludCBjcHUsIHN0cnVjdCBjcHVfc2lnbmF0dXJlICpjc2lnKQogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHUpOwotCXUzMiBkdW1teTsKIAogCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EIHx8IGMtPng4NiA8IDB4MTApIHsKIAkJcHJfd2FybmluZygiQ1BVJWQ6IGZhbWlseSAlZCBub3Qgc3VwcG9ydGVkXG4iLCBjcHUsIGMtPng4Nik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZG1zcihNU1JfQU1ENjRfUEFUQ0hfTEVWRUwsIGNzaWctPnJldiwgZHVtbXkpOworCWNzaWctPnJldiA9IGMtPm1pY3JvY29kZTsKIAlwcl9pbmZvKCJDUFUlZDogcGF0Y2hfbGV2ZWw9MHglMDh4XG4iLCBjcHUsIGNzaWctPnJldik7CiAKIAlyZXR1cm4gMDsKQEAgLTEzMCw2ICsxMjksNyBAQAogCWludCBjcHVfbnVtID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKIAlzdHJ1Y3QgbWljcm9jb2RlX2FtZCAqbWNfYW1kID0gdWNpLT5tYzsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKIAogCS8qIFdlIHNob3VsZCBiaW5kIHRoZSB0YXNrIHRvIHRoZSBDUFUgKi8KIAlCVUdfT04oY3B1X251bSAhPSBjcHUpOwpAQCAtMTUwLDYgKzE1MCw3IEBACiAKIAlwcl9pbmZvKCJDUFUlZDogbmV3IHBhdGNoX2xldmVsPTB4JTA4eFxuIiwgY3B1LCByZXYpOwogCXVjaS0+Y3B1X3NpZy5yZXYgPSByZXY7CisJYy0+bWljcm9jb2RlID0gcmV2OwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfY29yZS5jCmluZGV4IGY5MjQyODAuLmYyZDJhNjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfY29yZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfY29yZS5jCkBAIC00ODMsNyArNDgzLDEzIEBACiAJCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApOwogCQlwcl9kZWJ1ZygiQ1BVJWQgcmVtb3ZlZFxuIiwgY3B1KTsKIAkJYnJlYWs7Ci0JY2FzZSBDUFVfREVBRDoKKworCS8qCisJICogV2hlbiBhIENQVSBnb2VzIG9mZmxpbmUsIGRvbid0IGZyZWUgdXAgb3IgaW52YWxpZGF0ZSB0aGUgY29weSBvZgorCSAqIHRoZSBtaWNyb2NvZGUgaW4ga2VybmVsIG1lbW9yeSwgc28gdGhhdCB3ZSBjYW4gcmV1c2UgaXQgd2hlbiB0aGUKKwkgKiBDUFUgY29tZXMgYmFjayBvbmxpbmUgd2l0aG91dCB1bm5lY2Vzc2FyaWx5IHJlcXVlc3RpbmcgdGhlIHVzZXJzcGFjZQorCSAqIGZvciBpdCBhZ2Fpbi4KKwkgKi8KIAljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46CiAJCS8qIFRoZSBDUFUgcmVmdXNlZCB0byBjb21lIHVwIGR1cmluZyBhIHN5c3RlbSByZXN1bWUgKi8KIAkJbWljcm9jb2RlX2ZpbmlfY3B1KGNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMKaW5kZXggMWExYjYwNi4uM2NhNDJkMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfaW50ZWwuYwpAQCAtMTYxLDEyICsxNjEsNyBAQAogCQljc2lnLT5wZiA9IDEgPDwgKCh2YWxbMV0gPj4gMTgpICYgNyk7CiAJfQogCi0Jd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKLQkvKiBzZWUgbm90ZXMgYWJvdmUgZm9yIHJldmlzaW9uIDEuMDcuICBBcHBhcmVudCBjaGlwIGJ1ZyAqLwotCXN5bmNfY29yZSgpOwotCS8qIGdldCB0aGUgY3VycmVudCByZXZpc2lvbiBmcm9tIE1TUiAweDhCICovCi0JcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCB2YWxbMF0sIGNzaWctPnJldik7Ci0KKwljc2lnLT5yZXYgPSBjLT5taWNyb2NvZGU7CiAJcHJfaW5mbygiQ1BVJWQgc2lnPTB4JXgsIHBmPTB4JXgsIHJldmlzaW9uPTB4JXhcbiIsCiAJCWNwdV9udW0sIGNzaWctPnNpZywgY3NpZy0+cGYsIGNzaWctPnJldik7CiAKQEAgLTI5OSw5ICsyOTQsOSBAQAogCXN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKm1jX2ludGVsOwogCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpOwogCXVuc2lnbmVkIGludCB2YWxbMl07Ci0JaW50IGNwdV9udW07CisJaW50IGNwdV9udW0gPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHVfbnVtKTsKIAotCWNwdV9udW0gPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCW1jX2ludGVsID0gdWNpLT5tYzsKIApAQCAtMzE3LDcgKzMxMiw3IEBACiAJICAgICAgKHVuc2lnbmVkIGxvbmcpIG1jX2ludGVsLT5iaXRzID4+IDE2ID4+IDE2KTsKIAl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOwogCi0JLyogc2VlIG5vdGVzIGFib3ZlIGZvciByZXZpc2lvbiAxLjA3LiAgQXBwYXJlbnQgY2hpcCBidWcgKi8KKwkvKiBBcyBkb2N1bWVudGVkIGluIHRoZSBTRE06IERvIGEgQ1BVSUQgMSBoZXJlICovCiAJc3luY19jb3JlKCk7CiAKIAkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLwpAQCAtMzM1LDYgKzMzMCw3IEBACiAJCShtY19pbnRlbC0+aGRyLmRhdGUgPj4gMTYpICYgMHhmZik7CiAKIAl1Y2ktPmNwdV9zaWcucmV2ID0gdmFsWzFdOworCWMtPm1pY3JvY29kZSA9IHZhbFsxXTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL25taS5jIGIvYXJjaC94ODYva2VybmVsL25taS5jCmluZGV4IDdlYzViZDEuLmI5Yzg2MjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9tY2EuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggNjIyODcyMC4uODBkYzc5MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9iZV9yb21zLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvYmVfcm9tcy5jCmluZGV4IDYzMjI4MDMuLjM0ZTA2ZTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9iZV9yb21zLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2JlX3JvbXMuYwpAQCAtMTAsOSArMTAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCiAjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KLQotCiAjaW5jbHVkZSA8YXNtL2U4MjAuaD4KICNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMKaW5kZXggY2NkYmMxNi4uMzQ4Y2UwMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3J0Yy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ydGMuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wLmMKaW5kZXggMDEzZTdlYi4uMTYyMDRkYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NtcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfeDg2XzY0LmMKaW5kZXggZmYxNGE1MC4uMDUxNDg5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3lzX3g4Nl82NC5jCkBAIC0xNCwxMCArMTQsNzMgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KIAogI2luY2x1ZGUgPGFzbS9pYTMyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKKy8qCisgKiBBbGlnbiBhIHZpcnR1YWwgYWRkcmVzcyB0byBhdm9pZCBhbGlhc2luZyBpbiB0aGUgSSQgb24gQU1EIEYxNWguCisgKgorICogQGZsYWdzIGRlbm90ZXMgdGhlIGFsbG9jYXRpb24gZGlyZWN0aW9uIC0gYm90dG9tdXAgb3IgdG9wZG93biAtCisgKiBvciB2RFNPOyBzZWUgY2FsbCBzaXRlcyBiZWxvdy4KKyAqLwordW5zaWduZWQgbG9uZyBhbGlnbl9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgZW51bSBhbGlnbl9mbGFncyBmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcF9hZGRyOworCisJLyogaGFuZGxlIDMyLSBhbmQgNjQtYml0IGNhc2Ugd2l0aCBhIHNpbmdsZSBjb25kaXRpb25hbCAqLworCWlmICh2YV9hbGlnbi5mbGFncyA8IDAgfHwgISh2YV9hbGlnbi5mbGFncyAmICgyIC0gbW1hcF9pc19pYTMyKCkpKSkKKwkJcmV0dXJuIGFkZHI7CisKKwlpZiAoIShjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkpCisJCXJldHVybiBhZGRyOworCisJaWYgKCEoKGZsYWdzICYgQUxJR05fVkRTTykgfHwgZmlscCkpCisJCXJldHVybiBhZGRyOworCisJdG1wX2FkZHIgPSBhZGRyOworCisJLyoKKwkgKiBXZSBuZWVkIGFuIGFkZHJlc3Mgd2hpY2ggaXMgPD0gdGhhbiB0aGUgb3JpZ2luYWwKKwkgKiBvbmUgb25seSB3aGVuIGluIHRvcGRvd24gZGlyZWN0aW9uLgorCSAqLworCWlmICghKGZsYWdzICYgQUxJR05fVE9QRE9XTikpCisJCXRtcF9hZGRyICs9IHZhX2FsaWduLm1hc2s7CisKKwl0bXBfYWRkciAmPSB+dmFfYWxpZ24ubWFzazsKKworCXJldHVybiB0bXBfYWRkcjsKK30KKworc3RhdGljIGludCBfX2luaXQgY29udHJvbF92YV9hZGRyX2FsaWdubWVudChjaGFyICpzdHIpCit7CisJLyogZ3VhcmQgYWdhaW5zdCBlbmFibGluZyB0aGlzIG9uIG90aGVyIENQVSBmYW1pbGllcyAqLworCWlmICh2YV9hbGlnbi5mbGFncyA8IDApCisJCXJldHVybiAxOworCisJaWYgKCpzdHIgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKnN0ciA9PSAnPScpCisJCXN0cisrOworCisJaWYgKCFzdHJjbXAoc3RyLCAiMzIiKSkKKwkJdmFfYWxpZ24uZmxhZ3MgPSBBTElHTl9WQV8zMjsKKwllbHNlIGlmICghc3RyY21wKHN0ciwgIjY0IikpCisJCXZhX2FsaWduLmZsYWdzID0gQUxJR05fVkFfNjQ7CisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkKKwkJdmFfYWxpZ24uZmxhZ3MgPSAwOworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAib24iKSkKKwkJdmFfYWxpZ24uZmxhZ3MgPSBBTElHTl9WQV8zMiB8IEFMSUdOX1ZBXzY0OworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImFsaWduX3ZhX2FkZHIiLCBjb250cm9sX3ZhX2FkZHJfYWxpZ25tZW50KTsKKwogU1lTQ0FMTF9ERUZJTkU2KG1tYXAsIHVuc2lnbmVkIGxvbmcsIGFkZHIsIHVuc2lnbmVkIGxvbmcsIGxlbiwKIAkJdW5zaWduZWQgbG9uZywgcHJvdCwgdW5zaWduZWQgbG9uZywgZmxhZ3MsCiAJCXVuc2lnbmVkIGxvbmcsIGZkLCB1bnNpZ25lZCBsb25nLCBvZmYpCkBAIC05Miw2ICsxNTUsOSBAQAogCXN0YXJ0X2FkZHIgPSBhZGRyOwogCiBmdWxsX3NlYXJjaDoKKworCWFkZHIgPSBhbGlnbl9hZGRyKGFkZHIsIGZpbHAsIDApOworCiAJZm9yICh2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7IDsgdm1hID0gdm1hLT52bV9uZXh0KSB7CiAJCS8qIEF0IHRoaXMgcG9pbnQ6ICAoIXZtYSB8fCBhZGRyIDwgdm1hLT52bV9lbmQpLiAqLwogCQlpZiAoZW5kIC0gbGVuIDwgYWRkcikgewpAQCAtMTE3LDYgKzE4Myw3IEBACiAJCQltbS0+Y2FjaGVkX2hvbGVfc2l6ZSA9IHZtYS0+dm1fc3RhcnQgLSBhZGRyOwogCiAJCWFkZHIgPSB2bWEtPnZtX2VuZDsKKwkJYWRkciA9IGFsaWduX2FkZHIoYWRkciwgZmlscCwgMCk7CiAJfQogfQogCkBAIC0xNjEsMTAgKzIyOCwxMyBAQAogCiAJLyogbWFrZSBzdXJlIGl0IGNhbiBmaXQgaW4gdGhlIHJlbWFpbmluZyBhZGRyZXNzIHNwYWNlICovCiAJaWYgKGFkZHIgPiBsZW4pIHsKLQkJdm1hID0gZmluZF92bWEobW0sIGFkZHItbGVuKTsKLQkJaWYgKCF2bWEgfHwgYWRkciA8PSB2bWEtPnZtX3N0YXJ0KQorCQl1bnNpZ25lZCBsb25nIHRtcF9hZGRyID0gYWxpZ25fYWRkcihhZGRyIC0gbGVuLCBmaWxwLAorCQkJCQkJICAgIEFMSUdOX1RPUERPV04pOworCisJCXZtYSA9IGZpbmRfdm1hKG1tLCB0bXBfYWRkcik7CisJCWlmICghdm1hIHx8IHRtcF9hZGRyICsgbGVuIDw9IHZtYS0+dm1fc3RhcnQpCiAJCQkvKiByZW1lbWJlciB0aGUgYWRkcmVzcyBhcyBhIGhpbnQgZm9yIG5leHQgdGltZSAqLwotCQkJcmV0dXJuIG1tLT5mcmVlX2FyZWFfY2FjaGUgPSBhZGRyLWxlbjsKKwkJCXJldHVybiBtbS0+ZnJlZV9hcmVhX2NhY2hlID0gdG1wX2FkZHI7CiAJfQogCiAJaWYgKG1tLT5tbWFwX2Jhc2UgPCBsZW4pCkBAIC0xNzMsNiArMjQzLDggQEAKIAlhZGRyID0gbW0tPm1tYXBfYmFzZS1sZW47CiAKIAlkbyB7CisJCWFkZHIgPSBhbGlnbl9hZGRyKGFkZHIsIGZpbHAsIEFMSUdOX1RPUERPV04pOworCiAJCS8qCiAJCSAqIExvb2t1cCBmYWlsdXJlIG1lYW5zIG5vIHZtYSBpcyBhYm92ZSB0aGlzIGFkZHJlc3MsCiAJCSAqIGVsc2UgaWYgbmV3IHJlZ2lvbiBmaXRzIGJlbG93IHZtYS0+dm1fc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TIGIvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUwppbmRleCBiYzE5YmUzLi45YTBlMzEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlXzMyLlMKQEAgLTM0NiwzICszNDYsNSBAQAogCS5sb25nIHN5c19zeW5jZnMKIAkubG9uZyBzeXNfc2VuZG1tc2cJCS8qIDM0NSAqLwogCS5sb25nIHN5c19zZXRucworCS5sb25nIHN5c19wcm9jZXNzX3ZtX3JlYWR2CisJLmxvbmcgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdGJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC90Ym9vdC5jCmluZGV4IGUwN2EyZmMuLmUyNDEwZTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90Ym9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90Ym9vdC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hX3JlbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jCmluZGV4IDVhNjRkMDUuLmRkNWZiZjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RpbWUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2k4MjUzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21jYS5oPgogCiAjaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gveDg2L2tlcm5lbC90b3BvbG9neS5jCmluZGV4IDg5Mjc0ODYuLjc2ZWU5NzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90b3BvbG9neS5jCkBAIC0yNiw2ICsyNiw3IEBACiAgKiBTZW5kIGZlZWRiYWNrIHRvIDxjb2xwYXRjaEB1cy5pYm0uY29tPgogICovCiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF82NC5jCmluZGV4IGI1NmM2NWRlLi5lNGQ0YTIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dldGNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2VtdWxhdGUuYyBiL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMKaW5kZXggOGI0Y2M1Zi4uZjFlM2JlMTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMKKysrIGIvYXJjaC94ODYva3ZtL2VtdWxhdGUuYwpAQCAtMjksNiArMjksMzkgQEAKICNpbmNsdWRlICJ0c3MuaCIKIAogLyoKKyAqIE9wZXJhbmQgdHlwZXMKKyAqLworI2RlZmluZSBPcE5vbmUgICAgICAgICAgICAgMHVsbAorI2RlZmluZSBPcEltcGxpY2l0ICAgICAgICAgMXVsbCAgLyogTm8gZ2VuZXJpYyBkZWNvZGUgKi8KKyNkZWZpbmUgT3BSZWcgICAgICAgICAgICAgIDJ1bGwgIC8qIFJlZ2lzdGVyICovCisjZGVmaW5lIE9wTWVtICAgICAgICAgICAgICAzdWxsICAvKiBNZW1vcnkgKi8KKyNkZWZpbmUgT3BBY2MgICAgICAgICAgICAgIDR1bGwgIC8qIEFjY3VtdWxhdG9yOiBBTC9BWC9FQVgvUkFYICovCisjZGVmaW5lIE9wREkgICAgICAgICAgICAgICA1dWxsICAvKiBFUzpESS9FREkvUkRJICovCisjZGVmaW5lIE9wTWVtNjQgICAgICAgICAgICA2dWxsICAvKiBNZW1vcnksIDY0LWJpdCAqLworI2RlZmluZSBPcEltbVVCeXRlICAgICAgICAgN3VsbCAgLyogWmVyby1leHRlbmRlZCA4LWJpdCBpbW1lZGlhdGUgKi8KKyNkZWZpbmUgT3BEWCAgICAgICAgICAgICAgIDh1bGwgIC8qIERYIHJlZ2lzdGVyICovCisjZGVmaW5lIE9wQ0wgICAgICAgICAgICAgICA5dWxsICAvKiBDTCByZWdpc3RlciAoZm9yIHNoaWZ0cykgKi8KKyNkZWZpbmUgT3BJbW1CeXRlICAgICAgICAgMTB1bGwgIC8qIDgtYml0IHNpZ24gZXh0ZW5kZWQgaW1tZWRpYXRlICovCisjZGVmaW5lIE9wT25lICAgICAgICAgICAgIDExdWxsICAvKiBJbXBsaWVkIDEgKi8KKyNkZWZpbmUgT3BJbW0gICAgICAgICAgICAgMTJ1bGwgIC8qIFNpZ24gZXh0ZW5kZWQgaW1tZWRpYXRlICovCisjZGVmaW5lIE9wTWVtMTYgICAgICAgICAgIDEzdWxsICAvKiBNZW1vcnkgb3BlcmFuZCAoMTYtYml0KS4gKi8KKyNkZWZpbmUgT3BNZW0zMiAgICAgICAgICAgMTR1bGwgIC8qIE1lbW9yeSBvcGVyYW5kICgzMi1iaXQpLiAqLworI2RlZmluZSBPcEltbVUgICAgICAgICAgICAxNXVsbCAgLyogSW1tZWRpYXRlIG9wZXJhbmQsIHplcm8gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgT3BTSSAgICAgICAgICAgICAgMTZ1bGwgIC8qIFNJL0VTSS9SU0kgKi8KKyNkZWZpbmUgT3BJbW1GQWRkciAgICAgICAgMTd1bGwgIC8qIEltbWVkaWF0ZSBmYXIgYWRkcmVzcyAqLworI2RlZmluZSBPcE1lbUZBZGRyICAgICAgICAxOHVsbCAgLyogRmFyIGFkZHJlc3MgaW4gbWVtb3J5ICovCisjZGVmaW5lIE9wSW1tVTE2ICAgICAgICAgIDE5dWxsICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgMTYgYml0cywgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBPcEVTICAgICAgICAgICAgICAyMHVsbCAgLyogRVMgKi8KKyNkZWZpbmUgT3BDUyAgICAgICAgICAgICAgMjF1bGwgIC8qIENTICovCisjZGVmaW5lIE9wU1MgICAgICAgICAgICAgIDIydWxsICAvKiBTUyAqLworI2RlZmluZSBPcERTICAgICAgICAgICAgICAyM3VsbCAgLyogRFMgKi8KKyNkZWZpbmUgT3BGUyAgICAgICAgICAgICAgMjR1bGwgIC8qIEZTICovCisjZGVmaW5lIE9wR1MgICAgICAgICAgICAgIDI1dWxsICAvKiBHUyAqLworCisjZGVmaW5lIE9wQml0cyAgICAgICAgICAgICA1ICAvKiBXaWR0aCBvZiBvcGVyYW5kIGZpZWxkICovCisjZGVmaW5lIE9wTWFzayAgICAgICAgICAgICAoKDF1bGwgPDwgT3BCaXRzKSAtIDEpCisKKy8qCiAgKiBPcGNvZGUgZWZmZWN0aXZlLWFkZHJlc3MgZGVjb2RlIHRhYmxlcy4KICAqIE5vdGUgdGhhdCB3ZSBvbmx5IGVtdWxhdGUgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgbWVtb3J5CiAgKiBvcGVyYW5kIChleGNsdWRpbmcgaW1wbGljaXQgc3RhY2sgcmVmZXJlbmNlcykuIFdlIGFzc3VtZSB0aGF0IHN0YWNrCkBAIC00MCwzNyArNzMsMzUgQEAKIC8qIE9wZXJhbmQgc2l6ZXM6IDgtYml0IG9wZXJhbmRzIG9yIHNwZWNpZmllZC9vdmVycmlkZGVuIHNpemUuICovCiAjZGVmaW5lIEJ5dGVPcCAgICAgICgxPDwwKQkvKiA4LWJpdCBvcGVyYW5kcy4gKi8KIC8qIERlc3RpbmF0aW9uIG9wZXJhbmQgdHlwZS4gKi8KLSNkZWZpbmUgSW1wbGljaXRPcHMgKDE8PDEpCS8qIEltcGxpY2l0IGluIG9wY29kZS4gTm8gZ2VuZXJpYyBkZWNvZGUuICovCi0jZGVmaW5lIERzdFJlZyAgICAgICgyPDwxKQkvKiBSZWdpc3RlciBvcGVyYW5kLiAqLwotI2RlZmluZSBEc3RNZW0gICAgICAoMzw8MSkJLyogTWVtb3J5IG9wZXJhbmQuICovCi0jZGVmaW5lIERzdEFjYyAgICAgICg0PDwxKQkvKiBEZXN0aW5hdGlvbiBBY2N1bXVsYXRvciAqLwotI2RlZmluZSBEc3RESSAgICAgICAoNTw8MSkJLyogRGVzdGluYXRpb24gaXMgaW4gRVM6KEUpREkgKi8KLSNkZWZpbmUgRHN0TWVtNjQgICAgKDY8PDEpCS8qIDY0Yml0IG1lbW9yeSBvcGVyYW5kICovCi0jZGVmaW5lIERzdEltbVVCeXRlICg3PDwxKQkvKiA4LWJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgb3BlcmFuZCAqLwotI2RlZmluZSBEc3REWCAgICAgICAoODw8MSkJLyogRGVzdGluYXRpb24gaXMgaW4gRFggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRHN0TWFzayAgICAgKDB4Zjw8MSkKKyNkZWZpbmUgRHN0U2hpZnQgICAgMQorI2RlZmluZSBJbXBsaWNpdE9wcyAoT3BJbXBsaWNpdCA8PCBEc3RTaGlmdCkKKyNkZWZpbmUgRHN0UmVnICAgICAgKE9wUmVnIDw8IERzdFNoaWZ0KQorI2RlZmluZSBEc3RNZW0gICAgICAoT3BNZW0gPDwgRHN0U2hpZnQpCisjZGVmaW5lIERzdEFjYyAgICAgIChPcEFjYyA8PCBEc3RTaGlmdCkKKyNkZWZpbmUgRHN0REkgICAgICAgKE9wREkgPDwgRHN0U2hpZnQpCisjZGVmaW5lIERzdE1lbTY0ICAgIChPcE1lbTY0IDw8IERzdFNoaWZ0KQorI2RlZmluZSBEc3RJbW1VQnl0ZSAoT3BJbW1VQnl0ZSA8PCBEc3RTaGlmdCkKKyNkZWZpbmUgRHN0RFggICAgICAgKE9wRFggPDwgRHN0U2hpZnQpCisjZGVmaW5lIERzdE1hc2sgICAgIChPcE1hc2sgPDwgRHN0U2hpZnQpCiAvKiBTb3VyY2Ugb3BlcmFuZCB0eXBlLiAqLwotI2RlZmluZSBTcmNOb25lICAgICAoMDw8NSkJLyogTm8gc291cmNlIG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY1JlZyAgICAgICgxPDw1KQkvKiBSZWdpc3RlciBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNNZW0gICAgICAoMjw8NSkJLyogTWVtb3J5IG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY01lbTE2ICAgICgzPDw1KQkvKiBNZW1vcnkgb3BlcmFuZCAoMTYtYml0KS4gKi8KLSNkZWZpbmUgU3JjTWVtMzIgICAgKDQ8PDUpCS8qIE1lbW9yeSBvcGVyYW5kICgzMi1iaXQpLiAqLwotI2RlZmluZSBTcmNJbW0gICAgICAoNTw8NSkJLyogSW1tZWRpYXRlIG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY0ltbUJ5dGUgICg2PDw1KQkvKiA4LWJpdCBzaWduLWV4dGVuZGVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNPbmUgICAgICAoNzw8NSkJLyogSW1wbGllZCAnMScgKi8KLSNkZWZpbmUgU3JjSW1tVUJ5dGUgKDg8PDUpICAgICAgLyogOC1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY0ltbVUgICAgICg5PDw1KSAgICAgIC8qIEltbWVkaWF0ZSBvcGVyYW5kLCB1bnNpZ25lZCAqLwotI2RlZmluZSBTcmNTSSAgICAgICAoMHhhPDw1KQkvKiBTb3VyY2UgaXMgaW4gdGhlIERTOlJTSSAqLwotI2RlZmluZSBTcmNJbW1GQWRkciAoMHhiPDw1KQkvKiBTb3VyY2UgaXMgaW1tZWRpYXRlIGZhciBhZGRyZXNzICovCi0jZGVmaW5lIFNyY01lbUZBZGRyICgweGM8PDUpCS8qIFNvdXJjZSBpcyBmYXIgYWRkcmVzcyBpbiBtZW1vcnkgKi8KLSNkZWZpbmUgU3JjQWNjICAgICAgKDB4ZDw8NSkJLyogU291cmNlIEFjY3VtdWxhdG9yICovCi0jZGVmaW5lIFNyY0ltbVUxNiAgICgweGU8PDUpICAgIC8qIEltbWVkaWF0ZSBvcGVyYW5kLCB1bnNpZ25lZCwgMTYgYml0cyAqLwotI2RlZmluZSBTcmNEWCAgICAgICAoMHhmPDw1KQkvKiBTb3VyY2UgaXMgaW4gRFggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU3JjTWFzayAgICAgKDB4Zjw8NSkKLS8qIEdlbmVyaWMgTW9kUk0gZGVjb2RlLiAqLwotI2RlZmluZSBNb2RSTSAgICAgICAoMTw8OSkKLS8qIERlc3RpbmF0aW9uIGlzIG9ubHkgd3JpdHRlbjsgbmV2ZXIgcmVhZC4gKi8KLSNkZWZpbmUgTW92ICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBTcmNTaGlmdCAgICA2CisjZGVmaW5lIFNyY05vbmUgICAgIChPcE5vbmUgPDwgU3JjU2hpZnQpCisjZGVmaW5lIFNyY1JlZyAgICAgIChPcFJlZyA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjTWVtICAgICAgKE9wTWVtIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNNZW0xNiAgICAoT3BNZW0xNiA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjTWVtMzIgICAgKE9wTWVtMzIgPDwgU3JjU2hpZnQpCisjZGVmaW5lIFNyY0ltbSAgICAgIChPcEltbSA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjSW1tQnl0ZSAgKE9wSW1tQnl0ZSA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjT25lICAgICAgKE9wT25lIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNJbW1VQnl0ZSAoT3BJbW1VQnl0ZSA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjSW1tVSAgICAgKE9wSW1tVSA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjU0kgICAgICAgKE9wU0kgPDwgU3JjU2hpZnQpCisjZGVmaW5lIFNyY0ltbUZBZGRyIChPcEltbUZBZGRyIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNNZW1GQWRkciAoT3BNZW1GQWRkciA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjQWNjICAgICAgKE9wQWNjIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNJbW1VMTYgICAoT3BJbW1VMTYgPDwgU3JjU2hpZnQpCisjZGVmaW5lIFNyY0RYICAgICAgIChPcERYIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNNYXNrICAgICAoT3BNYXNrIDw8IFNyY1NoaWZ0KQogI2RlZmluZSBCaXRPcCAgICAgICAoMTw8MTEpCiAjZGVmaW5lIE1lbUFicyAgICAgICgxPDwxMikgICAgICAvKiBNZW1vcnkgb3BlcmFuZCBpcyBhYnNvbHV0ZSBkaXNwbGFjZW1lbnQgKi8KICNkZWZpbmUgU3RyaW5nICAgICAgKDE8PDEzKSAgICAgLyogU3RyaW5nIGluc3RydWN0aW9uIChyZXAgY2FwYWJsZSkgKi8KQEAgLTgxLDYgKzExMiwxMCBAQAogI2RlZmluZSBQcmVmaXggICAgICAoMzw8MTUpICAgICAvKiBJbnN0cnVjdGlvbiB2YXJpZXMgd2l0aCA2Ni9mMi9mMyBwcmVmaXggKi8KICNkZWZpbmUgUk1FeHQgICAgICAgKDQ8PDE1KSAgICAgLyogT3Bjb2RlIGV4dGVuc2lvbiBpbiBNb2RSTSByL20gaWYgbW9kID09IDMgKi8KICNkZWZpbmUgU3NlICAgICAgICAgKDE8PDE4KSAgICAgLyogU1NFIFZlY3RvciBpbnN0cnVjdGlvbiAqLworLyogR2VuZXJpYyBNb2RSTSBkZWNvZGUuICovCisjZGVmaW5lIE1vZFJNICAgICAgICgxPDwxOSkKKy8qIERlc3RpbmF0aW9uIGlzIG9ubHkgd3JpdHRlbjsgbmV2ZXIgcmVhZC4gKi8KKyNkZWZpbmUgTW92ICAgICAgICAgKDE8PDIwKQogLyogTWlzYyBmbGFncyAqLwogI2RlZmluZSBQcm90ICAgICAgICAoMTw8MjEpIC8qIGluc3RydWN0aW9uIGdlbmVyYXRlcyAjVUQgaWYgbm90IGluIHByb3QtbW9kZSAqLwogI2RlZmluZSBWZW5kb3JTcGVjaWZpYyAoMTw8MjIpIC8qIFZlbmRvciBzcGVjaWZpYyBpbnN0cnVjdGlvbiAqLwpAQCAtOTEsMTIgKzEyNiwxOSBAQAogI2RlZmluZSBQcml2ICAgICAgICAoMTw8MjcpIC8qIGluc3RydWN0aW9uIGdlbmVyYXRlcyAjR1AgaWYgY3VycmVudCBDUEwgIT0gMCAqLwogI2RlZmluZSBObzY0CSAgICAoMTw8MjgpCiAvKiBTb3VyY2UgMiBvcGVyYW5kIHR5cGUgKi8KLSNkZWZpbmUgU3JjMk5vbmUgICAgKDA8PDI5KQotI2RlZmluZSBTcmMyQ0wgICAgICAoMTw8MjkpCi0jZGVmaW5lIFNyYzJJbW1CeXRlICgyPDwyOSkKLSNkZWZpbmUgU3JjMk9uZSAgICAgKDM8PDI5KQotI2RlZmluZSBTcmMySW1tICAgICAoNDw8MjkpCi0jZGVmaW5lIFNyYzJNYXNrICAgICg3PDwyOSkKKyNkZWZpbmUgU3JjMlNoaWZ0ICAgKDI5KQorI2RlZmluZSBTcmMyTm9uZSAgICAoT3BOb25lIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMkNMICAgICAgKE9wQ0wgPDwgU3JjMlNoaWZ0KQorI2RlZmluZSBTcmMySW1tQnl0ZSAoT3BJbW1CeXRlIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMk9uZSAgICAgKE9wT25lIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMkltbSAgICAgKE9wSW1tIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMkVTICAgICAgKE9wRVMgPDwgU3JjMlNoaWZ0KQorI2RlZmluZSBTcmMyQ1MgICAgICAoT3BDUyA8PCBTcmMyU2hpZnQpCisjZGVmaW5lIFNyYzJTUyAgICAgIChPcFNTIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMkRTICAgICAgKE9wRFMgPDwgU3JjMlNoaWZ0KQorI2RlZmluZSBTcmMyRlMgICAgICAoT3BGUyA8PCBTcmMyU2hpZnQpCisjZGVmaW5lIFNyYzJHUyAgICAgIChPcEdTIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMk1hc2sgICAgKE9wTWFzayA8PCBTcmMyU2hpZnQpCiAKICNkZWZpbmUgWDIoeC4uLikgeCwgeAogI2RlZmluZSBYMyh4Li4uKSBYMih4KSwgeApAQCAtMTA4LDggKzE1MCw4IEBACiAjZGVmaW5lIFgxNih4Li4uKSBYOCh4KSwgWDgoeCkKIAogc3RydWN0IG9wY29kZSB7Ci0JdTMyIGZsYWdzOwotCXU4IGludGVyY2VwdDsKKwl1NjQgZmxhZ3MgOiA1NjsKKwl1NjQgaW50ZXJjZXB0IDogODsKIAl1bmlvbiB7CiAJCWludCAoKmV4ZWN1dGUpKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KTsKIAkJc3RydWN0IG9wY29kZSAqZ3JvdXA7CkBAIC0yMDUsMTA1ICsyNDcsMTAwIEBACiAjZGVmaW5lIE9ONjQoeCkKICNlbmRpZgogCi0jZGVmaW5lIF9fX19lbXVsYXRlXzJvcChfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsIF94LCBfeSwgX3N1ZmZpeCwgX2RzdHR5cGUpIFwKKyNkZWZpbmUgX19fX2VtdWxhdGVfMm9wKGN0eHQsIF9vcCwgX3gsIF95LCBfc3VmZml4LCBfZHN0dHlwZSkJXAogCWRvIHsJCQkJCQkJCVwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJXAogCQkJX1BSRV9FRkxBR1MoIjAiLCAiNCIsICIyIikJCQlcCiAJCQlfb3AgX3N1ZmZpeCAiICUiX3giMywlMTsgIgkJCVwKIAkJCV9QT1NUX0VGTEFHUygiMCIsICI0IiwgIjIiKQkJCVwKLQkJCTogIj1tIiAoX2VmbGFncyksICIrcSIgKCooX2RzdHR5cGUqKSYoX2RzdCkudmFsKSxcCisJCQk6ICI9bSIgKChjdHh0KS0+ZWZsYWdzKSwJCQlcCisJCQkgICIrcSIgKCooX2RzdHR5cGUqKSYoY3R4dCktPmRzdC52YWwpLAkJXAogCQkJICAiPSZyIiAoX3RtcCkJCQkJCVwKLQkJCTogX3kgKChfc3JjKS52YWwpLCAiaSIgKEVGTEFHU19NQVNLKSk7CQlcCisJCQk6IF95ICgoY3R4dCktPnNyYy52YWwpLCAiaSIgKEVGTEFHU19NQVNLKSk7CVwKIAl9IHdoaWxlICgwKQogCiAKIC8qIFJhdyBlbXVsYXRpb246IGluc3RydWN0aW9uIGhhcyB0d28gZXhwbGljaXQgb3BlcmFuZHMuICovCi0jZGVmaW5lIF9fZW11bGF0ZV8yb3Bfbm9ieXRlKF9vcCxfc3JjLF9kc3QsX2VmbGFncyxfd3gsX3d5LF9seCxfbHksX3F4LF9xeSkgXAorI2RlZmluZSBfX2VtdWxhdGVfMm9wX25vYnl0ZShjdHh0LF9vcCxfd3gsX3d5LF9seCxfbHksX3F4LF9xeSkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJCVwKIAkJCQkJCQkJCVwKLQkJc3dpdGNoICgoX2RzdCkuYnl0ZXMpIHsJCQkJCVwKKwkJc3dpdGNoICgoY3R4dCktPmRzdC5ieXRlcykgewkJCQlcCiAJCWNhc2UgMjoJCQkJCQkJXAotCQkJX19fX2VtdWxhdGVfMm9wKF9vcCxfc3JjLF9kc3QsX2VmbGFncyxfd3gsX3d5LCJ3Iix1MTYpO1wKKwkJCV9fX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfd3gsX3d5LCJ3Iix1MTYpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWNhc2UgNDoJCQkJCQkJXAotCQkJX19fX2VtdWxhdGVfMm9wKF9vcCxfc3JjLF9kc3QsX2VmbGFncyxfbHgsX2x5LCJsIix1MzIpO1wKKwkJCV9fX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfbHgsX2x5LCJsIix1MzIpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWNhc2UgODoJCQkJCQkJXAotCQkJT042NChfX19fZW11bGF0ZV8yb3AoX29wLF9zcmMsX2RzdCxfZWZsYWdzLF9xeCxfcXksInEiLHU2NCkpOyBcCisJCQlPTjY0KF9fX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfcXgsX3F5LCJxIix1NjQpKTsgXAogCQkJYnJlYWs7CQkJCQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIF9fZW11bGF0ZV8yb3AoX29wLF9zcmMsX2RzdCxfZWZsYWdzLF9ieCxfYnksX3d4LF93eSxfbHgsX2x5LF9xeCxfcXkpIFwKKyNkZWZpbmUgX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfYngsX2J5LF93eCxfd3ksX2x4LF9seSxfcXgsX3F5KQkJICAgICBcCiAJZG8gewkJCQkJCQkJICAgICBcCiAJCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJCSAgICAgXAotCQlzd2l0Y2ggKChfZHN0KS5ieXRlcykgewkJCQkgICAgICAgICAgICAgXAorCQlzd2l0Y2ggKChjdHh0KS0+ZHN0LmJ5dGVzKSB7CQkJCSAgICAgXAogCQljYXNlIDE6CQkJCQkJCSAgICAgXAotCQkJX19fX2VtdWxhdGVfMm9wKF9vcCxfc3JjLF9kc3QsX2VmbGFncyxfYngsX2J5LCJiIix1OCk7IFwKKwkJCV9fX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfYngsX2J5LCJiIix1OCk7CSAgICAgXAogCQkJYnJlYWs7CQkJCQkJICAgICBcCiAJCWRlZmF1bHQ6CQkJCQkJICAgICBcCi0JCQlfX2VtdWxhdGVfMm9wX25vYnl0ZShfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsCSAgICAgXAorCQkJX19lbXVsYXRlXzJvcF9ub2J5dGUoY3R4dCwgX29wLAkJCSAgICAgXAogCQkJCQkgICAgIF93eCwgX3d5LCBfbHgsIF9seSwgX3F4LCBfcXkpOyAgXAogCQkJYnJlYWs7CQkJCQkJICAgICBcCiAJCX0JCQkJCQkJICAgICBcCiAJfSB3aGlsZSAoMCkKIAogLyogU291cmNlIG9wZXJhbmQgaXMgYnl0ZS1zaXplZCBhbmQgbWF5IGJlIHJlc3RyaWN0ZWQgdG8ganVzdCAlY2wuICovCi0jZGVmaW5lIGVtdWxhdGVfMm9wX1NyY0IoX29wLCBfc3JjLCBfZHN0LCBfZWZsYWdzKSAgICAgICAgICAgICAgICAgICAgICBcCi0JX19lbXVsYXRlXzJvcChfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsCQkJCVwKLQkJICAgICAgImIiLCAiYyIsICJiIiwgImMiLCAiYiIsICJjIiwgImIiLCAiYyIpCisjZGVmaW5lIGVtdWxhdGVfMm9wX1NyY0IoY3R4dCwgX29wKQkJCQkJXAorCV9fZW11bGF0ZV8yb3AoY3R4dCwgX29wLCAiYiIsICJjIiwgImIiLCAiYyIsICJiIiwgImMiLCAiYiIsICJjIikKIAogLyogU291cmNlIG9wZXJhbmQgaXMgYnl0ZSwgd29yZCwgbG9uZyBvciBxdWFkIHNpemVkLiAqLwotI2RlZmluZSBlbXVsYXRlXzJvcF9TcmNWKF9vcCwgX3NyYywgX2RzdCwgX2VmbGFncykgICAgICAgICAgICAgICAgICAgICAgXAotCV9fZW11bGF0ZV8yb3AoX29wLCBfc3JjLCBfZHN0LCBfZWZsYWdzLAkJCQlcCi0JCSAgICAgICJiIiwgInEiLCAidyIsICJyIiwgX0xPMzIsICJyIiwgIiIsICJyIikKKyNkZWZpbmUgZW11bGF0ZV8yb3BfU3JjVihjdHh0LCBfb3ApCQkJCQlcCisJX19lbXVsYXRlXzJvcChjdHh0LCBfb3AsICJiIiwgInEiLCAidyIsICJyIiwgX0xPMzIsICJyIiwgIiIsICJyIikKIAogLyogU291cmNlIG9wZXJhbmQgaXMgd29yZCwgbG9uZyBvciBxdWFkIHNpemVkLiAqLwotI2RlZmluZSBlbXVsYXRlXzJvcF9TcmNWX25vYnl0ZShfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MpICAgICAgICAgICAgICAgXAotCV9fZW11bGF0ZV8yb3Bfbm9ieXRlKF9vcCwgX3NyYywgX2RzdCwgX2VmbGFncywJCQlcCi0JCQkgICAgICJ3IiwgInIiLCBfTE8zMiwgInIiLCAiIiwgInIiKQorI2RlZmluZSBlbXVsYXRlXzJvcF9TcmNWX25vYnl0ZShjdHh0LCBfb3ApCQkJCVwKKwlfX2VtdWxhdGVfMm9wX25vYnl0ZShjdHh0LCBfb3AsICJ3IiwgInIiLCBfTE8zMiwgInIiLCAiIiwgInIiKQogCiAvKiBJbnN0cnVjdGlvbiBoYXMgdGhyZWUgb3BlcmFuZHMgYW5kIG9uZSBvcGVyYW5kIGlzIHN0b3JlZCBpbiBFQ1ggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgX19lbXVsYXRlXzJvcF9jbChfb3AsIF9jbCwgX3NyYywgX2RzdCwgX2VmbGFncywgX3N1ZmZpeCwgX3R5cGUpCVwKKyNkZWZpbmUgX19lbXVsYXRlXzJvcF9jbChjdHh0LCBfb3AsIF9zdWZmaXgsIF90eXBlKQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJdW5zaWduZWQgbG9uZyBfdG1wOwkJCQkJXAotCQlfdHlwZSBfY2x2ICA9IChfY2wpLnZhbDsJCQkJXAotCQlfdHlwZSBfc3JjdiA9IChfc3JjKS52YWw7CQkJCVwKLQkJX3R5cGUgX2RzdHYgPSAoX2RzdCkudmFsOwkJCQlcCisJCV90eXBlIF9jbHYgID0gKGN0eHQpLT5zcmMyLnZhbDsJCQkJXAorCQlfdHlwZSBfc3JjdiA9IChjdHh0KS0+c3JjLnZhbDsJCQkJXAorCQlfdHlwZSBfZHN0diA9IChjdHh0KS0+ZHN0LnZhbDsJCQkJXAogCQkJCQkJCQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQlcCiAJCQlfUFJFX0VGTEFHUygiMCIsICI1IiwgIjIiKQkJCVwKIAkJCV9vcCBfc3VmZml4ICIgJTQsJTEgXG4iCQkJCVwKIAkJCV9QT1NUX0VGTEFHUygiMCIsICI1IiwgIjIiKQkJCVwKLQkJCTogIj1tIiAoX2VmbGFncyksICIrciIgKF9kc3R2KSwgIj0mciIgKF90bXApCVwKKwkJCTogIj1tIiAoKGN0eHQpLT5lZmxhZ3MpLCAiK3IiIChfZHN0diksICI9JnIiIChfdG1wKSBcCiAJCQk6ICJjIiAoX2NsdikgLCAiciIgKF9zcmN2KSwgImkiIChFRkxBR1NfTUFTSykJXAogCQkJKTsJCQkJCQlcCiAJCQkJCQkJCQlcCi0JCShfY2wpLnZhbCAgPSAodW5zaWduZWQgbG9uZykgX2NsdjsJCQlcCi0JCShfc3JjKS52YWwgPSAodW5zaWduZWQgbG9uZykgX3NyY3Y7CQkJXAotCQkoX2RzdCkudmFsID0gKHVuc2lnbmVkIGxvbmcpIF9kc3R2OwkJCVwKKwkJKGN0eHQpLT5zcmMyLnZhbCAgPSAodW5zaWduZWQgbG9uZykgX2NsdjsJCVwKKwkJKGN0eHQpLT5zcmMyLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBfc3JjdjsJCVwKKwkJKGN0eHQpLT5kc3QudmFsID0gKHVuc2lnbmVkIGxvbmcpIF9kc3R2OwkJXAogCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgZW11bGF0ZV8yb3BfY2woX29wLCBfY2wsIF9zcmMsIF9kc3QsIF9lZmxhZ3MpCQkJXAorI2RlZmluZSBlbXVsYXRlXzJvcF9jbChjdHh0LCBfb3ApCQkJCQlcCiAJZG8gewkJCQkJCQkJXAotCQlzd2l0Y2ggKChfZHN0KS5ieXRlcykgewkJCQkJXAorCQlzd2l0Y2ggKChjdHh0KS0+ZHN0LmJ5dGVzKSB7CQkJCVwKIAkJY2FzZSAyOgkJCQkJCQlcCi0JCQlfX2VtdWxhdGVfMm9wX2NsKF9vcCwgX2NsLCBfc3JjLCBfZHN0LCBfZWZsYWdzLAlcCi0JCQkJCSAidyIsIHVuc2lnbmVkIHNob3J0KTsgICAgICAgICAJXAorCQkJX19lbXVsYXRlXzJvcF9jbChjdHh0LCBfb3AsICJ3IiwgdTE2KTsJCVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJY2FzZSA0OgkJCQkJCQlcCi0JCQlfX2VtdWxhdGVfMm9wX2NsKF9vcCwgX2NsLCBfc3JjLCBfZHN0LCBfZWZsYWdzLAlcCi0JCQkJCSAibCIsIHVuc2lnbmVkIGludCk7ICAgICAgICAgICAJXAorCQkJX19lbXVsYXRlXzJvcF9jbChjdHh0LCBfb3AsICJsIiwgdTMyKTsJCVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJY2FzZSA4OgkJCQkJCQlcCi0JCQlPTjY0KF9fZW11bGF0ZV8yb3BfY2woX29wLCBfY2wsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsIFwKLQkJCQkJICAgICAgInEiLCB1bnNpZ25lZCBsb25nKSk7CVwKKwkJCU9ONjQoX19lbXVsYXRlXzJvcF9jbChjdHh0LCBfb3AsICJxIiwgdWxvbmcpKTsJXAogCQkJYnJlYWs7CQkJCQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIF9fZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzLCBfc3VmZml4KQkJCVwKKyNkZWZpbmUgX19lbXVsYXRlXzFvcChjdHh0LCBfb3AsIF9zdWZmaXgpCQkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJCVwKIAkJCQkJCQkJCVwKQEAgLTMxMSwzOSArMzQ4LDI3IEBACiAJCQlfUFJFX0VGTEFHUygiMCIsICIzIiwgIjIiKQkJCVwKIAkJCV9vcCBfc3VmZml4ICIgJTE7ICIJCQkJXAogCQkJX1BPU1RfRUZMQUdTKCIwIiwgIjMiLCAiMiIpCQkJXAotCQkJOiAiPW0iIChfZWZsYWdzKSwgIittIiAoKF9kc3QpLnZhbCksCQlcCisJCQk6ICI9bSIgKChjdHh0KS0+ZWZsYWdzKSwgIittIiAoKGN0eHQpLT5kc3QudmFsKSwgXAogCQkJICAiPSZyIiAoX3RtcCkJCQkJCVwKIAkJCTogImkiIChFRkxBR1NfTUFTSykpOwkJCQlcCiAJfSB3aGlsZSAoMCkKIAogLyogSW5zdHJ1Y3Rpb24gaGFzIG9ubHkgb25lIGV4cGxpY2l0IG9wZXJhbmQgKG5vIHNvdXJjZSBvcGVyYW5kKS4gKi8KLSNkZWZpbmUgZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgZW11bGF0ZV8xb3AoY3R4dCwgX29wKQkJCQkJCVwKIAlkbyB7CQkJCQkJCQlcCi0JCXN3aXRjaCAoKF9kc3QpLmJ5dGVzKSB7CQkJCSAgICAgICAgXAotCQljYXNlIDE6CV9fZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzLCAiYiIpOyBicmVhazsJXAotCQljYXNlIDI6CV9fZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzLCAidyIpOyBicmVhazsJXAotCQljYXNlIDQ6CV9fZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzLCAibCIpOyBicmVhazsJXAotCQljYXNlIDg6CU9ONjQoX19lbXVsYXRlXzFvcChfb3AsIF9kc3QsIF9lZmxhZ3MsICJxIikpOyBicmVhazsgXAorCQlzd2l0Y2ggKChjdHh0KS0+ZHN0LmJ5dGVzKSB7CQkJCVwKKwkJY2FzZSAxOglfX2VtdWxhdGVfMW9wKGN0eHQsIF9vcCwgImIiKTsgYnJlYWs7CQlcCisJCWNhc2UgMjoJX19lbXVsYXRlXzFvcChjdHh0LCBfb3AsICJ3Iik7IGJyZWFrOwkJXAorCQljYXNlIDQ6CV9fZW11bGF0ZV8xb3AoY3R4dCwgX29wLCAibCIpOyBicmVhazsJCVwKKwkJY2FzZSA4OglPTjY0KF9fZW11bGF0ZV8xb3AoY3R4dCwgX29wLCAicSIpKTsgYnJlYWs7CVwKIAkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBfX2VtdWxhdGVfMW9wX3JheF9yZHgoX29wLCBfc3JjLCBfcmF4LCBfcmR4LCBfZWZsYWdzLCBfc3VmZml4KQkJXAorI2RlZmluZSBfX2VtdWxhdGVfMW9wX3JheF9yZHgoY3R4dCwgX29wLCBfc3VmZml4LCBfZXgpCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJdW5zaWduZWQgbG9uZyBfdG1wOwkJCQkJXAotCQkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQlcCi0JCQlfUFJFX0VGTEFHUygiMCIsICI0IiwgIjEiKQkJCVwKLQkJCV9vcCBfc3VmZml4ICIgJTU7ICIJCQkJXAotCQkJX1BPU1RfRUZMQUdTKCIwIiwgIjQiLCAiMSIpCQkJXAotCQkJOiAiPW0iIChfZWZsYWdzKSwgIj0mciIgKF90bXApLAkJCVwKLQkJCSAgIithIiAoX3JheCksICIrZCIgKF9yZHgpCQkJXAotCQkJOiAiaSIgKEVGTEFHU19NQVNLKSwgIm0iICgoX3NyYykudmFsKSwJCVwKLQkJCSAgImEiIChfcmF4KSwgImQiIChfcmR4KSk7CQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX19lbXVsYXRlXzFvcF9yYXhfcmR4X2V4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwgX2VmbGFncywgX3N1ZmZpeCwgX2V4KSBcCi0JZG8gewkJCQkJCQkJXAotCQl1bnNpZ25lZCBsb25nIF90bXA7CQkJCQlcCisJCXVsb25nICpyYXggPSAmKGN0eHQpLT5yZWdzW1ZDUFVfUkVHU19SQVhdOwkJXAorCQl1bG9uZyAqcmR4ID0gJihjdHh0KS0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsJCVwKIAkJCQkJCQkJCVwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJXAogCQkJX1BSRV9FRkxBR1MoIjAiLCAiNSIsICIxIikJCQlcCkBAIC0zNTYsNTMgKzM4MSwyNyBAQAogCQkJImptcCAyYiBcblx0IgkJCQkJXAogCQkJIi5wb3BzZWN0aW9uIFxuXHQiCQkJCVwKIAkJCV9BU01fRVhUQUJMRSgxYiwgM2IpCQkJCVwKLQkJCTogIj1tIiAoX2VmbGFncyksICI9JnIiIChfdG1wKSwJCQlcCi0JCQkgICIrYSIgKF9yYXgpLCAiK2QiIChfcmR4KSwgIitxbSIoX2V4KQkJXAotCQkJOiAiaSIgKEVGTEFHU19NQVNLKSwgIm0iICgoX3NyYykudmFsKSwJCVwKLQkJCSAgImEiIChfcmF4KSwgImQiIChfcmR4KSk7CQkJXAorCQkJOiAiPW0iICgoY3R4dCktPmVmbGFncyksICI9JnIiIChfdG1wKSwJCVwKKwkJCSAgIithIiAoKnJheCksICIrZCIgKCpyZHgpLCAiK3FtIihfZXgpCQlcCisJCQk6ICJpIiAoRUZMQUdTX01BU0spLCAibSIgKChjdHh0KS0+c3JjLnZhbCksCVwKKwkJCSAgImEiICgqcmF4KSwgImQiICgqcmR4KSk7CQkJXAogCX0gd2hpbGUgKDApCiAKIC8qIGluc3RydWN0aW9uIGhhcyBvbmx5IG9uZSBzb3VyY2Ugb3BlcmFuZCwgZGVzdGluYXRpb24gaXMgaW1wbGljaXQgKGUuZy4gbXVsLCBkaXYsIGltdWwsIGlkaXYpICovCi0jZGVmaW5lIGVtdWxhdGVfMW9wX3JheF9yZHgoX29wLCBfc3JjLCBfcmF4LCBfcmR4LCBfZWZsYWdzKQkJXAorI2RlZmluZSBlbXVsYXRlXzFvcF9yYXhfcmR4KGN0eHQsIF9vcCwgX2V4KQlcCiAJZG8gewkJCQkJCQkJXAotCQlzd2l0Y2goKF9zcmMpLmJ5dGVzKSB7CQkJCQlcCisJCXN3aXRjaCgoY3R4dCktPnNyYy5ieXRlcykgewkJCQlcCiAJCWNhc2UgMToJCQkJCQkJXAotCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwJXAotCQkJCQkgICAgICBfZWZsYWdzLCAiYiIpOwkJXAorCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KGN0eHQsIF9vcCwgImIiLCBfZXgpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWNhc2UgMjoJCQkJCQkJXAotCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwJXAotCQkJCQkgICAgICBfZWZsYWdzLCAidyIpOwkJXAorCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KGN0eHQsIF9vcCwgInciLCBfZXgpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWNhc2UgNDoJCQkJCQkJXAotCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwJXAotCQkJCQkgICAgICBfZWZsYWdzLCAibCIpOwkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIDg6CQkJCQkJCVwKLQkJCU9ONjQoX19lbXVsYXRlXzFvcF9yYXhfcmR4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwgXAotCQkJCQkJICAgX2VmbGFncywgInEiKSk7CVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBlbXVsYXRlXzFvcF9yYXhfcmR4X2V4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwgX2VmbGFncywgX2V4KQlcCi0JZG8gewkJCQkJCQkJXAotCQlzd2l0Y2goKF9zcmMpLmJ5dGVzKSB7CQkJCQlcCi0JCWNhc2UgMToJCQkJCQkJXAotCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4X2V4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwJXAotCQkJCQkJIF9lZmxhZ3MsICJiIiwgX2V4KTsJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIDI6CQkJCQkJCVwKLQkJCV9fZW11bGF0ZV8xb3BfcmF4X3JkeF9leChfb3AsIF9zcmMsIF9yYXgsIF9yZHgsIFwKLQkJCQkJCSBfZWZsYWdzLCAidyIsIF9leCk7CVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSA0OgkJCQkJCQlcCi0JCQlfX2VtdWxhdGVfMW9wX3JheF9yZHhfZXgoX29wLCBfc3JjLCBfcmF4LCBfcmR4LCBcCi0JCQkJCQkgX2VmbGFncywgImwiLCBfZXgpOwlcCisJCQlfX2VtdWxhdGVfMW9wX3JheF9yZHgoY3R4dCwgX29wLCAibCIsIF9leCk7CVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJY2FzZSA4OiBPTjY0KAkJCQkJCVwKLQkJCV9fZW11bGF0ZV8xb3BfcmF4X3JkeF9leChfb3AsIF9zcmMsIF9yYXgsIF9yZHgsIFwKLQkJCQkJCSBfZWZsYWdzLCAicSIsIF9leCkpOwlcCisJCQlfX2VtdWxhdGVfMW9wX3JheF9yZHgoY3R4dCwgX29wLCAicSIsIF9leCkpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCX0JCQkJCQkJXAogCX0gd2hpbGUgKDApCkBAIC02NTEsNDEgKzY1MCw1MCBAQAogCXJldHVybiBjdHh0LT5vcHMtPnJlYWRfc3RkKGN0eHQsIGxpbmVhciwgZGF0YSwgc2l6ZSwgJmN0eHQtPmV4Y2VwdGlvbik7CiB9CiAKLXN0YXRpYyBpbnQgZG9faW5zbl9mZXRjaF9ieXRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBlaXAsIHU4ICpkZXN0KQorLyoKKyAqIEZldGNoIHRoZSBuZXh0IGJ5dGUgb2YgdGhlIGluc3RydWN0aW9uIGJlaW5nIGVtdWxhdGVkIHdoaWNoIGlzIHBvaW50ZWQgdG8KKyAqIGJ5IGN0eHQtPl9laXAsIHRoZW4gaW5jcmVtZW50IGN0eHQtPl9laXAuCisgKgorICogQWxzbyBwcmVmZXRjaCB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIHRoZSBpbnN0cnVjdGlvbiB3aXRob3V0IGNyb3NzaW5nIHBhZ2UKKyAqIGJvdW5kYXJ5IGlmIHRoZXkgYXJlIG5vdCBpbiBmZXRjaF9jYWNoZSB5ZXQuCisgKi8KK3N0YXRpYyBpbnQgZG9faW5zbl9mZXRjaF9ieXRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3QgZmV0Y2hfY2FjaGUgKmZjID0gJmN0eHQtPmZldGNoOwogCWludCByYzsKIAlpbnQgc2l6ZSwgY3VyX3NpemU7CiAKLQlpZiAoZWlwID09IGZjLT5lbmQpIHsKKwlpZiAoY3R4dC0+X2VpcCA9PSBmYy0+ZW5kKSB7CiAJCXVuc2lnbmVkIGxvbmcgbGluZWFyOwotCQlzdHJ1Y3Qgc2VnbWVudGVkX2FkZHJlc3MgYWRkciA9IHsgLnNlZz1WQ1BVX1NSRUdfQ1MsIC5lYT1laXB9OworCQlzdHJ1Y3Qgc2VnbWVudGVkX2FkZHJlc3MgYWRkciA9IHsgLnNlZyA9IFZDUFVfU1JFR19DUywKKwkJCQkJCSAgLmVhICA9IGN0eHQtPl9laXAgfTsKIAkJY3VyX3NpemUgPSBmYy0+ZW5kIC0gZmMtPnN0YXJ0OwotCQlzaXplID0gbWluKDE1VUwgLSBjdXJfc2l6ZSwgUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UoZWlwKSk7CisJCXNpemUgPSBtaW4oMTVVTCAtIGN1cl9zaXplLAorCQkJICAgUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UoY3R4dC0+X2VpcCkpOwogCQlyYyA9IF9fbGluZWFyaXplKGN0eHQsIGFkZHIsIHNpemUsIGZhbHNlLCB0cnVlLCAmbGluZWFyKTsKLQkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCisJCWlmICh1bmxpa2VseShyYyAhPSBYODZFTVVMX0NPTlRJTlVFKSkKIAkJCXJldHVybiByYzsKIAkJcmMgPSBjdHh0LT5vcHMtPmZldGNoKGN0eHQsIGxpbmVhciwgZmMtPmRhdGEgKyBjdXJfc2l6ZSwKIAkJCQkgICAgICBzaXplLCAmY3R4dC0+ZXhjZXB0aW9uKTsKLQkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCisJCWlmICh1bmxpa2VseShyYyAhPSBYODZFTVVMX0NPTlRJTlVFKSkKIAkJCXJldHVybiByYzsKIAkJZmMtPmVuZCArPSBzaXplOwogCX0KLQkqZGVzdCA9IGZjLT5kYXRhW2VpcCAtIGZjLT5zdGFydF07CisJKmRlc3QgPSBmYy0+ZGF0YVtjdHh0LT5fZWlwIC0gZmMtPnN0YXJ0XTsKKwljdHh0LT5fZWlwKys7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZG9faW5zbl9mZXRjaChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSB1bnNpZ25lZCBsb25nIGVpcCwgdm9pZCAqZGVzdCwgdW5zaWduZWQgc2l6ZSkKKwkJCSB2b2lkICpkZXN0LCB1bnNpZ25lZCBzaXplKQogewogCWludCByYzsKIAogCS8qIHg4NiBpbnN0cnVjdGlvbnMgYXJlIGxpbWl0ZWQgdG8gMTUgYnl0ZXMuICovCi0JaWYgKGVpcCArIHNpemUgLSBjdHh0LT5laXAgPiAxNSkKKwlpZiAodW5saWtlbHkoY3R4dC0+X2VpcCArIHNpemUgLSBjdHh0LT5laXAgPiAxNSkpCiAJCXJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKIAl3aGlsZSAoc2l6ZS0tKSB7Ci0JCXJjID0gZG9faW5zbl9mZXRjaF9ieXRlKGN0eHQsIGVpcCsrLCBkZXN0KyspOworCQlyYyA9IGRvX2luc25fZmV0Y2hfYnl0ZShjdHh0LCBkZXN0KyspOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCXJldHVybiByYzsKIAl9CkBAIC02OTMsMjAgKzcwMSwxOCBAQAogfQogCiAvKiBGZXRjaCBuZXh0IHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGJlaW5nIGVtdWxhdGVkLiAqLwotI2RlZmluZSBpbnNuX2ZldGNoKF90eXBlLCBfc2l6ZSwgX2VpcCkJCQkJCVwKKyNkZWZpbmUgaW5zbl9mZXRjaChfdHlwZSwgX2N0eHQpCQkJCQlcCiAoewl1bnNpZ25lZCBsb25nIF94OwkJCQkJCVwKLQlyYyA9IGRvX2luc25fZmV0Y2goY3R4dCwgKF9laXApLCAmX3gsIChfc2l6ZSkpOwkJCVwKKwlyYyA9IGRvX2luc25fZmV0Y2goX2N0eHQsICZfeCwgc2l6ZW9mKF90eXBlKSk7CQkJXAogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQkJCQkJXAogCQlnb3RvIGRvbmU7CQkJCQkJXAotCShfZWlwKSArPSAoX3NpemUpOwkJCQkJCVwKIAkoX3R5cGUpX3g7CQkJCQkJCVwKIH0pCiAKLSNkZWZpbmUgaW5zbl9mZXRjaF9hcnIoX2FyciwgX3NpemUsIF9laXApCQkJCVwKLSh7CXJjID0gZG9faW5zbl9mZXRjaChjdHh0LCAoX2VpcCksIF9hcnIsIChfc2l6ZSkpOwkJXAorI2RlZmluZSBpbnNuX2ZldGNoX2FycihfYXJyLCBfc2l6ZSwgX2N0eHQpCQkJCVwKKyh7CXJjID0gZG9faW5zbl9mZXRjaChfY3R4dCwgX2FyciwgKF9zaXplKSk7CQkJXAogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQkJCQkJXAogCQlnb3RvIGRvbmU7CQkJCQkJXAotCShfZWlwKSArPSAoX3NpemUpOwkJCQkJCVwKIH0pCiAKIC8qCkBAIC04OTQsNyArOTAwLDcgQEAKIAkJY3R4dC0+bW9kcm1fcm0gPSBiYXNlX3JlZyA9IChjdHh0LT5yZXhfcHJlZml4ICYgMSkgPDwgMzsgLyogUkVHLkIgKi8KIAl9CiAKLQljdHh0LT5tb2RybSA9IGluc25fZmV0Y2godTgsIDEsIGN0eHQtPl9laXApOworCWN0eHQtPm1vZHJtID0gaW5zbl9mZXRjaCh1OCwgY3R4dCk7CiAJY3R4dC0+bW9kcm1fbW9kIHw9IChjdHh0LT5tb2RybSAmIDB4YzApID4+IDY7CiAJY3R4dC0+bW9kcm1fcmVnIHw9IChjdHh0LT5tb2RybSAmIDB4MzgpID4+IDM7CiAJY3R4dC0+bW9kcm1fcm0gfD0gKGN0eHQtPm1vZHJtICYgMHgwNyk7CkBAIC05MjgsMTMgKzkzNCwxMyBAQAogCQlzd2l0Y2ggKGN0eHQtPm1vZHJtX21vZCkgewogCQljYXNlIDA6CiAJCQlpZiAoY3R4dC0+bW9kcm1fcm0gPT0gNikKLQkJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHUxNiwgMiwgY3R4dC0+X2VpcCk7CisJCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaCh1MTYsIGN0eHQpOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczgsIDEsIGN0eHQtPl9laXApOworCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaChzOCwgY3R4dCk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaCh1MTYsIDIsIGN0eHQtPl9laXApOworCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaCh1MTYsIGN0eHQpOwogCQkJYnJlYWs7CiAJCX0KIAkJc3dpdGNoIChjdHh0LT5tb2RybV9ybSkgewpAQCAtOTcxLDEzICs5NzcsMTMgQEAKIAl9IGVsc2UgewogCQkvKiAzMi82NC1iaXQgTW9kUi9NIGRlY29kZS4gKi8KIAkJaWYgKChjdHh0LT5tb2RybV9ybSAmIDcpID09IDQpIHsKLQkJCXNpYiA9IGluc25fZmV0Y2godTgsIDEsIGN0eHQtPl9laXApOworCQkJc2liID0gaW5zbl9mZXRjaCh1OCwgY3R4dCk7CiAJCQlpbmRleF9yZWcgfD0gKHNpYiA+PiAzKSAmIDc7CiAJCQliYXNlX3JlZyB8PSBzaWIgJiA3OwogCQkJc2NhbGUgPSBzaWIgPj4gNjsKIAogCQkJaWYgKChiYXNlX3JlZyAmIDcpID09IDUgJiYgY3R4dC0+bW9kcm1fbW9kID09IDApCi0JCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaChzMzIsIDQsIGN0eHQtPl9laXApOworCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczMyLCBjdHh0KTsKIAkJCWVsc2UKIAkJCQltb2RybV9lYSArPSBjdHh0LT5yZWdzW2Jhc2VfcmVnXTsKIAkJCWlmIChpbmRleF9yZWcgIT0gNCkKQEAgLTk5MCwxMyArOTk2LDEzIEBACiAJCXN3aXRjaCAoY3R4dC0+bW9kcm1fbW9kKSB7CiAJCWNhc2UgMDoKIAkJCWlmIChjdHh0LT5tb2RybV9ybSA9PSA1KQotCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczMyLCA0LCBjdHh0LT5fZWlwKTsKKwkJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHMzMiwgY3R4dCk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgotCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaChzOCwgMSwgY3R4dC0+X2VpcCk7CisJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHM4LCBjdHh0KTsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHMzMiwgNCwgY3R4dC0+X2VpcCk7CisJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHMzMiwgY3R4dCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTEwMTMsMTMgKzEwMTksMTMgQEAKIAlvcC0+dHlwZSA9IE9QX01FTTsKIAlzd2l0Y2ggKGN0eHQtPmFkX2J5dGVzKSB7CiAJY2FzZSAyOgotCQlvcC0+YWRkci5tZW0uZWEgPSBpbnNuX2ZldGNoKHUxNiwgMiwgY3R4dC0+X2VpcCk7CisJCW9wLT5hZGRyLm1lbS5lYSA9IGluc25fZmV0Y2godTE2LCBjdHh0KTsKIAkJYnJlYWs7CiAJY2FzZSA0OgotCQlvcC0+YWRkci5tZW0uZWEgPSBpbnNuX2ZldGNoKHUzMiwgNCwgY3R4dC0+X2VpcCk7CisJCW9wLT5hZGRyLm1lbS5lYSA9IGluc25fZmV0Y2godTMyLCBjdHh0KTsKIAkJYnJlYWs7CiAJY2FzZSA4OgotCQlvcC0+YWRkci5tZW0uZWEgPSBpbnNuX2ZldGNoKHU2NCwgOCwgY3R4dC0+X2VpcCk7CisJCW9wLT5hZGRyLm1lbS5lYSA9IGluc25fZmV0Y2godTY0LCBjdHh0KTsKIAkJYnJlYWs7CiAJfQogZG9uZToKQEAgLTE0NTIsMTUgKzE0NTgsMTggQEAKIAlyZXR1cm4gZW11bGF0ZV9wb3BmKGN0eHQsICZjdHh0LT5kc3QudmFsLCBjdHh0LT5vcF9ieXRlcyk7CiB9CiAKLXN0YXRpYyBpbnQgZW11bGF0ZV9wdXNoX3NyZWcoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBzZWcpCitzdGF0aWMgaW50IGVtX3B1c2hfc3JlZyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKKwlpbnQgc2VnID0gY3R4dC0+c3JjMi52YWw7CisKIAljdHh0LT5zcmMudmFsID0gZ2V0X3NlZ21lbnRfc2VsZWN0b3IoY3R4dCwgc2VnKTsKIAogCXJldHVybiBlbV9wdXNoKGN0eHQpOwogfQogCi1zdGF0aWMgaW50IGVtdWxhdGVfcG9wX3NyZWcoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBzZWcpCitzdGF0aWMgaW50IGVtX3BvcF9zcmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogeworCWludCBzZWcgPSBjdHh0LT5zcmMyLnZhbDsKIAl1bnNpZ25lZCBsb25nIHNlbGVjdG9yOwogCWludCByYzsKIApAQCAtMTY3NCw2NCArMTY4Myw3NCBAQAogewogCXN3aXRjaCAoY3R4dC0+bW9kcm1fcmVnKSB7CiAJY2FzZSAwOgkvKiByb2wgKi8KLQkJZW11bGF0ZV8yb3BfU3JjQigicm9sIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY0IoY3R4dCwgInJvbCIpOwogCQlicmVhazsKIAljYXNlIDE6CS8qIHJvciAqLwotCQllbXVsYXRlXzJvcF9TcmNCKCJyb3IiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8yb3BfU3JjQihjdHh0LCAicm9yIik7CiAJCWJyZWFrOwogCWNhc2UgMjoJLyogcmNsICovCi0JCWVtdWxhdGVfMm9wX1NyY0IoInJjbCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNCKGN0eHQsICJyY2wiKTsKIAkJYnJlYWs7CiAJY2FzZSAzOgkvKiByY3IgKi8KLQkJZW11bGF0ZV8yb3BfU3JjQigicmNyIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY0IoY3R4dCwgInJjciIpOwogCQlicmVhazsKIAljYXNlIDQ6CS8qIHNhbC9zaGwgKi8KIAljYXNlIDY6CS8qIHNhbC9zaGwgKi8KLQkJZW11bGF0ZV8yb3BfU3JjQigic2FsIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY0IoY3R4dCwgInNhbCIpOwogCQlicmVhazsKIAljYXNlIDU6CS8qIHNociAqLwotCQllbXVsYXRlXzJvcF9TcmNCKCJzaHIiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8yb3BfU3JjQihjdHh0LCAic2hyIik7CiAJCWJyZWFrOwogCWNhc2UgNzoJLyogc2FyICovCi0JCWVtdWxhdGVfMm9wX1NyY0IoInNhciIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNCKGN0eHQsICJzYXIiKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCi1zdGF0aWMgaW50IGVtX2dycDMoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCitzdGF0aWMgaW50IGVtX25vdChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQl1bnNpZ25lZCBsb25nICpyYXggPSAmY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKLQl1bnNpZ25lZCBsb25nICpyZHggPSAmY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKKwljdHh0LT5kc3QudmFsID0gfmN0eHQtPmRzdC52YWw7CisJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQgZW1fbmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworCWVtdWxhdGVfMW9wKGN0eHQsICJuZWciKTsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBlbV9tdWxfZXgoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJdTggZXggPSAwOworCisJZW11bGF0ZV8xb3BfcmF4X3JkeChjdHh0LCAibXVsIiwgZXgpOworCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW50IGVtX2ltdWxfZXgoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJdTggZXggPSAwOworCisJZW11bGF0ZV8xb3BfcmF4X3JkeChjdHh0LCAiaW11bCIsIGV4KTsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBlbV9kaXZfZXgoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CiAJdTggZGUgPSAwOwogCi0Jc3dpdGNoIChjdHh0LT5tb2RybV9yZWcpIHsKLQljYXNlIDAgLi4uIDE6CS8qIHRlc3QgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVigidGVzdCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwotCQlicmVhazsKLQljYXNlIDI6CS8qIG5vdCAqLwotCQljdHh0LT5kc3QudmFsID0gfmN0eHQtPmRzdC52YWw7Ci0JCWJyZWFrOwotCWNhc2UgMzoJLyogbmVnICovCi0JCWVtdWxhdGVfMW9wKCJuZWciLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgNDogLyogbXVsICovCi0JCWVtdWxhdGVfMW9wX3JheF9yZHgoIm11bCIsIGN0eHQtPnNyYywgKnJheCwgKnJkeCwgY3R4dC0+ZWZsYWdzKTsKLQkJYnJlYWs7Ci0JY2FzZSA1OiAvKiBpbXVsICovCi0JCWVtdWxhdGVfMW9wX3JheF9yZHgoImltdWwiLCBjdHh0LT5zcmMsICpyYXgsICpyZHgsIGN0eHQtPmVmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgNjogLyogZGl2ICovCi0JCWVtdWxhdGVfMW9wX3JheF9yZHhfZXgoImRpdiIsIGN0eHQtPnNyYywgKnJheCwgKnJkeCwKLQkJCQkgICAgICAgY3R4dC0+ZWZsYWdzLCBkZSk7Ci0JCWJyZWFrOwotCWNhc2UgNzogLyogaWRpdiAqLwotCQllbXVsYXRlXzFvcF9yYXhfcmR4X2V4KCJpZGl2IiwgY3R4dC0+c3JjLCAqcmF4LCAqcmR4LAotCQkJCSAgICAgICBjdHh0LT5lZmxhZ3MsIGRlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOwotCX0KKwllbXVsYXRlXzFvcF9yYXhfcmR4KGN0eHQsICJkaXYiLCBkZSk7CisJaWYgKGRlKQorCQlyZXR1cm4gZW11bGF0ZV9kZShjdHh0KTsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBlbV9pZGl2X2V4KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworCXU4IGRlID0gMDsKKworCWVtdWxhdGVfMW9wX3JheF9yZHgoY3R4dCwgImlkaXYiLCBkZSk7CiAJaWYgKGRlKQogCQlyZXR1cm4gZW11bGF0ZV9kZShjdHh0KTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKQEAgLTE3NDMsMTAgKzE3NjIsMTAgQEAKIAogCXN3aXRjaCAoY3R4dC0+bW9kcm1fcmVnKSB7CiAJY2FzZSAwOgkvKiBpbmMgKi8KLQkJZW11bGF0ZV8xb3AoImluYyIsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8xb3AoY3R4dCwgImluYyIpOwogCQlicmVhazsKIAljYXNlIDE6CS8qIGRlYyAqLwotCQllbXVsYXRlXzFvcCgiZGVjIiwgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzFvcChjdHh0LCAiZGVjIik7CiAJCWJyZWFrOwogCWNhc2UgMjogLyogY2FsbCBuZWFyIGFicyAqLyB7CiAJCWxvbmcgaW50IG9sZF9laXA7CkBAIC0xODEyLDggKzE4MzEsOSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBlbXVsYXRlX2xvYWRfc2VnbWVudChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgaW50IHNlZykKK3N0YXRpYyBpbnQgZW1fbHNlZyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKKwlpbnQgc2VnID0gY3R4dC0+c3JjMi52YWw7CiAJdW5zaWduZWQgc2hvcnQgc2VsOwogCWludCByYzsKIApAQCAtMjQ1Miw3ICsyNDcyLDcgQEAKIAljdHh0LT5zcmMudHlwZSA9IE9QX0lNTTsKIAljdHh0LT5zcmMudmFsID0gMDsKIAljdHh0LT5zcmMuYnl0ZXMgPSAxOwotCWVtdWxhdGVfMm9wX1NyY1YoIm9yIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAib3IiKTsKIAljdHh0LT5lZmxhZ3MgJj0gfihYODZfRUZMQUdTX0FGIHwgWDg2X0VGTEFHU19DRik7CiAJaWYgKGNmKQogCQljdHh0LT5lZmxhZ3MgfD0gWDg2X0VGTEFHU19DRjsKQEAgLTI1MDIsNDkgKzI1MjIsNDkgQEAKIAogc3RhdGljIGludCBlbV9hZGQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV8yb3BfU3JjVigiYWRkIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAiYWRkIik7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fb3Ioc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV8yb3BfU3JjVigib3IiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKGN0eHQsICJvciIpOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGVtX2FkYyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQllbXVsYXRlXzJvcF9TcmNWKCJhZGMiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKGN0eHQsICJhZGMiKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9zYmIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV8yb3BfU3JjVigic2JiIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAic2JiIik7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fYW5kKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCWVtdWxhdGVfMm9wX1NyY1YoImFuZCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCWVtdWxhdGVfMm9wX1NyY1YoY3R4dCwgImFuZCIpOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGVtX3N1YihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQllbXVsYXRlXzJvcF9TcmNWKCJzdWIiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKGN0eHQsICJzdWIiKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV94b3Ioc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV8yb3BfU3JjVigieG9yIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAieG9yIik7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fY21wKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCWVtdWxhdGVfMm9wX1NyY1YoImNtcCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCWVtdWxhdGVfMm9wX1NyY1YoY3R4dCwgImNtcCIpOwogCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwogCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKQEAgLTI1NTIsNyArMjU3Miw5IEBACiAKIHN0YXRpYyBpbnQgZW1fdGVzdChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQllbXVsYXRlXzJvcF9TcmNWKCJ0ZXN0IiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAidGVzdCIpOworCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLworCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIApAQCAtMjU3MCw3ICsyNTkyLDcgQEAKIAogc3RhdGljIGludCBlbV9pbXVsKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCWVtdWxhdGVfMm9wX1NyY1Zfbm9ieXRlKCJpbXVsIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoY3R4dCwgImltdWwiKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIApAQCAtMzAyNSw5ICszMDQ3LDE0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG9wY29kZSBncm91cDNbXSA9IHsKLQlEKERzdE1lbSB8IFNyY0ltbSB8IE1vZFJNKSwgRChEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSksCi0JRChEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBMb2NrKSwgRChEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBMb2NrKSwKLQlYNChEKFNyY01lbSB8IE1vZFJNKSksCisJSShEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSwgZW1fdGVzdCksCisJSShEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSwgZW1fdGVzdCksCisJSShEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBMb2NrLCBlbV9ub3QpLAorCUkoRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNIHwgTG9jaywgZW1fbmVnKSwKKwlJKFNyY01lbSB8IE1vZFJNLCBlbV9tdWxfZXgpLAorCUkoU3JjTWVtIHwgTW9kUk0sIGVtX2ltdWxfZXgpLAorCUkoU3JjTWVtIHwgTW9kUk0sIGVtX2Rpdl9leCksCisJSShTcmNNZW0gfCBNb2RSTSwgZW1faWRpdl9leCksCiB9OwogCiBzdGF0aWMgc3RydWN0IG9wY29kZSBncm91cDRbXSA9IHsKQEAgLTMwOTAsMTYgKzMxMTcsMjAgQEAKIHN0YXRpYyBzdHJ1Y3Qgb3Bjb2RlIG9wY29kZV90YWJsZVsyNTZdID0gewogCS8qIDB4MDAgLSAweDA3ICovCiAJSTZBTFUoTG9jaywgZW1fYWRkKSwKLQlEKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0KSwgRChJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCksCisJSShJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCB8IFNyYzJFUywgZW1fcHVzaF9zcmVnKSwKKwlJKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0IHwgU3JjMkVTLCBlbV9wb3Bfc3JlZyksCiAJLyogMHgwOCAtIDB4MEYgKi8KIAlJNkFMVShMb2NrLCBlbV9vciksCi0JRChJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCksIE4sCisJSShJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCB8IFNyYzJDUywgZW1fcHVzaF9zcmVnKSwKKwlOLAogCS8qIDB4MTAgLSAweDE3ICovCiAJSTZBTFUoTG9jaywgZW1fYWRjKSwKLQlEKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0KSwgRChJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCksCisJSShJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCB8IFNyYzJTUywgZW1fcHVzaF9zcmVnKSwKKwlJKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0IHwgU3JjMlNTLCBlbV9wb3Bfc3JlZyksCiAJLyogMHgxOCAtIDB4MUYgKi8KIAlJNkFMVShMb2NrLCBlbV9zYmIpLAotCUQoSW1wbGljaXRPcHMgfCBTdGFjayB8IE5vNjQpLCBEKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0KSwKKwlJKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0IHwgU3JjMkRTLCBlbV9wdXNoX3NyZWcpLAorCUkoSW1wbGljaXRPcHMgfCBTdGFjayB8IE5vNjQgfCBTcmMyRFMsIGVtX3BvcF9zcmVnKSwKIAkvKiAweDIwIC0gMHgyNyAqLwogCUk2QUxVKExvY2ssIGVtX2FuZCksIE4sIE4sCiAJLyogMHgyOCAtIDB4MkYgKi8KQEAgLTMxNjcsNyArMzE5OCw4IEBACiAJRDJidihEc3RNZW0gfCBTcmNJbW1CeXRlIHwgTW9kUk0pLAogCUkoSW1wbGljaXRPcHMgfCBTdGFjayB8IFNyY0ltbVUxNiwgZW1fcmV0X25lYXJfaW1tKSwKIAlJKEltcGxpY2l0T3BzIHwgU3RhY2ssIGVtX3JldCksCi0JRChEc3RSZWcgfCBTcmNNZW1GQWRkciB8IE1vZFJNIHwgTm82NCksIEQoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSB8IE5vNjQpLAorCUkoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSB8IE5vNjQgfCBTcmMyRVMsIGVtX2xzZWcpLAorCUkoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSB8IE5vNjQgfCBTcmMyRFMsIGVtX2xzZWcpLAogCUcoQnl0ZU9wLCBncm91cDExKSwgRygwLCBncm91cDExKSwKIAkvKiAweEM4IC0gMHhDRiAqLwogCU4sIE4sIE4sIEkoSW1wbGljaXRPcHMgfCBTdGFjaywgZW1fcmV0X2ZhciksCkBAIC0zMjQyLDIwICszMjc0LDIyIEBACiAJLyogMHg5MCAtIDB4OUYgKi8KIAlYMTYoRChCeXRlT3AgfCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk18IE1vdikpLAogCS8qIDB4QTAgLSAweEE3ICovCi0JRChJbXBsaWNpdE9wcyB8IFN0YWNrKSwgRChJbXBsaWNpdE9wcyB8IFN0YWNrKSwKKwlJKFN0YWNrIHwgU3JjMkZTLCBlbV9wdXNoX3NyZWcpLCBJKFN0YWNrIHwgU3JjMkZTLCBlbV9wb3Bfc3JlZyksCiAJREkoSW1wbGljaXRPcHMsIGNwdWlkKSwgRChEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IEJpdE9wKSwKIAlEKERzdE1lbSB8IFNyY1JlZyB8IFNyYzJJbW1CeXRlIHwgTW9kUk0pLAogCUQoRHN0TWVtIHwgU3JjUmVnIHwgU3JjMkNMIHwgTW9kUk0pLCBOLCBOLAogCS8qIDB4QTggLSAweEFGICovCi0JRChJbXBsaWNpdE9wcyB8IFN0YWNrKSwgRChJbXBsaWNpdE9wcyB8IFN0YWNrKSwKKwlJKFN0YWNrIHwgU3JjMkdTLCBlbV9wdXNoX3NyZWcpLCBJKFN0YWNrIHwgU3JjMkdTLCBlbV9wb3Bfc3JlZyksCiAJREkoSW1wbGljaXRPcHMsIHJzbSksIEQoRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0gfCBCaXRPcCB8IExvY2spLAogCUQoRHN0TWVtIHwgU3JjUmVnIHwgU3JjMkltbUJ5dGUgfCBNb2RSTSksCiAJRChEc3RNZW0gfCBTcmNSZWcgfCBTcmMyQ0wgfCBNb2RSTSksCiAJRChNb2RSTSksIEkoRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sIGVtX2ltdWwpLAogCS8qIDB4QjAgLSAweEI3ICovCiAJRDJidihEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IExvY2spLAotCUQoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSksIEQoRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0gfCBCaXRPcCB8IExvY2spLAotCUQoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSksIEQoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSksCisJSShEc3RSZWcgfCBTcmNNZW1GQWRkciB8IE1vZFJNIHwgU3JjMlNTLCBlbV9sc2VnKSwKKwlEKERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNIHwgQml0T3AgfCBMb2NrKSwKKwlJKERzdFJlZyB8IFNyY01lbUZBZGRyIHwgTW9kUk0gfCBTcmMyRlMsIGVtX2xzZWcpLAorCUkoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSB8IFNyYzJHUywgZW1fbHNlZyksCiAJRChCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiksIEQoRHN0UmVnIHwgU3JjTWVtMTYgfCBNb2RSTSB8IE1vdiksCiAJLyogMHhCOCAtIDB4QkYgKi8KIAlOLCBOLApAQCAtMzMwOSwxMyArMzM0MywxMyBAQAogCS8qIE5CLiBJbW1lZGlhdGVzIGFyZSBzaWduLWV4dGVuZGVkIGFzIG5lY2Vzc2FyeS4gKi8KIAlzd2l0Y2ggKG9wLT5ieXRlcykgewogCWNhc2UgMToKLQkJb3AtPnZhbCA9IGluc25fZmV0Y2goczgsIDEsIGN0eHQtPl9laXApOworCQlvcC0+dmFsID0gaW5zbl9mZXRjaChzOCwgY3R4dCk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJb3AtPnZhbCA9IGluc25fZmV0Y2goczE2LCAyLCBjdHh0LT5fZWlwKTsKKwkJb3AtPnZhbCA9IGluc25fZmV0Y2goczE2LCBjdHh0KTsKIAkJYnJlYWs7CiAJY2FzZSA0OgotCQlvcC0+dmFsID0gaW5zbl9mZXRjaChzMzIsIDQsIGN0eHQtPl9laXApOworCQlvcC0+dmFsID0gaW5zbl9mZXRjaChzMzIsIGN0eHQpOwogCQlicmVhazsKIAl9CiAJaWYgKCFzaWduX2V4dGVuc2lvbikgewpAQCAtMzMzNSw2ICszMzY5LDEyNSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBkZWNvZGVfb3BlcmFuZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgc3RydWN0IG9wZXJhbmQgKm9wLAorCQkJICB1bnNpZ25lZCBkKQoreworCWludCByYyA9IFg4NkVNVUxfQ09OVElOVUU7CisKKwlzd2l0Y2ggKGQpIHsKKwljYXNlIE9wUmVnOgorCQlkZWNvZGVfcmVnaXN0ZXJfb3BlcmFuZChjdHh0LCBvcCwKKwkJCSBvcCA9PSAmY3R4dC0+ZHN0ICYmCisJCQkgY3R4dC0+dHdvYnl0ZSAmJiAoY3R4dC0+YiA9PSAweGI2IHx8IGN0eHQtPmIgPT0gMHhiNykpOworCQlicmVhazsKKwljYXNlIE9wSW1tVUJ5dGU6CisJCXJjID0gZGVjb2RlX2ltbShjdHh0LCBvcCwgMSwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIE9wTWVtOgorCQljdHh0LT5tZW1vcC5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKKwltZW1fY29tbW9uOgorCQkqb3AgPSBjdHh0LT5tZW1vcDsKKwkJY3R4dC0+bWVtb3BwID0gb3A7CisJCWlmICgoY3R4dC0+ZCAmIEJpdE9wKSAmJiBvcCA9PSAmY3R4dC0+ZHN0KQorCQkJZmV0Y2hfYml0X29wZXJhbmQoY3R4dCk7CisJCW9wLT5vcmlnX3ZhbCA9IG9wLT52YWw7CisJCWJyZWFrOworCWNhc2UgT3BNZW02NDoKKwkJY3R4dC0+bWVtb3AuYnl0ZXMgPSA4OworCQlnb3RvIG1lbV9jb21tb247CisJY2FzZSBPcEFjYzoKKwkJb3AtPnR5cGUgPSBPUF9SRUc7CisJCW9wLT5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKKwkJb3AtPmFkZHIucmVnID0gJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF07CisJCWZldGNoX3JlZ2lzdGVyX29wZXJhbmQob3ApOworCQlvcC0+b3JpZ192YWwgPSBvcC0+dmFsOworCQlicmVhazsKKwljYXNlIE9wREk6CisJCW9wLT50eXBlID0gT1BfTUVNOworCQlvcC0+Ynl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7CisJCW9wLT5hZGRyLm1lbS5lYSA9CisJCQlyZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JESV0pOworCQlvcC0+YWRkci5tZW0uc2VnID0gVkNQVV9TUkVHX0VTOworCQlvcC0+dmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBPcERYOgorCQlvcC0+dHlwZSA9IE9QX1JFRzsKKwkJb3AtPmJ5dGVzID0gMjsKKwkJb3AtPmFkZHIucmVnID0gJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JEWF07CisJCWZldGNoX3JlZ2lzdGVyX29wZXJhbmQob3ApOworCQlicmVhazsKKwljYXNlIE9wQ0w6CisJCW9wLT5ieXRlcyA9IDE7CisJCW9wLT52YWwgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdICYgMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBPcEltbUJ5dGU6CisJCXJjID0gZGVjb2RlX2ltbShjdHh0LCBvcCwgMSwgdHJ1ZSk7CisJCWJyZWFrOworCWNhc2UgT3BPbmU6CisJCW9wLT5ieXRlcyA9IDE7CisJCW9wLT52YWwgPSAxOworCQlicmVhazsKKwljYXNlIE9wSW1tOgorCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgb3AsIGltbV9zaXplKGN0eHQpLCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBPcE1lbTE2OgorCQljdHh0LT5tZW1vcC5ieXRlcyA9IDI7CisJCWdvdG8gbWVtX2NvbW1vbjsKKwljYXNlIE9wTWVtMzI6CisJCWN0eHQtPm1lbW9wLmJ5dGVzID0gNDsKKwkJZ290byBtZW1fY29tbW9uOworCWNhc2UgT3BJbW1VMTY6CisJCXJjID0gZGVjb2RlX2ltbShjdHh0LCBvcCwgMiwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIE9wSW1tVToKKwkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsIG9wLCBpbW1fc2l6ZShjdHh0KSwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIE9wU0k6CisJCW9wLT50eXBlID0gT1BfTUVNOworCQlvcC0+Ynl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7CisJCW9wLT5hZGRyLm1lbS5lYSA9CisJCQlyZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JTSV0pOworCQlvcC0+YWRkci5tZW0uc2VnID0gc2VnX292ZXJyaWRlKGN0eHQpOworCQlvcC0+dmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBPcEltbUZBZGRyOgorCQlvcC0+dHlwZSA9IE9QX0lNTTsKKwkJb3AtPmFkZHIubWVtLmVhID0gY3R4dC0+X2VpcDsKKwkJb3AtPmJ5dGVzID0gY3R4dC0+b3BfYnl0ZXMgKyAyOworCQlpbnNuX2ZldGNoX2FycihvcC0+dmFscHRyLCBvcC0+Ynl0ZXMsIGN0eHQpOworCQlicmVhazsKKwljYXNlIE9wTWVtRkFkZHI6CisJCWN0eHQtPm1lbW9wLmJ5dGVzID0gY3R4dC0+b3BfYnl0ZXMgKyAyOworCQlnb3RvIG1lbV9jb21tb247CisJY2FzZSBPcEVTOgorCQlvcC0+dmFsID0gVkNQVV9TUkVHX0VTOworCQlicmVhazsKKwljYXNlIE9wQ1M6CisJCW9wLT52YWwgPSBWQ1BVX1NSRUdfQ1M7CisJCWJyZWFrOworCWNhc2UgT3BTUzoKKwkJb3AtPnZhbCA9IFZDUFVfU1JFR19TUzsKKwkJYnJlYWs7CisJY2FzZSBPcERTOgorCQlvcC0+dmFsID0gVkNQVV9TUkVHX0RTOworCQlicmVhazsKKwljYXNlIE9wRlM6CisJCW9wLT52YWwgPSBWQ1BVX1NSRUdfRlM7CisJCWJyZWFrOworCWNhc2UgT3BHUzoKKwkJb3AtPnZhbCA9IFZDUFVfU1JFR19HUzsKKwkJYnJlYWs7CisJY2FzZSBPcEltcGxpY2l0OgorCQkvKiBTcGVjaWFsIGluc3RydWN0aW9ucyBkbyB0aGVpciBvd24gb3BlcmFuZCBkZWNvZGluZy4gKi8KKwlkZWZhdWx0OgorCQlvcC0+dHlwZSA9IE9QX05PTkU7IC8qIERpc2FibGUgd3JpdGViYWNrLiAqLworCQlicmVhazsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCiBpbnQgeDg2X2RlY29kZV9pbnNuKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB2b2lkICppbnNuLCBpbnQgaW5zbl9sZW4pCiB7CiAJaW50IHJjID0gWDg2RU1VTF9DT05USU5VRTsKQEAgLTMzNDIsOCArMzQ5NSw5IEBACiAJaW50IGRlZl9vcF9ieXRlcywgZGVmX2FkX2J5dGVzLCBnb2Zmc2V0LCBzaW1kX3ByZWZpeDsKIAlib29sIG9wX3ByZWZpeCA9IGZhbHNlOwogCXN0cnVjdCBvcGNvZGUgb3Bjb2RlOwotCXN0cnVjdCBvcGVyYW5kIG1lbW9wID0geyAudHlwZSA9IE9QX05PTkUgfSwgKm1lbW9wcCA9IE5VTEw7CiAKKwljdHh0LT5tZW1vcC50eXBlID0gT1BfTk9ORTsKKwljdHh0LT5tZW1vcHAgPSBOVUxMOwogCWN0eHQtPl9laXAgPSBjdHh0LT5laXA7CiAJY3R4dC0+ZmV0Y2guc3RhcnQgPSBjdHh0LT5fZWlwOwogCWN0eHQtPmZldGNoLmVuZCA9IGN0eHQtPmZldGNoLnN0YXJ0ICsgaW5zbl9sZW47CkBAIC0zMzY2LDcgKzM1MjAsNyBAQAogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIEVNVUxBVElPTl9GQUlMRUQ7CiAJfQogCiAJY3R4dC0+b3BfYnl0ZXMgPSBkZWZfb3BfYnl0ZXM7CkBAIC0zMzc0LDcgKzM1MjgsNyBAQAogCiAJLyogTGVnYWN5IHByZWZpeGVzLiAqLwogCWZvciAoOzspIHsKLQkJc3dpdGNoIChjdHh0LT5iID0gaW5zbl9mZXRjaCh1OCwgMSwgY3R4dC0+X2VpcCkpIHsKKwkJc3dpdGNoIChjdHh0LT5iID0gaW5zbl9mZXRjaCh1OCwgY3R4dCkpIHsKIAkJY2FzZSAweDY2OgkvKiBvcGVyYW5kLXNpemUgb3ZlcnJpZGUgKi8KIAkJCW9wX3ByZWZpeCA9IHRydWU7CiAJCQkvKiBzd2l0Y2ggYmV0d2VlbiAyLzQgYnl0ZXMgKi8KQEAgLTM0MzAsNyArMzU4NCw3IEBACiAJLyogVHdvLWJ5dGUgb3Bjb2RlPyAqLwogCWlmIChjdHh0LT5iID09IDB4MGYpIHsKIAkJY3R4dC0+dHdvYnl0ZSA9IDE7Ci0JCWN0eHQtPmIgPSBpbnNuX2ZldGNoKHU4LCAxLCBjdHh0LT5fZWlwKTsKKwkJY3R4dC0+YiA9IGluc25fZmV0Y2godTgsIGN0eHQpOwogCQlvcGNvZGUgPSB0d29ieXRlX3RhYmxlW2N0eHQtPmJdOwogCX0KIAljdHh0LT5kID0gb3Bjb2RlLmZsYWdzOwpAQCAtMzQzOCwxMyArMzU5MiwxMyBAQAogCXdoaWxlIChjdHh0LT5kICYgR3JvdXBNYXNrKSB7CiAJCXN3aXRjaCAoY3R4dC0+ZCAmIEdyb3VwTWFzaykgewogCQljYXNlIEdyb3VwOgotCQkJY3R4dC0+bW9kcm0gPSBpbnNuX2ZldGNoKHU4LCAxLCBjdHh0LT5fZWlwKTsKKwkJCWN0eHQtPm1vZHJtID0gaW5zbl9mZXRjaCh1OCwgY3R4dCk7CiAJCQktLWN0eHQtPl9laXA7CiAJCQlnb2Zmc2V0ID0gKGN0eHQtPm1vZHJtID4+IDMpICYgNzsKIAkJCW9wY29kZSA9IG9wY29kZS51Lmdyb3VwW2dvZmZzZXRdOwogCQkJYnJlYWs7CiAJCWNhc2UgR3JvdXBEdWFsOgotCQkJY3R4dC0+bW9kcm0gPSBpbnNuX2ZldGNoKHU4LCAxLCBjdHh0LT5fZWlwKTsKKwkJCWN0eHQtPm1vZHJtID0gaW5zbl9mZXRjaCh1OCwgY3R4dCk7CiAJCQktLWN0eHQtPl9laXA7CiAJCQlnb2Zmc2V0ID0gKGN0eHQtPm1vZHJtID4+IDMpICYgNzsKIAkJCWlmICgoY3R4dC0+bW9kcm0gPj4gNikgPT0gMykKQEAgLTM0NTgsNyArMzYxMiw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBQcmVmaXg6CiAJCQlpZiAoY3R4dC0+cmVwX3ByZWZpeCAmJiBvcF9wcmVmaXgpCi0JCQkJcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworCQkJCXJldHVybiBFTVVMQVRJT05fRkFJTEVEOwogCQkJc2ltZF9wcmVmaXggPSBvcF9wcmVmaXggPyAweDY2IDogY3R4dC0+cmVwX3ByZWZpeDsKIAkJCXN3aXRjaCAoc2ltZF9wcmVmaXgpIHsKIAkJCWNhc2UgMHgwMDogb3Bjb2RlID0gb3Bjb2RlLnUuZ3ByZWZpeC0+cGZ4X25vOyBicmVhazsKQEAgLTM0NjgsMTAgKzM2MjIsMTAgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworCQkJcmV0dXJuIEVNVUxBVElPTl9GQUlMRUQ7CiAJCX0KIAotCQljdHh0LT5kICY9IH5Hcm91cE1hc2s7CisJCWN0eHQtPmQgJj0gfih1NjQpR3JvdXBNYXNrOwogCQljdHh0LT5kIHw9IG9wY29kZS5mbGFnczsKIAl9CiAKQEAgLTM0ODEsMTAgKzM2MzUsMTAgQEAKIAogCS8qIFVucmVjb2duaXNlZD8gKi8KIAlpZiAoY3R4dC0+ZCA9PSAwIHx8IChjdHh0LT5kICYgVW5kZWZpbmVkKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gRU1VTEFUSU9OX0ZBSUxFRDsKIAogCWlmICghKGN0eHQtPmQgJiBWZW5kb3JTcGVjaWZpYykgJiYgY3R4dC0+b25seV92ZW5kb3Jfc3BlY2lmaWNfaW5zbikKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gRU1VTEFUSU9OX0ZBSUxFRDsKIAogCWlmIChtb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQgJiYgKGN0eHQtPmQgJiBTdGFjaykpCiAJCWN0eHQtPm9wX2J5dGVzID0gODsKQEAgLTM1MDEsOTYgKzM2NTUsMjcgQEAKIAogCS8qIE1vZFJNIGFuZCBTSUIgYnl0ZXMuICovCiAJaWYgKGN0eHQtPmQgJiBNb2RSTSkgewotCQlyYyA9IGRlY29kZV9tb2RybShjdHh0LCAmbWVtb3ApOworCQlyYyA9IGRlY29kZV9tb2RybShjdHh0LCAmY3R4dC0+bWVtb3ApOwogCQlpZiAoIWN0eHQtPmhhc19zZWdfb3ZlcnJpZGUpCiAJCQlzZXRfc2VnX292ZXJyaWRlKGN0eHQsIGN0eHQtPm1vZHJtX3NlZyk7CiAJfSBlbHNlIGlmIChjdHh0LT5kICYgTWVtQWJzKQotCQlyYyA9IGRlY29kZV9hYnMoY3R4dCwgJm1lbW9wKTsKKwkJcmMgPSBkZWNvZGVfYWJzKGN0eHQsICZjdHh0LT5tZW1vcCk7CiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCWdvdG8gZG9uZTsKIAogCWlmICghY3R4dC0+aGFzX3NlZ19vdmVycmlkZSkKIAkJc2V0X3NlZ19vdmVycmlkZShjdHh0LCBWQ1BVX1NSRUdfRFMpOwogCi0JbWVtb3AuYWRkci5tZW0uc2VnID0gc2VnX292ZXJyaWRlKGN0eHQpOworCWN0eHQtPm1lbW9wLmFkZHIubWVtLnNlZyA9IHNlZ19vdmVycmlkZShjdHh0KTsKIAotCWlmIChtZW1vcC50eXBlID09IE9QX01FTSAmJiBjdHh0LT5hZF9ieXRlcyAhPSA4KQotCQltZW1vcC5hZGRyLm1lbS5lYSA9ICh1MzIpbWVtb3AuYWRkci5tZW0uZWE7CisJaWYgKGN0eHQtPm1lbW9wLnR5cGUgPT0gT1BfTUVNICYmIGN0eHQtPmFkX2J5dGVzICE9IDgpCisJCWN0eHQtPm1lbW9wLmFkZHIubWVtLmVhID0gKHUzMiljdHh0LT5tZW1vcC5hZGRyLm1lbS5lYTsKIAogCS8qCiAJICogRGVjb2RlIGFuZCBmZXRjaCB0aGUgc291cmNlIG9wZXJhbmQ6IHJlZ2lzdGVyLCBtZW1vcnkKIAkgKiBvciBpbW1lZGlhdGUuCiAJICovCi0Jc3dpdGNoIChjdHh0LT5kICYgU3JjTWFzaykgewotCWNhc2UgU3JjTm9uZToKLQkJYnJlYWs7Ci0JY2FzZSBTcmNSZWc6Ci0JCWRlY29kZV9yZWdpc3Rlcl9vcGVyYW5kKGN0eHQsICZjdHh0LT5zcmMsIDApOwotCQlicmVhazsKLQljYXNlIFNyY01lbTE2OgotCQltZW1vcC5ieXRlcyA9IDI7Ci0JCWdvdG8gc3JjbWVtX2NvbW1vbjsKLQljYXNlIFNyY01lbTMyOgotCQltZW1vcC5ieXRlcyA9IDQ7Ci0JCWdvdG8gc3JjbWVtX2NvbW1vbjsKLQljYXNlIFNyY01lbToKLQkJbWVtb3AuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDoKLQkJCQkJCQkgICBjdHh0LT5vcF9ieXRlczsKLQlzcmNtZW1fY29tbW9uOgotCQljdHh0LT5zcmMgPSBtZW1vcDsKLQkJbWVtb3BwID0gJmN0eHQtPnNyYzsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNJbW1VMTY6Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmY3R4dC0+c3JjLCAyLCBmYWxzZSk7Ci0JCWJyZWFrOwotCWNhc2UgU3JjSW1tOgotCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgJmN0eHQtPnNyYywgaW1tX3NpemUoY3R4dCksIHRydWUpOwotCQlicmVhazsKLQljYXNlIFNyY0ltbVU6Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmY3R4dC0+c3JjLCBpbW1fc2l6ZShjdHh0KSwgZmFsc2UpOwotCQlicmVhazsKLQljYXNlIFNyY0ltbUJ5dGU6Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmY3R4dC0+c3JjLCAxLCB0cnVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNJbW1VQnl0ZToKLQkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjdHh0LT5zcmMsIDEsIGZhbHNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNBY2M6Ci0JCWN0eHQtPnNyYy50eXBlID0gT1BfUkVHOwotCQljdHh0LT5zcmMuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7Ci0JCWN0eHQtPnNyYy5hZGRyLnJlZyA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCQlmZXRjaF9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5zcmMpOwotCQlicmVhazsKLQljYXNlIFNyY09uZToKLQkJY3R4dC0+c3JjLmJ5dGVzID0gMTsKLQkJY3R4dC0+c3JjLnZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU3JjU0k6Ci0JCWN0eHQtPnNyYy50eXBlID0gT1BfTUVNOwotCQljdHh0LT5zcmMuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7Ci0JCWN0eHQtPnNyYy5hZGRyLm1lbS5lYSA9Ci0JCQlyZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JTSV0pOwotCQljdHh0LT5zcmMuYWRkci5tZW0uc2VnID0gc2VnX292ZXJyaWRlKGN0eHQpOwotCQljdHh0LT5zcmMudmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNJbW1GQWRkcjoKLQkJY3R4dC0+c3JjLnR5cGUgPSBPUF9JTU07Ci0JCWN0eHQtPnNyYy5hZGRyLm1lbS5lYSA9IGN0eHQtPl9laXA7Ci0JCWN0eHQtPnNyYy5ieXRlcyA9IGN0eHQtPm9wX2J5dGVzICsgMjsKLQkJaW5zbl9mZXRjaF9hcnIoY3R4dC0+c3JjLnZhbHB0ciwgY3R4dC0+c3JjLmJ5dGVzLCBjdHh0LT5fZWlwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNNZW1GQWRkcjoKLQkJbWVtb3AuYnl0ZXMgPSBjdHh0LT5vcF9ieXRlcyArIDI7Ci0JCWdvdG8gc3JjbWVtX2NvbW1vbjsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNEWDoKLQkJY3R4dC0+c3JjLnR5cGUgPSBPUF9SRUc7Ci0JCWN0eHQtPnNyYy5ieXRlcyA9IDI7Ci0JCWN0eHQtPnNyYy5hZGRyLnJlZyA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdOwotCQlmZXRjaF9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5zcmMpOwotCQlicmVhazsKLQl9Ci0KKwlyYyA9IGRlY29kZV9vcGVyYW5kKGN0eHQsICZjdHh0LT5zcmMsIChjdHh0LT5kID4+IFNyY1NoaWZ0KSAmIE9wTWFzayk7CiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCWdvdG8gZG9uZTsKIApAQCAtMzU5OCw4NSArMzY4MywxOCBAQAogCSAqIERlY29kZSBhbmQgZmV0Y2ggdGhlIHNlY29uZCBzb3VyY2Ugb3BlcmFuZDogcmVnaXN0ZXIsIG1lbW9yeQogCSAqIG9yIGltbWVkaWF0ZS4KIAkgKi8KLQlzd2l0Y2ggKGN0eHQtPmQgJiBTcmMyTWFzaykgewotCWNhc2UgU3JjMk5vbmU6Ci0JCWJyZWFrOwotCWNhc2UgU3JjMkNMOgotCQljdHh0LT5zcmMyLmJ5dGVzID0gMTsKLQkJY3R4dC0+c3JjMi52YWwgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdICYgMHhmZjsKLQkJYnJlYWs7Ci0JY2FzZSBTcmMySW1tQnl0ZToKLQkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjdHh0LT5zcmMyLCAxLCB0cnVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTcmMyT25lOgotCQljdHh0LT5zcmMyLmJ5dGVzID0gMTsKLQkJY3R4dC0+c3JjMi52YWwgPSAxOwotCQlicmVhazsKLQljYXNlIFNyYzJJbW06Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmY3R4dC0+c3JjMiwgaW1tX3NpemUoY3R4dCksIHRydWUpOwotCQlicmVhazsKLQl9Ci0KKwlyYyA9IGRlY29kZV9vcGVyYW5kKGN0eHQsICZjdHh0LT5zcmMyLCAoY3R4dC0+ZCA+PiBTcmMyU2hpZnQpICYgT3BNYXNrKTsKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJZ290byBkb25lOwogCiAJLyogRGVjb2RlIGFuZCBmZXRjaCB0aGUgZGVzdGluYXRpb24gb3BlcmFuZDogcmVnaXN0ZXIgb3IgbWVtb3J5LiAqLwotCXN3aXRjaCAoY3R4dC0+ZCAmIERzdE1hc2spIHsKLQljYXNlIERzdFJlZzoKLQkJZGVjb2RlX3JlZ2lzdGVyX29wZXJhbmQoY3R4dCwgJmN0eHQtPmRzdCwKLQkJCSBjdHh0LT50d29ieXRlICYmIChjdHh0LT5iID09IDB4YjYgfHwgY3R4dC0+YiA9PSAweGI3KSk7Ci0JCWJyZWFrOwotCWNhc2UgRHN0SW1tVUJ5dGU6Ci0JCWN0eHQtPmRzdC50eXBlID0gT1BfSU1NOwotCQljdHh0LT5kc3QuYWRkci5tZW0uZWEgPSBjdHh0LT5fZWlwOwotCQljdHh0LT5kc3QuYnl0ZXMgPSAxOwotCQljdHh0LT5kc3QudmFsID0gaW5zbl9mZXRjaCh1OCwgMSwgY3R4dC0+X2VpcCk7Ci0JCWJyZWFrOwotCWNhc2UgRHN0TWVtOgotCWNhc2UgRHN0TWVtNjQ6Ci0JCWN0eHQtPmRzdCA9IG1lbW9wOwotCQltZW1vcHAgPSAmY3R4dC0+ZHN0OwotCQlpZiAoKGN0eHQtPmQgJiBEc3RNYXNrKSA9PSBEc3RNZW02NCkKLQkJCWN0eHQtPmRzdC5ieXRlcyA9IDg7Ci0JCWVsc2UKLQkJCWN0eHQtPmRzdC5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKLQkJaWYgKGN0eHQtPmQgJiBCaXRPcCkKLQkJCWZldGNoX2JpdF9vcGVyYW5kKGN0eHQpOwotCQljdHh0LT5kc3Qub3JpZ192YWwgPSBjdHh0LT5kc3QudmFsOwotCQlicmVhazsKLQljYXNlIERzdEFjYzoKLQkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9SRUc7Ci0JCWN0eHQtPmRzdC5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKLQkJY3R4dC0+ZHN0LmFkZHIucmVnID0gJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF07Ci0JCWZldGNoX3JlZ2lzdGVyX29wZXJhbmQoJmN0eHQtPmRzdCk7Ci0JCWN0eHQtPmRzdC5vcmlnX3ZhbCA9IGN0eHQtPmRzdC52YWw7Ci0JCWJyZWFrOwotCWNhc2UgRHN0REk6Ci0JCWN0eHQtPmRzdC50eXBlID0gT1BfTUVNOwotCQljdHh0LT5kc3QuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7Ci0JCWN0eHQtPmRzdC5hZGRyLm1lbS5lYSA9Ci0JCQlyZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JESV0pOwotCQljdHh0LT5kc3QuYWRkci5tZW0uc2VnID0gVkNQVV9TUkVHX0VTOwotCQljdHh0LT5kc3QudmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBEc3REWDoKLQkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9SRUc7Ci0JCWN0eHQtPmRzdC5ieXRlcyA9IDI7Ci0JCWN0eHQtPmRzdC5hZGRyLnJlZyA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdOwotCQlmZXRjaF9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5kc3QpOwotCQlicmVhazsKLQljYXNlIEltcGxpY2l0T3BzOgotCQkvKiBTcGVjaWFsIGluc3RydWN0aW9ucyBkbyB0aGVpciBvd24gb3BlcmFuZCBkZWNvZGluZy4gKi8KLQlkZWZhdWx0OgotCQljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7IC8qIERpc2FibGUgd3JpdGViYWNrLiAqLwotCQlicmVhazsKLQl9CisJcmMgPSBkZWNvZGVfb3BlcmFuZChjdHh0LCAmY3R4dC0+ZHN0LCAoY3R4dC0+ZCA+PiBEc3RTaGlmdCkgJiBPcE1hc2spOwogCiBkb25lOgotCWlmIChtZW1vcHAgJiYgbWVtb3BwLT50eXBlID09IE9QX01FTSAmJiBjdHh0LT5yaXBfcmVsYXRpdmUpCi0JCW1lbW9wcC0+YWRkci5tZW0uZWEgKz0gY3R4dC0+X2VpcDsKKwlpZiAoY3R4dC0+bWVtb3BwICYmIGN0eHQtPm1lbW9wcC0+dHlwZSA9PSBPUF9NRU0gJiYgY3R4dC0+cmlwX3JlbGF0aXZlKQorCQljdHh0LT5tZW1vcHAtPmFkZHIubWVtLmVhICs9IGN0eHQtPl9laXA7CiAKLQlyZXR1cm4gKHJjID09IFg4NkVNVUxfVU5IQU5ETEVBQkxFKSA/IEVNVUxBVElPTl9GQUlMRUQgOiBFTVVMQVRJT05fT0s7CisJcmV0dXJuIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKSA/IEVNVUxBVElPTl9GQUlMRUQgOiBFTVVMQVRJT05fT0s7CiB9CiAKIHN0YXRpYyBib29sIHN0cmluZ19pbnNuX2NvbXBsZXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKQEAgLTM4MjUsMzIgKzM4NDMsMTEgQEAKIAkJZ290byB0d29ieXRlX2luc247CiAKIAlzd2l0Y2ggKGN0eHQtPmIpIHsKLQljYXNlIDB4MDY6CQkvKiBwdXNoIGVzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0VTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDA3OgkJLyogcG9wIGVzICovCi0JCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBWQ1BVX1NSRUdfRVMpOwotCQlicmVhazsKLQljYXNlIDB4MGU6CQkvKiBwdXNoIGNzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0NTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDE2OgkJLyogcHVzaCBzcyAqLwotCQlyYyA9IGVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIFZDUFVfU1JFR19TUyk7Ci0JCWJyZWFrOwotCWNhc2UgMHgxNzoJCS8qIHBvcCBzcyAqLwotCQlyYyA9IGVtdWxhdGVfcG9wX3NyZWcoY3R4dCwgVkNQVV9TUkVHX1NTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDFlOgkJLyogcHVzaCBkcyAqLwotCQlyYyA9IGVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIFZDUFVfU1JFR19EUyk7Ci0JCWJyZWFrOwotCWNhc2UgMHgxZjoJCS8qIHBvcCBkcyAqLwotCQlyYyA9IGVtdWxhdGVfcG9wX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0RTKTsKLQkJYnJlYWs7CiAJY2FzZSAweDQwIC4uLiAweDQ3OiAvKiBpbmMgcjE2L3IzMiAqLwotCQllbXVsYXRlXzFvcCgiaW5jIiwgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzFvcChjdHh0LCAiaW5jIik7CiAJCWJyZWFrOwogCWNhc2UgMHg0OCAuLi4gMHg0ZjogLyogZGVjIHIxNi9yMzIgKi8KLQkJZW11bGF0ZV8xb3AoImRlYyIsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8xb3AoY3R4dCwgImRlYyIpOwogCQlicmVhazsKIAljYXNlIDB4NjM6CQkvKiBtb3ZzeGQgKi8KIAkJaWYgKGN0eHQtPm1vZGUgIT0gWDg2RU1VTF9NT0RFX1BST1Q2NCkKQEAgLTM4OTEsMTIgKzM4ODgsNiBAQAogCWNhc2UgMHhjMCAuLi4gMHhjMToKIAkJcmMgPSBlbV9ncnAyKGN0eHQpOwogCQlicmVhazsKLQljYXNlIDB4YzQ6CQkvKiBsZXMgKi8KLQkJcmMgPSBlbXVsYXRlX2xvYWRfc2VnbWVudChjdHh0LCBWQ1BVX1NSRUdfRVMpOwotCQlicmVhazsKLQljYXNlIDB4YzU6CQkvKiBsZHMgKi8KLQkJcmMgPSBlbXVsYXRlX2xvYWRfc2VnbWVudChjdHh0LCBWQ1BVX1NSRUdfRFMpOwotCQlicmVhazsKIAljYXNlIDB4Y2M6CQkvKiBpbnQzICovCiAJCXJjID0gZW11bGF0ZV9pbnQoY3R4dCwgMyk7CiAJCWJyZWFrOwpAQCAtMzk1Myw5ICszOTQ0LDYgQEAKIAkJLyogY29tcGxlbWVudCBjYXJyeSBmbGFnIGZyb20gZWZsYWdzIHJlZyAqLwogCQljdHh0LT5lZmxhZ3MgXj0gRUZMR19DRjsKIAkJYnJlYWs7Ci0JY2FzZSAweGY2IC4uLiAweGY3OgkvKiBHcnAzICovCi0JCXJjID0gZW1fZ3JwMyhjdHh0KTsKLQkJYnJlYWs7CiAJY2FzZSAweGY4OiAvKiBjbGMgKi8KIAkJY3R4dC0+ZWZsYWdzICY9IH5FRkxHX0NGOwogCQlicmVhazsKQEAgLTQxMDMsMzYgKzQwOTEsMjQgQEAKIAljYXNlIDB4OTAgLi4uIDB4OWY6ICAgICAvKiBzZXRjYyByL204ICovCiAJCWN0eHQtPmRzdC52YWwgPSB0ZXN0X2NjKGN0eHQtPmIsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgMHhhMDoJICAvKiBwdXNoIGZzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0ZTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweGExOgkgLyogcG9wIGZzICovCi0JCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBWQ1BVX1NSRUdfRlMpOwotCQlicmVhazsKIAljYXNlIDB4YTM6CiAJICAgICAgYnQ6CQkvKiBidCAqLwogCQljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7CiAJCS8qIG9ubHkgc3Vid29yZCBvZmZzZXQgKi8KIAkJY3R4dC0+c3JjLnZhbCAmPSAoY3R4dC0+ZHN0LmJ5dGVzIDw8IDMpIC0gMTsKLQkJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImJ0IiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY1Zfbm9ieXRlKGN0eHQsICJidCIpOwogCQlicmVhazsKIAljYXNlIDB4YTQ6IC8qIHNobGQgaW1tOCwgciwgci9tICovCiAJY2FzZSAweGE1OiAvKiBzaGxkIGNsLCByLCByL20gKi8KLQkJZW11bGF0ZV8yb3BfY2woInNobGQiLCBjdHh0LT5zcmMyLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKLQkJYnJlYWs7Ci0JY2FzZSAweGE4OgkvKiBwdXNoIGdzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0dTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweGE5OgkvKiBwb3AgZ3MgKi8KLQkJcmMgPSBlbXVsYXRlX3BvcF9zcmVnKGN0eHQsIFZDUFVfU1JFR19HUyk7CisJCWVtdWxhdGVfMm9wX2NsKGN0eHQsICJzaGxkIik7CiAJCWJyZWFrOwogCWNhc2UgMHhhYjoKIAkgICAgICBidHM6CQkvKiBidHMgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImJ0cyIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZShjdHh0LCAiYnRzIik7CiAJCWJyZWFrOwogCWNhc2UgMHhhYzogLyogc2hyZCBpbW04LCByLCByL20gKi8KIAljYXNlIDB4YWQ6IC8qIHNocmQgY2wsIHIsIHIvbSAqLwotCQllbXVsYXRlXzJvcF9jbCgic2hyZCIsIGN0eHQtPnNyYzIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9jbChjdHh0LCAic2hyZCIpOwogCQlicmVhazsKIAljYXNlIDB4YWU6ICAgICAgICAgICAgICAvKiBjbGZsdXNoICovCiAJCWJyZWFrOwpAQCAtNDE0Myw3ICs0MTE5LDcgQEAKIAkJICovCiAJCWN0eHQtPnNyYy5vcmlnX3ZhbCA9IGN0eHQtPnNyYy52YWw7CiAJCWN0eHQtPnNyYy52YWwgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCQllbXVsYXRlXzJvcF9TcmNWKCJjbXAiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAiY21wIik7CiAJCWlmIChjdHh0LT5lZmxhZ3MgJiBFRkxHX1pGKSB7CiAJCQkvKiBTdWNjZXNzOiB3cml0ZSBiYWNrIHRvIG1lbW9yeS4gKi8KIAkJCWN0eHQtPmRzdC52YWwgPSBjdHh0LT5zcmMub3JpZ192YWw7CkBAIC00MTUzLDE4ICs0MTI5LDkgQEAKIAkJCWN0eHQtPmRzdC5hZGRyLnJlZyA9ICh1bnNpZ25lZCBsb25nICopJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF07CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSAweGIyOgkJLyogbHNzICovCi0JCXJjID0gZW11bGF0ZV9sb2FkX3NlZ21lbnQoY3R4dCwgVkNQVV9TUkVHX1NTKTsKLQkJYnJlYWs7CiAJY2FzZSAweGIzOgogCSAgICAgIGJ0cjoJCS8qIGJ0ciAqLwotCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiYnRyIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgMHhiNDoJCS8qIGxmcyAqLwotCQlyYyA9IGVtdWxhdGVfbG9hZF9zZWdtZW50KGN0eHQsIFZDUFVfU1JFR19GUyk7Ci0JCWJyZWFrOwotCWNhc2UgMHhiNToJCS8qIGxncyAqLwotCQlyYyA9IGVtdWxhdGVfbG9hZF9zZWdtZW50KGN0eHQsIFZDUFVfU1JFR19HUyk7CisJCWVtdWxhdGVfMm9wX1NyY1Zfbm9ieXRlKGN0eHQsICJidHIiKTsKIAkJYnJlYWs7CiAJY2FzZSAweGI2IC4uLiAweGI3OgkvKiBtb3Z6eCAqLwogCQljdHh0LT5kc3QuYnl0ZXMgPSBjdHh0LT5vcF9ieXRlczsKQEAgLTQxODUsNyArNDE1Miw3IEBACiAJCWJyZWFrOwogCWNhc2UgMHhiYjoKIAkgICAgICBidGM6CQkvKiBidGMgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImJ0YyIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZShjdHh0LCAiYnRjIik7CiAJCWJyZWFrOwogCWNhc2UgMHhiYzogewkJLyogYnNmICovCiAJCXU4IHpmOwpAQCAtNDIxNyw3ICs0MTg0LDcgQEAKIAkJCQkJCQkoczE2KSBjdHh0LT5zcmMudmFsOwogCQlicmVhazsKIAljYXNlIDB4YzAgLi4uIDB4YzE6CS8qIHhhZGQgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVigiYWRkIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY1YoY3R4dCwgImFkZCIpOwogCQkvKiBXcml0ZSBiYWNrIHRoZSByZWdpc3RlciBzb3VyY2UuICovCiAJCWN0eHQtPnNyYy52YWwgPSBjdHh0LT5kc3Qub3JpZ192YWw7CiAJCXdyaXRlX3JlZ2lzdGVyX29wZXJhbmQoJmN0eHQtPnNyYyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaTgyNTQuYyBiL2FyY2gveDg2L2t2bS9pODI1NC5jCmluZGV4IGVmYWQ3MjMuLjc2ZTNmMWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pODI1NC5jCisrKyBiL2FyY2gveDg2L2t2bS9pODI1NC5jCkBAIC03MTMsMTQgKzcxMywxNiBAQAogCWt2bV9yZWdpc3Rlcl9pcnFfbWFza19ub3RpZmllcihrdm0sIDAsICZwaXQtPm1hc2tfbm90aWZpZXIpOwogCiAJa3ZtX2lvZGV2aWNlX2luaXQoJnBpdC0+ZGV2LCAmcGl0X2Rldl9vcHMpOwotCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsICZwaXQtPmRldik7CisJcmV0ID0ga3ZtX2lvX2J1c19yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fUElPX0JVUywgS1ZNX1BJVF9CQVNFX0FERFJFU1MsCisJCQkJICAgICAgS1ZNX1BJVF9NRU1fTEVOR1RILCAmcGl0LT5kZXYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGZhaWw7CiAKIAlpZiAoZmxhZ3MgJiBLVk1fUElUX1NQRUFLRVJfRFVNTVkpIHsKIAkJa3ZtX2lvZGV2aWNlX2luaXQoJnBpdC0+c3BlYWtlcl9kZXYsICZzcGVha2VyX2Rldl9vcHMpOwogCQlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLAotCQkJCQkJJnBpdC0+c3BlYWtlcl9kZXYpOworCQkJCQkgICAgICBLVk1fU1BFQUtFUl9CQVNFX0FERFJFU1MsIDQsCisJCQkJCSAgICAgICZwaXQtPnNwZWFrZXJfZGV2KTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGZhaWxfdW5yZWdpc3RlcjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaTgyNTkuYyBiL2FyY2gveDg2L2t2bS9pODI1OS5jCmluZGV4IDE5ZmU4NTUuLmNhYzQ3NDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pODI1OS5jCisrKyBiL2FyY2gveDg2L2t2bS9pODI1OS5jCkBAIC0zNCw2ICszNCw5IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlICJ0cmFjZS5oIgogCisjZGVmaW5lIHByX3BpY191bmltcGwoZm10LCAuLi4pCVwKKwlwcl9lcnJfcmF0ZWxpbWl0ZWQoImt2bTogcGljOiAiIGZtdCwgIyMgX19WQV9BUkdTX18pCisKIHN0YXRpYyB2b2lkIHBpY19pcnFfcmVxdWVzdChzdHJ1Y3Qga3ZtICprdm0sIGludCBsZXZlbCk7CiAKIHN0YXRpYyB2b2lkIHBpY19sb2NrKHN0cnVjdCBrdm1fcGljICpzKQpAQCAtMzA2LDEwICszMDksMTAgQEAKIAkJCX0KIAkJCXMtPmluaXRfc3RhdGUgPSAxOwogCQkJaWYgKHZhbCAmIDB4MDIpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJzaW5nbGUgbW9kZSBub3Qgc3VwcG9ydGVkIik7CisJCQkJcHJfcGljX3VuaW1wbCgic2luZ2xlIG1vZGUgbm90IHN1cHBvcnRlZCIpOwogCQkJaWYgKHZhbCAmIDB4MDgpCi0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJsZXZlbCBzZW5zaXRpdmUgaXJxIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCQlwcl9waWNfdW5pbXBsKAorCQkJCQkibGV2ZWwgc2Vuc2l0aXZlIGlycSBub3Qgc3VwcG9ydGVkIik7CiAJCX0gZWxzZSBpZiAodmFsICYgMHgwOCkgewogCQkJaWYgKHZhbCAmIDB4MDQpCiAJCQkJcy0+cG9sbCA9IDE7CkBAIC00NTksMjIgKzQ2MiwxNSBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtX3BpYyAqdG9fcGljKHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBrdm1fcGljLCBkZXYpOwotfQotCi1zdGF0aWMgaW50IHBpY2Rldl93cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKK3N0YXRpYyBpbnQgcGljZGV2X3dyaXRlKHN0cnVjdCBrdm1fcGljICpzLAogCQkJIGdwYV90IGFkZHIsIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCkKIHsKLQlzdHJ1Y3Qga3ZtX3BpYyAqcyA9IHRvX3BpYyh0aGlzKTsKIAl1bnNpZ25lZCBjaGFyIGRhdGEgPSAqKHVuc2lnbmVkIGNoYXIgKil2YWw7CiAJaWYgKCFwaWNkZXZfaW5fcmFuZ2UoYWRkcikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmIChsZW4gIT0gMSkgewotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJQSUM6IG5vbiBieXRlIHdyaXRlXG4iKTsKKwkJcHJfcGljX3VuaW1wbCgibm9uIGJ5dGUgd3JpdGVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcGljX2xvY2socyk7CkBAIC00OTQsMTcgKzQ5MCwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBpY2Rldl9yZWFkKHN0cnVjdCBrdm1faW9fZGV2aWNlICp0aGlzLAorc3RhdGljIGludCBwaWNkZXZfcmVhZChzdHJ1Y3Qga3ZtX3BpYyAqcywKIAkJICAgICAgIGdwYV90IGFkZHIsIGludCBsZW4sIHZvaWQgKnZhbCkKIHsKLQlzdHJ1Y3Qga3ZtX3BpYyAqcyA9IHRvX3BpYyh0aGlzKTsKIAl1bnNpZ25lZCBjaGFyIGRhdGEgPSAwOwogCWlmICghcGljZGV2X2luX3JhbmdlKGFkZHIpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAobGVuICE9IDEpIHsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiUElDOiBub24gYnl0ZSByZWFkXG4iKTsKKwkJcHJfcGljX3VuaW1wbCgibm9uIGJ5dGUgcmVhZFxuIik7CiAJCXJldHVybiAwOwogCX0KIAlwaWNfbG9jayhzKTsKQEAgLTUyNSw2ICs1MTksNDggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwaWNkZXZfbWFzdGVyX3dyaXRlKHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsCisJCQkgICAgICAgZ3BhX3QgYWRkciwgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsKQoreworCXJldHVybiBwaWNkZXZfd3JpdGUoY29udGFpbmVyX29mKGRldiwgc3RydWN0IGt2bV9waWMsIGRldl9tYXN0ZXIpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfbWFzdGVyX3JlYWQoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKKwkJCSAgICAgIGdwYV90IGFkZHIsIGludCBsZW4sIHZvaWQgKnZhbCkKK3sKKwlyZXR1cm4gcGljZGV2X3JlYWQoY29udGFpbmVyX29mKGRldiwgc3RydWN0IGt2bV9waWMsIGRldl9tYXN0ZXIpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfc2xhdmVfd3JpdGUoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKKwkJCSAgICAgIGdwYV90IGFkZHIsIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCkKK3sKKwlyZXR1cm4gcGljZGV2X3dyaXRlKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBrdm1fcGljLCBkZXZfc2xhdmUpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfc2xhdmVfcmVhZChzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2LAorCQkJICAgICBncGFfdCBhZGRyLCBpbnQgbGVuLCB2b2lkICp2YWwpCit7CisJcmV0dXJuIHBpY2Rldl9yZWFkKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBrdm1fcGljLCBkZXZfc2xhdmUpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfZWNscl93cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2LAorCQkJICAgICBncGFfdCBhZGRyLCBpbnQgbGVuLCBjb25zdCB2b2lkICp2YWwpCit7CisJcmV0dXJuIHBpY2Rldl93cml0ZShjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qga3ZtX3BpYywgZGV2X2VjbHIpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfZWNscl9yZWFkKHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsCisJCQkgICAgZ3BhX3QgYWRkciwgaW50IGxlbiwgdm9pZCAqdmFsKQoreworCXJldHVybiBwaWNkZXZfcmVhZChjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qga3ZtX3BpYywgZGV2X2VjbHIpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKwogLyoKICAqIGNhbGxiYWNrIHdoZW4gUElDMCBpcnEgc3RhdHVzIGNoYW5nZWQKICAqLwpAQCAtNTM3LDkgKzU3MywxOSBAQAogCXMtPm91dHB1dCA9IGxldmVsOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGt2bV9pb19kZXZpY2Vfb3BzIHBpY2Rldl9vcHMgPSB7Ci0JLnJlYWQgICAgID0gcGljZGV2X3JlYWQsCi0JLndyaXRlICAgID0gcGljZGV2X3dyaXRlLAorc3RhdGljIGNvbnN0IHN0cnVjdCBrdm1faW9fZGV2aWNlX29wcyBwaWNkZXZfbWFzdGVyX29wcyA9IHsKKwkucmVhZCAgICAgPSBwaWNkZXZfbWFzdGVyX3JlYWQsCisJLndyaXRlICAgID0gcGljZGV2X21hc3Rlcl93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga3ZtX2lvX2RldmljZV9vcHMgcGljZGV2X3NsYXZlX29wcyA9IHsKKwkucmVhZCAgICAgPSBwaWNkZXZfc2xhdmVfcmVhZCwKKwkud3JpdGUgICAgPSBwaWNkZXZfc2xhdmVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGt2bV9pb19kZXZpY2Vfb3BzIHBpY2Rldl9lY2xyX29wcyA9IHsKKwkucmVhZCAgICAgPSBwaWNkZXZfZWNscl9yZWFkLAorCS53cml0ZSAgICA9IHBpY2Rldl9lY2xyX3dyaXRlLAogfTsKIAogc3RydWN0IGt2bV9waWMgKmt2bV9jcmVhdGVfcGljKHN0cnVjdCBrdm0gKmt2bSkKQEAgLTU2MCwxNiArNjA2LDM5IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIFBJTyBkZXZpY2UKIAkgKi8KLQlrdm1faW9kZXZpY2VfaW5pdCgmcy0+ZGV2LCAmcGljZGV2X29wcyk7CisJa3ZtX2lvZGV2aWNlX2luaXQoJnMtPmRldl9tYXN0ZXIsICZwaWNkZXZfbWFzdGVyX29wcyk7CisJa3ZtX2lvZGV2aWNlX2luaXQoJnMtPmRldl9zbGF2ZSwgJnBpY2Rldl9zbGF2ZV9vcHMpOworCWt2bV9pb2RldmljZV9pbml0KCZzLT5kZXZfZWNsciwgJnBpY2Rldl9lY2xyX29wcyk7CiAJbXV0ZXhfbG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAmcy0+ZGV2KTsKKwlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAweDIwLCAyLAorCQkJCSAgICAgICZzLT5kZXZfbWFzdGVyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsX3VubG9jazsKKworCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsIDB4YTAsIDIsICZzLT5kZXZfc2xhdmUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZhaWxfdW5yZWdfMjsKKworCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsIDB4NGQwLCAyLCAmcy0+ZGV2X2VjbHIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZhaWxfdW5yZWdfMTsKKwogCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlpZiAocmV0IDwgMCkgewotCQlrZnJlZShzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcmV0dXJuIHM7CisKK2ZhaWxfdW5yZWdfMToKKwlrdm1faW9fYnVzX3VucmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsICZzLT5kZXZfc2xhdmUpOworCitmYWlsX3VucmVnXzI6CisJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAmcy0+ZGV2X21hc3Rlcik7CisKK2ZhaWxfdW5sb2NrOgorCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKKworCWtmcmVlKHMpOworCisJcmV0dXJuIE5VTEw7CiB9CiAKIHZvaWQga3ZtX2Rlc3Ryb3lfcGljKHN0cnVjdCBrdm0gKmt2bSkKQEAgLTU3Nyw3ICs2NDYsOSBAQAogCXN0cnVjdCBrdm1fcGljICp2cGljID0ga3ZtLT5hcmNoLnZwaWM7CiAKIAlpZiAodnBpYykgewotCQlrdm1faW9fYnVzX3VucmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsICZ2cGljLT5kZXYpOworCQlrdm1faW9fYnVzX3VucmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsICZ2cGljLT5kZXZfbWFzdGVyKTsKKwkJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAmdnBpYy0+ZGV2X3NsYXZlKTsKKwkJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAmdnBpYy0+ZGV2X2VjbHIpOwogCQlrdm0tPmFyY2gudnBpYyA9IE5VTEw7CiAJCWtmcmVlKHZwaWMpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9pcnEuaCBiL2FyY2gveDg2L2t2bS9pcnEuaAppbmRleCA1M2UyZDA4Li4yMDg2ZjJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaXJxLmgKKysrIGIvYXJjaC94ODYva3ZtL2lycS5oCkBAIC02Niw3ICs2Niw5IEBACiAJc3RydWN0IGt2bSAqa3ZtOwogCXN0cnVjdCBrdm1fa3BpY19zdGF0ZSBwaWNzWzJdOyAvKiAwIGlzIG1hc3RlciBwaWMsIDEgaXMgc2xhdmUgcGljICovCiAJaW50IG91dHB1dDsJCS8qIGludHIgZnJvbSBtYXN0ZXIgUElDICovCi0Jc3RydWN0IGt2bV9pb19kZXZpY2UgZGV2OworCXN0cnVjdCBrdm1faW9fZGV2aWNlIGRldl9tYXN0ZXI7CisJc3RydWN0IGt2bV9pb19kZXZpY2UgZGV2X3NsYXZlOworCXN0cnVjdCBrdm1faW9fZGV2aWNlIGRldl9lY2xyOwogCXZvaWQgKCphY2tfbm90aWZpZXIpKHZvaWQgKm9wYXF1ZSwgaW50IGlycSk7CiAJdW5zaWduZWQgbG9uZyBpcnFfc3RhdGVzWzE2XTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0va3ZtX2NhY2hlX3JlZ3MuaCBiL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oCmluZGV4IDMzNzdkNTMuLjU0NDA3NmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oCisrKyBiL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oCkBAIC00NSwxMyArNDUsNiBAQAogCXJldHVybiB2Y3B1LT5hcmNoLndhbGtfbW11LT5wZHB0cnNbaW5kZXhdOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBrdm1fcGRwdHJfcmVhZF9tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdSAqbW11LCBpbnQgaW5kZXgpCi17Ci0JbG9hZF9wZHB0cnModmNwdSwgbW11LCBtbXUtPmdldF9jcjModmNwdSkpOwotCi0JcmV0dXJuIG1tdS0+cGRwdHJzW2luZGV4XTsKLX0KLQogc3RhdGljIGlubGluZSB1bG9uZyBrdm1fcmVhZF9jcjBfYml0cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIG1hc2spCiB7CiAJdWxvbmcgdG1hc2sgPSBtYXNrICYgS1ZNX1BPU1NJQkxFX0NSMF9HVUVTVF9CSVRTOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2t2bV90aW1lci5oIGIvYXJjaC94ODYva3ZtL2t2bV90aW1lci5oCmluZGV4IDY0YmM2ZWEuLjQ5N2RiYWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9rdm1fdGltZXIuaAorKysgYi9hcmNoL3g4Ni9rdm0va3ZtX3RpbWVyLmgKQEAgLTIsNiArMiw4IEBACiBzdHJ1Y3Qga3ZtX3RpbWVyIHsKIAlzdHJ1Y3QgaHJ0aW1lciB0aW1lcjsKIAlzNjQgcGVyaW9kOyAJCQkJLyogdW5pdDogbnMgKi8KKwl1MzIgdGltZXJfbW9kZV9tYXNrOworCXU2NCB0c2NkZWFkbGluZTsKIAlhdG9taWNfdCBwZW5kaW5nOwkJCS8qIGFjY3VtdWxhdGVkIHRyaWdnZXJlZCB0aW1lcnMgKi8KIAlib29sIHJlaW5qZWN0OwogCXN0cnVjdCBrdm1fdGltZXJfb3BzICp0X29wczsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9sYXBpYy5jIGIvYXJjaC94ODYva3ZtL2xhcGljLmMKaW5kZXggNTdkY2JkNC4uNTRhYmI0MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2xhcGljLmMKKysrIGIvYXJjaC94ODYva3ZtL2xhcGljLmMKQEAgLTY4LDYgKzY4LDkgQEAKICNkZWZpbmUgVkVDX1BPUyh2KSAoKHYpICYgKDMyIC0gMSkpCiAjZGVmaW5lIFJFR19QT1ModikgKCgodikgPj4gNSkgPDwgNCkKIAorc3RhdGljIHVuc2lnbmVkIGludCBtaW5fdGltZXJfcGVyaW9kX3VzID0gNTAwOworbW9kdWxlX3BhcmFtKG1pbl90aW1lcl9wZXJpb2RfdXMsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKwogc3RhdGljIGlubGluZSB1MzIgYXBpY19nZXRfcmVnKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMsIGludCByZWdfb2ZmKQogewogCXJldHVybiAqKCh1MzIgKikgKGFwaWMtPnJlZ3MgKyByZWdfb2ZmKSk7CkBAIC0xMzUsOSArMTM4LDIzIEBACiAJcmV0dXJuIGFwaWNfZ2V0X3JlZyhhcGljLCBsdnRfdHlwZSkgJiBBUElDX1ZFQ1RPUl9NQVNLOwogfQogCitzdGF0aWMgaW5saW5lIGludCBhcGljX2x2dHRfb25lc2hvdChzdHJ1Y3Qga3ZtX2xhcGljICphcGljKQoreworCXJldHVybiAoKGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0xWVFQpICYKKwkJYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSA9PSBBUElDX0xWVF9USU1FUl9PTkVTSE9UKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYXBpY19sdnR0X3BlcmlvZChzdHJ1Y3Qga3ZtX2xhcGljICphcGljKQogewotCXJldHVybiBhcGljX2dldF9yZWcoYXBpYywgQVBJQ19MVlRUKSAmIEFQSUNfTFZUX1RJTUVSX1BFUklPRElDOworCXJldHVybiAoKGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0xWVFQpICYKKwkJYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSA9PSBBUElDX0xWVF9USU1FUl9QRVJJT0RJQyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFwaWNfbHZ0dF90c2NkZWFkbGluZShzdHJ1Y3Qga3ZtX2xhcGljICphcGljKQoreworCXJldHVybiAoKGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0xWVFQpICYKKwkJYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSA9PQorCQkJQVBJQ19MVlRfVElNRVJfVFNDREVBRExJTkUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhcGljX2x2dF9ubWlfbW9kZSh1MzIgbHZ0X3ZhbCkKQEAgLTE2Niw3ICsxODMsNyBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGFwaWNfbHZ0X21hc2tbQVBJQ19MVlRfTlVNXSA9IHsKLQlMVlRfTUFTSyB8IEFQSUNfTFZUX1RJTUVSX1BFUklPRElDLAkvKiBMVlRUICovCisJTFZUX01BU0sgLCAgICAgIC8qIHBhcnQgTFZUVCBtYXNrLCB0aW1lciBtb2RlIG1hc2sgYWRkZWQgYXQgcnVudGltZSAqLwogCUxWVF9NQVNLIHwgQVBJQ19NT0RFX01BU0ssCS8qIExWVFRITVIgKi8KIAlMVlRfTUFTSyB8IEFQSUNfTU9ERV9NQVNLLAkvKiBMVlRQQyAqLwogCUxJTlRfTUFTSywgTElOVF9NQVNLLAkvKiBMVlQwLTEgKi8KQEAgLTMxNiw4ICszMzMsOCBAQAogCQkJcmVzdWx0ID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQmFkIERGUiB2Y3B1ICVkOiAlMDh4XG4iLAotCQkgICAgICAgYXBpYy0+dmNwdS0+dmNwdV9pZCwgYXBpY19nZXRfcmVnKGFwaWMsIEFQSUNfREZSKSk7CisJCWFwaWNfZGVidWcoIkJhZCBERlIgdmNwdSAlZDogJTA4eFxuIiwKKwkJCSAgIGFwaWMtPnZjcHUtPnZjcHVfaWQsIGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0RGUikpOwogCQlicmVhazsKIAl9CiAKQEAgLTM1NCw4ICszNzEsOCBAQAogCQlyZXN1bHQgPSAodGFyZ2V0ICE9IHNvdXJjZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkJhZCBkZXN0IHNob3J0aGFuZCB2YWx1ZSAleFxuIiwKLQkJICAgICAgIHNob3J0X2hhbmQpOworCQlhcGljX2RlYnVnKCJrdm06IGFwaWM6IEJhZCBkZXN0IHNob3J0aGFuZCB2YWx1ZSAleFxuIiwKKwkJCSAgIHNob3J0X2hhbmQpOwogCQlicmVhazsKIAl9CiAKQEAgLTQwMSwxMSArNDE4LDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSBBUElDX0RNX1JFTVJEOgotCQlwcmludGsoS0VSTl9ERUJVRyAiSWdub3JpbmcgZGVsaXZlcnkgbW9kZSAzXG4iKTsKKwkJYXBpY19kZWJ1ZygiSWdub3JpbmcgZGVsaXZlcnkgbW9kZSAzXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFQSUNfRE1fU01JOgotCQlwcmludGsoS0VSTl9ERUJVRyAiSWdub3JpbmcgZ3Vlc3QgU01JXG4iKTsKKwkJYXBpY19kZWJ1ZygiSWdub3JpbmcgZ3Vlc3QgU01JXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFQSUNfRE1fTk1JOgpAQCAtNTY1LDExICs1ODIsMTMgQEAKIAkJCXZhbCA9IGt2bV9hcGljX2lkKGFwaWMpIDw8IDI0OwogCQlicmVhazsKIAljYXNlIEFQSUNfQVJCUFJJOgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBY2Nlc3MgQVBJQyBBUkJQUkkgcmVnaXN0ZXIgIgotCQkgICAgICAgIndoaWNoIGlzIGZvciBQNlxuIik7CisJCWFwaWNfZGVidWcoIkFjY2VzcyBBUElDIEFSQlBSSSByZWdpc3RlciB3aGljaCBpcyBmb3IgUDZcbiIpOwogCQlicmVhazsKIAogCWNhc2UgQVBJQ19UTUNDVDoJLyogVGltZXIgQ0NSICovCisJCWlmIChhcGljX2x2dHRfdHNjZGVhZGxpbmUoYXBpYykpCisJCQlyZXR1cm4gMDsKKwogCQl2YWwgPSBhcGljX2dldF90bWNjdChhcGljKTsKIAkJYnJlYWs7CiAKQEAgLTY2NCwyOSArNjgzLDQwIEBACiAKIHN0YXRpYyB2b2lkIHN0YXJ0X2FwaWNfdGltZXIoc3RydWN0IGt2bV9sYXBpYyAqYXBpYykKIHsKLQlrdGltZV90IG5vdyA9IGFwaWMtPmxhcGljX3RpbWVyLnRpbWVyLmJhc2UtPmdldF90aW1lKCk7Ci0KLQlhcGljLT5sYXBpY190aW1lci5wZXJpb2QgPSAodTY0KWFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1RNSUNUKSAqCi0JCSAgICBBUElDX0JVU19DWUNMRV9OUyAqIGFwaWMtPmRpdmlkZV9jb3VudDsKKwlrdGltZV90IG5vdzsKIAlhdG9taWNfc2V0KCZhcGljLT5sYXBpY190aW1lci5wZW5kaW5nLCAwKTsKIAotCWlmICghYXBpYy0+bGFwaWNfdGltZXIucGVyaW9kKQotCQlyZXR1cm47Ci0JLyoKLQkgKiBEbyBub3QgYWxsb3cgdGhlIGd1ZXN0IHRvIHByb2dyYW0gcGVyaW9kaWMgdGltZXJzIHdpdGggc21hbGwKLQkgKiBpbnRlcnZhbCwgc2luY2UgdGhlIGhydGltZXJzIGFyZSBub3QgdGhyb3R0bGVkIGJ5IHRoZSBob3N0Ci0JICogc2NoZWR1bGVyLgotCSAqLwotCWlmIChhcGljX2x2dHRfcGVyaW9kKGFwaWMpKSB7Ci0JCWlmIChhcGljLT5sYXBpY190aW1lci5wZXJpb2QgPCBOU0VDX1BFUl9NU0VDLzIpCi0JCQlhcGljLT5sYXBpY190aW1lci5wZXJpb2QgPSBOU0VDX1BFUl9NU0VDLzI7Ci0JfQorCWlmIChhcGljX2x2dHRfcGVyaW9kKGFwaWMpIHx8IGFwaWNfbHZ0dF9vbmVzaG90KGFwaWMpKSB7CisJCS8qIGxhcGljIHRpbWVyIGluIG9uZXNob3Qgb3IgcGVyb2lkaWMgbW9kZSAqLworCQlub3cgPSBhcGljLT5sYXBpY190aW1lci50aW1lci5iYXNlLT5nZXRfdGltZSgpOworCQlhcGljLT5sYXBpY190aW1lci5wZXJpb2QgPSAodTY0KWFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1RNSUNUKQorCQkJICAgICogQVBJQ19CVVNfQ1lDTEVfTlMgKiBhcGljLT5kaXZpZGVfY291bnQ7CiAKLQlocnRpbWVyX3N0YXJ0KCZhcGljLT5sYXBpY190aW1lci50aW1lciwKLQkJICAgICAga3RpbWVfYWRkX25zKG5vdywgYXBpYy0+bGFwaWNfdGltZXIucGVyaW9kKSwKLQkJICAgICAgSFJUSU1FUl9NT0RFX0FCUyk7CisJCWlmICghYXBpYy0+bGFwaWNfdGltZXIucGVyaW9kKQorCQkJcmV0dXJuOworCQkvKgorCQkgKiBEbyBub3QgYWxsb3cgdGhlIGd1ZXN0IHRvIHByb2dyYW0gcGVyaW9kaWMgdGltZXJzIHdpdGggc21hbGwKKwkJICogaW50ZXJ2YWwsIHNpbmNlIHRoZSBocnRpbWVycyBhcmUgbm90IHRocm90dGxlZCBieSB0aGUgaG9zdAorCQkgKiBzY2hlZHVsZXIuCisJCSAqLworCQlpZiAoYXBpY19sdnR0X3BlcmlvZChhcGljKSkgeworCQkJczY0IG1pbl9wZXJpb2QgPSBtaW5fdGltZXJfcGVyaW9kX3VzICogMTAwMExMOwogCi0JYXBpY19kZWJ1ZygiJXM6IGJ1cyBjeWNsZSBpcyAlIiBQUklkNjQgIm5zLCBub3cgMHglMDE2IgorCQkJaWYgKGFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCA8IG1pbl9wZXJpb2QpIHsKKwkJCQlwcl9pbmZvX3JhdGVsaW1pdGVkKAorCQkJCSAgICAia3ZtOiB2Y3B1ICVpOiByZXF1ZXN0ZWQgJWxsZCBucyAiCisJCQkJICAgICJsYXBpYyB0aW1lciBwZXJpb2QgbGltaXRlZCB0byAlbGxkIG5zXG4iLAorCQkJCSAgICBhcGljLT52Y3B1LT52Y3B1X2lkLAorCQkJCSAgICBhcGljLT5sYXBpY190aW1lci5wZXJpb2QsIG1pbl9wZXJpb2QpOworCQkJCWFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCA9IG1pbl9wZXJpb2Q7CisJCQl9CisJCX0KKworCQlocnRpbWVyX3N0YXJ0KCZhcGljLT5sYXBpY190aW1lci50aW1lciwKKwkJCSAgICAgIGt0aW1lX2FkZF9ucyhub3csIGFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCksCisJCQkgICAgICBIUlRJTUVSX01PREVfQUJTKTsKKworCQlhcGljX2RlYnVnKCIlczogYnVzIGN5Y2xlIGlzICUiIFBSSWQ2NCAibnMsIG5vdyAweCUwMTYiCiAJCQkgICBQUkl4NjQgIiwgIgogCQkJICAgInRpbWVyIGluaXRpYWwgY291bnQgMHgleCwgcGVyaW9kICVsbGRucywgIgogCQkJICAgImV4cGlyZSBAIDB4JTAxNiIgUFJJeDY0ICIuXG4iLCBfX2Z1bmNfXywKQEAgLTY5NSw2ICs3MjUsMzAgQEAKIAkJCSAgIGFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCwKIAkJCSAgIGt0aW1lX3RvX25zKGt0aW1lX2FkZF9ucyhub3csCiAJCQkJCWFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCkpKTsKKwl9IGVsc2UgaWYgKGFwaWNfbHZ0dF90c2NkZWFkbGluZShhcGljKSkgeworCQkvKiBsYXBpYyB0aW1lciBpbiB0c2MgZGVhZGxpbmUgbW9kZSAqLworCQl1NjQgZ3Vlc3RfdHNjLCB0c2NkZWFkbGluZSA9IGFwaWMtPmxhcGljX3RpbWVyLnRzY2RlYWRsaW5lOworCQl1NjQgbnMgPSAwOworCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBhcGljLT52Y3B1OworCQl1bnNpZ25lZCBsb25nIHRoaXNfdHNjX2toeiA9IHZjcHVfdHNjX2toeih2Y3B1KTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpZiAodW5saWtlbHkoIXRzY2RlYWRsaW5lIHx8ICF0aGlzX3RzY19raHopKQorCQkJcmV0dXJuOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCQlub3cgPSBhcGljLT5sYXBpY190aW1lci50aW1lci5iYXNlLT5nZXRfdGltZSgpOworCQlndWVzdF90c2MgPSBrdm1feDg2X29wcy0+cmVhZF9sMV90c2ModmNwdSk7CisJCWlmIChsaWtlbHkodHNjZGVhZGxpbmUgPiBndWVzdF90c2MpKSB7CisJCQlucyA9ICh0c2NkZWFkbGluZSAtIGd1ZXN0X3RzYykgKiAxMDAwMDAwVUxMOworCQkJZG9fZGl2KG5zLCB0aGlzX3RzY19raHopOworCQl9CisJCWhydGltZXJfc3RhcnQoJmFwaWMtPmxhcGljX3RpbWVyLnRpbWVyLAorCQkJa3RpbWVfYWRkX25zKG5vdywgbnMpLCBIUlRJTUVSX01PREVfQUJTKTsKKworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBhcGljX21hbmFnZV9ubWlfd2F0Y2hkb2coc3RydWN0IGt2bV9sYXBpYyAqYXBpYywgdTMyIGx2dDBfdmFsKQpAQCAtNzgyLDcgKzgzNiw2IEBACiAKIAljYXNlIEFQSUNfTFZUMDoKIAkJYXBpY19tYW5hZ2Vfbm1pX3dhdGNoZG9nKGFwaWMsIHZhbCk7Ci0JY2FzZSBBUElDX0xWVFQ6CiAJY2FzZSBBUElDX0xWVFRITVI6CiAJY2FzZSBBUElDX0xWVFBDOgogCWNhc2UgQVBJQ19MVlQxOgpAQCAtNzk2LDcgKzg0OSwyMiBAQAogCiAJCWJyZWFrOwogCisJY2FzZSBBUElDX0xWVFQ6CisJCWlmICgoYXBpY19nZXRfcmVnKGFwaWMsIEFQSUNfTFZUVCkgJgorCQkgICAgYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSAhPQorCQkgICAodmFsICYgYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSkKKwkJCWhydGltZXJfY2FuY2VsKCZhcGljLT5sYXBpY190aW1lci50aW1lcik7CisKKwkJaWYgKCFhcGljX3N3X2VuYWJsZWQoYXBpYykpCisJCQl2YWwgfD0gQVBJQ19MVlRfTUFTS0VEOworCQl2YWwgJj0gKGFwaWNfbHZ0X21hc2tbMF0gfCBhcGljLT5sYXBpY190aW1lci50aW1lcl9tb2RlX21hc2spOworCQlhcGljX3NldF9yZWcoYXBpYywgQVBJQ19MVlRULCB2YWwpOworCQlicmVhazsKKwogCWNhc2UgQVBJQ19UTUlDVDoKKwkJaWYgKGFwaWNfbHZ0dF90c2NkZWFkbGluZShhcGljKSkKKwkJCWJyZWFrOworCiAJCWhydGltZXJfY2FuY2VsKCZhcGljLT5sYXBpY190aW1lci50aW1lcik7CiAJCWFwaWNfc2V0X3JlZyhhcGljLCBBUElDX1RNSUNULCB2YWwpOwogCQlzdGFydF9hcGljX3RpbWVyKGFwaWMpOwpAQCAtODA0LDE0ICs4NzIsMTQgQEAKIAogCWNhc2UgQVBJQ19URENSOgogCQlpZiAodmFsICYgNCkKLQkJCXByaW50ayhLRVJOX0VSUiAiS1ZNX1dSSVRFOlREQ1IgJXhcbiIsIHZhbCk7CisJCQlhcGljX2RlYnVnKCJLVk1fV1JJVEU6VERDUiAleFxuIiwgdmFsKTsKIAkJYXBpY19zZXRfcmVnKGFwaWMsIEFQSUNfVERDUiwgdmFsKTsKIAkJdXBkYXRlX2RpdmlkZV9jb3VudChhcGljKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFQSUNfRVNSOgogCQlpZiAoYXBpY194MmFwaWNfbW9kZShhcGljKSAmJiB2YWwgIT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJLVk1fV1JJVEU6RVNSIG5vdCB6ZXJvICV4XG4iLCB2YWwpOworCQkJYXBpY19kZWJ1ZygiS1ZNX1dSSVRFOkVTUiBub3QgemVybyAleFxuIiwgdmFsKTsKIAkJCXJldCA9IDE7CiAJCX0KIAkJYnJlYWs7CkBAIC04NjQsNiArOTMyLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQga3ZtX2xhcGljX3NldF9lb2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSB2Y3B1LT5hcmNoLmFwaWM7CisKKwlpZiAoYXBpYykKKwkJYXBpY19yZWdfd3JpdGUodmNwdS0+YXJjaC5hcGljLCBBUElDX0VPSSwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fbGFwaWNfc2V0X2VvaSk7CisKIHZvaWQga3ZtX2ZyZWVfbGFwaWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWlmICghdmNwdS0+YXJjaC5hcGljKQpAQCAtODgzLDYgKzk2MCwzMiBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAordTY0IGt2bV9nZXRfbGFwaWNfdHNjZGVhZGxpbmVfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX2xhcGljICphcGljID0gdmNwdS0+YXJjaC5hcGljOworCWlmICghYXBpYykKKwkJcmV0dXJuIDA7CisKKwlpZiAoYXBpY19sdnR0X29uZXNob3QoYXBpYykgfHwgYXBpY19sdnR0X3BlcmlvZChhcGljKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYXBpYy0+bGFwaWNfdGltZXIudHNjZGVhZGxpbmU7Cit9CisKK3ZvaWQga3ZtX3NldF9sYXBpY190c2NkZWFkbGluZV9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZGF0YSkKK3sKKwlzdHJ1Y3Qga3ZtX2xhcGljICphcGljID0gdmNwdS0+YXJjaC5hcGljOworCWlmICghYXBpYykKKwkJcmV0dXJuOworCisJaWYgKGFwaWNfbHZ0dF9vbmVzaG90KGFwaWMpIHx8IGFwaWNfbHZ0dF9wZXJpb2QoYXBpYykpCisJCXJldHVybjsKKworCWhydGltZXJfY2FuY2VsKCZhcGljLT5sYXBpY190aW1lci50aW1lcik7CisJYXBpYy0+bGFwaWNfdGltZXIudHNjZGVhZGxpbmUgPSBkYXRhOworCXN0YXJ0X2FwaWNfdGltZXIoYXBpYyk7Cit9CisKIHZvaWQga3ZtX2xhcGljX3NldF90cHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyOCkKIHsKIAlzdHJ1Y3Qga3ZtX2xhcGljICphcGljID0gdmNwdS0+YXJjaC5hcGljOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2xhcGljLmggYi9hcmNoL3g4Ni9rdm0vbGFwaWMuaAppbmRleCA1MmM5ZTZiLi4xMzhlOGNjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbGFwaWMuaAorKysgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuaApAQCAtMjYsNiArMjYsNyBAQAogdm9pZCBrdm1fbGFwaWNfcmVzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHU2NCBrdm1fbGFwaWNfZ2V0X2NyOChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fbGFwaWNfc2V0X3RwcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I4KTsKK3ZvaWQga3ZtX2xhcGljX3NldF9lb2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX2xhcGljX3NldF9iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZhbHVlKTsKIHU2NCBrdm1fbGFwaWNfZ2V0X2Jhc2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX2FwaWNfc2V0X3ZlcnNpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKQEAgLTQxLDYgKzQyLDkgQEAKIGJvb2wga3ZtX2FwaWNfcHJlc2VudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IGt2bV9sYXBpY19maW5kX2hpZ2hlc3RfaXJyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKK3U2NCBrdm1fZ2V0X2xhcGljX3RzY2RlYWRsaW5lX21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwordm9pZCBrdm1fc2V0X2xhcGljX3RzY2RlYWRsaW5lX21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBkYXRhKTsKKwogdm9pZCBrdm1fbGFwaWNfc2V0X3ZhcGljX2FkZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCB2YXBpY19hZGRyKTsKIHZvaWQga3ZtX2xhcGljX3N5bmNfZnJvbV92YXBpYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fbGFwaWNfc3luY190b192YXBpYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdS5jIGIvYXJjaC94ODYva3ZtL21tdS5jCmluZGV4IDhlOGRhNzkuLmYxYjM2Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXUuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11LmMKQEAgLTI3NzAsNyArMjc3MCw3IEBACiAKIAkJQVNTRVJUKCFWQUxJRF9QQUdFKHJvb3QpKTsKIAkJaWYgKHZjcHUtPmFyY2gubW11LnJvb3RfbGV2ZWwgPT0gUFQzMkVfUk9PVF9MRVZFTCkgewotCQkJcGRwdHIgPSBrdm1fcGRwdHJfcmVhZF9tbXUodmNwdSwgJnZjcHUtPmFyY2gubW11LCBpKTsKKwkJCXBkcHRyID0gdmNwdS0+YXJjaC5tbXUuZ2V0X3BkcHRyKHZjcHUsIGkpOwogCQkJaWYgKCFpc19wcmVzZW50X2dwdGUocGRwdHIpKSB7CiAJCQkJdmNwdS0+YXJjaC5tbXUucGFlX3Jvb3RbaV0gPSAwOwogCQkJCWNvbnRpbnVlOwpAQCAtMzMxOCw2ICszMzE4LDcgQEAKIAljb250ZXh0LT5kaXJlY3RfbWFwID0gdHJ1ZTsKIAljb250ZXh0LT5zZXRfY3IzID0ga3ZtX3g4Nl9vcHMtPnNldF90ZHBfY3IzOwogCWNvbnRleHQtPmdldF9jcjMgPSBnZXRfY3IzOworCWNvbnRleHQtPmdldF9wZHB0ciA9IGt2bV9wZHB0cl9yZWFkOwogCWNvbnRleHQtPmluamVjdF9wYWdlX2ZhdWx0ID0ga3ZtX2luamVjdF9wYWdlX2ZhdWx0OwogCWNvbnRleHQtPm54ID0gaXNfbngodmNwdSk7CiAKQEAgLTMzNzYsNiArMzM3Nyw3IEBACiAKIAl2Y3B1LT5hcmNoLndhbGtfbW11LT5zZXRfY3IzICAgICAgICAgICA9IGt2bV94ODZfb3BzLT5zZXRfY3IzOwogCXZjcHUtPmFyY2gud2Fsa19tbXUtPmdldF9jcjMgICAgICAgICAgID0gZ2V0X2NyMzsKKwl2Y3B1LT5hcmNoLndhbGtfbW11LT5nZXRfcGRwdHIgICAgICAgICA9IGt2bV9wZHB0cl9yZWFkOwogCXZjcHUtPmFyY2gud2Fsa19tbXUtPmluamVjdF9wYWdlX2ZhdWx0ID0ga3ZtX2luamVjdF9wYWdlX2ZhdWx0OwogCiAJcmV0dXJuIHI7CkBAIC0zMzg2LDYgKzMzODgsNyBAQAogCXN0cnVjdCBrdm1fbW11ICpnX2NvbnRleHQgPSAmdmNwdS0+YXJjaC5uZXN0ZWRfbW11OwogCiAJZ19jb250ZXh0LT5nZXRfY3IzICAgICAgICAgICA9IGdldF9jcjM7CisJZ19jb250ZXh0LT5nZXRfcGRwdHIgICAgICAgICA9IGt2bV9wZHB0cl9yZWFkOwogCWdfY29udGV4dC0+aW5qZWN0X3BhZ2VfZmF1bHQgPSBrdm1faW5qZWN0X3BhZ2VfZmF1bHQ7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdV9hdWRpdC5jIGIvYXJjaC94ODYva3ZtL21tdV9hdWRpdC5jCmluZGV4IDI0NjBhMjYuLjc0NmVjMjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXVfYXVkaXQuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11X2F1ZGl0LmMKQEAgLTEyMSwxNiArMTIxLDE2IEBACiAKIHN0YXRpYyB2b2lkIGluc3BlY3Rfc3B0ZV9oYXNfcm1hcChzdHJ1Y3Qga3ZtICprdm0sIHU2NCAqc3B0ZXApCiB7CisJc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUocmF0ZWxpbWl0X3N0YXRlLCA1ICogSFosIDEwKTsKIAl1bnNpZ25lZCBsb25nICpybWFwcDsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpyZXZfc3A7CiAJZ2ZuX3QgZ2ZuOwogCi0KIAlyZXZfc3AgPSBwYWdlX2hlYWRlcihfX3BhKHNwdGVwKSk7CiAJZ2ZuID0ga3ZtX21tdV9wYWdlX2dldF9nZm4ocmV2X3NwLCBzcHRlcCAtIHJldl9zcC0+c3B0KTsKIAogCWlmICghZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBnZm4pKSB7Ci0JCWlmICghcHJpbnRrX3JhdGVsaW1pdCgpKQorCQlpZiAoIV9fcmF0ZWxpbWl0KCZyYXRlbGltaXRfc3RhdGUpKQogCQkJcmV0dXJuOwogCQlhdWRpdF9wcmludGsoa3ZtLCAibm8gbWVtc2xvdCBmb3IgZ2ZuICVsbHhcbiIsIGdmbik7CiAJCWF1ZGl0X3ByaW50ayhrdm0sICJpbmRleCAlbGQgb2Ygc3AgKGdmbj0lbGx4KVxuIiwKQEAgLTE0MSw3ICsxNDEsNyBAQAogCiAJcm1hcHAgPSBnZm5fdG9fcm1hcChrdm0sIGdmbiwgcmV2X3NwLT5yb2xlLmxldmVsKTsKIAlpZiAoISpybWFwcCkgewotCQlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKKwkJaWYgKCFfX3JhdGVsaW1pdCgmcmF0ZWxpbWl0X3N0YXRlKSkKIAkJCXJldHVybjsKIAkJYXVkaXRfcHJpbnRrKGt2bSwgIm5vIHJtYXAgZm9yIHdyaXRhYmxlIHNwdGUgJWxseFxuIiwKIAkJCSAgICAgKnNwdGVwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKaW5kZXggNTA3ZTJiOC4uOTI5OTQxMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKKysrIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCWdmbl90IHRhYmxlX2dmbjsKIAl1bnNpZ25lZCBpbmRleCwgcHRfYWNjZXNzLCB1bmluaXRpYWxpemVkX3ZhcihwdGVfYWNjZXNzKTsKIAlncGFfdCBwdGVfZ3BhOwotCWJvb2wgZXBlcm07CisJYm9vbCBlcGVybSwgbGFzdF9ncHRlOwogCWludCBvZmZzZXQ7CiAJY29uc3QgaW50IHdyaXRlX2ZhdWx0ID0gYWNjZXNzICYgUEZFUlJfV1JJVEVfTUFTSzsKIAljb25zdCBpbnQgdXNlcl9mYXVsdCAgPSBhY2Nlc3MgJiBQRkVSUl9VU0VSX01BU0s7CkBAIC0xNjMsNyArMTYzLDcgQEAKIAogI2lmIFBUVFlQRSA9PSA2NAogCWlmICh3YWxrZXItPmxldmVsID09IFBUMzJFX1JPT1RfTEVWRUwpIHsKLQkJcHRlID0ga3ZtX3BkcHRyX3JlYWRfbW11KHZjcHUsIG1tdSwgKGFkZHIgPj4gMzApICYgMyk7CisJCXB0ZSA9IG1tdS0+Z2V0X3BkcHRyKHZjcHUsIChhZGRyID4+IDMwKSAmIDMpOwogCQl0cmFjZV9rdm1fbW11X3BhZ2luZ19lbGVtZW50KHB0ZSwgd2Fsa2VyLT5sZXZlbCk7CiAJCWlmICghaXNfcHJlc2VudF9ncHRlKHB0ZSkpCiAJCQlnb3RvIGVycm9yOwpAQCAtMjIxLDYgKzIyMSwxNyBAQAogCQkJZXBlcm0gPSB0cnVlOwogI2VuZGlmCiAKKwkJbGFzdF9ncHRlID0gRk5BTUUoaXNfbGFzdF9ncHRlKSh3YWxrZXIsIHZjcHUsIG1tdSwgcHRlKTsKKwkJaWYgKGxhc3RfZ3B0ZSkgeworCQkJcHRlX2FjY2VzcyA9IHB0X2FjY2VzcyAmCisJCQkJICAgICBGTkFNRShncHRlX2FjY2VzcykodmNwdSwgcHRlLCB0cnVlKTsKKwkJCS8qIGNoZWNrIGlmIHRoZSBrZXJuZWwgaXMgZmV0Y2hpbmcgZnJvbSB1c2VyIHBhZ2UgKi8KKwkJCWlmICh1bmxpa2VseShwdGVfYWNjZXNzICYgUFRfVVNFUl9NQVNLKSAmJgorCQkJICAgIGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfU01FUCkpCisJCQkJaWYgKGZldGNoX2ZhdWx0ICYmICF1c2VyX2ZhdWx0KQorCQkJCQllcGVybSA9IHRydWU7CisJCX0KKwogCQlpZiAoIWVwZXJtICYmIHVubGlrZWx5KCEocHRlICYgUFRfQUNDRVNTRURfTUFTSykpKSB7CiAJCQlpbnQgcmV0OwogCQkJdHJhY2Vfa3ZtX21tdV9zZXRfYWNjZXNzZWRfYml0KHRhYmxlX2dmbiwgaW5kZXgsCkBAIC0yMzgsMTggKzI0OSwxMiBAQAogCiAJCXdhbGtlci0+cHRlc1t3YWxrZXItPmxldmVsIC0gMV0gPSBwdGU7CiAKLQkJaWYgKEZOQU1FKGlzX2xhc3RfZ3B0ZSkod2Fsa2VyLCB2Y3B1LCBtbXUsIHB0ZSkpIHsKKwkJaWYgKGxhc3RfZ3B0ZSkgewogCQkJaW50IGx2bCA9IHdhbGtlci0+bGV2ZWw7CiAJCQlncGFfdCByZWFsX2dwYTsKIAkJCWdmbl90IGdmbjsKIAkJCXUzMiBhYzsKIAotCQkJLyogY2hlY2sgaWYgdGhlIGtlcm5lbCBpcyBmZXRjaGluZyBmcm9tIHVzZXIgcGFnZSAqLwotCQkJaWYgKHVubGlrZWx5KHB0ZV9hY2Nlc3MgJiBQVF9VU0VSX01BU0spICYmCi0JCQkgICAga3ZtX3JlYWRfY3I0X2JpdHModmNwdSwgWDg2X0NSNF9TTUVQKSkKLQkJCQlpZiAoZmV0Y2hfZmF1bHQgJiYgIXVzZXJfZmF1bHQpCi0JCQkJCWVwZXJtID0gdHJ1ZTsKLQogCQkJZ2ZuID0gZ3B0ZV90b19nZm5fbHZsKHB0ZSwgbHZsKTsKIAkJCWdmbiArPSAoYWRkciAmIFBUX0xWTF9PRkZTRVRfTUFTSyhsdmwpKSA+PiBQQUdFX1NISUZUOwogCkBAIC0yOTUsNyArMzAwLDYgQEAKIAkJd2Fsa2VyLT5wdGVzW3dhbGtlci0+bGV2ZWwgLSAxXSA9IHB0ZTsKIAl9CiAKLQlwdGVfYWNjZXNzID0gcHRfYWNjZXNzICYgRk5BTUUoZ3B0ZV9hY2Nlc3MpKHZjcHUsIHB0ZSwgdHJ1ZSk7CiAJd2Fsa2VyLT5wdF9hY2Nlc3MgPSBwdF9hY2Nlc3M7CiAJd2Fsa2VyLT5wdGVfYWNjZXNzID0gcHRlX2FjY2VzczsKIAlwZ3ByaW50aygiJXM6IHB0ZSAlbGx4IHB0ZV9hY2Nlc3MgJXggcHRfYWNjZXNzICV4XG4iLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3N2bS5jIGIvYXJjaC94ODYva3ZtL3N2bS5jCmluZGV4IDQ3NWQxYzkuLmUzMjI0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9zdm0uYworKysgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKQEAgLTEwODQsNyArMTA4NCw2IEBACiAJaWYgKG5wdF9lbmFibGVkKSB7CiAJCS8qIFNldHVwIFZNQ0IgZm9yIE5lc3RlZCBQYWdpbmcgKi8KIAkJY29udHJvbC0+bmVzdGVkX2N0bCA9IDE7Ci0JCWNscl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfVEFTS19TV0lUQ0gpOwogCQljbHJfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0lOVkxQRyk7CiAJCWNscl9leGNlcHRpb25faW50ZXJjZXB0KHN2bSwgUEZfVkVDVE9SKTsKIAkJY2xyX2NyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9DUjNfUkVBRCk7CkBAIC0xODQ0LDYgKzE4NDMsMjAgQEAKIAlyZXR1cm4gc3ZtLT5uZXN0ZWQubmVzdGVkX2NyMzsKIH0KIAorc3RhdGljIHU2NCBuZXN0ZWRfc3ZtX2dldF90ZHBfcGRwdHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CisJdTY0IGNyMyA9IHN2bS0+bmVzdGVkLm5lc3RlZF9jcjM7CisJdTY0IHBkcHRlOworCWludCByZXQ7CisKKwlyZXQgPSBrdm1fcmVhZF9ndWVzdF9wYWdlKHZjcHUtPmt2bSwgZ3BhX3RvX2dmbihjcjMpLCAmcGRwdGUsCisJCQkJICBvZmZzZXRfaW5fcGFnZShjcjMpICsgaW5kZXggKiA4LCA4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcGRwdGU7Cit9CisKIHN0YXRpYyB2b2lkIG5lc3RlZF9zdm1fc2V0X3RkcF9jcjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgcm9vdCkKIHsKQEAgLTE4NzUsNiArMTg4OCw3IEBACiAKIAl2Y3B1LT5hcmNoLm1tdS5zZXRfY3IzICAgICAgICAgICA9IG5lc3RlZF9zdm1fc2V0X3RkcF9jcjM7CiAJdmNwdS0+YXJjaC5tbXUuZ2V0X2NyMyAgICAgICAgICAgPSBuZXN0ZWRfc3ZtX2dldF90ZHBfY3IzOworCXZjcHUtPmFyY2gubW11LmdldF9wZHB0ciAgICAgICAgID0gbmVzdGVkX3N2bV9nZXRfdGRwX3BkcHRyOwogCXZjcHUtPmFyY2gubW11LmluamVjdF9wYWdlX2ZhdWx0ID0gbmVzdGVkX3N2bV9pbmplY3RfbnBmX2V4aXQ7CiAJdmNwdS0+YXJjaC5tbXUuc2hhZG93X3Jvb3RfbGV2ZWwgPSBnZXRfbnB0X2xldmVsKCk7CiAJdmNwdS0+YXJjaC53YWxrX21tdSAgICAgICAgICAgICAgPSAmdmNwdS0+YXJjaC5uZXN0ZWRfbW11OwpAQCAtMjE4Miw3ICsyMTk2LDggQEAKIAkJCQkgICAgICAgdm1jYi0+Y29udHJvbC5leGl0X2luZm9fMSwKIAkJCQkgICAgICAgdm1jYi0+Y29udHJvbC5leGl0X2luZm9fMiwKIAkJCQkgICAgICAgdm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvLAotCQkJCSAgICAgICB2bWNiLT5jb250cm9sLmV4aXRfaW50X2luZm9fZXJyKTsKKwkJCQkgICAgICAgdm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvX2VyciwKKwkJCQkgICAgICAgS1ZNX0lTQV9TVk0pOwogCiAJbmVzdGVkX3ZtY2IgPSBuZXN0ZWRfc3ZtX21hcChzdm0sIHN2bS0+bmVzdGVkLnZtY2IsICZwYWdlKTsKIAlpZiAoIW5lc3RlZF92bWNiKQpAQCAtMjg5NCwxNSArMjkwOSwyMCBAQAogCXJldHVybiAwOwogfQogCit1NjQgc3ZtX3JlYWRfbDFfdHNjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qgdm1jYiAqdm1jYiA9IGdldF9ob3N0X3ZtY2IodG9fc3ZtKHZjcHUpKTsKKwlyZXR1cm4gdm1jYi0+Y29udHJvbC50c2Nfb2Zmc2V0ICsKKwkJc3ZtX3NjYWxlX3RzYyh2Y3B1LCBuYXRpdmVfcmVhZF90c2MoKSk7Cit9CisKIHN0YXRpYyBpbnQgc3ZtX2dldF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBlY3gsIHU2NCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKIAogCXN3aXRjaCAoZWN4KSB7CiAJY2FzZSBNU1JfSUEzMl9UU0M6IHsKLQkJc3RydWN0IHZtY2IgKnZtY2IgPSBnZXRfaG9zdF92bWNiKHN2bSk7Ci0KLQkJKmRhdGEgPSB2bWNiLT5jb250cm9sLnRzY19vZmZzZXQgKworCQkqZGF0YSA9IHN2bS0+dm1jYi0+Y29udHJvbC50c2Nfb2Zmc2V0ICsKIAkJCXN2bV9zY2FsZV90c2ModmNwdSwgbmF0aXZlX3JlYWRfdHNjKCkpOwogCiAJCWJyZWFrOwpAQCAtMzMxNCw4ICszMzM0LDYgQEAKIAlzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biA9IHZjcHUtPnJ1bjsKIAl1MzIgZXhpdF9jb2RlID0gc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfY29kZTsKIAotCXRyYWNlX2t2bV9leGl0KGV4aXRfY29kZSwgdmNwdSwgS1ZNX0lTQV9TVk0pOwotCiAJaWYgKCFpc19jcl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfQ1IwX1dSSVRFKSkKIAkJdmNwdS0+YXJjaC5jcjAgPSBzdm0tPnZtY2ItPnNhdmUuY3IwOwogCWlmIChucHRfZW5hYmxlZCkKQEAgLTMzMzUsNyArMzM1Myw4IEBACiAJCQkJCXN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMSwKIAkJCQkJc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18yLAogCQkJCQlzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbywKLQkJCQkJc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW50X2luZm9fZXJyKTsKKwkJCQkJc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW50X2luZm9fZXJyLAorCQkJCQlLVk1fSVNBX1NWTSk7CiAKIAkJdm1leGl0ID0gbmVzdGVkX3N2bV9leGl0X3NwZWNpYWwoc3ZtKTsKIApAQCAtMzc2OCw2ICszNzg3LDggQEAKIAl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTUF0gPSBzdm0tPnZtY2ItPnNhdmUucnNwOwogCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUklQXSA9IHN2bS0+dm1jYi0+c2F2ZS5yaXA7CiAKKwl0cmFjZV9rdm1fZXhpdChzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlLCB2Y3B1LCBLVk1fSVNBX1NWTSk7CisKIAlpZiAodW5saWtlbHkoc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfY29kZSA9PSBTVk1fRVhJVF9OTUkpKQogCQlrdm1fYmVmb3JlX2hhbmRsZV9ubWkoJnN2bS0+dmNwdSk7CiAKQEAgLTM4OTcsNjAgKzM5MTgsNiBAQAogCX0KIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyBzdm1fZXhpdF9yZWFzb25zX3N0cltdID0gewotCXsgU1ZNX0VYSVRfUkVBRF9DUjAsCQkJInJlYWRfY3IwIiB9LAotCXsgU1ZNX0VYSVRfUkVBRF9DUjMsCQkJInJlYWRfY3IzIiB9LAotCXsgU1ZNX0VYSVRfUkVBRF9DUjQsCQkJInJlYWRfY3I0IiB9LAotCXsgU1ZNX0VYSVRfUkVBRF9DUjgsCQkJInJlYWRfY3I4IiB9LAotCXsgU1ZNX0VYSVRfV1JJVEVfQ1IwLAkJCSJ3cml0ZV9jcjAiIH0sCi0JeyBTVk1fRVhJVF9XUklURV9DUjMsCQkJIndyaXRlX2NyMyIgfSwKLQl7IFNWTV9FWElUX1dSSVRFX0NSNCwJCQkid3JpdGVfY3I0IiB9LAotCXsgU1ZNX0VYSVRfV1JJVEVfQ1I4LAkJCSJ3cml0ZV9jcjgiIH0sCi0JeyBTVk1fRVhJVF9SRUFEX0RSMCwJCQkicmVhZF9kcjAiIH0sCi0JeyBTVk1fRVhJVF9SRUFEX0RSMSwJCQkicmVhZF9kcjEiIH0sCi0JeyBTVk1fRVhJVF9SRUFEX0RSMiwJCQkicmVhZF9kcjIiIH0sCi0JeyBTVk1fRVhJVF9SRUFEX0RSMywJCQkicmVhZF9kcjMiIH0sCi0JeyBTVk1fRVhJVF9XUklURV9EUjAsCQkJIndyaXRlX2RyMCIgfSwKLQl7IFNWTV9FWElUX1dSSVRFX0RSMSwJCQkid3JpdGVfZHIxIiB9LAotCXsgU1ZNX0VYSVRfV1JJVEVfRFIyLAkJCSJ3cml0ZV9kcjIiIH0sCi0JeyBTVk1fRVhJVF9XUklURV9EUjMsCQkJIndyaXRlX2RyMyIgfSwKLQl7IFNWTV9FWElUX1dSSVRFX0RSNSwJCQkid3JpdGVfZHI1IiB9LAotCXsgU1ZNX0VYSVRfV1JJVEVfRFI3LAkJCSJ3cml0ZV9kcjciIH0sCi0JeyBTVk1fRVhJVF9FWENQX0JBU0UgKyBEQl9WRUNUT1IsCSJEQiBleGNwIiB9LAotCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgQlBfVkVDVE9SLAkiQlAgZXhjcCIgfSwKLQl7IFNWTV9FWElUX0VYQ1BfQkFTRSArIFVEX1ZFQ1RPUiwJIlVEIGV4Y3AiIH0sCi0JeyBTVk1fRVhJVF9FWENQX0JBU0UgKyBQRl9WRUNUT1IsCSJQRiBleGNwIiB9LAotCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgTk1fVkVDVE9SLAkiTk0gZXhjcCIgfSwKLQl7IFNWTV9FWElUX0VYQ1BfQkFTRSArIE1DX1ZFQ1RPUiwJIk1DIGV4Y3AiIH0sCi0JeyBTVk1fRVhJVF9JTlRSLAkJCSJpbnRlcnJ1cHQiIH0sCi0JeyBTVk1fRVhJVF9OTUksCQkJCSJubWkiIH0sCi0JeyBTVk1fRVhJVF9TTUksCQkJCSJzbWkiIH0sCi0JeyBTVk1fRVhJVF9JTklULAkJCSJpbml0IiB9LAotCXsgU1ZNX0VYSVRfVklOVFIsCQkJInZpbnRyIiB9LAotCXsgU1ZNX0VYSVRfQ1BVSUQsCQkJImNwdWlkIiB9LAotCXsgU1ZNX0VYSVRfSU5WRCwJCQkiaW52ZCIgfSwKLQl7IFNWTV9FWElUX0hMVCwJCQkJImhsdCIgfSwKLQl7IFNWTV9FWElUX0lOVkxQRywJCQkiaW52bHBnIiB9LAotCXsgU1ZNX0VYSVRfSU5WTFBHQSwJCQkiaW52bHBnYSIgfSwKLQl7IFNWTV9FWElUX0lPSU8sCQkJImlvIiB9LAotCXsgU1ZNX0VYSVRfTVNSLAkJCQkibXNyIiB9LAotCXsgU1ZNX0VYSVRfVEFTS19TV0lUQ0gsCQkJInRhc2tfc3dpdGNoIiB9LAotCXsgU1ZNX0VYSVRfU0hVVERPV04sCQkJInNodXRkb3duIiB9LAotCXsgU1ZNX0VYSVRfVk1SVU4sCQkJInZtcnVuIiB9LAotCXsgU1ZNX0VYSVRfVk1NQ0FMTCwJCQkiaHlwZXJjYWxsIiB9LAotCXsgU1ZNX0VYSVRfVk1MT0FELAkJCSJ2bWxvYWQiIH0sCi0JeyBTVk1fRVhJVF9WTVNBVkUsCQkJInZtc2F2ZSIgfSwKLQl7IFNWTV9FWElUX1NUR0ksCQkJInN0Z2kiIH0sCi0JeyBTVk1fRVhJVF9DTEdJLAkJCSJjbGdpIiB9LAotCXsgU1ZNX0VYSVRfU0tJTklULAkJCSJza2luaXQiIH0sCi0JeyBTVk1fRVhJVF9XQklOVkQsCQkJIndiaW52ZCIgfSwKLQl7IFNWTV9FWElUX01PTklUT1IsCQkJIm1vbml0b3IiIH0sCi0JeyBTVk1fRVhJVF9NV0FJVCwJCQkibXdhaXQiIH0sCi0JeyBTVk1fRVhJVF9YU0VUQlYsCQkJInhzZXRidiIgfSwKLQl7IFNWTV9FWElUX05QRiwJCQkJIm5wZiIgfSwKLQl7IC0xLCBOVUxMIH0KLX07Ci0KIHN0YXRpYyBpbnQgc3ZtX2dldF9scGFnZV9sZXZlbCh2b2lkKQogewogCXJldHVybiBQVF9QRFBFX0xFVkVMOwpAQCAtNDIyMyw3ICs0MTkwLDYgQEAKIAkuZ2V0X210X21hc2sgPSBzdm1fZ2V0X210X21hc2ssCiAKIAkuZ2V0X2V4aXRfaW5mbyA9IHN2bV9nZXRfZXhpdF9pbmZvLAotCS5leGl0X3JlYXNvbnNfc3RyID0gc3ZtX2V4aXRfcmVhc29uc19zdHIsCiAKIAkuZ2V0X2xwYWdlX2xldmVsID0gc3ZtX2dldF9scGFnZV9sZXZlbCwKIApAQCAtNDIzOSw2ICs0MjA1LDcgQEAKIAkud3JpdGVfdHNjX29mZnNldCA9IHN2bV93cml0ZV90c2Nfb2Zmc2V0LAogCS5hZGp1c3RfdHNjX29mZnNldCA9IHN2bV9hZGp1c3RfdHNjX29mZnNldCwKIAkuY29tcHV0ZV90c2Nfb2Zmc2V0ID0gc3ZtX2NvbXB1dGVfdHNjX29mZnNldCwKKwkucmVhZF9sMV90c2MgPSBzdm1fcmVhZF9sMV90c2MsCiAKIAkuc2V0X3RkcF9jcjMgPSBzZXRfdGRwX2NyMywKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3RyYWNlLmggYi9hcmNoL3g4Ni9rdm0vdHJhY2UuaAppbmRleCAzZmY4OThjLi45MTFkMjY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vdHJhY2UuaAorKysgYi9hcmNoL3g4Ni9rdm0vdHJhY2UuaApAQCAtMiw2ICsyLDggQEAKICNkZWZpbmUgX1RSQUNFX0tWTV9ICiAKICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisjaW5jbHVkZSA8YXNtL3ZteC5oPgorI2luY2x1ZGUgPGFzbS9zdm0uaD4KIAogI3VuZGVmIFRSQUNFX1NZU1RFTQogI2RlZmluZSBUUkFDRV9TWVNURU0ga3ZtCkBAIC0xODEsNiArMTgzLDk1IEBACiAjZGVmaW5lIEtWTV9JU0FfVk1YICAgMQogI2RlZmluZSBLVk1fSVNBX1NWTSAgIDIKIAorI2RlZmluZSBWTVhfRVhJVF9SRUFTT05TIFwKKwl7IEVYSVRfUkVBU09OX0VYQ0VQVElPTl9OTUksCQkiRVhDRVBUSU9OX05NSSIgfSwgXAorCXsgRVhJVF9SRUFTT05fRVhURVJOQUxfSU5URVJSVVBULAkiRVhURVJOQUxfSU5URVJSVVBUIiB9LCBcCisJeyBFWElUX1JFQVNPTl9UUklQTEVfRkFVTFQsCQkiVFJJUExFX0ZBVUxUIiB9LCBcCisJeyBFWElUX1JFQVNPTl9QRU5ESU5HX0lOVEVSUlVQVCwJIlBFTkRJTkdfSU5URVJSVVBUIiB9LCBcCisJeyBFWElUX1JFQVNPTl9OTUlfV0lORE9XLAkJIk5NSV9XSU5ET1ciIH0sIFwKKwl7IEVYSVRfUkVBU09OX1RBU0tfU1dJVENILAkJIlRBU0tfU1dJVENIIiB9LCBcCisJeyBFWElUX1JFQVNPTl9DUFVJRCwJCQkiQ1BVSUQiIH0sIFwKKwl7IEVYSVRfUkVBU09OX0hMVCwJCQkiSExUIiB9LCBcCisJeyBFWElUX1JFQVNPTl9JTlZMUEcsCQkJIklOVkxQRyIgfSwgXAorCXsgRVhJVF9SRUFTT05fUkRQTUMsCQkJIlJEUE1DIiB9LCBcCisJeyBFWElUX1JFQVNPTl9SRFRTQywJCQkiUkRUU0MiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNQ0FMTCwJCQkiVk1DQUxMIiB9LCBcCisJeyBFWElUX1JFQVNPTl9WTUNMRUFSLAkJCSJWTUNMRUFSIiB9LCBcCisJeyBFWElUX1JFQVNPTl9WTUxBVU5DSCwJCQkiVk1MQVVOQ0giIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNUFRSTEQsCQkJIlZNUFRSTEQiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNUFRSU1QsCQkJIlZNUFRSU1QiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNUkVBRCwJCQkiVk1SRUFEIiB9LCBcCisJeyBFWElUX1JFQVNPTl9WTVJFU1VNRSwJCQkiVk1SRVNVTUUiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNV1JJVEUsCQkJIlZNV1JJVEUiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNT0ZGLAkJCSJWTU9GRiIgfSwgXAorCXsgRVhJVF9SRUFTT05fVk1PTiwJCQkiVk1PTiIgfSwgXAorCXsgRVhJVF9SRUFTT05fQ1JfQUNDRVNTLAkJIkNSX0FDQ0VTUyIgfSwgXAorCXsgRVhJVF9SRUFTT05fRFJfQUNDRVNTLAkJIkRSX0FDQ0VTUyIgfSwgXAorCXsgRVhJVF9SRUFTT05fSU9fSU5TVFJVQ1RJT04sCQkiSU9fSU5TVFJVQ1RJT04iIH0sIFwKKwl7IEVYSVRfUkVBU09OX01TUl9SRUFELAkJCSJNU1JfUkVBRCIgfSwgXAorCXsgRVhJVF9SRUFTT05fTVNSX1dSSVRFLAkJIk1TUl9XUklURSIgfSwgXAorCXsgRVhJVF9SRUFTT05fTVdBSVRfSU5TVFJVQ1RJT04sCSJNV0FJVF9JTlNUUlVDVElPTiIgfSwgXAorCXsgRVhJVF9SRUFTT05fTU9OSVRPUl9JTlNUUlVDVElPTiwJIk1PTklUT1JfSU5TVFJVQ1RJT04iIH0sIFwKKwl7IEVYSVRfUkVBU09OX1BBVVNFX0lOU1RSVUNUSU9OLAkiUEFVU0VfSU5TVFJVQ1RJT04iIH0sIFwKKwl7IEVYSVRfUkVBU09OX01DRV9EVVJJTkdfVk1FTlRSWSwJIk1DRV9EVVJJTkdfVk1FTlRSWSIgfSwgXAorCXsgRVhJVF9SRUFTT05fVFBSX0JFTE9XX1RIUkVTSE9MRCwJIlRQUl9CRUxPV19USFJFU0hPTEQiIH0sCVwKKwl7IEVYSVRfUkVBU09OX0FQSUNfQUNDRVNTLAkJIkFQSUNfQUNDRVNTIiB9LCBcCisJeyBFWElUX1JFQVNPTl9FUFRfVklPTEFUSU9OLAkJIkVQVF9WSU9MQVRJT04iIH0sIFwKKwl7IEVYSVRfUkVBU09OX0VQVF9NSVNDT05GSUcsCQkiRVBUX01JU0NPTkZJRyIgfSwgXAorCXsgRVhJVF9SRUFTT05fV0JJTlZELAkJCSJXQklOVkQiIH0KKworI2RlZmluZSBTVk1fRVhJVF9SRUFTT05TIFwKKwl7IFNWTV9FWElUX1JFQURfQ1IwLAkJCSJyZWFkX2NyMCIgfSwgXAorCXsgU1ZNX0VYSVRfUkVBRF9DUjMsCQkJInJlYWRfY3IzIiB9LCBcCisJeyBTVk1fRVhJVF9SRUFEX0NSNCwJCQkicmVhZF9jcjQiIH0sIFwKKwl7IFNWTV9FWElUX1JFQURfQ1I4LAkJCSJyZWFkX2NyOCIgfSwgXAorCXsgU1ZNX0VYSVRfV1JJVEVfQ1IwLAkJCSJ3cml0ZV9jcjAiIH0sIFwKKwl7IFNWTV9FWElUX1dSSVRFX0NSMywJCQkid3JpdGVfY3IzIiB9LCBcCisJeyBTVk1fRVhJVF9XUklURV9DUjQsCQkJIndyaXRlX2NyNCIgfSwgXAorCXsgU1ZNX0VYSVRfV1JJVEVfQ1I4LAkJCSJ3cml0ZV9jcjgiIH0sIFwKKwl7IFNWTV9FWElUX1JFQURfRFIwLAkJCSJyZWFkX2RyMCIgfSwgXAorCXsgU1ZNX0VYSVRfUkVBRF9EUjEsCQkJInJlYWRfZHIxIiB9LCBcCisJeyBTVk1fRVhJVF9SRUFEX0RSMiwJCQkicmVhZF9kcjIiIH0sIFwKKwl7IFNWTV9FWElUX1JFQURfRFIzLAkJCSJyZWFkX2RyMyIgfSwgXAorCXsgU1ZNX0VYSVRfV1JJVEVfRFIwLAkJCSJ3cml0ZV9kcjAiIH0sIFwKKwl7IFNWTV9FWElUX1dSSVRFX0RSMSwJCQkid3JpdGVfZHIxIiB9LCBcCisJeyBTVk1fRVhJVF9XUklURV9EUjIsCQkJIndyaXRlX2RyMiIgfSwgXAorCXsgU1ZNX0VYSVRfV1JJVEVfRFIzLAkJCSJ3cml0ZV9kcjMiIH0sIFwKKwl7IFNWTV9FWElUX1dSSVRFX0RSNSwJCQkid3JpdGVfZHI1IiB9LCBcCisJeyBTVk1fRVhJVF9XUklURV9EUjcsCQkJIndyaXRlX2RyNyIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgREJfVkVDVE9SLAkiREIgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgQlBfVkVDVE9SLAkiQlAgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgVURfVkVDVE9SLAkiVUQgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgUEZfVkVDVE9SLAkiUEYgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgTk1fVkVDVE9SLAkiTk0gZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgTUNfVkVDVE9SLAkiTUMgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfSU5UUiwJCQkiaW50ZXJydXB0IiB9LCBcCisJeyBTVk1fRVhJVF9OTUksCQkJCSJubWkiIH0sIFwKKwl7IFNWTV9FWElUX1NNSSwJCQkJInNtaSIgfSwgXAorCXsgU1ZNX0VYSVRfSU5JVCwJCQkiaW5pdCIgfSwgXAorCXsgU1ZNX0VYSVRfVklOVFIsCQkJInZpbnRyIiB9LCBcCisJeyBTVk1fRVhJVF9DUFVJRCwJCQkiY3B1aWQiIH0sIFwKKwl7IFNWTV9FWElUX0lOVkQsCQkJImludmQiIH0sIFwKKwl7IFNWTV9FWElUX0hMVCwJCQkJImhsdCIgfSwgXAorCXsgU1ZNX0VYSVRfSU5WTFBHLAkJCSJpbnZscGciIH0sIFwKKwl7IFNWTV9FWElUX0lOVkxQR0EsCQkJImludmxwZ2EiIH0sIFwKKwl7IFNWTV9FWElUX0lPSU8sCQkJImlvIiB9LCBcCisJeyBTVk1fRVhJVF9NU1IsCQkJCSJtc3IiIH0sIFwKKwl7IFNWTV9FWElUX1RBU0tfU1dJVENILAkJCSJ0YXNrX3N3aXRjaCIgfSwgXAorCXsgU1ZNX0VYSVRfU0hVVERPV04sCQkJInNodXRkb3duIiB9LCBcCisJeyBTVk1fRVhJVF9WTVJVTiwJCQkidm1ydW4iIH0sIFwKKwl7IFNWTV9FWElUX1ZNTUNBTEwsCQkJImh5cGVyY2FsbCIgfSwgXAorCXsgU1ZNX0VYSVRfVk1MT0FELAkJCSJ2bWxvYWQiIH0sIFwKKwl7IFNWTV9FWElUX1ZNU0FWRSwJCQkidm1zYXZlIiB9LCBcCisJeyBTVk1fRVhJVF9TVEdJLAkJCSJzdGdpIiB9LCBcCisJeyBTVk1fRVhJVF9DTEdJLAkJCSJjbGdpIiB9LCBcCisJeyBTVk1fRVhJVF9TS0lOSVQsCQkJInNraW5pdCIgfSwgXAorCXsgU1ZNX0VYSVRfV0JJTlZELAkJCSJ3YmludmQiIH0sIFwKKwl7IFNWTV9FWElUX01PTklUT1IsCQkJIm1vbml0b3IiIH0sIFwKKwl7IFNWTV9FWElUX01XQUlULAkJCSJtd2FpdCIgfSwgXAorCXsgU1ZNX0VYSVRfWFNFVEJWLAkJCSJ4c2V0YnYiIH0sIFwKKwl7IFNWTV9FWElUX05QRiwJCQkJIm5wZiIgfQorCiAvKgogICogVHJhY2Vwb2ludCBmb3Iga3ZtIGd1ZXN0IGV4aXQ6CiAgKi8KQEAgLTIwNSw4ICsyOTYsOSBAQAogCSksCiAKIAlUUF9wcmludGsoInJlYXNvbiAlcyByaXAgMHglbHggaW5mbyAlbGx4ICVsbHgiLAotCQkgZnRyYWNlX3ByaW50X3N5bWJvbHNfc2VxKHAsIF9fZW50cnktPmV4aXRfcmVhc29uLAotCQkJCQkgIGt2bV94ODZfb3BzLT5leGl0X3JlYXNvbnNfc3RyKSwKKwkJIChfX2VudHJ5LT5pc2EgPT0gS1ZNX0lTQV9WTVgpID8KKwkJIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+ZXhpdF9yZWFzb24sIFZNWF9FWElUX1JFQVNPTlMpIDoKKwkJIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+ZXhpdF9yZWFzb24sIFNWTV9FWElUX1JFQVNPTlMpLAogCQkgX19lbnRyeS0+Z3Vlc3RfcmlwLCBfX2VudHJ5LT5pbmZvMSwgX19lbnRyeS0+aW5mbzIpCiApOwogCkBAIC00ODYsOSArNTc4LDkgQEAKIFRSQUNFX0VWRU5UKGt2bV9uZXN0ZWRfdm1leGl0LAogCSAgICBUUF9QUk9UTyhfX3U2NCByaXAsIF9fdTMyIGV4aXRfY29kZSwKIAkJICAgICBfX3U2NCBleGl0X2luZm8xLCBfX3U2NCBleGl0X2luZm8yLAotCQkgICAgIF9fdTMyIGV4aXRfaW50X2luZm8sIF9fdTMyIGV4aXRfaW50X2luZm9fZXJyKSwKKwkJICAgICBfX3UzMiBleGl0X2ludF9pbmZvLCBfX3UzMiBleGl0X2ludF9pbmZvX2VyciwgX191MzIgaXNhKSwKIAkgICAgVFBfQVJHUyhyaXAsIGV4aXRfY29kZSwgZXhpdF9pbmZvMSwgZXhpdF9pbmZvMiwKLQkJICAgIGV4aXRfaW50X2luZm8sIGV4aXRfaW50X2luZm9fZXJyKSwKKwkJICAgIGV4aXRfaW50X2luZm8sIGV4aXRfaW50X2luZm9fZXJyLCBpc2EpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJX191NjQsCQlyaXAJCQkpCkBAIC00OTcsNiArNTg5LDcgQEAKIAkJX19maWVsZCgJX191NjQsCQlleGl0X2luZm8yCQkpCiAJCV9fZmllbGQoCV9fdTMyLAkJZXhpdF9pbnRfaW5mbwkJKQogCQlfX2ZpZWxkKAlfX3UzMiwJCWV4aXRfaW50X2luZm9fZXJyCSkKKwkJX19maWVsZCgJX191MzIsCQlpc2EJCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtNTA2LDEyICs1OTksMTQgQEAKIAkJX19lbnRyeS0+ZXhpdF9pbmZvMgkJPSBleGl0X2luZm8yOwogCQlfX2VudHJ5LT5leGl0X2ludF9pbmZvCQk9IGV4aXRfaW50X2luZm87CiAJCV9fZW50cnktPmV4aXRfaW50X2luZm9fZXJyCT0gZXhpdF9pbnRfaW5mb19lcnI7CisJCV9fZW50cnktPmlzYQkJCT0gaXNhOwogCSksCiAJVFBfcHJpbnRrKCJyaXA6IDB4JTAxNmxseCByZWFzb246ICVzIGV4dF9pbmYxOiAweCUwMTZsbHggIgogCQkgICJleHRfaW5mMjogMHglMDE2bGx4IGV4dF9pbnQ6IDB4JTA4eCBleHRfaW50X2VycjogMHglMDh4IiwKIAkJICBfX2VudHJ5LT5yaXAsCi0JCSAgZnRyYWNlX3ByaW50X3N5bWJvbHNfc2VxKHAsIF9fZW50cnktPmV4aXRfY29kZSwKLQkJCQkJICAga3ZtX3g4Nl9vcHMtPmV4aXRfcmVhc29uc19zdHIpLAorCQkgKF9fZW50cnktPmlzYSA9PSBLVk1fSVNBX1ZNWCkgPworCQkgX19wcmludF9zeW1ib2xpYyhfX2VudHJ5LT5leGl0X2NvZGUsIFZNWF9FWElUX1JFQVNPTlMpIDoKKwkJIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+ZXhpdF9jb2RlLCBTVk1fRVhJVF9SRUFTT05TKSwKIAkJICBfX2VudHJ5LT5leGl0X2luZm8xLCBfX2VudHJ5LT5leGl0X2luZm8yLAogCQkgIF9fZW50cnktPmV4aXRfaW50X2luZm8sIF9fZW50cnktPmV4aXRfaW50X2luZm9fZXJyKQogKTsKQEAgLTUyMiw5ICs2MTcsOSBAQAogVFJBQ0VfRVZFTlQoa3ZtX25lc3RlZF92bWV4aXRfaW5qZWN0LAogCSAgICBUUF9QUk9UTyhfX3UzMiBleGl0X2NvZGUsCiAJCSAgICAgX191NjQgZXhpdF9pbmZvMSwgX191NjQgZXhpdF9pbmZvMiwKLQkJICAgICBfX3UzMiBleGl0X2ludF9pbmZvLCBfX3UzMiBleGl0X2ludF9pbmZvX2VyciksCisJCSAgICAgX191MzIgZXhpdF9pbnRfaW5mbywgX191MzIgZXhpdF9pbnRfaW5mb19lcnIsIF9fdTMyIGlzYSksCiAJICAgIFRQX0FSR1MoZXhpdF9jb2RlLCBleGl0X2luZm8xLCBleGl0X2luZm8yLAotCQkgICAgZXhpdF9pbnRfaW5mbywgZXhpdF9pbnRfaW5mb19lcnIpLAorCQkgICAgZXhpdF9pbnRfaW5mbywgZXhpdF9pbnRfaW5mb19lcnIsIGlzYSksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlfX3UzMiwJCWV4aXRfY29kZQkJKQpAQCAtNTMyLDYgKzYyNyw3IEBACiAJCV9fZmllbGQoCV9fdTY0LAkJZXhpdF9pbmZvMgkJKQogCQlfX2ZpZWxkKAlfX3UzMiwJCWV4aXRfaW50X2luZm8JCSkKIAkJX19maWVsZCgJX191MzIsCQlleGl0X2ludF9pbmZvX2VycgkpCisJCV9fZmllbGQoCV9fdTMyLAkJaXNhCQkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTU0MCwxMiArNjM2LDE0IEBACiAJCV9fZW50cnktPmV4aXRfaW5mbzIJCT0gZXhpdF9pbmZvMjsKIAkJX19lbnRyeS0+ZXhpdF9pbnRfaW5mbwkJPSBleGl0X2ludF9pbmZvOwogCQlfX2VudHJ5LT5leGl0X2ludF9pbmZvX2Vycgk9IGV4aXRfaW50X2luZm9fZXJyOworCQlfX2VudHJ5LT5pc2EJCQk9IGlzYTsKIAkpLAogCiAJVFBfcHJpbnRrKCJyZWFzb246ICVzIGV4dF9pbmYxOiAweCUwMTZsbHggIgogCQkgICJleHRfaW5mMjogMHglMDE2bGx4IGV4dF9pbnQ6IDB4JTA4eCBleHRfaW50X2VycjogMHglMDh4IiwKLQkJICBmdHJhY2VfcHJpbnRfc3ltYm9sc19zZXEocCwgX19lbnRyeS0+ZXhpdF9jb2RlLAotCQkJCQkgICBrdm1feDg2X29wcy0+ZXhpdF9yZWFzb25zX3N0ciksCisJCSAoX19lbnRyeS0+aXNhID09IEtWTV9JU0FfVk1YKSA/CisJCSBfX3ByaW50X3N5bWJvbGljKF9fZW50cnktPmV4aXRfY29kZSwgVk1YX0VYSVRfUkVBU09OUykgOgorCQkgX19wcmludF9zeW1ib2xpYyhfX2VudHJ5LT5leGl0X2NvZGUsIFNWTV9FWElUX1JFQVNPTlMpLAogCQlfX2VudHJ5LT5leGl0X2luZm8xLCBfX2VudHJ5LT5leGl0X2luZm8yLAogCQlfX2VudHJ5LT5leGl0X2ludF9pbmZvLCBfX2VudHJ5LT5leGl0X2ludF9pbmZvX2VycikKICk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdm14LmMgYi9hcmNoL3g4Ni9rdm0vdm14LmMKaW5kZXggZTY1YTE1OC4uYTBkNmJkOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3ZteC5jCisrKyBiL2FyY2gveDg2L2t2bS92bXguYwpAQCAtNzEsNiArNzEsOSBAQAogc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IHlpZWxkX29uX2hsdCA9IDE7CiBtb2R1bGVfcGFyYW0oeWllbGRfb25faGx0LCBib29sLCBTX0lSVUdPKTsKIAorc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGZhc3Rlb2kgPSAxOworbW9kdWxlX3BhcmFtKGZhc3Rlb2ksIGJvb2wsIFNfSVJVR08pOworCiAvKgogICogSWYgbmVzdGVkPTEsIG5lc3RlZCB2aXJ0dWFsaXphdGlvbiBpcyBzdXBwb3J0ZWQsIGkuZS4sIGd1ZXN0cyBtYXkgdXNlCiAgKiBWTVggYW5kIGJlIGEgaHlwZXJ2aXNvciBmb3IgaXRzIG93biBndWVzdHMuIElmIG5lc3RlZD0wLCBndWVzdHMgbWF5IG5vdApAQCAtMTc0OCw2ICsxNzUxLDIxIEBACiB9CiAKIC8qCisgKiBMaWtlIGd1ZXN0X3JlYWRfdHNjLCBidXQgYWx3YXlzIHJldHVybnMgTDEncyBub3Rpb24gb2YgdGhlIHRpbWVzdGFtcAorICogY291bnRlciwgZXZlbiBpZiBhIG5lc3RlZCBndWVzdCAoTDIpIGlzIGN1cnJlbnRseSBydW5uaW5nLgorICovCit1NjQgdm14X3JlYWRfbDFfdHNjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1NjQgaG9zdF90c2MsIHRzY19vZmZzZXQ7CisKKwlyZHRzY2xsKGhvc3RfdHNjKTsKKwl0c2Nfb2Zmc2V0ID0gaXNfZ3Vlc3RfbW9kZSh2Y3B1KSA/CisJCXRvX3ZteCh2Y3B1KS0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0IDoKKwkJdm1jc19yZWFkNjQoVFNDX09GRlNFVCk7CisJcmV0dXJuIGhvc3RfdHNjICsgdHNjX29mZnNldDsKK30KKworLyoKICAqIEVtcHR5IGNhbGwtYmFjay4gTmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgd2hlbiBWTVggZW5hYmxlcyB0aGUgU0VUX1RTQ19LSFoKICAqIGlvY3RsLiBJbiB0aGlzIGNhc2UgdGhlIGNhbGwtYmFjayBzaG91bGQgdXBkYXRlIGludGVybmFsIHZteCBzdGF0ZSB0byBtYWtlCiAgKiB0aGUgY2hhbmdlcyBlZmZlY3RpdmUuCkBAIC0xNzYyLDE1ICsxNzgwLDIzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHZteF93cml0ZV90c2Nfb2Zmc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG9mZnNldCkKIHsKLQl2bWNzX3dyaXRlNjQoVFNDX09GRlNFVCwgb2Zmc2V0KTsKLQlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkKKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkgewogCQkvKgotCQkgKiBXZSdyZSBoZXJlIGlmIEwxIGNob3NlIG5vdCB0byB0cmFwIHRoZSBUU0MgTVNSLiBTaW5jZQotCQkgKiBwcmVwYXJlX3ZtY3MxMigpIGRvZXMgbm90IGNvcHkgdHNjX29mZnNldCwgd2UgbmVlZCB0byBhbHNvCi0JCSAqIHNldCB0aGUgdm1jczEyIGZpZWxkIGhlcmUuCisJCSAqIFdlJ3JlIGhlcmUgaWYgTDEgY2hvc2Ugbm90IHRvIHRyYXAgV1JNU1IgdG8gVFNDLiBBY2NvcmRpbmcKKwkJICogdG8gdGhlIHNwZWMsIHRoaXMgc2hvdWxkIHNldCBMMSdzIFRTQzsgVGhlIG9mZnNldCB0aGF0IEwxCisJCSAqIHNldCBmb3IgTDIgcmVtYWlucyB1bmNoYW5nZWQsIGFuZCBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZAorCQkgKiB0byB0aGUgbmV3bHkgc2V0IFRTQyB0byBnZXQgTDIncyBUU0MuCiAJCSAqLwotCQlnZXRfdm1jczEyKHZjcHUpLT50c2Nfb2Zmc2V0ID0gb2Zmc2V0IC0KLQkJCXRvX3ZteCh2Y3B1KS0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0OworCQlzdHJ1Y3Qgdm1jczEyICp2bWNzMTI7CisJCXRvX3ZteCh2Y3B1KS0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0ID0gb2Zmc2V0OworCQkvKiByZWNhbGN1bGF0ZSB2bWNzMDIuVFNDX09GRlNFVDogKi8KKwkJdm1jczEyID0gZ2V0X3ZtY3MxMih2Y3B1KTsKKwkJdm1jc193cml0ZTY0KFRTQ19PRkZTRVQsIG9mZnNldCArCisJCQkobmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfVVNFX1RTQ19PRkZTRVRJTkcpID8KKwkJCSB2bWNzMTItPnRzY19vZmZzZXQgOiAwKSk7CisJfSBlbHNlIHsKKwkJdm1jc193cml0ZTY0KFRTQ19PRkZTRVQsIG9mZnNldCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB2bXhfYWRqdXN0X3RzY19vZmZzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzNjQgYWRqdXN0bWVudCkKQEAgLTI3MzYsOCArMjc2Miw4IEBACiAKIAlndWVzdF90cl9hciA9IHZtY3NfcmVhZDMyKEdVRVNUX1RSX0FSX0JZVEVTKTsKIAlpZiAoKGd1ZXN0X3RyX2FyICYgQVJfVFlQRV9NQVNLKSAhPSBBUl9UWVBFX0JVU1lfNjRfVFNTKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogdHNzIGZpeHVwIGZvciBsb25nIG1vZGUuIFxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoIiVzOiB0c3MgZml4dXAgZm9yIGxvbmcgbW9kZS4gXG4iLAorCQkJCSAgICAgX19mdW5jX18pOwogCQl2bWNzX3dyaXRlMzIoR1VFU1RfVFJfQVJfQllURVMsCiAJCQkgICAgIChndWVzdF90cl9hciAmIH5BUl9UWVBFX01BU0spCiAJCQkgICAgIHwgQVJfVFlQRV9CVVNZXzY0X1RTUyk7CkBAIC00MTE1LDggKzQxNDEsNyBAQAogCQllcnJvcl9jb2RlID0gdm1jc19yZWFkMzIoVk1fRVhJVF9JTlRSX0VSUk9SX0NPREUpOwogCWlmIChpc19wYWdlX2ZhdWx0KGludHJfaW5mbykpIHsKIAkJLyogRVBUIHdvbid0IGNhdXNlIHBhZ2UgZmF1bHQgZGlyZWN0bHkgKi8KLQkJaWYgKGVuYWJsZV9lcHQpCi0JCQlCVUcoKTsKKwkJQlVHX09OKGVuYWJsZV9lcHQpOwogCQljcjIgPSB2bWNzX3JlYWRsKEVYSVRfUVVBTElGSUNBVElPTik7CiAJCXRyYWNlX2t2bV9wYWdlX2ZhdWx0KGNyMiwgZXJyb3JfY29kZSk7CiAKQEAgLTQ1MTgsNiArNDU0MywyNCBAQAogCiBzdGF0aWMgaW50IGhhbmRsZV9hcGljX2FjY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CisJaWYgKGxpa2VseShmYXN0ZW9pKSkgeworCQl1bnNpZ25lZCBsb25nIGV4aXRfcXVhbGlmaWNhdGlvbiA9IHZtY3NfcmVhZGwoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKKwkJaW50IGFjY2Vzc190eXBlLCBvZmZzZXQ7CisKKwkJYWNjZXNzX3R5cGUgPSBleGl0X3F1YWxpZmljYXRpb24gJiBBUElDX0FDQ0VTU19UWVBFOworCQlvZmZzZXQgPSBleGl0X3F1YWxpZmljYXRpb24gJiBBUElDX0FDQ0VTU19PRkZTRVQ7CisJCS8qCisJCSAqIFNhbmUgZ3Vlc3QgdXNlcyBNT1YgdG8gd3JpdGUgRU9JLCB3aXRoIHdyaXR0ZW4gdmFsdWUKKwkJICogbm90IGNhcmVkLiBTbyBtYWtlIGEgc2hvcnQtY2lyY3VpdCBoZXJlIGJ5IGF2b2lkaW5nCisJCSAqIGhlYXZ5IGluc3RydWN0aW9uIGVtdWxhdGlvbi4KKwkJICovCisJCWlmICgoYWNjZXNzX3R5cGUgPT0gVFlQRV9MSU5FQVJfQVBJQ19JTlNUX1dSSVRFKSAmJgorCQkgICAgKG9mZnNldCA9PSBBUElDX0VPSSkpIHsKKwkJCWt2bV9sYXBpY19zZXRfZW9pKHZjcHUpOworCQkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJCXJldHVybiAxOworCQl9CisJfQogCXJldHVybiBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDApID09IEVNVUxBVEVfRE9ORTsKIH0KIApAQCAtNTU5MSw4ICs1NjM0LDggQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAodW5saWtlbHkodm14LT5mYWlsKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlcyBmYWlsZWQgdm0gZW50cnkgJXhcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgdm1jc19yZWFkMzIoVk1fSU5TVFJVQ1RJT05fRVJST1IpKTsKKwkJcHJfaW5mb19yYXRlbGltaXRlZCgiJXMgZmFpbGVkIHZtIGVudHJ5ICV4XG4iLCBfX2Z1bmNfXywKKwkJCQkgICAgdm1jc19yZWFkMzIoVk1fSU5TVFJVQ1RJT05fRVJST1IpKTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC01Njk2LDggKzU3MzksNiBAQAogCXUzMiBleGl0X3JlYXNvbiA9IHZteC0+ZXhpdF9yZWFzb247CiAJdTMyIHZlY3RvcmluZ19pbmZvID0gdm14LT5pZHRfdmVjdG9yaW5nX2luZm87CiAKLQl0cmFjZV9rdm1fZXhpdChleGl0X3JlYXNvbiwgdmNwdSwgS1ZNX0lTQV9WTVgpOwotCiAJLyogSWYgZ3Vlc3Qgc3RhdGUgaXMgaW52YWxpZCwgc3RhcnQgZW11bGF0aW5nICovCiAJaWYgKHZteC0+ZW11bGF0aW9uX3JlcXVpcmVkICYmIGVtdWxhdGVfaW52YWxpZF9ndWVzdF9zdGF0ZSkKIAkJcmV0dXJuIGhhbmRsZV9pbnZhbGlkX2d1ZXN0X3N0YXRlKHZjcHUpOwpAQCAtNjEwMSw2ICs2MTQyLDcgQEAKIAl2bXgtPmxvYWRlZF92bWNzLT5sYXVuY2hlZCA9IDE7CiAKIAl2bXgtPmV4aXRfcmVhc29uID0gdm1jc19yZWFkMzIoVk1fRVhJVF9SRUFTT04pOworCXRyYWNlX2t2bV9leGl0KHZteC0+ZXhpdF9yZWFzb24sIHZjcHUsIEtWTV9JU0FfVk1YKTsKIAogCXZteF9jb21wbGV0ZV9hdG9taWNfZXhpdCh2bXgpOwogCXZteF9yZWNvdmVyX25taV9ibG9ja2luZyh2bXgpOwpAQCAtNjI0MSw0OSArNjI4Myw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBfRVIoeCkgeyBFWElUX1JFQVNPTl8jI3gsICN4IH0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyB2bXhfZXhpdF9yZWFzb25zX3N0cltdID0gewotCV9FUihFWENFUFRJT05fTk1JKSwKLQlfRVIoRVhURVJOQUxfSU5URVJSVVBUKSwKLQlfRVIoVFJJUExFX0ZBVUxUKSwKLQlfRVIoUEVORElOR19JTlRFUlJVUFQpLAotCV9FUihOTUlfV0lORE9XKSwKLQlfRVIoVEFTS19TV0lUQ0gpLAotCV9FUihDUFVJRCksCi0JX0VSKEhMVCksCi0JX0VSKElOVkxQRyksCi0JX0VSKFJEUE1DKSwKLQlfRVIoUkRUU0MpLAotCV9FUihWTUNBTEwpLAotCV9FUihWTUNMRUFSKSwKLQlfRVIoVk1MQVVOQ0gpLAotCV9FUihWTVBUUkxEKSwKLQlfRVIoVk1QVFJTVCksCi0JX0VSKFZNUkVBRCksCi0JX0VSKFZNUkVTVU1FKSwKLQlfRVIoVk1XUklURSksCi0JX0VSKFZNT0ZGKSwKLQlfRVIoVk1PTiksCi0JX0VSKENSX0FDQ0VTUyksCi0JX0VSKERSX0FDQ0VTUyksCi0JX0VSKElPX0lOU1RSVUNUSU9OKSwKLQlfRVIoTVNSX1JFQUQpLAotCV9FUihNU1JfV1JJVEUpLAotCV9FUihNV0FJVF9JTlNUUlVDVElPTiksCi0JX0VSKE1PTklUT1JfSU5TVFJVQ1RJT04pLAotCV9FUihQQVVTRV9JTlNUUlVDVElPTiksCi0JX0VSKE1DRV9EVVJJTkdfVk1FTlRSWSksCi0JX0VSKFRQUl9CRUxPV19USFJFU0hPTEQpLAotCV9FUihBUElDX0FDQ0VTUyksCi0JX0VSKEVQVF9WSU9MQVRJT04pLAotCV9FUihFUFRfTUlTQ09ORklHKSwKLQlfRVIoV0JJTlZEKSwKLQl7IC0xLCBOVUxMIH0KLX07Ci0KLSN1bmRlZiBfRVIKLQogc3RhdGljIGludCB2bXhfZ2V0X2xwYWdlX2xldmVsKHZvaWQpCiB7CiAJaWYgKGVuYWJsZV9lcHQgJiYgIWNwdV9oYXNfdm14X2VwdF8xZ19wYWdlKCkpCkBAIC02NTE0LDggKzY1MTMsMTEgQEAKIAogCXNldF9jcjRfZ3Vlc3RfaG9zdF9tYXNrKHZteCk7CiAKLQl2bWNzX3dyaXRlNjQoVFNDX09GRlNFVCwKLQkJdm14LT5uZXN0ZWQudm1jczAxX3RzY19vZmZzZXQgKyB2bWNzMTItPnRzY19vZmZzZXQpOworCWlmICh2bWNzMTItPmNwdV9iYXNlZF92bV9leGVjX2NvbnRyb2wgJiBDUFVfQkFTRURfVVNFX1RTQ19PRkZTRVRJTkcpCisJCXZtY3Nfd3JpdGU2NChUU0NfT0ZGU0VULAorCQkJdm14LT5uZXN0ZWQudm1jczAxX3RzY19vZmZzZXQgKyB2bWNzMTItPnRzY19vZmZzZXQpOworCWVsc2UKKwkJdm1jc193cml0ZTY0KFRTQ19PRkZTRVQsIHZteC0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0KTsKIAogCWlmIChlbmFibGVfdnBpZCkgewogCQkvKgpAQCAtNjYxMCw5ICs2NjEyLDggQEAKIAlpZiAodm1jczEyLT52bV9lbnRyeV9tc3JfbG9hZF9jb3VudCA+IDAgfHwKIAkgICAgdm1jczEyLT52bV9leGl0X21zcl9sb2FkX2NvdW50ID4gMCB8fAogCSAgICB2bWNzMTItPnZtX2V4aXRfbXNyX3N0b3JlX2NvdW50ID4gMCkgewotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAiJXM6IFZNQ1MgTVNSX3tMT0FELFNUT1JFfSB1bnN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCQlwcl93YXJuX3JhdGVsaW1pdGVkKCIlczogVk1DUyBNU1Jfe0xPQUQsU1RPUkV9IHVuc3VwcG9ydGVkXG4iLAorCQkJCSAgICBfX2Z1bmNfXyk7CiAJCW5lc3RlZF92bXhfZmFpbFZhbGlkKHZjcHUsIFZNWEVSUl9FTlRSWV9JTlZBTElEX0NPTlRST0xfRklFTEQpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC02OTIyLDcgKzY5MjMsNyBAQAogCiAJbG9hZF92bWNzMTJfaG9zdF9zdGF0ZSh2Y3B1LCB2bWNzMTIpOwogCi0JLyogVXBkYXRlIFRTQ19PRkZTRVQgaWYgdm14X2FkanVzdF90c2Nfb2Zmc2V0KCkgd2FzIHVzZWQgd2hpbGUgTDIgcmFuICovCisJLyogVXBkYXRlIFRTQ19PRkZTRVQgaWYgVFNDIHdhcyBjaGFuZ2VkIHdoaWxlIEwyIHJhbiAqLwogCXZtY3Nfd3JpdGU2NChUU0NfT0ZGU0VULCB2bXgtPm5lc3RlZC52bWNzMDFfdHNjX29mZnNldCk7CiAKIAkvKiBUaGlzIGlzIG5lZWRlZCBmb3Igc2FtZSByZWFzb24gYXMgaXQgd2FzIG5lZWRlZCBpbiBwcmVwYXJlX3ZtY3MwMiAqLwpAQCAtNzAzOSw3ICs3MDQwLDYgQEAKIAkuZ2V0X210X21hc2sgPSB2bXhfZ2V0X210X21hc2ssCiAKIAkuZ2V0X2V4aXRfaW5mbyA9IHZteF9nZXRfZXhpdF9pbmZvLAotCS5leGl0X3JlYXNvbnNfc3RyID0gdm14X2V4aXRfcmVhc29uc19zdHIsCiAKIAkuZ2V0X2xwYWdlX2xldmVsID0gdm14X2dldF9scGFnZV9sZXZlbCwKIApAQCAtNzA1NSw2ICs3MDU1LDcgQEAKIAkud3JpdGVfdHNjX29mZnNldCA9IHZteF93cml0ZV90c2Nfb2Zmc2V0LAogCS5hZGp1c3RfdHNjX29mZnNldCA9IHZteF9hZGp1c3RfdHNjX29mZnNldCwKIAkuY29tcHV0ZV90c2Nfb2Zmc2V0ID0gdm14X2NvbXB1dGVfdHNjX29mZnNldCwKKwkucmVhZF9sMV90c2MgPSB2bXhfcmVhZF9sMV90c2MsCiAKIAkuc2V0X3RkcF9jcjMgPSB2bXhfc2V0X2NyMywKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3g4Ni5jIGIvYXJjaC94ODYva3ZtL3g4Ni5jCmluZGV4IDg0YTI4ZWEuLmMzOGVmZDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODYuYworKysgYi9hcmNoL3g4Ni9rdm0veDg2LmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMva3ZtLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwpAQCAtODMsNiArODQsNyBAQAogc3RhdGljIHZvaWQgdXBkYXRlX2NyOF9pbnRlcmNlcHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHN0YXRpYyBpbnQga3ZtX2Rldl9pb2N0bF9nZXRfc3VwcG9ydGVkX2NwdWlkKHN0cnVjdCBrdm1fY3B1aWQyICpjcHVpZCwKIAkJCQkgICAgc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgX191c2VyICplbnRyaWVzKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfbm1pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIHN0cnVjdCBrdm1feDg2X29wcyAqa3ZtX3g4Nl9vcHM7CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1feDg2X29wcyk7CkBAIC0zNTksOCArMzYxLDggQEAKIAogdm9pZCBrdm1faW5qZWN0X25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Ja3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX0VWRU5ULCB2Y3B1KTsKLQl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gMTsKKwlhdG9taWNfaW5jKCZ2Y3B1LT5hcmNoLm5taV9xdWV1ZWQpOworCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9OTUksIHZjcHUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2luamVjdF9ubWkpOwogCkBAIC01OTksNiArNjAxLDggQEAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9jcHVpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgKmJlc3Q7CisJc3RydWN0IGt2bV9sYXBpYyAqYXBpYyA9IHZjcHUtPmFyY2guYXBpYzsKKwl1MzIgdGltZXJfbW9kZV9tYXNrOwogCiAJYmVzdCA9IGt2bV9maW5kX2NwdWlkX2VudHJ5KHZjcHUsIDEsIDApOwogCWlmICghYmVzdCkKQEAgLTYxMCw2ICs2MTQsMTYgQEAKIAkJaWYgKGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfT1NYU0FWRSkpCiAJCQliZXN0LT5lY3ggfD0gYml0KFg4Nl9GRUFUVVJFX09TWFNBVkUpOwogCX0KKworCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCAmJgorCQliZXN0LT5mdW5jdGlvbiA9PSAweDEpIHsKKwkJYmVzdC0+ZWN4IHw9IGJpdChYODZfRkVBVFVSRV9UU0NfREVBRExJTkVfVElNRVIpOworCQl0aW1lcl9tb2RlX21hc2sgPSAzIDw8IDE3OworCX0gZWxzZQorCQl0aW1lcl9tb2RlX21hc2sgPSAxIDw8IDE3OworCisJaWYgKGFwaWMpCisJCWFwaWMtPmxhcGljX3RpbWVyLnRpbWVyX21vZGVfbWFzayA9IHRpbWVyX21vZGVfbWFzazsKIH0KIAogaW50IGt2bV9zZXRfY3I0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjQpCkBAIC04MjUsNiArODM5LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBudW1fbXNyc190b19zYXZlOwogCiBzdGF0aWMgdTMyIGVtdWxhdGVkX21zcnNbXSA9IHsKKwlNU1JfSUEzMl9UU0NERUFETElORSwKIAlNU1JfSUEzMl9NSVNDX0VOQUJMRSwKIAlNU1JfSUEzMl9NQ0dfU1RBVFVTLAogCU1TUl9JQTMyX01DR19DVEwsCkBAIC0xMDAwLDcgKzEwMTUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1NjQgdmNwdV90c2Nfa2h6KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3U2NCB2Y3B1X3RzY19raHooc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWlmICh2Y3B1LT5hcmNoLnZpcnR1YWxfdHNjX2toeikKIAkJcmV0dXJuIHZjcHUtPmFyY2gudmlydHVhbF90c2Nfa2h6OwpAQCAtMTA5OCw3ICsxMTEzLDcgQEAKIAogCS8qIEtlZXAgaXJxIGRpc2FibGVkIHRvIHByZXZlbnQgY2hhbmdlcyB0byB0aGUgY2xvY2sgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Ja3ZtX2dldF9tc3IodiwgTVNSX0lBMzJfVFNDLCAmdHNjX3RpbWVzdGFtcCk7CisJdHNjX3RpbWVzdGFtcCA9IGt2bV94ODZfb3BzLT5yZWFkX2wxX3RzYyh2KTsKIAlrZXJuZWxfbnMgPSBnZXRfa2VybmVsX25zKCk7CiAJdGhpc190c2Nfa2h6ID0gdmNwdV90c2Nfa2h6KHYpOwogCWlmICh1bmxpa2VseSh0aGlzX3RzY19raHogPT0gMCkpIHsKQEAgLTE1NjQsNiArMTU3OSw5IEBACiAJCWJyZWFrOwogCWNhc2UgQVBJQ19CQVNFX01TUiAuLi4gQVBJQ19CQVNFX01TUiArIDB4M2ZmOgogCQlyZXR1cm4ga3ZtX3gyYXBpY19tc3Jfd3JpdGUodmNwdSwgbXNyLCBkYXRhKTsKKwljYXNlIE1TUl9JQTMyX1RTQ0RFQURMSU5FOgorCQlrdm1fc2V0X2xhcGljX3RzY2RlYWRsaW5lX21zcih2Y3B1LCBkYXRhKTsKKwkJYnJlYWs7CiAJY2FzZSBNU1JfSUEzMl9NSVNDX0VOQUJMRToKIAkJdmNwdS0+YXJjaC5pYTMyX21pc2NfZW5hYmxlX21zciA9IGRhdGE7CiAJCWJyZWFrOwpAQCAtMTgyNSw2ICsxODQzLDkgQEAKIAkJcmV0dXJuIGt2bV9odl92YXBpY19tc3JfcmVhZCh2Y3B1LCBBUElDX0lDUiwgcGRhdGEpOwogCWNhc2UgSFZfWDY0X01TUl9UUFI6CiAJCXJldHVybiBrdm1faHZfdmFwaWNfbXNyX3JlYWQodmNwdSwgQVBJQ19UQVNLUFJJLCBwZGF0YSk7CisJY2FzZSBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0U6CisJCWRhdGEgPSB2Y3B1LT5hcmNoLmh2X3ZhcGljOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl91bmltcGwodmNwdSwgIkh5cGVyLVYgdW5oYW5kbGVkIHJkbXNyOiAweCV4XG4iLCBtc3IpOwogCQlyZXR1cm4gMTsKQEAgLTE4MzksNyArMTg2MCw2IEBACiAKIAlzd2l0Y2ggKG1zcikgewogCWNhc2UgTVNSX0lBMzJfUExBVEZPUk1fSUQ6Ci0JY2FzZSBNU1JfSUEzMl9VQ09ERV9SRVY6CiAJY2FzZSBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTjoKIAljYXNlIE1TUl9JQTMyX0RFQlVHQ1RMTVNSOgogCWNhc2UgTVNSX0lBMzJfTEFTVEJSQU5DSEZST01JUDoKQEAgLTE4NjAsNiArMTg4MCw5IEBACiAJY2FzZSBNU1JfRkFNMTBIX01NSU9fQ09ORl9CQVNFOgogCQlkYXRhID0gMDsKIAkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9VQ09ERV9SRVY6CisJCWRhdGEgPSAweDEwMDAwMDAwMFVMTDsKKwkJYnJlYWs7CiAJY2FzZSBNU1JfTVRSUmNhcDoKIAkJZGF0YSA9IDB4NTAwIHwgS1ZNX05SX1ZBUl9NVFJSOwogCQlicmVhazsKQEAgLTE4ODgsNiArMTkxMSw5IEBACiAJY2FzZSBBUElDX0JBU0VfTVNSIC4uLiBBUElDX0JBU0VfTVNSICsgMHgzZmY6CiAJCXJldHVybiBrdm1feDJhcGljX21zcl9yZWFkKHZjcHUsIG1zciwgcGRhdGEpOwogCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1RTQ0RFQURMSU5FOgorCQlkYXRhID0ga3ZtX2dldF9sYXBpY190c2NkZWFkbGluZV9tc3IodmNwdSk7CisJCWJyZWFrOwogCWNhc2UgTVNSX0lBMzJfTUlTQ19FTkFCTEU6CiAJCWRhdGEgPSB2Y3B1LT5hcmNoLmlhMzJfbWlzY19lbmFibGVfbXNyOwogCQlicmVhazsKQEAgLTIwODYsNiArMjExMiw5IEBACiAJCXIgPSAha3ZtX3g4Nl9vcHMtPmNwdV9oYXNfYWNjZWxlcmF0ZWRfdHByKCk7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX0NBUF9OUl9WQ1BVUzoKKwkJciA9IEtWTV9TT0ZUX01BWF9WQ1BVUzsKKwkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX01BWF9WQ1BVUzoKIAkJciA9IEtWTV9NQVhfVkNQVVM7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX0NBUF9OUl9NRU1TTE9UUzoKQEAgLTIwOTUsNyArMjEyNCw3IEBACiAJCXIgPSAwOwogCQlicmVhazsKIAljYXNlIEtWTV9DQVBfSU9NTVU6Ci0JCXIgPSBpb21tdV9mb3VuZCgpOworCQlyID0gaW9tbXVfcHJlc2VudCgmcGNpX2J1c190eXBlKTsKIAkJYnJlYWs7CiAJY2FzZSBLVk1fQ0FQX01DRToKIAkJciA9IEtWTV9NQVhfTUNFX0JBTktTOwpAQCAtMjIxMCw3ICsyMjM5LDcgQEAKIAkJczY0IHRzY19kZWx0YTsKIAkJdTY0IHRzYzsKIAotCQlrdm1fZ2V0X21zcih2Y3B1LCBNU1JfSUEzMl9UU0MsICZ0c2MpOworCQl0c2MgPSBrdm1feDg2X29wcy0+cmVhZF9sMV90c2ModmNwdSk7CiAJCXRzY19kZWx0YSA9ICF2Y3B1LT5hcmNoLmxhc3RfZ3Vlc3RfdHNjID8gMCA6CiAJCQkgICAgIHRzYyAtIHZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2M7CiAKQEAgLTIyMzQsNyArMjI2Myw3IEBACiB7CiAJa3ZtX3g4Nl9vcHMtPnZjcHVfcHV0KHZjcHUpOwogCWt2bV9wdXRfZ3Vlc3RfZnB1KHZjcHUpOwotCWt2bV9nZXRfbXNyKHZjcHUsIE1TUl9JQTMyX1RTQywgJnZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2MpOworCXZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2MgPSBrdm1feDg2X29wcy0+cmVhZF9sMV90c2ModmNwdSk7CiB9CiAKIHN0YXRpYyBpbnQgaXNfZWZlcl9ueCh2b2lkKQpAQCAtMjgxOSw2ICsyODQ4LDcgQEAKIHN0YXRpYyB2b2lkIGt2bV92Y3B1X2lvY3RsX3g4Nl9nZXRfdmNwdV9ldmVudHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCQkgICAgICAgc3RydWN0IGt2bV92Y3B1X2V2ZW50cyAqZXZlbnRzKQogeworCXByb2Nlc3Nfbm1pKHZjcHUpOwogCWV2ZW50cy0+ZXhjZXB0aW9uLmluamVjdGVkID0KIAkJdmNwdS0+YXJjaC5leGNlcHRpb24ucGVuZGluZyAmJgogCQkha3ZtX2V4Y2VwdGlvbl9pc19zb2Z0KHZjcHUtPmFyY2guZXhjZXB0aW9uLm5yKTsKQEAgLTI4MzYsNyArMjg2Niw3IEBACiAJCQlLVk1fWDg2X1NIQURPV19JTlRfTU9WX1NTIHwgS1ZNX1g4Nl9TSEFET1dfSU5UX1NUSSk7CiAKIAlldmVudHMtPm5taS5pbmplY3RlZCA9IHZjcHUtPmFyY2gubm1pX2luamVjdGVkOwotCWV2ZW50cy0+bm1pLnBlbmRpbmcgPSB2Y3B1LT5hcmNoLm5taV9wZW5kaW5nOworCWV2ZW50cy0+bm1pLnBlbmRpbmcgPSB2Y3B1LT5hcmNoLm5taV9wZW5kaW5nICE9IDA7CiAJZXZlbnRzLT5ubWkubWFza2VkID0ga3ZtX3g4Nl9vcHMtPmdldF9ubWlfbWFzayh2Y3B1KTsKIAlldmVudHMtPm5taS5wYWQgPSAwOwogCkBAIC0yODU2LDYgKzI4ODYsNyBAQAogCQkJICAgICAgfCBLVk1fVkNQVUVWRU5UX1ZBTElEX1NIQURPVykpCiAJCXJldHVybiAtRUlOVkFMOwogCisJcHJvY2Vzc19ubWkodmNwdSk7CiAJdmNwdS0+YXJjaC5leGNlcHRpb24ucGVuZGluZyA9IGV2ZW50cy0+ZXhjZXB0aW9uLmluamVjdGVkOwogCXZjcHUtPmFyY2guZXhjZXB0aW9uLm5yID0gZXZlbnRzLT5leGNlcHRpb24ubnI7CiAJdmNwdS0+YXJjaC5leGNlcHRpb24uaGFzX2Vycm9yX2NvZGUgPSBldmVudHMtPmV4Y2VwdGlvbi5oYXNfZXJyb3JfY29kZTsKQEAgLTM1NTYsNyArMzU4NywxMSBAQAogCQkJaWYgKHIpIHsKIAkJCQltdXRleF9sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCQkJCWt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fUElPX0JVUywKLQkJCQkJCQkgICZ2cGljLT5kZXYpOworCQkJCQkJCSAgJnZwaWMtPmRldl9tYXN0ZXIpOworCQkJCWt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fUElPX0JVUywKKwkJCQkJCQkgICZ2cGljLT5kZXZfc2xhdmUpOworCQkJCWt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fUElPX0JVUywKKwkJCQkJCQkgICZ2cGljLT5kZXZfZWNscik7CiAJCQkJbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCQkJCWtmcmVlKHZwaWMpOwogCQkJCWdvdG8gY3JlYXRlX2lycWNoaXBfdW5sb2NrOwpAQCAtNDA0NSw2MiArNDA4MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZW11bGF0b3JfcmVhZF9lbXVsYXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQkgIHZvaWQgKnZhbCwKLQkJCQkgIHVuc2lnbmVkIGludCBieXRlcywKLQkJCQkgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCi17Ci0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gZW11bF90b192Y3B1KGN0eHQpOwotCWdwYV90IGdwYTsKLQlpbnQgaGFuZGxlZCwgcmV0OwotCi0JaWYgKHZjcHUtPm1taW9fcmVhZF9jb21wbGV0ZWQpIHsKLQkJbWVtY3B5KHZhbCwgdmNwdS0+bW1pb19kYXRhLCBieXRlcyk7Ci0JCXRyYWNlX2t2bV9tbWlvKEtWTV9UUkFDRV9NTUlPX1JFQUQsIGJ5dGVzLAotCQkJICAgICAgIHZjcHUtPm1taW9fcGh5c19hZGRyLCAqKHU2NCAqKXZhbCk7Ci0JCXZjcHUtPm1taW9fcmVhZF9jb21wbGV0ZWQgPSAwOwotCQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKLQl9Ci0KLQlyZXQgPSB2Y3B1X21taW9fZ3ZhX3RvX2dwYSh2Y3B1LCBhZGRyLCAmZ3BhLCBleGNlcHRpb24sIGZhbHNlKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7Ci0KLQlpZiAocmV0KQotCQlnb3RvIG1taW87Ci0KLQlpZiAoa3ZtX3JlYWRfZ3Vlc3RfdmlydChjdHh0LCBhZGRyLCB2YWwsIGJ5dGVzLCBleGNlcHRpb24pCi0JICAgID09IFg4NkVNVUxfQ09OVElOVUUpCi0JCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwotCi1tbWlvOgotCS8qCi0JICogSXMgdGhpcyBNTUlPIGhhbmRsZWQgbG9jYWxseT8KLQkgKi8KLQloYW5kbGVkID0gdmNwdV9tbWlvX3JlYWQodmNwdSwgZ3BhLCBieXRlcywgdmFsKTsKLQotCWlmIChoYW5kbGVkID09IGJ5dGVzKQotCQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKLQotCWdwYSArPSBoYW5kbGVkOwotCWJ5dGVzIC09IGhhbmRsZWQ7Ci0JdmFsICs9IGhhbmRsZWQ7Ci0KLQl0cmFjZV9rdm1fbW1pbyhLVk1fVFJBQ0VfTU1JT19SRUFEX1VOU0FUSVNGSUVELCBieXRlcywgZ3BhLCAwKTsKLQotCXZjcHUtPm1taW9fbmVlZGVkID0gMTsKLQl2Y3B1LT5ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfTU1JTzsKLQl2Y3B1LT5ydW4tPm1taW8ucGh5c19hZGRyID0gdmNwdS0+bW1pb19waHlzX2FkZHIgPSBncGE7Ci0JdmNwdS0+bW1pb19zaXplID0gYnl0ZXM7Ci0JdmNwdS0+cnVuLT5tbWlvLmxlbiA9IG1pbih2Y3B1LT5tbWlvX3NpemUsIDgpOwotCXZjcHUtPnJ1bi0+bW1pby5pc193cml0ZSA9IHZjcHUtPm1taW9faXNfd3JpdGUgPSAwOwotCXZjcHUtPm1taW9faW5kZXggPSAwOwotCi0JcmV0dXJuIFg4NkVNVUxfSU9fTkVFREVEOwotfQotCiBpbnQgZW11bGF0b3Jfd3JpdGVfcGh5cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSwKIAkJCWNvbnN0IHZvaWQgKnZhbCwgaW50IGJ5dGVzKQogewpAQCAtNDExMywxNiArNDA5Miw5MyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UodW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCQkgICBjb25zdCB2b2lkICp2YWwsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBieXRlcywKLQkJCQkJICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbiwKLQkJCQkJICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RydWN0IHJlYWRfd3JpdGVfZW11bGF0b3Jfb3BzIHsKKwlpbnQgKCpyZWFkX3dyaXRlX3ByZXBhcmUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdm9pZCAqdmFsLAorCQkJCSAgaW50IGJ5dGVzKTsKKwlpbnQgKCpyZWFkX3dyaXRlX2VtdWxhdGUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLAorCQkJCSAgdm9pZCAqdmFsLCBpbnQgYnl0ZXMpOworCWludCAoKnJlYWRfd3JpdGVfbW1pbykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEsCisJCQkgICAgICAgaW50IGJ5dGVzLCB2b2lkICp2YWwpOworCWludCAoKnJlYWRfd3JpdGVfZXhpdF9tbWlvKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSwKKwkJCQkgICAgdm9pZCAqdmFsLCBpbnQgYnl0ZXMpOworCWJvb2wgd3JpdGU7Cit9OworCitzdGF0aWMgaW50IHJlYWRfcHJlcGFyZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHZvaWQgKnZhbCwgaW50IGJ5dGVzKQoreworCWlmICh2Y3B1LT5tbWlvX3JlYWRfY29tcGxldGVkKSB7CisJCW1lbWNweSh2YWwsIHZjcHUtPm1taW9fZGF0YSwgYnl0ZXMpOworCQl0cmFjZV9rdm1fbW1pbyhLVk1fVFJBQ0VfTU1JT19SRUFELCBieXRlcywKKwkJCSAgICAgICB2Y3B1LT5tbWlvX3BoeXNfYWRkciwgKih1NjQgKil2YWwpOworCQl2Y3B1LT5tbWlvX3JlYWRfY29tcGxldGVkID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9lbXVsYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLAorCQkJdm9pZCAqdmFsLCBpbnQgYnl0ZXMpCit7CisJcmV0dXJuICFrdm1fcmVhZF9ndWVzdCh2Y3B1LT5rdm0sIGdwYSwgdmFsLCBieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZW11bGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSwKKwkJCSB2b2lkICp2YWwsIGludCBieXRlcykKK3sKKwlyZXR1cm4gZW11bGF0b3Jfd3JpdGVfcGh5cyh2Y3B1LCBncGEsIHZhbCwgYnl0ZXMpOworfQorCitzdGF0aWMgaW50IHdyaXRlX21taW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEsIGludCBieXRlcywgdm9pZCAqdmFsKQoreworCXRyYWNlX2t2bV9tbWlvKEtWTV9UUkFDRV9NTUlPX1dSSVRFLCBieXRlcywgZ3BhLCAqKHU2NCAqKXZhbCk7CisJcmV0dXJuIHZjcHVfbW1pb193cml0ZSh2Y3B1LCBncGEsIGJ5dGVzLCB2YWwpOworfQorCitzdGF0aWMgaW50IHJlYWRfZXhpdF9tbWlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLAorCQkJICB2b2lkICp2YWwsIGludCBieXRlcykKK3sKKwl0cmFjZV9rdm1fbW1pbyhLVk1fVFJBQ0VfTU1JT19SRUFEX1VOU0FUSVNGSUVELCBieXRlcywgZ3BhLCAwKTsKKwlyZXR1cm4gWDg2RU1VTF9JT19ORUVERUQ7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZXhpdF9tbWlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLAorCQkJICAgdm9pZCAqdmFsLCBpbnQgYnl0ZXMpCit7CisJbWVtY3B5KHZjcHUtPm1taW9fZGF0YSwgdmFsLCBieXRlcyk7CisJbWVtY3B5KHZjcHUtPnJ1bi0+bW1pby5kYXRhLCB2Y3B1LT5tbWlvX2RhdGEsIDgpOworCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworfQorCitzdGF0aWMgc3RydWN0IHJlYWRfd3JpdGVfZW11bGF0b3Jfb3BzIHJlYWRfZW11bHRvciA9IHsKKwkucmVhZF93cml0ZV9wcmVwYXJlID0gcmVhZF9wcmVwYXJlLAorCS5yZWFkX3dyaXRlX2VtdWxhdGUgPSByZWFkX2VtdWxhdGUsCisJLnJlYWRfd3JpdGVfbW1pbyA9IHZjcHVfbW1pb19yZWFkLAorCS5yZWFkX3dyaXRlX2V4aXRfbW1pbyA9IHJlYWRfZXhpdF9tbWlvLAorfTsKKworc3RhdGljIHN0cnVjdCByZWFkX3dyaXRlX2VtdWxhdG9yX29wcyB3cml0ZV9lbXVsdG9yID0geworCS5yZWFkX3dyaXRlX2VtdWxhdGUgPSB3cml0ZV9lbXVsYXRlLAorCS5yZWFkX3dyaXRlX21taW8gPSB3cml0ZV9tbWlvLAorCS5yZWFkX3dyaXRlX2V4aXRfbW1pbyA9IHdyaXRlX2V4aXRfbW1pbywKKwkud3JpdGUgPSB0cnVlLAorfTsKKworc3RhdGljIGludCBlbXVsYXRvcl9yZWFkX3dyaXRlX29uZXBhZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICp2YWwsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBieXRlcywKKwkJCQkgICAgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbiwKKwkJCQkgICAgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICAgICBzdHJ1Y3QgcmVhZF93cml0ZV9lbXVsYXRvcl9vcHMgKm9wcykKIHsKIAlncGFfdCBncGE7CiAJaW50IGhhbmRsZWQsIHJldDsKKwlib29sIHdyaXRlID0gb3BzLT53cml0ZTsKIAotCXJldCA9IHZjcHVfbW1pb19ndmFfdG9fZ3BhKHZjcHUsIGFkZHIsICZncGEsIGV4Y2VwdGlvbiwgdHJ1ZSk7CisJaWYgKG9wcy0+cmVhZF93cml0ZV9wcmVwYXJlICYmCisJCSAgb3BzLT5yZWFkX3dyaXRlX3ByZXBhcmUodmNwdSwgdmFsLCBieXRlcykpCisJCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworCisJcmV0ID0gdmNwdV9tbWlvX2d2YV90b19ncGEodmNwdSwgYWRkciwgJmdwYSwgZXhjZXB0aW9uLCB3cml0ZSk7CiAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwpAQCAtNDEzMSwxNSArNDE4NywxNCBAQAogCWlmIChyZXQpCiAJCWdvdG8gbW1pbzsKIAotCWlmIChlbXVsYXRvcl93cml0ZV9waHlzKHZjcHUsIGdwYSwgdmFsLCBieXRlcykpCisJaWYgKG9wcy0+cmVhZF93cml0ZV9lbXVsYXRlKHZjcHUsIGdwYSwgdmFsLCBieXRlcykpCiAJCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogCiBtbWlvOgotCXRyYWNlX2t2bV9tbWlvKEtWTV9UUkFDRV9NTUlPX1dSSVRFLCBieXRlcywgZ3BhLCAqKHU2NCAqKXZhbCk7CiAJLyoKIAkgKiBJcyB0aGlzIE1NSU8gaGFuZGxlZCBsb2NhbGx5PwogCSAqLwotCWhhbmRsZWQgPSB2Y3B1X21taW9fd3JpdGUodmNwdSwgZ3BhLCBieXRlcywgdmFsKTsKKwloYW5kbGVkID0gb3BzLT5yZWFkX3dyaXRlX21taW8odmNwdSwgZ3BhLCBieXRlcywgdmFsKTsKIAlpZiAoaGFuZGxlZCA9PSBieXRlcykKIAkJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiAKQEAgLTQxNDgsMjMgKzQyMDMsMjAgQEAKIAl2YWwgKz0gaGFuZGxlZDsKIAogCXZjcHUtPm1taW9fbmVlZGVkID0gMTsKLQltZW1jcHkodmNwdS0+bW1pb19kYXRhLCB2YWwsIGJ5dGVzKTsKIAl2Y3B1LT5ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfTU1JTzsKIAl2Y3B1LT5ydW4tPm1taW8ucGh5c19hZGRyID0gdmNwdS0+bW1pb19waHlzX2FkZHIgPSBncGE7CiAJdmNwdS0+bW1pb19zaXplID0gYnl0ZXM7CiAJdmNwdS0+cnVuLT5tbWlvLmxlbiA9IG1pbih2Y3B1LT5tbWlvX3NpemUsIDgpOwotCXZjcHUtPnJ1bi0+bW1pby5pc193cml0ZSA9IHZjcHUtPm1taW9faXNfd3JpdGUgPSAxOwotCW1lbWNweSh2Y3B1LT5ydW4tPm1taW8uZGF0YSwgdmNwdS0+bW1pb19kYXRhLCA4KTsKKwl2Y3B1LT5ydW4tPm1taW8uaXNfd3JpdGUgPSB2Y3B1LT5tbWlvX2lzX3dyaXRlID0gd3JpdGU7CiAJdmNwdS0+bW1pb19pbmRleCA9IDA7CiAKLQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKKwlyZXR1cm4gb3BzLT5yZWFkX3dyaXRlX2V4aXRfbW1pbyh2Y3B1LCBncGEsIHZhbCwgYnl0ZXMpOwogfQogCi1pbnQgZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgIGNvbnN0IHZvaWQgKnZhbCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0JCQkgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbikKK2ludCBlbXVsYXRvcl9yZWFkX3dyaXRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQl2b2lkICp2YWwsIHVuc2lnbmVkIGludCBieXRlcywKKwkJCXN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24sCisJCQlzdHJ1Y3QgcmVhZF93cml0ZV9lbXVsYXRvcl9vcHMgKm9wcykKIHsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBlbXVsX3RvX3ZjcHUoY3R4dCk7CiAKQEAgLTQxNzMsMTYgKzQyMjUsMzggQEAKIAkJaW50IHJjLCBub3c7CiAKIAkJbm93ID0gLWFkZHIgJiB+UEFHRV9NQVNLOwotCQlyYyA9IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBub3csIGV4Y2VwdGlvbiwKLQkJCQkJCSAgICAgdmNwdSk7CisJCXJjID0gZW11bGF0b3JfcmVhZF93cml0ZV9vbmVwYWdlKGFkZHIsIHZhbCwgbm93LCBleGNlcHRpb24sCisJCQkJCQkgdmNwdSwgb3BzKTsKKwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCXJldHVybiByYzsKIAkJYWRkciArPSBub3c7CiAJCXZhbCArPSBub3c7CiAJCWJ5dGVzIC09IG5vdzsKIAl9Ci0JcmV0dXJuIGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBieXRlcywgZXhjZXB0aW9uLAotCQkJCQkgICAgICAgdmNwdSk7CisKKwlyZXR1cm4gZW11bGF0b3JfcmVhZF93cml0ZV9vbmVwYWdlKGFkZHIsIHZhbCwgYnl0ZXMsIGV4Y2VwdGlvbiwKKwkJCQkJICAgdmNwdSwgb3BzKTsKK30KKworc3RhdGljIGludCBlbXVsYXRvcl9yZWFkX2VtdWxhdGVkKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSAgdm9pZCAqdmFsLAorCQkJCSAgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJCSAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbikKK3sKKwlyZXR1cm4gZW11bGF0b3JfcmVhZF93cml0ZShjdHh0LCBhZGRyLCB2YWwsIGJ5dGVzLAorCQkJCSAgIGV4Y2VwdGlvbiwgJnJlYWRfZW11bHRvcik7Cit9CisKK2ludCBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgICAgY29uc3Qgdm9pZCAqdmFsLAorCQkJICAgIHVuc2lnbmVkIGludCBieXRlcywKKwkJCSAgICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZXhjZXB0aW9uKQoreworCXJldHVybiBlbXVsYXRvcl9yZWFkX3dyaXRlKGN0eHQsIGFkZHIsICh2b2lkICopdmFsLCBieXRlcywKKwkJCQkgICBleGNlcHRpb24sICZ3cml0ZV9lbXVsdG9yKTsKIH0KIAogI2RlZmluZSBDTVBYQ0hHX1RZUEUodCwgcHRyLCBvbGQsIG5ldykgXApAQCAtNDcxMiw3ICs0Nzg2LDcgQEAKIAlrdm1fc2V0X3JmbGFncyh2Y3B1LCBjdHh0LT5lZmxhZ3MpOwogCiAJaWYgKGlycSA9PSBOTUlfVkVDVE9SKQotCQl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gZmFsc2U7CisJCXZjcHUtPmFyY2gubm1pX3BlbmRpbmcgPSAwOwogCWVsc2UKIAkJdmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZyA9IGZhbHNlOwogCkBAIC00Nzg4LDcgKzQ4NjIsNyBAQAogCiAJCXRyYWNlX2t2bV9lbXVsYXRlX2luc25fc3RhcnQodmNwdSk7CiAJCSsrdmNwdS0+c3RhdC5pbnNuX2VtdWxhdGlvbjsKLQkJaWYgKHIpICB7CisJCWlmIChyICE9IEVNVUxBVElPTl9PSykgIHsKIAkJCWlmIChlbXVsYXRpb25fdHlwZSAmIEVNVUxUWVBFX1RSQVBfVUQpCiAJCQkJcmV0dXJuIEVNVUxBVEVfRkFJTDsKIAkJCWlmIChyZWV4ZWN1dGVfaW5zdHJ1Y3Rpb24odmNwdSwgY3IyKSkKQEAgLTU1MjEsNyArNTU5NSw3IEBACiAJLyogdHJ5IHRvIGluamVjdCBuZXcgZXZlbnQgaWYgcGVuZGluZyAqLwogCWlmICh2Y3B1LT5hcmNoLm5taV9wZW5kaW5nKSB7CiAJCWlmIChrdm1feDg2X29wcy0+bm1pX2FsbG93ZWQodmNwdSkpIHsKLQkJCXZjcHUtPmFyY2gubm1pX3BlbmRpbmcgPSBmYWxzZTsKKwkJCS0tdmNwdS0+YXJjaC5ubWlfcGVuZGluZzsKIAkJCXZjcHUtPmFyY2gubm1pX2luamVjdGVkID0gdHJ1ZTsKIAkJCWt2bV94ODZfb3BzLT5zZXRfbm1pKHZjcHUpOwogCQl9CkBAIC01NTUzLDEwICs1NjI3LDI2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBwcm9jZXNzX25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgbGltaXQgPSAyOworCisJLyoKKwkgKiB4ODYgaXMgbGltaXRlZCB0byBvbmUgTk1JIHJ1bm5pbmcsIGFuZCBvbmUgTk1JIHBlbmRpbmcgYWZ0ZXIgaXQuCisJICogSWYgYW4gTk1JIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIGxpbWl0IGZ1cnRoZXIgTk1JcyB0byBqdXN0IG9uZS4KKwkgKiBPdGhlcndpc2UsIGFsbG93IHR3byAoYW5kIHdlJ2xsIGluamVjdCB0aGUgZmlyc3Qgb25lIGltbWVkaWF0ZWx5KS4KKwkgKi8KKwlpZiAoa3ZtX3g4Nl9vcHMtPmdldF9ubWlfbWFzayh2Y3B1KSB8fCB2Y3B1LT5hcmNoLm5taV9pbmplY3RlZCkKKwkJbGltaXQgPSAxOworCisJdmNwdS0+YXJjaC5ubWlfcGVuZGluZyArPSBhdG9taWNfeGNoZygmdmNwdS0+YXJjaC5ubWlfcXVldWVkLCAwKTsKKwl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gbWluKHZjcHUtPmFyY2gubm1pX3BlbmRpbmcsIGxpbWl0KTsKKwlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfRVZFTlQsIHZjcHUpOworfQorCiBzdGF0aWMgaW50IHZjcHVfZW50ZXJfZ3Vlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWludCByOwotCWJvb2wgbm1pX3BlbmRpbmc7CiAJYm9vbCByZXFfaW50X3dpbiA9ICFpcnFjaGlwX2luX2tlcm5lbCh2Y3B1LT5rdm0pICYmCiAJCXZjcHUtPnJ1bi0+cmVxdWVzdF9pbnRlcnJ1cHRfd2luZG93OwogCkBAIC01NTk2LDYgKzU2ODYsOCBAQAogCQl9CiAJCWlmIChrdm1fY2hlY2tfcmVxdWVzdChLVk1fUkVRX1NURUFMX1VQREFURSwgdmNwdSkpCiAJCQlyZWNvcmRfc3RlYWxfdGltZSh2Y3B1KTsKKwkJaWYgKGt2bV9jaGVja19yZXF1ZXN0KEtWTV9SRVFfTk1JLCB2Y3B1KSkKKwkJCXByb2Nlc3Nfbm1pKHZjcHUpOwogCiAJfQogCkBAIC01NjAzLDE5ICs1Njk1LDExIEBACiAJaWYgKHVubGlrZWx5KHIpKQogCQlnb3RvIG91dDsKIAotCS8qCi0JICogQW4gTk1JIGNhbiBiZSBpbmplY3RlZCBiZXR3ZWVuIGxvY2FsIG5taV9wZW5kaW5nIHJlYWQgYW5kCi0JICogdmNwdS0+YXJjaC5ubWlfcGVuZGluZyByZWFkIGluc2lkZSBpbmplY3RfcGVuZGluZ19ldmVudCgpLgotCSAqIEJ1dCBpbiB0aGF0IGNhc2UsIEtWTV9SRVFfRVZFTlQgd2lsbCBiZSBzZXQsIHdoaWNoIG1ha2VzCi0JICogdGhlIHJhY2UgZGVzY3JpYmVkIGFib3ZlIGJlbmlnbi4KLQkgKi8KLQlubWlfcGVuZGluZyA9IEFDQ0VTU19PTkNFKHZjcHUtPmFyY2gubm1pX3BlbmRpbmcpOwotCiAJaWYgKGt2bV9jaGVja19yZXF1ZXN0KEtWTV9SRVFfRVZFTlQsIHZjcHUpIHx8IHJlcV9pbnRfd2luKSB7CiAJCWluamVjdF9wZW5kaW5nX2V2ZW50KHZjcHUpOwogCiAJCS8qIGVuYWJsZSBOTUkvSVJRIHdpbmRvdyBvcGVuIGV4aXRzIGlmIG5lZWRlZCAqLwotCQlpZiAobm1pX3BlbmRpbmcpCisJCWlmICh2Y3B1LT5hcmNoLm5taV9wZW5kaW5nKQogCQkJa3ZtX3g4Nl9vcHMtPmVuYWJsZV9ubWlfd2luZG93KHZjcHUpOwogCQllbHNlIGlmIChrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkgfHwgcmVxX2ludF93aW4pCiAJCQlrdm1feDg2X29wcy0+ZW5hYmxlX2lycV93aW5kb3codmNwdSk7CkBAIC01Njc4LDcgKzU3NjIsNyBAQAogCWlmIChod19icmVha3BvaW50X2FjdGl2ZSgpKQogCQlod19icmVha3BvaW50X3Jlc3RvcmUoKTsKIAotCWt2bV9nZXRfbXNyKHZjcHUsIE1TUl9JQTMyX1RTQywgJnZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2MpOworCXZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2MgPSBrdm1feDg2X29wcy0+cmVhZF9sMV90c2ModmNwdSk7CiAKIAl2Y3B1LT5tb2RlID0gT1VUU0lERV9HVUVTVF9NT0RFOwogCXNtcF93bWIoKTsKQEAgLTYzMjMsNyArNjQwNyw4IEBACiAKIGludCBrdm1fYXJjaF92Y3B1X3Jlc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gZmFsc2U7CisJYXRvbWljX3NldCgmdmNwdS0+YXJjaC5ubWlfcXVldWVkLCAwKTsKKwl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gMDsKIAl2Y3B1LT5hcmNoLm5taV9pbmplY3RlZCA9IGZhbHNlOwogCiAJdmNwdS0+YXJjaC5zd2l0Y2hfZGJfcmVncyA9IDA7CkBAIC02NTk4LDcgKzY2ODMsNyBAQAogCQkhdmNwdS0+YXJjaC5hcGYuaGFsdGVkKQogCQl8fCAhbGlzdF9lbXB0eV9jYXJlZnVsKCZ2Y3B1LT5hc3luY19wZi5kb25lKQogCQl8fCB2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9TSVBJX1JFQ0VJVkVECi0JCXx8IHZjcHUtPmFyY2gubm1pX3BlbmRpbmcgfHwKKwkJfHwgYXRvbWljX3JlYWQoJnZjcHUtPmFyY2gubm1pX3F1ZXVlZCkgfHwKIAkJKGt2bV9hcmNoX2ludGVycnVwdF9hbGxvd2VkKHZjcHUpICYmCiAJCSBrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYyBiL2FyY2gveDg2L2xndWVzdC9ib290LmMKaW5kZXggMTNlZTI1OC4uY2Y0NjAzYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYworKysgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8bGludXgvbGd1ZXN0X2xhdW5jaGVyLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2xndWVzdC5oPgogI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgpAQCAtNzAsNiArNzEsNyBAQAogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrcHJvdGVjdG9yLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgkJLyogZm9yIHN0cnVjdCBtYWNoaW5lX29wcyAqLworI2luY2x1ZGUgPGFzbS9rdm1fcGFyYS5oPgogCiAvKkc6MDEwCiAgKiBXZWxjb21lIHRvIHRoZSBHdWVzdCEKQEAgLTQ1NSw2ICs0NTcsMTUgQEAKIAkJKmF4ICY9IDB4RkZGRkYwRkY7CiAJCSpheCB8PSAweDAwMDAwNTAwOwogCQlicmVhazsKKworCS8qCisJICogVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEtWTS4gIFdlIG1pZ2h0IGJlLAorCSAqIGJ1dCB0aGF0J3MgYSBIb3N0IG1hdHRlciwgbm90IHVzLiAgU28gc2F5IHdlJ3JlIG5vdC4KKwkgKi8KKwljYXNlIEtWTV9DUFVJRF9TSUdOQVRVUkU6CisJCSpieCA9ICpjeCA9ICpkeCA9IDA7CisJCWJyZWFrOworCiAJLyoKIAkgKiAweDgwMDAwMDAwIHJldHVybnMgdGhlIGhpZ2hlc3QgRXh0ZW5kZWQgRnVuY3Rpb24sIHNvIHdlIGZ1dHVyZXByb29mCiAJICogbGlrZSB3ZSBkbyBhYm92ZSBieSBsaW1pdGluZyBpdCB0byBrbm93biBmaWVsZHMuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9mYXVsdC5jIGIvYXJjaC94ODYvbW0vZmF1bHQuYwppbmRleCA5YzczNzhkLi41ZGIwNDkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxhc20vdHJhcHMuaD4JCQkvKiBkb3RyYXBsaW5rYWdlLCAuLi4JCSovCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4JCS8qIHBnZF8qKCksIC4uLgkJCSovCiAjaW5jbHVkZSA8YXNtL2ttZW1jaGVjay5oPgkJLyoga21lbWNoZWNrXyooKSwgLi4uCQkqLwotI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4JCQkvKiBWU1lTQ0FMTF9TVEFSVAkJKi8KIAogLyoKICAqIFBhZ2UgZmF1bHQgZXJyb3IgY29kZSBiaXRzOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZ3VwLmMgYi9hcmNoL3g4Ni9tbS9ndXAuYwppbmRleCBkYmUzNGI5Li5lYTMwNTg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9ndXAuYworKysgYi9hcmNoL3g4Ni9tbS9ndXAuYwpAQCAtMTA4LDE2ICsxMDgsNiBAQAogCVNldFBhZ2VSZWZlcmVuY2VkKHBhZ2UpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2h1Z2VfcGFnZV90YWlsKHN0cnVjdCBwYWdlICpwYWdlKQotewotCS8qCi0JICogX19zcGxpdF9odWdlX3BhZ2VfcmVmY291bnQoKSBjYW5ub3QgcnVuCi0JICogZnJvbSB1bmRlciB1cy4KLQkgKi8KLQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPCAwKTsKLQlhdG9taWNfaW5jKCZwYWdlLT5fY291bnQpOwotfQotCiBzdGF0aWMgbm9pbmxpbmUgaW50IGd1cF9odWdlX3BtZChwbWRfdCBwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJdW5zaWduZWQgbG9uZyBlbmQsIGludCB3cml0ZSwgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50ICpucikKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL21tYXAuYyBiL2FyY2gveDg2L21tL21tYXAuYwppbmRleCAxZGFiNTE5Li40YjViYTg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9tbWFwLmMKKysrIGIvYXJjaC94ODYvbW0vbW1hcC5jCkBAIC0zMSw2ICszMSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgogCitzdHJ1Y3QgX19yZWFkX21vc3RseSB2YV9hbGlnbm1lbnQgdmFfYWxpZ24gPSB7CisJLmZsYWdzID0gLTEsCit9OworCiBzdGF0aWMgdW5zaWduZWQgaW50IHN0YWNrX21heHJhbmRvbV9zaXplKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IG1heCA9IDA7CkBAIC00Miw3ICs0Niw2IEBACiAJcmV0dXJuIG1heDsKIH0KIAotCiAvKgogICogVG9wIG9mIG1tYXAgYXJlYSAoanVzdCBiZWxvdyB0aGUgcHJvY2VzcyBzdGFjaykuCiAgKgpAQCAtNTEsMjEgKzU0LDYgQEAKICNkZWZpbmUgTUlOX0dBUCAoMTI4KjEwMjQqMTAyNFVMICsgc3RhY2tfbWF4cmFuZG9tX3NpemUoKSkKICNkZWZpbmUgTUFYX0dBUCAoVEFTS19TSVpFLzYqNSkKIAotLyoKLSAqIFRydWUgb24gWDg2XzMyIG9yIHdoZW4gZW11bGF0aW5nIElBMzIgb24gWDg2XzY0Ci0gKi8KLXN0YXRpYyBpbnQgbW1hcF9pc19pYTMyKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCXJldHVybiAxOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX0lBMzIpKQotCQlyZXR1cm4gMTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG1tYXBfaXNfbGVnYWN5KHZvaWQpCiB7CiAJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9DT01QQVRfTEFZT1VUKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2NlNDEwMC5jIGIvYXJjaC94ODYvcGNpL2NlNDEwMC5jCmluZGV4IDk5MTc2MDkuLjQxYmQyYTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9jZTQxMDAuYworKysgYi9hcmNoL3g4Ni9wY2kvY2U0MTAwLmMKQEAgLTMwNCw3ICszMDQsNyBAQAogCXJldHVybiBwY2lfZGlyZWN0X2NvbmYxLndyaXRlKHNlZywgYnVzLCBkZXZmbiwgcmVnLCBsZW4sIHZhbHVlKTsKIH0KIAotc3RydWN0IHBjaV9yYXdfb3BzIGNlNDEwMF9wY2lfY29uZiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgY2U0MTAwX3BjaV9jb25mID0gewogCS5yZWFkID0JY2U0MTAwX2NvbmZfcmVhZCwKIAkud3JpdGUgPSBjZTQxMDBfY29uZl93cml0ZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKaW5kZXggOTJkZjMyMi4uNzk2MmNjYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwpAQCAtMzMsOCArMzMsOCBAQAogaW50IHBjaWJpb3NfbGFzdF9idXMgPSAtMTsKIHVuc2lnbmVkIGxvbmcgcGlycV90YWJsZV9hZGRyOwogc3RydWN0IHBjaV9idXMgKnBjaV9yb290X2J1czsKLXN0cnVjdCBwY2lfcmF3X29wcyAqcmF3X3BjaV9vcHM7Ci1zdHJ1Y3QgcGNpX3Jhd19vcHMgKnJhd19wY2lfZXh0X29wczsKK2NvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyAqX19yZWFkX21vc3RseSByYXdfcGNpX29wczsKK2NvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyAqX19yZWFkX21vc3RseSByYXdfcGNpX2V4dF9vcHM7CiAKIGludCByYXdfcGNpX3JlYWQodW5zaWduZWQgaW50IGRvbWFpbiwgdW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmZuLAogCQkJCQkJaW50IHJlZywgaW50IGxlbiwgdTMyICp2YWwpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvZGlyZWN0LmMgYi9hcmNoL3g4Ni9wY2kvZGlyZWN0LmMKaW5kZXggNGYyYzcwNC4uMTU0NjA1OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2RpcmVjdC5jCisrKyBiL2FyY2gveDg2L3BjaS9kaXJlY3QuYwpAQCAtNzksNyArNzksNyBAQAogCiAjdW5kZWYgUENJX0NPTkYxX0FERFJFU1MKIAotc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9kaXJlY3RfY29uZjEgPSB7Citjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMSA9IHsKIAkucmVhZCA9CQlwY2lfY29uZjFfcmVhZCwKIAkud3JpdGUgPQlwY2lfY29uZjFfd3JpdGUsCiB9OwpAQCAtMTc1LDcgKzE3NSw3IEBACiAKICN1bmRlZiBQQ0lfQ09ORjJfQUREUkVTUwogCi1zdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMiA9IHsKIAkucmVhZCA9CQlwY2lfY29uZjJfcmVhZCwKIAkud3JpdGUgPQlwY2lfY29uZjJfd3JpdGUsCiB9OwpAQCAtMTkxLDcgKzE5MSw3IEBACiAgKiBUaGlzIHNob3VsZCBiZSBjbG9zZSB0byB0cml2aWFsLCBidXQgaXQgaXNuJ3QsIGJlY2F1c2UgdGhlcmUgYXJlIGJ1Z2d5CiAgKiBjaGlwc2V0cyAoeWVzLCB5b3UgZ3Vlc3NlZCBpdCwgYnkgSW50ZWwgYW5kIENvbXBhcSkgdGhhdCBoYXZlIG5vIGNsYXNzIElELgogICovCi1zdGF0aWMgaW50IF9faW5pdCBwY2lfc2FuaXR5X2NoZWNrKHN0cnVjdCBwY2lfcmF3X29wcyAqbykKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9zYW5pdHlfY2hlY2soY29uc3Qgc3RydWN0IHBjaV9yYXdfb3BzICpvKQogewogCXUzMiB4ID0gMDsKIAlpbnQgeWVhciwgZGV2Zm47CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvaTM4Ni5jIGIvYXJjaC94ODYvcGNpL2kzODYuYwppbmRleCA0OTRmMmU3Li43OTRiMDkyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvaTM4Ni5jCisrKyBiL2FyY2gveDg2L3BjaS9pMzg2LmMKQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2xlZ2FjeS5jIGIvYXJjaC94ODYvcGNpL2xlZ2FjeS5jCmluZGV4IGM4OTI2NmIuLjJjMmFlYWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9sZWdhY3kuYworKysgYi9hcmNoL3g4Ni9wY2kvbGVnYWN5LmMKQEAgLTIsNiArMiw3IEBACiAgKiBsZWdhY3kuYyAtIHRyYWRpdGlvbmFsLCBvbGQgc2Nob29sIFBDSSBidXMgcHJvYmluZwogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9wY2lfeDg2Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZ18zMi5jIGIvYXJjaC94ODYvcGNpL21tY29uZmlnXzMyLmMKaW5kZXggYTNkOWM1NC4uNTM3MmU4NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL21tY29uZmlnXzMyLmMKKysrIGIvYXJjaC94ODYvcGNpL21tY29uZmlnXzMyLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9tbWNmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX21tY2ZnID0gewogCS5yZWFkID0JCXBjaV9tbWNmZ19yZWFkLAogCS53cml0ZSA9CXBjaV9tbWNmZ193cml0ZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvbW1jb25maWdfNjQuYyBiL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jCmluZGV4IGU3ODM4NDEuLjkxNWE0OTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jCisrKyBiL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jCkBAIC04MSw3ICs4MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX21tY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfbW1jZmcgPSB7CiAJLnJlYWQgPQkJcGNpX21tY2ZnX3JlYWQsCiAJLndyaXRlID0JcGNpX21tY2ZnX3dyaXRlLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9udW1hcV8zMi5jIGIvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKaW5kZXggNTEyYTg4Yy4uNTFhYmYwMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKKysrIGIvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCiAjdW5kZWYgUENJX0NPTkYxX01RX0FERFJFU1MKIAotc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxX21xID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxX21xID0gewogCS5yZWFkCT0gcGNpX2NvbmYxX21xX3JlYWQsCiAJLndyaXRlCT0gcGNpX2NvbmYxX21xX3dyaXRlCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL29scGMuYyBiL2FyY2gveDg2L3BjaS9vbHBjLmMKaW5kZXggNTI2MjYwMy4uNzA0M2E0ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL29scGMuYworKysgYi9hcmNoL3g4Ni9wY2kvb2xwYy5jCkBAIC0zMDEsNyArMzAxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfb2xwY19jb25mID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfb2xwY19jb25mID0gewogCS5yZWFkID0JcGNpX29scGNfcmVhZCwKIAkud3JpdGUgPSBwY2lfb2xwY193cml0ZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMgYi9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMKaW5kZXggZjY4NTUzNS4uZGIwZTlhNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3BjYmlvcy5jCisrKyBiL2FyY2gveDg2L3BjaS9wY2Jpb3MuYwpAQCAtMzAzLDcgKzMwMyw3IEBACiAgKiBGdW5jdGlvbiB0YWJsZSBmb3IgQklPUzMyIGFjY2VzcwogICovCiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2Jpb3NfYWNjZXNzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfYmlvc19hY2Nlc3MgPSB7CiAJLnJlYWQgPQkJcGNpX2Jpb3NfcmVhZCwKIAkud3JpdGUgPQlwY2lfYmlvc193cml0ZQogfTsKQEAgLTMxMiw3ICszMTIsNyBAQAogICogVHJ5IHRvIGZpbmQgUENJIEJJT1MuCiAgKi8KIAotc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyAqIF9fZGV2aW5pdCBwY2lfZmluZF9iaW9zKHZvaWQpCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9yYXdfb3BzICogX19kZXZpbml0IHBjaV9maW5kX2Jpb3Modm9pZCkKIHsKIAl1bmlvbiBiaW9zMzIgKmNoZWNrOwogCXVuc2lnbmVkIGNoYXIgc3VtOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQppbmRleCAwMjFlZWU5Li44ZDg3NDM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKICMgUGxhdGZvcm0gc3BlY2lmaWMgY29kZSBnb2VzIGhlcmUKIG9iai15CSs9IGNlNDEwMC8KIG9iai15CSs9IGVmaS8KK29iai15CSs9IGdlb2RlLwogb2JqLXkJKz0gaXJpcy8KIG9iai15CSs9IG1yc3QvCiBvYmoteQkrPSBvbHBjLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vY2U0MTAwL2NlNDEwMC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vY2U0MTAwL2NlNDEwMC5jCmluZGV4IDI4MDcxYmIuLjRjNjFiNTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2NlNDEwMC9jZTQxMDAuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9jZTQxMDAvY2U0MTAwLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogfQogCiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHNkdl9zZXJpYWxfZml4dXAodm9pZCk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2R2X3NlcmlhbF9maXh1cCh2b2lkKSB7fTsKICNlbmRpZgogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2R2X2FyY2hfc2V0dXAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYwppbmRleCAzYWU0MTI4Li4zNzcxOGYwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzMyLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzMyLmMKaW5kZXggNWNhYjQ4ZS4uZTM2YmY3MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV8zMi5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfMzIuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9nZW9kZS9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL2dlb2RlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzljZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9nZW9kZS9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfQUxJWCkJCSs9IGFsaXgubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZ2VvZGUvYWxpeC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZ2VvZGUvYWxpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTk3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9nZW9kZS9hbGl4LmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBTeXN0ZW0gU3BlY2lmaWMgc2V0dXAgZm9yIFBDRW5naW5lcyBBTElYLgorICogQXQgdGhlIG1vbWVudCB0aGlzIG1lYW5zIHNldHVwIG9mIEdQSU8gY29udHJvbCBvZiBMRURzCisgKiBvbiBBbGl4LjIvMy82IGJvYXJkcy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbnN0YW50aW4gQmFyYW5vdiA8Y29uc3RAbWltYXMucnU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgRWQgV2lsZGdvb3NlIDxrZXJuZWxAd2lsZGdvb3Nlcy5jb20+CisgKgorICogVE9ETzogVGhlcmUgYXJlIGxhcmdlIHNpbWlsYXJpdGllcyB3aXRoIGxlZHMtbmV0NTUwMS5jCisgKiBieSBBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4KKyAqIEluIHRoZSBmdXR1cmUgbGVkcy1uZXQ1NTAxLmMgc2hvdWxkIGJlIG1pZ3JhdGVkIG92ZXIgdG8gcGxhdGZvcm0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8YXNtL2dlb2RlLmg+CisKK3N0YXRpYyBpbnQgZm9yY2UgPSAwOworbW9kdWxlX3BhcmFtKGZvcmNlLCBib29sLCAwNDQ0KTsKKy8qIEZJWE1FOiBBd2FyZCBiaW9zIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGFzIEFsaXggcGxhdGZvcm0gKi8KK01PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJGb3JjZSBkZXRlY3Rpb24gYXMgQUxJWC4yL0FMSVguMyBwbGF0Zm9ybSIpOworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGFsaXhfbGVkc1tdID0geworCXsKKwkJLm5hbWUgPSAiYWxpeDoxIiwKKwkJLmdwaW8gPSA2LAorCQkuZGVmYXVsdF90cmlnZ2VyID0gImRlZmF1bHQtb24iLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gImFsaXg6MiIsCisJCS5ncGlvID0gMjUsCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAiZGVmYXVsdC1vZmYiLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gImFsaXg6MyIsCisJCS5ncGlvID0gMjcsCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAiZGVmYXVsdC1vZmYiLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBhbGl4X2xlZHNfZGF0YSA9IHsKKwkubnVtX2xlZHMgPSBBUlJBWV9TSVpFKGFsaXhfbGVkcyksCisJLmxlZHMgPSBhbGl4X2xlZHMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbGl4X2xlZHNfZGV2ID0geworCS5uYW1lID0gImxlZHMtZ3BpbyIsCisJLmlkID0gLTEsCisJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmFsaXhfbGVkc19kYXRhLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHJlZ2lzdGVyX2FsaXgodm9pZCkKK3sKKwkvKiBTZXR1cCBMRUQgY29udHJvbCB0aHJvdWdoIGxlZHMtZ3BpbyBkcml2ZXIgKi8KKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmFsaXhfbGVkc19kZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhbGl4X3ByZXNlbnQodW5zaWduZWQgbG9uZyBiaW9zX3BoeXMsCisJCQkJY29uc3QgY2hhciAqYWxpeF9zaWcsCisJCQkJc2l6ZV90IGFsaXhfc2lnX2xlbikKK3sKKwljb25zdCBzaXplX3QgYmlvc19sZW4gPSAweDAwMDEwMDAwOworCWNvbnN0IGNoYXIgKmJpb3NfdmlydDsKKwljb25zdCBjaGFyICpzY2FuX2VuZDsKKwljb25zdCBjaGFyICpwOworCWNoYXIgbmFtZVs2NF07CisKKwlpZiAoZm9yY2UpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogZm9yY2VkIHRvIHNraXAgQklPUyB0ZXN0LCAiCisJCSAgICAgICAiYXNzdW1lIHN5c3RlbSBpcyBBTElYLjIvQUxJWC4zXG4iLAorCQkgICAgICAgS0JVSUxEX01PRE5BTUUpOworCQlyZXR1cm4gMTsKKwl9CisKKwliaW9zX3ZpcnQgPSBwaHlzX3RvX3ZpcnQoYmlvc19waHlzKTsKKwlzY2FuX2VuZCA9IGJpb3NfdmlydCArIGJpb3NfbGVuIC0gKGFsaXhfc2lnX2xlbiArIDIpOworCWZvciAocCA9IGJpb3NfdmlydDsgcCA8IHNjYW5fZW5kOyBwKyspIHsKKwkJY29uc3QgY2hhciAqdGFpbDsKKwkJY2hhciAqYTsKKworCQlpZiAobWVtY21wKHAsIGFsaXhfc2lnLCBhbGl4X3NpZ19sZW4pICE9IDApCisJCQljb250aW51ZTsKKworCQltZW1jcHkobmFtZSwgcCwgc2l6ZW9mKG5hbWUpKTsKKworCQkvKiByZW1vdmUgdGhlIGZpcnN0IFwwIGNoYXJhY3RlciBmcm9tIHN0cmluZyAqLworCQlhID0gc3RyY2hyKG5hbWUsICdcMCcpOworCQlpZiAoYSkKKwkJCSphID0gJyAnOworCisJCS8qIGN1dCB0aGUgc3RyaW5nIGF0IGEgbmV3bGluZSAqLworCQlhID0gc3RyY2hyKG5hbWUsICdccicpOworCQlpZiAoYSkKKwkJCSphID0gJ1wwJzsKKworCQl0YWlsID0gcCArIGFsaXhfc2lnX2xlbjsKKwkJaWYgKCh0YWlsWzBdID09ICcyJyB8fCB0YWlsWzBdID09ICczJykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHN5c3RlbSBpcyByZWNvZ25pemVkIGFzIFwiJXNcIlxuIiwKKwkJCSAgICAgICBLQlVJTERfTU9ETkFNRSwgbmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhbGl4X2luaXQodm9pZCkKK3sKKwljb25zdCBjaGFyIHRpbnliaW9zX3NpZ1tdID0gIlBDIEVuZ2luZXMgQUxJWC4iOworCWNvbnN0IGNoYXIgY29yZWJvb3Rfc2lnW10gPSAiUEMgRW5naW5lc1wwQUxJWC4iOworCisJaWYgKCFpc19nZW9kZSgpKQorCQlyZXR1cm4gMDsKKworCWlmIChhbGl4X3ByZXNlbnQoMHhmMDAwMCwgdGlueWJpb3Nfc2lnLCBzaXplb2YodGlueWJpb3Nfc2lnKSAtIDEpIHx8CisJICAgIGFsaXhfcHJlc2VudCgweDUwMCwgY29yZWJvb3Rfc2lnLCBzaXplb2YoY29yZWJvb3Rfc2lnKSAtIDEpKQorCQlyZWdpc3Rlcl9hbGl4KCk7CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoYWxpeF9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiRWQgV2lsZGdvb3NlIDxrZXJuZWxAd2lsZGdvb3Nlcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRW5naW5lcyBBTElYIFN5c3RlbSBTZXR1cCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9tcnN0LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L21yc3QuYwppbmRleCBlNjM3OTUyLi41NDEwMjBkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L21yc3QuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L21yc3QuYwpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2ludGVsX21zaWMuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tcHNwZWNfZGVmLmg+CkBAIC00ODMsNyArNDg1LDEzMCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1zaWNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBJTlRFTF9NU0lDX0lSUV9QSFlTX0JBU0UsCisJCS5lbmQJPSBJTlRFTF9NU0lDX0lSUV9QSFlTX0JBU0UgKyA2NCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX21zaWNfcGxhdGZvcm1fZGF0YSBtc2ljX3BkYXRhOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc2ljX2RldmljZSA9IHsKKwkubmFtZQkJPSAiaW50ZWxfbXNpYyIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZtc2ljX3BkYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG1zaWNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBtc2ljX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBtcnN0X2hhc19tc2ljKHZvaWQpCit7CisJcmV0dXJuIG1yc3RfaWRlbnRpZnlfY3B1KCkgPT0gTVJTVF9DUFVfQ0hJUF9QRU5XRUxMOworfQorCitzdGF0aWMgaW50IG1zaWNfc2N1X3N0YXR1c19jaGFuZ2Uoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqZGF0YSkKK3sKKwlpZiAoY29kZSA9PSBTQ1VfRE9XTikgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmbXNpY19kZXZpY2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtc2ljX2RldmljZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1zaWNfaW5pdCh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbXNpY19zY3Vfbm90aWZpZXIgPSB7CisJCS5ub3RpZmllcl9jYWxsCT0gbXNpY19zY3Vfc3RhdHVzX2NoYW5nZSwKKwl9OworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGJlIHN1cmUgdGhhdCB0aGUgU0NVIElQQyBpcyByZWFkeSBiZWZvcmUgTVNJQyBkZXZpY2UKKwkgKiBjYW4gYmUgcmVnaXN0ZXJlZC4KKwkgKi8KKwlpZiAobXJzdF9oYXNfbXNpYygpKQorCQlpbnRlbF9zY3Vfbm90aWZpZXJfYWRkKCZtc2ljX3NjdV9ub3RpZmllcik7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwobXNpY19pbml0KTsKKworLyoKKyAqIG1zaWNfZ2VuZXJpY19wbGF0Zm9ybV9kYXRhIC0gc2V0cyBnZW5lcmljIHBsYXRmb3JtIGRhdGEgZm9yIHRoZSBibG9jaworICogQGluZm86IHBvaW50ZXIgdG8gdGhlIFNGSSBkZXZpY2UgdGFibGUgZW50cnkgZm9yIHRoaXMgYmxvY2sKKyAqIEBibG9jazogTVNJQyBibG9jaworICoKKyAqIEZ1bmN0aW9uIHNldHMgSVJRIG51bWJlciBmcm9tIHRoZSBTRkkgdGFibGUgZW50cnkgZm9yIGdpdmVuIGRldmljZSB0bworICogdGhlIE1TSUMgcGxhdGZvcm0gZGF0YS4KKyAqLworc3RhdGljIHZvaWQgKm1zaWNfZ2VuZXJpY19wbGF0Zm9ybV9kYXRhKHZvaWQgKmluZm8sIGVudW0gaW50ZWxfbXNpY19ibG9jayBibG9jaykKK3sKKwlzdHJ1Y3Qgc2ZpX2RldmljZV90YWJsZV9lbnRyeSAqZW50cnkgPSBpbmZvOworCisJQlVHX09OKGJsb2NrIDwgMCB8fCBibG9jayA+PSBJTlRFTF9NU0lDX0JMT0NLX0xBU1QpOworCW1zaWNfcGRhdGEuaXJxW2Jsb2NrXSA9IGVudHJ5LT5pcnE7CisKKwlyZXR1cm4gbm9fcGxhdGZvcm1fZGF0YShpbmZvKTsKK30KKworc3RhdGljIHZvaWQgKm1zaWNfYmF0dGVyeV9wbGF0Zm9ybV9kYXRhKHZvaWQgKmluZm8pCit7CisJcmV0dXJuIG1zaWNfZ2VuZXJpY19wbGF0Zm9ybV9kYXRhKGluZm8sIElOVEVMX01TSUNfQkxPQ0tfQkFUVEVSWSk7Cit9CisKK3N0YXRpYyB2b2lkICptc2ljX2dwaW9fcGxhdGZvcm1fZGF0YSh2b2lkICppbmZvKQoreworCXN0YXRpYyBzdHJ1Y3QgaW50ZWxfbXNpY19ncGlvX3BkYXRhIHBkYXRhOworCWludCBncGlvID0gZ2V0X2dwaW9fYnlfbmFtZSgibXNpY19ncGlvX2Jhc2UiKTsKKworCWlmIChncGlvIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwZGF0YS5ncGlvX2Jhc2UgPSBncGlvOworCW1zaWNfcGRhdGEuZ3BpbyA9ICZwZGF0YTsKKworCXJldHVybiBtc2ljX2dlbmVyaWNfcGxhdGZvcm1fZGF0YShpbmZvLCBJTlRFTF9NU0lDX0JMT0NLX0dQSU8pOworfQorCitzdGF0aWMgdm9pZCAqbXNpY19hdWRpb19wbGF0Zm9ybV9kYXRhKHZvaWQgKmluZm8pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJzc3QtcGxhdGZvcm0iLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihwZGV2KSkgeworCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUgYXVkaW8gcGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG1zaWNfZ2VuZXJpY19wbGF0Zm9ybV9kYXRhKGluZm8sIElOVEVMX01TSUNfQkxPQ0tfQVVESU8pOworfQorCitzdGF0aWMgdm9pZCAqbXNpY19wb3dlcl9idG5fcGxhdGZvcm1fZGF0YSh2b2lkICppbmZvKQoreworCXJldHVybiBtc2ljX2dlbmVyaWNfcGxhdGZvcm1fZGF0YShpbmZvLCBJTlRFTF9NU0lDX0JMT0NLX1BPV0VSX0JUTik7Cit9CisKK3N0YXRpYyB2b2lkICptc2ljX29jZF9wbGF0Zm9ybV9kYXRhKHZvaWQgKmluZm8pCit7CisJc3RhdGljIHN0cnVjdCBpbnRlbF9tc2ljX29jZF9wZGF0YSBwZGF0YTsKKwlpbnQgZ3BpbyA9IGdldF9ncGlvX2J5X25hbWUoIm9jZF9ncGlvIik7CisKKwlpZiAoZ3BpbyA8IDApCisJCXJldHVybiBOVUxMOworCisJcGRhdGEuZ3BpbyA9IGdwaW87CisJbXNpY19wZGF0YS5vY2QgPSAmcGRhdGE7CisKKwlyZXR1cm4gbXNpY19nZW5lcmljX3BsYXRmb3JtX2RhdGEoaW5mbywgSU5URUxfTVNJQ19CTE9DS19PQ0QpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldnNfaWQgX19pbml0Y29uc3QgZGV2aWNlX2lkc1tdID0geworCXsiYm1hMDIzIiwgU0ZJX0RFVl9UWVBFX0kyQywgMSwgJm5vX3BsYXRmb3JtX2RhdGF9LAogCXsicG1pY19ncGlvIiwgU0ZJX0RFVl9UWVBFX1NQSSwgMSwgJnBtaWNfZ3Bpb19wbGF0Zm9ybV9kYXRhfSwKIAl7InNwaV9tYXgzMTExIiwgU0ZJX0RFVl9UWVBFX1NQSSwgMCwgJm1heDMxMTFfcGxhdGZvcm1fZGF0YX0sCiAJeyJpMmNfbWF4NzMxNSIsIFNGSV9ERVZfVFlQRV9JMkMsIDEsICZtYXg3MzE1X3BsYXRmb3JtX2RhdGF9LApAQCAtNDkxLDcgKzYxNiwxNCBAQAogCXsiZW1jMTQwMyIsIFNGSV9ERVZfVFlQRV9JMkMsIDEsICZlbWMxNDAzX3BsYXRmb3JtX2RhdGF9LAogCXsiaTJjX2FjY2VsIiwgU0ZJX0RFVl9UWVBFX0kyQywgMCwgJmxpczMzMWRsX3BsYXRmb3JtX2RhdGF9LAogCXsicG1pY19hdWRpbyIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZub19wbGF0Zm9ybV9kYXRhfSwKLQl7Im1zaWNfYXVkaW8iLCBTRklfREVWX1RZUEVfSVBDLCAxLCAmbm9fcGxhdGZvcm1fZGF0YX0sCisKKwkvKiBNU0lDIHN1YmRldmljZXMgKi8KKwl7Im1zaWNfYmF0dGVyeSIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZtc2ljX2JhdHRlcnlfcGxhdGZvcm1fZGF0YX0sCisJeyJtc2ljX2dwaW8iLCBTRklfREVWX1RZUEVfSVBDLCAxLCAmbXNpY19ncGlvX3BsYXRmb3JtX2RhdGF9LAorCXsibXNpY19hdWRpbyIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZtc2ljX2F1ZGlvX3BsYXRmb3JtX2RhdGF9LAorCXsibXNpY19wb3dlcl9idG4iLCBTRklfREVWX1RZUEVfSVBDLCAxLCAmbXNpY19wb3dlcl9idG5fcGxhdGZvcm1fZGF0YX0sCisJeyJtc2ljX29jZCIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZtc2ljX29jZF9wbGF0Zm9ybV9kYXRhfSwKKwogCXt9LAogfTsKIApAQCAtNTU4LDYgKzY5MCw5IEBACiAJaTJjX2RldnNbaTJjX25leHRfZGV2KytdID0gbmV3X2RldjsKIH0KIAorQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChpbnRlbF9zY3Vfbm90aWZpZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfc2N1X25vdGlmaWVyKTsKKwogLyogQ2FsbGVkIGJ5IElQQyBkcml2ZXIgKi8KIHZvaWQgaW50ZWxfc2N1X2RldmljZXNfY3JlYXRlKHZvaWQpCiB7CkBAIC01ODIsNiArNzE3LDcgQEAKIAkJfSBlbHNlCiAJCQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbyhpMmNfYnVzW2ldLCBpMmNfZGV2c1tpXSwgMSk7CiAJfQorCWludGVsX3NjdV9ub3RpZmllcl9wb3N0KFNDVV9BVkFJTEFCTEUsIDBMKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGludGVsX3NjdV9kZXZpY2VzX2NyZWF0ZSk7CiAKQEAgLTU5MCw2ICs3MjYsOCBAQAogewogCWludCBpOwogCisJaW50ZWxfc2N1X25vdGlmaWVyX3Bvc3QoU0NVX0RPV04sIDBMKTsKKwogCWZvciAoaSA9IDA7IGkgPCBpcGNfbmV4dF9kZXY7IGkrKykKIAkJcGxhdGZvcm1fZGV2aWNlX2RlbChpcGNfZGV2c1tpXSk7CiB9CkBAIC02MDYsMTkgKzc0NCwzNyBAQAogCXBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2ZpX2hhbmRsZV9pcGNfZGV2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBfX2luaXQgc2ZpX2hhbmRsZV9pcGNfZGV2KHN0cnVjdCBzZmlfZGV2aWNlX3RhYmxlX2VudHJ5ICplbnRyeSkKIHsKIAljb25zdCBzdHJ1Y3QgZGV2c19pZCAqZGV2ID0gZGV2aWNlX2lkczsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXZvaWQgKnBkYXRhID0gTlVMTDsKIAogCXdoaWxlIChkZXYtPm5hbWVbMF0pIHsKIAkJaWYgKGRldi0+dHlwZSA9PSBTRklfREVWX1RZUEVfSVBDICYmCi0JCQkhc3RybmNtcChkZXYtPm5hbWUsIHBkZXYtPm5hbWUsIFNGSV9OQU1FX0xFTikpIHsKLQkJCXBkYXRhID0gZGV2LT5nZXRfcGxhdGZvcm1fZGF0YShwZGV2KTsKKwkJCSFzdHJuY21wKGRldi0+bmFtZSwgZW50cnktPm5hbWUsIFNGSV9OQU1FX0xFTikpIHsKKwkJCXBkYXRhID0gZGV2LT5nZXRfcGxhdGZvcm1fZGF0YShlbnRyeSk7CiAJCQlicmVhazsKIAkJfQogCQlkZXYrKzsKIAl9CisKKwkvKgorCSAqIE9uIE1lZGZpZWxkIHRoZSBwbGF0Zm9ybSBkZXZpY2UgY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgTVNJQworCSAqIE1GRCBkcml2ZXIgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBpdCBoZXJlLgorCSAqLworCWlmIChtcnN0X2hhc19tc2ljKCkpCisJCXJldHVybjsKKworCS8qIElEIGFzIElSUSBpcyBhIGhhY2sgdGhhdCB3aWxsIGdvIGF3YXkgKi8KKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKGVudHJ5LT5uYW1lLCBlbnRyeS0+aXJxKTsKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCXByX2Vycigib3V0IG9mIG1lbW9yeSBmb3IgU0ZJIHBsYXRmb3JtIGRldmljZSAnJXMnLlxuIiwKKwkJCWVudHJ5LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlpbnN0YWxsX2lycV9yZXNvdXJjZShwZGV2LCBlbnRyeS0+aXJxKTsKKwogCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CiAJaW50ZWxfc2N1X2RldmljZV9yZWdpc3RlcihwZGV2KTsKIH0KQEAgLTY3MSw3ICs4MjcsNiBAQAogCXN0cnVjdCBzZmlfZGV2aWNlX3RhYmxlX2VudHJ5ICpwZW50cnk7CiAJc3RydWN0IHNwaV9ib2FyZF9pbmZvIHNwaV9pbmZvOwogCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfaW5mbzsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCWludCBudW0sIGksIGJ1czsKIAlpbnQgaW9hcGljOwogCXN0cnVjdCBpb19hcGljX2lycV9hdHRyIGlycV9hdHRyOwpAQCAtNjk5LDE3ICs4NTQsOSBAQAogCiAJCXN3aXRjaCAocGVudHJ5LT50eXBlKSB7CiAJCWNhc2UgU0ZJX0RFVl9UWVBFX0lQQzoKLQkJCS8qIElEIGFzIElSUSBpcyBhIGhhY2sgdGhhdCB3aWxsIGdvIGF3YXkgKi8KLQkJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MocGVudHJ5LT5uYW1lLCBpcnEpOwotCQkJaWYgKHBkZXYgPT0gTlVMTCkgewotCQkJCXByX2Vycigib3V0IG9mIG1lbW9yeSBmb3IgU0ZJIHBsYXRmb3JtIGRldmljZSAnJXMnLlxuIiwKLQkJCQkJCQlwZW50cnktPm5hbWUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaW5zdGFsbF9pcnFfcmVzb3VyY2UocGRldiwgaXJxKTsKIAkJCXByX2RlYnVnKCJpbmZvWyUyZF06IElQQyBidXMsIG5hbWUgPSAlMTYuMTZzLCAiCi0JCQkJImlycSA9IDB4JTJ4XG4iLCBpLCBwZW50cnktPm5hbWUsIGlycSk7Ci0JCQlzZmlfaGFuZGxlX2lwY19kZXYocGRldik7CisJCQkJImlycSA9IDB4JTJ4XG4iLCBpLCBwZW50cnktPm5hbWUsIHBlbnRyeS0+aXJxKTsKKwkJCXNmaV9oYW5kbGVfaXBjX2RldihwZW50cnkpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0ZJX0RFVl9UWVBFX1NQSToKIAkJCW1lbXNldCgmc3BpX2luZm8sIDAsIHNpemVvZihzcGlfaW5mbykpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9wbXUuYyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LmMKaW5kZXggOTI4MWRhNy4uYzBhYzA2ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9wbXUuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS5jCkBAIC03MCw3ICs3MCw3IEBACiAvKiAyNCAqLyB7IDB4NDExMCwgMCB9LAkJCS8qIExpbmNyb2Z0ICovCiB9OwogCi0vKiBuLmIuIFdlIGlnbm9yZSBQQ0ktaWQgMHg4MTUgaW4gTFNTOSBiL2MgTWVlR28gaGFzIG5vIGRyaXZlciBmb3IgaXQgKi8KKy8qIG4uYi4gV2UgaWdub3JlIFBDSS1pZCAweDgxNSBpbiBMU1M5IGIvYyBMaW51eCBoYXMgbm8gZHJpdmVyIGZvciBpdCAqLwogc3RhdGljIHUxNiBtcnN0X2xzczlfcGNpX2lkc1tdID0gezB4MDgwYSwgMHgwODE0LCAwfTsKIHN0YXRpYyB1MTYgbXJzdF9sc3MxMF9wY2lfaWRzW10gPSB7MHgwODAwLCAweDA4MDEsIDB4MDgwMiwgMHgwODAzLAogCQkJCQkweDA4MDQsIDB4MDgwNSwgMHgwODBmLCAwfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvdnJ0Yy5jIGIvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC92cnRjLmMKaW5kZXggNmQ1ZGJjZC4uMjI1YmQwZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC92cnRjLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC92cnRjLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtNzUsOCArNzYsOCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKIAotCS8qIHZSVEMgWUVBUiByZWcgY29udGFpbnMgdGhlIG9mZnNldCB0byAxOTYwICovCi0JeWVhciArPSAxOTYwOworCS8qIHZSVEMgWUVBUiByZWcgY29udGFpbnMgdGhlIG9mZnNldCB0byAxOTcyICovCisJeWVhciArPSAxOTcyOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAidlJUQzogc2VjOiAlZCBtaW46ICVkIGhvdXI6ICVkIGRheTogJWQgIgogCQkibW9uOiAlZCB5ZWFyOiAlZFxuIiwgc2VjLCBtaW4sIGhvdXIsIG1kYXksIG1vbiwgeWVhcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLXBtLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLXBtLmMKaW5kZXggNmYzODU1YS4uMGNlODYxNmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwYy14bzEtcG0uYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLXBtLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NzNTUzNS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS91di9iaW9zX3V2LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS91di9iaW9zX3V2LmMKaW5kZXggOGJjNTdiYS4uNzY2NjEyMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vdXYvYmlvc191di5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL3V2L2Jpb3NfdXYuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vdXYvYmlvcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS91di90bGJfdXYuYwppbmRleCBkYjhiOTE1Li41YjU1MjE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS91di90bGJfdXYuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS91di90bGJfdXYuYwpAQCAtMTE1LDkgKzExNSw2IEBACiAKIC8qIGJhc2UgcG5vZGUgaW4gdGhpcyBwYXJ0aXRpb24gKi8KIHN0YXRpYyBpbnQgdXZfYmFzZV9wbm9kZSBfX3JlYWRfbW9zdGx5OwotLyogcG9zaXRpb24gb2YgcG5vZGUgKHdoaWNoIGlzIG5hc2lkPj4xKTogKi8KLXN0YXRpYyBpbnQgdXZfbnNoaWZ0IF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyB1dl9tbWFzayBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHB0Y19zdGF0cywgcHRjc3RhdHMpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBiYXVfY29udHJvbCwgYmF1X2NvbnRyb2wpOwpAQCAtMTQzNSw3ICsxNDMyLDcgQEAKIHsKIAlpbnQgaTsKIAlpbnQgY3B1OwotCXVuc2lnbmVkIGxvbmcgcGE7CisJdW5zaWduZWQgbG9uZyBncGE7CiAJdW5zaWduZWQgbG9uZyBtOwogCXVuc2lnbmVkIGxvbmcgbjsKIAlzaXplX3QgZHNpemU7CkBAIC0xNDUxLDkgKzE0NDgsOSBAQAogCWJhdV9kZXNjID0ga21hbGxvY19ub2RlKGRzaXplLCBHRlBfS0VSTkVMLCBub2RlKTsKIAlCVUdfT04oIWJhdV9kZXNjKTsKIAotCXBhID0gdXZfZ3BhKGJhdV9kZXNjKTsgLyogbmVlZCB0aGUgcmVhbCBuYXNpZCovCi0JbiA9IHBhID4+IHV2X25zaGlmdDsKLQltID0gcGEgJiB1dl9tbWFzazsKKwlncGEgPSB1dl9ncGEoYmF1X2Rlc2MpOworCW4gPSB1dl9ncGFfdG9fZ25vZGUoZ3BhKTsKKwltID0gdXZfZ3BhX3RvX29mZnNldChncGEpOwogCiAJLyogdGhlIDE0LWJpdCBwbm9kZSAqLwogCXdyaXRlX21tcl9kZXNjcmlwdG9yX2Jhc2UocG5vZGUsIChuIDw8IFVWX0RFU0NfUFNISUZUIHwgbSkpOwpAQCAtMTUyNSw5ICsxNTIyLDkgQEAKIAkJYmNwLT5xdWV1ZV9sYXN0CQk9IHBxcCArIChERVNUX1FfU0laRSAtIDEpOwogCX0KIAkvKgotCSAqIG5lZWQgdGhlIHBub2RlIG9mIHdoZXJlIHRoZSBtZW1vcnkgd2FzIHJlYWxseSBhbGxvY2F0ZWQKKwkgKiBuZWVkIHRoZSBnbm9kZSBvZiB3aGVyZSB0aGUgbWVtb3J5IHdhcyByZWFsbHkgYWxsb2NhdGVkCiAJICovCi0JcG4gPSB1dl9ncGEocHFwKSA+PiB1dl9uc2hpZnQ7CisJcG4gPSB1dl9ncGFfdG9fZ25vZGUodXZfZ3BhKHBxcCkpOwogCWZpcnN0ID0gdXZfcGh5c25vZGVhZGRyKHBxcCk7CiAJcG5fZmlyc3QgPSAoKHVuc2lnbmVkIGxvbmcpcG4gPDwgVVZfUEFZTE9BRFFfUE5PREVfU0hJRlQpIHwgZmlyc3Q7CiAJbGFzdCA9IHV2X3BoeXNub2RlYWRkcihwcXAgKyAoREVTVF9RX1NJWkUgLSAxKSk7CkBAIC0xODM3LDggKzE4MzQsNiBAQAogCQl6YWxsb2NfY3B1bWFza192YXJfbm9kZShtYXNrLCBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjdXJfY3B1KSk7CiAJfQogCi0JdXZfbnNoaWZ0ID0gdXZfaHViX2luZm8tPm1fdmFsOwotCXV2X21tYXNrID0gKDFVTCA8PCB1dl9odWJfaW5mby0+bV92YWwpIC0gMTsKIAludXZodWJzID0gdXZfbnVtX3Bvc3NpYmxlX2JsYWRlcygpOwogCXNwaW5fbG9ja19pbml0KCZkaXNhYmxlX2xvY2spOwogCWNvbmdlc3RlZF9jeWNsZXMgPSB1c2VjXzJfY3ljbGVzKGNvbmdlc3RlZF9yZXNwbnNfdXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcG93ZXIvY3B1LmMgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwppbmRleCA4N2JiMzVlLi5mMTBjMGFmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wb3dlci9jcHUuYworKysgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL0tjb25maWcgYi9hcmNoL3g4Ni91bS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTdiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9LY29uZmlnCkBAIC0wLDAgKzEsNjcgQEAKK21haW5tZW51ICJVc2VyIE1vZGUgTGludXgvJFNVQkFSQ0ggJEtFUk5FTFZFUlNJT04gS2VybmVsIENvbmZpZ3VyYXRpb24iCisKK3NvdXJjZSAiYXJjaC91bS9LY29uZmlnLmNvbW1vbiIKKworbWVudSAiVU1MLXNwZWNpZmljIG9wdGlvbnMiCisKK21lbnUgIkhvc3QgcHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgorCitjb25maWcgQ01QWENIR19MT0NBTAorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIENNUFhDSEdfRE9VQkxFCisJYm9vbAorCWRlZmF1bHQgbgorCitzb3VyY2UgImFyY2gveDg2L0tjb25maWcuY3B1IgorCitlbmRtZW51CisKK2NvbmZpZyBVTUxfWDg2CisJZGVmX2Jvb2wgeQorCXNlbGVjdCBHRU5FUklDX0ZJTkRfRklSU1RfQklUCisKK2NvbmZpZyA2NEJJVAorCWJvb2wKKwlkZWZhdWx0IFNVQkFSQ0ggPSAieDg2XzY0IgorCitjb25maWcgWDg2XzMyCisJZGVmX2Jvb2wgITY0QklUCisJc2VsZWN0IEhBVkVfQU9VVAorCitjb25maWcgWDg2XzY0CisJZGVmX2Jvb2wgNjRCSVQKKworY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCisJZGVmX2Jvb2wgWDg2X1hBREQgJiYgNjRCSVQKKworY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKKwlkZWZfYm9vbCAhUldTRU1fWENIR0FERF9BTEdPUklUSE0KKworY29uZmlnIDNfTEVWRUxfUEdUQUJMRVMKKwlib29sICJUaHJlZS1sZXZlbCBwYWdldGFibGVzIChFWFBFUklNRU5UQUwpIiBpZiAhNjRCSVQKKwlkZWZhdWx0IDY0QklUCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJVGhyZWUtbGV2ZWwgcGFnZXRhYmxlcyB3aWxsIGxldCBVTUwgaGF2ZSBtb3JlIHRoYW4gNEcgb2YgcGh5c2ljYWwKKwltZW1vcnkuICBBbGwgdGhlIG1lbW9yeSB0aGF0IGNhbid0IGJlIG1hcHBlZCBkaXJlY3RseSB3aWxsIGJlIHRyZWF0ZWQKKwlhcyBoaWdoIG1lbW9yeS4KKworCUhvd2V2ZXIsIHRoaXMgaXQgZXhwZXJpbWVudGFsIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLCBzbyBpZiB1bnN1cmUgc2F5CisJTiAob24geDg2LTY0IGl0J3MgYXV0b21hdGljYWxseSBlbmFibGVkLCBpbnN0ZWFkLCBhcyBpdCdzIHNhZmUgdGhlcmUpLgorCitjb25maWcgQVJDSF9IQVNfU0NfU0lHTkFMUworCWRlZl9ib29sICE2NEJJVAorCitjb25maWcgQVJDSF9SRVVTRV9IT1NUX1ZTWVNDQUxMX0FSRUEKKwlkZWZfYm9vbCAhNjRCSVQKKworY29uZmlnIEdFTkVSSUNfSFdFSUdIVAorCWRlZl9ib29sIHkKKworc291cmNlICJhcmNoL3VtL0tjb25maWcudW0iCisKK2VuZG1lbnUKKworc291cmNlICJhcmNoL3VtL0tjb25maWcucmVzdCIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL01ha2VmaWxlIGIvYXJjaC94ODYvdW0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiNTg0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL01ha2VmaWxlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisjCisKK2lmZXEgKCQoQ09ORklHX1g4Nl8zMikseSkKKwlCSVRTIDo9IDMyCitlbHNlCisJQklUUyA6PSA2NAorZW5kaWYKKworb2JqLXkgPSBidWcubyBidWdzXyQoQklUUykubyBkZWxheS5vIGZhdWx0Lm8ga3N5bXMubyBsZHQubyBcCisJcHRyYWNlXyQoQklUUykubyBwdHJhY2VfdXNlci5vIHNldGptcF8kKEJJVFMpLm8gc2lnbmFsLm8gXAorCXN0dWJfJChCSVRTKS5vIHN0dWJfc2Vndi5vIHN5c2NhbGxzXyQoQklUUykubyBcCisJc3lzX2NhbGxfdGFibGVfJChCSVRTKS5vIHN5c3JxXyQoQklUUykubyB0bHNfJChCSVRTKS5vIFwKKwltZW1fJChCSVRTKS5vIHN1YmFyY2gubyBvcy0kKE9TKS8KKworaWZlcSAoJChDT05GSUdfWDg2XzMyKSx5KQorCitvYmoteSArPSBjaGVja3N1bV8zMi5vCitvYmotJChDT05GSUdfQklORk1UX0VMRikgKz0gZWxmY29yZS5vCisKK3N1YmFyY2gteSA9IC4uL2xpYi9zdHJpbmdfMzIubyAuLi9saWIvYXRvbWljNjRfMzIubyAuLi9saWIvYXRvbWljNjRfY3g4XzMyLm8KK3N1YmFyY2gtJChDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0pICs9IC4uL2xpYi9yd3NlbS5vCitzdWJhcmNoLSQoQ09ORklHX0hJR0hNRU0pICs9IC4uL21tL2hpZ2htZW1fMzIubworCitlbHNlCisKK29iai15ICs9IHZkc28vCisKK3N1YmFyY2gteSA9IC4uL2xpYi9jc3VtLXBhcnRpYWxfNjQubyAuLi9saWIvbWVtY3B5XzY0Lm8gLi4vbGliL3RodW5rXzY0Lm8gXAorCQkuLi9saWIvcndzZW0ubworCitlbmRpZgorCitzdWJhcmNoLSQoQ09ORklHX01PRFVMRVMpICs9IC4uL2tlcm5lbC9tb2R1bGUubworCitVU0VSX09CSlMgOj0gYnVnc18kKEJJVFMpLm8gcHRyYWNlX3VzZXIubyBmYXVsdC5vCisKK2V4dHJhLXkgKz0gdXNlci1vZmZzZXRzLnMKKyQob2JqKS91c2VyLW9mZnNldHMuczogY19mbGFncyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKFVTRVJfQ0ZMQUdTKQorCitVTlBST0ZJTEVfT0JKUyA6PSBzdHViX3NlZ3YubworQ0ZMQUdTX3N0dWJfc2Vndi5vIDo9ICQoQ0ZMQUdTX05PX0hBUkRFTklORykKKworaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vYXBpYy5oIGIvYXJjaC94ODYvdW0vYXNtL2FwaWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9hcGljLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9hcGljLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vYXJjaF9od2VpZ2h0LmggYi9hcmNoL3g4Ni91bS9hc20vYXJjaF9od2VpZ2h0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vYXJjaF9od2VpZ2h0LmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9hcmNoX2h3ZWlnaHQuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL2FyY2hwYXJhbS5oIGIvYXJjaC94ODYvdW0vYXNtL2FyY2hwYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2NmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9hc20vYXJjaHBhcmFtLmgKQEAgLTAsMCArMSwyMCBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDAzIEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisgKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fVU1fQVJDSFBBUkFNX0gKKyNkZWZpbmUgX19VTV9BUkNIUEFSQU1fSAorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKyNkZWZpbmUgTEFTVF9QS01BUCA1MTIKKyNlbHNlCisjZGVmaW5lIExBU1RfUEtNQVAgMTAyNAorI2VuZGlmCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9jaGVja3N1bS5oIGIvYXJjaC94ODYvdW0vYXNtL2NoZWNrc3VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlZmUyMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9jaGVja3N1bS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19VTV9DSEVDS1NVTV9ICisjZGVmaW5lIF9fVU1fQ0hFQ0tTVU1fSAorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorIyBpbmNsdWRlICJjaGVja3N1bV8zMi5oIgorI2Vsc2UKKyMgaW5jbHVkZSAiY2hlY2tzdW1fNjQuaCIKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9jaGVja3N1bV8zMi5oIGIvYXJjaC94ODYvdW0vYXNtL2NoZWNrc3VtXzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhYjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9jaGVja3N1bV8zMi5oCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19VTV9TWVNERVBfQ0hFQ0tTVU1fSAorI2RlZmluZSBfX1VNX1NZU0RFUF9DSEVDS1NVTV9ICisKKyNpbmNsdWRlICJsaW51eC9pbjYuaCIKKyNpbmNsdWRlICJsaW51eC9zdHJpbmcuaCIKKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAorICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKKyAqCisgKiByZXR1cm5zIGEgMzItYml0IG51bWJlciBzdWl0YWJsZSBmb3IgZmVlZGluZyBpbnRvIGl0c2VsZgorICogb3IgY3N1bV90Y3B1ZHBfbWFnaWMKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLCBleGNlcHQKKyAqIGZvciB0aGUgbGFzdCBmcmFnbWVudCwgd2hpY2ggbWF5IGJlIG9kZAorICoKKyAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQorICovCitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOworCisvKgorICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQorICoJcGFzc2VkIGluIGFuIGluY29ycmVjdCBrZXJuZWwgYWRkcmVzcyB0byBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLgorICoKKyAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlCisgKglhY2Nlc3Nfb2soKS4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pCit7CisJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7Cit9CisKKy8qCisgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKKyAqIGNoZWNrc3VtcywgYW5kIGhhbmRsZXMgdXNlci1zcGFjZSBwb2ludGVyIGV4Y2VwdGlvbnMgY29ycmVjdGx5LCB3aGVuIG5lZWRlZC4KKyAqCisgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KKyAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CisgKi8KKworc3RhdGljIF9faW5saW5lX18KK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQoreworCWlmIChjb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbGVuKSkgeworCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CisJCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7CisJfQorCisJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKK30KKworLyoKKyAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKKyAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCisgKgorICoJQnkgSm9yZ2UgQ3dpayA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+LCBhZGFwdGVkIGZvciBsaW51eCBieQorICoJQXJudCBHdWxicmFuZHNlbi4KKyAqLworc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCit7CisJdW5zaWduZWQgaW50IHN1bTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSAgICAibW92bCAoJTEpLCAlMAk7XG4iCisJICAgICJzdWJsICQ0LCAlMgk7XG4iCisJICAgICJqYmUgMmYJCTtcbiIKKwkgICAgImFkZGwgNCglMSksICUwCTtcbiIKKwkgICAgImFkY2wgOCglMSksICUwCTtcbiIKKwkgICAgImFkY2wgMTIoJTEpLCAlMAk7XG4iCisiMToJICAgIGFkY2wgMTYoJTEpLCAlMAk7XG4iCisJICAgICJsZWEgNCglMSksICUxCTtcbiIKKwkgICAgImRlY2wgJTIJCTtcbiIKKwkgICAgImpuZSAxYgkJO1xuIgorCSAgICAiYWRjbCAkMCwgJTAJO1xuIgorCSAgICAibW92bCAlMCwgJTIJO1xuIgorCSAgICAic2hybCAkMTYsICUwCTtcbiIKKwkgICAgImFkZHcgJXcyLCAldzAJO1xuIgorCSAgICAiYWRjbCAkMCwgJTAJO1xuIgorCSAgICAibm90bCAlMAkJO1xuIgorIjI6CQkJCTtcbiIKKwkvKiBTaW5jZSB0aGUgaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBsb2FkZWQgd2l0aCBpcGggYW5kIGlwbAorCSAgIGFyZSBtb2RpZmllZCwgd2UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlbSBhcyBvdXRwdXRzLCBvciBnY2MKKwkgICB3aWxsIGFzc3VtZSB0aGV5IGNvbnRhaW4gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLiAqLworCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKQorCTogIjEiIChpcGgpLCAiMiIgKGlobCkKKwk6ICJtZW1vcnkiKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07Cit9CisKKy8qCisgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQorICovCisKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKK3sKKwlfX2FzbV9fKAorCQkiYWRkbCAlMSwgJTAJCTtcbiIKKwkJImFkY2wgJDB4ZmZmZiwgJTAJO1xuIgorCQk6ICI9ciIgKHN1bSkKKwkJOiAiciIgKChfX2ZvcmNlIHUzMilzdW0gPDwgMTYpLAorCQkgICIwIiAoKF9fZm9yY2UgdTMyKXN1bSAmIDB4ZmZmZjAwMDApCisJKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOworfQorCitzdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCit7CisgICAgX19hc21fXygKKwkiYWRkbCAlMSwgJTAJO1xuIgorCSJhZGNsICUyLCAlMAk7XG4iCisJImFkY2wgJTMsICUwCTtcbiIKKwkiYWRjbCAkMCwgJTAJO1xuIgorCTogIj1yIiAoc3VtKQorCTogImciIChkYWRkciksICJnIihzYWRkciksICJnIigobGVuICsgcHJvdG8pIDw8IDgpLCAiMCIoc3VtKSk7CisgICAgcmV0dXJuIHN1bTsKK30KKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCisgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAorICovCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCit7CisJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQorICogaW4gaWNtcC5jCisgKi8KKworc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQoreworICAgIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKK30KKworI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCSAgX193c3VtIHN1bSkKK3sKKwlfX2FzbV9fKAorCQkiYWRkbCAwKCUxKSwgJTAJCTtcbiIKKwkJImFkY2wgNCglMSksICUwCQk7XG4iCisJCSJhZGNsIDgoJTEpLCAlMAkJO1xuIgorCQkiYWRjbCAxMiglMSksICUwCTtcbiIKKwkJImFkY2wgMCglMiksICUwCQk7XG4iCisJCSJhZGNsIDQoJTIpLCAlMAkJO1xuIgorCQkiYWRjbCA4KCUyKSwgJTAJCTtcbiIKKwkJImFkY2wgMTIoJTIpLCAlMAk7XG4iCisJCSJhZGNsICUzLCAlMAkJO1xuIgorCQkiYWRjbCAlNCwgJTAJCTtcbiIKKwkJImFkY2wgJDAsICUwCQk7XG4iCisJCTogIj0mciIgKHN1bSkKKwkJOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksCisJCSAgInIiKGh0b25sKGxlbikpLCAiciIoaHRvbmwocHJvdG8pKSwgIjAiKHN1bSkpOworCisJcmV0dXJuIGNzdW1fZm9sZChzdW0pOworfQorCisvKgorICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgorICovCisjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKK3N0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLAorCQkJCQkJICAgICB2b2lkIF9fdXNlciAqZHN0LAorCQkJCQkJICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkgeworCQlpZiAoY29weV90b191c2VyKGRzdCwgc3JjLCBsZW4pKSB7CisJCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOworCQl9CisKKwkJcmV0dXJuIGNzdW1fcGFydGlhbChzcmMsIGxlbiwgc3VtKTsKKwl9CisKKwlpZiAobGVuKQorCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9jaGVja3N1bS5oIGIvYXJjaC94ODYvdW0vYXNtL2NoZWNrc3VtXzY0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2NoZWNrc3VtLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9jaGVja3N1bV82NC5oCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2Rlc2MuaCBiL2FyY2gveDg2L3VtL2FzbS9kZXNjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vZGVzYy5oCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9hc20vZGVzYy5oCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9hc20vZWxmLmggYi9hcmNoL3g4Ni91bS9hc20vZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiMDYzMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9lbGYuaApAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisjaWZuZGVmIF9fVU1fRUxGX1g4Nl9ICisjZGVmaW5lIF9fVU1fRUxGX1g4Nl9ICisKKyNpbmNsdWRlIDxhc20vdXNlci5oPgorI2luY2x1ZGUgInNrYXMuaCIKKworI2lmZGVmIENPTkZJR19YODZfMzIKKworI2RlZmluZSBSXzM4Nl9OT05FCTAKKyNkZWZpbmUgUl8zODZfMzIJMQorI2RlZmluZSBSXzM4Nl9QQzMyCTIKKyNkZWZpbmUgUl8zODZfR09UMzIJMworI2RlZmluZSBSXzM4Nl9QTFQzMgk0CisjZGVmaW5lIFJfMzg2X0NPUFkJNQorI2RlZmluZSBSXzM4Nl9HTE9CX0RBVAk2CisjZGVmaW5lIFJfMzg2X0pNUF9TTE9UCTcKKyNkZWZpbmUgUl8zODZfUkVMQVRJVkUJOAorI2RlZmluZSBSXzM4Nl9HT1RPRkYJOQorI2RlZmluZSBSXzM4Nl9HT1RQQwkxMAorI2RlZmluZSBSXzM4Nl9OVU0JMTEKKworLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCisgKi8KKyNkZWZpbmUgZWxmX2NoZWNrX2FyY2goeCkgXAorCSgoKHgpLT5lX21hY2hpbmUgPT0gRU1fMzg2KSB8fCAoKHgpLT5lX21hY2hpbmUgPT0gRU1fNDg2KSkKKworI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1MzMgorI2RlZmluZSBFTEZfREFUQSAgICAgICAgRUxGREFUQTJMU0IKKyNkZWZpbmUgRUxGX0FSQ0ggICAgICAgIEVNXzM4NgorCisjZGVmaW5lIEVMRl9QTEFUX0lOSVQocmVncywgbG9hZF9hZGRyKSBkbyB7IFwKKwlQVF9SRUdTX0VCWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VDWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VEWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VTSShyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VESShyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VCUChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VBWChyZWdzKSA9IDA7IFwKK30gd2hpbGUgKDApCisKKy8qIFNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIGluY2x1ZGUvYXNtLWkzODYvZWxmLmggKi8KKworI2RlZmluZSBFTEZfQ09SRV9DT1BZX1JFR1MocHJfcmVnLCByZWdzKSBkbyB7CVwKKwlwcl9yZWdbMF0gPSBQVF9SRUdTX0VCWChyZWdzKTsJCVwKKwlwcl9yZWdbMV0gPSBQVF9SRUdTX0VDWChyZWdzKTsJCVwKKwlwcl9yZWdbMl0gPSBQVF9SRUdTX0VEWChyZWdzKTsJCVwKKwlwcl9yZWdbM10gPSBQVF9SRUdTX0VTSShyZWdzKTsJCVwKKwlwcl9yZWdbNF0gPSBQVF9SRUdTX0VESShyZWdzKTsJCVwKKwlwcl9yZWdbNV0gPSBQVF9SRUdTX0VCUChyZWdzKTsJCVwKKwlwcl9yZWdbNl0gPSBQVF9SRUdTX0VBWChyZWdzKTsJCVwKKwlwcl9yZWdbN10gPSBQVF9SRUdTX0RTKHJlZ3MpOwkJXAorCXByX3JlZ1s4XSA9IFBUX1JFR1NfRVMocmVncyk7CQlcCisJLyogZmFrZSBvbmNlIHVzZWQgZnMgYW5kIGdzIHNlbGVjdG9ycz8gKi8JXAorCXByX3JlZ1s5XSA9IFBUX1JFR1NfRFMocmVncyk7CQlcCisJcHJfcmVnWzEwXSA9IFBUX1JFR1NfRFMocmVncyk7CQlcCisJcHJfcmVnWzExXSA9IFBUX1JFR1NfU1lTQ0FMTF9OUihyZWdzKTsJXAorCXByX3JlZ1sxMl0gPSBQVF9SRUdTX0lQKHJlZ3MpOwkJXAorCXByX3JlZ1sxM10gPSBQVF9SRUdTX0NTKHJlZ3MpOwkJXAorCXByX3JlZ1sxNF0gPSBQVF9SRUdTX0VGTEFHUyhyZWdzKTsJXAorCXByX3JlZ1sxNV0gPSBQVF9SRUdTX1NQKHJlZ3MpOwkJXAorCXByX3JlZ1sxNl0gPSBQVF9SRUdTX1NTKHJlZ3MpOwkJXAorfSB3aGlsZSAoMCk7CisKK2V4dGVybiBjaGFyICogZWxmX2F1eF9wbGF0Zm9ybTsKKyNkZWZpbmUgRUxGX1BMQVRGT1JNIChlbGZfYXV4X3BsYXRmb3JtKQorCitleHRlcm4gdW5zaWduZWQgbG9uZyB2c3lzY2FsbF9laGRyOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdnN5c2NhbGxfZW5kOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19rZXJuZWxfdnN5c2NhbGw7CisKKy8qCisgKiBUaGlzIGlzIHRoZSByYW5nZSB0aGF0IGlzIHJlYWRhYmxlIGJ5IHVzZXIgbW9kZSwgYW5kIHRoaW5ncworICogYWN0aW5nIGxpa2UgdXNlciBtb2RlIHN1Y2ggYXMgZ2V0X3VzZXJfcGFnZXMuCisgKi8KKyNkZWZpbmUgRklYQUREUl9VU0VSX1NUQVJUICAgICAgdnN5c2NhbGxfZWhkcgorI2RlZmluZSBGSVhBRERSX1VTRVJfRU5EICAgICAgICB2c3lzY2FsbF9lbmQKKworCisvKgorICogQXJjaGl0ZWN0dXJlLW5ldXRyYWwgQVRfIHZhbHVlcyBpbiAwLTE3LCBsZWF2ZSBzb21lIHJvb20KKyAqIGZvciBtb3JlIG9mIHRoZW0sIHN0YXJ0IHRoZSB4ODYtc3BlY2lmaWMgb25lcyBhdCAzMi4KKyAqLworI2RlZmluZSBBVF9TWVNJTkZPCQkzMgorI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJCTMzCisKKyNkZWZpbmUgQVJDSF9ETElORk8JCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKCB2c3lzY2FsbF9laGRyICkgewkJCQkJXAorCQlORVdfQVVYX0VOVChBVF9TWVNJTkZPLAlfX2tlcm5lbF92c3lzY2FsbCk7CVwKKwkJTkVXX0FVWF9FTlQoQVRfU1lTSU5GT19FSERSLCB2c3lzY2FsbF9laGRyKTsJXAorCX0JCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2Vsc2UKKworLyogeDg2LTY0IHJlbG9jYXRpb24gdHlwZXMsIHRha2VuIGZyb20gYXNtLXg4Nl82NC9lbGYuaCAqLworI2RlZmluZSBSX1g4Nl82NF9OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfWDg2XzY0XzY0CQkxCS8qIERpcmVjdCA2NCBiaXQgICovCisjZGVmaW5lIFJfWDg2XzY0X1BDMzIJCTIJLyogUEMgcmVsYXRpdmUgMzIgYml0IHNpZ25lZCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1QzMgkJMwkvKiAzMiBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X1BMVDMyCQk0CS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSX1g4Nl82NF9DT1BZCQk1CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl9YODZfNjRfR0xPQl9EQVQJNgkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X0pVTVBfU0xPVAk3CS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfUkVMQVRJVkUJOAkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFBDUkVMCTkJLyogMzIgYml0IHNpZ25lZCBwYyByZWxhdGl2ZQorCQkJCQkgICBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfWDg2XzY0XzMyCQkxMAkvKiBEaXJlY3QgMzIgYml0IHplcm8gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMzJTCQkxMQkvKiBEaXJlY3QgMzIgYml0IHNpZ24gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMTYJCTEyCS8qIERpcmVjdCAxNiBiaXQgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF9QQzE2CQkxMwkvKiAxNiBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLworI2RlZmluZSBSX1g4Nl82NF84CQkxNAkvKiBEaXJlY3QgOCBiaXQgc2lnbiBleHRlbmRlZCAgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEM4CQkxNQkvKiA4IGJpdCBzaWduIGV4dGVuZGVkIHBjIHJlbGF0aXZlICovCisKKyNkZWZpbmUgUl9YODZfNjRfTlVNCQkxNgorCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBlbGZfY2hlY2tfYXJjaCh4KSBcCisJKCh4KS0+ZV9tYWNoaW5lID09IEVNX1g4Nl82NCkKKworI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1M2NAorI2RlZmluZSBFTEZfREFUQSAgICAgICAgRUxGREFUQTJMU0IKKyNkZWZpbmUgRUxGX0FSQ0ggICAgICAgIEVNX1g4Nl82NAorCisjZGVmaW5lIEVMRl9QTEFUX0lOSVQocmVncywgbG9hZF9hZGRyKSAgICBkbyB7IFwKKwlQVF9SRUdTX1JCWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JDWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JEWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JTSShyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JESShyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JCUChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JBWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1I4KHJlZ3MpID0gMDsgXAorCVBUX1JFR1NfUjkocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTAocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTEocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTIocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTMocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTQocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTUocmVncykgPSAwOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEVMRl9DT1JFX0NPUFlfUkVHUyhwcl9yZWcsIF9yZWdzKQkJXAorCShwcl9yZWcpWzBdID0gKF9yZWdzKS0+cmVncy5ncFswXTsJCQlcCisJKHByX3JlZylbMV0gPSAoX3JlZ3MpLT5yZWdzLmdwWzFdOwkJCVwKKwkocHJfcmVnKVsyXSA9IChfcmVncyktPnJlZ3MuZ3BbMl07CQkJXAorCShwcl9yZWcpWzNdID0gKF9yZWdzKS0+cmVncy5ncFszXTsJCQlcCisJKHByX3JlZylbNF0gPSAoX3JlZ3MpLT5yZWdzLmdwWzRdOwkJCVwKKwkocHJfcmVnKVs1XSA9IChfcmVncyktPnJlZ3MuZ3BbNV07CQkJXAorCShwcl9yZWcpWzZdID0gKF9yZWdzKS0+cmVncy5ncFs2XTsJCQlcCisJKHByX3JlZylbN10gPSAoX3JlZ3MpLT5yZWdzLmdwWzddOwkJCVwKKwkocHJfcmVnKVs4XSA9IChfcmVncyktPnJlZ3MuZ3BbOF07CQkJXAorCShwcl9yZWcpWzldID0gKF9yZWdzKS0+cmVncy5ncFs5XTsJCQlcCisJKHByX3JlZylbMTBdID0gKF9yZWdzKS0+cmVncy5ncFsxMF07CQkJXAorCShwcl9yZWcpWzExXSA9IChfcmVncyktPnJlZ3MuZ3BbMTFdOwkJCVwKKwkocHJfcmVnKVsxMl0gPSAoX3JlZ3MpLT5yZWdzLmdwWzEyXTsJCQlcCisJKHByX3JlZylbMTNdID0gKF9yZWdzKS0+cmVncy5ncFsxM107CQkJXAorCShwcl9yZWcpWzE0XSA9IChfcmVncyktPnJlZ3MuZ3BbMTRdOwkJCVwKKwkocHJfcmVnKVsxNV0gPSAoX3JlZ3MpLT5yZWdzLmdwWzE1XTsJCQlcCisJKHByX3JlZylbMTZdID0gKF9yZWdzKS0+cmVncy5ncFsxNl07CQkJXAorCShwcl9yZWcpWzE3XSA9IChfcmVncyktPnJlZ3MuZ3BbMTddOwkJCVwKKwkocHJfcmVnKVsxOF0gPSAoX3JlZ3MpLT5yZWdzLmdwWzE4XTsJCQlcCisJKHByX3JlZylbMTldID0gKF9yZWdzKS0+cmVncy5ncFsxOV07CQkJXAorCShwcl9yZWcpWzIwXSA9IChfcmVncyktPnJlZ3MuZ3BbMjBdOwkJCVwKKwkocHJfcmVnKVsyMV0gPSBjdXJyZW50LT50aHJlYWQuYXJjaC5mczsJCQlcCisJKHByX3JlZylbMjJdID0gMDsJCQkJCVwKKwkocHJfcmVnKVsyM10gPSAwOwkJCQkJXAorCShwcl9yZWcpWzI0XSA9IDA7CQkJCQlcCisJKHByX3JlZylbMjVdID0gMDsJCQkJCVwKKwkocHJfcmVnKVsyNl0gPSAwOworCisjZGVmaW5lIEVMRl9QTEFURk9STSAieDg2XzY0IgorCisvKiBObyB1c2VyLWFjY2Vzc2libGUgZml4bWFwIGFkZHJlc3NlcywgaS5lLiB2c3lzY2FsbCAqLworI2RlZmluZSBGSVhBRERSX1VTRVJfU1RBUlQgICAgICAwCisjZGVmaW5lIEZJWEFERFJfVVNFUl9FTkQgICAgICAgIDAKKworI2RlZmluZSBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTIDEKK3N0cnVjdCBsaW51eF9iaW5wcm07CitleHRlcm4gaW50IGFyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLAorCWludCB1c2VzX2ludGVycCk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHVtX3Zkc29fYWRkcjsKKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSIDMzCisjZGVmaW5lIEFSQ0hfRExJTkZPCU5FV19BVVhfRU5UKEFUX1NZU0lORk9fRUhEUiwgdW1fdmRzb19hZGRyKQorCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CisKKyNkZWZpbmUgRUxGX05HUkVHIChzaXplb2YgKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSAvIHNpemVvZihlbGZfZ3JlZ190KSkKK3R5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107CisKK3R5cGVkZWYgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZWxmX2ZwcmVnc2V0X3Q7CisKKyNkZWZpbmUgdGFza19wdF9yZWdzKHQpICgmKHQpLT50aHJlYWQucmVncykKKworc3RydWN0IHRhc2tfc3RydWN0OworCitleHRlcm4gaW50IGVsZl9jb3JlX2NvcHlfZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgZWxmX2ZwcmVnc2V0X3QgKmZwdSk7CisKKyNkZWZpbmUgRUxGX0NPUkVfQ09QWV9GUFJFR1ModCwgZnB1KSBlbGZfY29yZV9jb3B5X2ZwcmVncyh0LCBmcHUpCisKKyNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUgNDA5NgorCisjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAoMiAqIFRBU0tfU0laRSAvIDMpCisKK2V4dGVybiBsb25nIGVsZl9hdXhfaHdjYXA7CisjZGVmaW5lIEVMRl9IV0NBUCAoZWxmX2F1eF9od2NhcCkKKworI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIGRvIDsgd2hpbGUoMCkKKyNkZWZpbmUgX19IQVZFX0FSQ0hfR0FURV9BUkVBIDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2lycV92ZWN0b3JzLmggYi9hcmNoL3g4Ni91bS9hc20vaXJxX3ZlY3RvcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFfdmVjdG9ycy5oCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9hc20vaXJxX3ZlY3RvcnMuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL21tX2NvbnRleHQuaCBiL2FyY2gveDg2L3VtL2FzbS9tbV9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3M2Q2MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9tbV9jb250ZXh0LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBGdWppdHN1IFNpZW1lbnMgQ29tcHV0ZXJzIEdtYkgKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqCisgKiBBdXRob3I6IEJvZG8gU3Ryb2Vzc2VyIDxic3Ryb2Vzc2VyQGZ1aml0c3Utc2llbWVucy5jb20+CisgKi8KKworI2lmbmRlZiBfX0FTTV9MRFRfSAorI2RlZmluZSBfX0FTTV9MRFRfSAorCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxhc20vbGR0Lmg+CisKK2V4dGVybiB2b2lkIGxkdF9ob3N0X2luZm8odm9pZCk7CisKKyNkZWZpbmUgTERUX1BBR0VTX01BWCBcCisJKChMRFRfRU5UUklFUyAqIExEVF9FTlRSWV9TSVpFKS9QQUdFX1NJWkUpCisjZGVmaW5lIExEVF9FTlRSSUVTX1BFUl9QQUdFIFwKKwkoUEFHRV9TSVpFL0xEVF9FTlRSWV9TSVpFKQorI2RlZmluZSBMRFRfRElSRUNUX0VOVFJJRVMgXAorCSgoTERUX1BBR0VTX01BWCpzaXplb2Yodm9pZCAqKSkvTERUX0VOVFJZX1NJWkUpCisKK3N0cnVjdCBsZHRfZW50cnkgeworCV9fdTMyIGE7CisJX191MzIgYjsKK307CisKK3R5cGVkZWYgc3RydWN0IHVtbF9sZHQgeworCWludCBlbnRyeV9jb3VudDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1bmlvbiB7CisJCXN0cnVjdCBsZHRfZW50cnkgKiBwYWdlc1tMRFRfUEFHRVNfTUFYXTsKKwkJc3RydWN0IGxkdF9lbnRyeSBlbnRyaWVzW0xEVF9ESVJFQ1RfRU5UUklFU107CisJfSB1OworfSB1bWxfbGR0X3Q7CisKKyNkZWZpbmUgTERUX2VudHJ5X2EoaW5mbykgXAorCSgoKChpbmZvKS0+YmFzZV9hZGRyICYgMHgwMDAwZmZmZikgPDwgMTYpIHwgKChpbmZvKS0+bGltaXQgJiAweDBmZmZmKSkKKworI2RlZmluZSBMRFRfZW50cnlfYihpbmZvKSBcCisJKCgoaW5mbyktPmJhc2VfYWRkciAmIDB4ZmYwMDAwMDApIHwgXAorCSgoKGluZm8pLT5iYXNlX2FkZHIgJiAweDAwZmYwMDAwKSA+PiAxNikgfCBcCisJKChpbmZvKS0+bGltaXQgJiAweGYwMDAwKSB8IFwKKwkoKChpbmZvKS0+cmVhZF9leGVjX29ubHkgXiAxKSA8PCA5KSB8IFwKKwkoKGluZm8pLT5jb250ZW50cyA8PCAxMCkgfCBcCisJKCgoaW5mbyktPnNlZ19ub3RfcHJlc2VudCBeIDEpIDw8IDE1KSB8IFwKKwkoKGluZm8pLT5zZWdfMzJiaXQgPDwgMjIpIHwgXAorCSgoaW5mbyktPmxpbWl0X2luX3BhZ2VzIDw8IDIzKSB8IFwKKwkoKGluZm8pLT51c2VhYmxlIDw8IDIwKSB8IFwKKwkweDcwMDApCisKKyNkZWZpbmUgX0xEVF9lbXB0eShpbmZvKSAoXAorCShpbmZvKS0+YmFzZV9hZGRyCT09IDAJJiYgXAorCShpbmZvKS0+bGltaXQJCT09IDAJJiYgXAorCShpbmZvKS0+Y29udGVudHMJPT0gMAkmJiBcCisJKGluZm8pLT5yZWFkX2V4ZWNfb25seQk9PSAxCSYmIFwKKwkoaW5mbyktPnNlZ18zMmJpdAk9PSAwCSYmIFwKKwkoaW5mbyktPmxpbWl0X2luX3BhZ2VzCT09IDAJJiYgXAorCShpbmZvKS0+c2VnX25vdF9wcmVzZW50CT09IDEJJiYgXAorCShpbmZvKS0+dXNlYWJsZQkJPT0gMAkpCisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjZGVmaW5lIExEVF9lbXB0eShpbmZvKSAoX0xEVF9lbXB0eShpbmZvKSAmJiAoKGluZm8pLT5sbSA9PSAwKSkKKyNlbHNlCisjZGVmaW5lIExEVF9lbXB0eShpbmZvKSAoX0xEVF9lbXB0eShpbmZvKSkKKyNlbmRpZgorCitzdHJ1Y3QgdW1sX2FyY2hfbW1fY29udGV4dCB7CisJdW1sX2xkdF90IGxkdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL21vZHVsZS5oIGIvYXJjaC94ODYvdW0vYXNtL21vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYWY4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9hc20vbW9kdWxlLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfX1VNX01PRFVMRV9ICisjZGVmaW5lIF9fVU1fTU9EVUxFX0gKKworLyogVU1MIGlzIHNpbXBsZSAqLworc3RydWN0IG1vZF9hcmNoX3NwZWNpZmljCit7Cit9OworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCisjZGVmaW5lIEVsZl9TaGRyIEVsZjMyX1NoZHIKKyNkZWZpbmUgRWxmX1N5bSBFbGYzMl9TeW0KKyNkZWZpbmUgRWxmX0VoZHIgRWxmMzJfRWhkcgorCisjZWxzZQorCisjZGVmaW5lIEVsZl9TaGRyIEVsZjY0X1NoZHIKKyNkZWZpbmUgRWxmX1N5bSBFbGY2NF9TeW0KKyNkZWZpbmUgRWxmX0VoZHIgRWxmNjRfRWhkcgorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni91bS9hc20vcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YzE0MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fVU1fUFJPQ0VTU09SX0gKKyNkZWZpbmUgX19VTV9QUk9DRVNTT1JfSAorCisvKiBpbmNsdWRlIGZhdWx0aW5mbyBzdHJ1Y3R1cmUgKi8KKyNpbmNsdWRlIDxzeXNkZXAvZmF1bHRpbmZvLmg+CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisjIGluY2x1ZGUgInByb2Nlc3Nvcl8zMi5oIgorI2Vsc2UKKyMgaW5jbHVkZSAicHJvY2Vzc29yXzY0LmgiCisjZW5kaWYKKworI2RlZmluZSBLU1RLX0VJUCh0c2spIEtTVEtfUkVHKHRzaywgSE9TVF9JUCkKKyNkZWZpbmUgS1NUS19FU1AodHNrKSBLU1RLX1JFRyh0c2ssIEhPU1RfSVApCisjZGVmaW5lIEtTVEtfRUJQKHRzaykgS1NUS19SRUcodHNrLCBIT1NUX0JQKQorCisjZGVmaW5lIEFSQ0hfSVNfU1RBQ0tHUk9XKGFkZHJlc3MpIFwKKyAgICAgICAoYWRkcmVzcyArIDY1NTM2ICsgMzIgKiBzaXplb2YodW5zaWduZWQgbG9uZykgPj0gVVBUX1NQKCZjdXJyZW50LT50aHJlYWQucmVncy5yZWdzKSkKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZ2VuZXJpYy5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3JfMzIuaCBiL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3JfMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMThmNzMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vYXNtL3Byb2Nlc3Nvcl8zMi5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19VTV9QUk9DRVNTT1JfSTM4Nl9ICisjZGVmaW5lIF9fVU1fUFJPQ0VTU09SX0kzODZfSAorCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vbGR0Lmg+CisKK2V4dGVybiBpbnQgaG9zdF9oYXNfY21vdjsKKworc3RydWN0IHVtbF90bHNfc3RydWN0IHsKKwlzdHJ1Y3QgdXNlcl9kZXNjIHRsczsKKwl1bnNpZ25lZCBmbHVzaGVkOjE7CisJdW5zaWduZWQgcHJlc2VudDoxOworfTsKKworc3RydWN0IGFyY2hfdGhyZWFkIHsKKwlzdHJ1Y3QgdW1sX3Rsc19zdHJ1Y3QgdGxzX2FycmF5W0dEVF9FTlRSWV9UTFNfRU5UUklFU107CisJdW5zaWduZWQgbG9uZyBkZWJ1Z3JlZ3NbOF07CisJaW50IGRlYnVncmVnc19zZXE7CisJc3RydWN0IGZhdWx0aW5mbyBmYXVsdGluZm87Cit9OworCisjZGVmaW5lIElOSVRfQVJDSF9USFJFQUQgeyBcCisJLnRsc19hcnJheSAgCQk9IHsgWyAwIC4uLiBHRFRfRU5UUllfVExTX0VOVFJJRVMgLSAxIF0gPSBcCisJCQkJICAgIHsgLnByZXNlbnQgPSAwLCAuZmx1c2hlZCA9IDAgfSB9LCBcCisJLmRlYnVncmVncyAgCQk9IHsgWyAwIC4uLiA3IF0gPSAwIH0sIFwKKwkuZGVidWdyZWdzX3NlcQkJPSAwLCBcCisJLmZhdWx0aW5mbwkJPSB7IDAsIDAsIDAgfSBcCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2ZsdXNoX3RocmVhZChzdHJ1Y3QgYXJjaF90aHJlYWQgKnRocmVhZCkKK3sKKwkvKiBDbGVhciBhbnkgVExTIHN0aWxsIGhhbmdpbmcgKi8KKwltZW1zZXQoJnRocmVhZC0+dGxzX2FycmF5LCAwLCBzaXplb2YodGhyZWFkLT50bHNfYXJyYXkpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfY29weV90aHJlYWQoc3RydWN0IGFyY2hfdGhyZWFkICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFyY2hfdGhyZWFkICp0bykKK3sKKyAgICAgICAgbWVtY3B5KCZ0by0+dGxzX2FycmF5LCAmZnJvbS0+dGxzX2FycmF5LCBzaXplb2YoZnJvbS0+dGxzX2FycmF5KSk7Cit9CisKKyNpbmNsdWRlIDxhc20vdXNlci5oPgorCisvKiBSRVAgTk9QIChQQVVTRSkgaXMgYSBnb29kIHRoaW5nIHRvIGluc2VydCBpbnRvIGJ1c3ktd2FpdCBsb29wcy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZXBfbm9wKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInJlcDtub3AiOiA6IDoibWVtb3J5Iik7Cit9CisKKyNkZWZpbmUgY3B1X3JlbGF4KCkJcmVwX25vcCgpCisKKy8qCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIG1hY3JvIHRoYXQgcmV0dXJucyBjdXJyZW50CisgKiBpbnN0cnVjdGlvbiBwb2ludGVyICgicHJvZ3JhbSBjb3VudGVyIikuIFN0b2xlbgorICogZnJvbSBhc20taTM4Ni9wcm9jZXNzb3IuaAorICovCisjZGVmaW5lIGN1cnJlbnRfdGV4dF9hZGRyKCkgXAorCSh7IHZvaWQgKnBjOyBfX2FzbV9fKCJtb3ZsICQxZiwlMFxuMToiOiI9ZyIgKHBjKSk7IHBjOyB9KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3JfNjQuaCBiL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3JfNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWRlOTJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vYXNtL3Byb2Nlc3Nvcl82NC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX1VNX1BST0NFU1NPUl9YODZfNjRfSAorI2RlZmluZSBfX1VNX1BST0NFU1NPUl9YODZfNjRfSAorCitzdHJ1Y3QgYXJjaF90aHJlYWQgeworICAgICAgICB1bnNpZ25lZCBsb25nIGRlYnVncmVnc1s4XTsKKyAgICAgICAgaW50IGRlYnVncmVnc19zZXE7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZnM7CisgICAgICAgIHN0cnVjdCBmYXVsdGluZm8gZmF1bHRpbmZvOworfTsKKworLyogUkVQIE5PUCAoUEFVU0UpIGlzIGEgZ29vZCB0aGluZyB0byBpbnNlcnQgaW50byBidXN5LXdhaXQgbG9vcHMuICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVwX25vcCh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZXA7bm9wIjogOiA6Im1lbW9yeSIpOworfQorCisjZGVmaW5lIGNwdV9yZWxheCgpICAgcmVwX25vcCgpCisKKyNkZWZpbmUgSU5JVF9BUkNIX1RIUkVBRCB7IC5kZWJ1Z3JlZ3MgIAkJPSB7IFsgMCAuLi4gNyBdID0gMCB9LCBcCisJCQkgICAuZGVidWdyZWdzX3NlcQk9IDAsIFwKKwkJCSAgIC5mcwkJCT0gMCwgXAorCQkJICAgLmZhdWx0aW5mbwkJPSB7IDAsIDAsIDAgfSB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2ZsdXNoX3RocmVhZChzdHJ1Y3QgYXJjaF90aHJlYWQgKnRocmVhZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfY29weV90aHJlYWQoc3RydWN0IGFyY2hfdGhyZWFkICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFyY2hfdGhyZWFkICp0bykKK3sKKwl0by0+ZnMgPSBmcm9tLT5mczsKK30KKworI2luY2x1ZGUgPGFzbS91c2VyLmg+CisKKyNkZWZpbmUgY3VycmVudF90ZXh0X2FkZHIoKSBcCisJKHsgdm9pZCAqcGM7IF9fYXNtX18oIm1vdnEgJDFmLCUwXG4xOiI6Ij1nIiAocGMpKTsgcGM7IH0pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL3B0cmFjZS5oIGIvYXJjaC94ODYvdW0vYXNtL3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YWNhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9hc20vcHRyYWNlLmgKQEAgLTAsMCArMSw1IEBACisjaWZkZWYgQ09ORklHX1g4Nl8zMgorIyBpbmNsdWRlICJwdHJhY2VfMzIuaCIKKyNlbHNlCisjIGluY2x1ZGUgInB0cmFjZV82NC5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2FzbS9wdHJhY2UuaCBiL2FyY2gveDg2L3VtL2FzbS9wdHJhY2VfMzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9hc20vcHRyYWNlLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9wdHJhY2VfMzIuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL3B0cmFjZV82NC5oIGIvYXJjaC94ODYvdW0vYXNtL3B0cmFjZV82NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNmEwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9hc20vcHRyYWNlXzY0LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fVU1fUFRSQUNFX1g4Nl82NF9ICisjZGVmaW5lIF9fVU1fUFRSQUNFX1g4Nl82NF9ICisKKyNpbmNsdWRlICJsaW51eC9jb21waWxlci5oIgorI2luY2x1ZGUgImFzbS9lcnJuby5oIgorCisjZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUyAvKiBOZWVkZWQgdG8gZ2V0IHRoZSBSKiBtYWNyb3MgKi8KKyNpbmNsdWRlICJhc20vcHRyYWNlLWdlbmVyaWMuaCIKKworI2RlZmluZSBIT1NUX0FVRElUX0FSQ0ggQVVESVRfQVJDSF9YODZfNjQKKworI2RlZmluZSBQVF9SRUdTX1JCWChyKSBVUFRfUkJYKCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUkNYKHIpIFVQVF9SQ1goJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19SRFgocikgVVBUX1JEWCgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1JTSShyKSBVUFRfUlNJKCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUkRJKHIpIFVQVF9SREkoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19SQlAocikgVVBUX1JCUCgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1JBWChyKSBVUFRfUkFYKCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUjgocikgVVBUX1I4KCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUjkocikgVVBUX1I5KCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUjEwKHIpIFVQVF9SMTAoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19SMTEocikgVVBUX1IxMSgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1IxMihyKSBVUFRfUjEyKCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUjEzKHIpIFVQVF9SMTMoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19SMTQocikgVVBUX1IxNCgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1IxNShyKSBVUFRfUjE1KCYociktPnJlZ3MpCisKKyNkZWZpbmUgUFRfUkVHU19GUyhyKSBVUFRfRlMoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19HUyhyKSBVUFRfR1MoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19EUyhyKSBVUFRfRFMoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19FUyhyKSBVUFRfRVMoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19TUyhyKSBVUFRfU1MoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19DUyhyKSBVUFRfQ1MoJihyKS0+cmVncykKKworI2RlZmluZSBQVF9SRUdTX09SSUdfUkFYKHIpIFVQVF9PUklHX1JBWCgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1JJUChyKSBVUFRfSVAoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19TUChyKSBVUFRfU1AoJihyKS0+cmVncykKKworI2RlZmluZSBQVF9SRUdTX0VGTEFHUyhyKSBVUFRfRUZMQUdTKCYociktPnJlZ3MpCisKKy8qIFhYWCAqLworI2RlZmluZSB1c2VyX21vZGUocikgVVBUX0lTX1VTRVIoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19PUklHX1NZU0NBTEwocikgUFRfUkVHU19SQVgocikKKyNkZWZpbmUgUFRfUkVHU19TWVNDQUxMX1JFVChyKSBQVF9SRUdTX1JBWChyKQorCisjZGVmaW5lIFBUX0ZJWF9FWEVDX1NUQUNLKHNwKSBkbyA7IHdoaWxlKDApCisKKyNkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBQVF9SRUdTX0lQKHJlZ3MpCisKK3N0cnVjdCB1c2VyX2Rlc2M7CisKK3N0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9nZXRfdGhyZWFkX2FyZWEoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgaW50IGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVzZXJfZGVzYykKK3sKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9zZXRfdGhyZWFkX2FyZWEoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgaW50IGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVzZXJfZGVzYykKK3sKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7Cit9CisKK2V4dGVybiBsb25nIGFyY2hfcHJjdGwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY29kZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgX191c2VyICphZGRyKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9yZXF1aXJlZC1mZWF0dXJlcy5oIGIvYXJjaC94ODYvdW0vYXNtL3JlcXVpcmVkLWZlYXR1cmVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vcmVxdWlyZWQtZmVhdHVyZXMuaApyZW5hbWUgdG8gYXJjaC94ODYvdW0vYXNtL3JlcXVpcmVkLWZlYXR1cmVzLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc2VnbWVudC5oIGIvYXJjaC94ODYvdW0vYXNtL3NlZ21lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9zZWdtZW50LmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9zZWdtZW50LmgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9zeXN0ZW0uaCBiL2FyY2gveDg2L3VtL2FzbS9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU5ZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vYXNtL3N5c3RlbS5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIF9BU01fWDg2X1NZU1RFTV9IXworI2RlZmluZSBfQVNNX1g4Nl9TWVNURU1fSF8KKworI2luY2x1ZGUgPGFzbS9hc20uaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KKyNpbmNsdWRlIDxhc20vbm9wcy5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKworLyogZW50cmllcyBpbiBBUkNIX0RMSU5GTzogKi8KKyNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KKyMgZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0FSQ0ggMgorI2Vsc2UKKyMgZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0FSQ0ggMQorI2VuZGlmCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCk7CisKK3ZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOworCisvKgorICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KKyAqIEFuZCB5ZXMsIHRoaXMgaXMgcmVxdWlyZWQgb24gVVAgdG9vIHdoZW4gd2UncmUgdGFsa2luZworICogdG8gZGV2aWNlcy4KKyAqLworI2lmZGVmIENPTkZJR19YODZfMzIKKy8qCisgKiBTb21lIG5vbi1JbnRlbCBjbG9uZXMgc3VwcG9ydCBvdXQgb2Ygb3JkZXIgc3RvcmUuIHdtYigpIGNlYXNlcyB0byBiZSBhCisgKiBub3AgZm9yIHRoZXNlLgorICovCisjZGVmaW5lIG1iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAibWZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NMikKKyNkZWZpbmUgcm1iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NMikKKyNkZWZpbmUgd21iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAic2ZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NKQorI2Vsc2UKKyNkZWZpbmUgbWIoKSAJYXNtIHZvbGF0aWxlKCJtZmVuY2UiOjo6Im1lbW9yeSIpCisjZGVmaW5lIHJtYigpCWFzbSB2b2xhdGlsZSgibGZlbmNlIjo6OiJtZW1vcnkiKQorI2RlZmluZSB3bWIoKQlhc20gdm9sYXRpbGUoInNmZW5jZSIgOjo6ICJtZW1vcnkiKQorI2VuZGlmCisKKy8qKgorICogcmVhZF9iYXJyaWVyX2RlcGVuZHMgLSBGbHVzaCBhbGwgcGVuZGluZyByZWFkcyB0aGF0IHN1YnNlcXVlbnRzIHJlYWRzCisgKiBkZXBlbmQgb24uCisgKgorICogTm8gZGF0YS1kZXBlbmRlbnQgcmVhZHMgZnJvbSBtZW1vcnktbGlrZSByZWdpb25zIGFyZSBldmVyIHJlb3JkZXJlZAorICogb3ZlciB0aGlzIGJhcnJpZXIuICBBbGwgcmVhZHMgcHJlY2VkaW5nIHRoaXMgcHJpbWl0aXZlIGFyZSBndWFyYW50ZWVkCisgKiB0byBhY2Nlc3MgbWVtb3J5IChidXQgbm90IG5lY2Vzc2FyaWx5IG90aGVyIENQVXMnIGNhY2hlcykgYmVmb3JlIGFueQorICogcmVhZHMgZm9sbG93aW5nIHRoaXMgcHJpbWl0aXZlIHRoYXQgZGVwZW5kIG9uIHRoZSBkYXRhIHJldHVybiBieQorICogYW55IG9mIHRoZSBwcmVjZWRpbmcgcmVhZHMuICBUaGlzIHByaW1pdGl2ZSBpcyBtdWNoIGxpZ2h0ZXIgd2VpZ2h0IHRoYW4KKyAqIHJtYigpIG9uIG1vc3QgQ1BVcywgYW5kIGlzIG5ldmVyIGhlYXZpZXIgd2VpZ2h0IHRoYW4gaXMKKyAqIHJtYigpLgorICoKKyAqIFRoZXNlIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZSByZXNwZWN0ZWQgYnkgYm90aCB0aGUgbG9jYWwgQ1BVCisgKiBhbmQgdGhlIGNvbXBpbGVyLgorICoKKyAqIE9yZGVyaW5nIGlzIG5vdCBndWFyYW50ZWVkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4gdGhlc2UgcHJpbWl0aXZlcywKKyAqIG5vdCBldmVuIGJ5IGRhdGEgZGVwZW5kZW5jaWVzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgorICogbWVtb3J5X2JhcnJpZXIoKSBmb3IgZXhhbXBsZXMgYW5kIFVSTHMgdG8gbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIGZvcmNlIG9yZGVyaW5nICh0aGUgaW5pdGlhbAorICogdmFsdWUgb2YgImEiIGlzIHplcm8sICJiIiBpcyBvbmUsIGFuZCAicCIgaXMgIiZhIik6CisgKgorICogPHByb2dyYW1saXN0aW5nPgorICoJQ1BVIDAJCQkJQ1BVIDEKKyAqCisgKgliID0gMjsKKyAqCW1lbW9yeV9iYXJyaWVyKCk7CisgKglwID0gJmI7CQkJCXEgPSBwOworICoJCQkJCXJlYWRfYmFycmllcl9kZXBlbmRzKCk7CisgKgkJCQkJZCA9ICpxOworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqCisgKiBiZWNhdXNlIHRoZSByZWFkIG9mICIqcSIgZGVwZW5kcyBvbiB0aGUgcmVhZCBvZiAicCIgYW5kIHRoZXNlCisgKiB0d28gcmVhZHMgYXJlIHNlcGFyYXRlZCBieSBhIHJlYWRfYmFycmllcl9kZXBlbmRzKCkuICBIb3dldmVyLAorICogdGhlIGZvbGxvd2luZyBjb2RlLCB3aXRoIHRoZSBzYW1lIGluaXRpYWwgdmFsdWVzIGZvciAiYSIgYW5kICJiIjoKKyAqCisgKiA8cHJvZ3JhbWxpc3Rpbmc+CisgKglDUFUgMAkJCQlDUFUgMQorICoKKyAqCWEgPSAyOworICoJbWVtb3J5X2JhcnJpZXIoKTsKKyAqCWIgPSAzOwkJCQl5ID0gYjsKKyAqCQkJCQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpOworICoJCQkJCXggPSBhOworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqCisgKiBkb2VzIG5vdCBlbmZvcmNlIG9yZGVyaW5nLCBzaW5jZSB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kgYmV0d2VlbgorICogdGhlIHJlYWQgb2YgImEiIGFuZCB0aGUgcmVhZCBvZiAiYiIuICBUaGVyZWZvcmUsIG9uIHNvbWUgQ1BVcywgc3VjaAorICogYXMgQWxwaGEsICJ5IiBjb3VsZCBiZSBzZXQgdG8gMyBhbmQgIngiIHRvIDAuICBVc2Ugcm1iKCkKKyAqIGluIGNhc2VzIGxpa2UgdGhpcyB3aGVyZSB0aGVyZSBhcmUgbm8gZGF0YSBkZXBlbmRlbmNpZXMuCisgKiovCisKKyNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUgKDApCisKKyNpZmRlZiBDT05GSUdfU01QCisjZGVmaW5lIHNtcF9tYigpCW1iKCkKKyNpZmRlZiBDT05GSUdfWDg2X1BQUk9fRkVOQ0UKKyMgZGVmaW5lIHNtcF9ybWIoKQlybWIoKQorI2Vsc2UKKyMgZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfT09TVE9SRQorIyBkZWZpbmUgc21wX3dtYigpIAl3bWIoKQorI2Vsc2UKKyMgZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKKyNlbmRpZgorI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7ICh2b2lkKXhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7IHZhciA9IHZhbHVlOyBiYXJyaWVyKCk7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIFN0b3AgUkRUU0Mgc3BlY3VsYXRpb24uIFRoaXMgaXMgbmVlZGVkIHdoZW4geW91IG5lZWQgdG8gdXNlIFJEVFNDCisgKiAob3IgZ2V0X2N5Y2xlcyBvciB2cmVhZCB0aGF0IHBvc3NpYmx5IGFjY2Vzc2VzIHRoZSBUU0MpIGluIGEgZGVmaW5lZAorICogY29kZSByZWdpb24uCisgKgorICogKENvdWxkIHVzZSBhbiBhbHRlcm5hdGl2ZSB0aHJlZSB3YXkgZm9yIHRoaXMgaWYgdGhlcmUgd2FzIG9uZS4pCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZHRzY19iYXJyaWVyKHZvaWQpCit7CisJYWx0ZXJuYXRpdmUoQVNNX05PUDMsICJtZmVuY2UiLCBYODZfRkVBVFVSRV9NRkVOQ0VfUkRUU0MpOworCWFsdGVybmF0aXZlKEFTTV9OT1AzLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDKTsKK30KKworZXh0ZXJuIHZvaWQgKl9zd2l0Y2hfdG8odm9pZCAqcHJldiwgdm9pZCAqbmV4dCwgdm9pZCAqbGFzdCk7CisjZGVmaW5lIHN3aXRjaF90byhwcmV2LCBuZXh0LCBsYXN0KSBwcmV2ID0gX3N3aXRjaF90byhwcmV2LCBuZXh0LCBsYXN0KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS92bS1mbGFncy5oIGIvYXJjaC94ODYvdW0vYXNtL3ZtLWZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyOTdlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS92bS1mbGFncy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19WTV9GTEFHU19YODZfSAorI2RlZmluZSBfX1ZNX0ZMQUdTX1g4Nl9ICisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisKKyNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTIFwKKwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgXAorCSgoY3VycmVudC0+cGVyc29uYWxpdHkgJiBSRUFEX0lNUExJRVNfRVhFQykgPyBWTV9FWEVDIDogMCApIHwgXAorCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKKworI2Vsc2UKKworI2RlZmluZSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MgKFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUMgfCBcCisJVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKKyNkZWZpbmUgVk1fU1RBQ0tfREVGQVVMVF9GTEFHUyAoVk1fR1JPV1NET1dOIHwgVk1fUkVBRCB8IFZNX1dSSVRFIHwgXAorCVZNX0VYRUMgfCBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDKQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2J1Zy5jIGIvYXJjaC94ODYvdW0vYnVnLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC9idWcuYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vYnVnLmMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2J1Z3NfMzIuYyBiL2FyY2gveDg2L3VtL2J1Z3NfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWZiYTVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vYnVnc18zMi5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAibG9uZ2ptcC5oIgorI2luY2x1ZGUgInN5c2RlcC9wdHJhY2UuaCIKKyNpbmNsdWRlIDxnZW5lcmF0ZWQvYXNtLW9mZnNldHMuaD4KKworLyogU2V0IGR1cmluZyBlYXJseSBib290ICovCitzdGF0aWMgaW50IGhvc3RfaGFzX2Ntb3YgPSAxOworc3RhdGljIGptcF9idWYgY21vdl90ZXN0X3JldHVybjsKKworI2RlZmluZSBUQVNLX1BJRCh0YXNrKSAqKChpbnQgKikgJigoKGNoYXIgKikgKHRhc2spKVtIT1NUX1RBU0tfUElEXSkpCisKK3N0YXRpYyB2b2lkIGNtb3Zfc2lnaWxsX3Rlc3RfaGFuZGxlcihpbnQgc2lnKQoreworCWhvc3RfaGFzX2Ntb3YgPSAwOworCWxvbmdqbXAoY21vdl90ZXN0X3JldHVybiwgMSk7Cit9CisKK3ZvaWQgYXJjaF9jaGVja19idWdzKHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBvbGQsIG5ldzsKKworCXByaW50ayhVTV9LRVJOX0lORk8gIkNoZWNraW5nIGZvciBob3N0IHByb2Nlc3NvciBjbW92IHN1cHBvcnQuLi4iKTsKKwluZXcuc2FfaGFuZGxlciA9IGNtb3Zfc2lnaWxsX3Rlc3RfaGFuZGxlcjsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IFNJR0lMTCBpcyBlbmFibGVkIGFmdGVyIHRoZSBoYW5kbGVyIGxvbmdqbXBzIGJhY2sgKi8KKwluZXcuc2FfZmxhZ3MgPSBTQV9OT0RFRkVSOworCXNpZ2VtcHR5c2V0KCZuZXcuc2FfbWFzayk7CisJc2lnYWN0aW9uKFNJR0lMTCwgJm5ldywgJm9sZCk7CisKKwlpZiAoc2V0am1wKGNtb3ZfdGVzdF9yZXR1cm4pID09IDApIHsKKwkJdW5zaWduZWQgbG9uZyBmb28gPSAwOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY21vdnogJTAsICUxIiA6ICI9ciIgKGZvbykgOiAiMCIgKGZvbykpOworCQlwcmludGsoVU1fS0VSTl9DT05UICJZZXNcbiIpOworCX0gZWxzZQorCQlwcmludGsoVU1fS0VSTl9DT05UICJOb1xuIik7CisKKwlzaWdhY3Rpb24oU0lHSUxMLCAmb2xkLCAmbmV3KTsKK30KKwordm9pZCBhcmNoX2V4YW1pbmVfc2lnbmFsKGludCBzaWcsIHN0cnVjdCB1bWxfcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcFsyXTsKKworCS8qCisJICogVGhpcyBpcyB0ZXN0aW5nIGZvciBhIGNtb3YgKDB4MGYgMHg0eCkgaW5zdHJ1Y3Rpb24gY2F1c2luZyBhCisJICogU0lHSUxMIGluIGluaXQuCisJICovCisJaWYgKChzaWcgIT0gU0lHSUxMKSB8fCAoVEFTS19QSUQoZ2V0X2N1cnJlbnQoKSkgIT0gMSkpCisJCXJldHVybjsKKworCWlmIChjb3B5X2Zyb21fdXNlcl9wcm9jKHRtcCwgKHZvaWQgKikgVVBUX0lQKHJlZ3MpLCAyKSkgeworCQlwcmludGsoVU1fS0VSTl9FUlIgIlNJR0lMTCBpbiBpbml0LCBjb3VsZCBub3QgcmVhZCAiCisJCSAgICAgICAiaW5zdHJ1Y3Rpb25zIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHRtcFswXSAhPSAweDBmKSB8fCAoKHRtcFsxXSAmIDB4ZjApICE9IDB4NDApKQorCQlyZXR1cm47CisKKwlpZiAoaG9zdF9oYXNfY21vdiA9PSAwKQorCQlwcmludGsoVU1fS0VSTl9FUlIgIlNJR0lMTCBjYXVzZWQgYnkgY21vdiwgd2hpY2ggdGhpcyAiCisJCSAgICAgICAicHJvY2Vzc29yIGRvZXNuJ3QgaW1wbGVtZW50LiAgQm9vdCBhIGZpbGVzeXN0ZW0gIgorCQkgICAgICAgImNvbXBpbGVkIGZvciBvbGRlciBwcm9jZXNzb3JzIik7CisJZWxzZSBpZiAoaG9zdF9oYXNfY21vdiA9PSAxKQorCQlwcmludGsoVU1fS0VSTl9FUlIgIlNJR0lMTCBjYXVzZWQgYnkgY21vdiwgd2hpY2ggdGhpcyAiCisJCSAgICAgICAicHJvY2Vzc29yIGNsYWltcyB0byBpbXBsZW1lbnQiKTsKKwllbHNlCisJCXByaW50ayhVTV9LRVJOX0VSUiAiQmFkIHZhbHVlIGZvciBob3N0X2hhc19jbW92ICglZCkiLAorCQkJaG9zdF9oYXNfY21vdik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvYnVncy5jIGIvYXJjaC94ODYvdW0vYnVnc182NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvYnVncy5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9idWdzXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvY2hlY2tzdW0uUyBiL2FyY2gveDg2L3VtL2NoZWNrc3VtXzMyLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLWkzODYvY2hlY2tzdW0uUwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vY2hlY2tzdW1fMzIuUwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9kZWxheS5jIGIvYXJjaC94ODYvdW0vZGVsYXkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9kZWxheS5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9kZWxheS5jCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2VsZmNvcmUuYyBiL2FyY2gveDg2L3VtL2VsZmNvcmUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9lbGZjb3JlLmMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2VsZmNvcmUuYwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9mYXVsdC5jIGIvYXJjaC94ODYvdW0vZmF1bHQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9mYXVsdC5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9mYXVsdC5jCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9rc3ltcy5jIGIvYXJjaC94ODYvdW0va3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZThmNDNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0va3N5bXMuYwpAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorCisjaWZuZGVmIENPTkZJR19YODZfMzIKKy8qWFhYOiB3ZSBuZWVkIHRoZW0gYmVjYXVzZSB0aGV5IHdvdWxkIGJlIGV4cG9ydGVkIGJ5IHg4Nl82NCAqLworI2lmIChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpIHx8IF9fR05VQ19fID4gNAorRVhQT1JUX1NZTUJPTChtZW1jcHkpOworI2Vsc2UKK0VYUE9SVF9TWU1CT0woX19tZW1jcHkpOworI2VuZGlmCisjZW5kaWYKK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2xkdC5jIGIvYXJjaC94ODYvdW0vbGR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiMGUzOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2xkdC5jCkBAIC0wLDAgKzEsNTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAicHJvY19tbS5oIgorI2luY2x1ZGUgInNrYXMuaCIKKyNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgorI2luY2x1ZGUgInN5c2RlcC90bHMuaCIKKworZXh0ZXJuIGludCBtb2RpZnlfbGR0KGludCBmdW5jLCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KTsKKworc3RhdGljIGxvbmcgd3JpdGVfbGR0X2VudHJ5KHN0cnVjdCBtbV9pZCAqbW1faWRwLCBpbnQgZnVuYywKKwkJICAgICBzdHJ1Y3QgdXNlcl9kZXNjICpkZXNjLCB2b2lkICoqYWRkciwgaW50IGRvbmUpCit7CisJbG9uZyByZXM7CisKKwlpZiAocHJvY19tbSkgeworCQkvKgorCQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIGNhc2UsIHRoYXQgdGhlIG1tIHRvCisJCSAqIG1vZGlmeSBpc24ndCBjdXJyZW50LT5hY3RpdmVfbW0uCisJCSAqIElmIHRoaXMgaXMgY2FsbGVkIGRpcmVjdGx5IGJ5IG1vZGlmeV9sZHQsCisJCSAqICAgICAoY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LnNrYXMudSA9PSBtbV9pZHApCisJCSAqIHdpbGwgYmUgdHJ1ZS4gU28gbm8gY2FsbCB0byBfX3N3aXRjaF9tbShtbV9pZHApIGlzIGRvbmUuCisJCSAqIElmIHRoaXMgaXMgY2FsbGVkIGluIGNhc2Ugb2YgaW5pdF9uZXdfbGR0IG9yIFBUUkFDRV9MRFQsCisJCSAqIG1tX2lkcCB3b24ndCBiZWxvbmcgdG8gY3VycmVudC0+YWN0aXZlX21tLCBidXQgY2hpbGQtPm1tLgorCQkgKiBTbyB3ZSBuZWVkIHRvIHN3aXRjaCBjaGlsZCdzIG1tIGludG8gb3VyIHVzZXJzcGFjZSwgdGhlbgorCQkgKiBsYXRlciBzd2l0Y2ggYmFjay4KKwkJICoKKwkJICogTm90ZTogSSdtIHVuc3VyZTogc2hvdWxkIGludGVycnVwdHMgYmUgZGlzYWJsZWQgaGVyZT8KKwkJICovCisJCWlmICghY3VycmVudC0+YWN0aXZlX21tIHx8IGN1cnJlbnQtPmFjdGl2ZV9tbSA9PSAmaW5pdF9tbSB8fAorCQkgICAgbW1faWRwICE9ICZjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQuaWQpCisJCQlfX3N3aXRjaF9tbShtbV9pZHApOworCX0KKworCWlmIChwdHJhY2VfbGR0KSB7CisJCXN0cnVjdCBwdHJhY2VfbGR0IGxkdF9vcCA9IChzdHJ1Y3QgcHRyYWNlX2xkdCkgeworCQkJLmZ1bmMgPSBmdW5jLAorCQkJLnB0ciA9IGRlc2MsCisJCQkuYnl0ZWNvdW50ID0gc2l6ZW9mKCpkZXNjKX07CisJCXUzMiBjcHU7CisJCWludCBwaWQ7CisKKwkJaWYgKCFwcm9jX21tKQorCQkJcGlkID0gbW1faWRwLT51LnBpZDsKKwkJZWxzZSB7CisJCQljcHUgPSBnZXRfY3B1KCk7CisJCQlwaWQgPSB1c2Vyc3BhY2VfcGlkW2NwdV07CisJCX0KKworCQlyZXMgPSBvc19wdHJhY2VfbGR0KHBpZCwgMCwgKHVuc2lnbmVkIGxvbmcpICZsZHRfb3ApOworCisJCWlmIChwcm9jX21tKQorCQkJcHV0X2NwdSgpOworCX0KKwllbHNlIHsKKwkJdm9pZCAqc3R1Yl9hZGRyOworCQlyZXMgPSBzeXNjYWxsX3N0dWJfZGF0YShtbV9pZHAsICh1bnNpZ25lZCBsb25nICopZGVzYywKKwkJCQkJKHNpemVvZigqZGVzYykgKyBzaXplb2YobG9uZykgLSAxKSAmCisJCQkJCSAgICB+KHNpemVvZihsb25nKSAtIDEpLAorCQkJCQlhZGRyLCAmc3R1Yl9hZGRyKTsKKwkJaWYgKCFyZXMpIHsKKwkJCXVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyBmdW5jLAorCQkJCQkJICh1bnNpZ25lZCBsb25nKXN0dWJfYWRkciwKKwkJCQkJCSBzaXplb2YoKmRlc2MpLAorCQkJCQkJIDAsIDAsIDAgfTsKKwkJCXJlcyA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX21vZGlmeV9sZHQsIGFyZ3MsCisJCQkJCSAgICAgICAwLCBhZGRyLCBkb25lKTsKKwkJfQorCX0KKworCWlmIChwcm9jX21tKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXJ0IG9mIHNwZWNpYWwgaGFuZGxpbmcsIHRoYXQgbWFrZXMKKwkJICogUFRSQUNFX0xEVCBwb3NzaWJsZSB0byBpbXBsZW1lbnQuCisJCSAqLworCQlpZiAoY3VycmVudC0+YWN0aXZlX21tICYmIGN1cnJlbnQtPmFjdGl2ZV9tbSAhPSAmaW5pdF9tbSAmJgorCQkgICAgbW1faWRwICE9ICZjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQuaWQpCisJCQlfX3N3aXRjaF9tbSgmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LmlkKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgbG9uZyByZWFkX2xkdF9mcm9tX2hvc3Qodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCByZXMsIG47CisJc3RydWN0IHB0cmFjZV9sZHQgcHRyYWNlX2xkdCA9IChzdHJ1Y3QgcHRyYWNlX2xkdCkgeworCQkJLmZ1bmMgPSAwLAorCQkJLmJ5dGVjb3VudCA9IGJ5dGVjb3VudCwKKwkJCS5wdHIgPSBrbWFsbG9jKGJ5dGVjb3VudCwgR0ZQX0tFUk5FTCl9OworCXUzMiBjcHU7CisKKwlpZiAocHRyYWNlX2xkdC5wdHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFRoaXMgaXMgY2FsbGVkIGZyb20gc3lzX21vZGlmeV9sZHQgb25seSwgc28gdXNlcnNwYWNlX3BpZCBnaXZlcworCSAqIHVzIHRoZSByaWdodCBudW1iZXIKKwkgKi8KKworCWNwdSA9IGdldF9jcHUoKTsKKwlyZXMgPSBvc19wdHJhY2VfbGR0KHVzZXJzcGFjZV9waWRbY3B1XSwgMCwgKHVuc2lnbmVkIGxvbmcpICZwdHJhY2VfbGR0KTsKKwlwdXRfY3B1KCk7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gb3V0OworCisJbiA9IGNvcHlfdG9fdXNlcihwdHIsIHB0cmFjZV9sZHQucHRyLCByZXMpOworCWlmIChuICE9IDApCisJCXJlcyA9IC1FRkFVTFQ7CisKKyAgb3V0OgorCWtmcmVlKHB0cmFjZV9sZHQucHRyKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBJbiBza2FzIG1vZGUsIHdlIGhvbGQgb3VyIG93biBsZHQgZGF0YSBpbiBVTUwuCisgKiBUaHVzLCB0aGUgY29kZSBpbXBsZW1lbnRpbmcgc3lzX21vZGlmeV9sZHRfc2thcworICogaXMgdmVyeSBzaW1pbGFyIHRvIChhbmQgbW9zdGx5IHN0b2xlbiBmcm9tKSBzeXNfbW9kaWZ5X2xkdAorICogZm9yIGFyY2gvaTM4Ni9rZXJuZWwvbGR0LmMKKyAqIFRoZSByb3V0aW5lcyBjb3BpZWQgYW5kIG1vZGlmaWVkIGluIHBhcnQgYXJlOgorICogLSByZWFkX2xkdAorICogLSByZWFkX2RlZmF1bHRfbGR0CisgKiAtIHdyaXRlX2xkdAorICogLSBzeXNfbW9kaWZ5X2xkdF9za2FzCisgKi8KKworc3RhdGljIGludCByZWFkX2xkdCh2b2lkIF9fdXNlciAqIHB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQpCit7CisJaW50IGksIGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVtbF9sZHRfdCAqbGR0ID0gJmN1cnJlbnQtPm1tLT5jb250ZXh0LmFyY2gubGR0OworCisJaWYgKCFsZHQtPmVudHJ5X2NvdW50KQorCQlnb3RvIG91dDsKKwlpZiAoYnl0ZWNvdW50ID4gTERUX0VOVFJZX1NJWkUqTERUX0VOVFJJRVMpCisJCWJ5dGVjb3VudCA9IExEVF9FTlRSWV9TSVpFKkxEVF9FTlRSSUVTOworCWVyciA9IGJ5dGVjb3VudDsKKworCWlmIChwdHJhY2VfbGR0KQorCQlyZXR1cm4gcmVhZF9sZHRfZnJvbV9ob3N0KHB0ciwgYnl0ZWNvdW50KTsKKworCW11dGV4X2xvY2soJmxkdC0+bG9jayk7CisJaWYgKGxkdC0+ZW50cnlfY291bnQgPD0gTERUX0RJUkVDVF9FTlRSSUVTKSB7CisJCXNpemUgPSBMRFRfRU5UUllfU0laRSpMRFRfRElSRUNUX0VOVFJJRVM7CisJCWlmIChzaXplID4gYnl0ZWNvdW50KQorCQkJc2l6ZSA9IGJ5dGVjb3VudDsKKwkJaWYgKGNvcHlfdG9fdXNlcihwdHIsIGxkdC0+dS5lbnRyaWVzLCBzaXplKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWJ5dGVjb3VudCAtPSBzaXplOworCQlwdHIgKz0gc2l6ZTsKKwl9CisJZWxzZSB7CisJCWZvciAoaT0wOyBpPGxkdC0+ZW50cnlfY291bnQvTERUX0VOVFJJRVNfUEVSX1BBR0UgJiYgYnl0ZWNvdW50OworCQkgICAgIGkrKykgeworCQkJc2l6ZSA9IFBBR0VfU0laRTsKKwkJCWlmIChzaXplID4gYnl0ZWNvdW50KQorCQkJCXNpemUgPSBieXRlY291bnQ7CisJCQlpZiAoY29weV90b191c2VyKHB0ciwgbGR0LT51LnBhZ2VzW2ldLCBzaXplKSkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlieXRlY291bnQgLT0gc2l6ZTsKKwkJCXB0ciArPSBzaXplOworCQl9CisJfQorCW11dGV4X3VubG9jaygmbGR0LT5sb2NrKTsKKworCWlmIChieXRlY291bnQgPT0gMCB8fCBlcnIgPT0gLUVGQVVMVCkKKwkJZ290byBvdXQ7CisKKwlpZiAoY2xlYXJfdXNlcihwdHIsIGJ5dGVjb3VudCkpCisJCWVyciA9IC1FRkFVTFQ7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJlYWRfZGVmYXVsdF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCBlcnI7CisKKwlpZiAoYnl0ZWNvdW50ID4gNSpMRFRfRU5UUllfU0laRSkKKwkJYnl0ZWNvdW50ID0gNSpMRFRfRU5UUllfU0laRTsKKworCWVyciA9IGJ5dGVjb3VudDsKKwkvKgorCSAqIFVNTCBkb2Vzbid0IHN1cHBvcnQgbGNhbGw3IGFuZCBsY2FsbDI3LgorCSAqIFNvLCB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhIGRlZmF1bHQgbGR0LCBidXQgZW11bGF0ZQorCSAqIGFuIGVtcHR5IGxkdCBvZiBjb21tb24gaG9zdCBkZWZhdWx0IGxkdCBzaXplLgorCSAqLworCWlmIChjbGVhcl91c2VyKHB0ciwgYnl0ZWNvdW50KSkKKwkJZXJyID0gLUVGQVVMVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfbGR0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCwgaW50IGZ1bmMpCit7CisJdW1sX2xkdF90ICpsZHQgPSAmY3VycmVudC0+bW0tPmNvbnRleHQuYXJjaC5sZHQ7CisJc3RydWN0IG1tX2lkICogbW1faWRwID0gJmN1cnJlbnQtPm1tLT5jb250ZXh0LmlkOworCWludCBpLCBlcnI7CisJc3RydWN0IHVzZXJfZGVzYyBsZHRfaW5mbzsKKwlzdHJ1Y3QgbGR0X2VudHJ5IGVudHJ5MCwgKmxkdF9wOworCXZvaWQgKmFkZHIgPSBOVUxMOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoYnl0ZWNvdW50ICE9IHNpemVvZihsZHRfaW5mbykpCisJCWdvdG8gb3V0OworCWVyciA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZsZHRfaW5mbywgcHRyLCBzaXplb2YobGR0X2luZm8pKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChsZHRfaW5mby5lbnRyeV9udW1iZXIgPj0gTERUX0VOVFJJRVMpCisJCWdvdG8gb3V0OworCWlmIChsZHRfaW5mby5jb250ZW50cyA9PSAzKSB7CisJCWlmIChmdW5jID09IDEpCisJCQlnb3RvIG91dDsKKwkJaWYgKGxkdF9pbmZvLnNlZ19ub3RfcHJlc2VudCA9PSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKCFwdHJhY2VfbGR0KQorCQltdXRleF9sb2NrKCZsZHQtPmxvY2spOworCisJZXJyID0gd3JpdGVfbGR0X2VudHJ5KG1tX2lkcCwgZnVuYywgJmxkdF9pbmZvLCAmYWRkciwgMSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCWVsc2UgaWYgKHB0cmFjZV9sZHQpIHsKKwkJLyogV2l0aCBQVFJBQ0VfTERUIGF2YWlsYWJsZSwgdGhpcyBpcyB1c2VkIGFzIGEgZmxhZyBvbmx5ICovCisJCWxkdC0+ZW50cnlfY291bnQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobGR0X2luZm8uZW50cnlfbnVtYmVyID49IGxkdC0+ZW50cnlfY291bnQgJiYKKwkgICAgbGR0X2luZm8uZW50cnlfbnVtYmVyID49IExEVF9ESVJFQ1RfRU5UUklFUykgeworCQlmb3IgKGk9bGR0LT5lbnRyeV9jb3VudC9MRFRfRU5UUklFU19QRVJfUEFHRTsKKwkJICAgICBpKkxEVF9FTlRSSUVTX1BFUl9QQUdFIDw9IGxkdF9pbmZvLmVudHJ5X251bWJlcjsKKwkJICAgICBpKyspIHsKKwkJCWlmIChpID09IDApCisJCQkJbWVtY3B5KCZlbnRyeTAsIGxkdC0+dS5lbnRyaWVzLAorCQkJCSAgICAgICBzaXplb2YoZW50cnkwKSk7CisJCQlsZHQtPnUucGFnZXNbaV0gPSAoc3RydWN0IGxkdF9lbnRyeSAqKQorCQkJCV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pOworCQkJaWYgKCFsZHQtPnUucGFnZXNbaV0pIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCS8qIFVuZG8gdGhlIGNoYW5nZSBpbiBob3N0ICovCisJCQkJbWVtc2V0KCZsZHRfaW5mbywgMCwgc2l6ZW9mKGxkdF9pbmZvKSk7CisJCQkJd3JpdGVfbGR0X2VudHJ5KG1tX2lkcCwgMSwgJmxkdF9pbmZvLCAmYWRkciwgMSk7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQkJaWYgKGkgPT0gMCkgeworCQkJCW1lbWNweShsZHQtPnUucGFnZXNbMF0sICZlbnRyeTAsCisJCQkJICAgICAgIHNpemVvZihlbnRyeTApKTsKKwkJCQltZW1jcHkobGR0LT51LnBhZ2VzWzBdKzEsIGxkdC0+dS5lbnRyaWVzKzEsCisJCQkJICAgICAgIHNpemVvZihlbnRyeTApKihMRFRfRElSRUNUX0VOVFJJRVMtMSkpOworCQkJfQorCQkJbGR0LT5lbnRyeV9jb3VudCA9IChpICsgMSkgKiBMRFRfRU5UUklFU19QRVJfUEFHRTsKKwkJfQorCX0KKwlpZiAobGR0LT5lbnRyeV9jb3VudCA8PSBsZHRfaW5mby5lbnRyeV9udW1iZXIpCisJCWxkdC0+ZW50cnlfY291bnQgPSBsZHRfaW5mby5lbnRyeV9udW1iZXIgKyAxOworCisJaWYgKGxkdC0+ZW50cnlfY291bnQgPD0gTERUX0RJUkVDVF9FTlRSSUVTKQorCQlsZHRfcCA9IGxkdC0+dS5lbnRyaWVzICsgbGR0X2luZm8uZW50cnlfbnVtYmVyOworCWVsc2UKKwkJbGR0X3AgPSBsZHQtPnUucGFnZXNbbGR0X2luZm8uZW50cnlfbnVtYmVyL0xEVF9FTlRSSUVTX1BFUl9QQUdFXSArCisJCQlsZHRfaW5mby5lbnRyeV9udW1iZXIlTERUX0VOVFJJRVNfUEVSX1BBR0U7CisKKwlpZiAobGR0X2luZm8uYmFzZV9hZGRyID09IDAgJiYgbGR0X2luZm8ubGltaXQgPT0gMCAmJgorCSAgIChmdW5jID09IDEgfHwgTERUX2VtcHR5KCZsZHRfaW5mbykpKSB7CisJCWxkdF9wLT5hID0gMDsKKwkJbGR0X3AtPmIgPSAwOworCX0KKwllbHNleworCQlpZiAoZnVuYyA9PSAxKQorCQkJbGR0X2luZm8udXNlYWJsZSA9IDA7CisJCWxkdF9wLT5hID0gTERUX2VudHJ5X2EoJmxkdF9pbmZvKTsKKwkJbGR0X3AtPmIgPSBMRFRfZW50cnlfYigmbGR0X2luZm8pOworCX0KKwllcnIgPSAwOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmbGR0LT5sb2NrKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbG9uZyBkb19tb2RpZnlfbGR0X3NrYXMoaW50IGZ1bmMsIHZvaWQgX191c2VyICpwdHIsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBieXRlY291bnQpCit7CisJaW50IHJldCA9IC1FTk9TWVM7CisKKwlzd2l0Y2ggKGZ1bmMpIHsKKwkJY2FzZSAwOgorCQkJcmV0ID0gcmVhZF9sZHQocHRyLCBieXRlY291bnQpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJY2FzZSAweDExOgorCQkJcmV0ID0gd3JpdGVfbGR0KHB0ciwgYnl0ZWNvdW50LCBmdW5jKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlyZXQgPSByZWFkX2RlZmF1bHRfbGR0KHB0ciwgYnl0ZWNvdW50KTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGhvc3RfbGR0X2xvY2spOworc3RhdGljIHNob3J0IGR1bW15X2xpc3RbOV0gPSB7MCwgLTF9Oworc3RhdGljIHNob3J0ICogaG9zdF9sZHRfZW50cmllcyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGxkdF9nZXRfaG9zdF9pbmZvKHZvaWQpCit7CisJbG9uZyByZXQ7CisJc3RydWN0IGxkdF9lbnRyeSAqIGxkdDsKKwlzaG9ydCAqdG1wOworCWludCBpLCBzaXplLCBrLCBvcmRlcjsKKworCXNwaW5fbG9jaygmaG9zdF9sZHRfbG9jayk7CisKKwlpZiAoaG9zdF9sZHRfZW50cmllcyAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrKCZob3N0X2xkdF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlob3N0X2xkdF9lbnRyaWVzID0gZHVtbXlfbGlzdCsxOworCisJc3Bpbl91bmxvY2soJmhvc3RfbGR0X2xvY2spOworCisJZm9yIChpID0gTERUX1BBR0VTX01BWC0xLCBvcmRlcj0wOyBpOyBpPj49MSwgb3JkZXIrKykKKwkJOworCisJbGR0ID0gKHN0cnVjdCBsZHRfZW50cnkgKikKKwkgICAgICBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfWkVSTywgb3JkZXIpOworCWlmIChsZHQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxkdF9nZXRfaG9zdF9pbmZvOiBjb3VsZG4ndCBhbGxvY2F0ZSBidWZmZXIgIgorCQkgICAgICAgImZvciBob3N0IGxkdFxuIik7CisJCXJldHVybjsKKwl9CisKKwlyZXQgPSBtb2RpZnlfbGR0KDAsIGxkdCwgKDE8PG9yZGVyKSpQQUdFX1NJWkUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGR0X2dldF9ob3N0X2luZm86IGNvdWxkbid0IHJlYWQgaG9zdCBsZHRcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAocmV0ID09IDApIHsKKwkJLyogZGVmYXVsdF9sZHQgaXMgYWN0aXZlLCBzaW1wbHkgd3JpdGUgYW4gZW1wdHkgZW50cnkgMCAqLworCQlob3N0X2xkdF9lbnRyaWVzID0gZHVtbXlfbGlzdDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlmb3IgKGk9MCwgc2l6ZT0wOyBpPHJldC9MRFRfRU5UUllfU0laRTsgaSsrKSB7CisJCWlmIChsZHRbaV0uYSAhPSAwIHx8IGxkdFtpXS5iICE9IDApCisJCQlzaXplKys7CisJfQorCisJaWYgKHNpemUgPCBBUlJBWV9TSVpFKGR1bW15X2xpc3QpKQorCQlob3N0X2xkdF9lbnRyaWVzID0gZHVtbXlfbGlzdDsKKwllbHNlIHsKKwkJc2l6ZSA9IChzaXplICsgMSkgKiBzaXplb2YoZHVtbXlfbGlzdFswXSk7CisJCXRtcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICh0bXAgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJsZHRfZ2V0X2hvc3RfaW5mbzogY291bGRuJ3QgYWxsb2NhdGUgIgorCQkJICAgICAgICJob3N0IGxkdCBsaXN0XG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJaG9zdF9sZHRfZW50cmllcyA9IHRtcDsKKwl9CisKKwlmb3IgKGk9MCwgaz0wOyBpPHJldC9MRFRfRU5UUllfU0laRTsgaSsrKSB7CisJCWlmIChsZHRbaV0uYSAhPSAwIHx8IGxkdFtpXS5iICE9IDApCisJCQlob3N0X2xkdF9lbnRyaWVzW2srK10gPSBpOworCX0KKwlob3N0X2xkdF9lbnRyaWVzW2tdID0gLTE7CisKK291dF9mcmVlOgorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpbGR0LCBvcmRlcik7Cit9CisKK2xvbmcgaW5pdF9uZXdfbGR0KHN0cnVjdCBtbV9jb250ZXh0ICpuZXdfbW0sIHN0cnVjdCBtbV9jb250ZXh0ICpmcm9tX21tKQoreworCXN0cnVjdCB1c2VyX2Rlc2MgZGVzYzsKKwlzaG9ydCAqIG51bV9wOworCWludCBpOworCWxvbmcgcGFnZSwgZXJyPTA7CisJdm9pZCAqYWRkciA9IE5VTEw7CisJc3RydWN0IHByb2NfbW1fb3AgY29weTsKKworCisJaWYgKCFwdHJhY2VfbGR0KQorCQltdXRleF9pbml0KCZuZXdfbW0tPmFyY2gubGR0LmxvY2spOworCisJaWYgKCFmcm9tX21tKSB7CisJCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBpbml0aWFsaXplIGEgY2xlYW4gbGR0LgorCQkgKi8KKwkJaWYgKHByb2NfbW0pIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgbmV3IG1tIHdhcyBjcmVhdGVkIHVzaW5nIHByb2NfbW0sIGhvc3QncworCQkJICogZGVmYXVsdC1sZHQgY3VycmVudGx5IGlzIGFzc2lnbmVkLCB3aGljaCBub3JtYWxseQorCQkJICogY29udGFpbnMgdGhlIGNhbGwtZ2F0ZXMgZm9yIGxjYWxsNyBhbmQgbGNhbGwyNy4KKwkJCSAqIFRvIHJlbW92ZSB0aGVzZSBnYXRlcywgd2Ugc2ltcGx5IHdyaXRlIGFuIGVtcHR5CisJCQkgKiBlbnRyeSBhcyBudW1iZXIgMCB0byB0aGUgaG9zdC4KKwkJCSAqLworCQkJZXJyID0gd3JpdGVfbGR0X2VudHJ5KCZuZXdfbW0tPmlkLCAxLCAmZGVzYywgJmFkZHIsIDEpOworCQl9CisJCWVsc2V7CisJCQkvKgorCQkJICogTm93IHdlIHRyeSB0byByZXRyaWV2ZSBpbmZvIGFib3V0IHRoZSBsZHQsIHdlCisJCQkgKiBpbmhlcml0ZWQgZnJvbSB0aGUgaG9zdC4gQWxsIGxkdC1lbnRyaWVzIGZvdW5kCisJCQkgKiB3aWxsIGJlIHJlc2V0IGluIHRoZSBmb2xsb3dpbmcgbG9vcAorCQkJICovCisJCQlsZHRfZ2V0X2hvc3RfaW5mbygpOworCQkJZm9yIChudW1fcD1ob3N0X2xkdF9lbnRyaWVzOyAqbnVtX3AgIT0gLTE7IG51bV9wKyspIHsKKwkJCQlkZXNjLmVudHJ5X251bWJlciA9ICpudW1fcDsKKwkJCQllcnIgPSB3cml0ZV9sZHRfZW50cnkoJm5ld19tbS0+aWQsIDEsICZkZXNjLAorCQkJCQkJICAgICAgJmFkZHIsICoobnVtX3AgKyAxKSA9PSAtMSk7CisJCQkJaWYgKGVycikKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbmV3X21tLT5hcmNoLmxkdC5lbnRyeV9jb3VudCA9IDA7CisKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHByb2NfbW0pIHsKKwkJLyoKKwkJICogV2UgaGF2ZSBhIHZhbGlkIGZyb21fbW0sIHNvIHdlIG5vdyBoYXZlIHRvIGNvcHkgdGhlIExEVCBvZgorCQkgKiBmcm9tX21tIHRvIG5ld19tbSwgYmVjYXVzZSB1c2luZyBwcm9jX21tIGFuIG5ldyBtbSB3aXRoCisJCSAqIGFuIGVtcHR5L2RlZmF1bHQgTERUIHdhcyBjcmVhdGVkIGluIG5ld19tbSgpCisJCSAqLworCQljb3B5ID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgCT0gTU1fQ09QWV9TRUdNRU5UUywKKwkJCQkJICAgICAgLnUgCT0KKwkJCQkJICAgICAgeyAuY29weV9zZWdtZW50cyA9CisJCQkJCQkJZnJvbV9tbS0+aWQudS5tbV9mZCB9IH0gKTsKKwkJaSA9IG9zX3dyaXRlX2ZpbGUobmV3X21tLT5pZC51Lm1tX2ZkLCAmY29weSwgc2l6ZW9mKGNvcHkpKTsKKwkJaWYgKGkgIT0gc2l6ZW9mKGNvcHkpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJuZXdfbW0gOiAvcHJvYy9tbSBjb3B5X3NlZ21lbnRzICIKKwkJCSAgICAgICAiZmFpbGVkLCBlcnIgPSAlZFxuIiwgLWkpOworCX0KKworCWlmICghcHRyYWNlX2xkdCkgeworCQkvKgorCQkgKiBPdXIgbG9jYWwgTERUIGlzIHVzZWQgdG8gc3VwcGx5IHRoZSBkYXRhIGZvcgorCQkgKiBtb2RpZnlfbGR0KFJFQURMRFQpLCBpZiBQVFJBQ0VfTERUIGlzbid0IGF2YWlsYWJsZSwKKwkJICogaS5lLiwgd2UgaGF2ZSB0byB1c2UgdGhlIHN0dWIgZm9yIG1vZGlmeV9sZHQsIHdoaWNoCisJCSAqIGNhbid0IGhhbmRsZSB0aGUgYmlnIHJlYWQgYnVmZmVyIG9mIHVwIHRvIDY0a0IuCisJCSAqLworCQltdXRleF9sb2NrKCZmcm9tX21tLT5hcmNoLmxkdC5sb2NrKTsKKwkJaWYgKGZyb21fbW0tPmFyY2gubGR0LmVudHJ5X2NvdW50IDw9IExEVF9ESVJFQ1RfRU5UUklFUykKKwkJCW1lbWNweShuZXdfbW0tPmFyY2gubGR0LnUuZW50cmllcywgZnJvbV9tbS0+YXJjaC5sZHQudS5lbnRyaWVzLAorCQkJICAgICAgIHNpemVvZihuZXdfbW0tPmFyY2gubGR0LnUuZW50cmllcykpOworCQllbHNlIHsKKwkJCWkgPSBmcm9tX21tLT5hcmNoLmxkdC5lbnRyeV9jb3VudCAvIExEVF9FTlRSSUVTX1BFUl9QQUdFOworCQkJd2hpbGUgKGktLT4wKSB7CisJCQkJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pOworCQkJCWlmICghcGFnZSkgeworCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbmV3X21tLT5hcmNoLmxkdC51LnBhZ2VzW2ldID0KKwkJCQkJKHN0cnVjdCBsZHRfZW50cnkgKikgcGFnZTsKKwkJCQltZW1jcHkobmV3X21tLT5hcmNoLmxkdC51LnBhZ2VzW2ldLAorCQkJCSAgICAgICBmcm9tX21tLT5hcmNoLmxkdC51LnBhZ2VzW2ldLCBQQUdFX1NJWkUpOworCQkJfQorCQl9CisJCW5ld19tbS0+YXJjaC5sZHQuZW50cnlfY291bnQgPSBmcm9tX21tLT5hcmNoLmxkdC5lbnRyeV9jb3VudDsKKwkJbXV0ZXhfdW5sb2NrKCZmcm9tX21tLT5hcmNoLmxkdC5sb2NrKTsKKwl9CisKKyAgICBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCit2b2lkIGZyZWVfbGR0KHN0cnVjdCBtbV9jb250ZXh0ICptbSkKK3sKKwlpbnQgaTsKKworCWlmICghcHRyYWNlX2xkdCAmJiBtbS0+YXJjaC5sZHQuZW50cnlfY291bnQgPiBMRFRfRElSRUNUX0VOVFJJRVMpIHsKKwkJaSA9IG1tLT5hcmNoLmxkdC5lbnRyeV9jb3VudCAvIExEVF9FTlRSSUVTX1BFUl9QQUdFOworCQl3aGlsZSAoaS0tID4gMCkKKwkJCWZyZWVfcGFnZSgobG9uZykgbW0tPmFyY2gubGR0LnUucGFnZXNbaV0pOworCX0KKwltbS0+YXJjaC5sZHQuZW50cnlfY291bnQgPSAwOworfQorCitpbnQgc3lzX21vZGlmeV9sZHQoaW50IGZ1bmMsIHZvaWQgX191c2VyICpwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCXJldHVybiBkb19tb2RpZnlfbGR0X3NrYXMoZnVuYywgcHRyLCBieXRlY291bnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9tZW0uYyBiL2FyY2gveDg2L3VtL21lbV8zMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy1pMzg2L21lbS5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9tZW1fMzIuYwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L21lbS5jIGIvYXJjaC94ODYvdW0vbWVtXzY0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC9tZW0uYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vbWVtXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL29zLUxpbnV4L01ha2VmaWxlIGIvYXJjaC94ODYvdW0vb3MtTGludXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzYmZiOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL29zLUxpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyMKKworb2JqLXkgPSByZWdpc3RlcnMubyB0YXNrX3NpemUubyBtY29udGV4dC5vCisKK29iai0kKENPTkZJR19YODZfMzIpICs9IHRscy5vCitvYmotJChDT05GSUdfNjRCSVQpICs9IHByY3RsLm8KKworVVNFUl9PQkpTIDo9ICQob2JqLXkpCisKK2luY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9vcy1MaW51eC9tY29udGV4dC5jIGIvYXJjaC94ODYvdW0vb3MtTGludXgvbWNvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMzZDcyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vb3MtTGludXgvbWNvbnRleHQuYwpAQCAtMCwwICsxLDMxIEBACisjaW5jbHVkZSA8c3lzL3Vjb250ZXh0Lmg+CisjZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxzeXNkZXAvcHRyYWNlLmg+CisKK3ZvaWQgZ2V0X3JlZ3NfZnJvbV9tYyhzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MsIG1jb250ZXh0X3QgKm1jKQoreworI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIENPUFkyKFgsWSkgcmVncy0+Z3BbWF0gPSBtYy0+Z3JlZ3NbUkVHXyMjWV0KKyNkZWZpbmUgQ09QWShYKSByZWdzLT5ncFtYXSA9IG1jLT5ncmVnc1tSRUdfIyNYXQorI2RlZmluZSBDT1BZX1NFRyhYKSByZWdzLT5ncFtYXSA9IG1jLT5ncmVnc1tSRUdfIyNYXSAmIDB4ZmZmZjsKKyNkZWZpbmUgQ09QWV9TRUdfQ1BMMyhYKSByZWdzLT5ncFtYXSA9IChtYy0+Z3JlZ3NbUkVHXyMjWF0gJiAweGZmZmYpIHwgMzsKKwlDT1BZX1NFRyhHUyk7IENPUFlfU0VHKEZTKTsgQ09QWV9TRUcoRVMpOyBDT1BZX1NFRyhEUyk7CisJQ09QWShFREkpOyBDT1BZKEVTSSk7IENPUFkoRUJQKTsKKwlDT1BZMihVRVNQLCBFU1ApOyAvKiBzaWMgKi8KKwlDT1BZKEVCWCk7IENPUFkoRURYKTsgQ09QWShFQ1gpOyBDT1BZKEVBWCk7CisJQ09QWShFSVApOyBDT1BZX1NFR19DUEwzKENTKTsgQ09QWShFRkwpOyBDT1BZX1NFR19DUEwzKFNTKTsKKyNlbHNlCisjZGVmaW5lIENPUFkyKFgsWSkgcmVncy0+Z3BbWC9zaXplb2YodW5zaWduZWQgbG9uZyldID0gbWMtPmdyZWdzW1JFR18jI1ldCisjZGVmaW5lIENPUFkoWCkgcmVncy0+Z3BbWC9zaXplb2YodW5zaWduZWQgbG9uZyldID0gbWMtPmdyZWdzW1JFR18jI1hdCisJQ09QWShSOCk7IENPUFkoUjkpOyBDT1BZKFIxMCk7IENPUFkoUjExKTsKKwlDT1BZKFIxMik7IENPUFkoUjEzKTsgQ09QWShSMTQpOyBDT1BZKFIxNSk7CisJQ09QWShSREkpOyBDT1BZKFJTSSk7IENPUFkoUkJQKTsgQ09QWShSQlgpOworCUNPUFkoUkRYKTsgQ09QWShSQVgpOyBDT1BZKFJDWCk7IENPUFkoUlNQKTsKKwlDT1BZKFJJUCk7CisJQ09QWTIoRUZMQUdTLCBFRkwpOworCUNPUFkyKENTLCBDU0dTRlMpOworCXJlZ3MtPmdwW0NTIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXSAmPSAweGZmZmY7CisJcmVncy0+Z3BbQ1MgLyBzaXplb2YodW5zaWduZWQgbG9uZyldIHw9IDM7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9wcmN0bC5jIGIvYXJjaC94ODYvdW0vb3MtTGludXgvcHJjdGwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3ByY3RsLmMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL29zLUxpbnV4L3ByY3RsLmMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL29zLUxpbnV4L3JlZ2lzdGVycy5jIGIvYXJjaC94ODYvdW0vb3MtTGludXgvcmVnaXN0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkYmI4NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL29zLUxpbnV4L3JlZ2lzdGVycy5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFBhdGhTY2FsZSwgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaWZkZWYgX19pMzg2X18KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2VuZGlmCisjaW5jbHVkZSAibG9uZ2ptcC5oIgorI2luY2x1ZGUgInN5c2RlcC9wdHJhY2VfdXNlci5oIgorCitpbnQgc2F2ZV9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqZnBfcmVncykKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9HRVRGUFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCXJldHVybiAwOworfQorCitpbnQgcmVzdG9yZV9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqZnBfcmVncykKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9TRVRGUFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCXJldHVybiAwOworfQorCisjaWZkZWYgX19pMzg2X18KK2ludCBoYXZlX2ZweF9yZWdzID0gMTsKK2ludCBzYXZlX2ZweF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqZnBfcmVncykKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9HRVRGUFhSRUdTLCBwaWQsIDAsIGZwX3JlZ3MpIDwgMCkKKwkJcmV0dXJuIC1lcnJubzsKKwlyZXR1cm4gMDsKK30KKworaW50IHJlc3RvcmVfZnB4X3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpmcF9yZWdzKQoreworCWlmIChwdHJhY2UoUFRSQUNFX1NFVEZQWFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCXJldHVybiAwOworfQorCitpbnQgZ2V0X2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQoreworCWlmIChoYXZlX2ZweF9yZWdzKQorCQlyZXR1cm4gc2F2ZV9mcHhfcmVnaXN0ZXJzKHBpZCwgcmVncyk7CisJZWxzZQorCQlyZXR1cm4gc2F2ZV9mcF9yZWdpc3RlcnMocGlkLCByZWdzKTsKK30KKworaW50IHB1dF9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwlpZiAoaGF2ZV9mcHhfcmVncykKKwkJcmV0dXJuIHJlc3RvcmVfZnB4X3JlZ2lzdGVycyhwaWQsIHJlZ3MpOworCWVsc2UKKwkJcmV0dXJuIHJlc3RvcmVfZnBfcmVnaXN0ZXJzKHBpZCwgcmVncyk7Cit9CisKK3ZvaWQgYXJjaF9pbml0X3JlZ2lzdGVycyhpbnQgcGlkKQoreworCXN0cnVjdCB1c2VyX2ZweHJlZ3Nfc3RydWN0IGZweF9yZWdzOworCWludCBlcnI7CisKKwllcnIgPSBwdHJhY2UoUFRSQUNFX0dFVEZQWFJFR1MsIHBpZCwgMCwgJmZweF9yZWdzKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuOworCisJaWYgKGVycm5vICE9IEVJTykKKwkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IFBUUkFDRV9HRVRGUFhSRUdTIGZhaWxlZCwgZXJybm8gPSAlZCIsCisJCSAgICAgIGVycm5vKTsKKworCWhhdmVfZnB4X3JlZ3MgPSAwOworfQorI2Vsc2UKKworaW50IGdldF9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwlyZXR1cm4gc2F2ZV9mcF9yZWdpc3RlcnMocGlkLCByZWdzKTsKK30KKworaW50IHB1dF9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwlyZXR1cm4gcmVzdG9yZV9mcF9yZWdpc3RlcnMocGlkLCByZWdzKTsKK30KKworI2VuZGlmCisKK3Vuc2lnbmVkIGxvbmcgZ2V0X3RocmVhZF9yZWcoaW50IHJlZywgam1wX2J1ZiAqYnVmKQoreworCXN3aXRjaCAocmVnKSB7CisjaWZkZWYgX19pMzg2X18KKwljYXNlIEhPU1RfSVA6CisJCXJldHVybiBidWZbMF0tPl9fZWlwOworCWNhc2UgSE9TVF9TUDoKKwkJcmV0dXJuIGJ1ZlswXS0+X19lc3A7CisJY2FzZSBIT1NUX0JQOgorCQlyZXR1cm4gYnVmWzBdLT5fX2VicDsKKyNlbHNlCisJY2FzZSBIT1NUX0lQOgorCQlyZXR1cm4gYnVmWzBdLT5fX3JpcDsKKwljYXNlIEhPU1RfU1A6CisJCXJldHVybiBidWZbMF0tPl9fcnNwOworCWNhc2UgSE9TVF9CUDoKKwkJcmV0dXJuIGJ1ZlswXS0+X19yYnA7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlwcmludGsoVU1fS0VSTl9FUlIgImdldF90aHJlYWRfcmVncyAtIHVua25vd24gcmVnaXN0ZXIgJWRcbiIsCisJCSAgICAgICByZWcpOworCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9vcy1MaW51eC90YXNrX3NpemUuYyBiL2FyY2gveDg2L3VtL29zLUxpbnV4L3Rhc2tfc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjE2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9vcy1MaW51eC90YXNrX3NpemUuYwpAQCAtMCwwICsxLDE1MCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJsb25nam1wLmgiCisKKyNpZmRlZiBfX2kzODZfXworCitzdGF0aWMgam1wX2J1ZiBidWY7CisKK3N0YXRpYyB2b2lkIHNlZ2ZhdWx0KGludCBzaWcpCit7CisJbG9uZ2ptcChidWYsIDEpOworfQorCitzdGF0aWMgaW50IHBhZ2Vfb2sodW5zaWduZWQgbG9uZyBwYWdlKQoreworCXVuc2lnbmVkIGxvbmcgKmFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyAqKSAocGFnZSA8PCBVTV9LRVJOX1BBR0VfU0hJRlQpOworCXVuc2lnbmVkIGxvbmcgbiA9IH4wVUw7CisJdm9pZCAqbWFwcGVkID0gTlVMTDsKKwlpbnQgb2sgPSAwOworCisJLyoKKwkgKiBGaXJzdCBzZWUgaWYgdGhlIHBhZ2UgaXMgcmVhZGFibGUuICBJZiBpdCBpcywgaXQgbWF5IHN0aWxsCisJICogYmUgYSBWRFNPLCBzbyB3ZSBnbyBvbiB0byBzZWUgaWYgaXQncyB3cml0YWJsZS4gIElmIG5vdAorCSAqIHRoZW4gdHJ5IG1hcHBpbmcgbWVtb3J5IHRoZXJlLiAgSWYgdGhhdCBmYWlscywgdGhlbiB3ZSdyZQorCSAqIHN0aWxsIGluIHRoZSBrZXJuZWwgYXJlYS4gIEFzIGEgc2FuaXR5IGNoZWNrLCB3ZSdsbCBmYWlsIGlmCisJICogdGhlIG1tYXAgc3VjY2VlZHMsIGJ1dCBnaXZlcyB1cyBhbiBhZGRyZXNzIGRpZmZlcmVudCBmcm9tCisJICogd2hhdCB3ZSB3YW50ZWQuCisJICovCisJaWYgKHNldGptcChidWYpID09IDApCisJCW4gPSAqYWRkcmVzczsKKwllbHNlIHsKKwkJbWFwcGVkID0gbW1hcChhZGRyZXNzLCBVTV9LRVJOX1BBR0VfU0laRSwKKwkJCSAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKKwkJaWYgKG1hcHBlZCA9PSBNQVBfRkFJTEVEKQorCQkJcmV0dXJuIDA7CisJCWlmIChtYXBwZWQgIT0gYWRkcmVzcykKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogTm93LCBpcyBpdCB3cml0ZWFibGU/ICBJZiBzbywgdGhlbiB3ZSdyZSBpbiB1c2VyIGFkZHJlc3MKKwkgKiBzcGFjZS4gIElmIG5vdCwgdGhlbiB0cnkgbXByb3RlY3RpbmcgaXQgYW5kIHRyeSB0aGUgd3JpdGUKKwkgKiBhZ2Fpbi4KKwkgKi8KKwlpZiAoc2V0am1wKGJ1ZikgPT0gMCkgeworCQkqYWRkcmVzcyA9IG47CisJCW9rID0gMTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChtcHJvdGVjdChhZGRyZXNzLCBVTV9LRVJOX1BBR0VfU0laRSwKKwkJCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSAhPSAwKQorCQlnb3RvIG91dDsKKworCWlmIChzZXRqbXAoYnVmKSA9PSAwKSB7CisJCSphZGRyZXNzID0gbjsKKwkJb2sgPSAxOworCX0KKworIG91dDoKKwlpZiAobWFwcGVkICE9IE5VTEwpCisJCW11bm1hcChtYXBwZWQsIFVNX0tFUk5fUEFHRV9TSVpFKTsKKwlyZXR1cm4gb2s7Cit9CisKK3Vuc2lnbmVkIGxvbmcgb3NfZ2V0X3RvcF9hZGRyZXNzKHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYSwgb2xkOworCXVuc2lnbmVkIGxvbmcgYm90dG9tID0gMDsKKwkvKgorCSAqIEEgMzItYml0IFVNTCBvbiBhIDY0LWJpdCBob3N0IGdldHMgY29uZnVzZWQgYWJvdXQgdGhlIFZEU08gYXQKKwkgKiAweGZmZmZlMDAwLiAgSXQgaXMgbWFwcGVkLCBpcyByZWFkYWJsZSwgY2FuIGJlIHJlcHJvdGVjdGVkIHdyaXRlYWJsZQorCSAqIGFuZCB3cml0dGVuLiAgSG93ZXZlciwgZXhlYyBkaXNjb3ZlcnMgbGF0ZXIgdGhhdCBpdCBjYW4ndCBiZQorCSAqIHVubWFwcGVkLiAgU28sIGp1c3Qgc2V0IHRoZSBoaWdoZXN0IGFkZHJlc3MgdG8gYmUgY2hlY2tlZCB0byBqdXN0CisJICogYmVsb3cgaXQuICBUaGlzIG1pZ2h0IHdhc3RlIHNvbWUgYWRkcmVzcyBzcGFjZSBvbiA0Ry80RyAzMi1iaXQKKwkgKiBob3N0cywgYnV0IHNob3VsZG4ndCBodXJ0IG90aGVyd2lzZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIHRvcCA9IDB4ZmZmZmQwMDAgPj4gVU1fS0VSTl9QQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgdGVzdCwgb3JpZ2luYWw7CisKKwlwcmludGYoIkxvY2F0aW5nIHRoZSBib3R0b20gb2YgdGhlIGFkZHJlc3Mgc3BhY2UgLi4uICIpOworCWZmbHVzaChzdGRvdXQpOworCisJLyoKKwkgKiBXZSdyZSBnb2luZyB0byBiZSBsb25nam1waW5nIG91dCBvZiB0aGUgc2lnbmFsIGhhbmRsZXIsIHNvCisJICogU0FfREVGRVIgbmVlZHMgdG8gYmUgc2V0LgorCSAqLworCXNhLnNhX2hhbmRsZXIgPSBzZWdmYXVsdDsKKwlzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7CisJc2Euc2FfZmxhZ3MgPSBTQV9OT0RFRkVSOworCWlmIChzaWdhY3Rpb24oU0lHU0VHViwgJnNhLCAmb2xkKSkgeworCQlwZXJyb3IoIm9zX2dldF90b3BfYWRkcmVzcyIpOworCQlleGl0KDEpOworCX0KKworCS8qIE1hbnVhbGx5IHNjYW4gdGhlIGFkZHJlc3Mgc3BhY2UsIGJvdHRvbS11cCwgdW50aWwgd2UgZmluZAorCSAqIHRoZSBmaXJzdCB2YWxpZCBwYWdlIChvciBydW4gb3V0IG9mIHRoZW0pLgorCSAqLworCWZvciAoYm90dG9tID0gMDsgYm90dG9tIDwgdG9wOyBib3R0b20rKykgeworCQlpZiAocGFnZV9vayhib3R0b20pKQorCQkJYnJlYWs7CisJfQorCisJLyogSWYgd2UndmUgZ290IHRoaXMgZmFyLCB3ZSByYW4gb3V0IG9mIHBhZ2VzLiAqLworCWlmIChib3R0b20gPT0gdG9wKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGRldGVybWluZSBib3R0b20gb2YgYWRkcmVzcyAiCisJCQkic3BhY2UuXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlwcmludGYoIjB4JXhcbiIsIGJvdHRvbSA8PCBVTV9LRVJOX1BBR0VfU0hJRlQpOworCXByaW50ZigiTG9jYXRpbmcgdGhlIHRvcCBvZiB0aGUgYWRkcmVzcyBzcGFjZSAuLi4gIik7CisJZmZsdXNoKHN0ZG91dCk7CisKKwlvcmlnaW5hbCA9IGJvdHRvbTsKKworCS8qIFRoaXMgY291bGQgaGFwcGVuIHdpdGggYSA0Ry80RyBzcGxpdCAqLworCWlmIChwYWdlX29rKHRvcCkpCisJCWdvdG8gb3V0OworCisJZG8geworCQl0ZXN0ID0gYm90dG9tICsgKHRvcCAtIGJvdHRvbSkgLyAyOworCQlpZiAocGFnZV9vayh0ZXN0KSkKKwkJCWJvdHRvbSA9IHRlc3Q7CisJCWVsc2UKKwkJCXRvcCA9IHRlc3Q7CisJfSB3aGlsZSAodG9wIC0gYm90dG9tID4gMSk7CisKK291dDoKKwkvKiBSZXN0b3JlIHRoZSBvbGQgU0lHU0VHViBoYW5kbGluZyAqLworCWlmIChzaWdhY3Rpb24oU0lHU0VHViwgJm9sZCwgTlVMTCkpIHsKKwkJcGVycm9yKCJvc19nZXRfdG9wX2FkZHJlc3MiKTsKKwkJZXhpdCgxKTsKKwl9CisJdG9wIDw8PSBVTV9LRVJOX1BBR0VfU0hJRlQ7CisJcHJpbnRmKCIweCV4XG4iLCB0b3ApOworCisJcmV0dXJuIHRvcDsKK30KKworI2Vsc2UKKwordW5zaWduZWQgbG9uZyBvc19nZXRfdG9wX2FkZHJlc3Modm9pZCkKK3sKKwkvKiBUaGUgb2xkIHZhbHVlIG9mIENPTkZJR19UT1BfQUREUiAqLworCXJldHVybiAweDdmYzAwMDAwMDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vb3MtTGludXgvdGxzLmMgYi9hcmNoL3g4Ni91bS9vcy1MaW51eC90bHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjI3NmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vb3MtTGludXgvdGxzLmMKQEAgLTAsMCArMSw2NyBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInN5c2RlcC90bHMuaCIKKworI2lmbmRlZiBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBCisjZGVmaW5lIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUEgMjUKKyNlbmRpZgorCisjaWZuZGVmIFBUUkFDRV9TRVRfVEhSRUFEX0FSRUEKKyNkZWZpbmUgUFRSQUNFX1NFVF9USFJFQURfQVJFQSAyNgorI2VuZGlmCisKKy8qIENoZWNrcyB3aGV0aGVyIGhvc3Qgc3VwcG9ydHMgVExTLCBhbmQgc2V0cyAqdGxzX21pbiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlCisgKiB2YWxpZCBvbiB0aGUgaG9zdC4KKyAqIGkzODYgaG9zdCBoYXZlIGl0ID09IDY7IHg4Nl82NCBob3N0IGhhdmUgaXQgPT0gMTIsIGZvciBpMzg2IGVtdWxhdGlvbi4gKi8KK3ZvaWQgY2hlY2tfaG9zdF9zdXBwb3J0c190bHMoaW50ICpzdXBwb3J0c190bHMsIGludCAqdGxzX21pbikKK3sKKwkvKiBWYWx1ZXMgZm9yIHg4NiBhbmQgeDg2XzY0LiovCisJaW50IHZhbFtdID0ge0dEVF9FTlRSWV9UTFNfTUlOX0kzODYsIEdEVF9FTlRSWV9UTFNfTUlOX1g4Nl82NH07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWwpOyBpKyspIHsKKwkJdXNlcl9kZXNjX3QgaW5mbzsKKwkJaW5mby5lbnRyeV9udW1iZXIgPSB2YWxbaV07CisKKwkJaWYgKHN5c2NhbGwoX19OUl9nZXRfdGhyZWFkX2FyZWEsICZpbmZvKSA9PSAwKSB7CisJCQkqdGxzX21pbiA9IHZhbFtpXTsKKwkJCSpzdXBwb3J0c190bHMgPSAxOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKGVycm5vID09IEVJTlZBTCkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKGVycm5vID09IEVOT1NZUykKKwkJCQkqc3VwcG9ydHNfdGxzID0gMDsKKwkJCQlyZXR1cm47CisJCX0KKwl9CisKKwkqc3VwcG9ydHNfdGxzID0gMDsKK30KKworaW50IG9zX3NldF90aHJlYWRfYXJlYSh1c2VyX2Rlc2NfdCAqaW5mbywgaW50IHBpZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcHRyYWNlKFBUUkFDRV9TRVRfVEhSRUFEX0FSRUEsIHBpZCwgaW5mby0+ZW50cnlfbnVtYmVyLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gLWVycm5vOworCXJldHVybiByZXQ7Cit9CisKK2ludCBvc19nZXRfdGhyZWFkX2FyZWEodXNlcl9kZXNjX3QgKmluZm8sIGludCBwaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHB0cmFjZShQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBLCBwaWQsIGluZm8tPmVudHJ5X251bWJlciwKKwkJICAgICAodW5zaWduZWQgbG9uZykgaW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldCA9IC1lcnJubzsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vcHRyYWNlXzMyLmMgYi9hcmNoL3g4Ni91bS9wdHJhY2VfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk0OWRhYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3B0cmFjZV8zMi5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgImxpbnV4L21tLmgiCisjaW5jbHVkZSAibGludXgvc2NoZWQuaCIKKyNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgorI2luY2x1ZGUgInNrYXMuaCIKKworZXh0ZXJuIGludCBhcmNoX3N3aXRjaF90bHMoc3RydWN0IHRhc2tfc3RydWN0ICp0byk7CisKK3ZvaWQgYXJjaF9zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICp0bykKK3sKKwlpbnQgZXJyID0gYXJjaF9zd2l0Y2hfdGxzKHRvKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuOworCisJaWYgKGVyciAhPSAtRUlOVkFMKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmNoX3N3aXRjaF90bHMgZmFpbGVkLCBlcnJubyAlZCwgIgorCQkgICAgICAgIm5vdCBFSU5WQUxcbiIsIC1lcnIpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJjaF9zd2l0Y2hfdGxzIGZhaWxlZCwgZXJybm8gPSBFSU5WQUxcbiIpOworfQorCitpbnQgaXNfc3lzY2FsbCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgaW5zdHI7CisJaW50IG47CisKKwluID0gY29weV9mcm9tX3VzZXIoJmluc3RyLCAodm9pZCBfX3VzZXIgKikgYWRkciwgc2l6ZW9mKGluc3RyKSk7CisJaWYgKG4pIHsKKwkJLyogYWNjZXNzX3Byb2Nlc3Nfdm0oKSBncmFudHMgYWNjZXNzIHRvIHZzeXNjYWxsIGFuZCBzdHViLAorCQkgKiB3aGlsZSBjb3B5X2Zyb21fdXNlciBkb2Vzbid0LiBNYXliZSBhY2Nlc3NfcHJvY2Vzc192bSBpcworCQkgKiBzbG93LCBidXQgdGhhdCBkb2Vzbid0IG1hdHRlciwgc2luY2UgaXQgd2lsbCBiZSBjYWxsZWQgb25seQorCQkgKiBpbiBjYXNlIG9mIHNpbmdsZXN0ZXBwaW5nLCBpZiBjb3B5X2Zyb21fdXNlciBmYWlsZWQuCisJCSAqLworCQluID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY3VycmVudCwgYWRkciwgJmluc3RyLCBzaXplb2YoaW5zdHIpLCAwKTsKKwkJaWYgKG4gIT0gc2l6ZW9mKGluc3RyKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpc19zeXNjYWxsIDogZmFpbGVkIHRvIHJlYWQgIgorCQkJICAgICAgICJpbnN0cnVjdGlvbiBmcm9tIDB4JWx4XG4iLCBhZGRyKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCS8qIGludCAweDgwIG9yIHN5c2VudGVyICovCisJcmV0dXJuIChpbnN0ciA9PSAweDgwY2QpIHx8IChpbnN0ciA9PSAweDM0MGYpOworfQorCisvKiBkZXRlcm1pbmVzIHdoaWNoIGZsYWdzIHRoZSB1c2VyIGhhcyBhY2Nlc3MgdG8uICovCisvKiAxID0gYWNjZXNzIDAgPSBubyBhY2Nlc3MgKi8KKyNkZWZpbmUgRkxBR19NQVNLIDB4MDAwNDRkZDUKKworc3RhdGljIGNvbnN0IGludCByZWdfb2Zmc2V0c1tdID0geworCVtFQlhdID0gSE9TVF9CWCwKKwlbRUNYXSA9IEhPU1RfQ1gsCisJW0VEWF0gPSBIT1NUX0RYLAorCVtFU0ldID0gSE9TVF9TSSwKKwlbRURJXSA9IEhPU1RfREksCisJW0VCUF0gPSBIT1NUX0JQLAorCVtFQVhdID0gSE9TVF9BWCwKKwlbRFNdID0gSE9TVF9EUywKKwlbRVNdID0gSE9TVF9FUywKKwlbRlNdID0gSE9TVF9GUywKKwlbR1NdID0gSE9TVF9HUywKKwlbRUlQXSA9IEhPU1RfSVAsCisJW0NTXSA9IEhPU1RfQ1MsCisJW0VGTF0gPSBIT1NUX0VGTEFHUywKKwlbVUVTUF0gPSBIT1NUX1NQLAorCVtTU10gPSBIT1NUX1NTLAorfTsKKworaW50IHB1dHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJcmVnbm8gPj49IDI7CisJc3dpdGNoIChyZWdubykgeworCWNhc2UgRUJYOgorCWNhc2UgRUNYOgorCWNhc2UgRURYOgorCWNhc2UgRVNJOgorCWNhc2UgRURJOgorCWNhc2UgRUJQOgorCWNhc2UgRUFYOgorCWNhc2UgRUlQOgorCWNhc2UgVUVTUDoKKwkJYnJlYWs7CisJY2FzZSBGUzoKKwkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBHUzoKKwkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBEUzoKKwljYXNlIEVTOgorCQlpZiAodmFsdWUgJiYgKHZhbHVlICYgMykgIT0gMykKKwkJCXJldHVybiAtRUlPOworCQl2YWx1ZSAmPSAweGZmZmY7CisJCWJyZWFrOworCWNhc2UgU1M6CisJY2FzZSBDUzoKKwkJaWYgKCh2YWx1ZSAmIDMpICE9IDMpCisJCQlyZXR1cm4gLUVJTzsKKwkJdmFsdWUgJj0gMHhmZmZmOworCQlicmVhazsKKwljYXNlIEVGTDoKKwkJdmFsdWUgJj0gRkxBR19NQVNLOworCQljaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5ncFtIT1NUX0VGTEFHU10gfD0gdmFsdWU7CisJCXJldHVybiAwOworCWNhc2UgT1JJR19FQVg6CisJCWNoaWxkLT50aHJlYWQucmVncy5yZWdzLnN5c2NhbGwgPSB2YWx1ZTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdCA6CisJCXBhbmljKCJCYWQgcmVnaXN0ZXIgaW4gcHV0cmVnKCkgOiAlZFxuIiwgcmVnbm8pOworCX0KKwljaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5ncFtyZWdfb2Zmc2V0c1tyZWdub11dID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwb2tlX3VzZXIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCit7CisJaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKGFkZHIgPCBNQVhfUkVHX09GRlNFVCkKKwkJcmV0dXJuIHB1dHJlZyhjaGlsZCwgYWRkciwgZGF0YSk7CisJZWxzZSBpZiAoKGFkZHIgPj0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pKSAmJgorCQkgKGFkZHIgPD0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbN10pKSkgeworCQlhZGRyIC09IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzBdKTsKKwkJYWRkciA9IGFkZHIgPj4gMjsKKwkJaWYgKChhZGRyID09IDQpIHx8IChhZGRyID09IDUpKQorCQkJcmV0dXJuIC1FSU87CisJCWNoaWxkLT50aHJlYWQuYXJjaC5kZWJ1Z3JlZ3NbYWRkcl0gPSBkYXRhOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0cmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGludCByZWdubykKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSB+MFVMOworCisJcmVnbm8gPj49IDI7CisJc3dpdGNoIChyZWdubykgeworCWNhc2UgT1JJR19FQVg6CisJCXJldHVybiBjaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5zeXNjYWxsOworCWNhc2UgRlM6CisJY2FzZSBHUzoKKwljYXNlIERTOgorCWNhc2UgRVM6CisJY2FzZSBTUzoKKwljYXNlIENTOgorCQltYXNrID0gMHhmZmZmOworCQlicmVhazsKKwljYXNlIEVJUDoKKwljYXNlIFVFU1A6CisJY2FzZSBFQVg6CisJY2FzZSBFQlg6CisJY2FzZSBFQ1g6CisJY2FzZSBFRFg6CisJY2FzZSBFU0k6CisJY2FzZSBFREk6CisJY2FzZSBFQlA6CisJY2FzZSBFRkw6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBhbmljKCJCYWQgcmVnaXN0ZXIgaW4gZ2V0cmVnKCkgOiAlZFxuIiwgcmVnbm8pOworCX0KKwlyZXR1cm4gbWFzayAmIGNoaWxkLT50aHJlYWQucmVncy5yZWdzLmdwW3JlZ19vZmZzZXRzW3JlZ25vXV07Cit9CisKKy8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLworaW50IHBlZWtfdXNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXRtcCA9IDA7ICAvKiBEZWZhdWx0IHJldHVybiBjb25kaXRpb24gKi8KKwlpZiAoYWRkciA8IE1BWF9SRUdfT0ZGU0VUKSB7CisJCXRtcCA9IGdldHJlZyhjaGlsZCwgYWRkcik7CisJfQorCWVsc2UgaWYgKChhZGRyID49IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzBdKSkgJiYKKwkJIChhZGRyIDw9IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzddKSkpIHsKKwkJYWRkciAtPSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSk7CisJCWFkZHIgPSBhZGRyID4+IDI7CisJCXRtcCA9IGNoaWxkLT50aHJlYWQuYXJjaC5kZWJ1Z3JlZ3NbYWRkcl07CisJfQorCXJldHVybiBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKK30KKworc3RhdGljIGludCBnZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCWludCBlcnIsIG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcHJlZ3M7CisKKwllcnIgPSBzYXZlX2ZwX3JlZ2lzdGVycyh1c2Vyc3BhY2VfcGlkW2NwdV0sICh1bnNpZ25lZCBsb25nICopICZmcHJlZ3MpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwluID0gY29weV90b191c2VyKGJ1ZiwgJmZwcmVncywgc2l6ZW9mKGZwcmVncykpOworCWlmKG4gPiAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHNldF9mcHJlZ3Moc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisJaW50IG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcHJlZ3M7CisKKwluID0gY29weV9mcm9tX3VzZXIoJmZwcmVncywgYnVmLCBzaXplb2YoZnByZWdzKSk7CisJaWYgKG4gPiAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiByZXN0b3JlX2ZwX3JlZ2lzdGVycyh1c2Vyc3BhY2VfcGlkW2NwdV0sCisJCQkJICAgICh1bnNpZ25lZCBsb25nICopICZmcHJlZ3MpOworfQorCitzdGF0aWMgaW50IGdldF9mcHhyZWdzKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCWludCBlcnIsIG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBmcHJlZ3M7CisKKwllcnIgPSBzYXZlX2ZweF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLCAodW5zaWduZWQgbG9uZyAqKSAmZnByZWdzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbiA9IGNvcHlfdG9fdXNlcihidWYsICZmcHJlZ3MsIHNpemVvZihmcHJlZ3MpKTsKKwlpZihuID4gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBzZXRfZnB4cmVncyhzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwlpbnQgbiwgY3B1ID0gKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgY2hpbGQtPnN0YWNrKS0+Y3B1OworCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IGZwcmVnczsKKworCW4gPSBjb3B5X2Zyb21fdXNlcigmZnByZWdzLCBidWYsIHNpemVvZihmcHJlZ3MpKTsKKwlpZiAobiA+IDApCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHJlc3RvcmVfZnB4X3JlZ2lzdGVycyh1c2Vyc3BhY2VfcGlkW2NwdV0sCisJCQkJICAgICAodW5zaWduZWQgbG9uZyAqKSAmZnByZWdzKTsKK30KKworbG9uZyBzdWJhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsCisJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpbnQgcmV0ID0gLUVJTzsKKwl2b2lkIF9fdXNlciAqZGF0YXAgPSAodm9pZCBfX3VzZXIgKikgZGF0YTsKKwlzd2l0Y2ggKHJlcXVlc3QpIHsKKwljYXNlIFBUUkFDRV9HRVRGUFJFR1M6IC8qIEdldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLworCQlyZXQgPSBnZXRfZnByZWdzKGRhdGFwLCBjaGlsZCk7CisJCWJyZWFrOworCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzogLyogU2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCisJCXJldCA9IHNldF9mcHJlZ3MoZGF0YXAsIGNoaWxkKTsKKwkJYnJlYWs7CisJY2FzZSBQVFJBQ0VfR0VURlBYUkVHUzogLyogR2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCisJCXJldCA9IGdldF9mcHhyZWdzKGRhdGFwLCBjaGlsZCk7CisJCWJyZWFrOworCWNhc2UgUFRSQUNFX1NFVEZQWFJFR1M6IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLworCQlyZXQgPSBzZXRfZnB4cmVncyhkYXRhcCwgY2hpbGQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlPOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vcHRyYWNlXzY0LmMgYi9hcmNoL3g4Ni91bS9wdHJhY2VfNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjUyYmYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vcHRyYWNlXzY0LmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKgorICogZGV0ZXJtaW5lcyB3aGljaCBmbGFncyB0aGUgdXNlciBoYXMgYWNjZXNzIHRvLgorICogMSA9IGFjY2VzcyAwID0gbm8gYWNjZXNzCisgKi8KKyNkZWZpbmUgRkxBR19NQVNLIDB4NDRkZDVVTAorCitzdGF0aWMgY29uc3QgaW50IHJlZ19vZmZzZXRzW10gPQoreworCVtSOCA+PiAzXSA9IEhPU1RfUjgsCisJW1I5ID4+IDNdID0gSE9TVF9SOSwKKwlbUjEwID4+IDNdID0gSE9TVF9SMTAsCisJW1IxMSA+PiAzXSA9IEhPU1RfUjExLAorCVtSMTIgPj4gM10gPSBIT1NUX1IxMiwKKwlbUjEzID4+IDNdID0gSE9TVF9SMTMsCisJW1IxNCA+PiAzXSA9IEhPU1RfUjE0LAorCVtSMTUgPj4gM10gPSBIT1NUX1IxNSwKKwlbUklQID4+IDNdID0gSE9TVF9JUCwKKwlbUlNQID4+IDNdID0gSE9TVF9TUCwKKwlbUkFYID4+IDNdID0gSE9TVF9BWCwKKwlbUkJYID4+IDNdID0gSE9TVF9CWCwKKwlbUkNYID4+IDNdID0gSE9TVF9DWCwKKwlbUkRYID4+IDNdID0gSE9TVF9EWCwKKwlbUlNJID4+IDNdID0gSE9TVF9TSSwKKwlbUkRJID4+IDNdID0gSE9TVF9ESSwKKwlbUkJQID4+IDNdID0gSE9TVF9CUCwKKwlbQ1MgPj4gM10gPSBIT1NUX0NTLAorCVtTUyA+PiAzXSA9IEhPU1RfU1MsCisJW0ZTX0JBU0UgPj4gM10gPSBIT1NUX0ZTX0JBU0UsCisJW0dTX0JBU0UgPj4gM10gPSBIT1NUX0dTX0JBU0UsCisJW0RTID4+IDNdID0gSE9TVF9EUywKKwlbRVMgPj4gM10gPSBIT1NUX0VTLAorCVtGUyA+PiAzXSA9IEhPU1RfRlMsCisJW0dTID4+IDNdID0gSE9TVF9HUywKKwlbRUZMQUdTID4+IDNdID0gSE9TVF9FRkxBR1MsCisJW09SSUdfUkFYID4+IDNdID0gSE9TVF9PUklHX0FYLAorfTsKKworaW50IHB1dHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisjaWZkZWYgVElGX0lBMzIKKwkvKgorCSAqIFNvbWUgY29kZSBpbiB0aGUgNjRiaXQgZW11bGF0aW9uIG1heSBub3QgYmUgNjRiaXQgY2xlYW4uCisJICogRG9uJ3QgdGFrZSBhbnkgY2hhbmNlcy4KKwkgKi8KKwlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9JQTMyKSkKKwkJdmFsdWUgJj0gMHhmZmZmZmZmZjsKKyNlbmRpZgorCXN3aXRjaCAocmVnbm8pIHsKKwljYXNlIFI4OgorCWNhc2UgUjk6CisJY2FzZSBSMTA6CisJY2FzZSBSMTE6CisJY2FzZSBSMTI6CisJY2FzZSBSMTM6CisJY2FzZSBSMTQ6CisJY2FzZSBSMTU6CisJY2FzZSBSSVA6CisJY2FzZSBSU1A6CisJY2FzZSBSQVg6CisJY2FzZSBSQlg6CisJY2FzZSBSQ1g6CisJY2FzZSBSRFg6CisJY2FzZSBSU0k6CisJY2FzZSBSREk6CisJY2FzZSBSQlA6CisJY2FzZSBPUklHX1JBWDoKKwkJYnJlYWs7CisKKwljYXNlIEZTOgorCWNhc2UgR1M6CisJY2FzZSBEUzoKKwljYXNlIEVTOgorCWNhc2UgU1M6CisJY2FzZSBDUzoKKwkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCisJCQlyZXR1cm4gLUVJTzsKKwkJdmFsdWUgJj0gMHhmZmZmOworCQlicmVhazsKKworCWNhc2UgRlNfQkFTRToKKwljYXNlIEdTX0JBU0U6CisJCWlmICghKCh2YWx1ZSA+PiA0OCkgPT0gMCB8fCAodmFsdWUgPj4gNDgpID09IDB4ZmZmZikpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIEVGTEFHUzoKKwkJdmFsdWUgJj0gRkxBR19NQVNLOworCQljaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5ncFtIT1NUX0VGTEFHU10gfD0gdmFsdWU7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBwdXRyZWcoKTogJWRcbiIsIHJlZ25vKTsKKwl9CisKKwljaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5ncFtyZWdfb2Zmc2V0c1tyZWdubyA+PiAzXV0gPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBva2VfdXNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoYWRkciA8IE1BWF9SRUdfT0ZGU0VUKQorCQlyZXR1cm4gcHV0cmVnKGNoaWxkLCBhZGRyLCBkYXRhKTsKKwllbHNlIGlmICgoYWRkciA+PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSkpICYmCisJCShhZGRyIDw9IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzddKSkpIHsKKwkJYWRkciAtPSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSk7CisJCWFkZHIgPSBhZGRyID4+IDI7CisJCWlmICgoYWRkciA9PSA0KSB8fCAoYWRkciA9PSA1KSkKKwkJCXJldHVybiAtRUlPOworCQljaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdID0gZGF0YTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlPOworfQorCit1bnNpZ25lZCBsb25nIGdldHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgcmVnbm8pCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gfjBVTDsKKyNpZmRlZiBUSUZfSUEzMgorCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0lBMzIpKQorCQltYXNrID0gMHhmZmZmZmZmZjsKKyNlbmRpZgorCXN3aXRjaCAocmVnbm8pIHsKKwljYXNlIFI4OgorCWNhc2UgUjk6CisJY2FzZSBSMTA6CisJY2FzZSBSMTE6CisJY2FzZSBSMTI6CisJY2FzZSBSMTM6CisJY2FzZSBSMTQ6CisJY2FzZSBSMTU6CisJY2FzZSBSSVA6CisJY2FzZSBSU1A6CisJY2FzZSBSQVg6CisJY2FzZSBSQlg6CisJY2FzZSBSQ1g6CisJY2FzZSBSRFg6CisJY2FzZSBSU0k6CisJY2FzZSBSREk6CisJY2FzZSBSQlA6CisJY2FzZSBPUklHX1JBWDoKKwljYXNlIEVGTEFHUzoKKwljYXNlIEZTX0JBU0U6CisJY2FzZSBHU19CQVNFOgorCQlicmVhazsKKwljYXNlIEZTOgorCWNhc2UgR1M6CisJY2FzZSBEUzoKKwljYXNlIEVTOgorCWNhc2UgU1M6CisJY2FzZSBDUzoKKwkJbWFzayA9IDB4ZmZmZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBnZXRyZWc6ICVkXG4iLCByZWdubyk7CisJfQorCXJldHVybiBtYXNrICYgY2hpbGQtPnRocmVhZC5yZWdzLnJlZ3MuZ3BbcmVnX29mZnNldHNbcmVnbm8gPj4gM11dOworfQorCitpbnQgcGVla191c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDApCisJCXJldHVybiAtRUlPOworCisJdG1wID0gMDsgIC8qIERlZmF1bHQgcmV0dXJuIGNvbmRpdGlvbiAqLworCWlmIChhZGRyIDwgTUFYX1JFR19PRkZTRVQpCisJCXRtcCA9IGdldHJlZyhjaGlsZCwgYWRkcik7CisJZWxzZSBpZiAoKGFkZHIgPj0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pKSAmJgorCQkoYWRkciA8PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1s3XSkpKSB7CisJCWFkZHIgLT0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pOworCQlhZGRyID0gYWRkciA+PiAyOworCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdOworCX0KKwlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKK30KKworLyogWFhYIE1vc3RseSBjb3BpZWQgZnJvbSBzeXMtaTM4NiAqLworaW50IGlzX3N5c2NhbGwodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXVuc2lnbmVkIHNob3J0IGluc3RyOworCWludCBuOworCisJbiA9IGNvcHlfZnJvbV91c2VyKCZpbnN0ciwgKHZvaWQgX191c2VyICopIGFkZHIsIHNpemVvZihpbnN0cikpOworCWlmIChuKSB7CisJCS8qCisJCSAqIGFjY2Vzc19wcm9jZXNzX3ZtKCkgZ3JhbnRzIGFjY2VzcyB0byB2c3lzY2FsbCBhbmQgc3R1YiwKKwkJICogd2hpbGUgY29weV9mcm9tX3VzZXIgZG9lc24ndC4gTWF5YmUgYWNjZXNzX3Byb2Nlc3Nfdm0gaXMKKwkJICogc2xvdywgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIsIHNpbmNlIGl0IHdpbGwgYmUgY2FsbGVkIG9ubHkKKwkJICogaW4gY2FzZSBvZiBzaW5nbGVzdGVwcGluZywgaWYgY29weV9mcm9tX3VzZXIgZmFpbGVkLgorCQkgKi8KKwkJbiA9IGFjY2Vzc19wcm9jZXNzX3ZtKGN1cnJlbnQsIGFkZHIsICZpbnN0ciwgc2l6ZW9mKGluc3RyKSwgMCk7CisJCWlmIChuICE9IHNpemVvZihpbnN0cikpIHsKKwkJCXByaW50aygiaXNfc3lzY2FsbCA6IGZhaWxlZCB0byByZWFkIGluc3RydWN0aW9uIGZyb20gIgorCQkJICAgICAgICIweCVseFxuIiwgYWRkcik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwkvKiBzeXNlbnRlciAqLworCXJldHVybiBpbnN0ciA9PSAweDA1MGY7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZwcmVncyhzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwlpbnQgZXJyLCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7CisJbG9uZyBmcHJlZ3NbSE9TVF9GUF9TSVpFXTsKKworCUJVR19PTihzaXplb2YoKmJ1ZikgIT0gc2l6ZW9mKGZwcmVncykpOworCWVyciA9IHNhdmVfZnBfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwgZnByZWdzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbiA9IGNvcHlfdG9fdXNlcihidWYsIGZwcmVncywgc2l6ZW9mKGZwcmVncykpOworCWlmIChuID4gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBzZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCWludCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7CisJbG9uZyBmcHJlZ3NbSE9TVF9GUF9TSVpFXTsKKworCUJVR19PTihzaXplb2YoKmJ1ZikgIT0gc2l6ZW9mKGZwcmVncykpOworCW4gPSBjb3B5X2Zyb21fdXNlcihmcHJlZ3MsIGJ1Ziwgc2l6ZW9mKGZwcmVncykpOworCWlmIChuID4gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gcmVzdG9yZV9mcF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLCBmcHJlZ3MpOworfQorCitsb25nIHN1YmFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwKKwkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCWludCByZXQgPSAtRUlPOworCXZvaWQgX191c2VyICpkYXRhcCA9ICh2b2lkIF9fdXNlciAqKSBkYXRhOworCisJc3dpdGNoIChyZXF1ZXN0KSB7CisJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOiAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KKwkJcmV0ID0gZ2V0X2ZwcmVncyhkYXRhcCwgY2hpbGQpOworCQlicmVhazsKKwljYXNlIFBUUkFDRV9TRVRGUFJFR1M6IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLworCQlyZXQgPSBzZXRfZnByZWdzKGRhdGFwLCBjaGlsZCk7CisJCWJyZWFrOworCWNhc2UgUFRSQUNFX0FSQ0hfUFJDVEw6CisJCS8qIFhYWCBDYWxscyBwdHJhY2Ugb24gdGhlIGhvc3QgLSBuZWVkcyBzb21lIFNNUCB0aGlua2luZyAqLworCQlyZXQgPSBhcmNoX3ByY3RsKGNoaWxkLCBkYXRhLCAodm9pZCBfX3VzZXIgKikgYWRkcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9wdHJhY2VfdXNlci5jIGIvYXJjaC94ODYvdW0vcHRyYWNlX3VzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTYwY2ExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vcHRyYWNlX3VzZXIuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKKworaW50IHB0cmFjZV9nZXRyZWdzKGxvbmcgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzX291dCkKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9HRVRSRUdTLCBwaWQsIDAsIHJlZ3Nfb3V0KSA8IDApCisJCXJldHVybiAtZXJybm87CisJcmV0dXJuIDA7Cit9CisKK2ludCBwdHJhY2Vfc2V0cmVncyhsb25nIHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9TRVRSRUdTLCBwaWQsIDAsIHJlZ3MpIDwgMCkKKwkJcmV0dXJuIC1lcnJubzsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2V0am1wLlMgYi9hcmNoL3g4Ni91bS9zZXRqbXBfMzIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9zZXRqbXAuUwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vc2V0am1wXzMyLlMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zZXRqbXAuUyBiL2FyY2gveDg2L3VtL3NldGptcF82NC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvc2V0am1wLlMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3NldGptcF82NC5TCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2FyY2hzZXRqbXAuaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzc2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDUgQEAKKyNpZmRlZiBfX2kzODZfXworI2luY2x1ZGUgImFyY2hzZXRqbXBfMzIuaCIKKyNlbHNlCisjaW5jbHVkZSAiYXJjaHNldGptcF82NC5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvYXJjaHNldGptcC5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9hcmNoc2V0am1wXzMyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9hcmNoc2V0am1wLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvYXJjaHNldGptcF8zMi5oCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9hcmNoc2V0am1wLmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2FyY2hzZXRqbXBfNjQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvYXJjaHNldGptcC5oCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2FyY2hzZXRqbXBfNjQuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9mYXVsdGluZm8uaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyZWNiMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmgKQEAgLTAsMCArMSw1IEBACisjaWZkZWYgX19pMzg2X18KKyNpbmNsdWRlICJmYXVsdGluZm9fMzIuaCIKKyNlbHNlCisjaW5jbHVkZSAiZmF1bHRpbmZvXzY0LmgiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvXzMyLmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mb18zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjA4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mb18zMi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRnVqaXRzdSBTaWVtZW5zIENvbXB1dGVycyBHbWJICisgKiBBdXRob3I6IEJvZG8gU3Ryb2Vzc2VyIDxic3Ryb2Vzc2VyQGZ1aml0c3Utc2llbWVucy5jb20+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX0ZBVUxUSU5GT19JMzg2X0gKKyNkZWZpbmUgX19GQVVMVElORk9fSTM4Nl9ICisKKy8qIHRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBmdWxsIGFyY2gtc3BlY2lmaWMgZmF1bHRpbmZvCisgKiBmcm9tIHRoZSB0cmFwcy4KKyAqIE9uIGkzODYsIHB0cmFjZV9mYXVsdGluZm8gdW5mb3J0dW5hdGVseSBkb2Vzbid0IHByb3ZpZGUKKyAqIGFsbCB0aGUgaW5mbywgc2luY2UgdHJhcF9ubyBpcyBtaXNzaW5nLgorICogQWxsIGNvbW1vbiBlbGVtZW50cyBhcmUgZGVmaW5lZCBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbgorICogYm90aCBzdHJ1Y3R1cmVzLCB0aHVzIG1ha2luZyBpdCBlYXN5IHRvIGNvcHkgdGhlCisgKiBjb250ZW50cyB3aXRob3V0IGtub3dsZWRnZSBhYm91dCB0aGUgc3RydWN0dXJlIGVsZW1lbnRzLgorICovCitzdHJ1Y3QgZmF1bHRpbmZvIHsKKyAgICAgICAgaW50IGVycm9yX2NvZGU7IC8qIGluIHB0cmFjZV9mYXVsdGluZm8gbWlzbGVhZGluZ2x5IGNhbGxlZCBpc193cml0ZSAqLworICAgICAgICB1bnNpZ25lZCBsb25nIGNyMjsgLyogaW4gcHRyYWNlX2ZhdWx0aW5mbyBjYWxsZWQgYWRkciAqLworICAgICAgICBpbnQgdHJhcF9ubzsgLyogbWlzc2luZyBpbiBwdHJhY2VfZmF1bHRpbmZvICovCit9OworCisjZGVmaW5lIEZBVUxUX1dSSVRFKGZpKSAoKGZpKS5lcnJvcl9jb2RlICYgMikKKyNkZWZpbmUgRkFVTFRfQUREUkVTUyhmaSkgKChmaSkuY3IyKQorCisvKiBUaGlzIGlzIFBhZ2UgRmF1bHQgKi8KKyNkZWZpbmUgU0VHVl9JU19GSVhBQkxFKGZpKQkoKGZpKS0+dHJhcF9ubyA9PSAxNCkKKworLyogU0tBUzMgaGFzIG5vIHRyYXBfbm8gb24gaTM4NiwgYnV0IGdldF9za2FzX2ZhdWx0aW5mbygpIHNldHMgaXQgdG8gMC4gKi8KKyNkZWZpbmUgU0VHVl9NQVlCRV9GSVhBQkxFKGZpKQkoKGZpKS0+dHJhcF9ubyA9PSAwICYmIHB0cmFjZV9mYXVsdGluZm8pCisKKyNkZWZpbmUgUFRSQUNFX0ZVTExfRkFVTFRJTkZPIDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mb182NC5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9mYXVsdGluZm9fNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODExY2JlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9mYXVsdGluZm9fNjQuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEZ1aml0c3UgU2llbWVucyBDb21wdXRlcnMgR21iSAorICogQXV0aG9yOiBCb2RvIFN0cm9lc3NlciA8YnN0cm9lc3NlckBmdWppdHN1LXNpZW1lbnMuY29tPgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19GQVVMVElORk9fWDg2XzY0X0gKKyNkZWZpbmUgX19GQVVMVElORk9fWDg2XzY0X0gKKworLyogdGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZ1bGwgYXJjaC1zcGVjaWZpYyBmYXVsdGluZm8KKyAqIGZyb20gdGhlIHRyYXBzLgorICogT24gaTM4NiwgcHRyYWNlX2ZhdWx0aW5mbyB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QgcHJvdmlkZQorICogYWxsIHRoZSBpbmZvLCBzaW5jZSB0cmFwX25vIGlzIG1pc3NpbmcuCisgKiBBbGwgY29tbW9uIGVsZW1lbnRzIGFyZSBkZWZpbmVkIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluCisgKiBib3RoIHN0cnVjdHVyZXMsIHRodXMgbWFraW5nIGl0IGVhc3kgdG8gY29weSB0aGUKKyAqIGNvbnRlbnRzIHdpdGhvdXQga25vd2xlZGdlIGFib3V0IHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMuCisgKi8KK3N0cnVjdCBmYXVsdGluZm8geworICAgICAgICBpbnQgZXJyb3JfY29kZTsgLyogaW4gcHRyYWNlX2ZhdWx0aW5mbyBtaXNsZWFkaW5nbHkgY2FsbGVkIGlzX3dyaXRlICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgY3IyOyAvKiBpbiBwdHJhY2VfZmF1bHRpbmZvIGNhbGxlZCBhZGRyICovCisgICAgICAgIGludCB0cmFwX25vOyAvKiBtaXNzaW5nIGluIHB0cmFjZV9mYXVsdGluZm8gKi8KK307CisKKyNkZWZpbmUgRkFVTFRfV1JJVEUoZmkpICgoZmkpLmVycm9yX2NvZGUgJiAyKQorI2RlZmluZSBGQVVMVF9BRERSRVNTKGZpKSAoKGZpKS5jcjIpCisKKy8qIFRoaXMgaXMgUGFnZSBGYXVsdCAqLworI2RlZmluZSBTRUdWX0lTX0ZJWEFCTEUoZmkpCSgoZmkpLT50cmFwX25vID09IDE0KQorCisvKiBObyBicm9rZW4gU0tBUyBBUEksIHdoaWNoIGRvZXNuJ3QgcGFzcyB0cmFwX25vLCBoZXJlLiAqLworI2RlZmluZSBTRUdWX01BWUJFX0ZJWEFCTEUoZmkpCTAKKworI2RlZmluZSBQVFJBQ0VfRlVMTF9GQVVMVElORk8gMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9rZXJuZWwtb2Zmc2V0cy5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9rZXJuZWwtb2Zmc2V0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAva2VybmVsLW9mZnNldHMuaApyZW5hbWUgdG8gYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9rZXJuZWwtb2Zmc2V0cy5oCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL21jb250ZXh0LmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL21jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyNGM1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvbWNvbnRleHQuaApAQCAtMCwwICsxLDMxIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TWVNfU0lHQ09OVEVYVF9YODZfSAorI2RlZmluZSBfX1NZU19TSUdDT05URVhUX1g4Nl9ICisKK2V4dGVybiB2b2lkIGdldF9yZWdzX2Zyb21fbWMoc3RydWN0IHVtbF9wdF9yZWdzICosIG1jb250ZXh0X3QgKik7CisKKyNpZmRlZiBfX2kzODZfXworCisjZGVmaW5lIEdFVF9GQVVMVElORk9fRlJPTV9NQyhmaSwgbWMpIFwKKwl7IFwKKwkJKGZpKS5jcjIgPSAobWMpLT5jcjI7IFwKKwkJKGZpKS5lcnJvcl9jb2RlID0gKG1jKS0+Z3JlZ3NbUkVHX0VSUl07IFwKKwkJKGZpKS50cmFwX25vID0gKG1jKS0+Z3JlZ3NbUkVHX1RSQVBOT107IFwKKwl9CisKKyNlbHNlCisKKyNkZWZpbmUgR0VUX0ZBVUxUSU5GT19GUk9NX01DKGZpLCBtYykgXAorCXsgXAorCQkoZmkpLmNyMiA9IChtYyktPmdyZWdzW1JFR19DUjJdOyBcCisJCShmaSkuZXJyb3JfY29kZSA9IChtYyktPmdyZWdzW1JFR19FUlJdOyBcCisJCShmaSkudHJhcF9ubyA9IChtYyktPmdyZWdzW1JFR19UUkFQTk9dOyBcCisJfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3B0cmFjZS5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFiMTYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2UuaApAQCAtMCwwICsxLDUgQEAKKyNpZmRlZiBfX2kzODZfXworI2luY2x1ZGUgInB0cmFjZV8zMi5oIgorI2Vsc2UKKyNpbmNsdWRlICJwdHJhY2VfNjQuaCIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2VfMzIuaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvcHRyYWNlXzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmZDFkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvcHRyYWNlXzMyLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX0kzODZfUFRSQUNFX0gKKyNkZWZpbmUgX19TWVNERVBfSTM4Nl9QVFJBQ0VfSAorCisjaW5jbHVkZSA8Z2VuZXJhdGVkL3VzZXJfY29uc3RhbnRzLmg+CisjaW5jbHVkZSAic3lzZGVwL2ZhdWx0aW5mby5oIgorCisjZGVmaW5lIE1BWF9SRUdfTlIgKFVNX0ZSQU1FX1NJWkUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpCisjZGVmaW5lIE1BWF9SRUdfT0ZGU0VUIChVTV9GUkFNRV9TSVpFKQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2RlYnVncmVncyhpbnQgc2VxKSB7fQorCisvKiBzeXNjYWxsIGVtdWxhdGlvbiBwYXRoIGluIHB0cmFjZSAqLworCisjaWZuZGVmIFBUUkFDRV9TWVNFTVUKKyNkZWZpbmUgUFRSQUNFX1NZU0VNVSAzMQorI2VuZGlmCisKK3ZvaWQgc2V0X3VzaW5nX3N5c2VtdShpbnQgdmFsdWUpOworaW50IGdldF91c2luZ19zeXNlbXUodm9pZCk7CitleHRlcm4gaW50IHN5c2VtdV9zdXBwb3J0ZWQ7CisKKyNkZWZpbmUgUkVHU19JUChyKSAoKHIpW0hPU1RfSVBdKQorI2RlZmluZSBSRUdTX1NQKHIpICgocilbSE9TVF9TUF0pCisjZGVmaW5lIFJFR1NfRUZMQUdTKHIpICgocilbSE9TVF9FRkxBR1NdKQorI2RlZmluZSBSRUdTX0VBWChyKSAoKHIpW0hPU1RfQVhdKQorI2RlZmluZSBSRUdTX0VCWChyKSAoKHIpW0hPU1RfQlhdKQorI2RlZmluZSBSRUdTX0VDWChyKSAoKHIpW0hPU1RfQ1hdKQorI2RlZmluZSBSRUdTX0VEWChyKSAoKHIpW0hPU1RfRFhdKQorI2RlZmluZSBSRUdTX0VTSShyKSAoKHIpW0hPU1RfU0ldKQorI2RlZmluZSBSRUdTX0VESShyKSAoKHIpW0hPU1RfREldKQorI2RlZmluZSBSRUdTX0VCUChyKSAoKHIpW0hPU1RfQlBdKQorI2RlZmluZSBSRUdTX0NTKHIpICgocilbSE9TVF9DU10pCisjZGVmaW5lIFJFR1NfU1MocikgKChyKVtIT1NUX1NTXSkKKyNkZWZpbmUgUkVHU19EUyhyKSAoKHIpW0hPU1RfRFNdKQorI2RlZmluZSBSRUdTX0VTKHIpICgocilbSE9TVF9FU10pCisjZGVmaW5lIFJFR1NfRlMocikgKChyKVtIT1NUX0ZTXSkKKyNkZWZpbmUgUkVHU19HUyhyKSAoKHIpW0hPU1RfR1NdKQorCisjZGVmaW5lIFJFR1NfU0VUX1NZU0NBTExfUkVUVVJOKHIsIHJlcykgUkVHU19FQVgocikgPSAocmVzKQorCisjZGVmaW5lIElQX1JFU1RBUlRfU1lTQ0FMTChpcCkgKChpcCkgLT0gMikKKyNkZWZpbmUgUkVHU19SRVNUQVJUX1NZU0NBTEwocikgSVBfUkVTVEFSVF9TWVNDQUxMKFJFR1NfSVAocikpCisKKyNpZm5kZWYgUFRSQUNFX1NZU0VNVV9TSU5HTEVTVEVQCisjZGVmaW5lIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUCAzMgorI2VuZGlmCisKK3N0cnVjdCB1bWxfcHRfcmVncyB7CisJdW5zaWduZWQgbG9uZyBncFtNQVhfUkVHX05SXTsKKwl1bnNpZ25lZCBsb25nIGZwW0hPU1RfRlBYX1NJWkVdOworCXN0cnVjdCBmYXVsdGluZm8gZmF1bHRpbmZvOworCWxvbmcgc3lzY2FsbDsKKwlpbnQgaXNfdXNlcjsKK307CisKKyNkZWZpbmUgRU1QVFlfVU1MX1BUX1JFR1MgeyB9CisKKyNkZWZpbmUgVVBUX0lQKHIpIFJFR1NfSVAoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1NQKHIpIFJFR1NfU1AoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0VGTEFHUyhyKSBSRUdTX0VGTEFHUygociktPmdwKQorI2RlZmluZSBVUFRfRUFYKHIpIFJFR1NfRUFYKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9FQlgocikgUkVHU19FQlgoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0VDWChyKSBSRUdTX0VDWCgociktPmdwKQorI2RlZmluZSBVUFRfRURYKHIpIFJFR1NfRURYKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9FU0kocikgUkVHU19FU0koKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0VESShyKSBSRUdTX0VESSgociktPmdwKQorI2RlZmluZSBVUFRfRUJQKHIpIFJFR1NfRUJQKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9PUklHX0VBWChyKSAoKHIpLT5zeXNjYWxsKQorI2RlZmluZSBVUFRfQ1MocikgUkVHU19DUygociktPmdwKQorI2RlZmluZSBVUFRfU1MocikgUkVHU19TUygociktPmdwKQorI2RlZmluZSBVUFRfRFMocikgUkVHU19EUygociktPmdwKQorI2RlZmluZSBVUFRfRVMocikgUkVHU19FUygociktPmdwKQorI2RlZmluZSBVUFRfRlMocikgUkVHU19GUygociktPmdwKQorI2RlZmluZSBVUFRfR1MocikgUkVHU19HUygociktPmdwKQorCisjZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzEocikgVVBUX0VCWChyKQorI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkcyKHIpIFVQVF9FQ1gocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHMyhyKSBVUFRfRURYKHIpCisjZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzQocikgVVBUX0VTSShyKQorI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc1KHIpIFVQVF9FREkocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHNihyKSBVUFRfRUJQKHIpCisKK2V4dGVybiBpbnQgdXNlcl9jb250ZXh0KHVuc2lnbmVkIGxvbmcgc3ApOworCisjZGVmaW5lIFVQVF9JU19VU0VSKHIpICgociktPmlzX3VzZXIpCisKK3N0cnVjdCBzeXNjYWxsX2FyZ3MgeworCXVuc2lnbmVkIGxvbmcgYXJnc1s2XTsKK307CisKKyNkZWZpbmUgU1lTQ0FMTF9BUkdTKHIpICgoc3RydWN0IHN5c2NhbGxfYXJncykgXAorCQkJIHsgLmFyZ3MgPSB7IFVQVF9TWVNDQUxMX0FSRzEociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzIociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzMociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzQociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzUociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzYocikgfSB9ICkKKworI2RlZmluZSBVUFRfUkVTVEFSVF9TWVNDQUxMKHIpIFJFR1NfUkVTVEFSVF9TWVNDQUxMKChyKS0+Z3ApCisKKyNkZWZpbmUgVVBUX09SSUdfU1lTQ0FMTChyKSBVUFRfRUFYKHIpCisjZGVmaW5lIFVQVF9TWVNDQUxMX05SKHIpIFVQVF9PUklHX0VBWChyKQorI2RlZmluZSBVUFRfU1lTQ0FMTF9SRVQocikgVVBUX0VBWChyKQorCisjZGVmaW5lIFVQVF9GQVVMVElORk8ocikgKCYociktPmZhdWx0aW5mbykKKworZXh0ZXJuIHZvaWQgYXJjaF9pbml0X3JlZ2lzdGVycyhpbnQgcGlkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3B0cmFjZV82NC5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2VfNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFlZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2VfNjQuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TWVNERVBfWDg2XzY0X1BUUkFDRV9ICisjZGVmaW5lIF9fU1lTREVQX1g4Nl82NF9QVFJBQ0VfSAorCisjaW5jbHVkZSA8Z2VuZXJhdGVkL3VzZXJfY29uc3RhbnRzLmg+CisjaW5jbHVkZSAic3lzZGVwL2ZhdWx0aW5mby5oIgorCisjZGVmaW5lIE1BWF9SRUdfT0ZGU0VUIChVTV9GUkFNRV9TSVpFKQorI2RlZmluZSBNQVhfUkVHX05SICgoTUFYX1JFR19PRkZTRVQpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisjZGVmaW5lIFJFR1NfSVAocikgKChyKVtIT1NUX0lQXSkKKyNkZWZpbmUgUkVHU19TUChyKSAoKHIpW0hPU1RfU1BdKQorCisjZGVmaW5lIFJFR1NfUkJYKHIpICgocilbSE9TVF9CWF0pCisjZGVmaW5lIFJFR1NfUkNYKHIpICgocilbSE9TVF9DWF0pCisjZGVmaW5lIFJFR1NfUkRYKHIpICgocilbSE9TVF9EWF0pCisjZGVmaW5lIFJFR1NfUlNJKHIpICgocilbSE9TVF9TSV0pCisjZGVmaW5lIFJFR1NfUkRJKHIpICgocilbSE9TVF9ESV0pCisjZGVmaW5lIFJFR1NfUkJQKHIpICgocilbSE9TVF9CUF0pCisjZGVmaW5lIFJFR1NfUkFYKHIpICgocilbSE9TVF9BWF0pCisjZGVmaW5lIFJFR1NfUjgocikgKChyKVtIT1NUX1I4XSkKKyNkZWZpbmUgUkVHU19SOShyKSAoKHIpW0hPU1RfUjldKQorI2RlZmluZSBSRUdTX1IxMChyKSAoKHIpW0hPU1RfUjEwXSkKKyNkZWZpbmUgUkVHU19SMTEocikgKChyKVtIT1NUX1IxMV0pCisjZGVmaW5lIFJFR1NfUjEyKHIpICgocilbSE9TVF9SMTJdKQorI2RlZmluZSBSRUdTX1IxMyhyKSAoKHIpW0hPU1RfUjEzXSkKKyNkZWZpbmUgUkVHU19SMTQocikgKChyKVtIT1NUX1IxNF0pCisjZGVmaW5lIFJFR1NfUjE1KHIpICgocilbSE9TVF9SMTVdKQorI2RlZmluZSBSRUdTX0NTKHIpICgocilbSE9TVF9DU10pCisjZGVmaW5lIFJFR1NfRUZMQUdTKHIpICgocilbSE9TVF9FRkxBR1NdKQorI2RlZmluZSBSRUdTX1NTKHIpICgocilbSE9TVF9TU10pCisKKyNkZWZpbmUgSE9TVF9GU19CQVNFIDIxCisjZGVmaW5lIEhPU1RfR1NfQkFTRSAyMgorI2RlZmluZSBIT1NUX0RTIDIzCisjZGVmaW5lIEhPU1RfRVMgMjQKKyNkZWZpbmUgSE9TVF9GUyAyNQorI2RlZmluZSBIT1NUX0dTIDI2CisKKy8qIEFsc28gZGVmaW5lZCBpbiBhc20vcHRyYWNlLXg4Nl82NC5oLCBidXQgbm90IGluIGxpYmMgaGVhZGVycy4gIFNvLCB0aGVzZQorICogYXJlIGFscmVhZHkgZGVmaW5lZCBmb3Iga2VybmVsIGNvZGUsIGJ1dCBub3QgZm9yIHVzZXJzcGFjZSBjb2RlLgorICovCisjaWZuZGVmIEZTX0JBU0UKKy8qIFRoZXNlIGFyZW4ndCBkZWZpbmVkIGluIHB0cmFjZS5oLCBidXQgZXhpc3QgaW4gc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QsCisgKiB3aGljaCBpcyB3aGF0IHg4Nl82NCBwdHJhY2UgYWN0dWFsbHkgdXNlcy4KKyAqLworI2RlZmluZSBGU19CQVNFIChIT1NUX0ZTX0JBU0UgKiBzaXplb2YobG9uZykpCisjZGVmaW5lIEdTX0JBU0UgKEhPU1RfR1NfQkFTRSAqIHNpemVvZihsb25nKSkKKyNkZWZpbmUgRFMgKEhPU1RfRFMgKiBzaXplb2YobG9uZykpCisjZGVmaW5lIEVTIChIT1NUX0VTICogc2l6ZW9mKGxvbmcpKQorI2RlZmluZSBGUyAoSE9TVF9GUyAqIHNpemVvZihsb25nKSkKKyNkZWZpbmUgR1MgKEhPU1RfR1MgKiBzaXplb2YobG9uZykpCisjZW5kaWYKKworI2RlZmluZSBSRUdTX0ZTX0JBU0UocikgKChyKVtIT1NUX0ZTX0JBU0VdKQorI2RlZmluZSBSRUdTX0dTX0JBU0UocikgKChyKVtIT1NUX0dTX0JBU0VdKQorI2RlZmluZSBSRUdTX0RTKHIpICgocilbSE9TVF9EU10pCisjZGVmaW5lIFJFR1NfRVMocikgKChyKVtIT1NUX0VTXSkKKyNkZWZpbmUgUkVHU19GUyhyKSAoKHIpW0hPU1RfRlNdKQorI2RlZmluZSBSRUdTX0dTKHIpICgocilbSE9TVF9HU10pCisKKyNkZWZpbmUgUkVHU19PUklHX1JBWChyKSAoKHIpW0hPU1RfT1JJR19BWF0pCisKKyNkZWZpbmUgUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4ociwgcmVzKSBSRUdTX1JBWChyKSA9IChyZXMpCisKKyNkZWZpbmUgSVBfUkVTVEFSVF9TWVNDQUxMKGlwKSAoKGlwKSAtPSAyKQorI2RlZmluZSBSRUdTX1JFU1RBUlRfU1lTQ0FMTChyKSBJUF9SRVNUQVJUX1NZU0NBTEwoUkVHU19JUChyKSkKKworI2RlZmluZSBSRUdTX0ZBVUxUX0FERFIocikgKChyKS0+ZmF1bHRfYWRkcikKKworI2RlZmluZSBSRUdTX0ZBVUxUX1dSSVRFKHIpIEZBVUxUX1dSSVRFKChyKS0+ZmF1bHRfdHlwZSkKKworI2RlZmluZSBSRUdTX1RSQVAocikgKChyKS0+dHJhcF90eXBlKQorCisjZGVmaW5lIFJFR1NfRVJSKHIpICgociktPmZhdWx0X3R5cGUpCisKK3N0cnVjdCB1bWxfcHRfcmVncyB7CisJdW5zaWduZWQgbG9uZyBncFtNQVhfUkVHX05SXTsKKwl1bnNpZ25lZCBsb25nIGZwW0hPU1RfRlBfU0laRV07CisJc3RydWN0IGZhdWx0aW5mbyBmYXVsdGluZm87CisJbG9uZyBzeXNjYWxsOworCWludCBpc191c2VyOworfTsKKworI2RlZmluZSBFTVBUWV9VTUxfUFRfUkVHUyB7IH0KKworI2RlZmluZSBVUFRfUkJYKHIpIFJFR1NfUkJYKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SQ1gocikgUkVHU19SQ1goKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1JEWChyKSBSRUdTX1JEWCgociktPmdwKQorI2RlZmluZSBVUFRfUlNJKHIpIFJFR1NfUlNJKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SREkocikgUkVHU19SREkoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1JCUChyKSBSRUdTX1JCUCgociktPmdwKQorI2RlZmluZSBVUFRfUkFYKHIpIFJFR1NfUkFYKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SOChyKSBSRUdTX1I4KChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SOShyKSBSRUdTX1I5KChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SMTAocikgUkVHU19SMTAoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1IxMShyKSBSRUdTX1IxMSgociktPmdwKQorI2RlZmluZSBVUFRfUjEyKHIpIFJFR1NfUjEyKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SMTMocikgUkVHU19SMTMoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1IxNChyKSBSRUdTX1IxNCgociktPmdwKQorI2RlZmluZSBVUFRfUjE1KHIpIFJFR1NfUjE1KChyKS0+Z3ApCisjZGVmaW5lIFVQVF9DUyhyKSBSRUdTX0NTKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9GU19CQVNFKHIpIFJFR1NfRlNfQkFTRSgociktPmdwKQorI2RlZmluZSBVUFRfRlMocikgUkVHU19GUygociktPmdwKQorI2RlZmluZSBVUFRfR1NfQkFTRShyKSBSRUdTX0dTX0JBU0UoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0dTKHIpIFJFR1NfR1MoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0RTKHIpIFJFR1NfRFMoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0VTKHIpIFJFR1NfRVMoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0NTKHIpIFJFR1NfQ1MoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1NTKHIpIFJFR1NfU1MoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX09SSUdfUkFYKHIpIFJFR1NfT1JJR19SQVgoKHIpLT5ncCkKKworI2RlZmluZSBVUFRfSVAocikgUkVHU19JUCgociktPmdwKQorI2RlZmluZSBVUFRfU1AocikgUkVHU19TUCgociktPmdwKQorCisjZGVmaW5lIFVQVF9FRkxBR1MocikgUkVHU19FRkxBR1MoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1NZU0NBTExfTlIocikgKChyKS0+c3lzY2FsbCkKKyNkZWZpbmUgVVBUX1NZU0NBTExfUkVUKHIpIFVQVF9SQVgocikKKworZXh0ZXJuIGludCB1c2VyX2NvbnRleHQodW5zaWduZWQgbG9uZyBzcCk7CisKKyNkZWZpbmUgVVBUX0lTX1VTRVIocikgKChyKS0+aXNfdXNlcikKKworI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkcxKHIpIFVQVF9SREkocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHMihyKSBVUFRfUlNJKHIpCisjZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzMocikgVVBUX1JEWChyKQorI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc0KHIpIFVQVF9SMTAocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHNShyKSBVUFRfUjgocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHNihyKSBVUFRfUjkocikKKworc3RydWN0IHN5c2NhbGxfYXJncyB7CisJdW5zaWduZWQgbG9uZyBhcmdzWzZdOworfTsKKworI2RlZmluZSBTWVNDQUxMX0FSR1MocikgKChzdHJ1Y3Qgc3lzY2FsbF9hcmdzKSBcCisJCQkgeyAuYXJncyA9IHsgVVBUX1NZU0NBTExfQVJHMShyKSwJIFwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzIociksCSBcCisJCQkJICAgICBVUFRfU1lTQ0FMTF9BUkczKHIpLAkgXAorCQkJCSAgICAgVVBUX1NZU0NBTExfQVJHNChyKSwJIFwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzUociksCSBcCisJCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc2KHIpIH0gfSApCisKKyNkZWZpbmUgVVBUX1JFU1RBUlRfU1lTQ0FMTChyKSBSRUdTX1JFU1RBUlRfU1lTQ0FMTCgociktPmdwKQorCisjZGVmaW5lIFVQVF9GQVVMVElORk8ocikgKCYociktPmZhdWx0aW5mbykKKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaW5pdF9yZWdpc3RlcnMoaW50IHBpZCkKK3sKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3B0cmFjZV91c2VyLmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3B0cmFjZV91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjZDZiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvcHRyYWNlX3VzZXIuaApAQCAtMCwwICsxLDI3IEBACisjaW5jbHVkZSA8Z2VuZXJhdGVkL3VzZXJfY29uc3RhbnRzLmg+CisKKyNkZWZpbmUgUFRfT0ZGU0VUKHIpICgocikgKiBzaXplb2YobG9uZykpCisKKyNkZWZpbmUgUFRfU1lTQ0FMTF9OUihyZWdzKSAoKHJlZ3MpW0hPU1RfT1JJR19BWF0pCisjZGVmaW5lIFBUX1NZU0NBTExfTlJfT0ZGU0VUIFBUX09GRlNFVChIT1NUX09SSUdfQVgpCisKKyNkZWZpbmUgUFRfU1lTQ0FMTF9SRVRfT0ZGU0VUIFBUX09GRlNFVChIT1NUX0FYKQorCisjZGVmaW5lIFJFR1NfSVBfSU5ERVggSE9TVF9JUAorI2RlZmluZSBSRUdTX1NQX0lOREVYIEhPU1RfU1AKKworI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIEZQX1NJWkUgKChIT1NUX0ZQWF9TSVpFID4gSE9TVF9GUF9TSVpFKSA/IEhPU1RfRlBYX1NJWkUgOiBIT1NUX0ZQX1NJWkUpCisjZWxzZQorI2RlZmluZSBGUF9TSVpFIEhPU1RfRlBfU0laRQorCisvKgorICogeDg2XzY0IEZDMyBkb2Vzbid0IGRlZmluZSB0aGlzIGluIC91c3IvaW5jbHVkZS9saW51eC9wdHJhY2UuaCBldmVuIHRob3VnaAorICogaXQncyBkZWZpbmVkIGluIHRoZSBrZXJuZWwncyBpbmNsdWRlL2xpbnV4L3B0cmFjZS5oLiBBZGRpdGlvbmFsbHksIHVzZSB0aGUKKyAqIDIuNCBuYW1lIGFuZCB2YWx1ZSBmb3IgMi40IGhvc3QgY29tcGF0aWJpbGl0eS4KKyAqLworI2lmbmRlZiBQVFJBQ0VfT0xEU0VUT1BUSU9OUworI2RlZmluZSBQVFJBQ0VfT0xEU0VUT1BUSU9OUyAyMQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1M2ZlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3NrYXNfcHRyYWNlLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX1NZU0RFUF9YODZfU0tBU19QVFJBQ0VfSAorI2RlZmluZSBfX1NZU0RFUF9YODZfU0tBU19QVFJBQ0VfSAorCitzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbyB7CisgICAgICAgIGludCBpc193cml0ZTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyOworfTsKKworc3RydWN0IHB0cmFjZV9sZHQgeworICAgICAgICBpbnQgZnVuYzsKKyAgICAgICAgdm9pZCAqcHRyOworICAgICAgICB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudDsKK307CisKKyNkZWZpbmUgUFRSQUNFX0xEVCA1NAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3R1Yi5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxNjFlMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3R1Yi5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJhcy1sYXlvdXQuaCIKKyNpbmNsdWRlICJzdHViLWRhdGEuaCIKKworI2lmZGVmIF9faTM4Nl9fCisjaW5jbHVkZSAic3R1Yl8zMi5oIgorI2Vsc2UKKyNpbmNsdWRlICJzdHViXzY0LmgiCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgc3R1Yl9zZWd2X2hhbmRsZXIoaW50LCBzaWdpbmZvX3QgKiwgdm9pZCAqKTsKK2V4dGVybiB2b2lkIHN0dWJfY2xvbmVfaGFuZGxlcih2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3R1Yl8zMi5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zdHViXzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmZDI1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3R1Yl8zMi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1NUVUJfSAorI2RlZmluZSBfX1NZU0RFUF9TVFVCX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworI2RlZmluZSBTVFVCX1NZU0NBTExfUkVUIEVBWAorI2RlZmluZSBTVFVCX01NQVBfTlIgX19OUl9tbWFwMgorI2RlZmluZSBNTUFQX09GRlNFVChvKSAoKG8pID4+IFVNX0tFUk5fUEFHRV9TSElGVCkKKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDAobG9uZyBzeXNjYWxsKQoreworCWxvbmcgcmV0OworCisJX19hc21fXyB2b2xhdGlsZSAoImludCAkMHg4MCIgOiAiPWEiIChyZXQpIDogIjAiIChzeXNjYWxsKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMShsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSkKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDIobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMikKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSksCisJCQkiYyIgKGFyZzIpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwzKGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMykKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSksCisJCQkiYyIgKGFyZzIpLCAiZCIgKGFyZzMpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw0KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKKwkJCQkgbG9uZyBhcmc0KQoreworCWxvbmcgcmV0OworCisJX19hc21fXyB2b2xhdGlsZSAoImludCAkMHg4MCIgOiAiPWEiIChyZXQpIDogIjAiIChzeXNjYWxsKSwgImIiIChhcmcxKSwKKwkJCSJjIiAoYXJnMiksICJkIiAoYXJnMyksICJTIiAoYXJnNCkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDUobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczLAorCQkJCSBsb25nIGFyZzQsIGxvbmcgYXJnNSkKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSksCisJCQkiYyIgKGFyZzIpLCAiZCIgKGFyZzMpLCAiUyIgKGFyZzQpLCAiRCIgKGFyZzUpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFwX215c2VsZih2b2lkKQoreworCV9fYXNtKCJpbnQzIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1hcF9zdGFjayhpbnQgZmQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCV9fYXNtX18gdm9sYXRpbGUgKCJtb3ZsICUlZWF4LCUlZWJwIDsgbW92bCAlMCwlJWVheCA7IGludCAkMHg4MCA7IgorCQkJICAibW92bCAlNywgJSVlYnggOyBtb3ZsICUlZWF4LCAoJSVlYngpIgorCQkJICA6IDogImciIChTVFVCX01NQVBfTlIpLCAiYiIgKFNUVUJfREFUQSksCisJCQkgICAgImMiIChVTV9LRVJOX1BBR0VfU0laRSksCisJCQkgICAgImQiIChQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSwKKwkJCSAgICAiUyIgKE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQpLCAiRCIgKGZkKSwKKwkJCSAgICAiYSIgKG9mZnNldCksCisJCQkgICAgImkiICgmKChzdHJ1Y3Qgc3R1Yl9kYXRhICopIFNUVUJfREFUQSktPmVycikKKwkJCSAgOiAibWVtb3J5Iik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zdHViXzY0LmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3N0dWJfNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRkZjkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zdHViXzY0LmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TWVNERVBfU1RVQl9ICisjZGVmaW5lIF9fU1lTREVQX1NUVUJfSAorCisjaW5jbHVkZSA8c3lzZGVwL3B0cmFjZV91c2VyLmg+CisKKyNkZWZpbmUgU1RVQl9TWVNDQUxMX1JFVCBQVF9JTkRFWChSQVgpCisjZGVmaW5lIFNUVUJfTU1BUF9OUiBfX05SX21tYXAKKyNkZWZpbmUgTU1BUF9PRkZTRVQobykgKG8pCisKKyNkZWZpbmUgX19zeXNjYWxsX2Nsb2JiZXIgInIxMSIsInJjeCIsIm1lbW9yeSIKKyNkZWZpbmUgX19zeXNjYWxsICJzeXNjYWxsIgorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMChsb25nIHN5c2NhbGwpCit7CisJbG9uZyByZXQ7CisKKwlfX2FzbV9fIHZvbGF0aWxlIChfX3N5c2NhbGwKKwkJOiAiPWEiIChyZXQpCisJCTogIjAiIChzeXNjYWxsKSA6IF9fc3lzY2FsbF9jbG9iYmVyICk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMihsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyKQoreworCWxvbmcgcmV0OworCisJX19hc21fXyB2b2xhdGlsZSAoX19zeXNjYWxsCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoc3lzY2FsbCksICJEIiAoYXJnMSksICJTIiAoYXJnMikgOiBfX3N5c2NhbGxfY2xvYmJlciApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDMobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczKQoreworCWxvbmcgcmV0OworCisJX19hc21fXyB2b2xhdGlsZSAoX19zeXNjYWxsCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoc3lzY2FsbCksICJEIiAoYXJnMSksICJTIiAoYXJnMiksICJkIiAoYXJnMykKKwkJOiBfX3N5c2NhbGxfY2xvYmJlciApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDQobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczLAorCQkJCSBsb25nIGFyZzQpCit7CisJbG9uZyByZXQ7CisKKwlfX2FzbV9fIHZvbGF0aWxlICgibW92cSAlNSwlJXIxMCA7ICIgX19zeXNjYWxsCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoc3lzY2FsbCksICJEIiAoYXJnMSksICJTIiAoYXJnMiksICJkIiAoYXJnMyksCisJCSAgImciIChhcmc0KQorCQk6IF9fc3lzY2FsbF9jbG9iYmVyLCAicjEwIiApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDUobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczLAorCQkJCSBsb25nIGFyZzQsIGxvbmcgYXJnNSkKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJtb3ZxICU1LCUlcjEwIDsgbW92cSAlNiwlJXI4IDsgIiBfX3N5c2NhbGwKKwkJOiAiPWEiIChyZXQpCisJCTogIjAiIChzeXNjYWxsKSwgIkQiIChhcmcxKSwgIlMiIChhcmcyKSwgImQiIChhcmczKSwKKwkJICAiZyIgKGFyZzQpLCAiZyIgKGFyZzUpCisJCTogX19zeXNjYWxsX2Nsb2JiZXIsICJyMTAiLCAicjgiICk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhcF9teXNlbGYodm9pZCkKK3sKKwlfX2FzbSgiaW50MyIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtYXBfc3RhY2sobG9uZyBmZCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIm1vdnEgJTQsJSVyMTAgOyBtb3ZxICU1LCUlcjggOyAiCisJCQkgICJtb3ZxICU2LCAlJXI5OyAiIF9fc3lzY2FsbCAiOyBtb3ZxICU3LCAlJXJieCA7ICIKKwkJCSAgIm1vdnEgJSVyYXgsICglJXJieCkiOgorCQkJICA6ICJhIiAoU1RVQl9NTUFQX05SKSwgIkQiIChTVFVCX0RBVEEpLAorCQkJICAgICJTIiAoVU1fS0VSTl9QQUdFX1NJWkUpLAorCQkJICAgICJkIiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImciIChNQVBfRklYRUQgfCBNQVBfU0hBUkVEKSwgImciIChmZCksCisJCQkgICAgImciIChvZmZzZXQpLAorCQkJICAgICJpIiAoJigoc3RydWN0IHN0dWJfZGF0YSAqKSBTVFVCX0RBVEEpLT5lcnIpCisJCQkgIDogX19zeXNjYWxsX2Nsb2JiZXIsICJyMTAiLCAicjgiLCAicjkiICk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zeXNjYWxscy5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zeXNjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWE4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmgKQEAgLTAsMCArMSw1IEBACisjaWZkZWYgX19pMzg2X18KKyNpbmNsdWRlICJzeXNjYWxsc18zMi5oIgorI2Vsc2UKKyNpbmNsdWRlICJzeXNjYWxsc182NC5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc3lzY2FsbHMuaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3lzY2FsbHNfMzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3lzY2FsbHNfMzIuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zeXNjYWxsc182NC5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zeXNjYWxsc182NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhN2Q1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzXzY0LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1g4Nl82NF9TWVNDQUxMU19IX18KKyNkZWZpbmUgX19TWVNERVBfWDg2XzY0X1NZU0NBTExTX0hfXworCisjaW5jbHVkZSA8bGludXgvbXNnLmg+CisjaW5jbHVkZSA8bGludXgvc2htLmg+CisKK3R5cGVkZWYgbG9uZyBzeXNjYWxsX2hhbmRsZXJfdCh2b2lkKTsKKworZXh0ZXJuIHN5c2NhbGxfaGFuZGxlcl90ICpzeXNfY2FsbF90YWJsZVtdOworCisjZGVmaW5lIEVYRUNVVEVfU1lTQ0FMTChzeXNjYWxsLCByZWdzKSBcCisJKCgobG9uZyAoKikobG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZykpIFwKKwkgICgqc3lzX2NhbGxfdGFibGVbc3lzY2FsbF0pKShVUFRfU1lTQ0FMTF9BUkcxKCZyZWdzLT5yZWdzKSwgXAorCQkgCQkgICAgICBVUFRfU1lTQ0FMTF9BUkcyKCZyZWdzLT5yZWdzKSwgXAorCQkJCSAgICAgIFVQVF9TWVNDQUxMX0FSRzMoJnJlZ3MtPnJlZ3MpLCBcCisJCQkJICAgICAgVVBUX1NZU0NBTExfQVJHNCgmcmVncy0+cmVncyksIFwKKwkJCQkgICAgICBVUFRfU1lTQ0FMTF9BUkc1KCZyZWdzLT5yZWdzKSwgXAorCQkJCSAgICAgIFVQVF9TWVNDQUxMX0FSRzYoJnJlZ3MtPnJlZ3MpKSkKKworZXh0ZXJuIGxvbmcgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJICAgICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCSAgICAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZik7CitleHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX21vZGlmeV9sZHQ7CitleHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX2FyY2hfcHJjdGw7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC90bHMuaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjY2UwMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvdGxzLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfU1lTREVQX1RMU19ICisjZGVmaW5lIF9TWVNERVBfVExTX0gKKworIyBpZm5kZWYgX19LRVJORUxfXworCisvKiBDaGFuZ2UgbmFtZSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgb3JpZ2luYWwgb25lIGZyb20gPGFzbS9sZHQuaD4sIHdoaWNoCisgKiBtYXkgYmUgbmFtZWQgdXNlcl9kZXNjIChidXQgaW4gMi40IGFuZCBpbiBoZWFkZXIgbWF0Y2hpbmcgaXRzIEFQSSB3YXMgbmFtZWQKKyAqIG1vZGlmeV9sZHRfbGR0X3MpLiAqLworCit0eXBlZGVmIHN0cnVjdCB1bV9kdXBfdXNlcl9kZXNjIHsKKwl1bnNpZ25lZCBpbnQgIGVudHJ5X251bWJlcjsKKwl1bnNpZ25lZCBpbnQgIGJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgIGxpbWl0OworCXVuc2lnbmVkIGludCAgc2VnXzMyYml0OjE7CisJdW5zaWduZWQgaW50ICBjb250ZW50czoyOworCXVuc2lnbmVkIGludCAgcmVhZF9leGVjX29ubHk6MTsKKwl1bnNpZ25lZCBpbnQgIGxpbWl0X2luX3BhZ2VzOjE7CisJdW5zaWduZWQgaW50ICBzZWdfbm90X3ByZXNlbnQ6MTsKKwl1bnNpZ25lZCBpbnQgIHVzZWFibGU6MTsKKyNpZmRlZiBfX3g4Nl82NF9fCisJdW5zaWduZWQgaW50ICBsbToxOworI2VuZGlmCit9IHVzZXJfZGVzY190OworCisjIGVsc2UgLyogX19LRVJORUxfXyAqLworCit0eXBlZGVmIHN0cnVjdCB1c2VyX2Rlc2MgdXNlcl9kZXNjX3Q7CisKKyMgZW5kaWYgLyogX19LRVJORUxfXyAqLworCitleHRlcm4gaW50IG9zX3NldF90aHJlYWRfYXJlYSh1c2VyX2Rlc2NfdCAqaW5mbywgaW50IHBpZCk7CitleHRlcm4gaW50IG9zX2dldF90aHJlYWRfYXJlYSh1c2VyX2Rlc2NfdCAqaW5mbywgaW50IHBpZCk7CisKKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBHRFRfRU5UUllfVExTX01JTl9JMzg2IDYKKyNkZWZpbmUgR0RUX0VOVFJZX1RMU19NSU5fWDg2XzY0IDEyCisjZW5kaWYKKworI2VuZGlmIC8qIF9TWVNERVBfVExTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NpZ25hbC5jIGIvYXJjaC94ODYvdW0vc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4M2I5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NpZ25hbC5jCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KKyNpbmNsdWRlICJmcmFtZV9rZXJuLmgiCisjaW5jbHVkZSAic2thcy5oIgorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCisvKgorICogRlBVIHRhZyB3b3JkIGNvbnZlcnNpb25zLgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgdHdkX2kzODdfdG9fZnhzcih1bnNpZ25lZCBzaG9ydCB0d2QpCit7CisJdW5zaWduZWQgaW50IHRtcDsgLyogdG8gYXZvaWQgMTYgYml0IHByZWZpeGVzIGluIHRoZSBjb2RlICovCisKKwkvKiBUcmFuc2Zvcm0gZWFjaCBwYWlyIG9mIGJpdHMgaW50byAwMSAodmFsaWQpIG9yIDAwIChlbXB0eSkgKi8KKwl0bXAgPSB+dHdkOworCXRtcCA9ICh0bXAgfCAodG1wPj4xKSkgJiAweDU1NTU7IC8qIDBWMFYwVjBWMFYwVjBWMFYgKi8KKwkvKiBhbmQgbW92ZSB0aGUgdmFsaWQgYml0cyB0byB0aGUgbG93ZXIgYnl0ZS4gKi8KKwl0bXAgPSAodG1wIHwgKHRtcCA+PiAxKSkgJiAweDMzMzM7IC8qIDAwVlYwMFZWMDBWVjAwVlYgKi8KKwl0bXAgPSAodG1wIHwgKHRtcCA+PiAyKSkgJiAweDBmMGY7IC8qIDAwMDBWVlZWMDAwMFZWVlYgKi8KKwl0bXAgPSAodG1wIHwgKHRtcCA+PiA0KSkgJiAweDAwZmY7IC8qIDAwMDAwMDAwVlZWVlZWVlYgKi8KKwlyZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdHdkX2Z4c3JfdG9faTM4NyhzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCAqZnhzYXZlKQoreworCXN0cnVjdCBfZnB4cmVnICpzdCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyB0d2QgPSAodW5zaWduZWQgbG9uZykgZnhzYXZlLT50d2Q7CisJdW5zaWduZWQgbG9uZyB0YWc7CisJdW5zaWduZWQgbG9uZyByZXQgPSAweGZmZmYwMDAwOworCWludCBpOworCisjZGVmaW5lIEZQUkVHX0FERFIoZiwgbikJKChjaGFyICopJihmKS0+c3Rfc3BhY2UgKyAobikgKiAxNikKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKHR3ZCAmIDB4MSkgeworCQkJc3QgPSAoc3RydWN0IF9mcHhyZWcgKikgRlBSRUdfQUREUihmeHNhdmUsIGkpOworCisJCQlzd2l0Y2ggKHN0LT5leHBvbmVudCAmIDB4N2ZmZikgeworCQkJY2FzZSAweDdmZmY6CisJCQkJdGFnID0gMjsJCS8qIFNwZWNpYWwgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMDAwOgorCQkJCWlmICggIXN0LT5zaWduaWZpY2FuZFswXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFsxXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFsyXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFszXSApIHsKKwkJCQkJdGFnID0gMTsJLyogWmVybyAqLworCQkJCX0gZWxzZSB7CisJCQkJCXRhZyA9IDI7CS8qIFNwZWNpYWwgKi8KKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmIChzdC0+c2lnbmlmaWNhbmRbM10gJiAweDgwMDApIHsKKwkJCQkJdGFnID0gMDsJLyogVmFsaWQgKi8KKwkJCQl9IGVsc2UgeworCQkJCQl0YWcgPSAyOwkvKiBTcGVjaWFsICovCisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJdGFnID0gMzsJCQkvKiBFbXB0eSAqLworCQl9CisJCXJldCB8PSAodGFnIDw8ICgyICogaSkpOworCQl0d2QgPSB0d2QgPj4gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb252ZXJ0X2Z4c3JfdG9fdXNlcihzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWYsCisJCQkJc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgKmZ4c2F2ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGVudls3XTsKKwlzdHJ1Y3QgX2ZwcmVnIF9fdXNlciAqdG87CisJc3RydWN0IF9mcHhyZWcgKmZyb207CisJaW50IGk7CisKKwllbnZbMF0gPSAodW5zaWduZWQgbG9uZylmeHNhdmUtPmN3ZCB8IDB4ZmZmZjAwMDB1bDsKKwllbnZbMV0gPSAodW5zaWduZWQgbG9uZylmeHNhdmUtPnN3ZCB8IDB4ZmZmZjAwMDB1bDsKKwllbnZbMl0gPSB0d2RfZnhzcl90b19pMzg3KGZ4c2F2ZSk7CisJZW52WzNdID0gZnhzYXZlLT5maXA7CisJZW52WzRdID0gZnhzYXZlLT5mY3MgfCAoKHVuc2lnbmVkIGxvbmcpZnhzYXZlLT5mb3AgPDwgMTYpOworCWVudls1XSA9IGZ4c2F2ZS0+Zm9vOworCWVudls2XSA9IGZ4c2F2ZS0+Zm9zOworCisJaWYgKF9fY29weV90b191c2VyKGJ1ZiwgZW52LCA3ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwkJcmV0dXJuIDE7CisKKwl0byA9ICZidWYtPl9zdFswXTsKKwlmcm9tID0gKHN0cnVjdCBfZnB4cmVnICopICZmeHNhdmUtPnN0X3NwYWNlWzBdOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHRvKyssIGZyb20rKykgeworCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdCA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKXRvOworCQl1bnNpZ25lZCBsb25nICpmID0gKHVuc2lnbmVkIGxvbmcgKilmcm9tOworCisJCWlmIChfX3B1dF91c2VyKCpmLCB0KSB8fAorCQkJCV9fcHV0X3VzZXIoKihmICsgMSksIHQgKyAxKSB8fAorCQkJCV9fcHV0X3VzZXIoZnJvbS0+ZXhwb25lbnQsICZ0by0+ZXhwb25lbnQpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbnZlcnRfZnhzcl9mcm9tX3VzZXIoc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgKmZ4c2F2ZSwKKwkJCQkgIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIGVudls3XTsKKwlzdHJ1Y3QgX2ZweHJlZyAqdG87CisJc3RydWN0IF9mcHJlZyBfX3VzZXIgKmZyb207CisJaW50IGk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoIGVudiwgYnVmLCA3ICogc2l6ZW9mKGxvbmcpKSkKKwkJcmV0dXJuIDE7CisKKwlmeHNhdmUtPmN3ZCA9ICh1bnNpZ25lZCBzaG9ydCkoZW52WzBdICYgMHhmZmZmKTsKKwlmeHNhdmUtPnN3ZCA9ICh1bnNpZ25lZCBzaG9ydCkoZW52WzFdICYgMHhmZmZmKTsKKwlmeHNhdmUtPnR3ZCA9IHR3ZF9pMzg3X3RvX2Z4c3IoKHVuc2lnbmVkIHNob3J0KShlbnZbMl0gJiAweGZmZmYpKTsKKwlmeHNhdmUtPmZpcCA9IGVudlszXTsKKwlmeHNhdmUtPmZvcCA9ICh1bnNpZ25lZCBzaG9ydCkoKGVudls0XSAmIDB4ZmZmZjAwMDB1bCkgPj4gMTYpOworCWZ4c2F2ZS0+ZmNzID0gKGVudls0XSAmIDB4ZmZmZik7CisJZnhzYXZlLT5mb28gPSBlbnZbNV07CisJZnhzYXZlLT5mb3MgPSBlbnZbNl07CisKKwl0byA9IChzdHJ1Y3QgX2ZweHJlZyAqKSAmZnhzYXZlLT5zdF9zcGFjZVswXTsKKwlmcm9tID0gJmJ1Zi0+X3N0WzBdOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHRvKyssIGZyb20rKykgeworCQl1bnNpZ25lZCBsb25nICp0ID0gKHVuc2lnbmVkIGxvbmcgKil0bzsKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKmYgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilmcm9tOworCisJCWlmIChfX2dldF91c2VyKCp0LCBmKSB8fAorCQkgICAgX19nZXRfdXNlcigqKHQgKyAxKSwgZiArIDEpIHx8CisJCSAgICBfX2dldF91c2VyKHRvLT5leHBvbmVudCwgJmZyb20tPmV4cG9uZW50KSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGludCBoYXZlX2ZweF9yZWdzOworCisjZW5kaWYKKworc3RhdGljIGludCBjb3B5X3NjX2Zyb21fdXNlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgICAgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpmcm9tKQoreworCXN0cnVjdCBzaWdjb250ZXh0IHNjOworCWludCBlcnIsIHBpZDsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZzYywgZnJvbSwgc2l6ZW9mKHNjKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworI2RlZmluZSBHRVRSRUcocmVnbm8sIHJlZ25hbWUpIHJlZ3MtPnJlZ3MuZ3BbSE9TVF8jI3JlZ25vXSA9IHNjLnJlZ25hbWUKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwlHRVRSRUcoR1MsIGdzKTsKKwlHRVRSRUcoRlMsIGZzKTsKKwlHRVRSRUcoRVMsIGVzKTsKKwlHRVRSRUcoRFMsIGRzKTsKKyNlbmRpZgorCUdFVFJFRyhESSwgZGkpOworCUdFVFJFRyhTSSwgc2kpOworCUdFVFJFRyhCUCwgYnApOworCUdFVFJFRyhTUCwgc3ApOworCUdFVFJFRyhCWCwgYngpOworCUdFVFJFRyhEWCwgZHgpOworCUdFVFJFRyhDWCwgY3gpOworCUdFVFJFRyhBWCwgYXgpOworCUdFVFJFRyhJUCwgaXApOworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCUdFVFJFRyhSOCwgcjgpOworCUdFVFJFRyhSOSwgcjkpOworCUdFVFJFRyhSMTAsIHIxMCk7CisJR0VUUkVHKFIxMSwgcjExKTsKKwlHRVRSRUcoUjEyLCByMTIpOworCUdFVFJFRyhSMTMsIHIxMyk7CisJR0VUUkVHKFIxNCwgcjE0KTsKKwlHRVRSRUcoUjE1LCByMTUpOworI2VuZGlmCisKKwlHRVRSRUcoQ1MsIGNzKTsKKwlHRVRSRUcoRUZMQUdTLCBmbGFncyk7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCUdFVFJFRyhTUywgc3MpOworI2VuZGlmCisKKyN1bmRlZiBHRVRSRUcKKworCXBpZCA9IHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdOworI2lmZGVmIENPTkZJR19YODZfMzIKKwlpZiAoaGF2ZV9mcHhfcmVncykgeworCQlzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBmcHg7CisKKwkJZXJyID0gY29weV9mcm9tX3VzZXIoJmZweCwKKwkJCSYoKHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKilzYy5mcHN0YXRlKS0+X2Z4c3JfZW52WzBdLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gMTsKKworCQllcnIgPSBjb252ZXJ0X2Z4c3JfZnJvbV91c2VyKCZmcHgsIHNjLmZwc3RhdGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIDE7CisKKwkJZXJyID0gcmVzdG9yZV9mcHhfcmVnaXN0ZXJzKHBpZCwgKHVuc2lnbmVkIGxvbmcgKikgJmZweCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNvcHlfc2NfZnJvbV91c2VyIC0gIgorCQkJICAgICAgICJyZXN0b3JlX2ZweF9yZWdpc3RlcnMgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIC1lcnIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZnA7CisKKwkJZXJyID0gY29weV9mcm9tX3VzZXIoJmZwLCBzYy5mcHN0YXRlLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gMTsKKworCQllcnIgPSByZXN0b3JlX2ZwX3JlZ2lzdGVycyhwaWQsICh1bnNpZ25lZCBsb25nICopICZmcCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNvcHlfc2NfZnJvbV91c2VyIC0gIgorCQkJICAgICAgICJyZXN0b3JlX2ZwX3JlZ2lzdGVycyBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCQkgICAgICAgLWVycik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3B5X3NjX3RvX3VzZXIoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICp0bywKKwkJCSAgIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKnRvX2ZwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKKwlzdHJ1Y3QgZmF1bHRpbmZvICogZmkgPSAmY3VycmVudC0+dGhyZWFkLmFyY2guZmF1bHRpbmZvOworCWludCBlcnIsIHBpZDsKKwltZW1zZXQoJnNjLCAwLCBzaXplb2Yoc3RydWN0IHNpZ2NvbnRleHQpKTsKKworI2RlZmluZSBQVVRSRUcocmVnbm8sIHJlZ25hbWUpIHNjLnJlZ25hbWUgPSByZWdzLT5yZWdzLmdwW0hPU1RfIyNyZWdub10KKworI2lmZGVmIENPTkZJR19YODZfMzIKKwlQVVRSRUcoR1MsIGdzKTsKKwlQVVRSRUcoRlMsIGZzKTsKKwlQVVRSRUcoRVMsIGVzKTsKKwlQVVRSRUcoRFMsIGRzKTsKKyNlbmRpZgorCVBVVFJFRyhESSwgZGkpOworCVBVVFJFRyhTSSwgc2kpOworCVBVVFJFRyhCUCwgYnApOworCVBVVFJFRyhTUCwgc3ApOworCVBVVFJFRyhCWCwgYngpOworCVBVVFJFRyhEWCwgZHgpOworCVBVVFJFRyhDWCwgY3gpOworCVBVVFJFRyhBWCwgYXgpOworI2lmZGVmIENPTkZJR19YODZfNjQKKwlQVVRSRUcoUjgsIHI4KTsKKwlQVVRSRUcoUjksIHI5KTsKKwlQVVRSRUcoUjEwLCByMTApOworCVBVVFJFRyhSMTEsIHIxMSk7CisJUFVUUkVHKFIxMiwgcjEyKTsKKwlQVVRSRUcoUjEzLCByMTMpOworCVBVVFJFRyhSMTQsIHIxNCk7CisJUFVUUkVHKFIxNSwgcjE1KTsKKyNlbmRpZgorCisJc2MuY3IyID0gZmktPmNyMjsKKwlzYy5lcnIgPSBmaS0+ZXJyb3JfY29kZTsKKwlzYy50cmFwbm8gPSBmaS0+dHJhcF9ubzsKKwlQVVRSRUcoSVAsIGlwKTsKKwlQVVRSRUcoQ1MsIGNzKTsKKwlQVVRSRUcoRUZMQUdTLCBmbGFncyk7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCVBVVFJFRyhTUCwgc3BfYXRfc2lnbmFsKTsKKwlQVVRSRUcoU1MsIHNzKTsKKyNlbmRpZgorI3VuZGVmIFBVVFJFRworCXNjLm9sZG1hc2sgPSBtYXNrOworCXNjLmZwc3RhdGUgPSB0b19mcDsKKworCWVyciA9IGNvcHlfdG9fdXNlcih0bywgJnNjLCBzaXplb2Yoc3RydWN0IHNpZ2NvbnRleHQpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCXBpZCA9IHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdOworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCWlmIChoYXZlX2ZweF9yZWdzKSB7CisJCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IGZweDsKKworCQllcnIgPSBzYXZlX2ZweF9yZWdpc3RlcnMocGlkLCAodW5zaWduZWQgbG9uZyAqKSAmZnB4KTsKKwkJaWYgKGVyciA8IDApeworCQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX3RvX3VzZXIgLSBzYXZlX2ZweF9yZWdpc3RlcnMgIgorCQkJICAgICAgICJmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWVyciA9IGNvbnZlcnRfZnhzcl90b191c2VyKHRvX2ZwLCAmZnB4KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAxOworCisJCWVyciB8PSBfX3B1dF91c2VyKGZweC5zd2QsICZ0b19mcC0+c3RhdHVzKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoWDg2X0ZYU1JfTUFHSUMsICZ0b19mcC0+bWFnaWMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigmdG9fZnAtPl9meHNyX2VudlswXSwgJmZweCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSkpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZnA7CisKKwkJZXJyID0gc2F2ZV9mcF9yZWdpc3RlcnMocGlkLCAodW5zaWduZWQgbG9uZyAqKSAmZnApOworCQlpZiAoY29weV90b191c2VyKHRvX2ZwLCAmZnAsIHNpemVvZihzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCkpKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCitzdGF0aWMgaW50IGNvcHlfdWNvbnRleHRfdG9fdXNlcihzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1YywKKwkJCQkgc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqZnAsIHNpZ3NldF90ICpzZXQsCisJCQkJIHVuc2lnbmVkIGxvbmcgc3ApCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgfD0gcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NwLCAmdWMtPnVjX3N0YWNrLnNzX3NwKTsKKwllcnIgfD0gcHV0X3VzZXIoc2FzX3NzX2ZsYWdzKHNwKSwgJnVjLT51Y19zdGFjay5zc19mbGFncyk7CisJZXJyIHw9IHB1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zaXplLCAmdWMtPnVjX3N0YWNrLnNzX3NpemUpOworCWVyciB8PSBjb3B5X3NjX3RvX3VzZXIoJnVjLT51Y19tY29udGV4dCwgZnAsICZjdXJyZW50LT50aHJlYWQucmVncywgMCk7CisJZXJyIHw9IGNvcHlfdG9fdXNlcigmdWMtPnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3Qgc2lnZnJhbWUKK3sKKwljaGFyIF9fdXNlciAqcHJldGNvZGU7CisJaW50IHNpZzsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKKwlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKKwljaGFyIHJldGNvZGVbOF07Cit9OworCitzdHJ1Y3QgcnRfc2lnZnJhbWUKK3sKKwljaGFyIF9fdXNlciAqcHJldGNvZGU7CisJaW50IHNpZzsKKwlzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKnBpbmZvOworCXZvaWQgX191c2VyICpwdWM7CisJc3RydWN0IHNpZ2luZm8gaW5mbzsKKwlzdHJ1Y3QgdWNvbnRleHQgdWM7CisJc3RydWN0IF9mcHN0YXRlIGZwc3RhdGU7CisJY2hhciByZXRjb2RlWzhdOworfTsKKworaW50IHNldHVwX3NpZ25hbF9zdGFja19zYyh1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgaW50IHNpZywKKwkJCSAgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgIHNpZ3NldF90ICptYXNrKQoreworCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCXZvaWQgX191c2VyICpyZXN0b3JlcjsKKwlpbnQgZXJyID0gMDsKKworCS8qIFRoaXMgaXMgdGhlIHNhbWUgY2FsY3VsYXRpb24gYXMgaTM4NiAtICgoc3AgKyA0KSAmIDE1KSA9PSAwICovCisJc3RhY2tfdG9wID0gKChzdGFja190b3AgKyA0KSAmIC0xNlVMKSAtIDQ7CisJZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqKSBzdGFja190b3AgLSAxOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJcmV0dXJuIDE7CisKKwlyZXN0b3JlciA9IGZyYW1lLT5yZXRjb2RlOworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikKKwkJcmVzdG9yZXIgPSBrYS0+c2Euc2FfcmVzdG9yZXI7CisKKwllcnIgfD0gX19wdXRfdXNlcihyZXN0b3JlciwgJmZyYW1lLT5wcmV0Y29kZSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc2lnLCAmZnJhbWUtPnNpZyk7CisJZXJyIHw9IGNvcHlfc2NfdG9fdXNlcigmZnJhbWUtPnNjLCAmZnJhbWUtPmZwc3RhdGUsIHJlZ3MsIG1hc2stPnNpZ1swXSk7CisJaWYgKF9OU0lHX1dPUkRTID4gMSkKKwkJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+ZXh0cmFtYXNrLCAmbWFzay0+c2lnWzFdLAorCQkJCSAgICAgIHNpemVvZihmcmFtZS0+ZXh0cmFtYXNrKSk7CisKKwkvKgorCSAqIFRoaXMgaXMgcG9wbCAlZWF4IDsgbW92bCAkLCVlYXggOyBpbnQgJDB4ODAKKwkgKgorCSAqIFdFIERPIE5PVCBVU0UgSVQgQU5ZIE1PUkUhIEl0J3Mgb25seSBsZWZ0IGhlcmUgZm9yIGhpc3RvcmljYWwKKwkgKiByZWFzb25zIGFuZCBiZWNhdXNlIGdkYiB1c2VzIGl0IGFzIGEgc2lnbmF0dXJlIHRvIG5vdGljZQorCSAqIHNpZ25hbCBoYW5kbGVyIHN0YWNrIGZyYW1lcy4KKwkgKi8KKwllcnIgfD0gX19wdXRfdXNlcigweGI4NTgsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrMCkpOworCWVyciB8PSBfX3B1dF91c2VyKF9fTlJfc2lncmV0dXJuLCAoaW50IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSsyKSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoMHg4MGNkLCAoc2hvcnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzYpKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlQVF9SRUdTX1NQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCVBUX1JFR1NfSVAocmVncykgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7CisJUFRfUkVHU19FQVgocmVncykgPSAodW5zaWduZWQgbG9uZykgc2lnOworCVBUX1JFR1NfRURYKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIDA7CisJUFRfUkVHU19FQ1gocmVncykgPSAodW5zaWduZWQgbG9uZykgMDsKKworCWlmICgoY3VycmVudC0+cHRyYWNlICYgUFRfRFRSQUNFKSAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCisJCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXR1cF9zaWduYWxfc3RhY2tfc2kodW5zaWduZWQgbG9uZyBzdGFja190b3AsIGludCBzaWcsCisJCQkgIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICptYXNrKQoreworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCXZvaWQgX191c2VyICpyZXN0b3JlcjsKKwlpbnQgZXJyID0gMDsKKworCXN0YWNrX3RvcCAmPSAtOFVMOworCWZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikgc3RhY2tfdG9wIC0gMTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCXJldHVybiAxOworCisJcmVzdG9yZXIgPSBmcmFtZS0+cmV0Y29kZTsKKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCisJCXJlc3RvcmVyID0ga2EtPnNhLnNhX3Jlc3RvcmVyOworCisJZXJyIHw9IF9fcHV0X3VzZXIocmVzdG9yZXIsICZmcmFtZS0+cHJldGNvZGUpOworCWVyciB8PSBfX3B1dF91c2VyKHNpZywgJmZyYW1lLT5zaWcpOworCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+aW5mbywgJmZyYW1lLT5waW5mbyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT51YywgJmZyYW1lLT5wdWMpOworCWVyciB8PSBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sIGluZm8pOworCWVyciB8PSBjb3B5X3Vjb250ZXh0X3RvX3VzZXIoJmZyYW1lLT51YywgJmZyYW1lLT5mcHN0YXRlLCBtYXNrLAorCQkJCQlQVF9SRUdTX1NQKHJlZ3MpKTsKKworCS8qCisJICogVGhpcyBpcyBtb3ZsICQsJWVheCA7IGludCAkMHg4MAorCSAqCisJICogV0UgRE8gTk9UIFVTRSBJVCBBTlkgTU9SRSEgSXQncyBvbmx5IGxlZnQgaGVyZSBmb3IgaGlzdG9yaWNhbAorCSAqIHJlYXNvbnMgYW5kIGJlY2F1c2UgZ2RiIHVzZXMgaXQgYXMgYSBzaWduYXR1cmUgdG8gbm90aWNlCisJICogc2lnbmFsIGhhbmRsZXIgc3RhY2sgZnJhbWVzLgorCSAqLworCWVyciB8PSBfX3B1dF91c2VyKDB4YjgsIChjaGFyIF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSswKSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoX19OUl9ydF9zaWdyZXR1cm4sIChpbnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzEpKTsKKwllcnIgfD0gX19wdXRfdXNlcigweDgwY2QsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrNSkpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCVBUX1JFR1NfU1AocmVncykgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJUFRfUkVHU19JUChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwlQVF9SRUdTX0VBWChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSBzaWc7CisJUFRfUkVHU19FRFgocmVncykgPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT5pbmZvOworCVBUX1JFR1NfRUNYKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CisKKwlpZiAoKGN1cnJlbnQtPnB0cmFjZSAmIFBUX0RUUkFDRSkgJiYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQorCQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVApOworCXJldHVybiAwOworfQorCitsb25nIHN5c19zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBzcCA9IFBUX1JFR1NfU1AoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopKHNwIC0gOCk7CisJc2lnc2V0X3Qgc2V0OworCXN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MgPSAmZnJhbWUtPnNjOworCXVuc2lnbmVkIGxvbmcgX191c2VyICpvbGRtYXNrID0gJnNjLT5vbGRtYXNrOworCXVuc2lnbmVkIGxvbmcgX191c2VyICpleHRyYW1hc2sgPSBmcmFtZS0+ZXh0cmFtYXNrOworCWludCBzaWdfc2l6ZSA9IChfTlNJR19XT1JEUyAtIDEpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXQuc2lnWzBdLCBvbGRtYXNrLCBzaXplb2Yoc2V0LnNpZ1swXSkpIHx8CisJICAgIGNvcHlfZnJvbV91c2VyKCZzZXQuc2lnWzFdLCBleHRyYW1hc2ssIHNpZ19zaXplKSkKKwkJZ290byBzZWdmYXVsdDsKKworCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCXNldF9jdXJyZW50X2Jsb2NrZWQoJnNldCk7CisKKwlpZiAoY29weV9zY19mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5yZWdzLCBzYykpCisJCWdvdG8gc2VnZmF1bHQ7CisKKwkvKiBBdm9pZCBFUkVTVEFSVCBoYW5kbGluZyAqLworCVBUX1JFR1NfU1lTQ0FMTF9OUigmY3VycmVudC0+dGhyZWFkLnJlZ3MpID0gLTE7CisJcmV0dXJuIFBUX1JFR1NfU1lTQ0FMTF9SRVQoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKKworIHNlZ2ZhdWx0OgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RydWN0IHJ0X3NpZ2ZyYW1lCit7CisJY2hhciBfX3VzZXIgKnByZXRjb2RlOworCXN0cnVjdCB1Y29udGV4dCB1YzsKKwlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOworCXN0cnVjdCBfZnBzdGF0ZSBmcHN0YXRlOworfTsKKworaW50IHNldHVwX3NpZ25hbF9zdGFja19zaSh1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgaW50IHNpZywKKwkJCSAgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLAorCQkJICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpzZXQpCit7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICptZSA9IGN1cnJlbnQ7CisKKwlmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopCisJCXJvdW5kX2Rvd24oc3RhY2tfdG9wIC0gc2l6ZW9mKHN0cnVjdCBydF9zaWdmcmFtZSksIDE2KTsKKwkvKiBTdWJ0cmFjdCAxMjggZm9yIGEgcmVkIHpvbmUgYW5kIDggZm9yIHByb3BlciBhbGlnbm1lbnQgKi8KKwlmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopICgodW5zaWduZWQgbG9uZykgZnJhbWUgLSAxMjggLSA4KTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykgeworCQllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIENyZWF0ZSB0aGUgdWNvbnRleHQuICAqLworCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfbGluayk7CisJZXJyIHw9IF9fcHV0X3VzZXIobWUtPnNhc19zc19zcCwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc2FzX3NzX2ZsYWdzKFBUX1JFR1NfU1AocmVncykpLAorCQkJICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcihtZS0+c2FzX3NzX3NpemUsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc2l6ZSk7CisJZXJyIHw9IGNvcHlfc2NfdG9fdXNlcigmZnJhbWUtPnVjLnVjX21jb250ZXh0LCAmZnJhbWUtPmZwc3RhdGUsIHJlZ3MsCisJCQkgICAgICAgc2V0LT5zaWdbMF0pOworCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+ZnBzdGF0ZSwgJmZyYW1lLT51Yy51Y19tY29udGV4dC5mcHN0YXRlKTsKKwlpZiAoc2l6ZW9mKCpzZXQpID09IDE2KSB7CisJCV9fcHV0X3VzZXIoc2V0LT5zaWdbMF0sICZmcmFtZS0+dWMudWNfc2lnbWFzay5zaWdbMF0pOworCQlfX3B1dF91c2VyKHNldC0+c2lnWzFdLCAmZnJhbWUtPnVjLnVjX3NpZ21hc2suc2lnWzFdKTsKKwl9CisJZWxzZQorCQllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsCisJCQkJICAgICAgc2l6ZW9mKCpzZXQpKTsKKworCS8qCisJICogU2V0IHVwIHRvIHJldHVybiBmcm9tIHVzZXJzcGFjZS4gIElmIHByb3ZpZGVkLCB1c2UgYSBzdHViCisJICogYWxyZWFkeSBpbiB1c2Vyc3BhY2UuCisJICovCisJLyogeDg2LTY0IHNob3VsZCBhbHdheXMgdXNlIFNBX1JFU1RPUkVSLiAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikKKwkJZXJyIHw9IF9fcHV0X3VzZXIoa2EtPnNhLnNhX3Jlc3RvcmVyLCAmZnJhbWUtPnByZXRjb2RlKTsKKwllbHNlCisJCS8qIGNvdWxkIHVzZSBhIHZzdHViIGhlcmUgKi8KKwkJcmV0dXJuIGVycjsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLworCXsKKwkJc3RydWN0IGV4ZWNfZG9tYWluICplZCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW47CisJCWlmICh1bmxpa2VseShlZCAmJiBlZC0+c2lnbmFsX2ludm1hcCAmJiBzaWcgPCAzMikpCisJCQlzaWcgPSBlZC0+c2lnbmFsX2ludm1hcFtzaWddOworCX0KKworCVBUX1JFR1NfU1AocmVncykgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJUFRfUkVHU19SREkocmVncykgPSBzaWc7CisJLyogSW4gY2FzZSB0aGUgc2lnbmFsIGhhbmRsZXIgd2FzIGRlY2xhcmVkIHdpdGhvdXQgcHJvdG90eXBlcyAqLworCVBUX1JFR1NfUkFYKHJlZ3MpID0gMDsKKworCS8qCisJICogVGhpcyBhbHNvIHdvcmtzIGZvciBub24gU0FfU0lHSU5GTyBoYW5kbGVycyBiZWNhdXNlIHRoZXkgZXhwZWN0IHRoZQorCSAqIG5leHQgYXJndW1lbnQgYWZ0ZXIgdGhlIHNpZ25hbCBudW1iZXIgb24gdGhlIHN0YWNrLgorCSAqLworCVBUX1JFR1NfUlNJKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsKKwlQVF9SRUdTX1JEWChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOworCVBUX1JFR1NfUklQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOworIG91dDoKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK2xvbmcgc3lzX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHNwID0gUFRfUkVHU19TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0KKwkJKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikoc3AgLSBzaXplb2YobG9uZykpOworCXN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjID0gJmZyYW1lLT51YzsKKwlzaWdzZXRfdCBzZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNldCwgJnVjLT51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSkpCisJCWdvdG8gc2VnZmF1bHQ7CisKKwlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKKwlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOworCisJaWYgKGNvcHlfc2NfZnJvbV91c2VyKCZjdXJyZW50LT50aHJlYWQucmVncywgJnVjLT51Y19tY29udGV4dCkpCisJCWdvdG8gc2VnZmF1bHQ7CisKKwkvKiBBdm9pZCBFUkVTVEFSVCBoYW5kbGluZyAqLworCVBUX1JFR1NfU1lTQ0FMTF9OUigmY3VycmVudC0+dGhyZWFkLnJlZ3MpID0gLTE7CisJcmV0dXJuIFBUX1JFR1NfU1lTQ0FMTF9SRVQoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKKworIHNlZ2ZhdWx0OgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19YODZfMzIKK2xvbmcgcHRyZWdzX3NpZ3JldHVybih2b2lkKQoreworCXJldHVybiBzeXNfc2lncmV0dXJuKE5VTEwpOworfQorbG9uZyBwdHJlZ3NfcnRfc2lncmV0dXJuKHZvaWQpCit7CisJcmV0dXJuIHN5c19ydF9zaWdyZXR1cm4oTlVMTCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc3R1Yi5TIGIvYXJjaC94ODYvdW0vc3R1Yl8zMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy1pMzg2L3N0dWIuUwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vc3R1Yl8zMi5TCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TIGIvYXJjaC94ODYvdW0vc3R1Yl82NC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9zdHViXzY0LlMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3N0dWJfc2Vndi5jIGIvYXJjaC94ODYvdW0vc3R1Yl9zZWd2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0NTBiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3N0dWJfc2Vndi5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKKyNpbmNsdWRlICJzeXNkZXAvZmF1bHRpbmZvLmgiCisjaW5jbHVkZSAic3lzZGVwL21jb250ZXh0LmgiCisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fICgiLl9fc3lzY2FsbF9zdHViIikpKQorc3R1Yl9zZWd2X2hhbmRsZXIoaW50IHNpZywgc2lnaW5mb190ICppbmZvLCB2b2lkICpwKQoreworCXN0cnVjdCB1Y29udGV4dCAqdWMgPSBwOworCisJR0VUX0ZBVUxUSU5GT19GUk9NX01DKCooKHN0cnVjdCBmYXVsdGluZm8gKikgU1RVQl9EQVRBKSwKKwkJCSAgICAgICZ1Yy0+dWNfbWNvbnRleHQpOworCXRyYXBfbXlzZWxmKCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3N5c19jYWxsX3RhYmxlXzMyLlMgYi9hcmNoL3g4Ni91bS9zeXNfY2FsbF90YWJsZV8zMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2E4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zeXNfY2FsbF90YWJsZV8zMi5TCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisvKiBTdGVhbCBpMzg2IHN5c2NhbGwgdGFibGUgZm9yIG91ciBwdXJwb3NlcywgYnV0IHdpdGggc29tZSBzbGlnaHQgY2hhbmdlcy4qLworCisjZGVmaW5lIHN5c19pb3BsIHN5c19uaV9zeXNjYWxsCisjZGVmaW5lIHN5c19pb3Blcm0gc3lzX25pX3N5c2NhbGwKKworI2RlZmluZSBzeXNfdm04Nm9sZCBzeXNfbmlfc3lzY2FsbAorI2RlZmluZSBzeXNfdm04NiBzeXNfbmlfc3lzY2FsbAorCisjZGVmaW5lIG9sZF9tbWFwIHN5c19vbGRfbW1hcAorCisjZGVmaW5lIHB0cmVnc19mb3JrIHN5c19mb3JrCisjZGVmaW5lIHB0cmVnc19leGVjdmUgc3lzX2V4ZWN2ZQorI2RlZmluZSBwdHJlZ3NfaW9wbCBzeXNfaW9wbAorI2RlZmluZSBwdHJlZ3Nfdm04Nm9sZCBzeXNfdm04Nm9sZAorI2RlZmluZSBwdHJlZ3NfY2xvbmUgc3lzX2Nsb25lCisjZGVmaW5lIHB0cmVnc192bTg2IHN5c192bTg2CisjZGVmaW5lIHB0cmVnc19zaWdhbHRzdGFjayBzeXNfc2lnYWx0c3RhY2sKKyNkZWZpbmUgcHRyZWdzX3Zmb3JrIHN5c192Zm9yaworCisuc2VjdGlvbiAucm9kYXRhLCJhIgorCisjaW5jbHVkZSAiLi4va2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUyIKKworRU5UUlkoc3lzY2FsbF90YWJsZV9zaXplKQorLmxvbmcgLi1zeXNfY2FsbF90YWJsZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc3lzX2NhbGxfdGFibGVfNjQuYyBiL2FyY2gveDg2L3VtL3N5c19jYWxsX3RhYmxlXzY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1MjJmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3N5c19jYWxsX3RhYmxlXzY0LmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFN5c3RlbSBjYWxsIHRhYmxlIGZvciBVTUwveDg2LTY0LCBjb3BpZWQgZnJvbSBhcmNoL3g4Nl82NC9rZXJuZWwvc3lzY2FsbC5jCisgKiB3aXRoIHNvbWUgY2hhbmdlcyBmb3IgVU1MLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKworI2RlZmluZSBfX05PX1NUVUJTCisKKy8qCisgKiBCZWxvdyB5b3UgY2FuIHNlZSwgaW4gdGVybXMgb2YgI2RlZmluZSdzLCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgeDg2LTY0CisgKiBhbmQgdGhlIFVNTCBzeXNjYWxsIHRhYmxlLgorICovCisKKy8qIE5vdCBnb2luZyB0byBiZSBpbXBsZW1lbnRlZCBieSBVTUwsIHNpbmNlIHdlIGhhdmUgbm8gaGFyZHdhcmUuICovCisjZGVmaW5lIHN0dWJfaW9wbCBzeXNfbmlfc3lzY2FsbAorI2RlZmluZSBzeXNfaW9wZXJtIHN5c19uaV9zeXNjYWxsCisKKy8qCisgKiBUaGUgVU1MIFRMUyBwcm9ibGVtLiBOb3RlIHRoYXQgeDg2XzY0IGRvZXMgbm90IGltcGxlbWVudCB0aGlzLCBzbyB0aGUgYmVsb3cKKyAqIGlzIG5lZWRlZCBvbmx5IGZvciB0aGUgaWEzMiBjb21wYXRpYmlsaXR5LgorICovCisKKy8qIE9uIFVNTCB3ZSBjYWxsIGl0IHRoaXMgd2F5ICgib2xkIiBtZWFucyBpdCdzIG5vdCBtbWFwMikgKi8KKyNkZWZpbmUgc3lzX21tYXAgb2xkX21tYXAKKworI2RlZmluZSBzdHViX2Nsb25lIHN5c19jbG9uZQorI2RlZmluZSBzdHViX2Zvcmsgc3lzX2ZvcmsKKyNkZWZpbmUgc3R1Yl92Zm9yayBzeXNfdmZvcmsKKyNkZWZpbmUgc3R1Yl9leGVjdmUgc3lzX2V4ZWN2ZQorI2RlZmluZSBzdHViX3J0X3NpZ3N1c3BlbmQgc3lzX3J0X3NpZ3N1c3BlbmQKKyNkZWZpbmUgc3R1Yl9zaWdhbHRzdGFjayBzeXNfc2lnYWx0c3RhY2sKKyNkZWZpbmUgc3R1Yl9ydF9zaWdyZXR1cm4gc3lzX3J0X3NpZ3JldHVybgorCisjZGVmaW5lIF9fU1lTQ0FMTChuciwgc3ltKSBleHRlcm4gYXNtbGlua2FnZSB2b2lkIHN5bSh2b2lkKSA7CisjdW5kZWYgX0FTTV9YODZfVU5JU1REXzY0X0gKKyNpbmNsdWRlICIuLi8uLi94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgiCisKKyN1bmRlZiBfX1NZU0NBTEwKKyNkZWZpbmUgX19TWVNDQUxMKG5yLCBzeW0pIFsgbnIgXSA9IHN5bSwKKyN1bmRlZiBfQVNNX1g4Nl9VTklTVERfNjRfSAorCit0eXBlZGVmIHZvaWQgKCpzeXNfY2FsbF9wdHJfdCkodm9pZCk7CisKK2V4dGVybiB2b2lkIHN5c19uaV9zeXNjYWxsKHZvaWQpOworCisvKgorICogV2UgdXNlZCB0byBoYXZlIGEgdHJpY2sgaGVyZSB3aGljaCBtYWRlIHN1cmUgdGhhdCBob2xlcyBpbiB0aGUKKyAqIHg4Nl82NCB0YWJsZSB3ZXJlIGZpbGxlZCBpbiB3aXRoIHN5c19uaV9zeXNjYWxsLCBidXQgYSBjb21tZW50IGluCisgKiB1bmlzdGRfNjQuaCBzYXlzIHRoYXQgaG9sZXMgYXJlbid0IGFsbG93ZWQsIHNvIHRoZSB0cmljayB3YXMKKyAqIHJlbW92ZWQuCisgKiBUaGUgdHJpY2sgbG9va2VkIGxpa2UgdGhpcworICoJWzAgLi4uIFVNX05SX3N5c2NhbGxfbWF4XSA9ICZzeXNfbmlfc3lzY2FsbAorICogYmVmb3JlIGluY2x1ZGluZyB1bmlzdGRfNjQuaCAtIHRoZSBsYXRlciBpbml0aWFsaXphdGlvbnMgb3Zlcndyb3RlCisgKiB0aGUgc3lzX25pX3N5c2NhbGwgZmlsbGVyLgorICovCisKK3N5c19jYWxsX3B0cl90IHN5c19jYWxsX3RhYmxlW10gX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsKKyNpbmNsdWRlIDxhc20vdW5pc3RkXzY0Lmg+Cit9OworCitpbnQgc3lzY2FsbF90YWJsZV9zaXplID0gc2l6ZW9mKHN5c19jYWxsX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc3lzY2FsbHMuYyBiL2FyY2gveDg2L3VtL3N5c2NhbGxzXzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLWkzODYvc3lzY2FsbHMuYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vc3lzY2FsbHNfMzIuYwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N5c2NhbGxzLmMgYi9hcmNoL3g4Ni91bS9zeXNjYWxsc182NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbHMuYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vc3lzY2FsbHNfNjQuYwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zeXNycS5jIGIvYXJjaC94ODYvdW0vc3lzcnFfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9zeXNycS5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9zeXNycV8zMi5jCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zeXNycV82NC5jIGIvYXJjaC94ODYvdW0vc3lzcnFfNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODkxMzQzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc3lzcnFfNjQuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMgUGF0aFNjYWxlLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlICJzeXNycS5oIgorCit2b2lkIF9fc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50aygiXG4iKTsKKwlwcmludF9tb2R1bGVzKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUGlkOiAlZCwgY29tbTogJS4yMHMgJXMgJXNcbiIsIHRhc2tfcGlkX25yKGN1cnJlbnQpLAorCQljdXJyZW50LT5jb21tLCBwcmludF90YWludGVkKCksIGluaXRfdXRzbmFtZSgpLT5yZWxlYXNlKTsKKwlwcmludGsoS0VSTl9JTkZPICJSSVA6ICUwNGx4Ols8JTAxNmx4Pl1cbiIsIFBUX1JFR1NfQ1MocmVncykgJiAweGZmZmYsCisJICAgICAgIFBUX1JFR1NfUklQKHJlZ3MpKTsKKwlwcmludGsoS0VSTl9JTkZPICJSU1A6ICUwMTZseCAgRUZMQUdTOiAlMDhseFxuIiwgUFRfUkVHU19TUChyZWdzKSwKKwkgICAgICAgUFRfUkVHU19FRkxBR1MocmVncykpOworCXByaW50ayhLRVJOX0lORk8gIlJBWDogJTAxNmx4IFJCWDogJTAxNmx4IFJDWDogJTAxNmx4XG4iLAorCSAgICAgICBQVF9SRUdTX1JBWChyZWdzKSwgUFRfUkVHU19SQlgocmVncyksIFBUX1JFR1NfUkNYKHJlZ3MpKTsKKwlwcmludGsoS0VSTl9JTkZPICJSRFg6ICUwMTZseCBSU0k6ICUwMTZseCBSREk6ICUwMTZseFxuIiwKKwkgICAgICAgUFRfUkVHU19SRFgocmVncyksIFBUX1JFR1NfUlNJKHJlZ3MpLCBQVF9SRUdTX1JESShyZWdzKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUkJQOiAlMDE2bHggUjA4OiAlMDE2bHggUjA5OiAlMDE2bHhcbiIsCisJICAgICAgIFBUX1JFR1NfUkJQKHJlZ3MpLCBQVF9SRUdTX1I4KHJlZ3MpLCBQVF9SRUdTX1I5KHJlZ3MpKTsKKwlwcmludGsoS0VSTl9JTkZPICJSMTA6ICUwMTZseCBSMTE6ICUwMTZseCBSMTI6ICUwMTZseFxuIiwKKwkgICAgICAgUFRfUkVHU19SMTAocmVncyksIFBUX1JFR1NfUjExKHJlZ3MpLCBQVF9SRUdTX1IxMihyZWdzKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUjEzOiAlMDE2bHggUjE0OiAlMDE2bHggUjE1OiAlMDE2bHhcbiIsCisJICAgICAgIFBUX1JFR1NfUjEzKHJlZ3MpLCBQVF9SRUdTX1IxNChyZWdzKSwgUFRfUkVHU19SMTUocmVncykpOworfQorCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlfX3Nob3dfcmVncyhyZWdzKTsKKwlzaG93X3RyYWNlKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopICZyZWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvdGxzLmMgYi9hcmNoL3g4Ni91bS90bHNfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni90bHMuYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vdGxzXzMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC90bHMuYyBiL2FyY2gveDg2L3VtL3Rsc182NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvdGxzLmMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3Rsc182NC5jCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS91c2VyLW9mZnNldHMuYyBiL2FyY2gveDg2L3VtL3VzZXItb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDliZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS91c2VyLW9mZnNldHMuYwpAQCAtMCwwICsxLDgwIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyNkZWZpbmUgX19GUkFNRV9PRkZTRVRTCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjZGVmaW5lIERFRklORShzeW0sIHZhbCkgXAorCWFzbSB2b2xhdGlsZSgiXG4tPiIgI3N5bSAiICUwICIgI3ZhbCA6IDogImkiICh2YWwpKQorCisjZGVmaW5lIERFRklORV9MT05HUyhzeW0sIHZhbCkgXAorCWFzbSB2b2xhdGlsZSgiXG4tPiIgI3N5bSAiICUwICIgI3ZhbCA6IDogImkiICh2YWwvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwordm9pZCBmb28odm9pZCkKK3sKKyNpZmRlZiBfX2kzODZfXworCURFRklORV9MT05HUyhIT1NUX0ZQX1NJWkUsIHNpemVvZihzdHJ1Y3QgdXNlcl9mcHJlZ3Nfc3RydWN0KSk7CisJREVGSU5FX0xPTkdTKEhPU1RfRlBYX1NJWkUsIHNpemVvZihzdHJ1Y3QgdXNlcl9mcHhyZWdzX3N0cnVjdCkpOworCisJREVGSU5FKEhPU1RfSVAsIEVJUCk7CisJREVGSU5FKEhPU1RfU1AsIFVFU1ApOworCURFRklORShIT1NUX0VGTEFHUywgRUZMKTsKKwlERUZJTkUoSE9TVF9BWCwgRUFYKTsKKwlERUZJTkUoSE9TVF9CWCwgRUJYKTsKKwlERUZJTkUoSE9TVF9DWCwgRUNYKTsKKwlERUZJTkUoSE9TVF9EWCwgRURYKTsKKwlERUZJTkUoSE9TVF9TSSwgRVNJKTsKKwlERUZJTkUoSE9TVF9ESSwgRURJKTsKKwlERUZJTkUoSE9TVF9CUCwgRUJQKTsKKwlERUZJTkUoSE9TVF9DUywgQ1MpOworCURFRklORShIT1NUX1NTLCBTUyk7CisJREVGSU5FKEhPU1RfRFMsIERTKTsKKwlERUZJTkUoSE9TVF9GUywgRlMpOworCURFRklORShIT1NUX0VTLCBFUyk7CisJREVGSU5FKEhPU1RfR1MsIEdTKTsKKwlERUZJTkUoSE9TVF9PUklHX0FYLCBPUklHX0VBWCk7CisjZWxzZQorCURFRklORShIT1NUX0ZQX1NJWkUsIHNpemVvZihzdHJ1Y3QgX2Zwc3RhdGUpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9CWCwgUkJYKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9DWCwgUkNYKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9ESSwgUkRJKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9TSSwgUlNJKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9EWCwgUkRYKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9CUCwgUkJQKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9BWCwgUkFYKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9SOCwgUjgpOworCURFRklORV9MT05HUyhIT1NUX1I5LCBSOSk7CisJREVGSU5FX0xPTkdTKEhPU1RfUjEwLCBSMTApOworCURFRklORV9MT05HUyhIT1NUX1IxMSwgUjExKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9SMTIsIFIxMik7CisJREVGSU5FX0xPTkdTKEhPU1RfUjEzLCBSMTMpOworCURFRklORV9MT05HUyhIT1NUX1IxNCwgUjE0KTsKKwlERUZJTkVfTE9OR1MoSE9TVF9SMTUsIFIxNSk7CisJREVGSU5FX0xPTkdTKEhPU1RfT1JJR19BWCwgT1JJR19SQVgpOworCURFRklORV9MT05HUyhIT1NUX0NTLCBDUyk7CisJREVGSU5FX0xPTkdTKEhPU1RfU1MsIFNTKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9FRkxBR1MsIEVGTEFHUyk7CisjaWYgMAorCURFRklORV9MT05HUyhIT1NUX0ZTLCBGUyk7CisJREVGSU5FX0xPTkdTKEhPU1RfR1MsIEdTKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9EUywgRFMpOworCURFRklORV9MT05HUyhIT1NUX0VTLCBFUyk7CisjZW5kaWYKKworCURFRklORV9MT05HUyhIT1NUX0lQLCBSSVApOworCURFRklORV9MT05HUyhIT1NUX1NQLCBSU1ApOworI2VuZGlmCisKKwlERUZJTkUoVU1fRlJBTUVfU0laRSwgc2l6ZW9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSk7CisJREVGSU5FKFVNX1BPTExJTiwgUE9MTElOKTsKKwlERUZJTkUoVU1fUE9MTFBSSSwgUE9MTFBSSSk7CisJREVGSU5FKFVNX1BPTExPVVQsIFBPTExPVVQpOworCisJREVGSU5FKFVNX1BST1RfUkVBRCwgUFJPVF9SRUFEKTsKKwlERUZJTkUoVU1fUFJPVF9XUklURSwgUFJPVF9XUklURSk7CisJREVGSU5FKFVNX1BST1RfRVhFQywgUFJPVF9FWEVDKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3Zkc28vTWFrZWZpbGUgYi9hcmNoL3g4Ni91bS92ZHNvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODAzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS92ZHNvL01ha2VmaWxlCkBAIC0wLDAgKzEsOTAgQEAKKyMKKyMgQnVpbGRpbmcgdkRTTyBpbWFnZXMgZm9yIHg4Ni4KKyMKKworVkRTTzY0LXkJCTo9IHkKKwordmRzby1pbnN0YWxsLSQoVkRTTzY0LXkpCSs9IHZkc28uc28KKworCisjIGZpbGVzIHRvIGxpbmsgaW50byB0aGUgdmRzbwordm9ianMteSA6PSB2ZHNvLW5vdGUubyB1bV92ZHNvLm8KKworIyBmaWxlcyB0byBsaW5rIGludG8ga2VybmVsCitvYmotJChWRFNPNjQteSkJCQkrPSB2ZHNvLm8gdm1hLm8KKwordm9ianMgOj0gJChmb3JlYWNoIEYsJCh2b2Jqcy15KSwkKG9iaikvJEYpCisKKyQob2JqKS92ZHNvLm86ICQob2JqKS92ZHNvLnNvCisKK3RhcmdldHMgKz0gdmRzby5zbyB2ZHNvLnNvLmRiZyB2ZHNvLmxkcyAkKHZvYmpzLXkpCisKK2V4cG9ydCBDUFBGTEFHU192ZHNvLmxkcyArPSAtUCAtQworCitWRFNPX0xERkxBR1NfdmRzby5sZHMgPSAtbTY0IC1XbCwtc29uYW1lPWxpbnV4LXZkc28uc28uMSBcCisgICAgICAgLVdsLC16LG1heC1wYWdlLXNpemU9NDA5NiAtV2wsLXosY29tbW9uLXBhZ2Utc2l6ZT00MDk2CisKKyQob2JqKS92ZHNvLm86ICQoc3JjKS92ZHNvLlMgJChvYmopL3Zkc28uc28KKworJChvYmopL3Zkc28uc28uZGJnOiAkKHNyYykvdmRzby5sZHMgJCh2b2JqcykgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx2ZHNvKQorCiskKG9iaikvJS5zbzogT0JKQ09QWUZMQUdTIDo9IC1TCiskKG9iaikvJS5zbzogJChvYmopLyUuc28uZGJnIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKworIworIyBEb24ndCBvbWl0IGZyYW1lIHBvaW50ZXJzIGZvciBlYXNlIG9mIHVzZXJzcGFjZSBkZWJ1Z2dpbmcsIGJ1dCBkbworIyBvcHRpbWl6ZSBzaWJsaW5nIGNhbGxzLgorIworQ0ZMIDo9ICQoUFJPRklMSU5HKSAtbWNtb2RlbD1zbWFsbCAtZlBJQyAtTzIgLWZhc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IFwKKyAgICAgICAkKGZpbHRlciAtZyUsJChLQlVJTERfQ0ZMQUdTKSkgJChjYWxsIGNjLW9wdGlvbiwgLWZuby1zdGFjay1wcm90ZWN0b3IpIFwKKyAgICAgICAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm9wdGltaXplLXNpYmxpbmctY2FsbHMKKworJCh2b2Jqcyk6IEtCVUlMRF9DRkxBR1MgKz0gJChDRkwpCisKKyMKKyMgdkRTTyBjb2RlIHJ1bnMgaW4gdXNlcnNwYWNlIGFuZCAtcGcgZG9lc24ndCBoZWxwIHdpdGggcHJvZmlsaW5nIGFueXdheS4KKyMKK0NGTEFHU19SRU1PVkVfdmRzby1ub3RlLm8gPSAtcGcgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlCitDRkxBR1NfUkVNT1ZFX3VtX3Zkc28ubyA9IC1wZyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UKKwordGFyZ2V0cyArPSB2ZHNvLXN5bXMubGRzCitvYmotJChWRFNPNjQteSkJCQkrPSB2ZHNvLXN5bXMubGRzCisKKyMKKyMgTWF0Y2ggc3ltYm9scyBpbiB0aGUgRFNPIHRoYXQgbG9vayBsaWtlIFZEU08qOyBwcm9kdWNlIGEgZmlsZSBvZiBjb25zdGFudHMuCisjCitzZWQtdmRzb3N5bSA6PSAtZSAncy9eMDAqLzAvJyBcCisJLWUgJ3MvXlwoWzAtOWEtZkEtRl0qXCkgLiBcKFZEU09bYS16QS1aMC05X10qXCkkJC9cMiA9IDB4XDE7L3AnCitxdWlldF9jbWRfdmRzb3N5bSA9IFZEU09TWU0gJEAKK2RlZmluZSBjbWRfdmRzb3N5bQorCSQoTk0pICQ8IHwgTENfQUxMPUMgc2VkIC1uICQoc2VkLXZkc29zeW0pIHwgTENfQUxMPUMgc29ydCA+ICRACitlbmRlZgorCiskKG9iaikvJS1zeW1zLmxkczogJChvYmopLyUuc28uZGJnIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdmRzb3N5bSkKKworIworIyBUaGUgRFNPIGltYWdlcyBhcmUgYnVpbHQgdXNpbmcgYSBzcGVjaWFsIGxpbmtlciBzY3JpcHQuCisjCitxdWlldF9jbWRfdmRzbyA9IFZEU08gICAgJEAKKyAgICAgIGNtZF92ZHNvID0gJChDQykgLW5vc3RkbGliIC1vICRAIFwKKwkJICAgICAgICQoVkRTT19MREZMQUdTKSAkKFZEU09fTERGTEFHU18kKGZpbHRlciAlLmxkcywkKF5GKSkpIFwKKwkJICAgICAgIC1XbCwtVCwkKGZpbHRlciAlLmxkcywkXikgJChmaWx0ZXIgJS5vLCReKSAmJiBcCisJCSBzaCAkKHNyY3RyZWUpLyQoc3JjKS9jaGVja3VuZGVmLnNoICckKE5NKScgJyRAJworCitWRFNPX0xERkxBR1MgPSAtZlBJQyAtc2hhcmVkICQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKK0dDT1ZfUFJPRklMRSA6PSBuCisKKyMKKyMgSW5zdGFsbCB0aGUgdW5zdHJpcHBlZCBjb3B5IG9mIHZkc28qLnNvIGxpc3RlZCBpbiAkKHZkc28taW5zdGFsbC15KS4KKyMKK3F1aWV0X2NtZF92ZHNvX2luc3RhbGwgPSBJTlNUQUxMICRACisgICAgICBjbWRfdmRzb19pbnN0YWxsID0gY3AgJChvYmopLyRALmRiZyAkKE1PRExJQikvdmRzby8kQAorJCh2ZHNvLWluc3RhbGwteSk6ICUuc286ICQob2JqKS8lLnNvLmRiZyBGT1JDRQorCUBta2RpciAtcCAkKE1PRExJQikvdmRzbworCSQoY2FsbCBjbWQsdmRzb19pbnN0YWxsKQorCitQSE9OWSArPSB2ZHNvX2luc3RhbGwgJCh2ZHNvLWluc3RhbGwteSkKK3Zkc29faW5zdGFsbDogJCh2ZHNvLWluc3RhbGwteSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL2NoZWNrdW5kZWYuc2ggYi9hcmNoL3g4Ni91bS92ZHNvL2NoZWNrdW5kZWYuc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL2NoZWNrdW5kZWYuc2gKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3Zkc28vY2hlY2t1bmRlZi5zaApkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdW1fdmRzby5jIGIvYXJjaC94ODYvdW0vdmRzby91bV92ZHNvLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3VtX3Zkc28uYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vdmRzby91bV92ZHNvLmMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3Zkc28tbGF5b3V0Lmxkcy5TIGIvYXJjaC94ODYvdW0vdmRzby92ZHNvLWxheW91dC5sZHMuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby1sYXlvdXQubGRzLlMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3Zkc28vdmRzby1sYXlvdXQubGRzLlMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3Zkc28tbm90ZS5TIGIvYXJjaC94ODYvdW0vdmRzby92ZHNvLW5vdGUuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby1ub3RlLlMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3Zkc28vdmRzby1ub3RlLlMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3Zkc28vdmRzby5TIGIvYXJjaC94ODYvdW0vdmRzby92ZHNvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiNDY4YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3Zkc28vdmRzby5TCkBAIC0wLDAgKzEsMTAgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK19fSU5JVERBVEEKKworCS5nbG9ibCB2ZHNvX3N0YXJ0LCB2ZHNvX2VuZAordmRzb19zdGFydDoKKwkuaW5jYmluICJhcmNoL3g4Ni91bS92ZHNvL3Zkc28uc28iCit2ZHNvX2VuZDoKKworX19GSU5JVApkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5sZHMuUyBiL2FyY2gveDg2L3VtL3Zkc28vdmRzby5sZHMuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5sZHMuUwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vdmRzby92ZHNvLmxkcy5TCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS92ZHNvL3ZtYS5jIGIvYXJjaC94ODYvdW0vdmRzby92bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY0ZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vdmRzby92bWEuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJpY2hhcmQgV2VpbmJlcmdlciA8cmljaHJkQG5vZC5hdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCit1bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSB2ZHNvX2VuYWJsZWQgPSAxOwordW5zaWduZWQgbG9uZyB1bV92ZHNvX2FkZHI7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRhc2tfc2l6ZTsKK2V4dGVybiBjaGFyIHZkc29fc3RhcnRbXSwgdmRzb19lbmRbXTsKKworc3RhdGljIHN0cnVjdCBwYWdlICoqdmRzb3A7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdmRzbyh2b2lkKQoreworCXN0cnVjdCBwYWdlICp1bV92ZHNvOworCisJQlVHX09OKHZkc29fZW5kIC0gdmRzb19zdGFydCA+IFBBR0VfU0laRSk7CisKKwl1bV92ZHNvX2FkZHIgPSB0YXNrX3NpemUgLSBQQUdFX1NJWkU7CisKKwl2ZHNvcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkc29wKQorCQlnb3RvIG9vbTsKKworCXVtX3Zkc28gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghdW1fdmRzbykgeworCQlrZnJlZSh2ZHNvcCk7CisKKwkJZ290byBvb207CisJfQorCisJY29weV9wYWdlKHBhZ2VfYWRkcmVzcyh1bV92ZHNvKSwgdmRzb19zdGFydCk7CisJKnZkc29wID0gdW1fdmRzbzsKKworCXJldHVybiAwOworCitvb206CisJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgYWxsb2NhdGUgdmRzb1xuIik7CisJdmRzb19lbmFibGVkID0gMDsKKworCXJldHVybiAtRU5PTUVNOworfQorc3Vic3lzX2luaXRjYWxsKGluaXRfdmRzbyk7CisKK2ludCBhcmNoX3NldHVwX2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgaW50IHVzZXNfaW50ZXJwKQoreworCWludCBlcnI7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKworCWlmICghdmRzb19lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisKKwllcnIgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgdW1fdmRzb19hZGRyLCBQQUdFX1NJWkUsCisJCVZNX1JFQUR8Vk1fRVhFQ3wKKwkJVk1fTUFZUkVBRHxWTV9NQVlXUklURXxWTV9NQVlFWEVDfAorCQlWTV9BTFdBWVNEVU1QLAorCQl2ZHNvcCk7CisKKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jIGIvYXJjaC94ODYvdmRzby92bWEuYwppbmRleCAzMTZmYmNhLi4xNTM0MDdjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jCisrKyBiL2FyY2gveDg2L3Zkc28vdm1hLmMKQEAgLTg5LDYgKzg5LDE1IEBACiAJYWRkciA9IHN0YXJ0ICsgKG9mZnNldCA8PCBQQUdFX1NISUZUKTsKIAlpZiAoYWRkciA+PSBlbmQpCiAJCWFkZHIgPSBlbmQ7CisKKwkvKgorCSAqIHBhZ2UtYWxpZ24gaXQgaGVyZSBzbyB0aGF0IGdldF91bm1hcHBlZF9hcmVhIGRvZXNuJ3QKKwkgKiBhbGlnbiBpdCB3cm9uZ2Z1bGx5IGFnYWluIHRvIHRoZSBuZXh0IHBhZ2UuIGFkZHIgY2FuIGNvbWUgaW4gNEsKKwkgKiB1bmFsaWduZWQgaGVyZSBhcyBhIHJlc3VsdCBvZiBzdGFjayBzdGFydCByYW5kb21pemF0aW9uLgorCSAqLworCWFkZHIgPSBQQUdFX0FMSUdOKGFkZHIpOworCWFkZHIgPSBhbGlnbl9hZGRyKGFkZHIsIE5VTEwsIEFMSUdOX1ZEU08pOworCiAJcmV0dXJuIGFkZHI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3ZpZGVvL2ZiZGV2LmMgYi9hcmNoL3g4Ni92aWRlby9mYmRldi5jCmluZGV4IDY5NTI3NjguLmM1ZmZiNmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3ZpZGVvL2ZiZGV2LmMKKysrIGIvYXJjaC94ODYvdmlkZW8vZmJkZXYuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9ncmFudC10YWJsZS5jIGIvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggNDliYTliNS4uNmJiZmQ3YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKKysrIGIvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAogCWlmIChzaGFyZWQgPT0gTlVMTCkgewogCQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhID0KLQkJCXhlbl9hbGxvY192bV9hcmVhKFBBR0VfU0laRSAqIG1heF9ucl9nZnJhbWVzKTsKKwkJCWFsbG9jX3ZtX2FyZWEoUEFHRV9TSVpFICogbWF4X25yX2dmcmFtZXMpOwogCQlCVUdfT04oYXJlYSA9PSBOVUxMKTsKIAkJc2hhcmVkID0gYXJlYS0+YWRkcjsKIAkJKl9fc2hhcmVkID0gc2hhcmVkOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3RpbWUuYyBiL2FyY2gveDg2L3hlbi90aW1lLmMKaW5kZXggMTYzYjQ2Ny4uMDI5NmE5NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3RpbWUuYworKysgYi9hcmNoL3g4Ni94ZW4vdGltZS5jCkBAIC0yMDEsOCArMjAxLDIyIEBACiAKIHN0YXRpYyBpbnQgeGVuX3NldF93YWxsY2xvY2sodW5zaWduZWQgbG9uZyBub3cpCiB7CisJc3RydWN0IHhlbl9wbGF0Zm9ybV9vcCBvcDsKKwlpbnQgcmM7CisKIAkvKiBkbyBub3RoaW5nIGZvciBkb21VICovCi0JcmV0dXJuIC0xOworCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpCisJCXJldHVybiAtMTsKKworCW9wLmNtZCA9IFhFTlBGX3NldHRpbWU7CisJb3AudS5zZXR0aW1lLnNlY3MgPSBub3c7CisJb3AudS5zZXR0aW1lLm5zZWNzID0gMDsKKwlvcC51LnNldHRpbWUuc3lzdGVtX3RpbWUgPSB4ZW5fY2xvY2tzb3VyY2VfcmVhZCgpOworCisJcmMgPSBIWVBFUlZJU09SX2RvbTBfb3AoJm9wKTsKKwlXQVJOKHJjICE9IDAsICJYRU5QRl9zZXR0aW1lIGZhaWxlZDogbm93PSVsZFxuIiwgbm93KTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSB4ZW5fY2xvY2tzb3VyY2UgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggY2JkZjJmZi4uYmIwNjk2OCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTczLDQgKzczLDcgQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICA0MAogCisjZGVmaW5lIFNPX1dJRklfU1RBVFVTCQk0MQorI2RlZmluZSBTQ01fV0lGSV9TVEFUVVMJCVNPX1dJRklfU1RBVFVTCisKICNlbmRpZgkvKiBfWFRFTlNBX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmMgYi9ibG9jay9ibGstY2dyb3VwLmMKaW5kZXggYjU5NmU1NC4uOGY2MzBjZSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5jCisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuYwpAQCAtNzY4LDI1ICs3NjgsMTQgQEAKIAlyZXR1cm4gZGlza190b3RhbDsKIH0KIAotc3RhdGljIGludCBibGtpb19jaGVja19kZXZfbnVtKGRldl90IGRldikKLXsKLQlpbnQgcGFydCA9IDA7Ci0Jc3RydWN0IGdlbmRpc2sgKmRpc2s7Ci0KLQlkaXNrID0gZ2V0X2dlbmRpc2soZGV2LCAmcGFydCk7Ci0JaWYgKCFkaXNrIHx8IHBhcnQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgYmxraW9fcG9saWN5X3BhcnNlX2FuZF9zZXQoY2hhciAqYnVmLAogCXN0cnVjdCBibGtpb19wb2xpY3lfbm9kZSAqbmV3cG4sIGVudW0gYmxraW9fcG9saWN5X2lkIHBsaWQsIGludCBmaWxlaWQpCiB7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBOVUxMOwogCWNoYXIgKnNbNF0sICpwLCAqbWFqb3JfcyA9IE5VTEwsICptaW5vcl9zID0gTlVMTDsKLQlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgbWFqb3IsIG1pbm9yOwotCWludCBpID0gMDsKKwlpbnQgaSA9IDAsIHJldCA9IC1FSU5WQUw7CisJaW50IHBhcnQ7CiAJZGV2X3QgZGV2OwogCXU2NCB0ZW1wOwogCkBAIC04MDQsMzcgKzc5MywzNiBAQAogCX0KIAogCWlmIChpICE9IDIpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dDsKIAogCXAgPSBzdHJzZXAoJnNbMF0sICI6Iik7CiAJaWYgKHAgIT0gTlVMTCkKIAkJbWFqb3JfcyA9IHA7CiAJZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBvdXQ7CiAKIAltaW5vcl9zID0gc1swXTsKIAlpZiAoIW1pbm9yX3MpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dDsKIAotCXJldCA9IHN0cmljdF9zdHJ0b3VsKG1ham9yX3MsIDEwLCAmbWFqb3IpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChzdHJpY3Rfc3RydG91bChtYWpvcl9zLCAxMCwgJm1ham9yKSkKKwkJZ290byBvdXQ7CiAKLQlyZXQgPSBzdHJpY3Rfc3RydG91bChtaW5vcl9zLCAxMCwgJm1pbm9yKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RyaWN0X3N0cnRvdWwobWlub3JfcywgMTAsICZtaW5vcikpCisJCWdvdG8gb3V0OwogCiAJZGV2ID0gTUtERVYobWFqb3IsIG1pbm9yKTsKIAotCXJldCA9IHN0cmljdF9zdHJ0b3VsbChzWzFdLCAxMCwgJnRlbXApOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChzdHJpY3Rfc3RydG91bGwoc1sxXSwgMTAsICZ0ZW1wKSkKKwkJZ290byBvdXQ7CiAKIAkvKiBGb3IgcnVsZSByZW1vdmFsLCBkbyBub3QgY2hlY2sgZm9yIGRldmljZSBwcmVzZW5jZS4gKi8KIAlpZiAodGVtcCkgewotCQlyZXQgPSBibGtpb19jaGVja19kZXZfbnVtKGRldik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQlkaXNrID0gZ2V0X2dlbmRpc2soZGV2LCAmcGFydCk7CisJCWlmICghZGlzayB8fCBwYXJ0KSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAluZXdwbi0+ZGV2ID0gZGV2OwpAQCAtODQzLDcgKzgzMSw3IEBACiAJY2FzZSBCTEtJT19QT0xJQ1lfUFJPUDoKIAkJaWYgKCh0ZW1wIDwgQkxLSU9fV0VJR0hUX01JTiAmJiB0ZW1wID4gMCkgfHwKIAkJICAgICB0ZW1wID4gQkxLSU9fV0VJR0hUX01BWCkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZ290byBvdXQ7CiAKIAkJbmV3cG4tPnBsaWQgPSBwbGlkOwogCQluZXdwbi0+ZmlsZWlkID0gZmlsZWlkOwpAQCAtODYwLDcgKzg0OCw3IEBACiAJCWNhc2UgQkxLSU9fVEhST1RMX3JlYWRfaW9wc19kZXZpY2U6CiAJCWNhc2UgQkxLSU9fVEhST1RMX3dyaXRlX2lvcHNfZGV2aWNlOgogCQkJaWYgKHRlbXAgPiBUSFJPVExfSU9QU19NQVgpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CiAKIAkJCW5ld3BuLT5wbGlkID0gcGxpZDsKIAkJCW5ld3BuLT5maWxlaWQgPSBmaWxlaWQ7CkBAIC04NzEsNjggKzg1OSw5NiBAQAogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KLQotCXJldHVybiAwOworCXJldCA9IDA7CitvdXQ6CisJcHV0X2Rpc2soZGlzayk7CisJcmV0dXJuIHJldDsKIH0KIAogdW5zaWduZWQgaW50IGJsa2NnX2dldF93ZWlnaHQoc3RydWN0IGJsa2lvX2Nncm91cCAqYmxrY2csCiAJCQkgICAgICBkZXZfdCBkZXYpCiB7CiAJc3RydWN0IGJsa2lvX3BvbGljeV9ub2RlICpwbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB3ZWlnaHQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxrY2ctPmxvY2ssIGZsYWdzKTsKIAogCXBuID0gYmxraW9fcG9saWN5X3NlYXJjaF9ub2RlKGJsa2NnLCBkZXYsIEJMS0lPX1BPTElDWV9QUk9QLAogCQkJCUJMS0lPX1BST1Bfd2VpZ2h0X2RldmljZSk7CiAJaWYgKHBuKQotCQlyZXR1cm4gcG4tPnZhbC53ZWlnaHQ7CisJCXdlaWdodCA9IHBuLT52YWwud2VpZ2h0OwogCWVsc2UKLQkJcmV0dXJuIGJsa2NnLT53ZWlnaHQ7CisJCXdlaWdodCA9IGJsa2NnLT53ZWlnaHQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGtjZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHdlaWdodDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGJsa2NnX2dldF93ZWlnaHQpOwogCiB1aW50NjRfdCBibGtjZ19nZXRfcmVhZF9icHMoc3RydWN0IGJsa2lvX2Nncm91cCAqYmxrY2csIGRldl90IGRldikKIHsKIAlzdHJ1Y3QgYmxraW9fcG9saWN5X25vZGUgKnBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDY0X3QgYnBzID0gLTE7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxrY2ctPmxvY2ssIGZsYWdzKTsKIAlwbiA9IGJsa2lvX3BvbGljeV9zZWFyY2hfbm9kZShibGtjZywgZGV2LCBCTEtJT19QT0xJQ1lfVEhST1RMLAogCQkJCUJMS0lPX1RIUk9UTF9yZWFkX2Jwc19kZXZpY2UpOwogCWlmIChwbikKLQkJcmV0dXJuIHBuLT52YWwuYnBzOwotCWVsc2UKLQkJcmV0dXJuIC0xOworCQlicHMgPSBwbi0+dmFsLmJwczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGtjZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGJwczsKIH0KIAogdWludDY0X3QgYmxrY2dfZ2V0X3dyaXRlX2JwcyhzdHJ1Y3QgYmxraW9fY2dyb3VwICpibGtjZywgZGV2X3QgZGV2KQogewogCXN0cnVjdCBibGtpb19wb2xpY3lfbm9kZSAqcG47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50NjRfdCBicHMgPSAtMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGtjZy0+bG9jaywgZmxhZ3MpOwogCXBuID0gYmxraW9fcG9saWN5X3NlYXJjaF9ub2RlKGJsa2NnLCBkZXYsIEJMS0lPX1BPTElDWV9USFJPVEwsCiAJCQkJQkxLSU9fVEhST1RMX3dyaXRlX2Jwc19kZXZpY2UpOwogCWlmIChwbikKLQkJcmV0dXJuIHBuLT52YWwuYnBzOwotCWVsc2UKLQkJcmV0dXJuIC0xOworCQlicHMgPSBwbi0+dmFsLmJwczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGtjZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGJwczsKIH0KIAogdW5zaWduZWQgaW50IGJsa2NnX2dldF9yZWFkX2lvcHMoc3RydWN0IGJsa2lvX2Nncm91cCAqYmxrY2csIGRldl90IGRldikKIHsKIAlzdHJ1Y3QgYmxraW9fcG9saWN5X25vZGUgKnBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGlvcHMgPSAtMTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZibGtjZy0+bG9jaywgZmxhZ3MpOwogCXBuID0gYmxraW9fcG9saWN5X3NlYXJjaF9ub2RlKGJsa2NnLCBkZXYsIEJMS0lPX1BPTElDWV9USFJPVEwsCiAJCQkJQkxLSU9fVEhST1RMX3JlYWRfaW9wc19kZXZpY2UpOwogCWlmIChwbikKLQkJcmV0dXJuIHBuLT52YWwuaW9wczsKLQllbHNlCi0JCXJldHVybiAtMTsKKwkJaW9wcyA9IHBuLT52YWwuaW9wczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGtjZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlvcHM7CiB9CiAKIHVuc2lnbmVkIGludCBibGtjZ19nZXRfd3JpdGVfaW9wcyhzdHJ1Y3QgYmxraW9fY2dyb3VwICpibGtjZywgZGV2X3QgZGV2KQogewogCXN0cnVjdCBibGtpb19wb2xpY3lfbm9kZSAqcG47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaW9wcyA9IC0xOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsa2NnLT5sb2NrLCBmbGFncyk7CiAJcG4gPSBibGtpb19wb2xpY3lfc2VhcmNoX25vZGUoYmxrY2csIGRldiwgQkxLSU9fUE9MSUNZX1RIUk9UTCwKIAkJCQlCTEtJT19USFJPVExfd3JpdGVfaW9wc19kZXZpY2UpOwogCWlmIChwbikKLQkJcmV0dXJuIHBuLT52YWwuaW9wczsKLQllbHNlCi0JCXJldHVybiAtMTsKKwkJaW9wcyA9IHBuLT52YWwuaW9wczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGtjZy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlvcHM7CiB9CiAKIC8qIENoZWNrcyB3aGV0aGVyIHVzZXIgYXNrZWQgZm9yIGRlbGV0aW5nIGEgcG9saWN5IHJ1bGUgKi8KQEAgLTEwODUsNiArMTEwMSw3IEBACiAKIAlpZiAoYmxraW9fZGVsZXRlX3J1bGVfY29tbWFuZChuZXdwbikpIHsKIAkJYmxraW9fcG9saWN5X2RlbGV0ZV9ub2RlKHBuKTsKKwkJa2ZyZWUocG4pOwogCQlzcGluX3VubG9ja19pcnEoJmJsa2NnLT5sb2NrKTsKIAkJZ290byB1cGRhdGVfaW9fZ3JvdXA7CiAJfQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5oIGIvYmxvY2svYmxrLWNncm91cC5oCmluZGV4IGE3MWQyOTAuLjZmM2FjZTcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuaAorKysgYi9ibG9jay9ibGstY2dyb3VwLmgKQEAgLTE4OCw3ICsxODgsNyBAQAogCXVuaW9uIHsKIAkJdW5zaWduZWQgaW50IHdlaWdodDsKIAkJLyoKLQkJICogUmF0ZSByZWFkL3dyaXRlIGluIHRlcm1zIG9mIGJ5cHRlcyBwZXIgc2Vjb25kCisJCSAqIFJhdGUgcmVhZC93cml0ZSBpbiB0ZXJtcyBvZiBieXRlcyBwZXIgc2Vjb25kCiAJCSAqIFdoZXRoZXIgdGhpcyByYXRlIHJlcHJlc2VudHMgcmVhZCBvciB3cml0ZSBpcyBkZXRlcm1pbmVkCiAJCSAqIGJ5IGZpbGUgdHlwZSAiZmlsZWlkIi4KIAkJICovCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY29yZS5jIGIvYmxvY2svYmxrLWNvcmUuYwppbmRleCBkMzQ0MzNhLi5mNDNjOGE1IDEwMDY0NAotLS0gYS9ibG9jay9ibGstY29yZS5jCisrKyBiL2Jsb2NrL2Jsay1jb3JlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZmF1bHQtaW5qZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdF9zb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Jsb2NrLmg+CkBAIC0zOCw4ICszOSw2IEBACiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJsb2NrX3JxX3JlbWFwKTsKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmxvY2tfYmlvX2NvbXBsZXRlKTsKIAotc3RhdGljIGludCBfX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKLQogLyoKICAqIEZvciB0aGUgYWxsb2NhdGVkIHJlcXVlc3QgdGFibGVzCiAgKi8KQEAgLTM0NywzMCArMzQ2LDgwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGJsa19wdXRfcXVldWUpOwogCi0vKgotICogTm90ZTogSWYgYSBkcml2ZXIgc3VwcGxpZWQgdGhlIHF1ZXVlIGxvY2ssIGl0IGlzIGRpc2Nvbm5lY3RlZAotICogYnkgdGhpcyBmdW5jdGlvbi4gVGhlIGFjdHVhbCBzdGF0ZSBvZiB0aGUgbG9jayBkb2Vzbid0IG1hdHRlcgotICogaGVyZSBhcyB0aGUgcmVxdWVzdF9xdWV1ZSBpc24ndCBhY2Nlc3NpYmxlIGFmdGVyIHRoaXMgcG9pbnQKLSAqIChRVUVVRV9GTEFHX0RFQUQgaXMgc2V0KSBhbmQgbm8gb3RoZXIgcmVxdWVzdHMgd2lsbCBiZSBxdWV1ZWQuCisvKioKKyAqIGJsa19kcmFpbl9xdWV1ZSAtIGRyYWluIHJlcXVlc3RzIGZyb20gcmVxdWVzdF9xdWV1ZQorICogQHE6IHF1ZXVlIHRvIGRyYWluCisgKiBAZHJhaW5fYWxsOiB3aGV0aGVyIHRvIGRyYWluIGFsbCByZXF1ZXN0cyBvciBvbmx5IHRoZSBvbmVzIHcvIEVMVlBSSVYKKyAqCisgKiBEcmFpbiByZXF1ZXN0cyBmcm9tIEBxLiAgSWYgQGRyYWluX2FsbCBpcyBzZXQsIGFsbCByZXF1ZXN0cyBhcmUgZHJhaW5lZC4KKyAqIElmIG5vdCwgb25seSBFTFZQUklWIHJlcXVlc3RzIGFyZSBkcmFpbmVkLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICogZm9yIGVuc3VyaW5nIHRoYXQgbm8gbmV3IHJlcXVlc3RzIHdoaWNoIG5lZWQgdG8gYmUgZHJhaW5lZCBhcmUgcXVldWVkLgorICovCit2b2lkIGJsa19kcmFpbl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgYm9vbCBkcmFpbl9hbGwpCit7CisJd2hpbGUgKHRydWUpIHsKKwkJaW50IG5yX3JxczsKKworCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCisJCWVsdl9kcmFpbl9lbGV2YXRvcihxKTsKKwkJaWYgKGRyYWluX2FsbCkKKwkJCWJsa190aHJvdGxfZHJhaW4ocSk7CisKKwkJX19ibGtfcnVuX3F1ZXVlKHEpOworCisJCWlmIChkcmFpbl9hbGwpCisJCQlucl9ycXMgPSBxLT5ycS5jb3VudFswXSArIHEtPnJxLmNvdW50WzFdOworCQllbHNlCisJCQlucl9ycXMgPSBxLT5ycS5lbHZwcml2OworCisJCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKworCQlpZiAoIW5yX3JxcykKKwkJCWJyZWFrOworCQltc2xlZXAoMTApOworCX0KK30KKworLyoqCisgKiBibGtfY2xlYW51cF9xdWV1ZSAtIHNodXRkb3duIGEgcmVxdWVzdCBxdWV1ZQorICogQHE6IHJlcXVlc3QgcXVldWUgdG8gc2h1dGRvd24KKyAqCisgKiBNYXJrIEBxIERFQUQsIGRyYWluIGFsbCBwZW5kaW5nIHJlcXVlc3RzLCBkZXN0cm95IGFuZCBwdXQgaXQuICBBbGwKKyAqIGZ1dHVyZSByZXF1ZXN0cyB3aWxsIGJlIGZhaWxlZCBpbW1lZGlhdGVseSB3aXRoIC1FTk9ERVYuCiAgKi8KIHZvaWQgYmxrX2NsZWFudXBfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7Ci0JLyoKLQkgKiBXZSBrbm93IHdlIGhhdmUgcHJvY2VzcyBjb250ZXh0IGhlcmUsIHNvIHdlIGNhbiBiZSBhIGxpdHRsZQotCSAqIGNhdXRpb3VzIGFuZCBlbnN1cmUgdGhhdCBwZW5kaW5nIGJsb2NrIGFjdGlvbnMgb24gdGhpcyBkZXZpY2UKLQkgKiBhcmUgZG9uZSBiZWZvcmUgbW92aW5nIG9uLiBHb2luZyBpbnRvIHRoaXMgZnVuY3Rpb24sIHdlIHNob3VsZAotCSAqIG5vdCBoYXZlIHByb2Nlc3NlcyBkb2luZyBJTyB0byB0aGlzIGRldmljZS4KLQkgKi8KLQlibGtfc3luY19xdWV1ZShxKTsKKwlzcGlubG9ja190ICpsb2NrID0gcS0+cXVldWVfbG9jazsKIAotCWRlbF90aW1lcl9zeW5jKCZxLT5iYWNraW5nX2Rldl9pbmZvLmxhcHRvcF9tb2RlX3diX3RpbWVyKTsKKwkvKiBtYXJrIEBxIERFQUQsIG5vIG5ldyByZXF1ZXN0IG9yIG1lcmdlcyB3aWxsIGJlIGFsbG93ZWQgYWZ0ZXJ3YXJkcyAqLwogCW11dGV4X2xvY2soJnEtPnN5c2ZzX2xvY2spOwogCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfREVBRCwgcSk7Ci0JbXV0ZXhfdW5sb2NrKCZxLT5zeXNmc19sb2NrKTsKKworCXNwaW5fbG9ja19pcnEobG9jayk7CisJcXVldWVfZmxhZ19zZXQoUVVFVUVfRkxBR19OT01FUkdFUywgcSk7CisJcXVldWVfZmxhZ19zZXQoUVVFVUVfRkxBR19OT1hNRVJHRVMsIHEpOworCXF1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfREVBRCwgcSk7CiAKIAlpZiAocS0+cXVldWVfbG9jayAhPSAmcS0+X19xdWV1ZV9sb2NrKQogCQlxLT5xdWV1ZV9sb2NrID0gJnEtPl9fcXVldWVfbG9jazsKIAorCXNwaW5fdW5sb2NrX2lycShsb2NrKTsKKwltdXRleF91bmxvY2soJnEtPnN5c2ZzX2xvY2spOworCisJLyoKKwkgKiBEcmFpbiBhbGwgcmVxdWVzdHMgcXVldWVkIGJlZm9yZSBERUFEIG1hcmtpbmcuICBUaGUgY2FsbGVyIG1pZ2h0CisJICogYmUgdHJ5aW5nIHRvIHRlYXIgZG93biBAcSBiZWZvcmUgaXRzIGVsZXZhdG9yIGlzIGluaXRpYWxpemVkLCBpbgorCSAqIHdoaWNoIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsIGludG8gZHJhaW5pbmcuCisJICovCisJaWYgKHEtPmVsZXZhdG9yKQorCQlibGtfZHJhaW5fcXVldWUocSwgdHJ1ZSk7CisKKwkvKiBAcSB3b24ndCBwcm9jZXNzIGFueSBtb3JlIHJlcXVlc3QsIGZsdXNoIGFzeW5jIGFjdGlvbnMgKi8KKwlkZWxfdGltZXJfc3luYygmcS0+YmFja2luZ19kZXZfaW5mby5sYXB0b3BfbW9kZV93Yl90aW1lcik7CisJYmxrX3N5bmNfcXVldWUocSk7CisKKwkvKiBAcSBpcyBhbmQgd2lsbCBzdGF5IGVtcHR5LCBzaHV0ZG93biBhbmQgcHV0ICovCiAJYmxrX3B1dF9xdWV1ZShxKTsKIH0KIEVYUE9SVF9TWU1CT0woYmxrX2NsZWFudXBfcXVldWUpOwpAQCAtNTQxLDcgKzU5MCw3IEBACiAJLyoKIAkgKiBUaGlzIGFsc28gc2V0cyBody9waHlzIHNlZ21lbnRzLCBib3VuZGFyeSBhbmQgc2l6ZQogCSAqLwotCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QocSwgX19tYWtlX3JlcXVlc3QpOworCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QocSwgYmxrX3F1ZXVlX2Jpbyk7CiAKIAlxLT5zZ19yZXNlcnZlZF9zaXplID0gSU5UX01BWDsKIApAQCAtNTc2LDcgKzYyNSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqCi1ibGtfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IGZsYWdzLCBpbnQgcHJpdiwgZ2ZwX3QgZ2ZwX21hc2spCitibGtfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGZsYWdzLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBtZW1wb29sX2FsbG9jKHEtPnJxLnJxX3Bvb2wsIGdmcF9tYXNrKTsKIApAQCAtNTg3LDEyICs2MzYsMTAgQEAKIAogCXJxLT5jbWRfZmxhZ3MgPSBmbGFncyB8IFJFUV9BTExPQ0VEOwogCi0JaWYgKHByaXYpIHsKLQkJaWYgKHVubGlrZWx5KGVsdl9zZXRfcmVxdWVzdChxLCBycSwgZ2ZwX21hc2spKSkgewotCQkJbWVtcG9vbF9mcmVlKHJxLCBxLT5ycS5ycV9wb29sKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX0VMVlBSSVY7CisJaWYgKChmbGFncyAmIFJFUV9FTFZQUklWKSAmJgorCSAgICB1bmxpa2VseShlbHZfc2V0X3JlcXVlc3QocSwgcnEsIGdmcF9tYXNrKSkpIHsKKwkJbWVtcG9vbF9mcmVlKHJxLCBxLT5ycS5ycV9wb29sKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcmV0dXJuIHJxOwpAQCAtNjUxLDEyICs2OTgsMTMgQEAKICAqIEEgcmVxdWVzdCBoYXMganVzdCBiZWVuIHJlbGVhc2VkLiAgQWNjb3VudCBmb3IgaXQsIHVwZGF0ZSB0aGUgZnVsbCBhbmQKICAqIGNvbmdlc3Rpb24gc3RhdHVzLCB3YWtlIHVwIGFueSB3YWl0ZXJzLiAgIENhbGxlZCB1bmRlciBxLT5xdWV1ZV9sb2NrLgogICovCi1zdGF0aWMgdm9pZCBmcmVlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgc3luYywgaW50IHByaXYpCitzdGF0aWMgdm9pZCBmcmVlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHJlcXVlc3RfbGlzdCAqcmwgPSAmcS0+cnE7CisJaW50IHN5bmMgPSByd19pc19zeW5jKGZsYWdzKTsKIAogCXJsLT5jb3VudFtzeW5jXS0tOwotCWlmIChwcml2KQorCWlmIChmbGFncyAmIFJFUV9FTFZQUklWKQogCQlybC0+ZWx2cHJpdi0tOwogCiAJX19mcmVlZF9yZXF1ZXN0KHEsIHN5bmMpOwpAQCAtNjg0LDEwICs3MzIsMTkgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotLyoKLSAqIEdldCBhIGZyZWUgcmVxdWVzdCwgcXVldWVfbG9jayBtdXN0IGJlIGhlbGQuCi0gKiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZSwgd2l0aCBxdWV1ZV9sb2NrIGhlbGQuCi0gKiBSZXR1cm5zICFOVUxMIG9uIHN1Y2Nlc3MsIHdpdGggcXVldWVfbG9jayAqbm90IGhlbGQqLgorLyoqCisgKiBnZXRfcmVxdWVzdCAtIGdldCBhIGZyZWUgcmVxdWVzdAorICogQHE6IHJlcXVlc3RfcXVldWUgdG8gYWxsb2NhdGUgcmVxdWVzdCBmcm9tCisgKiBAcndfZmxhZ3M6IFJXIGFuZCBTWU5DIGZsYWdzCisgKiBAYmlvOiBiaW8gdG8gYWxsb2NhdGUgcmVxdWVzdCBmb3IgKGNhbiBiZSAlTlVMTCkKKyAqIEBnZnBfbWFzazogYWxsb2NhdGlvbiBtYXNrCisgKgorICogR2V0IGEgZnJlZSByZXF1ZXN0IGZyb20gQHEuICBUaGlzIGZ1bmN0aW9uIG1heSBmYWlsIHVuZGVyIG1lbW9yeQorICogcHJlc3N1cmUgb3IgaWYgQHEgaXMgZGVhZC4KKyAqCisgKiBNdXN0IGJlIGNhbGxsZWQgd2l0aCBAcS0+cXVldWVfbG9jayBoZWxkIGFuZCwKKyAqIFJldHVybnMgJU5VTEwgb24gZmFpbHVyZSwgd2l0aCBAcS0+cXVldWVfbG9jayBoZWxkLgorICogUmV0dXJucyAhJU5VTEwgb24gc3VjY2Vzcywgd2l0aCBAcS0+cXVldWVfbG9jayAqbm90IGhlbGQqLgogICovCiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmdldF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgcndfZmxhZ3MsCiAJCQkJICAgc3RydWN0IGJpbyAqYmlvLCBnZnBfdCBnZnBfbWFzaykKQEAgLTY5Niw3ICs3NTMsMTAgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKIAlzdHJ1Y3QgaW9fY29udGV4dCAqaW9jID0gTlVMTDsKIAljb25zdCBib29sIGlzX3N5bmMgPSByd19pc19zeW5jKHJ3X2ZsYWdzKSAhPSAwOwotCWludCBtYXlfcXVldWUsIHByaXYgPSAwOworCWludCBtYXlfcXVldWU7CisKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoUVVFVUVfRkxBR19ERUFELCAmcS0+cXVldWVfZmxhZ3MpKSkKKwkJcmV0dXJuIE5VTEw7CiAKIAltYXlfcXVldWUgPSBlbHZfbWF5X3F1ZXVlKHEsIHJ3X2ZsYWdzKTsKIAlpZiAobWF5X3F1ZXVlID09IEVMVl9NUVVFVUVfTk8pCkBAIC03NDAsMTcgKzgwMCwxNyBAQAogCXJsLT5jb3VudFtpc19zeW5jXSsrOwogCXJsLT5zdGFydmVkW2lzX3N5bmNdID0gMDsKIAotCWlmIChibGtfcnFfc2hvdWxkX2luaXRfZWxldmF0b3IoYmlvKSkgewotCQlwcml2ID0gIXRlc3RfYml0KFFVRVVFX0ZMQUdfRUxWU1dJVENILCAmcS0+cXVldWVfZmxhZ3MpOwotCQlpZiAocHJpdikKLQkJCXJsLT5lbHZwcml2Kys7CisJaWYgKGJsa19ycV9zaG91bGRfaW5pdF9lbGV2YXRvcihiaW8pICYmCisJICAgICF0ZXN0X2JpdChRVUVVRV9GTEFHX0VMVlNXSVRDSCwgJnEtPnF1ZXVlX2ZsYWdzKSkgeworCQlyd19mbGFncyB8PSBSRVFfRUxWUFJJVjsKKwkJcmwtPmVsdnByaXYrKzsKIAl9CiAKIAlpZiAoYmxrX3F1ZXVlX2lvX3N0YXQocSkpCiAJCXJ3X2ZsYWdzIHw9IFJFUV9JT19TVEFUOwogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAotCXJxID0gYmxrX2FsbG9jX3JlcXVlc3QocSwgcndfZmxhZ3MsIHByaXYsIGdmcF9tYXNrKTsKKwlycSA9IGJsa19hbGxvY19yZXF1ZXN0KHEsIHJ3X2ZsYWdzLCBnZnBfbWFzayk7CiAJaWYgKHVubGlrZWx5KCFycSkpIHsKIAkJLyoKIAkJICogQWxsb2NhdGlvbiBmYWlsZWQgcHJlc3VtYWJseSBkdWUgdG8gbWVtb3J5LiBVbmRvIGFueXRoaW5nCkBAIC03NjAsNyArODIwLDcgQEAKIAkJICogd2FpdCBxdWV1ZSwgYnV0IHRoaXMgaXMgcHJldHR5IHJhcmUuCiAJCSAqLwogCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCQlmcmVlZF9yZXF1ZXN0KHEsIGlzX3N5bmMsIHByaXYpOworCQlmcmVlZF9yZXF1ZXN0KHEsIHJ3X2ZsYWdzKTsKIAogCQkvKgogCQkgKiBpbiB0aGUgdmVyeSB1bmxpa2VseSBldmVudCB0aGF0IGFsbG9jYXRpb24gZmFpbGVkIGFuZCBubwpAQCAtNzkwLDExICs4NTAsMTggQEAKIAlyZXR1cm4gcnE7CiB9CiAKLS8qCi0gKiBObyBhdmFpbGFibGUgcmVxdWVzdHMgZm9yIHRoaXMgcXVldWUsIHdhaXQgZm9yIHNvbWUgcmVxdWVzdHMgdG8gYmVjb21lCi0gKiBhdmFpbGFibGUuCisvKioKKyAqIGdldF9yZXF1ZXN0X3dhaXQgLSBnZXQgYSBmcmVlIHJlcXVlc3Qgd2l0aCByZXRyeQorICogQHE6IHJlcXVlc3RfcXVldWUgdG8gYWxsb2NhdGUgcmVxdWVzdCBmcm9tCisgKiBAcndfZmxhZ3M6IFJXIGFuZCBTWU5DIGZsYWdzCisgKiBAYmlvOiBiaW8gdG8gYWxsb2NhdGUgcmVxdWVzdCBmb3IgKGNhbiBiZSAlTlVMTCkKICAqCi0gKiBDYWxsZWQgd2l0aCBxLT5xdWV1ZV9sb2NrIGhlbGQsIGFuZCByZXR1cm5zIHdpdGggaXQgdW5sb2NrZWQuCisgKiBHZXQgYSBmcmVlIHJlcXVlc3QgZnJvbSBAcS4gIFRoaXMgZnVuY3Rpb24ga2VlcHMgcmV0cnlpbmcgdW5kZXIgbWVtb3J5CisgKiBwcmVzc3VyZSBhbmQgZmFpbHMgaWZmIEBxIGlzIGRlYWQuCisgKgorICogTXVzdCBiZSBjYWxsbGVkIHdpdGggQHEtPnF1ZXVlX2xvY2sgaGVsZCBhbmQsCisgKiBSZXR1cm5zICVOVUxMIG9uIGZhaWx1cmUsIHdpdGggQHEtPnF1ZXVlX2xvY2sgaGVsZC4KKyAqIFJldHVybnMgISVOVUxMIG9uIHN1Y2Nlc3MsIHdpdGggQHEtPnF1ZXVlX2xvY2sgKm5vdCBoZWxkKi4KICAqLwogc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpnZXRfcmVxdWVzdF93YWl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgcndfZmxhZ3MsCiAJCQkJCXN0cnVjdCBiaW8gKmJpbykKQEAgLTgwOCw2ICs4NzUsOSBAQAogCQlzdHJ1Y3QgaW9fY29udGV4dCAqaW9jOwogCQlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKIAorCQlpZiAodW5saWtlbHkodGVzdF9iaXQoUVVFVUVfRkxBR19ERUFELCAmcS0+cXVldWVfZmxhZ3MpKSkKKwkJCXJldHVybiBOVUxMOworCiAJCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoJnJsLT53YWl0W2lzX3N5bmNdLCAmd2FpdCwKIAkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAKQEAgLTgzOCwxOSArOTA4LDE1IEBACiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KFFVRVVFX0ZMQUdfREVBRCwgJnEtPnF1ZXVlX2ZsYWdzKSkpCi0JCXJldHVybiBOVUxMOwotCiAJQlVHX09OKHJ3ICE9IFJFQUQgJiYgcncgIT0gV1JJVEUpOwogCiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQlpZiAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSB7CisJaWYgKGdmcF9tYXNrICYgX19HRlBfV0FJVCkKIAkJcnEgPSBnZXRfcmVxdWVzdF93YWl0KHEsIHJ3LCBOVUxMKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJcnEgPSBnZXRfcmVxdWVzdChxLCBydywgTlVMTCwgZ2ZwX21hc2spOwotCQlpZiAoIXJxKQotCQkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCX0KKwlpZiAoIXJxKQorCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJLyogcS0+cXVldWVfbG9jayBpcyB1bmxvY2tlZCBhdCB0aGlzIHBvaW50ICovCiAKIAlyZXR1cm4gcnE7CkBAIC0xMDUyLDE0ICsxMTE4LDEzIEBACiAJICogaXQgZGlkbid0IGNvbWUgb3V0IG9mIG91ciByZXNlcnZlZCBycSBwb29scwogCSAqLwogCWlmIChyZXEtPmNtZF9mbGFncyAmIFJFUV9BTExPQ0VEKSB7Ci0JCWludCBpc19zeW5jID0gcnFfaXNfc3luYyhyZXEpICE9IDA7Ci0JCWludCBwcml2ID0gcmVxLT5jbWRfZmxhZ3MgJiBSRVFfRUxWUFJJVjsKKwkJdW5zaWduZWQgaW50IGZsYWdzID0gcmVxLT5jbWRfZmxhZ3M7CiAKIAkJQlVHX09OKCFsaXN0X2VtcHR5KCZyZXEtPnF1ZXVlbGlzdCkpOwogCQlCVUdfT04oIWhsaXN0X3VuaGFzaGVkKCZyZXEtPmhhc2gpKTsKIAogCQlibGtfZnJlZV9yZXF1ZXN0KHEsIHJlcSk7Ci0JCWZyZWVkX3JlcXVlc3QocSwgaXNfc3luYywgcHJpdik7CisJCWZyZWVkX3JlcXVlc3QocSwgZmxhZ3MpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fYmxrX3B1dF9yZXF1ZXN0KTsKQEAgLTExNjEsMTggKzEyMjYsMzIgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotLyoKLSAqIEF0dGVtcHRzIHRvIG1lcmdlIHdpdGggdGhlIHBsdWdnZWQgbGlzdCBpbiB0aGUgY3VycmVudCBwcm9jZXNzLiBSZXR1cm5zCi0gKiB0cnVlIGlmIG1lcmdlIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCisvKioKKyAqIGF0dGVtcHRfcGx1Z19tZXJnZSAtIHRyeSB0byBtZXJnZSB3aXRoICVjdXJyZW50J3MgcGx1Z2dlZCBsaXN0CisgKiBAcTogcmVxdWVzdF9xdWV1ZSBuZXcgYmlvIGlzIGJlaW5nIHF1ZXVlZCBhdAorICogQGJpbzogbmV3IGJpbyBiZWluZyBxdWV1ZWQKKyAqIEByZXF1ZXN0X2NvdW50OiBvdXQgcGFyYW1ldGVyIGZvciBudW1iZXIgb2YgdHJhdmVyc2VkIHBsdWdnZWQgcmVxdWVzdHMKKyAqCisgKiBEZXRlcm1pbmUgd2hldGhlciBAYmlvIGJlaW5nIHF1ZXVlZCBvbiBAcSBjYW4gYmUgbWVyZ2VkIHdpdGggYSByZXF1ZXN0CisgKiBvbiAlY3VycmVudCdzIHBsdWdnZWQgbGlzdC4gIFJldHVybnMgJXRydWUgaWYgbWVyZ2Ugd2FzIHN1Y2Nlc3NmdWwsCisgKiBvdGhlcndpc2UgJWZhbHNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgQHEtPnF1ZXVlX2xvY2s7IGhvd2V2ZXIsIGVsZXZhdG9yIGlzCisgKiBhY2Nlc3NlZCBpZmYgdGhlcmUgYWxyZWFkeSBhcmUgcmVxdWVzdHMgb24gdGhlIHBsdWdnZWQgbGlzdCB3aGljaCBpbgorICogdHVybiBndWFyYW50ZWVzIHZhbGlkaXR5IG9mIHRoZSBlbGV2YXRvci4KKyAqCisgKiBOb3RlIHRoYXQsIG9uIHN1Y2Nlc3NmdWwgbWVyZ2UsIGVsZXZhdG9yIG9wZXJhdGlvbgorICogZWxldmF0b3JfYmlvX21lcmdlZF9mbigpIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgcXVldWUgbG9jay4gIEVsZXZhdG9yCisgKiBtdXN0IGJlIHJlYWR5IGZvciB0aGlzLgogICovCi1zdGF0aWMgYm9vbCBhdHRlbXB0X3BsdWdfbWVyZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAotCQkJICAgICAgIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50ICpyZXF1ZXN0X2NvdW50KQorc3RhdGljIGJvb2wgYXR0ZW1wdF9wbHVnX21lcmdlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpyZXF1ZXN0X2NvdW50KQogewogCXN0cnVjdCBibGtfcGx1ZyAqcGx1ZzsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJYm9vbCByZXQgPSBmYWxzZTsKIAotCXBsdWcgPSB0c2stPnBsdWc7CisJcGx1ZyA9IGN1cnJlbnQtPnBsdWc7CiAJaWYgKCFwbHVnKQogCQlnb3RvIG91dDsKIAkqcmVxdWVzdF9jb3VudCA9IDA7CkBAIC0xMjAyLDcgKzEyODEsNiBAQAogCiB2b2lkIGluaXRfcmVxdWVzdF9mcm9tX2JpbyhzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JcmVxLT5jcHUgPSBiaW8tPmJpX2NvbXBfY3B1OwogCXJlcS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9GUzsKIAogCXJlcS0+Y21kX2ZsYWdzIHw9IGJpby0+YmlfcncgJiBSRVFfQ09NTU9OX01BU0s7CkBAIC0xMjE1LDcgKzEyOTMsNyBAQAogCWJsa19ycV9iaW9fcHJlcChyZXEtPnEsIHJlcSwgYmlvKTsKIH0KIAotc3RhdGljIGludCBfX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQordm9pZCBibGtfcXVldWVfYmlvKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJY29uc3QgYm9vbCBzeW5jID0gISEoYmlvLT5iaV9ydyAmIFJFUV9TWU5DKTsKIAlzdHJ1Y3QgYmxrX3BsdWcgKnBsdWc7CkBAIC0xMjQwLDggKzEzMTgsOCBAQAogCSAqIENoZWNrIGlmIHdlIGNhbiBtZXJnZSB3aXRoIHRoZSBwbHVnZ2VkIGxpc3QgYmVmb3JlIGdyYWJiaW5nCiAJICogYW55IGxvY2tzLgogCSAqLwotCWlmIChhdHRlbXB0X3BsdWdfbWVyZ2UoY3VycmVudCwgcSwgYmlvLCAmcmVxdWVzdF9jb3VudCkpCi0JCWdvdG8gb3V0OworCWlmIChhdHRlbXB0X3BsdWdfbWVyZ2UocSwgYmlvLCAmcmVxdWVzdF9jb3VudCkpCisJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKQEAgLTEyNzUsNiArMTM1MywxMCBAQAogCSAqIFJldHVybnMgd2l0aCB0aGUgcXVldWUgdW5sb2NrZWQuCiAJICovCiAJcmVxID0gZ2V0X3JlcXVlc3Rfd2FpdChxLCByd19mbGFncywgYmlvKTsKKwlpZiAodW5saWtlbHkoIXJlcSkpIHsKKwkJYmlvX2VuZGlvKGJpbywgLUVOT0RFVik7CS8qIEBxIGlzIGRlYWQgKi8KKwkJZ290byBvdXRfdW5sb2NrOworCX0KIAogCS8qCiAJICogQWZ0ZXIgZHJvcHBpbmcgdGhlIGxvY2sgYW5kIHBvc3NpYmx5IHNsZWVwaW5nIGhlcmUsIG91ciByZXF1ZXN0CkBAIC0xMjg0LDggKzEzNjYsNyBAQAogCSAqLwogCWluaXRfcmVxdWVzdF9mcm9tX2JpbyhyZXEsIGJpbyk7CiAKLQlpZiAodGVzdF9iaXQoUVVFVUVfRkxBR19TQU1FX0NPTVAsICZxLT5xdWV1ZV9mbGFncykgfHwKLQkgICAgYmlvX2ZsYWdnZWQoYmlvLCBCSU9fQ1BVX0FGRklORSkpCisJaWYgKHRlc3RfYml0KFFVRVVFX0ZMQUdfU0FNRV9DT01QLCAmcS0+cXVldWVfZmxhZ3MpKQogCQlyZXEtPmNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlwbHVnID0gY3VycmVudC0+cGx1ZzsKQEAgLTEzMTYsOSArMTM5Nyw4IEBACiBvdXRfdW5sb2NrOgogCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJfQotb3V0OgotCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX3F1ZXVlX2Jpbyk7CS8qIGZvciBkZXZpY2UgbWFwcGVyIG9ubHkgKi8KIAogLyoKICAqIElmIGJpby0+YmlfZGV2IGlzIGEgcGFydGl0aW9uLCByZW1hcCB0aGUgbG9jYXRpb24KQEAgLTE0MTcsNiArMTQ5Nyw4OSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGJvb2wKK2dlbmVyaWNfbWFrZV9yZXF1ZXN0X2NoZWNrcyhzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CisJaW50IG5yX3NlY3RvcnMgPSBiaW9fc2VjdG9ycyhiaW8pOworCWludCBlcnIgPSAtRUlPOworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OworCisJbWlnaHRfc2xlZXAoKTsKKworCWlmIChiaW9fY2hlY2tfZW9kKGJpbywgbnJfc2VjdG9ycykpCisJCWdvdG8gZW5kX2lvOworCisJcSA9IGJkZXZfZ2V0X3F1ZXVlKGJpby0+YmlfYmRldik7CisJaWYgKHVubGlrZWx5KCFxKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJnZW5lcmljX21ha2VfcmVxdWVzdDogVHJ5aW5nIHRvIGFjY2VzcyAiCisJCQkibm9uZXhpc3RlbnQgYmxvY2stZGV2aWNlICVzICglTHUpXG4iLAorCQkJYmRldm5hbWUoYmlvLT5iaV9iZGV2LCBiKSwKKwkJCShsb25nIGxvbmcpIGJpby0+Ymlfc2VjdG9yKTsKKwkJZ290byBlbmRfaW87CisJfQorCisJaWYgKHVubGlrZWx5KCEoYmlvLT5iaV9ydyAmIFJFUV9ESVNDQVJEKSAmJgorCQkgICAgIG5yX3NlY3RvcnMgPiBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiaW8gdG9vIGJpZyBkZXZpY2UgJXMgKCV1ID4gJXUpXG4iLAorCQkgICAgICAgYmRldm5hbWUoYmlvLT5iaV9iZGV2LCBiKSwKKwkJICAgICAgIGJpb19zZWN0b3JzKGJpbyksCisJCSAgICAgICBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSk7CisJCWdvdG8gZW5kX2lvOworCX0KKworCXBhcnQgPSBiaW8tPmJpX2JkZXYtPmJkX3BhcnQ7CisJaWYgKHNob3VsZF9mYWlsX3JlcXVlc3QocGFydCwgYmlvLT5iaV9zaXplKSB8fAorCSAgICBzaG91bGRfZmFpbF9yZXF1ZXN0KCZwYXJ0X3RvX2Rpc2socGFydCktPnBhcnQwLAorCQkJCWJpby0+Ymlfc2l6ZSkpCisJCWdvdG8gZW5kX2lvOworCisJLyoKKwkgKiBJZiB0aGlzIGRldmljZSBoYXMgcGFydGl0aW9ucywgcmVtYXAgYmxvY2sgbgorCSAqIG9mIHBhcnRpdGlvbiBwIHRvIGJsb2NrIG4rc3RhcnQocCkgb2YgdGhlIGRpc2suCisJICovCisJYmxrX3BhcnRpdGlvbl9yZW1hcChiaW8pOworCisJaWYgKGJpb19pbnRlZ3JpdHlfZW5hYmxlZChiaW8pICYmIGJpb19pbnRlZ3JpdHlfcHJlcChiaW8pKQorCQlnb3RvIGVuZF9pbzsKKworCWlmIChiaW9fY2hlY2tfZW9kKGJpbywgbnJfc2VjdG9ycykpCisJCWdvdG8gZW5kX2lvOworCisJLyoKKwkgKiBGaWx0ZXIgZmx1c2ggYmlvJ3MgZWFybHkgc28gdGhhdCBtYWtlX3JlcXVlc3QgYmFzZWQKKwkgKiBkcml2ZXJzIHdpdGhvdXQgZmx1c2ggc3VwcG9ydCBkb24ndCBoYXZlIHRvIHdvcnJ5CisJICogYWJvdXQgdGhlbS4KKwkgKi8KKwlpZiAoKGJpby0+YmlfcncgJiAoUkVRX0ZMVVNIIHwgUkVRX0ZVQSkpICYmICFxLT5mbHVzaF9mbGFncykgeworCQliaW8tPmJpX3J3ICY9IH4oUkVRX0ZMVVNIIHwgUkVRX0ZVQSk7CisJCWlmICghbnJfc2VjdG9ycykgeworCQkJZXJyID0gMDsKKwkJCWdvdG8gZW5kX2lvOworCQl9CisJfQorCisJaWYgKChiaW8tPmJpX3J3ICYgUkVRX0RJU0NBUkQpICYmCisJICAgICghYmxrX3F1ZXVlX2Rpc2NhcmQocSkgfHwKKwkgICAgICgoYmlvLT5iaV9ydyAmIFJFUV9TRUNVUkUpICYmCisJICAgICAgIWJsa19xdWV1ZV9zZWNkaXNjYXJkKHEpKSkpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZW5kX2lvOworCX0KKworCWlmIChibGtfdGhyb3RsX2JpbyhxLCBiaW8pKQorCQlyZXR1cm4gZmFsc2U7CS8qIHRocm90dGxlZCwgd2lsbCBiZSByZXN1Ym1pdHRlZCBsYXRlciAqLworCisJdHJhY2VfYmxvY2tfYmlvX3F1ZXVlKHEsIGJpbyk7CisJcmV0dXJuIHRydWU7CisKK2VuZF9pbzoKKwliaW9fZW5kaW8oYmlvLCBlcnIpOworCXJldHVybiBmYWxzZTsKK30KKwogLyoqCiAgKiBnZW5lcmljX21ha2VfcmVxdWVzdCAtIGhhbmQgYSBidWZmZXIgdG8gaXRzIGRldmljZSBkcml2ZXIgZm9yIEkvTwogICogQGJpbzogIFRoZSBiaW8gZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gaW4gbWVtb3J5IGFuZCBvbiB0aGUgZGV2aWNlLgpAQCAtMTQzNywxNDUgKzE2MDAsMzIgQEAKICAqIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIHNob3VsZCBiZSBzaWduYWxlZC4KICAqCiAgKiBnZW5lcmljX21ha2VfcmVxdWVzdCBhbmQgdGhlIGRyaXZlcnMgaXQgY2FsbHMgbWF5IHVzZSBiaV9uZXh0IGlmIHRoaXMKLSAqIGJpbyBoYXBwZW5zIHRvIGJlIG1lcmdlZCB3aXRoIHNvbWVvbmUgZWxzZSwgYW5kIG1heSBjaGFuZ2UgYmlfZGV2IGFuZAotICogYmlfc2VjdG9yIGZvciByZW1hcHMgYXMgaXQgc2VlcyBmaXQuICBTbyB0aGUgdmFsdWVzIG9mIHRoZXNlIGZpZWxkcwotICogc2hvdWxkIE5PVCBiZSBkZXBlbmRlZCBvbiBhZnRlciB0aGUgY2FsbCB0byBnZW5lcmljX21ha2VfcmVxdWVzdC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fZ2VuZXJpY19tYWtlX3JlcXVlc3Qoc3RydWN0IGJpbyAqYmlvKQotewotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwotCXNlY3Rvcl90IG9sZF9zZWN0b3I7Ci0JaW50IHJldCwgbnJfc2VjdG9ycyA9IGJpb19zZWN0b3JzKGJpbyk7Ci0JZGV2X3Qgb2xkX2RldjsKLQlpbnQgZXJyID0gLUVJTzsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQlpZiAoYmlvX2NoZWNrX2VvZChiaW8sIG5yX3NlY3RvcnMpKQotCQlnb3RvIGVuZF9pbzsKLQotCS8qCi0JICogUmVzb2x2ZSB0aGUgbWFwcGluZyB1bnRpbCBmaW5pc2hlZC4gKGRyaXZlcnMgYXJlCi0JICogc3RpbGwgZnJlZSB0byBpbXBsZW1lbnQvcmVzb2x2ZSB0aGVpciBvd24gc3RhY2tpbmcKLQkgKiBieSBleHBsaWNpdGx5IHJldHVybmluZyAwKQotCSAqCi0JICogTk9URTogd2UgZG9uJ3QgcmVwZWF0IHRoZSBibGtfc2l6ZSBjaGVjayBmb3IgZWFjaCBuZXcgZGV2aWNlLgotCSAqIFN0YWNraW5nIGRyaXZlcnMgYXJlIGV4cGVjdGVkIHRvIGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZy4KLQkgKi8KLQlvbGRfc2VjdG9yID0gLTE7Ci0Jb2xkX2RldiA9IDA7Ci0JZG8gewotCQljaGFyIGJbQkRFVk5BTUVfU0laRV07Ci0JCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7Ci0KLQkJcSA9IGJkZXZfZ2V0X3F1ZXVlKGJpby0+YmlfYmRldik7Ci0JCWlmICh1bmxpa2VseSghcSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJnZW5lcmljX21ha2VfcmVxdWVzdDogVHJ5aW5nIHRvIGFjY2VzcyAiCi0JCQkJIm5vbmV4aXN0ZW50IGJsb2NrLWRldmljZSAlcyAoJUx1KVxuIiwKLQkJCQliZGV2bmFtZShiaW8tPmJpX2JkZXYsIGIpLAotCQkJCShsb25nIGxvbmcpIGJpby0+Ymlfc2VjdG9yKTsKLQkJCWdvdG8gZW5kX2lvOwotCQl9Ci0KLQkJaWYgKHVubGlrZWx5KCEoYmlvLT5iaV9ydyAmIFJFUV9ESVNDQVJEKSAmJgotCQkJICAgICBucl9zZWN0b3JzID4gcXVldWVfbWF4X2h3X3NlY3RvcnMocSkpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbyB0b28gYmlnIGRldmljZSAlcyAoJXUgPiAldSlcbiIsCi0JCQkgICAgICAgYmRldm5hbWUoYmlvLT5iaV9iZGV2LCBiKSwKLQkJCSAgICAgICBiaW9fc2VjdG9ycyhiaW8pLAotCQkJICAgICAgIHF1ZXVlX21heF9od19zZWN0b3JzKHEpKTsKLQkJCWdvdG8gZW5kX2lvOwotCQl9Ci0KLQkJaWYgKHVubGlrZWx5KHRlc3RfYml0KFFVRVVFX0ZMQUdfREVBRCwgJnEtPnF1ZXVlX2ZsYWdzKSkpCi0JCQlnb3RvIGVuZF9pbzsKLQotCQlwYXJ0ID0gYmlvLT5iaV9iZGV2LT5iZF9wYXJ0OwotCQlpZiAoc2hvdWxkX2ZhaWxfcmVxdWVzdChwYXJ0LCBiaW8tPmJpX3NpemUpIHx8Ci0JCSAgICBzaG91bGRfZmFpbF9yZXF1ZXN0KCZwYXJ0X3RvX2Rpc2socGFydCktPnBhcnQwLAotCQkJCQliaW8tPmJpX3NpemUpKQotCQkJZ290byBlbmRfaW87Ci0KLQkJLyoKLQkJICogSWYgdGhpcyBkZXZpY2UgaGFzIHBhcnRpdGlvbnMsIHJlbWFwIGJsb2NrIG4KLQkJICogb2YgcGFydGl0aW9uIHAgdG8gYmxvY2sgbitzdGFydChwKSBvZiB0aGUgZGlzay4KLQkJICovCi0JCWJsa19wYXJ0aXRpb25fcmVtYXAoYmlvKTsKLQotCQlpZiAoYmlvX2ludGVncml0eV9lbmFibGVkKGJpbykgJiYgYmlvX2ludGVncml0eV9wcmVwKGJpbykpCi0JCQlnb3RvIGVuZF9pbzsKLQotCQlpZiAob2xkX3NlY3RvciAhPSAtMSkKLQkJCXRyYWNlX2Jsb2NrX2Jpb19yZW1hcChxLCBiaW8sIG9sZF9kZXYsIG9sZF9zZWN0b3IpOwotCi0JCW9sZF9zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKLQkJb2xkX2RldiA9IGJpby0+YmlfYmRldi0+YmRfZGV2OwotCi0JCWlmIChiaW9fY2hlY2tfZW9kKGJpbywgbnJfc2VjdG9ycykpCi0JCQlnb3RvIGVuZF9pbzsKLQotCQkvKgotCQkgKiBGaWx0ZXIgZmx1c2ggYmlvJ3MgZWFybHkgc28gdGhhdCBtYWtlX3JlcXVlc3QgYmFzZWQKLQkJICogZHJpdmVycyB3aXRob3V0IGZsdXNoIHN1cHBvcnQgZG9uJ3QgaGF2ZSB0byB3b3JyeQotCQkgKiBhYm91dCB0aGVtLgotCQkgKi8KLQkJaWYgKChiaW8tPmJpX3J3ICYgKFJFUV9GTFVTSCB8IFJFUV9GVUEpKSAmJiAhcS0+Zmx1c2hfZmxhZ3MpIHsKLQkJCWJpby0+YmlfcncgJj0gfihSRVFfRkxVU0ggfCBSRVFfRlVBKTsKLQkJCWlmICghbnJfc2VjdG9ycykgewotCQkJCWVyciA9IDA7Ci0JCQkJZ290byBlbmRfaW87Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKGJpby0+YmlfcncgJiBSRVFfRElTQ0FSRCkgJiYKLQkJICAgICghYmxrX3F1ZXVlX2Rpc2NhcmQocSkgfHwKLQkJICAgICAoKGJpby0+YmlfcncgJiBSRVFfU0VDVVJFKSAmJgotCQkgICAgICAhYmxrX3F1ZXVlX3NlY2Rpc2NhcmQocSkpKSkgewotCQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCQlnb3RvIGVuZF9pbzsKLQkJfQotCi0JCWlmIChibGtfdGhyb3RsX2JpbyhxLCAmYmlvKSkKLQkJCWdvdG8gZW5kX2lvOwotCi0JCS8qCi0JCSAqIElmIGJpbyA9IE5VTEwsIGJpbyBoYXMgYmVlbiB0aHJvdHRsZWQgYW5kIHdpbGwgYmUgc3VibWl0dGVkCi0JCSAqIGxhdGVyLgotCQkgKi8KLQkJaWYgKCFiaW8pCi0JCQlicmVhazsKLQotCQl0cmFjZV9ibG9ja19iaW9fcXVldWUocSwgYmlvKTsKLQotCQlyZXQgPSBxLT5tYWtlX3JlcXVlc3RfZm4ocSwgYmlvKTsKLQl9IHdoaWxlIChyZXQpOwotCi0JcmV0dXJuOwotCi1lbmRfaW86Ci0JYmlvX2VuZGlvKGJpbywgZXJyKTsKLX0KLQotLyoKLSAqIFdlIG9ubHkgd2FudCBvbmUgLT5tYWtlX3JlcXVlc3RfZm4gdG8gYmUgYWN0aXZlIGF0IGEgdGltZSwKLSAqIGVsc2Ugc3RhY2sgdXNhZ2Ugd2l0aCBzdGFja2VkIGRldmljZXMgY291bGQgYmUgYSBwcm9ibGVtLgotICogU28gdXNlIGN1cnJlbnQtPmJpb19saXN0IHRvIGtlZXAgYSBsaXN0IG9mIHJlcXVlc3RzCi0gKiBzdWJtaXRlZCBieSBhIG1ha2VfcmVxdWVzdF9mbiBmdW5jdGlvbi4KLSAqIGN1cnJlbnQtPmJpb19saXN0IGlzIGFsc28gdXNlZCBhcyBhIGZsYWcgdG8gc2F5IGlmCi0gKiBnZW5lcmljX21ha2VfcmVxdWVzdCBpcyBjdXJyZW50bHkgYWN0aXZlIGluIHRoaXMgdGFzayBvciBub3QuCi0gKiBJZiBpdCBpcyBOVUxMLCB0aGVuIG5vIG1ha2VfcmVxdWVzdCBpcyBhY3RpdmUuICBJZiBpdCBpcyBub24tTlVMTCwKLSAqIHRoZW4gYSBtYWtlX3JlcXVlc3QgaXMgYWN0aXZlLCBhbmQgbmV3IHJlcXVlc3RzIHNob3VsZCBiZSBhZGRlZAotICogYXQgdGhlIHRhaWwKKyAqIGJpbyBoYXBwZW5zIHRvIGJlIG1lcmdlZCB3aXRoIHNvbWVvbmUgZWxzZSwgYW5kIG1heSByZXN1Ym1pdCB0aGUgYmlvIHRvCisgKiBhIGxvd2VyIGRldmljZSBieSBjYWxsaW5nIGludG8gZ2VuZXJpY19tYWtlX3JlcXVlc3QgcmVjdXJzaXZlbHksIHdoaWNoCisgKiBtZWFucyB0aGUgYmlvIHNob3VsZCBOT1QgYmUgdG91Y2hlZCBhZnRlciB0aGUgY2FsbCB0byAtPm1ha2VfcmVxdWVzdF9mbi4KICAqLwogdm9pZCBnZW5lcmljX21ha2VfcmVxdWVzdChzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGJpb19saXN0IGJpb19saXN0X29uX3N0YWNrOwogCisJaWYgKCFnZW5lcmljX21ha2VfcmVxdWVzdF9jaGVja3MoYmlvKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXZSBvbmx5IHdhbnQgb25lIC0+bWFrZV9yZXF1ZXN0X2ZuIHRvIGJlIGFjdGl2ZSBhdCBhIHRpbWUsIGVsc2UKKwkgKiBzdGFjayB1c2FnZSB3aXRoIHN0YWNrZWQgZGV2aWNlcyBjb3VsZCBiZSBhIHByb2JsZW0uICBTbyB1c2UKKwkgKiBjdXJyZW50LT5iaW9fbGlzdCB0byBrZWVwIGEgbGlzdCBvZiByZXF1ZXN0cyBzdWJtaXRlZCBieSBhCisJICogbWFrZV9yZXF1ZXN0X2ZuIGZ1bmN0aW9uLiAgY3VycmVudC0+YmlvX2xpc3QgaXMgYWxzbyB1c2VkIGFzIGEKKwkgKiBmbGFnIHRvIHNheSBpZiBnZW5lcmljX21ha2VfcmVxdWVzdCBpcyBjdXJyZW50bHkgYWN0aXZlIGluIHRoaXMKKwkgKiB0YXNrIG9yIG5vdC4gIElmIGl0IGlzIE5VTEwsIHRoZW4gbm8gbWFrZV9yZXF1ZXN0IGlzIGFjdGl2ZS4gIElmCisJICogaXQgaXMgbm9uLU5VTEwsIHRoZW4gYSBtYWtlX3JlcXVlc3QgaXMgYWN0aXZlLCBhbmQgbmV3IHJlcXVlc3RzCisJICogc2hvdWxkIGJlIGFkZGVkIGF0IHRoZSB0YWlsCisJICovCiAJaWYgKGN1cnJlbnQtPmJpb19saXN0KSB7Ci0JCS8qIG1ha2VfcmVxdWVzdCBpcyBhY3RpdmUgKi8KIAkJYmlvX2xpc3RfYWRkKGN1cnJlbnQtPmJpb19saXN0LCBiaW8pOwogCQlyZXR1cm47CiAJfQorCiAJLyogZm9sbG93aW5nIGxvb3AgbWF5IGJlIGEgYml0IG5vbi1vYnZpb3VzLCBhbmQgc28gZGVzZXJ2ZXMgc29tZQogCSAqIGV4cGxhbmF0aW9uLgogCSAqIEJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcCwgYmlvLT5iaV9uZXh0IGlzIE5VTEwgKGFzIGFsbCBjYWxsZXJzCkBAIC0xNTgzLDIyICsxNjMzLDIxIEBACiAJICogV2UgcHJldGVuZCB0aGF0IHdlIGhhdmUganVzdCB0YWtlbiBpdCBvZmYgYSBsb25nZXIgbGlzdCwgc28KIAkgKiB3ZSBhc3NpZ24gYmlvX2xpc3QgdG8gYSBwb2ludGVyIHRvIHRoZSBiaW9fbGlzdF9vbl9zdGFjaywKIAkgKiB0aHVzIGluaXRpYWxpc2luZyB0aGUgYmlvX2xpc3Qgb2YgbmV3IGJpb3MgdG8gYmUKLQkgKiBhZGRlZC4gIF9fZ2VuZXJpY19tYWtlX3JlcXVlc3QgbWF5IGluZGVlZCBhZGQgc29tZSBtb3JlIGJpb3MKKwkgKiBhZGRlZC4gIC0+bWFrZV9yZXF1ZXN0KCkgbWF5IGluZGVlZCBhZGQgc29tZSBtb3JlIGJpb3MKIAkgKiB0aHJvdWdoIGEgcmVjdXJzaXZlIGNhbGwgdG8gZ2VuZXJpY19tYWtlX3JlcXVlc3QuICBJZiBpdAogCSAqIGRpZCwgd2UgZmluZCBhIG5vbi1OVUxMIHZhbHVlIGluIGJpb19saXN0IGFuZCByZS1lbnRlciB0aGUgbG9vcAogCSAqIGZyb20gdGhlIHRvcC4gIEluIHRoaXMgY2FzZSB3ZSByZWFsbHkgZGlkIGp1c3QgdGFrZSB0aGUgYmlvCiAJICogb2YgdGhlIHRvcCBvZiB0aGUgbGlzdCAobm8gcHJldGVuZGluZykgYW5kIHNvIHJlbW92ZSBpdCBmcm9tCi0JICogYmlvX2xpc3QsIGFuZCBjYWxsIGludG8gX19nZW5lcmljX21ha2VfcmVxdWVzdCBhZ2Fpbi4KLQkgKgotCSAqIFRoZSBsb29wIHdhcyBzdHJ1Y3R1cmVkIGxpa2UgdGhpcyB0byBtYWtlIG9ubHkgb25lIGNhbGwgdG8KLQkgKiBfX2dlbmVyaWNfbWFrZV9yZXF1ZXN0ICh3aGljaCBpcyBpbXBvcnRhbnQgYXMgaXQgaXMgbGFyZ2UgYW5kCi0JICogaW5saW5lZCkgYW5kIHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBzaW1wbGUuCisJICogYmlvX2xpc3QsIGFuZCBjYWxsIGludG8gLT5tYWtlX3JlcXVlc3QoKSBhZ2Fpbi4KIAkgKi8KIAlCVUdfT04oYmlvLT5iaV9uZXh0KTsKIAliaW9fbGlzdF9pbml0KCZiaW9fbGlzdF9vbl9zdGFjayk7CiAJY3VycmVudC0+YmlvX2xpc3QgPSAmYmlvX2xpc3Rfb25fc3RhY2s7CiAJZG8gewotCQlfX2dlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoYmlvLT5iaV9iZGV2KTsKKworCQlxLT5tYWtlX3JlcXVlc3RfZm4ocSwgYmlvKTsKKwogCQliaW8gPSBiaW9fbGlzdF9wb3AoY3VycmVudC0+YmlvX2xpc3QpOwogCX0gd2hpbGUgKGJpbyk7CiAJY3VycmVudC0+YmlvX2xpc3QgPSBOVUxMOyAvKiBkZWFjdGl2YXRlICovCkBAIC0xNzI1LDYgKzE3NzQsOCBAQAogCQl3aGVyZSA9IEVMRVZBVE9SX0lOU0VSVF9GTFVTSDsKIAogCWFkZF9hY2N0X3JlcXVlc3QocSwgcnEsIHdoZXJlKTsKKwlpZiAod2hlcmUgPT0gRUxFVkFUT1JfSU5TRVJUX0ZMVVNIKQorCQlfX2Jsa19ydW5fcXVldWUocSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKQEAgLTI2MjgsNiArMjY3OSwyMCBAQAogCiAjZGVmaW5lIFBMVUdfTUFHSUMJMHg5MTgyNzM2NAogCisvKioKKyAqIGJsa19zdGFydF9wbHVnIC0gaW5pdGlhbGl6ZSBibGtfcGx1ZyBhbmQgdHJhY2sgaXQgaW5zaWRlIHRoZSB0YXNrX3N0cnVjdAorICogQHBsdWc6CVRoZSAmc3RydWN0IGJsa19wbHVnIHRoYXQgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVHJhY2tpbmcgYmxrX3BsdWcgaW5zaWRlIHRoZSB0YXNrX3N0cnVjdCB3aWxsIGhlbHAgd2l0aCBhdXRvLWZsdXNoaW5nIHRoZQorICogICBwZW5kaW5nIEkvTyBzaG91bGQgdGhlIHRhc2sgZW5kIHVwIGJsb2NraW5nIGJldHdlZW4gYmxrX3N0YXJ0X3BsdWcoKSBhbmQKKyAqICAgYmxrX2ZpbmlzaF9wbHVnKCkuIFRoaXMgaXMgaW1wb3J0YW50IGZyb20gYSBwZXJmb3JtYW5jZSBwZXJzcGVjdGl2ZSwgYnV0CisgKiAgIGFsc28gZW5zdXJlcyB0aGF0IHdlIGRvbid0IGRlYWRsb2NrLiBGb3IgaW5zdGFuY2UsIGlmIHRoZSB0YXNrIGlzIGJsb2NraW5nCisgKiAgIGZvciBhIG1lbW9yeSBhbGxvY2F0aW9uLCBtZW1vcnkgcmVjbGFpbSBjb3VsZCBlbmQgdXAgd2FudGluZyB0byBmcmVlIGEKKyAqICAgcGFnZSBiZWxvbmdpbmcgdG8gdGhhdCByZXF1ZXN0IHRoYXQgaXMgY3VycmVudGx5IHJlc2lkaW5nIGluIG91ciBwcml2YXRlCisgKiAgIHBsdWcuIEJ5IGZsdXNoaW5nIHRoZSBwZW5kaW5nIEkvTyB3aGVuIHRoZSBwcm9jZXNzIGdvZXMgdG8gc2xlZXAsIHdlIGF2b2lkCisgKiAgIHRoaXMga2luZCBvZiBkZWFkbG9jay4KKyAqLwogdm9pZCBibGtfc3RhcnRfcGx1ZyhzdHJ1Y3QgYmxrX3BsdWcgKnBsdWcpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWZsdXNoLmMgYi9ibG9jay9ibGstZmx1c2guYwppbmRleCA0OTFlYjMwLi43MjBhZDYwIDEwMDY0NAotLS0gYS9ibG9jay9ibGstZmx1c2guYworKysgYi9ibG9jay9ibGstZmx1c2guYwpAQCAtMzIwLDcgKzMyMCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlCVUdfT04oIXJxLT5iaW8gfHwgcnEtPmJpbyAhPSBycS0+YmlvdGFpbCk7CisJQlVHX09OKHJxLT5iaW8gIT0gcnEtPmJpb3RhaWwpOyAvKmFzc3VtZXMgemVybyBvciBzaW5nbGUgYmlvIHJxICovCiAKIAkvKgogCSAqIElmIHRoZXJlJ3MgZGF0YSBidXQgZmx1c2ggaXMgbm90IG5lY2Vzc2FyeSwgdGhlIHJlcXVlc3QgY2FuIGJlCkBAIC0zMzAsNyArMzMwLDYgQEAKIAlpZiAoKHBvbGljeSAmIFJFUV9GU0VRX0RBVEEpICYmCiAJICAgICEocG9saWN5ICYgKFJFUV9GU0VRX1BSRUZMVVNIIHwgUkVRX0ZTRVFfUE9TVEZMVVNIKSkpIHsKIAkJbGlzdF9hZGRfdGFpbCgmcnEtPnF1ZXVlbGlzdCwgJnEtPnF1ZXVlX2hlYWQpOwotCQlibGtfcnVuX3F1ZXVlX2FzeW5jKHEpOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW50ZWdyaXR5LmMgYi9ibG9jay9ibGstaW50ZWdyaXR5LmMKaW5kZXggMTI5YjllMi4uZGEyYTgxOCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWludGVncml0eS5jCisrKyBiL2Jsb2NrL2Jsay1pbnRlZ3JpdHkuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgImJsay5oIgpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXN5c2ZzLmMgYi9ibG9jay9ibGstc3lzZnMuYwppbmRleCA2MGZkYTg4Li5lN2Y5ZjY1IDEwMDY0NAotLS0gYS9ibG9jay9ibGstc3lzZnMuYworKysgYi9ibG9jay9ibGstc3lzZnMuYwpAQCAtNDU3LDExICs0NTcsMTEgQEAKIH0KIAogLyoqCi0gKiBibGtfY2xlYW51cF9xdWV1ZTogLSByZWxlYXNlIGEgJnN0cnVjdCByZXF1ZXN0X3F1ZXVlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZAotICogQGtvYmo6ICAgIHRoZSBrb2JqIGJlbG9uZ2luZyBvZiB0aGUgcmVxdWVzdCBxdWV1ZSB0byBiZSByZWxlYXNlZAorICogYmxrX3JlbGVhc2VfcXVldWU6IC0gcmVsZWFzZSBhICZzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQKKyAqIEBrb2JqOiAgICB0aGUga29iaiBiZWxvbmdpbmcgdG8gdGhlIHJlcXVlc3QgcXVldWUgdG8gYmUgcmVsZWFzZWQKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgICBibGtfY2xlYW51cF9xdWV1ZSBpcyB0aGUgcGFpciB0byBibGtfaW5pdF9xdWV1ZSgpIG9yCisgKiAgICAgYmxrX3JlbGVhc2VfcXVldWUgaXMgdGhlIHBhaXIgdG8gYmxrX2luaXRfcXVldWUoKSBvcgogICogICAgIGJsa19xdWV1ZV9tYWtlX3JlcXVlc3QoKS4gIEl0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIHJlcXVlc3QgcXVldWUgaXMKICAqICAgICBiZWluZyByZWxlYXNlZDsgdHlwaWNhbGx5IHdoZW4gYSBibG9jayBkZXZpY2UgaXMgYmVpbmcgZGUtcmVnaXN0ZXJlZC4KICAqICAgICBDdXJyZW50bHksIGl0cyBwcmltYXJ5IHRhc2sgaXQgdG8gZnJlZSBhbGwgdGhlICZzdHJ1Y3QgcmVxdWVzdApAQCAtNDkwLDYgKzQ5MCw3IEBACiAJaWYgKHEtPnF1ZXVlX3RhZ3MpCiAJCV9fYmxrX3F1ZXVlX2ZyZWVfdGFncyhxKTsKIAorCWJsa190aHJvdGxfcmVsZWFzZShxKTsKIAlibGtfdHJhY2Vfc2h1dGRvd24ocSk7CiAKIAliZGlfZGVzdHJveSgmcS0+YmFja2luZ19kZXZfaW5mbyk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstdGFnLmMgYi9ibG9jay9ibGstdGFnLmMKaW5kZXggZWNlNjVmYy4uZTc0ZDZkMSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXRhZy5jCisrKyBiL2Jsb2NrL2Jsay10YWcuYwpAQCAtMjg2LDEyICsyODYsMTQgQEAKIAogCUJVR19PTih0YWcgPT0gLTEpOwogCi0JaWYgKHVubGlrZWx5KHRhZyA+PSBicXQtPnJlYWxfbWF4X2RlcHRoKSkKKwlpZiAodW5saWtlbHkodGFnID49IGJxdC0+bWF4X2RlcHRoKSkgewogCQkvKgogCQkgKiBUaGlzIGNhbiBoYXBwZW4gYWZ0ZXIgdGFnIGRlcHRoIGhhcyBiZWVuIHJlZHVjZWQuCi0JCSAqIEZJWE1FOiBob3cgYWJvdXQgYSB3YXJuaW5nIG9yIGluZm8gbWVzc2FnZSBoZXJlPworCQkgKiBCdXQgdGFnIHNob3VsZG4ndCBiZSBsYXJnZXIgdGhhbiByZWFsX21heF9kZXB0aC4KIAkJICovCisJCVdBUk5fT04odGFnID49IGJxdC0+cmVhbF9tYXhfZGVwdGgpOwogCQlyZXR1cm47CisJfQogCiAJbGlzdF9kZWxfaW5pdCgmcnEtPnF1ZXVlbGlzdCk7CiAJcnEtPmNtZF9mbGFncyAmPSB+UkVRX1FVRVVFRDsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay10aHJvdHRsZS5jIGIvYmxvY2svYmxrLXRocm90dGxlLmMKaW5kZXggYTE5ZjU4Yy4uNDU1MzI0NSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXRocm90dGxlLmMKKysrIGIvYmxvY2svYmxrLXRocm90dGxlLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KICNpbmNsdWRlICJibGstY2dyb3VwLmgiCisjaW5jbHVkZSAiYmxrLmgiCiAKIC8qIE1heCBkaXNwYXRjaCBmcm9tIGEgZ3JvdXAgaW4gMSByb3VuZCAqLwogc3RhdGljIGludCB0aHJvdGxfZ3JwX3F1YW50dW0gPSA4OwpAQCAtMzAyLDE2ICszMDMsMTYgQEAKIAlyZXR1cm4gdGc7CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgd2l0aCBxdWV1ZSBsb2NrIHVubG9ja2VkIGluIGNhc2Ugb2YgZXJyb3IsIGxpa2UKLSAqIHJlcXVlc3QgcXVldWUgaXMgbm8gbW9yZQotICovCiBzdGF0aWMgc3RydWN0IHRocm90bF9ncnAgKiB0aHJvdGxfZ2V0X3RnKHN0cnVjdCB0aHJvdGxfZGF0YSAqdGQpCiB7CiAJc3RydWN0IHRocm90bF9ncnAgKnRnID0gTlVMTCwgKl9fdGcgPSBOVUxMOwogCXN0cnVjdCBibGtpb19jZ3JvdXAgKmJsa2NnOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gdGQtPnF1ZXVlOwogCisJLyogbm8gdGhyb3R0bGluZyBmb3IgZGVhZCBxdWV1ZSAqLworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChRVUVVRV9GTEFHX0RFQUQsICZxLT5xdWV1ZV9mbGFncykpKQorCQlyZXR1cm4gTlVMTDsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAlibGtjZyA9IHRhc2tfYmxraW9fY2dyb3VwKGN1cnJlbnQpOwogCXRnID0gdGhyb3RsX2ZpbmRfdGcodGQsIGJsa2NnKTsKQEAgLTMyMywzMiArMzI0LDIyIEBACiAJLyoKIAkgKiBOZWVkIHRvIGFsbG9jYXRlIGEgZ3JvdXAuIEFsbG9jYXRpb24gb2YgZ3JvdXAgYWxzbyBuZWVkcyBhbGxvY2F0aW9uCiAJICogb2YgcGVyIGNwdSBzdGF0cyB3aGljaCBpbi10dXJuIHRha2VzIGEgbXV0ZXgoKSBhbmQgY2FuIGJsb2NrLiBIZW5jZQotCSAqIHdlIG5lZWQgdG8gZHJvcCByY3UgbG9jayBhbmQgcXVldWVfbG9jayBiZWZvcmUgd2UgY2FsbCBhbGxvYwotCSAqCi0JICogVGFrZSB0aGUgcmVxdWVzdCBxdWV1ZSByZWZlcmVuY2UgdG8gbWFrZSBzdXJlIHF1ZXVlIGRvZXMgbm90Ci0JICogZ28gYXdheSBvbmNlIHdlIHJldHVybiBmcm9tIGFsbG9jYXRpb24uCisJICogd2UgbmVlZCB0byBkcm9wIHJjdSBsb2NrIGFuZCBxdWV1ZV9sb2NrIGJlZm9yZSB3ZSBjYWxsIGFsbG9jLgogCSAqLwotCWJsa19nZXRfcXVldWUocSk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCiAJdGcgPSB0aHJvdGxfYWxsb2NfdGcodGQpOwotCS8qCi0JICogV2UgbWlnaHQgaGF2ZSBzbGVwdCBpbiBncm91cCBhbGxvY2F0aW9uLiBNYWtlIHN1cmUgcXVldWUgaXMgbm90Ci0JICogZGVhZAotCSAqLwotCWlmICh1bmxpa2VseSh0ZXN0X2JpdChRVUVVRV9GTEFHX0RFQUQsICZxLT5xdWV1ZV9mbGFncykpKSB7Ci0JCWJsa19wdXRfcXVldWUocSk7Ci0JCWlmICh0ZykKLQkJCWtmcmVlKHRnKTsKLQotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQl9Ci0JYmxrX3B1dF9xdWV1ZShxKTsKIAogCS8qIEdyb3VwIGFsbG9jYXRlZCBhbmQgcXVldWUgaXMgc3RpbGwgYWxpdmUuIHRha2UgdGhlIGxvY2sgKi8KIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCisJLyogTWFrZSBzdXJlIEBxIGlzIHN0aWxsIGFsaXZlICovCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KFFVRVVFX0ZMQUdfREVBRCwgJnEtPnF1ZXVlX2ZsYWdzKSkpIHsKKwkJa2ZyZWUodGcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIG5ldyBncm91cC4gQWZ0ZXIgc2xlZXBpbmcsIHJlYWQgdGhlIGJsa2NnIGFnYWluLgogCSAqLwpAQCAtMTAxNCwxMSArMTAwNSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB0aHJvdGxfdGRfZnJlZShzdHJ1Y3QgdGhyb3RsX2RhdGEgKnRkKQotewotCWtmcmVlKHRkKTsKLX0KLQogLyoKICAqIEJsayBjZ3JvdXAgY29udHJvbGxlciBub3RpZmljYXRpb24gc2F5aW5nIHRoYXQgYmxraW9fZ3JvdXAgb2JqZWN0IGlzIGJlaW5nCiAgKiBkZWxpbmtlZCBhcyBhc3NvY2lhdGVkIGNncm91cCBvYmplY3QgaXMgZ29pbmcgYXdheS4gVGhhdCBhbHNvIG1lYW5zIHRoYXQKQEAgLTExMjMsMTcgKzExMDksMTcgQEAKIAkucGxpZCA9IEJMS0lPX1BPTElDWV9USFJPVEwsCiB9OwogCi1pbnQgYmxrX3Rocm90bF9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKipiaW9wKQorYm9vbCBibGtfdGhyb3RsX2JpbyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCB0aHJvdGxfZGF0YSAqdGQgPSBxLT50ZDsKIAlzdHJ1Y3QgdGhyb3RsX2dycCAqdGc7Ci0Jc3RydWN0IGJpbyAqYmlvID0gKmJpb3A7CiAJYm9vbCBydyA9IGJpb19kYXRhX2RpcihiaW8pLCB1cGRhdGVfZGlzcHRpbWUgPSB0cnVlOwogCXN0cnVjdCBibGtpb19jZ3JvdXAgKmJsa2NnOworCWJvb2wgdGhyb3R0bGVkID0gZmFsc2U7CiAKIAlpZiAoYmlvLT5iaV9ydyAmIFJFUV9USFJPVFRMRUQpIHsKIAkJYmlvLT5iaV9ydyAmPSB+UkVRX1RIUk9UVExFRDsKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qCkBAIC0xMTUyLDcgKzExMzgsNyBAQAogCQkJYmxraW9jZ191cGRhdGVfZGlzcGF0Y2hfc3RhdHMoJnRnLT5ibGtnLCBiaW8tPmJpX3NpemUsCiAJCQkJCXJ3LCByd19pc19zeW5jKGJpby0+YmlfcncpKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJcmV0dXJuIDA7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTExNjEsMTggKzExNDcsMTAgQEAKIAkgKiBFaXRoZXIgZ3JvdXAgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCB5ZXQgb3IgaXQgaXMgbm90IGFuIHVubGltaXRlZAogCSAqIElPIGdyb3VwCiAJICovCi0KIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCXRnID0gdGhyb3RsX2dldF90Zyh0ZCk7Ci0KLQlpZiAoSVNfRVJSKHRnKSkgewotCQlpZiAoUFRSX0VSUih0ZykJPT0gLUVOT0RFVikgewotCQkJLyoKLQkJCSAqIFF1ZXVlIGlzIGdvbmUuIE5vIHF1ZXVlIGxvY2sgaGVsZCBoZXJlLgotCQkJICovCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KKwlpZiAodW5saWtlbHkoIXRnKSkKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJaWYgKHRnLT5ucl9xdWV1ZWRbcnddKSB7CiAJCS8qCkBAIC0xMjAwLDcgKzExNzgsNyBAQAogCQkgKiBTbyBrZWVwIG9uIHRyaW1taW5nIHNsaWNlIGV2ZW4gaWYgYmlvIGlzIG5vdCBxdWV1ZWQuCiAJCSAqLwogCQl0aHJvdGxfdHJpbV9zbGljZSh0ZCwgdGcsIHJ3KTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKIHF1ZXVlX2JpbzoKQEAgLTEyMTIsMTYgKzExOTAsNTIgQEAKIAkJCXRnLT5ucl9xdWV1ZWRbUkVBRF0sIHRnLT5ucl9xdWV1ZWRbV1JJVEVdKTsKIAogCXRocm90bF9hZGRfYmlvX3RnKHEtPnRkLCB0ZywgYmlvKTsKLQkqYmlvcCA9IE5VTEw7CisJdGhyb3R0bGVkID0gdHJ1ZTsKIAogCWlmICh1cGRhdGVfZGlzcHRpbWUpIHsKIAkJdGdfdXBkYXRlX2Rpc3B0aW1lKHRkLCB0Zyk7CiAJCXRocm90bF9zY2hlZHVsZV9uZXh0X2Rpc3BhdGNoKHRkKTsKIAl9CiAKLW91dDoKK291dF91bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCXJldHVybiAwOworb3V0OgorCXJldHVybiB0aHJvdHRsZWQ7Cit9CisKKy8qKgorICogYmxrX3Rocm90bF9kcmFpbiAtIGRyYWluIHRocm90dGxlZCBiaW9zCisgKiBAcTogcmVxdWVzdF9xdWV1ZSB0byBkcmFpbiB0aHJvdHRsZWQgYmlvcyBmb3IKKyAqCisgKiBEaXNwYXRjaCBhbGwgY3VycmVudGx5IHRocm90dGxlZCBiaW9zIG9uIEBxIHRocm91Z2ggLT5tYWtlX3JlcXVlc3RfZm4oKS4KKyAqLwordm9pZCBibGtfdGhyb3RsX2RyYWluKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQorCV9fcmVsZWFzZXMocS0+cXVldWVfbG9jaykgX19hY3F1aXJlcyhxLT5xdWV1ZV9sb2NrKQoreworCXN0cnVjdCB0aHJvdGxfZGF0YSAqdGQgPSBxLT50ZDsKKwlzdHJ1Y3QgdGhyb3RsX3JiX3Jvb3QgKnN0ID0gJnRkLT50Z19zZXJ2aWNlX3RyZWU7CisJc3RydWN0IHRocm90bF9ncnAgKnRnOworCXN0cnVjdCBiaW9fbGlzdCBibDsKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwlXQVJOX09OX09OQ0UoIXF1ZXVlX2lzX2xvY2tlZChxKSk7CisKKwliaW9fbGlzdF9pbml0KCZibCk7CisKKwl3aGlsZSAoKHRnID0gdGhyb3RsX3JiX2ZpcnN0KHN0KSkpIHsKKwkJdGhyb3RsX2RlcXVldWVfdGcodGQsIHRnKTsKKworCQl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BlZWsoJnRnLT5iaW9fbGlzdHNbUkVBRF0pKSkKKwkJCXRnX2Rpc3BhdGNoX29uZV9iaW8odGQsIHRnLCBiaW9fZGF0YV9kaXIoYmlvKSwgJmJsKTsKKwkJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wZWVrKCZ0Zy0+YmlvX2xpc3RzW1dSSVRFXSkpKQorCQkJdGdfZGlzcGF0Y2hfb25lX2Jpbyh0ZCwgdGcsIGJpb19kYXRhX2RpcihiaW8pLCAmYmwpOworCX0KKwlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CisKKwl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmwpKSkKKwkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKKworCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiB9CiAKIGludCBibGtfdGhyb3RsX2luaXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCkBAIC0xMjk2LDcgKzEzMTAsMTEgQEAKIAkgKiBpdC4KIAkgKi8KIAl0aHJvdGxfc2h1dGRvd25fd3EocSk7Ci0JdGhyb3RsX3RkX2ZyZWUodGQpOworfQorCit2b2lkIGJsa190aHJvdGxfcmVsZWFzZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlrZnJlZShxLT50ZCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHRocm90bF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9ibG9jay9ibGsuaCBiL2Jsb2NrL2Jsay5oCmluZGV4IDIwYjkwMGEuLjNmNjU1MWIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay5oCisrKyBiL2Jsb2NrL2Jsay5oCkBAIC0xNSw2ICsxNSw3IEBACiAJCQlzdHJ1Y3QgYmlvICpiaW8pOwogaW50IGJsa19ycV9hcHBlbmRfYmlvKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCSAgICAgIHN0cnVjdCBiaW8gKmJpbyk7Cit2b2lkIGJsa19kcmFpbl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgYm9vbCBkcmFpbl9hbGwpOwogdm9pZCBibGtfZGVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSk7CiB2b2lkIF9fYmxrX3F1ZXVlX2ZyZWVfdGFncyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiBib29sIF9fYmxrX2VuZF9iaWRpX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsCkBAIC0xODgsNCArMTg5LDIxIEBACiAJICAgICAgICAocnEtPmNtZF9mbGFncyAmIFJFUV9ESVNDQVJEKSk7CiB9CiAKLSNlbmRpZgorI2lmZGVmIENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcKK2V4dGVybiBib29sIGJsa190aHJvdGxfYmlvKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOworZXh0ZXJuIHZvaWQgYmxrX3Rocm90bF9kcmFpbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CitleHRlcm4gaW50IGJsa190aHJvdGxfaW5pdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CitleHRlcm4gdm9pZCBibGtfdGhyb3RsX2V4aXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworZXh0ZXJuIHZvaWQgYmxrX3Rocm90bF9yZWxlYXNlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKKyNlbHNlIC8qIENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBibGtfdGhyb3RsX2JpbyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQoreworCXJldHVybiBmYWxzZTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBibGtfdGhyb3RsX2RyYWluKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSB7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGJsa190aHJvdGxfaW5pdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIGJsa190aHJvdGxfZXhpdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYmxrX3Rocm90bF9yZWxlYXNlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9USFJPVFRMSU5HICovCisKKyNlbmRpZiAvKiBCTEtfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYmxvY2svYnNnLWxpYi5jIGIvYmxvY2svYnNnLWxpYi5jCmluZGV4IDY2OTBlNmUuLjdhZDQ5YzggMTAwNjQ0Ci0tLSBhL2Jsb2NrL2JzZy1saWIuYworKysgYi9ibG9jay9ic2ctbGliLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvYnNnLWxpYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYmxvY2svZWxldmF0b3IuYyBiL2Jsb2NrL2VsZXZhdG9yLmMKaW5kZXggYTNiNjRiYy4uNjYzNDNkNiAxMDA2NDQKLS0tIGEvYmxvY2svZWxldmF0b3IuYworKysgYi9ibG9jay9lbGV2YXRvci5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrdHJhY2VfYXBpLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KQEAgLTE4Miw3ICsxODEsNyBAQAogCWVxLT5lbGV2YXRvcl9kYXRhID0gZGF0YTsKIH0KIAotc3RhdGljIGNoYXIgY2hvc2VuX2VsZXZhdG9yWzE2XTsKK3N0YXRpYyBjaGFyIGNob3Nlbl9lbGV2YXRvcltFTFZfTkFNRV9NQVhdOwogCiBzdGF0aWMgaW50IF9faW5pdCBlbGV2YXRvcl9zZXR1cChjaGFyICpzdHIpCiB7CkBAIC02MDYsNDMgKzYwNSwzNSBAQAogdm9pZCBlbHZfZHJhaW5fZWxldmF0b3Ioc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RhdGljIGludCBwcmludGVkOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZChxLT5xdWV1ZV9sb2NrKTsKKwogCXdoaWxlIChxLT5lbGV2YXRvci0+b3BzLT5lbGV2YXRvcl9kaXNwYXRjaF9mbihxLCAxKSkKIAkJOwotCWlmIChxLT5ucl9zb3J0ZWQgPT0gMCkKLQkJcmV0dXJuOwotCWlmIChwcmludGVkKysgPCAxMCkgeworCWlmIChxLT5ucl9zb3J0ZWQgJiYgcHJpbnRlZCsrIDwgMTApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZm9yY2VkIGRpc3BhdGNoaW5nIGlzIGJyb2tlbiAiCiAJCSAgICAgICAiKG5yX3NvcnRlZD0ldSksIHBsZWFzZSByZXBvcnQgdGhpc1xuIiwKIAkJICAgICAgIHEtPmVsZXZhdG9yLT5lbGV2YXRvcl90eXBlLT5lbGV2YXRvcl9uYW1lLCBxLT5ucl9zb3J0ZWQpOwogCX0KIH0KIAotLyoKLSAqIENhbGwgd2l0aCBxdWV1ZSBsb2NrIGhlbGQsIGludGVycnVwdHMgZGlzYWJsZWQKLSAqLwogdm9pZCBlbHZfcXVpZXNjZV9zdGFydChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlpZiAoIXEtPmVsZXZhdG9yKQogCQlyZXR1cm47CiAKKwlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCXF1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfRUxWU1dJVENILCBxKTsKKwlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKLQkvKgotCSAqIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFueSByZXF1ZXN0cyBpbiBmbGlnaHQKLQkgKi8KLQllbHZfZHJhaW5fZWxldmF0b3IocSk7Ci0Jd2hpbGUgKHEtPnJxLmVsdnByaXYpIHsKLQkJX19ibGtfcnVuX3F1ZXVlKHEpOwotCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JCW1zbGVlcCgxMCk7Ci0JCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JCWVsdl9kcmFpbl9lbGV2YXRvcihxKTsKLQl9CisJYmxrX2RyYWluX3F1ZXVlKHEsIGZhbHNlKTsKIH0KIAogdm9pZCBlbHZfcXVpZXNjZV9lbmQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CisJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAlxdWV1ZV9mbGFnX2NsZWFyKFFVRVVFX0ZMQUdfRUxWU1dJVENILCBxKTsKKwlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiB9CiAKIHZvaWQgX19lbHZfYWRkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHdoZXJlKQpAQCAtOTcyLDcgKzk2Myw2IEBACiAJLyoKIAkgKiBUdXJuIG9uIEJZUEFTUyBhbmQgZHJhaW4gYWxsIHJlcXVlc3RzIHcvIGVsZXZhdG9yIHByaXZhdGUgZGF0YQogCSAqLwotCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJZWx2X3F1aWVzY2Vfc3RhcnQocSk7CiAKIAkvKgpAQCAtOTgzLDggKzk3Myw4IEBACiAJLyoKIAkgKiBhdHRhY2ggYW5kIHN0YXJ0IG5ldyBlbGV2YXRvcgogCSAqLworCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJZWxldmF0b3JfYXR0YWNoKHEsIGUsIGRhdGEpOwotCiAJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCiAJaWYgKG9sZF9lbGV2YXRvci0+cmVnaXN0ZXJlZCkgewpAQCAtOTk5LDkgKzk4OSw3IEBACiAJICogZmluYWxseSBleGl0IG9sZCBlbGV2YXRvciBhbmQgdHVybiBvZmYgQllQQVNTLgogCSAqLwogCWVsZXZhdG9yX2V4aXQob2xkX2VsZXZhdG9yKTsKLQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCWVsdl9xdWllc2NlX2VuZChxKTsKLQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKIAlibGtfYWRkX3RyYWNlX21zZyhxLCAiZWx2IHN3aXRjaDogJXMiLCBlLT5lbGV2YXRvcl90eXBlLT5lbGV2YXRvcl9uYW1lKTsKIApAQCAtMTAxNSwxMCArMTAwMyw3IEBACiAJZWxldmF0b3JfZXhpdChlKTsKIAlxLT5lbGV2YXRvciA9IG9sZF9lbGV2YXRvcjsKIAllbHZfcmVnaXN0ZXJfcXVldWUocSk7Ci0KLQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCXF1ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19FTFZTV0lUQ0gsIHEpOwotCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKwllbHZfcXVpZXNjZV9lbmQocSk7CiAKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggZTJmNjc5MC4uOTI1MzgzOSAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAogI2luY2x1ZGUgImJsay5oIgogCkBAIC01MzYsNyArNTM3LDcgQEAKIAlkaXNrLT5zbGF2ZV9kaXIgPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJzbGF2ZXMiLCAmZGRldi0+a29iaik7CiAKIAkvKiBObyBtaW5vcnMgdG8gdXNlIGZvciBwYXJ0aXRpb25zICovCi0JaWYgKCFkaXNrX3BhcnRpdGlvbmFibGUoZGlzaykpCisJaWYgKCFkaXNrX3BhcnRfc2Nhbl9lbmFibGVkKGRpc2spKQogCQlnb3RvIGV4aXQ7CiAKIAkvKiBObyBzdWNoIGRldmljZSAoZS5nLiwgbWVkaWEgd2VyZSBqdXN0IHJlbW92ZWQpICovCkBAIC02MTEsNiArNjEyLDEyIEBACiAJcmVnaXN0ZXJfZGlzayhkaXNrKTsKIAlibGtfcmVnaXN0ZXJfcXVldWUoZGlzayk7CiAKKwkvKgorCSAqIFRha2UgYW4gZXh0cmEgcmVmIG9uIHF1ZXVlIHdoaWNoIHdpbGwgYmUgcHV0IG9uIGRpc2tfcmVsZWFzZSgpCisJICogc28gdGhhdCBpdCBzdGlja3MgYXJvdW5kIGFzIGxvbmcgYXMgQGRpc2sgaXMgdGhlcmUuCisJICovCisJV0FSTl9PTl9PTkNFKGJsa19nZXRfcXVldWUoZGlzay0+cXVldWUpKTsKKwogCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkaXNrX3RvX2RldihkaXNrKS0+a29iaiwgJmJkaS0+ZGV2LT5rb2JqLAogCQkJCSAgICJiZGkiKTsKIAlXQVJOX09OKHJldHZhbCk7CkBAIC04NDEsNyArODQ4LDcgQEAKIAljaGFyIGJ1ZltCREVWTkFNRV9TSVpFXTsKIAogCS8qIERvbid0IHNob3cgbm9uLXBhcnRpdGlvbmFibGUgcmVtb3ZlYWJsZSBkZXZpY2VzIG9yIGVtcHR5IGRldmljZXMgKi8KLQlpZiAoIWdldF9jYXBhY2l0eShzZ3ApIHx8ICghZGlza19wYXJ0aXRpb25hYmxlKHNncCkgJiYKKwlpZiAoIWdldF9jYXBhY2l0eShzZ3ApIHx8ICghZGlza19tYXhfcGFydHMoc2dwKSAmJgogCQkJCSAgIChzZ3AtPmZsYWdzICYgR0VOSERfRkxfUkVNT1ZBQkxFKSkpCiAJCXJldHVybiAwOwogCWlmIChzZ3AtPmZsYWdzICYgR0VOSERfRkxfU1VQUFJFU1NfUEFSVElUSU9OX0lORk8pCkBAIC05MDksNiArOTE2LDc0IEBACiAKIHN1YnN5c19pbml0Y2FsbChnZW5oZF9kZXZpY2VfaW5pdCk7CiAKK3N0YXRpYyBzc2l6ZV90IGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOworCXNzaXplX3QgcmV0ID0gMDsKKworCWlmIChkaXNrLT5hbGlhcykKKwkJcmV0ID0gc25wcmludGYoYnVmLCBBTElBU19MRU4sICIlc1xuIiwgZGlzay0+YWxpYXMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFsaWFzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CisJY2hhciAqYWxpYXM7CisJY2hhciAqZW52cFtdID0geyBOVUxMLCBOVUxMIH07CisJdW5zaWduZWQgY2hhciBjOworCWludCBpOworCXNzaXplX3QgcmV0ID0gY291bnQ7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3VudCA+PSBBTElBU19MRU4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGlhczogYWxpYXMgaXMgdG9vIGxvbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWYWxpZGF0aW9uIGNoZWNrICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJYyA9IGJ1ZltpXTsKKwkJaWYgKGkgPT0gY291bnQgLSAxICYmIGMgPT0gJ1xuJykKKwkJCWJyZWFrOworCQlpZiAoIWlzYWxudW0oYykgJiYgYyAhPSAnXycgJiYgYyAhPSAnLScpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWxpYXM6IGludmFsaWQgYWxpYXNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoZGlzay0+YWxpYXMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWxpYXM6ICVzIGlzIGFscmVhZHkgYXNzaWduZWQgKCVzKVxuIiwKKwkJICAgICAgIGRpc2stPmRpc2tfbmFtZSwgZGlzay0+YWxpYXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhbGlhcyA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMiLCBidWYpOworCWlmICghYWxpYXMpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGFsaWFzW2NvdW50IC0gMV0gPT0gJ1xuJykKKwkJYWxpYXNbY291bnQgLSAxXSA9ICdcMCc7CisKKwllbnZwWzBdID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJBTElBUz0lcyIsIGFsaWFzKTsKKwlpZiAoIWVudnBbMF0pIHsKKwkJa2ZyZWUoYWxpYXMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkaXNrLT5hbGlhcyA9IGFsaWFzOworCXByaW50ayhLRVJOX0lORk8gImFsaWFzOiBhc3NpZ25lZCAlcyB0byAlc1xuIiwgYWxpYXMsIGRpc2stPmRpc2tfbmFtZSk7CisKKwlrb2JqZWN0X3VldmVudF9lbnYoJmRldi0+a29iaiwgS09CSl9BREQsIGVudnApOworCisJa2ZyZWUoZW52cFswXSk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHNzaXplX3QgZGlza19yYW5nZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtOTY4LDYgKzEwNDMsNyBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBxdWV1ZV9kaXNjYXJkX2FsaWdubWVudChkaXNrLT5xdWV1ZSkpOwogfQogCitzdGF0aWMgREVWSUNFX0FUVFIoYWxpYXMsIFNfSVJVR098U19JV1VTUiwgYWxpYXNfc2hvdywgYWxpYXNfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHJhbmdlLCBTX0lSVUdPLCBkaXNrX3JhbmdlX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGV4dF9yYW5nZSwgU19JUlVHTywgZGlza19leHRfcmFuZ2Vfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIocmVtb3ZhYmxlLCBTX0lSVUdPLCBkaXNrX3JlbW92YWJsZV9zaG93LCBOVUxMKTsKQEAgLTk5MCw2ICsxMDY2LDcgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGlza19hdHRyc1tdID0geworCSZkZXZfYXR0cl9hbGlhcy5hdHRyLAogCSZkZXZfYXR0cl9yYW5nZS5hdHRyLAogCSZkZXZfYXR0cl9leHRfcmFuZ2UuYXR0ciwKIAkmZGV2X2F0dHJfcmVtb3ZhYmxlLmF0dHIsCkBAIC0xMDk1LDYgKzExNzIsOCBAQAogCWRpc2tfcmVwbGFjZV9wYXJ0X3RibChkaXNrLCBOVUxMKTsKIAlmcmVlX3BhcnRfc3RhdHMoJmRpc2stPnBhcnQwKTsKIAlmcmVlX3BhcnRfaW5mbygmZGlzay0+cGFydDApOworCWlmIChkaXNrLT5xdWV1ZSkKKwkJYmxrX3B1dF9xdWV1ZShkaXNrLT5xdWV1ZSk7CiAJa2ZyZWUoZGlzayk7CiB9CiBzdHJ1Y3QgY2xhc3MgYmxvY2tfY2xhc3MgPSB7CmRpZmYgLS1naXQgYS9ibG9jay9pb2N0bC5jIGIvYmxvY2svaW9jdGwuYwppbmRleCAxMTI0Y2QyLi5jYTkzOWZjIDEwMDY0NAotLS0gYS9ibG9jay9pb2N0bC5jCisrKyBiL2Jsb2NrL2lvY3RsLmMKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KQEAgLTEwMSw3ICsxMDIsNyBAQAogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKIAlpbnQgcmVzOwogCi0JaWYgKCFkaXNrX3BhcnRpdGlvbmFibGUoZGlzaykgfHwgYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKKwlpZiAoIWRpc2tfcGFydF9zY2FuX2VuYWJsZWQoZGlzaykgfHwgYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVBQ0NFUzsKZGlmZiAtLWdpdCBhL2Jsb2NrL3Njc2lfaW9jdGwuYyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwppbmRleCA0ZjQyMzBiLi5mYmRmMGQ4IDEwMDY0NAotLS0gYS9ibG9jay9zY3NpX2lvY3RsLmMKKysrIGIvYmxvY2svc2NzaV9pb2N0bC5jCkBAIC01NjUsNyArNTY1LDcgQEAKIHsKIAlpbnQgZXJyOwogCi0JaWYgKCFxIHx8IGJsa19nZXRfcXVldWUocSkpCisJaWYgKCFxKQogCQlyZXR1cm4gLUVOWElPOwogCiAJc3dpdGNoIChjbWQpIHsKQEAgLTY4Niw3ICs2ODYsNiBAQAogCQkJZXJyID0gLUVOT1RUWTsKIAl9CiAKLQlibGtfcHV0X3F1ZXVlKHEpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfY21kX2lvY3RsKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9LY29uZmlnIGIvY3J5cHRvL0tjb25maWcKaW5kZXggYWUyN2I3NTMuLjUyN2E4NTcgMTAwNjQ0Ci0tLSBhL2NyeXB0by9LY29uZmlnCisrKyBiL2NyeXB0by9LY29uZmlnCkBAIC0xMDAsNiArMTAwLDE0IEBACiAJc2VsZWN0IENSWVBUT19CTEtDSVBIRVIyCiAJc2VsZWN0IENSWVBUT19QQ09NUDIKIAorY29uZmlnIENSWVBUT19VU0VSCisJdHJpc3RhdGUgIlVzZXJzcGFjZSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSBjb25maWd1cmF0aW9uIgorCWRlcGVuZHMgb24gTkVUCisJc2VsZWN0IENSWVBUT19NQU5BR0VSCisJaGVscAorCSAgVXNlcmFwYWNlIGNvbmZpZ3VyYXRpb24gZm9yIGNyeXB0b2dyYXBoaWMgaW5zdGFudGlhdGlvbnMgc3VjaCBhcworCSAgY2JjKGFlcykuCisKIGNvbmZpZyBDUllQVE9fTUFOQUdFUl9ESVNBQkxFX1RFU1RTCiAJYm9vbCAiRGlzYWJsZSBydW4tdGltZSBzZWxmIHRlc3RzIgogCWRlZmF1bHQgeQpAQCAtNDA3LDYgKzQxNSwxNiBAQAogCWhlbHAKIAkgIFNIQS0xIHNlY3VyZSBoYXNoIHN0YW5kYXJkIChGSVBTIDE4MC0xL0RGSVBTIDE4MC0yKS4KIAorY29uZmlnIENSWVBUT19TSEExX1NTU0UzCisJdHJpc3RhdGUgIlNIQTEgZGlnZXN0IGFsZ29yaXRobSAoU1NTRTMvQVZYKSIKKwlkZXBlbmRzIG9uIFg4NiAmJiA2NEJJVAorCXNlbGVjdCBDUllQVE9fU0hBMQorCXNlbGVjdCBDUllQVE9fSEFTSAorCWhlbHAKKwkgIFNIQS0xIHNlY3VyZSBoYXNoIHN0YW5kYXJkIChGSVBTIDE4MC0xL0RGSVBTIDE4MC0yKSBpbXBsZW1lbnRlZAorCSAgdXNpbmcgU3VwcGxlbWVudGFsIFNTRTMgKFNTU0UzKSBpbnN0cnVjdGlvbnMgb3IgQWR2YW5jZWQgVmVjdG9yCisJICBFeHRlbnNpb25zIChBVlgpLCB3aGVuIGF2YWlsYWJsZS4KKwogY29uZmlnIENSWVBUT19TSEEyNTYKIAl0cmlzdGF0ZSAiU0hBMjI0IGFuZCBTSEEyNTYgZGlnZXN0IGFsZ29yaXRobSIKIAlzZWxlY3QgQ1JZUFRPX0hBU0gKQEAgLTU5MCw2ICs2MDgsNyBAQAogY29uZmlnIENSWVBUT19CTE9XRklTSAogCXRyaXN0YXRlICJCbG93ZmlzaCBjaXBoZXIgYWxnb3JpdGhtIgogCXNlbGVjdCBDUllQVE9fQUxHQVBJCisJc2VsZWN0IENSWVBUT19CTE9XRklTSF9DT01NT04KIAloZWxwCiAJICBCbG93ZmlzaCBjaXBoZXIgYWxnb3JpdGhtLCBieSBCcnVjZSBTY2huZWllci4KIApAQCAtNjAwLDYgKzYxOSwzMCBAQAogCSAgU2VlIGFsc286CiAJICA8aHR0cDovL3d3dy5zY2huZWllci5jb20vYmxvd2Zpc2guaHRtbD4KIAorY29uZmlnIENSWVBUT19CTE9XRklTSF9DT01NT04KKwl0cmlzdGF0ZQorCWhlbHAKKwkgIENvbW1vbiBwYXJ0cyBvZiB0aGUgQmxvd2Zpc2ggY2lwaGVyIGFsZ29yaXRobSBzaGFyZWQgYnkgdGhlCisJICBnZW5lcmljIGMgYW5kIHRoZSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb25zLgorCisJICBTZWUgYWxzbzoKKwkgIDxodHRwOi8vd3d3LnNjaG5laWVyLmNvbS9ibG93ZmlzaC5odG1sPgorCitjb25maWcgQ1JZUFRPX0JMT1dGSVNIX1g4Nl82NAorCXRyaXN0YXRlICJCbG93ZmlzaCBjaXBoZXIgYWxnb3JpdGhtICh4ODZfNjQpIgorCWRlcGVuZHMgb24gKFg4NiB8fCBVTUxfWDg2KSAmJiA2NEJJVAorCXNlbGVjdCBDUllQVE9fQUxHQVBJCisJc2VsZWN0IENSWVBUT19CTE9XRklTSF9DT01NT04KKwloZWxwCisJICBCbG93ZmlzaCBjaXBoZXIgYWxnb3JpdGhtICh4ODZfNjQpLCBieSBCcnVjZSBTY2huZWllci4KKworCSAgVGhpcyBpcyBhIHZhcmlhYmxlIGtleSBsZW5ndGggY2lwaGVyIHdoaWNoIGNhbiB1c2Uga2V5cyBmcm9tIDMyCisJICBiaXRzIHRvIDQ0OCBiaXRzIGluIGxlbmd0aC4gIEl0J3MgZmFzdCwgc2ltcGxlIGFuZCBzcGVjaWZpY2FsbHkKKwkgIGRlc2lnbmVkIGZvciB1c2Ugb24gImxhcmdlIG1pY3JvcHJvY2Vzc29ycyIuCisKKwkgIFNlZSBhbHNvOgorCSAgPGh0dHA6Ly93d3cuc2NobmVpZXIuY29tL2Jsb3dmaXNoLmh0bWw+CisKIGNvbmZpZyBDUllQVE9fQ0FNRUxMSUEKIAl0cmlzdGF0ZSAiQ2FtZWxsaWEgY2lwaGVyIGFsZ29yaXRobXMiCiAJZGVwZW5kcyBvbiBDUllQVE8KQEAgLTc5Myw2ICs4MzYsMjYgQEAKIAkgIFNlZSBhbHNvOgogCSAgPGh0dHA6Ly93d3cuc2NobmVpZXIuY29tL3R3b2Zpc2guaHRtbD4KIAorY29uZmlnIENSWVBUT19UV09GSVNIX1g4Nl82NF8zV0FZCisJdHJpc3RhdGUgIlR3b2Zpc2ggY2lwaGVyIGFsZ29yaXRobSAoeDg2XzY0LCAzLXdheSBwYXJhbGxlbCkiCisJZGVwZW5kcyBvbiAoWDg2IHx8IFVNTF9YODYpICYmIDY0QklUCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKwlzZWxlY3QgQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OCisJc2VsZWN0IENSWVBUT19UV09GSVNIX1g4Nl82NAorCWhlbHAKKwkgIFR3b2Zpc2ggY2lwaGVyIGFsZ29yaXRobSAoeDg2XzY0LCAzLXdheSBwYXJhbGxlbCkuCisKKwkgIFR3b2Zpc2ggd2FzIHN1Ym1pdHRlZCBhcyBhbiBBRVMgKEFkdmFuY2VkIEVuY3J5cHRpb24gU3RhbmRhcmQpCisJICBjYW5kaWRhdGUgY2lwaGVyIGJ5IHJlc2VhcmNoZXJzIGF0IENvdW50ZXJQYW5lIFN5c3RlbXMuICBJdCBpcyBhCisJICAxNiByb3VuZCBibG9jayBjaXBoZXIgc3VwcG9ydGluZyBrZXkgc2l6ZXMgb2YgMTI4LCAxOTIsIGFuZCAyNTYKKwkgIGJpdHMuCisKKwkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIFR3b2Zpc2ggY2lwaGVyIGFsZ29yaXRobSB0aGF0IHByb2Nlc3NlcyB0aHJlZQorCSAgYmxvY2tzIHBhcmFsbGVsLCB1dGlsaXppbmcgcmVzb3VyY2VzIG9mIG91dC1vZi1vcmRlciBDUFVzIGJldHRlci4KKworCSAgU2VlIGFsc286CisJICA8aHR0cDovL3d3dy5zY2huZWllci5jb20vdHdvZmlzaC5odG1sPgorCiBjb21tZW50ICJDb21wcmVzc2lvbiIKIAogY29uZmlnIENSWVBUT19ERUZMQVRFCmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGUKaW5kZXggY2U1YTgxMy4uOWU2ZWVlMiAxMDA2NDQKLS0tIGEvY3J5cHRvL01ha2VmaWxlCisrKyBiL2NyeXB0by9NYWtlZmlsZQpAQCAtMzEsNiArMzEsNyBAQAogY3J5cHRvbWdyLXkgOj0gYWxnYm9zcy5vIHRlc3RtZ3IubwogCiBvYmotJChDT05GSUdfQ1JZUFRPX01BTkFHRVIyKSArPSBjcnlwdG9tZ3Iubworb2JqLSQoQ09ORklHX0NSWVBUT19VU0VSKSArPSBjcnlwdG9fdXNlci5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0hNQUMpICs9IGhtYWMubwogb2JqLSQoQ09ORklHX0NSWVBUT19WTUFDKSArPSB2bWFjLm8KIG9iai0kKENPTkZJR19DUllQVE9fWENCQykgKz0geGNiYy5vCkBAIC02MCw3ICs2MSw4IEBACiBvYmotJChDT05GSUdfQ1JZUFRPX0NSWVBURCkgKz0gY3J5cHRkLm8KIG9iai0kKENPTkZJR19DUllQVE9fREVTKSArPSBkZXNfZ2VuZXJpYy5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0ZDUllQVCkgKz0gZmNyeXB0Lm8KLW9iai0kKENPTkZJR19DUllQVE9fQkxPV0ZJU0gpICs9IGJsb3dmaXNoLm8KK29iai0kKENPTkZJR19DUllQVE9fQkxPV0ZJU0gpICs9IGJsb3dmaXNoX2dlbmVyaWMubworb2JqLSQoQ09ORklHX0NSWVBUT19CTE9XRklTSF9DT01NT04pICs9IGJsb3dmaXNoX2NvbW1vbi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1RXT0ZJU0gpICs9IHR3b2Zpc2hfZ2VuZXJpYy5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OKSArPSB0d29maXNoX2NvbW1vbi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1NFUlBFTlQpICs9IHNlcnBlbnQubwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FibGtjaXBoZXIuYyBiL2NyeXB0by9hYmxrY2lwaGVyLmMKaW5kZXggZmRjNjdkMy4uYTBmNzY4YyAxMDA2NDQKLS0tIGEvY3J5cHRvL2FibGtjaXBoZXIuYworKysgYi9jcnlwdG8vYWJsa2NpcGhlci5jCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG91c2VyLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KIAogI2luY2x1ZGUgPGNyeXB0by9zY2F0dGVyd2Fsay5oPgogCkBAIC0zODEsNiArMzgzLDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGNyeXB0b19hYmxrY2lwaGVyX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXN0cnVjdCBjcnlwdG9fcmVwb3J0X2Jsa2NpcGhlciByYmxrY2lwaGVyOworCisJc25wcmludGYocmJsa2NpcGhlci50eXBlLCBDUllQVE9fTUFYX0FMR19OQU1FLCAiJXMiLCAiYWJsa2NpcGhlciIpOworCXNucHJpbnRmKHJibGtjaXBoZXIuZ2VuaXYsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsCisJCSBhbGctPmNyYV9hYmxrY2lwaGVyLmdlbml2ID86ICI8ZGVmYXVsdD4iKTsKKworCXJibGtjaXBoZXIuYmxvY2tzaXplID0gYWxnLT5jcmFfYmxvY2tzaXplOworCXJibGtjaXBoZXIubWluX2tleXNpemUgPSBhbGctPmNyYV9hYmxrY2lwaGVyLm1pbl9rZXlzaXplOworCXJibGtjaXBoZXIubWF4X2tleXNpemUgPSBhbGctPmNyYV9hYmxrY2lwaGVyLm1heF9rZXlzaXplOworCXJibGtjaXBoZXIuaXZzaXplID0gYWxnLT5jcmFfYWJsa2NpcGhlci5pdnNpemU7CisKKwlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfQkxLQ0lQSEVSLAorCQlzaXplb2Yoc3RydWN0IGNyeXB0b19yZXBvcnRfYmxrY2lwaGVyKSwgJnJibGtjaXBoZXIpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgY3J5cHRvX2FibGtjaXBoZXJfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgY3J5cHRvX2FibGtjaXBoZXJfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiAJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwogc3RhdGljIHZvaWQgY3J5cHRvX2FibGtjaXBoZXJfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCkBAIC00MDMsNiArNDM0LDcgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCS5zaG93ID0gY3J5cHRvX2FibGtjaXBoZXJfc2hvdywKICNlbmRpZgorCS5yZXBvcnQgPSBjcnlwdG9fYWJsa2NpcGhlcl9yZXBvcnQsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FibGtjaXBoZXJfdHlwZSk7CiAKQEAgLTQzMiw2ICs0NjQsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19ORVQKK3N0YXRpYyBpbnQgY3J5cHRvX2dpdmNpcGhlcl9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9ibGtjaXBoZXIgcmJsa2NpcGhlcjsKKworCXNucHJpbnRmKHJibGtjaXBoZXIudHlwZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwgImdpdmNpcGhlciIpOworCXNucHJpbnRmKHJibGtjaXBoZXIuZ2VuaXYsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsCisJCSBhbGctPmNyYV9hYmxrY2lwaGVyLmdlbml2ID86ICI8YnVpbHQtaW4+Iik7CisKKwlyYmxrY2lwaGVyLmJsb2Nrc2l6ZSA9IGFsZy0+Y3JhX2Jsb2Nrc2l6ZTsKKwlyYmxrY2lwaGVyLm1pbl9rZXlzaXplID0gYWxnLT5jcmFfYWJsa2NpcGhlci5taW5fa2V5c2l6ZTsKKwlyYmxrY2lwaGVyLm1heF9rZXlzaXplID0gYWxnLT5jcmFfYWJsa2NpcGhlci5tYXhfa2V5c2l6ZTsKKwlyYmxrY2lwaGVyLml2c2l6ZSA9IGFsZy0+Y3JhX2FibGtjaXBoZXIuaXZzaXplOworCisJTkxBX1BVVChza2IsIENSWVBUT0NGR0FfUkVQT1JUX0JMS0NJUEhFUiwKKwkJc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcmVwb3J0X2Jsa2NpcGhlciksICZyYmxrY2lwaGVyKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKyNlbHNlCitzdGF0aWMgaW50IGNyeXB0b19naXZjaXBoZXJfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgY3J5cHRvX2dpdmNpcGhlcl9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKIAlfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CiBzdGF0aWMgdm9pZCBjcnlwdG9fZ2l2Y2lwaGVyX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQpAQCAtNDU0LDYgKzUxNSw3IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAkuc2hvdyA9IGNyeXB0b19naXZjaXBoZXJfc2hvdywKICNlbmRpZgorCS5yZXBvcnQgPSBjcnlwdG9fZ2l2Y2lwaGVyX3JlcG9ydCwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fZ2l2Y2lwaGVyX3R5cGUpOwogCmRpZmYgLS1naXQgYS9jcnlwdG8vYWVhZC5jIGIvY3J5cHRvL2FlYWQuYwppbmRleCA2NzI5ZThmLi4wNGFkZDNkYyAxMDA2NDQKLS0tIGEvY3J5cHRvL2FlYWQuYworKysgYi9jcnlwdG8vYWVhZC5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG91c2VyLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTEwOSw2ICsxMTEsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19ORVQKK3N0YXRpYyBpbnQgY3J5cHRvX2FlYWRfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJc3RydWN0IGNyeXB0b19yZXBvcnRfYWVhZCByYWVhZDsKKwlzdHJ1Y3QgYWVhZF9hbGcgKmFlYWQgPSAmYWxnLT5jcmFfYWVhZDsKKworCXNucHJpbnRmKHJhZWFkLnR5cGUsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsICJhZWFkIik7CisJc25wcmludGYocmFlYWQuZ2VuaXYsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsCisJCSBhZWFkLT5nZW5pdiA/OiAiPGJ1aWx0LWluPiIpOworCisJcmFlYWQuYmxvY2tzaXplID0gYWxnLT5jcmFfYmxvY2tzaXplOworCXJhZWFkLm1heGF1dGhzaXplID0gYWVhZC0+bWF4YXV0aHNpemU7CisJcmFlYWQuaXZzaXplID0gYWVhZC0+aXZzaXplOworCisJTkxBX1BVVChza2IsIENSWVBUT0NGR0FfUkVQT1JUX0FFQUQsCisJCXNpemVvZihzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9hZWFkKSwgJnJhZWFkKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKyNlbHNlCitzdGF0aWMgaW50IGNyeXB0b19hZWFkX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXJldHVybiAtRU5PU1lTOworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIGNyeXB0b19hZWFkX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIHN0YXRpYyB2b2lkIGNyeXB0b19hZWFkX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQpAQCAtMTMwLDYgKzE2MSw3IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAkuc2hvdyA9IGNyeXB0b19hZWFkX3Nob3csCiAjZW5kaWYKKwkucmVwb3J0ID0gY3J5cHRvX2FlYWRfcmVwb3J0LAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hZWFkX3R5cGUpOwogCkBAIC0xNjUsNiArMTk3LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGNyeXB0b19uaXZhZWFkX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXN0cnVjdCBjcnlwdG9fcmVwb3J0X2FlYWQgcmFlYWQ7CisJc3RydWN0IGFlYWRfYWxnICphZWFkID0gJmFsZy0+Y3JhX2FlYWQ7CisKKwlzbnByaW50ZihyYWVhZC50eXBlLCBDUllQVE9fTUFYX0FMR19OQU1FLCAiJXMiLCAibml2YWVhZCIpOworCXNucHJpbnRmKHJhZWFkLmdlbml2LCBDUllQVE9fTUFYX0FMR19OQU1FLCAiJXMiLCBhZWFkLT5nZW5pdik7CisKKwlyYWVhZC5ibG9ja3NpemUgPSBhbGctPmNyYV9ibG9ja3NpemU7CisJcmFlYWQubWF4YXV0aHNpemUgPSBhZWFkLT5tYXhhdXRoc2l6ZTsKKwlyYWVhZC5pdnNpemUgPSBhZWFkLT5pdnNpemU7CisKKwlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfQUVBRCwKKwkJc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcmVwb3J0X2FlYWQpLCAmcmFlYWQpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgY3J5cHRvX25pdmFlYWRfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKKworCiBzdGF0aWMgdm9pZCBjcnlwdG9fbml2YWVhZF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKIAlfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CiBzdGF0aWMgdm9pZCBjcnlwdG9fbml2YWVhZF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKQEAgLTE4Niw2ICsyNDcsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJLnNob3cgPSBjcnlwdG9fbml2YWVhZF9zaG93LAogI2VuZGlmCisJLnJlcG9ydCA9IGNyeXB0b19uaXZhZWFkX3JlcG9ydCwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fbml2YWVhZF90eXBlKTsKIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2FoYXNoLmMgYi9jcnlwdG8vYWhhc2guYwppbmRleCBmNjY5ODIyLi5hYzkzYzk5IDEwMDY0NAotLS0gYS9jcnlwdG8vYWhhc2guYworKysgYi9jcnlwdG8vYWhhc2guYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvdXNlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC0zOTcsNiArMzk5LDMxIEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgY3J5cHRvX3NoYXNoICopOwogfQogCisjaWZkZWYgQ09ORklHX05FVAorc3RhdGljIGludCBjcnlwdG9fYWhhc2hfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJc3RydWN0IGNyeXB0b19yZXBvcnRfaGFzaCByaGFzaDsKKworCXNucHJpbnRmKHJoYXNoLnR5cGUsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsICJhaGFzaCIpOworCisJcmhhc2guYmxvY2tzaXplID0gYWxnLT5jcmFfYmxvY2tzaXplOworCXJoYXNoLmRpZ2VzdHNpemUgPSBfX2NyeXB0b19oYXNoX2FsZ19jb21tb24oYWxnKS0+ZGlnZXN0c2l6ZTsKKworCU5MQV9QVVQoc2tiLCBDUllQVE9DRkdBX1JFUE9SVF9IQVNILAorCQlzaXplb2Yoc3RydWN0IGNyeXB0b19yZXBvcnRfaGFzaCksICZyaGFzaCk7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisjZWxzZQorc3RhdGljIGludCBjcnlwdG9fYWhhc2hfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgY3J5cHRvX2FoYXNoX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIHN0YXRpYyB2b2lkIGNyeXB0b19haGFzaF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKQEAgLTQxNSw2ICs0NDIsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJLnNob3cgPSBjcnlwdG9fYWhhc2hfc2hvdywKICNlbmRpZgorCS5yZXBvcnQgPSBjcnlwdG9fYWhhc2hfcmVwb3J0LAogCS5tYXNrY2xlYXIgPSB+Q1JZUFRPX0FMR19UWVBFX01BU0ssCiAJLm1hc2tzZXQgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0hfTUFTSywKIAkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9BSEFTSCwKZGlmZiAtLWdpdCBhL2NyeXB0by9hbGdhcGkuYyBiL2NyeXB0by9hbGdhcGkuYwppbmRleCBjM2NmMWE2Li41NGRkNGUzIDEwMDY0NAotLS0gYS9jcnlwdG8vYWxnYXBpLmMKKysrIGIvY3J5cHRvL2FsZ2FwaS5jCkBAIC0yMiw4ICsyMiw2IEBACiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi1zdGF0aWMgdm9pZCBjcnlwdG9fcmVtb3ZlX2ZpbmFsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwotCiBzdGF0aWMgTElTVF9IRUFEKGNyeXB0b190ZW1wbGF0ZV9saXN0KTsKIAogdm9pZCBjcnlwdG9fbGFydmFsX2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKQEAgLTEyOSw5ICsxMjcsOCBAQAogCUJVR19PTighbGlzdF9lbXB0eSgmaW5zdC0+YWxnLmNyYV91c2VycykpOwogfQogCi1zdGF0aWMgdm9pZCBjcnlwdG9fcmVtb3ZlX3NwYXducyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLAotCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAotCQkJCSBzdHJ1Y3QgY3J5cHRvX2FsZyAqbmFsZykKK3ZvaWQgY3J5cHRvX3JlbW92ZV9zcGF3bnMoc3RydWN0IGNyeXB0b19hbGcgKmFsZywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJCSAgc3RydWN0IGNyeXB0b19hbGcgKm5hbGcpCiB7CiAJdTMyIG5ld190eXBlID0gKG5hbGcgPzogYWxnKS0+Y3JhX2ZsYWdzOwogCXN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduLCAqbjsKQEAgLTE3Nyw2ICsxNzQsNyBAQAogCQkJY3J5cHRvX3JlbW92ZV9zcGF3bihzcGF3biwgbGlzdCk7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX3JlbW92ZV9zcGF3bnMpOwogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19sYXJ2YWwgKl9fY3J5cHRvX3JlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogewpAQCAtMzIxLDcgKzMxOSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fYWxnX3Rlc3RlZCk7CiAKLXN0YXRpYyB2b2lkIGNyeXB0b19yZW1vdmVfZmluYWwoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3ZvaWQgY3J5cHRvX3JlbW92ZV9maW5hbChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewogCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CiAJc3RydWN0IGNyeXB0b19hbGcgKm47CkBAIC0zMzEsNiArMzI5LDcgQEAKIAkJY3J5cHRvX2FsZ19wdXQoYWxnKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fcmVtb3ZlX2ZpbmFsKTsKIAogc3RhdGljIHZvaWQgY3J5cHRvX3dhaXRfZm9yX3Rlc3Qoc3RydWN0IGNyeXB0b19sYXJ2YWwgKmxhcnZhbCkKIHsKQEAgLTQ5Myw2ICs0OTIsNyBAQAogCQlnb3RvIGVycjsKIAogCWluc3QtPmFsZy5jcmFfbW9kdWxlID0gdG1wbC0+bW9kdWxlOworCWluc3QtPmFsZy5jcmFfZmxhZ3MgfD0gQ1JZUFRPX0FMR19JTlNUQU5DRTsKIAogCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX21lbWNweS5jIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX21lbWNweS5jCmluZGV4IDUxOGMyMmIuLjBkNWE5MGMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hc3luY190eC9hc3luY19tZW1jcHkuYworKysgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfbWVtY3B5LmMKQEAgLTI1LDYgKzI1LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYXN5bmNfdHguaD4KZGlmZiAtLWdpdCBhL2NyeXB0by9hc3luY190eC9hc3luY19wcS5jIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3BxLmMKaW5kZXggZmRkODI1Ny4uOTFkNWQzOCAxMDA2NDQKLS0tIGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3BxLmMKKysrIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3BxLmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jX3R4Lmg+CmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcmFpZDZfcmVjb3YuYyBiL2NyeXB0by9hc3luY190eC9hc3luY19yYWlkNl9yZWNvdi5jCmluZGV4IGNlMDM4ZDguLmE5ZjA4YTYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hc3luY190eC9hc3luY19yYWlkNl9yZWNvdi5jCisrKyBiL2NyeXB0by9hc3luY190eC9hc3luY19yYWlkNl9yZWNvdi5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KICNpbmNsdWRlIDxsaW51eC9hc3luY190eC5oPgpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3R4LmMgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfdHguYwppbmRleCA3ZjJjMDBhLi44NDIxMjA5IDEwMDY0NAotLS0gYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfdHguYworKysgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfdHguYwpAQCAtMjQsNiArMjQsNyBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9hc3luY190eC5oPgogCmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfeG9yLmMgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfeG9yLmMKaW5kZXggYmMyODMzNy4uMTU0Y2M4NCAxMDA2NDQKLS0tIGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3hvci5jCisrKyBiL2NyeXB0by9hc3luY190eC9hc3luY194b3IuYwpAQCAtMjUsNiArMjUsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhaWQveG9yLmg+CmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvcmFpZDZ0ZXN0LmMgYi9jcnlwdG8vYXN5bmNfdHgvcmFpZDZ0ZXN0LmMKaW5kZXggYzg4ZmY5ZS4uYWEyYjAyNyAxMDA2NDQKLS0tIGEvY3J5cHRvL2FzeW5jX3R4L3JhaWQ2dGVzdC5jCisrKyBiL2NyeXB0by9hc3luY190eC9yYWlkNnRlc3QuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICN1bmRlZiBwcgogI2RlZmluZSBwcihmbXQsIGFyZ3MuLi4pIHByX2luZm8oInJhaWQ2dGVzdDogIiBmbXQsICMjYXJncykKZGlmZiAtLWdpdCBhL2NyeXB0by9ibGtjaXBoZXIuYyBiL2NyeXB0by9ibGtjaXBoZXIuYwppbmRleCA3YTcyMTkyLi4xZTYxZDFhIDEwMDY0NAotLS0gYS9jcnlwdG8vYmxrY2lwaGVyLmMKKysrIGIvY3J5cHRvL2Jsa2NpcGhlci5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvdXNlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC00OTIsNiArNDk0LDM1IEBACiAJCXJldHVybiBjcnlwdG9faW5pdF9ibGtjaXBoZXJfb3BzX2FzeW5jKHRmbSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGNyeXB0b19ibGtjaXBoZXJfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJc3RydWN0IGNyeXB0b19yZXBvcnRfYmxrY2lwaGVyIHJibGtjaXBoZXI7CisKKwlzbnByaW50ZihyYmxrY2lwaGVyLnR5cGUsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsICJibGtjaXBoZXIiKTsKKwlzbnByaW50ZihyYmxrY2lwaGVyLmdlbml2LCBDUllQVE9fTUFYX0FMR19OQU1FLCAiJXMiLAorCQkgYWxnLT5jcmFfYmxrY2lwaGVyLmdlbml2ID86ICI8ZGVmYXVsdD4iKTsKKworCXJibGtjaXBoZXIuYmxvY2tzaXplID0gYWxnLT5jcmFfYmxvY2tzaXplOworCXJibGtjaXBoZXIubWluX2tleXNpemUgPSBhbGctPmNyYV9ibGtjaXBoZXIubWluX2tleXNpemU7CisJcmJsa2NpcGhlci5tYXhfa2V5c2l6ZSA9IGFsZy0+Y3JhX2Jsa2NpcGhlci5tYXhfa2V5c2l6ZTsKKwlyYmxrY2lwaGVyLml2c2l6ZSA9IGFsZy0+Y3JhX2Jsa2NpcGhlci5pdnNpemU7CisKKwlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfQkxLQ0lQSEVSLAorCQlzaXplb2Yoc3RydWN0IGNyeXB0b19yZXBvcnRfYmxrY2lwaGVyKSwgJnJibGtjaXBoZXIpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgY3J5cHRvX2Jsa2NpcGhlcl9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBjcnlwdG9fYmxrY2lwaGVyX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIHN0YXRpYyB2b2lkIGNyeXB0b19ibGtjaXBoZXJfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCkBAIC01MTEsNiArNTQyLDcgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCS5zaG93ID0gY3J5cHRvX2Jsa2NpcGhlcl9zaG93LAogI2VuZGlmCisJLnJlcG9ydCA9IGNyeXB0b19ibGtjaXBoZXJfcmVwb3J0LAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19ibGtjaXBoZXJfdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9ibG93ZmlzaC5jIGIvY3J5cHRvL2Jsb3dmaXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2N2Q1MmUuLjAwMDAwMDAKLS0tIGEvY3J5cHRvL2Jsb3dmaXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyoKLSAqIENyeXB0b2dyYXBoaWMgQVBJLgotICoKLSAqIEJsb3dmaXNoIENpcGhlciBBbGdvcml0aG0sIGJ5IEJydWNlIFNjaG5laWVyLgotICogaHR0cDovL3d3dy5jb3VudGVycGFuZS5jb20vYmxvd2Zpc2guaHRtbAotICoKLSAqIEFkYXB0ZWQgZnJvbSBLZXJuZWxpIGltcGxlbWVudGF0aW9uLgotICoKLSAqIENvcHlyaWdodCAoYykgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGh2cmxhYi5vcmc+Ci0gKiBDb3B5cmlnaHQgKGMpIEt5bGUgTWNNYXJ0aW4gPGt5bGVAZGViaWFuLm9yZz4KLSAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jZGVmaW5lIEJGX0JMT0NLX1NJWkUgOAotI2RlZmluZSBCRl9NSU5fS0VZX1NJWkUgNAotI2RlZmluZSBCRl9NQVhfS0VZX1NJWkUgNTYKLQotc3RydWN0IGJmX2N0eCB7Ci0JdTMyIHBbMThdOwotCXUzMiBzWzEwMjRdOwotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBiZl9wYm94WzE2ICsgMl0gPSB7Ci0JMHgyNDNmNmE4OCwgMHg4NWEzMDhkMywgMHgxMzE5OGEyZSwgMHgwMzcwNzM0NCwKLQkweGE0MDkzODIyLCAweDI5OWYzMWQwLCAweDA4MmVmYTk4LCAweGVjNGU2Yzg5LAotCTB4NDUyODIxZTYsIDB4MzhkMDEzNzcsIDB4YmU1NDY2Y2YsIDB4MzRlOTBjNmMsCi0JMHhjMGFjMjliNywgMHhjOTdjNTBkZCwgMHgzZjg0ZDViNSwgMHhiNTQ3MDkxNywKLQkweDkyMTZkNWQ5LCAweDg5NzlmYjFiLAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBiZl9zYm94WzI1NiAqIDRdID0gewotCTB4ZDEzMTBiYTYsIDB4OThkZmI1YWMsIDB4MmZmZDcyZGIsIDB4ZDAxYWRmYjcsCi0JMHhiOGUxYWZlZCwgMHg2YTI2N2U5NiwgMHhiYTdjOTA0NSwgMHhmMTJjN2Y5OSwKLQkweDI0YTE5OTQ3LCAweGIzOTE2Y2Y3LCAweDA4MDFmMmUyLCAweDg1OGVmYzE2LAotCTB4NjM2OTIwZDgsIDB4NzE1NzRlNjksIDB4YTQ1OGZlYTMsIDB4ZjQ5MzNkN2UsCi0JMHgwZDk1NzQ4ZiwgMHg3MjhlYjY1OCwgMHg3MThiY2Q1OCwgMHg4MjE1NGFlZSwKLQkweDdiNTRhNDFkLCAweGMyNWE1OWI1LCAweDljMzBkNTM5LCAweDJhZjI2MDEzLAotCTB4YzVkMWIwMjMsIDB4Mjg2MDg1ZjAsIDB4Y2E0MTc5MTgsIDB4YjhkYjM4ZWYsCi0JMHg4ZTc5ZGNiMCwgMHg2MDNhMTgwZSwgMHg2YzllMGU4YiwgMHhiMDFlOGEzZSwKLQkweGQ3MTU3N2MxLCAweGJkMzE0YjI3LCAweDc4YWYyZmRhLCAweDU1NjA1YzYwLAotCTB4ZTY1NTI1ZjMsIDB4YWE1NWFiOTQsIDB4NTc0ODk4NjIsIDB4NjNlODE0NDAsCi0JMHg1NWNhMzk2YSwgMHgyYWFiMTBiNiwgMHhiNGNjNWMzNCwgMHgxMTQxZThjZSwKLQkweGExNTQ4NmFmLCAweDdjNzJlOTkzLCAweGIzZWUxNDExLCAweDYzNmZiYzJhLAotCTB4MmJhOWM1NWQsIDB4NzQxODMxZjYsIDB4Y2U1YzNlMTYsIDB4OWI4NzkzMWUsCi0JMHhhZmQ2YmEzMywgMHg2YzI0Y2Y1YywgMHg3YTMyNTM4MSwgMHgyODk1ODY3NywKLQkweDNiOGY0ODk4LCAweDZiNGJiOWFmLCAweGM0YmZlODFiLCAweDY2MjgyMTkzLAotCTB4NjFkODA5Y2MsIDB4ZmIyMWE5OTEsIDB4NDg3Y2FjNjAsIDB4NWRlYzgwMzIsCi0JMHhlZjg0NWQ1ZCwgMHhlOTg1NzViMSwgMHhkYzI2MjMwMiwgMHhlYjY1MWI4OCwKLQkweDIzODkzZTgxLCAweGQzOTZhY2M1LCAweDBmNmQ2ZmYzLCAweDgzZjQ0MjM5LAotCTB4MmUwYjQ0ODIsIDB4YTQ4NDIwMDQsIDB4NjljOGYwNGEsIDB4OWUxZjliNWUsCi0JMHgyMWM2Njg0MiwgMHhmNmU5NmM5YSwgMHg2NzBjOWM2MSwgMHhhYmQzODhmMCwKLQkweDZhNTFhMGQyLCAweGQ4NTQyZjY4LCAweDk2MGZhNzI4LCAweGFiNTEzM2EzLAotCTB4NmVlZjBiNmMsIDB4MTM3YTNiZTQsIDB4YmEzYmYwNTAsIDB4N2VmYjJhOTgsCi0JMHhhMWYxNjUxZCwgMHgzOWFmMDE3NiwgMHg2NmNhNTkzZSwgMHg4MjQzMGU4OCwKLQkweDhjZWU4NjE5LCAweDQ1NmY5ZmI0LCAweDdkODRhNWMzLCAweDNiOGI1ZWJlLAotCTB4ZTA2Zjc1ZDgsIDB4ODVjMTIwNzMsIDB4NDAxYTQ0OWYsIDB4NTZjMTZhYTYsCi0JMHg0ZWQzYWE2MiwgMHgzNjNmNzcwNiwgMHgxYmZlZGY3MiwgMHg0MjliMDIzZCwKLQkweDM3ZDBkNzI0LCAweGQwMGExMjQ4LCAweGRiMGZlYWQzLCAweDQ5ZjFjMDliLAotCTB4MDc1MzcyYzksIDB4ODA5OTFiN2IsIDB4MjVkNDc5ZDgsIDB4ZjZlOGRlZjcsCi0JMHhlM2ZlNTAxYSwgMHhiNjc5NGMzYiwgMHg5NzZjZTBiZCwgMHgwNGMwMDZiYSwKLQkweGMxYTk0ZmI2LCAweDQwOWY2MGM0LCAweDVlNWM5ZWMyLCAweDE5NmEyNDYzLAotCTB4NjhmYjZmYWYsIDB4M2U2YzUzYjUsIDB4MTMzOWIyZWIsIDB4M2I1MmVjNmYsCi0JMHg2ZGZjNTExZiwgMHg5YjMwOTUyYywgMHhjYzgxNDU0NCwgMHhhZjVlYmQwOSwKLQkweGJlZTNkMDA0LCAweGRlMzM0YWZkLCAweDY2MGYyODA3LCAweDE5MmU0YmIzLAotCTB4YzBjYmE4NTcsIDB4NDVjODc0MGYsIDB4ZDIwYjVmMzksIDB4YjlkM2ZiZGIsCi0JMHg1NTc5YzBiZCwgMHgxYTYwMzIwYSwgMHhkNmExMDBjNiwgMHg0MDJjNzI3OSwKLQkweDY3OWYyNWZlLCAweGZiMWZhM2NjLCAweDhlYTVlOWY4LCAweGRiMzIyMmY4LAotCTB4M2M3NTE2ZGYsIDB4ZmQ2MTZiMTUsIDB4MmY1MDFlYzgsIDB4YWQwNTUyYWIsCi0JMHgzMjNkYjVmYSwgMHhmZDIzODc2MCwgMHg1MzMxN2I0OCwgMHgzZTAwZGY4MiwKLQkweDllNWM1N2JiLCAweGNhNmY4Y2EwLCAweDFhODc1NjJlLCAweGRmMTc2OWRiLAotCTB4ZDU0MmE4ZjYsIDB4Mjg3ZWZmYzMsIDB4YWM2NzMyYzYsIDB4OGM0ZjU1NzMsCi0JMHg2OTViMjdiMCwgMHhiYmNhNThjOCwgMHhlMWZmYTM1ZCwgMHhiOGYwMTFhMCwKLQkweDEwZmEzZDk4LCAweGZkMjE4M2I4LCAweDRhZmNiNTZjLCAweDJkZDFkMzViLAotCTB4OWE1M2U0NzksIDB4YjZmODQ1NjUsIDB4ZDI4ZTQ5YmMsIDB4NGJmYjk3OTAsCi0JMHhlMWRkZjJkYSwgMHhhNGNiN2UzMywgMHg2MmZiMTM0MSwgMHhjZWU0YzZlOCwKLQkweGVmMjBjYWRhLCAweDM2Nzc0YzAxLCAweGQwN2U5ZWZlLCAweDJiZjExZmI0LAotCTB4OTVkYmRhNGQsIDB4YWU5MDkxOTgsIDB4ZWFhZDhlNzEsIDB4NmI5M2Q1YTAsCi0JMHhkMDhlZDFkMCwgMHhhZmM3MjVlMCwgMHg4ZTNjNWIyZiwgMHg4ZTc1OTRiNywKLQkweDhmZjZlMmZiLCAweGYyMTIyYjY0LCAweDg4ODhiODEyLCAweDkwMGRmMDFjLAotCTB4NGZhZDVlYTAsIDB4Njg4ZmMzMWMsIDB4ZDFjZmYxOTEsIDB4YjNhOGMxYWQsCi0JMHgyZjJmMjIxOCwgMHhiZTBlMTc3NywgMHhlYTc1MmRmZSwgMHg4YjAyMWZhMSwKLQkweGU1YTBjYzBmLCAweGI1NmY3NGU4LCAweDE4YWNmM2Q2LCAweGNlODllMjk5LAotCTB4YjRhODRmZTAsIDB4ZmQxM2UwYjcsIDB4N2NjNDNiODEsIDB4ZDJhZGE4ZDksCi0JMHgxNjVmYTI2NiwgMHg4MDk1NzcwNSwgMHg5M2NjNzMxNCwgMHgyMTFhMTQ3NywKLQkweGU2YWQyMDY1LCAweDc3YjVmYTg2LCAweGM3NTQ0MmY1LCAweGZiOWQzNWNmLAotCTB4ZWJjZGFmMGMsIDB4N2IzZTg5YTAsIDB4ZDY0MTFiZDMsIDB4YWUxZTdlNDksCi0JMHgwMDI1MGUyZCwgMHgyMDcxYjM1ZSwgMHgyMjY4MDBiYiwgMHg1N2I4ZTBhZiwKLQkweDI0NjQzNjliLCAweGYwMDliOTFlLCAweDU1NjM5MTFkLCAweDU5ZGZhNmFhLAotCTB4NzhjMTQzODksIDB4ZDk1YTUzN2YsIDB4MjA3ZDViYTIsIDB4MDJlNWI5YzUsCi0JMHg4MzI2MDM3NiwgMHg2Mjk1Y2ZhOSwgMHgxMWM4MTk2OCwgMHg0ZTczNGE0MSwKLQkweGIzNDcyZGNhLCAweDdiMTRhOTRhLCAweDFiNTEwMDUyLCAweDlhNTMyOTE1LAotCTB4ZDYwZjU3M2YsIDB4YmM5YmM2ZTQsIDB4MmI2MGE0NzYsIDB4ODFlNjc0MDAsCi0JMHgwOGJhNmZiNSwgMHg1NzFiZTkxZiwgMHhmMjk2ZWM2YiwgMHgyYTBkZDkxNSwKLQkweGI2NjM2NTIxLCAweGU3YjlmOWI2LCAweGZmMzQwNTJlLCAweGM1ODU1NjY0LAotCTB4NTNiMDJkNWQsIDB4YTk5ZjhmYTEsIDB4MDhiYTQ3OTksIDB4NmU4NTA3NmEsCi0JMHg0YjdhNzBlOSwgMHhiNWIzMjk0NCwgMHhkYjc1MDkyZSwgMHhjNDE5MjYyMywKLQkweGFkNmVhNmIwLCAweDQ5YTdkZjdkLCAweDljZWU2MGI4LCAweDhmZWRiMjY2LAotCTB4ZWNhYThjNzEsIDB4Njk5YTE3ZmYsIDB4NTY2NDUyNmMsIDB4YzJiMTllZTEsCi0JMHgxOTM2MDJhNSwgMHg3NTA5NGMyOSwgMHhhMDU5MTM0MCwgMHhlNDE4M2EzZSwKLQkweDNmNTQ5ODlhLCAweDViNDI5ZDY1LCAweDZiOGZlNGQ2LCAweDk5ZjczZmQ2LAotCTB4YTFkMjljMDcsIDB4ZWZlODMwZjUsIDB4NGQyZDM4ZTYsIDB4ZjAyNTVkYzEsCi0JMHg0Y2RkMjA4NiwgMHg4NDcwZWIyNiwgMHg2MzgyZTljNiwgMHgwMjFlY2M1ZSwKLQkweDA5Njg2YjNmLCAweDNlYmFlZmM5LCAweDNjOTcxODE0LCAweDZiNmE3MGExLAotCTB4Njg3ZjM1ODQsIDB4NTJhMGUyODYsIDB4Yjc5YzUzMDUsIDB4YWE1MDA3MzcsCi0JMHgzZTA3ODQxYywgMHg3ZmRlYWU1YywgMHg4ZTdkNDRlYywgMHg1NzE2ZjJiOCwKLQkweGIwM2FkYTM3LCAweGYwNTAwYzBkLCAweGYwMWMxZjA0LCAweDAyMDBiM2ZmLAotCTB4YWUwY2Y1MWEsIDB4M2NiNTc0YjIsIDB4MjU4MzdhNTgsIDB4ZGMwOTIxYmQsCi0JMHhkMTkxMTNmOSwgMHg3Y2E5MmZmNiwgMHg5NDMyNDc3MywgMHgyMmY1NDcwMSwKLQkweDNhZTVlNTgxLCAweDM3YzJkYWRjLCAweGM4YjU3NjM0LCAweDlhZjNkZGE3LAotCTB4YTk0NDYxNDYsIDB4MGZkMDAzMGUsIDB4ZWNjOGM3M2UsIDB4YTQ3NTFlNDEsCi0JMHhlMjM4Y2Q5OSwgMHgzYmVhMGUyZiwgMHgzMjgwYmJhMSwgMHgxODNlYjMzMSwKLQkweDRlNTQ4YjM4LCAweDRmNmRiOTA4LCAweDZmNDIwZDAzLCAweGY2MGEwNGJmLAotCTB4MmNiODEyOTAsIDB4MjQ5NzdjNzksIDB4NTY3OWIwNzIsIDB4YmNhZjg5YWYsCi0JMHhkZTlhNzcxZiwgMHhkOTkzMDgxMCwgMHhiMzhiYWUxMiwgMHhkY2NmM2YyZSwKLQkweDU1MTI3MjFmLCAweDJlNmI3MTI0LCAweDUwMWFkZGU2LCAweDlmODRjZDg3LAotCTB4N2E1ODQ3MTgsIDB4NzQwOGRhMTcsIDB4YmM5ZjlhYmMsIDB4ZTk0YjdkOGMsCi0JMHhlYzdhZWMzYSwgMHhkYjg1MWRmYSwgMHg2MzA5NDM2NiwgMHhjNDY0YzNkMiwKLQkweGVmMWMxODQ3LCAweDMyMTVkOTA4LCAweGRkNDMzYjM3LCAweDI0YzJiYTE2LAotCTB4MTJhMTRkNDMsIDB4MmE2NWM0NTEsIDB4NTA5NDAwMDIsIDB4MTMzYWU0ZGQsCi0JMHg3MWRmZjg5ZSwgMHgxMDMxNGU1NSwgMHg4MWFjNzdkNiwgMHg1ZjExMTk5YiwKLQkweDA0MzU1NmYxLCAweGQ3YTNjNzZiLCAweDNjMTExODNiLCAweDU5MjRhNTA5LAotCTB4ZjI4ZmU2ZWQsIDB4OTdmMWZiZmEsIDB4OWViYWJmMmMsIDB4MWUxNTNjNmUsCi0JMHg4NmUzNDU3MCwgMHhlYWU5NmZiMSwgMHg4NjBlNWUwYSwgMHg1YTNlMmFiMywKLQkweDc3MWZlNzFjLCAweDRlM2QwNmZhLCAweDI5NjVkY2I5LCAweDk5ZTcxZDBmLAotCTB4ODAzZTg5ZDYsIDB4NTI2NmM4MjUsIDB4MmU0Y2M5NzgsIDB4OWMxMGIzNmEsCi0JMHhjNjE1MGViYSwgMHg5NGUyZWE3OCwgMHhhNWZjM2M1MywgMHgxZTBhMmRmNCwKLQkweGYyZjc0ZWE3LCAweDM2MWQyYjNkLCAweDE5MzkyNjBmLCAweDE5YzI3OTYwLAotCTB4NTIyM2E3MDgsIDB4ZjcxMzEyYjYsIDB4ZWJhZGZlNmUsIDB4ZWFjMzFmNjYsCi0JMHhlM2JjNDU5NSwgMHhhNjdiYzg4MywgMHhiMTdmMzdkMSwgMHgwMThjZmYyOCwKLQkweGMzMzJkZGVmLCAweGJlNmM1YWE1LCAweDY1NTgyMTg1LCAweDY4YWI5ODAyLAotCTB4ZWVjZWE1MGYsIDB4ZGIyZjk1M2IsIDB4MmFlZjdkYWQsIDB4NWI2ZTJmODQsCi0JMHgxNTIxYjYyOCwgMHgyOTA3NjE3MCwgMHhlY2RkNDc3NSwgMHg2MTlmMTUxMCwKLQkweDEzY2NhODMwLCAweGViNjFiZDk2LCAweDAzMzRmZTFlLCAweGFhMDM2M2NmLAotCTB4YjU3MzVjOTAsIDB4NGM3MGEyMzksIDB4ZDU5ZTllMGIsIDB4Y2JhYWRlMTQsCi0JMHhlZWNjODZiYywgMHg2MDYyMmNhNywgMHg5Y2FiNWNhYiwgMHhiMmYzODQ2ZSwKLQkweDY0OGIxZWFmLCAweDE5YmRmMGNhLCAweGEwMjM2OWI5LCAweDY1NWFiYjUwLAotCTB4NDA2ODVhMzIsIDB4M2MyYWI0YjMsIDB4MzE5ZWU5ZDUsIDB4YzAyMWI4ZjcsCi0JMHg5YjU0MGIxOSwgMHg4NzVmYTA5OSwgMHg5NWY3OTk3ZSwgMHg2MjNkN2RhOCwKLQkweGY4Mzc4ODlhLCAweDk3ZTMyZDc3LCAweDExZWQ5MzVmLCAweDE2NjgxMjgxLAotCTB4MGUzNTg4MjksIDB4YzdlNjFmZDYsIDB4OTZkZWRmYTEsIDB4Nzg1OGJhOTksCi0JMHg1N2Y1ODRhNSwgMHgxYjIyNzI2MywgMHg5YjgzYzNmZiwgMHgxYWMyNDY5NiwKLQkweGNkYjMwYWViLCAweDUzMmUzMDU0LCAweDhmZDk0OGU0LCAweDZkYmMzMTI4LAotCTB4NThlYmYyZWYsIDB4MzRjNmZmZWEsIDB4ZmUyOGVkNjEsIDB4ZWU3YzNjNzMsCi0JMHg1ZDRhMTRkOSwgMHhlODY0YjdlMywgMHg0MjEwNWQxNCwgMHgyMDNlMTNlMCwKLQkweDQ1ZWVlMmI2LCAweGEzYWFhYmVhLCAweGRiNmM0ZjE1LCAweGZhY2I0ZmQwLAotCTB4Yzc0MmY0NDIsIDB4ZWY2YWJiYjUsIDB4NjU0ZjNiMWQsIDB4NDFjZDIxMDUsCi0JMHhkODFlNzk5ZSwgMHg4Njg1NGRjNywgMHhlNDRiNDc2YSwgMHgzZDgxNjI1MCwKLQkweGNmNjJhMWYyLCAweDViOGQyNjQ2LCAweGZjODg4M2EwLCAweGMxYzdiNmEzLAotCTB4N2YxNTI0YzMsIDB4NjljYjc0OTIsIDB4NDc4NDhhMGIsIDB4NTY5MmIyODUsCi0JMHgwOTViYmYwMCwgMHhhZDE5NDg5ZCwgMHgxNDYyYjE3NCwgMHgyMzgyMGUwMCwKLQkweDU4NDI4ZDJhLCAweDBjNTVmNWVhLCAweDFkYWRmNDNlLCAweDIzM2Y3MDYxLAotCTB4MzM3MmYwOTIsIDB4OGQ5MzdlNDEsIDB4ZDY1ZmVjZjEsIDB4NmMyMjNiZGIsCi0JMHg3Y2RlMzc1OSwgMHhjYmVlNzQ2MCwgMHg0MDg1ZjJhNywgMHhjZTc3MzI2ZSwKLQkweGE2MDc4MDg0LCAweDE5Zjg1MDllLCAweGU4ZWZkODU1LCAweDYxZDk5NzM1LAotCTB4YTk2OWE3YWEsIDB4YzUwYzA2YzIsIDB4NWEwNGFiZmMsIDB4ODAwYmNhZGMsCi0JMHg5ZTQ0N2EyZSwgMHhjMzQ1MzQ4NCwgMHhmZGQ1NjcwNSwgMHgwZTFlOWVjOSwKLQkweGRiNzNkYmQzLCAweDEwNTU4OGNkLCAweDY3NWZkYTc5LCAweGUzNjc0MzQwLAotCTB4YzVjNDM0NjUsIDB4NzEzZTM4ZDgsIDB4M2QyOGY4OWUsIDB4ZjE2ZGZmMjAsCi0JMHgxNTNlMjFlNywgMHg4ZmIwM2Q0YSwgMHhlNmUzOWYyYiwgMHhkYjgzYWRmNywKLQkweGU5M2Q1YTY4LCAweDk0ODE0MGY3LCAweGY2NGMyNjFjLCAweDk0NjkyOTM0LAotCTB4NDExNTIwZjcsIDB4NzYwMmQ0ZjcsIDB4YmNmNDZiMmUsIDB4ZDRhMjAwNjgsCi0JMHhkNDA4MjQ3MSwgMHgzMzIwZjQ2YSwgMHg0M2I3ZDRiNywgMHg1MDAwNjFhZiwKLQkweDFlMzlmNjJlLCAweDk3MjQ0NTQ2LCAweDE0MjE0Zjc0LCAweGJmOGI4ODQwLAotCTB4NGQ5NWZjMWQsIDB4OTZiNTkxYWYsIDB4NzBmNGRkZDMsIDB4NjZhMDJmNDUsCi0JMHhiZmJjMDllYywgMHgwM2JkOTc4NSwgMHg3ZmFjNmRkMCwgMHgzMWNiODUwNCwKLQkweDk2ZWIyN2IzLCAweDU1ZmQzOTQxLCAweGRhMjU0N2U2LCAweGFiY2EwYTlhLAotCTB4Mjg1MDc4MjUsIDB4NTMwNDI5ZjQsIDB4MGEyYzg2ZGEsIDB4ZTliNjZkZmIsCi0JMHg2OGRjMTQ2MiwgMHhkNzQ4NjkwMCwgMHg2ODBlYzBhNCwgMHgyN2ExOGRlZSwKLQkweDRmM2ZmZWEyLCAweGU4ODdhZDhjLCAweGI1OGNlMDA2LCAweDdhZjRkNmI2LAotCTB4YWFjZTFlN2MsIDB4ZDMzNzVmZWMsIDB4Y2U3OGEzOTksIDB4NDA2YjJhNDIsCi0JMHgyMGZlOWUzNSwgMHhkOWYzODViOSwgMHhlZTM5ZDdhYiwgMHgzYjEyNGU4YiwKLQkweDFkYzlmYWY3LCAweDRiNmQxODU2LCAweDI2YTM2NjMxLCAweGVhZTM5N2IyLAotCTB4M2E2ZWZhNzQsIDB4ZGQ1YjQzMzIsIDB4Njg0MWU3ZjcsIDB4Y2E3ODIwZmIsCi0JMHhmYjBhZjU0ZSwgMHhkOGZlYjM5NywgMHg0NTQwNTZhYywgMHhiYTQ4OTUyNywKLQkweDU1NTMzYTNhLCAweDIwODM4ZDg3LCAweGZlNmJhOWI3LCAweGQwOTY5NTRiLAotCTB4NTVhODY3YmMsIDB4YTExNTlhNTgsIDB4Y2NhOTI5NjMsIDB4OTllMWRiMzMsCi0JMHhhNjJhNGE1NiwgMHgzZjMxMjVmOSwgMHg1ZWY0N2UxYywgMHg5MDI5MzE3YywKLQkweGZkZjhlODAyLCAweDA0MjcyZjcwLCAweDgwYmIxNTVjLCAweDA1MjgyY2UzLAotCTB4OTVjMTE1NDgsIDB4ZTRjNjZkMjIsIDB4NDhjMTEzM2YsIDB4YzcwZjg2ZGMsCi0JMHgwN2Y5YzllZSwgMHg0MTA0MWYwZiwgMHg0MDQ3NzlhNCwgMHg1ZDg4NmUxNywKLQkweDMyNWY1MWViLCAweGQ1OWJjMGQxLCAweGYyYmNjMThmLCAweDQxMTEzNTY0LAotCTB4MjU3Yjc4MzQsIDB4NjAyYTljNjAsIDB4ZGZmOGU4YTMsIDB4MWY2MzZjMWIsCi0JMHgwZTEyYjRjMiwgMHgwMmUxMzI5ZSwgMHhhZjY2NGZkMSwgMHhjYWQxODExNSwKLQkweDZiMjM5NWUwLCAweDMzM2U5MmUxLCAweDNiMjQwYjYyLCAweGVlYmViOTIyLAotCTB4ODViMmEyMGUsIDB4ZTZiYTBkOTksIDB4ZGU3MjBjOGMsIDB4MmRhMmY3MjgsCi0JMHhkMDEyNzg0NSwgMHg5NWI3OTRmZCwgMHg2NDdkMDg2MiwgMHhlN2NjZjVmMCwKLQkweDU0NDlhMzZmLCAweDg3N2Q0OGZhLCAweGMzOWRmZDI3LCAweGYzM2U4ZDFlLAotCTB4MGE0NzYzNDEsIDB4OTkyZWZmNzQsIDB4M2E2ZjZlYWIsIDB4ZjRmOGZkMzcsCi0JMHhhODEyZGM2MCwgMHhhMWViZGRmOCwgMHg5OTFiZTE0YywgMHhkYjZlNmIwZCwKLQkweGM2N2I1NTEwLCAweDZkNjcyYzM3LCAweDI3NjVkNDNiLCAweGRjZDBlODA0LAotCTB4ZjEyOTBkYzcsIDB4Y2MwMGZmYTMsIDB4YjUzOTBmOTIsIDB4NjkwZmVkMGIsCi0JMHg2NjdiOWZmYiwgMHhjZWRiN2Q5YywgMHhhMDkxY2YwYiwgMHhkOTE1NWVhMywKLQkweGJiMTMyZjg4LCAweDUxNWJhZDI0LCAweDdiOTQ3OWJmLCAweDc2M2JkNmViLAotCTB4MzczOTJlYjMsIDB4Y2MxMTU5NzksIDB4ODAyNmUyOTcsIDB4ZjQyZTMxMmQsCi0JMHg2ODQyYWRhNywgMHhjNjZhMmIzYiwgMHgxMjc1NGNjYywgMHg3ODJlZjExYywKLQkweDZhMTI0MjM3LCAweGI3OTI1MWU3LCAweDA2YTFiYmU2LCAweDRiZmI2MzUwLAotCTB4MWE2YjEwMTgsIDB4MTFjYWVkZmEsIDB4M2QyNWJkZDgsIDB4ZTJlMWMzYzksCi0JMHg0NDQyMTY1OSwgMHgwYTEyMTM4NiwgMHhkOTBjZWM2ZSwgMHhkNWFiZWEyYSwKLQkweDY0YWY2NzRlLCAweGRhODZhODVmLCAweGJlYmZlOTg4LCAweDY0ZTRjM2ZlLAotCTB4OWRiYzgwNTcsIDB4ZjBmN2MwODYsIDB4NjA3ODdiZjgsIDB4NjAwMzYwNGQsCi0JMHhkMWZkODM0NiwgMHhmNjM4MWZiMCwgMHg3NzQ1YWUwNCwgMHhkNzM2ZmNjYywKLQkweDgzNDI2YjMzLCAweGYwMWVhYjcxLCAweGIwODA0MTg3LCAweDNjMDA1ZTVmLAotCTB4NzdhMDU3YmUsIDB4YmRlOGFlMjQsIDB4NTU0NjQyOTksIDB4YmY1ODJlNjEsCi0JMHg0ZTU4ZjQ4ZiwgMHhmMmRkZmRhMiwgMHhmNDc0ZWYzOCwgMHg4Nzg5YmRjMiwKLQkweDUzNjZmOWMzLCAweGM4YjM4ZTc0LCAweGI0NzVmMjU1LCAweDQ2ZmNkOWI5LAotCTB4N2FlYjI2NjEsIDB4OGIxZGRmODQsIDB4ODQ2YTBlNzksIDB4OTE1Zjk1ZTIsCi0JMHg0NjZlNTk4ZSwgMHgyMGI0NTc3MCwgMHg4Y2Q1NTU5MSwgMHhjOTAyZGU0YywKLQkweGI5MGJhY2UxLCAweGJiODIwNWQwLCAweDExYTg2MjQ4LCAweDc1NzRhOTllLAotCTB4Yjc3ZjE5YjYsIDB4ZTBhOWRjMDksIDB4NjYyZDA5YTEsIDB4YzQzMjQ2MzMsCi0JMHhlODVhMWYwMiwgMHgwOWYwYmU4YywgMHg0YTk5YTAyNSwgMHgxZDZlZmUxMCwKLQkweDFhYjkzZDFkLCAweDBiYTVhNGRmLCAweGExODZmMjBmLCAweDI4NjhmMTY5LAotCTB4ZGNiN2RhODMsIDB4NTczOTA2ZmUsIDB4YTFlMmNlOWIsIDB4NGZjZDdmNTIsCi0JMHg1MDExNWUwMSwgMHhhNzA2ODNmYSwgMHhhMDAyYjVjNCwgMHgwZGU2ZDAyNywKLQkweDlhZjg4YzI3LCAweDc3M2Y4NjQxLCAweGMzNjA0YzA2LCAweDYxYTgwNmI1LAotCTB4ZjAxNzdhMjgsIDB4YzBmNTg2ZTAsIDB4MDA2MDU4YWEsIDB4MzBkYzdkNjIsCi0JMHgxMWU2OWVkNywgMHgyMzM4ZWE2MywgMHg1M2MyZGQ5NCwgMHhjMmMyMTYzNCwKLQkweGJiY2JlZTU2LCAweDkwYmNiNmRlLCAweGViZmM3ZGExLCAweGNlNTkxZDc2LAotCTB4NmYwNWU0MDksIDB4NGI3YzAxODgsIDB4Mzk3MjBhM2QsIDB4N2M5MjdjMjQsCi0JMHg4NmUzNzI1ZiwgMHg3MjRkOWRiOSwgMHgxYWMxNWJiNCwgMHhkMzllYjhmYywKLQkweGVkNTQ1NTc4LCAweDA4ZmNhNWI1LCAweGQ4M2Q3Y2QzLCAweDRkYWQwZmM0LAotCTB4MWU1MGVmNWUsIDB4YjE2MWU2ZjgsIDB4YTI4NTE0ZDksIDB4NmM1MTEzM2MsCi0JMHg2ZmQ1YzdlNywgMHg1NmUxNGVjNCwgMHgzNjJhYmZjZSwgMHhkZGM2YzgzNywKLQkweGQ3OWEzMjM0LCAweDkyNjM4MjEyLCAweDY3MGVmYThlLCAweDQwNjAwMGUwLAotCTB4M2EzOWNlMzcsIDB4ZDNmYWY1Y2YsIDB4YWJjMjc3MzcsIDB4NWFjNTJkMWIsCi0JMHg1Y2IwNjc5ZSwgMHg0ZmEzMzc0MiwgMHhkMzgyMjc0MCwgMHg5OWJjOWJiZSwKLQkweGQ1MTE4ZTlkLCAweGJmMGY3MzE1LCAweGQ2MmQxYzdlLCAweGM3MDBjNDdiLAotCTB4Yjc4YzFiNmIsIDB4MjFhMTkwNDUsIDB4YjI2ZWIxYmUsIDB4NmEzNjZlYjQsCi0JMHg1NzQ4YWIyZiwgMHhiYzk0NmU3OSwgMHhjNmEzNzZkMiwgMHg2NTQ5YzJjOCwKLQkweDUzMGZmOGVlLCAweDQ2OGRkZTdkLCAweGQ1NzMwYTFkLCAweDRjZDA0ZGM2LAotCTB4MjkzOWJiZGIsIDB4YTliYTQ2NTAsIDB4YWM5NTI2ZTgsIDB4YmU1ZWUzMDQsCi0JMHhhMWZhZDVmMCwgMHg2YTJkNTE5YSwgMHg2M2VmOGNlMiwgMHg5YTg2ZWUyMiwKLQkweGMwODljMmI4LCAweDQzMjQyZWY2LCAweGE1MWUwM2FhLCAweDljZjJkMGE0LAotCTB4ODNjMDYxYmEsIDB4OWJlOTZhNGQsIDB4OGZlNTE1NTAsIDB4YmE2NDViZDYsCi0JMHgyODI2YTJmOSwgMHhhNzNhM2FlMSwgMHg0YmE5OTU4NiwgMHhlZjU1NjJlOSwKLQkweGM3MmZlZmQzLCAweGY3NTJmN2RhLCAweDNmMDQ2ZjY5LCAweDc3ZmEwYTU5LAotCTB4ODBlNGE5MTUsIDB4ODdiMDg2MDEsIDB4OWIwOWU2YWQsIDB4M2IzZWU1OTMsCi0JMHhlOTkwZmQ1YSwgMHg5ZTM0ZDc5NywgMHgyY2YwYjdkOSwgMHgwMjJiOGI1MSwKLQkweDk2ZDVhYzNhLCAweDAxN2RhNjdkLCAweGQxY2YzZWQ2LCAweDdjN2QyZDI4LAotCTB4MWY5ZjI1Y2YsIDB4YWRmMmI4OWIsIDB4NWFkNmI0NzIsIDB4NWE4OGY1NGMsCi0JMHhlMDI5YWM3MSwgMHhlMDE5YTVlNiwgMHg0N2IwYWNmZCwgMHhlZDkzZmE5YiwKLQkweGU4ZDNjNDhkLCAweDI4M2I1N2NjLCAweGY4ZDU2NjI5LCAweDc5MTMyZTI4LAotCTB4Nzg1ZjAxOTEsIDB4ZWQ3NTYwNTUsIDB4Zjc5NjBlNDQsIDB4ZTNkMzVlOGMsCi0JMHgxNTA1NmRkNCwgMHg4OGY0NmRiYSwgMHgwM2ExNjEyNSwgMHgwNTY0ZjBiZCwKLQkweGMzZWI5ZTE1LCAweDNjOTA1N2EyLCAweDk3MjcxYWVjLCAweGE5M2EwNzJhLAotCTB4MWIzZjZkOWIsIDB4MWU2MzIxZjUsIDB4ZjU5YzY2ZmIsIDB4MjZkY2YzMTksCi0JMHg3NTMzZDkyOCwgMHhiMTU1ZmRmNSwgMHgwMzU2MzQ4MiwgMHg4YWJhM2NiYiwKLQkweDI4NTE3NzExLCAweGMyMGFkOWY4LCAweGFiY2M1MTY3LCAweGNjYWQ5MjVmLAotCTB4NGRlODE3NTEsIDB4MzgzMGRjOGUsIDB4Mzc5ZDU4NjIsIDB4OTMyMGY5OTEsCi0JMHhlYTdhOTBjMiwgMHhmYjNlN2JjZSwgMHg1MTIxY2U2NCwgMHg3NzRmYmUzMiwKLQkweGE4YjZlMzdlLCAweGMzMjkzZDQ2LCAweDQ4ZGU1MzY5LCAweDY0MTNlNjgwLAotCTB4YTJhZTA4MTAsIDB4ZGQ2ZGIyMjQsIDB4Njk4NTJkZmQsIDB4MDkwNzIxNjYsCi0JMHhiMzlhNDYwYSwgMHg2NDQ1YzBkZCwgMHg1ODZjZGVjZiwgMHgxYzIwYzhhZSwKLQkweDViYmVmN2RkLCAweDFiNTg4ZDQwLCAweGNjZDIwMTdmLCAweDZiYjRlM2JiLAotCTB4ZGRhMjZhN2UsIDB4M2E1OWZmNDUsIDB4M2UzNTBhNDQsIDB4YmNiNGNkZDUsCi0JMHg3MmVhY2VhOCwgMHhmYTY0ODRiYiwgMHg4ZDY2MTJhZSwgMHhiZjNjNmY0NywKLQkweGQyOWJlNDYzLCAweDU0MmY1ZDllLCAweGFlYzI3NzFiLCAweGY2NGU2MzcwLAotCTB4NzQwZTBkOGQsIDB4ZTc1YjEzNTcsIDB4Zjg3MjE2NzEsIDB4YWY1MzdkNWQsCi0JMHg0MDQwY2IwOCwgMHg0ZWI0ZTJjYywgMHgzNGQyNDY2YSwgMHgwMTE1YWY4NCwKLQkweGUxYjAwNDI4LCAweDk1OTgzYTFkLCAweDA2Yjg5ZmI0LCAweGNlNmVhMDQ4LAotCTB4NmYzZjNiODIsIDB4MzUyMGFiODIsIDB4MDExYTFkNGIsIDB4Mjc3MjI3ZjgsCi0JMHg2MTE1NjBiMSwgMHhlNzkzM2ZkYywgMHhiYjNhNzkyYiwgMHgzNDQ1MjViZCwKLQkweGEwODgzOWUxLCAweDUxY2U3OTRiLCAweDJmMzJjOWI3LCAweGEwMWZiYWM5LAotCTB4ZTAxY2M4N2UsIDB4YmNjN2QxZjYsIDB4Y2YwMTExYzMsIDB4YTFlOGFhYzcsCi0JMHgxYTkwODc0OSwgMHhkNDRmYmQ5YSwgMHhkMGRhZGVjYiwgMHhkNTBhZGEzOCwKLQkweDAzMzljMzJhLCAweGM2OTEzNjY3LCAweDhkZjkzMTdjLCAweGUwYjEyYjRmLAotCTB4Zjc5ZTU5YjcsIDB4NDNmNWJiM2EsIDB4ZjJkNTE5ZmYsIDB4MjdkOTQ1OWMsCi0JMHhiZjk3MjIyYywgMHgxNWU2ZmMyYSwgMHgwZjkxZmM3MSwgMHg5Yjk0MTUyNSwKLQkweGZhZTU5MzYxLCAweGNlYjY5Y2ViLCAweGMyYTg2NDU5LCAweDEyYmFhOGQxLAotCTB4YjZjMTA3NWUsIDB4ZTMwNTZhMGMsIDB4MTBkMjUwNjUsIDB4Y2IwM2E0NDIsCi0JMHhlMGVjNmUwZSwgMHgxNjk4ZGIzYiwgMHg0Yzk4YTBiZSwgMHgzMjc4ZTk2NCwKLQkweDlmMWY5NTMyLCAweGUwZDM5MmRmLCAweGQzYTAzNDJiLCAweDg5NzFmMjFlLAotCTB4MWIwYTc0NDEsIDB4NGJhMzM0OGMsIDB4YzViZTcxMjAsIDB4YzM3NjMyZDgsCi0JMHhkZjM1OWY4ZCwgMHg5Yjk5MmYyZSwgMHhlNjBiNmY0NywgMHgwZmUzZjExZCwKLQkweGU1NGNkYTU0LCAweDFlZGFkODkxLCAweGNlNjI3OWNmLCAweGNkM2U3ZTZmLAotCTB4MTYxOGIxNjYsIDB4ZmQyYzFkMDUsIDB4ODQ4ZmQyYzUsIDB4ZjZmYjIyOTksCi0JMHhmNTIzZjM1NywgMHhhNjMyNzYyMywgMHg5M2E4MzUzMSwgMHg1NmNjY2QwMiwKLQkweGFjZjA4MTYyLCAweDVhNzVlYmI1LCAweDZlMTYzNjk3LCAweDg4ZDI3M2NjLAotCTB4ZGU5NjYyOTIsIDB4ODFiOTQ5ZDAsIDB4NGM1MDkwMWIsIDB4NzFjNjU2MTQsCi0JMHhlNmM2YzdiZCwgMHgzMjdhMTQwYSwgMHg0NWUxZDAwNiwgMHhjM2YyN2I5YSwKLQkweGM5YWE1M2ZkLCAweDYyYTgwZjAwLCAweGJiMjViZmUyLCAweDM1YmRkMmY2LAotCTB4NzExMjY5MDUsIDB4YjIwNDAyMjIsIDB4YjZjYmNmN2MsIDB4Y2Q3NjljMmIsCi0JMHg1MzExM2VjMCwgMHgxNjQwZTNkMywgMHgzOGFiYmQ2MCwgMHgyNTQ3YWRmMCwKLQkweGJhMzgyMDljLCAweGY3NDZjZTc2LCAweDc3YWZhMWM1LCAweDIwNzU2MDYwLAotCTB4ODVjYmZlNGUsIDB4OGFlODhkZDgsIDB4N2FhYWY5YjAsIDB4NGNmOWFhN2UsCi0JMHgxOTQ4YzI1YywgMHgwMmZiOGE4YywgMHgwMWMzNmFlNCwgMHhkNmViZTFmOSwKLQkweDkwZDRmODY5LCAweGE2NWNkZWEwLCAweDNmMDkyNTJkLCAweGMyMDhlNjlmLAotCTB4Yjc0ZTYxMzIsIDB4Y2U3N2UyNWIsIDB4NTc4ZmRmZTMsIDB4M2FjMzcyZTYsCi19OwotCi0vKgotICogUm91bmQgbG9vcCB1bnJvbGxpbmcgbWFjcm9zLCBTIGlzIGEgcG9pbnRlciB0byBhIFMtQm94IGFycmF5Ci0gKiBvcmdhbml6ZWQgaW4gNCB1bnNpZ25lZCBsb25ncyBhdCBhIHJvdy4KLSAqLwotI2RlZmluZSBHRVQzMl8zKHgpICgoKHgpICYgMHhmZikpCi0jZGVmaW5lIEdFVDMyXzIoeCkgKCgoeCkgPj4gKDgpKSAmICgweGZmKSkKLSNkZWZpbmUgR0VUMzJfMSh4KSAoKCh4KSA+PiAoMTYpKSAmICgweGZmKSkKLSNkZWZpbmUgR0VUMzJfMCh4KSAoKCh4KSA+PiAoMjQpKSAmICgweGZmKSkKLQotI2RlZmluZSBiZl9GKHgpICgoKFNbR0VUMzJfMCh4KV0gKyBTWzI1NiArIEdFVDMyXzEoeCldKSBeIFwKLSAgICAgICAgICBTWzUxMiArIEdFVDMyXzIoeCldKSArIFNbNzY4ICsgR0VUMzJfMyh4KV0pCi0KLSNkZWZpbmUgUk9VTkQoYSwgYiwgbikgIGIgXj0gUFtuXTsgYSBePSBiZl9GIChiKQotCi0vKgotICogVGhlIGJsb3dmaXNoIGVuY2lwaGVyLCBwcm9jZXNzZXMgNjQtYml0IGJsb2Nrcy4KLSAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gTVVTVE4nVCByZXNwZWN0IGVuZGlhbmVzcwotICovCi1zdGF0aWMgdm9pZCBlbmNyeXB0X2Jsb2NrKHN0cnVjdCBiZl9jdHggKmJjdHgsIHUzMiAqZHN0LCB1MzIgKnNyYykKLXsKLQljb25zdCB1MzIgKlAgPSBiY3R4LT5wOwotCWNvbnN0IHUzMiAqUyA9IGJjdHgtPnM7Ci0JdTMyIHlsID0gc3JjWzBdOwotCXUzMiB5ciA9IHNyY1sxXTsKLQotCVJPVU5EKHlyLCB5bCwgMCk7Ci0JUk9VTkQoeWwsIHlyLCAxKTsKLQlST1VORCh5ciwgeWwsIDIpOwotCVJPVU5EKHlsLCB5ciwgMyk7Ci0JUk9VTkQoeXIsIHlsLCA0KTsKLQlST1VORCh5bCwgeXIsIDUpOwotCVJPVU5EKHlyLCB5bCwgNik7Ci0JUk9VTkQoeWwsIHlyLCA3KTsKLQlST1VORCh5ciwgeWwsIDgpOwotCVJPVU5EKHlsLCB5ciwgOSk7Ci0JUk9VTkQoeXIsIHlsLCAxMCk7Ci0JUk9VTkQoeWwsIHlyLCAxMSk7Ci0JUk9VTkQoeXIsIHlsLCAxMik7Ci0JUk9VTkQoeWwsIHlyLCAxMyk7Ci0JUk9VTkQoeXIsIHlsLCAxNCk7Ci0JUk9VTkQoeWwsIHlyLCAxNSk7Ci0KLQl5bCBePSBQWzE2XTsKLQl5ciBePSBQWzE3XTsKLQotCWRzdFswXSA9IHlyOwotCWRzdFsxXSA9IHlsOwotfQotCi1zdGF0aWMgdm9pZCBiZl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCi17Ci0JY29uc3QgX19iZTMyICppbl9ibGsgPSAoY29uc3QgX19iZTMyICopc3JjOwotCV9fYmUzMiAqY29uc3Qgb3V0X2JsayA9IChfX2JlMzIgKilkc3Q7Ci0JdTMyIGluMzJbMl0sIG91dDMyWzJdOwotCi0JaW4zMlswXSA9IGJlMzJfdG9fY3B1KGluX2Jsa1swXSk7Ci0JaW4zMlsxXSA9IGJlMzJfdG9fY3B1KGluX2Jsa1sxXSk7Ci0JZW5jcnlwdF9ibG9jayhjcnlwdG9fdGZtX2N0eCh0Zm0pLCBvdXQzMiwgaW4zMik7Ci0Jb3V0X2Jsa1swXSA9IGNwdV90b19iZTMyKG91dDMyWzBdKTsKLQlvdXRfYmxrWzFdID0gY3B1X3RvX2JlMzIob3V0MzJbMV0pOwotfQotCi1zdGF0aWMgdm9pZCBiZl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCi17Ci0Jc3RydWN0IGJmX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKLQljb25zdCBfX2JlMzIgKmluX2JsayA9IChjb25zdCBfX2JlMzIgKilzcmM7Ci0JX19iZTMyICpjb25zdCBvdXRfYmxrID0gKF9fYmUzMiAqKWRzdDsKLQljb25zdCB1MzIgKlAgPSBjdHgtPnA7Ci0JY29uc3QgdTMyICpTID0gY3R4LT5zOwotCXUzMiB5bCA9IGJlMzJfdG9fY3B1KGluX2Jsa1swXSk7Ci0JdTMyIHlyID0gYmUzMl90b19jcHUoaW5fYmxrWzFdKTsKLQotCVJPVU5EKHlyLCB5bCwgMTcpOwotCVJPVU5EKHlsLCB5ciwgMTYpOwotCVJPVU5EKHlyLCB5bCwgMTUpOwotCVJPVU5EKHlsLCB5ciwgMTQpOwotCVJPVU5EKHlyLCB5bCwgMTMpOwotCVJPVU5EKHlsLCB5ciwgMTIpOwotCVJPVU5EKHlyLCB5bCwgMTEpOwotCVJPVU5EKHlsLCB5ciwgMTApOwotCVJPVU5EKHlyLCB5bCwgOSk7Ci0JUk9VTkQoeWwsIHlyLCA4KTsKLQlST1VORCh5ciwgeWwsIDcpOwotCVJPVU5EKHlsLCB5ciwgNik7Ci0JUk9VTkQoeXIsIHlsLCA1KTsKLQlST1VORCh5bCwgeXIsIDQpOwotCVJPVU5EKHlyLCB5bCwgMyk7Ci0JUk9VTkQoeWwsIHlyLCAyKTsKLQotCXlsIF49IFBbMV07Ci0JeXIgXj0gUFswXTsKLQotCW91dF9ibGtbMF0gPSBjcHVfdG9fYmUzMih5cik7Ci0Jb3V0X2Jsa1sxXSA9IGNwdV90b19iZTMyKHlsKTsKLX0KLQotLyoKLSAqIENhbGN1bGF0ZXMgdGhlIGJsb3dmaXNoIFMgYW5kIFAgYm94ZXMgZm9yIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24uCi0gKi8KLXN0YXRpYyBpbnQgYmZfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCi17Ci0Jc3RydWN0IGJmX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKLQl1MzIgKlAgPSBjdHgtPnA7Ci0JdTMyICpTID0gY3R4LT5zOwotCXNob3J0IGksIGosIGNvdW50OwotCXUzMiBkYXRhWzJdLCB0ZW1wOwotCi0JLyogQ29weSB0aGUgaW5pdGlhbGl6YXRpb24gcy1ib3hlcyAqLwotCWZvciAoaSA9IDAsIGNvdW50ID0gMDsgaSA8IDI1NjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrLCBjb3VudCsrKQotCQkJU1tjb3VudF0gPSBiZl9zYm94W2NvdW50XTsKLQotCS8qIFNldCB0aGUgcC1ib3hlcyAqLwotCWZvciAoaSA9IDA7IGkgPCAxNiArIDI7IGkrKykKLQkJUFtpXSA9IGJmX3Bib3hbaV07Ci0KLQkvKiBBY3R1YWwgc3Via2V5IGdlbmVyYXRpb24gKi8KLQlmb3IgKGogPSAwLCBpID0gMDsgaSA8IDE2ICsgMjsgaSsrKSB7Ci0JCXRlbXAgPSAoKCh1MzIpa2V5W2pdIDw8IDI0KSB8Ci0JCQkoKHUzMilrZXlbKGogKyAxKSAlIGtleWxlbl0gPDwgMTYpIHwKLQkJCSgodTMyKWtleVsoaiArIDIpICUga2V5bGVuXSA8PCA4KSB8Ci0JCQkoKHUzMilrZXlbKGogKyAzKSAlIGtleWxlbl0pKTsKLQotCQlQW2ldID0gUFtpXSBeIHRlbXA7Ci0JCWogPSAoaiArIDQpICUga2V5bGVuOwotCX0KLQotCWRhdGFbMF0gPSAweDAwMDAwMDAwOwotCWRhdGFbMV0gPSAweDAwMDAwMDAwOwotCi0JZm9yIChpID0gMDsgaSA8IDE2ICsgMjsgaSArPSAyKSB7Ci0JCWVuY3J5cHRfYmxvY2soKHN0cnVjdCBiZl9jdHggKiljdHgsIGRhdGEsIGRhdGEpOwotCi0JCVBbaV0gPSBkYXRhWzBdOwotCQlQW2kgKyAxXSA9IGRhdGFbMV07Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlmb3IgKGogPSAwLCBjb3VudCA9IGkgKiAyNTY7IGogPCAyNTY7IGogKz0gMiwgY291bnQgKz0gMikgewotCQkJZW5jcnlwdF9ibG9jaygoc3RydWN0IGJmX2N0eCAqKWN0eCwgZGF0YSwgZGF0YSk7Ci0KLQkJCVNbY291bnRdID0gZGF0YVswXTsKLQkJCVNbY291bnQgKyAxXSA9IGRhdGFbMV07Ci0JCX0KLQl9Ci0KLQkvKiBCcnVjZSBzYXlzIG5vdCB0byBib3RoZXIgd2l0aCB0aGUgd2VhayBrZXkgY2hlY2suICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhbGcgPSB7Ci0JLmNyYV9uYW1lCQk9CSJibG93ZmlzaCIsCi0JLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAotCS5jcmFfYmxvY2tzaXplCQk9CUJGX0JMT0NLX1NJWkUsCi0JLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYmZfY3R4KSwKLQkuY3JhX2FsaWdubWFzawkJPQkzLAotCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAotCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChhbGcuY3JhX2xpc3QpLAotCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0gewotCS5jaWFfbWluX2tleXNpemUJPQlCRl9NSU5fS0VZX1NJWkUsCi0JLmNpYV9tYXhfa2V5c2l6ZQk9CUJGX01BWF9LRVlfU0laRSwKLQkuY2lhX3NldGtleSAgIAkJPSAJYmZfc2V0a2V5LAotCS5jaWFfZW5jcnlwdCAJCT0JYmZfZW5jcnlwdCwKLQkuY2lhX2RlY3J5cHQgIAkJPQliZl9kZWNyeXB0IH0gfQotfTsKLQotc3RhdGljIGludCBfX2luaXQgYmxvd2Zpc2hfbW9kX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYWxnKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGJsb3dmaXNoX21vZF9maW5pKHZvaWQpCi17Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhbGcpOwotfQotCi1tb2R1bGVfaW5pdChibG93ZmlzaF9tb2RfaW5pdCk7Ci1tb2R1bGVfZXhpdChibG93ZmlzaF9tb2RfZmluaSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQmxvd2Zpc2ggQ2lwaGVyIEFsZ29yaXRobSIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jsb3dmaXNoX2NvbW1vbi5jIGIvY3J5cHRvL2Jsb3dmaXNoX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzZhYWIwCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2Jsb3dmaXNoX2NvbW1vbi5jCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ29tbW9uIEJsb3dmaXNoIGFsZ29yaXRobSBwYXJ0cyBzaGFyZWQgYmV0d2VlbiB0aGUgYyBhbmQgYXNzZW1ibGVyCisgKiBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogQmxvd2Zpc2ggQ2lwaGVyIEFsZ29yaXRobSwgYnkgQnJ1Y2UgU2NobmVpZXIuCisgKiBodHRwOi8vd3d3LmNvdW50ZXJwYW5lLmNvbS9ibG93ZmlzaC5odG1sCisgKgorICogQWRhcHRlZCBmcm9tIEtlcm5lbGkgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAaHZybGFiLm9yZz4KKyAqIENvcHlyaWdodCAoYykgS3lsZSBNY01hcnRpbiA8a3lsZUBkZWJpYW4ub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Jsb3dmaXNoLmg+CisKK3N0YXRpYyBjb25zdCB1MzIgYmZfcGJveFsxNiArIDJdID0geworCTB4MjQzZjZhODgsIDB4ODVhMzA4ZDMsIDB4MTMxOThhMmUsIDB4MDM3MDczNDQsCisJMHhhNDA5MzgyMiwgMHgyOTlmMzFkMCwgMHgwODJlZmE5OCwgMHhlYzRlNmM4OSwKKwkweDQ1MjgyMWU2LCAweDM4ZDAxMzc3LCAweGJlNTQ2NmNmLCAweDM0ZTkwYzZjLAorCTB4YzBhYzI5YjcsIDB4Yzk3YzUwZGQsIDB4M2Y4NGQ1YjUsIDB4YjU0NzA5MTcsCisJMHg5MjE2ZDVkOSwgMHg4OTc5ZmIxYiwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYmZfc2JveFsyNTYgKiA0XSA9IHsKKwkweGQxMzEwYmE2LCAweDk4ZGZiNWFjLCAweDJmZmQ3MmRiLCAweGQwMWFkZmI3LAorCTB4YjhlMWFmZWQsIDB4NmEyNjdlOTYsIDB4YmE3YzkwNDUsIDB4ZjEyYzdmOTksCisJMHgyNGExOTk0NywgMHhiMzkxNmNmNywgMHgwODAxZjJlMiwgMHg4NThlZmMxNiwKKwkweDYzNjkyMGQ4LCAweDcxNTc0ZTY5LCAweGE0NThmZWEzLCAweGY0OTMzZDdlLAorCTB4MGQ5NTc0OGYsIDB4NzI4ZWI2NTgsIDB4NzE4YmNkNTgsIDB4ODIxNTRhZWUsCisJMHg3YjU0YTQxZCwgMHhjMjVhNTliNSwgMHg5YzMwZDUzOSwgMHgyYWYyNjAxMywKKwkweGM1ZDFiMDIzLCAweDI4NjA4NWYwLCAweGNhNDE3OTE4LCAweGI4ZGIzOGVmLAorCTB4OGU3OWRjYjAsIDB4NjAzYTE4MGUsIDB4NmM5ZTBlOGIsIDB4YjAxZThhM2UsCisJMHhkNzE1NzdjMSwgMHhiZDMxNGIyNywgMHg3OGFmMmZkYSwgMHg1NTYwNWM2MCwKKwkweGU2NTUyNWYzLCAweGFhNTVhYjk0LCAweDU3NDg5ODYyLCAweDYzZTgxNDQwLAorCTB4NTVjYTM5NmEsIDB4MmFhYjEwYjYsIDB4YjRjYzVjMzQsIDB4MTE0MWU4Y2UsCisJMHhhMTU0ODZhZiwgMHg3YzcyZTk5MywgMHhiM2VlMTQxMSwgMHg2MzZmYmMyYSwKKwkweDJiYTljNTVkLCAweDc0MTgzMWY2LCAweGNlNWMzZTE2LCAweDliODc5MzFlLAorCTB4YWZkNmJhMzMsIDB4NmMyNGNmNWMsIDB4N2EzMjUzODEsIDB4Mjg5NTg2NzcsCisJMHgzYjhmNDg5OCwgMHg2YjRiYjlhZiwgMHhjNGJmZTgxYiwgMHg2NjI4MjE5MywKKwkweDYxZDgwOWNjLCAweGZiMjFhOTkxLCAweDQ4N2NhYzYwLCAweDVkZWM4MDMyLAorCTB4ZWY4NDVkNWQsIDB4ZTk4NTc1YjEsIDB4ZGMyNjIzMDIsIDB4ZWI2NTFiODgsCisJMHgyMzg5M2U4MSwgMHhkMzk2YWNjNSwgMHgwZjZkNmZmMywgMHg4M2Y0NDIzOSwKKwkweDJlMGI0NDgyLCAweGE0ODQyMDA0LCAweDY5YzhmMDRhLCAweDllMWY5YjVlLAorCTB4MjFjNjY4NDIsIDB4ZjZlOTZjOWEsIDB4NjcwYzljNjEsIDB4YWJkMzg4ZjAsCisJMHg2YTUxYTBkMiwgMHhkODU0MmY2OCwgMHg5NjBmYTcyOCwgMHhhYjUxMzNhMywKKwkweDZlZWYwYjZjLCAweDEzN2EzYmU0LCAweGJhM2JmMDUwLCAweDdlZmIyYTk4LAorCTB4YTFmMTY1MWQsIDB4MzlhZjAxNzYsIDB4NjZjYTU5M2UsIDB4ODI0MzBlODgsCisJMHg4Y2VlODYxOSwgMHg0NTZmOWZiNCwgMHg3ZDg0YTVjMywgMHgzYjhiNWViZSwKKwkweGUwNmY3NWQ4LCAweDg1YzEyMDczLCAweDQwMWE0NDlmLCAweDU2YzE2YWE2LAorCTB4NGVkM2FhNjIsIDB4MzYzZjc3MDYsIDB4MWJmZWRmNzIsIDB4NDI5YjAyM2QsCisJMHgzN2QwZDcyNCwgMHhkMDBhMTI0OCwgMHhkYjBmZWFkMywgMHg0OWYxYzA5YiwKKwkweDA3NTM3MmM5LCAweDgwOTkxYjdiLCAweDI1ZDQ3OWQ4LCAweGY2ZThkZWY3LAorCTB4ZTNmZTUwMWEsIDB4YjY3OTRjM2IsIDB4OTc2Y2UwYmQsIDB4MDRjMDA2YmEsCisJMHhjMWE5NGZiNiwgMHg0MDlmNjBjNCwgMHg1ZTVjOWVjMiwgMHgxOTZhMjQ2MywKKwkweDY4ZmI2ZmFmLCAweDNlNmM1M2I1LCAweDEzMzliMmViLCAweDNiNTJlYzZmLAorCTB4NmRmYzUxMWYsIDB4OWIzMDk1MmMsIDB4Y2M4MTQ1NDQsIDB4YWY1ZWJkMDksCisJMHhiZWUzZDAwNCwgMHhkZTMzNGFmZCwgMHg2NjBmMjgwNywgMHgxOTJlNGJiMywKKwkweGMwY2JhODU3LCAweDQ1Yzg3NDBmLCAweGQyMGI1ZjM5LCAweGI5ZDNmYmRiLAorCTB4NTU3OWMwYmQsIDB4MWE2MDMyMGEsIDB4ZDZhMTAwYzYsIDB4NDAyYzcyNzksCisJMHg2NzlmMjVmZSwgMHhmYjFmYTNjYywgMHg4ZWE1ZTlmOCwgMHhkYjMyMjJmOCwKKwkweDNjNzUxNmRmLCAweGZkNjE2YjE1LCAweDJmNTAxZWM4LCAweGFkMDU1MmFiLAorCTB4MzIzZGI1ZmEsIDB4ZmQyMzg3NjAsIDB4NTMzMTdiNDgsIDB4M2UwMGRmODIsCisJMHg5ZTVjNTdiYiwgMHhjYTZmOGNhMCwgMHgxYTg3NTYyZSwgMHhkZjE3NjlkYiwKKwkweGQ1NDJhOGY2LCAweDI4N2VmZmMzLCAweGFjNjczMmM2LCAweDhjNGY1NTczLAorCTB4Njk1YjI3YjAsIDB4YmJjYTU4YzgsIDB4ZTFmZmEzNWQsIDB4YjhmMDExYTAsCisJMHgxMGZhM2Q5OCwgMHhmZDIxODNiOCwgMHg0YWZjYjU2YywgMHgyZGQxZDM1YiwKKwkweDlhNTNlNDc5LCAweGI2Zjg0NTY1LCAweGQyOGU0OWJjLCAweDRiZmI5NzkwLAorCTB4ZTFkZGYyZGEsIDB4YTRjYjdlMzMsIDB4NjJmYjEzNDEsIDB4Y2VlNGM2ZTgsCisJMHhlZjIwY2FkYSwgMHgzNjc3NGMwMSwgMHhkMDdlOWVmZSwgMHgyYmYxMWZiNCwKKwkweDk1ZGJkYTRkLCAweGFlOTA5MTk4LCAweGVhYWQ4ZTcxLCAweDZiOTNkNWEwLAorCTB4ZDA4ZWQxZDAsIDB4YWZjNzI1ZTAsIDB4OGUzYzViMmYsIDB4OGU3NTk0YjcsCisJMHg4ZmY2ZTJmYiwgMHhmMjEyMmI2NCwgMHg4ODg4YjgxMiwgMHg5MDBkZjAxYywKKwkweDRmYWQ1ZWEwLCAweDY4OGZjMzFjLCAweGQxY2ZmMTkxLCAweGIzYThjMWFkLAorCTB4MmYyZjIyMTgsIDB4YmUwZTE3NzcsIDB4ZWE3NTJkZmUsIDB4OGIwMjFmYTEsCisJMHhlNWEwY2MwZiwgMHhiNTZmNzRlOCwgMHgxOGFjZjNkNiwgMHhjZTg5ZTI5OSwKKwkweGI0YTg0ZmUwLCAweGZkMTNlMGI3LCAweDdjYzQzYjgxLCAweGQyYWRhOGQ5LAorCTB4MTY1ZmEyNjYsIDB4ODA5NTc3MDUsIDB4OTNjYzczMTQsIDB4MjExYTE0NzcsCisJMHhlNmFkMjA2NSwgMHg3N2I1ZmE4NiwgMHhjNzU0NDJmNSwgMHhmYjlkMzVjZiwKKwkweGViY2RhZjBjLCAweDdiM2U4OWEwLCAweGQ2NDExYmQzLCAweGFlMWU3ZTQ5LAorCTB4MDAyNTBlMmQsIDB4MjA3MWIzNWUsIDB4MjI2ODAwYmIsIDB4NTdiOGUwYWYsCisJMHgyNDY0MzY5YiwgMHhmMDA5YjkxZSwgMHg1NTYzOTExZCwgMHg1OWRmYTZhYSwKKwkweDc4YzE0Mzg5LCAweGQ5NWE1MzdmLCAweDIwN2Q1YmEyLCAweDAyZTViOWM1LAorCTB4ODMyNjAzNzYsIDB4NjI5NWNmYTksIDB4MTFjODE5NjgsIDB4NGU3MzRhNDEsCisJMHhiMzQ3MmRjYSwgMHg3YjE0YTk0YSwgMHgxYjUxMDA1MiwgMHg5YTUzMjkxNSwKKwkweGQ2MGY1NzNmLCAweGJjOWJjNmU0LCAweDJiNjBhNDc2LCAweDgxZTY3NDAwLAorCTB4MDhiYTZmYjUsIDB4NTcxYmU5MWYsIDB4ZjI5NmVjNmIsIDB4MmEwZGQ5MTUsCisJMHhiNjYzNjUyMSwgMHhlN2I5ZjliNiwgMHhmZjM0MDUyZSwgMHhjNTg1NTY2NCwKKwkweDUzYjAyZDVkLCAweGE5OWY4ZmExLCAweDA4YmE0Nzk5LCAweDZlODUwNzZhLAorCTB4NGI3YTcwZTksIDB4YjViMzI5NDQsIDB4ZGI3NTA5MmUsIDB4YzQxOTI2MjMsCisJMHhhZDZlYTZiMCwgMHg0OWE3ZGY3ZCwgMHg5Y2VlNjBiOCwgMHg4ZmVkYjI2NiwKKwkweGVjYWE4YzcxLCAweDY5OWExN2ZmLCAweDU2NjQ1MjZjLCAweGMyYjE5ZWUxLAorCTB4MTkzNjAyYTUsIDB4NzUwOTRjMjksIDB4YTA1OTEzNDAsIDB4ZTQxODNhM2UsCisJMHgzZjU0OTg5YSwgMHg1YjQyOWQ2NSwgMHg2YjhmZTRkNiwgMHg5OWY3M2ZkNiwKKwkweGExZDI5YzA3LCAweGVmZTgzMGY1LCAweDRkMmQzOGU2LCAweGYwMjU1ZGMxLAorCTB4NGNkZDIwODYsIDB4ODQ3MGViMjYsIDB4NjM4MmU5YzYsIDB4MDIxZWNjNWUsCisJMHgwOTY4NmIzZiwgMHgzZWJhZWZjOSwgMHgzYzk3MTgxNCwgMHg2YjZhNzBhMSwKKwkweDY4N2YzNTg0LCAweDUyYTBlMjg2LCAweGI3OWM1MzA1LCAweGFhNTAwNzM3LAorCTB4M2UwNzg0MWMsIDB4N2ZkZWFlNWMsIDB4OGU3ZDQ0ZWMsIDB4NTcxNmYyYjgsCisJMHhiMDNhZGEzNywgMHhmMDUwMGMwZCwgMHhmMDFjMWYwNCwgMHgwMjAwYjNmZiwKKwkweGFlMGNmNTFhLCAweDNjYjU3NGIyLCAweDI1ODM3YTU4LCAweGRjMDkyMWJkLAorCTB4ZDE5MTEzZjksIDB4N2NhOTJmZjYsIDB4OTQzMjQ3NzMsIDB4MjJmNTQ3MDEsCisJMHgzYWU1ZTU4MSwgMHgzN2MyZGFkYywgMHhjOGI1NzYzNCwgMHg5YWYzZGRhNywKKwkweGE5NDQ2MTQ2LCAweDBmZDAwMzBlLCAweGVjYzhjNzNlLCAweGE0NzUxZTQxLAorCTB4ZTIzOGNkOTksIDB4M2JlYTBlMmYsIDB4MzI4MGJiYTEsIDB4MTgzZWIzMzEsCisJMHg0ZTU0OGIzOCwgMHg0ZjZkYjkwOCwgMHg2ZjQyMGQwMywgMHhmNjBhMDRiZiwKKwkweDJjYjgxMjkwLCAweDI0OTc3Yzc5LCAweDU2NzliMDcyLCAweGJjYWY4OWFmLAorCTB4ZGU5YTc3MWYsIDB4ZDk5MzA4MTAsIDB4YjM4YmFlMTIsIDB4ZGNjZjNmMmUsCisJMHg1NTEyNzIxZiwgMHgyZTZiNzEyNCwgMHg1MDFhZGRlNiwgMHg5Zjg0Y2Q4NywKKwkweDdhNTg0NzE4LCAweDc0MDhkYTE3LCAweGJjOWY5YWJjLCAweGU5NGI3ZDhjLAorCTB4ZWM3YWVjM2EsIDB4ZGI4NTFkZmEsIDB4NjMwOTQzNjYsIDB4YzQ2NGMzZDIsCisJMHhlZjFjMTg0NywgMHgzMjE1ZDkwOCwgMHhkZDQzM2IzNywgMHgyNGMyYmExNiwKKwkweDEyYTE0ZDQzLCAweDJhNjVjNDUxLCAweDUwOTQwMDAyLCAweDEzM2FlNGRkLAorCTB4NzFkZmY4OWUsIDB4MTAzMTRlNTUsIDB4ODFhYzc3ZDYsIDB4NWYxMTE5OWIsCisJMHgwNDM1NTZmMSwgMHhkN2EzYzc2YiwgMHgzYzExMTgzYiwgMHg1OTI0YTUwOSwKKwkweGYyOGZlNmVkLCAweDk3ZjFmYmZhLCAweDllYmFiZjJjLCAweDFlMTUzYzZlLAorCTB4ODZlMzQ1NzAsIDB4ZWFlOTZmYjEsIDB4ODYwZTVlMGEsIDB4NWEzZTJhYjMsCisJMHg3NzFmZTcxYywgMHg0ZTNkMDZmYSwgMHgyOTY1ZGNiOSwgMHg5OWU3MWQwZiwKKwkweDgwM2U4OWQ2LCAweDUyNjZjODI1LCAweDJlNGNjOTc4LCAweDljMTBiMzZhLAorCTB4YzYxNTBlYmEsIDB4OTRlMmVhNzgsIDB4YTVmYzNjNTMsIDB4MWUwYTJkZjQsCisJMHhmMmY3NGVhNywgMHgzNjFkMmIzZCwgMHgxOTM5MjYwZiwgMHgxOWMyNzk2MCwKKwkweDUyMjNhNzA4LCAweGY3MTMxMmI2LCAweGViYWRmZTZlLCAweGVhYzMxZjY2LAorCTB4ZTNiYzQ1OTUsIDB4YTY3YmM4ODMsIDB4YjE3ZjM3ZDEsIDB4MDE4Y2ZmMjgsCisJMHhjMzMyZGRlZiwgMHhiZTZjNWFhNSwgMHg2NTU4MjE4NSwgMHg2OGFiOTgwMiwKKwkweGVlY2VhNTBmLCAweGRiMmY5NTNiLCAweDJhZWY3ZGFkLCAweDViNmUyZjg0LAorCTB4MTUyMWI2MjgsIDB4MjkwNzYxNzAsIDB4ZWNkZDQ3NzUsIDB4NjE5ZjE1MTAsCisJMHgxM2NjYTgzMCwgMHhlYjYxYmQ5NiwgMHgwMzM0ZmUxZSwgMHhhYTAzNjNjZiwKKwkweGI1NzM1YzkwLCAweDRjNzBhMjM5LCAweGQ1OWU5ZTBiLCAweGNiYWFkZTE0LAorCTB4ZWVjYzg2YmMsIDB4NjA2MjJjYTcsIDB4OWNhYjVjYWIsIDB4YjJmMzg0NmUsCisJMHg2NDhiMWVhZiwgMHgxOWJkZjBjYSwgMHhhMDIzNjliOSwgMHg2NTVhYmI1MCwKKwkweDQwNjg1YTMyLCAweDNjMmFiNGIzLCAweDMxOWVlOWQ1LCAweGMwMjFiOGY3LAorCTB4OWI1NDBiMTksIDB4ODc1ZmEwOTksIDB4OTVmNzk5N2UsIDB4NjIzZDdkYTgsCisJMHhmODM3ODg5YSwgMHg5N2UzMmQ3NywgMHgxMWVkOTM1ZiwgMHgxNjY4MTI4MSwKKwkweDBlMzU4ODI5LCAweGM3ZTYxZmQ2LCAweDk2ZGVkZmExLCAweDc4NThiYTk5LAorCTB4NTdmNTg0YTUsIDB4MWIyMjcyNjMsIDB4OWI4M2MzZmYsIDB4MWFjMjQ2OTYsCisJMHhjZGIzMGFlYiwgMHg1MzJlMzA1NCwgMHg4ZmQ5NDhlNCwgMHg2ZGJjMzEyOCwKKwkweDU4ZWJmMmVmLCAweDM0YzZmZmVhLCAweGZlMjhlZDYxLCAweGVlN2MzYzczLAorCTB4NWQ0YTE0ZDksIDB4ZTg2NGI3ZTMsIDB4NDIxMDVkMTQsIDB4MjAzZTEzZTAsCisJMHg0NWVlZTJiNiwgMHhhM2FhYWJlYSwgMHhkYjZjNGYxNSwgMHhmYWNiNGZkMCwKKwkweGM3NDJmNDQyLCAweGVmNmFiYmI1LCAweDY1NGYzYjFkLCAweDQxY2QyMTA1LAorCTB4ZDgxZTc5OWUsIDB4ODY4NTRkYzcsIDB4ZTQ0YjQ3NmEsIDB4M2Q4MTYyNTAsCisJMHhjZjYyYTFmMiwgMHg1YjhkMjY0NiwgMHhmYzg4ODNhMCwgMHhjMWM3YjZhMywKKwkweDdmMTUyNGMzLCAweDY5Y2I3NDkyLCAweDQ3ODQ4YTBiLCAweDU2OTJiMjg1LAorCTB4MDk1YmJmMDAsIDB4YWQxOTQ4OWQsIDB4MTQ2MmIxNzQsIDB4MjM4MjBlMDAsCisJMHg1ODQyOGQyYSwgMHgwYzU1ZjVlYSwgMHgxZGFkZjQzZSwgMHgyMzNmNzA2MSwKKwkweDMzNzJmMDkyLCAweDhkOTM3ZTQxLCAweGQ2NWZlY2YxLCAweDZjMjIzYmRiLAorCTB4N2NkZTM3NTksIDB4Y2JlZTc0NjAsIDB4NDA4NWYyYTcsIDB4Y2U3NzMyNmUsCisJMHhhNjA3ODA4NCwgMHgxOWY4NTA5ZSwgMHhlOGVmZDg1NSwgMHg2MWQ5OTczNSwKKwkweGE5NjlhN2FhLCAweGM1MGMwNmMyLCAweDVhMDRhYmZjLCAweDgwMGJjYWRjLAorCTB4OWU0NDdhMmUsIDB4YzM0NTM0ODQsIDB4ZmRkNTY3MDUsIDB4MGUxZTllYzksCisJMHhkYjczZGJkMywgMHgxMDU1ODhjZCwgMHg2NzVmZGE3OSwgMHhlMzY3NDM0MCwKKwkweGM1YzQzNDY1LCAweDcxM2UzOGQ4LCAweDNkMjhmODllLCAweGYxNmRmZjIwLAorCTB4MTUzZTIxZTcsIDB4OGZiMDNkNGEsIDB4ZTZlMzlmMmIsIDB4ZGI4M2FkZjcsCisJMHhlOTNkNWE2OCwgMHg5NDgxNDBmNywgMHhmNjRjMjYxYywgMHg5NDY5MjkzNCwKKwkweDQxMTUyMGY3LCAweDc2MDJkNGY3LCAweGJjZjQ2YjJlLCAweGQ0YTIwMDY4LAorCTB4ZDQwODI0NzEsIDB4MzMyMGY0NmEsIDB4NDNiN2Q0YjcsIDB4NTAwMDYxYWYsCisJMHgxZTM5ZjYyZSwgMHg5NzI0NDU0NiwgMHgxNDIxNGY3NCwgMHhiZjhiODg0MCwKKwkweDRkOTVmYzFkLCAweDk2YjU5MWFmLCAweDcwZjRkZGQzLCAweDY2YTAyZjQ1LAorCTB4YmZiYzA5ZWMsIDB4MDNiZDk3ODUsIDB4N2ZhYzZkZDAsIDB4MzFjYjg1MDQsCisJMHg5NmViMjdiMywgMHg1NWZkMzk0MSwgMHhkYTI1NDdlNiwgMHhhYmNhMGE5YSwKKwkweDI4NTA3ODI1LCAweDUzMDQyOWY0LCAweDBhMmM4NmRhLCAweGU5YjY2ZGZiLAorCTB4NjhkYzE0NjIsIDB4ZDc0ODY5MDAsIDB4NjgwZWMwYTQsIDB4MjdhMThkZWUsCisJMHg0ZjNmZmVhMiwgMHhlODg3YWQ4YywgMHhiNThjZTAwNiwgMHg3YWY0ZDZiNiwKKwkweGFhY2UxZTdjLCAweGQzMzc1ZmVjLCAweGNlNzhhMzk5LCAweDQwNmIyYTQyLAorCTB4MjBmZTllMzUsIDB4ZDlmMzg1YjksIDB4ZWUzOWQ3YWIsIDB4M2IxMjRlOGIsCisJMHgxZGM5ZmFmNywgMHg0YjZkMTg1NiwgMHgyNmEzNjYzMSwgMHhlYWUzOTdiMiwKKwkweDNhNmVmYTc0LCAweGRkNWI0MzMyLCAweDY4NDFlN2Y3LCAweGNhNzgyMGZiLAorCTB4ZmIwYWY1NGUsIDB4ZDhmZWIzOTcsIDB4NDU0MDU2YWMsIDB4YmE0ODk1MjcsCisJMHg1NTUzM2EzYSwgMHgyMDgzOGQ4NywgMHhmZTZiYTliNywgMHhkMDk2OTU0YiwKKwkweDU1YTg2N2JjLCAweGExMTU5YTU4LCAweGNjYTkyOTYzLCAweDk5ZTFkYjMzLAorCTB4YTYyYTRhNTYsIDB4M2YzMTI1ZjksIDB4NWVmNDdlMWMsIDB4OTAyOTMxN2MsCisJMHhmZGY4ZTgwMiwgMHgwNDI3MmY3MCwgMHg4MGJiMTU1YywgMHgwNTI4MmNlMywKKwkweDk1YzExNTQ4LCAweGU0YzY2ZDIyLCAweDQ4YzExMzNmLCAweGM3MGY4NmRjLAorCTB4MDdmOWM5ZWUsIDB4NDEwNDFmMGYsIDB4NDA0Nzc5YTQsIDB4NWQ4ODZlMTcsCisJMHgzMjVmNTFlYiwgMHhkNTliYzBkMSwgMHhmMmJjYzE4ZiwgMHg0MTExMzU2NCwKKwkweDI1N2I3ODM0LCAweDYwMmE5YzYwLCAweGRmZjhlOGEzLCAweDFmNjM2YzFiLAorCTB4MGUxMmI0YzIsIDB4MDJlMTMyOWUsIDB4YWY2NjRmZDEsIDB4Y2FkMTgxMTUsCisJMHg2YjIzOTVlMCwgMHgzMzNlOTJlMSwgMHgzYjI0MGI2MiwgMHhlZWJlYjkyMiwKKwkweDg1YjJhMjBlLCAweGU2YmEwZDk5LCAweGRlNzIwYzhjLCAweDJkYTJmNzI4LAorCTB4ZDAxMjc4NDUsIDB4OTViNzk0ZmQsIDB4NjQ3ZDA4NjIsIDB4ZTdjY2Y1ZjAsCisJMHg1NDQ5YTM2ZiwgMHg4NzdkNDhmYSwgMHhjMzlkZmQyNywgMHhmMzNlOGQxZSwKKwkweDBhNDc2MzQxLCAweDk5MmVmZjc0LCAweDNhNmY2ZWFiLCAweGY0ZjhmZDM3LAorCTB4YTgxMmRjNjAsIDB4YTFlYmRkZjgsIDB4OTkxYmUxNGMsIDB4ZGI2ZTZiMGQsCisJMHhjNjdiNTUxMCwgMHg2ZDY3MmMzNywgMHgyNzY1ZDQzYiwgMHhkY2QwZTgwNCwKKwkweGYxMjkwZGM3LCAweGNjMDBmZmEzLCAweGI1MzkwZjkyLCAweDY5MGZlZDBiLAorCTB4NjY3YjlmZmIsIDB4Y2VkYjdkOWMsIDB4YTA5MWNmMGIsIDB4ZDkxNTVlYTMsCisJMHhiYjEzMmY4OCwgMHg1MTViYWQyNCwgMHg3Yjk0NzliZiwgMHg3NjNiZDZlYiwKKwkweDM3MzkyZWIzLCAweGNjMTE1OTc5LCAweDgwMjZlMjk3LCAweGY0MmUzMTJkLAorCTB4Njg0MmFkYTcsIDB4YzY2YTJiM2IsIDB4MTI3NTRjY2MsIDB4NzgyZWYxMWMsCisJMHg2YTEyNDIzNywgMHhiNzkyNTFlNywgMHgwNmExYmJlNiwgMHg0YmZiNjM1MCwKKwkweDFhNmIxMDE4LCAweDExY2FlZGZhLCAweDNkMjViZGQ4LCAweGUyZTFjM2M5LAorCTB4NDQ0MjE2NTksIDB4MGExMjEzODYsIDB4ZDkwY2VjNmUsIDB4ZDVhYmVhMmEsCisJMHg2NGFmNjc0ZSwgMHhkYTg2YTg1ZiwgMHhiZWJmZTk4OCwgMHg2NGU0YzNmZSwKKwkweDlkYmM4MDU3LCAweGYwZjdjMDg2LCAweDYwNzg3YmY4LCAweDYwMDM2MDRkLAorCTB4ZDFmZDgzNDYsIDB4ZjYzODFmYjAsIDB4Nzc0NWFlMDQsIDB4ZDczNmZjY2MsCisJMHg4MzQyNmIzMywgMHhmMDFlYWI3MSwgMHhiMDgwNDE4NywgMHgzYzAwNWU1ZiwKKwkweDc3YTA1N2JlLCAweGJkZThhZTI0LCAweDU1NDY0Mjk5LCAweGJmNTgyZTYxLAorCTB4NGU1OGY0OGYsIDB4ZjJkZGZkYTIsIDB4ZjQ3NGVmMzgsIDB4ODc4OWJkYzIsCisJMHg1MzY2ZjljMywgMHhjOGIzOGU3NCwgMHhiNDc1ZjI1NSwgMHg0NmZjZDliOSwKKwkweDdhZWIyNjYxLCAweDhiMWRkZjg0LCAweDg0NmEwZTc5LCAweDkxNWY5NWUyLAorCTB4NDY2ZTU5OGUsIDB4MjBiNDU3NzAsIDB4OGNkNTU1OTEsIDB4YzkwMmRlNGMsCisJMHhiOTBiYWNlMSwgMHhiYjgyMDVkMCwgMHgxMWE4NjI0OCwgMHg3NTc0YTk5ZSwKKwkweGI3N2YxOWI2LCAweGUwYTlkYzA5LCAweDY2MmQwOWExLCAweGM0MzI0NjMzLAorCTB4ZTg1YTFmMDIsIDB4MDlmMGJlOGMsIDB4NGE5OWEwMjUsIDB4MWQ2ZWZlMTAsCisJMHgxYWI5M2QxZCwgMHgwYmE1YTRkZiwgMHhhMTg2ZjIwZiwgMHgyODY4ZjE2OSwKKwkweGRjYjdkYTgzLCAweDU3MzkwNmZlLCAweGExZTJjZTliLCAweDRmY2Q3ZjUyLAorCTB4NTAxMTVlMDEsIDB4YTcwNjgzZmEsIDB4YTAwMmI1YzQsIDB4MGRlNmQwMjcsCisJMHg5YWY4OGMyNywgMHg3NzNmODY0MSwgMHhjMzYwNGMwNiwgMHg2MWE4MDZiNSwKKwkweGYwMTc3YTI4LCAweGMwZjU4NmUwLCAweDAwNjA1OGFhLCAweDMwZGM3ZDYyLAorCTB4MTFlNjllZDcsIDB4MjMzOGVhNjMsIDB4NTNjMmRkOTQsIDB4YzJjMjE2MzQsCisJMHhiYmNiZWU1NiwgMHg5MGJjYjZkZSwgMHhlYmZjN2RhMSwgMHhjZTU5MWQ3NiwKKwkweDZmMDVlNDA5LCAweDRiN2MwMTg4LCAweDM5NzIwYTNkLCAweDdjOTI3YzI0LAorCTB4ODZlMzcyNWYsIDB4NzI0ZDlkYjksIDB4MWFjMTViYjQsIDB4ZDM5ZWI4ZmMsCisJMHhlZDU0NTU3OCwgMHgwOGZjYTViNSwgMHhkODNkN2NkMywgMHg0ZGFkMGZjNCwKKwkweDFlNTBlZjVlLCAweGIxNjFlNmY4LCAweGEyODUxNGQ5LCAweDZjNTExMzNjLAorCTB4NmZkNWM3ZTcsIDB4NTZlMTRlYzQsIDB4MzYyYWJmY2UsIDB4ZGRjNmM4MzcsCisJMHhkNzlhMzIzNCwgMHg5MjYzODIxMiwgMHg2NzBlZmE4ZSwgMHg0MDYwMDBlMCwKKwkweDNhMzljZTM3LCAweGQzZmFmNWNmLCAweGFiYzI3NzM3LCAweDVhYzUyZDFiLAorCTB4NWNiMDY3OWUsIDB4NGZhMzM3NDIsIDB4ZDM4MjI3NDAsIDB4OTliYzliYmUsCisJMHhkNTExOGU5ZCwgMHhiZjBmNzMxNSwgMHhkNjJkMWM3ZSwgMHhjNzAwYzQ3YiwKKwkweGI3OGMxYjZiLCAweDIxYTE5MDQ1LCAweGIyNmViMWJlLCAweDZhMzY2ZWI0LAorCTB4NTc0OGFiMmYsIDB4YmM5NDZlNzksIDB4YzZhMzc2ZDIsIDB4NjU0OWMyYzgsCisJMHg1MzBmZjhlZSwgMHg0NjhkZGU3ZCwgMHhkNTczMGExZCwgMHg0Y2QwNGRjNiwKKwkweDI5MzliYmRiLCAweGE5YmE0NjUwLCAweGFjOTUyNmU4LCAweGJlNWVlMzA0LAorCTB4YTFmYWQ1ZjAsIDB4NmEyZDUxOWEsIDB4NjNlZjhjZTIsIDB4OWE4NmVlMjIsCisJMHhjMDg5YzJiOCwgMHg0MzI0MmVmNiwgMHhhNTFlMDNhYSwgMHg5Y2YyZDBhNCwKKwkweDgzYzA2MWJhLCAweDliZTk2YTRkLCAweDhmZTUxNTUwLCAweGJhNjQ1YmQ2LAorCTB4MjgyNmEyZjksIDB4YTczYTNhZTEsIDB4NGJhOTk1ODYsIDB4ZWY1NTYyZTksCisJMHhjNzJmZWZkMywgMHhmNzUyZjdkYSwgMHgzZjA0NmY2OSwgMHg3N2ZhMGE1OSwKKwkweDgwZTRhOTE1LCAweDg3YjA4NjAxLCAweDliMDllNmFkLCAweDNiM2VlNTkzLAorCTB4ZTk5MGZkNWEsIDB4OWUzNGQ3OTcsIDB4MmNmMGI3ZDksIDB4MDIyYjhiNTEsCisJMHg5NmQ1YWMzYSwgMHgwMTdkYTY3ZCwgMHhkMWNmM2VkNiwgMHg3YzdkMmQyOCwKKwkweDFmOWYyNWNmLCAweGFkZjJiODliLCAweDVhZDZiNDcyLCAweDVhODhmNTRjLAorCTB4ZTAyOWFjNzEsIDB4ZTAxOWE1ZTYsIDB4NDdiMGFjZmQsIDB4ZWQ5M2ZhOWIsCisJMHhlOGQzYzQ4ZCwgMHgyODNiNTdjYywgMHhmOGQ1NjYyOSwgMHg3OTEzMmUyOCwKKwkweDc4NWYwMTkxLCAweGVkNzU2MDU1LCAweGY3OTYwZTQ0LCAweGUzZDM1ZThjLAorCTB4MTUwNTZkZDQsIDB4ODhmNDZkYmEsIDB4MDNhMTYxMjUsIDB4MDU2NGYwYmQsCisJMHhjM2ViOWUxNSwgMHgzYzkwNTdhMiwgMHg5NzI3MWFlYywgMHhhOTNhMDcyYSwKKwkweDFiM2Y2ZDliLCAweDFlNjMyMWY1LCAweGY1OWM2NmZiLCAweDI2ZGNmMzE5LAorCTB4NzUzM2Q5MjgsIDB4YjE1NWZkZjUsIDB4MDM1NjM0ODIsIDB4OGFiYTNjYmIsCisJMHgyODUxNzcxMSwgMHhjMjBhZDlmOCwgMHhhYmNjNTE2NywgMHhjY2FkOTI1ZiwKKwkweDRkZTgxNzUxLCAweDM4MzBkYzhlLCAweDM3OWQ1ODYyLCAweDkzMjBmOTkxLAorCTB4ZWE3YTkwYzIsIDB4ZmIzZTdiY2UsIDB4NTEyMWNlNjQsIDB4Nzc0ZmJlMzIsCisJMHhhOGI2ZTM3ZSwgMHhjMzI5M2Q0NiwgMHg0OGRlNTM2OSwgMHg2NDEzZTY4MCwKKwkweGEyYWUwODEwLCAweGRkNmRiMjI0LCAweDY5ODUyZGZkLCAweDA5MDcyMTY2LAorCTB4YjM5YTQ2MGEsIDB4NjQ0NWMwZGQsIDB4NTg2Y2RlY2YsIDB4MWMyMGM4YWUsCisJMHg1YmJlZjdkZCwgMHgxYjU4OGQ0MCwgMHhjY2QyMDE3ZiwgMHg2YmI0ZTNiYiwKKwkweGRkYTI2YTdlLCAweDNhNTlmZjQ1LCAweDNlMzUwYTQ0LCAweGJjYjRjZGQ1LAorCTB4NzJlYWNlYTgsIDB4ZmE2NDg0YmIsIDB4OGQ2NjEyYWUsIDB4YmYzYzZmNDcsCisJMHhkMjliZTQ2MywgMHg1NDJmNWQ5ZSwgMHhhZWMyNzcxYiwgMHhmNjRlNjM3MCwKKwkweDc0MGUwZDhkLCAweGU3NWIxMzU3LCAweGY4NzIxNjcxLCAweGFmNTM3ZDVkLAorCTB4NDA0MGNiMDgsIDB4NGViNGUyY2MsIDB4MzRkMjQ2NmEsIDB4MDExNWFmODQsCisJMHhlMWIwMDQyOCwgMHg5NTk4M2ExZCwgMHgwNmI4OWZiNCwgMHhjZTZlYTA0OCwKKwkweDZmM2YzYjgyLCAweDM1MjBhYjgyLCAweDAxMWExZDRiLCAweDI3NzIyN2Y4LAorCTB4NjExNTYwYjEsIDB4ZTc5MzNmZGMsIDB4YmIzYTc5MmIsIDB4MzQ0NTI1YmQsCisJMHhhMDg4MzllMSwgMHg1MWNlNzk0YiwgMHgyZjMyYzliNywgMHhhMDFmYmFjOSwKKwkweGUwMWNjODdlLCAweGJjYzdkMWY2LCAweGNmMDExMWMzLCAweGExZThhYWM3LAorCTB4MWE5MDg3NDksIDB4ZDQ0ZmJkOWEsIDB4ZDBkYWRlY2IsIDB4ZDUwYWRhMzgsCisJMHgwMzM5YzMyYSwgMHhjNjkxMzY2NywgMHg4ZGY5MzE3YywgMHhlMGIxMmI0ZiwKKwkweGY3OWU1OWI3LCAweDQzZjViYjNhLCAweGYyZDUxOWZmLCAweDI3ZDk0NTljLAorCTB4YmY5NzIyMmMsIDB4MTVlNmZjMmEsIDB4MGY5MWZjNzEsIDB4OWI5NDE1MjUsCisJMHhmYWU1OTM2MSwgMHhjZWI2OWNlYiwgMHhjMmE4NjQ1OSwgMHgxMmJhYThkMSwKKwkweGI2YzEwNzVlLCAweGUzMDU2YTBjLCAweDEwZDI1MDY1LCAweGNiMDNhNDQyLAorCTB4ZTBlYzZlMGUsIDB4MTY5OGRiM2IsIDB4NGM5OGEwYmUsIDB4MzI3OGU5NjQsCisJMHg5ZjFmOTUzMiwgMHhlMGQzOTJkZiwgMHhkM2EwMzQyYiwgMHg4OTcxZjIxZSwKKwkweDFiMGE3NDQxLCAweDRiYTMzNDhjLCAweGM1YmU3MTIwLCAweGMzNzYzMmQ4LAorCTB4ZGYzNTlmOGQsIDB4OWI5OTJmMmUsIDB4ZTYwYjZmNDcsIDB4MGZlM2YxMWQsCisJMHhlNTRjZGE1NCwgMHgxZWRhZDg5MSwgMHhjZTYyNzljZiwgMHhjZDNlN2U2ZiwKKwkweDE2MThiMTY2LCAweGZkMmMxZDA1LCAweDg0OGZkMmM1LCAweGY2ZmIyMjk5LAorCTB4ZjUyM2YzNTcsIDB4YTYzMjc2MjMsIDB4OTNhODM1MzEsIDB4NTZjY2NkMDIsCisJMHhhY2YwODE2MiwgMHg1YTc1ZWJiNSwgMHg2ZTE2MzY5NywgMHg4OGQyNzNjYywKKwkweGRlOTY2MjkyLCAweDgxYjk0OWQwLCAweDRjNTA5MDFiLCAweDcxYzY1NjE0LAorCTB4ZTZjNmM3YmQsIDB4MzI3YTE0MGEsIDB4NDVlMWQwMDYsIDB4YzNmMjdiOWEsCisJMHhjOWFhNTNmZCwgMHg2MmE4MGYwMCwgMHhiYjI1YmZlMiwgMHgzNWJkZDJmNiwKKwkweDcxMTI2OTA1LCAweGIyMDQwMjIyLCAweGI2Y2JjZjdjLCAweGNkNzY5YzJiLAorCTB4NTMxMTNlYzAsIDB4MTY0MGUzZDMsIDB4MzhhYmJkNjAsIDB4MjU0N2FkZjAsCisJMHhiYTM4MjA5YywgMHhmNzQ2Y2U3NiwgMHg3N2FmYTFjNSwgMHgyMDc1NjA2MCwKKwkweDg1Y2JmZTRlLCAweDhhZTg4ZGQ4LCAweDdhYWFmOWIwLCAweDRjZjlhYTdlLAorCTB4MTk0OGMyNWMsIDB4MDJmYjhhOGMsIDB4MDFjMzZhZTQsIDB4ZDZlYmUxZjksCisJMHg5MGQ0Zjg2OSwgMHhhNjVjZGVhMCwgMHgzZjA5MjUyZCwgMHhjMjA4ZTY5ZiwKKwkweGI3NGU2MTMyLCAweGNlNzdlMjViLCAweDU3OGZkZmUzLCAweDNhYzM3MmU2LAorfTsKKworLyoKKyAqIFJvdW5kIGxvb3AgdW5yb2xsaW5nIG1hY3JvcywgUyBpcyBhIHBvaW50ZXIgdG8gYSBTLUJveCBhcnJheQorICogb3JnYW5pemVkIGluIDQgdW5zaWduZWQgbG9uZ3MgYXQgYSByb3cuCisgKi8KKyNkZWZpbmUgR0VUMzJfMyh4KSAoKCh4KSAmIDB4ZmYpKQorI2RlZmluZSBHRVQzMl8yKHgpICgoKHgpID4+ICg4KSkgJiAoMHhmZikpCisjZGVmaW5lIEdFVDMyXzEoeCkgKCgoeCkgPj4gKDE2KSkgJiAoMHhmZikpCisjZGVmaW5lIEdFVDMyXzAoeCkgKCgoeCkgPj4gKDI0KSkgJiAoMHhmZikpCisKKyNkZWZpbmUgYmZfRih4KSAoKChTW0dFVDMyXzAoeCldICsgU1syNTYgKyBHRVQzMl8xKHgpXSkgXiBcCisJCVNbNTEyICsgR0VUMzJfMih4KV0pICsgU1s3NjggKyBHRVQzMl8zKHgpXSkKKworI2RlZmluZSBST1VORChhLCBiLCBuKSAoeyBiIF49IFBbbl07IGEgXj0gYmZfRihiKTsgfSkKKworLyoKKyAqIFRoZSBibG93ZmlzaCBlbmNpcGhlciwgcHJvY2Vzc2VzIDY0LWJpdCBibG9ja3MuCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIE1VU1ROJ1QgcmVzcGVjdCBlbmRpYW5lc3MKKyAqLworc3RhdGljIHZvaWQgZW5jcnlwdF9ibG9jayhzdHJ1Y3QgYmZfY3R4ICpiY3R4LCB1MzIgKmRzdCwgdTMyICpzcmMpCit7CisJY29uc3QgdTMyICpQID0gYmN0eC0+cDsKKwljb25zdCB1MzIgKlMgPSBiY3R4LT5zOworCXUzMiB5bCA9IHNyY1swXTsKKwl1MzIgeXIgPSBzcmNbMV07CisKKwlST1VORCh5ciwgeWwsIDApOworCVJPVU5EKHlsLCB5ciwgMSk7CisJUk9VTkQoeXIsIHlsLCAyKTsKKwlST1VORCh5bCwgeXIsIDMpOworCVJPVU5EKHlyLCB5bCwgNCk7CisJUk9VTkQoeWwsIHlyLCA1KTsKKwlST1VORCh5ciwgeWwsIDYpOworCVJPVU5EKHlsLCB5ciwgNyk7CisJUk9VTkQoeXIsIHlsLCA4KTsKKwlST1VORCh5bCwgeXIsIDkpOworCVJPVU5EKHlyLCB5bCwgMTApOworCVJPVU5EKHlsLCB5ciwgMTEpOworCVJPVU5EKHlyLCB5bCwgMTIpOworCVJPVU5EKHlsLCB5ciwgMTMpOworCVJPVU5EKHlyLCB5bCwgMTQpOworCVJPVU5EKHlsLCB5ciwgMTUpOworCisJeWwgXj0gUFsxNl07CisJeXIgXj0gUFsxN107CisKKwlkc3RbMF0gPSB5cjsKKwlkc3RbMV0gPSB5bDsKK30KKworLyoKKyAqIENhbGN1bGF0ZXMgdGhlIGJsb3dmaXNoIFMgYW5kIFAgYm94ZXMgZm9yIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24uCisgKi8KK2ludCBibG93ZmlzaF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXUzMiAqUCA9IGN0eC0+cDsKKwl1MzIgKlMgPSBjdHgtPnM7CisJc2hvcnQgaSwgaiwgY291bnQ7CisJdTMyIGRhdGFbMl0sIHRlbXA7CisKKwkvKiBDb3B5IHRoZSBpbml0aWFsaXphdGlvbiBzLWJveGVzICovCisJZm9yIChpID0gMCwgY291bnQgPSAwOyBpIDwgMjU2OyBpKyspCisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyssIGNvdW50KyspCisJCQlTW2NvdW50XSA9IGJmX3Nib3hbY291bnRdOworCisJLyogU2V0IHRoZSBwLWJveGVzICovCisJZm9yIChpID0gMDsgaSA8IDE2ICsgMjsgaSsrKQorCQlQW2ldID0gYmZfcGJveFtpXTsKKworCS8qIEFjdHVhbCBzdWJrZXkgZ2VuZXJhdGlvbiAqLworCWZvciAoaiA9IDAsIGkgPSAwOyBpIDwgMTYgKyAyOyBpKyspIHsKKwkJdGVtcCA9ICgoKHUzMilrZXlbal0gPDwgMjQpIHwKKwkJCSgodTMyKWtleVsoaiArIDEpICUga2V5bGVuXSA8PCAxNikgfAorCQkJKCh1MzIpa2V5WyhqICsgMikgJSBrZXlsZW5dIDw8IDgpIHwKKwkJCSgodTMyKWtleVsoaiArIDMpICUga2V5bGVuXSkpOworCisJCVBbaV0gPSBQW2ldIF4gdGVtcDsKKwkJaiA9IChqICsgNCkgJSBrZXlsZW47CisJfQorCisJZGF0YVswXSA9IDB4MDAwMDAwMDA7CisJZGF0YVsxXSA9IDB4MDAwMDAwMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTYgKyAyOyBpICs9IDIpIHsKKwkJZW5jcnlwdF9ibG9jaygoc3RydWN0IGJmX2N0eCAqKWN0eCwgZGF0YSwgZGF0YSk7CisKKwkJUFtpXSA9IGRhdGFbMF07CisJCVBbaSArIDFdID0gZGF0YVsxXTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWZvciAoaiA9IDAsIGNvdW50ID0gaSAqIDI1NjsgaiA8IDI1NjsgaiArPSAyLCBjb3VudCArPSAyKSB7CisJCQllbmNyeXB0X2Jsb2NrKChzdHJ1Y3QgYmZfY3R4ICopY3R4LCBkYXRhLCBkYXRhKTsKKworCQkJU1tjb3VudF0gPSBkYXRhWzBdOworCQkJU1tjb3VudCArIDFdID0gZGF0YVsxXTsKKwkJfQorCX0KKworCS8qIEJydWNlIHNheXMgbm90IHRvIGJvdGhlciB3aXRoIHRoZSB3ZWFrIGtleSBjaGVjay4gKi8KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJsb3dmaXNoX3NldGtleSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmxvd2Zpc2ggQ2lwaGVyIGNvbW1vbiBmdW5jdGlvbnMiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9ibG93ZmlzaF9nZW5lcmljLmMgYi9jcnlwdG8vYmxvd2Zpc2hfZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjY5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYmxvd2Zpc2hfZ2VuZXJpYy5jCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQmxvd2Zpc2ggQ2lwaGVyIEFsZ29yaXRobSwgYnkgQnJ1Y2UgU2NobmVpZXIuCisgKiBodHRwOi8vd3d3LmNvdW50ZXJwYW5lLmNvbS9ibG93ZmlzaC5odG1sCisgKgorICogQWRhcHRlZCBmcm9tIEtlcm5lbGkgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAaHZybGFiLm9yZz4KKyAqIENvcHlyaWdodCAoYykgS3lsZSBNY01hcnRpbiA8a3lsZUBkZWJpYW4ub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Jsb3dmaXNoLmg+CisKKy8qCisgKiBSb3VuZCBsb29wIHVucm9sbGluZyBtYWNyb3MsIFMgaXMgYSBwb2ludGVyIHRvIGEgUy1Cb3ggYXJyYXkKKyAqIG9yZ2FuaXplZCBpbiA0IHVuc2lnbmVkIGxvbmdzIGF0IGEgcm93LgorICovCisjZGVmaW5lIEdFVDMyXzMoeCkgKCgoeCkgJiAweGZmKSkKKyNkZWZpbmUgR0VUMzJfMih4KSAoKCh4KSA+PiAoOCkpICYgKDB4ZmYpKQorI2RlZmluZSBHRVQzMl8xKHgpICgoKHgpID4+ICgxNikpICYgKDB4ZmYpKQorI2RlZmluZSBHRVQzMl8wKHgpICgoKHgpID4+ICgyNCkpICYgKDB4ZmYpKQorCisjZGVmaW5lIGJmX0YoeCkgKCgoU1tHRVQzMl8wKHgpXSArIFNbMjU2ICsgR0VUMzJfMSh4KV0pIF4gXAorCQlTWzUxMiArIEdFVDMyXzIoeCldKSArIFNbNzY4ICsgR0VUMzJfMyh4KV0pCisKKyNkZWZpbmUgUk9VTkQoYSwgYiwgbikgKHsgYiBePSBQW25dOyBhIF49IGJmX0YoYik7IH0pCisKK3N0YXRpYyB2b2lkIGJmX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCWNvbnN0IF9fYmUzMiAqaW5fYmxrID0gKGNvbnN0IF9fYmUzMiAqKXNyYzsKKwlfX2JlMzIgKmNvbnN0IG91dF9ibGsgPSAoX19iZTMyICopZHN0OworCWNvbnN0IHUzMiAqUCA9IGN0eC0+cDsKKwljb25zdCB1MzIgKlMgPSBjdHgtPnM7CisJdTMyIHlsID0gYmUzMl90b19jcHUoaW5fYmxrWzBdKTsKKwl1MzIgeXIgPSBiZTMyX3RvX2NwdShpbl9ibGtbMV0pOworCisJUk9VTkQoeXIsIHlsLCAwKTsKKwlST1VORCh5bCwgeXIsIDEpOworCVJPVU5EKHlyLCB5bCwgMik7CisJUk9VTkQoeWwsIHlyLCAzKTsKKwlST1VORCh5ciwgeWwsIDQpOworCVJPVU5EKHlsLCB5ciwgNSk7CisJUk9VTkQoeXIsIHlsLCA2KTsKKwlST1VORCh5bCwgeXIsIDcpOworCVJPVU5EKHlyLCB5bCwgOCk7CisJUk9VTkQoeWwsIHlyLCA5KTsKKwlST1VORCh5ciwgeWwsIDEwKTsKKwlST1VORCh5bCwgeXIsIDExKTsKKwlST1VORCh5ciwgeWwsIDEyKTsKKwlST1VORCh5bCwgeXIsIDEzKTsKKwlST1VORCh5ciwgeWwsIDE0KTsKKwlST1VORCh5bCwgeXIsIDE1KTsKKworCXlsIF49IFBbMTZdOworCXlyIF49IFBbMTddOworCisJb3V0X2Jsa1swXSA9IGNwdV90b19iZTMyKHlyKTsKKwlvdXRfYmxrWzFdID0gY3B1X3RvX2JlMzIoeWwpOworfQorCitzdGF0aWMgdm9pZCBiZl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CisJc3RydWN0IGJmX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwljb25zdCBfX2JlMzIgKmluX2JsayA9IChjb25zdCBfX2JlMzIgKilzcmM7CisJX19iZTMyICpjb25zdCBvdXRfYmxrID0gKF9fYmUzMiAqKWRzdDsKKwljb25zdCB1MzIgKlAgPSBjdHgtPnA7CisJY29uc3QgdTMyICpTID0gY3R4LT5zOworCXUzMiB5bCA9IGJlMzJfdG9fY3B1KGluX2Jsa1swXSk7CisJdTMyIHlyID0gYmUzMl90b19jcHUoaW5fYmxrWzFdKTsKKworCVJPVU5EKHlyLCB5bCwgMTcpOworCVJPVU5EKHlsLCB5ciwgMTYpOworCVJPVU5EKHlyLCB5bCwgMTUpOworCVJPVU5EKHlsLCB5ciwgMTQpOworCVJPVU5EKHlyLCB5bCwgMTMpOworCVJPVU5EKHlsLCB5ciwgMTIpOworCVJPVU5EKHlyLCB5bCwgMTEpOworCVJPVU5EKHlsLCB5ciwgMTApOworCVJPVU5EKHlyLCB5bCwgOSk7CisJUk9VTkQoeWwsIHlyLCA4KTsKKwlST1VORCh5ciwgeWwsIDcpOworCVJPVU5EKHlsLCB5ciwgNik7CisJUk9VTkQoeXIsIHlsLCA1KTsKKwlST1VORCh5bCwgeXIsIDQpOworCVJPVU5EKHlyLCB5bCwgMyk7CisJUk9VTkQoeWwsIHlyLCAyKTsKKworCXlsIF49IFBbMV07CisJeXIgXj0gUFswXTsKKworCW91dF9ibGtbMF0gPSBjcHVfdG9fYmUzMih5cik7CisJb3V0X2Jsa1sxXSA9IGNwdV90b19iZTMyKHlsKTsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFsZyA9IHsKKwkuY3JhX25hbWUJCT0JImJsb3dmaXNoIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0JImJsb3dmaXNoLWdlbmVyaWMiLAorCS5jcmFfcHJpb3JpdHkJCT0JMTAwLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlCRl9CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGJmX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMywKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKKwkuY2lhX21pbl9rZXlzaXplCT0JQkZfTUlOX0tFWV9TSVpFLAorCS5jaWFfbWF4X2tleXNpemUJPQlCRl9NQVhfS0VZX1NJWkUsCisJLmNpYV9zZXRrZXkJCT0JYmxvd2Zpc2hfc2V0a2V5LAorCS5jaWFfZW5jcnlwdAkJPQliZl9lbmNyeXB0LAorCS5jaWFfZGVjcnlwdAkJPQliZl9kZWNyeXB0IH0gfQorfTsKKworc3RhdGljIGludCBfX2luaXQgYmxvd2Zpc2hfbW9kX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYWxnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJsb3dmaXNoX21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhbGcpOworfQorCittb2R1bGVfaW5pdChibG93ZmlzaF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChibG93ZmlzaF9tb2RfZmluaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmxvd2Zpc2ggQ2lwaGVyIEFsZ29yaXRobSIpOworTU9EVUxFX0FMSUFTKCJibG93ZmlzaCIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NyeXB0ZC5jIGIvY3J5cHRvL2NyeXB0ZC5jCmluZGV4IGU0NmQyMWEuLjY3MWQ0ZDYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jcnlwdGQuYworKysgYi9jcnlwdG8vY3J5cHRkLmMKQEAgLTk0NSw3ICs5NDUsNyBAQAogCWNyeXB0b191bnJlZ2lzdGVyX3RlbXBsYXRlKCZjcnlwdGRfdG1wbCk7CiB9CiAKLW1vZHVsZV9pbml0KGNyeXB0ZF9pbml0KTsKK3N1YnN5c19pbml0Y2FsbChjcnlwdGRfaW5pdCk7CiBtb2R1bGVfZXhpdChjcnlwdGRfZXhpdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9jcnlwdG9fdXNlci5jIGIvY3J5cHRvL2NyeXB0b191c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwNWEyYgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jcnlwdG9fdXNlci5jCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogQ3J5cHRvIHVzZXIgY29uZmlndXJhdGlvbiBBUEkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIHNlY3VuZXQgU2VjdXJpdHkgTmV0d29ya3MgQUcKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTdGVmZmVuIEtsYXNzZXJ0IDxzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b3VzZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitERUZJTkVfTVVURVgoY3J5cHRvX2NmZ19tdXRleCk7CisKKy8qIFRoZSBjcnlwdG8gbmV0bGluayBzb2NrZXQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29jayAqY3J5cHRvX25sc2s7CisKK3N0cnVjdCBjcnlwdG9fZHVtcF9pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiOworCXN0cnVjdCBza19idWZmICpvdXRfc2tiOworCXUzMiBubG1zZ19zZXE7CisJdTE2IG5sbXNnX2ZsYWdzOworfTsKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21hdGNoKHN0cnVjdCBjcnlwdG9fdXNlcl9hbGcgKnAsIGludCBleGFjdCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqcSwgKmFsZyA9IE5VTEw7CisKKwlkb3duX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmNyeXB0b19hbGdfbGlzdCwgY3JhX2xpc3QpIHsKKwkJaW50IG1hdGNoID0gMDsKKworCQlpZiAoKHEtPmNyYV9mbGFncyBeIHAtPmNydV90eXBlKSAmIHAtPmNydV9tYXNrKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmxlbihwLT5jcnVfZHJpdmVyX25hbWUpKQorCQkJbWF0Y2ggPSAhc3RyY21wKHEtPmNyYV9kcml2ZXJfbmFtZSwKKwkJCQkJcC0+Y3J1X2RyaXZlcl9uYW1lKTsKKwkJZWxzZSBpZiAoIWV4YWN0KQorCQkJbWF0Y2ggPSAhc3RyY21wKHEtPmNyYV9uYW1lLCBwLT5jcnVfbmFtZSk7CisKKwkJaWYgKG1hdGNoKSB7CisJCQlhbGcgPSBxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl1cF9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7CisKKwlyZXR1cm4gYWxnOworfQorCitzdGF0aWMgaW50IGNyeXB0b19yZXBvcnRfY2lwaGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJc3RydWN0IGNyeXB0b19yZXBvcnRfY2lwaGVyIHJjaXBoZXI7CisKKwlzbnByaW50ZihyY2lwaGVyLnR5cGUsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsICJjaXBoZXIiKTsKKworCXJjaXBoZXIuYmxvY2tzaXplID0gYWxnLT5jcmFfYmxvY2tzaXplOworCXJjaXBoZXIubWluX2tleXNpemUgPSBhbGctPmNyYV9jaXBoZXIuY2lhX21pbl9rZXlzaXplOworCXJjaXBoZXIubWF4X2tleXNpemUgPSBhbGctPmNyYV9jaXBoZXIuY2lhX21heF9rZXlzaXplOworCisJTkxBX1BVVChza2IsIENSWVBUT0NGR0FfUkVQT1JUX0NJUEhFUiwKKwkJc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcmVwb3J0X2NpcGhlciksICZyY2lwaGVyKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBjcnlwdG9fcmVwb3J0X2NvbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9jb21wIHJjb21wOworCisJc25wcmludGYocmNvbXAudHlwZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwgImNvbXByZXNzaW9uIik7CisKKwlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfQ09NUFJFU1MsCisJCXNpemVvZihzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9jb21wKSwgJnJjb21wKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBjcnlwdG9fcmVwb3J0X29uZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLAorCQkJICAgICBzdHJ1Y3QgY3J5cHRvX3VzZXJfYWxnICp1YWxnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCW1lbWNweSgmdWFsZy0+Y3J1X25hbWUsICZhbGctPmNyYV9uYW1lLCBzaXplb2YodWFsZy0+Y3J1X25hbWUpKTsKKwltZW1jcHkoJnVhbGctPmNydV9kcml2ZXJfbmFtZSwgJmFsZy0+Y3JhX2RyaXZlcl9uYW1lLAorCSAgICAgICBzaXplb2YodWFsZy0+Y3J1X2RyaXZlcl9uYW1lKSk7CisJbWVtY3B5KCZ1YWxnLT5jcnVfbW9kdWxlX25hbWUsIG1vZHVsZV9uYW1lKGFsZy0+Y3JhX21vZHVsZSksCisJICAgICAgIENSWVBUT19NQVhfQUxHX05BTUUpOworCisJdWFsZy0+Y3J1X2ZsYWdzID0gYWxnLT5jcmFfZmxhZ3M7CisJdWFsZy0+Y3J1X3JlZmNudCA9IGF0b21pY19yZWFkKCZhbGctPmNyYV9yZWZjbnQpOworCisJTkxBX1BVVF9VMzIoc2tiLCBDUllQVE9DRkdBX1BSSU9SSVRZX1ZBTCwgYWxnLT5jcmFfcHJpb3JpdHkpOworCisJaWYgKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19MQVJWQUwpIHsKKwkJc3RydWN0IGNyeXB0b19yZXBvcnRfbGFydmFsIHJsOworCisJCXNucHJpbnRmKHJsLnR5cGUsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsICJsYXJ2YWwiKTsKKworCQlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfTEFSVkFMLAorCQkJc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcmVwb3J0X2xhcnZhbCksICZybCk7CisKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGFsZy0+Y3JhX3R5cGUgJiYgYWxnLT5jcmFfdHlwZS0+cmVwb3J0KSB7CisJCWlmIChhbGctPmNyYV90eXBlLT5yZXBvcnQoc2tiLCBhbGcpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChhbGctPmNyYV9mbGFncyAmIChDUllQVE9fQUxHX1RZUEVfTUFTSyB8IENSWVBUT19BTEdfTEFSVkFMKSkgeworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKKwkJaWYgKGNyeXB0b19yZXBvcnRfY2lwaGVyKHNrYiwgYWxnKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJCWJyZWFrOworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOgorCQlpZiAoY3J5cHRvX3JlcG9ydF9jb21wKHNrYiwgYWxnKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJCWJyZWFrOworCX0KKworb3V0OgorCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBjcnlwdG9fcmVwb3J0X2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLAorCQkJICAgICBzdHJ1Y3QgY3J5cHRvX2R1bXBfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiID0gaW5mby0+aW5fc2tiOworCXN0cnVjdCBza19idWZmICpza2IgPSBpbmZvLT5vdXRfc2tiOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCBjcnlwdG9fdXNlcl9hbGcgKnVhbGc7CisJaW50IGVyciA9IDA7CisKKwlubGggPSBubG1zZ19wdXQoc2tiLCBORVRMSU5LX0NCKGluX3NrYikucGlkLCBpbmZvLT5ubG1zZ19zZXEsCisJCQlDUllQVE9fTVNHX0dFVEFMRywgc2l6ZW9mKCp1YWxnKSwgaW5mby0+bmxtc2dfZmxhZ3MpOworCWlmICghbmxoKSB7CisJCWVyciA9IC1FTVNHU0laRTsKKwkJZ290byBvdXQ7CisJfQorCisJdWFsZyA9IG5sbXNnX2RhdGEobmxoKTsKKworCWVyciA9IGNyeXB0b19yZXBvcnRfb25lKGFsZywgdWFsZywgc2tiKTsKKwlpZiAoZXJyKSB7CisJCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJCWdvdG8gb3V0OworCX0KKworCW5sbXNnX2VuZChza2IsIG5saCk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNyeXB0b19yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgc3RydWN0IG5sbXNnaGRyICppbl9ubGgsCisJCQkgc3RydWN0IG5sYXR0ciAqKmF0dHJzKQoreworCXN0cnVjdCBjcnlwdG9fdXNlcl9hbGcgKnAgPSBubG1zZ19kYXRhKGluX25saCk7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBjcnlwdG9fZHVtcF9pbmZvIGluZm87CisJaW50IGVycjsKKworCWlmICghcC0+Y3J1X2RyaXZlcl9uYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFsZyA9IGNyeXB0b19hbGdfbWF0Y2gocCwgMSk7CisJaWYgKCFhbGcpCisJCXJldHVybiAtRU5PRU5UOworCisJc2tiID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5mby5pbl9za2IgPSBpbl9za2I7CisJaW5mby5vdXRfc2tiID0gc2tiOworCWluZm8ubmxtc2dfc2VxID0gaW5fbmxoLT5ubG1zZ19zZXE7CisJaW5mby5ubG1zZ19mbGFncyA9IDA7CisKKwllcnIgPSBjcnlwdG9fcmVwb3J0X2FsZyhhbGcsICZpbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG5sbXNnX3VuaWNhc3QoY3J5cHRvX25sc2ssIHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCk7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2R1bXBfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCXN0cnVjdCBjcnlwdG9fZHVtcF9pbmZvIGluZm87CisJaW50IGVycjsKKworCWlmIChjYi0+YXJnc1swXSkKKwkJZ290byBvdXQ7CisKKwljYi0+YXJnc1swXSA9IDE7CisKKwlpbmZvLmluX3NrYiA9IGNiLT5za2I7CisJaW5mby5vdXRfc2tiID0gc2tiOworCWluZm8ubmxtc2dfc2VxID0gY2ItPm5saC0+bmxtc2dfc2VxOworCWluZm8ubmxtc2dfZmxhZ3MgPSBOTE1fRl9NVUxUSTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWxnLCAmY3J5cHRvX2FsZ19saXN0LCBjcmFfbGlzdCkgeworCQllcnIgPSBjcnlwdG9fcmVwb3J0X2FsZyhhbGcsICZpbmZvKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKK291dDoKKwlyZXR1cm4gc2tiLT5sZW47CitvdXRfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2R1bXBfcmVwb3J0X2RvbmUoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyeXB0b191cGRhdGVfYWxnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLAorCQkJICAgICBzdHJ1Y3QgbmxhdHRyICoqYXR0cnMpCit7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKKwlzdHJ1Y3QgY3J5cHRvX3VzZXJfYWxnICpwID0gbmxtc2dfZGF0YShubGgpOworCXN0cnVjdCBubGF0dHIgKnByaW9yaXR5ID0gYXR0cnNbQ1JZUFRPQ0ZHQV9QUklPUklUWV9WQUxdOworCUxJU1RfSEVBRChsaXN0KTsKKworCWlmIChwcmlvcml0eSAmJiAhc3RybGVuKHAtPmNydV9kcml2ZXJfbmFtZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWxnID0gY3J5cHRvX2FsZ19tYXRjaChwLCAxKTsKKwlpZiAoIWFsZykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlkb3duX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisKKwljcnlwdG9fcmVtb3ZlX3NwYXducyhhbGcsICZsaXN0LCBOVUxMKTsKKworCWlmIChwcmlvcml0eSkKKwkJYWxnLT5jcmFfcHJpb3JpdHkgPSBubGFfZ2V0X3UzMihwcmlvcml0eSk7CisKKwl1cF93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOworCisJY3J5cHRvX3JlbW92ZV9maW5hbCgmbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcnlwdG9fZGVsX2FsZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJCSAgc3RydWN0IG5sYXR0ciAqKmF0dHJzKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CisJc3RydWN0IGNyeXB0b191c2VyX2FsZyAqcCA9IG5sbXNnX2RhdGEobmxoKTsKKworCWFsZyA9IGNyeXB0b19hbGdfbWF0Y2gocCwgMSk7CisJaWYgKCFhbGcpCisJCXJldHVybiAtRU5PRU5UOworCisJLyogV2UgY2FuIG5vdCB1bnJlZ2lzdGVyIGNvcmUgYWxnb3JpdGhtcyBzdWNoIGFzIGFlcy1nZW5lcmljLgorCSAqIFdlIHdvdWxkIGxvb3NlIHRoZSByZWZlcmVuY2UgaW4gdGhlIGNyeXB0b19hbGdfbGlzdCB0byB0aGlzIGFsZ29yaXRobQorCSAqIGlmIHdlIHRyeSB0byB1bnJlZ2lzdGVyLiBVbnJlZ2lzdGVyaW5nIHN1Y2ggYW4gYWxnb3JpdGhtIHdpdGhvdXQKKwkgKiByZW1vdmluZyB0aGUgbW9kdWxlIGlzIG5vdCBwb3NzaWJsZSwgc28gd2UgcmVzdHJpY3QgdG8gY3J5cHRvCisJICogaW5zdGFuY2VzIHRoYXQgYXJlIGJ1aWxkIGZyb20gdGVtcGxhdGVzLiAqLworCWlmICghKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19JTlNUQU5DRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGF0b21pY19yZWFkKCZhbGctPmNyYV9yZWZjbnQpICE9IDEpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gY3J5cHRvX3VucmVnaXN0ZXJfYWxnKGFsZyk7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2FkZF9hbGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCQkgIHN0cnVjdCBubGF0dHIgKiphdHRycykKK3sKKwlpbnQgZXhhY3Q7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCXN0cnVjdCBjcnlwdG9fdXNlcl9hbGcgKnAgPSBubG1zZ19kYXRhKG5saCk7CisJc3RydWN0IG5sYXR0ciAqcHJpb3JpdHkgPSBhdHRyc1tDUllQVE9DRkdBX1BSSU9SSVRZX1ZBTF07CisKKwlpZiAoc3RybGVuKHAtPmNydV9kcml2ZXJfbmFtZSkpCisJCWV4YWN0ID0gMTsKKworCWlmIChwcmlvcml0eSAmJiAhZXhhY3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYWxnID0gY3J5cHRvX2FsZ19tYXRjaChwLCBleGFjdCk7CisJaWYgKGFsZykKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlpZiAoc3RybGVuKHAtPmNydV9kcml2ZXJfbmFtZSkpCisJCW5hbWUgPSBwLT5jcnVfZHJpdmVyX25hbWU7CisJZWxzZQorCQluYW1lID0gcC0+Y3J1X25hbWU7CisKKwlhbGcgPSBjcnlwdG9fYWxnX21vZF9sb29rdXAobmFtZSwgcC0+Y3J1X3R5cGUsIHAtPmNydV9tYXNrKTsKKwlpZiAoSVNfRVJSKGFsZykpCisJCXJldHVybiBQVFJfRVJSKGFsZyk7CisKKwlkb3duX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisKKwlpZiAocHJpb3JpdHkpCisJCWFsZy0+Y3JhX3ByaW9yaXR5ID0gbmxhX2dldF91MzIocHJpb3JpdHkpOworCisJdXBfd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKKworCWNyeXB0b19tb2RfcHV0KGFsZyk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNU0dTSVpFKHR5cGUpIHNpemVvZihzdHJ1Y3QgdHlwZSkKKworc3RhdGljIGNvbnN0IGludCBjcnlwdG9fbXNnX21pbltDUllQVE9fTlJfTVNHVFlQRVNdID0geworCVtDUllQVE9fTVNHX05FV0FMRwktIENSWVBUT19NU0dfQkFTRV0gPSBNU0dTSVpFKGNyeXB0b191c2VyX2FsZyksCisJW0NSWVBUT19NU0dfREVMQUxHCS0gQ1JZUFRPX01TR19CQVNFXSA9IE1TR1NJWkUoY3J5cHRvX3VzZXJfYWxnKSwKKwlbQ1JZUFRPX01TR19VUERBVEVBTEcJLSBDUllQVE9fTVNHX0JBU0VdID0gTVNHU0laRShjcnlwdG9fdXNlcl9hbGcpLAorCVtDUllQVE9fTVNHX0dFVEFMRwktIENSWVBUT19NU0dfQkFTRV0gPSBNU0dTSVpFKGNyeXB0b191c2VyX2FsZyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgY3J5cHRvX3BvbGljeVtDUllQVE9DRkdBX01BWCsxXSA9IHsKKwlbQ1JZUFRPQ0ZHQV9QUklPUklUWV9WQUxdICAgPSB7IC50eXBlID0gTkxBX1UzMn0sCit9OworCisjdW5kZWYgTVNHU0laRQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19saW5rIHsKKwlpbnQgKCpkb2l0KShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgbmxtc2doZHIgKiwgc3RydWN0IG5sYXR0ciAqKik7CisJaW50ICgqZHVtcCkoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKik7CisJaW50ICgqZG9uZSkoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKik7Cit9IGNyeXB0b19kaXNwYXRjaFtDUllQVE9fTlJfTVNHVFlQRVNdID0geworCVtDUllQVE9fTVNHX05FV0FMRwktIENSWVBUT19NU0dfQkFTRV0gPSB7IC5kb2l0ID0gY3J5cHRvX2FkZF9hbGd9LAorCVtDUllQVE9fTVNHX0RFTEFMRwktIENSWVBUT19NU0dfQkFTRV0gPSB7IC5kb2l0ID0gY3J5cHRvX2RlbF9hbGd9LAorCVtDUllQVE9fTVNHX1VQREFURUFMRwktIENSWVBUT19NU0dfQkFTRV0gPSB7IC5kb2l0ID0gY3J5cHRvX3VwZGF0ZV9hbGd9LAorCVtDUllQVE9fTVNHX0dFVEFMRwktIENSWVBUT19NU0dfQkFTRV0gPSB7IC5kb2l0ID0gY3J5cHRvX3JlcG9ydCwKKwkJCQkJCSAgICAgICAuZHVtcCA9IGNyeXB0b19kdW1wX3JlcG9ydCwKKwkJCQkJCSAgICAgICAuZG9uZSA9IGNyeXB0b19kdW1wX3JlcG9ydF9kb25lfSwKK307CisKK3N0YXRpYyBpbnQgY3J5cHRvX3VzZXJfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKK3sKKwlzdHJ1Y3QgbmxhdHRyICphdHRyc1tDUllQVE9DRkdBX01BWCsxXTsKKwlzdHJ1Y3QgY3J5cHRvX2xpbmsgKmxpbms7CisJaW50IHR5cGUsIGVycjsKKworCXR5cGUgPSBubGgtPm5sbXNnX3R5cGU7CisJaWYgKHR5cGUgPiBDUllQVE9fTVNHX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eXBlIC09IENSWVBUT19NU0dfQkFTRTsKKwlsaW5rID0gJmNyeXB0b19kaXNwYXRjaFt0eXBlXTsKKworCWlmIChzZWN1cml0eV9uZXRsaW5rX3JlY3Yoc2tiLCBDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICgodHlwZSA9PSAoQ1JZUFRPX01TR19HRVRBTEcgLSBDUllQVE9fTVNHX0JBU0UpICYmCisJICAgIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkpKSB7CisJCWlmIChsaW5rLT5kdW1wID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KGNyeXB0b19ubHNrLCBza2IsIG5saCwKKwkJCQkJICBsaW5rLT5kdW1wLCBsaW5rLT5kb25lLCAwKTsKKwl9CisKKwllcnIgPSBubG1zZ19wYXJzZShubGgsIGNyeXB0b19tc2dfbWluW3R5cGVdLCBhdHRycywgQ1JZUFRPQ0ZHQV9NQVgsCisJCQkgIGNyeXB0b19wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGxpbmstPmRvaXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gbGluay0+ZG9pdChza2IsIG5saCwgYXR0cnMpOworfQorCitzdGF0aWMgdm9pZCBjcnlwdG9fbmV0bGlua19yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwltdXRleF9sb2NrKCZjcnlwdG9fY2ZnX211dGV4KTsKKwluZXRsaW5rX3Jjdl9za2Ioc2tiLCAmY3J5cHRvX3VzZXJfcmN2X21zZyk7CisJbXV0ZXhfdW5sb2NrKCZjcnlwdG9fY2ZnX211dGV4KTsKK30KKworc3RhdGljIGludCBfX2luaXQgY3J5cHRvX3VzZXJfaW5pdCh2b2lkKQoreworCWNyeXB0b19ubHNrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKCZpbml0X25ldCwgTkVUTElOS19DUllQVE8sCisJCQkJCSAgICAwLCBjcnlwdG9fbmV0bGlua19yY3YsCisJCQkJCSAgICBOVUxMLCBUSElTX01PRFVMRSk7CisJaWYgKCFjcnlwdG9fbmxzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNyeXB0b191c2VyX2V4aXQodm9pZCkKK3sKKwluZXRsaW5rX2tlcm5lbF9yZWxlYXNlKGNyeXB0b19ubHNrKTsKK30KKworbW9kdWxlX2luaXQoY3J5cHRvX3VzZXJfaW5pdCk7Cittb2R1bGVfZXhpdChjcnlwdG9fdXNlcl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlN0ZWZmZW4gS2xhc3NlcnQgPHN0ZWZmZW4ua2xhc3NlcnRAc2VjdW5ldC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNyeXB0byB1c2Vyc3BhY2UgY29uZmlndXJhdGlvbiBBUEkiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9jcnlwdG9fd3EuYyBiL2NyeXB0by9jcnlwdG9fd3EuYwppbmRleCBiOTgwZWUxLi5hZGFkOTJhIDEwMDY0NAotLS0gYS9jcnlwdG8vY3J5cHRvX3dxLmMKKysrIGIvY3J5cHRvL2NyeXB0b193cS5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KICNpbmNsdWRlIDxjcnlwdG8vY3J5cHRvX3dxLmg+CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9pbnRlcm5hbC5oIGIvY3J5cHRvL2ludGVybmFsLmgKaW5kZXggZDQzODRiMC4uYjg2NWNhMSAxMDA2NDQKLS0tIGEvY3J5cHRvL2ludGVybmFsLmgKKysrIGIvY3J5cHRvL2ludGVybmFsLmgKQEAgLTg2LDYgKzg2LDkgQEAKIHZvaWQgY3J5cHRvX2xhcnZhbF9lcnJvcihjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogdm9pZCBjcnlwdG9fYWxnX3Rlc3RlZChjb25zdCBjaGFyICpuYW1lLCBpbnQgZXJyKTsKIAordm9pZCBjcnlwdG9fcmVtb3ZlX3NwYXducyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJICBzdHJ1Y3QgY3J5cHRvX2FsZyAqbmFsZyk7Cit2b2lkIGNyeXB0b19yZW1vdmVfZmluYWwoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CiB2b2lkIGNyeXB0b19zaG9vdF9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CiBzdHJ1Y3QgY3J5cHRvX3RmbSAqX19jcnlwdG9fYWxsb2NfdGZtKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsIHUzMiB0eXBlLAogCQkJCSAgICAgIHUzMiBtYXNrKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9tZDQuYyBiL2NyeXB0by9tZDQuYwppbmRleCA3ZmNhMWY1OS4uMDQ3N2E2YSAxMDA2NDQKLS0tIGEvY3J5cHRvL21kNC5jCisrKyBiL2NyeXB0by9tZDQuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Bjb21wcmVzcy5jIGIvY3J5cHRvL3Bjb21wcmVzcy5jCmluZGV4IGY3YzRhN2QuLjJlNDU4ZTUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9wY29tcHJlc3MuYworKysgYi9jcnlwdG8vcGNvbXByZXNzLmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b3VzZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiAjaW5jbHVkZSA8Y3J5cHRvL2NvbXByZXNzLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2NvbXByZXNzLmg+CkBAIC00Niw2ICs0OCwyOCBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX05FVAorc3RhdGljIGludCBjcnlwdG9fcGNvbXBfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJc3RydWN0IGNyeXB0b19yZXBvcnRfY29tcCBycGNvbXA7CisKKwlzbnByaW50ZihycGNvbXAudHlwZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwgInBjb21wIik7CisKKwlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfQ09NUFJFU1MsCisJCXNpemVvZihzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9jb21wKSwgJnJwY29tcCk7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisjZWxzZQorc3RhdGljIGludCBjcnlwdG9fcGNvbXBfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgY3J5cHRvX3Bjb21wX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIHN0YXRpYyB2b2lkIGNyeXB0b19wY29tcF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKQEAgLTYwLDYgKzg0LDcgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCS5zaG93CQk9IGNyeXB0b19wY29tcF9zaG93LAogI2VuZGlmCisJLnJlcG9ydAkJPSBjcnlwdG9fcGNvbXBfcmVwb3J0LAogCS5tYXNrY2xlYXIJPSB+Q1JZUFRPX0FMR19UWVBFX01BU0ssCiAJLm1hc2tzZXQJPSBDUllQVE9fQUxHX1RZUEVfTUFTSywKIAkudHlwZQkJPSBDUllQVE9fQUxHX1RZUEVfUENPTVBSRVNTLApkaWZmIC0tZ2l0IGEvY3J5cHRvL3Byb2MuYyBiL2NyeXB0by9wcm9jLmMKaW5kZXggMzgwODY5Ny4uNGEwYTdhYSAxMDA2NDQKLS0tIGEvY3J5cHRvL3Byb2MuYworKysgYi9jcnlwdG8vcHJvYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBmb3IgbW9kdWxlX25hbWUoKSAqLwogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CmRpZmYgLS1naXQgYS9jcnlwdG8vcm5nLmMgYi9jcnlwdG8vcm5nLmMKaW5kZXggNDUyMjlhZS4uNjRmODY0ZiAxMDA2NDQKLS0tIGEvY3J5cHRvL3JuZy5jCisrKyBiL2NyeXB0by9ybmcuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b3VzZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiBzdGF0aWMgREVGSU5FX01VVEVYKGNyeXB0b19kZWZhdWx0X3JuZ19sb2NrKTsKIHN0cnVjdCBjcnlwdG9fcm5nICpjcnlwdG9fZGVmYXVsdF9ybmc7CkBAIC01OCw2ICs2MCwzMCBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX05FVAorc3RhdGljIGludCBjcnlwdG9fcm5nX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXN0cnVjdCBjcnlwdG9fcmVwb3J0X3JuZyBycm5nOworCisJc25wcmludGYocnJuZy50eXBlLCBDUllQVE9fTUFYX0FMR19OQU1FLCAiJXMiLCAicm5nIik7CisKKwlycm5nLnNlZWRzaXplID0gYWxnLT5jcmFfcm5nLnNlZWRzaXplOworCisJTkxBX1BVVChza2IsIENSWVBUT0NGR0FfUkVQT1JUX1JORywKKwkJc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcmVwb3J0X3JuZyksICZycm5nKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKyNlbHNlCitzdGF0aWMgaW50IGNyeXB0b19ybmdfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgY3J5cHRvX3JuZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKIAlfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CiBzdGF0aWMgdm9pZCBjcnlwdG9fcm5nX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQpAQCAtNzgsNiArMTA0LDcgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCS5zaG93ID0gY3J5cHRvX3JuZ19zaG93LAogI2VuZGlmCisJLnJlcG9ydCA9IGNyeXB0b19ybmdfcmVwb3J0LAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19ybmdfdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGExX2dlbmVyaWMuYyBiL2NyeXB0by9zaGExX2dlbmVyaWMuYwppbmRleCAwMGFlNjBlLi40Mjc5NDgwIDEwMDY0NAotLS0gYS9jcnlwdG8vc2hhMV9nZW5lcmljLmMKKysrIGIvY3J5cHRvL3NoYTFfZ2VuZXJpYy5jCkBAIC0zNiw3ICszNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2hhMV91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAoraW50IGNyeXB0b19zaGExX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCiAJCQl1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CkBAIC03MSw2ICs3MSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woY3J5cHRvX3NoYTFfdXBkYXRlKTsKIAogCiAvKiBBZGQgcGFkZGluZyBhbmQgcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdC4gKi8KQEAgLTg3LDEwICs4OCwxMCBAQAogCS8qIFBhZCBvdXQgdG8gNTYgbW9kIDY0ICovCiAJaW5kZXggPSBzY3R4LT5jb3VudCAmIDB4M2Y7CiAJcGFkbGVuID0gKGluZGV4IDwgNTYpID8gKDU2IC0gaW5kZXgpIDogKCg2NCs1NikgLSBpbmRleCk7Ci0Jc2hhMV91cGRhdGUoZGVzYywgcGFkZGluZywgcGFkbGVuKTsKKwljcnlwdG9fc2hhMV91cGRhdGUoZGVzYywgcGFkZGluZywgcGFkbGVuKTsKIAogCS8qIEFwcGVuZCBsZW5ndGggKi8KLQlzaGExX3VwZGF0ZShkZXNjLCAoY29uc3QgdTggKikmYml0cywgc2l6ZW9mKGJpdHMpKTsKKwljcnlwdG9fc2hhMV91cGRhdGUoZGVzYywgKGNvbnN0IHU4ICopJmJpdHMsIHNpemVvZihiaXRzKSk7CiAKIAkvKiBTdG9yZSBzdGF0ZSBpbiBkaWdlc3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQpAQCAtMTIxLDcgKzEyMiw3IEBACiBzdGF0aWMgc3RydWN0IHNoYXNoX2FsZyBhbGcgPSB7CiAJLmRpZ2VzdHNpemUJPQlTSEExX0RJR0VTVF9TSVpFLAogCS5pbml0CQk9CXNoYTFfaW5pdCwKLQkudXBkYXRlCQk9CXNoYTFfdXBkYXRlLAorCS51cGRhdGUJCT0JY3J5cHRvX3NoYTFfdXBkYXRlLAogCS5maW5hbAkJPQlzaGExX2ZpbmFsLAogCS5leHBvcnQJCT0Jc2hhMV9leHBvcnQsCiAJLmltcG9ydAkJPQlzaGExX2ltcG9ydCwKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGFzaC5jIGIvY3J5cHRvL3NoYXNoLmMKaW5kZXggNzZmNzRiOS4uOTEwMDkxMjcgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zaGFzaC5jCisrKyBiL2NyeXB0by9zaGFzaC5jCkBAIC0xNyw2ICsxNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvdXNlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC01MjIsNiArNTI0LDMxIEBACiAJcmV0dXJuIGFsZy0+Y3JhX2N0eHNpemU7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGNyeXB0b19zaGFzaF9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9oYXNoIHJoYXNoOworCXN0cnVjdCBzaGFzaF9hbGcgKnNhbGcgPSBfX2NyeXB0b19zaGFzaF9hbGcoYWxnKTsKKworCXNucHJpbnRmKHJoYXNoLnR5cGUsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsICJzaGFzaCIpOworCXJoYXNoLmJsb2Nrc2l6ZSA9IGFsZy0+Y3JhX2Jsb2Nrc2l6ZTsKKwlyaGFzaC5kaWdlc3RzaXplID0gc2FsZy0+ZGlnZXN0c2l6ZTsKKworCU5MQV9QVVQoc2tiLCBDUllQVE9DRkdBX1JFUE9SVF9IQVNILAorCQlzaXplb2Yoc3RydWN0IGNyeXB0b19yZXBvcnRfaGFzaCksICZyaGFzaCk7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisjZWxzZQorc3RhdGljIGludCBjcnlwdG9fc2hhc2hfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgY3J5cHRvX3NoYXNoX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIHN0YXRpYyB2b2lkIGNyeXB0b19zaGFzaF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKQEAgLTU0MSw2ICs1NjgsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJLnNob3cgPSBjcnlwdG9fc2hhc2hfc2hvdywKICNlbmRpZgorCS5yZXBvcnQgPSBjcnlwdG9fc2hhc2hfcmVwb3J0LAogCS5tYXNrY2xlYXIgPSB+Q1JZUFRPX0FMR19UWVBFX01BU0ssCiAJLm1hc2tzZXQgPSBDUllQVE9fQUxHX1RZUEVfTUFTSywKIAkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9TSEFTSCwKZGlmZiAtLWdpdCBhL2NyeXB0by90Y3J5cHQuYyBiL2NyeXB0by90Y3J5cHQuYwppbmRleCAyMjIyNjE3Li4wYzRlODBmIDEwMDY0NAotLS0gYS9jcnlwdG8vdGNyeXB0LmMKKysrIGIvY3J5cHRvL3RjcnlwdC5jCkBAIC03ODIsMTEgKzc4MiwxMyBAQAogCWNhc2UgNzoKIAkJcmV0ICs9IHRjcnlwdF90ZXN0KCJlY2IoYmxvd2Zpc2gpIik7CiAJCXJldCArPSB0Y3J5cHRfdGVzdCgiY2JjKGJsb3dmaXNoKSIpOworCQlyZXQgKz0gdGNyeXB0X3Rlc3QoImN0cihibG93ZmlzaCkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDg6CiAJCXJldCArPSB0Y3J5cHRfdGVzdCgiZWNiKHR3b2Zpc2gpIik7CiAJCXJldCArPSB0Y3J5cHRfdGVzdCgiY2JjKHR3b2Zpc2gpIik7CisJCXJldCArPSB0Y3J5cHRfdGVzdCgiY3RyKHR3b2Zpc2gpIik7CiAJCWJyZWFrOwogCiAJY2FzZSA5OgpAQCAtMTAzOSw2ICsxMDQxLDEwIEBACiAJCQkJc3BlZWRfdGVtcGxhdGVfMTZfMjRfMzIpOwogCQl0ZXN0X2NpcGhlcl9zcGVlZCgiY2JjKHR3b2Zpc2gpIiwgREVDUllQVCwgc2VjLCBOVUxMLCAwLAogCQkJCXNwZWVkX3RlbXBsYXRlXzE2XzI0XzMyKTsKKwkJdGVzdF9jaXBoZXJfc3BlZWQoImN0cih0d29maXNoKSIsIEVOQ1JZUFQsIHNlYywgTlVMTCwgMCwKKwkJCQlzcGVlZF90ZW1wbGF0ZV8xNl8yNF8zMik7CisJCXRlc3RfY2lwaGVyX3NwZWVkKCJjdHIodHdvZmlzaCkiLCBERUNSWVBULCBzZWMsIE5VTEwsIDAsCisJCQkJc3BlZWRfdGVtcGxhdGVfMTZfMjRfMzIpOwogCQlicmVhazsKIAogCWNhc2UgMjAzOgpAQCAtMTA1MCw2ICsxMDU2LDEwIEBACiAJCQkJICBzcGVlZF90ZW1wbGF0ZV84XzMyKTsKIAkJdGVzdF9jaXBoZXJfc3BlZWQoImNiYyhibG93ZmlzaCkiLCBERUNSWVBULCBzZWMsIE5VTEwsIDAsCiAJCQkJICBzcGVlZF90ZW1wbGF0ZV84XzMyKTsKKwkJdGVzdF9jaXBoZXJfc3BlZWQoImN0cihibG93ZmlzaCkiLCBFTkNSWVBULCBzZWMsIE5VTEwsIDAsCisJCQkJICBzcGVlZF90ZW1wbGF0ZV84XzMyKTsKKwkJdGVzdF9jaXBoZXJfc3BlZWQoImN0cihibG93ZmlzaCkiLCBERUNSWVBULCBzZWMsIE5VTEwsIDAsCisJCQkJICBzcGVlZF90ZW1wbGF0ZV84XzMyKTsKIAkJYnJlYWs7CiAKIAljYXNlIDIwNDoKZGlmZiAtLWdpdCBhL2NyeXB0by90ZXN0bWdyLmMgYi9jcnlwdG8vdGVzdG1nci5jCmluZGV4IGI2YjkzZDQuLmU5MWMxZWIgMTAwNjQ0Ci0tLSBhL2NyeXB0by90ZXN0bWdyLmMKKysrIGIvY3J5cHRvL3Rlc3RtZ3IuYwpAQCAtMTc1Niw2ICsxNzU2LDM2IEBACiAJCQl9CiAJCX0KIAl9LCB7CisJCS5hbGcgPSAiY3RyKGJsb3dmaXNoKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSBiZl9jdHJfZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBCRl9DVFJfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSBiZl9jdHJfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBCRl9DVFJfREVDX1RFU1RfVkVDVE9SUworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJjdHIodHdvZmlzaCkiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gdGZfY3RyX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gVEZfQ1RSX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gdGZfY3RyX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gVEZfQ1RSX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CiAJCS5hbGcgPSAiY3RzKGNiYyhhZXMpKSIsCiAJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCiAJCS5zdWl0ZSA9IHsKZGlmZiAtLWdpdCBhL2NyeXB0by90ZXN0bWdyLmggYi9jcnlwdG8vdGVzdG1nci5oCmluZGV4IDI3YWRjOTIuLjM3YjRkOGYgMTAwNjQ0Ci0tLSBhL2NyeXB0by90ZXN0bWdyLmgKKysrIGIvY3J5cHRvL3Rlc3RtZ3IuaApAQCAtMjM5MSwxMCArMjM5MSwxMiBAQAogLyoKICAqIEJsb3dmaXNoIHRlc3QgdmVjdG9ycy4KICAqLwotI2RlZmluZSBCRl9FTkNfVEVTVF9WRUNUT1JTCTYKLSNkZWZpbmUgQkZfREVDX1RFU1RfVkVDVE9SUwk2Ci0jZGVmaW5lIEJGX0NCQ19FTkNfVEVTVF9WRUNUT1JTCTEKLSNkZWZpbmUgQkZfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMJMQorI2RlZmluZSBCRl9FTkNfVEVTVF9WRUNUT1JTCTcKKyNkZWZpbmUgQkZfREVDX1RFU1RfVkVDVE9SUwk3CisjZGVmaW5lIEJGX0NCQ19FTkNfVEVTVF9WRUNUT1JTCTIKKyNkZWZpbmUgQkZfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMJMgorI2RlZmluZSBCRl9DVFJfRU5DX1RFU1RfVkVDVE9SUwkyCisjZGVmaW5lIEJGX0NUUl9ERUNfVEVTVF9WRUNUT1JTCTIKIAogc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBiZl9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKIAl7IC8qIERFUyB0ZXN0IHZlY3RvcnMgZnJvbSBPcGVuU1NMICovCkBAIC0yNDQ4LDYgKzI0NTAsMjQgQEAKIAkJLmlsZW4JPSA4LAogCQkucmVzdWx0CT0gIlx4YzBceDQ1XHgwNFx4MDFceDJlXHg0ZVx4MWZceDUzIiwKIAkJLnJsZW4JPSA4LAorCX0sIHsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDXHhGOSIKKwkJCSAgIlx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkRceDRBIgorCQkJICAiXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRVx4OUIiCisJCQkgICJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGXHg1NSIsCisJCS5rbGVuCT0gMzIsCisJCS5pbnB1dAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IiwKKwkJLmlsZW4JPSA0MCwKKwkJLnJlc3VsdAk9ICJceDk2XHg4N1x4M0RceDBDXHg3Qlx4RkJceEJEXHgxRiIKKwkJCSAgIlx4RTNceEMxXHg5OVx4NkRceDM5XHhENFx4QzJceDdEIgorCQkJICAiXHhEN1x4ODdceEExXHhGMlx4REZceDUxXHg3MVx4MjYiCisJCQkgICJceEMyXHhGNFx4NkRceEZGXHhGNlx4Q0RceDZCXHg0MCIKKwkJCSAgIlx4RTFceEIzXHhCRlx4RDRceDM4XHgyQlx4QzhceDNCIiwKKwkJLnJsZW4JPSA0MCwKIAl9LAogfTsKIApAQCAtMjUwMyw2ICsyNTIzLDI0IEBACiAJCS5pbGVuCT0gOCwKIAkJLnJlc3VsdAk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCiAJCS5ybGVuCT0gOCwKKwl9LCB7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaW5wdXQJPSAiXHg5Nlx4ODdceDNEXHgwQ1x4N0JceEZCXHhCRFx4MUYiCisJCQkgICJceEUzXHhDMVx4OTlceDZEXHgzOVx4RDRceEMyXHg3RCIKKwkJCSAgIlx4RDdceDg3XHhBMVx4RjJceERGXHg1MVx4NzFceDI2IgorCQkJICAiXHhDMlx4RjRceDZEXHhGRlx4RjZceENEXHg2Qlx4NDAiCisJCQkgICJceEUxXHhCM1x4QkZceEQ0XHgzOFx4MkJceEM4XHgzQiIsCisJCS5pbGVuCT0gNDAsCisJCS5yZXN1bHQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIsCisJCS5ybGVuCT0gNDAsCiAJfSwKIH07CiAKQEAgLTI1MjIsNiArMjU2MCwyNSBAQAogCQkJICAiXHg1OFx4ZGVceGI5XHhlN1x4MTVceDQ2XHgxNlx4ZDkiCiAJCQkgICJceDU5XHhmMVx4NjVceDJiXHhkNVx4ZmZceDkyXHhjYyIsCiAJCS5ybGVuCT0gMzIsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4ODVceDYyXHgzRlx4MUNceEY5XHhENlx4MUNceEY5IgorCQkJICAiXHhENlx4QjNceDkwXHg2RFx4NEFceDkwXHg2RFx4NEEiCisJCQkgICJceDI3XHgwNFx4RTFceDI3XHgwNFx4RTFceEJFXHg5QiIKKwkJCSAgIlx4NzhceEJFXHg5Qlx4NzhceDU1XHgzMlx4MEZceDU1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLml2CT0gIlx4RTJceDI0XHg4OVx4RUVceDUzXHhCOFx4MURceDVGIiwKKwkJLmlucHV0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiLAorCQkuaWxlbgk9IDQwLAorCQkucmVzdWx0CT0gIlx4QjRceEZFXHhBNVx4QkJceDNEXHgyQ1x4MjdceDA2IgorCQkJICAiXHgwNlx4MkJceDNBXHg5Mlx4QjJceEY1XHg1RVx4NjIiCisJCQkgICJceDg0XHhDRFx4RjdceDY2XHg3RVx4NDFceDZDXHg4RSIKKwkJCSAgIlx4MUJceEQ5XHgwMlx4QjZceDQ4XHhCMFx4ODdceDI1IgorCQkJICAiXHgwMVx4OUNceDkzXHg2M1x4NTFceDYwXHg4Mlx4RDIiLAorCQkucmxlbgk9IDQwLAogCX0sCiB9OwogCkBAIC0yNTQxLDE2ICsyNTk4LDEyNSBAQAogCQkJICAiXHg2OFx4NjVceDIwXHg3NFx4NjlceDZkXHg2NVx4MjAiCiAJCQkgICJceDY2XHg2Zlx4NzJceDIwXHgwMFx4MDBceDAwXHgwMCIsCiAJCS5ybGVuCT0gMzIsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4ODVceDYyXHgzRlx4MUNceEY5XHhENlx4MUNceEY5IgorCQkJICAiXHhENlx4QjNceDkwXHg2RFx4NEFceDkwXHg2RFx4NEEiCisJCQkgICJceDI3XHgwNFx4RTFceDI3XHgwNFx4RTFceEJFXHg5QiIKKwkJCSAgIlx4NzhceEJFXHg5Qlx4NzhceDU1XHgzMlx4MEZceDU1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLml2CT0gIlx4RTJceDI0XHg4OVx4RUVceDUzXHhCOFx4MURceDVGIiwKKwkJLmlucHV0CT0gIlx4QjRceEZFXHhBNVx4QkJceDNEXHgyQ1x4MjdceDA2IgorCQkJICAiXHgwNlx4MkJceDNBXHg5Mlx4QjJceEY1XHg1RVx4NjIiCisJCQkgICJceDg0XHhDRFx4RjdceDY2XHg3RVx4NDFceDZDXHg4RSIKKwkJCSAgIlx4MUJceEQ5XHgwMlx4QjZceDQ4XHhCMFx4ODdceDI1IgorCQkJICAiXHgwMVx4OUNceDkzXHg2M1x4NTFceDYwXHg4Mlx4RDIiLAorCQkuaWxlbgk9IDQwLAorCQkucmVzdWx0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiLAorCQkucmxlbgk9IDQwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGJmX2N0cl9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiLAorCQkuaW5wdXQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIsCisJCS5pbGVuCT0gNDAsCisJCS5yZXN1bHQJPSAiXHhDN1x4QTNceERGXHhCOVx4MDVceEY0XHg5RVx4OEQiCisJCQkgICJceDlFXHhERlx4MzhceDE4XHg4M1x4MDdceEVGXHhDMSIKKwkJCSAgIlx4OTNceDNDXHhBQVx4QUFceEZFXHgwNlx4NDJceENDIgorCQkJICAiXHgwRFx4NzBceDg2XHg1QVx4NDRceEFEXHg4NVx4MTciCisJCQkgICJceEU0XHgxRlx4NUVceEE1XHg4OVx4QUNceDMyXHhCQyIsCisJCS5ybGVuCT0gNDAsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4ODVceDYyXHgzRlx4MUNceEY5XHhENlx4MUNceEY5IgorCQkJICAiXHhENlx4QjNceDkwXHg2RFx4NEFceDkwXHg2RFx4NEEiCisJCQkgICJceDI3XHgwNFx4RTFceDI3XHgwNFx4RTFceEJFXHg5QiIKKwkJCSAgIlx4NzhceEJFXHg5Qlx4NzhceDU1XHgzMlx4MEZceDU1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLml2CT0gIlx4RTJceDI0XHg4OVx4RUVceDUzXHhCOFx4MURceDVGIiwKKwkJLmlucHV0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiCisJCQkgICJceDZEXHgwNFx4OUIiLAorCQkuaWxlbgk9IDQzLAorCQkucmVzdWx0CT0gIlx4QzdceEEzXHhERlx4QjlceDA1XHhGNFx4OUVceDhEIgorCQkJICAiXHg5RVx4REZceDM4XHgxOFx4ODNceDA3XHhFRlx4QzEiCisJCQkgICJceDkzXHgzQ1x4QUFceEFBXHhGRVx4MDZceDQyXHhDQyIKKwkJCSAgIlx4MERceDcwXHg4Nlx4NUFceDQ0XHhBRFx4ODVceDE3IgorCQkJICAiXHhFNFx4MUZceDVFXHhBNVx4ODlceEFDXHgzMlx4QkMiCisJCQkgICJceDNEXHhBN1x4RTkiLAorCQkucmxlbgk9IDQzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGJmX2N0cl9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiLAorCQkuaW5wdXQJPSAiXHhDN1x4QTNceERGXHhCOVx4MDVceEY0XHg5RVx4OEQiCisJCQkgICJceDlFXHhERlx4MzhceDE4XHg4M1x4MDdceEVGXHhDMSIKKwkJCSAgIlx4OTNceDNDXHhBQVx4QUFceEZFXHgwNlx4NDJceENDIgorCQkJICAiXHgwRFx4NzBceDg2XHg1QVx4NDRceEFEXHg4NVx4MTciCisJCQkgICJceEU0XHgxRlx4NUVceEE1XHg4OVx4QUNceDMyXHhCQyIsCisJCS5pbGVuCT0gNDAsCisJCS5yZXN1bHQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIsCisJCS5ybGVuCT0gNDAsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4ODVceDYyXHgzRlx4MUNceEY5XHhENlx4MUNceEY5IgorCQkJICAiXHhENlx4QjNceDkwXHg2RFx4NEFceDkwXHg2RFx4NEEiCisJCQkgICJceDI3XHgwNFx4RTFceDI3XHgwNFx4RTFceEJFXHg5QiIKKwkJCSAgIlx4NzhceEJFXHg5Qlx4NzhceDU1XHgzMlx4MEZceDU1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLml2CT0gIlx4RTJceDI0XHg4OVx4RUVceDUzXHhCOFx4MURceDVGIiwKKwkJLmlucHV0CT0gIlx4QzdceEEzXHhERlx4QjlceDA1XHhGNFx4OUVceDhEIgorCQkJICAiXHg5RVx4REZceDM4XHgxOFx4ODNceDA3XHhFRlx4QzEiCisJCQkgICJceDkzXHgzQ1x4QUFceEFBXHhGRVx4MDZceDQyXHhDQyIKKwkJCSAgIlx4MERceDcwXHg4Nlx4NUFceDQ0XHhBRFx4ODVceDE3IgorCQkJICAiXHhFNFx4MUZceDVFXHhBNVx4ODlceEFDXHgzMlx4QkMiCisJCQkgICJceDNEXHhBN1x4RTkiLAorCQkuaWxlbgk9IDQzLAorCQkucmVzdWx0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiCisJCQkgICJceDZEXHgwNFx4OUIiLAorCQkucmxlbgk9IDQzLAogCX0sCiB9OwogCiAvKgogICogVHdvZmlzaCB0ZXN0IHZlY3RvcnMuCiAgKi8KLSNkZWZpbmUgVEZfRU5DX1RFU1RfVkVDVE9SUwkJMwotI2RlZmluZSBURl9ERUNfVEVTVF9WRUNUT1JTCQkzCi0jZGVmaW5lIFRGX0NCQ19FTkNfVEVTVF9WRUNUT1JTCQk0Ci0jZGVmaW5lIFRGX0NCQ19ERUNfVEVTVF9WRUNUT1JTCQk0CisjZGVmaW5lIFRGX0VOQ19URVNUX1ZFQ1RPUlMJCTQKKyNkZWZpbmUgVEZfREVDX1RFU1RfVkVDVE9SUwkJNAorI2RlZmluZSBURl9DQkNfRU5DX1RFU1RfVkVDVE9SUwkJNQorI2RlZmluZSBURl9DQkNfREVDX1RFU1RfVkVDVE9SUwkJNQorI2RlZmluZSBURl9DVFJfRU5DX1RFU1RfVkVDVE9SUwkJMgorI2RlZmluZSBURl9DVFJfREVDX1RFU1RfVkVDVE9SUwkJMgogCiBzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHRmX2VuY190dl90ZW1wbGF0ZVtdID0gewogCXsKQEAgLTI1ODIsNiArMjc0OCwzMCBAQAogCQkucmVzdWx0CT0gIlx4MzdceDUyXHg3Ylx4ZTBceDA1XHgyM1x4MzRceGI4IgogCQkJICAiXHg5Zlx4MGNceGZjXHhjYVx4ZThceDdjXHhmYVx4MjAiLAogCQkucmxlbgk9IDE2LAorCX0sIHsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDNGXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQyIKKwkJCSAgIlx4RjlceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEIgorCQkJICAiXHg0QVx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkUiCisJCQkgICJceDlCXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRiIsCisJCS5rbGVuCT0gMzIsCisJCS5pbnB1dAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IgorCQkJICAiXHg2RFx4MDRceDlCXHgwRlx4QTZceDNEXHhENFx4NDgiCisJCQkgICJceERGXHg3Nlx4MERceDgxXHgxOFx4QUZceDIzXHhCQSIKKwkJCSAgIlx4NTFceEU4XHg1Q1x4RjNceDhBXHgyMVx4OTVceDJDIiwKKwkJLmlsZW4JPSA2NCwKKwkJLnJlc3VsdAk9ICJceDg4XHhDQlx4MUVceEMyXHhBRlx4OEFceDk3XHhGRiIKKwkJCSAgIlx4RjZceDkwXHg0Nlx4OUNceDRBXHgwRlx4MDhceERDIgorCQkJICAiXHhERVx4QUJceEFEXHhGQVx4RkNceEE4XHhDMlx4M0QiCisJCQkgICJceEUwXHhFNFx4OEJceDNGXHhENVx4QTNceEY3XHgxNCIKKwkJCSAgIlx4MzRceDlFXHhCNlx4MDhceEIyXHhERFx4QThceEY1IgorCQkJICAiXHhERlx4RkFceEM3XHhFOFx4MDlceDUwXHg3Nlx4MDgiCisJCQkgICJceEEyXHhCNlx4NkFceDU5XHhDMFx4MkJceDZEXHgwNSIKKwkJCSAgIlx4ODlceEY2XHg4Mlx4RjBceEQzXHhEQlx4MDZceDAyIiwKKwkJLnJsZW4JPSA2NCwKIAl9LAogfTsKIApAQCAtMjYxNSw2ICsyODA1LDMwIEBACiAJCS5pbGVuCT0gMTYsCiAJCS5yZXN1bHQJPSB6ZXJvZWRfc3RyaW5nLAogCQkucmxlbgk9IDE2LAorCX0sIHsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDNGXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQyIKKwkJCSAgIlx4RjlceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEIgorCQkJICAiXHg0QVx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkUiCisJCQkgICJceDlCXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRiIsCisJCS5rbGVuCT0gMzIsCisJCS5pbnB1dAk9ICJceDg4XHhDQlx4MUVceEMyXHhBRlx4OEFceDk3XHhGRiIKKwkJCSAgIlx4RjZceDkwXHg0Nlx4OUNceDRBXHgwRlx4MDhceERDIgorCQkJICAiXHhERVx4QUJceEFEXHhGQVx4RkNceEE4XHhDMlx4M0QiCisJCQkgICJceEUwXHhFNFx4OEJceDNGXHhENVx4QTNceEY3XHgxNCIKKwkJCSAgIlx4MzRceDlFXHhCNlx4MDhceEIyXHhERFx4QThceEY1IgorCQkJICAiXHhERlx4RkFceEM3XHhFOFx4MDlceDUwXHg3Nlx4MDgiCisJCQkgICJceEEyXHhCNlx4NkFceDU5XHhDMFx4MkJceDZEXHgwNSIKKwkJCSAgIlx4ODlceEY2XHg4Mlx4RjBceEQzXHhEQlx4MDZceDAyIiwKKwkJLmlsZW4JPSA2NCwKKwkJLnJlc3VsdAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IgorCQkJICAiXHg2RFx4MDRceDlCXHgwRlx4QTZceDNEXHhENFx4NDgiCisJCQkgICJceERGXHg3Nlx4MERceDgxXHgxOFx4QUZceDIzXHhCQSIKKwkJCSAgIlx4NTFceEU4XHg1Q1x4RjNceDhBXHgyMVx4OTVceDJDIiwKKwkJLnJsZW4JPSA2NCwKIAl9LAogfTsKIApAQCAtMjY2MSw2ICsyODc1LDMyIEBACiAJCQkgICJceDA1XHhlZlx4OGNceDYxXHhhOFx4MTFceDU4XHgyNiIKIAkJCSAgIlx4MzRceGJhXHg1Y1x4YjdceDEwXHg2YVx4YTZceDQxIiwKIAkJLnJsZW4JPSA0OCwKKwl9LCB7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiCisJCQkgICJceEM0XHgyOVx4OEVceEYzXHgzNVx4OUFceEZGXHg2NCIsCisJCS5pbnB1dAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IgorCQkJICAiXHg2RFx4MDRceDlCXHgwRlx4QTZceDNEXHhENFx4NDgiCisJCQkgICJceERGXHg3Nlx4MERceDgxXHgxOFx4QUZceDIzXHhCQSIKKwkJCSAgIlx4NTFceEU4XHg1Q1x4RjNceDhBXHgyMVx4OTVceDJDIiwKKwkJLmlsZW4JPSA2NCwKKwkJLnJlc3VsdAk9ICJceEM4XHhGRlx4RjJceDUzXHhBNlx4MjdceDA5XHhEMSIKKwkJCSAgIlx4MzNceDM4XHhDMlx4QzBceDBDXHgxNFx4N0VceEI1IgorCQkJICAiXHgyNlx4MUJceDA1XHgwQ1x4MDVceDEyXHgzRlx4QzAiCisJCQkgICJceEY5XHgxQ1x4MDJceDI4XHg0MFx4OTZceDZGXHhEMCIKKwkJCSAgIlx4M0RceDMyXHhERlx4REFceDU2XHgwMFx4NkVceEVFIgorCQkJICAiXHg1Qlx4MkFceDcyXHg5RFx4QzJceDREXHgxOVx4QkMiCisJCQkgICJceDhDXHg1M1x4RkFceDg3XHg2Rlx4RERceDgxXHhBMyIKKwkJCSAgIlx4QjFceEQzXHg0NFx4NjVceERGXHhFN1x4NjNceDM4IiwKKwkJLnJsZW4JPSA2NCwKIAl9LAogfTsKIApAQCAtMjcwNyw2ICsyOTQ3LDE0OCBAQAogCQkuaWxlbgk9IDQ4LAogCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKIAkJLnJsZW4JPSA0OCwKKwl9LCB7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiCisJCQkgICJceEM0XHgyOVx4OEVceEYzXHgzNVx4OUFceEZGXHg2NCIsCisJCS5pbnB1dAk9ICJceEM4XHhGRlx4RjJceDUzXHhBNlx4MjdceDA5XHhEMSIKKwkJCSAgIlx4MzNceDM4XHhDMlx4QzBceDBDXHgxNFx4N0VceEI1IgorCQkJICAiXHgyNlx4MUJceDA1XHgwQ1x4MDVceDEyXHgzRlx4QzAiCisJCQkgICJceEY5XHgxQ1x4MDJceDI4XHg0MFx4OTZceDZGXHhEMCIKKwkJCSAgIlx4M0RceDMyXHhERlx4REFceDU2XHgwMFx4NkVceEVFIgorCQkJICAiXHg1Qlx4MkFceDcyXHg5RFx4QzJceDREXHgxOVx4QkMiCisJCQkgICJceDhDXHg1M1x4RkFceDg3XHg2Rlx4RERceDgxXHhBMyIKKwkJCSAgIlx4QjFceEQzXHg0NFx4NjVceERGXHhFN1x4NjNceDM4IiwKKwkJLmlsZW4JPSA2NCwKKwkJLnJlc3VsdAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IgorCQkJICAiXHg2RFx4MDRceDlCXHgwRlx4QTZceDNEXHhENFx4NDgiCisJCQkgICJceERGXHg3Nlx4MERceDgxXHgxOFx4QUZceDIzXHhCQSIKKwkJCSAgIlx4NTFceEU4XHg1Q1x4RjNceDhBXHgyMVx4OTVceDJDIiwKKwkJLnJsZW4JPSA2NCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB0Zl9jdHJfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4ODVceDYyXHgzRlx4MUNceEY5XHhENlx4MUNceEY5IgorCQkJICAiXHhENlx4QjNceDkwXHg2RFx4NEFceDkwXHg2RFx4NEEiCisJCQkgICJceDI3XHgwNFx4RTFceDI3XHgwNFx4RTFceEJFXHg5QiIKKwkJCSAgIlx4NzhceEJFXHg5Qlx4NzhceDU1XHgzMlx4MEZceDU1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLml2CT0gIlx4RTJceDI0XHg4OVx4RUVceDUzXHhCOFx4MURceDVGIgorCQkJICAiXHhDNFx4MjlceDhFXHhGM1x4MzVceDlBXHhGRlx4NjQiLAorCQkuaW5wdXQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIKKwkJCSAgIlx4NkRceDA0XHg5Qlx4MEZceEE2XHgzRFx4RDRceDQ4IgorCQkJICAiXHhERlx4NzZceDBEXHg4MVx4MThceEFGXHgyM1x4QkEiCisJCQkgICJceDUxXHhFOFx4NUNceEYzXHg4QVx4MjFceDk1XHgyQyIsCisJCS5pbGVuCT0gNjQsCisJCS5yZXN1bHQJPSAiXHhERlx4RERceDY5XHhGQVx4QjBceDJFXHhGRFx4RkUiCisJCQkgICJceDcwXHg5RVx4QzVceDRCXHhDOVx4RDRceEExXHgzMCIKKwkJCSAgIlx4MjZceDlCXHg4OVx4QTFceEVFXHg0M1x4RTBceDUyIgorCQkJICAiXHg1NVx4MTdceDRFXHhDN1x4MEVceDMzXHgxRlx4RjEiCisJCQkgICJceDlGXHg4RFx4NDBceDlGXHgyNFx4RkRceDkyXHhBMCIKKwkJCSAgIlx4QkNceDhGXHgzNVx4RERceDY3XHgzOFx4RDhceEFBIgorCQkJICAiXHhDRlx4RjhceDQ4XHhDQVx4RkJceEU0XHg1Q1x4NjAiCisJCQkgICJceDAxXHg0MVx4MjFceDEyXHgzOFx4QUJceDUyXHg0RiIsCisJCS5ybGVuCT0gNjQsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4ODVceDYyXHgzRlx4MUNceEY5XHhENlx4MUNceEY5IgorCQkJICAiXHhENlx4QjNceDkwXHg2RFx4NEFceDkwXHg2RFx4NEEiCisJCQkgICJceDI3XHgwNFx4RTFceDI3XHgwNFx4RTFceEJFXHg5QiIKKwkJCSAgIlx4NzhceEJFXHg5Qlx4NzhceDU1XHgzMlx4MEZceDU1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLml2CT0gIlx4RTJceDI0XHg4OVx4RUVceDUzXHhCOFx4MURceDVGIgorCQkJICAiXHhDNFx4MjlceDhFXHhGM1x4MzVceDlBXHhGRlx4NjQiLAorCQkuaW5wdXQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIKKwkJCSAgIlx4NkRceDA0XHg5Qlx4MEZceEE2XHgzRFx4RDRceDQ4IgorCQkJICAiXHhERlx4NzZceDBEXHg4MVx4MThceEFGXHgyM1x4QkEiCisJCQkgICJceDUxXHhFOFx4NUNceEYzXHg4QVx4MjFceDk1XHgyQyIKKwkJCSAgIlx4QzNceDM3XHhDRSIsCisJCS5pbGVuCT0gNjcsCisJCS5yZXN1bHQJPSAiXHhERlx4RERceDY5XHhGQVx4QjBceDJFXHhGRFx4RkUiCisJCQkgICJceDcwXHg5RVx4QzVceDRCXHhDOVx4RDRceEExXHgzMCIKKwkJCSAgIlx4MjZceDlCXHg4OVx4QTFceEVFXHg0M1x4RTBceDUyIgorCQkJICAiXHg1NVx4MTdceDRFXHhDN1x4MEVceDMzXHgxRlx4RjEiCisJCQkgICJceDlGXHg4RFx4NDBceDlGXHgyNFx4RkRceDkyXHhBMCIKKwkJCSAgIlx4QkNceDhGXHgzNVx4RERceDY3XHgzOFx4RDhceEFBIgorCQkJICAiXHhDRlx4RjhceDQ4XHhDQVx4RkJceEU0XHg1Q1x4NjAiCisJCQkgICJceDAxXHg0MVx4MjFceDEyXHgzOFx4QUJceDUyXHg0RiIKKwkJCSAgIlx4QThceDU3XHgyMCIsCisJCS5ybGVuCT0gNjcsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgdGZfY3RyX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDXHhGOSIKKwkJCSAgIlx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkRceDRBIgorCQkJICAiXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRVx4OUIiCisJCQkgICJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGXHg1NSIsCisJCS5rbGVuCT0gMzIsCisJCS5pdgk9ICJceEUyXHgyNFx4ODlceEVFXHg1M1x4QjhceDFEXHg1RiIKKwkJCSAgIlx4QzRceDI5XHg4RVx4RjNceDM1XHg5QVx4RkZceDY0IiwKKwkJLmlucHV0CT0gIlx4REZceEREXHg2OVx4RkFceEIwXHgyRVx4RkRceEZFIgorCQkJICAiXHg3MFx4OUVceEM1XHg0Qlx4QzlceEQ0XHhBMVx4MzAiCisJCQkgICJceDI2XHg5Qlx4ODlceEExXHhFRVx4NDNceEUwXHg1MiIKKwkJCSAgIlx4NTVceDE3XHg0RVx4QzdceDBFXHgzM1x4MUZceEYxIgorCQkJICAiXHg5Rlx4OERceDQwXHg5Rlx4MjRceEZEXHg5Mlx4QTAiCisJCQkgICJceEJDXHg4Rlx4MzVceEREXHg2N1x4MzhceEQ4XHhBQSIKKwkJCSAgIlx4Q0ZceEY4XHg0OFx4Q0FceEZCXHhFNFx4NUNceDYwIgorCQkJICAiXHgwMVx4NDFceDIxXHgxMlx4MzhceEFCXHg1Mlx4NEYiLAorCQkuaWxlbgk9IDY0LAorCQkucmVzdWx0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiCisJCQkgICJceDZEXHgwNFx4OUJceDBGXHhBNlx4M0RceEQ0XHg0OCIKKwkJCSAgIlx4REZceDc2XHgwRFx4ODFceDE4XHhBRlx4MjNceEJBIgorCQkJICAiXHg1MVx4RThceDVDXHhGM1x4OEFceDIxXHg5NVx4MkMiLAorCQkucmxlbgk9IDY0LAorCX0sIHsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDXHhGOSIKKwkJCSAgIlx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkRceDRBIgorCQkJICAiXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRVx4OUIiCisJCQkgICJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGXHg1NSIsCisJCS5rbGVuCT0gMzIsCisJCS5pdgk9ICJceEUyXHgyNFx4ODlceEVFXHg1M1x4QjhceDFEXHg1RiIKKwkJCSAgIlx4QzRceDI5XHg4RVx4RjNceDM1XHg5QVx4RkZceDY0IiwKKwkJLmlucHV0CT0gIlx4REZceEREXHg2OVx4RkFceEIwXHgyRVx4RkRceEZFIgorCQkJICAiXHg3MFx4OUVceEM1XHg0Qlx4QzlceEQ0XHhBMVx4MzAiCisJCQkgICJceDI2XHg5Qlx4ODlceEExXHhFRVx4NDNceEUwXHg1MiIKKwkJCSAgIlx4NTVceDE3XHg0RVx4QzdceDBFXHgzM1x4MUZceEYxIgorCQkJICAiXHg5Rlx4OERceDQwXHg5Rlx4MjRceEZEXHg5Mlx4QTAiCisJCQkgICJceEJDXHg4Rlx4MzVceEREXHg2N1x4MzhceEQ4XHhBQSIKKwkJCSAgIlx4Q0ZceEY4XHg0OFx4Q0FceEZCXHhFNFx4NUNceDYwIgorCQkJICAiXHgwMVx4NDFceDIxXHgxMlx4MzhceEFCXHg1Mlx4NEYiCisJCQkgICJceEE4XHg1N1x4MjAiLAorCQkuaWxlbgk9IDY3LAorCQkucmVzdWx0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiCisJCQkgICJceDZEXHgwNFx4OUJceDBGXHhBNlx4M0RceEQ0XHg0OCIKKwkJCSAgIlx4REZceDc2XHgwRFx4ODFceDE4XHhBRlx4MjNceEJBIgorCQkJICAiXHg1MVx4RThceDVDXHhGM1x4OEFceDIxXHg5NVx4MkMiCisJCQkgICJceEMzXHgzN1x4Q0UiLAorCQkucmxlbgk9IDY3LAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9jcnlwdG8vdm1hYy5jIGIvY3J5cHRvL3ZtYWMuYwppbmRleCBmMzVmZjhhLi40MjQzOTA1IDEwMDY0NAotLS0gYS9jcnlwdG8vdm1hYy5jCisrKyBiL2NyeXB0by92bWFjLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxjcnlwdG8vc2NhdHRlcndhbGsuaD4KZGlmZiAtLWdpdCBhL2NyeXB0by93cDUxMi5jIGIvY3J5cHRvL3dwNTEyLmMKaW5kZXggNzIzNDI3Mi4uNzE3MTlhMiAxMDA2NDQKLS0tIGEvY3J5cHRvL3dwNTEyLmMKKysrIGIvY3J5cHRvL3dwNTEyLmMKQEAgLTc2MiwxMSArNzYyLDE3IEBACiAJMHg4NjIyODY0NGE0MTFjMjg2VUxMLAogfTsKIAotc3RhdGljIGNvbnN0IHU2NCByY1tXSElSTFBPT0xfUk9VTkRTICsgMV0gPSB7Ci0JMHgwMDAwMDAwMDAwMDAwMDAwVUxMLCAweDE4MjNjNmU4ODdiODAxNGZVTEwsIDB4MzZhNmQyZjU3OTZmOTE1MlVMTCwKLQkweDYwYmM5YjhlYTMwYzdiMzVVTEwsIDB4MWRlMGQ3YzIyZTRiZmU1N1VMTCwgMHgxNTc3MzdlNTlmZjA0YWRhVUxMLAotCTB4NThjOTI5MGFiMWEwNmI4NVVMTCwgMHhiZDVkMTBmNGNiM2UwNTY3VUxMLCAweGU0Mjc0MThiYTc3ZDk1ZDhVTEwsCi0JMHhmYmVlN2M2NmRkMTc0NzllVUxMLCAweGNhMmRiZjA3YWQ1YTgzMzNVTEwsCitzdGF0aWMgY29uc3QgdTY0IHJjW1dISVJMUE9PTF9ST1VORFNdID0geworCTB4MTgyM2M2ZTg4N2I4MDE0ZlVMTCwKKwkweDM2YTZkMmY1Nzk2ZjkxNTJVTEwsCisJMHg2MGJjOWI4ZWEzMGM3YjM1VUxMLAorCTB4MWRlMGQ3YzIyZTRiZmU1N1VMTCwKKwkweDE1NzczN2U1OWZmMDRhZGFVTEwsCisJMHg1OGM5MjkwYWIxYTA2Yjg1VUxMLAorCTB4YmQ1ZDEwZjRjYjNlMDU2N1VMTCwKKwkweGU0Mjc0MThiYTc3ZDk1ZDhVTEwsCisJMHhmYmVlN2M2NmRkMTc0NzllVUxMLAorCTB4Y2EyZGJmMDdhZDVhODMzM1VMTCwKIH07CiAKIC8qKgpAQCAtNzkzLDcgKzc5OSw3IEBACiAJc3RhdGVbNl0gPSBibG9ja1s2XSBeIChLWzZdID0gd2N0eC0+aGFzaFs2XSk7CiAJc3RhdGVbN10gPSBibG9ja1s3XSBeIChLWzddID0gd2N0eC0+aGFzaFs3XSk7CiAKLQlmb3IgKHIgPSAxOyByIDw9IFdISVJMUE9PTF9ST1VORFM7IHIrKykgeworCWZvciAociA9IDA7IHIgPCBXSElSTFBPT0xfUk9VTkRTOyByKyspIHsKIAogCQlMWzBdID0gQzBbKGludCkoS1swXSA+PiA1NikgICAgICAgXSBeCiAJCQkgICBDMVsoaW50KShLWzddID4+IDQ4KSAmIDB4ZmZdIF4KZGlmZiAtLWdpdCBhL2NyeXB0by94Y2JjLmMgYi9jcnlwdG8veGNiYy5jCmluZGV4IGJiN2I2N2YuLmE1ZmJkZjMgMTAwNjQ0Ci0tLSBhL2NyeXB0by94Y2JjLmMKKysrIGIvY3J5cHRvL3hjYmMuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyB1X2ludDMyX3Qga3NbMTJdID0gezB4MDEwMTAxMDEsIDB4MDEwMTAxMDEsIDB4MDEwMTAxMDEsIDB4MDEwMTAxMDEsCiAJCQkgICAweDAyMDIwMjAyLCAweDAyMDIwMjAyLCAweDAyMDIwMjAyLCAweDAyMDIwMjAyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZhY2UuYwppbmRleCBlMTE0MTQwLi5mNGY1MjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZhY2UuYwpAQCAtNDEsNiArNDEsNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlICJhY2NvbW1vbi5oIgogI2luY2x1ZGUgImFjbmFtZXNwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZldm50LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZldm50LmMKaW5kZXggYzU3YjVjNy4uMjA1MTZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZXZudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmV2bnQuYwpAQCAtNDEsNiArNDEsNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlICJhY2NvbW1vbi5oIgogI2luY2x1ZGUgImFjdGFibGVzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZncGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCmluZGV4IDUyYWFmZjMuLmYwNmEzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCkBAIC00MSw2ICs0MSw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNldmVudHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZnJlZ24uYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZnJlZ24uYwppbmRleCAwMGNkOTU2Li5hZWU4ODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZyZWduLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmcmVnbi5jCkBAIC00Miw2ICs0Miw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNuYW1lc3AuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdyZWdzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3cmVncy5jCmluZGV4IDU1YWNjYjcuLmNjNzBmM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdyZWdzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3JlZ3MuYwpAQCAtMjY5LDE2ICsyNjksMTcgQEAKIAogCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAogCQkJCQlBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KKworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlnb3RvIGV4aXQ7CiAKIAkvKiBDbGVhciB0aGUgR1BFIEJpdHMgaW4gYWxsIEdQRSByZWdpc3RlcnMgaW4gYWxsIEdQRSBibG9ja3MgKi8KIAogCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2h3X2NsZWFyX2dwZV9ibG9jaywgTlVMTCk7CiAKLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrLCBsb2NrX2ZsYWdzKTsKK2V4aXQ6CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdzbGVlcC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3NsZWVwLmMKaW5kZXggMmFjMjhiYi4uZDUyZGEzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3NsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3NsZWVwLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlICJhY2NvbW1vbi5oIgogI2luY2x1ZGUgImFjdGFibGVzLmgiCiAjaW5jbHVkZSA8bGludXgvdGJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKIEFDUElfTU9EVUxFX05BTUUoImh3c2xlZXAiKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3RpbWVyLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3dGltZXIuYwppbmRleCA5YzhlYjcxLi41MGQyMWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3dGltZXIuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3dGltZXIuYwpAQCAtNDIsNiArNDIsNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlICJhY2NvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd4ZmFjZS5jCmluZGV4IGY3NWY4MWEuLmMyNzkzYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd4ZmFjZS5jCkBAIC00Miw2ICs0Miw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNuYW1lc3AuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4ZmV2YWwuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4ZmV2YWwuYwppbmRleCBjNTNmMDA0Li5lN2YwMTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmZXZhbC5jCkBAIC00Miw2ICs0Miw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNuYW1lc3AuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4Zm5hbWUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4Zm5hbWUuYwppbmRleCAzZmQ0NTI2Li44M2JmOTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZuYW1lLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmbmFtZS5jCkBAIC00Miw2ICs0Miw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNuYW1lc3AuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4Zm9iai5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmb2JqLmMKaW5kZXggZGI3NjYwZi4uNTdlNmQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmb2JqLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmb2JqLmMKQEAgLTQyLDYgKzQyLDcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc3hmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzeGZhY2UuYwppbmRleCAyZmY2NTdhLi5mZTg2YjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzeGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzeGZhY2UuYwpAQCAtNDEsNiArNDEsNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlICJhY2NvbW1vbi5oIgogI2luY2x1ZGUgImFjcmVzcmMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmYWNlLmMKaW5kZXggNGI3MDg1ZC4uZTdkMTNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmYWNlLmMKQEAgLTQyLDYgKzQyLDcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYwppbmRleCBhOWJjZDgxLi5hMWY4ZDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYwpAQCAtNDEsNiArNDEsNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlICJhY2NvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVjb2RlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVjb2RlLmMKaW5kZXggOTdjYjM2Zi4uOGIwODdlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlY29kZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWNvZGUuYwpAQCAtNDEsNiArNDEsNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlICJhY2NvbW1vbi5oIgogI2luY2x1ZGUgImFjbmFtZXNwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0Z2xvYmFsLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0Z2xvYmFsLmMKaW5kZXggODMzYTM4YS4uZmZiYTBhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGdsb2JhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRnbG9iYWwuYwpAQCAtNDMsNiArNDMsNyBAQAogCiAjZGVmaW5lIERFRklORV9BQ1BJX0dMT0JBTFMKIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmYWNlLmMKaW5kZXggOThhZDEyNS4uNDIwZWJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmYWNlLmMKQEAgLTQxLDYgKzQxLDcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY2V2ZW50cy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmZXJyb3IuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmVycm9yLmMKaW5kZXggOTE2YWUwOS4uOGQwMjQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmZXJyb3IuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZlcnJvci5jCkBAIC00MSw2ICs0MSw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNuYW1lc3AuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYwppbmRleCAyY2E1OWRjLi4xMjc0MDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jCkBAIC05MzMsNyArOTMzLDcgQEAKIHN0YXRpYyBpbnQgZXJzdF9jbG9zZV9wc3RvcmUoc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwogc3RhdGljIHNzaXplX3QgZXJzdF9yZWFkZXIodTY0ICppZCwgZW51bSBwc3RvcmVfdHlwZV9pZCAqdHlwZSwKIAkJCSAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwotc3RhdGljIHU2NCBlcnN0X3dyaXRlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAorc3RhdGljIGludCBlcnN0X3dyaXRlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCAqaWQsIHVuc2lnbmVkIGludCBwYXJ0LAogCQkgICAgICAgc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKIHN0YXRpYyBpbnQgZXJzdF9jbGVhcmVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0IGlkLAogCQkJc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwpAQCAtMTA0MCwxMSArMTA0MCwxMiBAQAogCXJldHVybiAocmMgPCAwKSA/IHJjIDogKGxlbiAtIHNpemVvZigqcmNkKSk7CiB9CiAKLXN0YXRpYyB1NjQgZXJzdF93cml0ZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1bnNpZ25lZCBpbnQgcGFydCwKK3N0YXRpYyBpbnQgZXJzdF93cml0ZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgKmlkLCB1bnNpZ25lZCBpbnQgcGFydCwKIAkJICAgICAgIHNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKIHsKIAlzdHJ1Y3QgY3Blcl9wc3RvcmVfcmVjb3JkICpyY2QgPSAoc3RydWN0IGNwZXJfcHN0b3JlX3JlY29yZCAqKQogCQkJCQkoZXJzdF9pbmZvLmJ1ZiAtIHNpemVvZigqcmNkKSk7CisJaW50IHJldDsKIAogCW1lbXNldChyY2QsIDAsIHNpemVvZigqcmNkKSk7CiAJbWVtY3B5KHJjZC0+aGRyLnNpZ25hdHVyZSwgQ1BFUl9TSUdfUkVDT1JELCBDUEVSX1NJR19TSVpFKTsKQEAgLTEwNzksOSArMTA4MCwxMCBAQAogCX0KIAlyY2QtPnNlY19oZHIuc2VjdGlvbl9zZXZlcml0eSA9IENQRVJfU0VWX0ZBVEFMOwogCi0JZXJzdF93cml0ZSgmcmNkLT5oZHIpOworCXJldCA9IGVyc3Rfd3JpdGUoJnJjZC0+aGRyKTsKKwkqaWQgPSByY2QtPmhkci5yZWNvcmRfaWQ7CiAKLQlyZXR1cm4gcmNkLT5oZHIucmVjb3JkX2lkOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZXJzdF9jbGVhcmVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0IGlkLApAQCAtMTE2NSw3ICsxMTY3LDcgQEAKIAkJZ290byBlcnJfcmVsZWFzZV9lcmFuZ2U7CiAKIAlidWYgPSBrbWFsbG9jKGVyc3RfZXJhbmdlLnNpemUsIEdGUF9LRVJORUwpOwotCW11dGV4X2luaXQoJmVyc3RfaW5mby5idWZfbXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZlcnN0X2luZm8uYnVmX2xvY2spOwogCWlmIChidWYpIHsKIAkJZXJzdF9pbmZvLmJ1ZiA9IGJ1ZiArIHNpemVvZihzdHJ1Y3QgY3Blcl9wc3RvcmVfcmVjb3JkKTsKIAkJZXJzdF9pbmZvLmJ1ZnNpemUgPSBlcnN0X2VyYW5nZS5zaXplIC0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hdG9taWNpby5jIGIvZHJpdmVycy9hY3BpL2F0b21pY2lvLmMKaW5kZXggNzQ4OWI4OWMzLi5jZmMwY2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXRvbWljaW8uYworKysgYi9kcml2ZXJzL2FjcGkvYXRvbWljaW8uYwpAQCAtMjQsNyArMjQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC03Niw3ICs3Niw3IEBACiB7CiAJc3RydWN0IGFjcGlfaW9tYXAgKm1hcDsKIAotCW1hcCA9IF9fYWNwaV9maW5kX2lvbWFwKHBhZGRyLCBzaXplKTsKKwltYXAgPSBfX2FjcGlfZmluZF9pb21hcChwYWRkciwgc2l6ZS84KTsKIAlpZiAobWFwKQogCQlyZXR1cm4gbWFwLT52YWRkciArIChwYWRkciAtIG1hcC0+cGFkZHIpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ibGFja2xpc3QuYyBiL2RyaXZlcnMvYWNwaS9ibGFja2xpc3QuYwppbmRleCBhZjMwOGQwLi5jYjk2Mjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmxhY2tsaXN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jCkBAIC0yOCw3ICsyOCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1cy5jIGIvZHJpdmVycy9hY3BpL2J1cy5jCmluZGV4IDQzN2RkYmYuLjllY2VjOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTkxMSwxMCArOTExLDcgQEAKIAl9CiAjZW5kaWYKIAotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZW5hYmxlX3N1YnN5c3RlbSh+Ci0JCQkJICAoQUNQSV9OT19IQVJEV0FSRV9JTklUIHwKLQkJCQkgICBBQ1BJX05PX0FDUElfRU5BQkxFKSk7CisJc3RhdHVzID0gYWNwaV9lbmFibGVfc3Vic3lzdGVtKH5BQ1BJX05PX0FDUElfRU5BQkxFKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5hYmxlIHRvIGVuYWJsZSBBQ1BJXG4iKTsKIAkJZ290byBlcnJvcjA7CkBAIC05MzUsOCArOTMyLDcgQEAKIAogCWFjcGlfb3NfaW5pdGlhbGl6ZTEoKTsKIAotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZW5hYmxlX3N1YnN5c3RlbShBQ1BJX05PX0hBUkRXQVJFX0lOSVQgfCBBQ1BJX05PX0FDUElfRU5BQkxFKTsKKwlzdGF0dXMgPSBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0oQUNQSV9OT19BQ1BJX0VOQUJMRSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKIAkJICAgICAgICJVbmFibGUgdG8gc3RhcnQgdGhlIEFDUEkgSW50ZXJwcmV0ZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2RlYnVnZnMuYyBiL2RyaXZlcnMvYWNwaS9kZWJ1Z2ZzLmMKaW5kZXggMTgyYTlmYy4uYjU1ZDZhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL2FjcGkvZGVidWdmcy5jCkBAIC0yLDYgKzIsNyBAQAogICogZGVidWdmcy5jIC0gQUNQSSBkZWJ1Z2ZzIGludGVyZmFjZSB0byB1c2Vyc3BhY2UuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lY19zeXMuYyBiL2RyaXZlcnMvYWNwaS9lY19zeXMuYwppbmRleCAyMmY5MThiLi42YzQ3YWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZWNfc3lzLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjX3N5cy5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBNT0RVTEVfQVVUSE9SKCJUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50LmMgYi9kcml2ZXJzL2FjcGkvZXZlbnQuYwppbmRleCA4NWQ5MDg5Li4xNDQyNzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnQuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnQuYwpAQCAtNyw2ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IDdjNDdlZDUuLjI5YTRhNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtNiw2ICs2LDcgQEAKICAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgogICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9vc2wuYyBiL2RyaXZlcnMvYWNwaS9vc2wuYwppbmRleCBmYTMyZjU4Li5mMzFjNWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvb3NsLmMKKysrIGIvZHJpdmVycy9hY3BpL29zbC5jCkBAIC04MCw3ICs4MCw4IEBACiBzdGF0aWMgdm9pZCAqYWNwaV9pcnFfY29udGV4dDsKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2FjcGlkX3dxOwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprYWNwaV9ub3RpZnlfd3E7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmthY3BpX2hvdHBsdWdfd3E7CitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2FjcGlfaG90cGx1Z193cTsKK0VYUE9SVF9TWU1CT0woa2FjcGlfaG90cGx1Z193cSk7CiAKIHN0cnVjdCBhY3BpX3Jlc19saXN0IHsKIAlyZXNvdXJjZV9zaXplX3Qgc3RhcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvYy5jIGIvZHJpdmVycy9hY3BpL3Byb2MuYwppbmRleCBmNWY5ODY5Li4yNTFjN2I2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2MuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvYy5jCkBAIC0xLDUgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCAwMmQyYTRjLi4zYTA0MjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtNyw2ICs3LDcgQEAKICAqCVZlbmthdGVzaCBQYWxsaXBhZGkgPHZlbmthdGVzaC5wYWxsaXBhZGlAaW50ZWwuY29tPgogICoJLSBBZGRlZCBfUERDIGZvciBwbGF0Zm9ybXMgd2l0aCBJbnRlbCBDUFVzCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2RyaXZlci5jCmluZGV4IGE0ZTBmMWIuLjlkN2JjOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9kcml2ZXIuYwpAQCAtNDI2LDcgKzQyNiw3IEBACiAKIAlpZiAoYWN0aW9uID09IENQVV9PTkxJTkUgJiYgcHIpIHsKIAkJYWNwaV9wcm9jZXNzb3JfcHBjX2hhc19jaGFuZ2VkKHByLCAwKTsKLQkJYWNwaV9wcm9jZXNzb3JfY3N0X2hhc19jaGFuZ2VkKHByKTsKKwkJYWNwaV9wcm9jZXNzb3JfaG90cGx1Zyhwcik7CiAJCWFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHByLCBhY3Rpb24pOwogCQlhY3BpX3Byb2Nlc3Nvcl90c3RhdGVfaGFzX2NoYW5nZWQocHIpOwogCX0KQEAgLTUwMyw4ICs1MDMsNyBAQAogCWFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nX2luZm8ocHIpOwogCWFjcGlfcHJvY2Vzc29yX2dldF9saW1pdF9pbmZvKHByKTsKIAotCi0JaWYgKGNwdWlkbGVfZ2V0X2RyaXZlcigpID09ICZhY3BpX2lkbGVfZHJpdmVyKQorCWlmICghY3B1aWRsZV9nZXRfZHJpdmVyKCkgfHwgY3B1aWRsZV9nZXRfZHJpdmVyKCkgPT0gJmFjcGlfaWRsZV9kcml2ZXIpCiAJCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQocHIsIGRldmljZSk7CiAKIAlwci0+Y2RldiA9IHRoZXJtYWxfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIoIlByb2Nlc3NvciIsIGRldmljZSwKQEAgLTgwMCwxNyArNzk5LDkgQEAKIAogCW1lbXNldCgmZXJyYXRhLCAwLCBzaXplb2YoZXJyYXRhKSk7CiAKLQlpZiAoIWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2lkbGVfZHJpdmVyKSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiQUNQSTogJXMgcmVnaXN0ZXJlZCB3aXRoIGNwdWlkbGVcbiIsCi0JCQlhY3BpX2lkbGVfZHJpdmVyLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJBQ1BJOiBhY3BpX2lkbGUgeWllbGRpbmcgdG8gJXNcbiIsCi0JCQljcHVpZGxlX2dldF9kcml2ZXIoKS0+bmFtZSk7Ci0JfQotCiAJcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX3Byb2Nlc3Nvcl9kcml2ZXIpOwogCWlmIChyZXN1bHQgPCAwKQotCQlnb3RvIG91dF9jcHVpZGxlOworCQlyZXR1cm4gcmVzdWx0OwogCiAJYWNwaV9wcm9jZXNzb3JfaW5zdGFsbF9ob3RwbHVnX25vdGlmeSgpOwogCkBAIC04MjEsMTEgKzgxMiw2IEBACiAJYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19pbml0KCk7CiAKIAlyZXR1cm4gMDsKLQotb3V0X2NwdWlkbGU6Ci0JY3B1aWRsZV91bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9pZGxlX2RyaXZlcik7Ci0KLQlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9wcm9jZXNzb3JfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwppbmRleCA5Yjg4Zjk4Li4wZThlMmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwpAQCAtMjI0LDcgKzIyNCw2IEBACiAvKgogICogU3VzcGVuZCAvIHJlc3VtZSBjb250cm9sCiAgKi8KLXN0YXRpYyBpbnQgYWNwaV9pZGxlX3N1c3BlbmQ7CiBzdGF0aWMgdTMyIHNhdmVkX2JtX3JsZDsKIAogc3RhdGljIHZvaWQgYWNwaV9pZGxlX2JtX3JsZF9zYXZlKHZvaWQpCkBAIC0yNDMsMjEgKzI0MiwxMyBAQAogCiBpbnQgYWNwaV9wcm9jZXNzb3Jfc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlpZiAoYWNwaV9pZGxlX3N1c3BlbmQgPT0gMSkKLQkJcmV0dXJuIDA7Ci0KIAlhY3BpX2lkbGVfYm1fcmxkX3NhdmUoKTsKLQlhY3BpX2lkbGVfc3VzcGVuZCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBhY3BpX3Byb2Nlc3Nvcl9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlKQogewotCWlmIChhY3BpX2lkbGVfc3VzcGVuZCA9PSAwKQotCQlyZXR1cm4gMDsKLQogCWFjcGlfaWRsZV9ibV9ybGRfcmVzdG9yZSgpOwotCWFjcGlfaWRsZV9zdXNwZW5kID0gMDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzQxLDY2ICs3MzIsNjUgQEAKIC8qKgogICogYWNwaV9pZGxlX2VudGVyX2MxIC0gZW50ZXJzIGFuIEFDUEkgQzEgc3RhdGUtdHlwZQogICogQGRldjogdGhlIHRhcmdldCBDUFUKLSAqIEBzdGF0ZTogdGhlIHN0YXRlIGRhdGEKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyIGNvbnRhaW5pbmcgY3B1aWRsZSBzdGF0ZSBpbmZvCisgKiBAaW5kZXg6IGluZGV4IG9mIHRhcmdldCBzdGF0ZQogICoKICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgSEFMVCBpbnN0cnVjdGlvbi4KICAqLwogc3RhdGljIGludCBhY3BpX2lkbGVfZW50ZXJfYzEoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCisJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LCBpbnQgaW5kZXgpCiB7CiAJa3RpbWVfdCAga3QxLCBrdDI7CiAJczY0IGlkbGVfdGltZTsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByOwotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3ggPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RhdGUpOworCXN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICpzdGF0ZV91c2FnZSA9ICZkZXYtPnN0YXRlc191c2FnZVtpbmRleF07CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZV91c2FnZSk7CiAKIAlwciA9IF9fdGhpc19jcHVfcmVhZChwcm9jZXNzb3JzKTsKKwlkZXYtPmxhc3RfcmVzaWRlbmN5ID0gMDsKIAogCWlmICh1bmxpa2VseSghcHIpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCi0JLyogRG8gbm90IGFjY2VzcyBhbnkgQUNQSSBJTyBwb3J0cyBpbiBzdXNwZW5kIHBhdGggKi8KLQlpZiAoYWNwaV9pZGxlX3N1c3BlbmQpIHsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQljcHVfcmVsYXgoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJbGFwaWNfdGltZXJfc3RhdGVfYnJvYWRjYXN0KHByLCBjeCwgMSk7CiAJa3QxID0ga3RpbWVfZ2V0X3JlYWwoKTsKIAlhY3BpX2lkbGVfZG9fZW50cnkoY3gpOwogCWt0MiA9IGt0aW1lX2dldF9yZWFsKCk7CiAJaWRsZV90aW1lID0gIGt0aW1lX3RvX3VzKGt0aW1lX3N1YihrdDIsIGt0MSkpOwogCisJLyogVXBkYXRlIGRldmljZSBsYXN0X3Jlc2lkZW5jeSovCisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IChpbnQpaWRsZV90aW1lOworCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCWN4LT51c2FnZSsrOwogCWxhcGljX3RpbWVyX3N0YXRlX2Jyb2FkY2FzdChwciwgY3gsIDApOwogCi0JcmV0dXJuIGlkbGVfdGltZTsKKwlyZXR1cm4gaW5kZXg7CiB9CiAKIC8qKgogICogYWNwaV9pZGxlX2VudGVyX3NpbXBsZSAtIGVudGVycyBhbiBBQ1BJIHN0YXRlIHdpdGhvdXQgQk0gaGFuZGxpbmcKICAqIEBkZXY6IHRoZSB0YXJnZXQgQ1BVCi0gKiBAc3RhdGU6IHRoZSBzdGF0ZSBkYXRhCisgKiBAZHJ2OiBjcHVpZGxlIGRyaXZlciB3aXRoIGNwdWlkbGUgc3RhdGUgaW5mb3JtYXRpb24KKyAqIEBpbmRleDogdGhlIGluZGV4IG9mIHN1Z2dlc3RlZCBzdGF0ZQogICovCiBzdGF0aWMgaW50IGFjcGlfaWRsZV9lbnRlcl9zaW1wbGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCisJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcjsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4ID0gY3B1aWRsZV9nZXRfc3RhdGVkYXRhKHN0YXRlKTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RhdGVfdXNhZ2UgPSAmZGV2LT5zdGF0ZXNfdXNhZ2VbaW5kZXhdOworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3ggPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RhdGVfdXNhZ2UpOwogCWt0aW1lX3QgIGt0MSwga3QyOwogCXM2NCBpZGxlX3RpbWVfbnM7CiAJczY0IGlkbGVfdGltZTsKIAogCXByID0gX190aGlzX2NwdV9yZWFkKHByb2Nlc3NvcnMpOworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSAwOwogCiAJaWYgKHVubGlrZWx5KCFwcikpCi0JCXJldHVybiAwOwotCi0JaWYgKGFjcGlfaWRsZV9zdXNwZW5kKQotCQlyZXR1cm4oYWNwaV9pZGxlX2VudGVyX2MxKGRldiwgc3RhdGUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCkBAIC04MTUsNyArODA1LDcgQEAKIAkJaWYgKHVubGlrZWx5KG5lZWRfcmVzY2hlZCgpKSkgewogCQkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgfD0gVFNfUE9MTElORzsKIAkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKQEAgLTgzNyw2ICs4MjcsOSBAQAogCWlkbGVfdGltZSA9IGlkbGVfdGltZV9uczsKIAlkb19kaXYoaWRsZV90aW1lLCBOU0VDX1BFUl9VU0VDKTsKIAorCS8qIFVwZGF0ZSBkZXZpY2UgbGFzdF9yZXNpZGVuY3kqLworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSAoaW50KWlkbGVfdGltZTsKKwogCS8qIFRlbGwgdGhlIHNjaGVkdWxlciBob3cgbXVjaCB3ZSBpZGxlZDogKi8KIAlzY2hlZF9jbG9ja19pZGxlX3dha2V1cF9ldmVudChpZGxlX3RpbWVfbnMpOwogCkBAIC04NDgsNyArODQxLDcgQEAKIAogCWxhcGljX3RpbWVyX3N0YXRlX2Jyb2FkY2FzdChwciwgY3gsIDApOwogCWN4LT50aW1lICs9IGlkbGVfdGltZTsKLQlyZXR1cm4gaWRsZV90aW1lOworCXJldHVybiBpbmRleDsKIH0KIAogc3RhdGljIGludCBjM19jcHVfY291bnQ7CkBAIC04NTcsMzcgKzg1MCwzNyBAQAogLyoqCiAgKiBhY3BpX2lkbGVfZW50ZXJfYm0gLSBlbnRlcnMgQzMgd2l0aCBwcm9wZXIgQk0gaGFuZGxpbmcKICAqIEBkZXY6IHRoZSB0YXJnZXQgQ1BVCi0gKiBAc3RhdGU6IHRoZSBzdGF0ZSBkYXRhCisgKiBAZHJ2OiBjcHVpZGxlIGRyaXZlciBjb250YWluaW5nIHN0YXRlIGRhdGEKKyAqIEBpbmRleDogdGhlIGluZGV4IG9mIHN1Z2dlc3RlZCBzdGF0ZQogICoKICAqIElmIEJNIGlzIGRldGVjdGVkLCB0aGUgZGVlcGVzdCBub24tQzMgaWRsZSBzdGF0ZSBpcyBlbnRlcmVkIGluc3RlYWQuCiAgKi8KIHN0YXRpYyBpbnQgYWNwaV9pZGxlX2VudGVyX2JtKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKQorCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwgaW50IGluZGV4KQogewogCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHI7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZSk7CisJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKnN0YXRlX3VzYWdlID0gJmRldi0+c3RhdGVzX3VzYWdlW2luZGV4XTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4ID0gY3B1aWRsZV9nZXRfc3RhdGVkYXRhKHN0YXRlX3VzYWdlKTsKIAlrdGltZV90ICBrdDEsIGt0MjsKIAlzNjQgaWRsZV90aW1lX25zOwogCXM2NCBpZGxlX3RpbWU7CiAKIAogCXByID0gX190aGlzX2NwdV9yZWFkKHByb2Nlc3NvcnMpOworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSAwOwogCiAJaWYgKHVubGlrZWx5KCFwcikpCi0JCXJldHVybiAwOwotCi0JaWYgKGFjcGlfaWRsZV9zdXNwZW5kKQotCQlyZXR1cm4oYWNwaV9pZGxlX2VudGVyX2MxKGRldiwgc3RhdGUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWN4LT5ibV9zdHNfc2tpcCAmJiBhY3BpX2lkbGVfYm1fY2hlY2soKSkgewotCQlpZiAoZGV2LT5zYWZlX3N0YXRlKSB7Ci0JCQlkZXYtPmxhc3Rfc3RhdGUgPSBkZXYtPnNhZmVfc3RhdGU7Ci0JCQlyZXR1cm4gZGV2LT5zYWZlX3N0YXRlLT5lbnRlcihkZXYsIGRldi0+c2FmZV9zdGF0ZSk7CisJCWlmIChkcnYtPnNhZmVfc3RhdGVfaW5kZXggPj0gMCkgeworCQkJcmV0dXJuIGRydi0+c3RhdGVzW2Rydi0+c2FmZV9zdGF0ZV9pbmRleF0uZW50ZXIoZGV2LAorCQkJCQkJZHJ2LCBkcnYtPnNhZmVfc3RhdGVfaW5kZXgpOwogCQl9IGVsc2UgewogCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJCWFjcGlfc2FmZV9oYWx0KCk7CiAJCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCkBAIC05MDQsNyArODk3LDcgQEAKIAkJaWYgKHVubGlrZWx5KG5lZWRfcmVzY2hlZCgpKSkgewogCQkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgfD0gVFNfUE9MTElORzsKIAkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKQEAgLTk1NCw2ICs5NDcsOSBAQAogCWlkbGVfdGltZSA9IGlkbGVfdGltZV9uczsKIAlkb19kaXYoaWRsZV90aW1lLCBOU0VDX1BFUl9VU0VDKTsKIAorCS8qIFVwZGF0ZSBkZXZpY2UgbGFzdF9yZXNpZGVuY3kqLworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSAoaW50KWlkbGVfdGltZTsKKwogCS8qIFRlbGwgdGhlIHNjaGVkdWxlciBob3cgbXVjaCB3ZSBpZGxlZDogKi8KIAlzY2hlZF9jbG9ja19pZGxlX3dha2V1cF9ldmVudChpZGxlX3RpbWVfbnMpOwogCkBAIC05NjUsNyArOTYxLDcgQEAKIAogCWxhcGljX3RpbWVyX3N0YXRlX2Jyb2FkY2FzdChwciwgY3gsIDApOwogCWN4LT50aW1lICs9IGlkbGVfdGltZTsKLQlyZXR1cm4gaWRsZV90aW1lOworCXJldHVybiBpbmRleDsKIH0KIAogc3RydWN0IGNwdWlkbGVfZHJpdmVyIGFjcGlfaWRsZV9kcml2ZXIgPSB7CkBAIC05NzQsMTQgKzk3MCwxNiBAQAogfTsKIAogLyoqCi0gKiBhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlIC0gcHJlcGFyZXMgYW5kIGNvbmZpZ3VyZXMgQ1BVSURMRQorICogYWNwaV9wcm9jZXNzb3Jfc2V0dXBfY3B1aWRsZV9jeCAtIHByZXBhcmVzIGFuZCBjb25maWd1cmVzIENQVUlETEUKKyAqIGRldmljZSBpLmUuIHBlci1jcHUgZGF0YQorICoKICAqIEBwcjogdGhlIEFDUEkgcHJvY2Vzc29yCiAgKi8KLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0dXBfY3B1aWRsZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlX2N4KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJaW50IGksIGNvdW50ID0gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQ7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeDsKLQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKnN0YXRlX3VzYWdlOwogCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0gJnByLT5wb3dlci5kZXY7CiAKIAlpZiAoIXByLT5mbGFncy5wb3dlcl9zZXR1cF9kb25lKQpAQCAtOTkyLDE3ICs5OTAsMTMgQEAKIAl9CiAKIAlkZXYtPmNwdSA9IHByLT5pZDsKLQlmb3IgKGkgPSAwOyBpIDwgQ1BVSURMRV9TVEFURV9NQVg7IGkrKykgewotCQlkZXYtPnN0YXRlc1tpXS5uYW1lWzBdID0gJ1wwJzsKLQkJZGV2LT5zdGF0ZXNbaV0uZGVzY1swXSA9ICdcMCc7Ci0JfQogCiAJaWYgKG1heF9jc3RhdGUgPT0gMCkKIAkJbWF4X2NzdGF0ZSA9IDE7CiAKIAlmb3IgKGkgPSAxOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSICYmIGkgPD0gbWF4X2NzdGF0ZTsgaSsrKSB7CiAJCWN4ID0gJnByLT5wb3dlci5zdGF0ZXNbaV07Ci0JCXN0YXRlID0gJmRldi0+c3RhdGVzW2NvdW50XTsKKwkJc3RhdGVfdXNhZ2UgPSAmZGV2LT5zdGF0ZXNfdXNhZ2VbY291bnRdOwogCiAJCWlmICghY3gtPnZhbGlkKQogCQkJY29udGludWU7CkBAIC0xMDEzLDggKzEwMDcsNjQgQEAKIAkJICAgICEoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9DMl9NUF9TVVBQT1JURUQpKQogCQkJY29udGludWU7CiAjZW5kaWYKLQkJY3B1aWRsZV9zZXRfc3RhdGVkYXRhKHN0YXRlLCBjeCk7CiAKKwkJY3B1aWRsZV9zZXRfc3RhdGVkYXRhKHN0YXRlX3VzYWdlLCBjeCk7CisKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ID09IENQVUlETEVfU1RBVEVfTUFYKQorCQkJYnJlYWs7CisJfQorCisJZGV2LT5zdGF0ZV9jb3VudCA9IGNvdW50OworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlIHN0YXRlcy0gcHJlcGFyZXMgYW5kIGNvbmZpZ3VyZXMgY3B1aWRsZQorICogZ2xvYmFsIHN0YXRlIGRhdGEgaS5lLiBpZGxlIHJvdXRpbmVzCisgKgorICogQHByOiB0aGUgQUNQSSBwcm9jZXNzb3IKKyAqLworc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlX3N0YXRlcyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQoreworCWludCBpLCBjb3VudCA9IENQVUlETEVfRFJJVkVSX1NUQVRFX1NUQVJUOworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3g7CisJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gJmFjcGlfaWRsZV9kcml2ZXI7CisKKwlpZiAoIXByLT5mbGFncy5wb3dlcl9zZXR1cF9kb25lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwci0+ZmxhZ3MucG93ZXIgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkcnYtPnNhZmVfc3RhdGVfaW5kZXggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgQ1BVSURMRV9TVEFURV9NQVg7IGkrKykgeworCQlkcnYtPnN0YXRlc1tpXS5uYW1lWzBdID0gJ1wwJzsKKwkJZHJ2LT5zdGF0ZXNbaV0uZGVzY1swXSA9ICdcMCc7CisJfQorCisJaWYgKG1heF9jc3RhdGUgPT0gMCkKKwkJbWF4X2NzdGF0ZSA9IDE7CisKKwlmb3IgKGkgPSAxOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSICYmIGkgPD0gbWF4X2NzdGF0ZTsgaSsrKSB7CisJCWN4ID0gJnByLT5wb3dlci5zdGF0ZXNbaV07CisKKwkJaWYgKCFjeC0+dmFsaWQpCisJCQljb250aW51ZTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCQlpZiAoKGN4LT50eXBlICE9IEFDUElfU1RBVEVfQzEpICYmIChudW1fb25saW5lX2NwdXMoKSA+IDEpICYmCisJCSAgICAhcHItPmZsYWdzLmhhc19jc3QgJiYKKwkJICAgICEoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9DMl9NUF9TVVBQT1JURUQpKQorCQkJY29udGludWU7CisjZW5kaWYKKworCQlzdGF0ZSA9ICZkcnYtPnN0YXRlc1tjb3VudF07CiAJCXNucHJpbnRmKHN0YXRlLT5uYW1lLCBDUFVJRExFX05BTUVfTEVOLCAiQyVkIiwgaSk7CiAJCXN0cm5jcHkoc3RhdGUtPmRlc2MsIGN4LT5kZXNjLCBDUFVJRExFX0RFU0NfTEVOKTsKIAkJc3RhdGUtPmV4aXRfbGF0ZW5jeSA9IGN4LT5sYXRlbmN5OwpAQCAtMTAyNywxMyArMTA3NywxMyBAQAogCQkJCXN0YXRlLT5mbGFncyB8PSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKIAogCQkJc3RhdGUtPmVudGVyID0gYWNwaV9pZGxlX2VudGVyX2MxOwotCQkJZGV2LT5zYWZlX3N0YXRlID0gc3RhdGU7CisJCQlkcnYtPnNhZmVfc3RhdGVfaW5kZXggPSBjb3VudDsKIAkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfU1RBVEVfQzI6CiAJCQlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CiAJCQlzdGF0ZS0+ZW50ZXIgPSBhY3BpX2lkbGVfZW50ZXJfc2ltcGxlOwotCQkJZGV2LT5zYWZlX3N0YXRlID0gc3RhdGU7CisJCQlkcnYtPnNhZmVfc3RhdGVfaW5kZXggPSBjb3VudDsKIAkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfU1RBVEVfQzM6CkBAIC0xMDQ5LDcgKzEwOTksNyBAQAogCQkJYnJlYWs7CiAJfQogCi0JZGV2LT5zdGF0ZV9jb3VudCA9IGNvdW50OworCWRydi0+c3RhdGVfY291bnQgPSBjb3VudDsKIAogCWlmICghY291bnQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA1Nyw3ICsxMTA3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGFjcGlfcHJvY2Vzc29yX2NzdF9oYXNfY2hhbmdlZChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQoraW50IGFjcGlfcHJvY2Vzc29yX2hvdHBsdWcoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTA3OCw3ICsxMTI4LDcgQEAKIAljcHVpZGxlX2Rpc2FibGVfZGV2aWNlKCZwci0+cG93ZXIuZGV2KTsKIAlhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mbyhwcik7CiAJaWYgKHByLT5mbGFncy5wb3dlcikgewotCQlhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlKHByKTsKKwkJYWNwaV9wcm9jZXNzb3Jfc2V0dXBfY3B1aWRsZV9jeChwcik7CiAJCXJldCA9IGNwdWlkbGVfZW5hYmxlX2RldmljZSgmcHItPnBvd2VyLmRldik7CiAJfQogCWNwdWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsKQEAgLTEwODYsMTAgKzExMzYsNzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitpbnQgYWNwaV9wcm9jZXNzb3JfY3N0X2hhc19jaGFuZ2VkKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKl9wcjsKKworCWlmIChkaXNhYmxlZF9ieV9pZGxlX2Jvb3RfcGFyYW0oKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXByKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChub2NzdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXByLT5mbGFncy5wb3dlcl9zZXR1cF9kb25lKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogRklYTUU6ICBEZXNpZ24gdGhlIEFDUEkgbm90aWZpY2F0aW9uIHRvIG1ha2UgaXQgb25jZSBwZXIKKwkgKiBzeXN0ZW0gaW5zdGVhZCBvZiBvbmNlIHBlci1jcHUuICBUaGlzIGNvbmRpdGlvbiBpcyBhIGhhY2sKKwkgKiB0byBtYWtlIHRoZSBjb2RlIHRoYXQgdXBkYXRlcyBDLVN0YXRlcyBiZSBjYWxsZWQgb25jZS4KKwkgKi8KKworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgPT0gMCAmJgorCQkJY3B1aWRsZV9nZXRfZHJpdmVyKCkgPT0gJmFjcGlfaWRsZV9kcml2ZXIpIHsKKworCQljcHVpZGxlX3BhdXNlX2FuZF9sb2NrKCk7CisJCS8qIFByb3RlY3QgYWdhaW5zdCBjcHUtaG90cGx1ZyAqLworCQlnZXRfb25saW5lX2NwdXMoKTsKKworCQkvKiBEaXNhYmxlIGFsbCBjcHVpZGxlIGRldmljZXMgKi8KKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCV9wciA9IHBlcl9jcHUocHJvY2Vzc29ycywgY3B1KTsKKwkJCWlmICghX3ByIHx8ICFfcHItPmZsYWdzLnBvd2VyX3NldHVwX2RvbmUpCisJCQkJY29udGludWU7CisJCQljcHVpZGxlX2Rpc2FibGVfZGV2aWNlKCZfcHItPnBvd2VyLmRldik7CisJCX0KKworCQkvKiBQb3B1bGF0ZSBVcGRhdGVkIEMtc3RhdGUgaW5mb3JtYXRpb24gKi8KKwkJYWNwaV9wcm9jZXNzb3Jfc2V0dXBfY3B1aWRsZV9zdGF0ZXMocHIpOworCisJCS8qIEVuYWJsZSBhbGwgY3B1aWRsZSBkZXZpY2VzICovCisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCQlfcHIgPSBwZXJfY3B1KHByb2Nlc3NvcnMsIGNwdSk7CisJCQlpZiAoIV9wciB8fCAhX3ByLT5mbGFncy5wb3dlcl9zZXR1cF9kb25lKQorCQkJCWNvbnRpbnVlOworCQkJYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm8oX3ByKTsKKwkJCWlmIChfcHItPmZsYWdzLnBvd2VyKSB7CisJCQkJYWNwaV9wcm9jZXNzb3Jfc2V0dXBfY3B1aWRsZV9jeChfcHIpOworCQkJCWNwdWlkbGVfZW5hYmxlX2RldmljZSgmX3ByLT5wb3dlci5kZXYpOworCQkJfQorCQl9CisJCXB1dF9vbmxpbmVfY3B1cygpOworCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJlZDsKKwogaW50IF9fY3B1aW5pdCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCiAJCQkgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCWludCByZXR2YWw7CiAJc3RhdGljIGludCBmaXJzdF9ydW47CiAKIAlpZiAoZGlzYWJsZWRfYnlfaWRsZV9ib290X3BhcmFtKCkpCkBAIC0xMTI2LDkgKzEyMzgsMjYgQEAKIAkgKiBwbGF0Zm9ybXMgdGhhdCBvbmx5IHN1cHBvcnQgQzEuCiAJICovCiAJaWYgKHByLT5mbGFncy5wb3dlcikgewotCQlhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlKHByKTsKLQkJaWYgKGNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKCZwci0+cG93ZXIuZGV2KSkKLQkJCXJldHVybiAtRUlPOworCQkvKiBSZWdpc3RlciBhY3BpX2lkbGVfZHJpdmVyIGlmIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KKwkJaWYgKCFhY3BpX3Byb2Nlc3Nvcl9yZWdpc3RlcmVkKSB7CisJCQlhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlX3N0YXRlcyhwcik7CisJCQlyZXR2YWwgPSBjcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9pZGxlX2RyaXZlcik7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQUNQSTogJXMgcmVnaXN0ZXJlZCB3aXRoIGNwdWlkbGVcbiIsCisJCQkJCWFjcGlfaWRsZV9kcml2ZXIubmFtZSk7CisJCX0KKwkJLyogUmVnaXN0ZXIgcGVyLWNwdSBjcHVpZGxlX2RldmljZS4gQ3B1aWRsZSBkcml2ZXIKKwkJICogbXVzdCBhbHJlYWR5IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHJlZ2lzdGVyaW5nIGRldmljZQorCQkgKi8KKwkJYWNwaV9wcm9jZXNzb3Jfc2V0dXBfY3B1aWRsZV9jeChwcik7CisJCXJldHZhbCA9IGNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKCZwci0+cG93ZXIuZGV2KTsKKwkJaWYgKHJldHZhbCkgeworCQkJaWYgKGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyZWQgPT0gMCkKKwkJCQljcHVpZGxlX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2lkbGVfZHJpdmVyKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJlZCsrOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTExMzksOCArMTI2OCwxMyBAQAogCWlmIChkaXNhYmxlZF9ieV9pZGxlX2Jvb3RfcGFyYW0oKSkKIAkJcmV0dXJuIDA7CiAKLQljcHVpZGxlX3VucmVnaXN0ZXJfZGV2aWNlKCZwci0+cG93ZXIuZGV2KTsKLQlwci0+ZmxhZ3MucG93ZXJfc2V0dXBfZG9uZSA9IDA7CisJaWYgKHByLT5mbGFncy5wb3dlcikgeworCQljcHVpZGxlX3VucmVnaXN0ZXJfZGV2aWNlKCZwci0+cG93ZXIuZGV2KTsKKwkJYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJlZC0tOworCQlpZiAoYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJlZCA9PSAwKQorCQkJY3B1aWRsZV91bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9pZGxlX2RyaXZlcik7CisJfQogCisJcHItPmZsYWdzLnBvd2VyX3NldHVwX2RvbmUgPSAwOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Nic2hjLmMgYi9kcml2ZXJzL2FjcGkvc2JzaGMuYwppbmRleCBmOGJlMjNiLi5mOGQyYTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2JzaGMuYworKysgYi9kcml2ZXJzL2FjcGkvc2JzaGMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlICJzYnNoYy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2Nhbi5jIGIvZHJpdmVycy9hY3BpL3NjYW4uYwppbmRleCA0NDljNTU2Li44YWI4MGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKQEAgLTEwNjIsMTMgKzEwNjIsMTIgQEAKIAlpZiAoIWlkKQogCQlyZXR1cm47CiAKLQlpZC0+aWQgPSBrbWFsbG9jKHN0cmxlbihkZXZfaWQpICsgMSwgR0ZQX0tFUk5FTCk7CisJaWQtPmlkID0ga3N0cmR1cChkZXZfaWQsIEdGUF9LRVJORUwpOwogCWlmICghaWQtPmlkKSB7CiAJCWtmcmVlKGlkKTsKIAkJcmV0dXJuOwogCX0KIAotCXN0cmNweShpZC0+aWQsIGRldl9pZCk7CiAJbGlzdF9hZGRfdGFpbCgmaWQtPmxpc3QsICZkZXZpY2UtPnBucC5pZHMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCmluZGV4IDBlNDZmYWUuLjZkOWEzYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCkBAIC0zOTgsNiArMzk4LDE0IEBACiAJfSwKIAl7CiAJLmNhbGxiYWNrID0gaW5pdF9udnNfbm9zYXZlLAorCS5pZGVudCA9ICJTb255IFZhaW8gVlBDRUIxN0ZYIiwKKwkubWF0Y2hlcyA9IHsKKwkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAorCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZQQ0VCMTdGWCIpLAorCQl9LAorCX0sCisJeworCS5jYWxsYmFjayA9IGluaXRfbnZzX25vc2F2ZSwKIAkuaWRlbnQgPSAiU29ueSBWYWlvIFZHTi1TUjExTSIsCiAJLm1hdGNoZXMgPSB7CiAJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zeXNmcy5jIGIvZHJpdmVycy9hY3BpL3N5c2ZzLmMKaW5kZXggYzUzOGQwZS4uOWY2NjE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9hY3BpL3N5c2ZzLmMKQEAgLTcwNiwxMSArNzA2LDIzIEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgc3NpemVfdAorYWNwaV9zaG93X3Byb2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGFjcGlfZ2JsX0ZBRFQucHJlZmVycmVkX3Byb2ZpbGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcG1fcHJvZmlsZV9hdHRyID0KKwlfX0FUVFIocG1fcHJvZmlsZSwgU19JUlVHTywgYWNwaV9zaG93X3Byb2ZpbGUsIE5VTEwpOworCiBpbnQgX19pbml0IGFjcGlfc3lzZnNfaW5pdCh2b2lkKQogewogCWludCByZXN1bHQ7CiAKIAlyZXN1bHQgPSBhY3BpX3RhYmxlc19zeXNmc19pbml0KCk7Ci0KKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9maWxlKGFjcGlfa29iaiwgJnBtX3Byb2ZpbGVfYXR0ci5hdHRyKTsKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jCmluZGV4IDVhZjM0NzkuLmYzZjBmZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMKQEAgLTMzLDYgKzMzLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW1iYS9idXMuYyBiL2RyaXZlcnMvYW1iYS9idXMuYwppbmRleCBkNzQ5MjZlLi5iZDIzMGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FtYmEvYnVzLmMKKysrIGIvZHJpdmVycy9hbWJhL2J1cy5jCkBAIC0zNjUsNiArMzY1LDQwIEBACiAKICNlbmRpZiAvKiAhQ09ORklHX0hJQkVSTkFURV9DQUxMQkFDS1MgKi8KIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisvKgorICogSG9va3MgdG8gcHJvdmlkZSBydW50aW1lIFBNIG9mIHRoZSBwY2xrIChidXMgY2xvY2spLiAgSXQgaXMgc2FmZSB0bworICogZW5hYmxlL2Rpc2FibGUgdGhlIGJ1cyBjbG9jayBhdCBydW50aW1lIFBNIHN1c3BlbmQvcmVzdW1lIGFzIHRoaXMKKyAqIGRvZXMgbm90IHJlc3VsdCBpbiBsb3NzIG9mIGNvbnRleHQuICBIb3dldmVyLCBkaXNhYmxpbmcgdmNvcmUgcG93ZXIKKyAqIHdvdWxkIGRvLCBzbyB3ZSBsZWF2ZSB0aGF0IHRvIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgYW1iYV9wbV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWJhX2RldmljZSAqcGNkZXYgPSB0b19hbWJhX2RldmljZShkZXYpOworCWludCByZXQgPSBwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZChkZXYpOworCisJaWYgKHJldCA9PSAwICYmIGRldi0+ZHJpdmVyKQorCQljbGtfZGlzYWJsZShwY2Rldi0+cGNsayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFtYmFfcG1fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWJhX2RldmljZSAqcGNkZXYgPSB0b19hbWJhX2RldmljZShkZXYpOworCWludCByZXQ7CisKKwlpZiAoZGV2LT5kcml2ZXIpIHsKKwkJcmV0ID0gY2xrX2VuYWJsZShwY2Rldi0+cGNsayk7CisJCS8qIEZhaWx1cmUgaXMgcHJvYmFibHkgZmF0YWwgdG8gdGhlIHN5c3RlbSwgYnV0Li4uICovCisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKGRldik7Cit9CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19QTQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYW1iYV9wbSA9IHsKQEAgLTM4Myw4ICs0MTcsOCBAQAogCS5wb3dlcm9mZl9ub2lycQk9IGFtYmFfcG1fcG93ZXJvZmZfbm9pcnEsCiAJLnJlc3RvcmVfbm9pcnEJPSBhbWJhX3BtX3Jlc3RvcmVfbm9pcnEsCiAJU0VUX1JVTlRJTUVfUE1fT1BTKAotCQlwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZCwKLQkJcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZSwKKwkJYW1iYV9wbV9ydW50aW1lX3N1c3BlbmQsCisJCWFtYmFfcG1fcnVudGltZV9yZXN1bWUsCiAJCXBtX2dlbmVyaWNfcnVudGltZV9pZGxlCiAJKQogfTsKQEAgLTQyNiw5ICs0NjAsMTcgQEAKIAlpZiAoSVNfRVJSKHBjbGspKQogCQlyZXR1cm4gUFRSX0VSUihwY2xrKTsKIAotCXJldCA9IGNsa19lbmFibGUocGNsayk7Ci0JaWYgKHJldCkKKwlyZXQgPSBjbGtfcHJlcGFyZShwY2xrKTsKKwlpZiAocmV0KSB7CiAJCWNsa19wdXQocGNsayk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gY2xrX2VuYWJsZShwY2xrKTsKKwlpZiAocmV0KSB7CisJCWNsa191bnByZXBhcmUocGNsayk7CisJCWNsa19wdXQocGNsayk7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQzOCw2ICs0ODAsNyBAQAogCXN0cnVjdCBjbGsgKnBjbGsgPSBwY2Rldi0+cGNsazsKIAogCWNsa19kaXNhYmxlKHBjbGspOworCWNsa191bnByZXBhcmUocGNsayk7CiAJY2xrX3B1dChwY2xrKTsKIH0KIApAQCAtNDk0LDEwICs1MzcsMTggQEAKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwogCisJCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7CisJCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOworCQlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCiAJCXJldCA9IHBjZHJ2LT5wcm9iZShwY2RldiwgaWQpOwogCQlpZiAocmV0ID09IDApCiAJCQlicmVhazsKIAorCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCiAJCWFtYmFfcHV0X2Rpc2FibGVfcGNsayhwY2Rldik7CiAJCWFtYmFfcHV0X2Rpc2FibGVfdmNvcmUocGNkZXYpOwogCX0gd2hpbGUgKDApOwpAQCAtNTA5LDcgKzU2MCwxNiBAQAogewogCXN0cnVjdCBhbWJhX2RldmljZSAqcGNkZXYgPSB0b19hbWJhX2RldmljZShkZXYpOwogCXN0cnVjdCBhbWJhX2RyaXZlciAqZHJ2ID0gdG9fYW1iYV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWludCByZXQgPSBkcnYtPnJlbW92ZShwY2Rldik7CisJaW50IHJldDsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwlyZXQgPSBkcnYtPnJlbW92ZShwY2Rldik7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisKKwkvKiBVbmRvIHRoZSBydW50aW1lIFBNIHNldHRpbmdzIGluIGFtYmFfcHJvYmUoKSAqLworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOwogCiAJYW1iYV9wdXRfZGlzYWJsZV9wY2xrKHBjZGV2KTsKIAlhbWJhX3B1dF9kaXNhYmxlX3Zjb3JlKHBjZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL0tjb25maWcgYi9kcml2ZXJzL2F0YS9LY29uZmlnCmluZGV4IDU5ODdlMGIuLjZiZGVkZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL0tjb25maWcKKysrIGIvZHJpdmVycy9hdGEvS2NvbmZpZwpAQCAtODIwLDcgKzgyMCw3IEBACiAKIGNvbmZpZyBQQVRBX09GX1BMQVRGT1JNCiAJdHJpc3RhdGUgIk9wZW5GaXJtd2FyZSBwbGF0Zm9ybSBkZXZpY2UgUEFUQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUEFUQV9QTEFURk9STSAmJiBQUENfT0YKKwlkZXBlbmRzIG9uIFBBVEFfUExBVEZPUk0gJiYgT0YKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGdlbmVyaWMgZGlyZWN0bHkgY29ubmVjdGVkIEFUQQogCSAgZGV2aWNlcyBjb21tb25seSBmb3VuZCBvbiBlbWJlZGRlZCBzeXN0ZW1zIHdpdGggT3BlbkZpcm13YXJlCkBAIC04MzEsNiArODMxLDcgQEAKIGNvbmZpZyBQQVRBX1FESQogCXRyaXN0YXRlICJRREkgVkxCIFBBVEEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElTQQorCXNlbGVjdCBQQVRBX0xFR0FDWQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFFESSA2NTAwIGFuZCA2NTgwIFBBVEEgY29udHJvbGxlcnMgb24gVkVTQSBsb2NhbCBidXMuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL01ha2VmaWxlIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKaW5kZXggOTU1MGQ2OS4uNmVjZTViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKQEAgLTg4LDcgKzg4LDYgQEAKIG9iai0kKENPTkZJR19QQVRBX1BBTE1MRCkJKz0gcGF0YV9wYWxtbGQubwogb2JqLSQoQ09ORklHX1BBVEFfUExBVEZPUk0pCSs9IHBhdGFfcGxhdGZvcm0ubwogb2JqLSQoQ09ORklHX1BBVEFfT0ZfUExBVEZPUk0pCSs9IHBhdGFfb2ZfcGxhdGZvcm0ubwotb2JqLSQoQ09ORklHX1BBVEFfUURJKQkJKz0gcGF0YV9xZGkubwogb2JqLSQoQ09ORklHX1BBVEFfUkI1MzIpCSs9IHBhdGFfcmI1MzJfY2Yubwogb2JqLSQoQ09ORklHX1BBVEFfUloxMDAwKQkrPSBwYXRhX3J6MTAwMC5vCiBvYmotJChDT05GSUdfUEFUQV9TQU1TVU5HX0NGKQkrPSBwYXRhX3NhbXN1bmdfY2YubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaS5jIGIvZHJpdmVycy9hdGEvYWhjaS5jCmluZGV4IGZiN2I5MGIuLmNmMjYyMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2kuYworKysgYi9kcml2ZXJzL2F0YS9haGNpLmMKQEAgLTM5MCw2ICszOTAsOSBAQAogCS8qIFByb21pc2UgKi8KIAl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4M2YyMCksIGJvYXJkX2FoY2kgfSwJLyogUERDNDI4MTkgKi8KIAorCS8qIEFzbWVkaWEgKi8KKwl7IFBDSV9WREVWSUNFKEFTTUVESUEsIDB4MDYxMiksIGJvYXJkX2FoY2kgfSwJLyogQVNNMTA2MSAqLworCiAJLyogR2VuZXJpYywgUENJIGNsYXNzIGNvZGUgZm9yIEFIQ0kgKi8KIAl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCiAJICBQQ0lfQ0xBU1NfU1RPUkFHRV9TQVRBX0FIQ0ksIDB4ZmZmZmZmLCBib2FyZF9haGNpIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2F0YS9haGNpX3BsYXRmb3JtLmMKaW5kZXggNmZlZjFmYS4uZWM1NTU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2lfcGxhdGZvcm0uYwpAQCAtMjMsNiArMjMsNDEgQEAKICNpbmNsdWRlIDxsaW51eC9haGNpX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSAiYWhjaS5oIgogCitlbnVtIGFoY2lfdHlwZSB7CisJQUhDSSwJCS8qIHN0YW5kYXJkIHBsYXRmb3JtIGFoY2kgKi8KKwlJTVg1M19BSENJLAkvKiBhaGNpIG9uIGkubXg1MyAqLworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgYWhjaV9kZXZ0eXBlW10gPSB7CisJeworCQkubmFtZSA9ICJhaGNpIiwKKwkJLmRyaXZlcl9kYXRhID0gQUhDSSwKKwl9LCB7CisJCS5uYW1lID0gImlteDUzLWFoY2kiLAorCQkuZHJpdmVyX2RhdGEgPSBJTVg1M19BSENJLAorCX0sIHsKKwkJLyogc2VudGluZWwgKi8KKwl9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgYWhjaV9kZXZ0eXBlKTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gYWhjaV9wb3J0X2luZm9bXSA9IHsKKwkvKiBieSBmZWF0dXJlcyAqLworCVtBSENJXSA9IHsKKwkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCisJCS5waW9fbWFzawk9IEFUQV9QSU80LAorCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAorCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCisJfSwKKwlbSU1YNTNfQUhDSV0gPSB7CisJCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLAorCQkucGlvX21hc2sJPSBBVEFfUElPNCwKKwkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKKwkJLnBvcnRfb3BzCT0gJmFoY2lfcG1wX3JldHJ5X3Nyc3Rfb3BzLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhaGNpX3BsYXRmb3JtX3NodCA9IHsKIAlBSENJX1NIVCgiYWhjaV9wbGF0Zm9ybSIpLAogfTsKQEAgLTMwLDEzICs2NSw5IEBACiBzdGF0aWMgaW50IF9faW5pdCBhaGNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwaSA9IHsKLQkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCi0JCS5waW9fbWFzawk9IEFUQV9QSU80LAotCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAotCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCi0JfTsKKwlzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKKwljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICppZCA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldik7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSBhaGNpX3BvcnRfaW5mb1tpZC0+ZHJpdmVyX2RhdGFdOwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBpLCBOVUxMIH07CiAJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CkBAIC0xNjAsNyArMTkxLDcgQEAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGFoY2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCWF0YV9ob3N0X2RldGFjaChob3N0KTsKQEAgLTE3MSwxMiArMjAyLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFoY2lfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImNhbHhlZGEsaGItYWhjaSIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWhjaV9vZl9tYXRjaCk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFoY2lfZHJpdmVyID0gewogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhaGNpX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiYWhjaSIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhaGNpX29mX21hdGNoLAogCX0sCisJLmlkX3RhYmxlCT0gYWhjaV9kZXZ0eXBlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYWhjaV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwppbmRleCA0MzEwN2U5Li42OWFjMzczYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwpAQCAtMTEzLDYgKzExMyw4IEBACiAJUElJWF9QQVRBX0ZMQUdTCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJUElJWF9TQVRBX0ZMQUdTCQk9IEFUQV9GTEFHX1NBVEEgfCBQSUlYX0ZMQUdfQ0hFQ0tJTlRSLAogCisJUElJWF9GTEFHX1BJTzE2CQk9ICgxIDw8IDMwKSwgLypzdXBwb3J0IDE2Yml0IFBJTyBvbmx5Ki8KKwogCVBJSVhfODBDX1BSSQkJPSAoMSA8PCA1KSB8ICgxIDw8IDQpLAogCVBJSVhfODBDX1NFQwkJPSAoMSA8PCA3KSB8ICgxIDw8IDYpLAogCkBAIC0xNDcsNiArMTQ5LDcgQEAKIAlpY2g4bV9hcHBsZV9zYXRhLAkvKiBsb2NrcyB1cCBvbiBzZWNvbmQgcG9ydCBlbmFibGUgKi8KIAl0b2xhcGFpX3NhdGEsCiAJcGlpeF9wYXRhX3ZtdywJCQkvKiBQSUlYNCBmb3IgVk13YXJlLCBzcHVyaW91cyBETUFfRVJSICovCisJaWNoOF9zYXRhX3NuYiwKIH07CiAKIHN0cnVjdCBwaWl4X21hcF9kYiB7CkBAIC0xNzcsNiArMTgwLDcgQEAKIHN0YXRpYyBpbnQgcGlpeF9zaWRwcl9zZXRfbHBtKHN0cnVjdCBhdGFfbGluayAqbGluaywgZW51bSBhdGFfbHBtX3BvbGljeSBwb2xpY3ksCiAJCQkgICAgICB1bnNpZ25lZCBoaW50cyk7CiBzdGF0aWMgYm9vbCBwaWl4X2lycV9jaGVjayhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyBpbnQgcGlpeF9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBwaWl4X3BjaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpOwogc3RhdGljIGludCBwaWl4X3BjaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKQEAgLTI5OCwyMSArMzAyLDIxIEBACiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoUENIKSAqLwogCXsgMHg4MDg2LCAweDNiMmUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfc2F0YSB9LAogCS8qIFNBVEEgQ29udHJvbGxlciBJREUgKENQVCkgKi8KLQl7IDB4ODA4NiwgMHgxYzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4X3NhdGEgfSwKKwl7IDB4ODA4NiwgMHgxYzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4X3NhdGFfc25iIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoQ1BUKSAqLwotCXsgMHg4MDg2LCAweDFjMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfc2F0YSB9LAorCXsgMHg4MDg2LCAweDFjMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfc2F0YV9zbmIgfSwKIAkvKiBTQVRBIENvbnRyb2xsZXIgSURFIChDUFQpICovCiAJeyAweDgwODYsIDB4MWMwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF8ycG9ydF9zYXRhIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoQ1BUKSAqLwogCXsgMHg4MDg2LCAweDFjMDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfMnBvcnRfc2F0YSB9LAogCS8qIFNBVEEgQ29udHJvbGxlciBJREUgKFBCRykgKi8KLQl7IDB4ODA4NiwgMHgxZDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4X3NhdGEgfSwKKwl7IDB4ODA4NiwgMHgxZDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4X3NhdGFfc25iIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoUEJHKSAqLwogCXsgMHg4MDg2LCAweDFkMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfMnBvcnRfc2F0YSB9LAogCS8qIFNBVEEgQ29udHJvbGxlciBJREUgKFBhbnRoZXIgUG9pbnQpICovCi0JeyAweDgwODYsIDB4MWUwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF9zYXRhIH0sCisJeyAweDgwODYsIDB4MWUwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF9zYXRhX3NuYiB9LAogCS8qIFNBVEEgQ29udHJvbGxlciBJREUgKFBhbnRoZXIgUG9pbnQpICovCi0JeyAweDgwODYsIDB4MWUwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF9zYXRhIH0sCisJeyAweDgwODYsIDB4MWUwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF9zYXRhX3NuYiB9LAogCS8qIFNBVEEgQ29udHJvbGxlciBJREUgKFBhbnRoZXIgUG9pbnQpICovCiAJeyAweDgwODYsIDB4MWUwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF8ycG9ydF9zYXRhIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoUGFudGhlciBQb2ludCkgKi8KQEAgLTMzOCw2ICszNDIsNyBAQAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHBpaXhfc2F0YV9vcHMgPSB7CiAJLmluaGVyaXRzCQk9ICZhdGFfYm1kbWEzMl9wb3J0X29wcywKIAkuc2ZmX2lycV9jaGVjawkJPSBwaWl4X2lycV9jaGVjaywKKwkucG9ydF9zdGFydAkJPSBwaWl4X3BvcnRfc3RhcnQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGlpeF9wYXRhX29wcyA9IHsKQEAgLTQ3OCw2ICs0ODMsNyBAQAogCVtpY2g4XzJwb3J0X3NhdGFdCT0gJmljaDhfMnBvcnRfbWFwX2RiLAogCVtpY2g4bV9hcHBsZV9zYXRhXQk9ICZpY2g4bV9hcHBsZV9tYXBfZGIsCiAJW3RvbGFwYWlfc2F0YV0JCT0gJnRvbGFwYWlfbWFwX2RiLAorCVtpY2g4X3NhdGFfc25iXQkJPSAmaWNoOF9tYXBfZGIsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gcGlpeF9wb3J0X2luZm9bXSA9IHsKQEAgLTYwNiw2ICs2MTIsMTkgQEAKIAkJLnBvcnRfb3BzCT0gJnBpaXhfdm13X29wcywKIAl9LAogCisJLyoKKwkgKiBzb21lIFNhbmR5YnJpZGdlIGNoaXBzZXRzIGhhdmUgYnJva2VuIDMyIG1vZGUgdXAgdG8gbm93LAorCSAqIHNlZSBodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTQwNTkyCisJICovCisJW2ljaDhfc2F0YV9zbmJdID0KKwl7CisJCS5mbGFncwkJPSBQSUlYX1NBVEFfRkxBR1MgfCBQSUlYX0ZMQUdfU0lEUFIgfCBQSUlYX0ZMQUdfUElPMTYsCisJCS5waW9fbWFzawk9IEFUQV9QSU80LAorCQkubXdkbWFfbWFzawk9IEFUQV9NV0RNQTIsCisJCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCisJCS5wb3J0X29wcwk9ICZwaWl4X3NhdGFfb3BzLAorCX0sCisKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2JpdHMgcGlpeF9lbmFibGVfYml0c1tdID0gewpAQCAtNjQ5LDYgKzY2OCwxNCBAQAogCXsgMCwgfQogfTsKIAorc3RhdGljIGludCBwaWl4X3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlpZiAoIShhcC0+ZmxhZ3MgJiBQSUlYX0ZMQUdfUElPMTYpKQorCQlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19QSU8zMiB8IEFUQV9QRkxBR19QSU8zMkNIQU5HRTsKKworCXJldHVybiBhdGFfYm1kbWFfcG9ydF9zdGFydChhcCk7Cit9CisKIC8qKgogICoJaWNoX3BhdGFfY2FibGVfZGV0ZWN0IC0gUHJvYmUgaG9zdCBjb250cm9sbGVyIGNhYmxlIGRldGVjdCBpbmZvCiAgKglAYXA6IFBvcnQgZm9yIHdoaWNoIGNhYmxlIGRldGVjdCBpbmZvIGlzIGRlc2lyZWQKQEAgLTcwNCwyMiArNzMxLDExIEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGlpeF9sb2NrKTsKIAotLyoqCi0gKglwaWl4X3NldF9waW9tb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncwotICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCi0gKglAYWRldjogdW0KLSAqCi0gKglTZXQgUElPIG1vZGUgZm9yIGRldmljZSwgaW4gaG9zdCBjb250cm9sbGVyIFBDSSBjb25maWcgc3BhY2UuCi0gKgotICoJTE9DS0lORzoKLSAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCi0gKi8KLQotc3RhdGljIHZvaWQgcGlpeF9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKK3N0YXRpYyB2b2lkIHBpaXhfc2V0X3RpbWluZ3Moc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsCisJCQkgICAgIHU4IHBpbykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBwaW8JPSBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzA7CiAJdW5zaWduZWQgaW50IGlzX3NsYXZlCT0gKGFkZXYtPmRldm5vICE9IDApOwogCXVuc2lnbmVkIGludCBtYXN0ZXJfcG9ydD0gYXAtPnBvcnRfbm8gPyAweDQyIDogMHg0MDsKIAl1bnNpZ25lZCBpbnQgc2xhdmVfcG9ydAk9IDB4NDQ7CkBAIC03NDQsMTAgKzc2MCwxNiBAQAogCQljb250cm9sIHw9IDE7CS8qIFRJTUUxIGVuYWJsZSAqLwogCWlmIChhdGFfcGlvX25lZWRfaW9yZHkoYWRldikpCiAJCWNvbnRyb2wgfD0gMjsJLyogSUUgZW5hYmxlICovCi0KIAkvKiBJbnRlbCBzcGVjaWZpZXMgdGhhdCB0aGUgUFBFIGZ1bmN0aW9uYWxpdHkgaXMgZm9yIGRpc2sgb25seSAqLwogCWlmIChhZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSkKIAkJY29udHJvbCB8PSA0OwkvKiBQUEUgZW5hYmxlICovCisJLyoKKwkgKiBJZiB0aGUgZHJpdmUgTVdETUEgaXMgZmFzdGVyIHRoYW4gaXQgY2FuIGRvIFBJTyB0aGVuCisJICogd2UgbXVzdCBmb3JjZSBQSU8gaW50byBQSU8wCisJICovCisJaWYgKGFkZXYtPnBpb19tb2RlIDwgWEZFUl9QSU9fMCArIHBpbykKKwkJLyogRW5hYmxlIERNQSB0aW1pbmcgb25seSAqLworCQljb250cm9sIHw9IDg7CS8qIFBJTyBjeWNsZXMgaW4gUElPMCAqLwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBpaXhfbG9jaywgZmxhZ3MpOwogCkBAIC03NTksOCArNzgxLDYgQEAKIAlpZiAoaXNfc2xhdmUpIHsKIAkJLyogY2xlYXIgVElNRTF8SUUxfFBQRTF8RFRFMSAqLwogCQltYXN0ZXJfZGF0YSAmPSAweGZmMGY7Ci0JCS8qIEVuYWJsZSBTSVRSRSAoc2VwYXJhdGUgc2xhdmUgdGltaW5nIHJlZ2lzdGVyKSAqLwotCQltYXN0ZXJfZGF0YSB8PSAweDQwMDA7CiAJCS8qIGVuYWJsZSBQUEUxLCBJRTEgYW5kIFRJTUUxIGFzIG5lZWRlZCAqLwogCQltYXN0ZXJfZGF0YSB8PSAoY29udHJvbCA8PCA0KTsKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBzbGF2ZV9wb3J0LCAmc2xhdmVfZGF0YSk7CkBAIC03NzgsNiArNzk4LDkgQEAKIAkJCSh0aW1pbmdzW3Bpb11bMF0gPDwgMTIpIHwKIAkJCSh0aW1pbmdzW3Bpb11bMV0gPDwgOCk7CiAJfQorCisJLyogRW5hYmxlIFNJVFJFIChzZXBhcmF0ZSBzbGF2ZSB0aW1pbmcgcmVnaXN0ZXIpICovCisJbWFzdGVyX2RhdGEgfD0gMHg0MDAwOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCBtYXN0ZXJfZGF0YSk7CiAJaWYgKGlzX3NsYXZlKQogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBzbGF2ZV9wb3J0LCBzbGF2ZV9kYXRhKTsKQEAgLTc5NSw2ICs4MTgsMjIgQEAKIH0KIAogLyoqCisgKglwaWl4X3NldF9waW9tb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncworICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCisgKglAYWRldjogRHJpdmUgaW4gcXVlc3Rpb24KKyAqCisgKglTZXQgUElPIG1vZGUgZm9yIGRldmljZSwgaW4gaG9zdCBjb250cm9sbGVyIFBDSSBjb25maWcgc3BhY2UuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCisgKi8KKworc3RhdGljIHZvaWQgcGlpeF9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKK3sKKwlwaWl4X3NldF90aW1pbmdzKGFwLCBhZGV2LCBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzApOworfQorCisvKioKICAqCWRvX3BhdGFfc2V0X2RtYW1vZGUgLSBJbml0aWFsaXplIGhvc3QgY29udHJvbGxlciBQQVRBIFBJTyB0aW1pbmdzCiAgKglAYXA6IFBvcnQgd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKICAqCUBhZGV2OiBEcml2ZSBpbiBxdWVzdGlvbgpAQCAtODEwLDMxICs4NDksMjAgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXU4IG1hc3Rlcl9wb3J0CQk9IGFwLT5wb3J0X25vID8gMHg0MiA6IDB4NDA7Ci0JdTE2IG1hc3Rlcl9kYXRhOwogCXU4IHNwZWVkCQk9IGFkZXYtPmRtYV9tb2RlOwogCWludCBkZXZpZAkJPSBhZGV2LT5kZXZubyArIDIgKiBhcC0+cG9ydF9ubzsKIAl1OCB1ZG1hX2VuYWJsZQkJPSAwOwogCi0Jc3RhdGljIGNvbnN0CSAvKiBJU1AgIFJUQyAqLwotCXU4IHRpbWluZ3NbXVsyXQk9IHsgeyAwLCAwIH0sCi0JCQkgICAgeyAwLCAwIH0sCi0JCQkgICAgeyAxLCAwIH0sCi0JCQkgICAgeyAyLCAxIH0sCi0JCQkgICAgeyAyLCAzIH0sIH07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGlpeF9sb2NrLCBmbGFncyk7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCAmbWFzdGVyX2RhdGEpOwotCWlmIChhcC0+dWRtYV9tYXNrKQotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDgsICZ1ZG1hX2VuYWJsZSk7Ci0KIAlpZiAoc3BlZWQgPj0gWEZFUl9VRE1BXzApIHsKLQkJdW5zaWduZWQgaW50IHVkbWEgPSBhZGV2LT5kbWFfbW9kZSAtIFhGRVJfVURNQV8wOworCQl1bnNpZ25lZCBpbnQgdWRtYSA9IHNwZWVkIC0gWEZFUl9VRE1BXzA7CiAJCXUxNiB1ZG1hX3RpbWluZzsKIAkJdTE2IGlkZWNvbmY7CiAJCWludCB1X2Nsb2NrLCB1X3NwZWVkOwogCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaWl4X2xvY2ssIGZsYWdzKTsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDgsICZ1ZG1hX2VuYWJsZSk7CisKIAkJLyoKIAkJICogVURNQSBpcyBoYW5kbGVkIGJ5IGEgY29tYmluYXRpb24gb2YgY2xvY2sgc3dpdGNoaW5nIGFuZAogCQkgKiBzZWxlY3Rpb24gb2YgZGl2aWRlcnMKQEAgLTg2Nyw1NiArODk1LDIxIEBACiAJCQkgICBwZXJmb3JtYW5jZSAoV1JfUGluZ1BvbmdfRW4pICovCiAJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDU0LCBpZGVjb25mKTsKIAkJfQorCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHVkbWFfZW5hYmxlKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaWl4X2xvY2ssIGZsYWdzKTsKIAl9IGVsc2UgewotCQkvKgotCQkgKiBNV0RNQSBpcyBkcml2ZW4gYnkgdGhlIFBJTyB0aW1pbmdzLiBXZSBtdXN0IGFsc28gZW5hYmxlCi0JCSAqIElPUkRZIHVuY29uZGl0aW9uYWxseSBhbG9uZyB3aXRoIFRJTUUxLiBQUEUgaGFzIGFscmVhZHkKLQkJICogYmVlbiBzZXQgd2hlbiB0aGUgUElPIHRpbWluZyB3YXMgc2V0LgotCQkgKi8KLQkJdW5zaWduZWQgaW50IG13ZG1hCT0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX01XX0RNQV8wOwotCQl1bnNpZ25lZCBpbnQgY29udHJvbDsKLQkJdTggc2xhdmVfZGF0YTsKKwkJLyogTVdETUEgaXMgZHJpdmVuIGJ5IHRoZSBQSU8gdGltaW5ncy4gKi8KKwkJdW5zaWduZWQgaW50IG13ZG1hID0gc3BlZWQgLSBYRkVSX01XX0RNQV8wOwogCQljb25zdCB1bnNpZ25lZCBpbnQgbmVlZGVkX3Bpb1szXSA9IHsKIAkJCVhGRVJfUElPXzAsIFhGRVJfUElPXzMsIFhGRVJfUElPXzQKIAkJfTsKIAkJaW50IHBpbyA9IG5lZWRlZF9waW9bbXdkbWFdIC0gWEZFUl9QSU9fMDsKIAotCQljb250cm9sID0gMzsJLyogSU9SRFl8VElNRTEgKi8KLQotCQkvKiBJZiB0aGUgZHJpdmUgTVdETUEgaXMgZmFzdGVyIHRoYW4gaXQgY2FuIGRvIFBJTyB0aGVuCi0JCSAgIHdlIG11c3QgZm9yY2UgUElPIGludG8gUElPMCAqLwotCi0JCWlmIChhZGV2LT5waW9fbW9kZSA8IG5lZWRlZF9waW9bbXdkbWFdKQotCQkJLyogRW5hYmxlIERNQSB0aW1pbmcgb25seSAqLwotCQkJY29udHJvbCB8PSA4OwkvKiBQSU8gY3ljbGVzIGluIFBJTzAgKi8KLQotCQlpZiAoYWRldi0+ZGV2bm8pIHsJLyogU2xhdmUgKi8KLQkJCW1hc3Rlcl9kYXRhICY9IDB4RkY0RjsgIC8qIE1hc2sgb3V0IElPUkRZfFRJTUUxfERNQU9OTFkgKi8KLQkJCW1hc3Rlcl9kYXRhIHw9IGNvbnRyb2wgPDwgNDsKLQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0NCwgJnNsYXZlX2RhdGEpOwotCQkJc2xhdmVfZGF0YSAmPSAoYXAtPnBvcnRfbm8gPyAweDBmIDogMHhmMCk7Ci0JCQkvKiBMb2FkIHRoZSBtYXRjaGluZyB0aW1pbmcgKi8KLQkJCXNsYXZlX2RhdGEgfD0gKCh0aW1pbmdzW3Bpb11bMF0gPDwgMikgfCB0aW1pbmdzW3Bpb11bMV0pIDw8IChhcC0+cG9ydF9ubyA/IDQgOiAwKTsKLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDQsIHNsYXZlX2RhdGEpOwotCQl9IGVsc2UgeyAJLyogTWFzdGVyICovCi0JCQltYXN0ZXJfZGF0YSAmPSAweENDRjQ7CS8qIE1hc2sgb3V0IElPUkRZfFRJTUUxfERNQU9OTFkKLQkJCQkJCSAgIGFuZCBtYXN0ZXIgdGltaW5nIGJpdHMgKi8KLQkJCW1hc3Rlcl9kYXRhIHw9IGNvbnRyb2w7Ci0JCQltYXN0ZXJfZGF0YSB8PQotCQkJCSh0aW1pbmdzW3Bpb11bMF0gPDwgMTIpIHwKLQkJCQkodGltaW5nc1twaW9dWzFdIDw8IDgpOwotCQl9Ci0KLQkJaWYgKGFwLT51ZG1hX21hc2spCi0JCQl1ZG1hX2VuYWJsZSAmPSB+KDEgPDwgZGV2aWQpOwotCi0JCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCBtYXN0ZXJfZGF0YSk7CisJCS8qIFhGRVJfUElPXzAgaXMgbmV2ZXIgdXNlZCBjdXJyZW50bHkgKi8KKwkJcGlpeF9zZXRfdGltaW5ncyhhcCwgYWRldiwgcGlvKTsKIAl9Ci0JLyogRG9uJ3Qgc2NyaWJibGUgb24gMHg0OCBpZiB0aGUgY29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IFVETUEgKi8KLQlpZiAoYXAtPnVkbWFfbWFzaykKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgdWRtYV9lbmFibGUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGlpeF9sb2NrLCBmbGFncyk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggNGEzYTVhZS4uYzA0YWQ2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC0yOTM4LDcgKzI5MzgsNyBAQAogCWlmIChpZFtBVEFfSURfRklFTERfVkFMSURdICYgMikgewkvKiBFSURFIGRyaXZlICovCiAJCW1lbXNldCgmcCwgMCwgc2l6ZW9mKHApKTsKIAotCQlpZiAoc3BlZWQgPj0gWEZFUl9QSU9fMCAmJiBzcGVlZCA8PSBYRkVSX1NXX0RNQV8wKSB7CisJCWlmIChzcGVlZCA+PSBYRkVSX1BJT18wICYmIHNwZWVkIDwgWEZFUl9TV19ETUFfMCkgewogCQkJaWYgKHNwZWVkIDw9IFhGRVJfUElPXzIpCiAJCQkJcC5jeWNsZSA9IHAuY3ljOGIgPSBpZFtBVEFfSURfRUlERV9QSU9dOwogCQkJZWxzZSBpZiAoKHNwZWVkIDw9IFhGRVJfUElPXzQpIHx8CkBAIC02NzEzLDYgKzY3MTMsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Njc2lfc2xhdmVfY29uZmlnKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3kpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Njc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKTsKK0VYUE9SVF9TWU1CT0xfR1BMKF9fYXRhX2NoYW5nZV9xdWV1ZV9kZXB0aCk7CiBFWFBPUlRfU1lNQk9MX0dQTChzYXRhX3Njcl92YWxpZCk7CiBFWFBPUlRfU1lNQk9MX0dQTChzYXRhX3Njcl9yZWFkKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNhdGFfc2NyX3dyaXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKaW5kZXggZWQxNmZiZS4uYTliMjgyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CkBAIC0yNTMyLDggKzI1MzMsNyBAQAogCXJldHVybiByZXNldChsaW5rLCBjbGFzc2VzLCBkZWFkbGluZSk7CiB9CiAKLXN0YXRpYyBpbnQgYXRhX2VoX2ZvbGxvd3VwX3Nyc3RfbmVlZGVkKHN0cnVjdCBhdGFfbGluayAqbGluaywKLQkJCQkgICAgICAgaW50IHJjLCBjb25zdCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpCitzdGF0aWMgaW50IGF0YV9laF9mb2xsb3d1cF9zcnN0X25lZWRlZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIGludCByYykKIHsKIAlpZiAoKGxpbmstPmZsYWdzICYgQVRBX0xGTEFHX05PX1NSU1QpIHx8IGF0YV9saW5rX29mZmxpbmUobGluaykpCiAJCXJldHVybiAwOwpAQCAtMjcyNiw3ICsyNzI2LDcgQEAKIAogCQkvKiBwZXJmb3JtIGZvbGxvdy11cCBTUlNUIGlmIG5lY2Vzc2FyeSAqLwogCQlpZiAocmVzZXQgPT0gaGFyZHJlc2V0ICYmCi0JCSAgICBhdGFfZWhfZm9sbG93dXBfc3JzdF9uZWVkZWQobGluaywgcmMsIGNsYXNzZXMpKSB7CisJCSAgICBhdGFfZWhfZm9sbG93dXBfc3JzdF9uZWVkZWQobGluaywgcmMpKSB7CiAJCQlyZXNldCA9IHNvZnRyZXNldDsKIAogCQkJaWYgKCFyZXNldCkgewpAQCAtMjg4Myw3ICsyODgzLDcgQEAKIAkgICAgc2F0YV9zY3JfcmVhZChsaW5rLCBTQ1JfU1RBVFVTLCAmc3N0YXR1cykpCiAJCXJjID0gLUVSRVNUQVJUOwogCi0JaWYgKHJjID09IC1FUkVTVEFSVCB8fCB0cnkgPj0gbWF4X3RyaWVzKSB7CisJaWYgKHRyeSA+PSBtYXhfdHJpZXMpIHsKIAkJLyoKIAkJICogVGhhdyBob3N0IHBvcnQgZXZlbiBpZiByZXNldCBmYWlsZWQsIHNvIHRoYXQgdGhlIHBvcnQKIAkJICogY2FuIGJlIHJldHJpZWQgb24gdGhlIG5leHQgcGh5IGV2ZW50LiAgVGhpcyByaXNrcwpAQCAtMjkwOSw2ICsyOTA5LDE2IEBACiAJCWF0YV9laF9hY3F1aXJlKGFwKTsKIAl9CiAKKwkvKgorCSAqIFdoaWxlIGRpc2tzIHNwaW51cCBiZWhpbmQgUE1QLCBzb21lIGNvbnRyb2xsZXJzIGZhaWwgc2VuZGluZyBTUlNULgorCSAqIFRoZXkgbmVlZCB0byBiZSByZXNldCAtIGFzIHdlbGwgYXMgdGhlIFBNUCAtIGJlZm9yZSByZXRyeWluZy4KKwkgKi8KKwlpZiAocmMgPT0gLUVSRVNUQVJUKSB7CisJCWlmIChhdGFfaXNfaG9zdF9saW5rKGxpbmspKQorCQkJYXRhX2VoX3RoYXdfcG9ydChhcCk7CisJCWdvdG8gb3V0OworCX0KKwogCWlmICh0cnkgPT0gbWF4X3RyaWVzIC0gMSkgewogCQlzYXRhX2Rvd25fc3BkX2xpbWl0KGxpbmssIDApOwogCQlpZiAoc2xhdmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtcG1wLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtcG1wLmMKaW5kZXggM2ViMmI4MS4uMjFiODBjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXBtcC5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1wbXAuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgImxpYmF0YS5oIgpAQCAtMzg4LDEyICszODksOSBAQAogCQkJLyogbGluayByZXBvcnRzIG9mZmxpbmUgYWZ0ZXIgTFBNICovCiAJCQlsaW5rLT5mbGFncyB8PSBBVEFfTEZMQUdfTk9fTFBNOwogCi0JCQkvKiBDbGFzcyBjb2RlIHJlcG9ydCBpcyB1bnJlbGlhYmxlIGFuZCBTUlNUCi0JCQkgKiB0aW1lcyBvdXQgdW5kZXIgY2VydGFpbiBjb25maWd1cmF0aW9ucy4KLQkJCSAqLworCQkJLyogQ2xhc3MgY29kZSByZXBvcnQgaXMgdW5yZWxpYWJsZS4gKi8KIAkJCWlmIChsaW5rLT5wbXAgPCA1KQotCQkJCWxpbmstPmZsYWdzIHw9IEFUQV9MRkxBR19OT19TUlNUIHwKLQkJCQkJICAgICAgIEFUQV9MRkxBR19BU1NVTUVfQVRBOworCQkJCWxpbmstPmZsYWdzIHw9IEFUQV9MRkxBR19BU1NVTUVfQVRBOwogCiAJCQkvKiBwb3J0IDUgaXMgZm9yIFNFTUIgZGV2aWNlIGFuZCBpdCBkb2Vzbid0IGxpa2UgU1JTVCAqLwogCQkJaWYgKGxpbmstPnBtcCA9PSA1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKaW5kZXggNDZkMDg3Zi4uMmE1NDEyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CkBAIC0xMjE1LDI1ICsxMjE2LDE5IEBACiB9CiAKIC8qKgotICoJYXRhX3Njc2lfY2hhbmdlX3F1ZXVlX2RlcHRoIC0gU0NTSSBjYWxsYmFjayBmb3IgcXVldWUgZGVwdGggY29uZmlnCisgKglfX2F0YV9jaGFuZ2VfcXVldWVfZGVwdGggLSBoZWxwZXIgZm9yIGF0YV9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aAorICoJQGFwOiBBVEEgcG9ydCB0byB3aGljaCB0aGUgZGV2aWNlIGNoYW5nZSB0aGUgcXVldWUgZGVwdGgKICAqCUBzZGV2OiBTQ1NJIGRldmljZSB0byBjb25maWd1cmUgcXVldWUgZGVwdGggZm9yCiAgKglAcXVldWVfZGVwdGg6IG5ldyBxdWV1ZSBkZXB0aAogICoJQHJlYXNvbjogY2FsbGluZyBjb250ZXh0CiAgKgotICoJVGhpcyBpcyBsaWJhdGEgc3RhbmRhcmQgaG9zdHQtPmNoYW5nZV9xdWV1ZV9kZXB0aCBjYWxsYmFjay4KLSAqCVNDU0kgd2lsbCBjYWxsIGludG8gdGhpcyBjYWxsYmFjayB3aGVuIHVzZXIgdHJpZXMgdG8gc2V0IHF1ZXVlCi0gKglkZXB0aCB2aWEgc3lzZnMuCisgKglsaWJzYXMgYW5kIGxpYmF0YSBoYXZlIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBhc3NvY2lhdGluZyBhIHNkZXYgdG8KKyAqCWl0cyBhdGFfcG9ydC4KICAqCi0gKglMT0NLSU5HOgotICoJU0NTSSBsYXllciAod2UgZG9uJ3QgY2FyZSkKLSAqCi0gKglSRVRVUk5TOgotICoJTmV3bHkgY29uZmlndXJlZCBxdWV1ZSBkZXB0aC4KICAqLwotaW50IGF0YV9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxdWV1ZV9kZXB0aCwKLQkJCQlpbnQgcmVhc29uKQoraW50IF9fYXRhX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkgICAgIGludCBxdWV1ZV9kZXB0aCwgaW50IHJlYXNvbikKIHsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYXRhX3Nob3N0X3RvX3BvcnQoc2Rldi0+aG9zdCk7CiAJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMjY5LDYgKzEyNjQsMzAgQEAKIH0KIAogLyoqCisgKglhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGggLSBTQ1NJIGNhbGxiYWNrIGZvciBxdWV1ZSBkZXB0aCBjb25maWcKKyAqCUBzZGV2OiBTQ1NJIGRldmljZSB0byBjb25maWd1cmUgcXVldWUgZGVwdGggZm9yCisgKglAcXVldWVfZGVwdGg6IG5ldyBxdWV1ZSBkZXB0aAorICoJQHJlYXNvbjogY2FsbGluZyBjb250ZXh0CisgKgorICoJVGhpcyBpcyBsaWJhdGEgc3RhbmRhcmQgaG9zdHQtPmNoYW5nZV9xdWV1ZV9kZXB0aCBjYWxsYmFjay4KKyAqCVNDU0kgd2lsbCBjYWxsIGludG8gdGhpcyBjYWxsYmFjayB3aGVuIHVzZXIgdHJpZXMgdG8gc2V0IHF1ZXVlCisgKglkZXB0aCB2aWEgc3lzZnMuCisgKgorICoJTE9DS0lORzoKKyAqCVNDU0kgbGF5ZXIgKHdlIGRvbid0IGNhcmUpCisgKgorICoJUkVUVVJOUzoKKyAqCU5ld2x5IGNvbmZpZ3VyZWQgcXVldWUgZGVwdGguCisgKi8KK2ludCBhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcXVldWVfZGVwdGgsCisJCQkJaW50IHJlYXNvbikKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYXRhX3Nob3N0X3RvX3BvcnQoc2Rldi0+aG9zdCk7CisKKwlyZXR1cm4gX19hdGFfY2hhbmdlX3F1ZXVlX2RlcHRoKGFwLCBzZGV2LCBxdWV1ZV9kZXB0aCwgcmVhc29uKTsKK30KKworLyoqCiAgKglhdGFfc2NzaV9zdGFydF9zdG9wX3hsYXQgLSBUcmFuc2xhdGUgU0NTSSBTVEFSVCBTVE9QIFVOSVQgY29tbWFuZAogICoJQHFjOiBTdG9yYWdlIGZvciB0cmFuc2xhdGVkIEFUQSB0YXNrZmlsZQogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYwppbmRleCBjMjQxMjdkLi42M2Q1MzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogCkBAIC01NjksNyArNTcwLDcgQEAKIAogCS8qIFRyYW5zZmVyIHRyYWlsaW5nIGJ5dGUsIGlmIGFueS4gKi8KIAlpZiAodW5saWtlbHkoYnVmbGVuICYgMHgwMSkpIHsKLQkJdW5zaWduZWQgY2hhciBwYWRbMl07CisJCXVuc2lnbmVkIGNoYXIgcGFkWzJdID0geyB9OwogCiAJCS8qIFBvaW50IGJ1ZiB0byB0aGUgdGFpbCBvZiBidWZmZXIgKi8KIAkJYnVmICs9IGJ1ZmxlbiAtIDE7CkBAIC02MjgsNyArNjI5LDcgQEAKIAogCS8qIFRyYW5zZmVyIHRyYWlsaW5nIGJ5dGVzLCBpZiBhbnkgKi8KIAlpZiAodW5saWtlbHkoc2xvcCkpIHsKLQkJdW5zaWduZWQgY2hhciBwYWRbNF07CisJCXVuc2lnbmVkIGNoYXIgcGFkWzRdID0geyB9OwogCiAJCS8qIFBvaW50IGJ1ZiB0byB0aGUgdGFpbCBvZiBidWZmZXIgKi8KIAkJYnVmICs9IGJ1ZmxlbiAtIHNsb3A7CkBAIC02NzgsNyArNjc5LDcgQEAKIAl1bnNpZ25lZCBpbnQgY29uc3VtZWQ7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JY29uc3VtZWQgPSBhdGFfc2ZmX2RhdGFfeGZlcihkZXYsIGJ1ZiwgYnVmbGVuLCBydyk7CisJY29uc3VtZWQgPSBhdGFfc2ZmX2RhdGFfeGZlcjMyKGRldiwgYnVmLCBidWZsZW4sIHJ3KTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAlyZXR1cm4gY29uc3VtZWQ7CkBAIC0yNTA3LDYgKzI1MDgsNTYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGludCBhdGFfcGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqIGNvbnN0ICpwcGksCisJCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCwgdm9pZCAqaG9zdF9wcml2LAorCQlpbnQgaGZsYWdzLCBib29sIGJtZG1hKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBpOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IE5VTEw7CisJaW50IHJjOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJcGkgPSBhdGFfc2ZmX2ZpbmRfdmFsaWRfcGkocHBpKTsKKwlpZiAoIXBpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHZhbGlkIHBvcnRfaW5mbyBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWRldnJlc19vcGVuX2dyb3VwKGRldiwgTlVMTCwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCWlmIChibWRtYSkKKwkJLyogcHJlcGFyZSBhbmQgYWN0aXZhdGUgQk1ETUEgaG9zdCAqLworCQlyYyA9IGF0YV9wY2lfYm1kbWFfcHJlcGFyZV9ob3N0KHBkZXYsIHBwaSwgJmhvc3QpOworCWVsc2UKKwkJLyogcHJlcGFyZSBhbmQgYWN0aXZhdGUgU0ZGIGhvc3QgKi8KKwkJcmMgPSBhdGFfcGNpX3NmZl9wcmVwYXJlX2hvc3QocGRldiwgcHBpLCAmaG9zdCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlob3N0LT5wcml2YXRlX2RhdGEgPSBob3N0X3ByaXY7CisJaG9zdC0+ZmxhZ3MgfD0gaGZsYWdzOworCisJaWYgKGJtZG1hKSB7CisJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCQlyYyA9IGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QoaG9zdCwgYXRhX2JtZG1hX2ludGVycnVwdCwgc2h0KTsKKwl9IGVsc2UKKwkJcmMgPSBhdGFfcGNpX3NmZl9hY3RpdmF0ZV9ob3N0KGhvc3QsIGF0YV9zZmZfaW50ZXJydXB0LCBzaHQpOworb3V0OgorCWlmIChyYyA9PSAwKQorCQlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwpOworCWVsc2UKKwkJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJnBkZXYtPmRldiwgTlVMTCk7CisKKwlyZXR1cm4gcmM7Cit9CisKIC8qKgogICoJYXRhX3BjaV9zZmZfaW5pdF9vbmUgLSBJbml0aWFsaXplL3JlZ2lzdGVyIFBJTy1vbmx5IFBDSSBJREUgY29udHJvbGxlcgogICoJQHBkZXY6IENvbnRyb2xsZXIgdG8gYmUgaW5pdGlhbGl6ZWQKQEAgLTI1MzMsNDEgKzI1ODQsNyBAQAogCQkgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKiBjb25zdCAqcHBpLAogCQkgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0LCB2b2lkICpob3N0X3ByaXYsIGludCBoZmxhZykKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwaTsKLQlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBOVUxMOwotCWludCByYzsKLQotCURQUklOVEsoIkVOVEVSXG4iKTsKLQotCXBpID0gYXRhX3NmZl9maW5kX3ZhbGlkX3BpKHBwaSk7Ci0JaWYgKCFwaSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyB2YWxpZCBwb3J0X2luZm8gc3BlY2lmaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFkZXZyZXNfb3Blbl9ncm91cChkZXYsIE5VTEwsIEdGUF9LRVJORUwpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyYykKLQkJZ290byBvdXQ7Ci0KLQkvKiBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBTRkYgaG9zdCAqLwotCXJjID0gYXRhX3BjaV9zZmZfcHJlcGFyZV9ob3N0KHBkZXYsIHBwaSwgJmhvc3QpOwotCWlmIChyYykKLQkJZ290byBvdXQ7Ci0JaG9zdC0+cHJpdmF0ZV9kYXRhID0gaG9zdF9wcml2OwotCWhvc3QtPmZsYWdzIHw9IGhmbGFnOwotCi0JcmMgPSBhdGFfcGNpX3NmZl9hY3RpdmF0ZV9ob3N0KGhvc3QsIGF0YV9zZmZfaW50ZXJydXB0LCBzaHQpOwotb3V0OgotCWlmIChyYyA9PSAwKQotCQlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwpOwotCWVsc2UKLQkJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJnBkZXYtPmRldiwgTlVMTCk7Ci0KLQlyZXR1cm4gcmM7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcHBpLCBzaHQsIGhvc3RfcHJpdiwgaGZsYWcsIDApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9zZmZfaW5pdF9vbmUpOwogCkBAIC0zMjg2LDQyICszMzAzLDcgQEAKIAkJCSAgIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCwgdm9pZCAqaG9zdF9wcml2LAogCQkJICAgaW50IGhmbGFncykKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwaTsKLQlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBOVUxMOwotCWludCByYzsKLQotCURQUklOVEsoIkVOVEVSXG4iKTsKLQotCXBpID0gYXRhX3NmZl9maW5kX3ZhbGlkX3BpKHBwaSk7Ci0JaWYgKCFwaSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyB2YWxpZCBwb3J0X2luZm8gc3BlY2lmaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFkZXZyZXNfb3Blbl9ncm91cChkZXYsIE5VTEwsIEdGUF9LRVJORUwpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyYykKLQkJZ290byBvdXQ7Ci0KLQkvKiBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBCTURNQSBob3N0ICovCi0JcmMgPSBhdGFfcGNpX2JtZG1hX3ByZXBhcmVfaG9zdChwZGV2LCBwcGksICZob3N0KTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0OwotCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhvc3RfcHJpdjsKLQlob3N0LT5mbGFncyB8PSBoZmxhZ3M7Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQlyYyA9IGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QoaG9zdCwgYXRhX2JtZG1hX2ludGVycnVwdCwgc2h0KTsKLSBvdXQ6Ci0JaWYgKHJjID09IDApCi0JCWRldnJlc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldiwgTlVMTCk7Ci0JZWxzZQotCQlkZXZyZXNfcmVsZWFzZV9ncm91cCgmcGRldi0+ZGV2LCBOVUxMKTsKLQotCXJldHVybiByYzsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGksIHNodCwgaG9zdF9wcml2LCBoZmxhZ3MsIDEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9ibWRtYV9pbml0X29uZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCmluZGV4IGNhZGQ2NzkuLjYxZGEwNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbGkuYwpAQCAtNTYsNyArNTYsNyBAQAogCQl9LAogCX0sCiAJewotCQkuaWRlbnQgPSAiVG9zaGliYSBTYXRlbGl0ZSBTMTgwMC04MTQiLAorCQkuaWRlbnQgPSAiVG9zaGliYSBTYXRlbGxpdGUgUzE4MDAtODE0IiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJUT1NISUJBIiksCiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlMxODAwLTgxNCIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hcmFzYW5fY2YuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJhc2FuX2NmLmMKaW5kZXggNzE5YmI3My4uZTg1NzRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hcmFzYW5fY2YuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FyYXNhbl9jZi5jCkBAIC05MjIsOCArOTIyLDcgQEAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgYXJhc2FuX2NmX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGFyYXNhbl9jZl9kZXYgKmFjZGV2ID0gaG9zdC0+cG9ydHNbMF0tPnByaXZhdGVfZGF0YTsKIAogCWlmIChhY2Rldi0+ZG1hX2NoYW4pIHsKQEAgLTkzNyw4ICs5MzYsNyBAQAogCiBzdGF0aWMgaW50IGFyYXNhbl9jZl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGFyYXNhbl9jZl9kZXYgKmFjZGV2ID0gaG9zdC0+cG9ydHNbMF0tPnByaXZhdGVfZGF0YTsKIAogCWNmX2luaXQoYWNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCmluZGV4IDc4YTkzYjYuLjRiOGIyMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKQEAgLTIsNyArMiw3IEBACiAgKiAgICBwYXRhX2FydG9wLmMgLSBBUlRPUCBBVEEgY29udHJvbGxlciBkcml2ZXIKICAqCiAgKgkoQykgMjAwNiBSZWQgSGF0Ci0gKgkoQykgMjAwNyBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6CisgKgkoQykgMjAwNywyMDExIEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3oKICAqCiAgKiAgICBCYXNlZCBpbiBwYXJ0IG9uIGRyaXZlcnMvaWRlL3BjaS9hZWM2Mnh4LmMKICAqCUNvcHlyaWdodCAoQykgMTk5OS0yMDAyCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfYXJ0b3AiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC42IgogCiAvKgogICoJVGhlIEFSVE9QIGhhcyAzMyBNaHogYW5kICJvdmVyIGNsb2NrZWQiIHRpbWluZyB0YWJsZXMuIFVudGlsIHdlCkBAIC0zOSwzMSArMzksMTUgQEAKIAogc3RhdGljIGludCBjbG9jayA9IDA7CiAKLXN0YXRpYyBpbnQgYXJ0b3A2MjEwX3ByZV9yZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCi17Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQljb25zdCBzdHJ1Y3QgcGNpX2JpdHMgYXJ0b3BfZW5hYmxlX2JpdHNbXSA9IHsKLQkJeyAweDRBVSwgMVUsIDB4MDJVTCwgMHgwMlVMIH0sCS8qIHBvcnQgMCAqLwotCQl7IDB4NEFVLCAxVSwgMHgwNFVMLCAweDA0VUwgfSwJLyogcG9ydCAxICovCi0JfTsKLQotCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmFydG9wX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmV0dXJuIGF0YV9zZmZfcHJlcmVzZXQobGluaywgZGVhZGxpbmUpOwotfQotCiAvKioKLSAqCWFydG9wNjI2MF9wcmVfcmVzZXQJLQljaGVjayBmb3IgNDAvODAgcGluCisgKglhcnRvcDYyeDBfcHJlX3Jlc2V0CS0JcHJvYmUgYmVnaW4KICAqCUBsaW5rOiBsaW5rCiAgKglAZGVhZGxpbmU6IGRlYWRsaW5lIGppZmZpZXMgZm9yIHRoZSBvcGVyYXRpb24KICAqCi0gKglUaGUgQVJUT1AgaGFyZHdhcmUgcmVwb3J0cyB0aGUgY2FibGUgZGV0ZWN0IGJpdHMgaW4gcmVnaXN0ZXIgMHg0OS4KICAqCU5vdGhpbmcgY29tcGxpY2F0ZWQgbmVlZGVkIGhlcmUuCiAgKi8KIAotc3RhdGljIGludCBhcnRvcDYyNjBfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKK3N0YXRpYyBpbnQgYXJ0b3A2MngwX3ByZV9yZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyBhcnRvcF9lbmFibGVfYml0c1tdID0gewogCQl7IDB4NEFVLCAxVSwgMHgwMlVMLCAweDAyVUwgfSwJLyogcG9ydCAwICovCkBAIC03Myw3ICs1Nyw3IEBACiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAotCS8qIE9kZCBudW1iZXJlZCBkZXZpY2UgaWRzIGFyZSB0aGUgdW5pdHMgd2l0aCBlbmFibGUgYml0cyAodGhlIC1SIGNhcmRzKSAqLworCS8qIE9kZCBudW1iZXJlZCBkZXZpY2UgaWRzIGFyZSB0aGUgdW5pdHMgd2l0aCBlbmFibGUgYml0cy4gKi8KIAlpZiAoKHBkZXYtPmRldmljZSAmIDEpICYmCiAJICAgICFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmYXJ0b3BfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0zMTcsNyArMzAxLDcgQEAKIAkuY2FibGVfZGV0ZWN0CQk9IGF0YV9jYWJsZV80MHdpcmUsCiAJLnNldF9waW9tb2RlCQk9IGFydG9wNjIxMF9zZXRfcGlvbW9kZSwKIAkuc2V0X2RtYW1vZGUJCT0gYXJ0b3A2MjEwX3NldF9kbWFtb2RlLAotCS5wcmVyZXNldAkJPSBhcnRvcDYyMTBfcHJlX3Jlc2V0LAorCS5wcmVyZXNldAkJPSBhcnRvcDYyeDBfcHJlX3Jlc2V0LAogCS5xY19kZWZlcgkJPSBhcnRvcDYyMTBfcWNfZGVmZXIsCiB9OwogCkBAIC0zMjYsOSArMzEwLDM2IEBACiAJLmNhYmxlX2RldGVjdAkJPSBhcnRvcDYyNjBfY2FibGVfZGV0ZWN0LAogCS5zZXRfcGlvbW9kZQkJPSBhcnRvcDYyNjBfc2V0X3Bpb21vZGUsCiAJLnNldF9kbWFtb2RlCQk9IGFydG9wNjI2MF9zZXRfZG1hbW9kZSwKLQkucHJlcmVzZXQJCT0gYXJ0b3A2MjYwX3ByZV9yZXNldCwKKwkucHJlcmVzZXQJCT0gYXJ0b3A2MngwX3ByZV9yZXNldCwKIH07CiAKK3N0YXRpYyB2b2lkIGF0cDh4eF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZiAocGRldi0+ZGV2aWNlID09IDB4MDAwNSkKKwkJLyogQklPUyBtYXkgaGF2ZSBsZWZ0IHVzIGluIFVETUEsIGNsZWFyIGl0IGJlZm9yZSBsaWJhdGEgcHJvYmUgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTQsIDApOworCWVsc2UgaWYgKHBkZXYtPmRldmljZSA9PSAweDAwMDggfHwgcGRldi0+ZGV2aWNlID09IDB4MDAwOSkgeworCQl1OCByZWc7CisKKwkJLyogTWFjIHN5c3RlbXMgY29tZSB1cCB3aXRoIHNvbWUgcmVnaXN0ZXJzIG5vdCBzZXQgYXMgd2UKKwkJICAgd2lsbCBuZWVkIHRoZW0gKi8KKworCQkvKiBDbGVhciByZXNldCAmIHRlc3QgYml0cyAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQ5LCAmcmVnKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDksIHJlZyAmIH4weDMwKTsKKworCQkvKiBQQ0kgbGF0ZW5jeSBtdXN0IGJlID4gMHg4MCBmb3IgYnVyc3QgbW9kZSwgdHdlYWsgaXQKKwkJICogaWYgcmVxdWlyZWQuCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnJlZyk7CisJCWlmIChyZWcgPD0gMHg4MCkKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg5MCk7CisKKwkJLyogRW5hYmxlIElSUSBvdXRwdXQgYW5kIGJ1cnN0IG1vZGUgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0YSwgJnJlZyk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDRhLCAocmVnICYgfjB4MDEpIHwgMHg4MCk7CisJfQorfQogCiAvKioKICAqCWFydG9wX2luaXRfb25lIC0gUmVnaXN0ZXIgQVJUT1AgQVRBIFBDSSBkZXZpY2Ugd2l0aCBrZXJuZWwgc2VydmljZXMKQEAgLTM4Myw0MiArMzk0LDIyIEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlpZiAoaWQtPmRyaXZlcl9kYXRhID09IDApIHsJLyogNjIxMCB2YXJpYW50ICovCisJaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSAwKQkvKiA2MjEwIHZhcmlhbnQgKi8KIAkJcHBpWzBdID0gJmluZm9fNjIxMDsKLQkJLyogQklPUyBtYXkgaGF2ZSBsZWZ0IHVzIGluIFVETUEsIGNsZWFyIGl0IGJlZm9yZSBsaWJhdGEgcHJvYmUgKi8KLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTQsIDApOwotCX0KIAllbHNlIGlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gMSkJLyogNjI2MCAqLwogCQlwcGlbMF0gPSAmaW5mb182MjZ4OwogCWVsc2UgaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSAyKQl7IC8qIDYyODAgb3IgNjI4MCArIGZhc3QgKi8KIAkJdW5zaWduZWQgbG9uZyBpbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KTsKLQkJdTggcmVnOwogCiAJCXBwaVswXSA9ICZpbmZvXzYyOHg7CiAJCWlmIChpbmIoaW8pICYgMHgxMCkKIAkJCXBwaVswXSA9ICZpbmZvXzYyOHhfZmFzdDsKLQkJLyogTWFjIHN5c3RlbXMgY29tZSB1cCB3aXRoIHNvbWUgcmVnaXN0ZXJzIG5vdCBzZXQgYXMgd2UKLQkJICAgd2lsbCBuZWVkIHRoZW0gKi8KLQotCQkvKiBDbGVhciByZXNldCAmIHRlc3QgYml0cyAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQ5LCAmcmVnKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDksIHJlZyAmIH4gMHgzMCk7Ci0KLQkJLyogUENJIGxhdGVuY3kgbXVzdCBiZSA+IDB4ODAgZm9yIGJ1cnN0IG1vZGUsIHR3ZWFrIGl0Ci0JCSAqIGlmIHJlcXVpcmVkLgotCQkgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZyZWcpOwotCQlpZiAocmVnIDw9IDB4ODApCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4OTApOwotCi0JCS8qIEVuYWJsZSBJUlEgb3V0cHV0IGFuZCBidXJzdCBtb2RlICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NGEsICZyZWcpOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0YSwgKHJlZyAmIH4weDAxKSB8IDB4ODApOwotCiAJfQogCiAJQlVHX09OKHBwaVswXSA9PSBOVUxMKTsKIAorCWF0cDh4eF9maXh1cChwZGV2KTsKKwogCXJldHVybiBhdGFfcGNpX2JtZG1hX2luaXRfb25lKHBkZXYsIHBwaSwgJmFydG9wX3NodCwgTlVMTCwgMCk7CiB9CiAKQEAgLTQzMiwxMSArNDIzLDMyIEBACiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGF0cDh4eF9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpbnQgcmM7CisKKwlyYyA9IGF0YV9wY2lfZGV2aWNlX2RvX3Jlc3VtZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWF0cDh4eF9maXh1cChwZGV2KTsKKworCWF0YV9ob3N0X3Jlc3VtZShob3N0KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYXJ0b3BfcGNpX2RyaXZlciA9IHsKIAkubmFtZQkJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCQk9IGFydG9wX3BjaV90YmwsCiAJLnByb2JlCQkJPSBhcnRvcF9pbml0X29uZSwKIAkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBhdHA4eHhfcmVpbml0X29uZSwKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBfX2luaXQgYXJ0b3BfaW5pdCh2b2lkKQpAQCAtNDUyLDkgKzQ2NCw4IEBACiBtb2R1bGVfaW5pdChhcnRvcF9pbml0KTsKIG1vZHVsZV9leGl0KGFydG9wX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3gsIEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3oiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU0NTSSBsb3ctbGV2ZWwgZHJpdmVyIGZvciBBUlRPUCBQQVRBIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYXJ0b3BfcGNpX3RibCk7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYXQ5MS5jIGIvZHJpdmVycy9hdGEvcGF0YV9hdDkxLmMKaW5kZXggOTYwYzcyNS4uYTc2ZjI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hdDkxLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hdDkxLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJCSJwYXRhX2F0OTEiCiAjZGVmaW5lIERSVl9WRVJTSU9OCQkiMC4zIgpAQCAtNDE0LDEwICs0MTQsMTMgQEAKIAogCWhvc3QtPnByaXZhdGVfZGF0YSA9IGluZm87CiAKLQlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgaXJxID8gZ3Bpb190b19pcnEoaXJxKSA6IDAsCisJcmV0ID0gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgaXJxID8gZ3Bpb190b19pcnEoaXJxKSA6IDAsCiAJCQlpcnEgPyBhdGFfc2ZmX2ludGVycnVwdCA6IE5VTEwsCiAJCQlpcnFfZmxhZ3MsICZwYXRhX2F0OTFfc2h0KTsKIAorCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKwogZXJyX3B1dDoKIAljbGtfcHV0KGluZm8tPm1jayk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCmluZGV4IDQzNzU1NjEuLmJlMWFhMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYwpAQCAtNDksNiArNDksMzEgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYXRpaXhwX2xvY2spOwogCiAvKioKKyAqCWF0aWl4cF9wcmVyZXNldAktCXBlcmZvcm0gcmVzZXQgaGFuZGxpbmcKKyAqCUBsaW5rOiBBVEEgbGluaworICoJQGRlYWRsaW5lOiBkZWFkbGluZSBqaWZmaWVzIGZvciB0aGUgb3BlcmF0aW9uCisgKgorICoJUmVzZXQgc2VxdWVuY2UgY2hlY2tpbmcgZW5hYmxlIGJpdHMgdG8gc2VlIHdoaWNoIHBvcnRzIGFyZQorICoJYWN0aXZlLgorICovCisKK3N0YXRpYyBpbnQgYXRpaXhwX3ByZXJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9iaXRzIGF0aWl4cF9lbmFibGVfYml0c1tdID0geworCQl7IDB4NDgsIDEsIDB4MDEsIDB4MDAgfSwKKwkJeyAweDQ4LCAxLCAweDA4LCAweDAwIH0KKwl9OworCisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKworCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmF0aWl4cF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiBhdGFfc2ZmX3ByZXJlc2V0KGxpbmssIGRlYWRsaW5lKTsKK30KKworLyoqCiAgKglhdGlpeHBfc2V0X3Bpb190aW1pbmcJLQlzZXQgaW5pdGlhbCBQSU8gbW9kZSBkYXRhCiAgKglAYXA6IEFUQSBpbnRlcmZhY2UKICAqCUBhZGV2OiBBVEEgZGV2aWNlCkBAIC0yMjEsNiArMjQ2LDcgQEAKIAkuYm1kbWFfc3RhcnQgCT0gYXRpaXhwX2JtZG1hX3N0YXJ0LAogCS5ibWRtYV9zdG9wCT0gYXRpaXhwX2JtZG1hX3N0b3AsCiAKKwkucHJlcmVzZXQJPSBhdGlpeHBfcHJlcmVzZXQsCiAJLmNhYmxlX2RldGVjdAk9IGF0aWl4cF9jYWJsZV9kZXRlY3QsCiAJLnNldF9waW9tb2RlCT0gYXRpaXhwX3NldF9waW9tb2RlLAogCS5zZXRfZG1hbW9kZQk9IGF0aWl4cF9zZXRfZG1hbW9kZSwKQEAgLTIzNSwxNiArMjYxLDcgQEAKIAkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNSwKIAkJLnBvcnRfb3BzID0gJmF0aWl4cF9wb3J0X29wcwogCX07Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyBhdGlpeHBfZW5hYmxlX2JpdHNbXSA9IHsKLQkJeyAweDQ4LCAxLCAweDAxLCAweDAwIH0sCi0JCXsgMHg0OCwgMSwgMHgwOCwgMHgwMCB9Ci0JfTsKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCAmaW5mbyB9OwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLQkJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmYXRpaXhwX2VuYWJsZV9iaXRzW2ldKSkKLQkJCXBwaVtpXSA9ICZhdGFfZHVtbXlfcG9ydF9pbmZvOwogCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUocGRldiwgcHBpLCAmYXRpaXhwX3NodCwgTlVMTCwKIAkJCQkgICAgICBBVEFfSE9TVF9QQVJBTExFTF9TQ0FOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCmluZGV4IDdiYWZjMTYuLmUxZmIzOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYwpAQCAtODIsNyArODIsNyBAQAogfQogCiAvKioKLSAqCWNtZDY0eF9zZXRfcGlvbW9kZQktCXNldCBQSU8gYW5kIE1XRE1BIHRpbWluZworICoJY21kNjR4X3NldF90aW1pbmcJLQlzZXQgUElPIGFuZCBNV0RNQSB0aW1pbmcKICAqCUBhcDogQVRBIGludGVyZmFjZQogICoJQGFkZXY6IEFUQSBkZXZpY2UKICAqCUBtb2RlOiBtb2RlCkBAIC0yODgsNiArMjg4LDIyIEBACiAJLmNhYmxlX2RldGVjdAk9IGNtZDY0OF9jYWJsZV9kZXRlY3QsCiB9OwogCitzdGF0aWMgdm9pZCBjbWQ2NHhfZml4dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTggbXJkbW9kZTsKKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgNjQpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE1SRE1PREUsICZtcmRtb2RlKTsKKwltcmRtb2RlICY9IH4weDMwOwkvKiBJUlEgc2V0IHVwICovCisJbXJkbW9kZSB8PSAweDAyOwkvKiBNZW1vcnkgcmVhZCBsaW5lIGVuYWJsZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBNUkRNT0RFLCBtcmRtb2RlKTsKKworCS8qIFBQQyBzcGVjaWZpYyBmaXh1cCBjb3BpZWQgZnJvbSBvbGQgZHJpdmVyICovCisjaWZkZWYgQ09ORklHX1BQQworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBVRElERVRDUjAsIDB4RjApOworI2VuZGlmCit9CisKIHN0YXRpYyBpbnQgY21kNjR4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGNtZF9pbmZvWzZdID0gewpAQCAtMzM2LDcgKzM1Miw3IEBACiAJCSZjbWRfaW5mb1tpZC0+ZHJpdmVyX2RhdGFdLAogCQlOVUxMCiAJfTsKLQl1OCBtcmRtb2RlLCByZWc7CisJdTggcmVnOwogCWludCByYzsKIAlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlID0gcGRldi0+YnVzLT5zZWxmOwogCS8qIG1vYmlsaXR5IHNwbGl0IGJyaWRnZXMgZG9uJ3QgcmVwb3J0IGVuYWJsZWQgcG9ydHMgY29ycmVjdGx5ICovCkBAIC0zNjgsMTEgKzM4NCw3IEBACiAJCQljbnRybF9jaDBfb2sgPSAwOwogCX0KIAotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgNjQpOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE1SRE1PREUsICZtcmRtb2RlKTsKLQltcmRtb2RlICY9IH4gMHgzMDsJLyogSVJRIHNldCB1cCAqLwotCW1yZG1vZGUgfD0gMHgwMjsJLyogTWVtb3J5IHJlYWQgbGluZSBlbmFibGUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTVJETU9ERSwgbXJkbW9kZSk7CisJY21kNjR4X2ZpeHVwKHBkZXYpOwogCiAJLyogY2hlY2sgZm9yIGVuYWJsZWQgcG9ydHMgKi8KIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBDTlRSTCwgJnJlZyk7CkBAIC0zODgsMTMgKzQwMCw2IEBACiAJCXBwaVsxXSA9ICZhdGFfZHVtbXlfcG9ydF9pbmZvOwogCX0KIAotCS8qIEZvcmNlIFBJTyAwIGhlcmUuLiAqLwotCi0JLyogUFBDIHNwZWNpZmljIGZpeHVwIGNvcGllZCBmcm9tIG9sZCBkcml2ZXIgKi8KLSNpZmRlZiBDT05GSUdfUFBDCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFVESURFVENSMCwgMHhGMCk7Ci0jZW5kaWYKLQogCXJldHVybiBhdGFfcGNpX2JtZG1hX2luaXRfb25lKHBkZXYsIHBwaSwgJmNtZDY0eF9zaHQsIE5VTEwsIDApOwogfQogCkBAIC00MDIsMjEgKzQwNywxNCBAQAogc3RhdGljIGludCBjbWQ2NHhfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0JdTggbXJkbW9kZTsKIAlpbnQgcmM7CiAKIAlyYyA9IGF0YV9wY2lfZGV2aWNlX2RvX3Jlc3VtZShwZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgNjQpOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE1SRE1PREUsICZtcmRtb2RlKTsKLQltcmRtb2RlICY9IH4gMHgzMDsJLyogSVJRIHNldCB1cCAqLwotCW1yZG1vZGUgfD0gMHgwMjsJLyogTWVtb3J5IHJlYWQgbGluZSBlbmFibGUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTVJETU9ERSwgbXJkbW9kZSk7Ci0jaWZkZWYgQ09ORklHX1BQQwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBVRElERVRDUjAsIDB4RjApOwotI2VuZGlmCisJY21kNjR4X2ZpeHVwKHBkZXYpOworCiAJYXRhX2hvc3RfcmVzdW1lKGhvc3QpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKaW5kZXggMDNhOTMxOC4uYTBiNDY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgogCi0jZGVmaW5lIERSVl9OQU1FCSJjczU1MzUiCisjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2NzNTUzNSIKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMi4xMiIKIAogLyoKQEAgLTY3LDggKzY3LDYgQEAKIAogI2RlZmluZSBDUzU1MzVfQ0FCTEVfREVURUNUICAgIDB4NDgKIAotI2RlZmluZSBDUzU1MzVfQkFEX1BJTyh0aW1pbmdzKSAoICh0aW1pbmdzJn4weDgwMDAwMDAwVUwpPT0weDAwMDA5MTcyICkKLQogLyoqCiAgKgljczU1MzVfY2FibGVfZGV0ZWN0CS0JZGV0ZWN0IGNhYmxlIHR5cGUKICAqCUBhcDogUG9ydCB0byBkZXRlY3Qgb24KQEAgLTE4OCwxNiArMTg2LDYgQEAKIAl9OwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sICZhdGFfZHVtbXlfcG9ydF9pbmZvIH07CiAKLQl1MzIgdGltaW5ncywgZHVtbXk7Ci0KLQkvKiBDaGVjayB0aGUgQklPUyBzZXQgdGhlIGluaXRpYWwgdGltaW5nIGNsb2NrLiBJZiBub3Qgc2V0IHRoZQotCSAgIHRpbWluZ3MgZm9yIFBJTzAgKi8KLQlyZG1zcihBVEFDX0NIMEQwX1BJTywgdGltaW5ncywgZHVtbXkpOwotCWlmIChDUzU1MzVfQkFEX1BJTyh0aW1pbmdzKSkKLQkJd3Jtc3IoQVRBQ19DSDBEMF9QSU8sIDB4RjdGNEY3RjRVTCwgMCk7Ci0JcmRtc3IoQVRBQ19DSDBEMV9QSU8sIHRpbWluZ3MsIGR1bW15KTsKLQlpZiAoQ1M1NTM1X0JBRF9QSU8odGltaW5ncykpCi0JCXdybXNyKEFUQUNfQ0gwRDFfUElPLCAweEY3RjRGN0Y0VUwsIDApOwogCXJldHVybiBhdGFfcGNpX2JtZG1hX2luaXRfb25lKGRldiwgcHBpLCAmY3M1NTM1X3NodCwgTlVMTCwgMCk7CiB9CiAKQEAgLTIzMCw3ICsyMTgsNyBAQAogfQogCiBNT0RVTEVfQVVUSE9SKCJBbGFuIENveCwgSmVucyBBbHRtYW5uLCBXb2xmZ2FuIFp1bGVnZXIsIEFsZXhhbmRlciBLaWF1c2NoIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIHRoZSBOUy9BTUQgNTUzMCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciB0aGUgTlMvQU1EIDU1MzUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjczU1MzUpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYwppbmRleCBhY2E0N2U0Li5mMDI0M2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYwpAQCAtNzMsNyArNzMsNyBAQAogLyoqCiAgKgllZmFyX3NldF9waW9tb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncwogICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCi0gKglAYWRldjogdW0KKyAqCUBhZGV2OiBEZXZpY2UgdG8gcHJvZ3JhbQogICoKICAqCVNldCBQSU8gbW9kZSBmb3IgZGV2aWNlLCBpbiBob3N0IGNvbnRyb2xsZXIgUENJIGNvbmZpZyBzcGFjZS4KICAqCkBAIC04NSw5ICs4NSw5IEBACiB7CiAJdW5zaWduZWQgaW50IHBpbwk9IGFkZXYtPnBpb19tb2RlIC0gWEZFUl9QSU9fMDsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQl1bnNpZ25lZCBpbnQgaWRldG1fcG9ydD0gYXAtPnBvcnRfbm8gPyAweDQyIDogMHg0MDsKKwl1bnNpZ25lZCBpbnQgbWFzdGVyX3BvcnQgPSBhcC0+cG9ydF9ubyA/IDB4NDIgOiAweDQwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IGlkZXRtX2RhdGE7CisJdTE2IG1hc3Rlcl9kYXRhOwogCXU4IHVkbWFfZW5hYmxlOwogCWludCBjb250cm9sID0gMDsKIApAQCAtMTEzLDIwICsxMTMsMjAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlZmFyX2xvY2ssIGZsYWdzKTsKIAotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgaWRldG1fcG9ydCwgJmlkZXRtX2RhdGEpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsICZtYXN0ZXJfZGF0YSk7CiAKIAkvKiBTZXQgUFBFLCBJRSwgYW5kIFRJTUUgYXMgYXBwcm9wcmlhdGUgKi8KIAlpZiAoYWRldi0+ZGV2bm8gPT0gMCkgewotCQlpZGV0bV9kYXRhICY9IDB4Q0NGMDsKLQkJaWRldG1fZGF0YSB8PSBjb250cm9sOwotCQlpZGV0bV9kYXRhIHw9ICh0aW1pbmdzW3Bpb11bMF0gPDwgMTIpIHwKKwkJbWFzdGVyX2RhdGEgJj0gMHhDQ0YwOworCQltYXN0ZXJfZGF0YSB8PSBjb250cm9sOworCQltYXN0ZXJfZGF0YSB8PSAodGltaW5nc1twaW9dWzBdIDw8IDEyKSB8CiAJCQkodGltaW5nc1twaW9dWzFdIDw8IDgpOwogCX0gZWxzZSB7CiAJCWludCBzaGlmdCA9IDQgKiBhcC0+cG9ydF9ubzsKIAkJdTggc2xhdmVfZGF0YTsKIAotCQlpZGV0bV9kYXRhICY9IDB4RkYwRjsKLQkJaWRldG1fZGF0YSB8PSAoY29udHJvbCA8PCA0KTsKKwkJbWFzdGVyX2RhdGEgJj0gMHhGRjBGOworCQltYXN0ZXJfZGF0YSB8PSAoY29udHJvbCA8PCA0KTsKIAogCQkvKiBTbGF2ZSB0aW1pbmcgaW4gc2VwYXJhdGUgcmVnaXN0ZXIgKi8KIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ0LCAmc2xhdmVfZGF0YSk7CkBAIC0xMzUsOCArMTM1LDggQEAKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0NCwgc2xhdmVfZGF0YSk7CiAJfQogCi0JaWRldG1fZGF0YSB8PSAweDQwMDA7CS8qIEVuc3VyZSBTSVRSRSBpcyBzZXQgKi8KLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBpZGV0bV9wb3J0LCBpZGV0bV9kYXRhKTsKKwltYXN0ZXJfZGF0YSB8PSAweDQwMDA7CS8qIEVuc3VyZSBTSVRSRSBpcyBzZXQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBtYXN0ZXJfcG9ydCwgbWFzdGVyX2RhdGEpOwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCAmdWRtYV9lbmFibGUpOwogCXVkbWFfZW5hYmxlICY9IH4oMSA8PCAoMiAqIGFwLT5wb3J0X25vICsgYWRldi0+ZGV2bm8pKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCmluZGV4IDZjNzdkNjguLjQyY2ZmZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYwpAQCAtMTExLDYgKzExMSwyOCBAQAogCXsJMCwJCTB4MDEyMDg1ODUJfQogfTsKIAorLyoqCisgKglocHQzNnhfZmluZF9tb2RlCS0JZmluZCB0aGUgaHB0MzZ4IHRpbWluZworICoJQGFwOiBBVEEgcG9ydAorICoJQHNwZWVkOiB0cmFuc2ZlciBtb2RlCisgKgorICoJUmV0dXJuIHRoZSAzMmJpdCByZWdpc3RlciBwcm9ncmFtbWluZyBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjaGFubmVsCisgKgl0aGF0IG1hdGNoZXMgdGhlIHNwZWVkIHByb3ZpZGVkLgorICovCisKK3N0YXRpYyB1MzIgaHB0MzZ4X2ZpbmRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgc3BlZWQpCit7CisJc3RydWN0IGhwdF9jbG9jayAqY2xvY2tzID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKworCXdoaWxlIChjbG9ja3MtPnhmZXJfbW9kZSkgeworCQlpZiAoY2xvY2tzLT54ZmVyX21vZGUgPT0gc3BlZWQpCisJCQlyZXR1cm4gY2xvY2tzLT50aW1pbmc7CisJCWNsb2NrcysrOworCX0KKwlCVUcoKTsKKwlyZXR1cm4gMHhmZmZmZmZmZlU7CS8qIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZyAqLworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJhZF9hdGEzM1tdID0gewogCSJNYXh0b3IgOTI3MjBVOCIsICJNYXh0b3IgOTIwNDBVNiIsICJNYXh0b3IgOTEzNjBVNCIsICJNYXh0b3IgOTEwMjBVMyIsCiAJIk1heHRvciA5MDg0NVUzIiwgIk1heHRvciA5MDY1MFUyIiwKQEAgLTIxMCwxMCArMjMyLDkgQEAKIHN0YXRpYyB2b2lkIGhwdDM2Nl9zZXRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwKIAkJCSAgICB1OCBtb2RlKQogewotCXN0cnVjdCBocHRfY2xvY2sgKmNsb2NrcyA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCXUzMiBhZGRyID0gMHg0MCArIDQgKiBhZGV2LT5kZXZubzsKLQl1MzIgbWFzaywgcmVnOworCXUzMiBtYXNrLCByZWcsIHQ7CiAKIAkvKiBkZXRlcm1pbmUgdGltaW5nIG1hc2sgYW5kIGZpbmQgbWF0Y2hpbmcgY2xvY2sgZW50cnkgKi8KIAlpZiAobW9kZSA8IFhGRVJfTVdfRE1BXzApCkBAIC0yMjMsMTMgKzI0NCw3IEBACiAJZWxzZQogCQltYXNrID0gMHgzMDA3MDAwMDsKIAotCXdoaWxlIChjbG9ja3MtPnhmZXJfbW9kZSkgewotCQlpZiAoY2xvY2tzLT54ZmVyX21vZGUgPT0gbW9kZSkKLQkJCWJyZWFrOwotCQljbG9ja3MrKzsKLQl9Ci0JaWYgKCFjbG9ja3MtPnhmZXJfbW9kZSkKLQkJQlVHKCk7CisJdCA9IGhwdDM2eF9maW5kX21vZGUoYXAsIG1vZGUpOwogCiAJLyoKIAkgKiBDb21iaW5lIG5ldyBtb2RlIGJpdHMgd2l0aCBvbGQgY29uZmlnIGJpdHMgYW5kIGRpc2FibGUKQEAgLTIzNyw3ICsyNTIsNyBAQAogCSAqIHByb2JsZW1zIGhhbmRsaW5nIEkvTyBlcnJvcnMgbGF0ZXIuCiAJICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGFkZHIsICZyZWcpOwotCXJlZyA9ICgocmVnICYgfm1hc2spIHwgKGNsb2Nrcy0+dGltaW5nICYgbWFzaykpICYgfjB4YzAwMDAwMDA7CisJcmVnID0gKChyZWcgJiB+bWFzaykgfCAodCAmIG1hc2spKSAmIH4weGMwMDAwMDAwOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgYWRkciwgcmVnKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9pdDgyMTMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjEzLmMKaW5kZXggOTk4YWYwZS4uY2Y5MTY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9pdDgyMTMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jCkBAIC03Niw4ICs3Niw4IEBACiB7CiAJdW5zaWduZWQgaW50IHBpbwk9IGFkZXYtPnBpb19tb2RlIC0gWEZFUl9QSU9fMDsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQl1bnNpZ25lZCBpbnQgaWRldG1fcG9ydD0gYXAtPnBvcnRfbm8gPyAweDQyIDogMHg0MDsKLQl1MTYgaWRldG1fZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWFzdGVyX3BvcnQgPSBhcC0+cG9ydF9ubyA/IDB4NDIgOiAweDQwOworCXUxNiBtYXN0ZXJfZGF0YTsKIAlpbnQgY29udHJvbCA9IDA7CiAKIAkvKgpAQCAtMTAwLDE5ICsxMDAsMTkgQEAKIAlpZiAoYWRldi0+Y2xhc3MgIT0gQVRBX0RFVl9BVEEpCiAJCWNvbnRyb2wgfD0gNDsJLyogUFBFICovCiAKLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGlkZXRtX3BvcnQsICZpZGV0bV9kYXRhKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCAmbWFzdGVyX2RhdGEpOwogCiAJLyogU2V0IFBQRSwgSUUsIGFuZCBUSU1FIGFzIGFwcHJvcHJpYXRlICovCiAJaWYgKGFkZXYtPmRldm5vID09IDApIHsKLQkJaWRldG1fZGF0YSAmPSAweENDRjA7Ci0JCWlkZXRtX2RhdGEgfD0gY29udHJvbDsKLQkJaWRldG1fZGF0YSB8PSAodGltaW5nc1twaW9dWzBdIDw8IDEyKSB8CisJCW1hc3Rlcl9kYXRhICY9IDB4Q0NGMDsKKwkJbWFzdGVyX2RhdGEgfD0gY29udHJvbDsKKwkJbWFzdGVyX2RhdGEgfD0gKHRpbWluZ3NbcGlvXVswXSA8PCAxMikgfAogCQkJKHRpbWluZ3NbcGlvXVsxXSA8PCA4KTsKIAl9IGVsc2UgewogCQl1OCBzbGF2ZV9kYXRhOwogCi0JCWlkZXRtX2RhdGEgJj0gMHhGRjBGOwotCQlpZGV0bV9kYXRhIHw9IChjb250cm9sIDw8IDQpOworCQltYXN0ZXJfZGF0YSAmPSAweEZGMEY7CisJCW1hc3Rlcl9kYXRhIHw9IChjb250cm9sIDw8IDQpOwogCiAJCS8qIFNsYXZlIHRpbWluZyBpbiBzZXBhcmF0ZSByZWdpc3RlciAqLwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDQsICZzbGF2ZV9kYXRhKTsKQEAgLTEyMSw4ICsxMjEsOCBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ0LCBzbGF2ZV9kYXRhKTsKIAl9CiAKLQlpZGV0bV9kYXRhIHw9IDB4NDAwMDsJLyogRW5zdXJlIFNJVFJFIGlzIHNldCAqLwotCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGlkZXRtX3BvcnQsIGlkZXRtX2RhdGEpOworCW1hc3Rlcl9kYXRhIHw9IDB4NDAwMDsJLyogRW5zdXJlIFNJVFJFIGlzIHNldCAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCBtYXN0ZXJfZGF0YSk7CiB9CiAKIC8qKgpAQCAtMTYzLDcgKzE2Myw3IEBACiAKIAkJLyogQ2xvY2tzIGZvbGxvdyB0aGUgUElJWCBzdHlsZSAqLwogCQl1X3NwZWVkID0gbWluKDIgLSAodWRtYSAmIDEpLCB1ZG1hKTsKLQkJaWYgKHVkbWEgPT0gNSkKKwkJaWYgKHVkbWEgPiA0KQogCQkJdV9jbG9jayA9IDB4MTAwMDsJLyogMTAwTWh6ICovCiAJCWVsc2UgaWYgKHVkbWEgPiAyKQogCQkJdV9jbG9jayA9IDE7CQkvKiA2Nk1oeiAqLwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJCS5mbGFncwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTLAogCQkucGlvX21hc2sJPSBBVEFfUElPNCwKIAkJLm13ZG1hX21hc2sJPSBBVEFfTVdETUExMl9PTkxZLAotCQkudWRtYV9tYXNrIAk9IEFUQV9VRE1BNCwgLyogRklYTUU6IHdhbnQgVURNQSAxMDA/ICovCisJCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCiAJCS5wb3J0X29wcwk9ICZpdDgyMTNfb3BzLAogCX07CiAJLyogQ3VycmVudCBJVDgyMTMgc3R1ZmYgaXMgc2luZ2xlIHBvcnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCmluZGV4IGQ5NjBmOGUuLjM1YWNhN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYwpAQCAtNzksMTUgKzc5LDYgQEAKIG1vZHVsZV9wYXJhbShhbGwsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFsbCwgIkdyYWIgYWxsIGxlZ2FjeSBwb3J0IGRldmljZXMsIGV2ZW4gaWYgUENJKDA9b2ZmLCAxPW9uKSIpOwogCi1zdHJ1Y3QgbGVnYWN5X2RhdGEgewotCXVuc2lnbmVkIGxvbmcgdGltaW5nOwotCXU4IGNsb2NrWzJdOwotCXU4IGxhc3Q7Ci0JaW50IGZhc3Q7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OwotCi19OwotCiBlbnVtIGNvbnRyb2xsZXIgewogCUJJT1MgPSAwLAogCVNOT09QID0gMSwKQEAgLTEwNCw2ICs5NSwxNCBAQAogCVVOS05PV04gPSAtMQogfTsKIAorc3RydWN0IGxlZ2FjeV9kYXRhIHsKKwl1bnNpZ25lZCBsb25nIHRpbWluZzsKKwl1OCBjbG9ja1syXTsKKwl1OCBsYXN0OworCWludCBmYXN0OworCWVudW0gY29udHJvbGxlciB0eXBlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldjsKK307CiAKIHN0cnVjdCBsZWdhY3lfcHJvYmUgewogCXVuc2lnbmVkIGNoYXIgKm5hbWU7CkBAIC0xMzcsMTEgKzEzNiwxNyBAQAogc3RhdGljIGludCBodDY1NjBiOwkJLyogSFQgNjU2MEEgb24gcHJpbWFyeSAxLCBzZWNvbmQgMiwgYm90aCAzICovCiBzdGF0aWMgaW50IG9wdGk4MmM2MTFhOwkJLyogT3B0aTgyYzYxMUEgb24gcHJpbWFyeSAxLCBzZWMgMiwgYm90aCAzICovCiBzdGF0aWMgaW50IG9wdGk4MmM0Nng7CQkvKiBPcHRpIDgyYzQ2NU1WIHByZXNlbnQocHJpL3NlYyBhdXRvZGV0ZWN0KSAqLwotc3RhdGljIGludCBxZGk7CQkJLyogU2V0IHRvIHByb2JlIFFESSBjb250cm9sbGVycyAqLwogc3RhdGljIGludCBhdXRvc3BlZWQ7CQkvKiBDaGlwIHByZXNlbnQgd2hpY2ggc25vb3BzIHNwZWVkIGNoYW5nZXMgKi8KIHN0YXRpYyBpbnQgcGlvX21hc2sgPSBBVEFfUElPNDsJLyogUElPIHJhbmdlIGZvciBhdXRvc3BlZWQgZGV2aWNlcyAqLwogc3RhdGljIGludCBpb3JkeV9tYXNrID0gMHhGRkZGRkZGRjsJLyogVXNlIGlvcmR5IGlmIGF2YWlsYWJsZSAqLwogCisvKiBTZXQgdG8gcHJvYmUgUURJIGNvbnRyb2xsZXJzICovCisjaWZkZWYgQ09ORklHX1BBVEFfUURJX01PRFVMRQorc3RhdGljIGludCBxZGkgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgcWRpOworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfUEFUQV9XSU5CT05EX1ZMQl9NT0RVTEUKIHN0YXRpYyBpbnQgd2luYm9uZCA9IDE7CQkvKiBTZXQgdG8gcHJvYmUgV2luYm9uZCBjb250cm9sbGVycywKIAkJCQkJZ2l2ZSBJL08gcG9ydCBpZiBub24gc3RhbmRhcmQgKi8KQEAgLTYzMSw3NyArNjM2LDIwIEBACiAJLnFjX2lzc3VlCT0gb3B0aTgyYzQ2eF9xY19pc3N1ZSwKIH07CiAKLXN0YXRpYyB2b2lkIHFkaTY1MDBfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGF0YV90aW1pbmcgdDsKLQlzdHJ1Y3QgbGVnYWN5X2RhdGEgKmxkX3FkaSA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7Ci0JaW50IGFjdGl2ZSwgcmVjb3Zlcnk7Ci0JdTggdGltaW5nOwotCi0JLyogR2V0IHRoZSB0aW1pbmcgZGF0YSBpbiBjeWNsZXMgKi8KLQlhdGFfdGltaW5nX2NvbXB1dGUoYWRldiwgYWRldi0+cGlvX21vZGUsICZ0LCAzMDMwMywgMTAwMCk7Ci0KLQlpZiAobGRfcWRpLT5mYXN0KSB7Ci0JCWFjdGl2ZSA9IDggLSBjbGFtcF92YWwodC5hY3RpdmUsIDEsIDgpOwotCQlyZWNvdmVyeSA9IDE4IC0gY2xhbXBfdmFsKHQucmVjb3ZlciwgMywgMTgpOwotCX0gZWxzZSB7Ci0JCWFjdGl2ZSA9IDkgLSBjbGFtcF92YWwodC5hY3RpdmUsIDIsIDkpOwotCQlyZWNvdmVyeSA9IDE1IC0gY2xhbXBfdmFsKHQucmVjb3ZlciwgMCwgMTUpOwotCX0KLQl0aW1pbmcgPSAocmVjb3ZlcnkgPDwgNCkgfCBhY3RpdmUgfCAweDA4OwotCi0JbGRfcWRpLT5jbG9ja1thZGV2LT5kZXZub10gPSB0aW1pbmc7Ci0KLQlvdXRiKHRpbWluZywgbGRfcWRpLT50aW1pbmcpOwotfQotCiAvKioKLSAqCXFkaTY1ODBkcF9zZXRfcGlvbW9kZQkJLQlQSU8gc2V0dXAgZm9yIGR1YWwgY2hhbm5lbAotICoJQGFwOiBQb3J0Ci0gKglAYWRldjogRGV2aWNlCi0gKgotICoJSW4gZHVhbCBjaGFubmVsIG1vZGUgdGhlIDY1ODAgaGFzIG9uZSBjbG9jayBwZXIgY2hhbm5lbCBhbmQgd2UgaGF2ZQotICoJdG8gc29mdHdhcmUgY2xvY2tzd2l0Y2ggaW4gcWNfaXNzdWUuCi0gKi8KLQotc3RhdGljIHZvaWQgcWRpNjU4MGRwX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBhdGFfdGltaW5nIHQ7Ci0Jc3RydWN0IGxlZ2FjeV9kYXRhICpsZF9xZGkgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOwotCWludCBhY3RpdmUsIHJlY292ZXJ5OwotCXU4IHRpbWluZzsKLQotCS8qIEdldCB0aGUgdGltaW5nIGRhdGEgaW4gY3ljbGVzICovCi0JYXRhX3RpbWluZ19jb21wdXRlKGFkZXYsIGFkZXYtPnBpb19tb2RlLCAmdCwgMzAzMDMsIDEwMDApOwotCi0JaWYgKGxkX3FkaS0+ZmFzdCkgewotCQlhY3RpdmUgPSA4IC0gY2xhbXBfdmFsKHQuYWN0aXZlLCAxLCA4KTsKLQkJcmVjb3ZlcnkgPSAxOCAtIGNsYW1wX3ZhbCh0LnJlY292ZXIsIDMsIDE4KTsKLQl9IGVsc2UgewotCQlhY3RpdmUgPSA5IC0gY2xhbXBfdmFsKHQuYWN0aXZlLCAyLCA5KTsKLQkJcmVjb3ZlcnkgPSAxNSAtIGNsYW1wX3ZhbCh0LnJlY292ZXIsIDAsIDE1KTsKLQl9Ci0JdGltaW5nID0gKHJlY292ZXJ5IDw8IDQpIHwgYWN0aXZlIHwgMHgwODsKLQotCWxkX3FkaS0+Y2xvY2tbYWRldi0+ZGV2bm9dID0gdGltaW5nOwotCi0Jb3V0Yih0aW1pbmcsIGxkX3FkaS0+dGltaW5nICsgMiAqIGFwLT5wb3J0X25vKTsKLQkvKiBDbGVhciB0aGUgRklGTyAqLwotCWlmIChhZGV2LT5jbGFzcyAhPSBBVEFfREVWX0FUQSkKLQkJb3V0YigweDVGLCAobGRfcWRpLT50aW1pbmcgJiAweEZGRjApICsgMyk7Ci19Ci0KLS8qKgotICoJcWRpNjU4MF9zZXRfcGlvbW9kZQkJLQlQSU8gc2V0dXAgZm9yIHNpbmdsZSBjaGFubmVsCisgKglxZGk2NXgwX3NldF9waW9tb2RlCQktCVBJTyBzZXR1cCBmb3IgUURJNjV4MAogICoJQGFwOiBQb3J0CiAgKglAYWRldjogRGV2aWNlCiAgKgogICoJSW4gc2luZ2xlIGNoYW5uZWwgbW9kZSB0aGUgNjU4MCBoYXMgb25lIGNsb2NrIHBlciBkZXZpY2UgYW5kIHdlIGNhbgogICoJYXZvaWQgdGhlIHJlcXVpcmVtZW50IHRvIGNsb2NrIHN3aXRjaC4gV2UgYWxzbyBoYXZlIHRvIGxvYWQgdGhlIHRpbWluZwogICoJaW50byB0aGUgcmlnaHQgY2xvY2sgYWNjb3JkaW5nIHRvIHdoZXRoZXIgd2UgYXJlIG1hc3RlciBvciBzbGF2ZS4KKyAqCisgKglJbiBkdWFsIGNoYW5uZWwgbW9kZSB0aGUgNjU4MCBoYXMgb25lIGNsb2NrIHBlciBjaGFubmVsIGFuZCB3ZSBoYXZlCisgKgl0byBzb2Z0d2FyZSBjbG9ja3N3aXRjaCBpbiBxY19pc3N1ZS4KICAqLwogCi1zdGF0aWMgdm9pZCBxZGk2NTgwX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQorc3RhdGljIHZvaWQgcWRpNjV4MF9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKIAlzdHJ1Y3QgYXRhX3RpbWluZyB0OwogCXN0cnVjdCBsZWdhY3lfZGF0YSAqbGRfcWRpID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKQEAgLTcyMCw5ICs2NjgsMTQgQEAKIAl9CiAJdGltaW5nID0gKHJlY292ZXJ5IDw8IDQpIHwgYWN0aXZlIHwgMHgwODsKIAlsZF9xZGktPmNsb2NrW2FkZXYtPmRldm5vXSA9IHRpbWluZzsKLQlvdXRiKHRpbWluZywgbGRfcWRpLT50aW1pbmcgKyAyICogYWRldi0+ZGV2bm8pOworCisJaWYgKGxkX3FkaS0+dHlwZSA9PSBRREk2NTgwKQorCQlvdXRiKHRpbWluZywgbGRfcWRpLT50aW1pbmcgKyAyICogYWRldi0+ZGV2bm8pOworCWVsc2UKKwkJb3V0Yih0aW1pbmcsIGxkX3FkaS0+dGltaW5nICsgMiAqIGFwLT5wb3J0X25vKTsKKwogCS8qIENsZWFyIHRoZSBGSUZPICovCi0JaWYgKGFkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBKQorCWlmIChsZF9xZGktPnR5cGUgIT0gUURJNjUwMCAmJiBhZGV2LT5jbGFzcyAhPSBBVEFfREVWX0FUQSkKIAkJb3V0YigweDVGLCAobGRfcWRpLT50aW1pbmcgJiAweEZGRjApICsgMyk7CiB9CiAKQEAgLTc4OSwyMCArNzQyLDIwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBxZGk2NTAwX3BvcnRfb3BzID0gewogCS5pbmhlcml0cwk9ICZsZWdhY3lfYmFzZV9wb3J0X29wcywKLQkuc2V0X3Bpb21vZGUJPSBxZGk2NTAwX3NldF9waW9tb2RlLAorCS5zZXRfcGlvbW9kZQk9IHFkaTY1eDBfc2V0X3Bpb21vZGUsCiAJLnFjX2lzc3VlCT0gcWRpX3FjX2lzc3VlLAogCS5zZmZfZGF0YV94ZmVyCT0gdmxiMzJfZGF0YV94ZmVyLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHFkaTY1ODBfcG9ydF9vcHMgPSB7CiAJLmluaGVyaXRzCT0gJmxlZ2FjeV9iYXNlX3BvcnRfb3BzLAotCS5zZXRfcGlvbW9kZQk9IHFkaTY1ODBfc2V0X3Bpb21vZGUsCisJLnNldF9waW9tb2RlCT0gcWRpNjV4MF9zZXRfcGlvbW9kZSwKIAkuc2ZmX2RhdGFfeGZlcgk9IHZsYjMyX2RhdGFfeGZlciwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBxZGk2NTgwZHBfcG9ydF9vcHMgPSB7CiAJLmluaGVyaXRzCT0gJmxlZ2FjeV9iYXNlX3BvcnRfb3BzLAotCS5zZXRfcGlvbW9kZQk9IHFkaTY1ODBkcF9zZXRfcGlvbW9kZSwKKwkuc2V0X3Bpb21vZGUJPSBxZGk2NXgwX3NldF9waW9tb2RlLAogCS5xY19pc3N1ZQk9IHFkaV9xY19pc3N1ZSwKIAkuc2ZmX2RhdGFfeGZlcgk9IHZsYjMyX2RhdGFfeGZlciwKIH07CkBAIC04NzksMjkgKzgzMiwyOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBsZWdhY3lfY29udHJvbGxlciBjb250cm9sbGVyc1tdID0gewotCXsiQklPUyIsCSZsZWdhY3lfcG9ydF9vcHMsIAkweDFGLAorCXsiQklPUyIsCSZsZWdhY3lfcG9ydF9vcHMsIAlBVEFfUElPNCwKIAkJCUFUQV9GTEFHX05PX0lPUkRZLAkwLAkJCU5VTEwgfSwKLQl7IlNub29waW5nIiwgCSZzaW1wbGVfcG9ydF9vcHMsIAkweDFGLAorCXsiU25vb3BpbmciLCAJJnNpbXBsZV9wb3J0X29wcywgCUFUQV9QSU80LAogCQkJMCwJCQkwLAkJCU5VTEwgfSwKLQl7IlBEQzIwMjMwIiwJJnBkYzIwMjMwX3BvcnRfb3BzLAkweDcsCisJeyJQREMyMDIzMCIsCSZwZGMyMDIzMF9wb3J0X29wcywJQVRBX1BJTzIsCiAJCQlBVEFfRkxBR19OT19JT1JEWSwKIAkJCUFUQV9QRkxBR19QSU8zMiB8IEFUQV9QRkxBR19QSU8zMkNIQU5HRSwJTlVMTCB9LAotCXsiSFQ2NTYwQSIsCSZodDY1NjBhX3BvcnRfb3BzLAkweDA3LAorCXsiSFQ2NTYwQSIsCSZodDY1NjBhX3BvcnRfb3BzLAlBVEFfUElPMiwKIAkJCUFUQV9GTEFHX05PX0lPUkRZLAkwLAkJCU5VTEwgfSwKLQl7IkhUNjU2MEIiLAkmaHQ2NTYwYl9wb3J0X29wcywJMHgxRiwKKwl7IkhUNjU2MEIiLAkmaHQ2NTYwYl9wb3J0X29wcywJQVRBX1BJTzQsCiAJCQlBVEFfRkxBR19OT19JT1JEWSwJMCwJCQlOVUxMIH0sCi0JeyJPUFRJODJDNjExQSIsCSZvcHRpODJjNjExYV9wb3J0X29wcywJMHgwRiwKKwl7Ik9QVEk4MkM2MTFBIiwJJm9wdGk4MmM2MTFhX3BvcnRfb3BzLAlBVEFfUElPMywKIAkJCTAsCQkJMCwJCQlOVUxMIH0sCi0JeyJPUFRJODJDNDZYIiwJJm9wdGk4MmM0NnhfcG9ydF9vcHMsCTB4MEYsCisJeyJPUFRJODJDNDZYIiwJJm9wdGk4MmM0NnhfcG9ydF9vcHMsCUFUQV9QSU8zLAogCQkJMCwJCQkwLAkJCU5VTEwgfSwKLQl7IlFESTY1MDAiLAkmcWRpNjUwMF9wb3J0X29wcywJMHgwNywKKwl7IlFESTY1MDAiLAkmcWRpNjUwMF9wb3J0X29wcywJQVRBX1BJTzIsCiAJCQlBVEFfRkxBR19OT19JT1JEWSwKIAkJCUFUQV9QRkxBR19QSU8zMiB8IEFUQV9QRkxBR19QSU8zMkNIQU5HRSwgICAgcWRpX3BvcnQgfSwKLQl7IlFESTY1ODAiLAkmcWRpNjU4MF9wb3J0X29wcywJMHgxRiwKKwl7IlFESTY1ODAiLAkmcWRpNjU4MF9wb3J0X29wcywJQVRBX1BJTzQsCiAJCQkwLCBBVEFfUEZMQUdfUElPMzIgfCBBVEFfUEZMQUdfUElPMzJDSEFOR0UsIHFkaV9wb3J0IH0sCi0JeyJRREk2NTgwRFAiLAkmcWRpNjU4MGRwX3BvcnRfb3BzLAkweDFGLAorCXsiUURJNjU4MERQIiwJJnFkaTY1ODBkcF9wb3J0X29wcywJQVRBX1BJTzQsCiAJCQkwLCBBVEFfUEZMQUdfUElPMzIgfCBBVEFfUEZMQUdfUElPMzJDSEFOR0UsIHFkaV9wb3J0IH0sCi0JeyJXODM3NTlBIiwJJndpbmJvbmRfcG9ydF9vcHMsCTB4MUYsCisJeyJXODM3NTlBIiwJJndpbmJvbmRfcG9ydF9vcHMsCUFUQV9QSU80LAogCQkJMCwgQVRBX1BGTEFHX1BJTzMyIHwgQVRBX1BGTEFHX1BJTzMyQ0hBTkdFLAogCQkJCQkJCQl3aW5ib25kX3BvcnQgfQogfTsKQEAgLTEwMjIsNiArOTc1LDcgQEAKIAljdHJsX2FkZHIgPSBkZXZtX2lvcG9ydF9tYXAoJnBkZXYtPmRldiwgaW8gKyAweDAyMDYsIDEpOwogCWlmICghaW9fYWRkciB8fCAhY3RybF9hZGRyKQogCQlnb3RvIGZhaWw7CisJbGQtPnR5cGUgPSBwcm9iZS0+dHlwZTsKIAlpZiAoY29udHJvbGxlci0+c2V0dXApCiAJCWlmIChjb250cm9sbGVyLT5zZXR1cChwZGV2LCBwcm9iZSwgbGQpIDwgMCkKIAkJCWdvdG8gZmFpbDsKQEAgLTEzMDYsNiArMTI2MCw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIGxlZ2FjeSBBVEEiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9BTElBUygicGF0YV9xZGkiKTsKIE1PRFVMRV9BTElBUygicGF0YV93aW5ib25kIik7CiAKIG1vZHVsZV9wYXJhbShwcm9iZV9hbGwsIGludCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX21wYzUyeHguYyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBjNTJ4eC5jCmluZGV4IDJmY2FjNTEuLjNlMTc0NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbXBjNTJ4eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBjNTJ4eC5jCkBAIC03ODAsNyArNzgwLDcgQEAKIAl9CiAKIAl0YXNrX2lycSA9IGJjb21fZ2V0X3Rhc2tfaXJxKGRtYXRzayk7Ci0JcmV0ID0gcmVxdWVzdF9pcnEodGFza19pcnEsICZtcGM1Mnh4X2F0YV90YXNrX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlyZXQgPSByZXF1ZXN0X2lycSh0YXNrX2lycSwgJm1wYzUyeHhfYXRhX3Rhc2tfaXJxLCAwLAogCQkJCSJBVEEgdGFzayIsIHByaXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycigmb3AtPmRldiwgImVycm9yIHJlcXVlc3RpbmcgRE1BIElSUVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29mX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2F0YS9wYXRhX29mX3BsYXRmb3JtLmMKaW5kZXggZjMwNTQwMC4uMmE0NzJjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9vZl9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb2ZfcGxhdGZvcm0uYwpAQCAtMTEsNiArMTEsOCBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CiAKQEAgLTUwLDE4ICs1MiwxOCBAQAogCX0KIAogCXJldCA9IG9mX2lycV90b19yZXNvdXJjZShkbiwgMCwgJmlycV9yZXMpOwotCWlmIChyZXQgPT0gTk9fSVJRKQorCWlmICghcmV0KQogCQlpcnFfcmVzLnN0YXJ0ID0gaXJxX3Jlcy5lbmQgPSAwOwogCWVsc2UKIAkJaXJxX3Jlcy5mbGFncyA9IDA7CiAKIAlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAicmVnLXNoaWZ0IiwgTlVMTCk7CiAJaWYgKHByb3ApCi0JCXJlZ19zaGlmdCA9ICpwcm9wOworCQlyZWdfc2hpZnQgPSBiZTMyX3RvX2NwdXAocHJvcCk7CiAKIAlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAicGlvLW1vZGUiLCBOVUxMKTsKIAlpZiAocHJvcCkgewotCQlwaW9fbW9kZSA9ICpwcm9wOworCQlwaW9fbW9kZSA9IGJlMzJfdG9fY3B1cChwcm9wKTsKIAkJaWYgKHBpb19tb2RlID4gNikgewogCQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImludmFsaWQgcGlvLW1vZGVcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKaW5kZXggYjE1MTFmMy4uN2Q2M2YyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYwpAQCAtNjMsNiArNjMsNyBAQAogfTsKIAogc3RhdGljIGludCBwZGMyMDI3eF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaW50IHBkYzIwMjd4X3JlaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogc3RhdGljIGludCBwZGMyMDI3eF9wcmVyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpOwogc3RhdGljIHZvaWQgcGRjMjAyN3hfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwogc3RhdGljIHZvaWQgcGRjMjAyN3hfc2V0X2RtYW1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwpAQCAtMTI2LDYgKzEyNywxMCBAQAogCS5pZF90YWJsZQkJPSBwZGMyMDI3eF9wY2lfdGJsLAogCS5wcm9iZQkJCT0gcGRjMjAyN3hfaW5pdF9vbmUsCiAJLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCQk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gcGRjMjAyN3hfcmVpbml0X29uZSwKKyNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcGRjMjAyN3hfc2h0ID0gewpAQCAtNzU0LDYgKzc1OSwzMSBAQAogCQkJCSBJUlFGX1NIQVJFRCwgJnBkYzIwMjd4X3NodCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcGRjMjAyN3hfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJdW5zaWduZWQgaW50IGJvYXJkX2lkeDsKKwlpbnQgcmM7CisKKwlyYyA9IGF0YV9wY2lfZGV2aWNlX2RvX3Jlc3VtZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjY4IHx8CisJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNzApCisJCWJvYXJkX2lkeCA9IFBEQ19VRE1BXzEwMDsKKwllbHNlCisJCWJvYXJkX2lkeCA9IFBEQ19VRE1BXzEzMzsKKworCWlmIChwZGNfaGFyZHdhcmVfaW5pdChob3N0LCBib2FyZF9pZHgpKQorCQlyZXR1cm4gLUVJTzsKKworCWF0YV9ob3N0X3Jlc3VtZShob3N0KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAvKioKICAqIHBkYzIwMjd4X2luaXQgLSBDYWxsZWQgYWZ0ZXIgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGludG8gdGhlIGtlcm5lbC4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9xZGkuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcWRpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODc5ZGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9xZGkuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKgotICogICAgcGF0YV9xZGkuYyAtIFFESSBWTEIgQVRBIGNvbnRyb2xsZXJzCi0gKgkoQykgMjAwNiBSZWQgSGF0Ci0gKgotICogVGhpcyBkcml2ZXIgbW9zdGx5IGV4aXN0cyBhcyBhIHByb29mIG9mIGNvbmNlcHQgZm9yIG5vbiBQQ0kgZGV2aWNlcyB1bmRlcgotICogbGliYXRhLiBXaGlsZSB0aGUgUURJNjU4MCB3YXMgJ25lYXQnIGluIDE5OTMgaXQgaXMgbm8gbG9uZ2VyIHRlcnJpYmx5Ci0gKiB1c2VmdWwuCi0gKgotICogVHVuaW5nIGNvZGUgd3JpdHRlbiBmcm9tIHRoZSBkb2N1bWVudGF0aW9uIGF0Ci0gKiBodHRwOi8vd3d3LnJ5c3Rvbi5jei9wZXRyL3ZsYi9xZDY1MDAuaHRtbAotICogaHR0cDovL3d3dy5yeXN0b24uY3ovcGV0ci92bGIvcWQ2NTgwLmh0bWwKLSAqCi0gKiBQcm9iZSBjb2RlIGJhc2VkIG9uIGRyaXZlcnMvaWRlL2xlZ2FjeS9xZDY1eHguYwotICogUmV3cml0dGVuIGZyb20gdGhlIHdvcmsgb2YgQ29sdGVuIEVkd2FyZHMgPHBqZTEyMEBjcy51c2Fzay5jYT4gYnkKLSAqIFNhbXVlbCBUaGliYXVsdCA8c2FtdWVsLnRoaWJhdWx0QGVucy1seW9uLm9yZz4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2RlZmluZSBEUlZfTkFNRSAicGF0YV9xZGkiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjMuMSIKLQotI2RlZmluZSBOUl9IT1NUIDQJLyogVHdvIDY1ODBzICovCi0KLXN0cnVjdCBxZGlfZGF0YSB7Ci0JdW5zaWduZWQgbG9uZyB0aW1pbmc7Ci0JdTggY2xvY2tbMl07Ci0JdTggbGFzdDsKLQlpbnQgZmFzdDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXY7Ci0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXRhX2hvc3QgKnFkaV9ob3N0W05SX0hPU1RdOwotc3RhdGljIHN0cnVjdCBxZGlfZGF0YSBxZGlfZGF0YVtOUl9IT1NUXTsKLXN0YXRpYyBpbnQgbnJfcWRpX2hvc3Q7Ci0KLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgcHJvYmVfcWRpID0gMTsKLSNlbHNlCi1zdGF0aWMgaW50IHByb2JlX3FkaTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBxZGk2NTAwX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBhdGFfdGltaW5nIHQ7Ci0Jc3RydWN0IHFkaV9kYXRhICpxZGkgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOwotCWludCBhY3RpdmUsIHJlY292ZXJ5OwotCXU4IHRpbWluZzsKLQotCS8qIEdldCB0aGUgdGltaW5nIGRhdGEgaW4gY3ljbGVzICovCi0JYXRhX3RpbWluZ19jb21wdXRlKGFkZXYsIGFkZXYtPnBpb19tb2RlLCAmdCwgMzAzMDMsIDEwMDApOwotCi0JaWYgKHFkaS0+ZmFzdCkgewotCQlhY3RpdmUgPSA4IC0gY2xhbXBfdmFsKHQuYWN0aXZlLCAxLCA4KTsKLQkJcmVjb3ZlcnkgPSAxOCAtIGNsYW1wX3ZhbCh0LnJlY292ZXIsIDMsIDE4KTsKLQl9IGVsc2UgewotCQlhY3RpdmUgPSA5IC0gY2xhbXBfdmFsKHQuYWN0aXZlLCAyLCA5KTsKLQkJcmVjb3ZlcnkgPSAxNSAtIGNsYW1wX3ZhbCh0LnJlY292ZXIsIDAsIDE1KTsKLQl9Ci0JdGltaW5nID0gKHJlY292ZXJ5IDw8IDQpIHwgYWN0aXZlIHwgMHgwODsKLQotCXFkaS0+Y2xvY2tbYWRldi0+ZGV2bm9dID0gdGltaW5nOwotCi0Jb3V0Yih0aW1pbmcsIHFkaS0+dGltaW5nKTsKLX0KLQotc3RhdGljIHZvaWQgcWRpNjU4MF9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKLXsKLQlzdHJ1Y3QgYXRhX3RpbWluZyB0OwotCXN0cnVjdCBxZGlfZGF0YSAqcWRpID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKLQlpbnQgYWN0aXZlLCByZWNvdmVyeTsKLQl1OCB0aW1pbmc7Ci0KLQkvKiBHZXQgdGhlIHRpbWluZyBkYXRhIGluIGN5Y2xlcyAqLwotCWF0YV90aW1pbmdfY29tcHV0ZShhZGV2LCBhZGV2LT5waW9fbW9kZSwgJnQsIDMwMzAzLCAxMDAwKTsKLQotCWlmIChxZGktPmZhc3QpIHsKLQkJYWN0aXZlID0gOCAtIGNsYW1wX3ZhbCh0LmFjdGl2ZSwgMSwgOCk7Ci0JCXJlY292ZXJ5ID0gMTggLSBjbGFtcF92YWwodC5yZWNvdmVyLCAzLCAxOCk7Ci0JfSBlbHNlIHsKLQkJYWN0aXZlID0gOSAtIGNsYW1wX3ZhbCh0LmFjdGl2ZSwgMiwgOSk7Ci0JCXJlY292ZXJ5ID0gMTUgLSBjbGFtcF92YWwodC5yZWNvdmVyLCAwLCAxNSk7Ci0JfQotCXRpbWluZyA9IChyZWNvdmVyeSA8PCA0KSB8IGFjdGl2ZSB8IDB4MDg7Ci0KLQlxZGktPmNsb2NrW2FkZXYtPmRldm5vXSA9IHRpbWluZzsKLQotCW91dGIodGltaW5nLCBxZGktPnRpbWluZyk7Ci0KLQkvKiBDbGVhciB0aGUgRklGTyAqLwotCWlmIChhZGV2LT5jbGFzcyAhPSBBVEFfREVWX0FUQSkKLQkJb3V0YigweDVGLCAocWRpLT50aW1pbmcgJiAweEZGRjApICsgMyk7Ci19Ci0KLS8qKgotICoJcWRpX3FjX2lzc3VlCQktCWNvbW1hbmQgaXNzdWUKLSAqCUBxYzogY29tbWFuZCBwZW5kaW5nCi0gKgotICoJQ2FsbGVkIHdoZW4gdGhlIGxpYmF0YSBsYXllciBpcyBhYm91dCB0byBpc3N1ZSBhIGNvbW1hbmQuIFdlIHdyYXAKLSAqCXRoaXMgaW50ZXJmYWNlIHNvIHRoYXQgd2UgY2FuIGxvYWQgdGhlIGNvcnJlY3QgQVRBIHRpbWluZ3MuCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludCBxZGlfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKLXsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwotCXN0cnVjdCBhdGFfZGV2aWNlICphZGV2ID0gcWMtPmRldjsKLQlzdHJ1Y3QgcWRpX2RhdGEgKnFkaSA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAocWRpLT5jbG9ja1thZGV2LT5kZXZub10gIT0gcWRpLT5sYXN0KSB7Ci0JCWlmIChhZGV2LT5waW9fbW9kZSkgewotCQkJcWRpLT5sYXN0ID0gcWRpLT5jbG9ja1thZGV2LT5kZXZub107Ci0JCQlvdXRiKHFkaS0+Y2xvY2tbYWRldi0+ZGV2bm9dLCBxZGktPnRpbWluZyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGF0YV9zZmZfcWNfaXNzdWUocWMpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHFkaV9kYXRhX3hmZXIoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqYnVmLAotCQkJCSAgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IHJ3KQotewotCWlmIChhdGFfaWRfaGFzX2R3b3JkX2lvKGRldi0+aWQpKSB7Ci0JCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmxpbmstPmFwOwotCQlpbnQgc2xvcCA9IGJ1ZmxlbiAmIDM7Ci0KLQkJaWYgKHJ3ID09IFJFQUQpCi0JCQlpb3JlYWQzMl9yZXAoYXAtPmlvYWRkci5kYXRhX2FkZHIsIGJ1ZiwgYnVmbGVuID4+IDIpOwotCQllbHNlCi0JCQlpb3dyaXRlMzJfcmVwKGFwLT5pb2FkZHIuZGF0YV9hZGRyLCBidWYsIGJ1ZmxlbiA+PiAyKTsKLQotCQlpZiAodW5saWtlbHkoc2xvcCkpIHsKLQkJCV9fbGUzMiBwYWQ7Ci0JCQlpZiAocncgPT0gUkVBRCkgewotCQkJCXBhZCA9IGNwdV90b19sZTMyKGlvcmVhZDMyKGFwLT5pb2FkZHIuZGF0YV9hZGRyKSk7Ci0JCQkJbWVtY3B5KGJ1ZiArIGJ1ZmxlbiAtIHNsb3AsICZwYWQsIHNsb3ApOwotCQkJfSBlbHNlIHsKLQkJCQltZW1jcHkoJnBhZCwgYnVmICsgYnVmbGVuIC0gc2xvcCwgc2xvcCk7Ci0JCQkJaW93cml0ZTMyKGxlMzJfdG9fY3B1KHBhZCksIGFwLT5pb2FkZHIuZGF0YV9hZGRyKTsKLQkJCX0KLQkJCWJ1ZmxlbiArPSA0IC0gc2xvcDsKLQkJfQotCX0gZWxzZQotCQlidWZsZW4gPSBhdGFfc2ZmX2RhdGFfeGZlcihkZXYsIGJ1ZiwgYnVmbGVuLCBydyk7Ci0KLQlyZXR1cm4gYnVmbGVuOwotfQotCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBxZGlfc2h0ID0gewotCUFUQV9QSU9fU0hUKERSVl9OQU1FKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBxZGk2NTAwX3BvcnRfb3BzID0gewotCS5pbmhlcml0cwk9ICZhdGFfc2ZmX3BvcnRfb3BzLAotCS5xY19pc3N1ZQk9IHFkaV9xY19pc3N1ZSwKLQkuc2ZmX2RhdGFfeGZlcgk9IHFkaV9kYXRhX3hmZXIsCi0JLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCi0JLnNldF9waW9tb2RlCT0gcWRpNjUwMF9zZXRfcGlvbW9kZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBxZGk2NTgwX3BvcnRfb3BzID0gewotCS5pbmhlcml0cwk9ICZxZGk2NTAwX3BvcnRfb3BzLAotCS5zZXRfcGlvbW9kZQk9IHFkaTY1ODBfc2V0X3Bpb21vZGUsCi19OwotCi0vKioKLSAqCXFkaV9pbml0X29uZQkJLQlhdHRhY2ggYSBxZGkgaW50ZXJmYWNlCi0gKglAdHlwZTogVHlwZSB0byBkaXNwbGF5Ci0gKglAaW86IEkvTyBwb3J0IHN0YXJ0Ci0gKglAaXJxOiBpbnRlcnJ1cHQgbGluZQotICoJQGZhc3Q6IFRydWUgaWYgb24gYSA+IDMzTWh6IFZMQgotICoKLSAqCVJlZ2lzdGVyIGFuIElTQSBidXMgSURFIGludGVyZmFjZS4gU3VjaCBpbnRlcmZhY2VzIGFyZSBQSU8gYW5kIHdlCi0gKglhc3N1bWUgZG8gbm90IHN1cHBvcnQgSVJRIHNoYXJpbmcuCi0gKi8KLQotc3RhdGljIF9faW5pdCBpbnQgcWRpX2luaXRfb25lKHVuc2lnbmVkIGxvbmcgcG9ydCwgaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgaW8sIGludCBpcnEsIGludCBmYXN0KQotewotCXVuc2lnbmVkIGxvbmcgY3RsID0gaW8gKyAweDIwNjsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwotCXZvaWQgX19pb21lbSAqaW9fYWRkciwgKmN0bF9hZGRyOwotCWludCByZXQ7Ci0KLQkvKgotCSAqCUZpbGwgaW4gYSBwcm9iZSBzdHJ1Y3R1cmUgZmlyc3Qgb2YgYWxsCi0JICovCi0KLQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShEUlZfTkFNRSwgbnJfcWRpX2hvc3QsIE5VTEwsIDApOwotCWlmIChJU19FUlIocGRldikpCi0JCXJldHVybiBQVFJfRVJSKHBkZXYpOwotCi0JcmV0ID0gLUVOT01FTTsKLQlpb19hZGRyID0gZGV2bV9pb3BvcnRfbWFwKCZwZGV2LT5kZXYsIGlvLCA4KTsKLQljdGxfYWRkciA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LCBjdGwsIDEpOwotCWlmICghaW9fYWRkciB8fCAhY3RsX2FkZHIpCi0JCWdvdG8gZmFpbDsKLQotCXJldCA9IC1FTk9NRU07Ci0JaG9zdCA9IGF0YV9ob3N0X2FsbG9jKCZwZGV2LT5kZXYsIDEpOwotCWlmICghaG9zdCkKLQkJZ290byBmYWlsOwotCWFwID0gaG9zdC0+cG9ydHNbMF07Ci0KLQlpZiAodHlwZSA9PSA2NTgwKSB7Ci0JCWFwLT5vcHMgPSAmcWRpNjU4MF9wb3J0X29wczsKLQkJYXAtPnBpb19tYXNrID0gQVRBX1BJTzQ7Ci0JCWFwLT5mbGFncyB8PSBBVEFfRkxBR19TTEFWRV9QT1NTOwotCX0gZWxzZSB7Ci0JCWFwLT5vcHMgPSAmcWRpNjUwMF9wb3J0X29wczsKLQkJYXAtPnBpb19tYXNrID0gQVRBX1BJTzI7IC8qIEFjdHVhbGx5IFBJTzMgIUlPUkRZIGlzIHBvc3NpYmxlICovCi0JCWFwLT5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19OT19JT1JEWTsKLQl9Ci0KLQlhcC0+aW9hZGRyLmNtZF9hZGRyID0gaW9fYWRkcjsKLQlhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyID0gY3RsX2FkZHI7Ci0JYXAtPmlvYWRkci5jdGxfYWRkciA9IGN0bF9hZGRyOwotCWF0YV9zZmZfc3RkX3BvcnRzKCZhcC0+aW9hZGRyKTsKLQotCWF0YV9wb3J0X2Rlc2MoYXAsICJjbWQgJWx4IGN0bCAlbHgiLCBpbywgY3RsKTsKLQotCS8qCi0JICoJSG9vayBpbiBhIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgcGVyIGNoYW5uZWwKLQkgKi8KLQlhcC0+cHJpdmF0ZV9kYXRhID0gJnFkaV9kYXRhW25yX3FkaV9ob3N0XTsKLQotCXFkaV9kYXRhW25yX3FkaV9ob3N0XS50aW1pbmcgPSBwb3J0OwotCXFkaV9kYXRhW25yX3FkaV9ob3N0XS5mYXN0ID0gZmFzdDsKLQlxZGlfZGF0YVtucl9xZGlfaG9zdF0ucGxhdGZvcm1fZGV2ID0gcGRldjsKLQotCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUiOiBxZCVkIGF0IDB4JWx4LlxuIiwgdHlwZSwgaW8pOwotCi0JLyogYWN0aXZhdGUgKi8KLQlyZXQgPSBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpcnEsIGF0YV9zZmZfaW50ZXJydXB0LCAwLCAmcWRpX3NodCk7Ci0JaWYgKHJldCkKLQkJZ290byBmYWlsOwotCi0JcWRpX2hvc3RbbnJfcWRpX2hvc3QrK10gPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0JcmV0dXJuIDA7Ci0KLSBmYWlsOgotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICoJcWRpX2luaXQJCS0JYXR0YWNoIHFkaSBpbnRlcmZhY2VzCi0gKgotICoJQXR0YWNoIHFkaSBJREUgaW50ZXJmYWNlcyBieSBzY2FubmluZyB0aGUgcG9ydHMgaXQgbWF5IG9jY3VweS4KLSAqLwotCi1zdGF0aWMgX19pbml0IGludCBxZGlfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgcWRfcG9ydFsyXSA9IHsgMHgzMCwgMHhCMCB9OwotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGlkZV9wb3J0WzJdID0geyAweDE3MCwgMHgxRjAgfTsKLQlzdGF0aWMgY29uc3QgaW50IGlkZV9pcnFbMl0gPSB7IDE0LCAxNSB9OwotCi0JaW50IGN0ID0gMDsKLQlpbnQgaTsKLQotCWlmIChwcm9iZV9xZGkgPT0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKgotIAkgKglDaGVjayBlYWNoIHBvc3NpYmxlIFFENjV4eCBiYXNlIGFkZHJlc3MKLQkgKi8KLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBwb3J0ID0gcWRfcG9ydFtpXTsKLQkJdTggciwgcmVzOwotCi0KLQkJaWYgKHJlcXVlc3RfcmVnaW9uKHBvcnQsIDIsICJwYXRhX3FkaSIpKSB7Ci0JCQkvKiBDaGVjayBmb3IgYSBjYXJkICovCi0JCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCQlyID0gaW5iX3AocG9ydCk7Ci0JCQlvdXRiX3AoMHgxOSwgcG9ydCk7Ci0JCQlyZXMgPSBpbmJfcChwb3J0KTsKLQkJCW91dGJfcChyLCBwb3J0KTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCQkJLyogRmFpbCAqLwotCQkJaWYgKHJlcyA9PSAweDE5KQotCQkJewotCQkJCXJlbGVhc2VfcmVnaW9uKHBvcnQsIDIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBQYXNzZXMgdGhlIHByZXNlbmNlIHRlc3QgKi8KLQkJCXIgPSBpbmJfcChwb3J0ICsgMSk7CS8qIENoZWNrIHBvcnQgYWdyZWVzIHdpdGggcG9ydCBzZXQgKi8KLQkJCWlmICgociAmIDIpID4+IDEgIT0gaSkgewotCQkJCXJlbGVhc2VfcmVnaW9uKHBvcnQsIDIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBDaGVjayBjYXJkIHR5cGUgKi8KLQkJCWlmICgociAmIDB4RjApID09IDB4QzApIHsKLQkJCQkvKiBRRDY1MDA6IHNpbmdsZSBjaGFubmVsICovCi0JCQkJaWYgKHIgJiA4KSB7Ci0JCQkJCS8qIERpc2FibGVkID8gKi8KLQkJCQkJcmVsZWFzZV9yZWdpb24ocG9ydCwgMik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAocWRpX2luaXRfb25lKHBvcnQsIDY1MDAsIGlkZV9wb3J0W3IgJiAweDAxXSwgaWRlX2lycVtyICYgMHgwMV0sIHIgJiAweDA0KSA9PSAwKQotCQkJCQljdCsrOwotCQkJfQotCQkJaWYgKCgociAmIDB4RjApID09IDB4QTApIHx8IChyICYgMHhGMCkgPT0gMHg1MCkgewotCQkJCS8qIFFENjU4MDogZHVhbCBjaGFubmVsICovCi0JCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0ICsgMiAsIDIsICJwYXRhX3FkaSIpKQotCQkJCXsKLQkJCQkJcmVsZWFzZV9yZWdpb24ocG9ydCwgMik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZXMgPSBpbmIocG9ydCArIDMpOwotCQkJCWlmIChyZXMgJiAxKSB7Ci0JCQkJCS8qIFNpbmdsZSBjaGFubmVsIG1vZGUgKi8KLQkJCQkJaWYgKHFkaV9pbml0X29uZShwb3J0LCA2NTgwLCBpZGVfcG9ydFtyICYgMHgwMV0sIGlkZV9pcnFbciAmIDB4MDFdLCByICYgMHgwNCkgPT0gMCkKLQkJCQkJCWN0Kys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogRHVhbCBjaGFubmVsIG1vZGUgKi8KLQkJCQkJaWYgKHFkaV9pbml0X29uZShwb3J0LCA2NTgwLCAweDFGMCwgMTQsIHIgJiAweDA0KSA9PSAwKQotCQkJCQkJY3QrKzsKLQkJCQkJaWYgKHFkaV9pbml0X29uZShwb3J0ICsgMiwgNjU4MCwgMHgxNzAsIDE1LCByICYgMHgwNCkgPT0gMCkKLQkJCQkJCWN0Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWlmIChjdCAhPSAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIF9fZXhpdCB2b2lkIHFkaV9leGl0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfcWRpX2hvc3Q7IGkrKykgewotCQlhdGFfaG9zdF9kZXRhY2gocWRpX2hvc3RbaV0pOwotCQkvKiBGcmVlIHRoZSBjb250cm9sIHJlc291cmNlLiBUaGUgNjU4MCBkdWFsIGNoYW5uZWwgaGFzIHRoZSByZXNvdXJjZXMKLQkJICogY2xhaW1lZCBhcyBhIHBhaXIgb2YgMiBieXRlIHJlc291cmNlcyBzbyB3ZSBuZWVkIG5vIHNwZWNpYWwgY2FzZXMuLi4KLQkJICovCi0JCXJlbGVhc2VfcmVnaW9uKHFkaV9kYXRhW2ldLnRpbWluZywgMik7Ci0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHFkaV9kYXRhW2ldLnBsYXRmb3JtX2Rldik7Ci0JfQotfQotCi1NT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBxZGkgQVRBIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7Ci0KLW1vZHVsZV9pbml0KHFkaV9pbml0KTsKLW1vZHVsZV9leGl0KHFkaV9leGl0KTsKLQotbW9kdWxlX3BhcmFtKHByb2JlX3FkaSwgaW50LCAwKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9yZGMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcmRjLmMKaW5kZXggNGQzMThmOC4uZTZhMmRkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9yZGMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3JkYy5jCkBAIC04Niw2ICs4Niw4IEBACiAJcmV0dXJuIGF0YV9zZmZfcHJlcmVzZXQobGluaywgZGVhZGxpbmUpOwogfQogCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJkY19sb2NrKTsKKwogLyoqCiAgKglyZGNfc2V0X3Bpb21vZGUgLSBJbml0aWFsaXplIGhvc3QgY29udHJvbGxlciBQQVRBIFBJTyB0aW1pbmdzCiAgKglAYXA6IFBvcnQgd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKQEAgLTEwMSw2ICsxMDMsNyBAQAogewogCXVuc2lnbmVkIGludCBwaW8JPSBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzA7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgaXNfc2xhdmUJPSAoYWRldi0+ZGV2bm8gIT0gMCk7CiAJdW5zaWduZWQgaW50IG1hc3Rlcl9wb3J0PSBhcC0+cG9ydF9ubyA/IDB4NDIgOiAweDQwOwogCXVuc2lnbmVkIGludCBzbGF2ZV9wb3J0CT0gMHg0NDsKQEAgLTEyNCw2ICsxMjcsOCBAQAogCWlmIChhZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSkKIAkJY29udHJvbCB8PSA0OwkvKiBQUEUgZW5hYmxlICovCiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmRjX2xvY2ssIGZsYWdzKTsKKwogCS8qIFBJTyBjb25maWd1cmF0aW9uIGNsZWFycyBEVEUgdW5jb25kaXRpb25hbGx5LiAgSXQgd2lsbCBiZQogCSAqIHByb2dyYW1tZWQgaW4gc2V0X2RtYW1vZGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQKIAkgKiBhZnRlciBzZXRfcGlvbW9kZSBpZiBhbnkgRE1BIG1vZGUgaXMgYXZhaWxhYmxlLgpAQCAtMTYxLDYgKzE2Niw4IEBACiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCAmdWRtYV9lbmFibGUpOwogCXVkbWFfZW5hYmxlICY9IH4oMSA8PCAoMiAqIGFwLT5wb3J0X25vICsgYWRldi0+ZGV2bm8pKTsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCB1ZG1hX2VuYWJsZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGNfbG9jaywgZmxhZ3MpOwogfQogCiAvKioKQEAgLTE3Nyw2ICsxODQsNyBAQAogc3RhdGljIHZvaWQgcmRjX3NldF9kbWFtb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggbWFzdGVyX3BvcnQJCT0gYXAtPnBvcnRfbm8gPyAweDQyIDogMHg0MDsKIAl1MTYgbWFzdGVyX2RhdGE7CiAJdTggc3BlZWQJCT0gYWRldi0+ZG1hX21vZGU7CkBAIC0xOTAsNiArMTk4LDggQEAKIAkJCSAgICB7IDIsIDEgfSwKIAkJCSAgICB7IDIsIDMgfSwgfTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZyZGNfbG9jaywgZmxhZ3MpOworCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBtYXN0ZXJfcG9ydCwgJm1hc3Rlcl9kYXRhKTsKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDgsICZ1ZG1hX2VuYWJsZSk7CiAKQEAgLTI3MSw2ICsyODEsOCBAQAogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBtYXN0ZXJfcG9ydCwgbWFzdGVyX2RhdGEpOwogCX0KIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCB1ZG1hX2VuYWJsZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGNfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcmRjX3BhdGFfb3BzID0gewpAQCAtMzc1LDYgKzM4NywxMCBAQAogCS5pZF90YWJsZQkJPSByZGNfcGNpX3RibCwKIAkucHJvYmUJCQk9IHJkY19pbml0X29uZSwKIAkucmVtb3ZlCQkJPSByZGNfcmVtb3ZlX29uZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAkJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGF0YV9wY2lfZGV2aWNlX3Jlc3VtZSwKKyNlbmRpZgogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYwppbmRleCBlMmMxODI1Li5jMGU2MDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCi0jZGVmaW5lIERSVl9OQU1FCSJzYzEyMDAiCisjZGVmaW5lIERSVl9OQU1FCSJwYXRhX3NjMTIwMCIKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMi42IgogCiAjZGVmaW5lIFNDMTIwMF9SRVZfQQkweDAwCkBAIC04NiwxMCArODYsMTQgQEAKIHN0YXRpYyB2b2lkIHNjMTIwMF9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKIAlzdGF0aWMgY29uc3QgdTMyIHBpb190aW1pbmdzWzRdWzVdID0gewotCQl7MHgwMDAwOTE3MiwgMHgwMDAxMjE3MSwgMHgwMDAyMDA4MCwgMHgwMDAzMjAxMCwgMHgwMDA0MDAxMH0sCS8vIGZvcm1hdDAgIDMzTWh6Ci0JCXsweGQxMzI5MTcyLCAweDcxMjEyMTcxLCAweDMwMjAwMDgwLCAweDIwMTAyMDEwLCAweDAwMTAwMDEwfSwJLy8gZm9ybWF0MSwgMzNNaHoKLQkJezB4ZmFhM2Y0ZjMsIDB4YzIzMjMyYjIsIDB4NTEzMTAxYzEsIDB4MzEyMTMxMjEsIDB4MTAyMTEwMjF9LAkvLyBmb3JtYXQxLCA0OE1oegotCQl7MHhmZmY0ZmZmNCwgMHhmMzUzNTNkMywgMHg4MTQxMDJmMSwgMHg0MjMxNDIzMSwgMHgxMTMxMTEzMX0JLy8gZm9ybWF0MSwgNjZNaHoKKwkJLyogZm9ybWF0MCwgMzNNaHogKi8KKwkJeyAweDAwMDA5MTcyLCAweDAwMDEyMTcxLCAweDAwMDIwMDgwLCAweDAwMDMyMDEwLCAweDAwMDQwMDEwIH0sCisJCS8qIGZvcm1hdDEsIDMzTWh6ICovCisJCXsgMHhkMTMyOTE3MiwgMHg3MTIxMjE3MSwgMHgzMDIwMDA4MCwgMHgyMDEwMjAxMCwgMHgwMDEwMDAxMCB9LAorCQkvKiBmb3JtYXQxLCA0OE1oeiAqLworCQl7IDB4ZmFhM2Y0ZjMsIDB4YzIzMjMyYjIsIDB4NTEzMTAxYzEsIDB4MzEyMTMxMjEsIDB4MTAyMTEwMjEgfSwKKwkJLyogZm9ybWF0MSwgNjZNaHogKi8KKwkJeyAweGZmZjRmZmY0LCAweGYzNTM1M2QzLCAweDgxNDEwMmYxLCAweDQyMzE0MjMxLCAweDExMzExMTMxIH0KIAl9OwogCiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKaW5kZXggZWI3NDhlMy4uZTI2NWY4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCkBAIC04MjYsMTggKzgyNiw2IEBACiB9CiAKIC8qKgotICoJc2NjX3BhdGFfcHJlcmVzZXQgLSBwcmVwYXJlIGZvciByZXNldAotICoJQGFwOiBBVEEgcG9ydCB0byBiZSByZXNldAotICoJQGRlYWRsaW5lOiBkZWFkbGluZSBqaWZmaWVzIGZvciB0aGUgb3BlcmF0aW9uCi0gKi8KLQotc3RhdGljIGludCBzY2NfcGF0YV9wcmVyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCi17Ci0JbGluay0+YXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOwotCXJldHVybiBhdGFfc2ZmX3ByZXJlc2V0KGxpbmssIGRlYWRsaW5lKTsKLX0KLQotLyoqCiAgKglzY2NfcG9zdHJlc2V0IC0gc3RhbmRhcmQgcG9zdHJlc2V0IGNhbGxiYWNrCiAgKglAYXA6IHRoZSB0YXJnZXQgYXRhX3BvcnQKICAqCUBjbGFzc2VzOiBjbGFzc2VzIG9mIGF0dGFjaGVkIGRldmljZXMKQEAgLTk0Niw3ICs5MzQsNyBAQAogCS5ibWRtYV9zdGF0dXMJCT0gc2NjX2JtZG1hX3N0YXR1cywKIAkuc2ZmX2RhdGFfeGZlcgkJPSBzY2NfZGF0YV94ZmVyLAogCi0JLnByZXJlc2V0CQk9IHNjY19wYXRhX3ByZXJlc2V0LAorCS5jYWJsZV9kZXRlY3QJCT0gYXRhX2NhYmxlXzgwd2lyZSwKIAkuc29mdHJlc2V0CQk9IHNjY19zb2Z0cmVzZXQsCiAJLnBvc3RyZXNldAkJPSBzY2NfcG9zdHJlc2V0LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMKaW5kZXggODZkZDcxNGUuLjcxZWFmMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMKQEAgLTU4LDE0ICs1OCwxNSBAQAogfTsKIAogLyoqCi0gKglkZWxsX2NhYmxlCS0JRGVsbCBzZXJ2ZXJ3b3JrcyBjYWJsZSBkZXRlY3Rpb24KKyAqCW9lbV9jYWJsZQktCURlbGwvU3VuIHNlcnZlcndvcmtzIGNhYmxlIGRldGVjdGlvbgogICoJQGFwOiBBVEEgcG9ydCB0byBkbyBjYWJsZSBkZXRlY3QKICAqCi0gKglEZWxsIGhpZGUgdGhlIDQwLzgwIHBpbiBzZWxlY3QgZm9yIHRoZWlyIGludGVyZmFjZXMgaW4gdGhlIHRvcCB0d28KLSAqCWJpdHMgb2YgdGhlIHN1YnN5c3RlbSBJRC4KKyAqCURlbGwgUG93ZXJFZGdlIGFuZCBTdW4gQ29iYWx0ICdBbHBpbmUnIGhpZGUgdGhlIDQwLzgwIHBpbiBzZWxlY3QKKyAqCWZvciB0aGVpciBpbnRlcmZhY2VzIGluIHRoZSB0b3AgdHdvIGJpdHMgb2YgdGhlIHN1YnN5c3RlbSBJRC4KICAqLwogCi1zdGF0aWMgaW50IGRlbGxfY2FibGUoc3RydWN0IGF0YV9wb3J0ICphcCkgeworc3RhdGljIGludCBvZW1fY2FibGUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAKIAlpZiAocGRldi0+c3Vic3lzdGVtX2RldmljZSAmICgxIDw8IChhcC0+cG9ydF9ubyArIDE0KSkpCkBAIC03Myw2NiArNzQsMjEgQEAKIAlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7CiB9CiAKLS8qKgotICoJc3VuX2NhYmxlCS0JU3VuIENvYmFsdCAnQWxwaW5lJyBjYWJsZSBkZXRlY3Rpb24KLSAqCUBhcDogQVRBIHBvcnQgdG8gZG8gY2FibGUgc2VsZWN0Ci0gKgotICoJQ29iYWx0IENTQjUgSURFIGhpZGVzIHRoZSA0MC84MHBpbiBpbiB0aGUgdG9wIHR3byBiaXRzIG9mIHRoZQotICoJc3Vic3lzdGVtIElEIHRoZSBzYW1lIGFzIGRlbGwuIFdlIGNvdWxkIHVzZSBvbmUgZnVuY3Rpb24gYnV0IHdlIG1heQotICoJbmVlZCB0byBleHRlbmQgdGhlIERlbGwgb25lIGluIGZ1dHVyZQotICovCi0KLXN0YXRpYyBpbnQgc3VuX2NhYmxlKHN0cnVjdCBhdGFfcG9ydCAqYXApIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0KLQlpZiAocGRldi0+c3Vic3lzdGVtX2RldmljZSAmICgxIDw8IChhcC0+cG9ydF9ubyArIDE0KSkpCi0JCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKLQlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7Ci19Ci0KLS8qKgotICoJb3NiNF9jYWJsZQktCU9TQjQgY2FibGUgZGV0ZWN0Ci0gKglAYXA6IEFUQSBwb3J0IHRvIGNoZWNrCi0gKgotICoJVGhlIE9TQjQgaXNuJ3QgVURNQTY2IGNhcGFibGUgc28gdGhpcyBpcyBlYXN5Ci0gKi8KLQotc3RhdGljIGludCBvc2I0X2NhYmxlKHN0cnVjdCBhdGFfcG9ydCAqYXApIHsKLQlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7Ci19Ci0KLS8qKgotICoJY3NiX2NhYmxlCS0JQ1NCNS82IGNhYmxlIGRldGVjdAotICoJQGFwOiBBVEEgcG9ydCB0byBjaGVjawotICoKLSAqCVNlcnZlcndvcmtzIGRlZmF1bHQgYXJyYW5nZW1lbnQgaXMgdG8gdXNlIHRoZSBkcml2ZSBzaWRlIGRldGVjdGlvbgotICoJb25seS4KLSAqLwotCi1zdGF0aWMgaW50IGNzYl9jYWJsZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKSB7Ci0JcmV0dXJuIEFUQV9DQkxfUEFUQV9VTks7Ci19Ci0KIHN0cnVjdCBzdl9jYWJsZV90YWJsZSB7CiAJaW50IGRldmljZTsKIAlpbnQgc3VidmVuZG9yOwogCWludCAoKmNhYmxlX2RldGVjdCkoc3RydWN0IGF0YV9wb3J0ICphcCk7CiB9OwogCi0vKgotICoJTm90ZSB0aGF0IHdlIGRvbid0IGNvcHkgdGhlIG9sZCBzZXJ2ZXJ3b3JrcyBjb2RlIGJlY2F1c2UgdGhlIG9sZAotICoJY29kZSBjb250YWlucyBvYnZpb3VzIG1pc3Rha2VzCi0gKi8KLQogc3RhdGljIHN0cnVjdCBzdl9jYWJsZV90YWJsZSBjYWJsZV9kZXRlY3RbXSA9IHsKLQl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSwgUENJX1ZFTkRPUl9JRF9ERUxMLCBkZWxsX2NhYmxlIH0sCi0JeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUsIFBDSV9WRU5ET1JfSURfREVMTCwgZGVsbF9jYWJsZSB9LAotCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFLCBQQ0lfVkVORE9SX0lEX1NVTiwgIHN1bl9jYWJsZSB9LAotCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFLCBQQ0lfQU5ZX0lELCBvc2I0X2NhYmxlIH0sCi0JeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUsIFBDSV9BTllfSUQsIGNzYl9jYWJsZSB9LAotCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFLCBQQ0lfQU5ZX0lELCBjc2JfY2FibGUgfSwKLQl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERTIsIFBDSV9BTllfSUQsIGNzYl9jYWJsZSB9LAotCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19IVDEwMDBJREUsIFBDSV9BTllfSUQsIGNzYl9jYWJsZSB9LAorCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFLCAgIFBDSV9WRU5ET1JfSURfREVMTCwgb2VtX2NhYmxlIH0sCisJeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUsICAgUENJX1ZFTkRPUl9JRF9ERUxMLCBvZW1fY2FibGUgfSwKKwl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSwgICBQQ0lfVkVORE9SX0lEX1NVTiwgIG9lbV9jYWJsZSB9LAorCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFLCAgIFBDSV9BTllfSUQsIGF0YV9jYWJsZV80MHdpcmUgIH0sCisJeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUsICAgUENJX0FOWV9JRCwgYXRhX2NhYmxlX3Vua25vd24gfSwKKwl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERSwgICBQQ0lfQU5ZX0lELCBhdGFfY2FibGVfdW5rbm93biB9LAorCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFMiwgIFBDSV9BTllfSUQsIGF0YV9jYWJsZV91bmtub3duIH0sCisJeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMTAwMElERSwgUENJX0FOWV9JRCwgYXRhX2NhYmxlX3Vua25vd24gfSwKIAl7IH0KIH07CiAKQEAgLTM5Myw2ICszNDksMzEgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1QSwgYnRyKTsKIH0KIAorc3RhdGljIGludCBzZXJ2ZXJ3b3Jrc19maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgcmMgPSAwOworCisJLyogRm9yY2UgbWFzdGVyIGxhdGVuY3kgdGltZXIgdG8gNjQgUENJIGNsb2NrcyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg0MCk7CisKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFOgorCQlyYyA9IHNlcnZlcndvcmtzX2ZpeHVwX29zYjQocGRldik7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFOgorCQlhdGFfcGNpX2JtZG1hX2NsZWFyX3NpbXBsZXgocGRldik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFOgorCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFMjoKKwkJcmMgPSBzZXJ2ZXJ3b3Jrc19maXh1cF9jc2IocGRldik7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19IVDEwMDBJREU6CisJCXNlcnZlcndvcmtzX2ZpeHVwX2h0MTAwMChwZGV2KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQogCiBzdGF0aWMgaW50IHNlcnZlcndvcmtzX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CkBAIC00MzAsMTMgKzQxMSwxMiBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JLyogRm9yY2UgbWFzdGVyIGxhdGVuY3kgdGltZXIgdG8gNjQgUENJIGNsb2NrcyAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg0MCk7CisJcmMgPSBzZXJ2ZXJ3b3Jrc19maXh1cChwZGV2KTsKIAogCS8qIE9TQjQgOiBTb3V0aCBCcmlkZ2UgYW5kIElERSAqLwogCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFKSB7CiAJCS8qIFNlbGVjdCBub24gVURNQSBjYXBhYmxlIE9TQjQgaWYgd2UgY2FuJ3QgZG8gZml4dXBzICovCi0JCWlmICggc2VydmVyd29ya3NfZml4dXBfb3NiNChwZGV2KSA8IDApCisJCWlmIChyYyA8IDApCiAJCQlwcGlbMF0gPSAmaW5mb1sxXTsKIAl9CiAJLyogc2V0dXAgQ1NCNS9DU0I2IDogU291dGggQnJpZGdlIGFuZCBJREUgb3B0aW9uIFJBSUQgKi8KQEAgLTQ0NiwxOSArNDI2LDEzIEBACiAKIAkJIC8qIElmIHRoZSByZXR1cm5lZCBidHIgaXMgdGhlIG5ld2VyIHJldmlzaW9uIHRoZW4KIAkJICAgIHNlbGVjdCB0aGUgcmlnaHQgaW5mbyBibG9jayAqLwotCQkgaWYgKHNlcnZlcndvcmtzX2ZpeHVwX2NzYihwZGV2KSA9PSAzKQorCQkgaWYgKHJjID09IDMpCiAJCSAJcHBpWzBdID0gJmluZm9bM107CiAKIAkJLyogSXMgdGhpcyB0aGUgM3JkIGNoYW5uZWwgQ1NCNiBJREUgPyAqLwogCQlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERTIpCiAJCQlwcGlbMV0gPSAmYXRhX2R1bW15X3BvcnRfaW5mbzsKIAl9Ci0JLyogc2V0dXAgSFQxMDAwRSAqLwotCWVsc2UgaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMTAwMElERSkKLQkJc2VydmVyd29ya3NfZml4dXBfaHQxMDAwKHBkZXYpOwotCi0JaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUpCi0JCWF0YV9wY2lfYm1kbWFfY2xlYXJfc2ltcGxleChwZGV2KTsKIAogCXJldHVybiBhdGFfcGNpX2JtZG1hX2luaXRfb25lKHBkZXYsIHBwaSwgJnNlcnZlcndvcmtzX3NodCwgTlVMTCwgMCk7CiB9CkBAIC00NzMsMjQgKzQ0Nyw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQkvKiBGb3JjZSBtYXN0ZXIgbGF0ZW5jeSB0aW1lciB0byA2NCBQQ0kgY2xvY2tzICovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDQwKTsKLQotCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFOgotCQkJc2VydmVyd29ya3NfZml4dXBfb3NiNChwZGV2KTsKLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERToKLQkJCWF0YV9wY2lfYm1kbWFfY2xlYXJfc2ltcGxleChwZGV2KTsKLQkJCS8qIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERToKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUyOgotCQkJc2VydmVyd29ya3NfZml4dXBfY3NiKHBkZXYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19IVDEwMDBJREU6Ci0JCQlzZXJ2ZXJ3b3Jrc19maXh1cF9odDEwMDAocGRldik7Ci0JCQlicmVhazsKLQl9CisJKHZvaWQpc2VydmVyd29ya3NfZml4dXAocGRldik7CiAKIAlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwppbmRleCAzMWY3NTliLi5iOTJlYWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKQEAgLTM4LDExICszOCwxMiBAQAogCiAvKioKICAqCXNpbDY4MF9zZWxyZWcJCS0JcmV0dXJuIHJlZ2lzdGVyIGJhc2UKLSAqCUBod2lmOiBpbnRlcmZhY2UKKyAqCUBhcDogQVRBIGludGVyZmFjZQogICoJQHI6IGNvbmZpZyBvZmZzZXQKICAqCi0gKglUdXJuIGEgY29uZmlnIHJlZ2lzdGVyIG9mZnNldCBpbnRvIHRoZSByaWdodCBhZGRyZXNzIGluIGVpdGhlcgotICoJUENJIHNwYWNlIG9yIE1NSU8gc3BhY2UgdG8gYWNjZXNzIHRoZSBjb250cm9sIHJlZ2lzdGVyIGluIHF1ZXN0aW9uCisgKglUdXJuIGEgY29uZmlnIHJlZ2lzdGVyIG9mZnNldCBpbnRvIHRoZSByaWdodCBhZGRyZXNzIGluIFBDSSBzcGFjZQorICoJdG8gYWNjZXNzIHRoZSBjb250cm9sIHJlZ2lzdGVyIGluIHF1ZXN0aW9uLgorICoKICAqCVRoYW5rZnVsbHkgdGhpcyBpcyBhIGNvbmZpZ3VyYXRpb24gb3BlcmF0aW9uIHNvIGlzbid0IHBlcmZvcm1hbmNlCiAgKgljcml0aWNpYWwuCiAgKi8KQEAgLTU2LDEyICs1NywxMiBAQAogCiAvKioKICAqCXNpbDY4MF9zZWxkZXYJCS0JcmV0dXJuIHJlZ2lzdGVyIGJhc2UKLSAqCUBod2lmOiBpbnRlcmZhY2UKKyAqCUBhcDogQVRBIGludGVyZmFjZQogICoJQHI6IGNvbmZpZyBvZmZzZXQKICAqCi0gKglUdXJuIGEgY29uZmlnIHJlZ2lzdGVyIG9mZnNldCBpbnRvIHRoZSByaWdodCBhZGRyZXNzIGluIGVpdGhlcgotICoJUENJIHNwYWNlIG9yIE1NSU8gc3BhY2UgdG8gYWNjZXNzIHRoZSBjb250cm9sIHJlZ2lzdGVyIGluIHF1ZXN0aW9uCi0gKglpbmNsdWRpbmcgYWNjb3VudGluZyBmb3IgdGhlIHVuaXQgc2hpZnQuCisgKglUdXJuIGEgY29uZmlnIHJlZ2lzdGVyIG9mZnNldCBpbnRvIHRoZSByaWdodCBhZGRyZXNzIGluIFBDSSBzcGFjZQorICoJdG8gYWNjZXNzIHRoZSBjb250cm9sIHJlZ2lzdGVyIGluIHF1ZXN0aW9uIGluY2x1ZGluZyBhY2NvdW50aW5nIGZvcgorICoJdGhlIHVuaXQgc2hpZnQuCiAgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2lsNjgwX3NlbGRldihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgaW50IHIpCkBAIC04MSw3ICs4Miw4IEBACiAgKglzcGFjZSBmb3IgdXMuCiAgKi8KIAotc3RhdGljIGludCBzaWw2ODBfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApIHsKK3N0YXRpYyBpbnQgc2lsNjgwX2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBzaWw2ODBfc2VscmVnKGFwLCAwKTsKIAl1OCBhdGE2NjsKQEAgLTkzLDcgKzk1LDcgQEAKIH0KIAogLyoqCi0gKglzaWw2ODBfc2V0X3Bpb21vZGUJLQlzZXQgaW5pdGlhbCBQSU8gbW9kZSBkYXRhCisgKglzaWw2ODBfc2V0X3Bpb21vZGUJLQlzZXQgUElPIG1vZGUgZGF0YQogICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAYWRldjogQVRBIGRldmljZQogICoKQEAgLTEwNCw4ICsxMDYsMTIgQEAKIAogc3RhdGljIHZvaWQgc2lsNjgwX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0YXRpYyB1MTYgc3BlZWRfcFs1XSA9IHsgMHgzMjhBLCAweDIyODMsIDB4MTEwNCwgMHgxMEMzLCAweDEwQzEgfTsKLQlzdGF0aWMgdTE2IHNwZWVkX3RbNV0gPSB7IDB4MzI4QSwgMHgyMjgzLCAweDEyODEsIDB4MTBDMywgMHgxMEMxIH07CisJc3RhdGljIGNvbnN0IHUxNiBzcGVlZF9wWzVdID0geworCQkweDMyOEEsIDB4MjI4MywgMHgxMTA0LCAweDEwQzMsIDB4MTBDMQorCX07CisJc3RhdGljIGNvbnN0IHUxNiBzcGVlZF90WzVdID0geworCQkweDMyOEEsIDB4MjI4MywgMHgxMjgxLCAweDEwQzMsIDB4MTBDMQorCX07CiAKIAl1bnNpZ25lZCBsb25nIHRmYWRkciA9IHNpbDY4MF9zZWxyZWcoYXAsIDB4MDIpOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IHNpbDY4MF9zZWxkZXYoYXAsIGFkZXYsIDB4MDQpOwpAQCAtMTQwLDIyICsxNDYsMjMgQEAKIH0KIAogLyoqCi0gKglzaWw2ODBfc2V0X2RtYW1vZGUJLQlzZXQgaW5pdGlhbCBETUEgbW9kZSBkYXRhCisgKglzaWw2ODBfc2V0X2RtYW1vZGUJLQlzZXQgRE1BIG1vZGUgZGF0YQogICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAYWRldjogQVRBIGRldmljZQogICoKLSAqCVByb2dyYW0gdGhlIE1XRE1BL1VETUEgbW9kZXMgZm9yIHRoZSBzaWw2ODAgawotICoJY2hpcHNldC4gVGhlIE1XRE1BIG1vZGUgdmFsdWVzIGFyZSBwdWxsZWQgZnJvbSBhIGxvb2t1cCB0YWJsZQorICoJUHJvZ3JhbSB0aGUgTVdETUEvVURNQSBtb2RlcyBmb3IgdGhlIHNpbDY4MCBjaGlwc2V0LgorICoKKyAqCVRoZSBNV0RNQSBtb2RlIHZhbHVlcyBhcmUgcHVsbGVkIGZyb20gYSBsb29rdXAgdGFibGUKICAqCXdoaWxlIHRoZSBjaGlwc2V0IHVzZXMgbW9kZSBudW1iZXIgZm9yIFVETUEuCiAgKi8KIAogc3RhdGljIHZvaWQgc2lsNjgwX3NldF9kbWFtb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0YXRpYyB1OCB1bHRyYV90YWJsZVsyXVs3XSA9IHsKKwlzdGF0aWMgY29uc3QgdTggdWx0cmFfdGFibGVbMl1bN10gPSB7CiAJCXsgMHgwQywgMHgwNywgMHgwNSwgMHgwNCwgMHgwMiwgMHgwMSwgMHhGRiB9LAkvKiAxMDBNSHogKi8KIAkJeyAweDBGLCAweDBCLCAweDA3LCAweDA1LCAweDAzLCAweDAyLCAweDAxIH0sCS8qIDEzM01oeiAqLwogCX07Ci0Jc3RhdGljIHUxNiBkbWFfdGFibGVbM10gPSB7IDB4MjIwOCwgMHgxMEMyLCAweDEwQzEgfTsKKwlzdGF0aWMgY29uc3QgdTE2IGRtYV90YWJsZVszXSA9IHsgMHgyMjA4LCAweDEwQzIsIDB4MTBDMSB9OwogCiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCXVuc2lnbmVkIGxvbmcgbWEgPSBzaWw2ODBfc2VsZGV2KGFwLCBhZGV2LCAweDA4KTsKQEAgLTE3NSw3ICsxODIsNyBAQAogCW1vZGUgJj0gfigweDAzIDw8IHBvcnRfc2hpZnQpOwogCiAJLyogRXh0cmFjdCBzY3NjICovCi0Jc2NzYyA9IChzY3NjICYgMHgzMCkgPyAxOiAwOworCXNjc2MgPSAoc2NzYyAmIDB4MzApID8gMSA6IDA7CiAKIAlpZiAoYWRldi0+ZG1hX21vZGUgPj0gWEZFUl9VRE1BXzApIHsKIAkJbXVsdGkgPSAweDEwQzE7CkBAIC0yNDgsNyArMjU1LDcgQEAKIHsKIAl1OCB0bXBieXRlCT0gMDsKIAotICAgICAgICAvKiBGSVhNRTogZG91YmxlIGNoZWNrICovCisJLyogRklYTUU6IGRvdWJsZSBjaGVjayAqLwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLAogCQkJICAgICAgcGRldi0+cmV2aXNpb24gPyAxIDogMjU1KTsKIApAQCAtMjY2LDIyICsyNzMsMjIgQEAKIAkJKnRyeV9tbWlvID0gKHRtcGJ5dGUgJiAxKSB8fCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNSk7CiAjZW5kaWYKIAotCXN3aXRjaCh0bXBieXRlICYgMHgzMCkgewotCQljYXNlIDB4MDA6Ci0JCQkvKiAxMzMgY2xvY2sgYXR0ZW1wdCB0byBmb3JjZSBpdCBvbiAqLwotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4OEEsIHRtcGJ5dGV8MHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAweDMwOgotCQkJLyogaWYgY2xvY2tpbmcgaXMgZGlzYWJsZWQgKi8KLQkJCS8qIDEzMyBjbG9jayBhdHRlbXB0IHRvIGZvcmNlIGl0IG9uICovCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4QSwgdG1wYnl0ZSAmIH4weDIwKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MTA6Ci0JCQkvKiAxMzMgYWxyZWFkeSAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgyMDoKLQkJCS8qIEJJT1Mgc2V0IFBDSSB4MiBjbG9ja2luZyAqLwotCQkJYnJlYWs7CisJc3dpdGNoICh0bXBieXRlICYgMHgzMCkgeworCWNhc2UgMHgwMDoKKwkJLyogMTMzIGNsb2NrIGF0dGVtcHQgdG8gZm9yY2UgaXQgb24gKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4OEEsIHRtcGJ5dGV8MHgxMCk7CisJCWJyZWFrOworCWNhc2UgMHgzMDoKKwkJLyogaWYgY2xvY2tpbmcgaXMgZGlzYWJsZWQgKi8KKwkJLyogMTMzIGNsb2NrIGF0dGVtcHQgdG8gZm9yY2UgaXQgb24gKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4OEEsIHRtcGJ5dGUgJiB+MHgyMCk7CisJCWJyZWFrOworCWNhc2UgMHgxMDoKKwkJLyogMTMzIGFscmVhZHkgKi8KKwkJYnJlYWs7CisJY2FzZSAweDIwOgorCQkvKiBCSU9TIHNldCBQQ0kgeDIgY2xvY2tpbmcgKi8KKwkJYnJlYWs7CiAJfQogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgICAweDhBLCAmdG1wYnl0ZSk7CkBAIC0yOTksMTIgKzMwNiwxOSBAQAogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHhCOCwgMHg0MzkyNDM5Mik7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweEJDLCAweDQwMDk0MDA5KTsKIAotCXN3aXRjaCh0bXBieXRlICYgMHgzMCkgewotCQljYXNlIDB4MDA6IHByaW50ayhLRVJOX0lORk8gInNpbDY4MDogMTAwTUh6IGNsb2NrLlxuIik7YnJlYWs7Ci0JCWNhc2UgMHgxMDogcHJpbnRrKEtFUk5fSU5GTyAic2lsNjgwOiAxMzNNSHogY2xvY2suXG4iKTticmVhazsKLQkJY2FzZSAweDIwOiBwcmludGsoS0VSTl9JTkZPICJzaWw2ODA6IFVzaW5nIFBDSSBjbG9jay5cbiIpO2JyZWFrOwotCQkvKiBUaGlzIGxhc3QgY2FzZSBpcyBfTk9UXyBvayAqLwotCQljYXNlIDB4MzA6IHByaW50ayhLRVJOX0VSUiAic2lsNjgwOiBDbG9jayBkaXNhYmxlZCA/XG4iKTsKKwlzd2l0Y2ggKHRtcGJ5dGUgJiAweDMwKSB7CisJY2FzZSAweDAwOgorCQlwcmludGsoS0VSTl9JTkZPICJzaWw2ODA6IDEwME1IeiBjbG9jay5cbiIpOworCQlicmVhazsKKwljYXNlIDB4MTA6CisJCXByaW50ayhLRVJOX0lORk8gInNpbDY4MDogMTMzTUh6IGNsb2NrLlxuIik7CisJCWJyZWFrOworCWNhc2UgMHgyMDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2lsNjgwOiBVc2luZyBQQ0kgY2xvY2suXG4iKTsKKwkJYnJlYWs7CisJLyogVGhpcyBsYXN0IGNhc2UgaXMgX05PVF8gb2sgKi8KKwljYXNlIDB4MzA6CisJCXByaW50ayhLRVJOX0VSUiAic2lsNjgwOiBDbG9jayBkaXNhYmxlZCA/XG4iKTsKIAl9CiAJcmV0dXJuIHRtcGJ5dGUgJiAweDMwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKaW5kZXggNTMzZjJhZS4uYjBlZGM3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jCkBAIC01NSw3ICs1NSw3IEBACiAJLyogZGV2aWQsIHN1YnZlbmRvciwgc3ViZGV2ICovCiAJeyAweDU1MTMsIDB4MTA0MywgMHgxMTA3IH0sCS8qIEFTVVMgQTZLICovCiAJeyAweDU1MTMsIDB4MTczNCwgMHgxMDVGIH0sCS8qIEZTQyBBbWlsbyBBMTYzMCAqLwotCXsgMHg1NTEzLCAweDEwNzEsIDB4ODY0MCB9LCAgICAgLyogRWFzeU5vdGUgSzUzMDUgKi8KKwl7IDB4NTUxMywgMHgxMDcxLCAweDg2NDAgfSwJLyogRWFzeU5vdGUgSzUzMDUgKi8KIAkvKiBlbmQgbWFya2VyICovCiAJeyAwLCB9CiB9OwpAQCAtNzYsNyArNzYsNyBAQAogfQogCiAvKioKLSAqCXNpc19vbGRfcG9ydF9iYXNlCQktCXJldHVybiBQQ0kgY29uZmlndXJhdGlvbiBiYXNlIGZvciBkZXYKKyAqCXNpc19vbGRfcG9ydF9iYXNlIC0gcmV0dXJuIFBDSSBjb25maWd1cmF0aW9uIGJhc2UgZm9yIGRldgogICoJQGFkZXY6IGRldmljZQogICoKICAqCVJldHVybnMgdGhlIGJhc2Ugb2YgdGhlIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBmb3IgdGhpcyBwb3J0CkBAIC04NSwxMSArODUsMzQgQEAKIAogc3RhdGljIGludCBzaXNfb2xkX3BvcnRfYmFzZShzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlyZXR1cm4gIDB4NDAgKyAoNCAqIGFkZXYtPmxpbmstPmFwLT5wb3J0X25vKSArICAoMiAqIGFkZXYtPmRldm5vKTsKKwlyZXR1cm4gMHg0MCArICg0ICogYWRldi0+bGluay0+YXAtPnBvcnRfbm8pICsgKDIgKiBhZGV2LT5kZXZubyk7CiB9CiAKIC8qKgotICoJc2lzXzEzM19jYWJsZV9kZXRlY3QJLQljaGVjayBmb3IgNDAvODAgcGluCisgKglzaXNfcG9ydF9iYXNlIC0gcmV0dXJuIFBDSSBjb25maWd1cmF0aW9uIGJhc2UgZm9yIGRldgorICoJQGFkZXY6IGRldmljZQorICoKKyAqCVJldHVybnMgdGhlIGJhc2Ugb2YgdGhlIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBmb3IgdGhpcyBwb3J0CisgKgludW1iZXIuCisgKi8KKworc3RhdGljIGludCBzaXNfcG9ydF9iYXNlKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBhZGV2LT5saW5rLT5hcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJaW50IHBvcnQgPSAweDQwOworCXUzMiByZWc1NDsKKworCS8qIElmIGJpdCAzMCBpcyBzZXQgdGhlbiB0aGUgcmVnaXN0ZXJzIGFyZSBtYXBwZWQgYXQgMHg3MCBub3QgMHg0MCAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDU0LCAmcmVnNTQpOworCWlmIChyZWc1NCAmIDB4NDAwMDAwMDApCisJCXBvcnQgPSAweDcwOworCisJcmV0dXJuIHBvcnQgKyAoOCAqIGFwLT5wb3J0X25vKSArICg0ICogYWRldi0+ZGV2bm8pOworfQorCisvKioKKyAqCXNpc18xMzNfY2FibGVfZGV0ZWN0IC0gY2hlY2sgZm9yIDQwLzgwIHBpbgogICoJQGFwOiBQb3J0CiAgKglAZGVhZGxpbmU6IGRlYWRsaW5lIGppZmZpZXMgZm9yIHRoZSBvcGVyYXRpb24KICAqCkBAIC0xMTAsNyArMTMzLDcgQEAKIH0KIAogLyoqCi0gKglzaXNfNjZfY2FibGVfZGV0ZWN0CS0JY2hlY2sgZm9yIDQwLzgwIHBpbgorICoJc2lzXzY2X2NhYmxlX2RldGVjdCAtIGNoZWNrIGZvciA0MC84MCBwaW4KICAqCUBhcDogUG9ydAogICoKICAqCVBlcmZvcm0gY2FibGUgZGV0ZWN0aW9uIG9uIHRoZSBVRE1BNjYsIFVETUExMDAgYW5kIGVhcmx5IFVETUExMzMKQEAgLTEzMiw3ICsxNTUsNyBAQAogCiAKIC8qKgotICoJc2lzX3ByZV9yZXNldAkJLQlwcm9iZSBiZWdpbgorICoJc2lzX3ByZV9yZXNldCAtIHByb2JlIGJlZ2luCiAgKglAbGluazogQVRBIGxpbmsKICAqCUBkZWFkbGluZTogZGVhZGxpbmUgamlmZmllcyBmb3IgdGhlIG9wZXJhdGlvbgogICoKQEAgLTE2MCw3ICsxODMsNyBAQAogCiAKIC8qKgotICoJc2lzX3NldF9maWZvCS0JU2V0IFJXUCBmaWZvIGJpdHMgZm9yIHRoaXMgZGV2aWNlCisgKglzaXNfc2V0X2ZpZm8gLSBTZXQgUldQIGZpZm8gYml0cyBmb3IgdGhpcyBkZXZpY2UKICAqCUBhcDogUG9ydAogICoJQGFkZXY6IERldmljZQogICoKQEAgLTIwMywxMyArMjI2LDEzIEBACiAKIHN0YXRpYyB2b2lkIHNpc19vbGRfc2V0X3Bpb21vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJaW50IHBvcnQgPSBzaXNfb2xkX3BvcnRfYmFzZShhZGV2KTsKIAl1OCB0MSwgdDI7CiAJaW50IHNwZWVkID0gYWRldi0+cGlvX21vZGUgLSBYRkVSX1BJT18wOwogCi0JY29uc3QgdTggYWN0aXZlW10gICA9IHsgMHgwMCwgMHgwNywgMHgwNCwgMHgwMywgMHgwMSB9OwotCWNvbnN0IHU4IHJlY292ZXJ5W10gPSB7IDB4MDAsIDB4MDYsIDB4MDQsIDB4MDMsIDB4MDMgfTsKKwlzdGF0aWMgY29uc3QgdTggYWN0aXZlW10gICA9IHsgMHgwMCwgMHgwNywgMHgwNCwgMHgwMywgMHgwMSB9OworCXN0YXRpYyBjb25zdCB1OCByZWNvdmVyeVtdID0geyAweDAwLCAweDA2LCAweDA0LCAweDAzLCAweDAzIH07CiAKIAlzaXNfc2V0X2ZpZm8oYXAsIGFkZXYpOwogCkBAIC0yNDAsMTEgKzI2MywxMSBAQAogCiBzdGF0aWMgdm9pZCBzaXNfMTAwX3NldF9waW9tb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCWludCBwb3J0ID0gc2lzX29sZF9wb3J0X2Jhc2UoYWRldik7CiAJaW50IHNwZWVkID0gYWRldi0+cGlvX21vZGUgLSBYRkVSX1BJT18wOwogCi0JY29uc3QgdTggYWN0cmVjW10gPSB7IDB4MDAsIDB4NjcsIDB4NDQsIDB4MzMsIDB4MzEgfTsKKwlzdGF0aWMgY29uc3QgdTggYWN0cmVjW10gPSB7IDB4MDAsIDB4NjcsIDB4NDQsIDB4MzMsIDB4MzEgfTsKIAogCXNpc19zZXRfZmlmbyhhcCwgYWRldik7CiAKQEAgLTI2NSwyMCArMjg4LDE5IEBACiAKIHN0YXRpYyB2b2lkIHNpc18xMzNfc2V0X3Bpb21vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQlpbnQgcG9ydCA9IDB4NDA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCWludCBwb3J0OwogCXUzMiB0MTsKLQl1MzIgcmVnNTQ7CiAJaW50IHNwZWVkID0gYWRldi0+cGlvX21vZGUgLSBYRkVSX1BJT18wOwogCi0JY29uc3QgdTMyIHRpbWluZzEzM1tdID0geworCXN0YXRpYyBjb25zdCB1MzIgdGltaW5nMTMzW10gPSB7CiAJCTB4MjgyNjkwMDAsCS8qIFJlY292ZXJ5IDw8IDI0IHwgQWN0IDw8IDE2IHwgSW5pIDw8IDEyICovCiAJCTB4MEMyNjYwMDAsCiAJCTB4MDQyNjMwMDAsCiAJCTB4MEMwQTMwMDAsCiAJCTB4MDUwOTMwMDAKIAl9OwotCWNvbnN0IHUzMiB0aW1pbmcxMDBbXSA9IHsKKwlzdGF0aWMgY29uc3QgdTMyIHRpbWluZzEwMFtdID0gewogCQkweDFFMUM2MDAwLAkvKiBSZWNvdmVyeSA8PCAyNCB8IEFjdCA8PCAxNiB8IEluaSA8PCAxMiAqLwogCQkweDA5MUM0MDAwLAogCQkweDAzMUMyMDAwLApAQCAtMjg4LDEyICszMTAsNyBAQAogCiAJc2lzX3NldF9maWZvKGFwLCBhZGV2KTsKIAotCS8qIElmIGJpdCAxNCBpcyBzZXQgdGhlbiB0aGUgcmVnaXN0ZXJzIGFyZSBtYXBwZWQgYXQgMHg3MCBub3QgMHg0MCAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDU0LCAmcmVnNTQpOwotCWlmIChyZWc1NCAmIDB4NDAwMDAwMDApCi0JCXBvcnQgPSAweDcwOwotCXBvcnQgKz0gOCAqIGFwLT5wb3J0X25vICsgIDQgKiBhZGV2LT5kZXZubzsKLQorCXBvcnQgPSBzaXNfcG9ydF9iYXNlKGFkZXYpOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3J0LCAmdDEpOwogCXQxICY9IDB4QzBDMDBGRkY7CS8qIE1hc2sgb3V0IHRpbWluZyAqLwogCkBAIC0zMTksMTMgKzMzNiwxMyBAQAogCiBzdGF0aWMgdm9pZCBzaXNfb2xkX3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCWludCBzcGVlZCA9IGFkZXYtPmRtYV9tb2RlIC0gWEZFUl9NV19ETUFfMDsKIAlpbnQgZHJpdmVfcGNpID0gc2lzX29sZF9wb3J0X2Jhc2UoYWRldik7CiAJdTE2IHRpbWluZzsKIAotCWNvbnN0IHUxNiBtd2RtYV9iaXRzW10gPSB7IDB4MDA4LCAweDMwMiwgMHgzMDEgfTsKLQljb25zdCB1MTYgdWRtYV9iaXRzW10gID0geyAweEUwMDAsIDB4QzAwMCwgMHhBMDAwIH07CisJc3RhdGljIGNvbnN0IHUxNiBtd2RtYV9iaXRzW10gPSB7IDB4MDA4LCAweDMwMiwgMHgzMDEgfTsKKwlzdGF0aWMgY29uc3QgdTE2IHVkbWFfYml0c1tdICA9IHsgMHhFMDAwLCAweEMwMDAsIDB4QTAwMCB9OwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgZHJpdmVfcGNpLCAmdGltaW5nKTsKIApAQCAtMzU4LDE0ICszNzUsMTQgQEAKIAogc3RhdGljIHZvaWQgc2lzXzY2X3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCWludCBzcGVlZCA9IGFkZXYtPmRtYV9tb2RlIC0gWEZFUl9NV19ETUFfMDsKIAlpbnQgZHJpdmVfcGNpID0gc2lzX29sZF9wb3J0X2Jhc2UoYWRldik7CiAJdTE2IHRpbWluZzsKIAogCS8qIE1XRE1BIDAtMiBhbmQgVURNQSAwLTUgKi8KLQljb25zdCB1MTYgbXdkbWFfYml0c1tdID0geyAweDAwOCwgMHgzMDIsIDB4MzAxIH07Ci0JY29uc3QgdTE2IHVkbWFfYml0c1tdICA9IHsgMHhGMDAwLCAweEQwMDAsIDB4QjAwMCwgMHhBMDAwLCAweDkwMDAsIDB4ODAwMCB9OworCXN0YXRpYyBjb25zdCB1MTYgbXdkbWFfYml0c1tdID0geyAweDAwOCwgMHgzMDIsIDB4MzAxIH07CisJc3RhdGljIGNvbnN0IHUxNiB1ZG1hX2JpdHNbXSAgPSB7IDB4RjAwMCwgMHhEMDAwLCAweEIwMDAsIDB4QTAwMCwgMHg5MDAwLCAweDgwMDAgfTsKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIGRyaXZlX3BjaSwgJnRpbWluZyk7CiAKQEAgLTM5NywxMiArNDE0LDEyIEBACiAKIHN0YXRpYyB2b2lkIHNpc18xMDBfc2V0X2RtYW1vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJaW50IHNwZWVkID0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX01XX0RNQV8wOwogCWludCBkcml2ZV9wY2kgPSBzaXNfb2xkX3BvcnRfYmFzZShhZGV2KTsKIAl1OCB0aW1pbmc7CiAKLQljb25zdCB1OCB1ZG1hX2JpdHNbXSAgPSB7IDB4OEIsIDB4ODcsIDB4ODUsIDB4ODMsIDB4ODIsIDB4ODF9OworCXN0YXRpYyBjb25zdCB1OCB1ZG1hX2JpdHNbXSAgPSB7IDB4OEIsIDB4ODcsIDB4ODUsIDB4ODMsIDB4ODIsIDB4ODF9OwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgZHJpdmVfcGNpICsgMSwgJnRpbWluZyk7CiAKQEAgLTQzMSw3ICs0NDgsNyBAQAogCiBzdGF0aWMgdm9pZCBzaXNfMTMzX2Vhcmx5X3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCWludCBzcGVlZCA9IGFkZXYtPmRtYV9tb2RlIC0gWEZFUl9NV19ETUFfMDsKIAlpbnQgZHJpdmVfcGNpID0gc2lzX29sZF9wb3J0X2Jhc2UoYWRldik7CiAJdTggdGltaW5nOwpAQCAtNDY0LDMyICs0ODEsMzQgQEAKIAogc3RhdGljIHZvaWQgc2lzXzEzM19zZXRfZG1hbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYJPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCWludCBzcGVlZCA9IGFkZXYtPmRtYV9tb2RlIC0gWEZFUl9NV19ETUFfMDsKLQlpbnQgcG9ydCA9IDB4NDA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCWludCBwb3J0OwogCXUzMiB0MTsKLQl1MzIgcmVnNTQ7CiAKLQkvKiBiaXRzIDQtIGN5Y2xlIHRpbWUgOCAtIGN2cyB0aW1lICovCi0Jc3RhdGljIGNvbnN0IHUzMiB0aW1pbmdfdTEwMFtdID0geyAweDZCMCwgMHg0NzAsIDB4MzUwLCAweDE0MCwgMHgxMjAsIDB4MTEwLCAweDAwMCB9OwotCXN0YXRpYyBjb25zdCB1MzIgdGltaW5nX3UxMzNbXSA9IHsgMHg5RjAsIDB4NkEwLCAweDQ3MCwgMHgyNTAsIDB4MjMwLCAweDIyMCwgMHgyMTAgfTsKLQotCS8qIElmIGJpdCAxNCBpcyBzZXQgdGhlbiB0aGUgcmVnaXN0ZXJzIGFyZSBtYXBwZWQgYXQgMHg3MCBub3QgMHg0MCAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDU0LCAmcmVnNTQpOwotCWlmIChyZWc1NCAmIDB4NDAwMDAwMDApCi0JCXBvcnQgPSAweDcwOwotCXBvcnQgKz0gKDggKiBhcC0+cG9ydF9ubykgKyAgKDQgKiBhZGV2LT5kZXZubyk7Ci0KKwlwb3J0ID0gc2lzX3BvcnRfYmFzZShhZGV2KTsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcG9ydCwgJnQxKTsKIAogCWlmIChhZGV2LT5kbWFfbW9kZSA8IFhGRVJfVURNQV8wKSB7CisJCS8qIFJlY292ZXJ5IDw8IDI0IHwgQWN0IDw8IDE2IHwgSW5pIDw8IDEyLCBsaWtlIFBJTyBtb2RlcyAqLworCQlzdGF0aWMgY29uc3QgdTMyIHRpbWluZ191MTAwW10gPSB7IDB4MTkxNTQwMDAsIDB4MDYwNzIwMDAsIDB4MDQwNjIwMDAgfTsKKwkJc3RhdGljIGNvbnN0IHUzMiB0aW1pbmdfdTEzM1tdID0geyAweDIyMUM2MDAwLCAweDBDMEEzMDAwLCAweDA1MDkzMDAwIH07CisJCWludCBzcGVlZCA9IGFkZXYtPmRtYV9tb2RlIC0gWEZFUl9NV19ETUFfMDsKKworCQl0MSAmPSAweEMwQzAwRkZGOworCQkvKiBkaXNhYmxlIFVETUEgKi8KIAkJdDEgJj0gfjB4MDAwMDAwMDQ7Ci0JCS8qIEZJWE1FOiBuZWVkIGRhdGEgc2hlZXQgdG8gYWRkIE1XRE1BIGhlcmUuIEFsc28gbGFja2luZyBvbgotCQkgICBpZGUvcGNpIGRyaXZlciAqLworCQlpZiAodDEgJiAweDA4KQorCQkJdDEgfD0gdGltaW5nX3UxMzNbc3BlZWRdOworCQllbHNlCisJCQl0MSB8PSB0aW1pbmdfdTEwMFtzcGVlZF07CiAJfSBlbHNlIHsKLQkJc3BlZWQgPSBhZGV2LT5kbWFfbW9kZSAtIFhGRVJfVURNQV8wOwotCQkvKiBpZiAmIDggbm8gVURNQTEzMyAtIG5lZWQgaW5mbyBmb3IgLi4uICovCisJCS8qIGJpdHMgNC0gY3ljbGUgdGltZSA4IC0gY3ZzIHRpbWUgKi8KKwkJc3RhdGljIGNvbnN0IHUzMiB0aW1pbmdfdTEwMFtdID0geyAweDZCMCwgMHg0NzAsIDB4MzUwLCAweDE0MCwgMHgxMjAsIDB4MTEwLCAweDAwMCB9OworCQlzdGF0aWMgY29uc3QgdTMyIHRpbWluZ191MTMzW10gPSB7IDB4OUYwLCAweDZBMCwgMHg0NzAsIDB4MjUwLCAweDIzMCwgMHgyMjAsIDB4MjEwIH07CisJCWludCBzcGVlZCA9IGFkZXYtPmRtYV9tb2RlIC0gWEZFUl9VRE1BXzA7CisKIAkJdDEgJj0gfjB4MDAwMDBGRjA7CisJCS8qIGVuYWJsZSBVRE1BICovCiAJCXQxIHw9IDB4MDAwMDAwMDQ7CiAJCWlmICh0MSAmIDB4MDgpCiAJCQl0MSB8PSB0aW1pbmdfdTEzM1tzcGVlZF07CkBAIC00OTksNiArNTE4LDI3IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBwb3J0LCB0MSk7CiB9CiAKKy8qKgorICoJc2lzXzEzM19tb2RlX2ZpbHRlciAtIG1vZGUgc2VsZWN0aW9uIGZpbHRlcgorICoJQGFkZXY6IEFUQSBkZXZpY2UKKyAqCisgKglCbG9jayBVRE1BNiBvbiBkZXZpY2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgaXQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2lzXzEzM19tb2RlX2ZpbHRlcihzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBhZGV2LT5saW5rLT5hcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJaW50IHBvcnQgPSBzaXNfcG9ydF9iYXNlKGFkZXYpOworCXUzMiB0MTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3J0LCAmdDEpOworCS8qIGlmIEFUQTEzMyBpcyBkaXNhYmxlZCwgbWFzayBpdCBvdXQgKi8KKwlpZiAoISh0MSAmIDB4MDgpKQorCQltYXNrICY9IH4oMHhDMCA8PCBBVEFfU0hJRlRfVURNQSk7CisJcmV0dXJuIG1hc2s7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHNpc19zaHQgPSB7CiAJQVRBX0JNRE1BX1NIVChEUlZfTkFNRSksCiB9OwpAQCAtNTIwLDYgKzU2MCw3IEBACiAJLnNldF9waW9tb2RlCQk9IHNpc18xMzNfc2V0X3Bpb21vZGUsCiAJLnNldF9kbWFtb2RlCQk9IHNpc18xMzNfc2V0X2RtYW1vZGUsCiAJLmNhYmxlX2RldGVjdAkJPSBzaXNfMTMzX2NhYmxlX2RldGVjdCwKKwkubW9kZV9maWx0ZXIJCT0gc2lzXzEzM19tb2RlX2ZpbHRlciwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzaXNfMTMzX2Vhcmx5X29wcyA9IHsKQEAgLTU4OCw3ICs2MjksNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIHNpc19pbmZvMTMzID0gewogCS5mbGFncwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTLAogCS5waW9fbWFzawk9IEFUQV9QSU80LAotCS8qIE5vIE1XRE1BICovCisJLm13ZG1hX21hc2sJPSBBVEFfTVdETUEyLAogCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCiAJLnBvcnRfb3BzCT0gJnNpc18xMzNfb3BzLAogfTsKQEAgLTY2OSw3ICs3MTAsNyBAQAogICoJQHBkZXY6IFBDSSBkZXZpY2UgdG8gcmVnaXN0ZXIKICAqCUBlbnQ6IEVudHJ5IGluIHNpc19wY2lfdGJsIG1hdGNoaW5nIHdpdGggQHBkZXYKICAqCi0gKglDYWxsZWQgZnJvbSBrZXJuZWwgUENJIGxheWVyLiAgV2UgcHJvYmUgZm9yIGNvbWJpbmVkIG1vZGUgKHNpZ2gpLAorICoJQ2FsbGVkIGZyb20ga2VybmVsIFBDSSBsYXllci4gV2UgcHJvYmUgZm9yIGNvbWJpbmVkIG1vZGUgKHNpZ2gpLAogICoJYW5kIHRoZW4gaGFuZCBvdmVyIGNvbnRyb2wgdG8gbGliYXRhLCBmb3IgaXQgdG8gZG8gdGhlIHJlc3QuCiAgKgogICoJTE9DS0lORzoKQEAgLTc2OSwxNyArODEwLDIwIEBACiAKIAkJc3dpdGNoKHRydWVpZCkgewogCQljYXNlIDB4NTUxODoJLyogU0lTIDk2Mi85NjMgKi8KKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJICJTaVMgOTYyLzk2MyBNdVRJT0wgSURFIFVETUExMzMgY29udHJvbGxlclxuIik7CiAJCQljaGlwc2V0ID0gJnNpczEzMzsKIAkJCWlmICgoaWRlbWlzYyAmIDB4NDAwMDAwMDApID09IDApIHsKIAkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTQsIGlkZW1pc2MgfCAweDQwMDAwMDAwKTsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJTSVM1NTEzOiBTd2l0Y2hpbmcgdG8gNTUxMyByZWdpc3RlciBtYXBwaW5nXG4iKTsKKwkJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCQkgIlN3aXRjaGluZyB0byA1NTEzIHJlZ2lzdGVyIG1hcHBpbmdcbiIpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgMHgwMTgwOgkvKiBTSVMgOTY1Lzk2NUwgKi8KLQkJCWNoaXBzZXQgPSAgJnNpczEzMzsKKwkJCWNoaXBzZXQgPSAmc2lzMTMzOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgxMTgwOgkvKiBTSVMgOTY2Lzk2NkwgKi8KLQkJCWNoaXBzZXQgPSAgJnNpczEzMzsKKwkJCWNoaXBzZXQgPSAmc2lzMTMzOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKaW5kZXggYzA2Y2U4Yy4uMjRjZjIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBwYXRhX3NsODJjMTA1LmMgCS0gU0w4MkMxMDUgUEFUQSBmb3IgbmV3IEFUQSBsYXllcgogICoJCQkgIChDKSAyMDA1IFJlZCBIYXQgSW5jCisgKgkJCSAgKEMpIDIwMTEgQmFydGxvbWllaiBab2xuaWVya2lld2ljegogICoKICAqIEJhc2VkIGluIHBhcnQgb24gbGludXgvZHJpdmVycy9pZGUvcGNpL3NsODJjMTA1LmMKICAqIAkJU0w4MkMxMDUvV2luYm9uZCA1NTMgSURFIGRyaXZlcgpAQCAtMjg5LDYgKzI5MCwxNCBAQAogCXJldHVybiBicmlkZ2UtPnJldmlzaW9uOwogfQogCitzdGF0aWMgdm9pZCBzbDgyYzEwNV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgdmFsOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsICZ2YWwpOworCXZhbCB8PSBDVFJMX1AwRU4gfCBDVFJMX1AwRjE2IHwgQ1RSTF9QMUYxNjsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCk7Cit9CiAKIHN0YXRpYyBpbnQgc2w4MmMxMDVfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewpAQCAtMzA2LDcgKzMxNSw2IEBACiAJLyogZm9yIG5vdyB1c2Ugb25seSB0aGUgZmlyc3QgcG9ydCAqLwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm9fZWFybHksCiAJCQkJCSAgICAgICBOVUxMIH07Ci0JdTMyIHZhbDsKIAlpbnQgcmV2OwogCWludCByYzsKIApAQCAtMzI1LDEzICszMzMsMjggQEAKIAllbHNlCiAJCXBwaVswXSA9ICZpbmZvX2RtYTsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NDAsICZ2YWwpOwotCXZhbCB8PSBDVFJMX1AwRU4gfCBDVFJMX1AwRjE2IHwgQ1RSTF9QMUYxNjsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgdmFsKTsKKwlzbDgyYzEwNV9maXh1cChkZXYpOwogCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUoZGV2LCBwcGksICZzbDgyYzEwNV9zaHQsIE5VTEwsIDApOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHNsODJjMTA1X3JlaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWludCByYzsKKworCXJjID0gYXRhX3BjaV9kZXZpY2VfZG9fcmVzdW1lKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc2w4MmMxMDVfZml4dXAocGRldik7CisKKwlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNsODJjMTA1W10gPSB7CiAJeyBQQ0lfVkRFVklDRShXSU5CT05ELCBQQ0lfREVWSUNFX0lEX1dJTkJPTkRfODJDMTA1KSwgfSwKIApAQCAtMzQyLDcgKzM2NSwxMSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBzbDgyYzEwNSwKIAkucHJvYmUgCQk9IHNsODJjMTA1X2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2w4MmMxMDVfcmVpbml0X29uZSwKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2w4MmMxMDVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV92aWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKaW5kZXggOGU5ZjUwNC4uMjU1ZjMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV92aWEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCkBAIC01MDksNiArNTA5LDI3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCB2aWFfZml4dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCB2aWFfaXNhX2JyaWRnZSAqY29uZmlnKQoreworCXUzMiB0aW1pbmc7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBGSUZPIGZvciB0aGUgZW5hYmxlZCBjaGFubmVscy4gKi8KKwl2aWFfY29uZmlnX2ZpZm8ocGRldiwgY29uZmlnLT5mbGFncyk7CisKKwlpZiAoY29uZmlnLT51ZG1hX21hc2sgPT0gQVRBX1VETUE0KSB7CisJCS8qIFRoZSA2NiBNSHogZGV2aWNlcyByZXF1aXJlIHdlIGVuYWJsZSB0aGUgY2xvY2sgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsICZ0aW1pbmcpOworCQl0aW1pbmcgfD0gMHg4MDAwODsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCB0aW1pbmcpOworCX0KKwlpZiAoY29uZmlnLT5mbGFncyAmIFZJQV9CQURfQ0xLNjYpIHsKKwkJLyogRGlzYWJsZSB0aGUgNjZNSHogY2xvY2sgb24gcHJvYmxlbSBkZXZpY2VzICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCAmdGltaW5nKTsKKwkJdGltaW5nICY9IH4weDgwMDA4OworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsIHRpbWluZyk7CisJfQorfQorCiAvKioKICAqCXZpYV9pbml0X29uZQkJLQlkaXNjb3ZlcnkgY2FsbGJhY2sKICAqCUBwZGV2OiBQQ0kgZGV2aWNlCkBAIC01NzAsNyArNTkxLDYgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqaXNhOwogCWNvbnN0IHN0cnVjdCB2aWFfaXNhX2JyaWRnZSAqY29uZmlnOwogCXU4IGVuYWJsZTsKLQl1MzIgdGltaW5nOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJaW50IHJjOwogCkBAIC02MDksOSArNjI5LDYgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCX0KIAotCS8qIEluaXRpYWxpc2UgdGhlIEZJRk8gZm9yIHRoZSBlbmFibGVkIGNoYW5uZWxzLiAqLwotCXZpYV9jb25maWdfZmlmbyhwZGV2LCBjb25maWctPmZsYWdzKTsKLQogCS8qIENsb2NrIHNldCB1cCAqLwogCXN3aXRjaCAoY29uZmlnLT51ZG1hX21hc2spIHsKIAljYXNlIDB4MDA6CkBAIC02MzcsMTIgKzY1NCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogIAl9CiAKLQlpZiAoY29uZmlnLT5mbGFncyAmIFZJQV9CQURfQ0xLNjYpIHsKLQkJLyogRGlzYWJsZSB0aGUgNjZNSHogY2xvY2sgb24gcHJvYmxlbSBkZXZpY2VzICovCi0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCAmdGltaW5nKTsKLQkJdGltaW5nICY9IH4weDgwMDA4OwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsIHRpbWluZyk7Ci0JfQorCXZpYV9maXh1cChwZGV2LCBjb25maWcpOwogCiAJLyogV2UgaGF2ZSBlc3RhYmxpc2hlZCB0aGUgZGV2aWNlIHR5cGUsIG5vdyBmaXJlIGl0IHVwICovCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUocGRldiwgcHBpLCAmdmlhX3NodCwgKHZvaWQgKiljb25maWcsIDApOwpAQCAtNjYxLDI5ICs2NzMsMTQgQEAKIAogc3RhdGljIGludCB2aWFfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQl1MzIgdGltaW5nOwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQljb25zdCBzdHJ1Y3QgdmlhX2lzYV9icmlkZ2UgKmNvbmZpZyA9IGhvc3QtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmM7CiAKIAlyYyA9IGF0YV9wY2lfZGV2aWNlX2RvX3Jlc3VtZShwZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXZpYV9jb25maWdfZmlmbyhwZGV2LCBjb25maWctPmZsYWdzKTsKLQotCWlmIChjb25maWctPnVkbWFfbWFzayA9PSBBVEFfVURNQTQpIHsKLQkJLyogVGhlIDY2IE1IeiBkZXZpY2VzIHJlcXVpcmUgd2UgZW5hYmxlIHRoZSBjbG9jayAqLwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgJnRpbWluZyk7Ci0JCXRpbWluZyB8PSAweDgwMDA4OwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsIHRpbWluZyk7Ci0JfQotCWlmIChjb25maWctPmZsYWdzICYgVklBX0JBRF9DTEs2NikgewotCQkvKiBEaXNhYmxlIHRoZSA2Nk1IeiBjbG9jayBvbiBwcm9ibGVtIGRldmljZXMgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsICZ0aW1pbmcpOwotCQl0aW1pbmcgJj0gfjB4ODAwMDg7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgdGltaW5nKTsKLQl9CisJdmlhX2ZpeHVwKHBkZXYsIGhvc3QtPnByaXZhdGVfZGF0YSk7CiAKIAlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX212LmMgYi9kcml2ZXJzL2F0YS9zYXRhX212LmMKaW5kZXggNGI2YjIwOS4uMGI4YjhiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9tdi5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfbXYuYwpAQCAtNDA4Nyw4ICs0MDg3LDExIEBACiAJZGV2X2luZm8oJnBkZXYtPmRldiwgInNsb3RzICV1IHBvcnRzICVkXG4iLAogCQkgKHVuc2lnbmVkKU1WX01BWF9RX0RFUFRILCBob3N0LT5uX3BvcnRzKTsKIAotCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCBtdl9pbnRlcnJ1cHQsCi0JCQkJIElSUUZfU0hBUkVELCAmbXY2X3NodCk7CisJcmMgPSBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCBtdl9pbnRlcnJ1cHQsCisJCQkgICAgICAgSVJRRl9TSEFSRUQsICZtdjZfc2h0KTsKKwlpZiAoIXJjKQorCQlyZXR1cm4gMDsKKwogZXJyOgogI2lmIGRlZmluZWQoQ09ORklHX0hBVkVfQ0xLKQogCWlmICghSVNfRVJSKGhwcml2LT5jbGspKSB7CkBAIC00MTEwLDggKzQxMTMsNyBAQAogICovCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBtdl9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogI2lmIGRlZmluZWQoQ09ORklHX0hBVkVfQ0xLKQogCXN0cnVjdCBtdl9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwogI2VuZGlmCkBAIC00MTI5LDcgKzQxMzEsNyBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBtdl9wbGF0Zm9ybV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJaWYgKGhvc3QpCiAJCXJldHVybiBhdGFfaG9zdF9zdXNwZW5kKGhvc3QsIHN0YXRlKTsKIAllbHNlCkBAIC00MTM4LDcgKzQxNDAsNyBAQAogCiBzdGF0aWMgaW50IG12X3BsYXRmb3JtX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgcmV0OwogCiAJaWYgKGhvc3QpIHsKQEAgLTQzNTMsNyArNDM1NSw3IEBACiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IG12X3BjaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaW50IHJjOwogCiAJcmMgPSBhdGFfcGNpX2RldmljZV9kb19yZXN1bWUocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKaW5kZXggNTU0NzBmMy4uMWU5MTQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJc3RydWN0IHNpbDI0X2F0YXBpX2Jsb2NrIGF0YXBpOwogfTsKIAotc3RhdGljIHN0cnVjdCBzaWwyNF9jZXJyX2luZm8geworc3RhdGljIGNvbnN0IHN0cnVjdCBzaWwyNF9jZXJyX2luZm8gewogCXVuc2lnbmVkIGludCBlcnJfbWFzaywgYWN0aW9uOwogCWNvbnN0IGNoYXIgKmRlc2M7CiB9IHNpbDI0X2NlcnJfZGJbXSA9IHsKQEAgLTEwMTksNyArMTAxOSw3IEBACiAKIAkvKiBkZWFsIHdpdGggY29tbWFuZCBlcnJvciAqLwogCWlmIChpcnFfc3RhdCAmIFBPUlRfSVJRX0VSUk9SKSB7Ci0JCXN0cnVjdCBzaWwyNF9jZXJyX2luZm8gKmNpID0gTlVMTDsKKwkJY29uc3Qgc3RydWN0IHNpbDI0X2NlcnJfaW5mbyAqY2kgPSBOVUxMOwogCQl1bnNpZ25lZCBpbnQgZXJyX21hc2sgPSAwLCBhY3Rpb24gPSAwOwogCQl1MzIgY29udGV4dCwgY2VycjsKIAkJaW50IHBtcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCmluZGV4IDQ0N2Q5YzAuLjk1ZWM0MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaXMuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiB9OwogCiBNT0RVTEVfQVVUSE9SKCJVd2UgS296aW9sZWsiKTsKLU1PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgU2lsaWNvbiBJbnRlZ3JhdGFkIFN5c3RlbXMgU0FUQSBjb250cm9sbGVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIFNBVEEgY29udHJvbGxlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNpc19wY2lfdGJsKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9iYXNlLmggYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCmluZGV4IGEzNGRjYTAuLjIxYzFiOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9iYXNlLmgKKysrIGIvZHJpdmVycy9iYXNlL2Jhc2UuaApAQCAtMSwzICsxLDQgQEAKKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCiAvKioKICAqIHN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAtIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgY29yZSBwb3J0aW9ucyBvZiB0aGUgYnVzX3R5cGUvY2xhc3Mgc3RydWN0dXJlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jIGIvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jCmluZGV4IGYzNjllMjcuLmJiMDAyNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYworKysgYi9kcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKQEAgLTQsNiArNCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RtYS1tYXBwaW5nLmMgYi9kcml2ZXJzL2Jhc2UvZG1hLW1hcHBpbmcuYwppbmRleCA3NjNkNTljLi42ZjM2NzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZG1hLW1hcHBpbmcuYworKysgYi9kcml2ZXJzL2Jhc2UvZG1hLW1hcHBpbmcuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9oeXBlcnZpc29yLmMgYi9kcml2ZXJzL2Jhc2UvaHlwZXJ2aXNvci5jCmluZGV4IDY0MjhjYmEuLjRmOGI3NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9oeXBlcnZpc29yLmMKKysrIGIvZHJpdmVycy9iYXNlL2h5cGVydmlzb3IuYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImJhc2UuaCIKIAogc3RydWN0IGtvYmplY3QgKmh5cGVydmlzb3Jfa29iajsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9jb21tb24uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9jb21tb24uYwppbmRleCAyOTgyMGMzLi40YWY3YzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvY29tbW9uLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2NvbW1vbi5jCkBAIC04LDcgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9jbG9jay5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9nZW5lcmljX29wcy5jCmluZGV4IDk1MDhkZjcuLjI2NWEwZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9nZW5lcmljX29wcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9nZW5lcmljX29wcy5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwppbmRleCA1OWY4YWIyLi43ZmEwOTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYwppbmRleCA0MzRhNmMwLi45NTcwNmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jCkBAIC02NjksNyArNjY5LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX29wcCAqZGV2X29wcCA9IGZpbmRfZGV2aWNlX29wcChkZXYpOwogCiAJaWYgKElTX0VSUihkZXZfb3BwKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihkZXZfb3BwKSk7IC8qIG1hdGNoaW5nIHR5cGUgKi8KKwkJcmV0dXJuIEVSUl9DQVNUKGRldl9vcHApOyAvKiBtYXRjaGluZyB0eXBlICovCiAKIAlyZXR1cm4gJmRldl9vcHAtPmhlYWQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcW9zLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcW9zLmMKaW5kZXggOTFlMDYxNC4uMzBhOTRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Fvcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9xb3MuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAKIHN0YXRpYyBERUZJTkVfTVVURVgoZGV2X3BtX3Fvc19tdHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKaW5kZXggNmJiM2FhZi4uOGM3ODQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCkBAIC04LDYgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcnBtLmg+CiAjaW5jbHVkZSAicG93ZXIuaCIKQEAgLTI5LDEzICszMCwxMCBAQAogdm9pZCB1cGRhdGVfcG1fcnVudGltZV9hY2NvdW50aW5nKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0JaW50IGRlbHRhOworCXVuc2lnbmVkIGxvbmcgZGVsdGE7CiAKIAlkZWx0YSA9IG5vdyAtIGRldi0+cG93ZXIuYWNjb3VudGluZ190aW1lc3RhbXA7CiAKLQlpZiAoZGVsdGEgPCAwKQotCQlkZWx0YSA9IDA7Ci0KIAlkZXYtPnBvd2VyLmFjY291bnRpbmdfdGltZXN0YW1wID0gbm93OwogCiAJaWYgKGRldi0+cG93ZXIuZGlzYWJsZV9kZXB0aCA+IDApCkBAIC0yOTYsNiArMjk0LDkgQEAKICAqIHRoZSBjYWxsYmFjayB3YXMgcnVubmluZyB0aGVuIGNhcnJ5IGl0IG91dCwgb3RoZXJ3aXNlIHNlbmQgYW4gaWRsZQogICogbm90aWZpY2F0aW9uIGZvciBpdHMgcGFyZW50IChpZiB0aGUgc3VzcGVuZCBzdWNjZWVkZWQgYW5kIGJvdGgKICAqIGlnbm9yZV9jaGlsZHJlbiBvZiBwYXJlbnQtPnBvd2VyIGFuZCBpcnFfc2FmZSBvZiBkZXYtPnBvd2VyIGFyZSBub3Qgc2V0KS4KKyAqIElmIC0+cnVudGltZV9zdXNwZW5kIGZhaWxlZCB3aXRoIC1FQUdBSU4gb3IgLUVCVVNZLCBhbmQgaWYgdGhlIFJQTV9BVVRPCisgKiBmbGFnIGlzIHNldCBhbmQgdGhlIG5leHQgYXV0b3N1c3BlbmQtZGVsYXkgZXhwaXJhdGlvbiB0aW1lIGlzIGluIHRoZQorICogZnV0dXJlLCBzY2hlZHVsZSBhbm90aGVyIGF1dG9zdXNwZW5kIGF0dGVtcHQuCiAgKgogICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB1bmRlciBkZXYtPnBvd2VyLmxvY2sgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgogICovCkBAIC00MTYsMTAgKzQxNywyMSBAQAogCWlmIChyZXR2YWwpIHsKIAkJX191cGRhdGVfcnVudGltZV9zdGF0dXMoZGV2LCBSUE1fQUNUSVZFKTsKIAkJZGV2LT5wb3dlci5kZWZlcnJlZF9yZXN1bWUgPSBmYWxzZTsKLQkJaWYgKHJldHZhbCA9PSAtRUFHQUlOIHx8IHJldHZhbCA9PSAtRUJVU1kpCisJCWlmIChyZXR2YWwgPT0gLUVBR0FJTiB8fCByZXR2YWwgPT0gLUVCVVNZKSB7CiAJCQlkZXYtPnBvd2VyLnJ1bnRpbWVfZXJyb3IgPSAwOwotCQllbHNlCisKKwkJCS8qCisJCQkgKiBJZiB0aGUgY2FsbGJhY2sgcm91dGluZSBmYWlsZWQgYW4gYXV0b3N1c3BlbmQsIGFuZAorCQkJICogaWYgdGhlIGxhc3RfYnVzeSB0aW1lIGhhcyBiZWVuIHVwZGF0ZWQgc28gdGhhdCB0aGVyZQorCQkJICogaXMgYSBuZXcgYXV0b3N1c3BlbmQgZXhwaXJhdGlvbiB0aW1lLCBhdXRvbWF0aWNhbGx5CisJCQkgKiByZXNjaGVkdWxlIGFub3RoZXIgYXV0b3N1c3BlbmQuCisJCQkgKi8KKwkJCWlmICgocnBtZmxhZ3MgJiBSUE1fQVVUTykgJiYKKwkJCSAgICBwbV9ydW50aW1lX2F1dG9zdXNwZW5kX2V4cGlyYXRpb24oZGV2KSAhPSAwKQorCQkJCWdvdG8gcmVwZWF0OworCQl9IGVsc2UgewogCQkJcG1fcnVudGltZV9jYW5jZWxfcGVuZGluZyhkZXYpOworCQl9CiAJCXdha2VfdXBfYWxsKCZkZXYtPnBvd2VyLndhaXRfcXVldWUpOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCmluZGV4IDE3Yjc5MzQuLmFkZjQxYmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYwpAQCAtNCw2ICs0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCmluZGV4IGFmMTBhYmUuLmQ5NGExZjUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcmVzdW1lLXRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAKICNpbmNsdWRlIDxhc20vcnRjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMKaW5kZXggMTRlZTA3ZS4uY2FmOTk1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMKaW5kZXggYWZjZmVmOC4uNjY2ZjZmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2JzZWFyY2guaD4KICNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvdHJhbnNwb3J0X2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvdHJhbnNwb3J0X2NsYXNzLmMKaW5kZXggODQ5OTdlZi4uZjZjNDUzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3RyYW5zcG9ydF9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS90cmFuc3BvcnRfY2xhc3MuYwpAQCAtMjcsNiArMjcsNyBAQAogICogdHJhbnNwb3J0IGNsYXNzIGlzIGZyYW1lZCBlbnRpcmVseSBpbiB0ZXJtcyBvZiBnZW5lcmljIGRldmljZXMgdG8KICAqIGFsbG93IGl0IHRvIGJlIHVzZWQgYnkgYW55IHBoeXNpY2FsIEhCQSBpbiB0aGUgc3lzdGVtLgogICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYXR0cmlidXRlX2NvbnRhaW5lci5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYW5zcG9ydF9jbGFzcy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvY29yZS5jIGIvZHJpdmVycy9iY21hL2NvcmUuYwppbmRleCAxODlhOTdiLi44OTNmNmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvY29yZS5jCisrKyBiL2RyaXZlcnMvYmNtYS9jb3JlLmMKQEAgLTYsNiArNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgImJjbWFfcHJpdmF0ZS5oIgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2JjbWEvYmNtYS5oPgogCiBib29sIGJjbWFfY29yZV9pc19lbmFibGVkKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbi5jIGIvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMKaW5kZXggNDdjY2U5ZC4uZTlmMWIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMKKysrIGIvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMKQEAgLTksNiArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImJjbWFfcHJpdmF0ZS5oIgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2JjbWEvYmNtYS5oPgogCiBzdGF0aWMgaW5saW5lIHUzMiBiY21hX2NjX3dyaXRlMzJfbWFza2VkKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MsIHUxNiBvZmZzZXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb25fcG11LmMgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKaW5kZXggMjk2OGQ4MC4uODAwMTYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uX3BtdS5jCisrKyBiL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbl9wbXUuYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmNtYV9wcml2YXRlLmgiCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CiAKIHN0YXRpYyB1MzIgYmNtYV9jaGlwY29fcGxsX3JlYWQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYywgdTMyIG9mZnNldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpLmMgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX3BjaS5jCmluZGV4IDgxZjNkMGEuLjRmZGU2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpLmMKKysrIGIvZHJpdmVycy9iY21hL2RyaXZlcl9wY2kuYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmNtYV9wcml2YXRlLmgiCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2hvc3RfcGNpLmMgYi9kcml2ZXJzL2JjbWEvaG9zdF9wY2kuYwppbmRleCBhYzRiYzYyLi4xYjUxZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvaG9zdF9wY2kuYworKysgYi9kcml2ZXJzL2JjbWEvaG9zdF9wY2kuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyB2b2lkIGJjbWFfaG9zdF9wY2lfc3dpdGNoX2NvcmUoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL21haW4uYyBiL2RyaXZlcnMvYmNtYS9tYWluLmMKaW5kZXggOGMwOWMzZS4uNzBjODRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL21haW4uYworKysgYi9kcml2ZXJzL2JjbWEvbWFpbi5jCkBAIC02LDYgKzYsNyBAQAogICovCiAKICNpbmNsdWRlICJiY21hX3ByaXZhdGUuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKaW5kZXggNTI4ZjYzMS4uMzIxZGU3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiYW9lLmgiCiAKIHN0YXRpYyBERUZJTkVfTVVURVgoYW9lYmxrX211dGV4KTsKQEAgLTE1OSw3ICsxNjAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogYW9lYmxrX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBza19idWZmX2hlYWQgcXVldWU7CkBAIC0xNzIsMjUgKzE3MywyNSBAQAogCWlmIChiaW8gPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImFvZTogYmlvIGlzIE5VTExcbiIpOwogCQlCVUcoKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAJZCA9IGJpby0+YmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwogCWlmIChkID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGJkX2Rpc2stPnByaXZhdGVfZGF0YSBpcyBOVUxMXG4iKTsKIAkJQlVHKCk7CiAJCWJpb19lbmRpbyhiaW8sIC1FTlhJTyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfSBlbHNlIGlmIChiaW8tPmJpX2lvX3ZlYyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBiaV9pb192ZWMgaXMgTlVMTFxuIik7CiAJCUJVRygpOwogCQliaW9fZW5kaW8oYmlvLCAtRU5YSU8pOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCX0KIAlidWYgPSBtZW1wb29sX2FsbG9jKGQtPmJ1ZnBvb2wsIEdGUF9OT0lPKTsKIAlpZiAoYnVmID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBidWYgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKIAkJYmlvX2VuZGlvKGJpbywgLUVOT01FTSk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CiAJSU5JVF9MSVNUX0hFQUQoJmJ1Zi0+YnVmcyk7CkBAIC0yMTEsNyArMjEyLDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwogCQltZW1wb29sX2ZyZWUoYnVmLCBkLT5idWZwb29sKTsKIAkJYmlvX2VuZGlvKGJpbywgLUVOWElPKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAlsaXN0X2FkZF90YWlsKCZidWYtPmJ1ZnMsICZkLT5idWZxKTsKQEAgLTIyMiw4ICsyMjMsNiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwogCWFvZW5ldF94bWl0KCZxdWV1ZSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjaHIuYwppbmRleCAxNDYyOTZjLi41ZjhlMzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjaHIuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjaHIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImFvZS5oIgogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYnJkLmMgYi9kcml2ZXJzL2Jsb2NrL2JyZC5jCmluZGV4IGRiYTFjMzIuLmQyMjExOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYnJkLmMKKysrIGIvZHJpdmVycy9ibG9jay9icmQuYwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBicmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBicmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGJpby0+YmlfYmRldjsKIAlzdHJ1Y3QgYnJkX2RldmljZSAqYnJkID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwpAQCAtMzU5LDggKzM1OSw2IEBACiAKIG91dDoKIAliaW9fZW5kaW8oYmlvLCBlcnIpOwotCi0JcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9YSVAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwppbmRleCA4ZjRlZjY1Li40ODZmOTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCkBAIC02OCw2ICs2OCwxMCBAQAogbW9kdWxlX3BhcmFtKGNjaXNzX3RhcGVfY21kcywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoY2Npc3NfdGFwZV9jbWRzLAogCSJudW1iZXIgb2YgY29tbWFuZHMgdG8gYWxsb2NhdGUgZm9yIHRhcGUgZGV2aWNlcyAoZGVmYXVsdDogNikiKTsKK3N0YXRpYyBpbnQgY2Npc3Nfc2ltcGxlX21vZGU7Cittb2R1bGVfcGFyYW0oY2Npc3Nfc2ltcGxlX21vZGUsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoY2Npc3Nfc2ltcGxlX21vZGUsCisJIlVzZSAnc2ltcGxlIG1vZGUnIHJhdGhlciB0aGFuICdwZXJmb3JtYW50IG1vZGUnIik7CiAKIHN0YXRpYyBERUZJTkVfTVVURVgoY2Npc3NfbXV0ZXgpOwogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19jY2lzczsKQEAgLTE3Niw2ICsxODAsNyBAQAogCQkJdW5zaWduZWQgaW50IGJsb2NrX3NpemUsIElucXVpcnlEYXRhX3N0cnVjdCAqaW5xX2J1ZmYsCiAJCQkJICAgZHJpdmVfaW5mb19zdHJ1Y3QgKmRydik7CiBzdGF0aWMgdm9pZCBfX2RldmluaXQgY2Npc3NfaW50ZXJydXB0X21vZGUoY3Rscl9pbmZvX3QgKik7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBjY2lzc19lbnRlcl9zaW1wbGVfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoKTsKIHN0YXRpYyB2b2lkIHN0YXJ0X2lvKGN0bHJfaW5mb190ICpoKTsKIHN0YXRpYyBpbnQgc2VuZGNtZF93aXRoaXJxKGN0bHJfaW5mb190ICpoLCBfX3U4IGNtZCwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsCiAJCQlfX3U4IHBhZ2VfY29kZSwgdW5zaWduZWQgY2hhciBzY3NpM2FkZHJbXSwKQEAgLTM4OCw3ICszOTMsNyBAQAogCQloLT5wcm9kdWN0X25hbWUsCiAJCSh1bnNpZ25lZCBsb25nKWgtPmJvYXJkX2lkLAogCQloLT5maXJtX3ZlclswXSwgaC0+ZmlybV92ZXJbMV0sIGgtPmZpcm1fdmVyWzJdLAotCQloLT5maXJtX3ZlclszXSwgKHVuc2lnbmVkIGludCloLT5pbnRyW1BFUkZfTU9ERV9JTlRdLAorCQloLT5maXJtX3ZlclszXSwgKHVuc2lnbmVkIGludCloLT5pbnRyW2gtPmludHJfbW9kZV0sCiAJCWgtPm51bV9sdW5zLAogCQloLT5RZGVwdGgsIGgtPmNvbW1hbmRzX291dHN0YW5kaW5nLAogCQloLT5tYXhRc2luY2Vpbml0LCBoLT5tYXhfb3V0c3RhbmRpbmcsIGgtPm1heFNHKTsKQEAgLTYzNiw2ICs2NDEsMTggQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihyZXNjYW4sIFNfSVdVU1IsIE5VTEwsIGhvc3Rfc3RvcmVfcmVzY2FuKTsKIAorc3RhdGljIHNzaXplX3QgaG9zdF9zaG93X3RyYW5zcG9ydF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY3Rscl9pbmZvICpoID0gdG9faGJhKGRldik7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiVzXG4iLAorCQloLT50cmFuc01ldGhvZCAmIENGR1RCTF9UcmFuc19QZXJmb3JtYW50ID8KKwkJCSJwZXJmb3JtYW50IiA6ICJzaW1wbGUiKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih0cmFuc3BvcnRfbW9kZSwgU19JUlVHTywgaG9zdF9zaG93X3RyYW5zcG9ydF9tb2RlLCBOVUxMKTsKKwogc3RhdGljIHNzaXplX3QgZGV2X3Nob3dfdW5pcXVlX2lkKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJIGNoYXIgKmJ1ZikKQEAgLTgwOCw2ICs4MjUsNyBAQAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNjaXNzX2hvc3RfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfcmVzY2FuLmF0dHIsCiAJJmRldl9hdHRyX3Jlc2V0dGFibGUuYXR0ciwKKwkmZGV2X2F0dHJfdHJhbnNwb3J0X21vZGUuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0zOTg0LDYgKzQwMDIsOSBAQAogewogCV9fdTMyIHRyYW5zX3N1cHBvcnQ7CiAKKwlpZiAoY2Npc3Nfc2ltcGxlX21vZGUpCisJCXJldHVybjsKKwogCWRldl9kYmcoJmgtPnBkZXYtPmRldiwgIlRyeWluZyB0byBwdXQgYm9hcmQgaW50byBQZXJmb3JtYW50IG1vZGVcbiIpOwogCS8qIEF0dGVtcHQgdG8gcHV0IGNvbnRyb2xsZXIgaW50byBwZXJmb3JtYW50IG1vZGUgaWYgc3VwcG9ydGVkICovCiAJLyogRG9lcyBib2FyZCBzdXBwb3J0IHBlcmZvcm1hbnQgbW9kZT8gKi8KQEAgLTQwODEsNyArNDEwMiw3IEBACiBkZWZhdWx0X2ludF9tb2RlOgogI2VuZGlmCQkJCS8qIENPTkZJR19QQ0lfTVNJICovCiAJLyogaWYgd2UgZ2V0IGhlcmUgd2UncmUgZ29pbmcgdG8gdXNlIHRoZSBkZWZhdWx0IGludGVycnVwdCBtb2RlICovCi0JaC0+aW50cltQRVJGX01PREVfSU5UXSA9IGgtPnBkZXYtPmlycTsKKwloLT5pbnRyW2gtPmludHJfbW9kZV0gPSBoLT5wZGV2LT5pcnE7CiAJcmV0dXJuOwogfQogCkBAIC00MzQxLDYgKzQzNjIsOSBAQAogCX0KIAljY2lzc19lbmFibGVfc2NzaV9wcmVmZXRjaChoKTsKIAljY2lzc19wNjAwX2RtYV9wcmVmZXRjaF9xdWlyayhoKTsKKwllcnIgPSBjY2lzc19lbnRlcl9zaW1wbGVfbW9kZShoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJY2Npc3NfcHV0X2NvbnRyb2xsZXJfaW50b19wZXJmb3JtYW50X21vZGUoaCk7CiAJcmV0dXJuIDA7CiAKQEAgLTQ1MzMsNiArNDU1NywxMyBAQAogCQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKIAkJcG1jc3IgfD0gUENJX0QwOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BNX0NUUkwsIHBtY3NyKTsKKworCQkvKgorCQkgKiBUaGUgUDYwMCByZXF1aXJlcyBhIHNtYWxsIGRlbGF5IHdoZW4gY2hhbmdpbmcgc3RhdGVzLgorCQkgKiBPdGhlcndpc2Ugd2UgbWF5IHRoaW5rIHRoZSBib2FyZCBkaWQgbm90IHJlc2V0IGFuZCB3ZSBiYWlsLgorCQkgKiBUaGlzIGZvciBrZHVtcCBvbmx5IGFuZCBpcyBwYXJ0aWN1bGFyIHRvIHRoZSBQNjAwLgorCQkgKi8KKwkJbXNsZWVwKDUwMCk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNDg0MywyMCArNDg3NCwyMCBAQAogCWlycXJldHVybl90ICgqaW50eGhhbmRsZXIpKGludCwgdm9pZCAqKSkKIHsKIAlpZiAoaC0+bXNpeF92ZWN0b3IgfHwgaC0+bXNpX3ZlY3RvcikgewotCQlpZiAoIXJlcXVlc3RfaXJxKGgtPmludHJbUEVSRl9NT0RFX0lOVF0sIG1zaXhoYW5kbGVyLAorCQlpZiAoIXJlcXVlc3RfaXJxKGgtPmludHJbaC0+aW50cl9tb2RlXSwgbXNpeGhhbmRsZXIsCiAJCQkJSVJRRl9ESVNBQkxFRCwgaC0+ZGV2bmFtZSwgaCkpCiAJCQlyZXR1cm4gMDsKIAkJZGV2X2VycigmaC0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBtc2kgaXJxICVkIgotCQkJIiBmb3IgJXNcbiIsIGgtPmludHJbUEVSRl9NT0RFX0lOVF0sCisJCQkiIGZvciAlc1xuIiwgaC0+aW50cltoLT5pbnRyX21vZGVdLAogCQkJaC0+ZGV2bmFtZSk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlpZiAoIXJlcXVlc3RfaXJxKGgtPmludHJbUEVSRl9NT0RFX0lOVF0sIGludHhoYW5kbGVyLAorCWlmICghcmVxdWVzdF9pcnEoaC0+aW50cltoLT5pbnRyX21vZGVdLCBpbnR4aGFuZGxlciwKIAkJCUlSUUZfRElTQUJMRUQsIGgtPmRldm5hbWUsIGgpKQogCQlyZXR1cm4gMDsKIAlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IGlycSAlZCBmb3IgJXNcbiIsCi0JCWgtPmludHJbUEVSRl9NT0RFX0lOVF0sIGgtPmRldm5hbWUpOworCQloLT5pbnRyW2gtPmludHJfbW9kZV0sIGgtPmRldm5hbWUpOwogCXJldHVybiAtMTsKIH0KIApAQCAtNDg4Nyw3ICs0OTE4LDcgQEAKIHsKIAlpbnQgY3RsciA9IGgtPmN0bHI7CiAKLQlmcmVlX2lycShoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBoKTsKKwlmcmVlX2lycShoLT5pbnRyW2gtPmludHJfbW9kZV0sIGgpOwogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAJaWYgKGgtPm1zaXhfdmVjdG9yKQogCQlwY2lfZGlzYWJsZV9tc2l4KGgtPnBkZXYpOwpAQCAtNDk1Myw2ICs0OTg0LDcgQEAKIAloID0gaGJhW2ldOwogCWgtPnBkZXYgPSBwZGV2OwogCWgtPmJ1c3lfaW5pdGlhbGl6aW5nID0gMTsKKwloLT5pbnRyX21vZGUgPSBjY2lzc19zaW1wbGVfbW9kZSA/IFNJTVBMRV9NT0RFX0lOVCA6IFBFUkZfTU9ERV9JTlQ7CiAJSU5JVF9MSVNUX0hFQUQoJmgtPmNtcFEpOwogCUlOSVRfTElTVF9IRUFEKCZoLT5yZXFRKTsKIAltdXRleF9pbml0KCZoLT5idXN5X3NodXR0aW5nX2Rvd24pOwpAQCAtNTAwOSw3ICs1MDQxLDcgQEAKIAogCWRldl9pbmZvKCZoLT5wZGV2LT5kZXYsICIlczogPDB4JXg+IGF0IFBDSSAlcyBJUlEgJWQlcyB1c2luZyBEQUNcbiIsCiAJICAgICAgIGgtPmRldm5hbWUsIHBkZXYtPmRldmljZSwgcGNpX25hbWUocGRldiksCi0JICAgICAgIGgtPmludHJbUEVSRl9NT0RFX0lOVF0sIGRhYyA/ICIiIDogIiBub3QiKTsKKwkgICAgICAgaC0+aW50cltoLT5pbnRyX21vZGVdLCBkYWMgPyAiIiA6ICIgbm90Iik7CiAKIAlpZiAoY2Npc3NfYWxsb2NhdGVfY21kX3Bvb2woaCkpCiAJCWdvdG8gY2xlYW40OwpAQCAtNTA1Niw3ICs1MDg4LDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKIAkJaC0+YWNjZXNzLnNldF9pbnRyX21hc2soaCwgQ0NJU1NfSU5UUl9PRkYpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7Ci0JCWZyZWVfaXJxKGgtPmludHJbUEVSRl9NT0RFX0lOVF0sIGgpOworCQlmcmVlX2lycShoLT5pbnRyW2gtPmludHJfbW9kZV0sIGgpOwogCQlyYyA9IGNjaXNzX3JlcXVlc3RfaXJxKGgsIGNjaXNzX21zaXhfZGlzY2FyZF9jb21wbGV0aW9ucywKIAkJCQkJY2Npc3NfaW50eF9kaXNjYXJkX2NvbXBsZXRpb25zKTsKIAkJaWYgKHJjKSB7CkBAIC01MTMzLDcgKzUxNjUsNyBAQAogCWNjaXNzX2ZyZWVfY21kX3Bvb2woaCk7CiAJY2Npc3NfZnJlZV9zY2F0dGVybGlzdHMoaCk7CiAJY2Npc3NfZnJlZV9zZ19jaGFpbl9ibG9ja3MoaC0+Y21kX3NnX2xpc3QsIGgtPm5yX2NtZHMpOwotCWZyZWVfaXJxKGgtPmludHJbUEVSRl9NT0RFX0lOVF0sIGgpOworCWZyZWVfaXJxKGgtPmludHJbaC0+aW50cl9tb2RlXSwgaCk7CiBjbGVhbjI6CiAJdW5yZWdpc3Rlcl9ibGtkZXYoaC0+bWFqb3IsIGgtPmRldm5hbWUpOwogY2xlYW4xOgpAQCAtNTE3Miw5ICs1MjA0LDMxIEBACiAJaWYgKHJldHVybl9jb2RlICE9IElPX09LKQogCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiRXJyb3IgZmx1c2hpbmcgY2FjaGVcbiIpOwogCWgtPmFjY2Vzcy5zZXRfaW50cl9tYXNrKGgsIENDSVNTX0lOVFJfT0ZGKTsKLQlmcmVlX2lycShoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBoKTsKKwlmcmVlX2lycShoLT5pbnRyW2gtPmludHJfbW9kZV0sIGgpOwogfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjY2lzc19lbnRlcl9zaW1wbGVfbW9kZShzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCXUzMiB0cmFuc19zdXBwb3J0OworCisJdHJhbnNfc3VwcG9ydCA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPlRyYW5zcG9ydFN1cHBvcnQpKTsKKwlpZiAoISh0cmFuc19zdXBwb3J0ICYgU0lNUExFX01PREUpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaC0+bWF4X2NvbW1hbmRzID0gcmVhZGwoJihoLT5jZmd0YWJsZS0+Q21kc091dE1heCkpOworCXdyaXRlbChDRkdUQkxfVHJhbnNfU2ltcGxlLCAmKGgtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuVHJhbnNwb3J0UmVxdWVzdCkpOworCXdyaXRlbChDRkdUQkxfQ2hhbmdlUmVxLCBoLT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJY2Npc3Nfd2FpdF9mb3JfbW9kZV9jaGFuZ2VfYWNrKGgpOworCXByaW50X2NmZ190YWJsZShoKTsKKwlpZiAoIShyZWFkbCgmKGgtPmNmZ3RhYmxlLT5UcmFuc3BvcnRBY3RpdmUpKSAmIENGR1RCTF9UcmFuc19TaW1wbGUpKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IGJvYXJkIGludG8gc2ltcGxlIG1vZGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaC0+dHJhbnNNZXRob2QgPSBDRkdUQkxfVHJhbnNfU2ltcGxlOworCXJldHVybiAwOworfQorCisKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjY2lzc19yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCWN0bHJfaW5mb190ICpoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzcy5oIGIvZHJpdmVycy9ibG9jay9jY2lzcy5oCmluZGV4IGMwNDk1NDguLjdmZGEzMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3MuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKQEAgLTkyLDYgKzkyLDcgQEAKIAl1bnNpZ25lZCBpbnQgaW50cls0XTsKIAl1bnNpZ25lZCBpbnQgbXNpeF92ZWN0b3I7CiAJdW5zaWduZWQgaW50IG1zaV92ZWN0b3I7CisJaW50CWludHJfbW9kZTsKIAlpbnQgCWNjaXNzX21heF9zZWN0b3JzOwogCUJZVEUJY2Npc3NfcmVhZDsKIAlCWVRFCWNjaXNzX3dyaXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jIGIvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCmluZGV4IGIyZmNlYjUuLjkxMjViYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKQEAgLTYyMCw2ICs2MjAsNyBAQAogCX0KIAl2ZW5kb3JfaWQgPSBwZGV2LT52ZW5kb3I7CiAJZGV2aWNlX2lkID0gcGRldi0+ZGV2aWNlOworCXJldmlzaW9uICA9IHBkZXYtPnJldmlzaW9uOwogCWlycSA9IHBkZXYtPmlycTsKIAogCWZvcihpPTA7IGk8NjsgaSsrKQpAQCAtNjMyLDcgKzYzMyw2IEBACiAJfQogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZyZXZpc2lvbik7CiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmNhY2hlX2xpbmVfc2l6ZSk7CiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZsYXRlbmN5X3RpbWVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfaW50LmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAppbmRleCAxNzA2ZDYwLi45Y2YyMDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaApAQCAtMTUwNiw3ICsxNTA2LDcgQEAKIGV4dGVybiBpbnQgcHJvY19kZXRhaWxzOwogCiAvKiBkcmJkX3JlcSAqLwotZXh0ZXJuIGludCBkcmJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKK2V4dGVybiB2b2lkIGRyYmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOwogZXh0ZXJuIGludCBkcmJkX3JlYWRfcmVtb3RlKHN0cnVjdCBkcmJkX2NvbmYgKm1kZXYsIHN0cnVjdCBkcmJkX3JlcXVlc3QgKnJlcSk7CiBleHRlcm4gaW50IGRyYmRfbWVyZ2VfYnZlYyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJ2ZWNfbWVyZ2VfZGF0YSAqYnZtLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyk7CiBleHRlcm4gaW50IGlzX3ZhbGlkX2FyX2hhbmRsZShzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICosIHNlY3Rvcl90KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlcS5jIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKaW5kZXggMzQyNGQ2Ny4uNGEwZjMxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfcmVxLmMKQEAgLTEwNzMsNyArMTA3Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkcmJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQordm9pZCBkcmJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXVuc2lnbmVkIGludCBzX2VuciwgZV9lbnI7CiAJc3RydWN0IGRyYmRfY29uZiAqbWRldiA9IChzdHJ1Y3QgZHJiZF9jb25mICopIHEtPnF1ZXVlZGF0YTsKQEAgLTEwODEsNyArMTA4MSw3IEBACiAKIAlpZiAoZHJiZF9mYWlsX3JlcXVlc3RfZWFybHkobWRldiwgYmlvX2RhdGFfZGlyKGJpbykgJiBXUklURSkpIHsKIAkJYmlvX2VuZGlvKGJpbywgLUVQRVJNKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAlzdGFydF90aW1lID0gamlmZmllczsKQEAgLTExMDAsNyArMTEwMCw4IEBACiAKIAlpZiAobGlrZWx5KHNfZW5yID09IGVfZW5yKSkgewogCQlpbmNfYXBfYmlvKG1kZXYsIDEpOwotCQlyZXR1cm4gZHJiZF9tYWtlX3JlcXVlc3RfY29tbW9uKG1kZXYsIGJpbywgc3RhcnRfdGltZSk7CisJCWRyYmRfbWFrZV9yZXF1ZXN0X2NvbW1vbihtZGV2LCBiaW8sIHN0YXJ0X3RpbWUpOworCQlyZXR1cm47CiAJfQogCiAJLyogY2FuIHRoaXMgYmlvIGJlIHNwbGl0IGdlbmVyaWNhbGx5PwpAQCAtMTE0OCw3ICsxMTQ5LDYgQEAKIAogCQliaW9fcGFpcl9yZWxlYXNlKGJwKTsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIC8qIFRoaXMgaXMgY2FsbGVkIGJ5IGJpb19hZGRfcGFnZSgpLiAgV2l0aCB0aGlzIGZ1bmN0aW9uIHdlIHJlZHVjZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9sb29wLmMgYi9kcml2ZXJzL2Jsb2NrL2xvb3AuYwppbmRleCA0NzIwYzdhLi4zZDgwNjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2xvb3AuYwpAQCAtNzYsNiArNzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NwbGljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZhbGxvYy5oPgorCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogc3RhdGljIERFRklORV9JRFIobG9vcF9pbmRleF9pZHIpOwpAQCAtMjAzLDc0ICsyMDUsNiBAQAogfQogCiAvKioKLSAqIGRvX2xvX3NlbmRfYW9wcyAtIGhlbHBlciBmb3Igd3JpdGluZyBkYXRhIHRvIGEgbG9vcCBkZXZpY2UKLSAqCi0gKiBUaGlzIGlzIHRoZSBmYXN0IHZlcnNpb24gZm9yIGJhY2tpbmcgZmlsZXN5c3RlbXMgd2hpY2ggaW1wbGVtZW50IHRoZSBhZGRyZXNzCi0gKiBzcGFjZSBvcGVyYXRpb25zIHdyaXRlX2JlZ2luIGFuZCB3cml0ZV9lbmQuCi0gKi8KLXN0YXRpYyBpbnQgZG9fbG9fc2VuZF9hb3BzKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBiaW9fdmVjICpidmVjLAotCQlsb2ZmX3QgcG9zLCBzdHJ1Y3QgcGFnZSAqdW51c2VkKQotewotCXN0cnVjdCBmaWxlICpmaWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsgLyoga3Vkb3MgdG8gTkZzY2tpbmdTICovCi0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7Ci0JcGdvZmZfdCBpbmRleDsKLQl1bnNpZ25lZCBvZmZzZXQsIGJ2X29mZnM7Ci0JaW50IGxlbiwgcmV0OwotCi0JbXV0ZXhfbG9jaygmbWFwcGluZy0+aG9zdC0+aV9tdXRleCk7Ci0JaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlvZmZzZXQgPSBwb3MgJiAoKHBnb2ZmX3QpUEFHRV9DQUNIRV9TSVpFIC0gMSk7Ci0JYnZfb2ZmcyA9IGJ2ZWMtPmJ2X29mZnNldDsKLQlsZW4gPSBidmVjLT5idl9sZW47Ci0Jd2hpbGUgKGxlbiA+IDApIHsKLQkJc2VjdG9yX3QgSVY7Ci0JCXVuc2lnbmVkIHNpemUsIGNvcGllZDsKLQkJaW50IHRyYW5zZmVyX3Jlc3VsdDsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXZvaWQgKmZzZGF0YTsKLQotCQlJViA9ICgoc2VjdG9yX3QpaW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSA5KSkrKG9mZnNldCA+PiA5KTsKLQkJc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKLQkJaWYgKHNpemUgPiBsZW4pCi0JCQlzaXplID0gbGVuOwotCi0JCXJldCA9IHBhZ2VjYWNoZV93cml0ZV9iZWdpbihmaWxlLCBtYXBwaW5nLCBwb3MsIHNpemUsIDAsCi0JCQkJCQkJJnBhZ2UsICZmc2RhdGEpOwotCQlpZiAocmV0KQotCQkJZ290byBmYWlsOwotCi0JCWZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7Ci0KLQkJdHJhbnNmZXJfcmVzdWx0ID0gbG9fZG9fdHJhbnNmZXIobG8sIFdSSVRFLCBwYWdlLCBvZmZzZXQsCi0JCQkJYnZlYy0+YnZfcGFnZSwgYnZfb2Zmcywgc2l6ZSwgSVYpOwotCQljb3BpZWQgPSBzaXplOwotCQlpZiAodW5saWtlbHkodHJhbnNmZXJfcmVzdWx0KSkKLQkJCWNvcGllZCA9IDA7Ci0KLQkJcmV0ID0gcGFnZWNhY2hlX3dyaXRlX2VuZChmaWxlLCBtYXBwaW5nLCBwb3MsIHNpemUsIGNvcGllZCwKLQkJCQkJCQlwYWdlLCBmc2RhdGEpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gY29waWVkKQotCQkJZ290byBmYWlsOwotCi0JCWlmICh1bmxpa2VseSh0cmFuc2Zlcl9yZXN1bHQpKQotCQkJZ290byBmYWlsOwotCi0JCWJ2X29mZnMgKz0gY29waWVkOwotCQlsZW4gLT0gY29waWVkOwotCQlvZmZzZXQgPSAwOwotCQlpbmRleCsrOwotCQlwb3MgKz0gY29waWVkOwotCX0KLQlyZXQgPSAwOwotb3V0OgotCW11dGV4X3VubG9jaygmbWFwcGluZy0+aG9zdC0+aV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLWZhaWw6Ci0JcmV0ID0gLTE7Ci0JZ290byBvdXQ7Ci19Ci0KLS8qKgogICogX19kb19sb19zZW5kX3dyaXRlIC0gaGVscGVyIGZvciB3cml0aW5nIGRhdGEgdG8gYSBsb29wIGRldmljZQogICoKICAqIFRoaXMgaGVscGVyIGp1c3QgZmFjdG9ycyBvdXQgY29tbW9uIGNvZGUgYmV0d2VlbiBkb19sb19zZW5kX2RpcmVjdF93cml0ZSgpCkBAIC0yOTcsMTAgKzIzMSw4IEBACiAvKioKICAqIGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlIC0gaGVscGVyIGZvciB3cml0aW5nIGRhdGEgdG8gYSBsb29wIGRldmljZQogICoKLSAqIFRoaXMgaXMgdGhlIGZhc3QsIG5vbi10cmFuc2Zvcm1pbmcgdmVyc2lvbiBmb3IgYmFja2luZyBmaWxlc3lzdGVtcyB3aGljaCBkbwotICogbm90IGltcGxlbWVudCB0aGUgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIHdyaXRlX2JlZ2luIGFuZCB3cml0ZV9lbmQuCi0gKiBJdCB1c2VzIHRoZSB3cml0ZSBmaWxlIG9wZXJhdGlvbiB3aGljaCBzaG91bGQgYmUgcHJlc2VudCBvbiBhbGwgd3JpdGVhYmxlCi0gKiBmaWxlc3lzdGVtcy4KKyAqIFRoaXMgaXMgdGhlIGZhc3QsIG5vbi10cmFuc2Zvcm1pbmcgdmVyc2lvbiB0aGF0IGRvZXMgbm90IG5lZWQgZG91YmxlCisgKiBidWZmZXJpbmcuCiAgKi8KIHN0YXRpYyBpbnQgZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywKIAkJc3RydWN0IGJpb192ZWMgKmJ2ZWMsIGxvZmZfdCBwb3MsIHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtMzE2LDE1ICsyNDgsOSBAQAogLyoqCiAgKiBkb19sb19zZW5kX3dyaXRlIC0gaGVscGVyIGZvciB3cml0aW5nIGRhdGEgdG8gYSBsb29wIGRldmljZQogICoKLSAqIFRoaXMgaXMgdGhlIHNsb3csIHRyYW5zZm9ybWluZyB2ZXJzaW9uIGZvciBmaWxlc3lzdGVtcyB3aGljaCBkbyBub3QKLSAqIGltcGxlbWVudCB0aGUgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIHdyaXRlX2JlZ2luIGFuZCB3cml0ZV9lbmQuICBJdAotICogdXNlcyB0aGUgd3JpdGUgZmlsZSBvcGVyYXRpb24gd2hpY2ggc2hvdWxkIGJlIHByZXNlbnQgb24gYWxsIHdyaXRlYWJsZQotICogZmlsZXN5c3RlbXMuCi0gKgotICogVXNpbmcgZm9wcy0+d3JpdGUgaXMgc2xvd2VyIHRoYW4gdXNpbmcgYW9wcy0+e3ByZXBhcmUsY29tbWl0fV93cml0ZSBpbiB0aGUKLSAqIHRyYW5zZm9ybWluZyBjYXNlIGJlY2F1c2Ugd2UgbmVlZCB0byBkb3VibGUgYnVmZmVyIHRoZSBkYXRhIGFzIHdlIGNhbm5vdCBkbwotICogdGhlIHRyYW5zZm9ybWF0aW9ucyBpbiBwbGFjZSBhcyB3ZSBkbyBub3QgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZQotICogZGVzdGluYXRpb24gcGFnZXMgb2YgdGhlIGJhY2tpbmcgZmlsZS4KKyAqIFRoaXMgaXMgdGhlIHNsb3csIHRyYW5zZm9ybWluZyB2ZXJzaW9uIHRoYXQgbmVlZHMgdG8gZG91YmxlIGJ1ZmZlciB0aGUKKyAqIGRhdGEgYXMgaXQgY2Fubm90IGRvIHRoZSB0cmFuc2Zvcm1hdGlvbnMgaW4gcGxhY2Ugd2l0aG91dCBoYXZpbmcgZGlyZWN0CisgKiBhY2Nlc3MgdG8gdGhlIGRlc3RpbmF0aW9uIHBhZ2VzIG9mIHRoZSBiYWNraW5nIGZpbGUuCiAgKi8KIHN0YXRpYyBpbnQgZG9fbG9fc2VuZF93cml0ZShzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywKIAkJbG9mZl90IHBvcywgc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0zNTAsMTcgKzI3NiwxNiBAQAogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCWRvX2xvX3NlbmQgPSBkb19sb19zZW5kX2FvcHM7Ci0JaWYgKCEobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfVVNFX0FPUFMpKSB7CisJaWYgKGxvLT50cmFuc2ZlciAhPSB0cmFuc2Zlcl9ub25lKSB7CisJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9OT0lPIHwgX19HRlBfSElHSE1FTSk7CisJCWlmICh1bmxpa2VseSghcGFnZSkpCisJCQlnb3RvIGZhaWw7CisJCWttYXAocGFnZSk7CisJCWRvX2xvX3NlbmQgPSBkb19sb19zZW5kX3dyaXRlOworCX0gZWxzZSB7CiAJCWRvX2xvX3NlbmQgPSBkb19sb19zZW5kX2RpcmVjdF93cml0ZTsKLQkJaWYgKGxvLT50cmFuc2ZlciAhPSB0cmFuc2Zlcl9ub25lKSB7Ci0JCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9JTyB8IF9fR0ZQX0hJR0hNRU0pOwotCQkJaWYgKHVubGlrZWx5KCFwYWdlKSkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlrbWFwKHBhZ2UpOwotCQkJZG9fbG9fc2VuZCA9IGRvX2xvX3NlbmRfd3JpdGU7Ci0JCX0KIAl9CisKIAliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKIAkJcmV0ID0gZG9fbG9fc2VuZChsbywgYnZlYywgcG9zLCBwYWdlKTsKIAkJaWYgKHJldCA8IDApCkBAIC00ODQsNiArNDA5LDI5IEBACiAJCQl9CiAJCX0KIAorCQkvKgorCQkgKiBXZSB1c2UgcHVuY2ggaG9sZSB0byByZWNsYWltIHRoZSBmcmVlIHNwYWNlIHVzZWQgYnkgdGhlCisJCSAqIGltYWdlIGEuay5hLiBkaXNjYXJkLiBIb3dldmVyIHdlIGRvIHN1cHBvcnQgZGlzY2FyZCBpZgorCQkgKiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIGJlY2F1c2UgaXQgbWF5IGdpdmUgYW4gYXR0YWNrZXIKKwkJICogdXNlZnVsIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJaWYgKGJpby0+YmlfcncgJiBSRVFfRElTQ0FSRCkgeworCQkJc3RydWN0IGZpbGUgKmZpbGUgPSBsby0+bG9fYmFja2luZ19maWxlOworCQkJaW50IG1vZGUgPSBGQUxMT0NfRkxfUFVOQ0hfSE9MRSB8IEZBTExPQ19GTF9LRUVQX1NJWkU7CisKKwkJCWlmICgoIWZpbGUtPmZfb3AtPmZhbGxvY2F0ZSkgfHwKKwkJCSAgICBsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSkgeworCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmV0ID0gZmlsZS0+Zl9vcC0+ZmFsbG9jYXRlKGZpbGUsIG1vZGUsIHBvcywKKwkJCQkJCSAgICBiaW8tPmJpX3NpemUpOworCQkJaWYgKHVubGlrZWx5KHJldCAmJiByZXQgIT0gLUVJTlZBTCAmJgorCQkJCSAgICAgcmV0ICE9IC1FT1BOT1RTVVBQKSkKKwkJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwogCQlyZXQgPSBsb19zZW5kKGxvLCBiaW8sIHBvcyk7CiAKIAkJaWYgKChiaW8tPmJpX3J3ICYgUkVRX0ZVQSkgJiYgIXJldCkgewpAQCAtNTE0LDcgKzQ2Miw3IEBACiAJcmV0dXJuIGJpb19saXN0X3BvcCgmbG8tPmxvX2Jpb19saXN0KTsKIH0KIAotc3RhdGljIGludCBsb29wX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqb2xkX2JpbykKK3N0YXRpYyB2b2lkIGxvb3BfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpvbGRfYmlvKQogewogCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBxLT5xdWV1ZWRhdGE7CiAJaW50IHJ3ID0gYmlvX3J3KG9sZF9iaW8pOwpAQCAtNTMyLDEyICs0ODAsMTEgQEAKIAlsb29wX2FkZF9iaW8obG8sIG9sZF9iaW8pOwogCXdha2VfdXAoJmxvLT5sb19ldmVudCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZsby0+bG9fbG9jayk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuOwogCiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxKCZsby0+bG9fbG9jayk7CiAJYmlvX2lvX2Vycm9yKG9sZF9iaW8pOwotCXJldHVybiAwOwogfQogCiBzdHJ1Y3Qgc3dpdGNoX3JlcXVlc3QgewpAQCAtNzAwLDcgKzY0Nyw3IEBACiAJCWdvdG8gb3V0X3B1dGY7CiAKIAlmcHV0KG9sZF9maWxlKTsKLQlpZiAobWF4X3BhcnQgPiAwKQorCWlmIChsby0+bG9fZmxhZ3MgJiBMT19GTEFHU19QQVJUU0NBTikKIAkJaW9jdGxfYnlfYmRldihiZGV2LCBCTEtSUlBBUlQsIDApOwogCXJldHVybiAwOwogCkBAIC03NzcsMTYgKzcyNCwyNSBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBhdXRvY2xlYXIgPyAiMSIgOiAiMCIpOwogfQogCitzdGF0aWMgc3NpemVfdCBsb29wX2F0dHJfcGFydHNjYW5fc2hvdyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBjaGFyICpidWYpCit7CisJaW50IHBhcnRzY2FuID0gKGxvLT5sb19mbGFncyAmIExPX0ZMQUdTX1BBUlRTQ0FOKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBwYXJ0c2NhbiA/ICIxIiA6ICIwIik7Cit9CisKIExPT1BfQVRUUl9STyhiYWNraW5nX2ZpbGUpOwogTE9PUF9BVFRSX1JPKG9mZnNldCk7CiBMT09QX0FUVFJfUk8oc2l6ZWxpbWl0KTsKIExPT1BfQVRUUl9STyhhdXRvY2xlYXIpOworTE9PUF9BVFRSX1JPKHBhcnRzY2FuKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxvb3BfYXR0cnNbXSA9IHsKIAkmbG9vcF9hdHRyX2JhY2tpbmdfZmlsZS5hdHRyLAogCSZsb29wX2F0dHJfb2Zmc2V0LmF0dHIsCiAJJmxvb3BfYXR0cl9zaXplbGltaXQuYXR0ciwKIAkmbG9vcF9hdHRyX2F1dG9jbGVhci5hdHRyLAorCSZsb29wX2F0dHJfcGFydHNjYW4uYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtODA3LDYgKzc2MywzNSBAQAogCQkJICAgJmxvb3BfYXR0cmlidXRlX2dyb3VwKTsKIH0KIAorc3RhdGljIHZvaWQgbG9vcF9jb25maWdfZGlzY2FyZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbG8tPmxvX3F1ZXVlOworCisJLyoKKwkgKiBXZSB1c2UgcHVuY2ggaG9sZSB0byByZWNsYWltIHRoZSBmcmVlIHNwYWNlIHVzZWQgYnkgdGhlCisJICogaW1hZ2UgYS5rLmEuIGRpc2NhcmQuIEhvd2V2ZXIgd2UgZG8gc3VwcG9ydCBkaXNjYXJkIGlmCisJICogZW5jcnlwdGlvbiBpcyBlbmFibGVkLCBiZWNhdXNlIGl0IG1heSBnaXZlIGFuIGF0dGFja2VyCisJICogdXNlZnVsIGluZm9ybWF0aW9uLgorCSAqLworCWlmICgoIWZpbGUtPmZfb3AtPmZhbGxvY2F0ZSkgfHwKKwkgICAgbG8tPmxvX2VuY3J5cHRfa2V5X3NpemUpIHsKKwkJcS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSAwOworCQlxLT5saW1pdHMuZGlzY2FyZF9hbGlnbm1lbnQgPSAwOworCQlxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9ycyA9IDA7CisJCXEtPmxpbWl0cy5kaXNjYXJkX3plcm9lc19kYXRhID0gMDsKKwkJcXVldWVfZmxhZ19jbGVhcl91bmxvY2tlZChRVUVVRV9GTEFHX0RJU0NBUkQsIHEpOworCQlyZXR1cm47CisJfQorCisJcS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJcS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50ID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXEtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzID0gVUlOVF9NQVggPj4gOTsKKwlxLT5saW1pdHMuZGlzY2FyZF96ZXJvZXNfZGF0YSA9IDE7CisJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELCBxKTsKK30KKwogc3RhdGljIGludCBsb29wX3NldF9mZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBmbW9kZV90IG1vZGUsCiAJCSAgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBpbnQgYXJnKQogewpAQCAtODQ5LDM2ICs4MzQsMjQgQEAKIAltYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCWlub2RlID0gbWFwcGluZy0+aG9zdDsKIAotCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKLQkJbG9fZmxhZ3MgfD0gTE9fRkxBR1NfUkVBRF9PTkxZOwotCiAJZXJyb3IgPSAtRUlOVkFMOwotCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKLQkJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYW9wcyA9IG1hcHBpbmctPmFfb3BzOwotCi0JCWlmIChhb3BzLT53cml0ZV9iZWdpbikKLQkJCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1VTRV9BT1BTOwotCQlpZiAoIShsb19mbGFncyAmIExPX0ZMQUdTX1VTRV9BT1BTKSAmJiAhZmlsZS0+Zl9vcC0+d3JpdGUpCi0JCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7Ci0KLQkJbG9fYmxvY2tzaXplID0gU19JU0JMSyhpbm9kZS0+aV9tb2RlKSA/Ci0JCQlpbm9kZS0+aV9iZGV2LT5iZF9ibG9ja19zaXplIDogUEFHRV9TSVpFOwotCi0JCWVycm9yID0gMDsKLQl9IGVsc2UgeworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKIAkJZ290byBvdXRfcHV0ZjsKLQl9CiAKLQlzaXplID0gZ2V0X2xvb3Bfc2l6ZShsbywgZmlsZSk7Ci0KLQlpZiAoKGxvZmZfdCkoc2VjdG9yX3Qpc2l6ZSAhPSBzaXplKSB7Ci0JCWVycm9yID0gLUVGQklHOwotCQlnb3RvIG91dF9wdXRmOwotCX0KLQotCWlmICghKG1vZGUgJiBGTU9ERV9XUklURSkpCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHx8ICEobW9kZSAmIEZNT0RFX1dSSVRFKSB8fAorCSAgICAhZmlsZS0+Zl9vcC0+d3JpdGUpCiAJCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1JFQURfT05MWTsKIAorCWxvX2Jsb2Nrc2l6ZSA9IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkgPworCQlpbm9kZS0+aV9iZGV2LT5iZF9ibG9ja19zaXplIDogUEFHRV9TSVpFOworCisJZXJyb3IgPSAtRUZCSUc7CisJc2l6ZSA9IGdldF9sb29wX3NpemUobG8sIGZpbGUpOworCWlmICgobG9mZl90KShzZWN0b3JfdClzaXplICE9IHNpemUpCisJCWdvdG8gb3V0X3B1dGY7CisKKwllcnJvciA9IDA7CisKIAlzZXRfZGV2aWNlX3JvKGJkZXYsIChsb19mbGFncyAmIExPX0ZMQUdTX1JFQURfT05MWSkgIT0gMCk7CiAKIAlsby0+bG9fYmxvY2tzaXplID0gbG9fYmxvY2tzaXplOwpAQCAtOTE5LDcgKzg5Miw5IEBACiAJfQogCWxvLT5sb19zdGF0ZSA9IExvX2JvdW5kOwogCXdha2VfdXBfcHJvY2Vzcyhsby0+bG9fdGhyZWFkKTsKLQlpZiAobWF4X3BhcnQgPiAwKQorCWlmIChwYXJ0X3NoaWZ0KQorCQlsby0+bG9fZmxhZ3MgfD0gTE9fRkxBR1NfUEFSVFNDQU47CisJaWYgKGxvLT5sb19mbGFncyAmIExPX0ZMQUdTX1BBUlRTQ0FOKQogCQlpb2N0bF9ieV9iZGV2KGJkZXYsIEJMS1JSUEFSVCwgMCk7CiAJcmV0dXJuIDA7CiAKQEAgLTk4MCwxMCArOTU1LDExIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBsb29wX2Nscl9mZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQorc3RhdGljIGludCBsb29wX2Nscl9mZChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvKQogewogCXN0cnVjdCBmaWxlICpmaWxwID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKIAlnZnBfdCBnZnAgPSBsby0+b2xkX2dmcF9tYXNrOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBsby0+bG9fZGV2aWNlOwogCiAJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb19ib3VuZCkKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTEwMTIsNyArOTg4LDYgQEAKIAlsby0+bG9fb2Zmc2V0ID0gMDsKIAlsby0+bG9fc2l6ZWxpbWl0ID0gMDsKIAlsby0+bG9fZW5jcnlwdF9rZXlfc2l6ZSA9IDA7Ci0JbG8tPmxvX2ZsYWdzID0gMDsKIAlsby0+bG9fdGhyZWFkID0gTlVMTDsKIAltZW1zZXQobG8tPmxvX2VuY3J5cHRfa2V5LCAwLCBMT19LRVlfU0laRSk7CiAJbWVtc2V0KGxvLT5sb19jcnlwdF9uYW1lLCAwLCBMT19OQU1FX1NJWkUpOwpAQCAtMTAzMCw4ICsxMDA1LDExIEBACiAJbG8tPmxvX3N0YXRlID0gTG9fdW5ib3VuZDsKIAkvKiBUaGlzIGlzIHNhZmU6IG9wZW4oKSBpcyBzdGlsbCBob2xkaW5nIGEgcmVmZXJlbmNlLiAqLwogCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotCWlmIChtYXhfcGFydCA+IDAgJiYgYmRldikKKwlpZiAobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfUEFSVFNDQU4gJiYgYmRldikKIAkJaW9jdGxfYnlfYmRldihiZGV2LCBCTEtSUlBBUlQsIDApOworCWxvLT5sb19mbGFncyA9IDA7CisJaWYgKCFwYXJ0X3NoaWZ0KQorCQlsby0+bG9fZGlzay0+ZmxhZ3MgfD0gR0VOSERfRkxfTk9fUEFSVF9TQ0FOOwogCW11dGV4X3VubG9jaygmbG8tPmxvX2N0bF9tdXRleCk7CiAJLyoKIAkgKiBOZWVkIG5vdCBob2xkIGxvX2N0bF9tdXRleCB0byBmcHV0IGJhY2tpbmcgZmlsZS4KQEAgLTEwODUsNiArMTA2Myw3IEBACiAJCWlmIChmaWd1cmVfbG9vcF9zaXplKGxvKSkKIAkJCXJldHVybiAtRUZCSUc7CiAJfQorCWxvb3BfY29uZmlnX2Rpc2NhcmQobG8pOwogCiAJbWVtY3B5KGxvLT5sb19maWxlX25hbWUsIGluZm8tPmxvX2ZpbGVfbmFtZSwgTE9fTkFNRV9TSVpFKTsKIAltZW1jcHkobG8tPmxvX2NyeXB0X25hbWUsIGluZm8tPmxvX2NyeXB0X25hbWUsIExPX05BTUVfU0laRSk7CkBAIC0xMTAwLDYgKzEwNzksMTMgQEAKIAkgICAgIChpbmZvLT5sb19mbGFncyAmIExPX0ZMQUdTX0FVVE9DTEVBUikpCiAJCWxvLT5sb19mbGFncyBePSBMT19GTEFHU19BVVRPQ0xFQVI7CiAKKwlpZiAoKGluZm8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfUEFSVFNDQU4pICYmCisJICAgICAhKGxvLT5sb19mbGFncyAmIExPX0ZMQUdTX1BBUlRTQ0FOKSkgeworCQlsby0+bG9fZmxhZ3MgfD0gTE9fRkxBR1NfUEFSVFNDQU47CisJCWxvLT5sb19kaXNrLT5mbGFncyAmPSB+R0VOSERfRkxfTk9fUEFSVF9TQ0FOOworCQlpb2N0bF9ieV9iZGV2KGxvLT5sb19kZXZpY2UsIEJMS1JSUEFSVCwgMCk7CisJfQorCiAJbG8tPmxvX2VuY3J5cHRfa2V5X3NpemUgPSBpbmZvLT5sb19lbmNyeXB0X2tleV9zaXplOwogCWxvLT5sb19pbml0WzBdID0gaW5mby0+bG9faW5pdFswXTsKIAlsby0+bG9faW5pdFsxXSA9IGluZm8tPmxvX2luaXRbMV07CkBAIC0xMjkzLDcgKzEyNzksNyBAQAogCQlicmVhazsKIAljYXNlIExPT1BfQ0xSX0ZEOgogCQkvKiBsb29wX2Nscl9mZCB3b3VsZCBoYXZlIHVubG9ja2VkIGxvX2N0bF9tdXRleCBvbiBzdWNjZXNzICovCi0JCWVyciA9IGxvb3BfY2xyX2ZkKGxvLCBiZGV2KTsKKwkJZXJyID0gbG9vcF9jbHJfZmQobG8pOwogCQlpZiAoIWVycikKIAkJCWdvdG8gb3V0X3VubG9ja2VkOwogCQlicmVhazsKQEAgLTE1MTMsNyArMTQ5OSw3IEBACiAJCSAqIEluIGF1dG9jbGVhciBtb2RlLCBzdG9wIHRoZSBsb29wIHRocmVhZAogCQkgKiBhbmQgcmVtb3ZlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgbGFzdCBjbG9zZS4KIAkJICovCi0JCWVyciA9IGxvb3BfY2xyX2ZkKGxvLCBOVUxMKTsKKwkJZXJyID0gbG9vcF9jbHJfZmQobG8pOwogCQlpZiAoIWVycikKIAkJCWdvdG8gb3V0X3VubG9ja2VkOwogCX0gZWxzZSB7CkBAIC0xNjM1LDYgKzE2MjEsMjcgQEAKIAlpZiAoIWRpc2spCiAJCWdvdG8gb3V0X2ZyZWVfcXVldWU7CiAKKwkvKgorCSAqIERpc2FibGUgcGFydGl0aW9uIHNjYW5uaW5nIGJ5IGRlZmF1bHQuIFRoZSBpbi1rZXJuZWwgcGFydGl0aW9uCisJICogc2Nhbm5pbmcgY2FuIGJlIHJlcXVlc3RlZCBpbmRpdmlkdWFsbHkgcGVyLWRldmljZSBkdXJpbmcgaXRzCisJICogc2V0dXAuIFVzZXJzcGFjZSBjYW4gYWx3YXlzIGFkZCBhbmQgcmVtb3ZlIHBhcnRpdGlvbnMgZnJvbSBhbGwKKwkgKiBkZXZpY2VzLiBUaGUgbmVlZGVkIHBhcnRpdGlvbiBtaW5vcnMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZQorCSAqIGV4dGVuZGVkIG1pbm9yIHNwYWNlLCB0aGUgbWFpbiBsb29wIGRldmljZSBudW1iZXJzIHdpbGwgY29udGludWUKKwkgKiB0byBtYXRjaCB0aGUgbG9vcCBtaW5vcnMsIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zCisJICogdXNlZC4KKwkgKgorCSAqIElmIG1heF9wYXJ0IGlzIGdpdmVuLCBwYXJ0aXRpb24gc2Nhbm5pbmcgaXMgZ2xvYmFsbHkgZW5hYmxlZCBmb3IKKwkgKiBhbGwgbG9vcCBkZXZpY2VzLiBUaGUgbWlub3JzIGZvciB0aGUgbWFpbiBsb29wIGRldmljZXMgd2lsbCBiZQorCSAqIG11bHRpcGxlcyBvZiBtYXhfcGFydC4KKwkgKgorCSAqIE5vdGU6IEdsb2JhbC1mb3ItYWxsLWRldmljZXMsIHNldC1vbmx5LWF0LWluaXQsIHJlYWQtb25seSBtb2R1bGUKKwkgKiBwYXJhbWV0ZXRlcnMgbGlrZSAnbWF4X2xvb3AnIGFuZCAnbWF4X3BhcnQnIG1ha2UgdGhpbmdzIG5lZWRsZXNzbHkKKwkgKiBjb21wbGljYXRlZCwgYXJlIHRvbyBzdGF0aWMsIGluZmxleGlibGUgYW5kIG1heSBzdXJwcmlzZQorCSAqIHVzZXJzcGFjZSB0b29scy4gUGFyYW1ldGVycyBsaWtlIHRoaXMgaW4gZ2VuZXJhbCBzaG91bGQgYmUgYXZvaWRlZC4KKwkgKi8KKwlpZiAoIXBhcnRfc2hpZnQpCisJCWRpc2stPmZsYWdzIHw9IEdFTkhEX0ZMX05PX1BBUlRfU0NBTjsKKwlkaXNrLT5mbGFncyB8PSBHRU5IRF9GTF9FWFRfREVWVDsKIAltdXRleF9pbml0KCZsby0+bG9fY3RsX211dGV4KTsKIAlsby0+bG9fbnVtYmVyCQk9IGk7CiAJbG8tPmxvX3RocmVhZAkJPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggZjUzM2YzMy4uYzNmMGVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC0xMjcsOCArMTI3LDcgQEAKIAlpZiAobG9jaykKIAkJbXV0ZXhfbG9jaygmbG8tPnR4X2xvY2spOwogCWlmIChsby0+c29jaykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2h1dHRpbmcgZG93biBzb2NrZXRcbiIsCi0JCQlsby0+ZGlzay0+ZGlza19uYW1lKTsKKwkJZGV2X3dhcm4oZGlza190b19kZXYobG8tPmRpc2spLCAic2h1dHRpbmcgZG93biBzb2NrZXRcbiIpOwogCQlrZXJuZWxfc29ja19zaHV0ZG93bihsby0+c29jaywgU0hVVF9SRFdSKTsKIAkJbG8tPnNvY2sgPSBOVUxMOwogCX0KQEAgLTE1OCw4ICsxNTcsOSBAQAogCXNpZ3NldF90IGJsb2NrZWQsIG9sZHNldDsKIAogCWlmICh1bmxpa2VseSghc29jaykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQXR0ZW1wdGVkICVzIG9uIGNsb3NlZCBzb2NrZXQgaW4gc29ja194bWl0XG4iLAotCQkgICAgICAgbG8tPmRpc2stPmRpc2tfbmFtZSwgKHNlbmQgPyAic2VuZCIgOiAicmVjdiIpKTsKKwkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksCisJCQkiQXR0ZW1wdGVkICVzIG9uIGNsb3NlZCBzb2NrZXQgaW4gc29ja194bWl0XG4iLAorCQkJKHNlbmQgPyAic2VuZCIgOiAicmVjdiIpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNTAsOCArMjUwLDggQEAKIAlyZXN1bHQgPSBzb2NrX3htaXQobG8sIDEsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksCiAJCQkobmJkX2NtZChyZXEpID09IE5CRF9DTURfV1JJVEUpID8gTVNHX01PUkUgOiAwKTsKIAlpZiAocmVzdWx0IDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogU2VuZCBjb250cm9sIGZhaWxlZCAocmVzdWx0ICVkKVxuIiwKLQkJCQlsby0+ZGlzay0+ZGlza19uYW1lLCByZXN1bHQpOworCQlkZXZfZXJyKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwKKwkJCSJTZW5kIGNvbnRyb2wgZmFpbGVkIChyZXN1bHQgJWQpXG4iLCByZXN1bHQpOwogCQlnb3RvIGVycm9yX291dDsKIAl9CiAKQEAgLTI3MCw4ICsyNzAsOSBAQAogCQkJCQlsby0+ZGlzay0+ZGlza19uYW1lLCByZXEsIGJ2ZWMtPmJ2X2xlbik7CiAJCQlyZXN1bHQgPSBzb2NrX3NlbmRfYnZlYyhsbywgYnZlYywgZmxhZ3MpOwogCQkJaWYgKHJlc3VsdCA8PSAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU2VuZCBkYXRhIGZhaWxlZCAocmVzdWx0ICVkKVxuIiwKLQkJCQkJCWxvLT5kaXNrLT5kaXNrX25hbWUsIHJlc3VsdCk7CisJCQkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksCisJCQkJCSJTZW5kIGRhdGEgZmFpbGVkIChyZXN1bHQgJWQpXG4iLAorCQkJCQlyZXN1bHQpOwogCQkJCWdvdG8gZXJyb3Jfb3V0OwogCQkJfQogCQl9CkBAIC0zMjgsMTQgKzMyOSwxMyBAQAogCXJlcGx5Lm1hZ2ljID0gMDsKIAlyZXN1bHQgPSBzb2NrX3htaXQobG8sIDAsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSwgTVNHX1dBSVRBTEwpOwogCWlmIChyZXN1bHQgPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlIGNvbnRyb2wgZmFpbGVkIChyZXN1bHQgJWQpXG4iLAotCQkJCWxvLT5kaXNrLT5kaXNrX25hbWUsIHJlc3VsdCk7CisJCWRldl9lcnIoZGlza190b19kZXYobG8tPmRpc2spLAorCQkJIlJlY2VpdmUgY29udHJvbCBmYWlsZWQgKHJlc3VsdCAlZClcbiIsIHJlc3VsdCk7CiAJCWdvdG8gaGFyZGVycm9yOwogCX0KIAogCWlmIChudG9obChyZXBseS5tYWdpYykgIT0gTkJEX1JFUExZX01BR0lDKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFdyb25nIG1hZ2ljICgweCVseClcbiIsCi0JCQkJbG8tPmRpc2stPmRpc2tfbmFtZSwKKwkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksICJXcm9uZyBtYWdpYyAoMHglbHgpXG4iLAogCQkJCSh1bnNpZ25lZCBsb25nKW50b2hsKHJlcGx5Lm1hZ2ljKSk7CiAJCXJlc3VsdCA9IC1FUFJPVE87CiAJCWdvdG8gaGFyZGVycm9yOwpAQCAtMzQ3LDE1ICszNDcsMTUgQEAKIAkJaWYgKHJlc3VsdCAhPSAtRU5PRU5UKQogCQkJZ290byBoYXJkZXJyb3I7CiAKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5leHBlY3RlZCByZXBseSAoJXApXG4iLAotCQkJCWxvLT5kaXNrLT5kaXNrX25hbWUsIHJlcGx5LmhhbmRsZSk7CisJCWRldl9lcnIoZGlza190b19kZXYobG8tPmRpc2spLCAiVW5leHBlY3RlZCByZXBseSAoJXApXG4iLAorCQkJcmVwbHkuaGFuZGxlKTsKIAkJcmVzdWx0ID0gLUVCQURSOwogCQlnb3RvIGhhcmRlcnJvcjsKIAl9CiAKIAlpZiAobnRvaGwocmVwbHkuZXJyb3IpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IE90aGVyIHNpZGUgcmV0dXJuZWQgZXJyb3IgKCVkKVxuIiwKLQkJCQlsby0+ZGlzay0+ZGlza19uYW1lLCBudG9obChyZXBseS5lcnJvcikpOworCQlkZXZfZXJyKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwgIk90aGVyIHNpZGUgcmV0dXJuZWQgZXJyb3IgKCVkKVxuIiwKKwkJCW50b2hsKHJlcGx5LmVycm9yKSk7CiAJCXJlcS0+ZXJyb3JzKys7CiAJCXJldHVybiByZXE7CiAJfQpAQCAtMzY5LDggKzM2OSw4IEBACiAJCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgcmVxLCBpdGVyKSB7CiAJCQlyZXN1bHQgPSBzb2NrX3JlY3ZfYnZlYyhsbywgYnZlYyk7CiAJCQlpZiAocmVzdWx0IDw9IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlIGRhdGEgZmFpbGVkIChyZXN1bHQgJWQpXG4iLAotCQkJCQkJbG8tPmRpc2stPmRpc2tfbmFtZSwgcmVzdWx0KTsKKwkJCQlkZXZfZXJyKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwgIlJlY2VpdmUgZGF0YSBmYWlsZWQgKHJlc3VsdCAlZClcbiIsCisJCQkJCXJlc3VsdCk7CiAJCQkJcmVxLT5lcnJvcnMrKzsKIAkJCQlyZXR1cm4gcmVxOwogCQkJfQpAQCAtNDA1LDEwICs0MDUsMTAgQEAKIAogCUJVR19PTihsby0+bWFnaWMgIT0gTE9fTUFHSUMpOwogCi0JbG8tPnBpZCA9IGN1cnJlbnQtPnBpZDsKLQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmZGlza190b19kZXYobG8tPmRpc2spLT5rb2JqLCAmcGlkX2F0dHIuYXR0cik7CisJbG8tPnBpZCA9IHRhc2tfcGlkX25yKGN1cnJlbnQpOworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkaXNrX3RvX2Rldihsby0+ZGlzayksICZwaWRfYXR0cik7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIm5iZDogc3lzZnNfY3JlYXRlX2ZpbGUgZmFpbGVkISIpOworCQlkZXZfZXJyKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwgImRldmljZV9jcmVhdGVfZmlsZSBmYWlsZWQhXG4iKTsKIAkJbG8tPnBpZCA9IDA7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNDE2LDcgKzQxNiw3IEBACiAJd2hpbGUgKChyZXEgPSBuYmRfcmVhZF9zdGF0KGxvKSkgIT0gTlVMTCkKIAkJbmJkX2VuZF9yZXF1ZXN0KHJlcSk7CiAKLQlzeXNmc19yZW1vdmVfZmlsZSgmZGlza190b19kZXYobG8tPmRpc2spLT5rb2JqLCAmcGlkX2F0dHIuYXR0cik7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwgJnBpZF9hdHRyKTsKIAlsby0+cGlkID0gMDsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1Nyw4ICs0NTcsOCBAQAogCWlmIChycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKSB7CiAJCW5iZF9jbWQocmVxKSA9IE5CRF9DTURfV1JJVEU7CiAJCWlmIChsby0+ZmxhZ3MgJiBOQkRfUkVBRF9PTkxZKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBXcml0ZSBvbiByZWFkLW9ubHlcbiIsCi0JCQkJCWxvLT5kaXNrLT5kaXNrX25hbWUpOworCQkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksCisJCQkJIldyaXRlIG9uIHJlYWQtb25seVxuIik7CiAJCQlnb3RvIGVycm9yX291dDsKIAkJfQogCX0KQEAgLTQ2OCwxNiArNDY4LDE1IEBACiAJbXV0ZXhfbG9jaygmbG8tPnR4X2xvY2spOwogCWlmICh1bmxpa2VseSghbG8tPnNvY2spKSB7CiAJCW11dGV4X3VubG9jaygmbG8tPnR4X2xvY2spOwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBBdHRlbXB0ZWQgc2VuZCBvbiBjbG9zZWQgc29ja2V0XG4iLAotCQkgICAgICAgbG8tPmRpc2stPmRpc2tfbmFtZSk7CisJCWRldl9lcnIoZGlza190b19kZXYobG8tPmRpc2spLAorCQkJIkF0dGVtcHRlZCBzZW5kIG9uIGNsb3NlZCBzb2NrZXRcbiIpOwogCQlnb3RvIGVycm9yX291dDsKIAl9CiAKIAlsby0+YWN0aXZlX3JlcSA9IHJlcTsKIAogCWlmIChuYmRfc2VuZF9yZXEobG8sIHJlcSkgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZXF1ZXN0IHNlbmQgZmFpbGVkXG4iLAotCQkJCWxvLT5kaXNrLT5kaXNrX25hbWUpOworCQlkZXZfZXJyKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwgIlJlcXVlc3Qgc2VuZCBmYWlsZWRcbiIpOwogCQlyZXEtPmVycm9ycysrOwogCQluYmRfZW5kX3JlcXVlc3QocmVxKTsKIAl9IGVsc2UgewpAQCAtNTQ5LDggKzU0OCw4IEBACiAJCUJVR19PTihsby0+bWFnaWMgIT0gTE9fTUFHSUMpOwogCiAJCWlmICh1bmxpa2VseSghbG8tPnNvY2spKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBBdHRlbXB0ZWQgc2VuZCBvbiBjbG9zZWQgc29ja2V0XG4iLAotCQkJCWxvLT5kaXNrLT5kaXNrX25hbWUpOworCQkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksCisJCQkJIkF0dGVtcHRlZCBzZW5kIG9uIGNsb3NlZCBzb2NrZXRcbiIpOwogCQkJcmVxLT5lcnJvcnMrKzsKIAkJCW5iZF9lbmRfcmVxdWVzdChyZXEpOwogCQkJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKQEAgLTU3Niw3ICs1NzUsNyBAQAogCWNhc2UgTkJEX0RJU0NPTk5FQ1Q6IHsKIAkJc3RydWN0IHJlcXVlc3Qgc3JlcTsKIAotCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5CRF9ESVNDT05ORUNUXG4iLCBsby0+ZGlzay0+ZGlza19uYW1lKTsKKwkJZGV2X2luZm8oZGlza190b19kZXYobG8tPmRpc2spLCAiTkJEX0RJU0NPTk5FQ1RcbiIpOwogCiAJCWJsa19ycV9pbml0KE5VTEwsICZzcmVxKTsKIAkJc3JlcS5jbWRfdHlwZSA9IFJFUV9UWVBFX1NQRUNJQUw7CkBAIC02NzQsNyArNjczLDcgQEAKIAkJZmlsZSA9IGxvLT5maWxlOwogCQlsby0+ZmlsZSA9IE5VTEw7CiAJCW5iZF9jbGVhcl9xdWUobG8pOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcXVldWUgY2xlYXJlZFxuIiwgbG8tPmRpc2stPmRpc2tfbmFtZSk7CisJCWRldl93YXJuKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwgInF1ZXVlIGNsZWFyZWRcbiIpOwogCQlpZiAoZmlsZSkKIAkJCWZwdXQoZmlsZSk7CiAJCWxvLT5ieXRlc2l6ZSA9IDA7CkBAIC02OTQsOCArNjkzLDggQEAKIAkJcmV0dXJuIDA7CiAKIAljYXNlIE5CRF9QUklOVF9ERUJVRzoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5leHQgPSAlcCwgcHJldiA9ICVwLCBoZWFkID0gJXBcbiIsCi0JCQliZGV2LT5iZF9kaXNrLT5kaXNrX25hbWUsCisJCWRldl9pbmZvKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwKKwkJCSJuZXh0ID0gJXAsIHByZXYgPSAlcCwgaGVhZCA9ICVwXG4iLAogCQkJbG8tPnF1ZXVlX2hlYWQubmV4dCwgbG8tPnF1ZXVlX2hlYWQucHJldiwKIAkJCSZsby0+cXVldWVfaGVhZCk7CiAJCXJldHVybiAwOwpAQCAtNzQ1LDcgKzc0NCw3IEBACiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgbmJkX3JlcXVlc3QpICE9IDI4KTsKIAogCWlmIChtYXhfcGFydCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAibmJkOiBtYXhfcGFydCBtdXN0IGJlID49IDBcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIm5iZDogbWF4X3BhcnQgbXVzdCBiZSA+PSAwXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCmluZGV4IGUxMzNmMDkuLmE2M2IwYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCkBAIC0yNDQ0LDcgKzI0NDQsNyBAQAogCXBrdF9iaW9fZmluaXNoZWQocGQpOwogfQogCi1zdGF0aWMgaW50IHBrdF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyB2b2lkIHBrdF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkOwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKQEAgLTI0NzMsNyArMjQ3Myw3IEBACiAJCWNsb25lZF9iaW8tPmJpX2VuZF9pbyA9IHBrdF9lbmRfaW9fcmVhZF9jbG9uZWQ7CiAJCXBkLT5zdGF0cy5zZWNzX3IgKz0gYmlvLT5iaV9zaXplID4+IDk7CiAJCXBrdF9xdWV1ZV9iaW8ocGQsIGNsb25lZF9iaW8pOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCX0KIAogCWlmICghdGVzdF9iaXQoUEFDS0VUX1dSSVRBQkxFLCAmcGQtPmZsYWdzKSkgewpAQCAtMjUwOSw3ICsyNTA5LDcgQEAKIAkJCXBrdF9tYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8xKTsKIAkJCXBrdF9tYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8yKTsKIAkJCWJpb19wYWlyX3JlbGVhc2UoYnApOwotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm47CiAJCX0KIAl9CiAKQEAgLTI1MzMsNyArMjUzMyw3IEBACiAJCQkJfQogCQkJCXNwaW5fdW5sb2NrKCZwa3QtPmxvY2spOwogCQkJCXNwaW5fdW5sb2NrKCZwZC0+Y2Rydy5hY3RpdmVfbGlzdF9sb2NrKTsKLQkJCQlyZXR1cm4gMDsKKwkJCQlyZXR1cm47CiAJCQl9IGVsc2UgewogCQkJCWJsb2NrZWRfYmlvID0gMTsKIAkJCX0KQEAgLTI1ODQsMTAgKzI1ODQsOSBAQAogCQkgKi8KIAkJd2FrZV91cCgmcGQtPndxdWV1ZSk7CiAJfQotCXJldHVybiAwOworCXJldHVybjsKIGVuZF9pbzoKIAliaW9faW9fZXJyb3IoYmlvKTsKLQlyZXR1cm4gMDsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYyBiL2RyaXZlcnMvYmxvY2svcHMzZGlzay5jCmluZGV4IDhlMWNlMmUuLmRhMGFiYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcHMzZGlzay5jCisrKyBiL2RyaXZlcnMvYmxvY2svcHMzZGlzay5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRhLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KICNpbmNsdWRlIDxhc20vcHMzc3Rvci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wczN2cmFtLmMgYi9kcml2ZXJzL2Jsb2NrL3BzM3ZyYW0uYwppbmRleCBiM2JkYjhhLi5mNThjZGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BzM3ZyYW0uYworKysgYi9kcml2ZXJzL2Jsb2NrL3BzM3ZyYW0uYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC01OTYsNyArNTk3LDcgQEAKIAlyZXR1cm4gbmV4dDsKIH0KIAotc3RhdGljIGludCBwczN2cmFtX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIHZvaWQgcHMzdnJhbV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBxLT5xdWV1ZWRhdGE7CiAJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IHBzM19zeXN0ZW1fYnVzX2dldF9kcnZkYXRhKGRldik7CkBAIC02MTAsMTMgKzYxMSwxMSBAQAogCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAKIAlpZiAoYnVzeSkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCWRvIHsKIAkJYmlvID0gcHMzdnJhbV9kb19iaW8oZGV2LCBiaW8pOwogCX0gd2hpbGUgKGJpbyk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgcHMzdnJhbV9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JiZC5jIGIvZHJpdmVycy9ibG9jay9yYmQuYwppbmRleCBmZTNjMzI0Li42NWNjNDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JiZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcmJkLmMKQEAgLTI2MCw3ICsyNjAsNyBAQAogCWtyZWZfaW5pdCgmcmJkYy0+a3JlZik7CiAJSU5JVF9MSVNUX0hFQUQoJnJiZGMtPm5vZGUpOwogCi0JcmJkYy0+Y2xpZW50ID0gY2VwaF9jcmVhdGVfY2xpZW50KG9wdCwgcmJkYyk7CisJcmJkYy0+Y2xpZW50ID0gY2VwaF9jcmVhdGVfY2xpZW50KG9wdCwgcmJkYywgMCwgMCk7CiAJaWYgKElTX0VSUihyYmRjLT5jbGllbnQpKQogCQlnb3RvIG91dF9yYmRjOwogCW9wdCA9IE5VTEw7IC8qIE5vdyByYmRjLT5jbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIG9wdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay91bWVtLmMgYi9kcml2ZXJzL2Jsb2NrL3VtZW0uYwppbmRleCAwMzFjYTcyLi5hYTI3MTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3VtZW0uYworKysgYi9kcml2ZXJzL2Jsb2NrL3VtZW0uYwpAQCAtNTEzLDcgKzUxMyw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IG1tX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIHZvaWQgbW1fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGNhcmRpbmZvICpjYXJkID0gcS0+cXVldWVkYXRhOwogCXByX2RlYnVnKCJtbV9tYWtlX3JlcXVlc3QgJWxsdSAldVxuIiwKQEAgLTUyNSw3ICs1MjUsNyBAQAogCWNhcmQtPmJpb3RhaWwgPSAmYmlvLT5iaV9uZXh0OwogCXNwaW5fdW5sb2NrX2lycSgmY2FyZC0+bG9jayk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqX19jYXJkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMgYi9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYwppbmRleCAwNzljMDg4Li40ZDBiNzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYwpAQCAtMywxNSArMywxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpby5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19ibGsuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ19oZWxwZXJzLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KIAogI2RlZmluZSBQQVJUX0JJVFMgNAogCi1zdGF0aWMgaW50IG1ham9yLCBpbmRleDsKK3N0YXRpYyBpbnQgbWFqb3I7CitzdGF0aWMgREVGSU5FX0lEQSh2ZF9pbmRleF9pZGEpOworCiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdmlydGJsa193cTsKIAogc3RydWN0IHZpcnRpb19ibGsKQEAgLTM1LDYgKzM5LDkgQEAKIAkvKiBXaGF0IGhvc3QgdGVsbHMgdXMsIHBsdXMgMiBmb3IgaGVhZGVyICYgdGFpbGVyLiAqLwogCXVuc2lnbmVkIGludCBzZ19lbGVtczsKIAorCS8qIElkYSBpbmRleCAtIHVzZWQgdG8gdHJhY2sgbWlub3IgbnVtYmVyIGFsbG9jYXRpb25zLiAqLworCWludCBpbmRleDsKKwogCS8qIFNjYXR0ZXJsaXN0OiBjYW4gYmUgdG9vIGJpZyBmb3Igc3RhY2suICovCiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWy8qc2dfZWxlbXMqL107CiB9OwpAQCAtMjc2LDYgKzI4MywxMSBAQAogCXJldHVybiBpbmRleCA8PCBQQVJUX0JJVFM7CiB9CiAKK3N0YXRpYyBpbnQgbWlub3JfdG9faW5kZXgoaW50IG1pbm9yKQoreworCXJldHVybiBtaW5vciA+PiBQQVJUX0JJVFM7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHZpcnRibGtfc2VyaWFsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC0zNDEsMTQgKzM1MywxNyBAQAogewogCXN0cnVjdCB2aXJ0aW9fYmxrICp2YmxrOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwotCWludCBlcnI7CisJaW50IGVyciwgaW5kZXg7CiAJdTY0IGNhcDsKIAl1MzIgdiwgYmxrX3NpemUsIHNnX2VsZW1zLCBvcHRfaW9fc2l6ZTsKIAl1MTYgbWluX2lvX3NpemU7CiAJdTggcGh5c2ljYWxfYmxvY2tfZXhwLCBhbGlnbm1lbnRfb2Zmc2V0OwogCi0JaWYgKGluZGV4X3RvX21pbm9yKGluZGV4KSA+PSAxIDw8IE1JTk9SQklUUykKLQkJcmV0dXJuIC1FTk9TUEM7CisJZXJyID0gaWRhX3NpbXBsZV9nZXQoJnZkX2luZGV4X2lkYSwgMCwgbWlub3JfdG9faW5kZXgoMSA8PCBNSU5PUkJJVFMpLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisJaW5kZXggPSBlcnI7CiAKIAkvKiBXZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgc2VnbWVudHMgYmVmb3JlIHdlIGFsbG9jYXRlLiAqLwogCWVyciA9IHZpcnRpb19jb25maWdfdmFsKHZkZXYsIFZJUlRJT19CTEtfRl9TRUdfTUFYLApAQCAtMzY1LDcgKzM4MCw3IEBACiAJCQkJICAgIHNpemVvZih2YmxrLT5zZ1swXSkgKiBzZ19lbGVtcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2YmxrKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9mcmVlX2luZGV4OwogCX0KIAogCUlOSVRfTElTVF9IRUFEKCZ2YmxrLT5yZXFzKTsKQEAgLTQyMSw3ICs0MzYsNyBAQAogCXZibGstPmRpc2stPnByaXZhdGVfZGF0YSA9IHZibGs7CiAJdmJsay0+ZGlzay0+Zm9wcyA9ICZ2aXJ0YmxrX2ZvcHM7CiAJdmJsay0+ZGlzay0+ZHJpdmVyZnNfZGV2ID0gJnZkZXYtPmRldjsKLQlpbmRleCsrOworCXZibGstPmluZGV4ID0gaW5kZXg7CiAKIAkvKiBjb25maWd1cmUgcXVldWUgZmx1c2ggc3VwcG9ydCAqLwogCWlmICh2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX0JMS19GX0ZMVVNIKSkKQEAgLTUxNiw2ICs1MzEsOCBAQAogCXZkZXYtPmNvbmZpZy0+ZGVsX3Zxcyh2ZGV2KTsKIG91dF9mcmVlX3ZibGs6CiAJa2ZyZWUodmJsayk7CitvdXRfZnJlZV9pbmRleDoKKwlpZGFfc2ltcGxlX3JlbW92ZSgmdmRfaW5kZXhfaWRhLCBpbmRleCk7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTUyMyw2ICs1NDAsNyBAQAogc3RhdGljIHZvaWQgX19kZXZleGl0IHZpcnRibGtfcmVtb3ZlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQogewogCXN0cnVjdCB2aXJ0aW9fYmxrICp2YmxrID0gdmRldi0+cHJpdjsKKwlpbnQgaW5kZXggPSB2YmxrLT5pbmRleDsKIAogCWZsdXNoX3dvcmsoJnZibGstPmNvbmZpZ193b3JrKTsKIApAQCAtNTM4LDYgKzU1Niw3IEBACiAJbWVtcG9vbF9kZXN0cm95KHZibGstPnBvb2wpOwogCXZkZXYtPmNvbmZpZy0+ZGVsX3Zxcyh2ZGV2KTsKIAlrZnJlZSh2YmxrKTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmdmRfaW5kZXhfaWRhLCBpbmRleCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdmlydGlvX2RldmljZV9pZCBpZF90YWJsZVtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYwppbmRleCAxNTQwNzkyLi4xNWVjNGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYwpAQCAtMzksNiArMzksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9sb29wLmg+CisjaW5jbHVkZSA8bGludXgvZmFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KIAogI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgpAQCAtMjU4LDEzICsyNjEsMTYgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfc3RhdHMoc3RydWN0IHhlbl9ibGtpZiAqYmxraWYpCiB7Ci0JcHJfaW5mbygieGVuLWJsa2JhY2sgKCVzKTogb28gJTNkICB8ICByZCAlNGQgIHwgIHdyICU0ZCAgfCAgZiAlNGRcbiIsCisJcHJfaW5mbygieGVuLWJsa2JhY2sgKCVzKTogb28gJTNkICB8ICByZCAlNGQgIHwgIHdyICU0ZCAgfCAgZiAlNGQiCisJCSAiICB8ICBkcyAlNGRcbiIsCiAJCSBjdXJyZW50LT5jb21tLCBibGtpZi0+c3Rfb29fcmVxLAotCQkgYmxraWYtPnN0X3JkX3JlcSwgYmxraWYtPnN0X3dyX3JlcSwgYmxraWYtPnN0X2ZfcmVxKTsKKwkJIGJsa2lmLT5zdF9yZF9yZXEsIGJsa2lmLT5zdF93cl9yZXEsCisJCSBibGtpZi0+c3RfZl9yZXEsIGJsa2lmLT5zdF9kc19yZXEpOwogCWJsa2lmLT5zdF9wcmludCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwICogMTAwMCk7CiAJYmxraWYtPnN0X3JkX3JlcSA9IDA7CiAJYmxraWYtPnN0X3dyX3JlcSA9IDA7CiAJYmxraWYtPnN0X29vX3JlcSA9IDA7CisJYmxraWYtPnN0X2RzX3JlcSA9IDA7CiB9CiAKIGludCB4ZW5fYmxraWZfc2NoZWR1bGUodm9pZCAqYXJnKQpAQCAtNDEwLDYgKzQxNiw1OSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIHhlbl9ibGtfZGlzY2FyZChzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiwgc3RydWN0IGJsa2lmX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgc3RhdHVzID0gQkxLSUZfUlNQX09LQVk7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGJsa2lmLT52YmQuYmRldjsKKworCWlmIChibGtpZi0+YmxrX2JhY2tlbmRfdHlwZSA9PSBCTEtJRl9CQUNLRU5EX1BIWSkKKwkJLyoganVzdCBmb3J3YXJkIHRoZSBkaXNjYXJkIHJlcXVlc3QgKi8KKwkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwKKwkJCQlyZXEtPnUuZGlzY2FyZC5zZWN0b3JfbnVtYmVyLAorCQkJCXJlcS0+dS5kaXNjYXJkLm5yX3NlY3RvcnMsCisJCQkJR0ZQX0tFUk5FTCwgMCk7CisJZWxzZSBpZiAoYmxraWYtPmJsa19iYWNrZW5kX3R5cGUgPT0gQkxLSUZfQkFDS0VORF9GSUxFKSB7CisJCS8qIHB1bmNoIGEgaG9sZSBpbiB0aGUgYmFja2luZyBmaWxlICovCisJCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJCXN0cnVjdCBmaWxlICpmaWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKKworCQlpZiAoZmlsZS0+Zl9vcC0+ZmFsbG9jYXRlKQorCQkJZXJyID0gZmlsZS0+Zl9vcC0+ZmFsbG9jYXRlKGZpbGUsCisJCQkJRkFMTE9DX0ZMX0tFRVBfU0laRSB8IEZBTExPQ19GTF9QVU5DSF9IT0xFLAorCQkJCXJlcS0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXIgPDwgOSwKKwkJCQlyZXEtPnUuZGlzY2FyZC5ucl9zZWN0b3JzIDw8IDkpOworCQllbHNlCisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisKKwlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7CisJCXByX2RlYnVnKERSVl9QRlggImRpc2NhcmQgb3AgZmFpbGVkLCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJc3RhdHVzID0gQkxLSUZfUlNQX0VPUE5PVFNVUFA7CisJfSBlbHNlIGlmIChlcnIpCisJCXN0YXR1cyA9IEJMS0lGX1JTUF9FUlJPUjsKKworCW1ha2VfcmVzcG9uc2UoYmxraWYsIHJlcS0+aWQsIHJlcS0+b3BlcmF0aW9uLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fYmxrX2RyYWluX2lvKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmKQoreworCWF0b21pY19zZXQoJmJsa2lmLT5kcmFpbiwgMSk7CisJZG8geworCQkvKiBUaGUgaW5pdGlhbCB2YWx1ZSBpcyBvbmUsIGFuZCBvbmUgcmVmY250IHRha2VuIGF0IHRoZQorCQkgKiBzdGFydCBvZiB0aGUgeGVuX2Jsa2lmX3NjaGVkdWxlIHRocmVhZC4gKi8KKwkJaWYgKGF0b21pY19yZWFkKCZibGtpZi0+cmVmY250KSA8PSAyKQorCQkJYnJlYWs7CisJCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCSZibGtpZi0+ZHJhaW5fY29tcGxldGUsIEhaKTsKKworCQlpZiAoIWF0b21pY19yZWFkKCZibGtpZi0+ZHJhaW4pKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisJYXRvbWljX3NldCgmYmxraWYtPmRyYWluLCAwKTsKK30KKwogLyoKICAqIENvbXBsZXRpb24gY2FsbGJhY2sgb24gdGhlIGJpbydzLiBDYWxsZWQgYXMgYmgtPmJfZW5kX2lvKCkKICAqLwpAQCAtNDIyLDYgKzQ4MSwxMSBAQAogCQlwcl9kZWJ1ZyhEUlZfUEZYICJmbHVzaCBkaXNrY2FjaGUgb3AgZmFpbGVkLCBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJeGVuX2Jsa2JrX2ZsdXNoX2Rpc2tjYWNoZShYQlRfTklMLCBwZW5kaW5nX3JlcS0+YmxraWYtPmJlLCAwKTsKIAkJcGVuZGluZ19yZXEtPnN0YXR1cyA9IEJMS0lGX1JTUF9FT1BOT1RTVVBQOworCX0gZWxzZSBpZiAoKHBlbmRpbmdfcmVxLT5vcGVyYXRpb24gPT0gQkxLSUZfT1BfV1JJVEVfQkFSUklFUikgJiYKKwkJICAgIChlcnJvciA9PSAtRU9QTk9UU1VQUCkpIHsKKwkJcHJfZGVidWcoRFJWX1BGWCAid3JpdGUgYmFycmllciBvcCBmYWlsZWQsIG5vdCBzdXBwb3J0ZWRcbiIpOworCQl4ZW5fYmxrYmtfYmFycmllcihYQlRfTklMLCBwZW5kaW5nX3JlcS0+YmxraWYtPmJlLCAwKTsKKwkJcGVuZGluZ19yZXEtPnN0YXR1cyA9IEJMS0lGX1JTUF9FT1BOT1RTVVBQOwogCX0gZWxzZSBpZiAoZXJyb3IpIHsKIAkJcHJfZGVidWcoRFJWX1BGWCAiQnVmZmVyIG5vdCB1cC10by1kYXRlIGF0IGVuZCBvZiBvcGVyYXRpb24sIgogCQkJICIgZXJyb3I9JWRcbiIsIGVycm9yKTsKQEAgLTQzOCw2ICs1MDIsMTAgQEAKIAkJbWFrZV9yZXNwb25zZShwZW5kaW5nX3JlcS0+YmxraWYsIHBlbmRpbmdfcmVxLT5pZCwKIAkJCSAgICAgIHBlbmRpbmdfcmVxLT5vcGVyYXRpb24sIHBlbmRpbmdfcmVxLT5zdGF0dXMpOwogCQl4ZW5fYmxraWZfcHV0KHBlbmRpbmdfcmVxLT5ibGtpZik7CisJCWlmIChhdG9taWNfcmVhZCgmcGVuZGluZ19yZXEtPmJsa2lmLT5yZWZjbnQpIDw9IDIpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmcGVuZGluZ19yZXEtPmJsa2lmLT5kcmFpbikpCisJCQkJY29tcGxldGUoJnBlbmRpbmdfcmVxLT5ibGtpZi0+ZHJhaW5fY29tcGxldGUpOworCQl9CiAJCWZyZWVfcmVxKHBlbmRpbmdfcmVxKTsKIAl9CiB9CkBAIC01MzIsNyArNjAwLDYgQEAKIAogCXJldHVybiBtb3JlX3RvX2RvOwogfQotCiAvKgogICogVHJhbnNtdXRhdGlvbiBvZiB0aGUgJ3N0cnVjdCBibGtpZl9yZXF1ZXN0JyB0byBhIHByb3BlciAnc3RydWN0IGJpbycKICAqIGFuZCBjYWxsIHRoZSAnc3VibWl0X2JpbycgdG8gcGFzcyBpdCB0byB0aGUgdW5kZXJseWluZyBzdG9yYWdlLgpAQCAtNTQ5LDYgKzYxNiw3IEBACiAJaW50IGksIG5iaW8gPSAwOwogCWludCBvcGVyYXRpb247CiAJc3RydWN0IGJsa19wbHVnIHBsdWc7CisJYm9vbCBkcmFpbiA9IGZhbHNlOwogCiAJc3dpdGNoIChyZXEtPm9wZXJhdGlvbikgewogCWNhc2UgQkxLSUZfT1BfUkVBRDoKQEAgLTU1OSwxMSArNjI3LDE2IEBACiAJCWJsa2lmLT5zdF93cl9yZXErKzsKIAkJb3BlcmF0aW9uID0gV1JJVEVfT0RJUkVDVDsKIAkJYnJlYWs7CisJY2FzZSBCTEtJRl9PUF9XUklURV9CQVJSSUVSOgorCQlkcmFpbiA9IHRydWU7CiAJY2FzZSBCTEtJRl9PUF9GTFVTSF9ESVNLQ0FDSEU6CiAJCWJsa2lmLT5zdF9mX3JlcSsrOwogCQlvcGVyYXRpb24gPSBXUklURV9GTFVTSDsKIAkJYnJlYWs7Ci0JY2FzZSBCTEtJRl9PUF9XUklURV9CQVJSSUVSOgorCWNhc2UgQkxLSUZfT1BfRElTQ0FSRDoKKwkJYmxraWYtPnN0X2RzX3JlcSsrOworCQlvcGVyYXRpb24gPSBSRVFfRElTQ0FSRDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJb3BlcmF0aW9uID0gMDsgLyogbWFrZSBnY2MgaGFwcHkgKi8KIAkJZ290byBmYWlsX3Jlc3BvbnNlOwpAQCAtNTcyLDcgKzY0NSw4IEBACiAKIAkvKiBDaGVjayB0aGF0IHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgaXMgc2FuZS4gKi8KIAluc2VnID0gcmVxLT5ucl9zZWdtZW50czsKLQlpZiAodW5saWtlbHkobnNlZyA9PSAwICYmIG9wZXJhdGlvbiAhPSBXUklURV9GTFVTSCkgfHwKKwlpZiAodW5saWtlbHkobnNlZyA9PSAwICYmIG9wZXJhdGlvbiAhPSBXUklURV9GTFVTSCAmJgorCQkJCW9wZXJhdGlvbiAhPSBSRVFfRElTQ0FSRCkgfHwKIAkgICAgdW5saWtlbHkobnNlZyA+IEJMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVCkpIHsKIAkJcHJfZGVidWcoRFJWX1BGWCAiQmFkIG51bWJlciBvZiBzZWdtZW50cyBpbiByZXF1ZXN0ICglZClcbiIsCiAJCQkgbnNlZyk7CkBAIC02MjEsMTYgKzY5NSwyNSBAQAogCQl9CiAJfQogCisJLyogV2FpdCBvbiBhbGwgb3V0c3RhbmRpbmcgSS9PJ3MgYW5kIG9uY2UgdGhhdCBoYXMgYmVlbiBjb21wbGV0ZWQKKwkgKiBpc3N1ZSB0aGUgV1JJVEVfRkxVU0guCisJICovCisJaWYgKGRyYWluKQorCQl4ZW5fYmxrX2RyYWluX2lvKHBlbmRpbmdfcmVxLT5ibGtpZik7CisKIAkvKgogCSAqIElmIHdlIGhhdmUgZmFpbGVkIGF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gdW5kbyB0aGUgTTJQIG92ZXJyaWRlLAogCSAqIHNldCBnbnR0YWJfc2V0X3VubWFwX29wIG9uIGFsbCBvZiB0aGUgZ3JhbnQgcmVmZXJlbmNlcyBhbmQgcGVyZm9ybQogCSAqIHRoZSBoeXBlcmNhbGwgdG8gdW5tYXAgdGhlIGdyYW50cyAtIHRoYXQgaXMgYWxsIGRvbmUgaW4KIAkgKiB4ZW5fYmxrYmtfdW5tYXAuCiAJICovCi0JaWYgKHhlbl9ibGtia19tYXAocmVxLCBwZW5kaW5nX3JlcSwgc2VnKSkKKwlpZiAob3BlcmF0aW9uICE9IFJFUV9ESVNDQVJEICYmIHhlbl9ibGtia19tYXAocmVxLCBwZW5kaW5nX3JlcSwgc2VnKSkKIAkJZ290byBmYWlsX2ZsdXNoOwogCi0JLyogVGhpcyBjb3JyZXNwb25kaW5nIHhlbl9ibGtpZl9wdXQgaXMgZG9uZSBpbiBfX2VuZF9ibG9ja19pb19vcCAqLworCS8qCisJICogVGhpcyBjb3JyZXNwb25kaW5nIHhlbl9ibGtpZl9wdXQgaXMgZG9uZSBpbiBfX2VuZF9ibG9ja19pb19vcCwgb3IKKwkgKiBiZWxvdyAoaW4gIiFiaW8iKSBpZiB3ZSBhcmUgaGFuZGxpbmcgYSBCTEtJRl9PUF9ESVNDQVJELgorCSAqLwogCXhlbl9ibGtpZl9nZXQoYmxraWYpOwogCiAJZm9yIChpID0gMDsgaSA8IG5zZWc7IGkrKykgewpAQCAtNjU0LDE4ICs3MzcsMjUgQEAKIAkJcHJlcS5zZWN0b3JfbnVtYmVyICs9IHNlZ1tpXS5uc2VjOwogCX0KIAotCS8qIFRoaXMgd2lsbCBiZSBoaXQgaWYgdGhlIG9wZXJhdGlvbiB3YXMgYSBmbHVzaC4gKi8KKwkvKiBUaGlzIHdpbGwgYmUgaGl0IGlmIHRoZSBvcGVyYXRpb24gd2FzIGEgZmx1c2ggb3IgZGlzY2FyZC4gKi8KIAlpZiAoIWJpbykgewotCQlCVUdfT04ob3BlcmF0aW9uICE9IFdSSVRFX0ZMVVNIKTsKKwkJQlVHX09OKG9wZXJhdGlvbiAhPSBXUklURV9GTFVTSCAmJiBvcGVyYXRpb24gIT0gUkVRX0RJU0NBUkQpOwogCi0JCWJpbyA9IGJpb19hbGxvYyhHRlBfS0VSTkVMLCAwKTsKLQkJaWYgKHVubGlrZWx5KGJpbyA9PSBOVUxMKSkKLQkJCWdvdG8gZmFpbF9wdXRfYmlvOworCQlpZiAob3BlcmF0aW9uID09IFdSSVRFX0ZMVVNIKSB7CisJCQliaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgMCk7CisJCQlpZiAodW5saWtlbHkoYmlvID09IE5VTEwpKQorCQkJCWdvdG8gZmFpbF9wdXRfYmlvOwogCi0JCWJpb2xpc3RbbmJpbysrXSA9IGJpbzsKLQkJYmlvLT5iaV9iZGV2ICAgID0gcHJlcS5iZGV2OwotCQliaW8tPmJpX3ByaXZhdGUgPSBwZW5kaW5nX3JlcTsKLQkJYmlvLT5iaV9lbmRfaW8gID0gZW5kX2Jsb2NrX2lvX29wOworCQkJYmlvbGlzdFtuYmlvKytdID0gYmlvOworCQkJYmlvLT5iaV9iZGV2ICAgID0gcHJlcS5iZGV2OworCQkJYmlvLT5iaV9wcml2YXRlID0gcGVuZGluZ19yZXE7CisJCQliaW8tPmJpX2VuZF9pbyAgPSBlbmRfYmxvY2tfaW9fb3A7CisJCX0gZWxzZSBpZiAob3BlcmF0aW9uID09IFJFUV9ESVNDQVJEKSB7CisJCQl4ZW5fYmxrX2Rpc2NhcmQoYmxraWYsIHJlcSk7CisJCQl4ZW5fYmxraWZfcHV0KGJsa2lmKTsKKwkJCWZyZWVfcmVxKHBlbmRpbmdfcmVxKTsKKwkJCXJldHVybiAwOworCQl9CiAJfQogCiAJLyoKQEAgLTY4NSw3ICs3NzUsNyBAQAogCiAJaWYgKG9wZXJhdGlvbiA9PSBSRUFEKQogCQlibGtpZi0+c3RfcmRfc2VjdCArPSBwcmVxLm5yX3NlY3RzOwotCWVsc2UgaWYgKG9wZXJhdGlvbiA9PSBXUklURSB8fCBvcGVyYXRpb24gPT0gV1JJVEVfRkxVU0gpCisJZWxzZSBpZiAob3BlcmF0aW9uICYgV1JJVEUpCiAJCWJsa2lmLT5zdF93cl9zZWN0ICs9IHByZXEubnJfc2VjdHM7CiAKIAlyZXR1cm4gMDsKQEAgLTc2NSw5ICs4NTUsOSBAQAogCiAJbW1hcF9wYWdlcyA9IHhlbl9ibGtpZl9yZXFzICogQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUOwogCi0JYmxrYmstPnBlbmRpbmdfcmVxcyAgICAgICAgICA9IGttYWxsb2Moc2l6ZW9mKGJsa2JrLT5wZW5kaW5nX3JlcXNbMF0pICoKKwlibGtiay0+cGVuZGluZ19yZXFzICAgICAgICAgID0ga3phbGxvYyhzaXplb2YoYmxrYmstPnBlbmRpbmdfcmVxc1swXSkgKgogCQkJCQl4ZW5fYmxraWZfcmVxcywgR0ZQX0tFUk5FTCk7Ci0JYmxrYmstPnBlbmRpbmdfZ3JhbnRfaGFuZGxlcyA9IGt6YWxsb2Moc2l6ZW9mKGJsa2JrLT5wZW5kaW5nX2dyYW50X2hhbmRsZXNbMF0pICoKKwlibGtiay0+cGVuZGluZ19ncmFudF9oYW5kbGVzID0ga21hbGxvYyhzaXplb2YoYmxrYmstPnBlbmRpbmdfZ3JhbnRfaGFuZGxlc1swXSkgKgogCQkJCQltbWFwX3BhZ2VzLCBHRlBfS0VSTkVMKTsKIAlibGtiay0+cGVuZGluZ19wYWdlcyAgICAgICAgID0ga3phbGxvYyhzaXplb2YoYmxrYmstPnBlbmRpbmdfcGFnZXNbMF0pICoKIAkJCQkJbW1hcF9wYWdlcywgR0ZQX0tFUk5FTCk7CkBAIC03OTAsOCArODgwLDYgQEAKIAlpZiAocmMpCiAJCWdvdG8gZmFpbGVkX2luaXQ7CiAKLQltZW1zZXQoYmxrYmstPnBlbmRpbmdfcmVxcywgMCwgc2l6ZW9mKGJsa2JrLT5wZW5kaW5nX3JlcXMpKTsKLQogCUlOSVRfTElTVF9IRUFEKCZibGtiay0+cGVuZGluZ19mcmVlKTsKIAlzcGluX2xvY2tfaW5pdCgmYmxrYmstPnBlbmRpbmdfZnJlZV9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZibGtiay0+cGVuZGluZ19mcmVlX3dxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svY29tbW9uLmggYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2NvbW1vbi5oCmluZGV4IGM0YmQzNDAuLmRmYjFiM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svY29tbW9uLmgKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9jb21tb24uaApAQCAtNjIsMTMgKzYyLDI2IEBACiAKIC8qIGkzODYgcHJvdG9jb2wgdmVyc2lvbiAqLwogI3ByYWdtYSBwYWNrKHB1c2gsIDQpCisKK3N0cnVjdCBibGtpZl94ODZfMzJfcmVxdWVzdF9ydyB7CisJYmxraWZfc2VjdG9yX3Qgc2VjdG9yX251bWJlcjsvKiBzdGFydCBzZWN0b3IgaWR4IG9uIGRpc2sgKHIvdyBvbmx5KSAgKi8KKwlzdHJ1Y3QgYmxraWZfcmVxdWVzdF9zZWdtZW50IHNlZ1tCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1RdOworfTsKKworc3RydWN0IGJsa2lmX3g4Nl8zMl9yZXF1ZXN0X2Rpc2NhcmQgeworCWJsa2lmX3NlY3Rvcl90IHNlY3Rvcl9udW1iZXI7Lyogc3RhcnQgc2VjdG9yIGlkeCBvbiBkaXNrIChyL3cgb25seSkgICovCisJdWludDY0X3QgbnJfc2VjdG9yczsKK307CisKIHN0cnVjdCBibGtpZl94ODZfMzJfcmVxdWVzdCB7CiAJdWludDhfdCAgICAgICAgb3BlcmF0aW9uOyAgICAvKiBCTEtJRl9PUF8/Pz8gICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAl1aW50OF90ICAgICAgICBucl9zZWdtZW50czsgIC8qIG51bWJlciBvZiBzZWdtZW50cyAgICAgICAgICAgICAgICAgICAqLwogCWJsa2lmX3ZkZXZfdCAgIGhhbmRsZTsgICAgICAgLyogb25seSBmb3IgcmVhZC93cml0ZSByZXF1ZXN0cyAgICAgICAgICovCiAJdWludDY0X3QgICAgICAgaWQ7ICAgICAgICAgICAvKiBwcml2YXRlIGd1ZXN0IHZhbHVlLCBlY2hvZWQgaW4gcmVzcCAgKi8KLQlibGtpZl9zZWN0b3JfdCBzZWN0b3JfbnVtYmVyOy8qIHN0YXJ0IHNlY3RvciBpZHggb24gZGlzayAoci93IG9ubHkpICAqLwotCXN0cnVjdCBibGtpZl9yZXF1ZXN0X3NlZ21lbnQgc2VnW0JMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVF07CisJdW5pb24geworCQlzdHJ1Y3QgYmxraWZfeDg2XzMyX3JlcXVlc3Rfcncgcnc7CisJCXN0cnVjdCBibGtpZl94ODZfMzJfcmVxdWVzdF9kaXNjYXJkIGRpc2NhcmQ7CisJfSB1OwogfTsKIHN0cnVjdCBibGtpZl94ODZfMzJfcmVzcG9uc2UgewogCXVpbnQ2NF90ICAgICAgICBpZDsgICAgICAgICAgICAgIC8qIGNvcGllZCBmcm9tIHJlcXVlc3QgKi8KQEAgLTc4LDEzICs5MSwyNiBAQAogI3ByYWdtYSBwYWNrKHBvcCkKIAogLyogeDg2XzY0IHByb3RvY29sIHZlcnNpb24gKi8KKworc3RydWN0IGJsa2lmX3g4Nl82NF9yZXF1ZXN0X3J3IHsKKwlibGtpZl9zZWN0b3JfdCBzZWN0b3JfbnVtYmVyOy8qIHN0YXJ0IHNlY3RvciBpZHggb24gZGlzayAoci93IG9ubHkpICAqLworCXN0cnVjdCBibGtpZl9yZXF1ZXN0X3NlZ21lbnQgc2VnW0JMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVF07Cit9OworCitzdHJ1Y3QgYmxraWZfeDg2XzY0X3JlcXVlc3RfZGlzY2FyZCB7CisJYmxraWZfc2VjdG9yX3Qgc2VjdG9yX251bWJlcjsvKiBzdGFydCBzZWN0b3IgaWR4IG9uIGRpc2sgKHIvdyBvbmx5KSAgKi8KKwl1aW50NjRfdCBucl9zZWN0b3JzOworfTsKKwogc3RydWN0IGJsa2lmX3g4Nl82NF9yZXF1ZXN0IHsKIAl1aW50OF90ICAgICAgICBvcGVyYXRpb247ICAgIC8qIEJMS0lGX09QXz8/PyAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCXVpbnQ4X3QgICAgICAgIG5yX3NlZ21lbnRzOyAgLyogbnVtYmVyIG9mIHNlZ21lbnRzICAgICAgICAgICAgICAgICAgICovCiAJYmxraWZfdmRldl90ICAgaGFuZGxlOyAgICAgICAvKiBvbmx5IGZvciByZWFkL3dyaXRlIHJlcXVlc3RzICAgICAgICAgKi8KIAl1aW50NjRfdCAgICAgICBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpIGlkOwotCWJsa2lmX3NlY3Rvcl90IHNlY3Rvcl9udW1iZXI7Lyogc3RhcnQgc2VjdG9yIGlkeCBvbiBkaXNrIChyL3cgb25seSkgICovCi0Jc3RydWN0IGJsa2lmX3JlcXVlc3Rfc2VnbWVudCBzZWdbQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUXTsKKwl1bmlvbiB7CisJCXN0cnVjdCBibGtpZl94ODZfNjRfcmVxdWVzdF9ydyBydzsKKwkJc3RydWN0IGJsa2lmX3g4Nl82NF9yZXF1ZXN0X2Rpc2NhcmQgZGlzY2FyZDsKKwl9IHU7CiB9Owogc3RydWN0IGJsa2lmX3g4Nl82NF9yZXNwb25zZSB7CiAJdWludDY0X3QgICAgICAgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oOCkpKSBpZDsKQEAgLTExMiw2ICsxMzgsMTEgQEAKIAlCTEtJRl9QUk9UT0NPTF9YODZfNjQgPSAzLAogfTsKIAorZW51bSBibGtpZl9iYWNrZW5kX3R5cGUgeworCUJMS0lGX0JBQ0tFTkRfUEhZICA9IDEsCisJQkxLSUZfQkFDS0VORF9GSUxFID0gMiwKK307CisKIHN0cnVjdCB4ZW5fdmJkIHsKIAkvKiBXaGF0IHRoZSBkb21haW4gcmVmZXJzIHRvIHRoaXMgdmJkIGFzLiAqLwogCWJsa2lmX3ZkZXZfdAkJaGFuZGxlOwpAQCAtMTM3LDggKzE2OCw5IEBACiAJdW5zaWduZWQgaW50CQlpcnE7CiAJLyogQ29tbXMgaW5mb3JtYXRpb24uICovCiAJZW51bSBibGtpZl9wcm90b2NvbAlibGtfcHJvdG9jb2w7CisJZW51bSBibGtpZl9iYWNrZW5kX3R5cGUgYmxrX2JhY2tlbmRfdHlwZTsKIAl1bmlvbiBibGtpZl9iYWNrX3JpbmdzCWJsa19yaW5nczsKLQlzdHJ1Y3Qgdm1fc3RydWN0CSpibGtfcmluZ19hcmVhOworCXZvaWQJCQkqYmxrX3Jpbmc7CiAJLyogVGhlIFZCRCBhdHRhY2hlZCB0byB0aGlzIGludGVyZmFjZS4gKi8KIAlzdHJ1Y3QgeGVuX3ZiZAkJdmJkOwogCS8qIEJhY2sgcG9pbnRlciB0byB0aGUgYmFja2VuZF9pbmZvLiAqLwpAQCAtMTQ4LDYgKzE4MCw5IEBACiAJYXRvbWljX3QJCXJlZmNudDsKIAogCXdhaXRfcXVldWVfaGVhZF90CXdxOworCS8qIGZvciBiYXJyaWVyIChkcmFpbikgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbglkcmFpbl9jb21wbGV0ZTsKKwlhdG9taWNfdAkJZHJhaW47CiAJLyogT25lIHRocmVhZCBwZXIgb25lIGJsa2lmLiAqLwogCXN0cnVjdCB0YXNrX3N0cnVjdAkqeGVuYmxrZDsKIAl1bnNpZ25lZCBpbnQJCXdhaXRpbmdfcmVxczsKQEAgLTE1OCwxMyArMTkzLDExIEBACiAJaW50CQkJc3Rfd3JfcmVxOwogCWludAkJCXN0X29vX3JlcTsKIAlpbnQJCQlzdF9mX3JlcTsKKwlpbnQJCQlzdF9kc19yZXE7CiAJaW50CQkJc3RfcmRfc2VjdDsKIAlpbnQJCQlzdF93cl9zZWN0OwogCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdGluZ190b19mcmVlOwotCi0JZ3JhbnRfaGFuZGxlX3QJCXNobWVtX2hhbmRsZTsKLQlncmFudF9yZWZfdAkJc2htZW1fcmVmOwogfTsKIAogCkBAIC0xODEsNyArMjE0LDcgQEAKIAogc3RydWN0IHBoeXNfcmVxIHsKIAl1bnNpZ25lZCBzaG9ydAkJZGV2OwotCXVuc2lnbmVkIHNob3J0CQlucl9zZWN0czsKKwlibGtpZl9zZWN0b3JfdAkJbnJfc2VjdHM7CiAJc3RydWN0IGJsb2NrX2RldmljZQkqYmRldjsKIAlibGtpZl9zZWN0b3JfdAkJc2VjdG9yX251bWJlcjsKIH07CkBAIC0xOTUsNiArMjI4LDggQEAKIGludCB4ZW5fYmxrYmtfZmx1c2hfZGlza2NhY2hlKHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24geGJ0LAogCQkJICAgICAgc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUsIGludCBzdGF0ZSk7CiAKK2ludCB4ZW5fYmxrYmtfYmFycmllcihzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHhidCwKKwkJICAgICAgc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUsIGludCBzdGF0ZSk7CiBzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGVuX2Jsa2JrX3hlbmJ1cyhzdHJ1Y3QgYmFja2VuZF9pbmZvICpiZSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBibGtpZl9nZXRfeDg2XzMyX3JlcShzdHJ1Y3QgYmxraWZfcmVxdWVzdCAqZHN0LApAQCAtMjA1LDEyICsyNDAsMjUgQEAKIAlkc3QtPm5yX3NlZ21lbnRzID0gc3JjLT5ucl9zZWdtZW50czsKIAlkc3QtPmhhbmRsZSA9IHNyYy0+aGFuZGxlOwogCWRzdC0+aWQgPSBzcmMtPmlkOwotCWRzdC0+dS5ydy5zZWN0b3JfbnVtYmVyID0gc3JjLT5zZWN0b3JfbnVtYmVyOwotCWJhcnJpZXIoKTsKLQlpZiAobiA+IGRzdC0+bnJfc2VnbWVudHMpCi0JCW4gPSBkc3QtPm5yX3NlZ21lbnRzOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JCWRzdC0+dS5ydy5zZWdbaV0gPSBzcmMtPnNlZ1tpXTsKKwlzd2l0Y2ggKHNyYy0+b3BlcmF0aW9uKSB7CisJY2FzZSBCTEtJRl9PUF9SRUFEOgorCWNhc2UgQkxLSUZfT1BfV1JJVEU6CisJY2FzZSBCTEtJRl9PUF9XUklURV9CQVJSSUVSOgorCWNhc2UgQkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOgorCQlkc3QtPnUucncuc2VjdG9yX251bWJlciA9IHNyYy0+dS5ydy5zZWN0b3JfbnVtYmVyOworCQliYXJyaWVyKCk7CisJCWlmIChuID4gZHN0LT5ucl9zZWdtZW50cykKKwkJCW4gPSBkc3QtPm5yX3NlZ21lbnRzOworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJZHN0LT51LnJ3LnNlZ1tpXSA9IHNyYy0+dS5ydy5zZWdbaV07CisJCWJyZWFrOworCWNhc2UgQkxLSUZfT1BfRElTQ0FSRDoKKwkJZHN0LT51LmRpc2NhcmQuc2VjdG9yX251bWJlciA9IHNyYy0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXI7CisJCWRzdC0+dS5kaXNjYXJkLm5yX3NlY3RvcnMgPSBzcmMtPnUuZGlzY2FyZC5ucl9zZWN0b3JzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBibGtpZl9nZXRfeDg2XzY0X3JlcShzdHJ1Y3QgYmxraWZfcmVxdWVzdCAqZHN0LApAQCAtMjIxLDEyICsyNjksMjUgQEAKIAlkc3QtPm5yX3NlZ21lbnRzID0gc3JjLT5ucl9zZWdtZW50czsKIAlkc3QtPmhhbmRsZSA9IHNyYy0+aGFuZGxlOwogCWRzdC0+aWQgPSBzcmMtPmlkOwotCWRzdC0+dS5ydy5zZWN0b3JfbnVtYmVyID0gc3JjLT5zZWN0b3JfbnVtYmVyOwotCWJhcnJpZXIoKTsKLQlpZiAobiA+IGRzdC0+bnJfc2VnbWVudHMpCi0JCW4gPSBkc3QtPm5yX3NlZ21lbnRzOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JCWRzdC0+dS5ydy5zZWdbaV0gPSBzcmMtPnNlZ1tpXTsKKwlzd2l0Y2ggKHNyYy0+b3BlcmF0aW9uKSB7CisJY2FzZSBCTEtJRl9PUF9SRUFEOgorCWNhc2UgQkxLSUZfT1BfV1JJVEU6CisJY2FzZSBCTEtJRl9PUF9XUklURV9CQVJSSUVSOgorCWNhc2UgQkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOgorCQlkc3QtPnUucncuc2VjdG9yX251bWJlciA9IHNyYy0+dS5ydy5zZWN0b3JfbnVtYmVyOworCQliYXJyaWVyKCk7CisJCWlmIChuID4gZHN0LT5ucl9zZWdtZW50cykKKwkJCW4gPSBkc3QtPm5yX3NlZ21lbnRzOworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJZHN0LT51LnJ3LnNlZ1tpXSA9IHNyYy0+dS5ydy5zZWdbaV07CisJCWJyZWFrOworCWNhc2UgQkxLSUZfT1BfRElTQ0FSRDoKKwkJZHN0LT51LmRpc2NhcmQuc2VjdG9yX251bWJlciA9IHNyYy0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXI7CisJCWRzdC0+dS5kaXNjYXJkLm5yX3NlY3RvcnMgPSBzcmMtPnUuZGlzY2FyZC5ucl9zZWN0b3JzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiB9CiAKICNlbmRpZiAvKiBfX1hFTl9CTEtJRl9fQkFDS0VORF9fQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVzLmMKaW5kZXggNWZkMjAxMC4uZjc1OWFkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jCkBAIC0xMTQsNDQgKzExNCwxNCBAQAogCXNwaW5fbG9ja19pbml0KCZibGtpZi0+YmxrX3JpbmdfbG9jayk7CiAJYXRvbWljX3NldCgmYmxraWYtPnJlZmNudCwgMSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYmxraWYtPndxKTsKKwlpbml0X2NvbXBsZXRpb24oJmJsa2lmLT5kcmFpbl9jb21wbGV0ZSk7CisJYXRvbWljX3NldCgmYmxraWYtPmRyYWluLCAwKTsKIAlibGtpZi0+c3RfcHJpbnQgPSBqaWZmaWVzOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJsa2lmLT53YWl0aW5nX3RvX2ZyZWUpOwogCiAJcmV0dXJuIGJsa2lmOwogfQogCi1zdGF0aWMgaW50IG1hcF9mcm9udGVuZF9wYWdlKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmLCB1bnNpZ25lZCBsb25nIHNoYXJlZF9wYWdlKQotewotCXN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiBvcDsKLQotCWdudHRhYl9zZXRfbWFwX29wKCZvcCwgKHVuc2lnbmVkIGxvbmcpYmxraWYtPmJsa19yaW5nX2FyZWEtPmFkZHIsCi0JCQkgIEdOVE1BUF9ob3N0X21hcCwgc2hhcmVkX3BhZ2UsIGJsa2lmLT5kb21pZCk7Ci0KLQlpZiAoSFlQRVJWSVNPUl9ncmFudF90YWJsZV9vcChHTlRUQUJPUF9tYXBfZ3JhbnRfcmVmLCAmb3AsIDEpKQotCQlCVUcoKTsKLQotCWlmIChvcC5zdGF0dXMpIHsKLQkJRFBSSU5USygiR3JhbnQgdGFibGUgb3BlcmF0aW9uIGZhaWx1cmUgIVxuIik7Ci0JCXJldHVybiBvcC5zdGF0dXM7Ci0JfQotCi0JYmxraWYtPnNobWVtX3JlZiA9IHNoYXJlZF9wYWdlOwotCWJsa2lmLT5zaG1lbV9oYW5kbGUgPSBvcC5oYW5kbGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdW5tYXBfZnJvbnRlbmRfcGFnZShzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZikKLXsKLQlzdHJ1Y3QgZ250dGFiX3VubWFwX2dyYW50X3JlZiBvcDsKLQotCWdudHRhYl9zZXRfdW5tYXBfb3AoJm9wLCAodW5zaWduZWQgbG9uZylibGtpZi0+YmxrX3JpbmdfYXJlYS0+YWRkciwKLQkJCSAgICBHTlRNQVBfaG9zdF9tYXAsIGJsa2lmLT5zaG1lbV9oYW5kbGUpOwotCi0JaWYgKEhZUEVSVklTT1JfZ3JhbnRfdGFibGVfb3AoR05UVEFCT1BfdW5tYXBfZ3JhbnRfcmVmLCAmb3AsIDEpKQotCQlCVUcoKTsKLX0KLQogc3RhdGljIGludCB4ZW5fYmxraWZfbWFwKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmLCB1bnNpZ25lZCBsb25nIHNoYXJlZF9wYWdlLAogCQkJIHVuc2lnbmVkIGludCBldnRjaG4pCiB7CkBAIC0xNjEsMzUgKzEzMSwyOSBAQAogCWlmIChibGtpZi0+aXJxKQogCQlyZXR1cm4gMDsKIAotCWJsa2lmLT5ibGtfcmluZ19hcmVhID0gYWxsb2Nfdm1fYXJlYShQQUdFX1NJWkUpOwotCWlmICghYmxraWYtPmJsa19yaW5nX2FyZWEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gbWFwX2Zyb250ZW5kX3BhZ2UoYmxraWYsIHNoYXJlZF9wYWdlKTsKLQlpZiAoZXJyKSB7Ci0JCWZyZWVfdm1fYXJlYShibGtpZi0+YmxrX3JpbmdfYXJlYSk7CisJZXJyID0geGVuYnVzX21hcF9yaW5nX3ZhbGxvYyhibGtpZi0+YmUtPmRldiwgc2hhcmVkX3BhZ2UsICZibGtpZi0+YmxrX3JpbmcpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCXN3aXRjaCAoYmxraWYtPmJsa19wcm90b2NvbCkgewogCWNhc2UgQkxLSUZfUFJPVE9DT0xfTkFUSVZFOgogCXsKIAkJc3RydWN0IGJsa2lmX3NyaW5nICpzcmluZzsKLQkJc3JpbmcgPSAoc3RydWN0IGJsa2lmX3NyaW5nICopYmxraWYtPmJsa19yaW5nX2FyZWEtPmFkZHI7CisJCXNyaW5nID0gKHN0cnVjdCBibGtpZl9zcmluZyAqKWJsa2lmLT5ibGtfcmluZzsKIAkJQkFDS19SSU5HX0lOSVQoJmJsa2lmLT5ibGtfcmluZ3MubmF0aXZlLCBzcmluZywgUEFHRV9TSVpFKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgQkxLSUZfUFJPVE9DT0xfWDg2XzMyOgogCXsKIAkJc3RydWN0IGJsa2lmX3g4Nl8zMl9zcmluZyAqc3JpbmdfeDg2XzMyOwotCQlzcmluZ194ODZfMzIgPSAoc3RydWN0IGJsa2lmX3g4Nl8zMl9zcmluZyAqKWJsa2lmLT5ibGtfcmluZ19hcmVhLT5hZGRyOworCQlzcmluZ194ODZfMzIgPSAoc3RydWN0IGJsa2lmX3g4Nl8zMl9zcmluZyAqKWJsa2lmLT5ibGtfcmluZzsKIAkJQkFDS19SSU5HX0lOSVQoJmJsa2lmLT5ibGtfcmluZ3MueDg2XzMyLCBzcmluZ194ODZfMzIsIFBBR0VfU0laRSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIEJMS0lGX1BST1RPQ09MX1g4Nl82NDoKIAl7CiAJCXN0cnVjdCBibGtpZl94ODZfNjRfc3JpbmcgKnNyaW5nX3g4Nl82NDsKLQkJc3JpbmdfeDg2XzY0ID0gKHN0cnVjdCBibGtpZl94ODZfNjRfc3JpbmcgKilibGtpZi0+YmxrX3JpbmdfYXJlYS0+YWRkcjsKKwkJc3JpbmdfeDg2XzY0ID0gKHN0cnVjdCBibGtpZl94ODZfNjRfc3JpbmcgKilibGtpZi0+YmxrX3Jpbmc7CiAJCUJBQ0tfUklOR19JTklUKCZibGtpZi0+YmxrX3JpbmdzLng4Nl82NCwgc3JpbmdfeDg2XzY0LCBQQUdFX1NJWkUpOwogCQlicmVhazsKIAl9CkBAIC0yMDEsOCArMTY1LDcgQEAKIAkJCQkJCSAgICB4ZW5fYmxraWZfYmVfaW50LCAwLAogCQkJCQkJICAgICJibGtpZi1iYWNrZW5kIiwgYmxraWYpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXVubWFwX2Zyb250ZW5kX3BhZ2UoYmxraWYpOwotCQlmcmVlX3ZtX2FyZWEoYmxraWYtPmJsa19yaW5nX2FyZWEpOworCQl4ZW5idXNfdW5tYXBfcmluZ192ZnJlZShibGtpZi0+YmUtPmRldiwgYmxraWYtPmJsa19yaW5nKTsKIAkJYmxraWYtPmJsa19yaW5ncy5jb21tb24uc3JpbmcgPSBOVUxMOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTIyOCw4ICsxOTEsNyBAQAogCX0KIAogCWlmIChibGtpZi0+YmxrX3JpbmdzLmNvbW1vbi5zcmluZykgewotCQl1bm1hcF9mcm9udGVuZF9wYWdlKGJsa2lmKTsKLQkJZnJlZV92bV9hcmVhKGJsa2lmLT5ibGtfcmluZ19hcmVhKTsKKwkJeGVuYnVzX3VubWFwX3JpbmdfdmZyZWUoYmxraWYtPmJlLT5kZXYsIGJsa2lmLT5ibGtfcmluZyk7CiAJCWJsa2lmLT5ibGtfcmluZ3MuY29tbW9uLnNyaW5nID0gTlVMTDsKIAl9CiB9CkBAIC0yNzIsNiArMjM0LDcgQEAKIFZCRF9TSE9XKHJkX3JlcSwgICIlZFxuIiwgYmUtPmJsa2lmLT5zdF9yZF9yZXEpOwogVkJEX1NIT1cod3JfcmVxLCAgIiVkXG4iLCBiZS0+YmxraWYtPnN0X3dyX3JlcSk7CiBWQkRfU0hPVyhmX3JlcSwgICIlZFxuIiwgYmUtPmJsa2lmLT5zdF9mX3JlcSk7CitWQkRfU0hPVyhkc19yZXEsICAiJWRcbiIsIGJlLT5ibGtpZi0+c3RfZHNfcmVxKTsKIFZCRF9TSE9XKHJkX3NlY3QsICIlZFxuIiwgYmUtPmJsa2lmLT5zdF9yZF9zZWN0KTsKIFZCRF9TSE9XKHdyX3NlY3QsICIlZFxuIiwgYmUtPmJsa2lmLT5zdF93cl9zZWN0KTsKIApAQCAtMjgwLDYgKzI0Myw3IEBACiAJJmRldl9hdHRyX3JkX3JlcS5hdHRyLAogCSZkZXZfYXR0cl93cl9yZXEuYXR0ciwKIAkmZGV2X2F0dHJfZl9yZXEuYXR0ciwKKwkmZGV2X2F0dHJfZHNfcmVxLmF0dHIsCiAJJmRldl9hdHRyX3JkX3NlY3QuYXR0ciwKIAkmZGV2X2F0dHJfd3Jfc2VjdC5hdHRyLAogCU5VTEwKQEAgLTQxOSw2ICszODMsNzMgQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgeGVuX2Jsa2JrX2Rpc2NhcmQoc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbiB4YnQsIHN0cnVjdCBiYWNrZW5kX2luZm8gKmJlKQoreworCXN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYgPSBiZS0+ZGV2OworCXN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmID0gYmUtPmJsa2lmOworCWNoYXIgKnR5cGU7CisJaW50IGVycjsKKwlpbnQgc3RhdGUgPSAwOworCisJdHlwZSA9IHhlbmJ1c19yZWFkKFhCVF9OSUwsIGRldi0+bm9kZW5hbWUsICJ0eXBlIiwgTlVMTCk7CisJaWYgKCFJU19FUlIodHlwZSkpIHsKKwkJaWYgKHN0cm5jbXAodHlwZSwgImZpbGUiLCA0KSA9PSAwKSB7CisJCQlzdGF0ZSA9IDE7CisJCQlibGtpZi0+YmxrX2JhY2tlbmRfdHlwZSA9IEJMS0lGX0JBQ0tFTkRfRklMRTsKKwkJfQorCQlpZiAoc3RybmNtcCh0eXBlLCAicGh5IiwgMykgPT0gMCkgeworCQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGJlLT5ibGtpZi0+dmJkLmJkZXY7CisJCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOworCQkJaWYgKGJsa19xdWV1ZV9kaXNjYXJkKHEpKSB7CisJCQkJZXJyID0geGVuYnVzX3ByaW50Zih4YnQsIGRldi0+bm9kZW5hbWUsCisJCQkJCSJkaXNjYXJkLWdyYW51bGFyaXR5IiwgIiV1IiwKKwkJCQkJcS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwKKwkJCQkJCSJ3cml0aW5nIGRpc2NhcmQtZ3JhbnVsYXJpdHkiKTsKKwkJCQkJZ290byBrZnJlZTsKKwkJCQl9CisJCQkJZXJyID0geGVuYnVzX3ByaW50Zih4YnQsIGRldi0+bm9kZW5hbWUsCisJCQkJCSJkaXNjYXJkLWFsaWdubWVudCIsICIldSIsCisJCQkJCXEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCk7CisJCQkJaWYgKGVycikgeworCQkJCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgZXJyLAorCQkJCQkJIndyaXRpbmcgZGlzY2FyZC1hbGlnbm1lbnQiKTsKKwkJCQkJZ290byBrZnJlZTsKKwkJCQl9CisJCQkJc3RhdGUgPSAxOworCQkJCWJsa2lmLT5ibGtfYmFja2VuZF90eXBlID0gQkxLSUZfQkFDS0VORF9QSFk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQllcnIgPSBQVFJfRVJSKHR5cGUpOworCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgZXJyLCAicmVhZGluZyB0eXBlIik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLCAiZmVhdHVyZS1kaXNjYXJkIiwKKwkJCSAgICAiJWQiLCBzdGF0ZSk7CisJaWYgKGVycikKKwkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwgIndyaXRpbmcgZmVhdHVyZS1kaXNjYXJkIik7CitrZnJlZToKKwlrZnJlZSh0eXBlKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQoraW50IHhlbl9ibGtia19iYXJyaWVyKHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24geGJ0LAorCQkgICAgICBzdHJ1Y3QgYmFja2VuZF9pbmZvICpiZSwgaW50IHN0YXRlKQoreworCXN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYgPSBiZS0+ZGV2OworCWludCBlcnI7CisKKwllcnIgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgImZlYXR1cmUtYmFycmllciIsCisJCQkgICAgIiVkIiwgc3RhdGUpOworCWlmIChlcnIpCisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsICJ3cml0aW5nIGZlYXR1cmUtYmFycmllciIpOworCisJcmV0dXJuIGVycjsKK30KKwogLyoKICAqIEVudHJ5IHBvaW50IHRvIHRoaXMgY29kZSB3aGVuIGEgbmV3IGRldmljZSBpcyBjcmVhdGVkLiAgQWxsb2NhdGUgdGhlIGJhc2ljCiAgKiBzdHJ1Y3R1cmVzLCBhbmQgd2F0Y2ggdGhlIHN0b3JlIHdhaXRpbmcgZm9yIHRoZSBob3RwbHVnIHNjcmlwdHMgdG8gdGVsbCB1cwpAQCAtNjUwLDYgKzY4MSwxMSBAQAogCWlmIChlcnIpCiAJCWdvdG8gYWJvcnQ7CiAKKwllcnIgPSB4ZW5fYmxrYmtfZGlzY2FyZCh4YnQsIGJlKTsKKworCS8qIElmIHdlIGNhbid0IGFkdmVydGlzZSBpdCBpcyBPSy4gKi8KKwllcnIgPSB4ZW5fYmxrYmtfYmFycmllcih4YnQsIGJlLCBiZS0+YmxraWYtPnZiZC5mbHVzaF9zdXBwb3J0KTsKKwogCWVyciA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLCAic2VjdG9ycyIsICIlbGx1IiwKIAkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXZiZF9zeigmYmUtPmJsa2lmLT52YmQpKTsKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYwppbmRleCA5ZWE4YzI1Li43YjJlYzU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCisrKyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKQEAgLTk4LDYgKzk4LDkgQEAKIAl1bnNpZ25lZCBsb25nIHNoYWRvd19mcmVlOwogCXVuc2lnbmVkIGludCBmZWF0dXJlX2ZsdXNoOwogCXVuc2lnbmVkIGludCBmbHVzaF9vcDsKKwl1bnNpZ25lZCBpbnQgZmVhdHVyZV9kaXNjYXJkOworCXVuc2lnbmVkIGludCBkaXNjYXJkX2dyYW51bGFyaXR5OworCXVuc2lnbmVkIGludCBkaXNjYXJkX2FsaWdubWVudDsKIAlpbnQgaXNfcmVhZHk7CiB9OwogCkBAIC0zMDIsMjkgKzMwNSwzNiBAQAogCQlyaW5nX3JlcS0+b3BlcmF0aW9uID0gaW5mby0+Zmx1c2hfb3A7CiAJfQogCi0JcmluZ19yZXEtPm5yX3NlZ21lbnRzID0gYmxrX3JxX21hcF9zZyhyZXEtPnEsIHJlcSwgaW5mby0+c2cpOwotCUJVR19PTihyaW5nX3JlcS0+bnJfc2VnbWVudHMgPiBCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1QpOworCWlmICh1bmxpa2VseShyZXEtPmNtZF9mbGFncyAmIFJFUV9ESVNDQVJEKSkgeworCQkvKiBpZCwgc2VjdG9yX251bWJlciBhbmQgaGFuZGxlIGFyZSBzZXQgYWJvdmUuICovCisJCXJpbmdfcmVxLT5vcGVyYXRpb24gPSBCTEtJRl9PUF9ESVNDQVJEOworCQlyaW5nX3JlcS0+bnJfc2VnbWVudHMgPSAwOworCQlyaW5nX3JlcS0+dS5kaXNjYXJkLm5yX3NlY3RvcnMgPSBibGtfcnFfc2VjdG9ycyhyZXEpOworCX0gZWxzZSB7CisJCXJpbmdfcmVxLT5ucl9zZWdtZW50cyA9IGJsa19ycV9tYXBfc2cocmVxLT5xLCByZXEsIGluZm8tPnNnKTsKKwkJQlVHX09OKHJpbmdfcmVxLT5ucl9zZWdtZW50cyA+IEJMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVCk7CiAKLQlmb3JfZWFjaF9zZyhpbmZvLT5zZywgc2csIHJpbmdfcmVxLT5ucl9zZWdtZW50cywgaSkgewotCQlidWZmZXJfbWZuID0gcGZuX3RvX21mbihwYWdlX3RvX3BmbihzZ19wYWdlKHNnKSkpOwotCQlmc2VjdCA9IHNnLT5vZmZzZXQgPj4gOTsKLQkJbHNlY3QgPSBmc2VjdCArIChzZy0+bGVuZ3RoID4+IDkpIC0gMTsKLQkJLyogaW5zdGFsbCBhIGdyYW50IHJlZmVyZW5jZS4gKi8KLQkJcmVmID0gZ250dGFiX2NsYWltX2dyYW50X3JlZmVyZW5jZSgmZ3JlZl9oZWFkKTsKLQkJQlVHX09OKHJlZiA9PSAtRU5PU1BDKTsKKwkJZm9yX2VhY2hfc2coaW5mby0+c2csIHNnLCByaW5nX3JlcS0+bnJfc2VnbWVudHMsIGkpIHsKKwkJCWJ1ZmZlcl9tZm4gPSBwZm5fdG9fbWZuKHBhZ2VfdG9fcGZuKHNnX3BhZ2Uoc2cpKSk7CisJCQlmc2VjdCA9IHNnLT5vZmZzZXQgPj4gOTsKKwkJCWxzZWN0ID0gZnNlY3QgKyAoc2ctPmxlbmd0aCA+PiA5KSAtIDE7CisJCQkvKiBpbnN0YWxsIGEgZ3JhbnQgcmVmZXJlbmNlLiAqLworCQkJcmVmID0gZ250dGFiX2NsYWltX2dyYW50X3JlZmVyZW5jZSgmZ3JlZl9oZWFkKTsKKwkJCUJVR19PTihyZWYgPT0gLUVOT1NQQyk7CiAKLQkJZ250dGFiX2dyYW50X2ZvcmVpZ25fYWNjZXNzX3JlZigKLQkJCQlyZWYsCi0JCQkJaW5mby0+eGJkZXYtPm90aGVyZW5kX2lkLAotCQkJCWJ1ZmZlcl9tZm4sCi0JCQkJcnFfZGF0YV9kaXIocmVxKSApOworCQkJZ250dGFiX2dyYW50X2ZvcmVpZ25fYWNjZXNzX3JlZigKKwkJCQkJcmVmLAorCQkJCQlpbmZvLT54YmRldi0+b3RoZXJlbmRfaWQsCisJCQkJCWJ1ZmZlcl9tZm4sCisJCQkJCXJxX2RhdGFfZGlyKHJlcSkpOwogCi0JCWluZm8tPnNoYWRvd1tpZF0uZnJhbWVbaV0gPSBtZm5fdG9fcGZuKGJ1ZmZlcl9tZm4pOwotCQlyaW5nX3JlcS0+dS5ydy5zZWdbaV0gPQotCQkJCShzdHJ1Y3QgYmxraWZfcmVxdWVzdF9zZWdtZW50KSB7Ci0JCQkJCS5ncmVmICAgICAgID0gcmVmLAotCQkJCQkuZmlyc3Rfc2VjdCA9IGZzZWN0LAotCQkJCQkubGFzdF9zZWN0ICA9IGxzZWN0IH07CisJCQlpbmZvLT5zaGFkb3dbaWRdLmZyYW1lW2ldID0gbWZuX3RvX3BmbihidWZmZXJfbWZuKTsKKwkJCXJpbmdfcmVxLT51LnJ3LnNlZ1tpXSA9CisJCQkJCShzdHJ1Y3QgYmxraWZfcmVxdWVzdF9zZWdtZW50KSB7CisJCQkJCQkuZ3JlZiAgICAgICA9IHJlZiwKKwkJCQkJCS5maXJzdF9zZWN0ID0gZnNlY3QsCisJCQkJCQkubGFzdF9zZWN0ICA9IGxzZWN0IH07CisJCX0KIAl9CiAKIAlpbmZvLT5yaW5nLnJlcV9wcm9kX3B2dCsrOwpAQCAtMzcwLDcgKzM4MCw5IEBACiAKIAkJYmxrX3N0YXJ0X3JlcXVlc3QocmVxKTsKIAotCQlpZiAocmVxLT5jbWRfdHlwZSAhPSBSRVFfVFlQRV9GUykgeworCQlpZiAoKHJlcS0+Y21kX3R5cGUgIT0gUkVRX1RZUEVfRlMpIHx8CisJCSAgICAoKHJlcS0+Y21kX2ZsYWdzICYgKFJFUV9GTFVTSCB8IFJFUV9GVUEpKSAmJgorCQkgICAgIWluZm8tPmZsdXNoX29wKSkgewogCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgLUVJTyk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMzk5LDYgKzQxMSw3IEBACiBzdGF0aWMgaW50IHhsdmJkX2luaXRfYmxrX3F1ZXVlKHN0cnVjdCBnZW5kaXNrICpnZCwgdTE2IHNlY3Rvcl9zaXplKQogewogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycTsKKwlzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbyA9IGdkLT5wcml2YXRlX2RhdGE7CiAKIAlycSA9IGJsa19pbml0X3F1ZXVlKGRvX2Jsa2lmX3JlcXVlc3QsICZibGtpZl9pb19sb2NrKTsKIAlpZiAocnEgPT0gTlVMTCkKQEAgLTQwNiw2ICs0MTksMTMgQEAKIAogCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfVklSVCwgcnEpOwogCisJaWYgKGluZm8tPmZlYXR1cmVfZGlzY2FyZCkgeworCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX0RJU0NBUkQsIHJxKTsKKwkJYmxrX3F1ZXVlX21heF9kaXNjYXJkX3NlY3RvcnMocnEsIGdldF9jYXBhY2l0eShnZCkpOworCQlycS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSBpbmZvLT5kaXNjYXJkX2dyYW51bGFyaXR5OworCQlycS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50ID0gaW5mby0+ZGlzY2FyZF9hbGlnbm1lbnQ7CisJfQorCiAJLyogSGFyZCBzZWN0b3Igc2l6ZSBhbmQgbWF4IHNlY3RvcnMgaW1wZXJzb25hdGUgdGhlIGVxdWl2LiBoYXJkd2FyZS4gKi8KIAlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHJxLCBzZWN0b3Jfc2l6ZSk7CiAJYmxrX3F1ZXVlX21heF9od19zZWN0b3JzKHJxLCA1MTIpOwpAQCAtNzIyLDYgKzc0MiwxNyBAQAogCiAJCWVycm9yID0gKGJyZXQtPnN0YXR1cyA9PSBCTEtJRl9SU1BfT0tBWSkgPyAwIDogLUVJTzsKIAkJc3dpdGNoIChicmV0LT5vcGVyYXRpb24pIHsKKwkJY2FzZSBCTEtJRl9PUF9ESVNDQVJEOgorCQkJaWYgKHVubGlrZWx5KGJyZXQtPnN0YXR1cyA9PSBCTEtJRl9SU1BfRU9QTk9UU1VQUCkpIHsKKwkJCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcnEgPSBpbmZvLT5ycTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJibGtmcm9udDogJXM6IGRpc2NhcmQgb3AgZmFpbGVkXG4iLAorCQkJCQkgICBpbmZvLT5nZC0+ZGlza19uYW1lKTsKKwkJCQllcnJvciA9IC1FT1BOT1RTVVBQOworCQkJCWluZm8tPmZlYXR1cmVfZGlzY2FyZCA9IDA7CisJCQkJcXVldWVfZmxhZ19jbGVhcihRVUVVRV9GTEFHX0RJU0NBUkQsIHJxKTsKKwkJCX0KKwkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIGVycm9yKTsKKwkJCWJyZWFrOwogCQljYXNlIEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRToKIAkJY2FzZSBCTEtJRl9PUF9XUklURV9CQVJSSUVSOgogCQkJaWYgKHVubGlrZWx5KGJyZXQtPnN0YXR1cyA9PSBCTEtJRl9SU1BfRU9QTk9UU1VQUCkpIHsKQEAgLTEwOTgsNiArMTEyOSwzMyBAQAogCWJkcHV0KGJkZXYpOwogfQogCitzdGF0aWMgdm9pZCBibGtmcm9udF9zZXR1cF9kaXNjYXJkKHN0cnVjdCBibGtmcm9udF9pbmZvICppbmZvKQoreworCWludCBlcnI7CisJY2hhciAqdHlwZTsKKwl1bnNpZ25lZCBpbnQgZGlzY2FyZF9ncmFudWxhcml0eTsKKwl1bnNpZ25lZCBpbnQgZGlzY2FyZF9hbGlnbm1lbnQ7CisKKwl0eXBlID0geGVuYnVzX3JlYWQoWEJUX05JTCwgaW5mby0+eGJkZXYtPm90aGVyZW5kLCAidHlwZSIsIE5VTEwpOworCWlmIChJU19FUlIodHlwZSkpCisJCXJldHVybjsKKworCWlmIChzdHJuY21wKHR5cGUsICJwaHkiLCAzKSA9PSAwKSB7CisJCWVyciA9IHhlbmJ1c19nYXRoZXIoWEJUX05JTCwgaW5mby0+eGJkZXYtPm90aGVyZW5kLAorCQkJImRpc2NhcmQtZ3JhbnVsYXJpdHkiLCAiJXUiLCAmZGlzY2FyZF9ncmFudWxhcml0eSwKKwkJCSJkaXNjYXJkLWFsaWdubWVudCIsICIldSIsICZkaXNjYXJkX2FsaWdubWVudCwKKwkJCU5VTEwpOworCQlpZiAoIWVycikgeworCQkJaW5mby0+ZmVhdHVyZV9kaXNjYXJkID0gMTsKKwkJCWluZm8tPmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSBkaXNjYXJkX2dyYW51bGFyaXR5OworCQkJaW5mby0+ZGlzY2FyZF9hbGlnbm1lbnQgPSBkaXNjYXJkX2FsaWdubWVudDsKKwkJfQorCX0gZWxzZSBpZiAoc3RybmNtcCh0eXBlLCAiZmlsZSIsIDQpID09IDApCisJCWluZm8tPmZlYXR1cmVfZGlzY2FyZCA9IDE7CisKKwlrZnJlZSh0eXBlKTsKK30KKwogLyoKICAqIEludm9rZWQgd2hlbiB0aGUgYmFja2VuZCBpcyBmaW5hbGx5ICdyZWFkeScgKGFuZCBoYXMgdG9sZCBwcm9kdWNlZAogICogdGhlIGRldGFpbHMgYWJvdXQgdGhlIHBoeXNpY2FsIGRldmljZSAtICNzZWN0b3JzLCBzaXplLCBldGMpLgpAQCAtMTEwOCw3ICsxMTY2LDcgQEAKIAl1bnNpZ25lZCBsb25nIHNlY3Rvcl9zaXplOwogCXVuc2lnbmVkIGludCBiaW5mbzsKIAlpbnQgZXJyOwotCWludCBiYXJyaWVyLCBmbHVzaDsKKwlpbnQgYmFycmllciwgZmx1c2gsIGRpc2NhcmQ7CiAKIAlzd2l0Y2ggKGluZm8tPmNvbm5lY3RlZCkgewogCWNhc2UgQkxLSUZfU1RBVEVfQ09OTkVDVEVEOgpAQCAtMTE3OCw3ICsxMjM2LDE0IEBACiAJCWluZm8tPmZlYXR1cmVfZmx1c2ggPSBSRVFfRkxVU0g7CiAJCWluZm8tPmZsdXNoX29wID0gQkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOwogCX0KLQkJCisKKwllcnIgPSB4ZW5idXNfZ2F0aGVyKFhCVF9OSUwsIGluZm8tPnhiZGV2LT5vdGhlcmVuZCwKKwkJCSAgICAiZmVhdHVyZS1kaXNjYXJkIiwgIiVkIiwgJmRpc2NhcmQsCisJCQkgICAgTlVMTCk7CisKKwlpZiAoIWVyciAmJiBkaXNjYXJkKQorCQlibGtmcm9udF9zZXR1cF9kaXNjYXJkKGluZm8pOworCiAJZXJyID0geGx2YmRfYWxsb2NfZ2VuZGlzayhzZWN0b3JzLCBpbmZvLCBiaW5mbywgc2VjdG9yX3NpemUpOwogCWlmIChlcnIpIHsKIAkJeGVuYnVzX2Rldl9mYXRhbChpbmZvLT54YmRldiwgZXJyLCAieGx2YmRfYWRkIGF0ICVzIiwKQEAgLTEzODUsNiArMTQ1MCw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHhsYmxrX2luaXQodm9pZCkKIHsKKwlpbnQgcmV0OworCiAJaWYgKCF4ZW5fZG9tYWluKCkpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xMzk0LDcgKzE0NjEsMTMgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcmV0dXJuIHhlbmJ1c19yZWdpc3Rlcl9mcm9udGVuZCgmYmxrZnJvbnQpOworCXJldCA9IHhlbmJ1c19yZWdpc3Rlcl9mcm9udGVuZCgmYmxrZnJvbnQpOworCWlmIChyZXQpIHsKKwkJdW5yZWdpc3Rlcl9ibGtkZXYoWEVOVkJEX01BSk9SLCBERVZfTkFNRSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7CiB9CiBtb2R1bGVfaW5pdCh4bGJsa19pbml0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYXRoM2suYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2F0aDNrLmMKaW5kZXggMTA2YmViMS4uMTYyMjc3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYXRoM2suYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9hdGgzay5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KIAogI2RlZmluZSBWRVJTSU9OICIxLjAiCisjZGVmaW5lIEFUSDNLX0ZJUk1XQVJFCSJhdGgzay0xLmZ3IgogCiAjZGVmaW5lIEFUSDNLX0ROTE9BRAkJCQkweDAxCiAjZGVmaW5lIEFUSDNLX0dFVFNUQVRFCQkJCTB4MDUKQEAgLTQwMCw5ICs0MDEsMTUgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCAiYXRoM2stMS5mdyIsICZ1ZGV2LT5kZXYpIDwgMCkgewotCQlCVF9FUlIoIkVycm9yIGxvYWRpbmcgZmlybXdhcmUiKTsKLQkJcmV0dXJuIC1FSU87CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIEFUSDNLX0ZJUk1XQVJFLCAmdWRldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ID09IC1FTk9FTlQpCisJCQlCVF9FUlIoIkZpcm13YXJlIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIsCisJCQkJCQkJQVRIM0tfRklSTVdBUkUpOworCQllbHNlCisJCQlCVF9FUlIoIkZpcm13YXJlIGZpbGUgXCIlc1wiIHJlcXVlc3QgZmFpbGVkIChlcnI9JWQpIiwKKwkJCQkJCQlBVEgzS19GSVJNV0FSRSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBhdGgza19sb2FkX2Zpcm13YXJlKHVkZXYsIGZpcm13YXJlKTsKQEAgLTQ0MSw0ICs0NDgsNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBdGhlcm9zIEFSMzB4eCBmaXJtd2FyZSBkcml2ZXIiKTsKIE1PRFVMRV9WRVJTSU9OKFZFUlNJT04pOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0ZJUk1XQVJFKCJhdGgzay0xLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoQVRIM0tfRklSTVdBUkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYmZ1c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JmdXNiLmMKaW5kZXggNjFiNTkxNC4uYTkzNjc2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYmZ1c2IuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9iZnVzYi5jCkBAIC03NTEsOSArNzUxLDcgQEAKIAogCWJmdXNiX2Nsb3NlKGhkZXYpOwogCi0JaWYgKGhjaV91bnJlZ2lzdGVyX2RldihoZGV2KSA8IDApCi0JCUJUX0VSUigiQ2FuJ3QgdW5yZWdpc3RlciBIQ0kgZGV2aWNlICVzIiwgaGRldi0+bmFtZSk7Ci0KKwloY2lfdW5yZWdpc3Rlcl9kZXYoaGRldik7CiAJaGNpX2ZyZWVfZGV2KGhkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYwppbmRleCBhZWQxOTA0Li5jNmEwYzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKQEAgLTg0NCw5ICs4NDQsNyBAQAogCS8qIFR1cm4gRlBHQSBvZmYgKi8KIAlvdXRiKDB4ODAsIGlvYmFzZSArIDB4MzApOwogCi0JaWYgKGhjaV91bnJlZ2lzdGVyX2RldihoZGV2KSA8IDApCi0JCUJUX0VSUigiQ2FuJ3QgdW5yZWdpc3RlciBIQ0kgZGV2aWNlICVzIiwgaGRldi0+bmFtZSk7Ci0KKwloY2lfdW5yZWdpc3Rlcl9kZXYoaGRldik7CiAJaGNpX2ZyZWVfZGV2KGhkZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKaW5kZXggNGZjMDE5NC4uMGM5N2U1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYwpAQCAtNjM2LDkgKzYzNiw3IEBACiAKIAlidDNjX2hjaV9jbG9zZShoZGV2KTsKIAotCWlmIChoY2lfdW5yZWdpc3Rlcl9kZXYoaGRldikgPCAwKQotCQlCVF9FUlIoIkNhbid0IHVucmVnaXN0ZXIgSENJIGRldmljZSAlcyIsIGhkZXYtPm5hbWUpOwotCisJaGNpX3VucmVnaXN0ZXJfZGV2KGhkZXYpOwogCWhjaV9mcmVlX2RldihoZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX21haW4uYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9tYWluLmMKaW5kZXggNTQ4ZDFkOS4uYTg4YTc4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX21haW4uYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfbWFpbi5jCkBAIC0xOCw2ICsxOCw4IEBACiAgKiB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIuCiAgKiovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfc2Rpby5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYwppbmRleCBjODI3ZDczLi45ZWY0ODE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfc2Rpby5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9zZGlvLmMKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYwppbmRleCA1MjZiNjE4Li4yMDBiM2EyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYwpAQCAtNTY1LDkgKzU2NSw3IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW5mby0+bG9jayksIGZsYWdzKTsKIAotCWlmIChoY2lfdW5yZWdpc3Rlcl9kZXYoaGRldikgPCAwKQotCQlCVF9FUlIoIkNhbid0IHVucmVnaXN0ZXIgSENJIGRldmljZSAlcyIsIGhkZXYtPm5hbWUpOwotCisJaGNpX3VucmVnaXN0ZXJfZGV2KGhkZXYpOwogCWhjaV9mcmVlX2RldihoZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKaW5kZXggZmU0ZWJjMy4uMmJkODdkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCkBAIC0zMTUsNyArMzE1LDggQEAKIAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgbWVtX2ZsYWdzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKKwkJaWYgKGVyciAhPSAtRVBFUk0gJiYgZXJyICE9IC1FTk9ERVYpCisJCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKIAkJCQkJCWhkZXYtPm5hbWUsIHVyYiwgLWVycik7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKIAl9CkBAIC00MDAsNyArNDAxLDggQEAKIAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgbWVtX2ZsYWdzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKKwkJaWYgKGVyciAhPSAtRVBFUk0gJiYgZXJyICE9IC1FTk9ERVYpCisJCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKIAkJCQkJCWhkZXYtPm5hbWUsIHVyYiwgLWVycik7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKIAl9CkBAIC01MjMsNyArNTI1LDggQEAKIAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgbWVtX2ZsYWdzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKKwkJaWYgKGVyciAhPSAtRVBFUk0gJiYgZXJyICE9IC1FTk9ERVYpCisJCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKIAkJCQkJCWhkZXYtPm5hbWUsIHVyYiwgLWVycik7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKIAl9CkBAIC03MjcsNiArNzMwLDkgQEAKIAkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBkYXRhLT51ZGV2LCBwaXBlLAogCQkJCXNrYi0+ZGF0YSwgc2tiLT5sZW4sIGJ0dXNiX3R4X2NvbXBsZXRlLCBza2IpOwogCisJCWlmIChza2ItPnByaW9yaXR5ID49IEhDSV9QUklPX01BWCAtIDEpCisJCQl1cmItPnRyYW5zZmVyX2ZsYWdzICA9IFVSQl9JU09fQVNBUDsKKwogCQloZGV2LT5zdGF0LmFjbF90eCsrOwogCQlicmVhazsKIApAQCAtNzcwLDcgKzc3Niw5IEBACiAKIAllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChlcnIgPCAwKSB7Ci0JCUJUX0VSUigiJXMgdXJiICVwIHN1Ym1pc3Npb24gZmFpbGVkIiwgaGRldi0+bmFtZSwgdXJiKTsKKwkJaWYgKGVyciAhPSAtRVBFUk0gJiYgZXJyICE9IC1FTk9ERVYpCisJCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKKwkJCQkJCWhkZXYtPm5hbWUsIHVyYiwgLWVycik7CiAJCWtmcmVlKHVyYi0+c2V0dXBfcGFja2V0KTsKIAkJdXNiX3VuYW5jaG9yX3VyYih1cmIpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHdpbGluay5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR3aWxpbmsuYwppbmRleCAwNGQzNTNmLi5iNWY4M2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHdpbGluay5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0d2lsaW5rLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaS5oPgogCiAjaW5jbHVkZSA8bGludXgvdGlfd2lsaW5rX3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEJsdWV0b290aCBEcml2ZXIgVmVyc2lvbiAqLwogI2RlZmluZSBWRVJTSU9OICAgICAgICAgICAgICAgIjEuMCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwppbmRleCA1ZTRjMmRlLi45NjliYjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCkBAIC01NTEsOSArNTUxLDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbmZvLT5sb2NrKSwgZmxhZ3MpOwogCi0JaWYgKGhjaV91bnJlZ2lzdGVyX2RldihoZGV2KSA8IDApCi0JCUJUX0VSUigiQ2FuJ3QgdW5yZWdpc3RlciBIQ0kgZGV2aWNlICVzIiwgaGRldi0+bmFtZSk7Ci0KKwloY2lfdW5yZWdpc3Rlcl9kZXYoaGRldik7CiAJaGNpX2ZyZWVfZGV2KGhkZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYwppbmRleCA2N2MxODBjLi4yZTMwMmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMKQEAgLTI2NCwxMCArMjY0LDcgQEAKIAlzdHJ1Y3QgdmhjaV9kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZGF0YS0+aGRldjsKIAotCWlmIChoY2lfdW5yZWdpc3Rlcl9kZXYoaGRldikgPCAwKSB7Ci0JCUJUX0VSUigiQ2FuJ3QgdW5yZWdpc3RlciBIQ0kgZGV2aWNlICVzIiwgaGRldi0+bmFtZSk7Ci0JfQotCisJaGNpX3VucmVnaXN0ZXJfZGV2KGhkZXYpOwogCWhjaV9mcmVlX2RldihoZGV2KTsKIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IDQyM2ZkNTYuLjQzNjQzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC0yOTgsNyArMjk4LDcgQEAKIGNvbmZpZyBSVEMKIAl0cmlzdGF0ZSAiRW5oYW5jZWQgUmVhbCBUaW1lIENsb2NrIFN1cHBvcnQgKGxlZ2FjeSBQQyBSVEMgZHJpdmVyKSIKIAlkZXBlbmRzIG9uICFQUEMgJiYgIVBBUklTQyAmJiAhSUE2NCAmJiAhTTY4SyAmJiAhU1BBUkMgJiYgIUZSViBcCi0JCQkmJiAhQVJNICYmICFTVVBFUkggJiYgIVMzOTAgJiYgIUFWUjMyICYmICFCTEFDS0ZJTgorCQkJJiYgIUFSTSAmJiAhU1VQRVJIICYmICFTMzkwICYmICFBVlIzMiAmJiAhQkxBQ0tGSU4gJiYgIVVNTAogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBjcmVhdGUgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIC9kZXYvcnRjIHdpdGgKIAkgIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDEzNSB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3UKQEAgLTM0Niw3ICszNDYsNyBAQAogCiBjb25maWcgR0VOX1JUQwogCXRyaXN0YXRlICJHZW5lcmljIC9kZXYvcnRjIGVtdWxhdGlvbiIKLQlkZXBlbmRzIG9uIFJUQyE9eSAmJiAhSUE2NCAmJiAhQVJNICYmICFNMzJSICYmICFNSVBTICYmICFTUEFSQyAmJiAhRlJWICYmICFTMzkwICYmICFTVVBFUkggJiYgIUFWUjMyICYmICFCTEFDS0ZJTgorCWRlcGVuZHMgb24gUlRDIT15ICYmICFJQTY0ICYmICFBUk0gJiYgIU0zMlIgJiYgIU1JUFMgJiYgIVNQQVJDICYmICFGUlYgJiYgIVMzOTAgJiYgIVNVUEVSSCAmJiAhQVZSMzIgJiYgIUJMQUNLRklOICYmICFVTUwKIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCiAJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CkBAIC00OTAsNyArNDkwLDcgQEAKIAogY29uZmlnIFBDODczNnhfR1BJTwogCXRyaXN0YXRlICJOYXRTZW1pIFBDODczNnggR1BJTyBTdXBwb3J0IgotCWRlcGVuZHMgb24gWDg2XzMyCisJZGVwZW5kcyBvbiBYODZfMzIgJiYgIVVNTAogCWRlZmF1bHQgU0N4MjAwX0dQSU8JIyBtb3N0bHkgTgogCXNlbGVjdCBOU0NfR1BJTwkJIyBuZWVkZWQgZm9yIHN1cHBvcnQgcm91dGluZXMKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYwppbmRleCAwNTZiMjg5Li4zNjk1NzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKQEAgLTMzNiw3ICszMzYsOCBAQAogCW9mZl90IGosIGlvX3BnX3N0YXJ0OwogCWludCBpb19wZ19jb3VudDsKIAotCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwlpZiAodHlwZSAhPSBtZW0tPnR5cGUgfHwKKwkJYWdwX2JyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYWdwX2JyaWRnZSwgdHlwZSkpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zODAsNyArMzgxLDggQEAKIAlzdHJ1Y3QgX2hwX3ByaXZhdGUgKmhwID0gJmhwX3ByaXZhdGU7CiAJaW50IGksIGlvX3BnX3N0YXJ0LCBpb19wZ19jb3VudDsKIAotCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwlpZiAodHlwZSAhPSBtZW0tPnR5cGUgfHwKKwkJYWdwX2JyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYWdwX2JyaWRnZSwgdHlwZSkpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYwppbmRleCAyNzc0YWMxLi5jOTI0MjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMKQEAgLTkyMyw2ICs5MjMsOSBAQAogewogCWludCByZXQgPSAtRUlOVkFMOwogCisJaWYgKGludGVsX3ByaXZhdGUuYmFzZS5kb19pZGxlX21hcHMpCisJCXJldHVybiAtRU5PREVWOworCiAJaWYgKGludGVsX3ByaXZhdGUuY2xlYXJfZmFrZV9hZ3ApIHsKIAkJaW50IHN0YXJ0ID0gaW50ZWxfcHJpdmF0ZS5iYXNlLnN0b2xlbl9zaXplIC8gUEFHRV9TSVpFOwogCQlpbnQgZW5kID0gaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF9tYXBwYWJsZV9lbnRyaWVzOwpAQCAtOTg1LDYgKzk4OCw5IEBACiAJaWYgKG1lbS0+cGFnZV9jb3VudCA9PSAwKQogCQlyZXR1cm4gMDsKIAorCWlmIChpbnRlbF9wcml2YXRlLmJhc2UuZG9faWRsZV9tYXBzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWludGVsX2d0dF9jbGVhcl9yYW5nZShwZ19zdGFydCwgbWVtLT5wYWdlX2NvdW50KTsKIAogCWlmIChpbnRlbF9wcml2YXRlLmJhc2UubmVlZHNfZG1hcikgewpAQCAtMTE3Nyw2ICsxMTgzLDI2IEBACiB7CiB9CiAKKy8qIENlcnRhaW4gR2VuNSBjaGlwc2V0cyByZXF1aXJlIHJlcXVpcmUgaWRsaW5nIHRoZSBHUFUgYmVmb3JlCisgKiB1bm1hcHBpbmcgYW55dGhpbmcgZnJvbSB0aGUgR1RUIHdoZW4gVlQtZCBpcyBlbmFibGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBuZWVkc19pZGxlX21hcHModm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfSU5URUxfSU9NTVUKKwljb25zdCB1bnNpZ25lZCBzaG9ydCBncHVfZGV2aWQgPSBpbnRlbF9wcml2YXRlLnBjaWRldi0+ZGV2aWNlOworCWV4dGVybiBpbnQgaW50ZWxfaW9tbXVfZ2Z4X21hcHBlZDsKKworCS8qIFF1ZXJ5IGludGVsX2lvbW11IHRvIHNlZSBpZiB3ZSBuZWVkIHRoZSB3b3JrYXJvdW5kLiBQcmVzdW1hYmx5IHRoYXQKKwkgKiB3YXMgbG9hZGVkIGZpcnN0LgorCSAqLworCWlmICgoZ3B1X2RldmlkID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSVJPTkxBS0VfTV9IQiB8fAorCSAgICAgZ3B1X2RldmlkID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSVJPTkxBS0VfTV9JRykgJiYKKwkgICAgIGludGVsX2lvbW11X2dmeF9tYXBwZWQpCisJCXJldHVybiAxOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgaTl4eF9zZXR1cCh2b2lkKQogewogCXUzMiByZWdfYWRkcjsKQEAgLTEyMTEsNiArMTIzNyw5IEBACiAJCWludGVsX3ByaXZhdGUuZ3R0X2J1c19hZGRyID0gcmVnX2FkZHIgKyBndHRfb2Zmc2V0OwogCX0KIAorCWlmIChuZWVkc19pZGxlX21hcHMoKSkKKwkJaW50ZWxfcHJpdmF0ZS5iYXNlLmRvX2lkbGVfbWFwcyA9IDE7CisKIAlpbnRlbF9pOXh4X3NldHVwX2ZsdXNoKCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZwppbmRleCAxZDJlYmM3Li4wNjg5YmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnCkBAIC02MCw2ICs2MCwxOSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgSFdfUkFORE9NX0FUTUVMCisJdHJpc3RhdGUgIkF0bWVsIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIV19SQU5ET00gJiYgQVJDSF9BVDkxU0FNOUc0NQorCWRlZmF1bHQgSFdfUkFORE9NCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMga2VybmVsLXNpZGUgc3VwcG9ydCBmb3IgdGhlIFJhbmRvbSBOdW1iZXIKKwkgIEdlbmVyYXRvciBoYXJkd2FyZSBmb3VuZCBvbiBBdG1lbCBBVDkxIGRldmljZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGF0bWVsLXJuZy4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogY29uZmlnIEhXX1JBTkRPTV9HRU9ERQogCXRyaXN0YXRlICJBTUQgR2VvZGUgSFcgUmFuZG9tIE51bWJlciBHZW5lcmF0b3Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEhXX1JBTkRPTSAmJiBYODZfMzIgJiYgUENJCkBAIC0yMjIsMyArMjM1LDE4IEBACiAJIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwcGM0eHgtcm5nLgogCiAJIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBVTUxfUkFORE9NCisJZGVwZW5kcyBvbiBVTUwKKwl0cmlzdGF0ZSAiSGFyZHdhcmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBVTUwncyAiaGFyZHdhcmUiIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAgSXQKKwkgIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgaG9zdCdzIC9kZXYvcmFuZG9tLCBzdXBwbHlpbmcgYXMgbXVjaCBlbnRyb3B5CisJICBhcyB0aGUgaG9zdCBoYXMsIHJhdGhlciB0aGFuIHRoZSBzbWFsbCBhbW91bnQgdGhlIFVNTCBnZXRzIGZyb20gaXRzCisJICBvd24gZHJpdmVycy4gIEl0IHJlZ2lzdGVycyBpdHNlbGYgYXMgYSBzdGFuZGFyZCBoYXJkd2FyZSByYW5kb20gbnVtYmVyCisJICBnZW5lcmF0b3IsIG1ham9yIDEwLCBtaW5vciAxODMsIGFuZCB0aGUgY2Fub25pY2FsIGRldmljZSBuYW1lIGlzCisJICAvZGV2L2h3cm5nLgorCSAgVGhlIHdheSB0byBtYWtlIHVzZSBvZiB0aGlzIGlzIHRvIGluc3RhbGwgdGhlIHJuZy10b29scyBwYWNrYWdlCisJICAoY2hlY2sgeW91ciBkaXN0cm8sIG9yIGRvd25sb2FkIGZyb20KKwkgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZ2tlcm5lbC8pLiAgcm5nZCBwZXJpb2RpY2FsbHkgcmVhZHMKKwkgIC9kZXYvaHdybmcgYW5kIGluamVjdHMgdGhlIGVudHJvcHkgaW50byAvZGV2L3JhbmRvbS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlCmluZGV4IGM4OGYyNDQuLmIyZmY1MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZQpAQCAtNyw2ICs3LDcgQEAKIG9iai0kKENPTkZJR19IV19SQU5ET01fVElNRVJJT01FTSkgKz0gdGltZXJpb21lbS1ybmcubwogb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9JTlRFTCkgKz0gaW50ZWwtcm5nLm8KIG9iai0kKENPTkZJR19IV19SQU5ET01fQU1EKSArPSBhbWQtcm5nLm8KK29iai0kKENPTkZJR19IV19SQU5ET01fQVRNRUwpICs9IGF0bWVsLXJuZy5vCiBvYmotJChDT05GSUdfSFdfUkFORE9NX0dFT0RFKSArPSBnZW9kZS1ybmcubwogb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9OMlJORykgKz0gbjItcm5nLm8KIG4yLXJuZy15IDo9IG4yLWRydi5vIG4yLWFzbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2F0bWVsLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9hdG1lbC1ybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDFkZjJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9hdG1lbC1ybmcuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQZXRlciBLb3JzZ2FhcmQgPGphY21ldEBzdW5zaXRlLmRrPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBUUk5HX0NSCQkweDAwCisjZGVmaW5lIFRSTkdfSVNSCTB4MWMKKyNkZWZpbmUgVFJOR19PREFUQQkweDUwCisKKyNkZWZpbmUgVFJOR19LRVkJMHg1MjRlNDcwMCAvKiBSTkcgKi8KKworc3RydWN0IGF0bWVsX3RybmcgeworCXN0cnVjdCBjbGsgKmNsazsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IGh3cm5nIHJuZzsKK307CisKK3N0YXRpYyBpbnQgYXRtZWxfdHJuZ19yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB2b2lkICpidWYsIHNpemVfdCBtYXgsCisJCQkgICBib29sIHdhaXQpCit7CisJc3RydWN0IGF0bWVsX3RybmcgKnRybmcgPSBjb250YWluZXJfb2Yocm5nLCBzdHJ1Y3QgYXRtZWxfdHJuZywgcm5nKTsKKwl1MzIgKmRhdGEgPSBidWY7CisKKwkvKiBkYXRhIHJlYWR5PyAqLworCWlmIChyZWFkbCh0cm5nLT5iYXNlICsgVFJOR19PREFUQSkgJiAxKSB7CisJCSpkYXRhID0gcmVhZGwodHJuZy0+YmFzZSArIFRSTkdfT0RBVEEpOworCQlyZXR1cm4gNDsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfdHJuZ19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhdG1lbF90cm5nICp0cm5nOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRybmcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp0cm5nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0cm5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwl0cm5nLT5iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCF0cm5nLT5iYXNlKQorCQlyZXR1cm4gLUVCVVNZOworCisJdHJuZy0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHRybmctPmNsaykpCisJCXJldHVybiBQVFJfRVJSKHRybmctPmNsayk7CisKKwlyZXQgPSBjbGtfZW5hYmxlKHRybmctPmNsayk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZW5hYmxlOworCisJd3JpdGVsKFRSTkdfS0VZIHwgMSwgdHJuZy0+YmFzZSArIFRSTkdfQ1IpOworCXRybmctPnJuZy5uYW1lID0gcGRldi0+bmFtZTsKKwl0cm5nLT5ybmcucmVhZCA9IGF0bWVsX3RybmdfcmVhZDsKKworCXJldCA9IGh3cm5nX3JlZ2lzdGVyKCZ0cm5nLT5ybmcpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JlZ2lzdGVyOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdHJuZyk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlZ2lzdGVyOgorCWNsa19kaXNhYmxlKHRybmctPmNsayk7CitlcnJfZW5hYmxlOgorCWNsa19wdXQodHJuZy0+Y2xrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGF0bWVsX3RybmdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGF0bWVsX3RybmcgKnRybmcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWh3cm5nX3VucmVnaXN0ZXIoJnRybmctPnJuZyk7CisKKwl3cml0ZWwoVFJOR19LRVksIHRybmctPmJhc2UgKyBUUk5HX0NSKTsKKwljbGtfZGlzYWJsZSh0cm5nLT5jbGspOworCWNsa19wdXQodHJuZy0+Y2xrKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXRtZWxfdHJuZ19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRtZWxfdHJuZyAqdHJuZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJY2xrX2Rpc2FibGUodHJuZy0+Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3RybmdfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRtZWxfdHJuZyAqdHJuZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIGNsa19lbmFibGUodHJuZy0+Y2xrKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGF0bWVsX3RybmdfcG1fb3BzID0geworCS5zdXNwZW5kCT0gYXRtZWxfdHJuZ19zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXRtZWxfdHJuZ19yZXN1bWUsCit9OworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdG1lbF90cm5nX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYXRtZWxfdHJuZ19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF0bWVsX3RybmdfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXRtZWwtdHJuZyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmYXRtZWxfdHJuZ19wbV9vcHMsCisjZW5kaWYgLyogQ09ORklHX1BNICovCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0bWVsX3RybmdfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF0bWVsX3RybmdfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGF0bWVsX3RybmdfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdG1lbF90cm5nX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXRtZWxfdHJuZ19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYXRtZWxfdHJuZ19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGV0ZXIgS29yc2dhYXJkIDxqYWNtZXRAc3Vuc2l0ZS5kaz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXRtZWwgdHJ1ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlydGlvLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS92aXJ0aW8tcm5nLmMKaW5kZXggNzVmMWNiZC4uZmQ2OTljYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS92aXJ0aW8tcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS92aXJ0aW8tcm5nLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpby5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19ybmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCB2aXJ0cXVldWUgKnZxOwogc3RhdGljIHVuc2lnbmVkIGludCBkYXRhX2F2YWlsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IDhmYzA0YjQuLjE0NTE3OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc3BsaWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BzM2ZsYXNoLmMgYi9kcml2ZXJzL2NoYXIvcHMzZmxhc2guYwppbmRleCBkMGM1N2MyLi42YWJkZGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcHMzZmxhc2guYworKysgYi9kcml2ZXJzL2NoYXIvcHMzZmxhc2guYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KICNpbmNsdWRlIDxhc20vcHMzc3Rvci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbW9vcHMuYyBiL2RyaXZlcnMvY2hhci9yYW1vb3BzLmMKaW5kZXggODEwYWZmOS4uN2M3ZjQyYTFmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbW9vcHMuYworKysgYi9kcml2ZXJzL2NoYXIvcmFtb29wcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva21zZ19kdW1wLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKaW5kZXggYzM1YTc4NS4uNjNlMTliYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtOTMyLDcgKzkzMiwyMSBAQAogICovCiB2b2lkIGdldF9yYW5kb21fYnl0ZXModm9pZCAqYnVmLCBpbnQgbmJ5dGVzKQogewotCWV4dHJhY3RfZW50cm9weSgmbm9uYmxvY2tpbmdfcG9vbCwgYnVmLCBuYnl0ZXMsIDAsIDApOworCWNoYXIgKnAgPSBidWY7CisKKwl3aGlsZSAobmJ5dGVzKSB7CisJCXVuc2lnbmVkIGxvbmcgdjsKKwkJaW50IGNodW5rID0gbWluKG5ieXRlcywgKGludClzaXplb2YodW5zaWduZWQgbG9uZykpOworCQkKKwkJaWYgKCFhcmNoX2dldF9yYW5kb21fbG9uZygmdikpCisJCQlicmVhazsKKwkJCisJCW1lbWNweShidWYsICZ2LCBjaHVuayk7CisJCXAgKz0gY2h1bms7CisJCW5ieXRlcyAtPSBjaHVuazsKKwl9CisKKwlleHRyYWN0X2VudHJvcHkoJm5vbmJsb2NraW5nX3Bvb2wsIHAsIG5ieXRlcywgMCwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MKGdldF9yYW5kb21fYnl0ZXMpOwogCkBAIC0xMzE4LDkgKzEzMzIsMTQgQEAKIERFRklORV9QRVJfQ1BVKF9fdTMyIFtNRDVfRElHRVNUX1dPUkRTXSwgZ2V0X3JhbmRvbV9pbnRfaGFzaCk7CiB1bnNpZ25lZCBpbnQgZ2V0X3JhbmRvbV9pbnQodm9pZCkKIHsKLQlfX3UzMiAqaGFzaCA9IGdldF9jcHVfdmFyKGdldF9yYW5kb21faW50X2hhc2gpOworCV9fdTMyICpoYXNoOwogCXVuc2lnbmVkIGludCByZXQ7CiAKKwlpZiAoYXJjaF9nZXRfcmFuZG9tX2ludCgmcmV0KSkKKwkJcmV0dXJuIHJldDsKKworCWhhc2ggPSBnZXRfY3B1X3ZhcihnZXRfcmFuZG9tX2ludF9oYXNoKTsKKwogCWhhc2hbMF0gKz0gY3VycmVudC0+cGlkICsgamlmZmllcyArIGdldF9jeWNsZXMoKTsKIAltZDVfdHJhbnNmb3JtKGhhc2gsIHJhbmRvbV9pbnRfc2VjcmV0KTsKIAlyZXQgPSBoYXNoWzBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eXByaW50ay5jIGIvZHJpdmVycy9jaGFyL3R0eXByaW50ay5jCmluZGV4IGExZjY4YWYuLmVlZGQ1NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlwcmludGsuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5cHJpbnRrLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RydWN0IHR0eXByaW50a19wb3J0IHsKIAlzdHJ1Y3QgdHR5X3BvcnQgcG9ydDsKQEAgLTE3MCw3ICsxNzEsNyBAQAogCS5pb2N0bCA9IHRwa19pb2N0bCwKIH07CiAKLXN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIG51bGxfb3BzID0geyB9Oworc3RhdGljIHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIG51bGxfb3BzID0geyB9OwogCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnR0eXByaW50a19kcml2ZXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jIGIvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMKaW5kZXggZmI2OGIxMi4uOGUzYzQ2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMKKysrIGIvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMKQEAgLTE5LDggKzE5LDEwIEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpAQCAtMzIsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIi4uL3R0eS9odmMvaHZjX2NvbnNvbGUuaCIKIAogLyoKQEAgLTczLDYgKzc2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcG9ydHNfZHJpdmVyX2RhdGEgcGRydmRhdGE7CiAKIERFRklORV9TUElOTE9DSyhwZHJ2ZGF0YV9sb2NrKTsKK0RFQ0xBUkVfQ09NUExFVElPTihlYXJseV9jb25zb2xlX2FkZGVkKTsKIAogLyogVGhpcyBzdHJ1Y3QgaG9sZHMgaW5mb3JtYXRpb24gdGhhdCdzIHJlbGV2YW50IG9ubHkgZm9yIGNvbnNvbGUgcG9ydHMgKi8KIHN0cnVjdCBjb25zb2xlIHsKQEAgLTE1MSw2ICsxNTUsMTAgQEAKIAlpbnQgY2hyX21ham9yOwogfTsKIAorc3RydWN0IHBvcnRfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgYnl0ZXNfc2VudCwgYnl0ZXNfcmVjZWl2ZWQsIGJ5dGVzX2Rpc2NhcmRlZDsKK307CisKIC8qIFRoaXMgc3RydWN0IGhvbGRzIHRoZSBwZXItcG9ydCBkYXRhICovCiBzdHJ1Y3QgcG9ydCB7CiAJLyogTmV4dCBwb3J0IGluIHRoZSBsaXN0LCBoZWFkIGlzIGluIHRoZSBwb3J0c19kZXZpY2UgKi8KQEAgLTE3OSw2ICsxODcsMTMgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2ZpbGU7CiAKIAkvKgorCSAqIEtlZXAgY291bnQgb2YgdGhlIGJ5dGVzIHNlbnQsIHJlY2VpdmVkIGFuZCBkaXNjYXJkZWQgZm9yCisJICogdGhpcyBwb3J0IGZvciBhY2NvdW50aW5nIGFuZCBkZWJ1Z2dpbmcgcHVycG9zZXMuICBUaGVzZQorCSAqIGNvdW50cyBhcmUgbm90IHJlc2V0IGFjcm9zcyBwb3J0IG9wZW4gLyBjbG9zZSBldmVudHMuCisJICovCisJc3RydWN0IHBvcnRfc3RhdHMgc3RhdHM7CisKKwkvKgogCSAqIFRoZSBlbnRyaWVzIGluIHRoaXMgc3RydWN0IHdpbGwgYmUgdmFsaWQgaWYgdGhpcyBwb3J0IGlzCiAJICogaG9va2VkIHVwIHRvIGFuIGh2YyBjb25zb2xlCiAJICovCkBAIC0zNDcsMTcgKzM2MiwxOSBAQAogfQogCiAvKiBDYWxsZXJzIHNob3VsZCB0YWtlIGFwcHJvcHJpYXRlIGxvY2tzICovCi1zdGF0aWMgdm9pZCAqZ2V0X2luYnVmKHN0cnVjdCBwb3J0ICpwb3J0KQorc3RhdGljIHN0cnVjdCBwb3J0X2J1ZmZlciAqZ2V0X2luYnVmKHN0cnVjdCBwb3J0ICpwb3J0KQogewogCXN0cnVjdCBwb3J0X2J1ZmZlciAqYnVmOwotCXN0cnVjdCB2aXJ0cXVldWUgKnZxOwogCXVuc2lnbmVkIGludCBsZW47CiAKLQl2cSA9IHBvcnQtPmluX3ZxOwotCWJ1ZiA9IHZpcnRxdWV1ZV9nZXRfYnVmKHZxLCAmbGVuKTsKKwlpZiAocG9ydC0+aW5idWYpCisJCXJldHVybiBwb3J0LT5pbmJ1ZjsKKworCWJ1ZiA9IHZpcnRxdWV1ZV9nZXRfYnVmKHBvcnQtPmluX3ZxLCAmbGVuKTsKIAlpZiAoYnVmKSB7CiAJCWJ1Zi0+bGVuID0gbGVuOwogCQlidWYtPm9mZnNldCA9IDA7CisJCXBvcnQtPnN0YXRzLmJ5dGVzX3JlY2VpdmVkICs9IGxlbjsKIAl9CiAJcmV0dXJuIGJ1ZjsKIH0KQEAgLTM4NCwzMiArNDAxLDI3IEBACiBzdGF0aWMgdm9pZCBkaXNjYXJkX3BvcnRfZGF0YShzdHJ1Y3QgcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgcG9ydF9idWZmZXIgKmJ1ZjsKLQlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKLQl1bnNpZ25lZCBpbnQgbGVuOwotCWludCByZXQ7CisJdW5zaWduZWQgaW50IGVycjsKIAogCWlmICghcG9ydC0+cG9ydGRldikgewogCQkvKiBEZXZpY2UgaGFzIGJlZW4gdW5wbHVnZ2VkLiAgdnFzIGFyZSBhbHJlYWR5IGdvbmUuICovCiAJCXJldHVybjsKIAl9Ci0JdnEgPSBwb3J0LT5pbl92cTsKLQlpZiAocG9ydC0+aW5idWYpCi0JCWJ1ZiA9IHBvcnQtPmluYnVmOwotCWVsc2UKLQkJYnVmID0gdmlydHF1ZXVlX2dldF9idWYodnEsICZsZW4pOworCWJ1ZiA9IGdldF9pbmJ1Zihwb3J0KTsKIAotCXJldCA9IDA7CisJZXJyID0gMDsKIAl3aGlsZSAoYnVmKSB7Ci0JCWlmIChhZGRfaW5idWYodnEsIGJ1ZikgPCAwKSB7Ci0JCQlyZXQrKzsKKwkJcG9ydC0+c3RhdHMuYnl0ZXNfZGlzY2FyZGVkICs9IGJ1Zi0+bGVuIC0gYnVmLT5vZmZzZXQ7CisJCWlmIChhZGRfaW5idWYocG9ydC0+aW5fdnEsIGJ1ZikgPCAwKSB7CisJCQllcnIrKzsKIAkJCWZyZWVfYnVmKGJ1Zik7CiAJCX0KLQkJYnVmID0gdmlydHF1ZXVlX2dldF9idWYodnEsICZsZW4pOworCQlwb3J0LT5pbmJ1ZiA9IE5VTEw7CisJCWJ1ZiA9IGdldF9pbmJ1Zihwb3J0KTsKIAl9Ci0JcG9ydC0+aW5idWYgPSBOVUxMOwotCWlmIChyZXQpCisJaWYgKGVycikKIAkJZGV2X3dhcm4ocG9ydC0+ZGV2LCAiRXJyb3JzIGFkZGluZyAlZCBidWZmZXJzIGJhY2sgdG8gdnFcbiIsCi0JCQkgcmV0KTsKKwkJCSBlcnIpOwogfQogCiBzdGF0aWMgYm9vbCBwb3J0X2hhc19kYXRhKHN0cnVjdCBwb3J0ICpwb3J0KQpAQCAtNDE3LDE4ICs0MjksMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgcmV0OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmluYnVmX2xvY2ssIGZsYWdzKTsKLQlpZiAocG9ydC0+aW5idWYpIHsKLQkJcmV0ID0gdHJ1ZTsKLQkJZ290byBvdXQ7Ci0JfQotCXBvcnQtPmluYnVmID0gZ2V0X2luYnVmKHBvcnQpOwotCWlmIChwb3J0LT5pbmJ1ZikgewotCQlyZXQgPSB0cnVlOwotCQlnb3RvIG91dDsKLQl9CiAJcmV0ID0gZmFsc2U7Ci1vdXQ6CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmluYnVmX2xvY2ssIGZsYWdzKTsKKwlwb3J0LT5pbmJ1ZiA9IGdldF9pbmJ1Zihwb3J0KTsKKwlpZiAocG9ydC0+aW5idWYpCisJCXJldCA9IHRydWU7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5pbmJ1Zl9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTUyOSw2ICs1MzUsOCBAQAogCQljcHVfcmVsYXgoKTsKIGRvbmU6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+b3V0dnFfbG9jaywgZmxhZ3MpOworCisJcG9ydC0+c3RhdHMuYnl0ZXNfc2VudCArPSBpbl9jb3VudDsKIAkvKgogCSAqIFdlJ3JlIGV4cGVjdGVkIHRvIHJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgd2Ugd3JvdGUgLS0gYWxsCiAJICogb2YgaXQKQEAgLTYzMyw4ICs2NDEsOCBAQAogCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocG9ydC0+d2FpdHF1ZXVlLAotCQkJCQkgICAgICAgIXdpbGxfcmVhZF9ibG9jayhwb3J0KSk7CisJCXJldCA9IHdhaXRfZXZlbnRfZnJlZXphYmxlKHBvcnQtPndhaXRxdWV1ZSwKKwkJCQkJICAgIXdpbGxfcmVhZF9ibG9jayhwb3J0KSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAl9CkBAIC02NzcsOCArNjg1LDggQEAKIAkJaWYgKG5vbmJsb2NrKQogCQkJcmV0dXJuIC1FQUdBSU47CiAKLQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnQtPndhaXRxdWV1ZSwKLQkJCQkJICAgICAgICF3aWxsX3dyaXRlX2Jsb2NrKHBvcnQpKTsKKwkJcmV0ID0gd2FpdF9ldmVudF9mcmVlemFibGUocG9ydC0+d2FpdHF1ZXVlLAorCQkJCQkgICAhd2lsbF93cml0ZV9ibG9jayhwb3J0KSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAl9CkBAIC0xMDU5LDYgKzEwNjcsMTQgQEAKIAlvdXRfb2Zmc2V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dF9vZmZzZXQsIG91dF9jb3VudCAtIG91dF9vZmZzZXQsCiAJCQkgICAgICAgIm91dHZxX2Z1bGw6ICVkXG4iLCBwb3J0LT5vdXR2cV9mdWxsKTsKIAlvdXRfb2Zmc2V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dF9vZmZzZXQsIG91dF9jb3VudCAtIG91dF9vZmZzZXQsCisJCQkgICAgICAgImJ5dGVzX3NlbnQ6ICVsdVxuIiwgcG9ydC0+c3RhdHMuYnl0ZXNfc2VudCk7CisJb3V0X29mZnNldCArPSBzbnByaW50ZihidWYgKyBvdXRfb2Zmc2V0LCBvdXRfY291bnQgLSBvdXRfb2Zmc2V0LAorCQkJICAgICAgICJieXRlc19yZWNlaXZlZDogJWx1XG4iLAorCQkJICAgICAgIHBvcnQtPnN0YXRzLmJ5dGVzX3JlY2VpdmVkKTsKKwlvdXRfb2Zmc2V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dF9vZmZzZXQsIG91dF9jb3VudCAtIG91dF9vZmZzZXQsCisJCQkgICAgICAgImJ5dGVzX2Rpc2NhcmRlZDogJWx1XG4iLAorCQkJICAgICAgIHBvcnQtPnN0YXRzLmJ5dGVzX2Rpc2NhcmRlZCk7CisJb3V0X29mZnNldCArPSBzbnByaW50ZihidWYgKyBvdXRfb2Zmc2V0LCBvdXRfY291bnQgLSBvdXRfb2Zmc2V0LAogCQkJICAgICAgICJpc19jb25zb2xlOiAlc1xuIiwKIAkJCSAgICAgICBpc19jb25zb2xlX3BvcnQocG9ydCkgPyAieWVzIiA6ICJubyIpOwogCW91dF9vZmZzZXQgKz0gc25wcmludGYoYnVmICsgb3V0X29mZnNldCwgb3V0X2NvdW50IC0gb3V0X29mZnNldCwKQEAgLTExNDMsNiArMTE1OSw3IEBACiAJcG9ydC0+Y29ucy53cy53c19yb3cgPSBwb3J0LT5jb25zLndzLndzX2NvbCA9IDA7CiAKIAlwb3J0LT5ob3N0X2Nvbm5lY3RlZCA9IHBvcnQtPmd1ZXN0X2Nvbm5lY3RlZCA9IGZhbHNlOworCXBvcnQtPnN0YXRzID0gKHN0cnVjdCBwb3J0X3N0YXRzKSB7IDAgfTsKIAogCXBvcnQtPm91dHZxX2Z1bGwgPSBmYWxzZTsKIApAQCAtMTM1Miw2ICsxMzY5LDcgQEAKIAkJCWJyZWFrOwogCiAJCWluaXRfcG9ydF9jb25zb2xlKHBvcnQpOworCQljb21wbGV0ZSgmZWFybHlfY29uc29sZV9hZGRlZCk7CiAJCS8qCiAJCSAqIENvdWxkIHJlbW92ZSB0aGUgcG9ydCBoZXJlIGluIGNhc2UgaW5pdCBmYWlscyAtIGJ1dAogCQkgKiBoYXZlIHRvIG5vdGlmeSB0aGUgaG9zdCBmaXJzdC4KQEAgLTEzOTQsNiArMTQxMiwxMyBAQAogCQlicmVhazsKIAljYXNlIFZJUlRJT19DT05TT0xFX1BPUlRfTkFNRToKIAkJLyoKKwkJICogSWYgd2Ugd29rZSB1cCBhZnRlciBoaWJlcm5hdGlvbiwgd2UgY2FuIGdldCB0aGlzCisJCSAqIGFnYWluLiAgU2tpcCBpdCBpbiB0aGF0IGNhc2UuCisJCSAqLworCQlpZiAocG9ydC0+bmFtZSkKKwkJCWJyZWFrOworCisJCS8qCiAJCSAqIFNraXAgdGhlIHNpemUgb2YgdGhlIGhlYWRlciBhbmQgdGhlIGNwa3QgdG8gZ2V0IHRoZSBzaXplCiAJCSAqIG9mIHRoZSBuYW1lIHRoYXQgd2FzIHNlbnQKIAkJICovCkBAIC0xNDgxLDggKzE1MDYsNyBAQAogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+aW5idWZfbG9jaywgZmxhZ3MpOwotCWlmICghcG9ydC0+aW5idWYpCi0JCXBvcnQtPmluYnVmID0gZ2V0X2luYnVmKHBvcnQpOworCXBvcnQtPmluYnVmID0gZ2V0X2luYnVmKHBvcnQpOwogCiAJLyoKIAkgKiBEb24ndCBxdWV1ZSB1cCBkYXRhIHdoZW4gcG9ydCBpcyBjbG9zZWQuICBUaGlzIGNvbmRpdGlvbgpAQCAtMTU2Myw3ICsxNTg3LDcgQEAKIAlwb3J0ZGV2LT5vdXRfdnFzID0ga21hbGxvYyhucl9wb3J0cyAqIHNpemVvZihzdHJ1Y3QgdmlydHF1ZXVlICopLAogCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghdnFzIHx8ICFpb19jYWxsYmFja3MgfHwgIWlvX25hbWVzIHx8ICFwb3J0ZGV2LT5pbl92cXMgfHwKLQkJCSFwb3J0ZGV2LT5vdXRfdnFzKSB7CisJICAgICFwb3J0ZGV2LT5vdXRfdnFzKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZTsKIAl9CkBAIC0xNjQ4LDYgKzE2NzIsMTAgQEAKIAlzdHJ1Y3QgcG9ydHNfZGV2aWNlICpwb3J0ZGV2OwogCWludCBlcnI7CiAJYm9vbCBtdWx0aXBvcnQ7CisJYm9vbCBlYXJseSA9IGVhcmx5X3B1dF9jaGFycyAhPSBOVUxMOworCisJLyogRW5zdXJlIHRvIHJlYWQgZWFybHlfcHV0X2NoYXJzIG5vdyAqLworCWJhcnJpZXIoKTsKIAogCXBvcnRkZXYgPSBrbWFsbG9jKHNpemVvZigqcG9ydGRldiksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydGRldikgewpAQCAtMTY3NSwxMyArMTcwMywxMSBAQAogCiAJbXVsdGlwb3J0ID0gZmFsc2U7CiAJcG9ydGRldi0+Y29uZmlnLm1heF9ucl9wb3J0cyA9IDE7Ci0JaWYgKHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJUSU9fQ09OU09MRV9GX01VTFRJUE9SVCkpIHsKKwlpZiAodmlydGlvX2NvbmZpZ192YWwodmRldiwgVklSVElPX0NPTlNPTEVfRl9NVUxUSVBPUlQsCisJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgdmlydGlvX2NvbnNvbGVfY29uZmlnLAorCQkJCSAgICAgICBtYXhfbnJfcG9ydHMpLAorCQkJICAgICAgJnBvcnRkZXYtPmNvbmZpZy5tYXhfbnJfcG9ydHMpID09IDApCiAJCW11bHRpcG9ydCA9IHRydWU7Ci0JCXZkZXYtPmNvbmZpZy0+Z2V0KHZkZXYsIG9mZnNldG9mKHN0cnVjdCB2aXJ0aW9fY29uc29sZV9jb25maWcsCi0JCQkJCQkgbWF4X25yX3BvcnRzKSwKLQkJCQkgICZwb3J0ZGV2LT5jb25maWcubWF4X25yX3BvcnRzLAotCQkJCSAgc2l6ZW9mKHBvcnRkZXYtPmNvbmZpZy5tYXhfbnJfcG9ydHMpKTsKLQl9CiAKIAllcnIgPSBpbml0X3Zxcyhwb3J0ZGV2KTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtMTcxOSw2ICsxNzQ1LDE5IEBACiAKIAlfX3NlbmRfY29udHJvbF9tc2cocG9ydGRldiwgVklSVElPX0NPTlNPTEVfQkFEX0lELAogCQkJICAgVklSVElPX0NPTlNPTEVfREVWSUNFX1JFQURZLCAxKTsKKworCS8qCisJICogSWYgdGhlcmUgd2FzIGFuIGVhcmx5IHZpcnRpbyBjb25zb2xlLCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbm8KKwkgKiBvdGhlciBjb25zb2xlcy4gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBodmNfYWxsb2MgbWF0Y2hlcyB0aGUKKwkgKiBodmNfaW5zdGFudGlhdGUsIG90aGVyd2lzZSB0dHlfb3BlbiB3aWxsIGNvbXBsYWluLCByZXN1bHRpbmcgaW4KKwkgKiBhICJXYXJuaW5nOiB1bmFibGUgdG8gb3BlbiBhbiBpbml0aWFsIGNvbnNvbGUiIGJvb3QgZmFpbHVyZS4KKwkgKiBXaXRob3V0IG11bHRpcG9ydCB0aGlzIGlzIGRvbmUgaW4gYWRkX3BvcnQgYWJvdmUuIFdpdGggbXVsdGlwb3J0CisJICogdGhpcyBtaWdodCB0YWtlIHNvbWUgaG9zdDwtPmd1ZXN0IGNvbW11bmljYXRpb24gLSB0aHVzIHdlIGhhdmUgdG8KKwkgKiB3YWl0LgorCSAqLworCWlmIChtdWx0aXBvcnQgJiYgZWFybHkpCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmVhcmx5X2NvbnNvbGVfYWRkZWQpOworCiAJcmV0dXJuIDA7CiAKIGZyZWVfdnFzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCmluZGV4IDM0ZTljNGYuLjk5OWQ2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcKQEAgLTE1LDMgKzE1LDE4IEBACiAKIGNvbmZpZyBEV19BUEJfVElNRVIKIAlib29sCisKK2NvbmZpZyBDTEtTUkNfREJYNTAwX1BSQ01VCisJYm9vbCAiQ2xvY2tzb3VyY2UgUFJDTVUgVGltZXIiCisJZGVwZW5kcyBvbiBVWDUwMF9TT0NfREI1NTAwIHx8IFVYNTAwX1NPQ19EQjg1MDAKKwlkZWZhdWx0IHkKKwloZWxwCisJICBVc2UgdGhlIGFsd2F5cyBvbiBQUkNNVSBUaW1lciBhcyBjbG9ja3NvdXJjZQorCitjb25maWcgQ0xLU1JDX0RCWDUwMF9QUkNNVV9TQ0hFRF9DTE9DSworCWJvb2wgIkNsb2Nrc291cmNlIFBSQ01VIFRpbWVyIHNjaGVkX2Nsb2NrIgorCWRlcGVuZHMgb24gKENMS1NSQ19EQlg1MDBfUFJDTVUgJiYgIU5PTUFESUtfTVRVX1NDSEVEX0NMT0NLKQorCXNlbGVjdCBIQVZFX1NDSEVEX0NMT0NLCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXNlIHRoZSBhbHdheXMgb24gUFJDTVUgVGltZXIgYXMgc2NoZWRfY2xvY2sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlCmluZGV4IDg1YWQxNjQ2Li44ZDgxYTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUKQEAgLTksMyArOSw0IEBACiBvYmotJChDT05GSUdfQ0xLQkxEX0k4MjUzKQkrPSBpODI1My5vCiBvYmotJChDT05GSUdfQ0xLU1JDX01NSU8pCSs9IG1taW8ubwogb2JqLSQoQ09ORklHX0RXX0FQQl9USU1FUikJKz0gZHdfYXBiX3RpbWVyLm8KK29iai0kKENPTkZJR19DTEtTUkNfREJYNTAwX1BSQ01VKQkrPSBjbGtzcmMtZGJ4NTAwLXByY211Lm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2Nsa3NyYy1kYng1MDAtcHJjbXUuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvY2xrc3JjLWRieDUwMC1wcmNtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZmVlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2Nsa3NyYy1kYng1MDAtcHJjbXUuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gU0EgMjAxMQorICoKKyAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCisgKiBBdXRob3I6IE1hdHRpYXMgV2FsbGluIDxtYXR0aWFzLndhbGxpbkBzdGVyaWNzc29uLmNvbT4gZm9yIFNULUVyaWNzc29uCisgKiBBdXRob3I6IFN1bmRhciBJeWVyIGZvciBTVC1Fcmljc3NvbgorICogc2NoZWRfY2xvY2sgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb246CisgKiBwbGF0LW5vbWFkaWsvdGltZXIuYyBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPgorICoKKyAqIERCeDUwMC1QUkNNVSBUaW1lcgorICogVGhlIFBSQ01VIGhhcyA1IHRpbWVycyB3aGljaCBhcmUgYXZhaWxhYmxlIGluIGEgYWx3YXlzLW9uCisgKiBwb3dlciBkb21haW4uICBXZSB1c2UgdGhlIFRpbWVyIDQgZm9yIG91ciBhbHdheXMtb24gY2xvY2sKKyAqIHNvdXJjZSBvbiBEQjg1MDAgYW5kIFRpbWVyIDMgb24gREI1NTAwLgorICovCisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsa3NyYy1kYng1MDAtcHJjbXUuaD4KKworI2luY2x1ZGUgPGFzbS9zY2hlZF9jbG9jay5oPgorCisjaW5jbHVkZSA8bWFjaC9zZXR1cC5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2RlZmluZSBSQVRFXzMySwkJMzI3NjgKKworI2RlZmluZSBUSU1FUl9NT0RFX0NPTlRJTk9VUwkweDEKKyNkZWZpbmUgVElNRVJfRE9XTkNPVU5UX1ZBTAkweGZmZmZmZmZmCisKKyNkZWZpbmUgUFJDTVVfVElNRVJfUkVGCQkwCisjZGVmaW5lIFBSQ01VX1RJTUVSX0RPV05DT1VOVAkweDQKKyNkZWZpbmUgUFJDTVVfVElNRVJfTU9ERQkweDgKKworI2RlZmluZSBTQ0hFRF9DTE9DS19NSU5fV1JBUCAxMzEwNzIgLyogMl4zMiAvIDMyNzY4ICovCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmNsa3NyY19kYng1MDBfdGltZXJfYmFzZTsKKworc3RhdGljIGN5Y2xlX3QgY2xrc3JjX2RieDUwMF9wcmNtdV9yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJdTMyIGNvdW50LCBjb3VudDI7CisKKwlkbyB7CisJCWNvdW50ID0gcmVhZGwoY2xrc3JjX2RieDUwMF90aW1lcl9iYXNlICsKKwkJCSAgICAgIFBSQ01VX1RJTUVSX0RPV05DT1VOVCk7CisJCWNvdW50MiA9IHJlYWRsKGNsa3NyY19kYng1MDBfdGltZXJfYmFzZSArCisJCQkgICAgICAgUFJDTVVfVElNRVJfRE9XTkNPVU5UKTsKKwl9IHdoaWxlIChjb3VudDIgIT0gY291bnQpOworCisJLyogTmVnYXRlIGJlY2F1c2UgdGhlIHRpbWVyIGlzIGEgZGVjcmVtZW50aW5nIGNvdW50ZXIgKi8KKwlyZXR1cm4gfmNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2RieDUwMF9wcmNtdSA9IHsKKwkubmFtZQkJPSAiZGJ4NTAwLXByY211LXRpbWVyIiwKKwkucmF0aW5nCQk9IDMwMCwKKwkucmVhZAkJPSBjbGtzcmNfZGJ4NTAwX3ByY211X3JlYWQsCisJLnNoaWZ0CQk9IDEwLAorCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKK307CisKKyNpZmRlZiBDT05GSUdfQ0xLU1JDX0RCWDUwMF9QUkNNVV9TQ0hFRF9DTE9DSworc3RhdGljIERFRklORV9DTE9DS19EQVRBKGNkKTsKKwordW5zaWduZWQgbG9uZyBsb25nIG5vdHJhY2Ugc2NoZWRfY2xvY2sodm9pZCkKK3sKKwl1MzIgY3ljOworCisJaWYgKHVubGlrZWx5KCFjbGtzcmNfZGJ4NTAwX3RpbWVyX2Jhc2UpKQorCQlyZXR1cm4gMDsKKworCWN5YyA9IGNsa3NyY19kYng1MDBfcHJjbXVfcmVhZCgmY2xvY2tzb3VyY2VfZGJ4NTAwX3ByY211KTsKKworCXJldHVybiBjeWNfdG9fc2NoZWRfY2xvY2soJmNkLCBjeWMsICh1MzIpfjApOworfQorCitzdGF0aWMgdm9pZCBub3RyYWNlIGNsa3NyY19kYng1MDBfcHJjbXVfdXBkYXRlX3NjaGVkX2Nsb2NrKHZvaWQpCit7CisJdTMyIGN5YyA9IGNsa3NyY19kYng1MDBfcHJjbXVfcmVhZCgmY2xvY2tzb3VyY2VfZGJ4NTAwX3ByY211KTsKKwl1cGRhdGVfc2NoZWRfY2xvY2soJmNkLCBjeWMsICh1MzIpfjApOworfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IGNsa3NyY19kYng1MDBfcHJjbXVfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJY2xrc3JjX2RieDUwMF90aW1lcl9iYXNlID0gYmFzZTsKKworCS8qCisJICogVGhlIEE5IHN1YiBzeXN0ZW0gZXhwZWN0cyB0aGUgdGltZXIgdG8gYmUgY29uZmlndXJlZCBhcworCSAqIGEgY29udGlub3VzIGxvb3BpbmcgdGltZXIuCisJICogVGhlIFBSQ01VIHNob3VsZCBjb25maWd1cmUgaXQgYnV0IGlmIGl0IGZvciBzb21lIHJlYXNvbgorCSAqIGRvbid0IHdlIGRvIGl0IGhlcmUuCisJICovCisJaWYgKHJlYWRsKGNsa3NyY19kYng1MDBfdGltZXJfYmFzZSArIFBSQ01VX1RJTUVSX01PREUpICE9CisJICAgIFRJTUVSX01PREVfQ09OVElOT1VTKSB7CisJCXdyaXRlbChUSU1FUl9NT0RFX0NPTlRJTk9VUywKKwkJICAgICAgIGNsa3NyY19kYng1MDBfdGltZXJfYmFzZSArIFBSQ01VX1RJTUVSX01PREUpOworCQl3cml0ZWwoVElNRVJfRE9XTkNPVU5UX1ZBTCwKKwkJICAgICAgIGNsa3NyY19kYng1MDBfdGltZXJfYmFzZSArIFBSQ01VX1RJTUVSX1JFRik7CisJfQorI2lmZGVmIENPTkZJR19DTEtTUkNfREJYNTAwX1BSQ01VX1NDSEVEX0NMT0NLCisJaW5pdF9zY2hlZF9jbG9jaygmY2QsIGNsa3NyY19kYng1MDBfcHJjbXVfdXBkYXRlX3NjaGVkX2Nsb2NrLAorCQkJIDMyLCBSQVRFXzMySyk7CisjZW5kaWYKKwljbG9ja3NvdXJjZV9jYWxjX211bHRfc2hpZnQoJmNsb2Nrc291cmNlX2RieDUwMF9wcmNtdSwKKwkJCQkgICAgUkFURV8zMkssIFNDSEVEX0NMT0NLX01JTl9XUkFQKTsKKwljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfZGJ4NTAwX3ByY211KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfY210LmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX2NtdC5jCmluZGV4IDMyYTc3YmUuLmNhMDliYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfY210LmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF9jbXQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IHNoX2NtdF9wcml2IHsKIAl2b2lkIF9faW9tZW0gKm1hcGJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX210dTIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfbXR1Mi5jCmluZGV4IDQwNjMwY2IuLmRiOGQ1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfbXR1Mi5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfbXR1Mi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdHJ1Y3Qgc2hfbXR1Ml9wcml2IHsKIAl2b2lkIF9faW9tZW0gKm1hcGJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX3RtdS5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYwppbmRleCA4MDgxMzU3Li4wNzllOTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX3RtdS5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfdG11LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCBzaF90bXVfcHJpdiB7CiAJdm9pZCBfX2lvbWVtICptYXBiYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKaW5kZXggZmFmN2M1Mi4uYzUwNzJhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9kYjg1MDAtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2RiODUwMC1jcHVmcmVxLmMKaW5kZXggZDkwNDU2YS4uZjUwMDIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2RiODUwMC1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2RiODUwMC1jcHVmcmVxLmMKQEAgLTEyLDMwICsxMiwzNSBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvZGI4NTAwLXByY211Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RieDUwMC1wcmNtdS5oPgogI2luY2x1ZGUgPG1hY2gvaWQuaD4KIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBmcmVxX3RhYmxlW10gPSB7CiAJWzBdID0gewogCQkuaW5kZXggPSAwLAotCQkuZnJlcXVlbmN5ID0gMzAwMDAwLAorCQkuZnJlcXVlbmN5ID0gMjAwMDAwLAogCX0sCiAJWzFdID0gewogCQkuaW5kZXggPSAxLAotCQkuZnJlcXVlbmN5ID0gNjAwMDAwLAorCQkuZnJlcXVlbmN5ID0gMzAwMDAwLAogCX0sCiAJWzJdID0gewotCQkvKiBVc2VkIGZvciBNQVhfT1BQLCBpZiBhdmFpbGFibGUgKi8KIAkJLmluZGV4ID0gMiwKLQkJLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5ELAorCQkuZnJlcXVlbmN5ID0gNjAwMDAwLAogCX0sCiAJWzNdID0geworCQkvKiBVc2VkIGZvciBNQVhfT1BQLCBpZiBhdmFpbGFibGUgKi8KIAkJLmluZGV4ID0gMywKIAkJLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5ELAogCX0sCisJWzRdID0geworCQkuaW5kZXggPSA0LAorCQkuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQsCisJfSwKIH07CiAKIHN0YXRpYyBlbnVtIGFybV9vcHAgaWR4Mm9wcFtdID0geworCUFSTV9FWFRDTEssCiAJQVJNXzUwX09QUCwKIAlBUk1fMTAwX09QUCwKIAlBUk1fTUFYX09QUApAQCAtNzIsMTMgKzc3LDEzIEBACiAKIAlmcmVxcy5vbGQgPSBwb2xpY3ktPmN1cjsKIAlmcmVxcy5uZXcgPSBmcmVxX3RhYmxlW2lkeF0uZnJlcXVlbmN5OwotCWZyZXFzLmNwdSA9IHBvbGljeS0+Y3B1OwogCiAJaWYgKGZyZXFzLm9sZCA9PSBmcmVxcy5uZXcpCiAJCXJldHVybiAwOwogCiAJLyogcHJlLWNoYW5nZSBub3RpZmljYXRpb24gKi8KLQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCWZvcl9lYWNoX2NwdShmcmVxcy5jcHUsIHBvbGljeS0+Y3B1cykKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKIAogCS8qIHJlcXVlc3QgdGhlIFBSQ00gdW5pdCBmb3Igb3BwIGNoYW5nZSAqLwogCWlmIChwcmNtdV9zZXRfYXJtX29wcChpZHgyb3BwW2lkeF0pKSB7CkBAIC04Nyw3ICs5Miw4IEBACiAJfQogCiAJLyogcG9zdCBjaGFuZ2Ugbm90aWZpY2F0aW9uICovCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJZm9yX2VhY2hfY3B1KGZyZXFzLmNwdSwgcG9saWN5LT5jcHVzKQorCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTAzLDE3ICsxMDksMTkgQEAKIAogc3RhdGljIGludCBfX2NwdWluaXQgZGI4NTAwX2NwdWZyZXFfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKLQlpbnQgcmVzOwotCWludCBpOworCWludCBpLCByZXM7CiAKIAlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShpZHgyb3BwKSArIDEgIT0gQVJSQVlfU0laRShmcmVxX3RhYmxlKSk7CiAKLQlpZiAoY3B1X2lzX3U4NTAwdjIoKSAmJiAhcHJjbXVfaXNfdTg0MDAoKSkgewotCQlmcmVxX3RhYmxlWzBdLmZyZXF1ZW5jeSA9IDQwMDAwMDsKLQkJZnJlcV90YWJsZVsxXS5mcmVxdWVuY3kgPSA4MDAwMDA7CisJaWYgKCFwcmNtdV9pc191ODQwMCgpKSB7CisJCWZyZXFfdGFibGVbMV0uZnJlcXVlbmN5ID0gNDAwMDAwOworCQlmcmVxX3RhYmxlWzJdLmZyZXF1ZW5jeSA9IDgwMDAwMDsKIAkJaWYgKHByY211X2hhc19hcm1fbWF4b3BwKCkpCi0JCQlmcmVxX3RhYmxlWzJdLmZyZXF1ZW5jeSA9IDEwMDAwMDA7CisJCQlmcmVxX3RhYmxlWzNdLmZyZXF1ZW5jeSA9IDEwMDAwMDA7CiAJfQorCXByX2luZm8oImRiODUwMC1jcHVmcmVxIDogQXZhaWxhYmxlIGZyZXF1ZW5jaWVzOlxuIik7CisJZm9yIChpID0gMDsgZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQ7IGkrKykKKwkJcHJfaW5mbygiICAlZCBNaHpcbiIsIGZyZXFfdGFibGVbaV0uZnJlcXVlbmN5LzEwMDApOwogCiAJLyogZ2V0IHBvbGljeSBmaWVsZHMgYmFzZWQgb24gdGhlIHRhYmxlICovCiAJcmVzID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGZyZXFfdGFibGUpOwpAQCAtMTI3LDEwICsxMzUsNiBAQAogCXBvbGljeS0+bWluID0gcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxOwogCXBvbGljeS0+bWF4ID0gcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxOwogCXBvbGljeS0+Y3VyID0gZGI4NTAwX2NwdWZyZXFfZ2V0c3BlZWQocG9saWN5LT5jcHUpOwotCi0JZm9yIChpID0gMDsgZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgIT0gcG9saWN5LT5jdXI7IGkrKykKLQkJOwotCiAJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvZV9wb3dlcnNhdmVyLmMgYi9kcml2ZXJzL2NwdWZyZXEvZV9wb3dlcnNhdmVyLmMKaW5kZXggMzVhMjU3ZC4uNGJkNjgxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2VfcG93ZXJzYXZlci5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpAQCAtMTksNiArMTksMTEgQEAKICNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSA8YXNtL3RzYy5oPgogCisjaWYgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1IgfHwgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1JfTU9EVUxFCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CisjZW5kaWYKKwogI2RlZmluZSBFUFNfQlJBTkRfQzdNCTAKICNkZWZpbmUgRVBTX0JSQU5EX0M3CTEKICNkZWZpbmUgRVBTX0JSQU5EX0VERU4JMgpAQCAtMjcsMTEgKzMyLDU5IEBACiAKIHN0cnVjdCBlcHNfY3B1X2RhdGEgewogCXUzMiBmc2I7CisjaWYgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1IgfHwgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1JfTU9EVUxFCisJdTMyIGJpb3NfbGltaXQ7CisjZW5kaWYKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgZnJlcV90YWJsZVtdOwogfTsKIAogc3RhdGljIHN0cnVjdCBlcHNfY3B1X2RhdGEgKmVwc19jcHVbTlJfQ1BVU107CiAKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IGZyZXFfZmFpbHNhZmVfb2ZmOworc3RhdGljIGludCB2b2x0YWdlX2ZhaWxzYWZlX29mZjsKK3N0YXRpYyBpbnQgc2V0X21heF92b2x0YWdlOworCisjaWYgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1IgfHwgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1JfTU9EVUxFCitzdGF0aWMgaW50IGlnbm9yZV9hY3BpX2xpbWl0OworCitzdGF0aWMgc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICplcHNfYWNwaV9jcHVfcGVyZjsKKworLyogTWluaW11bSBuZWNlc3NhcnkgdG8gZ2V0IGFjcGlfcHJvY2Vzc29yX2dldF9iaW9zX2xpbWl0KCkgd29ya2luZyAqLworc3RhdGljIGludCBlcHNfYWNwaV9pbml0KHZvaWQpCit7CisJZXBzX2FjcGlfY3B1X3BlcmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghZXBzX2FjcGlfY3B1X3BlcmYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCF6YWxsb2NfY3B1bWFza192YXIoJmVwc19hY3BpX2NwdV9wZXJmLT5zaGFyZWRfY3B1X21hcCwKKwkJCQkJCQkJR0ZQX0tFUk5FTCkpIHsKKwkJa2ZyZWUoZXBzX2FjcGlfY3B1X3BlcmYpOworCQllcHNfYWNwaV9jcHVfcGVyZiA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZShlcHNfYWNwaV9jcHVfcGVyZiwgMCkpIHsKKwkJZnJlZV9jcHVtYXNrX3ZhcihlcHNfYWNwaV9jcHVfcGVyZi0+c2hhcmVkX2NwdV9tYXApOworCQlrZnJlZShlcHNfYWNwaV9jcHVfcGVyZik7CisJCWVwc19hY3BpX2NwdV9wZXJmID0gTlVMTDsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVwc19hY3BpX2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaWYgKGVwc19hY3BpX2NwdV9wZXJmKSB7CisJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoZXBzX2FjcGlfY3B1X3BlcmYsIDApOworCQlmcmVlX2NwdW1hc2tfdmFyKGVwc19hY3BpX2NwdV9wZXJmLT5zaGFyZWRfY3B1X21hcCk7CisJCWtmcmVlKGVwc19hY3BpX2NwdV9wZXJmKTsKKwkJZXBzX2FjcGlfY3B1X3BlcmYgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGVwc19nZXQodW5zaWduZWQgaW50IGNwdSkKIHsKQEAgLTE2NCw2ICsyMTcsOSBAQAogCWludCBrLCBzdGVwLCB2b2x0YWdlOwogCWludCByZXQ7CiAJaW50IHN0YXRlczsKKyNpZiBkZWZpbmVkIENPTkZJR19BQ1BJX1BST0NFU1NPUiB8fCBkZWZpbmVkIENPTkZJR19BQ1BJX1BST0NFU1NPUl9NT0RVTEUKKwl1bnNpZ25lZCBpbnQgbGltaXQ7CisjZW5kaWYKIAogCWlmIChwb2xpY3ktPmNwdSAhPSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTI0NCwxMSArMzAwLDYyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChjdXJyZW50X3ZvbHRhZ2UgPiAweDFmIHx8IG1heF92b2x0YWdlID4gMHgxZikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKG1heF92b2x0YWdlIDwgbWluX3ZvbHRhZ2UpCisJaWYgKG1heF92b2x0YWdlIDwgbWluX3ZvbHRhZ2UKKwkgICAgfHwgY3VycmVudF92b2x0YWdlIDwgbWluX3ZvbHRhZ2UKKwkgICAgfHwgY3VycmVudF92b2x0YWdlID4gbWF4X3ZvbHRhZ2UpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogQ2hlY2sgZm9yIHN5c3RlbXMgdXNpbmcgdW5kZXJjbG9ja2VkIENQVSAqLworCWlmICghZnJlcV9mYWlsc2FmZV9vZmYgJiYgbWF4X211bHRpcGxpZXIgIT0gY3VycmVudF9tdWx0aXBsaWVyKSB7CisJCXByaW50ayhLRVJOX0lORk8gImVwczogWW91ciBwcm9jZXNzb3IgaXMgcnVubmluZyBhdCBkaWZmZXJlbnQgIgorCQkJImZyZXF1ZW5jeSB0aGVuIGl0cyBtYXhpbXVtLiBBYm9ydGluZy5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJlcHM6IFlvdSBjYW4gdXNlIGZyZXFfZmFpbHNhZmVfb2ZmIG9wdGlvbiAiCisJCQkidG8gZGlzYWJsZSB0aGlzIGNoZWNrLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIXZvbHRhZ2VfZmFpbHNhZmVfb2ZmICYmIG1heF92b2x0YWdlICE9IGN1cnJlbnRfdm9sdGFnZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJlcHM6IFlvdXIgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgYXQgZGlmZmVyZW50ICIKKwkJCSJ2b2x0YWdlIHRoZW4gaXRzIG1heGltdW0uIEFib3J0aW5nLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gImVwczogWW91IGNhbiB1c2Ugdm9sdGFnZV9mYWlsc2FmZV9vZmYgIgorCQkJIm9wdGlvbiB0byBkaXNhYmxlIHRoaXMgY2hlY2suXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogQ2FsYyBGU0Igc3BlZWQgKi8KIAlmc2IgPSBjcHVfa2h6IC8gY3VycmVudF9tdWx0aXBsaWVyOworCisjaWYgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1IgfHwgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1JfTU9EVUxFCisJLyogQ2hlY2sgZm9yIEFDUEkgcHJvY2Vzc29yIHNwZWVkIGxpbWl0ICovCisJaWYgKCFpZ25vcmVfYWNwaV9saW1pdCAmJiAhZXBzX2FjcGlfaW5pdCgpKSB7CisJCWlmICghYWNwaV9wcm9jZXNzb3JfZ2V0X2Jpb3NfbGltaXQocG9saWN5LT5jcHUsICZsaW1pdCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImVwczogQUNQSSBsaW1pdCAldS4ldUdIelxuIiwKKwkJCQlsaW1pdC8xMDAwMDAwLAorCQkJCShsaW1pdCUxMDAwMDAwKS8xMDAwMCk7CisJCQllcHNfYWNwaV9leGl0KHBvbGljeSk7CisJCQkvKiBDaGVjayBpZiBtYXhfbXVsdGlwbGllciBpcyBpbiBCSU9TIGxpbWl0cyAqLworCQkJaWYgKGxpbWl0ICYmIG1heF9tdWx0aXBsaWVyICogZnNiID4gbGltaXQpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJlcHM6IEFib3J0aW5nLlxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCS8qIEFsbG93IHVzZXIgdG8gc2V0IGxvd2VyIG1heGltdW0gdm9sdGFnZSB0aGVuIHRoYXQgcmVwb3J0ZWQKKwkgKiBieSBwcm9jZXNzb3IgKi8KKwlpZiAoYnJhbmQgPT0gRVBTX0JSQU5EX0M3TSAmJiBzZXRfbWF4X3ZvbHRhZ2UpIHsKKwkJdTMyIHY7CisKKwkJLyogQ2hhbmdlIG1WIHRvIHNvbWV0aGluZyBoYXJkd2FyZSBjYW4gdXNlICovCisJCXYgPSAoc2V0X21heF92b2x0YWdlIC0gNzAwKSAvIDE2OworCQkvKiBDaGVjayBpZiB2b2x0YWdlIGlzIHdpdGhpbiBsaW1pdHMgKi8KKwkJaWYgKHYgPj0gbWluX3ZvbHRhZ2UgJiYgdiA8PSBtYXhfdm9sdGFnZSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBTZXR0aW5nICVkbVYgYXMgbWF4aW11bS5cbiIsCisJCQkJdiAqIDE2ICsgNzAwKTsKKwkJCW1heF92b2x0YWdlID0gdjsKKwkJfQorCX0KKwogCS8qIENhbGMgbnVtYmVyIG9mIHAtc3RhdGVzIHN1cHBvcnRlZCAqLwogCWlmIChicmFuZCA9PSBFUFNfQlJBTkRfQzdNKQogCQlzdGF0ZXMgPSBtYXhfbXVsdGlwbGllciAtIG1pbl9tdWx0aXBsaWVyICsgMTsKQEAgLTI2NSw2ICszNzIsOSBAQAogCiAJLyogQ29weSBiYXNpYyB2YWx1ZXMgKi8KIAljZW50YXVyLT5mc2IgPSBmc2I7CisjaWYgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1IgfHwgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1JfTU9EVUxFCisJY2VudGF1ci0+Ymlvc19saW1pdCA9IGxpbWl0OworI2VuZGlmCiAKIAkvKiBGaWxsIGZyZXF1ZW5jeSBhbmQgTVNSIHZhbHVlIHRhYmxlICovCiAJZl90YWJsZSA9ICZjZW50YXVyLT5mcmVxX3RhYmxlWzBdOwpAQCAtMzAzLDE3ICs0MTMsNyBAQAogc3RhdGljIGludCBlcHNfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJdW5zaWduZWQgaW50IGNwdSA9IHBvbGljeS0+Y3B1OwotCXN0cnVjdCBlcHNfY3B1X2RhdGEgKmNlbnRhdXI7Ci0JdTMyIGxvLCBoaTsKIAotCWlmIChlcHNfY3B1W2NwdV0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2VudGF1ciA9IGVwc19jcHVbY3B1XTsKLQotCS8qIEdldCBtYXggZnJlcXVlbmN5ICovCi0JcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7Ci0JLyogU2V0IG1heCBmcmVxdWVuY3kgKi8KLQllcHNfc2V0X3N0YXRlKGNlbnRhdXIsIGNwdSwgaGkgJiAweGZmZmYpOwogCS8qIEJ5ZSAqLwogCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKIAlrZnJlZShlcHNfY3B1W2NwdV0pOwpAQCAtMzU5LDYgKzQ1OSwxOSBAQAogCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmVwc19kcml2ZXIpOwogfQogCisvKiBBbGxvdyB1c2VyIHRvIG92ZXJjbG9jayBoaXMgbWFjaGluZSBvciB0byBjaGFuZ2UgZnJlcXVlbmN5IHRvIGhpZ2hlciBhZnRlcgorICogdW5sb2FkaW5nIG1vZHVsZSAqLworbW9kdWxlX3BhcmFtKGZyZXFfZmFpbHNhZmVfb2ZmLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhmcmVxX2ZhaWxzYWZlX29mZiwgIkRpc2FibGUgY3VycmVudCB2cyBtYXggZnJlcXVlbmN5IGNoZWNrIik7Cittb2R1bGVfcGFyYW0odm9sdGFnZV9mYWlsc2FmZV9vZmYsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZvbHRhZ2VfZmFpbHNhZmVfb2ZmLCAiRGlzYWJsZSBjdXJyZW50IHZzIG1heCB2b2x0YWdlIGNoZWNrIik7CisjaWYgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1IgfHwgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1JfTU9EVUxFCittb2R1bGVfcGFyYW0oaWdub3JlX2FjcGlfbGltaXQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlnbm9yZV9hY3BpX2xpbWl0LCAiRG9uJ3QgY2hlY2sgQUNQSSdzIHByb2Nlc3NvciBzcGVlZCBsaW1pdCIpOworI2VuZGlmCittb2R1bGVfcGFyYW0oc2V0X21heF92b2x0YWdlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhzZXRfbWF4X3ZvbHRhZ2UsICJTZXQgbWF4aW11bSBDUFUgdm9sdGFnZSAobVYpIEM3LU0gb25seSIpOworCiBNT0RVTEVfQVVUSE9SKCJSYWZhbCBCaWxza2kgPHJhZmFsYmlsc2tpQGludGVyaWEucGw+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkVuaGFuY2VkIFBvd2VyU2F2ZXIgZHJpdmVyIGZvciBWSUEgQzcgQ1BVJ3MuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvZXh5bm9zNDIxMC1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvZXh5bm9zNDIxMC1jcHVmcmVxLmMKaW5kZXggYjdjM2E4NC4uYWI5NzQxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2V4eW5vczQyMTAtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9leHlub3M0MjEwLWNwdWZyZXEuYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgpAQCAtMzYsNiArMzgsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWVtdHlwZTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBsb2NraW5nX2ZyZXF1ZW5jeTsKK3N0YXRpYyBib29sIGZyZXF1ZW5jeV9sb2NrZWQ7CitzdGF0aWMgREVGSU5FX01VVEVYKGNwdWZyZXFfbG9jayk7CisKIGVudW0gZXh5bm9zNF9tZW1vcnlfdHlwZSB7CiAJRERSMiA9IDQsCiAJTFBERFIyLApAQCAtNDA1LDIyICs0MTEsMzIgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaW5kZXgsIG9sZF9pbmRleDsKIAl1bnNpZ25lZCBpbnQgYXJtX3ZvbHQsIGludF92b2x0OworCWludCBlcnIgPSAtRUlOVkFMOwogCiAJZnJlcXMub2xkID0gZXh5bm9zNF9nZXRzcGVlZChwb2xpY3ktPmNwdSk7CiAKKwltdXRleF9sb2NrKCZjcHVmcmVxX2xvY2spOworCisJaWYgKGZyZXF1ZW5jeV9sb2NrZWQgJiYgdGFyZ2V0X2ZyZXEgIT0gbG9ja2luZ19mcmVxdWVuY3kpIHsKKwkJZXJyID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIGV4eW5vczRfZnJlcV90YWJsZSwKIAkJCQkJICAgZnJlcXMub2xkLCByZWxhdGlvbiwgJm9sZF9pbmRleCkpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dDsKIAogCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBleHlub3M0X2ZyZXFfdGFibGUsCiAJCQkJCSAgIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJmluZGV4KSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0OworCisJZXJyID0gMDsKIAogCWZyZXFzLm5ldyA9IGV4eW5vczRfZnJlcV90YWJsZVtpbmRleF0uZnJlcXVlbmN5OwogCWZyZXFzLmNwdSA9IHBvbGljeS0+Y3B1OwogCiAJaWYgKGZyZXFzLm5ldyA9PSBmcmVxcy5vbGQpCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCS8qIGdldCB0aGUgdm9sdGFnZSB2YWx1ZSAqLwogCWFybV92b2x0ID0gZXh5bm9zNF92b2x0X3RhYmxlW2luZGV4XS5hcm1fdm9sdDsKQEAgLTQ0NywxMCArNDYzLDE2IEBACiAKIAljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKIAotCXJldHVybiAwOworb3V0OgorCW11dGV4X3VubG9jaygmY3B1ZnJlcV9sb2NrKTsKKwlyZXR1cm4gZXJyOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCisvKgorICogVGhlc2Ugc3VzcGVuZC9yZXN1bWUgYXJlIHVzZWQgYXMgc3lzY29yZV9vcHMsIGl0IGlzIGFscmVhZHkgdG9vCisgKiBsYXRlIHRvIHNldCByZWd1bGF0b3Igdm9sdGFnZXMgYXQgdGhpcyBzdGFnZS4KKyAqLwogc3RhdGljIGludCBleHlub3M0X2NwdWZyZXFfc3VzcGVuZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlyZXR1cm4gMDsKQEAgLTQ2Miw4ICs0ODQsODIgQEAKIH0KICNlbmRpZgogCisvKioKKyAqIGV4eW5vczRfY3B1ZnJlcV9wbV9ub3RpZmllciAtIGJsb2NrIENQVUZSRVEncyBhY3Rpdml0aWVzIGluIHN1c3BlbmQtcmVzdW1lCisgKgkJCWNvbnRleHQKKyAqIEBub3RpZmllcgorICogQHBtX2V2ZW50CisgKiBAdgorICoKKyAqIFdoaWxlIGZyZXF1ZW5jeV9sb2NrZWQgPT0gdHJ1ZSwgdGFyZ2V0KCkgaWdub3JlcyBldmVyeSBmcmVxdWVuY3kgYnV0CisgKiBsb2NraW5nX2ZyZXF1ZW5jeS4gVGhlIGxvY2tpbmdfZnJlcXVlbmN5IHZhbHVlIGlzIHRoZSBpbml0aWFsIGZyZXF1ZW5jeSwKKyAqIHdoaWNoIGlzIHNldCBieSB0aGUgYm9vdGxvYWRlci4gSW4gb3JkZXIgdG8gZWxpbWluYXRlIHBvc3NpYmxlCisgKiBpbmNvbnNpc3RlbmN5IGluIGNsb2NrIHZhbHVlcywgd2Ugc2F2ZSBhbmQgcmVzdG9yZSBmcmVxdWVuY2llcyBkdXJpbmcKKyAqIHN1c3BlbmQgYW5kIHJlc3VtZSBhbmQgYmxvY2sgQ1BVRlJFUSBhY3Rpdml0aWVzLiBOb3RlIHRoYXQgdGhlIHN0YW5kYXJkCisgKiBzdXNwZW5kL3Jlc3VtZSBjYW5ub3QgYmUgdXNlZCBhcyB0aGV5IGFyZSB0b28gZGVlcCAoc3lzY29yZV9vcHMpIGZvcgorICogcmVndWxhdG9yIGFjdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgZXh5bm9zNF9jcHVmcmVxX3BtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcG1fZXZlbnQsIHZvaWQgKnYpCit7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQoMCk7IC8qIGJvb3QgQ1BVICovCisJc3RhdGljIHVuc2lnbmVkIGludCBzYXZlZF9mcmVxdWVuY3k7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwltdXRleF9sb2NrKCZjcHVmcmVxX2xvY2spOworCXN3aXRjaCAocG1fZXZlbnQpIHsKKwljYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKKwkJaWYgKGZyZXF1ZW5jeV9sb2NrZWQpCisJCQlnb3RvIG91dDsKKwkJZnJlcXVlbmN5X2xvY2tlZCA9IHRydWU7CisKKwkJaWYgKGxvY2tpbmdfZnJlcXVlbmN5KSB7CisJCQlzYXZlZF9mcmVxdWVuY3kgPSBleHlub3M0X2dldHNwZWVkKDApOworCisJCQltdXRleF91bmxvY2soJmNwdWZyZXFfbG9jayk7CisJCQlleHlub3M0X3RhcmdldChwb2xpY3ksIGxvY2tpbmdfZnJlcXVlbmN5LAorCQkJCSAgICAgICBDUFVGUkVRX1JFTEFUSU9OX0gpOworCQkJbXV0ZXhfbG9jaygmY3B1ZnJlcV9sb2NrKTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgorCisJCWlmIChzYXZlZF9mcmVxdWVuY3kpIHsKKwkJCS8qCisJCQkgKiBXaGlsZSBmcmVxdWVuY3lfbG9ja2VkLCBvbmx5IGxvY2tpbmdfZnJlcXVlbmN5CisJCQkgKiBpcyB2YWxpZCBmb3IgdGFyZ2V0KCkuIEluIG9yZGVyIHRvIHVzZQorCQkJICogc2F2ZWRfZnJlcXVlbmN5IHdoaWxlIGtlZXBpbmcgZnJlcXVlbmN5X2xvY2tlZCwKKwkJCSAqIHdlIHRlbXBvcmFybHkgb3ZlcndyaXRlIGxvY2tpbmdfZnJlcXVlbmN5LgorCQkJICovCisJCQl0ZW1wID0gbG9ja2luZ19mcmVxdWVuY3k7CisJCQlsb2NraW5nX2ZyZXF1ZW5jeSA9IHNhdmVkX2ZyZXF1ZW5jeTsKKworCQkJbXV0ZXhfdW5sb2NrKCZjcHVmcmVxX2xvY2spOworCQkJZXh5bm9zNF90YXJnZXQocG9saWN5LCBsb2NraW5nX2ZyZXF1ZW5jeSwKKwkJCQkgICAgICAgQ1BVRlJFUV9SRUxBVElPTl9IKTsKKwkJCW11dGV4X2xvY2soJmNwdWZyZXFfbG9jayk7CisKKwkJCWxvY2tpbmdfZnJlcXVlbmN5ID0gdGVtcDsKKwkJfQorCisJCWZyZXF1ZW5jeV9sb2NrZWQgPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmY3B1ZnJlcV9sb2NrKTsKKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZXh5bm9zNF9jcHVmcmVxX25iID0geworCS5ub3RpZmllcl9jYWxsID0gZXh5bm9zNF9jcHVmcmVxX3BtX25vdGlmaWVyLAorfTsKKwogc3RhdGljIGludCBleHlub3M0X2NwdWZyZXFfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CisJaW50IHJldDsKKwogCXBvbGljeS0+Y3VyID0gcG9saWN5LT5taW4gPSBwb2xpY3ktPm1heCA9IGV4eW5vczRfZ2V0c3BlZWQocG9saWN5LT5jcHUpOwogCiAJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZXh5bm9zNF9mcmVxX3RhYmxlLCBwb2xpY3ktPmNwdSk7CkBAIC00NzksMTYgKzU3NSwzNSBAQAogCSAqLwogCWNwdW1hc2tfc2V0YWxsKHBvbGljeS0+Y3B1cyk7CiAKLQlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGV4eW5vczRfZnJlcV90YWJsZSk7CisJcmV0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGV4eW5vczRfZnJlcV90YWJsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGV4eW5vczRfZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOworCisJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZXh5bm9zNF9jcHVmcmVxX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgKmV4eW5vczRfY3B1ZnJlcV9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCiBzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGV4eW5vczRfZHJpdmVyID0gewogCS5mbGFncwkJPSBDUFVGUkVRX1NUSUNLWSwKIAkudmVyaWZ5CQk9IGV4eW5vczRfdmVyaWZ5X3NwZWVkLAogCS50YXJnZXQJCT0gZXh5bm9zNF90YXJnZXQsCiAJLmdldAkJPSBleHlub3M0X2dldHNwZWVkLAogCS5pbml0CQk9IGV4eW5vczRfY3B1ZnJlcV9jcHVfaW5pdCwKKwkuZXhpdAkJPSBleHlub3M0X2NwdWZyZXFfY3B1X2V4aXQsCiAJLm5hbWUJCT0gImV4eW5vczRfY3B1ZnJlcSIsCisJLmF0dHIJCT0gZXh5bm9zNF9jcHVmcmVxX2F0dHIsCiAjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBleHlub3M0X2NwdWZyZXFfc3VzcGVuZCwKIAkucmVzdW1lCQk9IGV4eW5vczRfY3B1ZnJlcV9yZXN1bWUsCkBAIC01MDEsNiArNjE2LDggQEAKIAlpZiAoSVNfRVJSKGNwdV9jbGspKQogCQlyZXR1cm4gUFRSX0VSUihjcHVfY2xrKTsKIAorCWxvY2tpbmdfZnJlcXVlbmN5ID0gZXh5bm9zNF9nZXRzcGVlZCgwKTsKKwogCW1vdXRjb3JlID0gY2xrX2dldChOVUxMLCAibW91dGNvcmUiKTsKIAlpZiAoSVNfRVJSKG1vdXRjb3JlKSkKIAkJZ290byBvdXQ7CkBAIC01NDAsNiArNjU3LDggQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtZW10eXBlPSAweCV4XG4iLCBfX2Z1bmNfXywgbWVtdHlwZSk7CiAJfQogCisJcmVnaXN0ZXJfcG1fbm90aWZpZXIoJmV4eW5vczRfY3B1ZnJlcV9uYik7CisKIAlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmV4eW5vczRfZHJpdmVyKTsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3MzYzY0eHgtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3MzYzY0eHgtY3B1ZnJlcS5jCmluZGV4IGI4ZDFkMjAuLjM0NzVmNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9zM2M2NHh4LWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvczNjNjR4eC1jcHVmcmVxLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCBjbGsgKmFybWNsazsKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICp2ZGRhcm07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwppbmRleCAwZGYwMTQxLi4wNmNlMjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Bvd2VyLmg+CiAKICNpbmNsdWRlICJjcHVpZGxlLmgiCkBAIC02MSw4ICs2Miw5IEBACiBpbnQgY3B1aWRsZV9pZGxlX2NhbGwodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9IF9fdGhpc19jcHVfcmVhZChjcHVpZGxlX2RldmljZXMpOworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gY3B1aWRsZV9nZXRfZHJpdmVyKCk7CiAJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnRhcmdldF9zdGF0ZTsKLQlpbnQgbmV4dF9zdGF0ZTsKKwlpbnQgbmV4dF9zdGF0ZSwgZW50ZXJlZF9zdGF0ZTsKIAogCWlmIChvZmYpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtODMsNDUgKzg1LDM2IEBACiAJaHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycygpOwogI2VuZGlmCiAKLQkvKgotCSAqIENhbGwgdGhlIGRldmljZSdzIHByZXBhcmUgZnVuY3Rpb24gYmVmb3JlIGNhbGxpbmcgdGhlCi0JICogZ292ZXJub3IncyBzZWxlY3QgZnVuY3Rpb24uICAtPnByZXBhcmUgZ2l2ZXMgdGhlIGRldmljZSdzCi0JICogY3B1aWRsZSBkcml2ZXIgYSBjaGFuY2UgdG8gdXBkYXRlIGFueSBkeW5hbWljIGluZm9ybWF0aW9uCi0JICogb2YgaXRzIGNwdWlkbGUgc3RhdGVzIGZvciB0aGUgY3VycmVudCBpZGxlIHBlcmlvZCwgZS5nLgotCSAqIHN0YXRlIGF2YWlsYWJpbGl0eSwgbGF0ZW5jaWVzLCByZXNpZGVuY2llcywgZXRjLgotCSAqLwotCWlmIChkZXYtPnByZXBhcmUpCi0JCWRldi0+cHJlcGFyZShkZXYpOwotCiAJLyogYXNrIHRoZSBnb3Zlcm5vciBmb3IgdGhlIG5leHQgc3RhdGUgKi8KLQluZXh0X3N0YXRlID0gY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5zZWxlY3QoZGV2KTsKKwluZXh0X3N0YXRlID0gY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5zZWxlY3QoZHJ2LCBkZXYpOwogCWlmIChuZWVkX3Jlc2NoZWQoKSkgewogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCXJldHVybiAwOwogCX0KIAotCXRhcmdldF9zdGF0ZSA9ICZkZXYtPnN0YXRlc1tuZXh0X3N0YXRlXTsKLQotCS8qIGVudGVyIHRoZSBzdGF0ZSBhbmQgdXBkYXRlIHN0YXRzICovCi0JZGV2LT5sYXN0X3N0YXRlID0gdGFyZ2V0X3N0YXRlOworCXRhcmdldF9zdGF0ZSA9ICZkcnYtPnN0YXRlc1tuZXh0X3N0YXRlXTsKIAogCXRyYWNlX3Bvd2VyX3N0YXJ0KFBPV0VSX0NTVEFURSwgbmV4dF9zdGF0ZSwgZGV2LT5jcHUpOwogCXRyYWNlX2NwdV9pZGxlKG5leHRfc3RhdGUsIGRldi0+Y3B1KTsKIAotCWRldi0+bGFzdF9yZXNpZGVuY3kgPSB0YXJnZXRfc3RhdGUtPmVudGVyKGRldiwgdGFyZ2V0X3N0YXRlKTsKKwllbnRlcmVkX3N0YXRlID0gdGFyZ2V0X3N0YXRlLT5lbnRlcihkZXYsIGRydiwgbmV4dF9zdGF0ZSk7CiAKIAl0cmFjZV9wb3dlcl9lbmQoZGV2LT5jcHUpOwogCXRyYWNlX2NwdV9pZGxlKFBXUl9FVkVOVF9FWElULCBkZXYtPmNwdSk7CiAKLQlpZiAoZGV2LT5sYXN0X3N0YXRlKQotCQl0YXJnZXRfc3RhdGUgPSBkZXYtPmxhc3Rfc3RhdGU7Ci0KLQl0YXJnZXRfc3RhdGUtPnRpbWUgKz0gKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPmxhc3RfcmVzaWRlbmN5OwotCXRhcmdldF9zdGF0ZS0+dXNhZ2UrKzsKKwlpZiAoZW50ZXJlZF9zdGF0ZSA+PSAwKSB7CisJCS8qIFVwZGF0ZSBjcHVpZGxlIGNvdW50ZXJzICovCisJCS8qIFRoaXMgY2FuIGJlIG1vdmVkIHRvIHdpdGhpbiBkcml2ZXIgZW50ZXIgcm91dGluZQorCQkgKiBidXQgdGhhdCByZXN1bHRzIGluIG11bHRpcGxlIGNvcGllcyBvZiBzYW1lIGNvZGUuCisJCSAqLworCQlkZXYtPnN0YXRlc191c2FnZVtlbnRlcmVkX3N0YXRlXS50aW1lICs9CisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPmxhc3RfcmVzaWRlbmN5OworCQlkZXYtPnN0YXRlc191c2FnZVtlbnRlcmVkX3N0YXRlXS51c2FnZSsrOworCX0KIAogCS8qIGdpdmUgdGhlIGdvdmVybm9yIGFuIG9wcG9ydHVuaXR5IHRvIHJlZmxlY3Qgb24gdGhlIG91dGNvbWUgKi8KIAlpZiAoY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5yZWZsZWN0KQotCQljcHVpZGxlX2N1cnJfZ292ZXJub3ItPnJlZmxlY3QoZGV2KTsKKwkJY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5yZWZsZWN0KGRldiwgZW50ZXJlZF9zdGF0ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MiwxMSArMTY1LDExIEBACiBFWFBPUlRfU1lNQk9MX0dQTChjcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKTsKIAogI2lmZGVmIENPTkZJR19BUkNIX0hBU19DUFVfUkVMQVgKLXN0YXRpYyBpbnQgcG9sbF9pZGxlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LCBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3QpCitzdGF0aWMgaW50IHBvbGxfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIGludCBpbmRleCkKIHsKIAlrdGltZV90CXQxLCB0MjsKIAlzNjQgZGlmZjsKLQlpbnQgcmV0OwogCiAJdDEgPSBrdGltZV9nZXQoKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CkBAIC0xODgsMTUgKzE4MSwxNCBAQAogCWlmIChkaWZmID4gSU5UX01BWCkKIAkJZGlmZiA9IElOVF9NQVg7CiAKLQlyZXQgPSAoaW50KSBkaWZmOwotCXJldHVybiByZXQ7CisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IChpbnQpIGRpZmY7CisKKwlyZXR1cm4gaW5kZXg7CiB9CiAKLXN0YXRpYyB2b2lkIHBvbGxfaWRsZV9pbml0KHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcG9sbF9pZGxlX2luaXQoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYpCiB7Ci0Jc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlID0gJmRldi0+c3RhdGVzWzBdOwotCi0JY3B1aWRsZV9zZXRfc3RhdGVkYXRhKHN0YXRlLCBOVUxMKTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUgPSAmZHJ2LT5zdGF0ZXNbMF07CiAKIAlzbnByaW50ZihzdGF0ZS0+bmFtZSwgQ1BVSURMRV9OQU1FX0xFTiwgIlBPTEwiKTsKIAlzbnByaW50ZihzdGF0ZS0+ZGVzYywgQ1BVSURMRV9ERVNDX0xFTiwgIkNQVUlETEUgQ09SRSBQT0xMIElETEUiKTsKQEAgLTIwNyw3ICsxOTksNyBAQAogCXN0YXRlLT5lbnRlciA9IHBvbGxfaWRsZTsKIH0KICNlbHNlCi1zdGF0aWMgdm9pZCBwb2xsX2lkbGVfaW5pdChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikge30KK3N0YXRpYyB2b2lkIHBvbGxfaWRsZV9pbml0KHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2KSB7fQogI2VuZGlmIC8qIENPTkZJR19BUkNIX0hBU19DUFVfUkVMQVggKi8KIAogLyoqCkBAIC0yMzQsMjEgKzIyNiwyMCBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlwb2xsX2lkbGVfaW5pdChkZXYpOworCXBvbGxfaWRsZV9pbml0KGNwdWlkbGVfZ2V0X2RyaXZlcigpKTsKIAogCWlmICgocmV0ID0gY3B1aWRsZV9hZGRfc3RhdGVfc3lzZnMoZGV2KSkpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAoY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5lbmFibGUgJiYKLQkgICAgKHJldCA9IGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+ZW5hYmxlKGRldikpKQorCSAgICAocmV0ID0gY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5lbmFibGUoY3B1aWRsZV9nZXRfZHJpdmVyKCksIGRldikpKQogCQlnb3RvIGZhaWxfc3lzZnM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5zdGF0ZV9jb3VudDsgaSsrKSB7Ci0JCWRldi0+c3RhdGVzW2ldLnVzYWdlID0gMDsKLQkJZGV2LT5zdGF0ZXNbaV0udGltZSA9IDA7CisJCWRldi0+c3RhdGVzX3VzYWdlW2ldLnVzYWdlID0gMDsKKwkJZGV2LT5zdGF0ZXNfdXNhZ2VbaV0udGltZSA9IDA7CiAJfQogCWRldi0+bGFzdF9yZXNpZGVuY3kgPSAwOwotCWRldi0+bGFzdF9zdGF0ZSA9IE5VTEw7CiAKIAlzbXBfd21iKCk7CiAKQEAgLTI4Miw3ICsyNzMsNyBAQAogCWRldi0+ZW5hYmxlZCA9IDA7CiAKIAlpZiAoY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5kaXNhYmxlKQotCQljcHVpZGxlX2N1cnJfZ292ZXJub3ItPmRpc2FibGUoZGV2KTsKKwkJY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5kaXNhYmxlKGNwdWlkbGVfZ2V0X2RyaXZlcigpLCBkZXYpOwogCiAJY3B1aWRsZV9yZW1vdmVfc3RhdGVfc3lzZnMoZGV2KTsKIAllbmFibGVkX2RldmljZXMtLTsKQEAgLTMxMCwyNiArMzAxLDYgQEAKIAogCWluaXRfY29tcGxldGlvbigmZGV2LT5rb2JqX3VucmVnaXN0ZXIpOwogCi0JLyoKLQkgKiBjcHVpZGxlIGRyaXZlciBzaG91bGQgc2V0IHRoZSBkZXYtPnBvd2VyX3NwZWNpZmllZCBiaXQKLQkgKiBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlIGRldmljZSBpZiB0aGUgZHJpdmVyIHByb3ZpZGVzCi0JICogcG93ZXJfdXNhZ2UgbnVtYmVycy4KLQkgKgotCSAqIEZvciB0aG9zZSBkZXZpY2VzIHdob3NlIC0+cG93ZXJfc3BlY2lmaWVkIGlzIG5vdCBzZXQsCi0JICogd2UgZmlsbCBpbiBwb3dlcl91c2FnZSB3aXRoIGRlY3JlYXNpbmcgdmFsdWVzIGFzIHRoZQotCSAqIGNwdWlkbGUgY29kZSBoYXMgYW4gaW1wbGljaXQgYXNzdW1wdGlvbiB0aGF0IHN0YXRlIENuCi0JICogdXNlcyBsZXNzIHBvd2VyIHRoYW4gQyhuLTEpLgotCSAqCi0JICogV2l0aCBDT05GSUdfQVJDSF9IQVNfQ1BVX1JFTEFYLCBDMCBpcyBhbHJlYWR5IGFzc2lnbmVkCi0JICogYW4gcG93ZXIgdmFsdWUgb2YgLTEuICBTbyB3ZSB1c2UgLTIsIC0zLCBldGMsIGZvciBvdGhlcgotCSAqIGMtc3RhdGVzLgotCSAqLwotCWlmICghZGV2LT5wb3dlcl9zcGVjaWZpZWQpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IENQVUlETEVfRFJJVkVSX1NUQVRFX1NUQVJUOyBpIDwgZGV2LT5zdGF0ZV9jb3VudDsgaSsrKQotCQkJZGV2LT5zdGF0ZXNbaV0ucG93ZXJfdXNhZ2UgPSAtMSAtIGk7Ci0JfQotCiAJcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGRldi0+Y3B1KSA9IGRldjsKIAlsaXN0X2FkZCgmZGV2LT5kZXZpY2VfbGlzdCwgJmNwdWlkbGVfZGV0ZWN0ZWRfZGV2aWNlcyk7CiAJaWYgKChyZXQgPSBjcHVpZGxlX2FkZF9zeXNmcyhzeXNfZGV2KSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYyBiL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYwppbmRleCAzZjdlM2NlLi4yODRkN2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2RyaXZlci5jCkBAIC0xNyw2ICsxNywzMCBAQAogc3RhdGljIHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqY3B1aWRsZV9jdXJyX2RyaXZlcjsKIERFRklORV9TUElOTE9DSyhjcHVpZGxlX2RyaXZlcl9sb2NrKTsKIAorc3RhdGljIHZvaWQgX19jcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydikKK3sKKwlpbnQgaTsKKwkvKgorCSAqIGNwdWlkbGUgZHJpdmVyIHNob3VsZCBzZXQgdGhlIGRydi0+cG93ZXJfc3BlY2lmaWVkIGJpdAorCSAqIGJlZm9yZSByZWdpc3RlcmluZyBpZiB0aGUgZHJpdmVyIHByb3ZpZGVzCisJICogcG93ZXJfdXNhZ2UgbnVtYmVycy4KKwkgKgorCSAqIElmIHBvd2VyX3NwZWNpZmllZCBpcyBub3Qgc2V0LAorCSAqIHdlIGZpbGwgaW4gcG93ZXJfdXNhZ2Ugd2l0aCBkZWNyZWFzaW5nIHZhbHVlcyBhcyB0aGUKKwkgKiBjcHVpZGxlIGNvZGUgaGFzIGFuIGltcGxpY2l0IGFzc3VtcHRpb24gdGhhdCBzdGF0ZSBDbgorCSAqIHVzZXMgbGVzcyBwb3dlciB0aGFuIEMobi0xKS4KKwkgKgorCSAqIFdpdGggQ09ORklHX0FSQ0hfSEFTX0NQVV9SRUxBWCwgQzAgaXMgYWxyZWFkeSBhc3NpZ25lZAorCSAqIGFuIHBvd2VyIHZhbHVlIG9mIC0xLiAgU28gd2UgdXNlIC0yLCAtMywgZXRjLCBmb3Igb3RoZXIKKwkgKiBjLXN0YXRlcy4KKwkgKi8KKwlpZiAoIWRydi0+cG93ZXJfc3BlY2lmaWVkKSB7CisJCWZvciAoaSA9IENQVUlETEVfRFJJVkVSX1NUQVRFX1NUQVJUOyBpIDwgZHJ2LT5zdGF0ZV9jb3VudDsgaSsrKQorCQkJZHJ2LT5zdGF0ZXNbaV0ucG93ZXJfdXNhZ2UgPSAtMSAtIGk7CisJfQorfQorCisKIC8qKgogICogY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIgLSByZWdpc3RlcnMgYSBkcml2ZXIKICAqIEBkcnY6IHRoZSBkcml2ZXIKQEAgLTM0LDYgKzU4LDcgQEAKIAkJc3Bpbl91bmxvY2soJmNwdWlkbGVfZHJpdmVyX2xvY2spOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KKwlfX2NwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKGRydik7CiAJY3B1aWRsZV9jdXJyX2RyaXZlciA9IGRydjsKIAlzcGluX3VubG9jaygmY3B1aWRsZV9kcml2ZXJfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbGFkZGVyLmMgYi9kcml2ZXJzL2NwdWlkbGUvZ292ZXJub3JzL2xhZGRlci5jCmluZGV4IGY2MmZkZTIuLmI2YTA5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbGFkZGVyLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9ycy9sYWRkZXIuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNjAsOSArNjAsMTEgQEAKIAogLyoqCiAgKiBsYWRkZXJfc2VsZWN0X3N0YXRlIC0gc2VsZWN0cyB0aGUgbmV4dCBzdGF0ZSB0byBlbnRlcgorICogQGRydjogY3B1aWRsZSBkcml2ZXIKICAqIEBkZXY6IHRoZSBDUFUKICAqLwotc3RhdGljIGludCBsYWRkZXJfc2VsZWN0X3N0YXRlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQorc3RhdGljIGludCBsYWRkZXJfc2VsZWN0X3N0YXRlKHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBsYWRkZXJfZGV2aWNlICpsZGV2ID0gJl9fZ2V0X2NwdV92YXIobGFkZGVyX2RldmljZXMpOwogCXN0cnVjdCBsYWRkZXJfZGV2aWNlX3N0YXRlICpsYXN0X3N0YXRlOwpAQCAtNzcsMTUgKzc5LDE3IEBACiAKIAlsYXN0X3N0YXRlID0gJmxkZXYtPnN0YXRlc1tsYXN0X2lkeF07CiAKLQlpZiAoZGV2LT5zdGF0ZXNbbGFzdF9pZHhdLmZsYWdzICYgQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQpCi0JCWxhc3RfcmVzaWRlbmN5ID0gY3B1aWRsZV9nZXRfbGFzdF9yZXNpZGVuY3koZGV2KSAtIGRldi0+c3RhdGVzW2xhc3RfaWR4XS5leGl0X2xhdGVuY3k7CisJaWYgKGRydi0+c3RhdGVzW2xhc3RfaWR4XS5mbGFncyAmIENQVUlETEVfRkxBR19USU1FX1ZBTElEKSB7CisJCWxhc3RfcmVzaWRlbmN5ID0gY3B1aWRsZV9nZXRfbGFzdF9yZXNpZGVuY3koZGV2KSAtIFwKKwkJCQkJIGRydi0+c3RhdGVzW2xhc3RfaWR4XS5leGl0X2xhdGVuY3k7CisJfQogCWVsc2UKIAkJbGFzdF9yZXNpZGVuY3kgPSBsYXN0X3N0YXRlLT50aHJlc2hvbGQucHJvbW90aW9uX3RpbWUgKyAxOwogCiAJLyogY29uc2lkZXIgcHJvbW90aW9uICovCi0JaWYgKGxhc3RfaWR4IDwgZGV2LT5zdGF0ZV9jb3VudCAtIDEgJiYKKwlpZiAobGFzdF9pZHggPCBkcnYtPnN0YXRlX2NvdW50IC0gMSAmJgogCSAgICBsYXN0X3Jlc2lkZW5jeSA+IGxhc3Rfc3RhdGUtPnRocmVzaG9sZC5wcm9tb3Rpb25fdGltZSAmJgotCSAgICBkZXYtPnN0YXRlc1tsYXN0X2lkeCArIDFdLmV4aXRfbGF0ZW5jeSA8PSBsYXRlbmN5X3JlcSkgeworCSAgICBkcnYtPnN0YXRlc1tsYXN0X2lkeCArIDFdLmV4aXRfbGF0ZW5jeSA8PSBsYXRlbmN5X3JlcSkgewogCQlsYXN0X3N0YXRlLT5zdGF0cy5wcm9tb3Rpb25fY291bnQrKzsKIAkJbGFzdF9zdGF0ZS0+c3RhdHMuZGVtb3Rpb25fY291bnQgPSAwOwogCQlpZiAobGFzdF9zdGF0ZS0+c3RhdHMucHJvbW90aW9uX2NvdW50ID49IGxhc3Rfc3RhdGUtPnRocmVzaG9sZC5wcm9tb3Rpb25fY291bnQpIHsKQEAgLTk2LDExICsxMDAsMTEgQEAKIAogCS8qIGNvbnNpZGVyIGRlbW90aW9uICovCiAJaWYgKGxhc3RfaWR4ID4gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQgJiYKLQkgICAgZGV2LT5zdGF0ZXNbbGFzdF9pZHhdLmV4aXRfbGF0ZW5jeSA+IGxhdGVuY3lfcmVxKSB7CisJICAgIGRydi0+c3RhdGVzW2xhc3RfaWR4XS5leGl0X2xhdGVuY3kgPiBsYXRlbmN5X3JlcSkgewogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSBsYXN0X2lkeCAtIDE7IGkgPiBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsgaS0tKSB7Ci0JCQlpZiAoZGV2LT5zdGF0ZXNbaV0uZXhpdF9sYXRlbmN5IDw9IGxhdGVuY3lfcmVxKQorCQkJaWYgKGRydi0+c3RhdGVzW2ldLmV4aXRfbGF0ZW5jeSA8PSBsYXRlbmN5X3JlcSkKIAkJCQlicmVhazsKIAkJfQogCQlsYWRkZXJfZG9fc2VsZWN0aW9uKGxkZXYsIGxhc3RfaWR4LCBpKTsKQEAgLTEyMyw5ICsxMjcsMTEgQEAKIAogLyoqCiAgKiBsYWRkZXJfZW5hYmxlX2RldmljZSAtIHNldHVwIGZvciB0aGUgZ292ZXJub3IKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyCiAgKiBAZGV2OiB0aGUgQ1BVCiAgKi8KLXN0YXRpYyBpbnQgbGFkZGVyX2VuYWJsZV9kZXZpY2Uoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGxhZGRlcl9lbmFibGVfZGV2aWNlKHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQogewogCWludCBpOwogCXN0cnVjdCBsYWRkZXJfZGV2aWNlICpsZGV2ID0gJnBlcl9jcHUobGFkZGVyX2RldmljZXMsIGRldi0+Y3B1KTsKQEAgLTEzNCw4ICsxNDAsOCBAQAogCiAJbGRldi0+bGFzdF9zdGF0ZV9pZHggPSBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsKIAotCWZvciAoaSA9IDA7IGkgPCBkZXYtPnN0YXRlX2NvdW50OyBpKyspIHsKLQkJc3RhdGUgPSAmZGV2LT5zdGF0ZXNbaV07CisJZm9yIChpID0gMDsgaSA8IGRydi0+c3RhdGVfY291bnQ7IGkrKykgeworCQlzdGF0ZSA9ICZkcnYtPnN0YXRlc1tpXTsKIAkJbHN0YXRlID0gJmxkZXYtPnN0YXRlc1tpXTsKIAogCQlsc3RhdGUtPnN0YXRzLnByb21vdGlvbl9jb3VudCA9IDA7CkBAIC0xNDQsNyArMTUwLDcgQEAKIAkJbHN0YXRlLT50aHJlc2hvbGQucHJvbW90aW9uX2NvdW50ID0gUFJPTU9USU9OX0NPVU5UOwogCQlsc3RhdGUtPnRocmVzaG9sZC5kZW1vdGlvbl9jb3VudCA9IERFTU9USU9OX0NPVU5UOwogCi0JCWlmIChpIDwgZGV2LT5zdGF0ZV9jb3VudCAtIDEpCisJCWlmIChpIDwgZHJ2LT5zdGF0ZV9jb3VudCAtIDEpCiAJCQlsc3RhdGUtPnRocmVzaG9sZC5wcm9tb3Rpb25fdGltZSA9IHN0YXRlLT5leGl0X2xhdGVuY3k7CiAJCWlmIChpID4gMCkKIAkJCWxzdGF0ZS0+dGhyZXNob2xkLmRlbW90aW9uX3RpbWUgPSBzdGF0ZS0+ZXhpdF9sYXRlbmN5OwpAQCAtMTUzLDExICsxNTksMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBsYWRkZXJfcmVmbGVjdCAtIHVwZGF0ZSB0aGUgY29ycmVjdCBsYXN0X3N0YXRlX2lkeAorICogQGRldjogdGhlIENQVQorICogQGluZGV4OiB0aGUgaW5kZXggb2YgYWN0dWFsIHN0YXRlIGVudGVyZWQKKyAqLworc3RhdGljIHZvaWQgbGFkZGVyX3JlZmxlY3Qoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgbGFkZGVyX2RldmljZSAqbGRldiA9ICZfX2dldF9jcHVfdmFyKGxhZGRlcl9kZXZpY2VzKTsKKwlpZiAoaW5kZXggPiAwKQorCQlsZGV2LT5sYXN0X3N0YXRlX2lkeCA9IGluZGV4OworfQorCiBzdGF0aWMgc3RydWN0IGNwdWlkbGVfZ292ZXJub3IgbGFkZGVyX2dvdmVybm9yID0gewogCS5uYW1lID0JCSJsYWRkZXIiLAogCS5yYXRpbmcgPQkxMCwKIAkuZW5hYmxlID0JbGFkZGVyX2VuYWJsZV9kZXZpY2UsCiAJLnNlbGVjdCA9CWxhZGRlcl9zZWxlY3Rfc3RhdGUsCisJLnJlZmxlY3QgPQlsYWRkZXJfcmVmbGVjdCwKIAkub3duZXIgPQlUSElTX01PRFVMRSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbWVudS5jIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9ycy9tZW51LmMKaW5kZXggMzYwMGYxOS4uYWQwOTUyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9ycy9tZW51LmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9ycy9tZW51LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBCVUNLRVRTIDEyCiAjZGVmaW5lIElOVEVSVkFMUyA4CkBAIC0xODIsNyArMTgzLDcgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtZW51X2RldmljZSwgbWVudV9kZXZpY2VzKTsKIAotc3RhdGljIHZvaWQgbWVudV91cGRhdGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWVudV91cGRhdGUoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KTsKIAogLyogVGhpcyBpbXBsZW1lbnRzIERJVl9ST1VORF9DTE9TRVNUIGJ1dCBhdm9pZHMgNjQgYml0IGRpdmlzaW9uICovCiBzdGF0aWMgdTY0IGRpdl9yb3VuZDY0KHU2NCBkaXZpZGVuZCwgdTMyIGRpdmlzb3IpCkBAIC0yMjgsOSArMjI5LDEwIEBACiAKIC8qKgogICogbWVudV9zZWxlY3QgLSBzZWxlY3RzIHRoZSBuZXh0IGlkbGUgc3RhdGUgdG8gZW50ZXIKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyIGNvbnRhaW5pbmcgc3RhdGUgZGF0YQogICogQGRldjogdGhlIENQVQogICovCi1zdGF0aWMgaW50IG1lbnVfc2VsZWN0KHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQorc3RhdGljIGludCBtZW51X3NlbGVjdChzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwgc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1lbnVfZGV2aWNlICpkYXRhID0gJl9fZ2V0X2NwdV92YXIobWVudV9kZXZpY2VzKTsKIAlpbnQgbGF0ZW5jeV9yZXEgPSBwbV9xb3NfcmVxdWVzdChQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZKTsKQEAgLTI0MCw3ICsyNDIsNyBAQAogCXN0cnVjdCB0aW1lc3BlYyB0OwogCiAJaWYgKGRhdGEtPm5lZWRzX3VwZGF0ZSkgewotCQltZW51X3VwZGF0ZShkZXYpOworCQltZW51X3VwZGF0ZShkcnYsIGRldik7CiAJCWRhdGEtPm5lZWRzX3VwZGF0ZSA9IDA7CiAJfQogCkBAIC0yODUsMTEgKzI4Nyw5IEBACiAJICogRmluZCB0aGUgaWRsZSBzdGF0ZSB3aXRoIHRoZSBsb3dlc3QgcG93ZXIgd2hpbGUgc2F0aXNmeWluZwogCSAqIG91ciBjb25zdHJhaW50cy4KIAkgKi8KLQlmb3IgKGkgPSBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsgaSA8IGRldi0+c3RhdGVfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqcyA9ICZkZXYtPnN0YXRlc1tpXTsKKwlmb3IgKGkgPSBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsgaSA8IGRydi0+c3RhdGVfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqcyA9ICZkcnYtPnN0YXRlc1tpXTsKIAotCQlpZiAocy0+ZmxhZ3MgJiBDUFVJRExFX0ZMQUdfSUdOT1JFKQotCQkJY29udGludWU7CiAJCWlmIChzLT50YXJnZXRfcmVzaWRlbmN5ID4gZGF0YS0+cHJlZGljdGVkX3VzKQogCQkJY29udGludWU7CiAJCWlmIChzLT5leGl0X2xhdGVuY3kgPiBsYXRlbmN5X3JlcSkKQEAgLTMxMCwyNiArMzEwLDMwIEBACiAvKioKICAqIG1lbnVfcmVmbGVjdCAtIHJlY29yZHMgdGhhdCBkYXRhIHN0cnVjdHVyZXMgbmVlZCB1cGRhdGUKICAqIEBkZXY6IHRoZSBDUFUKKyAqIEBpbmRleDogdGhlIGluZGV4IG9mIGFjdHVhbCBlbnRlcmVkIHN0YXRlCiAgKgogICogTk9URTogaXQncyBpbXBvcnRhbnQgdG8gYmUgZmFzdCBoZXJlIGJlY2F1c2UgdGhpcyBvcGVyYXRpb24gd2lsbCBhZGQgdG8KICAqICAgICAgIHRoZSBvdmVyYWxsIGV4aXQgbGF0ZW5jeS4KICAqLwotc3RhdGljIHZvaWQgbWVudV9yZWZsZWN0KHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbWVudV9yZWZsZWN0KHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IG1lbnVfZGV2aWNlICpkYXRhID0gJl9fZ2V0X2NwdV92YXIobWVudV9kZXZpY2VzKTsKLQlkYXRhLT5uZWVkc191cGRhdGUgPSAxOworCWRhdGEtPmxhc3Rfc3RhdGVfaWR4ID0gaW5kZXg7CisJaWYgKGluZGV4ID49IDApCisJCWRhdGEtPm5lZWRzX3VwZGF0ZSA9IDE7CiB9CiAKIC8qKgogICogbWVudV91cGRhdGUgLSBhdHRlbXB0cyB0byBndWVzcyB3aGF0IGhhcHBlbmVkIGFmdGVyIGVudHJ5CisgKiBAZHJ2OiBjcHVpZGxlIGRyaXZlciBjb250YWluaW5nIHN0YXRlIGRhdGEKICAqIEBkZXY6IHRoZSBDUFUKICAqLwotc3RhdGljIHZvaWQgbWVudV91cGRhdGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBtZW51X3VwZGF0ZShzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwgc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1lbnVfZGV2aWNlICpkYXRhID0gJl9fZ2V0X2NwdV92YXIobWVudV9kZXZpY2VzKTsKIAlpbnQgbGFzdF9pZHggPSBkYXRhLT5sYXN0X3N0YXRlX2lkeDsKIAl1bnNpZ25lZCBpbnQgbGFzdF9pZGxlX3VzID0gY3B1aWRsZV9nZXRfbGFzdF9yZXNpZGVuY3koZGV2KTsKLQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqdGFyZ2V0ID0gJmRldi0+c3RhdGVzW2xhc3RfaWR4XTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqdGFyZ2V0ID0gJmRydi0+c3RhdGVzW2xhc3RfaWR4XTsKIAl1bnNpZ25lZCBpbnQgbWVhc3VyZWRfdXM7CiAJdTY0IG5ld19mYWN0b3I7CiAKQEAgLTM4Myw5ICszODcsMTEgQEAKIAogLyoqCiAgKiBtZW51X2VuYWJsZV9kZXZpY2UgLSBzY2FucyBhIENQVSdzIHN0YXRlcyBhbmQgZG9lcyBzZXR1cAorICogQGRydjogY3B1aWRsZSBkcml2ZXIKICAqIEBkZXY6IHRoZSBDUFUKICAqLwotc3RhdGljIGludCBtZW51X2VuYWJsZV9kZXZpY2Uoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IG1lbnVfZW5hYmxlX2RldmljZShzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbWVudV9kZXZpY2UgKmRhdGEgPSAmcGVyX2NwdShtZW51X2RldmljZXMsIGRldi0+Y3B1KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL3N5c2ZzLmMgYi9kcml2ZXJzL2NwdWlkbGUvc3lzZnMuYwppbmRleCBiZTc5MTdlYy4uMWU3NTZlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL3N5c2ZzLmMKQEAgLTIxNiw3ICsyMTYsOCBAQAogCiBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV9hdHRyIHsKIAlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBjcHVpZGxlX3N0YXRlICosIGNoYXIgKik7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBjcHVpZGxlX3N0YXRlICosIFwKKwkJCQkJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKiwgY2hhciAqKTsKIAlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBjcHVpZGxlX3N0YXRlICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKIH07CiAKQEAgLTIyNCwxOSArMjI1LDIyIEBACiBzdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGVfYXR0ciBhdHRyXyMjX25hbWUgPSBfX0FUVFIoX25hbWUsIDA0NDQsIHNob3csIE5VTEwpCiAKICNkZWZpbmUgZGVmaW5lX3Nob3dfc3RhdGVfZnVuY3Rpb24oX25hbWUpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfc3RhdGVfIyNfbmFtZShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUsIGNoYXIgKmJ1ZikgXAorc3RhdGljIHNzaXplX3Qgc2hvd19zdGF0ZV8jI19uYW1lKHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSwgXAorCQkJIHN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICpzdGF0ZV91c2FnZSwgY2hhciAqYnVmKSBcCiB7IFwKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgc3RhdGUtPl9uYW1lKTtcCiB9CiAKICNkZWZpbmUgZGVmaW5lX3Nob3dfc3RhdGVfdWxsX2Z1bmN0aW9uKF9uYW1lKSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X3N0YXRlXyMjX25hbWUoc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlLCBjaGFyICpidWYpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhdGVfIyNfbmFtZShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUsIFwKKwkJCXN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICpzdGF0ZV91c2FnZSwgY2hhciAqYnVmKSBcCiB7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCBzdGF0ZS0+X25hbWUpO1wKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCBzdGF0ZV91c2FnZS0+X25hbWUpO1wKIH0KIAogI2RlZmluZSBkZWZpbmVfc2hvd19zdGF0ZV9zdHJfZnVuY3Rpb24oX25hbWUpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfc3RhdGVfIyNfbmFtZShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUsIGNoYXIgKmJ1ZikgXAorc3RhdGljIHNzaXplX3Qgc2hvd19zdGF0ZV8jI19uYW1lKHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSwgXAorCQkJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKnN0YXRlX3VzYWdlLCBjaGFyICpidWYpIFwKIHsgXAogCWlmIChzdGF0ZS0+X25hbWVbMF0gPT0gJ1wwJylcCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjxudWxsPlxuIik7XApAQCAtMjY5LDE2ICsyNzMsMTggQEAKIAogI2RlZmluZSBrb2JqX3RvX3N0YXRlX29iaihrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IGNwdWlkbGVfc3RhdGVfa29iaiwga29iaikKICNkZWZpbmUga29ial90b19zdGF0ZShrKSAoa29ial90b19zdGF0ZV9vYmooayktPnN0YXRlKQorI2RlZmluZSBrb2JqX3RvX3N0YXRlX3VzYWdlKGspIChrb2JqX3RvX3N0YXRlX29iaihrKS0+c3RhdGVfdXNhZ2UpCiAjZGVmaW5lIGF0dHJfdG9fc3RhdGVhdHRyKGEpIGNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV9hdHRyLCBhdHRyKQogc3RhdGljIHNzaXplX3QgY3B1aWRsZV9zdGF0ZV9zaG93KHN0cnVjdCBrb2JqZWN0ICoga29iaiwKIAlzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciAsY2hhciAqIGJ1ZikKIHsKIAlpbnQgcmV0ID0gLUVJTzsKIAlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUgPSBrb2JqX3RvX3N0YXRlKGtvYmopOworCXN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICpzdGF0ZV91c2FnZSA9IGtvYmpfdG9fc3RhdGVfdXNhZ2Uoa29iaik7CiAJc3RydWN0IGNwdWlkbGVfc3RhdGVfYXR0ciAqIGNhdHRyID0gYXR0cl90b19zdGF0ZWF0dHIoYXR0cik7CiAKIAlpZiAoY2F0dHItPnNob3cpCi0JCXJldCA9IGNhdHRyLT5zaG93KHN0YXRlLCBidWYpOworCQlyZXQgPSBjYXR0ci0+c2hvdyhzdGF0ZSwgc3RhdGVfdXNhZ2UsIGJ1Zik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzE2LDEzICszMjIsMTUgQEAKIHsKIAlpbnQgaSwgcmV0ID0gLUVOT01FTTsKIAlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV9rb2JqICprb2JqOworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gY3B1aWRsZV9nZXRfZHJpdmVyKCk7CiAKIAkvKiBzdGF0ZSBzdGF0aXN0aWNzICovCiAJZm9yIChpID0gMDsgaSA8IGRldmljZS0+c3RhdGVfY291bnQ7IGkrKykgewogCQlrb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwdWlkbGVfc3RhdGVfa29iaiksIEdGUF9LRVJORUwpOwogCQlpZiAoIWtvYmopCiAJCQlnb3RvIGVycm9yX3N0YXRlOwotCQlrb2JqLT5zdGF0ZSA9ICZkZXZpY2UtPnN0YXRlc1tpXTsKKwkJa29iai0+c3RhdGUgPSAmZHJ2LT5zdGF0ZXNbaV07CisJCWtvYmotPnN0YXRlX3VzYWdlID0gJmRldmljZS0+c3RhdGVzX3VzYWdlW2ldOwogCQlpbml0X2NvbXBsZXRpb24oJmtvYmotPmtvYmpfdW5yZWdpc3Rlcik7CiAKIAkJcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmtvYmotPmtvYmosICZrdHlwZV9zdGF0ZV9jcHVpZGxlLCAmZGV2aWNlLT5rb2JqLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZyBiL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKaW5kZXggZTBiMjVkZS4uNmQxNmI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZworKysgYi9kcml2ZXJzL2NyeXB0by9LY29uZmlnCkBAIC0yMDAsNiArMjAwLDcgQEAKIAlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUgogCXNlbGVjdCBIV19SQU5ET00gaWYgQ1JZUFRPX0RFVl9ISUZOXzc5NVhfUk5HCiAJZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uICFBUkNIX0RNQV9BRERSX1RfNjRCSVQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGhhdmUgc3VwcG9ydCBmb3IgSElGTiA3OTV4IGNyeXB0byBhZGFwdGVycy4KIApAQCAtMjY2LDcgKzI2Nyw3IEBACiAKIGNvbmZpZyBDUllQVE9fREVWX1BJQ09YQ0VMTAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBwaWNvWGNlbGwgSVBTRUMgYW5kIExheWVyMiBjcnlwdG8gZW5naW5lcyIKLQlkZXBlbmRzIG9uIEFSQ0hfUElDT1hDRUxMCisJZGVwZW5kcyBvbiBBUkNIX1BJQ09YQ0VMTCAmJiBIQVZFX0NMSwogCXNlbGVjdCBDUllQVE9fQUVTCiAJc2VsZWN0IENSWVBUT19BVVRIRU5DCiAJc2VsZWN0IENSWVBUT19BTEdBUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jIGIvZHJpdmVycy9jcnlwdG8vaGlmbl83OTV4LmMKaW5kZXggYTg0MjUwYS4uZmU3NjVmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vaGlmbl83OTV4LmMKKysrIGIvZHJpdmVycy9jcnlwdG8vaGlmbl83OTV4LmMKQEAgLTI3NDQsMTAgKzI3NDQsOCBAQAogCXVuc2lnbmVkIGludCBmcmVxOwogCWludCBlcnI7CiAKLQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgewotCQlwcmludGsoS0VSTl9JTkZPICJISUZOIHN1cHBvcnRzIG9ubHkgMzItYml0IGFkZHJlc3Nlcy5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJLyogSElGTiBzdXBwb3J0cyBvbmx5IDMyLWJpdCBhZGRyZXNzZXMgKi8KKwlCVUlMRF9CVUdfT04oc2l6ZW9mKGRtYV9hZGRyX3QpICE9IDQpOwogCiAJaWYgKHN0cm5jbXAoaGlmbl9wbGxfcmVmLCAiZXh0IiwgMykgJiYKIAkgICAgc3RybmNtcChoaWZuX3BsbF9yZWYsICJwY2kiLCAzKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vbXZfY2VzYS5jIGIvZHJpdmVycy9jcnlwdG8vbXZfY2VzYS5jCmluZGV4IDNjZjMwM2UuLjVjNmY1NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL212X2Nlc2EuYworKysgYi9kcml2ZXJzL2NyeXB0by9tdl9jZXNhLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvaGFzaC5oPgogI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vbjJfY29yZS5jIGIvZHJpdmVycy9jcnlwdG8vbjJfY29yZS5jCmluZGV4IGQwMTgzZGQuLjg5NDRkYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL24yX2NvcmUuYworKysgYi9kcml2ZXJzL2NyeXB0by9uMl9jb3JlLmMKQEAgLTEwMDYsOSArMTAwNiw5IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcC0+bG9jaywgZmxhZ3MpOwogCitvdXQ6CiAJcHV0X2NwdSgpOwogCi1vdXQ6CiAJbjJfY2h1bmtfY29tcGxldGUocmVxLCBOVUxMKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTA5Niw5ICsxMDk2LDkgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5sb2NrLCBmbGFncyk7CiAKK291dDoKIAlwdXRfY3B1KCk7CiAKLW91dDoKIAluMl9jaHVua19jb21wbGV0ZShyZXEsIGVyciA/IE5VTEwgOiBmaW5hbF9pdl9hZGRyKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYyBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMKaW5kZXggZGIzM2QzMC4uMjliOTQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYworKysgYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jCkBAIC01MDgsMTAgKzUwOCw4IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoMCk7CiAKLQlpZiAoIWNwdV9oYXNfeGNyeXB0KSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSBQRlggIlZJQSBQYWRMb2NrIG5vdCBkZXRlY3RlZC5cbiIpOworCWlmICghY3B1X2hhc194Y3J5cHQpCiAJCXJldHVybiAtRU5PREVWOwotCX0KIAogCWlmICghY3B1X2hhc194Y3J5cHRfZW5hYmxlZCkgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgUEZYICJWSUEgUGFkTG9jayBkZXRlY3RlZCwgYnV0IG5vdCBlbmFibGVkLiBIbW0sIHN0cmFuZ2UuLi5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcGljb3hjZWxsX2NyeXB0by5jIGIvZHJpdmVycy9jcnlwdG8vcGljb3hjZWxsX2NyeXB0by5jCmluZGV4IDIzMGI1YjguLmEyYjU1M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3BpY294Y2VsbF9jcnlwdG8uYworKysgYi9kcml2ZXJzL2NyeXB0by9waWNveGNlbGxfY3J5cHRvLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CkBAIC0xMjQxLDggKzEyNDIsOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZ2luZS0+aHdfbG9jaywgZmxhZ3MpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wLCAmY29tcGxldGVkLCBsaXN0KSB7Ci0JCXJlcS0+Y29tcGxldGUocmVxKTsKIAkJbGlzdF9kZWwoJnJlcS0+bGlzdCk7CisJCXJlcS0+Y29tcGxldGUocmVxKTsKIAl9CiB9CiAKQEAgLTE2NTcsMTAgKzE2NTgsMzMgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgc3BhY2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQkgdW5zaWduZWQgbWF4X2N0eHMsIHNpemVfdCBjaXBoZXJfcGdfc3osCi0JCQkJIHNpemVfdCBoYXNoX3BnX3N6LCBzaXplX3QgZmlmb19zeiwKLQkJCQkgc3RydWN0IHNwYWNjX2FsZyAqYWxncywgc2l6ZV90IG51bV9hbGdzKQorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3BhY2Nfb2ZfaWRfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInBpY29jaGlwLHNwYWNjLWlwc2VjIiB9LAorCXsgLmNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2MtbDIiIH0sCisJe30KK307CisjZWxzZSAvKiBDT05GSUdfT0YgKi8KKyNkZWZpbmUgc3BhY2Nfb2ZfaWRfdGFibGUgTlVMTAorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCitzdGF0aWMgYm9vbCBzcGFjY19pc19jb21wYXRpYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJY29uc3QgY2hhciAqc3BhY2NfdHlwZSkKK3sKKwljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICpwbGF0aWQgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOworCisJaWYgKHBsYXRpZCAmJiAhc3RyY21wKHBsYXRpZC0+bmFtZSwgc3BhY2NfdHlwZSkpCisJCXJldHVybiB0cnVlOworCisjaWZkZWYgQ09ORklHX09GCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBkZXYtPmRldi5vZl9ub2RlLCBzcGFjY190eXBlKSkKKwkJcmV0dXJuIHRydWU7CisjZW5kaWYgLyogQ09ORklHX09GICovCisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNwYWNjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IGksIGVyciwgcmV0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgKmlycTsKQEAgLTE2NjksMTMgKzE2OTMsMjUgQEAKIAlpZiAoIWVuZ2luZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllbmdpbmUtPm1heF9jdHhzCT0gbWF4X2N0eHM7Ci0JZW5naW5lLT5jaXBoZXJfcGdfc3oJPSBjaXBoZXJfcGdfc3o7Ci0JZW5naW5lLT5oYXNoX3BnX3N6CT0gaGFzaF9wZ19zejsKLQllbmdpbmUtPmZpZm9fc3oJCT0gZmlmb19zejsKLQllbmdpbmUtPmFsZ3MJCT0gYWxnczsKLQllbmdpbmUtPm51bV9hbGdzCT0gbnVtX2FsZ3M7Ci0JZW5naW5lLT5uYW1lCQk9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCWlmIChzcGFjY19pc19jb21wYXRpYmxlKHBkZXYsICJwaWNvY2hpcCxzcGFjYy1pcHNlYyIpKSB7CisJCWVuZ2luZS0+bWF4X2N0eHMJPSBTUEFDQ19DUllQVE9fSVBTRUNfTUFYX0NUWFM7CisJCWVuZ2luZS0+Y2lwaGVyX3BnX3N6CT0gU1BBQ0NfQ1JZUFRPX0lQU0VDX0NJUEhFUl9QR19TWjsKKwkJZW5naW5lLT5oYXNoX3BnX3N6CT0gU1BBQ0NfQ1JZUFRPX0lQU0VDX0hBU0hfUEdfU1o7CisJCWVuZ2luZS0+Zmlmb19zegkJPSBTUEFDQ19DUllQVE9fSVBTRUNfRklGT19TWjsKKwkJZW5naW5lLT5hbGdzCQk9IGlwc2VjX2VuZ2luZV9hbGdzOworCQllbmdpbmUtPm51bV9hbGdzCT0gQVJSQVlfU0laRShpcHNlY19lbmdpbmVfYWxncyk7CisJfSBlbHNlIGlmIChzcGFjY19pc19jb21wYXRpYmxlKHBkZXYsICJwaWNvY2hpcCxzcGFjYy1sMiIpKSB7CisJCWVuZ2luZS0+bWF4X2N0eHMJPSBTUEFDQ19DUllQVE9fTDJfTUFYX0NUWFM7CisJCWVuZ2luZS0+Y2lwaGVyX3BnX3N6CT0gU1BBQ0NfQ1JZUFRPX0wyX0NJUEhFUl9QR19TWjsKKwkJZW5naW5lLT5oYXNoX3BnX3N6CT0gU1BBQ0NfQ1JZUFRPX0wyX0hBU0hfUEdfU1o7CisJCWVuZ2luZS0+Zmlmb19zegkJPSBTUEFDQ19DUllQVE9fTDJfRklGT19TWjsKKwkJZW5naW5lLT5hbGdzCQk9IGwyX2VuZ2luZV9hbGdzOworCQllbmdpbmUtPm51bV9hbGdzCT0gQVJSQVlfU0laRShsMl9lbmdpbmVfYWxncyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZW5naW5lLT5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CiAKIAltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlycSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CkBAIC0xNzExLDcgKzE3NDcsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJmVuZ2luZS0+aHdfbG9jayk7CiAKLQllbmdpbmUtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJZW5naW5lLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJyZWYiKTsKIAlpZiAoSVNfRVJSKGVuZ2luZS0+Y2xrKSkgewogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiY2xrIHVuYXZhaWxhYmxlXG4iKTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9zdGF0X2lycV90aHJlc2gpOwpAQCAtMTgwMCw3MiArMTgzNiwzMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBpcHNlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBzcGFjY19wcm9iZShwZGV2LCBTUEFDQ19DUllQVE9fSVBTRUNfTUFYX0NUWFMsCi0JCQkgICBTUEFDQ19DUllQVE9fSVBTRUNfQ0lQSEVSX1BHX1NaLAotCQkJICAgU1BBQ0NfQ1JZUFRPX0lQU0VDX0hBU0hfUEdfU1osCi0JCQkgICBTUEFDQ19DUllQVE9fSVBTRUNfRklGT19TWiwgaXBzZWNfZW5naW5lX2FsZ3MsCi0JCQkgICBBUlJBWV9TSVpFKGlwc2VjX2VuZ2luZV9hbGdzKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlwc2VjX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gaXBzZWNfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzcGFjY19yZW1vdmUpLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJwaWNveGNlbGwtaXBzZWMiLAotI2lmZGVmIENPTkZJR19QTQotCQkucG0JPSAmc3BhY2NfcG1fb3BzLAotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCX0sCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzcGFjY19pZF90YWJsZVtdID0geworCXsgInBpY29jaGlwLHNwYWNjLWlwc2VjIiwgfSwKKwl7ICJwaWNvY2hpcCxzcGFjYy1sMiIsIH0sCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBsMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBzcGFjY19wcm9iZShwZGV2LCBTUEFDQ19DUllQVE9fTDJfTUFYX0NUWFMsCi0JCQkgICBTUEFDQ19DUllQVE9fTDJfQ0lQSEVSX1BHX1NaLAotCQkJICAgU1BBQ0NfQ1JZUFRPX0wyX0hBU0hfUEdfU1osIFNQQUNDX0NSWVBUT19MMl9GSUZPX1NaLAotCQkJICAgbDJfZW5naW5lX2FsZ3MsIEFSUkFZX1NJWkUobDJfZW5naW5lX2FsZ3MpKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbDJfZHJpdmVyID0gewotCS5wcm9iZQkJPSBsMl9wcm9iZSwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwYWNjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc3BhY2NfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzcGFjY19yZW1vdmUpLAogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJwaWNveGNlbGwtbDIiLAorCQkubmFtZQk9ICJwaWNvY2hpcCxzcGFjYyIsCiAjaWZkZWYgQ09ORklHX1BNCiAJCS5wbQk9ICZzcGFjY19wbV9vcHMsCiAjZW5kaWYgLyogQ09ORklHX1BNICovCisJCS5vZl9tYXRjaF90YWJsZQk9IHNwYWNjX29mX2lkX3RhYmxlLAogCX0sCisJLmlkX3RhYmxlCT0gc3BhY2NfaWRfdGFibGUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzcGFjY19pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaXBzZWNfZHJpdmVyKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGlwc2VjIHNwYWNjIGRyaXZlciIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmwyX2RyaXZlcik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBsMiBzcGFjYyBkcml2ZXIiKTsKLQkJZ290byBsMl9mYWlsZWQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWwyX2ZhaWxlZDoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaXBzZWNfZHJpdmVyKTsKLW91dDoKLQlyZXR1cm4gcmV0OworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNwYWNjX2RyaXZlcik7CiB9CiBtb2R1bGVfaW5pdChzcGFjY19pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IHNwYWNjX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaXBzZWNfZHJpdmVyKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbDJfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BhY2NfZHJpdmVyKTsKIH0KIG1vZHVsZV9leGl0KHNwYWNjX2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by90YWxpdG9zLmMgYi9kcml2ZXJzL2NyeXB0by90YWxpdG9zLmMKaW5kZXggOGEwYmI0MS4uZGJlNzZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3RhbGl0b3MuYwpAQCAtNDE2LDcgKzQxNiw3IEBACiAvKgogICogbG9jYXRlIGN1cnJlbnQgKG9mZmVuZGluZykgZGVzY3JpcHRvcgogICovCi1zdGF0aWMgc3RydWN0IHRhbGl0b3NfZGVzYyAqY3VycmVudF9kZXNjKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGNoKQorc3RhdGljIHUzMiBjdXJyZW50X2Rlc2NfaGRyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGNoKQogewogCXN0cnVjdCB0YWxpdG9zX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgdGFpbCA9IHByaXYtPmNoYW5bY2hdLnRhaWw7CkBAIC00MjgsMjMgKzQyOCwyNSBAQAogCQl0YWlsID0gKHRhaWwgKyAxKSAmIChwcml2LT5maWZvX2xlbiAtIDEpOwogCQlpZiAodGFpbCA9PSBwcml2LT5jaGFuW2NoXS50YWlsKSB7CiAJCQlkZXZfZXJyKGRldiwgImNvdWxkbid0IGxvY2F0ZSBjdXJyZW50IGRlc2NyaXB0b3JcbiIpOwotCQkJcmV0dXJuIE5VTEw7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCXJldHVybiBwcml2LT5jaGFuW2NoXS5maWZvW3RhaWxdLmRlc2M7CisJcmV0dXJuIHByaXYtPmNoYW5bY2hdLmZpZm9bdGFpbF0uZGVzYy0+aGRyOwogfQogCiAvKgogICogdXNlciBkaWFnbm9zdGljczsgcmVwb3J0IHJvb3QgY2F1c2Ugb2YgZXJyb3IgYmFzZWQgb24gZXhlY3V0aW9uIHVuaXQgc3RhdHVzCiAgKi8KLXN0YXRpYyB2b2lkIHJlcG9ydF9ldV9lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjaCwKLQkJCSAgICBzdHJ1Y3QgdGFsaXRvc19kZXNjICpkZXNjKQorc3RhdGljIHZvaWQgcmVwb3J0X2V1X2Vycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGNoLCB1MzIgZGVzY19oZHIpCiB7CiAJc3RydWN0IHRhbGl0b3NfcHJpdmF0ZSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBpOwogCi0Jc3dpdGNoIChkZXNjLT5oZHIgJiBERVNDX0hEUl9TRUwwX01BU0spIHsKKwlpZiAoIWRlc2NfaGRyKQorCQlkZXNjX2hkciA9IGluX2JlMzIocHJpdi0+cmVnICsgVEFMSVRPU19ERVNDQlVGKGNoKSk7CisKKwlzd2l0Y2ggKGRlc2NfaGRyICYgREVTQ19IRFJfU0VMMF9NQVNLKSB7CiAJY2FzZSBERVNDX0hEUl9TRUwwX0FGRVU6CiAJCWRldl9lcnIoZGV2LCAiQUZFVUlTUiAweCUwOHhfJTA4eFxuIiwKIAkJCWluX2JlMzIocHJpdi0+cmVnICsgVEFMSVRPU19BRkVVSVNSKSwKQEAgLTQ4OCw3ICs0OTAsNyBAQAogCQlicmVhazsKIAl9CiAKLQlzd2l0Y2ggKGRlc2MtPmhkciAmIERFU0NfSERSX1NFTDFfTUFTSykgeworCXN3aXRjaCAoZGVzY19oZHIgJiBERVNDX0hEUl9TRUwxX01BU0spIHsKIAljYXNlIERFU0NfSERSX1NFTDFfTURFVUE6CiAJY2FzZSBERVNDX0hEUl9TRUwxX01ERVVCOgogCQlkZXZfZXJyKGRldiwgIk1ERVVJU1IgMHglMDh4XyUwOHhcbiIsCkBAIC01NTAsNyArNTUyLDcgQEAKIAkJaWYgKHZfbG8gJiBUQUxJVE9TX0NDUFNSX0xPX0lFVSkKIAkJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBleGVjdXRpb24gdW5pdCBlcnJvclxuIik7CiAJCWlmICh2X2xvICYgVEFMSVRPU19DQ1BTUl9MT19FVSkKLQkJCXJlcG9ydF9ldV9lcnJvcihkZXYsIGNoLCBjdXJyZW50X2Rlc2MoZGV2LCBjaCkpOworCQkJcmVwb3J0X2V1X2Vycm9yKGRldiwgY2gsIGN1cnJlbnRfZGVzY19oZHIoZGV2LCBjaCkpOwogCQlpZiAodl9sbyAmIFRBTElUT1NfQ0NQU1JfTE9fR0IpCiAJCQlkZXZfZXJyKGRldiwgImdhdGhlciBib3VuZGFyeSBlcnJvclxuIik7CiAJCWlmICh2X2xvICYgVEFMSVRPU19DQ1BTUl9MT19HUkwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RjYS9kY2EtY29yZS5jIGIvZHJpdmVycy9kY2EvZGNhLWNvcmUuYwppbmRleCAyNWVjMGJiLi5iYzZmNWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RjYS9kY2EtY29yZS5jCisrKyBiL2RyaXZlcnMvZGNhL2RjYS1jb3JlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kY2EuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRENBX1ZFUlNJT04gIjEuMTIuMSIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kY2EvZGNhLXN5c2ZzLmMgYi9kcml2ZXJzL2RjYS9kY2Etc3lzZnMuYwppbmRleCA1ZThmMzM1Li41OTFiNjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RjYS9kY2Etc3lzZnMuYworKysgYi9kcml2ZXJzL2RjYS9kY2Etc3lzZnMuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2RjYS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgc3RydWN0IGNsYXNzICpkY2FfY2xhc3M7CiBzdGF0aWMgc3RydWN0IGlkciBkY2FfaWRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggMmUzYjNkMy4uYWI4ZjQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0xOTMsNyArMTkzLDggQEAKIGNvbmZpZyBQTDMzMF9ETUEKIAl0cmlzdGF0ZSAiRE1BIEFQSSBEcml2ZXIgZm9yIFBMMzMwIgogCXNlbGVjdCBETUFfRU5HSU5FCi0JZGVwZW5kcyBvbiBQTDMzMAorCWRlcGVuZHMgb24gQVJNX0FNQkEKKwlzZWxlY3QgUEwzMzAKIAloZWxwCiAJICBTZWxlY3QgaWYgeW91ciBwbGF0Zm9ybSBoYXMgb25lIG9yIG1vcmUgUEwzMzAgRE1BQ3MuCiAJICBZb3UgbmVlZCB0byBwcm92aWRlIHBsYXRmb3JtIHNwZWNpZmljIHNldHRpbmdzIHZpYQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvYW1iYS1wbDA4eC5jIGIvZHJpdmVycy9kbWEvYW1iYS1wbDA4eC5jCmluZGV4IGJlMjFlM2YuLmI3Y2JkMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2FtYmEtcGwwOHguYworKysgYi9kcml2ZXJzL2RtYS9hbWJhLXBsMDh4LmMKQEAgLTY2LDMyICs2NiwyOSBAQAogICogICAgYWZ0ZXIgdGhlIGZpbmFsIHRyYW5zZmVyIHNpZ25hbGxlZCBieSBMQlJFUSBvciBMU1JFUS4gIFRoZSBETUFDCiAgKiAgICB3aWxsIHRoZW4gbW92ZSB0byB0aGUgbmV4dCBMTEkgZW50cnkuCiAgKgotICogT25seSB0aGUgZm9ybWVyIHdvcmtzIHNhbmVseSB3aXRoIHNjYXR0ZXIgbGlzdHMsIHNvIHdlIG9ubHkgaW1wbGVtZW50Ci0gKiB0aGUgRE1BQyBmbG93IGNvbnRyb2wgbWV0aG9kLiAgSG93ZXZlciwgcGVyaXBoZXJhbHMgd2hpY2ggdXNlIHRoZSBMQlJFUQotICogYW5kIExTUkVRIHNpZ25hbHMgKGVnLCBNTUNJKSBhcmUgdW5hYmxlIHRvIHVzZSB0aGlzIG1vZGUsIHdoaWNoIHRocm91Z2gKLSAqIHRoZXNlIGhhcmR3YXJlIHJlc3RyaWN0aW9ucyBwcmV2ZW50cyB0aGVtIGZyb20gdXNpbmcgc2NhdHRlciBETUEuCi0gKgogICogR2xvYmFsIFRPRE86CiAgKiAtIEJyZWFrIG91dCBjb21tb24gY29kZSBmcm9tIGFyY2gvYXJtL21hY2gtczNjNjR4eCBhbmQgc2hhcmUKICAqLwotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwOHguaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3BsMDgwLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUJInBsMDh4ZG1hYyIKIAorc3RhdGljIHN0cnVjdCBhbWJhX2RyaXZlciBwbDA4eF9hbWJhX2RyaXZlcjsKKwogLyoqCiAgKiBzdHJ1Y3QgdmVuZG9yX2RhdGEgLSB2ZW5kb3Itc3BlY2lmaWMgY29uZmlnIHBhcmFtZXRlcnMgZm9yIFBMMDh4IGRlcml2YXRpdmVzCiAgKiBAY2hhbm5lbHM6IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXZhaWxhYmxlIGluIHRoaXMgdmFyaWFudApAQCAtMTI2LDcgKzEyMyw4IEBACiAgKiBAcGh5X2NoYW5zOiBhcnJheSBvZiBkYXRhIGZvciB0aGUgcGh5c2ljYWwgY2hhbm5lbHMKICAqIEBwb29sOiBhIHBvb2wgZm9yIHRoZSBMTEkgZGVzY3JpcHRvcnMKICAqIEBwb29sX2N0cjogY291bnRlciBvZiBMTElzIGluIHRoZSBwb29sCi0gKiBAbGxpX2J1c2VzOiBiaXRtYXNrIHRvIG9yIGluIHRvIExMSSBwb2ludGVyIHNlbGVjdGluZyBBSEIgcG9ydCBmb3IgTExJIGZldGNoZXMKKyAqIEBsbGlfYnVzZXM6IGJpdG1hc2sgdG8gb3IgaW4gdG8gTExJIHBvaW50ZXIgc2VsZWN0aW5nIEFIQiBwb3J0IGZvciBMTEkKKyAqIGZldGNoZXMKICAqIEBtZW1fYnVzZXM6IHNldCB0byBpbmRpY2F0ZSBtZW1vcnkgdHJhbnNmZXJzIG9uIEFIQjIuCiAgKiBAbG9jazogYSBzcGlubG9jayBmb3IgdGhpcyBzdHJ1Y3QKICAqLwpAQCAtMTQ5LDE0ICsxNDcsNiBAQAogICogUEwwOFggc3BlY2lmaWMgZGVmaW5lcwogICovCiAKLS8qCi0gKiBNZW1vcnkgYm91bmRhcmllczogdGhlIG1hbnVhbCBmb3IgUEwwOHggc2F5cyB0aGF0IHRoZSBjb250cm9sbGVyCi0gKiBjYW5ub3QgcmVhZCBwYXN0IGEgMUtpQiBib3VuZGFyeSwgc28gdGhlc2UgZGVmaW5lcyBhcmUgdXNlZCB0bwotICogY3JlYXRlIHRyYW5zZmVyIExMSXMgdGhhdCBkbyBub3QgY3Jvc3Mgc3VjaCBib3VuZGFyaWVzLgotICovCi0jZGVmaW5lIFBMMDhYX0JPVU5EQVJZX1NISUZUCQkoMTApCS8qIDFLQiAweDQwMCAqLwotI2RlZmluZSBQTDA4WF9CT1VOREFSWV9TSVpFCQkoMSA8PCBQTDA4WF9CT1VOREFSWV9TSElGVCkKLQogLyogU2l6ZSAoYnl0ZXMpIG9mIGVhY2ggTExJIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIG9uZSB0cmFuc2ZlciAqLwogIyBkZWZpbmUgUEwwOFhfTExJX1RTRlJfU0laRQkweDIwMDAKIApAQCAtMjcyLDcgKzI2Miw2IEBACiAJd3JpdGVsKHZhbCwgY2gtPmJhc2UgKyBQTDA4MF9DSF9DT05GSUcpOwogfQogCi0KIC8qCiAgKiBwbDA4eF90ZXJtaW5hdGVfcGh5X2NoYW4oKSBzdG9wcyB0aGUgY2hhbm5lbCwgY2xlYXJzIHRoZSBGSUZPIGFuZAogICogY2xlYXJzIGFueSBwZW5kaW5nIGludGVycnVwdCBzdGF0dXMuICBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBmb3IKQEAgLTM2Myw3ICszNTIsOSBAQAogCWlmICghbGlzdF9lbXB0eSgmcGxjaGFuLT5wZW5kX2xpc3QpKSB7CiAJCXN0cnVjdCBwbDA4eF90eGQgKnR4ZGk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodHhkaSwgJnBsY2hhbi0+cGVuZF9saXN0LCBub2RlKSB7Ci0JCQlieXRlcyArPSB0eGRpLT5sZW47CisJCQlzdHJ1Y3QgcGwwOHhfc2cgKmRzZzsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZHNnLCAmdHhkLT5kc2dfbGlzdCwgbm9kZSkKKwkJCQlieXRlcyArPSBkc2ctPmxlbjsKIAkJfQogCX0KIApAQCAtNDA3LDYgKzM5OCw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBsMDh4LT5hZGV2LT5kZXYpOwogCXJldHVybiBjaDsKIH0KIApAQCAtNDIwLDYgKzQxMiw4IEBACiAJLyogU3RvcCB0aGUgY2hhbm5lbCBhbmQgY2xlYXIgaXRzIGludGVycnVwdHMgKi8KIAlwbDA4eF90ZXJtaW5hdGVfcGh5X2NoYW4ocGwwOHgsIGNoKTsKIAorCXBtX3J1bnRpbWVfcHV0KCZwbDA4eC0+YWRldi0+ZGV2KTsKKwogCS8qIE1hcmsgaXQgYXMgZnJlZSAqLwogCWNoLT5zZXJ2aW5nID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+bG9jaywgZmxhZ3MpOwpAQCAtNDk5LDM2ICs0OTMsMzAgQEAKIH07CiAKIC8qCi0gKiBBdXRvc2VsZWN0IGEgbWFzdGVyIGJ1cyB0byB1c2UgZm9yIHRoZSB0cmFuc2ZlciB0aGlzIHByZWZlcnMgdGhlCi0gKiBkZXN0aW5hdGlvbiBidXMgaWYgYm90aCBhdmFpbGFibGUgaWYgZml4ZWQgYWRkcmVzcyBvbiBvbmUgYnVzIHRoZQotICogb3RoZXIgd2lsbCBiZSBjaG9zZW4KKyAqIEF1dG9zZWxlY3QgYSBtYXN0ZXIgYnVzIHRvIHVzZSBmb3IgdGhlIHRyYW5zZmVyLiBTbGF2ZSB3aWxsIGJlIHRoZSBjaG9zZW4gYXMKKyAqIHZpY3RpbSBpbiBjYXNlIHNyYyAmIGRlc3QgYXJlIG5vdCBzaW1pbGFybHkgYWxpZ25lZC4gaS5lLiBJZiBhZnRlciBhbGlnbmluZworICogbWFzdGVycyBhZGRyZXNzIHdpdGggd2lkdGggcmVxdWlyZW1lbnRzIG9mIHRyYW5zZmVyIChieSBzZW5kaW5nIGZldyBieXRlIGJ5CisgKiBieXRlIGRhdGEpLCBzbGF2ZSBpcyBzdGlsbCBub3QgYWxpZ25lZCwgdGhlbiBpdHMgd2lkdGggd2lsbCBiZSByZWR1Y2VkIHRvCisgKiBCWVRFLgorICogLSBwcmVmZXJzIHRoZSBkZXN0aW5hdGlvbiBidXMgaWYgYm90aCBhdmFpbGFibGUKKyAqIC0gcHJlZmVycyBidXMgd2l0aCBmaXhlZCBhZGRyZXNzIChpLmUuIHBlcmlwaGVyYWwpCiAgKi8KIHN0YXRpYyB2b2lkIHBsMDh4X2Nob29zZV9tYXN0ZXJfYnVzKHN0cnVjdCBwbDA4eF9sbGlfYnVpbGRfZGF0YSAqYmQsCiAJc3RydWN0IHBsMDh4X2J1c19kYXRhICoqbWJ1cywgc3RydWN0IHBsMDh4X2J1c19kYXRhICoqc2J1cywgdTMyIGNjdGwpCiB7CiAJaWYgKCEoY2N0bCAmIFBMMDgwX0NPTlRST0xfRFNUX0lOQ1IpKSB7Ci0JCSptYnVzID0gJmJkLT5zcmNidXM7Ci0JCSpzYnVzID0gJmJkLT5kc3RidXM7Ci0JfSBlbHNlIGlmICghKGNjdGwgJiBQTDA4MF9DT05UUk9MX1NSQ19JTkNSKSkgewogCQkqbWJ1cyA9ICZiZC0+ZHN0YnVzOwogCQkqc2J1cyA9ICZiZC0+c3JjYnVzOworCX0gZWxzZSBpZiAoIShjY3RsICYgUEwwODBfQ09OVFJPTF9TUkNfSU5DUikpIHsKKwkJKm1idXMgPSAmYmQtPnNyY2J1czsKKwkJKnNidXMgPSAmYmQtPmRzdGJ1czsKIAl9IGVsc2UgewotCQlpZiAoYmQtPmRzdGJ1cy5idXN3aWR0aCA9PSA0KSB7CisJCWlmIChiZC0+ZHN0YnVzLmJ1c3dpZHRoID49IGJkLT5zcmNidXMuYnVzd2lkdGgpIHsKIAkJCSptYnVzID0gJmJkLT5kc3RidXM7CiAJCQkqc2J1cyA9ICZiZC0+c3JjYnVzOwotCQl9IGVsc2UgaWYgKGJkLT5zcmNidXMuYnVzd2lkdGggPT0gNCkgewotCQkJKm1idXMgPSAmYmQtPnNyY2J1czsKLQkJCSpzYnVzID0gJmJkLT5kc3RidXM7Ci0JCX0gZWxzZSBpZiAoYmQtPmRzdGJ1cy5idXN3aWR0aCA9PSAyKSB7Ci0JCQkqbWJ1cyA9ICZiZC0+ZHN0YnVzOwotCQkJKnNidXMgPSAmYmQtPnNyY2J1czsKLQkJfSBlbHNlIGlmIChiZC0+c3JjYnVzLmJ1c3dpZHRoID09IDIpIHsKLQkJCSptYnVzID0gJmJkLT5zcmNidXM7Ci0JCQkqc2J1cyA9ICZiZC0+ZHN0YnVzOwogCQl9IGVsc2UgewotCQkJLyogYmQtPnNyY2J1cy5idXN3aWR0aCA9PSAxICovCi0JCQkqbWJ1cyA9ICZiZC0+ZHN0YnVzOwotCQkJKnNidXMgPSAmYmQtPnNyY2J1czsKKwkJCSptYnVzID0gJmJkLT5zcmNidXM7CisJCQkqc2J1cyA9ICZiZC0+ZHN0YnVzOwogCQl9CiAJfQogfQpAQCAtNTQ3LDcgKzUzNSw4IEBACiAJbGxpc192YVtudW1fbGxpc10uY2N0bCA9IGNjdGw7CiAJbGxpc192YVtudW1fbGxpc10uc3JjID0gYmQtPnNyY2J1cy5hZGRyOwogCWxsaXNfdmFbbnVtX2xsaXNdLmRzdCA9IGJkLT5kc3RidXMuYWRkcjsKLQlsbGlzX3ZhW251bV9sbGlzXS5sbGkgPSBsbGlzX2J1cyArIChudW1fbGxpcyArIDEpICogc2l6ZW9mKHN0cnVjdCBwbDA4eF9sbGkpOworCWxsaXNfdmFbbnVtX2xsaXNdLmxsaSA9IGxsaXNfYnVzICsgKG51bV9sbGlzICsgMSkgKgorCQlzaXplb2Yoc3RydWN0IHBsMDh4X2xsaSk7CiAJbGxpc192YVtudW1fbGxpc10ubGxpIHw9IGJkLT5sbGlfYnVzOwogCiAJaWYgKGNjdGwgJiBQTDA4MF9DT05UUk9MX1NSQ19JTkNSKQpAQCAtNTYwLDE2ICs1NDksMTIgQEAKIAliZC0+cmVtYWluZGVyIC09IGxlbjsKIH0KIAotLyoKLSAqIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgdG8gZmlsbCB0byBib3VuZGFyeSwgb3IgbGVuLgotICogVGhpcyBjYWxjdWxhdGlvbiB3b3JrcyBmb3IgYW55IHZhbHVlIG9mIGFkZHIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IHBsMDh4X3ByZV9ib3VuZGFyeSh1MzIgYWRkciwgc2l6ZV90IGxlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVwX2J5dGVfd2lkdGhfbGxpKHN0cnVjdCBwbDA4eF9sbGlfYnVpbGRfZGF0YSAqYmQsCisJCXUzMiAqY2N0bCwgdTMyIGxlbiwgaW50IG51bV9sbGlzLCBzaXplX3QgKnRvdGFsX2J5dGVzKQogewotCXNpemVfdCBib3VuZGFyeV9sZW4gPSBQTDA4WF9CT1VOREFSWV9TSVpFIC0KLQkJCShhZGRyICYgKFBMMDhYX0JPVU5EQVJZX1NJWkUgLSAxKSk7Ci0KLQlyZXR1cm4gbWluKGJvdW5kYXJ5X2xlbiwgbGVuKTsKKwkqY2N0bCA9IHBsMDh4X2NjdGxfYml0cygqY2N0bCwgMSwgMSwgbGVuKTsKKwlwbDA4eF9maWxsX2xsaV9mb3JfZGVzYyhiZCwgbnVtX2xsaXMsIGxlbiwgKmNjdGwpOworCSgqdG90YWxfYnl0ZXMpICs9IGxlbjsKIH0KIAogLyoKQEAgLTU4MywxMyArNTY4LDEyIEBACiAJc3RydWN0IHBsMDh4X2J1c19kYXRhICptYnVzLCAqc2J1czsKIAlzdHJ1Y3QgcGwwOHhfbGxpX2J1aWxkX2RhdGEgYmQ7CiAJaW50IG51bV9sbGlzID0gMDsKLQl1MzIgY2N0bDsKLQlzaXplX3QgbWF4X2J5dGVzX3Blcl9sbGk7Ci0Jc2l6ZV90IHRvdGFsX2J5dGVzID0gMDsKKwl1MzIgY2N0bCwgZWFybHlfYnl0ZXMgPSAwOworCXNpemVfdCBtYXhfYnl0ZXNfcGVyX2xsaSwgdG90YWxfYnl0ZXM7CiAJc3RydWN0IHBsMDh4X2xsaSAqbGxpc192YTsKKwlzdHJ1Y3QgcGwwOHhfc2cgKmRzZzsKIAotCXR4ZC0+bGxpc192YSA9IGRtYV9wb29sX2FsbG9jKHBsMDh4LT5wb29sLCBHRlBfTk9XQUlULAotCQkJCSAgICAgICZ0eGQtPmxsaXNfYnVzKTsKKwl0eGQtPmxsaXNfdmEgPSBkbWFfcG9vbF9hbGxvYyhwbDA4eC0+cG9vbCwgR0ZQX05PV0FJVCwgJnR4ZC0+bGxpc19idXMpOwogCWlmICghdHhkLT5sbGlzX3ZhKSB7CiAJCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsICIlcyBubyBtZW1vcnkgZm9yIGxsaXNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CkBAIC01OTcsMTMgKzU4MSw5IEBACiAKIAlwbDA4eC0+cG9vbF9jdHIrKzsKIAotCS8qIEdldCB0aGUgZGVmYXVsdCBDQ1RMICovCi0JY2N0bCA9IHR4ZC0+Y2N0bDsKLQogCWJkLnR4ZCA9IHR4ZDsKLQliZC5zcmNidXMuYWRkciA9IHR4ZC0+c3JjX2FkZHI7Ci0JYmQuZHN0YnVzLmFkZHIgPSB0eGQtPmRzdF9hZGRyOwogCWJkLmxsaV9idXMgPSAocGwwOHgtPmxsaV9idXNlcyAmIFBMMDhYX0FIQjIpID8gUEwwODBfTExJX0xNX0FIQjIgOiAwOworCWNjdGwgPSB0eGQtPmNjdGw7CiAKIAkvKiBGaW5kIG1heGltdW0gd2lkdGggb2YgdGhlIHNvdXJjZSBidXMgKi8KIAliZC5zcmNidXMubWF4d2lkdGggPQpAQCAtNjE1LDIxNSArNTk1LDE3OSBAQAogCQlwbDA4eF9nZXRfYnl0ZXNfZm9yX2NjdGwoKGNjdGwgJiBQTDA4MF9DT05UUk9MX0RXSURUSF9NQVNLKSA+PgogCQkJCSAgICAgICBQTDA4MF9DT05UUk9MX0RXSURUSF9TSElGVCk7CiAKLQkvKiBTZXQgdXAgdGhlIGJ1cyB3aWR0aHMgdG8gdGhlIG1heGltdW0gKi8KLQliZC5zcmNidXMuYnVzd2lkdGggPSBiZC5zcmNidXMubWF4d2lkdGg7Ci0JYmQuZHN0YnVzLmJ1c3dpZHRoID0gYmQuZHN0YnVzLm1heHdpZHRoOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHNnLCAmdHhkLT5kc2dfbGlzdCwgbm9kZSkgeworCQl0b3RhbF9ieXRlcyA9IDA7CisJCWNjdGwgPSB0eGQtPmNjdGw7CiAKLQkvKgotCSAqIEJ5dGVzIHRyYW5zZmVycmVkID09IHRzaXplICogTUlOKGJ1c3dpZHRocyksIG5vdCBtYXgoYnVzd2lkdGhzKQotCSAqLwotCW1heF9ieXRlc19wZXJfbGxpID0gbWluKGJkLnNyY2J1cy5idXN3aWR0aCwgYmQuZHN0YnVzLmJ1c3dpZHRoKSAqCi0JCVBMMDgwX0NPTlRST0xfVFJBTlNGRVJfU0laRV9NQVNLOworCQliZC5zcmNidXMuYWRkciA9IGRzZy0+c3JjX2FkZHI7CisJCWJkLmRzdGJ1cy5hZGRyID0gZHNnLT5kc3RfYWRkcjsKKwkJYmQucmVtYWluZGVyID0gZHNnLT5sZW47CisJCWJkLnNyY2J1cy5idXN3aWR0aCA9IGJkLnNyY2J1cy5tYXh3aWR0aDsKKwkJYmQuZHN0YnVzLmJ1c3dpZHRoID0gYmQuZHN0YnVzLm1heHdpZHRoOwogCi0JLyogV2UgbmVlZCB0byBjb3VudCB0aGlzIGRvd24gdG8gemVybyAqLwotCWJkLnJlbWFpbmRlciA9IHR4ZC0+bGVuOworCQlwbDA4eF9jaG9vc2VfbWFzdGVyX2J1cygmYmQsICZtYnVzLCAmc2J1cywgY2N0bCk7CiAKLQkvKgotCSAqIENob29zZSBidXMgdG8gYWxpZ24gdG8KLQkgKiAtIHByZWZlcnMgZGVzdGluYXRpb24gYnVzIGlmIGJvdGggYXZhaWxhYmxlCi0JICogLSBpZiBmaXhlZCBhZGRyZXNzIG9uIG9uZSBidXMgY2hvb3NlcyBvdGhlcgotCSAqLwotCXBsMDh4X2Nob29zZV9tYXN0ZXJfYnVzKCZiZCwgJm1idXMsICZzYnVzLCBjY3RsKTsKLQotCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LCAic3JjPTB4JTA4eCVzLyV1IGRzdD0weCUwOHglcy8ldSBsZW49JXp1IGxsaW1heD0lenVcbiIsCi0JCSBiZC5zcmNidXMuYWRkciwgY2N0bCAmIFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IgPyAiKyIgOiAiIiwKLQkJIGJkLnNyY2J1cy5idXN3aWR0aCwKLQkJIGJkLmRzdGJ1cy5hZGRyLCBjY3RsICYgUEwwODBfQ09OVFJPTF9EU1RfSU5DUiA/ICIrIiA6ICIiLAotCQkgYmQuZHN0YnVzLmJ1c3dpZHRoLAotCQkgYmQucmVtYWluZGVyLCBtYXhfYnl0ZXNfcGVyX2xsaSk7Ci0JZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsICJtYnVzPSVzIHNidXM9JXNcbiIsCi0JCSBtYnVzID09ICZiZC5zcmNidXMgPyAic3JjIiA6ICJkc3QiLAotCQkgc2J1cyA9PSAmYmQuc3JjYnVzID8gInNyYyIgOiAiZHN0Iik7Ci0KLQlpZiAodHhkLT5sZW4gPCBtYnVzLT5idXN3aWR0aCkgewotCQkvKiBMZXNzIHRoYW4gYSBidXMgd2lkdGggYXZhaWxhYmxlIC0gc2VuZCBhcyBzaW5nbGUgYnl0ZXMgKi8KLQkJd2hpbGUgKGJkLnJlbWFpbmRlcikgewotCQkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkJICIlcyBzaW5nbGUgYnl0ZSBMTElzIGZvciBhIHRyYW5zZmVyIG9mICIKLQkJCQkgImxlc3MgdGhhbiBhIGJ1cyB3aWR0aCAocmVtYWluIDB4JTA4eClcbiIsCi0JCQkJIF9fZnVuY19fLCBiZC5yZW1haW5kZXIpOwotCQkJY2N0bCA9IHBsMDh4X2NjdGxfYml0cyhjY3RsLCAxLCAxLCAxKTsKLQkJCXBsMDh4X2ZpbGxfbGxpX2Zvcl9kZXNjKCZiZCwgbnVtX2xsaXMrKywgMSwgY2N0bCk7Ci0JCQl0b3RhbF9ieXRlcysrOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogTWFrZSBvbmUgYnl0ZSBMTElzIHVudGlsIG1hc3RlciBidXMgaXMgYWxpZ25lZCAqLwotCQl3aGlsZSAoKG1idXMtPmFkZHIpICUgKG1idXMtPmJ1c3dpZHRoKSkgewotCQkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkJIiVzIGFkanVzdG1lbnQgbGxpIGZvciBsZXNzIHRoYW4gYnVzIHdpZHRoICIKLQkJCQkgIihyZW1haW4gMHglMDh4KVxuIiwKLQkJCQkgX19mdW5jX18sIGJkLnJlbWFpbmRlcik7Ci0JCQljY3RsID0gcGwwOHhfY2N0bF9iaXRzKGNjdGwsIDEsIDEsIDEpOwotCQkJcGwwOHhfZmlsbF9sbGlfZm9yX2Rlc2MoJmJkLCBudW1fbGxpcysrLCAxLCBjY3RsKTsKLQkJCXRvdGFsX2J5dGVzKys7Ci0JCX0KKwkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsICJzcmM9MHglMDh4JXMvJXUgZHN0PTB4JTA4eCVzLyV1IGxlbj0lenVcbiIsCisJCQliZC5zcmNidXMuYWRkciwgY2N0bCAmIFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IgPyAiKyIgOiAiIiwKKwkJCWJkLnNyY2J1cy5idXN3aWR0aCwKKwkJCWJkLmRzdGJ1cy5hZGRyLCBjY3RsICYgUEwwODBfQ09OVFJPTF9EU1RfSU5DUiA/ICIrIiA6ICIiLAorCQkJYmQuZHN0YnVzLmJ1c3dpZHRoLAorCQkJYmQucmVtYWluZGVyKTsKKwkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsICJtYnVzPSVzIHNidXM9JXNcbiIsCisJCQltYnVzID09ICZiZC5zcmNidXMgPyAic3JjIiA6ICJkc3QiLAorCQkJc2J1cyA9PSAmYmQuc3JjYnVzID8gInNyYyIgOiAiZHN0Iik7CiAKIAkJLyoKLQkJICogTWFzdGVyIG5vdyBhbGlnbmVkCi0JCSAqIC0gaWYgc2xhdmUgaXMgbm90IHRoZW4gd2UgbXVzdCBzZXQgaXRzIHdpZHRoIGRvd24KKwkJICogWmVybyBsZW5ndGggaXMgb25seSBhbGxvd2VkIGlmIGFsbCB0aGVzZSByZXF1aXJlbWVudHMgYXJlCisJCSAqIG1ldDoKKwkJICogLSBmbG93IGNvbnRyb2xsZXIgaXMgcGVyaXBoZXJhbC4KKwkJICogLSBzcmMuYWRkciBpcyBhbGlnbmVkIHRvIHNyYy53aWR0aAorCQkgKiAtIGRzdC5hZGRyIGlzIGFsaWduZWQgdG8gZHN0LndpZHRoCisJCSAqCisJCSAqIHNnX2xlbiA9PSAxIHNob3VsZCBiZSB0cnVlLCBhcyB0aGVyZSBjYW4gYmUgdHdvIGNhc2VzIGhlcmU6CisJCSAqCisJCSAqIC0gTWVtb3J5IGFkZHJlc3NlcyBhcmUgY29udGlndW91cyBhbmQgYXJlIG5vdCBzY2F0dGVyZWQuCisJCSAqICAgSGVyZSwgT25seSBvbmUgc2cgd2lsbCBiZSBwYXNzZWQgYnkgdXNlciBkcml2ZXIsIHdpdGgKKwkJICogICBtZW1vcnkgYWRkcmVzcyBhbmQgemVybyBsZW5ndGguIFdlIHBhc3MgdGhpcyB0byBjb250cm9sbGVyCisJCSAqICAgYW5kIGFmdGVyIHRoZSB0cmFuc2ZlciBpdCB3aWxsIHJlY2VpdmUgdGhlIGxhc3QgYnVyc3QKKwkJICogICByZXF1ZXN0IGZyb20gcGVyaXBoZXJhbCBhbmQgc28gdHJhbnNmZXIgZmluaXNoZXMuCisJCSAqCisJCSAqIC0gTWVtb3J5IGFkZHJlc3NlcyBhcmUgc2NhdHRlcmVkIGFuZCBhcmUgbm90IGNvbnRpZ3VvdXMuCisJCSAqICAgSGVyZSwgT2J2aW91c2x5IGFzIERNQSBjb250cm9sbGVyIGRvZXNuJ3Qga25vdyB3aGVuIGEgbGxpJ3MKKwkJICogICB0cmFuc2ZlciBnZXRzIG92ZXIsIGl0IGNhbid0IGxvYWQgbmV4dCBsbGkuIFNvIGluIHRoaXMKKwkJICogICBjYXNlLCB0aGVyZSBoYXMgdG8gYmUgYW4gYXNzdW1wdGlvbiB0aGF0IG9ubHkgb25lIGxsaSBpcworCQkgKiAgIHN1cHBvcnRlZC4gVGh1cywgd2UgY2FuJ3QgaGF2ZSBzY2F0dGVyZWQgYWRkcmVzc2VzLgogCQkgKi8KLQkJaWYgKHNidXMtPmFkZHIgJSBzYnVzLT5idXN3aWR0aCkgewotCQkJZGV2X2RiZygmcGwwOHgtPmFkZXYtPmRldiwKLQkJCQkiJXMgc2V0IGRvd24gYnVzIHdpZHRoIHRvIG9uZSBieXRlXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0KLQkJCXNidXMtPmJ1c3dpZHRoID0gMTsKLQkJfQotCi0JCS8qCi0JCSAqIE1ha2UgbGFyZ2VzdCBwb3NzaWJsZSBMTElzIHVudGlsIGxlc3MgdGhhbiBvbmUgYnVzCi0JCSAqIHdpZHRoIGxlZnQKLQkJICovCi0JCXdoaWxlIChiZC5yZW1haW5kZXIgPiAobWJ1cy0+YnVzd2lkdGggLSAxKSkgewotCQkJc2l6ZV90IGxsaV9sZW4sIHRhcmdldF9sZW4sIHRzaXplLCBvZGRfYnl0ZXM7Ci0KLQkJCS8qCi0JCQkgKiBJZiBlbm91Z2ggbGVmdCB0cnkgdG8gc2VuZCBtYXggcG9zc2libGUsCi0JCQkgKiBvdGhlcndpc2UgdHJ5IHRvIHNlbmQgdGhlIHJlbWFpbmRlcgotCQkJICovCi0JCQl0YXJnZXRfbGVuID0gbWluKGJkLnJlbWFpbmRlciwgbWF4X2J5dGVzX3Blcl9sbGkpOwotCi0JCQkvKgotCQkJICogU2V0IGJ1cyBsZW5ndGhzIGZvciBpbmNyZW1lbnRpbmcgYnVzZXMgdG8gdGhlCi0JCQkgKiBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggZmlsbCB0byBuZXh0IG1lbW9yeSBib3VuZGFyeSwKLQkJCSAqIGxpbWl0aW5nIG9uIHRoZSB0YXJnZXQgbGVuZ3RoIGNhbGN1bGF0ZWQgYWJvdmUuCi0JCQkgKi8KLQkJCWlmIChjY3RsICYgUEwwODBfQ09OVFJPTF9TUkNfSU5DUikKLQkJCQliZC5zcmNidXMuZmlsbF9ieXRlcyA9Ci0JCQkJCXBsMDh4X3ByZV9ib3VuZGFyeShiZC5zcmNidXMuYWRkciwKLQkJCQkJCXRhcmdldF9sZW4pOwotCQkJZWxzZQotCQkJCWJkLnNyY2J1cy5maWxsX2J5dGVzID0gdGFyZ2V0X2xlbjsKLQotCQkJaWYgKGNjdGwgJiBQTDA4MF9DT05UUk9MX0RTVF9JTkNSKQotCQkJCWJkLmRzdGJ1cy5maWxsX2J5dGVzID0KLQkJCQkJcGwwOHhfcHJlX2JvdW5kYXJ5KGJkLmRzdGJ1cy5hZGRyLAotCQkJCQkJdGFyZ2V0X2xlbik7Ci0JCQllbHNlCi0JCQkJYmQuZHN0YnVzLmZpbGxfYnl0ZXMgPSB0YXJnZXRfbGVuOwotCi0JCQkvKiBGaW5kIHRoZSBuZWFyZXN0ICovCi0JCQlsbGlfbGVuCT0gbWluKGJkLnNyY2J1cy5maWxsX2J5dGVzLAotCQkJCSAgICAgIGJkLmRzdGJ1cy5maWxsX2J5dGVzKTsKLQotCQkJQlVHX09OKGxsaV9sZW4gPiBiZC5yZW1haW5kZXIpOwotCi0JCQlpZiAobGxpX2xlbiA8PSAwKSB7Ci0JCQkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwKLQkJCQkJIiVzIGxsaV9sZW4gaXMgJXp1LCA8PSAwXG4iLAotCQkJCQkJX19mdW5jX18sIGxsaV9sZW4pOworCQlpZiAoIWJkLnJlbWFpbmRlcikgeworCQkJdTMyIGZjID0gKHR4ZC0+Y2NmZyAmIFBMMDgwX0NPTkZJR19GTE9XX0NPTlRST0xfTUFTSykgPj4KKwkJCQlQTDA4MF9DT05GSUdfRkxPV19DT05UUk9MX1NISUZUOworCQkJaWYgKCEoKGZjID49IFBMMDgwX0ZMT1dfU1JDMkRTVF9EU1QpICYmCisJCQkJCShmYyA8PSBQTDA4MF9GTE9XX1NSQzJEU1RfU1JDKSkpIHsKKwkJCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LCAiJXMgc2cgbGVuIGNhbid0IGJlIHplcm8iLAorCQkJCQlfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAKLQkJCWlmIChsbGlfbGVuID09IHRhcmdldF9sZW4pIHsKLQkJCQkvKgotCQkJCSAqIENhbiBzZW5kIHdoYXQgd2Ugd2FudGVkLgotCQkJCSAqIE1haW50YWluIGFsaWdubWVudAotCQkJCSAqLwotCQkJCWxsaV9sZW4JPSAobGxpX2xlbi9tYnVzLT5idXN3aWR0aCkgKgotCQkJCQkJCW1idXMtPmJ1c3dpZHRoOwotCQkJCW9kZF9ieXRlcyA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogU28gbm93IHdlIGtub3cgaG93IG1hbnkgYnl0ZXMgdG8gdHJhbnNmZXIKLQkJCQkgKiB0byBnZXQgdG8gdGhlIG5lYXJlc3QgYm91bmRhcnkuICBUaGUgbmV4dAotCQkJCSAqIExMSSB3aWxsIHBhc3QgdGhlIGJvdW5kYXJ5LiAgSG93ZXZlciwgd2UKLQkJCQkgKiBtYXkgYmUgd29ya2luZyB0byBhIGJvdW5kYXJ5IG9uIHRoZSBzbGF2ZQotCQkJCSAqIGJ1cy4gIFdlIG5lZWQgdG8gZW5zdXJlIHRoZSBtYXN0ZXIgc3RheXMKLQkJCQkgKiBhbGlnbmVkLCBhbmQgdGhhdCB3ZSBhcmUgd29ya2luZyBpbgotCQkJCSAqIG11bHRpcGxlcyBvZiB0aGUgYnVzIHdpZHRocy4KLQkJCQkgKi8KLQkJCQlvZGRfYnl0ZXMgPSBsbGlfbGVuICUgbWJ1cy0+YnVzd2lkdGg7Ci0JCQkJbGxpX2xlbiAtPSBvZGRfYnl0ZXM7Ci0KKwkJCWlmICgoYmQuc3JjYnVzLmFkZHIgJSBiZC5zcmNidXMuYnVzd2lkdGgpIHx8CisJCQkJCShiZC5zcmNidXMuYWRkciAlIGJkLnNyY2J1cy5idXN3aWR0aCkpIHsKKwkJCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LAorCQkJCQkiJXMgc3JjICYgZHN0IGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIHNyYyIKKwkJCQkJIiAmIGRzdCB3aWR0aCBpZiBwZXJpcGhlcmFsIGlzIGZsb3cgY29udHJvbGxlciIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlyZXR1cm4gMDsKIAkJCX0KIAotCQkJaWYgKGxsaV9sZW4pIHsKLQkJCQkvKgotCQkJCSAqIENoZWNrIGFnYWluc3QgbWluaW11bSBidXMgYWxpZ25tZW50OgotCQkJCSAqIENhbGN1bGF0ZSBhY3R1YWwgdHJhbnNmZXIgc2l6ZSBpbiByZWxhdGlvbgotCQkJCSAqIHRvIGJ1cyB3aWR0aCBhbiBnZXQgYSBtYXhpbXVtIHJlbWFpbmRlciBvZgotCQkJCSAqIHRoZSBzbWFsbGVzdCBidXMgd2lkdGggLSAxCi0JCQkJICovCi0JCQkJLyogRklYTUU6IHVzZSByb3VuZF9kb3duKCk/ICovCi0JCQkJdHNpemUgPSBsbGlfbGVuIC8gbWluKG1idXMtPmJ1c3dpZHRoLAotCQkJCQkJICAgICAgc2J1cy0+YnVzd2lkdGgpOwotCQkJCWxsaV9sZW4JPSB0c2l6ZSAqIG1pbihtYnVzLT5idXN3aWR0aCwKLQkJCQkJCSAgICAgIHNidXMtPmJ1c3dpZHRoKTsKLQotCQkJCWlmICh0YXJnZXRfbGVuICE9IGxsaV9sZW4pIHsKLQkJCQkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkJCSIlcyBjYW4ndCBzZW5kIHdoYXQgd2Ugd2FudC4gRGVzaXJlZCAweCUwOHp4LCBsbGkgb2YgMHglMDh6eCBieXRlcyBpbiB0eGQgb2YgMHglMDh6eFxuIiwKLQkJCQkJX19mdW5jX18sIHRhcmdldF9sZW4sIGxsaV9sZW4sIHR4ZC0+bGVuKTsKLQkJCQl9Ci0KLQkJCQljY3RsID0gcGwwOHhfY2N0bF9iaXRzKGNjdGwsCi0JCQkJCQkgICAgICAgYmQuc3JjYnVzLmJ1c3dpZHRoLAotCQkJCQkJICAgICAgIGJkLmRzdGJ1cy5idXN3aWR0aCwKLQkJCQkJCSAgICAgICB0c2l6ZSk7Ci0KLQkJCQlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwKLQkJCQkJIiVzIGZpbGwgbGxpIHdpdGggc2luZ2xlIGxsaSBjaHVuayBvZiBzaXplIDB4JTA4enggKHJlbWFpbmRlciAweCUwOHp4KVxuIiwKLQkJCQkJX19mdW5jX18sIGxsaV9sZW4sIGJkLnJlbWFpbmRlcik7Ci0JCQkJcGwwOHhfZmlsbF9sbGlfZm9yX2Rlc2MoJmJkLCBudW1fbGxpcysrLAotCQkJCQlsbGlfbGVuLCBjY3RsKTsKLQkJCQl0b3RhbF9ieXRlcyArPSBsbGlfbGVuOwotCQkJfQotCi0KLQkJCWlmIChvZGRfYnl0ZXMpIHsKLQkJCQkvKgotCQkJCSAqIENyZWVwIHBhc3QgdGhlIGJvdW5kYXJ5LCBtYWludGFpbmluZwotCQkJCSAqIG1hc3RlciBhbGlnbm1lbnQKLQkJCQkgKi8KLQkJCQlpbnQgajsKLQkJCQlmb3IgKGogPSAwOyAoaiA8IG1idXMtPmJ1c3dpZHRoKQotCQkJCQkJJiYgKGJkLnJlbWFpbmRlcik7IGorKykgewotCQkJCQljY3RsID0gcGwwOHhfY2N0bF9iaXRzKGNjdGwsIDEsIDEsIDEpOwotCQkJCQlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwKLQkJCQkJCSIlcyBhbGlnbiB3aXRoIGJvdW5kYXJ5LCBzaW5nbGUgYnl0ZSAocmVtYWluIDB4JTA4engpXG4iLAotCQkJCQkJX19mdW5jX18sIGJkLnJlbWFpbmRlcik7Ci0JCQkJCXBsMDh4X2ZpbGxfbGxpX2Zvcl9kZXNjKCZiZCwKLQkJCQkJCW51bV9sbGlzKyssIDEsIGNjdGwpOwotCQkJCQl0b3RhbF9ieXRlcysrOwotCQkJCX0KLQkJCX0KKwkJCWNjdGwgPSBwbDA4eF9jY3RsX2JpdHMoY2N0bCwgYmQuc3JjYnVzLmJ1c3dpZHRoLAorCQkJCQliZC5kc3RidXMuYnVzd2lkdGgsIDApOworCQkJcGwwOHhfZmlsbF9sbGlfZm9yX2Rlc2MoJmJkLCBudW1fbGxpcysrLCAwLCBjY3RsKTsKKwkJCWJyZWFrOwogCQl9CiAKIAkJLyoKLQkJICogU2VuZCBhbnkgb2RkIGJ5dGVzCisJCSAqIFNlbmQgYnl0ZSBieSBieXRlIGZvciBmb2xsb3dpbmcgY2FzZXMKKwkJICogLSBMZXNzIHRoYW4gYSBidXMgd2lkdGggYXZhaWxhYmxlCisJCSAqIC0gdW50aWwgbWFzdGVyIGJ1cyBpcyBhbGlnbmVkCiAJCSAqLwotCQl3aGlsZSAoYmQucmVtYWluZGVyKSB7Ci0JCQljY3RsID0gcGwwOHhfY2N0bF9iaXRzKGNjdGwsIDEsIDEsIDEpOwotCQkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkJIiVzIGFsaWduIHdpdGggYm91bmRhcnksIHNpbmdsZSBvZGQgYnl0ZSAocmVtYWluICV6dSlcbiIsCi0JCQkJX19mdW5jX18sIGJkLnJlbWFpbmRlcik7Ci0JCQlwbDA4eF9maWxsX2xsaV9mb3JfZGVzYygmYmQsIG51bV9sbGlzKyssIDEsIGNjdGwpOwotCQkJdG90YWxfYnl0ZXMrKzsKKwkJaWYgKGJkLnJlbWFpbmRlciA8IG1idXMtPmJ1c3dpZHRoKQorCQkJZWFybHlfYnl0ZXMgPSBiZC5yZW1haW5kZXI7CisJCWVsc2UgaWYgKChtYnVzLT5hZGRyKSAlIChtYnVzLT5idXN3aWR0aCkpIHsKKwkJCWVhcmx5X2J5dGVzID0gbWJ1cy0+YnVzd2lkdGggLSAobWJ1cy0+YWRkcikgJQorCQkJCShtYnVzLT5idXN3aWR0aCk7CisJCQlpZiAoKGJkLnJlbWFpbmRlciAtIGVhcmx5X2J5dGVzKSA8IG1idXMtPmJ1c3dpZHRoKQorCQkJCWVhcmx5X2J5dGVzID0gYmQucmVtYWluZGVyOwogCQl9Ci0JfQotCWlmICh0b3RhbF9ieXRlcyAhPSB0eGQtPmxlbikgewotCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkJIiVzIHNpemUgb2YgZW5jb2RlZCBsbGk6cyBkb24ndCBtYXRjaCB0b3RhbCB0eGQsIHRyYW5zZmVycmVkIDB4JTA4enggZnJvbSBzaXplIDB4JTA4enhcbiIsCi0JCQlfX2Z1bmNfXywgdG90YWxfYnl0ZXMsIHR4ZC0+bGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQogCi0JaWYgKG51bV9sbGlzID49IE1BWF9OVU1fVFNGUl9MTElTKSB7Ci0JCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkiJXMgbmVlZCB0byBpbmNyZWFzZSBNQVhfTlVNX1RTRlJfTExJUyBmcm9tIDB4JTA4eFxuIiwKLQkJCV9fZnVuY19fLCAodTMyKSBNQVhfTlVNX1RTRlJfTExJUyk7Ci0JCXJldHVybiAwOworCQlpZiAoZWFybHlfYnl0ZXMpIHsKKwkJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAorCQkJCSIlcyBieXRlIHdpZHRoIExMSXMgKHJlbWFpbiAweCUwOHgpXG4iLAorCQkJCV9fZnVuY19fLCBiZC5yZW1haW5kZXIpOworCQkJcHJlcF9ieXRlX3dpZHRoX2xsaSgmYmQsICZjY3RsLCBlYXJseV9ieXRlcywgbnVtX2xsaXMrKywKKwkJCQkmdG90YWxfYnl0ZXMpOworCQl9CisKKwkJaWYgKGJkLnJlbWFpbmRlcikgeworCQkJLyoKKwkJCSAqIE1hc3RlciBub3cgYWxpZ25lZAorCQkJICogLSBpZiBzbGF2ZSBpcyBub3QgdGhlbiB3ZSBtdXN0IHNldCBpdHMgd2lkdGggZG93bgorCQkJICovCisJCQlpZiAoc2J1cy0+YWRkciAlIHNidXMtPmJ1c3dpZHRoKSB7CisJCQkJZGV2X2RiZygmcGwwOHgtPmFkZXYtPmRldiwKKwkJCQkJIiVzIHNldCBkb3duIGJ1cyB3aWR0aCB0byBvbmUgYnl0ZVxuIiwKKwkJCQkJX19mdW5jX18pOworCisJCQkJc2J1cy0+YnVzd2lkdGggPSAxOworCQkJfQorCisJCQkvKgorCQkJICogQnl0ZXMgdHJhbnNmZXJyZWQgPSB0c2l6ZSAqIHNyYyB3aWR0aCwgbm90CisJCQkgKiBNSU4oYnVzd2lkdGhzKQorCQkJICovCisJCQltYXhfYnl0ZXNfcGVyX2xsaSA9IGJkLnNyY2J1cy5idXN3aWR0aCAqCisJCQkJUEwwODBfQ09OVFJPTF9UUkFOU0ZFUl9TSVpFX01BU0s7CisJCQlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwKKwkJCQkiJXMgbWF4IGJ5dGVzIHBlciBsbGkgPSAlenVcbiIsCisJCQkJX19mdW5jX18sIG1heF9ieXRlc19wZXJfbGxpKTsKKworCQkJLyoKKwkJCSAqIE1ha2UgbGFyZ2VzdCBwb3NzaWJsZSBMTElzIHVudGlsIGxlc3MgdGhhbiBvbmUgYnVzCisJCQkgKiB3aWR0aCBsZWZ0CisJCQkgKi8KKwkJCXdoaWxlIChiZC5yZW1haW5kZXIgPiAobWJ1cy0+YnVzd2lkdGggLSAxKSkgeworCQkJCXNpemVfdCBsbGlfbGVuLCB0c2l6ZSwgd2lkdGg7CisKKwkJCQkvKgorCQkJCSAqIElmIGVub3VnaCBsZWZ0IHRyeSB0byBzZW5kIG1heCBwb3NzaWJsZSwKKwkJCQkgKiBvdGhlcndpc2UgdHJ5IHRvIHNlbmQgdGhlIHJlbWFpbmRlcgorCQkJCSAqLworCQkJCWxsaV9sZW4gPSBtaW4oYmQucmVtYWluZGVyLCBtYXhfYnl0ZXNfcGVyX2xsaSk7CisKKwkJCQkvKgorCQkJCSAqIENoZWNrIGFnYWluc3QgbWF4aW11bSBidXMgYWxpZ25tZW50OgorCQkJCSAqIENhbGN1bGF0ZSBhY3R1YWwgdHJhbnNmZXIgc2l6ZSBpbiByZWxhdGlvbiB0bworCQkJCSAqIGJ1cyB3aWR0aCBhbiBnZXQgYSBtYXhpbXVtIHJlbWFpbmRlciBvZiB0aGUKKwkJCQkgKiBoaWdoZXN0IGJ1cyB3aWR0aCAtIDEKKwkJCQkgKi8KKwkJCQl3aWR0aCA9IG1heChtYnVzLT5idXN3aWR0aCwgc2J1cy0+YnVzd2lkdGgpOworCQkJCWxsaV9sZW4gPSAobGxpX2xlbiAvIHdpZHRoKSAqIHdpZHRoOworCQkJCXRzaXplID0gbGxpX2xlbiAvIGJkLnNyY2J1cy5idXN3aWR0aDsKKworCQkJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAorCQkJCQkiJXMgZmlsbCBsbGkgd2l0aCBzaW5nbGUgbGxpIGNodW5rIG9mICIKKwkJCQkJInNpemUgMHglMDh6eCAocmVtYWluZGVyIDB4JTA4engpXG4iLAorCQkJCQlfX2Z1bmNfXywgbGxpX2xlbiwgYmQucmVtYWluZGVyKTsKKworCQkJCWNjdGwgPSBwbDA4eF9jY3RsX2JpdHMoY2N0bCwgYmQuc3JjYnVzLmJ1c3dpZHRoLAorCQkJCQliZC5kc3RidXMuYnVzd2lkdGgsIHRzaXplKTsKKwkJCQlwbDA4eF9maWxsX2xsaV9mb3JfZGVzYygmYmQsIG51bV9sbGlzKyssCisJCQkJCQlsbGlfbGVuLCBjY3RsKTsKKwkJCQl0b3RhbF9ieXRlcyArPSBsbGlfbGVuOworCQkJfQorCisJCQkvKgorCQkJICogU2VuZCBhbnkgb2RkIGJ5dGVzCisJCQkgKi8KKwkJCWlmIChiZC5yZW1haW5kZXIpIHsKKwkJCQlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwKKwkJCQkJIiVzIGFsaWduIHdpdGggYm91bmRhcnksIHNlbmQgb2RkIGJ5dGVzIChyZW1haW4gJXp1KVxuIiwKKwkJCQkJX19mdW5jX18sIGJkLnJlbWFpbmRlcik7CisJCQkJcHJlcF9ieXRlX3dpZHRoX2xsaSgmYmQsICZjY3RsLCBiZC5yZW1haW5kZXIsCisJCQkJCQludW1fbGxpcysrLCAmdG90YWxfYnl0ZXMpOworCQkJfQorCQl9CisKKwkJaWYgKHRvdGFsX2J5dGVzICE9IGRzZy0+bGVuKSB7CisJCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LAorCQkJCSIlcyBzaXplIG9mIGVuY29kZWQgbGxpOnMgZG9uJ3QgbWF0Y2ggdG90YWwgdHhkLCB0cmFuc2ZlcnJlZCAweCUwOHp4IGZyb20gc2l6ZSAweCUwOHp4XG4iLAorCQkJCV9fZnVuY19fLCB0b3RhbF9ieXRlcywgZHNnLT5sZW4pOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobnVtX2xsaXMgPj0gTUFYX05VTV9UU0ZSX0xMSVMpIHsKKwkJCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsCisJCQkJIiVzIG5lZWQgdG8gaW5jcmVhc2UgTUFYX05VTV9UU0ZSX0xMSVMgZnJvbSAweCUwOHhcbiIsCisJCQkJX19mdW5jX18sICh1MzIpIE1BWF9OVU1fVFNGUl9MTElTKTsKKwkJCXJldHVybiAwOworCQl9CiAJfQogCiAJbGxpc192YSA9IHR4ZC0+bGxpc192YTsKQEAgLTg1NiwxMSArODAwLDE5IEBACiBzdGF0aWMgdm9pZCBwbDA4eF9mcmVlX3R4ZChzdHJ1Y3QgcGwwOHhfZHJpdmVyX2RhdGEgKnBsMDh4LAogCQkJICAgc3RydWN0IHBsMDh4X3R4ZCAqdHhkKQogeworCXN0cnVjdCBwbDA4eF9zZyAqZHNnLCAqX2RzZzsKKwogCS8qIEZyZWUgdGhlIExMSSAqLwotCWRtYV9wb29sX2ZyZWUocGwwOHgtPnBvb2wsIHR4ZC0+bGxpc192YSwgdHhkLT5sbGlzX2J1cyk7CisJaWYgKHR4ZC0+bGxpc192YSkKKwkJZG1hX3Bvb2xfZnJlZShwbDA4eC0+cG9vbCwgdHhkLT5sbGlzX3ZhLCB0eGQtPmxsaXNfYnVzKTsKIAogCXBsMDh4LT5wb29sX2N0ci0tOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRzZywgX2RzZywgJnR4ZC0+ZHNnX2xpc3QsIG5vZGUpIHsKKwkJbGlzdF9kZWwoJmRzZy0+bm9kZSk7CisJCWtmcmVlKGRzZyk7CisJfQorCiAJa2ZyZWUodHhkKTsKIH0KIApAQCAtOTE3LDkgKzg2OSw3IEBACiAJICogbmVlZCwgYnV0IGZvciBzbGF2ZXMgdGhlIHBoeXNpY2FsIHNpZ25hbHMgbWF5IGJlIG11eGVkIQogCSAqIENhbiB0aGUgcGxhdGZvcm0gYWxsb3cgdXMgdG8gdXNlIHRoaXMgY2hhbm5lbD8KIAkgKi8KLQlpZiAocGxjaGFuLT5zbGF2ZSAmJgotCSAgICBjaC0+c2lnbmFsIDwgMCAmJgotCSAgICBwbDA4eC0+cGQtPmdldF9zaWduYWwpIHsKKwlpZiAocGxjaGFuLT5zbGF2ZSAmJiBwbDA4eC0+cGQtPmdldF9zaWduYWwpIHsKIAkJcmV0ID0gcGwwOHgtPnBkLT5nZXRfc2lnbmFsKHBsY2hhbik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZGJnKCZwbDA4eC0+YWRldi0+ZGV2LApAQCAtMTAwOCwxMCArOTU4LDggQEAKICAqIElmIHNsYXZlcyBhcmUgcmVseWluZyBvbiBpbnRlcnJ1cHRzIHRvIHNpZ25hbCBjb21wbGV0aW9uIHRoaXMgZnVuY3Rpb24KICAqIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCiAgKi8KLXN0YXRpYyBlbnVtIGRtYV9zdGF0dXMKLXBsMDh4X2RtYV90eF9zdGF0dXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkgICAgZG1hX2Nvb2tpZV90IGNvb2tpZSwKLQkJICAgIHN0cnVjdCBkbWFfdHhfc3RhdGUgKnR4c3RhdGUpCitzdGF0aWMgZW51bSBkbWFfc3RhdHVzIHBsMDh4X2RtYV90eF9zdGF0dXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQlkbWFfY29va2llX3QgY29va2llLCBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQogewogCXN0cnVjdCBwbDA4eF9kbWFfY2hhbiAqcGxjaGFuID0gdG9fcGwwOHhfY2hhbihjaGFuKTsKIAlkbWFfY29va2llX3QgbGFzdF91c2VkOwpAQCAtMTI1Myw3ICsxMjAxLDkgQEAKIAogCW51bV9sbGlzID0gcGwwOHhfZmlsbF9sbGlzX2Zvcl9kZXNjKHBsMDh4LCB0eGQpOwogCWlmICghbnVtX2xsaXMpIHsKLQkJa2ZyZWUodHhkKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBsY2hhbi0+bG9jaywgZmxhZ3MpOworCQlwbDA4eF9mcmVlX3R4ZChwbDA4eCwgdHhkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGxjaGFuLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTMwMSwxMyArMTI1MSwxNCBAQAogc3RhdGljIHN0cnVjdCBwbDA4eF90eGQgKnBsMDh4X2dldF90eGQoc3RydWN0IHBsMDh4X2RtYV9jaGFuICpwbGNoYW4sCiAJdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlzdHJ1Y3QgcGwwOHhfdHhkICp0eGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGwwOHhfdHhkKSwgR0ZQX05PV0FJVCk7CisJc3RydWN0IHBsMDh4X3R4ZCAqdHhkID0ga3phbGxvYyhzaXplb2YoKnR4ZCksIEdGUF9OT1dBSVQpOwogCiAJaWYgKHR4ZCkgewogCQlkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KCZ0eGQtPnR4LCAmcGxjaGFuLT5jaGFuKTsKIAkJdHhkLT50eC5mbGFncyA9IGZsYWdzOwogCQl0eGQtPnR4LnR4X3N1Ym1pdCA9IHBsMDh4X3R4X3N1Ym1pdDsKIAkJSU5JVF9MSVNUX0hFQUQoJnR4ZC0+bm9kZSk7CisJCUlOSVRfTElTVF9IRUFEKCZ0eGQtPmRzZ19saXN0KTsKIAogCQkvKiBBbHdheXMgZW5hYmxlIGVycm9yIGFuZCB0ZXJtaW5hbCBpbnRlcnJ1cHRzICovCiAJCXR4ZC0+Y2NmZyA9IFBMMDgwX0NPTkZJR19FUlJfSVJRX01BU0sgfApAQCAtMTMyNiw2ICsxMjc3LDcgQEAKIAlzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKnBsY2hhbiA9IHRvX3BsMDh4X2NoYW4oY2hhbik7CiAJc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCA9IHBsY2hhbi0+aG9zdDsKIAlzdHJ1Y3QgcGwwOHhfdHhkICp0eGQ7CisJc3RydWN0IHBsMDh4X3NnICpkc2c7CiAJaW50IHJldDsKIAogCXR4ZCA9IHBsMDh4X2dldF90eGQocGxjaGFuLCBmbGFncyk7CkBAIC0xMzM1LDEwICsxMjg3LDE5IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCWRzZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbDA4eF9zZyksIEdGUF9OT1dBSVQpOworCWlmICghZHNnKSB7CisJCXBsMDh4X2ZyZWVfdHhkKHBsMDh4LCB0eGQpOworCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LCAiJXMgbm8gbWVtb3J5IGZvciBwbDA4MCBzZ1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlsaXN0X2FkZF90YWlsKCZkc2ctPm5vZGUsICZ0eGQtPmRzZ19saXN0KTsKKwogCXR4ZC0+ZGlyZWN0aW9uID0gRE1BX05PTkU7Ci0JdHhkLT5zcmNfYWRkciA9IHNyYzsKLQl0eGQtPmRzdF9hZGRyID0gZGVzdDsKLQl0eGQtPmxlbiA9IGxlbjsKKwlkc2ctPnNyY19hZGRyID0gc3JjOworCWRzZy0+ZHN0X2FkZHIgPSBkZXN0OworCWRzZy0+bGVuID0gbGVuOwogCiAJLyogU2V0IHBsYXRmb3JtIGRhdGEgZm9yIG0ybSAqLwogCXR4ZC0+Y2NmZyB8PSBQTDA4MF9GTE9XX01FTTJNRU0gPDwgUEwwODBfQ09ORklHX0ZMT1dfQ09OVFJPTF9TSElGVDsKQEAgLTEzNjcsMTkgKzEzMjgsMTMgQEAKIAlzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKnBsY2hhbiA9IHRvX3BsMDh4X2NoYW4oY2hhbik7CiAJc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCA9IHBsY2hhbi0+aG9zdDsKIAlzdHJ1Y3QgcGwwOHhfdHhkICp0eGQ7Ci0JaW50IHJldDsKLQotCS8qCi0JICogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBBU1NVTUVTIG9ubHkgb25lIHNnCi0JICovCi0JaWYgKHNnX2xlbiAhPSAxKSB7Ci0JCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsICIlcyBwcmVwYXJlZCB0b28gbG9uZyBzZ2xpc3RcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCUJVRygpOwotCX0KKwlzdHJ1Y3QgcGwwOHhfc2cgKmRzZzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWRtYV9hZGRyX3Qgc2xhdmVfYWRkcjsKKwlpbnQgcmV0LCB0bXA7CiAKIAlkZXZfZGJnKCZwbDA4eC0+YWRldi0+ZGV2LCAiJXMgcHJlcGFyZSB0cmFuc2FjdGlvbiBvZiAlZCBieXRlcyBmcm9tICVzXG4iLAotCQlfX2Z1bmNfXywgc2dsLT5sZW5ndGgsIHBsY2hhbi0+bmFtZSk7CisJCQlfX2Z1bmNfXywgc2dsLT5sZW5ndGgsIHBsY2hhbi0+bmFtZSk7CiAKIAl0eGQgPSBwbDA4eF9nZXRfdHhkKHBsY2hhbiwgZmxhZ3MpOwogCWlmICghdHhkKSB7CkBAIC0xMzk4LDI0ICsxMzUzLDQ5IEBACiAJICogY2hhbm5lbCB0YXJnZXQgYWRkcmVzcyBkeW5hbWljYWxseSBhdCBydW50aW1lLgogCSAqLwogCXR4ZC0+ZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCXR4ZC0+bGVuID0gc2dsLT5sZW5ndGg7CiAKIAlpZiAoZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKLQkJdHhkLT5jY2ZnIHw9IFBMMDgwX0ZMT1dfTUVNMlBFUiA8PCBQTDA4MF9DT05GSUdfRkxPV19DT05UUk9MX1NISUZUOwogCQl0eGQtPmNjdGwgPSBwbGNoYW4tPmRzdF9jY3RsOwotCQl0eGQtPnNyY19hZGRyID0gc2dsLT5kbWFfYWRkcmVzczsKLQkJdHhkLT5kc3RfYWRkciA9IHBsY2hhbi0+ZHN0X2FkZHI7CisJCXNsYXZlX2FkZHIgPSBwbGNoYW4tPmRzdF9hZGRyOwogCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgewotCQl0eGQtPmNjZmcgfD0gUEwwODBfRkxPV19QRVIyTUVNIDw8IFBMMDgwX0NPTkZJR19GTE9XX0NPTlRST0xfU0hJRlQ7CiAJCXR4ZC0+Y2N0bCA9IHBsY2hhbi0+c3JjX2NjdGw7Ci0JCXR4ZC0+c3JjX2FkZHIgPSBwbGNoYW4tPnNyY19hZGRyOwotCQl0eGQtPmRzdF9hZGRyID0gc2dsLT5kbWFfYWRkcmVzczsKKwkJc2xhdmVfYWRkciA9IHBsY2hhbi0+c3JjX2FkZHI7CiAJfSBlbHNlIHsKKwkJcGwwOHhfZnJlZV90eGQocGwwOHgsIHR4ZCk7CiAJCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsCiAJCQkiJXMgZGlyZWN0aW9uIHVuc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAorCWlmIChwbGNoYW4tPmNkLT5kZXZpY2VfZmMpCisJCXRtcCA9IChkaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgPyBQTDA4MF9GTE9XX01FTTJQRVJfUEVSIDoKKwkJCVBMMDgwX0ZMT1dfUEVSMk1FTV9QRVI7CisJZWxzZQorCQl0bXAgPSAoZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpID8gUEwwODBfRkxPV19NRU0yUEVSIDoKKwkJCVBMMDgwX0ZMT1dfUEVSMk1FTTsKKworCXR4ZC0+Y2NmZyB8PSB0bXAgPDwgUEwwODBfQ09ORklHX0ZMT1dfQ09OVFJPTF9TSElGVDsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2csIHNnX2xlbiwgdG1wKSB7CisJCWRzZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbDA4eF9zZyksIEdGUF9OT1dBSVQpOworCQlpZiAoIWRzZykgeworCQkJcGwwOHhfZnJlZV90eGQocGwwOHgsIHR4ZCk7CisJCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LCAiJXMgbm8gbWVtIGZvciBwbDA4MCBzZ1xuIiwKKwkJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmZHNnLT5ub2RlLCAmdHhkLT5kc2dfbGlzdCk7CisKKwkJZHNnLT5sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKwkJaWYgKGRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCQlkc2ctPnNyY19hZGRyID0gc2dfcGh5cyhzZyk7CisJCQlkc2ctPmRzdF9hZGRyID0gc2xhdmVfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCWRzZy0+c3JjX2FkZHIgPSBzbGF2ZV9hZGRyOworCQkJZHNnLT5kc3RfYWRkciA9IHNnX3BoeXMoc2cpOworCQl9CisJfQorCiAJcmV0ID0gcGwwOHhfcHJlcF9jaGFubmVsX3Jlc291cmNlcyhwbGNoYW4sIHR4ZCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNDg5LDkgKzE0NjksMTUgQEAKIAogYm9vbCBwbDA4eF9maWx0ZXJfaWQoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpjaGFuX2lkKQogewotCXN0cnVjdCBwbDA4eF9kbWFfY2hhbiAqcGxjaGFuID0gdG9fcGwwOHhfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKnBsY2hhbjsKIAljaGFyICpuYW1lID0gY2hhbl9pZDsKIAorCS8qIFJlamVjdCBjaGFubmVscyBmb3IgZGV2aWNlcyBub3QgYm91bmQgdG8gdGhpcyBkcml2ZXIgKi8KKwlpZiAoY2hhbi0+ZGV2aWNlLT5kZXYtPmRyaXZlciAhPSAmcGwwOHhfYW1iYV9kcml2ZXIuZHJ2KQorCQlyZXR1cm4gZmFsc2U7CisKKwlwbGNoYW4gPSB0b19wbDA4eF9jaGFuKGNoYW4pOworCiAJLyogQ2hlY2sgdGhhdCB0aGUgY2hhbm5lbCBpcyBub3QgdGFrZW4hICovCiAJaWYgKCFzdHJjbXAocGxjaGFuLT5uYW1lLCBuYW1lKSkKIAkJcmV0dXJuIHRydWU7CkBAIC0xNTA3LDM0ICsxNDkzLDM0IEBACiAgKi8KIHN0YXRpYyB2b2lkIHBsMDh4X2Vuc3VyZV9vbihzdHJ1Y3QgcGwwOHhfZHJpdmVyX2RhdGEgKnBsMDh4KQogewotCXUzMiB2YWw7Ci0KLQl2YWwgPSByZWFkbChwbDA4eC0+YmFzZSArIFBMMDgwX0NPTkZJRyk7Ci0JdmFsICY9IH4oUEwwODBfQ09ORklHX00yX0JFIHwgUEwwODBfQ09ORklHX00xX0JFIHwgUEwwODBfQ09ORklHX0VOQUJMRSk7Ci0JLyogV2UgaW1wbGljaXRseSBjbGVhciBiaXQgMSBhbmQgdGhhdCBtZWFucyBsaXR0bGUtZW5kaWFuIG1vZGUgKi8KLQl2YWwgfD0gUEwwODBfQ09ORklHX0VOQUJMRTsKLQl3cml0ZWwodmFsLCBwbDA4eC0+YmFzZSArIFBMMDgwX0NPTkZJRyk7CisJd3JpdGVsKFBMMDgwX0NPTkZJR19FTkFCTEUsIHBsMDh4LT5iYXNlICsgUEwwODBfQ09ORklHKTsKIH0KIAogc3RhdGljIHZvaWQgcGwwOHhfdW5tYXBfYnVmZmVycyhzdHJ1Y3QgcGwwOHhfdHhkICp0eGQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdHhkLT50eC5jaGFuLT5kZXZpY2UtPmRldjsKKwlzdHJ1Y3QgcGwwOHhfc2cgKmRzZzsKIAogCWlmICghKHR4ZC0+dHguZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9TUkNfVU5NQVApKSB7CiAJCWlmICh0eGQtPnR4LmZsYWdzICYgRE1BX0NPTVBMX1NSQ19VTk1BUF9TSU5HTEUpCi0JCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgdHhkLT5zcmNfYWRkciwgdHhkLT5sZW4sCi0JCQkJRE1BX1RPX0RFVklDRSk7Ci0JCWVsc2UKLQkJCWRtYV91bm1hcF9wYWdlKGRldiwgdHhkLT5zcmNfYWRkciwgdHhkLT5sZW4sCi0JCQkJRE1BX1RPX0RFVklDRSk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRzZywgJnR4ZC0+ZHNnX2xpc3QsIG5vZGUpCisJCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGRzZy0+c3JjX2FkZHIsIGRzZy0+bGVuLAorCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJCWVsc2UgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkc2csICZ0eGQtPmRzZ19saXN0LCBub2RlKQorCQkJCWRtYV91bm1hcF9wYWdlKGRldiwgZHNnLT5zcmNfYWRkciwgZHNnLT5sZW4sCisJCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJfQogCX0KIAlpZiAoISh0eGQtPnR4LmZsYWdzICYgRE1BX0NPTVBMX1NLSVBfREVTVF9VTk1BUCkpIHsKIAkJaWYgKHR4ZC0+dHguZmxhZ3MgJiBETUFfQ09NUExfREVTVF9VTk1BUF9TSU5HTEUpCi0JCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgdHhkLT5kc3RfYWRkciwgdHhkLT5sZW4sCi0JCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZHNnLCAmdHhkLT5kc2dfbGlzdCwgbm9kZSkKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgZHNnLT5kc3RfYWRkciwgZHNnLT5sZW4sCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOwogCQllbHNlCi0JCQlkbWFfdW5tYXBfcGFnZShkZXYsIHR4ZC0+ZHN0X2FkZHIsIHR4ZC0+bGVuLAotCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRzZywgJnR4ZC0+ZHNnX2xpc3QsIG5vZGUpCisJCQkJZG1hX3VubWFwX3BhZ2UoZGV2LCBkc2ctPmRzdF9hZGRyLCBkc2ctPmxlbiwKKwkJCQkJCURNQV9GUk9NX0RFVklDRSk7CiAJfQogfQogCkBAIC0xNTg5LDggKzE1NzUsOCBAQAogCQkgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YWl0aW5nLCAmcGwwOHgtPm1lbWNweS5jaGFubmVscywKIAkJCQkgICAgY2hhbi5kZXZpY2Vfbm9kZSkgewotCQkgIGlmICh3YWl0aW5nLT5zdGF0ZSA9PSBQTDA4WF9DSEFOX1dBSVRJTkcgJiYKLQkJCSAgICB3YWl0aW5nLT53YWl0aW5nICE9IE5VTEwpIHsKKwkJCWlmICh3YWl0aW5nLT5zdGF0ZSA9PSBQTDA4WF9DSEFOX1dBSVRJTkcgJiYKKwkJCQl3YWl0aW5nLT53YWl0aW5nICE9IE5VTEwpIHsKIAkJCQlpbnQgcmV0OwogCiAJCQkJLyogVGhpcyBzaG91bGQgUkVBTExZIG5vdCBmYWlsIG5vdyAqLwpAQCAtMTYzMCwzOCArMTYxNiw0MCBAQAogc3RhdGljIGlycXJldHVybl90IHBsMDh4X2lycShpbnQgaXJxLCB2b2lkICpkZXYpCiB7CiAJc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCA9IGRldjsKLQl1MzIgbWFzayA9IDA7Ci0JdTMyIHZhbDsKLQlpbnQgaTsKKwl1MzIgbWFzayA9IDAsIGVyciwgdGMsIGk7CiAKLQl2YWwgPSByZWFkbChwbDA4eC0+YmFzZSArIFBMMDgwX0VSUl9TVEFUVVMpOwotCWlmICh2YWwpIHsKLQkJLyogQW4gZXJyb3IgaW50ZXJydXB0IChvbiBvbmUgb3IgbW9yZSBjaGFubmVscykgKi8KLQkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwKLQkJCSIlcyBlcnJvciBpbnRlcnJ1cHQsIHJlZ2lzdGVyIHZhbHVlIDB4JTA4eFxuIiwKLQkJCQlfX2Z1bmNfXywgdmFsKTsKLQkJLyoKLQkJICogU2ltcGx5IGNsZWFyIEFMTCBQTDA4WCBlcnJvciBpbnRlcnJ1cHRzLAotCQkgKiByZWdhcmRsZXNzIG9mIGNoYW5uZWwgYW5kIGNhdXNlCi0JCSAqIEZJWE1FOiBzaG91bGQgYmUgMHgwMDAwMDAwMyBvbiBQTDA4MSByZWFsbHkuCi0JCSAqLwotCQl3cml0ZWwoMHgwMDAwMDBGRiwgcGwwOHgtPmJhc2UgKyBQTDA4MF9FUlJfQ0xFQVIpOworCS8qIGNoZWNrICYgY2xlYXIgLSBFUlIgJiBUQyBpbnRlcnJ1cHRzICovCisJZXJyID0gcmVhZGwocGwwOHgtPmJhc2UgKyBQTDA4MF9FUlJfU1RBVFVTKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsICIlcyBlcnJvciBpbnRlcnJ1cHQsIHJlZ2lzdGVyIHZhbHVlIDB4JTA4eFxuIiwKKwkJCV9fZnVuY19fLCBlcnIpOworCQl3cml0ZWwoZXJyLCBwbDA4eC0+YmFzZSArIFBMMDgwX0VSUl9DTEVBUik7CiAJfQotCXZhbCA9IHJlYWRsKHBsMDh4LT5iYXNlICsgUEwwODBfSU5UX1NUQVRVUyk7CisJdGMgPSByZWFkbChwbDA4eC0+YmFzZSArIFBMMDgwX0lOVF9TVEFUVVMpOworCWlmICh0YykKKwkJd3JpdGVsKHRjLCBwbDA4eC0+YmFzZSArIFBMMDgwX1RDX0NMRUFSKTsKKworCWlmICghZXJyICYmICF0YykKKwkJcmV0dXJuIElSUV9OT05FOworCiAJZm9yIChpID0gMDsgaSA8IHBsMDh4LT52ZC0+Y2hhbm5lbHM7IGkrKykgewotCQlpZiAoKDEgPDwgaSkgJiB2YWwpIHsKKwkJaWYgKCgoMSA8PCBpKSAmIGVycikgfHwgKCgxIDw8IGkpICYgdGMpKSB7CiAJCQkvKiBMb2NhdGUgcGh5c2ljYWwgY2hhbm5lbCAqLwogCQkJc3RydWN0IHBsMDh4X3BoeV9jaGFuICpwaHljaGFuID0gJnBsMDh4LT5waHlfY2hhbnNbaV07CiAJCQlzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKnBsY2hhbiA9IHBoeWNoYW4tPnNlcnZpbmc7CiAKKwkJCWlmICghcGxjaGFuKSB7CisJCQkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwKKwkJCQkJIiVzIEVycm9yIFRDIGludGVycnVwdCBvbiB1bnVzZWQgY2hhbm5lbDogMHglMDh4XG4iLAorCQkJCQlfX2Z1bmNfXywgaSk7CisJCQkJY29udGludWU7CisJCQl9CisKIAkJCS8qIFNjaGVkdWxlIHRhc2tsZXQgb24gdGhpcyBjaGFubmVsICovCiAJCQl0YXNrbGV0X3NjaGVkdWxlKCZwbGNoYW4tPnRhc2tsZXQpOwotCiAJCQltYXNrIHw9ICgxIDw8IGkpOwogCQl9CiAJfQotCS8qIENsZWFyIG9ubHkgdGhlIHRlcm1pbmFsIGludGVycnVwdHMgb24gY2hhbm5lbHMgd2UgcHJvY2Vzc2VkICovCi0Jd3JpdGVsKG1hc2ssIHBsMDh4LT5iYXNlICsgUEwwODBfVENfQ0xFQVIpOwogCiAJcmV0dXJuIG1hc2sgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwogfQpAQCAtMTY4NSw5ICsxNjczLDcgQEAKICAqIE1ha2UgYSBsb2NhbCB3cmFwcGVyIHRvIGhvbGQgcmVxdWlyZWQgZGF0YQogICovCiBzdGF0aWMgaW50IHBsMDh4X2RtYV9pbml0X3ZpcnR1YWxfY2hhbm5lbHMoc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCwKLQkJCQkJICAgc3RydWN0IGRtYV9kZXZpY2UgKmRtYWRldiwKLQkJCQkJICAgdW5zaWduZWQgaW50IGNoYW5uZWxzLAotCQkJCQkgICBib29sIHNsYXZlKQorCQlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsIGJvb2wgc2xhdmUpCiB7CiAJc3RydWN0IHBsMDh4X2RtYV9jaGFuICpjaGFuOwogCWludCBpOwpAQCAtMTcwMCw3ICsxNjg2LDcgQEAKIAkgKiB0byBjb3BlIHdpdGggdGhhdCBzaXR1YXRpb24uCiAJICovCiAJZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKLQkJY2hhbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbDA4eF9kbWFfY2hhbiksIEdGUF9LRVJORUwpOworCQljaGFuID0ga3phbGxvYyhzaXplb2YoKmNoYW4pLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFjaGFuKSB7CiAJCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LAogCQkJCSIlcyBubyBtZW1vcnkgZm9yIGNoYW5uZWxcbiIsIF9fZnVuY19fKTsKQEAgLTE3MjgsNyArMTcxNCw3IEBACiAJCQlrZnJlZShjaGFuKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWRldl9pbmZvKCZwbDA4eC0+YWRldi0+ZGV2LAorCQlkZXZfZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAogCQkJICJpbml0aWFsaXplIHZpcnR1YWwgY2hhbm5lbCBcIiVzXCJcbiIsCiAJCQkgY2hhbi0+bmFtZSk7CiAKQEAgLTE4MzcsOSArMTgyMyw5IEBACiBzdGF0aWMgdm9pZCBpbml0X3BsMDh4X2RlYnVnZnMoc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCkKIHsKIAkvKiBFeHBvc2UgYSBzaW1wbGUgZGVidWdmcyBpbnRlcmZhY2UgdG8gdmlldyBhbGwgY2xvY2tzICovCi0JKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoZGV2X25hbWUoJnBsMDh4LT5hZGV2LT5kZXYpLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBOVUxMLCBwbDA4eCwKLQkJCQkgICAmcGwwOHhfZGVidWdmc19vcGVyYXRpb25zKTsKKwkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZShkZXZfbmFtZSgmcGwwOHgtPmFkZXYtPmRldiksCisJCQlTX0lGUkVHIHwgU19JUlVHTywgTlVMTCwgcGwwOHgsCisJCQkmcGwwOHhfZGVidWdmc19vcGVyYXRpb25zKTsKIH0KIAogI2Vsc2UKQEAgLTE4NjAsMTIgKzE4NDYsMTUgQEAKIAkJcmV0dXJuIHJldDsKIAogCS8qIENyZWF0ZSB0aGUgZHJpdmVyIHN0YXRlIGhvbGRlciAqLwotCXBsMDh4ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJcGwwOHggPSBremFsbG9jKHNpemVvZigqcGwwOHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBsMDh4KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X25vX3BsMDh4OwogCX0KIAorCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmYWRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmYWRldi0+ZGV2KTsKKwogCS8qIEluaXRpYWxpemUgbWVtY3B5IGVuZ2luZSAqLwogCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIHBsMDh4LT5tZW1jcHkuY2FwX21hc2spOwogCXBsMDh4LT5tZW1jcHkuZGV2ID0gJmFkZXYtPmRldjsKQEAgLTE5MzksNyArMTkyOCw3IEBACiAJfQogCiAJLyogSW5pdGlhbGl6ZSBwaHlzaWNhbCBjaGFubmVscyAqLwotCXBsMDh4LT5waHlfY2hhbnMgPSBrbWFsbG9jKCh2ZC0+Y2hhbm5lbHMgKiBzaXplb2Yoc3RydWN0IHBsMDh4X3BoeV9jaGFuKSksCisJcGwwOHgtPnBoeV9jaGFucyA9IGttYWxsb2MoKHZkLT5jaGFubmVscyAqIHNpemVvZigqcGwwOHgtPnBoeV9jaGFucykpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbDA4eC0+cGh5X2NoYW5zKSB7CiAJCWRldl9lcnIoJmFkZXYtPmRldiwgIiVzIGZhaWxlZCB0byBhbGxvY2F0ZSAiCkBAIC0xOTU2LDkgKzE5NDUsOCBAQAogCQlzcGluX2xvY2tfaW5pdCgmY2gtPmxvY2spOwogCQljaC0+c2VydmluZyA9IE5VTEw7CiAJCWNoLT5zaWduYWwgPSAtMTsKLQkJZGV2X2luZm8oJmFkZXYtPmRldiwKLQkJCSAicGh5c2ljYWwgY2hhbm5lbCAlZCBpcyAlc1xuIiwgaSwKLQkJCSBwbDA4eF9waHlfY2hhbm5lbF9idXN5KGNoKSA/ICJCVVNZIiA6ICJGUkVFIik7CisJCWRldl9kYmcoJmFkZXYtPmRldiwgInBoeXNpY2FsIGNoYW5uZWwgJWQgaXMgJXNcbiIsCisJCQlpLCBwbDA4eF9waHlfY2hhbm5lbF9idXN5KGNoKSA/ICJCVVNZIiA6ICJGUkVFIik7CiAJfQogCiAJLyogUmVnaXN0ZXIgYXMgbWFueSBtZW1jcHkgY2hhbm5lbHMgYXMgdGhlcmUgYXJlIHBoeXNpY2FsIGNoYW5uZWxzICovCkBAIC0xOTc0LDggKzE5NjIsNyBAQAogCiAJLyogUmVnaXN0ZXIgc2xhdmUgY2hhbm5lbHMgKi8KIAlyZXQgPSBwbDA4eF9kbWFfaW5pdF92aXJ0dWFsX2NoYW5uZWxzKHBsMDh4LCAmcGwwOHgtPnNsYXZlLAotCQkJCQkgICAgICBwbDA4eC0+cGQtPm51bV9zbGF2ZV9jaGFubmVscywKLQkJCQkJICAgICAgdHJ1ZSk7CisJCQlwbDA4eC0+cGQtPm51bV9zbGF2ZV9jaGFubmVscywgdHJ1ZSk7CiAJaWYgKHJldCA8PSAwKSB7CiAJCWRldl93YXJuKCZwbDA4eC0+YWRldi0+ZGV2LAogCQkJIiVzIGZhaWxlZCB0byBlbnVtZXJhdGUgc2xhdmUgY2hhbm5lbHMgLSAlZFxuIiwKQEAgLTIwMDUsNiArMTk5Miw4IEBACiAJZGV2X2luZm8oJnBsMDh4LT5hZGV2LT5kZXYsICJETUE6IFBMJTAzeCByZXYldSBhdCAweCUwOGxseCBpcnEgJWRcbiIsCiAJCSBhbWJhX3BhcnQoYWRldiksIGFtYmFfcmV2KGFkZXYpLAogCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGV2LT5yZXMuc3RhcnQsIGFkZXYtPmlycVswXSk7CisKKwlwbV9ydW50aW1lX3B1dCgmYWRldi0+ZGV2KTsKIAlyZXR1cm4gMDsKIAogb3V0X25vX3NsYXZlX3JlZzoKQEAgLTIwMjMsNiArMjAxMiw5IEBACiAJZG1hX3Bvb2xfZGVzdHJveShwbDA4eC0+cG9vbCk7CiBvdXRfbm9fbGxpX3Bvb2w6CiBvdXRfbm9fcGxhdGRhdGE6CisJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKCZhZGV2LT5kZXYpOworCiAJa2ZyZWUocGwwOHgpOwogb3V0X25vX3BsMDh4OgogCWFtYmFfcmVsZWFzZV9yZWdpb25zKGFkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvYXRfaGRtYWMuYyBiL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKaW5kZXggNmE0ODNlYS4uZmNmYTBhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvYXRfaGRtYWMuYworKysgYi9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCkBAIC0xMDcsMTAgKzEwNywxMSBAQAogewogCXN0cnVjdCBhdF9kZXNjICpkZXNjLCAqX2Rlc2M7CiAJc3RydWN0IGF0X2Rlc2MgKnJldCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgaSA9IDA7CiAJTElTVF9IRUFEKHRtcF9saXN0KTsKIAotCXNwaW5fbG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kZXNjLCAmYXRjaGFuLT5mcmVlX2xpc3QsIGRlc2Nfbm9kZSkgewogCQlpKys7CiAJCWlmIChhc3luY190eF90ZXN0X2FjaygmZGVzYy0+dHhkKSkgewpAQCAtMTIxLDcgKzEyMiw3IEBACiAJCWRldl9kYmcoY2hhbjJkZXYoJmF0Y2hhbi0+Y2hhbl9jb21tb24pLAogCQkJCSJkZXNjICVwIG5vdCBBQ0tlZFxuIiwgZGVzYyk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCWRldl92ZGJnKGNoYW4yZGV2KCZhdGNoYW4tPmNoYW5fY29tbW9uKSwKIAkJInNjYW5uZWQgJXUgZGVzY3JpcHRvcnMgb24gZnJlZWxpc3RcbiIsIGkpOwogCkBAIC0xMjksOSArMTMwLDkgQEAKIAlpZiAoIXJldCkgewogCQlyZXQgPSBhdGNfYWxsb2NfZGVzY3JpcHRvcigmYXRjaGFuLT5jaGFuX2NvbW1vbiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXQpIHsKLQkJCXNwaW5fbG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAkJCWF0Y2hhbi0+ZGVzY3NfYWxsb2NhdGVkKys7Ci0JCQlzcGluX3VubG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCQl9IGVsc2UgewogCQkJZGV2X2VycihjaGFuMmRldigmYXRjaGFuLT5jaGFuX2NvbW1vbiksCiAJCQkJCSJub3QgZW5vdWdoIGRlc2NyaXB0b3JzIGF2YWlsYWJsZVxuIik7CkBAIC0xNTAsOCArMTUxLDkgQEAKIHsKIAlpZiAoZGVzYykgewogCQlzdHJ1Y3QgYXRfZGVzYyAqY2hpbGQ7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJc3Bpbl9sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eF9saXN0LCBkZXNjX25vZGUpCiAJCQlkZXZfdmRiZyhjaGFuMmRldigmYXRjaGFuLT5jaGFuX2NvbW1vbiksCiAJCQkJCSJtb3ZpbmcgY2hpbGQgZGVzYyAlcCB0byBmcmVlbGlzdFxuIiwKQEAgLTE2MCw3ICsxNjIsNyBAQAogCQlkZXZfdmRiZyhjaGFuMmRldigmYXRjaGFuLT5jaGFuX2NvbW1vbiksCiAJCQkgIm1vdmluZyBkZXNjICVwIHRvIGZyZWVsaXN0XG4iLCBkZXNjKTsKIAkJbGlzdF9hZGQoJmRlc2MtPmRlc2Nfbm9kZSwgJmF0Y2hhbi0+ZnJlZV9saXN0KTsKLQkJc3Bpbl91bmxvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCX0KIH0KIApAQCAtMjk5LDcgKzMwMSw3IEBACiAKIAkvKiBmb3IgY3ljbGljIHRyYW5zZmVycywKIAkgKiBubyBuZWVkIHRvIHJlcGxheSBjYWxsYmFjayBmdW5jdGlvbiB3aGlsZSBzdG9wcGluZyAqLwotCWlmICghdGVzdF9iaXQoQVRDX0lTX0NZQ0xJQywgJmF0Y2hhbi0+c3RhdHVzKSkgeworCWlmICghYXRjX2NoYW5faXNfY3ljbGljKGF0Y2hhbikpIHsKIAkJZG1hX2FzeW5jX3R4X2NhbGxiYWNrCWNhbGxiYWNrID0gdHhkLT5jYWxsYmFjazsKIAkJdm9pZAkJCSpwYXJhbSA9IHR4ZC0+Y2FsbGJhY2tfcGFyYW07CiAKQEAgLTQ3MSwxNiArNDczLDE3IEBACiBzdGF0aWMgdm9pZCBhdGNfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGF0X2RtYV9jaGFuICphdGNoYW4gPSAoc3RydWN0IGF0X2RtYV9jaGFuICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrKCZhdGNoYW4tPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFUQ19JU19FUlJPUiwgJmF0Y2hhbi0+c3RhdHVzKSkKIAkJYXRjX2hhbmRsZV9lcnJvcihhdGNoYW4pOwotCWVsc2UgaWYgKHRlc3RfYml0KEFUQ19JU19DWUNMSUMsICZhdGNoYW4tPnN0YXR1cykpCisJZWxzZSBpZiAoYXRjX2NoYW5faXNfY3ljbGljKGF0Y2hhbikpCiAJCWF0Y19oYW5kbGVfY3ljbGljKGF0Y2hhbik7CiAJZWxzZQogCQlhdGNfYWR2YW5jZV93b3JrKGF0Y2hhbik7CiAKLQlzcGluX3VubG9jaygmYXRjaGFuLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGF0X2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpAQCAtNTM5LDggKzU0Miw5IEBACiAJc3RydWN0IGF0X2Rlc2MJCSpkZXNjID0gdHhkX3RvX2F0X2Rlc2ModHgpOwogCXN0cnVjdCBhdF9kbWFfY2hhbgkqYXRjaGFuID0gdG9fYXRfZG1hX2NoYW4odHgtPmNoYW4pOwogCWRtYV9jb29raWVfdAkJY29va2llOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAljb29raWUgPSBhdGNfYXNzaWduX2Nvb2tpZShhdGNoYW4sIGRlc2MpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmF0Y2hhbi0+YWN0aXZlX2xpc3QpKSB7CkBAIC01NTQsNyArNTU4LDcgQEAKIAkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+ZGVzY19ub2RlLCAmYXRjaGFuLT5xdWV1ZSk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gY29va2llOwogfQpAQCAtOTI3LDI4ICs5MzEsMjkgQEAKIAlzdHJ1Y3QgYXRfZG1hX2NoYW4JKmF0Y2hhbiA9IHRvX2F0X2RtYV9jaGFuKGNoYW4pOwogCXN0cnVjdCBhdF9kbWEJCSphdGRtYSA9IHRvX2F0X2RtYShjaGFuLT5kZXZpY2UpOwogCWludAkJCWNoYW5faWQgPSBhdGNoYW4tPmNoYW5fY29tbW9uLmNoYW5faWQ7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAlMSVNUX0hFQUQobGlzdCk7CiAKIAlkZXZfdmRiZyhjaGFuMmRldihjaGFuKSwgImF0Y19jb250cm9sICglZClcbiIsIGNtZCk7CiAKIAlpZiAoY21kID09IERNQV9QQVVTRSkgewotCQlzcGluX2xvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAogCQlkbWFfd3JpdGVsKGF0ZG1hLCBDSEVSLCBBVF9ETUFfU1VTUChjaGFuX2lkKSk7CiAJCXNldF9iaXQoQVRDX0lTX1BBVVNFRCwgJmF0Y2hhbi0+c3RhdHVzKTsKIAotCQlzcGluX3VubG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAJfSBlbHNlIGlmIChjbWQgPT0gRE1BX1JFU1VNRSkgewotCQlpZiAoIXRlc3RfYml0KEFUQ19JU19QQVVTRUQsICZhdGNoYW4tPnN0YXR1cykpCisJCWlmICghYXRjX2NoYW5faXNfcGF1c2VkKGF0Y2hhbikpCiAJCQlyZXR1cm4gMDsKIAotCQlzcGluX2xvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAogCQlkbWFfd3JpdGVsKGF0ZG1hLCBDSERSLCBBVF9ETUFfUkVTKGNoYW5faWQpKTsKIAkJY2xlYXJfYml0KEFUQ19JU19QQVVTRUQsICZhdGNoYW4tPnN0YXR1cyk7CiAKLQkJc3Bpbl91bmxvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCX0gZWxzZSBpZiAoY21kID09IERNQV9URVJNSU5BVEVfQUxMKSB7CiAJCXN0cnVjdCBhdF9kZXNjCSpkZXNjLCAqX2Rlc2M7CiAJCS8qCkBAIC05NTcsNyArOTYyLDcgQEAKIAkJICogY2hhbm5lbC4gV2Ugc3RpbGwgaGF2ZSB0byBwb2xsIHRoZSBjaGFubmVsIGVuYWJsZSBiaXQgZHVlCiAJCSAqIHRvIEFIQi9IU0IgbGltaXRhdGlvbnMuCiAJCSAqLwotCQlzcGluX2xvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAogCQkvKiBkaXNhYmxpbmcgY2hhbm5lbDogbXVzdCBhbHNvIHJlbW92ZSBzdXNwZW5kIHN0YXRlICovCiAJCWRtYV93cml0ZWwoYXRkbWEsIENIRFIsIEFUX0RNQV9SRVMoY2hhbl9pZCkgfCBhdGNoYW4tPm1hc2spOwpAQCAtOTc4LDcgKzk4Myw3IEBACiAJCS8qIGlmIGNoYW5uZWwgZGVkaWNhdGVkIHRvIGN5Y2xpYyBvcGVyYXRpb25zLCBmcmVlIGl0ICovCiAJCWNsZWFyX2JpdChBVENfSVNfQ1lDTElDLCAmYXRjaGFuLT5zdGF0dXMpOwogCi0JCXNwaW5fdW5sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTEwMDQsOSArMTAwOSwxMCBAQAogCXN0cnVjdCBhdF9kbWFfY2hhbgkqYXRjaGFuID0gdG9fYXRfZG1hX2NoYW4oY2hhbik7CiAJZG1hX2Nvb2tpZV90CQlsYXN0X3VzZWQ7CiAJZG1hX2Nvb2tpZV90CQlsYXN0X2NvbXBsZXRlOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCWVudW0gZG1hX3N0YXR1cwkJcmV0OwogCi0Jc3Bpbl9sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAogCWxhc3RfY29tcGxldGUgPSBhdGNoYW4tPmNvbXBsZXRlZF9jb29raWU7CiAJbGFzdF91c2VkID0gY2hhbi0+Y29va2llOwpAQCAtMTAyMSw3ICsxMDI3LDcgQEAKIAkJcmV0ID0gZG1hX2FzeW5jX2lzX2NvbXBsZXRlKGNvb2tpZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkKTsKIAl9CiAKLQlzcGluX3VubG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAogCWlmIChyZXQgIT0gRE1BX1NVQ0NFU1MpCiAJCWRtYV9zZXRfdHhfc3RhdGUodHhzdGF0ZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkLApAQCAtMTAyOSw3ICsxMDM1LDcgQEAKIAllbHNlCiAJCWRtYV9zZXRfdHhfc3RhdGUodHhzdGF0ZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkLCAwKTsKIAotCWlmICh0ZXN0X2JpdChBVENfSVNfUEFVU0VELCAmYXRjaGFuLT5zdGF0dXMpKQorCWlmIChhdGNfY2hhbl9pc19wYXVzZWQoYXRjaGFuKSkKIAkJcmV0ID0gRE1BX1BBVVNFRDsKIAogCWRldl92ZGJnKGNoYW4yZGV2KGNoYW4pLCAidHhfc3RhdHVzICVkOiBjb29raWUgPSAlZCAoZCVkLCB1JWQpXG4iLApAQCAtMTA0NiwxOCArMTA1MiwxOSBAQAogc3RhdGljIHZvaWQgYXRjX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCXN0cnVjdCBhdF9kbWFfY2hhbgkqYXRjaGFuID0gdG9fYXRfZG1hX2NoYW4oY2hhbik7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAlkZXZfdmRiZyhjaGFuMmRldihjaGFuKSwgImlzc3VlX3BlbmRpbmdcbiIpOwogCiAJLyogTm90IG5lZWRlZCBmb3IgY3ljbGljIHRyYW5zZmVycyAqLwotCWlmICh0ZXN0X2JpdChBVENfSVNfQ1lDTElDLCAmYXRjaGFuLT5zdGF0dXMpKQorCWlmIChhdGNfY2hhbl9pc19jeWNsaWMoYXRjaGFuKSkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAlpZiAoIWF0Y19jaGFuX2lzX2VuYWJsZWQoYXRjaGFuKSkgewogCQlhdGNfYWR2YW5jZV93b3JrKGF0Y2hhbik7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogfQogCiAvKioKQEAgLTEwNzMsNiArMTA4MCw3IEBACiAJc3RydWN0IGF0X2RtYQkJKmF0ZG1hID0gdG9fYXRfZG1hKGNoYW4tPmRldmljZSk7CiAJc3RydWN0IGF0X2Rlc2MJCSpkZXNjOwogCXN0cnVjdCBhdF9kbWFfc2xhdmUJKmF0c2xhdmU7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJaW50CQkJaTsKIAl1MzIJCQljZmc7CiAJTElTVF9IRUFEKHRtcF9saXN0KTsKQEAgLTExMTYsMTEgKzExMjQsMTEgQEAKIAkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+ZGVzY19ub2RlLCAmdG1wX2xpc3QpOwogCX0KIAotCXNwaW5fbG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAJYXRjaGFuLT5kZXNjc19hbGxvY2F0ZWQgPSBpOwogCWxpc3Rfc3BsaWNlKCZ0bXBfbGlzdCwgJmF0Y2hhbi0+ZnJlZV9saXN0KTsKIAlhdGNoYW4tPmNvbXBsZXRlZF9jb29raWUgPSBjaGFuLT5jb29raWUgPSAxOwotCXNwaW5fdW5sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCiAJLyogY2hhbm5lbCBwYXJhbWV0ZXJzICovCiAJY2hhbm5lbF93cml0ZWwoYXRjaGFuLCBDRkcsIGNmZyk7CkBAIC0xMjYwLDEyICsxMjY4LDExIEBACiAKIAkvKiBpbml0aWFsaXplIGNoYW5uZWxzIHJlbGF0ZWQgdmFsdWVzICovCiAJSU5JVF9MSVNUX0hFQUQoJmF0ZG1hLT5kbWFfY29tbW9uLmNoYW5uZWxzKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5yX2NoYW5uZWxzOyBpKyssIGF0ZG1hLT5kbWFfY29tbW9uLmNoYW5jbnQrKykgeworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnJfY2hhbm5lbHM7IGkrKykgewogCQlzdHJ1Y3QgYXRfZG1hX2NoYW4JKmF0Y2hhbiA9ICZhdGRtYS0+Y2hhbltpXTsKIAogCQlhdGNoYW4tPmNoYW5fY29tbW9uLmRldmljZSA9ICZhdGRtYS0+ZG1hX2NvbW1vbjsKIAkJYXRjaGFuLT5jaGFuX2NvbW1vbi5jb29raWUgPSBhdGNoYW4tPmNvbXBsZXRlZF9jb29raWUgPSAxOwotCQlhdGNoYW4tPmNoYW5fY29tbW9uLmNoYW5faWQgPSBpOwogCQlsaXN0X2FkZF90YWlsKCZhdGNoYW4tPmNoYW5fY29tbW9uLmRldmljZV9ub2RlLAogCQkJCSZhdGRtYS0+ZG1hX2NvbW1vbi5jaGFubmVscyk7CiAKQEAgLTEyOTMsMjIgKzEzMDAsMjAgQEAKIAlpZiAoZG1hX2hhc19jYXAoRE1BX01FTUNQWSwgYXRkbWEtPmRtYV9jb21tb24uY2FwX21hc2spKQogCQlhdGRtYS0+ZG1hX2NvbW1vbi5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5ID0gYXRjX3ByZXBfZG1hX21lbWNweTsKIAotCWlmIChkbWFfaGFzX2NhcChETUFfU0xBVkUsIGF0ZG1hLT5kbWFfY29tbW9uLmNhcF9tYXNrKSkKKwlpZiAoZG1hX2hhc19jYXAoRE1BX1NMQVZFLCBhdGRtYS0+ZG1hX2NvbW1vbi5jYXBfbWFzaykpIHsKIAkJYXRkbWEtPmRtYV9jb21tb24uZGV2aWNlX3ByZXBfc2xhdmVfc2cgPSBhdGNfcHJlcF9zbGF2ZV9zZzsKLQotCWlmIChkbWFfaGFzX2NhcChETUFfQ1lDTElDLCBhdGRtYS0+ZG1hX2NvbW1vbi5jYXBfbWFzaykpCisJCS8qIGNvbnRyb2xsZXIgY2FuIGRvIHNsYXZlIERNQTogY2FuIHRyaWdnZXIgY3ljbGljIHRyYW5zZmVycyAqLworCQlkbWFfY2FwX3NldChETUFfQ1lDTElDLCBhdGRtYS0+ZG1hX2NvbW1vbi5jYXBfbWFzayk7CiAJCWF0ZG1hLT5kbWFfY29tbW9uLmRldmljZV9wcmVwX2RtYV9jeWNsaWMgPSBhdGNfcHJlcF9kbWFfY3ljbGljOwotCi0JaWYgKGRtYV9oYXNfY2FwKERNQV9TTEFWRSwgYXRkbWEtPmRtYV9jb21tb24uY2FwX21hc2spIHx8Ci0JICAgIGRtYV9oYXNfY2FwKERNQV9DWUNMSUMsIGF0ZG1hLT5kbWFfY29tbW9uLmNhcF9tYXNrKSkKIAkJYXRkbWEtPmRtYV9jb21tb24uZGV2aWNlX2NvbnRyb2wgPSBhdGNfY29udHJvbDsKKwl9CiAKIAlkbWFfd3JpdGVsKGF0ZG1hLCBFTiwgQVRfRE1BX0VOQUJMRSk7CiAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQXRtZWwgQUhCIERNQSBDb250cm9sbGVyICggJXMlcyksICVkIGNoYW5uZWxzXG4iLAogCSAgZG1hX2hhc19jYXAoRE1BX01FTUNQWSwgYXRkbWEtPmRtYV9jb21tb24uY2FwX21hc2spID8gImNweSAiIDogIiIsCiAJICBkbWFfaGFzX2NhcChETUFfU0xBVkUsIGF0ZG1hLT5kbWFfY29tbW9uLmNhcF9tYXNrKSAgPyAic2xhdmUgIiA6ICIiLAotCSAgYXRkbWEtPmRtYV9jb21tb24uY2hhbmNudCk7CisJICBwZGF0YS0+bnJfY2hhbm5lbHMpOwogCiAJZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcigmYXRkbWEtPmRtYV9jb21tb24pOwogCkBAIC0xMzc3LDI3ICsxMzgyLDExMiBAQAogCWNsa19kaXNhYmxlKGF0ZG1hLT5jbGspOwogfQogCitzdGF0aWMgaW50IGF0X2RtYV9wcmVwYXJlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGF0X2RtYSAqYXRkbWEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sICpfY2hhbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGFuLCBfY2hhbiwgJmF0ZG1hLT5kbWFfY29tbW9uLmNoYW5uZWxzLAorCQkJZGV2aWNlX25vZGUpIHsKKwkJc3RydWN0IGF0X2RtYV9jaGFuICphdGNoYW4gPSB0b19hdF9kbWFfY2hhbihjaGFuKTsKKwkJLyogd2FpdCBmb3IgdHJhbnNhY3Rpb24gY29tcGxldGlvbiAoZXhjZXB0IGluIGN5Y2xpYyBjYXNlKSAqLworCQlpZiAoYXRjX2NoYW5faXNfZW5hYmxlZChhdGNoYW4pICYmICFhdGNfY2hhbl9pc19jeWNsaWMoYXRjaGFuKSkKKwkJCXJldHVybiAtRUFHQUlOOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRjX3N1c3BlbmRfY3ljbGljKHN0cnVjdCBhdF9kbWFfY2hhbiAqYXRjaGFuKQoreworCXN0cnVjdCBkbWFfY2hhbgkqY2hhbiA9ICZhdGNoYW4tPmNoYW5fY29tbW9uOworCisJLyogQ2hhbm5lbCBzaG91bGQgYmUgcGF1c2VkIGJ5IHVzZXIKKwkgKiBkbyBpdCBhbnl3YXkgZXZlbiBpZiBpdCBpcyBub3QgZG9uZSBhbHJlYWR5ICovCisJaWYgKCFhdGNfY2hhbl9pc19wYXVzZWQoYXRjaGFuKSkgeworCQlkZXZfd2FybihjaGFuMmRldihjaGFuKSwKKwkJImN5Y2xpYyBjaGFubmVsIG5vdCBwYXVzZWQsIHNob3VsZCBiZSBkb25lIGJ5IGNoYW5uZWwgdXNlclxuIik7CisJCWF0Y19jb250cm9sKGNoYW4sIERNQV9QQVVTRSwgMCk7CisJfQorCisJLyogbm93IHByZXNlcnZlIGFkZGl0aW9uYWwgZGF0YSBmb3IgY3ljbGljIG9wZXJhdGlvbnMgKi8KKwkvKiBuZXh0IGRlc2NyaXB0b3IgYWRkcmVzcyBpbiB0aGUgY3ljbGljIGxpc3QgKi8KKwlhdGNoYW4tPnNhdmVfZHNjciA9IGNoYW5uZWxfcmVhZGwoYXRjaGFuLCBEU0NSKTsKKworCXZkYmdfZHVtcF9yZWdzKGF0Y2hhbik7Cit9CisKIHN0YXRpYyBpbnQgYXRfZG1hX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgYXRfZG1hICphdGRtYSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgKl9jaGFuOwogCi0JYXRfZG1hX29mZihwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7CisJLyogcHJlc2VydmUgZGF0YSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGFuLCBfY2hhbiwgJmF0ZG1hLT5kbWFfY29tbW9uLmNoYW5uZWxzLAorCQkJZGV2aWNlX25vZGUpIHsKKwkJc3RydWN0IGF0X2RtYV9jaGFuICphdGNoYW4gPSB0b19hdF9kbWFfY2hhbihjaGFuKTsKKworCQlpZiAoYXRjX2NoYW5faXNfY3ljbGljKGF0Y2hhbikpCisJCQlhdGNfc3VzcGVuZF9jeWNsaWMoYXRjaGFuKTsKKwkJYXRjaGFuLT5zYXZlX2NmZyA9IGNoYW5uZWxfcmVhZGwoYXRjaGFuLCBDRkcpOworCX0KKwlhdGRtYS0+c2F2ZV9pbXIgPSBkbWFfcmVhZGwoYXRkbWEsIEVCQ0lNUik7CisKKwkvKiBkaXNhYmxlIERNQSBjb250cm9sbGVyICovCisJYXRfZG1hX29mZihhdGRtYSk7CiAJY2xrX2Rpc2FibGUoYXRkbWEtPmNsayk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGF0Y19yZXN1bWVfY3ljbGljKHN0cnVjdCBhdF9kbWFfY2hhbiAqYXRjaGFuKQoreworCXN0cnVjdCBhdF9kbWEJKmF0ZG1hID0gdG9fYXRfZG1hKGF0Y2hhbi0+Y2hhbl9jb21tb24uZGV2aWNlKTsKKworCS8qIHJlc3RvcmUgY2hhbm5lbCBzdGF0dXMgZm9yIGN5Y2xpYyBkZXNjcmlwdG9ycyBsaXN0OgorCSAqIG5leHQgZGVzY3JpcHRvciBpbiB0aGUgY3ljbGljIGxpc3QgYXQgdGhlIHRpbWUgb2Ygc3VzcGVuZCAqLworCWNoYW5uZWxfd3JpdGVsKGF0Y2hhbiwgU0FERFIsIDApOworCWNoYW5uZWxfd3JpdGVsKGF0Y2hhbiwgREFERFIsIDApOworCWNoYW5uZWxfd3JpdGVsKGF0Y2hhbiwgQ1RSTEEsIDApOworCWNoYW5uZWxfd3JpdGVsKGF0Y2hhbiwgQ1RSTEIsIDApOworCWNoYW5uZWxfd3JpdGVsKGF0Y2hhbiwgRFNDUiwgYXRjaGFuLT5zYXZlX2RzY3IpOworCWRtYV93cml0ZWwoYXRkbWEsIENIRVIsIGF0Y2hhbi0+bWFzayk7CisKKwkvKiBjaGFubmVsIHBhdXNlIHN0YXR1cyBzaG91bGQgYmUgcmVtb3ZlZCBieSBjaGFubmVsIHVzZXIKKwkgKiBXZSBjYW5ub3QgdGFrZSB0aGUgaW5pdGlhdGl2ZSB0byBkbyBpdCBoZXJlICovCisKKwl2ZGJnX2R1bXBfcmVncyhhdGNoYW4pOworfQorCiBzdGF0aWMgaW50IGF0X2RtYV9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgYXRfZG1hICphdGRtYSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgKl9jaGFuOwogCisJLyogYnJpbmcgYmFjayBETUEgY29udHJvbGxlciAqLwogCWNsa19lbmFibGUoYXRkbWEtPmNsayk7CiAJZG1hX3dyaXRlbChhdGRtYSwgRU4sIEFUX0RNQV9FTkFCTEUpOworCisJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0ICovCisJd2hpbGUgKGRtYV9yZWFkbChhdGRtYSwgRUJDSVNSKSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiByZXN0b3JlIHNhdmVkIGRhdGEgKi8KKwlkbWFfd3JpdGVsKGF0ZG1hLCBFQkNJRVIsIGF0ZG1hLT5zYXZlX2ltcik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoYW4sIF9jaGFuLCAmYXRkbWEtPmRtYV9jb21tb24uY2hhbm5lbHMsCisJCQlkZXZpY2Vfbm9kZSkgeworCQlzdHJ1Y3QgYXRfZG1hX2NoYW4gKmF0Y2hhbiA9IHRvX2F0X2RtYV9jaGFuKGNoYW4pOworCisJCWNoYW5uZWxfd3JpdGVsKGF0Y2hhbiwgQ0ZHLCBhdGNoYW4tPnNhdmVfY2ZnKTsKKwkJaWYgKGF0Y19jaGFuX2lzX2N5Y2xpYyhhdGNoYW4pKQorCQkJYXRjX3Jlc3VtZV9jeWNsaWMoYXRjaGFuKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhdF9kbWFfZGV2X3BtX29wcyA9IHsKKwkucHJlcGFyZSA9IGF0X2RtYV9wcmVwYXJlLAogCS5zdXNwZW5kX25vaXJxID0gYXRfZG1hX3N1c3BlbmRfbm9pcnEsCiAJLnJlc3VtZV9ub2lycSA9IGF0X2RtYV9yZXN1bWVfbm9pcnEsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvYXRfaGRtYWNfcmVncy5oIGIvZHJpdmVycy9kbWEvYXRfaGRtYWNfcmVncy5oCmluZGV4IDA4N2RiZjEuLmFhNGM5YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjX3JlZ3MuaAorKysgYi9kcml2ZXJzL2RtYS9hdF9oZG1hY19yZWdzLmgKQEAgLTIwNCw2ICsyMDQsOSBAQAogICogQHN0YXR1czogdHJhbnNtaXQgc3RhdHVzIGluZm9ybWF0aW9uIGZyb20gaXJxL3ByZXAqIGZ1bmN0aW9ucwogICogICAgICAgICAgICAgICAgdG8gdGFza2xldCAodXNlIGF0b21pYyBvcGVyYXRpb25zKQogICogQHRhc2tsZXQ6IGJvdHRvbSBoYWxmIHRvIGZpbmlzaCB0cmFuc2FjdGlvbiB3b3JrCisgKiBAc2F2ZV9jZmc6IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdGhhdCBpcyBzYXZlZCBvbiBzdXNwZW5kL3Jlc3VtZSBjeWNsZQorICogQHNhdmVfZHNjcjogZm9yIGN5Y2xpYyBvcGVyYXRpb25zLCBwcmVzZXJ2ZSBuZXh0IGRlc2NyaXB0b3IgYWRkcmVzcyBpbgorICogICAgICAgICAgICAgdGhlIGN5Y2xpYyBsaXN0IG9uIHN1c3BlbmQvcmVzdW1lIGN5Y2xlCiAgKiBAbG9jazogc2VyaWFsaXplcyBlbnF1ZXVlL2RlcXVldWUgb3BlcmF0aW9ucyB0byBkZXNjcmlwdG9ycyBsaXN0cwogICogQGNvbXBsZXRlZF9jb29raWU6IGlkZW50aWZpZXIgZm9yIHRoZSBtb3N0IHJlY2VudGx5IGNvbXBsZXRlZCBvcGVyYXRpb24KICAqIEBhY3RpdmVfbGlzdDogbGlzdCBvZiBkZXNjcmlwdG9ycyBkbWFlbmdpbmUgaXMgYmVpbmcgcnVubmluZyBvbgpAQCAtMjE4LDYgKzIyMSw4IEBACiAJdTgJCQltYXNrOwogCXVuc2lnbmVkIGxvbmcJCXN0YXR1czsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGFza2xldDsKKwl1MzIJCQlzYXZlX2NmZzsKKwl1MzIJCQlzYXZlX2RzY3I7CiAKIAlzcGlubG9ja190CQlsb2NrOwogCkBAIC0yNDgsNiArMjUzLDcgQEAKICAqIEBjaGFuX2NvbW1vbjogY29tbW9uIGRtYWVuZ2luZSBkbWFfZGV2aWNlIG9iamVjdCBtZW1iZXJzCiAgKiBAY2hfcmVnczogbWVtb3J5IG1hcHBlZCByZWdpc3RlciBiYXNlCiAgKiBAY2xrOiBkbWEgY29udHJvbGxlciBjbG9jaworICogQHNhdmVfaW1yOiBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciB0aGF0IGlzIHNhdmVkIG9uIHN1c3BlbmQvcmVzdW1lIGN5Y2xlCiAgKiBAYWxsX2NoYW5fbWFzazogYWxsIGNoYW5uZWxzIGF2YWlsbGFibGUgaW4gYSBtYXNrCiAgKiBAZG1hX2Rlc2NfcG9vbDogYmFzZSBvZiBETUEgZGVzY3JpcHRvciByZWdpb24gKERNQSBhZGRyZXNzKQogICogQGNoYW46IGNoYW5uZWxzIHRhYmxlIHRvIHN0b3JlIGF0X2RtYV9jaGFuIHN0cnVjdHVyZXMKQEAgLTI1Niw2ICsyNjIsNyBAQAogCXN0cnVjdCBkbWFfZGV2aWNlCWRtYV9jb21tb247CiAJdm9pZCBfX2lvbWVtCQkqcmVnczsKIAlzdHJ1Y3QgY2xrCQkqY2xrOworCXUzMgkJCXNhdmVfaW1yOwogCiAJdTgJCQlhbGxfY2hhbl9tYXNrOwogCkBAIC0zNTUsNiArMzYyLDIzIEBACiAJcmV0dXJuICEhKGRtYV9yZWFkbChhdGRtYSwgQ0hTUikgJiBhdGNoYW4tPm1hc2spOwogfQogCisvKioKKyAqIGF0Y19jaGFuX2lzX3BhdXNlZCAtIHRlc3QgY2hhbm5lbCBwYXVzZS9yZXN1bWUgc3RhdHVzCisgKiBAYXRjaGFuOiBjaGFubmVsIHdlIHdhbnQgdG8gdGVzdCBzdGF0dXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgYXRjX2NoYW5faXNfcGF1c2VkKHN0cnVjdCBhdF9kbWFfY2hhbiAqYXRjaGFuKQoreworCXJldHVybiB0ZXN0X2JpdChBVENfSVNfUEFVU0VELCAmYXRjaGFuLT5zdGF0dXMpOworfQorCisvKioKKyAqIGF0Y19jaGFuX2lzX2N5Y2xpYyAtIHRlc3QgaWYgZ2l2ZW4gY2hhbm5lbCBoYXMgY3ljbGljIHByb3BlcnR5IHNldAorICogQGF0Y2hhbjogY2hhbm5lbCB3ZSB3YW50IHRvIHRlc3Qgc3RhdHVzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0Y19jaGFuX2lzX2N5Y2xpYyhzdHJ1Y3QgYXRfZG1hX2NoYW4gKmF0Y2hhbikKK3sKKwlyZXR1cm4gdGVzdF9iaXQoQVRDX0lTX0NZQ0xJQywgJmF0Y2hhbi0+c3RhdHVzKTsKK30KIAogLyoqCiAgKiBzZXRfZGVzY19lb2wgLSBzZXQgZW5kLW9mLWxpbmsgdG8gZGVzY3JpcHRvciBzbyBpdCB3aWxsIGVuZCB0cmFuc2ZlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hdGVzdC5jIGIvZHJpdmVycy9kbWEvZG1hdGVzdC5jCmluZGV4IDc2NWY1ZmYuLmViMWQ4NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2RtYXRlc3QuYworKysgYi9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yNTEsNiArMjUyLDcgQEAKIAlpbnQJCQlpOwogCiAJdGhyZWFkX25hbWUgPSBjdXJyZW50LT5jb21tOworCXNldF9mcmVlemFibGVfd2l0aF9zaWduYWwoKTsKIAogCXJldCA9IC1FTk9NRU07CiAKQEAgLTMwNSw3ICszMDcsOCBAQAogCQlkbWFfYWRkcl90IGRtYV9zcmNzW3NyY19jbnRdOwogCQlkbWFfYWRkcl90IGRtYV9kc3RzW2RzdF9jbnRdOwogCQlzdHJ1Y3QgY29tcGxldGlvbiBjbXA7Ci0JCXVuc2lnbmVkIGxvbmcgdG1vID0gbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgdG1vLCBlbmQgPSAwIC8qIGNvbXBpbGVyLi4uICovOworCQlib29sIHJlbG9hZCA9IHRydWU7CiAJCXU4IGFsaWduID0gMDsKIAogCQl0b3RhbF90ZXN0cysrOwpAQCAtNDA0LDcgKzQwNywxNyBAQAogCQl9CiAJCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGNoYW4pOwogCi0JCXRtbyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY21wLCB0bW8pOworCQlkbyB7CisJCQlzdGFydCA9IGppZmZpZXM7CisJCQlpZiAocmVsb2FkKQorCQkJCWVuZCA9IHN0YXJ0ICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKKwkJCWVsc2UgaWYgKGVuZCA8PSBzdGFydCkKKwkJCQllbmQgPSBzdGFydCArIDE7CisJCQl0bW8gPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmY21wLAorCQkJCQkJCQllbmQgLSBzdGFydCk7CisJCQlyZWxvYWQgPSB0cnlfdG9fZnJlZXplKCk7CisJCX0gd2hpbGUgKHRtbyA9PSAtRVJFU1RBUlRTWVMpOworCiAJCXN0YXR1cyA9IGRtYV9hc3luY19pc190eF9jb21wbGV0ZShjaGFuLCBjb29raWUsIE5VTEwsIE5VTEwpOwogCiAJCWlmICh0bW8gPT0gMCkgewpAQCAtNDc3LDYgKzQ5MCw4IEBACiAJcHJfbm90aWNlKCIlczogdGVybWluYXRpbmcgYWZ0ZXIgJXUgdGVzdHMsICV1IGZhaWx1cmVzIChzdGF0dXMgJWQpXG4iLAogCQkJdGhyZWFkX25hbWUsIHRvdGFsX3Rlc3RzLCBmYWlsZWRfdGVzdHMsIHJldCk7CiAKKwkvKiB0ZXJtaW5hdGUgYWxsIHRyYW5zZmVycyBvbiBzcGVjaWZpZWQgY2hhbm5lbHMgKi8KKwljaGFuLT5kZXZpY2UtPmRldmljZV9jb250cm9sKGNoYW4sIERNQV9URVJNSU5BVEVfQUxMLCAwKTsKIAlpZiAoaXRlcmF0aW9ucyA+IDApCiAJCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCQlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLKHdhaXRfZG1hdGVzdF9leGl0KTsKQEAgLTQ5OSw2ICs1MTQsMTAgQEAKIAkJbGlzdF9kZWwoJnRocmVhZC0+bm9kZSk7CiAJCWtmcmVlKHRocmVhZCk7CiAJfQorCisJLyogdGVybWluYXRlIGFsbCB0cmFuc2ZlcnMgb24gc3BlY2lmaWVkIGNoYW5uZWxzICovCisJZHRjLT5jaGFuLT5kZXZpY2UtPmRldmljZV9jb250cm9sKGR0Yy0+Y2hhbiwgRE1BX1RFUk1JTkFURV9BTEwsIDApOworCiAJa2ZyZWUoZHRjKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZHdfZG1hYy5jIGIvZHJpdmVycy9kbWEvZHdfZG1hYy5jCmluZGV4IDRkMTgwY2EuLjliZmQ2ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2R3X2RtYWMuYworKysgYi9kcml2ZXJzL2RtYS9kd19kbWFjLmMKQEAgLTE0MDcsMTIgKzE0MDcsMTEgQEAKIAlkdy0+YWxsX2NoYW5fbWFzayA9ICgxIDw8IHBkYXRhLT5ucl9jaGFubmVscykgLSAxOwogCiAJSU5JVF9MSVNUX0hFQUQoJmR3LT5kbWEuY2hhbm5lbHMpOwotCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnJfY2hhbm5lbHM7IGkrKywgZHctPmRtYS5jaGFuY250KyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5yX2NoYW5uZWxzOyBpKyspIHsKIAkJc3RydWN0IGR3X2RtYV9jaGFuCSpkd2MgPSAmZHctPmNoYW5baV07CiAKIAkJZHdjLT5jaGFuLmRldmljZSA9ICZkdy0+ZG1hOwogCQlkd2MtPmNoYW4uY29va2llID0gZHdjLT5jb21wbGV0ZWQgPSAxOwotCQlkd2MtPmNoYW4uY2hhbl9pZCA9IGk7CiAJCWlmIChwZGF0YS0+Y2hhbl9hbGxvY2F0aW9uX29yZGVyID09IENIQU5fQUxMT0NBVElPTl9BU0NFTkRJTkcpCiAJCQlsaXN0X2FkZF90YWlsKCZkd2MtPmNoYW4uZGV2aWNlX25vZGUsCiAJCQkJCSZkdy0+ZG1hLmNoYW5uZWxzKTsKQEAgLTE0NjgsNyArMTQ2Nyw3IEBACiAJZG1hX3dyaXRlbChkdywgQ0ZHLCBEV19DRkdfRE1BX0VOKTsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXNpZ25XYXJlIERNQSBDb250cm9sbGVyLCAlZCBjaGFubmVsc1xuIiwKLQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpLCBkdy0+ZG1hLmNoYW5jbnQpOworCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIHBkYXRhLT5ucl9jaGFubmVscyk7CiAKIAlkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKCZkdy0+ZG1hKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZXA5M3h4X2RtYS5jIGIvZHJpdmVycy9kbWEvZXA5M3h4X2RtYS5jCmluZGV4IDVkN2E0OWIuLmI0N2UyYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9lcDkzeHhfZG1hLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pbXgtZG1hLmMgYi9kcml2ZXJzL2RtYS9pbXgtZG1hLmMKaW5kZXggZDk5ZjcxYy4uNGJlNTVmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW14LWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2lteC1kbWEuYwpAQCAtMTQsNiArMTQsNyBAQAogICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMjMsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS12MS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW14LXNkbWEuYyBiL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMKaW5kZXggN2JkN2U5OC4uZjk5Mzk1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW14LXNkbWEuYworKysgYi9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zNCw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL3NkbWEuaD4KQEAgLTMxOCw2ICszMjAsNyBAQAogCWRtYV9hZGRyX3QJCQljb250ZXh0X3BoeXM7CiAJc3RydWN0IGRtYV9kZXZpY2UJCWRtYV9kZXZpY2U7CiAJc3RydWN0IGNsawkJCSpjbGs7CisJc3RydWN0IG11dGV4CQkJY2hhbm5lbF8wX2xvY2s7CiAJc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzCSpzY3JpcHRfYWRkcnM7CiB9OwogCkBAIC00MTUsMTEgKzQxOCwxNSBAQAogCWRtYV9hZGRyX3QgYnVmX3BoeXM7CiAJaW50IHJldDsKIAorCW11dGV4X2xvY2soJnNkbWEtPmNoYW5uZWxfMF9sb2NrKTsKKwogCWJ1Zl92aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsCiAJCQlzaXplLAogCQkJJmJ1Zl9waHlzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1Zl92aXJ0KQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWJ1Zl92aXJ0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CiAKIAliZDAtPm1vZGUuY29tbWFuZCA9IEMwX1NFVFBNOwogCWJkMC0+bW9kZS5zdGF0dXMgPSBCRF9ET05FIHwgQkRfSU5UUiB8IEJEX1dSQVAgfCBCRF9FWFREOwpAQCAtNDMzLDYgKzQ0MCw5IEBACiAKIAlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzaXplLCBidWZfdmlydCwgYnVmX3BoeXMpOwogCitlcnJfb3V0OgorCW11dGV4X3VubG9jaygmc2RtYS0+Y2hhbm5lbF8wX2xvY2spOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjU2LDYgKzY2Niw4IEBACiAJZGV2X2RiZyhzZG1hLT5kZXYsICJldmVudF9tYXNrMCA9IDB4JTA4eFxuIiwgc2RtYWMtPmV2ZW50X21hc2swKTsKIAlkZXZfZGJnKHNkbWEtPmRldiwgImV2ZW50X21hc2sxID0gMHglMDh4XG4iLCBzZG1hYy0+ZXZlbnRfbWFzazEpOwogCisJbXV0ZXhfbG9jaygmc2RtYS0+Y2hhbm5lbF8wX2xvY2spOworCiAJbWVtc2V0KGNvbnRleHQsIDAsIHNpemVvZigqY29udGV4dCkpOwogCWNvbnRleHQtPmNoYW5uZWxfc3RhdGUucGMgPSBsb2FkX2FkZHJlc3M7CiAKQEAgLTY3Niw2ICs2ODgsOCBAQAogCiAJcmV0ID0gc2RtYV9ydW5fY2hhbm5lbCgmc2RtYS0+Y2hhbm5lbFswXSk7CiAKKwltdXRleF91bmxvY2soJnNkbWEtPmNoYW5uZWxfMF9sb2NrKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMzEsMTggKzExNDUsMTcgQEAKIAkJCXNhZGRyX2FycltpXSA9IGFkZHJfYXJyW2ldOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzZG1hX2dldF9maXJtd2FyZShzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkbWEsCi0JCWNvbnN0IGNoYXIgKmZ3X25hbWUpCitzdGF0aWMgdm9pZCBzZG1hX2xvYWRfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKIHsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCXN0cnVjdCBzZG1hX2VuZ2luZSAqc2RtYSA9IGNvbnRleHQ7CiAJY29uc3Qgc3RydWN0IHNkbWFfZmlybXdhcmVfaGVhZGVyICpoZWFkZXI7Ci0JaW50IHJldDsKIAljb25zdCBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgKmFkZHI7CiAJdW5zaWduZWQgc2hvcnQgKnJhbV9jb2RlOwogCi0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsIHNkbWEtPmRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpZiAoIWZ3KSB7CisJCWRldl9lcnIoc2RtYS0+ZGV2LCAiZmlybXdhcmUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChmdy0+c2l6ZSA8IHNpemVvZigqaGVhZGVyKSkKIAkJZ290byBlcnJfZmlybXdhcmU7CkBAIC0xMTcyLDYgKzExODUsMTYgQEAKIAogZXJyX2Zpcm13YXJlOgogCXJlbGVhc2VfZmlybXdhcmUoZncpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZG1hX2dldF9maXJtd2FyZShzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkbWEsCisJCWNvbnN0IGNoYXIgKmZ3X25hbWUpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLAorCQkJRldfQUNUSU9OX0hPVFBMVUcsIGZ3X25hbWUsIHNkbWEtPmRldiwKKwkJCUdGUF9LRVJORUwsIHNkbWEsIHNkbWFfbG9hZF9maXJtd2FyZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTI2OSwxMSArMTI5MiwxNCBAQAogCXN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW50IGk7CiAJc3RydWN0IHNkbWFfZW5naW5lICpzZG1hOworCXMzMiAqc2FkZHJfYXJyOwogCiAJc2RtYSA9IGt6YWxsb2Moc2l6ZW9mKCpzZG1hKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZG1hKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCW11dGV4X2luaXQoJnNkbWEtPmNoYW5uZWxfMF9sb2NrKTsKKwogCXNkbWEtPmRldiA9ICZwZGV2LT5kZXY7CiAKIAlpb3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CkBAIC0xMzEwLDYgKzEzMzYsMTEgQEAKIAkJZ290byBlcnJfYWxsb2M7CiAJfQogCisJLyogaW5pdGlhbGx5IG5vIHNjcmlwdHMgYXZhaWxhYmxlICovCisJc2FkZHJfYXJyID0gKHMzMiAqKXNkbWEtPnNjcmlwdF9hZGRyczsKKwlmb3IgKGkgPSAwOyBpIDwgU0RNQV9TQ1JJUFRfQUREUlNfQVJSQVlfU0laRV9WMTsgaSsrKQorCQlzYWRkcl9hcnJbaV0gPSAtRUlOVkFMOworCiAJaWYgKG9mX2lkKQogCQlwZGV2LT5pZF9lbnRyeSA9IG9mX2lkLT5kYXRhOwogCXNkbWEtPmRldnR5cGUgPSBwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pbnRlbF9taWRfZG1hLmMgYi9kcml2ZXJzL2RtYS9pbnRlbF9taWRfZG1hLmMKaW5kZXggOGEzZmRkOC4uMTlhMGM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2ludGVsX21pZF9kbWEuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlbF9taWRfZG1hLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgTUFYX0NIQU4JNCAvKm1heCBjaCBhY3Jvc3MgY29udHJvbGxlcnMqLwogI2luY2x1ZGUgImludGVsX21pZF9kbWFfcmVncy5oIgpAQCAtMTE1LDE2ICsxMTYsMTUgQEAKIAogLyoqCiAgKiBkbWFjMV9tYXNrX3BlcmlwaHJhbF9pbnRyIC0JbWFzayB0aGUgcGVyaXBocmFsIGludGVycnVwdAotICogQG1pZGM6IGRtYSBjaGFubmVsIGZvciB3aGljaCBtYXNraW5nIGlzIHJlcXVpcmVkCisgKiBAbWlkOiBkbWEgZGV2aWNlIGZvciB3aGljaCBtYXNraW5nIGlzIHJlcXVpcmVkCiAgKgogICogTWFza3MgdGhlIERNQSBwZXJpcGhyYWwgaW50ZXJydXB0CiAgKiB0aGlzIGlzIHZhbGlkIGZvciBETUFDMSBmYW1pbHkgY29udHJvbGxlcnMgb25seQogICogVGhpcyBjb250cm9sbGVyIHNob3VsZCBoYXZlIHBlcmlwaHJhbCBtYXNrIHJlZ2lzdGVycyBhbHJlYWR5IG1hcHBlZAogICovCi1zdGF0aWMgdm9pZCBkbWFjMV9tYXNrX3BlcmlwaHJhbF9pbnRyKHN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4gKm1pZGMpCitzdGF0aWMgdm9pZCBkbWFjMV9tYXNrX3BlcmlwaHJhbF9pbnRyKHN0cnVjdCBtaWRkbWFfZGV2aWNlICptaWQpCiB7CiAJdTMyIHBpbXI7Ci0Jc3RydWN0IG1pZGRtYV9kZXZpY2UgKm1pZCA9IHRvX21pZGRtYV9kZXZpY2UobWlkYy0+Y2hhbi5kZXZpY2UpOwogCiAJaWYgKG1pZC0+cGltcl9tYXNrKSB7CiAJCXBpbXIgPSByZWFkbChtaWQtPm1hc2tfcmVnICsgTE5XX1BFUklQSFJBTF9NQVNLKTsKQEAgLTE4NCw3ICsxODQsNiBAQAogc3RhdGljIHZvaWQgZGlzYWJsZV9kbWFfaW50ZXJydXB0KHN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4gKm1pZGMpCiB7CiAJLypDaGVjayBMUEUgUElTUiwgbWFrZSBzdXJlIGZ3ZCBpcyBkaXNhYmxlZCovCi0JZG1hYzFfbWFza19wZXJpcGhyYWxfaW50cihtaWRjKTsKIAlpb3dyaXRlMzIoTUFTS19JTlRSX1JFRyhtaWRjLT5jaF9pZCksIG1pZGMtPmRtYV9iYXNlICsgTUFTS19CTE9DSyk7CiAJaW93cml0ZTMyKE1BU0tfSU5UUl9SRUcobWlkYy0+Y2hfaWQpLCBtaWRjLT5kbWFfYmFzZSArIE1BU0tfVEZSKTsKIAlpb3dyaXRlMzIoTUFTS19JTlRSX1JFRyhtaWRjLT5jaF9pZCksIG1pZGMtPmRtYV9iYXNlICsgTUFTS19FUlIpOwpAQCAtMTExNCw3ICsxMTEzLDYgQEAKIAogCQltaWRjaC0+Y2hhbi5kZXZpY2UgPSAmZG1hLT5jb21tb247CiAJCW1pZGNoLT5jaGFuLmNvb2tpZSA9ICAxOwotCQltaWRjaC0+Y2hhbi5jaGFuX2lkID0gaTsKIAkJbWlkY2gtPmNoX2lkID0gZG1hLT5jaGFuX2Jhc2UgKyBpOwogCQlwcl9kZWJ1ZygiTURNQTpJbml0IENIICVkLCBJRCAlZFxuIiwgaSwgbWlkY2gtPmNoX2lkKTsKIApAQCAtMTE1MCw3ICsxMTQ4LDYgQEAKIAlkbWFfY2FwX3NldChETUFfU0xBVkUsIGRtYS0+Y29tbW9uLmNhcF9tYXNrKTsKIAlkbWFfY2FwX3NldChETUFfUFJJVkFURSwgZG1hLT5jb21tb24uY2FwX21hc2spOwogCWRtYS0+Y29tbW9uLmRldiA9ICZwZGV2LT5kZXY7Ci0JZG1hLT5jb21tb24uY2hhbmNudCA9IGRtYS0+bWF4X2NoYW47CiAKIAlkbWEtPmNvbW1vbi5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPQogCQkJCQlpbnRlbF9taWRfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzOwpAQCAtMTM1MCw2ICsxMzQ3LDcgQEAKIAkJaWYgKGRldmljZS0+Y2hbaV0uaW5fdXNlKQogCQkJcmV0dXJuIC1FQUdBSU47CiAJfQorCWRtYWMxX21hc2tfcGVyaXBocmFsX2ludHIoZGV2aWNlKTsKIAlkZXZpY2UtPnN0YXRlID0gU1VTUEVOREVEOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMgYi9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMKaW5kZXggNjgxNTkwNS4uMGU1ZWYzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaXB1L2lwdV9pZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL2lwdS9pcHVfaWRtYWMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtYWNoL2lwdS5oPgogCkBAIC0xMzA3LDYgKzEzMDgsNyBAQAogCSAgICBpcHVfc3VibWl0X2J1ZmZlcihpY2hhbiwgZGVzY25ldywgc2duZXcsIGljaGFuLT5hY3RpdmVfYnVmZmVyKSA8IDApIHsKIAkJY2FsbGJhY2sgPSBkZXNjbmV3LT50eGQuY2FsbGJhY2s7CiAJCWNhbGxiYWNrX3BhcmFtID0gZGVzY25ldy0+dHhkLmNhbGxiYWNrX3BhcmFtOworCQlsaXN0X2RlbF9pbml0KCZkZXNjbmV3LT5saXN0KTsKIAkJc3Bpbl91bmxvY2soJmljaGFuLT5sb2NrKTsKIAkJaWYgKGNhbGxiYWNrKQogCQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOwpAQCAtMTQyOCwzOSArMTQzMCw1OCBAQAogewogCXN0cnVjdCBpZG1hY19jaGFubmVsICppY2hhbiA9IHRvX2lkbWFjX2NoYW4oY2hhbik7CiAJc3RydWN0IGlkbWFjICppZG1hYyA9IHRvX2lkbWFjKGNoYW4tPmRldmljZSk7CisJc3RydWN0IGlwdSAqaXB1ID0gdG9faXB1KGlkbWFjKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKLQkvKiBPbmx5IHN1cHBvcnRzIERNQV9URVJNSU5BVEVfQUxMICovCi0JaWYgKGNtZCAhPSBETUFfVEVSTUlOQVRFX0FMTCkKLQkJcmV0dXJuIC1FTlhJTzsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRE1BX1BBVVNFOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXB1LT5sb2NrLCBmbGFncyk7CisJCWlwdV9pY19kaXNhYmxlX3Rhc2soaXB1LCBjaGFuLT5jaGFuX2lkKTsKIAotCWlwdV9kaXNhYmxlX2NoYW5uZWwoaWRtYWMsIGljaGFuLAotCQkJICAgIGljaGFuLT5zdGF0dXMgPj0gSVBVX0NIQU5ORUxfRU5BQkxFRCk7CisJCS8qIFJldHVybiBhbGwgZGVzY3JpcHRvcnMgaW50byAicHJlcGFyZWQiIHN0YXRlICovCisJCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0bXAsICZpY2hhbi0+cXVldWUpCisJCQlsaXN0X2RlbF9pbml0KGxpc3QpOwogCi0JdGFza2xldF9kaXNhYmxlKCZ0b19pcHUoaWRtYWMpLT50YXNrbGV0KTsKKwkJaWNoYW4tPnNnWzBdID0gTlVMTDsKKwkJaWNoYW4tPnNnWzFdID0gTlVMTDsKIAotCS8qIGljaGFuLT5xdWV1ZSBpcyBtb2RpZmllZCBpbiBJU1IsIGhhdmUgdG8gc3BpbmxvY2sgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWNoYW4tPmxvY2ssIGZsYWdzKTsKLQlsaXN0X3NwbGljZV9pbml0KCZpY2hhbi0+cXVldWUsICZpY2hhbi0+ZnJlZV9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXB1LT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoaWNoYW4tPmRlc2MpCi0JCWZvciAoaSA9IDA7IGkgPCBpY2hhbi0+bl90eF9kZXNjOyBpKyspIHsKLQkJCXN0cnVjdCBpZG1hY190eF9kZXNjICpkZXNjID0gaWNoYW4tPmRlc2MgKyBpOwotCQkJaWYgKGxpc3RfZW1wdHkoJmRlc2MtPmxpc3QpKQotCQkJCS8qIERlc2NyaXB0b3Igd2FzIHByZXBhcmVkLCBidXQgbm90IHN1Ym1pdHRlZCAqLwotCQkJCWxpc3RfYWRkKCZkZXNjLT5saXN0LCAmaWNoYW4tPmZyZWVfbGlzdCk7CisJCWljaGFuLT5zdGF0dXMgPSBJUFVfQ0hBTk5FTF9JTklUSUFMSVpFRDsKKwkJYnJlYWs7CisJY2FzZSBETUFfVEVSTUlOQVRFX0FMTDoKKwkJaXB1X2Rpc2FibGVfY2hhbm5lbChpZG1hYywgaWNoYW4sCisJCQkJICAgIGljaGFuLT5zdGF0dXMgPj0gSVBVX0NIQU5ORUxfRU5BQkxFRCk7CiAKLQkJCWFzeW5jX3R4X2NsZWFyX2FjaygmZGVzYy0+dHhkKTsKLQkJfQorCQl0YXNrbGV0X2Rpc2FibGUoJmlwdS0+dGFza2xldCk7CiAKLQlpY2hhbi0+c2dbMF0gPSBOVUxMOwotCWljaGFuLT5zZ1sxXSA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWNoYW4tPmxvY2ssIGZsYWdzKTsKKwkJLyogaWNoYW4tPnF1ZXVlIGlzIG1vZGlmaWVkIGluIElTUiwgaGF2ZSB0byBzcGlubG9jayAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWNoYW4tPmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmaWNoYW4tPnF1ZXVlLCAmaWNoYW4tPmZyZWVfbGlzdCk7CiAKLQl0YXNrbGV0X2VuYWJsZSgmdG9faXB1KGlkbWFjKS0+dGFza2xldCk7CisJCWlmIChpY2hhbi0+ZGVzYykKKwkJCWZvciAoaSA9IDA7IGkgPCBpY2hhbi0+bl90eF9kZXNjOyBpKyspIHsKKwkJCQlzdHJ1Y3QgaWRtYWNfdHhfZGVzYyAqZGVzYyA9IGljaGFuLT5kZXNjICsgaTsKKwkJCQlpZiAobGlzdF9lbXB0eSgmZGVzYy0+bGlzdCkpCisJCQkJCS8qIERlc2NyaXB0b3Igd2FzIHByZXBhcmVkLCBidXQgbm90IHN1Ym1pdHRlZCAqLworCQkJCQlsaXN0X2FkZCgmZGVzYy0+bGlzdCwgJmljaGFuLT5mcmVlX2xpc3QpOwogCi0JaWNoYW4tPnN0YXR1cyA9IElQVV9DSEFOTkVMX0lOSVRJQUxJWkVEOworCQkJCWFzeW5jX3R4X2NsZWFyX2FjaygmZGVzYy0+dHhkKTsKKwkJCX0KKworCQlpY2hhbi0+c2dbMF0gPSBOVUxMOworCQlpY2hhbi0+c2dbMV0gPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpY2hhbi0+bG9jaywgZmxhZ3MpOworCisJCXRhc2tsZXRfZW5hYmxlKCZpcHUtPnRhc2tsZXQpOworCisJCWljaGFuLT5zdGF0dXMgPSBJUFVfQ0hBTk5FTF9JTklUSUFMSVpFRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjYzLDcgKzE2ODQsNiBAQAogCQlzdHJ1Y3QgaWRtYWNfY2hhbm5lbCAqaWNoYW4gPSBpcHUtPmNoYW5uZWwgKyBpOwogCiAJCWlkbWFjX2NvbnRyb2woJmljaGFuLT5kbWFfY2hhbiwgRE1BX1RFUk1JTkFURV9BTEwsIDApOwotCQlpZG1hY19wcmVwX3NsYXZlX3NnKCZpY2hhbi0+ZG1hX2NoYW4sIE5VTEwsIDAsIERNQV9OT05FLCAwKTsKIAl9CiAKIAlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJmlkbWFjLT5kbWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbXBjNTEyeF9kbWEuYyBiL2RyaXZlcnMvZG1hL21wYzUxMnhfZG1hLmMKaW5kZXggYjliYWU5NC4uOGJhNGVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbXBjNTEyeF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9tcGM1MTJ4X2RtYS5jCkBAIC03NDEsNyArNzQxLDYgQEAKIAkJbWNoYW4gPSAmbWRtYS0+Y2hhbm5lbHNbaV07CiAKIAkJbWNoYW4tPmNoYW4uZGV2aWNlID0gZG1hOwotCQltY2hhbi0+Y2hhbi5jaGFuX2lkID0gaTsKIAkJbWNoYW4tPmNoYW4uY29va2llID0gMTsKIAkJbWNoYW4tPmNvbXBsZXRlZF9jb29raWUgPSBtY2hhbi0+Y2hhbi5jb29raWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL214cy1kbWEuYyBiL2RyaXZlcnMvZG1hL214cy1kbWEuYwppbmRleCBiZTY0MWNiLi5iNDU4OGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9teHMtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvbXhzLWRtYS5jCkBAIC0xMzAsNiArMTMwLDIzIEBACiAJc3RydWN0IG14c19kbWFfY2hhbgkJbXhzX2NoYW5zW01YU19ETUFfQ0hBTk5FTFNdOwogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIG14c19kbWFfY2xrZ2F0ZShzdHJ1Y3QgbXhzX2RtYV9jaGFuICpteHNfY2hhbiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgbXhzX2RtYV9lbmdpbmUgKm14c19kbWEgPSBteHNfY2hhbi0+bXhzX2RtYTsKKwlpbnQgY2hhbl9pZCA9IG14c19jaGFuLT5jaGFuLmNoYW5faWQ7CisJaW50IHNldF9jbHIgPSBlbmFibGUgPyBNWFNfQ0xSX0FERFIgOiBNWFNfU0VUX0FERFI7CisKKwkvKiBlbmFibGUgYXBiaCBjaGFubmVsIGNsb2NrICovCisJaWYgKGRtYV9pc19hcGJoKCkpIHsKKwkJaWYgKGFwYmhfaXNfb2xkKCkpCisJCQl3cml0ZWwoMSA8PCAoY2hhbl9pZCArIEJQX0FQQkhfQ1RSTDBfQ0xLR0FURV9DSEFOTkVMKSwKKwkJCQlteHNfZG1hLT5iYXNlICsgSFdfQVBCSFhfQ1RSTDAgKyBzZXRfY2xyKTsKKwkJZWxzZQorCQkJd3JpdGVsKDEgPDwgY2hhbl9pZCwKKwkJCQlteHNfZG1hLT5iYXNlICsgSFdfQVBCSFhfQ1RSTDAgKyBzZXRfY2xyKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIG14c19kbWFfcmVzZXRfY2hhbihzdHJ1Y3QgbXhzX2RtYV9jaGFuICpteHNfY2hhbikKIHsKIAlzdHJ1Y3QgbXhzX2RtYV9lbmdpbmUgKm14c19kbWEgPSBteHNfY2hhbi0+bXhzX2RtYTsKQEAgLTE0OCwzOCArMTY1LDIxIEBACiAJc3RydWN0IG14c19kbWFfZW5naW5lICpteHNfZG1hID0gbXhzX2NoYW4tPm14c19kbWE7CiAJaW50IGNoYW5faWQgPSBteHNfY2hhbi0+Y2hhbi5jaGFuX2lkOwogCisJLyogY2xrZ2F0ZSBuZWVkcyB0byBiZSBlbmFibGVkIGJlZm9yZSB3cml0aW5nIG90aGVyIHJlZ2lzdGVycyAqLworCW14c19kbWFfY2xrZ2F0ZShteHNfY2hhbiwgMSk7CisKIAkvKiBzZXQgY21kX2FkZHIgdXAgKi8KIAl3cml0ZWwobXhzX2NoYW4tPmNjd19waHlzLAogCQlteHNfZG1hLT5iYXNlICsgSFdfQVBCSFhfQ0huX05YVENNREFSKGNoYW5faWQpKTsKIAotCS8qIGVuYWJsZSBhcGJoIGNoYW5uZWwgY2xvY2sgKi8KLQlpZiAoZG1hX2lzX2FwYmgoKSkgewotCQlpZiAoYXBiaF9pc19vbGQoKSkKLQkJCXdyaXRlbCgxIDw8IChjaGFuX2lkICsgQlBfQVBCSF9DVFJMMF9DTEtHQVRFX0NIQU5ORUwpLAotCQkJCW14c19kbWEtPmJhc2UgKyBIV19BUEJIWF9DVFJMMCArIE1YU19DTFJfQUREUik7Ci0JCWVsc2UKLQkJCXdyaXRlbCgxIDw8IGNoYW5faWQsCi0JCQkJbXhzX2RtYS0+YmFzZSArIEhXX0FQQkhYX0NUUkwwICsgTVhTX0NMUl9BRERSKTsKLQl9Ci0KIAkvKiB3cml0ZSAxIHRvIFNFTUEgdG8ga2ljayBvZmYgdGhlIGNoYW5uZWwgKi8KIAl3cml0ZWwoMSwgbXhzX2RtYS0+YmFzZSArIEhXX0FQQkhYX0NIbl9TRU1BKGNoYW5faWQpKTsKIH0KIAogc3RhdGljIHZvaWQgbXhzX2RtYV9kaXNhYmxlX2NoYW4oc3RydWN0IG14c19kbWFfY2hhbiAqbXhzX2NoYW4pCiB7Ci0Jc3RydWN0IG14c19kbWFfZW5naW5lICpteHNfZG1hID0gbXhzX2NoYW4tPm14c19kbWE7Ci0JaW50IGNoYW5faWQgPSBteHNfY2hhbi0+Y2hhbi5jaGFuX2lkOwotCiAJLyogZGlzYWJsZSBhcGJoIGNoYW5uZWwgY2xvY2sgKi8KLQlpZiAoZG1hX2lzX2FwYmgoKSkgewotCQlpZiAoYXBiaF9pc19vbGQoKSkKLQkJCXdyaXRlbCgxIDw8IChjaGFuX2lkICsgQlBfQVBCSF9DVFJMMF9DTEtHQVRFX0NIQU5ORUwpLAotCQkJCW14c19kbWEtPmJhc2UgKyBIV19BUEJIWF9DVFJMMCArIE1YU19TRVRfQUREUik7Ci0JCWVsc2UKLQkJCXdyaXRlbCgxIDw8IGNoYW5faWQsCi0JCQkJbXhzX2RtYS0+YmFzZSArIEhXX0FQQkhYX0NUUkwwICsgTVhTX1NFVF9BRERSKTsKLQl9CisJbXhzX2RtYV9jbGtnYXRlKG14c19jaGFuLCAwKTsKIAogCW14c19jaGFuLT5zdGF0dXMgPSBETUFfU1VDQ0VTUzsKIH0KQEAgLTMzOCw3ICszMzgsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9jbGs7CiAKKwkvKiBjbGtnYXRlIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHJlc2V0IHRvIGZpbmlzaCAqLworCW14c19kbWFfY2xrZ2F0ZShteHNfY2hhbiwgMSk7CiAJbXhzX2RtYV9yZXNldF9jaGFuKG14c19jaGFuKTsKKwlteHNfZG1hX2Nsa2dhdGUobXhzX2NoYW4sIDApOwogCiAJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3JfaW5pdCgmbXhzX2NoYW4tPmRlc2MsIGNoYW4pOwogCW14c19jaGFuLT5kZXNjLnR4X3N1Ym1pdCA9IG14c19kbWFfdHhfc3VibWl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcGNoX2RtYS5jIGIvZHJpdmVycy9kbWEvcGNoX2RtYS5jCmluZGV4IDFhYzhkNGIuLmE2ZDBlM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3BjaF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9wY2hfZG1hLmMKQEAgLTYwLDcgKzYwLDcgQEAKICNkZWZpbmUgRE1BX0RFU0NfRk9MTE9XX1dJVEhPVVRfSVJRCTB4MgogI2RlZmluZSBETUFfREVTQ19GT0xMT1dfV0lUSF9JUlEJMHgzCiAKLSNkZWZpbmUgTUFYX0NIQU5fTlIJCQk4CisjZGVmaW5lIE1BWF9DSEFOX05SCQkJMTIKIAogI2RlZmluZSBETUFfTUFTS19DVEwwX01PREUJMHgzMzMzMzMzMwogI2RlZmluZSBETUFfTUFTS19DVEwyX01PREUJMHgwMDAwMzMzMwpAQCAtODcyLDggKzg3Miw3IEBACiAJaW50IGk7CiAKIAlucl9jaGFubmVscyA9IGlkLT5kcml2ZXJfZGF0YTsKLQlwZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2hfZG1hKSsKLQkJc2l6ZW9mKHN0cnVjdCBwY2hfZG1hX2NoYW4pICogbnJfY2hhbm5lbHMsIEdGUF9LRVJORUwpOworCXBkID0ga3phbGxvYyhzaXplb2YoKnBkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTkyNiw3ICs5MjUsNiBAQAogCX0KIAogCXBkLT5kbWEuZGV2ID0gJnBkZXYtPmRldjsKLQlwZC0+ZG1hLmNoYW5jbnQgPSBucl9jaGFubmVsczsKIAogCUlOSVRfTElTVF9IRUFEKCZwZC0+ZG1hLmNoYW5uZWxzKTsKIApAQCAtOTM1LDcgKzkzMyw2IEBACiAKIAkJcGRfY2hhbi0+Y2hhbi5kZXZpY2UgPSAmcGQtPmRtYTsKIAkJcGRfY2hhbi0+Y2hhbi5jb29raWUgPSAxOwotCQlwZF9jaGFuLT5jaGFuLmNoYW5faWQgPSBpOwogCiAJCXBkX2NoYW4tPm1lbWJhc2UgPSAmcmVncy0+ZGVzY1tpXTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcGwzMzAuYyBiL2RyaXZlcnMvZG1hL3BsMzMwLmMKaW5kZXggMDBlZWU1OS4uNTcxMDQxNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3BsMzMwLmMKKysrIGIvZHJpdmVycy9kbWEvcGwzMzAuYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9wbDMzMC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAjZGVmaW5lIE5SX0RFRkFVTFRfREVTQwkxNgogCkBAIC02OCw2ICs3MCwxNCBAQAogCSAqIE5VTEwgaWYgdGhlIGNoYW5uZWwgaXMgYXZhaWxhYmxlIHRvIGJlIGFjcXVpcmVkLgogCSAqLwogCXZvaWQgKnBsMzMwX2NoaWQ7CisKKwkvKiBGb3IgRC10by1NIGFuZCBNLXRvLUQgY2hhbm5lbHMgKi8KKwlpbnQgYnVyc3Rfc3o7IC8qIHRoZSBwZXJpcGhlcmFsIGZpZm8gd2lkdGggKi8KKwlpbnQgYnVyc3RfbGVuOyAvKiB0aGUgbnVtYmVyIG9mIGJ1cnN0ICovCisJZG1hX2FkZHJfdCBmaWZvX2FkZHI7CisKKwkvKiBmb3IgY3ljbGljIGNhcGFiaWxpdHkgKi8KKwlib29sIGN5Y2xpYzsKIH07CiAKIHN0cnVjdCBkbWFfcGwzMzBfZG1hYyB7CkBAIC04Myw2ICs5Myw4IEBACiAKIAkvKiBQZXJpcGhlcmFsIGNoYW5uZWxzIGNvbm5lY3RlZCB0byB0aGlzIERNQUMgKi8KIAlzdHJ1Y3QgZG1hX3BsMzMwX2NoYW4gKnBlcmlwaGVyYWxzOyAvKiBrZWVwIGF0IGVuZCAqLworCisJc3RydWN0IGNsayAqY2xrOwogfTsKIAogc3RydWN0IGRtYV9wbDMzMF9kZXNjIHsKQEAgLTE1Miw2ICsxNjQsMzEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZG1hYy0+cG9vbF9sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfY3ljbGljX2Rlc2NfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBkbWFfcGwzMzBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgZG1hX3BsMzMwX2NoYW4gKnBjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGxpc3RfZW1wdHkobGlzdCkpCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzYywgbGlzdCwgbm9kZSkgeworCQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2s7CisKKwkJLyogQ2hhbmdlIHN0YXR1cyB0byByZWxvYWQgaXQgKi8KKwkJZGVzYy0+c3RhdHVzID0gUFJFUDsKKwkJcGNoID0gZGVzYy0+cGNoYW47CisJCWNhbGxiYWNrID0gZGVzYy0+dHhkLmNhbGxiYWNrOworCQlpZiAoY2FsbGJhY2spCisJCQljYWxsYmFjayhkZXNjLT50eGQuY2FsbGJhY2tfcGFyYW0pOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2gtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZV90YWlsX2luaXQobGlzdCwgJnBjaC0+d29ya19saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2gtPmxvY2ssIGZsYWdzKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGZpbGxfcXVldWUoc3RydWN0IGRtYV9wbDMzMF9jaGFuICpwY2gpCiB7CiAJc3RydWN0IGRtYV9wbDMzMF9kZXNjICpkZXNjOwpAQCAtMjA1LDcgKzI0MiwxMCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNoLT5sb2NrLCBmbGFncyk7CiAKLQlmcmVlX2Rlc2NfbGlzdCgmbGlzdCk7CisJaWYgKHBjaC0+Y3ljbGljKQorCQloYW5kbGVfY3ljbGljX2Rlc2NfbGlzdCgmbGlzdCk7CisJZWxzZQorCQlmcmVlX2Rlc2NfbGlzdCgmbGlzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRtYV9wbDMzMF9ycWNiKHZvaWQgKnRva2VuLCBlbnVtIHBsMzMwX29wX2VyciBlcnIpCkBAIC0yMzYsNiArMjc2LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGNoLT5sb2NrLCBmbGFncyk7CiAKIAlwY2gtPmNvbXBsZXRlZCA9IGNoYW4tPmNvb2tpZSA9IDE7CisJcGNoLT5jeWNsaWMgPSBmYWxzZTsKIAogCXBjaC0+cGwzMzBfY2hpZCA9IHBsMzMwX3JlcXVlc3RfY2hhbm5lbCgmcGRtYWMtPnBpZik7CiAJaWYgKCFwY2gtPnBsMzMwX2NoaWQpIHsKQEAgLTI1MywyNSArMjk0LDUyIEBACiBzdGF0aWMgaW50IHBsMzMwX2NvbnRyb2woc3RydWN0IGRtYV9jaGFuICpjaGFuLCBlbnVtIGRtYV9jdHJsX2NtZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBkbWFfcGwzMzBfY2hhbiAqcGNoID0gdG9fcGNoYW4oY2hhbik7Ci0Jc3RydWN0IGRtYV9wbDMzMF9kZXNjICpkZXNjOworCXN0cnVjdCBkbWFfcGwzMzBfZGVzYyAqZGVzYywgKl9kdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfcGwzMzBfZG1hYyAqcGRtYWMgPSBwY2gtPmRtYWM7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKnNsYXZlX2NvbmZpZzsKKwlMSVNUX0hFQUQobGlzdCk7CiAKLQkvKiBPbmx5IHN1cHBvcnRzIERNQV9URVJNSU5BVEVfQUxMICovCi0JaWYgKGNtZCAhPSBETUFfVEVSTUlOQVRFX0FMTCkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRE1BX1RFUk1JTkFURV9BTEw6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwY2gtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBGTFVTSCB0aGUgUEwzMzAgQ2hhbm5lbCB0aHJlYWQgKi8KKwkJcGwzMzBfY2hhbl9jdHJsKHBjaC0+cGwzMzBfY2hpZCwgUEwzMzBfT1BfRkxVU0gpOworCisJCS8qIE1hcmsgYWxsIGRlc2MgZG9uZSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2R0LCAmcGNoLT53b3JrX2xpc3QgLCBub2RlKSB7CisJCQlkZXNjLT5zdGF0dXMgPSBET05FOworCQkJcGNoLT5jb21wbGV0ZWQgPSBkZXNjLT50eGQuY29va2llOworCQkJbGlzdF9tb3ZlX3RhaWwoJmRlc2MtPm5vZGUsICZsaXN0KTsKKwkJfQorCisJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbGlzdCwgJnBkbWFjLT5kZXNjX3Bvb2wpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2gtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQ09ORklHOgorCQlzbGF2ZV9jb25maWcgPSAoc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKilhcmc7CisKKwkJaWYgKHNsYXZlX2NvbmZpZy0+ZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKKwkJCWlmIChzbGF2ZV9jb25maWctPmRzdF9hZGRyKQorCQkJCXBjaC0+Zmlmb19hZGRyID0gc2xhdmVfY29uZmlnLT5kc3RfYWRkcjsKKwkJCWlmIChzbGF2ZV9jb25maWctPmRzdF9hZGRyX3dpZHRoKQorCQkJCXBjaC0+YnVyc3Rfc3ogPSBfX2ZmcyhzbGF2ZV9jb25maWctPmRzdF9hZGRyX3dpZHRoKTsKKwkJCWlmIChzbGF2ZV9jb25maWctPmRzdF9tYXhidXJzdCkKKwkJCQlwY2gtPmJ1cnN0X2xlbiA9IHNsYXZlX2NvbmZpZy0+ZHN0X21heGJ1cnN0OworCQl9IGVsc2UgaWYgKHNsYXZlX2NvbmZpZy0+ZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQkJaWYgKHNsYXZlX2NvbmZpZy0+c3JjX2FkZHIpCisJCQkJcGNoLT5maWZvX2FkZHIgPSBzbGF2ZV9jb25maWctPnNyY19hZGRyOworCQkJaWYgKHNsYXZlX2NvbmZpZy0+c3JjX2FkZHJfd2lkdGgpCisJCQkJcGNoLT5idXJzdF9zeiA9IF9fZmZzKHNsYXZlX2NvbmZpZy0+c3JjX2FkZHJfd2lkdGgpOworCQkJaWYgKHNsYXZlX2NvbmZpZy0+c3JjX21heGJ1cnN0KQorCQkJCXBjaC0+YnVyc3RfbGVuID0gc2xhdmVfY29uZmlnLT5zcmNfbWF4YnVyc3Q7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihwY2gtPmRtYWMtPnBpZi5kZXYsICJOb3Qgc3VwcG9ydGVkIGNvbW1hbmQuXG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwY2gtPmxvY2ssIGZsYWdzKTsKLQotCS8qIEZMVVNIIHRoZSBQTDMzMCBDaGFubmVsIHRocmVhZCAqLwotCXBsMzMwX2NoYW5fY3RybChwY2gtPnBsMzMwX2NoaWQsIFBMMzMwX09QX0ZMVVNIKTsKLQotCS8qIE1hcmsgYWxsIGRlc2MgZG9uZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzYywgJnBjaC0+d29ya19saXN0LCBub2RlKQotCQlkZXNjLT5zdGF0dXMgPSBET05FOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNoLT5sb2NrLCBmbGFncyk7Ci0KLQlwbDMzMF90YXNrbGV0KCh1bnNpZ25lZCBsb25nKSBwY2gpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjg4LDYgKzM1Niw5IEBACiAJcGwzMzBfcmVsZWFzZV9jaGFubmVsKHBjaC0+cGwzMzBfY2hpZCk7CiAJcGNoLT5wbDMzMF9jaGlkID0gTlVMTDsKIAorCWlmIChwY2gtPmN5Y2xpYykKKwkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZwY2gtPndvcmtfbGlzdCwgJnBjaC0+ZG1hYy0+ZGVzY19wb29sKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaC0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC00NTMsNyArNTI0LDcgQEAKIAogCWlmIChwZXJpKSB7CiAJCWRlc2MtPnJlcS5ycXR5cGUgPSBwZXJpLT5ycXR5cGU7Ci0JCWRlc2MtPnJlcS5wZXJpID0gcGVyaS0+cGVyaV9pZDsKKwkJZGVzYy0+cmVxLnBlcmkgPSBwY2gtPmNoYW4uY2hhbl9pZDsKIAl9IGVsc2UgewogCQlkZXNjLT5yZXEucnF0eXBlID0gTUVNVE9NRU07CiAJCWRlc2MtPnJlcS5wZXJpID0gMDsKQEAgLTUyNCw2ICs1OTUsNTEgQEAKIAlyZXR1cm4gYnVyc3RfbGVuOwogfQogCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpwbDMzMF9wcmVwX2RtYV9jeWNsaWMoCisJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IGxlbiwKKwkJc2l6ZV90IHBlcmlvZF9sZW4sIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgZG1hX3BsMzMwX2Rlc2MgKmRlc2M7CisJc3RydWN0IGRtYV9wbDMzMF9jaGFuICpwY2ggPSB0b19wY2hhbihjaGFuKTsKKwlkbWFfYWRkcl90IGRzdDsKKwlkbWFfYWRkcl90IHNyYzsKKworCWRlc2MgPSBwbDMzMF9nZXRfZGVzYyhwY2gpOworCWlmICghZGVzYykgeworCQlkZXZfZXJyKHBjaC0+ZG1hYy0+cGlmLmRldiwgIiVzOiVkIFVuYWJsZSB0byBmZXRjaCBkZXNjXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3dpdGNoIChkaXJlY3Rpb24pIHsKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJCWRlc2MtPnJxY2ZnLnNyY19pbmMgPSAxOworCQlkZXNjLT5ycWNmZy5kc3RfaW5jID0gMDsKKwkJc3JjID0gZG1hX2FkZHI7CisJCWRzdCA9IHBjaC0+Zmlmb19hZGRyOworCQlicmVhazsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJZGVzYy0+cnFjZmcuc3JjX2luYyA9IDA7CisJCWRlc2MtPnJxY2ZnLmRzdF9pbmMgPSAxOworCQlzcmMgPSBwY2gtPmZpZm9fYWRkcjsKKwkJZHN0ID0gZG1hX2FkZHI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIocGNoLT5kbWFjLT5waWYuZGV2LCAiJXM6JWQgSW52YWxpZCBkbWEgZGlyZWN0aW9uXG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkZXNjLT5ycWNmZy5icnN0X3NpemUgPSBwY2gtPmJ1cnN0X3N6OworCWRlc2MtPnJxY2ZnLmJyc3RfbGVuID0gMTsKKworCXBjaC0+Y3ljbGljID0gdHJ1ZTsKKworCWZpbGxfcHgoJmRlc2MtPnB4LCBkc3QsIHNyYywgcGVyaW9kX2xlbik7CisKKwlyZXR1cm4gJmRlc2MtPnR4ZDsKK30KKwogc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCiBwbDMzMF9wcmVwX2RtYV9tZW1jcHkoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90IGRzdCwKIAkJZG1hX2FkZHJfdCBzcmMsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCkBAIC01NzksNyArNjk1LDcgQEAKIAlzdHJ1Y3QgZG1hX3BsMzMwX3BlcmkgKnBlcmkgPSBjaGFuLT5wcml2YXRlOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaSwgYnVyc3Rfc2l6ZTsKKwlpbnQgaTsKIAlkbWFfYWRkcl90IGFkZHI7CiAKIAlpZiAodW5saWtlbHkoIXBjaCB8fCAhc2dsIHx8ICFzZ19sZW4gfHwgIXBlcmkpKQpAQCAtNTk1LDggKzcxMSw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWFkZHIgPSBwZXJpLT5maWZvX2FkZHI7Ci0JYnVyc3Rfc2l6ZSA9IHBlcmktPmJ1cnN0X3N6OworCWFkZHIgPSBwY2gtPmZpZm9fYWRkcjsKIAogCWZpcnN0ID0gTlVMTDsKIApAQCAtNjQ0LDcgKzc1OSw3IEBACiAJCQkJc2dfZG1hX2FkZHJlc3Moc2cpLCBhZGRyLCBzZ19kbWFfbGVuKHNnKSk7CiAJCX0KIAotCQlkZXNjLT5ycWNmZy5icnN0X3NpemUgPSBidXJzdF9zaXplOworCQlkZXNjLT5ycWNmZy5icnN0X3NpemUgPSBwY2gtPmJ1cnN0X3N6OwogCQlkZXNjLT5ycWNmZy5icnN0X2xlbiA9IDE7CiAJfQogCkBAIC02OTYsNiArODExLDMwIEBACiAJCWdvdG8gcHJvYmVfZXJyMTsKIAl9CiAKKwlwZG1hYy0+Y2xrID0gY2xrX2dldCgmYWRldi0+ZGV2LCAiZG1hIik7CisJaWYgKElTX0VSUihwZG1hYy0+Y2xrKSkgeworCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJDYW5ub3QgZ2V0IG9wZXJhdGlvbiBjbG9jay5cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHByb2JlX2VycjE7CisJfQorCisJYW1iYV9zZXRfZHJ2ZGF0YShhZGV2LCBwZG1hYyk7CisKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorCS8qIHRvIHVzZSB0aGUgcnVudGltZSBQTSBoZWxwZXIgZnVuY3Rpb25zICovCisJcG1fcnVudGltZV9lbmFibGUoJmFkZXYtPmRldik7CisKKwkvKiBlbmFibGUgdGhlIHBvd2VyIGRvbWFpbiAqLworCWlmIChwbV9ydW50aW1lX2dldF9zeW5jKCZhZGV2LT5kZXYpKSB7CisJCWRldl9lcnIoJmFkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgcnVudGltZSBwbVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcHJvYmVfZXJyMTsKKwl9CisjZWxzZQorCS8qIGVuYWJsZSBkbWEgY2xrICovCisJY2xrX2VuYWJsZShwZG1hYy0+Y2xrKTsKKyNlbmRpZgorCiAJaXJxID0gYWRldi0+aXJxWzBdOwogCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcGwzMzBfaXJxX2hhbmRsZXIsIDAsCiAJCQlkZXZfbmFtZSgmYWRldi0+ZGV2KSwgcGkpOwpAQCAtNzMyLDYgKzg3MSw3IEBACiAJCQljYXNlIE1FTVRPREVWOgogCQkJY2FzZSBERVZUT01FTToKIAkJCQlkbWFfY2FwX3NldChETUFfU0xBVkUsIHBkLT5jYXBfbWFzayk7CisJCQkJZG1hX2NhcF9zZXQoRE1BX0NZQ0xJQywgcGQtPmNhcF9tYXNrKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJZGV2X2VycigmYWRldi0+ZGV2LCAiREVWVE9ERVYgTm90IFN1cHBvcnRlZFxuIik7CkBAIC03NDcsMTEgKzg4Nyw5IEBACiAJCXNwaW5fbG9ja19pbml0KCZwY2gtPmxvY2spOwogCQlwY2gtPnBsMzMwX2NoaWQgPSBOVUxMOwogCQlwY2gtPmNoYW4uZGV2aWNlID0gcGQ7Ci0JCXBjaC0+Y2hhbi5jaGFuX2lkID0gaTsKIAkJcGNoLT5kbWFjID0gcGRtYWM7CiAKIAkJLyogQWRkIHRoZSBjaGFubmVsIHRvIHRoZSBETUFDIGxpc3QgKi8KLQkJcGQtPmNoYW5jbnQrKzsKIAkJbGlzdF9hZGRfdGFpbCgmcGNoLT5jaGFuLmRldmljZV9ub2RlLCAmcGQtPmNoYW5uZWxzKTsKIAl9CiAKQEAgLTc2MCw2ICs4OTgsNyBAQAogCXBkLT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPSBwbDMzMF9hbGxvY19jaGFuX3Jlc291cmNlczsKIAlwZC0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMgPSBwbDMzMF9mcmVlX2NoYW5fcmVzb3VyY2VzOwogCXBkLT5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5ID0gcGwzMzBfcHJlcF9kbWFfbWVtY3B5OworCXBkLT5kZXZpY2VfcHJlcF9kbWFfY3ljbGljID0gcGwzMzBfcHJlcF9kbWFfY3ljbGljOwogCXBkLT5kZXZpY2VfdHhfc3RhdHVzID0gcGwzMzBfdHhfc3RhdHVzOwogCXBkLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyA9IHBsMzMwX3ByZXBfc2xhdmVfc2c7CiAJcGQtPmRldmljZV9jb250cm9sID0gcGwzMzBfY29udHJvbDsKQEAgLTc3MSw4ICs5MTAsNiBAQAogCQlnb3RvIHByb2JlX2VycjQ7CiAJfQogCi0JYW1iYV9zZXRfZHJ2ZGF0YShhZGV2LCBwZG1hYyk7Ci0KIAlkZXZfaW5mbygmYWRldi0+ZGV2LAogCQkiTG9hZGVkIGRyaXZlciBmb3IgUEwzMzAgRE1BQy0lZFxuIiwgYWRldi0+cGVyaXBoaWQpOwogCWRldl9pbmZvKCZhZGV2LT5kZXYsCkBAIC04MzMsNiArOTcwLDEzIEBACiAJcmVzID0gJmFkZXYtPnJlczsKIAlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKCZhZGV2LT5kZXYpOworI2Vsc2UKKwljbGtfZGlzYWJsZShwZG1hYy0+Y2xrKTsKKyNlbmRpZgorCiAJa2ZyZWUocGRtYWMpOwogCiAJcmV0dXJuIDA7CkBAIC04NDYsMTAgKzk5MCw0OSBAQAogCXsgMCwgMCB9LAogfTsKIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitzdGF0aWMgaW50IHBsMzMwX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRtYV9wbDMzMF9kbWFjICpwZG1hYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFwZG1hYykgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgZG1hY1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNsa19kaXNhYmxlKHBkbWFjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGwzMzBfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFfcGwzMzBfZG1hYyAqcGRtYWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghcGRtYWMpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGRtYWNcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljbGtfZW5hYmxlKHBkbWFjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBwbDMzMF9ydW50aW1lX3N1c3BlbmQJTlVMTAorI2RlZmluZSBwbDMzMF9ydW50aW1lX3Jlc3VtZQlOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHBsMzMwX3BtX29wcyA9IHsKKwkucnVudGltZV9zdXNwZW5kID0gcGwzMzBfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IHBsMzMwX3J1bnRpbWVfcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBhbWJhX2RyaXZlciBwbDMzMF9kcml2ZXIgPSB7CiAJLmRydiA9IHsKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5uYW1lID0gImRtYS1wbDMzMCIsCisJCS5wbSA9ICZwbDMzMF9wbV9vcHMsCiAJfSwKIAkuaWRfdGFibGUgPSBwbDMzMF9pZHMsCiAJLnByb2JlID0gcGwzMzBfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaGRtYS5jIGIvZHJpdmVycy9kbWEvc2hkbWEuYwppbmRleCA3ZjQ5MjM1Li44MTgwOWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zaGRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3NoZG1hLmMKQEAgLTI1OSwxNCArMjU5LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHNoX2NoYW5feGZlcl9sZF9xdWV1ZShzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuKTsKKwogc3RhdGljIGRtYV9jb29raWVfdCBzaF9kbWFlX3R4X3N1Ym1pdChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQogewogCXN0cnVjdCBzaF9kZXNjICpkZXNjID0gdHhfdG9fc2hfZGVzYyh0eCksICpjaHVuaywgKmxhc3QgPSBkZXNjLCAqYzsKIAlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuID0gdG9fc2hfY2hhbih0eC0+Y2hhbik7CisJc3RydWN0IHNoX2RtYWVfc2xhdmUgKnBhcmFtID0gdHgtPmNoYW4tPnByaXZhdGU7CiAJZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrID0gdHgtPmNhbGxiYWNrOwogCWRtYV9jb29raWVfdCBjb29raWU7CisJYm9vbCBwb3dlcl91cDsKIAotCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnNoX2NoYW4tPmxkX3F1ZXVlKSkKKwkJcG93ZXJfdXAgPSB0cnVlOworCWVsc2UKKwkJcG93ZXJfdXAgPSBmYWxzZTsKIAogCWNvb2tpZSA9IHNoX2NoYW4tPmNvbW1vbi5jb29raWU7CiAJY29va2llKys7CkBAIC0zMDIsNyArMzExLDM4IEBACiAJCXR4LT5jb29raWUsICZsYXN0LT5hc3luY190eCwgc2hfY2hhbi0+aWQsCiAJCWRlc2MtPmh3LnNhciwgZGVzYy0+aHcudGNyLCBkZXNjLT5ody5kYXIpOwogCi0Jc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJaWYgKHBvd2VyX3VwKSB7CisJCXNoX2NoYW4tPnBtX3N0YXRlID0gRE1BRV9QTV9CVVNZOworCisJCXBtX3J1bnRpbWVfZ2V0KHNoX2NoYW4tPmRldik7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCisJCXBtX3J1bnRpbWVfYmFycmllcihzaF9jaGFuLT5kZXYpOworCisJCXNwaW5fbG9ja19pcnEoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisKKwkJLyogSGF2ZSB3ZSBiZWVuIHJlc2V0LCB3aGlsZSB3YWl0aW5nPyAqLworCQlpZiAoc2hfY2hhbi0+cG1fc3RhdGUgIT0gRE1BRV9QTV9FU1RBQkxJU0hFRCkgeworCQkJZGV2X2RiZyhzaF9jaGFuLT5kZXYsICJCcmluZyB1cCBjaGFubmVsICVkXG4iLAorCQkJCXNoX2NoYW4tPmlkKTsKKwkJCWlmIChwYXJhbSkgeworCQkJCWNvbnN0IHN0cnVjdCBzaF9kbWFlX3NsYXZlX2NvbmZpZyAqY2ZnID0KKwkJCQkJcGFyYW0tPmNvbmZpZzsKKworCQkJCWRtYWVfc2V0X2RtYXJzKHNoX2NoYW4sIGNmZy0+bWlkX3JpZCk7CisJCQkJZG1hZV9zZXRfY2hjcihzaF9jaGFuLCBjZmctPmNoY3IpOworCQkJfSBlbHNlIHsKKwkJCQlkbWFlX2luaXQoc2hfY2hhbik7CisJCQl9CisKKwkJCWlmIChzaF9jaGFuLT5wbV9zdGF0ZSA9PSBETUFFX1BNX1BFTkRJTkcpCisJCQkJc2hfY2hhbl94ZmVyX2xkX3F1ZXVlKHNoX2NoYW4pOworCQkJc2hfY2hhbi0+cG1fc3RhdGUgPSBETUFFX1BNX0VTVEFCTElTSEVEOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogCiAJcmV0dXJuIGNvb2tpZTsKIH0KQEAgLTM0Niw4ICszODYsNiBAQAogCXN0cnVjdCBzaF9kbWFlX3NsYXZlICpwYXJhbSA9IGNoYW4tPnByaXZhdGU7CiAJaW50IHJldDsKIAotCXBtX3J1bnRpbWVfZ2V0X3N5bmMoc2hfY2hhbi0+ZGV2KTsKLQogCS8qCiAJICogVGhpcyByZWxpZXMgb24gdGhlIGd1YXJhbnRlZSBmcm9tIGRtYWVuZ2luZSB0aGF0IGFsbG9jX2NoYW5fcmVzb3VyY2VzCiAJICogbmV2ZXIgcnVucyBjb25jdXJyZW50bHkgd2l0aCBpdHNlbGYgb3IgZnJlZV9jaGFuX3Jlc291cmNlcy4KQEAgLTM2NywzMSArNDA1LDIwIEBACiAJCX0KIAogCQlwYXJhbS0+Y29uZmlnID0gY2ZnOwotCi0JCWRtYWVfc2V0X2RtYXJzKHNoX2NoYW4sIGNmZy0+bWlkX3JpZCk7Ci0JCWRtYWVfc2V0X2NoY3Ioc2hfY2hhbiwgY2ZnLT5jaGNyKTsKLQl9IGVsc2UgewotCQlkbWFlX2luaXQoc2hfY2hhbik7CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogCXdoaWxlIChzaF9jaGFuLT5kZXNjc19hbGxvY2F0ZWQgPCBOUl9ERVNDU19QRVJfQ0hBTk5FTCkgewotCQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIAkJZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaF9kZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZGVzYykgewotCQkJc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCQlpZiAoIWRlc2MpCiAJCQlicmVhazsKLQkJfQogCQlkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KCZkZXNjLT5hc3luY190eCwKIAkJCQkJJnNoX2NoYW4tPmNvbW1vbik7CiAJCWRlc2MtPmFzeW5jX3R4LnR4X3N1Ym1pdCA9IHNoX2RtYWVfdHhfc3VibWl0OwogCQlkZXNjLT5tYXJrID0gREVTQ19JRExFOwogCi0JCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIAkJbGlzdF9hZGQoJmRlc2MtPm5vZGUsICZzaF9jaGFuLT5sZF9mcmVlKTsKIAkJc2hfY2hhbi0+ZGVzY3NfYWxsb2NhdGVkKys7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogCiAJaWYgKCFzaF9jaGFuLT5kZXNjc19hbGxvY2F0ZWQpIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTQwNSw3ICs0MzIsNyBAQAogCQljbGVhcl9iaXQocGFyYW0tPnNsYXZlX2lkLCBzaF9kbWFlX3NsYXZlX3VzZWQpOwogZXRlc3R1c2VkOgogZWZpbmRzbGF2ZToKLQlwbV9ydW50aW1lX3B1dChzaF9jaGFuLT5kZXYpOworCWNoYW4tPnByaXZhdGUgPSBOVUxMOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQxNyw3ICs0NDQsNiBAQAogCXN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4gPSB0b19zaF9jaGFuKGNoYW4pOwogCXN0cnVjdCBzaF9kZXNjICpkZXNjLCAqX2Rlc2M7CiAJTElTVF9IRUFEKGxpc3QpOwotCWludCBkZXNjcyA9IHNoX2NoYW4tPmRlc2NzX2FsbG9jYXRlZDsKIAogCS8qIFByb3RlY3QgYWdhaW5zdCBJU1IgKi8KIAlzcGluX2xvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOwpAQCAtNDM3LDE1ICs0NjMsMTIgQEAKIAkJY2hhbi0+cHJpdmF0ZSA9IE5VTEw7CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCXNwaW5fbG9ja19pcnEoJnNoX2NoYW4tPmRlc2NfbG9jayk7CiAKIAlsaXN0X3NwbGljZV9pbml0KCZzaF9jaGFuLT5sZF9mcmVlLCAmbGlzdCk7CiAJc2hfY2hhbi0+ZGVzY3NfYWxsb2NhdGVkID0gMDsKIAotCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOwotCi0JaWYgKGRlc2NzID4gMCkKLQkJcG1fcnVudGltZV9wdXQoc2hfY2hhbi0+ZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJnNoX2NoYW4tPmRlc2NfbG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZsaXN0LCBub2RlKQogCQlrZnJlZShkZXNjKTsKQEAgLTUzNCw2ICs1NTcsNyBAQAogCXN0cnVjdCBzaF9kZXNjICpmaXJzdCA9IE5VTEwsICpuZXcgPSBOVUxMIC8qIGNvbXBpbGVyLi4uICovOwogCUxJU1RfSEVBRCh0eF9saXN0KTsKIAlpbnQgY2h1bmtzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKIAlpbnQgaTsKIAogCWlmICghc2dfbGVuKQpAQCAtNTQ0LDcgKzU2OCw3IEBACiAJCQkoU0hfRE1BX1RDUl9NQVggKyAxKTsKIAogCS8qIEhhdmUgdG8gbG9jayB0aGUgd2hvbGUgbG9vcCB0byBwcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCByZWxlYXNlICovCi0Jc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZzaF9jaGFuLT5kZXNjX2xvY2ssIGlycV9mbGFncyk7CiAKIAkvKgogCSAqIENoYWluaW5nOgpAQCAtNTkwLDcgKzYxNCw3IEBACiAJLyogUHV0IHRoZW0gYmFjayBvbiB0aGUgZnJlZSBsaXN0LCBzbywgdGhleSBkb24ndCBnZXQgbG9zdCAqLwogCWxpc3Rfc3BsaWNlX3RhaWwoJnR4X2xpc3QsICZzaF9jaGFuLT5sZF9mcmVlKTsKIAotCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNoX2NoYW4tPmRlc2NfbG9jaywgaXJxX2ZsYWdzKTsKIAogCXJldHVybiAmZmlyc3QtPmFzeW5jX3R4OwogCkBAIC01OTksNyArNjIzLDcgQEAKIAkJbmV3LT5tYXJrID0gREVTQ19JRExFOwogCWxpc3Rfc3BsaWNlKCZ0eF9saXN0LCAmc2hfY2hhbi0+bGRfZnJlZSk7CiAKLQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaF9jaGFuLT5kZXNjX2xvY2ssIGlycV9mbGFncyk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTY2MSw2ICs2ODUsNyBAQAogCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiA9IHRvX3NoX2NoYW4oY2hhbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIE9ubHkgc3VwcG9ydHMgRE1BX1RFUk1JTkFURV9BTEwgKi8KIAlpZiAoY21kICE9IERNQV9URVJNSU5BVEVfQUxMKQpAQCAtNjY5LDcgKzY5NCw3IEBACiAJaWYgKCFjaGFuKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2hfY2hhbi0+ZGVzY19sb2NrLCBmbGFncyk7CiAJZG1hZV9oYWx0KHNoX2NoYW4pOwogCiAJaWYgKCFsaXN0X2VtcHR5KCZzaF9jaGFuLT5sZF9xdWV1ZSkpIHsKQEAgLTY3OCw5ICs3MDMsOCBAQAogCQkJCQkJICBzdHJ1Y3Qgc2hfZGVzYywgbm9kZSk7CiAJCWRlc2MtPnBhcnRpYWwgPSAoZGVzYy0+aHcudGNyIC0gc2hfZG1hZV9yZWFkbChzaF9jaGFuLCBUQ1IpKSA8PAogCQkJc2hfY2hhbi0+eG1pdF9zaGlmdDsKLQogCX0KLQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaF9jaGFuLT5kZXNjX2xvY2ssIGZsYWdzKTsKIAogCXNoX2RtYWVfY2hhbl9sZF9jbGVhbnVwKHNoX2NoYW4sIHRydWUpOwogCkBAIC02OTUsOCArNzE5LDkgQEAKIAlkbWFfY29va2llX3QgY29va2llID0gMDsKIAlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2sgPSBOVUxMOwogCXZvaWQgKnBhcmFtID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZzaF9jaGFuLT5kZXNjX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZzaF9jaGFuLT5sZF9xdWV1ZSwgbm9kZSkgewogCQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ID0gJmRlc2MtPmFzeW5jX3R4OwogCkBAIC03NjIsNyArNzg3LDEzIEBACiAJCSAgICAgYXN5bmNfdHhfdGVzdF9hY2soJmRlc2MtPmFzeW5jX3R4KSkgfHwgYWxsKSB7CiAJCQkvKiBSZW1vdmUgZnJvbSBsZF9xdWV1ZSBsaXN0ICovCiAJCQlkZXNjLT5tYXJrID0gREVTQ19JRExFOworCiAJCQlsaXN0X21vdmUoJmRlc2MtPm5vZGUsICZzaF9jaGFuLT5sZF9mcmVlKTsKKworCQkJaWYgKGxpc3RfZW1wdHkoJnNoX2NoYW4tPmxkX3F1ZXVlKSkgeworCQkJCWRldl9kYmcoc2hfY2hhbi0+ZGV2LCAiQnJpbmcgZG93biBjaGFubmVsICVkXG4iLCBzaF9jaGFuLT5pZCk7CisJCQkJcG1fcnVudGltZV9wdXQoc2hfY2hhbi0+ZGV2KTsKKwkJCX0KIAkJfQogCX0KIApAQCAtNzczLDcgKzgwNCw3IEBACiAJCSAqLwogCQlzaF9jaGFuLT5jb21wbGV0ZWRfY29va2llID0gc2hfY2hhbi0+Y29tbW9uLmNvb2tpZTsKIAotCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNoX2NoYW4tPmRlc2NfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGNhbGxiYWNrKQogCQljYWxsYmFjayhwYXJhbSk7CkBAIC03OTIsMTQgKzgyMywxNCBAQAogCQk7CiB9CiAKKy8qIENhbGxlZCB1bmRlciBzcGluX2xvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spICovCiBzdGF0aWMgdm9pZCBzaF9jaGFuX3hmZXJfbGRfcXVldWUoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbikKIHsKIAlzdHJ1Y3Qgc2hfZGVzYyAqZGVzYzsKIAotCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIAkvKiBETUEgd29yayBjaGVjayAqLwogCWlmIChkbWFlX2lzX2J1c3koc2hfY2hhbikpCi0JCWdvdG8gc2hfY2hhbl94ZmVyX2xkX3F1ZXVlX2VuZDsKKwkJcmV0dXJuOwogCiAJLyogRmluZCB0aGUgZmlyc3Qgbm90IHRyYW5zZmVycmVkIGRlc2NyaXB0b3IgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc2MsICZzaF9jaGFuLT5sZF9xdWV1ZSwgbm9kZSkKQEAgLTgxMiwxNSArODQzLDE4IEBACiAJCQlkbWFlX3N0YXJ0KHNoX2NoYW4pOwogCQkJYnJlYWs7CiAJCX0KLQotc2hfY2hhbl94ZmVyX2xkX3F1ZXVlX2VuZDoKLQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgc2hfZG1hZV9tZW1jcHlfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCiB7CiAJc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiA9IHRvX3NoX2NoYW4oY2hhbik7Ci0Jc2hfY2hhbl94ZmVyX2xkX3F1ZXVlKHNoX2NoYW4pOworCisJc3Bpbl9sb2NrX2lycSgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlpZiAoc2hfY2hhbi0+cG1fc3RhdGUgPT0gRE1BRV9QTV9FU1RBQkxJU0hFRCkKKwkJc2hfY2hhbl94ZmVyX2xkX3F1ZXVlKHNoX2NoYW4pOworCWVsc2UKKwkJc2hfY2hhbi0+cG1fc3RhdGUgPSBETUFFX1BNX1BFTkRJTkc7CisJc3Bpbl91bmxvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogfQogCiBzdGF0aWMgZW51bSBkbWFfc3RhdHVzIHNoX2RtYWVfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKQEAgLTgzMSw2ICs4NjUsNyBAQAogCWRtYV9jb29raWVfdCBsYXN0X3VzZWQ7CiAJZG1hX2Nvb2tpZV90IGxhc3RfY29tcGxldGU7CiAJZW51bSBkbWFfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc2hfZG1hZV9jaGFuX2xkX2NsZWFudXAoc2hfY2hhbiwgZmFsc2UpOwogCkBAIC04NDEsNyArODc2LDcgQEAKIAlCVUdfT04obGFzdF9jb21wbGV0ZSA8IDApOwogCWRtYV9zZXRfdHhfc3RhdGUodHhzdGF0ZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkLCAwKTsKIAotCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2hfY2hhbi0+ZGVzY19sb2NrLCBmbGFncyk7CiAKIAlzdGF0dXMgPSBkbWFfYXN5bmNfaXNfY29tcGxldGUoY29va2llLCBsYXN0X2NvbXBsZXRlLCBsYXN0X3VzZWQpOwogCkBAIC04NTksNyArODk0LDcgQEAKIAkJCX0KIAl9CiAKLQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaF9jaGFuLT5kZXNjX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC05MTIsNiArOTQ3LDEyIEBACiAKIAkJbGlzdF9zcGxpY2VfaW5pdCgmc2hfY2hhbi0+bGRfcXVldWUsICZkbCk7CiAKKwkJaWYgKCFsaXN0X2VtcHR5KCZkbCkpIHsKKwkJCWRldl9kYmcoc2hfY2hhbi0+ZGV2LCAiQnJpbmcgZG93biBjaGFubmVsICVkXG4iLCBzaF9jaGFuLT5pZCk7CisJCQlwbV9ydW50aW1lX3B1dChzaF9jaGFuLT5kZXYpOworCQl9CisJCXNoX2NoYW4tPnBtX3N0YXRlID0gRE1BRV9QTV9FU1RBQkxJU0hFRDsKKwogCQlzcGluX3VubG9jaygmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIAogCQkvKiBDb21wbGV0ZSBhbGwgICovCkBAIC05NTIsNyArOTkzLDcgQEAKIAl1MzIgc2FyX2J1ZiA9IHNoX2RtYWVfcmVhZGwoc2hfY2hhbiwgU0FSKTsKIAl1MzIgZGFyX2J1ZiA9IHNoX2RtYWVfcmVhZGwoc2hfY2hhbiwgREFSKTsKIAotCXNwaW5fbG9jaygmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzYywgJnNoX2NoYW4tPmxkX3F1ZXVlLCBub2RlKSB7CiAJCWlmIChkZXNjLT5tYXJrID09IERFU0NfU1VCTUlUVEVEICYmCiAJCSAgICAoKGRlc2MtPmRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UgJiYKQEAgLTk2NSwxMCArMTAwNiwxMCBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJnNoX2NoYW4tPmRlc2NfbG9jayk7Ci0KIAkvKiBOZXh0IGRlc2MgKi8KIAlzaF9jaGFuX3hmZXJfbGRfcXVldWUoc2hfY2hhbik7CisJc3Bpbl91bmxvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCiAJc2hfZG1hZV9jaGFuX2xkX2NsZWFudXAoc2hfY2hhbiwgZmFsc2UpOwogfQogCkBAIC0xMDM2LDcgKzEwNzcsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkvKiBjb3B5IHN0cnVjdCBkbWFfZGV2aWNlICovCisJbmV3X3NoX2NoYW4tPnBtX3N0YXRlID0gRE1BRV9QTV9FU1RBQkxJU0hFRDsKKworCS8qIHJlZmVyZW5jZSBzdHJ1Y3QgZG1hX2RldmljZSAqLwogCW5ld19zaF9jaGFuLT5jb21tb24uZGV2aWNlID0gJnNoZGV2LT5jb21tb247CiAKIAluZXdfc2hfY2hhbi0+ZGV2ID0gc2hkZXYtPmNvbW1vbi5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaGRtYS5oIGIvZHJpdmVycy9kbWEvc2hkbWEuaAppbmRleCBkYzU2NTc2Li4yYjU1YTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zaGRtYS5oCisrKyBiL2RyaXZlcnMvZG1hL3NoZG1hLmgKQEAgLTIzLDYgKzIzLDEyIEBACiAKIHN0cnVjdCBkZXZpY2U7CiAKK2VudW0gZG1hZV9wbV9zdGF0ZSB7CisJRE1BRV9QTV9FU1RBQkxJU0hFRCwKKwlETUFFX1BNX0JVU1ksCisJRE1BRV9QTV9QRU5ESU5HLAorfTsKKwogc3RydWN0IHNoX2RtYWVfY2hhbiB7CiAJZG1hX2Nvb2tpZV90IGNvbXBsZXRlZF9jb29raWU7CS8qIFRoZSBtYXhpbXVtIGNvb2tpZSBjb21wbGV0ZWQgKi8KIAlzcGlubG9ja190IGRlc2NfbG9jazsJCS8qIERlc2NyaXB0b3Igb3BlcmF0aW9uIGxvY2sgKi8KQEAgLTM4LDYgKzQ0LDcgQEAKIAl1MzIgX19pb21lbSAqYmFzZTsKIAljaGFyIGRldl9pZFsxNl07CQkvKiB1bmlxdWUgbmFtZSBwZXIgRE1BQyBvZiBjaGFubmVsICovCiAJaW50IHBtX2Vycm9yOworCWVudW0gZG1hZV9wbV9zdGF0ZSBwbV9zdGF0ZTsKIH07CiAKIHN0cnVjdCBzaF9kbWFlX2RldmljZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYyBiL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jCmluZGV4IDQ2N2U0ZGMuLjEzMjU5Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jCisrKyBiL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvdGltYl9kbWEuYyBiL2RyaXZlcnMvZG1hL3RpbWJfZG1hLmMKaW5kZXggZjY5ZjkwYTYuLmE0YTM5OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3RpbWJfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvdGltYl9kbWEuYwpAQCAtNzUzLDcgKzc1Myw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmdGQtPmRtYS5jaGFubmVscyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5yX2NoYW5uZWxzOyBpKyssIHRkLT5kbWEuY2hhbmNudCsrKSB7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5ucl9jaGFubmVsczsgaSsrKSB7CiAJCXN0cnVjdCB0aW1iX2RtYV9jaGFuICp0ZF9jaGFuID0gJnRkLT5jaGFubmVsc1tpXTsKIAkJc3RydWN0IHRpbWJfZG1hX3BsYXRmb3JtX2RhdGFfY2hhbm5lbCAqcGNoYW4gPQogCQkJcGRhdGEtPmNoYW5uZWxzICsgaTsKQEAgLTc2MiwxMiArNzYyLDExIEBACiAJCWlmICgoaSAlIDIpID09IHBjaGFuLT5yeCkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiV3JvbmcgY2hhbm5lbCBjb25maWd1cmF0aW9uXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl90YXNrbGV0X2tpbGw7CisJCQlnb3RvIGVycl9mcmVlX2lycTsKIAkJfQogCiAJCXRkX2NoYW4tPmNoYW4uZGV2aWNlID0gJnRkLT5kbWE7CiAJCXRkX2NoYW4tPmNoYW4uY29va2llID0gMTsKLQkJdGRfY2hhbi0+Y2hhbi5jaGFuX2lkID0gaTsKIAkJc3Bpbl9sb2NrX2luaXQoJnRkX2NoYW4tPmxvY2spOwogCQlJTklUX0xJU1RfSEVBRCgmdGRfY2hhbi0+YWN0aXZlX2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmdGRfY2hhbi0+cXVldWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25maWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwppbmRleCBhZjFhMTdkLi41OTQ4YTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwpAQCAtNDEsNyArNDEsNyBAQAogCiBjb25maWcgRURBQ19ERUNPREVfTUNFCiAJdHJpc3RhdGUgIkRlY29kZSBNQ0VzIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0gKG9ubHkgb24gQU1EIGZvciBub3cpIgotCWRlcGVuZHMgb24gQ1BVX1NVUF9BTUQgJiYgWDg2X01DRQorCWRlcGVuZHMgb24gQ1BVX1NVUF9BTUQgJiYgWDg2X01DRV9BTUQKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gZGVjb2RlIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9ucwpAQCAtNzEsOSArNzEsNiBAQAogCSAgb2NjdXJyZWQgc28gdGhhdCBhIHBhcnRpY3VsYXIgZmFpbGluZyBtZW1vcnkgbW9kdWxlIGNhbiBiZQogCSAgcmVwbGFjZWQuICBJZiB1bnN1cmUsIHNlbGVjdCAnWScuCiAKLWNvbmZpZyBFREFDX01DRQotCWJvb2wKLQogY29uZmlnIEVEQUNfQU1ENjQKIAl0cmlzdGF0ZSAiQU1ENjQgKE9wdGVyb24sIEF0aGxvbjY0KSBLOCwgRjEwaCIKIAlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBBTURfTkIgJiYgWDg2XzY0ICYmIEVEQUNfREVDT0RFX01DRQpAQCAtMTczLDggKzE3MCw3IEBACiAKIGNvbmZpZyBFREFDX0k3Q09SRQogCXRyaXN0YXRlICJJbnRlbCBpNyBDb3JlIChOZWhhbGVtKSBwcm9jZXNzb3JzIgotCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIFBDSSAmJiBYODYKLQlzZWxlY3QgRURBQ19NQ0UKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kgJiYgWDg2ICYmIFg4Nl9NQ0VfSU5URUwKIAloZWxwCiAJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gdGhlIEludGVsCiAJICBpNyBDb3JlIChOZWhhbGVtKSBJbnRlZ3JhdGVkIE1lbW9yeSBDb250cm9sbGVyIHRoYXQgZXhpc3RzIG9uCkBAIC0yMTYsNiArMjEyLDE0IEBACiAJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gdGhlIEludGVsCiAJICBDbGFya3Nib3JvIE1DSCAoSW50ZWwgNzMwMCBjaGlwc2V0KS4KIAorY29uZmlnIEVEQUNfU0JSSURHRQorCXRyaXN0YXRlICJJbnRlbCBTYW5keS1CcmlkZ2UgSW50ZWdyYXRlZCBNQyIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kgJiYgWDg2XzY0ICYmIFg4Nl9NQ0VfSU5URUwKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiB0aGUgSW50ZWwKKwkgIFNhbmR5IEJyaWRnZSBJbnRlZ3JhdGVkIE1lbW9yeSBDb250cm9sbGVyLgorCiBjb25maWcgRURBQ19NUEM4NVhYCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBNUEM4M3h4IC8gTVBDODV4eCIKIAlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBGU0xfU09DICYmIChQUENfODN4eCB8fCBQUENfODV4eCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9NYWtlZmlsZSBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQppbmRleCAzZTIzOTEzLi4xOTZhNjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9lZGFjL01ha2VmaWxlCkBAIC04LDcgKzgsNiBAQAogCiBvYmotJChDT05GSUdfRURBQykJCQk6PSBlZGFjX3N0dWIubwogb2JqLSQoQ09ORklHX0VEQUNfTU1fRURBQykJCSs9IGVkYWNfY29yZS5vCi1vYmotJChDT05GSUdfRURBQ19NQ0UpCQkJKz0gZWRhY19tY2UubwogCiBlZGFjX2NvcmUteQk6PSBlZGFjX21jLm8gZWRhY19kZXZpY2UubyBlZGFjX21jX3N5c2ZzLm8gZWRhY19wY2lfc3lzZnMubwogZWRhY19jb3JlLXkJKz0gZWRhY19tb2R1bGUubyBlZGFjX2RldmljZV9zeXNmcy5vCkBAIC0yOSw2ICsyOCw3IEBACiBvYmotJChDT05GSUdfRURBQ19JNTQwMCkJCSs9IGk1NDAwX2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfSTczMDApCQkrPSBpNzMwMF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k3Q09SRSkJCSs9IGk3Y29yZV9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX1NCUklER0UpCQkrPSBzYl9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0U3WFhYKQkJKz0gZTd4eHhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19FNzUyWCkJCSs9IGU3NTJ4X2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfSTgyNDQzQlhHWCkJCSs9IGk4MjQ0M2J4Z3hfZWRhYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYwppbmRleCA5YThiZWJjLi5jOWVlZTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKQEAgLTExNCwxMCArMTE0LDIyIEBACiAJcmV0dXJuIF9fYW1kNjRfcmVhZF9wY2lfY2ZnX2R3b3JkKHB2dC0+RjIsIGFkZHIsIHZhbCwgZnVuYyk7CiB9CiAKKy8qCisgKiBTZWxlY3QgRENUIHRvIHdoaWNoIFBDSSBjZmcgYWNjZXNzZXMgYXJlIHJvdXRlZAorICovCitzdGF0aWMgdm9pZCBmMTVoX3NlbGVjdF9kY3Qoc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCB1OCBkY3QpCit7CisJdTMyIHJlZyA9IDA7CisKKwlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5GMSwgRENUX0NGR19TRUwsICZyZWcpOworCXJlZyAmPSAweGZmZmZmZmZlOworCXJlZyB8PSBkY3Q7CisJYW1kNjRfd3JpdGVfcGNpX2NmZyhwdnQtPkYxLCBEQ1RfQ0ZHX1NFTCwgcmVnKTsKK30KKwogc3RhdGljIGludCBmMTVfcmVhZF9kY3RfcGNpX2NmZyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsIGludCBhZGRyLCB1MzIgKnZhbCwKIAkJCQkgY29uc3QgY2hhciAqZnVuYykKIHsKLQl1MzIgcmVnID0gMDsKIAl1OCBkY3QgID0gMDsKIAogCWlmIChhZGRyID49IDB4MTQwICYmIGFkZHIgPD0gMHgxYTApIHsKQEAgLTEyNSwxMCArMTM3LDcgQEAKIAkJYWRkciAtPSAweDEwMDsKIAl9CiAKLQlhbWQ2NF9yZWFkX3BjaV9jZmcocHZ0LT5GMSwgRENUX0NGR19TRUwsICZyZWcpOwotCXJlZyAmPSAweGZmZmZmZmZlOwotCXJlZyB8PSBkY3Q7Ci0JYW1kNjRfd3JpdGVfcGNpX2NmZyhwdnQtPkYxLCBEQ1RfQ0ZHX1NFTCwgcmVnKTsKKwlmMTVoX3NlbGVjdF9kY3QocHZ0LCBkY3QpOwogCiAJcmV0dXJuIF9fYW1kNjRfcmVhZF9wY2lfY2ZnX2R3b3JkKHB2dC0+RjIsIGFkZHIsIHZhbCwgZnVuYyk7CiB9CkBAIC0xOTgsNiArMjA3LDEwIEBACiAJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4ZikKIAkJbWluX3NjcnVicmF0ZSA9IDB4MDsKIAorCS8qIEYxNWggRXJyYXR1bSAjNTA1ICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4MTUpCisJCWYxNWhfc2VsZWN0X2RjdChwdnQsIDApOworCiAJcmV0dXJuIF9fYW1kNjRfc2V0X3NjcnViX3JhdGUocHZ0LT5GMywgYncsIG1pbl9zY3J1YnJhdGUpOwogfQogCkBAIC0yMDcsNiArMjIwLDEwIEBACiAJdTMyIHNjcnVidmFsID0gMDsKIAlpbnQgaSwgcmV0dmFsID0gLUVJTlZBTDsKIAorCS8qIEYxNWggRXJyYXR1bSAjNTA1ICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4MTUpCisJCWYxNWhfc2VsZWN0X2RjdChwdnQsIDApOworCiAJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+RjMsIFNDUkNUUkwsICZzY3J1YnZhbCk7CiAKIAlzY3J1YnZhbCA9IHNjcnVidmFsICYgMHgwMDFGOwpAQCAtNzUxLDEwICs3NjgsMTAgQEAKICAqIERldGVybWluZSBpZiB0aGUgRElNTXMgaGF2ZSBFQ0MgZW5hYmxlZC4gRUNDIGlzIGVuYWJsZWQgT05MWSBpZiBhbGwgdGhlIERJTU1zCiAgKiBhcmUgRUNDIGNhcGFibGUuCiAgKi8KLXN0YXRpYyBlbnVtIGVkYWNfdHlwZSBhbWQ2NF9kZXRlcm1pbmVfZWRhY19jYXAoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYW1kNjRfZGV0ZXJtaW5lX2VkYWNfY2FwKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKIHsKIAl1OCBiaXQ7Ci0JZW51bSBkZXZfdHlwZSBlZGFjX2NhcCA9IEVEQUNfRkxBR19OT05FOworCXVuc2lnbmVkIGxvbmcgZWRhY19jYXAgPSBFREFDX0ZMQUdfTk9ORTsKIAogCWJpdCA9IChib290X2NwdV9kYXRhLng4NiA+IDB4ZiB8fCBwdnQtPmV4dF9tb2RlbCA+PSBLOF9SRVZfRikKIAkJPyAxOQpAQCAtMTk1MywxMSArMTk3MCw5IEBACiAJCWFtZDY0X2hhbmRsZV91ZShtY2ksIG0pOwogfQogCi12b2lkIGFtZDY0X2RlY29kZV9idXNfZXJyb3IoaW50IG5vZGVfaWQsIHN0cnVjdCBtY2UgKm0sIHUzMiBuYmNmZykKK3ZvaWQgYW1kNjRfZGVjb2RlX2J1c19lcnJvcihpbnQgbm9kZV9pZCwgc3RydWN0IG1jZSAqbSkKIHsKLQlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBtY2lzW25vZGVfaWRdOwotCi0JX19hbWQ2NF9kZWNvZGVfYnVzX2Vycm9yKG1jaSwgbSk7CisJX19hbWQ2NF9kZWNvZGVfYnVzX2Vycm9yKG1jaXNbbm9kZV9pZF0sIG0pOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2NwYzkyNV9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvY3BjOTI1X2VkYWMuYwppbmRleCBhNjg3YTBkLi5hNzc0YzBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvY3BjOTI1X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvY3BjOTI1X2VkYWMuYwpAQCAtOTAsNiArOTAsNyBAQAogCUVDQ19NQVNLX0VOQUJMRSA9IChBUElNQVNLX0VDQ19VRV9IIHwgQVBJTUFTS19FQ0NfQ0VfSCB8CiAJCQkgICBBUElNQVNLX0VDQ19VRV9MIHwgQVBJTUFTS19FQ0NfQ0VfTCksCiB9OworI2RlZmluZSBBUElNQVNLX0FESShuKQkJQ1BDOTI1X0JJVCgoKG4pKzEpKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglQcm9jZXNzb3IgSW50ZXJmYWNlIEV4Y2VwdGlvbiBSZWdpc3RlciAoQVBJRVhDUCkKQEAgLTU4MSwxNiArNTgyLDczIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKiBDUFUgZXJyIGRldmljZSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHUzMiBjcGM5MjVfY3B1X21hc2tfZGlzYWJsZWQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdXM7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHVub2RlID0gTlVMTDsKKwlzdGF0aWMgdTMyIG1hc2sgPSAwOworCisJLyogdXNlIGNhY2hlZCB2YWx1ZSBpZiBhdmFpbGFibGUgKi8KKwlpZiAobWFzayAhPSAwKQorCQlyZXR1cm4gbWFzazsKKworCW1hc2sgPSBBUElNQVNLX0FESTAgfCBBUElNQVNLX0FESTE7CisKKwljcHVzID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jcHVzIik7CisJaWYgKGNwdXMgPT0gTlVMTCkgeworCQljcGM5MjVfcHJpbnRrKEtFUk5fREVCVUcsICJObyAvY3B1cyBub2RlICFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoKGNwdW5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChjcHVzLCBjcHVub2RlKSkgIT0gTlVMTCkgeworCQljb25zdCB1MzIgKnJlZyA9IG9mX2dldF9wcm9wZXJ0eShjcHVub2RlLCAicmVnIiwgTlVMTCk7CisKKwkJaWYgKHN0cmNtcChjcHVub2RlLT50eXBlLCAiY3B1IikpIHsKKwkJCWNwYzkyNV9wcmludGsoS0VSTl9FUlIsICJOb3QgYSBjcHUgbm9kZSBpbiAvY3B1czogJXNcbiIsIGNwdW5vZGUtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmVnID09IE5VTEwgfHwgKnJlZyA+IDIpIHsKKwkJCWNwYzkyNV9wcmludGsoS0VSTl9FUlIsICJCYWQgcmVnIHZhbHVlIGF0ICVzXG4iLCBjcHVub2RlLT5mdWxsX25hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQltYXNrICY9IH5BUElNQVNLX0FESSgqcmVnKTsKKwl9CisKKwlpZiAobWFzayAhPSAoQVBJTUFTS19BREkwIHwgQVBJTUFTS19BREkxKSkgeworCQkvKiBXZSBhc3N1bWUgdGhhdCBlYWNoIENQVSBzaXRzIG9uIGl0J3Mgb3duIFBJIGFuZCB0aGF0CisJCSAqIGZvciBwcmVzZW50IENQVXMgdGhlIHJlZyBwcm9wZXJ0eSBlcXVhbHMgdG8gdGhlIFBJCisJCSAqIGludGVyZmFjZSBpZCAqLworCQljcGM5MjVfcHJpbnRrKEtFUk5fV0FSTklORywKKwkJCQkiQXNzdW1pbmcgUEkgaWQgaXMgZXF1YWwgdG8gQ1BVIE1QSUMgaWQhXG4iKTsKKwl9CisKKwlvZl9ub2RlX3B1dChjcHVub2RlKTsKKwlvZl9ub2RlX3B1dChjcHVzKTsKKworCXJldHVybiBtYXNrOworfQorCiAvKiBFbmFibGUgQ1BVIEVycm9ycyBkZXRlY3Rpb24gKi8KIHN0YXRpYyB2b2lkIGNwYzkyNV9jcHVfaW5pdChzdHJ1Y3QgY3BjOTI1X2Rldl9pbmZvICpkZXZfaW5mbykKIHsKIAl1MzIgYXBpbWFzazsKKwl1MzIgY3B1bWFzazsKIAogCWFwaW1hc2sgPSBfX3Jhd19yZWFkbChkZXZfaW5mby0+dmJhc2UgKyBSRUdfQVBJTUFTS19PRkZTRVQpOwotCWlmICgoYXBpbWFzayAmIENQVV9NQVNLX0VOQUJMRSkgPT0gMCkgewotCQlhcGltYXNrIHw9IENQVV9NQVNLX0VOQUJMRTsKLQkJX19yYXdfd3JpdGVsKGFwaW1hc2ssIGRldl9pbmZvLT52YmFzZSArIFJFR19BUElNQVNLX09GRlNFVCk7CisKKwljcHVtYXNrID0gY3BjOTI1X2NwdV9tYXNrX2Rpc2FibGVkKCk7CisJaWYgKGFwaW1hc2sgJiBjcHVtYXNrKSB7CisJCWNwYzkyNV9wcmludGsoS0VSTl9XQVJOSU5HLCAiQ1BVKHMpIG5vdCBwcmVzZW50LCAiCisJCQkJImJ1dCBlbmFibGVkIGluIEFQSU1BU0ssIGRpc2FibGluZ1xuIik7CisJCWFwaW1hc2sgJj0gfmNwdW1hc2s7CiAJfQorCisJaWYgKChhcGltYXNrICYgQ1BVX01BU0tfRU5BQkxFKSA9PSAwKQorCQlhcGltYXNrIHw9IENQVV9NQVNLX0VOQUJMRTsKKworCV9fcmF3X3dyaXRlbChhcGltYXNrLCBkZXZfaW5mby0+dmJhc2UgKyBSRUdfQVBJTUFTS19PRkZTRVQpOwogfQogCiAvKiBEaXNhYmxlIENQVSBFcnJvcnMgZGV0ZWN0aW9uICovCkBAIC02MjIsNiArNjgwLDkgQEAKIAlpZiAoKGFwaWV4Y3AgJiBDUFVfRVhDUF9ERVRFQ1RFRCkgPT0gMCkKIAkJcmV0dXJuOwogCisJaWYgKChhcGlleGNwICYgfmNwYzkyNV9jcHVfbWFza19kaXNhYmxlZCgpKSA9PSAwKQorCQlyZXR1cm47CisKIAlhcGltYXNrID0gX19yYXdfcmVhZGwoZGV2X2luZm8tPnZiYXNlICsgUkVHX0FQSU1BU0tfT0ZGU0VUKTsKIAljcGM5MjVfcHJpbnRrKEtFUk5fSU5GTywgIlByb2Nlc3NvciBJbnRlcmZhY2UgRmF1bHRcbiIKIAkJCQkgIlByb2Nlc3NvciBJbnRlcmZhY2UgcmVnaXN0ZXIgZHVtcDpcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oIGIvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oCmluZGV4IDU1YjgyNzguLmZlOTBjZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaAorKysgYi9kcml2ZXJzL2VkYWMvZWRhY19jb3JlLmgKQEAgLTM0LDExICszNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VkYWMuaD4KIAotI2RlZmluZSBFREFDX01DX0xBQkVMX0xFTgkzMQogI2RlZmluZSBFREFDX0RFVklDRV9OQU1FX0xFTgkzMQogI2RlZmluZSBFREFDX0FUVFJJQl9WQUxVRV9MRU4JMTUKLSNkZWZpbmUgTUNfUFJPQ19OQU1FX01BWF9MRU4JNwogCiAjaWYgUEFHRV9TSElGVCA8IDIwCiAjZGVmaW5lIFBBR0VTX1RPX01pQihwYWdlcykJKChwYWdlcykgPj4gKDIwIC0gUEFHRV9TSElGVCkpCkBAIC0xMDEsMzUzICsxMDAsNiBAQAogCiAjZGVmaW5lIGVkYWNfZGV2X25hbWUoZGV2KSAoZGV2KS0+ZGV2X25hbWUKIAotLyogbWVtb3J5IGRldmljZXMgKi8KLWVudW0gZGV2X3R5cGUgewotCURFVl9VTktOT1dOID0gMCwKLQlERVZfWDEsCi0JREVWX1gyLAotCURFVl9YNCwKLQlERVZfWDgsCi0JREVWX1gxNiwKLQlERVZfWDMyLAkJLyogRG8gdGhlc2UgcGFydHMgZXhpc3Q/ICovCi0JREVWX1g2NAkJCS8qIERvIHRoZXNlIHBhcnRzIGV4aXN0PyAqLwotfTsKLQotI2RlZmluZSBERVZfRkxBR19VTktOT1dOCUJJVChERVZfVU5LTk9XTikKLSNkZWZpbmUgREVWX0ZMQUdfWDEJCUJJVChERVZfWDEpCi0jZGVmaW5lIERFVl9GTEFHX1gyCQlCSVQoREVWX1gyKQotI2RlZmluZSBERVZfRkxBR19YNAkJQklUKERFVl9YNCkKLSNkZWZpbmUgREVWX0ZMQUdfWDgJCUJJVChERVZfWDgpCi0jZGVmaW5lIERFVl9GTEFHX1gxNgkJQklUKERFVl9YMTYpCi0jZGVmaW5lIERFVl9GTEFHX1gzMgkJQklUKERFVl9YMzIpCi0jZGVmaW5lIERFVl9GTEFHX1g2NAkJQklUKERFVl9YNjQpCi0KLS8qIG1lbW9yeSB0eXBlcyAqLwotZW51bSBtZW1fdHlwZSB7Ci0JTUVNX0VNUFRZID0gMCwJCS8qIEVtcHR5IGNzcm93ICovCi0JTUVNX1JFU0VSVkVELAkJLyogUmVzZXJ2ZWQgY3Nyb3cgdHlwZSAqLwotCU1FTV9VTktOT1dOLAkJLyogVW5rbm93biBjc3JvdyB0eXBlICovCi0JTUVNX0ZQTSwJCS8qIEZhc3QgcGFnZSBtb2RlICovCi0JTUVNX0VETywJCS8qIEV4dGVuZGVkIGRhdGEgb3V0ICovCi0JTUVNX0JFRE8sCQkvKiBCdXJzdCBFeHRlbmRlZCBkYXRhIG91dCAqLwotCU1FTV9TRFIsCQkvKiBTaW5nbGUgZGF0YSByYXRlIFNEUkFNICovCi0JTUVNX1JEUiwJCS8qIFJlZ2lzdGVyZWQgc2luZ2xlIGRhdGEgcmF0ZSBTRFJBTSAqLwotCU1FTV9ERFIsCQkvKiBEb3VibGUgZGF0YSByYXRlIFNEUkFNICovCi0JTUVNX1JERFIsCQkvKiBSZWdpc3RlcmVkIERvdWJsZSBkYXRhIHJhdGUgU0RSQU0gKi8KLQlNRU1fUk1CUywJCS8qIFJhbWJ1cyBEUkFNICovCi0JTUVNX0REUjIsCQkvKiBERFIyIFJBTSAqLwotCU1FTV9GQl9ERFIyLAkJLyogZnVsbHkgYnVmZmVyZWQgRERSMiAqLwotCU1FTV9SRERSMiwJCS8qIFJlZ2lzdGVyZWQgRERSMiBSQU0gKi8KLQlNRU1fWERSLAkJLyogUmFtYnVzIFhEUiAqLwotCU1FTV9ERFIzLAkJLyogRERSMyBSQU0gKi8KLQlNRU1fUkREUjMsCQkvKiBSZWdpc3RlcmVkIEREUjMgUkFNICovCi19OwotCi0jZGVmaW5lIE1FTV9GTEFHX0VNUFRZCQlCSVQoTUVNX0VNUFRZKQotI2RlZmluZSBNRU1fRkxBR19SRVNFUlZFRAlCSVQoTUVNX1JFU0VSVkVEKQotI2RlZmluZSBNRU1fRkxBR19VTktOT1dOCUJJVChNRU1fVU5LTk9XTikKLSNkZWZpbmUgTUVNX0ZMQUdfRlBNCQlCSVQoTUVNX0ZQTSkKLSNkZWZpbmUgTUVNX0ZMQUdfRURPCQlCSVQoTUVNX0VETykKLSNkZWZpbmUgTUVNX0ZMQUdfQkVETwkJQklUKE1FTV9CRURPKQotI2RlZmluZSBNRU1fRkxBR19TRFIJCUJJVChNRU1fU0RSKQotI2RlZmluZSBNRU1fRkxBR19SRFIJCUJJVChNRU1fUkRSKQotI2RlZmluZSBNRU1fRkxBR19ERFIJCUJJVChNRU1fRERSKQotI2RlZmluZSBNRU1fRkxBR19SRERSCQlCSVQoTUVNX1JERFIpCi0jZGVmaW5lIE1FTV9GTEFHX1JNQlMJCUJJVChNRU1fUk1CUykKLSNkZWZpbmUgTUVNX0ZMQUdfRERSMiAgICAgICAgICAgQklUKE1FTV9ERFIyKQotI2RlZmluZSBNRU1fRkxBR19GQl9ERFIyICAgICAgICBCSVQoTUVNX0ZCX0REUjIpCi0jZGVmaW5lIE1FTV9GTEFHX1JERFIyICAgICAgICAgIEJJVChNRU1fUkREUjIpCi0jZGVmaW5lIE1FTV9GTEFHX1hEUiAgICAgICAgICAgIEJJVChNRU1fWERSKQotI2RlZmluZSBNRU1fRkxBR19ERFIzCQkgQklUKE1FTV9ERFIzKQotI2RlZmluZSBNRU1fRkxBR19SRERSMwkJIEJJVChNRU1fUkREUjMpCi0KLS8qIGNoaXBzZXQgRXJyb3IgRGV0ZWN0aW9uIGFuZCBDb3JyZWN0aW9uIGNhcGFiaWxpdGllcyBhbmQgbW9kZSAqLwotZW51bSBlZGFjX3R5cGUgewotCUVEQUNfVU5LTk9XTiA9IDAsCS8qIFVua25vd24gaWYgRUNDIGlzIGF2YWlsYWJsZSAqLwotCUVEQUNfTk9ORSwJCS8qIERvZXNuJ3Qgc3VwcG9ydCBFQ0MgKi8KLQlFREFDX1JFU0VSVkVELAkJLyogUmVzZXJ2ZWQgRUNDIHR5cGUgKi8KLQlFREFDX1BBUklUWSwJCS8qIERldGVjdHMgcGFyaXR5IGVycm9ycyAqLwotCUVEQUNfRUMsCQkvKiBFcnJvciBDaGVja2luZyAtIG5vIGNvcnJlY3Rpb24gKi8KLQlFREFDX1NFQ0RFRCwJCS8qIFNpbmdsZSBiaXQgZXJyb3IgY29ycmVjdGlvbiwgRG91YmxlIGRldGVjdGlvbiAqLwotCUVEQUNfUzJFQ0QyRUQsCQkvKiBDaGlwa2lsbCB4MiBkZXZpY2VzIC0gZG8gdGhlc2UgZXhpc3Q/ICovCi0JRURBQ19TNEVDRDRFRCwJCS8qIENoaXBraWxsIHg0IGRldmljZXMgKi8KLQlFREFDX1M4RUNEOEVELAkJLyogQ2hpcGtpbGwgeDggZGV2aWNlcyAqLwotCUVEQUNfUzE2RUNEMTZFRCwJLyogQ2hpcGtpbGwgeDE2IGRldmljZXMgKi8KLX07Ci0KLSNkZWZpbmUgRURBQ19GTEFHX1VOS05PV04JQklUKEVEQUNfVU5LTk9XTikKLSNkZWZpbmUgRURBQ19GTEFHX05PTkUJCUJJVChFREFDX05PTkUpCi0jZGVmaW5lIEVEQUNfRkxBR19QQVJJVFkJQklUKEVEQUNfUEFSSVRZKQotI2RlZmluZSBFREFDX0ZMQUdfRUMJCUJJVChFREFDX0VDKQotI2RlZmluZSBFREFDX0ZMQUdfU0VDREVECUJJVChFREFDX1NFQ0RFRCkKLSNkZWZpbmUgRURBQ19GTEFHX1MyRUNEMkVECUJJVChFREFDX1MyRUNEMkVEKQotI2RlZmluZSBFREFDX0ZMQUdfUzRFQ0Q0RUQJQklUKEVEQUNfUzRFQ0Q0RUQpCi0jZGVmaW5lIEVEQUNfRkxBR19TOEVDRDhFRAlCSVQoRURBQ19TOEVDRDhFRCkKLSNkZWZpbmUgRURBQ19GTEFHX1MxNkVDRDE2RUQJQklUKEVEQUNfUzE2RUNEMTZFRCkKLQotLyogc2NydWJiaW5nIGNhcGFiaWxpdGllcyAqLwotZW51bSBzY3J1Yl90eXBlIHsKLQlTQ1JVQl9VTktOT1dOID0gMCwJLyogVW5rbm93biBpZiBzY3J1YmJlciBpcyBhdmFpbGFibGUgKi8KLQlTQ1JVQl9OT05FLAkJLyogTm8gc2NydWJiZXIgKi8KLQlTQ1JVQl9TV19QUk9HLAkJLyogU1cgcHJvZ3Jlc3NpdmUgKHNlcXVlbnRpYWwpIHNjcnViYmluZyAqLwotCVNDUlVCX1NXX1NSQywJCS8qIFNvZnR3YXJlIHNjcnViIG9ubHkgZXJyb3JzICovCi0JU0NSVUJfU1dfUFJPR19TUkMsCS8qIFByb2dyZXNzaXZlIHNvZnR3YXJlIHNjcnViIGZyb20gYW4gZXJyb3IgKi8KLQlTQ1JVQl9TV19UVU5BQkxFLAkvKiBTb2Z0d2FyZSBzY3J1YiBmcmVxdWVuY3kgaXMgdHVuYWJsZSAqLwotCVNDUlVCX0hXX1BST0csCQkvKiBIVyBwcm9ncmVzc2l2ZSAoc2VxdWVudGlhbCkgc2NydWJiaW5nICovCi0JU0NSVUJfSFdfU1JDLAkJLyogSGFyZHdhcmUgc2NydWIgb25seSBlcnJvcnMgKi8KLQlTQ1JVQl9IV19QUk9HX1NSQywJLyogUHJvZ3Jlc3NpdmUgaGFyZHdhcmUgc2NydWIgZnJvbSBhbiBlcnJvciAqLwotCVNDUlVCX0hXX1RVTkFCTEUJLyogSGFyZHdhcmUgc2NydWIgZnJlcXVlbmN5IGlzIHR1bmFibGUgKi8KLX07Ci0KLSNkZWZpbmUgU0NSVUJfRkxBR19TV19QUk9HCUJJVChTQ1JVQl9TV19QUk9HKQotI2RlZmluZSBTQ1JVQl9GTEFHX1NXX1NSQwlCSVQoU0NSVUJfU1dfU1JDKQotI2RlZmluZSBTQ1JVQl9GTEFHX1NXX1BST0dfU1JDCUJJVChTQ1JVQl9TV19QUk9HX1NSQykKLSNkZWZpbmUgU0NSVUJfRkxBR19TV19UVU4JQklUKFNDUlVCX1NXX1NDUlVCX1RVTkFCTEUpCi0jZGVmaW5lIFNDUlVCX0ZMQUdfSFdfUFJPRwlCSVQoU0NSVUJfSFdfUFJPRykKLSNkZWZpbmUgU0NSVUJfRkxBR19IV19TUkMJQklUKFNDUlVCX0hXX1NSQykKLSNkZWZpbmUgU0NSVUJfRkxBR19IV19QUk9HX1NSQwlCSVQoU0NSVUJfSFdfUFJPR19TUkMpCi0jZGVmaW5lIFNDUlVCX0ZMQUdfSFdfVFVOCUJJVChTQ1JVQl9IV19UVU5BQkxFKQotCi0vKiBGSVhNRSAtIHNob3VsZCBoYXZlIG5vdGlmeSBjYXBhYmlsaXRpZXM6IE5NSSwgTE9HLCBQUk9DLCBldGMgKi8KLQotLyogRURBQyBpbnRlcm5hbCBvcGVyYXRpb24gc3RhdGVzICovCi0jZGVmaW5lCU9QX0FMTE9DCQkweDEwMAotI2RlZmluZSBPUF9SVU5OSU5HX1BPTEwJCTB4MjAxCi0jZGVmaW5lIE9QX1JVTk5JTkdfSU5URVJSVVBUCTB4MjAyCi0jZGVmaW5lIE9QX1JVTk5JTkdfUE9MTF9JTlRSCTB4MjAzCi0jZGVmaW5lIE9QX09GRkxJTkUJCTB4MzAwCi0KLS8qCi0gKiBUaGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3MgdG8gYmUgYXdhcmUgb2YgdGhhdCBhcmVuJ3QgYXQgYWxsIG9idmlvdXM6Ci0gKgotICoKLSAqIFNPQ0tFVFMsIFNPQ0tFVCBTRVRTLCBCQU5LUywgUk9XUywgQ0hJUC1TRUxFQ1QgUk9XUywgQ0hBTk5FTFMsIGV0Yy4uCi0gKgotICogVGhlc2UgYXJlIHNvbWUgb2YgdGhlIG1hbnkgdGVybXMgdGhhdCBhcmUgdGhyb3duIGFib3V0IHRoYXQgZG9uJ3QgYWx3YXlzCi0gKiBtZWFuIHdoYXQgcGVvcGxlIHRoaW5rIHRoZXkgbWVhbiAoSW5jb25jZWl2YWJsZSEpLiAgSW4gdGhlIGludGVyZXN0IG9mCi0gKiBjcmVhdGluZyBhIGNvbW1vbiBncm91bmQgZm9yIGRpc2N1c3Npb24sIHRlcm1zIGFuZCB0aGVpciBkZWZpbml0aW9ucwotICogd2lsbCBiZSBlc3RhYmxpc2hlZC4KLSAqCi0gKiBNZW1vcnkgZGV2aWNlczoJVGhlIGluZGl2aWR1YWwgY2hpcCBvbiBhIG1lbW9yeSBzdGljay4gIFRoZXNlIGRldmljZXMKLSAqCQkJY29tbW9ubHkgb3V0cHV0IDQgYW5kIDggYml0cyBlYWNoLiAgR3JvdXBpbmcgc2V2ZXJhbAotICoJCQlvZiB0aGVzZSBpbiBwYXJhbGxlbCBwcm92aWRlcyA2NCBiaXRzIHdoaWNoIGlzIGNvbW1vbgotICoJCQlmb3IgYSBtZW1vcnkgc3RpY2suCi0gKgotICogTWVtb3J5IFN0aWNrOglBIHByaW50ZWQgY2lyY3VpdCBib2FyZCB0aGF0IGFnZ3JlZ2F0ZXMgbXVsdGlwbGUKLSAqCQkJbWVtb3J5IGRldmljZXMgaW4gcGFyYWxsZWwuICBUaGlzIGlzIHRoZSBhdG9taWMKLSAqCQkJbWVtb3J5IGNvbXBvbmVudCB0aGF0IGlzIHB1cmNoYXNlYWJsZSBieSBKb2UgY29uc3VtZXIKLSAqCQkJYW5kIGxvYWRlZCBpbnRvIGEgbWVtb3J5IHNvY2tldC4KLSAqCi0gKiBTb2NrZXQ6CQlBIHBoeXNpY2FsIGNvbm5lY3RvciBvbiB0aGUgbW90aGVyYm9hcmQgdGhhdCBhY2NlcHRzCi0gKgkJCWEgc2luZ2xlIG1lbW9yeSBzdGljay4KLSAqCi0gKiBDaGFubmVsOgkJU2V0IG9mIG1lbW9yeSBkZXZpY2VzIG9uIGEgbWVtb3J5IHN0aWNrIHRoYXQgbXVzdCBiZQotICoJCQlncm91cGVkIGluIHBhcmFsbGVsIHdpdGggb25lIG9yIG1vcmUgYWRkaXRpb25hbAotICoJCQljaGFubmVscyBmcm9tIG90aGVyIG1lbW9yeSBzdGlja3MuICBUaGlzIHBhcmFsbGVsCi0gKgkJCWdyb3VwaW5nIG9mIHRoZSBvdXRwdXQgZnJvbSBtdWx0aXBsZSBjaGFubmVscyBhcmUKLSAqCQkJbmVjZXNzYXJ5IGZvciB0aGUgc21hbGxlc3QgZ3JhbnVsYXJpdHkgb2YgbWVtb3J5IGFjY2Vzcy4KLSAqCQkJU29tZSBtZW1vcnkgY29udHJvbGxlcnMgYXJlIGNhcGFibGUgb2Ygc2luZ2xlIGNoYW5uZWwgLQotICoJCQl3aGljaCBtZWFucyB0aGF0IG1lbW9yeSBzdGlja3MgY2FuIGJlIGxvYWRlZAotICoJCQlpbmRpdmlkdWFsbHkuICBPdGhlciBtZW1vcnkgY29udHJvbGxlcnMgYXJlIG9ubHkKLSAqCQkJY2FwYWJsZSBvZiBkdWFsIGNoYW5uZWwgLSB3aGljaCBtZWFucyB0aGF0IG1lbW9yeQotICoJCQlzdGlja3MgbXVzdCBiZSBsb2FkZWQgYXMgcGFpcnMgKHNlZSAic29ja2V0IHNldCIpLgotICoKLSAqIENoaXAtc2VsZWN0IHJvdzoJQWxsIG9mIHRoZSBtZW1vcnkgZGV2aWNlcyB0aGF0IGFyZSBzZWxlY3RlZCB0b2dldGhlci4KLSAqCQkJZm9yIGEgc2luZ2xlLCBtaW5pbXVtIGdyYWluIG9mIG1lbW9yeSBhY2Nlc3MuCi0gKgkJCVRoaXMgc2VsZWN0cyBhbGwgb2YgdGhlIHBhcmFsbGVsIG1lbW9yeSBkZXZpY2VzIGFjcm9zcwotICoJCQlhbGwgb2YgdGhlIHBhcmFsbGVsIGNoYW5uZWxzLiAgQ29tbW9uIGNoaXAtc2VsZWN0IHJvd3MKLSAqCQkJZm9yIHNpbmdsZSBjaGFubmVsIGFyZSA2NCBiaXRzLCBmb3IgZHVhbCBjaGFubmVsIDEyOAotICoJCQliaXRzLgotICoKLSAqIFNpbmdsZS1SYW5rZWQgc3RpY2s6CUEgU2luZ2xlLXJhbmtlZCBzdGljayBoYXMgMSBjaGlwLXNlbGVjdCByb3cgb2YgbWVtb3J5LgotICoJCQlNb3RoZXJib2FyZHMgY29tbW9ubHkgZHJpdmUgdHdvIGNoaXAtc2VsZWN0IHBpbnMgdG8KLSAqCQkJYSBtZW1vcnkgc3RpY2suIEEgc2luZ2xlLXJhbmtlZCBzdGljaywgd2lsbCBvY2N1cHkKLSAqCQkJb25seSBvbmUgb2YgdGhvc2Ugcm93cy4gVGhlIG90aGVyIHdpbGwgYmUgdW51c2VkLgotICoKLSAqIERvdWJsZS1SYW5rZWQgc3RpY2s6CUEgZG91YmxlLXJhbmtlZCBzdGljayBoYXMgdHdvIGNoaXAtc2VsZWN0IHJvd3Mgd2hpY2gKLSAqCQkJYWNjZXNzIGRpZmZlcmVudCBzZXRzIG9mIG1lbW9yeSBkZXZpY2VzLiAgVGhlIHR3bwotICoJCQlyb3dzIGNhbm5vdCBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkuCi0gKgotICogRG91YmxlLXNpZGVkIHN0aWNrOglERVBSRUNBVEVEIFRFUk0sIHNlZSBEb3VibGUtUmFua2VkIHN0aWNrLgotICoJCQlBIGRvdWJsZS1zaWRlZCBzdGljayBoYXMgdHdvIGNoaXAtc2VsZWN0IHJvd3Mgd2hpY2gKLSAqCQkJYWNjZXNzIGRpZmZlcmVudCBzZXRzIG9mIG1lbW9yeSBkZXZpY2VzLiAgVGhlIHR3bwotICoJCQlyb3dzIGNhbm5vdCBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkuICAiRG91YmxlLXNpZGVkIgotICoJCQlpcyBpcnJlc3BlY3RpdmUgb2YgdGhlIG1lbW9yeSBkZXZpY2VzIGJlaW5nIG1vdW50ZWQKLSAqCQkJb24gYm90aCBzaWRlcyBvZiB0aGUgbWVtb3J5IHN0aWNrLgotICoKLSAqIFNvY2tldCBzZXQ6CQlBbGwgb2YgdGhlIG1lbW9yeSBzdGlja3MgdGhhdCBhcmUgcmVxdWlyZWQgZm9yCi0gKgkJCWEgc2luZ2xlIG1lbW9yeSBhY2Nlc3Mgb3IgYWxsIG9mIHRoZSBtZW1vcnkgc3RpY2tzCi0gKgkJCXNwYW5uZWQgYnkgYSBjaGlwLXNlbGVjdCByb3cuICBBIHNpbmdsZSBzb2NrZXQgc2V0Ci0gKgkJCWhhcyB0d28gY2hpcC1zZWxlY3Qgcm93cyBhbmQgaWYgZG91YmxlLXNpZGVkIHN0aWNrcwotICoJCQlhcmUgdXNlZCB0aGVzZSB3aWxsIG9jY3VweSB0aG9zZSBjaGlwLXNlbGVjdCByb3dzLgotICoKLSAqIEJhbms6CQlUaGlzIHRlcm0gaXMgYXZvaWRlZCBiZWNhdXNlIGl0IGlzIHVuY2xlYXIgd2hlbgotICoJCQluZWVkaW5nIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gY2hpcC1zZWxlY3Qgcm93cyBhbmQKLSAqCQkJc29ja2V0IHNldHMuCi0gKgotICogQ29udHJvbGxlciBwYWdlczoKLSAqCi0gKiBQaHlzaWNhbCBwYWdlczoKLSAqCi0gKiBWaXJ0dWFsIHBhZ2VzOgotICoKLSAqCi0gKiBTVFJVQ1RVUkUgT1JHQU5JWkFUSU9OIEFORCBDSE9JQ0VTCi0gKgotICoKLSAqCi0gKiBQUyAtIEkgZW5qb3llZCB3cml0aW5nIGFsbCB0aGF0IGFib3V0IGFzIG11Y2ggYXMgeW91IGVuam95ZWQgcmVhZGluZyBpdC4KLSAqLwotCi1zdHJ1Y3QgY2hhbm5lbF9pbmZvIHsKLQlpbnQgY2hhbl9pZHg7CQkvKiBjaGFubmVsIGluZGV4ICovCi0JdTMyIGNlX2NvdW50OwkJLyogQ29ycmVjdGFibGUgRXJyb3JzIGZvciB0aGlzIENIQU5ORUwgKi8KLQljaGFyIGxhYmVsW0VEQUNfTUNfTEFCRUxfTEVOICsgMV07CS8qIERJTU0gbGFiZWwgb24gbW90aGVyYm9hcmQgKi8KLQlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3c7CS8qIHRoZSBwYXJlbnQgKi8KLX07Ci0KLXN0cnVjdCBjc3Jvd19pbmZvIHsKLQl1bnNpZ25lZCBsb25nIGZpcnN0X3BhZ2U7CS8qIGZpcnN0IHBhZ2UgbnVtYmVyIGluIGRpbW0gKi8KLQl1bnNpZ25lZCBsb25nIGxhc3RfcGFnZTsJLyogbGFzdCBwYWdlIG51bWJlciBpbiBkaW1tICovCi0JdW5zaWduZWQgbG9uZyBwYWdlX21hc2s7CS8qIHVzZWQgZm9yIGludGVybGVhdmluZyAtCi0JCQkJCSAqIDBVTCBmb3Igbm9uIGludGx2Ci0JCQkJCSAqLwotCXUzMiBucl9wYWdlczsJCS8qIG51bWJlciBvZiBwYWdlcyBpbiBjc3JvdyAqLwotCXUzMiBncmFpbjsJCS8qIGdyYW51bGFyaXR5IG9mIHJlcG9ydGVkIGVycm9yIGluIGJ5dGVzICovCi0JaW50IGNzcm93X2lkeDsJCS8qIHRoZSBjaGlwLXNlbGVjdCByb3cgKi8KLQllbnVtIGRldl90eXBlIGR0eXBlOwkvKiBtZW1vcnkgZGV2aWNlIHR5cGUgKi8KLQl1MzIgdWVfY291bnQ7CQkvKiBVbmNvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBjc3JvdyAqLwotCXUzMiBjZV9jb3VudDsJCS8qIENvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBjc3JvdyAqLwotCWVudW0gbWVtX3R5cGUgbXR5cGU7CS8qIG1lbW9yeSBjc3JvdyB0eXBlICovCi0JZW51bSBlZGFjX3R5cGUgZWRhY19tb2RlOwkvKiBFREFDIG1vZGUgZm9yIHRoaXMgY3Nyb3cgKi8KLQlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CS8qIHRoZSBwYXJlbnQgKi8KLQotCXN0cnVjdCBrb2JqZWN0IGtvYmo7CS8qIHN5c2ZzIGtvYmplY3QgZm9yIHRoaXMgY3Nyb3cgKi8KLQotCS8qIGNoYW5uZWwgaW5mb3JtYXRpb24gZm9yIHRoaXMgY3Nyb3cgKi8KLQl1MzIgbnJfY2hhbm5lbHM7Ci0Jc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbHM7Ci19OwotCi1zdHJ1Y3QgbWNpZGV2X3N5c2ZzX2dyb3VwIHsKLQljb25zdCBjaGFyICpuYW1lOwkJCQkvKiBncm91cCBuYW1lICovCi0JY29uc3Qgc3RydWN0IG1jaWRldl9zeXNmc19hdHRyaWJ1dGUgKm1jaWRldl9hdHRyOyAvKiBncm91cCBhdHRyaWJ1dGVzICovCi19OwotCi1zdHJ1Y3QgbWNpZGV2X3N5c2ZzX2dyb3VwX2tvYmogewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIGxpc3QgZm9yIGFsbCBpbnN0YW5jZXMgd2l0aGluIGEgbWMgKi8KLQotCXN0cnVjdCBrb2JqZWN0IGtvYmo7CQkvKiBrb2JqIGZvciB0aGUgZ3JvdXAgKi8KLQotCWNvbnN0IHN0cnVjdCBtY2lkZXZfc3lzZnNfZ3JvdXAgKmdycDsJLyogZ3JvdXAgZGVzY3JpcHRpb24gdGFibGUgKi8KLQlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CS8qIHRoZSBwYXJlbnQgKi8KLX07Ci0KLS8qIG1jaWRldl9zeXNmc19hdHRyaWJ1dGUgc3RydWN0dXJlCi0gKgl1c2VkIGZvciBkcml2ZXIgc3lzZnMgYXR0cmlidXRlcyBhbmQgaW4gbWVtX2N0bF9pbmZvCi0gKiAJc3lzZnMgdG9wIGxldmVsIGVudHJpZXMKLSAqLwotc3RydWN0IG1jaWRldl9zeXNmc19hdHRyaWJ1dGUgewotCS8qIEl0IHNob3VsZCB1c2UgZWl0aGVyIGF0dHIgb3IgZ3JwICovCi0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCWNvbnN0IHN0cnVjdCBtY2lkZXZfc3lzZnNfZ3JvdXAgKmdycDsJLyogUG9pbnRzIHRvIGEgZ3JvdXAgb2YgYXR0cmlidXRlcyAqLwotCi0JLyogT3BzIGZvciBzaG93L3N0b3JlIHZhbHVlcyBhdCB0aGUgYXR0cmlidXRlIC0gbm90IHVzZWQgb24gZ3JvdXAgKi8KLSAgICAgICAgc3NpemVfdCAoKnNob3cpKHN0cnVjdCBtZW1fY3RsX2luZm8gKixjaGFyICopOwotICAgICAgICBzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBtZW1fY3RsX2luZm8gKiwgY29uc3QgY2hhciAqLHNpemVfdCk7Ci19OwotCi0vKiBNRU1PUlkgY29udHJvbGxlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLSAqLwotc3RydWN0IG1lbV9jdGxfaW5mbyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaW5rOwkvKiBmb3IgZ2xvYmFsIGxpc3Qgb2YgbWVtX2N0bF9pbmZvIHN0cnVjdHMgKi8KLQotCXN0cnVjdCBtb2R1bGUgKm93bmVyOwkvKiBNb2R1bGUgb3duZXIgb2YgdGhpcyBjb250cm9sIHN0cnVjdCAqLwotCi0JdW5zaWduZWQgbG9uZyBtdHlwZV9jYXA7CS8qIG1lbW9yeSB0eXBlcyBzdXBwb3J0ZWQgYnkgbWMgKi8KLQl1bnNpZ25lZCBsb25nIGVkYWNfY3RsX2NhcDsJLyogTWVtIGNvbnRyb2xsZXIgRURBQyBjYXBhYmlsaXRpZXMgKi8KLQl1bnNpZ25lZCBsb25nIGVkYWNfY2FwOwkvKiBjb25maWd1cmF0aW9uIGNhcGFiaWxpdGllcyAtIHRoaXMgaXMKLQkJCQkgKiBjbG9zZWx5IHJlbGF0ZWQgdG8gZWRhY19jdGxfY2FwLiAgVGhlCi0JCQkJICogZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBjb250cm9sbGVyIG1heSBiZQotCQkJCSAqIGNhcGFibGUgb2YgczRlY2Q0ZWQgd2hpY2ggd291bGQgYmUgbGlzdGVkCi0JCQkJICogaW4gZWRhY19jdGxfY2FwLCBidXQgaWYgY2hhbm5lbHMgYXJlbid0Ci0JCQkJICogY2FwYWJsZSBvZiBzNGVjZDRlZCB0aGVuIHRoZSBlZGFjX2NhcCB3b3VsZAotCQkJCSAqIG5vdCBoYXZlIHRoYXQgY2FwYWJpbGl0eS4KLQkJCQkgKi8KLQl1bnNpZ25lZCBsb25nIHNjcnViX2NhcDsJLyogY2hpcHNldCBzY3J1YiBjYXBhYmlsaXRpZXMgKi8KLQllbnVtIHNjcnViX3R5cGUgc2NydWJfbW9kZTsJLyogY3VycmVudCBzY3J1YiBtb2RlICovCi0KLQkvKiBUcmFuc2xhdGVzIHNkcmFtIG1lbW9yeSBzY3J1YiByYXRlIGdpdmVuIGluIGJ5dGVzL3NlYyB0byB0aGUKLQkgICBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBhbmQgY29uZmlndXJlcyB3aGF0ZXZlciBlbHNlIG5lZWRzCi0JICAgdG8gYmUgY29uZmlndXJlZC4KLQkgKi8KLQlpbnQgKCpzZXRfc2RyYW1fc2NydWJfcmF0ZSkgKHN0cnVjdCBtZW1fY3RsX2luZm8gKiBtY2ksIHUzMiBidyk7Ci0KLQkvKiBHZXQgdGhlIGN1cnJlbnQgc2RyYW0gbWVtb3J5IHNjcnViIHJhdGUgZnJvbSB0aGUgaW50ZXJuYWwKLQkgICByZXByZXNlbnRhdGlvbiBhbmQgY29udmVydHMgaXQgdG8gdGhlIGNsb3Nlc3QgbWF0Y2hpbmcKLQkgICBiYW5kd2lkdGggaW4gYnl0ZXMvc2VjLgotCSAqLwotCWludCAoKmdldF9zZHJhbV9zY3J1Yl9yYXRlKSAoc3RydWN0IG1lbV9jdGxfaW5mbyAqIG1jaSk7Ci0KLQotCS8qIHBvaW50ZXIgdG8gZWRhYyBjaGVja2luZyByb3V0aW5lICovCi0Jdm9pZCAoKmVkYWNfY2hlY2spIChzdHJ1Y3QgbWVtX2N0bF9pbmZvICogbWNpKTsKLQotCS8qCi0JICogUmVtYXBzIG1lbW9yeSBwYWdlczogY29udHJvbGxlciBwYWdlcyB0byBwaHlzaWNhbCBwYWdlcy4KLQkgKiBGb3IgbW9zdCBNQydzLCB0aGlzIHdpbGwgYmUgTlVMTC4KLQkgKi8KLQkvKiBGSVhNRSAtIHdoeSBub3Qgc2VuZCB0aGUgcGh5cyBwYWdlIHRvIGJlZ2luIHdpdGg/ICovCi0JdW5zaWduZWQgbG9uZyAoKmN0bF9wYWdlX3RvX3BoeXMpIChzdHJ1Y3QgbWVtX2N0bF9pbmZvICogbWNpLAotCQkJCQkgICB1bnNpZ25lZCBsb25nIHBhZ2UpOwotCWludCBtY19pZHg7Ci0JaW50IG5yX2Nzcm93czsKLQlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3dzOwotCS8qCi0JICogRklYTUUgLSB3aGF0IGFib3V0IGNvbnRyb2xsZXJzIG9uIG90aGVyIGJ1c3Nlcz8gLSBJRHMgbXVzdCBiZQotCSAqIHVuaXF1ZS4gIGRldiBwb2ludGVyIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgdW5pcXVlLCBidXQKLQkgKiBCVVM6U0xPVC5GVU5DIG51bWJlcnMgbWF5IG5vdCBiZSB1bmlxdWUuCi0JICovCi0Jc3RydWN0IGRldmljZSAqZGV2OwotCWNvbnN0IGNoYXIgKm1vZF9uYW1lOwotCWNvbnN0IGNoYXIgKm1vZF92ZXI7Ci0JY29uc3QgY2hhciAqY3RsX25hbWU7Ci0JY29uc3QgY2hhciAqZGV2X25hbWU7Ci0JY2hhciBwcm9jX25hbWVbTUNfUFJPQ19OQU1FX01BWF9MRU4gKyAxXTsKLQl2b2lkICpwdnRfaW5mbzsKLQl1MzIgdWVfbm9pbmZvX2NvdW50OwkvKiBVbmNvcnJlY3RhYmxlIEVycm9ycyB3L28gaW5mbyAqLwotCXUzMiBjZV9ub2luZm9fY291bnQ7CS8qIENvcnJlY3RhYmxlIEVycm9ycyB3L28gaW5mbyAqLwotCXUzMiB1ZV9jb3VudDsJCS8qIFRvdGFsIFVuY29ycmVjdGFibGUgRXJyb3JzIGZvciB0aGlzIE1DICovCi0JdTMyIGNlX2NvdW50OwkJLyogVG90YWwgQ29ycmVjdGFibGUgRXJyb3JzIGZvciB0aGlzIE1DICovCi0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOwkvKiBtY2kgbG9hZCBzdGFydCB0aW1lIChpbiBqaWZmaWVzKSAqLwotCi0Jc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7Ci0KLQkvKiBlZGFjIHN5c2ZzIGRldmljZSBjb250cm9sICovCi0Jc3RydWN0IGtvYmplY3QgZWRhY19tY2lfa29iajsKLQotCS8qIGxpc3QgZm9yIGFsbCBncnAgaW5zdGFuY2VzIHdpdGhpbiBhIG1jICovCi0Jc3RydWN0IGxpc3RfaGVhZCBncnBfa29ial9saXN0OwotCi0JLyogQWRkaXRpb25hbCB0b3AgY29udHJvbGxlciBsZXZlbCBhdHRyaWJ1dGVzLCBidXQgc3BlY2lmaWVkCi0JICogYnkgdGhlIGxvdyBsZXZlbCBkcml2ZXIuCi0JICoKLQkgKiBTZXQgYnkgdGhlIGxvdyBsZXZlbCBkcml2ZXIgdG8gcHJvdmlkZSBhdHRyaWJ1dGVzIGF0IHRoZQotCSAqIGNvbnRyb2xsZXIgbGV2ZWwsIHNhbWUgbGV2ZWwgYXMgJ3VlX2NvdW50JyBhbmQgJ2NlX2NvdW50JyBhYm92ZS4KLQkgKiBBbiBhcnJheSBvZiBzdHJ1Y3R1cmVzLCBOVUxMIHRlcm1pbmF0ZWQKLQkgKgotCSAqIElmIGF0dHJpYnV0ZXMgYXJlIGRlc2lyZWQsIHRoZW4gc2V0IHRvIGFycmF5IG9mIGF0dHJpYnV0ZXMKLQkgKiBJZiBubyBhdHRyaWJ1dGVzIGFyZSBkZXNpcmVkLCBsZWF2ZSBOVUxMCi0JICovCi0JY29uc3Qgc3RydWN0IG1jaWRldl9zeXNmc19hdHRyaWJ1dGUgKm1jX2RyaXZlcl9zeXNmc19hdHRyaWJ1dGVzOwotCi0JLyogd29yayBzdHJ1Y3QgZm9yIHRoaXMgTUMgKi8KLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7Ci0KLQkvKiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhpcyBjb250cm9sbGVyIGluc3RhbmNlICovCi0JaW50IG9wX3N0YXRlOwotfTsKLQogLyoKICAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBzdHJ1Y3R1cmVzIHRvIHByb3ZpZGUgZm9yIGEgZ2VuZXJpYwogICogb3IgYWJzdHJhY3QgJ2VkYWNfZGV2aWNlJy4gVGhpcyBzZXQgb2Ygc3RydWN0dXJlcyBhbmQgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tY2UuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2NkYzViLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21jZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogUHJvdmlkZXMgZWRhYyBpbnRlcmZhY2UgdG8gbWNlbG9nIGV2ZW50cwotICoKLSAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieToKLSAqCSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KLSAqCi0gKiBSZWQgSGF0IEluYy4gaHR0cDovL3d3dy5yZWRoYXQuY29tCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2VkYWNfbWNlLmg+Ci0jaW5jbHVkZSA8YXNtL21jZS5oPgotCi1pbnQgZWRhY19tY2VfZW5hYmxlZDsKLUVYUE9SVF9TWU1CT0xfR1BMKGVkYWNfbWNlX2VuYWJsZWQpOwotCi0KLS8qCi0gKiBFeHRlbnNpb24gaW50ZXJmYWNlCi0gKi8KLQotc3RhdGljIExJU1RfSEVBRChlZGFjX21jZV9saXN0KTsKLXN0YXRpYyBERUZJTkVfTVVURVgoZWRhY19tY2VfbG9jayk7Ci0KLWludCBlZGFjX21jZV9yZWdpc3RlcihzdHJ1Y3QgZWRhY19tY2UgKmVkYWNfbWNlKQotewotCW11dGV4X2xvY2soJmVkYWNfbWNlX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJmVkYWNfbWNlLT5saXN0LCAmZWRhY19tY2VfbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZlZGFjX21jZV9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZWRhY19tY2VfcmVnaXN0ZXIpOwotCi12b2lkIGVkYWNfbWNlX3VucmVnaXN0ZXIoc3RydWN0IGVkYWNfbWNlICplZGFjX21jZSkKLXsKLQltdXRleF9sb2NrKCZlZGFjX21jZV9sb2NrKTsKLQlsaXN0X2RlbCgmZWRhY19tY2UtPmxpc3QpOwotCW11dGV4X3VubG9jaygmZWRhY19tY2VfbG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MKGVkYWNfbWNlX3VucmVnaXN0ZXIpOwotCi1pbnQgZWRhY19tY2VfcGFyc2Uoc3RydWN0IG1jZSAqbWNlKQotewotCXN0cnVjdCBlZGFjX21jZSAqZWRhY19tY2U7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVkYWNfbWNlLCAmZWRhY19tY2VfbGlzdCwgbGlzdCkgewotCQlpZiAoZWRhY19tY2UtPmNoZWNrX2Vycm9yKGVkYWNfbWNlLT5wcml2LCBtY2UpKQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogTm9ib2R5IHF1ZXVlZCB0aGUgZXJyb3IgKi8KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGVkYWNfbWNlX3BhcnNlKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7Ci1NT0RVTEVfQVVUSE9SKCJSZWQgSGF0IEluYy4gKGh0dHA6Ly93d3cucmVkaGF0LmNvbSkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRURBQyBEcml2ZXIgZm9yIG1jZWxvZyBjYXB0dXJlZCBlcnJvcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pNzMwMF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTczMDBfZWRhYy5jCmluZGV4IGE3NmZlODMuLjYxMDRkYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pNzMwMF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k3MzAwX2VkYWMuYwpAQCAtMzcyLDcgKzM3Miw3IEBACiBzdGF0aWMgdm9pZCBpNzMwMF9wcm9jZXNzX2Vycm9yX2dsb2JhbChzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCiB7CiAJc3RydWN0IGk3MzAwX3B2dCAqcHZ0OwotCXUzMiBlcnJudW0sIHZhbHVlOworCXUzMiBlcnJudW0sIGVycm9yX3JlZzsKIAl1bnNpZ25lZCBsb25nIGVycm9yczsKIAljb25zdCBjaGFyICpzcGVjaWZpYzsKIAlib29sIGlzX2ZhdGFsOwpAQCAtMzgxLDkgKzM4MSw5IEBACiAKIAkvKiByZWFkIGluIHRoZSAxc3QgRkFUQUwgZXJyb3IgcmVnaXN0ZXIgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzJfZnNiX2Vycl9yZWdzLAotCQkJICAgICAgRkVSUl9HTE9CQUxfSEksICZ2YWx1ZSk7Ci0JaWYgKHVubGlrZWx5KHZhbHVlKSkgewotCQllcnJvcnMgPSB2YWx1ZTsKKwkJCSAgICAgIEZFUlJfR0xPQkFMX0hJLCAmZXJyb3JfcmVnKTsKKwlpZiAodW5saWtlbHkoZXJyb3JfcmVnKSkgeworCQllcnJvcnMgPSBlcnJvcl9yZWc7CiAJCWVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZlcnJvcnMsCiAJCQkJCUFSUkFZX1NJWkUoZmVycl9nbG9iYWxfaGlfbmFtZSkpOwogCQlzcGVjaWZpYyA9IEdFVF9FUlJfRlJPTV9UQUJMRShmZXJyX2dsb2JhbF9oaV9uYW1lLCBlcnJudW0pOwpAQCAtMzkxLDE1ICszOTEsMTUgQEAKIAogCQkvKiBDbGVhciB0aGUgZXJyb3IgYml0ICovCiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzJfZnNiX2Vycl9yZWdzLAotCQkJCSAgICAgICBGRVJSX0dMT0JBTF9ISSwgdmFsdWUpOworCQkJCSAgICAgICBGRVJSX0dMT0JBTF9ISSwgZXJyb3JfcmVnKTsKIAogCQlnb3RvIGVycm9yX2dsb2JhbDsKIAl9CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzJfZnNiX2Vycl9yZWdzLAotCQkJICAgICAgRkVSUl9HTE9CQUxfTE8sICZ2YWx1ZSk7Ci0JaWYgKHVubGlrZWx5KHZhbHVlKSkgewotCQllcnJvcnMgPSB2YWx1ZTsKKwkJCSAgICAgIEZFUlJfR0xPQkFMX0xPLCAmZXJyb3JfcmVnKTsKKwlpZiAodW5saWtlbHkoZXJyb3JfcmVnKSkgeworCQllcnJvcnMgPSBlcnJvcl9yZWc7CiAJCWVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZlcnJvcnMsCiAJCQkJCUFSUkFZX1NJWkUoZmVycl9nbG9iYWxfbG9fbmFtZSkpOwogCQlzcGVjaWZpYyA9IEdFVF9FUlJfRlJPTV9UQUJMRShmZXJyX2dsb2JhbF9sb19uYW1lLCBlcnJudW0pOwpAQCAtNDA3LDcgKzQwNyw3IEBACiAKIAkJLyogQ2xlYXIgdGhlIGVycm9yIGJpdCAqLwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2Rldl8xNl8yX2ZzYl9lcnJfcmVncywKLQkJCQkgICAgICAgRkVSUl9HTE9CQUxfTE8sIHZhbHVlKTsKKwkJCQkgICAgICAgRkVSUl9HTE9CQUxfTE8sIGVycm9yX3JlZyk7CiAKIAkJZ290byBlcnJvcl9nbG9iYWw7CiAJfQpAQCAtNDI3LDcgKzQyNyw3IEBACiBzdGF0aWMgdm9pZCBpNzMwMF9wcm9jZXNzX2ZiZF9lcnJvcihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCiB7CiAJc3RydWN0IGk3MzAwX3B2dCAqcHZ0OwotCXUzMiBlcnJudW0sIHZhbHVlOworCXUzMiBlcnJudW0sIHZhbHVlLCBlcnJvcl9yZWc7CiAJdTE2IHZhbDE2OwogCXVuc2lnbmVkIGJyYW5jaCwgY2hhbm5lbCwgYmFuaywgcmFuaywgY2FzLCByYXM7CiAJdTMyIHN5bmRyb21lOwpAQCAtNDQwLDE0ICs0NDAsMTQgQEAKIAogCS8qIHJlYWQgaW4gdGhlIDFzdCBGQVRBTCBlcnJvciByZWdpc3RlciAqLwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9kZXZfMTZfMV9mc2JfYWRkcl9tYXAsCi0JCQkgICAgICBGRVJSX0ZBVF9GQkQsICZ2YWx1ZSk7Ci0JaWYgKHVubGlrZWx5KHZhbHVlICYgRkVSUl9GQVRfRkJEX0VSUl9NQVNLKSkgewotCQllcnJvcnMgPSB2YWx1ZSAmIEZFUlJfRkFUX0ZCRF9FUlJfTUFTSyA7CisJCQkgICAgICBGRVJSX0ZBVF9GQkQsICZlcnJvcl9yZWcpOworCWlmICh1bmxpa2VseShlcnJvcl9yZWcgJiBGRVJSX0ZBVF9GQkRfRVJSX01BU0spKSB7CisJCWVycm9ycyA9IGVycm9yX3JlZyAmIEZFUlJfRkFUX0ZCRF9FUlJfTUFTSyA7CiAJCWVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZlcnJvcnMsCiAJCQkJCUFSUkFZX1NJWkUoZmVycl9mYXRfZmJkX25hbWUpKTsKIAkJc3BlY2lmaWMgPSBHRVRfRVJSX0ZST01fVEFCTEUoZmVycl9mYXRfZmJkX25hbWUsIGVycm51bSk7CisJCWJyYW5jaCA9IChHRVRfRkJEX0ZBVF9JRFgoZXJyb3JfcmVnKSA9PSAyKSA/IDEgOiAwOwogCi0JCWJyYW5jaCA9IChHRVRfRkJEX0ZBVF9JRFgodmFsdWUpID09IDIpID8gMSA6IDA7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+cGNpX2Rldl8xNl8xX2ZzYl9hZGRyX21hcCwKIAkJCQkgICAgIE5SRUNNRU1BLCAmdmFsMTYpOwogCQliYW5rID0gTlJFQ01FTUFfQkFOSyh2YWwxNik7CkBAIC00NTUsMTEgKzQ1NSwxNCBAQAogCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9kZXZfMTZfMV9mc2JfYWRkcl9tYXAsCiAJCQkJTlJFQ01FTUIsICZ2YWx1ZSk7Ci0KIAkJaXNfd3IgPSBOUkVDTUVNQl9JU19XUih2YWx1ZSk7CiAJCWNhcyA9IE5SRUNNRU1CX0NBUyh2YWx1ZSk7CiAJCXJhcyA9IE5SRUNNRU1CX1JBUyh2YWx1ZSk7CiAKKwkJLyogQ2xlYW4gdGhlIGVycm9yIHJlZ2lzdGVyICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzFfZnNiX2FkZHJfbWFwLAorCQkJCUZFUlJfRkFUX0ZCRCwgZXJyb3JfcmVnKTsKKwogCQlzbnByaW50ZihwdnQtPnRtcF9wcnRfYnVmZmVyLCBQQUdFX1NJWkUsCiAJCQkiRkFUQUwgKEJyYW5jaD0lZCBEUkFNLUJhbms9JWQgJXMgIgogCQkJIlJBUz0lZCBDQVM9JWQgRXJyPTB4JWx4ICglcykpIiwKQEAgLTQ3NiwyMSArNDc5LDE3IEBACiAKIAkvKiByZWFkIGluIHRoZSAxc3QgTk9OLUZBVEFMIGVycm9yIHJlZ2lzdGVyICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2Rldl8xNl8xX2ZzYl9hZGRyX21hcCwKLQkJCSAgICAgIEZFUlJfTkZfRkJELCAmdmFsdWUpOwotCWlmICh1bmxpa2VseSh2YWx1ZSAmIEZFUlJfTkZfRkJEX0VSUl9NQVNLKSkgewotCQllcnJvcnMgPSB2YWx1ZSAmIEZFUlJfTkZfRkJEX0VSUl9NQVNLOworCQkJICAgICAgRkVSUl9ORl9GQkQsICZlcnJvcl9yZWcpOworCWlmICh1bmxpa2VseShlcnJvcl9yZWcgJiBGRVJSX05GX0ZCRF9FUlJfTUFTSykpIHsKKwkJZXJyb3JzID0gZXJyb3JfcmVnICYgRkVSUl9ORl9GQkRfRVJSX01BU0s7CiAJCWVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZlcnJvcnMsCiAJCQkJCUFSUkFZX1NJWkUoZmVycl9uZl9mYmRfbmFtZSkpOwogCQlzcGVjaWZpYyA9IEdFVF9FUlJfRlJPTV9UQUJMRShmZXJyX25mX2ZiZF9uYW1lLCBlcnJudW0pOwotCi0JCS8qIENsZWFyIHRoZSBlcnJvciBiaXQgKi8KLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPnBjaV9kZXZfMTZfMl9mc2JfZXJyX3JlZ3MsCi0JCQkJICAgICAgIEZFUlJfR0xPQkFMX0xPLCB2YWx1ZSk7CisJCWJyYW5jaCA9IChHRVRfRkJEX0ZBVF9JRFgoZXJyb3JfcmVnKSA9PSAyKSA/IDEgOiAwOwogCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9kZXZfMTZfMV9mc2JfYWRkcl9tYXAsCiAJCQlSRURNRU1BLCAmc3luZHJvbWUpOwogCi0JCWJyYW5jaCA9IChHRVRfRkJEX0ZBVF9JRFgodmFsdWUpID09IDIpID8gMSA6IDA7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+cGNpX2Rldl8xNl8xX2ZzYl9hZGRyX21hcCwKIAkJCQkgICAgIFJFQ01FTUEsICZ2YWwxNik7CiAJCWJhbmsgPSBSRUNNRU1BX0JBTksodmFsMTYpOwpAQCAtNDk4LDE4ICs0OTcsMjAgQEAKIAogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzFfZnNiX2FkZHJfbWFwLAogCQkJCVJFQ01FTUIsICZ2YWx1ZSk7Ci0KIAkJaXNfd3IgPSBSRUNNRU1CX0lTX1dSKHZhbHVlKTsKIAkJY2FzID0gUkVDTUVNQl9DQVModmFsdWUpOwogCQlyYXMgPSBSRUNNRU1CX1JBUyh2YWx1ZSk7CiAKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2Rldl8xNl8xX2ZzYl9hZGRyX21hcCwKIAkJCQkgICAgIFJFRE1FTUIsICZ2YWx1ZSk7Ci0KIAkJY2hhbm5lbCA9IChicmFuY2ggPDwgMSk7CiAJCWlmIChJU19TRUNPTkRfQ0godmFsdWUpKQogCQkJY2hhbm5lbCsrOwogCisJCS8qIENsZWFyIHRoZSBlcnJvciBiaXQgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPnBjaV9kZXZfMTZfMV9mc2JfYWRkcl9tYXAsCisJCQkJRkVSUl9ORl9GQkQsIGVycm9yX3JlZyk7CisKIAkJLyogRm9ybSBvdXQgbWVzc2FnZSAqLwogCQlzbnByaW50ZihwdnQtPnRtcF9wcnRfYnVmZmVyLCBQQUdFX1NJWkUsCiAJCQkiQ29ycmVjdGVkIGVycm9yIChCcmFuY2g9JWQsIENoYW5uZWwgJWQpLCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCmluZGV4IGY2Y2Y0NDguLjcwYWQ4OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCkBAIC0zMSwxMSArMzEsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvZWRhYy5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgotI2luY2x1ZGUgPGxpbnV4L2VkYWNfbWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL21jZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KIAogI2luY2x1ZGUgImVkYWNfY29yZS5oIgogCkBAIC03OCw2ICs4MCw4IEBACiAJLyogT0ZGU0VUUyBmb3IgRGV2aWNlIDAgRnVuY3Rpb24gMCAqLwogCiAjZGVmaW5lIE1DX0NGR19DT05UUk9MCTB4OTAKKyAgI2RlZmluZSBNQ19DRkdfVU5MT0NLCQkweDAyCisgICNkZWZpbmUgTUNfQ0ZHX0xPQ0sJCTB4MDAKIAogCS8qIE9GRlNFVFMgZm9yIERldmljZSAzIEZ1bmN0aW9uIDAgKi8KIApAQCAtOTgsNiArMTAyLDE1IEBACiAgICNkZWZpbmUgRElNTTBfQ09SX0VSUihyKQkJCSgocikgJiAweDdmZmYpCiAKIC8qIE9GRlNFVFMgZm9yIERldmljZSAzIEZ1bmN0aW9uIDIsIGFzIGluaWNhdGVkIG9uIFhlb24gNTUwMCBkYXRhc2hlZXQgKi8KKyNkZWZpbmUgTUNfU1NSQ09OVFJPTAkJMHg0OAorICAjZGVmaW5lIFNTUl9NT0RFX0RJU0FCTEUJMHgwMAorICAjZGVmaW5lIFNTUl9NT0RFX0VOQUJMRQkweDAxCisgICNkZWZpbmUgU1NSX01PREVfTUFTSwkJMHgwMworCisjZGVmaW5lIE1DX1NDUlVCX0NPTlRST0wJMHg0YworICAjZGVmaW5lIFNUQVJUU0NSVUIJCSgxIDw8IDI0KQorICAjZGVmaW5lIFNDUlVCSU5URVJWQUxfTUFTSyAgICAweGZmZmZmZgorCiAjZGVmaW5lIE1DX0NPUl9FQ0NfQ05UXzAJMHg4MAogI2RlZmluZSBNQ19DT1JfRUNDX0NOVF8xCTB4ODQKICNkZWZpbmUgTUNfQ09SX0VDQ19DTlRfMgkweDg4CkBAIC0yNTMsMTAgKzI2Niw3IEBACiAJdW5zaWduZWQgbG9uZwlyZGltbV9jZV9jb3VudFtOVU1fQ0hBTlNdW01BWF9ESU1NU107CiAJaW50CQlyZGltbV9sYXN0X2NlX2NvdW50W05VTV9DSEFOU11bTUFYX0RJTU1TXTsKIAotCXVuc2lnbmVkIGludAlpc19yZWdpc3RlcmVkOwotCi0JLyogbWNlbG9nIGdsdWUgKi8KLQlzdHJ1Y3QgZWRhY19tY2UJCWVkYWNfbWNlOworCWJvb2wJCWlzX3JlZ2lzdGVyZWQsIGVuYWJsZV9zY3J1YjsKIAogCS8qIEZpZm8gZG91YmxlIGJ1ZmZlcnMgKi8KIAlzdHJ1Y3QgbWNlCQltY2VfZW50cnlbTUNFX0xPR19MRU5dOwpAQCAtMjY4LDYgKzI3OCw5IEBACiAJLyogQ291bnQgaW5kaWNhdG9yIHRvIHNob3cgZXJyb3JzIG5vdCBnb3QgKi8KIAl1bnNpZ25lZAkJbWNlX292ZXJydW47CiAKKwkvKiBEQ0xLIEZyZXF1ZW5jeSB1c2VkIGZvciBjb21wdXRpbmcgc2NydWIgcmF0ZSAqLworCWludAkJCWRjbGtfZnJlcTsKKwogCS8qIFN0cnVjdCB0byBjb250cm9sIEVEQUMgcG9sbGluZyAqLwogCXN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqaTdjb3JlX3BjaTsKIH07CkBAIC0yODEsOCArMjk0LDcgQEAKIAkJLyogTWVtb3J5IGNvbnRyb2xsZXIgKi8KIAl7IFBDSV9ERVNDUigzLCAwLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0k3X01DUikgICAgIH0sCiAJeyBQQ0lfREVTQ1IoMywgMSwgUENJX0RFVklDRV9JRF9JTlRFTF9JN19NQ19UQUQpICB9LAotCi0JCS8qIEV4aXN0cyBvbmx5IGZvciBSRElNTSAqLworCQkJLyogRXhpc3RzIG9ubHkgZm9yIFJESU1NICovCiAJeyBQQ0lfREVTQ1IoMywgMiwgUENJX0RFVklDRV9JRF9JTlRFTF9JN19NQ19SQVMpLCAub3B0aW9uYWwgPSAxICB9LAogCXsgUENJX0RFU0NSKDMsIDQsIFBDSV9ERVZJQ0VfSURfSU5URUxfSTdfTUNfVEVTVCkgfSwKIApAQCAtMzAzLDYgKzMxNSwxNiBAQAogCXsgUENJX0RFU0NSKDYsIDEsIFBDSV9ERVZJQ0VfSURfSU5URUxfSTdfTUNfQ0gyX0FERFIpIH0sCiAJeyBQQ0lfREVTQ1IoNiwgMiwgUENJX0RFVklDRV9JRF9JTlRFTF9JN19NQ19DSDJfUkFOSykgfSwKIAl7IFBDSV9ERVNDUig2LCAzLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0k3X01DX0NIMl9UQykgICB9LAorCisJCS8qIEdlbmVyaWMgTm9uLWNvcmUgcmVnaXN0ZXJzICovCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBQQ0kgZGV2aWNlIG9uIGk3Y29yZSBhbmQgb24gWGVvbiAzNXh4ICg4MDg2OjJjNDEpCisJICogT24gWGVvbiA1NXh4LCBob3dldmVyLCBpdCBoYXMgYSBkaWZmZXJlbnQgaWQgKDgwODY6MmM0MCkuIFNvLAorCSAqIHRoZSBwcm9iaW5nIGNvZGUgbmVlZHMgdG8gdGVzdCBmb3IgdGhlIG90aGVyIGFkZHJlc3MgaW4gY2FzZSBvZgorCSAqIGZhaWx1cmUgb2YgdGhpcyBvbmUKKwkgKi8KKwl7IFBDSV9ERVNDUigwLCAwLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0k3X05PTkNPUkUpICB9LAorCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9pZF9kZXNjciBwY2lfZGV2X2Rlc2NyX2x5bm5maWVsZFtdID0gewpAQCAtMzE5LDYgKzM0MSwxMiBAQAogCXsgUENJX0RFU0NSKCA1LCAxLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9NQ19DSDFfQUREUikgfSwKIAl7IFBDSV9ERVNDUiggNSwgMiwgUENJX0RFVklDRV9JRF9JTlRFTF9MWU5ORklFTERfTUNfQ0gxX1JBTkspIH0sCiAJeyBQQ0lfREVTQ1IoIDUsIDMsIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX01DX0NIMV9UQykgICB9LAorCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBQQ0kgZGV2aWNlIGhhcyBhbiBhbHRlcm5hdGUgYWRkcmVzcyBvbiBzb21lCisJICogcHJvY2Vzc29ycyBsaWtlIENvcmUgaTcgODYwCisJICovCisJeyBQQ0lfREVTQ1IoIDAsIDAsIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX05PTkNPUkUpICAgICB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfaWRfZGVzY3IgcGNpX2Rldl9kZXNjcl9pN2NvcmVfd2VzdG1lcmVbXSA9IHsKQEAgLTM0Niw2ICszNzQsMTAgQEAKIAl7IFBDSV9ERVNDUig2LCAxLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9NQ19DSDJfQUREUl9SRVYyKSB9LAogCXsgUENJX0RFU0NSKDYsIDIsIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX01DX0NIMl9SQU5LX1JFVjIpIH0sCiAJeyBQQ0lfREVTQ1IoNiwgMywgUENJX0RFVklDRV9JRF9JTlRFTF9MWU5ORklFTERfTUNfQ0gyX1RDX1JFVjIpICAgfSwKKworCQkvKiBHZW5lcmljIE5vbi1jb3JlIHJlZ2lzdGVycyAqLworCXsgUENJX0RFU0NSKDAsIDAsIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX05PTkNPUkVfUkVWMikgIH0sCisKIH07CiAKICNkZWZpbmUgUENJX0lEX1RBQkxFX0VOVFJZKEEpIHsgLmRlc2NyPUEsIC5uX2RldnMgPSBBUlJBWV9TSVpFKEEpIH0KQEAgLTcxNCw2ICs3NDYsMTAgQEAKIAogCQkJY3NyLT5lZGFjX21vZGUgPSBtb2RlOwogCQkJY3NyLT5tdHlwZSA9IG10eXBlOworCQkJc25wcmludGYoY3NyLT5jaGFubmVsc1swXS5sYWJlbCwKKwkJCQkJc2l6ZW9mKGNzci0+Y2hhbm5lbHNbMF0ubGFiZWwpLAorCQkJCQkiQ1BVIyV1Q2hhbm5lbCMldV9ESU1NIyV1IiwKKwkJCQkJcHZ0LT5pN2NvcmVfZGV2LT5zb2NrZXQsIGksIGopOwogCiAJCQljc3JvdysrOwogCQl9CkBAIC03MzEsNyArNzY3LDcgQEAKIAkJCWRlYnVnZjEoIlx0XHQlI3hcdCUjeFx0JSN4XG4iLAogCQkJCSh2YWx1ZVtqXSA+PiAyNykgJiAweDEsCiAJCQkJKHZhbHVlW2pdID4+IDI0KSAmIDB4NywKLQkJCQkodmFsdWVbal0gJiYgKCgxIDw8IDI0KSAtIDEpKSk7CisJCQkJKHZhbHVlW2pdICYgKCgxIDw8IDI0KSAtIDEpKSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMzI0LDYgKzEzNjAsMjAgQEAKIAlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKIAkJCSAgICAgIGRldl9kZXNjci0+ZGV2X2lkLCAqcHJldik7CiAKKwkvKgorCSAqIE9uIFhlb24gNTV4eCwgdGhlIEludGVsIFF1Y2twYXRoIEFyY2ggR2VuZXJpYyBOb24tY29yZSByZWdzCisJICogaXMgYXQgYWRkciA4MDg2OjJjNDAsIGluc3RlYWQgb2YgODA4NjoyYzQxLiBTbywgd2UgbmVlZAorCSAqIHRvIHByb2JlIGZvciB0aGUgYWx0ZXJuYXRlIGFkZHJlc3MgaW4gY2FzZSBvZiBmYWlsdXJlCisJICovCisJaWYgKGRldl9kZXNjci0+ZGV2X2lkID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSTdfTk9OQ09SRSAmJiAhcGRldikKKwkJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF9JN19OT05DT1JFX0FMVCwgKnByZXYpOworCisJaWYgKGRldl9kZXNjci0+ZGV2X2lkID09IFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX05PTkNPUkUgJiYgIXBkZXYpCisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX05PTkNPUkVfQUxULAorCQkJCSAgICAgICpwcmV2KTsKKwogCWlmICghcGRldikgewogCQlpZiAoKnByZXYpIHsKIAkJCSpwcmV2ID0gcGRldjsKQEAgLTE0NDQsOCArMTQ5NCwxMCBAQAogCXN0cnVjdCBpN2NvcmVfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCWludCBpLCBmdW5jLCBzbG90OworCWNoYXIgKmZhbWlseTsKIAotCXB2dC0+aXNfcmVnaXN0ZXJlZCA9IDA7CisJcHZ0LT5pc19yZWdpc3RlcmVkID0gZmFsc2U7CisJcHZ0LT5lbmFibGVfc2NydWIgID0gZmFsc2U7CiAJZm9yIChpID0gMDsgaSA8IGk3Y29yZV9kZXYtPm5fZGV2czsgaSsrKSB7CiAJCXBkZXYgPSBpN2NvcmVfZGV2LT5wZGV2W2ldOwogCQlpZiAoIXBkZXYpCkBAIC0xNDYxLDkgKzE1MTMsMzcgQEAKIAkJCWlmICh1bmxpa2VseShmdW5jID4gTUFYX0NIQU5fRlVOQykpCiAJCQkJZ290byBlcnJvcjsKIAkJCXB2dC0+cGNpX2NoW3Nsb3QgLSA0XVtmdW5jXSA9IHBkZXY7Ci0JCX0gZWxzZSBpZiAoIXNsb3QgJiYgIWZ1bmMpCisJCX0gZWxzZSBpZiAoIXNsb3QgJiYgIWZ1bmMpIHsKIAkJCXB2dC0+cGNpX25vbmNvcmUgPSBwZGV2OwotCQllbHNlCisKKwkJCS8qIERldGVjdCB0aGUgcHJvY2Vzc29yIGZhbWlseSAqLworCQkJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKKwkJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JN19OT05DT1JFOgorCQkJCWZhbWlseSA9ICJYZW9uIDM1eHgvIGk3Y29yZSI7CisJCQkJcHZ0LT5lbmFibGVfc2NydWIgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9MWU5ORklFTERfTk9OQ09SRV9BTFQ6CisJCQkJZmFtaWx5ID0gImk3LTgwMC9pNS03MDAiOworCQkJCXB2dC0+ZW5hYmxlX3NjcnViID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX05PTkNPUkU6CisJCQkJZmFtaWx5ID0gIlhlb24gMzR4eCI7CisJCQkJcHZ0LT5lbmFibGVfc2NydWIgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JN19OT05DT1JFX0FMVDoKKwkJCQlmYW1pbHkgPSAiWGVvbiA1NXh4IjsKKwkJCQlwdnQtPmVuYWJsZV9zY3J1YiA9IHRydWU7CisJCQkJYnJlYWs7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX05PTkNPUkVfUkVWMjoKKwkJCQlmYW1pbHkgPSAiWGVvbiA1Nnh4IC8gaTctOTAwIjsKKwkJCQlwdnQtPmVuYWJsZV9zY3J1YiA9IHRydWU7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWZhbWlseSA9ICJ1bmtub3duIjsKKwkJCQlwdnQtPmVuYWJsZV9zY3J1YiA9IGZhbHNlOworCQkJfQorCQkJZGVidWdmMCgiRGV0ZWN0ZWQgYSBwcm9jZXNzb3IgdHlwZSAlc1xuIiwgZmFtaWx5KTsKKwkJfSBlbHNlCiAJCQlnb3RvIGVycm9yOwogCiAJCWRlYnVnZjAoIkFzc29jaWF0ZWQgZm4gJWQuJWQsIGRldiA9ICVwLCBzb2NrZXQgJWRcbiIsCkBAIC0xNDcyLDcgKzE1NTIsNyBAQAogCiAJCWlmIChQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gMyAmJgogCQkJUENJX0ZVTkMocGRldi0+ZGV2Zm4pID09IDIpCi0JCQlwdnQtPmlzX3JlZ2lzdGVyZWQgPSAxOworCQkJcHZ0LT5pc19yZWdpc3RlcmVkID0gdHJ1ZTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE4MjYsMzMgKzE5MDYsNDMgQEAKICAqIFdBUk5JTkc6IEFzIHRoaXMgcm91dGluZSBzaG91bGQgYmUgY2FsbGVkIGF0IE5NSSB0aW1lLCBleHRyYSBjYXJlIHNob3VsZAogICogYmUgdGFrZW4gdG8gYXZvaWQgZGVhZGxvY2tzLCBhbmQgdG8gYmUgYXMgZmFzdCBhcyBwb3NzaWJsZS4KICAqLwotc3RhdGljIGludCBpN2NvcmVfbWNlX2NoZWNrX2Vycm9yKHZvaWQgKnByaXYsIHN0cnVjdCBtY2UgKm1jZSkKK3N0YXRpYyBpbnQgaTdjb3JlX21jZV9jaGVja19lcnJvcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCQkgIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gcHJpdjsKLQlzdHJ1Y3QgaTdjb3JlX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlzdHJ1Y3QgbWNlICptY2UgPSAoc3RydWN0IG1jZSAqKWRhdGE7CisJc3RydWN0IGk3Y29yZV9kZXYgKmk3X2RldjsKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IGk3Y29yZV9wdnQgKnB2dDsKKworCWk3X2RldiA9IGdldF9pN2NvcmVfZGV2KG1jZS0+c29ja2V0aWQpOworCWlmICghaTdfZGV2KQorCQlyZXR1cm4gTk9USUZZX0JBRDsKKworCW1jaSA9IGk3X2Rldi0+bWNpOworCXB2dCA9IG1jaS0+cHZ0X2luZm87CiAKIAkvKgogCSAqIEp1c3QgbGV0IG1jZWxvZyBoYW5kbGUgaXQgaWYgdGhlIGVycm9yIGlzCiAJICogb3V0c2lkZSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIKIAkgKi8KIAlpZiAoKChtY2UtPnN0YXR1cyAmIDB4ZmZmZikgPj4gNykgIT0gMSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCS8qIEJhbmsgOCByZWdpc3RlcnMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB3ZSBrbm93IGhvdyB0byBoYW5kbGUgKi8KIAlpZiAobWNlLT5iYW5rICE9IDgpCi0JCXJldHVybiAwOworCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKICNpZmRlZiBDT05GSUdfU01QCiAJLyogT25seSBoYW5kbGUgaWYgaXQgaXMgdGhlIHJpZ2h0IG1jIGNvbnRyb2xsZXIgKi8KLQlpZiAoY3B1X2RhdGEobWNlLT5jcHUpLnBoeXNfcHJvY19pZCAhPSBwdnQtPmk3Y29yZV9kZXYtPnNvY2tldCkKLQkJcmV0dXJuIDA7CisJaWYgKG1jZS0+c29ja2V0aWQgIT0gcHZ0LT5pN2NvcmVfZGV2LT5zb2NrZXQpCisJCXJldHVybiBOT1RJRllfRE9ORTsKICNlbmRpZgogCiAJc21wX3JtYigpOwogCWlmICgocHZ0LT5tY2Vfb3V0ICsgMSkgJSBNQ0VfTE9HX0xFTiA9PSBwdnQtPm1jZV9pbikgewogCQlzbXBfd21iKCk7CiAJCXB2dC0+bWNlX292ZXJydW4rKzsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBOT1RJRllfRE9ORTsKIAl9CiAKIAkvKiBDb3B5IG1lbW9yeSBlcnJvciBhdCB0aGUgcmluZ2J1ZmZlciAqLwpAQCAtMTg2NSw3ICsxOTU1LDI0MCBAQAogCQlpN2NvcmVfY2hlY2tfZXJyb3IobWNpKTsKIAogCS8qIEFkdmlzZSBtY2Vsb2cgdGhhdCB0aGUgZXJyb3JzIHdlcmUgaGFuZGxlZCAqLwotCXJldHVybiAxOworCXJldHVybiBOT1RJRllfU1RPUDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpN19tY2VfZGVjID0geworCS5ub3RpZmllcl9jYWxsCT0gaTdjb3JlX21jZV9jaGVja19lcnJvciwKK307CisKK3N0cnVjdCBtZW1kZXZfZG1pX2VudHJ5IHsKKwl1OCB0eXBlOworCXU4IGxlbmd0aDsKKwl1MTYgaGFuZGxlOworCXUxNiBwaHlzX21lbV9hcnJheV9oYW5kbGU7CisJdTE2IG1lbV9lcnJfaW5mb19oYW5kbGU7CisJdTE2IHRvdGFsX3dpZHRoOworCXUxNiBkYXRhX3dpZHRoOworCXUxNiBzaXplOworCXU4IGZvcm07CisJdTggZGV2aWNlX3NldDsKKwl1OCBkZXZpY2VfbG9jYXRvcjsKKwl1OCBiYW5rX2xvY2F0b3I7CisJdTggbWVtb3J5X3R5cGU7CisJdTE2IHR5cGVfZGV0YWlsOworCXUxNiBzcGVlZDsKKwl1OCBtYW51ZmFjdHVyZXI7CisJdTggc2VyaWFsX251bWJlcjsKKwl1OCBhc3NldF90YWc7CisJdTggcGFydF9udW1iZXI7CisJdTggYXR0cmlidXRlczsKKwl1MzIgZXh0ZW5kZWRfc2l6ZTsKKwl1MTYgY29uZl9tZW1fY2xrX3NwZWVkOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKworLyoKKyAqIERlY29kZSB0aGUgRFJBTSBDbG9jayBGcmVxdWVuY3ksIGJlIHBhcmFub2lkLCBtYWtlIHN1cmUgdGhhdCBhbGwKKyAqIG1lbW9yeSBkZXZpY2VzIHNob3cgdGhlIHNhbWUgc3BlZWQsIGFuZCBpZiB0aGV5IGRvbid0IHRoZW4gY29uc2lkZXIKKyAqIGFsbCBzcGVlZHMgdG8gYmUgaW52YWxpZC4KKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX2RjbGsoY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmRoLCB2b2lkICpfZGNsa19mcmVxKQoreworCWludCAqZGNsa19mcmVxID0gX2RjbGtfZnJlcTsKKwl1MTYgZG1pX21lbV9jbGtfc3BlZWQ7CisKKwlpZiAoKmRjbGtfZnJlcSA9PSAtMSkKKwkJcmV0dXJuOworCisJaWYgKGRoLT50eXBlID09IERNSV9FTlRSWV9NRU1fREVWSUNFKSB7CisJCXN0cnVjdCBtZW1kZXZfZG1pX2VudHJ5ICptZW1kZXZfZG1pX2VudHJ5ID0KKwkJCShzdHJ1Y3QgbWVtZGV2X2RtaV9lbnRyeSAqKWRoOworCQl1bnNpZ25lZCBsb25nIGNvbmZfbWVtX2Nsa19zcGVlZF9vZmZzZXQgPQorCQkJKHVuc2lnbmVkIGxvbmcpJm1lbWRldl9kbWlfZW50cnktPmNvbmZfbWVtX2Nsa19zcGVlZCAtCisJCQkodW5zaWduZWQgbG9uZykmbWVtZGV2X2RtaV9lbnRyeS0+dHlwZTsKKwkJdW5zaWduZWQgbG9uZyBzcGVlZF9vZmZzZXQgPQorCQkJKHVuc2lnbmVkIGxvbmcpJm1lbWRldl9kbWlfZW50cnktPnNwZWVkIC0KKwkJCSh1bnNpZ25lZCBsb25nKSZtZW1kZXZfZG1pX2VudHJ5LT50eXBlOworCisJCS8qIENoZWNrIHRoYXQgYSBESU1NIGlzIHByZXNlbnQgKi8KKwkJaWYgKG1lbWRldl9kbWlfZW50cnktPnNpemUgPT0gMCkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBQaWNrIHRoZSBjb25maWd1cmVkIHNwZWVkIGlmIGl0J3MgYXZhaWxhYmxlLCBvdGhlcndpc2UKKwkJICogcGljayB0aGUgRElNTSBzcGVlZCwgb3Igd2UgZG9uJ3QgaGF2ZSBhIHNwZWVkLgorCQkgKi8KKwkJaWYgKG1lbWRldl9kbWlfZW50cnktPmxlbmd0aCA+IGNvbmZfbWVtX2Nsa19zcGVlZF9vZmZzZXQpIHsKKwkJCWRtaV9tZW1fY2xrX3NwZWVkID0KKwkJCQltZW1kZXZfZG1pX2VudHJ5LT5jb25mX21lbV9jbGtfc3BlZWQ7CisJCX0gZWxzZSBpZiAobWVtZGV2X2RtaV9lbnRyeS0+bGVuZ3RoID4gc3BlZWRfb2Zmc2V0KSB7CisJCQlkbWlfbWVtX2Nsa19zcGVlZCA9IG1lbWRldl9kbWlfZW50cnktPnNwZWVkOworCQl9IGVsc2UgeworCQkJKmRjbGtfZnJlcSA9IC0xOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCpkY2xrX2ZyZXEgPT0gMCkgeworCQkJLyogRmlyc3QgcGFzcywgc3BlZWQgd2FzIDAgKi8KKwkJCWlmIChkbWlfbWVtX2Nsa19zcGVlZCA+IDApIHsKKwkJCQkvKiBTZXQgc3BlZWQgaWYgYSB2YWxpZCBzcGVlZCBpcyByZWFkICovCisJCQkJKmRjbGtfZnJlcSA9IGRtaV9tZW1fY2xrX3NwZWVkOworCQkJfSBlbHNlIHsKKwkJCQkvKiBPdGhlcndpc2Ugd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIHNwZWVkICovCisJCQkJKmRjbGtfZnJlcSA9IC0xOworCQkJfQorCQl9IGVsc2UgaWYgKCpkY2xrX2ZyZXEgPiAwICYmCisJCQkgICAqZGNsa19mcmVxICE9IGRtaV9tZW1fY2xrX3NwZWVkKSB7CisJCQkvKgorCQkJICogSWYgd2UgaGF2ZSBhIHNwZWVkLCBjaGVjayB0aGF0IGFsbCBESU1NUyBhcmUgdGhlIHNhbWUKKwkJCSAqIHNwZWVkLCBvdGhlcndpc2Ugc2V0IHRoZSBzcGVlZCBhcyBpbnZhbGlkLgorCQkJICovCisJCQkqZGNsa19mcmVxID0gLTE7CisJCX0KKwl9Cit9CisKKy8qCisgKiBUaGUgZGVmYXVsdCBEQ0xLIGZyZXF1ZW5jeSBpcyB1c2VkIGFzIGEgZmFsbGJhY2sgaWYgd2UKKyAqIGZhaWwgdG8gZmluZCBhbnl0aGluZyByZWxpYWJsZSBpbiB0aGUgRE1JLiBUaGUgdmFsdWUKKyAqIGlzIHRha2VuIHN0cmFpZ2h0IGZyb20gdGhlIGRhdGFzaGVldC4KKyAqLworI2RlZmluZSBERUZBVUxUX0RDTEtfRlJFUSA4MDAKKworc3RhdGljIGludCBnZXRfZGNsa19mcmVxKHZvaWQpCit7CisJaW50IGRjbGtfZnJlcSA9IDA7CisKKwlkbWlfd2FsayhkZWNvZGVfZGNsaywgKHZvaWQgKikmZGNsa19mcmVxKTsKKworCWlmIChkY2xrX2ZyZXEgPCAxKQorCQlyZXR1cm4gREVGQVVMVF9EQ0xLX0ZSRVE7CisKKwlyZXR1cm4gZGNsa19mcmVxOworfQorCisvKgorICogc2V0X3NkcmFtX3NjcnViX3JhdGUJCVRoaXMgcm91dGluZSBzZXRzIGJ5dGUvc2VjIGJhbmR3aWR0aCBzY3J1YiByYXRlCisgKgkJCQl0byBoYXJkd2FyZSBhY2NvcmRpbmcgdG8gU0NSVUJJTlRFUlZBTCBmb3JtdWxhCisgKgkJCQlmb3VuZCBpbiBkYXRhc2hlZXQuCisgKi8KK3N0YXRpYyBpbnQgc2V0X3NkcmFtX3NjcnViX3JhdGUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1MzIgbmV3X2J3KQoreworCXN0cnVjdCBpN2NvcmVfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXUzMiBkd19zY3J1YjsKKwl1MzIgZHdfc3NyOworCisJLyogR2V0IGRhdGEgZnJvbSB0aGUgTUMgcmVnaXN0ZXIsIGZ1bmN0aW9uIDIgKi8KKwlwZGV2ID0gcHZ0LT5wY2lfbWNyWzJdOworCWlmICghcGRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgTUNfU0NSVUJfQ09OVFJPTCwgJmR3X3NjcnViKTsKKworCWlmIChuZXdfYncgPT0gMCkgeworCQkvKiBQcmVwYXJlIHRvIGRpc2FibGUgcGV0cm9sIHNjcnViICovCisJCWR3X3NjcnViICY9IH5TVEFSVFNDUlVCOworCQkvKiBTdG9wIHRoZSBwYXRyb2wgc2NydWIgZW5naW5lICovCisJCXdyaXRlX2FuZF90ZXN0KHBkZXYsIE1DX1NDUlVCX0NPTlRST0wsCisJCQkgICAgICAgZHdfc2NydWIgJiB+U0NSVUJJTlRFUlZBTF9NQVNLKTsKKworCQkvKiBHZXQgY3VycmVudCBzdGF0dXMgb2Ygc2NydWIgcmF0ZSBhbmQgc2V0IGJpdCB0byBkaXNhYmxlICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBNQ19TU1JDT05UUk9MLCAmZHdfc3NyKTsKKwkJZHdfc3NyICY9IH5TU1JfTU9ERV9NQVNLOworCQlkd19zc3IgfD0gU1NSX01PREVfRElTQUJMRTsKKwl9IGVsc2UgeworCQljb25zdCBpbnQgY2FjaGVfbGluZV9zaXplID0gNjQ7CisJCWNvbnN0IHUzMiBmcmVxX2RjbGtfbWh6ID0gcHZ0LT5kY2xrX2ZyZXE7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzY3J1Yl9pbnRlcnZhbDsKKwkJLyoKKwkJICogVHJhbnNsYXRlIHRoZSBkZXNpcmVkIHNjcnViIHJhdGUgdG8gYSByZWdpc3RlciB2YWx1ZSBhbmQKKwkJICogcHJvZ3JhbSB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlciB2YWx1ZS4KKwkJICovCisJCXNjcnViX2ludGVydmFsID0gKHVuc2lnbmVkIGxvbmcgbG9uZylmcmVxX2RjbGtfbWh6ICoKKwkJCWNhY2hlX2xpbmVfc2l6ZSAqIDEwMDAwMDA7CisJCWRvX2RpdihzY3J1Yl9pbnRlcnZhbCwgbmV3X2J3KTsKKworCQlpZiAoIXNjcnViX2ludGVydmFsIHx8IHNjcnViX2ludGVydmFsID4gU0NSVUJJTlRFUlZBTF9NQVNLKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZHdfc2NydWIgPSBTQ1JVQklOVEVSVkFMX01BU0sgJiBzY3J1Yl9pbnRlcnZhbDsKKworCQkvKiBTdGFydCB0aGUgcGF0cm9sIHNjcnViIGVuZ2luZSAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIE1DX1NDUlVCX0NPTlRST0wsCisJCQkJICAgICAgIFNUQVJUU0NSVUIgfCBkd19zY3J1Yik7CisKKwkJLyogR2V0IGN1cnJlbnQgc3RhdHVzIG9mIHNjcnViIHJhdGUgYW5kIHNldCBiaXQgdG8gZW5hYmxlICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBNQ19TU1JDT05UUk9MLCAmZHdfc3NyKTsKKwkJZHdfc3NyICY9IH5TU1JfTU9ERV9NQVNLOworCQlkd19zc3IgfD0gU1NSX01PREVfRU5BQkxFOworCX0KKwkvKiBEaXNhYmxlIG9yIGVuYWJsZSBzY3J1YmJpbmcgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIE1DX1NTUkNPTlRST0wsIGR3X3Nzcik7CisKKwlyZXR1cm4gbmV3X2J3OworfQorCisvKgorICogZ2V0X3NkcmFtX3NjcnViX3JhdGUJCVRoaXMgcm91dGluZSBjb252ZXJ0IGN1cnJlbnQgc2NydWIgcmF0ZSB2YWx1ZQorICoJCQkJaW50byBieXRlL3NlYyBiYW5kd2lkdGggYWNjb3VyZGluZyB0bworICoJCQkJU0NSVUJJTlRFUlZBTCBmb3JtdWxhIGZvdW5kIGluIGRhdGFzaGVldC4KKyAqLworc3RhdGljIGludCBnZXRfc2RyYW1fc2NydWJfcmF0ZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk3Y29yZV9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJY29uc3QgdTMyIGNhY2hlX2xpbmVfc2l6ZSA9IDY0OworCWNvbnN0IHUzMiBmcmVxX2RjbGtfbWh6ID0gcHZ0LT5kY2xrX2ZyZXE7CisJdW5zaWduZWQgbG9uZyBsb25nIHNjcnViX3JhdGU7CisJdTMyIHNjcnVidmFsOworCisJLyogR2V0IGRhdGEgZnJvbSB0aGUgTUMgcmVnaXN0ZXIsIGZ1bmN0aW9uIDIgKi8KKwlwZGV2ID0gcHZ0LT5wY2lfbWNyWzJdOworCWlmICghcGRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBHZXQgY3VycmVudCBzY3J1YiBjb250cm9sIGRhdGEgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgTUNfU0NSVUJfQ09OVFJPTCwgJnNjcnVidmFsKTsKKworCS8qIE1hc2sgaGlnaGVzdCA4LWJpdHMgdG8gMCAqLworCXNjcnVidmFsICY9ICBTQ1JVQklOVEVSVkFMX01BU0s7CisJaWYgKCFzY3J1YnZhbCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDYWxjdWxhdGUgc2NydWIgcmF0ZSB2YWx1ZSBpbnRvIGJ5dGUvc2VjIGJhbmR3aWR0aCAqLworCXNjcnViX3JhdGUgPSAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmVxX2RjbGtfbWh6ICoKKwkJMTAwMDAwMCAqIGNhY2hlX2xpbmVfc2l6ZTsKKwlkb19kaXYoc2NydWJfcmF0ZSwgc2NydWJ2YWwpOworCXJldHVybiAoaW50KXNjcnViX3JhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9zZHJhbV9zY3J1Yl9zZXR0aW5nKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTdjb3JlX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwl1MzIgcGNpX2xvY2s7CisKKwkvKiBVbmxvY2sgd3JpdGVzIHRvIHBjaSByZWdpc3RlcnMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfbm9uY29yZSwgTUNfQ0ZHX0NPTlRST0wsICZwY2lfbG9jayk7CisJcGNpX2xvY2sgJj0gfjB4MzsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+cGNpX25vbmNvcmUsIE1DX0NGR19DT05UUk9MLAorCQkJICAgICAgIHBjaV9sb2NrIHwgTUNfQ0ZHX1VOTE9DSyk7CisKKwltY2ktPnNldF9zZHJhbV9zY3J1Yl9yYXRlID0gc2V0X3NkcmFtX3NjcnViX3JhdGU7CisJbWNpLT5nZXRfc2RyYW1fc2NydWJfcmF0ZSA9IGdldF9zZHJhbV9zY3J1Yl9yYXRlOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX3NkcmFtX3NjcnViX3NldHRpbmcoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpN2NvcmVfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXUzMiBwY2lfbG9jazsKKworCS8qIExvY2sgd3JpdGVzIHRvIHBjaSByZWdpc3RlcnMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfbm9uY29yZSwgTUNfQ0ZHX0NPTlRST0wsICZwY2lfbG9jayk7CisJcGNpX2xvY2sgJj0gfjB4MzsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+cGNpX25vbmNvcmUsIE1DX0NGR19DT05UUk9MLAorCQkJICAgICAgIHBjaV9sb2NrIHwgTUNfQ0ZHX0xPQ0spOwogfQogCiBzdGF0aWMgdm9pZCBpN2NvcmVfcGNpX2N0bF9jcmVhdGUoc3RydWN0IGk3Y29yZV9wdnQgKnB2dCkKQEAgLTE4NzQsNyArMjE5Nyw4IEBACiAJCQkJCQkmcHZ0LT5pN2NvcmVfZGV2LT5wZGV2WzBdLT5kZXYsCiAJCQkJCQlFREFDX01PRF9TVFIpOwogCWlmICh1bmxpa2VseSghcHZ0LT5pN2NvcmVfcGNpKSkKLQkJcHJfd2FybigiVW5hYmxlIHRvIHNldHVwIFBDSSBlcnJvciByZXBvcnQgdmlhIEVEQUNcbiIpOworCQlpN2NvcmVfcHJpbnRrKEtFUk5fV0FSTklORywKKwkJCSAgICAgICJVbmFibGUgdG8gc2V0dXAgUENJIGVycm9yIHJlcG9ydCB2aWEgRURBQ1xuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGk3Y29yZV9wY2lfY3RsX3JlbGVhc2Uoc3RydWN0IGk3Y29yZV9wdnQgKnB2dCkKQEAgLTE5MDYsOCArMjIzMCwxMSBAQAogCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6IG1jaSA9ICVwLCBkZXYgPSAlcFxuIiwKIAkJX19mdW5jX18sIG1jaSwgJmk3Y29yZV9kZXYtPnBkZXZbMF0tPmRldik7CiAKLQkvKiBEaXNhYmxlIE1DRSBOTUkgaGFuZGxlciAqLwotCWVkYWNfbWNlX3VucmVnaXN0ZXIoJnB2dC0+ZWRhY19tY2UpOworCS8qIERpc2FibGUgc2NydWJyYXRlIHNldHRpbmcgKi8KKwlpZiAocHZ0LT5lbmFibGVfc2NydWIpCisJCWRpc2FibGVfc2RyYW1fc2NydWJfc2V0dGluZyhtY2kpOworCisJYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJng4Nl9tY2VfZGVjb2Rlcl9jaGFpbiwgJmk3X21jZV9kZWMpOwogCiAJLyogRGlzYWJsZSBFREFDIHBvbGxpbmcgKi8KIAlpN2NvcmVfcGNpX2N0bF9yZWxlYXNlKHB2dCk7CkBAIC0xOTc5LDYgKzIzMDYsMTAgQEAKIAkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYW4gYWN0dWFsIG9wZXJhdGlvbiBmdW5jdGlvbiAqLwogCW1jaS0+ZWRhY19jaGVjayA9IGk3Y29yZV9jaGVja19lcnJvcjsKIAorCS8qIEVuYWJsZSBzY3J1YnJhdGUgc2V0dGluZyAqLworCWlmIChwdnQtPmVuYWJsZV9zY3J1YikKKwkJZW5hYmxlX3NkcmFtX3NjcnViX3NldHRpbmcobWNpKTsKKwogCS8qIGFkZCB0aGlzIG5ldyBNQyBjb250cm9sIHN0cnVjdHVyZSB0byBFREFDJ3MgbGlzdCBvZiBNQ3MgKi8KIAlpZiAodW5saWtlbHkoZWRhY19tY19hZGRfbWMobWNpKSkpIHsKIAkJZGVidWdmMCgiTUM6ICIgX19GSUxFX18KQEAgLTIwMDIsMjEgKzIzMzMsMTMgQEAKIAkvKiBhbGxvY2F0aW5nIGdlbmVyaWMgUENJIGNvbnRyb2wgaW5mbyAqLwogCWk3Y29yZV9wY2lfY3RsX2NyZWF0ZShwdnQpOwogCi0JLyogUmVnaXN0ZXJzIG9uIGVkYWNfbWNlIGluIG9yZGVyIHRvIHJlY2VpdmUgbWVtb3J5IGVycm9ycyAqLwotCXB2dC0+ZWRhY19tY2UucHJpdiA9IG1jaTsKLQlwdnQtPmVkYWNfbWNlLmNoZWNrX2Vycm9yID0gaTdjb3JlX21jZV9jaGVja19lcnJvcjsKLQlyYyA9IGVkYWNfbWNlX3JlZ2lzdGVyKCZwdnQtPmVkYWNfbWNlKTsKLQlpZiAodW5saWtlbHkocmMgPCAwKSkgewotCQlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXwotCQkJIjogJXMoKTogZmFpbGVkIGVkYWNfbWNlX3JlZ2lzdGVyKClcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsMTsKLQl9CisJLyogRENMSyBmb3Igc2NydWIgcmF0ZSBzZXR0aW5nICovCisJcHZ0LT5kY2xrX2ZyZXEgPSBnZXRfZGNsa19mcmVxKCk7CisKKwlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJng4Nl9tY2VfZGVjb2Rlcl9jaGFpbiwgJmk3X21jZV9kZWMpOwogCiAJcmV0dXJuIDA7CiAKLWZhaWwxOgotCWk3Y29yZV9wY2lfY3RsX3JlbGVhc2UocHZ0KTsKLQllZGFjX21jX2RlbF9tYyhtY2ktPmRldik7CiBmYWlsMDoKIAlrZnJlZShtY2ktPmN0bF9uYW1lKTsKIAllZGFjX21jX2ZyZWUobWNpKTsKQEAgLTIwMzUsNyArMjM1OCw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpN2NvcmVfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0JaW50IHJjOworCWludCByYywgY291bnQgPSAwOwogCXN0cnVjdCBpN2NvcmVfZGV2ICppN2NvcmVfZGV2OwogCiAJLyogZ2V0IHRoZSBwY2kgZGV2aWNlcyB3ZSB3YW50IHRvIHJlc2VydmUgZm9yIG91ciB1c2UgKi8KQEAgLTIwNTUsMTIgKzIzNzgsMjggQEAKIAkJZ290byBmYWlsMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaTdjb3JlX2RldiwgJmk3Y29yZV9lZGFjX2xpc3QsIGxpc3QpIHsKKwkJY291bnQrKzsKIAkJcmMgPSBpN2NvcmVfcmVnaXN0ZXJfbWNpKGk3Y29yZV9kZXYpOwogCQlpZiAodW5saWtlbHkocmMgPCAwKSkKIAkJCWdvdG8gZmFpbDE7CiAJfQogCi0JaTdjb3JlX3ByaW50ayhLRVJOX0lORk8sICJEcml2ZXIgbG9hZGVkLlxuIik7CisJLyoKKwkgKiBOZWhhbGVtLUVYIHVzZXMgYSBkaWZmZXJlbnQgbWVtb3J5IGNvbnRyb2xsZXIuIEhvd2V2ZXIsIGFzIHRoZQorCSAqIG1lbW9yeSBjb250cm9sbGVyIGlzIG5vdCB2aXNpYmxlIG9uIHNvbWUgTmVoYWxlbS9OZWhhbGVtLUVQLCB3ZQorCSAqIG5lZWQgdG8gaW5kaXJlY3RseSBwcm9iZSB2aWEgYSBYNTggUENJIGRldmljZS4gVGhlIHNhbWUgZGV2aWNlcworCSAqIGFyZSBmb3VuZCBvbiAoc29tZSkgTmVoYWxlbS1FWC4gU28sIG9uIHRob3NlIG1hY2hpbmVzLCB0aGUKKwkgKiBwcm9iZSByb3V0aW5lIG5lZWRzIHRvIHJldHVybiAtRU5PREVWLCBhcyB0aGUgYWN0dWFsIE1lbW9yeQorCSAqIENvbnRyb2xsZXIgcmVnaXN0ZXJzIHdvbid0IGJlIGRldGVjdGVkLgorCSAqLworCWlmICghY291bnQpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGZhaWwxOworCX0KKworCWk3Y29yZV9wcmludGsoS0VSTl9JTkZPLAorCQkgICAgICAiRHJpdmVyIGxvYWRlZCwgJWQgbWVtb3J5IGNvbnRyb2xsZXIocykgZm91bmQuXG4iLAorCQkgICAgICBjb3VudCk7CiAKIAltdXRleF91bmxvY2soJmk3Y29yZV9lZGFjX2xvY2spOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYyBiL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMKaW5kZXggNzk1Y2ZiYy4uZDA4NjRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYworKysgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZC5jCkBAIC05LDcgKzksNyBAQAogc3RhdGljIHU4IG5iX2Vycl9jcHVtYXNrID0gMHhmOwogCiBzdGF0aWMgYm9vbCByZXBvcnRfZ2FydF9lcnJvcnM7Ci1zdGF0aWMgdm9pZCAoKm5iX2J1c19kZWNvZGVyKShpbnQgbm9kZV9pZCwgc3RydWN0IG1jZSAqbSwgdTMyIG5iY2ZnKTsKK3N0YXRpYyB2b2lkICgqbmJfYnVzX2RlY29kZXIpKGludCBub2RlX2lkLCBzdHJ1Y3QgbWNlICptKTsKIAogdm9pZCBhbWRfcmVwb3J0X2dhcnRfZXJyb3JzKGJvb2wgdikKIHsKQEAgLTE3LDEzICsxNywxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYW1kX3JlcG9ydF9nYXJ0X2Vycm9ycyk7CiAKLXZvaWQgYW1kX3JlZ2lzdGVyX2VjY19kZWNvZGVyKHZvaWQgKCpmKShpbnQsIHN0cnVjdCBtY2UgKiwgdTMyKSkKK3ZvaWQgYW1kX3JlZ2lzdGVyX2VjY19kZWNvZGVyKHZvaWQgKCpmKShpbnQsIHN0cnVjdCBtY2UgKikpCiB7CiAJbmJfYnVzX2RlY29kZXIgPSBmOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYW1kX3JlZ2lzdGVyX2VjY19kZWNvZGVyKTsKIAotdm9pZCBhbWRfdW5yZWdpc3Rlcl9lY2NfZGVjb2Rlcih2b2lkICgqZikoaW50LCBzdHJ1Y3QgbWNlICosIHUzMikpCit2b2lkIGFtZF91bnJlZ2lzdGVyX2VjY19kZWNvZGVyKHZvaWQgKCpmKShpbnQsIHN0cnVjdCBtY2UgKikpCiB7CiAJaWYgKG5iX2J1c19kZWNvZGVyKSB7CiAJCVdBUk5fT04obmJfYnVzX2RlY29kZXIgIT0gZik7CkBAIC01OTIsMzEgKzU5MiwxNCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBhbWRfZGVjb2RlX25iX21jZShpbnQgbm9kZV9pZCwgc3RydWN0IG1jZSAqbSwgdTMyIG5iY2ZnKQordm9pZCBhbWRfZGVjb2RlX25iX21jZShzdHJ1Y3QgbWNlICptKQogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOwotCXUxNiBlYyAgID0gRUMobS0+c3RhdHVzKTsKLQl1OCB4ZWMgICA9IFhFQyhtLT5zdGF0dXMsIDB4MWYpOwotCXUzMiBuYnNoID0gKHUzMikobS0+c3RhdHVzID4+IDMyKTsKLQlpbnQgY29yZSA9IC0xOworCWludCBub2RlX2lkID0gYW1kX2dldF9uYl9pZChtLT5leHRjcHUpOworCXUxNiBlYyA9IEVDKG0tPnN0YXR1cyk7CisJdTggeGVjID0gWEVDKG0tPnN0YXR1cywgMHgxZik7CiAKLQlwcl9lbWVyZyhIV19FUlIgIk5vcnRoYnJpZGdlIEVycm9yIChub2RlICVkIiwgbm9kZV9pZCk7Ci0KLQkvKiBGMTBoLCByZXZEIGNhbiBkaXNhYmxlIEVyckNwdVszOjBdIHRocm91Z2ggRXJyQ3B1VmFsICovCi0JaWYgKGMtPng4NiA9PSAweDEwICYmIGMtPng4Nl9tb2RlbCA+IDcpIHsKLQkJaWYgKG5ic2ggJiBOQlNIX0VSUl9DUFVfVkFMKQotCQkJY29yZSA9IG5ic2ggJiBuYl9lcnJfY3B1bWFzazsKLQl9IGVsc2UgewotCQl1OCBhc3NvY19jcHVzID0gbmJzaCAmIG5iX2Vycl9jcHVtYXNrOwotCi0JCWlmIChhc3NvY19jcHVzID4gMCkKLQkJCWNvcmUgPSBmbHMoYXNzb2NfY3B1cykgLSAxOwotCX0KLQotCWlmIChjb3JlID49IDApCi0JCXByX2NvbnQoIiwgY29yZSAlZCk6ICIsIGNvcmUpOwotCWVsc2UKLQkJcHJfY29udCgiKTogIik7CisJcHJfZW1lcmcoSFdfRVJSICJOb3J0aGJyaWRnZSBFcnJvciAobm9kZSAlZCk6ICIsIG5vZGVfaWQpOwogCiAJc3dpdGNoICh4ZWMpIHsKIAljYXNlIDB4MjoKQEAgLTY0OCw3ICs2MzEsNyBAQAogCiAJaWYgKGMtPng4NiA9PSAweGYgfHwgYy0+eDg2ID09IDB4MTAgfHwgYy0+eDg2ID09IDB4MTUpCiAJCWlmICgoeGVjID09IDB4OCB8fCB4ZWMgPT0gMHgwKSAmJiBuYl9idXNfZGVjb2RlcikKLQkJCW5iX2J1c19kZWNvZGVyKG5vZGVfaWQsIG0sIG5iY2ZnKTsKKwkJCW5iX2J1c19kZWNvZGVyKG5vZGVfaWQsIG0pOwogCiAJcmV0dXJuOwogCkBAIC03NjQsMTMgKzc0NywxMyBAQAogewogCXN0cnVjdCBtY2UgKm0gPSAoc3RydWN0IG1jZSAqKWRhdGE7CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmJvb3RfY3B1X2RhdGE7Ci0JaW50IG5vZGUsIGVjYzsKKwlpbnQgZWNjOwogCiAJaWYgKGFtZF9maWx0ZXJfbWNlKG0pKQogCQlyZXR1cm4gTk9USUZZX1NUT1A7CiAKLQlwcl9lbWVyZyhIV19FUlIgIk1DJWRfU1RBVFVTWyVzfCVzfCVzfCVzfCVzIiwKLQkJbS0+YmFuaywKKwlwcl9lbWVyZyhIV19FUlIgIkNQVTolZFx0TUMlZF9TVEFUVVNbJXN8JXN8JXN8JXN8JXMiLAorCQltLT5leHRjcHUsIG0tPmJhbmssCiAJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19PVkVSKQk/ICJPdmVyIiAgOiAiLSIpLAogCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfVUMpCT8gIlVFIgkgIDogIkNFIiksCiAJCSgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19NSVNDVikJPyAiTWlzY1YiIDogIi0iKSwKQEAgLTc4OSw2ICs3NzIsOCBAQAogCiAJcHJfY29udCgiXTogMHglMDE2bGx4XG4iLCBtLT5zdGF0dXMpOwogCisJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfQUREUlYpCisJCXByX2VtZXJnKEhXX0VSUiAiXHRNQyVkX0FERFI6IDB4JTAxNmxseFxuIiwgbS0+YmFuaywgbS0+YWRkcik7CiAKIAlzd2l0Y2ggKG0tPmJhbmspIHsKIAljYXNlIDA6CkBAIC04MTEsOCArNzk2LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIDQ6Ci0JCW5vZGUgPSBhbWRfZ2V0X25iX2lkKG0tPmV4dGNwdSk7Ci0JCWFtZF9kZWNvZGVfbmJfbWNlKG5vZGUsIG0sIDApOworCQlhbWRfZGVjb2RlX25iX21jZShtKTsKIAkJYnJlYWs7CiAKIAljYXNlIDU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbWNlX2FtZC5oIGIvZHJpdmVycy9lZGFjL21jZV9hbWQuaAppbmRleCA3OTVhMzIwLi4wMTA2NzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbWNlX2FtZC5oCisrKyBiL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmgKQEAgLTg2LDkgKzg2LDkgQEAKIH07CiAKIHZvaWQgYW1kX3JlcG9ydF9nYXJ0X2Vycm9ycyhib29sKTsKLXZvaWQgYW1kX3JlZ2lzdGVyX2VjY19kZWNvZGVyKHZvaWQgKCpmKShpbnQsIHN0cnVjdCBtY2UgKiwgdTMyKSk7Ci12b2lkIGFtZF91bnJlZ2lzdGVyX2VjY19kZWNvZGVyKHZvaWQgKCpmKShpbnQsIHN0cnVjdCBtY2UgKiwgdTMyKSk7Ci12b2lkIGFtZF9kZWNvZGVfbmJfbWNlKGludCwgc3RydWN0IG1jZSAqLCB1MzIpOwordm9pZCBhbWRfcmVnaXN0ZXJfZWNjX2RlY29kZXIodm9pZCAoKmYpKGludCwgc3RydWN0IG1jZSAqKSk7Cit2b2lkIGFtZF91bnJlZ2lzdGVyX2VjY19kZWNvZGVyKHZvaWQgKCpmKShpbnQsIHN0cnVjdCBtY2UgKikpOwordm9pZCBhbWRfZGVjb2RlX25iX21jZShzdHJ1Y3QgbWNlICopOwogaW50IGFtZF9kZWNvZGVfbWNlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKTsKIAogI2VuZGlmIC8qIF9FREFDX01DRV9BTURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21jZV9hbWRfaW5qLmMgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZF9pbmouYwppbmRleCBhNDk4N2UwLi43M2MzZTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbWNlX2FtZF9pbmouYworKysgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZF9pbmouYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL21jZS5oPgogCiAjaW5jbHVkZSAibWNlX2FtZC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL3BwYzR4eF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvcHBjNHh4X2VkYWMuYwppbmRleCAwZGU3ZDg3Li4zODQwMDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvcHBjNHh4X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvcHBjNHh4X2VkYWMuYwpAQCAtMjA1LDcgKzIwNSw3IEBACiAJLnJlbW92ZQkJCT0gcHBjNHh4X2VkYWNfcmVtb3ZlLAogCS5kcml2ZXIgPSB7CiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkubmFtZSA9IFBQQzRYWF9FREFDX01PRFVMRV9OQU1FCisJCS5uYW1lID0gUFBDNFhYX0VEQUNfTU9EVUxFX05BTUUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IHBwYzR4eF9lZGFjX21hdGNoLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL3NiX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MDJiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMKQEAgLTAsMCArMSwxODkzIEBACisvKiBJbnRlbCBTYW5keSBCcmlkZ2UgLUVOLy1FUC8tRVggTWVtb3J5IENvbnRyb2xsZXIga2VybmVsIG1vZHVsZQorICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBtZW1vcnkgY29udHJvbGxlcnMgZm91bmQgb24gdGhlIEludGVsCisgKiBwcm9jZXNzb3IgZmFtaWx5IFNhbmR5IEJyaWRnZS4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBieToKKyAqCSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tY2UuaD4KKworI2luY2x1ZGUgImVkYWNfY29yZS5oIgorCisvKiBTdGF0aWMgdmFycyAqLworc3RhdGljIExJU1RfSEVBRChzYnJpZGdlX2VkYWNfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKHNicmlkZ2VfZWRhY19sb2NrKTsKK3N0YXRpYyBpbnQgcHJvYmVkOworCisvKgorICogQWx0ZXIgdGhpcyB2ZXJzaW9uIGZvciB0aGUgbW9kdWxlIHdoZW4gbW9kaWZpY2F0aW9ucyBhcmUgbWFkZQorICovCisjZGVmaW5lIFNCUklER0VfUkVWSVNJT04gICAgIiBWZXI6IDEuMC4wICIKKyNkZWZpbmUgRURBQ19NT0RfU1RSICAgICAgInNicmlkZ2VfZWRhYyIKKworLyoKKyAqIERlYnVnIG1hY3JvcworICovCisjZGVmaW5lIHNicmlkZ2VfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikJCQlcCisJZWRhY19wcmludGsobGV2ZWwsICJzYnJpZGdlIiwgZm10LCAjI2FyZykKKworI2RlZmluZSBzYnJpZGdlX21jX3ByaW50ayhtY2ksIGxldmVsLCBmbXQsIGFyZy4uLikJCVwKKwllZGFjX21jX2NoaXBzZXRfcHJpbnRrKG1jaSwgbGV2ZWwsICJzYnJpZGdlIiwgZm10LCAjI2FyZykKKworLyoKKyAqIEdldCBhIGJpdCBmaWVsZCBhdCByZWdpc3RlciB2YWx1ZSA8dj4sIGZyb20gYml0IDxsbz4gdG8gYml0IDxoaT4KKyAqLworI2RlZmluZSBHRVRfQklURklFTEQodiwgbG8sIGhpKQlcCisJKCgodikgJiAoKDFVTEwgPDwgKChoaSkgLSAobG8pICsgMSkpIC0gMSkgPDwgKGxvKSkgPj4gKGxvKSkKKworLyoKKyAqIHNicmlkZ2UgTWVtb3J5IENvbnRyb2xsZXIgUmVnaXN0ZXJzCisgKi8KKworLyoKKyAqIEZJWE1FOiBGb3Igbm93LCBsZXQncyBvcmRlciBieSBkZXZpY2UgZnVuY3Rpb24sIGFzIGl0IG1ha2VzCisgKiBlYXNpZXIgZm9yIGRyaXZlcidzIGRldmVsb3BtZW50IHByb2NjZXNzLiBUaGlzIHRhYmxlIHNob3VsZCBiZQorICogbW92ZWQgdG8gcGNpX2lkLmggd2hlbiBzdWJtaXR0ZWQgdXBzdHJlYW0KKyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfU0FEMAkweDNjZjQJLyogMTIuNiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfU0FEMQkweDNjZjYJLyogMTIuNyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfQlIJCTB4M2NmNQkvKiAxMy42ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfSEEwCTB4M2NhMAkvKiAxNC4wICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfVEEJMHgzY2E4CS8qIDE1LjAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19SQVMJMHgzYzcxCS8qIDE1LjEgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19UQUQwCTB4M2NhYQkvKiAxNS4yICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfVEFEMQkweDNjYWIJLyogMTUuMyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX1RBRDIJMHgzY2FjCS8qIDE1LjQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19UQUQzCTB4M2NhZAkvKiAxNS41ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfRERSSU8JMHgzY2I4CS8qIDE3LjAgKi8KKworCS8qCisJICogQ3VycmVudGx5LCB1bnVzZWQsIGJ1dCB3aWxsIGJlIG5lZWRlZCBpbiB0aGUgZnV0dXJlCisJICogaW1wbGVtZW50YXRpb25zLCBhcyB0aGV5IGhvbGQgdGhlIGVycm9yIGNvdW50ZXJzCisJICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfRVJSMAkweDNjNzIJLyogMTYuMiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX0VSUjEJMHgzYzczCS8qIDE2LjMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19FUlIyCTB4M2M3NgkvKiAxNi42ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfRVJSMwkweDNjNzcJLyogMTYuNyAqLworCisvKiBEZXZpY2VzIDEyIEZ1bmN0aW9uIDYsIE9mZnNldHMgMHg4MCB0byAweGNjICovCitzdGF0aWMgY29uc3QgdTMyIGRyYW1fcnVsZVtdID0geworCTB4ODAsIDB4ODgsIDB4OTAsIDB4OTgsIDB4YTAsCisJMHhhOCwgMHhiMCwgMHhiOCwgMHhjMCwgMHhjOCwKK307CisjZGVmaW5lIE1BWF9TQUQJCUFSUkFZX1NJWkUoZHJhbV9ydWxlKQorCisjZGVmaW5lIFNBRF9MSU1JVChyZWcpCQkoKEdFVF9CSVRGSUVMRChyZWcsIDYsIDI1KSA8PCAyNikgfCAweDNmZmZmZmYpCisjZGVmaW5lIERSQU1fQVRUUihyZWcpCQlHRVRfQklURklFTEQocmVnLCAyLCAgMykKKyNkZWZpbmUgSU5URVJMRUFWRV9NT0RFKHJlZykJR0VUX0JJVEZJRUxEKHJlZywgMSwgIDEpCisjZGVmaW5lIERSQU1fUlVMRV9FTkFCTEUocmVnKQlHRVRfQklURklFTEQocmVnLCAwLCAgMCkKKworc3RhdGljIGNoYXIgKmdldF9kcmFtX2F0dHIodTMyIHJlZykKK3sKKwlzd2l0Y2goRFJBTV9BVFRSKHJlZykpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuICJEUkFNIjsKKwkJY2FzZSAxOgorCQkJcmV0dXJuICJNTUNGRyI7CisJCWNhc2UgMjoKKwkJCXJldHVybiAiTlhNIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdGF0aWMgY29uc3QgdTMyIGludGVybGVhdmVfbGlzdFtdID0geworCTB4ODQsIDB4OGMsIDB4OTQsIDB4OWMsIDB4YTQsCisJMHhhYywgMHhiNCwgMHhiYywgMHhjNCwgMHhjYywKK307CisjZGVmaW5lIE1BWF9JTlRFUkxFQVZFCUFSUkFZX1NJWkUoaW50ZXJsZWF2ZV9saXN0KQorCisjZGVmaW5lIFNBRF9QS0cwKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDAsIDIpCisjZGVmaW5lIFNBRF9QS0cxKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDMsIDUpCisjZGVmaW5lIFNBRF9QS0cyKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDgsIDEwKQorI2RlZmluZSBTQURfUEtHMyhyZWcpCQlHRVRfQklURklFTEQocmVnLCAxMSwgMTMpCisjZGVmaW5lIFNBRF9QS0c0KHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDE2LCAxOCkKKyNkZWZpbmUgU0FEX1BLRzUocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMTksIDIxKQorI2RlZmluZSBTQURfUEtHNihyZWcpCQlHRVRfQklURklFTEQocmVnLCAyNCwgMjYpCisjZGVmaW5lIFNBRF9QS0c3KHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDI3LCAyOSkKKworc3RhdGljIGlubGluZSBpbnQgc2FkX3BrZyh1MzIgcmVnLCBpbnQgaW50ZXJsZWF2ZSkKK3sKKwlzd2l0Y2ggKGludGVybGVhdmUpIHsKKwljYXNlIDA6CisJCXJldHVybiBTQURfUEtHMChyZWcpOworCWNhc2UgMToKKwkJcmV0dXJuIFNBRF9QS0cxKHJlZyk7CisJY2FzZSAyOgorCQlyZXR1cm4gU0FEX1BLRzIocmVnKTsKKwljYXNlIDM6CisJCXJldHVybiBTQURfUEtHMyhyZWcpOworCWNhc2UgNDoKKwkJcmV0dXJuIFNBRF9QS0c0KHJlZyk7CisJY2FzZSA1OgorCQlyZXR1cm4gU0FEX1BLRzUocmVnKTsKKwljYXNlIDY6CisJCXJldHVybiBTQURfUEtHNihyZWcpOworCWNhc2UgNzoKKwkJcmV0dXJuIFNBRF9QS0c3KHJlZyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKiBEZXZpY2VzIDEyIEZ1bmN0aW9uIDcgKi8KKworI2RlZmluZSBUT0xNCQkweDgwCisjZGVmaW5lCVRPSE0JCTB4ODQKKworI2RlZmluZSBHRVRfVE9MTShyZWcpCQkoKEdFVF9CSVRGSUVMRChyZWcsIDAsICAzKSA8PCAyOCkgfCAweDNmZmZmZmYpCisjZGVmaW5lIEdFVF9UT0hNKHJlZykJCSgoR0VUX0JJVEZJRUxEKHJlZywgMCwgMjApIDw8IDI1KSB8IDB4M2ZmZmZmZikKKworLyogRGV2aWNlIDEzIEZ1bmN0aW9uIDYgKi8KKworI2RlZmluZSBTQURfVEFSR0VUCTB4ZjAKKworI2RlZmluZSBTT1VSQ0VfSUQocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgOSwgMTEpCisKKyNkZWZpbmUgU0FEX0NPTlRST0wJMHhmNAorCisjZGVmaW5lIE5PREVfSUQocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMCwgMikKKworLyogRGV2aWNlIDE0IGZ1bmN0aW9uIDAgKi8KKworc3RhdGljIGNvbnN0IHUzMiB0YWRfZHJhbV9ydWxlW10gPSB7CisJMHg0MCwgMHg0NCwgMHg0OCwgMHg0YywKKwkweDUwLCAweDU0LCAweDU4LCAweDVjLAorCTB4NjAsIDB4NjQsIDB4NjgsIDB4NmMsCit9OworI2RlZmluZSBNQVhfVEFECUFSUkFZX1NJWkUodGFkX2RyYW1fcnVsZSkKKworI2RlZmluZSBUQURfTElNSVQocmVnKQkJKChHRVRfQklURklFTEQocmVnLCAxMiwgMzEpIDw8IDI2KSB8IDB4M2ZmZmZmZikKKyNkZWZpbmUgVEFEX1NPQ0socmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMTAsIDExKQorI2RlZmluZSBUQURfQ0gocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgIDgsICA5KQorI2RlZmluZSBUQURfVEdUMyhyZWcpCQlHRVRfQklURklFTEQocmVnLCAgNiwgIDcpCisjZGVmaW5lIFRBRF9UR1QyKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsICA0LCAgNSkKKyNkZWZpbmUgVEFEX1RHVDEocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgIDIsICAzKQorI2RlZmluZSBUQURfVEdUMChyZWcpCQlHRVRfQklURklFTEQocmVnLCAgMCwgIDEpCisKKy8qIERldmljZSAxNSwgZnVuY3Rpb24gMCAqLworCisjZGVmaW5lIE1DTVRSCQkJMHg3YworCisjZGVmaW5lIElTX0VDQ19FTkFCTEVEKG1jbXRyKQkJR0VUX0JJVEZJRUxEKG1jbXRyLCAyLCAyKQorI2RlZmluZSBJU19MT0NLU1RFUF9FTkFCTEVEKG1jbXRyKQlHRVRfQklURklFTEQobWNtdHIsIDEsIDEpCisjZGVmaW5lIElTX0NMT1NFX1BHKG1jbXRyKQkJR0VUX0JJVEZJRUxEKG1jbXRyLCAwLCAwKQorCisvKiBEZXZpY2UgMTUsIGZ1bmN0aW9uIDEgKi8KKworI2RlZmluZSBSQVNFTkFCTEVTCQkweGFjCisjZGVmaW5lIElTX01JUlJPUl9FTkFCTEVEKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDAsIDApCisKKy8qIERldmljZSAxNSwgZnVuY3Rpb25zIDItNSAqLworCitzdGF0aWMgY29uc3QgaW50IG10cl9yZWdzW10gPSB7CisJMHg4MCwgMHg4NCwgMHg4OCwKK307CisKKyNkZWZpbmUgUkFOS19ESVNBQkxFKG10cikJCUdFVF9CSVRGSUVMRChtdHIsIDE2LCAxOSkKKyNkZWZpbmUgSVNfRElNTV9QUkVTRU5UKG10cikJCUdFVF9CSVRGSUVMRChtdHIsIDE0LCAxNCkKKyNkZWZpbmUgUkFOS19DTlRfQklUUyhtdHIpCQlHRVRfQklURklFTEQobXRyLCAxMiwgMTMpCisjZGVmaW5lIFJBTktfV0lEVEhfQklUUyhtdHIpCQlHRVRfQklURklFTEQobXRyLCAyLCA0KQorI2RlZmluZSBDT0xfV0lEVEhfQklUUyhtdHIpCQlHRVRfQklURklFTEQobXRyLCAwLCAxKQorCitzdGF0aWMgY29uc3QgdTMyIHRhZF9jaF9uaWx2X29mZnNldFtdID0geworCTB4OTAsIDB4OTQsIDB4OTgsIDB4OWMsCisJMHhhMCwgMHhhNCwgMHhhOCwgMHhhYywKKwkweGIwLCAweGI0LCAweGI4LCAweGJjLAorfTsKKyNkZWZpbmUgQ0hOX0lEWF9PRkZTRVQocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMjgsIDI5KQorI2RlZmluZSBUQURfT0ZGU0VUKHJlZykJCQkoR0VUX0JJVEZJRUxEKHJlZywgIDYsIDI1KSA8PCAyNikKKworc3RhdGljIGNvbnN0IHUzMiByaXJfd2F5X2xpbWl0W10gPSB7CisJMHgxMDgsIDB4MTBjLCAweDExMCwgMHgxMTQsIDB4MTE4LAorfTsKKyNkZWZpbmUgTUFYX1JJUl9SQU5HRVMgQVJSQVlfU0laRShyaXJfd2F5X2xpbWl0KQorCisjZGVmaW5lIElTX1JJUl9WQUxJRChyZWcpCUdFVF9CSVRGSUVMRChyZWcsIDMxLCAzMSkKKyNkZWZpbmUgUklSX1dBWShyZWcpCQlHRVRfQklURklFTEQocmVnLCAyOCwgMjkpCisjZGVmaW5lIFJJUl9MSU1JVChyZWcpCQkoKEdFVF9CSVRGSUVMRChyZWcsICAxLCAxMCkgPDwgMjkpfCAweDFmZmZmZmZmKQorCisjZGVmaW5lIE1BWF9SSVJfV0FZCTgKKworc3RhdGljIGNvbnN0IHUzMiByaXJfb2Zmc2V0W01BWF9SSVJfUkFOR0VTXVtNQVhfUklSX1dBWV0gPSB7CisJeyAweDEyMCwgMHgxMjQsIDB4MTI4LCAweDEyYywgMHgxMzAsIDB4MTM0LCAweDEzOCwgMHgxM2MgfSwKKwl7IDB4MTQwLCAweDE0NCwgMHgxNDgsIDB4MTRjLCAweDE1MCwgMHgxNTQsIDB4MTU4LCAweDE1YyB9LAorCXsgMHgxNjAsIDB4MTY0LCAweDE2OCwgMHgxNmMsIDB4MTcwLCAweDE3NCwgMHgxNzgsIDB4MTdjIH0sCisJeyAweDE4MCwgMHgxODQsIDB4MTg4LCAweDE4YywgMHgxOTAsIDB4MTk0LCAweDE5OCwgMHgxOWMgfSwKKwl7IDB4MWEwLCAweDFhNCwgMHgxYTgsIDB4MWFjLCAweDFiMCwgMHgxYjQsIDB4MWI4LCAweDFiYyB9LAorfTsKKworI2RlZmluZSBSSVJfUk5LX1RHVChyZWcpCQlHRVRfQklURklFTEQocmVnLCAxNiwgMTkpCisjZGVmaW5lIFJJUl9PRkZTRVQocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgIDIsIDE0KQorCisvKiBEZXZpY2UgMTYsIGZ1bmN0aW9ucyAyLTcgKi8KKworLyoKKyAqIEZJWE1FOiBJbXBsZW1lbnQgdGhlIGVycm9yIGNvdW50IHJlYWRzIGRpcmVjdGx5CisgKi8KKworc3RhdGljIGNvbnN0IHUzMiBjb3JyZXJyY250W10gPSB7CisJMHgxMDQsIDB4MTA4LCAweDEwYywgMHgxMTAsCit9OworCisjZGVmaW5lIFJBTktfT0REX09WKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDMxLCAzMSkKKyNkZWZpbmUgUkFOS19PRERfRVJSX0NOVChyZWcpCQlHRVRfQklURklFTEQocmVnLCAxNiwgMzApCisjZGVmaW5lIFJBTktfRVZFTl9PVihyZWcpCQlHRVRfQklURklFTEQocmVnLCAxNSwgMTUpCisjZGVmaW5lIFJBTktfRVZFTl9FUlJfQ05UKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsICAwLCAxNCkKKworc3RhdGljIGNvbnN0IHUzMiBjb3JyZXJydGhyc2xkW10gPSB7CisJMHgxMWMsIDB4MTIwLCAweDEyNCwgMHgxMjgsCit9OworCisjZGVmaW5lIFJBTktfT0REX0VSUl9USFJTTEQocmVnKQlHRVRfQklURklFTEQocmVnLCAxNiwgMzApCisjZGVmaW5lIFJBTktfRVZFTl9FUlJfVEhSU0xEKHJlZykJR0VUX0JJVEZJRUxEKHJlZywgIDAsIDE0KQorCisKKy8qIERldmljZSAxNywgZnVuY3Rpb24gMCAqLworCisjZGVmaW5lIFJBTktfQ0ZHX0EJCTB4MDMyOAorCisjZGVmaW5lIElTX1JESU1NX0VOQUJMRUQocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMTEsIDExKQorCisvKgorICogc2JyaWRnZSBzdHJ1Y3RzCisgKi8KKworI2RlZmluZSBOVU1fQ0hBTk5FTFMJNAorI2RlZmluZSBNQVhfRElNTVMJMwkJLyogTWF4IERJTU1TIHBlciBjaGFubmVsICovCisKK3N0cnVjdCBzYnJpZGdlX2luZm8geworCXUzMgltY210cjsKK307CisKK3N0cnVjdCBzYnJpZGdlX2NoYW5uZWwgeworCXUzMgkJcmFua3M7CisJdTMyCQlkaW1tczsKK307CisKK3N0cnVjdCBwY2lfaWRfZGVzY3IgeworCWludAkJCWRldjsKKwlpbnQJCQlmdW5jOworCWludCAJCQlkZXZfaWQ7CisJaW50CQkJb3B0aW9uYWw7Cit9OworCitzdHJ1Y3QgcGNpX2lkX3RhYmxlIHsKKwljb25zdCBzdHJ1Y3QgcGNpX2lkX2Rlc2NyCSpkZXNjcjsKKwlpbnQJCQkJbl9kZXZzOworfTsKKworc3RydWN0IHNicmlkZ2VfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJdTgJCQlidXMsIG1jOworCXU4CQkJbm9kZV9pZCwgc291cmNlX2lkOworCXN0cnVjdCBwY2lfZGV2CQkqKnBkZXY7CisJaW50CQkJbl9kZXZzOworCXN0cnVjdCBtZW1fY3RsX2luZm8JKm1jaTsKK307CisKK3N0cnVjdCBzYnJpZGdlX3B2dCB7CisJc3RydWN0IHBjaV9kZXYJCSpwY2lfdGEsICpwY2lfZGRyaW8sICpwY2lfcmFzOworCXN0cnVjdCBwY2lfZGV2CQkqcGNpX3NhZDAsICpwY2lfc2FkMSwgKnBjaV9oYTA7CisJc3RydWN0IHBjaV9kZXYJCSpwY2lfYnI7CisJc3RydWN0IHBjaV9kZXYJCSpwY2lfdGFkW05VTV9DSEFOTkVMU107CisKKwlzdHJ1Y3Qgc2JyaWRnZV9kZXYJKnNicmlkZ2VfZGV2OworCisJc3RydWN0IHNicmlkZ2VfaW5mbwlpbmZvOworCXN0cnVjdCBzYnJpZGdlX2NoYW5uZWwJY2hhbm5lbFtOVU1fQ0hBTk5FTFNdOworCisJaW50IAkJCWNzcm93X21hcFtOVU1fQ0hBTk5FTFNdW01BWF9ESU1NU107CisKKwkvKiBNZW1vcnkgdHlwZSBkZXRlY3Rpb24gKi8KKwlib29sCQkJaXNfbWlycm9yZWQsIGlzX2xvY2tzdGVwLCBpc19jbG9zZV9wZzsKKworCS8qIEZpZm8gZG91YmxlIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgbWNlCQltY2VfZW50cnlbTUNFX0xPR19MRU5dOworCXN0cnVjdCBtY2UJCW1jZV9vdXRlbnRyeVtNQ0VfTE9HX0xFTl07CisKKwkvKiBGaWZvIGluL291dCBjb3VudGVycyAqLworCXVuc2lnbmVkCQltY2VfaW4sIG1jZV9vdXQ7CisKKwkvKiBDb3VudCBpbmRpY2F0b3IgdG8gc2hvdyBlcnJvcnMgbm90IGdvdCAqLworCXVuc2lnbmVkCQltY2Vfb3ZlcnJ1bjsKKworCS8qIE1lbW9yeSBkZXNjcmlwdGlvbiAqLworCXU2NAkJCXRvbG0sIHRvaG07Cit9OworCisjZGVmaW5lIFBDSV9ERVNDUihkZXZpY2UsIGZ1bmN0aW9uLCBkZXZpY2VfaWQpCVwKKwkuZGV2ID0gKGRldmljZSksCQkJXAorCS5mdW5jID0gKGZ1bmN0aW9uKSwJCQlcCisJLmRldl9pZCA9IChkZXZpY2VfaWQpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2lkX2Rlc2NyIHBjaV9kZXZfZGVzY3Jfc2JyaWRnZVtdID0geworCQkvKiBQcm9jZXNzb3IgSG9tZSBBZ2VudCAqLworCXsgUENJX0RFU0NSKDE0LCAwLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX0hBMCkJCX0sCisKKwkJLyogTWVtb3J5IGNvbnRyb2xsZXIgKi8KKwl7IFBDSV9ERVNDUigxNSwgMCwgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19UQSkJCX0sCisJeyBQQ0lfREVTQ1IoMTUsIDEsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfUkFTKQkJfSwKKwl7IFBDSV9ERVNDUigxNSwgMiwgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19UQUQwKQl9LAorCXsgUENJX0RFU0NSKDE1LCAzLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX1RBRDEpCX0sCisJeyBQQ0lfREVTQ1IoMTUsIDQsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfVEFEMikJfSwKKwl7IFBDSV9ERVNDUigxNSwgNSwgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19UQUQzKQl9LAorCXsgUENJX0RFU0NSKDE3LCAwLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX0REUklPKQl9LAorCisJCS8qIFN5c3RlbSBBZGRyZXNzIERlY29kZXIgKi8KKwl7IFBDSV9ERVNDUigxMiwgNiwgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX1NBRDApCQl9LAorCXsgUENJX0RFU0NSKDEyLCA3LCBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfU0FEMSkJCX0sCisKKwkJLyogQnJvYWRjYXN0IFJlZ2lzdGVycyAqLworCXsgUENJX0RFU0NSKDEzLCA2LCBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfQlIpCQl9LAorfTsKKworI2RlZmluZSBQQ0lfSURfVEFCTEVfRU5UUlkoQSkgeyAuZGVzY3I9QSwgLm5fZGV2cyA9IEFSUkFZX1NJWkUoQSkgfQorc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfaWRfdGFibGUgcGNpX2Rldl9kZXNjcl9zYnJpZGdlX3RhYmxlW10gPSB7CisJUENJX0lEX1RBQkxFX0VOVFJZKHBjaV9kZXZfZGVzY3Jfc2JyaWRnZSksCisJezAsfQkJCS8qIDAgdGVybWluYXRlZCBsaXN0LiAqLworfTsKKworLyoKKyAqCXBjaV9kZXZpY2VfaWQJdGFibGUgZm9yIHdoaWNoIGRldmljZXMgd2UgYXJlIGxvb2tpbmcgZm9yCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzYnJpZGdlX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfVEEpfSwKKwl7MCx9CQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlBbmNpbGlhcnkgc3RhdHVzIHJvdXRpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSBpbnQgbnVtcmFuayh1MzIgbXRyKQoreworCWludCByYW5rcyA9ICgxIDw8IFJBTktfQ05UX0JJVFMobXRyKSk7CisKKwlpZiAocmFua3MgPiA0KSB7CisJCWRlYnVnZjAoIkludmFsaWQgbnVtYmVyIG9mIHJhbmtzOiAlZCAobWF4ID0gNCkgcmF3IHZhbHVlID0gJXggKCUwNHgpIiwKKwkJCXJhbmtzLCAodW5zaWduZWQgaW50KVJBTktfQ05UX0JJVFMobXRyKSwgbXRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJhbmtzOworfQorCitzdGF0aWMgaW5saW5lIGludCBudW1yb3codTMyIG10cikKK3sKKwlpbnQgcm93cyA9IChSQU5LX1dJRFRIX0JJVFMobXRyKSArIDEyKTsKKworCWlmIChyb3dzIDwgMTMgfHwgcm93cyA+IDE4KSB7CisJCWRlYnVnZjAoIkludmFsaWQgbnVtYmVyIG9mIHJvd3M6ICVkIChzaG91bGQgYmUgYmV0d2VlbiAxNCBhbmQgMTcpIHJhdyB2YWx1ZSA9ICV4ICglMDR4KSIsCisJCQlyb3dzLCAodW5zaWduZWQgaW50KVJBTktfV0lEVEhfQklUUyhtdHIpLCBtdHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMSA8PCByb3dzOworfQorCitzdGF0aWMgaW5saW5lIGludCBudW1jb2wodTMyIG10cikKK3sKKwlpbnQgY29scyA9IChDT0xfV0lEVEhfQklUUyhtdHIpICsgMTApOworCisJaWYgKGNvbHMgPiAxMikgeworCQlkZWJ1Z2YwKCJJbnZhbGlkIG51bWJlciBvZiBjb2xzOiAlZCAobWF4ID0gNCkgcmF3IHZhbHVlID0gJXggKCUwNHgpIiwKKwkJCWNvbHMsICh1bnNpZ25lZCBpbnQpQ09MX1dJRFRIX0JJVFMobXRyKSwgbXRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDEgPDwgY29sczsKK30KKworc3RhdGljIHN0cnVjdCBzYnJpZGdlX2RldiAqZ2V0X3NicmlkZ2VfZGV2KHU4IGJ1cykKK3sKKwlzdHJ1Y3Qgc2JyaWRnZV9kZXYgKnNicmlkZ2VfZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzYnJpZGdlX2RldiwgJnNicmlkZ2VfZWRhY19saXN0LCBsaXN0KSB7CisJCWlmIChzYnJpZGdlX2Rldi0+YnVzID09IGJ1cykKKwkJCXJldHVybiBzYnJpZGdlX2RldjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBzYnJpZGdlX2RldiAqYWxsb2Nfc2JyaWRnZV9kZXYodTggYnVzLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2lkX3RhYmxlICp0YWJsZSkKK3sKKwlzdHJ1Y3Qgc2JyaWRnZV9kZXYgKnNicmlkZ2VfZGV2OworCisJc2JyaWRnZV9kZXYgPSBremFsbG9jKHNpemVvZigqc2JyaWRnZV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNicmlkZ2VfZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCXNicmlkZ2VfZGV2LT5wZGV2ID0ga3phbGxvYyhzaXplb2YoKnNicmlkZ2VfZGV2LT5wZGV2KSAqIHRhYmxlLT5uX2RldnMsCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYnJpZGdlX2Rldi0+cGRldikgeworCQlrZnJlZShzYnJpZGdlX2Rldik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNicmlkZ2VfZGV2LT5idXMgPSBidXM7CisJc2JyaWRnZV9kZXYtPm5fZGV2cyA9IHRhYmxlLT5uX2RldnM7CisJbGlzdF9hZGRfdGFpbCgmc2JyaWRnZV9kZXYtPmxpc3QsICZzYnJpZGdlX2VkYWNfbGlzdCk7CisKKwlyZXR1cm4gc2JyaWRnZV9kZXY7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfc2JyaWRnZV9kZXYoc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldikKK3sKKwlsaXN0X2RlbCgmc2JyaWRnZV9kZXYtPmxpc3QpOworCWtmcmVlKHNicmlkZ2VfZGV2LT5wZGV2KTsKKwlrZnJlZShzYnJpZGdlX2Rldik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlNZW1vcnkgY2hlY2sgcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpnZXRfcGRldl9zbG90X2Z1bmModTggYnVzLCB1bnNpZ25lZCBzbG90LAorCQkJCQkgIHVuc2lnbmVkIGZ1bmMpCit7CisJc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldiA9IGdldF9zYnJpZGdlX2RldihidXMpOworCWludCBpOworCisJaWYgKCFzYnJpZGdlX2RldikKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2JyaWRnZV9kZXYtPm5fZGV2czsgaSsrKSB7CisJCWlmICghc2JyaWRnZV9kZXYtPnBkZXZbaV0pCisJCQljb250aW51ZTsKKworCQlpZiAoUENJX1NMT1Qoc2JyaWRnZV9kZXYtPnBkZXZbaV0tPmRldmZuKSA9PSBzbG90ICYmCisJCSAgICBQQ0lfRlVOQyhzYnJpZGdlX2Rldi0+cGRldltpXS0+ZGV2Zm4pID09IGZ1bmMpIHsKKwkJCWRlYnVnZjEoIkFzc29jaWF0ZWQgJTAyeC4lMDJ4LiVkIHdpdGggJXBcbiIsCisJCQkJYnVzLCBzbG90LCBmdW5jLCBzYnJpZGdlX2Rldi0+cGRldltpXSk7CisJCQlyZXR1cm4gc2JyaWRnZV9kZXYtPnBkZXZbaV07CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBzYnJpZGdlX2dldF9hY3RpdmVfY2hhbm5lbHMoKSAtIGdldHMgdGhlIG51bWJlciBvZiBjaGFubmVscyBhbmQgY3Nyb3dzCisgKiBidXM6CQlEZXZpY2UgYnVzCisgKiBAY2hhbm5lbHM6CU51bWJlciBvZiBjaGFubmVscyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQKKyAqIEBjc3Jvd3M6CU51bWJlciBvZiBjc3Jvd3MgZm91bmQKKyAqCisgKiBTaW5jZSBFREFDIGNvcmUgbmVlZHMgdG8ga25vdyBpbiBhZHZhbmNlIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNoYW5uZWxzCisgKiBhbmQgY3Nyb3dzLCBpbiBvcmRlciB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNzcm93cy9jaGFubmVscywgaXQgaXMgbmVlZGVkCisgKiB0byBydW4gdHdvIHNpbWlsYXIgc3RlcHMuIEF0IHRoZSBmaXJzdCBzdGVwLCBpbXBsZW1lbnRlZCBvbiB0aGlzIGZ1bmN0aW9uLAorICogaXQgY2hlY2tzIHRoZSBudW1iZXIgb2YgY3Nyb3dzL2NoYW5uZWxzIHByZXNlbnQgYXQgb25lIHNvY2tldCwgaWRlbnRpZmllZAorICogYnkgdGhlIGFzc29jaWF0ZWQgUENJIGJ1cy4KKyAqIHRoaXMgaXMgdXNlZCBpbiBvcmRlciB0byBwcm9wZXJseSBhbGxvY2F0ZSB0aGUgc2l6ZSBvZiBtY2kgY29tcG9uZW50cy4KKyAqIE5vdGU6IG9uZSBjc3JvdyBpcyBvbmUgZGltbS4KKyAqLworc3RhdGljIGludCBzYnJpZGdlX2dldF9hY3RpdmVfY2hhbm5lbHMoY29uc3QgdTggYnVzLCB1bnNpZ25lZCAqY2hhbm5lbHMsCisJCQkJICAgICAgdW5zaWduZWQgKmNzcm93cykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50IGksIGo7CisJdTMyIG1jbXRyOworCisJKmNoYW5uZWxzID0gMDsKKwkqY3Nyb3dzID0gMDsKKworCXBkZXYgPSBnZXRfcGRldl9zbG90X2Z1bmMoYnVzLCAxNSwgMCk7CisJaWYgKCFwZGV2KSB7CisJCXNicmlkZ2VfcHJpbnRrKEtFUk5fRVJSLCAiQ291bGRuJ3QgZmluZCBQQ0kgZGV2aWNlICIKKwkJCQkJIiUyeC4lMDJkLiVkISEhXG4iLAorCQkJCQlidXMsIDE1LCAwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIE1DTVRSLCAmbWNtdHIpOworCWlmICghSVNfRUNDX0VOQUJMRUQobWNtdHIpKSB7CisJCXNicmlkZ2VfcHJpbnRrKEtFUk5fRVJSLCAiRUNDIGlzIGRpc2FibGVkLiBBYm9ydGluZ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgeworCQl1MzIgbXRyOworCisJCS8qIERldmljZSAxNSBmdW5jdGlvbnMgMiAtIDUgICovCisJCXBkZXYgPSBnZXRfcGRldl9zbG90X2Z1bmMoYnVzLCAxNSwgMiArIGkpOworCQlpZiAoIXBkZXYpIHsKKwkJCXNicmlkZ2VfcHJpbnRrKEtFUk5fRVJSLCAiQ291bGRuJ3QgZmluZCBQQ0kgZGV2aWNlICIKKwkJCQkJCSAiJTJ4LiUwMmQuJWQhISFcbiIsCisJCQkJCQkgYnVzLCAxNSwgMiArIGkpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJKCpjaGFubmVscykrKzsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShtdHJfcmVncyk7IGorKykgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIG10cl9yZWdzW2pdLCAmbXRyKTsKKwkJCWRlYnVnZjEoIkJ1cyMlMDJ4IGNoYW5uZWwgIyVkICBNVFIlZCA9ICV4XG4iLCBidXMsIGksIGosIG10cik7CisJCQlpZiAoSVNfRElNTV9QUkVTRU5UKG10cikpCisJCQkJKCpjc3Jvd3MpKys7CisJCX0KKwl9CisKKwlkZWJ1Z2YwKCJOdW1iZXIgb2YgYWN0aXZlIGNoYW5uZWxzOiAlZCwgbnVtYmVyIG9mIGFjdGl2ZSBkaW1tczogJWRcbiIsCisJCSpjaGFubmVscywgKmNzcm93cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZGltbV9jb25maWcoY29uc3Qgc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBzYnJpZGdlX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3NyOworCWludCBpLCBqLCBiYW5rcywgcmFua3MsIHJvd3MsIGNvbHMsIHNpemUsIG5wYWdlczsKKwlpbnQgY3Nyb3cgPSAwOworCXVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlID0gMDsKKwl1MzIgcmVnOworCWVudW0gZWRhY190eXBlIG1vZGU7CisJZW51bSBtZW1fdHlwZSBtdHlwZTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9iciwgU0FEX1RBUkdFVCwgJnJlZyk7CisJcHZ0LT5zYnJpZGdlX2Rldi0+c291cmNlX2lkID0gU09VUkNFX0lEKHJlZyk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfYnIsIFNBRF9DT05UUk9MLCAmcmVnKTsKKwlwdnQtPnNicmlkZ2VfZGV2LT5ub2RlX2lkID0gTk9ERV9JRChyZWcpOworCWRlYnVnZjAoIm1jIyVkOiBOb2RlIElEOiAlZCwgc291cmNlIElEOiAlZFxuIiwKKwkJcHZ0LT5zYnJpZGdlX2Rldi0+bWMsCisJCXB2dC0+c2JyaWRnZV9kZXYtPm5vZGVfaWQsCisJCXB2dC0+c2JyaWRnZV9kZXYtPnNvdXJjZV9pZCk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfcmFzLCBSQVNFTkFCTEVTLCAmcmVnKTsKKwlpZiAoSVNfTUlSUk9SX0VOQUJMRUQocmVnKSkgeworCQlkZWJ1Z2YwKCJNZW1vcnkgbWlycm9yIGlzIGVuYWJsZWRcbiIpOworCQlwdnQtPmlzX21pcnJvcmVkID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlkZWJ1Z2YwKCJNZW1vcnkgbWlycm9yIGlzIGRpc2FibGVkXG4iKTsKKwkJcHZ0LT5pc19taXJyb3JlZCA9IGZhbHNlOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV90YSwgTUNNVFIsICZwdnQtPmluZm8ubWNtdHIpOworCWlmIChJU19MT0NLU1RFUF9FTkFCTEVEKHB2dC0+aW5mby5tY210cikpIHsKKwkJZGVidWdmMCgiTG9ja3N0ZXAgaXMgZW5hYmxlZFxuIik7CisJCW1vZGUgPSBFREFDX1M4RUNEOEVEOworCQlwdnQtPmlzX2xvY2tzdGVwID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlkZWJ1Z2YwKCJMb2Nrc3RlcCBpcyBkaXNhYmxlZFxuIik7CisJCW1vZGUgPSBFREFDX1M0RUNENEVEOworCQlwdnQtPmlzX2xvY2tzdGVwID0gZmFsc2U7CisJfQorCWlmIChJU19DTE9TRV9QRyhwdnQtPmluZm8ubWNtdHIpKSB7CisJCWRlYnVnZjAoImFkZHJlc3MgbWFwIGlzIG9uIGNsb3NlZCBwYWdlIG1vZGVcbiIpOworCQlwdnQtPmlzX2Nsb3NlX3BnID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlkZWJ1Z2YwKCJhZGRyZXNzIG1hcCBpcyBvbiBvcGVuIHBhZ2UgbW9kZVxuIik7CisJCXB2dC0+aXNfY2xvc2VfcGcgPSBmYWxzZTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfdGEsIFJBTktfQ0ZHX0EsICZyZWcpOworCWlmIChJU19SRElNTV9FTkFCTEVEKHJlZykpIHsKKwkJLyogRklYTUU6IENhbiBhbHNvIGJlIExSRElNTSAqLworCQlkZWJ1Z2YwKCJNZW1vcnkgaXMgcmVnaXN0ZXJlZFxuIik7CisJCW10eXBlID0gTUVNX1JERFIzOworCX0gZWxzZSB7CisJCWRlYnVnZjAoIk1lbW9yeSBpcyB1bnJlZ2lzdGVyZWRcbiIpOworCQltdHlwZSA9IE1FTV9ERFIzOworCX0KKworCS8qIE9uIGFsbCBzdXBwb3J0ZWQgRERSMyBESU1NIHR5cGVzLCB0aGVyZSBhcmUgOCBiYW5rcyBhdmFpbGFibGUgKi8KKwliYW5rcyA9IDg7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspIHsKKwkJdTMyIG10cjsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShtdHJfcmVncyk7IGorKykgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3RhZFtpXSwKKwkJCQkJICAgICAgbXRyX3JlZ3Nbal0sICZtdHIpOworCQkJZGVidWdmNCgiQ2hhbm5lbCAjJWQgIE1UUiVkID0gJXhcbiIsIGksIGosIG10cik7CisJCQlpZiAoSVNfRElNTV9QUkVTRU5UKG10cikpIHsKKwkJCQlwdnQtPmNoYW5uZWxbaV0uZGltbXMrKzsKKworCQkJCXJhbmtzID0gbnVtcmFuayhtdHIpOworCQkJCXJvd3MgPSBudW1yb3cobXRyKTsKKwkJCQljb2xzID0gbnVtY29sKG10cik7CisKKwkJCQkvKiBERFIzIGhhcyA4IEkvTyBiYW5rcyAqLworCQkJCXNpemUgPSAocm93cyAqIGNvbHMgKiBiYW5rcyAqIHJhbmtzKSA+PiAoMjAgLSAzKTsKKwkJCQlucGFnZXMgPSBNaUJfVE9fUEFHRVMoc2l6ZSk7CisKKwkJCQlkZWJ1Z2YwKCJtYyMlZDogY2hhbm5lbCAlZCwgZGltbSAlZCwgJWQgTWIgKCVkIHBhZ2VzKSBiYW5rOiAlZCwgcmFuazogJWQsIHJvdzogJSN4LCBjb2w6ICUjeFxuIiwKKwkJCQkJcHZ0LT5zYnJpZGdlX2Rldi0+bWMsIGksIGosCisJCQkJCXNpemUsIG5wYWdlcywKKwkJCQkJYmFua3MsIHJhbmtzLCByb3dzLCBjb2xzKTsKKwkJCQljc3IgPSAmbWNpLT5jc3Jvd3NbY3Nyb3ddOworCisJCQkJY3NyLT5maXJzdF9wYWdlID0gbGFzdF9wYWdlOworCQkJCWNzci0+bGFzdF9wYWdlID0gbGFzdF9wYWdlICsgbnBhZ2VzIC0gMTsKKwkJCQljc3ItPnBhZ2VfbWFzayA9IDBVTDsJLyogVW51c2VkICovCisJCQkJY3NyLT5ucl9wYWdlcyA9IG5wYWdlczsKKwkJCQljc3ItPmdyYWluID0gMzI7CisJCQkJY3NyLT5jc3Jvd19pZHggPSBjc3JvdzsKKwkJCQljc3ItPmR0eXBlID0gKGJhbmtzID09IDgpID8gREVWX1g4IDogREVWX1g0OworCQkJCWNzci0+Y2VfY291bnQgPSAwOworCQkJCWNzci0+dWVfY291bnQgPSAwOworCQkJCWNzci0+bXR5cGUgPSBtdHlwZTsKKwkJCQljc3ItPmVkYWNfbW9kZSA9IG1vZGU7CisJCQkJY3NyLT5ucl9jaGFubmVscyA9IDE7CisJCQkJY3NyLT5jaGFubmVsc1swXS5jaGFuX2lkeCA9IGk7CisJCQkJY3NyLT5jaGFubmVsc1swXS5jZV9jb3VudCA9IDA7CisJCQkJcHZ0LT5jc3Jvd19tYXBbaV1bal0gPSBjc3JvdzsKKwkJCQlzbnByaW50Zihjc3ItPmNoYW5uZWxzWzBdLmxhYmVsLAorCQkJCQkgc2l6ZW9mKGNzci0+Y2hhbm5lbHNbMF0ubGFiZWwpLAorCQkJCQkgIkNQVV9TcmNJRCMldV9DaGFubmVsIyV1X0RJTU0jJXUiLAorCQkJCQkgcHZ0LT5zYnJpZGdlX2Rldi0+c291cmNlX2lkLCBpLCBqKTsKKwkJCQlsYXN0X3BhZ2UgKz0gbnBhZ2VzOworCQkJCWNzcm93Kys7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X21lbW9yeV9sYXlvdXQoY29uc3Qgc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBzYnJpZGdlX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlpbnQgaSwgaiwgaywgbl9zYWRzLCBuX3RhZHMsIHNhZF9pbnRlcmw7CisJdTMyIHJlZzsKKwl1NjQgbGltaXQsIHBydiA9IDA7CisJdTY0IHRtcF9tYjsKKwl1MzIgcmlyX3dheTsKKworCS8qCisJICogU3RlcCAxKSBHZXQgVE9MTS9UT0hNIHJhbmdlcworCSAqLworCisJLyogQWRkcmVzcyByYW5nZSBpcyAzMjoyOCAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9zYWQxLCBUT0xNLAorCQkJICAgICAgJnJlZyk7CisJcHZ0LT50b2xtID0gR0VUX1RPTE0ocmVnKTsKKwl0bXBfbWIgPSAoMSArIHB2dC0+dG9sbSkgPj4gMjA7CisKKwlkZWJ1Z2YwKCJUT0xNOiAlTHUuJTAzTHUgR0IgKDB4JTAxNkx4KVxuIiwKKwkJdG1wX21iIC8gMTAwMCwgdG1wX21iICUgMTAwMCwgKHU2NClwdnQtPnRvbG0pOworCisJLyogQWRkcmVzcyByYW5nZSBpcyBhbHJlYWR5IDQ1OjI1ICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3NhZDEsIFRPSE0sCisJCQkgICAgICAmcmVnKTsKKwlwdnQtPnRvaG0gPSBHRVRfVE9ITShyZWcpOworCXRtcF9tYiA9ICgxICsgcHZ0LT50b2htKSA+PiAyMDsKKworCWRlYnVnZjAoIlRPSE06ICVMdS4lMDNMdSBHQiAoMHglMDE2THgpIiwKKwkJdG1wX21iIC8gMTAwMCwgdG1wX21iICUgMTAwMCwgKHU2NClwdnQtPnRvaG0pOworCisJLyoKKwkgKiBTdGVwIDIpIEdldCBTQUQgcmFuZ2UgYW5kIFNBRCBJbnRlcmxlYXZlIGxpc3QKKwkgKiBUQUQgcmVnaXN0ZXJzIGNvbnRhaW4gdGhlIGludGVybGVhdmUgd2F5bmVzcy4gSG93ZXZlciwgaXQKKwkgKiBzZWVtcyBzaW1wbGVyIHRvIGp1c3QgZGlzY292ZXIgaXQgaW5kaXJlY3RseSwgd2l0aCB0aGUKKwkgKiBhbGdvcml0aG0gYmVsbG93LgorCSAqLworCXBydiA9IDA7CisJZm9yIChuX3NhZHMgPSAwOyBuX3NhZHMgPCBNQVhfU0FEOyBuX3NhZHMrKykgeworCQkvKiBTQURfTElNSVQgQWRkcmVzcyByYW5nZSBpcyA0NToyNiAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfc2FkMCwgZHJhbV9ydWxlW25fc2Fkc10sCisJCQkJICAgICAgJnJlZyk7CisJCWxpbWl0ID0gU0FEX0xJTUlUKHJlZyk7CisKKwkJaWYgKCFEUkFNX1JVTEVfRU5BQkxFKHJlZykpCisJCQljb250aW51ZTsKKworCQlpZiAobGltaXQgPD0gcHJ2KQorCQkJYnJlYWs7CisKKwkJdG1wX21iID0gKGxpbWl0ICsgMSkgPj4gMjA7CisJCWRlYnVnZjAoIlNBRCMlZCAlcyB1cCB0byAlTHUuJTAzTHUgR0IgKDB4JTAxNkx4KSAlcyByZWc9MHglMDh4XG4iLAorCQkJbl9zYWRzLAorCQkJZ2V0X2RyYW1fYXR0cihyZWcpLAorCQkJdG1wX21iIC8gMTAwMCwgdG1wX21iICUgMTAwMCwKKwkJCSgodTY0KXRtcF9tYikgPDwgMjBMLAorCQkJSU5URVJMRUFWRV9NT0RFKHJlZykgPyAiSW50ZXJsZWF2ZTogODo2IiA6ICJJbnRlcmxlYXZlOiBbODo2XVhPUlsxODoxNl0iLAorCQkJcmVnKTsKKwkJcHJ2ID0gbGltaXQ7CisKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3NhZDAsIGludGVybGVhdmVfbGlzdFtuX3NhZHNdLAorCQkJCSAgICAgICZyZWcpOworCQlzYWRfaW50ZXJsID0gc2FkX3BrZyhyZWcsIDApOworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQlpZiAoaiA+IDAgJiYgc2FkX2ludGVybCA9PSBzYWRfcGtnKHJlZywgaikpCisJCQkJYnJlYWs7CisKKwkJCWRlYnVnZjAoIlNBRCMlZCwgaW50ZXJsZWF2ZSAjJWQ6ICVkXG4iLAorCQkJbl9zYWRzLCBqLCBzYWRfcGtnKHJlZywgaikpOworCQl9CisJfQorCisJLyoKKwkgKiBTdGVwIDMpIEdldCBUQUQgcmFuZ2UKKwkgKi8KKwlwcnYgPSAwOworCWZvciAobl90YWRzID0gMDsgbl90YWRzIDwgTUFYX1RBRDsgbl90YWRzKyspIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2hhMCwgdGFkX2RyYW1fcnVsZVtuX3RhZHNdLAorCQkJCSAgICAgICZyZWcpOworCQlsaW1pdCA9IFRBRF9MSU1JVChyZWcpOworCQlpZiAobGltaXQgPD0gcHJ2KQorCQkJYnJlYWs7CisJCXRtcF9tYiA9IChsaW1pdCArIDEpID4+IDIwOworCisJCWRlYnVnZjAoIlRBRCMlZDogdXAgdG8gJUx1LiUwM0x1IEdCICgweCUwMTZMeCksIHNvY2tldCBpbnRlcmxlYXZlICVkLCBtZW1vcnkgaW50ZXJsZWF2ZSAlZCwgVEdUOiAlZCwgJWQsICVkLCAlZCwgcmVnPTB4JTA4eFxuIiwKKwkJCW5fdGFkcywgdG1wX21iIC8gMTAwMCwgdG1wX21iICUgMTAwMCwKKwkJCSgodTY0KXRtcF9tYikgPDwgMjBMLAorCQkJKHUzMilUQURfU09DSyhyZWcpLAorCQkJKHUzMilUQURfQ0gocmVnKSwKKwkJCSh1MzIpVEFEX1RHVDAocmVnKSwKKwkJCSh1MzIpVEFEX1RHVDEocmVnKSwKKwkJCSh1MzIpVEFEX1RHVDIocmVnKSwKKwkJCSh1MzIpVEFEX1RHVDMocmVnKSwKKwkJCXJlZyk7CisJCXBydiA9IHRtcF9tYjsKKwl9CisKKwkvKgorCSAqIFN0ZXAgNCkgR2V0IFRBRCBvZmZzZXRzLCBwZXIgZWFjaCBjaGFubmVsCisJICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DSEFOTkVMUzsgaSsrKSB7CisJCWlmICghcHZ0LT5jaGFubmVsW2ldLmRpbW1zKQorCQkJY29udGludWU7CisJCWZvciAoaiA9IDA7IGogPCBuX3RhZHM7IGorKykgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3RhZFtpXSwKKwkJCQkJICAgICAgdGFkX2NoX25pbHZfb2Zmc2V0W2pdLAorCQkJCQkgICAgICAmcmVnKTsKKwkJCXRtcF9tYiA9IFRBRF9PRkZTRVQocmVnKSA+PiAyMDsKKwkJCWRlYnVnZjAoIlRBRCBDSCMlZCwgb2Zmc2V0ICMlZDogJUx1LiUwM0x1IEdCICgweCUwMTZMeCksIHJlZz0weCUwOHhcbiIsCisJCQkJaSwgaiwKKwkJCQl0bXBfbWIgLyAxMDAwLCB0bXBfbWIgJSAxMDAwLAorCQkJCSgodTY0KXRtcF9tYikgPDwgMjBMLAorCQkJCXJlZyk7CisJCX0KKwl9CisKKwkvKgorCSAqIFN0ZXAgNikgR2V0IFJJUiBXYXluZXNzL0xpbWl0LCBwZXIgZWFjaCBjaGFubmVsCisJICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DSEFOTkVMUzsgaSsrKSB7CisJCWlmICghcHZ0LT5jaGFubmVsW2ldLmRpbW1zKQorCQkJY29udGludWU7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfUklSX1JBTkdFUzsgaisrKSB7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfdGFkW2ldLAorCQkJCQkgICAgICByaXJfd2F5X2xpbWl0W2pdLAorCQkJCQkgICAgICAmcmVnKTsKKworCQkJaWYgKCFJU19SSVJfVkFMSUQocmVnKSkKKwkJCQljb250aW51ZTsKKworCQkJdG1wX21iID0gUklSX0xJTUlUKHJlZykgPj4gMjA7CisJCQlyaXJfd2F5ID0gMSA8PCBSSVJfV0FZKHJlZyk7CisJCQlkZWJ1Z2YwKCJDSCMlZCBSSVIjJWQsIGxpbWl0OiAlTHUuJTAzTHUgR0IgKDB4JTAxNkx4KSwgd2F5OiAlZCwgcmVnPTB4JTA4eFxuIiwKKwkJCQlpLCBqLAorCQkJCXRtcF9tYiAvIDEwMDAsIHRtcF9tYiAlIDEwMDAsCisJCQkJKCh1NjQpdG1wX21iKSA8PCAyMEwsCisJCQkJcmlyX3dheSwKKwkJCQlyZWcpOworCisJCQlmb3IgKGsgPSAwOyBrIDwgcmlyX3dheTsgaysrKSB7CisJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3RhZFtpXSwKKwkJCQkJCSAgICAgIHJpcl9vZmZzZXRbal1ba10sCisJCQkJCQkgICAgICAmcmVnKTsKKwkJCQl0bXBfbWIgPSBSSVJfT0ZGU0VUKHJlZykgPDwgNjsKKworCQkJCWRlYnVnZjAoIkNIIyVkIFJJUiMlZCBJTlRMIyVkLCBvZmZzZXQgJUx1LiUwM0x1IEdCICgweCUwMTZMeCksIHRndDogJWQsIHJlZz0weCUwOHhcbiIsCisJCQkJCWksIGosIGssCisJCQkJCXRtcF9tYiAvIDEwMDAsIHRtcF9tYiAlIDEwMDAsCisJCQkJCSgodTY0KXRtcF9tYikgPDwgMjBMLAorCQkJCQkodTMyKVJJUl9STktfVEdUKHJlZyksCisJCQkJCXJlZyk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0cnVjdCBtZW1fY3RsX2luZm8gKmdldF9tY2lfZm9yX25vZGVfaWQodTggbm9kZV9pZCkKK3sKKwlzdHJ1Y3Qgc2JyaWRnZV9kZXYgKnNicmlkZ2VfZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzYnJpZGdlX2RldiwgJnNicmlkZ2VfZWRhY19saXN0LCBsaXN0KSB7CisJCWlmIChzYnJpZGdlX2Rldi0+bm9kZV9pZCA9PSBub2RlX2lkKQorCQkJcmV0dXJuIHNicmlkZ2VfZGV2LT5tY2k7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGdldF9tZW1vcnlfZXJyb3JfZGF0YShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJIHU2NCBhZGRyLAorCQkJCSB1OCAqc29ja2V0LAorCQkJCSBsb25nICpjaGFubmVsX21hc2ssCisJCQkJIHU4ICpyYW5rLAorCQkJCSBjaGFyICphcmVhX3R5cGUpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbwkqbmV3X21jaTsKKwlzdHJ1Y3Qgc2JyaWRnZV9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJY2hhcgkJCW1zZ1syNTZdOworCWludCAJCQluX3Jpciwgbl9zYWRzLCBuX3RhZHMsIHNhZF93YXksIHNja194Y2g7CisJaW50CQkJc2FkX2ludGVybCwgaWR4LCBiYXNlX2NoOworCWludAkJCWludGVybGVhdmVfbW9kZTsKKwl1bnNpZ25lZAkJc2FkX2ludGVybGVhdmVbTUFYX0lOVEVSTEVBVkVdOworCXUzMgkJCXJlZzsKKwl1OAkJCWNoX3dheSxzY2tfd2F5OworCXUzMgkJCXRhZF9vZmZzZXQ7CisJdTMyCQkJcmlyX3dheTsKKwl1NjQJCQljaF9hZGRyLCBvZmZzZXQsIGxpbWl0LCBwcnYgPSAwOworCisKKwkvKgorCSAqIFN0ZXAgMCkgQ2hlY2sgaWYgdGhlIGFkZHJlc3MgaXMgYXQgc3BlY2lhbCBtZW1vcnkgcmFuZ2VzCisJICogVGhlIGNoZWNrIGJlbGxvdyBpcyBwcm9iYWJseSBlbm91Z2ggdG8gZmlsbCBhbGwgY2FzZXMgd2hlcmUKKwkgKiB0aGUgZXJyb3IgaXMgbm90IGluc2lkZSBhIG1lbW9yeSwgZXhjZXB0IGZvciB0aGUgbGVnYWN5CisJICogcmFuZ2UgKGUuIGcuIFZHQSBhZGRyZXNzZXMpLiBJdCBpcyB1bmxpa2VseSwgaG93ZXZlciwgdGhhdCB0aGUKKwkgKiBtZW1vcnkgY29udHJvbGxlciB3b3VsZCBnZW5lcmF0ZSBhbiBlcnJvciBvbiB0aGF0IHJhbmdlLgorCSAqLworCWlmICgoYWRkciA+ICh1NjQpIHB2dC0+dG9sbSkgJiYgKGFkZHIgPCAoMUwgPDwgMzIpKSkgeworCQlzcHJpbnRmKG1zZywgIkVycm9yIGF0IFRPTE0gYXJlYSwgb24gYWRkciAweCUwOEx4IiwgYWRkcik7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFkZHIgPj0gKHU2NClwdnQtPnRvaG0pIHsKKwkJc3ByaW50Zihtc2csICJFcnJvciBhdCBNTUlPSCBhcmVhLCBvbiBhZGRyIDB4JTAxNkx4IiwgYWRkcik7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFN0ZXAgMSkgR2V0IHNvY2tldAorCSAqLworCWZvciAobl9zYWRzID0gMDsgbl9zYWRzIDwgTUFYX1NBRDsgbl9zYWRzKyspIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3NhZDAsIGRyYW1fcnVsZVtuX3NhZHNdLAorCQkJCSAgICAgICZyZWcpOworCisJCWlmICghRFJBTV9SVUxFX0VOQUJMRShyZWcpKQorCQkJY29udGludWU7CisKKwkJbGltaXQgPSBTQURfTElNSVQocmVnKTsKKwkJaWYgKGxpbWl0IDw9IHBydikgeworCQkJc3ByaW50Zihtc2csICJDYW4ndCBkaXNjb3ZlciB0aGUgbWVtb3J5IHNvY2tldCIpOworCQkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIG1zZyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAgKGFkZHIgPD0gbGltaXQpCisJCQlicmVhazsKKwkJcHJ2ID0gbGltaXQ7CisJfQorCWlmIChuX3NhZHMgPT0gTUFYX1NBRCkgeworCQlzcHJpbnRmKG1zZywgIkNhbid0IGRpc2NvdmVyIHRoZSBtZW1vcnkgc29ja2V0Iik7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXJlYV90eXBlID0gZ2V0X2RyYW1fYXR0cihyZWcpOworCWludGVybGVhdmVfbW9kZSA9IElOVEVSTEVBVkVfTU9ERShyZWcpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3NhZDAsIGludGVybGVhdmVfbGlzdFtuX3NhZHNdLAorCQkJICAgICAgJnJlZyk7CisJc2FkX2ludGVybCA9IHNhZF9wa2cocmVnLCAwKTsKKwlmb3IgKHNhZF93YXkgPSAwOyBzYWRfd2F5IDwgODsgc2FkX3dheSsrKSB7CisJCWlmIChzYWRfd2F5ID4gMCAmJiBzYWRfaW50ZXJsID09IHNhZF9wa2cocmVnLCBzYWRfd2F5KSkKKwkJCWJyZWFrOworCQlzYWRfaW50ZXJsZWF2ZVtzYWRfd2F5XSA9IHNhZF9wa2cocmVnLCBzYWRfd2F5KTsKKwkJZGVidWdmMCgiU0FEIGludGVybGVhdmUgIyVkOiAlZFxuIiwKKwkJCXNhZF93YXksIHNhZF9pbnRlcmxlYXZlW3NhZF93YXldKTsKKwl9CisJZGVidWdmMCgibWMjJWQ6IEVycm9yIGRldGVjdGVkIG9uIFNBRCMlZDogYWRkcmVzcyAweCUwMTZMeCA8IDB4JTAxNkx4LCBJbnRlcmxlYXZlIFslZDo2XSVzXG4iLAorCQlwdnQtPnNicmlkZ2VfZGV2LT5tYywKKwkJbl9zYWRzLAorCQlhZGRyLAorCQlsaW1pdCwKKwkJc2FkX3dheSArIDcsCisJCUlOVEVSTEVBVkVfTU9ERShyZWcpID8gIiIgOiAiWE9SWzE4OjE2XSIpOworCWlmIChpbnRlcmxlYXZlX21vZGUpCisJCWlkeCA9ICgoYWRkciA+PiA2KSBeIChhZGRyID4+IDE2KSkgJiA3OworCWVsc2UKKwkJaWR4ID0gKGFkZHIgPj4gNikgJiA3OworCXN3aXRjaCAoc2FkX3dheSkgeworCWNhc2UgMToKKwkJaWR4ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZHggPSBpZHggJiAxOworCQlicmVhazsKKwljYXNlIDQ6CisJCWlkeCA9IGlkeCAmIDM7CisJCWJyZWFrOworCWNhc2UgODoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3ByaW50Zihtc2csICJDYW4ndCBkaXNjb3ZlciBzb2NrZXQgaW50ZXJsZWF2ZSIpOworCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgbXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCSpzb2NrZXQgPSBzYWRfaW50ZXJsZWF2ZVtpZHhdOworCWRlYnVnZjAoIlNBRCBpbnRlcmxlYXZlIGluZGV4OiAlZCAod2F5bmVzcyAlZCkgPSBDUFUgc29ja2V0ICVkXG4iLAorCQlpZHgsIHNhZF93YXksICpzb2NrZXQpOworCisJLyoKKwkgKiBNb3ZlIHRvIHRoZSBwcm9wZXIgbm9kZSBzdHJ1Y3R1cmUsIGluIG9yZGVyIHRvIGFjY2VzcyB0aGUKKwkgKiByaWdodCBQQ0kgcmVnaXN0ZXJzCisJICovCisJbmV3X21jaSA9IGdldF9tY2lfZm9yX25vZGVfaWQoKnNvY2tldCk7CisJaWYgKCFuZXdfbWNpKSB7CisJCXNwcmludGYobXNnLCAiU3RydWN0IGZvciBzb2NrZXQgIyV1IHdhc24ndCBpbml0aWFsaXplZCIsCisJCQkqc29ja2V0KTsKKwkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIG1zZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltY2kgPSBuZXdfbWNpOworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwkvKgorCSAqIFN0ZXAgMikgR2V0IG1lbW9yeSBjaGFubmVsCisJICovCisJcHJ2ID0gMDsKKwlmb3IgKG5fdGFkcyA9IDA7IG5fdGFkcyA8IE1BWF9UQUQ7IG5fdGFkcysrKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9oYTAsIHRhZF9kcmFtX3J1bGVbbl90YWRzXSwKKwkJCQkgICAgICAmcmVnKTsKKwkJbGltaXQgPSBUQURfTElNSVQocmVnKTsKKwkJaWYgKGxpbWl0IDw9IHBydikgeworCQkJc3ByaW50Zihtc2csICJDYW4ndCBkaXNjb3ZlciB0aGUgbWVtb3J5IGNoYW5uZWwiKTsKKwkJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBtc2cpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgIChhZGRyIDw9IGxpbWl0KQorCQkJYnJlYWs7CisJCXBydiA9IGxpbWl0OworCX0KKwljaF93YXkgPSBUQURfQ0gocmVnKSArIDE7CisJc2NrX3dheSA9IFRBRF9TT0NLKHJlZykgKyAxOworCS8qCisJICogRklYTUU6IElzIGl0IHJpZ2h0IHRvIGFsd2F5cyB1c2UgY2hhbm5lbCAwIGZvciBvZmZzZXRzPworCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV90YWRbMF0sCisJCQkJdGFkX2NoX25pbHZfb2Zmc2V0W25fdGFkc10sCisJCQkJJnRhZF9vZmZzZXQpOworCisJaWYgKGNoX3dheSA9PSAzKQorCQlpZHggPSBhZGRyID4+IDY7CisJZWxzZQorCQlpZHggPSBhZGRyID4+ICg2ICsgc2NrX3dheSk7CisJaWR4ID0gaWR4ICUgY2hfd2F5OworCisJLyoKKwkgKiBGSVhNRTogU2hvdWxkbid0IHdlIHVzZSBDSE5fSURYX09GRlNFVCgpIGhlcmUsIHdoZW4gY2hfd2F5ID09IDMgPz8/CisJICovCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIDA6CisJCWJhc2VfY2ggPSBUQURfVEdUMChyZWcpOworCQlicmVhazsKKwljYXNlIDE6CisJCWJhc2VfY2ggPSBUQURfVEdUMShyZWcpOworCQlicmVhazsKKwljYXNlIDI6CisJCWJhc2VfY2ggPSBUQURfVEdUMihyZWcpOworCQlicmVhazsKKwljYXNlIDM6CisJCWJhc2VfY2ggPSBUQURfVEdUMyhyZWcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcHJpbnRmKG1zZywgIkNhbid0IGRpc2NvdmVyIHRoZSBUQUQgdGFyZ2V0Iik7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJKmNoYW5uZWxfbWFzayA9IDEgPDwgYmFzZV9jaDsKKworCWlmIChwdnQtPmlzX21pcnJvcmVkKSB7CisJCSpjaGFubmVsX21hc2sgfD0gMSA8PCAoKGJhc2VfY2ggKyAyKSAlIDQpOworCQlzd2l0Y2goY2hfd2F5KSB7CisJCWNhc2UgMjoKKwkJY2FzZSA0OgorCQkJc2NrX3hjaCA9IDEgPDwgc2NrX3dheSAqIChjaF93YXkgPj4gMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYobXNnLCAiSW52YWxpZCBtaXJyb3Igc2V0LiBDYW4ndCBkZWNvZGUgYWRkciIpOworCQkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIG1zZyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZQorCQlzY2tfeGNoID0gKDEgPDwgc2NrX3dheSkgKiBjaF93YXk7CisKKwlpZiAocHZ0LT5pc19sb2Nrc3RlcCkKKwkJKmNoYW5uZWxfbWFzayB8PSAxIDw8ICgoYmFzZV9jaCArIDEpICUgNCk7CisKKwlvZmZzZXQgPSBUQURfT0ZGU0VUKHRhZF9vZmZzZXQpOworCisJZGVidWdmMCgiVEFEIyVkOiBhZGRyZXNzIDB4JTAxNkx4IDwgMHglMDE2THgsIHNvY2tldCBpbnRlcmxlYXZlICVkLCBjaGFubmVsIGludGVybGVhdmUgJWQgKG9mZnNldCAweCUwOEx4KSwgaW5kZXggJWQsIGJhc2UgY2g6ICVkLCBjaCBtYXNrOiAweCUwMmx4XG4iLAorCQluX3RhZHMsCisJCWFkZHIsCisJCWxpbWl0LAorCQkodTMyKVRBRF9TT0NLKHJlZyksCisJCWNoX3dheSwKKwkJb2Zmc2V0LAorCQlpZHgsCisJCWJhc2VfY2gsCisJCSpjaGFubmVsX21hc2spOworCisJLyogQ2FsY3VsYXRlIGNoYW5uZWwgYWRkcmVzcyAqLworCS8qIFJlbW92ZSB0aGUgVEFEIG9mZnNldCAqLworCisJaWYgKG9mZnNldCA+IGFkZHIpIHsKKwkJc3ByaW50Zihtc2csICJDYW4ndCBjYWxjdWxhdGUgY2ggYWRkcjogVEFEIG9mZnNldCAweCUwOEx4IGlzIHRvbyBoaWdoIGZvciBhZGRyIDB4JTA4THghIiwKKwkJCW9mZnNldCwgYWRkcik7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYWRkciAtPSBvZmZzZXQ7CisJLyogU3RvcmUgdGhlIGxvdyBiaXRzIFswOjZdIG9mIHRoZSBhZGRyICovCisJY2hfYWRkciA9IGFkZHIgJiAweDdmOworCS8qIFJlbW92ZSBzb2NrZXQgd2F5bmVzcyBhbmQgcmVtb3ZlIDYgYml0cyAqLworCWFkZHIgPj49IDY7CisJYWRkciAvPSBzY2tfeGNoOworI2lmIDAKKwkvKiBEaXZpZGUgYnkgY2hhbm5lbCB3YXkgKi8KKwlhZGRyID0gYWRkciAvIGNoX3dheTsKKyNlbmRpZgorCS8qIFJlY292ZXIgdGhlIGxhc3QgNiBiaXRzICovCisJY2hfYWRkciB8PSBhZGRyIDw8IDY7CisKKwkvKgorCSAqIFN0ZXAgMykgRGVjb2RlIHJhbmsKKwkgKi8KKwlmb3IgKG5fcmlyID0gMDsgbl9yaXIgPCBNQVhfUklSX1JBTkdFUzsgbl9yaXIrKykgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfdGFkW2Jhc2VfY2hdLAorCQkJCSAgICAgIHJpcl93YXlfbGltaXRbbl9yaXJdLAorCQkJCSAgICAgICZyZWcpOworCisJCWlmICghSVNfUklSX1ZBTElEKHJlZykpCisJCQljb250aW51ZTsKKworCQlsaW1pdCA9IFJJUl9MSU1JVChyZWcpOworCisJCWRlYnVnZjAoIlJJUiMlZCwgbGltaXQ6ICVMdS4lMDNMdSBHQiAoMHglMDE2THgpLCB3YXk6ICVkXG4iLAorCQkJbl9yaXIsCisJCQkobGltaXQgPj4gMjApIC8gMTAwMCwgKGxpbWl0ID4+IDIwKSAlIDEwMDAsCisJCQlsaW1pdCwKKwkJCTEgPDwgUklSX1dBWShyZWcpKTsKKwkJaWYgIChjaF9hZGRyIDw9IGxpbWl0KQorCQkJYnJlYWs7CisJfQorCWlmIChuX3JpciA9PSBNQVhfUklSX1JBTkdFUykgeworCQlzcHJpbnRmKG1zZywgIkNhbid0IGRpc2NvdmVyIHRoZSBtZW1vcnkgcmFuayBmb3IgY2ggYWRkciAweCUwOEx4IiwKKwkJCWNoX2FkZHIpOworCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgbXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJpcl93YXkgPSBSSVJfV0FZKHJlZyk7CisJaWYgKHB2dC0+aXNfY2xvc2VfcGcpCisJCWlkeCA9IChjaF9hZGRyID4+IDYpOworCWVsc2UKKwkJaWR4ID0gKGNoX2FkZHIgPj4gMTMpOwkvKiBGSVhNRTogRGF0YXNoZWV0IHNheXMgdG8gc2hpZnQgYnkgMTUgKi8KKwlpZHggJT0gMSA8PCByaXJfd2F5OworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3RhZFtiYXNlX2NoXSwKKwkJCSAgICAgIHJpcl9vZmZzZXRbbl9yaXJdW2lkeF0sCisJCQkgICAgICAmcmVnKTsKKwkqcmFuayA9IFJJUl9STktfVEdUKHJlZyk7CisKKwlkZWJ1Z2YwKCJSSVIjJWQ6IGNoYW5uZWwgYWRkcmVzcyAweCUwOEx4IDwgMHglMDhMeCwgUklSIGludGVybGVhdmUgJWQsIGluZGV4ICVkXG4iLAorCQluX3JpciwKKwkJY2hfYWRkciwKKwkJbGltaXQsCisJCXJpcl93YXksCisJCWlkeCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlEZXZpY2UgaW5pdGlhbGl6YXRpb24gcm91dGluZXM6IHB1dC9nZXQsIGluaXQvZXhpdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglzYnJpZGdlX3B1dF9hbGxfZGV2aWNlcwkncHV0JyBhbGwgdGhlIGRldmljZXMgdGhhdCB3ZSBoYXZlCisgKgkJCQlyZXNlcnZlZCB2aWEgJ2dldCcKKyAqLworc3RhdGljIHZvaWQgc2JyaWRnZV9wdXRfZGV2aWNlcyhzdHJ1Y3Qgc2JyaWRnZV9kZXYgKnNicmlkZ2VfZGV2KQoreworCWludCBpOworCisJZGVidWdmMChfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IHNicmlkZ2VfZGV2LT5uX2RldnM7IGkrKykgeworCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHNicmlkZ2VfZGV2LT5wZGV2W2ldOworCQlpZiAoIXBkZXYpCisJCQljb250aW51ZTsKKwkJZGVidWdmMCgiUmVtb3ZpbmcgZGV2ICUwMng6JTAyeC4lZFxuIiwKKwkJCXBkZXYtPmJ1cy0+bnVtYmVyLAorCQkJUENJX1NMT1QocGRldi0+ZGV2Zm4pLCBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOworCQlwY2lfZGV2X3B1dChwZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNicmlkZ2VfcHV0X2FsbF9kZXZpY2VzKHZvaWQpCit7CisJc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldiwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzYnJpZGdlX2RldiwgdG1wLCAmc2JyaWRnZV9lZGFjX2xpc3QsIGxpc3QpIHsKKwkJc2JyaWRnZV9wdXRfZGV2aWNlcyhzYnJpZGdlX2Rldik7CisJCWZyZWVfc2JyaWRnZV9kZXYoc2JyaWRnZV9kZXYpOworCX0KK30KKworLyoKKyAqCXNicmlkZ2VfZ2V0X2FsbF9kZXZpY2VzCUZpbmQgYW5kIHBlcmZvcm0gJ2dldCcgb3BlcmF0aW9uIG9uIHRoZSBNQ0gncworICoJCQlkZXZpY2UvZnVuY3Rpb25zIHdlIHdhbnQgdG8gcmVmZXJlbmNlIGZvciB0aGlzIGRyaXZlcgorICoKKyAqCQkJTmVlZCB0byAnZ2V0JyBkZXZpY2UgMTYgZnVuYyAxIGFuZCBmdW5jIDIKKyAqLworc3RhdGljIGludCBzYnJpZGdlX2dldF9vbmVkZXZpY2Uoc3RydWN0IHBjaV9kZXYgKipwcmV2LAorCQkJCSB1OCAqbnVtX21jLAorCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2lkX3RhYmxlICp0YWJsZSwKKwkJCQkgY29uc3QgdW5zaWduZWQgZGV2bm8pCit7CisJc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldjsKKwljb25zdCBzdHJ1Y3QgcGNpX2lkX2Rlc2NyICpkZXZfZGVzY3IgPSAmdGFibGUtPmRlc2NyW2Rldm5vXTsKKworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwl1OCBidXMgPSAwOworCisJc2JyaWRnZV9wcmludGsoS0VSTl9JTkZPLAorCQkiU2Vla2luZyBmb3I6IGRldiAlMDJ4LiVkIFBDSSBJRCAlMDR4OiUwNHhcbiIsCisJCWRldl9kZXNjci0+ZGV2LCBkZXZfZGVzY3ItPmZ1bmMsCisJCVBDSV9WRU5ET1JfSURfSU5URUwsIGRldl9kZXNjci0+ZGV2X2lkKTsKKworCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJICAgICAgZGV2X2Rlc2NyLT5kZXZfaWQsICpwcmV2KTsKKworCWlmICghcGRldikgeworCQlpZiAoKnByZXYpIHsKKwkJCSpwcmV2ID0gcGRldjsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGRldl9kZXNjci0+b3B0aW9uYWwpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZGV2bm8gPT0gMCkKKwkJCXJldHVybiAtRU5PREVWOworCisJCXNicmlkZ2VfcHJpbnRrKEtFUk5fSU5GTywKKwkJCSJEZXZpY2Ugbm90IGZvdW5kOiBkZXYgJTAyeC4lZCBQQ0kgSUQgJTA0eDolMDR4XG4iLAorCQkJZGV2X2Rlc2NyLT5kZXYsIGRldl9kZXNjci0+ZnVuYywKKwkJCVBDSV9WRU5ET1JfSURfSU5URUwsIGRldl9kZXNjci0+ZGV2X2lkKTsKKworCQkvKiBFbmQgb2YgbGlzdCwgbGVhdmUgKi8KKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWJ1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCisJc2JyaWRnZV9kZXYgPSBnZXRfc2JyaWRnZV9kZXYoYnVzKTsKKwlpZiAoIXNicmlkZ2VfZGV2KSB7CisJCXNicmlkZ2VfZGV2ID0gYWxsb2Nfc2JyaWRnZV9kZXYoYnVzLCB0YWJsZSk7CisJCWlmICghc2JyaWRnZV9kZXYpIHsKKwkJCXBjaV9kZXZfcHV0KHBkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJKCpudW1fbWMpKys7CisJfQorCisJaWYgKHNicmlkZ2VfZGV2LT5wZGV2W2Rldm5vXSkgeworCQlzYnJpZGdlX3ByaW50ayhLRVJOX0VSUiwKKwkJCSJEdXBsaWNhdGVkIGRldmljZSBmb3IgIgorCQkJImRldiAlMDJ4OiVkLiVkIFBDSSBJRCAlMDR4OiUwNHhcbiIsCisJCQlidXMsIGRldl9kZXNjci0+ZGV2LCBkZXZfZGVzY3ItPmZ1bmMsCisJCQlQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZfZGVzY3ItPmRldl9pZCk7CisJCXBjaV9kZXZfcHV0KHBkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzYnJpZGdlX2Rldi0+cGRldltkZXZub10gPSBwZGV2OworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKHVubGlrZWx5KFBDSV9TTE9UKHBkZXYtPmRldmZuKSAhPSBkZXZfZGVzY3ItPmRldiB8fAorCQkJUENJX0ZVTkMocGRldi0+ZGV2Zm4pICE9IGRldl9kZXNjci0+ZnVuYykpIHsKKwkJc2JyaWRnZV9wcmludGsoS0VSTl9FUlIsCisJCQkiRGV2aWNlIFBDSSBJRCAlMDR4OiUwNHggIgorCQkJImhhcyBkZXYgJTAyeDolZC4lZCBpbnN0ZWFkIG9mIGRldiAlMDJ4OiUwMnguJWRcbiIsCisJCQlQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZfZGVzY3ItPmRldl9pZCwKKwkJCWJ1cywgUENJX1NMT1QocGRldi0+ZGV2Zm4pLCBQQ0lfRlVOQyhwZGV2LT5kZXZmbiksCisJCQlidXMsIGRldl9kZXNjci0+ZGV2LCBkZXZfZGVzY3ItPmZ1bmMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBCZSBzdXJlIHRoYXQgdGhlIGRldmljZSBpcyBlbmFibGVkICovCisJaWYgKHVubGlrZWx5KHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpIDwgMCkpIHsKKwkJc2JyaWRnZV9wcmludGsoS0VSTl9FUlIsCisJCQkiQ291bGRuJ3QgZW5hYmxlICIKKwkJCSJkZXYgJTAyeDolZC4lZCBQQ0kgSUQgJTA0eDolMDR4XG4iLAorCQkJYnVzLCBkZXZfZGVzY3ItPmRldiwgZGV2X2Rlc2NyLT5mdW5jLAorCQkJUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGV2X2Rlc2NyLT5kZXZfaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZWJ1Z2YwKCJEZXRlY3RlZCBkZXYgJTAyeDolZC4lZCBQQ0kgSUQgJTA0eDolMDR4XG4iLAorCQlidXMsIGRldl9kZXNjci0+ZGV2LAorCQlkZXZfZGVzY3ItPmZ1bmMsCisJCVBDSV9WRU5ET1JfSURfSU5URUwsIGRldl9kZXNjci0+ZGV2X2lkKTsKKworCS8qCisJICogQXMgc3RhdGVkIG9uIGRyaXZlcnMvcGNpL3NlYXJjaC5jLCB0aGUgcmVmZXJlbmNlIGNvdW50IGZvcgorCSAqIEBmcm9tIGlzIGFsd2F5cyBkZWNyZW1lbnRlZCBpZiBpdCBpcyBub3QgJU5VTEwuIFNvLCBhcyB3ZSBuZWVkCisJICogdG8gZ2V0IGFsbCBkZXZpY2VzIHVwIHRvIG51bGwsIHdlIG5lZWQgdG8gZG8gYSBnZXQgZm9yIHRoZSBkZXZpY2UKKwkgKi8KKwlwY2lfZGV2X2dldChwZGV2KTsKKworCSpwcmV2ID0gcGRldjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNicmlkZ2VfZ2V0X2FsbF9kZXZpY2VzKHU4ICpudW1fbWMpCit7CisJaW50IGksIHJjOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgcGNpX2lkX3RhYmxlICp0YWJsZSA9IHBjaV9kZXZfZGVzY3Jfc2JyaWRnZV90YWJsZTsKKworCXdoaWxlICh0YWJsZSAmJiB0YWJsZS0+ZGVzY3IpIHsKKwkJZm9yIChpID0gMDsgaSA8IHRhYmxlLT5uX2RldnM7IGkrKykgeworCQkJcGRldiA9IE5VTEw7CisJCQlkbyB7CisJCQkJcmMgPSBzYnJpZGdlX2dldF9vbmVkZXZpY2UoJnBkZXYsIG51bV9tYywKKwkJCQkJCQkgICB0YWJsZSwgaSk7CisJCQkJaWYgKHJjIDwgMCkgeworCQkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCQlpID0gdGFibGUtPm5fZGV2czsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXNicmlkZ2VfcHV0X2FsbF9kZXZpY2VzKCk7CisJCQkJCXJldHVybiAtRU5PREVWOworCQkJCX0KKwkJCX0gd2hpbGUgKHBkZXYpOworCQl9CisJCXRhYmxlKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNpX2JpbmRfZGV2cyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkgc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldikKK3sKKwlzdHJ1Y3Qgc2JyaWRnZV9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJaW50IGksIGZ1bmMsIHNsb3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2JyaWRnZV9kZXYtPm5fZGV2czsgaSsrKSB7CisJCXBkZXYgPSBzYnJpZGdlX2Rldi0+cGRldltpXTsKKwkJaWYgKCFwZGV2KQorCQkJY29udGludWU7CisJCXNsb3QgPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisJCWZ1bmMgPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7CisJCXN3aXRjaCAoc2xvdCkgeworCQljYXNlIDEyOgorCQkJc3dpdGNoIChmdW5jKSB7CisJCQljYXNlIDY6CisJCQkJcHZ0LT5wY2lfc2FkMCA9IHBkZXY7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJcHZ0LT5wY2lfc2FkMSA9IHBkZXY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxMzoKKwkJCXN3aXRjaCAoZnVuYykgeworCQkJY2FzZSA2OgorCQkJCXB2dC0+cGNpX2JyID0gcGRldjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE0OgorCQkJc3dpdGNoIChmdW5jKSB7CisJCQljYXNlIDA6CisJCQkJcHZ0LT5wY2lfaGEwID0gcGRldjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE1OgorCQkJc3dpdGNoIChmdW5jKSB7CisJCQljYXNlIDA6CisJCQkJcHZ0LT5wY2lfdGEgPSBwZGV2OworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXB2dC0+cGNpX3JhcyA9IHBkZXY7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQljYXNlIDM6CisJCQljYXNlIDQ6CisJCQljYXNlIDU6CisJCQkJcHZ0LT5wY2lfdGFkW2Z1bmMgLSAyXSA9IHBkZXY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxNzoKKwkJCXN3aXRjaCAoZnVuYykgeworCQkJY2FzZSAwOgorCQkJCXB2dC0+cGNpX2RkcmlvID0gcGRldjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWRlYnVnZjAoIkFzc29jaWF0ZWQgUENJICUwMnguJTAyZC4lZCB3aXRoIGRldiA9ICVwXG4iLAorCQkJc2JyaWRnZV9kZXYtPmJ1cywKKwkJCVBDSV9TTE9UKHBkZXYtPmRldmZuKSwgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLAorCQkJcGRldik7CisJfQorCisJLyogQ2hlY2sgaWYgZXZlcnl0aGluZyB3ZXJlIHJlZ2lzdGVyZWQgKi8KKwlpZiAoIXB2dC0+cGNpX3NhZDAgfHwgIXB2dC0+cGNpX3NhZDEgfHwgIXB2dC0+cGNpX2hhMCB8fAorCSAgICAhcHZ0LT4gcGNpX3RhZCB8fCAhcHZ0LT5wY2lfcmFzICB8fCAhcHZ0LT5wY2lfdGEgfHwKKwkgICAgIXB2dC0+cGNpX2RkcmlvKQorCQlnb3RvIGVub2RldjsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgeworCQlpZiAoIXB2dC0+cGNpX3RhZFtpXSkKKwkJCWdvdG8gZW5vZGV2OworCX0KKwlyZXR1cm4gMDsKKworZW5vZGV2OgorCXNicmlkZ2VfcHJpbnRrKEtFUk5fRVJSLCAiU29tZSBuZWVkZWQgZGV2aWNlcyBhcmUgbWlzc2luZ1xuIik7CisJcmV0dXJuIC1FTk9ERVY7CisKK2Vycm9yOgorCXNicmlkZ2VfcHJpbnRrKEtFUk5fRVJSLCAiRGV2aWNlICVkLCBmdW5jdGlvbiAlZCAiCisJCSAgICAgICJpcyBvdXQgb2YgdGhlIGV4cGVjdGVkIHJhbmdlXG4iLAorCQkgICAgICBzbG90LCBmdW5jKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCUVycm9yIGNoZWNrIHJvdXRpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFdoaWxlIFNhbmR5IEJyaWRnZSBoYXMgZXJyb3IgY291bnQgcmVnaXN0ZXJzLCBTTUkgQklPUyByZWFkIHZhbHVlcyBmcm9tCisgKiBhbmQgcmVzZXRzIHRoZSBjb3VudGVycy4gU28sIHRoZXkgYXJlIG5vdCByZWxpYWJsZSBmb3IgdGhlIE9TIHRvIHJlYWQKKyAqIGZyb20gdGhlbS4gU28sIHdlIGhhdmUgbm8gb3B0aW9uIGJ1dCB0byBqdXN0IHRydXN0IG9uIHdoYXRldmVyIE1DRSBpcworICogdGVsbGluZyB1cyBhYm91dCB0aGUgZXJyb3JzLgorICovCitzdGF0aWMgdm9pZCBzYnJpZGdlX21jZV9vdXRwdXRfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbWNlICptKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm5ld19tY2k7CisJc3RydWN0IHNicmlkZ2VfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCWNoYXIgKnR5cGUsICpvcHR5cGUsICptc2csICpyZWNvdmVyYWJsZV9tc2c7CisJYm9vbCByaXB2ID0gR0VUX0JJVEZJRUxEKG0tPm1jZ3N0YXR1cywgMCwgMCk7CisJYm9vbCBvdmVyZmxvdyA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDYyLCA2Mik7CisJYm9vbCB1bmNvcnJlY3RlZF9lcnJvciA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDYxLCA2MSk7CisJYm9vbCByZWNvdmVyYWJsZSA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDU2LCA1Nik7CisJdTMyIGNvcmVfZXJyX2NudCA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDM4LCA1Mik7CisJdTMyIG1zY29kID0gR0VUX0JJVEZJRUxEKG0tPnN0YXR1cywgMTYsIDMxKTsKKwl1MzIgZXJyY29kZSA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDAsIDE1KTsKKwl1MzIgY2hhbm5lbCA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDAsIDMpOworCXUzMiBvcHR5cGVudW0gPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCA0LCA2KTsKKwlsb25nIGNoYW5uZWxfbWFzaywgZmlyc3RfY2hhbm5lbDsKKwl1OCAgcmFuaywgc29ja2V0OworCWludCBjc3JvdywgcmMsIGRpbW07CisJY2hhciAqYXJlYV90eXBlID0gIlVua25vd24iOworCisJaWYgKHJpcHYpCisJCXR5cGUgPSAiTk9OX0ZBVEFMIjsKKwllbHNlCisJCXR5cGUgPSAiRkFUQUwiOworCisJLyoKKwkgKiBBY2NvcmRpbmcgd2l0aCBUYWJsZSAxNS05IG9mIHRoZSBJbnRlbCBBcmNoaWN0ZWN0dXJlIHNwZWMgdm9sIDNBLAorCSAqIG1lbW9yeSBlcnJvcnMgc2hvdWxkIGZpdCBpbiB0aGlzIG1hc2s6CisJICoJMDAwZiAwMDAwIDFtbW0gY2NjYyAoYmluYXJ5KQorCSAqIHdoZXJlOgorCSAqCWYgPSBDb3JyZWN0aW9uIFJlcG9ydCBGaWx0ZXJpbmcgQml0LiBJZiAxLCBzdWJzZXF1ZW50IGVycm9ycworCSAqCSAgICB3b24ndCBiZSBzaG93bgorCSAqCW1tbSA9IGVycm9yIHR5cGUKKwkgKgljY2NjID0gY2hhbm5lbAorCSAqIElmIHRoZSBtYXNrIGRvZXNuJ3QgbWF0Y2gsIHJlcG9ydCBhbiBlcnJvciB0byB0aGUgcGFyc2luZyBsb2dpYworCSAqLworCWlmICghICgoZXJyY29kZSAmIDB4ZWY4MCkgPT0gMHg4MCkpIHsKKwkJb3B0eXBlID0gIkNhbid0IHBhcnNlOiBpdCBpcyBub3QgYSBtZW0iOworCX0gZWxzZSB7CisJCXN3aXRjaCAob3B0eXBlbnVtKSB7CisJCWNhc2UgMDoKKwkJCW9wdHlwZSA9ICJnZW5lcmljIHVuZGVmIHJlcXVlc3QiOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW9wdHlwZSA9ICJtZW1vcnkgcmVhZCI7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJb3B0eXBlID0gIm1lbW9yeSB3cml0ZSI7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJb3B0eXBlID0gImFkZHIvY21kIjsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlvcHR5cGUgPSAibWVtb3J5IHNjcnViYmluZyI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW9wdHlwZSA9ICJyZXNlcnZlZCI7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJjID0gZ2V0X21lbW9yeV9lcnJvcl9kYXRhKG1jaSwgbS0+YWRkciwgJnNvY2tldCwKKwkJCQkgICAmY2hhbm5lbF9tYXNrLCAmcmFuaywgYXJlYV90eXBlKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm47CisJbmV3X21jaSA9IGdldF9tY2lfZm9yX25vZGVfaWQoc29ja2V0KTsKKwlpZiAoIW5ld19tY2kpIHsKKwkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksICJFcnJvcjogc29ja2V0IGdvdCBjb3JydXB0ZWQhIik7CisJCXJldHVybjsKKwl9CisJbWNpID0gbmV3X21jaTsKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJZmlyc3RfY2hhbm5lbCA9IGZpbmRfZmlyc3RfYml0KCZjaGFubmVsX21hc2ssIE5VTV9DSEFOTkVMUyk7CisKKwlpZiAocmFuayA8IDQpCisJCWRpbW0gPSAwOworCWVsc2UgaWYgKHJhbmsgPCA4KQorCQlkaW1tID0gMTsKKwllbHNlCisJCWRpbW0gPSAyOworCisJY3Nyb3cgPSBwdnQtPmNzcm93X21hcFtmaXJzdF9jaGFubmVsXVtkaW1tXTsKKworCWlmICh1bmNvcnJlY3RlZF9lcnJvciAmJiByZWNvdmVyYWJsZSkKKwkJcmVjb3ZlcmFibGVfbXNnID0gIiByZWNvdmVyYWJsZSI7CisJZWxzZQorCQlyZWNvdmVyYWJsZV9tc2cgPSAiIjsKKworCS8qCisJICogRklYTUU6IFdoYXQgc2hvdWxkIHdlIGRvIHdpdGggImNoYW5uZWwiIGluZm9ybWF0aW9uIG9uIG1jZWxvZz8KKwkgKiBQcm9iYWJseSwgd2UgY2FuIGp1c3QgZGlzY2FyZCBpdCwgYXMgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24KKwkgKiBjb21lcyBmcm9tIHRoZSBnZXRfbWVtb3J5X2Vycm9yX2RhdGEoKSBhZGRyZXNzIGRlY29kaW5nCisJICovCisJbXNnID0ga2FzcHJpbnRmKEdGUF9BVE9NSUMsCisJCQkiJWQgJXMgZXJyb3Iocyk6ICVzIG9uICVzIGFyZWEgJXMlczogY3B1PSVkIEVycj0lMDR4OiUwNHggKGNoPSVkKSwgIgorCQkJImFkZHIgPSAweCUwOGxseCA9PiBzb2NrZXQ9JWQsIENoYW5uZWw9JWxkKG1hc2s9JWxkKSwgcmFuaz0lZFxuIiwKKwkJCWNvcmVfZXJyX2NudCwKKwkJCWFyZWFfdHlwZSwKKwkJCW9wdHlwZSwKKwkJCXR5cGUsCisJCQlyZWNvdmVyYWJsZV9tc2csCisJCQlvdmVyZmxvdyA/ICJPVkVSRkxPVyIgOiAiIiwKKwkJCW0tPmNwdSwKKwkJCW1zY29kLCBlcnJjb2RlLAorCQkJY2hhbm5lbCwJCS8qIDExMTFiIG1lYW5zIG5vdCBzcGVjaWZpZWQgKi8KKwkJCShsb25nIGxvbmcpIG0tPmFkZHIsCisJCQlzb2NrZXQsCisJCQlmaXJzdF9jaGFubmVsLAkJLyogVGhpcyBpcyB0aGUgcmVhbCBjaGFubmVsIG9uIFNCICovCisJCQljaGFubmVsX21hc2ssCisJCQlyYW5rKTsKKworCWRlYnVnZjAoIiVzIiwgbXNnKTsKKworCS8qIENhbGwgdGhlIGhlbHBlciB0byBvdXRwdXQgbWVzc2FnZSAqLworCWlmICh1bmNvcnJlY3RlZF9lcnJvcikKKwkJZWRhY19tY19oYW5kbGVfZmJkX3VlKG1jaSwgY3Nyb3csIDAsIDAsIG1zZyk7CisJZWxzZQorCQllZGFjX21jX2hhbmRsZV9mYmRfY2UobWNpLCBjc3JvdywgMCwgbXNnKTsKKworCWtmcmVlKG1zZyk7Cit9CisKKy8qCisgKglzYnJpZGdlX2NoZWNrX2Vycm9yCVJldHJpZXZlIGFuZCBwcm9jZXNzIGVycm9ycyByZXBvcnRlZCBieSB0aGUKKyAqCQkJCWhhcmR3YXJlLiBDYWxsZWQgYnkgdGhlIENvcmUgbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCBzYnJpZGdlX2NoZWNrX2Vycm9yKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3Qgc2JyaWRnZV9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJaW50IGk7CisJdW5zaWduZWQgY291bnQgPSAwOworCXN0cnVjdCBtY2UgKm07CisKKwkvKgorCSAqIE1DRSBmaXJzdCBzdGVwOiBDb3B5IGFsbCBtY2UgZXJyb3JzIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyCisJICogV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBoZXJlLCB0byByZWR1Y2UgdGhlIHJpc2sgb2YKKwkgKiBsb29zaW5nIGFuIGVycm9yLgorCSAqLworCXNtcF9ybWIoKTsKKwljb3VudCA9IChwdnQtPm1jZV9vdXQgKyBNQ0VfTE9HX0xFTiAtIHB2dC0+bWNlX2luKQorCQklIE1DRV9MT0dfTEVOOworCWlmICghY291bnQpCisJCXJldHVybjsKKworCW0gPSBwdnQtPm1jZV9vdXRlbnRyeTsKKwlpZiAocHZ0LT5tY2VfaW4gKyBjb3VudCA+IE1DRV9MT0dfTEVOKSB7CisJCXVuc2lnbmVkIGwgPSBNQ0VfTE9HX0xFTiAtIHB2dC0+bWNlX2luOworCisJCW1lbWNweShtLCAmcHZ0LT5tY2VfZW50cnlbcHZ0LT5tY2VfaW5dLCBzaXplb2YoKm0pICogbCk7CisJCXNtcF93bWIoKTsKKwkJcHZ0LT5tY2VfaW4gPSAwOworCQljb3VudCAtPSBsOworCQltICs9IGw7CisJfQorCW1lbWNweShtLCAmcHZ0LT5tY2VfZW50cnlbcHZ0LT5tY2VfaW5dLCBzaXplb2YoKm0pICogY291bnQpOworCXNtcF93bWIoKTsKKwlwdnQtPm1jZV9pbiArPSBjb3VudDsKKworCXNtcF9ybWIoKTsKKwlpZiAocHZ0LT5tY2Vfb3ZlcnJ1bikgeworCQlzYnJpZGdlX3ByaW50ayhLRVJOX0VSUiwgIkxvc3QgJWQgbWVtb3J5IGVycm9yc1xuIiwKKwkJCSAgICAgIHB2dC0+bWNlX292ZXJydW4pOworCQlzbXBfd21iKCk7CisJCXB2dC0+bWNlX292ZXJydW4gPSAwOworCX0KKworCS8qCisJICogTUNFIHNlY29uZCBzdGVwOiBwYXJzZSBlcnJvcnMgYW5kIGRpc3BsYXkKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJc2JyaWRnZV9tY2Vfb3V0cHV0X2Vycm9yKG1jaSwgJnB2dC0+bWNlX291dGVudHJ5W2ldKTsKK30KKworLyoKKyAqIHNicmlkZ2VfbWNlX2NoZWNrX2Vycm9yCVJlcGxpY2F0ZXMgbWNlbG9nIHJvdXRpbmUgdG8gZ2V0IGVycm9ycworICoJCQkJVGhpcyByb3V0aW5lIHNpbXBseSBxdWV1ZXMgbWNlbG9nIGVycm9ycywgYW5kCisgKgkJCQlyZXR1cm4uIFRoZSBlcnJvciBpdHNlbGYgc2hvdWxkIGJlIGhhbmRsZWQgbGF0ZXIKKyAqCQkJCWJ5IHNicmlkZ2VfY2hlY2tfZXJyb3IuCisgKiBXQVJOSU5HOiBBcyB0aGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCBhdCBOTUkgdGltZSwgZXh0cmEgY2FyZSBzaG91bGQKKyAqIGJlIHRha2VuIHRvIGF2b2lkIGRlYWRsb2NrcywgYW5kIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUuCisgKi8KK3N0YXRpYyBpbnQgc2JyaWRnZV9tY2VfY2hlY2tfZXJyb3Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCisJCQkJICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWNlICptY2UgPSAoc3RydWN0IG1jZSAqKWRhdGE7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCXN0cnVjdCBzYnJpZGdlX3B2dCAqcHZ0OworCisJbWNpID0gZ2V0X21jaV9mb3Jfbm9kZV9pZChtY2UtPnNvY2tldGlkKTsKKwlpZiAoIW1jaSkKKwkJcmV0dXJuIE5PVElGWV9CQUQ7CisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCS8qCisJICogSnVzdCBsZXQgbWNlbG9nIGhhbmRsZSBpdCBpZiB0aGUgZXJyb3IgaXMKKwkgKiBvdXRzaWRlIHRoZSBtZW1vcnkgY29udHJvbGxlci4gQSBtZW1vcnkgZXJyb3IKKwkgKiBpcyBpbmRpY2F0ZWQgYnkgYml0IDcgPSAxIGFuZCBiaXRzID0gOC0xMSwxMy0xNSA9IDAuCisJICogYml0IDEyIGhhcyBhbiBzcGVjaWFsIG1lYW5pbmcuCisJICovCisJaWYgKChtY2UtPnN0YXR1cyAmIDB4ZWZmZikgPj4gNyAhPSAxKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlwcmludGsoInNicmlkZ2U6IEhBTkRMSU5HIE1DRSBNRU1PUlkgRVJST1JcbiIpOworCisJcHJpbnRrKCJDUFUgJWQ6IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uOiAlTHggQmFuayAlZDogJTAxNkx4XG4iLAorCSAgICAgICBtY2UtPmV4dGNwdSwgbWNlLT5tY2dzdGF0dXMsIG1jZS0+YmFuaywgbWNlLT5zdGF0dXMpOworCXByaW50aygiVFNDICVsbHggIiwgbWNlLT50c2MpOworCXByaW50aygiQUREUiAlbGx4ICIsIG1jZS0+YWRkcik7CisJcHJpbnRrKCJNSVNDICVsbHggIiwgbWNlLT5taXNjKTsKKworCXByaW50aygiUFJPQ0VTU09SICV1OiV4IFRJTUUgJWxsdSBTT0NLRVQgJXUgQVBJQyAleFxuIiwKKwkJbWNlLT5jcHV2ZW5kb3IsIG1jZS0+Y3B1aWQsIG1jZS0+dGltZSwKKwkJbWNlLT5zb2NrZXRpZCwgbWNlLT5hcGljaWQpOworCisjaWZkZWYgQ09ORklHX1NNUAorCS8qIE9ubHkgaGFuZGxlIGlmIGl0IGlzIHRoZSByaWdodCBtYyBjb250cm9sbGVyICovCisJaWYgKGNwdV9kYXRhKG1jZS0+Y3B1KS5waHlzX3Byb2NfaWQgIT0gcHZ0LT5zYnJpZGdlX2Rldi0+bWMpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKyNlbmRpZgorCisJc21wX3JtYigpOworCWlmICgocHZ0LT5tY2Vfb3V0ICsgMSkgJSBNQ0VfTE9HX0xFTiA9PSBwdnQtPm1jZV9pbikgeworCQlzbXBfd21iKCk7CisJCXB2dC0+bWNlX292ZXJydW4rKzsKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KKworCS8qIENvcHkgbWVtb3J5IGVycm9yIGF0IHRoZSByaW5nYnVmZmVyICovCisJbWVtY3B5KCZwdnQtPm1jZV9lbnRyeVtwdnQtPm1jZV9vdXRdLCBtY2UsIHNpemVvZigqbWNlKSk7CisJc21wX3dtYigpOworCXB2dC0+bWNlX291dCA9IChwdnQtPm1jZV9vdXQgKyAxKSAlIE1DRV9MT0dfTEVOOworCisJLyogSGFuZGxlIGZhdGFsIGVycm9ycyBpbW1lZGlhdGVseSAqLworCWlmIChtY2UtPm1jZ3N0YXR1cyAmIDEpCisJCXNicmlkZ2VfY2hlY2tfZXJyb3IobWNpKTsKKworCS8qIEFkdmljZSBtY2Vsb2cgdGhhdCB0aGUgZXJyb3Igd2VyZSBoYW5kbGVkICovCisJcmV0dXJuIE5PVElGWV9TVE9QOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNicmlkZ2VfbWNlX2RlYyA9IHsKKwkubm90aWZpZXJfY2FsbCAgICAgID0gc2JyaWRnZV9tY2VfY2hlY2tfZXJyb3IsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJRURBQyByZWdpc3Rlci91bnJlZ2lzdGVyIGxvZ2ljCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc2JyaWRnZV91bnJlZ2lzdGVyX21jaShzdHJ1Y3Qgc2JyaWRnZV9kZXYgKnNicmlkZ2VfZGV2KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHNicmlkZ2VfZGV2LT5tY2k7CisJc3RydWN0IHNicmlkZ2VfcHZ0ICpwdnQ7CisKKwlpZiAodW5saWtlbHkoIW1jaSB8fCAhbWNpLT5wdnRfaW5mbykpIHsKKwkJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKTogZGV2ID0gJXBcbiIsCisJCQlfX2Z1bmNfXywgJnNicmlkZ2VfZGV2LT5wZGV2WzBdLT5kZXYpOworCisJCXNicmlkZ2VfcHJpbnRrKEtFUk5fRVJSLCAiQ291bGRuJ3QgZmluZCBtY2kgaGFuZGxlclxuIik7CisJCXJldHVybjsKKwl9CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKTogbWNpID0gJXAsIGRldiA9ICVwXG4iLAorCQlfX2Z1bmNfXywgbWNpLCAmc2JyaWRnZV9kZXYtPnBkZXZbMF0tPmRldik7CisKKwlhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmeDg2X21jZV9kZWNvZGVyX2NoYWluLAorCQkJCQkgJnNicmlkZ2VfbWNlX2RlYyk7CisKKwkvKiBSZW1vdmUgTUMgc3lzZnMgbm9kZXMgKi8KKwllZGFjX21jX2RlbF9tYyhtY2ktPmRldik7CisKKwlkZWJ1Z2YxKCIlczogZnJlZSBtY2kgc3RydWN0XG4iLCBtY2ktPmN0bF9uYW1lKTsKKwlrZnJlZShtY2ktPmN0bF9uYW1lKTsKKwllZGFjX21jX2ZyZWUobWNpKTsKKwlzYnJpZGdlX2Rldi0+bWNpID0gTlVMTDsKK30KKworc3RhdGljIGludCBzYnJpZGdlX3JlZ2lzdGVyX21jaShzdHJ1Y3Qgc2JyaWRnZV9kZXYgKnNicmlkZ2VfZGV2KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3Qgc2JyaWRnZV9wdnQgKnB2dDsKKwlpbnQgcmMsIGNoYW5uZWxzLCBjc3Jvd3M7CisKKwkvKiBDaGVjayB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBhbmQgbm90IGRpc2FibGVkIGNoYW5uZWxzICovCisJcmMgPSBzYnJpZGdlX2dldF9hY3RpdmVfY2hhbm5lbHMoc2JyaWRnZV9kZXYtPmJ1cywgJmNoYW5uZWxzLCAmY3Nyb3dzKTsKKwlpZiAodW5saWtlbHkocmMgPCAwKSkKKwkJcmV0dXJuIHJjOworCisJLyogYWxsb2NhdGUgYSBuZXcgTUMgY29udHJvbCBzdHJ1Y3R1cmUgKi8KKwltY2kgPSBlZGFjX21jX2FsbG9jKHNpemVvZigqcHZ0KSwgY3Nyb3dzLCBjaGFubmVscywgc2JyaWRnZV9kZXYtPm1jKTsKKwlpZiAodW5saWtlbHkoIW1jaSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKTogbWNpID0gJXAsIGRldiA9ICVwXG4iLAorCQlfX2Z1bmNfXywgbWNpLCAmc2JyaWRnZV9kZXYtPnBkZXZbMF0tPmRldik7CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCW1lbXNldChwdnQsIDAsIHNpemVvZigqcHZ0KSk7CisKKwkvKiBBc3NvY2lhdGUgc2JyaWRnZV9kZXYgYW5kIG1jaSBmb3IgZnV0dXJlIHVzYWdlICovCisJcHZ0LT5zYnJpZGdlX2RldiA9IHNicmlkZ2VfZGV2OworCXNicmlkZ2VfZGV2LT5tY2kgPSBtY2k7CisKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX0REUjM7CisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdfTk9ORTsKKwltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CisJbWNpLT5tb2RfbmFtZSA9ICJzYnJpZGdlX2VkYWMuYyI7CisJbWNpLT5tb2RfdmVyID0gU0JSSURHRV9SRVZJU0lPTjsKKwltY2ktPmN0bF9uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJTYW5keSBCcmlkZ2UgU29ja2V0IyVkIiwgbWNpLT5tY19pZHgpOworCW1jaS0+ZGV2X25hbWUgPSBwY2lfbmFtZShzYnJpZGdlX2Rldi0+cGRldlswXSk7CisJbWNpLT5jdGxfcGFnZV90b19waHlzID0gTlVMTDsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBhbiBhY3R1YWwgb3BlcmF0aW9uIGZ1bmN0aW9uICovCisJbWNpLT5lZGFjX2NoZWNrID0gc2JyaWRnZV9jaGVja19lcnJvcjsKKworCS8qIFN0b3JlIHBjaSBkZXZpY2VzIGF0IG1jaSBmb3IgZmFzdGVyIGFjY2VzcyAqLworCXJjID0gbWNpX2JpbmRfZGV2cyhtY2ksIHNicmlkZ2VfZGV2KTsKKwlpZiAodW5saWtlbHkocmMgPCAwKSkKKwkJZ290byBmYWlsMDsKKworCS8qIEdldCBkaW1tIGJhc2ljIGNvbmZpZyBhbmQgdGhlIG1lbW9yeSBsYXlvdXQgKi8KKwlnZXRfZGltbV9jb25maWcobWNpKTsKKwlnZXRfbWVtb3J5X2xheW91dChtY2kpOworCisJLyogcmVjb3JkIHB0ciB0byB0aGUgZ2VuZXJpYyBkZXZpY2UgKi8KKwltY2ktPmRldiA9ICZzYnJpZGdlX2Rldi0+cGRldlswXS0+ZGV2OworCisJLyogYWRkIHRoaXMgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlIHRvIEVEQUMncyBsaXN0IG9mIE1DcyAqLworCWlmICh1bmxpa2VseShlZGFjX21jX2FkZF9tYyhtY2kpKSkgeworCQlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXworCQkJIjogJXMoKTogZmFpbGVkIGVkYWNfbWNfYWRkX21jKClcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWwwOworCX0KKworCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmeDg2X21jZV9kZWNvZGVyX2NoYWluLAorCQkJCSAgICAgICAmc2JyaWRnZV9tY2VfZGVjKTsKKwlyZXR1cm4gMDsKKworZmFpbDA6CisJa2ZyZWUobWNpLT5jdGxfbmFtZSk7CisJZWRhY19tY19mcmVlKG1jaSk7CisJc2JyaWRnZV9kZXYtPm1jaSA9IE5VTEw7CisJcmV0dXJuIHJjOworfQorCisvKgorICoJc2JyaWRnZV9wcm9iZQlQcm9iZSBmb3IgT05FIGluc3RhbmNlIG9mIGRldmljZSB0byBzZWUgaWYgaXQgaXMKKyAqCQkJcHJlc2VudC4KKyAqCXJldHVybjoKKyAqCQkwIGZvciBGT1VORCBhIGRldmljZQorICoJCTwgMCBmb3IgZXJyb3IgY29kZQorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNicmlkZ2VfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJjOworCXU4IG1jLCBudW1fbWMgPSAwOworCXN0cnVjdCBzYnJpZGdlX2RldiAqc2JyaWRnZV9kZXY7CisKKwkvKiBnZXQgdGhlIHBjaSBkZXZpY2VzIHdlIHdhbnQgdG8gcmVzZXJ2ZSBmb3Igb3VyIHVzZSAqLworCW11dGV4X2xvY2soJnNicmlkZ2VfZWRhY19sb2NrKTsKKworCS8qCisJICogQWxsIG1lbW9yeSBjb250cm9sbGVycyBhcmUgYWxsb2NhdGVkIGF0IHRoZSBmaXJzdCBwYXNzLgorCSAqLworCWlmICh1bmxpa2VseShwcm9iZWQgPj0gMSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZzYnJpZGdlX2VkYWNfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwcm9iZWQrKzsKKworCXJjID0gc2JyaWRnZV9nZXRfYWxsX2RldmljZXMoJm51bV9tYyk7CisJaWYgKHVubGlrZWx5KHJjIDwgMCkpCisJCWdvdG8gZmFpbDA7CisJbWMgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzYnJpZGdlX2RldiwgJnNicmlkZ2VfZWRhY19saXN0LCBsaXN0KSB7CisJCWRlYnVnZjAoIlJlZ2lzdGVyaW5nIE1DIyVkICglZCBvZiAlZClcbiIsIG1jLCBtYyArIDEsIG51bV9tYyk7CisJCXNicmlkZ2VfZGV2LT5tYyA9IG1jKys7CisJCXJjID0gc2JyaWRnZV9yZWdpc3Rlcl9tY2koc2JyaWRnZV9kZXYpOworCQlpZiAodW5saWtlbHkocmMgPCAwKSkKKwkJCWdvdG8gZmFpbDE7CisJfQorCisJc2JyaWRnZV9wcmludGsoS0VSTl9JTkZPLCAiRHJpdmVyIGxvYWRlZC5cbiIpOworCisJbXV0ZXhfdW5sb2NrKCZzYnJpZGdlX2VkYWNfbG9jayk7CisJcmV0dXJuIDA7CisKK2ZhaWwxOgorCWxpc3RfZm9yX2VhY2hfZW50cnkoc2JyaWRnZV9kZXYsICZzYnJpZGdlX2VkYWNfbGlzdCwgbGlzdCkKKwkJc2JyaWRnZV91bnJlZ2lzdGVyX21jaShzYnJpZGdlX2Rldik7CisKKwlzYnJpZGdlX3B1dF9hbGxfZGV2aWNlcygpOworZmFpbDA6CisJbXV0ZXhfdW5sb2NrKCZzYnJpZGdlX2VkYWNfbG9jayk7CisJcmV0dXJuIHJjOworfQorCisvKgorICoJc2JyaWRnZV9yZW1vdmUJZGVzdHJ1Y3RvciBmb3Igb25lIGluc3RhbmNlIG9mIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IHNicmlkZ2VfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBzYnJpZGdlX2RldiAqc2JyaWRnZV9kZXY7CisKKwlkZWJ1Z2YwKF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qCisJICogd2UgaGF2ZSBhIHRyb3VibGUgaGVyZTogcGRldiB2YWx1ZSBmb3IgcmVtb3ZhbCB3aWxsIGJlIHdyb25nLCBzaW5jZQorCSAqIGl0IHdpbGwgcG9pbnQgdG8gdGhlIFg1OCByZWdpc3RlciB1c2VkIHRvIGRldGVjdCB0aGF0IHRoZSBtYWNoaW5lCisJICogaXMgYSBOZWhhbGVtIG9yIHVwcGVyIGRlc2lnbi4gSG93ZXZlciwgZHVlIHRvIHRoZSB3YXkgc2V2ZXJhbCBQQ0kKKwkgKiBkZXZpY2VzIGFyZSBncm91cGVkIHRvZ2V0aGVyIHRvIHByb3ZpZGUgTUMgZnVuY3Rpb25hbGl0eSwgd2UgbmVlZAorCSAqIHRvIHVzZSBhIGRpZmZlcmVudCBtZXRob2QgZm9yIHJlbGVhc2luZyB0aGUgZGV2aWNlcworCSAqLworCisJbXV0ZXhfbG9jaygmc2JyaWRnZV9lZGFjX2xvY2spOworCisJaWYgKHVubGlrZWx5KCFwcm9iZWQpKSB7CisJCW11dGV4X3VubG9jaygmc2JyaWRnZV9lZGFjX2xvY2spOworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzYnJpZGdlX2RldiwgJnNicmlkZ2VfZWRhY19saXN0LCBsaXN0KQorCQlzYnJpZGdlX3VucmVnaXN0ZXJfbWNpKHNicmlkZ2VfZGV2KTsKKworCS8qIFJlbGVhc2UgUENJIHJlc291cmNlcyAqLworCXNicmlkZ2VfcHV0X2FsbF9kZXZpY2VzKCk7CisKKwlwcm9iZWQtLTsKKworCW11dGV4X3VubG9jaygmc2JyaWRnZV9lZGFjX2xvY2spOworfQorCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2JyaWRnZV9wY2lfdGJsKTsKKworLyoKKyAqCXNicmlkZ2VfZHJpdmVyCXBjaV9kcml2ZXIgc3RydWN0dXJlIGZvciB0aGlzIG1vZHVsZQorICoKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNicmlkZ2VfZHJpdmVyID0geworCS5uYW1lICAgICA9ICJzYnJpZGdlX2VkYWMiLAorCS5wcm9iZSAgICA9IHNicmlkZ2VfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3Aoc2JyaWRnZV9yZW1vdmUpLAorCS5pZF90YWJsZSA9IHNicmlkZ2VfcGNpX3RibCwKK307CisKKy8qCisgKglzYnJpZGdlX2luaXQJCU1vZHVsZSBlbnRyeSBmdW5jdGlvbgorICoJCQlUcnkgdG8gaW5pdGlhbGl6ZSB0aGlzIG1vZHVsZSBmb3IgaXRzIGRldmljZXMKKyAqLworc3RhdGljIGludCBfX2luaXQgc2JyaWRnZV9pbml0KHZvaWQpCit7CisJaW50IHBjaV9yYzsKKworCWRlYnVnZjIoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIEVuc3VyZSB0aGF0IHRoZSBPUFNUQVRFIGlzIHNldCBjb3JyZWN0bHkgZm9yIFBPTEwgb3IgTk1JICovCisJb3BzdGF0ZV9pbml0KCk7CisKKwlwY2lfcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzYnJpZGdlX2RyaXZlcik7CisKKwlpZiAocGNpX3JjID49IDApCisJCXJldHVybiAwOworCisJc2JyaWRnZV9wcmludGsoS0VSTl9FUlIsICJGYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIHdpdGggZXJyb3IgJWQuXG4iLAorCQkgICAgICBwY2lfcmMpOworCisJcmV0dXJuIHBjaV9yYzsKK30KKworLyoKKyAqCXNicmlkZ2VfZXhpdCgpCU1vZHVsZSBleGl0IGZ1bmN0aW9uCisgKgkJCVVucmVnaXN0ZXIgdGhlIGRyaXZlcgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc2JyaWRnZV9leGl0KHZvaWQpCit7CisJZGVidWdmMigiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2JyaWRnZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzYnJpZGdlX2luaXQpOworbW9kdWxlX2V4aXQoc2JyaWRnZV9leGl0KTsKKworbW9kdWxlX3BhcmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bfc3RhdGUsICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLDE9Tk1JIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCBJbmMuIChodHRwOi8vd3d3LnJlZGhhdC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1DIERyaXZlciBmb3IgSW50ZWwgU2FuZHkgQnJpZGdlIG1lbW9yeSBjb250cm9sbGVycyAtICIKKwkJICAgU0JSSURHRV9SRVZJU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtaXNvLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtaXNvLmMKaW5kZXggNTdjMzk3My4uMGY5MGUwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9jb3JlLWlzby5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS1pc28uYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9jb3JlLXRyYW5zYWN0aW9uLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtdHJhbnNhY3Rpb24uYwppbmRleCAzMzRiODJhLi44NTVhYjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtdHJhbnNhY3Rpb24uYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtdHJhbnNhY3Rpb24uYwpAQCAtMTA0Niw4ICsxMDQ2LDggQEAKIAogCWN5Y2xlcyA9IGNhcmQtPnNwbGl0X3RpbWVvdXRfaGkgKiA4MDAwICsgKGNhcmQtPnNwbGl0X3RpbWVvdXRfbG8gPj4gMTkpOwogCi0JY3ljbGVzID0gbWF4KGN5Y2xlcywgODAwdSk7IC8qIG1pbmltdW0gYXMgcGVyIHRoZSBzcGVjICovCi0JY3ljbGVzID0gbWluKGN5Y2xlcywgM3UgKiA4MDAwdSk7IC8qIG1heGltdW0gT0hDSSB0aW1lb3V0ICovCisJLyogbWluaW11bSBwZXIgSUVFRSAxMzk0LCBtYXhpbXVtIHdoaWNoIGRvZXNuJ3Qgb3ZlcmZsb3cgT0hDSSAqLworCWN5Y2xlcyA9IGNsYW1wKGN5Y2xlcywgODAwdSwgM3UgKiA4MDAwdSk7CiAKIAljYXJkLT5zcGxpdF90aW1lb3V0X2N5Y2xlcyA9IGN5Y2xlczsKIAljYXJkLT5zcGxpdF90aW1lb3V0X2ppZmZpZXMgPSBESVZfUk9VTkRfVVAoY3ljbGVzICogSFosIDgwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9uZXQuYyBiL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMKaW5kZXggMDNhN2E4NS4uYTIwZjQ1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9uZXQuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL25ldC5jCkBAIC01MDIsMTEgKzUwMiw3IEBACiBzdGF0aWMgdW5zaWduZWQgZnduZXRfbWF4X3BheWxvYWQodW5zaWduZWQgbWF4X3JlYywgdW5zaWduZWQgc3BlZWQpCiB7CiAJbWF4X3JlYyA9IG1pbihtYXhfcmVjLCBzcGVlZCArIDgpOwotCW1heF9yZWMgPSBtaW4obWF4X3JlYywgMHhiVSk7IC8qIDw9IDQwOTYgKi8KLQlpZiAobWF4X3JlYyA8IDgpIHsKLQkJZndfbm90aWZ5KCJtYXhfcmVjICV4IG91dCBvZiByYW5nZVxuIiwgbWF4X3JlYyk7Ci0JCW1heF9yZWMgPSA4OwotCX0KKwltYXhfcmVjID0gY2xhbXAobWF4X3JlYywgOFUsIDExVSk7IC8qIDUxMi4uLjQwOTYgKi8KIAogCXJldHVybiAoMSA8PCAobWF4X3JlYyArIDEpKSAtIFJGQzIzNzRfRlJBR19IRFJfU0laRTsKIH0KQEAgLTExMjUsMTcgKzExMjEsMTIgQEAKIAl1bnNpZ25lZCB1OwogCiAJaWYgKGRldi0+bG9jYWxfZmlmbyA9PSBGV05FVF9OT19GSUZPX0FERFIpIHsKLQkJLyogb3V0c2lkZSBPSENJIHBvc3RlZCB3cml0ZSBhcmVhPyAqLwotCQlzdGF0aWMgY29uc3Qgc3RydWN0IGZ3X2FkZHJlc3NfcmVnaW9uIHJlZ2lvbiA9IHsKLQkJCS5zdGFydCA9IDB4ZmZmZjAwMDAwMDAwVUxMLAotCQkJLmVuZCAgID0gQ1NSX1JFR0lTVEVSX0JBU0UsCi0JCX07Ci0KIAkJZGV2LT5oYW5kbGVyLmxlbmd0aCA9IDQwOTY7CiAJCWRldi0+aGFuZGxlci5hZGRyZXNzX2NhbGxiYWNrID0gZnduZXRfcmVjZWl2ZV9wYWNrZXQ7CiAJCWRldi0+aGFuZGxlci5jYWxsYmFja19kYXRhID0gZGV2OwogCi0JCXJldHZhbCA9IGZ3X2NvcmVfYWRkX2FkZHJlc3NfaGFuZGxlcigmZGV2LT5oYW5kbGVyLCAmcmVnaW9uKTsKKwkJcmV0dmFsID0gZndfY29yZV9hZGRfYWRkcmVzc19oYW5kbGVyKCZkZXYtPmhhbmRsZXIsCisJCQkJCSZmd19oaWdoX21lbW9yeV9yZWdpb24pOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCWdvdG8gZmFpbGVkX2luaXRpYWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jIGIvZHJpdmVycy9maXJld2lyZS9vaGNpLmMKaW5kZXggZmQ3MTcwYS4uNjYyOGZlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9vaGNpLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9vaGNpLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0xMjUsNiArMTI2LDcgQEAKIAlzdHJ1Y3QgZndfb2hjaSAqb2hjaTsKIAl1MzIgcmVnczsKIAlpbnQgdG90YWxfYWxsb2NhdGlvbjsKKwl1MzIgY3VycmVudF9idXM7CiAJYm9vbCBydW5uaW5nOwogCWJvb2wgZmx1c2hpbmc7CiAKQEAgLTIyNiw3ICsyMjgsNyBAQAogCiAJX19sZTMyICAgICpzZWxmX2lkX2NwdTsKIAlkbWFfYWRkcl90IHNlbGZfaWRfYnVzOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBidXNfcmVzZXRfdGFza2xldDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYnVzX3Jlc2V0X3dvcms7CiAKIAl1MzIgc2VsZl9pZF9idWZmZXJbNTEyXTsKIH07CkBAIC0yNjMsNiArMjY1LDggQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BR0VSRV9GVzY0MwkweDU5MDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9GVwkweDIzODAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USV9UU0IxMkxWMjIJMHg4MDA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfVFNCMTJMVjI2CTB4ODAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJX1RTQjgyQUEyCTB4ODAyNQogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BJTk5BQ0xFX1NZU1RFTVMJMHgxMWJkCiAKICNkZWZpbmUgUVVJUktfQ1lDTEVfVElNRVIJCTEKQEAgLTI3MCw2ICsyNzQsNyBAQAogI2RlZmluZSBRVUlSS19CRV9IRUFERVJTCQk0CiAjZGVmaW5lIFFVSVJLX05PXzEzOTRBCQkJOAogI2RlZmluZSBRVUlSS19OT19NU0kJCQkxNgorI2RlZmluZSBRVUlSS19USV9TTExaMDU5CQkzMgogCiAvKiBJbiBjYXNlIG9mIG11bHRpcGxlIG1hdGNoZXMgaW4gb2hjaV9xdWlya3NbXSwgb25seSB0aGUgZmlyc3Qgb25lIGlzIHVzZWQuICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKQEAgLTI5OSw2ICszMDQsMTIgQEAKIAl7UENJX1ZFTkRPUl9JRF9USSwgUENJX0RFVklDRV9JRF9USV9UU0IxMkxWMjIsIFBDSV9BTllfSUQsCiAJCVFVSVJLX0NZQ0xFX1RJTUVSIHwgUVVJUktfUkVTRVRfUEFDS0VUIHwgUVVJUktfTk9fMTM5NEF9LAogCisJe1BDSV9WRU5ET1JfSURfVEksIFBDSV9ERVZJQ0VfSURfVElfVFNCMTJMVjI2LCBQQ0lfQU5ZX0lELAorCQlRVUlSS19SRVNFVF9QQUNLRVQgfCBRVUlSS19USV9TTExaMDU5fSwKKworCXtQQ0lfVkVORE9SX0lEX1RJLCBQQ0lfREVWSUNFX0lEX1RJX1RTQjgyQUEyLCBQQ0lfQU5ZX0lELAorCQlRVUlSS19SRVNFVF9QQUNLRVQgfCBRVUlSS19USV9TTExaMDU5fSwKKwogCXtQQ0lfVkVORE9SX0lEX1RJLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAogCQlRVUlSS19SRVNFVF9QQUNLRVR9LAogCkBAIC0zMTUsNiArMzI2LDcgQEAKIAkiLCBBUi9zZWxmSUQgZW5kaWFuZXNzID0gIglfX3N0cmluZ2lmeShRVUlSS19CRV9IRUFERVJTKQogCSIsIG5vIDEzOTRhIGVuaGFuY2VtZW50cyA9ICIJX19zdHJpbmdpZnkoUVVJUktfTk9fMTM5NEEpCiAJIiwgZGlzYWJsZSBNU0kgPSAiCQlfX3N0cmluZ2lmeShRVUlSS19OT19NU0kpCisJIiwgVEkgU0xMWjA1OSBlcnJhdHVtID0gIglfX3N0cmluZ2lmeShRVUlSS19USV9TTExaMDU5KQogCSIpIik7CiAKICNkZWZpbmUgT0hDSV9QQVJBTV9ERUJVR19BVF9BUgkJMQpAQCAtODU5LDcgKzg3MSw3IEBACiAJICoKIAkgKiBBbGFzIHNvbWUgY2hpcHMgc29tZXRpbWVzIGVtaXQgYnVzIHJlc2V0IHBhY2tldHMgd2l0aCBhCiAJICogd3JvbmcgZ2VuZXJhdGlvbi4gIFdlIHNldCB0aGUgY29ycmVjdCBnZW5lcmF0aW9uIGZvciB0aGVzZQotCSAqIGF0IGEgc2xpZ2h0bHkgaW5jb3JyZWN0IHRpbWUgKGluIGJ1c19yZXNldF90YXNrbGV0KS4KKwkgKiBhdCBhIHNsaWdodGx5IGluY29ycmVjdCB0aW1lIChpbiBidXNfcmVzZXRfd29yaykuCiAJICovCiAJaWYgKGV2dCA9PSBPSENJMTM5NF9ldnRfYnVzX3Jlc2V0KSB7CiAJCWlmICghKG9oY2ktPnF1aXJrcyAmIFFVSVJLX1JFU0VUX1BBQ0tFVCkpCkBAIC0xMDQ2LDYgKzEwNTgsNyBAQAogCQlhZGRyZXNzID0gbGUzMl90b19jcHUobGFzdC0+YnJhbmNoX2FkZHJlc3MpOwogCQl6ID0gYWRkcmVzcyAmIDB4ZjsKIAkJYWRkcmVzcyAmPSB+MHhmOworCQljdHgtPmN1cnJlbnRfYnVzID0gYWRkcmVzczsKIAogCQkvKiBJZiB0aGUgYnJhbmNoIGFkZHJlc3MgcG9pbnRzIHRvIGEgYnVmZmVyIG91dHNpZGUgb2YgdGhlCiAJCSAqIGN1cnJlbnQgYnVmZmVyLCBhZHZhbmNlIHRvIHRoZSBuZXh0IGJ1ZmZlci4gKi8KQEAgLTE3MTMsOSArMTcyNiw5NCBAQAogCXJldHVybiBvaGNpLT5idXNfdGltZSB8IGN5Y2xlX3RpbWVfc2Vjb25kczsKIH0KIAotc3RhdGljIHZvaWQgYnVzX3Jlc2V0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIGludCBnZXRfc3RhdHVzX2Zvcl9wb3J0KHN0cnVjdCBmd19vaGNpICpvaGNpLCBpbnQgcG9ydF9pbmRleCkKIHsKLQlzdHJ1Y3QgZndfb2hjaSAqb2hjaSA9IChzdHJ1Y3QgZndfb2hjaSAqKWRhdGE7CisJaW50IHJlZzsKKworCW11dGV4X2xvY2soJm9oY2ktPnBoeV9yZWdfbXV0ZXgpOworCXJlZyA9IHdyaXRlX3BoeV9yZWcob2hjaSwgNywgcG9ydF9pbmRleCk7CisJaWYgKHJlZyA+PSAwKQorCQlyZWcgPSByZWFkX3BoeV9yZWcob2hjaSwgOCk7CisJbXV0ZXhfdW5sb2NrKCZvaGNpLT5waHlfcmVnX211dGV4KTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCXN3aXRjaCAocmVnICYgMHgwZikgeworCWNhc2UgMHgwNjoKKwkJcmV0dXJuIDI7CS8qIGlzIGNoaWxkIG5vZGUgKGNvbm5lY3RlZCB0byBwYXJlbnQgbm9kZSkgKi8KKwljYXNlIDB4MGU6CisJCXJldHVybiAzOwkvKiBpcyBwYXJlbnQgbm9kZSAoY29ubmVjdGVkIHRvIGNoaWxkIG5vZGUpICovCisJfQorCXJldHVybiAxOwkJLyogbm90IGNvbm5lY3RlZCAqLworfQorCitzdGF0aWMgaW50IGdldF9zZWxmX2lkX3BvcyhzdHJ1Y3QgZndfb2hjaSAqb2hjaSwgdTMyIHNlbGZfaWQsCisJaW50IHNlbGZfaWRfY291bnQpCit7CisJaW50IGk7CisJdTMyIGVudHJ5OworCisJZm9yIChpID0gMDsgaSA8IHNlbGZfaWRfY291bnQ7IGkrKykgeworCQllbnRyeSA9IG9oY2ktPnNlbGZfaWRfYnVmZmVyW2ldOworCQlpZiAoKHNlbGZfaWQgJiAweGZmMDAwMDAwKSA9PSAoZW50cnkgJiAweGZmMDAwMDAwKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKChzZWxmX2lkICYgMHhmZjAwMDAwMCkgPCAoZW50cnkgJiAweGZmMDAwMDAwKSkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIFRJIFRTQjgyQUEyQiBhbmQgVFNCMTJMVjI2IGRvIG5vdCByZWNlaXZlIHRoZSBzZWxmSUQgb2YgYSBsb2NhbGx5CisgKiBhdHRhY2hlZCBUU0I0MUJBM0QgcGh5OyBzZWUgaHR0cDovL3d3dy50aS5jb20vbGl0di9wZGYvc2xsejA1OS4KKyAqIENvbnN0cnVjdCB0aGUgc2VsZklEIGZyb20gcGh5IHJlZ2lzdGVyIGNvbnRlbnRzLgorICogRklYTUU6ICBIb3cgdG8gZGV0ZXJtaW5lIHRoZSBzZWxmSUQuaSBmbGFnPworICovCitzdGF0aWMgaW50IGZpbmRfYW5kX2luc2VydF9zZWxmX2lkKHN0cnVjdCBmd19vaGNpICpvaGNpLCBpbnQgc2VsZl9pZF9jb3VudCkKK3sKKwlpbnQgcmVnLCBpLCBwb3MsIHN0YXR1czsKKwkvKiBsaW5rIGFjdGl2ZSAxLCBzcGVlZCAzLCBicmlkZ2UgMCwgY29udGVuZGVyIDEsIG1vcmUgcGFja2V0cyAwICovCisJdTMyIHNlbGZfaWQgPSAweDgwNDBjODAwOworCisJcmVnID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfTm9kZUlEKTsKKwlpZiAoIShyZWcgJiBPSENJMTM5NF9Ob2RlSURfaWRWYWxpZCkpIHsKKwkJZndfbm90aWZ5KCJub2RlIElEIG5vdCB2YWxpZCwgbmV3IGJ1cyByZXNldCBpbiBwcm9ncmVzc1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNlbGZfaWQgfD0gKChyZWcgJiAweDNmKSA8PCAyNCk7IC8qIHBoeSBJRCAqLworCisJcmVnID0gb2hjaV9yZWFkX3BoeV9yZWcoJm9oY2ktPmNhcmQsIDQpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCXNlbGZfaWQgfD0gKChyZWcgJiAweDA3KSA8PCA4KTsgLyogcG93ZXIgY2xhc3MgKi8KKworCXJlZyA9IG9oY2lfcmVhZF9waHlfcmVnKCZvaGNpLT5jYXJkLCAxKTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKwlzZWxmX2lkIHw9ICgocmVnICYgMHgzZikgPDwgMTYpOyAvKiBnYXAgY291bnQgKi8KKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJc3RhdHVzID0gZ2V0X3N0YXR1c19mb3JfcG9ydChvaGNpLCBpKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCQlzZWxmX2lkIHw9ICgoc3RhdHVzICYgMHgzKSA8PCAoNiAtIChpICogMikpKTsKKwl9CisKKwlwb3MgPSBnZXRfc2VsZl9pZF9wb3Mob2hjaSwgc2VsZl9pZCwgc2VsZl9pZF9jb3VudCk7CisJaWYgKHBvcyA+PSAwKSB7CisJCW1lbW1vdmUoJihvaGNpLT5zZWxmX2lkX2J1ZmZlcltwb3MrMV0pLAorCQkJJihvaGNpLT5zZWxmX2lkX2J1ZmZlcltwb3NdKSwKKwkJCShzZWxmX2lkX2NvdW50IC0gcG9zKSAqIHNpemVvZigqb2hjaS0+c2VsZl9pZF9idWZmZXIpKTsKKwkJb2hjaS0+c2VsZl9pZF9idWZmZXJbcG9zXSA9IHNlbGZfaWQ7CisJCXNlbGZfaWRfY291bnQrKzsKKwl9CisJcmV0dXJuIHNlbGZfaWRfY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGJ1c19yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZndfb2hjaSAqb2hjaSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZndfb2hjaSwgYnVzX3Jlc2V0X3dvcmspOwogCWludCBzZWxmX2lkX2NvdW50LCBpLCBqLCByZWc7CiAJaW50IGdlbmVyYXRpb24sIG5ld19nZW5lcmF0aW9uOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNzUzLDIxICsxODUxLDUwIEBACiAJICogYml0IGV4dHJhIHRvIGdldCB0aGUgYWN0dWFsIG51bWJlciBvZiBzZWxmIElEcy4KIAkgKi8KIAlzZWxmX2lkX2NvdW50ID0gKHJlZyA+PiAzKSAmIDB4ZmY7Ci0JaWYgKHNlbGZfaWRfY291bnQgPT0gMCB8fCBzZWxmX2lkX2NvdW50ID4gMjUyKSB7CisKKwlpZiAoc2VsZl9pZF9jb3VudCA+IDI1MikgewogCQlmd19ub3RpZnkoImluY29uc2lzdGVudCBzZWxmIElEc1xuIik7CiAJCXJldHVybjsKIAl9CisKIAlnZW5lcmF0aW9uID0gKGNvbmRfbGUzMl90b19jcHUob2hjaS0+c2VsZl9pZF9jcHVbMF0pID4+IDE2KSAmIDB4ZmY7CiAJcm1iKCk7CiAKIAlmb3IgKGkgPSAxLCBqID0gMDsgaiA8IHNlbGZfaWRfY291bnQ7IGkgKz0gMiwgaisrKSB7CiAJCWlmIChvaGNpLT5zZWxmX2lkX2NwdVtpXSAhPSB+b2hjaS0+c2VsZl9pZF9jcHVbaSArIDFdKSB7Ci0JCQlmd19ub3RpZnkoImluY29uc2lzdGVudCBzZWxmIElEc1xuIik7Ci0JCQlyZXR1cm47CisJCQkvKgorCQkJICogSWYgdGhlIGludmFsaWQgZGF0YSBsb29rcyBsaWtlIGEgY3ljbGUgc3RhcnQgcGFja2V0LAorCQkJICogaXQncyBsaWtlbHkgdG8gYmUgdGhlIHJlc3VsdCBvZiB0aGUgY3ljbGUgbWFzdGVyCisJCQkgKiBoYXZpbmcgYSB3cm9uZyBnYXAgY291bnQuICBJbiB0aGlzIGNhc2UsIHRoZSBzZWxmIElEcworCQkJICogc28gZmFyIGFyZSB2YWxpZCBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZCBzbyB0aGF0IHRoZQorCQkJICogYnVzIG1hbmFnZXIgY2FuIHRoZW4gY29ycmVjdCB0aGUgZ2FwIGNvdW50LgorCQkJICovCisJCQlpZiAoY29uZF9sZTMyX3RvX2NwdShvaGNpLT5zZWxmX2lkX2NwdVtpXSkKKwkJCQkJCQk9PSAweGZmZmYwMDhmKSB7CisJCQkJZndfbm90aWZ5KCJpZ25vcmluZyBzcHVyaW91cyBzZWxmIElEc1xuIik7CisJCQkJc2VsZl9pZF9jb3VudCA9IGo7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWZ3X25vdGlmeSgiaW5jb25zaXN0ZW50IHNlbGYgSURzXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CiAJCX0KIAkJb2hjaS0+c2VsZl9pZF9idWZmZXJbal0gPQogCQkJCWNvbmRfbGUzMl90b19jcHUob2hjaS0+c2VsZl9pZF9jcHVbaV0pOwogCX0KKworCWlmIChvaGNpLT5xdWlya3MgJiBRVUlSS19USV9TTExaMDU5KSB7CisJCXNlbGZfaWRfY291bnQgPSBmaW5kX2FuZF9pbnNlcnRfc2VsZl9pZChvaGNpLCBzZWxmX2lkX2NvdW50KTsKKwkJaWYgKHNlbGZfaWRfY291bnQgPCAwKSB7CisJCQlmd19ub3RpZnkoImNvdWxkIG5vdCBjb25zdHJ1Y3QgbG9jYWwgc2VsZiBJRFxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoc2VsZl9pZF9jb3VudCA9PSAwKSB7CisJCWZ3X25vdGlmeSgiaW5jb25zaXN0ZW50IHNlbGYgSURzXG4iKTsKKwkJcmV0dXJuOworCX0KIAlybWIoKTsKIAogCS8qCkBAIC0xODg3LDcgKzIwMTQsNyBAQAogCWxvZ19pcnFzKGV2ZW50KTsKIAogCWlmIChldmVudCAmIE9IQ0kxMzk0X3NlbGZJRENvbXBsZXRlKQotCQl0YXNrbGV0X3NjaGVkdWxlKCZvaGNpLT5idXNfcmVzZXRfdGFza2xldCk7CisJCXF1ZXVlX3dvcmsoZndfd29ya3F1ZXVlLCAmb2hjaS0+YnVzX3Jlc2V0X3dvcmspOwogCiAJaWYgKGV2ZW50ICYgT0hDSTEzOTRfUlFQa3QpCiAJCXRhc2tsZXRfc2NoZWR1bGUoJm9oY2ktPmFyX3JlcXVlc3RfY3R4LnRhc2tsZXQpOwpAQCAtMTkzNCw3ICsyMDYxLDggQEAKIAkJcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfUG9zdGVkV3JpdGVBZGRyZXNzTG8pOwogCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhciwKIAkJCSAgT0hDSTEzOTRfcG9zdGVkV3JpdGVFcnIpOwotCQlmd19lcnJvcigiUENJIHBvc3RlZCB3cml0ZSBlcnJvclxuIik7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlmd19lcnJvcigiUENJIHBvc3RlZCB3cml0ZSBlcnJvclxuIik7CiAJfQogCiAJaWYgKHVubGlrZWx5KGV2ZW50ICYgT0hDSTEzOTRfY3ljbGVUb29Mb25nKSkgewpAQCAtMjA0OCw2ICsyMTc2LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcHJvYmVfdHNiNDFiYTNkKHN0cnVjdCBmd19vaGNpICpvaGNpKQoreworCS8qIFRJIHZlbmRvciBJRCA9IDB4MDgwMDI4LCBUU0I0MUJBM0QgcHJvZHVjdCBJRCA9IDB4ODMzMDA1IChzaWMpICovCisJc3RhdGljIGNvbnN0IHU4IGlkW10gPSB7IDB4MDgsIDB4MDAsIDB4MjgsIDB4ODMsIDB4MzAsIDB4MDUsIH07CisJaW50IHJlZywgaTsKKworCXJlZyA9IHJlYWRfcGh5X3JlZyhvaGNpLCAyKTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKwlpZiAoKHJlZyAmIFBIWV9FWFRFTkRFRF9SRUdJU1RFUlMpICE9IFBIWV9FWFRFTkRFRF9SRUdJU1RFUlMpCisJCXJldHVybiAwOworCisJZm9yIChpID0gQVJSQVlfU0laRShpZCkgLSAxOyBpID49IDA7IGktLSkgeworCQlyZWcgPSByZWFkX3BhZ2VkX3BoeV9yZWcob2hjaSwgMSwgaSArIDEwKTsKKwkJaWYgKHJlZyA8IDApCisJCQlyZXR1cm4gcmVnOworCQlpZiAocmVnICE9IGlkW2ldKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IG9oY2lfZW5hYmxlKHN0cnVjdCBmd19jYXJkICpjYXJkLAogCQkgICAgICAgY29uc3QgX19iZTMyICpjb25maWdfcm9tLCBzaXplX3QgbGVuZ3RoKQogewpAQCAtMjA4NSw2ICsyMjM1LDE2IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAorCWlmIChvaGNpLT5xdWlya3MgJiBRVUlSS19USV9TTExaMDU5KSB7CisJCXJldCA9IHByb2JlX3RzYjQxYmEzZChvaGNpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAocmV0KQorCQkJZndfbm90aWZ5KCJsb2NhbCBUU0I0MUJBM0QgcGh5XG4iKTsKKwkJZWxzZQorCQkJb2hjaS0+cXVpcmtzICY9IH5RVUlSS19USV9TTExaMDU5OworCX0KKwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9IQ0NvbnRyb2xDbGVhciwKIAkJICBPSENJMTM5NF9IQ0NvbnRyb2xfbm9CeXRlU3dhcERhdGEpOwogCkBAIC0yMjYwLDcgKzI0MjAsNyBAQAogCSAqIHRoZW4gc2V0IHVwIHRoZSByZWFsIHZhbHVlcyBmb3IgdGhlIHR3byByZWdpc3RlcnMuCiAJICoKIAkgKiBXZSB1c2Ugb2hjaS0+bG9jayB0byBhdm9pZCByYWNpbmcgd2l0aCB0aGUgY29kZSB0aGF0IHNldHMKLQkgKiBvaGNpLT5uZXh0X2NvbmZpZ19yb20gdG8gTlVMTCAoc2VlIGJ1c19yZXNldF90YXNrbGV0KS4KKwkgKiBvaGNpLT5uZXh0X2NvbmZpZ19yb20gdG8gTlVMTCAoc2VlIGJ1c19yZXNldF93b3JrKS4KIAkgKi8KIAogCW5leHRfY29uZmlnX3JvbSA9CkBAIC0yNTM5LDYgKzI2OTksNyBAQAogCXN0cnVjdCBpc29fY29udGV4dCAqY3R4ID0KIAkJY29udGFpbmVyX29mKGNvbnRleHQsIHN0cnVjdCBpc29fY29udGV4dCwgY29udGV4dCk7CiAJc3RydWN0IGRlc2NyaXB0b3IgKnBkOworCXUzMiBidWZmZXJfZG1hOwogCV9fbGUzMiAqaXJfaGVhZGVyOwogCXZvaWQgKnA7CiAKQEAgLTI1NDksNiArMjcxMCwxNiBAQAogCQkvKiBEZXNjcmlwdG9yKHMpIG5vdCBkb25lIHlldCwgc3RvcCBpdGVyYXRpb24gKi8KIAkJcmV0dXJuIDA7CiAKKwl3aGlsZSAoIShkLT5jb250cm9sICYgY3B1X3RvX2xlMTYoREVTQ1JJUFRPUl9CUkFOQ0hfQUxXQVlTKSkpIHsKKwkJZCsrOworCQlidWZmZXJfZG1hID0gbGUzMl90b19jcHUoZC0+ZGF0YV9hZGRyZXNzKTsKKwkJZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoY29udGV4dC0+b2hjaS0+Y2FyZC5kZXZpY2UsCisJCQkJCSAgICAgIGJ1ZmZlcl9kbWEgJiBQQUdFX01BU0ssCisJCQkJCSAgICAgIGJ1ZmZlcl9kbWEgJiB+UEFHRV9NQVNLLAorCQkJCQkgICAgICBsZTE2X3RvX2NwdShkLT5yZXFfY291bnQpLAorCQkJCQkgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCX0KKwogCXAgPSBsYXN0ICsgMTsKIAljb3B5X2lzb19oZWFkZXJzKGN0eCwgcCk7CiAKQEAgLTI1NzEsMTEgKzI3NDIsMTkgQEAKIHsKIAlzdHJ1Y3QgaXNvX2NvbnRleHQgKmN0eCA9CiAJCWNvbnRhaW5lcl9vZihjb250ZXh0LCBzdHJ1Y3QgaXNvX2NvbnRleHQsIGNvbnRleHQpOworCXUzMiBidWZmZXJfZG1hOwogCiAJaWYgKCFsYXN0LT50cmFuc2Zlcl9zdGF0dXMpCiAJCS8qIERlc2NyaXB0b3Iocykgbm90IGRvbmUgeWV0LCBzdG9wIGl0ZXJhdGlvbiAqLwogCQlyZXR1cm4gMDsKIAorCWJ1ZmZlcl9kbWEgPSBsZTMyX3RvX2NwdShsYXN0LT5kYXRhX2FkZHJlc3MpOworCWRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KGNvbnRleHQtPm9oY2ktPmNhcmQuZGV2aWNlLAorCQkJCSAgICAgIGJ1ZmZlcl9kbWEgJiBQQUdFX01BU0ssCisJCQkJICAgICAgYnVmZmVyX2RtYSAmIH5QQUdFX01BU0ssCisJCQkJICAgICAgbGUxNl90b19jcHUobGFzdC0+cmVxX2NvdW50KSwKKwkJCQkgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCiAJaWYgKGxlMTZfdG9fY3B1KGxhc3QtPmNvbnRyb2wpICYgREVTQ1JJUFRPUl9JUlFfQUxXQVlTKQogCQljdHgtPmJhc2UuY2FsbGJhY2subWMoJmN0eC0+YmFzZSwKIAkJCQkgICAgICBsZTMyX3RvX2NwdShsYXN0LT5kYXRhX2FkZHJlc3MpICsKQEAgLTI1ODYsNiArMjc2NSw0MyBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc3luY19pdF9wYWNrZXRfZm9yX2NwdShzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKKwkJCQkJICBzdHJ1Y3QgZGVzY3JpcHRvciAqcGQpCit7CisJX19sZTE2IGNvbnRyb2w7CisJdTMyIGJ1ZmZlcl9kbWE7CisKKwkvKiBvbmx5IHBhY2tldHMgYmVnaW5uaW5nIHdpdGggT1VUUFVUX01PUkUqIGhhdmUgZGF0YSBidWZmZXJzICovCisJaWYgKHBkLT5jb250cm9sICYgY3B1X3RvX2xlMTYoREVTQ1JJUFRPUl9CUkFOQ0hfQUxXQVlTKSkKKwkJcmV0dXJuOworCisJLyogc2tpcCBvdmVyIHRoZSBPVVRQVVRfTU9SRV9JTU1FRElBVEUgZGVzY3JpcHRvciAqLworCXBkICs9IDI7CisKKwkvKgorCSAqIElmIHRoZSBwYWNrZXQgaGFzIGEgaGVhZGVyLCB0aGUgZmlyc3QgT1VUUFVUX01PUkUvTEFTVCBkZXNjcmlwdG9yJ3MKKwkgKiBkYXRhIGJ1ZmZlciBpcyBpbiB0aGUgY29udGV4dCBwcm9ncmFtJ3MgY29oZXJlbnQgcGFnZSBhbmQgbXVzdCBub3QKKwkgKiBiZSBzeW5jZWQuCisJICovCisJaWYgKChsZTMyX3RvX2NwdShwZC0+ZGF0YV9hZGRyZXNzKSAmIFBBR0VfTUFTSykgPT0KKwkgICAgKGNvbnRleHQtPmN1cnJlbnRfYnVzICAgICAgICAgICYgUEFHRV9NQVNLKSkgeworCQlpZiAocGQtPmNvbnRyb2wgJiBjcHVfdG9fbGUxNihERVNDUklQVE9SX0JSQU5DSF9BTFdBWVMpKQorCQkJcmV0dXJuOworCQlwZCsrOworCX0KKworCWRvIHsKKwkJYnVmZmVyX2RtYSA9IGxlMzJfdG9fY3B1KHBkLT5kYXRhX2FkZHJlc3MpOworCQlkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShjb250ZXh0LT5vaGNpLT5jYXJkLmRldmljZSwKKwkJCQkJICAgICAgYnVmZmVyX2RtYSAmIFBBR0VfTUFTSywKKwkJCQkJICAgICAgYnVmZmVyX2RtYSAmIH5QQUdFX01BU0ssCisJCQkJCSAgICAgIGxlMTZfdG9fY3B1KHBkLT5yZXFfY291bnQpLAorCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKKwkJY29udHJvbCA9IHBkLT5jb250cm9sOworCQlwZCsrOworCX0gd2hpbGUgKCEoY29udHJvbCAmIGNwdV90b19sZTE2KERFU0NSSVBUT1JfQlJBTkNIX0FMV0FZUykpKTsKK30KKwogc3RhdGljIGludCBoYW5kbGVfaXRfcGFja2V0KHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAogCQkJICAgIHN0cnVjdCBkZXNjcmlwdG9yICpkLAogCQkJICAgIHN0cnVjdCBkZXNjcmlwdG9yICpsYXN0KQpAQCAtMjYwMiw2ICsyODE4LDggQEAKIAkJLyogRGVzY3JpcHRvcihzKSBub3QgZG9uZSB5ZXQsIHN0b3AgaXRlcmF0aW9uICovCiAJCXJldHVybiAwOwogCisJc3luY19pdF9wYWNrZXRfZm9yX2NwdShjb250ZXh0LCBkKTsKKwogCWkgPSBjdHgtPmhlYWRlcl9sZW5ndGg7CiAJaWYgKGkgKyA0IDwgUEFHRV9TSVpFKSB7CiAJCS8qIFByZXNlbnQgdGhpcyB2YWx1ZSBhcyBiaWctZW5kaWFuIHRvIG1hdGNoIHRoZSByZWNlaXZlIGNvZGUgKi8KQEAgLTI5NzEsNiArMzE4OSwxMCBAQAogCQlwYWdlX2J1cyA9IHBhZ2VfcHJpdmF0ZShidWZmZXItPnBhZ2VzW3BhZ2VdKTsKIAkJcGRbaV0uZGF0YV9hZGRyZXNzID0gY3B1X3RvX2xlMzIocGFnZV9idXMgKyBvZmZzZXQpOwogCisJCWRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKGN0eC0+Y29udGV4dC5vaGNpLT5jYXJkLmRldmljZSwKKwkJCQkJCSBwYWdlX2J1cywgb2Zmc2V0LCBsZW5ndGgsCisJCQkJCQkgRE1BX1RPX0RFVklDRSk7CisKIAkJcGF5bG9hZF9pbmRleCArPSBsZW5ndGg7CiAJfQogCkBAIC0yOTk1LDYgKzMyMTcsNyBAQAogCQkJCSAgICAgICBzdHJ1Y3QgZndfaXNvX2J1ZmZlciAqYnVmZmVyLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBheWxvYWQpCiB7CisJc3RydWN0IGRldmljZSAqZGV2aWNlID0gY3R4LT5jb250ZXh0Lm9oY2ktPmNhcmQuZGV2aWNlOwogCXN0cnVjdCBkZXNjcmlwdG9yICpkLCAqcGQ7CiAJZG1hX2FkZHJfdCBkX2J1cywgcGFnZV9idXM7CiAJdTMyIHosIGhlYWRlcl96LCByZXN0OwpAQCAtMzA0OSw2ICszMjcyLDEwIEBACiAJCQlwYWdlX2J1cyA9IHBhZ2VfcHJpdmF0ZShidWZmZXItPnBhZ2VzW3BhZ2VdKTsKIAkJCXBkLT5kYXRhX2FkZHJlc3MgPSBjcHVfdG9fbGUzMihwYWdlX2J1cyArIG9mZnNldCk7CiAKKwkJCWRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKGRldmljZSwgcGFnZV9idXMsCisJCQkJCQkJIG9mZnNldCwgbGVuZ3RoLAorCQkJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCiAJCQlvZmZzZXQgPSAob2Zmc2V0ICsgbGVuZ3RoKSAmIH5QQUdFX01BU0s7CiAJCQlyZXN0IC09IGxlbmd0aDsKIAkJCWlmIChvZmZzZXQgPT0gMCkKQEAgLTMxMDgsNiArMzMzNSwxMCBAQAogCQlwYWdlX2J1cyA9IHBhZ2VfcHJpdmF0ZShidWZmZXItPnBhZ2VzW3BhZ2VdKTsKIAkJZC0+ZGF0YV9hZGRyZXNzID0gY3B1X3RvX2xlMzIocGFnZV9idXMgKyBvZmZzZXQpOwogCisJCWRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKGN0eC0+Y29udGV4dC5vaGNpLT5jYXJkLmRldmljZSwKKwkJCQkJCSBwYWdlX2J1cywgb2Zmc2V0LCBsZW5ndGgsCisJCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwogCQlyZXN0IC09IGxlbmd0aDsKIAkJb2Zmc2V0ID0gMDsKIAkJcGFnZSsrOwpAQCAtMzIzOSw4ICszNDcwLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmb2hjaS0+bG9jayk7CiAJbXV0ZXhfaW5pdCgmb2hjaS0+cGh5X3JlZ19tdXRleCk7CiAKLQl0YXNrbGV0X2luaXQoJm9oY2ktPmJ1c19yZXNldF90YXNrbGV0LAotCQkgICAgIGJ1c19yZXNldF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylvaGNpKTsKKwlJTklUX1dPUksoJm9oY2ktPmJ1c19yZXNldF93b3JrLCBidXNfcmVzZXRfd29yayk7CiAKIAllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb24oZGV2LCAwLCBvaGNpX2RyaXZlcl9uYW1lKTsKIAlpZiAoZXJyKSB7CkBAIC0zMzgyLDYgKzM2MTIsNyBAQAogCW9oY2kgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50TWFza0NsZWFyLCB+MCk7CiAJZmx1c2hfd3JpdGVzKG9oY2kpOworCWNhbmNlbF93b3JrX3N5bmMoJm9oY2ktPmJ1c19yZXNldF93b3JrKTsKIAlmd19jb3JlX3JlbW92ZV9jYXJkKCZvaGNpLT5jYXJkKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL3NicDIuYyBiL2RyaXZlcnMvZmlyZXdpcmUvc2JwMi5jCmluZGV4IDE3Y2VmODYuLjY4Mzc1YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvc2JwMi5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvc2JwMi5jCkBAIC0xNTQsMTIgKzE1NCwxNiBAQAogCWJvb2wgYmxvY2tlZDsKIH07CiAKK3N0YXRpYyB2b2lkIHNicDJfcXVldWVfd29yayhzdHJ1Y3Qgc2JwMl9sb2dpY2FsX3VuaXQgKmx1LCB1bnNpZ25lZCBsb25nIGRlbGF5KQoreworCXF1ZXVlX2RlbGF5ZWRfd29yayhmd193b3JrcXVldWUsICZsdS0+d29yaywgZGVsYXkpOworfQorCiAvKgogICogV2UgY3JlYXRlIG9uZSBzdHJ1Y3Qgc2JwMl90YXJnZXQgcGVyIElFRUUgMTIxMiBVbml0IERpcmVjdG9yeQogICogYW5kIG9uZSBzdHJ1Y3QgU2NzaV9Ib3N0IHBlciBzYnAyX3RhcmdldC4KICAqLwogc3RydWN0IHNicDJfdGFyZ2V0IHsKLQlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVjdCBmd191bml0ICp1bml0OwogCWNvbnN0IGNoYXIgKmJ1c19pZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGx1X2xpc3Q7CkBAIC03NzIsNzEgKzc3Niw2IEBACiAJcmV0dXJuIHNjc2lsdW5fdG9faW50KCZlaWdodF9ieXRlc19sdW4pOwogfQogCi1zdGF0aWMgdm9pZCBzYnAyX3JlbGVhc2VfdGFyZ2V0KHN0cnVjdCBrcmVmICprcmVmKQotewotCXN0cnVjdCBzYnAyX3RhcmdldCAqdGd0ID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBzYnAyX3RhcmdldCwga3JlZik7Ci0Jc3RydWN0IHNicDJfbG9naWNhbF91bml0ICpsdSwgKm5leHQ7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPQotCQljb250YWluZXJfb2YoKHZvaWQgKil0Z3QsIHN0cnVjdCBTY3NpX0hvc3QsIGhvc3RkYXRhWzBdKTsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7Ci0Jc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlID0gdGFyZ2V0X2RldmljZSh0Z3QpOwotCi0JLyogcHJldmVudCBkZWFkbG9ja3MgKi8KLQlzYnAyX3VuYmxvY2sodGd0KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsdSwgbmV4dCwgJnRndC0+bHVfbGlzdCwgbGluaykgewotCQlzZGV2ID0gc2NzaV9kZXZpY2VfbG9va3VwKHNob3N0LCAwLCAwLCBzYnAyX2x1bjJpbnQobHUtPmx1bikpOwotCQlpZiAoc2RldikgewotCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYpOwotCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOwotCQl9Ci0JCWlmIChsdS0+bG9naW5faWQgIT0gSU5WQUxJRF9MT0dJTl9JRCkgewotCQkJaW50IGdlbmVyYXRpb24sIG5vZGVfaWQ7Ci0JCQkvKgotCQkJICogdGd0LT5ub2RlX2lkIG1heSBiZSBvYnNvbGV0ZSBoZXJlIGlmIHdlIGZhaWxlZAotCQkJICogZHVyaW5nIGluaXRpYWwgbG9naW4gb3IgYWZ0ZXIgYSBidXMgcmVzZXQgd2hlcmUKLQkJCSAqIHRoZSB0b3BvbG9neSBjaGFuZ2VkLgotCQkJICovCi0JCQlnZW5lcmF0aW9uID0gZGV2aWNlLT5nZW5lcmF0aW9uOwotCQkJc21wX3JtYigpOyAvKiBub2RlX2lkIHZzLiBnZW5lcmF0aW9uICovCi0JCQlub2RlX2lkICAgID0gZGV2aWNlLT5ub2RlX2lkOwotCQkJc2JwMl9zZW5kX21hbmFnZW1lbnRfb3JiKGx1LCBub2RlX2lkLCBnZW5lcmF0aW9uLAotCQkJCQkJIFNCUDJfTE9HT1VUX1JFUVVFU1QsCi0JCQkJCQkgbHUtPmxvZ2luX2lkLCBOVUxMKTsKLQkJfQotCQlmd19jb3JlX3JlbW92ZV9hZGRyZXNzX2hhbmRsZXIoJmx1LT5hZGRyZXNzX2hhbmRsZXIpOwotCQlsaXN0X2RlbCgmbHUtPmxpbmspOwotCQlrZnJlZShsdSk7Ci0JfQotCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOwotCWZ3X25vdGlmeSgicmVsZWFzZWQgJXMsIHRhcmdldCAlZDowOjBcbiIsIHRndC0+YnVzX2lkLCBzaG9zdC0+aG9zdF9ubyk7Ci0KLQlmd191bml0X3B1dCh0Z3QtPnVuaXQpOwotCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwotCWZ3X2RldmljZV9wdXQoZGV2aWNlKTsKLX0KLQotc3RhdGljIHZvaWQgc2JwMl90YXJnZXRfZ2V0KHN0cnVjdCBzYnAyX3RhcmdldCAqdGd0KQotewotCWtyZWZfZ2V0KCZ0Z3QtPmtyZWYpOwotfQotCi1zdGF0aWMgdm9pZCBzYnAyX3RhcmdldF9wdXQoc3RydWN0IHNicDJfdGFyZ2V0ICp0Z3QpCi17Ci0Ja3JlZl9wdXQoJnRndC0+a3JlZiwgc2JwMl9yZWxlYXNlX3RhcmdldCk7Ci19Ci0KLS8qCi0gKiBBbHdheXMgZ2V0IHRoZSB0YXJnZXQncyBrcmVmIHdoZW4gc2NoZWR1bGluZyB3b3JrIG9uIG9uZSBpdHMgdW5pdHMuCi0gKiBFYWNoIHdvcmtxdWV1ZSBqb2IgaXMgcmVzcG9uc2libGUgdG8gY2FsbCBzYnAyX3RhcmdldF9wdXQoKSB1cG9uIHJldHVybi4KLSAqLwotc3RhdGljIHZvaWQgc2JwMl9xdWV1ZV93b3JrKHN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCAqbHUsIHVuc2lnbmVkIGxvbmcgZGVsYXkpCi17Ci0Jc2JwMl90YXJnZXRfZ2V0KGx1LT50Z3QpOwotCWlmICghcXVldWVfZGVsYXllZF93b3JrKGZ3X3dvcmtxdWV1ZSwgJmx1LT53b3JrLCBkZWxheSkpCi0JCXNicDJfdGFyZ2V0X3B1dChsdS0+dGd0KTsKLX0KLQogLyoKICAqIFdyaXRlIHJldHJhbnNtaXQgcmV0cnkgdmFsdWVzIGludG8gdGhlIEJVU1lfVElNRU9VVCByZWdpc3Rlci4KICAqIC0gVGhlIHNpbmdsZS1waGFzZSByZXRyeSBwcm90b2NvbCBpcyBzdXBwb3J0ZWQgYnkgYWxsIFNCUC0yIGRldmljZXMsIGJ1dCB0aGUKQEAgLTg3Nyw3ICs4MTYsNyBAQAogCWludCBnZW5lcmF0aW9uLCBub2RlX2lkLCBsb2NhbF9ub2RlX2lkOwogCiAJaWYgKGZ3X2RldmljZV9pc19zaHV0ZG93bihkZXZpY2UpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJZ2VuZXJhdGlvbiAgICA9IGRldmljZS0+Z2VuZXJhdGlvbjsKIAlzbXBfcm1iKCk7ICAgIC8qIG5vZGUgSURzIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLwpAQCAtODk5LDcgKzgzOCw3IEBACiAJCQkvKiBMZXQgYW55IHdhaXRpbmcgSS9PIGZhaWwgZnJvbSBub3cgb24uICovCiAJCQlzYnAyX3VuYmxvY2sobHUtPnRndCk7CiAJCX0KLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAl9CiAKIAl0Z3QtPm5vZGVfaWQJICA9IG5vZGVfaWQ7CkBAIC05MjUsNyArODY0LDggQEAKIAlpZiAobHUtPmhhc19zZGV2KSB7CiAJCXNicDJfY2FuY2VsX29yYnMobHUpOwogCQlzYnAyX2NvbmRpdGlvbmFsbHlfdW5ibG9jayhsdSk7Ci0JCWdvdG8gb3V0OworCisJCXJldHVybjsKIAl9CiAKIAlpZiAobHUtPnRndC0+d29ya2Fyb3VuZHMgJiBTQlAyX1dPUktBUk9VTkRfREVMQVlfSU5RVUlSWSkKQEAgLTk1Nyw3ICs4OTcsOCBAQAogCWx1LT5oYXNfc2RldiA9IHRydWU7CiAJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOwogCXNicDJfYWxsb3dfYmxvY2sobHUpOwotCWdvdG8gb3V0OworCisJcmV0dXJuOwogCiAgb3V0X2xvZ291dF9sb2dpbjoKIAlzbXBfcm1iKCk7IC8qIGdlbmVyYXRpb24gbWF5IGhhdmUgY2hhbmdlZCAqLwpAQCAtOTcxLDggKzkxMiw1NyBAQAogCSAqIGx1LT53b3JrIGFscmVhZHkuICBSZXNldCB0aGUgd29yayBmcm9tIHJlY29ubmVjdCB0byBsb2dpbi4KIAkgKi8KIAlQUkVQQVJFX0RFTEFZRURfV09SSygmbHUtPndvcmssIHNicDJfbG9naW4pOwotIG91dDoKLQlzYnAyX3RhcmdldF9wdXQodGd0KTsKK30KKworc3RhdGljIHZvaWQgc2JwMl9yZWNvbm5lY3Qoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCAqbHUgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNicDJfbG9naWNhbF91bml0LCB3b3JrLndvcmspOworCXN0cnVjdCBzYnAyX3RhcmdldCAqdGd0ID0gbHUtPnRndDsKKwlzdHJ1Y3QgZndfZGV2aWNlICpkZXZpY2UgPSB0YXJnZXRfZGV2aWNlKHRndCk7CisJaW50IGdlbmVyYXRpb24sIG5vZGVfaWQsIGxvY2FsX25vZGVfaWQ7CisKKwlpZiAoZndfZGV2aWNlX2lzX3NodXRkb3duKGRldmljZSkpCisJCXJldHVybjsKKworCWdlbmVyYXRpb24gICAgPSBkZXZpY2UtPmdlbmVyYXRpb247CisJc21wX3JtYigpOyAgICAvKiBub2RlIElEcyBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KKwlub2RlX2lkICAgICAgID0gZGV2aWNlLT5ub2RlX2lkOworCWxvY2FsX25vZGVfaWQgPSBkZXZpY2UtPmNhcmQtPm5vZGVfaWQ7CisKKwlpZiAoc2JwMl9zZW5kX21hbmFnZW1lbnRfb3JiKGx1LCBub2RlX2lkLCBnZW5lcmF0aW9uLAorCQkJCSAgICAgU0JQMl9SRUNPTk5FQ1RfUkVRVUVTVCwKKwkJCQkgICAgIGx1LT5sb2dpbl9pZCwgTlVMTCkgPCAwKSB7CisJCS8qCisJCSAqIElmIHJlY29ubmVjdCB3YXMgaW1wb3NzaWJsZSBldmVuIHRob3VnaCB3ZSBhcmUgaW4gdGhlCisJCSAqIGN1cnJlbnQgZ2VuZXJhdGlvbiwgZmFsbCBiYWNrIGFuZCB0cnkgdG8gbG9nIGluIGFnYWluLgorCQkgKgorCQkgKiBXZSBjb3VsZCBjaGVjayBmb3IgIkZ1bmN0aW9uIHJlamVjdGVkIiBzdGF0dXMsIGJ1dAorCQkgKiBsb29raW5nIGF0IHRoZSBidXMgZ2VuZXJhdGlvbiBhcyBzaW1wbGVyIGFuZCBtb3JlIGdlbmVyYWwuCisJCSAqLworCQlzbXBfcm1iKCk7IC8qIGdldCBjdXJyZW50IGNhcmQgZ2VuZXJhdGlvbiAqLworCQlpZiAoZ2VuZXJhdGlvbiA9PSBkZXZpY2UtPmNhcmQtPmdlbmVyYXRpb24gfHwKKwkJICAgIGx1LT5yZXRyaWVzKysgPj0gNSkgeworCQkJZndfZXJyb3IoIiVzOiBmYWlsZWQgdG8gcmVjb25uZWN0XG4iLCB0Z3QtPmJ1c19pZCk7CisJCQlsdS0+cmV0cmllcyA9IDA7CisJCQlQUkVQQVJFX0RFTEFZRURfV09SSygmbHUtPndvcmssIHNicDJfbG9naW4pOworCQl9CisJCXNicDJfcXVldWVfd29yayhsdSwgRElWX1JPVU5EX1VQKEhaLCA1KSk7CisKKwkJcmV0dXJuOworCX0KKworCXRndC0+bm9kZV9pZCAgICAgID0gbm9kZV9pZDsKKwl0Z3QtPmFkZHJlc3NfaGlnaCA9IGxvY2FsX25vZGVfaWQgPDwgMTY7CisJc21wX3dtYigpOwkgIC8qIG5vZGUgSURzIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLworCWx1LT5nZW5lcmF0aW9uCSAgPSBnZW5lcmF0aW9uOworCisJZndfbm90aWZ5KCIlczogcmVjb25uZWN0ZWQgdG8gTFVOICUwNHggKCVkIHJldHJpZXMpXG4iLAorCQkgIHRndC0+YnVzX2lkLCBsdS0+bHVuLCBsdS0+cmV0cmllcyk7CisKKwlzYnAyX2FnZW50X3Jlc2V0KGx1KTsKKwlzYnAyX2NhbmNlbF9vcmJzKGx1KTsKKwlzYnAyX2NvbmRpdGlvbmFsbHlfdW5ibG9jayhsdSk7CiB9CiAKIHN0YXRpYyBpbnQgc2JwMl9hZGRfbG9naWNhbF91bml0KHN0cnVjdCBzYnAyX3RhcmdldCAqdGd0LCBpbnQgbHVuX2VudHJ5KQpAQCAtMTEyMCw2ICsxMTEwLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgc2NzaV9kcml2ZXJfdGVtcGxhdGU7CitzdGF0aWMgaW50IHNicDJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIHN0YXRpYyBpbnQgc2JwMl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xMTQxLDcgKzExMzIsNiBAQAogCXRndCA9IChzdHJ1Y3Qgc2JwMl90YXJnZXQgKilzaG9zdC0+aG9zdGRhdGE7CiAJZGV2X3NldF9kcnZkYXRhKCZ1bml0LT5kZXZpY2UsIHRndCk7CiAJdGd0LT51bml0ID0gdW5pdDsKLQlrcmVmX2luaXQoJnRndC0+a3JlZik7CiAJSU5JVF9MSVNUX0hFQUQoJnRndC0+bHVfbGlzdCk7CiAJdGd0LT5idXNfaWQgPSBkZXZfbmFtZSgmdW5pdC0+ZGV2aWNlKTsKIAl0Z3QtPmd1aWQgPSAodTY0KWRldmljZS0+Y29uZmlnX3JvbVszXSA8PCAzMiB8IGRldmljZS0+Y29uZmlnX3JvbVs0XTsKQEAgLTExNTQsOSArMTE0NCw2IEBACiAJaWYgKHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZ1bml0LT5kZXZpY2UpIDwgMCkKIAkJZ290byBmYWlsX3Nob3N0X3B1dDsKIAotCWZ3X2RldmljZV9nZXQoZGV2aWNlKTsKLQlmd191bml0X2dldCh1bml0KTsKLQogCS8qIGltcGxpY2l0IGRpcmVjdG9yeSBJRCAqLwogCXRndC0+ZGlyZWN0b3J5X2lkID0gKCh1bml0LT5kaXJlY3RvcnkgLSBkZXZpY2UtPmNvbmZpZ19yb20pICogNAogCQkJICAgICArIENTUl9DT05GSUdfUk9NKSAmIDB4ZmZmZmZmOwpAQCAtMTE2Niw3ICsxMTUzLDcgQEAKIAogCWlmIChzYnAyX3NjYW5fdW5pdF9kaXIodGd0LCB1bml0LT5kaXJlY3RvcnksICZtb2RlbCwKIAkJCSAgICAgICAmZmlybXdhcmVfcmV2aXNpb24pIDwgMCkKLQkJZ290byBmYWlsX3RndF9wdXQ7CisJCWdvdG8gZmFpbF9yZW1vdmU7CiAKIAlzYnAyX2NsYW1wX21hbmFnZW1lbnRfb3JiX3RpbWVvdXQodGd0KTsKIAlzYnAyX2luaXRfd29ya2Fyb3VuZHModGd0LCBtb2RlbCwgZmlybXdhcmVfcmV2aXNpb24pOwpAQCAtMTE3NywxNiArMTE2NCwxNyBAQAogCSAqIHNwZWNpZmllcyB0aGUgbWF4IHBheWxvYWQgc2l6ZSBhcyAyIF4gKG1heF9wYXlsb2FkICsgMiksIHNvCiAJICogaWYgd2Ugc2V0IHRoaXMgdG8gbWF4X3NwZWVkICsgNywgd2UgZ2V0IHRoZSByaWdodCB2YWx1ZS4KIAkgKi8KLQl0Z3QtPm1heF9wYXlsb2FkID0gbWluKGRldmljZS0+bWF4X3NwZWVkICsgNywgMTBVKTsKLQl0Z3QtPm1heF9wYXlsb2FkID0gbWluKHRndC0+bWF4X3BheWxvYWQsIGRldmljZS0+Y2FyZC0+bWF4X3JlY2VpdmUgLSAxKTsKKwl0Z3QtPm1heF9wYXlsb2FkID0gbWluMyhkZXZpY2UtPm1heF9zcGVlZCArIDcsIDEwVSwKKwkJCQlkZXZpY2UtPmNhcmQtPm1heF9yZWNlaXZlIC0gMSk7CiAKIAkvKiBEbyB0aGUgbG9naW4gaW4gYSB3b3JrcXVldWUgc28gd2UgY2FuIGVhc2lseSByZXNjaGVkdWxlIHJldHJpZXMuICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShsdSwgJnRndC0+bHVfbGlzdCwgbGluaykKIAkJc2JwMl9xdWV1ZV93b3JrKGx1LCBESVZfUk9VTkRfVVAoSFosIDUpKTsKKwogCXJldHVybiAwOwogCi0gZmFpbF90Z3RfcHV0OgotCXNicDJfdGFyZ2V0X3B1dCh0Z3QpOworIGZhaWxfcmVtb3ZlOgorCXNicDJfcmVtb3ZlKGRldik7CiAJcmV0dXJuIC1FTk9NRU07CiAKICBmYWlsX3Nob3N0X3B1dDoKQEAgLTExOTQsNzEgKzExODIsNiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgaW50IHNicDJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZndfdW5pdCAqdW5pdCA9IGZ3X3VuaXQoZGV2KTsKLQlzdHJ1Y3Qgc2JwMl90YXJnZXQgKnRndCA9IGRldl9nZXRfZHJ2ZGF0YSgmdW5pdC0+ZGV2aWNlKTsKLQlzdHJ1Y3Qgc2JwMl9sb2dpY2FsX3VuaXQgKmx1OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShsdSwgJnRndC0+bHVfbGlzdCwgbGluaykKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZsdS0+d29yayk7Ci0KLQlzYnAyX3RhcmdldF9wdXQodGd0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2JwMl9yZWNvbm5lY3Qoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCAqbHUgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNicDJfbG9naWNhbF91bml0LCB3b3JrLndvcmspOwotCXN0cnVjdCBzYnAyX3RhcmdldCAqdGd0ID0gbHUtPnRndDsKLQlzdHJ1Y3QgZndfZGV2aWNlICpkZXZpY2UgPSB0YXJnZXRfZGV2aWNlKHRndCk7Ci0JaW50IGdlbmVyYXRpb24sIG5vZGVfaWQsIGxvY2FsX25vZGVfaWQ7Ci0KLQlpZiAoZndfZGV2aWNlX2lzX3NodXRkb3duKGRldmljZSkpCi0JCWdvdG8gb3V0OwotCi0JZ2VuZXJhdGlvbiAgICA9IGRldmljZS0+Z2VuZXJhdGlvbjsKLQlzbXBfcm1iKCk7ICAgIC8qIG5vZGUgSURzIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLwotCW5vZGVfaWQgICAgICAgPSBkZXZpY2UtPm5vZGVfaWQ7Ci0JbG9jYWxfbm9kZV9pZCA9IGRldmljZS0+Y2FyZC0+bm9kZV9pZDsKLQotCWlmIChzYnAyX3NlbmRfbWFuYWdlbWVudF9vcmIobHUsIG5vZGVfaWQsIGdlbmVyYXRpb24sCi0JCQkJICAgICBTQlAyX1JFQ09OTkVDVF9SRVFVRVNULAotCQkJCSAgICAgbHUtPmxvZ2luX2lkLCBOVUxMKSA8IDApIHsKLQkJLyoKLQkJICogSWYgcmVjb25uZWN0IHdhcyBpbXBvc3NpYmxlIGV2ZW4gdGhvdWdoIHdlIGFyZSBpbiB0aGUKLQkJICogY3VycmVudCBnZW5lcmF0aW9uLCBmYWxsIGJhY2sgYW5kIHRyeSB0byBsb2cgaW4gYWdhaW4uCi0JCSAqCi0JCSAqIFdlIGNvdWxkIGNoZWNrIGZvciAiRnVuY3Rpb24gcmVqZWN0ZWQiIHN0YXR1cywgYnV0Ci0JCSAqIGxvb2tpbmcgYXQgdGhlIGJ1cyBnZW5lcmF0aW9uIGFzIHNpbXBsZXIgYW5kIG1vcmUgZ2VuZXJhbC4KLQkJICovCi0JCXNtcF9ybWIoKTsgLyogZ2V0IGN1cnJlbnQgY2FyZCBnZW5lcmF0aW9uICovCi0JCWlmIChnZW5lcmF0aW9uID09IGRldmljZS0+Y2FyZC0+Z2VuZXJhdGlvbiB8fAotCQkgICAgbHUtPnJldHJpZXMrKyA+PSA1KSB7Ci0JCQlmd19lcnJvcigiJXM6IGZhaWxlZCB0byByZWNvbm5lY3RcbiIsIHRndC0+YnVzX2lkKTsKLQkJCWx1LT5yZXRyaWVzID0gMDsKLQkJCVBSRVBBUkVfREVMQVlFRF9XT1JLKCZsdS0+d29yaywgc2JwMl9sb2dpbik7Ci0JCX0KLQkJc2JwMl9xdWV1ZV93b3JrKGx1LCBESVZfUk9VTkRfVVAoSFosIDUpKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JdGd0LT5ub2RlX2lkICAgICAgPSBub2RlX2lkOwotCXRndC0+YWRkcmVzc19oaWdoID0gbG9jYWxfbm9kZV9pZCA8PCAxNjsKLQlzbXBfd21iKCk7CSAgLyogbm9kZSBJRHMgbXVzdCBub3QgYmUgb2xkZXIgdGhhbiBnZW5lcmF0aW9uICovCi0JbHUtPmdlbmVyYXRpb24JICA9IGdlbmVyYXRpb247Ci0KLQlmd19ub3RpZnkoIiVzOiByZWNvbm5lY3RlZCB0byBMVU4gJTA0eCAoJWQgcmV0cmllcylcbiIsCi0JCSAgdGd0LT5idXNfaWQsIGx1LT5sdW4sIGx1LT5yZXRyaWVzKTsKLQotCXNicDJfYWdlbnRfcmVzZXQobHUpOwotCXNicDJfY2FuY2VsX29yYnMobHUpOwotCXNicDJfY29uZGl0aW9uYWxseV91bmJsb2NrKGx1KTsKLSBvdXQ6Ci0Jc2JwMl90YXJnZXRfcHV0KHRndCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNicDJfdXBkYXRlKHN0cnVjdCBmd191bml0ICp1bml0KQogewogCXN0cnVjdCBzYnAyX3RhcmdldCAqdGd0ID0gZGV2X2dldF9kcnZkYXRhKCZ1bml0LT5kZXZpY2UpOwpAQCAtMTI3Nyw2ICsxMjAwLDUxIEBACiAJfQogfQogCitzdGF0aWMgaW50IHNicDJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZndfdW5pdCAqdW5pdCA9IGZ3X3VuaXQoZGV2KTsKKwlzdHJ1Y3QgZndfZGV2aWNlICpkZXZpY2UgPSBmd19wYXJlbnRfZGV2aWNlKHVuaXQpOworCXN0cnVjdCBzYnAyX3RhcmdldCAqdGd0ID0gZGV2X2dldF9kcnZkYXRhKCZ1bml0LT5kZXZpY2UpOworCXN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCAqbHUsICpuZXh0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0KKwkJY29udGFpbmVyX29mKCh2b2lkICopdGd0LCBzdHJ1Y3QgU2NzaV9Ib3N0LCBob3N0ZGF0YVswXSk7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJLyogcHJldmVudCBkZWFkbG9ja3MgKi8KKwlzYnAyX3VuYmxvY2sodGd0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsdSwgbmV4dCwgJnRndC0+bHVfbGlzdCwgbGluaykgeworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmx1LT53b3JrKTsKKwkJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cChzaG9zdCwgMCwgMCwgc2JwMl9sdW4yaW50KGx1LT5sdW4pKTsKKwkJaWYgKHNkZXYpIHsKKwkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKKwkJCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKwkJfQorCQlpZiAobHUtPmxvZ2luX2lkICE9IElOVkFMSURfTE9HSU5fSUQpIHsKKwkJCWludCBnZW5lcmF0aW9uLCBub2RlX2lkOworCQkJLyoKKwkJCSAqIHRndC0+bm9kZV9pZCBtYXkgYmUgb2Jzb2xldGUgaGVyZSBpZiB3ZSBmYWlsZWQKKwkJCSAqIGR1cmluZyBpbml0aWFsIGxvZ2luIG9yIGFmdGVyIGEgYnVzIHJlc2V0IHdoZXJlCisJCQkgKiB0aGUgdG9wb2xvZ3kgY2hhbmdlZC4KKwkJCSAqLworCQkJZ2VuZXJhdGlvbiA9IGRldmljZS0+Z2VuZXJhdGlvbjsKKwkJCXNtcF9ybWIoKTsgLyogbm9kZV9pZCB2cy4gZ2VuZXJhdGlvbiAqLworCQkJbm9kZV9pZCAgICA9IGRldmljZS0+bm9kZV9pZDsKKwkJCXNicDJfc2VuZF9tYW5hZ2VtZW50X29yYihsdSwgbm9kZV9pZCwgZ2VuZXJhdGlvbiwKKwkJCQkJCSBTQlAyX0xPR09VVF9SRVFVRVNULAorCQkJCQkJIGx1LT5sb2dpbl9pZCwgTlVMTCk7CisJCX0KKwkJZndfY29yZV9yZW1vdmVfYWRkcmVzc19oYW5kbGVyKCZsdS0+YWRkcmVzc19oYW5kbGVyKTsKKwkJbGlzdF9kZWwoJmx1LT5saW5rKTsKKwkJa2ZyZWUobHUpOworCX0KKwlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKKwlmd19ub3RpZnkoInJlbGVhc2VkICVzLCB0YXJnZXQgJWQ6MDowXG4iLCB0Z3QtPmJ1c19pZCwgc2hvc3QtPmhvc3Rfbm8pOworCisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgU0JQMl9VTklUX1NQRUNfSURfRU5UUlkJMHgwMDAwNjA5ZQogI2RlZmluZSBTQlAyX1NXX1ZFUlNJT05fRU5UUlkJMHgwMDAxMDQ4MwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZGQuYwppbmRleCBmMWI3ZjY1Li5lMjI5NTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWRkLmMKQEAgLTE1MSw3ICsxNTEsOCBAQAogCQlwICs9IHNjbnByaW50ZihwLCBsZWZ0LCAiXHRiYXNlX2FkZHJlc3M6ICV4XG4iLAogCQkJICAgICBpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGguaXNhLmJhc2VfYWRkcmVzcyk7CiAJfSBlbHNlIGlmICghc3RybmNtcChpbmZvLT5wYXJhbXMuaG9zdF9idXNfdHlwZSwgIlBDSVgiLCA0KSB8fAotCQkgICAhc3RybmNtcChpbmZvLT5wYXJhbXMuaG9zdF9idXNfdHlwZSwgIlBDSSIsIDMpKSB7CisJCSAgICFzdHJuY21wKGluZm8tPnBhcmFtcy5ob3N0X2J1c190eXBlLCAiUENJIiwgMykgfHwKKwkJICAgIXN0cm5jbXAoaW5mby0+cGFyYW1zLmhvc3RfYnVzX3R5cGUsICJYUFJTIiwgNCkpIHsKIAkJcCArPSBzY25wcmludGYocCwgbGVmdCwKIAkJCSAgICAgIlx0JTAyeDolMDJ4LiVkICBjaGFubmVsOiAldVxuIiwKIAkJCSAgICAgaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS5idXMsCkBAIC0xNTksNyArMTYwLDYgQEAKIAkJCSAgICAgaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS5mdW5jdGlvbiwKIAkJCSAgICAgaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS5jaGFubmVsKTsKIAl9IGVsc2UgaWYgKCFzdHJuY21wKGluZm8tPnBhcmFtcy5ob3N0X2J1c190eXBlLCAiSUJORCIsIDQpIHx8Ci0JCSAgICFzdHJuY21wKGluZm8tPnBhcmFtcy5ob3N0X2J1c190eXBlLCAiWFBSUyIsIDQpIHx8CiAJCSAgICFzdHJuY21wKGluZm8tPnBhcmFtcy5ob3N0X2J1c190eXBlLCAiSFRQVCIsIDQpKSB7CiAJCXAgKz0gc2NucHJpbnRmKHAsIGxlZnQsCiAJCQkgICAgICJcdFRCRDogJWxseFxuIiwKQEAgLTY2OCw3ICs2NjgsNyBAQAogewogCXN0cnVjdCBlZGRfaW5mbyAqaW5mbyA9IGVkZF9kZXZfZ2V0X2luZm8oZWRldik7CiAKLQlpZiAoZWRkX2Rldl9pc190eXBlKGVkZXYsICJQQ0kiKSkgeworCWlmIChlZGRfZGV2X2lzX3R5cGUoZWRldiwgIlBDSSIpIHx8IGVkZF9kZXZfaXNfdHlwZShlZGV2LCAiWFBSUyIpKSB7CiAJCXJldHVybiBwY2lfZ2V0X2J1c19hbmRfc2xvdChpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLmJ1cywKIAkJCQkgICAgIFBDSV9ERVZGTihpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLnNsb3QsCiAJCQkJCSAgICAgICBpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaXZhcnMuYwppbmRleCBlYjgwYjU0Li44MzcwZjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaXZhcnMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaXZhcnMuYwpAQCAtNDkwLDggKzQ5MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1NjQgZWZpX3BzdG9yZV93cml0ZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAotCQkJICAgIHNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3N0YXRpYyBpbnQgZWZpX3BzdG9yZV93cml0ZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCAqaWQsCisJCXVuc2lnbmVkIGludCBwYXJ0LCBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCiB7CiAJY2hhciBuYW1lW0RVTVBfTkFNRV9MRU5dOwogCWNoYXIgc3R1Yl9uYW1lW0RVTVBfTkFNRV9MRU5dOwpAQCAtNDk5LDcgKzQ5OSw3IEBACiAJZWZpX2d1aWRfdCB2ZW5kb3IgPSBMSU5VWF9FRklfQ1JBU0hfR1VJRDsKIAlzdHJ1Y3QgZWZpdmFycyAqZWZpdmFycyA9IHBzaS0+ZGF0YTsKIAlzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgKmZvdW5kID0gTlVMTDsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0ID0gMDsKIAogCXNwcmludGYoc3R1Yl9uYW1lLCAiZHVtcC10eXBlJXUtJXUtIiwgdHlwZSwgcGFydCk7CiAJc3ByaW50ZihuYW1lLCAiJXMlbHUiLCBzdHViX25hbWUsIGdldF9zZWNvbmRzKCkpOwpAQCAtNTQ4LDE4ICs1NDgsMTkgQEAKIAkJZWZpdmFyX3VucmVnaXN0ZXIoZm91bmQpOwogCiAJaWYgKHNpemUpCi0JCWVmaXZhcl9jcmVhdGVfc3lzZnNfZW50cnkoZWZpdmFycywKKwkJcmV0ID0gZWZpdmFyX2NyZWF0ZV9zeXNmc19lbnRyeShlZml2YXJzLAogCQkJCQkgIHV0ZjE2X3N0cnNpemUoZWZpX25hbWUsCiAJCQkJCQkJRFVNUF9OQU1FX0xFTiAqIDIpLAogCQkJCQkgIGVmaV9uYW1lLCAmdmVuZG9yKTsKIAotCXJldHVybiBwYXJ0OworCSppZCA9IHBhcnQ7CisJcmV0dXJuIHJldDsKIH07CiAKIHN0YXRpYyBpbnQgZWZpX3BzdG9yZV9lcmFzZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCBpZCwKIAkJCSAgICBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKIHsKLQllZmlfcHN0b3JlX3dyaXRlKHR5cGUsIGlkLCAwLCBwc2kpOworCWVmaV9wc3RvcmVfd3JpdGUodHlwZSwgJmlkLCAodW5zaWduZWQgaW50KWlkLCAwLCBwc2kpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01ODAsOCArNTgxLDggQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB1NjQgZWZpX3BzdG9yZV93cml0ZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAotCQkJICAgIHNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3N0YXRpYyBpbnQgZWZpX3BzdG9yZV93cml0ZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCAqaWQsCisJCXVuc2lnbmVkIGludCBwYXJ0LCBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC05NzgsNyArOTc5LDcgQEAKIAlpZiAoZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvLmJ1ZikgewogCQllZml2YXJzLT5lZmlfcHN0b3JlX2luZm8uYnVmc2l6ZSA9IDEwMjQ7CiAJCWVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mby5kYXRhID0gZWZpdmFyczsKLQkJbXV0ZXhfaW5pdCgmZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvLmJ1Zl9tdXRleCk7CisJCXNwaW5fbG9ja19pbml0KCZlZml2YXJzLT5lZmlfcHN0b3JlX2luZm8uYnVmX2xvY2spOwogCQlwc3RvcmVfcmVnaXN0ZXIoJmVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mbyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKaW5kZXggYWE4M2RlOS4uYzRlN2M1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIEdTTUlfU0hVVERPV05fQ0xFQU4JMAkvKiBDbGVhbiBTaHV0ZG93biAqLwogLyogVE9ETyhtaWtld0Bnb29nbGUuY29tKTogVGllIGluIEhBUkRMT0NLVVBfREVURUNUT1Igd2l0aCBOTUlXRFQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9LY29uZmlnIGIvZHJpdmVycy9ncGlvL0tjb25maWcKaW5kZXggZDUzOWVmZC4uODQ4MmEyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL0tjb25maWcKKysrIGIvZHJpdmVycy9ncGlvL0tjb25maWcKQEAgLTk1LDE0ICs5NSwxOCBAQAogCWRlcGVuZHMgb24gQVJDSF9FUDkzWFgKIAlzZWxlY3QgR1BJT19HRU5FUklDCiAKLWNvbmZpZyBHUElPX0VYWU5PUzQKLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBDUFVfRVhZTk9TNDIxMAotCiBjb25maWcgR1BJT19NUEM1MjAwCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gUFBDX01QQzUyeHgKIAorY29uZmlnIEdQSU9fTVBDOFhYWAorCWJvb2wgIk1QQzUxMngvTVBDOHh4eCBHUElPIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQUENfTVBDNTEyeCB8fCBQUENfTVBDODMxeCB8fCBQUENfTVBDODM0eCB8fCBQUENfTVBDODM3eCB8fCBcCisJCSAgIEZTTF9TT0NfQk9PS0UgfHwgUFBDXzg2eHgKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSdyZSBnb2luZyB0byB1c2UgaGFyZHdhcmUgdGhhdCBjb25uZWN0cyB0byB0aGUKKwkgIE1QQzUxMngvODMxeC84MzR4LzgzN3gvODU3Mi84NjEwIEdQSU9zLgorCiBjb25maWcgR1BJT19NU01fVjEKIAl0cmlzdGF0ZSAiUXVhbGNvbW0gTVNNIEdQSU8gdjEiCiAJZGVwZW5kcyBvbiBHUElPTElCICYmIEFSQ0hfTVNNCkBAIC0xMzEsMTggKzEzNSw2IEBACiAJc2VsZWN0IEdQSU9fR0VORVJJQwogCXNlbGVjdCBHRU5FUklDX0lSUV9DSElQCiAKLWNvbmZpZyBHUElPX1BMQVRfU0FNU1VORwotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFNBTVNVTkdfR1BJT0xJQl80QklUCi0KLWNvbmZpZyBHUElPX1M1UEMxMDAKLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBDUFVfUzVQQzEwMAotCi1jb25maWcgR1BJT19TNVBWMjEwCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gQ1BVX1M1UFYyMTAKLQogY29uZmlnIEdQSU9fUEwwNjEKIAlib29sICJQcmltZUNlbGwgUEwwNjEgR1BJTyBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJNX0FNQkEKQEAgLTE3OCw5ICsxNzAsMTggQEAKIAkgIFRoZSBJbnRlbCBUdW5uZWwgQ3JlZWsgcHJvY2Vzc29yIGhhcyA1IEdQSU9zIHBvd2VyZWQgYnkgdGhlCiAJICBjb3JlIHBvd2VyIHJhaWwgYW5kIDkgZnJvbSBzdXNwZW5kIHBvd2VyIHN1cHBseS4KIAorY29uZmlnIEdQSU9fVTMwMAorCWJvb2wgIlNULUVyaWNzc29uIFUzMDAgQ09IIDkwMSAzMzUvNTcxIEdQSU8iCisJZGVwZW5kcyBvbiBHUElPTElCICYmIEFSQ0hfVTMwMAorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IEdQSU8gaW50ZXJmYWNlIG9uIFNULUVyaWNzc29uIFUzMDAuCisJICBUaGUgbmFtZXMgb2YgdGhlIHR3byBJUCBibG9jayB2YXJpYW50cyBzdXBwb3J0ZWQgYXJlCisJICBDT0ggOTAxIDMzNSBhbmQgQ09IIDkwMSA1NzEvMy4gVGhleSBjb250YWluIDMsIDUgb3IgNworCSAgcG9ydHMgb2YgOCBHUElPIHBpbnMgZWFjaC4KKwogY29uZmlnIEdQSU9fVlg4NTUKIAl0cmlzdGF0ZSAiVklBIFZYODU1L1ZYODc1IEdQSU8iCi0JZGVwZW5kcyBvbiBNRkRfU1VQUE9SVCAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSQogCXNlbGVjdCBNRkRfQ09SRQogCXNlbGVjdCBNRkRfVlg4NTUKIAloZWxwCkBAIC0zODgsNiArMzg5LDcgQEAKIGNvbmZpZyBHUElPX1BDSAogCXRyaXN0YXRlICJJbnRlbCBFRzIwVCBQQ0ggLyBPS0kgU0VNSUNPTkRVQ1RPUiBNTDcyMjMgSU9IIEdQSU8iCiAJZGVwZW5kcyBvbiBQQ0kgJiYgWDg2CisJc2VsZWN0IEdFTkVSSUNfSVJRX0NISVAKIAloZWxwCiAJICBUaGlzIGRyaXZlciBpcyBmb3IgUENIKFBsYXRmb3JtIGNvbnRyb2xsZXIgSHViKSBHUElPIG9mIEludGVsIFRvcGNsaWZmCiAJICB3aGljaCBpcyBhbiBJT0goSW5wdXQvT3V0cHV0IEh1YikgZm9yIHg4NiBlbWJlZGRlZCBwcm9jZXNzb3IuCkBAIC00MDIsNiArNDA0LDcgQEAKIGNvbmZpZyBHUElPX01MX0lPSAogCXRyaXN0YXRlICJPS0kgU0VNSUNPTkRVQ1RPUiBNTDcyMTMgSU9IIEdQSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQorCXNlbGVjdCBHRU5FUklDX0lSUV9DSElQCiAJaGVscAogCSAgTUw3MjEzIGlzIGNvbXBhbmlvbiBjaGlwIGZvciBJbnRlbCBBdG9tIEU2eHggc2VyaWVzLgogCSAgVGhpcyBkcml2ZXIgY2FuIGJlIHVzZWQgZm9yIE9LSSBTRU1JQ09ORFVDVE9SIE1MNzIxMyBJT0goSW5wdXQvT3V0cHV0CkBAIC00MTcsNyArNDIwLDYgQEAKIGNvbmZpZyBHUElPX1JEQzMyMVgKIAl0cmlzdGF0ZSAiUkRDIFItMzIxeCBHUElPIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKLQlzZWxlY3QgTUZEX1NVUFBPUlQKIAlzZWxlY3QgTUZEX0NPUkUKIAlzZWxlY3QgTUZEX1JEQzMyMVgKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vTWFrZWZpbGUgYi9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKaW5kZXggOTU4ODk0OC4uZGJjYjBiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQpAQCAtMTQsMTEgKzE0LDEzIEBACiBvYmotJChDT05GSUdfR1BJT19CVDhYWCkJKz0gZ3Bpby1idDh4eC5vCiBvYmotJChDT05GSUdfR1BJT19DUzU1MzUpCSs9IGdwaW8tY3M1NTM1Lm8KIG9iai0kKENPTkZJR19HUElPX0RBOTA1MikJKz0gZ3Bpby1kYTkwNTIubworb2JqLSQoQ09ORklHX0FSQ0hfREFWSU5DSSkJKz0gZ3Bpby1kYXZpbmNpLm8KIG9iai0kKENPTkZJR19HUElPX0VQOTNYWCkJKz0gZ3Bpby1lcDkzeHgubwotb2JqLSQoQ09ORklHX0dQSU9fRVhZTk9TNCkJKz0gZ3Bpby1leHlub3M0Lm8KIG9iai0kKENPTkZJR19HUElPX0lUODc2MUUpCSs9IGdwaW8taXQ4NzYxZS5vCiBvYmotJChDT05GSUdfR1BJT19KQU5aX1RUTCkJKz0gZ3Bpby1qYW56LXR0bC5vCitvYmotJChDT05GSUdfTUFDSF9LUzg2OTUpCSs9IGdwaW8ta3M4Njk1Lm8KIG9iai0kKENPTkZJR19HUElPX0xBTkdXRUxMKQkrPSBncGlvLWxhbmd3ZWxsLm8KK29iai0kKENPTkZJR19BUkNIX0xQQzMyWFgpCSs9IGdwaW8tbHBjMzJ4eC5vCiBvYmotJChDT05GSUdfR1BJT19NQVg3MzBYKQkrPSBncGlvLW1heDczMHgubwogb2JqLSQoQ09ORklHX0dQSU9fTUFYNzMwMCkJKz0gZ3Bpby1tYXg3MzAwLm8KIG9iai0kKENPTkZJR19HUElPX01BWDczMDEpCSs9IGdwaW8tbWF4NzMwMS5vCkBAIC0yNyw2ICsyOSw3IEBACiBvYmotJChDT05GSUdfR1BJT19NQ1AyM1MwOCkJKz0gZ3Bpby1tY3AyM3MwOC5vCiBvYmotJChDT05GSUdfR1BJT19NTF9JT0gpCSs9IGdwaW8tbWwtaW9oLm8KIG9iai0kKENPTkZJR19HUElPX01QQzUyMDApCSs9IGdwaW8tbXBjNTIwMC5vCitvYmotJChDT05GSUdfR1BJT19NUEM4WFhYKQkrPSBncGlvLW1wYzh4eHgubwogb2JqLSQoQ09ORklHX0dQSU9fTVNNX1YxKQkrPSBncGlvLW1zbS12MS5vCiBvYmotJChDT05GSUdfR1BJT19NU01fVjIpCSs9IGdwaW8tbXNtLXYyLm8KIG9iai0kKENPTkZJR19HUElPX01YQykJCSs9IGdwaW8tbXhjLm8KQEAgLTM3LDE4ICs0MCwxNyBAQAogb2JqLSQoQ09ORklHX0dQSU9fUENGODU3WCkJKz0gZ3Bpby1wY2Y4NTd4Lm8KIG9iai0kKENPTkZJR19HUElPX1BDSCkJCSs9IGdwaW8tcGNoLm8KIG9iai0kKENPTkZJR19HUElPX1BMMDYxKQkrPSBncGlvLXBsMDYxLm8KK29iai0kKENPTkZJR19QTEFUX1BYQSkJCSs9IGdwaW8tcHhhLm8KIG9iai0kKENPTkZJR19HUElPX1JEQzMyMVgpCSs9IGdwaW8tcmRjMzIxeC5vCi0KLW9iai0kKENPTkZJR19HUElPX1BMQVRfU0FNU1VORykJKz0gZ3Bpby1wbGF0LXNhbXN1bmcubwotb2JqLSQoQ09ORklHX0dQSU9fUzVQQzEwMCkJKz0gZ3Bpby1zNXBjMTAwLm8KLW9iai0kKENPTkZJR19HUElPX1M1UFYyMTApCSs9IGdwaW8tczVwdjIxMC5vCi0KK29iai0kKENPTkZJR19QTEFUX1NBTVNVTkcpCSs9IGdwaW8tc2Ftc3VuZy5vCitvYmotJChDT05GSUdfQVJDSF9TQTExMDApCSs9IGdwaW8tc2ExMTAwLm8KIG9iai0kKENPTkZJR19HUElPX1NDSCkJCSs9IGdwaW8tc2NoLm8KIG9iai0kKENPTkZJR19HUElPX1NUTVBFKQkrPSBncGlvLXN0bXBlLm8KIG9iai0kKENPTkZJR19HUElPX1NYMTUwWCkJKz0gZ3Bpby1zeDE1MHgubwogb2JqLSQoQ09ORklHX0dQSU9fVEMzNTg5WCkJKz0gZ3Bpby10YzM1ODl4Lm8KIG9iai0kKENPTkZJR19BUkNIX1RFR1JBKQkrPSBncGlvLXRlZ3JhLm8KIG9iai0kKENPTkZJR19HUElPX1RJTUJFUkRBTEUpCSs9IGdwaW8tdGltYmVyZGFsZS5vCitvYmotJChDT05GSUdfQVJDSF9EQVZJTkNJX1RORVRWMTA3WCkgKz0gZ3Bpby10bmV0djEwN3gubwogb2JqLSQoQ09ORklHX0dQSU9fVFBTNjU5MTApCSs9IGdwaW8tdHBzNjU5MTAubwogb2JqLSQoQ09ORklHX0dQSU9fVFBTNjU5MTIpCSs9IGdwaW8tdHBzNjU5MTIubwogb2JqLSQoQ09ORklHX0dQSU9fVFdMNDAzMCkJKz0gZ3Bpby10d2w0MDMwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLTc0eDE2NC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tNzR4MTY0LmMKaW5kZXggZmY1MjVjMC4uYTMxYWQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tNzR4MTY0LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tNzR4MTY0LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvNzR4MTY0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IGdlbl83NHgxNjRfY2hpcCB7CiAJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWRhdmluY2kuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWRhdmluY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjBkNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tZGF2aW5jaS5jCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogVEkgRGFWaW5jaSBHUElPIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBEYXZpZCBCcm93bmVsbAorICogQ29weXJpZ2h0IChjKSAyMDA3LCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCitzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgeworCXUzMglkaXI7CisJdTMyCW91dF9kYXRhOworCXUzMglzZXRfZGF0YTsKKwl1MzIJY2xyX2RhdGE7CisJdTMyCWluX2RhdGE7CisJdTMyCXNldF9yaXNpbmc7CisJdTMyCWNscl9yaXNpbmc7CisJdTMyCXNldF9mYWxsaW5nOworCXUzMgljbHJfZmFsbGluZzsKKwl1MzIJaW50c3RhdDsKK307CisKKyNkZWZpbmUgY2hpcDJjb250cm9sbGVyKGNoaXApCVwKKwljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyLCBjaGlwKQorCitzdGF0aWMgc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyIGNoaXBzW0RJVl9ST1VORF9VUChEQVZJTkNJX05fR1BJTywgMzIpXTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmdwaW9fYmFzZTsKKworc3RhdGljIHN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtIF9faW5pdCAqZ3BpbzJyZWdzKHVuc2lnbmVkIGdwaW8pCit7CisJdm9pZCBfX2lvbWVtICpwdHI7CisKKwlpZiAoZ3BpbyA8IDMyICogMSkKKwkJcHRyID0gZ3Bpb19iYXNlICsgMHgxMDsKKwllbHNlIGlmIChncGlvIDwgMzIgKiAyKQorCQlwdHIgPSBncGlvX2Jhc2UgKyAweDM4OworCWVsc2UgaWYgKGdwaW8gPCAzMiAqIDMpCisJCXB0ciA9IGdwaW9fYmFzZSArIDB4NjA7CisJZWxzZSBpZiAoZ3BpbyA8IDMyICogNCkKKwkJcHRyID0gZ3Bpb19iYXNlICsgMHg4ODsKKwllbHNlIGlmIChncGlvIDwgMzIgKiA1KQorCQlwdHIgPSBncGlvX2Jhc2UgKyAweGIwOworCWVsc2UKKwkJcHRyID0gTlVMTDsKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICppcnEycmVncyhpbnQgaXJxKQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnOworCisJZyA9IChfX2ZvcmNlIHN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICopaXJxX2dldF9jaGlwX2RhdGEoaXJxKTsKKworCXJldHVybiBnOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkYXZpbmNpX2dwaW9faXJxX3NldHVwKHZvaWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogYm9hcmQgc2V0dXAgY29kZSAqTVVTVCogc2V0dXAgcGlubXV4IGFuZCBlbmFibGUgdGhlIEdQSU8gY2xvY2suICovCitzdGF0aWMgaW5saW5lIGludCBfX2RhdmluY2lfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQl1bnNpZ25lZCBvZmZzZXQsIGJvb2wgb3V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICpkID0gY2hpcDJjb250cm9sbGVyKGNoaXApOworCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gZC0+cmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0ZW1wOworCXUzMiBtYXNrID0gMSA8PCBvZmZzZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOworCXRlbXAgPSBfX3Jhd19yZWFkbCgmZy0+ZGlyKTsKKwlpZiAob3V0KSB7CisJCXRlbXAgJj0gfm1hc2s7CisJCV9fcmF3X3dyaXRlbChtYXNrLCB2YWx1ZSA/ICZnLT5zZXRfZGF0YSA6ICZnLT5jbHJfZGF0YSk7CisJfSBlbHNlIHsKKwkJdGVtcCB8PSBtYXNrOworCX0KKwlfX3Jhd193cml0ZWwodGVtcCwgJmctPmRpcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGF2aW5jaV9kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBfX2RhdmluY2lfZGlyZWN0aW9uKGNoaXAsIG9mZnNldCwgZmFsc2UsIDApOworfQorCitzdGF0aWMgaW50CitkYXZpbmNpX2RpcmVjdGlvbl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJcmV0dXJuIF9fZGF2aW5jaV9kaXJlY3Rpb24oY2hpcCwgb2Zmc2V0LCB0cnVlLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBwaW4ncyB2YWx1ZSAod29ya3MgZXZlbiBpZiBpdCdzIHNldCB1cCBhcyBvdXRwdXQpOworICogcmV0dXJucyB6ZXJvL25vbnplcm8uCisgKgorICogTm90ZSB0aGF0IGNoYW5nZXMgYXJlIHN5bmNoZWQgdG8gdGhlIEdQSU8gY2xvY2ssIHNvIHJlYWRpbmcgdmFsdWVzIGJhY2sKKyAqIHJpZ2h0IGFmdGVyIHlvdSd2ZSBzZXQgdGhlbSBtYXkgZ2l2ZSBvbGQgdmFsdWVzLgorICovCitzdGF0aWMgaW50IGRhdmluY2lfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqZCA9IGNoaXAyY29udHJvbGxlcihjaGlwKTsKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGQtPnJlZ3M7CisKKwlyZXR1cm4gKDEgPDwgb2Zmc2V0KSAmIF9fcmF3X3JlYWRsKCZnLT5pbl9kYXRhKTsKK30KKworLyoKKyAqIEFzc3VtaW5nIHRoZSBwaW4gaXMgbXV4ZWQgYXMgYSBncGlvIG91dHB1dCwgc2V0IGl0cyBvdXRwdXQgdmFsdWUuCisgKi8KK3N0YXRpYyB2b2lkCitkYXZpbmNpX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqZCA9IGNoaXAyY29udHJvbGxlcihjaGlwKTsKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGQtPnJlZ3M7CisKKwlfX3Jhd193cml0ZWwoKDEgPDwgb2Zmc2V0KSwgdmFsdWUgPyAmZy0+c2V0X2RhdGEgOiAmZy0+Y2xyX2RhdGEpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkYXZpbmNpX2dwaW9fc2V0dXAodm9pZCkKK3sKKwlpbnQgaSwgYmFzZTsKKwl1bnNpZ25lZCBuZ3BpbzsKKwlzdHJ1Y3QgZGF2aW5jaV9zb2NfaW5mbyAqc29jX2luZm8gPSAmZGF2aW5jaV9zb2NfaW5mbzsKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgKnJlZ3M7CisKKwlpZiAoc29jX2luZm8tPmdwaW9fdHlwZSAhPSBHUElPX1RZUEVfREFWSU5DSSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoZSBncGlvIGJhbmtzIGNvbmNlcHR1YWxseSBleHBvc2UgYSBzZWdtZW50ZWQgYml0bWFwLAorCSAqIGFuZCAibmdwaW8iIGlzIG9uZSBtb3JlIHRoYW4gdGhlIGxhcmdlc3QgemVyby1iYXNlZAorCSAqIGJpdCBpbmRleCB0aGF0J3MgdmFsaWQuCisJICovCisJbmdwaW8gPSBzb2NfaW5mby0+Z3Bpb19udW07CisJaWYgKG5ncGlvID09IDApIHsKKwkJcHJfZXJyKCJHUElPIHNldHVwOiAgaG93IG1hbnkgR1BJT3M/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKFdBUk5fT04oREFWSU5DSV9OX0dQSU8gPCBuZ3BpbykpCisJCW5ncGlvID0gREFWSU5DSV9OX0dQSU87CisKKwlncGlvX2Jhc2UgPSBpb3JlbWFwKHNvY19pbmZvLT5ncGlvX2Jhc2UsIFNaXzRLKTsKKwlpZiAoV0FSTl9PTighZ3Bpb19iYXNlKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwLCBiYXNlID0gMDsgYmFzZSA8IG5ncGlvOyBpKyssIGJhc2UgKz0gMzIpIHsKKwkJY2hpcHNbaV0uY2hpcC5sYWJlbCA9ICJEYVZpbmNpIjsKKworCQljaGlwc1tpXS5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IGRhdmluY2lfZGlyZWN0aW9uX2luOworCQljaGlwc1tpXS5jaGlwLmdldCA9IGRhdmluY2lfZ3Bpb19nZXQ7CisJCWNoaXBzW2ldLmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IGRhdmluY2lfZGlyZWN0aW9uX291dDsKKwkJY2hpcHNbaV0uY2hpcC5zZXQgPSBkYXZpbmNpX2dwaW9fc2V0OworCisJCWNoaXBzW2ldLmNoaXAuYmFzZSA9IGJhc2U7CisJCWNoaXBzW2ldLmNoaXAubmdwaW8gPSBuZ3BpbyAtIGJhc2U7CisJCWlmIChjaGlwc1tpXS5jaGlwLm5ncGlvID4gMzIpCisJCQljaGlwc1tpXS5jaGlwLm5ncGlvID0gMzI7CisKKwkJc3Bpbl9sb2NrX2luaXQoJmNoaXBzW2ldLmxvY2spOworCisJCXJlZ3MgPSBncGlvMnJlZ3MoYmFzZSk7CisJCWNoaXBzW2ldLnJlZ3MgPSByZWdzOworCQljaGlwc1tpXS5zZXRfZGF0YSA9ICZyZWdzLT5zZXRfZGF0YTsKKwkJY2hpcHNbaV0uY2xyX2RhdGEgPSAmcmVncy0+Y2xyX2RhdGE7CisJCWNoaXBzW2ldLmluX2RhdGEgPSAmcmVncy0+aW5fZGF0YTsKKworCQlncGlvY2hpcF9hZGQoJmNoaXBzW2ldLmNoaXApOworCX0KKworCXNvY19pbmZvLT5ncGlvX2N0bHJzID0gY2hpcHM7CisJc29jX2luZm8tPmdwaW9fY3RscnNfbnVtID0gRElWX1JPVU5EX1VQKG5ncGlvLCAzMik7CisKKwlkYXZpbmNpX2dwaW9faXJxX3NldHVwKCk7CisJcmV0dXJuIDA7Cit9CitwdXJlX2luaXRjYWxsKGRhdmluY2lfZ3Bpb19zZXR1cCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdlIGV4cGVjdCBpcnFzIHdpbGwgbm9ybWFsbHkgYmUgc2V0IHVwIGFzIGlucHV0IHBpbnMsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlCisgKiB1c2VkIGFzIG91dHB1dCBwaW5zIC4uLiB3aGljaCBpcyBjb252ZW5pZW50IGZvciB0ZXN0aW5nLgorICoKKyAqIE5PVEU6ICBUaGUgZmlyc3QgZmV3IEdQSU9zIGFsc28gaGF2ZSBkaXJlY3QgSU5UQyBob29rdXBzIGluIGFkZGl0aW9uCisgKiB0byB0aGVpciBHUElPQk5LMCBpcnEsIHdpdGggYSBiaXQgbGVzcyBvdmVyaGVhZC4KKyAqCisgKiBBbGwgdGhvc2UgSU5UQyBob29rdXBzIChkaXJlY3QsIHBsdXMgc2V2ZXJhbCBJUlEgYmFua3MpIGNhbiBhbHNvCisgKiBzZXJ2ZSBhcyBFRE1BIGV2ZW50IHRyaWdnZXJzLgorICovCisKK3N0YXRpYyB2b2lkIGdwaW9faXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gaXJxMnJlZ3MoZC0+aXJxKTsKKwl1MzIgbWFzayA9ICh1MzIpIGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGQpOworCisJX19yYXdfd3JpdGVsKG1hc2ssICZnLT5jbHJfZmFsbGluZyk7CisJX19yYXdfd3JpdGVsKG1hc2ssICZnLT5jbHJfcmlzaW5nKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb19pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGlycTJyZWdzKGQtPmlycSk7CisJdTMyIG1hc2sgPSAodTMyKSBpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkKTsKKwl1bnNpZ25lZCBzdGF0dXMgPSBpcnFkX2dldF90cmlnZ2VyX3R5cGUoZCk7CisKKwlzdGF0dXMgJj0gSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwgSVJRX1RZUEVfRURHRV9SSVNJTkc7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IElSUV9UWVBFX0VER0VfRkFMTElORyB8IElSUV9UWVBFX0VER0VfUklTSU5HOworCisJaWYgKHN0YXR1cyAmIElSUV9UWVBFX0VER0VfRkFMTElORykKKwkJX19yYXdfd3JpdGVsKG1hc2ssICZnLT5zZXRfZmFsbGluZyk7CisJaWYgKHN0YXR1cyAmIElSUV9UWVBFX0VER0VfUklTSU5HKQorCQlfX3Jhd193cml0ZWwobWFzaywgJmctPnNldF9yaXNpbmcpOworfQorCitzdGF0aWMgaW50IGdwaW9faXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCB0cmlnZ2VyKQoreworCWlmICh0cmlnZ2VyICYgfihJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9FREdFX1JJU0lORykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ3Bpb19pcnFjaGlwID0geworCS5uYW1lCQk9ICJHUElPIiwKKwkuaXJxX2VuYWJsZQk9IGdwaW9faXJxX2VuYWJsZSwKKwkuaXJxX2Rpc2FibGUJPSBncGlvX2lycV9kaXNhYmxlLAorCS5pcnFfc2V0X3R5cGUJPSBncGlvX2lycV90eXBlLAorCS5mbGFncwkJPSBJUlFDSElQX1NFVF9UWVBFX01BU0tFRCwKK307CisKK3N0YXRpYyB2b2lkCitncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnOworCXUzMiBtYXNrID0gMHhmZmZmOworCXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqZDsKKworCWQgPSAoc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICopaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKKwlnID0gKHN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICopZC0+cmVnczsKKworCS8qIHdlIG9ubHkgY2FyZSBhYm91dCBvbmUgYmFuayAqLworCWlmIChpcnEgJiAxKQorCQltYXNrIDw8PSAxNjsKKworCS8qIHRlbXBvcmFyaWx5IG1hc2sgKGxldmVsIHNlbnNpdGl2ZSkgcGFyZW50IElSUSAqLworCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9tYXNrKCZkZXNjLT5pcnFfZGF0YSk7CisJZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX2FjaygmZGVzYy0+aXJxX2RhdGEpOworCXdoaWxlICgxKSB7CisJCXUzMgkJc3RhdHVzOworCQlpbnQJCW47CisJCWludAkJcmVzOworCisJCS8qIGFjayBhbnkgaXJxcyAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbCgmZy0+aW50c3RhdCkgJiBtYXNrOworCQlpZiAoIXN0YXR1cykKKwkJCWJyZWFrOworCQlfX3Jhd193cml0ZWwoc3RhdHVzLCAmZy0+aW50c3RhdCk7CisKKwkJLyogbm93IGRlbXV4IHRoZW0gdG8gdGhlIHJpZ2h0IGxvd2xldmVsIGhhbmRsZXIgKi8KKwkJbiA9IGQtPmlycV9iYXNlOworCQlpZiAoaXJxICYgMSkgeworCQkJbiArPSAxNjsKKwkJCXN0YXR1cyA+Pj0gMTY7CisJCX0KKworCQl3aGlsZSAoc3RhdHVzKSB7CisJCQlyZXMgPSBmZnMoc3RhdHVzKTsKKwkJCW4gKz0gcmVzOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKG4gLSAxKTsKKwkJCXN0YXR1cyA+Pj0gcmVzOworCQl9CisJfQorCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV91bm1hc2soJmRlc2MtPmlycV9kYXRhKTsKKwkvKiBub3cgaXQgbWF5IHJlLXRyaWdnZXIgKi8KK30KKworc3RhdGljIGludCBncGlvX3RvX2lycV9iYW5rZWQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqZCA9IGNoaXAyY29udHJvbGxlcihjaGlwKTsKKworCWlmIChkLT5pcnFfYmFzZSA+PSAwKQorCQlyZXR1cm4gZC0+aXJxX2Jhc2UgKyBvZmZzZXQ7CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBncGlvX3RvX2lycV91bmJhbmtlZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGRhdmluY2lfc29jX2luZm8gKnNvY19pbmZvID0gJmRhdmluY2lfc29jX2luZm87CisKKwkvKiBOT1RFOiAgd2UgYXNzdW1lIGZvciBub3cgdGhhdCBvbmx5IGlycXMgaW4gdGhlIGZpcnN0IGdwaW9fY2hpcAorCSAqIGNhbiBwcm92aWRlIGRpcmVjdC1tYXBwZWQgSVJRcyB0byBBSU5UQyAodXAgdG8gMzIgR1BJT3MpLgorCSAqLworCWlmIChvZmZzZXQgPCBzb2NfaW5mby0+Z3Bpb191bmJhbmtlZCkKKwkJcmV0dXJuIHNvY19pbmZvLT5ncGlvX2lycSArIG9mZnNldDsKKwllbHNlCisJCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGdwaW9faXJxX3R5cGVfdW5iYW5rZWQoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCB0cmlnZ2VyKQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gaXJxMnJlZ3MoZC0+aXJxKTsKKwl1MzIgbWFzayA9ICh1MzIpIGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGQpOworCisJaWYgKHRyaWdnZXIgJiB+KElSUV9UWVBFX0VER0VfRkFMTElORyB8IElSUV9UWVBFX0VER0VfUklTSU5HKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlfX3Jhd193cml0ZWwobWFzaywgKHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCisJCSAgICAgPyAmZy0+c2V0X2ZhbGxpbmcgOiAmZy0+Y2xyX2ZhbGxpbmcpOworCV9fcmF3X3dyaXRlbChtYXNrLCAodHJpZ2dlciAmIElSUV9UWVBFX0VER0VfUklTSU5HKQorCQkgICAgID8gJmctPnNldF9yaXNpbmcgOiAmZy0+Y2xyX3Jpc2luZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5PVEU6ICBmb3Igc3VzcGVuZC9yZXN1bWUsIHByb2JhYmx5IGJlc3QgdG8gbWFrZSBhIHBsYXRmb3JtX2RldmljZSB3aXRoCisgKiBzdXNwZW5kX2xhdGUvcmVzdW1lX3Jlc3VtZSBjYWxscyBob29raW5nIGludG8gcmVzdWx0cyBvZiB0aGUgc2V0X3dha2UoKQorICogY2FsbHMgLi4uIHNvIGlmIG5vIGdwaW9zIGFyZSB3YWtldXAgZXZlbnRzIHRoZSBjbG9jayBjYW4gYmUgZGlzYWJsZWQsCisgKiB3aXRoIG91dHB1dHMgbGVmdCBhdCBwcmV2aW91c2x5IHNldCBsZXZlbHMsIGFuZCBzbyB0aGF0IFZERDNQM1YuSU9QV0ROMAorICogKGRtNjQ0NikgY2FuIGJlIHNldCBhcHByb3ByaWF0ZWx5IGZvciBHUElPVjMzIHBpbnMuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZGF2aW5jaV9ncGlvX2lycV9zZXR1cCh2b2lkKQoreworCXVuc2lnbmVkCWdwaW8sIGlycSwgYmFuazsKKwlzdHJ1Y3QgY2xrCSpjbGs7CisJdTMyCQliaW50ZW4gPSAwOworCXVuc2lnbmVkCW5ncGlvLCBiYW5rX2lycTsKKwlzdHJ1Y3QgZGF2aW5jaV9zb2NfaW5mbyAqc29jX2luZm8gPSAmZGF2aW5jaV9zb2NfaW5mbzsKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MJX19pb21lbSAqZzsKKworCW5ncGlvID0gc29jX2luZm8tPmdwaW9fbnVtOworCisJYmFua19pcnEgPSBzb2NfaW5mby0+Z3Bpb19pcnE7CisJaWYgKGJhbmtfaXJxID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEb24ndCBrbm93IGZpcnN0IEdQSU8gYmFuayBJUlEuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2xrID0gY2xrX2dldChOVUxMLCAiZ3BpbyIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVsZCBnZXR0aW5nIGdwaW8gY2xvY2s/XG4iLAorCQkgICAgICAgUFRSX0VSUihjbGspKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwl9CisJY2xrX2VuYWJsZShjbGspOworCisJLyogQXJyYW5nZSBncGlvX3RvX2lycSgpIHN1cHBvcnQsIGhhbmRsaW5nIGVpdGhlciBkaXJlY3QgSVJRcyBvcgorCSAqIGJhbmtlZCBJUlFzLiAgSGF2aW5nIEdQSU9zIGluIHRoZSBmaXJzdCBHUElPIGJhbmsgdXNlIGRpcmVjdAorCSAqIElSUXMsIHdoaWxlIHRoZSBvdGhlcnMgdXNlIGJhbmtlZCBJUlFzLCB3b3VsZCBuZWVkIHNvbWUgc2V0dXAKKwkgKiB0d2Vha3MgdG8gcmVjb2duaXplIGhhcmR3YXJlIHdoaWNoIGNhbiBkbyB0aGF0LgorCSAqLworCWZvciAoZ3BpbyA9IDAsIGJhbmsgPSAwOyBncGlvIDwgbmdwaW87IGJhbmsrKywgZ3BpbyArPSAzMikgeworCQljaGlwc1tiYW5rXS5jaGlwLnRvX2lycSA9IGdwaW9fdG9faXJxX2JhbmtlZDsKKwkJY2hpcHNbYmFua10uaXJxX2Jhc2UgPSBzb2NfaW5mby0+Z3Bpb191bmJhbmtlZAorCQkJPyAtRUlOVkFMCisJCQk6IChzb2NfaW5mby0+aW50Y19pcnFfbnVtICsgZ3Bpbyk7CisJfQorCisJLyoKKwkgKiBBSU5UQyBjYW4gaGFuZGxlIGRpcmVjdC91bmJhbmtlZCBJUlFzIGZvciBHUElPcywgd2l0aCB0aGUgR1BJTworCSAqIGNvbnRyb2xsZXIgb25seSBoYW5kbGluZyB0cmlnZ2VyIG1vZGVzLiAgV2UgY3VycmVudGx5IGFzc3VtZSBubworCSAqIElSUSBtdXggY29uZmxpY3RzOyBncGlvX2lycV90eXBlX3VuYmFua2VkKCkgaXMgb25seSBmb3IgR1BJT3MuCisJICovCisJaWYgKHNvY19pbmZvLT5ncGlvX3VuYmFua2VkKSB7CisJCXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ3Bpb19pcnFjaGlwX3VuYmFua2VkOworCisJCS8qIHBhc3MgImJhbmsgMCIgR1BJTyBJUlFzIHRvIEFJTlRDICovCisJCWNoaXBzWzBdLmNoaXAudG9faXJxID0gZ3Bpb190b19pcnFfdW5iYW5rZWQ7CisJCWJpbnRlbiA9IEJJVCgwKTsKKworCQkvKiBBSU5UQyBoYW5kbGVzIG1hc2svdW5tYXNrOyBHUElPIGhhbmRsZXMgdHJpZ2dlcmluZyAqLworCQlpcnEgPSBiYW5rX2lycTsKKwkJZ3Bpb19pcnFjaGlwX3VuYmFua2VkID0gKmlycV9nZXRfY2hpcChpcnEpOworCQlncGlvX2lycWNoaXBfdW5iYW5rZWQubmFtZSA9ICJHUElPLUFJTlRDIjsKKwkJZ3Bpb19pcnFjaGlwX3VuYmFua2VkLmlycV9zZXRfdHlwZSA9IGdwaW9faXJxX3R5cGVfdW5iYW5rZWQ7CisKKwkJLyogZGVmYXVsdCB0cmlnZ2VyOiBib3RoIGVkZ2VzICovCisJCWcgPSBncGlvMnJlZ3MoMCk7CisJCV9fcmF3X3dyaXRlbCh+MCwgJmctPnNldF9mYWxsaW5nKTsKKwkJX19yYXdfd3JpdGVsKH4wLCAmZy0+c2V0X3Jpc2luZyk7CisKKwkJLyogc2V0IHRoZSBkaXJlY3QgSVJRcyB1cCB0byB1c2UgdGhhdCBpcnFjaGlwICovCisJCWZvciAoZ3BpbyA9IDA7IGdwaW8gPCBzb2NfaW5mby0+Z3Bpb191bmJhbmtlZDsgZ3BpbysrLCBpcnErKykgeworCQkJaXJxX3NldF9jaGlwKGlycSwgJmdwaW9faXJxY2hpcF91bmJhbmtlZCk7CisJCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShpcnEsICh2b2lkICopX19ncGlvX21hc2soZ3BpbykpOworCQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCAoX19mb3JjZSB2b2lkICopZyk7CisJCQlpcnFfc2V0X3N0YXR1c19mbGFncyhpcnEsIElSUV9UWVBFX0VER0VfQk9USCk7CisJCX0KKworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBPciwgQUlOVEMgY2FuIGhhbmRsZSBJUlFzIGZvciBiYW5rcyBvZiAxNiBHUElPIElSUXMsIHdoaWNoIHdlCisJICogdGhlbiBjaGFpbiB0aHJvdWdoIG91ciBvd24gaGFuZGxlci4KKwkgKi8KKwlmb3IgKGdwaW8gPSAwLCBpcnEgPSBncGlvX3RvX2lycSgwKSwgYmFuayA9IDA7CisJCQlncGlvIDwgbmdwaW87CisJCQliYW5rKyssIGJhbmtfaXJxKyspIHsKKwkJdW5zaWduZWQJCWk7CisKKwkJLyogZGlzYWJsZWQgYnkgZGVmYXVsdCwgZW5hYmxlZCBvbmx5IGFzIG5lZWRlZCAqLworCQlnID0gZ3BpbzJyZWdzKGdwaW8pOworCQlfX3Jhd193cml0ZWwofjAsICZnLT5jbHJfZmFsbGluZyk7CisJCV9fcmF3X3dyaXRlbCh+MCwgJmctPmNscl9yaXNpbmcpOworCisJCS8qIHNldCB1cCBhbGwgaXJxcyBpbiB0aGlzIGJhbmsgKi8KKwkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoYmFua19pcnEsIGdwaW9faXJxX2hhbmRsZXIpOworCisJCS8qCisJCSAqIEVhY2ggY2hpcCBoYW5kbGVzIDMyIGdwaW9zLCBhbmQgZWFjaCBpcnEgYmFuayBjb25zaXN0cyBvZiAxNgorCQkgKiBncGlvIGlycXMuIFBhc3MgdGhlIGlycSBiYW5rJ3MgY29ycmVzcG9uZGluZyBjb250cm9sbGVyIHRvCisJCSAqIHRoZSBjaGFpbmVkIGlycSBoYW5kbGVyLgorCQkgKi8KKwkJaXJxX3NldF9oYW5kbGVyX2RhdGEoYmFua19pcnEsICZjaGlwc1tncGlvIC8gMzJdKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgZ3BpbyA8IG5ncGlvOyBpKyssIGlycSsrLCBncGlvKyspIHsKKwkJCWlycV9zZXRfY2hpcChpcnEsICZncGlvX2lycWNoaXApOworCQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCAoX19mb3JjZSB2b2lkICopZyk7CisJCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShpcnEsICh2b2lkICopX19ncGlvX21hc2soZ3BpbykpOworCQkJaXJxX3NldF9oYW5kbGVyKGlycSwgaGFuZGxlX3NpbXBsZV9pcnEpOworCQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOworCQl9CisKKwkJYmludGVuIHw9IEJJVChiYW5rKTsKKwl9CisKK2RvbmU6CisJLyogQklOVEVOIC0tIHBlci1iYW5rIGludGVycnVwdCBlbmFibGUuIGdlbmlycSB3b3VsZCBhbHNvIGxldCB0aGVzZQorCSAqIGJpdHMgYmUgc2V0L2NsZWFyZWQgZHluYW1pY2FsbHkuCisJICovCisJX19yYXdfd3JpdGVsKGJpbnRlbiwgZ3Bpb19iYXNlICsgMHgwOCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJEYVZpbmNpOiAlZCBncGlvIGlycXNcbiIsIGlycSAtIGdwaW9fdG9faXJxKDApKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tZXA5M3h4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1lcDkzeHguYwppbmRleCA3MmZiOWM2Li4xYzBmYzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1lcDkzeHguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1lcDkzeHguYwpAQCAtMTUsNiArMTUsNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpAQCAtMjMsNiArMjQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Jhc2ljX21taW9fZ3Bpby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1lcDkzeHguaD4KKworI2RlZmluZSBpcnFfdG9fZ3BpbyhpcnEpCSgoaXJxKSAtIGdwaW9fdG9faXJxKDApKQogCiBzdHJ1Y3QgZXA5M3h4X2dwaW8gewogCXZvaWQgX19pb21lbQkJKm1taW9fYmFzZTsKQEAgLTMwNyw2ICszMTEsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIE1hcCBHUElPIEEwLi5BNyAgKDAuLjcpICB0byBpcnEgNjQuLjcxLAorICogICAgICAgICAgQjAuLkI3ICAoNy4uMTUpIHRvIGlycSA3Mi4uNzksIGFuZAorICogICAgICAgICAgRjAuLkY3ICgxNi4uMjQpIHRvIGlycSA4MC4uODcuCisgKi8KK3N0YXRpYyBpbnQgZXA5M3h4X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlpbnQgZ3BpbyA9IGNoaXAtPmJhc2UgKyBvZmZzZXQ7CisKKwlpZiAoZ3BpbyA+IEVQOTNYWF9HUElPX0xJTkVfTUFYX0lSUSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gNjQgKyBncGlvOworfQorCiBzdGF0aWMgaW50IGVwOTN4eF9ncGlvX2FkZF9iYW5rKHN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MsIHN0cnVjdCBkZXZpY2UgKmRldiwKIAl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSwgc3RydWN0IGVwOTN4eF9ncGlvX2JhbmsgKmJhbmspCiB7CkBAIC0zMjEsOCArMzQwLDEwIEBACiAJYmdjLT5nYy5sYWJlbCA9IGJhbmstPmxhYmVsOwogCWJnYy0+Z2MuYmFzZSA9IGJhbmstPmJhc2U7CiAKLQlpZiAoYmFuay0+aGFzX2RlYm91bmNlKQorCWlmIChiYW5rLT5oYXNfZGVib3VuY2UpIHsKIAkJYmdjLT5nYy5zZXRfZGVib3VuY2UgPSBlcDkzeHhfZ3Bpb19zZXRfZGVib3VuY2U7CisJCWJnYy0+Z2MudG9faXJxID0gZXA5M3h4X2dwaW9fdG9faXJxOworCX0KIAogCXJldHVybiBncGlvY2hpcF9hZGQoJmJnYy0+Z2MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tZXh5bm9zNC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tZXh5bm9zNC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjRiMzM3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWV4eW5vczQuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKgotICogRVhZTk9TNCAtIEdQSU9saWIgc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy1oZWxwZXJzLmg+Ci0KLWludCBzM2NfZ3Bpb19zZXRwdWxsX2V4eW5vczQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpCi17Ci0JaWYgKHB1bGwgPT0gUzNDX0dQSU9fUFVMTF9VUCkKLQkJcHVsbCA9IDM7Ci0KLQlyZXR1cm4gczNjX2dwaW9fc2V0cHVsbF91cGRvd24oY2hpcCwgb2ZmLCBwdWxsKTsKLX0KLQotczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfZXh5bm9zNChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJCXVuc2lnbmVkIGludCBvZmYpCi17Ci0JczNjX2dwaW9fcHVsbF90IHB1bGw7Ci0KLQlwdWxsID0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24oY2hpcCwgb2ZmKTsKLQlpZiAocHVsbCA9PSAzKQotCQlwdWxsID0gUzNDX0dQSU9fUFVMTF9VUDsKLQotCXJldHVybiBwdWxsOwotfQotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvX2NmZyA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF9leHlub3M0LAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfZXh5bm9zNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2ZnIGdwaW9fY2ZnX25vaW50ID0gewotCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdCwKLQkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX2V4eW5vczQsCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF9leHlub3M0LAotfTsKLQotLyoKLSAqIEZvbGxvd2luZyBhcmUgdGhlIGdwaW8gYmFua3MgaW4gdjMxMC4KLSAqCi0gKiBUaGUgJ2NvbmZpZycgbWVtYmVyIHdoZW4gbGVmdCB0byBOVUxMLCBpcyBpbml0aWFsaXplZCB0byB0aGUgZGVmYXVsdAotICogc3RydWN0dXJlIGdwaW9fY2ZnIGluIHRoZSBpbml0IGZ1bmN0aW9uIGJlbG93LgotICoKLSAqIFRoZSAnYmFzZScgbWVtYmVyIGlzIGFsc28gaW5pdGlhbGl6ZWQgaW4gdGhlIGluaXQgZnVuY3Rpb24gYmVsb3cuCi0gKiBOb3RlOiBUaGUgaW5pdGlhbGl6YXRpb24gb2YgJ2Jhc2UnIG1lbWJlciBvZiBzM2NfZ3Bpb19jaGlwIHN0cnVjdHVyZQotICogdXNlcyB0aGUgYWJvdmUgbWFjcm8gYW5kIGRlcGVuZHMgb24gdGhlIGJhbmtzIGJlaW5nIGxpc3RlZCBpbiBvcmRlciBoZXJlLgotICovCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NoaXAgZXh5bm9zNF9ncGlvX3BhcnQxXzRiaXRbXSA9IHsKLQl7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQQTAoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fQTBfTlIsCi0JCQkubGFiZWwJPSAiR1BBMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEExKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0ExX05SLAotCQkJLmxhYmVsCT0gIkdQQTEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BCKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0JfTlIsCi0JCQkubGFiZWwJPSAiR1BCIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQQzAoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fQzBfTlIsCi0JCQkubGFiZWwJPSAiR1BDMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEMxKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0MxX05SLAotCQkJLmxhYmVsCT0gIkdQQzEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BEMCgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19EMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEQwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQRDEoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRDFfTlIsCi0JCQkubGFiZWwJPSAiR1BEMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEUwKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0UwX05SLAotCQkJLmxhYmVsCT0gIkdQRTAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BFMSgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19FMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEUxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQRTIoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRTJfTlIsCi0JCQkubGFiZWwJPSAiR1BFMiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEUzKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0UzX05SLAotCQkJLmxhYmVsCT0gIkdQRTMiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BFNCgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19FNF9OUiwKLQkJCS5sYWJlbAk9ICJHUEU0IiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQRjAoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRjBfTlIsCi0JCQkubGFiZWwJPSAiR1BGMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEYxKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0YxX05SLAotCQkJLmxhYmVsCT0gIkdQRjEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BGMigwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19GMl9OUiwKLQkJCS5sYWJlbAk9ICJHUEYyIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQRjMoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRjNfTlIsCi0JCQkubGFiZWwJPSAiR1BGMyIsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2hpcCBleHlub3M0X2dwaW9fcGFydDJfNGJpdFtdID0gewotCXsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BKMCgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19KMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEowIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQSjEoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fSjFfTlIsCi0JCQkubGFiZWwJPSAiR1BKMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEswKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0swX05SLAotCQkJLmxhYmVsCT0gIkdQSzAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BLMSgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19LMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEsxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQSzIoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fSzJfTlIsCi0JCQkubGFiZWwJPSAiR1BLMiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEszKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0szX05SLAotCQkJLmxhYmVsCT0gIkdQSzMiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BMMCgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19MMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEwwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQTDEoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fTDFfTlIsCi0JCQkubGFiZWwJPSAiR1BMMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEwyKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0wyX05SLAotCQkJLmxhYmVsCT0gIkdQTDIiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BZMCgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19ZMF9OUiwKLQkJCS5sYWJlbAk9ICJHUFkwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTEoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTFfTlIsCi0JCQkubGFiZWwJPSAiR1BZMSIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUFkyKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1kyX05SLAotCQkJLmxhYmVsCT0gIkdQWTIiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BZMygwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19ZM19OUiwKLQkJCS5sYWJlbAk9ICJHUFkzIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTQoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTRfTlIsCi0JCQkubGFiZWwJPSAiR1BZNCIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUFk1KDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1k1X05SLAotCQkJLmxhYmVsCT0gIkdQWTUiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BZNigwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19ZNl9OUiwKLQkJCS5sYWJlbAk9ICJHUFk2IiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gKFM1UF9WQV9HUElPMiArIDB4QzAwKSwKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoMCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQWDAoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWDBfTlIsCi0JCQkubGFiZWwJPSAiR1BYMCIsCi0JCQkudG9faXJxCT0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gKFM1UF9WQV9HUElPMiArIDB4QzIwKSwKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoOCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQWDEoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWDFfTlIsCi0JCQkubGFiZWwJPSAiR1BYMSIsCi0JCQkudG9faXJxCT0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gKFM1UF9WQV9HUElPMiArIDB4QzQwKSwKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoMTYpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUFgyKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1gyX05SLAotCQkJLmxhYmVsCT0gIkdQWDIiLAotCQkJLnRvX2lycQk9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTzIgKyAweEM2MCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UKDI0KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BYMygwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19YM19OUiwKLQkJCS5sYWJlbAk9ICJHUFgzIiwKLQkJCS50b19pcnEJPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NoaXAgZXh5bm9zNF9ncGlvX3BhcnQzXzRiaXRbXSA9IHsKLQl7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQWigwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19aX05SLAotCQkJLmxhYmVsCT0gIkdQWiIsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBfX2luaXQgaW50IGV4eW5vczRfZ3Bpb2xpYl9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXA7Ci0JaW50IGk7Ci0JaW50IGdyb3VwID0gMDsKLQlpbnQgbnJfY2hpcHM7Ci0KLQkvKiBHUElPIHBhcnQgMSAqLwotCi0JY2hpcCA9IGV4eW5vczRfZ3Bpb19wYXJ0MV80Yml0OwotCW5yX2NoaXBzID0gQVJSQVlfU0laRShleHlub3M0X2dwaW9fcGFydDFfNGJpdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hpcHM7IGkrKywgY2hpcCsrKSB7Ci0JCWlmIChjaGlwLT5jb25maWcgPT0gTlVMTCkgewotCQkJY2hpcC0+Y29uZmlnID0gJmdwaW9fY2ZnOwotCQkJLyogQXNzaWduIHRoZSBHUElPIGludGVycnVwdCBncm91cCAqLwotCQkJY2hpcC0+Z3JvdXAgPSBncm91cCsrOwotCQl9Ci0JCWlmIChjaGlwLT5iYXNlID09IE5VTEwpCi0JCQljaGlwLT5iYXNlID0gUzVQX1ZBX0dQSU8xICsgKGkpICogMHgyMDsKLQl9Ci0KLQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoZXh5bm9zNF9ncGlvX3BhcnQxXzRiaXQsIG5yX2NoaXBzKTsKLQotCS8qIEdQSU8gcGFydCAyICovCi0KLQljaGlwID0gZXh5bm9zNF9ncGlvX3BhcnQyXzRiaXQ7Ci0JbnJfY2hpcHMgPSBBUlJBWV9TSVpFKGV4eW5vczRfZ3Bpb19wYXJ0Ml80Yml0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9jaGlwczsgaSsrLCBjaGlwKyspIHsKLQkJaWYgKGNoaXAtPmNvbmZpZyA9PSBOVUxMKSB7Ci0JCQljaGlwLT5jb25maWcgPSAmZ3Bpb19jZmc7Ci0JCQkvKiBBc3NpZ24gdGhlIEdQSU8gaW50ZXJydXB0IGdyb3VwICovCi0JCQljaGlwLT5ncm91cCA9IGdyb3VwKys7Ci0JCX0KLQkJaWYgKGNoaXAtPmJhc2UgPT0gTlVMTCkKLQkJCWNoaXAtPmJhc2UgPSBTNVBfVkFfR1BJTzIgKyAoaSkgKiAweDIwOwotCX0KLQotCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyhleHlub3M0X2dwaW9fcGFydDJfNGJpdCwgbnJfY2hpcHMpOwotCi0JLyogR1BJTyBwYXJ0IDMgKi8KLQotCWNoaXAgPSBleHlub3M0X2dwaW9fcGFydDNfNGJpdDsKLQlucl9jaGlwcyA9IEFSUkFZX1NJWkUoZXh5bm9zNF9ncGlvX3BhcnQzXzRiaXQpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yX2NoaXBzOyBpKyssIGNoaXArKykgewotCQlpZiAoY2hpcC0+Y29uZmlnID09IE5VTEwpIHsKLQkJCWNoaXAtPmNvbmZpZyA9ICZncGlvX2NmZzsKLQkJCS8qIEFzc2lnbiB0aGUgR1BJTyBpbnRlcnJ1cHQgZ3JvdXAgKi8KLQkJCWNoaXAtPmdyb3VwID0gZ3JvdXArKzsKLQkJfQotCQlpZiAoY2hpcC0+YmFzZSA9PSBOVUxMKQotCQkJY2hpcC0+YmFzZSA9IFM1UF9WQV9HUElPMyArIChpKSAqIDB4MjA7Ci0JfQotCi0Jc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKGV4eW5vczRfZ3Bpb19wYXJ0M180Yml0LCBucl9jaGlwcyk7Ci0JczVwX3JlZ2lzdGVyX2dwaW9pbnRfYmFuayhJUlFfR1BJT19YQSwgMCwgSVJRX0dQSU8xX05SX0dST1VQUyk7Ci0JczVwX3JlZ2lzdGVyX2dwaW9pbnRfYmFuayhJUlFfR1BJT19YQiwgSVJRX0dQSU8xX05SX0dST1VQUywgSVJRX0dQSU8yX05SX0dST1VQUyk7Ci0KLQlyZXR1cm4gMDsKLX0KLWNvcmVfaW5pdGNhbGwoZXh5bm9zNF9ncGlvbGliX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8ta3M4Njk1LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1rczg2OTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FjNjZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8ta3M4Njk1LmMKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWtzODY5NS9ncGlvLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQW5kcmV3IFZpY3RvcgorICogVXBkYXRlZCB0byBHUElPTElCLCBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgICAgICAgICAgICAgICAgRGFuaWVsIFNpbHZlcnN0b25lIDxkc2lsdmVyc0BzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1rczg2OTUuaD4KKworLyoKKyAqIENvbmZpZ3VyZSBhIEdQSU8gbGluZSBmb3IgZWl0aGVyIEdQSU8gZnVuY3Rpb24sIG9yIGl0cyBpbnRlcm5hbAorICogZnVuY3Rpb24gKEludGVycnVwdCwgVGltZXIsIGV0YykuCisgKi8KK3N0YXRpYyB2b2lkIGtzODY5NV9ncGlvX21vZGUodW5zaWduZWQgaW50IHBpbiwgc2hvcnQgZ3BpbykKK3sKKwl1bnNpZ25lZCBpbnQgZW5hYmxlW10gPSB7IElPUENfSU9FSU5UMEVOLCBJT1BDX0lPRUlOVDFFTiwgSU9QQ19JT0VJTlQyRU4sIElPUENfSU9FSU5UM0VOLCBJT1BDX0lPVElNMEVOLCBJT1BDX0lPVElNMUVOIH07CisJdW5zaWduZWQgbG9uZyB4LCBmbGFnczsKKworCWlmIChwaW4gPiBLUzg2OTVfR1BJT181KQkvKiBvbmx5IEdQSU8gMC4uNSBoYXZlIGludGVybmFsIGZ1bmN0aW9ucyAqLworCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QQyk7CisJaWYgKGdwaW8pCQkJLyogR1BJTzogc2V0IGJpdCB0byAwICovCisJCXggJj0gfmVuYWJsZVtwaW5dOworCWVsc2UJCQkJLyogSW50ZXJuYWwgZnVuY3Rpb246IHNldCBiaXQgdG8gMSAqLworCQl4IHw9IGVuYWJsZVtwaW5dOworCV9fcmF3X3dyaXRlbCh4LCBLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BDKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZ3Bpb19pcnFbXSA9IHsgS1M4Njk1X0lSUV9FWFRFUk4wLCBLUzg2OTVfSVJRX0VYVEVSTjEsIEtTODY5NV9JUlFfRVhURVJOMiwgS1M4Njk1X0lSUV9FWFRFUk4zIH07CisKKy8qCisgKiBDb25maWd1cmUgR1BJTyBwaW4gYXMgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZS4KKyAqLworaW50IGtzODY5NV9ncGlvX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIHgsIGZsYWdzOworCisJaWYgKHBpbiA+IEtTODY5NV9HUElPXzMpCS8qIG9ubHkgR1BJTyAwLi4zIGNhbiBnZW5lcmF0ZSBJUlEgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBzZXQgcGluIGFzIGlucHV0ICovCisJeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOworCXggJj0gfklPUE0ocGluKTsKKwlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkvKiBTZXQgSVJRIHRyaWdnZXJpbmcgdHlwZSAqLworCWlycV9zZXRfaXJxX3R5cGUoZ3Bpb19pcnFbcGluXSwgdHlwZSk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0IG1vZGUgKi8KKwlrczg2OTVfZ3Bpb19tb2RlKHBpbiwgMCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woa3M4Njk1X2dwaW9faW50ZXJydXB0KTsKKworCisKKy8qIC4uLi4gR2VuZXJpYyBHUElPIGludGVyZmFjZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCisKKy8qCisgKiBDb25maWd1cmUgdGhlIEdQSU8gbGluZSBhcyBhbiBpbnB1dC4KKyAqLworc3RhdGljIGludCBrczg2OTVfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBwaW4pCit7CisJdW5zaWduZWQgbG9uZyB4LCBmbGFnczsKKworCWlmIChwaW4gPiBLUzg2OTVfR1BJT18xNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZXQgcGluIHRvIEdQSU8gbW9kZSAqLworCWtzODY5NV9ncGlvX21vZGUocGluLCAxKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIHNldCBwaW4gYXMgaW5wdXQgKi8KKwl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7CisJeCAmPSB+SU9QTShwaW4pOworCV9fcmF3X3dyaXRlbCh4LCBLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBDb25maWd1cmUgdGhlIEdQSU8gbGluZSBhcyBhbiBvdXRwdXQsIHdpdGggZGVmYXVsdCBzdGF0ZS4KKyAqLworc3RhdGljIGludCBrczg2OTVfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQkJCQl1bnNpZ25lZCBpbnQgcGluLCBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyB4LCBmbGFnczsKKworCWlmIChwaW4gPiBLUzg2OTVfR1BJT18xNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZXQgcGluIHRvIEdQSU8gbW9kZSAqLworCWtzODY5NV9ncGlvX21vZGUocGluLCAxKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIHNldCBsaW5lIHN0YXRlICovCisJeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOworCWlmIChzdGF0ZSkKKwkJeCB8PSBJT1BEKHBpbik7CisJZWxzZQorCQl4ICY9IH5JT1BEKHBpbik7CisJX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOworCisJLyogc2V0IHBpbiBhcyBvdXRwdXQgKi8KKwl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7CisJeCB8PSBJT1BNKHBpbik7CisJX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFNldCB0aGUgc3RhdGUgb2YgYW4gb3V0cHV0IEdQSU8gbGluZS4KKyAqLworc3RhdGljIHZvaWQga3M4Njk1X2dwaW9fc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQkJCSAgdW5zaWduZWQgaW50IHBpbiwgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgeCwgZmxhZ3M7CisKKwlpZiAocGluID4gS1M4Njk1X0dQSU9fMTUpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIHNldCBvdXRwdXQgbGluZSBzdGF0ZSAqLworCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKKwlpZiAoc3RhdGUpCisJCXggfD0gSU9QRChwaW4pOworCWVsc2UKKwkJeCAmPSB+SU9QRChwaW4pOworCV9fcmF3X3dyaXRlbCh4LCBLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisvKgorICogUmVhZCB0aGUgc3RhdGUgb2YgYSBHUElPIGxpbmUuCisgKi8KK3N0YXRpYyBpbnQga3M4Njk1X2dwaW9fZ2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgcGluKQoreworCXVuc2lnbmVkIGxvbmcgeDsKKworCWlmIChwaW4gPiBLUzg2OTVfR1BJT18xNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QRCk7CisJcmV0dXJuICh4ICYgSU9QRChwaW4pKSAhPSAwOworfQorCisKKy8qCisgKiBNYXAgR1BJTyBsaW5lIHRvIElSUSBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQga3M4Njk1X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgcGluKQoreworCWlmIChwaW4gPiBLUzg2OTVfR1BJT18zKQkvKiBvbmx5IEdQSU8gMC4uMyBjYW4gZ2VuZXJhdGUgSVJRICovCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGdwaW9faXJxW3Bpbl07Cit9CisKKy8qCisgKiBNYXAgSVJRIG51bWJlciB0byBHUElPIGxpbmUuCisgKi8KK2ludCBpcnFfdG9fZ3Bpbyh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmICgoaXJxIDwgS1M4Njk1X0lSUV9FWFRFUk4wKSB8fCAoaXJxID4gS1M4Njk1X0lSUV9FWFRFUk4zKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gKGlycSAtIEtTODY5NV9JUlFfRVhURVJOMCk7Cit9CitFWFBPUlRfU1lNQk9MKGlycV90b19ncGlvKTsKKworLyogR1BJT0xJQiBpbnRlcmZhY2UgKi8KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAga3M4Njk1X2dwaW9fY2hpcCA9IHsKKwkubGFiZWwJCQk9ICJLUzg2OTUiLAorCS5kaXJlY3Rpb25faW5wdXQJPSBrczg2OTVfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmRpcmVjdGlvbl9vdXRwdXQJPSBrczg2OTVfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAorCS5nZXQJCQk9IGtzODY5NV9ncGlvX2dldF92YWx1ZSwKKwkuc2V0CQkJPSBrczg2OTVfZ3Bpb19zZXRfdmFsdWUsCisJLnRvX2lycQkJCT0ga3M4Njk1X2dwaW9fdG9faXJxLAorCS5iYXNlCQkJPSAwLAorCS5uZ3BpbwkJCT0gMTYsCisJLmNhbl9zbGVlcAkJPSAwLAorfTsKKworLyogUmVnaXN0ZXIgdGhlIEdQSU9zICovCit2b2lkIGtzODY5NV9yZWdpc3Rlcl9ncGlvcyh2b2lkKQoreworCWlmIChncGlvY2hpcF9hZGQoJmtzODY5NV9ncGlvX2NoaXApKQorCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBjb3JlIEdQSU9zXG4iKTsKK30KKworLyogLi4uLiBEZWJ1ZyBpbnRlcmZhY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCitzdGF0aWMgaW50IGtzODY5NV9ncGlvX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisJdW5zaWduZWQgaW50IGVuYWJsZVtdID0geyBJT1BDX0lPRUlOVDBFTiwgSU9QQ19JT0VJTlQxRU4sIElPUENfSU9FSU5UMkVOLCBJT1BDX0lPRUlOVDNFTiwgSU9QQ19JT1RJTTBFTiwgSU9QQ19JT1RJTTFFTiB9OworCXVuc2lnbmVkIGludCBpbnRtYXNrW10gPSB7IElPUENfSU9FSU5UMFRNLCBJT1BDX0lPRUlOVDFUTSwgSU9QQ19JT0VJTlQyVE0sIElPUENfSU9FSU5UM1RNIH07CisJdW5zaWduZWQgbG9uZyBtb2RlLCBjdHJsLCBkYXRhOworCWludCBpOworCisJbW9kZSA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOworCWN0cmwgPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BDKTsKKwlkYXRhID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QRCk7CisKKwlzZXFfcHJpbnRmKHMsICJQaW5cdEkvT1x0RnVuY3Rpb25cdFN0YXRlXG5cbiIpOworCisJZm9yIChpID0gS1M4Njk1X0dQSU9fMDsgaSA8PSBLUzg2OTVfR1BJT18xNSA7IGkrKykgeworCQlzZXFfcHJpbnRmKHMsICIlaTpcdCIsIGkpOworCisJCXNlcV9wcmludGYocywgIiVzXHQiLCAobW9kZSAmIElPUE0oaSkpID8gIk91dHB1dCIgOiAiSW5wdXQiKTsKKworCQlpZiAoaSA8PSBLUzg2OTVfR1BJT18zKSB7CisJCQlpZiAoY3RybCAmIGVuYWJsZVtpXSkgeworCQkJCXNlcV9wcmludGYocywgIkVYVCVpICIsIGkpOworCisJCQkJc3dpdGNoICgoY3RybCAmIGludG1hc2tbaV0pID4+ICg0ICogaSkpIHsKKwkJCQkJY2FzZSBJT1BDX1RNX0xPVzoKKwkJCQkJCXNlcV9wcmludGYocywgIihMb3cpIik7CQlicmVhazsKKwkJCQkJY2FzZSBJT1BDX1RNX0hJR0g6CisJCQkJCQlzZXFfcHJpbnRmKHMsICIoSGlnaCkiKTsJYnJlYWs7CisJCQkJCWNhc2UgSU9QQ19UTV9SSVNJTkc6CisJCQkJCQlzZXFfcHJpbnRmKHMsICIoUmlzaW5nKSIpOwlicmVhazsKKwkJCQkJY2FzZSBJT1BDX1RNX0ZBTExJTkc6CisJCQkJCQlzZXFfcHJpbnRmKHMsICIoRmFsbGluZykiKTsJYnJlYWs7CisJCQkJCWNhc2UgSU9QQ19UTV9FREdFOgorCQkJCQkJc2VxX3ByaW50ZihzLCAiKEVkZ2VzKSIpOwlicmVhazsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQkJc2VxX3ByaW50ZihzLCAiR1BJT1x0Iik7CisJCX0KKwkJZWxzZSBpZiAoaSA8PSBLUzg2OTVfR1BJT181KSB7CisJCQlpZiAoY3RybCAmIGVuYWJsZVtpXSkKKwkJCQlzZXFfcHJpbnRmKHMsICJUT1VUJWlcdCIsIGkgLSBLUzg2OTVfR1BJT180KTsKKwkJCWVsc2UKKwkJCQlzZXFfcHJpbnRmKHMsICJHUElPXHQiKTsKKwkJfQorCQllbHNlCisJCQlzZXFfcHJpbnRmKHMsICJHUElPXHQiKTsKKworCQlzZXFfcHJpbnRmKHMsICJcdCIpOworCisJCXNlcV9wcmludGYocywgIiVpXG4iLCAoZGF0YSAmIElPUEQoaSkpID8gMSA6IDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrczg2OTVfZ3Bpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBrczg2OTVfZ3Bpb19zaG93LCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga3M4Njk1X2dwaW9fb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBrczg2OTVfZ3Bpb19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBrczg2OTVfZ3Bpb19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwkvKiAvc3lzL2tlcm5lbC9kZWJ1Zy9rczg2OTVfZ3BpbyAqLworCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJrczg2OTVfZ3BpbyIsIFNfSUZSRUcgfCBTX0lSVUdPLCBOVUxMLCBOVUxMLCAma3M4Njk1X2dwaW9fb3BlcmF0aW9ucyk7CisJcmV0dXJuIDA7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChrczg2OTVfZ3Bpb19kZWJ1Z2ZzX2luaXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxhbmd3ZWxsLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1sYW5nd2VsbC5jCmluZGV4IGQyZWI1N2MuLjAwNjkyZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxhbmd3ZWxsLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbGFuZ3dlbGwuYwpAQCAtNTksNiArNTksNyBAQAogCUdSRVIsCQkvKiByaXNpbmcgZWRnZSBkZXRlY3QgKi8KIAlHRkVSLAkJLyogZmFsbGluZyBlZGdlIGRldGVjdCAqLwogCUdFRFIsCQkvKiBlZGdlIGRldGVjdCByZXN1bHQgKi8KKwlHQUZSLAkJLyogYWx0IGZ1bmN0aW9uICovCiB9OwogCiBzdHJ1Y3QgbG53X2dwaW8gewpAQCAtODEsNiArODIsMzEgQEAKIAlyZXR1cm4gcHRyOwogfQogCitzdGF0aWMgdm9pZCBfX2lvbWVtICpncGlvX3JlZ18yYml0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKKwkJCQkgICBlbnVtIEdQSU9fUkVHIHJlZ190eXBlKQoreworCXN0cnVjdCBsbndfZ3BpbyAqbG53ID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBsbndfZ3BpbywgY2hpcCk7CisJdW5zaWduZWQgbnJlZyA9IGNoaXAtPm5ncGlvIC8gMzI7CisJdTggcmVnID0gb2Zmc2V0IC8gMTY7CisJdm9pZCBfX2lvbWVtICpwdHI7CisKKwlwdHIgPSAodm9pZCBfX2lvbWVtICopKGxudy0+cmVnX2Jhc2UgKyByZWdfdHlwZSAqIG5yZWcgKiA0ICsgcmVnICogNCk7CisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIGludCBsbndfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKmdhZnIgPSBncGlvX3JlZ18yYml0KGNoaXAsIG9mZnNldCwgR0FGUik7CisJdTMyIHZhbHVlID0gcmVhZGwoZ2Fmcik7CisJaW50IHNoaWZ0ID0gKG9mZnNldCAlIDE2KSA8PCAxLCBhZiA9ICh2YWx1ZSA+PiBzaGlmdCkgJiAzOworCisJaWYgKGFmKSB7CisJCXZhbHVlICY9IH4oMyA8PCBzaGlmdCk7CisJCXdyaXRlbCh2YWx1ZSwgZ2Fmcik7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGxud19ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJdm9pZCBfX2lvbWVtICpncGxyID0gZ3Bpb19yZWcoY2hpcCwgb2Zmc2V0LCBHUExSKTsKQEAgLTMyMSw2ICszNDcsNyBAQAogCWxudy0+cmVnX2Jhc2UgPSBiYXNlOwogCWxudy0+aXJxX2Jhc2UgPSBpcnFfYmFzZTsKIAlsbnctPmNoaXAubGFiZWwgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlsbnctPmNoaXAucmVxdWVzdCA9IGxud19ncGlvX3JlcXVlc3Q7CiAJbG53LT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IGxud19ncGlvX2RpcmVjdGlvbl9pbnB1dDsKIAlsbnctPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IGxud19ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CiAJbG53LT5jaGlwLmdldCA9IGxud19ncGlvX2dldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzMyeHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzMyeHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY5NDgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbHBjMzJ4eC5jCkBAIC0wLDAgKzEsNDQ2IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L2dwaW9saWIuYworICoKKyAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1scGMzMnh4Lmg+CisKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX0lOUF9TVEFURQkJX0dQUkVHKDB4MDAwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfT1VUUF9TRVQJCV9HUFJFRygweDAwNCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX09VVFBfQ0xSCQlfR1BSRUcoMHgwMDgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QM19PVVRQX1NUQVRFCQlfR1BSRUcoMHgwMEMpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9ESVJfU0VUCQkJX0dQUkVHKDB4MDEwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfRElSX0NMUgkJCV9HUFJFRygweDAxNCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX0RJUl9TVEFURQkJX0dQUkVHKDB4MDE4KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfSU5QX1NUQVRFCQlfR1BSRUcoMHgwMUMpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9PVVRQX1NFVAkJX0dQUkVHKDB4MDIwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfT1VUUF9DTFIJCV9HUFJFRygweDAyNCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX01VWF9TRVQJCQlfR1BSRUcoMHgwMjgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NVVhfQ0xSCQkJX0dQUkVHKDB4MDJDKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfTVVYX1NUQVRFCQlfR1BSRUcoMHgwMzApCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9JTlBfU1RBVEUJCV9HUFJFRygweDA0MCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX09VVFBfU0VUCQlfR1BSRUcoMHgwNDQpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9PVVRQX0NMUgkJX0dQUkVHKDB4MDQ4KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfT1VUUF9TVEFURQkJX0dQUkVHKDB4MDRDKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfRElSX1NFVAkJCV9HUFJFRygweDA1MCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0RJUl9DTFIJCQlfR1BSRUcoMHgwNTQpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9ESVJfU1RBVEUJCV9HUFJFRygweDA1OCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0lOUF9TVEFURQkJX0dQUkVHKDB4MDYwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfT1VUUF9TRVQJCV9HUFJFRygweDA2NCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX09VVFBfQ0xSCQlfR1BSRUcoMHgwNjgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9PVVRQX1NUQVRFCQlfR1BSRUcoMHgwNkMpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9ESVJfU0VUCQkJX0dQUkVHKDB4MDcwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfRElSX0NMUgkJCV9HUFJFRygweDA3NCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0RJUl9TVEFURQkJX0dQUkVHKDB4MDc4KQorCisjZGVmaW5lIEdQSU8wMTJfUElOX1RPX0JJVCh4KQkJCSgxIDw8ICh4KSkKKyNkZWZpbmUgR1BJTzNfUElOX1RPX0JJVCh4KQkJCSgxIDw8ICgoeCkgKyAyNSkpCisjZGVmaW5lIEdQTzNfUElOX1RPX0JJVCh4KQkJCSgxIDw8ICh4KSkKKyNkZWZpbmUgR1BJTzAxMl9QSU5fSU5fU0VMKHgsIHkpCQkoKCh4KSA+PiAoeSkpICYgMSkKKyNkZWZpbmUgR1BJTzNfUElOX0lOX1NISUZUKHgpCQkJKCh4KSA9PSA1ID8gMjQgOiAxMCArICh4KSkKKyNkZWZpbmUgR1BJTzNfUElOX0lOX1NFTCh4LCB5KQkJCSgoeCkgPj4gR1BJTzNfUElOX0lOX1NISUZUKHkpKQorI2RlZmluZSBHUElPM19QSU41X0lOX1NFTCh4KQkJCSgoKHgpID4+IDI0KSAmIDEpCisjZGVmaW5lIEdQSTNfUElOX0lOX1NFTCh4LCB5KQkJCSgoKHgpID4+ICh5KSkgJiAxKQorCitzdHJ1Y3QgZ3Bpb19yZWdzIHsKKwl2b2lkIF9faW9tZW0gKmlucF9zdGF0ZTsKKwl2b2lkIF9faW9tZW0gKm91dHBfc2V0OworCXZvaWQgX19pb21lbSAqb3V0cF9jbHI7CisJdm9pZCBfX2lvbWVtICpkaXJfc2V0OworCXZvaWQgX19pb21lbSAqZGlyX2NscjsKK307CisKKy8qCisgKiBHUElPIG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpncGlvX3AwX25hbWVzW0xQQzMyWFhfR1BJT19QMF9NQVhdID0geworCSJwMC4wIiwgInAwLjEiLCAicDAuMiIsICJwMC4zIiwKKwkicDAuNCIsICJwMC41IiwgInAwLjYiLCAicDAuNyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpncGlvX3AxX25hbWVzW0xQQzMyWFhfR1BJT19QMV9NQVhdID0geworCSJwMS4wIiwgInAxLjEiLCAicDEuMiIsICJwMS4zIiwKKwkicDEuNCIsICJwMS41IiwgInAxLjYiLCAicDEuNyIsCisJInAxLjgiLCAicDEuOSIsICJwMS4xMCIsICJwMS4xMSIsCisJInAxLjEyIiwgInAxLjEzIiwgInAxLjE0IiwgInAxLjE1IiwKKwkicDEuMTYiLCAicDEuMTciLCAicDEuMTgiLCAicDEuMTkiLAorCSJwMS4yMCIsICJwMS4yMSIsICJwMS4yMiIsICJwMS4yMyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZ3Bpb19wMl9uYW1lc1tMUEMzMlhYX0dQSU9fUDJfTUFYXSA9IHsKKwkicDIuMCIsICJwMi4xIiwgInAyLjIiLCAicDIuMyIsCisJInAyLjQiLCAicDIuNSIsICJwMi42IiwgInAyLjciLAorCSJwMi44IiwgInAyLjkiLCAicDIuMTAiLCAicDIuMTEiLAorCSJwMi4xMiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpncGlvX3AzX25hbWVzW0xQQzMyWFhfR1BJT19QM19NQVhdID0geworCSJncGkwMDAiLCAiZ3BpbzAxIiwgImdwaW8wMiIsICJncGlvMDMiLAorCSJncGlvMDQiLCAiZ3BpbzA1IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdwaV9wM19uYW1lc1tMUEMzMlhYX0dQSV9QM19NQVhdID0geworCSJncGkwMCIsICJncGkwMSIsICJncGkwMiIsICJncGkwMyIsCisJImdwaTA0IiwgImdwaTA1IiwgImdwaTA2IiwgImdwaTA3IiwKKwkiZ3BpMDgiLCAiZ3BpMDkiLCAgTlVMTCwgICAgTlVMTCwKKwkgTlVMTCwgICAgTlVMTCwgICAgTlVMTCwgICAiZ3BpMTUiLAorCSJncGkxNiIsICJncGkxNyIsICJncGkxOCIsICJncGkxOSIsCisJImdwaTIwIiwgImdwaTIxIiwgImdwaTIyIiwgImdwaTIzIiwKKwkiZ3BpMjQiLCAiZ3BpMjUiLCAiZ3BpMjYiLCAiZ3BpMjciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZ3BvX3AzX25hbWVzW0xQQzMyWFhfR1BPX1AzX01BWF0gPSB7CisJImdwbzAwIiwgImdwbzAxIiwgImdwbzAyIiwgImdwbzAzIiwKKwkiZ3BvMDQiLCAiZ3BvMDUiLCAiZ3BvMDYiLCAiZ3BvMDciLAorCSJncG8wOCIsICJncG8wOSIsICJncG8xMCIsICJncG8xMSIsCisJImdwbzEyIiwgImdwbzEzIiwgImdwbzE0IiwgImdwbzE1IiwKKwkiZ3BvMTYiLCAiZ3BvMTciLCAiZ3BvMTgiLCAiZ3BvMTkiLAorCSJncG8yMCIsICJncG8yMSIsICJncG8yMiIsICJncG8yMyIKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19yZWdzIGdwaW9fZ3JwX3JlZ3NfcDAgPSB7CisJLmlucF9zdGF0ZQk9IExQQzMyWFhfR1BJT19QMF9JTlBfU1RBVEUsCisJLm91dHBfc2V0CT0gTFBDMzJYWF9HUElPX1AwX09VVFBfU0VULAorCS5vdXRwX2Nscgk9IExQQzMyWFhfR1BJT19QMF9PVVRQX0NMUiwKKwkuZGlyX3NldAk9IExQQzMyWFhfR1BJT19QMF9ESVJfU0VULAorCS5kaXJfY2xyCT0gTFBDMzJYWF9HUElPX1AwX0RJUl9DTFIsCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fcmVncyBncGlvX2dycF9yZWdzX3AxID0geworCS5pbnBfc3RhdGUJPSBMUEMzMlhYX0dQSU9fUDFfSU5QX1NUQVRFLAorCS5vdXRwX3NldAk9IExQQzMyWFhfR1BJT19QMV9PVVRQX1NFVCwKKwkub3V0cF9jbHIJPSBMUEMzMlhYX0dQSU9fUDFfT1VUUF9DTFIsCisJLmRpcl9zZXQJPSBMUEMzMlhYX0dQSU9fUDFfRElSX1NFVCwKKwkuZGlyX2Nscgk9IExQQzMyWFhfR1BJT19QMV9ESVJfQ0xSLAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX3JlZ3MgZ3Bpb19ncnBfcmVnc19wMiA9IHsKKwkuaW5wX3N0YXRlCT0gTFBDMzJYWF9HUElPX1AyX0lOUF9TVEFURSwKKwkub3V0cF9zZXQJPSBMUEMzMlhYX0dQSU9fUDJfT1VUUF9TRVQsCisJLm91dHBfY2xyCT0gTFBDMzJYWF9HUElPX1AyX09VVFBfQ0xSLAorCS5kaXJfc2V0CT0gTFBDMzJYWF9HUElPX1AyX0RJUl9TRVQsCisJLmRpcl9jbHIJPSBMUEMzMlhYX0dQSU9fUDJfRElSX0NMUiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19yZWdzIGdwaW9fZ3JwX3JlZ3NfcDMgPSB7CisJLmlucF9zdGF0ZQk9IExQQzMyWFhfR1BJT19QM19JTlBfU1RBVEUsCisJLm91dHBfc2V0CT0gTFBDMzJYWF9HUElPX1AzX09VVFBfU0VULAorCS5vdXRwX2Nscgk9IExQQzMyWFhfR1BJT19QM19PVVRQX0NMUiwKKwkuZGlyX3NldAk9IExQQzMyWFhfR1BJT19QMl9ESVJfU0VULAorCS5kaXJfY2xyCT0gTFBDMzJYWF9HUElPX1AyX0RJUl9DTFIsCit9OworCitzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgeworCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKKwlzdHJ1Y3QgZ3Bpb19yZWdzCSpncGlvX2dycDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICp0b19scGMzMnh4X2dwaW8oCisJc3RydWN0IGdwaW9fY2hpcCAqZ3BjKQoreworCXJldHVybiBjb250YWluZXJfb2YoZ3BjLCBzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAsIGNoaXApOworfQorCitzdGF0aWMgdm9pZCBfX3NldF9ncGlvX2Rpcl9wMDEyKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCisJdW5zaWduZWQgcGluLCBpbnQgaW5wdXQpCit7CisJaWYgKGlucHV0KQorCQlfX3Jhd193cml0ZWwoR1BJTzAxMl9QSU5fVE9fQklUKHBpbiksCisJCQlncm91cC0+Z3Bpb19ncnAtPmRpcl9jbHIpOworCWVsc2UKKwkJX19yYXdfd3JpdGVsKEdQSU8wMTJfUElOX1RPX0JJVChwaW4pLAorCQkJZ3JvdXAtPmdwaW9fZ3JwLT5kaXJfc2V0KTsKK30KKworc3RhdGljIHZvaWQgX19zZXRfZ3Bpb19kaXJfcDMoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKKwl1bnNpZ25lZCBwaW4sIGludCBpbnB1dCkKK3sKKwl1MzIgdSA9IEdQSU8zX1BJTl9UT19CSVQocGluKTsKKworCWlmIChpbnB1dCkKKwkJX19yYXdfd3JpdGVsKHUsIGdyb3VwLT5ncGlvX2dycC0+ZGlyX2Nscik7CisJZWxzZQorCQlfX3Jhd193cml0ZWwodSwgZ3JvdXAtPmdwaW9fZ3JwLT5kaXJfc2V0KTsKK30KKworc3RhdGljIHZvaWQgX19zZXRfZ3Bpb19sZXZlbF9wMDEyKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCisJdW5zaWduZWQgcGluLCBpbnQgaGlnaCkKK3sKKwlpZiAoaGlnaCkKKwkJX19yYXdfd3JpdGVsKEdQSU8wMTJfUElOX1RPX0JJVChwaW4pLAorCQkJZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX3NldCk7CisJZWxzZQorCQlfX3Jhd193cml0ZWwoR1BJTzAxMl9QSU5fVE9fQklUKHBpbiksCisJCQlncm91cC0+Z3Bpb19ncnAtPm91dHBfY2xyKTsKK30KKworc3RhdGljIHZvaWQgX19zZXRfZ3Bpb19sZXZlbF9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAorCXVuc2lnbmVkIHBpbiwgaW50IGhpZ2gpCit7CisJdTMyIHUgPSBHUElPM19QSU5fVE9fQklUKHBpbik7CisKKwlpZiAoaGlnaCkKKwkJX19yYXdfd3JpdGVsKHUsIGdyb3VwLT5ncGlvX2dycC0+b3V0cF9zZXQpOworCWVsc2UKKwkJX19yYXdfd3JpdGVsKHUsIGdyb3VwLT5ncGlvX2dycC0+b3V0cF9jbHIpOworfQorCitzdGF0aWMgdm9pZCBfX3NldF9ncG9fbGV2ZWxfcDMoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKKwl1bnNpZ25lZCBwaW4sIGludCBoaWdoKQoreworCWlmIChoaWdoKQorCQlfX3Jhd193cml0ZWwoR1BPM19QSU5fVE9fQklUKHBpbiksIGdyb3VwLT5ncGlvX2dycC0+b3V0cF9zZXQpOworCWVsc2UKKwkJX19yYXdfd3JpdGVsKEdQTzNfUElOX1RPX0JJVChwaW4pLCBncm91cC0+Z3Bpb19ncnAtPm91dHBfY2xyKTsKK30KKworc3RhdGljIGludCBfX2dldF9ncGlvX3N0YXRlX3AwMTIoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKKwl1bnNpZ25lZCBwaW4pCit7CisJcmV0dXJuIEdQSU8wMTJfUElOX0lOX1NFTChfX3Jhd19yZWFkbChncm91cC0+Z3Bpb19ncnAtPmlucF9zdGF0ZSksCisJCXBpbik7Cit9CisKK3N0YXRpYyBpbnQgX19nZXRfZ3Bpb19zdGF0ZV9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAorCXVuc2lnbmVkIHBpbikKK3sKKwlpbnQgc3RhdGUgPSBfX3Jhd19yZWFkbChncm91cC0+Z3Bpb19ncnAtPmlucF9zdGF0ZSk7CisKKwkvKgorCSAqIFAzIEdQSU8gcGluIGlucHV0IG1hcHBpbmcgaXMgbm90IGNvbnRpZ3VvdXMsIEdQSU9QMy0wLi40IGlzIG1hcHBlZAorCSAqIHRvIGJpdHMgMTAuLjE0LCB3aGlsZSBHUElPUDMtNSBpcyBtYXBwZWQgdG8gYml0IDI0LgorCSAqLworCXJldHVybiBHUElPM19QSU5fSU5fU0VMKHN0YXRlLCBwaW4pOworfQorCitzdGF0aWMgaW50IF9fZ2V0X2dwaV9zdGF0ZV9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAorCXVuc2lnbmVkIHBpbikKK3sKKwlyZXR1cm4gR1BJM19QSU5fSU5fU0VMKF9fcmF3X3JlYWRsKGdyb3VwLT5ncGlvX2dycC0+aW5wX3N0YXRlKSwgcGluKTsKK30KKworLyoKKyAqIEdFTkVSSUNfR1BJTyBwcmltaXRpdmVzLgorICovCitzdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDAxMihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCXVuc2lnbmVkIHBpbikKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJX19zZXRfZ3Bpb19kaXJfcDAxMihncm91cCwgcGluLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwl1bnNpZ25lZCBwaW4pCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCV9fc2V0X2dwaW9fZGlyX3AzKGdyb3VwLCBwaW4sIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9pbl9hbHdheXMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwl1bnNpZ25lZCBwaW4pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMDEyKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJcmV0dXJuIF9fZ2V0X2dwaW9fc3RhdGVfcDAxMihncm91cCwgcGluKTsKK30KKworc3RhdGljIGludCBscGMzMnh4X2dwaW9fZ2V0X3ZhbHVlX3AzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJcmV0dXJuIF9fZ2V0X2dwaW9fc3RhdGVfcDMoZ3JvdXAsIHBpbik7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlfZ2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJcmV0dXJuIF9fZ2V0X2dwaV9zdGF0ZV9wMyhncm91cCwgcGluKTsKK30KKworc3RhdGljIGludCBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMDEyKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKKwlpbnQgdmFsdWUpCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCV9fc2V0X2dwaW9fZGlyX3AwMTIoZ3JvdXAsIHBpbiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCisJaW50IHZhbHVlKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlfX3NldF9ncGlvX2Rpcl9wMyhncm91cCwgcGluLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfb3V0X2Fsd2F5cyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCisJaW50IHZhbHVlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBscGMzMnh4X2dwaW9fc2V0X3ZhbHVlX3AwMTIoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAorCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJX19zZXRfZ3Bpb19sZXZlbF9wMDEyKGdyb3VwLCBwaW4sIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCisJaW50IHZhbHVlKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlfX3NldF9ncGlvX2xldmVsX3AzKGdyb3VwLCBwaW4sIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgbHBjMzJ4eF9ncG9fc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKKwlpbnQgdmFsdWUpCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCV9fc2V0X2dwb19sZXZlbF9wMyhncm91cCwgcGluLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQoreworCWlmIChwaW4gPCBjaGlwLT5uZ3BpbykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCBscGMzMnh4X2dwaW9jaGlwW10gPSB7CisJeworCQkuY2hpcCA9IHsKKwkJCS5sYWJlbAkJCT0gImdwaW9fcDAiLAorCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDAxMiwKKwkJCS5nZXQJCQk9IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDAxMiwKKwkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9vdXRwdXRfcDAxMiwKKwkJCS5zZXQJCQk9IGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDAxMiwKKwkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAorCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BJT19QMF9HUlAsCisJCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJT19QMF9NQVgsCisJCQkubmFtZXMJCQk9IGdwaW9fcDBfbmFtZXMsCisJCQkuY2FuX3NsZWVwCQk9IDAsCisJCX0sCisJCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AwLAorCX0sCisJeworCQkuY2hpcCA9IHsKKwkJCS5sYWJlbAkJCT0gImdwaW9fcDEiLAorCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDAxMiwKKwkJCS5nZXQJCQk9IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDAxMiwKKwkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9vdXRwdXRfcDAxMiwKKwkJCS5zZXQJCQk9IGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDAxMiwKKwkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAorCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BJT19QMV9HUlAsCisJCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJT19QMV9NQVgsCisJCQkubmFtZXMJCQk9IGdwaW9fcDFfbmFtZXMsCisJCQkuY2FuX3NsZWVwCQk9IDAsCisJCX0sCisJCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AxLAorCX0sCisJeworCQkuY2hpcCA9IHsKKwkJCS5sYWJlbAkJCT0gImdwaW9fcDIiLAorCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDAxMiwKKwkJCS5nZXQJCQk9IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDAxMiwKKwkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9vdXRwdXRfcDAxMiwKKwkJCS5zZXQJCQk9IGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDAxMiwKKwkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAorCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BJT19QMl9HUlAsCisJCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJT19QMl9NQVgsCisJCQkubmFtZXMJCQk9IGdwaW9fcDJfbmFtZXMsCisJCQkuY2FuX3NsZWVwCQk9IDAsCisJCX0sCisJCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AyLAorCX0sCisJeworCQkuY2hpcCA9IHsKKwkJCS5sYWJlbAkJCT0gImdwaW9fcDMiLAorCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5wdXRfcDMsCisJCQkuZ2V0CQkJPSBscGMzMnh4X2dwaW9fZ2V0X3ZhbHVlX3AzLAorCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMywKKwkJCS5zZXQJCQk9IGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDMsCisJCQkucmVxdWVzdAkJPSBscGMzMnh4X2dwaW9fcmVxdWVzdCwKKwkJCS5iYXNlCQkJPSBMUEMzMlhYX0dQSU9fUDNfR1JQLAorCQkJLm5ncGlvCQkJPSBMUEMzMlhYX0dQSU9fUDNfTUFYLAorCQkJLm5hbWVzCQkJPSBncGlvX3AzX25hbWVzLAorCQkJLmNhbl9zbGVlcAkJPSAwLAorCQl9LAorCQkuZ3Bpb19ncnAgPSAmZ3Bpb19ncnBfcmVnc19wMywKKwl9LAorCXsKKwkJLmNoaXAgPSB7CisJCQkubGFiZWwJCQk9ICJncGlfcDMiLAorCQkJLmRpcmVjdGlvbl9pbnB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfaW5fYWx3YXlzLAorCQkJLmdldAkJCT0gbHBjMzJ4eF9ncGlfZ2V0X3ZhbHVlLAorCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCisJCQkuYmFzZQkJCT0gTFBDMzJYWF9HUElfUDNfR1JQLAorCQkJLm5ncGlvCQkJPSBMUEMzMlhYX0dQSV9QM19NQVgsCisJCQkubmFtZXMJCQk9IGdwaV9wM19uYW1lcywKKwkJCS5jYW5fc2xlZXAJCT0gMCwKKwkJfSwKKwkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDMsCisJfSwKKwl7CisJCS5jaGlwID0geworCQkJLmxhYmVsCQkJPSAiZ3BvX3AzIiwKKwkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9vdXRfYWx3YXlzLAorCQkJLnNldAkJCT0gbHBjMzJ4eF9ncG9fc2V0X3ZhbHVlLAorCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCisJCQkuYmFzZQkJCT0gTFBDMzJYWF9HUE9fUDNfR1JQLAorCQkJLm5ncGlvCQkJPSBMUEMzMlhYX0dQT19QM19NQVgsCisJCQkubmFtZXMJCQk9IGdwb19wM19uYW1lcywKKwkJCS5jYW5fc2xlZXAJCT0gMCwKKwkJfSwKKwkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDMsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGxwYzMyeHhfZ3Bpb19pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShscGMzMnh4X2dwaW9jaGlwKTsgaSsrKQorCQlncGlvY2hpcF9hZGQoJmxwYzMyeHhfZ3Bpb2NoaXBbaV0uY2hpcCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tYzMzODgwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tYzMzODgwLmMKaW5kZXggYjNiNDY1Mi4uMmRlNTdjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbWMzMzg4MC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1jMzM4ODAuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9tYzMzODgwLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAibWMzMzg4MCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1jcDIzczA4LmMKaW5kZXggMWVmNDZlNi4uYzVkODNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tY3AyM3MwOC5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1sLWlvaC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbWwtaW9oLmMKaW5kZXggYTkwMTZmNS4uZWE4ZTczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbWwtaW9oLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbWwtaW9oLmMKQEAgLTE0LDEwICsxNCwyMiBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKyNkZWZpbmUgSU9IX0VER0VfRkFMTElORwkwCisjZGVmaW5lIElPSF9FREdFX1JJU0lORwkJQklUKDApCisjZGVmaW5lIElPSF9MRVZFTF9MCQlCSVQoMSkKKyNkZWZpbmUgSU9IX0xFVkVMX0gJCShCSVQoMCkgfCBCSVQoMSkpCisjZGVmaW5lIElPSF9FREdFX0JPVEgJCUJJVCgyKQorI2RlZmluZSBJT0hfSU1fTUFTSwkJKEJJVCgwKSB8IEJJVCgxKSB8IEJJVCgyKSkKKworI2RlZmluZSBJT0hfSVJRX0JBU0UJCTAKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JPSE0gICAgICAgICAgICAgMHgxMERCCiAKQEAgLTQ2LDEyICs1OCwyMiBAQAogCiAvKioKICAqIHN0cnVjdCBpb2hfZ3Bpb19yZWdfZGF0YSAtIFRoZSByZWdpc3RlciBzdG9yZSBkYXRhLgorICogQGllbl9yZWcJVG8gc3RvcmUgY29udGVudHMgb2YgaW50ZXJydXB0IGVuYWJsZSByZWdpc3Rlci4KKyAqIEBpbWFza19yZWc6CVRvIHN0b3JlIGNvbnRlbnRzIG9mIGludGVycnVwdCBtYXNrIHJlZ2lzdAogICogQHBvX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgUE8gcmVnaXN0ZXIuCiAgKiBAcG1fcmVnOglUbyBzdG9yZSBjb250ZW50cyBvZiBQTSByZWdpc3Rlci4KKyAqIEBpbTBfcmVnOglUbyBzdG9yZSBjb250ZW50cyBvZiBpbnRlcnJ1cHQgbW9kZSByZWdpc3QwCisgKiBAaW0xX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgaW50ZXJydXB0IG1vZGUgcmVnaXN0MQorICogQHVzZV9zZWxfcmVnOiBUbyBzdG9yZSBjb250ZW50cyBvZiBHUElPX1VTRV9TRUwwfjMKICAqLwogc3RydWN0IGlvaF9ncGlvX3JlZ19kYXRhIHsKKwl1MzIgaWVuX3JlZzsKKwl1MzIgaW1hc2tfcmVnOwogCXUzMiBwb19yZWc7CiAJdTMyIHBtX3JlZzsKKwl1MzIgaW0wX3JlZzsKKwl1MzIgaW0xX3JlZzsKKwl1MzIgdXNlX3NlbF9yZWc7CiB9OwogCiAvKioKQEAgLTYyLDcgKzg0LDExIEBACiAgKiBAZ3BpbzoJCQlEYXRhIGZvciBHUElPIGluZnJhc3RydWN0dXJlLgogICogQGlvaF9ncGlvX3JlZzoJCU1lbW9yeSBtYXBwZWQgUmVnaXN0ZXIgZGF0YSBpcyBzYXZlZCBoZXJlCiAgKgkJCQl3aGVuIHN1c3BlbmQuCisgKiBAZ3Bpb191c2Vfc2VsOgkJU2F2ZSBHUElPX1VTRV9TRUwxfjQgcmVnaXN0ZXIgZm9yIFBNCiAgKiBAY2g6CQkJCUluZGljYXRlIEdQSU8gY2hhbm5lbAorICogQGlycV9iYXNlOgkJU2F2ZSBiYXNlIG9mIElSUSBudW1iZXIgZm9yIGludGVycnVwdAorICogQHNwaW5sb2NrOgkJVXNlZCBmb3IgcmVnaXN0ZXIgYWNjZXNzIHByb3RlY3Rpb24gaW4KKyAqCQkJCWludGVycnVwdCBjb250ZXh0IGlvaF9pcnFfdHlwZSBhbmQgUE07CiAgKi8KIHN0cnVjdCBpb2hfZ3BpbyB7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwpAQCAtNzAsOCArOTYsMTEgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGdwaW9fY2hpcCBncGlvOwogCXN0cnVjdCBpb2hfZ3Bpb19yZWdfZGF0YSBpb2hfZ3Bpb19yZWc7CisJdTMyIGdwaW9fdXNlX3NlbDsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlpbnQgY2g7CisJaW50IGlycV9iYXNlOworCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CiB9OwogCiBzdGF0aWMgY29uc3QgaW50IG51bV9wb3J0c1tdID0gezYsIDEyLCAxNiwgMTYsIDE1LCAxNiwgMTYsIDEyfTsKQEAgLTE0NSw4ICsxNzQsMjUgQEAKICAqLwogc3RhdGljIHZvaWQgaW9oX2dwaW9fc2F2ZV9yZWdfY29uZihzdHJ1Y3QgaW9oX2dwaW8gKmNoaXApCiB7Ci0JY2hpcC0+aW9oX2dwaW9fcmVnLnBvX3JlZyA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBvKTsKLQljaGlwLT5pb2hfZ3Bpb19yZWcucG1fcmVnID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkgKyssIGNoaXArKykgeworCQljaGlwLT5pb2hfZ3Bpb19yZWcucG9fcmVnID0KKwkJCQkJaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOworCQljaGlwLT5pb2hfZ3Bpb19yZWcucG1fcmVnID0KKwkJCQkJaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pOworCQljaGlwLT5pb2hfZ3Bpb19yZWcuaWVuX3JlZyA9CisJCQkJICAgICAgIGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmllbik7CisJCWNoaXAtPmlvaF9ncGlvX3JlZy5pbWFza19yZWcgPQorCQkJCSAgICAgaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaW1hc2spOworCQljaGlwLT5pb2hfZ3Bpb19yZWcuaW0wX3JlZyA9CisJCQkJICAgICAgaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaW1fMCk7CisJCWNoaXAtPmlvaF9ncGlvX3JlZy5pbTFfcmVnID0KKwkJCQkgICAgICBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pbV8xKTsKKwkJaWYgKGkgPCA0KQorCQkJY2hpcC0+aW9oX2dwaW9fcmVnLnVzZV9zZWxfcmVnID0KKwkJCQkJICAgaW9yZWFkMzIoJmNoaXAtPnJlZy0+aW9oX3NlbF9yZWdbaV0pOworCX0KIH0KIAogLyoKQEAgLTE1NCwxMyArMjAwLDM0IEBACiAgKi8KIHN0YXRpYyB2b2lkIGlvaF9ncGlvX3Jlc3RvcmVfcmVnX2NvbmYoc3RydWN0IGlvaF9ncGlvICpjaGlwKQogewotCS8qIHRvIHN0b3JlIGNvbnRlbnRzIG9mIFBPIHJlZ2lzdGVyICovCi0JaW93cml0ZTMyKGNoaXAtPmlvaF9ncGlvX3JlZy5wb19yZWcsICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBvKTsKLQkvKiB0byBzdG9yZSBjb250ZW50cyBvZiBQTSByZWdpc3RlciAqLwotCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcucG1fcmVnLCAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSArKywgY2hpcCsrKSB7CisJCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcucG9fcmVnLAorCQkJICAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbyk7CisJCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcucG1fcmVnLAorCQkJICAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbSk7CisJCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcuaWVuX3JlZywKKwkJCSAgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaWVuKTsKKwkJaW93cml0ZTMyKGNoaXAtPmlvaF9ncGlvX3JlZy5pbWFza19yZWcsCisJCQkgICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmltYXNrKTsKKwkJaW93cml0ZTMyKGNoaXAtPmlvaF9ncGlvX3JlZy5pbTBfcmVnLAorCQkJICAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pbV8wKTsKKwkJaW93cml0ZTMyKGNoaXAtPmlvaF9ncGlvX3JlZy5pbTFfcmVnLAorCQkJICAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pbV8xKTsKKwkJaWYgKGkgPCA0KQorCQkJaW93cml0ZTMyKGNoaXAtPmlvaF9ncGlvX3JlZy51c2Vfc2VsX3JlZywKKwkJCQkgICZjaGlwLT5yZWctPmlvaF9zZWxfcmVnW2ldKTsKKwl9CiB9CiAjZW5kaWYKIAorc3RhdGljIGludCBpb2hfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9IGNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgaW9oX2dwaW8sIGdwaW8pOworCXJldHVybiBjaGlwLT5pcnFfYmFzZSArIG9mZnNldDsKK30KKwogc3RhdGljIHZvaWQgaW9oX2dwaW9fc2V0dXAoc3RydWN0IGlvaF9ncGlvICpjaGlwLCBpbnQgbnVtX3BvcnQpCiB7CiAJc3RydWN0IGdwaW9fY2hpcCAqZ3BpbyA9ICZjaGlwLT5ncGlvOwpAQCAtMTc1LDE2ICsyNDIsMTQ4IEBACiAJZ3Bpby0+YmFzZSA9IC0xOwogCWdwaW8tPm5ncGlvID0gbnVtX3BvcnQ7CiAJZ3Bpby0+Y2FuX3NsZWVwID0gMDsKKwlncGlvLT50b19pcnEgPSBpb2hfZ3Bpb190b19pcnE7Cit9CisKK3N0YXRpYyBpbnQgaW9oX2lycV90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJdTMyIGltOworCXUzMiAqaW1fcmVnOworCXUzMiBpZW47CisJdTMyIGltX3BvczsKKwlpbnQgY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOworCWludCBpcnEgPSBkLT5pcnE7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGlvaF9ncGlvICpjaGlwID0gZ2MtPnByaXZhdGU7CisKKwljaCA9IGlycSAtIGNoaXAtPmlycV9iYXNlOworCWlmIChpcnEgPD0gY2hpcC0+aXJxX2Jhc2UgKyA3KSB7CisJCWltX3JlZyA9ICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmltXzA7CisJCWltX3BvcyA9IGNoOworCX0gZWxzZSB7CisJCWltX3JlZyA9ICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmltXzE7CisJCWltX3BvcyA9IGNoIC0gODsKKwl9CisJZGV2X2RiZyhjaGlwLT5kZXYsICIlczppcnE9JWQgdHlwZT0lZCBjaD0lZCBwb3M9JWQgdHlwZT0lZFxuIiwKKwkJX19mdW5jX18sIGlycSwgdHlwZSwgY2gsIGltX3BvcywgdHlwZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJCXZhbCA9IElPSF9FREdFX1JJU0lORzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCXZhbCA9IElPSF9FREdFX0ZBTExJTkc7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQl2YWwgPSBJT0hfRURHRV9CT1RIOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCXZhbCA9IElPSF9MRVZFTF9IOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJdmFsID0gSU9IX0xFVkVMX0w7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfUFJPQkU6CisJCWdvdG8gZW5kOworCWRlZmF1bHQ6CisJCWRldl93YXJuKGNoaXAtPmRldiwgIiVzOiB1bmtub3duIHR5cGUoJWRkKSIsCisJCQlfX2Z1bmNfXywgdHlwZSk7CisJCWdvdG8gZW5kOworCX0KKworCS8qIFNldCBpbnRlcnJ1cHQgbW9kZSAqLworCWltID0gaW9yZWFkMzIoaW1fcmVnKSAmIH4oSU9IX0lNX01BU0sgPDwgKGltX3BvcyAqIDQpKTsKKwlpb3dyaXRlMzIoaW0gfCAodmFsIDw8IChpbV9wb3MgKiA0KSksIGltX3JlZyk7CisKKwkvKiBpY2xyICovCisJaW93cml0ZTMyKEJJVChjaCksICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmljbHIpOworCisJLyogSU1BU0tDTFIgKi8KKwlpb3dyaXRlMzIoQklUKGNoKSwgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaW1hc2tjbHIpOworCisJLyogRW5hYmxlIGludGVycnVwdCAqLworCWllbiA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmllbik7CisJaW93cml0ZTMyKGllbiB8IEJJVChjaCksICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmllbik7CitlbmQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpb2hfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGlvaF9ncGlvICpjaGlwID0gZ2MtPnByaXZhdGU7CisKKwlpb3dyaXRlMzIoMSA8PCAoZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2UpLAorCQkgICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmltYXNrY2xyKTsKK30KKworc3RhdGljIHZvaWQgaW9oX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPSBnYy0+cHJpdmF0ZTsKKworCWlvd3JpdGUzMigxIDw8IChkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZSksCisJCSAgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaW1hc2spOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW9oX2dwaW9faGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGlvaF9ncGlvICpjaGlwID0gZGV2X2lkOworCXUzMiByZWdfdmFsOworCWludCBpLCBqOworCWludCByZXQgPSBJUlFfTk9ORTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJcmVnX3ZhbCA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbaV0uaXN0YXR1cyk7CisJCWZvciAoaiA9IDA7IGogPCBudW1fcG9ydHNbaV07IGorKykgeworCQkJaWYgKHJlZ192YWwgJiBCSVQoaikpIHsKKwkJCQlkZXZfZGJnKGNoaXAtPmRldiwKKwkJCQkJIiVzOlslZF06aXJxPSVkIHN0YXR1cz0weCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgaiwgaXJxLCByZWdfdmFsKTsKKwkJCQlpb3dyaXRlMzIoQklUKGopLAorCQkJCQkgICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmljbHIpOworCQkJCWdlbmVyaWNfaGFuZGxlX2lycShjaGlwLT5pcnFfYmFzZSArIGopOworCQkJCXJldCA9IElSUV9IQU5ETEVEOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2RldmluaXQgdm9pZCBpb2hfZ3Bpb19hbGxvY19nZW5lcmljX2NoaXAoc3RydWN0IGlvaF9ncGlvICpjaGlwLAorCQkJCXVuc2lnbmVkIGludCBpcnFfc3RhcnQsIHVuc2lnbmVkIGludCBudW0pCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdDsKKworCWdjID0gaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCgiaW9oX2dwaW8iLCAxLCBpcnFfc3RhcnQsIGNoaXAtPmJhc2UsCisJCQkJICAgIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwlnYy0+cHJpdmF0ZSA9IGNoaXA7CisJY3QgPSBnYy0+Y2hpcF90eXBlczsKKworCWN0LT5jaGlwLmlycV9tYXNrID0gaW9oX2lycV9tYXNrOworCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpb2hfaXJxX3VubWFzazsKKwljdC0+Y2hpcC5pcnFfc2V0X3R5cGUgPSBpb2hfaXJxX3R5cGU7CisKKwlpcnFfc2V0dXBfZ2VuZXJpY19jaGlwKGdjLCBJUlFfTVNLKG51bSksIElSUV9HQ19JTklUX01BU0tfQ0FDSEUsCisJCQkgICAgICAgSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFLCAwKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgaW9oX2dwaW9fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgcmV0OwotCWludCBpOworCWludCBpLCBqOwogCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcDsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJdm9pZCBfX2lvbWVtICpjaGlwX3NhdmU7CisJaW50IGlycV9iYXNlOwogCiAJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJldCkgewpAQCAtMjI4LDEwICs0MjcsNDEgQEAKIAl9CiAKIAljaGlwID0gY2hpcF9zYXZlOworCWZvciAoaiA9IDA7IGogPCA4OyBqKyssIGNoaXArKykgeworCQlpcnFfYmFzZSA9IGlycV9hbGxvY19kZXNjcygtMSwgSU9IX0lSUV9CQVNFLCBudW1fcG9ydHNbal0sCisJCQkJCSAgIE5VTUFfTk9fTk9ERSk7CisJCWlmIChpcnFfYmFzZSA8IDApIHsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJIm1sX2lvaF9ncGlvOiBGYWlsZWQgdG8gZ2V0IElSUSBiYXNlIG51bVxuIik7CisJCQljaGlwLT5pcnFfYmFzZSA9IC0xOworCQkJZ290byBlcnJfaXJxX2FsbG9jX2Rlc2NzOworCQl9CisJCWNoaXAtPmlycV9iYXNlID0gaXJxX2Jhc2U7CisJCWlvaF9ncGlvX2FsbG9jX2dlbmVyaWNfY2hpcChjaGlwLCBpcnFfYmFzZSwgbnVtX3BvcnRzW2pdKTsKKwl9CisKKwljaGlwID0gY2hpcF9zYXZlOworCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaW9oX2dwaW9faGFuZGxlciwKKwkJCSAgICAgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCBjaGlwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzIHJlcXVlc3RfaXJxIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKKwl9CisKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgY2hpcCk7CiAKIAlyZXR1cm4gMDsKIAorZXJyX3JlcXVlc3RfaXJxOgorCWNoaXAgPSBjaGlwX3NhdmU7CitlcnJfaXJxX2FsbG9jX2Rlc2NzOgorCXdoaWxlICgtLWogPj0gMCkgeworCQljaGlwLS07CisJCWlycV9mcmVlX2Rlc2NzKGNoaXAtPmlycV9iYXNlLCBudW1fcG9ydHNbal0pOworCX0KKworCWNoaXAgPSBjaGlwX3NhdmU7CiBlcnJfZ3Bpb2NoaXBfYWRkOgogCXdoaWxlICgtLWkgPj0gMCkgewogCQljaGlwLS07CkBAIC0yNjQsNyArNDk0LDExIEBACiAJdm9pZCBfX2lvbWVtICpjaGlwX3NhdmU7CiAKIAljaGlwX3NhdmUgPSBjaGlwOworCisJZnJlZV9pcnEocGRldi0+aXJxLCBjaGlwKTsKKwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIGNoaXArKykgeworCQlpcnFfZnJlZV9kZXNjcyhjaGlwLT5pcnFfYmFzZSwgbnVtX3BvcnRzW2ldKTsKIAkJZXJyID0gZ3Bpb2NoaXBfcmVtb3ZlKCZjaGlwLT5ncGlvKTsKIAkJaWYgKGVycikKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBncGlvY2hpcF9yZW1vdmVcbiIpOwpAQCAtMjgyLDkgKzUxNiwxMSBAQAogewogCXMzMiByZXQ7CiAJc3RydWN0IGlvaF9ncGlvICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKIAlpb2hfZ3Bpb19zYXZlX3JlZ19jb25mKGNoaXApOwotCWlvaF9ncGlvX3Jlc3RvcmVfcmVnX2NvbmYoY2hpcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKIAogCXJldCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCWlmIChyZXQpIHsKQEAgLTMwNCw2ICs1NDAsNyBAQAogewogCXMzMiByZXQ7CiAJc3RydWN0IGlvaF9ncGlvICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlyZXQgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAwKTsKIApAQCAtMzE1LDkgKzU1MiwxMSBAQAogCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5zcGlubG9jaywgZmxhZ3MpOwogCWlvd3JpdGUzMigweDAxLCAmY2hpcC0+cmVnLT5zcnN0KTsKIAlpb3dyaXRlMzIoMHgwMCwgJmNoaXAtPnJlZy0+c3JzdCk7CiAJaW9oX2dwaW9fcmVzdG9yZV9yZWdfY29uZihjaGlwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5zcGlubG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tcGM1MjAwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tcGM1MjAwLmMKaW5kZXggNTJkM2VkMi4uMmM3Y2VmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbXBjNTIwMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1wYzUyMDAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tcGM1Mnh4Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tcGM4eHh4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tcGM4eHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzZmNmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1wYzh4eHguYwpAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIEdQSU9zIG9uIE1QQzUxMngvODM0OS84NTcyLzg2MTAgYW5kIGNvbXBhdGlibGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGV0ZXIgS29yc2dhYXJkIDxqYWNtZXRAc3Vuc2l0ZS5kaz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjZGVmaW5lIE1QQzhYWFhfR1BJT19QSU5TCTMyCisKKyNkZWZpbmUgR1BJT19ESVIJCTB4MDAKKyNkZWZpbmUgR1BJT19PRFIJCTB4MDQKKyNkZWZpbmUgR1BJT19EQVQJCTB4MDgKKyNkZWZpbmUgR1BJT19JRVIJCTB4MGMKKyNkZWZpbmUgR1BJT19JTVIJCTB4MTAKKyNkZWZpbmUgR1BJT19JQ1IJCTB4MTQKKyNkZWZpbmUgR1BJT19JQ1IyCQkweDE4CisKK3N0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCB7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCBtbV9nYzsKKwlzcGlubG9ja190IGxvY2s7CisKKwkvKgorCSAqIHNoYWRvd2VkIGRhdGEgcmVnaXN0ZXIgdG8gYmUgYWJsZSB0byBjbGVhci9zZXQgb3V0cHV0IHBpbnMgaW4KKwkgKiBvcGVuIGRyYWluIG1vZGUgc2FmZWx5CisJICovCisJdTMyIGRhdGE7CisJc3RydWN0IGlycV9ob3N0ICppcnE7CisJdm9pZCAqb2ZfZGV2X2lkX2RhdGE7Cit9OworCitzdGF0aWMgaW5saW5lIHUzMiBtcGM4eHh4X2dwaW8ybWFzayh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gMXUgPDwgKE1QQzhYWFhfR1BJT19QSU5TIC0gMSAtIGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqCit0b19tcGM4eHh4X2dwaW9fY2hpcChzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKG1tLCBzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAsIG1tX2djKTsKK30KKworc3RhdGljIHZvaWQgbXBjOHh4eF9ncGlvX3NhdmVfcmVncyhzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSB0b19tcGM4eHh4X2dwaW9fY2hpcChtbSk7CisKKwltcGM4eHh4X2djLT5kYXRhID0gaW5fYmUzMihtbS0+cmVncyArIEdQSU9fREFUKTsKK30KKworLyogV29ya2Fyb3VuZCBHUElPIDEgZXJyYXRhIG9uIE1QQzg1NzIvTVBDODUzNi4gVGhlIHN0YXR1cyBvZiBHUElPcworICogZGVmaW5lZCBhcyBvdXRwdXQgY2Fubm90IGJlIGRldGVybWluZWQgYnkgcmVhZGluZyBHUERBVCByZWdpc3RlciwKKyAqIHNvIHdlIHVzZSBzaGFkb3cgZGF0YSByZWdpc3RlciBpbnN0ZWFkLiBUaGUgc3RhdHVzIG9mIGlucHV0IHBpbnMKKyAqIGlzIGRldGVybWluZWQgYnkgcmVhZGluZyBHUERBVCByZWdpc3Rlci4KKyAqLworc3RhdGljIGludCBtcGM4NTcyX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwl1MzIgdmFsOworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSB0b19tcGM4eHh4X2dwaW9fY2hpcChtbSk7CisKKwl2YWwgPSBpbl9iZTMyKG1tLT5yZWdzICsgR1BJT19EQVQpICYgfmluX2JlMzIobW0tPnJlZ3MgKyBHUElPX0RJUik7CisKKwlyZXR1cm4gKHZhbCB8IG1wYzh4eHhfZ2MtPmRhdGEpICYgbXBjOHh4eF9ncGlvMm1hc2soZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbnQgbXBjOHh4eF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOworCisJcmV0dXJuIGluX2JlMzIobW0tPnJlZ3MgKyBHUElPX0RBVCkgJiBtcGM4eHh4X2dwaW8ybWFzayhncGlvKTsKK30KKworc3RhdGljIHZvaWQgbXBjOHh4eF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCit7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IHRvX21wYzh4eHhfZ3Bpb19jaGlwKG1tKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKworCWlmICh2YWwpCisJCW1wYzh4eHhfZ2MtPmRhdGEgfD0gbXBjOHh4eF9ncGlvMm1hc2soZ3Bpbyk7CisJZWxzZQorCQltcGM4eHh4X2djLT5kYXRhICY9IH5tcGM4eHh4X2dwaW8ybWFzayhncGlvKTsKKworCW91dF9iZTMyKG1tLT5yZWdzICsgR1BJT19EQVQsIG1wYzh4eHhfZ2MtPmRhdGEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSB0b19tcGM4eHh4X2dwaW9fY2hpcChtbSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisKKwljbHJiaXRzMzIobW0tPnJlZ3MgKyBHUElPX0RJUiwgbXBjOHh4eF9ncGlvMm1hc2soZ3BpbykpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjOHh4eF9ncGlvX2Rpcl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSB0b19tcGM4eHh4X2dwaW9fY2hpcChtbSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW1wYzh4eHhfZ3Bpb19zZXQoZ2MsIGdwaW8sIHZhbCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCisJc2V0Yml0czMyKG1tLT5yZWdzICsgR1BJT19ESVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOworCisJaWYgKG1wYzh4eHhfZ2MtPmlycSAmJiBvZmZzZXQgPCBNUEM4WFhYX0dQSU9fUElOUykKKwkJcmV0dXJuIGlycV9jcmVhdGVfbWFwcGluZyhtcGM4eHh4X2djLT5pcnEsIG9mZnNldCk7CisJZWxzZQorCQlyZXR1cm4gLUVOWElPOworfQorCitzdGF0aWMgdm9pZCBtcGM4eHh4X2dwaW9faXJxX2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSAmbXBjOHh4eF9nYy0+bW1fZ2M7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwltYXNrID0gaW5fYmUzMihtbS0+cmVncyArIEdQSU9fSUVSKSAmIGluX2JlMzIobW0tPnJlZ3MgKyBHUElPX0lNUik7CisJaWYgKG1hc2spCisJCWdlbmVyaWNfaGFuZGxlX2lycShpcnFfbGluZWFyX3Jldm1hcChtcGM4eHh4X2djLT5pcnEsCisJCQkJCQkgICAgIDMyIC0gZmZzKG1hc2spKSk7CisJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBtcGM4eHh4X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCisJc2V0Yml0czMyKG1tLT5yZWdzICsgR1BJT19JTVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXBjOHh4eF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSAmbXBjOHh4eF9nYy0+bW1fZ2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisKKwljbHJiaXRzMzIobW0tPnJlZ3MgKyBHUElPX0lNUiwgbXBjOHh4eF9ncGlvMm1hc2soaXJxZF90b19od2lycShkKSkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtcGM4eHh4X2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOworCisJb3V0X2JlMzIobW0tPnJlZ3MgKyBHUElPX0lFUiwgbXBjOHh4eF9ncGlvMm1hc2soaXJxZF90b19od2lycShkKSkpOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9ICZtcGM4eHh4X2djLT5tbV9nYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChmbG93X3R5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKwkJc2V0Yml0czMyKG1tLT5yZWdzICsgR1BJT19JQ1IsCisJCQkgIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQljbHJiaXRzMzIobW0tPnJlZ3MgKyBHUElPX0lDUiwKKwkJCSAgbXBjOHh4eF9ncGlvMm1hc2soaXJxZF90b19od2lycShkKSkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTEyeF9pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQoreworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOworCXVuc2lnbmVkIGxvbmcgZ3BpbyA9IGlycWRfdG9faHdpcnEoZCk7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdW5zaWduZWQgaW50IHNoaWZ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZ3BpbyA8IDE2KSB7CisJCXJlZyA9IG1tLT5yZWdzICsgR1BJT19JQ1I7CisJCXNoaWZ0ID0gKDE1IC0gZ3BpbykgKiAyOworCX0gZWxzZSB7CisJCXJlZyA9IG1tLT5yZWdzICsgR1BJT19JQ1IyOworCQlzaGlmdCA9ICgxNSAtIChncGlvICUgMTYpKSAqIDI7CisJfQorCisJc3dpdGNoIChmbG93X3R5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKwkJY2xyc2V0Yml0c19iZTMyKHJlZywgMyA8PCBzaGlmdCwgMiA8PCBzaGlmdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKwkJY2xyc2V0Yml0c19iZTMyKHJlZywgMyA8PCBzaGlmdCwgMSA8PCBzaGlmdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKwkJY2xyYml0czMyKHJlZywgMyA8PCBzaGlmdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtcGM4eHh4X2lycV9jaGlwID0geworCS5uYW1lCQk9ICJtcGM4eHh4LWdwaW8iLAorCS5pcnFfdW5tYXNrCT0gbXBjOHh4eF9pcnFfdW5tYXNrLAorCS5pcnFfbWFzawk9IG1wYzh4eHhfaXJxX21hc2ssCisJLmlycV9hY2sJPSBtcGM4eHh4X2lycV9hY2ssCisJLmlycV9zZXRfdHlwZQk9IG1wYzh4eHhfaXJxX3NldF90eXBlLAorfTsKKworc3RhdGljIGludCBtcGM4eHh4X2dwaW9faXJxX21hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJCWlycV9od19udW1iZXJfdCBodykKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBoLT5ob3N0X2RhdGE7CisKKwlpZiAobXBjOHh4eF9nYy0+b2ZfZGV2X2lkX2RhdGEpCisJCW1wYzh4eHhfaXJxX2NoaXAuaXJxX3NldF90eXBlID0gbXBjOHh4eF9nYy0+b2ZfZGV2X2lkX2RhdGE7CisKKwlpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCBoLT5ob3N0X2RhdGEpOworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmbXBjOHh4eF9pcnFfY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7CisJaXJxX3NldF9pcnFfdHlwZSh2aXJxLCBJUlFfVFlQRV9OT05FKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19pcnFfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAorCQkJCSAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQkgIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLAorCQkJCSAgdW5zaWduZWQgaW50ICpvdXRfZmxhZ3MpCisKK3sKKwkvKiBpbnRlcnJ1cHQgc2Vuc2UgdmFsdWVzIGNvbWluZyBmcm9tIHRoZSBkZXZpY2UgdHJlZSBlcXVhbCBlaXRoZXIKKwkgKiBFREdFX0ZBTExJTkcgb3IgRURHRV9CT1RICisJICovCisJKm91dF9od2lycSA9IGludHNwZWNbMF07CisJKm91dF9mbGFncyA9IGludHNwZWNbMV07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfaG9zdF9vcHMgbXBjOHh4eF9ncGlvX2lycV9vcHMgPSB7CisJLm1hcAk9IG1wYzh4eHhfZ3Bpb19pcnFfbWFwLAorCS54bGF0ZQk9IG1wYzh4eHhfZ3Bpb19pcnFfeGxhdGUsCit9OworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4eHh4X2dwaW9faWRzW10gX19pbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWdwaW8iLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZ3BpbyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODYxMC1ncGlvIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWdwaW8iLCAuZGF0YSA9IG1wYzUxMnhfaXJxX3NldF90eXBlLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLHBxMy1ncGlvIiwgICAgIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtZ3BpbyIsICAgfSwKKwl7fQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG1wYzh4eHhfYWRkX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2M7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2M7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWQ7CisJdW5zaWduZWQgaHdpcnE7CisJaW50IHJldDsKKworCW1wYzh4eHhfZ2MgPSBremFsbG9jKHNpemVvZigqbXBjOHh4eF9nYyksIEdGUF9LRVJORUwpOworCWlmICghbXBjOHh4eF9nYykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmbXBjOHh4eF9nYy0+bG9jayk7CisKKwltbV9nYyA9ICZtcGM4eHh4X2djLT5tbV9nYzsKKwlnYyA9ICZtbV9nYy0+Z2M7CisKKwltbV9nYy0+c2F2ZV9yZWdzID0gbXBjOHh4eF9ncGlvX3NhdmVfcmVnczsKKwlnYy0+bmdwaW8gPSBNUEM4WFhYX0dQSU9fUElOUzsKKwlnYy0+ZGlyZWN0aW9uX2lucHV0ID0gbXBjOHh4eF9ncGlvX2Rpcl9pbjsKKwlnYy0+ZGlyZWN0aW9uX291dHB1dCA9IG1wYzh4eHhfZ3Bpb19kaXJfb3V0OworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxtcGM4NTcyLWdwaW8iKSkKKwkJZ2MtPmdldCA9IG1wYzg1NzJfZ3Bpb19nZXQ7CisJZWxzZQorCQlnYy0+Z2V0ID0gbXBjOHh4eF9ncGlvX2dldDsKKwlnYy0+c2V0ID0gbXBjOHh4eF9ncGlvX3NldDsKKwlnYy0+dG9faXJxID0gbXBjOHh4eF9ncGlvX3RvX2lycTsKKworCXJldCA9IG9mX21tX2dwaW9jaGlwX2FkZChucCwgbW1fZ2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJaHdpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJaWYgKGh3aXJxID09IE5PX0lSUSkKKwkJZ290byBza2lwX2lycTsKKworCW1wYzh4eHhfZ2MtPmlycSA9CisJCWlycV9hbGxvY19ob3N0KG5wLCBJUlFfSE9TVF9NQVBfTElORUFSLCBNUEM4WFhYX0dQSU9fUElOUywKKwkJCSAgICAgICAmbXBjOHh4eF9ncGlvX2lycV9vcHMsIE1QQzhYWFhfR1BJT19QSU5TKTsKKwlpZiAoIW1wYzh4eHhfZ2MtPmlycSkKKwkJZ290byBza2lwX2lycTsKKworCWlkID0gb2ZfbWF0Y2hfbm9kZShtcGM4eHh4X2dwaW9faWRzLCBucCk7CisJaWYgKGlkKQorCQltcGM4eHh4X2djLT5vZl9kZXZfaWRfZGF0YSA9IGlkLT5kYXRhOworCisJbXBjOHh4eF9nYy0+aXJxLT5ob3N0X2RhdGEgPSBtcGM4eHh4X2djOworCisJLyogYWNrIGFuZCBtYXNrIGFsbCBpcnFzICovCisJb3V0X2JlMzIobW1fZ2MtPnJlZ3MgKyBHUElPX0lFUiwgMHhmZmZmZmZmZik7CisJb3V0X2JlMzIobW1fZ2MtPnJlZ3MgKyBHUElPX0lNUiwgMCk7CisKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShod2lycSwgbXBjOHh4eF9nYyk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoaHdpcnEsIG1wYzh4eHhfZ3Bpb19pcnFfY2FzY2FkZSk7CisKK3NraXBfaXJxOgorCXJldHVybjsKKworZXJyOgorCXByX2VycigiJXM6IHJlZ2lzdHJhdGlvbiBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsCisJICAgICAgIG5wLT5mdWxsX25hbWUsIHJldCk7CisJa2ZyZWUobXBjOHh4eF9nYyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1wYzh4eHhfYWRkX2dwaW9jaGlwcyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlmb3JfZWFjaF9tYXRjaGluZ19ub2RlKG5wLCBtcGM4eHh4X2dwaW9faWRzKQorCQltcGM4eHh4X2FkZF9jb250cm9sbGVyKG5wKTsKKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChtcGM4eHh4X2FkZF9ncGlvY2hpcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXhjLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYwppbmRleCA0MzQwYWNhLi5lNzkxNDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYwpAQCAtMjksNyArMjksMTEgQEAKICNpbmNsdWRlIDxsaW51eC9iYXNpY19tbWlvX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2J1Zy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjZGVmaW5lIGlycV90b19ncGlvKGlycSkJKChpcnEpIC0gTVhDX0dQSU9fSVJRX1NUQVJUKQogCiBlbnVtIG14Y19ncGlvX2h3dHlwZSB7CiAJSU1YMV9HUElPLAkvKiBydW5zIG9uIGkubXgxICovCkBAIC0yMzIsMTAgKzIzNiwxNSBAQAogewogCXUzMiBpcnFfc3RhdDsKIAlzdHJ1Y3QgbXhjX2dwaW9fcG9ydCAqcG9ydCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2dldF9jaGlwKGlycSk7CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKIAogCWlycV9zdGF0ID0gcmVhZGwocG9ydC0+YmFzZSArIEdQSU9fSVNSKSAmIHJlYWRsKHBvcnQtPmJhc2UgKyBHUElPX0lNUik7CiAKIAlteGNfZ3Bpb19pcnFfaGFuZGxlcihwb3J0LCBpcnFfc3RhdCk7CisKKwljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOwogfQogCiAvKiBNWDIgaGFzIG9uZSBpbnRlcnJ1cHQgKmZvciBhbGwqIGdwaW8gcG9ydHMgKi8KQEAgLTMzNyw2ICszNDYsMTUgQEAKIAlteGNfZ3Bpb19od3R5cGUgPSBod3R5cGU7CiB9CiAKK3N0YXRpYyBpbnQgbXhjX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGJncGlvX2NoaXAgKmJnYyA9IHRvX2JncGlvX2NoaXAoZ2MpOworCXN0cnVjdCBteGNfZ3Bpb19wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKGJnYywgc3RydWN0IG14Y19ncGlvX3BvcnQsIGJnYyk7CisKKwlyZXR1cm4gcG9ydC0+dmlydHVhbF9pcnFfc3RhcnQgKyBvZmZzZXQ7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IG14Y19ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwpAQCAtNDAzLDYgKzQyMSw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfaW91bm1hcDsKIAorCXBvcnQtPmJnYy5nYy50b19pcnEgPSBteGNfZ3Bpb190b19pcnE7CiAJcG9ydC0+YmdjLmdjLmJhc2UgPSBwZGV2LT5pZCAqIDMyOwogCXBvcnQtPmJnYy5kaXIgPSBwb3J0LT5iZ2MucmVhZF9yZWcocG9ydC0+YmdjLnJlZ19kaXIpOwogCXBvcnQtPmJnYy5kYXRhID0gcG9ydC0+YmdjLnJlYWRfcmVnKHBvcnQtPmJnYy5yZWdfc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW14cy5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXhzLmMKaW5kZXggYWY1NWE4NS4uMzg1YzU4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbXhzLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbXhzLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYmFzaWNfbW1pb19ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWFjaC9teHMuaD4KIAogI2RlZmluZSBNWFNfU0VUCQkweDQKQEAgLTQ5LDYgKzUwLDggQEAKICNkZWZpbmUgR1BJT19JTlRfTEVWX01BU0sJKDEgPDwgMCkKICNkZWZpbmUgR1BJT19JTlRfUE9MX01BU0sJKDEgPDwgMSkKIAorI2RlZmluZSBpcnFfdG9fZ3BpbyhpcnEpCSgoaXJxKSAtIE1YU19HUElPX0lSUV9TVEFSVCkKKwogc3RydWN0IG14c19ncGlvX3BvcnQgewogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlpbnQgaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1ub21hZGlrLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1ub21hZGlrLmMKaW5kZXggMmMyMTJjNy4uMWViZWRmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbm9tYWRpay5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW5vbWFkaWsuYwpAQCAtMjcsOCArMjcsOSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8cGxhdC9waW5jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tbm9tYWRpay5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAvKgogICogVGhlIEdQSU8gbW9kdWxlIGluIHRoZSBOb21hZGlrIGZhbWlseSBvZiBTeXN0ZW1zLW9uLUNoaXAgaXMgYW4KQEAgLTU4LDcgKzU5LDYgQEAKIAl1MzIgcndpbXNjOwogCXUzMiBmd2ltc2M7CiAJdTMyIHNscG07Ci0JdTMyIGVuYWJsZWQ7CiAJdTMyIHB1bGxfdXA7CiB9OwogCkBAIC0yNzYsNiArMjc2LDggQEAKIAkJaWYgKCFjaGlwKQogCQkJYnJlYWs7CiAKKwkJY2xrX2VuYWJsZShjaGlwLT5jbGspOworCiAJCXNscG1baV0gPSByZWFkbChjaGlwLT5hZGRyICsgTk1LX0dQSU9fU0xQQyk7CiAJCXdyaXRlbCh0ZW1wLCBjaGlwLT5hZGRyICsgTk1LX0dQSU9fU0xQQyk7CiAJfQpAQCAtMjkyLDYgKzI5NCw4IEBACiAJCQlicmVhazsKIAogCQl3cml0ZWwoc2xwbVtpXSwgY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOworCisJCWNsa19kaXNhYmxlKGNoaXAtPmNsayk7CiAJfQogfQogCkBAIC0zMzYsMTAgKzM0MCwxMiBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOwogCQlzcGluX2xvY2soJm5ta19jaGlwLT5sb2NrKTsKIAkJX19ubWtfY29uZmlnX3BpbihubWtfY2hpcCwgcGluIC0gbm1rX2NoaXAtPmNoaXAuYmFzZSwKIAkJCQkgY2Znc1tpXSwgc2xlZXAsIGdsaXRjaCA/IHNscG0gOiBOVUxMKTsKIAkJc3Bpbl91bmxvY2soJm5ta19jaGlwLT5sb2NrKTsKKwkJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CiAJfQogCiAJaWYgKGdsaXRjaCkKQEAgLTQyNCw2ICs0MzAsNyBAQAogCWlmICghbm1rX2NoaXApCiAJCXJldHVybiAtRUlOVkFMOwogCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbm1rX2dwaW9fc2xwbV9sb2NrLCBmbGFncyk7CiAJc3Bpbl9sb2NrKCZubWtfY2hpcC0+bG9jayk7CiAKQEAgLTQzMSw2ICs0MzgsNyBAQAogCiAJc3Bpbl91bmxvY2soJm5ta19jaGlwLT5sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZubWtfZ3Bpb19zbHBtX2xvY2ssIGZsYWdzKTsKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDU3LDkgKzQ2NSwxMSBAQAogCWlmICghbm1rX2NoaXApCiAJCXJldHVybiAtRUlOVkFMOwogCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbm1rX2NoaXAtPmxvY2ssIGZsYWdzKTsKIAlfX25ta19ncGlvX3NldF9wdWxsKG5ta19jaGlwLCBncGlvIC0gbm1rX2NoaXAtPmNoaXAuYmFzZSwgcHVsbCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm1rX2NoaXAtPmxvY2ssIGZsYWdzKTsKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDgzLDkgKzQ5MywxMSBAQAogCWlmICghbm1rX2NoaXApCiAJCXJldHVybiAtRUlOVkFMOwogCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbm1rX2NoaXAtPmxvY2ssIGZsYWdzKTsKIAlfX25ta19ncGlvX3NldF9tb2RlKG5ta19jaGlwLCBncGlvIC0gbm1rX2NoaXAtPmNoaXAuYmFzZSwgZ3Bpb19tb2RlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZubWtfY2hpcC0+bG9jaywgZmxhZ3MpOworCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDIsOSArNTE0LDEzIEBACiAKIAliaXQgPSAxIDw8IChncGlvIC0gbm1rX2NoaXAtPmNoaXAuYmFzZSk7CiAKKwljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOworCiAJYWZ1bmMgPSByZWFkbChubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0FGU0xBKSAmIGJpdDsKIAliZnVuYyA9IHJlYWRsKG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fQUZTTEIpICYgYml0OwogCisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CisKIAlyZXR1cm4gKGFmdW5jID8gTk1LX0dQSU9fQUxUX0EgOiAwKSB8IChiZnVuYyA/IE5NS19HUElPX0FMVF9CIDogMCk7CiB9CiBFWFBPUlRfU1lNQk9MKG5ta19ncGlvX2dldF9tb2RlKTsKQEAgLTUyNSw3ICs1NDEsMTAgQEAKIAlubWtfY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCWlmICghbm1rX2NoaXApCiAJCXJldHVybjsKKworCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CiAJd3JpdGVsKG5ta19ncGlvX2dldF9iaXRtYXNrKGdwaW8pLCBubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0lDKTsKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKIH0KIAogZW51bSBubWtfZ3Bpb19pcnFfdHlwZSB7CkBAIC01ODYsMTEgKzYwNSw3IEBACiAJaWYgKCFubWtfY2hpcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZW5hYmxlKQotCQlubWtfY2hpcC0+ZW5hYmxlZCB8PSBiaXRtYXNrOwotCWVsc2UKLQkJbm1rX2NoaXAtPmVuYWJsZWQgJj0gfmJpdG1hc2s7Ci0KKwljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOwogCXNwaW5fbG9ja19pcnFzYXZlKCZubWtfZ3Bpb19zbHBtX2xvY2ssIGZsYWdzKTsKIAlzcGluX2xvY2soJm5ta19jaGlwLT5sb2NrKTsKIApAQCAtNjAxLDYgKzYxNiw3IEBACiAKIAlzcGluX3VubG9jaygmbm1rX2NoaXAtPmxvY2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ta19ncGlvX3NscG1fbG9jaywgZmxhZ3MpOworCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MjgsMTAgKzY0NCwxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAliaXRtYXNrID0gbm1rX2dwaW9fZ2V0X2JpdG1hc2soZ3Bpbyk7CiAKKwljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOwogCXNwaW5fbG9ja19pcnFzYXZlKCZubWtfZ3Bpb19zbHBtX2xvY2ssIGZsYWdzKTsKIAlzcGluX2xvY2soJm5ta19jaGlwLT5sb2NrKTsKIAotCWlmICghKG5ta19jaGlwLT5lbmFibGVkICYgYml0bWFzaykpCisJaWYgKGlycWRfaXJxX2Rpc2FibGVkKGQpKQogCQlfX25ta19ncGlvX3NldF93YWtlKG5ta19jaGlwLCBncGlvLCBvbik7CiAKIAlpZiAob24pCkBAIC02NDEsMTMgKzY1OCwxNSBAQAogCiAJc3Bpbl91bmxvY2soJm5ta19jaGlwLT5sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZubWtfZ3Bpb19zbHBtX2xvY2ssIGZsYWdzKTsKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG5ta19ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQogewotCWJvb2wgZW5hYmxlZCwgd2FrZSA9IGlycWRfaXNfd2FrZXVwX3NldChkKTsKKwlib29sIGVuYWJsZWQgPSAhaXJxZF9pcnFfZGlzYWJsZWQoZCk7CisJYm9vbCB3YWtlID0gaXJxZF9pc193YWtldXBfc2V0KGQpOwogCWludCBncGlvOwogCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNjY0LDggKzY4Myw3IEBACiAJaWYgKHR5cGUgJiBJUlFfVFlQRV9MRVZFTF9MT1cpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZW5hYmxlZCA9IG5ta19jaGlwLT5lbmFibGVkICYgYml0bWFzazsKLQorCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5ta19jaGlwLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoZW5hYmxlZCkKQEAgLTY4OSwxMCArNzA3LDI4IEBACiAJCV9fbm1rX2dwaW9faXJxX21vZGlmeShubWtfY2hpcCwgZ3BpbywgV0FLRSwgdHJ1ZSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZubWtfY2hpcC0+bG9jaywgZmxhZ3MpOworCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm1rX2dwaW9faXJxX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKKwlubWtfZ3Bpb19pcnFfdW5tYXNrKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBubWtfZ3Bpb19pcnFfc2h1dGRvd24oc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCisJbm1rX2dwaW9faXJxX21hc2soZCk7CisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbm1rX2dwaW9faXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gIk5vbWFkaWstR1BJTyIsCiAJLmlycV9hY2sJPSBubWtfZ3Bpb19pcnFfYWNrLApAQCAtNzAwLDYgKzczNiw4IEBACiAJLmlycV91bm1hc2sJPSBubWtfZ3Bpb19pcnFfdW5tYXNrLAogCS5pcnFfc2V0X3R5cGUJPSBubWtfZ3Bpb19pcnFfc2V0X3R5cGUsCiAJLmlycV9zZXRfd2FrZQk9IG5ta19ncGlvX2lycV9zZXRfd2FrZSwKKwkuaXJxX3N0YXJ0dXAJPSBubWtfZ3Bpb19pcnFfc3RhcnR1cCwKKwkuaXJxX3NodXRkb3duCT0gbm1rX2dwaW9faXJxX3NodXRkb3duLAogfTsKIAogc3RhdGljIHZvaWQgX19ubWtfZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsCkBAIC03MjYsNyArNzY0LDExIEBACiBzdGF0aWMgdm9pZCBubWtfZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJc3RydWN0IG5ta19ncGlvX2NoaXAgKm5ta19jaGlwID0gaXJxX2dldF9oYW5kbGVyX2RhdGEoaXJxKTsKLQl1MzIgc3RhdHVzID0gcmVhZGwobm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19JUyk7CisJdTMyIHN0YXR1czsKKworCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CisJc3RhdHVzID0gcmVhZGwobm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19JUyk7CisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CiAKIAlfX25ta19ncGlvX2lycV9oYW5kbGVyKGlycSwgZGVzYywgc3RhdHVzKTsKIH0KQEAgLTc3Miw3ICs4MTQsMTIgQEAKIAlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAgPQogCQljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG5ta19ncGlvX2NoaXAsIGNoaXApOwogCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKKwogCXdyaXRlbCgxIDw8IG9mZnNldCwgbm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19ESVJDKTsKKworCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc4MSw4ICs4MjgsMTUgQEAKIAlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAgPQogCQljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG5ta19ncGlvX2NoaXAsIGNoaXApOwogCXUzMiBiaXQgPSAxIDw8IG9mZnNldDsKKwlpbnQgdmFsdWU7CiAKLQlyZXR1cm4gKHJlYWRsKG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fREFUKSAmIGJpdCkgIT0gMDsKKwljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOworCisJdmFsdWUgPSAocmVhZGwobm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19EQVQpICYgYml0KSAhPSAwOworCisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CisKKwlyZXR1cm4gdmFsdWU7CiB9CiAKIHN0YXRpYyB2b2lkIG5ta19ncGlvX3NldF9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LApAQCAtNzkxLDcgKzg0NSwxMSBAQAogCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCA9CiAJCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCwgY2hpcCk7CiAKKwljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOworCiAJX19ubWtfZ3Bpb19zZXRfb3V0cHV0KG5ta19jaGlwLCBvZmZzZXQsIHZhbCk7CisKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKIH0KIAogc3RhdGljIGludCBubWtfZ3Bpb19tYWtlX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCkBAIC04MDAsOCArODU4LDEyIEBACiAJc3RydWN0IG5ta19ncGlvX2NoaXAgKm5ta19jaGlwID0KIAkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBubWtfZ3Bpb19jaGlwLCBjaGlwKTsKIAorCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CisKIAlfX25ta19ncGlvX21ha2Vfb3V0cHV0KG5ta19jaGlwLCBvZmZzZXQsIHZhbCk7CiAKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC04MzIsNiArODk0LDggQEAKIAkJW05NS19HUElPX0FMVF9DXQk9ICJhbHRDIiwKIAl9OwogCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKKwogCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5uZ3BpbzsgaSsrLCBncGlvKyspIHsKIAkJY29uc3QgY2hhciAqbGFiZWwgPSBncGlvY2hpcF9pc19yZXF1ZXN0ZWQoY2hpcCwgaSk7CiAJCWJvb2wgcHVsbDsKQEAgLTg3Niw2ICs5NDAsOCBAQAogCiAJCXNlcV9wcmludGYocywgIlxuIik7CiAJfQorCisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CiB9CiAKICNlbHNlCkBAIC04OTMsNiArOTU5LDM0IEBACiAJLmNhbl9zbGVlcAkJPSAwLAogfTsKIAordm9pZCBubWtfZ3Bpb19jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0JBTktTOyBpKyspIHsKKwkJc3RydWN0IG5ta19ncGlvX2NoaXAgKmNoaXAgPSBubWtfZ3Bpb19jaGlwc1tpXTsKKworCQlpZiAoIWNoaXApCisJCQljb250aW51ZTsKKworCQljbGtfZW5hYmxlKGNoaXAtPmNsayk7CisJfQorfQorCit2b2lkIG5ta19ncGlvX2Nsb2Nrc19kaXNhYmxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0JBTktTOyBpKyspIHsKKwkJc3RydWN0IG5ta19ncGlvX2NoaXAgKmNoaXAgPSBubWtfZ3Bpb19jaGlwc1tpXTsKKworCQlpZiAoIWNoaXApCisJCQljb250aW51ZTsKKworCQljbGtfZGlzYWJsZShjaGlwLT5jbGspOworCX0KK30KKwogLyoKICAqIENhbGxlZCBmcm9tIHRoZSBzdXNwZW5kL3Jlc3VtZSBwYXRoIHRvIG9ubHkga2VlcCB0aGUgcmVhbCB3YWtldXAgaW50ZXJydXB0cwogICogKHRob3NlIHRoYXQgaGF2ZSBoYWQgc2V0X2lycV93YWtlKCkgY2FsbGVkIG9uIHRoZW0pIGFzIHdha2V1cCBpbnRlcnJ1cHRzLApAQCAtOTEyLDYgKzEwMDYsOCBAQAogCQlpZiAoIWNoaXApCiAJCQlicmVhazsKIAorCQljbGtfZW5hYmxlKGNoaXAtPmNsayk7CisKIAkJY2hpcC0+cndpbXNjID0gcmVhZGwoY2hpcC0+YWRkciArIE5NS19HUElPX1JXSU1TQyk7CiAJCWNoaXAtPmZ3aW1zYyA9IHJlYWRsKGNoaXAtPmFkZHIgKyBOTUtfR1BJT19GV0lNU0MpOwogCkBAIC05MjYsNiArMTAyMiw4IEBACiAJCQkvKiAwIC0+IHdha2V1cCBlbmFibGUgKi8KIAkJCXdyaXRlbCh+Y2hpcC0+cmVhbF93YWtlLCBjaGlwLT5hZGRyICsgTk1LX0dQSU9fU0xQQyk7CiAJCX0KKworCQljbGtfZGlzYWJsZShjaGlwLT5jbGspOwogCX0KIH0KIApAQCAtOTM5LDExICsxMDM3LDE1IEBACiAJCWlmICghY2hpcCkKIAkJCWJyZWFrOwogCisJCWNsa19lbmFibGUoY2hpcC0+Y2xrKTsKKwogCQl3cml0ZWwoY2hpcC0+cndpbXNjLCBjaGlwLT5hZGRyICsgTk1LX0dQSU9fUldJTVNDKTsKIAkJd3JpdGVsKGNoaXAtPmZ3aW1zYywgY2hpcC0+YWRkciArIE5NS19HUElPX0ZXSU1TQyk7CiAKIAkJaWYgKGNoaXAtPnNsZWVwbW9kZSkKIAkJCXdyaXRlbChjaGlwLT5zbHBtLCBjaGlwLT5hZGRyICsgTk1LX0dQSU9fU0xQQyk7CisKKwkJY2xrX2Rpc2FibGUoY2hpcC0+Y2xrKTsKIAl9CiB9CiAKQEAgLTEwMTAsOCArMTExMiw2IEBACiAJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCi0JY2xrX2VuYWJsZShjbGspOwotCiAJbm1rX2NoaXAgPSBremFsbG9jKHNpemVvZigqbm1rX2NoaXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ta19jaGlwKSB7CiAJCXJldCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1vbWFwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1vbWFwLmMKaW5kZXggMTE4ZWMxMi4uMGIwNTYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tb21hcC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW9tYXAuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogc3RydWN0IGdwaW9fYmFuayB7CkBAIC0xNDgsMTMgKzE0OCwxNyBAQAogCXJldHVybiAoX19yYXdfcmVhZGwocmVnKSAmIEdQSU9fQklUKGJhbmssIGdwaW8pKSAhPSAwOwogfQogCi0jZGVmaW5lIE1PRF9SRUdfQklUKHJlZywgYml0X21hc2ssIHNldCkJXAotZG8gewlcCi0JaW50IGwgPSBfX3Jhd19yZWFkbChiYXNlICsgcmVnKTsgXAotCWlmIChzZXQpIGwgfD0gYml0X21hc2s7IFwKLQllbHNlIGwgJj0gfmJpdF9tYXNrOyBcCi0JX19yYXdfd3JpdGVsKGwsIGJhc2UgKyByZWcpOyBcCi19IHdoaWxlKDApCitzdGF0aWMgaW5saW5lIHZvaWQgX2dwaW9fcm13KHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHJlZywgdTMyIG1hc2ssIGJvb2wgc2V0KQoreworCWludCBsID0gX19yYXdfcmVhZGwoYmFzZSArIHJlZyk7CisKKwlpZiAoc2V0KSAKKwkJbCB8PSBtYXNrOworCWVsc2UKKwkJbCAmPSB+bWFzazsKKworCV9fcmF3X3dyaXRlbChsLCBiYXNlICsgcmVnKTsKK30KIAogLyoqCiAgKiBfc2V0X2dwaW9fZGVib3VuY2UgLSBsb3cgbGV2ZWwgZ3BpbyBkZWJvdW5jZSB0aW1lCkBAIC0yMTAsMjggKzIxNCwyOCBAQAogCXUzMiBncGlvX2JpdCA9IDEgPDwgZ3BpbzsKIAogCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQlNT0RfUkVHX0JJVChPTUFQNF9HUElPX0xFVkVMREVURUNUMCwgZ3Bpb19iaXQsCi0JCQl0cmlnZ2VyICYgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQkJTU9EX1JFR19CSVQoT01BUDRfR1BJT19MRVZFTERFVEVDVDEsIGdwaW9fYml0LAotCQkJdHJpZ2dlciAmIElSUV9UWVBFX0xFVkVMX0hJR0gpOwotCQlNT0RfUkVHX0JJVChPTUFQNF9HUElPX1JJU0lOR0RFVEVDVCwgZ3Bpb19iaXQsCi0JCQl0cmlnZ2VyICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpOwotCQlNT0RfUkVHX0JJVChPTUFQNF9HUElPX0ZBTExJTkdERVRFQ1QsIGdwaW9fYml0LAotCQkJdHJpZ2dlciAmIElSUV9UWVBFX0VER0VfRkFMTElORyk7CisJCV9ncGlvX3JtdyhiYXNlLCBPTUFQNF9HUElPX0xFVkVMREVURUNUMCwgZ3Bpb19iaXQsCisJCQkgIHRyaWdnZXIgJiBJUlFfVFlQRV9MRVZFTF9MT1cpOworCQlfZ3Bpb19ybXcoYmFzZSwgT01BUDRfR1BJT19MRVZFTERFVEVDVDEsIGdwaW9fYml0LAorCQkJICB0cmlnZ2VyICYgSVJRX1RZUEVfTEVWRUxfSElHSCk7CisJCV9ncGlvX3JtdyhiYXNlLCBPTUFQNF9HUElPX1JJU0lOR0RFVEVDVCwgZ3Bpb19iaXQsCisJCQkgIHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX1JJU0lORyk7CisJCV9ncGlvX3JtdyhiYXNlLCBPTUFQNF9HUElPX0ZBTExJTkdERVRFQ1QsIGdwaW9fYml0LAorCQkJICB0cmlnZ2VyICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKTsKIAl9IGVsc2UgewotCQlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMCwgZ3Bpb19iaXQsCi0JCQl0cmlnZ2VyICYgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQkJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDEsIGdwaW9fYml0LAotCQkJdHJpZ2dlciAmIElSUV9UWVBFX0xFVkVMX0hJR0gpOwotCQlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX1JJU0lOR0RFVEVDVCwgZ3Bpb19iaXQsCi0JCQl0cmlnZ2VyICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpOwotCQlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX0ZBTExJTkdERVRFQ1QsIGdwaW9fYml0LAotCQkJdHJpZ2dlciAmIElSUV9UWVBFX0VER0VfRkFMTElORyk7CisJCV9ncGlvX3JtdyhiYXNlLCBPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMCwgZ3Bpb19iaXQsCisJCQkgIHRyaWdnZXIgJiBJUlFfVFlQRV9MRVZFTF9MT1cpOworCQlfZ3Bpb19ybXcoYmFzZSwgT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDEsIGdwaW9fYml0LAorCQkJICB0cmlnZ2VyICYgSVJRX1RZUEVfTEVWRUxfSElHSCk7CisJCV9ncGlvX3JtdyhiYXNlLCBPTUFQMjRYWF9HUElPX1JJU0lOR0RFVEVDVCwgZ3Bpb19iaXQsCisJCQkgIHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX1JJU0lORyk7CisJCV9ncGlvX3JtdyhiYXNlLCBPTUFQMjRYWF9HUElPX0ZBTExJTkdERVRFQ1QsIGdwaW9fYml0LAorCQkJICB0cmlnZ2VyICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKTsKIAl9CiAJaWYgKGxpa2VseSghKGJhbmstPm5vbl93YWtldXBfZ3Bpb3MgJiBncGlvX2JpdCkpKSB7CiAJCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQkJTU9EX1JFR19CSVQoT01BUDRfR1BJT19JUlFXQUtFTjAsIGdwaW9fYml0LAotCQkJCXRyaWdnZXIgIT0gMCk7CisJCQlfZ3Bpb19ybXcoYmFzZSwgT01BUDRfR1BJT19JUlFXQUtFTjAsIGdwaW9fYml0LAorCQkJCSAgdHJpZ2dlciAhPSAwKTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBHUElPIHdha2V1cCByZXF1ZXN0IGNhbiBvbmx5IGJlIGdlbmVyYXRlZCBvbiBlZGdlCkBAIC0xMDg2LDYgKzEwOTAsMTEgQEAKIAogCWdjID0gaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCgiTVBVSU8iLCAxLCBpcnFfc3RhcnQsIGJhbmstPmJhc2UsCiAJCQkJICAgIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwlpZiAoIWdjKSB7CisJCWRldl9lcnIoYmFuay0+ZGV2LCAiTWVtb3J5IGFsbG9jIGZhaWxlZCBmb3IgZ2NcbiIpOworCQlyZXR1cm47CisJfQorCiAJY3QgPSBnYy0+Y2hpcF90eXBlczsKIAogCS8qIE5PVEU6IE5vIGFjayByZXF1aXJlZCwgcmVhZGluZyBJUlEgc3RhdHVzIGNsZWFycyBpdC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYwppbmRleCAwNTUwZGNiLi4xNDdkZjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1wY2E5NTN4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNhOTUzeC5jCkBAIC01OTYsOSArNTk2LDYgQEAKIAogCS8qIHNldCBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xhcml0eSBpbnZlcnNpb24gKi8KIAlyZXQgPSBwY2E5NTN4X3dyaXRlX3JlZyhjaGlwLCBQQ0E5NTNYX0lOVkVSVCwgaW52ZXJ0KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQlyZXR1cm4gMDsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjQwLDcgKzYzNyw3IEBACiAJc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcDsKIAlpbnQgaXJxX2Jhc2U9MCwgaW52ZXJ0PTA7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNhOTUzeF9jaGlwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNoaXAgPT0gTlVMTCkKQEAgLTY3MywxMCArNjcwLDEwIEBACiAJcGNhOTUzeF9zZXR1cF9ncGlvKGNoaXAsIGlkLT5kcml2ZXJfZGF0YSAmIFBDQV9HUElPX01BU0spOwogCiAJaWYgKGNoaXAtPmNoaXBfdHlwZSA9PSBQQ0E5NTNYX1RZUEUpCi0JCWRldmljZV9wY2E5NTN4X2luaXQoY2hpcCwgaW52ZXJ0KTsKLQllbHNlIGlmIChjaGlwLT5jaGlwX3R5cGUgPT0gUENBOTU3WF9UWVBFKQotCQlkZXZpY2VfcGNhOTU3eF9pbml0KGNoaXAsIGludmVydCk7CisJCXJldCA9IGRldmljZV9wY2E5NTN4X2luaXQoY2hpcCwgaW52ZXJ0KTsKIAllbHNlCisJCXJldCA9IGRldmljZV9wY2E5NTd4X2luaXQoY2hpcCwgaW52ZXJ0KTsKKwlpZiAocmV0KQogCQlnb3RvIG91dF9mYWlsZWQ7CiAKIAlyZXQgPSBwY2E5NTN4X2lycV9zZXR1cChjaGlwLCBpZCwgaXJxX2Jhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tcGNmODU3eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNmODU3eC5jCmluZGV4IDczNjlmZGQuLjNlMWYxZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBjZjg1N3guYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wY2Y4NTd4LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3BjZjg1N3guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcGNmODU3eF9pZFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tcGNoLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wY2guYwppbmRleCAzNjkxOWU3Li5hNjAwOGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1wY2guYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wY2guYwpAQCAtMTQsMTIgKzE0LDIxIEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCi0jZGVmaW5lIFBDSF9HUElPX0FMTF9QSU5TCTB4ZmZmIC8qIE1hc2sgZm9yIEdQSU8gcGlucyAwIHRvIDExICovCi0jZGVmaW5lIEdQSU9fTlVNX1BJTlMJMTIJLyogU3BlY2lmaWVzIG51bWJlciBvZiBHUElPIFBJTlMgR1BJTzAtR1BJTzExICovCisjZGVmaW5lIFBDSF9FREdFX0ZBTExJTkcJMAorI2RlZmluZSBQQ0hfRURHRV9SSVNJTkcJCUJJVCgwKQorI2RlZmluZSBQQ0hfTEVWRUxfTAkJQklUKDEpCisjZGVmaW5lIFBDSF9MRVZFTF9ICQkoQklUKDApIHwgQklUKDEpKQorI2RlZmluZSBQQ0hfRURHRV9CT1RICQlCSVQoMikKKyNkZWZpbmUgUENIX0lNX01BU0sJCShCSVQoMCkgfCBCSVQoMSkgfCBCSVQoMikpCisKKyNkZWZpbmUgUENIX0lSUV9CQVNFCQkyNAogCiBzdHJ1Y3QgcGNoX3JlZ3MgewogCXUzMglpZW47CkBAIC0zMywxOCArNDIsNDMgQEAKIAl1MzIJcG07CiAJdTMyCWltMDsKIAl1MzIJaW0xOwotCXUzMglyZXNlcnZlZFs0XTsKKwl1MzIJcmVzZXJ2ZWRbM107CisJdTMyCWdwaW9fdXNlX3NlbDsKIAl1MzIJcmVzZXQ7CiB9OwogCitlbnVtIHBjaF90eXBlX3QgeworCUlOVEVMX0VHMjBUX1BDSCwKKwlPS0lTRU1JX01MNzIyM21fSU9ILCAvKiBPS0lTRU1JIE1MNzIyMyBJT0ggUENJZSBCdXMtbSAqLworCU9LSVNFTUlfTUw3MjIzbl9JT0ggIC8qIE9LSVNFTUkgTUw3MjIzIElPSCBQQ0llIEJ1cy1uICovCit9OworCisvKiBTcGVjaWZpZXMgbnVtYmVyIG9mIEdQSU8gUElOUyAqLworc3RhdGljIGludCBncGlvX3BpbnNbXSA9IHsKKwlbSU5URUxfRUcyMFRfUENIXSA9IDEyLAorCVtPS0lTRU1JX01MNzIyM21fSU9IXSA9IDgsCisJW09LSVNFTUlfTUw3MjIzbl9JT0hdID0gOCwKK307CisKIC8qKgogICogc3RydWN0IHBjaF9ncGlvX3JlZ19kYXRhIC0gVGhlIHJlZ2lzdGVyIHN0b3JlIGRhdGEuCisgKiBAaWVuX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgSUVOIHJlZ2lzdGVyLgorICogQGltYXNrX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgSU1BU0sgcmVnaXN0ZXIuCiAgKiBAcG9fcmVnOglUbyBzdG9yZSBjb250ZW50cyBvZiBQTyByZWdpc3Rlci4KICAqIEBwbV9yZWc6CVRvIHN0b3JlIGNvbnRlbnRzIG9mIFBNIHJlZ2lzdGVyLgorICogQGltMF9yZWc6CVRvIHN0b3JlIGNvbnRlbnRzIG9mIElNMCByZWdpc3Rlci4KKyAqIEBpbTFfcmVnOglUbyBzdG9yZSBjb250ZW50cyBvZiBJTTEgcmVnaXN0ZXIuCisgKiBAZ3Bpb191c2Vfc2VsX3JlZyA6IFRvIHN0b3JlIGNvbnRlbnRzIG9mIEdQSU9fVVNFX1NFTCByZWdpc3Rlci4KKyAqCQkgICAgICAgKE9ubHkgTUw3MjIzIEJ1cy1uKQogICovCiBzdHJ1Y3QgcGNoX2dwaW9fcmVnX2RhdGEgeworCXUzMiBpZW5fcmVnOworCXUzMiBpbWFza19yZWc7CiAJdTMyIHBvX3JlZzsKIAl1MzIgcG1fcmVnOworCXUzMiBpbTBfcmVnOworCXUzMiBpbTFfcmVnOworCXUzMiBncGlvX3VzZV9zZWxfcmVnOwogfTsKIAogLyoqCkBAIC01NSw2ICs4OSwxMiBAQAogICogQGdwaW86CQkJRGF0YSBmb3IgR1BJTyBpbmZyYXN0cnVjdHVyZS4KICAqIEBwY2hfZ3Bpb19yZWc6CQlNZW1vcnkgbWFwcGVkIFJlZ2lzdGVyIGRhdGEgaXMgc2F2ZWQgaGVyZQogICoJCQkJd2hlbiBzdXNwZW5kLgorICogQGxvY2s6CQkJVXNlZCBmb3IgcmVnaXN0ZXIgYWNjZXNzIHByb3RlY3Rpb24KKyAqIEBpcnFfYmFzZToJCVNhdmUgYmFzZSBvZiBJUlEgbnVtYmVyIGZvciBpbnRlcnJ1cHQKKyAqIEBpb2g6CQlJT0ggSUQKKyAqIEBzcGlubG9jazoJCVVzZWQgZm9yIHJlZ2lzdGVyIGFjY2VzcyBwcm90ZWN0aW9uIGluCisgKgkJCQlpbnRlcnJ1cHQgY29udGV4dCBwY2hfaXJxX21hc2ssCisgKgkJCQlwY2hfaXJxX3VubWFzayBhbmQgcGNoX2lycV90eXBlOwogICovCiBzdHJ1Y3QgcGNoX2dwaW8gewogCXZvaWQgX19pb21lbSAqYmFzZTsKQEAgLTYzLDYgKzEwMyw5IEBACiAJc3RydWN0IGdwaW9fY2hpcCBncGlvOwogCXN0cnVjdCBwY2hfZ3Bpb19yZWdfZGF0YSBwY2hfZ3Bpb19yZWc7CiAJc3RydWN0IG11dGV4IGxvY2s7CisJaW50IGlycV9iYXNlOworCWVudW0gcGNoX3R5cGVfdCBpb2g7CisJc3BpbmxvY2tfdCBzcGlubG9jazsKIH07CiAKIHN0YXRpYyB2b2lkIHBjaF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBuciwgaW50IHZhbCkKQEAgLTk2LDcgKzEzOSw3IEBACiAJdTMyIHJlZ192YWw7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKLQlwbSA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnBtKSAmIFBDSF9HUElPX0FMTF9QSU5TOworCXBtID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cG0pICYgKCgxIDw8IGdwaW9fcGluc1tjaGlwLT5pb2hdKSAtIDEpOwogCXBtIHw9ICgxIDw8IG5yKTsKIAlpb3dyaXRlMzIocG0sICZjaGlwLT5yZWctPnBtKTsKIApAQCAtMTE4LDcgKzE2MSw3IEBACiAJdTMyIHBtOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7Ci0JcG0gPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5wbSkgJiBQQ0hfR1BJT19BTExfUElOUzsgLypiaXRzIDAtMTEqLworCXBtID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cG0pICYgKCgxIDw8IGdwaW9fcGluc1tjaGlwLT5pb2hdKSAtIDEpOwogCXBtICY9IH4oMSA8PCBucik7CiAJaW93cml0ZTMyKHBtLCAmY2hpcC0+cmVnLT5wbSk7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKQEAgLTEzMSw4ICsxNzQsMTYgQEAKICAqLwogc3RhdGljIHZvaWQgcGNoX2dwaW9fc2F2ZV9yZWdfY29uZihzdHJ1Y3QgcGNoX2dwaW8gKmNoaXApCiB7CisJY2hpcC0+cGNoX2dwaW9fcmVnLmllbl9yZWcgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5pZW4pOworCWNoaXAtPnBjaF9ncGlvX3JlZy5pbWFza19yZWcgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5pbWFzayk7CiAJY2hpcC0+cGNoX2dwaW9fcmVnLnBvX3JlZyA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnBvKTsKIAljaGlwLT5wY2hfZ3Bpb19yZWcucG1fcmVnID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cG0pOworCWNoaXAtPnBjaF9ncGlvX3JlZy5pbTBfcmVnID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+aW0wKTsKKwlpZiAoY2hpcC0+aW9oID09IElOVEVMX0VHMjBUX1BDSCkKKwkJY2hpcC0+cGNoX2dwaW9fcmVnLmltMV9yZWcgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5pbTEpOworCWlmIChjaGlwLT5pb2ggPT0gT0tJU0VNSV9NTDcyMjNuX0lPSCkKKwkJY2hpcC0+cGNoX2dwaW9fcmVnLmdwaW9fdXNlX3NlbF9yZWcgPVwKKwkJCQkJICAgIGlvcmVhZDMyKCZjaGlwLT5yZWctPmdwaW9fdXNlX3NlbCk7CiB9CiAKIC8qCkBAIC0xNDAsMTAgKzE5MSwyNCBAQAogICovCiBzdGF0aWMgdm9pZCBwY2hfZ3Bpb19yZXN0b3JlX3JlZ19jb25mKHN0cnVjdCBwY2hfZ3BpbyAqY2hpcCkKIHsKKwlpb3dyaXRlMzIoY2hpcC0+cGNoX2dwaW9fcmVnLmllbl9yZWcsICZjaGlwLT5yZWctPmllbik7CisJaW93cml0ZTMyKGNoaXAtPnBjaF9ncGlvX3JlZy5pbWFza19yZWcsICZjaGlwLT5yZWctPmltYXNrKTsKIAkvKiB0byBzdG9yZSBjb250ZW50cyBvZiBQTyByZWdpc3RlciAqLwogCWlvd3JpdGUzMihjaGlwLT5wY2hfZ3Bpb19yZWcucG9fcmVnLCAmY2hpcC0+cmVnLT5wbyk7CiAJLyogdG8gc3RvcmUgY29udGVudHMgb2YgUE0gcmVnaXN0ZXIgKi8KIAlpb3dyaXRlMzIoY2hpcC0+cGNoX2dwaW9fcmVnLnBtX3JlZywgJmNoaXAtPnJlZy0+cG0pOworCWlvd3JpdGUzMihjaGlwLT5wY2hfZ3Bpb19yZWcuaW0wX3JlZywgJmNoaXAtPnJlZy0+aW0wKTsKKwlpZiAoY2hpcC0+aW9oID09IElOVEVMX0VHMjBUX1BDSCkKKwkJaW93cml0ZTMyKGNoaXAtPnBjaF9ncGlvX3JlZy5pbTFfcmVnLCAmY2hpcC0+cmVnLT5pbTEpOworCWlmIChjaGlwLT5pb2ggPT0gT0tJU0VNSV9NTDcyMjNuX0lPSCkKKwkJaW93cml0ZTMyKGNoaXAtPnBjaF9ncGlvX3JlZy5ncGlvX3VzZV9zZWxfcmVnLAorCQkJICAmY2hpcC0+cmVnLT5ncGlvX3VzZV9zZWwpOworfQorCitzdGF0aWMgaW50IHBjaF9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHBjaF9ncGlvICpjaGlwID0gY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBwY2hfZ3BpbywgZ3Bpbyk7CisJcmV0dXJuIGNoaXAtPmlycV9iYXNlICsgb2Zmc2V0OwogfQogCiBzdGF0aWMgdm9pZCBwY2hfZ3Bpb19zZXR1cChzdHJ1Y3QgcGNoX2dwaW8gKmNoaXApCkBAIC0xNTgsOCArMjIzLDEzMiBAQAogCWdwaW8tPnNldCA9IHBjaF9ncGlvX3NldDsKIAlncGlvLT5kYmdfc2hvdyA9IE5VTEw7CiAJZ3Bpby0+YmFzZSA9IC0xOwotCWdwaW8tPm5ncGlvID0gR1BJT19OVU1fUElOUzsKKwlncGlvLT5uZ3BpbyA9IGdwaW9fcGluc1tjaGlwLT5pb2hdOwogCWdwaW8tPmNhbl9zbGVlcCA9IDA7CisJZ3Bpby0+dG9faXJxID0gcGNoX2dwaW9fdG9faXJxOworfQorCitzdGF0aWMgaW50IHBjaF9pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXUzMiBpbTsKKwl1MzIgKmltX3JlZzsKKwl1MzIgaWVuOworCXUzMiBpbV9wb3M7CisJaW50IGNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKwlpbnQgaXJxID0gZC0+aXJxOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBwY2hfZ3BpbyAqY2hpcCA9IGdjLT5wcml2YXRlOworCisJY2ggPSBpcnEgLSBjaGlwLT5pcnFfYmFzZTsKKwlpZiAoaXJxIDw9IGNoaXAtPmlycV9iYXNlICsgNykgeworCQlpbV9yZWcgPSAmY2hpcC0+cmVnLT5pbTA7CisJCWltX3BvcyA9IGNoOworCX0gZWxzZSB7CisJCWltX3JlZyA9ICZjaGlwLT5yZWctPmltMTsKKwkJaW1fcG9zID0gY2ggLSA4OworCX0KKwlkZXZfZGJnKGNoaXAtPmRldiwgIiVzOmlycT0lZCB0eXBlPSVkIGNoPSVkIHBvcz0lZFxuIiwKKwkJX19mdW5jX18sIGlycSwgdHlwZSwgY2gsIGltX3Bvcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJCXZhbCA9IFBDSF9FREdFX1JJU0lORzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCXZhbCA9IFBDSF9FREdFX0ZBTExJTkc7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQl2YWwgPSBQQ0hfRURHRV9CT1RIOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCXZhbCA9IFBDSF9MRVZFTF9IOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJdmFsID0gUENIX0xFVkVMX0w7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfUFJPQkU6CisJCWdvdG8gZW5kOworCWRlZmF1bHQ6CisJCWRldl93YXJuKGNoaXAtPmRldiwgIiVzOiB1bmtub3duIHR5cGUoJWRkKSIsCisJCQlfX2Z1bmNfXywgdHlwZSk7CisJCWdvdG8gZW5kOworCX0KKworCS8qIFNldCBpbnRlcnJ1cHQgbW9kZSAqLworCWltID0gaW9yZWFkMzIoaW1fcmVnKSAmIH4oUENIX0lNX01BU0sgPDwgKGltX3BvcyAqIDQpKTsKKwlpb3dyaXRlMzIoaW0gfCAodmFsIDw8IChpbV9wb3MgKiA0KSksIGltX3JlZyk7CisKKwkvKiBpY2xyICovCisJaW93cml0ZTMyKEJJVChjaCksICZjaGlwLT5yZWctPmljbHIpOworCisJLyogSU1BU0tDTFIgKi8KKwlpb3dyaXRlMzIoQklUKGNoKSwgJmNoaXAtPnJlZy0+aW1hc2tjbHIpOworCisJLyogRW5hYmxlIGludGVycnVwdCAqLworCWllbiA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPmllbik7CisJaW93cml0ZTMyKGllbiB8IEJJVChjaCksICZjaGlwLT5yZWctPmllbik7CitlbmQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwY2hfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IHBjaF9ncGlvICpjaGlwID0gZ2MtPnByaXZhdGU7CisKKwlpb3dyaXRlMzIoMSA8PCAoZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2UpLCAmY2hpcC0+cmVnLT5pbWFza2Nscik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IHBjaF9ncGlvICpjaGlwID0gZ2MtPnByaXZhdGU7CisKKwlpb3dyaXRlMzIoMSA8PCAoZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2UpLCAmY2hpcC0+cmVnLT5pbWFzayk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY2hfZ3Bpb19oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGNoX2dwaW8gKmNoaXAgPSBkZXZfaWQ7CisJdTMyIHJlZ192YWwgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5pc3RhdHVzKTsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gSVJRX05PTkU7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ3Bpb19waW5zW2NoaXAtPmlvaF07IGkrKykgeworCQlpZiAocmVnX3ZhbCAmIEJJVChpKSkgeworCQkJZGV2X2RiZyhjaGlwLT5kZXYsICIlczpbJWRdOmlycT0lZCAgc3RhdHVzPTB4JXhcbiIsCisJCQkJX19mdW5jX18sIGksIGlycSwgcmVnX3ZhbCk7CisJCQlpb3dyaXRlMzIoQklUKGkpLCAmY2hpcC0+cmVnLT5pY2xyKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShjaGlwLT5pcnFfYmFzZSArIGkpOworCQkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9fZGV2aW5pdCB2b2lkIHBjaF9ncGlvX2FsbG9jX2dlbmVyaWNfY2hpcChzdHJ1Y3QgcGNoX2dwaW8gKmNoaXAsCisJCQkJdW5zaWduZWQgaW50IGlycV9zdGFydCwgdW5zaWduZWQgaW50IG51bSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0OworCisJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJwY2hfZ3BpbyIsIDEsIGlycV9zdGFydCwgY2hpcC0+YmFzZSwKKwkJCQkgICAgaGFuZGxlX3NpbXBsZV9pcnEpOworCWdjLT5wcml2YXRlID0gY2hpcDsKKwljdCA9IGdjLT5jaGlwX3R5cGVzOworCisJY3QtPmNoaXAuaXJxX21hc2sgPSBwY2hfaXJxX21hc2s7CisJY3QtPmNoaXAuaXJxX3VubWFzayA9IHBjaF9pcnFfdW5tYXNrOworCWN0LT5jaGlwLmlycV9zZXRfdHlwZSA9IHBjaF9pcnFfdHlwZTsKKworCWlycV9zZXR1cF9nZW5lcmljX2NoaXAoZ2MsIElSUV9NU0sobnVtKSwgSVJRX0dDX0lOSVRfTUFTS19DQUNIRSwKKwkJCSAgICAgICBJUlFfTk9SRVFVRVNUIHwgSVJRX05PUFJPQkUsIDApOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2hfZ3Bpb19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKQEAgLTE2Nyw2ICszNTYsNyBAQAogewogCXMzMiByZXQ7CiAJc3RydWN0IHBjaF9ncGlvICpjaGlwOworCWludCBpcnFfYmFzZTsKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmIChjaGlwID09IE5VTEwpCkBAIC0xOTIsNiArMzgyLDEzIEBACiAJCWdvdG8gZXJyX2lvbWFwOwogCX0KIAorCWlmIChwZGV2LT5kZXZpY2UgPT0gMHg4ODAzKQorCQljaGlwLT5pb2ggPSBJTlRFTF9FRzIwVF9QQ0g7CisJZWxzZSBpZiAocGRldi0+ZGV2aWNlID09IDB4ODAxNCkKKwkJY2hpcC0+aW9oID0gT0tJU0VNSV9NTDcyMjNtX0lPSDsKKwllbHNlIGlmIChwZGV2LT5kZXZpY2UgPT0gMHg4MDQzKQorCQljaGlwLT5pb2ggPSBPS0lTRU1JX01MNzIyM25fSU9IOworCiAJY2hpcC0+cmVnID0gY2hpcC0+YmFzZTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgY2hpcCk7CiAJbXV0ZXhfaW5pdCgmY2hpcC0+bG9jayk7CkBAIC0yMDIsOCArMzk5LDM2IEBACiAJCWdvdG8gZXJyX2dwaW9jaGlwX2FkZDsKIAl9CiAKKwlpcnFfYmFzZSA9IGlycV9hbGxvY19kZXNjcygtMSwgMCwgZ3Bpb19waW5zW2NoaXAtPmlvaF0sIE5VTUFfTk9fTk9ERSk7CisJaWYgKGlycV9iYXNlIDwgMCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiUENIIGdwaW86IEZhaWxlZCB0byBnZXQgSVJRIGJhc2UgbnVtXG4iKTsKKwkJY2hpcC0+aXJxX2Jhc2UgPSAtMTsKKwkJZ290byBlbmQ7CisJfQorCWNoaXAtPmlycV9iYXNlID0gaXJxX2Jhc2U7CisKKwlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBjaF9ncGlvX2hhbmRsZXIsCisJCQkgICAgIElSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSIlcyByZXF1ZXN0X2lycSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfcmVxdWVzdF9pcnE7CisJfQorCisJcGNoX2dwaW9fYWxsb2NfZ2VuZXJpY19jaGlwKGNoaXAsIGlycV9iYXNlLCBncGlvX3BpbnNbY2hpcC0+aW9oXSk7CisKKwkvKiBJbml0aWFsaXplIGludGVycnVwdCBpZW4gcmVnaXN0ZXIgKi8KKwlpb3dyaXRlMzIoMCwgJmNoaXAtPnJlZy0+aWVuKTsKK2VuZDoKIAlyZXR1cm4gMDsKIAorZXJyX3JlcXVlc3RfaXJxOgorCWlycV9mcmVlX2Rlc2NzKGlycV9iYXNlLCBncGlvX3BpbnNbY2hpcC0+aW9oXSk7CisKKwlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJmNoaXAtPmdwaW8pOworCWlmIChyZXQpCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIGdwaW9jaGlwX3JlbW92ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwogZXJyX2dwaW9jaGlwX2FkZDoKIAlwY2lfaW91bm1hcChwZGV2LCBjaGlwLT5iYXNlKTsKIApAQCAtMjI0LDYgKzQ0OSwxMiBAQAogCWludCBlcnI7CiAJc3RydWN0IHBjaF9ncGlvICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCisJaWYgKGNoaXAtPmlycV9iYXNlICE9IC0xKSB7CisJCWZyZWVfaXJxKHBkZXYtPmlycSwgY2hpcCk7CisKKwkJaXJxX2ZyZWVfZGVzY3MoY2hpcC0+aXJxX2Jhc2UsIGdwaW9fcGluc1tjaGlwLT5pb2hdKTsKKwl9CisKIAllcnIgPSBncGlvY2hpcF9yZW1vdmUoJmNoaXAtPmdwaW8pOwogCWlmIChlcnIpCiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBncGlvY2hpcF9yZW1vdmVcbiIpOwpAQCAtMjM5LDkgKzQ3MCwxMSBAQAogewogCXMzMiByZXQ7CiAJc3RydWN0IHBjaF9ncGlvICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKIAlwY2hfZ3Bpb19zYXZlX3JlZ19jb25mKGNoaXApOwotCXBjaF9ncGlvX3Jlc3RvcmVfcmVnX2NvbmYoY2hpcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKIAogCXJldCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCWlmIChyZXQpIHsKQEAgLTI2MSw2ICs0OTQsNyBAQAogewogCXMzMiByZXQ7CiAJc3RydWN0IHBjaF9ncGlvICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlyZXQgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAwKTsKIApAQCAtMjcyLDkgKzUwNiwxMSBAQAogCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5zcGlubG9jaywgZmxhZ3MpOwogCWlvd3JpdGUzMigweDAxLCAmY2hpcC0+cmVnLT5yZXNldCk7CiAJaW93cml0ZTMyKDB4MDAsICZjaGlwLT5yZWctPnJlc2V0KTsKIAlwY2hfZ3Bpb19yZXN0b3JlX3JlZ19jb25mKGNoaXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4Nyw2ICs1MjMsNyBAQAogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHBjaF9ncGlvX3BjaWRldl9pZCkgPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4ODgwMykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ST0hNLCAweDgwMTQpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUk9ITSwgMHg4MDQzKSB9LAogCXsgMCwgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2hfZ3Bpb19wY2lkZXZfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tcGwwNjEuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBsMDYxLmMKaW5kZXggMmM1YTE4Zi4uMDkzYzkwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tcGwwNjEuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wbDA2MS5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIHsKIAlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHBsMDYxX2dwaW8sIGdjKTsKIAotCWlmIChjaGlwLT5pcnFfYmFzZSA9PSAodW5zaWduZWQpIC0xKQorCWlmIChjaGlwLT5pcnFfYmFzZSA9PSBOT19JUlEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIGNoaXAtPmlycV9iYXNlICsgb2Zmc2V0OwpAQCAtMjQ2LDYgKzI0NiwxOCBAQAogCWlmIChjaGlwID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcGRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSkgeworCQljaGlwLT5nYy5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKKwkJY2hpcC0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CisJfSBlbHNlIGlmIChkZXYtPmRldi5vZl9ub2RlKSB7CisJCWNoaXAtPmdjLmJhc2UgPSAtMTsKKwkJY2hpcC0+aXJxX2Jhc2UgPSBOT19JUlE7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX21lbTsKKwl9CisKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPnJlcy5zdGFydCwKIAkJCQlyZXNvdXJjZV9zaXplKCZkZXYtPnJlcyksICJwbDA2MSIpKSB7CiAJCXJldCA9IC1FQlVTWTsKQEAgLTI2NywxNCArMjc5LDExIEBACiAJY2hpcC0+Z2MuZ2V0ID0gcGwwNjFfZ2V0X3ZhbHVlOwogCWNoaXAtPmdjLnNldCA9IHBsMDYxX3NldF92YWx1ZTsKIAljaGlwLT5nYy50b19pcnEgPSBwbDA2MV90b19pcnE7Ci0JY2hpcC0+Z2MuYmFzZSA9IHBkYXRhLT5ncGlvX2Jhc2U7CiAJY2hpcC0+Z2MubmdwaW8gPSBQTDA2MV9HUElPX05SOwogCWNoaXAtPmdjLmxhYmVsID0gZGV2X25hbWUoJmRldi0+ZGV2KTsKIAljaGlwLT5nYy5kZXYgPSAmZGV2LT5kZXY7CiAJY2hpcC0+Z2Mub3duZXIgPSBUSElTX01PRFVMRTsKIAotCWNoaXAtPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOwotCiAJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZjaGlwLT5nYyk7CiAJaWYgKHJldCkKIAkJZ290byBpb3VubWFwOwpAQCAtMjgzLDcgKzI5Miw3IEBACiAJICogaXJxX2NoaXAgc3VwcG9ydAogCSAqLwogCi0JaWYgKGNoaXAtPmlycV9iYXNlID09ICh1bnNpZ25lZCkgLTEpCisJaWYgKGNoaXAtPmlycV9iYXNlID09IE5PX0lSUSkKIAkJcmV0dXJuIDA7CiAKIAl3cml0ZWIoMCwgY2hpcC0+YmFzZSArIEdQSU9JRSk7IC8qIGRpc2FibGUgaXJxcyAqLwpAQCAtMzA3LDExICszMTYsMTMgQEAKIAlsaXN0X2FkZCgmY2hpcC0+bGlzdCwgY2hpcF9saXN0KTsKIAogCWZvciAoaSA9IDA7IGkgPCBQTDA2MV9HUElPX05SOyBpKyspIHsKLQkJaWYgKHBkYXRhLT5kaXJlY3Rpb25zICYgKDEgPDwgaSkpCi0JCQlwbDA2MV9kaXJlY3Rpb25fb3V0cHV0KCZjaGlwLT5nYywgaSwKLQkJCQkJcGRhdGEtPnZhbHVlcyAmICgxIDw8IGkpKTsKLQkJZWxzZQotCQkJcGwwNjFfZGlyZWN0aW9uX2lucHV0KCZjaGlwLT5nYywgaSk7CisJCWlmIChwZGF0YSkgeworCQkJaWYgKHBkYXRhLT5kaXJlY3Rpb25zICYgKDEgPDwgaSkpCisJCQkJcGwwNjFfZGlyZWN0aW9uX291dHB1dCgmY2hpcC0+Z2MsIGksCisJCQkJCQlwZGF0YS0+dmFsdWVzICYgKDEgPDwgaSkpOworCQkJZWxzZQorCQkJCXBsMDYxX2RpcmVjdGlvbl9pbnB1dCgmY2hpcC0+Z2MsIGkpOworCQl9CiAKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGkgKyBjaGlwLT5pcnFfYmFzZSwgJnBsMDYxX2lycWNoaXAsCiAJCQkJCSBoYW5kbGVfc2ltcGxlX2lycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1wbGF0LXNhbXN1bmcuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBsYXQtc2Ftc3VuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjY3ZjE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBsYXQtc2Ftc3VuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFNBTVNVTkcgLSBHUElPbGliIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaD4KLQotI2lmbmRlZiBERUJVR19HUElPCi0jZGVmaW5lIGdwaW9fZGJnKHguLi4pIGRvIHsgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIGdwaW9fZGJnKHguLi4pIHByaW50ayhLRVJOX0RFQlVHIHgpCi0jZW5kaWYKLQotLyogVGhlIHNhbXN1bmdfZ3Bpb2xpYl80Yml0IHJvdXRpbmVzIGFyZSB0byBjb250cm9sIHRoZSBncGlvIGJhbmtzIHdoZXJlCi0gKiB0aGUgZ3BpbyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIChHUHhDT04pIGhhcyA0IGJpdHMgcGVyIEdQSU8sIGFzIHRoZQotICogZm9sbG93aW5nIGV4YW1wbGU6Ci0gKgotICogYmFzZSArIDB4MDA6IENvbnRyb2wgcmVnaXN0ZXIsIDQgYml0cyBwZXIgZ3BpbwotICoJCWdwaW8gbjogNCBiaXRzIHN0YXJ0aW5nIGF0ICg0Km4pCi0gKgkJMDAwMCA9IGlucHV0LCAwMDAxID0gb3V0cHV0LCBvdGhlcnMgbWVhbiBzcGVjaWFsLWZ1bmN0aW9uCi0gKiBiYXNlICsgMHgwNDogRGF0YSByZWdpc3RlciwgMSBiaXQgcGVyIGdwaW8KLSAqCQliaXQgbjogZGF0YSBiaXQgbgotICoKLSAqIE5vdGUsIHNpbmNlIHRoZSBkYXRhIHJlZ2lzdGVyIGlzIG9uZSBiaXQgcGVyIGdwaW8gYW5kIGlzIGF0IGJhc2UgKyAweDQKLSAqIHdlIGNhbiB1c2UgczNjX2dwaW9saWJfZ2V0IGFuZCBzM2NfZ3Bpb2xpYl9zZXQgdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZgotICogdGhlIG91dHB1dC4KLSovCi0KLXN0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvbGliXzRiaXRfaW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fczNjX2dwaW8oY2hpcCk7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBsb25nIGNvbjsKLQotCWNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUElPQ09OX09GRik7Ci0JY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCkpOwotCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyBHUElPQ09OX09GRik7Ci0KLQlncGlvX2RiZygiJXM6ICVwOiBDT04gbm93ICUwOGx4XG4iLCBfX2Z1bmNfXywgYmFzZSwgY29uKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhbXN1bmdfZ3Bpb2xpYl80Yml0X291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOwotCXVuc2lnbmVkIGxvbmcgY29uOwotCXVuc2lnbmVkIGxvbmcgZGF0OwotCi0JY29uID0gX19yYXdfcmVhZGwoYmFzZSArIEdQSU9DT05fT0ZGKTsKLQljb24gJj0gfigweGYgPDwgY29uXzRiaXRfc2hpZnQob2Zmc2V0KSk7Ci0JY29uIHw9IDB4MSA8PCBjb25fNGJpdF9zaGlmdChvZmZzZXQpOwotCi0JZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIEdQSU9EQVRfT0ZGKTsKLQotCWlmICh2YWx1ZSkKLQkJZGF0IHw9IDEgPDwgb2Zmc2V0OwotCWVsc2UKLQkJZGF0ICY9IH4oMSA8PCBvZmZzZXQpOwotCi0JX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIEdQSU9EQVRfT0ZGKTsKLQlfX3Jhd193cml0ZWwoY29uLCBiYXNlICsgR1BJT0NPTl9PRkYpOwotCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyBHUElPREFUX09GRik7Ci0KLQlncGlvX2RiZygiJXM6ICVwOiBDT04gJTA4bHgsIERBVCAlMDhseFxuIiwgX19mdW5jX18sIGJhc2UsIGNvbiwgZGF0KTsKLQotCXJldHVybiAwOwotfQotCi0vKiBUaGUgbmV4dCBzZXQgb2Ygcm91dGluZXMgYXJlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgR1BJTyBjb25maWd1cmF0aW9uCi0gKiByZWdpc3RlcnMgYXJlIDQgYml0cyBwZXIgR1BJTyBidXQgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByZWdpc3RlciAodGhlCi0gKiBiYW5rIGhhcyBtb3JlIHRoYW4gOCBHUElPcy4KLSAqCi0gKiBUaGlzIGNhc2UgaXMgdGhlIHNpbWlsYXIgdG8gdGhlIDQgYml0IGNhc2UsIGJ1dCB0aGUgcmVnaXN0ZXJzIGFyZSBhcwotICogZm9sbG93czoKLSAqCi0gKiBiYXNlICsgMHgwMDogQ29udHJvbCByZWdpc3RlciwgNCBiaXRzIHBlciBncGlvIChsb3dlciA4IEdQSU9zKQotICoJCWdwaW8gbjogNCBiaXRzIHN0YXJ0aW5nIGF0ICg0Km4pCi0gKgkJMDAwMCA9IGlucHV0LCAwMDAxID0gb3V0cHV0LCBvdGhlcnMgbWVhbiBzcGVjaWFsLWZ1bmN0aW9uCi0gKiBiYXNlICsgMHgwNDogQ29udHJvbCByZWdpc3RlciwgNCBiaXRzIHBlciBncGlvICh1cCB0byA4IGFkZGl0aW9ucyBHUElPcykKLSAqCQlncGlvIG46IDQgYml0cyBzdGFydGluZyBhdCAoNCpuKQotICoJCTAwMDAgPSBpbnB1dCwgMDAwMSA9IG91dHB1dCwgb3RoZXJzIG1lYW4gc3BlY2lhbC1mdW5jdGlvbgotICogYmFzZSArIDB4MDg6IERhdGEgcmVnaXN0ZXIsIDEgYml0IHBlciBncGlvCi0gKgkJYml0IG46IGRhdGEgYml0IG4KLSAqCi0gKiBUbyBhbGxvdyB1cyB0byB1c2UgdGhlIHMzY19ncGlvbGliX2dldCBhbmQgczNjX2dwaW9saWJfc2V0IHJvdXRpbmVzIHdlCi0gKiBzdG9yZSB0aGUgJ2Jhc2UgKyAweDQnIGFkZHJlc3Mgc28gdGhhdCB0aGVzZSByb3V0aW5lcyBzZWUgdGhlIGRhdGEKLSAqIHJlZ2lzdGVyIGF0IG91cmNoaXAtPmJhc2UgKyAweDA0LgotICovCi0KLXN0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvbGliXzRiaXQyX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOwotCXZvaWQgX19pb21lbSAqcmVnY29uID0gYmFzZTsKLQl1bnNpZ25lZCBsb25nIGNvbjsKLQotCWlmIChvZmZzZXQgPiA3KQotCQlvZmZzZXQgLT0gODsKLQllbHNlCi0JCXJlZ2NvbiAtPSA0OwotCi0JY29uID0gX19yYXdfcmVhZGwocmVnY29uKTsKLQljb24gJj0gfigweGYgPDwgY29uXzRiaXRfc2hpZnQob2Zmc2V0KSk7Ci0JX19yYXdfd3JpdGVsKGNvbiwgcmVnY29uKTsKLQotCWdwaW9fZGJnKCIlczogJXA6IENPTiAlMDhseFxuIiwgX19mdW5jX18sIGJhc2UsIGNvbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYW1zdW5nX2dwaW9saWJfNGJpdDJfb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJCXVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19ncGlvKGNoaXApOwotCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7Ci0Jdm9pZCBfX2lvbWVtICpyZWdjb24gPSBiYXNlOwotCXVuc2lnbmVkIGxvbmcgY29uOwotCXVuc2lnbmVkIGxvbmcgZGF0OwotCXVuc2lnbmVkIGNvbl9vZmZzZXQgPSBvZmZzZXQ7Ci0KLQlpZiAoY29uX29mZnNldCA+IDcpCi0JCWNvbl9vZmZzZXQgLT0gODsKLQllbHNlCi0JCXJlZ2NvbiAtPSA0OwotCi0JY29uID0gX19yYXdfcmVhZGwocmVnY29uKTsKLQljb24gJj0gfigweGYgPDwgY29uXzRiaXRfc2hpZnQoY29uX29mZnNldCkpOwotCWNvbiB8PSAweDEgPDwgY29uXzRiaXRfc2hpZnQoY29uX29mZnNldCk7Ci0KLQlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgR1BJT0RBVF9PRkYpOwotCi0JaWYgKHZhbHVlKQotCQlkYXQgfD0gMSA8PCBvZmZzZXQ7Ci0JZWxzZQotCQlkYXQgJj0gfigxIDw8IG9mZnNldCk7Ci0KLQlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgR1BJT0RBVF9PRkYpOwotCV9fcmF3X3dyaXRlbChjb24sIHJlZ2Nvbik7Ci0JX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIEdQSU9EQVRfT0ZGKTsKLQotCWdwaW9fZGJnKCIlczogJXA6IENPTiAlMDhseCwgREFUICUwOGx4XG4iLCBfX2Z1bmNfXywgYmFzZSwgY29uLCBkYXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgX19pbml0IHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkKLXsKLQljaGlwLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl80Yml0X2lucHV0OwotCWNoaXAtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl80Yml0X291dHB1dDsKLQljaGlwLT5wbSA9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fNGJpdCk7Ci19Ci0KLXZvaWQgX19pbml0IHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdDIoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApCi17Ci0JY2hpcC0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBzYW1zdW5nX2dwaW9saWJfNGJpdDJfaW5wdXQ7Ci0JY2hpcC0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gc2Ftc3VuZ19ncGlvbGliXzRiaXQyX291dHB1dDsKLQljaGlwLT5wbSA9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fNGJpdCk7Ci19Ci0KLXZvaWQgX19pbml0IHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJICAgaW50IG5yX2NoaXBzKQotewotCWZvciAoOyBucl9jaGlwcyA+IDA7IG5yX2NoaXBzLS0sIGNoaXArKykgewotCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQoY2hpcCk7Ci0JCXMzY19ncGlvbGliX2FkZChjaGlwKTsKLQl9Ci19Ci0KLXZvaWQgX19pbml0IHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdDJfY2hpcHMoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCSAgICBpbnQgbnJfY2hpcHMpCi17Ci0JZm9yICg7IG5yX2NoaXBzID4gMDsgbnJfY2hpcHMtLSwgY2hpcCsrKSB7Ci0JCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdDIoY2hpcCk7Ci0JCXMzY19ncGlvbGliX2FkZChjaGlwKTsKLQl9Ci19Ci0KLXZvaWQgX19pbml0IHNhbXN1bmdfZ3Bpb2xpYl9hZGRfMmJpdF9jaGlwcyhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJICAgaW50IG5yX2NoaXBzKQotewotCWZvciAoOyBucl9jaGlwcyA+IDA7IG5yX2NoaXBzLS0sIGNoaXArKykKLQkJczNjX2dwaW9saWJfYWRkKGNoaXApOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tcHhhLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1weGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTEzNzcxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXB4YS5jCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtcHhhL2dwaW8uYworICoKKyAqICBHZW5lcmljIFBYQSBHUElPIGhhbmRsaW5nCisgKgorICogIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogIENyZWF0ZWQ6CUp1biAxNSwgMjAwMQorICogIENvcHlyaWdodDoJTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPG1hY2gvZ3Bpby1weGEuaD4KKworaW50IHB4YV9sYXN0X2dwaW87CisKK3N0cnVjdCBweGFfZ3Bpb19jaGlwIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJdm9pZCBfX2lvbWVtCSpyZWdiYXNlOworCWNoYXIgbGFiZWxbMTBdOworCisJdW5zaWduZWQgbG9uZwlpcnFfbWFzazsKKwl1bnNpZ25lZCBsb25nCWlycV9lZGdlX3Jpc2U7CisJdW5zaWduZWQgbG9uZwlpcnFfZWRnZV9mYWxsOworCisjaWZkZWYgQ09ORklHX1BNCisJdW5zaWduZWQgbG9uZwlzYXZlZF9ncGxyOworCXVuc2lnbmVkIGxvbmcJc2F2ZWRfZ3BkcjsKKwl1bnNpZ25lZCBsb25nCXNhdmVkX2dyZXI7CisJdW5zaWduZWQgbG9uZwlzYXZlZF9nZmVyOworI2VuZGlmCit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdwaW9fbG9jayk7CitzdGF0aWMgc3RydWN0IHB4YV9ncGlvX2NoaXAgKnB4YV9ncGlvX2NoaXBzOworCisjZGVmaW5lIGZvcl9lYWNoX2dwaW9fY2hpcChpLCBjKQkJCVwKKwlmb3IgKGkgPSAwLCBjID0gJnB4YV9ncGlvX2NoaXBzWzBdOyBpIDw9IHB4YV9sYXN0X2dwaW87IGkgKz0gMzIsIGMrKykKKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmdwaW9fY2hpcF9iYXNlKHN0cnVjdCBncGlvX2NoaXAgKmMpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjLCBzdHJ1Y3QgcHhhX2dwaW9fY2hpcCwgY2hpcCktPnJlZ2Jhc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHB4YV9ncGlvX2NoaXAgKmdwaW9fdG9fcHhhY2hpcCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiAmcHhhX2dwaW9fY2hpcHNbZ3Bpb190b19iYW5rKGdwaW8pXTsKK30KKworc3RhdGljIGludCBweGFfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IGdwaW9fY2hpcF9iYXNlKGNoaXApOworCXVpbnQzMl90IHZhbHVlLCBtYXNrID0gMSA8PCBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCXZhbHVlID0gX19yYXdfcmVhZGwoYmFzZSArIEdQRFJfT0ZGU0VUKTsKKwlpZiAoX19ncGlvX2lzX2ludmVydGVkKGNoaXAtPmJhc2UgKyBvZmZzZXQpKQorCQl2YWx1ZSB8PSBtYXNrOworCWVsc2UKKwkJdmFsdWUgJj0gfm1hc2s7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBiYXNlICsgR1BEUl9PRkZTRVQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gZ3Bpb19jaGlwX2Jhc2UoY2hpcCk7CisJdWludDMyX3QgdG1wLCBtYXNrID0gMSA8PCBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCV9fcmF3X3dyaXRlbChtYXNrLCBiYXNlICsgKHZhbHVlID8gR1BTUl9PRkZTRVQgOiBHUENSX09GRlNFVCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJdG1wID0gX19yYXdfcmVhZGwoYmFzZSArIEdQRFJfT0ZGU0VUKTsKKwlpZiAoX19ncGlvX2lzX2ludmVydGVkKGNoaXAtPmJhc2UgKyBvZmZzZXQpKQorCQl0bXAgJj0gfm1hc2s7CisJZWxzZQorCQl0bXAgfD0gbWFzazsKKwlfX3Jhd193cml0ZWwodG1wLCBiYXNlICsgR1BEUl9PRkZTRVQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoZ3Bpb19jaGlwX2Jhc2UoY2hpcCkgKyBHUExSX09GRlNFVCkgJiAoMSA8PCBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBweGFfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJX19yYXdfd3JpdGVsKDEgPDwgb2Zmc2V0LCBncGlvX2NoaXBfYmFzZShjaGlwKSArCisJCQkJKHZhbHVlID8gR1BTUl9PRkZTRVQgOiBHUENSX09GRlNFVCkpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBweGFfaW5pdF9ncGlvX2NoaXAoaW50IGdwaW9fZW5kKQoreworCWludCBpLCBncGlvLCBuYmFua3MgPSBncGlvX3RvX2JhbmsoZ3Bpb19lbmQpICsgMTsKKwlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqY2hpcHM7CisKKwljaGlwcyA9IGt6YWxsb2MobmJhbmtzICogc2l6ZW9mKHN0cnVjdCBweGFfZ3Bpb19jaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXBzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIEdQSU8gY2hpcHNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMCwgZ3BpbyA9IDA7IGkgPCBuYmFua3M7IGkrKywgZ3BpbyArPSAzMikgeworCQlzdHJ1Y3QgZ3Bpb19jaGlwICpjID0gJmNoaXBzW2ldLmNoaXA7CisKKwkJc3ByaW50ZihjaGlwc1tpXS5sYWJlbCwgImdwaW8tJWQiLCBpKTsKKwkJY2hpcHNbaV0ucmVnYmFzZSA9IEdQSU9fQkFOSyhpKTsKKworCQljLT5iYXNlICA9IGdwaW87CisJCWMtPmxhYmVsID0gY2hpcHNbaV0ubGFiZWw7CisKKwkJYy0+ZGlyZWN0aW9uX2lucHV0ICA9IHB4YV9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwkJYy0+ZGlyZWN0aW9uX291dHB1dCA9IHB4YV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJCWMtPmdldCA9IHB4YV9ncGlvX2dldDsKKwkJYy0+c2V0ID0gcHhhX2dwaW9fc2V0OworCisJCS8qIG51bWJlciBvZiBHUElPcyBvbiBsYXN0IGJhbmsgbWF5IGJlIGxlc3MgdGhhbiAzMiAqLworCQljLT5uZ3BpbyA9IChncGlvICsgMzEgPiBncGlvX2VuZCkgPyAoZ3Bpb19lbmQgLSBncGlvICsgMSkgOiAzMjsKKwkJZ3Bpb2NoaXBfYWRkKGMpOworCX0KKwlweGFfZ3Bpb19jaGlwcyA9IGNoaXBzOworCXJldHVybiAwOworfQorCisvKiBVcGRhdGUgb25seSB0aG9zZSBHUkVSeCBhbmQgR0ZFUnggZWRnZSBkZXRlY3Rpb24gcmVnaXN0ZXIgYml0cyBpZiB0aG9zZQorICogYml0cyBhcmUgc2V0IGluIGMtPmlycV9tYXNrCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfZWRnZV9kZXRlY3Qoc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMpCit7CisJdWludDMyX3QgZ3JlciwgZ2ZlcjsKKworCWdyZXIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpICYgfmMtPmlycV9tYXNrOworCWdmZXIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR0ZFUl9PRkZTRVQpICYgfmMtPmlycV9tYXNrOworCWdyZXIgfD0gYy0+aXJxX2VkZ2VfcmlzZSAmIGMtPmlycV9tYXNrOworCWdmZXIgfD0gYy0+aXJxX2VkZ2VfZmFsbCAmIGMtPmlycV9tYXNrOworCV9fcmF3X3dyaXRlbChncmVyLCBjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpOworCV9fcmF3X3dyaXRlbChnZmVyLCBjLT5yZWdiYXNlICsgR0ZFUl9PRkZTRVQpOworfQorCitzdGF0aWMgaW50IHB4YV9ncGlvX2lycV90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmM7CisJaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOworCXVuc2lnbmVkIGxvbmcgZ3BkciwgbWFzayA9IEdQSU9fYml0KGdwaW8pOworCisJYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKKworCWlmICh0eXBlID09IElSUV9UWVBFX1BST0JFKSB7CisJCS8qIERvbid0IG1lc3Mgd2l0aCBlbmFibGVkIEdQSU9zIHVzaW5nIHByZWNvbmZpZ3VyZWQgZWRnZXMgb3IKKwkJICogR1BJT3Mgc2V0IHRvIGFsdGVybmF0ZSBmdW5jdGlvbiBvciB0byBvdXRwdXQgZHVyaW5nIHByb2JlCisJCSAqLworCQlpZiAoKGMtPmlycV9lZGdlX3Jpc2UgfCBjLT5pcnFfZWRnZV9mYWxsKSAmIEdQSU9fYml0KGdwaW8pKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKF9fZ3Bpb19pc19vY2N1cGllZChncGlvKSkKKwkJCXJldHVybiAwOworCisJCXR5cGUgPSBJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORzsKKwl9CisKKwlncGRyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdQRFJfT0ZGU0VUKTsKKworCWlmIChfX2dwaW9faXNfaW52ZXJ0ZWQoZ3BpbykpCisJCV9fcmF3X3dyaXRlbChncGRyIHwgbWFzaywgIGMtPnJlZ2Jhc2UgKyBHUERSX09GRlNFVCk7CisJZWxzZQorCQlfX3Jhd193cml0ZWwoZ3BkciAmIH5tYXNrLCBjLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQpOworCisJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKKwkJYy0+aXJxX2VkZ2VfcmlzZSB8PSBtYXNrOworCWVsc2UKKwkJYy0+aXJxX2VkZ2VfcmlzZSAmPSB+bWFzazsKKworCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKQorCQljLT5pcnFfZWRnZV9mYWxsIHw9IG1hc2s7CisJZWxzZQorCQljLT5pcnFfZWRnZV9mYWxsICY9IH5tYXNrOworCisJdXBkYXRlX2VkZ2VfZGV0ZWN0KGMpOworCisJcHJfZGVidWcoIiVzOiBJUlElZCAoR1BJTyVkKSAtIGVkZ2UlcyVzXG4iLCBfX2Z1bmNfXywgZC0+aXJxLCBncGlvLAorCQkoKHR5cGUgJiBJUlFfVFlQRV9FREdFX1JJU0lORykgID8gIiByaXNpbmciICA6ICIiKSwKKwkJKCh0eXBlICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSA/ICIgZmFsbGluZyIgOiAiIikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGFfZ3Bpb19kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYzsKKwlpbnQgbG9vcCwgZ3BpbywgZ3Bpb19iYXNlLCBuOworCXVuc2lnbmVkIGxvbmcgZ2VkcjsKKworCWRvIHsKKwkJbG9vcCA9IDA7CisJCWZvcl9lYWNoX2dwaW9fY2hpcChncGlvLCBjKSB7CisJCQlncGlvX2Jhc2UgPSBjLT5jaGlwLmJhc2U7CisKKwkJCWdlZHIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOworCQkJZ2VkciA9IGdlZHIgJiBjLT5pcnFfbWFzazsKKwkJCV9fcmF3X3dyaXRlbChnZWRyLCBjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOworCisJCQluID0gZmluZF9maXJzdF9iaXQoJmdlZHIsIEJJVFNfUEVSX0xPTkcpOworCQkJd2hpbGUgKG4gPCBCSVRTX1BFUl9MT05HKSB7CisJCQkJbG9vcCA9IDE7CisKKwkJCQlnZW5lcmljX2hhbmRsZV9pcnEoZ3Bpb190b19pcnEoZ3Bpb19iYXNlICsgbikpOworCQkJCW4gPSBmaW5kX25leHRfYml0KCZnZWRyLCBCSVRTX1BFUl9MT05HLCBuICsgMSk7CisJCQl9CisJCX0KKwl9IHdoaWxlIChsb29wKTsKK30KKworc3RhdGljIHZvaWQgcHhhX2Fja19tdXhlZF9ncGlvKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7CisJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX3B4YWNoaXAoZ3Bpbyk7CisKKwlfX3Jhd193cml0ZWwoR1BJT19iaXQoZ3BpbyksIGMtPnJlZ2Jhc2UgKyBHRURSX09GRlNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIHB4YV9tYXNrX211eGVkX2dwaW8oc3RydWN0IGlycV9kYXRhICpkKQoreworCWludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKKwlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKKwl1aW50MzJfdCBncmVyLCBnZmVyOworCisJYy0+aXJxX21hc2sgJj0gfkdQSU9fYml0KGdwaW8pOworCisJZ3JlciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCkgJiB+R1BJT19iaXQoZ3Bpbyk7CisJZ2ZlciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCkgJiB+R1BJT19iaXQoZ3Bpbyk7CisJX19yYXdfd3JpdGVsKGdyZXIsIGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCk7CisJX19yYXdfd3JpdGVsKGdmZXIsIGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIHB4YV91bm1hc2tfbXV4ZWRfZ3BpbyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOworCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19weGFjaGlwKGdwaW8pOworCisJYy0+aXJxX21hc2sgfD0gR1BJT19iaXQoZ3Bpbyk7CisJdXBkYXRlX2VkZ2VfZGV0ZWN0KGMpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHB4YV9tdXhlZF9ncGlvX2NoaXAgPSB7CisJLm5hbWUJCT0gIkdQSU8iLAorCS5pcnFfYWNrCT0gcHhhX2Fja19tdXhlZF9ncGlvLAorCS5pcnFfbWFzawk9IHB4YV9tYXNrX211eGVkX2dwaW8sCisJLmlycV91bm1hc2sJPSBweGFfdW5tYXNrX211eGVkX2dwaW8sCisJLmlycV9zZXRfdHlwZQk9IHB4YV9ncGlvX2lycV90eXBlLAorfTsKKwordm9pZCBfX2luaXQgcHhhX2luaXRfZ3BpbyhpbnQgbXV4X2lycSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBzZXRfd2FrZV90IGZuKQoreworCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjOworCWludCBncGlvLCBpcnE7CisKKwlweGFfbGFzdF9ncGlvID0gZW5kOworCisJLyogSW5pdGlhbGl6ZSBHUElPIGNoaXBzICovCisJcHhhX2luaXRfZ3Bpb19jaGlwKGVuZCk7CisKKwkvKiBjbGVhciBhbGwgR1BJTyBlZGdlIGRldGVjdHMgKi8KKwlmb3JfZWFjaF9ncGlvX2NoaXAoZ3BpbywgYykgeworCQlfX3Jhd193cml0ZWwoMCwgYy0+cmVnYmFzZSArIEdGRVJfT0ZGU0VUKTsKKwkJX19yYXdfd3JpdGVsKDAsIGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCk7CisJCV9fcmF3X3dyaXRlbCh+MCxjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOworCX0KKworCWZvciAoaXJxICA9IGdwaW9fdG9faXJxKHN0YXJ0KTsgaXJxIDw9IGdwaW9fdG9faXJxKGVuZCk7IGlycSsrKSB7CisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZweGFfbXV4ZWRfZ3Bpb19jaGlwLAorCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwl9CisKKwkvKiBJbnN0YWxsIGhhbmRsZXIgZm9yIEdQSU8+PTIgZWRnZSBkZXRlY3QgaW50ZXJydXB0cyAqLworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKG11eF9pcnEsIHB4YV9ncGlvX2RlbXV4X2hhbmRsZXIpOworCXB4YV9tdXhlZF9ncGlvX2NoaXAuaXJxX3NldF93YWtlID0gZm47Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcHhhX2dwaW9fc3VzcGVuZCh2b2lkKQoreworCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjOworCWludCBncGlvOworCisJZm9yX2VhY2hfZ3Bpb19jaGlwKGdwaW8sIGMpIHsKKwkJYy0+c2F2ZWRfZ3BsciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHUExSX09GRlNFVCk7CisJCWMtPnNhdmVkX2dwZHIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQpOworCQljLT5zYXZlZF9ncmVyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdSRVJfT0ZGU0VUKTsKKwkJYy0+c2F2ZWRfZ2ZlciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCk7CisKKwkJLyogQ2xlYXIgR1BJTyB0cmFuc2l0aW9uIGRldGVjdCBiaXRzICovCisJCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHhhX2dwaW9fcmVzdW1lKHZvaWQpCit7CisJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmM7CisJaW50IGdwaW87CisKKwlmb3JfZWFjaF9ncGlvX2NoaXAoZ3BpbywgYykgeworCQkvKiByZXN0b3JlIGxldmVsIHdpdGggc2V0L2NsZWFyICovCisJCV9fcmF3X3dyaXRlbCggYy0+c2F2ZWRfZ3BsciwgYy0+cmVnYmFzZSArIEdQU1JfT0ZGU0VUKTsKKwkJX19yYXdfd3JpdGVsKH5jLT5zYXZlZF9ncGxyLCBjLT5yZWdiYXNlICsgR1BDUl9PRkZTRVQpOworCisJCV9fcmF3X3dyaXRlbChjLT5zYXZlZF9ncmVyLCBjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpOworCQlfX3Jhd193cml0ZWwoYy0+c2F2ZWRfZ2ZlciwgYy0+cmVnYmFzZSArIEdGRVJfT0ZGU0VUKTsKKwkJX19yYXdfd3JpdGVsKGMtPnNhdmVkX2dwZHIsIGMtPnJlZ2Jhc2UgKyBHUERSX09GRlNFVCk7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgcHhhX2dwaW9fc3VzcGVuZAlOVUxMCisjZGVmaW5lIHB4YV9ncGlvX3Jlc3VtZQkJTlVMTAorI2VuZGlmCisKK3N0cnVjdCBzeXNjb3JlX29wcyBweGFfZ3Bpb19zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZAk9IHB4YV9ncGlvX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBweGFfZ3Bpb19yZXN1bWUsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tczVwYzEwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tczVwYzEwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjg3YjBjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXM1cGMxMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogUzVQQzEwMCAtIEdQSU9saWIgc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDbwotICogIEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaD4KLQotLyogUzVQQzEwMCBHUElPIGJhbmsgc3VtbWFyeToKLSAqCi0gKiBCYW5rCUdQSU9zCVN0eWxlCUlOVCBUeXBlCi0gKiBBMAk4CTRCaXQJR1BJT19JTlQwCi0gKiBBMQk1CTRCaXQJR1BJT19JTlQxCi0gKiBCCTgJNEJpdAlHUElPX0lOVDIKLSAqIEMJNQk0Qml0CUdQSU9fSU5UMwotICogRAk3CTRCaXQJR1BJT19JTlQ0Ci0gKiBFMAk4CTRCaXQJR1BJT19JTlQ1Ci0gKiBFMQk2CTRCaXQJR1BJT19JTlQ2Ci0gKiBGMAk4CTRCaXQJR1BJT19JTlQ3Ci0gKiBGMQk4CTRCaXQJR1BJT19JTlQ4Ci0gKiBGMgk4CTRCaXQJR1BJT19JTlQ5Ci0gKiBGMwk0CTRCaXQJR1BJT19JTlQxMAotICogRzAJOAk0Qml0CUdQSU9fSU5UMTEKLSAqIEcxCTMJNEJpdAlHUElPX0lOVDEyCi0gKiBHMgk3CTRCaXQJR1BJT19JTlQxMwotICogRzMJNwk0Qml0CUdQSU9fSU5UMTQKLSAqIEgwCTgJNEJpdAlXS1VQX0lOVAotICogSDEJOAk0Qml0CVdLVVBfSU5UCi0gKiBIMgk4CTRCaXQJV0tVUF9JTlQKLSAqIEgzCTgJNEJpdAlXS1VQX0lOVAotICogSQk4CTRCaXQJR1BJT19JTlQxNQotICogSjAJOAk0Qml0CUdQSU9fSU5UMTYKLSAqIEoxCTUJNEJpdAlHUElPX0lOVDE3Ci0gKiBKMgk4CTRCaXQJR1BJT19JTlQxOAotICogSjMJOAk0Qml0CUdQSU9fSU5UMTkKLSAqIEo0CTQJNEJpdAlHUElPX0lOVDIwCi0gKiBLMAk4CTRCaXQJTm9uZQotICogSzEJNgk0Qml0CU5vbmUKLSAqIEsyCTgJNEJpdAlOb25lCi0gKiBLMwk4CTRCaXQJTm9uZQotICogTDAJOAk0Qml0CU5vbmUKLSAqIEwxCTgJNEJpdAlOb25lCi0gKiBMMgk4CTRCaXQJTm9uZQotICogTDMJOAk0Qml0CU5vbmUKLSAqLwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvX2NmZyA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvX2NmZ19laW50ID0gewotCS5jZmdfZWludAk9IDB4ZiwKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvX2NmZ19ub2ludCA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCi19OwotCi0vKgotICogR1BJTyBiYW5rJ3MgYmFzZSBhZGRyZXNzIGdpdmVuIHRoZSBpbmRleCBvZiB0aGUgYmFuayBpbiB0aGUKLSAqIGxpc3Qgb2YgYWxsIGdwaW8gYmFua3MuCi0gKi8KLSNkZWZpbmUgUzVQQzEwMF9CQU5LX0JBU0UoYmFua19ucikJKFM1UF9WQV9HUElPICsgKChiYW5rX25yKSAqIDB4MjApKQotCi0vKgotICogRm9sbG93aW5nIGFyZSB0aGUgZ3BpbyBiYW5rcyBpbiBTNVBDMTAwLgotICoKLSAqIFRoZSAnY29uZmlnJyBtZW1iZXIgd2hlbiBsZWZ0IHRvIE5VTEwsIGlzIGluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0Ci0gKiBzdHJ1Y3R1cmUgZ3Bpb19jZmcgaW4gdGhlIGluaXQgZnVuY3Rpb24gYmVsb3cuCi0gKgotICogVGhlICdiYXNlJyBtZW1iZXIgaXMgYWxzbyBpbml0aWFsaXplZCBpbiB0aGUgaW5pdCBmdW5jdGlvbiBiZWxvdy4KLSAqIE5vdGU6IFRoZSBpbml0aWFsaXphdGlvbiBvZiAnYmFzZScgbWVtYmVyIG9mIHMzY19ncGlvX2NoaXAgc3RydWN0dXJlCi0gKiB1c2VzIHRoZSBhYm92ZSBtYWNybyBhbmQgZGVwZW5kcyBvbiB0aGUgYmFua3MgYmVpbmcgbGlzdGVkIGluIG9yZGVyIGhlcmUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2hpcCBzNXBjMTAwX2dwaW9fY2hpcHNbXSA9IHsKLQl7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQQTAoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fQTBfTlIsCi0JCQkubGFiZWwJPSAiR1BBMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEExKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0ExX05SLAotCQkJLmxhYmVsCT0gIkdQQTEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BCKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0JfTlIsCi0JCQkubGFiZWwJPSAiR1BCIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQQygwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19DX05SLAotCQkJLmxhYmVsCT0gIkdQQyIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEQoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRF9OUiwKLQkJCS5sYWJlbAk9ICJHUEQiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BFMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19FMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEUwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQRTEoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRTFfTlIsCi0JCQkubGFiZWwJPSAiR1BFMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEYwKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0YwX05SLAotCQkJLmxhYmVsCT0gIkdQRjAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BGMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19GMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEYxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQRjIoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRjJfTlIsCi0JCQkubGFiZWwJPSAiR1BGMiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEYzKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0YzX05SLAotCQkJLmxhYmVsCT0gIkdQRjMiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BHMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19HMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEcwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQRzEoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRzFfTlIsCi0JCQkubGFiZWwJPSAiR1BHMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEcyKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0cyX05SLAotCQkJLmxhYmVsCT0gIkdQRzIiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BHMygwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19HM19OUiwKLQkJCS5sYWJlbAk9ICJHUEczIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQSSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19JX05SLAotCQkJLmxhYmVsCT0gIkdQSSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEowKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0owX05SLAotCQkJLmxhYmVsCT0gIkdQSjAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BKMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19KMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEoxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQSjIoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSjJfTlIsCi0JCQkubGFiZWwJPSAiR1BKMiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEozKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0ozX05SLAotCQkJLmxhYmVsCT0gIkdQSjMiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BKNCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19KNF9OUiwKLQkJCS5sYWJlbAk9ICJHUEo0IiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQSzAoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSzBfTlIsCi0JCQkubGFiZWwJPSAiR1BLMCIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEsxKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0sxX05SLAotCQkJLmxhYmVsCT0gIkdQSzEiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BLMigwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19LMl9OUiwKLQkJCS5sYWJlbAk9ICJHUEsyIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQSzMoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSzNfTlIsCi0JCQkubGFiZWwJPSAiR1BLMyIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEwwKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0wwX05SLAotCQkJLmxhYmVsCT0gIkdQTDAiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BMMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19MMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEwxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQTDIoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fTDJfTlIsCi0JCQkubGFiZWwJPSAiR1BMMiIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEwzKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0wzX05SLAotCQkJLmxhYmVsCT0gIkdQTDMiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BMNCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19MNF9OUiwKLQkJCS5sYWJlbAk9ICJHUEw0IiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDMDApLAotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX2VpbnQsCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UKDApLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEgwKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0gwX05SLAotCQkJLmxhYmVsCT0gIkdQSDAiLAotCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzIwKSwKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19laW50LAotCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCg4KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BIMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19IMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEgxIiwKLQkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEM0MCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfZWludCwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoMTYpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEgyKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0gyX05SLAotCQkJLmxhYmVsCT0gIkdQSDIiLAotCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzYwKSwKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19laW50LAotCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgyNCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQSDMoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSDNfTlIsCi0JCQkubGFiZWwJPSAiR1BIMyIsCi0JCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIF9faW5pdCBpbnQgczVwYzEwMF9ncGlvbGliX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IHM1cGMxMDBfZ3Bpb19jaGlwczsKLQlpbnQgbnJfY2hpcHMgPSBBUlJBWV9TSVpFKHM1cGMxMDBfZ3Bpb19jaGlwcyk7Ci0JaW50IGdwaW9pbnRfZ3JvdXAgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yX2NoaXBzOyBpKyssIGNoaXArKykgewotCQlpZiAoY2hpcC0+Y29uZmlnID09IE5VTEwpIHsKLQkJCWNoaXAtPmNvbmZpZyA9ICZncGlvX2NmZzsKLQkJCWNoaXAtPmdyb3VwID0gZ3Bpb2ludF9ncm91cCsrOwotCQl9Ci0JCWlmIChjaGlwLT5iYXNlID09IE5VTEwpCi0JCQljaGlwLT5iYXNlID0gUzVQQzEwMF9CQU5LX0JBU0UoaSk7Ci0JfQotCi0Jc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKHM1cGMxMDBfZ3Bpb19jaGlwcywgbnJfY2hpcHMpOwotCXM1cF9yZWdpc3Rlcl9ncGlvaW50X2JhbmsoSVJRX0dQSU9JTlQsIDAsIFM1UF9HUElPSU5UX0dST1VQX01BWE5SKTsKLQotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChzNXBjMTAwX2dwaW9saWJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zNXB2MjEwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zNXB2MjEwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTJmMTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tczVwdjIxMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qCi0gKiBTNVBWMjEwIC0gR1BJT2xpYiBzdXBwb3J0Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvX2NmZyA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvX2NmZ19ub2ludCA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCi19OwotCi0vKiBHUElPIGJhbmsncyBiYXNlIGFkZHJlc3MgZ2l2ZW4gdGhlIGluZGV4IG9mIHRoZSBiYW5rIGluIHRoZQotICogbGlzdCBvZiBhbGwgZ3BpbyBiYW5rcy4KLSAqLwotI2RlZmluZSBTNVBWMjEwX0JBTktfQkFTRShiYW5rX25yKQkoUzVQX1ZBX0dQSU8gKyAoKGJhbmtfbnIpICogMHgyMCkpCi0KLS8qCi0gKiBGb2xsb3dpbmcgYXJlIHRoZSBncGlvIGJhbmtzIGluIHYyMTAuCi0gKgotICogVGhlICdjb25maWcnIG1lbWJlciB3aGVuIGxlZnQgdG8gTlVMTCwgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQKLSAqIHN0cnVjdHVyZSBncGlvX2NmZyBpbiB0aGUgaW5pdCBmdW5jdGlvbiBiZWxvdy4KLSAqCi0gKiBUaGUgJ2Jhc2UnIG1lbWJlciBpcyBhbHNvIGluaXRpYWxpemVkIGluIHRoZSBpbml0IGZ1bmN0aW9uIGJlbG93LgotICogTm90ZTogVGhlIGluaXRpYWxpemF0aW9uIG9mICdiYXNlJyBtZW1iZXIgb2YgczNjX2dwaW9fY2hpcCBzdHJ1Y3R1cmUKLSAqIHVzZXMgdGhlIGFib3ZlIG1hY3JvIGFuZCBkZXBlbmRzIG9uIHRoZSBiYW5rcyBiZWluZyBsaXN0ZWQgaW4gb3JkZXIgaGVyZS4KLSAqLwotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jaGlwIHM1cHYyMTBfZ3Bpb180Yml0W10gPSB7Ci0JewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEEwKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0EwX05SLAotCQkJLmxhYmVsCT0gIkdQQTAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BBMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19BMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEExIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQQigwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19CX05SLAotCQkJLmxhYmVsCT0gIkdQQiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEMwKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0MwX05SLAotCQkJLmxhYmVsCT0gIkdQQzAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BDMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19DMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEMxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQRDAoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRDBfTlIsCi0JCQkubGFiZWwJPSAiR1BEMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEQxKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0QxX05SLAotCQkJLmxhYmVsCT0gIkdQRDEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BFMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19FMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEUwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQRTEoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRTFfTlIsCi0JCQkubGFiZWwJPSAiR1BFMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEYwKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0YwX05SLAotCQkJLmxhYmVsCT0gIkdQRjAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BGMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19GMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEYxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQRjIoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRjJfTlIsCi0JCQkubGFiZWwJPSAiR1BGMiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEYzKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0YzX05SLAotCQkJLmxhYmVsCT0gIkdQRjMiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BHMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19HMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEcwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQRzEoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRzFfTlIsCi0JCQkubGFiZWwJPSAiR1BHMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEcyKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0cyX05SLAotCQkJLmxhYmVsCT0gIkdQRzIiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BHMygwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19HM19OUiwKLQkJCS5sYWJlbAk9ICJHUEczIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQSSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19JX05SLAotCQkJLmxhYmVsCT0gIkdQSSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEowKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0owX05SLAotCQkJLmxhYmVsCT0gIkdQSjAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BKMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19KMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEoxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQSjIoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSjJfTlIsCi0JCQkubGFiZWwJPSAiR1BKMiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEozKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0ozX05SLAotCQkJLmxhYmVsCT0gIkdQSjMiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BKNCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19KNF9OUiwKLQkJCS5sYWJlbAk9ICJHUEo0IiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX01QMDEoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwMV9OUiwKLQkJCS5sYWJlbAk9ICJNUDAxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX01QMDIoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwMl9OUiwKLQkJCS5sYWJlbAk9ICJNUDAyIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX01QMDMoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwM19OUiwKLQkJCS5sYWJlbAk9ICJNUDAzIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX01QMDQoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwNF9OUiwKLQkJCS5sYWJlbAk9ICJNUDA0IiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX01QMDUoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwNV9OUiwKLQkJCS5sYWJlbAk9ICJNUDA1IiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDMDApLAotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgwKSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BIMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19IMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEgwIiwKLQkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEMyMCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UKDgpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEgxKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0gxX05SLAotCQkJLmxhYmVsCT0gIkdQSDEiLAotCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzQwKSwKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoMTYpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEgyKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0gyX05SLAotCQkJLmxhYmVsCT0gIkdQSDIiLAotCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzYwKSwKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoMjQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEgzKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0gzX05SLAotCQkJLmxhYmVsCT0gIkdQSDMiLAotCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBfX2luaXQgaW50IHM1cHYyMTBfZ3Bpb2xpYl9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAgPSBzNXB2MjEwX2dwaW9fNGJpdDsKLQlpbnQgbnJfY2hpcHMgPSBBUlJBWV9TSVpFKHM1cHYyMTBfZ3Bpb180Yml0KTsKLQlpbnQgZ3Bpb2ludF9ncm91cCA9IDA7Ci0JaW50IGkgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IG5yX2NoaXBzOyBpKyssIGNoaXArKykgewotCQlpZiAoY2hpcC0+Y29uZmlnID09IE5VTEwpIHsKLQkJCWNoaXAtPmNvbmZpZyA9ICZncGlvX2NmZzsKLQkJCWNoaXAtPmdyb3VwID0gZ3Bpb2ludF9ncm91cCsrOwotCQl9Ci0JCWlmIChjaGlwLT5iYXNlID09IE5VTEwpCi0JCQljaGlwLT5iYXNlID0gUzVQVjIxMF9CQU5LX0JBU0UoaSk7Ci0JfQotCi0Jc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKHM1cHYyMTBfZ3Bpb180Yml0LCBucl9jaGlwcyk7Ci0JczVwX3JlZ2lzdGVyX2dwaW9pbnRfYmFuayhJUlFfR1BJT0lOVCwgMCwgUzVQX0dQSU9JTlRfR1JPVVBfTUFYTlIpOwotCi0JcmV0dXJuIDA7Ci19Ci1jb3JlX2luaXRjYWxsKHM1cHYyMTBfZ3Bpb2xpYl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tc2ExMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjMWY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLXNhMTEwMC9ncGlvLmMKKyAqCisgKiBHZW5lcmljIFNBLTExMDAgR1BJTyBoYW5kbGluZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCitzdGF0aWMgaW50IHNhMTEwMF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIEdQTFIgJiBHUElPX0dQSU8ob2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgc2ExMTAwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCWlmICh2YWx1ZSkKKwkJR1BTUiA9IEdQSU9fR1BJTyhvZmZzZXQpOworCWVsc2UKKwkJR1BDUiA9IEdQSU9fR1BJTyhvZmZzZXQpOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJR1BEUiAmPSB+R1BJT19HUElPKG9mZnNldCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc2ExMTAwX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOworCUdQRFIgfD0gR1BJT19HUElPKG9mZnNldCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBzYTExMDBfZ3Bpb19jaGlwID0geworCS5sYWJlbAkJCT0gImdwaW8iLAorCS5kaXJlY3Rpb25faW5wdXQJPSBzYTExMDBfZGlyZWN0aW9uX2lucHV0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gc2ExMTAwX2RpcmVjdGlvbl9vdXRwdXQsCisJLnNldAkJCT0gc2ExMTAwX2dwaW9fc2V0LAorCS5nZXQJCQk9IHNhMTEwMF9ncGlvX2dldCwKKwkuYmFzZQkJCT0gMCwKKwkubmdwaW8JCQk9IEdQSU9fTUFYICsgMSwKK307CisKK3ZvaWQgX19pbml0IHNhMTEwMF9pbml0X2dwaW8odm9pZCkKK3sKKwlncGlvY2hpcF9hZGQoJnNhMTEwMF9ncGlvX2NoaXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tc2Ftc3VuZy5jIGIvZHJpdmVycy9ncGlvL2dwaW8tc2Ftc3VuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NjI1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zYW1zdW5nLmMKQEAgLTAsMCArMSwyNzEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFNBTVNVTkcgLSBHUElPbGliIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jb3JlLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmctaGVscGVycy5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1mbnMuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CisKKyNpZm5kZWYgREVCVUdfR1BJTworI2RlZmluZSBncGlvX2RiZyh4Li4uKSBkbyB7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBncGlvX2RiZyh4Li4uKSBwcmludGsoS0VSTl9ERUJVRyB4KQorI2VuZGlmCisKK2ludCBzYW1zdW5nX2dwaW9fc2V0cHVsbF91cGRvd24oc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCXVuc2lnbmVkIGludCBvZmYsIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2UgKyAweDA4OworCWludCBzaGlmdCA9IG9mZiAqIDI7CisJdTMyIHB1cDsKKworCXB1cCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJcHVwICY9IH4oMyA8PCBzaGlmdCk7CisJcHVwIHw9IHB1bGwgPDwgc2hpZnQ7CisJX19yYXdfd3JpdGVsKHB1cCwgcmVnKTsKKworCXJldHVybiAwOworfQorCitzYW1zdW5nX2dwaW9fcHVsbF90IHNhbXN1bmdfZ3Bpb19nZXRwdWxsX3VwZG93bihzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCQl1bnNpZ25lZCBpbnQgb2ZmKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZSArIDB4MDg7CisJaW50IHNoaWZ0ID0gb2ZmICogMjsKKwl1MzIgcHVwID0gX19yYXdfcmVhZGwocmVnKTsKKworCXB1cCA+Pj0gc2hpZnQ7CisJcHVwICY9IDB4MzsKKworCXJldHVybiAoX19mb3JjZSBzYW1zdW5nX2dwaW9fcHVsbF90KXB1cDsKK30KKworaW50IHMzYzI0NDNfZ3Bpb19zZXRwdWxsKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCSB1bnNpZ25lZCBpbnQgb2ZmLCBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpCit7CisJc3dpdGNoIChwdWxsKSB7CisJY2FzZSBTM0NfR1BJT19QVUxMX05PTkU6CisJCXB1bGwgPSAweDAxOworCQlicmVhazsKKwljYXNlIFMzQ19HUElPX1BVTExfVVA6CisJCXB1bGwgPSAweDAwOworCQlicmVhazsKKwljYXNlIFMzQ19HUElPX1BVTExfRE9XTjoKKwkJcHVsbCA9IDB4MDI7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2Ftc3VuZ19ncGlvX3NldHB1bGxfdXBkb3duKGNoaXAsIG9mZiwgcHVsbCk7Cit9CisKK3NhbXN1bmdfZ3Bpb19wdWxsX3QgczNjMjQ0M19ncGlvX2dldHB1bGwoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgdW5zaWduZWQgaW50IG9mZikKK3sKKwlzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGw7CisKKwlwdWxsID0gc2Ftc3VuZ19ncGlvX2dldHB1bGxfdXBkb3duKGNoaXAsIG9mZik7CisKKwlzd2l0Y2ggKHB1bGwpIHsKKwljYXNlIDB4MDA6CisJCXB1bGwgPSBTM0NfR1BJT19QVUxMX1VQOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJY2FzZSAweDAzOgorCQlwdWxsID0gUzNDX0dQSU9fUFVMTF9OT05FOworCQlicmVhazsKKwljYXNlIDB4MDI6CisJCXB1bGwgPSBTM0NfR1BJT19QVUxMX0RPV047CisJCWJyZWFrOworCX0KKworCXJldHVybiBwdWxsOworfQorCitzdGF0aWMgaW50IHMzYzI0eHhfZ3Bpb19zZXRwdWxsXzEoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgdW5zaWduZWQgaW50IG9mZiwgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsLAorCQkJCSAgc2Ftc3VuZ19ncGlvX3B1bGxfdCB1cGRvd24pCit7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlICsgMHgwODsKKwl1MzIgcHVwID0gX19yYXdfcmVhZGwocmVnKTsKKworCWlmIChwdWxsID09IHVwZG93bikKKwkJcHVwICY9IH4oMSA8PCBvZmYpOworCWVsc2UgaWYgKHB1bGwgPT0gUzNDX0dQSU9fUFVMTF9OT05FKQorCQlwdXAgfD0gKDEgPDwgb2ZmKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJX19yYXdfd3JpdGVsKHB1cCwgcmVnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNhbXN1bmdfZ3Bpb19wdWxsX3QgczNjMjR4eF9ncGlvX2dldHB1bGxfMShzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCQkgIHVuc2lnbmVkIGludCBvZmYsCisJCQkJCQkgIHNhbXN1bmdfZ3Bpb19wdWxsX3QgdXBkb3duKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZSArIDB4MDg7CisJdTMyIHB1cCA9IF9fcmF3X3JlYWRsKHJlZyk7CisKKwlwdXAgJj0gKDEgPDwgb2ZmKTsKKwlyZXR1cm4gcHVwID8gUzNDX0dQSU9fUFVMTF9OT05FIDogdXBkb3duOworfQorCitzYW1zdW5nX2dwaW9fcHVsbF90IHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzF1cChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZikKK3sKKwlyZXR1cm4gczNjMjR4eF9ncGlvX2dldHB1bGxfMShjaGlwLCBvZmYsIFMzQ19HUElPX1BVTExfVVApOworfQorCitpbnQgczNjMjR4eF9ncGlvX3NldHB1bGxfMXVwKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCSAgICAgdW5zaWduZWQgaW50IG9mZiwgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKQoreworCXJldHVybiBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xKGNoaXAsIG9mZiwgcHVsbCwgUzNDX0dQSU9fUFVMTF9VUCk7Cit9CisKK3NhbXN1bmdfZ3Bpb19wdWxsX3QgczNjMjR4eF9ncGlvX2dldHB1bGxfMWRvd24oc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZikKK3sKKwlyZXR1cm4gczNjMjR4eF9ncGlvX2dldHB1bGxfMShjaGlwLCBvZmYsIFMzQ19HUElPX1BVTExfRE9XTik7Cit9CisKK2ludCBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xZG93bihzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZiwgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKQoreworCXJldHVybiBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xKGNoaXAsIG9mZiwgcHVsbCwgUzNDX0dQSU9fUFVMTF9ET1dOKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2dwaW9fc2V0cHVsbChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJdW5zaWduZWQgaW50IG9mZiwgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKQoreworCWlmIChwdWxsID09IFMzQ19HUElPX1BVTExfVVApCisJCXB1bGwgPSAzOworCisJcmV0dXJuIHNhbXN1bmdfZ3Bpb19zZXRwdWxsX3VwZG93bihjaGlwLCBvZmYsIHB1bGwpOworfQorCitzdGF0aWMgc2Ftc3VuZ19ncGlvX3B1bGxfdCBleHlub3M0X2dwaW9fZ2V0cHVsbChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCQl1bnNpZ25lZCBpbnQgb2ZmKQoreworCXNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbDsKKworCXB1bGwgPSBzYW1zdW5nX2dwaW9fZ2V0cHVsbF91cGRvd24oY2hpcCwgb2ZmKTsKKworCWlmIChwdWxsID09IDMpCisJCXB1bGwgPSBTM0NfR1BJT19QVUxMX1VQOworCisJcmV0dXJuIHB1bGw7Cit9CisKKy8qCisgKiBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzJiaXQgLSBTYW1zdW5nIDJiaXQgc3R5bGUgR1BJTyBjb25maWd1cmF0aW9uLgorICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgorICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KKyAqIEBjZmc6IFRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHRvIHNldC4KKyAqCisgKiBUaGlzIGhlbHBlciBkZWFsIHdpdGggdGhlIEdQSU8gY2FzZXMgd2hlcmUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIGhhcyB0d28gYml0cyBvZiBjb25maWd1cmF0aW9uIHBlciBncGlvLCB3aGljaCBoYXZlIHRoZSBmb2xsb3dpbmcKKyAqIGZ1bmN0aW9uczoKKyAqCTAwID0gaW5wdXQKKyAqCTAxID0gb3V0cHV0CisgKgkxeCA9IHNwZWNpYWwgZnVuY3Rpb24KKyAqLworCitzdGF0aWMgaW50IHNhbXN1bmdfZ3Bpb19zZXRjZmdfMmJpdChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjZmcpCit7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlOworCXVuc2lnbmVkIGludCBzaGlmdCA9IG9mZiAqIDI7CisJdTMyIGNvbjsKKworCWlmIChzYW1zdW5nX2dwaW9faXNfY2ZnX3NwZWNpYWwoY2ZnKSkgeworCQljZmcgJj0gMHhmOworCQlpZiAoY2ZnID4gMykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNmZyA8PD0gc2hpZnQ7CisJfQorCisJY29uID0gX19yYXdfcmVhZGwocmVnKTsKKwljb24gJj0gfigweDMgPDwgc2hpZnQpOworCWNvbiB8PSBjZmc7CisJX19yYXdfd3JpdGVsKGNvbiwgcmVnKTsKKworCXJldHVybiAwOworfQorCisvKgorICogc2Ftc3VuZ19ncGlvX2dldGNmZ18yYml0IC0gU2Ftc3VuZyAyYml0IHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbiByZWFkLgorICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgorICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KKyAqCisgKiBUaGUgcmV2ZXJzZSBvZiBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzJiaXQoKS4gV2lsbCByZXR1cm4gYSB2YWx1ZSB3aGljZworICogY291bGQgYmUgZGlyZWN0bHkgcGFzc2VkIGJhY2sgdG8gc2Ftc3VuZ19ncGlvX3NldGNmZ18yYml0KCksIGZyb20gdGhlCisgKiBTM0NfR1BJT19TUEVDSUFMKCkgbWFjcm8uCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzJiaXQoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYpCit7CisJdTMyIGNvbjsKKworCWNvbiA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UpOworCWNvbiA+Pj0gb2ZmICogMjsKKwljb24gJj0gMzsKKworCS8qIHRoaXMgY29udmVyc2lvbiB3b3JrcyBmb3IgSU4gYW5kIE9VVCBhcyB3ZWxsIGFzIHNwZWNpYWwgbW9kZSAqLworCXJldHVybiBTM0NfR1BJT19TUEVDSUFMKGNvbik7Cit9CisKKy8qCisgKiBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzRiaXQgLSBTYW1zdW5nIDRiaXQgc2luZ2xlIHJlZ2lzdGVyIEdQSU8gY29uZmlnLgorICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgorICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KKyAqIEBjZmc6IFRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHRvIHNldC4KKyAqCisgKiBUaGlzIGhlbHBlciBkZWFsIHdpdGggdGhlIEdQSU8gY2FzZXMgd2hlcmUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaGFzIDQgYml0cworICogb2YgY29udHJvbCBwZXIgR1BJTywgZ2VuZXJhbGx5IGluIHRoZSBmb3JtIG9mOgorICoJMDAwMCA9IElucHV0CisgKgkwMDAxID0gT3V0cHV0CisgKglvdGhlcnMgPSBTcGVjaWFsIGZ1bmN0aW9ucyAoZGVwZW5kZW50IG9uIGJhbmspCisgKgorICogTm90ZSwgc2luY2UgdGhlIGNvZGUgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGFyZSB0d28gY29udHJvbAorICogcmVnaXN0ZXJzIGluc3RlYWQgb2Ygb25lLCB3ZSBkbyBub3QgaGF2ZSBhIHNlcGFyYXRlIHNldCBvZiBmdW5jdGlvbnMgZm9yCisgKiBlYWNoIGNhc2UuCisgKi8KKworc3RhdGljIGludCBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzRiaXQoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSAob2ZmICYgNykgKiA0OworCXUzMiBjb247CisKKwlpZiAob2ZmIDwgOCAmJiBjaGlwLT5jaGlwLm5ncGlvID4gOCkKKwkJcmVnIC09IDQ7CisKKwlpZiAoc2Ftc3VuZ19ncGlvX2lzX2NmZ19zcGVjaWFsKGNmZykpIHsKKwkJY2ZnICY9IDB4ZjsKKwkJY2ZnIDw8PSBzaGlmdDsKKwl9CisKKwljb24gPSBfX3Jhd19yZWFkbChyZWcpOworCWNvbiAmPSB+KDB4ZiA8PCBzaGlmdCk7CisJY29uIHw9IGNmZzsKKwlfX3Jhd193cml0ZWwoY29uLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzRiaXQgLSBTYW1zdW5nIDRiaXQgc2luZ2xlIHJlZ2lzdGVyIEdQSU8gY29uZmlnIHJlYWQuCisgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCisgKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgorICoKKyAqIFRoZSByZXZlcnNlIG9mIHNhbXN1bmdfZ3Bpb19zZXRjZmdfNGJpdCgpLCB0dXJuaW5nIGEgZ3BpbyBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlciBzZXR0aW5nIGludG8gYSB2YWx1ZSB0aGUgc29mdHdhcmUgY2FuIHVzZSwgc3VjaCBhcyBjb3VsZCBiZSBwYXNzZWQKKyAqIHRvIHNhbXN1bmdfZ3Bpb19zZXRjZmdfNGJpdCgpLgorICoKKyAqIEBzYSBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzJiaXQKKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2Ftc3VuZ19ncGlvX2dldGNmZ180Yml0KHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJIHVuc2lnbmVkIGludCBvZmYpCit7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlOworCXVuc2lnbmVkIGludCBzaGlmdCA9IChvZmYgJiA3KSAqIDQ7CisJdTMyIGNvbjsKKworCWlmIChvZmYgPCA4ICYmIGNoaXAtPmNoaXAubmdwaW8gPiA4KQorCQlyZWcgLT0gNDsKKworCWNvbiA9IF9fcmF3X3JlYWRsKHJlZyk7CisJY29uID4+PSBzaGlmdDsKKwljb24gJj0gMHhmOworCisJLyogdGhpcyBjb252ZXJzaW9uIHdvcmtzIGZvciBJTiBhbmQgT1VUIGFzIHdlbGwgYXMgc3BlY2lhbCBtb2RlICovCisJcmV0dXJuIFMzQ19HUElPX1NQRUNJQUwoY29uKTsKK30KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKKy8qCisgKiBzM2MyNHh4X2dwaW9fc2V0Y2ZnX2FiYW5rIC0gUzNDMjRYWCBzdHlsZSBHUElPIGNvbmZpZ3VyYXRpb24gKEJhbmsgQSkKKyAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KKyAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCisgKiBAY2ZnOiBUaGUgY29uZmlndXJhdGlvbiB2YWx1ZSB0byBzZXQuCisgKgorICogVGhpcyBoZWxwZXIgZGVhbCB3aXRoIHRoZSBHUElPIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIHJlZ2lzdGVyCisgKiBoYXMgb25lIGJpdCBvZiBjb25maWd1cmF0aW9uIGZvciB0aGUgZ3Bpbywgd2hlcmUgc2V0dGluZyB0aGUgYml0CisgKiBtZWFucyB0aGUgcGluIGlzIGluIHNwZWNpYWwgZnVuY3Rpb24gbW9kZSBhbmQgdW5zZXQgbWVhbnMgb3V0cHV0LgorICovCisKK3N0YXRpYyBpbnQgczNjMjR4eF9ncGlvX3NldGNmZ19hYmFuayhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBvZmY7CisJdTMyIGNvbjsKKworCWlmIChzYW1zdW5nX2dwaW9faXNfY2ZnX3NwZWNpYWwoY2ZnKSkgeworCQljZmcgJj0gMHhmOworCisJCS8qIE1hcCBvdXRwdXQgdG8gMCwgYW5kIFNGTjIgdG8gMSAqLworCQljZmcgLT0gMTsKKwkJaWYgKGNmZyA+IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljZmcgPDw9IHNoaWZ0OworCX0KKworCWNvbiA9IF9fcmF3X3JlYWRsKHJlZyk7CisJY29uICY9IH4oMHgxIDw8IHNoaWZ0KTsKKwljb24gfD0gY2ZnOworCV9fcmF3X3dyaXRlbChjb24sIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHMzYzI0eHhfZ3Bpb19nZXRjZmdfYWJhbmsgLSBTM0MyNFhYIHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbiByZWFkIChCYW5rIEEpCisgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCisgKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgorICoKKyAqIFRoZSByZXZlcnNlIG9mIHMzYzI0eHhfZ3Bpb19zZXRjZmdfYWJhbmsoKSB0dXJuaW5nIGFuIEdQSU8gaW50byBhIHVzYWJsZQorICogR1BJTyBjb25maWd1cmF0aW9uIHZhbHVlLgorICoKKyAqIEBzYSBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzJiaXQKKyAqIEBzYSBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzRiaXQKKyAqLworCitzdGF0aWMgdW5zaWduZWQgczNjMjR4eF9ncGlvX2dldGNmZ19hYmFuayhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCSAgdW5zaWduZWQgaW50IG9mZikKK3sKKwl1MzIgY29uOworCisJY29uID0gX19yYXdfcmVhZGwoY2hpcC0+YmFzZSk7CisJY29uID4+PSBvZmY7CisJY29uICY9IDE7CisJY29uKys7CisKKwlyZXR1cm4gUzNDX0dQSU9fU0ZOKGNvbik7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TNVA2NDQwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzVQNjQ1MCkKK3N0YXRpYyBpbnQgczVwNjR4MF9ncGlvX3NldGNmZ19yYmFuayhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQ7CisJdTMyIGNvbjsKKworCXN3aXRjaCAob2ZmKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwljYXNlIDI6CisJY2FzZSAzOgorCWNhc2UgNDoKKwljYXNlIDU6CisJCXNoaWZ0ID0gKG9mZiAmIDcpICogNDsKKwkJcmVnIC09IDQ7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc2hpZnQgPSAoKG9mZiArIDEpICYgNykgKiA0OworCQlyZWcgLT0gNDsKKwlkZWZhdWx0OgorCQlzaGlmdCA9ICgob2ZmICsgMSkgJiA3KSAqIDQ7CisJCWJyZWFrOworCX0KKworCWlmIChzYW1zdW5nX2dwaW9faXNfY2ZnX3NwZWNpYWwoY2ZnKSkgeworCQljZmcgJj0gMHhmOworCQljZmcgPDw9IHNoaWZ0OworCX0KKworCWNvbiA9IF9fcmF3X3JlYWRsKHJlZyk7CisJY29uICY9IH4oMHhmIDw8IHNoaWZ0KTsKKwljb24gfD0gY2ZnOworCV9fcmF3X3dyaXRlbChjb24sIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgc2Ftc3VuZ19ncGlvbGliX3NldF9jZmcoc3RydWN0IHNhbXN1bmdfZ3Bpb19jZmcgKmNoaXBjZmcsCisJCQkJCSAgIGludCBucl9jaGlwcykKK3sKKwlmb3IgKDsgbnJfY2hpcHMgPiAwOyBucl9jaGlwcy0tLCBjaGlwY2ZnKyspIHsKKwkJaWYgKCFjaGlwY2ZnLT5zZXRfY29uZmlnKQorCQkJY2hpcGNmZy0+c2V0X2NvbmZpZyA9IHNhbXN1bmdfZ3Bpb19zZXRjZmdfNGJpdDsKKwkJaWYgKCFjaGlwY2ZnLT5nZXRfY29uZmlnKQorCQkJY2hpcGNmZy0+Z2V0X2NvbmZpZyA9IHNhbXN1bmdfZ3Bpb19nZXRjZmdfNGJpdDsKKwkJaWYgKCFjaGlwY2ZnLT5zZXRfcHVsbCkKKwkJCWNoaXBjZmctPnNldF9wdWxsID0gc2Ftc3VuZ19ncGlvX3NldHB1bGxfdXBkb3duOworCQlpZiAoIWNoaXBjZmctPmdldF9wdWxsKQorCQkJY2hpcGNmZy0+Z2V0X3B1bGwgPSBzYW1zdW5nX2dwaW9fZ2V0cHVsbF91cGRvd247CisJfQorfQorCitzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NmZyBzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdCA9IHsKKwkuc2V0X2NvbmZpZwk9IHNhbXN1bmdfZ3Bpb19zZXRjZmdfMmJpdCwKKwkuZ2V0X2NvbmZpZwk9IHNhbXN1bmdfZ3Bpb19nZXRjZmdfMmJpdCwKK307CisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jZmcgczNjMjR4eF9ncGlvY2ZnX2JhbmthID0geworCS5zZXRfY29uZmlnCT0gczNjMjR4eF9ncGlvX3NldGNmZ19hYmFuaywKKwkuZ2V0X2NvbmZpZwk9IHMzYzI0eHhfZ3Bpb19nZXRjZmdfYWJhbmssCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NmZyBleHlub3M0X2dwaW9fY2ZnID0geworCS5zZXRfcHVsbAk9IGV4eW5vczRfZ3Bpb19zZXRwdWxsLAorCS5nZXRfcHVsbAk9IGV4eW5vczRfZ3Bpb19nZXRwdWxsLAorCS5zZXRfY29uZmlnCT0gc2Ftc3VuZ19ncGlvX3NldGNmZ180Yml0LAorCS5nZXRfY29uZmlnCT0gc2Ftc3VuZ19ncGlvX2dldGNmZ180Yml0LAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TNVA2NDQwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzVQNjQ1MCkKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NmZyBzNXA2NHgwX2dwaW9fY2ZnX3JiYW5rID0geworCS5jZmdfZWludAk9IDB4MywKKwkuc2V0X2NvbmZpZwk9IHM1cDY0eDBfZ3Bpb19zZXRjZmdfcmJhbmssCisJLmdldF9jb25maWcJPSBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzRiaXQsCisJLnNldF9wdWxsCT0gc2Ftc3VuZ19ncGlvX3NldHB1bGxfdXBkb3duLAorCS5nZXRfcHVsbAk9IHNhbXN1bmdfZ3Bpb19nZXRwdWxsX3VwZG93biwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2ZnIHNhbXN1bmdfZ3Bpb19jZmdzW10gPSB7CisJeworCQkuY2ZnX2VpbnQJPSAweDAsCisJfSwgeworCQkuY2ZnX2VpbnQJPSAweDMsCisJfSwgeworCQkuY2ZnX2VpbnQJPSAweDcsCisJfSwgeworCQkuY2ZnX2VpbnQJPSAweEYsCisJfSwgeworCQkuY2ZnX2VpbnQJPSAweDAsCisJCS5zZXRfY29uZmlnCT0gc2Ftc3VuZ19ncGlvX3NldGNmZ18yYml0LAorCQkuZ2V0X2NvbmZpZwk9IHNhbXN1bmdfZ3Bpb19nZXRjZmdfMmJpdCwKKwl9LCB7CisJCS5jZmdfZWludAk9IDB4MiwKKwkJLnNldF9jb25maWcJPSBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzJiaXQsCisJCS5nZXRfY29uZmlnCT0gc2Ftc3VuZ19ncGlvX2dldGNmZ18yYml0LAorCX0sIHsKKwkJLmNmZ19laW50CT0gMHgzLAorCQkuc2V0X2NvbmZpZwk9IHNhbXN1bmdfZ3Bpb19zZXRjZmdfMmJpdCwKKwkJLmdldF9jb25maWcJPSBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzJiaXQsCisJfSwgeworCQkuc2V0X2NvbmZpZwk9IHNhbXN1bmdfZ3Bpb19zZXRjZmdfMmJpdCwKKwkJLmdldF9jb25maWcJPSBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzJiaXQsCisJfSwgeworCQkuc2V0X3B1bGwJPSBleHlub3M0X2dwaW9fc2V0cHVsbCwKKwkJLmdldF9wdWxsCT0gZXh5bm9zNF9ncGlvX2dldHB1bGwsCisJfSwgeworCQkuY2ZnX2VpbnQJPSAweDMsCisJCS5zZXRfcHVsbAk9IGV4eW5vczRfZ3Bpb19zZXRwdWxsLAorCQkuZ2V0X3B1bGwJPSBleHlub3M0X2dwaW9fZ2V0cHVsbCwKKwl9Cit9OworCisvKgorICogRGVmYXVsdCByb3V0aW5lcyBmb3IgY29udHJvbGxpbmcgR1BJTywgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFMzQzI0WFgKKyAqIEdQSU8gZnVuY3Rpb25zIHdoaWNoIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBlYWNoIGdwaW8gYmFuayBvZiB0aGUKKyAqIGNoaXAgaXMgYXMgZm9sbG93aW5nOgorICoKKyAqIGJhc2UgKyAweDAwOiBDb250cm9sIHJlZ2lzdGVyLCAyIGJpdHMgcGVyIGdwaW8KKyAqCSAgICAgICAgZ3BpbyBuOiAyIGJpdHMgc3RhcnRpbmcgYXQgKDIqbikKKyAqCQkwMCA9IGlucHV0LCAwMSA9IG91dHB1dCwgb3RoZXJzIG1lYW4gc3BlY2lhbC1mdW5jdGlvbgorICogYmFzZSArIDB4MDQ6IERhdGEgcmVnaXN0ZXIsIDEgYml0IHBlciBncGlvCisgKgkJYml0IG46IGRhdGEgYml0IG4KKyovCisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvbGliXzJiaXRfaW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3NhbXN1bmdfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjb247CisKKwlzYW1zdW5nX2dwaW9fbG9jayhvdXJjaGlwLCBmbGFncyk7CisKKwljb24gPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwMCk7CisJY29uICY9IH4oMyA8PCAob2Zmc2V0ICogMikpOworCisJX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIDB4MDApOworCisJc2Ftc3VuZ19ncGlvX3VubG9jayhvdXJjaGlwLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvbGliXzJiaXRfb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICAgIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3NhbXN1bmdfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBkYXQ7CisJdW5zaWduZWQgbG9uZyBjb247CisKKwlzYW1zdW5nX2dwaW9fbG9jayhvdXJjaGlwLCBmbGFncyk7CisKKwlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwNCk7CisJZGF0ICY9IH4oMSA8PCBvZmZzZXQpOworCWlmICh2YWx1ZSkKKwkJZGF0IHw9IDEgPDwgb2Zmc2V0OworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKKworCWNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyAweDAwKTsKKwljb24gJj0gfigzIDw8IChvZmZzZXQgKiAyKSk7CisJY29uIHw9IDEgPDwgKG9mZnNldCAqIDIpOworCisJX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIDB4MDApOworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKKworCXNhbXN1bmdfZ3Bpb191bmxvY2sob3VyY2hpcCwgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogVGhlIHNhbXN1bmdfZ3Bpb2xpYl80Yml0IHJvdXRpbmVzIGFyZSB0byBjb250cm9sIHRoZSBncGlvIGJhbmtzIHdoZXJlCisgKiB0aGUgZ3BpbyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIChHUHhDT04pIGhhcyA0IGJpdHMgcGVyIEdQSU8sIGFzIHRoZQorICogZm9sbG93aW5nIGV4YW1wbGU6CisgKgorICogYmFzZSArIDB4MDA6IENvbnRyb2wgcmVnaXN0ZXIsIDQgYml0cyBwZXIgZ3BpbworICoJCWdwaW8gbjogNCBiaXRzIHN0YXJ0aW5nIGF0ICg0Km4pCisgKgkJMDAwMCA9IGlucHV0LCAwMDAxID0gb3V0cHV0LCBvdGhlcnMgbWVhbiBzcGVjaWFsLWZ1bmN0aW9uCisgKiBiYXNlICsgMHgwNDogRGF0YSByZWdpc3RlciwgMSBiaXQgcGVyIGdwaW8KKyAqCQliaXQgbjogZGF0YSBiaXQgbgorICoKKyAqIE5vdGUsIHNpbmNlIHRoZSBkYXRhIHJlZ2lzdGVyIGlzIG9uZSBiaXQgcGVyIGdwaW8gYW5kIGlzIGF0IGJhc2UgKyAweDQKKyAqIHdlIGNhbiB1c2Ugc2Ftc3VuZ19ncGlvbGliX2dldCBhbmQgc2Ftc3VuZ19ncGlvbGliX3NldCB0byBjaGFuZ2UgdGhlCisgKiBzdGF0ZSBvZiB0aGUgb3V0cHV0LgorICovCisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvbGliXzRiaXRfaW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3NhbXN1bmdfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgY29uOworCisJY29uID0gX19yYXdfcmVhZGwoYmFzZSArIEdQSU9DT05fT0ZGKTsKKwljb24gJj0gfigweGYgPDwgY29uXzRiaXRfc2hpZnQob2Zmc2V0KSk7CisJX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIEdQSU9DT05fT0ZGKTsKKworCWdwaW9fZGJnKCIlczogJXA6IENPTiBub3cgJTA4bHhcbiIsIF9fZnVuY19fLCBiYXNlLCBjb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvbGliXzRiaXRfb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGNvbjsKKwl1bnNpZ25lZCBsb25nIGRhdDsKKworCWNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUElPQ09OX09GRik7CisJY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCkpOworCWNvbiB8PSAweDEgPDwgY29uXzRiaXRfc2hpZnQob2Zmc2V0KTsKKworCWRhdCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUElPREFUX09GRik7CisKKwlpZiAodmFsdWUpCisJCWRhdCB8PSAxIDw8IG9mZnNldDsKKwllbHNlCisJCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKKworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyBHUElPREFUX09GRik7CisJX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIEdQSU9DT05fT0ZGKTsKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgR1BJT0RBVF9PRkYpOworCisJZ3Bpb19kYmcoIiVzOiAlcDogQ09OICUwOGx4LCBEQVQgJTA4bHhcbiIsIF9fZnVuY19fLCBiYXNlLCBjb24sIGRhdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBuZXh0IHNldCBvZiByb3V0aW5lcyBhcmUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBHUElPIGNvbmZpZ3VyYXRpb24KKyAqIHJlZ2lzdGVycyBhcmUgNCBiaXRzIHBlciBHUElPIGJ1dCB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHJlZ2lzdGVyICh0aGUKKyAqIGJhbmsgaGFzIG1vcmUgdGhhbiA4IEdQSU9zLgorICoKKyAqIFRoaXMgY2FzZSBpcyB0aGUgc2ltaWxhciB0byB0aGUgNCBiaXQgY2FzZSwgYnV0IHRoZSByZWdpc3RlcnMgYXJlIGFzCisgKiBmb2xsb3dzOgorICoKKyAqIGJhc2UgKyAweDAwOiBDb250cm9sIHJlZ2lzdGVyLCA0IGJpdHMgcGVyIGdwaW8gKGxvd2VyIDggR1BJT3MpCisgKgkJZ3BpbyBuOiA0IGJpdHMgc3RhcnRpbmcgYXQgKDQqbikKKyAqCQkwMDAwID0gaW5wdXQsIDAwMDEgPSBvdXRwdXQsIG90aGVycyBtZWFuIHNwZWNpYWwtZnVuY3Rpb24KKyAqIGJhc2UgKyAweDA0OiBDb250cm9sIHJlZ2lzdGVyLCA0IGJpdHMgcGVyIGdwaW8gKHVwIHRvIDggYWRkaXRpb25zIEdQSU9zKQorICoJCWdwaW8gbjogNCBiaXRzIHN0YXJ0aW5nIGF0ICg0Km4pCisgKgkJMDAwMCA9IGlucHV0LCAwMDAxID0gb3V0cHV0LCBvdGhlcnMgbWVhbiBzcGVjaWFsLWZ1bmN0aW9uCisgKiBiYXNlICsgMHgwODogRGF0YSByZWdpc3RlciwgMSBiaXQgcGVyIGdwaW8KKyAqCQliaXQgbjogZGF0YSBiaXQgbgorICoKKyAqIFRvIGFsbG93IHVzIHRvIHVzZSB0aGUgc2Ftc3VuZ19ncGlvbGliX2dldCBhbmQgc2Ftc3VuZ19ncGlvbGliX3NldAorICogcm91dGluZXMgd2Ugc3RvcmUgdGhlICdiYXNlICsgMHg0JyBhZGRyZXNzIHNvIHRoYXQgdGhlc2Ugcm91dGluZXMgc2VlCisgKiB0aGUgZGF0YSByZWdpc3RlciBhdCBvdXJjaGlwLT5iYXNlICsgMHgwNC4KKyAqLworCitzdGF0aWMgaW50IHNhbXN1bmdfZ3Bpb2xpYl80Yml0Ml9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3NhbXN1bmdfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnY29uID0gYmFzZTsKKwl1bnNpZ25lZCBsb25nIGNvbjsKKworCWlmIChvZmZzZXQgPiA3KQorCQlvZmZzZXQgLT0gODsKKwllbHNlCisJCXJlZ2NvbiAtPSA0OworCisJY29uID0gX19yYXdfcmVhZGwocmVnY29uKTsKKwljb24gJj0gfigweGYgPDwgY29uXzRiaXRfc2hpZnQob2Zmc2V0KSk7CisJX19yYXdfd3JpdGVsKGNvbiwgcmVnY29uKTsKKworCWdwaW9fZGJnKCIlczogJXA6IENPTiAlMDhseFxuIiwgX19mdW5jX18sIGJhc2UsIGNvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYW1zdW5nX2dwaW9saWJfNGJpdDJfb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl2b2lkIF9faW9tZW0gKnJlZ2NvbiA9IGJhc2U7CisJdW5zaWduZWQgbG9uZyBjb247CisJdW5zaWduZWQgbG9uZyBkYXQ7CisJdW5zaWduZWQgY29uX29mZnNldCA9IG9mZnNldDsKKworCWlmIChjb25fb2Zmc2V0ID4gNykKKwkJY29uX29mZnNldCAtPSA4OworCWVsc2UKKwkJcmVnY29uIC09IDQ7CisKKwljb24gPSBfX3Jhd19yZWFkbChyZWdjb24pOworCWNvbiAmPSB+KDB4ZiA8PCBjb25fNGJpdF9zaGlmdChjb25fb2Zmc2V0KSk7CisJY29uIHw9IDB4MSA8PCBjb25fNGJpdF9zaGlmdChjb25fb2Zmc2V0KTsKKworCWRhdCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUElPREFUX09GRik7CisKKwlpZiAodmFsdWUpCisJCWRhdCB8PSAxIDw8IG9mZnNldDsKKwllbHNlCisJCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKKworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyBHUElPREFUX09GRik7CisJX19yYXdfd3JpdGVsKGNvbiwgcmVnY29uKTsKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgR1BJT0RBVF9PRkYpOworCisJZ3Bpb19kYmcoIiVzOiAlcDogQ09OICUwOGx4LCBEQVQgJTA4bHhcbiIsIF9fZnVuY19fLCBiYXNlLCBjb24sIGRhdCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKKy8qIFRoZSBuZXh0IHNldCBvZiByb3V0aW5lcyBhcmUgZm9yIHRoZSBjYXNlIG9mIHMzYzI0eHggYmFuayBhICovCisKK3N0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmthX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBzM2MyNHh4X2dwaW9saWJfYmFua2Ffb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3NhbXN1bmdfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBkYXQ7CisJdW5zaWduZWQgbG9uZyBjb247CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljb24gPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwMCk7CisJZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDQpOworCisJZGF0ICY9IH4oMSA8PCBvZmZzZXQpOworCWlmICh2YWx1ZSkKKwkJZGF0IHw9IDEgPDwgb2Zmc2V0OworCisJX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIDB4MDQpOworCisJY29uICY9IH4oMSA8PCBvZmZzZXQpOworCisJX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIDB4MDApOworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBUaGUgbmV4dCBzZXQgb2Ygcm91dGluZXMgYXJlIGZvciB0aGUgY2FzZSBvZiBzNXA2NHgwIGJhbmsgciAqLworCitzdGF0aWMgaW50IHM1cDY0eDBfZ3Bpb2xpYl9yYmFua19pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3NhbXN1bmdfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnY29uID0gYmFzZTsKKwl1bnNpZ25lZCBsb25nIGNvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChvZmZzZXQpIHsKKwljYXNlIDY6CisJCW9mZnNldCArPSAxOworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlyZWdjb24gLT0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb2Zmc2V0IC09IDc7CisJCWJyZWFrOworCX0KKworCXNhbXN1bmdfZ3Bpb19sb2NrKG91cmNoaXAsIGZsYWdzKTsKKworCWNvbiA9IF9fcmF3X3JlYWRsKHJlZ2Nvbik7CisJY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCkpOworCV9fcmF3X3dyaXRlbChjb24sIHJlZ2Nvbik7CisKKwlzYW1zdW5nX2dwaW9fdW5sb2NrKG91cmNoaXAsIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cDY0eDBfZ3Bpb2xpYl9yYmFua19vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkJdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3NhbXN1bmdfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnY29uID0gYmFzZTsKKwl1bnNpZ25lZCBsb25nIGNvbjsKKwl1bnNpZ25lZCBsb25nIGRhdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNvbl9vZmZzZXQgID0gb2Zmc2V0OworCisJc3dpdGNoIChjb25fb2Zmc2V0KSB7CisJY2FzZSA2OgorCQljb25fb2Zmc2V0ICs9IDE7CisJY2FzZSAwOgorCWNhc2UgMToKKwljYXNlIDI6CisJY2FzZSAzOgorCWNhc2UgNDoKKwljYXNlIDU6CisJCXJlZ2NvbiAtPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQljb25fb2Zmc2V0IC09IDc7CisJCWJyZWFrOworCX0KKworCXNhbXN1bmdfZ3Bpb19sb2NrKG91cmNoaXAsIGZsYWdzKTsKKworCWNvbiA9IF9fcmF3X3JlYWRsKHJlZ2Nvbik7CisJY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KGNvbl9vZmZzZXQpKTsKKwljb24gfD0gMHgxIDw8IGNvbl80Yml0X3NoaWZ0KGNvbl9vZmZzZXQpOworCisJZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIEdQSU9EQVRfT0ZGKTsKKwlpZiAodmFsdWUpCisJCWRhdCB8PSAxIDw8IG9mZnNldDsKKwllbHNlCisJCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKKworCV9fcmF3X3dyaXRlbChjb24sIHJlZ2Nvbik7CisJX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIEdQSU9EQVRfT0ZGKTsKKworCXNhbXN1bmdfZ3Bpb191bmxvY2sob3VyY2hpcCwgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZ3Bpb2xpYl9zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZGF0OworCisJc2Ftc3VuZ19ncGlvX2xvY2sob3VyY2hpcCwgZmxhZ3MpOworCisJZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDQpOworCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKKwlpZiAodmFsdWUpCisJCWRhdCB8PSAxIDw8IG9mZnNldDsKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7CisKKwlzYW1zdW5nX2dwaW9fdW5sb2NrKG91cmNoaXAsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzYW1zdW5nX2dwaW9saWJfZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChvdXJjaGlwLT5iYXNlICsgMHgwNCk7CisJdmFsID4+PSBvZmZzZXQ7CisJdmFsICY9IDE7CisKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogQ09ORklHX1MzQ19HUElPX1RSQUNLIGVuYWJsZXMgdGhlIHRyYWNraW5nIG9mIHRoZSBzM2Mgc3BlY2lmaWMgZ3Bpb3MKKyAqIGZvciB1c2Ugd2l0aCB0aGUgY29uZmlndXJhdGlvbiBjYWxscywgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSBzM2MgZ3Bpb2xpYgorICogc3VwcG9ydCBjb2RlLgorICoKKyAqIE5vdCBhbGwgczNjIHN1cHBvcnQgY29kZSB3aWxsIG5lZWQgdGhpcywgYXMgc29tZSBjb25maWd1cmF0aW9ucyBvZiBjcHUKKyAqIG1heSBvbmx5IHN1cHBvcnQgb25lIG9yIHR3byBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBoYXZlIGFuCisgKiBlYXN5IGdwaW8gdG8gc2Ftc3VuZ19ncGlvX2NoaXAgbWFwcGluZyBmdW5jdGlvbi4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbgorICogdGhlIG1hY2hpbmUgc3VwcG9ydCBmaWxlIHNob3VsZCBwcm92aWRlIGl0cyBvd24gc2Ftc3VuZ19ncGlvbGliX2dldGNoaXAoKQorICogYW5kIGFueSBvdGhlciBuZWNlc3NhcnkgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0dQSU9fVFJBQ0sKK3N0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqczNjX2dwaW9zW1MzQ19HUElPX0VORF07CisKK3N0YXRpYyBfX2luaXQgdm9pZCBzM2NfZ3Bpb2xpYl90cmFjayhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXApCit7CisJdW5zaWduZWQgaW50IGdwbjsKKwlpbnQgaTsKKworCWdwbiA9IGNoaXAtPmNoaXAuYmFzZTsKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+Y2hpcC5uZ3BpbzsgaSsrLCBncG4rKykgeworCQlCVUdfT04oZ3BuID49IEFSUkFZX1NJWkUoczNjX2dwaW9zKSk7CisJCXMzY19ncGlvc1tncG5dID0gY2hpcDsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19HUElPX1RSQUNLICovCisKKy8qCisgKiBzYW1zdW5nX2dwaW9saWJfYWRkKCkgLSBhZGQgdGhlIFNhbXN1bmcgZ3Bpb19jaGlwLgorICogQGNoaXA6IFRoZSBjaGlwIHRvIHJlZ2lzdGVyCisgKgorICogVGhpcyBpcyBhIHdyYXBwZXIgdG8gZ3Bpb2NoaXBfYWRkKCkgdGhhdCB0YWtlcyBvdXIgc3BlY2lmaWMgZ3BpbyBjaGlwCisgKiBpbmZvcm1hdGlvbiBhbmQgbWFrZXMgdGhlIG5lY2Vzc2FyeSBhbHRlcmF0aW9ucyBmb3IgdGhlIHBsYXRmb3JtIGFuZAorICogbm90ZXMgdGhlIGluZm9ybWF0aW9uIGZvciB1c2Ugd2l0aCB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW1zIGFuZCBhbnkKKyAqIG90aGVyIHBhcnRzIG9mIHRoZSBzeXN0ZW0uCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IHNhbXN1bmdfZ3Bpb2xpYl9hZGQoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gJmNoaXAtPmNoaXA7CisJaW50IHJldDsKKworCUJVR19PTighY2hpcC0+YmFzZSk7CisJQlVHX09OKCFnYy0+bGFiZWwpOworCUJVR19PTighZ2MtPm5ncGlvKTsKKworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5sb2NrKTsKKworCWlmICghZ2MtPmRpcmVjdGlvbl9pbnB1dCkKKwkJZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl8yYml0X2lucHV0OworCWlmICghZ2MtPmRpcmVjdGlvbl9vdXRwdXQpCisJCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gc2Ftc3VuZ19ncGlvbGliXzJiaXRfb3V0cHV0OworCWlmICghZ2MtPnNldCkKKwkJZ2MtPnNldCA9IHNhbXN1bmdfZ3Bpb2xpYl9zZXQ7CisJaWYgKCFnYy0+Z2V0KQorCQlnYy0+Z2V0ID0gc2Ftc3VuZ19ncGlvbGliX2dldDsKKworI2lmZGVmIENPTkZJR19QTQorCWlmIChjaGlwLT5wbSAhPSBOVUxMKSB7CisJCWlmICghY2hpcC0+cG0tPnNhdmUgfHwgIWNoaXAtPnBtLT5yZXN1bWUpCisJCQlwcmludGsoS0VSTl9FUlIgImdwaW86ICVzIGhhcyBtaXNzaW5nIFBNIGZ1bmN0aW9uc1xuIiwKKwkJCSAgICAgICBnYy0+bGFiZWwpOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgImdwaW86ICVzIGhhcyBubyBQTSBmdW5jdGlvblxuIiwgZ2MtPmxhYmVsKTsKKyNlbmRpZgorCisJLyogZ3Bpb2NoaXBfYWRkKCkgcHJpbnRzIG93biBmYWlsdXJlIG1lc3NhZ2Ugb24gZXJyb3IuICovCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKGdjKTsKKwlpZiAocmV0ID49IDApCisJCXMzY19ncGlvbGliX3RyYWNrKGNoaXApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgczNjMjR4eF9ncGlvbGliX2FkZF9jaGlwcyhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCSAgICAgaW50IG5yX2NoaXBzLCB2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJaW50IGk7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSAmY2hpcC0+Y2hpcDsKKworCWZvciAoaSA9IDAgOyBpIDwgbnJfY2hpcHM7IGkrKywgY2hpcCsrKSB7CisJCS8qIHNraXAgYmFua3Mgbm90IHByZXNlbnQgb24gU29DICovCisJCWlmIChjaGlwLT5jaGlwLmJhc2UgPj0gUzNDX0dQSU9fRU5EKQorCQkJY29udGludWU7CisKKwkJaWYgKCFjaGlwLT5jb25maWcpCisJCQljaGlwLT5jb25maWcgPSAmczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQ7CisJCWlmICghY2hpcC0+cG0pCisJCQljaGlwLT5wbSA9IF9fZ3Bpb19wbSgmc2Ftc3VuZ19ncGlvX3BtXzJiaXQpOworCQlpZiAoKGJhc2UgIT0gTlVMTCkgJiYgKGNoaXAtPmJhc2UgPT0gTlVMTCkpCisJCQljaGlwLT5iYXNlID0gYmFzZSArICgoaSkgKiAweDEwKTsKKworCQlpZiAoIWdjLT5kaXJlY3Rpb25faW5wdXQpCisJCQlnYy0+ZGlyZWN0aW9uX2lucHV0ID0gc2Ftc3VuZ19ncGlvbGliXzJiaXRfaW5wdXQ7CisJCWlmICghZ2MtPmRpcmVjdGlvbl9vdXRwdXQpCisJCQlnYy0+ZGlyZWN0aW9uX291dHB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl8yYml0X291dHB1dDsKKworCQlzYW1zdW5nX2dwaW9saWJfYWRkKGNoaXApOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHNhbXN1bmdfZ3Bpb2xpYl9hZGRfMmJpdF9jaGlwcyhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCQkgIGludCBucl9jaGlwcywgdm9pZCBfX2lvbWVtICpiYXNlLAorCQkJCQkJICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWludCBpOworCisJZm9yIChpID0gMCA7IGkgPCBucl9jaGlwczsgaSsrLCBjaGlwKyspIHsKKwkJY2hpcC0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBzYW1zdW5nX2dwaW9saWJfMmJpdF9pbnB1dDsKKwkJY2hpcC0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gc2Ftc3VuZ19ncGlvbGliXzJiaXRfb3V0cHV0OworCisJCWlmICghY2hpcC0+Y29uZmlnKQorCQkJY2hpcC0+Y29uZmlnID0gJnNhbXN1bmdfZ3Bpb19jZmdzWzddOworCQlpZiAoIWNoaXAtPnBtKQorCQkJY2hpcC0+cG0gPSBfX2dwaW9fcG0oJnNhbXN1bmdfZ3Bpb19wbV8yYml0KTsKKwkJaWYgKChiYXNlICE9IE5VTEwpICYmIChjaGlwLT5iYXNlID09IE5VTEwpKQorCQkJY2hpcC0+YmFzZSA9IGJhc2UgKyAoKGkpICogb2Zmc2V0KTsKKworCQlzYW1zdW5nX2dwaW9saWJfYWRkKGNoaXApOworCX0KK30KKworLyoKKyAqIHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyAtIDRiaXQgc2luZ2xlIHJlZ2lzdGVyIEdQSU8gY29uZmlnLgorICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgorICogQG5yX2NoaXBzOiBUaGUgbm8gb2YgY2hpcHMgKGdwaW8gcG9ydHMpIGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgorICoKKyAqIFRoaXMgaGVscGVyIGRlYWwgd2l0aCB0aGUgR1BJTyBjYXNlcyB3aGVyZSB0aGUgY29udHJvbCByZWdpc3RlciBoYXMgNCBiaXRzCisgKiBvZiBjb250cm9sIHBlciBHUElPLCBnZW5lcmFsbHkgaW4gdGhlIGZvcm0gb2Y6CisgKiAwMDAwID0gSW5wdXQKKyAqIDAwMDEgPSBPdXRwdXQKKyAqIG90aGVycyA9IFNwZWNpYWwgZnVuY3Rpb25zIChkZXBlbmRlbnQgb24gYmFuaykKKyAqCisgKiBOb3RlLCBzaW5jZSB0aGUgY29kZSB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIHR3byBjb250cm9sCisgKiByZWdpc3RlcnMgaW5zdGVhZCBvZiBvbmUsIHdlIGRvIG5vdCBoYXZlIGEgc2VwYXJhdGUgc2V0IG9mIGZ1bmN0aW9uCisgKiAoc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0Ml9jaGlwcylmb3IgZWFjaCBjYXNlLgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJICBpbnQgbnJfY2hpcHMsIHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgbnJfY2hpcHM7IGkrKywgY2hpcCsrKSB7CisJCWNoaXAtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gc2Ftc3VuZ19ncGlvbGliXzRiaXRfaW5wdXQ7CisJCWNoaXAtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl80Yml0X291dHB1dDsKKworCQlpZiAoIWNoaXAtPmNvbmZpZykKKwkJCWNoaXAtPmNvbmZpZyA9ICZzYW1zdW5nX2dwaW9fY2Znc1syXTsKKwkJaWYgKCFjaGlwLT5wbSkKKwkJCWNoaXAtPnBtID0gX19ncGlvX3BtKCZzYW1zdW5nX2dwaW9fcG1fNGJpdCk7CisJCWlmICgoYmFzZSAhPSBOVUxMKSAmJiAoY2hpcC0+YmFzZSA9PSBOVUxMKSkKKwkJCWNoaXAtPmJhc2UgPSBiYXNlICsgKChpKSAqIDB4MjApOworCisJCXNhbXN1bmdfZ3Bpb2xpYl9hZGQoY2hpcCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0Ml9jaGlwcyhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCQkgICBpbnQgbnJfY2hpcHMpCit7CisJZm9yICg7IG5yX2NoaXBzID4gMDsgbnJfY2hpcHMtLSwgY2hpcCsrKSB7CisJCWNoaXAtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gc2Ftc3VuZ19ncGlvbGliXzRiaXQyX2lucHV0OworCQljaGlwLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBzYW1zdW5nX2dwaW9saWJfNGJpdDJfb3V0cHV0OworCisJCWlmICghY2hpcC0+Y29uZmlnKQorCQkJY2hpcC0+Y29uZmlnID0gJnNhbXN1bmdfZ3Bpb19jZmdzWzJdOworCQlpZiAoIWNoaXAtPnBtKQorCQkJY2hpcC0+cG0gPSBfX2dwaW9fcG0oJnNhbXN1bmdfZ3Bpb19wbV80Yml0KTsKKworCQlzYW1zdW5nX2dwaW9saWJfYWRkKGNoaXApOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHM1cDY0eDBfZ3Bpb2xpYl9hZGRfcmJhbmsoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgICAgIGludCBucl9jaGlwcykKK3sKKwlmb3IgKDsgbnJfY2hpcHMgPiAwOyBucl9jaGlwcy0tLCBjaGlwKyspIHsKKwkJY2hpcC0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBzNXA2NHgwX2dwaW9saWJfcmJhbmtfaW5wdXQ7CisJCWNoaXAtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IHM1cDY0eDBfZ3Bpb2xpYl9yYmFua19vdXRwdXQ7CisKKwkJaWYgKCFjaGlwLT5wbSkKKwkJCWNoaXAtPnBtID0gX19ncGlvX3BtKCZzYW1zdW5nX2dwaW9fcG1fNGJpdCk7CisKKwkJc2Ftc3VuZ19ncGlvbGliX2FkZChjaGlwKTsKKwl9Cit9CisKK2ludCBzYW1zdW5nX2dwaW9saWJfdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpzYW1zdW5nX2NoaXAgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwLCBjaGlwKTsKKworCXJldHVybiBzYW1zdW5nX2NoaXAtPmlycV9iYXNlICsgb2Zmc2V0OworfQorCisjaWZkZWYgQ09ORklHX1BMQVRfUzNDMjRYWAorc3RhdGljIGludCBzM2MyNHh4X2dwaW9saWJfZmJhbmtfdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuIElSUV9FSU5UMCArIG9mZnNldDsKKworCWlmIChvZmZzZXQgPCA4KQorCQlyZXR1cm4gSVJRX0VJTlQ0ICsgb2Zmc2V0IC0gNDsKKworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0M2NFhYCitzdGF0aWMgaW50IHMzYzY0eHhfZ3Bpb2xpYl9tYmFua190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQoreworCXJldHVybiBwaW4gPCA1ID8gSVJRX0VJTlQoMjMpICsgcGluIDogLUVOWElPOworfQorCitzdGF0aWMgaW50IHMzYzY0eHhfZ3Bpb2xpYl9sYmFua190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQoreworCXJldHVybiBwaW4gPj0gOCA/IElSUV9FSU5UKDE2KSArIHBpbiAtIDggOiAtRU5YSU87Cit9CisjZW5kaWYKKworc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHMzYzI0eHhfZ3Bpb3NbXSA9IHsKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCisJeworCQkuY29uZmlnCT0gJnMzYzI0eHhfZ3Bpb2NmZ19iYW5rYSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQkJCT0gUzNDMjQxMF9HUEEoMCksCisJCQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCQkJLmxhYmVsCQkJPSAiR1BJT0EiLAorCQkJLm5ncGlvCQkJPSAyNCwKKwkJCS5kaXJlY3Rpb25faW5wdXQJPSBzM2MyNHh4X2dwaW9saWJfYmFua2FfaW5wdXQsCisJCQkuZGlyZWN0aW9uX291dHB1dAk9IHMzYzI0eHhfZ3Bpb2xpYl9iYW5rYV9vdXRwdXQsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDMjQxMF9HUEIoMCksCisJCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJCS5sYWJlbAk9ICJHUElPQiIsCisJCQkubmdwaW8JPSAxNiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0MyNDEwX0dQQygwKSwKKwkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLmxhYmVsCT0gIkdQSU9DIiwKKwkJCS5uZ3Bpbwk9IDE2LAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzI0MTBfR1BEKDApLAorCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCQkubGFiZWwJPSAiR1BJT0QiLAorCQkJLm5ncGlvCT0gMTYsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDMjQxMF9HUEUoMCksCisJCQkubGFiZWwJPSAiR1BJT0UiLAorCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCQkubmdwaW8JPSAxNiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0MyNDEwX0dQRigwKSwKKwkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLmxhYmVsCT0gIkdQSU9GIiwKKwkJCS5uZ3Bpbwk9IDgsCisJCQkudG9faXJxCT0gczNjMjR4eF9ncGlvbGliX2ZiYW5rX3RvX2lycSwKKwkJfSwKKwl9LCB7CisJCS5pcnFfYmFzZSA9IElSUV9FSU5UOCwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzI0MTBfR1BHKDApLAorCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCQkubGFiZWwJPSAiR1BJT0ciLAorCQkJLm5ncGlvCT0gMTYsCisJCQkudG9faXJxCT0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0MyNDEwX0dQSCgwKSwKKwkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLmxhYmVsCT0gIkdQSU9IIiwKKwkJCS5uZ3Bpbwk9IDExLAorCQl9LAorCX0sCisJCS8qIEdQSU9TIGZvciB0aGUgUzNDMjQ0MyBhbmQgbGF0ZXIgZGV2aWNlcy4gKi8KKwl7CisJCS5iYXNlCT0gUzNDMjQ0MF9HUEpDT04sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0MyNDEwX0dQSigwKSwKKwkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLmxhYmVsCT0gIkdQSU9KIiwKKwkJCS5uZ3Bpbwk9IDE2LAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0MyNDQzX0dQS0NPTiwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzI0MTBfR1BLKDApLAorCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCQkubGFiZWwJPSAiR1BJT0siLAorCQkJLm5ncGlvCT0gMTYsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzI0NDNfR1BMQ09OLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDMjQxMF9HUEwoMCksCisJCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJCS5sYWJlbAk9ICJHUElPTCIsCisJCQkubmdwaW8JPSAxNSwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzNDMjQ0M19HUE1DT04sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0MyNDEwX0dQTSgwKSwKKwkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLmxhYmVsCT0gIkdQSU9NIiwKKwkJCS5uZ3Bpbwk9IDIsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworLyoKKyAqIEdQSU8gYmFuayBzdW1tYXJ5OgorICoKKyAqIEJhbmsJR1BJT3MJU3R5bGUJU2xwQ29uCUV4dEludCBHcm91cAorICogQQk4CTRCaXQJWWVzCTEKKyAqIEIJNwk0Qml0CVllcwkxCisgKiBDCTgJNEJpdAlZZXMJMgorICogRAk1CTRCaXQJWWVzCTMKKyAqIEUJNQk0Qml0CVllcwlOb25lCisgKiBGCTE2CTJCaXQJWWVzCTQgWzFdCisgKiBHCTcJNEJpdAlZZXMJNQorICogSAkxMAk0Qml0WzJdCVllcwk2CisgKiBJCTE2CTJCaXQJWWVzCU5vbmUKKyAqIEoJMTIJMkJpdAlZZXMJTm9uZQorICogSwkxNgk0Qml0WzJdCU5vCU5vbmUKKyAqIEwJMTUJNEJpdFsyXSBObwlOb25lCisgKiBNCTYJNEJpdAlObwlJUlFfRUlOVAorICogTgkxNgkyQml0CU5vCUlSUV9FSU5UCisgKiBPCTE2CTJCaXQJWWVzCTcKKyAqIFAJMTUJMkJpdAlZZXMJOAorICogUQk5CTJCaXQJWWVzCTkKKyAqCisgKiBbMV0gQkFOS0YgcGlucyAxNCwxNSBkbyBub3QgZm9ybSBwYXJ0IG9mIHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlcworICogWzJdIEJBTksgaGFzIHR3byBjb250cm9sIHJlZ2lzdGVycywgR1B4Q09OMCBhbmQgR1B4Q09OMQorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgczNjNjR4eF9ncGlvc180Yml0W10gPSB7CisjaWZkZWYgQ09ORklHX1BMQVRfUzNDNjRYWAorCXsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BBKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0FfTlIsCisJCQkubGFiZWwJPSAiR1BBIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQQigwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19CX05SLAorCQkJLmxhYmVsCT0gIkdQQiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEMoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fQ19OUiwKKwkJCS5sYWJlbAk9ICJHUEMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BEKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0RfTlIsCisJCQkubGFiZWwJPSAiR1BEIiwKKwkJfSwKKwl9LCB7CisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbMF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQRSgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19FX05SLAorCQkJLmxhYmVsCT0gIkdQRSIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzY0WFhfR1BHX0JBU0UsCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQRygwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19HX05SLAorCQkJLmxhYmVsCT0gIkdQRyIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzY0WFhfR1BNX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbMV0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQTSgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19NX05SLAorCQkJLmxhYmVsCT0gIkdQTSIsCisJCQkudG9faXJxID0gczNjNjR4eF9ncGlvbGliX21iYW5rX3RvX2lycSwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHMzYzY0eHhfZ3Bpb3NfNGJpdDJbXSA9IHsKKyNpZmRlZiBDT05GSUdfUExBVF9TM0M2NFhYCisJeworCQkuYmFzZQk9IFMzQzY0WFhfR1BIX0JBU0UgKyAweDQsCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQSCgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19IX05SLAorCQkJLmxhYmVsCT0gIkdQSCIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzY0WFhfR1BLX0JBU0UgKyAweDQsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbMF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQSygwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19LX05SLAorCQkJLmxhYmVsCT0gIkdQSyIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzY0WFhfR1BMX0JBU0UgKyAweDQsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbMV0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQTCgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19MX05SLAorCQkJLmxhYmVsCT0gIkdQTCIsCisJCQkudG9faXJxID0gczNjNjR4eF9ncGlvbGliX2xiYW5rX3RvX2lycSwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHMzYzY0eHhfZ3Bpb3NfMmJpdFtdID0geworI2lmZGVmIENPTkZJR19QTEFUX1MzQzY0WFgKKwl7CisJCS5iYXNlCT0gUzNDNjRYWF9HUEZfQkFTRSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s2XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BGKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0ZfTlIsCisJCQkubGFiZWwJPSAiR1BGIiwKKwkJfSwKKwl9LCB7CisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbN10sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQSSgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19JX05SLAorCQkJLmxhYmVsCT0gIkdQSSIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzddLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEooMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fSl9OUiwKKwkJCS5sYWJlbAk9ICJHUEoiLAorCQl9LAorCX0sIHsKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s2XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BPKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX09fTlIsCisJCQkubGFiZWwJPSAiR1BPIiwKKwkJfSwKKwl9LCB7CisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNl0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQUCgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19QX05SLAorCQkJLmxhYmVsCT0gIkdQUCIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzZdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUFEoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fUV9OUiwKKwkJCS5sYWJlbAk9ICJHUFEiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQTl9CQVNFLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgwKSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s1XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BOKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX05fTlIsCisJCQkubGFiZWwJPSAiR1BOIiwKKwkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAorCQl9LAorCX0sCisjZW5kaWYKK307CisKKy8qCisgKiBTNVA2NDQwIEdQSU8gYmFuayBzdW1tYXJ5OgorICoKKyAqIEJhbmsJR1BJT3MJU3R5bGUJU2xwQ29uCUV4dEludCBHcm91cAorICogQQk2CTRCaXQJWWVzCTEKKyAqIEIJNwk0Qml0CVllcwkxCisgKiBDCTgJNEJpdAlZZXMJMgorICogRgkyCTJCaXQJWWVzCTQgWzFdCisgKiBHCTcJNEJpdAlZZXMJNQorICogSAkxMAk0Qml0WzJdCVllcwk2CisgKiBJCTE2CTJCaXQJWWVzCU5vbmUKKyAqIEoJMTIJMkJpdAlZZXMJTm9uZQorICogTgkxNgkyQml0CU5vCUlSUV9FSU5UCisgKiBQCTgJMkJpdAlZZXMJOAorICogUgkxNQk0Qml0WzJdCVllcwk4CisgKi8KKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzNXA2NDQwX2dwaW9zXzRiaXRbXSA9IHsKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UDY0NDAKKwl7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDQwX0dQQSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NDBfR1BJT19BX05SLAorCQkJLmxhYmVsCT0gIkdQQSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ0MF9HUEIoMCksCisJCQkubmdwaW8JPSBTNVA2NDQwX0dQSU9fQl9OUiwKKwkJCS5sYWJlbAk9ICJHUEIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NDBfR1BDKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ0MF9HUElPX0NfTlIsCisJCQkubGFiZWwJPSAiR1BDIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzVQNjRYMF9HUEdfQkFTRSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NDBfR1BHKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ0MF9HUElPX0dfTlIsCisJCQkubGFiZWwJPSAiR1BHIiwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHM1cDY0NDBfZ3Bpb3NfNGJpdDJbXSA9IHsKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UDY0NDAKKwl7CisJCS5iYXNlCT0gUzVQNjRYMF9HUEhfQkFTRSArIDB4NCwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NDBfR1BIKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ0MF9HUElPX0hfTlIsCisJCQkubGFiZWwJPSAiR1BIIiwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHM1cDY0NDBfZ3Bpb3NfcmJhbmtbXSA9IHsKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UDY0NDAKKwl7CisJCS5iYXNlCT0gUzVQNjRYMF9HUFJfQkFTRSArIDB4NCwKKwkJLmNvbmZpZwk9ICZzNXA2NHgwX2dwaW9fY2ZnX3JiYW5rLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ0MF9HUFIoMCksCisJCQkubmdwaW8JPSBTNVA2NDQwX0dQSU9fUl9OUiwKKwkJCS5sYWJlbAk9ICJHUFIiLAorCQl9LAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgczVwNjQ0MF9ncGlvc18yYml0W10gPSB7CisjaWZkZWYgQ09ORklHX0NQVV9TNVA2NDQwCisJeworCQkuYmFzZQk9IFM1UDY0WDBfR1BGX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNl0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDQwX0dQRigwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NDBfR1BJT19GX05SLAorCQkJLmxhYmVsCT0gIkdQRiIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0WDBfR1BJX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDQwX0dQSSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NDBfR1BJT19JX05SLAorCQkJLmxhYmVsCT0gIkdQSSIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0WDBfR1BKX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDQwX0dQSigwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NDBfR1BJT19KX05SLAorCQkJLmxhYmVsCT0gIkdQSiIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0WDBfR1BOX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNV0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDQwX0dQTigwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NDBfR1BJT19OX05SLAorCQkJLmxhYmVsCT0gIkdQTiIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0WDBfR1BQX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNl0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDQwX0dQUCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NDBfR1BJT19QX05SLAorCQkJLmxhYmVsCT0gIkdQUCIsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworLyoKKyAqIFM1UDY0NTAgR1BJTyBiYW5rIHN1bW1hcnk6CisgKgorICogQmFuawlHUElPcwlTdHlsZQlTbHBDb24JRXh0SW50IEdyb3VwCisgKiBBCTYJNEJpdAlZZXMJMQorICogQgk3CTRCaXQJWWVzCTEKKyAqIEMJOAk0Qml0CVllcwkyCisgKiBECTgJNEJpdAlZZXMJTm9uZQorICogRgkyCTJCaXQJWWVzCU5vbmUKKyAqIEcJMTQJNEJpdFsyXQlZZXMJNQorICogSAkxMAk0Qml0WzJdCVllcwk2CisgKiBJCTE2CTJCaXQJWWVzCU5vbmUKKyAqIEoJMTIJMkJpdAlZZXMJTm9uZQorICogSwk1CTRCaXQJWWVzCU5vbmUKKyAqIE4JMTYJMkJpdAlObwlJUlFfRUlOVAorICogUAkxMQkyQml0CVllcwk4CisgKiBRCTE0CTJCaXQJWWVzCU5vbmUKKyAqIFIJMTUJNEJpdFsyXQlZZXMJTm9uZQorICogUwk4CTJCaXQJWWVzCU5vbmUKKyAqCisgKiBbMV0gQkFOS0YgcGlucyAxNCwxNSBkbyBub3QgZm9ybSBwYXJ0IG9mIHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlcworICogWzJdIEJBTksgaGFzIHR3byBjb250cm9sIHJlZ2lzdGVycywgR1B4Q09OMCBhbmQgR1B4Q09OMQorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgczVwNjQ1MF9ncGlvc180Yml0W10gPSB7CisjaWZkZWYgQ09ORklHX0NQVV9TNVA2NDUwCisJeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ1MF9HUEEoMCksCisJCQkubmdwaW8JPSBTNVA2NDUwX0dQSU9fQV9OUiwKKwkJCS5sYWJlbAk9ICJHUEEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BCKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX0JfTlIsCisJCQkubGFiZWwJPSAiR1BCIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQQygwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19DX05SLAorCQkJLmxhYmVsCT0gIkdQQyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ1MF9HUEQoMCksCisJCQkubmdwaW8JPSBTNVA2NDUwX0dQSU9fRF9OUiwKKwkJCS5sYWJlbAk9ICJHUEQiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTNVA2NDUwX0dQS19CQVNFLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ1MF9HUEsoMCksCisJCQkubmdwaW8JPSBTNVA2NDUwX0dQSU9fS19OUiwKKwkJCS5sYWJlbAk9ICJHUEsiLAorCQl9LAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgczVwNjQ1MF9ncGlvc180Yml0MltdID0geworI2lmZGVmIENPTkZJR19DUFVfUzVQNjQ1MAorCXsKKwkJLmJhc2UJPSBTNVA2NFgwX0dQR19CQVNFICsgMHg0LAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ1MF9HUEcoMCksCisJCQkubmdwaW8JPSBTNVA2NDUwX0dQSU9fR19OUiwKKwkJCS5sYWJlbAk9ICJHUEciLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTNVA2NFgwX0dQSF9CQVNFICsgMHg0LAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ1MF9HUEgoMCksCisJCQkubmdwaW8JPSBTNVA2NDUwX0dQSU9fSF9OUiwKKwkJCS5sYWJlbAk9ICJHUEgiLAorCQl9LAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgczVwNjQ1MF9ncGlvc19yYmFua1tdID0geworI2lmZGVmIENPTkZJR19DUFVfUzVQNjQ1MAorCXsKKwkJLmJhc2UJPSBTNVA2NFgwX0dQUl9CQVNFICsgMHg0LAorCQkuY29uZmlnCT0gJnM1cDY0eDBfZ3Bpb19jZmdfcmJhbmssCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQUigwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19SX05SLAorCQkJLmxhYmVsCT0gIkdQUiIsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzNXA2NDUwX2dwaW9zXzJiaXRbXSA9IHsKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UDY0NTAKKwl7CisJCS5iYXNlCT0gUzVQNjRYMF9HUEZfQkFTRSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s2XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BGKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX0ZfTlIsCisJCQkubGFiZWwJPSAiR1BGIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzVQNjRYMF9HUElfQkFTRSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s0XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BJKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX0lfTlIsCisJCQkubGFiZWwJPSAiR1BJIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzVQNjRYMF9HUEpfQkFTRSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s0XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BKKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX0pfTlIsCisJCQkubGFiZWwJPSAiR1BKIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzVQNjRYMF9HUE5fQkFTRSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s1XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BOKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX05fTlIsCisJCQkubGFiZWwJPSAiR1BOIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzVQNjRYMF9HUFBfQkFTRSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s2XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BQKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX1BfTlIsCisJCQkubGFiZWwJPSAiR1BQIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzVQNjQ1MF9HUFFfQkFTRSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s1XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BRKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX1FfTlIsCisJCQkubGFiZWwJPSAiR1BRIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzVQNjQ1MF9HUFNfQkFTRSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s2XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BTKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX1NfTlIsCisJCQkubGFiZWwJPSAiR1BTIiwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCisvKgorICogUzVQQzEwMCBHUElPIGJhbmsgc3VtbWFyeToKKyAqCisgKiBCYW5rCUdQSU9zCVN0eWxlCUlOVCBUeXBlCisgKiBBMAk4CTRCaXQJR1BJT19JTlQwCisgKiBBMQk1CTRCaXQJR1BJT19JTlQxCisgKiBCCTgJNEJpdAlHUElPX0lOVDIKKyAqIEMJNQk0Qml0CUdQSU9fSU5UMworICogRAk3CTRCaXQJR1BJT19JTlQ0CisgKiBFMAk4CTRCaXQJR1BJT19JTlQ1CisgKiBFMQk2CTRCaXQJR1BJT19JTlQ2CisgKiBGMAk4CTRCaXQJR1BJT19JTlQ3CisgKiBGMQk4CTRCaXQJR1BJT19JTlQ4CisgKiBGMgk4CTRCaXQJR1BJT19JTlQ5CisgKiBGMwk0CTRCaXQJR1BJT19JTlQxMAorICogRzAJOAk0Qml0CUdQSU9fSU5UMTEKKyAqIEcxCTMJNEJpdAlHUElPX0lOVDEyCisgKiBHMgk3CTRCaXQJR1BJT19JTlQxMworICogRzMJNwk0Qml0CUdQSU9fSU5UMTQKKyAqIEgwCTgJNEJpdAlXS1VQX0lOVAorICogSDEJOAk0Qml0CVdLVVBfSU5UCisgKiBIMgk4CTRCaXQJV0tVUF9JTlQKKyAqIEgzCTgJNEJpdAlXS1VQX0lOVAorICogSQk4CTRCaXQJR1BJT19JTlQxNQorICogSjAJOAk0Qml0CUdQSU9fSU5UMTYKKyAqIEoxCTUJNEJpdAlHUElPX0lOVDE3CisgKiBKMgk4CTRCaXQJR1BJT19JTlQxOAorICogSjMJOAk0Qml0CUdQSU9fSU5UMTkKKyAqIEo0CTQJNEJpdAlHUElPX0lOVDIwCisgKiBLMAk4CTRCaXQJTm9uZQorICogSzEJNgk0Qml0CU5vbmUKKyAqIEsyCTgJNEJpdAlOb25lCisgKiBLMwk4CTRCaXQJTm9uZQorICogTDAJOAk0Qml0CU5vbmUKKyAqIEwxCTgJNEJpdAlOb25lCisgKiBMMgk4CTRCaXQJTm9uZQorICogTDMJOAk0Qml0CU5vbmUKKyAqLworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHM1cGMxMDBfZ3Bpb3NfNGJpdFtdID0geworI2lmZGVmIENPTkZJR19DUFVfUzVQQzEwMAorCXsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BBMCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19BMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEEwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQQTEoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fQTFfTlIsCisJCQkubGFiZWwJPSAiR1BBMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEIoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fQl9OUiwKKwkJCS5sYWJlbAk9ICJHUEIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BDKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0NfTlIsCisJCQkubGFiZWwJPSAiR1BDIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQRCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19EX05SLAorCQkJLmxhYmVsCT0gIkdQRCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEUwKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0UwX05SLAorCQkJLmxhYmVsCT0gIkdQRTAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BFMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19FMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEUxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQRjAoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRjBfTlIsCisJCQkubGFiZWwJPSAiR1BGMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEYxKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0YxX05SLAorCQkJLmxhYmVsCT0gIkdQRjEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BGMigwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19GMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEYyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQRjMoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRjNfTlIsCisJCQkubGFiZWwJPSAiR1BGMyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEcwKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0cwX05SLAorCQkJLmxhYmVsCT0gIkdQRzAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BHMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19HMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEcxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQRzIoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRzJfTlIsCisJCQkubGFiZWwJPSAiR1BHMiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEczKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0czX05SLAorCQkJLmxhYmVsCT0gIkdQRzMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BJKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0lfTlIsCisJCQkubGFiZWwJPSAiR1BJIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSjAoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSjBfTlIsCisJCQkubGFiZWwJPSAiR1BKMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEoxKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0oxX05SLAorCQkJLmxhYmVsCT0gIkdQSjEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BKMigwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19KMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEoyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSjMoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSjNfTlIsCisJCQkubGFiZWwJPSAiR1BKMyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEo0KDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0o0X05SLAorCQkJLmxhYmVsCT0gIkdQSjQiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BLMCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19LMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEswIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSzEoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSzFfTlIsCisJCQkubGFiZWwJPSAiR1BLMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEsyKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0syX05SLAorCQkJLmxhYmVsCT0gIkdQSzIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BLMygwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19LM19OUiwKKwkJCS5sYWJlbAk9ICJHUEszIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQTDAoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fTDBfTlIsCisJCQkubGFiZWwJPSAiR1BMMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEwxKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0wxX05SLAorCQkJLmxhYmVsCT0gIkdQTDEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BMMigwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19MMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEwyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQTDMoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fTDNfTlIsCisJCQkubGFiZWwJPSAiR1BMMyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEw0KDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0w0X05SLAorCQkJLmxhYmVsCT0gIkdQTDQiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEMwMCksCisJCS5pcnFfYmFzZSA9IElSUV9FSU5UKDApLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEgwKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0gwX05SLAorCQkJLmxhYmVsCT0gIkdQSDAiLAorCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzIwKSwKKwkJLmlycV9iYXNlID0gSVJRX0VJTlQoOCksCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSDEoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSDFfTlIsCisJCQkubGFiZWwJPSAiR1BIMSIsCisJCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDNDApLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgxNiksCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSDIoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSDJfTlIsCisJCQkubGFiZWwJPSAiR1BIMiIsCisJCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDNjApLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgyNCksCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSDMoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSDNfTlIsCisJCQkubGFiZWwJPSAiR1BIMyIsCisJCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCisvKgorICogRm9sbG93aW5ncyBhcmUgdGhlIGdwaW8gYmFua3MgaW4gUzVQVjIxMC9TNVBDMTEwCisgKgorICogVGhlICdjb25maWcnIG1lbWJlciB3aGVuIGxlZnQgdG8gTlVMTCwgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQKKyAqIHN0cnVjdHVyZSBzYW1zdW5nX2dwaW9fY2Znc1szXSBpbiB0aGUgaW5pdCBmdW5jdGlvbiBiZWxvdy4KKyAqCisgKiBUaGUgJ2Jhc2UnIG1lbWJlciBpcyBhbHNvIGluaXRpYWxpemVkIGluIHRoZSBpbml0IGZ1bmN0aW9uIGJlbG93LgorICogTm90ZTogVGhlIGluaXRpYWxpemF0aW9uIG9mICdiYXNlJyBtZW1iZXIgb2Ygc2Ftc3VuZ19ncGlvX2NoaXAgc3RydWN0dXJlCisgKiB1c2VzIHRoZSBhYm92ZSBtYWNybyBhbmQgZGVwZW5kcyBvbiB0aGUgYmFua3MgYmVpbmcgbGlzdGVkIGluIG9yZGVyIGhlcmUuCisgKi8KKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzNXB2MjEwX2dwaW9zXzRiaXRbXSA9IHsKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UFYyMTAKKwl7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQQTAoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fQTBfTlIsCisJCQkubGFiZWwJPSAiR1BBMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEExKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0ExX05SLAorCQkJLmxhYmVsCT0gIkdQQTEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BCKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0JfTlIsCisJCQkubGFiZWwJPSAiR1BCIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQQzAoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fQzBfTlIsCisJCQkubGFiZWwJPSAiR1BDMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEMxKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0MxX05SLAorCQkJLmxhYmVsCT0gIkdQQzEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BEMCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19EMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEQwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQRDEoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRDFfTlIsCisJCQkubGFiZWwJPSAiR1BEMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEUwKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0UwX05SLAorCQkJLmxhYmVsCT0gIkdQRTAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BFMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19FMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEUxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQRjAoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRjBfTlIsCisJCQkubGFiZWwJPSAiR1BGMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEYxKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0YxX05SLAorCQkJLmxhYmVsCT0gIkdQRjEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BGMigwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19GMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEYyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQRjMoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRjNfTlIsCisJCQkubGFiZWwJPSAiR1BGMyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEcwKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0cwX05SLAorCQkJLmxhYmVsCT0gIkdQRzAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BHMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19HMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEcxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQRzIoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRzJfTlIsCisJCQkubGFiZWwJPSAiR1BHMiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEczKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0czX05SLAorCQkJLmxhYmVsCT0gIkdQRzMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BJKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0lfTlIsCisJCQkubGFiZWwJPSAiR1BJIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQSjAoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSjBfTlIsCisJCQkubGFiZWwJPSAiR1BKMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEoxKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0oxX05SLAorCQkJLmxhYmVsCT0gIkdQSjEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BKMigwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19KMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEoyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQSjMoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSjNfTlIsCisJCQkubGFiZWwJPSAiR1BKMyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEo0KDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0o0X05SLAorCQkJLmxhYmVsCT0gIkdQSjQiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfTVAwMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19NUDAxX05SLAorCQkJLmxhYmVsCT0gIk1QMDEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfTVAwMigwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19NUDAyX05SLAorCQkJLmxhYmVsCT0gIk1QMDIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfTVAwMygwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19NUDAzX05SLAorCQkJLmxhYmVsCT0gIk1QMDMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfTVAwNCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19NUDA0X05SLAorCQkJLmxhYmVsCT0gIk1QMDQiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfTVAwNSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19NUDA1X05SLAorCQkJLmxhYmVsCT0gIk1QMDUiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEMwMCksCisJCS5pcnFfYmFzZSA9IElSUV9FSU5UKDApLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEgwKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0gwX05SLAorCQkJLmxhYmVsCT0gIkdQSDAiLAorCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzIwKSwKKwkJLmlycV9iYXNlID0gSVJRX0VJTlQoOCksCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQSDEoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSDFfTlIsCisJCQkubGFiZWwJPSAiR1BIMSIsCisJCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDNDApLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgxNiksCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQSDIoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSDJfTlIsCisJCQkubGFiZWwJPSAiR1BIMiIsCisJCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDNjApLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgyNCksCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQSDMoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSDNfTlIsCisJCQkubGFiZWwJPSAiR1BIMyIsCisJCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCisvKgorICogRm9sbG93aW5ncyBhcmUgdGhlIGdwaW8gYmFua3MgaW4gRVhZTk9TNDIxMAorICoKKyAqIFRoZSAnY29uZmlnJyBtZW1iZXIgd2hlbiBsZWZ0IHRvIE5VTEwsIGlzIGluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0CisgKiBzdHJ1Y3R1cmUgc2Ftc3VuZ19ncGlvX2NmZ3NbM10gaW4gdGhlIGluaXQgZnVuY3Rpb24gYmVsb3cuCisgKgorICogVGhlICdiYXNlJyBtZW1iZXIgaXMgYWxzbyBpbml0aWFsaXplZCBpbiB0aGUgaW5pdCBmdW5jdGlvbiBiZWxvdy4KKyAqIE5vdGU6IFRoZSBpbml0aWFsaXphdGlvbiBvZiAnYmFzZScgbWVtYmVyIG9mIHNhbXN1bmdfZ3Bpb19jaGlwIHN0cnVjdHVyZQorICogdXNlcyB0aGUgYWJvdmUgbWFjcm8gYW5kIGRlcGVuZHMgb24gdGhlIGJhbmtzIGJlaW5nIGxpc3RlZCBpbiBvcmRlciBoZXJlLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgZXh5bm9zNF9ncGlvc18xW10gPSB7CisjaWZkZWYgQ09ORklHX0FSQ0hfRVhZTk9TNAorCXsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BBMCgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19BMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEEwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQQTEoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fQTFfTlIsCisJCQkubGFiZWwJPSAiR1BBMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEIoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fQl9OUiwKKwkJCS5sYWJlbAk9ICJHUEIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BDMCgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19DMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEMwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQQzEoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fQzFfTlIsCisJCQkubGFiZWwJPSAiR1BDMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEQwKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0QwX05SLAorCQkJLmxhYmVsCT0gIkdQRDAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BEMSgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19EMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEQxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQRTAoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRTBfTlIsCisJCQkubGFiZWwJPSAiR1BFMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEUxKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0UxX05SLAorCQkJLmxhYmVsCT0gIkdQRTEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BFMigwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19FMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEUyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQRTMoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRTNfTlIsCisJCQkubGFiZWwJPSAiR1BFMyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEU0KDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0U0X05SLAorCQkJLmxhYmVsCT0gIkdQRTQiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BGMCgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19GMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEYwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQRjEoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRjFfTlIsCisJCQkubGFiZWwJPSAiR1BGMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEYyKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0YyX05SLAorCQkJLmxhYmVsCT0gIkdQRjIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BGMygwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19GM19OUiwKKwkJCS5sYWJlbAk9ICJHUEYzIiwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIGV4eW5vczRfZ3Bpb3NfMltdID0geworI2lmZGVmIENPTkZJR19BUkNIX0VYWU5PUzQKKwl7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQSjAoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fSjBfTlIsCisJCQkubGFiZWwJPSAiR1BKMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEoxKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0oxX05SLAorCQkJLmxhYmVsCT0gIkdQSjEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BLMCgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19LMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEswIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQSzEoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fSzFfTlIsCisJCQkubGFiZWwJPSAiR1BLMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEsyKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0syX05SLAorCQkJLmxhYmVsCT0gIkdQSzIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BLMygwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19LM19OUiwKKwkJCS5sYWJlbAk9ICJHUEszIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQTDAoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fTDBfTlIsCisJCQkubGFiZWwJPSAiR1BMMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEwxKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0wxX05SLAorCQkJLmxhYmVsCT0gIkdQTDEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BMMigwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19MMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEwyIiwKKwkJfSwKKwl9LCB7CisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbOF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTAoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTBfTlIsCisJCQkubGFiZWwJPSAiR1BZMCIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzhdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUFkxKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1kxX05SLAorCQkJLmxhYmVsCT0gIkdQWTEiLAorCQl9LAorCX0sIHsKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s4XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BZMigwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19ZMl9OUiwKKwkJCS5sYWJlbAk9ICJHUFkyIiwKKwkJfSwKKwl9LCB7CisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbOF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTMoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTNfTlIsCisJCQkubGFiZWwJPSAiR1BZMyIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzhdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUFk0KDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1k0X05SLAorCQkJLmxhYmVsCT0gIkdQWTQiLAorCQl9LAorCX0sIHsKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s4XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BZNSgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19ZNV9OUiwKKwkJCS5sYWJlbAk9ICJHUFk1IiwKKwkJfSwKKwl9LCB7CisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbOF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTYoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTZfTlIsCisJCQkubGFiZWwJPSAiR1BZNiIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IChTNVBfVkFfR1BJTzIgKyAweEMwMCksCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbOV0sCisJCS5pcnFfYmFzZSA9IElSUV9FSU5UKDApLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUFgwKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1gwX05SLAorCQkJLmxhYmVsCT0gIkdQWDAiLAorCQkJLnRvX2lycQk9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IChTNVBfVkFfR1BJTzIgKyAweEMyMCksCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbOV0sCisJCS5pcnFfYmFzZSA9IElSUV9FSU5UKDgpLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUFgxKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1gxX05SLAorCQkJLmxhYmVsCT0gIkdQWDEiLAorCQkJLnRvX2lycQk9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IChTNVBfVkFfR1BJTzIgKyAweEM0MCksCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbOV0sCisJCS5pcnFfYmFzZSA9IElSUV9FSU5UKDE2KSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BYMigwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19YMl9OUiwKKwkJCS5sYWJlbAk9ICJHUFgyIiwKKwkJCS50b19pcnEJPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8yICsgMHhDNjApLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzldLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgyNCksCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQWDMoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWDNfTlIsCisJCQkubGFiZWwJPSAiR1BYMyIsCisJCQkudG9faXJxCT0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIGV4eW5vczRfZ3Bpb3NfM1tdID0geworI2lmZGVmIENPTkZJR19BUkNIX0VYWU5PUzQKKwl7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQWigwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19aX05SLAorCQkJLmxhYmVsCT0gIkdQWiIsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworLyogVE9ETzogY2xlYW51cCBzb2NfaXNfKiAqLworc3RhdGljIF9faW5pdCBpbnQgc2Ftc3VuZ19ncGlvbGliX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXA7CisJaW50IGksIG5yX2NoaXBzOworCWludCBncm91cCA9IDA7CisKKwlzYW1zdW5nX2dwaW9saWJfc2V0X2NmZyhzYW1zdW5nX2dwaW9fY2ZncywgQVJSQVlfU0laRShzYW1zdW5nX2dwaW9fY2ZncykpOworCisJaWYgKHNvY19pc19zM2MyNHh4KCkpIHsKKwkJczNjMjR4eF9ncGlvbGliX2FkZF9jaGlwcyhzM2MyNHh4X2dwaW9zLAorCQkJCUFSUkFZX1NJWkUoczNjMjR4eF9ncGlvcyksIFMzQzI0WFhfVkFfR1BJTyk7CisJfSBlbHNlIGlmIChzb2NfaXNfczNjNjR4eCgpKSB7CisJCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfMmJpdF9jaGlwcyhzM2M2NHh4X2dwaW9zXzJiaXQsCisJCQkJQVJSQVlfU0laRShzM2M2NHh4X2dwaW9zXzJiaXQpLAorCQkJCVMzQzY0WFhfVkFfR1BJTyArIDB4RTAsIDB4MjApOworCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoczNjNjR4eF9ncGlvc180Yml0LAorCQkJCUFSUkFZX1NJWkUoczNjNjR4eF9ncGlvc180Yml0KSwKKwkJCQlTM0M2NFhYX1ZBX0dQSU8pOworCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQyX2NoaXBzKHMzYzY0eHhfZ3Bpb3NfNGJpdDIsCisJCQkJQVJSQVlfU0laRShzM2M2NHh4X2dwaW9zXzRiaXQyKSk7CisJfSBlbHNlIGlmIChzb2NfaXNfczVwNjQ0MCgpKSB7CisJCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfMmJpdF9jaGlwcyhzNXA2NDQwX2dwaW9zXzJiaXQsCisJCQkJQVJSQVlfU0laRShzNXA2NDQwX2dwaW9zXzJiaXQpLCBOVUxMLCAweDApOworCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoczVwNjQ0MF9ncGlvc180Yml0LAorCQkJCUFSUkFZX1NJWkUoczVwNjQ0MF9ncGlvc180Yml0KSwgUzVQX1ZBX0dQSU8pOworCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQyX2NoaXBzKHM1cDY0NDBfZ3Bpb3NfNGJpdDIsCisJCQkJQVJSQVlfU0laRShzNXA2NDQwX2dwaW9zXzRiaXQyKSk7CisJCXM1cDY0eDBfZ3Bpb2xpYl9hZGRfcmJhbmsoczVwNjQ0MF9ncGlvc19yYmFuaywKKwkJCQlBUlJBWV9TSVpFKHM1cDY0NDBfZ3Bpb3NfcmJhbmspKTsKKwl9IGVsc2UgaWYgKHNvY19pc19zNXA2NDUwKCkpIHsKKwkJc2Ftc3VuZ19ncGlvbGliX2FkZF8yYml0X2NoaXBzKHM1cDY0NTBfZ3Bpb3NfMmJpdCwKKwkJCQlBUlJBWV9TSVpFKHM1cDY0NTBfZ3Bpb3NfMmJpdCksIE5VTEwsIDB4MCk7CisJCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyhzNXA2NDUwX2dwaW9zXzRiaXQsCisJCQkJQVJSQVlfU0laRShzNXA2NDUwX2dwaW9zXzRiaXQpLCBTNVBfVkFfR1BJTyk7CisJCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdDJfY2hpcHMoczVwNjQ1MF9ncGlvc180Yml0MiwKKwkJCQlBUlJBWV9TSVpFKHM1cDY0NTBfZ3Bpb3NfNGJpdDIpKTsKKwkJczVwNjR4MF9ncGlvbGliX2FkZF9yYmFuayhzNXA2NDUwX2dwaW9zX3JiYW5rLAorCQkJCUFSUkFZX1NJWkUoczVwNjQ1MF9ncGlvc19yYmFuaykpOworCX0gZWxzZSBpZiAoc29jX2lzX3M1cGMxMDAoKSkgeworCQlncm91cCA9IDA7CisJCWNoaXAgPSBzNXBjMTAwX2dwaW9zXzRiaXQ7CisJCW5yX2NoaXBzID0gQVJSQVlfU0laRShzNXBjMTAwX2dwaW9zXzRiaXQpOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9jaGlwczsgaSsrLCBjaGlwKyspIHsKKwkJCWlmICghY2hpcC0+Y29uZmlnKSB7CisJCQkJY2hpcC0+Y29uZmlnID0gJnNhbXN1bmdfZ3Bpb19jZmdzWzNdOworCQkJCWNoaXAtPmdyb3VwID0gZ3JvdXArKzsKKwkJCX0KKwkJfQorCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoczVwYzEwMF9ncGlvc180Yml0LCBucl9jaGlwcywgUzVQX1ZBX0dQSU8pOworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TNVBDMTAwKSAmJiBkZWZpbmVkKENPTkZJR19TNVBfR1BJT19JTlQpCisJCXM1cF9yZWdpc3Rlcl9ncGlvaW50X2JhbmsoSVJRX0dQSU9JTlQsIDAsIFM1UF9HUElPSU5UX0dST1VQX01BWE5SKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoc29jX2lzX3M1cHYyMTAoKSkgeworCQlncm91cCA9IDA7CisJCWNoaXAgPSBzNXB2MjEwX2dwaW9zXzRiaXQ7CisJCW5yX2NoaXBzID0gQVJSQVlfU0laRShzNXB2MjEwX2dwaW9zXzRiaXQpOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9jaGlwczsgaSsrLCBjaGlwKyspIHsKKwkJCWlmICghY2hpcC0+Y29uZmlnKSB7CisJCQkJY2hpcC0+Y29uZmlnID0gJnNhbXN1bmdfZ3Bpb19jZmdzWzNdOworCQkJCWNoaXAtPmdyb3VwID0gZ3JvdXArKzsKKwkJCX0KKwkJfQorCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoczVwdjIxMF9ncGlvc180Yml0LCBucl9jaGlwcywgUzVQX1ZBX0dQSU8pOworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TNVBWMjEwKSAmJiBkZWZpbmVkKENPTkZJR19TNVBfR1BJT19JTlQpCisJCXM1cF9yZWdpc3Rlcl9ncGlvaW50X2JhbmsoSVJRX0dQSU9JTlQsIDAsIFM1UF9HUElPSU5UX0dST1VQX01BWE5SKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoc29jX2lzX2V4eW5vczQyMTAoKSkgeworCQlncm91cCA9IDA7CisKKwkJLyogZ3BpbyBwYXJ0MSAqLworCQljaGlwID0gZXh5bm9zNF9ncGlvc18xOworCQlucl9jaGlwcyA9IEFSUkFZX1NJWkUoZXh5bm9zNF9ncGlvc18xKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hpcHM7IGkrKywgY2hpcCsrKSB7CisJCQlpZiAoIWNoaXAtPmNvbmZpZykgeworCQkJCWNoaXAtPmNvbmZpZyA9ICZleHlub3M0X2dwaW9fY2ZnOworCQkJCWNoaXAtPmdyb3VwID0gZ3JvdXArKzsKKwkJCX0KKwkJfQorCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoZXh5bm9zNF9ncGlvc18xLCBucl9jaGlwcywgUzVQX1ZBX0dQSU8xKTsKKworCQkvKiBncGlvIHBhcnQyICovCisJCWNoaXAgPSBleHlub3M0X2dwaW9zXzI7CisJCW5yX2NoaXBzID0gQVJSQVlfU0laRShleHlub3M0X2dwaW9zXzIpOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9jaGlwczsgaSsrLCBjaGlwKyspIHsKKwkJCWlmICghY2hpcC0+Y29uZmlnKSB7CisJCQkJY2hpcC0+Y29uZmlnID0gJmV4eW5vczRfZ3Bpb19jZmc7CisJCQkJY2hpcC0+Z3JvdXAgPSBncm91cCsrOworCQkJfQorCQl9CisJCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyhleHlub3M0X2dwaW9zXzIsIG5yX2NoaXBzLCBTNVBfVkFfR1BJTzIpOworCisJCS8qIGdwaW8gcGFydDMgKi8KKwkJY2hpcCA9IGV4eW5vczRfZ3Bpb3NfMzsKKwkJbnJfY2hpcHMgPSBBUlJBWV9TSVpFKGV4eW5vczRfZ3Bpb3NfMyk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2NoaXBzOyBpKyssIGNoaXArKykgeworCQkJaWYgKCFjaGlwLT5jb25maWcpIHsKKwkJCQljaGlwLT5jb25maWcgPSAmZXh5bm9zNF9ncGlvX2NmZzsKKwkJCQljaGlwLT5ncm91cCA9IGdyb3VwKys7CisJCQl9CisJCX0KKwkJc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKGV4eW5vczRfZ3Bpb3NfMywgbnJfY2hpcHMsIFM1UF9WQV9HUElPMyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfRVhZTk9TNDIxMCkgJiYgZGVmaW5lZChDT05GSUdfUzVQX0dQSU9fSU5UKQorCQlzNXBfcmVnaXN0ZXJfZ3Bpb2ludF9iYW5rKElSUV9HUElPX1hBLCAwLCBJUlFfR1BJTzFfTlJfR1JPVVBTKTsKKwkJczVwX3JlZ2lzdGVyX2dwaW9pbnRfYmFuayhJUlFfR1BJT19YQiwgSVJRX0dQSU8xX05SX0dST1VQUywgSVJRX0dQSU8yX05SX0dST1VQUyk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlXQVJOKDEsICJVbmtub3duIFNvQyBpbiBncGlvLXNhbXN1bmcsIG5vIEdQSU9zIGFkZGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKHNhbXN1bmdfZ3Bpb2xpYl9pbml0KTsKKworaW50IHMzY19ncGlvX2NmZ3Bpbih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgY29uZmlnKQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCA9IHNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2Zmc2V0OworCWludCByZXQ7CisKKwlpZiAoIWNoaXApCisJCXJldHVybiAtRUlOVkFMOworCisJb2Zmc2V0ID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOworCisJc2Ftc3VuZ19ncGlvX2xvY2soY2hpcCwgZmxhZ3MpOworCXJldCA9IHNhbXN1bmdfZ3Bpb19kb19zZXRjZmcoY2hpcCwgb2Zmc2V0LCBjb25maWcpOworCXNhbXN1bmdfZ3Bpb191bmxvY2soY2hpcCwgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woczNjX2dwaW9fY2ZncGluKTsKKworaW50IHMzY19ncGlvX2NmZ3Bpbl9yYW5nZSh1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBuciwKKwkJCSAgdW5zaWduZWQgaW50IGNmZykKK3sKKwlpbnQgcmV0OworCisJZm9yICg7IG5yID4gMDsgbnItLSwgc3RhcnQrKykgeworCQlyZXQgPSBzM2NfZ3Bpb19jZmdwaW4oc3RhcnQsIGNmZyk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UpOworCitpbnQgczNjX2dwaW9fY2ZnYWxsX3JhbmdlKHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IG5yLAorCQkJICB1bnNpZ25lZCBpbnQgY2ZnLCBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpCit7CisJaW50IHJldDsKKworCWZvciAoOyBuciA+IDA7IG5yLS0sIHN0YXJ0KyspIHsKKwkJczNjX2dwaW9fc2V0cHVsbChzdGFydCwgcHVsbCk7CisJCXJldCA9IHMzY19ncGlvX2NmZ3BpbihzdGFydCwgY2ZnKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHMzY19ncGlvX2NmZ2FsbF9yYW5nZSk7CisKK3Vuc2lnbmVkIHMzY19ncGlvX2dldGNmZyh1bnNpZ25lZCBpbnQgcGluKQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCA9IHNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCByZXQgPSAwOworCWludCBvZmZzZXQ7CisKKwlpZiAoY2hpcCkgeworCQlvZmZzZXQgPSBwaW4gLSBjaGlwLT5jaGlwLmJhc2U7CisKKwkJc2Ftc3VuZ19ncGlvX2xvY2soY2hpcCwgZmxhZ3MpOworCQlyZXQgPSBzYW1zdW5nX2dwaW9fZG9fZ2V0Y2ZnKGNoaXAsIG9mZnNldCk7CisJCXNhbXN1bmdfZ3Bpb191bmxvY2soY2hpcCwgZmxhZ3MpOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHMzY19ncGlvX2dldGNmZyk7CisKK2ludCBzM2NfZ3Bpb19zZXRwdWxsKHVuc2lnbmVkIGludCBwaW4sIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAgPSBzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcChwaW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG9mZnNldCwgcmV0OworCisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZnNldCA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKKworCXNhbXN1bmdfZ3Bpb19sb2NrKGNoaXAsIGZsYWdzKTsKKwlyZXQgPSBzYW1zdW5nX2dwaW9fZG9fc2V0cHVsbChjaGlwLCBvZmZzZXQsIHB1bGwpOworCXNhbXN1bmdfZ3Bpb191bmxvY2soY2hpcCwgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woczNjX2dwaW9fc2V0cHVsbCk7CisKK3NhbXN1bmdfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZ2V0cHVsbCh1bnNpZ25lZCBpbnQgcGluKQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCA9IHNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2Zmc2V0OworCXUzMiBwdXAgPSAwOworCisJaWYgKGNoaXApIHsKKwkJb2Zmc2V0ID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOworCisJCXNhbXN1bmdfZ3Bpb19sb2NrKGNoaXAsIGZsYWdzKTsKKwkJcHVwID0gc2Ftc3VuZ19ncGlvX2RvX2dldHB1bGwoY2hpcCwgb2Zmc2V0KTsKKwkJc2Ftc3VuZ19ncGlvX3VubG9jayhjaGlwLCBmbGFncyk7CisJfQorCisJcmV0dXJuIChfX2ZvcmNlIHNhbXN1bmdfZ3Bpb19wdWxsX3QpcHVwOworfQorRVhQT1JUX1NZTUJPTChzM2NfZ3Bpb19nZXRwdWxsKTsKKworLyogZ3Bpb2xpYiB3cmFwcGVycyB1bnRpbCB0aGVzZSBhcmUgdG90YWxseSBlbGltaW5hdGVkICovCisKK3ZvaWQgczNjMjQxMF9ncGlvX3B1bGx1cCh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdG8pCit7CisJaW50IHJldDsKKworCVdBUk5fT04odG8pOwkvKiBzaG91bGQgYmUgbm9uZSBvZiB0aGVzZSBsZWZ0ICovCisKKwlpZiAoIXRvKSB7CisJCS8qIGlmIHB1bGwgaXMgZW5hYmxlZCwgdHJ5IGZpcnN0IHdpdGggdXAsIGFuZCBpZiB0aGF0CisJCSAqIGZhaWxzLCB0cnkgdXNpbmcgZG93biAqLworCisJCXJldCA9IHMzY19ncGlvX3NldHB1bGwocGluLCBTM0NfR1BJT19QVUxMX1VQKTsKKwkJaWYgKHJldCkKKwkJCXMzY19ncGlvX3NldHB1bGwocGluLCBTM0NfR1BJT19QVUxMX0RPV04pOworCX0gZWxzZSB7CisJCXMzY19ncGlvX3NldHB1bGwocGluLCBTM0NfR1BJT19QVUxMX05PTkUpOworCX0KK30KK0VYUE9SVF9TWU1CT0woczNjMjQxMF9ncGlvX3B1bGx1cCk7CisKK3ZvaWQgczNjMjQxMF9ncGlvX3NldHBpbih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdG8pCit7CisJLyogZG8gdGhpcyB2aWEgZ3Bpb2xpYiB1bnRpbCBhbGwgdXNlcnMgcmVtb3ZlZCAqLworCisJZ3Bpb19yZXF1ZXN0KHBpbiwgInRlbXBvcmFyeSIpOworCWdwaW9fc2V0X3ZhbHVlKHBpbiwgdG8pOworCWdwaW9fZnJlZShwaW4pOworfQorRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9fc2V0cGluKTsKKwordW5zaWduZWQgaW50IHMzYzI0MTBfZ3Bpb19nZXRwaW4odW5zaWduZWQgaW50IHBpbikKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAgPSBzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcChwaW4pOworCXVuc2lnbmVkIGxvbmcgb2ZmcyA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKKworCXJldHVybiBfX3Jhd19yZWFkbChjaGlwLT5iYXNlICsgMHgwNCkgJiAoMSA8PCBvZmZzKTsKK30KK0VYUE9SVF9TWU1CT0woczNjMjQxMF9ncGlvX2dldHBpbik7CisKKyNpZmRlZiBDT05GSUdfUzVQX0dQSU9fRFJWU1RSCitzNXBfZ3Bpb19kcnZzdHJfdCBzNXBfZ3Bpb19nZXRfZHJ2c3RyKHVuc2lnbmVkIGludCBwaW4pCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwID0gc2Ftc3VuZ19ncGlvbGliX2dldGNoaXAocGluKTsKKwl1bnNpZ25lZCBpbnQgb2ZmOworCXZvaWQgX19pb21lbSAqcmVnOworCWludCBzaGlmdDsKKwl1MzIgZHJ2c3RyOworCisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZiA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKKwlzaGlmdCA9IG9mZiAqIDI7CisJcmVnID0gY2hpcC0+YmFzZSArIDB4MEM7CisKKwlkcnZzdHIgPSBfX3Jhd19yZWFkbChyZWcpOworCWRydnN0ciA9IGRydnN0ciA+PiBzaGlmdDsKKwlkcnZzdHIgJj0gMHgzOworCisJcmV0dXJuIChfX2ZvcmNlIHM1cF9ncGlvX2RydnN0cl90KWRydnN0cjsKK30KK0VYUE9SVF9TWU1CT0woczVwX2dwaW9fZ2V0X2RydnN0cik7CisKK2ludCBzNXBfZ3Bpb19zZXRfZHJ2c3RyKHVuc2lnbmVkIGludCBwaW4sIHM1cF9ncGlvX2RydnN0cl90IGRydnN0cikKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAgPSBzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcChwaW4pOworCXVuc2lnbmVkIGludCBvZmY7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJaW50IHNoaWZ0OworCXUzMiB0bXA7CisKKwlpZiAoIWNoaXApCisJCXJldHVybiAtRUlOVkFMOworCisJb2ZmID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOworCXNoaWZ0ID0gb2ZmICogMjsKKwlyZWcgPSBjaGlwLT5iYXNlICsgMHgwQzsKKworCXRtcCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJdG1wICY9IH4oMHgzIDw8IHNoaWZ0KTsKKwl0bXAgfD0gZHJ2c3RyIDw8IHNoaWZ0OworCisJX19yYXdfd3JpdGVsKHRtcCwgcmVnKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzNXBfZ3Bpb19zZXRfZHJ2c3RyKTsKKyNlbmRpZgkvKiBDT05GSUdfUzVQX0dQSU9fRFJWU1RSICovCisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCit1bnNpZ25lZCBpbnQgczNjMjQxMF9tb2RpZnlfbWlzY2NyKHVuc2lnbmVkIGludCBjbGVhciwgdW5zaWduZWQgaW50IGNoYW5nZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWlzY2NyOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCW1pc2NjciA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfTUlTQ0NSKTsKKwltaXNjY3IgJj0gfmNsZWFyOworCW1pc2NjciBePSBjaGFuZ2U7CisJX19yYXdfd3JpdGVsKG1pc2NjciwgUzNDMjRYWF9NSVNDQ1IpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiBtaXNjY3I7Cit9CitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfbW9kaWZ5X21pc2Njcik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRlZ3JhLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10ZWdyYS5jCmluZGV4IDc0N2ViNDAuLjYxMDQ0YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRlZ3JhLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdGVncmEuYwpAQCAtMjAsMTMgKzIwLDE1IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCisjaW5jbHVkZSA8bWFjaC9ncGlvLXRlZ3JhLmg+CiAjaW5jbHVkZSA8bWFjaC9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvc3VzcGVuZC5oPgogCkBAIC0zNCw5ICszNiw3IEBACiAjZGVmaW5lIEdQSU9fUE9SVCh4KQkJKCgoeCkgPj4gMykgJiAweDMpCiAjZGVmaW5lIEdQSU9fQklUKHgpCQkoKHgpICYgMHg3KQogCi0jZGVmaW5lIEdQSU9fUkVHKHgpCQkoSU9fVE9fVklSVChURUdSQV9HUElPX0JBU0UpICsJXAotCQkJCSBHUElPX0JBTksoeCkgKiAweDgwICsJCVwKLQkJCQkgR1BJT19QT1JUKHgpICogNCkKKyNkZWZpbmUgR1BJT19SRUcoeCkJCShHUElPX0JBTksoeCkgKiAweDgwICsgR1BJT19QT1JUKHgpICogNCkKIAogI2RlZmluZSBHUElPX0NORih4KQkJKEdQSU9fUkVHKHgpICsgMHgwMCkKICNkZWZpbmUgR1BJT19PRSh4KQkJKEdQSU9fUkVHKHgpICsgMHgxMCkKQEAgLTc1LDE1ICs3NSwxOCBAQAogfTsKIAogCi1zdGF0aWMgc3RydWN0IHRlZ3JhX2dwaW9fYmFuayB0ZWdyYV9ncGlvX2JhbmtzW10gPSB7Ci0Jey5iYW5rID0gMCwgLmlycSA9IElOVF9HUElPMX0sCi0Jey5iYW5rID0gMSwgLmlycSA9IElOVF9HUElPMn0sCi0Jey5iYW5rID0gMiwgLmlycSA9IElOVF9HUElPM30sCi0Jey5iYW5rID0gMywgLmlycSA9IElOVF9HUElPNH0sCi0Jey5iYW5rID0gNCwgLmlycSA9IElOVF9HUElPNX0sCi0Jey5iYW5rID0gNSwgLmlycSA9IElOVF9HUElPNn0sCi0Jey5iYW5rID0gNiwgLmlycSA9IElOVF9HUElPN30sCi19Oworc3RhdGljIHZvaWQgX19pb21lbSAqcmVnczsKK3N0YXRpYyBzdHJ1Y3QgdGVncmFfZ3Bpb19iYW5rIHRlZ3JhX2dwaW9fYmFua3NbN107CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZWdyYV9ncGlvX3dyaXRlbCh1MzIgdmFsLCB1MzIgcmVnKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIHJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB0ZWdyYV9ncGlvX3JlYWRsKHUzMiByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKHJlZ3MgKyByZWcpOworfQogCiBzdGF0aWMgaW50IHRlZ3JhX2dwaW9fY29tcG9zZShpbnQgYmFuaywgaW50IHBvcnQsIGludCBiaXQpCiB7CkBAIC05Nyw3ICsxMDAsNyBAQAogCXZhbCA9IDB4MTAwIDw8IEdQSU9fQklUKGdwaW8pOwogCWlmICh2YWx1ZSkKIAkJdmFsIHw9IDEgPDwgR1BJT19CSVQoZ3Bpbyk7Ci0JX19yYXdfd3JpdGVsKHZhbCwgcmVnKTsKKwl0ZWdyYV9ncGlvX3dyaXRlbCh2YWwsIHJlZyk7CiB9CiAKIHZvaWQgdGVncmFfZ3Bpb19lbmFibGUoaW50IGdwaW8pCkBAIC0xMTcsNyArMTIwLDcgQEAKIAogc3RhdGljIGludCB0ZWdyYV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7Ci0JcmV0dXJuIChfX3Jhd19yZWFkbChHUElPX0lOKG9mZnNldCkpID4+IEdQSU9fQklUKG9mZnNldCkpICYgMHgxOworCXJldHVybiAodGVncmFfZ3Bpb19yZWFkbChHUElPX0lOKG9mZnNldCkpID4+IEdQSU9fQklUKG9mZnNldCkpICYgMHgxOwogfQogCiBzdGF0aWMgaW50IHRlZ3JhX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKQEAgLTEzNCw3ICsxMzcsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotCitzdGF0aWMgaW50IHRlZ3JhX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gVEVHUkFfR1BJT19UT19JUlEob2Zmc2V0KTsKK30KIAogc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVncmFfZ3Bpb19jaGlwID0gewogCS5sYWJlbAkJCT0gInRlZ3JhLWdwaW8iLApAQCAtMTQyLDYgKzE0OCw3IEBACiAJLmdldAkJCT0gdGVncmFfZ3Bpb19nZXQsCiAJLmRpcmVjdGlvbl9vdXRwdXQJPSB0ZWdyYV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCiAJLnNldAkJCT0gdGVncmFfZ3Bpb19zZXQsCisJLnRvX2lycQkJCT0gdGVncmFfZ3Bpb190b19pcnEsCiAJLmJhc2UJCQk9IDAsCiAJLm5ncGlvCQkJPSBURUdSQV9OUl9HUElPUywKIH07CkBAIC0xNTAsNyArMTU3LDcgQEAKIHsKIAlpbnQgZ3BpbyA9IGQtPmlycSAtIElOVF9HUElPX0JBU0U7CiAKLQlfX3Jhd193cml0ZWwoMSA8PCBHUElPX0JJVChncGlvKSwgR1BJT19JTlRfQ0xSKGdwaW8pKTsKKwl0ZWdyYV9ncGlvX3dyaXRlbCgxIDw8IEdQSU9fQklUKGdwaW8pLCBHUElPX0lOVF9DTFIoZ3BpbykpOwogfQogCiBzdGF0aWMgdm9pZCB0ZWdyYV9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKQEAgLTIwMywxMCArMjEwLDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmFuay0+bHZsX2xvY2tbcG9ydF0sIGZsYWdzKTsKIAotCXZhbCA9IF9fcmF3X3JlYWRsKEdQSU9fSU5UX0xWTChncGlvKSk7CisJdmFsID0gdGVncmFfZ3Bpb19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOwogCXZhbCAmPSB+KEdQSU9fSU5UX0xWTF9NQVNLIDw8IEdQSU9fQklUKGdwaW8pKTsKIAl2YWwgfD0gbHZsX3R5cGUgPDwgR1BJT19CSVQoZ3Bpbyk7Ci0JX19yYXdfd3JpdGVsKHZhbCwgR1BJT19JTlRfTFZMKGdwaW8pKTsKKwl0ZWdyYV9ncGlvX3dyaXRlbCh2YWwsIEdQSU9fSU5UX0xWTChncGlvKSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYW5rLT5sdmxfbG9ja1twb3J0XSwgZmxhZ3MpOwogCkBAIC0yMzIsMTIgKzIzOSwxMiBAQAogCiAJZm9yIChwb3J0ID0gMDsgcG9ydCA8IDQ7IHBvcnQrKykgewogCQlpbnQgZ3BpbyA9IHRlZ3JhX2dwaW9fY29tcG9zZShiYW5rLT5iYW5rLCBwb3J0LCAwKTsKLQkJdW5zaWduZWQgbG9uZyBzdGEgPSBfX3Jhd19yZWFkbChHUElPX0lOVF9TVEEoZ3BpbykpICYKLQkJCV9fcmF3X3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSk7Ci0JCXUzMiBsdmwgPSBfX3Jhd19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOworCQl1bnNpZ25lZCBsb25nIHN0YSA9IHRlZ3JhX2dwaW9fcmVhZGwoR1BJT19JTlRfU1RBKGdwaW8pKSAmCisJCQl0ZWdyYV9ncGlvX3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSk7CisJCXUzMiBsdmwgPSB0ZWdyYV9ncGlvX3JlYWRsKEdQSU9fSU5UX0xWTChncGlvKSk7CiAKIAkJZm9yX2VhY2hfc2V0X2JpdChwaW4sICZzdGEsIDgpIHsKLQkJCV9fcmF3X3dyaXRlbCgxIDw8IHBpbiwgR1BJT19JTlRfQ0xSKGdwaW8pKTsKKwkJCXRlZ3JhX2dwaW9fd3JpdGVsKDEgPDwgcGluLCBHUElPX0lOVF9DTFIoZ3BpbykpOwogCiAJCQkvKiBpZiBncGlvIGlzIGVkZ2UgdHJpZ2dlcmVkLCBjbGVhciBjb25kaXRpb24KIAkJCSAqIGJlZm9yZSBleGVjdXRpbmcgdGhlIGhhbmRlciBzbyB0aGF0IHdlIGRvbid0CkBAIC0yNzEsMTEgKzI3OCwxMSBAQAogCiAJCWZvciAocCA9IDA7IHAgPCBBUlJBWV9TSVpFKGJhbmstPm9lKTsgcCsrKSB7CiAJCQl1bnNpZ25lZCBpbnQgZ3BpbyA9IChiPDw1KSB8IChwPDwzKTsKLQkJCV9fcmF3X3dyaXRlbChiYW5rLT5jbmZbcF0sIEdQSU9fQ05GKGdwaW8pKTsKLQkJCV9fcmF3X3dyaXRlbChiYW5rLT5vdXRbcF0sIEdQSU9fT1VUKGdwaW8pKTsKLQkJCV9fcmF3X3dyaXRlbChiYW5rLT5vZVtwXSwgR1BJT19PRShncGlvKSk7Ci0JCQlfX3Jhd193cml0ZWwoYmFuay0+aW50X2x2bFtwXSwgR1BJT19JTlRfTFZMKGdwaW8pKTsKLQkJCV9fcmF3X3dyaXRlbChiYW5rLT5pbnRfZW5iW3BdLCBHUElPX0lOVF9FTkIoZ3BpbykpOworCQkJdGVncmFfZ3Bpb193cml0ZWwoYmFuay0+Y25mW3BdLCBHUElPX0NORihncGlvKSk7CisJCQl0ZWdyYV9ncGlvX3dyaXRlbChiYW5rLT5vdXRbcF0sIEdQSU9fT1VUKGdwaW8pKTsKKwkJCXRlZ3JhX2dwaW9fd3JpdGVsKGJhbmstPm9lW3BdLCBHUElPX09FKGdwaW8pKTsKKwkJCXRlZ3JhX2dwaW9fd3JpdGVsKGJhbmstPmludF9sdmxbcF0sIEdQSU9fSU5UX0xWTChncGlvKSk7CisJCQl0ZWdyYV9ncGlvX3dyaXRlbChiYW5rLT5pbnRfZW5iW3BdLCBHUElPX0lOVF9FTkIoZ3BpbykpOwogCQl9CiAJfQogCkBAIC0yOTQsMTEgKzMwMSwxMSBAQAogCiAJCWZvciAocCA9IDA7IHAgPCBBUlJBWV9TSVpFKGJhbmstPm9lKTsgcCsrKSB7CiAJCQl1bnNpZ25lZCBpbnQgZ3BpbyA9IChiPDw1KSB8IChwPDwzKTsKLQkJCWJhbmstPmNuZltwXSA9IF9fcmF3X3JlYWRsKEdQSU9fQ05GKGdwaW8pKTsKLQkJCWJhbmstPm91dFtwXSA9IF9fcmF3X3JlYWRsKEdQSU9fT1VUKGdwaW8pKTsKLQkJCWJhbmstPm9lW3BdID0gX19yYXdfcmVhZGwoR1BJT19PRShncGlvKSk7Ci0JCQliYW5rLT5pbnRfZW5iW3BdID0gX19yYXdfcmVhZGwoR1BJT19JTlRfRU5CKGdwaW8pKTsKLQkJCWJhbmstPmludF9sdmxbcF0gPSBfX3Jhd19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOworCQkJYmFuay0+Y25mW3BdID0gdGVncmFfZ3Bpb19yZWFkbChHUElPX0NORihncGlvKSk7CisJCQliYW5rLT5vdXRbcF0gPSB0ZWdyYV9ncGlvX3JlYWRsKEdQSU9fT1VUKGdwaW8pKTsKKwkJCWJhbmstPm9lW3BdID0gdGVncmFfZ3Bpb19yZWFkbChHUElPX09FKGdwaW8pKTsKKwkJCWJhbmstPmludF9lbmJbcF0gPSB0ZWdyYV9ncGlvX3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSk7CisJCQliYW5rLT5pbnRfbHZsW3BdID0gdGVncmFfZ3Bpb19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOwogCQl9CiAJfQogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTMyOCwzOCArMzM1LDY5IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgZ3Bpb19sb2NrX2NsYXNzOwogCi1zdGF0aWMgaW50IF9faW5pdCB0ZWdyYV9ncGlvX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRlZ3JhX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgdGVncmFfZ3Bpb19iYW5rICpiYW5rOworCWludCBncGlvOwogCWludCBpOwogCWludCBqOwogCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVncmFfZ3Bpb19iYW5rcyk7IGkrKykgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIGkpOworCQlpZiAoIXJlcykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBJUlEgcmVzb3VyY2VcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQliYW5rID0gJnRlZ3JhX2dwaW9fYmFua3NbaV07CisJCWJhbmstPmJhbmsgPSBpOworCQliYW5rLT5pcnEgPSByZXMtPnN0YXJ0OworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBNRU0gcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcyksCisJCQkJICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgcmVxdWVzdCBNRU0gcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZWdzID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFyZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGlvcmVtYXAgcmVnc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKIAkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewogCQkJaW50IGdwaW8gPSB0ZWdyYV9ncGlvX2NvbXBvc2UoaSwgaiwgMCk7Ci0JCQlfX3Jhd193cml0ZWwoMHgwMCwgR1BJT19JTlRfRU5CKGdwaW8pKTsKKwkJCXRlZ3JhX2dwaW9fd3JpdGVsKDB4MDAsIEdQSU9fSU5UX0VOQihncGlvKSk7CiAJCX0KIAl9CiAKICNpZmRlZiBDT05GSUdfT0ZfR1BJTwotCS8qCi0JICogVGhpcyBpc24ndCBpZGVhbCwgYnV0IGl0IGdldHMgdGhpbmdzIGhvb2tlZCB1cCB1bnRpbCB0aGlzCi0JICogZHJpdmVyIGlzIGNvbnZlcnRlZCBpbnRvIGEgcGxhdGZvcm1fZGV2aWNlCi0JICovCi0JdGVncmFfZ3Bpb19jaGlwLm9mX25vZGUgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLAotCQkJCQkJIm52aWRpYSx0ZWdyYTIwLWdwaW8iKTsKLSNlbmRpZiAvKiBDT05GSUdfT0ZfR1BJTyAqLworCXRlZ3JhX2dwaW9fY2hpcC5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisjZW5kaWYKIAogCWdwaW9jaGlwX2FkZCgmdGVncmFfZ3Bpb19jaGlwKTsKIAotCWZvciAoaSA9IElOVF9HUElPX0JBU0U7IGkgPCAoSU5UX0dQSU9fQkFTRSArIFRFR1JBX05SX0dQSU9TKTsgaSsrKSB7Ci0JCWJhbmsgPSAmdGVncmFfZ3Bpb19iYW5rc1tHUElPX0JBTksoaXJxX3RvX2dwaW8oaSkpXTsKKwlmb3IgKGdwaW8gPSAwOyBncGlvIDwgVEVHUkFfTlJfR1BJT1M7IGdwaW8rKykgeworCQlpbnQgaXJxID0gVEVHUkFfR1BJT19UT19JUlEoZ3Bpbyk7CisJCS8qIE5vIHZhbGlkaXR5IGNoZWNrOyBhbGwgVGVncmEgR1BJT3MgYXJlIHZhbGlkIElSUXMgKi8KIAotCQlpcnFfc2V0X2xvY2tkZXBfY2xhc3MoaSwgJmdwaW9fbG9ja19jbGFzcyk7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGksIGJhbmspOwotCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJnRlZ3JhX2dwaW9faXJxX2NoaXAsCisJCWJhbmsgPSAmdGVncmFfZ3Bpb19iYW5rc1tHUElPX0JBTksoZ3BpbyldOworCisJCWlycV9zZXRfbG9ja2RlcF9jbGFzcyhpcnEsICZncGlvX2xvY2tfY2xhc3MpOworCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGJhbmspOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmdGVncmFfZ3Bpb19pcnFfY2hpcCwKIAkJCQkJIGhhbmRsZV9zaW1wbGVfaXJxKTsKLQkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKKwkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlZ3JhX2dwaW9fYmFua3MpOyBpKyspIHsKQEAgLTM3NSw2ICs0MTMsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfZ3Bpb19vZl9tYXRjaFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1ncGlvIiwgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidGVncmEtZ3BpbyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB0ZWdyYV9ncGlvX29mX21hdGNoLAorCX0sCisJLnByb2JlCQk9IHRlZ3JhX2dwaW9fcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0ZWdyYV9ncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0ZWdyYV9ncGlvX2RyaXZlcik7Cit9CiBwb3N0Y29yZV9pbml0Y2FsbCh0ZWdyYV9ncGlvX2luaXQpOwogCiB2b2lkIF9faW5pdCB0ZWdyYV9ncGlvX2NvbmZpZyhzdHJ1Y3QgdGVncmFfZ3Bpb190YWJsZSAqdGFibGUsIGludCBudW0pCkBAIC00MDcsMTMgKzQ2MywxMyBAQAogCQkJc2VxX3ByaW50ZihzLAogCQkJCSIlZDolZCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDZ4XG4iLAogCQkJCWksIGosCi0JCQkJX19yYXdfcmVhZGwoR1BJT19DTkYoZ3BpbykpLAotCQkJCV9fcmF3X3JlYWRsKEdQSU9fT0UoZ3BpbykpLAotCQkJCV9fcmF3X3JlYWRsKEdQSU9fT1VUKGdwaW8pKSwKLQkJCQlfX3Jhd19yZWFkbChHUElPX0lOKGdwaW8pKSwKLQkJCQlfX3Jhd19yZWFkbChHUElPX0lOVF9TVEEoZ3BpbykpLAotCQkJCV9fcmF3X3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSksCi0JCQkJX19yYXdfcmVhZGwoR1BJT19JTlRfTFZMKGdwaW8pKSk7CisJCQkJdGVncmFfZ3Bpb19yZWFkbChHUElPX0NORihncGlvKSksCisJCQkJdGVncmFfZ3Bpb19yZWFkbChHUElPX09FKGdwaW8pKSwKKwkJCQl0ZWdyYV9ncGlvX3JlYWRsKEdQSU9fT1VUKGdwaW8pKSwKKwkJCQl0ZWdyYV9ncGlvX3JlYWRsKEdQSU9fSU4oZ3BpbykpLAorCQkJCXRlZ3JhX2dwaW9fcmVhZGwoR1BJT19JTlRfU1RBKGdwaW8pKSwKKwkJCQl0ZWdyYV9ncGlvX3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSksCisJCQkJdGVncmFfZ3Bpb19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLXRuZXR2MTA3eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdG5ldHYxMDd4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLXRuZXR2MTA3eC5jCnJlbmFtZSB0byBkcml2ZXJzL2dwaW8vZ3Bpby10bmV0djEwN3guYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tdTMwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdTMwMC5jCmluZGV4IDUzZTgyNTUuLjQwMzU3NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXUzMDAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby11MzAwLmMKQEAgLTEsMTggKzEsMTcgQEAKIC8qCiAgKiBVMzAwIEdQSU8gbW9kdWxlLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFNULUVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBTVC1Fcmljc3NvbiBBQgogICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCiAgKiBUaGlzIGNhbiBkcml2ZXIgZWl0aGVyIG9mIHRoZSB0d28gYmFzaWMgR1BJTyBjb3JlcwogICogYXZhaWxhYmxlIGluIHRoZSBVMzAwIHBsYXRmb3JtczoKICAqIENPSCA5MDEgMzM1ICAgLSBVc2VkIGluIERCMzE1MCAoVTMwMCAxLjApIGFuZCBEQjMyMDAgKFUzMzAgMS4wKQogICogQ09IIDkwMSA1NzEvMyAtIFVzZWQgaW4gREIzMjEwIChVMzY1IDIuMCkgYW5kIERCMzM1MCAoVTMzNSAxLjApCi0gKiBOb3RpY2UgdGhhdCB5b3UgYWxzbyBoYXZlIGlubGluZSBtYWNyb3MgaW4gPGFzbS1hcmNoL2dwaW8uaD4KLSAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KKyAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5hcm8ub3JnPgogICogQXV0aG9yOiBKb25hcyBBYWJlcmcgPGpvbmFzLmFiZXJnQHN0ZXJpY3Nzb24uY29tPgotICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTIxLDY3NyArMjAsODk4IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLXUzMDAuaD4KIAotLyogUmVmZXJlbmNlIHRvIEdQSU8gYmxvY2sgY2xvY2sgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGs7CisvKgorICogQmlhcyBtb2RlcyBmb3IgVTMwMCBHUElPcworICoKKyAqIEdQSU9fVTMwMF9DT05GSUdfQklBU19VTktOT1dOOiB0aGlzIGJpYXMgbW9kZSBpcyBub3Qga25vd24gdG8gdXMKKyAqIEdQSU9fVTMwMF9DT05GSUdfQklBU19GTE9BVDogbm8gc3BlY2lmaWMgYmlhcywgdGhlIEdQSU8gd2lsbCBmbG9hdCBvciBzdGF0ZQorICoJaXMgbm90IGNvbnRyb2xsZWQgYnkgc29mdHdhcmUKKyAqIEdQSU9fVTMwMF9DT05GSUdfQklBU19QVUxMX1VQOiB0aGUgR1BJTyB3aWxsIGJlIHB1bGxlZCB1cCAodXN1YWxseSB3aXRoIGhpZ2gKKyAqCWltcGVkYW5jZSB0byBWREQpCisgKi8KKyNkZWZpbmUgR1BJT19VMzAwX0NPTkZJR19CSUFTX1VOS05PV04JMHgxMDAwCisjZGVmaW5lIEdQSU9fVTMwMF9DT05GSUdfQklBU19GTE9BVAkweDEwMDEKKyNkZWZpbmUgR1BJT19VMzAwX0NPTkZJR19CSUFTX1BVTExfVVAJMHgxMDAyCiAKLS8qIE1lbW9yeSByZXNvdXJjZSAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqbWVtcmVzOwotc3RhdGljIHZvaWQgX19pb21lbSAqdmlydGJhc2U7Ci1zdGF0aWMgc3RydWN0IGRldmljZSAqZ3Bpb2RldjsKKy8qCisgKiBEcml2ZSBtb2RlcyBmb3IgVTMwMCBHUElPcyAob3V0cHV0KQorICoKKyAqIEdQSU9fVTMwMF9DT05GSUdfRFJJVkVfUFVTSF9QVUxMOiB0aGUgR1BJTyB3aWxsIGJlIGRyaXZlbiBhY3RpdmVseSBoaWdoIGFuZAorICoJbG93LCB0aGlzIGlzIHRoZSBtb3N0IHR5cGljYWwgY2FzZSBhbmQgaXMgdHlwaWNhbGx5IGFjaGlldmVkIHdpdGggdHdvCisgKglhY3RpdmUgdHJhbnNpc3RvcnMgb24gdGhlIG91dHB1dAorICogR1BJT19VMzAwX0NPTkZJR19EUklWRV9PUEVOX0RSQUlOOiB0aGUgR1BJTyB3aWxsIGJlIGRyaXZlbiB3aXRoIG9wZW4gZHJhaW4KKyAqCShvcGVuIGNvbGxlY3Rvcikgd2hpY2ggbWVhbnMgaXQgaXMgdXN1YWxseSB3aXJlZCB3aXRoIG90aGVyIG91dHB1dAorICoJcG9ydHMgd2hpY2ggYXJlIHRoZW4gcHVsbGVkIHVwIHdpdGggYW4gZXh0ZXJuYWwgcmVzaXN0b3IKKyAqIEdQSU9fVTMwMF9DT05GSUdfRFJJVkVfT1BFTl9TT1VSQ0U6IHRoZSBHUElPIHdpbGwgYmUgZHJpdmVuIHdpdGggb3BlbiBkcmFpbgorICoJKG9wZW4gZW1pdHRlcikgd2hpY2ggaXMgdGhlIHNhbWUgYXMgb3BlbiBkcmFpbiBtdXRhdGlzIG11dGFuZGlzIGJ1dAorICoJcHVsbGVkIHRvIGdyb3VuZAorICovCisjZGVmaW5lIEdQSU9fVTMwMF9DT05GSUdfRFJJVkVfUFVTSF9QVUxMCTB4MjAwMAorI2RlZmluZSBHUElPX1UzMDBfQ09ORklHX0RSSVZFX09QRU5fRFJBSU4JMHgyMDAxCisjZGVmaW5lIEdQSU9fVTMwMF9DT05GSUdfRFJJVkVfT1BFTl9TT1VSQ0UJMHgyMDAyCisKKy8qCisgKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgQ09IIDkwMSAzMzUgdmFyaWFudAorICovCisjZGVmaW5lIFUzMDBfMzM1X1BPUlRfU1RSSURFCQkJCSgweDFDKQorLyogUG9ydCBYIFBpbiBEYXRhIFJlZ2lzdGVyIDMyYml0LCB0aGlzIGlzIGJvdGggaW5wdXQgYW5kIG91dHB1dCAoUi9XKSAqLworI2RlZmluZSBVMzAwXzMzNV9QWFBESVIJCQkJCSgweDAwKQorI2RlZmluZSBVMzAwXzMzNV9QWFBET1IJCQkJCSgweDAwKQorLyogUG9ydCBYIFBpbiBDb25maWcgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KKyNkZWZpbmUgVTMwMF8zMzVfUFhQQ1IJCQkJCSgweDA0KQorLyogVGhpcyByZWdpc3RlciBsYXlvdXQgaXMgdGhlIHNhbWUgaW4gYm90aCBibG9ja3MgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BYUENSX0FMTF9QSU5TX01PREVfTUFTSwkJKDB4MDAwMEZGRkZVTCkKKyNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX01BU0sJCQkoMHgwMDAwMDAwM1VMKQorI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfU0hJRlQJCQkoMHgwMDAwMDAwMlVMKQorI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfSU5QVVQJCQkoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfT1VUUFVUX1BVU0hfUFVMTAkoMHgwMDAwMDAwMVVMKQorI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfT1VUUFVUX09QRU5fRFJBSU4JKDB4MDAwMDAwMDJVTCkKKyNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9PUEVOX1NPVVJDRQkoMHgwMDAwMDAwM1VMKQorLyogUG9ydCBYIEludGVycnVwdCBFdmVudCBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLworI2RlZmluZSBVMzAwXzMzNV9QWElFVgkJCQkJKDB4MDgpCisvKiBQb3J0IFggSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLworI2RlZmluZSBVMzAwXzMzNV9QWElFTgkJCQkJKDB4MEMpCisvKiBQb3J0IFggSW50ZXJydXB0IEZvcmNlIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCisjZGVmaW5lIFUzMDBfMzM1X1BYSUZSCQkJCQkoMHgxMCkKKy8qIFBvcnQgWCBJbnRlcnJ1cHQgQ29uZmlnIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCisjZGVmaW5lIFUzMDBfMzM1X1BYSUNSCQkJCQkoMHgxNCkKKy8qIFRoaXMgcmVnaXN0ZXIgbGF5b3V0IGlzIHRoZSBzYW1lIGluIGJvdGggYmxvY2tzICovCisjZGVmaW5lIFUzMDBfR1BJT19QWElDUl9BTExfSVJRX0NPTkZJR19NQVNLCQkoMHgwMDAwMDBGRlVMKQorI2RlZmluZSBVMzAwX0dQSU9fUFhJQ1JfSVJRX0NPTkZJR19NQVNLCQkJKDB4MDAwMDAwMDFVTCkKKyNkZWZpbmUgVTMwMF9HUElPX1BYSUNSX0lSUV9DT05GSUdfRkFMTElOR19FREdFCQkoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBVMzAwX0dQSU9fUFhJQ1JfSVJRX0NPTkZJR19SSVNJTkdfRURHRQkJKDB4MDAwMDAwMDFVTCkKKy8qIFBvcnQgWCBQdWxsLXVwIEVuYWJsZSBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLworI2RlZmluZSBVMzAwXzMzNV9QWFBFUgkJCQkJKDB4MTgpCisvKiBUaGlzIHJlZ2lzdGVyIGxheW91dCBpcyB0aGUgc2FtZSBpbiBib3RoIGJsb2NrcyAqLworI2RlZmluZSBVMzAwX0dQSU9fUFhQRVJfQUxMX1BVTExfVVBfRElTQUJMRV9NQVNLCSgweDAwMDAwMEZGVUwpCisjZGVmaW5lIFUzMDBfR1BJT19QWFBFUl9QVUxMX1VQX0RJU0FCTEUJCQkoMHgwMDAwMDAwMVVMKQorLyogQ29udHJvbCBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLworI2RlZmluZSBVMzAwXzMzNV9DUgkJCQkJKDB4NTQpCisjZGVmaW5lIFUzMDBfMzM1X0NSX0JMT0NLX0NMT0NLX0VOQUJMRQkJCSgweDAwMDAwMDAxVUwpCisKKy8qCisgKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgQ09IIDkwMSA1NzEgLyAzIHZhcmlhbnQKKyAqLworI2RlZmluZSBVMzAwXzU3MV9QT1JUX1NUUklERQkJCQkoMHgzMCkKKy8qCisgKiBDb250cm9sIFJlZ2lzdGVyIDMyYml0IChSL1cpCisgKiBiaXQgMTUtOSAobWFzayAweDAwMDBGRTAwKSBjb250YWlucyB0aGUgbnVtYmVyIG9mIGNvcmVzLiA4KmNvcmVzCisgKiBnaXZlcyB0aGUgbnVtYmVyIG9mIEdQSU8gcGlucy4KKyAqIGJpdCA4LTIgIChtYXNrIDB4MDAwMDAxRkMpIGNvbnRhaW5zIHRoZSBjb3JlIHZlcnNpb24gSUQuCisgKi8KKyNkZWZpbmUgVTMwMF81NzFfQ1IJCQkJCSgweDAwKQorI2RlZmluZSBVMzAwXzU3MV9DUl9TWU5DX1NFTF9FTkFCTEUJCQkoMHgwMDAwMDAwMlVMKQorI2RlZmluZSBVMzAwXzU3MV9DUl9CTE9DS19DTEtSUV9FTkFCTEUJCQkoMHgwMDAwMDAwMVVMKQorLyoKKyAqIFRoZXNlIHJlZ2lzdGVycyBoYXZlIHRoZSBzYW1lIGxheW91dCBhbmQgZnVuY3Rpb24gYXMgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIENPSCA5MDEgMzM1IHJlZ2lzdGVycywganVzdCBhdCBkaWZmZXJlbnQgb2Zmc2V0LgorICovCisjZGVmaW5lIFUzMDBfNTcxX1BYUERJUgkJCQkJKDB4MDQpCisjZGVmaW5lIFUzMDBfNTcxX1BYUERPUgkJCQkJKDB4MDgpCisjZGVmaW5lIFUzMDBfNTcxX1BYUENSCQkJCQkoMHgwQykKKyNkZWZpbmUgVTMwMF81NzFfUFhQRVIJCQkJCSgweDEwKQorI2RlZmluZSBVMzAwXzU3MV9QWElFVgkJCQkJKDB4MTQpCisjZGVmaW5lIFUzMDBfNTcxX1BYSUVOCQkJCQkoMHgxOCkKKyNkZWZpbmUgVTMwMF81NzFfUFhJRlIJCQkJCSgweDFDKQorI2RlZmluZSBVMzAwXzU3MV9QWElDUgkJCQkJKDB4MjApCisKKy8qIDggYml0cyBwZXIgcG9ydCwgbm8gdmVyc2lvbiBoYXMgbW9yZSB0aGFuIDcgcG9ydHMgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQgOAorI2RlZmluZSBVMzAwX0dQSU9fTUFYIChVMzAwX0dQSU9fUElOU19QRVJfUE9SVCAqIDcpCisKK3N0cnVjdCB1MzAwX2dwaW8geworCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvcnRfbGlzdDsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IHJlc291cmNlICptZW1yZXM7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgaXJxX2Jhc2U7CisJdTMyIHN0cmlkZTsKKwkvKiBSZWdpc3RlciBvZmZzZXRzICovCisJdTMyIHBjcjsKKwl1MzIgZG9yOworCXUzMiBkaXI7CisJdTMyIHBlcjsKKwl1MzIgaWNyOworCXUzMiBpZW47CisJdTMyIGlldjsKK307CiAKIHN0cnVjdCB1MzAwX2dwaW9fcG9ydCB7Ci0JY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbzsKKwljaGFyIG5hbWVbOF07CiAJaW50IGlycTsKIAlpbnQgbnVtYmVyOworCXU4IHRvZ2dsZV9lZGdlX21vZGU7CiB9OwogCisvKgorICogTWFjcm8gdG8gZXhwYW5kIHRvIHJlYWQgYSBzcGVjaWZpYyByZWdpc3RlciBmb3VuZCBpbiB0aGUgImdwaW8iCisgKiBzdHJ1Y3QuIEl0IHJlcXVpcmVzIHRoZSBzdHJ1Y3QgdTMwMF9ncGlvICpncGlvIHZhcmlhYmxlIHRvIGV4aXN0IGluCisgKiBpdHMgY29udGV4dC4gSXQgY2FsY3VsYXRlcyB0aGUgcG9ydCBvZmZzZXQgZnJvbSB0aGUgZ2l2ZW4gcGluCisgKiBvZmZzZXQsIG11bGlwbGllcyBieSB0aGUgcG9ydCBzdHJpZGUgYW5kIGFkZHMgdGhlIHJlZ2lzdGVyIG9mZnNldAorICogc28gaXQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFUzMDBfUElOX1JFRyhwaW4sIHJlZykgXAorCShncGlvLT5iYXNlICsgKHBpbiA+PiAzKSAqIGdwaW8tPnN0cmlkZSArIGdwaW8tPnJlZykKIAotc3RhdGljIHN0cnVjdCB1MzAwX2dwaW9fcG9ydCBncGlvX3BvcnRzW10gPSB7Ci0JewotCQkubmFtZSA9ICJncGlvMCIsCi0JCS5udW1iZXIgPSAwLAotCX0sCi0JewotCQkubmFtZSA9ICJncGlvMSIsCi0JCS5udW1iZXIgPSAxLAotCX0sCi0JewotCQkubmFtZSA9ICJncGlvMiIsCi0JCS5udW1iZXIgPSAyLAotCX0sCi0jaWZkZWYgVTMwMF9DT0g5MDE1NzFfMwotCXsKLQkJLm5hbWUgPSAiZ3BpbzMiLAotCQkubnVtYmVyID0gMywKLQl9LAotCXsKLQkJLm5hbWUgPSAiZ3BpbzQiLAotCQkubnVtYmVyID0gNCwKLQl9LAotI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMzMzUKLQl7Ci0JCS5uYW1lID0gImdwaW81IiwKLQkJLm51bWJlciA9IDUsCi0JfSwKLQl7Ci0JCS5uYW1lID0gImdwaW82IiwKLQkJLm51bWJlciA9IDYsCi0JfSwKLSNlbmRpZgotI2VuZGlmCisvKgorICogUHJvdmlkZXMgYSBiaXRtYXNrIGZvciBhIHNwZWNpZmljIGdwaW8gcGluIGluc2lkZSBhbiA4LWJpdCBHUElPCisgKiByZWdpc3Rlci4KKyAqLworI2RlZmluZSBVMzAwX1BJTl9CSVQocGluKSBcCisJKDEgPDwgKHBpbiAmIDB4MDcpKQogCitzdHJ1Y3QgdTMwMF9ncGlvX2NvbmZkYXRhIHsKKwl1MTYgYmlhc19tb2RlOworCWJvb2wgb3V0cHV0OworCWludCBvdXR2YWw7CiB9OwogCisvKiBCUzMzNSBoYXMgc2V2ZW4gcG9ydHMgb2YgOCBiaXRzIGVhY2ggPSBHUElPIHBpbnMgMC4uNTUgKi8KKyNkZWZpbmUgQlMzMzVfR1BJT19OVU1fUE9SVFMgNworLyogQlMzNjUgaGFzIGZpdmUgcG9ydHMgb2YgOCBiaXRzIGVhY2ggPSBHUElPIHBpbnMgMC4uMzkgKi8KKyNkZWZpbmUgQlMzNjVfR1BJT19OVU1fUE9SVFMgNQogCi0jaWZkZWYgVTMwMF9DT0g5MDE1NzFfMworI2RlZmluZSBVMzAwX0ZMT0FUSU5HX0lOUFVUIHsgXAorCS5iaWFzX21vZGUgPSBHUElPX1UzMDBfQ09ORklHX0JJQVNfRkxPQVQsIFwKKwkub3V0cHV0ID0gZmFsc2UsIFwKK30KIAotLyogRGVmYXVsdCBpbnB1dCB2YWx1ZSAqLwotI2RlZmluZSBERUZBVUxUX09VVFBVVF9MT1cgICAwCi0jZGVmaW5lIERFRkFVTFRfT1VUUFVUX0hJR0ggIDEKKyNkZWZpbmUgVTMwMF9QVUxMX1VQX0lOUFVUIHsgXAorCS5iaWFzX21vZGUgPSBHUElPX1UzMDBfQ09ORklHX0JJQVNfUFVMTF9VUCwgXAorCS5vdXRwdXQgPSBmYWxzZSwgXAorfQogCi0vKiBHUElPIFB1bGwtVXAgc3RhdHVzICovCi0jZGVmaW5lIERJU0FCTEVfUFVMTF9VUCAgMAotI2RlZmluZSBFTkFCTEVfUFVMTF9VUCAgMQorI2RlZmluZSBVMzAwX09VVFBVVF9MT1cgeyBcCisJLm91dHB1dCA9IHRydWUsIFwKKwkub3V0dmFsID0gMCwgXAorfQogCi0jZGVmaW5lIEdQSU9fTk9UX1VTRUQgMAotI2RlZmluZSBHUElPX0lOICAgICAgIDEKLSNkZWZpbmUgR1BJT19PVVQgICAgICAyCisjZGVmaW5lIFUzMDBfT1VUUFVUX0hJR0ggeyBcCisJLm91dHB1dCA9IHRydWUsIFwKKwkub3V0dmFsID0gMSwgXAorfQogCi1zdHJ1Y3QgdTMwMF9ncGlvX2NvbmZpZ3VyYXRpb25fZGF0YSB7Ci0JdW5zaWduZWQgY2hhciBwaW5fdXNhZ2U7Ci0JdW5zaWduZWQgY2hhciBkZWZhdWx0X291dHB1dF92YWx1ZTsKLQl1bnNpZ25lZCBjaGFyIHB1bGxfdXA7Ci19OwogCiAvKiBJbml0aWFsIGNvbmZpZ3VyYXRpb24gKi8KLWNvbnN0IHN0cnVjdCB1MzAwX2dwaW9fY29uZmlndXJhdGlvbl9kYXRhCi11MzAwX2dwaW9fY29uZmlnW1UzMDBfR1BJT19OVU1fUE9SVFNdW1UzMDBfR1BJT19QSU5TX1BFUl9QT1JUXSA9IHsKLSNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX0JTMzM1CitzdGF0aWMgY29uc3Qgc3RydWN0IF9faW5pdGRhdGEgdTMwMF9ncGlvX2NvbmZkYXRhCiticzMzNV9ncGlvX2NvbmZpZ1tCUzMzNV9HUElPX05VTV9QT1JUU11bVTMwMF9HUElPX1BJTlNfUEVSX1BPUlRdID0gewogCS8qIFBvcnQgMCwgcGlucyAwLTcgKi8KIAl7Ci0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfSElHSCwgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0KKwkJVTMwMF9GTE9BVElOR19JTlBVVCwKKwkJVTMwMF9PVVRQVVRfSElHSCwKKwkJVTMwMF9GTE9BVElOR19JTlBVVCwKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCiAJfSwKIAkvKiBQb3J0IDEsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0hJR0gsICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9CisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9GTE9BVElOR19JTlBVVCwKKwkJVTMwMF9PVVRQVVRfSElHSCwKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCiAJfSwKIAkvKiBQb3J0IDIsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9CisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKIAl9LAogCS8qIFBvcnQgMywgcGlucyAwLTcgKi8KIAl7Ci0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgICBFTkFCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0KKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCiAJfSwKIAkvKiBQb3J0IDQsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9CisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCiAJfSwKIAkvKiBQb3J0IDUsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9CisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCiAJfSwKIAkvKiBQb3J0IDYsIHBpbmQgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9CisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCiAJfQotI2VuZGlmCit9OwogCi0jaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9CUzM2NQorc3RhdGljIGNvbnN0IHN0cnVjdCBfX2luaXRkYXRhIHUzMDBfZ3Bpb19jb25mZGF0YQorYnMzNjVfZ3Bpb19jb25maWdbQlMzNjVfR1BJT19OVU1fUE9SVFNdW1UzMDBfR1BJT19QSU5TX1BFUl9QT1JUXSA9IHsKIAkvKiBQb3J0IDAsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9CisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9GTE9BVElOR19JTlBVVCwKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAogCX0sCiAJLyogUG9ydCAxLCBwaW5zIDAtNyAqLwogCXsKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9ISUdILCAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfQorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9GTE9BVElOR19JTlBVVCwKKwkJVTMwMF9GTE9BVElOR19JTlBVVCwKKwkJVTMwMF9PVVRQVVRfSElHSCwKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCiAJfSwKIAkvKiBQb3J0IDIsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9CisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKIAl9LAogCS8qIFBvcnQgMywgcGlucyAwLTcgKi8KIAl7Ci0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgICBFTkFCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgICBFTkFCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgICBFTkFCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgICBFTkFCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgICBFTkFCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgICBFTkFCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgICBFTkFCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgICBFTkFCTEVfUFVMTF9VUH0KKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCiAJfSwKIAkvKiBQb3J0IDQsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCiAJCS8qIFRoZXNlIDQgcGlucyBkb2Vzbid0IGV4aXN0IG9uIERCMzIxMCAqLwotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9CisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfT1VUUFVUX0xPVywKIAl9Ci0jZW5kaWYKLX07Ci0jZW5kaWYKLQotCi0vKiBObyB1c2VycyA9PSB3ZSBjYW4gcG93ZXIgZG93biBHUElPICovCi1zdGF0aWMgaW50IGdwaW9fdXNlcnM7Ci0KLXN0cnVjdCBncGlvX3N0cnVjdCB7Ci0JaW50ICgqY2FsbGJhY2spKHZvaWQgKik7Ci0Jdm9pZCAqZGF0YTsKLQlpbnQgdXNlcnM7CiB9OwogCi1zdGF0aWMgc3RydWN0IGdwaW9fc3RydWN0IGdwaW9fcGluW1UzMDBfR1BJT19NQVhdOwotCi0vKgotICogTGV0IGRyaXZlcnMgcmVnaXN0ZXIgY2FsbGJhY2sgaW4gb3JkZXIgdG8gZ2V0IG5vdGlmaWVkIHdoZW4gdGhlcmUgaXMKLSAqIGFuIGludGVycnVwdCBvbiB0aGUgZ3BpbyBwaW4KKy8qKgorICogdG9fdTMwMF9ncGlvKCkgLSBnZXQgdGhlIHBvaW50ZXIgdG8gdTMwMF9ncGlvCisgKiBAY2hpcDogdGhlIGdwaW8gY2hpcCBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSB1MzAwX2dwaW8KICAqLwotaW50IGdwaW9fcmVnaXN0ZXJfY2FsbGJhY2sodW5zaWduZWQgZ3BpbywgaW50ICgqZnVuYykodm9pZCAqYXJnKSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHUzMDBfZ3BpbyAqdG9fdTMwMF9ncGlvKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApCiB7Ci0JaWYgKGdwaW9fcGluW2dwaW9dLmNhbGxiYWNrKQotCQlkZXZfd2FybihncGlvZGV2LCAiJXM6IFdBUk5JTkc6IGNhbGxiYWNrIGFscmVhZHkgIgotCQkJICJyZWdpc3RlcmVkIGZvciBncGlvIHBpbiMlZFxuIiwgX19mdW5jX18sIGdwaW8pOwotCWdwaW9fcGluW2dwaW9dLmNhbGxiYWNrID0gZnVuYzsKLQlncGlvX3BpbltncGlvXS5kYXRhID0gZGF0YTsKLQotCXJldHVybiAwOworCXJldHVybiBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHUzMDBfZ3BpbywgY2hpcCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fcmVnaXN0ZXJfY2FsbGJhY2spOwogCi1pbnQgZ3Bpb191bnJlZ2lzdGVyX2NhbGxiYWNrKHVuc2lnbmVkIGdwaW8pCitzdGF0aWMgaW50IHUzMDBfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewotCWlmICghZ3Bpb19waW5bZ3Bpb10uY2FsbGJhY2spCi0JCWRldl93YXJuKGdwaW9kZXYsICIlczogV0FSTklORzogY2FsbGJhY2sgYWxyZWFkeSAiCi0JCQkgInVucmVnaXN0ZXJlZCBmb3IgZ3BpbyBwaW4jJWRcbiIsIF9fZnVuY19fLCBncGlvKTsKLQlncGlvX3BpbltncGlvXS5jYWxsYmFjayA9IE5VTEw7Ci0JZ3Bpb19waW5bZ3Bpb10uZGF0YSA9IE5VTEw7CisJc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbyA9IHRvX3UzMDBfZ3BpbyhjaGlwKTsKIAotCXJldHVybiAwOworCXJldHVybiByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBkaXIpKSAmIFUzMDBfUElOX0JJVChvZmZzZXQpOwogfQotRVhQT1JUX1NZTUJPTChncGlvX3VucmVnaXN0ZXJfY2FsbGJhY2spOwogCi0vKiBOb24temVybyBtZWFucyB2YWxpZCAqLwotaW50IGdwaW9faXNfdmFsaWQoaW50IG51bWJlcikKK3N0YXRpYyB2b2lkIHUzMDBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCiB7Ci0JaWYgKG51bWJlciA+PSAwICYmCi0JICAgIG51bWJlciA8IChVMzAwX0dQSU9fTlVNX1BPUlRTICogVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQpKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZ3Bpb19pc192YWxpZCk7CisJc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbyA9IHRvX3UzMDBfZ3BpbyhjaGlwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CiAKLWludCBncGlvX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqbGFiZWwpCi17Ci0JaWYgKGdwaW9fcGluW2dwaW9dLnVzZXJzKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBkb3IpKTsKKwlpZiAodmFsdWUpCisJCXdyaXRlbCh2YWwgfCBVMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgZG9yKSk7CiAJZWxzZQotCQlncGlvX3BpbltncGlvXS51c2VycysrOworCQl3cml0ZWwodmFsICYgflUzMDBfUElOX0JJVChvZmZzZXQpLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBkb3IpKTsKIAotCWdwaW9fdXNlcnMrKzsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChncGlvX3JlcXVlc3QpOwotCi12b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKQotewotCWdwaW9fdXNlcnMtLTsKLQlncGlvX3BpbltncGlvXS51c2Vycy0tOwotCWlmICh1bmxpa2VseShncGlvX3BpbltncGlvXS51c2VycyA8IDApKSB7Ci0JCWRldl93YXJuKGdwaW9kZXYsICJ3YXJuaW5nOiBncGlvIyVkIHJlbGVhc2UgbWlzbWF0Y2hcbiIsCi0JCQkgZ3Bpbyk7Ci0JCWdwaW9fcGluW2dwaW9dLnVzZXJzID0gMDsKLQl9Ci0KLQlyZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZnJlZSk7Ci0KLS8qIFRoaXMgcmV0dXJucyB6ZXJvIG9yIG5vbnplcm8gKi8KLWludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBESVIgKwotCSAgUElOX1RPX1BPUlQoZ3BpbykgKiBVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORykgJiAoMSA8PCAoZ3BpbyAmIDB4MDcpKTsKLX0KLUVYUE9SVF9TWU1CT0woZ3Bpb19nZXRfdmFsdWUpOwotCi0vKgotICogV2UgaG9wZSB0aGF0IHRoZSBjb21waWxlciB3aWxsIG9wdGltaXplIGF3YXkgdGhlIHVudXNlZCBicmFuY2gKLSAqIGluIGNhc2UgInZhbHVlIiBpcyBhIGNvbnN0YW50Ci0gKi8KLXZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCXUzMiB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAodmFsdWUpIHsKLQkJLyogc2V0ICovCi0JCXZhbCA9IHJlYWRsKHZpcnRiYXNlICsgVTMwMF9HUElPX1BYUERPUiArCi0JCSAgUElOX1RPX1BPUlQoZ3BpbykgKiBVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORykKLQkJICAmICgxIDw8IChncGlvICYgMHgwNykpOwotCQl3cml0ZWwodmFsIHwgKDEgPDwgKGdwaW8gJiAweDA3KSksIHZpcnRiYXNlICsKLQkJICBVMzAwX0dQSU9fUFhQRE9SICsKLQkJICBQSU5fVE9fUE9SVChncGlvKSAqIFUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQl9IGVsc2UgewotCQkvKiBjbGVhciAqLwotCQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBET1IgKwotCQkgIFBJTl9UT19QT1JUKGdwaW8pICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpCi0JCSAgJiAoMSA8PCAoZ3BpbyAmIDB4MDcpKTsKLQkJd3JpdGVsKHZhbCAmIH4oMSA8PCAoZ3BpbyAmIDB4MDcpKSwgdmlydGJhc2UgKwotCQkgIFUzMDBfR1BJT19QWFBET1IgKwotCQkgIFBJTl9UT19QT1JUKGdwaW8pICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCX0KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fc2V0X3ZhbHVlKTsKIAotaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCitzdGF0aWMgaW50IHUzMDBfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogeworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSB0b191MzAwX2dwaW8oY2hpcCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdmFsOwogCi0JaWYgKGdwaW8gPiBVMzAwX0dQSU9fTUFYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBDUiArIFBJTl9UT19QT1JUKGdwaW8pICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JLyogTWFzayBvdXQgdGhpcyBwaW4qLwotCXZhbCAmPSB+KFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9NQVNLIDw8ICgoZ3BpbyAmIDB4MDcpIDw8IDEpKTsKLQkvKiBUaGlzIGlzIG5vdCBuZWVkZWQgc2luY2UgaXQgc2V0cyB0aGUgYml0cyB0byB6ZXJvLiovCi0JLyogdmFsIHw9IChVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfSU5QVVQgPDwgKGdwaW8qMikpOyAqLwotCXdyaXRlbCh2YWwsIHZpcnRiYXNlICsgVTMwMF9HUElPX1BYUENSICsgUElOX1RPX1BPUlQoZ3BpbykgKgotCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKKwl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBwY3IpKTsKKwkvKiBNYXNrIG91dCB0aGlzIHBpbiwgbm90ZSAyIGJpdHMgcGVyIHNldHRpbmcgKi8KKwl2YWwgJj0gfihVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSyA8PCAoKG9mZnNldCAmIDB4MDcpIDw8IDEpKTsKKwl3cml0ZWwodmFsLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBwY3IpKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX2lucHV0KTsKIAotaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCitzdGF0aWMgaW50IHUzMDBfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKKwkJCQkgICAgICBpbnQgdmFsdWUpCiB7CisJc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbyA9IHRvX3UzMDBfZ3BpbyhjaGlwKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBvbGRtb2RlOwogCXUzMiB2YWw7CiAKLQlpZiAoZ3BpbyA+IFUzMDBfR1BJT19NQVgpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXZhbCA9IHJlYWRsKHZpcnRiYXNlICsgVTMwMF9HUElPX1BYUENSICsgUElOX1RPX1BPUlQoZ3BpbykgKgotCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQkvKiBNYXNrIG91dCB0aGlzIHBpbiAqLwotCXZhbCAmPSB+KFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9NQVNLIDw8ICgoZ3BpbyAmIDB4MDcpIDw8IDEpKTsKKwl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBwY3IpKTsKIAkvKgotCSAqIEZJWE1FOiBjb25maWd1cmUgZm9yIHB1c2gvcHVsbCwgb3BlbiBkcmFpbiBvciBvcGVuIHNvdXJjZSBwZXIgcGluCi0JICogaW4gc2V0dXAuIFRoZSBjdXJyZW50IGRyaXZlciB3aWxsIG9ubHkgc3VwcG9ydCBwdXNoL3B1bGwuCisJICogRHJpdmUgbW9kZSBtdXN0IGJlIHNldCBieSB0aGUgc3BlY2lhbCBtb2RlIHNldCBmdW5jdGlvbiwgc2V0CisJICogcHVzaC9wdWxsIG1vZGUgYnkgZGVmYXVsdCBpZiBubyBtb2RlIGhhcyBiZWVuIHNlbGVjdGVkLgogCSAqLwotCXZhbCB8PSAoVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9QVVNIX1BVTEwKLQkJCTw8ICgoZ3BpbyAmIDB4MDcpIDw8IDEpKTsKLQl3cml0ZWwodmFsLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBDUiArIFBJTl9UT19QT1JUKGdwaW8pICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworCW9sZG1vZGUgPSB2YWwgJiAoVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX01BU0sgPDwKKwkJCSAoKG9mZnNldCAmIDB4MDcpIDw8IDEpKTsKKwkvKiBtb2RlID0gMCBtZWFucyBpbnB1dCwgZWxzZSBzb21lIG1vZGUgaXMgYWxyZWFkeSBzZXQgKi8KKwlpZiAob2xkbW9kZSA9PSAwKSB7CisJCXZhbCAmPSB+KFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9NQVNLIDw8CisJCQkgKChvZmZzZXQgJiAweDA3KSA8PCAxKSk7CisJCXZhbCB8PSAoVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9QVVNIX1BVTEwKKwkJCTw8ICgob2Zmc2V0ICYgMHgwNykgPDwgMSkpOworCQl3cml0ZWwodmFsLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBwY3IpKTsKKwl9CisJdTMwMF9ncGlvX3NldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX291dHB1dCk7CiAKLS8qCi0gKiBFbmFibGUgYW4gSVJRLCBlZGdlIGlzIHJpc2luZyBlZGdlICghPSAwKSBvciBmYWxsaW5nIGVkZ2UgKD09MCkuCi0gKi8KLXZvaWQgZW5hYmxlX2lycV9vbl9ncGlvX3Bpbih1bnNpZ25lZCBncGlvLCBpbnQgZWRnZSkKK3N0YXRpYyBpbnQgdTMwMF9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7Ci0JdTMyIHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzdHJ1Y3QgdTMwMF9ncGlvICpncGlvID0gdG9fdTMwMF9ncGlvKGNoaXApOworCWludCByZXRpcnEgPSBncGlvLT5pcnFfYmFzZSArIG9mZnNldDsKIAotCXZhbCA9IHJlYWRsKHZpcnRiYXNlICsgVTMwMF9HUElPX1BYSUVOICsgUElOX1RPX1BPUlQoZ3BpbykgKgotCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQl2YWwgfD0gKDEgPDwgKGdwaW8gJiAweDA3KSk7Ci0Jd3JpdGVsKHZhbCwgdmlydGJhc2UgKyBVMzAwX0dQSU9fUFhJRU4gKyBQSU5fVE9fUE9SVChncGlvKSAqCi0JCQkJVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCXZhbCA9IHJlYWRsKHZpcnRiYXNlICsgVTMwMF9HUElPX1BYSUNSICsgUElOX1RPX1BPUlQoZ3BpbykgKgotCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQlpZiAoZWRnZSkKLQkJdmFsIHw9ICgxIDw8IChncGlvICYgMHgwNykpOwotCWVsc2UKLQkJdmFsICY9IH4oMSA8PCAoZ3BpbyAmIDB4MDcpKTsKLQl3cml0ZWwodmFsLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19QWElDUiArIFBJTl9UT19QT1JUKGdwaW8pICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWRldl9kYmcoZ3Bpby0+ZGV2LCAicmVxdWVzdCBJUlEgZm9yIEdQSU8gJWQsIHJldHVybiAlZFxuIiwgb2Zmc2V0LAorCQlyZXRpcnEpOworCXJldHVybiByZXRpcnE7CiB9Ci1FWFBPUlRfU1lNQk9MKGVuYWJsZV9pcnFfb25fZ3Bpb19waW4pOwogCi12b2lkIGRpc2FibGVfaXJxX29uX2dwaW9fcGluKHVuc2lnbmVkIGdwaW8pCitzdGF0aWMgaW50IHUzMDBfZ3Bpb19jb25maWcoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAorCQkgICAgIHUxNiBwYXJhbSwgdW5zaWduZWQgbG9uZyAqZGF0YSkKIHsKLQl1MzIgdmFsOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSB0b191MzAwX2dwaW8oY2hpcCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXZhbCA9IHJlYWRsKHZpcnRiYXNlICsgVTMwMF9HUElPX1BYSUVOICsgUElOX1RPX1BPUlQoZ3BpbykgKgotCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQl2YWwgJj0gfigxIDw8IChncGlvICYgMHgwNykpOwotCXdyaXRlbCh2YWwsIHZpcnRiYXNlICsgVTMwMF9HUElPX1BYSUVOICsgUElOX1RPX1BPUlQoZ3BpbykgKgotCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxX29uX2dwaW9fcGluKTsKLQotLyogRW5hYmxlICh2YWx1ZSA9PSAwKSBvciBkaXNhYmxlICh2YWx1ZSA9PSAxKSBpbnRlcm5hbCBwdWxsdXAgKi8KLXZvaWQgZ3Bpb19wdWxsdXAodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCXUzMiB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAodmFsdWUpIHsKLQkJdmFsID0gcmVhZGwodmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQRVIgKyBQSU5fVE9fUE9SVChncGlvKSAqCi0JCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQkJd3JpdGVsKHZhbCB8ICgxIDw8IChncGlvICYgMHgwNykpLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBFUiArCi0JCQkJUElOX1RPX1BPUlQoZ3BpbykgKiBVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JfSBlbHNlIHsKLQkJdmFsID0gcmVhZGwodmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQRVIgKyBQSU5fVE9fUE9SVChncGlvKSAqCi0JCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQkJd3JpdGVsKHZhbCAmIH4oMSA8PCAoZ3BpbyAmIDB4MDcpKSwgdmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQRVIgKwotCQkJCVBJTl9UT19QT1JUKGdwaW8pICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGdwaW9fcHVsbHVwKTsKLQotc3RhdGljIGlycXJldHVybl90IGdwaW9faXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCB1MzAwX2dwaW9fcG9ydCAqcG9ydCA9IGRldl9pZDsKLQl1MzIgdmFsOwotCWludCBwaW47Ci0KLQkvKiBSZWFkIGV2ZW50IHJlZ2lzdGVyICovCi0JdmFsID0gcmVhZGwodmlydGJhc2UgKyBVMzAwX0dQSU9fUFhJRVYgKyBwb3J0LT5udW1iZXIgKgotCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQkvKiBNYXNrIHdpdGggZW5hYmxlIHJlZ2lzdGVyICovCi0JdmFsICY9IHJlYWRsKHZpcnRiYXNlICsgVTMwMF9HUElPX1BYSUVWICsgcG9ydC0+bnVtYmVyICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JLyogTWFzayByZWxldmFudCBiaXRzICovCi0JdmFsICY9IFUzMDBfR1BJT19QWElFVl9BTExfSVJRX0VWRU5UX01BU0s7Ci0JLyogQUNLIElSUSAoY2xlYXIgZXZlbnQpICovCi0Jd3JpdGVsKHZhbCwgdmlydGJhc2UgKyBVMzAwX0dQSU9fUFhJRVYgKyBwb3J0LT5udW1iZXIgKgotCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQkvKiBQcmludCBtZXNzYWdlICovCi0Jd2hpbGUgKHZhbCAhPSAwKSB7Ci0JCXVuc2lnbmVkIGdwaW87Ci0KLQkJcGluID0gX19mZnModmFsKTsKLQkJLyogbWFzayBvZmYgdGhpcyBwaW4gKi8KLQkJdmFsICY9IH4oMSA8PCBwaW4pOwotCQlncGlvID0gKHBvcnQtPm51bWJlciA8PCAzKSArIHBpbjsKLQotCQlpZiAoZ3Bpb19waW5bZ3Bpb10uY2FsbGJhY2spCi0JCQkodm9pZClncGlvX3BpbltncGlvXS5jYWxsYmFjayhncGlvX3BpbltncGlvXS5kYXRhKTsKLQkJZWxzZQotCQkJZGV2X2RiZyhncGlvZGV2LCAic3RyYXkgR1BJTyBJUlEgb24gbGluZSAlZFxuIiwKLQkJCSAgICAgICBncGlvKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgdm9pZCBncGlvX3NldF9pbml0aWFsX3ZhbHVlcyh2b2lkKQotewotI2lmZGVmIFUzMDBfQ09IOTAxNTcxXzMKLQlpbnQgaSwgajsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiB2YWw7Ci0KLQkvKiBXcml0ZSBkZWZhdWx0IHZhbHVlcyB0byBhbGwgcGlucyAqLwotCWZvciAoaSA9IDA7IGkgPCBVMzAwX0dQSU9fTlVNX1BPUlRTOyBpKyspIHsKLQkJdmFsID0gMDsKLQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJCXZhbCB8PSAodTMyKSAodTMwMF9ncGlvX2NvbmZpZ1tpXVtqXS5kZWZhdWx0X291dHB1dF92YWx1ZSAhPSBERUZBVUxUX09VVFBVVF9MT1cpIDw8IGo7Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJd3JpdGVsKHZhbCwgdmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQRE9SICsgaSAqIFUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBHUElPX1UzMDBfQ09ORklHX0JJQVNfVU5LTk9XTjoKKwljYXNlIEdQSU9fVTMwMF9DT05GSUdfQklBU19GTE9BVDoKKwkJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgcGVyKSk7CisJCXdyaXRlbCh2YWwgfCBVMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgcGVyKSk7CisJCWJyZWFrOworCWNhc2UgR1BJT19VMzAwX0NPTkZJR19CSUFTX1BVTExfVVA6CisJCXZhbCA9IHJlYWRsKFUzMDBfUElOX1JFRyhvZmZzZXQsIHBlcikpOworCQl3cml0ZWwodmFsICYgflUzMDBfUElOX0JJVChvZmZzZXQpLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBwZXIpKTsKKwkJYnJlYWs7CisJY2FzZSBHUElPX1UzMDBfQ09ORklHX0RSSVZFX1BVU0hfUFVMTDoKKwkJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgcGNyKSk7CisJCXZhbCAmPSB+KFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9NQVNLCisJCQkgPDwgKChvZmZzZXQgJiAweDA3KSA8PCAxKSk7CisJCXZhbCB8PSAoVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9QVVNIX1BVTEwKKwkJCTw8ICgob2Zmc2V0ICYgMHgwNykgPDwgMSkpOworCQl3cml0ZWwodmFsLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBwY3IpKTsKKwkJYnJlYWs7CisJY2FzZSBHUElPX1UzMDBfQ09ORklHX0RSSVZFX09QRU5fRFJBSU46CisJCXZhbCA9IHJlYWRsKFUzMDBfUElOX1JFRyhvZmZzZXQsIHBjcikpOworCQl2YWwgJj0gfihVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSworCQkJIDw8ICgob2Zmc2V0ICYgMHgwNykgPDwgMSkpOworCQl2YWwgfD0gKFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfT1BFTl9EUkFJTgorCQkJPDwgKChvZmZzZXQgJiAweDA3KSA8PCAxKSk7CisJCXdyaXRlbCh2YWwsIFUzMDBfUElOX1JFRyhvZmZzZXQsIHBjcikpOworCQlicmVhazsKKwljYXNlIEdQSU9fVTMwMF9DT05GSUdfRFJJVkVfT1BFTl9TT1VSQ0U6CisJCXZhbCA9IHJlYWRsKFUzMDBfUElOX1JFRyhvZmZzZXQsIHBjcikpOworCQl2YWwgJj0gfihVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSworCQkJIDw8ICgob2Zmc2V0ICYgMHgwNykgPDwgMSkpOworCQl2YWwgfD0gKFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfT1BFTl9TT1VSQ0UKKwkJCTw8ICgob2Zmc2V0ICYgMHgwNykgPDwgMSkpOworCQl3cml0ZWwodmFsLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBwY3IpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlkZXZfZXJyKGdwaW8tPmRldiwgImlsbGVnYWwgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB1MzAwX2dwaW9fY2hpcCA9IHsKKwkubGFiZWwJCQk9ICJ1MzAwLWdwaW8tY2hpcCIsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuZ2V0CQkJPSB1MzAwX2dwaW9fZ2V0LAorCS5zZXQJCQk9IHUzMDBfZ3Bpb19zZXQsCisJLmRpcmVjdGlvbl9pbnB1dAk9IHUzMDBfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmRpcmVjdGlvbl9vdXRwdXQJPSB1MzAwX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkudG9faXJxCQkJPSB1MzAwX2dwaW9fdG9faXJxLAorfTsKKworc3RhdGljIHZvaWQgdTMwMF90b2dnbGVfdHJpZ2dlcihzdHJ1Y3QgdTMwMF9ncGlvICpncGlvLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKFUzMDBfUElOX1JFRyhvZmZzZXQsIGljcikpOworCS8qIFNldCBtb2RlIGRlcGVuZGluZyBvbiBzdGF0ZSAqLworCWlmICh1MzAwX2dwaW9fZ2V0KCZncGlvLT5jaGlwLCBvZmZzZXQpKSB7CisJCS8qIEhpZ2ggbm93LCBsZXQncyB0cmlnZ2VyIG9uIGZhbGxpbmcgZWRnZSBuZXh0IHRoZW4gKi8KKwkJd3JpdGVsKHZhbCAmIH5VMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgaWNyKSk7CisJCWRldl9kYmcoZ3Bpby0+ZGV2LCAibmV4dCBJUlEgb24gZmFsbGluZyBlZGdlIG9uIHBpbiAlZFxuIiwKKwkJCW9mZnNldCk7CisJfSBlbHNlIHsKKwkJLyogTG93IG5vdywgbGV0J3MgdHJpZ2dlciBvbiByaXNpbmcgZWRnZSBuZXh0IHRoZW4gKi8KKwkJd3JpdGVsKHZhbCB8IFUzMDBfUElOX0JJVChvZmZzZXQpLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBpY3IpKTsKKwkJZGV2X2RiZyhncGlvLT5kZXYsICJuZXh0IElSUSBvbiByaXNpbmcgZWRnZSBvbiBwaW4gJWRcbiIsCisJCQlvZmZzZXQpOworCX0KK30KKworc3RhdGljIGludCB1MzAwX2dwaW9faXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCB0cmlnZ2VyKQoreworCXN0cnVjdCB1MzAwX2dwaW9fcG9ydCAqcG9ydCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSBwb3J0LT5ncGlvOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSBncGlvLT5pcnFfYmFzZTsKKwl1MzIgdmFsOworCisJaWYgKCh0cmlnZ2VyICYgSVJRRl9UUklHR0VSX1JJU0lORykgJiYKKwkgICAgKHRyaWdnZXIgJiBJUlFGX1RSSUdHRVJfRkFMTElORykpIHsKKwkJLyoKKwkJICogVGhlIEdQSU8gYmxvY2sgY2FuIG9ubHkgdHJpZ2dlciBvbiBmYWxsaW5nIE9SIHJpc2luZyBlZGdlcywKKwkJICogbm90IGJvdGguIFNvIHdlIG5lZWQgdG8gdG9nZ2xlIHRoZSBtb2RlIHdoZW5ldmVyIHRoZSBwaW4KKwkJICogZ29lcyBmcm9tIG9uZSBzdGF0ZSB0byB0aGUgb3RoZXIgd2l0aCBhIHNwZWNpYWwgc3RhdGUgZmxhZworCQkgKi8KKwkJZGV2X2RiZyhncGlvLT5kZXYsCisJCQkidHJpZ2dlciBvbiBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlIG9uIHBpbiAlZFxuIiwKKwkJCW9mZnNldCk7CisJCXBvcnQtPnRvZ2dsZV9lZGdlX21vZGUgfD0gVTMwMF9QSU5fQklUKG9mZnNldCk7CisJCXUzMDBfdG9nZ2xlX3RyaWdnZXIoZ3Bpbywgb2Zmc2V0KTsKKwl9IGVsc2UgaWYgKHRyaWdnZXIgJiBJUlFGX1RSSUdHRVJfUklTSU5HKSB7CisJCWRldl9kYmcoZ3Bpby0+ZGV2LCAidHJpZ2dlciBvbiByaXNpbmcgZWRnZSBvbiBwaW4gJWRcbiIsCisJCQlvZmZzZXQpOworCQl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBpY3IpKTsKKwkJd3JpdGVsKHZhbCB8IFUzMDBfUElOX0JJVChvZmZzZXQpLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBpY3IpKTsKKwkJcG9ydC0+dG9nZ2xlX2VkZ2VfbW9kZSAmPSB+VTMwMF9QSU5fQklUKG9mZnNldCk7CisJfSBlbHNlIGlmICh0cmlnZ2VyICYgSVJRRl9UUklHR0VSX0ZBTExJTkcpIHsKKwkJZGV2X2RiZyhncGlvLT5kZXYsICJ0cmlnZ2VyIG9uIGZhbGxpbmcgZWRnZSBvbiBwaW4gJWRcbiIsCisJCQlvZmZzZXQpOworCQl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBpY3IpKTsKKwkJd3JpdGVsKHZhbCAmIH5VMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgaWNyKSk7CisJCXBvcnQtPnRvZ2dsZV9lZGdlX21vZGUgJj0gflUzMDBfUElOX0JJVChvZmZzZXQpOwogCX0KIAotCS8qCi0JICogUHV0IGFsbCBwaW5zIHRoYXQgYXJlIHNldCB0byBlaXRoZXIgJ0dQSU9fT1VUJyBvciAnR1BJT19OT1RfVVNFRCcKLQkgKiB0byBvdXRwdXQgYW5kICdHUElPX0lOJyB0byBpbnB1dCBmb3IgZWFjaCBwb3J0LiBBbmQgaW5pdGlhbGl6ZQotCSAqIGRlZmF1bHQgdmFsdWUgb24gb3V0cHV0cy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgVTMwMF9HUElPX05VTV9QT1JUUzsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBVMzAwX0dQSU9fUElOU19QRVJfUE9SVDsgaisrKSB7Ci0JCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBDUiArCi0JCQkJCSBpICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCQkJLyogTWFzayBvdXQgdGhpcyBwaW4gKi8KLQkJCXZhbCAmPSB+KFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9NQVNLIDw8IChqIDw8IDEpKTsKKwlyZXR1cm4gMDsKK30KIAotCQkJaWYgKHUzMDBfZ3Bpb19jb25maWdbaV1bal0ucGluX3VzYWdlICE9IEdQSU9fSU4pCi0JCQkJdmFsIHw9IChVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfT1VUUFVUX1BVU0hfUFVMTCA8PCAoaiA8PCAxKSk7Ci0JCQl3cml0ZWwodmFsLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBDUiArCi0JCQkJCSBpICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworc3RhdGljIHZvaWQgdTMwMF9ncGlvX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCB1MzAwX2dwaW9fcG9ydCAqcG9ydCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSBwb3J0LT5ncGlvOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSBncGlvLT5pcnFfYmFzZTsKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgaWVuKSk7CisJd3JpdGVsKHZhbCB8IFUzMDBfUElOX0JJVChvZmZzZXQpLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBpZW4pKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHUzMDBfZ3Bpb19pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHUzMDBfZ3Bpb19wb3J0ICpwb3J0ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbyA9IHBvcnQtPmdwaW87CisJaW50IG9mZnNldCA9IGQtPmlycSAtIGdwaW8tPmlycV9iYXNlOworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBpZW4pKTsKKwl3cml0ZWwodmFsICYgflUzMDBfUElOX0JJVChvZmZzZXQpLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBpZW4pKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdTMwMF9ncGlvX2lycWNoaXAgPSB7CisJLm5hbWUJCQk9ICJ1MzAwLWdwaW8taXJxY2hpcCIsCisJLmlycV9lbmFibGUJCT0gdTMwMF9ncGlvX2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCQk9IHUzMDBfZ3Bpb19pcnFfZGlzYWJsZSwKKwkuaXJxX3NldF90eXBlCQk9IHUzMDBfZ3Bpb19pcnFfdHlwZSwKKworfTsKKworc3RhdGljIHZvaWQgdTMwMF9ncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCB1MzAwX2dwaW9fcG9ydCAqcG9ydCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CisJc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbyA9IHBvcnQtPmdwaW87CisJaW50IHBpbm9mZnNldCA9IHBvcnQtPm51bWJlciA8PCAzOyAvKiBnZXQgdGhlIHJpZ2h0IHN0cmlkZSAqLworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX2FjaygmZGVzYy0+aXJxX2RhdGEpOworCS8qIFJlYWQgZXZlbnQgcmVnaXN0ZXIgKi8KKwl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcocGlub2Zmc2V0LCBpZXYpKTsKKwkvKiBNYXNrIHJlbGV2YW50IGJpdHMgKi8KKwl2YWwgJj0gMHhGRlU7IC8qIDggYml0cyBwZXIgcG9ydCAqLworCS8qIEFDSyBJUlEgKGNsZWFyIGV2ZW50KSAqLworCXdyaXRlbCh2YWwsIFUzMDBfUElOX1JFRyhwaW5vZmZzZXQsIGlldikpOworCisJLyogQ2FsbCBJUlEgaGFuZGxlciAqLworCWlmICh2YWwgIT0gMCkgeworCQlpbnQgaXJxb2Zmc2V0OworCisJCWZvcl9lYWNoX3NldF9iaXQoaXJxb2Zmc2V0LCAmdmFsLCBVMzAwX0dQSU9fUElOU19QRVJfUE9SVCkgeworCQkJaW50IHBpbl9pcnEgPSBncGlvLT5pcnFfYmFzZSArIChwb3J0LT5udW1iZXIgPDwgMykKKwkJCQkrIGlycW9mZnNldDsKKwkJCWludCBvZmZzZXQgPSBwaW5vZmZzZXQgKyBpcnFvZmZzZXQ7CisKKwkJCWRldl9kYmcoZ3Bpby0+ZGV2LCAiR1BJTyBJUlEgJWQgb24gcGluICVkXG4iLAorCQkJCXBpbl9pcnEsIG9mZnNldCk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEocGluX2lycSk7CisJCQkvKgorCQkJICogVHJpZ2dlcmluZyBJUlEgb24gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZQorCQkJICogbmVlZHMgbW9ja2VyeQorCQkJICovCisJCQlpZiAocG9ydC0+dG9nZ2xlX2VkZ2VfbW9kZSAmIFUzMDBfUElOX0JJVChvZmZzZXQpKQorCQkJCXUzMDBfdG9nZ2xlX3RyaWdnZXIoZ3Bpbywgb2Zmc2V0KTsKIAkJfQogCX0KIAotCS8qIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBpbnRlcm5hbCBwdWxsLXVwcyBpbiB0aGUgR1BJTyBBU0lDIGJsb2NrICovCi0JZm9yIChpID0gMDsgaSA8IFUzMDBfR1BJT19NQVg7IGkrKykgewotCQl2YWwgPSAwOwotCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQkJdmFsIHw9ICh1MzIpKCh1MzAwX2dwaW9fY29uZmlnW2ldW2pdLnB1bGxfdXAgPT0gRElTQUJMRV9QVUxMX1VQKSA8PCBqKTsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQl3cml0ZWwodmFsLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBFUiArIGkgKiBVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQl9Ci0jZW5kaWYKKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfdW5tYXNrKCZkZXNjLT5pcnFfZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGdwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIF9faW5pdCB1MzAwX2dwaW9faW5pdF9waW4oc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbywKKwkJCQkgICAgICBpbnQgb2Zmc2V0LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB1MzAwX2dwaW9fY29uZmRhdGEgKmNvbmYpCiB7Ci0JdTMyIHZhbDsKLQlpbnQgZXJyID0gMDsKLQlpbnQgaTsKLQlpbnQgbnVtX2lycXM7CisJLyogU2V0IG1vZGU6IGlucHV0IG9yIG91dHB1dCAqLworCWlmIChjb25mLT5vdXRwdXQpIHsKKwkJdTMwMF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoJmdwaW8tPmNoaXAsIG9mZnNldCwgY29uZi0+b3V0dmFsKTsKIAotCWdwaW9kZXYgPSAmcGRldi0+ZGV2OwotCW1lbXNldChncGlvX3BpbiwgMCwgc2l6ZW9mKGdwaW9fcGluKSk7CisJCS8qIERlYWN0aXZhdGUgYmlhcyBtb2RlIGZvciBvdXRwdXQgKi8KKwkJdTMwMF9ncGlvX2NvbmZpZygmZ3Bpby0+Y2hpcCwgb2Zmc2V0LAorCQkJCSBHUElPX1UzMDBfQ09ORklHX0JJQVNfRkxPQVQsCisJCQkJIE5VTEwpOworCisJCS8qIFNldCBkcml2ZSBtb2RlIGZvciBvdXRwdXQgKi8KKwkJdTMwMF9ncGlvX2NvbmZpZygmZ3Bpby0+Y2hpcCwgb2Zmc2V0LAorCQkJCSBHUElPX1UzMDBfQ09ORklHX0RSSVZFX1BVU0hfUFVMTCwgTlVMTCk7CisKKwkJZGV2X2RiZyhncGlvLT5kZXYsICJzZXQgdXAgcGluICVkIGFzIG91dHB1dCwgdmFsdWU6ICVkXG4iLAorCQkJb2Zmc2V0LCBjb25mLT5vdXR2YWwpOworCX0gZWxzZSB7CisJCXUzMDBfZ3Bpb19kaXJlY3Rpb25faW5wdXQoJmdwaW8tPmNoaXAsIG9mZnNldCk7CisKKwkJLyogQWx3YXlzIHNldCBvdXRwdXQgbG93IG9uIGlucHV0IHBpbnMgKi8KKwkJdTMwMF9ncGlvX3NldCgmZ3Bpby0+Y2hpcCwgb2Zmc2V0LCAwKTsKKworCQkvKiBTZXQgYmlhcyBtb2RlIGZvciBpbnB1dCAqLworCQl1MzAwX2dwaW9fY29uZmlnKCZncGlvLT5jaGlwLCBvZmZzZXQsIGNvbmYtPmJpYXNfbW9kZSwgTlVMTCk7CisKKwkJZGV2X2RiZyhncGlvLT5kZXYsICJzZXQgdXAgcGluICVkIGFzIGlucHV0LCBiaWFzOiAlMDR4XG4iLAorCQkJb2Zmc2V0LCBjb25mLT5iaWFzX21vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHUzMDBfZ3Bpb19pbml0X2NvaDkwMTU3MShzdHJ1Y3QgdTMwMF9ncGlvICpncGlvLAorCQkJCSAgICAgc3RydWN0IHUzMDBfZ3Bpb19wbGF0Zm9ybSAqcGxhdCkKK3sKKwlpbnQgaSwgajsKKworCS8qIFdyaXRlIGRlZmF1bHQgY29uZmlnIGFuZCB2YWx1ZXMgdG8gYWxsIHBpbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGxhdC0+cG9ydHM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQljb25zdCBzdHJ1Y3QgdTMwMF9ncGlvX2NvbmZkYXRhICpjb25mOworCQkJaW50IG9mZnNldCA9IChpKjgpICsgajsKKworCQkJaWYgKHBsYXQtPnZhcmlhbnQgPT0gVTMwMF9HUElPX0NPSDkwMTU3MV8zX0JTMzM1KQorCQkJCWNvbmYgPSAmYnMzMzVfZ3Bpb19jb25maWdbaV1bal07CisJCQllbHNlIGlmIChwbGF0LT52YXJpYW50ID09IFUzMDBfR1BJT19DT0g5MDE1NzFfM19CUzM2NSkKKwkJCQljb25mID0gJmJzMzY1X2dwaW9fY29uZmlnW2ldW2pdOworCQkJZWxzZQorCQkJCWJyZWFrOworCisJCQl1MzAwX2dwaW9faW5pdF9waW4oZ3Bpbywgb2Zmc2V0LCBjb25mKTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHUzMDBfZ3Bpb19mcmVlX3BvcnRzKHN0cnVjdCB1MzAwX2dwaW8gKmdwaW8pCit7CisJc3RydWN0IHUzMDBfZ3Bpb19wb3J0ICpwb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZncGlvLT5wb3J0X2xpc3QpIHsKKwkJcG9ydCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHUzMDBfZ3Bpb19wb3J0LCBub2RlKTsKKwkJbGlzdF9kZWwoJnBvcnQtPm5vZGUpOworCQlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOworCQlrZnJlZShwb3J0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHUzMDBfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB1MzAwX2dwaW9fcGxhdGZvcm0gKnBsYXQgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW87CisJaW50IGVyciA9IDA7CisJaW50IHBvcnRubzsKKwl1MzIgdmFsOworCXUzMiBpZnI7CisJaW50IGk7CisKKwlncGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHUzMDBfZ3BpbyksIEdGUF9LRVJORUwpOworCWlmIChncGlvID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWdwaW8tPmNoaXAgPSB1MzAwX2dwaW9fY2hpcDsKKwlncGlvLT5jaGlwLm5ncGlvID0gcGxhdC0+cG9ydHMgKiBVMzAwX0dQSU9fUElOU19QRVJfUE9SVDsKKwlncGlvLT5pcnFfYmFzZSA9IHBsYXQtPmdwaW9faXJxX2Jhc2U7CisJZ3Bpby0+Y2hpcC5kZXYgPSAmcGRldi0+ZGV2OworCWdwaW8tPmNoaXAuYmFzZSA9IHBsYXQtPmdwaW9fYmFzZTsKKwlncGlvLT5kZXYgPSAmcGRldi0+ZGV2OwogCiAJLyogR2V0IEdQSU8gY2xvY2sgKi8KLQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwotCWlmIChJU19FUlIoY2xrKSkgewotCQllcnIgPSBQVFJfRVJSKGNsayk7Ci0JCWRldl9lcnIoZ3Bpb2RldiwgImNvdWxkIG5vdCBnZXQgR1BJTyBjbG9ja1xuIik7CisJZ3Bpby0+Y2xrID0gY2xrX2dldChncGlvLT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoZ3Bpby0+Y2xrKSkgeworCQllcnIgPSBQVFJfRVJSKGdwaW8tPmNsayk7CisJCWRldl9lcnIoZ3Bpby0+ZGV2LCAiY291bGQgbm90IGdldCBHUElPIGNsb2NrXG4iKTsKIAkJZ290byBlcnJfbm9fY2xrOwogCX0KLQllcnIgPSBjbGtfZW5hYmxlKGNsayk7CisJZXJyID0gY2xrX2VuYWJsZShncGlvLT5jbGspOwogCWlmIChlcnIpIHsKLQkJZGV2X2VycihncGlvZGV2LCAiY291bGQgbm90IGVuYWJsZSBHUElPIGNsb2NrXG4iKTsKKwkJZGV2X2VycihncGlvLT5kZXYsICJjb3VsZCBub3QgZW5hYmxlIEdQSU8gY2xvY2tcbiIpOwogCQlnb3RvIGVycl9ub19jbGtfZW5hYmxlOwogCX0KIAotCW1lbXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFtZW1yZXMpCisJZ3Bpby0+bWVtcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIWdwaW8tPm1lbXJlcykgeworCQlkZXZfZXJyKGdwaW8tPmRldiwgImNvdWxkIG5vdCBnZXQgR1BJTyBtZW1vcnkgcmVzb3VyY2VcbiIpOworCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycl9ub19yZXNvdXJjZTsKKwl9CiAKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbXJlcyksCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZ3Bpby0+bWVtcmVzLT5zdGFydCwKKwkJCQlyZXNvdXJjZV9zaXplKGdwaW8tPm1lbXJlcyksCiAJCQkJIkdQSU8gQ29udHJvbGxlciIpKSB7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX25vX2lvcmVnaW9uOwogCX0KIAotCXZpcnRiYXNlID0gaW9yZW1hcChtZW1yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbXJlcykpOwotCWlmICghdmlydGJhc2UpIHsKKwlncGlvLT5iYXNlID0gaW9yZW1hcChncGlvLT5tZW1yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGdwaW8tPm1lbXJlcykpOworCWlmICghZ3Bpby0+YmFzZSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9ub19pb3JlbWFwOwogCX0KLQlkZXZfaW5mbyhncGlvZGV2LCAicmVtYXBwZWQgMHglMDh4IHRvICVwXG4iLAotCQkgbWVtcmVzLT5zdGFydCwgdmlydGJhc2UpOwogCi0jaWZkZWYgVTMwMF9DT0g5MDEzMzUKLQlkZXZfaW5mbyhncGlvZGV2LCAiaW5pdGlhbGl6aW5nIEdQSU8gQ29udHJvbGxlciBDT0ggOTAxIDMzNVxuIik7Ci0JLyogVHVybiBvbiB0aGUgR1BJTyBibG9jayAqLwotCXdyaXRlbChVMzAwX0dQSU9fQ1JfQkxPQ0tfQ0xPQ0tfRU5BQkxFLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19DUik7Ci0jZW5kaWYKKwlpZiAocGxhdC0+dmFyaWFudCA9PSBVMzAwX0dQSU9fQ09IOTAxMzM1KSB7CisJCWRldl9pbmZvKGdwaW8tPmRldiwKKwkJCSAiaW5pdGlhbGl6aW5nIEdQSU8gQ29udHJvbGxlciBDT0ggOTAxIDMzNVxuIik7CisJCWdwaW8tPnN0cmlkZSA9IFUzMDBfMzM1X1BPUlRfU1RSSURFOworCQlncGlvLT5wY3IgPSBVMzAwXzMzNV9QWFBDUjsKKwkJZ3Bpby0+ZG9yID0gVTMwMF8zMzVfUFhQRE9SOworCQlncGlvLT5kaXIgPSBVMzAwXzMzNV9QWFBESVI7CisJCWdwaW8tPnBlciA9IFUzMDBfMzM1X1BYUEVSOworCQlncGlvLT5pY3IgPSBVMzAwXzMzNV9QWElDUjsKKwkJZ3Bpby0+aWVuID0gVTMwMF8zMzVfUFhJRU47CisJCWdwaW8tPmlldiA9IFUzMDBfMzM1X1BYSUVWOworCQlpZnIgPSBVMzAwXzMzNV9QWElGUjsKIAotI2lmZGVmIFUzMDBfQ09IOTAxNTcxXzMKLQlkZXZfaW5mbyhncGlvZGV2LCAiaW5pdGlhbGl6aW5nIEdQSU8gQ29udHJvbGxlciBDT0ggOTAxIDU3MS8zXG4iKTsKLQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19DUik7Ci0JZGV2X2luZm8oZ3Bpb2RldiwgIkNPSDkwMTU3MS8zIGJsb2NrIHZlcnNpb246ICVkLCAiIFwKLQkgICAgICAgIm51bWJlciBvZiBjb3JlczogJWRcbiIsCi0JICAgICAgICgodmFsICYgMHgwMDAwRkUwMCkgPj4gOSksCi0JICAgICAgICgodmFsICYgMHgwMDAwMDFGQykgPj4gMikpOwotCXdyaXRlbChVMzAwX0dQSU9fQ1JfQkxPQ0tfQ0xLUlFfRU5BQkxFLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19DUik7Ci0jZW5kaWYKKwkJLyogVHVybiBvbiB0aGUgR1BJTyBibG9jayAqLworCQl3cml0ZWwoVTMwMF8zMzVfQ1JfQkxPQ0tfQ0xPQ0tfRU5BQkxFLAorCQkgICAgICAgZ3Bpby0+YmFzZSArIFUzMDBfMzM1X0NSKTsKKwl9IGVsc2UgaWYgKHBsYXQtPnZhcmlhbnQgPT0gVTMwMF9HUElPX0NPSDkwMTU3MV8zX0JTMzM1IHx8CisJCSAgIHBsYXQtPnZhcmlhbnQgPT0gVTMwMF9HUElPX0NPSDkwMTU3MV8zX0JTMzY1KSB7CisJCWRldl9pbmZvKGdwaW8tPmRldiwKKwkJCSAiaW5pdGlhbGl6aW5nIEdQSU8gQ29udHJvbGxlciBDT0ggOTAxIDU3MS8zXG4iKTsKKwkJZ3Bpby0+c3RyaWRlID0gVTMwMF81NzFfUE9SVF9TVFJJREU7CisJCWdwaW8tPnBjciA9IFUzMDBfNTcxX1BYUENSOworCQlncGlvLT5kb3IgPSBVMzAwXzU3MV9QWFBET1I7CisJCWdwaW8tPmRpciA9IFUzMDBfNTcxX1BYUERJUjsKKwkJZ3Bpby0+cGVyID0gVTMwMF81NzFfUFhQRVI7CisJCWdwaW8tPmljciA9IFUzMDBfNTcxX1BYSUNSOworCQlncGlvLT5pZW4gPSBVMzAwXzU3MV9QWElFTjsKKwkJZ3Bpby0+aWV2ID0gVTMwMF81NzFfUFhJRVY7CisJCWlmciA9IFUzMDBfNTcxX1BYSUZSOwogCi0JZ3Bpb19zZXRfaW5pdGlhbF92YWx1ZXMoKTsKLQotCWZvciAobnVtX2lycXMgPSAwIDsgbnVtX2lycXMgPCBVMzAwX0dQSU9fTlVNX1BPUlRTOyBudW1faXJxcysrKSB7Ci0KLQkJZ3Bpb19wb3J0c1tudW1faXJxc10uaXJxID0KLQkJCXBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsCi0JCQkJCQlncGlvX3BvcnRzW251bV9pcnFzXS5uYW1lKTsKLQotCQllcnIgPSByZXF1ZXN0X2lycShncGlvX3BvcnRzW251bV9pcnFzXS5pcnEsCi0JCQkJICBncGlvX2lycV9oYW5kbGVyLCBJUlFGX0RJU0FCTEVELAotCQkJCSAgZ3Bpb19wb3J0c1tudW1faXJxc10ubmFtZSwKLQkJCQkgICZncGlvX3BvcnRzW251bV9pcnFzXSk7Ci0JCWlmIChlcnIpIHsKLQkJCWRldl9lcnIoZ3Bpb2RldiwgImNhbm5vdCBhbGxvY2F0ZSBJUlEgZm9yICVzIVxuIiwKLQkJCQlncGlvX3BvcnRzW251bV9pcnFzXS5uYW1lKTsKLQkJCWdvdG8gZXJyX25vX2lycTsKLQkJfQotCQkvKiBUdXJucyBvZmYgUG9ydFhfaXJxX2ZvcmNlICovCi0JCXdyaXRlbCgweDAsIHZpcnRiYXNlICsgVTMwMF9HUElPX1BYSUZSICsKLQkJCQkgbnVtX2lycXMgKiBVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7CisJCXZhbCA9IHJlYWRsKGdwaW8tPmJhc2UgKyBVMzAwXzU3MV9DUik7CisJCWRldl9pbmZvKGdwaW8tPmRldiwgIkNPSDkwMTU3MS8zIGJsb2NrIHZlcnNpb246ICVkLCAiIFwKKwkJCSAibnVtYmVyIG9mIGNvcmVzOiAlZCB0b3RhbGxpbmcgJWQgcGluc1xuIiwKKwkJCSAoKHZhbCAmIDB4MDAwMDAxRkMpID4+IDIpLAorCQkJICgodmFsICYgMHgwMDAwRkUwMCkgPj4gOSksCisJCQkgKCh2YWwgJiAweDAwMDBGRTAwKSA+PiA5KSAqIDgpOworCQl3cml0ZWwoVTMwMF81NzFfQ1JfQkxPQ0tfQ0xLUlFfRU5BQkxFLAorCQkgICAgICAgZ3Bpby0+YmFzZSArIFUzMDBfNTcxX0NSKTsKKwkJdTMwMF9ncGlvX2luaXRfY29oOTAxNTcxKGdwaW8sIHBsYXQpOworCX0gZWxzZSB7CisJCWRldl9lcnIoZ3Bpby0+ZGV2LCAidW5rbm93biBibG9jayB2YXJpYW50XG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfdW5rbm93bl92YXJpYW50OwogCX0KIAorCS8qIEFkZCBlYWNoIHBvcnQgd2l0aCBpdHMgSVJRIHNlcGFyYXRlbHkgKi8KKwlJTklUX0xJU1RfSEVBRCgmZ3Bpby0+cG9ydF9saXN0KTsKKwlmb3IgKHBvcnRubyA9IDAgOyBwb3J0bm8gPCBwbGF0LT5wb3J0czsgcG9ydG5vKyspIHsKKwkJc3RydWN0IHUzMDBfZ3Bpb19wb3J0ICpwb3J0ID0KKwkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MzAwX2dwaW9fcG9ydCksIEdGUF9LRVJORUwpOworCisJCWlmICghcG9ydCkgeworCQkJZGV2X2VycihncGlvLT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9ub19wb3J0OworCQl9CisKKwkJc25wcmludGYocG9ydC0+bmFtZSwgOCwgImdwaW8lZCIsIHBvcnRubyk7CisJCXBvcnQtPm51bWJlciA9IHBvcnRubzsKKwkJcG9ydC0+Z3BpbyA9IGdwaW87CisKKwkJcG9ydC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwKKwkJCQkJCSAgICBwb3J0LT5uYW1lKTsKKworCQlkZXZfZGJnKGdwaW8tPmRldiwgInJlZ2lzdGVyIElSUSAlZCBmb3IgJXNcbiIsIHBvcnQtPmlycSwKKwkJCXBvcnQtPm5hbWUpOworCisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKHBvcnQtPmlycSwgdTMwMF9ncGlvX2lycV9oYW5kbGVyKTsKKwkJaXJxX3NldF9oYW5kbGVyX2RhdGEocG9ydC0+aXJxLCBwb3J0KTsKKworCQkvKiBGb3IgZWFjaCBHUElPIHBpbiBzZXQgdGhlIHVuaXF1ZSBJUlEgaGFuZGxlciAqLworCQlmb3IgKGkgPSAwOyBpIDwgVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQ7IGkrKykgeworCQkJaW50IGlycW5vID0gZ3Bpby0+aXJxX2Jhc2UgKyAocG9ydG5vIDw8IDMpICsgaTsKKworCQkJZGV2X2RiZyhncGlvLT5kZXYsICJoYW5kbGVyIGZvciBJUlEgJWQgb24gJXNcbiIsCisJCQkJaXJxbm8sIHBvcnQtPm5hbWUpOworCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycW5vLCAmdTMwMF9ncGlvX2lycWNoaXAsCisJCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOworCQkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CisJCQlpcnFfc2V0X2NoaXBfZGF0YShpcnFubywgcG9ydCk7CisJCX0KKworCQkvKiBUdXJucyBvZmYgaXJxIGZvcmNlICh0ZXN0IHJlZ2lzdGVyKSBmb3IgdGhpcyBwb3J0ICovCisJCXdyaXRlbCgweDAsIGdwaW8tPmJhc2UgKyBwb3J0bm8gKiBncGlvLT5zdHJpZGUgKyBpZnIpOworCisJCWxpc3RfYWRkX3RhaWwoJnBvcnQtPm5vZGUsICZncGlvLT5wb3J0X2xpc3QpOworCX0KKwlkZXZfZGJnKGdwaW8tPmRldiwgImluaXRpYWxpemVkICVkIEdQSU8gcG9ydHNcbiIsIHBvcnRubyk7CisKKwllcnIgPSBncGlvY2hpcF9hZGQoJmdwaW8tPmNoaXApOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihncGlvLT5kZXYsICJ1bmFibGUgdG8gYWRkIGdwaW9jaGlwOiAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfbm9fY2hpcDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBncGlvKTsKKwogCXJldHVybiAwOwogCi0gZXJyX25vX2lycToKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2lycXM7IGkrKykKLQkJZnJlZV9pcnEoZ3Bpb19wb3J0c1tpXS5pcnEsICZncGlvX3BvcnRzW2ldKTsKLQlpb3VubWFwKHZpcnRiYXNlKTsKLSBlcnJfbm9faW9yZW1hcDoKLQlyZWxlYXNlX21lbV9yZWdpb24obWVtcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW1yZXMpKTsKLSBlcnJfbm9faW9yZWdpb246Ci0gZXJyX25vX3Jlc291cmNlOgotCWNsa19kaXNhYmxlKGNsayk7Ci0gZXJyX25vX2Nsa19lbmFibGU6Ci0JY2xrX3B1dChjbGspOwotIGVycl9ub19jbGs6Ci0JZGV2X2luZm8oZ3Bpb2RldiwgIm1vZHVsZSBFUlJPUjolZFxuIiwgZXJyKTsKK2Vycl9ub19jaGlwOgorZXJyX25vX3BvcnQ6CisJdTMwMF9ncGlvX2ZyZWVfcG9ydHMoZ3Bpbyk7CitlcnJfdW5rbm93bl92YXJpYW50OgorCWlvdW5tYXAoZ3Bpby0+YmFzZSk7CitlcnJfbm9faW9yZW1hcDoKKwlyZWxlYXNlX21lbV9yZWdpb24oZ3Bpby0+bWVtcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShncGlvLT5tZW1yZXMpKTsKK2Vycl9ub19pb3JlZ2lvbjoKK2Vycl9ub19yZXNvdXJjZToKKwljbGtfZGlzYWJsZShncGlvLT5jbGspOworZXJyX25vX2Nsa19lbmFibGU6CisJY2xrX3B1dChncGlvLT5jbGspOworZXJyX25vX2NsazoKKwlrZnJlZShncGlvKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAibW9kdWxlIEVSUk9SOiVkXG4iLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19leGl0IGdwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZXhpdCB1MzAwX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHUzMDBfZ3Bpb19wbGF0Zm9ybSAqcGxhdCA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBlcnI7CiAKIAkvKiBUdXJuIG9mZiB0aGUgR1BJTyBibG9jayAqLwotCXdyaXRlbCgweDAwMDAwMDAwVSwgdmlydGJhc2UgKyBVMzAwX0dQSU9fQ1IpOwotCWZvciAoaSA9IDAgOyBpIDwgVTMwMF9HUElPX05VTV9QT1JUUzsgaSsrKQotCQlmcmVlX2lycShncGlvX3BvcnRzW2ldLmlycSwgJmdwaW9fcG9ydHNbaV0pOwotCWlvdW5tYXAodmlydGJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbXJlcykpOwotCWNsa19kaXNhYmxlKGNsayk7Ci0JY2xrX3B1dChjbGspOworCWlmIChwbGF0LT52YXJpYW50ID09IFUzMDBfR1BJT19DT0g5MDEzMzUpCisJCXdyaXRlbCgweDAwMDAwMDAwVSwgZ3Bpby0+YmFzZSArIFUzMDBfMzM1X0NSKTsKKwlpZiAocGxhdC0+dmFyaWFudCA9PSBVMzAwX0dQSU9fQ09IOTAxNTcxXzNfQlMzMzUgfHwKKwkgICAgcGxhdC0+dmFyaWFudCA9PSBVMzAwX0dQSU9fQ09IOTAxNTcxXzNfQlMzNjUpCisJCXdyaXRlbCgweDAwMDAwMDAwVSwgZ3Bpby0+YmFzZSArIFUzMDBfNTcxX0NSKTsKKworCWVyciA9IGdwaW9jaGlwX3JlbW92ZSgmZ3Bpby0+Y2hpcCk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihncGlvLT5kZXYsICJ1bmFibGUgdG8gcmVtb3ZlIGdwaW9jaGlwOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJdTMwMF9ncGlvX2ZyZWVfcG9ydHMoZ3Bpbyk7CisJaW91bm1hcChncGlvLT5iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oZ3Bpby0+bWVtcmVzLT5zdGFydCwKKwkJCSAgIHJlc291cmNlX3NpemUoZ3Bpby0+bWVtcmVzKSk7CisJY2xrX2Rpc2FibGUoZ3Bpby0+Y2xrKTsKKwljbGtfcHV0KGdwaW8tPmNsayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoZ3Bpbyk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdTMwMF9ncGlvX2RyaXZlciA9IHsKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAidTMwMC1ncGlvIiwKIAl9LAotCS5yZW1vdmUJCT0gX19leGl0X3AoZ3Bpb19yZW1vdmUpLAorCS5yZW1vdmUJCT0gX19leGl0X3AodTMwMF9ncGlvX3JlbW92ZSksCiB9OwogCiAKIHN0YXRpYyBpbnQgX19pbml0IHUzMDBfZ3Bpb19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZ3Bpb19kcml2ZXIsIGdwaW9fcHJvYmUpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnUzMDBfZ3Bpb19kcml2ZXIsIHUzMDBfZ3Bpb19wcm9iZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB1MzAwX2dwaW9fZXhpdCh2b2lkKQogewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZncGlvX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnUzMDBfZ3Bpb19kcml2ZXIpOwogfQogCiBhcmNoX2luaXRjYWxsKHUzMDBfZ3Bpb19pbml0KTsKIG1vZHVsZV9leGl0KHUzMDBfZ3Bpb19leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4iKTsKLQotI2lmZGVmIFUzMDBfQ09IOTAxNTcxXzMKLU1PRFVMRV9ERVNDUklQVElPTigiU1QtRXJpY3Nzb24gQUIgQ09IIDkwMSA1NzEvMyBHUElPIGRyaXZlciIpOwotI2VuZGlmCi0KLSNpZmRlZiBVMzAwX0NPSDkwMTMzNQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTVC1Fcmljc3NvbiBBQiBDT0ggOTAxIDMzNSBHUElPIGRyaXZlciIpOwotI2VuZGlmCi0KK01PRFVMRV9ERVNDUklQVElPTigiU1QtRXJpY3Nzb24gQUIgQ09IIDkwMSAzMzUvQ09IIDkwMSA1NzEvMyBHUElPIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8teGlsaW54LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby14aWxpbnguYwppbmRleCA4NDZmYmQ1Li4wY2U2YWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby14aWxpbnguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby14aWxpbnguYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCmluZGV4IGI0OTM2NjMuLjEzNjg4MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCkBAIC05LDcgKzksNiBAQAogCWRlcGVuZHMgb24gKEFHUCB8fCBBR1A9bikgJiYgIUVNVUxBVEVEX0NNUFhDSEcgJiYgTU1VCiAJc2VsZWN0IEkyQwogCXNlbGVjdCBJMkNfQUxHT0JJVAotCXNlbGVjdCBTTE9XX1dPUksKIAloZWxwCiAJICBLZXJuZWwtbGV2ZWwgc3VwcG9ydCBmb3IgdGhlIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUgKERSSSkKIAkgIGludHJvZHVjZWQgaW4gWEZyZWU4NiA0LjAuIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgbmVlZCB0byBzZWxlY3QKQEAgLTk2LDYgKzk1LDcgQEAKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAogCSMgaTkxNSBkZXBlbmRzIG9uIEFDUElfVklERU8gd2hlbiBBQ1BJIGlzIGVuYWJsZWQKIAkjIGJ1dCBmb3Igc2VsZWN0IHRvIHdvcmssIG5lZWQgdG8gc2VsZWN0IEFDUElfVklERU8ncyBkZXBlbmRlbmNpZXMsIGljaworCXNlbGVjdCBCQUNLTElHSFRfTENEX1NVUFBPUlQgaWYgQUNQSQogCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFIGlmIEFDUEkKIAlzZWxlY3QgVklERU9fT1VUUFVUX0NPTlRST0wgaWYgQUNQSQogCXNlbGVjdCBJTlBVVCBpZiBBQ1BJCkBAIC0xNTgsMyArMTU4LDcgQEAKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBTYXZhZ2UzRC80L1N1cGVyU2F2YWdlL1Byby9Ud2lzdGVyCiAJICBjaGlwc2V0LiBJZiBNIGlzIHNlbGVjdGVkIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2F2YWdlLgorCitzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9leHlub3MvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKaW5kZXggODljZjA1YS4uYzA0OTZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQpAQCAtMzUsNCArMzUsNSBAQAogb2JqLSQoQ09ORklHX0RSTV9WTVdHRlgpKz0gdm13Z2Z4Lwogb2JqLSQoQ09ORklHX0RSTV9WSUEpCSs9dmlhLwogb2JqLSQoQ09ORklHX0RSTV9OT1VWRUFVKSArPW5vdXZlYXUvCitvYmotJChDT05GSUdfRFJNX0VYWU5PUykgKz1leHlub3MvCiBvYmoteQkJCSs9IGkyYy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hdGlfcGNpZ2FydC5jIGIvZHJpdmVycy9ncHUvZHJtL2F0aV9wY2lnYXJ0LmMKaW5kZXggMWMzNjQ5Mi4uOWFmZTQ5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2F0aV9wY2lnYXJ0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2F0aV9wY2lnYXJ0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCiAjIGRlZmluZSBBVElfUENJR0FSVF9QQUdFX1NJWkUJCTQwOTYJLyoqPCBQQ0kgR0FSVCBwYWdlIHNpemUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZmZlci5jCmluZGV4IDUyOWEwZGIuLjA4Y2NlZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZmZXIuYwpAQCAtMzIsNiArMzIsNyBAQAogICogUGF1bGkgTmllbWluZW4gPHN1b2trb3MtYXQtZ21haWwtZG90LWNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtX2J1ZmZlci5oIgogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKaW5kZXggNjFlMWVmOS4uMzAzNzJmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZzLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc2htcGFyYW0uaD4KICNpbmNsdWRlICJkcm1QLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY2FjaGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY2FjaGUuYwppbmRleCAwZTNiZDViLi41OTI4NjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NhY2hlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jYWNoZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAgKiBBdXRob3JzOiBUaG9tYXMgSGVsbHN0csO2bSA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwppbmRleCBmZTczOGYwLi40MDVjNjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwpAQCAtMzEsNiArMzEsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtX2NydGMuaCIKQEAgLTE2Miw2ICsxNjMsNyBAQAogCXsgRFJNX01PREVfQ09OTkVDVE9SX0hETUlCLCAiSERNSS1CIiwgMCB9LAogCXsgRFJNX01PREVfQ09OTkVDVE9SX1RWLCAiVFYiLCAwIH0sCiAJeyBEUk1fTU9ERV9DT05ORUNUT1JfZURQLCAiZURQIiwgMCB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX1ZJUlRVQUwsICJWaXJ0dWFsIiwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBkcm1fZW5jb2Rlcl9lbnVtX2xpc3RbXSA9CkBAIC0xNzAsNiArMTcyLDcgQEAKIAl7IERSTV9NT0RFX0VOQ09ERVJfVE1EUywgIlRNRFMiIH0sCiAJeyBEUk1fTU9ERV9FTkNPREVSX0xWRFMsICJMVkRTIiB9LAogCXsgRFJNX01PREVfRU5DT0RFUl9UVkRBQywgIlRWIiB9LAorCXsgRFJNX01PREVfRU5DT0RFUl9WSVJUVUFMLCAiVmlydHVhbCIgfSwKIH07CiAKIGNoYXIgKmRybV9nZXRfZW5jb2Rlcl9uYW1lKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTQ2Myw4ICs0NjYsMTAgQEAKIAlsaXN0X2FkZF90YWlsKCZjb25uZWN0b3ItPmhlYWQsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0KTsKIAlkZXYtPm1vZGVfY29uZmlnLm51bV9jb25uZWN0b3IrKzsKIAotCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKLQkJCQkgICAgICBkZXYtPm1vZGVfY29uZmlnLmVkaWRfcHJvcGVydHksIDApOworCWlmIChjb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfVklSVFVBTCkKKwkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCQkgICAgICBkZXYtPm1vZGVfY29uZmlnLmVkaWRfcHJvcGVydHksCisJCQkJCSAgICAgIDApOwogCiAJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAogCQkJCSAgICAgIGRldi0+bW9kZV9jb25maWcuZHBtc19wcm9wZXJ0eSwgMCk7CkBAIC0yMTEzLDggKzIxMTgsMTAgQEAKIAlwcm9wZXJ0eS0+bnVtX3ZhbHVlcyA9IG51bV92YWx1ZXM7CiAJSU5JVF9MSVNUX0hFQUQoJnByb3BlcnR5LT5lbnVtX2Jsb2JfbGlzdCk7CiAKLQlpZiAobmFtZSkKKwlpZiAobmFtZSkgewogCQlzdHJuY3B5KHByb3BlcnR5LT5uYW1lLCBuYW1lLCBEUk1fUFJPUF9OQU1FX0xFTik7CisJCXByb3BlcnR5LT5uYW1lW0RSTV9QUk9QX05BTUVfTEVOLTFdID0gJ1wwJzsKKwl9CiAKIAlsaXN0X2FkZF90YWlsKCZwcm9wZXJ0eS0+aGVhZCwgJmRldi0+bW9kZV9jb25maWcucHJvcGVydHlfbGlzdCk7CiAJcmV0dXJuIHByb3BlcnR5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCmluZGV4IGY4OGE5YjIuLjM5NjlmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKQEAgLTI5LDYgKzI5LDkgQEAKICAqICAgICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jcnRjLmgiCiAjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCkBAIC0zNzIsMTEgKzM3NSwxMyBAQAogCQllbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CiAJCWlmICghKHJldCA9IGVuY29kZXJfZnVuY3MtPm1vZGVfZml4dXAoZW5jb2RlciwgbW9kZSwKIAkJCQkJCSAgICAgIGFkanVzdGVkX21vZGUpKSkgeworCQkJRFJNX0RFQlVHX0tNUygiRW5jb2RlciBmaXh1cCBmYWlsZWRcbiIpOwogCQkJZ290byBkb25lOwogCQl9CiAJfQogCiAJaWYgKCEocmV0ID0gY3J0Y19mdW5jcy0+bW9kZV9maXh1cChjcnRjLCBtb2RlLCBhZGp1c3RlZF9tb2RlKSkpIHsKKwkJRFJNX0RFQlVHX0tNUygiQ1JUQyBmaXh1cCBmYWlsZWRcbiIpOwogCQlnb3RvIGRvbmU7CiAJfQogCURSTV9ERUJVR19LTVMoIltDUlRDOiVkXVxuIiwgY3J0Yy0+YmFzZS5pZCk7CkBAIC00NzksNiArNDg0LDcgQEAKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqc2F2ZV9jb25uZWN0b3JzLCAqY29ubmVjdG9yOwogCWludCBjb3VudCA9IDAsIHJvLCBmYWlsID0gMDsKIAlzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICpjcnRjX2Z1bmNzOworCXN0cnVjdCBkcm1fbW9kZV9zZXQgc2F2ZV9zZXQ7CiAJaW50IHJldCA9IDA7CiAJaW50IGk7CiAKQEAgLTU1MSw2ICs1NTcsMTIgQEAKIAkJc2F2ZV9jb25uZWN0b3JzW2NvdW50KytdID0gKmNvbm5lY3RvcjsKIAl9CiAKKwlzYXZlX3NldC5jcnRjID0gc2V0LT5jcnRjOworCXNhdmVfc2V0Lm1vZGUgPSAmc2V0LT5jcnRjLT5tb2RlOworCXNhdmVfc2V0LnggPSBzZXQtPmNydGMtPng7CisJc2F2ZV9zZXQueSA9IHNldC0+Y3J0Yy0+eTsKKwlzYXZlX3NldC5mYiA9IHNldC0+Y3J0Yy0+ZmI7CisKIAkvKiBXZSBzaG91bGQgYmUgYWJsZSB0byBjaGVjayBoZXJlIGlmIHRoZSBmYiBoYXMgdGhlIHNhbWUgcHJvcGVydGllcwogCSAqIGFuZCB0aGVuIGp1c3QgZmxpcF9vcl9tb3ZlIGl0ICovCiAJaWYgKHNldC0+Y3J0Yy0+ZmIgIT0gc2V0LT5mYikgewpAQCAtNzE2LDYgKzcyOCwxMiBAQAogCQkqY29ubmVjdG9yID0gc2F2ZV9jb25uZWN0b3JzW2NvdW50KytdOwogCX0KIAorCS8qIFRyeSB0byByZXN0b3JlIHRoZSBjb25maWcgKi8KKwlpZiAobW9kZV9jaGFuZ2VkICYmCisJICAgICFkcm1fY3J0Y19oZWxwZXJfc2V0X21vZGUoc2F2ZV9zZXQuY3J0Yywgc2F2ZV9zZXQubW9kZSwgc2F2ZV9zZXQueCwKKwkJCQkgICAgICBzYXZlX3NldC55LCBzYXZlX3NldC5mYikpCisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlc3RvcmUgY29uZmlnIGFmdGVyIG1vZGVzZXQgZmFpbHVyZVxuIik7CisKIAlrZnJlZShzYXZlX2Nvbm5lY3RvcnMpOwogCWtmcmVlKHNhdmVfZW5jb2RlcnMpOwogCWtmcmVlKHNhdmVfY3J0Y3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2RlYnVnZnMuYwppbmRleCA5ZDI2NjhhLi4xYzdhMWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2RlYnVnZnMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKQEAgLTEwNywxMSArMTA4LDggQEAKIAkJZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmaWxlc1tpXS5uYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKIAkJCQkJICByb290LCB0bXAsICZkcm1fZGVidWdmc19mb3BzKTsKIAkJaWYgKCFlbnQpIHsKLQkJCWNoYXIgbmFtZVs2NF07Ci0JCQlzdHJuY3B5KG5hbWUsIHJvb3QtPmRfbmFtZS5uYW1lLAotCQkJCQkJbWluKHJvb3QtPmRfbmFtZS5sZW4sIDY0VSkpOwogCQkJRFJNX0VSUk9SKCJDYW5ub3QgY3JlYXRlIC9zeXMva2VybmVsL2RlYnVnL2RyaS8lcy8lc1xuIiwKLQkJCQkgIG5hbWUsIGZpbGVzW2ldLm5hbWUpOworCQkJCSAgcm9vdC0+ZF9uYW1lLm5hbWUsIGZpbGVzW2ldLm5hbWUpOwogCQkJa2ZyZWUodG1wKTsKIAkJCXJldCA9IC0xOwogCQkJZ290byBmYWlsOwpAQCAtMTIwLDcgKzExOCwxMCBAQAogCQl0bXAtPm1pbm9yID0gbWlub3I7CiAJCXRtcC0+ZGVudCA9IGVudDsKIAkJdG1wLT5pbmZvX2VudCA9ICZmaWxlc1tpXTsKLQkJbGlzdF9hZGQoJih0bXAtPmxpc3QpLCAmKG1pbm9yLT5kZWJ1Z2ZzX25vZGVzLmxpc3QpKTsKKworCQltdXRleF9sb2NrKCZtaW5vci0+ZGVidWdmc19sb2NrKTsKKwkJbGlzdF9hZGQoJnRtcC0+bGlzdCwgJm1pbm9yLT5kZWJ1Z2ZzX2xpc3QpOworCQltdXRleF91bmxvY2soJm1pbm9yLT5kZWJ1Z2ZzX2xvY2spOwogCX0KIAlyZXR1cm4gMDsKIApAQCAtMTQ4LDcgKzE0OSw4IEBACiAJY2hhciBuYW1lWzY0XTsKIAlpbnQgcmV0OwogCi0JSU5JVF9MSVNUX0hFQUQoJm1pbm9yLT5kZWJ1Z2ZzX25vZGVzLmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZtaW5vci0+ZGVidWdmc19saXN0KTsKKwltdXRleF9pbml0KCZtaW5vci0+ZGVidWdmc19sb2NrKTsKIAlzcHJpbnRmKG5hbWUsICIlZCIsIG1pbm9yX2lkKTsKIAltaW5vci0+ZGVidWdmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHJvb3QpOwogCWlmICghbWlub3ItPmRlYnVnZnNfcm9vdCkgewpAQCAtMTk0LDggKzE5Niw5IEBACiAJc3RydWN0IGRybV9pbmZvX25vZGUgKnRtcDsKIAlpbnQgaTsKIAorCW11dGV4X2xvY2soJm1pbm9yLT5kZWJ1Z2ZzX2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHEsICZtaW5vci0+ZGVidWdmc19ub2Rlcy5saXN0KSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHEsICZtaW5vci0+ZGVidWdmc19saXN0KSB7CiAJCQl0bXAgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGRybV9pbmZvX25vZGUsIGxpc3QpOwogCQkJaWYgKHRtcC0+aW5mb19lbnQgPT0gJmZpbGVzW2ldKSB7CiAJCQkJZGVidWdmc19yZW1vdmUodG1wLT5kZW50KTsKQEAgLTIwNCw2ICsyMDcsNyBAQAogCQkJfQogCQl9CiAJfQorCW11dGV4X3VubG9jaygmbWlub3ItPmRlYnVnZnNfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9kZWJ1Z2ZzX3JlbW92ZV9maWxlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kbWEuYwppbmRleCAyNTJjYmQ3Li5jZmI0ZTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZG1hLmMKQEAgLTMzLDYgKzMzLDcgQEAKICAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCmluZGV4IDkzYTExMmQuLjQwYzE4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYwpAQCAtNDgsNiArNDgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtX2NvcmUuaCIKIApAQCAtMTI0LDcgKzEyNSw3IEBACiAJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfU0dfQUxMT0MsIGRybV9zZ19hbGxvY19pb2N0bCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZKSwKIAlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9TR19GUkVFLCBkcm1fc2dfZnJlZSwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZKSwKIAotCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX1dBSVRfVkJMQU5LLCBkcm1fd2FpdF92YmxhbmssIDApLAorCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX1dBSVRfVkJMQU5LLCBkcm1fd2FpdF92YmxhbmssIERSTV9VTkxPQ0tFRCksCiAKIAlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9NT0RFU0VUX0NUTCwgZHJtX21vZGVzZXRfY3RsLCAwKSwKIApAQCAtNDM4LDYgKzQzOSw4IEBACiAJCQkJCWdvdG8gZXJyX2kxOwogCQkJCX0KIAkJCX0KKwkJCWlmIChhc2l6ZSA+IHVzaXplKQorCQkJCW1lbXNldChrZGF0YSArIHVzaXplLCAwLCBhc2l6ZSAtIHVzaXplKTsKIAkJfQogCiAJCWlmIChjbWQgJiBJT0NfSU4pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKaW5kZXggNzQyNWU1Yy4uM2U5MjdjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9lZGlkLmgiCiAjaW5jbHVkZSAiZHJtX2VkaWRfbW9kZXMuaCIKQEAgLTEzMTksNiArMTMyMCw3IEBACiAjZGVmaW5lIEhETUlfSURFTlRJRklFUiAweDAwMEMwMwogI2RlZmluZSBBVURJT19CTE9DSwkweDAxCiAjZGVmaW5lIFZFTkRPUl9CTE9DSyAgICAweDAzCisjZGVmaW5lIFNQRUFLRVJfQkxPQ0sJMHgwNAogI2RlZmluZSBFRElEX0JBU0lDX0FVRElPCSgxIDw8IDYpCiAKIC8qKgpAQCAtMTM0Nyw2ICsxMzQ5LDE3NiBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1fZmluZF9jZWFfZXh0ZW5zaW9uKTsKIAorc3RhdGljIHZvaWQKK3BhcnNlX2hkbWlfdnNkYihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1aW50OF90ICpkYikKK3sKKwljb25uZWN0b3ItPmVsZFs1XSB8PSAoZGJbNl0gPj4gNykgPDwgMTsgIC8qIFN1cHBvcnRzX0FJICovCisKKwljb25uZWN0b3ItPmR2aV9kdWFsID0gZGJbNl0gJiAxOworCWNvbm5lY3Rvci0+bWF4X3RtZHNfY2xvY2sgPSBkYls3XSAqIDU7CisKKwljb25uZWN0b3ItPmxhdGVuY3lfcHJlc2VudFswXSA9IGRiWzhdID4+IDc7CisJY29ubmVjdG9yLT5sYXRlbmN5X3ByZXNlbnRbMV0gPSAoZGJbOF0gPj4gNikgJiAxOworCWNvbm5lY3Rvci0+dmlkZW9fbGF0ZW5jeVswXSA9IGRiWzldOworCWNvbm5lY3Rvci0+YXVkaW9fbGF0ZW5jeVswXSA9IGRiWzEwXTsKKwljb25uZWN0b3ItPnZpZGVvX2xhdGVuY3lbMV0gPSBkYlsxMV07CisJY29ubmVjdG9yLT5hdWRpb19sYXRlbmN5WzFdID0gZGJbMTJdOworCisJRFJNX0xPR19LTVMoIkhETUk6IERWSSBkdWFsICVkLCAiCisJCSAgICAibWF4IFRNRFMgY2xvY2sgJWQsICIKKwkJICAgICJsYXRlbmN5IHByZXNlbnQgJWQgJWQsICIKKwkJICAgICJ2aWRlbyBsYXRlbmN5ICVkICVkLCAiCisJCSAgICAiYXVkaW8gbGF0ZW5jeSAlZCAlZFxuIiwKKwkJICAgIGNvbm5lY3Rvci0+ZHZpX2R1YWwsCisJCSAgICBjb25uZWN0b3ItPm1heF90bWRzX2Nsb2NrLAorCSAgICAgIChpbnQpIGNvbm5lY3Rvci0+bGF0ZW5jeV9wcmVzZW50WzBdLAorCSAgICAgIChpbnQpIGNvbm5lY3Rvci0+bGF0ZW5jeV9wcmVzZW50WzFdLAorCQkgICAgY29ubmVjdG9yLT52aWRlb19sYXRlbmN5WzBdLAorCQkgICAgY29ubmVjdG9yLT52aWRlb19sYXRlbmN5WzFdLAorCQkgICAgY29ubmVjdG9yLT5hdWRpb19sYXRlbmN5WzBdLAorCQkgICAgY29ubmVjdG9yLT5hdWRpb19sYXRlbmN5WzFdKTsKK30KKworc3RhdGljIHZvaWQKK21vbml0b3JfbmFtZShzdHJ1Y3QgZGV0YWlsZWRfdGltaW5nICp0LCB2b2lkICpkYXRhKQoreworCWlmICh0LT5kYXRhLm90aGVyX2RhdGEudHlwZSA9PSBFRElEX0RFVEFJTF9NT05JVE9SX05BTUUpCisJCSoodTggKiopZGF0YSA9IHQtPmRhdGEub3RoZXJfZGF0YS5kYXRhLnN0ci5zdHI7Cit9CisKKy8qKgorICogZHJtX2VkaWRfdG9fZWxkIC0gYnVpbGQgRUxEIGZyb20gRURJRAorICogQGNvbm5lY3RvcjogY29ubmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEhETUkvRFAgc2luaworICogQGVkaWQ6IEVESUQgdG8gcGFyc2UKKyAqCisgKiBGaWxsIHRoZSBFTEQgKEVESUQtTGlrZSBEYXRhKSBidWZmZXIgZm9yIHBhc3NpbmcgdG8gdGhlIGF1ZGlvIGRyaXZlci4KKyAqIFNvbWUgRUxEIGZpZWxkcyBhcmUgbGVmdCB0byB0aGUgZ3JhcGhpY3MgZHJpdmVyIGNhbGxlcjoKKyAqIC0gQ29ubl9UeXBlCisgKiAtIEhEQ1AKKyAqIC0gUG9ydF9JRAorICovCit2b2lkIGRybV9lZGlkX3RvX2VsZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZWRpZCAqZWRpZCkKK3sKKwl1aW50OF90ICplbGQgPSBjb25uZWN0b3ItPmVsZDsKKwl1OCAqY2VhOworCXU4ICpuYW1lOworCXU4ICpkYjsKKwlpbnQgc2FkX2NvdW50ID0gMDsKKwlpbnQgbW5sOworCWludCBkYmw7CisKKwltZW1zZXQoZWxkLCAwLCBzaXplb2YoY29ubmVjdG9yLT5lbGQpKTsKKworCWNlYSA9IGRybV9maW5kX2NlYV9leHRlbnNpb24oZWRpZCk7CisJaWYgKCFjZWEpIHsKKwkJRFJNX0RFQlVHX0tNUygiRUxEOiBubyBDRUEgRXh0ZW5zaW9uIGZvdW5kXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW5hbWUgPSBOVUxMOworCWRybV9mb3JfZWFjaF9kZXRhaWxlZF9ibG9jaygodTggKillZGlkLCBtb25pdG9yX25hbWUsICZuYW1lKTsKKwlmb3IgKG1ubCA9IDA7IG5hbWUgJiYgbW5sIDwgMTM7IG1ubCsrKSB7CisJCWlmIChuYW1lW21ubF0gPT0gMHgwYSkKKwkJCWJyZWFrOworCQllbGRbMjAgKyBtbmxdID0gbmFtZVttbmxdOworCX0KKwllbGRbNF0gPSAoY2VhWzFdIDw8IDUpIHwgbW5sOworCURSTV9ERUJVR19LTVMoIkVMRCBtb25pdG9yICVzXG4iLCBlbGQgKyAyMCk7CisKKwllbGRbMF0gPSAyIDw8IDM7CQkvKiBFTEQgdmVyc2lvbjogMiAqLworCisJZWxkWzE2XSA9IGVkaWQtPm1mZ19pZFswXTsKKwllbGRbMTddID0gZWRpZC0+bWZnX2lkWzFdOworCWVsZFsxOF0gPSBlZGlkLT5wcm9kX2NvZGVbMF07CisJZWxkWzE5XSA9IGVkaWQtPnByb2RfY29kZVsxXTsKKworCWZvciAoZGIgPSBjZWEgKyA0OyBkYiA8IGNlYSArIGNlYVsyXTsgZGIgKz0gZGJsICsgMSkgeworCQlkYmwgPSBkYlswXSAmIDB4MWY7CisKKwkJc3dpdGNoICgoZGJbMF0gJiAweGUwKSA+PiA1KSB7CisJCWNhc2UgQVVESU9fQkxPQ0s6CS8qIEF1ZGlvIERhdGEgQmxvY2ssIGNvbnRhaW5zIFNBRHMgKi8KKwkJCXNhZF9jb3VudCA9IGRibCAvIDM7CisJCQltZW1jcHkoZWxkICsgMjAgKyBtbmwsICZkYlsxXSwgZGJsKTsKKwkJCWJyZWFrOworCQljYXNlIFNQRUFLRVJfQkxPQ0s6CS8qIFNwZWFrZXIgQWxsb2NhdGlvbiBEYXRhIEJsb2NrICovCisJCQllbGRbN10gPSBkYlsxXTsKKwkJCWJyZWFrOworCQljYXNlIFZFTkRPUl9CTE9DSzoKKwkJCS8qIEhETUkgVmVuZG9yLVNwZWNpZmljIERhdGEgQmxvY2sgKi8KKwkJCWlmIChkYlsxXSA9PSAweDAzICYmIGRiWzJdID09IDB4MGMgJiYgZGJbM10gPT0gMCkKKwkJCQlwYXJzZV9oZG1pX3ZzZGIoY29ubmVjdG9yLCBkYik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWVsZFs1XSB8PSBzYWRfY291bnQgPDwgNDsKKwllbGRbMl0gPSAoMjAgKyBtbmwgKyBzYWRfY291bnQgKiAzICsgMykgLyA0OworCisJRFJNX0RFQlVHX0tNUygiRUxEIHNpemUgJWQsIFNBRCBjb3VudCAlZFxuIiwgKGludCllbGRbMl0sIHNhZF9jb3VudCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9lZGlkX3RvX2VsZCk7CisKKy8qKgorICogZHJtX2F2X3N5bmNfZGVsYXkgLSBIRE1JL0RQIHNpbmsgYXVkaW8tdmlkZW8gc3luYyBkZWxheSBpbiBtaWxsaXNlY29uZAorICogQGNvbm5lY3RvcjogY29ubmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgSERNSS9EUCBzaW5rCisgKiBAbW9kZTogdGhlIGRpc3BsYXkgbW9kZQorICovCitpbnQgZHJtX2F2X3N5bmNfZGVsYXkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJaW50IGkgPSAhIShtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKTsKKwlpbnQgYSwgdjsKKworCWlmICghY29ubmVjdG9yLT5sYXRlbmN5X3ByZXNlbnRbMF0pCisJCXJldHVybiAwOworCWlmICghY29ubmVjdG9yLT5sYXRlbmN5X3ByZXNlbnRbMV0pCisJCWkgPSAwOworCisJYSA9IGNvbm5lY3Rvci0+YXVkaW9fbGF0ZW5jeVtpXTsKKwl2ID0gY29ubmVjdG9yLT52aWRlb19sYXRlbmN5W2ldOworCisJLyoKKwkgKiBIRE1JL0RQIHNpbmsgZG9lc24ndCBzdXBwb3J0IGF1ZGlvIG9yIHZpZGVvPworCSAqLworCWlmIChhID09IDI1NSB8fCB2ID09IDI1NSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENvbnZlcnQgcmF3IEVESUQgdmFsdWVzIHRvIG1pbGxpc2Vjb25kLgorCSAqIFRyZWF0IHVua25vd24gbGF0ZW5jeSBhcyAwbXMuCisJICovCisJaWYgKGEpCisJCWEgPSBtaW4oMiAqIChhIC0gMSksIDUwMCk7CisJaWYgKHYpCisJCXYgPSBtaW4oMiAqICh2IC0gMSksIDUwMCk7CisKKwlyZXR1cm4gbWF4KHYgLSBhLCAwKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2F2X3N5bmNfZGVsYXkpOworCisvKioKKyAqIGRybV9zZWxlY3RfZWxkIC0gc2VsZWN0IG9uZSBFTEQgZnJvbSBtdWx0aXBsZSBIRE1JL0RQIHNpbmtzCisgKiBAZW5jb2RlcjogdGhlIGVuY29kZXIganVzdCBjaGFuZ2VkIGRpc3BsYXkgbW9kZQorICogQG1vZGU6IHRoZSBhZGp1c3RlZCBkaXNwbGF5IG1vZGUKKyAqCisgKiBJdCdzIHBvc3NpYmxlIGZvciBvbmUgZW5jb2RlciB0byBiZSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgSERNSS9EUCBzaW5rcy4KKyAqIFRoZSBwb2xpY3kgaXMgbm93IGhhcmQgY29kZWQgdG8gc2ltcGx5IHVzZSB0aGUgZmlyc3QgSERNSS9EUCBzaW5rJ3MgRUxELgorICovCitzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZHJtX3NlbGVjdF9lbGQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKQorCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyID09IGVuY29kZXIgJiYgY29ubmVjdG9yLT5lbGRbMF0pCisJCQlyZXR1cm4gY29ubmVjdG9yOworCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9zZWxlY3RfZWxkKTsKKwogLyoqCiAgKiBkcm1fZGV0ZWN0X2hkbWlfbW9uaXRvciAtIGRldGVjdCB3aGV0aGVyIG1vbml0b3IgaXMgaGRtaS4KICAqIEBlZGlkOiBtb25pdG9yIEVESUQgaW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZW5jb2Rlcl9zbGF2ZS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lbmNvZGVyX3NsYXZlLmMKaW5kZXggZDYyYzA2NC4uZmI5NDM1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lbmNvZGVyX3NsYXZlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lbmNvZGVyX3NsYXZlLmMKQEAgLTI0LDYgKzI0LDggQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtX2VuY29kZXJfc2xhdmUuaCIKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwppbmRleCBmN2M2ODU0Li44MGZlMzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm1fY3J0Yy5oIgogI2luY2x1ZGUgImRybV9mYl9oZWxwZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKaW5kZXggMmVjN2Q0OC4uNDkxMWUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogZnJvbSBCS0wgcHVzaGRvd246IG5vdGUgdGhhdCBub3RoaW5nIGVsc2Ugc2VyaWFsaXplcyBpZHJfZmluZCgpICovCiBERUZJTkVfTVVURVgoZHJtX2dsb2JhbF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYwppbmRleCAxODZkNjJlLi4zOTZlNjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKQEAgLTI4NSw2ICsyODUsOTQgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2dlbV9oYW5kbGVfY3JlYXRlKTsKIAorCisvKioKKyAqIGRybV9nZW1fZnJlZV9tbWFwX29mZnNldCAtIHJlbGVhc2UgYSBmYWtlIG1tYXAgb2Zmc2V0IGZvciBhbiBvYmplY3QKKyAqIEBvYmo6IG9iaiBpbiBxdWVzdGlvbgorICoKKyAqIFRoaXMgcm91dGluZSBmcmVlcyBmYWtlIG9mZnNldHMgYWxsb2NhdGVkIGJ5IGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KCkuCisgKi8KK3ZvaWQKK2RybV9nZW1fZnJlZV9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9nZW1fbW0gKm1tID0gZGV2LT5tbV9wcml2YXRlOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmxpc3QgPSAmb2JqLT5tYXBfbGlzdDsKKworCWRybV9odF9yZW1vdmVfaXRlbSgmbW0tPm9mZnNldF9oYXNoLCAmbGlzdC0+aGFzaCk7CisJZHJtX21tX3B1dF9ibG9jayhsaXN0LT5maWxlX29mZnNldF9ub2RlKTsKKwlrZnJlZShsaXN0LT5tYXApOworCWxpc3QtPm1hcCA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZW1fZnJlZV9tbWFwX29mZnNldCk7CisKKy8qKgorICogZHJtX2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQgLSBjcmVhdGUgYSBmYWtlIG1tYXAgb2Zmc2V0IGZvciBhbiBvYmplY3QKKyAqIEBvYmo6IG9iaiBpbiBxdWVzdGlvbgorICoKKyAqIEdFTSBtZW1vcnkgbWFwcGluZyB3b3JrcyBieSBoYW5kaW5nIGJhY2sgdG8gdXNlcnNwYWNlIGEgZmFrZSBtbWFwIG9mZnNldAorICogaXQgY2FuIHVzZSBpbiBhIHN1YnNlcXVlbnQgbW1hcCgyKSBjYWxsLiAgVGhlIERSTSBjb3JlIGNvZGUgdGhlbiBsb29rcworICogdXAgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgb2Zmc2V0IGFuZCBzZXRzIHVwIHRoZSB2YXJpb3VzIG1lbW9yeSBtYXBwaW5nCisgKiBzdHJ1Y3R1cmVzLgorICoKKyAqIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgYW5kIGF0dGFjaGVzIGEgZmFrZSBvZmZzZXQgZm9yIEBvYmouCisgKi8KK2ludAorZHJtX2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZ2VtX21tICptbSA9IGRldi0+bW1fcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpsaXN0OworCXN0cnVjdCBkcm1fbG9jYWxfbWFwICptYXA7CisJaW50IHJldCA9IDA7CisKKwkvKiBTZXQgdGhlIG9iamVjdCB1cCBmb3IgbW1hcCdpbmcgKi8KKwlsaXN0ID0gJm9iai0+bWFwX2xpc3Q7CisJbGlzdC0+bWFwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRybV9tYXBfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghbGlzdC0+bWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hcCA9IGxpc3QtPm1hcDsKKwltYXAtPnR5cGUgPSBfRFJNX0dFTTsKKwltYXAtPnNpemUgPSBvYmotPnNpemU7CisJbWFwLT5oYW5kbGUgPSBvYmo7CisKKwkvKiBHZXQgYSBEUk0gR0VNIG1tYXAgb2Zmc2V0IGFsbG9jYXRlZC4uLiAqLworCWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUgPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJm1tLT5vZmZzZXRfbWFuYWdlciwKKwkJCW9iai0+c2l6ZSAvIFBBR0VfU0laRSwgMCwgMCk7CisKKwlpZiAoIWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgb2Zmc2V0IGZvciBibyAlZFxuIiwgb2JqLT5uYW1lKTsKKwkJcmV0ID0gLUVOT1NQQzsKKwkJZ290byBvdXRfZnJlZV9saXN0OworCX0KKworCWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUgPSBkcm1fbW1fZ2V0X2Jsb2NrKGxpc3QtPmZpbGVfb2Zmc2V0X25vZGUsCisJCQlvYmotPnNpemUgLyBQQUdFX1NJWkUsIDApOworCWlmICghbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2xpc3Q7CisJfQorCisJbGlzdC0+aGFzaC5rZXkgPSBsaXN0LT5maWxlX29mZnNldF9ub2RlLT5zdGFydDsKKwlyZXQgPSBkcm1faHRfaW5zZXJ0X2l0ZW0oJm1tLT5vZmZzZXRfaGFzaCwgJmxpc3QtPmhhc2gpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWRkIHRvIG1hcCBoYXNoXG4iKTsKKwkJZ290byBvdXRfZnJlZV9tbTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfbW06CisJZHJtX21tX3B1dF9ibG9jayhsaXN0LT5maWxlX29mZnNldF9ub2RlKTsKK291dF9mcmVlX2xpc3Q6CisJa2ZyZWUobGlzdC0+bWFwKTsKKwlsaXN0LT5tYXAgPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQpOworCiAvKiogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG5hbWVkIGJ5IHRoZSBoYW5kbGUuICovCiBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKgogZHJtX2dlbV9vYmplY3RfbG9va3VwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlscCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faGFzaHRhYi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9oYXNodGFiLmMKaW5kZXggZTNhNzU2OC4uNjhkYzg3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9oYXNodGFiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9oYXNodGFiLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlICJkcm1faGFzaHRhYi5oIgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIGludCBkcm1faHRfY3JlYXRlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgaW50IG9yZGVyKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jCmluZGV4IDRhMDU4YzcuLmRkZDcwZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMKQEAgLTI5LDYgKzI5LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jb3JlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYwppbmRleCAzODMwZTllLi42OGI3NTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxsaW51eC92Z2FhcmIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyogQWNjZXNzIG1hY3JvIGZvciBzbG90cyBpbiB2YmxhbmsgdGltZXN0YW1wIHJpbmdidWZmZXIuICovCiAjZGVmaW5lIHZibGFua3RpbWVzdGFtcChkZXYsIGNydGMsIGNvdW50KSAoIFwKQEAgLTQwNiwxMyArNDA3LDE2IEBACiAJLyoKIAkgKiBXYWtlIHVwIGFueSB3YWl0ZXJzIHNvIHRoZXkgZG9uJ3QgaGFuZy4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9jcnRjczsgaSsrKSB7Ci0JCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlW2ldKTsKLQkJZGV2LT52YmxhbmtfZW5hYmxlZFtpXSA9IDA7Ci0JCWRldi0+bGFzdF92YmxhbmtbaV0gPSBkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyKGRldiwgaSk7CisJaWYgKGRldi0+bnVtX2NydGNzKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9jcnRjczsgaSsrKSB7CisJCQlEUk1fV0FLRVVQKCZkZXYtPnZibF9xdWV1ZVtpXSk7CisJCQlkZXYtPnZibGFua19lbmFibGVkW2ldID0gMDsKKwkJCWRldi0+bGFzdF92YmxhbmtbaV0gPQorCQkJCWRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBpKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKIAogCWlmICghaXJxX2VuYWJsZWQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTEyNCw2ICsxMTI4LDcgQEAKIAkJdHJhY2VfZHJtX3ZibGFua19ldmVudF9kZWxpdmVyZWQoY3VycmVudC0+cGlkLCBwaXBlLAogCQkJCQkJIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpOwogCX0gZWxzZSB7CisJCS8qIGRybV9oYW5kbGVfdmJsYW5rX2V2ZW50cyB3aWxsIGNhbGwgZHJtX3ZibGFua19wdXQgKi8KIAkJbGlzdF9hZGRfdGFpbCgmZS0+YmFzZS5saW5rLCAmZGV2LT52YmxhbmtfZXZlbnRfbGlzdCk7CiAJCXZibHdhaXQtPnJlcGx5LnNlcXVlbmNlID0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZTsKIAl9CkBAIC0xMjA0LDggKzEyMDksMTIgQEAKIAkJZ290byBkb25lOwogCX0KIAotCWlmIChmbGFncyAmIF9EUk1fVkJMQU5LX0VWRU5UKQorCWlmIChmbGFncyAmIF9EUk1fVkJMQU5LX0VWRU5UKSB7CisJCS8qIG11c3QgaG9sZCBvbiB0byB0aGUgdmJsYW5rIHJlZiB1bnRpbCB0aGUgZXZlbnQgZmlyZXMKKwkJICogZHJtX3ZibGFua19wdXQgd2lsbCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkKKwkJICovCiAJCXJldHVybiBkcm1fcXVldWVfdmJsYW5rX2V2ZW50KGRldiwgY3J0YywgdmJsd2FpdCwgZmlsZV9wcml2KTsKKwl9CiAKIAlpZiAoKGZsYWdzICYgX0RSTV9WQkxBTktfTkVYVE9OTUlTUykgJiYKIAkgICAgKHNlcSAtIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpIDw9ICgxPDwyMykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbWVtb3J5LmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21lbW9yeS5jCmluZGV4IGM5YjgwNTAuLmM4YjZiNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbWVtb3J5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tZW1vcnkuYwpAQCAtMzQsNiArMzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW0uYwppbmRleCA5NTkxODZjLi45NjFmYjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSAiZHJtX21tLmgiCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNkZWZpbmUgTU1fVU5VU0VEX1RBUkdFVCA0CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYwppbmRleCBhZDc0ZmI0Li5mYjhlNDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5jCkBAIC0zMiw2ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdF9zb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgImRybV9jcnRjLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYwppbmRleCBiNmExOWNiLi5kNGQxMGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wbGF0Zm9ybS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wbGF0Zm9ybS5jCmluZGV4IDJhOGI2MjYuLmFlOWRiNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BsYXRmb3JtLmMKQEAgLTI1LDYgKzI1LDcgQEAKICAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9jLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3Byb2MuYwppbmRleCA5ZTViMDdlZi4uZmZmODcyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9jLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9jLmMKQEAgLTM5LDYgKzM5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTUsNyArOTYsNiBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtaW5vci0+ZGV2OwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OwogCXN0cnVjdCBkcm1faW5mb19ub2RlICp0bXA7Ci0JY2hhciBuYW1lWzY0XTsKIAlpbnQgaSwgcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKQEAgLTExOCw3ICsxMTgsNyBAQAogCQkJCSAgICAgICAmZHJtX3Byb2NfZm9wcywgdG1wKTsKIAkJaWYgKCFlbnQpIHsKIAkJCURSTV9FUlJPUigiQ2Fubm90IGNyZWF0ZSAvcHJvYy9kcmkvJXMvJXNcbiIsCi0JCQkJICBuYW1lLCBmaWxlc1tpXS5uYW1lKTsKKwkJCQkgIHJvb3QtPm5hbWUsIGZpbGVzW2ldLm5hbWUpOwogCQkJbGlzdF9kZWwoJnRtcC0+bGlzdCk7CiAJCQlrZnJlZSh0bXApOwogCQkJcmV0ID0gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3NtYW4uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc21hbi5jCmluZGV4IDM0NjY0NTguLmNlYmNlNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc21hbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc21hbi5jCkBAIC0zNiw2ICszNiw3IEBACiAgKiBUaG9tYXMgSGVsbHN0csO2bSA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtX3NtYW4uaCIKIAogc3RydWN0IGRybV9vd25lcl9pdGVtIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYwppbmRleCAyZWVlOGUwLi4wZjllZjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9zeXNmcy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJkcm1fc3lzZnMuaCIKICNpbmNsdWRlICJkcm1fY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV91c2IuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdXNiLmMKaW5kZXggMjA2ZDIzMC4uNDQ1MDAzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV91c2IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3VzYi5jCkBAIC0xLDUgKzEsNiBAQAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2lmZGVmIENPTkZJR19VU0IKIGludCBkcm1fZ2V0X3VzYl9kZXYoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYwppbmRleCA1ZGI5NmQ0NS4uOGMwM2VhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV92bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYwpAQCAtMzQsNiArMzQsNyBAQAogICovCiAKICNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaWYgZGVmaW5lZChfX2lhNjRfXykKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3NDY2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvS2NvbmZpZwpAQCAtMCwwICsxLDIwIEBACitjb25maWcgRFJNX0VYWU5PUworCXRyaXN0YXRlICJEUk0gU3VwcG9ydCBmb3IgU2Ftc3VuZyBTb0MgRVhZTk9TIFNlcmllcyIKKwlkZXBlbmRzIG9uIERSTSAmJiBQTEFUX1NBTVNVTkcKKwlkZWZhdWx0CW4KKwlzZWxlY3QgRFJNX0tNU19IRUxQRVIKKwlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCisJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJc2VsZWN0IFZUX0hXX0NPTlNPTEVfQklORElORyBpZiBGUkFNRUJVRkZFUl9DT05TT0xFCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgU2Ftc3VuZyBTb0MgRVhZTk9TIGNoaXBzZXQuCisJICBJZiBNIGlzIHNlbGVjdGVkIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh5bm9zZHJtLgorCitjb25maWcgRFJNX0VYWU5PU19GSU1ECisJdHJpc3RhdGUgIkV4eW5vcyBEUk0gRklNRCIKKwlkZXBlbmRzIG9uIERSTV9FWFlOT1MKKwlkZWZhdWx0IG4KKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIEV4eW5vcyBGSU1EIGZvciBEUk0uCisJICBJZiBNIGlzIHNlbGVjdGVkLCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4eW5vc19kcm1fZmltZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NmQzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGRybSBkZXZpY2UgZHJpdmVyLiAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlCisjIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUgKERSSSkgaW4gWEZyZWU4NiA0LjEuMCBhbmQgaGlnaGVyLgorCitjY2ZsYWdzLXkgOj0gLUlpbmNsdWRlL2RybSAtSWRyaXZlcnMvZ3B1L2RybS9leHlub3MKK2V4eW5vc2RybS15IDo9IGV4eW5vc19kcm1fZHJ2Lm8gZXh5bm9zX2RybV9lbmNvZGVyLm8gZXh5bm9zX2RybV9jb25uZWN0b3IubyBcCisJCWV4eW5vc19kcm1fY3J0Yy5vIGV4eW5vc19kcm1fZmJkZXYubyBleHlub3NfZHJtX2ZiLm8gXAorCQlleHlub3NfZHJtX2J1Zi5vIGV4eW5vc19kcm1fZ2VtLm8gZXh5bm9zX2RybV9jb3JlLm8KKworb2JqLSQoQ09ORklHX0RSTV9FWFlOT1MpICs9IGV4eW5vc2RybS5vCitvYmotJChDT05GSUdfRFJNX0VYWU5PU19GSU1EKSArPSBleHlub3NfZHJtX2ZpbWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2J1Zi5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGFmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fYnVmLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIGV4eW5vc19kcm1fYnVmLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisKKyNpbmNsdWRlICJleHlub3NfZHJtX2Rydi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fYnVmLmgiCisKK3N0YXRpYyBERUZJTkVfTVVURVgoZXh5bm9zX2RybV9idWZfbG9jayk7CisKK3N0YXRpYyBpbnQgbG93bGV2ZWxfYnVmZmVyX2FsbG9jYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXN0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZW50cnkpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWVudHJ5LT52YWRkciA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUoZGV2LT5kZXYsIGVudHJ5LT5zaXplLAorCQkJKGRtYV9hZGRyX3QgKikmZW50cnktPnBhZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJ5LT5wYWRkcikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJRFJNX0RFQlVHX0tNUygiYWxsb2NhdGVkIDogdmFkZHIoMHgleCksIHBhZGRyKDB4JXgpLCBzaXplKDB4JXgpXG4iLAorCQkJKHVuc2lnbmVkIGludCllbnRyeS0+dmFkZHIsIGVudHJ5LT5wYWRkciwgZW50cnktPnNpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxvd2xldmVsX2J1ZmZlcl9kZWFsbG9jYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXN0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZW50cnkpCit7CisJRFJNX0RFQlVHX0tNUygiJXMuXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoZW50cnktPnBhZGRyICYmIGVudHJ5LT52YWRkciAmJiBlbnRyeS0+c2l6ZSkKKwkJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGRldi0+ZGV2LCBlbnRyeS0+c2l6ZSwgZW50cnktPnZhZGRyLAorCQkJCWVudHJ5LT5wYWRkcik7CisJZWxzZQorCQlEUk1fREVCVUdfS01TKCJlbnRyeSBkYXRhIGlzIG51bGwuXG4iKTsKK30KKworc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICpleHlub3NfZHJtX2J1Zl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICplbnRyeTsKKworCURSTV9ERUJVR19LTVMoIiVzLlxuIiwgX19GSUxFX18pOworCisJZW50cnkgPSBremFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJ5KSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGV4eW5vc19kcm1fYnVmX2VudHJ5LlxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWVudHJ5LT5zaXplID0gc2l6ZTsKKworCS8qCisJICogYWxsb2NhdGUgbWVtb3J5IHJlZ2lvbiB3aXRoIHNpemUgYW5kIHNldCB0aGUgbWVtb3J5IGluZm9ybWF0aW9uCisJICogdG8gdmFkZHIgYW5kIHBhZGRyIG9mIGEgZW50cnkgb2JqZWN0LgorCSAqLworCWlmIChsb3dsZXZlbF9idWZmZXJfYWxsb2NhdGUoZGV2LCBlbnRyeSkgPCAwKSB7CisJCWtmcmVlKGVudHJ5KTsKKwkJZW50cnkgPSBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyZXR1cm4gZW50cnk7Cit9CisKK3ZvaWQgZXh5bm9zX2RybV9idWZfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgKmVudHJ5KQoreworCURSTV9ERUJVR19LTVMoIiVzLlxuIiwgX19GSUxFX18pOworCisJaWYgKCFlbnRyeSkgeworCQlEUk1fREVCVUdfS01TKCJlbnRyeSBpcyBudWxsLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlsb3dsZXZlbF9idWZmZXJfZGVhbGxvY2F0ZShkZXYsIGVudHJ5KTsKKworCWtmcmVlKGVudHJ5KTsKKwllbnRyeSA9IE5VTEw7Cit9CisKK01PRFVMRV9BVVRIT1IoIklua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTb0MgRFJNIEJ1ZmZlciBNYW5hZ2VtZW50IE1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2J1Zi5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWQ1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fYnVmLmgKQEAgLTAsMCArMSw1MyBAQAorLyogZXh5bm9zX2RybV9idWYuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yOiBJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRVhZTk9TX0RSTV9CVUZfSF8KKyNkZWZpbmUgX0VYWU5PU19EUk1fQlVGX0hfCisKKy8qCisgKiBleHlub3MgZHJtIGJ1ZmZlciBlbnRyeSBzdHJ1Y3R1cmUuCisgKgorICogQHBhZGRyOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBAdmFkZHI6IGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeS4KKyAqIEBzaXplOiBzaXplIG9mIGFsbG9jYXRlZCBtZW1vcnkuCisgKi8KK3N0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSB7CisJZG1hX2FkZHJfdCBwYWRkcjsKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCXVuc2lnbmVkIGludCBzaXplOworfTsKKworLyogYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5LiAqLworc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICpleHlub3NfZHJtX2J1Zl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgaW50IHNpemUpOworCisvKiBnZXQgcGh5c2ljYWwgbWVtb3J5IGluZm9ybWF0aW9uIG9mIGEgZHJtIGZyYW1lYnVmZmVyLiAqLworc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICpleHlub3NfZHJtX2ZiX2dldF9idWYoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpOworCisvKiByZW1vdmUgYWxsb2NhdGVkIHBoeXNpY2FsIG1lbW9yeS4gKi8KK3ZvaWQgZXh5bm9zX2RybV9idWZfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgKmVudHJ5KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY29ubmVjdG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY29ubmVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1ZDllNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb25uZWN0b3IuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yczoKKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworI2luY2x1ZGUgImV4eW5vc19kcm1fZHJ2LmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9lbmNvZGVyLmgiCisKKyNkZWZpbmUgTUFYX0VESUQgMjU2CisjZGVmaW5lIHRvX2V4eW5vc19jb25uZWN0b3IoeCkJY29udGFpbmVyX29mKHgsIHN0cnVjdCBleHlub3NfZHJtX2Nvbm5lY3RvcixcCisJCQkJZHJtX2Nvbm5lY3RvcikKKworc3RydWN0IGV4eW5vc19kcm1fY29ubmVjdG9yIHsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcglkcm1fY29ubmVjdG9yOworfTsKKworLyogY29udmVydCBleHlub3NfdmlkZW9fdGltaW5ncyB0byBkcm1fZGlzcGxheV9tb2RlICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2NvbnZlcnRfdG9fZGlzcGxheV9tb2RlKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJc3RydWN0IGZiX3ZpZGVvbW9kZSAqdGltaW5nKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwltb2RlLT5jbG9jayA9IHRpbWluZy0+cGl4Y2xvY2sgLyAxMDAwOworCisJbW9kZS0+aGRpc3BsYXkgPSB0aW1pbmctPnhyZXM7CisJbW9kZS0+aHN5bmNfc3RhcnQgPSBtb2RlLT5oZGlzcGxheSArIHRpbWluZy0+bGVmdF9tYXJnaW47CisJbW9kZS0+aHN5bmNfZW5kID0gbW9kZS0+aHN5bmNfc3RhcnQgKyB0aW1pbmctPmhzeW5jX2xlbjsKKwltb2RlLT5odG90YWwgPSBtb2RlLT5oc3luY19lbmQgKyB0aW1pbmctPnJpZ2h0X21hcmdpbjsKKworCW1vZGUtPnZkaXNwbGF5ID0gdGltaW5nLT55cmVzOworCW1vZGUtPnZzeW5jX3N0YXJ0ID0gbW9kZS0+dmRpc3BsYXkgKyB0aW1pbmctPnVwcGVyX21hcmdpbjsKKwltb2RlLT52c3luY19lbmQgPSBtb2RlLT52c3luY19zdGFydCArIHRpbWluZy0+dnN5bmNfbGVuOworCW1vZGUtPnZ0b3RhbCA9IG1vZGUtPnZzeW5jX2VuZCArIHRpbWluZy0+bG93ZXJfbWFyZ2luOworfQorCisvKiBjb252ZXJ0IGRybV9kaXNwbGF5X21vZGUgdG8gZXh5bm9zX3ZpZGVvX3RpbWluZ3MgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY29udmVydF90b192aWRlb190aW1pbmcoc3RydWN0IGZiX3ZpZGVvbW9kZSAqdGltaW5nLAorCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCW1lbXNldCh0aW1pbmcsIDAsIHNpemVvZigqdGltaW5nKSk7CisKKwl0aW1pbmctPnBpeGNsb2NrID0gbW9kZS0+Y2xvY2sgKiAxMDAwOworCXRpbWluZy0+cmVmcmVzaCA9IG1vZGUtPnZyZWZyZXNoOworCisJdGltaW5nLT54cmVzID0gbW9kZS0+aGRpc3BsYXk7CisJdGltaW5nLT5sZWZ0X21hcmdpbiA9IG1vZGUtPmhzeW5jX3N0YXJ0IC0gbW9kZS0+aGRpc3BsYXk7CisJdGltaW5nLT5oc3luY19sZW4gPSBtb2RlLT5oc3luY19lbmQgLSBtb2RlLT5oc3luY19zdGFydDsKKwl0aW1pbmctPnJpZ2h0X21hcmdpbiA9IG1vZGUtPmh0b3RhbCAtIG1vZGUtPmhzeW5jX2VuZDsKKworCXRpbWluZy0+eXJlcyA9IG1vZGUtPnZkaXNwbGF5OworCXRpbWluZy0+dXBwZXJfbWFyZ2luID0gbW9kZS0+dnN5bmNfc3RhcnQgLSBtb2RlLT52ZGlzcGxheTsKKwl0aW1pbmctPnZzeW5jX2xlbiA9IG1vZGUtPnZzeW5jX2VuZCAtIG1vZGUtPnZzeW5jX3N0YXJ0OworCXRpbWluZy0+bG93ZXJfbWFyZ2luID0gbW9kZS0+dnRvdGFsIC0gbW9kZS0+dnN5bmNfZW5kOworCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJCXRpbWluZy0+dm1vZGUgPSBGQl9WTU9ERV9JTlRFUkxBQ0VEOworCWVsc2UKKwkJdGltaW5nLT52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7CisKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pCisJCXRpbWluZy0+dm1vZGUgfD0gRkJfVk1PREVfRE9VQkxFOworfQorCitzdGF0aWMgaW50IGV4eW5vc19kcm1fY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1hbmFnZXIgPQorCQkJCWV4eW5vc19kcm1fZ2V0X21hbmFnZXIoY29ubmVjdG9yLT5lbmNvZGVyKTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICpkaXNwbGF5ID0gbWFuYWdlci0+ZGlzcGxheTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCFkaXNwbGF5KSB7CisJCURSTV9ERUJVR19LTVMoImRpc3BsYXkgaXMgbnVsbC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIGlmIGdldF9lZGlkKCkgZXhpc3RzIHRoZW4gZ2V0X2VkaWQoKSBjYWxsYmFjayBvZiBoZG1pIHNpZGUKKwkgKiBpcyBjYWxsZWQgdG8gZ2V0IGVkaWQgZGF0YSB0aHJvdWdoIGkyYyBpbnRlcmZhY2UgZWxzZQorCSAqIGdldCB0aW1pbmcgZnJvbSB0aGUgRklNRCBkcml2ZXIoZGlzcGxheSBjb250cm9sbGVyKS4KKwkgKgorCSAqIFAuUy4gaW4gY2FzZSBvZiBsY2QgcGFuZWwsIGNvdW50IGlzIGFsd2F5cyAxIGlmIHN1Y2Nlc3MKKwkgKiBiZWNhdXNlIGxjZCBwYW5lbCBoYXMgb25seSBvbmUgbW9kZS4KKwkgKi8KKwlpZiAoZGlzcGxheS0+Z2V0X2VkaWQpIHsKKwkJaW50IHJldDsKKwkJdm9pZCAqZWRpZDsKKworCQllZGlkID0ga3phbGxvYyhNQVhfRURJRCwgR0ZQX0tFUk5FTCk7CisJCWlmICghZWRpZCkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgZWRpZFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXJldCA9IGRpc3BsYXktPmdldF9lZGlkKG1hbmFnZXItPmRldiwgY29ubmVjdG9yLAorCQkJCQkJZWRpZCwgTUFYX0VESUQpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZ2V0IGVkaWQgZGF0YS5cbiIpOworCQkJa2ZyZWUoZWRpZCk7CisJCQllZGlkID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3RvciwgZWRpZCk7CisJCWNvdW50ID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3RvciwgZWRpZCk7CisKKwkJa2ZyZWUoY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ucmF3X2VkaWQpOworCQljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5yYXdfZWRpZCA9IGVkaWQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSBkcm1fbW9kZV9jcmVhdGUoY29ubmVjdG9yLT5kZXYpOworCQlzdHJ1Y3QgZmJfdmlkZW9tb2RlICp0aW1pbmc7CisKKwkJaWYgKGRpc3BsYXktPmdldF90aW1pbmcpCisJCQl0aW1pbmcgPSBkaXNwbGF5LT5nZXRfdGltaW5nKG1hbmFnZXItPmRldik7CisJCWVsc2UgeworCQkJZHJtX21vZGVfZGVzdHJveShjb25uZWN0b3ItPmRldiwgbW9kZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNvbnZlcnRfdG9fZGlzcGxheV9tb2RlKG1vZGUsIHRpbWluZyk7CisKKwkJbW9kZS0+dHlwZSA9IERSTV9NT0RFX1RZUEVfRFJJVkVSIHwgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQ7CisJCWRybV9tb2RlX3NldF9uYW1lKG1vZGUpOworCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CisKKwkJY291bnQgPSAxOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyID0KKwkJCQlleHlub3NfZHJtX2dldF9tYW5hZ2VyKGNvbm5lY3Rvci0+ZW5jb2Rlcik7CisJc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSA9IG1hbmFnZXItPmRpc3BsYXk7CisJc3RydWN0IGZiX3ZpZGVvbW9kZSB0aW1pbmc7CisJaW50IHJldCA9IE1PREVfQkFEOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWNvbnZlcnRfdG9fdmlkZW9fdGltaW5nKCZ0aW1pbmcsIG1vZGUpOworCisJaWYgKGRpc3BsYXkgJiYgZGlzcGxheS0+Y2hlY2tfdGltaW5nKQorCQlpZiAoIWRpc3BsYXktPmNoZWNrX3RpbWluZyhtYW5hZ2VyLT5kZXYsICh2b2lkICopJnRpbWluZykpCisJCQlyZXQgPSBNT0RFX09LOworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGRybV9lbmNvZGVyICpleHlub3NfZHJtX2Jlc3RfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlyZXR1cm4gY29ubmVjdG9yLT5lbmNvZGVyOworfQorCitzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGV4eW5vc19jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0geworCS5nZXRfbW9kZXMJPSBleHlub3NfZHJtX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCisJLm1vZGVfdmFsaWQJPSBleHlub3NfZHJtX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkLAorCS5iZXN0X2VuY29kZXIJPSBleHlub3NfZHJtX2Jlc3RfZW5jb2RlciwKK307CisKKy8qIGdldCBkZXRlY3Rpb24gc3RhdHVzIG9mIGRpc3BsYXkgZGV2aWNlLiAqLworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK2V4eW5vc19kcm1fY29ubmVjdG9yX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBib29sIGZvcmNlKQoreworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1hbmFnZXIgPQorCQkJCWV4eW5vc19kcm1fZ2V0X21hbmFnZXIoY29ubmVjdG9yLT5lbmNvZGVyKTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICpkaXNwbGF5ID0gbWFuYWdlci0+ZGlzcGxheTsKKwllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmIChkaXNwbGF5ICYmIGRpc3BsYXktPmlzX2Nvbm5lY3RlZCkgeworCQlpZiAoZGlzcGxheS0+aXNfY29ubmVjdGVkKG1hbmFnZXItPmRldikpCisJCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwkJZWxzZQorCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBleHlub3NfZHJtX2Nvbm5lY3RvciAqZXh5bm9zX2Nvbm5lY3RvciA9CisJCXRvX2V4eW5vc19jb25uZWN0b3IoY29ubmVjdG9yKTsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZShjb25uZWN0b3IpOworCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOworCWtmcmVlKGV4eW5vc19jb25uZWN0b3IpOworfQorCitzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgZXh5bm9zX2Nvbm5lY3Rvcl9mdW5jcyA9IHsKKwkuZHBtcwkJPSBkcm1faGVscGVyX2Nvbm5lY3Rvcl9kcG1zLAorCS5maWxsX21vZGVzCT0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAorCS5kZXRlY3QJCT0gZXh5bm9zX2RybV9jb25uZWN0b3JfZGV0ZWN0LAorCS5kZXN0cm95CT0gZXh5bm9zX2RybV9jb25uZWN0b3JfZGVzdHJveSwKK307CisKK3N0cnVjdCBkcm1fY29ubmVjdG9yICpleHlub3NfZHJtX2Nvbm5lY3Rvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJCSAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9jb25uZWN0b3IgKmV4eW5vc19jb25uZWN0b3I7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciA9IGV4eW5vc19kcm1fZ2V0X21hbmFnZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlpbnQgdHlwZTsKKwlpbnQgZXJyOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWV4eW5vc19jb25uZWN0b3IgPSBremFsbG9jKHNpemVvZigqZXh5bm9zX2Nvbm5lY3RvciksIEdGUF9LRVJORUwpOworCWlmICghZXh5bm9zX2Nvbm5lY3RvcikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBjb25uZWN0b3JcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljb25uZWN0b3IgPSAmZXh5bm9zX2Nvbm5lY3Rvci0+ZHJtX2Nvbm5lY3RvcjsKKworCXN3aXRjaCAobWFuYWdlci0+ZGlzcGxheS0+dHlwZSkgeworCWNhc2UgRVhZTk9TX0RJU1BMQVlfVFlQRV9IRE1JOgorCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0hETUlBOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1Vua25vd247CisJCWJyZWFrOworCX0KKworCWRybV9jb25uZWN0b3JfaW5pdChkZXYsIGNvbm5lY3RvciwgJmV4eW5vc19jb25uZWN0b3JfZnVuY3MsIHR5cGUpOworCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZleHlub3NfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisKKwllcnIgPSBkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChjb25uZWN0b3IpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2Nvbm5lY3RvcjsKKworCWNvbm5lY3Rvci0+ZW5jb2RlciA9IGVuY29kZXI7CisJZXJyID0gZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7CisJaWYgKGVycikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhdHRhY2ggYSBjb25uZWN0b3IgdG8gYSBlbmNvZGVyXG4iKTsKKwkJZ290byBlcnJfc3lzZnM7CisJfQorCisJRFJNX0RFQlVHX0tNUygiY29ubmVjdG9yIGhhcyBiZWVuIGNyZWF0ZWRcbiIpOworCisJcmV0dXJuIGNvbm5lY3RvcjsKKworZXJyX3N5c2ZzOgorCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CitlcnJfY29ubmVjdG9yOgorCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOworCWtmcmVlKGV4eW5vc19jb25uZWN0b3IpOworCXJldHVybiBOVUxMOworfQorCitNT0RVTEVfQVVUSE9SKCJJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFNvQyBEUk0gQ29ubmVjdG9yIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Nvbm5lY3Rvci5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Nvbm5lY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2IyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY29ubmVjdG9yLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yczoKKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRVhZTk9TX0RSTV9DT05ORUNUT1JfSF8KKyNkZWZpbmUgX0VYWU5PU19EUk1fQ09OTkVDVE9SX0hfCisKK3N0cnVjdCBkcm1fY29ubmVjdG9yICpleHlub3NfZHJtX2Nvbm5lY3Rvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJCSAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NvcmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxYTAzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb3JlLmMKQEAgLTAsMCArMSwyNzIgQEAKKy8qIGV4eW5vc19kcm1fY29yZS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9kcnYuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2VuY29kZXIuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZmJkZXYuaCIKKworc3RhdGljIERFRklORV9NVVRFWChleHlub3NfZHJtX211dGV4KTsKK3N0YXRpYyBMSVNUX0hFQUQoZXh5bm9zX2RybV9zdWJkcnZfbGlzdCk7CitzdGF0aWMgc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXY7CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9zdWJkcnZfcHJvYmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpzdWJkcnYpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKHN1YmRydi0+cHJvYmUpIHsKKwkJaW50IHJldDsKKworCQkvKgorCQkgKiB0aGlzIHByb2JlIGNhbGxiYWNrIHdvdWxkIGJlIGNhbGxlZCBieSBzdWIgZHJpdmVyCisJCSAqIGFmdGVyIHNldHRpbmcgb2YgYWxsIHJlc291cmNlcyB0byB0aGlzIHN1YiBkcml2ZXIsCisJCSAqIHN1Y2ggYXMgY2xvY2ssIGlycSBhbmQgcmVnaXN0ZXIgbWFwIGFyZSBkb25lIG9yIGJ5IGxvYWQoKQorCQkgKiBvZiBleHlub3MgZHJtIGRyaXZlci4KKwkJICoKKwkJICogUC5TLiBub3RlIHRoYXQgdGhpcyBkcml2ZXIgaXMgY29uc2lkZXJlZCBmb3IgbW9kdWxhcml6YXRpb24uCisJCSAqLworCQlyZXQgPSBzdWJkcnYtPnByb2JlKGRldiwgc3ViZHJ2LT5tYW5hZ2VyLmRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIGVuY29kZXIgZm9yIHRoaXMgc3ViIGRyaXZlci4gKi8KKwllbmNvZGVyID0gZXh5bm9zX2RybV9lbmNvZGVyX2NyZWF0ZShkZXYsICZzdWJkcnYtPm1hbmFnZXIsCisJCQkoMSA8PCBNQVhfQ1JUQykgLSAxKTsKKwlpZiAoIWVuY29kZXIpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGVuY29kZXJcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKgorCSAqIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIGNvbm5lY3RvciBmb3IgdGhpcyBzdWIgZHJpdmVyIGFuZAorCSAqIGF0dGFjaCB0aGUgZW5jb2RlciBjcmVhdGVkIGFib3ZlIHRvIHRoZSBjb25uZWN0b3IuCisJICovCisJY29ubmVjdG9yID0gZXh5bm9zX2RybV9jb25uZWN0b3JfY3JlYXRlKGRldiwgZW5jb2Rlcik7CisJaWYgKCFjb25uZWN0b3IpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGNvbm5lY3RvclxuIik7CisJCWVuY29kZXItPmZ1bmNzLT5kZXN0cm95KGVuY29kZXIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzdWJkcnYtPmVuY29kZXIgPSBlbmNvZGVyOworCXN1YmRydi0+Y29ubmVjdG9yID0gY29ubmVjdG9yOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fc3ViZHJ2X3JlbW92ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqc3ViZHJ2KQoreworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoc3ViZHJ2LT5yZW1vdmUpCisJCXN1YmRydi0+cmVtb3ZlKGRldik7CisKKwlpZiAoc3ViZHJ2LT5lbmNvZGVyKSB7CisJCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9IHN1YmRydi0+ZW5jb2RlcjsKKwkJZW5jb2Rlci0+ZnVuY3MtPmRlc3Ryb3koZW5jb2Rlcik7CisJCXN1YmRydi0+ZW5jb2RlciA9IE5VTEw7CisJfQorCisJaWYgKHN1YmRydi0+Y29ubmVjdG9yKSB7CisJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSBzdWJkcnYtPmNvbm5lY3RvcjsKKwkJY29ubmVjdG9yLT5mdW5jcy0+ZGVzdHJveShjb25uZWN0b3IpOworCQlzdWJkcnYtPmNvbm5lY3RvciA9IE5VTEw7CisJfQorfQorCitpbnQgZXh5bm9zX2RybV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgKnN1YmRydiwgKm47CisJaW50IGVycjsKKworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZHJtX2RldikgeworCQlEUk1fRVJST1IoIkFscmVhZHkgZHJtIGRldmljZSB3ZXJlIHJlZ2lzdGVyZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW11dGV4X2xvY2soJmV4eW5vc19kcm1fbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdWJkcnYsIG4sICZleHlub3NfZHJtX3N1YmRydl9saXN0LCBsaXN0KSB7CisJCWVyciA9IGV4eW5vc19kcm1fc3ViZHJ2X3Byb2JlKGRldiwgc3ViZHJ2KTsKKwkJaWYgKGVycikgeworCQkJRFJNX0RFQlVHKCJleHlub3MgZHJtIHN1YmRydiBwcm9iZSBmYWlsZWQuXG4iKTsKKwkJCWxpc3RfZGVsKCZzdWJkcnYtPmxpc3QpOworCQl9CisJfQorCisJZHJtX2RldiA9IGRldjsKKwltdXRleF91bmxvY2soJmV4eW5vc19kcm1fbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHlub3NfZHJtX2RldmljZV9yZWdpc3Rlcik7CisKK2ludCBleHlub3NfZHJtX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpzdWJkcnY7CisKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCFkZXYgfHwgZGV2ICE9IGRybV9kZXYpIHsKKwkJV0FSTigxLCAiVW5leHBlY3RlZCBkcm0gZGV2aWNlIHVucmVnaXN0ZXIhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmZXh5bm9zX2RybV9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJkcnYsICZleHlub3NfZHJtX3N1YmRydl9saXN0LCBsaXN0KQorCQlleHlub3NfZHJtX3N1YmRydl9yZW1vdmUoZGV2LCBzdWJkcnYpOworCisJZHJtX2RldiA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXh5bm9zX2RybV9kZXZpY2VfdW5yZWdpc3Rlcik7CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9tb2RlX2dyb3VwX3JlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbW9kZV9ncm91cCAqZ3JvdXAgPSAmZGV2LT5wcmltYXJ5LT5tb2RlX2dyb3VwOworCXVpbnQzMl90ICppZF9saXN0ID0gZ3JvdXAtPmlkX2xpc3Q7CisJaW50IHJldDsKKworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlyZXQgPSBkcm1fbW9kZV9ncm91cF9pbml0X2xlZ2FjeV9ncm91cChkZXYsIGdyb3VwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWtmcmVlKGlkX2xpc3QpOworCXJldHVybiAwOworfQorCitpbnQgZXh5bm9zX2RybV9zdWJkcnZfcmVnaXN0ZXIoc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpzdWJkcnYpCit7CisJaW50IGVycjsKKworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoIXN1YmRydikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKwlpZiAoZHJtX2RldikgeworCQllcnIgPSBleHlub3NfZHJtX3N1YmRydl9wcm9iZShkcm1fZGV2LCBzdWJkcnYpOworCQlpZiAoZXJyKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBwcm9iZSBleHlub3MgZHJtIHN1YmRydlxuIik7CisJCQltdXRleF91bmxvY2soJmV4eW5vc19kcm1fbXV0ZXgpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qCisJCSAqIGlmIGFueSBzcGVjaWZpYyBkcml2ZXIgc3VjaCBhcyBmaW1kIG9yIGhkbWkgZHJpdmVyIGNhbGxlZAorCQkgKiBleHlub3NfZHJtX3N1YmRydl9yZWdpc3RlcigpIGxhdGVyIHRoYW4gZHJtX2xvYWQoKSwKKwkJICogdGhlIGZiIGhlbHBlciBzaG91bGQgYmUgcmUtaW5pdGlhbGl6ZWQgYW5kIHJlLWNvbmZpZ3VyZWQuCisJCSAqLworCQllcnIgPSBleHlub3NfZHJtX2ZiZGV2X3JlaW5pdChkcm1fZGV2KTsKKwkJaWYgKGVycikgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVpbml0aWFsaXplIGV4eW5vcyBkcm0gZmJkZXZcbiIpOworCQkJZXh5bm9zX2RybV9zdWJkcnZfcmVtb3ZlKGRybV9kZXYsIHN1YmRydik7CisJCQltdXRleF91bmxvY2soJmV4eW5vc19kcm1fbXV0ZXgpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWVyciA9IGV4eW5vc19kcm1fbW9kZV9ncm91cF9yZWluaXQoZHJtX2Rldik7CisJCWlmIChlcnIpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlaW5pdGlhbGl6ZSBtb2RlIGdyb3VwXG4iKTsKKwkJCWV4eW5vc19kcm1fZmJkZXZfZmluaShkcm1fZGV2KTsKKwkJCWV4eW5vc19kcm1fc3ViZHJ2X3JlbW92ZShkcm1fZGV2LCBzdWJkcnYpOworCQkJbXV0ZXhfdW5sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlzdWJkcnYtPmRybV9kZXYgPSBkcm1fZGV2OworCisJbGlzdF9hZGRfdGFpbCgmc3ViZHJ2LT5saXN0LCAmZXh5bm9zX2RybV9zdWJkcnZfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXh5bm9zX2RybV9zdWJkcnZfcmVnaXN0ZXIpOworCitpbnQgZXh5bm9zX2RybV9zdWJkcnZfdW5yZWdpc3RlcihzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgKnN1YmRydikKK3sKKwlpbnQgcmV0ID0gLUVGQVVMVDsKKworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoIXN1YmRydikgeworCQlEUk1fREVCVUcoIlVuZXhwZWN0ZWQgZXh5bm9zIGRybSBzdWJkcnYgdW5yZWdpc3RlciFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJmV4eW5vc19kcm1fbXV0ZXgpOworCWlmIChkcm1fZGV2KSB7CisJCWV4eW5vc19kcm1fc3ViZHJ2X3JlbW92ZShkcm1fZGV2LCBzdWJkcnYpOworCQlsaXN0X2RlbCgmc3ViZHJ2LT5saXN0KTsKKworCQkvKgorCQkgKiBmYiBoZWxwZXIgc2hvdWxkIGJlIHVwZGF0ZWQgb25jZSBhIHN1YiBkcml2ZXIgaXMgcmVsZWFzZWQKKwkJICogdG8gcmUtY29uZmlndXJlIGNydGMgYW5kIGNvbm5lY3RvciBhbmQgYWxzbyB0byByZS1zZXR1cAorCQkgKiBkcm0gZnJhbWVidWZmZXIuCisJCSAqLworCQlyZXQgPSBleHlub3NfZHJtX2ZiZGV2X3JlaW5pdChkcm1fZGV2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIGZiIGhlbHBlciByZWluaXQuXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXJldCA9IGV4eW5vc19kcm1fbW9kZV9ncm91cF9yZWluaXQoZHJtX2Rldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCBkcm0gbW9kZSBncm91cCByZWluaXQuXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworZmFpbDoKKwltdXRleF91bmxvY2soJmV4eW5vc19kcm1fbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHlub3NfZHJtX3N1YmRydl91bnJlZ2lzdGVyKTsKKworTU9EVUxFX0FVVEhPUigiSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTb0MgRFJNIENvcmUgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzM3ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NydGMuYwpAQCAtMCwwICsxLDM4MSBAQAorLyogZXh5bm9zX2RybV9jcnRjLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNpbmNsdWRlICJleHlub3NfZHJtX2Rydi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZmIuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2VuY29kZXIuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2J1Zi5oIgorCisjZGVmaW5lIHRvX2V4eW5vc19jcnRjKHgpCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjLFwKKwkJCQlkcm1fY3J0YykKKworLyoKKyAqIEV4eW5vcyBzcGVjaWZpYyBjcnRjIHBvc3Rpb24gc3RydWN0dXJlLgorICoKKyAqIEBmYl94OiBvZmZzZXQgeCBvbiBhIGZyYW1lYnVmZmVyIHRvIGJlIGRpc3BseWVkCisgKgktIHRoZSB1bml0IGlzIHNjcmVlbiBjb29yZGluYXRlcy4KKyAqIEBmYl95OiBvZmZzZXQgeSBvbiBhIGZyYW1lYnVmZmVyIHRvIGJlIGRpc3BsYXllZAorICoJLSB0aGUgdW5pdCBpcyBzY3JlZW4gY29vcmRpbmF0ZXMuCisgKiBAY3J0Y194OiBvZmZzZXQgeCBvbiBoYXJkd2FyZSBzY3JlZW4uCisgKiBAY3J0Y195OiBvZmZzZXQgeSBvbiBoYXJkd2FyZSBzY3JlZW4uCisgKiBAY3J0Y193OiB3aWR0aCBvZiBoYXJkd2FyZSBzY3JlZW4uCisgKiBAY3J0Y19oOiBoZWlnaHQgb2YgaGFyZHdhcmUgc2NyZWVuLgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjX3BvcyB7CisJdW5zaWduZWQgaW50IGZiX3g7CisJdW5zaWduZWQgaW50IGZiX3k7CisJdW5zaWduZWQgaW50IGNydGNfeDsKKwl1bnNpZ25lZCBpbnQgY3J0Y195OworCXVuc2lnbmVkIGludCBjcnRjX3c7CisJdW5zaWduZWQgaW50IGNydGNfaDsKK307CisKKy8qCisgKiBFeHlub3Mgc3BlY2lmaWMgY3J0YyBzdHJ1Y3R1cmUuCisgKgorICogQGRybV9jcnRjOiBjcnRjIG9iamVjdC4KKyAqIEBvdmVybGF5OiBjb250YWluIGluZm9ybWF0aW9uIGNvbW1vbiB0byBkaXNwbGF5IGNvbnRyb2xsZXIgYW5kIGhkbWkgYW5kCisgKgljb250ZW50cyBvZiB0aGlzIG92ZXJsYXkgb2JqZWN0IHdvdWxkIGJlIGNvcGllZCB0byBzdWIgZHJpdmVyIHNpemUuCisgKiBAcGlwZTogYSBjcnRjIGluZGV4IGNyZWF0ZWQgYXQgbG9hZCgpIHdpdGggYSBuZXcgY3J0YyBvYmplY3QgY3JlYXRpb24KKyAqCWFuZCB0aGUgY3J0YyBvYmplY3Qgd291bGQgYmUgc2V0IHRvIHByaXZhdGUtPmNydGMgYXJyYXkKKyAqCXRvIGdldCBhIGNydGMgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwaXBlIGZyb20gcHJpdmF0ZS0+Y3J0YworICoJYXJyYXkgd2hlbiBpcnEgaW50ZXJydXB0IG9jY3VyZWQuIHRoZSByZWFzb24gb2YgdXNpbmcgdGhpcyBwaXBlIGlzIHRoYXQKKyAqCWRybSBmcmFtZXdvcmsgZG9lc24ndCBzdXBwb3J0IG11bHRpcGxlIGlycSB5ZXQuCisgKgl3ZSBjYW4gcmVmZXIgdG8gdGhlIGNydGMgdG8gY3VycmVudCBoYXJkd2FyZSBpbnRlcnJ1cHQgb2NjdXJlZCB0aHJvdWdoCisgKgl0aGlzIHBpcGUgdmFsdWUuCisgKi8KK3N0cnVjdCBleHlub3NfZHJtX2NydGMgeworCXN0cnVjdCBkcm1fY3J0YwkJCWRybV9jcnRjOworCXN0cnVjdCBleHlub3NfZHJtX292ZXJsYXkJb3ZlcmxheTsKKwl1bnNpZ25lZCBpbnQJCQlwaXBlOworfTsKKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9jcnRjX2FwcGx5KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjICpleHlub3NfY3J0YyA9IHRvX2V4eW5vc19jcnRjKGNydGMpOworCXN0cnVjdCBleHlub3NfZHJtX292ZXJsYXkgKm92ZXJsYXkgPSAmZXh5bm9zX2NydGMtPm92ZXJsYXk7CisKKwlleHlub3NfZHJtX2ZuX2VuY29kZXIoY3J0Yywgb3ZlcmxheSwKKwkJCWV4eW5vc19kcm1fZW5jb2Rlcl9jcnRjX21vZGVfc2V0KTsKKwlleHlub3NfZHJtX2ZuX2VuY29kZXIoY3J0YywgTlVMTCwgZXh5bm9zX2RybV9lbmNvZGVyX2NydGNfY29tbWl0KTsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX292ZXJsYXlfdXBkYXRlKHN0cnVjdCBleHlub3NfZHJtX292ZXJsYXkgKm92ZXJsYXksCisJCQkJICAgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkgICAgICAgc3RydWN0IGV4eW5vc19kcm1fY3J0Y19wb3MgKnBvcykKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGludCBhY3R1YWxfdzsKKwl1bnNpZ25lZCBpbnQgYWN0dWFsX2g7CisKKwllbnRyeSA9IGV4eW5vc19kcm1fZmJfZ2V0X2J1ZihmYik7CisJaWYgKCFlbnRyeSkgeworCQlEUk1fTE9HX0tNUygiZW50cnkgaXMgbnVsbC5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlvdmVybGF5LT5wYWRkciA9IGVudHJ5LT5wYWRkcjsKKwlvdmVybGF5LT52YWRkciA9IGVudHJ5LT52YWRkcjsKKworCURSTV9ERUJVR19LTVMoInZhZGRyID0gMHglbHgsIHBhZGRyID0gMHglbHhcbiIsCisJCQkodW5zaWduZWQgbG9uZylvdmVybGF5LT52YWRkciwKKwkJCSh1bnNpZ25lZCBsb25nKW92ZXJsYXktPnBhZGRyKTsKKworCWFjdHVhbF93ID0gbWluKChtb2RlLT5oZGlzcGxheSAtIHBvcy0+Y3J0Y194KSwgcG9zLT5jcnRjX3cpOworCWFjdHVhbF9oID0gbWluKChtb2RlLT52ZGlzcGxheSAtIHBvcy0+Y3J0Y195KSwgcG9zLT5jcnRjX2gpOworCisJLyogc2V0IGRybSBmcmFtZWJ1ZmZlciBkYXRhLiAqLworCW92ZXJsYXktPmZiX3ggPSBwb3MtPmZiX3g7CisJb3ZlcmxheS0+ZmJfeSA9IHBvcy0+ZmJfeTsKKwlvdmVybGF5LT5mYl93aWR0aCA9IGZiLT53aWR0aDsKKwlvdmVybGF5LT5mYl9oZWlnaHQgPSBmYi0+aGVpZ2h0OworCW92ZXJsYXktPmJwcCA9IGZiLT5iaXRzX3Blcl9waXhlbDsKKwlvdmVybGF5LT5waXRjaCA9IGZiLT5waXRjaDsKKworCS8qIHNldCBvdmVybGF5IHJhbmdlIHRvIGJlIGRpc3BsYXllZC4gKi8KKwlvdmVybGF5LT5jcnRjX3ggPSBwb3MtPmNydGNfeDsKKwlvdmVybGF5LT5jcnRjX3kgPSBwb3MtPmNydGNfeTsKKwlvdmVybGF5LT5jcnRjX3dpZHRoID0gYWN0dWFsX3c7CisJb3ZlcmxheS0+Y3J0Y19oZWlnaHQgPSBhY3R1YWxfaDsKKworCS8qIHNldCBkcm0gbW9kZSBkYXRhLiAqLworCW92ZXJsYXktPm1vZGVfd2lkdGggPSBtb2RlLT5oZGlzcGxheTsKKwlvdmVybGF5LT5tb2RlX2hlaWdodCA9IG1vZGUtPnZkaXNwbGF5OworCW92ZXJsYXktPnJlZnJlc2ggPSBtb2RlLT52cmVmcmVzaDsKKwlvdmVybGF5LT5zY2FuX2ZsYWcgPSBtb2RlLT5mbGFnczsKKworCURSTV9ERUJVR19LTVMoIm92ZXJsYXkgOiBvZmZzZXRfeC95KCVkLCVkKSwgd2lkdGgvaGVpZ2h0KCVkLCVkKSIsCisJCQlvdmVybGF5LT5jcnRjX3gsIG92ZXJsYXktPmNydGNfeSwKKwkJCW92ZXJsYXktPmNydGNfd2lkdGgsIG92ZXJsYXktPmNydGNfaGVpZ2h0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4eW5vc19kcm1fY3J0Y191cGRhdGUoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBleHlub3NfZHJtX2NydGMgKmV4eW5vc19jcnRjOworCXN0cnVjdCBleHlub3NfZHJtX292ZXJsYXkgKm92ZXJsYXk7CisJc3RydWN0IGV4eW5vc19kcm1fY3J0Y19wb3MgcG9zOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gJmNydGMtPm1vZGU7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBjcnRjLT5mYjsKKworCWlmICghbW9kZSB8fCAhZmIpCisJCXJldHVybiAtRUlOVkFMOworCisJZXh5bm9zX2NydGMgPSB0b19leHlub3NfY3J0YyhjcnRjKTsKKwlvdmVybGF5ID0gJmV4eW5vc19jcnRjLT5vdmVybGF5OworCisJbWVtc2V0KCZwb3MsIDAsIHNpemVvZihzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjX3BvcykpOworCisJLyogaXQgbWVhbnMgdGhlIG9mZnNldCBvZiBmcmFtZWJ1ZmZlciB0byBiZSBkaXNwbGF5ZWQuICovCisJcG9zLmZiX3ggPSBjcnRjLT54OworCXBvcy5mYl95ID0gY3J0Yy0+eTsKKworCS8qIE9TRCBwb3NpdGlvbiB0byBiZSBkaXNwbGF5ZWQuICovCisJcG9zLmNydGNfeCA9IDA7CisJcG9zLmNydGNfeSA9IDA7CisJcG9zLmNydGNfdyA9IGZiLT53aWR0aCAtIGNydGMtPng7CisJcG9zLmNydGNfaCA9IGZiLT5oZWlnaHQgLSBjcnRjLT55OworCisJcmV0dXJuIGV4eW5vc19kcm1fb3ZlcmxheV91cGRhdGUob3ZlcmxheSwgY3J0Yy0+ZmIsIG1vZGUsICZwb3MpOworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2NydGNfZHBtcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBUT0RPICovCit9CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fY3J0Y19wcmVwYXJlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyogZHJtIGZyYW1ld29yayBkb2Vzbid0IGNoZWNrIE5VTEwuICovCit9CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fY3J0Y19jb21taXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBkcm0gZnJhbWV3b3JrIGRvZXNuJ3QgY2hlY2sgTlVMTC4gKi8KK30KKworc3RhdGljIGJvb2wKK2V4eW5vc19kcm1fY3J0Y19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyogZHJtIGZyYW1ld29yayBkb2Vzbid0IGNoZWNrIE5VTEwgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludAorZXh5bm9zX2RybV9jcnRjX21vZGVfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlLCBpbnQgeCwgaW50IHksCisJCQkgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJbW9kZSA9IGFkanVzdGVkX21vZGU7CisKKwlyZXR1cm4gZXh5bm9zX2RybV9jcnRjX3VwZGF0ZShjcnRjKTsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX2NydGNfbW9kZV9zZXRfYmFzZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSwKKwkJCQkJICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCit7CisJaW50IHJldDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlyZXQgPSBleHlub3NfZHJtX2NydGNfdXBkYXRlKGNydGMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlleHlub3NfZHJtX2NydGNfYXBwbHkoY3J0Yyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2NydGNfbG9hZF9sdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisJLyogZHJtIGZyYW1ld29yayBkb2Vzbid0IGNoZWNrIE5VTEwgKi8KK30KKworc3RhdGljIHN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgZXh5bm9zX2NydGNfaGVscGVyX2Z1bmNzID0geworCS5kcG1zCQk9IGV4eW5vc19kcm1fY3J0Y19kcG1zLAorCS5wcmVwYXJlCT0gZXh5bm9zX2RybV9jcnRjX3ByZXBhcmUsCisJLmNvbW1pdAkJPSBleHlub3NfZHJtX2NydGNfY29tbWl0LAorCS5tb2RlX2ZpeHVwCT0gZXh5bm9zX2RybV9jcnRjX21vZGVfZml4dXAsCisJLm1vZGVfc2V0CT0gZXh5bm9zX2RybV9jcnRjX21vZGVfc2V0LAorCS5tb2RlX3NldF9iYXNlCT0gZXh5bm9zX2RybV9jcnRjX21vZGVfc2V0X2Jhc2UsCisJLmxvYWRfbHV0CT0gZXh5bm9zX2RybV9jcnRjX2xvYWRfbHV0LAorfTsKKworc3RhdGljIGludCBleHlub3NfZHJtX2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBleHlub3NfZHJtX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjICpleHlub3NfY3J0YyA9IHRvX2V4eW5vc19jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYiA9IGNydGMtPmZiOworCWludCByZXQgPSAtRUlOVkFMOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCWlmIChldmVudCkgeworCQkvKgorCQkgKiB0aGUgcGlwZSBmcm9tIHVzZXIgYWx3YXlzIGlzIDAgc28gd2UgY2FuIHNldCBwaXBlIG51bWJlcgorCQkgKiBvZiBjdXJyZW50IG93bmVyIHRvIGV2ZW50LgorCQkgKi8KKwkJZXZlbnQtPnBpcGUgPSBleHlub3NfY3J0Yy0+cGlwZTsKKworCQlsaXN0X2FkZF90YWlsKCZldmVudC0+YmFzZS5saW5rLAorCQkJCSZkZXZfcHJpdi0+cGFnZWZsaXBfZXZlbnRfbGlzdCk7CisKKwkJcmV0ID0gZHJtX3ZibGFua19nZXQoZGV2LCBleHlub3NfY3J0Yy0+cGlwZSk7CisJCWlmIChyZXQpIHsKKwkJCURSTV9ERUJVRygiZmFpbGVkIHRvIGFjcXVpcmUgdmJsYW5rIGNvdW50ZXJcbiIpOworCQkJbGlzdF9kZWwoJmV2ZW50LT5iYXNlLmxpbmspOworCisJCQlnb3RvIG91dDsKKwkJfQorCisJCWNydGMtPmZiID0gZmI7CisJCXJldCA9IGV4eW5vc19kcm1fY3J0Y191cGRhdGUoY3J0Yyk7CisJCWlmIChyZXQpIHsKKwkJCWNydGMtPmZiID0gb2xkX2ZiOworCQkJZHJtX3ZibGFua19wdXQoZGV2LCBleHlub3NfY3J0Yy0+cGlwZSk7CisJCQlsaXN0X2RlbCgmZXZlbnQtPmJhc2UubGluayk7CisKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogdGhlIHZhbHVlcyByZWxhdGVkIHRvIGEgYnVmZmVyIG9mIHRoZSBkcm0gZnJhbWVidWZmZXIKKwkJICogdG8gYmUgYXBwbGllZCBzaG91bGQgYmUgc2V0IGF0IGhlcmUuIGJlY2F1c2UgdGhlc2UgdmFsdWVzCisJCSAqIGZpcnN0LCBhcmUgc2V0IHRvIHNoYWRvdyByZWdpc3RlcnMgYW5kIHRoZW4gdG8KKwkJICogcmVhbCByZWdpc3RlcnMgYXQgdnN5bmMgZnJvbnQgcG9yY2ggcGVyaW9kLgorCQkgKi8KKwkJZXh5bm9zX2RybV9jcnRjX2FwcGx5KGNydGMpOworCX0KK291dDoKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2NydGNfZGVzdHJveShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGV4eW5vc19kcm1fY3J0YyAqZXh5bm9zX2NydGMgPSB0b19leHlub3NfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2YXRlID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlwcml2YXRlLT5jcnRjW2V4eW5vc19jcnRjLT5waXBlXSA9IE5VTEw7CisKKwlkcm1fY3J0Y19jbGVhbnVwKGNydGMpOworCWtmcmVlKGV4eW5vc19jcnRjKTsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fY3J0Y19mdW5jcyBleHlub3NfY3J0Y19mdW5jcyA9IHsKKwkuc2V0X2NvbmZpZwk9IGRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnLAorCS5wYWdlX2ZsaXAJPSBleHlub3NfZHJtX2NydGNfcGFnZV9mbGlwLAorCS5kZXN0cm95CT0gZXh5bm9zX2RybV9jcnRjX2Rlc3Ryb3ksCit9OworCitzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5ICpnZXRfZXh5bm9zX2RybV9vdmVybGF5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjICpleHlub3NfY3J0YyA9IHRvX2V4eW5vc19jcnRjKGNydGMpOworCisJcmV0dXJuICZleHlub3NfY3J0Yy0+b3ZlcmxheTsKK30KKworaW50IGV4eW5vc19kcm1fY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG5yKQoreworCXN0cnVjdCBleHlub3NfZHJtX2NydGMgKmV4eW5vc19jcnRjOworCXN0cnVjdCBleHlub3NfZHJtX3ByaXZhdGUgKnByaXZhdGUgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlleHlub3NfY3J0YyA9IGt6YWxsb2Moc2l6ZW9mKCpleHlub3NfY3J0YyksIEdGUF9LRVJORUwpOworCWlmICghZXh5bm9zX2NydGMpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgZXh5bm9zIGNydGNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlleHlub3NfY3J0Yy0+cGlwZSA9IG5yOworCWNydGMgPSAmZXh5bm9zX2NydGMtPmRybV9jcnRjOworCisJcHJpdmF0ZS0+Y3J0Y1tucl0gPSBjcnRjOworCisJZHJtX2NydGNfaW5pdChkZXYsIGNydGMsICZleHlub3NfY3J0Y19mdW5jcyk7CisJZHJtX2NydGNfaGVscGVyX2FkZChjcnRjLCAmZXh5bm9zX2NydGNfaGVscGVyX2Z1bmNzKTsKKworCXJldHVybiAwOworfQorCitpbnQgZXh5bm9zX2RybV9jcnRjX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCit7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJZXh5bm9zX2RybV9mbl9lbmNvZGVyKHByaXZhdGUtPmNydGNbY3J0Y10sICZjcnRjLAorCQkJZXh5bm9zX2RybV9lbmFibGVfdmJsYW5rKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGV4eW5vc19kcm1fY3J0Y19kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlleHlub3NfZHJtX2ZuX2VuY29kZXIocHJpdmF0ZS0+Y3J0Y1tjcnRjXSwgJmNydGMsCisJCQlleHlub3NfZHJtX2Rpc2FibGVfdmJsYW5rKTsKK30KKworTU9EVUxFX0FVVEhPUigiSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTb0MgRFJNIENSVEMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY3J0Yy5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NydGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTg0MDQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NydGMuaApAQCAtMCwwICsxLDM4IEBACisvKiBleHlub3NfZHJtX2NydGMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yczoKKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRVhZTk9TX0RSTV9DUlRDX0hfCisjZGVmaW5lIF9FWFlOT1NfRFJNX0NSVENfSF8KKworc3RydWN0IGV4eW5vc19kcm1fb3ZlcmxheSAqZ2V0X2V4eW5vc19kcm1fb3ZlcmxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworaW50IGV4eW5vc19kcm1fY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG5yKTsKK2ludCBleHlub3NfZHJtX2NydGNfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7Cit2b2lkIGV4eW5vc19kcm1fY3J0Y19kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODEwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisKKyNpbmNsdWRlIDxkcm0vZXh5bm9zX2RybS5oPgorCisjaW5jbHVkZSAiZXh5bm9zX2RybV9kcnYuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2NydGMuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2ZiZGV2LmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9mYi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZ2VtLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJImV4eW5vcy1kcm0iCisjZGVmaW5lIERSSVZFUl9ERVNDCSJTYW1zdW5nIFNvQyBEUk0iCisjZGVmaW5lIERSSVZFUl9EQVRFCSIyMDExMDUzMCIKKyNkZWZpbmUgRFJJVkVSX01BSk9SCTEKKyNkZWZpbmUgRFJJVkVSX01JTk9SCTAKKworc3RhdGljIGludCBleHlub3NfZHJtX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2YXRlOworCWludCByZXQ7CisJaW50IG5yOworCisJRFJNX0RFQlVHX0RSSVZFUigiJXNcbiIsIF9fRklMRV9fKTsKKworCXByaXZhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2YXRlKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIHByaXZhdGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmcHJpdmF0ZS0+cGFnZWZsaXBfZXZlbnRfbGlzdCk7CisJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopcHJpdmF0ZTsKKworCWRybV9tb2RlX2NvbmZpZ19pbml0KGRldik7CisKKwlleHlub3NfZHJtX21vZGVfY29uZmlnX2luaXQoZGV2KTsKKworCS8qCisJICogRVhZTk9TNCBpcyBlbm91Z2ggdG8gaGF2ZSB0d28gQ1JUQ3MgYW5kIGVhY2ggY3J0YyB3b3VsZCBiZSB1c2VkCisJICogd2l0aG91dCBkZXBlbmRlbmN5IG9mIGhhcmR3YXJlLgorCSAqLworCWZvciAobnIgPSAwOyBuciA8IE1BWF9DUlRDOyBucisrKSB7CisJCXJldCA9IGV4eW5vc19kcm1fY3J0Y19jcmVhdGUoZGV2LCBucik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9jcnRjOworCX0KKworCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIE1BWF9DUlRDKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jcnRjOworCisJLyoKKwkgKiBwcm9iZSBzdWIgZHJpdmVycyBzdWNoIGFzIGRpc3BsYXkgY29udHJvbGxlciBhbmQgaGRtaSBkcml2ZXIsCisJICogdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgYXQgcHJvYmUoKSBvZiBwbGF0Zm9ybSBkcml2ZXIKKwkgKiB0byB0aGUgc3ViIGRyaXZlciBhbmQgY3JlYXRlIGVuY29kZXIgYW5kIGNvbm5lY3RvciBmb3IgdGhlbS4KKwkgKi8KKwlyZXQgPSBleHlub3NfZHJtX2RldmljZV9yZWdpc3RlcihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3ZibGFuazsKKworCS8qCisJICogY3JlYXRlIGFuZCBjb25maWd1cmUgZmIgaGVscGVyIGFuZCBhbHNvIGV4eW5vcyBzcGVjaWZpYworCSAqIGZiZGV2IG9iamVjdC4KKwkgKi8KKwlyZXQgPSBleHlub3NfZHJtX2ZiZGV2X2luaXQoZGV2KTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGluaXRpYWxpemUgZHJtIGZiZGV2XG4iKTsKKwkJZ290byBlcnJfZHJtX2RldmljZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2RybV9kZXZpY2U6CisJZXh5bm9zX2RybV9kZXZpY2VfdW5yZWdpc3RlcihkZXYpOworZXJyX3ZibGFuazoKKwlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKK2Vycl9jcnRjOgorCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGRldik7CisJa2ZyZWUocHJpdmF0ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4eW5vc19kcm1fdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJRFJNX0RFQlVHX0RSSVZFUigiJXNcbiIsIF9fRklMRV9fKTsKKworCWV4eW5vc19kcm1fZmJkZXZfZmluaShkZXYpOworCWV4eW5vc19kcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKKwlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkZXYpOworCWtmcmVlKGRldi0+ZGV2X3ByaXZhdGUpOworCisJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKgorCSAqIGRybSBmcmFtZXdvcmsgZnJlZXMgYWxsIGV2ZW50cyBhdCByZWxlYXNlIHRpbWUsCisJICogc28gcHJpdmF0ZSBldmVudCBsaXN0IHNob3VsZCBiZSBjbGVhcmVkLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPnBhZ2VmbGlwX2V2ZW50X2xpc3QpKQorCQlJTklUX0xJU1RfSEVBRCgmZGV2X3ByaXYtPnBhZ2VmbGlwX2V2ZW50X2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlleHlub3NfZHJtX2ZiZGV2X3Jlc3RvcmVfbW9kZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGV4eW5vc19kcm1fZ2VtX3ZtX29wcyA9IHsKKwkuZmF1bHQgPSBleHlub3NfZHJtX2dlbV9mYXVsdCwKKwkub3BlbiA9IGRybV9nZW1fdm1fb3BlbiwKKwkuY2xvc2UgPSBkcm1fZ2VtX3ZtX2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBkcm1faW9jdGxfZGVzYyBleHlub3NfaW9jdGxzW10gPSB7CisJRFJNX0lPQ1RMX0RFRl9EUlYoRVhZTk9TX0dFTV9DUkVBVEUsIGV4eW5vc19kcm1fZ2VtX2NyZWF0ZV9pb2N0bCwKKwkJCURSTV9VTkxPQ0tFRCB8IERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihFWFlOT1NfR0VNX01BUF9PRkZTRVQsCisJCQlleHlub3NfZHJtX2dlbV9tYXBfb2Zmc2V0X2lvY3RsLCBEUk1fVU5MT0NLRUQgfAorCQkJRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUZfRFJWKEVYWU5PU19HRU1fTU1BUCwKKwkJCWV4eW5vc19kcm1fZ2VtX21tYXBfaW9jdGwsIERSTV9VTkxPQ0tFRCB8IERSTV9BVVRIKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBleHlub3NfZHJtX2RyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzCT0gRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0JVU19QTEFURk9STSB8CisJCQkJICBEUklWRVJfTU9ERVNFVCB8IERSSVZFUl9HRU0sCisJLmxvYWQJCQk9IGV4eW5vc19kcm1fbG9hZCwKKwkudW5sb2FkCQkJPSBleHlub3NfZHJtX3VubG9hZCwKKwkucHJlY2xvc2UJCT0gZXh5bm9zX2RybV9wcmVjbG9zZSwKKwkubGFzdGNsb3NlCQk9IGV4eW5vc19kcm1fbGFzdGNsb3NlLAorCS5nZXRfdmJsYW5rX2NvdW50ZXIJPSBkcm1fdmJsYW5rX2NvdW50LAorCS5lbmFibGVfdmJsYW5rCQk9IGV4eW5vc19kcm1fY3J0Y19lbmFibGVfdmJsYW5rLAorCS5kaXNhYmxlX3ZibGFuawkJPSBleHlub3NfZHJtX2NydGNfZGlzYWJsZV92YmxhbmssCisJLmdlbV9pbml0X29iamVjdAk9IGV4eW5vc19kcm1fZ2VtX2luaXRfb2JqZWN0LAorCS5nZW1fZnJlZV9vYmplY3QJPSBleHlub3NfZHJtX2dlbV9mcmVlX29iamVjdCwKKwkuZ2VtX3ZtX29wcwkJPSAmZXh5bm9zX2RybV9nZW1fdm1fb3BzLAorCS5kdW1iX2NyZWF0ZQkJPSBleHlub3NfZHJtX2dlbV9kdW1iX2NyZWF0ZSwKKwkuZHVtYl9tYXBfb2Zmc2V0CT0gZXh5bm9zX2RybV9nZW1fZHVtYl9tYXBfb2Zmc2V0LAorCS5kdW1iX2Rlc3Ryb3kJCT0gZXh5bm9zX2RybV9nZW1fZHVtYl9kZXN0cm95LAorCS5pb2N0bHMJCQk9IGV4eW5vc19pb2N0bHMsCisJLmZvcHMgPSB7CisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLm9wZW4JCT0gZHJtX29wZW4sCisJCS5tbWFwCQk9IGV4eW5vc19kcm1fZ2VtX21tYXAsCisJCS5wb2xsCQk9IGRybV9wb2xsLAorCQkucmVhZAkJPSBkcm1fcmVhZCwKKwkJLnVubG9ja2VkX2lvY3RsCT0gZHJtX2lvY3RsLAorCQkucmVsZWFzZQk9IGRybV9yZWxlYXNlLAorCX0sCisJLm5hbWUJPSBEUklWRVJfTkFNRSwKKwkuZGVzYwk9IERSSVZFUl9ERVNDLAorCS5kYXRlCT0gRFJJVkVSX0RBVEUsCisJLm1ham9yCT0gRFJJVkVSX01BSk9SLAorCS5taW5vcgk9IERSSVZFUl9NSU5PUiwKK307CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlleHlub3NfZHJtX2RyaXZlci5udW1faW9jdGxzID0gRFJNX0FSUkFZX1NJWkUoZXh5bm9zX2lvY3Rscyk7CisKKwlyZXR1cm4gZHJtX3BsYXRmb3JtX2luaXQoJmV4eW5vc19kcm1fZHJpdmVyLCBwZGV2KTsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlkcm1fcGxhdGZvcm1fZXhpdCgmZXh5bm9zX2RybV9kcml2ZXIsIHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV4eW5vc19kcm1fcGxhdGZvcm1fZHJpdmVyID0geworCS5wcm9iZQkJPSBleHlub3NfZHJtX3BsYXRmb3JtX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZXh5bm9zX2RybV9wbGF0Zm9ybV9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSBEUklWRVJfTkFNRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXh5bm9zX2RybV9pbml0KHZvaWQpCit7CisJRFJNX0RFQlVHX0RSSVZFUigiJXNcbiIsIF9fRklMRV9fKTsKKworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmV4eW5vc19kcm1fcGxhdGZvcm1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4eW5vc19kcm1fZXhpdCh2b2lkKQoreworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZXh5bm9zX2RybV9wbGF0Zm9ybV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChleHlub3NfZHJtX2luaXQpOworbW9kdWxlX2V4aXQoZXh5bm9zX2RybV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTb0MgRFJNIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzY4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZHJ2LmgKQEAgLTAsMCArMSwyNTQgQEAKKy8qIGV4eW5vc19kcm1fZHJ2LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0VYWU5PU19EUk1fRFJWX0hfCisjZGVmaW5lIF9FWFlOT1NfRFJNX0RSVl9IXworCisjaW5jbHVkZSAiZHJtLmgiCisKKyNkZWZpbmUgTUFYX0NSVEMJMgorCitzdHJ1Y3QgZHJtX2RldmljZTsKK3N0cnVjdCBleHlub3NfZHJtX292ZXJsYXk7CitzdHJ1Y3QgZHJtX2Nvbm5lY3RvcjsKKworLyogdGhpcyBlbnVtZXJhdGVzIGRpc3BsYXkgdHlwZS4gKi8KK2VudW0gZXh5bm9zX2RybV9vdXRwdXRfdHlwZSB7CisJRVhZTk9TX0RJU1BMQVlfVFlQRV9OT05FLAorCS8qIFJHQiBvciBDUFUgSW50ZXJmYWNlLiAqLworCUVYWU5PU19ESVNQTEFZX1RZUEVfTENELAorCS8qIEhETUkgSW50ZXJmYWNlLiAqLworCUVYWU5PU19ESVNQTEFZX1RZUEVfSERNSSwKK307CisKKy8qCisgKiBFeHlub3MgZHJtIG92ZXJsYXkgb3BzIHN0cnVjdHVyZS4KKyAqCisgKiBAbW9kZV9zZXQ6IGNvcHkgZHJtIG92ZXJsYXkgaW5mbyB0byBodyBzcGVjaWZpYyBvdmVybGF5IGluZm8uCisgKiBAY29tbWl0OiBhcHBseSBoYXJkd2FyZSBzcGVjaWZpYyBvdmVybGF5IGRhdGEgdG8gcmVnaXN0ZXJzLgorICogQGRpc2FibGU6IGRpc2FibGUgaGFyZHdhcmUgc3BlY2lmaWMgb3ZlcmxheS4KKyAqLworc3RydWN0IGV4eW5vc19kcm1fb3ZlcmxheV9vcHMgeworCXZvaWQgKCptb2RlX3NldCkoc3RydWN0IGRldmljZSAqc3ViZHJ2X2RldiwKKwkJCSBzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5ICpvdmVybGF5KTsKKwl2b2lkICgqY29tbWl0KShzdHJ1Y3QgZGV2aWNlICpzdWJkcnZfZGV2KTsKKwl2b2lkICgqZGlzYWJsZSkoc3RydWN0IGRldmljZSAqc3ViZHJ2X2Rldik7Cit9OworCisvKgorICogRXh5bm9zIGRybSBjb21tb24gb3ZlcmxheSBzdHJ1Y3R1cmUuCisgKgorICogQGZiX3g6IG9mZnNldCB4IG9uIGEgZnJhbWVidWZmZXIgdG8gYmUgZGlzcGxheWVkLgorICoJLSB0aGUgdW5pdCBpcyBzY3JlZW4gY29vcmRpbmF0ZXMuCisgKiBAZmJfeTogb2Zmc2V0IHkgb24gYSBmcmFtZWJ1ZmZlciB0byBiZSBkaXNwbGF5ZWQuCisgKgktIHRoZSB1bml0IGlzIHNjcmVlbiBjb29yZGluYXRlcy4KKyAqIEBmYl93aWR0aDogd2lkdGggb2YgYSBmcmFtZWJ1ZmZlci4KKyAqIEBmYl9oZWlnaHQ6IGhlaWdodCBvZiBhIGZyYW1lYnVmZmVyLgorICogQGNydGNfeDogb2Zmc2V0IHggb24gaGFyZHdhcmUgc2NyZWVuLgorICogQGNydGNfeTogb2Zmc2V0IHkgb24gaGFyZHdhcmUgc2NyZWVuLgorICogQGNydGNfd2lkdGg6IHdpbmRvdyB3aWR0aCB0byBiZSBkaXNwbGF5ZWQgKGhhcmR3YXJlIHNjcmVlbikuCisgKiBAY3J0Y19oZWlnaHQ6IHdpbmRvdyBoZWlnaHQgdG8gYmUgZGlzcGxheWVkIChoYXJkd2FyZSBzY3JlZW4pLgorICogQG1vZGVfd2lkdGg6IHdpZHRoIG9mIHNjcmVlbiBtb2RlLgorICogQG1vZGVfaGVpZ2h0OiBoZWlnaHQgb2Ygc2NyZWVuIG1vZGUuCisgKiBAcmVmcmVzaDogcmVmcmVzaCByYXRlLgorICogQHNjYW5fZmxhZzogaW50ZXJsYWNlIG9yIHByb2dyZXNzaXZlIHdheS4KKyAqCShpdCBjb3VsZCBiZSBEUk1fTU9ERV9GTEFHXyopCisgKiBAYnBwOiBwaXhlbCBzaXplLihpbiBiaXQpCisgKiBAcGFkZHI6IGJ1cyhhY2Nlc3NlZCBieSBkbWEpIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIHRvIHRoaXMgb3ZlcmxheQorICoJCWFuZCB0aGlzIGlzIHBoeXNpY2FsbHkgY29udGludW91cy4KKyAqIEB2YWRkcjogdmlydHVhbCBtZW1vcnkgYWRkcmVzc3MgdG8gdGhpcyBvdmVybGF5LgorICogQGRlZmF1bHRfd2luOiBhIHdpbmRvdyB0byBiZSBlbmFibGVkLgorICogQGNvbG9yX2tleTogY29sb3Iga2V5IG9uIG9yIG9mZi4KKyAqIEBpbmRleF9jb2xvcjogaWYgdXNpbmcgY29sb3Iga2V5IGZlYXR1cmUgdGhlbiB0aGlzIHZhbHVlIHdvdWxkIGJlIHVzZWQKKyAqCQkJYXMgaW5kZXggY29sb3IuCisgKiBAbG9jYWxfcGF0aDogaW4gY2FzZSBvZiBsY2QgdHlwZSwgbG9jYWwgcGF0aCBtb2RlIG9uIG9yIG9mZi4KKyAqIEB0cmFuc3BhcmVuY3k6IHRyYW5zcGFyZW5jeSBvbiBvciBvZmYuCisgKiBAYWN0aXZhdGVkOiBhY3RpdmF0ZWQgb3Igbm90LgorICoKKyAqIHRoaXMgc3RydWN0dXJlIGlzIGNvbW1vbiB0byBleHlub3MgU29DIGFuZCBpdHMgY29udGVudHMgd291bGQgYmUgY29waWVkCisgKiB0byBoYXJkd2FyZSBzcGVjaWZpYyBvdmVybGF5IGluZm8uCisgKi8KK3N0cnVjdCBleHlub3NfZHJtX292ZXJsYXkgeworCXVuc2lnbmVkIGludCBmYl94OworCXVuc2lnbmVkIGludCBmYl95OworCXVuc2lnbmVkIGludCBmYl93aWR0aDsKKwl1bnNpZ25lZCBpbnQgZmJfaGVpZ2h0OworCXVuc2lnbmVkIGludCBjcnRjX3g7CisJdW5zaWduZWQgaW50IGNydGNfeTsKKwl1bnNpZ25lZCBpbnQgY3J0Y193aWR0aDsKKwl1bnNpZ25lZCBpbnQgY3J0Y19oZWlnaHQ7CisJdW5zaWduZWQgaW50IG1vZGVfd2lkdGg7CisJdW5zaWduZWQgaW50IG1vZGVfaGVpZ2h0OworCXVuc2lnbmVkIGludCByZWZyZXNoOworCXVuc2lnbmVkIGludCBzY2FuX2ZsYWc7CisJdW5zaWduZWQgaW50IGJwcDsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CisJZG1hX2FkZHJfdCBwYWRkcjsKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCisJYm9vbCBkZWZhdWx0X3dpbjsKKwlib29sIGNvbG9yX2tleTsKKwl1bnNpZ25lZCBpbnQgaW5kZXhfY29sb3I7CisJYm9vbCBsb2NhbF9wYXRoOworCWJvb2wgdHJhbnNwYXJlbmN5OworCWJvb2wgYWN0aXZhdGVkOworfTsKKworLyoKKyAqIEV4eW5vcyBEUk0gRGlzcGxheSBTdHJ1Y3R1cmUuCisgKgktIHRoaXMgc3RydWN0dXJlIGlzIGNvbW1vbiB0byBhbmFsb2cgdHYsIGRpZ2l0YWwgdHYgYW5kIGxjZCBwYW5lbC4KKyAqCisgKiBAdHlwZTogb25lIG9mIEVYWU5PU19ESVNQTEFZX1RZUEVfTENEIGFuZCBIRE1JLgorICogQGlzX2Nvbm5lY3RlZDogY2hlY2sgZm9yIHRoYXQgZGlzcGxheSBpcyBjb25uZWN0ZWQgb3Igbm90LgorICogQGdldF9lZGlkOiBnZXQgZWRpZCBtb2RlcyBmcm9tIGRpc3BsYXkgZHJpdmVyLgorICogQGdldF90aW1pbmc6IGdldCB0aW1pbmcgb2JqZWN0IGZyb20gZGlzcGxheSBkcml2ZXIuCisgKiBAY2hlY2tfdGltaW5nOiBjaGVjayBpZiB0aW1pbmcgaXMgdmFsaWQgb3Igbm90LgorICogQHBvd2VyX29uOiBkaXNwbGF5IGRldmljZSBvbiBvciBvZmYuCisgKi8KK3N0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgeworCWVudW0gZXh5bm9zX2RybV9vdXRwdXRfdHlwZSB0eXBlOworCWJvb2wgKCppc19jb25uZWN0ZWQpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqZ2V0X2VkaWQpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQl1OCAqZWRpZCwgaW50IGxlbik7CisJdm9pZCAqKCpnZXRfdGltaW5nKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKmNoZWNrX3RpbWluZykoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp0aW1pbmcpOworCWludCAoKnBvd2VyX29uKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKTsKK307CisKKy8qCisgKiBFeHlub3MgZHJtIG1hbmFnZXIgb3BzCisgKgorICogQG1vZGVfc2V0OiBjb252ZXJ0IGRybV9kaXNwbGF5X21vZGUgdG8gaHcgc3BlY2lmaWMgZGlzcGxheSBtb2RlIGFuZAorICoJICAgICAgd291bGQgYmUgY2FsbGVkIGJ5IGVuY29kZXItPm1vZGVfc2V0KCkuCisgKiBAY29tbWl0OiBzZXQgY3VycmVudCBodyBzcGVjaWZpYyBkaXNwbGF5IG1vZGUgdG8gaHcuCisgKiBAZW5hYmxlX3ZibGFuazogc3BlY2lmaWMgZHJpdmVyIGNhbGxiYWNrIGZvciBlbmFibGluZyB2YmxhbmsgaW50ZXJydXB0LgorICogQGRpc2FibGVfdmJsYW5rOiBzcGVjaWZpYyBkcml2ZXIgY2FsbGJhY2sgZm9yIGRpc2FibGluZyB2YmxhbmsgaW50ZXJydXB0LgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyX29wcyB7CisJdm9pZCAoKm1vZGVfc2V0KShzdHJ1Y3QgZGV2aWNlICpzdWJkcnZfZGV2LCB2b2lkICptb2RlKTsKKwl2b2lkICgqY29tbWl0KShzdHJ1Y3QgZGV2aWNlICpzdWJkcnZfZGV2KTsKKwlpbnQgKCplbmFibGVfdmJsYW5rKShzdHJ1Y3QgZGV2aWNlICpzdWJkcnZfZGV2KTsKKwl2b2lkICgqZGlzYWJsZV92YmxhbmspKHN0cnVjdCBkZXZpY2UgKnN1YmRydl9kZXYpOworfTsKKworLyoKKyAqIEV4eW5vcyBkcm0gY29tbW9uIG1hbmFnZXIgc3RydWN0dXJlLgorICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlIG9iamVjdCBmb3Igc3ViZHJ2IGRldmljZSBkcml2ZXIuCisgKglzdWIgZHJpdmVycyBzdWNoIGFzIGRpc3BsYXkgY29udHJvbGxlciBvciBoZG1pIGRyaXZlciwKKyAqCWhhdmUgdGhlaXIgb3duIGRldmljZSBvYmplY3QuCisgKiBAb3BzOiBwb2ludGVyIHRvIGNhbGxiYWNrcyBmb3IgZXh5bm9zIGRybSBzcGVjaWZpYyBmcmFtZWJ1ZmZlci4KKyAqCXRoZXNlIGNhbGxiYWNrcyBzaG91bGQgYmUgc2V0IGJ5IHNwZWNpZmljIGRyaXZlcnMgc3VjaCBmaW1kCisgKglvciBoZG1pIGRyaXZlciBhbmQgYXJlIHVzZWQgdG8gY29udHJvbCBoYXJkd2FyZSBnbG9iYWwgcmVnaXN0ZXJzLgorICogQG92ZXJsYXlfb3BzOiBwb2ludGVyIHRvIGNhbGxiYWNrcyBmb3IgZXh5bm9zIGRybSBzcGVjaWZpYyBmcmFtZWJ1ZmZlci4KKyAqCXRoZXNlIGNhbGxiYWNrcyBzaG91bGQgYmUgc2V0IGJ5IHNwZWNpZmljIGRyaXZlcnMgc3VjaCBmaW1kCisgKglvciBoZG1pIGRyaXZlciBhbmQgYXJlIHVzZWQgdG8gY29udHJvbCBoYXJkd2FyZSBvdmVybGF5IHJlaWdzdGVycy4KKyAqIEBkaXNwbGF5OiBwb2ludGVyIHRvIGNhbGxiYWNrcyBmb3IgZXh5bm9zIGRybSBzcGVjaWZpYyBmcmFtZWJ1ZmZlci4KKyAqCXRoZXNlIGNhbGxiYWNrcyBzaG91bGQgYmUgc2V0IGJ5IHNwZWNpZmljIGRyaXZlcnMgc3VjaCBmaW1kCisgKglvciBoZG1pIGRyaXZlciBhbmQgYXJlIHVzZWQgdG8gY29udHJvbCBkaXNwbGF5IGRldmljZXMgc3VjaCBhcworICoJYW5hbG9nIHR2LCBkaWdpdGFsIHR2IGFuZCBsY2QgcGFuZWwgYW5kIGFsc28gZ2V0IHRpbWluZyBkYXRhIGZvciB0aGVtLgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IHBpcGU7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcl9vcHMgKm9wczsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5X29wcyAqb3ZlcmxheV9vcHM7CisJc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheTsKK307CisKKy8qCisgKiBFeHlub3MgZHJtIHByaXZhdGUgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlIHsKKwlzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyOworCisJLyogbGlzdCBoZWFkIGZvciBuZXcgZXZlbnQgdG8gYmUgYWRkZWQuICovCisJc3RydWN0IGxpc3RfaGVhZCBwYWdlZmxpcF9ldmVudF9saXN0OworCisJLyoKKwkgKiBjcmVhdGVkIGNydGMgb2JqZWN0IHdvdWxkIGJlIGNvbnRhaW5lZCBhdCB0aGlzIGFycmF5IGFuZAorCSAqIHRoaXMgYXJyYXkgaXMgdXNlZCB0byBiZSBhd2FyZSBvZiB3aGljaCBjcnRjIGRpZCBpdCByZXF1ZXN0IHZibGFuay4KKwkgKi8KKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGNbTUFYX0NSVENdOworfTsKKworLyoKKyAqIEV4eW5vcyBkcm0gc3ViIGRyaXZlciBzdHJ1Y3R1cmUuCisgKgorICogQGxpc3Q6IHN1YiBkcml2ZXIgaGFzIGl0cyBvd24gbGlzdCBvYmplY3QgdG8gcmVnaXN0ZXIgdG8gZXh5bm9zIGRybSBkcml2ZXIuCisgKiBAZHJtX2RldjogcG9pbnRlciB0byBkcm1fZGV2aWNlIGFuZCB0aGlzIHBvaW50ZXIgd291bGQgYmUgc2V0CisgKgl3aGVuIHN1YiBkcml2ZXIgY2FsbHMgZXh5bm9zX2RybV9zdWJkcnZfcmVnaXN0ZXIoKS4KKyAqIEBwcm9iZTogdGhpcyBjYWxsYmFjayB3b3VsZCBiZSBjYWxsZWQgYnkgZXh5bm9zIGRybSBkcml2ZXIgYWZ0ZXIKKyAqCXN1YmRydiBpcyByZWdpc3RlcmVkIHRvIGl0LgorICogQHJlbW92ZTogdGhpcyBjYWxsYmFjayBpcyB1c2VkIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGNyZWF0ZWQKKyAqCWJ5IHByb2JlIGNhbGxiYWNrLgorICogQG1hbmFnZXI6IHN1YmRydiBoYXMgaXRzIG93biBtYW5hZ2VyIHRvIGNvbnRyb2wgYSBoYXJkd2FyZSBhcHByb3ByaWF0ZWx5CisgKglhbmQgd2UgY2FuIGFjY2VzcyBhIGhhcmR3YXJlIGRyYXdpbmcgb24gdGhpcyBtYW5hZ2VyLgorICogQGVuY29kZXI6IGVuY29kZXIgb2JqZWN0IG93bmVkIGJ5IHRoaXMgc3ViIGRyaXZlci4KKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciBvYmplY3Qgb3duZWQgYnkgdGhpcyBzdWIgZHJpdmVyLgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldjsKKworCWludCAoKnByb2JlKShzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgbWFuYWdlcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKK307CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIGNhbGxzIGEgcHJvYmUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB0byBzdWIgZHJpdmVyIGxpc3QgYW5kCisgKiBjcmVhdGUgaXRzIG93biBlbmNvZGVyIGFuZCBjb25uZWN0b3IgYW5kIHRoZW4gc2V0IGRybV9kZXZpY2Ugb2JqZWN0CisgKiB0byBnbG9iYWwgb25lLgorICovCitpbnQgZXh5bm9zX2RybV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisvKgorICogdGhpcyBmdW5jdGlvbiBjYWxscyBhIHJlbW92ZSBjYWxsYmFjayByZWdpc3RlcmVkIHRvIHN1YiBkcml2ZXIgbGlzdCBhbmQKKyAqIGRlc3Ryb3kgaXRzIG93biBlbmNvZGVyIGFuZCBjb25uZXRvci4KKyAqLworaW50IGV4eW5vc19kcm1fZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGJlIGNhbGxlZCBieSBzdWIgZHJpdmVycyBzdWNoIGFzIGRpc3BsYXkgY29udHJvbGxlcgorICogb3IgaGRtaSBkcml2ZXIgdG8gcmVnaXN0ZXIgdGhpcyBzdWIgZHJpdmVyIG9iamVjdCB0byBleHlub3MgZHJtIGRyaXZlcgorICogYW5kIHdoZW4gYSBzdWIgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgdG8gZXh5bm9zIGRybSBkcml2ZXIgYSBwcm9iZSBjYWxsYmFjaworICogb2YgdGhlIHN1YiBkcml2ZXIgaXMgY2FsbGVkIGFuZCBjcmVhdGVzIGl0cyBvd24gZW5jb2RlciBhbmQgY29ubmVjdG9yCisgKiBhbmQgdGhlbiBmYiBoZWxwZXIgYW5kIGRybSBtb2RlIGdyb3VwIHdvdWxkIGJlIHJlLWluaXRpYWxpemVkLgorICovCitpbnQgZXh5bm9zX2RybV9zdWJkcnZfcmVnaXN0ZXIoc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpkcm1fc3ViZHJ2KTsKKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBzdWJkcnYgbGlzdCBmcm9tIGV4eW5vcyBkcm0gZHJpdmVyIGFuZCBmYiBoZWxwZXIKKyAqIGFuZCBkcm0gbW9kZSBncm91cCB3b3VsZCBiZSByZS1pbml0aWFsaXplZC4KKyAqLworaW50IGV4eW5vc19kcm1fc3ViZHJ2X3VucmVnaXN0ZXIoc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpkcm1fc3ViZHJ2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZW5jb2Rlci5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2VuY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Y2ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2VuY29kZXIuYwpAQCAtMCwwICsxLDI3MSBAQAorLyogZXh5bm9zX2RybV9lbmNvZGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNpbmNsdWRlICJleHlub3NfZHJtX2Rydi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fY3J0Yy5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZW5jb2Rlci5oIgorCisjZGVmaW5lIHRvX2V4eW5vc19lbmNvZGVyKHgpCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZXh5bm9zX2RybV9lbmNvZGVyLFwKKwkJCQlkcm1fZW5jb2RlcikKKworLyoKKyAqIGV4eW5vcyBzcGVjaWZpYyBlbmNvZGVyIHN0cnVjdHVyZS4KKyAqCisgKiBAZHJtX2VuY29kZXI6IGVuY29kZXIgb2JqZWN0LgorICogQG1hbmFnZXI6IHNwZWNpZmljIGVuY29kZXIgaGFzIGl0cyBvd24gbWFuYWdlciB0byBjb250cm9sIGEgaGFyZHdhcmUKKyAqCWFwcHJvcHJpYXRlbHkgYW5kIHdlIGNhbiBhY2Nlc3MgYSBoYXJkd2FyZSBkcmF3aW5nIG9uIHRoaXMgbWFuYWdlci4KKyAqLworc3RydWN0IGV4eW5vc19kcm1fZW5jb2RlciB7CisJc3RydWN0IGRybV9lbmNvZGVyCQlkcm1fZW5jb2RlcjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyCSptYW5hZ2VyOworfTsKKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9lbmNvZGVyX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciA9IGV4eW5vc19kcm1fZ2V0X21hbmFnZXIoZW5jb2Rlcik7CisKKwlEUk1fREVCVUdfS01TKCIlcywgZW5jb2RlciBkcG1zOiAlZFxuIiwgX19GSUxFX18sIG1vZGUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWlmIChjb25uZWN0b3ItPmVuY29kZXIgPT0gZW5jb2RlcikgeworCQkJc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSA9IG1hbmFnZXItPmRpc3BsYXk7CisKKwkJCWlmIChkaXNwbGF5ICYmIGRpc3BsYXktPnBvd2VyX29uKQorCQkJCWRpc3BsYXktPnBvd2VyX29uKG1hbmFnZXItPmRldiwgbW9kZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBib29sCitleHlub3NfZHJtX2VuY29kZXJfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIGRybSBmcmFtZXdvcmsgZG9lc24ndCBjaGVjayBOVUxMLiAqLworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fZW5jb2Rlcl9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyID0gZXh5bm9zX2RybV9nZXRfbWFuYWdlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyX29wcyAqbWFuYWdlcl9vcHMgPSBtYW5hZ2VyLT5vcHM7CisJc3RydWN0IGV4eW5vc19kcm1fb3ZlcmxheV9vcHMgKm92ZXJsYXlfb3BzID0gbWFuYWdlci0+b3ZlcmxheV9vcHM7CisJc3RydWN0IGV4eW5vc19kcm1fb3ZlcmxheSAqb3ZlcmxheSA9IGdldF9leHlub3NfZHJtX292ZXJsYXkoZGV2LAorCQkJCQkJZW5jb2Rlci0+Y3J0Yyk7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJbW9kZSA9IGFkanVzdGVkX21vZGU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJaWYgKGNvbm5lY3Rvci0+ZW5jb2RlciA9PSBlbmNvZGVyKSB7CisJCQlpZiAobWFuYWdlcl9vcHMgJiYgbWFuYWdlcl9vcHMtPm1vZGVfc2V0KQorCQkJCW1hbmFnZXJfb3BzLT5tb2RlX3NldChtYW5hZ2VyLT5kZXYsIG1vZGUpOworCisJCQlpZiAob3ZlcmxheV9vcHMgJiYgb3ZlcmxheV9vcHMtPm1vZGVfc2V0KQorCQkJCW92ZXJsYXlfb3BzLT5tb2RlX3NldChtYW5hZ2VyLT5kZXYsIG92ZXJsYXkpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2VuY29kZXJfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIGRybSBmcmFtZXdvcmsgZG9lc24ndCBjaGVjayBOVUxMLiAqLworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2VuY29kZXJfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyID0gZXh5bm9zX2RybV9nZXRfbWFuYWdlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyX29wcyAqbWFuYWdlcl9vcHMgPSBtYW5hZ2VyLT5vcHM7CisJc3RydWN0IGV4eW5vc19kcm1fb3ZlcmxheV9vcHMgKm92ZXJsYXlfb3BzID0gbWFuYWdlci0+b3ZlcmxheV9vcHM7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKG1hbmFnZXJfb3BzICYmIG1hbmFnZXJfb3BzLT5jb21taXQpCisJCW1hbmFnZXJfb3BzLT5jb21taXQobWFuYWdlci0+ZGV2KTsKKworCWlmIChvdmVybGF5X29wcyAmJiBvdmVybGF5X29wcy0+Y29tbWl0KQorCQlvdmVybGF5X29wcy0+Y29tbWl0KG1hbmFnZXItPmRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2NydGMgKgorZXh5bm9zX2RybV9lbmNvZGVyX2dldF9jcnRjKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlyZXR1cm4gZW5jb2Rlci0+Y3J0YzsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgZXh5bm9zX2VuY29kZXJfaGVscGVyX2Z1bmNzID0geworCS5kcG1zCQk9IGV4eW5vc19kcm1fZW5jb2Rlcl9kcG1zLAorCS5tb2RlX2ZpeHVwCT0gZXh5bm9zX2RybV9lbmNvZGVyX21vZGVfZml4dXAsCisJLm1vZGVfc2V0CT0gZXh5bm9zX2RybV9lbmNvZGVyX21vZGVfc2V0LAorCS5wcmVwYXJlCT0gZXh5bm9zX2RybV9lbmNvZGVyX3ByZXBhcmUsCisJLmNvbW1pdAkJPSBleHlub3NfZHJtX2VuY29kZXJfY29tbWl0LAorCS5nZXRfY3J0Ywk9IGV4eW5vc19kcm1fZW5jb2Rlcl9nZXRfY3J0YywKK307CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9lbmNvZGVyICpleHlub3NfZW5jb2RlciA9CisJCXRvX2V4eW5vc19lbmNvZGVyKGVuY29kZXIpOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWV4eW5vc19lbmNvZGVyLT5tYW5hZ2VyLT5waXBlID0gLTE7CisKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworCWVuY29kZXItPmRldi0+bW9kZV9jb25maWcubnVtX2VuY29kZXItLTsKKwlrZnJlZShleHlub3NfZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgZXh5bm9zX2VuY29kZXJfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBleHlub3NfZHJtX2VuY29kZXJfZGVzdHJveSwKK307CisKK3N0cnVjdCBkcm1fZW5jb2RlciAqCitleHlub3NfZHJtX2VuY29kZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyLAorCQkJICAgdW5zaWduZWQgaW50IHBvc3NpYmxlX2NydGNzKQoreworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9lbmNvZGVyICpleHlub3NfZW5jb2RlcjsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoIW1hbmFnZXIgfHwgIXBvc3NpYmxlX2NydGNzKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghbWFuYWdlci0+ZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCWV4eW5vc19lbmNvZGVyID0ga3phbGxvYyhzaXplb2YoKmV4eW5vc19lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFleHlub3NfZW5jb2RlcikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBlbmNvZGVyXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZXh5bm9zX2VuY29kZXItPm1hbmFnZXIgPSBtYW5hZ2VyOworCWVuY29kZXIgPSAmZXh5bm9zX2VuY29kZXItPmRybV9lbmNvZGVyOworCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gcG9zc2libGVfY3J0Y3M7CisKKwlEUk1fREVCVUdfS01TKCJwb3NzaWJsZV9jcnRjcyA9IDB4JXhcbiIsIGVuY29kZXItPnBvc3NpYmxlX2NydGNzKTsKKworCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmZXh5bm9zX2VuY29kZXJfZnVuY3MsCisJCQlEUk1fTU9ERV9FTkNPREVSX1RNRFMpOworCisJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmZXh5bm9zX2VuY29kZXJfaGVscGVyX2Z1bmNzKTsKKworCURSTV9ERUJVR19LTVMoImVuY29kZXIgaGFzIGJlZW4gY3JlYXRlZFxuIik7CisKKwlyZXR1cm4gZW5jb2RlcjsKK30KKworc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqZXh5bm9zX2RybV9nZXRfbWFuYWdlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJcmV0dXJuIHRvX2V4eW5vc19lbmNvZGVyKGVuY29kZXIpLT5tYW5hZ2VyOworfQorCit2b2lkIGV4eW5vc19kcm1fZm5fZW5jb2RlcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHZvaWQgKmRhdGEsCisJCQkgICAgdm9pZCAoKmZuKShzdHJ1Y3QgZHJtX2VuY29kZXIgKiwgdm9pZCAqKSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCWlmIChlbmNvZGVyLT5jcnRjICE9IGNydGMpCisJCQljb250aW51ZTsKKworCQlmbihlbmNvZGVyLCBkYXRhKTsKKwl9Cit9CisKK3ZvaWQgZXh5bm9zX2RybV9lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyID0KKwkJdG9fZXh5bm9zX2VuY29kZXIoZW5jb2RlciktPm1hbmFnZXI7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcl9vcHMgKm1hbmFnZXJfb3BzID0gbWFuYWdlci0+b3BzOworCWludCBjcnRjID0gKihpbnQgKilkYXRhOworCisJaWYgKG1hbmFnZXItPnBpcGUgPT0gLTEpCisJCW1hbmFnZXItPnBpcGUgPSBjcnRjOworCisJaWYgKG1hbmFnZXJfb3BzLT5lbmFibGVfdmJsYW5rKQorCQltYW5hZ2VyX29wcy0+ZW5hYmxlX3ZibGFuayhtYW5hZ2VyLT5kZXYpOworfQorCit2b2lkIGV4eW5vc19kcm1fZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1hbmFnZXIgPQorCQl0b19leHlub3NfZW5jb2RlcihlbmNvZGVyKS0+bWFuYWdlcjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyX29wcyAqbWFuYWdlcl9vcHMgPSBtYW5hZ2VyLT5vcHM7CisJaW50IGNydGMgPSAqKGludCAqKWRhdGE7CisKKwlpZiAobWFuYWdlci0+cGlwZSA9PSAtMSkKKwkJbWFuYWdlci0+cGlwZSA9IGNydGM7CisKKwlpZiAobWFuYWdlcl9vcHMtPmRpc2FibGVfdmJsYW5rKQorCQltYW5hZ2VyX29wcy0+ZGlzYWJsZV92YmxhbmsobWFuYWdlci0+ZGV2KTsKK30KKwordm9pZCBleHlub3NfZHJtX2VuY29kZXJfY3J0Y19jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1hbmFnZXIgPQorCQl0b19leHlub3NfZW5jb2RlcihlbmNvZGVyKS0+bWFuYWdlcjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5X29wcyAqb3ZlcmxheV9vcHMgPSBtYW5hZ2VyLT5vdmVybGF5X29wczsKKworCW92ZXJsYXlfb3BzLT5jb21taXQobWFuYWdlci0+ZGV2KTsKK30KKwordm9pZCBleHlub3NfZHJtX2VuY29kZXJfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciA9CisJCXRvX2V4eW5vc19lbmNvZGVyKGVuY29kZXIpLT5tYW5hZ2VyOworCXN0cnVjdCBleHlub3NfZHJtX292ZXJsYXlfb3BzICpvdmVybGF5X29wcyA9IG1hbmFnZXItPm92ZXJsYXlfb3BzOworCXN0cnVjdCBleHlub3NfZHJtX292ZXJsYXkgKm92ZXJsYXkgPSBkYXRhOworCisJb3ZlcmxheV9vcHMtPm1vZGVfc2V0KG1hbmFnZXItPmRldiwgb3ZlcmxheSk7Cit9CisKK01PRFVMRV9BVVRIT1IoIklua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU29DIERSTSBFbmNvZGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2VuY29kZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9lbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjZDY0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9lbmNvZGVyLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yczoKKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRVhZTk9TX0RSTV9FTkNPREVSX0hfCisjZGVmaW5lIF9FWFlOT1NfRFJNX0VOQ09ERVJfSF8KKworc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcjsKKworc3RydWN0IGRybV9lbmNvZGVyICpleHlub3NfZHJtX2VuY29kZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptZ3IsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcG9zc2libGVfY3J0Y3MpOworc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqCitleHlub3NfZHJtX2dldF9tYW5hZ2VyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7Cit2b2lkIGV4eW5vc19kcm1fZm5fZW5jb2RlcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHZvaWQgKmRhdGEsCisJCQkgICAgdm9pZCAoKmZuKShzdHJ1Y3QgZHJtX2VuY29kZXIgKiwgdm9pZCAqKSk7Cit2b2lkIGV4eW5vc19kcm1fZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHZvaWQgKmRhdGEpOwordm9pZCBleHlub3NfZHJtX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgdm9pZCAqZGF0YSk7Cit2b2lkIGV4eW5vc19kcm1fZW5jb2Rlcl9jcnRjX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHZvaWQgKmRhdGEpOwordm9pZCBleHlub3NfZHJtX2VuY29kZXJfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHZvaWQgKmRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkMjljZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jCkBAIC0wLDAgKzEsMjY1IEBACisvKiBleHlub3NfZHJtX2ZiLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGMuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworI2luY2x1ZGUgImV4eW5vc19kcm1fZmIuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2J1Zi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZ2VtLmgiCisKKyNkZWZpbmUgdG9fZXh5bm9zX2ZiKHgpCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZXh5bm9zX2RybV9mYiwgZmIpCisKKy8qCisgKiBleHlub3Mgc3BlY2lmaWMgZnJhbWVidWZmZXIgc3RydWN0dXJlLgorICoKKyAqIEBmYjogZHJtIGZyYW1lYnVmZmVyIG9iZWpjdC4KKyAqIEBleHlub3NfZ2VtX29iajogZXh5bm9zIHNwZWNpZmljIGdlbSBvYmplY3QgY29udGFpbmluZyBhIGdlbSBvYmplY3QuCisgKiBAZW50cnk6IHBvaW50ZXIgdG8gZXh5bm9zIGRybSBidWZmZXIgZW50cnkgb2JqZWN0LgorICoJLSBjb250YWluaW5nIG9ubHkgdGhlIGluZm9ybWF0aW9uIHRvIHBoeXNpY2FsbHkgY29udGludW91cyBtZW1vcnkKKyAqCXJlZ2lvbiBhbGxvY2F0ZWQgYXQgZGVmYXVsdCBmcmFtZWJ1ZmZlciBjcmVhdGlvbi4KKyAqLworc3RydWN0IGV4eW5vc19kcm1fZmIgeworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIJCWZiOworCXN0cnVjdCBleHlub3NfZHJtX2dlbV9vYmoJKmV4eW5vc19nZW1fb2JqOworCXN0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeQkqZW50cnk7Cit9OworCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2ZiX2Rlc3Ryb3koc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZmIgKmV4eW5vc19mYiA9IHRvX2V4eW5vc19mYihmYik7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJZHJtX2ZyYW1lYnVmZmVyX2NsZWFudXAoZmIpOworCisJLyoKKwkgKiBkZWZhdWx0IGZyYW1lYnVmZmVyIGhhcyBubyBnZW0gb2JqZWN0IHNvCisJICogYSBidWZmZXIgb2YgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgc2hvdWxkIGJlIHJlbGVhc2VkIGF0IGhlcmUuCisJICovCisJaWYgKCFleHlub3NfZmItPmV4eW5vc19nZW1fb2JqICYmIGV4eW5vc19mYi0+ZW50cnkpCisJCWV4eW5vc19kcm1fYnVmX2Rlc3Ryb3koZmItPmRldiwgZXh5bm9zX2ZiLT5lbnRyeSk7CisKKwlrZnJlZShleHlub3NfZmIpOworCWV4eW5vc19mYiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9mYl9jcmVhdGVfaGFuZGxlKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkJdW5zaWduZWQgaW50ICpoYW5kbGUpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZmIgKmV4eW5vc19mYiA9IHRvX2V4eW5vc19mYihmYik7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJcmV0dXJuIGRybV9nZW1faGFuZGxlX2NyZWF0ZShmaWxlX3ByaXYsCisJCQkmZXh5bm9zX2ZiLT5leHlub3NfZ2VtX29iai0+YmFzZSwgaGFuZGxlKTsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX2ZiX2RpcnR5KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCB1bnNpZ25lZCBmbGFncywKKwkJCQl1bnNpZ25lZCBjb2xvciwgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXBzLAorCQkJCXVuc2lnbmVkIG51bV9jbGlwcykKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyogVE9ETyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzIGV4eW5vc19kcm1fZmJfZnVuY3MgPSB7CisJLmRlc3Ryb3kJPSBleHlub3NfZHJtX2ZiX2Rlc3Ryb3ksCisJLmNyZWF0ZV9oYW5kbGUJPSBleHlub3NfZHJtX2ZiX2NyZWF0ZV9oYW5kbGUsCisJLmRpcnR5CQk9IGV4eW5vc19kcm1fZmJfZGlydHksCit9OworCitzdGF0aWMgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqCitleHlub3NfZHJtX2ZiX2luaXQoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICptb2RlX2NtZCkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9mYiAqZXh5bm9zX2ZiOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCXN0cnVjdCBleHlub3NfZHJtX2dlbV9vYmogKmV4eW5vc19nZW1fb2JqID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgcmV0OworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCW1vZGVfY21kLT5waXRjaCA9IG1heChtb2RlX2NtZC0+cGl0Y2gsCisJCQltb2RlX2NtZC0+d2lkdGggKiAobW9kZV9jbWQtPmJwcCA+PiAzKSk7CisKKwlEUk1fTE9HX0tNUygiZHJtIGZiIGNyZWF0ZSglZHglZClcbiIsCisJCQltb2RlX2NtZC0+d2lkdGgsIG1vZGVfY21kLT5oZWlnaHQpOworCisJZXh5bm9zX2ZiID0ga3phbGxvYyhzaXplb2YoKmV4eW5vc19mYiksIEdGUF9LRVJORUwpOworCWlmICghZXh5bm9zX2ZiKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGV4eW5vcyBkcm0gZnJhbWVidWZmZXIuXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJZmIgPSAmZXh5bm9zX2ZiLT5mYjsKKwlyZXQgPSBkcm1fZnJhbWVidWZmZXJfaW5pdChkZXYsIGZiLCAmZXh5bm9zX2RybV9mYl9mdW5jcyk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0aWFsaXplIGZyYW1lYnVmZmVyLlxuIik7CisJCWdvdG8gZXJyX2luaXQ7CisJfQorCisJRFJNX0xPR19LTVMoImNyZWF0ZTogZmIgaWQ6ICVkXG4iLCBmYi0+YmFzZS5pZCk7CisKKwlzaXplID0gbW9kZV9jbWQtPnBpdGNoICogbW9kZV9jbWQtPmhlaWdodDsKKworCS8qCisJICogbW9kZV9jbWQtPmhhbmRsZSBjb3VsZCBiZSBOVUxMIGF0IGJvb3RpbmcgdGltZSBvcgorCSAqIHdpdGggdXNlciByZXF1ZXN0LiBpZiBOVUxMLCBhIG5ldyBidWZmZXIgb3IgYSBnZW0gb2JqZWN0CisJICogd291bGQgYmUgYWxsb2NhdGVkLgorCSAqLworCWlmICghbW9kZV9jbWQtPmhhbmRsZSkgeworCQlpZiAoIWZpbGVfcHJpdikgeworCQkJc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICplbnRyeTsKKworCQkJLyoKKwkJCSAqIGluIGNhc2UgdGhhdCBmaWxlX3ByaXYgaXMgTlVMTCwgaXQgYWxsb2NhdGVzCisJCQkgKiBvbmx5IGJ1ZmZlciBhbmQgdGhpcyBidWZmZXIgd291bGQgYmUgdXNlZAorCQkJICogZm9yIGRlZmF1bHQgZnJhbWVidWZmZXIuCisJCQkgKi8KKwkJCWVudHJ5ID0gZXh5bm9zX2RybV9idWZfY3JlYXRlKGRldiwgc2l6ZSk7CisJCQlpZiAoSVNfRVJSKGVudHJ5KSkgeworCQkJCXJldCA9IFBUUl9FUlIoZW50cnkpOworCQkJCWdvdG8gZXJyX2J1ZmZlcjsKKwkJCX0KKworCQkJZXh5bm9zX2ZiLT5lbnRyeSA9IGVudHJ5OworCisJCQlEUk1fTE9HX0tNUygiZGVmYXVsdCBmYjogcGFkZHIgPSAweCVseCwgc2l6ZSA9IDB4JXhcbiIsCisJCQkJCSh1bnNpZ25lZCBsb25nKWVudHJ5LT5wYWRkciwgc2l6ZSk7CisKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJZXh5bm9zX2dlbV9vYmogPSBleHlub3NfZHJtX2dlbV9jcmVhdGUoZmlsZV9wcml2LCBkZXYsCisJCQkJCQkJc2l6ZSwKKwkJCQkJCQkmbW9kZV9jbWQtPmhhbmRsZSk7CisJCQlpZiAoSVNfRVJSKGV4eW5vc19nZW1fb2JqKSkgeworCQkJCXJldCA9IFBUUl9FUlIoZXh5bm9zX2dlbV9vYmopOworCQkJCWdvdG8gZXJyX2J1ZmZlcjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgbW9kZV9jbWQtPmhhbmRsZSk7CisJCWlmICghb2JqKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBsb29rdXAgZ2VtIG9iamVjdC5cbiIpOworCQkJZ290byBlcnJfYnVmZmVyOworCQl9CisKKwkJZXh5bm9zX2dlbV9vYmogPSB0b19leHlub3NfZ2VtX29iaihvYmopOworCisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKG9iaik7CisJfQorCisJLyoKKwkgKiBpZiBnb3QgYSBleHlub3NfZ2VtX29iaiBmcm9tIGVpdGhlciBhIGhhbmRsZSBvcgorCSAqIGEgbmV3IGNyZWF0aW9uIHRoZW4gZXh5bm9zX2ZiLT5leHlub3NfZ2VtX29iaiBpcyBOVUxMCisJICogc28gdGhhdCBkZWZhdWx0IGZyYW1lYnVmZmVyIGhhcyBubyBpdHMgb3duIGdlbSBvYmplY3QsCisJICogb25seSBpdHMgb3duIGJ1ZmZlciBvYmplY3QuCisJICovCisJZXh5bm9zX2ZiLT5lbnRyeSA9IGV4eW5vc19nZW1fb2JqLT5lbnRyeTsKKworCURSTV9MT0dfS01TKCJwYWRkciA9IDB4JWx4LCBzaXplID0gMHgleCwgZ2VtIG9iamVjdCA9IDB4JXhcbiIsCisJCQkodW5zaWduZWQgbG9uZylleHlub3NfZmItPmVudHJ5LT5wYWRkciwgc2l6ZSwKKwkJCSh1bnNpZ25lZCBpbnQpJmV4eW5vc19nZW1fb2JqLT5iYXNlKTsKKworb3V0OgorCWV4eW5vc19mYi0+ZXh5bm9zX2dlbV9vYmogPSBleHlub3NfZ2VtX29iajsKKworCWRybV9oZWxwZXJfbW9kZV9maWxsX2ZiX3N0cnVjdChmYiwgbW9kZV9jbWQpOworCisJcmV0dXJuIGZiOworCitlcnJfYnVmZmVyOgorCWRybV9mcmFtZWJ1ZmZlcl9jbGVhbnVwKGZiKTsKKworZXJyX2luaXQ6CisJa2ZyZWUoZXh5bm9zX2ZiKTsKKworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK3N0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmV4eW5vc19kcm1fZmJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJCQkgICAgICBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICptb2RlX2NtZCkKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJcmV0dXJuIGV4eW5vc19kcm1fZmJfaW5pdChmaWxlX3ByaXYsIGRldiwgbW9kZV9jbWQpOworfQorCitzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgKmV4eW5vc19kcm1fZmJfZ2V0X2J1ZihzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9mYiAqZXh5bm9zX2ZiID0gdG9fZXh5bm9zX2ZiKGZiKTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgKmVudHJ5OworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWVudHJ5ID0gZXh5bm9zX2ZiLT5lbnRyeTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCURSTV9ERUJVR19LTVMoInZhZGRyID0gMHglbHgsIHBhZGRyID0gMHglbHhcbiIsCisJCQkodW5zaWduZWQgbG9uZyllbnRyeS0+dmFkZHIsCisJCQkodW5zaWduZWQgbG9uZyllbnRyeS0+cGFkZHIpOworCisJcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5jcyBleHlub3NfZHJtX21vZGVfY29uZmlnX2Z1bmNzID0geworCS5mYl9jcmVhdGUgPSBleHlub3NfZHJtX2ZiX2NyZWF0ZSwKK307CisKK3ZvaWQgZXh5bm9zX2RybV9tb2RlX2NvbmZpZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZGV2LT5tb2RlX2NvbmZpZy5taW5fd2lkdGggPSAwOworCWRldi0+bW9kZV9jb25maWcubWluX2hlaWdodCA9IDA7CisKKwkvKgorCSAqIHNldCBtYXggd2lkdGggYW5kIGhlaWdodCBhcyBkZWZhdWx0IHZhbHVlKDQwOTZ4NDA5NikuCisJICogdGhpcyB2YWx1ZSB3b3VsZCBiZSB1c2VkIHRvIGNoZWNrIGZyYW1lYnVmZmVyIHNpemUgbGltaXRhdGlvbgorCSAqIGF0IGRybV9tb2RlX2FkZGZiKCkuCisJICovCisJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA0MDk2OworCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDQwOTY7CisKKwlkZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gJmV4eW5vc19kcm1fbW9kZV9jb25maWdfZnVuY3M7Cit9CisKK01PRFVMRV9BVVRIT1IoIklua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU29DIERSTSBGQiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzNTkzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0VYWU5PU19EUk1fRkJfSF8KKyNkZWZpbmUgX0VYWU5PU19EUk1fRkJfSAorCitzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpleHlub3NfZHJtX2ZiX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHAsCisJCQkJCSAgICAgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKm1vZGVfY21kKTsKKwordm9pZCBleHlub3NfZHJtX21vZGVfY29uZmlnX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiZGV2LmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmJkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjRiM2QxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiZGV2LmMKQEAgLTAsMCArMSw0NTYgQEAKKy8qIGV4eW5vc19kcm1fZmJkZXYuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yczoKKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Yy5oIgorI2luY2x1ZGUgImRybV9mYl9oZWxwZXIuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworI2luY2x1ZGUgImV4eW5vc19kcm1fZHJ2LmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9mYi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fYnVmLmgiCisKKyNkZWZpbmUgTUFYX0NPTk5FQ1RPUgkJNAorI2RlZmluZSBQUkVGRVJSRURfQlBQCQkzMgorCisjZGVmaW5lIHRvX2V4eW5vc19mYmRldih4KQljb250YWluZXJfb2YoeCwgc3RydWN0IGV4eW5vc19kcm1fZmJkZXYsXAorCQkJCWRybV9mYl9oZWxwZXIpCisKK3N0cnVjdCBleHlub3NfZHJtX2ZiZGV2IHsKKwlzdHJ1Y3QgZHJtX2ZiX2hlbHBlcglkcm1fZmJfaGVscGVyOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIJKmZiOworfTsKKworc3RhdGljIGludCBleHlub3NfZHJtX2ZiZGV2X3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOworCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAzMjoKKwljYXNlIDI0OgorCWNhc2UgMTg6CisJY2FzZSAxNjoKKwljYXNlIDEyOgorCQlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX01PTk8wMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjsKKwkJYnJlYWs7CisJfQorCisJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbCkgLyA4OworCisJcmV0dXJuIGRybV9mYl9oZWxwZXJfc2V0X3BhcihpbmZvKTsKK30KKworCitzdGF0aWMgc3RydWN0IGZiX29wcyBleHlub3NfZHJtX2ZiX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfY2hlY2tfdmFyCT0gZHJtX2ZiX2hlbHBlcl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBleHlub3NfZHJtX2ZiZGV2X3NldF9wYXIsCisJLmZiX2JsYW5rCT0gZHJtX2ZiX2hlbHBlcl9ibGFuaywKKwkuZmJfcGFuX2Rpc3BsYXkJPSBkcm1fZmJfaGVscGVyX3Bhbl9kaXNwbGF5LAorCS5mYl9zZXRjbWFwCT0gZHJtX2ZiX2hlbHBlcl9zZXRjbWFwLAorfTsKKworc3RhdGljIGludCBleHlub3NfZHJtX2ZiZGV2X3VwZGF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAorCQkJCSAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZmJfd2lkdGgsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZmJfaGVpZ2h0KQoreworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBoZWxwZXItPmZiZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBoZWxwZXItPmRldjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9mYmRldiAqZXh5bm9zX2ZiID0gdG9fZXh5bm9zX2ZiZGV2KGhlbHBlcik7CisJc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICplbnRyeTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGZiX3dpZHRoICogZmJfaGVpZ2h0ICogKGZiLT5iaXRzX3Blcl9waXhlbCA+PiAzKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlleHlub3NfZmItPmZiID0gZmI7CisKKwlkcm1fZmJfaGVscGVyX2ZpbGxfZml4KGZiaSwgZmItPnBpdGNoLCBmYi0+ZGVwdGgpOworCWRybV9mYl9oZWxwZXJfZmlsbF92YXIoZmJpLCBoZWxwZXIsIGZiX3dpZHRoLCBmYl9oZWlnaHQpOworCisJZW50cnkgPSBleHlub3NfZHJtX2ZiX2dldF9idWYoZmIpOworCWlmICghZW50cnkpIHsKKwkJRFJNX0xPR19LTVMoImVudHJ5IGlzIG51bGwuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJb2Zmc2V0ID0gZmJpLT52YXIueG9mZnNldCAqIChmYi0+Yml0c19wZXJfcGl4ZWwgPj4gMyk7CisJb2Zmc2V0ICs9IGZiaS0+dmFyLnlvZmZzZXQgKiBmYi0+cGl0Y2g7CisKKwlkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgPSBlbnRyeS0+cGFkZHI7CisJZmJpLT5zY3JlZW5fYmFzZSA9IGVudHJ5LT52YWRkciArIG9mZnNldDsKKwlmYmktPmZpeC5zbWVtX3N0YXJ0ID0gZW50cnktPnBhZGRyICsgb2Zmc2V0OworCWZiaS0+c2NyZWVuX3NpemUgPSBzaXplOworCWZiaS0+Zml4LnNtZW1fbGVuID0gc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4eW5vc19kcm1fZmJkZXZfY3JlYXRlKHN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXIsCisJCQkJICAgIHN0cnVjdCBkcm1fZmJfaGVscGVyX3N1cmZhY2Vfc2l6ZSAqc2l6ZXMpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZmJkZXYgKmV4eW5vc19mYmRldiA9IHRvX2V4eW5vc19mYmRldihoZWxwZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBoZWxwZXItPmRldjsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJpOworCXN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgbW9kZV9jbWQgPSB7IDAgfTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2LT5wbGF0Zm9ybWRldjsKKwlpbnQgcmV0OworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCURSTV9ERUJVR19LTVMoInN1cmZhY2Ugd2lkdGgoJWQpLCBoZWlnaHQoJWQpIGFuZCBicHAoJWRcbiIsCisJCQlzaXplcy0+c3VyZmFjZV93aWR0aCwgc2l6ZXMtPnN1cmZhY2VfaGVpZ2h0LAorCQkJc2l6ZXMtPnN1cmZhY2VfYnBwKTsKKworCW1vZGVfY21kLndpZHRoID0gc2l6ZXMtPnN1cmZhY2Vfd2lkdGg7CisJbW9kZV9jbWQuaGVpZ2h0ID0gc2l6ZXMtPnN1cmZhY2VfaGVpZ2h0OworCW1vZGVfY21kLmJwcCA9IHNpemVzLT5zdXJmYWNlX2JwcDsKKwltb2RlX2NtZC5kZXB0aCA9IHNpemVzLT5zdXJmYWNlX2RlcHRoOworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJZmJpID0gZnJhbWVidWZmZXJfYWxsb2MoMCwgJnBkZXYtPmRldik7CisJaWYgKCFmYmkpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgZmIgaW5mby5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlleHlub3NfZmJkZXYtPmZiID0gZXh5bm9zX2RybV9mYl9jcmVhdGUoZGV2LCBOVUxMLCAmbW9kZV9jbWQpOworCWlmIChJU19FUlJfT1JfTlVMTChleHlub3NfZmJkZXYtPmZiKSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBjcmVhdGUgZHJtIGZyYW1lYnVmZmVyLlxuIik7CisJCXJldCA9IFBUUl9FUlIoZXh5bm9zX2ZiZGV2LT5mYik7CisJCWdvdG8gb3V0OworCX0KKworCWhlbHBlci0+ZmIgPSBleHlub3NfZmJkZXYtPmZiOworCWhlbHBlci0+ZmJkZXYgPSBmYmk7CisKKwlmYmktPnBhciA9IGhlbHBlcjsKKwlmYmktPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKKwlmYmktPmZib3BzID0gJmV4eW5vc19kcm1fZmJfb3BzOworCisJcmV0ID0gZmJfYWxsb2NfY21hcCgmZmJpLT5jbWFwLCAyNTYsIDApOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgY21hcC5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBleHlub3NfZHJtX2ZiZGV2X3VwZGF0ZShoZWxwZXIsIGhlbHBlci0+ZmIsIHNpemVzLT5mYl93aWR0aCwKKwkJCXNpemVzLT5mYl9oZWlnaHQpOworCWlmIChyZXQgPCAwKQorCQlmYl9kZWFsbG9jX2NtYXAoJmZiaS0+Y21hcCk7CisKKy8qCisgKiBpZiBmYWlsZWQsIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGFib3ZlIHdvdWxkIGJlIHJlbGVhc2VkIGJ5CisgKiBkcm1fbW9kZV9jb25maWdfY2xlYW51cCgpIHdoZW4gZHJtX2xvYWQoKSBoYWQgYmVlbiBjYWxsZWQgcHJpb3IKKyAqIHRvIGFueSBzcGVjaWZpYyBkcml2ZXIgc3VjaCBhcyBmaW1kIG9yIGhkbWkgZHJpdmVyLgorICovCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wKK2V4eW5vc19kcm1fZmJkZXZfaXNfc2FtZWZiKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJICAgIHN0cnVjdCBkcm1fZmJfaGVscGVyX3N1cmZhY2Vfc2l6ZSAqc2l6ZXMpCit7CisJaWYgKGZiLT53aWR0aCAhPSBzaXplcy0+c3VyZmFjZV93aWR0aCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChmYi0+aGVpZ2h0ICE9IHNpemVzLT5zdXJmYWNlX2hlaWdodCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChmYi0+Yml0c19wZXJfcGl4ZWwgIT0gc2l6ZXMtPnN1cmZhY2VfYnBwKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGZiLT5kZXB0aCAhPSBzaXplcy0+c3VyZmFjZV9kZXB0aCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9mYmRldl9yZWNyZWF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZmJfaGVscGVyX3N1cmZhY2Vfc2l6ZSAqc2l6ZXMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGhlbHBlci0+ZGV2OworCXN0cnVjdCBleHlub3NfZHJtX2ZiZGV2ICpleHlub3NfZmJkZXYgPSB0b19leHlub3NfZmJkZXYoaGVscGVyKTsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGV4eW5vc19mYmRldi0+ZmI7CisJc3RydWN0IGRybV9tb2RlX2ZiX2NtZCBtb2RlX2NtZCA9IHsgMCB9OworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmIChoZWxwZXItPmZiICE9IGZiKSB7CisJCURSTV9FUlJPUigiZHJtIGZyYW1lYnVmZmVyIGlzIGRpZmZlcmVudFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChleHlub3NfZHJtX2ZiZGV2X2lzX3NhbWVmYihmYiwgc2l6ZXMpKQorCQlyZXR1cm4gMDsKKworCW1vZGVfY21kLndpZHRoID0gc2l6ZXMtPnN1cmZhY2Vfd2lkdGg7CisJbW9kZV9jbWQuaGVpZ2h0ID0gc2l6ZXMtPnN1cmZhY2VfaGVpZ2h0OworCW1vZGVfY21kLmJwcCA9IHNpemVzLT5zdXJmYWNlX2JwcDsKKwltb2RlX2NtZC5kZXB0aCA9IHNpemVzLT5zdXJmYWNlX2RlcHRoOworCisJaWYgKGZiLT5mdW5jcy0+ZGVzdHJveSkKKwkJZmItPmZ1bmNzLT5kZXN0cm95KGZiKTsKKworCWV4eW5vc19mYmRldi0+ZmIgPSBleHlub3NfZHJtX2ZiX2NyZWF0ZShkZXYsIE5VTEwsICZtb2RlX2NtZCk7CisJaWYgKElTX0VSUihleHlub3NfZmJkZXYtPmZiKSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBmYi5cbiIpOworCQlyZXR1cm4gUFRSX0VSUihleHlub3NfZmJkZXYtPmZiKTsKKwl9CisKKwloZWxwZXItPmZiID0gZXh5bm9zX2ZiZGV2LT5mYjsKKwlyZXR1cm4gZXh5bm9zX2RybV9mYmRldl91cGRhdGUoaGVscGVyLCBoZWxwZXItPmZiLCBzaXplcy0+ZmJfd2lkdGgsCisJCQlzaXplcy0+ZmJfaGVpZ2h0KTsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX2ZiZGV2X3Byb2JlKHN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXIsCisJCQkJICAgc3RydWN0IGRybV9mYl9oZWxwZXJfc3VyZmFjZV9zaXplICpzaXplcykKK3sKKwlpbnQgcmV0ID0gMDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoIWhlbHBlci0+ZmIpIHsKKwkJcmV0ID0gZXh5bm9zX2RybV9mYmRldl9jcmVhdGUoaGVscGVyLCBzaXplcyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBjcmVhdGUgZmJkZXYuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKgorCQkgKiBmYl9oZWxwZXIgZXhwZWN0cyBhIHZhbHVlIG1vcmUgdGhhbiAxIGlmIHN1Y2NlZWQKKwkJICogYmVjYXVzZSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcigpIHNob3VsZCBiZSBjYWxsZWQuCisJCSAqLworCQlyZXQgPSAxOworCX0gZWxzZSB7CisJCXJldCA9IGV4eW5vc19kcm1fZmJkZXZfcmVjcmVhdGUoaGVscGVyLCBzaXplcyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byByZWNvbmZpZ3VyZSBmYmRldlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZmJfaGVscGVyX2Z1bmNzIGV4eW5vc19kcm1fZmJfaGVscGVyX2Z1bmNzID0geworCS5mYl9wcm9iZSA9CWV4eW5vc19kcm1fZmJkZXZfcHJvYmUsCit9OworCitpbnQgZXh5bm9zX2RybV9mYmRldl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZmJkZXYgKmZiZGV2OworCXN0cnVjdCBleHlub3NfZHJtX3ByaXZhdGUgKnByaXZhdGUgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXI7CisJdW5zaWduZWQgaW50IG51bV9jcnRjOworCWludCByZXQ7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCFkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjIHx8ICFkZXYtPm1vZGVfY29uZmlnLm51bV9jb25uZWN0b3IpCisJCXJldHVybiAwOworCisJZmJkZXYgPSBremFsbG9jKHNpemVvZigqZmJkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZiZGV2KSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGRybSBmYmRldi5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcml2YXRlLT5mYl9oZWxwZXIgPSBoZWxwZXIgPSAmZmJkZXYtPmRybV9mYl9oZWxwZXI7CisJaGVscGVyLT5mdW5jcyA9ICZleHlub3NfZHJtX2ZiX2hlbHBlcl9mdW5jczsKKworCW51bV9jcnRjID0gZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YzsKKworCXJldCA9IGRybV9mYl9oZWxwZXJfaW5pdChkZXYsIGhlbHBlciwgbnVtX2NydGMsIE1BWF9DT05ORUNUT1IpOworCWlmIChyZXQgPCAwKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGluaXRpYWxpemUgZHJtIGZiIGhlbHBlci5cbiIpOworCQlnb3RvIGVycl9pbml0OworCX0KKworCXJldCA9IGRybV9mYl9oZWxwZXJfc2luZ2xlX2FkZF9hbGxfY29ubmVjdG9ycyhoZWxwZXIpOworCWlmIChyZXQgPCAwKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlZ2lzdGVyIGRybV9mYl9oZWxwZXJfY29ubmVjdG9yLlxuIik7CisJCWdvdG8gZXJyX3NldHVwOworCisJfQorCisJcmV0ID0gZHJtX2ZiX2hlbHBlcl9pbml0aWFsX2NvbmZpZyhoZWxwZXIsIFBSRUZFUlJFRF9CUFApOworCWlmIChyZXQgPCAwKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBodyBjb25maWd1cmF0aW9uLlxuIik7CisJCWdvdG8gZXJyX3NldHVwOworCX0KKworCXJldHVybiAwOworCitlcnJfc2V0dXA6CisJZHJtX2ZiX2hlbHBlcl9maW5pKGhlbHBlcik7CisKK2Vycl9pbml0OgorCXByaXZhdGUtPmZiX2hlbHBlciA9IE5VTEw7CisJa2ZyZWUoZmJkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9mYmRldl9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcikKK3sKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKKworCS8qIHJlbGVhc2UgZHJtIGZyYW1lYnVmZmVyIGFuZCByZWFsIGJ1ZmZlciAqLworCWlmIChmYl9oZWxwZXItPmZiICYmIGZiX2hlbHBlci0+ZmItPmZ1bmNzKSB7CisJCWZiID0gZmJfaGVscGVyLT5mYjsKKwkJaWYgKGZiICYmIGZiLT5mdW5jcy0+ZGVzdHJveSkKKwkJCWZiLT5mdW5jcy0+ZGVzdHJveShmYik7CisJfQorCisJLyogcmVsZWFzZSBsaW51eCBmcmFtZWJ1ZmZlciAqLworCWlmIChmYl9oZWxwZXItPmZiZGV2KSB7CisJCXN0cnVjdCBmYl9pbmZvICppbmZvOworCQlpbnQgcmV0OworCisJCWluZm8gPSBmYl9oZWxwZXItPmZiZGV2OworCQlyZXQgPSB1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCQlpZiAocmV0IDwgMCkKKwkJCURSTV9ERUJVR19LTVMoImZhaWxlZCB1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKClcbiIpOworCisJCWlmIChpbmZvLT5jbWFwLmxlbikKKwkJCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwl9CisKKwlkcm1fZmJfaGVscGVyX2ZpbmkoZmJfaGVscGVyKTsKK30KKwordm9pZCBleHlub3NfZHJtX2ZiZGV2X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9mYmRldiAqZmJkZXY7CisKKwlpZiAoIXByaXZhdGUgfHwgIXByaXZhdGUtPmZiX2hlbHBlcikKKwkJcmV0dXJuOworCisJZmJkZXYgPSB0b19leHlub3NfZmJkZXYocHJpdmF0ZS0+ZmJfaGVscGVyKTsKKworCWV4eW5vc19kcm1fZmJkZXZfZGVzdHJveShkZXYsIHByaXZhdGUtPmZiX2hlbHBlcik7CisJa2ZyZWUoZmJkZXYpOworCXByaXZhdGUtPmZiX2hlbHBlciA9IE5VTEw7Cit9CisKK3ZvaWQgZXh5bm9zX2RybV9mYmRldl9yZXN0b3JlX21vZGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmICghcHJpdmF0ZSB8fCAhcHJpdmF0ZS0+ZmJfaGVscGVyKQorCQlyZXR1cm47CisKKwlkcm1fZmJfaGVscGVyX3Jlc3RvcmVfZmJkZXZfbW9kZShwcml2YXRlLT5mYl9oZWxwZXIpOworfQorCitpbnQgZXh5bm9zX2RybV9mYmRldl9yZWluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyOworCWludCByZXQ7CisKKwlpZiAoIXByaXZhdGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBpZiBhbGwgc3ViIGRyaXZlcnMgd2VyZSB1bmxvYWRlZCB0aGVuIG51bV9jb25uZWN0b3IgaXMgMAorCSAqIHNvIGF0IHRoaXMgdGltZSwgdGhlIGZyYW1lYnVmZmVycyBhbHNvIHNob3VsZCBiZSBkZXN0cm95ZWQuCisJICovCisJaWYgKCFkZXYtPm1vZGVfY29uZmlnLm51bV9jb25uZWN0b3IpIHsKKwkJZXh5bm9zX2RybV9mYmRldl9maW5pKGRldik7CisJCXJldHVybiAwOworCX0KKworCWZiX2hlbHBlciA9IHByaXZhdGUtPmZiX2hlbHBlcjsKKworCWlmIChmYl9oZWxwZXIpIHsKKwkJZHJtX2ZiX2hlbHBlcl9maW5pKGZiX2hlbHBlcik7CisKKwkJcmV0ID0gZHJtX2ZiX2hlbHBlcl9pbml0KGRldiwgZmJfaGVscGVyLAorCQkJCWRldi0+bW9kZV9jb25maWcubnVtX2NydGMsIE1BWF9DT05ORUNUT1IpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBkcm0gZmIgaGVscGVyXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBkcm1fZmJfaGVscGVyX3NpbmdsZV9hZGRfYWxsX2Nvbm5lY3RvcnMoZmJfaGVscGVyKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFkZCBmYiBoZWxwZXIgdG8gY29ubmVjdG9yc1xuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXJldCA9IGRybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcoZmJfaGVscGVyLCBQUkVGRVJSRURfQlBQKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBodyBjb25maWd1cmF0aW9uLlxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIGlmIGRybV9sb2FkKCkgZmFpbGVkIHdoZW0gZHJtIGxvYWQoKSB3YXMgY2FsbGVkIHByaW9yCisJCSAqIHRvIHNwZWNpZmljIGRyaXZlcnMsIGZiX2hlbHBlciBtdXN0IGJlIE5VTEwgYW5kIHNvCisJCSAqIHRoaXMgZnVjdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFnYWluIHRvIHJlLWluaXRpYWxpemUgYW5kCisJCSAqIHJlLWNvbmZpZ3VyZSB0aGUgZmIgaGVscGVyLiBpdCBtZWFucyB0aGF0IHRoaXMgZnVuY3Rpb24KKwkJICogaGFzIGJlZW4gY2FsbGVkIGJ5IHRoZSBzcGVjaWZpYyBkcml2ZXJzLgorCQkgKi8KKwkJcmV0ID0gZXh5bm9zX2RybV9mYmRldl9pbml0KGRldik7CisJfQorCisJcmV0dXJuIHJldDsKKworZXJyOgorCS8qCisJICogaWYgZHJtX2xvYWQoKSBmYWlsZWQgd2hlbiBkcm0gbG9hZCgpIHdhcyBjYWxsZWQgcHJpb3IKKwkgKiB0byBzcGVjaWZpYyBkcml2ZXJzLCB0aGUgZmJfaGVscGVyIG11c3QgYmUgTlVMTCBhbmQgc28gY2hlY2sgaXQuCisJICovCisJaWYgKGZiX2hlbHBlcikKKwkJZHJtX2ZiX2hlbHBlcl9maW5pKGZiX2hlbHBlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFNvQyBEUk0gRkJERVYgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmJkZXYuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYmRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZmNlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmJkZXYuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogQXV0aG9yczoKKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRVhZTk9TX0RSTV9GQkRFVl9IXworI2RlZmluZSBfRVhZTk9TX0RSTV9GQkRFVl9IXworCitpbnQgZXh5bm9zX2RybV9mYmRldl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IGV4eW5vc19kcm1fZmJkZXZfcmVpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordm9pZCBleHlub3NfZHJtX2ZiZGV2X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGV4eW5vc19kcm1fZmJkZXZfcmVzdG9yZV9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9maW1kLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTljODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltZC5jCkBAIC0wLDAgKzEsODExIEBACisvKiBleHlub3NfZHJtX2ZpbWQuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAorICogQXV0aG9yczoKKyAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgImRybVAuaCIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8ZHJtL2V4eW5vc19kcm0uaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtZmItdjQuaD4KKworI2luY2x1ZGUgImV4eW5vc19kcm1fZHJ2LmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9mYmRldi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fY3J0Yy5oIgorCisvKgorICogRklNRCBpcyBzdGFuZCBmb3IgRnVsbHkgSW50ZXJhY3RpdmUgTW9iaWxlIERpc3BsYXkgYW5kCisgKiBhcyBhIGRpc3BsYXkgY29udHJvbGxlciwgaXQgdHJhbnNmZXJzIGNvbnRlbnRzIGRyYXduIG9uIG1lbW9yeQorICogdG8gYSBMQ0QgUGFuZWwgdGhyb3VnaCBEaXNwbGF5IEludGVyZmFjZXMgc3VjaCBhcyBSR0Igb3IKKyAqIENQVSBJbnRlcmZhY2UuCisgKi8KKworLyogcG9zaXRpb24gY29udHJvbCByZWdpc3RlciBmb3IgaGFyZHdhcmUgd2luZG93IDAsIDIgfiA0LiovCisjZGVmaW5lIFZJRE9TRF9BKHdpbikJCShWSURPU0RfQkFTRSArIDB4MDAgKyAod2luKSAqIDE2KQorI2RlZmluZSBWSURPU0RfQih3aW4pCQkoVklET1NEX0JBU0UgKyAweDA0ICsgKHdpbikgKiAxNikKKy8qIHNpemUgY29udHJvbCByZWdpc3RlciBmb3IgaGFyZHdhcmUgd2luZG93IDAuICovCisjZGVmaW5lIFZJRE9TRF9DX1NJWkVfVzAJKFZJRE9TRF9CQVNFICsgMHgwOCkKKy8qIGFscGhhIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIGhhcmR3YXJlIHdpbmRvdyAxIH4gNC4gKi8KKyNkZWZpbmUgVklET1NEX0Mod2luKQkJKFZJRE9TRF9CQVNFICsgMHgxOCArICh3aW4pICogMTYpCisvKiBzaXplIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIGhhcmR3YXJlIHdpbmRvdyAxIH4gNC4gKi8KKyNkZWZpbmUgVklET1NEX0Qod2luKQkJKFZJRE9TRF9CQVNFICsgMHgwQyArICh3aW4pICogMTYpCisKKyNkZWZpbmUgVklEV3hfQlVGX1NUQVJUKHdpbiwgYnVmKQkoVklEV19CVUZfU1RBUlQoYnVmKSArICh3aW4pICogOCkKKyNkZWZpbmUgVklEV3hfQlVGX0VORCh3aW4sIGJ1ZikJCShWSURXX0JVRl9FTkQoYnVmKSArICh3aW4pICogOCkKKyNkZWZpbmUgVklEV3hfQlVGX1NJWkUod2luLCBidWYpCShWSURXX0JVRl9TSVpFKGJ1ZikgKyAod2luKSAqIDQpCisKKy8qIGNvbG9yIGtleSBjb250cm9sIHJlZ2lzdGVyIGZvciBoYXJkd2FyZSB3aW5kb3cgMSB+IDQuICovCisjZGVmaW5lIFdLRVlDT04wX0JBU0UoeCkJCSgoV0tFWUNPTjAgKyAweDE0MCkgKyAoeCAqIDgpKQorLyogY29sb3Iga2V5IHZhbHVlIHJlZ2lzdGVyIGZvciBoYXJkd2FyZSB3aW5kb3cgMSB+IDQuICovCisjZGVmaW5lIFdLRVlDT04xX0JBU0UoeCkJCSgoV0tFWUNPTjEgKyAweDE0MCkgKyAoeCAqIDgpKQorCisvKiBGSU1EIGhhcyB0b3RhbGx5IGZpdmUgaGFyZHdhcmUgd2luZG93cy4gKi8KKyNkZWZpbmUgV0lORE9XU19OUgk1CisKKyNkZWZpbmUgZ2V0X2ZpbWRfY29udGV4dChkZXYpCXBsYXRmb3JtX2dldF9kcnZkYXRhKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKQorCitzdHJ1Y3QgZmltZF93aW5fZGF0YSB7CisJdW5zaWduZWQgaW50CQlvZmZzZXRfeDsKKwl1bnNpZ25lZCBpbnQJCW9mZnNldF95OworCXVuc2lnbmVkIGludAkJb3ZsX3dpZHRoOworCXVuc2lnbmVkIGludAkJb3ZsX2hlaWdodDsKKwl1bnNpZ25lZCBpbnQJCWZiX3dpZHRoOworCXVuc2lnbmVkIGludAkJZmJfaGVpZ2h0OworCXVuc2lnbmVkIGludAkJYnBwOworCWRtYV9hZGRyX3QJCXBhZGRyOworCXZvaWQgX19pb21lbQkJKnZhZGRyOworCXVuc2lnbmVkIGludAkJYnVmX29mZnNpemU7CisJdW5zaWduZWQgaW50CQlsaW5lX3NpemU7CS8qIGJ5dGVzICovCit9OworCitzdHJ1Y3QgZmltZF9jb250ZXh0IHsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYJc3ViZHJ2OworCWludAkJCQlpcnE7CisJc3RydWN0IGRybV9jcnRjCQkJKmNydGM7CisJc3RydWN0IGNsawkJCSpidXNfY2xrOworCXN0cnVjdCBjbGsJCQkqbGNkX2NsazsKKwlzdHJ1Y3QgcmVzb3VyY2UJCQkqcmVnc19yZXM7CisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CisJc3RydWN0IGZpbWRfd2luX2RhdGEJCXdpbl9kYXRhW1dJTkRPV1NfTlJdOworCXVuc2lnbmVkIGludAkJCWNsa2RpdjsKKwl1bnNpZ25lZCBpbnQJCQlkZWZhdWx0X3dpbjsKKwl1bnNpZ25lZCBsb25nCQkJaXJxX2ZsYWdzOworCXUzMgkJCQl2aWRjb24wOworCXUzMgkJCQl2aWRjb24xOworCisJc3RydWN0IGZiX3ZpZGVvbW9kZQkJKnRpbWluZzsKK307CisKK3N0YXRpYyBib29sIGZpbWRfZGlzcGxheV9pc19jb25uZWN0ZWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBUT0RPLiAqLworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkICpmaW1kX2dldF90aW1pbmcoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCA9IGdldF9maW1kX2NvbnRleHQoZGV2KTsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlyZXR1cm4gY3R4LT50aW1pbmc7Cit9CisKK3N0YXRpYyBpbnQgZmltZF9jaGVja190aW1pbmcoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp0aW1pbmcpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIFRPRE8uICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW1kX2Rpc3BsYXlfcG93ZXJfb24oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbW9kZSkKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyogVE9ETy4gKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSBmaW1kX2Rpc3BsYXkgPSB7CisJLnR5cGUgPSBFWFlOT1NfRElTUExBWV9UWVBFX0xDRCwKKwkuaXNfY29ubmVjdGVkID0gZmltZF9kaXNwbGF5X2lzX2Nvbm5lY3RlZCwKKwkuZ2V0X3RpbWluZyA9IGZpbWRfZ2V0X3RpbWluZywKKwkuY2hlY2tfdGltaW5nID0gZmltZF9jaGVja190aW1pbmcsCisJLnBvd2VyX29uID0gZmltZF9kaXNwbGF5X3Bvd2VyX29uLAorfTsKKworc3RhdGljIHZvaWQgZmltZF9jb21taXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCA9IGdldF9maW1kX2NvbnRleHQoZGV2KTsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlICp0aW1pbmcgPSBjdHgtPnRpbWluZzsKKwl1MzIgdmFsOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIHNldHVwIHBvbGFyaXR5IHZhbHVlcyBmcm9tIG1hY2hpbmUgY29kZS4gKi8KKwl3cml0ZWwoY3R4LT52aWRjb24xLCBjdHgtPnJlZ3MgKyBWSURDT04xKTsKKworCS8qIHNldHVwIHZlcnRpY2FsIHRpbWluZyB2YWx1ZXMuICovCisJdmFsID0gVklEVENPTjBfVkJQRCh0aW1pbmctPnVwcGVyX21hcmdpbiAtIDEpIHwKKwkgICAgICAgVklEVENPTjBfVkZQRCh0aW1pbmctPmxvd2VyX21hcmdpbiAtIDEpIHwKKwkgICAgICAgVklEVENPTjBfVlNQVyh0aW1pbmctPnZzeW5jX2xlbiAtIDEpOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRFRDT04wKTsKKworCS8qIHNldHVwIGhvcml6b250YWwgdGltaW5nIHZhbHVlcy4gICovCisJdmFsID0gVklEVENPTjFfSEJQRCh0aW1pbmctPmxlZnRfbWFyZ2luIC0gMSkgfAorCSAgICAgICBWSURUQ09OMV9IRlBEKHRpbWluZy0+cmlnaHRfbWFyZ2luIC0gMSkgfAorCSAgICAgICBWSURUQ09OMV9IU1BXKHRpbWluZy0+aHN5bmNfbGVuIC0gMSk7CisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgVklEVENPTjEpOworCisJLyogc2V0dXAgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGlzcGxheSBzaXplLiAqLworCXZhbCA9IFZJRFRDT04yX0xJTkVWQUwodGltaW5nLT55cmVzIC0gMSkgfAorCSAgICAgICBWSURUQ09OMl9IT1pWQUwodGltaW5nLT54cmVzIC0gMSk7CisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgVklEVENPTjIpOworCisJLyogc2V0dXAgY2xvY2sgc291cmNlLCBjbG9jayBkaXZpZGVyLCBlbmFibGUgZG1hLiAqLworCXZhbCA9IGN0eC0+dmlkY29uMDsKKwl2YWwgJj0gfihWSURDT04wX0NMS1ZBTF9GX01BU0sgfCBWSURDT04wX0NMS0RJUik7CisKKwlpZiAoY3R4LT5jbGtkaXYgPiAxKQorCQl2YWwgfD0gVklEQ09OMF9DTEtWQUxfRihjdHgtPmNsa2RpdiAtIDEpIHwgVklEQ09OMF9DTEtESVI7CisJZWxzZQorCQl2YWwgJj0gflZJRENPTjBfQ0xLRElSOwkvKiAxOjEgY2xvY2sgKi8KKworCS8qCisJICogZmllbGRzIG9mIHJlZ2lzdGVyIHdpdGggcHJlZml4ICdfRicgd291bGQgYmUgdXBkYXRlZAorCSAqIGF0IHZzeW5jKHNhbWUgYXMgZG1hIHN0YXJ0KQorCSAqLworCXZhbCB8PSBWSURDT04wX0VOVklEIHwgVklEQ09OMF9FTlZJRF9GOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRENPTjApOworfQorCitzdGF0aWMgaW50IGZpbWRfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZpbWRfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWRfY29udGV4dChkZXYpOworCXUzMiB2YWw7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICZjdHgtPmlycV9mbGFncykpIHsKKwkJdmFsID0gcmVhZGwoY3R4LT5yZWdzICsgVklESU5UQ09OMCk7CisKKwkJdmFsIHw9IFZJRElOVENPTjBfSU5UX0VOQUJMRTsKKwkJdmFsIHw9IFZJRElOVENPTjBfSU5UX0ZSQU1FOworCisJCXZhbCAmPSB+VklESU5UQ09OMF9GUkFNRVNFTDBfTUFTSzsKKwkJdmFsIHw9IFZJRElOVENPTjBfRlJBTUVTRUwwX1ZTWU5DOworCQl2YWwgJj0gflZJRElOVENPTjBfRlJBTUVTRUwxX01BU0s7CisJCXZhbCB8PSBWSURJTlRDT04wX0ZSQU1FU0VMMV9OT05FOworCisJCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRElOVENPTjApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaW1kX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBnZXRfZmltZF9jb250ZXh0KGRldik7CisJdTMyIHZhbDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZjdHgtPmlycV9mbGFncykpIHsKKwkJdmFsID0gcmVhZGwoY3R4LT5yZWdzICsgVklESU5UQ09OMCk7CisKKwkJdmFsICY9IH5WSURJTlRDT04wX0lOVF9GUkFNRTsKKwkJdmFsICY9IH5WSURJTlRDT04wX0lOVF9FTkFCTEU7CisKKwkJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgVklESU5UQ09OMCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcl9vcHMgZmltZF9tYW5hZ2VyX29wcyA9IHsKKwkuY29tbWl0ID0gZmltZF9jb21taXQsCisJLmVuYWJsZV92YmxhbmsgPSBmaW1kX2VuYWJsZV92YmxhbmssCisJLmRpc2FibGVfdmJsYW5rID0gZmltZF9kaXNhYmxlX3ZibGFuaywKK307CisKK3N0YXRpYyB2b2lkIGZpbWRfd2luX21vZGVfc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBleHlub3NfZHJtX292ZXJsYXkgKm92ZXJsYXkpCit7CisJc3RydWN0IGZpbWRfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWRfY29udGV4dChkZXYpOworCXN0cnVjdCBmaW1kX3dpbl9kYXRhICp3aW5fZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoIW92ZXJsYXkpIHsKKwkJZGV2X2VycihkZXYsICJvdmVybGF5IGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCisJb2Zmc2V0ID0gb3ZlcmxheS0+ZmJfeCAqIChvdmVybGF5LT5icHAgPj4gMyk7CisJb2Zmc2V0ICs9IG92ZXJsYXktPmZiX3kgKiBvdmVybGF5LT5waXRjaDsKKworCURSTV9ERUJVR19LTVMoIm9mZnNldCA9IDB4JWx4LCBwaXRjaCA9ICV4XG4iLCBvZmZzZXQsIG92ZXJsYXktPnBpdGNoKTsKKworCXdpbl9kYXRhID0gJmN0eC0+d2luX2RhdGFbY3R4LT5kZWZhdWx0X3dpbl07CisKKwl3aW5fZGF0YS0+b2Zmc2V0X3ggPSBvdmVybGF5LT5jcnRjX3g7CisJd2luX2RhdGEtPm9mZnNldF95ID0gb3ZlcmxheS0+Y3J0Y195OworCXdpbl9kYXRhLT5vdmxfd2lkdGggPSBvdmVybGF5LT5jcnRjX3dpZHRoOworCXdpbl9kYXRhLT5vdmxfaGVpZ2h0ID0gb3ZlcmxheS0+Y3J0Y19oZWlnaHQ7CisJd2luX2RhdGEtPmZiX3dpZHRoID0gb3ZlcmxheS0+ZmJfd2lkdGg7CisJd2luX2RhdGEtPmZiX2hlaWdodCA9IG92ZXJsYXktPmZiX2hlaWdodDsKKwl3aW5fZGF0YS0+cGFkZHIgPSBvdmVybGF5LT5wYWRkciArIG9mZnNldDsKKwl3aW5fZGF0YS0+dmFkZHIgPSBvdmVybGF5LT52YWRkciArIG9mZnNldDsKKwl3aW5fZGF0YS0+YnBwID0gb3ZlcmxheS0+YnBwOworCXdpbl9kYXRhLT5idWZfb2Zmc2l6ZSA9IChvdmVybGF5LT5mYl93aWR0aCAtIG92ZXJsYXktPmNydGNfd2lkdGgpICoKKwkJCQkob3ZlcmxheS0+YnBwID4+IDMpOworCXdpbl9kYXRhLT5saW5lX3NpemUgPSBvdmVybGF5LT5jcnRjX3dpZHRoICogKG92ZXJsYXktPmJwcCA+PiAzKTsKKworCURSTV9ERUJVR19LTVMoIm9mZnNldF94ID0gJWQsIG9mZnNldF95ID0gJWRcbiIsCisJCQl3aW5fZGF0YS0+b2Zmc2V0X3gsIHdpbl9kYXRhLT5vZmZzZXRfeSk7CisJRFJNX0RFQlVHX0tNUygib3ZsX3dpZHRoID0gJWQsIG92bF9oZWlnaHQgPSAlZFxuIiwKKwkJCXdpbl9kYXRhLT5vdmxfd2lkdGgsIHdpbl9kYXRhLT5vdmxfaGVpZ2h0KTsKKwlEUk1fREVCVUdfS01TKCJwYWRkciA9IDB4JWx4LCB2YWRkciA9IDB4JWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpd2luX2RhdGEtPnBhZGRyLAorCQkJKHVuc2lnbmVkIGxvbmcpd2luX2RhdGEtPnZhZGRyKTsKKwlEUk1fREVCVUdfS01TKCJmYl93aWR0aCA9ICVkLCBjcnRjX3dpZHRoID0gJWRcbiIsCisJCQlvdmVybGF5LT5mYl93aWR0aCwgb3ZlcmxheS0+Y3J0Y193aWR0aCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbWRfd2luX3NldF9waXhmbXQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgd2luKQoreworCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCA9IGdldF9maW1kX2NvbnRleHQoZGV2KTsKKwlzdHJ1Y3QgZmltZF93aW5fZGF0YSAqd2luX2RhdGEgPSAmY3R4LT53aW5fZGF0YVt3aW5dOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCXZhbCA9IFdJTkNPTnhfRU5XSU47CisKKwlzd2l0Y2ggKHdpbl9kYXRhLT5icHApIHsKKwljYXNlIDE6CisJCXZhbCB8PSBXSU5DT04wX0JQUE1PREVfMUJQUDsKKwkJdmFsIHw9IFdJTkNPTnhfQklUU1dQOworCQl2YWwgfD0gV0lOQ09OeF9CVVJTVExFTl80V09SRDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl2YWwgfD0gV0lOQ09OMF9CUFBNT0RFXzJCUFA7CisJCXZhbCB8PSBXSU5DT054X0JJVFNXUDsKKwkJdmFsIHw9IFdJTkNPTnhfQlVSU1RMRU5fOFdPUkQ7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdmFsIHw9IFdJTkNPTjBfQlBQTU9ERV80QlBQOworCQl2YWwgfD0gV0lOQ09OeF9CSVRTV1A7CisJCXZhbCB8PSBXSU5DT054X0JVUlNUTEVOXzhXT1JEOworCQlicmVhazsKKwljYXNlIDg6CisJCXZhbCB8PSBXSU5DT04wX0JQUE1PREVfOEJQUF9QQUxFVFRFOworCQl2YWwgfD0gV0lOQ09OeF9CVVJTVExFTl84V09SRDsKKwkJdmFsIHw9IFdJTkNPTnhfQllUU1dQOworCQlicmVhazsKKwljYXNlIDE2OgorCQl2YWwgfD0gV0lOQ09OMF9CUFBNT0RFXzE2QlBQXzU2NTsKKwkJdmFsIHw9IFdJTkNPTnhfSEFXU1dQOworCQl2YWwgfD0gV0lOQ09OeF9CVVJTVExFTl8xNldPUkQ7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXZhbCB8PSBXSU5DT04wX0JQUE1PREVfMjRCUFBfODg4OworCQl2YWwgfD0gV0lOQ09OeF9XU1dQOworCQl2YWwgfD0gV0lOQ09OeF9CVVJTVExFTl8xNldPUkQ7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXZhbCB8PSBXSU5DT04xX0JQUE1PREVfMjhCUFBfQTQ4ODgKKwkJCXwgV0lOQ09OMV9CTERfUElYIHwgV0lOQ09OMV9BTFBIQV9TRUw7CisJCXZhbCB8PSBXSU5DT054X1dTV1A7CisJCXZhbCB8PSBXSU5DT054X0JVUlNUTEVOXzE2V09SRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0RFQlVHX0tNUygiaW52YWxpZCBwaXhlbCBzaXplIHNvIHVzaW5nIHVucGFja2VkIDI0YnBwLlxuIik7CisKKwkJdmFsIHw9IFdJTkNPTjBfQlBQTU9ERV8yNEJQUF84ODg7CisJCXZhbCB8PSBXSU5DT054X1dTV1A7CisJCXZhbCB8PSBXSU5DT054X0JVUlNUTEVOXzE2V09SRDsKKwkJYnJlYWs7CisJfQorCisJRFJNX0RFQlVHX0tNUygiYnBwID0gJWRcbiIsIHdpbl9kYXRhLT5icHApOworCisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgV0lOQ09OKHdpbikpOworfQorCitzdGF0aWMgdm9pZCBmaW1kX3dpbl9zZXRfY29sa2V5KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHdpbikKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBnZXRfZmltZF9jb250ZXh0KGRldik7CisJdW5zaWduZWQgaW50IGtleWNvbjAgPSAwLCBrZXljb24xID0gMDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlrZXljb24wID0gfihXeEtFWUNPTjBfS0VZQkxfRU4gfCBXeEtFWUNPTjBfS0VZRU5fRiB8CisJCQlXeEtFWUNPTjBfRElSQ09OKSB8IFd4S0VZQ09OMF9DT01QS0VZKDApOworCisJa2V5Y29uMSA9IFd4S0VZQ09OMV9DT0xWQUwoMHhmZmZmZmZmZik7CisKKwl3cml0ZWwoa2V5Y29uMCwgY3R4LT5yZWdzICsgV0tFWUNPTjBfQkFTRSh3aW4pKTsKKwl3cml0ZWwoa2V5Y29uMSwgY3R4LT5yZWdzICsgV0tFWUNPTjFfQkFTRSh3aW4pKTsKK30KKworc3RhdGljIHZvaWQgZmltZF93aW5fY29tbWl0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBnZXRfZmltZF9jb250ZXh0KGRldik7CisJc3RydWN0IGZpbWRfd2luX2RhdGEgKndpbl9kYXRhOworCWludCB3aW4gPSBjdHgtPmRlZmF1bHRfd2luOworCXVuc2lnbmVkIGxvbmcgdmFsLCBhbHBoYSwgc2l6ZTsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAod2luIDwgMCB8fCB3aW4gPiBXSU5ET1dTX05SKQorCQlyZXR1cm47CisKKwl3aW5fZGF0YSA9ICZjdHgtPndpbl9kYXRhW3dpbl07CisKKwkvKgorCSAqIFNIQURPV0NPTiByZWdpc3RlciBpcyB1c2VkIGZvciBlbmFibGluZyB0aW1pbmcuCisJICoKKwkgKiBmb3IgZXhhbXBsZSwgb25jZSBvbmx5IHdpZHRoIHZhbHVlIG9mIGEgcmVnaXN0ZXIgaXMgc2V0LAorCSAqIGlmIHRoZSBkbWEgaXMgc3RhcnRlZCB0aGVuIGZpbWQgaGFyZHdhcmUgY291bGQgbWFsZnVuY3Rpb24gc28KKwkgKiB3aXRoIHByb3RlY3Qgd2luZG93IHNldHRpbmcsIHRoZSByZWdpc3RlciBmaWVsZHMgd2l0aCBwcmVmaXggJ19GJworCSAqIHdvdWxkbid0IGJlIHVwZGF0ZWQgYXQgdnN5bmMgYWxzbyBidXQgdXBkYXRlZCBvbmNlIHVucHJvdGVjdCB3aW5kb3cKKwkgKiBpcyBzZXQuCisJICovCisKKwkvKiBwcm90ZWN0IHdpbmRvd3MgKi8KKwl2YWwgPSByZWFkbChjdHgtPnJlZ3MgKyBTSEFET1dDT04pOworCXZhbCB8PSBTSEFET1dDT05fV0lOeF9QUk9URUNUKHdpbik7CisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgU0hBRE9XQ09OKTsKKworCS8qIGJ1ZmZlciBzdGFydCBhZGRyZXNzICovCisJdmFsID0gd2luX2RhdGEtPnBhZGRyOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRFd4X0JVRl9TVEFSVCh3aW4sIDApKTsKKworCS8qIGJ1ZmZlciBlbmQgYWRkcmVzcyAqLworCXNpemUgPSB3aW5fZGF0YS0+ZmJfd2lkdGggKiB3aW5fZGF0YS0+b3ZsX2hlaWdodCAqICh3aW5fZGF0YS0+YnBwID4+IDMpOworCXZhbCA9IHdpbl9kYXRhLT5wYWRkciArIHNpemU7CisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgVklEV3hfQlVGX0VORCh3aW4sIDApKTsKKworCURSTV9ERUJVR19LTVMoInN0YXJ0IGFkZHIgPSAweCVseCwgZW5kIGFkZHIgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpd2luX2RhdGEtPnBhZGRyLCB2YWwsIHNpemUpOworCURSTV9ERUJVR19LTVMoIm92bF93aWR0aCA9ICVkLCBvdmxfaGVpZ2h0ID0gJWRcbiIsCisJCQl3aW5fZGF0YS0+b3ZsX3dpZHRoLCB3aW5fZGF0YS0+b3ZsX2hlaWdodCk7CisKKwkvKiBidWZmZXIgc2l6ZSAqLworCXZhbCA9IFZJRFdfQlVGX1NJWkVfT0ZGU0VUKHdpbl9kYXRhLT5idWZfb2Zmc2l6ZSkgfAorCQlWSURXX0JVRl9TSVpFX1BBR0VXSURUSCh3aW5fZGF0YS0+bGluZV9zaXplKTsKKwl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBWSURXeF9CVUZfU0laRSh3aW4sIDApKTsKKworCS8qIE9TRCBwb3NpdGlvbiAqLworCXZhbCA9IFZJRE9TRHhBX1RPUExFRlRfWCh3aW5fZGF0YS0+b2Zmc2V0X3gpIHwKKwkJVklET1NEeEFfVE9QTEVGVF9ZKHdpbl9kYXRhLT5vZmZzZXRfeSk7CisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgVklET1NEX0Eod2luKSk7CisKKwl2YWwgPSBWSURPU0R4Ql9CT1RSSUdIVF9YKHdpbl9kYXRhLT5vZmZzZXRfeCArCisJCQkJCXdpbl9kYXRhLT5vdmxfd2lkdGggLSAxKSB8CisJCVZJRE9TRHhCX0JPVFJJR0hUX1kod2luX2RhdGEtPm9mZnNldF95ICsKKwkJCQkJd2luX2RhdGEtPm92bF9oZWlnaHQgLSAxKTsKKwl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBWSURPU0RfQih3aW4pKTsKKworCURSTV9ERUJVR19LTVMoIm9zZCBwb3M6IHR4ID0gJWQsIHR5ID0gJWQsIGJ4ID0gJWQsIGJ5ID0gJWRcbiIsCisJCQl3aW5fZGF0YS0+b2Zmc2V0X3gsIHdpbl9kYXRhLT5vZmZzZXRfeSwKKwkJCXdpbl9kYXRhLT5vZmZzZXRfeCArIHdpbl9kYXRhLT5vdmxfd2lkdGggLSAxLAorCQkJd2luX2RhdGEtPm9mZnNldF95ICsgd2luX2RhdGEtPm92bF9oZWlnaHQgLSAxKTsKKworCS8qIGhhcmR3YXJlIHdpbmRvdyAwIGRvZXNuJ3Qgc3VwcG9ydCBhbHBoYSBjaGFubmVsLiAqLworCWlmICh3aW4gIT0gMCkgeworCQkvKiBPU0QgYWxwaGEgKi8KKwkJYWxwaGEgPSBWSURJU0QxNENfQUxQSEExX1IoMHhmKSB8CisJCQlWSURJU0QxNENfQUxQSEExX0coMHhmKSB8CisJCQlWSURJU0QxNENfQUxQSEExX0IoMHhmKTsKKworCQl3cml0ZWwoYWxwaGEsIGN0eC0+cmVncyArIFZJRE9TRF9DKHdpbikpOworCX0KKworCS8qIE9TRCBzaXplICovCisJaWYgKHdpbiAhPSAzICYmIHdpbiAhPSA0KSB7CisJCXUzMiBvZmZzZXQgPSBWSURPU0RfRCh3aW4pOworCQlpZiAod2luID09IDApCisJCQlvZmZzZXQgPSBWSURPU0RfQ19TSVpFX1cwOworCQl2YWwgPSB3aW5fZGF0YS0+b3ZsX3dpZHRoICogd2luX2RhdGEtPm92bF9oZWlnaHQ7CisJCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIG9mZnNldCk7CisKKwkJRFJNX0RFQlVHX0tNUygib3NkIHNpemUgPSAweCV4XG4iLCAodW5zaWduZWQgaW50KXZhbCk7CisJfQorCisJZmltZF93aW5fc2V0X3BpeGZtdChkZXYsIHdpbik7CisKKwkvKiBoYXJkd2FyZSB3aW5kb3cgMCBkb2Vzbid0IHN1cHBvcnQgY29sb3Iga2V5LiAqLworCWlmICh3aW4gIT0gMCkKKwkJZmltZF93aW5fc2V0X2NvbGtleShkZXYsIHdpbik7CisKKwkvKiBFbmFibGUgRE1BIGNoYW5uZWwgYW5kIHVucHJvdGVjdCB3aW5kb3dzICovCisJdmFsID0gcmVhZGwoY3R4LT5yZWdzICsgU0hBRE9XQ09OKTsKKwl2YWwgfD0gU0hBRE9XQ09OX0NIeF9FTkFCTEUod2luKTsKKwl2YWwgJj0gflNIQURPV0NPTl9XSU54X1BST1RFQ1Qod2luKTsKKwl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBTSEFET1dDT04pOworfQorCitzdGF0aWMgdm9pZCBmaW1kX3dpbl9kaXNhYmxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBnZXRfZmltZF9jb250ZXh0KGRldik7CisJc3RydWN0IGZpbWRfd2luX2RhdGEgKndpbl9kYXRhOworCWludCB3aW4gPSBjdHgtPmRlZmF1bHRfd2luOworCXUzMiB2YWw7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKHdpbiA8IDAgfHwgd2luID4gV0lORE9XU19OUikKKwkJcmV0dXJuOworCisJd2luX2RhdGEgPSAmY3R4LT53aW5fZGF0YVt3aW5dOworCisJLyogcHJvdGVjdCB3aW5kb3dzICovCisJdmFsID0gcmVhZGwoY3R4LT5yZWdzICsgU0hBRE9XQ09OKTsKKwl2YWwgfD0gU0hBRE9XQ09OX1dJTnhfUFJPVEVDVCh3aW4pOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFNIQURPV0NPTik7CisKKwkvKiB3aW5jb24gKi8KKwl2YWwgPSByZWFkbChjdHgtPnJlZ3MgKyBXSU5DT04od2luKSk7CisJdmFsICY9IH5XSU5DT054X0VOV0lOOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFdJTkNPTih3aW4pKTsKKworCS8qIHVucHJvdGVjdCB3aW5kb3dzICovCisJdmFsID0gcmVhZGwoY3R4LT5yZWdzICsgU0hBRE9XQ09OKTsKKwl2YWwgJj0gflNIQURPV0NPTl9DSHhfRU5BQkxFKHdpbik7CisJdmFsICY9IH5TSEFET1dDT05fV0lOeF9QUk9URUNUKHdpbik7CisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgU0hBRE9XQ09OKTsKK30KKworc3RhdGljIHN0cnVjdCBleHlub3NfZHJtX292ZXJsYXlfb3BzIGZpbWRfb3ZlcmxheV9vcHMgPSB7CisJLm1vZGVfc2V0ID0gZmltZF93aW5fbW9kZV9zZXQsCisJLmNvbW1pdCA9IGZpbWRfd2luX2NvbW1pdCwKKwkuZGlzYWJsZSA9IGZpbWRfd2luX2Rpc2FibGUsCit9OworCitzdGF0aWMgdm9pZCBmaW1kX2ZpbmlzaF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiwgaW50IGNydGMpCit7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqZGV2X3ByaXYgPSBkcm1fZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplLCAqdDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGlzX2NoZWNrZWQgPSBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkcm1fZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgdCwgJmRldl9wcml2LT5wYWdlZmxpcF9ldmVudF9saXN0LAorCQkJYmFzZS5saW5rKSB7CisJCS8qIGlmIGV2ZW50J3MgcGlwZSBpc24ndCBzYW1lIGFzIGNydGMgdGhlbiBpZ25vcmUgaXQuICovCisJCWlmIChjcnRjICE9IGUtPnBpcGUpCisJCQljb250aW51ZTsKKworCQlpc19jaGVja2VkID0gdHJ1ZTsKKworCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJCWUtPmV2ZW50LnNlcXVlbmNlID0gMDsKKwkJZS0+ZXZlbnQudHZfc2VjID0gbm93LnR2X3NlYzsKKwkJZS0+ZXZlbnQudHZfdXNlYyA9IG5vdy50dl91c2VjOworCisJCWxpc3RfbW92ZV90YWlsKCZlLT5iYXNlLmxpbmssICZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfbGlzdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X3dhaXQpOworCX0KKworCWlmIChpc19jaGVja2VkKQorCQlkcm1fdmJsYW5rX3B1dChkcm1fZGV2LCBjcnRjKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRybV9kZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGZpbWRfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgZmltZF9jb250ZXh0ICopZGV2X2lkOworCXN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqc3ViZHJ2ID0gJmN0eC0+c3ViZHJ2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0gc3ViZHJ2LT5kcm1fZGV2OworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1hbmFnZXIgPSAmc3ViZHJ2LT5tYW5hZ2VyOworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChjdHgtPnJlZ3MgKyBWSURJTlRDT04xKTsKKworCWlmICh2YWwgJiBWSURJTlRDT04xX0lOVF9GUkFNRSkKKwkJLyogVlNZTkMgaW50ZXJydXB0ICovCisJCXdyaXRlbChWSURJTlRDT04xX0lOVF9GUkFNRSwgY3R4LT5yZWdzICsgVklESU5UQ09OMSk7CisKKwlkcm1faGFuZGxlX3ZibGFuayhkcm1fZGV2LCBtYW5hZ2VyLT5waXBlKTsKKwlmaW1kX2ZpbmlzaF9wYWdlZmxpcChkcm1fZGV2LCBtYW5hZ2VyLT5waXBlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBmaW1kX3N1YmRydl9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKgorCSAqIGVuYWJsZSBkcm0gaXJxIG1vZGUuCisJICogLSB3aXRoIGlycV9lbmFibGVkID0gMSwgd2UgY2FuIHVzZSB0aGUgdmJsYW5rIGZlYXR1cmUuCisJICoKKwkgKiBQLlMuIG5vdGUgdGhhdCB3ZSB3b3VsZG4ndCB1c2UgZHJtIGlycSBoYW5kbGVyIGJ1dAorCSAqCWp1c3Qgc3BlY2lmaWMgZHJpdmVyIG93biBvbmUgaW5zdGVhZCBiZWNhdXNlCisJICoJZHJtIGZyYW1ld29yayBzdXBwb3J0cyBvbmx5IG9uZSBpcnEgaGFuZGxlci4KKwkgKi8KKwlkcm1fZGV2LT5pcnFfZW5hYmxlZCA9IDE7CisKKwkvKgorCSAqIHdpdGggdmJsYW5rX2Rpc2FibGVfYWxsb3dlZCA9IDEsIHZibGFuayBpbnRlcnJ1cHQgd2lsbCBiZSBkaXNhYmxlZAorCSAqIGJ5IGRybSB0aW1lciBvbmNlIGEgY3VycmVudCBwcm9jZXNzIGdpdmVzIHVwIG93bmVyc2hpcCBvZgorCSAqIHZibGFuayBldmVudC4oZHJtX3ZibGFua19wdXQgZnVuY3Rpb24gd2FzIGNhbGxlZCkKKwkgKi8KKwlkcm1fZGV2LT52YmxhbmtfZGlzYWJsZV9hbGxvd2VkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaW1kX3N1YmRydl9yZW1vdmUoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIFRPRE8uICovCit9CisKK3N0YXRpYyBpbnQgZmltZF9jYWxjX2Nsa2RpdihzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHgsCisJCQkgICAgc3RydWN0IGZiX3ZpZGVvbW9kZSAqdGltaW5nKQoreworCXVuc2lnbmVkIGxvbmcgY2xrID0gY2xrX2dldF9yYXRlKGN0eC0+bGNkX2Nsayk7CisJdTMyIHJldHJhY2U7CisJdTMyIGNsa2RpdjsKKwl1MzIgYmVzdF9mcmFtZXJhdGUgPSAwOworCXUzMiBmcmFtZXJhdGU7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJcmV0cmFjZSA9IHRpbWluZy0+bGVmdF9tYXJnaW4gKyB0aW1pbmctPmhzeW5jX2xlbiArCisJCQkJdGltaW5nLT5yaWdodF9tYXJnaW4gKyB0aW1pbmctPnhyZXM7CisJcmV0cmFjZSAqPSB0aW1pbmctPnVwcGVyX21hcmdpbiArIHRpbWluZy0+dnN5bmNfbGVuICsKKwkJCQl0aW1pbmctPmxvd2VyX21hcmdpbiArIHRpbWluZy0+eXJlczsKKworCS8qIGRlZmF1bHQgZnJhbWVyYXRlIGlzIDYwSHogKi8KKwlpZiAoIXRpbWluZy0+cmVmcmVzaCkKKwkJdGltaW5nLT5yZWZyZXNoID0gNjA7CisKKwljbGsgLz0gcmV0cmFjZTsKKworCWZvciAoY2xrZGl2ID0gMTsgY2xrZGl2IDwgMHgxMDA7IGNsa2RpdisrKSB7CisJCWludCB0bXA7CisKKwkJLyogZ2V0IGJlc3QgZnJhbWVyYXRlICovCisJCWZyYW1lcmF0ZSA9IGNsayAvIGNsa2RpdjsKKwkJdG1wID0gdGltaW5nLT5yZWZyZXNoIC0gZnJhbWVyYXRlOworCQlpZiAodG1wIDwgMCkgeworCQkJYmVzdF9mcmFtZXJhdGUgPSBmcmFtZXJhdGU7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWlmICghYmVzdF9mcmFtZXJhdGUpCisJCQkJYmVzdF9mcmFtZXJhdGUgPSBmcmFtZXJhdGU7CisJCQllbHNlIGlmICh0bXAgPCAoYmVzdF9mcmFtZXJhdGUgLSBmcmFtZXJhdGUpKQorCQkJCWJlc3RfZnJhbWVyYXRlID0gZnJhbWVyYXRlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gY2xrZGl2OworfQorCitzdGF0aWMgdm9pZCBmaW1kX2NsZWFyX3dpbihzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHgsIGludCB3aW4pCit7CisJdTMyIHZhbDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwl3cml0ZWwoMCwgY3R4LT5yZWdzICsgV0lOQ09OKHdpbikpOworCXdyaXRlbCgwLCBjdHgtPnJlZ3MgKyBWSURPU0RfQSh3aW4pKTsKKwl3cml0ZWwoMCwgY3R4LT5yZWdzICsgVklET1NEX0Iod2luKSk7CisJd3JpdGVsKDAsIGN0eC0+cmVncyArIFZJRE9TRF9DKHdpbikpOworCisJaWYgKHdpbiA9PSAxIHx8IHdpbiA9PSAyKQorCQl3cml0ZWwoMCwgY3R4LT5yZWdzICsgVklET1NEX0Qod2luKSk7CisKKwl2YWwgPSByZWFkbChjdHgtPnJlZ3MgKyBTSEFET1dDT04pOworCXZhbCAmPSB+U0hBRE9XQ09OX1dJTnhfUFJPVEVDVCh3aW4pOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFNIQURPV0NPTik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZpbWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgKnN1YmRydjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9maW1kX3BkYXRhICpwZGF0YTsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlICp0aW1pbmc7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHdpbjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycihkZXYsICJubyBwbGF0Zm9ybSBkYXRhIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRpbWluZyA9ICZwZGF0YS0+dGltaW5nOworCWlmICghdGltaW5nKSB7CisJCWRldl9lcnIoZGV2LCAidGltaW5nIGlzIG51bGwuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3R4ID0ga3phbGxvYyhzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWN0eC0+YnVzX2NsayA9IGNsa19nZXQoZGV2LCAiZmltZCIpOworCWlmIChJU19FUlIoY3R4LT5idXNfY2xrKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgYnVzIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihjdHgtPmJ1c19jbGspOworCQlnb3RvIGVycl9jbGtfZ2V0OworCX0KKworCWNsa19lbmFibGUoY3R4LT5idXNfY2xrKTsKKworCWN0eC0+bGNkX2NsayA9IGNsa19nZXQoZGV2LCAic2Nsa19maW1kIik7CisJaWYgKElTX0VSUihjdHgtPmxjZF9jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBsY2QgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKGN0eC0+bGNkX2Nsayk7CisJCWdvdG8gZXJyX2J1c19jbGs7CisJfQorCisJY2xrX2VuYWJsZShjdHgtPmxjZF9jbGspOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBmaW5kIHJlZ2lzdGVyc1xuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2NsazsKKwl9CisKKwljdHgtPnJlZ3NfcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQkJICAgZGV2X25hbWUoZGV2KSk7CisJaWYgKCFjdHgtPnJlZ3NfcmVzKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNsYWltIHJlZ2lzdGVyIHJlZ2lvblxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2NsazsKKwl9CisKKwljdHgtPnJlZ3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFjdHgtPnJlZ3MpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gbWFwIHJlZ2lzdGVyc1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnJfcmVxX3JlZ2lvbl9pbzsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoZGV2LCAiaXJxIHJlcXVlc3QgZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX3JlcV9yZWdpb25faXJxOworCX0KKworCWN0eC0+aXJxID0gcmVzLT5zdGFydDsKKworCWZvciAod2luID0gMDsgd2luIDwgV0lORE9XU19OUjsgd2luKyspCisJCWZpbWRfY2xlYXJfd2luKGN0eCwgd2luKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGN0eC0+aXJxLCBmaW1kX2lycV9oYW5kbGVyLCAwLCAiZHJtX2ZpbWQiLCBjdHgpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiaXJxIHJlcXVlc3QgZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX3JlcV9pcnE7CisJfQorCisJY3R4LT5jbGtkaXYgPSBmaW1kX2NhbGNfY2xrZGl2KGN0eCwgdGltaW5nKTsKKwljdHgtPnZpZGNvbjAgPSBwZGF0YS0+dmlkY29uMDsKKwljdHgtPnZpZGNvbjEgPSBwZGF0YS0+dmlkY29uMTsKKwljdHgtPmRlZmF1bHRfd2luID0gcGRhdGEtPmRlZmF1bHRfd2luOworCWN0eC0+dGltaW5nID0gdGltaW5nOworCisJdGltaW5nLT5waXhjbG9jayA9IGNsa19nZXRfcmF0ZShjdHgtPmxjZF9jbGspIC8gY3R4LT5jbGtkaXY7CisKKwlEUk1fREVCVUdfS01TKCJwaXhlbCBjbG9jayA9ICVkLCBjbGtkaXYgPSAlZFxuIiwKKwkJCXRpbWluZy0+cGl4Y2xvY2ssIGN0eC0+Y2xrZGl2KTsKKworCXN1YmRydiA9ICZjdHgtPnN1YmRydjsKKworCXN1YmRydi0+cHJvYmUgPSBmaW1kX3N1YmRydl9wcm9iZTsKKwlzdWJkcnYtPnJlbW92ZSA9IGZpbWRfc3ViZHJ2X3JlbW92ZTsKKwlzdWJkcnYtPm1hbmFnZXIucGlwZSA9IC0xOworCXN1YmRydi0+bWFuYWdlci5vcHMgPSAmZmltZF9tYW5hZ2VyX29wczsKKwlzdWJkcnYtPm1hbmFnZXIub3ZlcmxheV9vcHMgPSAmZmltZF9vdmVybGF5X29wczsKKwlzdWJkcnYtPm1hbmFnZXIuZGlzcGxheSA9ICZmaW1kX2Rpc3BsYXk7CisJc3ViZHJ2LT5tYW5hZ2VyLmRldiA9IGRldjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7CisJZXh5bm9zX2RybV9zdWJkcnZfcmVnaXN0ZXIoc3ViZHJ2KTsKKworCXJldHVybiAwOworCitlcnJfcmVxX2lycToKK2Vycl9yZXFfcmVnaW9uX2lycToKKwlpb3VubWFwKGN0eC0+cmVncyk7CisKK2Vycl9yZXFfcmVnaW9uX2lvOgorCXJlbGVhc2VfcmVzb3VyY2UoY3R4LT5yZWdzX3Jlcyk7CisJa2ZyZWUoY3R4LT5yZWdzX3Jlcyk7CisKK2Vycl9jbGs6CisJY2xrX2Rpc2FibGUoY3R4LT5sY2RfY2xrKTsKKwljbGtfcHV0KGN0eC0+bGNkX2Nsayk7CisKK2Vycl9idXNfY2xrOgorCWNsa19kaXNhYmxlKGN0eC0+YnVzX2Nsayk7CisJY2xrX3B1dChjdHgtPmJ1c19jbGspOworCitlcnJfY2xrX2dldDoKKwlrZnJlZShjdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGZpbWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGZpbWRfY29udGV4dCAqY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJZXh5bm9zX2RybV9zdWJkcnZfdW5yZWdpc3RlcigmY3R4LT5zdWJkcnYpOworCisJY2xrX2Rpc2FibGUoY3R4LT5sY2RfY2xrKTsKKwljbGtfZGlzYWJsZShjdHgtPmJ1c19jbGspOworCWNsa19wdXQoY3R4LT5sY2RfY2xrKTsKKwljbGtfcHV0KGN0eC0+YnVzX2Nsayk7CisKKwlpb3VubWFwKGN0eC0+cmVncyk7CisJcmVsZWFzZV9yZXNvdXJjZShjdHgtPnJlZ3NfcmVzKTsKKwlrZnJlZShjdHgtPnJlZ3NfcmVzKTsKKwlmcmVlX2lycShjdHgtPmlycSwgY3R4KTsKKworCWtmcmVlKGN0eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZmltZF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGZpbWRfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChmaW1kX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImV4eW5vczQtZmIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZmltZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZmltZF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmltZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZpbWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZmltZF9pbml0KTsKK21vZHVsZV9leGl0KGZpbWRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIklua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBEUk0gRklNRCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU3YTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dlbS5jCkBAIC0wLDAgKzEsNDE1IEBACisvKiBleHlub3NfZHJtX2dlbS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IElua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorCisjaW5jbHVkZSA8ZHJtL2V4eW5vc19kcm0uaD4KKworI2luY2x1ZGUgImV4eW5vc19kcm1fZHJ2LmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9nZW0uaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2J1Zi5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGNvbnZlcnRfdG9fdm1fZXJyX21zZyhpbnQgbXNnKQoreworCXVuc2lnbmVkIGludCBvdXRfbXNnOworCisJc3dpdGNoIChtc2cpIHsKKwljYXNlIDA6CisJY2FzZSAtRVJFU1RBUlRTWVM6CisJY2FzZSAtRUlOVFI6CisJCW91dF9tc2cgPSBWTV9GQVVMVF9OT1BBR0U7CisJCWJyZWFrOworCisJY2FzZSAtRU5PTUVNOgorCQlvdXRfbXNnID0gVk1fRkFVTFRfT09NOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCW91dF9tc2cgPSBWTV9GQVVMVF9TSUdCVVM7CisJCWJyZWFrOworCX0KKworCXJldHVybiBvdXRfbXNnOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9nZW1fbW1hcF9vZmZzZXQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCXJldHVybiAodW5zaWduZWQgaW50KW9iai0+bWFwX2xpc3QuaGFzaC5rZXkgPDwgUEFHRV9TSElGVDsKK30KKworc3RydWN0IGV4eW5vc19kcm1fZ2VtX29iaiAqZXh5bm9zX2RybV9nZW1fY3JlYXRlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJdW5zaWduZWQgaW50ICpoYW5kbGUpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZ2VtX29iaiAqZXh5bm9zX2dlbV9vYmo7CisJc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlpbnQgcmV0OworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCXNpemUgPSByb3VuZHVwKHNpemUsIFBBR0VfU0laRSk7CisKKwlleHlub3NfZ2VtX29iaiA9IGt6YWxsb2Moc2l6ZW9mKCpleHlub3NfZ2VtX29iaiksIEdGUF9LRVJORUwpOworCWlmICghZXh5bm9zX2dlbV9vYmopIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgZXh5bm9zIGdlbSBvYmplY3QuXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJLyogYWxsb2NhdGUgdGhlIG5ldyBidWZmZXIgb2JqZWN0IGFuZCBtZW1vcnkgcmVnaW9uLiAqLworCWVudHJ5ID0gZXh5bm9zX2RybV9idWZfY3JlYXRlKGRldiwgc2l6ZSk7CisJaWYgKCFlbnRyeSkgeworCQlrZnJlZShleHlub3NfZ2VtX29iaik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWV4eW5vc19nZW1fb2JqLT5lbnRyeSA9IGVudHJ5OworCisJb2JqID0gJmV4eW5vc19nZW1fb2JqLT5iYXNlOworCisJcmV0ID0gZHJtX2dlbV9vYmplY3RfaW5pdChkZXYsIG9iaiwgc2l6ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdGFpbGl6ZSBnZW0gb2JqZWN0LlxuIik7CisJCWdvdG8gZXJyX29ial9pbml0OworCX0KKworCURSTV9ERUJVR19LTVMoImNyZWF0ZWQgZmlsZSBvYmplY3QgPSAweCV4XG4iLCAodW5zaWduZWQgaW50KW9iai0+ZmlscCk7CisKKwlyZXQgPSBkcm1fZ2VtX2NyZWF0ZV9tbWFwX29mZnNldChvYmopOworCWlmIChyZXQgPCAwKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIG1tYXAgb2Zmc2V0LlxuIik7CisJCWdvdG8gZXJyX2NyZWF0ZV9tbWFwX29mZnNldDsKKwl9CisKKwkvKgorCSAqIGFsbG9jYXRlIGEgaWQgb2YgaWRyIHRhYmxlIHdoZXJlIHRoZSBvYmogaXMgcmVnaXN0ZXJlZAorCSAqIGFuZCBoYW5kbGUgaGFzIHRoZSBpZCB3aGF0IHVzZXIgY2FuIHNlZS4KKwkgKi8KKwlyZXQgPSBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZV9wcml2LCBvYmosIGhhbmRsZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaGFuZGxlX2NyZWF0ZTsKKworCURSTV9ERUJVR19LTVMoImdlbSBoYW5kbGUgPSAweCV4XG4iLCAqaGFuZGxlKTsKKworCS8qIGRyb3AgcmVmZXJlbmNlIGZyb20gYWxsb2NhdGUgLSBoYW5kbGUgaG9sZHMgaXQgbm93LiAqLworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKG9iaik7CisKKwlyZXR1cm4gZXh5bm9zX2dlbV9vYmo7CisKK2Vycl9oYW5kbGVfY3JlYXRlOgorCWRybV9nZW1fZnJlZV9tbWFwX29mZnNldChvYmopOworCitlcnJfY3JlYXRlX21tYXBfb2Zmc2V0OgorCWRybV9nZW1fb2JqZWN0X3JlbGVhc2Uob2JqKTsKKworZXJyX29ial9pbml0OgorCWV4eW5vc19kcm1fYnVmX2Rlc3Ryb3koZGV2LCBleHlub3NfZ2VtX29iai0+ZW50cnkpOworCisJa2ZyZWUoZXh5bm9zX2dlbV9vYmopOworCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworaW50IGV4eW5vc19kcm1fZ2VtX2NyZWF0ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2V4eW5vc19nZW1fY3JlYXRlICphcmdzID0gZGF0YTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9nZW1fb2JqICpleHlub3NfZ2VtX29iajsKKworCURSTV9ERUJVR19LTVMoIiVzIDogc2l6ZSA9IDB4JXhcbiIsIF9fRklMRV9fLCBhcmdzLT5zaXplKTsKKworCWV4eW5vc19nZW1fb2JqID0gZXh5bm9zX2RybV9nZW1fY3JlYXRlKGZpbGVfcHJpdiwgZGV2LCBhcmdzLT5zaXplLAorCQkJJmFyZ3MtPmhhbmRsZSk7CisJaWYgKElTX0VSUihleHlub3NfZ2VtX29iaikpCisJCXJldHVybiBQVFJfRVJSKGV4eW5vc19nZW1fb2JqKTsKKworCXJldHVybiAwOworfQorCitpbnQgZXh5bm9zX2RybV9nZW1fbWFwX29mZnNldF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2V4eW5vc19nZW1fbWFwX29mZiAqYXJncyA9IGRhdGE7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJRFJNX0RFQlVHX0tNUygiaGFuZGxlID0gMHgleCwgb2Zmc2V0ID0gMHglbHhcbiIsCisJCQlhcmdzLT5oYW5kbGUsICh1bnNpZ25lZCBsb25nKWFyZ3MtPm9mZnNldCk7CisKKwlpZiAoIShkZXYtPmRyaXZlci0+ZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX0dFTSkpIHsKKwkJRFJNX0VSUk9SKCJkb2VzIG5vdCBzdXBwb3J0IEdFTS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gZXh5bm9zX2RybV9nZW1fZHVtYl9tYXBfb2Zmc2V0KGZpbGVfcHJpdiwgZGV2LCBhcmdzLT5oYW5kbGUsCisJCQkmYXJncy0+b2Zmc2V0KTsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX2dlbV9tbWFwX2J1ZmZlcihzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGV4eW5vc19kcm1fZ2VtX29iaiAqZXh5bm9zX2dlbV9vYmogPSB0b19leHlub3NfZ2VtX29iaihvYmopOworCXN0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBwZm4sIHZtX3NpemU7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJdm1hLT52bV9mbGFncyB8PSAoVk1fSU8gfCBWTV9SRVNFUlZFRCk7CisKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworCXZtYS0+dm1fZmlsZSA9IGZpbHA7CisKKwl2bV9zaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCS8qCisJICogYSBlbnRyeSBjb250YWlucyBpbmZvcm1hdGlvbiB0byBwaHlzaWNhbGx5IGNvbnRpbnVvdXMgbWVtb3J5CisJICogYWxsb2NhdGVkIGJ5IHVzZXIgcmVxdWVzdCBvciBhdCBmcmFtZWJ1ZmZlciBjcmVhdGlvbi4KKwkgKi8KKwllbnRyeSA9IGV4eW5vc19nZW1fb2JqLT5lbnRyeTsKKworCS8qIGNoZWNrIGlmIHVzZXItcmVxdWVzdGVkIHNpemUgaXMgdmFsaWQuICovCisJaWYgKHZtX3NpemUgPiBlbnRyeS0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIGdldCBwYWdlIGZyYW1lIG51bWJlciB0byBwaHlzaWNhbCBtZW1vcnkgdG8gYmUgbWFwcGVkCisJICogdG8gdXNlciBzcGFjZS4KKwkgKi8KKwlwZm4gPSBleHlub3NfZ2VtX29iai0+ZW50cnktPnBhZGRyID4+IFBBR0VfU0hJRlQ7CisKKwlEUk1fREVCVUdfS01TKCJwZm4gPSAweCVseFxuIiwgcGZuKTsKKworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBwZm4sIHZtX3NpemUsCisJCQkJdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlbWFwIHBmbiByYW5nZS5cbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh5bm9zX2RybV9nZW1fZm9wcyA9IHsKKwkubW1hcCA9IGV4eW5vc19kcm1fZ2VtX21tYXBfYnVmZmVyLAorfTsKKworaW50IGV4eW5vc19kcm1fZ2VtX21tYXBfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9leHlub3NfZ2VtX21tYXAgKmFyZ3MgPSBkYXRhOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCXVuc2lnbmVkIGludCBhZGRyOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmICghKGRldi0+ZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBEUklWRVJfR0VNKSkgeworCQlEUk1fRVJST1IoImRvZXMgbm90IHN1cHBvcnQgR0VNLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlpZiAoIW9iaikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBsb29rdXAgZ2VtIG9iamVjdC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvYmotPmZpbHAtPmZfb3AgPSAmZXh5bm9zX2RybV9nZW1fZm9wczsKKwlvYmotPmZpbHAtPnByaXZhdGVfZGF0YSA9IG9iajsKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJYWRkciA9IGRvX21tYXAob2JqLT5maWxwLCAwLCBhcmdzLT5zaXplLAorCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgMCk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChvYmopOworCisJaWYgKElTX0VSUigodm9pZCAqKWFkZHIpKQorCQlyZXR1cm4gUFRSX0VSUigodm9pZCAqKWFkZHIpOworCisJYXJncy0+bWFwcGVkID0gYWRkcjsKKworCURSTV9ERUJVR19LTVMoIm1hcHBlZCA9IDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZylhcmdzLT5tYXBwZWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBleHlub3NfZHJtX2dlbV9pbml0X29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXh5bm9zX2RybV9nZW1fZnJlZV9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW1fb2JqKQoreworCXN0cnVjdCBleHlub3NfZHJtX2dlbV9vYmogKmV4eW5vc19nZW1fb2JqOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCURSTV9ERUJVR19LTVMoImhhbmRsZSBjb3VudCA9ICVkXG4iLAorCQkJYXRvbWljX3JlYWQoJmdlbV9vYmotPmhhbmRsZV9jb3VudCkpOworCisJaWYgKGdlbV9vYmotPm1hcF9saXN0Lm1hcCkKKwkJZHJtX2dlbV9mcmVlX21tYXBfb2Zmc2V0KGdlbV9vYmopOworCisJLyogcmVsZWFzZSBmaWxlIHBvaW50ZXIgdG8gZ2VtIG9iamVjdC4gKi8KKwlkcm1fZ2VtX29iamVjdF9yZWxlYXNlKGdlbV9vYmopOworCisJZXh5bm9zX2dlbV9vYmogPSB0b19leHlub3NfZ2VtX29iaihnZW1fb2JqKTsKKworCWV4eW5vc19kcm1fYnVmX2Rlc3Ryb3koZ2VtX29iai0+ZGV2LCBleHlub3NfZ2VtX29iai0+ZW50cnkpOworCisJa2ZyZWUoZXh5bm9zX2dlbV9vYmopOworfQorCitpbnQgZXh5bm9zX2RybV9nZW1fZHVtYl9jcmVhdGUoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbW9kZV9jcmVhdGVfZHVtYiAqYXJncykKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9nZW1fb2JqICpleHlub3NfZ2VtX29iajsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKgorCSAqIGFsb2NhdGUgbWVtb3J5IHRvIGJlIHVzZWQgZm9yIGZyYW1lYnVmZmVyLgorCSAqIC0gdGhpcyBjYWxsYmFjayB3b3VsZCBiZSBjYWxsZWQgYnkgdXNlciBhcHBsaWNhdGlvbgorCSAqCXdpdGggRFJNX0lPQ1RMX01PREVfQ1JFQVRFX0RVTUIgY29tbWFuZC4KKwkgKi8KKworCWFyZ3MtPnBpdGNoID0gYXJncy0+d2lkdGggKiBhcmdzLT5icHAgPj4gMzsKKwlhcmdzLT5zaXplID0gYXJncy0+cGl0Y2ggKiBhcmdzLT5oZWlnaHQ7CisKKwlleHlub3NfZ2VtX29iaiA9IGV4eW5vc19kcm1fZ2VtX2NyZWF0ZShmaWxlX3ByaXYsIGRldiwgYXJncy0+c2l6ZSwKKwkJCQkJCQkmYXJncy0+aGFuZGxlKTsKKwlpZiAoSVNfRVJSKGV4eW5vc19nZW1fb2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIoZXh5bm9zX2dlbV9vYmopOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBleHlub3NfZHJtX2dlbV9kdW1iX21hcF9vZmZzZXQoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGhhbmRsZSwgdWludDY0X3QgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9nZW1fb2JqICpleHlub3NfZ2VtX29iajsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwkvKgorCSAqIGdldCBvZmZzZXQgb2YgbWVtb3J5IGFsbG9jYXRlZCBmb3IgZHJtIGZyYW1lYnVmZmVyLgorCSAqIC0gdGhpcyBjYWxsYmFjayB3b3VsZCBiZSBjYWxsZWQgYnkgdXNlciBhcHBsaWNhdGlvbgorCSAqCXdpdGggRFJNX0lPQ1RMX01PREVfTUFQX0RVTUIgY29tbWFuZC4KKwkgKi8KKworCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgaGFuZGxlKTsKKwlpZiAoIW9iaikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBsb29rdXAgZ2VtIG9iamVjdC5cbiIpOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXh5bm9zX2dlbV9vYmogPSB0b19leHlub3NfZ2VtX29iaihvYmopOworCisJKm9mZnNldCA9IGdldF9nZW1fbW1hcF9vZmZzZXQoJmV4eW5vc19nZW1fb2JqLT5iYXNlKTsKKworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisKKwlEUk1fREVCVUdfS01TKCJvZmZzZXQgPSAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpKm9mZnNldCk7CisKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCXJldHVybiAwOworfQorCitpbnQgZXh5bm9zX2RybV9nZW1fZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQoreworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJc3RydWN0IGV4eW5vc19kcm1fZ2VtX29iaiAqZXh5bm9zX2dlbV9vYmogPSB0b19leHlub3NfZ2VtX29iaihvYmopOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlwZ29mZl90IHBhZ2Vfb2Zmc2V0OworCWludCByZXQ7CisKKwlwYWdlX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzcyAtCisJCQl2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJcGZuID0gKGV4eW5vc19nZW1fb2JqLT5lbnRyeS0+cGFkZHIgPj4gUEFHRV9TSElGVCkgKyBwYWdlX29mZnNldDsKKworCXJldCA9IHZtX2luc2VydF9taXhlZCh2bWEsICh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzLCBwZm4pOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlyZXR1cm4gY29udmVydF90b192bV9lcnJfbXNnKHJldCk7Cit9CisKK2ludCBleHlub3NfZHJtX2dlbV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcmV0OworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIHNldCB2bV9hcmVhX3N0cnVjdC4gKi8KKwlyZXQgPSBkcm1fZ2VtX21tYXAoZmlscCwgdm1hKTsKKwlpZiAocmV0IDwgMCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBtbWFwLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJdm1hLT52bV9mbGFncyAmPSB+Vk1fUEZOTUFQOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fTUlYRURNQVA7CisKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBleHlub3NfZHJtX2dlbV9kdW1iX2Rlc3Ryb3koc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBoYW5kbGUpCit7CisJaW50IHJldDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKgorCSAqIG9iai0+cmVmY291bnQgYW5kIG9iai0+aGFuZGxlX2NvdW50IGFyZSBkZWNyZWFzZWQgYW5kCisJICogaWYgYm90aCB0aGVtIGFyZSAwIHRoZW4gZXh5bm9zX2RybV9nZW1fZnJlZV9vYmplY3QoKQorCSAqIHdvdWxkIGJlIGNhbGxlZCBieSBjYWxsYmFjayB0byByZWxlYXNlIHJlc291cmNlcy4KKwkgKi8KKwlyZXQgPSBkcm1fZ2VtX2hhbmRsZV9kZWxldGUoZmlsZV9wcml2LCBoYW5kbGUpOworCWlmIChyZXQgPCAwKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGRlbGV0ZSBkcm1fZ2VtX2hhbmRsZS5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU29DIERSTSBHRU0gTW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ2VtLmggYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmYzAxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nZW0uaApAQCAtMCwwICsxLDEwNyBAQAorLyogZXh5bm9zX2RybV9nZW0uaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9lcjogSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0VYWU5PU19EUk1fR0VNX0hfCisjZGVmaW5lIF9FWFlOT1NfRFJNX0dFTV9IXworCisjZGVmaW5lIHRvX2V4eW5vc19nZW1fb2JqKHgpCWNvbnRhaW5lcl9vZih4LFwKKwkJCXN0cnVjdCBleHlub3NfZHJtX2dlbV9vYmosIGJhc2UpCisKKy8qCisgKiBleHlub3MgZHJtIGJ1ZmZlciBzdHJ1Y3R1cmUuCisgKgorICogQGJhc2U6IGEgZ2VtIG9iamVjdC4KKyAqCS0gYSBuZXcgaGFuZGxlIHRvIHRoaXMgZ2VtIG9iamVjdCB3b3VsZCBiZSBjcmVhdGVkCisgKglieSBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoKS4KKyAqIEBlbnRyeTogcG9pbnRlciB0byBleHlub3MgZHJtIGJ1ZmZlciBlbnRyeSBvYmplY3QuCisgKgktIGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIHRvIHBoeXNpY2FsbHkKKyAqCWNvbnRpbnVvdXMgbWVtb3J5IHJlZ2lvbiBhbGxvY2F0ZWQgYnkgdXNlciByZXF1ZXN0CisgKglvciBhdCBmcmFtZWJ1ZmZlciBjcmVhdGlvbi4KKyAqCisgKiBQLlMuIHRoaXMgb2JqZWN0IHdvdWxkIGJlIHRyYW5zZmVyZWQgdG8gdXNlciBhcyBrbXNfYm8uaGFuZGxlIHNvCisgKgl1c2VyIGNhbiBhY2Nlc3MgdGhlIGJ1ZmZlciB0aHJvdWdoIGttc19iby5oYW5kbGUuCisgKi8KK3N0cnVjdCBleHlub3NfZHJtX2dlbV9vYmogeworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCBiYXNlOworCXN0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZW50cnk7Cit9OworCisvKiBjcmVhdGUgYSBuZXcgYnVmZmVyIGFuZCBnZXQgYSBuZXcgZ2VtIGhhbmRsZS4gKi8KK3N0cnVjdCBleHlub3NfZHJtX2dlbV9vYmogKmV4eW5vc19kcm1fZ2VtX2NyZWF0ZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHNpemUsCisJCXVuc2lnbmVkIGludCAqaGFuZGxlKTsKKworLyoKKyAqIHJlcXVlc3QgZ2VtIG9iamVjdCBjcmVhdGlvbiBhbmQgYnVmZmVyIGFsbG9jYXRpb24gYXMgdGhlIHNpemUKKyAqIHRoYXQgaXQgaXMgY2FsY3VsYXRlZCB3aXRoIGZyYW1lYnVmZmVyIGluZm9ybWF0aW9uIHN1Y2ggYXMgd2lkdGgsCisgKiBoZWlnaHQgYW5kIGJwcC4KKyAqLworaW50IGV4eW5vc19kcm1fZ2VtX2NyZWF0ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CisKKy8qIGdldCBidWZmZXIgb2Zmc2V0IHRvIG1hcCB0byB1c2VyIHNwYWNlLiAqLworaW50IGV4eW5vc19kcm1fZ2VtX21hcF9vZmZzZXRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworCisvKiB1bm1hcCBhIGJ1ZmZlciBmcm9tIHVzZXIgc3BhY2UuICovCitpbnQgZXh5bm9zX2RybV9nZW1fbXVubWFwX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKKworLyogaW5pdGlhbGl6ZSBnZW0gb2JqZWN0LiAqLworaW50IGV4eW5vc19kcm1fZ2VtX2luaXRfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKKworLyogZnJlZSBnZW0gb2JqZWN0LiAqLwordm9pZCBleHlub3NfZHJtX2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbV9vYmopOworCisvKiBjcmVhdGUgbWVtb3J5IHJlZ2lvbiBmb3IgZHJtIGZyYW1lYnVmZmVyLiAqLworaW50IGV4eW5vc19kcm1fZ2VtX2R1bWJfY3JlYXRlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIgKmFyZ3MpOworCisvKiBtYXAgbWVtb3J5IHJlZ2lvbiBmb3IgZHJtIGZyYW1lYnVmZmVyIHRvIHVzZXIgc3BhY2UuICovCitpbnQgZXh5bm9zX2RybV9nZW1fZHVtYl9tYXBfb2Zmc2V0KHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBoYW5kbGUsIHVpbnQ2NF90ICpvZmZzZXQpOworCisvKiBwYWdlIGZhdWx0IGhhbmRsZXIgYW5kIG1tYXAgZmF1bHQgYWRkcmVzcyh2aXJ0dWFsKSB0byBwaHlzaWNhbCBtZW1vcnkuICovCitpbnQgZXh5bm9zX2RybV9nZW1fZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKTsKKworLyoKKyAqIG1tYXAgdGhlIHBoeXNpY2FsbHkgY29udGludW91cyBtZW1vcnkgdGhhdCBhIGdlbSBvYmplY3QgY29udGFpbnMKKyAqIHRvIHVzZXIgc3BhY2UuCisgKi8KK2ludCBleHlub3NfZHJtX2dlbV9tbWFwX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKKworLyogc2V0IHZtX2ZsYWdzIGFuZCB3ZSBjYW4gY2hhbmdlIHRoZSB2bSBhdHRyaWJ1dGUgdG8gb3RoZXIgb25lIGF0IGhlcmUuICovCitpbnQgZXh5bm9zX2RybV9nZW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCisvKgorICogZGVzdHJveSBtZW1vcnkgcmVnaW9uIGFsbG9jYXRlZC4KKyAqCS0gYSBnZW0gaGFuZGxlIGFuZCBwaHlzaWNhbCBtZW1vcnkgcmVnaW9uIHBvaW50ZWQgYnkgYSBnZW0gb2JqZWN0CisgKgl3b3VsZCBiZSByZWxlYXNlZCBieSBkcm1fZ2VtX2hhbmRsZV9kZWxldGUoKS4KKyAqLworaW50IGV4eW5vc19kcm1fZ2VtX2R1bWJfZGVzdHJveShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGhhbmRsZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2kyYy9jaDcwMDZfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTJjL2NoNzAwNl9kcnYuYwppbmRleCAwODc5MmE3Li4wN2Q1NWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTJjL2NoNzAwNl9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTJjL2NoNzAwNl9kcnYuYwpAQCAtMjQsNiArMjQsOCBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlICJjaDcwMDZfcHJpdi5oIgogCiAvKiBEUk0gZW5jb2RlciBmdW5jdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvc2lsMTY0X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9zaWwxNjRfZHJ2LmMKaW5kZXggMGI2NzczMi4uYjdkNDVhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2kyYy9zaWwxNjRfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9zaWwxNjRfZHJ2LmMKQEAgLTI0LDYgKzI0LDggQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgogI2luY2x1ZGUgImRybV9lbmNvZGVyX3NsYXZlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kcnYuYwppbmRleCA2Zjk4ZDA1Li5kNDI2NmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pODEwL2k4MTBfZHJ2LmMKQEAgLTMwLDYgKzMwLDggQEAKICAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAiaTgxMF9kcm0uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDcwMTcuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDcwMTcuYwppbmRleCBkM2U4YzU0Li4xY2E3OTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3MDE3LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoNzAxNy5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIAlkZWZhdWx0OgogCQlEUk1fREVCVUdfS01TKCJjaDcwMXggbm90IGRldGVjdGVkLCBnb3QgJWQ6IGZyb20gJXMgIgogCQkJICAgICAgInNsYXZlICVkLlxuIiwKLQkJCSAgICAgIHZhbCwgYWRhcHRlci0+bmFtZSxkdm8tPnNsYXZlX2FkZHIpOworCQkJICAgICAgdmFsLCBhZGFwdGVyLT5uYW1lLCBkdm8tPnNsYXZlX2FkZHIpOwogCQlnb3RvIGZhaWw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3eHh4LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3eHh4LmMKaW5kZXggN2VhYTk0ZS4uNGEwMzY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoN3h4eC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDd4eHguYwpAQCAtMTExLDcgKzExMSw3IEBACiAvKiogUmVhZHMgYW4gOCBiaXQgcmVnaXN0ZXIgKi8KIHN0YXRpYyBib29sIGNoN3h4eF9yZWFkYihzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLCBpbnQgYWRkciwgdWludDhfdCAqY2gpCiB7Ci0Jc3RydWN0IGNoN3h4eF9wcml2ICpjaDd4eHg9IGR2by0+ZGV2X3ByaXY7CisJc3RydWN0IGNoN3h4eF9wcml2ICpjaDd4eHggPSBkdm8tPmRldl9wcml2OwogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGR2by0+aTJjX2J1czsKIAl1OCBvdXRfYnVmWzJdOwogCXU4IGluX2J1ZlsyXTsKQEAgLTMwMyw3ICszMDMsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IENIN3h4eF9OVU1fUkVHUzsgaSsrKSB7CiAJCXVpbnQ4X3QgdmFsOwotCQlpZiAoKGkgJSA4KSA9PSAwICkKKwkJaWYgKChpICUgOCkgPT0gMCkKIAkJCURSTV9MT0dfS01TKCJcbiAlMDJYOiAiLCBpKTsKIAkJY2g3eHh4X3JlYWRiKGR2bywgaSwgJnZhbCk7CiAJCURSTV9MT0dfS01TKCIlMDJYICIsIHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9faXZjaC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2l2Y2guYwppbmRleCBhMTJlZDk0Li4wNGYyODkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9faXZjaC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19pdmNoLmMKQEAgLTM0NCw4ICszNDQsOCBAQAogCQkJICAgKGFkanVzdGVkX21vZGUtPmhkaXNwbGF5IC0gMSkpID4+IDI7CiAJCXlfcmF0aW8gPSAoKChtb2RlLT52ZGlzcGxheSAtIDEpIDw8IDE2KSAvCiAJCQkgICAoYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkgLSAxKSkgPj4gMjsKLQkJaXZjaF93cml0ZSAoZHZvLCBWUjQyLCB4X3JhdGlvKTsKLQkJaXZjaF93cml0ZSAoZHZvLCBWUjQxLCB5X3JhdGlvKTsKKwkJaXZjaF93cml0ZShkdm8sIFZSNDIsIHhfcmF0aW8pOworCQlpdmNoX3dyaXRlKGR2bywgVlI0MSwgeV9yYXRpbyk7CiAJfSBlbHNlIHsKIAkJdnIwMSAmPSB+VlIwMV9QQU5FTF9GSVRfRU5BQkxFOwogCQl2cjQwICY9IH5WUjQwX0NMT0NLX0dBVElOR19FTkFCTEU7CkBAIC00MTAsNyArNDEwLDcgQEAKIAl9CiB9CiAKLXN0cnVjdCBpbnRlbF9kdm9fZGV2X29wcyBpdmNoX29wcz0geworc3RydWN0IGludGVsX2R2b19kZXZfb3BzIGl2Y2hfb3BzID0gewogCS5pbml0ID0gaXZjaF9pbml0LAogCS5kcG1zID0gaXZjaF9kcG1zLAogCS5tb2RlX3ZhbGlkID0gaXZjaF9tb2RlX3ZhbGlkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3NpbDE2NC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3NpbDE2NC5jCmluZGV4IGU0YjQwOTEuLmEwYjEzYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19zaWwxNjQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fc2lsMTY0LmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiBzdGF0aWMgYm9vbCBzaWwxNjRfd3JpdGViKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sIGludCBhZGRyLCB1aW50OF90IGNoKQogewotCXN0cnVjdCBzaWwxNjRfcHJpdiAqc2lsPSBkdm8tPmRldl9wcml2OworCXN0cnVjdCBzaWwxNjRfcHJpdiAqc2lsID0gZHZvLT5kZXZfcHJpdjsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkdm8tPmkyY19idXM7CiAJdWludDhfdCBvdXRfYnVmWzJdOwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b190ZnA0MTAuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b190ZnA0MTAuYwppbmRleCA4YWIyODU1Li5hYTJjZDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fdGZwNDEwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3RmcDQxMC5jCkBAIC01Niw3ICs1Niw3IEBACiAjZGVmaW5lIFRGUDQxMF9DVExfMl9NREkJKDE8PDApCiAKICNkZWZpbmUgVEZQNDEwX0NUTF8zCQkweDBBCi0jZGVmaW5lIFRGUDQxMF9DVExfM19ES19NQVNLIAkoMHg3PDw1KQorI2RlZmluZSBURlA0MTBfQ1RMXzNfREtfTUFTSwkoMHg3PDw1KQogI2RlZmluZSBURlA0MTBfQ1RMXzNfREsJCSgxPDw1KQogI2RlZmluZSBURlA0MTBfQ1RMXzNfREtFTgkoMTw8NCkKICNkZWZpbmUgVEZQNDEwX0NUTF8zX0NUTF9NQVNLCSgweDc8PDEpCkBAIC0yMjUsMTIgKzIyNSwxMiBAQAogCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAogCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQogewotICAgIC8qIEFzIGxvbmcgYXMgdGhlIGJhc2ljcyBhcmUgc2V0IHVwLCBzaW5jZSB3ZSBkb24ndCBoYXZlIGNsb2NrIGRlcGVuZGVuY2llcwotICAgICAqIGluIHRoZSBtb2RlIHNldHVwLCB3ZSBjYW4ganVzdCBsZWF2ZSB0aGUgcmVnaXN0ZXJzIGFsb25lIGFuZCBldmVyeXRoaW5nCi0gICAgICogd2lsbCB3b3JrIGZpbmUuCi0gICAgICovCi0gICAgLyogZG9uJ3QgZG8gbXVjaCAqLwotICAgIHJldHVybjsKKwkvKiBBcyBsb25nIGFzIHRoZSBiYXNpY3MgYXJlIHNldCB1cCwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBjbG9jayBkZXBlbmRlbmNpZXMKKwkqIGluIHRoZSBtb2RlIHNldHVwLCB3ZSBjYW4ganVzdCBsZWF2ZSB0aGUgcmVnaXN0ZXJzIGFsb25lIGFuZCBldmVyeXRoaW5nCisJKiB3aWxsIHdvcmsgZmluZS4KKwkqLworCS8qIGRvbid0IGRvIG11Y2ggKi8KKwlyZXR1cm47CiB9CiAKIC8qIHNldCB0aGUgdGZwNDEwIHBvd2VyIHN0YXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCmluZGV4IDNjMzk1YTUuLjRmNDBmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKQEAgLTk4LDEyICs5OSwxMiBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3RpbGluZ19mbGFnKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0gICAgc3dpdGNoIChvYmotPnRpbGluZ19tb2RlKSB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEk5MTVfVElMSU5HX05PTkU6IHJldHVybiAiICI7Ci0gICAgY2FzZSBJOTE1X1RJTElOR19YOiByZXR1cm4gIlgiOwotICAgIGNhc2UgSTkxNV9USUxJTkdfWTogcmV0dXJuICJZIjsKLSAgICB9CisJc3dpdGNoIChvYmotPnRpbGluZ19tb2RlKSB7CisJZGVmYXVsdDoKKwljYXNlIEk5MTVfVElMSU5HX05PTkU6IHJldHVybiAiICI7CisJY2FzZSBJOTE1X1RJTElOR19YOiByZXR1cm4gIlgiOworCWNhc2UgSTkxNV9USUxJTkdfWTogcmV0dXJuICJZIjsKKwl9CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpjYWNoZV9sZXZlbF9zdHIoaW50IHR5cGUpCkBAIC0yMTcsNyArMjE4LDcgQEAKIAkJCSsrbWFwcGFibGVfY291bnQ7IFwKIAkJfSBcCiAJfSBcCi19IHdoaWxlKDApCit9IHdoaWxlICgwKQogCiBzdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCogZGF0YSkKIHsKQEAgLTEyOTMsMTIgKzEyOTQsMTIgQEAKIAljaGFyIGJ1Zls4MF07CiAJaW50IGxlbjsKIAotCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIChidWYpLAorCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCiAJCSAgICAgICAid2VkZ2VkIDogICVkXG4iLAogCQkgICAgICAgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKTsKIAotCWlmIChsZW4gPiBzaXplb2YgKGJ1ZikpCi0JCWxlbiA9IHNpemVvZiAoYnVmKTsKKwlpZiAobGVuID4gc2l6ZW9mKGJ1ZikpCisJCWxlbiA9IHNpemVvZihidWYpOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIG1heCwgcHBvcywgYnVmLCBsZW4pOwogfQpAQCAtMTMxNCw3ICsxMzE1LDcgQEAKIAlpbnQgdmFsID0gMTsKIAogCWlmIChjbnQgPiAwKSB7Ci0JCWlmIChjbnQgPiBzaXplb2YgKGJ1ZikgLSAxKQorCQlpZiAoY250ID4gc2l6ZW9mKGJ1ZikgLSAxKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdWJ1ZiwgY250KSkKQEAgLTEzNTcsMTEgKzEzNTgsMTEgQEAKIAljaGFyIGJ1Zls4MF07CiAJaW50IGxlbjsKIAotCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIChidWYpLAorCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCiAJCSAgICAgICAibWF4IGZyZXE6ICVkXG4iLCBkZXZfcHJpdi0+bWF4X2RlbGF5ICogNTApOwogCi0JaWYgKGxlbiA+IHNpemVvZiAoYnVmKSkKLQkJbGVuID0gc2l6ZW9mIChidWYpOworCWlmIChsZW4gPiBzaXplb2YoYnVmKSkKKwkJbGVuID0gc2l6ZW9mKGJ1Zik7CiAKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgbWF4LCBwcG9zLCBidWYsIGxlbik7CiB9CkBAIC0xMzc4LDcgKzEzNzksNyBAQAogCWludCB2YWwgPSAxOwogCiAJaWYgKGNudCA+IDApIHsKLQkJaWYgKGNudCA+IHNpemVvZiAoYnVmKSAtIDEpCisJCWlmIChjbnQgPiBzaXplb2YoYnVmKSAtIDEpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1YnVmLCBjbnQpKQpAQCAtMTQzMiwxMiArMTQzMywxMiBAQAogCXNucGNyID0gSTkxNV9SRUFEKEdFTjZfTUJDVU5JVF9TTlBDUik7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YgKGJ1ZiksCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKIAkJICAgICAgICIlZFxuIiwgKHNucGNyICYgR0VONl9NQkNfU05QQ1JfTUFTSykgPj4KIAkJICAgICAgIEdFTjZfTUJDX1NOUENSX1NISUZUKTsKIAotCWlmIChsZW4gPiBzaXplb2YgKGJ1ZikpCi0JCWxlbiA9IHNpemVvZiAoYnVmKTsKKwlpZiAobGVuID4gc2l6ZW9mKGJ1ZikpCisJCWxlbiA9IHNpemVvZihidWYpOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIG1heCwgcHBvcywgYnVmLCBsZW4pOwogfQpAQCAtMTQ1NSw3ICsxNDU2LDcgQEAKIAlpbnQgdmFsID0gMTsKIAogCWlmIChjbnQgPiAwKSB7Ci0JCWlmIChjbnQgPiBzaXplb2YgKGJ1ZikgLSAxKQorCQlpZiAoY250ID4gc2l6ZW9mKGJ1ZikgLSAxKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdWJ1ZiwgY250KSkKQEAgLTE1MDUsNyArMTUwNiwxMCBAQAogCW5vZGUtPm1pbm9yID0gbWlub3I7CiAJbm9kZS0+ZGVudCA9IGVudDsKIAlub2RlLT5pbmZvX2VudCA9ICh2b2lkICopIGtleTsKLQlsaXN0X2FkZCgmbm9kZS0+bGlzdCwgJm1pbm9yLT5kZWJ1Z2ZzX25vZGVzLmxpc3QpOworCisJbXV0ZXhfbG9jaygmbWlub3ItPmRlYnVnZnNfbG9jayk7CisJbGlzdF9hZGQoJm5vZGUtPmxpc3QsICZtaW5vci0+ZGVidWdmc19saXN0KTsKKwltdXRleF91bmxvY2soJm1pbm9yLT5kZWJ1Z2ZzX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwppbmRleCA4YTM5NDJjLi5hOTUzM2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC92Z2Ffc3dpdGNoZXJvby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhY3BpL3ZpZGVvLmg+CiAKIHN0YXRpYyB2b2lkIGk5MTVfd3JpdGVfaHdzX3BnYShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtODg0LDcgKzg4NSw3IEBACiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCWRldl9wcml2LT5icmlkZ2VfZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsMCkpOworCWRldl9wcml2LT5icmlkZ2VfZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsIDApKTsKIAlpZiAoIWRldl9wcml2LT5icmlkZ2VfZGV2KSB7CiAJCURSTV9FUlJPUigiYnJpZGdlIGRldmljZSBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CkBAIC0xNzMwLDEwICsxNzMxLDEwIEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgaTkxNV9yZWFkX21jaF92YWwodm9pZCkKIHsKLSAgCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CiAJdW5zaWduZWQgbG9uZyBjaGlwc2V0X3ZhbCwgZ3JhcGhpY3NfdmFsLCByZXQgPSAwOwogCi0gIAlzcGluX2xvY2soJm1jaGRldl9sb2NrKTsKKwlzcGluX2xvY2soJm1jaGRldl9sb2NrKTsKIAlpZiAoIWk5MTVfbWNoX2RldikKIAkJZ290byBvdXRfdW5sb2NrOwogCWRldl9wcml2ID0gaTkxNV9tY2hfZGV2OwpAQCAtMTc0NCw5ICsxNzQ1LDkgQEAKIAlyZXQgPSBjaGlwc2V0X3ZhbCArIGdyYXBoaWNzX3ZhbDsKIAogb3V0X3VubG9jazoKLSAgCXNwaW5fdW5sb2NrKCZtY2hkZXZfbG9jayk7CisJc3Bpbl91bmxvY2soJm1jaGRldl9sb2NrKTsKIAotICAJcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaTkxNV9yZWFkX21jaF92YWwpOwogCkBAIC0xNzU3LDEwICsxNzU4LDEwIEBACiAgKi8KIGJvb2wgaTkxNV9ncHVfcmFpc2Uodm9pZCkKIHsKLSAgCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CiAJYm9vbCByZXQgPSB0cnVlOwogCi0gIAlzcGluX2xvY2soJm1jaGRldl9sb2NrKTsKKwlzcGluX2xvY2soJm1jaGRldl9sb2NrKTsKIAlpZiAoIWk5MTVfbWNoX2RldikgewogCQlyZXQgPSBmYWxzZTsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMTc3MSw5ICsxNzcyLDkgQEAKIAkJZGV2X3ByaXYtPm1heF9kZWxheS0tOwogCiBvdXRfdW5sb2NrOgotICAJc3Bpbl91bmxvY2soJm1jaGRldl9sb2NrKTsKKwlzcGluX3VubG9jaygmbWNoZGV2X2xvY2spOwogCi0gIAlyZXR1cm4gcmV0OworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpOTE1X2dwdV9yYWlzZSk7CiAKQEAgLTE3ODUsMTAgKzE3ODYsMTAgQEAKICAqLwogYm9vbCBpOTE1X2dwdV9sb3dlcih2b2lkKQogewotICAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdjsKIAlib29sIHJldCA9IHRydWU7CiAKLSAgCXNwaW5fbG9jaygmbWNoZGV2X2xvY2spOworCXNwaW5fbG9jaygmbWNoZGV2X2xvY2spOwogCWlmICghaTkxNV9tY2hfZGV2KSB7CiAJCXJldCA9IGZhbHNlOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xNzk5LDkgKzE4MDAsOSBAQAogCQlkZXZfcHJpdi0+bWF4X2RlbGF5Kys7CiAKIG91dF91bmxvY2s6Ci0gIAlzcGluX3VubG9jaygmbWNoZGV2X2xvY2spOworCXNwaW5fdW5sb2NrKCZtY2hkZXZfbG9jayk7CiAKLSAgCXJldHVybiByZXQ7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGk5MTVfZ3B1X2xvd2VyKTsKIApAQCAtMTgxMiwxMCArMTgxMywxMCBAQAogICovCiBib29sIGk5MTVfZ3B1X2J1c3kodm9pZCkKIHsKLSAgCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CiAJYm9vbCByZXQgPSBmYWxzZTsKIAotICAJc3Bpbl9sb2NrKCZtY2hkZXZfbG9jayk7CisJc3Bpbl9sb2NrKCZtY2hkZXZfbG9jayk7CiAJaWYgKCFpOTE1X21jaF9kZXYpCiAJCWdvdG8gb3V0X3VubG9jazsKIAlkZXZfcHJpdiA9IGk5MTVfbWNoX2RldjsKQEAgLTE4MjMsOSArMTgyNCw5IEBACiAJcmV0ID0gZGV2X3ByaXYtPmJ1c3k7CiAKIG91dF91bmxvY2s6Ci0gIAlzcGluX3VubG9jaygmbWNoZGV2X2xvY2spOworCXNwaW5fdW5sb2NrKCZtY2hkZXZfbG9jayk7CiAKLSAgCXJldHVybiByZXQ7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGk5MTVfZ3B1X2J1c3kpOwogCkBAIC0xODM3LDEwICsxODM4LDEwIEBACiAgKi8KIGJvb2wgaTkxNV9ncHVfdHVyYm9fZGlzYWJsZSh2b2lkKQogewotICAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdjsKIAlib29sIHJldCA9IHRydWU7CiAKLSAgCXNwaW5fbG9jaygmbWNoZGV2X2xvY2spOworCXNwaW5fbG9jaygmbWNoZGV2X2xvY2spOwogCWlmICghaTkxNV9tY2hfZGV2KSB7CiAJCXJldCA9IGZhbHNlOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xODUzLDkgKzE4NTQsOSBAQAogCQlyZXQgPSBmYWxzZTsKIAogb3V0X3VubG9jazoKLSAgCXNwaW5fdW5sb2NrKCZtY2hkZXZfbG9jayk7CisJc3Bpbl91bmxvY2soJm1jaGRldl9sb2NrKTsKIAotICAJcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaTkxNV9ncHVfdHVyYm9fZGlzYWJsZSk7CiAKQEAgLTE5NDgsNyArMTk0OSw3IEBACiAKIAlhZ3Bfc2l6ZSA9IGRldl9wcml2LT5tbS5ndHQtPmd0dF9tYXBwYWJsZV9lbnRyaWVzIDw8IFBBR0VfU0hJRlQ7CiAKLSAgICAgICAgZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nID0KKwlkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcgPQogCQlpb19tYXBwaW5nX2NyZWF0ZV93YyhkZXYtPmFncC0+YmFzZSwgYWdwX3NpemUpOwogCWlmIChkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcgPT0gTlVMTCkgewogCQlyZXQgPSAtRUlPOwpAQCAtMjAzNSw3ICsyMDM2LDkgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmVycm9yX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXZfcHJpdi0+cnBzX2xvY2spOwogCi0JaWYgKElTX01PQklMRShkZXYpIHx8ICFJU19HRU4yKGRldikpCisJaWYgKElTX0lWWUJSSURHRShkZXYpKQorCQlkZXZfcHJpdi0+bnVtX3BpcGUgPSAzOworCWVsc2UgaWYgKElTX01PQklMRShkZXYpIHx8ICFJU19HRU4yKGRldikpCiAJCWRldl9wcml2LT5udW1fcGlwZSA9IDI7CiAJZWxzZQogCQlkZXZfcHJpdi0+bnVtX3BpcGUgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKaW5kZXggZjA3ZTQyNS4uZTljMmNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCiAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCiAKIHN0YXRpYyBpbnQgaTkxNV9tb2Rlc2V0IF9fcmVhZF9tb3N0bHkgPSAtMTsKQEAgLTc5LDExICs4MCwxMSBAQAogCQkiVXNlIHBhbmVsIChMVkRTL2VEUCkgZG93bmNsb2NraW5nIGZvciBwb3dlciBzYXZpbmdzICIKIAkJIihkZWZhdWx0OiBmYWxzZSkiKTsKIAotdW5zaWduZWQgaW50IGk5MTVfcGFuZWxfdXNlX3NzYyBfX3JlYWRfbW9zdGx5ID0gMTsKK3Vuc2lnbmVkIGludCBpOTE1X3BhbmVsX3VzZV9zc2MgX19yZWFkX21vc3RseSA9IC0xOwogbW9kdWxlX3BhcmFtX25hbWVkKGx2ZHNfdXNlX3NzYywgaTkxNV9wYW5lbF91c2Vfc3NjLCBpbnQsIDA2MDApOwogTU9EVUxFX1BBUk1fREVTQyhsdmRzX3VzZV9zc2MsCiAJCSJVc2UgU3ByZWFkIFNwZWN0cnVtIENsb2NrIHdpdGggcGFuZWxzIFtMVkRTL2VEUF0gIgotCQkiKGRlZmF1bHQ6IHRydWUpIik7CisJCSIoZGVmYXVsdDogYXV0byBmcm9tIFZCVCkiKTsKIAogaW50IGk5MTVfdmJ0X3Nkdm9fcGFuZWxfdHlwZSBfX3JlYWRfbW9zdGx5ID0gLTE7CiBtb2R1bGVfcGFyYW1fbmFtZWQodmJ0X3Nkdm9fcGFuZWxfdHlwZSwgaTkxNV92YnRfc2R2b19wYW5lbF90eXBlLCBpbnQsIDA2MDApOwpAQCAtMjk0LDcgKzI5NSw3IEBACiAjZGVmaW5lIElOVEVMX1BDSF9DUFRfREVWSUNFX0lEX1RZUEUJMHgxYzAwCiAjZGVmaW5lIElOVEVMX1BDSF9QUFRfREVWSUNFX0lEX1RZUEUJMHgxZTAwCiAKLXZvaWQgaW50ZWxfZGV0ZWN0X3BjaCAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3ZvaWQgaW50ZWxfZGV0ZWN0X3BjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IHBjaV9kZXYgKnBjaDsKQEAgLTM3Nyw3ICszNzgsNyBAQAogCiB2b2lkIF9fZ2VuNl9ndF93YWl0X2Zvcl9maWZvKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKLQlpZiAoZGV2X3ByaXYtPmd0X2ZpZm9fY291bnQgPCBHVF9GSUZPX05VTV9SRVNFUlZFRF9FTlRSSUVTICkgeworCWlmIChkZXZfcHJpdi0+Z3RfZmlmb19jb3VudCA8IEdUX0ZJRk9fTlVNX1JFU0VSVkVEX0VOVFJJRVMpIHsKIAkJaW50IGxvb3AgPSA1MDA7CiAJCXUzMiBmaWZvID0gSTkxNV9SRUFEX05PVFJBQ0UoR1RfRklGT19GUkVFX0VOVFJJRVMpOwogCQl3aGlsZSAoZmlmbyA8PSBHVF9GSUZPX05VTV9SRVNFUlZFRF9FTlRSSUVTICYmIGxvb3AtLSkgewpAQCAtNDcxLDYgKzQ3Miw5IEBACiAJCWVycm9yID0gaTkxNV9nZW1faW5pdF9yaW5nYnVmZmVyKGRldik7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCisJCWlmIChIQVNfUENIX1NQTElUKGRldikpCisJCQlpcm9ubGFrZV9pbml0X3BjaF9yZWZjbGsoZGV2KTsKKwogCQlkcm1fbW9kZV9jb25maWdfcmVzZXQoZGV2KTsKIAkJZHJtX2lycV9pbnN0YWxsKGRldik7CiAKQEAgLTc3MCwxMiArNzc0LDEyIEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpOTE1X3BtX29wcyA9IHsKLSAgICAgLnN1c3BlbmQgPSBpOTE1X3BtX3N1c3BlbmQsCi0gICAgIC5yZXN1bWUgPSBpOTE1X3BtX3Jlc3VtZSwKLSAgICAgLmZyZWV6ZSA9IGk5MTVfcG1fZnJlZXplLAotICAgICAudGhhdyA9IGk5MTVfcG1fdGhhdywKLSAgICAgLnBvd2Vyb2ZmID0gaTkxNV9wbV9wb3dlcm9mZiwKLSAgICAgLnJlc3RvcmUgPSBpOTE1X3BtX3Jlc3VtZSwKKwkuc3VzcGVuZCA9IGk5MTVfcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gaTkxNV9wbV9yZXN1bWUsCisJLmZyZWV6ZSA9IGk5MTVfcG1fZnJlZXplLAorCS50aGF3ID0gaTkxNV9wbV90aGF3LAorCS5wb3dlcm9mZiA9IGk5MTVfcG1fcG93ZXJvZmYsCisJLnJlc3RvcmUgPSBpOTE1X3BtX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgaTkxNV9nZW1fdm1fb3BzID0gewpAQCAtNzg1LDggKzc4OSw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0gewotCS8qIGRvbid0IHVzZSBtdHJyJ3MgaGVyZSwgdGhlIFhzZXJ2ZXIgb3IgdXNlciBzcGFjZSBhcHAgc2hvdWxkCi0JICogZGVhbCB3aXRoIHRoZW0gZm9yIGludGVsIGhhcmR3YXJlLgorCS8qIERvbid0IHVzZSBNVFJScyBoZXJlOyB0aGUgWHNlcnZlciBvciB1c2Vyc3BhY2UgYXBwIHNob3VsZAorCSAqIGRlYWwgd2l0aCB0aGVtIGZvciBJbnRlbCBoYXJkd2FyZS4KIAkgKi8KIAkuZHJpdmVyX2ZlYXR1cmVzID0KIAkgICAgRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfUkVRVUlSRV9BR1AgfCAvKiBEUklWRVJfVVNFX01UUlIgfCovCkBAIC04OTUsMyArODk5LDQzIEBACiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CisKKy8qIFdlIGdpdmUgZmFzdCBwYXRocyBmb3IgdGhlIHJlYWxseSBjb29sIHJlZ2lzdGVycyAqLworI2RlZmluZSBORUVEU19GT1JDRV9XQUtFKGRldl9wcml2LCByZWcpIFwKKwkoKChkZXZfcHJpdiktPmluZm8tPmdlbiA+PSA2KSAmJiBcCisJKChyZWcpIDwgMHg0MDAwMCkgJiYgXAorCSgocmVnKSAhPSBGT1JDRVdBS0UpKQorCisjZGVmaW5lIF9faTkxNV9yZWFkKHgsIHkpIFwKK3UjI3ggaTkxNV9yZWFkIyN4KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZykgeyBcCisJdSMjeCB2YWwgPSAwOyBcCisJaWYgKE5FRURTX0ZPUkNFX1dBS0UoKGRldl9wcml2KSwgKHJlZykpKSB7IFwKKwkJZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdik7IFwKKwkJdmFsID0gcmVhZCMjeShkZXZfcHJpdi0+cmVncyArIHJlZyk7IFwKKwkJZ2VuNl9ndF9mb3JjZV93YWtlX3B1dChkZXZfcHJpdik7IFwKKwl9IGVsc2UgeyBcCisJCXZhbCA9IHJlYWQjI3koZGV2X3ByaXYtPnJlZ3MgKyByZWcpOyBcCisJfSBcCisJdHJhY2VfaTkxNV9yZWdfcncoZmFsc2UsIHJlZywgdmFsLCBzaXplb2YodmFsKSk7IFwKKwlyZXR1cm4gdmFsOyBcCit9CisKK19faTkxNV9yZWFkKDgsIGIpCitfX2k5MTVfcmVhZCgxNiwgdykKK19faTkxNV9yZWFkKDMyLCBsKQorX19pOTE1X3JlYWQoNjQsIHEpCisjdW5kZWYgX19pOTE1X3JlYWQKKworI2RlZmluZSBfX2k5MTVfd3JpdGUoeCwgeSkgXAordm9pZCBpOTE1X3dyaXRlIyN4KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZywgdSMjeCB2YWwpIHsgXAorCXRyYWNlX2k5MTVfcmVnX3J3KHRydWUsIHJlZywgdmFsLCBzaXplb2YodmFsKSk7IFwKKwlpZiAoTkVFRFNfRk9SQ0VfV0FLRSgoZGV2X3ByaXYpLCAocmVnKSkpIHsgXAorCQlfX2dlbjZfZ3Rfd2FpdF9mb3JfZmlmbyhkZXZfcHJpdik7IFwKKwl9IFwKKwl3cml0ZSMjeSh2YWwsIGRldl9wcml2LT5yZWdzICsgcmVnKTsgXAorfQorX19pOTE1X3dyaXRlKDgsIGIpCitfX2k5MTVfd3JpdGUoMTYsIHcpCitfX2k5MTVfd3JpdGUoMzIsIGwpCitfX2k5MTVfd3JpdGUoNjQsIHEpCisjdW5kZWYgX19pOTE1X3dyaXRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCA3OTE2YmQ5Li4wNmEzN2Y0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTEzOSw3ICsxMzksNiBAQAogCXU4IHNsYXZlX2FkZHI7CiAJdTggZHZvX3dpcmluZzsKIAl1OCBpMmNfcGluOwotCXU4IGkyY19zcGVlZDsKIAl1OCBkZGNfcGluOwogfTsKIApAQCAtMjA5LDYgKzIwOCw4IEBACiAJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlLAogCQkJICAgICBpbnQgeCwgaW50IHksCiAJCQkgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYik7CisJdm9pZCAoKndyaXRlX2VsZCkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIAl2b2lkICgqZmRpX2xpbmtfdHJhaW4pKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAJdm9pZCAoKmluaXRfY2xvY2tfZ2F0aW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAl2b2lkICgqaW5pdF9wY2hfY2xvY2tfZ2F0aW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTIyNiwyNiArMjI3LDI2IEBACiAKIHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyB7CiAJdTggZ2VuOwotCXU4IGlzX21vYmlsZSA6IDE7Ci0JdTggaXNfaTg1eCA6IDE7Ci0JdTggaXNfaTkxNWcgOiAxOwotCXU4IGlzX2k5NDVnbSA6IDE7Ci0JdTggaXNfZzMzIDogMTsKLQl1OCBuZWVkX2dmeF9od3MgOiAxOwotCXU4IGlzX2c0eCA6IDE7Ci0JdTggaXNfcGluZXZpZXcgOiAxOwotCXU4IGlzX2Jyb2Fkd2F0ZXIgOiAxOwotCXU4IGlzX2NyZXN0bGluZSA6IDE7Ci0JdTggaXNfaXZ5YnJpZGdlIDogMTsKLQl1OCBoYXNfZmJjIDogMTsKLQl1OCBoYXNfcGlwZV9jeHNyIDogMTsKLQl1OCBoYXNfaG90cGx1ZyA6IDE7Ci0JdTggY3Vyc29yX25lZWRzX3BoeXNpY2FsIDogMTsKLQl1OCBoYXNfb3ZlcmxheSA6IDE7Ci0JdTggb3ZlcmxheV9uZWVkc19waHlzaWNhbCA6IDE7Ci0JdTggc3VwcG9ydHNfdHYgOiAxOwotCXU4IGhhc19ic2RfcmluZyA6IDE7Ci0JdTggaGFzX2JsdF9yaW5nIDogMTsKKwl1OCBpc19tb2JpbGU6MTsKKwl1OCBpc19pODV4OjE7CisJdTggaXNfaTkxNWc6MTsKKwl1OCBpc19pOTQ1Z206MTsKKwl1OCBpc19nMzM6MTsKKwl1OCBuZWVkX2dmeF9od3M6MTsKKwl1OCBpc19nNHg6MTsKKwl1OCBpc19waW5ldmlldzoxOworCXU4IGlzX2Jyb2Fkd2F0ZXI6MTsKKwl1OCBpc19jcmVzdGxpbmU6MTsKKwl1OCBpc19pdnlicmlkZ2U6MTsKKwl1OCBoYXNfZmJjOjE7CisJdTggaGFzX3BpcGVfY3hzcjoxOworCXU4IGhhc19ob3RwbHVnOjE7CisJdTggY3Vyc29yX25lZWRzX3BoeXNpY2FsOjE7CisJdTggaGFzX292ZXJsYXk6MTsKKwl1OCBvdmVybGF5X25lZWRzX3BoeXNpY2FsOjE7CisJdTggc3VwcG9ydHNfdHY6MTsKKwl1OCBoYXNfYnNkX3Jpbmc6MTsKKwl1OCBoYXNfYmx0X3Jpbmc6MTsKIH07CiAKIGVudW0gbm9fZmJjX3JlYXNvbiB7CkBAIC0zNDcsNyArMzQ4LDYgQEAKIAkvKiBMVkRTIGluZm8gKi8KIAlpbnQgYmFja2xpZ2h0X2xldmVsOyAgLyogcmVzdG9yZSBiYWNrbGlnaHQgdG8gdGhpcyB2YWx1ZSAqLwogCWJvb2wgYmFja2xpZ2h0X2VuYWJsZWQ7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBhbmVsX2ZpeGVkX21vZGU7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmxmcF9sdmRzX3ZidF9tb2RlOyAvKiBpZiBhbnkgKi8KIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqc2R2b19sdmRzX3ZidF9tb2RlOyAvKiBpZiBhbnkgKi8KIApAQCAtMzU3LDYgKzM1Nyw3IEBACiAJdW5zaWduZWQgaW50IGx2ZHNfdmJ0OjE7CiAJdW5zaWduZWQgaW50IGludF9jcnRfc3VwcG9ydDoxOwogCXVuc2lnbmVkIGludCBsdmRzX3VzZV9zc2M6MTsKKwl1bnNpZ25lZCBpbnQgZGlzcGxheV9jbG9ja19tb2RlOjE7CiAJaW50IGx2ZHNfc3NjX2ZyZXE7CiAJc3RydWN0IHsKIAkJaW50IHJhdGU7CkBAIC02NzIsMTAgKzY3Myw5IEBACiAJdW5zaWduZWQgaW50IGx2ZHNfYm9yZGVyX2JpdHM7CiAJLyogUGFuZWwgZml0dGVyIHBsYWNlbWVudCBhbmQgc2l6ZSBmb3IgSXJvbmxha2UrICovCiAJdTMyIHBjaF9wZl9wb3MsIHBjaF9wZl9zaXplOwotCWludCBwYW5lbF90MywgcGFuZWxfdDEyOwogCi0Jc3RydWN0IGRybV9jcnRjICpwbGFuZV90b19jcnRjX21hcHBpbmdbMl07Ci0Jc3RydWN0IGRybV9jcnRjICpwaXBlX3RvX2NydGNfbWFwcGluZ1syXTsKKwlzdHJ1Y3QgZHJtX2NydGMgKnBsYW5lX3RvX2NydGNfbWFwcGluZ1szXTsKKwlzdHJ1Y3QgZHJtX2NydGMgKnBpcGVfdG9fY3J0Y19tYXBwaW5nWzNdOwogCXdhaXRfcXVldWVfaGVhZF90IHBlbmRpbmdfZmxpcF9xdWV1ZTsKIAlib29sIGZsaXBfcGVuZGluZ19pc19kb25lOwogCkBAIC03NTksMTkgKzc1OSwxOSBAQAogCSAqIChoYXMgcGVuZGluZyByZW5kZXJpbmcpLCBhbmQgaXMgbm90IHNldCBpZiBpdCdzIG9uIGluYWN0aXZlIChyZWFkeQogCSAqIHRvIGJlIHVuYm91bmQpLgogCSAqLwotCXVuc2lnbmVkIGludCBhY3RpdmUgOiAxOworCXVuc2lnbmVkIGludCBhY3RpdmU6MTsKIAogCS8qKgogCSAqIFRoaXMgaXMgc2V0IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gd3JpdHRlbiB0byBzaW5jZSBsYXN0IGJvdW5kCiAJICogdG8gdGhlIEdUVAogCSAqLwotCXVuc2lnbmVkIGludCBkaXJ0eSA6IDE7CisJdW5zaWduZWQgaW50IGRpcnR5OjE7CiAKIAkvKioKIAkgKiBUaGlzIGlzIHNldCBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHdyaXR0ZW4gdG8gc2luY2UgdGhlIGxhc3QKIAkgKiBHUFUgZmx1c2guCiAJICovCi0JdW5zaWduZWQgaW50IHBlbmRpbmdfZ3B1X3dyaXRlIDogMTsKKwl1bnNpZ25lZCBpbnQgcGVuZGluZ19ncHVfd3JpdGU6MTsKIAogCS8qKgogCSAqIEZlbmNlIHJlZ2lzdGVyIGJpdHMgKGlmIGFueSkgZm9yIHRoaXMgb2JqZWN0LiAgV2lsbCBiZSBzZXQKQEAgLTc4MCwxOCArNzgwLDE4IEBACiAJICoKIAkgKiBTaXplOiA0IGJpdHMgZm9yIDE2IGZlbmNlcyArIHNpZ24gKGZvciBGRU5DRV9SRUdfTk9ORSkKIAkgKi8KLQlzaWduZWQgaW50IGZlbmNlX3JlZyA6IDU7CisJc2lnbmVkIGludCBmZW5jZV9yZWc6NTsKIAogCS8qKgogCSAqIEFkdmljZTogYXJlIHRoZSBiYWNraW5nIHBhZ2VzIHB1cmdlYWJsZT8KIAkgKi8KLQl1bnNpZ25lZCBpbnQgbWFkdiA6IDI7CisJdW5zaWduZWQgaW50IG1hZHY6MjsKIAogCS8qKgogCSAqIEN1cnJlbnQgdGlsaW5nIG1vZGUgZm9yIHRoZSBvYmplY3QuCiAJICovCi0JdW5zaWduZWQgaW50IHRpbGluZ19tb2RlIDogMjsKLQl1bnNpZ25lZCBpbnQgdGlsaW5nX2NoYW5nZWQgOiAxOworCXVuc2lnbmVkIGludCB0aWxpbmdfbW9kZToyOworCXVuc2lnbmVkIGludCB0aWxpbmdfY2hhbmdlZDoxOwogCiAJLyoqIEhvdyBtYW55IHVzZXJzIGhhdmUgcGlubmVkIHRoaXMgb2JqZWN0IGluIEdUVCBzcGFjZS4gVGhlIGZvbGxvd2luZwogCSAqIHVzZXJzIGNhbiBlYWNoIGhvbGQgYXQgbW9zdCBvbmUgcmVmZXJlbmNlOiBwd3JpdGUvcHJlYWQsIHBpbl9pb2N0bApAQCAtODAyLDIyICs4MDIsMjIgQEAKIAkgKgogCSAqIEluIHRoZSB3b3JzdCBjYXNlIHRoaXMgaXMgMSArIDEgKyAxICsgMioyID0gNy4gVGhhdCB3b3VsZCBmaXQgaW50byAzCiAJICogYml0cyB3aXRoIGFic29sdXRlbHkgbm8gaGVhZHJvb20uIFNvIHVzZSA0IGJpdHMuICovCi0JdW5zaWduZWQgaW50IHBpbl9jb3VudCA6IDQ7CisJdW5zaWduZWQgaW50IHBpbl9jb3VudDo0OwogI2RlZmluZSBEUk1fSTkxNV9HRU1fT0JKRUNUX01BWF9QSU5fQ09VTlQgMHhmCiAKIAkvKioKIAkgKiBJcyB0aGUgb2JqZWN0IGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBndHQgbWFwcGFibGUgYW5kCiAJICogZmVuY2VhYmxlPyBVc2VkIHRvIGF2b2lkIGNvc3RseSByZWNhbGN1bGF0aW9ucy4KIAkgKi8KLQl1bnNpZ25lZCBpbnQgbWFwX2FuZF9mZW5jZWFibGUgOiAxOworCXVuc2lnbmVkIGludCBtYXBfYW5kX2ZlbmNlYWJsZToxOwogCiAJLyoqCiAJICogV2hldGhlciB0aGUgY3VycmVudCBndHQgbWFwcGluZyBuZWVkcyB0byBiZSBtYXBwYWJsZSAoYW5kIGlzbid0IGp1c3QKIAkgKiBtYXBwYWJsZSBieSBhY2NpZGVudCkuIFRyYWNrIHBpbiBhbmQgZmF1bHQgc2VwYXJhdGUgZm9yIGEgbW9yZQogCSAqIGFjY3VyYXRlIG1hcHBhYmxlIHdvcmtpbmcgc2V0LgogCSAqLwotCXVuc2lnbmVkIGludCBmYXVsdF9tYXBwYWJsZSA6IDE7Ci0JdW5zaWduZWQgaW50IHBpbl9tYXBwYWJsZSA6IDE7CisJdW5zaWduZWQgaW50IGZhdWx0X21hcHBhYmxlOjE7CisJdW5zaWduZWQgaW50IHBpbl9tYXBwYWJsZToxOwogCiAJLyoKIAkgKiBJcyB0aGUgR1BVIGN1cnJlbnRseSB1c2luZyBhIGZlbmNlIHRvIGFjY2VzcyB0aGlzIGJ1ZmZlciwKQEAgLTEwNTYsNyArMTA1Niw3IEBACiB2b2lkCiBpOTE1X2Rpc2FibGVfcGlwZXN0YXQoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHBpcGUsIHUzMiBtYXNrKTsKIAotdm9pZCBpbnRlbF9lbmFibGVfYXNsZSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIGludGVsX2VuYWJsZV9hc2xlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiBleHRlcm4gdm9pZCBpOTE1X2Rlc3Ryb3lfZXJyb3Jfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC0xMTQ2LDcgKzExNDYsNyBAQAogaW50IGk5MTVfZ2VtX21tYXBfZ3R0KHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkgICAgICB1aW50MzJfdCBoYW5kbGUsIHVpbnQ2NF90ICpvZmZzZXQpOwogaW50IGk5MTVfZ2VtX2R1bWJfZGVzdHJveShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgdWludDMyX3QgaGFuZGxlKTsJCQkgIAorCQkJICB1aW50MzJfdCBoYW5kbGUpOwogLyoqCiAgKiBSZXR1cm5zIHRydWUgaWYgc2VxMSBpcyBsYXRlciB0aGFuIHNlcTIuCiAgKi8KQEAgLTEzMDEsMTAgKzEzMDEsMTEgQEAKIGV4dGVybiBib29sIGludGVsX2ZiY19lbmFibGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZGlzYWJsZV9mYmMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gYm9vbCBpcm9ubGFrZV9zZXRfZHJwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCB2YWwpOworZXh0ZXJuIHZvaWQgaXJvbmxha2VfaW5pdF9wY2hfcmVmY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaXJvbmxha2VfZW5hYmxlX3JjNihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGdlbjZfc2V0X3JwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCB2YWwpOwotZXh0ZXJuIHZvaWQgaW50ZWxfZGV0ZWN0X3BjaCAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IGludGVsX3RyYW5zX2RwX3BvcnRfc2VsIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworZXh0ZXJuIHZvaWQgaW50ZWxfZGV0ZWN0X3BjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgaW50ZWxfdHJhbnNfZHBfcG9ydF9zZWwoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIAogLyogb3ZlcmxheSAqLwogI2lmZGVmIENPTkZJR19ERUJVR19GUwpAQCAtMTM1NCwxOCArMTM1NSw3IEBACiAJKChyZWcpICE9IEZPUkNFV0FLRSkpCiAKICNkZWZpbmUgX19pOTE1X3JlYWQoeCwgeSkgXAotc3RhdGljIGlubGluZSB1IyN4IGk5MTVfcmVhZCMjeChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcpIHsgXAotCXUjI3ggdmFsID0gMDsgXAotCWlmIChORUVEU19GT1JDRV9XQUtFKChkZXZfcHJpdiksIChyZWcpKSkgeyBcCi0JCWdlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQoZGV2X3ByaXYpOyBcCi0JCXZhbCA9IHJlYWQjI3koZGV2X3ByaXYtPnJlZ3MgKyByZWcpOyBcCi0JCWdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOyBcCi0JfSBlbHNlIHsgXAotCQl2YWwgPSByZWFkIyN5KGRldl9wcml2LT5yZWdzICsgcmVnKTsgXAotCX0gXAotCXRyYWNlX2k5MTVfcmVnX3J3KGZhbHNlLCByZWcsIHZhbCwgc2l6ZW9mKHZhbCkpOyBcCi0JcmV0dXJuIHZhbDsgXAotfQorCXUjI3ggaTkxNV9yZWFkIyN4KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZyk7CiAKIF9faTkxNV9yZWFkKDgsIGIpCiBfX2k5MTVfcmVhZCgxNiwgdykKQEAgLTEzNzQsMTMgKzEzNjQsOCBAQAogI3VuZGVmIF9faTkxNV9yZWFkCiAKICNkZWZpbmUgX19pOTE1X3dyaXRlKHgsIHkpIFwKLXN0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3dyaXRlIyN4KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZywgdSMjeCB2YWwpIHsgXAotCXRyYWNlX2k5MTVfcmVnX3J3KHRydWUsIHJlZywgdmFsLCBzaXplb2YodmFsKSk7IFwKLQlpZiAoTkVFRFNfRk9SQ0VfV0FLRSgoZGV2X3ByaXYpLCAocmVnKSkpIHsgXAotCQlfX2dlbjZfZ3Rfd2FpdF9mb3JfZmlmbyhkZXZfcHJpdik7IFwKLQl9IFwKLQl3cml0ZSMjeSh2YWwsIGRldl9wcml2LT5yZWdzICsgcmVnKTsgXAotfQorCXZvaWQgaTkxNV93cml0ZSMjeChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcsIHUjI3ggdmFsKTsKKwogX19pOTE1X3dyaXRlKDgsIGIpCiBfX2k5MTVfd3JpdGUoMTYsIHcpCiBfX2k5MTVfd3JpdGUoMzIsIGwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCBhNTQ2YTcxLi5kMThiMDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTE3OSw3ICsxNzksNyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJYXJncy0+YXBlcl9zaXplID0gZGV2X3ByaXYtPm1tLmd0dF90b3RhbDsKLQlhcmdzLT5hcGVyX2F2YWlsYWJsZV9zaXplID0gYXJncy0+YXBlcl9zaXplIC1waW5uZWQ7CisJYXJncy0+YXBlcl9hdmFpbGFibGVfc2l6ZSA9IGFyZ3MtPmFwZXJfc2l6ZSAtIHBpbm5lZDsKIAogCXJldHVybiAwOwogfQpAQCAtMTk1LDYgKzE5NSw4IEBACiAJdTMyIGhhbmRsZTsKIAogCXNpemUgPSByb3VuZHVwKHNpemUsIFBBR0VfU0laRSk7CisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgbmV3IG9iamVjdCAqLwogCW9iaiA9IGk5MTVfZ2VtX2FsbG9jX29iamVjdChkZXYsIHNpemUpOwpAQCAtODAwLDExICs4MDIsMTEgQEAKIAkJaWYgKElTX0VSUihwYWdlKSkKIAkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOwogCi0JCXZhZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQl2YWRkciA9IGttYXBfYXRvbWljKHBhZ2UpOwogCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHZhZGRyICsgcGFnZV9vZmZzZXQsCiAJCQkJCQl1c2VyX2RhdGEsCiAJCQkJCQlwYWdlX2xlbmd0aCk7Ci0JCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1VTRVIwKTsKKwkJa3VubWFwX2F0b21pYyh2YWRkcik7CiAKIAkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CiAJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKQEAgLTEyNjUsNzQgKzEyNjcsNiBAQAogfQogCiAvKioKLSAqIGk5MTVfZ2VtX2NyZWF0ZV9tbWFwX29mZnNldCAtIGNyZWF0ZSBhIGZha2UgbW1hcCBvZmZzZXQgZm9yIGFuIG9iamVjdAotICogQG9iajogb2JqIGluIHF1ZXN0aW9uCi0gKgotICogR0VNIG1lbW9yeSBtYXBwaW5nIHdvcmtzIGJ5IGhhbmRpbmcgYmFjayB0byB1c2Vyc3BhY2UgYSBmYWtlIG1tYXAgb2Zmc2V0Ci0gKiBpdCBjYW4gdXNlIGluIGEgc3Vic2VxdWVudCBtbWFwKDIpIGNhbGwuICBUaGUgRFJNIGNvcmUgY29kZSB0aGVuIGxvb2tzCi0gKiB1cCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBvZmZzZXQgYW5kIHNldHMgdXAgdGhlIHZhcmlvdXMgbWVtb3J5IG1hcHBpbmcKLSAqIHN0cnVjdHVyZXMuCi0gKgotICogVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBhbmQgYXR0YWNoZXMgYSBmYWtlIG9mZnNldCBmb3IgQG9iai4KLSAqLwotc3RhdGljIGludAotaTkxNV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7Ci0Jc3RydWN0IGRybV9nZW1fbW0gKm1tID0gZGV2LT5tbV9wcml2YXRlOwotCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmxpc3Q7Ci0Jc3RydWN0IGRybV9sb2NhbF9tYXAgKm1hcDsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIFNldCB0aGUgb2JqZWN0IHVwIGZvciBtbWFwJ2luZyAqLwotCWxpc3QgPSAmb2JqLT5iYXNlLm1hcF9saXN0OwotCWxpc3QtPm1hcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcm1fbWFwX2xpc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxpc3QtPm1hcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltYXAgPSBsaXN0LT5tYXA7Ci0JbWFwLT50eXBlID0gX0RSTV9HRU07Ci0JbWFwLT5zaXplID0gb2JqLT5iYXNlLnNpemU7Ci0JbWFwLT5oYW5kbGUgPSBvYmo7Ci0KLQkvKiBHZXQgYSBEUk0gR0VNIG1tYXAgb2Zmc2V0IGFsbG9jYXRlZC4uLiAqLwotCWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUgPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJm1tLT5vZmZzZXRfbWFuYWdlciwKLQkJCQkJCSAgICBvYmotPmJhc2Uuc2l6ZSAvIFBBR0VfU0laRSwKLQkJCQkJCSAgICAwLCAwKTsKLQlpZiAoIWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgb2Zmc2V0IGZvciBibyAlZFxuIiwKLQkJCSAgb2JqLT5iYXNlLm5hbWUpOwotCQlyZXQgPSAtRU5PU1BDOwotCQlnb3RvIG91dF9mcmVlX2xpc3Q7Ci0JfQotCi0JbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSA9IGRybV9tbV9nZXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSwKLQkJCQkJCSAgb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkUsCi0JCQkJCQkgIDApOwotCWlmICghbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9mcmVlX2xpc3Q7Ci0JfQotCi0JbGlzdC0+aGFzaC5rZXkgPSBsaXN0LT5maWxlX29mZnNldF9ub2RlLT5zdGFydDsKLQlyZXQgPSBkcm1faHRfaW5zZXJ0X2l0ZW0oJm1tLT5vZmZzZXRfaGFzaCwgJmxpc3QtPmhhc2gpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWRkIHRvIG1hcCBoYXNoXG4iKTsKLQkJZ290byBvdXRfZnJlZV9tbTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotb3V0X2ZyZWVfbW06Ci0JZHJtX21tX3B1dF9ibG9jayhsaXN0LT5maWxlX29mZnNldF9ub2RlKTsKLW91dF9mcmVlX2xpc3Q6Ci0Ja2ZyZWUobGlzdC0+bWFwKTsKLQlsaXN0LT5tYXAgPSBOVUxMOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCiAgKiBpOTE1X2dlbV9yZWxlYXNlX21tYXAgLSByZW1vdmUgcGh5c2ljYWwgcGFnZSBtYXBwaW5ncwogICogQG9iajogb2JqIGluIHF1ZXN0aW9uCiAgKgpAQCAtMTM2MCwxOSArMTI5NCw2IEBACiAJb2JqLT5mYXVsdF9tYXBwYWJsZSA9IGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZAotaTkxNV9nZW1fZnJlZV9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwotCXN0cnVjdCBkcm1fZ2VtX21tICptbSA9IGRldi0+bW1fcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX21hcF9saXN0ICpsaXN0ID0gJm9iai0+YmFzZS5tYXBfbGlzdDsKLQotCWRybV9odF9yZW1vdmVfaXRlbSgmbW0tPm9mZnNldF9oYXNoLCAmbGlzdC0+aGFzaCk7Ci0JZHJtX21tX3B1dF9ibG9jayhsaXN0LT5maWxlX29mZnNldF9ub2RlKTsKLQlrZnJlZShsaXN0LT5tYXApOwotCWxpc3QtPm1hcCA9IE5VTEw7Ci19Ci0KIHN0YXRpYyB1aW50MzJfdAogaTkxNV9nZW1fZ2V0X2d0dF9zaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHNpemUsIGludCB0aWxpbmdfbW9kZSkKIHsKQEAgLTE0NzUsNyArMTM5Niw3IEBACiAKIAlpZiAob2JqLT5iYXNlLnNpemUgPiBkZXZfcHJpdi0+bW0uZ3R0X21hcHBhYmxlX2VuZCkgewogCQlyZXQgPSAtRTJCSUc7Ci0JCWdvdG8gdW5sb2NrOworCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAob2JqLT5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCkgewpAQCAtMTQ4NSw3ICsxNDA2LDcgQEAKIAl9CiAKIAlpZiAoIW9iai0+YmFzZS5tYXBfbGlzdC5tYXApIHsKLQkJcmV0ID0gaTkxNV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KG9iaik7CisJCXJldCA9IGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KCZvYmotPmJhc2UpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMTU1Nyw3ICsxNDc4LDcgQEAKIAkJb2JqLT5wYWdlc1tpXSA9IHBhZ2U7CiAJfQogCi0JaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwlpZiAoaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUob2JqKSkKIAkJaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKG9iaik7CiAKIAlyZXR1cm4gMDsKQEAgLTE1NzksNyArMTUwMCw3IEBACiAKIAlCVUdfT04ob2JqLT5tYWR2ID09IF9fSTkxNV9NQURWX1BVUkdFRCk7CiAKLQlpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQorCWlmIChpOTE1X2dlbV9vYmplY3RfbmVlZHNfYml0MTdfc3dpenpsZShvYmopKQogCQlpOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRfMTdfc3dpenpsZShvYmopOwogCiAJaWYgKG9iai0+bWFkdiA9PSBJOTE1X01BRFZfRE9OVE5FRUQpCkBAIC0xODU2LDcgKzE3NzcsNyBAQAogCSAqIGxvc3QgYm8gdG8gdGhlIGluYWN0aXZlIGxpc3QuCiAJICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCkpIHsKLQkJb2JqPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCwKKwkJb2JqID0gbGlzdF9maXJzdF9lbnRyeSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QsCiAJCQkJICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCiAJCQkJICAgICAgbW1fbGlzdCk7CiAKQEAgLTE5MjIsNyArMTg0Myw3IEBACiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZyaW5nLT5hY3RpdmVfbGlzdCkpIHsKIAkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAotCQlvYmo9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPmFjdGl2ZV9saXN0LAorCQlvYmogPSBsaXN0X2ZpcnN0X2VudHJ5KCZyaW5nLT5hY3RpdmVfbGlzdCwKIAkJCQkgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKIAkJCQkgICAgICByaW5nX2xpc3QpOwogCkBAIC0yMjcyLDE0ICsyMTkzLDggQEAKIGk5MTVfZ3B1X2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlib29sIGxpc3RzX2VtcHR5OwogCWludCByZXQsIGk7CiAKLQlsaXN0c19lbXB0eSA9IChsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCkgJiYKLQkJICAgICAgIGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCkpOwotCWlmIChsaXN0c19lbXB0eSkKLQkJcmV0dXJuIDA7Ci0KIAkvKiBGbHVzaCBldmVyeXRoaW5nIG9udG8gdGhlIGluYWN0aXZlIGxpc3QuICovCiAJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspIHsKIAkJcmV0ID0gaTkxNV9yaW5nX2lkbGUoJmRldl9wcml2LT5yaW5nW2ldKTsKQEAgLTI4ODIsNyArMjc5Nyw3IEBACiAKIAlmZW5jZWFibGUgPQogCQlvYmotPmd0dF9zcGFjZS0+c2l6ZSA9PSBmZW5jZV9zaXplICYmCi0JCShvYmotPmd0dF9zcGFjZS0+c3RhcnQgJiAoZmVuY2VfYWxpZ25tZW50IC0xKSkgPT0gMDsKKwkJKG9iai0+Z3R0X3NwYWNlLT5zdGFydCAmIChmZW5jZV9hbGlnbm1lbnQgLSAxKSkgPT0gMDsKIAogCW1hcHBhYmxlID0KIAkJb2JqLT5ndHRfb2Zmc2V0ICsgb2JqLT5iYXNlLnNpemUgPD0gZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQ7CkBAIC0zNTk4LDcgKzM1MTMsNyBAQAogCQkJICovCiAJCQlyZXF1ZXN0ID0ga3phbGxvYyhzaXplb2YoKnJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChyZXF1ZXN0KQotCQkJCXJldCA9IGk5MTVfYWRkX3JlcXVlc3Qob2JqLT5yaW5nLCBOVUxMLHJlcXVlc3QpOworCQkJCXJldCA9IGk5MTVfYWRkX3JlcXVlc3Qob2JqLT5yaW5nLCBOVUxMLCByZXF1ZXN0KTsKIAkJCWVsc2UKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQl9CkBAIC0zNjIzLDcgKzM1MzgsNyBAQAogaTkxNV9nZW1fdGhyb3R0bGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewotICAgIHJldHVybiBpOTE1X2dlbV9yaW5nX3Rocm90dGxlKGRldiwgZmlsZV9wcml2KTsKKwlyZXR1cm4gaTkxNV9nZW1fcmluZ190aHJvdHRsZShkZXYsIGZpbGVfcHJpdik7CiB9CiAKIGludApAQCAtMzc1Miw3ICszNjY3LDcgQEAKIAl0cmFjZV9pOTE1X2dlbV9vYmplY3RfZGVzdHJveShvYmopOwogCiAJaWYgKG9iai0+YmFzZS5tYXBfbGlzdC5tYXApCi0JCWk5MTVfZ2VtX2ZyZWVfbW1hcF9vZmZzZXQob2JqKTsKKwkJZHJtX2dlbV9mcmVlX21tYXBfb2Zmc2V0KCZvYmotPmJhc2UpOwogCiAJZHJtX2dlbV9vYmplY3RfcmVsZWFzZSgmb2JqLT5iYXNlKTsKIAlpOTE1X2dlbV9pbmZvX3JlbW92ZV9vYmooZGV2X3ByaXYsIG9iai0+YmFzZS5zaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2RlYnVnLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9kZWJ1Zy5jCmluZGV4IDhkYTE4OTkuLmNjOTNjYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2RlYnVnLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZGVidWcuYwpAQCAtNzIsNyArNzIsNyBAQAogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoIW9iai0+YWN0aXZlIHx8CiAJCQkgICAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKSA9PSAwIHx8Ci0JCQkgICBsaXN0X2VtcHR5KCZvYmotPmdwdV93cml0ZV9saXN0KSl7CisJCQkgICBsaXN0X2VtcHR5KCZvYmotPmdwdV93cml0ZV9saXN0KSkgewogCQkJRFJNX0VSUk9SKCJpbnZhbGlkIGZsdXNoaW5nICVwIChhICVkIHcgJXggZ3dsICVkKVxuIiwKIAkJCQkgIG9iaiwKIAkJCQkgIG9iai0+YWN0aXZlLApAQCAtMTU3LDcgKzE1Nyw3IEBACiAJZm9yIChwYWdlID0gMDsgcGFnZSA8IG9iai0+c2l6ZSAvIFBBR0VfU0laRTsgcGFnZSsrKSB7CiAJCWludCBpOwogCi0JCWJhY2tpbmdfbWFwID0ga21hcF9hdG9taWMob2JqLT5wYWdlc1twYWdlXSwgS01fVVNFUjApOworCQliYWNraW5nX21hcCA9IGttYXBfYXRvbWljKG9iai0+cGFnZXNbcGFnZV0pOwogCiAJCWlmIChiYWNraW5nX21hcCA9PSBOVUxMKSB7CiAJCQlEUk1fRVJST1IoImZhaWxlZCB0byBtYXAgYmFja2luZyBwYWdlXG4iKTsKQEAgLTE4MSwxMyArMTgxLDEzIEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCWt1bm1hcF9hdG9taWMoYmFja2luZ19tYXAsIEtNX1VTRVIwKTsKKwkJa3VubWFwX2F0b21pYyhiYWNraW5nX21hcCk7CiAJCWJhY2tpbmdfbWFwID0gTlVMTDsKIAl9CiAKICBvdXQ6CiAJaWYgKGJhY2tpbmdfbWFwICE9IE5VTEwpCi0JCWt1bm1hcF9hdG9taWMoYmFja2luZ19tYXAsIEtNX1VTRVIwKTsKKwkJa3VubWFwX2F0b21pYyhiYWNraW5nX21hcCk7CiAJaW91bm1hcChndHRfbWFwcGluZyk7CiAKIAkvKiBnaXZlIHN5c2xvZyB0aW1lIHRvIGNhdGNoIHVwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ldmljdC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXZpY3QuYwppbmRleCBkYTA1YTI2OTIuLmVhZDVkMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V2aWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXZpY3QuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJCQlnb3RvIGZvdW5kOwogCX0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCwgbW1fbGlzdCkgewotCQlpZiAoISBvYmotPmJhc2Uud3JpdGVfZG9tYWluIHx8IG9iai0+cGluX2NvdW50KQorCQlpZiAoIW9iai0+YmFzZS53cml0ZV9kb21haW4gfHwgb2JqLT5waW5fY291bnQpCiAJCQljb250aW51ZTsKIAogCQlpZiAobWFya19mcmVlKG9iaiwgJnVud2luZF9saXN0KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwppbmRleCA0OTM0Y2Y4Li4zNjkzZTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCkBAIC03ODQsNyArNzg0LDggQEAKIAl9CiAKIAlmcm9tLT5zeW5jX3NlcW5vW2lkeF0gPSBzZXFubzsKLQlyZXR1cm4gaW50ZWxfcmluZ19zeW5jKHRvLCBmcm9tLCBzZXFubyAtIDEpOworCisJcmV0dXJuIHRvLT5zeW5jX3RvKHRvLCBmcm9tLCBzZXFubyAtIDEpOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCmluZGV4IDdhNzA5Y2QuLjYwNDJjNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCkBAIC00OSw2ICs0OSwyOCBAQAogCX0KIH0KIAorc3RhdGljIGJvb2wgZG9faWRsaW5nKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlib29sIHJldCA9IGRldl9wcml2LT5tbS5pbnRlcnJ1cHRpYmxlOworCisJaWYgKHVubGlrZWx5KGRldl9wcml2LT5tbS5ndHQtPmRvX2lkbGVfbWFwcykpIHsKKwkJZGV2X3ByaXYtPm1tLmludGVycnVwdGlibGUgPSBmYWxzZTsKKwkJaWYgKGk5MTVfZ3B1X2lkbGUoZGV2X3ByaXYtPmRldikpIHsKKwkJCURSTV9FUlJPUigiQ291bGRuJ3QgaWRsZSBHUFVcbiIpOworCQkJLyogV2FpdCBhIGJpdCwgaW4gaG9wZXMgaXQgYXZvaWRzIHRoZSBoYW5nICovCisJCQl1ZGVsYXkoMTApOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdW5kb19pZGxpbmcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBib29sIGludGVycnVwdGlibGUpCit7CisJaWYgKHVubGlrZWx5KGRldl9wcml2LT5tbS5ndHQtPmRvX2lkbGVfbWFwcykpCisJCWRldl9wcml2LT5tbS5pbnRlcnJ1cHRpYmxlID0gaW50ZXJydXB0aWJsZTsKK30KKwogdm9pZCBpOTE1X2dlbV9yZXN0b3JlX2d0dF9tYXBwaW5ncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMTcsNiArMTM5LDEyIEBACiAKIHZvaWQgaTkxNV9nZW1fZ3R0X3VuYmluZF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWJvb2wgaW50ZXJydXB0aWJsZTsKKworCWludGVycnVwdGlibGUgPSBkb19pZGxpbmcoZGV2X3ByaXYpOworCiAJaW50ZWxfZ3R0X2NsZWFyX3JhbmdlKG9iai0+Z3R0X3NwYWNlLT5zdGFydCA+PiBQQUdFX1NISUZULAogCQkJICAgICAgb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCk7CiAKQEAgLTEyNCw0ICsxNTIsNiBAQAogCQlpbnRlbF9ndHRfdW5tYXBfbWVtb3J5KG9iai0+c2dfbGlzdCwgb2JqLT5udW1fc2cpOwogCQlvYmotPnNnX2xpc3QgPSBOVUxMOwogCX0KKworCXVuZG9faWRsaW5nKGRldl9wcml2LCBpbnRlcnJ1cHRpYmxlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKaW5kZXggOTljNGZhYS4uMzFkMzM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKQEAgLTkyLDcgKzkyLDEwIEBACiAJdWludDMyX3Qgc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV047CiAJdWludDMyX3Qgc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV047CiAKLQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNSkgeworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CisJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOworCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwl9IGVsc2UgaWYgKElTX0dFTjUoZGV2KSkgewogCQkvKiBPbiBJcm9ubGFrZSB3aGF0ZXZlciBEUkFNIGNvbmZpZywgR1BVIGFsd2F5cyBkbwogCQkgKiBzYW1lIHN3aXp6bGluZyBzZXR1cC4KIAkJICovCkBAIC00NDAsMTQgKzQ0Myw5IEBACiB2b2lkCiBpOTE1X2dlbV9vYmplY3RfZG9fYml0XzE3X3N3aXp6bGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcGFnZV9jb3VudCA9IG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7CiAJaW50IGk7CiAKLQlpZiAoZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6bGVfeCAhPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xNykKLQkJcmV0dXJuOwotCiAJaWYgKG9iai0+Yml0XzE3ID09IE5VTEwpCiAJCXJldHVybjsKIApAQCAtNDY0LDE0ICs0NjIsOSBAQAogdm9pZAogaTkxNV9nZW1fb2JqZWN0X3NhdmVfYml0XzE3X3N3aXp6bGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcGFnZV9jb3VudCA9IG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7CiAJaW50IGk7CiAKLQlpZiAoZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6bGVfeCAhPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xNykKLQkJcmV0dXJuOwotCiAJaWYgKG9iai0+Yml0XzE3ID09IE5VTEwpIHsKIAkJb2JqLT5iaXRfMTcgPSBrbWFsbG9jKEJJVFNfVE9fTE9OR1MocGFnZV9jb3VudCkgKgogCQkJCQkgICBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKaW5kZXggOWNiYjBjZC4uOWVlMjcyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCkBAIC0zODMsNiArMzgzLDcgQEAKIAlwbV9paXIgPSBkZXZfcHJpdi0+cG1faWlyOwogCWRldl9wcml2LT5wbV9paXIgPSAwOwogCXBtX2ltciA9IEk5MTVfUkVBRChHRU42X1BNSU1SKTsKKwlJOTE1X1dSSVRFKEdFTjZfUE1JTVIsIDApOwogCXNwaW5fdW5sb2NrX2lycSgmZGV2X3ByaXYtPnJwc19sb2NrKTsKIAogCWlmICghcG1faWlyKQpAQCAtNDIwLDcgKzQyMSw2IEBACiAJICogYW4gKmV4dHJlbWVseSogdW5saWtlbHkgcmFjZSB3aXRoIGdlbjZfcnBzX2VuYWJsZSgpIHRoYXQgaXMgcHJldmVudGVkCiAJICogYnkgaG9sZGluZyBzdHJ1Y3RfbXV0ZXggZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgd3JpdGUuCiAJICovCi0JSTkxNV9XUklURShHRU42X1BNSU1SLCBwbV9pbXIgJiB+cG1faWlyKTsKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5kZXYtPnN0cnVjdF9tdXRleCk7CiB9CiAKQEAgLTUzNiw4ICs1MzYsOSBAQAogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnJwc19sb2NrLCBmbGFncyk7CiAJCVdBUk4oZGV2X3ByaXYtPnBtX2lpciAmIHBtX2lpciwgIk1pc3NlZCBhIFBNIGludGVycnVwdFxuIik7Ci0JCUk5MTVfV1JJVEUoR0VONl9QTUlNUiwgcG1faWlyKTsKIAkJZGV2X3ByaXYtPnBtX2lpciB8PSBwbV9paXI7CisJCUk5MTVfV1JJVEUoR0VONl9QTUlNUiwgZGV2X3ByaXYtPnBtX2lpcik7CisJCVBPU1RJTkdfUkVBRChHRU42X1BNSU1SKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnJwc19sb2NrLCBmbGFncyk7CiAJCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPnJwc193b3JrKTsKIAl9CkBAIC02NDksOCArNjUwLDkgQEAKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5ycHNfbG9jaywgZmxhZ3MpOwogCQlXQVJOKGRldl9wcml2LT5wbV9paXIgJiBwbV9paXIsICJNaXNzZWQgYSBQTSBpbnRlcnJ1cHRcbiIpOwotCQlJOTE1X1dSSVRFKEdFTjZfUE1JTVIsIHBtX2lpcik7CiAJCWRldl9wcml2LT5wbV9paXIgfD0gcG1faWlyOworCQlJOTE1X1dSSVRFKEdFTjZfUE1JTVIsIGRldl9wcml2LT5wbV9paXIpOworCQlQT1NUSU5HX1JFQUQoR0VONl9QTUlNUik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5ycHNfbG9jaywgZmxhZ3MpOwogCQlxdWV1ZV93b3JrKGRldl9wcml2LT53cSwgJmRldl9wcml2LT5ycHNfd29yayk7CiAJfQpAQCAtNzExLDcgKzcxMyw3IEBACiAKIAlwYWdlX2NvdW50ID0gc3JjLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CiAKLQlkc3QgPSBrbWFsbG9jKHNpemVvZigqZHN0KSArIHBhZ2VfY291bnQgKiBzaXplb2YgKHUzMiAqKSwgR0ZQX0FUT01JQyk7CisJZHN0ID0ga21hbGxvYyhzaXplb2YoKmRzdCkgKyBwYWdlX2NvdW50ICogc2l6ZW9mKHUzMiAqKSwgR0ZQX0FUT01JQyk7CiAJaWYgKGRzdCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTQ5Myw3ICsxNDk1LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAlpcm9ubGFrZV9lbmFibGVfZGlzcGxheV9pcnEoZGV2X3ByaXYsIChwaXBlID09IDApID8KLQkJCQkgICAgREVfUElQRUFfVkJMQU5LOiBERV9QSVBFQl9WQkxBTkspOworCQkJCSAgICBERV9QSVBFQV9WQkxBTksgOiBERV9QSVBFQl9WQkxBTkspOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCiAJcmV0dXJuIDA7CkBAIC0xNTQxLDcgKzE1NDMsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCWlyb25sYWtlX2Rpc2FibGVfZGlzcGxheV9pcnEoZGV2X3ByaXYsIChwaXBlID09IDApID8KLQkJCQkgICAgIERFX1BJUEVBX1ZCTEFOSzogREVfUElQRUJfVkJMQU5LKTsKKwkJCQkgICAgIERFX1BJUEVBX1ZCTEFOSyA6IERFX1BJUEVCX1ZCTEFOSyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CiB9CiAKQEAgLTE3NzcsNiArMTc3OSwyNiBAQAogCVBPU1RJTkdfUkVBRChTREVJRVIpOwogfQogCisvKgorICogRW5hYmxlIGRpZ2l0YWwgaG90cGx1ZyBvbiB0aGUgUENILCBhbmQgY29uZmlndXJlIHRoZSBEUCBzaG9ydCBwdWxzZQorICogZHVyYXRpb24gdG8gMm1zICh3aGljaCBpcyB0aGUgbWluaW11bSBpbiB0aGUgRGlzcGxheSBQb3J0IHNwZWMpCisgKgorICogVGhpcyByZWdpc3RlciBpcyB0aGUgc2FtZSBvbiBhbGwga25vd24gUENIIGNoaXBzLgorICovCisKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2VuYWJsZV9wY2hfaG90cGx1ZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyCWhvdHBsdWc7CisKKwlob3RwbHVnID0gSTkxNV9SRUFEKFBDSF9QT1JUX0hPVFBMVUcpOworCWhvdHBsdWcgJj0gfihQT1JURF9QVUxTRV9EVVJBVElPTl9NQVNLfFBPUlRDX1BVTFNFX0RVUkFUSU9OX01BU0t8UE9SVEJfUFVMU0VfRFVSQVRJT05fTUFTSyk7CisJaG90cGx1ZyB8PSBQT1JURF9IT1RQTFVHX0VOQUJMRSB8IFBPUlREX1BVTFNFX0RVUkFUSU9OXzJtczsKKwlob3RwbHVnIHw9IFBPUlRDX0hPVFBMVUdfRU5BQkxFIHwgUE9SVENfUFVMU0VfRFVSQVRJT05fMm1zOworCWhvdHBsdWcgfD0gUE9SVEJfSE9UUExVR19FTkFCTEUgfCBQT1JUQl9QVUxTRV9EVVJBVElPTl8ybXM7CisJSTkxNV9XUklURShQQ0hfUE9SVF9IT1RQTFVHLCBob3RwbHVnKTsKK30KKwogc3RhdGljIGludCBpcm9ubGFrZV9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTgzOSw2ICsxODYxLDggQEAKIAlJOTE1X1dSSVRFKFNERUlFUiwgaG90cGx1Z19tYXNrKTsKIAlQT1NUSU5HX1JFQUQoU0RFSUVSKTsKIAorCWlyb25sYWtlX2VuYWJsZV9wY2hfaG90cGx1ZyhkZXYpOworCiAJaWYgKElTX0lST05MQUtFX00oZGV2KSkgewogCQkvKiBDbGVhciAmIGVuYWJsZSBQQ1UgZXZlbnQgaW50ZXJydXB0cyAqLwogCQlJOTE1X1dSSVRFKERFSUlSLCBERV9QQ1VfRVZFTlQpOwpAQCAtMTg5Niw2ICsxOTIwLDggQEAKIAlJOTE1X1dSSVRFKFNERUlFUiwgaG90cGx1Z19tYXNrKTsKIAlQT1NUSU5HX1JFQUQoU0RFSUVSKTsKIAorCWlyb25sYWtlX2VuYWJsZV9wY2hfaG90cGx1ZyhkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwMjAsNiArMjA0NiwxMCBAQAogCUk5MTVfV1JJVEUoR1RJTVIsIDB4ZmZmZmZmZmYpOwogCUk5MTVfV1JJVEUoR1RJRVIsIDB4MCk7CiAJSTkxNV9XUklURShHVElJUiwgSTkxNV9SRUFEKEdUSUlSKSk7CisKKwlJOTE1X1dSSVRFKFNERUlNUiwgMHhmZmZmZmZmZik7CisJSTkxNV9XUklURShTREVJRVIsIDB4MCk7CisJSTkxNV9XUklURShTREVJSVIsIEk5MTVfUkVBRChTREVJSVIpKTsKIH0KIAogc3RhdGljIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfbWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X21lbS5jCmluZGV4IDgzYjdiODEuLmNjOGY2ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfbWVtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9tZW0uYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJYmxvY2tzLT5uZXh0ID0gYmxvY2tzLT5wcmV2ID0gKmhlYXA7CiAKIAltZW1zZXQoKmhlYXAsIDAsIHNpemVvZigqKmhlYXApKTsKLQkoKmhlYXApLT5maWxlX3ByaXYgPSAoc3RydWN0IGRybV9maWxlICopIC0gMTsKKwkoKmhlYXApLT5maWxlX3ByaXYgPSAoc3RydWN0IGRybV9maWxlICopIC0xOwogCSgqaGVhcCktPm5leHQgPSAoKmhlYXApLT5wcmV2ID0gYmxvY2tzOwogCXJldHVybiAwOwogfQpAQCAtMzU5LDE5ICszNTksMTkgQEAKIAlyZXR1cm4gaW5pdF9oZWFwKGhlYXAsIGluaXRoZWFwLT5zdGFydCwgaW5pdGhlYXAtPnNpemUpOwogfQogCi1pbnQgaTkxNV9tZW1fZGVzdHJveV9oZWFwKCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYgKQoraW50IGk5MTVfbWVtX2Rlc3Ryb3lfaGVhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcF90ICpkZXN0cm95aGVhcCA9IGRhdGE7CiAJc3RydWN0IG1lbV9ibG9jayAqKmhlYXA7CiAKLQlpZiAoICFkZXZfcHJpdiApIHsKLQkJRFJNX0VSUk9SKCAiY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIgKTsKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQloZWFwID0gZ2V0X2hlYXAoIGRldl9wcml2LCBkZXN0cm95aGVhcC0+cmVnaW9uICk7CisJaGVhcCA9IGdldF9oZWFwKGRldl9wcml2LCBkZXN0cm95aGVhcC0+cmVnaW9uKTsKIAlpZiAoIWhlYXApIHsKIAkJRFJNX0VSUk9SKCJnZXRfaGVhcCBmYWlsZWQiKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0zODIsNiArMzgyLDYgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JaTkxNV9tZW1fdGFrZWRvd24oIGhlYXAgKTsKKwlpOTE1X21lbV90YWtlZG93bihoZWFwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCmluZGV4IDU0MjQ1M2YuLjVhMDk0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaApAQCAtMTU2LDcgKzE1Niw3IEBACiAjZGVmaW5lIE1JX1NVU1BFTkRfRkxVU0gJTUlfSU5TVFIoMHgwYiwgMCkKICNkZWZpbmUgICBNSV9TVVNQRU5EX0ZMVVNIX0VOCSgxPDwwKQogI2RlZmluZSBNSV9SRVBPUlRfSEVBRAkJTUlfSU5TVFIoMHgwNywgMCkKLSNkZWZpbmUgTUlfT1ZFUkxBWV9GTElQCQlNSV9JTlNUUigweDExLDApCisjZGVmaW5lIE1JX09WRVJMQVlfRkxJUAkJTUlfSU5TVFIoMHgxMSwgMCkKICNkZWZpbmUgICBNSV9PVkVSTEFZX0NPTlRJTlVFCSgweDA8PDIxKQogI2RlZmluZSAgIE1JX09WRVJMQVlfT04JCSgweDE8PDIxKQogI2RlZmluZSAgIE1JX09WRVJMQVlfT0ZGCSgweDI8PDIxKQpAQCAtMTk0LDYgKzE5NCwxMyBAQAogI2RlZmluZSAgTUlfU0VNQVBIT1JFX1VQREFURQkgICAgKDE8PDIxKQogI2RlZmluZSAgTUlfU0VNQVBIT1JFX0NPTVBBUkUJICAgICgxPDwyMCkKICNkZWZpbmUgIE1JX1NFTUFQSE9SRV9SRUdJU1RFUgkgICAgKDE8PDE4KQorI2RlZmluZSAgTUlfU0VNQVBIT1JFX1NZTkNfUlYJICAgICgyPDwxNikKKyNkZWZpbmUgIE1JX1NFTUFQSE9SRV9TWU5DX1JCCSAgICAoMDw8MTYpCisjZGVmaW5lICBNSV9TRU1BUEhPUkVfU1lOQ19WUgkgICAgKDA8PDE2KQorI2RlZmluZSAgTUlfU0VNQVBIT1JFX1NZTkNfVkIJICAgICgyPDwxNikKKyNkZWZpbmUgIE1JX1NFTUFQSE9SRV9TWU5DX0JSCSAgICAoMjw8MTYpCisjZGVmaW5lICBNSV9TRU1BUEhPUkVfU1lOQ19CVgkgICAgKDA8PDE2KQorI2RlZmluZSAgTUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRCAgKDE8PDApCiAvKgogICogM0QgaW5zdHJ1Y3Rpb25zIHVzZWQgYnkgdGhlIGtlcm5lbAogICovCkBAIC0yMzUsMTYgKzI0MiwyMiBAQAogI2RlZmluZSAgIEFTWU5DX0ZMSVAgICAgICAgICAgICAgICAgKDE8PDIyKQogI2RlZmluZSAgIERJU1BMQVlfUExBTkVfQSAgICAgICAgICAgKDA8PDIwKQogI2RlZmluZSAgIERJU1BMQVlfUExBTkVfQiAgICAgICAgICAgKDE8PDIwKQotI2RlZmluZSBHRlhfT1BfUElQRV9DT05UUk9MCSgoMHgzPDwyOSl8KDB4Mzw8MjcpfCgweDI8PDI0KXwyKQotI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9RV19XUklURQkoMTw8MTQpCi0jZGVmaW5lICAgUElQRV9DT05UUk9MX0RFUFRIX1NUQUxMICgxPDwxMykKLSNkZWZpbmUgICBQSVBFX0NPTlRST0xfV0NfRkxVU0gJKDE8PDEyKQotI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9JU19GTFVTSAkoMTw8MTEpIC8qIE1CWiBvbiBJcm9ubGFrZSAqLwotI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9UQ19GTFVTSCAoMTw8MTApIC8qIEdNNDUrIG9ubHkgKi8KLSNkZWZpbmUgICBQSVBFX0NPTlRST0xfSVNQX0RJUwkoMTw8OSkKLSNkZWZpbmUgICBQSVBFX0NPTlRST0xfTk9USUZZCSgxPDw4KQorI2RlZmluZSBHRlhfT1BfUElQRV9DT05UUk9MKGxlbikJKCgweDM8PDI5KXwoMHgzPDwyNyl8KDB4Mjw8MjQpfChsZW4tMikpCisjZGVmaW5lICAgUElQRV9DT05UUk9MX0NTX1NUQUxMCQkJCSgxPDwyMCkKKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfUVdfV1JJVEUJCQkJKDE8PDE0KQorI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9ERVBUSF9TVEFMTAkJCSgxPDwxMykKKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfV1JJVEVfRkxVU0gJCQkoMTw8MTIpCisjZGVmaW5lICAgUElQRV9DT05UUk9MX1JFTkRFUl9UQVJHRVRfQ0FDSEVfRkxVU0gJKDE8PDEyKSAvKiBnZW42KyAqLworI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9JTlNUUlVDVElPTl9DQUNIRV9JTlZBTElEQVRFCSgxPDwxMSkgLyogTUJaIG9uIElyb25sYWtlICovCisjZGVmaW5lICAgUElQRV9DT05UUk9MX1RFWFRVUkVfQ0FDSEVfSU5WQUxJREFURQkJKDE8PDEwKSAvKiBHTTQ1KyBvbmx5ICovCisjZGVmaW5lICAgUElQRV9DT05UUk9MX0lORElSRUNUX1NUQVRFX0RJU0FCTEUJCSgxPDw5KQorI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9OT1RJRlkJCQkJKDE8PDgpCisjZGVmaW5lICAgUElQRV9DT05UUk9MX1ZGX0NBQ0hFX0lOVkFMSURBVEUJCSgxPDw0KQorI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9DT05TVF9DQUNIRV9JTlZBTElEQVRFCQkoMTw8MykKKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfU1RBVEVfQ0FDSEVfSU5WQUxJREFURQkJKDE8PDIpCisjZGVmaW5lICAgUElQRV9DT05UUk9MX1NUQUxMX0FUX1NDT1JFQk9BUkQJCSgxPDwxKQorI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9ERVBUSF9DQUNIRV9GTFVTSAkJKDE8PDApCiAjZGVmaW5lICAgUElQRV9DT05UUk9MX0dMT0JBTF9HVFQgKDE8PDIpIC8qIGluIGFkZHIgZHdvcmQgKi8KLSNkZWZpbmUgICBQSVBFX0NPTlRST0xfU1RBTExfRU4JKDE8PDEpIC8qIGluIGFkZHIgd29yZCwgSXJvbmxha2UrIG9ubHkgKi8KIAogCiAvKgpAQCAtMjk2LDYgKzMwOSwxMiBAQAogI2RlZmluZSBSSU5HX0NUTChiYXNlKQkJKChiYXNlKSsweDNjKQogI2RlZmluZSBSSU5HX1NZTkNfMChiYXNlKQkoKGJhc2UpKzB4NDApCiAjZGVmaW5lIFJJTkdfU1lOQ18xKGJhc2UpCSgoYmFzZSkrMHg0NCkKKyNkZWZpbmUgR0VONl9SVlNZTkMgKFJJTkdfU1lOQ18wKFJFTkRFUl9SSU5HX0JBU0UpKQorI2RlZmluZSBHRU42X1JCU1lOQyAoUklOR19TWU5DXzEoUkVOREVSX1JJTkdfQkFTRSkpCisjZGVmaW5lIEdFTjZfVlJTWU5DIChSSU5HX1NZTkNfMShHRU42X0JTRF9SSU5HX0JBU0UpKQorI2RlZmluZSBHRU42X1ZCU1lOQyAoUklOR19TWU5DXzAoR0VONl9CU0RfUklOR19CQVNFKSkKKyNkZWZpbmUgR0VONl9CUlNZTkMgKFJJTkdfU1lOQ18wKEJMVF9SSU5HX0JBU0UpKQorI2RlZmluZSBHRU42X0JWU1lOQyAoUklOR19TWU5DXzEoQkxUX1JJTkdfQkFTRSkpCiAjZGVmaW5lIFJJTkdfTUFYX0lETEUoYmFzZSkJKChiYXNlKSsweDU0KQogI2RlZmluZSBSSU5HX0hXU19QR0EoYmFzZSkJKChiYXNlKSsweDgwKQogI2RlZmluZSBSSU5HX0hXU19QR0FfR0VONihiYXNlKQkoKGJhc2UpKzB4MjA4MCkKQEAgLTQ3MCw3ICs0ODksNyBAQAogCiAvKiBFbmFibGVzIG5vbi1zZXF1ZW50aWFsIGRhdGEgcmVhZHMgdGhyb3VnaCBhcmJpdGVyCiAgKi8KLSNkZWZpbmUgICBNSV9BUkJfRFVBTF9EQVRBX1BIQVNFX0RJU0FCTEUgICAgICAgCSgxIDw8IDkpCisjZGVmaW5lICAgTUlfQVJCX0RVQUxfREFUQV9QSEFTRV9ESVNBQkxFCSgxIDw8IDkpCiAKIC8qIERpc2FibGUgRlNCIHNub29waW5nIG9mIGNhY2hlYWJsZSB3cml0ZSBjeWNsZXMgZnJvbSBiaW5uZXIvcmVuZGVyCiAgKiBjb21tYW5kIHN0cmVhbQpAQCAtNjI2LDcgKzY0NSw3IEBACiAKICNkZWZpbmUgSUxLX0RJU1BMQVlfQ0hJQ0tFTjEJMHg0MjAwMAogI2RlZmluZSAgIElMS19GQkNRX0RJUwkJKDE8PDIyKQotI2RlZmluZSAgIElMS19QQUJTVFJFVENIX0RJUyAJKDE8PDIxKQorI2RlZmluZQkgIElMS19QQUJTVFJFVENIX0RJUwkoMTw8MjEpCiAKIAogLyoKQEAgLTIzNTgsNyArMjM3Nyw3IEBACiAKICNkZWZpbmUgRFNQRlcxCQkJMHg3MDAzNAogI2RlZmluZSAgIERTUEZXX1NSX1NISUZUCTIzCi0jZGVmaW5lICAgRFNQRldfU1JfTUFTSyAJKDB4MWZmPDwyMykKKyNkZWZpbmUgICBEU1BGV19TUl9NQVNLCQkoMHgxZmY8PDIzKQogI2RlZmluZSAgIERTUEZXX0NVUlNPUkJfU0hJRlQJMTYKICNkZWZpbmUgICBEU1BGV19DVVJTT1JCX01BU0sJKDB4M2Y8PDE2KQogI2RlZmluZSAgIERTUEZXX1BMQU5FQl9TSElGVAk4CkBAIC0yNDE2LDYgKzI0MzUsNyBAQAogI2RlZmluZSAgV00wX1BJUEVfQ1VSU09SX01BU0sJKDB4MWYpCiAKICNkZWZpbmUgV00wX1BJUEVCX0lMSwkJMHg0NTEwNAorI2RlZmluZSBXTTBfUElQRUNfSVZCCQkweDQ1MjAwCiAjZGVmaW5lIFdNMV9MUF9JTEsJCTB4NDUxMDgKICNkZWZpbmUgIFdNMV9MUF9TUl9FTgkJKDE8PDMxKQogI2RlZmluZSAgV00xX0xQX0xBVEVOQ1lfU0hJRlQJMjQKQEAgLTI1NTQsMTAgKzI1NzQsMTggQEAKICNkZWZpbmUgX0NVUkJCQVNFCQkweDcwMGM0CiAjZGVmaW5lIF9DVVJCUE9TCQkJMHg3MDBjOAogCisjZGVmaW5lIF9DVVJCQ05UUl9JVkIJCTB4NzEwODAKKyNkZWZpbmUgX0NVUkJCQVNFX0lWQgkJMHg3MTA4NAorI2RlZmluZSBfQ1VSQlBPU19JVkIJCTB4NzEwODgKKwogI2RlZmluZSBDVVJDTlRSKHBpcGUpIF9QSVBFKHBpcGUsIF9DVVJBQ05UUiwgX0NVUkJDTlRSKQogI2RlZmluZSBDVVJCQVNFKHBpcGUpIF9QSVBFKHBpcGUsIF9DVVJBQkFTRSwgX0NVUkJCQVNFKQogI2RlZmluZSBDVVJQT1MocGlwZSkgX1BJUEUocGlwZSwgX0NVUkFQT1MsIF9DVVJCUE9TKQogCisjZGVmaW5lIENVUkNOVFJfSVZCKHBpcGUpIF9QSVBFKHBpcGUsIF9DVVJBQ05UUiwgX0NVUkJDTlRSX0lWQikKKyNkZWZpbmUgQ1VSQkFTRV9JVkIocGlwZSkgX1BJUEUocGlwZSwgX0NVUkFCQVNFLCBfQ1VSQkJBU0VfSVZCKQorI2RlZmluZSBDVVJQT1NfSVZCKHBpcGUpIF9QSVBFKHBpcGUsIF9DVVJBUE9TLCBfQ1VSQlBPU19JVkIpCisKIC8qIERpc3BsYXkgQSBjb250cm9sICovCiAjZGVmaW5lIF9EU1BBQ05UUiAgICAgICAgICAgICAgICAweDcwMTgwCiAjZGVmaW5lICAgRElTUExBWV9QTEFORV9FTkFCTEUJCQkoMTw8MzEpCkBAIC0yOTAzLDEyICsyOTMxLDEzIEBACiAjZGVmaW5lIFNERUlFUiAgMHhjNDAwYwogCiAvKiBkaWdpdGFsIHBvcnQgaG90cGx1ZyAqLwotI2RlZmluZSBQQ0hfUE9SVF9IT1RQTFVHICAgICAgICAweGM0MDMwCisjZGVmaW5lIFBDSF9QT1JUX0hPVFBMVUcgICAgICAgIDB4YzQwMzAJCS8qIFNIT1RQTFVHX0NUTCAqLwogI2RlZmluZSBQT1JURF9IT1RQTFVHX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDIwKQogI2RlZmluZSBQT1JURF9QVUxTRV9EVVJBVElPTl8ybXMgICAgICAgICgwKQogI2RlZmluZSBQT1JURF9QVUxTRV9EVVJBVElPTl80XzVtcyAgICAgICgxIDw8IDE4KQogI2RlZmluZSBQT1JURF9QVUxTRV9EVVJBVElPTl82bXMgICAgICAgICgyIDw8IDE4KQogI2RlZmluZSBQT1JURF9QVUxTRV9EVVJBVElPTl8xMDBtcyAgICAgICgzIDw8IDE4KQorI2RlZmluZSBQT1JURF9QVUxTRV9EVVJBVElPTl9NQVNLCSgzIDw8IDE4KQogI2RlZmluZSBQT1JURF9IT1RQTFVHX05PX0RFVEVDVCAgICAgICAgICgwKQogI2RlZmluZSBQT1JURF9IT1RQTFVHX1NIT1JUX0RFVEVDVCAgICAgICgxIDw8IDE2KQogI2RlZmluZSBQT1JURF9IT1RQTFVHX0xPTkdfREVURUNUICAgICAgICgxIDw8IDE3KQpAQCAtMjkxNyw2ICsyOTQ2LDcgQEAKICNkZWZpbmUgUE9SVENfUFVMU0VfRFVSQVRJT05fNF81bXMgICAgICAoMSA8PCAxMCkKICNkZWZpbmUgUE9SVENfUFVMU0VfRFVSQVRJT05fNm1zICAgICAgICAoMiA8PCAxMCkKICNkZWZpbmUgUE9SVENfUFVMU0VfRFVSQVRJT05fMTAwbXMgICAgICAoMyA8PCAxMCkKKyNkZWZpbmUgUE9SVENfUFVMU0VfRFVSQVRJT05fTUFTSwkoMyA8PCAxMCkKICNkZWZpbmUgUE9SVENfSE9UUExVR19OT19ERVRFQ1QgICAgICAgICAoMCkKICNkZWZpbmUgUE9SVENfSE9UUExVR19TSE9SVF9ERVRFQ1QgICAgICAoMSA8PCA4KQogI2RlZmluZSBQT1JUQ19IT1RQTFVHX0xPTkdfREVURUNUICAgICAgICgxIDw8IDkpCkBAIC0yOTI1LDYgKzI5NTUsNyBAQAogI2RlZmluZSBQT1JUQl9QVUxTRV9EVVJBVElPTl80XzVtcyAgICAgICgxIDw8IDIpCiAjZGVmaW5lIFBPUlRCX1BVTFNFX0RVUkFUSU9OXzZtcyAgICAgICAgKDIgPDwgMikKICNkZWZpbmUgUE9SVEJfUFVMU0VfRFVSQVRJT05fMTAwbXMgICAgICAoMyA8PCAyKQorI2RlZmluZSBQT1JUQl9QVUxTRV9EVVJBVElPTl9NQVNLCSgzIDw8IDIpCiAjZGVmaW5lIFBPUlRCX0hPVFBMVUdfTk9fREVURUNUICAgICAgICAgKDApCiAjZGVmaW5lIFBPUlRCX0hPVFBMVUdfU0hPUlRfREVURUNUICAgICAgKDEgPDwgMCkKICNkZWZpbmUgUE9SVEJfSE9UUExVR19MT05HX0RFVEVDVCAgICAgICAoMSA8PCAxKQpAQCAtMjk0NSwxNSArMjk3NiwxNSBAQAogCiAjZGVmaW5lIF9QQ0hfRFBMTF9BICAgICAgICAgICAgICAweGM2MDE0CiAjZGVmaW5lIF9QQ0hfRFBMTF9CICAgICAgICAgICAgICAweGM2MDE4Ci0jZGVmaW5lIFBDSF9EUExMKHBpcGUpIF9QSVBFKHBpcGUsIF9QQ0hfRFBMTF9BLCBfUENIX0RQTExfQikKKyNkZWZpbmUgUENIX0RQTEwocGlwZSkgKHBpcGUgPT0gMCA/ICBfUENIX0RQTExfQSA6IF9QQ0hfRFBMTF9CKQogCiAjZGVmaW5lIF9QQ0hfRlBBMCAgICAgICAgICAgICAgICAweGM2MDQwCiAjZGVmaW5lICBGUF9DQl9UVU5FCQkoMHgzPDwyMikKICNkZWZpbmUgX1BDSF9GUEExICAgICAgICAgICAgICAgIDB4YzYwNDQKICNkZWZpbmUgX1BDSF9GUEIwICAgICAgICAgICAgICAgIDB4YzYwNDgKICNkZWZpbmUgX1BDSF9GUEIxICAgICAgICAgICAgICAgIDB4YzYwNGMKLSNkZWZpbmUgUENIX0ZQMChwaXBlKSBfUElQRShwaXBlLCBfUENIX0ZQQTAsIF9QQ0hfRlBCMCkKLSNkZWZpbmUgUENIX0ZQMShwaXBlKSBfUElQRShwaXBlLCBfUENIX0ZQQTEsIF9QQ0hfRlBCMSkKKyNkZWZpbmUgUENIX0ZQMChwaXBlKSAocGlwZSA9PSAwID8gX1BDSF9GUEEwIDogX1BDSF9GUEIwKQorI2RlZmluZSBQQ0hfRlAxKHBpcGUpIChwaXBlID09IDAgPyBfUENIX0ZQQTEgOiBfUENIX0ZQQjEpCiAKICNkZWZpbmUgUENIX0RQTExfVEVTVCAgICAgICAgICAgMHhjNjA2YwogCkBAIC0zMTY3LDYgKzMxOTgsNyBAQAogI2RlZmluZSAgRkRJX0xJTktfVFJBSU5fTk9ORV9JVkIgICAgICAgICAgICAoMzw8OCkKIAogLyogYm90aCBUeCBhbmQgUnggKi8KKyNkZWZpbmUgIEZESV9DT01QT1NJVEVfU1lOQwkJKDE8PDExKQogI2RlZmluZSAgRkRJX0xJTktfVFJBSU5fQVVUTwkJKDE8PDEwKQogI2RlZmluZSAgRkRJX1NDUkFNQkxJTkdfRU5BQkxFICAgICAgICAgICgwPDw3KQogI2RlZmluZSAgRkRJX1NDUkFNQkxJTkdfRElTQUJMRSAgICAgICAgICgxPDw3KQpAQCAtMzMwOCwxNSArMzM0MCwzNSBAQAogI2RlZmluZSBQQ0hfUFBfU1RBVFVTCQkweGM3MjAwCiAjZGVmaW5lIFBDSF9QUF9DT05UUk9MCQkweGM3MjA0CiAjZGVmaW5lICBQQU5FTF9VTkxPQ0tfUkVHUwkoMHhhYmNkIDw8IDE2KQorI2RlZmluZSAgUEFORUxfVU5MT0NLX01BU0sJKDB4ZmZmZiA8PCAxNikKICNkZWZpbmUgIEVEUF9GT1JDRV9WREQJCSgxIDw8IDMpCiAjZGVmaW5lICBFRFBfQkxDX0VOQUJMRQkJKDEgPDwgMikKICNkZWZpbmUgIFBBTkVMX1BPV0VSX1JFU0VUCSgxIDw8IDEpCiAjZGVmaW5lICBQQU5FTF9QT1dFUl9PRkYJKDAgPDwgMCkKICNkZWZpbmUgIFBBTkVMX1BPV0VSX09OCQkoMSA8PCAwKQogI2RlZmluZSBQQ0hfUFBfT05fREVMQVlTCTB4YzcyMDgKKyNkZWZpbmUgIFBBTkVMX1BPUlRfU0VMRUNUX01BU0sJKDMgPDwgMzApCisjZGVmaW5lICBQQU5FTF9QT1JUX1NFTEVDVF9MVkRTCSgwIDw8IDMwKQorI2RlZmluZSAgUEFORUxfUE9SVF9TRUxFQ1RfRFBBCSgxIDw8IDMwKQogI2RlZmluZSAgRURQX1BBTkVMCQkoMSA8PCAzMCkKKyNkZWZpbmUgIFBBTkVMX1BPUlRfU0VMRUNUX0RQQwkoMiA8PCAzMCkKKyNkZWZpbmUgIFBBTkVMX1BPUlRfU0VMRUNUX0RQRAkoMyA8PCAzMCkKKyNkZWZpbmUgIFBBTkVMX1BPV0VSX1VQX0RFTEFZX01BU0sJKDB4MWZmZjAwMDApCisjZGVmaW5lICBQQU5FTF9QT1dFUl9VUF9ERUxBWV9TSElGVAkxNgorI2RlZmluZSAgUEFORUxfTElHSFRfT05fREVMQVlfTUFTSwkoMHgxZmZmKQorI2RlZmluZSAgUEFORUxfTElHSFRfT05fREVMQVlfU0hJRlQJMAorCiAjZGVmaW5lIFBDSF9QUF9PRkZfREVMQVlTCTB4YzcyMGMKKyNkZWZpbmUgIFBBTkVMX1BPV0VSX0RPV05fREVMQVlfTUFTSwkoMHgxZmZmMDAwMCkKKyNkZWZpbmUgIFBBTkVMX1BPV0VSX0RPV05fREVMQVlfU0hJRlQJMTYKKyNkZWZpbmUgIFBBTkVMX0xJR0hUX09GRl9ERUxBWV9NQVNLCSgweDFmZmYpCisjZGVmaW5lICBQQU5FTF9MSUdIVF9PRkZfREVMQVlfU0hJRlQJMAorCiAjZGVmaW5lIFBDSF9QUF9ESVZJU09SCQkweGM3MjEwCisjZGVmaW5lICBQUF9SRUZFUkVOQ0VfRElWSURFUl9NQVNLCSgweGZmZmZmZjAwKQorI2RlZmluZSAgUFBfUkVGRVJFTkNFX0RJVklERVJfU0hJRlQJOAorI2RlZmluZSAgUEFORUxfUE9XRVJfQ1lDTEVfREVMQVlfTUFTSwkoMHgxZikKKyNkZWZpbmUgIFBBTkVMX1BPV0VSX0NZQ0xFX0RFTEFZX1NISUZUCTAKIAogI2RlZmluZSBQQ0hfRFBfQgkJMHhlNDEwMAogI2RlZmluZSBQQ0hfRFBCX0FVWF9DSF9DVEwJMHhlNDExMApAQCAtMzQ3MCw0ICszNTIyLDI5IEBACiAjZGVmaW5lIEdFTjZfUENPREVfREFUQQkJCQkweDEzODEyOAogI2RlZmluZSAgIEdFTjZfUENPREVfRlJFUV9JQV9SQVRJT19TSElGVAk4CiAKKyNkZWZpbmUgRzRYX0FVRF9WSURfRElECQkJMHg2MjAyMAorI2RlZmluZSBJTlRFTF9BVURJT19ERVZDTAkJMHg4MDg2MjlGQgorI2RlZmluZSBJTlRFTF9BVURJT19ERVZCTEMJCTB4ODA4NjI4MDEKKyNkZWZpbmUgSU5URUxfQVVESU9fREVWQ1RHCQkweDgwODYyODAyCisKKyNkZWZpbmUgRzRYX0FVRF9DTlRMX1NUCQkJMHg2MjBCNAorI2RlZmluZSBHNFhfRUxEVl9ERVZDTF9ERVZCTEMJCSgxIDw8IDEzKQorI2RlZmluZSBHNFhfRUxEVl9ERVZDVEcJCQkoMSA8PCAxNCkKKyNkZWZpbmUgRzRYX0VMRF9BRERSCQkJKDB4ZiA8PCA1KQorI2RlZmluZSBHNFhfRUxEX0FDSwkJCSgxIDw8IDQpCisjZGVmaW5lIEc0WF9IRE1JV19IRE1JRURJRAkJMHg2MjEwQworCisjZGVmaW5lIEdFTjVfSERNSVdfSERNSUVESURfQQkJMHhFMjA1MAorI2RlZmluZSBHRU41X0FVRF9DTlRMX1NUX0EJCTB4RTIwQjQKKyNkZWZpbmUgR0VONV9FTERfQlVGRkVSX1NJWkUJCSgweDFmIDw8IDEwKQorI2RlZmluZSBHRU41X0VMRF9BRERSRVNTCQkoMHgxZiA8PCA1KQorI2RlZmluZSBHRU41X0VMRF9BQ0sJCQkoMSA8PCA0KQorI2RlZmluZSBHRU41X0FVRF9DTlRMX1NUMgkJMHhFMjBDMAorI2RlZmluZSBHRU41X0VMRF9WQUxJREIJCQkoMSA8PCAwKQorI2RlZmluZSBHRU41X0NQX1JFQURZQgkJCSgxIDw8IDEpCisKKyNkZWZpbmUgR0VON19IRE1JV19IRE1JRURJRF9BCQkweEU1MDUwCisjZGVmaW5lIEdFTjdfQVVEX0NOVFJMX1NUX0EJCTB4RTUwQjQKKyNkZWZpbmUgR0VON19BVURfQ05UUkxfU1QyCQkweEU1MEMwCisKICNlbmRpZiAvKiBfSTkxNV9SRUdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMKaW5kZXggZjEwNzQyMy4uZjhmNjAyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAllbHNlCiAJCWFycmF5ID0gZGV2X3ByaXYtPnNhdmVfcGFsZXR0ZV9iOwogCi0JZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQogCQlhcnJheVtpXSA9IEk5MTVfUkVBRChyZWcgKyAoaSA8PCAyKSk7CiB9CiAKQEAgLTgyLDcgKzgyLDcgQEAKIAllbHNlCiAJCWFycmF5ID0gZGV2X3ByaXYtPnNhdmVfcGFsZXR0ZV9iOwogCi0JZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQogCQlJOTE1X1dSSVRFKHJlZyArIChpIDw8IDIpLCBhcnJheVtpXSk7CiB9CiAKQEAgLTg4NywxMCArODg3LDEwIEBACiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJLyogQ2FjaGUgbW9kZSBzdGF0ZSAqLwotCUk5MTVfV1JJVEUgKENBQ0hFX01PREVfMCwgZGV2X3ByaXYtPnNhdmVDQUNIRV9NT0RFXzAgfCAweGZmZmYwMDAwKTsKKwlJOTE1X1dSSVRFKENBQ0hFX01PREVfMCwgZGV2X3ByaXYtPnNhdmVDQUNIRV9NT0RFXzAgfCAweGZmZmYwMDAwKTsKIAogCS8qIE1lbW9yeSBhcmJpdHJhdGlvbiBzdGF0ZSAqLwotCUk5MTVfV1JJVEUgKE1JX0FSQl9TVEFURSwgZGV2X3ByaXYtPnNhdmVNSV9BUkJfU1RBVEUgfCAweGZmZmYwMDAwKTsKKwlJOTE1X1dSSVRFKE1JX0FSQl9TVEFURSwgZGV2X3ByaXYtPnNhdmVNSV9BUkJfU1RBVEUgfCAweGZmZmYwMDAwKTsKIAogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCUk5MTVfV1JJVEUoU1dGMDAgKyAoaSA8PCAyKSwgZGV2X3ByaXYtPnNhdmVTV0YwW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaAppbmRleCBkNjIzZmVmLi5kYWM3YmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV90cmFjZS5oCkBAIC0zODUsMjkgKzM4NSwyOSBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaTkxNV9yZWdfcncsCi0gICAgICAgICAgIFRQX1BST1RPKGJvb2wgd3JpdGUsIHUzMiByZWcsIHU2NCB2YWwsIGludCBsZW4pLAorCVRQX1BST1RPKGJvb2wgd3JpdGUsIHUzMiByZWcsIHU2NCB2YWwsIGludCBsZW4pLAogCi0gICAgICAgICAgIFRQX0FSR1Mod3JpdGUsIHJlZywgdmFsLCBsZW4pLAorCVRQX0FSR1Mod3JpdGUsIHJlZywgdmFsLCBsZW4pLAogCi0gICAgICAgICAgIFRQX1NUUlVDVF9fZW50cnkoCi0gICAgICAgICAgICAgICAgICAgX19maWVsZCh1NjQsIHZhbCkKLSAgICAgICAgICAgICAgICAgICBfX2ZpZWxkKHUzMiwgcmVnKQotICAgICAgICAgICAgICAgICAgIF9fZmllbGQodTE2LCB3cml0ZSkKLSAgICAgICAgICAgICAgICAgICBfX2ZpZWxkKHUxNiwgbGVuKQotICAgICAgICAgICAgICAgICAgICksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh1NjQsIHZhbCkKKwkJX19maWVsZCh1MzIsIHJlZykKKwkJX19maWVsZCh1MTYsIHdyaXRlKQorCQlfX2ZpZWxkKHUxNiwgbGVuKQorCQkpLAogCi0gICAgICAgICAgIFRQX2Zhc3RfYXNzaWduKAotICAgICAgICAgICAgICAgICAgIF9fZW50cnktPnZhbCA9ICh1NjQpdmFsOwotICAgICAgICAgICAgICAgICAgIF9fZW50cnktPnJlZyA9IHJlZzsKLSAgICAgICAgICAgICAgICAgICBfX2VudHJ5LT53cml0ZSA9IHdyaXRlOwotICAgICAgICAgICAgICAgICAgIF9fZW50cnktPmxlbiA9IGxlbjsKLSAgICAgICAgICAgICAgICAgICApLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT52YWwgPSAodTY0KXZhbDsKKwkJX19lbnRyeS0+cmVnID0gcmVnOworCQlfX2VudHJ5LT53cml0ZSA9IHdyaXRlOworCQlfX2VudHJ5LT5sZW4gPSBsZW47CisJCSksCiAKLSAgICAgICAgICAgVFBfcHJpbnRrKCIlcyByZWc9MHgleCwgbGVuPSVkLCB2YWw9KDB4JXgsIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZW50cnktPndyaXRlID8gIndyaXRlIiA6ICJyZWFkIiwKLQkJICAgICBfX2VudHJ5LT5yZWcsIF9fZW50cnktPmxlbiwKLQkJICAgICAodTMyKShfX2VudHJ5LT52YWwgJiAweGZmZmZmZmZmKSwKLQkJICAgICAodTMyKShfX2VudHJ5LT52YWwgPj4gMzIpKQorCVRQX3ByaW50aygiJXMgcmVnPTB4JXgsIGxlbj0lZCwgdmFsPSgweCV4LCAweCV4KSIsCisJCV9fZW50cnktPndyaXRlID8gIndyaXRlIiA6ICJyZWFkIiwKKwkJX19lbnRyeS0+cmVnLCBfX2VudHJ5LT5sZW4sCisJCSh1MzIpKF9fZW50cnktPnZhbCAmIDB4ZmZmZmZmZmYpLAorCQkodTMyKShfX2VudHJ5LT52YWwgPj4gMzIpKQogKTsKIAogI2VuZGlmIC8qIF9JOTE1X1RSQUNFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9hY3BpLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9hY3BpLmMKaW5kZXggMmNiOGUwYi4uY2I5MTIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYWNwaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2FjcGkuYwpAQCAtNjQsNyArNjQsNyBAQAogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgogCQlpZiAob2JqLT5idWZmZXIubGVuZ3RoID09IDQpIHsKLQkJCXJlc3VsdCA9KG9iai0+YnVmZmVyLnBvaW50ZXJbMF0gfAorCQkJcmVzdWx0ID0gKG9iai0+YnVmZmVyLnBvaW50ZXJbMF0gfAogCQkJCShvYmotPmJ1ZmZlci5wb2ludGVyWzFdIDw8ICA4KSB8CiAJCQkJKG9iai0+YnVmZmVyLnBvaW50ZXJbMl0gPDwgMTYpIHwKIAkJCQkob2JqLT5idWZmZXIucG9pbnRlclszXSA8PCAyNCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jCmluZGV4IDYxYWJlZjhhLi42Mzg4MGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCCpIDIwMDYgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDA2IEludGVsIENvcnBvcmF0aW9uCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC0zMDksNiArMzA5LDEzIEBACiAJCWRldl9wcml2LT5sdmRzX3VzZV9zc2MgPSBnZW5lcmFsLT5lbmFibGVfc3NjOwogCQlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9CiAJCQlpbnRlbF9iaW9zX3NzY19mcmVxdWVuY3koZGV2LCBnZW5lcmFsLT5zc2NfZnJlcSk7CisJCWRldl9wcml2LT5kaXNwbGF5X2Nsb2NrX21vZGUgPSBnZW5lcmFsLT5kaXNwbGF5X2Nsb2NrX21vZGU7CisJCURSTV9ERUJVR19LTVMoIkJEQl9HRU5FUkFMX0ZFQVRVUkVTIGludF90dl9zdXBwb3J0ICVkIGludF9jcnRfc3VwcG9ydCAlZCBsdmRzX3VzZV9zc2MgJWQgbHZkc19zc2NfZnJlcSAlZCBkaXNwbGF5X2Nsb2NrX21vZGUgJWRcbiIsCisJCQkgICAgICBkZXZfcHJpdi0+aW50X3R2X3N1cHBvcnQsCisJCQkgICAgICBkZXZfcHJpdi0+aW50X2NydF9zdXBwb3J0LAorCQkJICAgICAgZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYywKKwkJCSAgICAgIGRldl9wcml2LT5sdmRzX3NzY19mcmVxLAorCQkJICAgICAgZGV2X3ByaXYtPmRpc3BsYXlfY2xvY2tfbW9kZSk7CiAJfQogfQogCkBAIC0zODEsNyArMzg4LDcgQEAKIAkJaWYgKHBfY2hpbGQtPmR2b19wb3J0ICE9IERFVklDRV9QT1JUX0RWT0IgJiYKIAkJCXBfY2hpbGQtPmR2b19wb3J0ICE9IERFVklDRV9QT1JUX0RWT0MpIHsKIAkJCS8qIHNraXAgdGhlIGluY29ycmVjdCBTRFZPIHBvcnQgKi8KLQkJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBTRFZPIHBvcnQuIFNraXAgaXQgXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBTRFZPIHBvcnQuIFNraXAgaXRcbiIpOwogCQkJY29udGludWU7CiAJCX0KIAkJRFJNX0RFQlVHX0tNUygidGhlIFNEVk8gZGV2aWNlIHdpdGggc2xhdmUgYWRkciAlMnggaXMgZm91bmQgb24iCkBAIC0zOTYsMTUgKzQwMywxMyBAQAogCQkJcF9tYXBwaW5nLT5kdm9fd2lyaW5nID0gcF9jaGlsZC0+ZHZvX3dpcmluZzsKIAkJCXBfbWFwcGluZy0+ZGRjX3BpbiA9IHBfY2hpbGQtPmRkY19waW47CiAJCQlwX21hcHBpbmctPmkyY19waW4gPSBwX2NoaWxkLT5pMmNfcGluOwotCQkJcF9tYXBwaW5nLT5pMmNfc3BlZWQgPSBwX2NoaWxkLT5pMmNfc3BlZWQ7CiAJCQlwX21hcHBpbmctPmluaXRpYWxpemVkID0gMTsKLQkJCURSTV9ERUJVR19LTVMoIlNEVk8gZGV2aWNlOiBkdm89JXgsIGFkZHI9JXgsIHdpcmluZz0lZCwgZGRjX3Bpbj0lZCwgaTJjX3Bpbj0lZCwgaTJjX3NwZWVkPSVkXG4iLAorCQkJRFJNX0RFQlVHX0tNUygiU0RWTyBkZXZpY2U6IGR2bz0leCwgYWRkcj0leCwgd2lyaW5nPSVkLCBkZGNfcGluPSVkLCBpMmNfcGluPSVkXG4iLAogCQkJCSAgICAgIHBfbWFwcGluZy0+ZHZvX3BvcnQsCiAJCQkJICAgICAgcF9tYXBwaW5nLT5zbGF2ZV9hZGRyLAogCQkJCSAgICAgIHBfbWFwcGluZy0+ZHZvX3dpcmluZywKIAkJCQkgICAgICBwX21hcHBpbmctPmRkY19waW4sCi0JCQkJICAgICAgcF9tYXBwaW5nLT5pMmNfcGluLAotCQkJCSAgICAgIHBfbWFwcGluZy0+aTJjX3NwZWVkKTsKKwkJCQkgICAgICBwX21hcHBpbmctPmkyY19waW4pOwogCQl9IGVsc2UgewogCQkJRFJNX0RFQlVHX0tNUygiTWF5YmUgb25lIFNEVk8gcG9ydCBpcyBzaGFyZWQgYnkgIgogCQkJCQkgInR3byBTRFZPIGRldmljZS5cbiIpOwpAQCAtNTY0LDcgKzU2OSw3IEBACiAJCWNvdW50Kys7CiAJfQogCWlmICghY291bnQpIHsKLQkJRFJNX0RFQlVHX0tNUygibm8gY2hpbGQgZGV2IGlzIHBhcnNlZCBmcm9tIFZCVCBcbiIpOworCQlEUk1fREVCVUdfS01TKCJubyBjaGlsZCBkZXYgaXMgcGFyc2VkIGZyb20gVkJUXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlkZXZfcHJpdi0+Y2hpbGRfZGV2ID0ga3phbGxvYyhzaXplb2YoKnBfY2hpbGQpICogY291bnQsIEdGUF9LRVJORUwpOwpAQCAtNjEwLDcgKzYxNSw3IEBACiAJLyogRGVmYXVsdCB0byB1c2luZyBTU0MgKi8KIAlkZXZfcHJpdi0+bHZkc191c2Vfc3NjID0gMTsKIAlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9IGludGVsX2Jpb3Nfc3NjX2ZyZXF1ZW5jeShkZXYsIDEpOwotCURSTV9ERUJVRygiU2V0IGRlZmF1bHQgdG8gU1NDIGF0ICVkTUh6XG4iLCBkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSk7CisJRFJNX0RFQlVHX0tNUygiU2V0IGRlZmF1bHQgdG8gU1NDIGF0ICVkTUh6XG4iLCBkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSk7CiAKIAkvKiBlRFAgZGF0YSAqLwogCWRldl9wcml2LT5lZHAuYnBwID0gMTg7CkBAIC02MzksNyArNjQ0LDcgQEAKIAlpZiAoZGV2X3ByaXYtPm9wcmVnaW9uLnZidCkgewogCQlzdHJ1Y3QgdmJ0X2hlYWRlciAqdmJ0ID0gZGV2X3ByaXYtPm9wcmVnaW9uLnZidDsKIAkJaWYgKG1lbWNtcCh2YnQtPnNpZ25hdHVyZSwgIiRWQlQiLCA0KSA9PSAwKSB7Ci0JCQlEUk1fREVCVUdfRFJJVkVSKCJVc2luZyBWQlQgZnJvbSBPcFJlZ2lvbjogJTIwc1xuIiwKKwkJCURSTV9ERUJVR19LTVMoIlVzaW5nIFZCVCBmcm9tIE9wUmVnaW9uOiAlMjBzXG4iLAogCQkJCQkgdmJ0LT5zaWduYXR1cmUpOwogCQkJYmRiID0gKHN0cnVjdCBiZGJfaGVhZGVyICopKChjaGFyICopdmJ0ICsgdmJ0LT5iZGJfb2Zmc2V0KTsKIAkJfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmgKaW5kZXggNWY4ZTRlZC4uOGFmMzczNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgqSAyMDA2IEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMTIwLDcgKzEyMCw5IEBACiAJdTggc3NjX2ZyZXE6MTsKIAl1OCBlbmFibGVfbGZwX29uX292ZXJyaWRlOjE7CiAJdTggZGlzYWJsZV9zc2NfZGR0OjE7Ci0JdTggcnN2ZDg6MzsgLyogZmluaXNoIGJ5dGUgKi8KKwl1OCByc3ZkNzoxOworCXU4IGRpc3BsYXlfY2xvY2tfbW9kZToxOworCXU4IHJzdmQ4OjE7IC8qIGZpbmlzaCBieXRlICovCiAKICAgICAgICAgLyogYml0cyAzICovCiAJdTggZGlzYWJsZV9zbW9vdGhfdmlzaW9uOjE7CkBAIC0xMzMsNyArMTM1LDEwIEBACiAgICAgICAgIC8qIGJpdHMgNSAqLwogCXU4IGludF9jcnRfc3VwcG9ydDoxOwogCXU4IGludF90dl9zdXBwb3J0OjE7Ci0JdTggcnN2ZDExOjY7IC8qIGZpbmlzaCBieXRlICovCisJdTggaW50X2VmcF9zdXBwb3J0OjE7CisJdTggZHBfc3NjX2VuYjoxOwkvKiBQQ0ggYXR0YWNoZWQgZURQIHN1cHBvcnRzIFNTQyAqLworCXU4IGRwX3NzY19mcmVxOjE7CS8qIFNTQyBmcmVxIGZvciBQQ0ggYXR0YWNoZWQgZURQICovCisJdTggcnN2ZDExOjM7IC8qIGZpbmlzaCBieXRlICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBwcmUtOTE1ICovCkBAIC0xOTcsOCArMjAyLDcgQEAKIHN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnIHsKIAl1MTYgaGFuZGxlOwogCXUxNiBkZXZpY2VfdHlwZTsKLQl1OCAgaTJjX3NwZWVkOwotCXU4ICByc3ZkWzldOworCXU4ICBkZXZpY2VfaWRbMTBdOyAvKiBhc2NpaSBzdHJpbmcgKi8KIAl1MTYgYWRkaW5fb2Zmc2V0OwogCXU4ICBkdm9fcG9ydDsgLyogU2VlIERldmljZV9QT1JUXyogYWJvdmUgKi8KIAl1OCAgaTJjX3BpbjsKQEAgLTI0MCw3ICsyNDQsNyBAQAogCSAqIEFuZCB0aGUgZGV2aWNlIG51bSBpcyByZWxhdGVkIHdpdGggdGhlIHNpemUgb2YgZ2VuZXJhbCBkZWZpbml0aW9uCiAJICogYmxvY2suIEl0IGlzIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKIAkgKiBudW1iZXIgPSAoYmxvY2tfc2l6ZSAtIHNpemVvZihiZGJfZ2VuZXJhbF9kZWZpbml0aW9ucykpLwotCSAqIAkJc2l6ZW9mKGNoaWxkX2RldmljZV9jb25maWcpOworCSAqCSAgICAgc2l6ZW9mKGNoaWxkX2RldmljZV9jb25maWcpOwogCSAqLwogCXN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnIGRldmljZXNbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpAQCAtNDQ2LDExICs0NTAsMTEgQEAKICNkZWZpbmUgRURQX1ZTV0lOR18xXzJWCQkzCiAKIHN0cnVjdCBlZHBfcG93ZXJfc2VxIHsKLQl1MTYgdDM7Ci0JdTE2IHQ3OworCXUxNiB0MV90MzsKKwl1MTYgdDg7CiAJdTE2IHQ5OwogCXUxNiB0MTA7Ci0JdTE2IHQxMjsKKwl1MTYgdDExX3QxMjsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgZWRwX2xpbmtfcGFyYW1zIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKaW5kZXggMDk3OWQ4OC4uZmVlMGFkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKQEAgLTY5LDcgKzY5LDcgQEAKIAl0ZW1wICY9IH4oQURQQV9IU1lOQ19DTlRMX0RJU0FCTEUgfCBBRFBBX1ZTWU5DX0NOVExfRElTQUJMRSk7CiAJdGVtcCAmPSB+QURQQV9EQUNfRU5BQkxFOwogCi0Jc3dpdGNoKG1vZGUpIHsKKwlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIERSTV9NT0RFX0RQTVNfT046CiAJCXRlbXAgfD0gQURQQV9EQUNfRU5BQkxFOwogCQlicmVhazsKQEAgLTE1MiwxNyArMTUyLDEzIEBACiAJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCiAJCWFkcGEgfD0gQURQQV9WU1lOQ19BQ1RJVkVfSElHSDsKIAotCWlmIChpbnRlbF9jcnRjLT5waXBlID09IDApIHsKLQkJaWYgKEhBU19QQ0hfQ1BUKGRldikpCi0JCQlhZHBhIHw9IFBPUlRfVFJBTlNfQV9TRUxfQ1BUOwotCQllbHNlCi0JCQlhZHBhIHw9IEFEUEFfUElQRV9BX1NFTEVDVDsKLQl9IGVsc2UgewotCQlpZiAoSEFTX1BDSF9DUFQoZGV2KSkKLQkJCWFkcGEgfD0gUE9SVF9UUkFOU19CX1NFTF9DUFQ7Ci0JCWVsc2UKLQkJCWFkcGEgfD0gQURQQV9QSVBFX0JfU0VMRUNUOwotCX0KKwkvKiBGb3IgQ1BUIGFsbG93IDMgcGlwZSBjb25maWcsIGZvciBvdGhlcnMganVzdCB1c2UgQSBvciBCICovCisJaWYgKEhBU19QQ0hfQ1BUKGRldikpCisJCWFkcGEgfD0gUE9SVF9UUkFOU19TRUxfQ1BUKGludGVsX2NydGMtPnBpcGUpOworCWVsc2UgaWYgKGludGVsX2NydGMtPnBpcGUgPT0gMCkKKwkJYWRwYSB8PSBBRFBBX1BJUEVfQV9TRUxFQ1Q7CisJZWxzZQorCQlhZHBhIHw9IEFEUEFfUElQRV9CX1NFTEVDVDsKIAogCWlmICghSEFTX1BDSF9TUExJVChkZXYpKQogCQlJOTE1X1dSSVRFKEJDTFJQQVQoaW50ZWxfY3J0Yy0+cGlwZSksIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCmluZGV4IDA0NDExYWQuLjk4MWIxZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9lZGlkLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImludGVsX2Rydi5oIgogI2luY2x1ZGUgImk5MTVfZHJtLmgiCkBAIC00MiwzOSArNDMsMzkgQEAKIAogI2RlZmluZSBIQVNfZURQIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9FRFApKQogCi1ib29sIGludGVsX3BpcGVfaGFzX3R5cGUgKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHR5cGUpOworYm9vbCBpbnRlbF9waXBlX2hhc190eXBlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHR5cGUpOwogc3RhdGljIHZvaWQgaW50ZWxfdXBkYXRlX3dhdGVybWFya3Moc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBpbnRlbF9pbmNyZWFzZV9wbGxjbG9jayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwogc3RhdGljIHZvaWQgaW50ZWxfY3J0Y191cGRhdGVfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgYm9vbCBvbik7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBnaXZlbiB2YWx1ZXMgKi8KLSAgICBpbnQgbjsKLSAgICBpbnQgbTEsIG0yOwotICAgIGludCBwMSwgcDI7Ci0gICAgLyogZGVyaXZlZCB2YWx1ZXMgKi8KLSAgICBpbnQJZG90OwotICAgIGludAl2Y287Ci0gICAgaW50CW07Ci0gICAgaW50CXA7CisJLyogZ2l2ZW4gdmFsdWVzICovCisJaW50IG47CisJaW50IG0xLCBtMjsKKwlpbnQgcDEsIHAyOworCS8qIGRlcml2ZWQgdmFsdWVzICovCisJaW50CWRvdDsKKwlpbnQJdmNvOworCWludAltOworCWludAlwOwogfSBpbnRlbF9jbG9ja190OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50CW1pbiwgbWF4OworCWludAltaW4sIG1heDsKIH0gaW50ZWxfcmFuZ2VfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludAlkb3RfbGltaXQ7Ci0gICAgaW50CXAyX3Nsb3csIHAyX2Zhc3Q7CisJaW50CWRvdF9saW1pdDsKKwlpbnQJcDJfc2xvdywgcDJfZmFzdDsKIH0gaW50ZWxfcDJfdDsKIAogI2RlZmluZSBJTlRFTF9QMl9OVU0JCSAgICAgIDIKIHR5cGVkZWYgc3RydWN0IGludGVsX2xpbWl0IGludGVsX2xpbWl0X3Q7CiBzdHJ1Y3QgaW50ZWxfbGltaXQgewotICAgIGludGVsX3JhbmdlX3QgICBkb3QsIHZjbywgbiwgbSwgbTEsIG0yLCBwLCBwMTsKLSAgICBpbnRlbF9wMl90CSAgICBwMjsKLSAgICBib29sICgqIGZpbmRfcGxsKShjb25zdCBpbnRlbF9saW1pdF90ICosIHN0cnVjdCBkcm1fY3J0YyAqLAotCQkgICAgICBpbnQsIGludCwgaW50ZWxfY2xvY2tfdCAqKTsKKwlpbnRlbF9yYW5nZV90ICAgZG90LCB2Y28sIG4sIG0sIG0xLCBtMiwgcCwgcDE7CisJaW50ZWxfcDJfdAkgICAgcDI7CisJYm9vbCAoKiBmaW5kX3BsbCkoY29uc3QgaW50ZWxfbGltaXRfdCAqLCBzdHJ1Y3QgZHJtX2NydGMgKiwKKwkJCWludCwgaW50LCBpbnRlbF9jbG9ja190ICopOwogfTsKIAogLyogRkRJICovCkBAIC0xMDUsNTYgKzEwNiw1NiBAQAogfQogCiBzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfaTh4eF9kdm8gPSB7Ci0gICAgICAgIC5kb3QgPSB7IC5taW4gPSAyNTAwMCwgLm1heCA9IDM1MDAwMCB9LAotICAgICAgICAudmNvID0geyAubWluID0gOTMwMDAwLCAubWF4ID0gMTQwMDAwMCB9LAotICAgICAgICAubiA9IHsgLm1pbiA9IDMsIC5tYXggPSAxNiB9LAotICAgICAgICAubSA9IHsgLm1pbiA9IDk2LCAubWF4ID0gMTQwIH0sCi0gICAgICAgIC5tMSA9IHsgLm1pbiA9IDE4LCAubWF4ID0gMjYgfSwKLSAgICAgICAgLm0yID0geyAubWluID0gNiwgLm1heCA9IDE2IH0sCi0gICAgICAgIC5wID0geyAubWluID0gNCwgLm1heCA9IDEyOCB9LAotICAgICAgICAucDEgPSB7IC5taW4gPSAyLCAubWF4ID0gMzMgfSwKKwkuZG90ID0geyAubWluID0gMjUwMDAsIC5tYXggPSAzNTAwMDAgfSwKKwkudmNvID0geyAubWluID0gOTMwMDAwLCAubWF4ID0gMTQwMDAwMCB9LAorCS5uID0geyAubWluID0gMywgLm1heCA9IDE2IH0sCisJLm0gPSB7IC5taW4gPSA5NiwgLm1heCA9IDE0MCB9LAorCS5tMSA9IHsgLm1pbiA9IDE4LCAubWF4ID0gMjYgfSwKKwkubTIgPSB7IC5taW4gPSA2LCAubWF4ID0gMTYgfSwKKwkucCA9IHsgLm1pbiA9IDQsIC5tYXggPSAxMjggfSwKKwkucDEgPSB7IC5taW4gPSAyLCAubWF4ID0gMzMgfSwKIAkucDIgPSB7IC5kb3RfbGltaXQgPSAxNjUwMDAsCiAJCS5wMl9zbG93ID0gNCwgLnAyX2Zhc3QgPSAyIH0sCiAJLmZpbmRfcGxsID0gaW50ZWxfZmluZF9iZXN0X1BMTCwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19pOHh4X2x2ZHMgPSB7Ci0gICAgICAgIC5kb3QgPSB7IC5taW4gPSAyNTAwMCwgLm1heCA9IDM1MDAwMCB9LAotICAgICAgICAudmNvID0geyAubWluID0gOTMwMDAwLCAubWF4ID0gMTQwMDAwMCB9LAotICAgICAgICAubiA9IHsgLm1pbiA9IDMsIC5tYXggPSAxNiB9LAotICAgICAgICAubSA9IHsgLm1pbiA9IDk2LCAubWF4ID0gMTQwIH0sCi0gICAgICAgIC5tMSA9IHsgLm1pbiA9IDE4LCAubWF4ID0gMjYgfSwKLSAgICAgICAgLm0yID0geyAubWluID0gNiwgLm1heCA9IDE2IH0sCi0gICAgICAgIC5wID0geyAubWluID0gNCwgLm1heCA9IDEyOCB9LAotICAgICAgICAucDEgPSB7IC5taW4gPSAxLCAubWF4ID0gNiB9LAorCS5kb3QgPSB7IC5taW4gPSAyNTAwMCwgLm1heCA9IDM1MDAwMCB9LAorCS52Y28gPSB7IC5taW4gPSA5MzAwMDAsIC5tYXggPSAxNDAwMDAwIH0sCisJLm4gPSB7IC5taW4gPSAzLCAubWF4ID0gMTYgfSwKKwkubSA9IHsgLm1pbiA9IDk2LCAubWF4ID0gMTQwIH0sCisJLm0xID0geyAubWluID0gMTgsIC5tYXggPSAyNiB9LAorCS5tMiA9IHsgLm1pbiA9IDYsIC5tYXggPSAxNiB9LAorCS5wID0geyAubWluID0gNCwgLm1heCA9IDEyOCB9LAorCS5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSA2IH0sCiAJLnAyID0geyAuZG90X2xpbWl0ID0gMTY1MDAwLAogCQkucDJfc2xvdyA9IDE0LCAucDJfZmFzdCA9IDcgfSwKIAkuZmluZF9wbGwgPSBpbnRlbF9maW5kX2Jlc3RfUExMLAogfTsKIAogc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2k5eHhfc2R2byA9IHsKLSAgICAgICAgLmRvdCA9IHsgLm1pbiA9IDIwMDAwLCAubWF4ID0gNDAwMDAwIH0sCi0gICAgICAgIC52Y28gPSB7IC5taW4gPSAxNDAwMDAwLCAubWF4ID0gMjgwMDAwMCB9LAotICAgICAgICAubiA9IHsgLm1pbiA9IDEsIC5tYXggPSA2IH0sCi0gICAgICAgIC5tID0geyAubWluID0gNzAsIC5tYXggPSAxMjAgfSwKLSAgICAgICAgLm0xID0geyAubWluID0gMTAsIC5tYXggPSAyMiB9LAotICAgICAgICAubTIgPSB7IC5taW4gPSA1LCAubWF4ID0gOSB9LAotICAgICAgICAucCA9IHsgLm1pbiA9IDUsIC5tYXggPSA4MCB9LAotICAgICAgICAucDEgPSB7IC5taW4gPSAxLCAubWF4ID0gOCB9LAorCS5kb3QgPSB7IC5taW4gPSAyMDAwMCwgLm1heCA9IDQwMDAwMCB9LAorCS52Y28gPSB7IC5taW4gPSAxNDAwMDAwLCAubWF4ID0gMjgwMDAwMCB9LAorCS5uID0geyAubWluID0gMSwgLm1heCA9IDYgfSwKKwkubSA9IHsgLm1pbiA9IDcwLCAubWF4ID0gMTIwIH0sCisJLm0xID0geyAubWluID0gMTAsIC5tYXggPSAyMiB9LAorCS5tMiA9IHsgLm1pbiA9IDUsIC5tYXggPSA5IH0sCisJLnAgPSB7IC5taW4gPSA1LCAubWF4ID0gODAgfSwKKwkucDEgPSB7IC5taW4gPSAxLCAubWF4ID0gOCB9LAogCS5wMiA9IHsgLmRvdF9saW1pdCA9IDIwMDAwMCwKIAkJLnAyX3Nsb3cgPSAxMCwgLnAyX2Zhc3QgPSA1IH0sCiAJLmZpbmRfcGxsID0gaW50ZWxfZmluZF9iZXN0X1BMTCwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19pOXh4X2x2ZHMgPSB7Ci0gICAgICAgIC5kb3QgPSB7IC5taW4gPSAyMDAwMCwgLm1heCA9IDQwMDAwMCB9LAotICAgICAgICAudmNvID0geyAubWluID0gMTQwMDAwMCwgLm1heCA9IDI4MDAwMDAgfSwKLSAgICAgICAgLm4gPSB7IC5taW4gPSAxLCAubWF4ID0gNiB9LAotICAgICAgICAubSA9IHsgLm1pbiA9IDcwLCAubWF4ID0gMTIwIH0sCi0gICAgICAgIC5tMSA9IHsgLm1pbiA9IDEwLCAubWF4ID0gMjIgfSwKLSAgICAgICAgLm0yID0geyAubWluID0gNSwgLm1heCA9IDkgfSwKLSAgICAgICAgLnAgPSB7IC5taW4gPSA3LCAubWF4ID0gOTggfSwKLSAgICAgICAgLnAxID0geyAubWluID0gMSwgLm1heCA9IDggfSwKKwkuZG90ID0geyAubWluID0gMjAwMDAsIC5tYXggPSA0MDAwMDAgfSwKKwkudmNvID0geyAubWluID0gMTQwMDAwMCwgLm1heCA9IDI4MDAwMDAgfSwKKwkubiA9IHsgLm1pbiA9IDEsIC5tYXggPSA2IH0sCisJLm0gPSB7IC5taW4gPSA3MCwgLm1heCA9IDEyMCB9LAorCS5tMSA9IHsgLm1pbiA9IDEwLCAubWF4ID0gMjIgfSwKKwkubTIgPSB7IC5taW4gPSA1LCAubWF4ID0gOSB9LAorCS5wID0geyAubWluID0gNywgLm1heCA9IDk4IH0sCisJLnAxID0geyAubWluID0gMSwgLm1heCA9IDggfSwKIAkucDIgPSB7IC5kb3RfbGltaXQgPSAxMTIwMDAsCiAJCS5wMl9zbG93ID0gMTQsIC5wMl9mYXN0ID0gNyB9LAogCS5maW5kX3BsbCA9IGludGVsX2ZpbmRfYmVzdF9QTEwsCkBAIC0yMjIsNDQgKzIyMyw0NCBAQAogfTsKIAogc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2c0eF9kaXNwbGF5X3BvcnQgPSB7Ci0gICAgICAgIC5kb3QgPSB7IC5taW4gPSAxNjE2NzAsIC5tYXggPSAyMjcwMDAgfSwKLSAgICAgICAgLnZjbyA9IHsgLm1pbiA9IDE3NTAwMDAsIC5tYXggPSAzNTAwMDAwfSwKLSAgICAgICAgLm4gPSB7IC5taW4gPSAxLCAubWF4ID0gMiB9LAotICAgICAgICAubSA9IHsgLm1pbiA9IDk3LCAubWF4ID0gMTA4IH0sCi0gICAgICAgIC5tMSA9IHsgLm1pbiA9IDB4MTAsIC5tYXggPSAweDEyIH0sCi0gICAgICAgIC5tMiA9IHsgLm1pbiA9IDB4MDUsIC5tYXggPSAweDA2IH0sCi0gICAgICAgIC5wID0geyAubWluID0gMTAsIC5tYXggPSAyMCB9LAotICAgICAgICAucDEgPSB7IC5taW4gPSAxLCAubWF4ID0gMn0sCi0gICAgICAgIC5wMiA9IHsgLmRvdF9saW1pdCA9IDAsCisJLmRvdCA9IHsgLm1pbiA9IDE2MTY3MCwgLm1heCA9IDIyNzAwMCB9LAorCS52Y28gPSB7IC5taW4gPSAxNzUwMDAwLCAubWF4ID0gMzUwMDAwMH0sCisJLm4gPSB7IC5taW4gPSAxLCAubWF4ID0gMiB9LAorCS5tID0geyAubWluID0gOTcsIC5tYXggPSAxMDggfSwKKwkubTEgPSB7IC5taW4gPSAweDEwLCAubWF4ID0gMHgxMiB9LAorCS5tMiA9IHsgLm1pbiA9IDB4MDUsIC5tYXggPSAweDA2IH0sCisJLnAgPSB7IC5taW4gPSAxMCwgLm1heCA9IDIwIH0sCisJLnAxID0geyAubWluID0gMSwgLm1heCA9IDJ9LAorCS5wMiA9IHsgLmRvdF9saW1pdCA9IDAsCiAJCS5wMl9zbG93ID0gMTAsIC5wMl9mYXN0ID0gMTAgfSwKLSAgICAgICAgLmZpbmRfcGxsID0gaW50ZWxfZmluZF9wbGxfZzR4X2RwLAorCS5maW5kX3BsbCA9IGludGVsX2ZpbmRfcGxsX2c0eF9kcCwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19waW5ldmlld19zZHZvID0gewotICAgICAgICAuZG90ID0geyAubWluID0gMjAwMDAsIC5tYXggPSA0MDAwMDB9LAotICAgICAgICAudmNvID0geyAubWluID0gMTcwMDAwMCwgLm1heCA9IDM1MDAwMDAgfSwKKwkuZG90ID0geyAubWluID0gMjAwMDAsIC5tYXggPSA0MDAwMDB9LAorCS52Y28gPSB7IC5taW4gPSAxNzAwMDAwLCAubWF4ID0gMzUwMDAwMCB9LAogCS8qIFBpbmV2aWV3J3MgTmNvdW50ZXIgaXMgYSByaW5nIGNvdW50ZXIgKi8KLSAgICAgICAgLm4gPSB7IC5taW4gPSAzLCAubWF4ID0gNiB9LAotICAgICAgICAubSA9IHsgLm1pbiA9IDIsIC5tYXggPSAyNTYgfSwKKwkubiA9IHsgLm1pbiA9IDMsIC5tYXggPSA2IH0sCisJLm0gPSB7IC5taW4gPSAyLCAubWF4ID0gMjU2IH0sCiAJLyogUGluZXZpZXcgb25seSBoYXMgb25lIGNvbWJpbmVkIG0gZGl2aWRlciwgd2hpY2ggd2UgdHJlYXQgYXMgbTIuICovCi0gICAgICAgIC5tMSA9IHsgLm1pbiA9IDAsIC5tYXggPSAwIH0sCi0gICAgICAgIC5tMiA9IHsgLm1pbiA9IDAsIC5tYXggPSAyNTQgfSwKLSAgICAgICAgLnAgPSB7IC5taW4gPSA1LCAubWF4ID0gODAgfSwKLSAgICAgICAgLnAxID0geyAubWluID0gMSwgLm1heCA9IDggfSwKKwkubTEgPSB7IC5taW4gPSAwLCAubWF4ID0gMCB9LAorCS5tMiA9IHsgLm1pbiA9IDAsIC5tYXggPSAyNTQgfSwKKwkucCA9IHsgLm1pbiA9IDUsIC5tYXggPSA4MCB9LAorCS5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSA4IH0sCiAJLnAyID0geyAuZG90X2xpbWl0ID0gMjAwMDAwLAogCQkucDJfc2xvdyA9IDEwLCAucDJfZmFzdCA9IDUgfSwKIAkuZmluZF9wbGwgPSBpbnRlbF9maW5kX2Jlc3RfUExMLAogfTsKIAogc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX3BpbmV2aWV3X2x2ZHMgPSB7Ci0gICAgICAgIC5kb3QgPSB7IC5taW4gPSAyMDAwMCwgLm1heCA9IDQwMDAwMCB9LAotICAgICAgICAudmNvID0geyAubWluID0gMTcwMDAwMCwgLm1heCA9IDM1MDAwMDAgfSwKLSAgICAgICAgLm4gPSB7IC5taW4gPSAzLCAubWF4ID0gNiB9LAotICAgICAgICAubSA9IHsgLm1pbiA9IDIsIC5tYXggPSAyNTYgfSwKLSAgICAgICAgLm0xID0geyAubWluID0gMCwgLm1heCA9IDAgfSwKLSAgICAgICAgLm0yID0geyAubWluID0gMCwgLm1heCA9IDI1NCB9LAotICAgICAgICAucCA9IHsgLm1pbiA9IDcsIC5tYXggPSAxMTIgfSwKLSAgICAgICAgLnAxID0geyAubWluID0gMSwgLm1heCA9IDggfSwKKwkuZG90ID0geyAubWluID0gMjAwMDAsIC5tYXggPSA0MDAwMDAgfSwKKwkudmNvID0geyAubWluID0gMTcwMDAwMCwgLm1heCA9IDM1MDAwMDAgfSwKKwkubiA9IHsgLm1pbiA9IDMsIC5tYXggPSA2IH0sCisJLm0gPSB7IC5taW4gPSAyLCAubWF4ID0gMjU2IH0sCisJLm0xID0geyAubWluID0gMCwgLm1heCA9IDAgfSwKKwkubTIgPSB7IC5taW4gPSAwLCAubWF4ID0gMjU0IH0sCisJLnAgPSB7IC5taW4gPSA3LCAubWF4ID0gMTEyIH0sCisJLnAxID0geyAubWluID0gMSwgLm1heCA9IDggfSwKIAkucDIgPSB7IC5kb3RfbGltaXQgPSAxMTIwMDAsCiAJCS5wMl9zbG93ID0gMTQsIC5wMl9mYXN0ID0gMTQgfSwKIAkuZmluZF9wbGwgPSBpbnRlbF9maW5kX2Jlc3RfUExMLApAQCAtMzIxLDcgKzMyMiw3IEBACiAJLm0xID0geyAubWluID0gMTIsIC5tYXggPSAyMiB9LAogCS5tMiA9IHsgLm1pbiA9IDUsIC5tYXggPSA5IH0sCiAJLnAgPSB7IC5taW4gPSAyOCwgLm1heCA9IDExMiB9LAotCS5wMSA9IHsgLm1pbiA9IDIsLm1heCA9IDggfSwKKwkucDEgPSB7IC5taW4gPSAyLCAubWF4ID0gOCB9LAogCS5wMiA9IHsgLmRvdF9saW1pdCA9IDIyNTAwMCwKIAkJLnAyX3Nsb3cgPSAxNCwgLnAyX2Zhc3QgPSAxNCB9LAogCS5maW5kX3BsbCA9IGludGVsX2c0eF9maW5kX2Jlc3RfUExMLApAQCAtMzM1LDI0ICszMzYsMjQgQEAKIAkubTEgPSB7IC5taW4gPSAxMiwgLm1heCA9IDIyIH0sCiAJLm0yID0geyAubWluID0gNSwgLm1heCA9IDkgfSwKIAkucCA9IHsgLm1pbiA9IDE0LCAubWF4ID0gNDIgfSwKLQkucDEgPSB7IC5taW4gPSAyLC5tYXggPSA2IH0sCisJLnAxID0geyAubWluID0gMiwgLm1heCA9IDYgfSwKIAkucDIgPSB7IC5kb3RfbGltaXQgPSAyMjUwMDAsCiAJCS5wMl9zbG93ID0gNywgLnAyX2Zhc3QgPSA3IH0sCiAJLmZpbmRfcGxsID0gaW50ZWxfZzR4X2ZpbmRfYmVzdF9QTEwsCiB9OwogCiBzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfaXJvbmxha2VfZGlzcGxheV9wb3J0ID0gewotICAgICAgICAuZG90ID0geyAubWluID0gMjUwMDAsIC5tYXggPSAzNTAwMDAgfSwKLSAgICAgICAgLnZjbyA9IHsgLm1pbiA9IDE3NjAwMDAsIC5tYXggPSAzNTEwMDAwfSwKLSAgICAgICAgLm4gPSB7IC5taW4gPSAxLCAubWF4ID0gMiB9LAotICAgICAgICAubSA9IHsgLm1pbiA9IDgxLCAubWF4ID0gOTAgfSwKLSAgICAgICAgLm0xID0geyAubWluID0gMTIsIC5tYXggPSAyMiB9LAotICAgICAgICAubTIgPSB7IC5taW4gPSA1LCAubWF4ID0gOSB9LAotICAgICAgICAucCA9IHsgLm1pbiA9IDEwLCAubWF4ID0gMjAgfSwKLSAgICAgICAgLnAxID0geyAubWluID0gMSwgLm1heCA9IDJ9LAotICAgICAgICAucDIgPSB7IC5kb3RfbGltaXQgPSAwLAorCS5kb3QgPSB7IC5taW4gPSAyNTAwMCwgLm1heCA9IDM1MDAwMCB9LAorCS52Y28gPSB7IC5taW4gPSAxNzYwMDAwLCAubWF4ID0gMzUxMDAwMH0sCisJLm4gPSB7IC5taW4gPSAxLCAubWF4ID0gMiB9LAorCS5tID0geyAubWluID0gODEsIC5tYXggPSA5MCB9LAorCS5tMSA9IHsgLm1pbiA9IDEyLCAubWF4ID0gMjIgfSwKKwkubTIgPSB7IC5taW4gPSA1LCAubWF4ID0gOSB9LAorCS5wID0geyAubWluID0gMTAsIC5tYXggPSAyMCB9LAorCS5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSAyfSwKKwkucDIgPSB7IC5kb3RfbGltaXQgPSAwLAogCQkucDJfc2xvdyA9IDEwLCAucDJfZmFzdCA9IDEwIH0sCi0gICAgICAgIC5maW5kX3BsbCA9IGludGVsX2ZpbmRfcGxsX2lyb25sYWtlX2RwLAorCS5maW5kX3BsbCA9IGludGVsX2ZpbmRfcGxsX2lyb25sYWtlX2RwLAogfTsKIAogc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgKmludGVsX2lyb25sYWtlX2xpbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKQEAgLTQwNCw3ICs0MDUsNyBAQAogCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfZzR4X2hkbWk7CiAJfSBlbHNlIGlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9TRFZPKSkgewogCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfZzR4X3Nkdm87Ci0JfSBlbHNlIGlmIChpbnRlbF9waXBlX2hhc190eXBlIChjcnRjLCBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQpKSB7CisJfSBlbHNlIGlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCkpIHsKIAkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2c0eF9kaXNwbGF5X3BvcnQ7CiAJfSBlbHNlIC8qIFRoZSBvcHRpb24gaXMgZm9yIG90aGVyIG91dHB1dHMgKi8KIAkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2k5eHhfc2R2bzsKQEAgLTQ4OCwyNiArNDg5LDI2IEBACiAJCQkgICAgICAgY29uc3QgaW50ZWxfY2xvY2tfdCAqY2xvY2spCiB7CiAJaWYgKGNsb2NrLT5wMSAgPCBsaW1pdC0+cDEubWluICB8fCBsaW1pdC0+cDEubWF4ICA8IGNsb2NrLT5wMSkKLQkJSU5URUxQbGxJbnZhbGlkICgicDEgb3V0IG9mIHJhbmdlXG4iKTsKKwkJSU5URUxQbGxJbnZhbGlkKCJwMSBvdXQgb2YgcmFuZ2VcbiIpOwogCWlmIChjbG9jay0+cCAgIDwgbGltaXQtPnAubWluICAgfHwgbGltaXQtPnAubWF4ICAgPCBjbG9jay0+cCkKLQkJSU5URUxQbGxJbnZhbGlkICgicCBvdXQgb2YgcmFuZ2VcbiIpOworCQlJTlRFTFBsbEludmFsaWQoInAgb3V0IG9mIHJhbmdlXG4iKTsKIAlpZiAoY2xvY2stPm0yICA8IGxpbWl0LT5tMi5taW4gIHx8IGxpbWl0LT5tMi5tYXggIDwgY2xvY2stPm0yKQotCQlJTlRFTFBsbEludmFsaWQgKCJtMiBvdXQgb2YgcmFuZ2VcbiIpOworCQlJTlRFTFBsbEludmFsaWQoIm0yIG91dCBvZiByYW5nZVxuIik7CiAJaWYgKGNsb2NrLT5tMSAgPCBsaW1pdC0+bTEubWluICB8fCBsaW1pdC0+bTEubWF4ICA8IGNsb2NrLT5tMSkKLQkJSU5URUxQbGxJbnZhbGlkICgibTEgb3V0IG9mIHJhbmdlXG4iKTsKKwkJSU5URUxQbGxJbnZhbGlkKCJtMSBvdXQgb2YgcmFuZ2VcbiIpOwogCWlmIChjbG9jay0+bTEgPD0gY2xvY2stPm0yICYmICFJU19QSU5FVklFVyhkZXYpKQotCQlJTlRFTFBsbEludmFsaWQgKCJtMSA8PSBtMlxuIik7CisJCUlOVEVMUGxsSW52YWxpZCgibTEgPD0gbTJcbiIpOwogCWlmIChjbG9jay0+bSAgIDwgbGltaXQtPm0ubWluICAgfHwgbGltaXQtPm0ubWF4ICAgPCBjbG9jay0+bSkKLQkJSU5URUxQbGxJbnZhbGlkICgibSBvdXQgb2YgcmFuZ2VcbiIpOworCQlJTlRFTFBsbEludmFsaWQoIm0gb3V0IG9mIHJhbmdlXG4iKTsKIAlpZiAoY2xvY2stPm4gICA8IGxpbWl0LT5uLm1pbiAgIHx8IGxpbWl0LT5uLm1heCAgIDwgY2xvY2stPm4pCi0JCUlOVEVMUGxsSW52YWxpZCAoIm4gb3V0IG9mIHJhbmdlXG4iKTsKKwkJSU5URUxQbGxJbnZhbGlkKCJuIG91dCBvZiByYW5nZVxuIik7CiAJaWYgKGNsb2NrLT52Y28gPCBsaW1pdC0+dmNvLm1pbiB8fCBsaW1pdC0+dmNvLm1heCA8IGNsb2NrLT52Y28pCi0JCUlOVEVMUGxsSW52YWxpZCAoInZjbyBvdXQgb2YgcmFuZ2VcbiIpOworCQlJTlRFTFBsbEludmFsaWQoInZjbyBvdXQgb2YgcmFuZ2VcbiIpOwogCS8qIFhYWDogV2UgbWF5IG5lZWQgdG8gYmUgY2hlY2tpbmcgIkRvdCBjbG9jayIgZGVwZW5kaW5nIG9uIHRoZSBtdWx0aXBsaWVyLAogCSAqIGNvbm5lY3RvciwgZXRjLiwgcmF0aGVyIHRoYW4ganVzdCBhIHNpbmdsZSByYW5nZS4KIAkgKi8KIAlpZiAoY2xvY2stPmRvdCA8IGxpbWl0LT5kb3QubWluIHx8IGxpbWl0LT5kb3QubWF4IDwgY2xvY2stPmRvdCkKLQkJSU5URUxQbGxJbnZhbGlkICgiZG90IG91dCBvZiByYW5nZVxuIik7CisJCUlOVEVMUGxsSW52YWxpZCgiZG90IG91dCBvZiByYW5nZVxuIik7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTU0Miw3ICs1NDMsNyBAQAogCQkJY2xvY2sucDIgPSBsaW1pdC0+cDIucDJfZmFzdDsKIAl9CiAKLQltZW1zZXQgKGJlc3RfY2xvY2ssIDAsIHNpemVvZiAoKmJlc3RfY2xvY2spKTsKKwltZW1zZXQoYmVzdF9jbG9jaywgMCwgc2l6ZW9mKCpiZXN0X2Nsb2NrKSk7CiAKIAlmb3IgKGNsb2NrLm0xID0gbGltaXQtPm0xLm1pbjsgY2xvY2subTEgPD0gbGltaXQtPm0xLm1heDsKIAkgICAgIGNsb2NrLm0xKyspIHsKQEAgLTgwMiw2ICs4MDMsMTkgQEAKIAl1MzIgdmFsOwogCWJvb2wgY3VyX3N0YXRlOwogCisJaWYgKEhBU19QQ0hfQ1BUKGRldl9wcml2LT5kZXYpKSB7CisJCXUzMiBwY2hfZHBsbDsKKworCQlwY2hfZHBsbCA9IEk5MTVfUkVBRChQQ0hfRFBMTF9TRUwpOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgc2VsZWN0ZWQgUExMIGlzIGVuYWJsZWQgdG8gdGhlIHRyYW5zY29kZXIgKi8KKwkJV0FSTighKChwY2hfZHBsbCA+PiAoNCAqIHBpcGUpKSAmIDgpLAorCQkgICAgICJ0cmFuc2NvZGVyICVkIFBMTCBub3QgZW5hYmxlZFxuIiwgcGlwZSk7CisKKwkJLyogQ29udmVydCB0aGUgdHJhbnNjb2RlciBwaXBlIG51bWJlciB0byBhIHBsbCBwaXBlIG51bWJlciAqLworCQlwaXBlID0gKHBjaF9kcGxsID4+ICg0ICogcGlwZSkpICYgMTsKKwl9CisKIAlyZWcgPSBQQ0hfRFBMTChwaXBlKTsKIAl2YWwgPSBJOTE1X1JFQUQocmVnKTsKIAljdXJfc3RhdGUgPSAhISh2YWwgJiBEUExMX1ZDT19FTkFCTEUpOwpAQCAtMTE3MSw2ICsxMTg1LDkgQEAKIAlpbnQgcmVnOwogCXUzMiB2YWw7CiAKKwlpZiAocGlwZSA+IDEpCisJCXJldHVybjsKKwogCS8qIFBDSCBvbmx5IGF2YWlsYWJsZSBvbiBJTEsrICovCiAJQlVHX09OKGRldl9wcml2LT5pbmZvLT5nZW4gPCA1KTsKIApAQCAtMTE5MSw2ICsxMjA4LDkgQEAKIAlpbnQgcmVnOwogCXUzMiB2YWw7CiAKKwlpZiAocGlwZSA+IDEpCisJCXJldHVybjsKKwogCS8qIFBDSCBvbmx5IGF2YWlsYWJsZSBvbiBJTEsrICovCiAJQlVHX09OKGRldl9wcml2LT5pbmZvLT5nZW4gPCA1KTsKIApAQCAtMTI1Niw3ICsxMjc2LDcgQEAKIAlJOTE1X1dSSVRFKHJlZywgdmFsKTsKIAkvKiB3YWl0IGZvciBQQ0ggdHJhbnNjb2RlciBvZmYsIHRyYW5zY29kZXIgc3RhdGUgKi8KIAlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChyZWcpICYgVFJBTlNfU1RBVEVfRU5BQkxFKSA9PSAwLCA1MCkpCi0JCURSTV9FUlJPUigiZmFpbGVkIHRvIGRpc2FibGUgdHJhbnNjb2RlclxuIik7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGRpc2FibGUgdHJhbnNjb2RlciAlZFxuIiwgcGlwZSk7CiB9CiAKIC8qKgpAQCAtMjA4NSw2ICsyMTA1LDcgQEAKIAlzd2l0Y2ggKHBsYW5lKSB7CiAJY2FzZSAwOgogCWNhc2UgMToKKwljYXNlIDI6CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigiQ2FuJ3QgdXBkYXRlIHBsYW5lICVkIGluIFNBUkVBXG4iLCBwbGFuZSk7CkBAIC0yMTg0LDYgKzIyMDUsMTAgQEAKIAljYXNlIDA6CiAJY2FzZSAxOgogCQlicmVhazsKKwljYXNlIDI6CisJCWlmIChJU19JVllCUklER0UoZGV2KSkKKwkJCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggb3RoZXJ3aXNlICovCiAJZGVmYXVsdDoKIAkJRFJNX0VSUk9SKCJubyBwbGFuZSBmb3IgY3J0Y1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQ0MCw3ICsyNDY1LDcgQEAKIAogfQogCi1zdGF0aWMgY29uc3QgaW50IHNuYl9iX2ZkaV90cmFpbl9wYXJhbSBbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgc25iX2JfZmRpX3RyYWluX3BhcmFtW10gPSB7CiAJRkRJX0xJTktfVFJBSU5fNDAwTVZfMERCX1NOQl9CLAogCUZESV9MSU5LX1RSQUlOXzQwME1WXzZEQl9TTkJfQiwKIAlGRElfTElOS19UUkFJTl82MDBNVl8zXzVEQl9TTkJfQiwKQEAgLTI0OTYsNyArMjUyMSw3IEBACiAJaWYgKEhBU19QQ0hfQ1BUKGRldikpCiAJCWNwdF9waGFzZV9wb2ludGVyX2VuYWJsZShkZXYsIHBpcGUpOwogCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKyApIHsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCXJlZyA9IEZESV9UWF9DVEwocGlwZSk7CiAJCXRlbXAgPSBJOTE1X1JFQUQocmVnKTsKIAkJdGVtcCAmPSB+RkRJX0xJTktfVFJBSU5fVk9MX0VNUF9NQVNLOwpAQCAtMjU0NSw3ICsyNTcwLDcgQEAKIAlQT1NUSU5HX1JFQUQocmVnKTsKIAl1ZGVsYXkoMTUwKTsKIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKysgKSB7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlyZWcgPSBGRElfVFhfQ1RMKHBpcGUpOwogCQl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CiAJCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX1ZPTF9FTVBfTUFTSzsKQEAgLTI2MDAsNiArMjYyNSw3IEBACiAJdGVtcCB8PSBGRElfTElOS19UUkFJTl9QQVRURVJOXzFfSVZCOwogCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX1ZPTF9FTVBfTUFTSzsKIAl0ZW1wIHw9IEZESV9MSU5LX1RSQUlOXzQwME1WXzBEQl9TTkJfQjsKKwl0ZW1wIHw9IEZESV9DT01QT1NJVEVfU1lOQzsKIAlJOTE1X1dSSVRFKHJlZywgdGVtcCB8IEZESV9UWF9FTkFCTEUpOwogCiAJcmVnID0gRkRJX1JYX0NUTChwaXBlKTsKQEAgLTI2MDcsNiArMjYzMyw3IEBACiAJdGVtcCAmPSB+RkRJX0xJTktfVFJBSU5fQVVUTzsKIAl0ZW1wICY9IH5GRElfTElOS19UUkFJTl9QQVRURVJOX01BU0tfQ1BUOwogCXRlbXAgfD0gRkRJX0xJTktfVFJBSU5fUEFUVEVSTl8xX0NQVDsKKwl0ZW1wIHw9IEZESV9DT01QT1NJVEVfU1lOQzsKIAlJOTE1X1dSSVRFKHJlZywgdGVtcCB8IEZESV9SWF9FTkFCTEUpOwogCiAJUE9TVElOR19SRUFEKHJlZyk7CkBAIC0yNjE1LDcgKzI2NDIsNyBAQAogCWlmIChIQVNfUENIX0NQVChkZXYpKQogCQljcHRfcGhhc2VfcG9pbnRlcl9lbmFibGUoZGV2LCBwaXBlKTsKIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKysgKSB7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlyZWcgPSBGRElfVFhfQ1RMKHBpcGUpOwogCQl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CiAJCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX1ZPTF9FTVBfTUFTSzsKQEAgLTI2NTcsNyArMjY4NCw3IEBACiAJUE9TVElOR19SRUFEKHJlZyk7CiAJdWRlbGF5KDE1MCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrICkgeworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJcmVnID0gRkRJX1RYX0NUTChwaXBlKTsKIAkJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwogCQl0ZW1wICY9IH5GRElfTElOS19UUkFJTl9WT0xfRU1QX01BU0s7CkBAIC0yODY2LDcgKzI4OTMsNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKLQl1MzIgcmVnLCB0ZW1wOworCXUzMiByZWcsIHRlbXAsIHRyYW5zY19zZWw7CiAKIAkvKiBGb3IgUENIIG91dHB1dCwgdHJhaW5pbmcgRkRJIGxpbmsgKi8KIAlkZXZfcHJpdi0+ZGlzcGxheS5mZGlfbGlua190cmFpbihjcnRjKTsKQEAgLTI4NzQsMTIgKzI5MDEsMjEgQEAKIAlpbnRlbF9lbmFibGVfcGNoX3BsbChkZXZfcHJpdiwgcGlwZSk7CiAKIAlpZiAoSEFTX1BDSF9DUFQoZGV2KSkgeworCQl0cmFuc2Nfc2VsID0gaW50ZWxfY3J0Yy0+dXNlX3BsbF9hID8gVFJBTlNDX0RQTExBX1NFTCA6CisJCQlUUkFOU0NfRFBMTEJfU0VMOworCiAJCS8qIEJlIHN1cmUgUENIIERQTEwgU0VMIGlzIHNldCAqLwogCQl0ZW1wID0gSTkxNV9SRUFEKFBDSF9EUExMX1NFTCk7Ci0JCWlmIChwaXBlID09IDAgJiYgKHRlbXAgJiBUUkFOU0FfRFBMTF9FTkFCTEUpID09IDApCisJCWlmIChwaXBlID09IDApIHsKKwkJCXRlbXAgJj0gfihUUkFOU0FfRFBMTEJfU0VMKTsKIAkJCXRlbXAgfD0gKFRSQU5TQV9EUExMX0VOQUJMRSB8IFRSQU5TQV9EUExMQV9TRUwpOwotCQllbHNlIGlmIChwaXBlID09IDEgJiYgKHRlbXAgJiBUUkFOU0JfRFBMTF9FTkFCTEUpID09IDApCisJCX0gZWxzZSBpZiAocGlwZSA9PSAxKSB7CisJCQl0ZW1wICY9IH4oVFJBTlNCX0RQTExCX1NFTCk7CiAJCQl0ZW1wIHw9IChUUkFOU0JfRFBMTF9FTkFCTEUgfCBUUkFOU0JfRFBMTEJfU0VMKTsKKwkJfSBlbHNlIGlmIChwaXBlID09IDIpIHsKKwkJCXRlbXAgJj0gfihUUkFOU0NfRFBMTEJfU0VMKTsKKwkJCXRlbXAgfD0gKFRSQU5TQ19EUExMX0VOQUJMRSB8IHRyYW5zY19zZWwpOworCQl9CiAJCUk5MTVfV1JJVEUoUENIX0RQTExfU0VMLCB0ZW1wKTsKIAl9CiAKQEAgLTI5MzUsNiArMjk3MSwyNCBAQAogCWludGVsX2VuYWJsZV90cmFuc2NvZGVyKGRldl9wcml2LCBwaXBlKTsKIH0KIAordm9pZCBpbnRlbF9jcHRfdmVyaWZ5X21vZGVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgZHNscmVnID0gUElQRURTTChwaXBlKSwgdGMycmVnID0gVFJBTlNfQ0hJQ0tFTjIocGlwZSk7CisJdTMyIHRlbXA7CisKKwl0ZW1wID0gSTkxNV9SRUFEKGRzbHJlZyk7CisJdWRlbGF5KDUwMCk7CisJaWYgKHdhaXRfZm9yKEk5MTVfUkVBRChkc2xyZWcpICE9IHRlbXAsIDUpKSB7CisJCS8qIFdpdGhvdXQgdGhpcywgbW9kZSBzZXRzIG1heSBmYWlsIHNpbGVudGx5IG9uIEZESSAqLworCQlJOTE1X1dSSVRFKHRjMnJlZywgVFJBTlNfQVVUT1RSQUlOX0dFTl9TVEFMTF9ESVMpOworCQl1ZGVsYXkoMjUwKTsKKwkJSTkxNV9XUklURSh0YzJyZWcsIDApOworCQlpZiAod2FpdF9mb3IoSTkxNV9SRUFEKGRzbHJlZykgIT0gdGVtcCwgNSkpCisJCQlEUk1fRVJST1IoIm1vZGUgc2V0IGZhaWxlZDogcGlwZSAlZCBzdHVja1xuIiwgcGlwZSk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBpcm9ubGFrZV9jcnRjX2VuYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKQEAgLTMwNDUsMTMgKzMwOTksMTMgQEAKIAkJdGVtcCA9IEk5MTVfUkVBRChQQ0hfRFBMTF9TRUwpOwogCQlzd2l0Y2ggKHBpcGUpIHsKIAkJY2FzZSAwOgotCQkJdGVtcCAmPSB+KFRSQU5TQV9EUExMX0VOQUJMRSB8IFRSQU5TQV9EUExMQV9TRUwpOworCQkJdGVtcCAmPSB+KFRSQU5TQV9EUExMX0VOQUJMRSB8IFRSQU5TQV9EUExMQl9TRUwpOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKIAkJCXRlbXAgJj0gfihUUkFOU0JfRFBMTF9FTkFCTEUgfCBUUkFOU0JfRFBMTEJfU0VMKTsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQkvKiBGSVhNRTogbWFuYWdlIHRyYW5zY29kZXIgUExMcz8gKi8KKwkJCS8qIEMgc2hhcmVzIFBMTCBBIG9yIEIgKi8KIAkJCXRlbXAgJj0gfihUUkFOU0NfRFBMTF9FTkFCTEUgfCBUUkFOU0NfRFBMTEJfU0VMKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMzA2MSw3ICszMTE1LDggQEAKIAl9CiAKIAkvKiBkaXNhYmxlIFBDSCBEUExMICovCi0JaW50ZWxfZGlzYWJsZV9wY2hfcGxsKGRldl9wcml2LCBwaXBlKTsKKwlpZiAoIWludGVsX2NydGMtPm5vX3BsbCkKKwkJaW50ZWxfZGlzYWJsZV9wY2hfcGxsKGRldl9wcml2LCBwaXBlKTsKIAogCS8qIFN3aXRjaCBmcm9tIFBDRGNsayB0byBSYXdjbGsgKi8KIAlyZWcgPSBGRElfUlhfQ1RMKHBpcGUpOwpAQCAtMzI5MywxOCArMzM0OCwyNSBAQAogCWlyb25sYWtlX2NydGNfZW5hYmxlKGNydGMpOwogfQogCi12b2lkIGludGVsX2VuY29kZXJfcHJlcGFyZSAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQordm9pZCBpbnRlbF9lbmNvZGVyX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKIAkvKiBsdmRzIGhhcyBpdHMgb3duIHZlcnNpb24gb2YgcHJlcGFyZSBzZWUgaW50ZWxfbHZkc19wcmVwYXJlICovCiAJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CiB9CiAKLXZvaWQgaW50ZWxfZW5jb2Rlcl9jb21taXQgKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3ZvaWQgaW50ZWxfZW5jb2Rlcl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyID0gdG9faW50ZWxfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoaW50ZWxfZW5jb2Rlci0+YmFzZS5jcnRjKTsKKwogCS8qIGx2ZHMgaGFzIGl0cyBvd24gdmVyc2lvbiBvZiBjb21taXQgc2VlIGludGVsX2x2ZHNfY29tbWl0ICovCiAJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKworCWlmIChIQVNfUENIX0NQVChkZXYpKQorCQlpbnRlbF9jcHRfdmVyaWZ5X21vZGVzZXQoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKIH0KIAogdm9pZCBpbnRlbF9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQpAQCAtNDQ3OCw2ICs0NTQwLDIwIEBACiAJCWVuYWJsZWQgfD0gMjsKIAl9CiAKKwkvKiBJVkIgaGFzIDMgcGlwZXMgKi8KKwlpZiAoSVNfSVZZQlJJREdFKGRldikgJiYKKwkgICAgZzR4X2NvbXB1dGVfd20wKGRldiwgMiwKKwkJCSAgICAmc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvLCBsYXRlbmN5LAorCQkJICAgICZzYW5keWJyaWRnZV9jdXJzb3Jfd21faW5mbywgbGF0ZW5jeSwKKwkJCSAgICAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CisJCUk5MTVfV1JJVEUoV00wX1BJUEVDX0lWQiwKKwkJCSAgIChwbGFuZV93bSA8PCBXTTBfUElQRV9QTEFORV9TSElGVCkgfCBjdXJzb3Jfd20pOworCQlEUk1fREVCVUdfS01TKCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQyAtIgorCQkJICAgICAgIiBwbGFuZSAlZCwgY3Vyc29yOiAlZFxuIiwKKwkJCSAgICAgIHBsYW5lX3dtLCBjdXJzb3Jfd20pOworCQllbmFibGVkIHw9IDM7CisJfQorCiAJLyoKIAkgKiBDYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgc2VsZi1yZWZyZXNoIHdhdGVybWFyayBvbmx5IHdoZW4gb25lCiAJICogZGlzcGxheSBwbGFuZSBpcyB1c2VkLgpAQCAtNDU4NCw3ICs0NjYwLDkgQEAKIAogc3RhdGljIGlubGluZSBib29sIGludGVsX3BhbmVsX3VzZV9zc2Moc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewotCXJldHVybiBkZXZfcHJpdi0+bHZkc191c2Vfc3NjICYmIGk5MTVfcGFuZWxfdXNlX3NzYworCWlmIChpOTE1X3BhbmVsX3VzZV9zc2MgPj0gMCkKKwkJcmV0dXJuIGk5MTVfcGFuZWxfdXNlX3NzYyAhPSAwOworCXJldHVybiBkZXZfcHJpdi0+bHZkc191c2Vfc3NjCiAJCSYmICEoZGV2X3ByaXYtPnF1aXJrcyAmIFFVSVJLX0xWRFNfU1NDX0RJU0FCTEUpOwogfQogCkBAIC01MTA3LDM2ICs1MTg1LDUyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgaXJvbmxha2VfdXBkYXRlX3BjaF9yZWZjbGsoc3RydWN0IGRybV9kZXZpY2UgKmRldikKKy8qCisgKiBJbml0aWFsaXplIHJlZmVyZW5jZSBjbG9ja3Mgd2hlbiB0aGUgZHJpdmVyIGxvYWRzCisgKi8KK3ZvaWQgaXJvbmxha2VfaW5pdF9wY2hfcmVmY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICptb2RlX2NvbmZpZyA9ICZkZXYtPm1vZGVfY29uZmlnOwotCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcjsKLQlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaGFzX2VkcF9lbmNvZGVyID0gTlVMTDsKIAl1MzIgdGVtcDsKIAlib29sIGhhc19sdmRzID0gZmFsc2U7CisJYm9vbCBoYXNfY3B1X2VkcCA9IGZhbHNlOworCWJvb2wgaGFzX3BjaF9lZHAgPSBmYWxzZTsKKwlib29sIGhhc19wYW5lbCA9IGZhbHNlOworCWJvb2wgaGFzX2NrNTA1ID0gZmFsc2U7CisJYm9vbCBjYW5fc3NjID0gZmFsc2U7CiAKIAkvKiBXZSBuZWVkIHRvIHRha2UgdGhlIGdsb2JhbCBjb25maWcgaW50byBhY2NvdW50ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmbW9kZV9jb25maWctPmNydGNfbGlzdCwgaGVhZCkgewotCQlpZiAoIWNydGMtPmVuYWJsZWQpCi0JCQljb250aW51ZTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZtb2RlX2NvbmZpZy0+ZW5jb2Rlcl9saXN0LAotCQkJCSAgICBiYXNlLmhlYWQpIHsKLQkJCWlmIChlbmNvZGVyLT5iYXNlLmNydGMgIT0gY3J0YykKLQkJCQljb250aW51ZTsKLQotCQkJc3dpdGNoIChlbmNvZGVyLT50eXBlKSB7Ci0JCQljYXNlIElOVEVMX09VVFBVVF9MVkRTOgotCQkJCWhhc19sdmRzID0gdHJ1ZTsKLQkJCWNhc2UgSU5URUxfT1VUUFVUX0VEUDoKLQkJCQloYXNfZWRwX2VuY29kZXIgPSBlbmNvZGVyOwotCQkJCWJyZWFrOwotCQkJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJm1vZGVfY29uZmlnLT5lbmNvZGVyX2xpc3QsCisJCQkgICAgYmFzZS5oZWFkKSB7CisJCXN3aXRjaCAoZW5jb2Rlci0+dHlwZSkgeworCQljYXNlIElOVEVMX09VVFBVVF9MVkRTOgorCQkJaGFzX3BhbmVsID0gdHJ1ZTsKKwkJCWhhc19sdmRzID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIElOVEVMX09VVFBVVF9FRFA6CisJCQloYXNfcGFuZWwgPSB0cnVlOworCQkJaWYgKGludGVsX2VuY29kZXJfaXNfcGNoX2VkcCgmZW5jb2Rlci0+YmFzZSkpCisJCQkJaGFzX3BjaF9lZHAgPSB0cnVlOworCQkJZWxzZQorCQkJCWhhc19jcHVfZWRwID0gdHJ1ZTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCisJaWYgKEhBU19QQ0hfSUJYKGRldikpIHsKKwkJaGFzX2NrNTA1ID0gZGV2X3ByaXYtPmRpc3BsYXlfY2xvY2tfbW9kZTsKKwkJY2FuX3NzYyA9IGhhc19jazUwNTsKKwl9IGVsc2UgeworCQloYXNfY2s1MDUgPSBmYWxzZTsKKwkJY2FuX3NzYyA9IHRydWU7CisJfQorCisJRFJNX0RFQlVHX0tNUygiaGFzX3BhbmVsICVkIGhhc19sdmRzICVkIGhhc19wY2hfZWRwICVkIGhhc19jcHVfZWRwICVkIGhhc19jazUwNSAlZFxuIiwKKwkJICAgICAgaGFzX3BhbmVsLCBoYXNfbHZkcywgaGFzX3BjaF9lZHAsIGhhc19jcHVfZWRwLAorCQkgICAgICBoYXNfY2s1MDUpOworCiAJLyogSXJvbmxha2U6IHRyeSB0byBzZXR1cCBkaXNwbGF5IHJlZiBjbG9jayBiZWZvcmUgRFBMTAogCSAqIGVuYWJsaW5nLiBUaGlzIGlzIG9ubHkgdW5kZXIgZHJpdmVyJ3MgY29udHJvbCBhZnRlcgogCSAqIFBDSCBCIHN0ZXBwaW5nLCBwcmV2aW91cyBjaGlwc2V0IHN0ZXBwaW5nIHNob3VsZCBiZQpAQCAtNTE0NSw0MyArNTIzOSwxMDIgQEAKIAl0ZW1wID0gSTkxNV9SRUFEKFBDSF9EUkVGX0NPTlRST0wpOwogCS8qIEFsd2F5cyBlbmFibGUgbm9uc3ByZWFkIHNvdXJjZSAqLwogCXRlbXAgJj0gfkRSRUZfTk9OU1BSRUFEX1NPVVJDRV9NQVNLOwotCXRlbXAgfD0gRFJFRl9OT05TUFJFQURfU09VUkNFX0VOQUJMRTsKLQl0ZW1wICY9IH5EUkVGX1NTQ19TT1VSQ0VfTUFTSzsKLQl0ZW1wIHw9IERSRUZfU1NDX1NPVVJDRV9FTkFCTEU7Ci0JSTkxNV9XUklURShQQ0hfRFJFRl9DT05UUk9MLCB0ZW1wKTsKIAotCVBPU1RJTkdfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKLQl1ZGVsYXkoMjAwKTsKKwlpZiAoaGFzX2NrNTA1KQorCQl0ZW1wIHw9IERSRUZfTk9OU1BSRUFEX0NLNTA1X0VOQUJMRTsKKwllbHNlCisJCXRlbXAgfD0gRFJFRl9OT05TUFJFQURfU09VUkNFX0VOQUJMRTsKIAotCWlmIChoYXNfZWRwX2VuY29kZXIpIHsKLQkJaWYgKGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpKSB7CisJaWYgKGhhc19wYW5lbCkgeworCQl0ZW1wICY9IH5EUkVGX1NTQ19TT1VSQ0VfTUFTSzsKKwkJdGVtcCB8PSBEUkVGX1NTQ19TT1VSQ0VfRU5BQkxFOworCisJCS8qIFNTQyBtdXN0IGJlIHR1cm5lZCBvbiBiZWZvcmUgZW5hYmxpbmcgdGhlIENQVSBvdXRwdXQgICovCisJCWlmIChpbnRlbF9wYW5lbF91c2Vfc3NjKGRldl9wcml2KSAmJiBjYW5fc3NjKSB7CisJCQlEUk1fREVCVUdfS01TKCJVc2luZyBTU0Mgb24gcGFuZWxcbiIpOwogCQkJdGVtcCB8PSBEUkVGX1NTQzFfRU5BQkxFOwotCQkJSTkxNV9XUklURShQQ0hfRFJFRl9DT05UUk9MLCB0ZW1wKTsKLQotCQkJUE9TVElOR19SRUFEKFBDSF9EUkVGX0NPTlRST0wpOwotCQkJdWRlbGF5KDIwMCk7CiAJCX0KKworCQkvKiBHZXQgU1NDIGdvaW5nIGJlZm9yZSBlbmFibGluZyB0aGUgb3V0cHV0cyAqLworCQlJOTE1X1dSSVRFKFBDSF9EUkVGX0NPTlRST0wsIHRlbXApOworCQlQT1NUSU5HX1JFQUQoUENIX0RSRUZfQ09OVFJPTCk7CisJCXVkZWxheSgyMDApOworCiAJCXRlbXAgJj0gfkRSRUZfQ1BVX1NPVVJDRV9PVVRQVVRfTUFTSzsKIAogCQkvKiBFbmFibGUgQ1BVIHNvdXJjZSBvbiBDUFUgYXR0YWNoZWQgZURQICovCi0JCWlmICghaW50ZWxfZW5jb2Rlcl9pc19wY2hfZWRwKCZoYXNfZWRwX2VuY29kZXItPmJhc2UpKSB7Ci0JCQlpZiAoaW50ZWxfcGFuZWxfdXNlX3NzYyhkZXZfcHJpdikpCisJCWlmIChoYXNfY3B1X2VkcCkgeworCQkJaWYgKGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpICYmIGNhbl9zc2MpIHsKKwkJCQlEUk1fREVCVUdfS01TKCJVc2luZyBTU0Mgb24gZURQXG4iKTsKIAkJCQl0ZW1wIHw9IERSRUZfQ1BVX1NPVVJDRV9PVVRQVVRfRE9XTlNQUkVBRDsKKwkJCX0KIAkJCWVsc2UKIAkJCQl0ZW1wIHw9IERSRUZfQ1BVX1NPVVJDRV9PVVRQVVRfTk9OU1BSRUFEOwotCQl9IGVsc2UgewotCQkJLyogRW5hYmxlIFNTQyBvbiBQQ0ggZURQIGlmIG5lZWRlZCAqLwotCQkJaWYgKGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpKSB7Ci0JCQkJRFJNX0VSUk9SKCJlbmFibGluZyBTU0Mgb24gUENIXG4iKTsKLQkJCQl0ZW1wIHw9IERSRUZfU1VQRVJTUFJFQURfU09VUkNFX0VOQUJMRTsKLQkJCX0KLQkJfQorCQl9IGVsc2UKKwkJCXRlbXAgfD0gRFJFRl9DUFVfU09VUkNFX09VVFBVVF9ESVNBQkxFOworCisJCUk5MTVfV1JJVEUoUENIX0RSRUZfQ09OVFJPTCwgdGVtcCk7CisJCVBPU1RJTkdfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKKwkJdWRlbGF5KDIwMCk7CisJfSBlbHNlIHsKKwkJRFJNX0RFQlVHX0tNUygiRGlzYWJsaW5nIFNTQyBlbnRpcmVseVxuIik7CisKKwkJdGVtcCAmPSB+RFJFRl9DUFVfU09VUkNFX09VVFBVVF9NQVNLOworCisJCS8qIFR1cm4gb2ZmIENQVSBvdXRwdXQgKi8KKwkJdGVtcCB8PSBEUkVGX0NQVV9TT1VSQ0VfT1VUUFVUX0RJU0FCTEU7CisKKwkJSTkxNV9XUklURShQQ0hfRFJFRl9DT05UUk9MLCB0ZW1wKTsKKwkJUE9TVElOR19SRUFEKFBDSF9EUkVGX0NPTlRST0wpOworCQl1ZGVsYXkoMjAwKTsKKworCQkvKiBUdXJuIG9mZiB0aGUgU1NDIHNvdXJjZSAqLworCQl0ZW1wICY9IH5EUkVGX1NTQ19TT1VSQ0VfTUFTSzsKKwkJdGVtcCB8PSBEUkVGX1NTQ19TT1VSQ0VfRElTQUJMRTsKKworCQkvKiBUdXJuIG9mZiBTU0MxICovCisJCXRlbXAgJj0gfiBEUkVGX1NTQzFfRU5BQkxFOworCiAJCUk5MTVfV1JJVEUoUENIX0RSRUZfQ09OVFJPTCwgdGVtcCk7CiAJCVBPU1RJTkdfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKIAkJdWRlbGF5KDIwMCk7CiAJfQogfQogCitzdGF0aWMgaW50IGlyb25sYWtlX2dldF9yZWZjbGsoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICptb2RlX2NvbmZpZyA9ICZkZXYtPm1vZGVfY29uZmlnOworCXN0cnVjdCBpbnRlbF9lbmNvZGVyICplZHBfZW5jb2RlciA9IE5VTEw7CisJaW50IG51bV9jb25uZWN0b3JzID0gMDsKKwlib29sIGlzX2x2ZHMgPSBmYWxzZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJm1vZGVfY29uZmlnLT5lbmNvZGVyX2xpc3QsIGJhc2UuaGVhZCkgeworCQlpZiAoZW5jb2Rlci0+YmFzZS5jcnRjICE9IGNydGMpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGVuY29kZXItPnR5cGUpIHsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfTFZEUzoKKwkJCWlzX2x2ZHMgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgSU5URUxfT1VUUFVUX0VEUDoKKwkJCWVkcF9lbmNvZGVyID0gZW5jb2RlcjsKKwkJCWJyZWFrOworCQl9CisJCW51bV9jb25uZWN0b3JzKys7CisJfQorCisJaWYgKGlzX2x2ZHMgJiYgaW50ZWxfcGFuZWxfdXNlX3NzYyhkZXZfcHJpdikgJiYgbnVtX2Nvbm5lY3RvcnMgPCAyKSB7CisJCURSTV9ERUJVR19LTVMoInVzaW5nIFNTQyByZWZlcmVuY2UgY2xvY2sgb2YgJWQgTUh6XG4iLAorCQkJICAgICAgZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEpOworCQlyZXR1cm4gZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgKiAxMDAwOworCX0KKworCXJldHVybiAxMjAwMDA7Cit9CisKIHN0YXRpYyBpbnQgaXJvbmxha2VfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlLApAQCAtNTI0MSwxNiArNTM5NCw3IEBACiAJCW51bV9jb25uZWN0b3JzKys7CiAJfQogCi0JaWYgKGlzX2x2ZHMgJiYgaW50ZWxfcGFuZWxfdXNlX3NzYyhkZXZfcHJpdikgJiYgbnVtX2Nvbm5lY3RvcnMgPCAyKSB7Ci0JCXJlZmNsayA9IGRldl9wcml2LT5sdmRzX3NzY19mcmVxICogMTAwMDsKLQkJRFJNX0RFQlVHX0tNUygidXNpbmcgU1NDIHJlZmVyZW5jZSBjbG9jayBvZiAlZCBNSHpcbiIsCi0JCQkgICAgICByZWZjbGsgLyAxMDAwKTsKLQl9IGVsc2UgewotCQlyZWZjbGsgPSA5NjAwMDsKLQkJaWYgKCFoYXNfZWRwX2VuY29kZXIgfHwKLQkJICAgIGludGVsX2VuY29kZXJfaXNfcGNoX2VkcCgmaGFzX2VkcF9lbmNvZGVyLT5iYXNlKSkKLQkJCXJlZmNsayA9IDEyMDAwMDsgLyogMTIwTWh6IHJlZmNsayAqLwotCX0KKwlyZWZjbGsgPSBpcm9ubGFrZV9nZXRfcmVmY2xrKGNydGMpOwogCiAJLyoKIAkgKiBSZXR1cm5zIGEgc2V0IG9mIGRpdmlzb3JzIGZvciB0aGUgZGVzaXJlZCB0YXJnZXQgY2xvY2sgd2l0aCB0aGUgZ2l2ZW4KQEAgLTUzNzcsOCArNTUyMSw2IEBACiAJaXJvbmxha2VfY29tcHV0ZV9tX24oaW50ZWxfY3J0Yy0+YnBwLCBsYW5lLCB0YXJnZXRfY2xvY2ssIGxpbmtfYncsCiAJCQkgICAgICZtX24pOwogCi0JaXJvbmxha2VfdXBkYXRlX3BjaF9yZWZjbGsoZGV2KTsKLQogCWZwID0gY2xvY2subiA8PCAxNiB8IGNsb2NrLm0xIDw8IDggfCBjbG9jay5tMjsKIAlpZiAoaGFzX3JlZHVjZWRfY2xvY2spCiAJCWZwMiA9IHJlZHVjZWRfY2xvY2subiA8PCAxNiB8IHJlZHVjZWRfY2xvY2subTEgPDwgOCB8CkBAIC01NDUwLDM5ICs1NTkyLDMyIEBACiAJLyogU2V0IHVwIHRoZSBkaXNwbGF5IHBsYW5lIHJlZ2lzdGVyICovCiAJZHNwY250ciA9IERJU1BQTEFORV9HQU1NQV9FTkFCTEU7CiAKLQlEUk1fREVCVUdfS01TKCJNb2RlIGZvciBwaXBlICVjOlxuIiwgcGlwZSA9PSAwID8gJ0EnIDogJ0InKTsKKwlEUk1fREVCVUdfS01TKCJNb2RlIGZvciBwaXBlICVkOlxuIiwgcGlwZSk7CiAJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShtb2RlKTsKIAogCS8qIFBDSCBlRFAgbmVlZHMgRkRJLCBidXQgQ1BVIGVEUCBkb2VzIG5vdCAqLwotCWlmICghaGFzX2VkcF9lbmNvZGVyIHx8IGludGVsX2VuY29kZXJfaXNfcGNoX2VkcCgmaGFzX2VkcF9lbmNvZGVyLT5iYXNlKSkgewotCQlJOTE1X1dSSVRFKFBDSF9GUDAocGlwZSksIGZwKTsKLQkJSTkxNV9XUklURShQQ0hfRFBMTChwaXBlKSwgZHBsbCAmIH5EUExMX1ZDT19FTkFCTEUpOworCWlmICghaW50ZWxfY3J0Yy0+bm9fcGxsKSB7CisJCWlmICghaGFzX2VkcF9lbmNvZGVyIHx8CisJCSAgICBpbnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAoJmhhc19lZHBfZW5jb2Rlci0+YmFzZSkpIHsKKwkJCUk5MTVfV1JJVEUoUENIX0ZQMChwaXBlKSwgZnApOworCQkJSTkxNV9XUklURShQQ0hfRFBMTChwaXBlKSwgZHBsbCAmIH5EUExMX1ZDT19FTkFCTEUpOwogCi0JCVBPU1RJTkdfUkVBRChQQ0hfRFBMTChwaXBlKSk7Ci0JCXVkZWxheSgxNTApOwotCX0KLQotCS8qIGVuYWJsZSB0cmFuc2NvZGVyIERQTEwgKi8KLQlpZiAoSEFTX1BDSF9DUFQoZGV2KSkgewotCQl0ZW1wID0gSTkxNV9SRUFEKFBDSF9EUExMX1NFTCk7Ci0JCXN3aXRjaCAocGlwZSkgewotCQljYXNlIDA6Ci0JCQl0ZW1wIHw9IFRSQU5TQV9EUExMX0VOQUJMRSB8IFRSQU5TQV9EUExMQV9TRUw7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJdGVtcCB8PQlUUkFOU0JfRFBMTF9FTkFCTEUgfCBUUkFOU0JfRFBMTEJfU0VMOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCS8qIEZJWE1FOiBtYW5hZ2UgdHJhbnNjb2RlciBQTExzPyAqLwotCQkJdGVtcCB8PSBUUkFOU0NfRFBMTF9FTkFCTEUgfCBUUkFOU0NfRFBMTEJfU0VMOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlCVUcoKTsKKwkJCVBPU1RJTkdfUkVBRChQQ0hfRFBMTChwaXBlKSk7CisJCQl1ZGVsYXkoMTUwKTsKIAkJfQotCQlJOTE1X1dSSVRFKFBDSF9EUExMX1NFTCwgdGVtcCk7Ci0KLQkJUE9TVElOR19SRUFEKFBDSF9EUExMX1NFTCk7Ci0JCXVkZWxheSgxNTApOworCX0gZWxzZSB7CisJCWlmIChkcGxsID09IChJOTE1X1JFQUQoUENIX0RQTEwoMCkpICYgMHg3ZmZmZmZmZikgJiYKKwkJICAgIGZwID09IEk5MTVfUkVBRChQQ0hfRlAwKDApKSkgeworCQkJaW50ZWxfY3J0Yy0+dXNlX3BsbF9hID0gdHJ1ZTsKKwkJCURSTV9ERUJVR19LTVMoInVzaW5nIHBpcGUgYSBkcGxsXG4iKTsKKwkJfSBlbHNlIGlmIChkcGxsID09IChJOTE1X1JFQUQoUENIX0RQTEwoMSkpICYgMHg3ZmZmZmZmZikgJiYKKwkJCSAgIGZwID09IEk5MTVfUkVBRChQQ0hfRlAwKDEpKSkgeworCQkJaW50ZWxfY3J0Yy0+dXNlX3BsbF9hID0gZmFsc2U7CisJCQlEUk1fREVCVUdfS01TKCJ1c2luZyBwaXBlIGIgZHBsbFxuIik7CisJCX0gZWxzZSB7CisJCQlEUk1fREVCVUdfS01TKCJubyBtYXRjaGluZyBQTEwgY29uZmlndXJhdGlvbiBmb3IgcGlwZSAyXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiAJLyogVGhlIExWRFMgcGluIHBhaXIgbmVlZHMgdG8gYmUgb24gYmVmb3JlIHRoZSBEUExMcyBhcmUgZW5hYmxlZC4KQEAgLTU0OTIsMTcgKzU2MjcsMTMgQEAKIAlpZiAoaXNfbHZkcykgewogCQl0ZW1wID0gSTkxNV9SRUFEKFBDSF9MVkRTKTsKIAkJdGVtcCB8PSBMVkRTX1BPUlRfRU4gfCBMVkRTX0EwQTJfQ0xLQV9QT1dFUl9VUDsKLQkJaWYgKHBpcGUgPT0gMSkgewotCQkJaWYgKEhBU19QQ0hfQ1BUKGRldikpCi0JCQkJdGVtcCB8PSBQT1JUX1RSQU5TX0JfU0VMX0NQVDsKLQkJCWVsc2UKLQkJCQl0ZW1wIHw9IExWRFNfUElQRUJfU0VMRUNUOwotCQl9IGVsc2UgewotCQkJaWYgKEhBU19QQ0hfQ1BUKGRldikpCi0JCQkJdGVtcCAmPSB+UE9SVF9UUkFOU19TRUxfTUFTSzsKLQkJCWVsc2UKLQkJCQl0ZW1wICY9IH5MVkRTX1BJUEVCX1NFTEVDVDsKLQkJfQorCQlpZiAoSEFTX1BDSF9DUFQoZGV2KSkKKwkJCXRlbXAgfD0gUE9SVF9UUkFOU19TRUxfQ1BUKHBpcGUpOworCQllbHNlIGlmIChwaXBlID09IDEpCisJCQl0ZW1wIHw9IExWRFNfUElQRUJfU0VMRUNUOworCQllbHNlCisJCQl0ZW1wICY9IH5MVkRTX1BJUEVCX1NFTEVDVDsKKwogCQkvKiBzZXQgdGhlIGNvcnJlc3BvbnNkaW5nIExWRFNfQk9SREVSIGJpdCAqLwogCQl0ZW1wIHw9IGRldl9wcml2LT5sdmRzX2JvcmRlcl9iaXRzOwogCQkvKiBTZXQgdGhlIEIwLUIzIGRhdGEgcGFpcnMgY29ycmVzcG9uZGluZyB0byB3aGV0aGVyIHdlJ3JlIGdvaW5nIHRvCkBAIC01NTUyLDggKzU2ODMsOSBAQAogCQlJOTE1X1dSSVRFKFRSQU5TRFBMSU5LX04xKHBpcGUpLCAwKTsKIAl9CiAKLQlpZiAoIWhhc19lZHBfZW5jb2RlciB8fAotCSAgICBpbnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAoJmhhc19lZHBfZW5jb2Rlci0+YmFzZSkpIHsKKwlpZiAoIWludGVsX2NydGMtPm5vX3BsbCAmJgorCSAgICAoIWhhc19lZHBfZW5jb2RlciB8fAorCSAgICAgaW50ZWxfZW5jb2Rlcl9pc19wY2hfZWRwKCZoYXNfZWRwX2VuY29kZXItPmJhc2UpKSkgewogCQlJOTE1X1dSSVRFKFBDSF9EUExMKHBpcGUpLCBkcGxsKTsKIAogCQkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHN0YWJpbGl6ZS4gKi8KQEAgLTU1NjksMTggKzU3MDEsMjAgQEAKIAl9CiAKIAlpbnRlbF9jcnRjLT5sb3dmcmVxX2F2YWlsID0gZmFsc2U7Ci0JaWYgKGlzX2x2ZHMgJiYgaGFzX3JlZHVjZWRfY2xvY2sgJiYgaTkxNV9wb3dlcnNhdmUpIHsKLQkJSTkxNV9XUklURShQQ0hfRlAxKHBpcGUpLCBmcDIpOwotCQlpbnRlbF9jcnRjLT5sb3dmcmVxX2F2YWlsID0gdHJ1ZTsKLQkJaWYgKEhBU19QSVBFX0NYU1IoZGV2KSkgewotCQkJRFJNX0RFQlVHX0tNUygiZW5hYmxpbmcgQ3hTUiBkb3duY2xvY2tpbmdcbiIpOwotCQkJcGlwZWNvbmYgfD0gUElQRUNPTkZfQ1hTUl9ET1dOQ0xPQ0s7Ci0JCX0KLQl9IGVsc2UgewotCQlJOTE1X1dSSVRFKFBDSF9GUDEocGlwZSksIGZwKTsKLQkJaWYgKEhBU19QSVBFX0NYU1IoZGV2KSkgewotCQkJRFJNX0RFQlVHX0tNUygiZGlzYWJsaW5nIEN4U1IgZG93bmNsb2NraW5nXG4iKTsKLQkJCXBpcGVjb25mICY9IH5QSVBFQ09ORl9DWFNSX0RPV05DTE9DSzsKKwlpZiAoIWludGVsX2NydGMtPm5vX3BsbCkgeworCQlpZiAoaXNfbHZkcyAmJiBoYXNfcmVkdWNlZF9jbG9jayAmJiBpOTE1X3Bvd2Vyc2F2ZSkgeworCQkJSTkxNV9XUklURShQQ0hfRlAxKHBpcGUpLCBmcDIpOworCQkJaW50ZWxfY3J0Yy0+bG93ZnJlcV9hdmFpbCA9IHRydWU7CisJCQlpZiAoSEFTX1BJUEVfQ1hTUihkZXYpKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiZW5hYmxpbmcgQ3hTUiBkb3duY2xvY2tpbmdcbiIpOworCQkJCXBpcGVjb25mIHw9IFBJUEVDT05GX0NYU1JfRE9XTkNMT0NLOworCQkJfQorCQl9IGVsc2UgeworCQkJSTkxNV9XUklURShQQ0hfRlAxKHBpcGUpLCBmcCk7CisJCQlpZiAoSEFTX1BJUEVfQ1hTUihkZXYpKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiZGlzYWJsaW5nIEN4U1IgZG93bmNsb2NraW5nXG4iKTsKKwkJCQlwaXBlY29uZiAmPSB+UElQRUNPTkZfQ1hTUl9ET1dOQ0xPQ0s7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTU2NzcsNiArNTgxMSwxMzEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBnNHhfd3JpdGVfZWxkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkgIHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7CisJdWludDhfdCAqZWxkID0gY29ubmVjdG9yLT5lbGQ7CisJdWludDMyX3QgZWxkdjsKKwl1aW50MzJfdCBsZW47CisJdWludDMyX3QgaTsKKworCWkgPSBJOTE1X1JFQUQoRzRYX0FVRF9WSURfRElEKTsKKworCWlmIChpID09IElOVEVMX0FVRElPX0RFVkJMQyB8fCBpID09IElOVEVMX0FVRElPX0RFVkNMKQorCQllbGR2ID0gRzRYX0VMRFZfREVWQ0xfREVWQkxDOworCWVsc2UKKwkJZWxkdiA9IEc0WF9FTERWX0RFVkNURzsKKworCWkgPSBJOTE1X1JFQUQoRzRYX0FVRF9DTlRMX1NUKTsKKwlpICY9IH4oZWxkdiB8IEc0WF9FTERfQUREUik7CisJbGVuID0gKGkgPj4gOSkgJiAweDFmOwkJLyogRUxEIGJ1ZmZlciBzaXplICovCisJSTkxNV9XUklURShHNFhfQVVEX0NOVExfU1QsIGkpOworCisJaWYgKCFlbGRbMF0pCisJCXJldHVybjsKKworCWxlbiA9IG1pbl90KHVpbnQ4X3QsIGVsZFsyXSwgbGVuKTsKKwlEUk1fREVCVUdfRFJJVkVSKCJFTEQgc2l6ZSAlZFxuIiwgbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCUk5MTVfV1JJVEUoRzRYX0hETUlXX0hETUlFRElELCAqKCh1aW50MzJfdCAqKWVsZCArIGkpKTsKKworCWkgPSBJOTE1X1JFQUQoRzRYX0FVRF9DTlRMX1NUKTsKKwlpIHw9IGVsZHY7CisJSTkxNV9XUklURShHNFhfQVVEX0NOVExfU1QsIGkpOworfQorCitzdGF0aWMgdm9pZCBpcm9ubGFrZV93cml0ZV9lbGQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgICAgIHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7CisJdWludDhfdCAqZWxkID0gY29ubmVjdG9yLT5lbGQ7CisJdWludDMyX3QgZWxkdjsKKwl1aW50MzJfdCBpOworCWludCBsZW47CisJaW50IGhkbWl3X2hkbWllZGlkOworCWludCBhdWRfY250bF9zdDsKKwlpbnQgYXVkX2NudHJsX3N0MjsKKworCWlmIChJU19JVllCUklER0UoY29ubmVjdG9yLT5kZXYpKSB7CisJCWhkbWl3X2hkbWllZGlkID0gR0VON19IRE1JV19IRE1JRURJRF9BOworCQlhdWRfY250bF9zdCA9IEdFTjdfQVVEX0NOVFJMX1NUX0E7CisJCWF1ZF9jbnRybF9zdDIgPSBHRU43X0FVRF9DTlRSTF9TVDI7CisJfSBlbHNlIHsKKwkJaGRtaXdfaGRtaWVkaWQgPSBHRU41X0hETUlXX0hETUlFRElEX0E7CisJCWF1ZF9jbnRsX3N0ID0gR0VONV9BVURfQ05UTF9TVF9BOworCQlhdWRfY250cmxfc3QyID0gR0VONV9BVURfQ05UTF9TVDI7CisJfQorCisJaSA9IHRvX2ludGVsX2NydGMoY3J0YyktPnBpcGU7CisJaGRtaXdfaGRtaWVkaWQgKz0gaSAqIDB4MTAwOworCWF1ZF9jbnRsX3N0ICs9IGkgKiAweDEwMDsKKworCURSTV9ERUJVR19EUklWRVIoIkVMRCBvbiBwaXBlICVjXG4iLCBwaXBlX25hbWUoaSkpOworCisJaSA9IEk5MTVfUkVBRChhdWRfY250bF9zdCk7CisJaSA9IChpID4+IDI5KSAmIDB4MzsJCS8qIERJUF9Qb3J0X1NlbGVjdCwgMHgxID0gUG9ydEIgKi8KKwlpZiAoIWkpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiQXVkaW8gZGlyZWN0ZWQgdG8gdW5rbm93biBwb3J0XG4iKTsKKwkJLyogb3BlcmF0ZSBibGluZGx5IG9uIGFsbCBwb3J0cyAqLworCQllbGR2ID0gR0VONV9FTERfVkFMSURCOworCQllbGR2IHw9IEdFTjVfRUxEX1ZBTElEQiA8PCA0OworCQllbGR2IHw9IEdFTjVfRUxEX1ZBTElEQiA8PCA4OworCX0gZWxzZSB7CisJCURSTV9ERUJVR19EUklWRVIoIkVMRCBvbiBwb3J0ICVjXG4iLCAnQScgKyBpKTsKKwkJZWxkdiA9IEdFTjVfRUxEX1ZBTElEQiA8PCAoKGkgLSAxKSAqIDQpOworCX0KKworCWkgPSBJOTE1X1JFQUQoYXVkX2NudHJsX3N0Mik7CisJaSAmPSB+ZWxkdjsKKwlJOTE1X1dSSVRFKGF1ZF9jbnRybF9zdDIsIGkpOworCisJaWYgKCFlbGRbMF0pCisJCXJldHVybjsKKworCWlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCkpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiRUxEOiBEaXNwbGF5UG9ydCBkZXRlY3RlZFxuIik7CisJCWVsZFs1XSB8PSAoMSA8PCAyKTsJLyogQ29ubl9UeXBlLCAweDEgPSBEaXNwbGF5UG9ydCAqLworCX0KKworCWkgPSBJOTE1X1JFQUQoYXVkX2NudGxfc3QpOworCWkgJj0gfkdFTjVfRUxEX0FERFJFU1M7CisJSTkxNV9XUklURShhdWRfY250bF9zdCwgaSk7CisKKwlsZW4gPSBtaW5fdCh1aW50OF90LCBlbGRbMl0sIDIxKTsJLyogODQgYnl0ZXMgb2YgaHcgRUxEIGJ1ZmZlciAqLworCURSTV9ERUJVR19EUklWRVIoIkVMRCBzaXplICVkXG4iLCBsZW4pOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJSTkxNV9XUklURShoZG1pd19oZG1pZWRpZCwgKigodWludDMyX3QgKillbGQgKyBpKSk7CisKKwlpID0gSTkxNV9SRUFEKGF1ZF9jbnRybF9zdDIpOworCWkgfD0gZWxkdjsKKwlJOTE1X1dSSVRFKGF1ZF9jbnRybF9zdDIsIGkpOworfQorCit2b2lkIGludGVsX3dyaXRlX2VsZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gZW5jb2Rlci0+Y3J0YzsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWNvbm5lY3RvciA9IGRybV9zZWxlY3RfZWxkKGVuY29kZXIsIG1vZGUpOworCWlmICghY29ubmVjdG9yKQorCQlyZXR1cm47CisKKwlEUk1fREVCVUdfRFJJVkVSKCJFTEQgb24gW0NPTk5FQ1RPUjolZDolc10sIFtFTkNPREVSOiVkOiVzXVxuIiwKKwkJCSBjb25uZWN0b3ItPmJhc2UuaWQsCisJCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpLAorCQkJIGNvbm5lY3Rvci0+ZW5jb2Rlci0+YmFzZS5pZCwKKwkJCSBkcm1fZ2V0X2VuY29kZXJfbmFtZShjb25uZWN0b3ItPmVuY29kZXIpKTsKKworCWNvbm5lY3Rvci0+ZWxkWzZdID0gZHJtX2F2X3N5bmNfZGVsYXkoY29ubmVjdG9yLCBtb2RlKSAvIDI7CisKKwlpZiAoZGV2X3ByaXYtPmRpc3BsYXkud3JpdGVfZWxkKQorCQlkZXZfcHJpdi0+ZGlzcGxheS53cml0ZV9lbGQoY29ubmVjdG9yLCBjcnRjKTsKK30KKwogLyoqIExvYWRzIHRoZSBwYWxldHRlL2dhbW1hIHVuaXQgZm9yIHRoZSBDUlRDIHdpdGggdGhlIHByZXBhcmVkIHZhbHVlcyAqLwogdm9pZCBpbnRlbF9jcnRjX2xvYWRfbHV0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKQEAgLTU3NTgsNiArNjAxNywzMSBAQAogCUk5MTVfV1JJVEUoQ1VSQkFTRShwaXBlKSwgYmFzZSk7CiB9CiAKK3N0YXRpYyB2b2lkIGl2Yl91cGRhdGVfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTMyIGJhc2UpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CisJYm9vbCB2aXNpYmxlID0gYmFzZSAhPSAwOworCisJaWYgKGludGVsX2NydGMtPmN1cnNvcl92aXNpYmxlICE9IHZpc2libGUpIHsKKwkJdWludDMyX3QgY250bCA9IEk5MTVfUkVBRChDVVJDTlRSX0lWQihwaXBlKSk7CisJCWlmIChiYXNlKSB7CisJCQljbnRsICY9IH5DVVJTT1JfTU9ERTsKKwkJCWNudGwgfD0gQ1VSU09SX01PREVfNjRfQVJHQl9BWCB8IE1DVVJTT1JfR0FNTUFfRU5BQkxFOworCQl9IGVsc2UgeworCQkJY250bCAmPSB+KENVUlNPUl9NT0RFIHwgTUNVUlNPUl9HQU1NQV9FTkFCTEUpOworCQkJY250bCB8PSBDVVJTT1JfTU9ERV9ESVNBQkxFOworCQl9CisJCUk5MTVfV1JJVEUoQ1VSQ05UUl9JVkIocGlwZSksIGNudGwpOworCisJCWludGVsX2NydGMtPmN1cnNvcl92aXNpYmxlID0gdmlzaWJsZTsKKwl9CisJLyogYW5kIGNvbW1pdCBjaGFuZ2VzIG9uIG5leHQgdmJsYW5rICovCisJSTkxNV9XUklURShDVVJCQVNFX0lWQihwaXBlKSwgYmFzZSk7Cit9CisKIC8qIElmIG5vLXBhcnQgb2YgdGhlIGN1cnNvciBpcyB2aXNpYmxlIG9uIHRoZSBmcmFtZWJ1ZmZlciwgdGhlbiB0aGUgR1BVIG1heSBoYW5nLi4uICovCiBzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX3VwZGF0ZV9jdXJzb3Ioc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQkJCSAgICAgYm9vbCBvbikKQEAgLTU4MDUsMTEgKzYwODksMTYgQEAKIAlpZiAoIXZpc2libGUgJiYgIWludGVsX2NydGMtPmN1cnNvcl92aXNpYmxlKQogCQlyZXR1cm47CiAKLQlJOTE1X1dSSVRFKENVUlBPUyhwaXBlKSwgcG9zKTsKLQlpZiAoSVNfODQ1RyhkZXYpIHx8IElTX0k4NjVHKGRldikpCi0JCWk4NDVfdXBkYXRlX2N1cnNvcihjcnRjLCBiYXNlKTsKLQllbHNlCi0JCWk5eHhfdXBkYXRlX2N1cnNvcihjcnRjLCBiYXNlKTsKKwlpZiAoSVNfSVZZQlJJREdFKGRldikpIHsKKwkJSTkxNV9XUklURShDVVJQT1NfSVZCKHBpcGUpLCBwb3MpOworCQlpdmJfdXBkYXRlX2N1cnNvcihjcnRjLCBiYXNlKTsKKwl9IGVsc2UgeworCQlJOTE1X1dSSVRFKENVUlBPUyhwaXBlKSwgcG9zKTsKKwkJaWYgKElTXzg0NUcoZGV2KSB8fCBJU19JODY1RyhkZXYpKQorCQkJaTg0NV91cGRhdGVfY3Vyc29yKGNydGMsIGJhc2UpOworCQllbHNlCisJCQlpOXh4X3VwZGF0ZV9jdXJzb3IoY3J0YywgYmFzZSk7CisJfQogCiAJaWYgKHZpc2libGUpCiAJCWludGVsX21hcmtfYnVzeShkZXYsIHRvX2ludGVsX2ZyYW1lYnVmZmVyKGNydGMtPmZiKS0+b2JqKTsKQEAgLTcwNzEsNiArNzM2MCw4IEBACiAJaW50ZWxfY3J0Yy0+YnBwID0gMjQ7IC8qIGRlZmF1bHQgZm9yIHByZS1Jcm9ubGFrZSAqLwogCiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgeworCQlpZiAocGlwZSA9PSAyICYmIElTX0lWWUJSSURHRShkZXYpKQorCQkJaW50ZWxfY3J0Yy0+bm9fcGxsID0gdHJ1ZTsKIAkJaW50ZWxfaGVscGVyX2Z1bmNzLnByZXBhcmUgPSBpcm9ubGFrZV9jcnRjX3ByZXBhcmU7CiAJCWludGVsX2hlbHBlcl9mdW5jcy5jb21taXQgPSBpcm9ubGFrZV9jcnRjX2NvbW1pdDsKIAl9IGVsc2UgewpAQCAtNzI1MCw2ICs3NTQxLDkgQEAKIAogCS8qIGRpc2FibGUgYWxsIHRoZSBwb3NzaWJsZSBvdXRwdXRzL2NydGNzIGJlZm9yZSBlbnRlcmluZyBLTVMgbW9kZSAqLwogCWRybV9oZWxwZXJfZGlzYWJsZV91bnVzZWRfZnVuY3Rpb25zKGRldik7CisKKwlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQorCQlpcm9ubGFrZV9pbml0X3BjaF9yZWZjbGsoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfdXNlcl9mcmFtZWJ1ZmZlcl9kZXN0cm95KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQpAQCAtNzQ5NCw2ICs3Nzg4LDEwIEBACiAJSTkxNV9XUklURShHRU42X1JQTlNXUkVRLCAxIDw8IDMxKTsKIAlJOTE1X1dSSVRFKEdFTjZfUE1JTlRSTVNLLCAweGZmZmZmZmZmKTsKIAlJOTE1X1dSSVRFKEdFTjZfUE1JRVIsIDApOworCS8qIENvbXBsZXRlIFBNIGludGVycnVwdCBtYXNraW5nIGhlcmUgZG9lc24ndCByYWNlIHdpdGggdGhlIHJwcyB3b3JrCisJICogaXRlbSBhZ2FpbiB1bm1hc2tpbmcgUE0gaW50ZXJydXB0cyBiZWNhdXNlIHRoYXQgaXMgdXNpbmcgYSBkaWZmZXJlbnQKKwkgKiByZWdpc3RlciAoUE1JTVIpIHRvIG1hc2sgUE0gaW50ZXJydXB0cy4gVGhlIG9ubHkgcmlzayBpcyBpbiBsZWF2aW5nCisJICogc3RhbGUgYml0cyBpbiBQTUlJUiBhbmQgUE1JTVIgd2hpY2ggZ2VuNl9lbmFibGVfcnBzIHdpbGwgY2xlYW4gdXAuICovCiAKIAlzcGluX2xvY2tfaXJxKCZkZXZfcHJpdi0+cnBzX2xvY2spOwogCWRldl9wcml2LT5wbV9paXIgPSAwOwpAQCAtODE1NCw3ICs4NDUyLDcgQEAKIAl9CiAKIAkvKiBSZXR1cm5zIHRoZSBjb3JlIGRpc3BsYXkgY2xvY2sgc3BlZWQgKi8KLQlpZiAoSVNfSTk0NUcoZGV2KSB8fCAoSVNfRzMzKGRldikgJiYgISBJU19QSU5FVklFV19NKGRldikpKQorCWlmIChJU19JOTQ1RyhkZXYpIHx8IChJU19HMzMoZGV2KSAmJiAhSVNfUElORVZJRVdfTShkZXYpKSkKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQgPQogCQkJaTk0NV9nZXRfZGlzcGxheV9jbG9ja19zcGVlZDsKIAllbHNlIGlmIChJU19JOTE1RyhkZXYpKQpAQCAtODE5Myw2ICs4NDkxLDcgQEAKIAkJCX0KIAkJCWRldl9wcml2LT5kaXNwbGF5LmZkaV9saW5rX3RyYWluID0gaXJvbmxha2VfZmRpX2xpbmtfdHJhaW47CiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGlyb25sYWtlX2luaXRfY2xvY2tfZ2F0aW5nOworCQkJZGV2X3ByaXYtPmRpc3BsYXkud3JpdGVfZWxkID0gaXJvbmxha2Vfd3JpdGVfZWxkOwogCQl9IGVsc2UgaWYgKElTX0dFTjYoZGV2KSkgewogCQkJaWYgKFNOQl9SRUFEX1dNMF9MQVRFTkNZKCkpIHsKIAkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBzYW5keWJyaWRnZV91cGRhdGVfd207CkBAIC04MjAzLDYgKzg1MDIsNyBAQAogCQkJfQogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZmRpX2xpbmtfdHJhaW4gPSBnZW42X2ZkaV9saW5rX3RyYWluOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBnZW42X2luaXRfY2xvY2tfZ2F0aW5nOworCQkJZGV2X3ByaXYtPmRpc3BsYXkud3JpdGVfZWxkID0gaXJvbmxha2Vfd3JpdGVfZWxkOwogCQl9IGVsc2UgaWYgKElTX0lWWUJSSURHRShkZXYpKSB7CiAJCQkvKiBGSVhNRTogZGV0ZWN0IEIwKyBzdGVwcGluZyBhbmQgdXNlIGF1dG8gdHJhaW5pbmcgKi8KIAkJCWRldl9wcml2LT5kaXNwbGF5LmZkaV9saW5rX3RyYWluID0gaXZiX21hbnVhbF9mZGlfbGlua190cmFpbjsKQEAgLTgyMTQsNyArODUxNCw3IEBACiAJCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gTlVMTDsKIAkJCX0KIAkJCWRldl9wcml2LT5kaXNwbGF5LmluaXRfY2xvY2tfZ2F0aW5nID0gaXZ5YnJpZGdlX2luaXRfY2xvY2tfZ2F0aW5nOwotCisJCQlkZXZfcHJpdi0+ZGlzcGxheS53cml0ZV9lbGQgPSBpcm9ubGFrZV93cml0ZV9lbGQ7CiAJCX0gZWxzZQogCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gTlVMTDsKIAl9IGVsc2UgaWYgKElTX1BJTkVWSUVXKGRldikpIHsKQEAgLTgyMjUsNyArODUyNSw3IEBACiAJCQlEUk1fSU5GTygiZmFpbGVkIHRvIGZpbmQga25vd24gQ3hTUiBsYXRlbmN5ICIKIAkJCQkgIihmb3VuZCBkZHIlcyBmc2IgZnJlcSAlZCwgbWVtIGZyZXEgJWQpLCAiCiAJCQkJICJkaXNhYmxpbmcgQ3hTUlxuIiwKLQkJCQkgKGRldl9wcml2LT5pc19kZHIzID09IDEpID8gIjMiOiAiMiIsCisJCQkJIChkZXZfcHJpdi0+aXNfZGRyMyA9PSAxKSA/ICIzIiA6ICIyIiwKIAkJCQkgZGV2X3ByaXYtPmZzYl9mcmVxLCBkZXZfcHJpdi0+bWVtX2ZyZXEpOwogCQkJLyogRGlzYWJsZSBDeFNSIGFuZCBuZXZlciB1cGRhdGUgaXRzIHdhdGVybWFyayBhZ2FpbiAqLwogCQkJcGluZXZpZXdfZGlzYWJsZV9jeHNyKGRldik7CkBAIC04MjM0LDYgKzg1MzQsNyBAQAogCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gcGluZXZpZXdfdXBkYXRlX3dtOwogCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGdlbjNfaW5pdF9jbG9ja19nYXRpbmc7CiAJfSBlbHNlIGlmIChJU19HNFgoZGV2KSkgeworCQlkZXZfcHJpdi0+ZGlzcGxheS53cml0ZV9lbGQgPSBnNHhfd3JpdGVfZWxkOwogCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBnNHhfdXBkYXRlX3dtOwogCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGc0eF9pbml0X2Nsb2NrX2dhdGluZzsKIAl9IGVsc2UgaWYgKElTX0dFTjQoZGV2KSkgewpAQCAtODI5NCw3ICs4NTk1LDcgQEAKICAqIHJlc3VtZSwgb3Igb3RoZXIgdGltZXMuICBUaGlzIHF1aXJrIG1ha2VzIHN1cmUgdGhhdCdzIHRoZSBjYXNlIGZvcgogICogYWZmZWN0ZWQgc3lzdGVtcy4KICAqLwotc3RhdGljIHZvaWQgcXVpcmtfcGlwZWFfZm9yY2UgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBxdWlya19waXBlYV9mb3JjZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTgzMjIsNyArODYyMyw3IEBACiAJLyogSFAgQ29tcGFxIDI3MzBwIG5lZWRzIHBpcGUgQSBmb3JjZSBxdWlyayAoTFA6ICMyOTE1NTUpICovCiAJeyAweDJhNDIsIDB4MTAzYywgMHgzMGViLCBxdWlya19waXBlYV9mb3JjZSB9LAogCS8qIEhQIE1pbmkgbmVlZHMgcGlwZSBBIGZvcmNlIHF1aXJrIChMUDogIzMyMjEwNCkgKi8KLQl7IDB4MjdhZSwweDEwM2MsIDB4MzYxYSwgcXVpcmtfcGlwZWFfZm9yY2UgfSwKKwl7IDB4MjdhZSwgMHgxMDNjLCAweDM2MWEsIHF1aXJrX3BpcGVhX2ZvcmNlIH0sCiAKIAkvKiBUaGlua3BhZCBSMzEgbmVlZHMgcGlwZSBBIGZvcmNlIHF1aXJrICovCiAJeyAweDM1NzcsIDB4MTAxNCwgMHgwNTA1LCBxdWlya19waXBlYV9mb3JjZSB9LApAQCAtODQ4OCw2ICs4Nzg5LDcgQEAKIAkgKiBlbnF1ZXVlIHVucGluL2hvdHBsdWcgd29yay4gKi8KIAlkcm1faXJxX3VuaW5zdGFsbChkZXYpOwogCWNhbmNlbF93b3JrX3N5bmMoJmRldl9wcml2LT5ob3RwbHVnX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmRldl9wcml2LT5ycHNfd29yayk7CiAKIAkvKiBmbHVzaCBhbnkgZGVsYXllZCB0YXNrcyBvciBwZW5kaW5nIHdvcmsgKi8KIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwpAQCAtODU3Myw3ICs4ODc1LDcgQEAKIHN0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlICoKIGludGVsX2Rpc3BsYXlfY2FwdHVyZV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfZGlzcGxheV9lcnJvcl9zdGF0ZSAqZXJyb3I7CiAJaW50IGk7CiAKQEAgLTg1ODksNyArODg5MSw3IEBACiAJCWVycm9yLT5wbGFuZVtpXS5jb250cm9sID0gSTkxNV9SRUFEKERTUENOVFIoaSkpOwogCQllcnJvci0+cGxhbmVbaV0uc3RyaWRlID0gSTkxNV9SRUFEKERTUFNUUklERShpKSk7CiAJCWVycm9yLT5wbGFuZVtpXS5zaXplID0gSTkxNV9SRUFEKERTUFNJWkUoaSkpOwotCQllcnJvci0+cGxhbmVbaV0ucG9zPSBJOTE1X1JFQUQoRFNQUE9TKGkpKTsKKwkJZXJyb3ItPnBsYW5lW2ldLnBvcyA9IEk5MTVfUkVBRChEU1BQT1MoaSkpOwogCQllcnJvci0+cGxhbmVbaV0uYWRkciA9IEk5MTVfUkVBRChEU1BBRERSKGkpKTsKIAkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKIAkJCWVycm9yLT5wbGFuZVtpXS5zdXJmYWNlID0gSTkxNV9SRUFEKERTUFNVUkYoaSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKaW5kZXggNDRmZWY1ZS4uMDliMzE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgImRybV9jcnRjLmgiCkBAIC0zNiw3ICszNyw3IEBACiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKICNpbmNsdWRlICJkcm1fZHBfaGVscGVyLmgiCiAKLQorI2RlZmluZSBEUF9SRUNFSVZFUl9DQVBfU0laRQkweGYKICNkZWZpbmUgRFBfTElOS19TVEFUVVNfU0laRQk2CiAjZGVmaW5lIERQX0xJTktfQ0hFQ0tfVElNRU9VVAkoMTAgKiAxMDAwKQogCkBAIC01MywxMiArNTQsMjEgQEAKIAlpbnQgZHBtc19tb2RlOwogCXVpbnQ4X3QgbGlua19idzsKIAl1aW50OF90IGxhbmVfY291bnQ7Ci0JdWludDhfdCBkcGNkWzhdOworCXVpbnQ4X3QgZHBjZFtEUF9SRUNFSVZFUl9DQVBfU0laRV07CiAJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7CiAJc3RydWN0IGkyY19hbGdvX2RwX2F1eF9kYXRhIGFsZ287CiAJYm9vbCBpc19wY2hfZWRwOwogCXVpbnQ4X3QJdHJhaW5fc2V0WzRdOwogCXVpbnQ4X3QgbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV07CisJaW50IHBhbmVsX3Bvd2VyX3VwX2RlbGF5OworCWludCBwYW5lbF9wb3dlcl9kb3duX2RlbGF5OworCWludCBwYW5lbF9wb3dlcl9jeWNsZV9kZWxheTsKKwlpbnQgYmFja2xpZ2h0X29uX2RlbGF5OworCWludCBiYWNrbGlnaHRfb2ZmX2RlbGF5OworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpwYW5lbF9maXhlZF9tb2RlOyAgLyogZm9yIGVEUCAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgcGFuZWxfdmRkX3dvcms7CisJYm9vbCB3YW50X3BhbmVsX3ZkZDsKKwl1bnNpZ25lZCBsb25nIHBhbmVsX29mZl9qaWZmaWVzOwogfTsKIAogLyoqCkBAIC04Niw2ICs5NiwxNyBAQAogCXJldHVybiBpbnRlbF9kcC0+aXNfcGNoX2VkcDsKIH0KIAorLyoqCisgKiBpc19jcHVfZWRwIC0gaXMgdGhlIHBvcnQgb24gdGhlIENQVSBhbmQgYXR0YWNoZWQgdG8gYW4gZURQIHBhbmVsPworICogQGludGVsX2RwOiBEUCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIERQIHN0cnVjdCBjb3JyZXNwb25kcyB0byBhIENQVSBlRFAgcG9ydC4KKyAqLworc3RhdGljIGJvb2wgaXNfY3B1X2VkcChzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQoreworCXJldHVybiBpc19lZHAoaW50ZWxfZHApICYmICFpc19wY2hfZWRwKGludGVsX2RwKTsKK30KKwogc3RhdGljIHN0cnVjdCBpbnRlbF9kcCAqZW5jX3RvX2ludGVsX2RwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKGVuY29kZXIsIHN0cnVjdCBpbnRlbF9kcCwgYmFzZS5iYXNlKTsKQEAgLTEyMSw3ICsxNDIsNyBAQAogc3RhdGljIHZvaWQgaW50ZWxfZHBfbGlua19kb3duKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApOwogCiB2b2lkCi1pbnRlbF9lZHBfbGlua19jb25maWcgKHN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyLAoraW50ZWxfZWRwX2xpbmtfY29uZmlnKHN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9lbmNvZGVyLAogCQkgICAgICAgaW50ICpsYW5lX251bSwgaW50ICpsaW5rX2J3KQogewogCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBjb250YWluZXJfb2YoaW50ZWxfZW5jb2Rlciwgc3RydWN0IGludGVsX2RwLCBiYXNlKTsKQEAgLTE3NSw5ICsxOTYsMjUgQEAKIAkJcmV0dXJuIDE2MjAwMDsKIH0KIAotLyogSSB0aGluayB0aGlzIGlzIGEgZmljdGlvbiAqLworLyoKKyAqIFRoZSB1bml0cyBvbiB0aGUgbnVtYmVycyBpbiB0aGUgbmV4dCB0d28gYXJlLi4uIGJpemFycmUuICBFeGFtcGxlcyB3aWxsCisgKiBtYWtlIGl0IGNsZWFyZXI7IHRoaXMgb25lIHBhcmFsbGVscyBhbiBleGFtcGxlIGluIHRoZSBlRFAgc3BlYy4KKyAqCisgKiBpbnRlbF9kcF9tYXhfZGF0YV9yYXRlIGZvciBvbmUgbGFuZSBvZiAyLjdHSHogZXZhbHVhdGVzIGFzOgorICoKKyAqICAgICAyNzAwMDAgKiAxICogOCAvIDEwID09IDIxNjAwMAorICoKKyAqIFRoZSBhY3R1YWwgZGF0YSBjYXBhY2l0eSBvZiB0aGF0IGNvbmZpZ3VyYXRpb24gaXMgMi4xNkdiaXQvcywgc28gdGhlCisgKiB1bml0cyBhcmUgZGVjYWtpbG9iaXRzLiAgLT5jbG9jayBpbiBhIGRybV9kaXNwbGF5X21vZGUgaXMgaW4ga2lsb2hlcnR6IC0KKyAqIG9yIGVxdWl2YWxlbnRseSwga2lsb3BpeGVscyBwZXIgc2Vjb25kIC0gc28gZm9yIDE2ODB4MTA1MFIgaXQnZCBiZQorICogMTE5MDAwLiAgQXQgMThicHAgdGhhdCdzIDIxNDIwMDAga2lsb2JpdHMgcGVyIHNlY29uZC4KKyAqCisgKiBUaHVzIHRoZSBzdHJhbmdlLWxvb2tpbmcgZGl2aXNpb24gYnkgMTAgaW4gaW50ZWxfZHBfbGlua19yZXF1aXJlZCwgdG8KKyAqIGdldCB0aGUgcmVzdWx0IGluIGRlY2FraWxvYml0cyBpbnN0ZWFkIG9mIGtpbG9iaXRzLgorICovCisKIHN0YXRpYyBpbnQKLWludGVsX2RwX2xpbmtfcmVxdWlyZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwgaW50IHBpeGVsX2Nsb2NrKQoraW50ZWxfZHBfbGlua19yZXF1aXJlZChzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCBpbnQgcGl4ZWxfY2xvY2spCiB7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5jcnRjOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKQEAgLTE4Niw3ICsyMjMsNyBAQAogCWlmIChpbnRlbF9jcnRjKQogCQlicHAgPSBpbnRlbF9jcnRjLT5icHA7CiAKLQlyZXR1cm4gKHBpeGVsX2Nsb2NrICogYnBwICsgNykgLyA4OworCXJldHVybiAocGl4ZWxfY2xvY2sgKiBicHAgKyA5KSAvIDEwOwogfQogCiBzdGF0aWMgaW50CkBAIC0yMDAsMjQgKzIzNywxOSBAQAogCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCiB7CiAJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGludGVsX2F0dGFjaGVkX2RwKGNvbm5lY3Rvcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IG1heF9saW5rX2Nsb2NrID0gaW50ZWxfZHBfbGlua19jbG9jayhpbnRlbF9kcF9tYXhfbGlua19idyhpbnRlbF9kcCkpOwogCWludCBtYXhfbGFuZXMgPSBpbnRlbF9kcF9tYXhfbGFuZV9jb3VudChpbnRlbF9kcCk7CiAKLQlpZiAoaXNfZWRwKGludGVsX2RwKSAmJiBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSkgewotCQlpZiAobW9kZS0+aGRpc3BsYXkgPiBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkpCisJaWYgKGlzX2VkcChpbnRlbF9kcCkgJiYgaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUpIHsKKwkJaWYgKG1vZGUtPmhkaXNwbGF5ID4gaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5KQogCQkJcmV0dXJuIE1PREVfUEFORUw7CiAKLQkJaWYgKG1vZGUtPnZkaXNwbGF5ID4gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5KQorCQlpZiAobW9kZS0+dmRpc3BsYXkgPiBpbnRlbF9kcC0+cGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkpCiAJCQlyZXR1cm4gTU9ERV9QQU5FTDsKIAl9CiAKLQkvKiBvbmx5IHJlZnVzZSB0aGUgbW9kZSBvbiBub24gZURQIHNpbmNlIHdlIGhhdmUgc2VlbiBzb21lIHdlaXJkIGVEUCBwYW5lbHMKLQkgICB3aGljaCBhcmUgb3V0c2lkZSBzcGVjIHRvbGVyYW5jZXMgYnV0IHNvbWVob3cgd29yayBieSBtYWdpYyAqLwotCWlmICghaXNfZWRwKGludGVsX2RwKSAmJgotCSAgICAoaW50ZWxfZHBfbGlua19yZXF1aXJlZChjb25uZWN0b3ItPmRldiwgaW50ZWxfZHAsIG1vZGUtPmNsb2NrKQotCSAgICAgPiBpbnRlbF9kcF9tYXhfZGF0YV9yYXRlKG1heF9saW5rX2Nsb2NrLCBtYXhfbGFuZXMpKSkKKwlpZiAoaW50ZWxfZHBfbGlua19yZXF1aXJlZChpbnRlbF9kcCwgbW9kZS0+Y2xvY2spCisJICAgID4gaW50ZWxfZHBfbWF4X2RhdGFfcmF0ZShtYXhfbGlua19jbG9jaywgbWF4X2xhbmVzKSkKIAkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKIAogCWlmIChtb2RlLT5jbG9jayA8IDEwMDAwKQpAQCAtMjc5LDYgKzMxMSwzOCBAQAogCX0KIH0KIAorc3RhdGljIGJvb2wgaXJvbmxha2VfZWRwX2hhdmVfcGFuZWxfcG93ZXIoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldHVybiAoSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpICYgUFBfT04pICE9IDA7Cit9CisKK3N0YXRpYyBib29sIGlyb25sYWtlX2VkcF9oYXZlX3BhbmVsX3ZkZChzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kcC0+YmFzZS5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJcmV0dXJuIChJOTE1X1JFQUQoUENIX1BQX0NPTlRST0wpICYgRURQX0ZPUkNFX1ZERCkgIT0gMDsKK30KKworc3RhdGljIHZvaWQKK2ludGVsX2RwX2NoZWNrX2VkcChzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kcC0+YmFzZS5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKCFpc19lZHAoaW50ZWxfZHApKQorCQlyZXR1cm47CisJaWYgKCFpcm9ubGFrZV9lZHBfaGF2ZV9wYW5lbF9wb3dlcihpbnRlbF9kcCkgJiYgIWlyb25sYWtlX2VkcF9oYXZlX3BhbmVsX3ZkZChpbnRlbF9kcCkpIHsKKwkJV0FSTigxLCAiZURQIHBvd2VyZWQgb2ZmIHdoaWxlIGF0dGVtcHRpbmcgYXV4IGNoYW5uZWwgY29tbXVuaWNhdGlvbi5cbiIpOworCQlEUk1fREVCVUdfS01TKCJTdGF0dXMgMHglMDh4IENvbnRyb2wgMHglMDh4XG4iLAorCQkJICAgICAgSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpLAorCQkJICAgICAgSTkxNV9SRUFEKFBDSF9QUF9DT05UUk9MKSk7CisJfQorfQorCiBzdGF0aWMgaW50CiBpbnRlbF9kcF9hdXhfY2goc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwKIAkJdWludDhfdCAqc2VuZCwgaW50IHNlbmRfYnl0ZXMsCkBAIC0yOTUsNiArMzU5LDcgQEAKIAl1aW50MzJfdCBhdXhfY2xvY2tfZGl2aWRlcjsKIAlpbnQgdHJ5LCBwcmVjaGFyZ2U7CiAKKwlpbnRlbF9kcF9jaGVja19lZHAoaW50ZWxfZHApOwogCS8qIFRoZSBjbG9jayBkaXZpZGVyIGlzIGJhc2VkIG9mZiB0aGUgaHJhd2NsaywKIAkgKiBhbmQgd291bGQgbGlrZSB0byBydW4gYXQgMk1Iei4gU28sIHRha2UgdGhlCiAJICogaHJhd2NsayB2YWx1ZSBhbmQgZGl2aWRlIGJ5IDIgYW5kIHVzZSB0aGF0CkBAIC0zMDIsNyArMzY3LDcgQEAKIAkgKiBOb3RlIHRoYXQgUENIIGF0dGFjaGVkIGVEUCBwYW5lbHMgc2hvdWxkIHVzZSBhIDEyNU1IeiBpbnB1dAogCSAqIGNsb2NrIGRpdmlkZXIuCiAJICovCi0JaWYgKGlzX2VkcChpbnRlbF9kcCkgJiYgIWlzX3BjaF9lZHAoaW50ZWxfZHApKSB7CisJaWYgKGlzX2NwdV9lZHAoaW50ZWxfZHApKSB7CiAJCWlmIChJU19HRU42KGRldikpCiAJCQlhdXhfY2xvY2tfZGl2aWRlciA9IDIwMDsgLyogU05CIGVEUCBpbnB1dCBjbG9jayBhdCA0MDBNaHogKi8KIAkJZWxzZQpAQCAtMzM3LDcgKzQwMiw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBzZW5kX2J5dGVzOyBpICs9IDQpCiAJCQlJOTE1X1dSSVRFKGNoX2RhdGEgKyBpLAogCQkJCSAgIHBhY2tfYXV4KHNlbmQgKyBpLCBzZW5kX2J5dGVzIC0gaSkpOwotCQorCiAJCS8qIFNlbmQgdGhlIGNvbW1hbmQgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCiAJCUk5MTVfV1JJVEUoY2hfY3RsLAogCQkJICAgRFBfQVVYX0NIX0NUTF9TRU5EX0JVU1kgfApAQCAtMzU0LDcgKzQxOSw3IEBACiAJCQkJYnJlYWs7CiAJCQl1ZGVsYXkoMTAwKTsKIAkJfQotCQorCiAJCS8qIENsZWFyIGRvbmUgc3RhdHVzIGFuZCBhbnkgZXJyb3JzICovCiAJCUk5MTVfV1JJVEUoY2hfY3RsLAogCQkJICAgc3RhdHVzIHwKQEAgLTM5MCw3ICs0NTUsNyBAQAogCQkgICAgICBEUF9BVVhfQ0hfQ1RMX01FU1NBR0VfU0laRV9TSElGVCk7CiAJaWYgKHJlY3ZfYnl0ZXMgPiByZWN2X3NpemUpCiAJCXJlY3ZfYnl0ZXMgPSByZWN2X3NpemU7Ci0JCisKIAlmb3IgKGkgPSAwOyBpIDwgcmVjdl9ieXRlczsgaSArPSA0KQogCQl1bnBhY2tfYXV4KEk5MTVfUkVBRChjaF9kYXRhICsgaSksCiAJCQkgICByZWN2ICsgaSwgcmVjdl9ieXRlcyAtIGkpOwpAQCAtNDA4LDYgKzQ3Myw3IEBACiAJaW50IG1zZ19ieXRlczsKIAl1aW50OF90CWFjazsKIAorCWludGVsX2RwX2NoZWNrX2VkcChpbnRlbF9kcCk7CiAJaWYgKHNlbmRfYnl0ZXMgPiAxNikKIAkJcmV0dXJuIC0xOwogCW1zZ1swXSA9IEFVWF9OQVRJVkVfV1JJVEUgPDwgNDsKQEAgLTQ1MCw2ICs1MTYsNyBAQAogCXVpbnQ4X3QgYWNrOwogCWludCByZXQ7CiAKKwlpbnRlbF9kcF9jaGVja19lZHAoaW50ZWxfZHApOwogCW1zZ1swXSA9IEFVWF9OQVRJVkVfUkVBRCA8PCA0OwogCW1zZ1sxXSA9IGFkZHJlc3MgPj4gODsKIAltc2dbMl0gPSBhZGRyZXNzICYgMHhmZjsKQEAgLTQ5Myw2ICs1NjAsNyBAQAogCWludCByZXBseV9ieXRlczsKIAlpbnQgcmV0OwogCisJaW50ZWxfZHBfY2hlY2tfZWRwKGludGVsX2RwKTsKIAkvKiBTZXQgdXAgdGhlIGNvbW1hbmQgYnl0ZSAqLwogCWlmIChtb2RlICYgTU9ERV9JMkNfUkVBRCkKIAkJbXNnWzBdID0gQVVYX0kyQ19SRUFEIDw8IDQ7CkBAIC01NzMsMjQgKzY0MSwzMiBAQAogCXJldHVybiAtRVJFTU9URUlPOwogfQogCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApOworc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vZmYoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwgYm9vbCBzeW5jKTsKKwogc3RhdGljIGludAogaW50ZWxfZHBfaTJjX2luaXQoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwKIAkJICBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3IsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CisJaW50CXJldDsKKwogCURSTV9ERUJVR19LTVMoImkyY19pbml0ICVzXG4iLCBuYW1lKTsKIAlpbnRlbF9kcC0+YWxnby5ydW5uaW5nID0gZmFsc2U7CiAJaW50ZWxfZHAtPmFsZ28uYWRkcmVzcyA9IDA7CiAJaW50ZWxfZHAtPmFsZ28uYXV4X2NoID0gaW50ZWxfZHBfaTJjX2F1eF9jaDsKIAotCW1lbXNldCgmaW50ZWxfZHAtPmFkYXB0ZXIsICdcMCcsIHNpemVvZiAoaW50ZWxfZHAtPmFkYXB0ZXIpKTsKKwltZW1zZXQoJmludGVsX2RwLT5hZGFwdGVyLCAnXDAnLCBzaXplb2YoaW50ZWxfZHAtPmFkYXB0ZXIpKTsKIAlpbnRlbF9kcC0+YWRhcHRlci5vd25lciA9IFRISVNfTU9EVUxFOwogCWludGVsX2RwLT5hZGFwdGVyLmNsYXNzID0gSTJDX0NMQVNTX0REQzsKLQlzdHJuY3B5IChpbnRlbF9kcC0+YWRhcHRlci5uYW1lLCBuYW1lLCBzaXplb2YoaW50ZWxfZHAtPmFkYXB0ZXIubmFtZSkgLSAxKTsKKwlzdHJuY3B5KGludGVsX2RwLT5hZGFwdGVyLm5hbWUsIG5hbWUsIHNpemVvZihpbnRlbF9kcC0+YWRhcHRlci5uYW1lKSAtIDEpOwogCWludGVsX2RwLT5hZGFwdGVyLm5hbWVbc2l6ZW9mKGludGVsX2RwLT5hZGFwdGVyLm5hbWUpIC0gMV0gPSAnXDAnOwogCWludGVsX2RwLT5hZGFwdGVyLmFsZ29fZGF0YSA9ICZpbnRlbF9kcC0+YWxnbzsKIAlpbnRlbF9kcC0+YWRhcHRlci5kZXYucGFyZW50ID0gJmludGVsX2Nvbm5lY3Rvci0+YmFzZS5rZGV2OwogCi0JcmV0dXJuIGkyY19kcF9hdXhfYWRkX2J1cygmaW50ZWxfZHAtPmFkYXB0ZXIpOworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOworCXJldCA9IGkyY19kcF9hdXhfYWRkX2J1cygmaW50ZWxfZHAtPmFkYXB0ZXIpOworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwLCBmYWxzZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGJvb2wKQEAgLTU5OCwyOSArNjc0LDI4IEBACiAJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGVuY190b19pbnRlbF9kcChlbmNvZGVyKTsKIAlpbnQgbGFuZV9jb3VudCwgY2xvY2s7CiAJaW50IG1heF9sYW5lX2NvdW50ID0gaW50ZWxfZHBfbWF4X2xhbmVfY291bnQoaW50ZWxfZHApOwogCWludCBtYXhfY2xvY2sgPSBpbnRlbF9kcF9tYXhfbGlua19idyhpbnRlbF9kcCkgPT0gRFBfTElOS19CV18yXzcgPyAxIDogMDsKIAlzdGF0aWMgaW50IGJ3c1syXSA9IHsgRFBfTElOS19CV18xXzYyLCBEUF9MSU5LX0JXXzJfNyB9OwogCi0JaWYgKGlzX2VkcChpbnRlbF9kcCkgJiYgZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUpIHsKLQkJaW50ZWxfZml4ZWRfcGFuZWxfbW9kZShkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSwgYWRqdXN0ZWRfbW9kZSk7CisJaWYgKGlzX2VkcChpbnRlbF9kcCkgJiYgaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUpIHsKKwkJaW50ZWxfZml4ZWRfcGFuZWxfbW9kZShpbnRlbF9kcC0+cGFuZWxfZml4ZWRfbW9kZSwgYWRqdXN0ZWRfbW9kZSk7CiAJCWludGVsX3BjaF9wYW5lbF9maXR0aW5nKGRldiwgRFJNX01PREVfU0NBTEVfRlVMTFNDUkVFTiwKIAkJCQkJbW9kZSwgYWRqdXN0ZWRfbW9kZSk7CiAJCS8qCiAJCSAqIHRoZSBtb2RlLT5jbG9jayBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgRGF0YSZMaW5rIE0vTgogCQkgKiBvZiB0aGUgcGlwZS4gRm9yIHRoZSBlRFAgdGhlIGZpeGVkIGNsb2NrIHNob3VsZCBiZSB1c2VkLgogCQkgKi8KLQkJbW9kZS0+Y2xvY2sgPSBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2s7CisJCW1vZGUtPmNsb2NrID0gaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUtPmNsb2NrOwogCX0KIAogCWZvciAobGFuZV9jb3VudCA9IDE7IGxhbmVfY291bnQgPD0gbWF4X2xhbmVfY291bnQ7IGxhbmVfY291bnQgPDw9IDEpIHsKIAkJZm9yIChjbG9jayA9IDA7IGNsb2NrIDw9IG1heF9jbG9jazsgY2xvY2srKykgewogCQkJaW50IGxpbmtfYXZhaWwgPSBpbnRlbF9kcF9tYXhfZGF0YV9yYXRlKGludGVsX2RwX2xpbmtfY2xvY2soYndzW2Nsb2NrXSksIGxhbmVfY291bnQpOwogCi0JCQlpZiAoaW50ZWxfZHBfbGlua19yZXF1aXJlZChlbmNvZGVyLT5kZXYsIGludGVsX2RwLCBtb2RlLT5jbG9jaykKKwkJCWlmIChpbnRlbF9kcF9saW5rX3JlcXVpcmVkKGludGVsX2RwLCBtb2RlLT5jbG9jaykKIAkJCQkJPD0gbGlua19hdmFpbCkgewogCQkJCWludGVsX2RwLT5saW5rX2J3ID0gYndzW2Nsb2NrXTsKIAkJCQlpbnRlbF9kcC0+bGFuZV9jb3VudCA9IGxhbmVfY291bnQ7CkBAIC02MzQsMTkgKzcwOSw2IEBACiAJCX0KIAl9CiAKLQlpZiAoaXNfZWRwKGludGVsX2RwKSkgewotCQkvKiBva2F5IHdlIGZhaWxlZCBqdXN0IHBpY2sgdGhlIGhpZ2hlc3QgKi8KLQkJaW50ZWxfZHAtPmxhbmVfY291bnQgPSBtYXhfbGFuZV9jb3VudDsKLQkJaW50ZWxfZHAtPmxpbmtfYncgPSBid3NbbWF4X2Nsb2NrXTsKLQkJYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgPSBpbnRlbF9kcF9saW5rX2Nsb2NrKGludGVsX2RwLT5saW5rX2J3KTsKLQkJRFJNX0RFQlVHX0tNUygiRm9yY2UgcGlja2luZyBkaXNwbGF5IHBvcnQgbGluayBidyAlMDJ4IGxhbmUgIgotCQkJICAgICAgImNvdW50ICVkIGNsb2NrICVkXG4iLAotCQkJICAgICAgaW50ZWxfZHAtPmxpbmtfYncsIGludGVsX2RwLT5sYW5lX2NvdW50LAotCQkJICAgICAgYWRqdXN0ZWRfbW9kZS0+Y2xvY2spOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQogCXJldHVybiBmYWxzZTsKIH0KIApAQCAtNzQwLDYgKzgwMiw5IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfcGxsX29uKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfcGxsX29mZihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworCiBzdGF0aWMgdm9pZAogaW50ZWxfZHBfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKQEAgLTc0OSw2ICs4MTQsMTQgQEAKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBpbnRlbF9kcC0+YmFzZS5iYXNlLmNydGM7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCisJLyogVHVybiBvbiB0aGUgZURQIFBMTCBpZiBuZWVkZWQgKi8KKwlpZiAoaXNfZWRwKGludGVsX2RwKSkgeworCQlpZiAoIWlzX3BjaF9lZHAoaW50ZWxfZHApKQorCQkJaXJvbmxha2VfZWRwX3BsbF9vbihlbmNvZGVyKTsKKwkJZWxzZQorCQkJaXJvbmxha2VfZWRwX3BsbF9vZmYoZW5jb2Rlcik7CisJfQorCiAJaW50ZWxfZHAtPkRQID0gRFBfVk9MVEFHRV8wXzQgfCBEUF9QUkVfRU1QSEFTSVNfMDsKIAlpbnRlbF9kcC0+RFAgfD0gaW50ZWxfZHAtPmNvbG9yX3JhbmdlOwogCkBAIC03NTcsNyArODMwLDcgQEAKIAlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BWU1lOQykKIAkJaW50ZWxfZHAtPkRQIHw9IERQX1NZTkNfVlNfSElHSDsKIAotCWlmIChIQVNfUENIX0NQVChkZXYpICYmICFpc19lZHAoaW50ZWxfZHApKQorCWlmIChIQVNfUENIX0NQVChkZXYpICYmICFpc19jcHVfZWRwKGludGVsX2RwKSkKIAkJaW50ZWxfZHAtPkRQIHw9IERQX0xJTktfVFJBSU5fT0ZGX0NQVDsKIAllbHNlCiAJCWludGVsX2RwLT5EUCB8PSBEUF9MSU5LX1RSQUlOX09GRjsKQEAgLTc3Myw4ICs4NDYsMTIgQEAKIAkJaW50ZWxfZHAtPkRQIHw9IERQX1BPUlRfV0lEVEhfNDsKIAkJYnJlYWs7CiAJfQotCWlmIChpbnRlbF9kcC0+aGFzX2F1ZGlvKQorCWlmIChpbnRlbF9kcC0+aGFzX2F1ZGlvKSB7CisJCURSTV9ERUJVR19EUklWRVIoIkVuYWJsaW5nIERQIGF1ZGlvIG9uIHBpcGUgJWNcbiIsCisJCQkJIHBpcGVfbmFtZShpbnRlbF9jcnRjLT5waXBlKSk7CiAJCWludGVsX2RwLT5EUCB8PSBEUF9BVURJT19PVVRQVVRfRU5BQkxFOworCQlpbnRlbF93cml0ZV9lbGQoZW5jb2RlciwgYWRqdXN0ZWRfbW9kZSk7CisJfQogCiAJbWVtc2V0KGludGVsX2RwLT5saW5rX2NvbmZpZ3VyYXRpb24sIDAsIERQX0xJTktfQ09ORklHVVJBVElPTl9TSVpFKTsKIAlpbnRlbF9kcC0+bGlua19jb25maWd1cmF0aW9uWzBdID0gaW50ZWxfZHAtPmxpbmtfYnc7CkBAIC03OTQsNyArODcxLDcgQEAKIAlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAxICYmICFIQVNfUENIX0NQVChkZXYpKQogCQlpbnRlbF9kcC0+RFAgfD0gRFBfUElQRUJfU0VMRUNUOwogCi0JaWYgKGlzX2VkcChpbnRlbF9kcCkgJiYgIWlzX3BjaF9lZHAoaW50ZWxfZHApKSB7CisJaWYgKGlzX2NwdV9lZHAoaW50ZWxfZHApKSB7CiAJCS8qIGRvbid0IG1pc3Mgb3V0IHJlcXVpcmVkIHNldHRpbmcgZm9yIGVEUCAqLwogCQlpbnRlbF9kcC0+RFAgfD0gRFBfUExMX0VOQUJMRTsKIAkJaWYgKGFkanVzdGVkX21vZGUtPmNsb2NrIDwgMjAwMDAwKQpAQCAtODA0LDU4ICs4ODEsMTUwIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBpcm9ubGFrZV93YWl0X3BhbmVsX29mZihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQoreworCXVuc2lnbmVkIGxvbmcJb2ZmX3RpbWU7CisJdW5zaWduZWQgbG9uZwlkZWxheTsKKworCURSTV9ERUJVR19LTVMoIldhaXQgZm9yIHBhbmVsIHBvd2VyIG9mZiB0aW1lXG4iKTsKKworCWlmIChpcm9ubGFrZV9lZHBfaGF2ZV9wYW5lbF9wb3dlcihpbnRlbF9kcCkgfHwKKwkgICAgaXJvbmxha2VfZWRwX2hhdmVfcGFuZWxfdmRkKGludGVsX2RwKSkKKwl7CisJCURSTV9ERUJVR19LTVMoIlBhbmVsIHN0aWxsIG9uLCBubyBkZWxheSBuZWVkZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJb2ZmX3RpbWUgPSBpbnRlbF9kcC0+cGFuZWxfb2ZmX2ppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGludGVsX2RwLT5wYW5lbF9wb3dlcl9kb3duX2RlbGF5KTsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBvZmZfdGltZSkpIHsKKwkJRFJNX0RFQlVHX0tNUygiVGltZSBhbHJlYWR5IHBhc3NlZCIpOworCQlyZXR1cm47CisJfQorCWRlbGF5ID0gamlmZmllc190b19tc2VjcyhvZmZfdGltZSAtIGppZmZpZXMpOworCWlmIChkZWxheSA+IGludGVsX2RwLT5wYW5lbF9wb3dlcl9kb3duX2RlbGF5KQorCQlkZWxheSA9IGludGVsX2RwLT5wYW5lbF9wb3dlcl9kb3duX2RlbGF5OworCURSTV9ERUJVR19LTVMoIldhaXRpbmcgYW4gYWRkaXRpb25hbCAlbGQgbXNcbiIsIGRlbGF5KTsKKwltc2xlZXAoZGVsYXkpOworfQorCiBzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwLT5iYXNlLmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHBwOwogCi0JLyoKLQkgKiBJZiB0aGUgcGFuZWwgd2Fzbid0IG9uLCBtYWtlIHN1cmUgdGhlcmUncyBub3QgYSBjdXJyZW50bHkKLQkgKiBhY3RpdmUgUFAgc2VxdWVuY2UgYmVmb3JlIGVuYWJsaW5nIEFVWCBWREQuCi0JICovCi0JaWYgKCEoSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpICYgUFBfT04pKQotCQltc2xlZXAoZGV2X3ByaXYtPnBhbmVsX3QzKTsKKwlpZiAoIWlzX2VkcChpbnRlbF9kcCkpCisJCXJldHVybjsKKwlEUk1fREVCVUdfS01TKCJUdXJuIGVEUCBWREQgb25cbiIpOwogCisJV0FSTihpbnRlbF9kcC0+d2FudF9wYW5lbF92ZGQsCisJICAgICAiZURQIFZERCBhbHJlYWR5IHJlcXVlc3RlZCBvblxuIik7CisKKwlpbnRlbF9kcC0+d2FudF9wYW5lbF92ZGQgPSB0cnVlOworCWlmIChpcm9ubGFrZV9lZHBfaGF2ZV9wYW5lbF92ZGQoaW50ZWxfZHApKSB7CisJCURSTV9ERUJVR19LTVMoImVEUCBWREQgYWxyZWFkeSBvblxuIik7CisJCXJldHVybjsKKwl9CisKKwlpcm9ubGFrZV93YWl0X3BhbmVsX29mZihpbnRlbF9kcCk7CiAJcHAgPSBJOTE1X1JFQUQoUENIX1BQX0NPTlRST0wpOworCXBwICY9IH5QQU5FTF9VTkxPQ0tfTUFTSzsKKwlwcCB8PSBQQU5FTF9VTkxPQ0tfUkVHUzsKIAlwcCB8PSBFRFBfRk9SQ0VfVkREOwogCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKIAlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOworCURSTV9ERUJVR19LTVMoIlBDSF9QUF9TVEFUVVM6IDB4JTA4eCBQQ0hfUFBfQ09OVFJPTDogMHglMDh4XG4iLAorCQkgICAgICBJOTE1X1JFQUQoUENIX1BQX1NUQVRVUyksIEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFuZWwgd2Fzbid0IG9uLCBkZWxheSBiZWZvcmUgYWNjZXNzaW5nIGF1eCBjaGFubmVsCisJICovCisJaWYgKCFpcm9ubGFrZV9lZHBfaGF2ZV9wYW5lbF9wb3dlcihpbnRlbF9kcCkpIHsKKwkJRFJNX0RFQlVHX0tNUygiZURQIHdhcyBub3QgcnVubmluZ1xuIik7CisJCW1zbGVlcChpbnRlbF9kcC0+cGFuZWxfcG93ZXJfdXBfZGVsYXkpOworCX0KIH0KIAotc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vZmYoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKK3N0YXRpYyB2b2lkIGlyb25sYWtlX3BhbmVsX3ZkZF9vZmZfc3luYyhzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kcC0+YmFzZS5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBwcDsKIAotCXBwID0gSTkxNV9SRUFEKFBDSF9QUF9DT05UUk9MKTsKLQlwcCAmPSB+RURQX0ZPUkNFX1ZERDsKLQlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7Ci0JUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwlpZiAoIWludGVsX2RwLT53YW50X3BhbmVsX3ZkZCAmJiBpcm9ubGFrZV9lZHBfaGF2ZV9wYW5lbF92ZGQoaW50ZWxfZHApKSB7CisJCXBwID0gSTkxNV9SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwkJcHAgJj0gflBBTkVMX1VOTE9DS19NQVNLOworCQlwcCB8PSBQQU5FTF9VTkxPQ0tfUkVHUzsKKwkJcHAgJj0gfkVEUF9GT1JDRV9WREQ7CisJCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKKwkJUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKIAotCS8qIE1ha2Ugc3VyZSBzZXF1ZW5jZXIgaXMgaWRsZSBiZWZvcmUgYWxsb3dpbmcgc3Vic2VxdWVudCBhY3Rpdml0eSAqLwotCW1zbGVlcChkZXZfcHJpdi0+cGFuZWxfdDEyKTsKKwkJLyogTWFrZSBzdXJlIHNlcXVlbmNlciBpcyBpZGxlIGJlZm9yZSBhbGxvd2luZyBzdWJzZXF1ZW50IGFjdGl2aXR5ICovCisJCURSTV9ERUJVR19LTVMoIlBDSF9QUF9TVEFUVVM6IDB4JTA4eCBQQ0hfUFBfQ09OVFJPTDogMHglMDh4XG4iLAorCQkJICAgICAgSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpLCBJOTE1X1JFQUQoUENIX1BQX0NPTlRST0wpKTsKKwkJaW50ZWxfZHAtPnBhbmVsX29mZl9qaWZmaWVzID0gamlmZmllczsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlyb25sYWtlX3BhbmVsX3ZkZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqX193b3JrKQoreworCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKF9fd29yayksCisJCQkJCQkgc3RydWN0IGludGVsX2RwLCBwYW5lbF92ZGRfd29yayk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwLT5iYXNlLmJhc2UuZGV2OworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWlyb25sYWtlX3BhbmVsX3ZkZF9vZmZfc3luYyhpbnRlbF9kcCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsIGJvb2wgc3luYykKK3sKKwlpZiAoIWlzX2VkcChpbnRlbF9kcCkpCisJCXJldHVybjsKKworCURSTV9ERUJVR19LTVMoIlR1cm4gZURQIFZERCBvZmYgJWRcbiIsIGludGVsX2RwLT53YW50X3BhbmVsX3ZkZCk7CisJV0FSTighaW50ZWxfZHAtPndhbnRfcGFuZWxfdmRkLCAiZURQIFZERCBub3QgZm9yY2VkIG9uIik7CisJCisJaW50ZWxfZHAtPndhbnRfcGFuZWxfdmRkID0gZmFsc2U7CisKKwlpZiAoc3luYykgeworCQlpcm9ubGFrZV9wYW5lbF92ZGRfb2ZmX3N5bmMoaW50ZWxfZHApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFF1ZXVlIHRoZSB0aW1lciB0byBmaXJlIGEgbG9uZworCQkgKiB0aW1lIGZyb20gbm93IChyZWxhdGl2ZSB0byB0aGUgcG93ZXIgZG93biBkZWxheSkKKwkJICogdG8ga2VlcCB0aGUgcGFuZWwgcG93ZXIgdXAgYWNyb3NzIGEgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucworCQkgKi8KKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpbnRlbF9kcC0+cGFuZWxfdmRkX3dvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhpbnRlbF9kcC0+cGFuZWxfcG93ZXJfY3ljbGVfZGVsYXkgKiA1KSk7CisJfQogfQogCiAvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhbmVsIHdhcyBhbHJlYWR5IG9uIHdoZW4gY2FsbGVkICovCi1zdGF0aWMgYm9vbCBpcm9ubGFrZV9lZHBfcGFuZWxfb24gKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfcGFuZWxfb24oc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcHAsIGlkbGVfb25fbWFzayA9IFBQX09OIHwgUFBfU0VRVUVOQ0VfU1RBVEVfT05fSURMRTsKIAotCWlmIChJOTE1X1JFQUQoUENIX1BQX1NUQVRVUykgJiBQUF9PTikKLQkJcmV0dXJuIHRydWU7CisJaWYgKCFpc19lZHAoaW50ZWxfZHApKQorCQlyZXR1cm47CisJaWYgKGlyb25sYWtlX2VkcF9oYXZlX3BhbmVsX3Bvd2VyKGludGVsX2RwKSkKKwkJcmV0dXJuOwogCisJaXJvbmxha2Vfd2FpdF9wYW5lbF9vZmYoaW50ZWxfZHApOwogCXBwID0gSTkxNV9SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwlwcCAmPSB+UEFORUxfVU5MT0NLX01BU0s7CisJcHAgfD0gUEFORUxfVU5MT0NLX1JFR1M7CiAKLQkvKiBJTEsgd29ya2Fyb3VuZDogZGlzYWJsZSByZXNldCBhcm91bmQgcG93ZXIgc2VxdWVuY2UgKi8KLQlwcCAmPSB+UEFORUxfUE9XRVJfUkVTRVQ7Ci0JSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOwotCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJaWYgKElTX0dFTjUoZGV2KSkgeworCQkvKiBJTEsgd29ya2Fyb3VuZDogZGlzYWJsZSByZXNldCBhcm91bmQgcG93ZXIgc2VxdWVuY2UgKi8KKwkJcHAgJj0gflBBTkVMX1BPV0VSX1JFU0VUOworCQlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7CisJCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJfQogCi0JcHAgfD0gUEFORUxfVU5MT0NLX1JFR1MgfCBQT1dFUl9UQVJHRVRfT047CisJcHAgfD0gUE9XRVJfVEFSR0VUX09OOwogCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKIAlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOwogCkBAIC04NjQsNDQgKzEwMzMsNjQgQEAKIAkJRFJNX0VSUk9SKCJwYW5lbCBvbiB3YWl0IHRpbWVkIG91dDogMHglMDh4XG4iLAogCQkJICBJOTE1X1JFQUQoUENIX1BQX1NUQVRVUykpOwogCi0JcHAgfD0gUEFORUxfUE9XRVJfUkVTRVQ7IC8qIHJlc3RvcmUgcGFuZWwgcmVzZXQgYml0ICovCi0JSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOwotCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7Ci0KLQlyZXR1cm4gZmFsc2U7CisJaWYgKElTX0dFTjUoZGV2KSkgeworCQlwcCB8PSBQQU5FTF9QT1dFUl9SRVNFVDsgLyogcmVzdG9yZSBwYW5lbCByZXNldCBiaXQgKi8KKwkJSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOworCQlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOworCX0KIH0KIAotc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX3BhbmVsX29mZiAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2VkcF9wYW5lbF9vZmYoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogeworCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9faW50ZWxfZHAoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBwcCwgaWRsZV9vZmZfbWFzayA9IFBQX09OIHwgUFBfU0VRVUVOQ0VfTUFTSyB8CiAJCVBQX0NZQ0xFX0RFTEFZX0FDVElWRSB8IFBQX1NFUVVFTkNFX1NUQVRFX01BU0s7CiAKKwlpZiAoIWlzX2VkcChpbnRlbF9kcCkpCisJCXJldHVybjsKIAlwcCA9IEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJcHAgJj0gflBBTkVMX1VOTE9DS19NQVNLOworCXBwIHw9IFBBTkVMX1VOTE9DS19SRUdTOwogCi0JLyogSUxLIHdvcmthcm91bmQ6IGRpc2FibGUgcmVzZXQgYXJvdW5kIHBvd2VyIHNlcXVlbmNlICovCi0JcHAgJj0gflBBTkVMX1BPV0VSX1JFU0VUOwotCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKLQlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOworCWlmIChJU19HRU41KGRldikpIHsKKwkJLyogSUxLIHdvcmthcm91bmQ6IGRpc2FibGUgcmVzZXQgYXJvdW5kIHBvd2VyIHNlcXVlbmNlICovCisJCXBwICY9IH5QQU5FTF9QT1dFUl9SRVNFVDsKKwkJSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOworCQlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOworCX0KIAotCXBwICY9IH5QT1dFUl9UQVJHRVRfT047Ci0JSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOwotCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJaW50ZWxfZHAtPnBhbmVsX29mZl9qaWZmaWVzID0gamlmZmllczsKIAotCWlmICh3YWl0X2ZvcigoSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpICYgaWRsZV9vZmZfbWFzaykgPT0gMCwgNTAwMCkpCi0JCURSTV9FUlJPUigicGFuZWwgb2ZmIHdhaXQgdGltZWQgb3V0OiAweCUwOHhcbiIsCi0JCQkgIEk5MTVfUkVBRChQQ0hfUFBfU1RBVFVTKSk7CisJaWYgKElTX0dFTjUoZGV2KSkgeworCQlwcCAmPSB+UE9XRVJfVEFSR0VUX09OOworCQlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7CisJCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJCXBwICY9IH5QT1dFUl9UQVJHRVRfT047CisJCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKKwkJUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwkJbXNsZWVwKGludGVsX2RwLT5wYW5lbF9wb3dlcl9jeWNsZV9kZWxheSk7CiAKLQlwcCB8PSBQQU5FTF9QT1dFUl9SRVNFVDsgLyogcmVzdG9yZSBwYW5lbCByZXNldCBiaXQgKi8KLQlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7Ci0JUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwkJaWYgKHdhaXRfZm9yKChJOTE1X1JFQUQoUENIX1BQX1NUQVRVUykgJiBpZGxlX29mZl9tYXNrKSA9PSAwLCA1MDAwKSkKKwkJCURSTV9FUlJPUigicGFuZWwgb2ZmIHdhaXQgdGltZWQgb3V0OiAweCUwOHhcbiIsCisJCQkJICBJOTE1X1JFQUQoUENIX1BQX1NUQVRVUykpOworCisJCXBwIHw9IFBBTkVMX1BPV0VSX1JFU0VUOyAvKiByZXN0b3JlIHBhbmVsIHJlc2V0IGJpdCAqLworCQlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7CisJCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJfQogfQogCi1zdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vbihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kcC0+YmFzZS5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBwcDsKIAorCWlmICghaXNfZWRwKGludGVsX2RwKSkKKwkJcmV0dXJuOworCiAJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAkvKgogCSAqIElmIHdlIGVuYWJsZSB0aGUgYmFja2xpZ2h0IHJpZ2h0IGF3YXkgZm9sbG93aW5nIGEgcGFuZWwgcG93ZXIKQEAgLTkwOSwyMSArMTA5OCwzMiBAQAogCSAqIGxpbmsuICBTbyBkZWxheSBhIGJpdCB0byBtYWtlIHN1cmUgdGhlIGltYWdlIGlzIHNvbGlkIGJlZm9yZQogCSAqIGFsbG93aW5nIGl0IHRvIGFwcGVhci4KIAkgKi8KLQltc2xlZXAoMzAwKTsKKwltc2xlZXAoaW50ZWxfZHAtPmJhY2tsaWdodF9vbl9kZWxheSk7CiAJcHAgPSBJOTE1X1JFQUQoUENIX1BQX0NPTlRST0wpOworCXBwICY9IH5QQU5FTF9VTkxPQ0tfTUFTSzsKKwlwcCB8PSBQQU5FTF9VTkxPQ0tfUkVHUzsKIAlwcCB8PSBFRFBfQkxDX0VOQUJMRTsKIAlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7CisJUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKIH0KIAotc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vZmYgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29mZihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kcC0+YmFzZS5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBwcDsKIAorCWlmICghaXNfZWRwKGludGVsX2RwKSkKKwkJcmV0dXJuOworCiAJRFJNX0RFQlVHX0tNUygiXG4iKTsKIAlwcCA9IEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJcHAgJj0gflBBTkVMX1VOTE9DS19NQVNLOworCXBwIHw9IFBBTkVMX1VOTE9DS19SRUdTOwogCXBwICY9IH5FRFBfQkxDX0VOQUJMRTsKIAlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7CisJUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwltc2xlZXAoaW50ZWxfZHAtPmJhY2tsaWdodF9vZmZfZGVsYXkpOwogfQogCiBzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfcGxsX29uKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTk4Niw0MyArMTE4NiwzOSBAQAogc3RhdGljIHZvaWQgaW50ZWxfZHBfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGVuY190b19pbnRlbF9kcChlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCiAJLyogV2FrZSB1cCB0aGUgc2luayBmaXJzdCAqLworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOwogCWludGVsX2RwX3NpbmtfZHBtcyhpbnRlbF9kcCwgRFJNX01PREVfRFBNU19PTik7CisJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vZmYoaW50ZWxfZHAsIGZhbHNlKTsKIAotCWlmIChpc19lZHAoaW50ZWxfZHApKSB7Ci0JCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb2ZmKGRldik7Ci0JCWlyb25sYWtlX2VkcF9wYW5lbF9vZmYoZGV2KTsKLQkJaWYgKCFpc19wY2hfZWRwKGludGVsX2RwKSkKLQkJCWlyb25sYWtlX2VkcF9wbGxfb24oZW5jb2Rlcik7Ci0JCWVsc2UKLQkJCWlyb25sYWtlX2VkcF9wbGxfb2ZmKGVuY29kZXIpOwotCX0KKwkvKiBNYWtlIHN1cmUgdGhlIHBhbmVsIGlzIG9mZiBiZWZvcmUgdHJ5aW5nIHRvCisJICogY2hhbmdlIHRoZSBtb2RlCisJICovCisJaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vZmYoaW50ZWxfZHApOwogCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9kcCk7CisJaXJvbmxha2VfZWRwX3BhbmVsX29mZihlbmNvZGVyKTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfZHBfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gZW5jX3RvX2ludGVsX2RwKGVuY29kZXIpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGludGVsX2RwLT5iYXNlLmJhc2UuY3J0Yyk7CiAKLQlpZiAoaXNfZWRwKGludGVsX2RwKSkKLQkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihpbnRlbF9kcCk7Ci0KKwlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKGludGVsX2RwKTsKKwlpbnRlbF9kcF9zaW5rX2RwbXMoaW50ZWxfZHAsIERSTV9NT0RFX0RQTVNfT04pOwogCWludGVsX2RwX3N0YXJ0X2xpbmtfdHJhaW4oaW50ZWxfZHApOwotCi0JaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKLQkJaXJvbmxha2VfZWRwX3BhbmVsX29uKGludGVsX2RwKTsKLQkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vZmYoaW50ZWxfZHApOwotCX0KKwlpcm9ubGFrZV9lZHBfcGFuZWxfb24oaW50ZWxfZHApOworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwLCB0cnVlKTsKIAogCWludGVsX2RwX2NvbXBsZXRlX2xpbmtfdHJhaW4oaW50ZWxfZHApOwotCi0JaWYgKGlzX2VkcChpbnRlbF9kcCkpCi0JCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb24oZGV2KTsKKwlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uKGludGVsX2RwKTsKIAogCWludGVsX2RwLT5kcG1zX21vZGUgPSBEUk1fTU9ERV9EUE1TX09OOworCisJaWYgKEhBU19QQ0hfQ1BUKGRldikpCisJCWludGVsX2NwdF92ZXJpZnlfbW9kZXNldChkZXYsIGludGVsX2NydGMtPnBpcGUpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTAzNCwyOCArMTIzMCwyNyBAQAogCXVpbnQzMl90IGRwX3JlZyA9IEk5MTVfUkVBRChpbnRlbF9kcC0+b3V0cHV0X3JlZyk7CiAKIAlpZiAobW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKSB7CisJCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOwogCQlpZiAoaXNfZWRwKGludGVsX2RwKSkKLQkJCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb2ZmKGRldik7CisJCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29mZihpbnRlbF9kcCk7CiAJCWludGVsX2RwX3NpbmtfZHBtcyhpbnRlbF9kcCwgbW9kZSk7CiAJCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9kcCk7Ci0JCWlmIChpc19lZHAoaW50ZWxfZHApKQotCQkJaXJvbmxha2VfZWRwX3BhbmVsX29mZihkZXYpOworCQlpcm9ubGFrZV9lZHBfcGFuZWxfb2ZmKGVuY29kZXIpOwogCQlpZiAoaXNfZWRwKGludGVsX2RwKSAmJiAhaXNfcGNoX2VkcChpbnRlbF9kcCkpCiAJCQlpcm9ubGFrZV9lZHBfcGxsX29mZihlbmNvZGVyKTsKKwkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vZmYoaW50ZWxfZHAsIGZhbHNlKTsKIAl9IGVsc2UgewotCQlpZiAoaXNfZWRwKGludGVsX2RwKSkKLQkJCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOworCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKGludGVsX2RwKTsKIAkJaW50ZWxfZHBfc2lua19kcG1zKGludGVsX2RwLCBtb2RlKTsKIAkJaWYgKCEoZHBfcmVnICYgRFBfUE9SVF9FTikpIHsKIAkJCWludGVsX2RwX3N0YXJ0X2xpbmtfdHJhaW4oaW50ZWxfZHApOwotCQkJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKLQkJCQlpcm9ubGFrZV9lZHBfcGFuZWxfb24oaW50ZWxfZHApOwotCQkJCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwKTsKLQkJCX0KKwkJCWlyb25sYWtlX2VkcF9wYW5lbF9vbihpbnRlbF9kcCk7CisJCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihpbnRlbF9kcCwgdHJ1ZSk7CiAJCQlpbnRlbF9kcF9jb21wbGV0ZV9saW5rX3RyYWluKGludGVsX2RwKTsKLQkJfQotCQlpZiAoaXNfZWRwKGludGVsX2RwKSkKLQkJCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb24oZGV2KTsKKwkJCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb24oaW50ZWxfZHApOworCQl9IGVsc2UKKwkJCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwLCBmYWxzZSk7CisJCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb24oaW50ZWxfZHApOwogCX0KIAlpbnRlbF9kcC0+ZHBtc19tb2RlID0gbW9kZTsKIH0KQEAgLTEzNjQsNyArMTU1OSw3IEBACiAJCQkJICBEUF9MSU5LX0NPTkZJR1VSQVRJT05fU0laRSk7CiAKIAlEUCB8PSBEUF9QT1JUX0VOOwotCWlmIChIQVNfUENIX0NQVChkZXYpICYmICFpc19lZHAoaW50ZWxfZHApKQorCWlmIChIQVNfUENIX0NQVChkZXYpICYmICFpc19jcHVfZWRwKGludGVsX2RwKSkKIAkJRFAgJj0gfkRQX0xJTktfVFJBSU5fTUFTS19DUFQ7CiAJZWxzZQogCQlEUCAmPSB+RFBfTElOS19UUkFJTl9NQVNLOwpAQCAtMTM4Myw3ICsxNTc4LDcgQEAKIAkJCURQID0gKERQICYgfihEUF9WT0xUQUdFX01BU0t8RFBfUFJFX0VNUEhBU0lTX01BU0spKSB8IHNpZ25hbF9sZXZlbHM7CiAJCX0KIAotCQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfZWRwKGludGVsX2RwKSkKKwkJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2NwdV9lZHAoaW50ZWxfZHApKQogCQkJcmVnID0gRFAgfCBEUF9MSU5LX1RSQUlOX1BBVF8xX0NQVDsKIAkJZWxzZQogCQkJcmVnID0gRFAgfCBEUF9MSU5LX1RSQUlOX1BBVF8xOwpAQCAtMTQ1OCw3ICsxNjUzLDcgQEAKIAkJCURQID0gKERQICYgfihEUF9WT0xUQUdFX01BU0t8RFBfUFJFX0VNUEhBU0lTX01BU0spKSB8IHNpZ25hbF9sZXZlbHM7CiAJCX0KIAotCQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfZWRwKGludGVsX2RwKSkKKwkJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2NwdV9lZHAoaW50ZWxfZHApKQogCQkJcmVnID0gRFAgfCBEUF9MSU5LX1RSQUlOX1BBVF8yX0NQVDsKIAkJZWxzZQogCQkJcmVnID0gRFAgfCBEUF9MSU5LX1RSQUlOX1BBVF8yOwpAQCAtMTQ5OSw3ICsxNjk0LDcgQEAKIAkJKyt0cmllczsKIAl9CiAKLQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfZWRwKGludGVsX2RwKSkKKwlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfY3B1X2VkcChpbnRlbF9kcCkpCiAJCXJlZyA9IERQIHwgRFBfTElOS19UUkFJTl9PRkZfQ1BUOwogCWVsc2UKIAkJcmVnID0gRFAgfCBEUF9MSU5LX1RSQUlOX09GRjsKQEAgLTE1MjksNyArMTcyNCw3IEBACiAJCXVkZWxheSgxMDApOwogCX0KIAotCWlmIChIQVNfUENIX0NQVChkZXYpICYmICFpc19lZHAoaW50ZWxfZHApKSB7CisJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2NwdV9lZHAoaW50ZWxfZHApKSB7CiAJCURQICY9IH5EUF9MSU5LX1RSQUlOX01BU0tfQ1BUOwogCQlJOTE1X1dSSVRFKGludGVsX2RwLT5vdXRwdXRfcmVnLCBEUCB8IERQX0xJTktfVFJBSU5fUEFUX0lETEVfQ1BUKTsKIAl9IGVsc2UgewpAQCAtMTU3OCwxMyArMTc3MywxNCBAQAogCiAJSTkxNV9XUklURShpbnRlbF9kcC0+b3V0cHV0X3JlZywgRFAgJiB+RFBfUE9SVF9FTik7CiAJUE9TVElOR19SRUFEKGludGVsX2RwLT5vdXRwdXRfcmVnKTsKKwltc2xlZXAoaW50ZWxfZHAtPnBhbmVsX3Bvd2VyX2Rvd25fZGVsYXkpOwogfQogCiBzdGF0aWMgYm9vbAogaW50ZWxfZHBfZ2V0X2RwY2Qoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKIAlpZiAoaW50ZWxfZHBfYXV4X25hdGl2ZV9yZWFkX3JldHJ5KGludGVsX2RwLCAweDAwMCwgaW50ZWxfZHAtPmRwY2QsCi0JCQkJCSAgIHNpemVvZiAoaW50ZWxfZHAtPmRwY2QpKSAmJgorCQkJCQkgICBzaXplb2YoaW50ZWxfZHAtPmRwY2QpKSAmJgogCSAgICAoaW50ZWxfZHAtPmRwY2RbRFBfRFBDRF9SRVZdICE9IDApKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTE1OTIsNiArMTc4OCwyNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGJvb2wKK2ludGVsX2RwX2dldF9zaW5rX2lycShzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCB1OCAqc2lua19pcnFfdmVjdG9yKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpbnRlbF9kcF9hdXhfbmF0aXZlX3JlYWRfcmV0cnkoaW50ZWxfZHAsCisJCQkJCSAgICAgRFBfREVWSUNFX1NFUlZJQ0VfSVJRX1ZFQ1RPUiwKKwkJCQkJICAgICBzaW5rX2lycV92ZWN0b3IsIDEpOworCWlmICghcmV0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK2ludGVsX2RwX2hhbmRsZV90ZXN0X3JlcXVlc3Qoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKK3sKKwkvKiBOQUsgYnkgZGVmYXVsdCAqLworCWludGVsX2RwX2F1eF9uYXRpdmVfd3JpdGVfMShpbnRlbF9kcCwgRFBfVEVTVF9SRVNQT05TRSwgRFBfVEVTVF9BQ0spOworfQorCiAvKgogICogQWNjb3JkaW5nIHRvIERQIHNwZWMKICAqIDUuMS4yOgpAQCAtMTYwNCw2ICsxODIxLDggQEAKIHN0YXRpYyB2b2lkCiBpbnRlbF9kcF9jaGVja19saW5rX3N0YXR1cyhzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQogeworCXU4IHNpbmtfaXJxX3ZlY3RvcjsKKwogCWlmIChpbnRlbF9kcC0+ZHBtc19tb2RlICE9IERSTV9NT0RFX0RQTVNfT04pCiAJCXJldHVybjsKIApAQCAtMTYyMiw2ICsxODQxLDIwIEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBUcnkgdG8gcmVhZCB0aGUgc291cmNlIG9mIHRoZSBpbnRlcnJ1cHQgKi8KKwlpZiAoaW50ZWxfZHAtPmRwY2RbRFBfRFBDRF9SRVZdID49IDB4MTEgJiYKKwkgICAgaW50ZWxfZHBfZ2V0X3NpbmtfaXJxKGludGVsX2RwLCAmc2lua19pcnFfdmVjdG9yKSkgeworCQkvKiBDbGVhciBpbnRlcnJ1cHQgc291cmNlICovCisJCWludGVsX2RwX2F1eF9uYXRpdmVfd3JpdGVfMShpbnRlbF9kcCwKKwkJCQkJICAgIERQX0RFVklDRV9TRVJWSUNFX0lSUV9WRUNUT1IsCisJCQkJCSAgICBzaW5rX2lycV92ZWN0b3IpOworCisJCWlmIChzaW5rX2lycV92ZWN0b3IgJiBEUF9BVVRPTUFURURfVEVTVF9SRVFVRVNUKQorCQkJaW50ZWxfZHBfaGFuZGxlX3Rlc3RfcmVxdWVzdChpbnRlbF9kcCk7CisJCWlmIChzaW5rX2lycV92ZWN0b3IgJiAoRFBfQ1BfSVJRIHwgRFBfU0lOS19TUEVDSUZJQ19JUlEpKQorCQkJRFJNX0RFQlVHX0RSSVZFUigiQ1Agb3Igc2luayBzcGVjaWZpYyBpcnEgdW5oYW5kbGVkXG4iKTsKKwl9CisKIAlpZiAoIWludGVsX2NoYW5uZWxfZXFfb2soaW50ZWxfZHApKSB7CiAJCURSTV9ERUJVR19LTVMoIiVzOiBjaGFubmVsIEVRIG5vdCBvaywgcmV0cmFpbmluZ1xuIiwKIAkJCSAgICAgIGRybV9nZXRfZW5jb2Rlcl9uYW1lKCZpbnRlbF9kcC0+YmFzZS5iYXNlKSk7CkBAIC0xNjgzLDYgKzE5MTYsMzEgQEAKIAlyZXR1cm4gaW50ZWxfZHBfZGV0ZWN0X2RwY2QoaW50ZWxfZHApOwogfQogCitzdGF0aWMgc3RydWN0IGVkaWQgKgoraW50ZWxfZHBfZ2V0X2VkaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBpbnRlbF9hdHRhY2hlZF9kcChjb25uZWN0b3IpOworCXN0cnVjdCBlZGlkCSplZGlkOworCisJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihpbnRlbF9kcCk7CisJZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsIGFkYXB0ZXIpOworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwLCBmYWxzZSk7CisJcmV0dXJuIGVkaWQ7Cit9CisKK3N0YXRpYyBpbnQKK2ludGVsX2RwX2dldF9lZGlkX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9yKTsKKwlpbnQJcmV0OworCisJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihpbnRlbF9kcCk7CisJcmV0ID0gaW50ZWxfZGRjX2dldF9tb2Rlcyhjb25uZWN0b3IsIGFkYXB0ZXIpOworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwLCBmYWxzZSk7CisJcmV0dXJuIHJldDsKK30KKworCiAvKioKICAqIFVzZXMgQ1JUX0hPVFBMVUdfRU4gYW5kIENSVF9IT1RQTFVHX1NUQVQgdG8gZGV0ZWN0IERQIGNvbm5lY3Rpb24uCiAgKgpAQCAtMTcxNSw3ICsxOTczLDcgQEAKIAlpZiAoaW50ZWxfZHAtPmZvcmNlX2F1ZGlvKSB7CiAJCWludGVsX2RwLT5oYXNfYXVkaW8gPSBpbnRlbF9kcC0+Zm9yY2VfYXVkaW8gPiAwOwogCX0gZWxzZSB7Ci0JCWVkaWQgPSBkcm1fZ2V0X2VkaWQoY29ubmVjdG9yLCAmaW50ZWxfZHAtPmFkYXB0ZXIpOworCQllZGlkID0gaW50ZWxfZHBfZ2V0X2VkaWQoY29ubmVjdG9yLCAmaW50ZWxfZHAtPmFkYXB0ZXIpOwogCQlpZiAoZWRpZCkgewogCQkJaW50ZWxfZHAtPmhhc19hdWRpbyA9IGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhlZGlkKTsKIAkJCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLnJhd19lZGlkID0gTlVMTDsKQEAgLTE3MzYsMjggKzE5OTQsMzYgQEAKIAkvKiBXZSBzaG91bGQgcGFyc2UgdGhlIEVESUQgZGF0YSBhbmQgZmluZCBvdXQgaWYgaXQgaGFzIGFuIGF1ZGlvIHNpbmsKIAkgKi8KIAotCXJldCA9IGludGVsX2RkY19nZXRfbW9kZXMoY29ubmVjdG9yLCAmaW50ZWxfZHAtPmFkYXB0ZXIpOworCXJldCA9IGludGVsX2RwX2dldF9lZGlkX21vZGVzKGNvbm5lY3RvciwgJmludGVsX2RwLT5hZGFwdGVyKTsKIAlpZiAocmV0KSB7Ci0JCWlmIChpc19lZHAoaW50ZWxfZHApICYmICFkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSkgeworCQlpZiAoaXNfZWRwKGludGVsX2RwKSAmJiAhaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUpIHsKIAkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuZXdtb2RlOwogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXdtb2RlLCAmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMsCiAJCQkJCSAgICBoZWFkKSB7Ci0JCQkJaWYgKG5ld21vZGUtPnR5cGUgJiBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRCkgewotCQkJCQlkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSA9CisJCQkJaWYgKChuZXdtb2RlLT50eXBlICYgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQpKSB7CisJCQkJCWludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlID0KIAkJCQkJCWRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIG5ld21vZGUpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAJCX0KLQogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIGlmIGVEUCBoYXMgbm8gRURJRCwgdHJ5IHRvIHVzZSBmaXhlZCBwYW5lbCBtb2RlIGZyb20gVkJUICovCiAJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKLQkJaWYgKGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlICE9IE5VTEwpIHsKKwkJLyogaW5pdGlhbGl6ZSBwYW5lbCBtb2RlIGZyb20gVkJUIGlmIGF2YWlsYWJsZSBmb3IgZURQICovCisJCWlmIChpbnRlbF9kcC0+cGFuZWxfZml4ZWRfbW9kZSA9PSBOVUxMICYmIGRldl9wcml2LT5sZnBfbHZkc192YnRfbW9kZSAhPSBOVUxMKSB7CisJCQlpbnRlbF9kcC0+cGFuZWxfZml4ZWRfbW9kZSA9CisJCQkJZHJtX21vZGVfZHVwbGljYXRlKGRldiwgZGV2X3ByaXYtPmxmcF9sdmRzX3ZidF9tb2RlKTsKKwkJCWlmIChpbnRlbF9kcC0+cGFuZWxfZml4ZWRfbW9kZSkgeworCQkJCWludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlLT50eXBlIHw9CisJCQkJCURSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOworCQkJfQorCQl9CisJCWlmIChpbnRlbF9kcC0+cGFuZWxfZml4ZWRfbW9kZSkgewogCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7Ci0JCQltb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUpOworCQkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlKTsKIAkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0xNzcyLDcgKzIwMzgsNyBAQAogCXN0cnVjdCBlZGlkICplZGlkOwogCWJvb2wgaGFzX2F1ZGlvID0gZmFsc2U7CiAKLQllZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJmludGVsX2RwLT5hZGFwdGVyKTsKKwllZGlkID0gaW50ZWxfZHBfZ2V0X2VkaWQoY29ubmVjdG9yLCAmaW50ZWxfZHAtPmFkYXB0ZXIpOwogCWlmIChlZGlkKSB7CiAJCWhhc19hdWRpbyA9IGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhlZGlkKTsKIApAQCAtMTgzOSw3ICsyMTA1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWludGVsX2RwX2Rlc3Ryb3kgKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCitpbnRlbF9kcF9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwogCkBAIC0xODU3LDYgKzIxMjMsMTAgQEAKIAogCWkyY19kZWxfYWRhcHRlcigmaW50ZWxfZHAtPmFkYXB0ZXIpOwogCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CisJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpbnRlbF9kcC0+cGFuZWxfdmRkX3dvcmspOworCQlpcm9ubGFrZV9wYW5lbF92ZGRfb2ZmX3N5bmMoaW50ZWxfZHApOworCX0KIAlrZnJlZShpbnRlbF9kcCk7CiB9CiAKQEAgLTE4OTYsNyArMjE2Niw3IEBACiAKIC8qIFJldHVybiB3aGljaCBEUCBQb3J0IHNob3VsZCBiZSBzZWxlY3RlZCBmb3IgVHJhbnNjb2RlciBEUCBjb250cm9sICovCiBpbnQKLWludGVsX3RyYW5zX2RwX3BvcnRfc2VsIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCitpbnRlbF90cmFuc19kcF9wb3J0X3NlbChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICptb2RlX2NvbmZpZyA9ICZkZXYtPm1vZGVfY29uZmlnOwpAQCAtMTk5MywxMCArMjI2MywxMyBAQAogCWVsc2UgaWYgKG91dHB1dF9yZWcgPT0gRFBfRCB8fCBvdXRwdXRfcmVnID09IFBDSF9EUF9EKQogCQlpbnRlbF9lbmNvZGVyLT5jbG9uZV9tYXNrID0gKDEgPDwgSU5URUxfRFBfRF9DTE9ORV9CSVQpOwogCi0JaWYgKGlzX2VkcChpbnRlbF9kcCkpCisJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKIAkJaW50ZWxfZW5jb2Rlci0+Y2xvbmVfbWFzayA9ICgxIDw8IElOVEVMX0VEUF9DTE9ORV9CSVQpOworCQlJTklUX0RFTEFZRURfV09SSygmaW50ZWxfZHAtPnBhbmVsX3ZkZF93b3JrLAorCQkJCSAgaXJvbmxha2VfcGFuZWxfdmRkX3dvcmspOworCX0KIAotCWludGVsX2VuY29kZXItPmNydGNfbWFzayA9ICgxIDw8IDApIHwgKDEgPDwgMSk7CisJaW50ZWxfZW5jb2Rlci0+Y3J0Y19tYXNrID0gKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpOwogCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSB0cnVlOwogCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gMDsKIApAQCAtMjAzMiwyNSArMjMwNSw2MCBAQAogCQkJYnJlYWs7CiAJfQogCi0JaW50ZWxfZHBfaTJjX2luaXQoaW50ZWxfZHAsIGludGVsX2Nvbm5lY3RvciwgbmFtZSk7Ci0KIAkvKiBDYWNoZSBzb21lIERQQ0QgZGF0YSBpbiB0aGUgZURQIGNhc2UgKi8KIAlpZiAoaXNfZWRwKGludGVsX2RwKSkgewogCQlib29sIHJldDsKLQkJdTMyIHBwX29uLCBwcF9kaXY7CisJCXN0cnVjdCBlZHBfcG93ZXJfc2VxCWN1ciwgdmJ0OworCQl1MzIgcHBfb24sIHBwX29mZiwgcHBfZGl2OwogCiAJCXBwX29uID0gSTkxNV9SRUFEKFBDSF9QUF9PTl9ERUxBWVMpOworCQlwcF9vZmYgPSBJOTE1X1JFQUQoUENIX1BQX09GRl9ERUxBWVMpOwogCQlwcF9kaXYgPSBJOTE1X1JFQUQoUENIX1BQX0RJVklTT1IpOwogCi0JCS8qIEdldCBUMyAmIFQxMiB2YWx1ZXMgKG5vdGU6IFZFU0Egbm90IGJzcGVjIHRlcm1pbm9sb2d5KSAqLwotCQlkZXZfcHJpdi0+cGFuZWxfdDMgPSAocHBfb24gJiAweDFmZmYwMDAwKSA+PiAxNjsKLQkJZGV2X3ByaXYtPnBhbmVsX3QzIC89IDEwOyAvKiB0MyBpbiAxMDB1cyB1bml0cyAqLwotCQlkZXZfcHJpdi0+cGFuZWxfdDEyID0gcHBfZGl2ICYgMHhmOwotCQlkZXZfcHJpdi0+cGFuZWxfdDEyICo9IDEwMDsgLyogdDEyIGluIDEwMG1zIHVuaXRzICovCisJCS8qIFB1bGwgdGltaW5nIHZhbHVlcyBvdXQgb2YgcmVnaXN0ZXJzICovCisJCWN1ci50MV90MyA9IChwcF9vbiAmIFBBTkVMX1BPV0VSX1VQX0RFTEFZX01BU0spID4+CisJCQlQQU5FTF9QT1dFUl9VUF9ERUxBWV9TSElGVDsKKworCQljdXIudDggPSAocHBfb24gJiBQQU5FTF9MSUdIVF9PTl9ERUxBWV9NQVNLKSA+PgorCQkJUEFORUxfTElHSFRfT05fREVMQVlfU0hJRlQ7CisJCQorCQljdXIudDkgPSAocHBfb2ZmICYgUEFORUxfTElHSFRfT0ZGX0RFTEFZX01BU0spID4+CisJCQlQQU5FTF9MSUdIVF9PRkZfREVMQVlfU0hJRlQ7CisKKwkJY3VyLnQxMCA9IChwcF9vZmYgJiBQQU5FTF9QT1dFUl9ET1dOX0RFTEFZX01BU0spID4+CisJCQlQQU5FTF9QT1dFUl9ET1dOX0RFTEFZX1NISUZUOworCisJCWN1ci50MTFfdDEyID0gKChwcF9kaXYgJiBQQU5FTF9QT1dFUl9DWUNMRV9ERUxBWV9NQVNLKSA+PgorCQkJICAgICAgIFBBTkVMX1BPV0VSX0NZQ0xFX0RFTEFZX1NISUZUKSAqIDEwMDA7CisKKwkJRFJNX0RFQlVHX0tNUygiY3VyIHQxX3QzICVkIHQ4ICVkIHQ5ICVkIHQxMCAlZCB0MTFfdDEyICVkXG4iLAorCQkJICAgICAgY3VyLnQxX3QzLCBjdXIudDgsIGN1ci50OSwgY3VyLnQxMCwgY3VyLnQxMV90MTIpOworCisJCXZidCA9IGRldl9wcml2LT5lZHAucHBzOworCisJCURSTV9ERUJVR19LTVMoInZidCB0MV90MyAlZCB0OCAlZCB0OSAlZCB0MTAgJWQgdDExX3QxMiAlZFxuIiwKKwkJCSAgICAgIHZidC50MV90MywgdmJ0LnQ4LCB2YnQudDksIHZidC50MTAsIHZidC50MTFfdDEyKTsKKworI2RlZmluZSBnZXRfZGVsYXkoZmllbGQpCSgobWF4KGN1ci5maWVsZCwgdmJ0LmZpZWxkKSArIDkpIC8gMTApCisKKwkJaW50ZWxfZHAtPnBhbmVsX3Bvd2VyX3VwX2RlbGF5ID0gZ2V0X2RlbGF5KHQxX3QzKTsKKwkJaW50ZWxfZHAtPmJhY2tsaWdodF9vbl9kZWxheSA9IGdldF9kZWxheSh0OCk7CisJCWludGVsX2RwLT5iYWNrbGlnaHRfb2ZmX2RlbGF5ID0gZ2V0X2RlbGF5KHQ5KTsKKwkJaW50ZWxfZHAtPnBhbmVsX3Bvd2VyX2Rvd25fZGVsYXkgPSBnZXRfZGVsYXkodDEwKTsKKwkJaW50ZWxfZHAtPnBhbmVsX3Bvd2VyX2N5Y2xlX2RlbGF5ID0gZ2V0X2RlbGF5KHQxMV90MTIpOworCisJCURSTV9ERUJVR19LTVMoInBhbmVsIHBvd2VyIHVwIGRlbGF5ICVkLCBwb3dlciBkb3duIGRlbGF5ICVkLCBwb3dlciBjeWNsZSBkZWxheSAlZFxuIiwKKwkJCSAgICAgIGludGVsX2RwLT5wYW5lbF9wb3dlcl91cF9kZWxheSwgaW50ZWxfZHAtPnBhbmVsX3Bvd2VyX2Rvd25fZGVsYXksCisJCQkgICAgICBpbnRlbF9kcC0+cGFuZWxfcG93ZXJfY3ljbGVfZGVsYXkpOworCisJCURSTV9ERUJVR19LTVMoImJhY2tsaWdodCBvbiBkZWxheSAlZCwgb2ZmIGRlbGF5ICVkXG4iLAorCQkJICAgICAgaW50ZWxfZHAtPmJhY2tsaWdodF9vbl9kZWxheSwgaW50ZWxfZHAtPmJhY2tsaWdodF9vZmZfZGVsYXkpOworCisJCWludGVsX2RwLT5wYW5lbF9vZmZfamlmZmllcyA9IGppZmZpZXMgLSBpbnRlbF9kcC0+cGFuZWxfcG93ZXJfZG93bl9kZWxheTsKIAogCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKGludGVsX2RwKTsKIAkJcmV0ID0gaW50ZWxfZHBfZ2V0X2RwY2QoaW50ZWxfZHApOwotCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihpbnRlbF9kcCk7CisJCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwLCBmYWxzZSk7CiAJCWlmIChyZXQpIHsKIAkJCWlmIChpbnRlbF9kcC0+ZHBjZFtEUF9EUENEX1JFVl0gPj0gMHgxMSkKIAkJCQlkZXZfcHJpdi0+bm9fYXV4X2hhbmRzaGFrZSA9CkBAIC0yMDY1LDE4ICsyMzczLDExIEBACiAJCX0KIAl9CiAKKwlpbnRlbF9kcF9pMmNfaW5pdChpbnRlbF9kcCwgaW50ZWxfY29ubmVjdG9yLCBuYW1lKTsKKwogCWludGVsX2VuY29kZXItPmhvdF9wbHVnID0gaW50ZWxfZHBfaG90X3BsdWc7CiAKIAlpZiAoaXNfZWRwKGludGVsX2RwKSkgewotCQkvKiBpbml0aWFsaXplIHBhbmVsIG1vZGUgZnJvbSBWQlQgaWYgYXZhaWxhYmxlIGZvciBlRFAgKi8KLQkJaWYgKGRldl9wcml2LT5sZnBfbHZkc192YnRfbW9kZSkgewotCQkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUgPQotCQkJCWRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGRldl9wcml2LT5sZnBfbHZkc192YnRfbW9kZSk7Ci0JCQlpZiAoZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUpIHsKLQkJCQlkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+dHlwZSB8PQotCQkJCQlEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKLQkJCX0KLQkJfQogCQlkZXZfcHJpdi0+aW50X2VkcF9jb25uZWN0b3IgPSBjb25uZWN0b3I7CiAJCWludGVsX3BhbmVsX3NldHVwX2JhY2tsaWdodChkZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggZmUxMDk5ZC4uYmQ5YTYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTM0LDcgKzM0LDcgQEAKICNkZWZpbmUgX3dhaXRfZm9yKENPTkQsIE1TLCBXKSAoeyBcCiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0X18gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhNUyk7CVwKIAlpbnQgcmV0X18gPSAwOwkJCQkJCQlcCi0Jd2hpbGUgKCEgKENPTkQpKSB7CQkJCQkJXAorCXdoaWxlICghKENPTkQpKSB7CQkJCQkJXAogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0X18pKSB7CQkJXAogCQkJcmV0X18gPSAtRVRJTUVET1VUOwkJCQlcCiAJCQlicmVhazsJCQkJCQlcCkBAIC00OSwxMCArNDksMTAgQEAKIAogI2RlZmluZSBNU0xFRVAoeCkgZG8geyBcCiAJaWYgKGluX2RiZ19tYXN0ZXIoKSkgXAotCSAgICAgICAJbWRlbGF5KHgpOyBcCisJCW1kZWxheSh4KTsgXAogCWVsc2UgXAogCQltc2xlZXAoeCk7IFwKLX0gd2hpbGUoMCkKK30gd2hpbGUgKDApCiAKICNkZWZpbmUgS0h6KHgpICgxMDAwKngpCiAjZGVmaW5lIE1Ieih4KSBLSHooMTAwMCp4KQpAQCAtMTcxLDYgKzE3MSw5IEBACiAJaW50MTZfdCBjdXJzb3Jfd2lkdGgsIGN1cnNvcl9oZWlnaHQ7CiAJYm9vbCBjdXJzb3JfdmlzaWJsZTsKIAl1bnNpZ25lZCBpbnQgYnBwOworCisJYm9vbCBub19wbGw7IC8qIHRlcnRpYXJ5IHBpcGUgZm9yIElWQiAqLworCWJvb2wgdXNlX3BsbF9hOwogfTsKIAogI2RlZmluZSB0b19pbnRlbF9jcnRjKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgaW50ZWxfY3J0YywgYmFzZSkKQEAgLTE4NCw3ICsxODcsNyBAQAogI2RlZmluZSBESVBfVkVSU0lPTl9BVkkgMHgyCiAjZGVmaW5lIERJUF9MRU5fQVZJICAgICAxMwogCi0jZGVmaW5lIERJUF9UWVBFX1NQRAkweDMKKyNkZWZpbmUgRElQX1RZUEVfU1BECTB4ODMKICNkZWZpbmUgRElQX1ZFUlNJT05fU1BECTB4MQogI2RlZmluZSBESVBfTEVOX1NQRAkyNQogI2RlZmluZSBESVBfU1BEX1VOS05PV04JMApAQCAtMjg0LDcgKzI4Nyw3IEBACiBpbnRlbF9kcF9zZXRfbV9uKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSk7CiBleHRlcm4gYm9vbCBpbnRlbF9kcGRfaXNfZWRwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgaW50ZWxfZWRwX2xpbmtfY29uZmlnIChzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqLCBpbnQgKiwgaW50ICopOworZXh0ZXJuIHZvaWQgaW50ZWxfZWRwX2xpbmtfY29uZmlnKHN0cnVjdCBpbnRlbF9lbmNvZGVyICosIGludCAqLCBpbnQgKik7CiBleHRlcm4gYm9vbCBpbnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIAogLyogaW50ZWxfcGFuZWwuYyAqLwpAQCAtMzA0LDggKzMwNyw4IEBACiBleHRlcm4gZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBpbnRlbF9wYW5lbF9kZXRlY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIGV4dGVybiB2b2lkIGludGVsX2NydGNfbG9hZF9sdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKLWV4dGVybiB2b2lkIGludGVsX2VuY29kZXJfcHJlcGFyZSAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKLWV4dGVybiB2b2lkIGludGVsX2VuY29kZXJfY29tbWl0IChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworZXh0ZXJuIHZvaWQgaW50ZWxfZW5jb2Rlcl9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CitleHRlcm4gdm9pZCBpbnRlbF9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2F0dGFjaGVkX2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKQEAgLTM3Nyw0ICszODAsOCBAQAogZXh0ZXJuIHZvaWQgaW50ZWxfZmJfcmVzdG9yZV9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBleHRlcm4gdm9pZCBpbnRlbF9pbml0X2Nsb2NrX2dhdGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGludGVsX3dyaXRlX2VsZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOworZXh0ZXJuIHZvaWQgaW50ZWxfY3B0X3ZlcmlmeV9tb2Rlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKTsKKwogI2VuZGlmIC8qIF9fSU5URUxfRFJWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCmluZGV4IDIyNmJhODMuLmQ0ZjVhMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKQEAgLTY5LDggKzY5LDcgQEAKIAlmcmFtZS0+Y2hlY2tzdW0gPSAwOwogCWZyYW1lLT5lY2MgPSAwOwogCi0JLyogSGVhZGVyIGlzbid0IHBhcnQgb2YgdGhlIGNoZWNrc3VtICovCi0JZm9yIChpID0gNTsgaSA8IGZyYW1lLT5sZW47IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPmxlbiArIERJUF9IRUFERVJfU0laRTsgaSsrKQogCQlzdW0gKz0gZGF0YVtpXTsKIAogCWZyYW1lLT5jaGVja3N1bSA9IDB4MTAwIC0gc3VtOwpAQCAtMTA0LDcgKzEwMyw3IEBACiAJCWZsYWdzIHw9IFZJREVPX0RJUF9FTkFCTEVfQVZJIHwgVklERU9fRElQX0ZSRVFfVlNZTkM7CiAJCWJyZWFrOwogCWNhc2UgRElQX1RZUEVfU1BEOgotCQlmbGFncyB8PSBWSURFT19ESVBfRU5BQkxFX1NQRCB8IFZJREVPX0RJUF9GUkVRXzJWU1lOQzsKKwkJZmxhZ3MgfD0gVklERU9fRElQX0VOQUJMRV9TUEQgfCBWSURFT19ESVBfRlJFUV9WU1lOQzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHX0RSSVZFUigidW5rbm93biBpbmZvIGZyYW1lIHR5cGUgJWRcbiIsIGZyYW1lLT50eXBlKTsKQEAgLTE2NSw5ICsxNjQsOSBAQAogCiAJZmxhZ3MgPSBpbnRlbF9pbmZvZnJhbWVfaW5kZXgoZnJhbWUpOwogCi0JdmFsICY9IH5WSURFT19ESVBfU0VMRUNUX01BU0s7CisJdmFsICY9IH4oVklERU9fRElQX1NFTEVDVF9NQVNLIHwgMHhmKTsgLyogY2xlYXIgRElQIGRhdGEgb2Zmc2V0ICovCiAKLQlJOTE1X1dSSVRFKHJlZywgdmFsIHwgZmxhZ3MpOworCUk5MTVfV1JJVEUocmVnLCBWSURFT19ESVBfRU5BQkxFIHwgdmFsIHwgZmxhZ3MpOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7CiAJCUk5MTVfV1JJVEUoVFZJREVPX0RJUF9EQVRBKGludGVsX2NydGMtPnBpcGUpLCAqZGF0YSk7CkBAIC0yNDUsMTYgKzI0NCwxNyBAQAogCQlzZHZveCB8PSBIRE1JX01PREVfU0VMRUNUOwogCiAJaWYgKGludGVsX2hkbWktPmhhc19hdWRpbykgeworCQlEUk1fREVCVUdfRFJJVkVSKCJFbmFibGluZyBIRE1JIGF1ZGlvIG9uIHBpcGUgJWNcbiIsCisJCQkJIHBpcGVfbmFtZShpbnRlbF9jcnRjLT5waXBlKSk7CiAJCXNkdm94IHw9IFNEVk9fQVVESU9fRU5BQkxFOwogCQlzZHZveCB8PSBTRFZPX05VTExfUEFDS0VUU19EVVJJTkdfVlNZTkM7CisJCWludGVsX3dyaXRlX2VsZChlbmNvZGVyLCBhZGp1c3RlZF9tb2RlKTsKIAl9CiAKLQlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAxKSB7Ci0JCWlmIChIQVNfUENIX0NQVChkZXYpKQotCQkJc2R2b3ggfD0gUE9SVF9UUkFOU19CX1NFTF9DUFQ7Ci0JCWVsc2UKLQkJCXNkdm94IHw9IFNEVk9fUElQRV9CX1NFTEVDVDsKLQl9CisJaWYgKEhBU19QQ0hfQ1BUKGRldikpCisJCXNkdm94IHw9IFBPUlRfVFJBTlNfU0VMX0NQVChpbnRlbF9jcnRjLT5waXBlKTsKKwllbHNlIGlmIChpbnRlbF9jcnRjLT5waXBlID09IDEpCisJCXNkdm94IHw9IFNEVk9fUElQRV9CX1NFTEVDVDsKIAogCUk5MTVfV1JJVEUoaW50ZWxfaGRtaS0+c2R2b3hfcmVnLCBzZHZveCk7CiAJUE9TVElOR19SRUFEKGludGVsX2hkbWktPnNkdm94X3JlZyk7CkBAIC00ODYsNiArNDg2LDcgQEAKIAlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlcjsKIAlzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3I7CiAJc3RydWN0IGludGVsX2hkbWkgKmludGVsX2hkbWk7CisJaW50IGk7CiAKIAlpbnRlbF9oZG1pID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGludGVsX2hkbWkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWludGVsX2hkbWkpCkBAIC01MTEsNyArNTEyLDcgQEAKIAljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7CiAJY29ubmVjdG9yLT5pbnRlcmxhY2VfYWxsb3dlZCA9IDA7CiAJY29ubmVjdG9yLT5kb3VibGVzY2FuX2FsbG93ZWQgPSAwOwotCWludGVsX2VuY29kZXItPmNydGNfbWFzayA9ICgxIDw8IDApIHwgKDEgPDwgMSk7CisJaW50ZWxfZW5jb2Rlci0+Y3J0Y19tYXNrID0gKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpOwogCiAJLyogU2V0IHVwIHRoZSBEREMgYnVzLiAqLwogCWlmIChzZHZveF9yZWcgPT0gU0RWT0IpIHsKQEAgLTUzOCwxMCArNTM5LDE0IEBACiAKIAlpbnRlbF9oZG1pLT5zZHZveF9yZWcgPSBzZHZveF9yZWc7CiAKLQlpZiAoIUhBU19QQ0hfU1BMSVQoZGV2KSkKKwlpZiAoIUhBU19QQ0hfU1BMSVQoZGV2KSkgewogCQlpbnRlbF9oZG1pLT53cml0ZV9pbmZvZnJhbWUgPSBpOXh4X3dyaXRlX2luZm9mcmFtZTsKLQllbHNlCisJCUk5MTVfV1JJVEUoVklERU9fRElQX0NUTCwgMCk7CisJfSBlbHNlIHsKIAkJaW50ZWxfaGRtaS0+d3JpdGVfaW5mb2ZyYW1lID0gaXJvbmxha2Vfd3JpdGVfaW5mb2ZyYW1lOworCQlmb3JfZWFjaF9waXBlKGkpCisJCQlJOTE1X1dSSVRFKFRWSURFT19ESVBfQ1RMKGkpLCAwKTsKKwl9CiAKIAlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKCZpbnRlbF9lbmNvZGVyLT5iYXNlLCAmaW50ZWxfaGRtaV9oZWxwZXJfZnVuY3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCmluZGV4IGQ5OGNlZTYuLmQzMGNjY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCkBAIC0yOCw2ICsyOCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCkBAIC00MjIsMTMgKzQyMyw3IEBACiB7CiAJc3RydWN0IGludGVsX2dtYnVzICpidXMgPSB0b19pbnRlbF9nbWJ1cyhhZGFwdGVyKTsKIAotCS8qIHNwZWVkOgotCSAqIDB4MCA9IDEwMCBLSHoKLQkgKiAweDEgPSA1MCBLSHoKLQkgKiAweDIgPSA0MDAgS0h6Ci0JICogMHgzID0gMTAwMCBLaHoKLQkgKi8KLQlidXMtPnJlZzAgPSAoYnVzLT5yZWcwICYgfigweDMgPDwgOCkpIHwgKHNwZWVkIDw8IDgpOworCWJ1cy0+cmVnMCA9IChidXMtPnJlZzAgJiB+KDB4MyA8PCA4KSkgfCBzcGVlZDsKIH0KIAogdm9pZCBpbnRlbF9nbWJ1c19mb3JjZV9iaXQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBib29sIGZvcmNlX2JpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwppbmRleCAzMWRhNzdmLi40MmYxNjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCkBAIC04ODgsOSArODg4LDExIEBACiAJaW50ZWxfZW5jb2Rlci0+dHlwZSA9IElOVEVMX09VVFBVVF9MVkRTOwogCiAJaW50ZWxfZW5jb2Rlci0+Y2xvbmVfbWFzayA9ICgxIDw8IElOVEVMX0xWRFNfQ0xPTkVfQklUKTsKLQlpbnRlbF9lbmNvZGVyLT5jcnRjX21hc2sgPSAoMSA8PCAxKTsKLQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNSkKLQkJaW50ZWxfZW5jb2Rlci0+Y3J0Y19tYXNrIHw9ICgxIDw8IDApOworCWlmIChIQVNfUENIX1NQTElUKGRldikpCisJCWludGVsX2VuY29kZXItPmNydGNfbWFzayA9ICgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKTsKKwllbHNlCisJCWludGVsX2VuY29kZXItPmNydGNfbWFzayA9ICgxIDw8IDEpOworCiAJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmaW50ZWxfbHZkc19oZWxwZXJfZnVuY3MpOwogCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZpbnRlbF9sdmRzX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwogCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLnN1YnBpeGVsX29yZGVyID0gU3ViUGl4ZWxIb3Jpem9udGFsUkdCOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbW9kZXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21vZGVzLmMKaW5kZXggM2IyNmEzYi4uYmUyYzZmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbW9kZXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9tb2Rlcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9lZGlkLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImludGVsX2Rydi5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCkBAIC03NCw2ICs3NSw3IEBACiAJaWYgKGVkaWQpIHsKIAkJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3RvciwgZWRpZCk7CiAJCXJldCA9IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGVkaWQpOworCQlkcm1fZWRpZF90b19lbGQoY29ubmVjdG9yLCBlZGlkKTsKIAkJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ucmF3X2VkaWQgPSBOVUxMOwogCQlrZnJlZShlZGlkKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYwppbmRleCBiOGU4MTU4Yi4uMjg5MTQwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jCkBAIC01MSw2MSArNTEsNjEgQEAKICNkZWZpbmUgTUJPWF9BU0xFICAgICAgKDE8PDIpCiAKIHN0cnVjdCBvcHJlZ2lvbl9oZWFkZXIgewotICAgICAgIHU4IHNpZ25hdHVyZVsxNl07Ci0gICAgICAgdTMyIHNpemU7Ci0gICAgICAgdTMyIG9wcmVnaW9uX3ZlcjsKLSAgICAgICB1OCBiaW9zX3ZlclszMl07Ci0gICAgICAgdTggdmJpb3NfdmVyWzE2XTsKLSAgICAgICB1OCBkcml2ZXJfdmVyWzE2XTsKLSAgICAgICB1MzIgbWJveGVzOwotICAgICAgIHU4IHJlc2VydmVkWzE2NF07CisJdTggc2lnbmF0dXJlWzE2XTsKKwl1MzIgc2l6ZTsKKwl1MzIgb3ByZWdpb25fdmVyOworCXU4IGJpb3NfdmVyWzMyXTsKKwl1OCB2Ymlvc192ZXJbMTZdOworCXU4IGRyaXZlcl92ZXJbMTZdOworCXUzMiBtYm94ZXM7CisJdTggcmVzZXJ2ZWRbMTY0XTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIE9wUmVnaW9uIG1haWxib3ggIzE6IHB1YmxpYyBBQ1BJIG1ldGhvZHMgKi8KIHN0cnVjdCBvcHJlZ2lvbl9hY3BpIHsKLSAgICAgICB1MzIgZHJkeTsgICAgICAgLyogZHJpdmVyIHJlYWRpbmVzcyAqLwotICAgICAgIHUzMiBjc3RzOyAgICAgICAvKiBub3RpZmljYXRpb24gc3RhdHVzICovCi0gICAgICAgdTMyIGNldnQ7ICAgICAgIC8qIGN1cnJlbnQgZXZlbnQgKi8KLSAgICAgICB1OCByc3ZkMVsyMF07Ci0gICAgICAgdTMyIGRpZGxbOF07ICAgIC8qIHN1cHBvcnRlZCBkaXNwbGF5IGRldmljZXMgSUQgbGlzdCAqLwotICAgICAgIHUzMiBjcGRsWzhdOyAgICAvKiBjdXJyZW50bHkgcHJlc2VudGVkIGRpc3BsYXkgbGlzdCAqLwotICAgICAgIHUzMiBjYWRsWzhdOyAgICAvKiBjdXJyZW50bHkgYWN0aXZlIGRpc3BsYXkgbGlzdCAqLwotICAgICAgIHUzMiBuYWRsWzhdOyAgICAvKiBuZXh0IGFjdGl2ZSBkZXZpY2VzIGxpc3QgKi8KLSAgICAgICB1MzIgYXNscDsgICAgICAgLyogQVNMIHNsZWVwIHRpbWUtb3V0ICovCi0gICAgICAgdTMyIHRpZHg7ICAgICAgIC8qIHRvZ2dsZSB0YWJsZSBpbmRleCAqLwotICAgICAgIHUzMiBjaHBkOyAgICAgICAvKiBjdXJyZW50IGhvdHBsdWcgZW5hYmxlIGluZGljYXRvciAqLwotICAgICAgIHUzMiBjbGlkOyAgICAgICAvKiBjdXJyZW50IGxpZCBzdGF0ZSovCi0gICAgICAgdTMyIGNkY2s7ICAgICAgIC8qIGN1cnJlbnQgZG9ja2luZyBzdGF0ZSAqLwotICAgICAgIHUzMiBzeHN3OyAgICAgICAvKiBTeCBzdGF0ZSByZXN1bWUgKi8KLSAgICAgICB1MzIgZXZ0czsgICAgICAgLyogQVNMIHN1cHBvcnRlZCBldmVudHMgKi8KLSAgICAgICB1MzIgY25vdDsgICAgICAgLyogY3VycmVudCBPUyBub3RpZmljYXRpb24gKi8KLSAgICAgICB1MzIgbnJkeTsgICAgICAgLyogZHJpdmVyIHN0YXR1cyAqLwotICAgICAgIHU4IHJzdmQyWzYwXTsKKwl1MzIgZHJkeTsgICAgICAgLyogZHJpdmVyIHJlYWRpbmVzcyAqLworCXUzMiBjc3RzOyAgICAgICAvKiBub3RpZmljYXRpb24gc3RhdHVzICovCisJdTMyIGNldnQ7ICAgICAgIC8qIGN1cnJlbnQgZXZlbnQgKi8KKwl1OCByc3ZkMVsyMF07CisJdTMyIGRpZGxbOF07ICAgIC8qIHN1cHBvcnRlZCBkaXNwbGF5IGRldmljZXMgSUQgbGlzdCAqLworCXUzMiBjcGRsWzhdOyAgICAvKiBjdXJyZW50bHkgcHJlc2VudGVkIGRpc3BsYXkgbGlzdCAqLworCXUzMiBjYWRsWzhdOyAgICAvKiBjdXJyZW50bHkgYWN0aXZlIGRpc3BsYXkgbGlzdCAqLworCXUzMiBuYWRsWzhdOyAgICAvKiBuZXh0IGFjdGl2ZSBkZXZpY2VzIGxpc3QgKi8KKwl1MzIgYXNscDsgICAgICAgLyogQVNMIHNsZWVwIHRpbWUtb3V0ICovCisJdTMyIHRpZHg7ICAgICAgIC8qIHRvZ2dsZSB0YWJsZSBpbmRleCAqLworCXUzMiBjaHBkOyAgICAgICAvKiBjdXJyZW50IGhvdHBsdWcgZW5hYmxlIGluZGljYXRvciAqLworCXUzMiBjbGlkOyAgICAgICAvKiBjdXJyZW50IGxpZCBzdGF0ZSovCisJdTMyIGNkY2s7ICAgICAgIC8qIGN1cnJlbnQgZG9ja2luZyBzdGF0ZSAqLworCXUzMiBzeHN3OyAgICAgICAvKiBTeCBzdGF0ZSByZXN1bWUgKi8KKwl1MzIgZXZ0czsgICAgICAgLyogQVNMIHN1cHBvcnRlZCBldmVudHMgKi8KKwl1MzIgY25vdDsgICAgICAgLyogY3VycmVudCBPUyBub3RpZmljYXRpb24gKi8KKwl1MzIgbnJkeTsgICAgICAgLyogZHJpdmVyIHN0YXR1cyAqLworCXU4IHJzdmQyWzYwXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIE9wUmVnaW9uIG1haWxib3ggIzI6IFNXU0NJICovCiBzdHJ1Y3Qgb3ByZWdpb25fc3dzY2kgewotICAgICAgIHUzMiBzY2ljOyAgICAgICAvKiBTV1NDSSBjb21tYW5kfHN0YXR1c3xkYXRhICovCi0gICAgICAgdTMyIHBhcm07ICAgICAgIC8qIGNvbW1hbmQgcGFyYW1ldGVycyAqLwotICAgICAgIHUzMiBkc2xwOyAgICAgICAvKiBkcml2ZXIgc2xlZXAgdGltZS1vdXQgKi8KLSAgICAgICB1OCByc3ZkWzI0NF07CisJdTMyIHNjaWM7ICAgICAgIC8qIFNXU0NJIGNvbW1hbmR8c3RhdHVzfGRhdGEgKi8KKwl1MzIgcGFybTsgICAgICAgLyogY29tbWFuZCBwYXJhbWV0ZXJzICovCisJdTMyIGRzbHA7ICAgICAgIC8qIGRyaXZlciBzbGVlcCB0aW1lLW91dCAqLworCXU4IHJzdmRbMjQ0XTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIE9wUmVnaW9uIG1haWxib3ggIzM6IEFTTEUgKi8KIHN0cnVjdCBvcHJlZ2lvbl9hc2xlIHsKLSAgICAgICB1MzIgYXJkeTsgICAgICAgLyogZHJpdmVyIHJlYWRpbmVzcyAqLwotICAgICAgIHUzMiBhc2xjOyAgICAgICAvKiBBU0xFIGludGVycnVwdCBjb21tYW5kICovCi0gICAgICAgdTMyIHRjaGU7ICAgICAgIC8qIHRlY2hub2xvZ3kgZW5hYmxlZCBpbmRpY2F0b3IgKi8KLSAgICAgICB1MzIgYWxzaTsgICAgICAgLyogY3VycmVudCBBTFMgaWxsdW1pbmFuY2UgcmVhZGluZyAqLwotICAgICAgIHUzMiBiY2xwOyAgICAgICAvKiBiYWNrbGlnaHQgYnJpZ2h0bmVzcyB0byBzZXQgKi8KLSAgICAgICB1MzIgcGZpdDsgICAgICAgLyogcGFuZWwgZml0dGluZyBzdGF0ZSAqLwotICAgICAgIHUzMiBjYmx2OyAgICAgICAvKiBjdXJyZW50IGJyaWdodG5lc3MgbGV2ZWwgKi8KLSAgICAgICB1MTYgYmNsbVsyMF07ICAgLyogYmFja2xpZ2h0IGxldmVsIGR1dHkgY3ljbGUgbWFwcGluZyB0YWJsZSAqLwotICAgICAgIHUzMiBjcGZtOyAgICAgICAvKiBjdXJyZW50IHBhbmVsIGZpdHRpbmcgbW9kZSAqLwotICAgICAgIHUzMiBlcGZtOyAgICAgICAvKiBlbmFibGVkIHBhbmVsIGZpdHRpbmcgbW9kZXMgKi8KLSAgICAgICB1OCBwbHV0Wzc0XTsgICAgLyogcGFuZWwgTFVUIGFuZCBpZGVudGlmaWVyICovCi0gICAgICAgdTMyIHBmbWI7ICAgICAgIC8qIFBXTSBmcmVxIGFuZCBtaW4gYnJpZ2h0bmVzcyAqLwotICAgICAgIHU4IHJzdmRbMTAyXTsKKwl1MzIgYXJkeTsgICAgICAgLyogZHJpdmVyIHJlYWRpbmVzcyAqLworCXUzMiBhc2xjOyAgICAgICAvKiBBU0xFIGludGVycnVwdCBjb21tYW5kICovCisJdTMyIHRjaGU7ICAgICAgIC8qIHRlY2hub2xvZ3kgZW5hYmxlZCBpbmRpY2F0b3IgKi8KKwl1MzIgYWxzaTsgICAgICAgLyogY3VycmVudCBBTFMgaWxsdW1pbmFuY2UgcmVhZGluZyAqLworCXUzMiBiY2xwOyAgICAgICAvKiBiYWNrbGlnaHQgYnJpZ2h0bmVzcyB0byBzZXQgKi8KKwl1MzIgcGZpdDsgICAgICAgLyogcGFuZWwgZml0dGluZyBzdGF0ZSAqLworCXUzMiBjYmx2OyAgICAgICAvKiBjdXJyZW50IGJyaWdodG5lc3MgbGV2ZWwgKi8KKwl1MTYgYmNsbVsyMF07ICAgLyogYmFja2xpZ2h0IGxldmVsIGR1dHkgY3ljbGUgbWFwcGluZyB0YWJsZSAqLworCXUzMiBjcGZtOyAgICAgICAvKiBjdXJyZW50IHBhbmVsIGZpdHRpbmcgbW9kZSAqLworCXUzMiBlcGZtOyAgICAgICAvKiBlbmFibGVkIHBhbmVsIGZpdHRpbmcgbW9kZXMgKi8KKwl1OCBwbHV0Wzc0XTsgICAgLyogcGFuZWwgTFVUIGFuZCBpZGVudGlmaWVyICovCisJdTMyIHBmbWI7ICAgICAgIC8qIFBXTSBmcmVxIGFuZCBtaW4gYnJpZ2h0bmVzcyAqLworCXU4IHJzdmRbMTAyXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIEFTTEUgaXJxIHJlcXVlc3QgYml0cyAqLwpAQCAtMzYxLDcgKzM2MSw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFjcGlfY2RldiwgJmFjcGlfdmlkZW9fYnVzLT5jaGlsZHJlbiwgbm9kZSkgewogCQlpZiAoaSA+PSA4KSB7Ci0JCQlkZXZfcHJpbnRrIChLRVJOX0VSUiwgJmRldi0+cGRldi0+ZGV2LAorCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmRldi0+cGRldi0+ZGV2LAogCQkJCSAgICAiTW9yZSB0aGFuIDggb3V0cHV0cyBkZXRlY3RlZFxuIik7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTM4Nyw3ICszODcsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgewogCQlpbnQgb3V0cHV0X3R5cGUgPSBBQ1BJX09USEVSX09VVFBVVDsKIAkJaWYgKGkgPj0gOCkgewotCQkJZGV2X3ByaW50ayAoS0VSTl9FUlIsICZkZXYtPnBkZXYtPmRldiwKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZkZXYtPnBkZXYtPmRldiwKIAkJCQkgICAgIk1vcmUgdGhhbiA4IG91dHB1dHMgZGV0ZWN0ZWRcbiIpOwogCQkJcmV0dXJuOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKaW5kZXggZDM2MDM4MC4uY2RmMTdkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYwpAQCAtMTE3LDU3ICsxMTcsNTcgQEAKIAogLyogbWVtb3J5IGJ1ZmZlcmQgb3ZlcmxheSByZWdpc3RlcnMgKi8KIHN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyB7Ci0gICAgdTMyIE9CVUZfMFk7Ci0gICAgdTMyIE9CVUZfMVk7Ci0gICAgdTMyIE9CVUZfMFU7Ci0gICAgdTMyIE9CVUZfMFY7Ci0gICAgdTMyIE9CVUZfMVU7Ci0gICAgdTMyIE9CVUZfMVY7Ci0gICAgdTMyIE9TVFJJREU7Ci0gICAgdTMyIFlSR0JfVlBIOwotICAgIHUzMiBVVl9WUEg7Ci0gICAgdTMyIEhPUlpfUEg7Ci0gICAgdTMyIElOSVRfUEhTOwotICAgIHUzMiBEV0lOUE9TOwotICAgIHUzMiBEV0lOU1o7Ci0gICAgdTMyIFNXSURUSDsKLSAgICB1MzIgU1dJRFRIU1c7Ci0gICAgdTMyIFNIRUlHSFQ7Ci0gICAgdTMyIFlSR0JTQ0FMRTsKLSAgICB1MzIgVVZTQ0FMRTsKLSAgICB1MzIgT0NMUkMwOwotICAgIHUzMiBPQ0xSQzE7Ci0gICAgdTMyIERDTFJLVjsKLSAgICB1MzIgRENMUktNOwotICAgIHUzMiBTQ0xSS1ZIOwotICAgIHUzMiBTQ0xSS1ZMOwotICAgIHUzMiBTQ0xSS0VOOwotICAgIHUzMiBPQ09ORklHOwotICAgIHUzMiBPQ01EOwotICAgIHUzMiBSRVNFUlZFRDE7IC8qIDB4NkMgKi8KLSAgICB1MzIgT1NUQVJUXzBZOwotICAgIHUzMiBPU1RBUlRfMVk7Ci0gICAgdTMyIE9TVEFSVF8wVTsKLSAgICB1MzIgT1NUQVJUXzBWOwotICAgIHUzMiBPU1RBUlRfMVU7Ci0gICAgdTMyIE9TVEFSVF8xVjsKLSAgICB1MzIgT1RJTEVPRkZfMFk7Ci0gICAgdTMyIE9USUxFT0ZGXzFZOwotICAgIHUzMiBPVElMRU9GRl8wVTsKLSAgICB1MzIgT1RJTEVPRkZfMFY7Ci0gICAgdTMyIE9USUxFT0ZGXzFVOwotICAgIHUzMiBPVElMRU9GRl8xVjsKLSAgICB1MzIgRkFTVEhTQ0FMRTsgLyogMHhBMCAqLwotICAgIHUzMiBVVlNDQUxFVjsgLyogMHhBNCAqLwotICAgIHUzMiBSRVNFUlZFRENbKDB4MjAwIC0gMHhBOCkgLyA0XTsgLyogMHhBOCAtIDB4MUZDICovCi0gICAgdTE2IFlfVkNPRUZTW05fVkVSVF9ZX1RBUFMgKiBOX1BIQVNFU107IC8qIDB4MjAwICovCi0gICAgdTE2IFJFU0VSVkVERFsweDEwMCAvIDIgLSBOX1ZFUlRfWV9UQVBTICogTl9QSEFTRVNdOwotICAgIHUxNiBZX0hDT0VGU1tOX0hPUklaX1lfVEFQUyAqIE5fUEhBU0VTXTsgLyogMHgzMDAgKi8KLSAgICB1MTYgUkVTRVJWRURFWzB4MjAwIC8gMiAtIE5fSE9SSVpfWV9UQVBTICogTl9QSEFTRVNdOwotICAgIHUxNiBVVl9WQ09FRlNbTl9WRVJUX1VWX1RBUFMgKiBOX1BIQVNFU107IC8qIDB4NTAwICovCi0gICAgdTE2IFJFU0VSVkVERlsweDEwMCAvIDIgLSBOX1ZFUlRfVVZfVEFQUyAqIE5fUEhBU0VTXTsKLSAgICB1MTYgVVZfSENPRUZTW05fSE9SSVpfVVZfVEFQUyAqIE5fUEhBU0VTXTsgLyogMHg2MDAgKi8KLSAgICB1MTYgUkVTRVJWRURHWzB4MTAwIC8gMiAtIE5fSE9SSVpfVVZfVEFQUyAqIE5fUEhBU0VTXTsKKwl1MzIgT0JVRl8wWTsKKwl1MzIgT0JVRl8xWTsKKwl1MzIgT0JVRl8wVTsKKwl1MzIgT0JVRl8wVjsKKwl1MzIgT0JVRl8xVTsKKwl1MzIgT0JVRl8xVjsKKwl1MzIgT1NUUklERTsKKwl1MzIgWVJHQl9WUEg7CisJdTMyIFVWX1ZQSDsKKwl1MzIgSE9SWl9QSDsKKwl1MzIgSU5JVF9QSFM7CisJdTMyIERXSU5QT1M7CisJdTMyIERXSU5TWjsKKwl1MzIgU1dJRFRIOworCXUzMiBTV0lEVEhTVzsKKwl1MzIgU0hFSUdIVDsKKwl1MzIgWVJHQlNDQUxFOworCXUzMiBVVlNDQUxFOworCXUzMiBPQ0xSQzA7CisJdTMyIE9DTFJDMTsKKwl1MzIgRENMUktWOworCXUzMiBEQ0xSS007CisJdTMyIFNDTFJLVkg7CisJdTMyIFNDTFJLVkw7CisJdTMyIFNDTFJLRU47CisJdTMyIE9DT05GSUc7CisJdTMyIE9DTUQ7CisJdTMyIFJFU0VSVkVEMTsgLyogMHg2QyAqLworCXUzMiBPU1RBUlRfMFk7CisJdTMyIE9TVEFSVF8xWTsKKwl1MzIgT1NUQVJUXzBVOworCXUzMiBPU1RBUlRfMFY7CisJdTMyIE9TVEFSVF8xVTsKKwl1MzIgT1NUQVJUXzFWOworCXUzMiBPVElMRU9GRl8wWTsKKwl1MzIgT1RJTEVPRkZfMVk7CisJdTMyIE9USUxFT0ZGXzBVOworCXUzMiBPVElMRU9GRl8wVjsKKwl1MzIgT1RJTEVPRkZfMVU7CisJdTMyIE9USUxFT0ZGXzFWOworCXUzMiBGQVNUSFNDQUxFOyAvKiAweEEwICovCisJdTMyIFVWU0NBTEVWOyAvKiAweEE0ICovCisJdTMyIFJFU0VSVkVEQ1soMHgyMDAgLSAweEE4KSAvIDRdOyAvKiAweEE4IC0gMHgxRkMgKi8KKwl1MTYgWV9WQ09FRlNbTl9WRVJUX1lfVEFQUyAqIE5fUEhBU0VTXTsgLyogMHgyMDAgKi8KKwl1MTYgUkVTRVJWRUREWzB4MTAwIC8gMiAtIE5fVkVSVF9ZX1RBUFMgKiBOX1BIQVNFU107CisJdTE2IFlfSENPRUZTW05fSE9SSVpfWV9UQVBTICogTl9QSEFTRVNdOyAvKiAweDMwMCAqLworCXUxNiBSRVNFUlZFREVbMHgyMDAgLyAyIC0gTl9IT1JJWl9ZX1RBUFMgKiBOX1BIQVNFU107CisJdTE2IFVWX1ZDT0VGU1tOX1ZFUlRfVVZfVEFQUyAqIE5fUEhBU0VTXTsgLyogMHg1MDAgKi8KKwl1MTYgUkVTRVJWRURGWzB4MTAwIC8gMiAtIE5fVkVSVF9VVl9UQVBTICogTl9QSEFTRVNdOworCXUxNiBVVl9IQ09FRlNbTl9IT1JJWl9VVl9UQVBTICogTl9QSEFTRVNdOyAvKiAweDYwMCAqLworCXUxNiBSRVNFUlZFREdbMHgxMDAgLyAyIC0gTl9IT1JJWl9VVl9UQVBTICogTl9QSEFTRVNdOwogfTsKIAogc3RydWN0IGludGVsX292ZXJsYXkgewpAQCAtMTkyLDcgKzE5Miw3IEBACiBzdGF0aWMgc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzICoKIGludGVsX292ZXJsYXlfbWFwX3JlZ3Moc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXkpCiB7Ci0gICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBvdmVybGF5LT5kZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBvdmVybGF5LT5kZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyAqcmVnczsKIAogCWlmIChPVkVSTEFZX05FRURTX1BIWVNJQ0FMKG92ZXJsYXktPmRldikpCkBAIC0yNjQsNyArMjY0LDcgQEAKIAogCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCAmdmVzYV82NDB4NDgwKTsKIAlkcm1fbW9kZV9zZXRfY3J0Y2luZm8obW9kZSwgQ1JUQ19JTlRFUkxBQ0VfSEFMVkVfVik7Ci0JaWYoIWRybV9jcnRjX2hlbHBlcl9zZXRfbW9kZSgmY3J0Yy0+YmFzZSwgbW9kZSwKKwlpZiAoIWRybV9jcnRjX2hlbHBlcl9zZXRfbW9kZSgmY3J0Yy0+YmFzZSwgbW9kZSwKIAkJCQkgICAgICAgY3J0Yy0+YmFzZS54LCBjcnRjLT5iYXNlLnksCiAJCQkJICAgICAgIGNydGMtPmJhc2UuZmIpKQogCQlyZXR1cm4gMDsKQEAgLTMzMiw3ICszMzIsNyBAQAogCQkJCSAgYm9vbCBsb2FkX3BvbHlwaGFzZV9maWx0ZXIpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG92ZXJsYXktPmRldjsKLSAgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0OwogCXUzMiBmbGlwX2FkZHIgPSBvdmVybGF5LT5mbGlwX2FkZHI7CiAJdTMyIHRtcDsKQEAgLTM1OSw3ICszNTksNyBAQAogCX0KIAlPVVRfUklORyhNSV9PVkVSTEFZX0ZMSVAgfCBNSV9PVkVSTEFZX0NPTlRJTlVFKTsKIAlPVVRfUklORyhmbGlwX2FkZHIpOwotICAgICAgICBBRFZBTkNFX0xQX1JJTkcoKTsKKwlBRFZBTkNFX0xQX1JJTkcoKTsKIAogCXJldCA9IGk5MTVfYWRkX3JlcXVlc3QoTFBfUklORyhkZXZfcHJpdiksIE5VTEwsIHJlcXVlc3QpOwogCWlmIChyZXQpIHsKQEAgLTU4Myw3ICs1ODMsNyBAQAogCXJldCA9ICgob2Zmc2V0ICsgd2lkdGggKyBtYXNrKSA+PiBzaGlmdCkgLSAob2Zmc2V0ID4+IHNoaWZ0KTsKIAlpZiAoIUlTX0dFTjIoZGV2KSkKIAkJcmV0IDw8PSAxOwotCXJldCAtPTE7CisJcmV0IC09IDE7CiAJcmV0dXJuIHJldCA8PCAyOwogfQogCkBAIC04MTcsNyArODE3LDcgQEAKIAlyZWdzLT5TV0lEVEhTVyA9IGNhbGNfc3dpZHRoc3cob3ZlcmxheS0+ZGV2LAogCQkJCSAgICAgICBwYXJhbXMtPm9mZnNldF9ZLCB0bXBfd2lkdGgpOwogCXJlZ3MtPlNIRUlHSFQgPSBwYXJhbXMtPnNyY19oOwotCXJlZ3MtPk9CVUZfMFkgPSBuZXdfYm8tPmd0dF9vZmZzZXQgKyBwYXJhbXMtPiBvZmZzZXRfWTsKKwlyZWdzLT5PQlVGXzBZID0gbmV3X2JvLT5ndHRfb2Zmc2V0ICsgcGFyYW1zLT5vZmZzZXRfWTsKIAlyZWdzLT5PU1RSSURFID0gcGFyYW1zLT5zdHJpZGVfWTsKIAogCWlmIChwYXJhbXMtPmZvcm1hdCAmIEk5MTVfT1ZFUkxBWV9ZVVZfUExBTkFSKSB7CkBAIC05MTcsNyArOTE3LDcgQEAKIAkgKiBsaW5lIHdpdGggdGhlIGludGVsIGRvY3VtZW50YXRpb24gZm9yIHRoZSBpOTY1CiAJICovCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKLQkgICAgICAgCS8qIG9uIGk5NjUgdXNlIHRoZSBQR00gcmVnIHRvIHJlYWQgb3V0IHRoZSBhdXRvc2NhbGVyIHZhbHVlcyAqLworCQkvKiBvbiBpOTY1IHVzZSB0aGUgUEdNIHJlZyB0byByZWFkIG91dCB0aGUgYXV0b3NjYWxlciB2YWx1ZXMgKi8KIAkJcmF0aW8gPSBJOTE1X1JFQUQoUEZJVF9QR01fUkFUSU9TKSA+PiBQRklUX1ZFUlRfU0NBTEVfU0hJRlRfOTY1OwogCX0gZWxzZSB7CiAJCWlmIChwZml0X2NvbnRyb2wgJiBWRVJUX0FVVE9fU0NBTEUpCkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogfQogCiBpbnQgaW50ZWxfb3ZlcmxheV9wdXRfaW1hZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfcHV0X2ltYWdlICpwdXRfaW1hZ2VfcmVjID0gZGF0YTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEzMDEsMTAgKzEzMDEsMTAgQEAKIH0KIAogaW50IGludGVsX292ZXJsYXlfYXR0cnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9pbnRlbF9vdmVybGF5X2F0dHJzICphdHRycyA9IGRhdGE7Ci0gICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5OwogCXN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyAqcmVnczsKIAlpbnQgcmV0OwpAQCAtMTM5Myw3ICsxMzkzLDcgQEAKIAogdm9pZCBpbnRlbF9zZXR1cF9vdmVybGF5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5OwogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpyZWdfYm87CiAJc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzICpyZWdzOwpAQCAtMTQyMSwyNCArMTQyMSwyNCBAQAogCQlyZXQgPSBpOTE1X2dlbV9hdHRhY2hfcGh5c19vYmplY3QoZGV2LCByZWdfYm8sCiAJCQkJCQkgIEk5MTVfR0VNX1BIWVNfT1ZFUkxBWV9SRUdTLAogCQkJCQkJICBQQUdFX1NJWkUpOwotICAgICAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERSTV9FUlJPUigiZmFpbGVkIHRvIGF0dGFjaCBwaHlzIG92ZXJsYXkgcmVnc1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dF9mcmVlX2JvOwotICAgICAgICAgICAgICAgIH0KKwkJaWYgKHJldCkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYXR0YWNoIHBoeXMgb3ZlcmxheSByZWdzXG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWVfYm87CisJCX0KIAkJb3ZlcmxheS0+ZmxpcF9hZGRyID0gcmVnX2JvLT5waHlzX29iai0+aGFuZGxlLT5idXNhZGRyOwogCX0gZWxzZSB7CiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ocmVnX2JvLCBQQUdFX1NJWkUsIHRydWUpOwogCQlpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gb3ZlcmxheSByZWdpc3RlciBib1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dF9mcmVlX2JvOwotICAgICAgICAgICAgICAgIH0KKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHBpbiBvdmVybGF5IHJlZ2lzdGVyIGJvXG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWVfYm87CisJCX0KIAkJb3ZlcmxheS0+ZmxpcF9hZGRyID0gcmVnX2JvLT5ndHRfb2Zmc2V0OwogCiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihyZWdfYm8sIHRydWUpOwogCQlpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk1fRVJST1IoImZhaWxlZCB0byBtb3ZlIG92ZXJsYXkgcmVnaXN0ZXIgYm8gaW50byB0aGUgR1RUXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0X3VucGluX2JvOwotICAgICAgICAgICAgICAgIH0KKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIG1vdmUgb3ZlcmxheSByZWdpc3RlciBibyBpbnRvIHRoZSBHVFRcbiIpOworCQkJZ290byBvdXRfdW5waW5fYm87CisJCX0KIAl9CiAKIAkvKiBpbml0IGFsbCB2YWx1ZXMgKi8KQEAgLTE1MjUsNyArMTUyNSw3IEBACiBzdHJ1Y3QgaW50ZWxfb3ZlcmxheV9lcnJvcl9zdGF0ZSAqCiBpbnRlbF9vdmVybGF5X2NhcHR1cmVfZXJyb3Jfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLSAgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXkgPSBkZXZfcHJpdi0+b3ZlcmxheTsKIAlzdHJ1Y3QgaW50ZWxfb3ZlcmxheV9lcnJvcl9zdGF0ZSAqZXJyb3I7CiAJc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzIF9faW9tZW0gKnJlZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYwppbmRleCBhOWUwYzdiLi40OTlkNGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAkJCWlmIChzY2FsZWRfd2lkdGggPiBzY2FsZWRfaGVpZ2h0KSB7IC8qIHBpbGxhciAqLwogCQkJCXdpZHRoID0gc2NhbGVkX2hlaWdodCAvIG1vZGUtPnZkaXNwbGF5OwogCQkJCWlmICh3aWR0aCAmIDEpCi0JCQkJICAgIAl3aWR0aCsrOworCQkJCQl3aWR0aCsrOwogCQkJCXggPSAoYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgLSB3aWR0aCArIDEpIC8gMjsKIAkJCQl5ID0gMDsKIAkJCQloZWlnaHQgPSBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCQlpZiAoSVNfUElORVZJRVcoZGV2KSkKIAkJCXZhbCA+Pj0gMTsKIAotCQlpZiAoaXNfYmFja2xpZ2h0X2NvbWJpbmF0aW9uX21vZGUoZGV2KSl7CisJCWlmIChpc19iYWNrbGlnaHRfY29tYmluYXRpb25fbW9kZShkZXYpKSB7CiAJCQl1OCBsYnBjOwogCiAJCQl2YWwgJj0gfjE7CkBAIC0yMjYsNyArMjI2LDcgQEAKIAlJOTE1X1dSSVRFKEJMQ19QV01fQ1BVX0NUTCwgdmFsIHwgbGV2ZWwpOwogfQogCi12b2lkIGludGVsX3BhbmVsX3NldF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQorc3RhdGljIHZvaWQgaW50ZWxfcGFuZWxfYWN0dWFsbHlfc2V0X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgdG1wOwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKIAkJcmV0dXJuIGludGVsX3BjaF9wYW5lbF9zZXRfYmFja2xpZ2h0KGRldiwgbGV2ZWwpOwogCi0JaWYgKGlzX2JhY2tsaWdodF9jb21iaW5hdGlvbl9tb2RlKGRldikpeworCWlmIChpc19iYWNrbGlnaHRfY29tYmluYXRpb25fbW9kZShkZXYpKSB7CiAJCXUzMiBtYXggPSBpbnRlbF9wYW5lbF9nZXRfbWF4X2JhY2tsaWdodChkZXYpOwogCQl1OCBsYnBjOwogCkBAIC0yNTQsMTYgKzI1NCwyMSBAQAogCUk5MTVfV1JJVEUoQkxDX1BXTV9DVEwsIHRtcCB8IGxldmVsKTsKIH0KIAordm9pZCBpbnRlbF9wYW5lbF9zZXRfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJZGV2X3ByaXYtPmJhY2tsaWdodF9sZXZlbCA9IGxldmVsOworCWlmIChkZXZfcHJpdi0+YmFja2xpZ2h0X2VuYWJsZWQpCisJCWludGVsX3BhbmVsX2FjdHVhbGx5X3NldF9iYWNrbGlnaHQoZGV2LCBsZXZlbCk7Cit9CisKIHZvaWQgaW50ZWxfcGFuZWxfZGlzYWJsZV9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKGRldl9wcml2LT5iYWNrbGlnaHRfZW5hYmxlZCkgewotCQlkZXZfcHJpdi0+YmFja2xpZ2h0X2xldmVsID0gaW50ZWxfcGFuZWxfZ2V0X2JhY2tsaWdodChkZXYpOwotCQlkZXZfcHJpdi0+YmFja2xpZ2h0X2VuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlpbnRlbF9wYW5lbF9zZXRfYmFja2xpZ2h0KGRldiwgMCk7CisJZGV2X3ByaXYtPmJhY2tsaWdodF9lbmFibGVkID0gZmFsc2U7CisJaW50ZWxfcGFuZWxfYWN0dWFsbHlfc2V0X2JhY2tsaWdodChkZXYsIDApOwogfQogCiB2b2lkIGludGVsX3BhbmVsX2VuYWJsZV9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTI3Myw4ICsyNzgsOCBAQAogCWlmIChkZXZfcHJpdi0+YmFja2xpZ2h0X2xldmVsID09IDApCiAJCWRldl9wcml2LT5iYWNrbGlnaHRfbGV2ZWwgPSBpbnRlbF9wYW5lbF9nZXRfbWF4X2JhY2tsaWdodChkZXYpOwogCi0JaW50ZWxfcGFuZWxfc2V0X2JhY2tsaWdodChkZXYsIGRldl9wcml2LT5iYWNrbGlnaHRfbGV2ZWwpOwogCWRldl9wcml2LT5iYWNrbGlnaHRfZW5hYmxlZCA9IHRydWU7CisJaW50ZWxfcGFuZWxfYWN0dWFsbHlfc2V0X2JhY2tsaWdodChkZXYsIGRldl9wcml2LT5iYWNrbGlnaHRfbGV2ZWwpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF9wYW5lbF9pbml0X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCmluZGV4IGMzMDYyNmUuLmNhNzBlMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKQEAgLTM0LDYgKzM0LDE2IEBACiAjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgImludGVsX2Rydi5oIgogCisvKgorICogOTY1KyBzdXBwb3J0IFBJUEVfQ09OVFJPTCBjb21tYW5kcywgd2hpY2ggcHJvdmlkZSBmaW5lciBncmFpbmVkIGNvbnRyb2wKKyAqIG92ZXIgY2FjaGUgZmx1c2hpbmcuCisgKi8KK3N0cnVjdCBwaXBlX2NvbnRyb2wgeworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJdm9sYXRpbGUgdTMyICpjcHVfcGFnZTsKKwl1MzIgZ3R0X29mZnNldDsKK307CisKIHN0YXRpYyBpbmxpbmUgaW50IHJpbmdfc3BhY2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewogCWludCBzcGFjZSA9IChyaW5nLT5oZWFkICYgSEVBRF9BRERSKSAtIChyaW5nLT50YWlsICsgOCk7CkBAIC0xMjMsNiArMTMzLDExOCBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIEVtaXRzIGEgUElQRV9DT05UUk9MIHdpdGggYSBub24temVybyBwb3N0LXN5bmMgb3BlcmF0aW9uLCBmb3IKKyAqIGltcGxlbWVudGluZyB0d28gd29ya2Fyb3VuZHMgb24gZ2VuNi4gIEZyb20gc2VjdGlvbiAxLjQuNy4xCisgKiAiUElQRV9DT05UUk9MIiBvZiB0aGUgU2FuZHkgQnJpZGdlIFBSTSB2b2x1bWUgMiBwYXJ0IDE6CisgKgorICogW0RldlNOQi1DK3tXL0F9XSBCZWZvcmUgYW55IGRlcHRoIHN0YWxsIGZsdXNoIChpbmNsdWRpbmcgdGhvc2UKKyAqIHByb2R1Y2VkIGJ5IG5vbi1waXBlbGluZWQgc3RhdGUgY29tbWFuZHMpLCBzb2Z0d2FyZSBuZWVkcyB0byBmaXJzdAorICogc2VuZCBhIFBJUEVfQ09OVFJPTCB3aXRoIG5vIGJpdHMgc2V0IGV4Y2VwdCBQb3N0LVN5bmMgT3BlcmF0aW9uICE9CisgKiAwLgorICoKKyAqIFtEZXYtU05Ce1cvQX1dOiBCZWZvcmUgYSBQSVBFX0NPTlRST0wgd2l0aCBXcml0ZSBDYWNoZSBGbHVzaCBFbmFibGUKKyAqID0xLCBhIFBJUEVfQ09OVFJPTCB3aXRoIGFueSBub24temVybyBwb3N0LXN5bmMtb3AgaXMgcmVxdWlyZWQuCisgKgorICogQW5kIHRoZSB3b3JrYXJvdW5kIGZvciB0aGVzZSB0d28gcmVxdWlyZXMgdGhpcyB3b3JrYXJvdW5kIGZpcnN0OgorICoKKyAqIFtEZXYtU05Ce1cvQX1dOiBQaXBlLWNvbnRyb2wgd2l0aCBDUy1zdGFsbCBiaXQgc2V0IG11c3QgYmUgc2VudAorICogQkVGT1JFIHRoZSBwaXBlLWNvbnRyb2wgd2l0aCBhIHBvc3Qtc3luYyBvcCBhbmQgbm8gd3JpdGUtY2FjaGUKKyAqIGZsdXNoZXMuCisgKgorICogQW5kIHRoaXMgbGFzdCB3b3JrYXJvdW5kIGlzIHRyaWNreSBiZWNhdXNlIG9mIHRoZSByZXF1aXJlbWVudHMgb24KKyAqIHRoYXQgYml0LiAgRnJvbSBzZWN0aW9uIDEuNC43LjIuMyAiU3RhbGwiIG9mIHRoZSBTYW5keSBCcmlkZ2UgUFJNCisgKiB2b2x1bWUgMiBwYXJ0IDE6CisgKgorICogICAgICIxIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBhbHNvIGJlIHNldDoKKyAqICAgICAgLSBSZW5kZXIgVGFyZ2V0IENhY2hlIEZsdXNoIEVuYWJsZSAoWzEyXSBvZiBEVzEpCisgKiAgICAgIC0gRGVwdGggQ2FjaGUgRmx1c2ggRW5hYmxlIChbMF0gb2YgRFcxKQorICogICAgICAtIFN0YWxsIGF0IFBpeGVsIFNjb3JlYm9hcmQgKFsxXSBvZiBEVzEpCisgKiAgICAgIC0gRGVwdGggU3RhbGwgKFsxM10gb2YgRFcxKQorICogICAgICAtIFBvc3QtU3luYyBPcGVyYXRpb24gKFsxM10gb2YgRFcxKQorICogICAgICAtIE5vdGlmeSBFbmFibGUgKFs4XSBvZiBEVzEpIgorICoKKyAqIFRoZSBjYWNoZSBmbHVzaGVzIHJlcXVpcmUgdGhlIHdvcmthcm91bmQgZmx1c2ggdGhhdCB0cmlnZ2VyZWQgdGhpcworICogb25lLCBzbyB3ZSBjYW4ndCB1c2UgaXQuICBEZXB0aCBzdGFsbCB3b3VsZCB0cmlnZ2VyIHRoZSBzYW1lLgorICogUG9zdC1zeW5jIG5vbnplcm8gaXMgd2hhdCB0cmlnZ2VyZWQgdGhpcyBzZWNvbmQgd29ya2Fyb3VuZCwgc28gd2UKKyAqIGNhbid0IHVzZSB0aGF0IG9uZSBlaXRoZXIuICBOb3RpZnkgZW5hYmxlIGlzIElSUXMsIHdoaWNoIGFyZW4ndAorICogcmVhbGx5IG91ciBidXNpbmVzcy4gIFRoYXQgbGVhdmVzIG9ubHkgc3RhbGwgYXQgc2NvcmVib2FyZC4KKyAqLworc3RhdGljIGludAoraW50ZWxfZW1pdF9wb3N0X3N5bmNfbm9uemVyb19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJc3RydWN0IHBpcGVfY29udHJvbCAqcGMgPSByaW5nLT5wcml2YXRlOworCXUzMiBzY3JhdGNoX2FkZHIgPSBwYy0+Z3R0X29mZnNldCArIDEyODsKKwlpbnQgcmV0OworCisKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgR0ZYX09QX1BJUEVfQ09OVFJPTCg1KSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIFBJUEVfQ09OVFJPTF9DU19TVEFMTCB8CisJCQlQSVBFX0NPTlRST0xfU1RBTExfQVRfU0NPUkVCT0FSRCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNjcmF0Y2hfYWRkciB8IFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUKTsgLyogYWRkcmVzcyAqLworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsgLyogbG93IGR3b3JkICovCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOyAvKiBoaWdoIGR3b3JkICovCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKworCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWludGVsX3JpbmdfZW1pdChyaW5nLCBHRlhfT1BfUElQRV9DT05UUk9MKDUpKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgUElQRV9DT05UUk9MX1FXX1dSSVRFKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgc2NyYXRjaF9hZGRyIHwgUElQRV9DT05UUk9MX0dMT0JBTF9HVFQpOyAvKiBhZGRyZXNzICovCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfTk9PUCk7CisJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjZfcmVuZGVyX3JpbmdfZmx1c2goc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBpbnZhbGlkYXRlX2RvbWFpbnMsIHUzMiBmbHVzaF9kb21haW5zKQoreworCXUzMiBmbGFncyA9IDA7CisJc3RydWN0IHBpcGVfY29udHJvbCAqcGMgPSByaW5nLT5wcml2YXRlOworCXUzMiBzY3JhdGNoX2FkZHIgPSBwYy0+Z3R0X29mZnNldCArIDEyODsKKwlpbnQgcmV0OworCisJLyogRm9yY2UgU05CIHdvcmthcm91bmRzIGZvciBQSVBFX0NPTlRST0wgZmx1c2hlcyAqLworCWludGVsX2VtaXRfcG9zdF9zeW5jX25vbnplcm9fZmx1c2gocmluZyk7CisKKwkvKiBKdXN0IGZsdXNoIGV2ZXJ5dGhpbmcuICBFeHBlcmltZW50cyBoYXZlIHNob3duIHRoYXQgcmVkdWNpbmcgdGhlCisJICogbnVtYmVyIG9mIGJpdHMgYmFzZWQgb24gdGhlIHdyaXRlIGRvbWFpbnMgaGFzIGxpdHRsZSBwZXJmb3JtYW5jZQorCSAqIGltcGFjdC4KKwkgKi8KKwlmbGFncyB8PSBQSVBFX0NPTlRST0xfUkVOREVSX1RBUkdFVF9DQUNIRV9GTFVTSDsKKwlmbGFncyB8PSBQSVBFX0NPTlRST0xfSU5TVFJVQ1RJT05fQ0FDSEVfSU5WQUxJREFURTsKKwlmbGFncyB8PSBQSVBFX0NPTlRST0xfVEVYVFVSRV9DQUNIRV9JTlZBTElEQVRFOworCWZsYWdzIHw9IFBJUEVfQ09OVFJPTF9ERVBUSF9DQUNIRV9GTFVTSDsKKwlmbGFncyB8PSBQSVBFX0NPTlRST0xfVkZfQ0FDSEVfSU5WQUxJREFURTsKKwlmbGFncyB8PSBQSVBFX0NPTlRST0xfQ09OU1RfQ0FDSEVfSU5WQUxJREFURTsKKwlmbGFncyB8PSBQSVBFX0NPTlRST0xfU1RBVEVfQ0FDSEVfSU5WQUxJREFURTsKKworCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWludGVsX3JpbmdfZW1pdChyaW5nLCBHRlhfT1BfUElQRV9DT05UUk9MKDUpKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgZmxhZ3MpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBzY3JhdGNoX2FkZHIgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOyAvKiBsb3dlciBkd29yZCAqLworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsgLyogdXBwd2VyIGR3b3JkICovCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCByaW5nX3dyaXRlX3RhaWwoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAogCQkJICAgIHUzMiB2YWx1ZSkKIHsKQEAgLTIwNiwxNiArMzI4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIDk2NSsgc3VwcG9ydCBQSVBFX0NPTlRST0wgY29tbWFuZHMsIHdoaWNoIHByb3ZpZGUgZmluZXIgZ3JhaW5lZCBjb250cm9sCi0gKiBvdmVyIGNhY2hlIGZsdXNoaW5nLgotICovCi1zdHJ1Y3QgcGlwZV9jb250cm9sIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwotCXZvbGF0aWxlIHUzMiAqY3B1X3BhZ2U7Ci0JdTMyIGd0dF9vZmZzZXQ7Ci19OwotCiBzdGF0aWMgaW50CiBpbml0X3BpcGVfY29udHJvbChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7CkBAIC0yOTYsOCArNDA4LDcgQEAKIAkJCQkgICBHRlhfTU9ERV9FTkFCTEUoR0ZYX1JFUExBWV9NT0RFKSk7CiAJfQogCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDYpIHsKLQl9IGVsc2UgaWYgKElTX0dFTjUoZGV2KSkgeworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA1KSB7CiAJCXJldCA9IGluaXRfcGlwZV9jb250cm9sKHJpbmcpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKQEAgLTMxNSw4MyArNDI2LDEzMSBAQAogfQogCiBzdGF0aWMgdm9pZAotdXBkYXRlX3NlbWFwaG9yZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBpLCB1MzIgc2Vxbm8pCit1cGRhdGVfbWJveGVzKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkgICAgdTMyIHNlcW5vLAorCSAgICB1MzIgbW1pb19vZmZzZXQpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBpZDsKLQotCS8qCi0JICogY3MgLT4gMSA9IHZjcywgMCA9IGJjcwotCSAqIHZjcyAtPiAxID0gYmNzLCAwID0gY3MsCi0JICogYmNzIC0+IDEgPSBjcywgMCA9IHZjcy4KLQkgKi8KLQlpZCA9IHJpbmcgLSBkZXZfcHJpdi0+cmluZzsKLQlpZCArPSAyIC0gaTsKLQlpZCAlPSAzOwotCi0JaW50ZWxfcmluZ19lbWl0KHJpbmcsCi0JCQlNSV9TRU1BUEhPUkVfTUJPWCB8Ci0JCQlNSV9TRU1BUEhPUkVfUkVHSVNURVIgfAotCQkJTUlfU0VNQVBIT1JFX1VQREFURSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX1NFTUFQSE9SRV9NQk9YIHwKKwkJCSAgICAgIE1JX1NFTUFQSE9SRV9HTE9CQUxfR1RUIHwKKwkJCSAgICAgIE1JX1NFTUFQSE9SRV9SRUdJU1RFUiB8CisJCQkgICAgICBNSV9TRU1BUEhPUkVfVVBEQVRFKTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgc2Vxbm8pOwotCWludGVsX3JpbmdfZW1pdChyaW5nLAotCQkJUklOR19TWU5DXzAoZGV2X3ByaXYtPnJpbmdbaWRdLm1taW9fYmFzZSkgKyA0KmkpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBtbWlvX29mZnNldCk7CiB9CiAKKy8qKgorICogZ2VuNl9hZGRfcmVxdWVzdCAtIFVwZGF0ZSB0aGUgc2VtYXBob3JlIG1haWxib3ggcmVnaXN0ZXJzCisgKiAKKyAqIEByaW5nIC0gcmluZyB0aGF0IGlzIGFkZGluZyBhIHJlcXVlc3QKKyAqIEBzZXFubyAtIHJldHVybiBzZXFubyBzdHVjayBpbnRvIHRoZSByaW5nCisgKgorICogVXBkYXRlIHRoZSBtYWlsYm94IHJlZ2lzdGVycyBpbiB0aGUgKm90aGVyKiByaW5ncyB3aXRoIHRoZSBjdXJyZW50IHNlcW5vLgorICogVGhpcyBhY3RzIGxpa2UgYSBzaWduYWwgaW4gdGhlIGNhbm9uaWNhbCBzZW1hcGhvcmUuCisgKi8KIHN0YXRpYyBpbnQKIGdlbjZfYWRkX3JlcXVlc3Qoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkgdTMyICpyZXN1bHQpCisJCSB1MzIgKnNlcW5vKQogewotCXUzMiBzZXFubzsKKwl1MzIgbWJveDFfcmVnOworCXUzMiBtYm94Ml9yZWc7CiAJaW50IHJldDsKIAogCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgMTApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlzZXFubyA9IGk5MTVfZ2VtX2dldF9zZXFubyhyaW5nLT5kZXYpOwotCXVwZGF0ZV9zZW1hcGhvcmUocmluZywgMCwgc2Vxbm8pOwotCXVwZGF0ZV9zZW1hcGhvcmUocmluZywgMSwgc2Vxbm8pOworCW1ib3gxX3JlZyA9IHJpbmctPnNpZ25hbF9tYm94WzBdOworCW1ib3gyX3JlZyA9IHJpbmctPnNpZ25hbF9tYm94WzFdOwogCisJKnNlcW5vID0gaTkxNV9nZW1fZ2V0X3NlcW5vKHJpbmctPmRldik7CisKKwl1cGRhdGVfbWJveGVzKHJpbmcsICpzZXFubywgbWJveDFfcmVnKTsKKwl1cGRhdGVfbWJveGVzKHJpbmcsICpzZXFubywgbWJveDJfcmVnKTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfU1RPUkVfRFdPUkRfSU5ERVgpOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCBJOTE1X0dFTV9IV1NfSU5ERVggPDwgTUlfU1RPUkVfRFdPUkRfSU5ERVhfU0hJRlQpOwotCWludGVsX3JpbmdfZW1pdChyaW5nLCBzZXFubyk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsICpzZXFubyk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX1VTRVJfSU5URVJSVVBUKTsKIAlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAKLQkqcmVzdWx0ID0gc2Vxbm87CiAJcmV0dXJuIDA7CiB9CiAKLWludAotaW50ZWxfcmluZ19zeW5jKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICp0bywKKy8qKgorICogaW50ZWxfcmluZ19zeW5jIC0gc3luYyB0aGUgd2FpdGVyIHRvIHRoZSBzaWduYWxsZXIgb24gc2Vxbm8KKyAqCisgKiBAd2FpdGVyIC0gcmluZyB0aGF0IGlzIHdhaXRpbmcKKyAqIEBzaWduYWxsZXIgLSByaW5nIHdoaWNoIGhhcywgb3Igd2lsbCBzaWduYWwKKyAqIEBzZXFubyAtIHNlcW5vIHdoaWNoIHRoZSB3YWl0ZXIgd2lsbCBibG9jayBvbgorICovCitzdGF0aWMgaW50CitpbnRlbF9yaW5nX3N5bmMoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICp3YWl0ZXIsCisJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqc2lnbmFsbGVyLAorCQlpbnQgcmluZywKIAkJdTMyIHNlcW5vKQogewogCWludCByZXQ7CisJdTMyIGR3MSA9IE1JX1NFTUFQSE9SRV9NQk9YIHwKKwkJICBNSV9TRU1BUEhPUkVfQ09NUEFSRSB8CisJCSAgTUlfU0VNQVBIT1JFX1JFR0lTVEVSOwogCi0JcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KTsKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHdhaXRlciwgNCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWludGVsX3JpbmdfZW1pdChyaW5nLAotCQkJTUlfU0VNQVBIT1JFX01CT1ggfAotCQkJTUlfU0VNQVBIT1JFX1JFR0lTVEVSIHwKLQkJCWludGVsX3Jpbmdfc3luY19pbmRleChyaW5nLCB0bykgPDwgMTcgfAotCQkJTUlfU0VNQVBIT1JFX0NPTVBBUkUpOwotCWludGVsX3JpbmdfZW1pdChyaW5nLCBzZXFubyk7Ci0JaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOwotCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKLQlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CisJaW50ZWxfcmluZ19lbWl0KHdhaXRlciwgZHcxIHwgc2lnbmFsbGVyLT5zZW1hcGhvcmVfcmVnaXN0ZXJbcmluZ10pOworCWludGVsX3JpbmdfZW1pdCh3YWl0ZXIsIHNlcW5vKTsKKwlpbnRlbF9yaW5nX2VtaXQod2FpdGVyLCAwKTsKKwlpbnRlbF9yaW5nX2VtaXQod2FpdGVyLCBNSV9OT09QKTsKKwlpbnRlbF9yaW5nX2FkdmFuY2Uod2FpdGVyKTsKIAogCXJldHVybiAwOwogfQogCisvKiBWQ1MtPlJDUyAoUlZTWU5DKSBvciBCQ1MtPlJDUyAoUkJTWU5DKSAqLworaW50CityZW5kZXJfcmluZ19zeW5jX3RvKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqd2FpdGVyLAorCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpzaWduYWxsZXIsCisJCSAgICB1MzIgc2Vxbm8pCit7CisJV0FSTl9PTihzaWduYWxsZXItPnNlbWFwaG9yZV9yZWdpc3RlcltSQ1NdID09IE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQpOworCXJldHVybiBpbnRlbF9yaW5nX3N5bmMod2FpdGVyLAorCQkJICAgICAgIHNpZ25hbGxlciwKKwkJCSAgICAgICBSQ1MsCisJCQkgICAgICAgc2Vxbm8pOworfQorCisvKiBSQ1MtPlZDUyAoVlJTWU5DKSBvciBCQ1MtPlZDUyAoVkJTWU5DKSAqLworaW50CitnZW42X2JzZF9yaW5nX3N5bmNfdG8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICp3YWl0ZXIsCisJCSAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqc2lnbmFsbGVyLAorCQkgICAgICB1MzIgc2Vxbm8pCit7CisJV0FSTl9PTihzaWduYWxsZXItPnNlbWFwaG9yZV9yZWdpc3RlcltWQ1NdID09IE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQpOworCXJldHVybiBpbnRlbF9yaW5nX3N5bmMod2FpdGVyLAorCQkJICAgICAgIHNpZ25hbGxlciwKKwkJCSAgICAgICBWQ1MsCisJCQkgICAgICAgc2Vxbm8pOworfQorCisvKiBSQ1MtPkJDUyAoQlJTWU5DKSBvciBWQ1MtPkJDUyAoQlZTWU5DKSAqLworaW50CitnZW42X2JsdF9yaW5nX3N5bmNfdG8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICp3YWl0ZXIsCisJCSAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqc2lnbmFsbGVyLAorCQkgICAgICB1MzIgc2Vxbm8pCit7CisJV0FSTl9PTihzaWduYWxsZXItPnNlbWFwaG9yZV9yZWdpc3RlcltCQ1NdID09IE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQpOworCXJldHVybiBpbnRlbF9yaW5nX3N5bmMod2FpdGVyLAorCQkJICAgICAgIHNpZ25hbGxlciwKKwkJCSAgICAgICBCQ1MsCisJCQkgICAgICAgc2Vxbm8pOworfQorCisKKwogI2RlZmluZSBQSVBFX0NPTlRST0xfRkxVU0gocmluZ19fLCBhZGRyX18pCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotCWludGVsX3JpbmdfZW1pdChyaW5nX18sIEdGWF9PUF9QSVBFX0NPTlRST0wgfCBQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAkJXAotCQkgUElQRV9DT05UUk9MX0RFUFRIX1NUQUxMIHwgMik7CQkJCVwKKwlpbnRlbF9yaW5nX2VtaXQocmluZ19fLCBHRlhfT1BfUElQRV9DT05UUk9MKDQpIHwgUElQRV9DT05UUk9MX1FXX1dSSVRFIHwJCVwKKwkJIFBJUEVfQ09OVFJPTF9ERVBUSF9TVEFMTCk7CQkJCVwKIAlpbnRlbF9yaW5nX2VtaXQocmluZ19fLCAoYWRkcl9fKSB8IFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUKTsJCQlcCiAJaW50ZWxfcmluZ19lbWl0KHJpbmdfXywgMCk7CQkJCQkJCVwKIAlpbnRlbF9yaW5nX2VtaXQocmluZ19fLCAwKTsJCQkJCQkJXApAQCAtNDE5LDggKzU3OCw5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWludGVsX3JpbmdfZW1pdChyaW5nLCBHRlhfT1BfUElQRV9DT05UUk9MIHwgUElQRV9DT05UUk9MX1FXX1dSSVRFIHwKLQkJCVBJUEVfQ09OVFJPTF9XQ19GTFVTSCB8IFBJUEVfQ09OVFJPTF9UQ19GTFVTSCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIEdGWF9PUF9QSVBFX0NPTlRST0woNCkgfCBQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAorCQkJUElQRV9DT05UUk9MX1dSSVRFX0ZMVVNIIHwKKwkJCVBJUEVfQ09OVFJPTF9URVhUVVJFX0NBQ0hFX0lOVkFMSURBVEUpOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCBwYy0+Z3R0X29mZnNldCB8IFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUKTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgc2Vxbm8pOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKQEAgLTQzNSw4ICs1OTUsOSBAQAogCVBJUEVfQ09OVFJPTF9GTFVTSChyaW5nLCBzY3JhdGNoX2FkZHIpOwogCXNjcmF0Y2hfYWRkciArPSAxMjg7CiAJUElQRV9DT05UUk9MX0ZMVVNIKHJpbmcsIHNjcmF0Y2hfYWRkcik7Ci0JaW50ZWxfcmluZ19lbWl0KHJpbmcsIEdGWF9PUF9QSVBFX0NPTlRST0wgfCBQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAotCQkJUElQRV9DT05UUk9MX1dDX0ZMVVNIIHwgUElQRV9DT05UUk9MX1RDX0ZMVVNIIHwKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgR0ZYX09QX1BJUEVfQ09OVFJPTCg0KSB8IFBJUEVfQ09OVFJPTF9RV19XUklURSB8CisJCQlQSVBFX0NPTlRST0xfV1JJVEVfRkxVU0ggfAorCQkJUElQRV9DT05UUk9MX1RFWFRVUkVfQ0FDSEVfSU5WQUxJREFURSB8CiAJCQlQSVBFX0NPTlRST0xfTk9USUZZKTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgcGMtPmd0dF9vZmZzZXQgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNlcW5vKTsKQEAgLTEwMjYsNyArMTE4NywxMiBAQAogCS5pcnFfZ2V0CQk9IHJlbmRlcl9yaW5nX2dldF9pcnEsCiAJLmlycV9wdXQJCT0gcmVuZGVyX3JpbmdfcHV0X2lycSwKIAkuZGlzcGF0Y2hfZXhlY2J1ZmZlcgk9IHJlbmRlcl9yaW5nX2Rpc3BhdGNoX2V4ZWNidWZmZXIsCi0gICAgICAgLmNsZWFudXAJCQk9IHJlbmRlcl9yaW5nX2NsZWFudXAsCisJLmNsZWFudXAJCT0gcmVuZGVyX3JpbmdfY2xlYW51cCwKKwkuc3luY190bwkJPSByZW5kZXJfcmluZ19zeW5jX3RvLAorCS5zZW1hcGhvcmVfcmVnaXN0ZXIJPSB7TUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRCwKKwkJCQkgICBNSV9TRU1BUEhPUkVfU1lOQ19SViwKKwkJCQkgICBNSV9TRU1BUEhPUkVfU1lOQ19SQn0sCisJLnNpZ25hbF9tYm94CQk9IHtHRU42X1ZSU1lOQywgR0VONl9CUlNZTkN9LAogfTsKIAogLyogcmluZyBidWZmZXIgZm9yIGJpdC1zdHJlYW0gZGVjb2RlciAqLwpAQCAtMTA1MCwyMyArMTIxNiwyMyBAQAogc3RhdGljIHZvaWQgZ2VuNl9ic2RfcmluZ193cml0ZV90YWlsKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKIAkJCQkgICAgIHUzMiB2YWx1ZSkKIHsKLSAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAogICAgICAgIC8qIEV2ZXJ5IHRhaWwgbW92ZSBtdXN0IGZvbGxvdyB0aGUgc2VxdWVuY2UgYmVsb3cgKi8KLSAgICAgICBJOTE1X1dSSVRFKEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTCwKLQkgICAgICAgR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX1JDX0lMRExfTUVTU0FHRV9NT0RJRllfTUFTSyB8Ci0JICAgICAgIEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9SQ19JTERMX01FU1NBR0VfRElTQUJMRSk7Ci0gICAgICAgSTkxNV9XUklURShHRU42X0JTRF9STkNJRCwgMHgwKTsKKwlJOTE1X1dSSVRFKEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTCwKKwkJR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX1JDX0lMRExfTUVTU0FHRV9NT0RJRllfTUFTSyB8CisJCUdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9SQ19JTERMX01FU1NBR0VfRElTQUJMRSk7CisJSTkxNV9XUklURShHRU42X0JTRF9STkNJRCwgMHgwKTsKIAotICAgICAgIGlmICh3YWl0X2ZvcigoSTkxNV9SRUFEKEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9JRExFX0lORElDQVRPUikgPT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgNTApKQotICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgSURMRSBJbmRpY2F0b3JcbiIpOworCWlmICh3YWl0X2ZvcigoSTkxNV9SRUFEKEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTCkgJgorCQlHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfSURMRV9JTkRJQ0FUT1IpID09IDAsCisJCTUwKSkKKwlEUk1fRVJST1IoInRpbWVkIG91dCB3YWl0aW5nIGZvciBJRExFIEluZGljYXRvclxuIik7CiAKLSAgICAgICBJOTE1X1dSSVRFX1RBSUwocmluZywgdmFsdWUpOwotICAgICAgIEk5MTVfV1JJVEUoR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MLAotCSAgICAgICBHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfUkNfSUxETF9NRVNTQUdFX01PRElGWV9NQVNLIHwKLQkgICAgICAgR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX1JDX0lMRExfTUVTU0FHRV9FTkFCTEUpOworCUk5MTVfV1JJVEVfVEFJTChyaW5nLCB2YWx1ZSk7CisJSTkxNV9XUklURShHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0wsCisJCUdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9SQ19JTERMX01FU1NBR0VfTU9ESUZZX01BU0sgfAorCQlHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfUkNfSUxETF9NRVNTQUdFX0VOQUJMRSk7CiB9CiAKIHN0YXRpYyBpbnQgZ2VuNl9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKQEAgLTEwOTQsMTggKzEyNjAsMTggQEAKIGdlbjZfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKIAkJCSAgICAgIHUzMiBvZmZzZXQsIHUzMiBsZW4pCiB7Ci0gICAgICAgaW50IHJldDsKKwlpbnQgcmV0OwogCi0gICAgICAgcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCAyKTsKLSAgICAgICBpZiAocmV0KQotCSAgICAgICByZXR1cm4gcmV0OworCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotICAgICAgIGludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOwotICAgICAgIC8qIGJpdDAtNyBpcyB0aGUgbGVuZ3RoIG9uIEdFTjYrICovCi0gICAgICAgaW50ZWxfcmluZ19lbWl0KHJpbmcsIG9mZnNldCk7Ci0gICAgICAgaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOworCS8qIGJpdDAtNyBpcyB0aGUgbGVuZ3RoIG9uIEdFTjYrICovCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIG9mZnNldCk7CisJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOwogCi0gICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBib29sCkBAIC0xMTU0LDYgKzEzMjAsMTEgQEAKIAkuaXJxX2dldAkJPSBnZW42X2JzZF9yaW5nX2dldF9pcnEsCiAJLmlycV9wdXQJCT0gZ2VuNl9ic2RfcmluZ19wdXRfaXJxLAogCS5kaXNwYXRjaF9leGVjYnVmZmVyCT0gZ2VuNl9yaW5nX2Rpc3BhdGNoX2V4ZWNidWZmZXIsCisJLnN5bmNfdG8JCT0gZ2VuNl9ic2RfcmluZ19zeW5jX3RvLAorCS5zZW1hcGhvcmVfcmVnaXN0ZXIJPSB7TUlfU0VNQVBIT1JFX1NZTkNfVlIsCisJCQkJICAgTUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRCwKKwkJCQkgICBNSV9TRU1BUEhPUkVfU1lOQ19WQn0sCisJLnNpZ25hbF9tYm94CQk9IHtHRU42X1JWU1lOQywgR0VONl9CVlNZTkN9LAogfTsKIAogLyogQmxpdHRlciBzdXBwb3J0IChTYW5keUJyaWRnZSspICovCkBAIC0xMjcyLDE5ICsxNDQzLDI0IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgZ2VuNl9ibHRfcmluZyA9IHsKLSAgICAgICAubmFtZQkJCT0gImJsdCByaW5nIiwKLSAgICAgICAuaWQJCQk9IFJJTkdfQkxULAotICAgICAgIC5tbWlvX2Jhc2UJCT0gQkxUX1JJTkdfQkFTRSwKLSAgICAgICAuc2l6ZQkJCT0gMzIgKiBQQUdFX1NJWkUsCi0gICAgICAgLmluaXQJCQk9IGJsdF9yaW5nX2luaXQsCi0gICAgICAgLndyaXRlX3RhaWwJCT0gcmluZ193cml0ZV90YWlsLAotICAgICAgIC5mbHVzaAkJCT0gYmx0X3JpbmdfZmx1c2gsCi0gICAgICAgLmFkZF9yZXF1ZXN0CQk9IGdlbjZfYWRkX3JlcXVlc3QsCi0gICAgICAgLmdldF9zZXFubwkJPSByaW5nX2dldF9zZXFubywKLSAgICAgICAuaXJxX2dldAkJCT0gYmx0X3JpbmdfZ2V0X2lycSwKLSAgICAgICAuaXJxX3B1dAkJCT0gYmx0X3JpbmdfcHV0X2lycSwKLSAgICAgICAuZGlzcGF0Y2hfZXhlY2J1ZmZlcgk9IGdlbjZfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyLAotICAgICAgIC5jbGVhbnVwCQkJPSBibHRfcmluZ19jbGVhbnVwLAorCS5uYW1lCQkJPSAiYmx0IHJpbmciLAorCS5pZAkJCT0gUklOR19CTFQsCisJLm1taW9fYmFzZQkJPSBCTFRfUklOR19CQVNFLAorCS5zaXplCQkJPSAzMiAqIFBBR0VfU0laRSwKKwkuaW5pdAkJCT0gYmx0X3JpbmdfaW5pdCwKKwkud3JpdGVfdGFpbAkJPSByaW5nX3dyaXRlX3RhaWwsCisJLmZsdXNoCQkJPSBibHRfcmluZ19mbHVzaCwKKwkuYWRkX3JlcXVlc3QJCT0gZ2VuNl9hZGRfcmVxdWVzdCwKKwkuZ2V0X3NlcW5vCQk9IHJpbmdfZ2V0X3NlcW5vLAorCS5pcnFfZ2V0CQk9IGJsdF9yaW5nX2dldF9pcnEsCisJLmlycV9wdXQJCT0gYmx0X3JpbmdfcHV0X2lycSwKKwkuZGlzcGF0Y2hfZXhlY2J1ZmZlcgk9IGdlbjZfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyLAorCS5jbGVhbnVwCQk9IGJsdF9yaW5nX2NsZWFudXAsCisJLnN5bmNfdG8JCT0gZ2VuNl9ibHRfcmluZ19zeW5jX3RvLAorCS5zZW1hcGhvcmVfcmVnaXN0ZXIJPSB7TUlfU0VNQVBIT1JFX1NZTkNfQlIsCisJCQkJICAgTUlfU0VNQVBIT1JFX1NZTkNfQlYsCisJCQkJICAgTUlfU0VNQVBIT1JFX1NZTkNfSU5WQUxJRH0sCisJLnNpZ25hbF9tYm94CQk9IHtHRU42X1JCU1lOQywgR0VONl9WQlNZTkN9LAogfTsKIAogaW50IGludGVsX2luaXRfcmVuZGVyX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0xMjk1LDYgKzE0NzEsNyBAQAogCSpyaW5nID0gcmVuZGVyX3Jpbmc7CiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDYpIHsKIAkJcmluZy0+YWRkX3JlcXVlc3QgPSBnZW42X2FkZF9yZXF1ZXN0OworCQlyaW5nLT5mbHVzaCA9IGdlbjZfcmVuZGVyX3JpbmdfZmx1c2g7CiAJCXJpbmctPmlycV9nZXQgPSBnZW42X3JlbmRlcl9yaW5nX2dldF9pcnE7CiAJCXJpbmctPmlycV9wdXQgPSBnZW42X3JlbmRlcl9yaW5nX3B1dF9pcnE7CiAJfSBlbHNlIGlmIChJU19HRU41KGRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaAppbmRleCAzOWFjMmI2Li42ODI4MWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oCkBAIC0yLDEwICsyLDEwIEBACiAjZGVmaW5lIF9JTlRFTF9SSU5HQlVGRkVSX0hfCiAKIGVudW0gewotICAgIFJDUyA9IDB4MCwKLSAgICBWQ1MsCi0gICAgQkNTLAotICAgIEk5MTVfTlVNX1JJTkdTLAorCVJDUyA9IDB4MCwKKwlWQ1MsCisJQkNTLAorCUk5MTVfTlVNX1JJTkdTLAogfTsKIAogc3RydWN0ICBpbnRlbF9od19zdGF0dXNfcGFnZSB7CkBAIC03NSw3ICs3NSwxMiBAQAogCWludAkJKCpkaXNwYXRjaF9leGVjYnVmZmVyKShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCiAJCQkJCSAgICAgICB1MzIgb2Zmc2V0LCB1MzIgbGVuZ3RoKTsKIAl2b2lkCQkoKmNsZWFudXApKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7CisJaW50CQkoKnN5bmNfdG8pKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnRvLAorCQkJCSAgIHUzMiBzZXFubyk7CiAKKwl1MzIJCXNlbWFwaG9yZV9yZWdpc3RlclszXTsgLypvdXIgbWJveCB3cml0dGVuIGJ5IG90aGVycyAqLworCXUzMgkJc2lnbmFsX21ib3hbMl07IC8qIG1ib3hlcyB0aGlzIHJpbmcgc2lnbmFscyB0byAqLwogCS8qKgogCSAqIExpc3Qgb2Ygb2JqZWN0cyBjdXJyZW50bHkgaW52b2x2ZWQgaW4gcmVuZGVyaW5nIGZyb20gdGhlCiAJICogcmluZ2J1ZmZlci4KQEAgLTE4MCw5ICsxODUsNiBAQAogdm9pZCBpbnRlbF9yaW5nX2FkdmFuY2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKIAogdTMyIGludGVsX3JpbmdfZ2V0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Ci1pbnQgaW50ZWxfcmluZ19zeW5jKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqdG8sCi0JCSAgICB1MzIgc2Vxbm8pOwogCiBpbnQgaW50ZWxfaW5pdF9yZW5kZXJfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgaW50ZWxfaW5pdF9ic2RfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKaW5kZXggNjM0OGM0OS4uMzAwM2ZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJkcm1fY3J0Yy5oIgpAQCAtNDMsNyArNDQsNyBAQAogI2RlZmluZSBTRFZPX1RWX01BU0sgICAoU0RWT19PVVRQVVRfQ1ZCUzAgfCBTRFZPX09VVFBVVF9TVklEMCkKIAogI2RlZmluZSBTRFZPX09VVFBVVF9NQVNLIChTRFZPX1RNRFNfTUFTSyB8IFNEVk9fUkdCX01BU0sgfCBTRFZPX0xWRFNfTUFTSyB8XAotICAgICAgICAgICAgICAgICAgICAgICAgIFNEVk9fVFZfTUFTSykKKwkJCVNEVk9fVFZfTUFTSykKIAogI2RlZmluZSBJU19UVihjKQkoYy0+b3V0cHV0X2ZsYWcgJiBTRFZPX1RWX01BU0spCiAjZGVmaW5lIElTX1RNRFMoYykJKGMtPm91dHB1dF9mbGFnICYgU0RWT19UTURTX01BU0spCkBAIC0yODgsMTE3ICsyODksMTE3IEBACiAJdTggY21kOwogCWNvbnN0IGNoYXIgKm5hbWU7CiB9IHNkdm9fY21kX25hbWVzW10gPSB7Ci0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9SRVNFVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfREVWSUNFX0NBUFMpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0ZJUk1XQVJFX1JFViksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVFJBSU5FRF9JTlBVVFMpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0FDVElWRV9PVVRQVVRTKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9BQ1RJVkVfT1VUUFVUUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSU5fT1VUX01BUCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSU5fT1VUX01BUCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQVRUQUNIRURfRElTUExBWVMpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hPVF9QTFVHX1NVUFBPUlQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0FDVElWRV9IT1RfUExVRyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQUNUSVZFX0hPVF9QTFVHKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlRFUlJVUFRfRVZFTlRfU09VUkNFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9UQVJHRVRfSU5QVVQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1RBUkdFVF9PVVRQVVQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0lOUFVUX1RJTUlOR1NfUEFSVDIpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDIpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX09VVFBVVF9USU1JTkdTX1BBUlQxKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9PVVRQVVRfVElNSU5HU19QQVJUMiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfT1VUUFVUX1RJTUlOR1NfUEFSVDEpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09VVFBVVF9USU1JTkdTX1BBUlQyKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0NSRUFURV9QUkVGRVJSRURfSU5QVVRfVElNSU5HKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9QUkVGRVJSRURfSU5QVVRfVElNSU5HX1BBUlQxKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9QUkVGRVJSRURfSU5QVVRfVElNSU5HX1BBUlQyKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlBVVF9QSVhFTF9DTE9DS19SQU5HRSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfT1VUUFVUX1BJWEVMX0NMT0NLX1JBTkdFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TVVBQT1JURURfQ0xPQ0tfUkFURV9NVUxUUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQ0xPQ0tfUkFURV9NVUxUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9DTE9DS19SQVRFX01VTFQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NVUFBPUlRFRF9UVl9GT1JNQVRTKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9UVl9GT1JNQVQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1RWX0ZPUk1BVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX1BPV0VSX1NUQVRFUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfUE9XRVJfU1RBVEUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0VOQ09ERVJfUE9XRVJfU1RBVEUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0RJU1BMQVlfUE9XRVJfU1RBVEUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0NPTlRST0xfQlVTX1NXSVRDSCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU0RUVl9SRVNPTFVUSU9OX1NVUFBPUlQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NDQUxFRF9IRFRWX1JFU09MVVRJT05fU1VQUE9SVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX0VOSEFOQ0VNRU5UUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9SRVNFVCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfREVWSUNFX0NBUFMpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0ZJUk1XQVJFX1JFViksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVFJBSU5FRF9JTlBVVFMpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0FDVElWRV9PVVRQVVRTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9BQ1RJVkVfT1VUUFVUUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSU5fT1VUX01BUCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSU5fT1VUX01BUCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQVRUQUNIRURfRElTUExBWVMpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hPVF9QTFVHX1NVUFBPUlQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0FDVElWRV9IT1RfUExVRyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQUNUSVZFX0hPVF9QTFVHKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlRFUlJVUFRfRVZFTlRfU09VUkNFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9UQVJHRVRfSU5QVVQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1RBUkdFVF9PVVRQVVQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0lOUFVUX1RJTUlOR1NfUEFSVDIpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDIpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX09VVFBVVF9USU1JTkdTX1BBUlQxKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9PVVRQVVRfVElNSU5HU19QQVJUMiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfT1VUUFVUX1RJTUlOR1NfUEFSVDEpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09VVFBVVF9USU1JTkdTX1BBUlQyKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0NSRUFURV9QUkVGRVJSRURfSU5QVVRfVElNSU5HKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9QUkVGRVJSRURfSU5QVVRfVElNSU5HX1BBUlQxKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9QUkVGRVJSRURfSU5QVVRfVElNSU5HX1BBUlQyKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlBVVF9QSVhFTF9DTE9DS19SQU5HRSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfT1VUUFVUX1BJWEVMX0NMT0NLX1JBTkdFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TVVBQT1JURURfQ0xPQ0tfUkFURV9NVUxUUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQ0xPQ0tfUkFURV9NVUxUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9DTE9DS19SQVRFX01VTFQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NVUFBPUlRFRF9UVl9GT1JNQVRTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9UVl9GT1JNQVQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1RWX0ZPUk1BVCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX1BPV0VSX1NUQVRFUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfUE9XRVJfU1RBVEUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0VOQ09ERVJfUE9XRVJfU1RBVEUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0RJU1BMQVlfUE9XRVJfU1RBVEUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0NPTlRST0xfQlVTX1NXSVRDSCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU0RUVl9SRVNPTFVUSU9OX1NVUFBPUlQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NDQUxFRF9IRFRWX1JFU09MVVRJT05fU1VQUE9SVCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX0VOSEFOQ0VNRU5UUyksCiAKLSAgICAvKiBBZGQgdGhlIG9wIGNvZGUgZm9yIFNEVk8gZW5oYW5jZW1lbnRzICovCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0hQT1MpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hQT1MpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0hQT1MpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9WUE9TKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9WUE9TKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9WUE9TKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfU0FUVVJBVElPTiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU0FUVVJBVElPTiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfU0FUVVJBVElPTiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0hVRSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSFVFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9IVUUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9DT05UUkFTVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQ09OVFJBU1QpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0NPTlRSQVNUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfQlJJR0hUTkVTUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQlJJR0hUTkVTUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQlJJR0hUTkVTUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX09WRVJTQ0FOX0gpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09WRVJTQ0FOX0gpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX09WRVJTQ0FOX0gpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9PVkVSU0NBTl9WKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9PVkVSU0NBTl9WKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9PVkVSU0NBTl9WKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfRkxJQ0tFUl9GSUxURVIpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0ZMSUNLRVJfRklMVEVSKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9GTElDS0VSX0ZJTFRFUiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0ZMSUNLRVJfRklMVEVSX0FEQVBUSVZFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9GTElDS0VSX0ZJTFRFUl9BREFQVElWRSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfRkxJQ0tFUl9GSUxURVJfQURBUFRJVkUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9GTElDS0VSX0ZJTFRFUl8yRCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfRkxJQ0tFUl9GSUxURVJfMkQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0ZMSUNLRVJfRklMVEVSXzJEKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfU0hBUlBORVNTKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TSEFSUE5FU1MpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1NIQVJQTkVTUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfRE9UX0NSQVdMKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9ET1RfQ1JBV0wpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9UVl9DSFJPTUFfRklMVEVSKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9UVl9DSFJPTUFfRklMVEVSKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9UVl9DSFJPTUFfRklMVEVSKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfVFZfTFVNQV9GSUxURVIpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1RWX0xVTUFfRklMVEVSKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9UVl9MVU1BX0ZJTFRFUiksCisJLyogQWRkIHRoZSBvcCBjb2RlIGZvciBTRFZPIGVuaGFuY2VtZW50cyAqLworCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9IUE9TKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IUE9TKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9IUE9TKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfVlBPUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVlBPUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfVlBPUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX1NBVFVSQVRJT04pLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NBVFVSQVRJT04pLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1NBVFVSQVRJT04pLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9IVUUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hVRSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSFVFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfQ09OVFJBU1QpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0NPTlRSQVNUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9DT05UUkFTVCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0JSSUdIVE5FU1MpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0JSSUdIVE5FU1MpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0JSSUdIVE5FU1MpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9PVkVSU0NBTl9IKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9PVkVSU0NBTl9IKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9PVkVSU0NBTl9IKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfT1ZFUlNDQU5fViksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfT1ZFUlNDQU5fViksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfT1ZFUlNDQU5fViksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0ZMSUNLRVJfRklMVEVSKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9GTElDS0VSX0ZJTFRFUiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfRkxJQ0tFUl9GSUxURVIpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9GTElDS0VSX0ZJTFRFUl9BREFQVElWRSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfRkxJQ0tFUl9GSUxURVJfQURBUFRJVkUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0ZMSUNLRVJfRklMVEVSX0FEQVBUSVZFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfRkxJQ0tFUl9GSUxURVJfMkQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0ZMSUNLRVJfRklMVEVSXzJEKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9GTElDS0VSX0ZJTFRFUl8yRCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX1NIQVJQTkVTUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU0hBUlBORVNTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9TSEFSUE5FU1MpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0RPVF9DUkFXTCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfRE9UX0NSQVdMKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfVFZfQ0hST01BX0ZJTFRFUiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVFZfQ0hST01BX0ZJTFRFUiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfVFZfQ0hST01BX0ZJTFRFUiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX1RWX0xVTUFfRklMVEVSKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9UVl9MVU1BX0ZJTFRFUiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfVFZfTFVNQV9GSUxURVIpLAogCi0gICAgLyogSERNSSBvcCBjb2RlICovCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU1VQUF9FTkNPREUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0VOQ09ERSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfRU5DT0RFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9QSVhFTF9SRVBMSSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfUElYRUxfUkVQTEkpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0NPTE9SSU1FVFJZX0NBUCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQ09MT1JJTUVUUlkpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0NPTE9SSU1FVFJZKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9BVURJT19FTkNSWVBUX1BSRUZFUiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQVVESU9fU1RBVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQVVESU9fU1RBVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSEJVRl9JTkRFWCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSEJVRl9JTkRFWCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSEJVRl9JTkZPKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IQlVGX0FWX1NQTElUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9IQlVGX0FWX1NQTElUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IQlVGX1RYUkFURSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSEJVRl9UWFJBVEUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0hCVUZfREFUQSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSEJVRl9EQVRBKSwKKwkvKiBIRE1JIG9wIGNvZGUgKi8KKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TVVBQX0VOQ09ERSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfRU5DT0RFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9FTkNPREUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1BJWEVMX1JFUExJKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9QSVhFTF9SRVBMSSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQ09MT1JJTUVUUllfQ0FQKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9DT0xPUklNRVRSWSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQ09MT1JJTUVUUlkpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0FVRElPX0VOQ1JZUFRfUFJFRkVSKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9BVURJT19TVEFUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9BVURJT19TVEFUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IQlVGX0lOREVYKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9IQlVGX0lOREVYKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IQlVGX0lORk8pLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hCVUZfQVZfU1BMSVQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0hCVUZfQVZfU1BMSVQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hCVUZfVFhSQVRFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9IQlVGX1RYUkFURSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSEJVRl9EQVRBKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IQlVGX0RBVEEpLAogfTsKIAogI2RlZmluZSBJU19TRFZPQihyZWcpCShyZWcgPT0gU0RWT0IgfHwgcmVnID09IFBDSF9TRFZPQikKQEAgLTEyMzIsOCArMTIzMyw3IEBACiBpbnRlbF9zZHZvX211bHRpZnVuY19lbmNvZGVyKHN0cnVjdCBpbnRlbF9zZHZvICppbnRlbF9zZHZvKQogewogCS8qIElzIHRoZXJlIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBvdXRwdXQ/ICovCi0JaW50IGNhcHMgPSBpbnRlbF9zZHZvLT5jYXBzLm91dHB1dF9mbGFncyAmIDB4ZjsKLQlyZXR1cm4gY2FwcyAmIC1jYXBzOworCXJldHVybiBod2VpZ2h0MTYoaW50ZWxfc2R2by0+Y2Fwcy5vdXRwdXRfZmxhZ3MpID4gMTsKIH0KIAogc3RhdGljIHN0cnVjdCBlZGlkICoKQEAgLTEyNTQsNyArMTI1NCw3IEBACiB9CiAKIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKLWludGVsX3Nkdm9faGRtaV9zaW5rX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoraW50ZWxfc2R2b190bWRzX3NpbmtfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGludGVsX3Nkdm8gKmludGVsX3Nkdm8gPSBpbnRlbF9hdHRhY2hlZF9zZHZvKGNvbm5lY3Rvcik7CiAJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXM7CkBAIC0xMzQ5LDcgKzEzNDksNyBAQAogCWlmICgoaW50ZWxfc2R2b19jb25uZWN0b3ItPm91dHB1dF9mbGFnICYgcmVzcG9uc2UpID09IDApCiAJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwogCWVsc2UgaWYgKElTX1RNRFMoaW50ZWxfc2R2b19jb25uZWN0b3IpKQotCQlyZXQgPSBpbnRlbF9zZHZvX2hkbWlfc2lua19kZXRlY3QoY29ubmVjdG9yKTsKKwkJcmV0ID0gaW50ZWxfc2R2b190bWRzX3NpbmtfZGV0ZWN0KGNvbm5lY3Rvcik7CiAJZWxzZSB7CiAJCXN0cnVjdCBlZGlkICplZGlkOwogCkBAIC0xODk2LDcgKzE4OTYsNyBAQAogCQkJICBzdHJ1Y3QgaW50ZWxfc2R2byAqc2R2bywgdTMyIHJlZykKIHsKIAlzdHJ1Y3Qgc2R2b19kZXZpY2VfbWFwcGluZyAqbWFwcGluZzsKLQl1OCBwaW4sIHNwZWVkOworCXU4IHBpbjsKIAogCWlmIChJU19TRFZPQihyZWcpKQogCQltYXBwaW5nID0gJmRldl9wcml2LT5zZHZvX21hcHBpbmdzWzBdOwpAQCAtMTkwNCwxOCArMTkwNCwxNiBAQAogCQltYXBwaW5nID0gJmRldl9wcml2LT5zZHZvX21hcHBpbmdzWzFdOwogCiAJcGluID0gR01CVVNfUE9SVF9EUEI7Ci0Jc3BlZWQgPSBHTUJVU19SQVRFXzFNSFogPj4gODsKLQlpZiAobWFwcGluZy0+aW5pdGlhbGl6ZWQpIHsKKwlpZiAobWFwcGluZy0+aW5pdGlhbGl6ZWQpCiAJCXBpbiA9IG1hcHBpbmctPmkyY19waW47Ci0JCXNwZWVkID0gbWFwcGluZy0+aTJjX3NwZWVkOwotCX0KIAogCWlmIChwaW4gPCBHTUJVU19OVU1fUE9SVFMpIHsKIAkJc2R2by0+aTJjID0gJmRldl9wcml2LT5nbWJ1c1twaW5dLmFkYXB0ZXI7Ci0JCWludGVsX2dtYnVzX3NldF9zcGVlZChzZHZvLT5pMmMsIHNwZWVkKTsKKwkJaW50ZWxfZ21idXNfc2V0X3NwZWVkKHNkdm8tPmkyYywgR01CVVNfUkFURV8xTUhaKTsKIAkJaW50ZWxfZ21idXNfZm9yY2VfYml0KHNkdm8tPmkyYywgdHJ1ZSk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJc2R2by0+aTJjID0gJmRldl9wcml2LT5nbWJ1c1tHTUJVU19QT1JUX0RQQl0uYWRhcHRlcjsKKwl9CiB9CiAKIHN0YXRpYyBib29sCkBAIC0yMjA2LDcgKzIyMDQsNyBAQAogCQkJICAgICAgYnl0ZXNbMF0sIGJ5dGVzWzFdKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQlpbnRlbF9zZHZvLT5iYXNlLmNydGNfbWFzayA9ICgxIDw8IDApIHwgKDEgPDwgMSk7CisJaW50ZWxfc2R2by0+YmFzZS5jcnRjX21hc2sgPSAoMSA8PCAwKSB8ICgxIDw8IDEpIHwgKDEgPDwgMik7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTIyNzUsNyArMjI3Myw3IEBACiAJCURSTV9ERUJVR19LTVMoI25hbWUgIjogbWF4ICVkLCBkZWZhdWx0ICVkLCBjdXJyZW50ICVkXG4iLCBcCiAJCQkgICAgICBkYXRhX3ZhbHVlWzBdLCBkYXRhX3ZhbHVlWzFdLCByZXNwb25zZSk7IFwKIAl9IFwKLX0gd2hpbGUoMCkKK30gd2hpbGUgKDApCiAKIHN0YXRpYyBib29sCiBpbnRlbF9zZHZvX2NyZWF0ZV9lbmhhbmNlX3Byb3BlcnR5X3R2KHN0cnVjdCBpbnRlbF9zZHZvICppbnRlbF9zZHZvLApAQCAtMjQ0Miw3ICsyNDQwLDcgQEAKIAogCWlmIChJU19UVihpbnRlbF9zZHZvX2Nvbm5lY3RvcikpCiAJCXJldHVybiBpbnRlbF9zZHZvX2NyZWF0ZV9lbmhhbmNlX3Byb3BlcnR5X3R2KGludGVsX3Nkdm8sIGludGVsX3Nkdm9fY29ubmVjdG9yLCBlbmhhbmNlbWVudHMucmVwbHkpOwotCWVsc2UgaWYoSVNfTFZEUyhpbnRlbF9zZHZvX2Nvbm5lY3RvcikpCisJZWxzZSBpZiAoSVNfTFZEUyhpbnRlbF9zZHZvX2Nvbm5lY3RvcikpCiAJCXJldHVybiBpbnRlbF9zZHZvX2NyZWF0ZV9lbmhhbmNlX3Byb3BlcnR5X2x2ZHMoaW50ZWxfc2R2bywgaW50ZWxfc2R2b19jb25uZWN0b3IsIGVuaGFuY2VtZW50cy5yZXBseSk7CiAJZWxzZQogCQlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm9fcmVncy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2b19yZWdzLmgKaW5kZXggNGY0ZTIzYi4uNGFhNmYzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2b19yZWdzLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2b19yZWdzLmgKQEAgLTQ2LDYzICs0Niw2MyBAQAogI2RlZmluZSBTRFZPX09VVFBVVF9MQVNUICAgICgxNCkKIAogc3RydWN0IGludGVsX3Nkdm9fY2FwcyB7Ci0gICAgdTggdmVuZG9yX2lkOwotICAgIHU4IGRldmljZV9pZDsKLSAgICB1OCBkZXZpY2VfcmV2X2lkOwotICAgIHU4IHNkdm9fdmVyc2lvbl9tYWpvcjsKLSAgICB1OCBzZHZvX3ZlcnNpb25fbWlub3I7Ci0gICAgdW5zaWduZWQgaW50IHNkdm9faW5wdXRzX21hc2s6MjsKLSAgICB1bnNpZ25lZCBpbnQgc21vb3RoX3NjYWxpbmc6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2hhcnBfc2NhbGluZzoxOwotICAgIHVuc2lnbmVkIGludCB1cF9zY2FsaW5nOjE7Ci0gICAgdW5zaWduZWQgaW50IGRvd25fc2NhbGluZzoxOwotICAgIHVuc2lnbmVkIGludCBzdGFsbF9zdXBwb3J0OjE7Ci0gICAgdW5zaWduZWQgaW50IHBhZDoxOwotICAgIHUxNiBvdXRwdXRfZmxhZ3M7CisJdTggdmVuZG9yX2lkOworCXU4IGRldmljZV9pZDsKKwl1OCBkZXZpY2VfcmV2X2lkOworCXU4IHNkdm9fdmVyc2lvbl9tYWpvcjsKKwl1OCBzZHZvX3ZlcnNpb25fbWlub3I7CisJdW5zaWduZWQgaW50IHNkdm9faW5wdXRzX21hc2s6MjsKKwl1bnNpZ25lZCBpbnQgc21vb3RoX3NjYWxpbmc6MTsKKwl1bnNpZ25lZCBpbnQgc2hhcnBfc2NhbGluZzoxOworCXVuc2lnbmVkIGludCB1cF9zY2FsaW5nOjE7CisJdW5zaWduZWQgaW50IGRvd25fc2NhbGluZzoxOworCXVuc2lnbmVkIGludCBzdGFsbF9zdXBwb3J0OjE7CisJdW5zaWduZWQgaW50IHBhZDoxOworCXUxNiBvdXRwdXRfZmxhZ3M7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiogVGhpcyBtYXRjaGVzIHRoZSBFRElEIERURCBzdHJ1Y3R1cmUsIG1vcmUgb3IgbGVzcyAqLwogc3RydWN0IGludGVsX3Nkdm9fZHRkIHsKLSAgICBzdHJ1Y3QgewotCXUxNiBjbG9jazsJCS8qKjwgcGl4ZWwgY2xvY2ssIGluIDEwa0h6IHVuaXRzICovCi0JdTggaF9hY3RpdmU7CQkvKio8IGxvd2VyIDggYml0cyAocGl4ZWxzKSAqLwotCXU4IGhfYmxhbms7CQkvKio8IGxvd2VyIDggYml0cyAocGl4ZWxzKSAqLwotCXU4IGhfaGlnaDsJCS8qKjwgdXBwZXIgNCBiaXRzIGVhY2ggaF9hY3RpdmUsIGhfYmxhbmsgKi8KLQl1OCB2X2FjdGl2ZTsJCS8qKjwgbG93ZXIgOCBiaXRzIChsaW5lcykgKi8KLQl1OCB2X2JsYW5rOwkJLyoqPCBsb3dlciA4IGJpdHMgKGxpbmVzKSAqLwotCXU4IHZfaGlnaDsJCS8qKjwgdXBwZXIgNCBiaXRzIGVhY2ggdl9hY3RpdmUsIHZfYmxhbmsgKi8KLSAgICB9IHBhcnQxOworCXN0cnVjdCB7CisJCXUxNiBjbG9jazsJLyoqPCBwaXhlbCBjbG9jaywgaW4gMTBrSHogdW5pdHMgKi8KKwkJdTggaF9hY3RpdmU7CS8qKjwgbG93ZXIgOCBiaXRzIChwaXhlbHMpICovCisJCXU4IGhfYmxhbms7CS8qKjwgbG93ZXIgOCBiaXRzIChwaXhlbHMpICovCisJCXU4IGhfaGlnaDsJLyoqPCB1cHBlciA0IGJpdHMgZWFjaCBoX2FjdGl2ZSwgaF9ibGFuayAqLworCQl1OCB2X2FjdGl2ZTsJLyoqPCBsb3dlciA4IGJpdHMgKGxpbmVzKSAqLworCQl1OCB2X2JsYW5rOwkvKio8IGxvd2VyIDggYml0cyAobGluZXMpICovCisJCXU4IHZfaGlnaDsJLyoqPCB1cHBlciA0IGJpdHMgZWFjaCB2X2FjdGl2ZSwgdl9ibGFuayAqLworCX0gcGFydDE7CiAKLSAgICBzdHJ1Y3QgewotCXU4IGhfc3luY19vZmY7CS8qKjwgbG93ZXIgOCBiaXRzLCBmcm9tIGhibGFuayBzdGFydCAqLwotCXU4IGhfc3luY193aWR0aDsJLyoqPCBsb3dlciA4IGJpdHMgKHBpeGVscykgKi8KLQkvKiogbG93ZXIgNCBiaXRzIGVhY2ggdnN5bmMgb2Zmc2V0LCB2c3luYyB3aWR0aCAqLwotCXU4IHZfc3luY19vZmZfd2lkdGg7Ci0JLyoqCi0JICogMiBoaWdoIGJpdHMgb2YgaHN5bmMgb2Zmc2V0LCAyIGhpZ2ggYml0cyBvZiBoc3luYyB3aWR0aCwKLQkgKiBiaXRzIDQtNSBvZiB2c3luYyBvZmZzZXQsIGFuZCAyIGhpZ2ggYml0cyBvZiB2c3luYyB3aWR0aC4KLQkgKi8KLQl1OCBzeW5jX29mZl93aWR0aF9oaWdoOwotCXU4IGR0ZF9mbGFnczsKLQl1OCBzZHZvX2ZsYWdzOwotCS8qKiBiaXRzIDYtNyBvZiB2c3luYyBvZmZzZXQgYXQgYml0cyA2LTcgKi8KLQl1OCB2X3N5bmNfb2ZmX2hpZ2g7Ci0JdTggcmVzZXJ2ZWQ7Ci0gICAgfSBwYXJ0MjsKKwlzdHJ1Y3QgeworCQl1OCBoX3N5bmNfb2ZmOwkvKio8IGxvd2VyIDggYml0cywgZnJvbSBoYmxhbmsgc3RhcnQgKi8KKwkJdTggaF9zeW5jX3dpZHRoOwkvKio8IGxvd2VyIDggYml0cyAocGl4ZWxzKSAqLworCQkvKiogbG93ZXIgNCBiaXRzIGVhY2ggdnN5bmMgb2Zmc2V0LCB2c3luYyB3aWR0aCAqLworCQl1OCB2X3N5bmNfb2ZmX3dpZHRoOworCQkvKioKKwkJKiAyIGhpZ2ggYml0cyBvZiBoc3luYyBvZmZzZXQsIDIgaGlnaCBiaXRzIG9mIGhzeW5jIHdpZHRoLAorCQkqIGJpdHMgNC01IG9mIHZzeW5jIG9mZnNldCwgYW5kIDIgaGlnaCBiaXRzIG9mIHZzeW5jIHdpZHRoLgorCQkqLworCQl1OCBzeW5jX29mZl93aWR0aF9oaWdoOworCQl1OCBkdGRfZmxhZ3M7CisJCXU4IHNkdm9fZmxhZ3M7CisJCS8qKiBiaXRzIDYtNyBvZiB2c3luYyBvZmZzZXQgYXQgYml0cyA2LTcgKi8KKwkJdTggdl9zeW5jX29mZl9oaWdoOworCQl1OCByZXNlcnZlZDsKKwl9IHBhcnQyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGludGVsX3Nkdm9fcGl4ZWxfY2xvY2tfcmFuZ2UgewotICAgIHUxNiBtaW47CQkJLyoqPCBwaXhlbCBjbG9jaywgaW4gMTBrSHogdW5pdHMgKi8KLSAgICB1MTYgbWF4OwkJCS8qKjwgcGl4ZWwgY2xvY2ssIGluIDEwa0h6IHVuaXRzICovCisJdTE2IG1pbjsJLyoqPCBwaXhlbCBjbG9jaywgaW4gMTBrSHogdW5pdHMgKi8KKwl1MTYgbWF4OwkvKio8IHBpeGVsIGNsb2NrLCBpbiAxMGtIeiB1bml0cyAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGludGVsX3Nkdm9fcHJlZmVycmVkX2lucHV0X3RpbWluZ19hcmdzIHsKLSAgICB1MTYgY2xvY2s7Ci0gICAgdTE2IHdpZHRoOwotICAgIHUxNiBoZWlnaHQ7Ci0gICAgdTgJaW50ZXJsYWNlOjE7Ci0gICAgdTgJc2NhbGVkOjE7Ci0gICAgdTgJcGFkOjY7CisJdTE2IGNsb2NrOworCXUxNiB3aWR0aDsKKwl1MTYgaGVpZ2h0OworCXU4CWludGVybGFjZToxOworCXU4CXNjYWxlZDoxOworCXU4CXBhZDo2OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogSTJDIHJlZ2lzdGVycyBmb3IgU0RWTyAqLwpAQCAtMTU0LDkgKzE1NCw5IEBACiAgKi8KICNkZWZpbmUgU0RWT19DTURfR0VUX1RSQUlORURfSU5QVVRTCQkJMHgwMwogc3RydWN0IGludGVsX3Nkdm9fZ2V0X3RyYWluZWRfaW5wdXRzX3Jlc3BvbnNlIHsKLSAgICB1bnNpZ25lZCBpbnQgaW5wdXQwX3RyYWluZWQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgaW5wdXQxX3RyYWluZWQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkOjY7CisJdW5zaWduZWQgaW50IGlucHV0MF90cmFpbmVkOjE7CisJdW5zaWduZWQgaW50IGlucHV0MV90cmFpbmVkOjE7CisJdW5zaWduZWQgaW50IHBhZDo2OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoqIFJldHVybnMgYSBzdHJ1Y3QgaW50ZWxfc2R2b19vdXRwdXRfZmxhZ3Mgb2YgYWN0aXZlIG91dHB1dHMuICovCkBAIC0xNzcsNyArMTc3LDcgQEAKICAqLwogI2RlZmluZSBTRFZPX0NNRF9HRVRfSU5fT1VUX01BUAkJCQkweDA2CiBzdHJ1Y3QgaW50ZWxfc2R2b19pbl9vdXRfbWFwIHsKLSAgICB1MTYgaW4wLCBpbjE7CisJdTE2IGluMCwgaW4xOwogfTsKIAogLyoqCkBAIC0yMTAsMTAgKzIxMCwxMCBAQAogCiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9JTlRFUlJVUFRfRVZFTlRfU09VUkNFCQkweDBmCiBzdHJ1Y3QgaW50ZWxfc2R2b19nZXRfaW50ZXJydXB0X2V2ZW50X3NvdXJjZV9yZXNwb25zZSB7Ci0gICAgdTE2IGludGVycnVwdF9zdGF0dXM7Ci0gICAgdW5zaWduZWQgaW50IGFtYmllbnRfbGlnaHRfaW50ZXJydXB0OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkbWlfYXVkaW9fZW5jcnlwdF9jaGFuZ2U6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkOjY7CisJdTE2IGludGVycnVwdF9zdGF0dXM7CisJdW5zaWduZWQgaW50IGFtYmllbnRfbGlnaHRfaW50ZXJydXB0OjE7CisJdW5zaWduZWQgaW50IGhkbWlfYXVkaW9fZW5jcnlwdF9jaGFuZ2U6MTsKKwl1bnNpZ25lZCBpbnQgcGFkOjY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKioKQEAgLTIyNSw4ICsyMjUsOCBAQAogICovCiAjZGVmaW5lIFNEVk9fQ01EX1NFVF9UQVJHRVRfSU5QVVQJCQkweDEwCiBzdHJ1Y3QgaW50ZWxfc2R2b19zZXRfdGFyZ2V0X2lucHV0X2FyZ3MgewotICAgIHVuc2lnbmVkIGludCB0YXJnZXRfMToxOwotICAgIHVuc2lnbmVkIGludCBwYWQ6NzsKKwl1bnNpZ25lZCBpbnQgdGFyZ2V0XzE6MTsKKwl1bnNpZ25lZCBpbnQgcGFkOjc7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKioKQEAgLTMxNCw1NyArMzE0LDU3IEBACiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9TVVBQT1JURURfVFZfRk9STUFUUwkJMHgyNwogLyoqIDYgYnl0ZXMgb2YgYml0IGZsYWdzIGZvciBUViBmb3JtYXRzIHNoYXJlZCBieSBhbGwgVFYgZm9ybWF0IGZ1bmN0aW9ucyAqLwogc3RydWN0IGludGVsX3Nkdm9fdHZfZm9ybWF0IHsKLSAgICB1bnNpZ25lZCBpbnQgbnRzY19tOjE7Ci0gICAgdW5zaWduZWQgaW50IG50c2NfajoxOwotICAgIHVuc2lnbmVkIGludCBudHNjXzQ0MzoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfYjoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfZDoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfZzoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfaDoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfaToxOworCXVuc2lnbmVkIGludCBudHNjX206MTsKKwl1bnNpZ25lZCBpbnQgbnRzY19qOjE7CisJdW5zaWduZWQgaW50IG50c2NfNDQzOjE7CisJdW5zaWduZWQgaW50IHBhbF9iOjE7CisJdW5zaWduZWQgaW50IHBhbF9kOjE7CisJdW5zaWduZWQgaW50IHBhbF9nOjE7CisJdW5zaWduZWQgaW50IHBhbF9oOjE7CisJdW5zaWduZWQgaW50IHBhbF9pOjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgcGFsX206MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX246MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX25jOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhbF82MDoxOwotICAgIHVuc2lnbmVkIGludCBzZWNhbV9iOjE7Ci0gICAgdW5zaWduZWQgaW50IHNlY2FtX2Q6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2VjYW1fZzoxOwotICAgIHVuc2lnbmVkIGludCBzZWNhbV9rOjE7CisJdW5zaWduZWQgaW50IHBhbF9tOjE7CisJdW5zaWduZWQgaW50IHBhbF9uOjE7CisJdW5zaWduZWQgaW50IHBhbF9uYzoxOworCXVuc2lnbmVkIGludCBwYWxfNjA6MTsKKwl1bnNpZ25lZCBpbnQgc2VjYW1fYjoxOworCXVuc2lnbmVkIGludCBzZWNhbV9kOjE7CisJdW5zaWduZWQgaW50IHNlY2FtX2c6MTsKKwl1bnNpZ25lZCBpbnQgc2VjYW1fazoxOwogCi0gICAgdW5zaWduZWQgaW50IHNlY2FtX2sxOjE7Ci0gICAgdW5zaWduZWQgaW50IHNlY2FtX2w6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2VjYW1fNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjQwbV8xMDgwaV81OToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNDBtXzEwODBpXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI2MG1fMTA4MGlfNTk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjYwbV8xMDgwaV82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBpXzUwOjE7CisJdW5zaWduZWQgaW50IHNlY2FtX2sxOjE7CisJdW5zaWduZWQgaW50IHNlY2FtX2w6MTsKKwl1bnNpZ25lZCBpbnQgc2VjYW1fNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjQwbV8xMDgwaV81OToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNDBtXzEwODBpXzYwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI2MG1fMTA4MGlfNTk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjYwbV8xMDgwaV82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBpXzUwOjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwaV81OToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBpXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjM6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yNDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzI1OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8zMDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MGlfNTk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwaV82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzIzOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjQ6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yNToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzI5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMzA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF81MDoxOwogCi0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfNTk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTVtXzEwODBpXzUwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5NW1fMTA4MHBfNTA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk2bV83MjBwXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5Nm1fNzIwcF82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTZtXzcyMHBfNTA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjkzbV80ODBwXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfNTk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTVtXzEwODBpXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5NW1fMTA4MHBfNTA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk2bV83MjBwXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5Nm1fNzIwcF82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTZtXzcyMHBfNTA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjkzbV80ODBwXzU5OjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMTcwbV80ODBpXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX2l0dXJidDYwMV81NzZpXzUwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX2l0dXJidDYwMV81NzZwXzUwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX2VpYV83NzAyYV80ODBpXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX2VpYV83NzAyYV80ODBwXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhZDozOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8xNzBtXzQ4MGlfNTk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfaXR1cmJ0NjAxXzU3NmlfNTA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfaXR1cmJ0NjAxXzU3NnBfNTA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfZWlhXzc3MDJhXzQ4MGlfNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfZWlhXzc3MDJhXzQ4MHBfNjA6MTsKKwl1bnNpZ25lZCBpbnQgcGFkOjM7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9UVl9GT1JNQVQJCQkJMHgyOApAQCAtMzc0LDUzICszNzQsNTMgQEAKIC8qKiBSZXR1cm5zIHRoZSByZXNvbHV0aW9zbiB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIGdpdmVuIFRWIGZvcm1hdCAqLwogI2RlZmluZSBTRFZPX0NNRF9HRVRfU0RUVl9SRVNPTFVUSU9OX1NVUFBPUlQJCTB4ODMKIHN0cnVjdCBpbnRlbF9zZHZvX3NkdHZfcmVzb2x1dGlvbl9yZXF1ZXN0IHsKLSAgICB1bnNpZ25lZCBpbnQgbnRzY19tOjE7Ci0gICAgdW5zaWduZWQgaW50IG50c2NfajoxOwotICAgIHVuc2lnbmVkIGludCBudHNjXzQ0MzoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfYjoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfZDoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfZzoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfaDoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfaToxOworCXVuc2lnbmVkIGludCBudHNjX206MTsKKwl1bnNpZ25lZCBpbnQgbnRzY19qOjE7CisJdW5zaWduZWQgaW50IG50c2NfNDQzOjE7CisJdW5zaWduZWQgaW50IHBhbF9iOjE7CisJdW5zaWduZWQgaW50IHBhbF9kOjE7CisJdW5zaWduZWQgaW50IHBhbF9nOjE7CisJdW5zaWduZWQgaW50IHBhbF9oOjE7CisJdW5zaWduZWQgaW50IHBhbF9pOjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgcGFsX206MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX246MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX25jOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhbF82MDoxOwotICAgIHVuc2lnbmVkIGludCBzZWNhbV9iOjE7Ci0gICAgdW5zaWduZWQgaW50IHNlY2FtX2Q6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2VjYW1fZzoxOwotICAgIHVuc2lnbmVkIGludCBzZWNhbV9rOjE7CisJdW5zaWduZWQgaW50IHBhbF9tOjE7CisJdW5zaWduZWQgaW50IHBhbF9uOjE7CisJdW5zaWduZWQgaW50IHBhbF9uYzoxOworCXVuc2lnbmVkIGludCBwYWxfNjA6MTsKKwl1bnNpZ25lZCBpbnQgc2VjYW1fYjoxOworCXVuc2lnbmVkIGludCBzZWNhbV9kOjE7CisJdW5zaWduZWQgaW50IHNlY2FtX2c6MTsKKwl1bnNpZ25lZCBpbnQgc2VjYW1fazoxOwogCi0gICAgdW5zaWduZWQgaW50IHNlY2FtX2sxOjE7Ci0gICAgdW5zaWduZWQgaW50IHNlY2FtX2w6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2VjYW1fNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkOjU7CisJdW5zaWduZWQgaW50IHNlY2FtX2sxOjE7CisJdW5zaWduZWQgaW50IHNlY2FtX2w6MTsKKwl1bnNpZ25lZCBpbnQgc2VjYW1fNjA6MTsKKwl1bnNpZ25lZCBpbnQgcGFkOjU7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaW50ZWxfc2R2b19zZHR2X3Jlc29sdXRpb25fcmVwbHkgewotICAgIHVuc2lnbmVkIGludCByZXNfMzIweDIwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMzIweDI0MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNDAweDMwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNjQweDM1MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNjQweDQwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNjQweDQ4MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNzA0eDQ4MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNzA0eDU3NjoxOworCXVuc2lnbmVkIGludCByZXNfMzIweDIwMDoxOworCXVuc2lnbmVkIGludCByZXNfMzIweDI0MDoxOworCXVuc2lnbmVkIGludCByZXNfNDAweDMwMDoxOworCXVuc2lnbmVkIGludCByZXNfNjQweDM1MDoxOworCXVuc2lnbmVkIGludCByZXNfNjQweDQwMDoxOworCXVuc2lnbmVkIGludCByZXNfNjQweDQ4MDoxOworCXVuc2lnbmVkIGludCByZXNfNzA0eDQ4MDoxOworCXVuc2lnbmVkIGludCByZXNfNzA0eDU3NjoxOwogCi0gICAgdW5zaWduZWQgaW50IHJlc183MjB4MzUwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc183MjB4NDAwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc183MjB4NDgwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc183MjB4NTQwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc183MjB4NTc2OjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc183Njh4NTc2OjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc184MDB4NjAwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc184MzJ4NjI0OjE7CisJdW5zaWduZWQgaW50IHJlc183MjB4MzUwOjE7CisJdW5zaWduZWQgaW50IHJlc183MjB4NDAwOjE7CisJdW5zaWduZWQgaW50IHJlc183MjB4NDgwOjE7CisJdW5zaWduZWQgaW50IHJlc183MjB4NTQwOjE7CisJdW5zaWduZWQgaW50IHJlc183MjB4NTc2OjE7CisJdW5zaWduZWQgaW50IHJlc183Njh4NTc2OjE7CisJdW5zaWduZWQgaW50IHJlc184MDB4NjAwOjE7CisJdW5zaWduZWQgaW50IHJlc184MzJ4NjI0OjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzkyMHg3NjY6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzEwMjR4NzY4OjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xMjgweDEwMjQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkOjU7CisJdW5zaWduZWQgaW50IHJlc185MjB4NzY2OjE7CisJdW5zaWduZWQgaW50IHJlc18xMDI0eDc2ODoxOworCXVuc2lnbmVkIGludCByZXNfMTI4MHgxMDI0OjE7CisJdW5zaWduZWQgaW50IHBhZDo1OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogR2V0IHN1cHBvcnRlZCByZXNvbHV0aW9uIHdpdGggc3F1aXJlIHBpeGVsIGFzcGVjdCByYXRpbyB0aGF0IGNhbiBiZQpAQCAtNDI4LDkwICs0MjgsOTAgQEAKICNkZWZpbmUgU0RWT19DTURfR0VUX1NDQUxFRF9IRFRWX1JFU09MVVRJT05fU1VQUE9SVAkJMHg4NQogCiBzdHJ1Y3QgaW50ZWxfc2R2b19oZHR2X3Jlc29sdXRpb25fcmVxdWVzdCB7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI0MG1fMTA4MGlfNTk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjQwbV8xMDgwaV82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNjBtXzEwODBpXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI2MG1fMTA4MGlfNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwaV81MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBpXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MGlfNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yMzoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNDBtXzEwODBpXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI0MG1fMTA4MGlfNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjYwbV8xMDgwaV81OToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNjBtXzEwODBpXzYwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MGlfNTA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwaV81OToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBpXzYwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjM6MTsKIAotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzI0OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjU6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yOToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzMwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfNTA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF81OToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5NW1fMTA4MGlfNTA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yNDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzI1OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8zMDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfNTk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTVtXzEwODBpXzUwOjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk1bV8xMDgwcF81MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTZtXzcyMHBfNTk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk2bV83MjBwXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5Nm1fNzIwcF81MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTNtXzQ4MHBfNTk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMTcwbV80ODBpXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX2l0dXJidDYwMV81NzZpXzUwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX2l0dXJidDYwMV81NzZwXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5NW1fMTA4MHBfNTA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk2bV83MjBwXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5Nm1fNzIwcF82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTZtXzcyMHBfNTA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjkzbV80ODBwXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzE3MG1fNDgwaV81OToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9pdHVyYnQ2MDFfNTc2aV81MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9pdHVyYnQ2MDFfNTc2cF81MDoxOwogCi0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX2VpYV83NzAyYV80ODBpXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX2VpYV83NzAyYV80ODBwXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhZDo2OworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9laWFfNzcwMmFfNDgwaV82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9laWFfNzcwMmFfNDgwcF82MDoxOworCXVuc2lnbmVkIGludCBwYWQ6NjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBpbnRlbF9zZHZvX2hkdHZfcmVzb2x1dGlvbl9yZXBseSB7Ci0gICAgdW5zaWduZWQgaW50IHJlc182NDB4NDgwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc184MDB4NjAwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xMDI0eDc2ODoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTI4MHg5NjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzE0MDB4MTA1MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTYwMHgxMjAwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xOTIweDE0NDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzIwNDh4MTUzNjoxOworCXVuc2lnbmVkIGludCByZXNfNjQweDQ4MDoxOworCXVuc2lnbmVkIGludCByZXNfODAweDYwMDoxOworCXVuc2lnbmVkIGludCByZXNfMTAyNHg3Njg6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzEyODB4OTYwOjE7CisJdW5zaWduZWQgaW50IHJlc18xNDAweDEwNTA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzE2MDB4MTIwMDoxOworCXVuc2lnbmVkIGludCByZXNfMTkyMHgxNDQwOjE7CisJdW5zaWduZWQgaW50IHJlc18yMDQ4eDE1MzY6MTsKIAotICAgIHVuc2lnbmVkIGludCByZXNfMjU2MHgxOTIwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18zMjAweDI0MDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzM4NDB4Mjg4MDoxOwotICAgIHVuc2lnbmVkIGludCBwYWQxOjU7CisJdW5zaWduZWQgaW50IHJlc18yNTYweDE5MjA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzMyMDB4MjQwMDoxOworCXVuc2lnbmVkIGludCByZXNfMzg0MHgyODgwOjE7CisJdW5zaWduZWQgaW50IHBhZDE6NTsKIAotICAgIHVuc2lnbmVkIGludCByZXNfODQ4eDQ4MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTA2NHg2MDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzEyODB4NzIwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xMzYweDc2ODoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTcwNHg5NjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzE4NjR4MTA1MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTkyMHgxMDgwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18yMTI4eDEyMDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzg0OHg0ODA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzEwNjR4NjAwOjE7CisJdW5zaWduZWQgaW50IHJlc18xMjgweDcyMDoxOworCXVuc2lnbmVkIGludCByZXNfMTM2MHg3Njg6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzE3MDR4OTYwOjE7CisJdW5zaWduZWQgaW50IHJlc18xODY0eDEwNTA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzE5MjB4MTA4MDoxOworCXVuc2lnbmVkIGludCByZXNfMjEyOHgxMjAwOjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzI1NjB4MTQwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMjcyOHgxNTM2OjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18zNDA4eDE5MjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzQyNjR4MjQwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNTEyMHgyODgwOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhZDI6MzsKKwl1bnNpZ25lZCBpbnQgcmVzXzI1NjB4MTQwMDoxOworCXVuc2lnbmVkIGludCByZXNfMjcyOHgxNTM2OjE7CisJdW5zaWduZWQgaW50IHJlc18zNDA4eDE5MjA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzQyNjR4MjQwMDoxOworCXVuc2lnbmVkIGludCByZXNfNTEyMHgyODgwOjE7CisJdW5zaWduZWQgaW50IHBhZDI6MzsKIAotICAgIHVuc2lnbmVkIGludCByZXNfNzY4eDQ4MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfOTYweDYwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTE1Mng3MjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzExMjR4NzY4OjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xNTM2eDk2MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTY4MHgxMDUwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xNzI4eDEwODA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzE5MjB4MTIwMDoxOworCXVuc2lnbmVkIGludCByZXNfNzY4eDQ4MDoxOworCXVuc2lnbmVkIGludCByZXNfOTYweDYwMDoxOworCXVuc2lnbmVkIGludCByZXNfMTE1Mng3MjA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzExMjR4NzY4OjE7CisJdW5zaWduZWQgaW50IHJlc18xNTM2eDk2MDoxOworCXVuc2lnbmVkIGludCByZXNfMTY4MHgxMDUwOjE7CisJdW5zaWduZWQgaW50IHJlc18xNzI4eDEwODA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzE5MjB4MTIwMDoxOwogCi0gICAgdW5zaWduZWQgaW50IHJlc18yMzA0eDE0NDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzI0NTZ4MTUzNjoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMzA3MngxOTIwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18zODQweDI0MDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzQ2MDh4Mjg4MDoxOwotICAgIHVuc2lnbmVkIGludCBwYWQzOjM7CisJdW5zaWduZWQgaW50IHJlc18yMzA0eDE0NDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzI0NTZ4MTUzNjoxOworCXVuc2lnbmVkIGludCByZXNfMzA3MngxOTIwOjE7CisJdW5zaWduZWQgaW50IHJlc18zODQweDI0MDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzQ2MDh4Mjg4MDoxOworCXVuc2lnbmVkIGludCBwYWQzOjM7CiAKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzEyODB4MTAyNDoxOwotICAgIHVuc2lnbmVkIGludCBwYWQ0Ojc7CisJdW5zaWduZWQgaW50IHJlc18xMjgweDEwMjQ6MTsKKwl1bnNpZ25lZCBpbnQgcGFkNDo3OwogCi0gICAgdW5zaWduZWQgaW50IHJlc18xMjgweDc2ODoxOwotICAgIHVuc2lnbmVkIGludCBwYWQ1Ojc7CisJdW5zaWduZWQgaW50IHJlc18xMjgweDc2ODoxOworCXVuc2lnbmVkIGludCBwYWQ1Ojc7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBHZXQgc3VwcG9ydGVkIHBvd2VyIHN0YXRlIHJldHVybnMgaW5mbyBmb3IgZW5jb2RlciBhbmQgbW9uaXRvciwgcmVseSBvbgpAQCAtNTM5LDI1ICs1MzksMjUgQEAKICAqIFRoZSBoaWdoIGZpZWxkcyBhcmUgYml0cyA4Ojkgb2YgdGhlIDEwLWJpdCB2YWx1ZXMuCiAgKi8KIHN0cnVjdCBzZHZvX3BhbmVsX3Bvd2VyX3NlcXVlbmNpbmcgewotICAgIHU4IHQwOwotICAgIHU4IHQxOwotICAgIHU4IHQyOwotICAgIHU4IHQzOwotICAgIHU4IHQ0OworCXU4IHQwOworCXU4IHQxOworCXU4IHQyOworCXU4IHQzOworCXU4IHQ0OwogCi0gICAgdW5zaWduZWQgaW50IHQwX2hpZ2g6MjsKLSAgICB1bnNpZ25lZCBpbnQgdDFfaGlnaDoyOwotICAgIHVuc2lnbmVkIGludCB0Ml9oaWdoOjI7Ci0gICAgdW5zaWduZWQgaW50IHQzX2hpZ2g6MjsKKwl1bnNpZ25lZCBpbnQgdDBfaGlnaDoyOworCXVuc2lnbmVkIGludCB0MV9oaWdoOjI7CisJdW5zaWduZWQgaW50IHQyX2hpZ2g6MjsKKwl1bnNpZ25lZCBpbnQgdDNfaGlnaDoyOwogCi0gICAgdW5zaWduZWQgaW50IHQ0X2hpZ2g6MjsKLSAgICB1bnNpZ25lZCBpbnQgcGFkOjY7CisJdW5zaWduZWQgaW50IHQ0X2hpZ2g6MjsKKwl1bnNpZ25lZCBpbnQgcGFkOjY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9NQVhfQkFDS0xJR0hUX0xFVkVMCQkweDMwCiBzdHJ1Y3Qgc2R2b19tYXhfYmFja2xpZ2h0X3JlcGx5IHsKLSAgICB1OCBtYXhfdmFsdWU7Ci0gICAgdTggZGVmYXVsdF92YWx1ZTsKKwl1OCBtYXhfdmFsdWU7CisJdTggZGVmYXVsdF92YWx1ZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKICNkZWZpbmUgU0RWT19DTURfR0VUX0JBQ0tMSUdIVF9MRVZFTAkJCTB4MzEKQEAgLTU2NSwxNiArNTY1LDE2IEBACiAKICNkZWZpbmUgU0RWT19DTURfR0VUX0FNQklFTlRfTElHSFQJCQkweDMzCiBzdHJ1Y3Qgc2R2b19nZXRfYW1iaWVudF9saWdodF9yZXBseSB7Ci0gICAgdTE2IHRyaXBfbG93OwotICAgIHUxNiB0cmlwX2hpZ2g7Ci0gICAgdTE2IHZhbHVlOworCXUxNiB0cmlwX2xvdzsKKwl1MTYgdHJpcF9oaWdoOworCXUxNiB2YWx1ZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAjZGVmaW5lIFNEVk9fQ01EX1NFVF9BTUJJRU5UX0xJR0hUCQkJMHgzNAogc3RydWN0IHNkdm9fc2V0X2FtYmllbnRfbGlnaHRfcmVwbHkgewotICAgIHUxNiB0cmlwX2xvdzsKLSAgICB1MTYgdHJpcF9oaWdoOwotICAgIHVuc2lnbmVkIGludCBlbmFibGU6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkOjc7CisJdTE2IHRyaXBfbG93OworCXUxNiB0cmlwX2hpZ2g7CisJdW5zaWduZWQgaW50IGVuYWJsZToxOworCXVuc2lnbmVkIGludCBwYWQ6NzsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIFNldCBkaXNwbGF5IHBvd2VyIHN0YXRlICovCkBAIC01ODYsMjMgKzU4NiwyMyBAQAogCiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9TVVBQT1JURURfRU5IQU5DRU1FTlRTCQkweDg0CiBzdHJ1Y3QgaW50ZWxfc2R2b19lbmhhbmNlbWVudHNfcmVwbHkgewotICAgIHVuc2lnbmVkIGludCBmbGlja2VyX2ZpbHRlcjoxOwotICAgIHVuc2lnbmVkIGludCBmbGlja2VyX2ZpbHRlcl9hZGFwdGl2ZToxOwotICAgIHVuc2lnbmVkIGludCBmbGlja2VyX2ZpbHRlcl8yZDoxOwotICAgIHVuc2lnbmVkIGludCBzYXR1cmF0aW9uOjE7Ci0gICAgdW5zaWduZWQgaW50IGh1ZToxOwotICAgIHVuc2lnbmVkIGludCBicmlnaHRuZXNzOjE7Ci0gICAgdW5zaWduZWQgaW50IGNvbnRyYXN0OjE7Ci0gICAgdW5zaWduZWQgaW50IG92ZXJzY2FuX2g6MTsKKwl1bnNpZ25lZCBpbnQgZmxpY2tlcl9maWx0ZXI6MTsKKwl1bnNpZ25lZCBpbnQgZmxpY2tlcl9maWx0ZXJfYWRhcHRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZmxpY2tlcl9maWx0ZXJfMmQ6MTsKKwl1bnNpZ25lZCBpbnQgc2F0dXJhdGlvbjoxOworCXVuc2lnbmVkIGludCBodWU6MTsKKwl1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzczoxOworCXVuc2lnbmVkIGludCBjb250cmFzdDoxOworCXVuc2lnbmVkIGludCBvdmVyc2Nhbl9oOjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgb3ZlcnNjYW5fdjoxOwotICAgIHVuc2lnbmVkIGludCBocG9zOjE7Ci0gICAgdW5zaWduZWQgaW50IHZwb3M6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2hhcnBuZXNzOjE7Ci0gICAgdW5zaWduZWQgaW50IGRvdF9jcmF3bDoxOwotICAgIHVuc2lnbmVkIGludCBkaXRoZXI6MTsKLSAgICB1bnNpZ25lZCBpbnQgdHZfY2hyb21hX2ZpbHRlcjoxOwotICAgIHVuc2lnbmVkIGludCB0dl9sdW1hX2ZpbHRlcjoxOworCXVuc2lnbmVkIGludCBvdmVyc2Nhbl92OjE7CisJdW5zaWduZWQgaW50IGhwb3M6MTsKKwl1bnNpZ25lZCBpbnQgdnBvczoxOworCXVuc2lnbmVkIGludCBzaGFycG5lc3M6MTsKKwl1bnNpZ25lZCBpbnQgZG90X2NyYXdsOjE7CisJdW5zaWduZWQgaW50IGRpdGhlcjoxOworCXVuc2lnbmVkIGludCB0dl9jaHJvbWFfZmlsdGVyOjE7CisJdW5zaWduZWQgaW50IHR2X2x1bWFfZmlsdGVyOjE7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBQaWN0dXJlIGVuaGFuY2VtZW50IGxpbWl0cyBiZWxvdyBhcmUgZGVwZW5kZW50IG9uIHRoZSBjdXJyZW50IFRWIGZvcm1hdCwKQEAgLTYyMyw4ICs2MjMsOCBAQAogI2RlZmluZSBTRFZPX0NNRF9HRVRfTUFYX1RWX0NIUk9NQV9GSUxURVIJCTB4NzQKICNkZWZpbmUgU0RWT19DTURfR0VUX01BWF9UVl9MVU1BX0ZJTFRFUgkJCTB4NzcKIHN0cnVjdCBpbnRlbF9zZHZvX2VuaGFuY2VtZW50X2xpbWl0c19yZXBseSB7Ci0gICAgdTE2IG1heF92YWx1ZTsKLSAgICB1MTYgZGVmYXVsdF92YWx1ZTsKKwl1MTYgbWF4X3ZhbHVlOworCXUxNiBkZWZhdWx0X3ZhbHVlOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogI2RlZmluZSBTRFZPX0NNRF9HRVRfTFZEU19QQU5FTF9JTkZPUk1BVElPTgkJMHg3ZgpAQCAtNjY1LDggKzY2NSw4IEBACiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9UVl9MVU1BX0ZJTFRFUgkJCTB4NzgKICNkZWZpbmUgU0RWT19DTURfU0VUX1RWX0xVTUFfRklMVEVSCQkJMHg3OQogc3RydWN0IGludGVsX3Nkdm9fZW5oYW5jZW1lbnRzX2FyZyB7Ci0gICAgdTE2IHZhbHVlOwotfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCXUxNiB2YWx1ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKICNkZWZpbmUgU0RWT19DTURfR0VUX0RPVF9DUkFXTAkJCQkweDcwCiAjZGVmaW5lIFNEVk9fQ01EX1NFVF9ET1RfQ1JBV0wJCQkJMHg3MQpAQCAtNzE3LDcgKzcxNyw3IEBACiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9BVURJT19UWF9JTkZPCTB4OWMKICNkZWZpbmUgU0RWT19ORUVEX1RPX1NUQUxMICAoMSA8PCA3KQogCi1zdHJ1Y3QgaW50ZWxfc2R2b19lbmNvZGV7Ci0gICAgdTggZHZpX3JldjsKLSAgICB1OCBoZG1pX3JldjsKK3N0cnVjdCBpbnRlbF9zZHZvX2VuY29kZSB7CisJdTggZHZpX3JldjsKKwl1OCBoZG1pX3JldjsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKaW5kZXggMjEwZDU3MC4uZjNjNmE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jCkBAIC0xOTQsMTAgKzE5NCwxMCBAQAogICoKICAqICAgICBpZiAoZiA+PSAxKSB7CiAgKiAgICAgICAgIGV4cCA9IDB4NzsKLSAqIAkgICBtYW50ID0gMSA8PCA4OworICoJICAgbWFudCA9IDEgPDwgODsKICAqICAgICB9IGVsc2UgewogICogICAgICAgICBmb3IgKGV4cCA9IDA7IGV4cCA8IDMgJiYgZiA8IDAuNTsgZXhwKyspCi0gKiAJICAgICAgIGYgKj0gMi4wOworICoJICAgZiAqPSAyLjA7CiAgKiAgICAgICAgIG1hbnQgPSAoZiAqICgxIDw8IDkpICsgMC41KTsKICAqICAgICAgICAgaWYgKG1hbnQgPj0gKDEgPDwgOSkpCiAgKiAgICAgICAgICAgICBtYW50ID0gKDEgPDwgOSkgLSAxOwpAQCAtNDMwLDcgKzQzMCw3IEBACiAJCS52c3luY19zdGFydF9mMQk9IDYsCQkgICAgLnZzeW5jX3N0YXJ0X2YyCT0gNywKIAkJLnZzeW5jX2xlbgk9IDYsCiAKLQkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gMCwKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEJPSAwLAogCQkudmVxX3N0YXJ0X2YyCT0gMSwJCSAgICAudmVxX2xlbgkJPSAxOCwKIAogCQkudmlfZW5kX2YxCT0gMjAsCQkgICAgLnZpX2VuZF9mMgkJPSAyMSwKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCQkudnN5bmNfc3RhcnRfZjEgPSA2LAkJICAgIC52c3luY19zdGFydF9mMgk9IDcsCiAJCS52c3luY19sZW4JPSA2LAogCi0JCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxICAgIAk9IDAsCisJCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxCT0gMCwKIAkJLnZlcV9zdGFydF9mMgk9IDEsCQkgICAgLnZlcV9sZW4JCT0gMTgsCiAKIAkJLnZpX2VuZF9mMQk9IDIwLAkJICAgIC52aV9lbmRfZjIJCT0gMjEsCkBAIC01MTUsNyArNTE1LDcgQEAKIAkJLnZzeW5jX3N0YXJ0X2YxCT0gNiwJICAgIC52c3luY19zdGFydF9mMgk9IDcsCiAJCS52c3luY19sZW4JPSA2LAogCi0JCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxICAgIAk9IDAsCisJCS52ZXFfZW5hICAgICAgPSB0cnVlLAkgICAgLnZlcV9zdGFydF9mMQk9IDAsCiAJCS52ZXFfc3RhcnRfZjIgPSAxLAkgICAgLnZlcV9sZW4JCT0gMTgsCiAKIAkJLnZpX2VuZF9mMQk9IDIwLAkJICAgIC52aV9lbmRfZjIJCT0gMjEsCkBAIC01NTgsNyArNTU4LDcgQEAKIAkJLnZzeW5jX3N0YXJ0X2YxCT0gNiwJCSAgICAudnN5bmNfc3RhcnRfZjIJPSA3LAogCQkudnN5bmNfbGVuCT0gNiwKIAotCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMSAgICAJPSAwLAorCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMQk9IDAsCiAJCS52ZXFfc3RhcnRfZjIJPSAxLAkJICAgIC52ZXFfbGVuCQk9IDE4LAogCiAJCS52aV9lbmRfZjEJPSAyMCwJCSAgICAudmlfZW5kX2YyCQk9IDIxLApAQCAtNjAyLDE0ICs2MDIsMTQgQEAKIAkJLnZzeW5jX3N0YXJ0X2YxCT0gNiwJICAgLnZzeW5jX3N0YXJ0X2YyCT0gNywKIAkJLnZzeW5jX2xlbgk9IDYsCiAKLQkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gMCwKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEJPSAwLAogCQkudmVxX3N0YXJ0X2YyCT0gMSwJCSAgICAudmVxX2xlbgkJPSAxOCwKIAogCQkudmlfZW5kX2YxCT0gMjQsCQkgICAgLnZpX2VuZF9mMgkJPSAyNSwKIAkJLm5icl9lbmQJPSAyODYsCiAKIAkJLmJ1cnN0X2VuYQk9IHRydWUsCi0JCS5oYnVyc3Rfc3RhcnQgPSA3MywJICAgIAkgICAgLmhidXJzdF9sZW4JCT0gMzQsCisJCS5oYnVyc3Rfc3RhcnQgPSA3MywJICAgIC5oYnVyc3RfbGVuCQk9IDM0LAogCQkudmJ1cnN0X3N0YXJ0X2YxID0gOCwJICAgIC52YnVyc3RfZW5kX2YxCT0gMjg1LAogCQkudmJ1cnN0X3N0YXJ0X2YyID0gOCwJICAgIC52YnVyc3RfZW5kX2YyCT0gMjg2LAogCQkudmJ1cnN0X3N0YXJ0X2YzID0gOSwJICAgIC52YnVyc3RfZW5kX2YzCT0gMjg2LApAQCAtNjQ2LDcgKzY0Niw3IEBACiAJCS52c3luY19zdGFydF9mMQk9IDUsCSAgICAudnN5bmNfc3RhcnRfZjIJPSA2LAogCQkudnN5bmNfbGVuCT0gNSwKIAotCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMSAgICAJPSAwLAorCQkudmVxX2VuYQk9IHRydWUsCSAgICAudmVxX3N0YXJ0X2YxCT0gMCwKIAkJLnZlcV9zdGFydF9mMgk9IDEsCSAgICAudmVxX2xlbgkJPSAxNSwKIAogCQkudmlfZW5kX2YxCT0gMjQsCQkgICAgLnZpX2VuZF9mMgkJPSAyNSwKQEAgLTY3NSw3ICs2NzUsNyBAQAogCX0sCiAJewogCQkubmFtZSAgICAgICA9ICI0ODBwQDU5Ljk0SHoiLAotCQkuY2xvY2sgCT0gMTA3NTIwLAorCQkuY2xvY2sJCT0gMTA3NTIwLAogCQkucmVmcmVzaAk9IDU5OTQwLAogCQkub3ZlcnNhbXBsZSAgICAgPSBUVl9PVkVSU0FNUExFXzRYLAogCQkuY29tcG9uZW50X29ubHkgPSAxLApAQCAtNjgzLDcgKzY4Myw3IEBACiAJCS5oc3luY19lbmQgICAgICA9IDY0LCAgICAgICAgICAgICAgIC5oYmxhbmtfZW5kICAgICAgICAgPSAxMjIsCiAJCS5oYmxhbmtfc3RhcnQgICA9IDg0MiwgICAgICAgICAgICAgIC5odG90YWwgICAgICAgICAgICAgPSA4NTcsCiAKLQkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAorCQkucHJvZ3Jlc3NpdmUgICAgPSB0cnVlLAkJICAgIC50cmlsZXZlbF9zeW5jID0gZmFsc2UsCiAKIAkJLnZzeW5jX3N0YXJ0X2YxID0gMTIsICAgICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgICA9IDEyLAogCQkudnN5bmNfbGVuICAgICAgPSAxMiwKQEAgLTY5OSw3ICs2OTksNyBAQAogCX0sCiAJewogCQkubmFtZSAgICAgICA9ICI0ODBwQDYwSHoiLAotCQkuY2xvY2sgCT0gMTA3NTIwLAorCQkuY2xvY2sJCT0gMTA3NTIwLAogCQkucmVmcmVzaAk9IDYwMDAwLAogCQkub3ZlcnNhbXBsZSAgICAgPSBUVl9PVkVSU0FNUExFXzRYLAogCQkuY29tcG9uZW50X29ubHkgPSAxLApAQCAtNzA3LDcgKzcwNyw3IEBACiAJCS5oc3luY19lbmQgICAgICA9IDY0LCAgICAgICAgICAgICAgIC5oYmxhbmtfZW5kICAgICAgICAgPSAxMjIsCiAJCS5oYmxhbmtfc3RhcnQgICA9IDg0MiwgICAgICAgICAgICAgIC5odG90YWwgICAgICAgICAgICAgPSA4NTYsCiAKLQkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAorCQkucHJvZ3Jlc3NpdmUgICAgPSB0cnVlLAkJICAgIC50cmlsZXZlbF9zeW5jID0gZmFsc2UsCiAKIAkJLnZzeW5jX3N0YXJ0X2YxID0gMTIsICAgICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgICA9IDEyLAogCQkudnN5bmNfbGVuICAgICAgPSAxMiwKQEAgLTcyMyw3ICs3MjMsNyBAQAogCX0sCiAJewogCQkubmFtZSAgICAgICA9ICI1NzZwIiwKLQkJLmNsb2NrIAk9IDEwNzUyMCwKKwkJLmNsb2NrCQk9IDEwNzUyMCwKIAkJLnJlZnJlc2gJPSA1MDAwMCwKIAkJLm92ZXJzYW1wbGUgICAgID0gVFZfT1ZFUlNBTVBMRV80WCwKIAkJLmNvbXBvbmVudF9vbmx5ID0gMSwKQEAgLTc1NSw3ICs3NTUsNyBAQAogCQkuaHN5bmNfZW5kICAgICAgPSA4MCwgICAgICAgICAgICAgICAuaGJsYW5rX2VuZCAgICAgICAgID0gMzAwLAogCQkuaGJsYW5rX3N0YXJ0ICAgPSAxNTgwLCAgICAgICAgICAgICAuaHRvdGFsICAgICAgICAgICAgID0gMTY0OSwKIAotCQkucHJvZ3Jlc3NpdmUgICAgPSB0cnVlLCAJICAgIC50cmlsZXZlbF9zeW5jID0gdHJ1ZSwKKwkJLnByb2dyZXNzaXZlCT0gdHJ1ZSwJCSAgICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCiAKIAkJLnZzeW5jX3N0YXJ0X2YxID0gMTAsICAgICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgICA9IDEwLAogCQkudnN5bmNfbGVuICAgICAgPSAxMCwKQEAgLTc3OSw3ICs3NzksNyBAQAogCQkuaHN5bmNfZW5kICAgICAgPSA4MCwgICAgICAgICAgICAgICAuaGJsYW5rX2VuZCAgICAgICAgID0gMzAwLAogCQkuaGJsYW5rX3N0YXJ0ICAgPSAxNTgwLCAgICAgICAgICAgICAuaHRvdGFsICAgICAgICAgICAgID0gMTY1MSwKIAotCQkucHJvZ3Jlc3NpdmUgICAgPSB0cnVlLCAJICAgIC50cmlsZXZlbF9zeW5jID0gdHJ1ZSwKKwkJLnByb2dyZXNzaXZlCT0gdHJ1ZSwJCSAgICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCiAKIAkJLnZzeW5jX3N0YXJ0X2YxID0gMTAsICAgICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgICA9IDEwLAogCQkudnN5bmNfbGVuICAgICAgPSAxMCwKQEAgLTgwMyw3ICs4MDMsNyBAQAogCQkuaHN5bmNfZW5kICAgICAgPSA4MCwgICAgICAgICAgICAgICAuaGJsYW5rX2VuZCAgICAgICAgID0gMzAwLAogCQkuaGJsYW5rX3N0YXJ0ICAgPSAxNTgwLCAgICAgICAgICAgICAuaHRvdGFsICAgICAgICAgICAgID0gMTk3OSwKIAotCQkucHJvZ3Jlc3NpdmUgICAgPSB0cnVlLCAJICAgICAgICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCisJCS5wcm9ncmVzc2l2ZQk9IHRydWUsCQkgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAogCiAJCS52c3luY19zdGFydF9mMSA9IDEwLCAgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSAxMCwKIAkJLnZzeW5jX2xlbiAgICAgID0gMTAsCkBAIC04MjgsMTIgKzgyOCwxMiBAQAogCQkuaHN5bmNfZW5kICAgICAgPSA4OCwgICAgICAgICAgICAgICAuaGJsYW5rX2VuZCAgICAgICAgID0gMjM1LAogCQkuaGJsYW5rX3N0YXJ0ICAgPSAyMTU1LCAgICAgICAgICAgICAuaHRvdGFsICAgICAgICAgICAgID0gMjYzOSwKIAotCQkucHJvZ3Jlc3NpdmUgICAgPSBmYWxzZSwgCSAgICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCisJCS5wcm9ncmVzc2l2ZQk9IGZhbHNlLAkgIC50cmlsZXZlbF9zeW5jID0gdHJ1ZSwKIAogCQkudnN5bmNfc3RhcnRfZjEgPSA0LCAgICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgICA9IDUsCiAJCS52c3luY19sZW4gICAgICA9IDEwLAogCi0JCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxICAgIAk9IDQsCisJCS52ZXFfZW5hCT0gdHJ1ZSwJICAgIC52ZXFfc3RhcnRfZjEJPSA0LAogCQkudmVxX3N0YXJ0X2YyICAgPSA0LAkgICAgLnZlcV9sZW4JCT0gMTAsCiAKIApAQCAtODU0LDEyICs4NTQsMTIgQEAKIAkJLmhzeW5jX2VuZCAgICAgID0gODgsICAgICAgICAgICAgICAgLmhibGFua19lbmQgICAgICAgICA9IDIzNSwKIAkJLmhibGFua19zdGFydCAgID0gMjE1NSwgICAgICAgICAgICAgLmh0b3RhbCAgICAgICAgICAgICA9IDIxOTksCiAKLQkJLnByb2dyZXNzaXZlICAgID0gZmFsc2UsIAkgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAorCQkucHJvZ3Jlc3NpdmUJPSBmYWxzZSwJICAgIC50cmlsZXZlbF9zeW5jID0gdHJ1ZSwKIAogCQkudnN5bmNfc3RhcnRfZjEgPSA0LCAgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSA1LAogCQkudnN5bmNfbGVuICAgICAgPSAxMCwKIAotCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMSAgICAJPSA0LAorCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMQk9IDQsCiAJCS52ZXFfc3RhcnRfZjIJPSA0LAkJICAgIC52ZXFfbGVuCQk9IDEwLAogCiAKQEAgLTg4MCwxNiArODgwLDE2IEBACiAJCS5oc3luY19lbmQgICAgICA9IDg4LCAgICAgICAgICAgICAgIC5oYmxhbmtfZW5kICAgICAgICAgPSAyMzUsCiAJCS5oYmxhbmtfc3RhcnQgICA9IDIxNTUsICAgICAgICAgICAgIC5odG90YWwgICAgICAgICAgICAgPSAyMjAxLAogCi0JCS5wcm9ncmVzc2l2ZSAgICA9IGZhbHNlLCAJICAgIC50cmlsZXZlbF9zeW5jID0gdHJ1ZSwKKwkJLnByb2dyZXNzaXZlCT0gZmFsc2UsCSAgICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCiAKIAkJLnZzeW5jX3N0YXJ0X2YxID0gNCwgICAgICAgICAgICAudnN5bmNfc3RhcnRfZjIgICAgPSA1LAogCQkudnN5bmNfbGVuICAgICAgPSAxMCwKIAogCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMQk9IDQsCi0JCS52ZXFfc3RhcnRfZjIgPSA0LAkgICAgCSAgICAudmVxX2xlbiA9IDEwLAorCQkudmVxX3N0YXJ0X2YyCT0gNCwJCS52ZXFfbGVuCSAgPSAxMCwKIAogCi0JCS52aV9lbmRfZjEgICAgICA9IDIxLCAgICAgICAgICAgLnZpX2VuZF9mMiAgICAgICAgIAk9IDIyLAorCQkudmlfZW5kX2YxCT0gMjEsCQkudmlfZW5kX2YyCSAgPSAyMiwKIAkJLm5icl9lbmQgICAgICAgID0gNTM5LAogCiAJCS5idXJzdF9lbmEgICAgICA9IGZhbHNlLApAQCAtOTE2LDcgKzkxNiw3IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0Jc3dpdGNoKG1vZGUpIHsKKwlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIERSTV9NT0RFX0RQTVNfT046CiAJCUk5MTVfV1JJVEUoVFZfQ1RMLCBJOTE1X1JFQUQoVFZfQ1RMKSB8IFRWX0VOQ19FTkFCTEUpOwogCQlicmVhazsKQEAgLTkzMyw3ICs5MzMsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZih0dl9tb2RlcykgLyBzaXplb2YgKHR2X21vZGVzWzBdKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0dl9tb2RlcykgLyBzaXplb2YodHZfbW9kZXNbMF0pOyBpKyspIHsKIAkJY29uc3Qgc3RydWN0IHR2X21vZGUgKnR2X21vZGUgPSAmdHZfbW9kZXNbaV07CiAKIAkJaWYgKCFzdHJjbXAodHZfZm9ybWF0LCB0dl9tb2RlLT5uYW1lKSkKQEAgLTExMjgsNyArMTEyOCw3IEBACiAJaWYgKGNvbG9yX2NvbnZlcnNpb24pIHsKIAkJSTkxNV9XUklURShUVl9DU0NfWSwgKGNvbG9yX2NvbnZlcnNpb24tPnJ5IDw8IDE2KSB8CiAJCQkgICBjb2xvcl9jb252ZXJzaW9uLT5neSk7Ci0JCUk5MTVfV1JJVEUoVFZfQ1NDX1kyLChjb2xvcl9jb252ZXJzaW9uLT5ieSA8PCAxNikgfAorCQlJOTE1X1dSSVRFKFRWX0NTQ19ZMiwgKGNvbG9yX2NvbnZlcnNpb24tPmJ5IDw8IDE2KSB8CiAJCQkgICBjb2xvcl9jb252ZXJzaW9uLT5heSk7CiAJCUk5MTVfV1JJVEUoVFZfQ1NDX1UsIChjb2xvcl9jb252ZXJzaW9uLT5ydSA8PCAxNikgfAogCQkJICAgY29sb3JfY29udmVyc2lvbi0+Z3UpOwpAQCAtMTIzMiw3ICsxMjMyLDcgQEAKICAqIFxyZXR1cm4gZmFsc2UgaWYgVFYgaXMgZGlzY29ubmVjdGVkLgogICovCiBzdGF0aWMgaW50Ci1pbnRlbF90dl9kZXRlY3RfdHlwZSAoc3RydWN0IGludGVsX3R2ICppbnRlbF90diwKK2ludGVsX3R2X2RldGVjdF90eXBlKHN0cnVjdCBpbnRlbF90diAqaW50ZWxfdHYsCiAJCSAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gJmludGVsX3R2LT5iYXNlLmJhc2U7CkBAIC0xNDg2LDcgKzE0ODYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotaW50ZWxfdHZfZGVzdHJveSAoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK2ludGVsX3R2X2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZShjb25uZWN0b3IpOwogCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuYwppbmRleCA0MmQzMTg3Li4zM2RhYTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV9kcnYuYwpAQCAtMjksNiArMjksOCBAQAogICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJtZ2FfZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV93YXJwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV93YXJwLmMKaW5kZXggZjE3MmJkNS4uNzIyYTkxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2Ffd2FycC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX3dhcnAuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvaWhleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQppbmRleCAwNTgzNjc3Li4zNWVmNWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQpAQCAtMjEsMTYgKzIxLDE3IEBACiAgICAgICAgICAgICAgbnY0MF9ncmN0eC5vIG52NTBfZ3JjdHgubyBudmMwX2dyY3R4Lm8gXAogICAgICAgICAgICAgIG52ODRfY3J5cHQubyBcCiAgICAgICAgICAgICAgbnZhM19jb3B5Lm8gbnZjMF9jb3B5Lm8gXAotICAgICAgICAgICAgIG52NDBfbXBlZy5vIG52NTBfbXBlZy5vIFwKKyAgICAgICAgICAgICBudjMxX21wZWcubyBudjUwX21wZWcubyBcCiAgICAgICAgICAgICAgbnYwNF9pbnN0bWVtLm8gbnY1MF9pbnN0bWVtLm8gbnZjMF9pbnN0bWVtLm8gXAotICAgICAgICAgICAgIG52NTBfZXZvLm8gbnY1MF9jcnRjLm8gbnY1MF9kYWMubyBudjUwX3Nvci5vIFwKLSAgICAgICAgICAgICBudjUwX2N1cnNvci5vIG52NTBfZGlzcGxheS5vIFwKICAgICAgICAgICAgICBudjA0X2RhYy5vIG52MDRfZGZwLm8gbnYwNF90di5vIG52MTdfdHYubyBudjE3X3R2X21vZGVzLm8gXAogICAgICAgICAgICAgIG52MDRfY3J0Yy5vIG52MDRfZGlzcGxheS5vIG52MDRfY3Vyc29yLm8gXAorICAgICAgICAgICAgIG52NTBfZXZvLm8gbnY1MF9jcnRjLm8gbnY1MF9kYWMubyBudjUwX3Nvci5vIFwKKyAgICAgICAgICAgICBudjUwX2N1cnNvci5vIG52NTBfZGlzcGxheS5vIFwKKyAgICAgICAgICAgICBudmQwX2Rpc3BsYXkubyBcCiAgICAgICAgICAgICAgbnYwNF9mYmNvbi5vIG52NTBfZmJjb24ubyBudmMwX2ZiY29uLm8gXAogICAgICAgICAgICAgIG52MTBfZ3Bpby5vIG52NTBfZ3Bpby5vIFwKIAkgICAgIG52NTBfY2FsYy5vIFwKLQkgICAgIG52MDRfcG0ubyBudjUwX3BtLm8gbnZhM19wbS5vIFwKKwkgICAgIG52MDRfcG0ubyBudjQwX3BtLm8gbnY1MF9wbS5vIG52YTNfcG0ubyBudmMwX3BtLm8gXAogCSAgICAgbnY1MF92cmFtLm8gbnZjMF92cmFtLm8gXAogCSAgICAgbnY1MF92bS5vIG52YzBfdm0ubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JhY2tsaWdodC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iYWNrbGlnaHQuYwppbmRleCAwMGE1NWRmLi5mYTIyYjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JhY2tsaWdodC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmFja2xpZ2h0LmMKQEAgLTM3LDggKzM3LDEwIEBACiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCiAKLXN0YXRpYyBpbnQgbnY0MF9nZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3N0YXRpYyBpbnQKK252NDBfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJsX2dldF9kYXRhKGJkKTsKIAlpbnQgdmFsID0gKG52X3JkMzIoZGV2LCBOVjQwX1BNQ19CQUNLTElHSFQpICYgTlY0MF9QTUNfQkFDS0xJR0hUX01BU0spCkBAIC00Nyw3ICs0OSw4IEBACiAJcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIGludCBudjQwX3NldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQorc3RhdGljIGludAorbnY0MF9zZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmxfZ2V0X2RhdGEoYmQpOwogCWludCB2YWwgPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKQEAgLTY1LDMwICs2OCw4IEBACiAJLnVwZGF0ZV9zdGF0dXMgPSBudjQwX3NldF9pbnRlbnNpdHksCiB9OwogCi1zdGF0aWMgaW50IG52NTBfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJsX2dldF9kYXRhKGJkKTsKLQotCXJldHVybiBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUKTsKLX0KLQotc3RhdGljIGludCBudjUwX3NldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBibF9nZXRfZGF0YShiZCk7Ci0JaW50IHZhbCA9IGJkLT5wcm9wcy5icmlnaHRuZXNzOwotCi0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0JBQ0tMSUdIVCwKLQkJdmFsIHwgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUX0VOQUJMRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBudjUwX2JsX29wcyA9IHsKLQkub3B0aW9ucyA9IEJMX0NPUkVfU1VTUEVORFJFU1VNRSwKLQkuZ2V0X2JyaWdodG5lc3MgPSBudjUwX2dldF9pbnRlbnNpdHksCi0JLnVwZGF0ZV9zdGF0dXMgPSBudjUwX3NldF9pbnRlbnNpdHksCi19OwotCi1zdGF0aWMgaW50IG5vdXZlYXVfbnY0MF9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQorc3RhdGljIGludAorbnY0MF9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTEzLDM0ICs5NCwxMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBub3V2ZWF1X252NTBfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3N0YXRpYyBpbnQKK252NTBfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IGJsX2dldF9kYXRhKGJkKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfZW5jb2Rlci0+YmFzZS5iYXNlLmRldjsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKKwl1MzIgZGl2ID0gMTAyNTsKKwl1MzIgdmFsOworCisJdmFsICA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQX1NPUl9QV01fQ1RMKG9yKSk7CisJdmFsICY9IE5WNTBfUERJU1BfU09SX1BXTV9DVExfVkFMOworCXJldHVybiAoKHZhbCAqIDEwMCkgKyAoZGl2IC8gMikpIC8gZGl2OworfQorCitzdGF0aWMgaW50CitudjUwX3NldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBibF9nZXRfZGF0YShiZCk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2VuY29kZXItPmJhc2UuYmFzZS5kZXY7CisJaW50IG9yID0gbnZfZW5jb2Rlci0+b3I7CisJdTMyIGRpdiA9IDEwMjU7CisJdTMyIHZhbCA9IChiZC0+cHJvcHMuYnJpZ2h0bmVzcyAqIGRpdikgLyAxMDA7CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUF9TT1JfUFdNX0NUTChvciksCisJCSAgICAgTlY1MF9QRElTUF9TT1JfUFdNX0NUTF9ORVcgfCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgbnY1MF9ibF9vcHMgPSB7CisJLm9wdGlvbnMgPSBCTF9DT1JFX1NVU1BFTkRSRVNVTUUsCisJLmdldF9icmlnaHRuZXNzID0gbnY1MF9nZXRfaW50ZW5zaXR5LAorCS51cGRhdGVfc3RhdHVzID0gbnY1MF9zZXRfaW50ZW5zaXR5LAorfTsKKworc3RhdGljIGludAorbnZhM19nZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gYmxfZ2V0X2RhdGEoYmQpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9lbmNvZGVyLT5iYXNlLmJhc2UuZGV2OworCWludCBvciA9IG52X2VuY29kZXItPm9yOworCXUzMiBkaXYsIHZhbDsKKworCWRpdiAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUF9TT1JfUFdNX0RJVihvcikpOworCXZhbCAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUF9TT1JfUFdNX0NUTChvcikpOworCXZhbCAmPSBOVkEzX1BESVNQX1NPUl9QV01fQ1RMX1ZBTDsKKwlpZiAoZGl2ICYmIGRpdiA+PSB2YWwpCisJCXJldHVybiAoKHZhbCAqIDEwMCkgKyAoZGl2IC8gMikpIC8gZGl2OworCisJcmV0dXJuIDEwMDsKK30KKworc3RhdGljIGludAorbnZhM19zZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gYmxfZ2V0X2RhdGEoYmQpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9lbmNvZGVyLT5iYXNlLmJhc2UuZGV2OworCWludCBvciA9IG52X2VuY29kZXItPm9yOworCXUzMiBkaXYsIHZhbDsKKworCWRpdiA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQX1NPUl9QV01fRElWKG9yKSk7CisJdmFsID0gKGJkLT5wcm9wcy5icmlnaHRuZXNzICogZGl2KSAvIDEwMDsKKwlpZiAoZGl2KSB7CisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQX1NPUl9QV01fQ1RMKG9yKSwgdmFsIHwKKwkJCSAgICAgTlY1MF9QRElTUF9TT1JfUFdNX0NUTF9ORVcgfAorCQkJICAgICBOVkEzX1BESVNQX1NPUl9QV01fQ1RMX1VOSyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgbnZhM19ibF9vcHMgPSB7CisJLm9wdGlvbnMgPSBCTF9DT1JFX1NVU1BFTkRSRVNVTUUsCisJLmdldF9icmlnaHRuZXNzID0gbnZhM19nZXRfaW50ZW5zaXR5LAorCS51cGRhdGVfc3RhdHVzID0gbnZhM19zZXRfaW50ZW5zaXR5LAorfTsKKworc3RhdGljIGludAorbnY1MF9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CiAJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOwogCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKwljb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyAqb3BzOwogCi0JaWYgKCFudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUKSkKKwludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyKGNvbm5lY3RvciwgT1VUUFVUX0xWRFMpOworCWlmICghbnZfZW5jb2RlcikgeworCQludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyKGNvbm5lY3RvciwgT1VUUFVUX0RQKTsKKwkJaWYgKCFudl9lbmNvZGVyKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFudl9yZDMyKGRldiwgTlY1MF9QRElTUF9TT1JfUFdNX0NUTChudl9lbmNvZGVyLT5vcikpKQogCQlyZXR1cm4gMDsKIAorCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8PSAweGEwIHx8CisJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4YWEgfHwKKwkgICAgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHhhYykKKwkJb3BzID0gJm52NTBfYmxfb3BzOworCWVsc2UKKwkJb3BzID0gJm52YTNfYmxfb3BzOworCiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOwogCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUkFXOwotCXByb3BzLm1heF9icmlnaHRuZXNzID0gMTAyNTsKLQliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoIm52X2JhY2tsaWdodCIsICZjb25uZWN0b3ItPmtkZXYsIGRldiwKLQkJCQkgICAgICAgJm52NTBfYmxfb3BzLCAmcHJvcHMpOworCXByb3BzLm1heF9icmlnaHRuZXNzID0gMTAwOworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigibnZfYmFja2xpZ2h0IiwgJmNvbm5lY3Rvci0+a2RldiwKKwkJCQkgICAgICAgbnZfZW5jb2Rlciwgb3BzLCAmcHJvcHMpOwogCWlmIChJU19FUlIoYmQpKQogCQlyZXR1cm4gUFRSX0VSUihiZCk7CiAKIAlkZXZfcHJpdi0+YmFja2xpZ2h0ID0gYmQ7Ci0JYmQtPnByb3BzLmJyaWdodG5lc3MgPSBudjUwX2dldF9pbnRlbnNpdHkoYmQpOworCWJkLT5wcm9wcy5icmlnaHRuZXNzID0gYmQtPm9wcy0+Z2V0X2JyaWdodG5lc3MoYmQpOwogCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IG5vdXZlYXVfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK2ludAorbm91dmVhdV9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAKICNpZmRlZiBDT05GSUdfQUNQSQogCWlmIChhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkpIHsKQEAgLTE1MCwyMSArMjI2LDI4IEBACiAJfQogI2VuZGlmCiAKLQlzd2l0Y2ggKGRldl9wcml2LT5jYXJkX3R5cGUpIHsKLQljYXNlIE5WXzQwOgotCQlyZXR1cm4gbm91dmVhdV9udjQwX2JhY2tsaWdodF9pbml0KGNvbm5lY3Rvcik7Ci0JY2FzZSBOVl81MDoKLQkJcmV0dXJuIG5vdXZlYXVfbnY1MF9iYWNrbGlnaHRfaW5pdChjb25uZWN0b3IpOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyAmJgorCQkgICAgY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7CisJCWNhc2UgTlZfNDA6CisJCQlyZXR1cm4gbnY0MF9iYWNrbGlnaHRfaW5pdChjb25uZWN0b3IpOworCQljYXNlIE5WXzUwOgorCQkJcmV0dXJuIG52NTBfYmFja2xpZ2h0X2luaXQoY29ubmVjdG9yKTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CiAJfQogCisKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBub3V2ZWF1X2JhY2tsaWdodF9leGl0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit2b2lkCitub3V2ZWF1X2JhY2tsaWdodF9leGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlpZiAoZGV2X3ByaXYtPmJhY2tsaWdodCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYwppbmRleCBiMzExZmFiLi41ZmMyMDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYwpAQCAtMjk2LDYgKzI5NiwxMSBAQAogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCiAJCXJldHVybiByZWc7CiAKKwlpZiAocmVnICYgMHg4MDAwMDAwMCkgeworCQlCVUdfT04oYmlvcy0+ZGlzcGxheS5jcnRjIDwgMCk7CisJCXJlZyArPSBiaW9zLT5kaXNwbGF5LmNydGMgKiAweDgwMDsKKwl9CisKIAlpZiAocmVnICYgMHg0MDAwMDAwMCkgewogCQlCVUdfT04oIWRjYmVudCk7CiAKQEAgLTMwNCw3ICszMDksNyBAQAogCQkJcmVnICs9IDB4MDAwMDAwODA7CiAJfQogCi0JcmVnICY9IH4weDYwMDAwMDAwOworCXJlZyAmPSB+MHhlMDAwMDAwMDsKIAlyZXR1cm4gcmVnOwogfQogCkBAIC02MzUsMTAgKzY0MCw5IEBACiBudjUwX3BsbF9zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCBjbGspCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCByZWcwID0gbnZfcmQzMihkZXYsIHJlZyArIDApOwotCXVpbnQzMl90IHJlZzEgPSBudl9yZDMyKGRldiwgcmVnICsgNCk7CiAJc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgcGxsOwogCXN0cnVjdCBwbGxfbGltcyBwbGxfbGltaXRzOworCXUzMiBjdHJsLCBtYXNrLCBjb2VmOwogCWludCByZXQ7CiAKIAlyZXQgPSBnZXRfcGxsX2xpbWl0cyhkZXYsIHJlZywgJnBsbF9saW1pdHMpOwpAQCAtNjQ5LDE1ICs2NTMsMjAgQEAKIAlpZiAoIWNsaykKIAkJcmV0dXJuIC1FUkFOR0U7CiAKLQlyZWcwID0gKHJlZzAgJiAweGZmZjhmZmZmKSB8IChwbGwubG9nMlAgPDwgMTYpOwotCXJlZzEgPSAocmVnMSAmIDB4ZmZmZjAwMDApIHwgKHBsbC5OMSA8PCA4KSB8IHBsbC5NMTsKLQotCWlmIChkZXZfcHJpdi0+dmJpb3MuZXhlY3V0ZSkgewotCQlzdGlsbF9hbGl2ZSgpOwotCQludl93cjMyKGRldiwgcmVnICsgNCwgcmVnMSk7Ci0JCW52X3dyMzIoZGV2LCByZWcgKyAwLCByZWcwKTsKKwljb2VmID0gcGxsLk4xIDw8IDggfCBwbGwuTTE7CisJY3RybCA9IHBsbC5sb2cyUCA8PCAxNjsKKwltYXNrID0gMHgwMDA3MDAwMDsKKwlpZiAocmVnID09IDB4MDA0MDA4KSB7CisJCW1hc2sgfD0gMHgwMWY4MDAwMDsKKwkJY3RybCB8PSAocGxsX2xpbWl0cy5sb2cycF9iaWFzIDw8IDE5KTsKKwkJY3RybCB8PSAocGxsLmxvZzJQIDw8IDIyKTsKIAl9CiAKKwlpZiAoIWRldl9wcml2LT52Ymlvcy5leGVjdXRlKQorCQlyZXR1cm4gMDsKKworCW52X21hc2soZGV2LCByZWcgKyAwLCBtYXNrLCBjdHJsKTsKKwludl93cjMyKGRldiwgcmVnICsgNCwgY29lZik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNzQsMjIgKzExODMsMTkgQEAKIAkgKgogCSAqLwogCi0Jc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlICpkcGUgPSBOVUxMOwogCXN0cnVjdCBkY2JfZW50cnkgKmRjYiA9IGJpb3MtPmRpc3BsYXkub3V0cHV0OwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CiAJdWludDhfdCBjb25kID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKLQlpbnQgZHVtbXk7CisJdWludDhfdCAqdGFibGUsICplbnRyeTsKIAogCUJJT1NMT0coYmlvcywgIjB4JTA0WDogc3Vib3AgMHglMDJYXG4iLCBvZmZzZXQsIGNvbmQpOwogCiAJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKIAkJcmV0dXJuIDM7CiAKLQlkcGUgPSBub3V2ZWF1X2Jpb3NfZHBfdGFibGUoZGV2LCBkY2IsICZkdW1teSk7Ci0JaWYgKCFkcGUpIHsKLQkJTlZfRVJST1IoZGV2LCAiMHglMDRYOiBJTklUXzNBOiBubyBlbmNvZGVyIHRhYmxlISFcbiIsIG9mZnNldCk7CisJdGFibGUgPSBub3V2ZWF1X2RwX2Jpb3NfZGF0YShkZXYsIGRjYiwgJmVudHJ5KTsKKwlpZiAoIXRhYmxlKQogCQlyZXR1cm4gMzsKLQl9CiAKIAlzd2l0Y2ggKGNvbmQpIHsKIAljYXNlIDA6CkBAIC0xMjAzLDcgKzEyMDksNyBAQAogCQlicmVhazsKIAljYXNlIDE6CiAJY2FzZSAyOgotCQlpZiAoIShkcGUtPnVua25vd24gJiBjb25kKSkKKwkJaWYgKCEoZW50cnlbNV0gJiBjb25kKSkKIAkJCWlleGVjLT5leGVjdXRlID0gZmFsc2U7CiAJCWJyZWFrOwogCWNhc2UgNToKQEAgLTMyMjEsNiArMzIyNyw0OSBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgdm9pZAoraW5pdF9ncGlvX3Vua252NTAoc3RydWN0IG52YmlvcyAqYmlvcywgc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpncGlvKQoreworCWNvbnN0IHVpbnQzMl90IG52NTBfZ3Bpb19jdGxbMl0gPSB7IDB4ZTEwMCwgMHhlMjhjIH07CisJdTMyIHIsIHMsIHY7CisKKwkvKiBOb3QgYSBjbHVlLCBuZWVkcyBkZS1tYWdpY2luZyAqLworCXIgPSBudjUwX2dwaW9fY3RsW2dwaW8tPmxpbmUgPj4gNF07CisJcyA9IChncGlvLT5saW5lICYgMHgwZik7CisJdiA9IGJpb3NfcmQzMihiaW9zLCByKSAmIH4oMHgwMDAxMDAwMSA8PCBzKTsKKwlzd2l0Y2ggKChncGlvLT5lbnRyeSAmIDB4MDYwMDAwMDApID4+IDI1KSB7CisJY2FzZSAxOgorCQl2IHw9ICgweDAwMDAwMDAxIDw8IHMpOworCQlicmVhazsKKwljYXNlIDI6CisJCXYgfD0gKDB4MDAwMTAwMDAgPDwgcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWJpb3Nfd3IzMihiaW9zLCByLCB2KTsKK30KKworc3RhdGljIHZvaWQKK2luaXRfZ3Bpb191bmtudmQwKHN0cnVjdCBudmJpb3MgKmJpb3MsIHN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbykKK3sKKwl1MzIgdiwgaTsKKworCXYgID0gYmlvc19yZDMyKGJpb3MsIDB4MDBkNjEwICsgKGdwaW8tPmxpbmUgKiA0KSk7CisJdiAmPSAweGZmZmZmZjAwOworCXYgfD0gKGdwaW8tPmVudHJ5ICYgMHgwMGZmMDAwMCkgPj4gMTY7CisJYmlvc193cjMyKGJpb3MsIDB4MDBkNjEwICsgKGdwaW8tPmxpbmUgKiA0KSwgdik7CisKKwlpID0gKGdwaW8tPmVudHJ5ICYgMHgxZjAwMDAwMCkgPj4gMjQ7CisJaWYgKGkpIHsKKwkJdiAgPSBiaW9zX3JkMzIoYmlvcywgMHgwMGQ2NDAgKyAoKGkgLSAxKSAqIDQpKTsKKwkJdiAmPSAweGZmZmZmZjAwOworCQl2IHw9IGdwaW8tPmxpbmU7CisJCWJpb3Nfd3IzMihiaW9zLCAweDAwZDY0MCArICgoaSAtIDEpICogNCksIHYpOworCX0KK30KKwogc3RhdGljIGludAogaW5pdF9ncGlvKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCiB7CkBAIC0zMjM1LDcgKzMyODQsNiBAQAogCiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSAqcGdwaW8gPSAmZGV2X3ByaXYtPmVuZ2luZS5ncGlvOwotCWNvbnN0IHVpbnQzMl90IG52NTBfZ3Bpb19jdGxbMl0gPSB7IDB4ZTEwMCwgMHhlMjhjIH07CiAJaW50IGk7CiAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CkBAIC0zMjQ4LDMzICszMjk2LDIwIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgYmlvcy0+ZGNiLmdwaW8uZW50cmllczsgaSsrKSB7CiAJCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbyA9ICZiaW9zLT5kY2IuZ3Bpby5lbnRyeVtpXTsKLQkJdWludDMyX3QgciwgcywgdjsKIAogCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IEVudHJ5OiAweCUwOFhcbiIsIG9mZnNldCwgZ3Bpby0+ZW50cnkpOwogCiAJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogc2V0IGdwaW8gMHglMDJ4LCBzdGF0ZSAlZFxuIiwKIAkJCW9mZnNldCwgZ3Bpby0+dGFnLCBncGlvLT5zdGF0ZV9kZWZhdWx0KTsKLQkJaWYgKGJpb3MtPmV4ZWN1dGUpCi0JCQlwZ3Bpby0+c2V0KGJpb3MtPmRldiwgZ3Bpby0+dGFnLCBncGlvLT5zdGF0ZV9kZWZhdWx0KTsKIAotCQkvKiBUaGUgTlZJRElBIGJpbmFyeSBkcml2ZXIgZG9lc24ndCBhcHBlYXIgdG8gYWN0dWFsbHkgZG8KLQkJICogYW55IG9mIHRoaXMsIG15IFZCSU9TIGRvZXMgaG93ZXZlci4KLQkJICovCi0JCS8qIE5vdCBhIGNsdWUsIG5lZWRzIGRlLW1hZ2ljaW5nICovCi0JCXIgPSBudjUwX2dwaW9fY3RsW2dwaW8tPmxpbmUgPj4gNF07Ci0JCXMgPSAoZ3Bpby0+bGluZSAmIDB4MGYpOwotCQl2ID0gYmlvc19yZDMyKGJpb3MsIHIpICYgfigweDAwMDEwMDAxIDw8IHMpOwotCQlzd2l0Y2ggKChncGlvLT5lbnRyeSAmIDB4MDYwMDAwMDApID4+IDI1KSB7Ci0JCWNhc2UgMToKLQkJCXYgfD0gKDB4MDAwMDAwMDEgPDwgcyk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJdiB8PSAoMHgwMDAxMDAwMCA8PCBzKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJYmlvc193cjMyKGJpb3MsIHIsIHYpOworCQlpZiAoIWJpb3MtPmV4ZWN1dGUpCisJCQljb250aW51ZTsKKworCQlwZ3Bpby0+c2V0KGJpb3MtPmRldiwgZ3Bpby0+dGFnLCBncGlvLT5zdGF0ZV9kZWZhdWx0KTsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9EMCkKKwkJCWluaXRfZ3Bpb191bmtudjUwKGJpb3MsIGdwaW8pOworCQllbHNlCisJCQlpbml0X2dwaW9fdW5rbnZkMChiaW9zLCBncGlvKTsKIAl9CiAKIAlyZXR1cm4gMTsKQEAgLTM3MzcsNiArMzc3MiwxMCBAQAogCWludCBjb3VudCA9IDAsIGksIHJldDsKIAl1aW50OF90IGlkOwogCisJLyogY2F0Y2ggTlVMTCBzY3JpcHQgcG9pbnRlcnMgKi8KKwlpZiAob2Zmc2V0ID09IDApCisJCXJldHVybiAwOworCiAJLyoKIAkgKiBMb29wIHVudGlsIElOSVRfRE9ORSBjYXVzZXMgdXMgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wCiAJICogKG9yIHVudGlsIG9mZnNldCA+IGJpb3MgbGVuZ3RoIGp1c3QgaW4gY2FzZS4uLiApCkBAIC00Mzg5LDg2ICs0NDI4LDM3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1aW50OF90ICoKLWJpb3Nfb3V0cHV0X2NvbmZpZ19tYXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsCi0JCQkgdWludDE2X3QgcmVjb3JkLCBpbnQgcmVjb3JkX2xlbiwgaW50IHJlY29yZF9uciwKLQkJCSBib29sIG1hdGNoX2xpbmspCisvKiBCSVQgJ1UnLydkJyB0YWJsZSBlbmNvZGVyIHN1YnRhYmxlcyBoYXZlIGhhc2hlcyBtYXRjaGluZyB0aGVtIHRvCisgKiBhIHBhcnRpY3VsYXIgc2V0IG9mIGVuY29kZXJzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGEgcGFydGljdWxhciBEQ0IgZW50cnkgbWF0Y2hlcy4KKyAqLworYm9vbAorYmlvc19lbmNvZGVyX21hdGNoKHN0cnVjdCBkY2JfZW50cnkgKmRjYiwgdTMyIGhhc2gpCiB7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT52YmlvczsKLQl1aW50MzJfdCBlbnRyeTsKLQl1aW50MTZfdCB0YWJsZTsKLQlpbnQgaSwgdjsKKwlpZiAoKGhhc2ggJiAweDAwMDAwMGYwKSAhPSAoZGNiLT5sb2NhdGlvbiA8PCA0KSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICgoaGFzaCAmIDB4MDAwMDAwMGYpICE9IGRjYi0+dHlwZSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICghKGhhc2ggJiAoZGNiLT5vciA8PCAxNikpKQorCQlyZXR1cm4gZmFsc2U7CiAKLQlzd2l0Y2ggKGRjYmVudC0+dHlwZSkgeworCXN3aXRjaCAoZGNiLT50eXBlKSB7CiAJY2FzZSBPVVRQVVRfVE1EUzoKIAljYXNlIE9VVFBVVF9MVkRTOgogCWNhc2UgT1VUUFVUX0RQOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQltYXRjaF9saW5rID0gZmFsc2U7Ci0JCWJyZWFrOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCByZWNvcmRfbnI7IGkrKywgcmVjb3JkICs9IHJlY29yZF9sZW4pIHsKLQkJdGFibGUgPSBST00xNihiaW9zLT5kYXRhW3JlY29yZF0pOwotCQlpZiAoIXRhYmxlKQotCQkJY29udGludWU7Ci0JCWVudHJ5ID0gUk9NMzIoYmlvcy0+ZGF0YVt0YWJsZV0pOwotCi0JCWlmIChtYXRjaF9saW5rKSB7Ci0JCQl2ID0gKGVudHJ5ICYgMHgwMGMwMDAwMCkgPj4gMjI7Ci0JCQlpZiAoISh2ICYgZGNiZW50LT5zb3Jjb25mLmxpbmspKQotCQkJCWNvbnRpbnVlOworCQlpZiAoaGFzaCAmIDB4MDBjMDAwMDApIHsKKwkJCWlmICghKGhhc2ggJiAoZGNiLT5zb3Jjb25mLmxpbmsgPDwgMjIpKSkKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQotCQl2ID0gKGVudHJ5ICYgMHgwMDBmMDAwMCkgPj4gMTY7Ci0JCWlmICghKHYgJiBkY2JlbnQtPm9yKSkKLQkJCWNvbnRpbnVlOwotCi0JCXYgPSAoZW50cnkgJiAweDAwMDAwMGYwKSA+PiA0OwotCQlpZiAodiAhPSBkY2JlbnQtPmxvY2F0aW9uKQotCQkJY29udGludWU7Ci0KLQkJdiA9IChlbnRyeSAmIDB4MDAwMDAwMGYpOwotCQlpZiAodiAhPSBkY2JlbnQtPnR5cGUpCi0JCQljb250aW51ZTsKLQotCQlyZXR1cm4gJmJpb3MtPmRhdGFbdGFibGVdOworCWRlZmF1bHQ6CisJCXJldHVybiB0cnVlOwogCX0KLQotCXJldHVybiBOVUxMOwotfQotCi12b2lkICoKLW5vdXZlYXVfYmlvc19kcF90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsCi0JCSAgICAgIGludCAqbGVuZ3RoKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7Ci0JdWludDhfdCAqdGFibGU7Ci0KLQlpZiAoIWJpb3MtPmRpc3BsYXkuZHBfdGFibGVfcHRyKSB7Ci0JCU5WX0VSUk9SKGRldiwgIk5vIHBvaW50ZXIgdG8gRGlzcGxheVBvcnQgdGFibGVcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdGFibGUgPSAmYmlvcy0+ZGF0YVtiaW9zLT5kaXNwbGF5LmRwX3RhYmxlX3B0cl07Ci0KLQlpZiAodGFibGVbMF0gIT0gMHgyMCAmJiB0YWJsZVswXSAhPSAweDIxKSB7Ci0JCU5WX0VSUk9SKGRldiwgIkRpc3BsYXlQb3J0IHRhYmxlIHZlcnNpb24gMHglMDJ4IHVua25vd25cbiIsCi0JCQkgdGFibGVbMF0pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkqbGVuZ3RoID0gdGFibGVbNF07Ci0JcmV0dXJuIGJpb3Nfb3V0cHV0X2NvbmZpZ19tYXRjaChkZXYsIGRjYmVudCwKLQkJCQkJYmlvcy0+ZGlzcGxheS5kcF90YWJsZV9wdHIgKyB0YWJsZVsxXSwKLQkJCQkJdGFibGVbMl0sIHRhYmxlWzNdLCB0YWJsZVswXSA+PSAweDIxKTsKIH0KIAogaW50Ci1ub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LAotCQkJICAgICAgIHVpbnQzMl90IHN1YiwgaW50IHB4Y2xrKQorbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUxNiB0eXBlLCBpbnQgcGNsaywKKwkJCSAgICAgICBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsIGludCBjcnRjKQogewogCS8qCiAJICogVGhlIGRpc3BsYXkgc2NyaXB0IHRhYmxlIGlzIGxvY2F0ZWQgYnkgdGhlIEJJVCAnVScgdGFibGUuCkBAIC00NDk4LDcgKzQ0ODgsNyBAQAogCXVpbnQ4X3QgKnRhYmxlID0gJmJpb3MtPmRhdGFbYmlvcy0+ZGlzcGxheS5zY3JpcHRfdGFibGVfcHRyXTsKIAl1aW50OF90ICpvdGFibGUgPSBOVUxMOwogCXVpbnQxNl90IHNjcmlwdDsKLQlpbnQgaSA9IDA7CisJaW50IGk7CiAKIAlpZiAoIWJpb3MtPmRpc3BsYXkuc2NyaXB0X3RhYmxlX3B0cikgewogCQlOVl9FUlJPUihkZXYsICJObyBwb2ludGVyIHRvIG91dHB1dCBzY3JpcHQgdGFibGVcbiIpOwpAQCAtNDU1MCwzMCArNDU0MCwzMyBAQAogCiAJTlZfREVCVUdfS01TKGRldiwgIlNlYXJjaGluZyBmb3Igb3V0cHV0IGVudHJ5IGZvciAlZCAlZCAlZFxuIiwKIAkJCWRjYmVudC0+dHlwZSwgZGNiZW50LT5sb2NhdGlvbiwgZGNiZW50LT5vcik7Ci0Jb3RhYmxlID0gYmlvc19vdXRwdXRfY29uZmlnX21hdGNoKGRldiwgZGNiZW50LCB0YWJsZVsxXSArCi0JCQkJCSAgYmlvcy0+ZGlzcGxheS5zY3JpcHRfdGFibGVfcHRyLAotCQkJCQkgIHRhYmxlWzJdLCB0YWJsZVszXSwgdGFibGVbMF0gPj0gMHgyMSk7CisJZm9yIChpID0gMDsgaSA8IHRhYmxlWzNdOyBpKyspIHsKKwkJb3RhYmxlID0gUk9NUFRSKGJpb3MsIHRhYmxlW3RhYmxlWzFdICsgKGkgKiB0YWJsZVsyXSldKTsKKwkJaWYgKG90YWJsZSAmJiBiaW9zX2VuY29kZXJfbWF0Y2goZGNiZW50LCBST00zMihvdGFibGVbMF0pKSkKKwkJCWJyZWFrOworCX0KKwogCWlmICghb3RhYmxlKSB7CiAJCU5WX0RFQlVHX0tNUyhkZXYsICJmYWlsZWQgdG8gbWF0Y2ggYW55IG91dHB1dCB0YWJsZVxuIik7CiAJCXJldHVybiAxOwogCX0KIAotCWlmIChweGNsayA8IC0yIHx8IHB4Y2xrID4gMCkgeworCWlmIChwY2xrIDwgLTIgfHwgcGNsayA+IDApIHsKIAkJLyogVHJ5IHRvIGZpbmQgbWF0Y2hpbmcgc2NyaXB0IHRhYmxlIGVudHJ5ICovCiAJCWZvciAoaSA9IDA7IGkgPCBvdGFibGVbNV07IGkrKykgewotCQkJaWYgKFJPTTE2KG90YWJsZVt0YWJsZVs0XSArIGkqNl0pID09IHN1YikKKwkJCWlmIChST00xNihvdGFibGVbdGFibGVbNF0gKyBpKjZdKSA9PSB0eXBlKQogCQkJCWJyZWFrOwogCQl9CiAKIAkJaWYgKGkgPT0gb3RhYmxlWzVdKSB7CiAJCQlOVl9FUlJPUihkZXYsICJUYWJsZSAweCUwNHggbm90IGZvdW5kIGZvciAlZC8lZCwgIgogCQkJCSAgICAgICJ1c2luZyBmaXJzdFxuIiwKLQkJCQkgc3ViLCBkY2JlbnQtPnR5cGUsIGRjYmVudC0+b3IpOworCQkJCSB0eXBlLCBkY2JlbnQtPnR5cGUsIGRjYmVudC0+b3IpOwogCQkJaSA9IDA7CiAJCX0KIAl9CiAKLQlpZiAocHhjbGsgPT0gMCkgeworCWlmIChwY2xrID09IDApIHsKIAkJc2NyaXB0ID0gUk9NMTYob3RhYmxlWzZdKTsKIAkJaWYgKCFzY3JpcHQpIHsKIAkJCU5WX0RFQlVHX0tNUyhkZXYsICJvdXRwdXQgc2NyaXB0IDAgbm90IGZvdW5kXG4iKTsKQEAgLTQ1ODEsOSArNDU3NCw5IEBACiAJCX0KIAogCQlOVl9ERUJVR19LTVMoZGV2LCAiMHglMDRYOiBwYXJzaW5nIG91dHB1dCBzY3JpcHQgMFxuIiwgc2NyaXB0KTsKLQkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBkY2JlbnQpOworCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIGRjYmVudCwgY3J0Yyk7CiAJfSBlbHNlCi0JaWYgKHB4Y2xrID09IC0xKSB7CisJaWYgKHBjbGsgPT0gLTEpIHsKIAkJc2NyaXB0ID0gUk9NMTYob3RhYmxlWzhdKTsKIAkJaWYgKCFzY3JpcHQpIHsKIAkJCU5WX0RFQlVHX0tNUyhkZXYsICJvdXRwdXQgc2NyaXB0IDEgbm90IGZvdW5kXG4iKTsKQEAgLTQ1OTEsOSArNDU4NCw5IEBACiAJCX0KIAogCQlOVl9ERUJVR19LTVMoZGV2LCAiMHglMDRYOiBwYXJzaW5nIG91dHB1dCBzY3JpcHQgMVxuIiwgc2NyaXB0KTsKLQkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBkY2JlbnQpOworCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIGRjYmVudCwgY3J0Yyk7CiAJfSBlbHNlCi0JaWYgKHB4Y2xrID09IC0yKSB7CisJaWYgKHBjbGsgPT0gLTIpIHsKIAkJaWYgKHRhYmxlWzRdID49IDEyKQogCQkJc2NyaXB0ID0gUk9NMTYob3RhYmxlWzEwXSk7CiAJCWVsc2UKQEAgLTQ2MDQsMzEgKzQ1OTcsMzEgQEAKIAkJfQogCiAJCU5WX0RFQlVHX0tNUyhkZXYsICIweCUwNFg6IHBhcnNpbmcgb3V0cHV0IHNjcmlwdCAyXG4iLCBzY3JpcHQpOwotCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIGRjYmVudCk7CisJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgZGNiZW50LCBjcnRjKTsKIAl9IGVsc2UKLQlpZiAocHhjbGsgPiAwKSB7CisJaWYgKHBjbGsgPiAwKSB7CiAJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVt0YWJsZVs0XSArIGkqNiArIDJdKTsKIAkJaWYgKHNjcmlwdCkKLQkJCXNjcmlwdCA9IGNsa2NtcHRhYmxlKGJpb3MsIHNjcmlwdCwgcHhjbGspOworCQkJc2NyaXB0ID0gY2xrY21wdGFibGUoYmlvcywgc2NyaXB0LCBwY2xrKTsKIAkJaWYgKCFzY3JpcHQpIHsKIAkJCU5WX0RFQlVHX0tNUyhkZXYsICJjbG9jayBzY3JpcHQgMCBub3QgZm91bmRcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAogCQlOVl9ERUJVR19LTVMoZGV2LCAiMHglMDRYOiBwYXJzaW5nIGNsb2NrIHNjcmlwdCAwXG4iLCBzY3JpcHQpOwotCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIGRjYmVudCk7CisJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgZGNiZW50LCBjcnRjKTsKIAl9IGVsc2UKLQlpZiAocHhjbGsgPCAwKSB7CisJaWYgKHBjbGsgPCAwKSB7CiAJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVt0YWJsZVs0XSArIGkqNiArIDRdKTsKIAkJaWYgKHNjcmlwdCkKLQkJCXNjcmlwdCA9IGNsa2NtcHRhYmxlKGJpb3MsIHNjcmlwdCwgLXB4Y2xrKTsKKwkJCXNjcmlwdCA9IGNsa2NtcHRhYmxlKGJpb3MsIHNjcmlwdCwgLXBjbGspOwogCQlpZiAoIXNjcmlwdCkgewogCQkJTlZfREVCVUdfS01TKGRldiwgImNsb2NrIHNjcmlwdCAxIG5vdCBmb3VuZFxuIik7CiAJCQlyZXR1cm4gMTsKIAkJfQogCiAJCU5WX0RFQlVHX0tNUyhkZXYsICIweCUwNFg6IHBhcnNpbmcgY2xvY2sgc2NyaXB0IDFcbiIsIHNjcmlwdCk7Ci0JCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgZGNiZW50KTsKKwkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBkY2JlbnQsIGNydGMpOwogCX0KIAogCXJldHVybiAwOwpAQCAtNTQ3OCwxNCArNTQ3MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXBhcnNlX2JpdF9kaXNwbGF5cG9ydF90YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywKLQkJCQlzdHJ1Y3QgYml0X2VudHJ5ICpiaXRlbnRyeSkKLXsKLQliaW9zLT5kaXNwbGF5LmRwX3RhYmxlX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldF0pOwotCXJldHVybiAwOwotfQotCiBzdHJ1Y3QgYml0X3RhYmxlIHsKIAljb25zdCBjaGFyIGlkOwogCWludCAoKiBjb25zdCBwYXJzZV9mbikoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG52YmlvcyAqLCBzdHJ1Y3QgYml0X2VudHJ5ICopOwpAQCAtNTU1OSw3ICs1NTQ0LDYgQEAKIAlwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdMJywgbHZkcykpOwogCXBhcnNlX2JpdF90YWJsZShiaW9zLCBiaXRvZmZzZXQsICZCSVRfVEFCTEUoJ1QnLCB0bWRzKSk7CiAJcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnVScsIFUpKTsKLQlwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdkJywgZGlzcGxheXBvcnQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTg4NCw5ICs1ODY4LDE1IEBACiAJCQl9CiAKIAkJCWUtPmxpbmUgPSAoZS0+ZW50cnkgJiAweDAwMDAwMDFmKSA+PiAwOwotCQkJZS0+c3RhdGVfZGVmYXVsdCA9IChlLT5lbnRyeSAmIDB4MDEwMDAwMDApID4+IDI0OwotCQkJZS0+c3RhdGVbMF0gPSAoZS0+ZW50cnkgJiAweDE4MDAwMDAwKSA+PiAyNzsKLQkJCWUtPnN0YXRlWzFdID0gKGUtPmVudHJ5ICYgMHg2MDAwMDAwMCkgPj4gMjk7CisJCQlpZiAoZ3Bpb1swXSA9PSAweDQwKSB7CisJCQkJZS0+c3RhdGVfZGVmYXVsdCA9IChlLT5lbnRyeSAmIDB4MDEwMDAwMDApID4+IDI0OworCQkJCWUtPnN0YXRlWzBdID0gKGUtPmVudHJ5ICYgMHgxODAwMDAwMCkgPj4gMjc7CisJCQkJZS0+c3RhdGVbMV0gPSAoZS0+ZW50cnkgJiAweDYwMDAwMDAwKSA+PiAyOTsKKwkJCX0gZWxzZSB7CisJCQkJZS0+c3RhdGVfZGVmYXVsdCA9IChlLT5lbnRyeSAmIDB4MDAwMDAwODApID4+IDc7CisJCQkJZS0+c3RhdGVbMF0gPSAoZW50cnlbNF0gPj4gNCkgJiAzOworCQkJCWUtPnN0YXRlWzFdID0gKGVudHJ5WzRdID4+IDYpICYgMzsKKwkJCX0KIAkJfQogCX0KIApAQCAtNjE1Niw3ICs2MTQ2LDE0IEBACiAJfQogCWNhc2UgT1VUUFVUX0RQOgogCQllbnRyeS0+ZHBjb25mLnNvci5saW5rID0gKGNvbmYgJiAweDAwMDAwMDMwKSA+PiA0OwotCQllbnRyeS0+ZHBjb25mLmxpbmtfYncgPSAoY29uZiAmIDB4MDBlMDAwMDApID4+IDIxOworCQlzd2l0Y2ggKChjb25mICYgMHgwMGUwMDAwMCkgPj4gMjEpIHsKKwkJY2FzZSAwOgorCQkJZW50cnktPmRwY29uZi5saW5rX2J3ID0gMTYyMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllbnRyeS0+ZHBjb25mLmxpbmtfYncgPSAyNzAwMDA7CisJCQlicmVhazsKKwkJfQogCQlzd2l0Y2ggKChjb25mICYgMHgwZjAwMDAwMCkgPj4gMjQpIHsKIAkJY2FzZSAweGY6CiAJCQllbnRyeS0+ZHBjb25mLmxpbmtfbnIgPSA0OwpAQCAtNjc2OSw3ICs2NzY2LDcgQEAKIAogdm9pZAogbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQxNl90IHRhYmxlLAotCQkJICAgIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCkKKwkJCSAgICBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsIGludCBjcnRjKQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7CkBAIC02Nzc3LDExICs2Nzc0LDIyIEBACiAKIAlzcGluX2xvY2tfYmgoJmJpb3MtPmxvY2spOwogCWJpb3MtPmRpc3BsYXkub3V0cHV0ID0gZGNiZW50OworCWJpb3MtPmRpc3BsYXkuY3J0YyA9IGNydGM7CiAJcGFyc2VfaW5pdF90YWJsZShiaW9zLCB0YWJsZSwgJmlleGVjKTsKIAliaW9zLT5kaXNwbGF5Lm91dHB1dCA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfYmgoJmJpb3MtPmxvY2spOwogfQogCit2b2lkCitub3V2ZWF1X2Jpb3NfaW5pdF9leGVjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQxNl90IHRhYmxlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7CisJc3RydWN0IGluaXRfZXhlYyBpZXhlYyA9IHsgdHJ1ZSwgZmFsc2UgfTsKKworCXBhcnNlX2luaXRfdGFibGUoYmlvcywgdGFibGUsICZpZXhlYyk7Cit9CisKIHN0YXRpYyBib29sIE5WSW5pdFZCSU9TKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTY4NjMsOSArNjg3MSw4IEBACiAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgewogCQlmb3IgKGkgPSAwOyBpIDwgYmlvcy0+ZGNiLmVudHJpZXM7IGkrKykgewotCQkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwKLQkJCQkJCSAgICAgICAmYmlvcy0+ZGNiLmVudHJ5W2ldLAotCQkJCQkJICAgICAgIDAsIDApOworCQkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgMCwgMCwKKwkJCQkJCSAgICAgICAmYmlvcy0+ZGNiLmVudHJ5W2ldLCAtMSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmgKaW5kZXggMDUwYzMxNC4uOGFkYjY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmgKQEAgLTI4OSw4ICsyODksOCBAQAogCiAJc3RydWN0IHsKIAkJc3RydWN0IGRjYl9lbnRyeSAqb3V0cHV0OworCQlpbnQgY3J0YzsKIAkJdWludDE2X3Qgc2NyaXB0X3RhYmxlX3B0cjsKLQkJdWludDE2X3QgZHBfdGFibGVfcHRyOwogCX0gZGlzcGxheTsKIAogCXN0cnVjdCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKaW5kZXggODkwZDUwZS4uN2NjMzdlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl8xMCAmJgogCSAgICBudmJvLT50aWxlX21vZGUgJiYgKHR5cGUgJiBUVE1fUExfRkxBR19WUkFNKSAmJgotCSAgICBudmJvLT5iby5tZW0ubnVtX3BhZ2VzIDwgdnJhbV9wYWdlcyAvIDIpIHsKKwkgICAgbnZiby0+Ym8ubWVtLm51bV9wYWdlcyA8IHZyYW1fcGFnZXMgLyA0KSB7CiAJCS8qCiAJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBjb2xvciBhbmQgZGVwdGggYnVmZmVycyBhcmUgaGFuZGxlZAogCQkgKiBieSBpbmRlcGVuZGVudCBtZW1vcnkgY29udHJvbGxlciB1bml0cy4gVXAgdG8gYSA5eApAQCAtOTU2LDcgKzk1Niw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WX0MwKQorCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkKIAkJCXBhZ2Vfc2hpZnQgPSBub2RlLT5wYWdlX3NoaWZ0OwogCQllbHNlCiAJCQlwYWdlX3NoaWZ0ID0gMTI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2hhbm5lbC5jCmluZGV4IGIwZDc1M2YuLmJiNmVjOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2hhbm5lbC5jCkBAIC0xNTgsNiArMTU4LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmY2hhbi0+bnZzdy52Ymxfd2FpdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPm52c3cuZmxpcCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPmZlbmNlLnBlbmRpbmcpOworCXNwaW5fbG9ja19pbml0KCZjaGFuLT5mZW5jZS5sb2NrKTsKIAogCS8qIHNldHVwIGNoYW5uZWwncyBtZW1vcnkgYW5kIHZtICovCiAJcmV0ID0gbm91dmVhdV9ncHVvYmpfY2hhbm5lbF9pbml0KGNoYW4sIHZyYW1faGFuZGxlLCBnYXJ0X2hhbmRsZSk7CkBAIC00MTEsMTMgKzQxMiwxNyBAQAogCQlyZXR1cm4gcmV0OwogCWluaXQtPmNoYW5uZWwgID0gY2hhbi0+aWQ7CiAKLQlpZiAoY2hhbi0+ZG1hLmliX21heCkKLQkJaW5pdC0+cHVzaGJ1Zl9kb21haW5zID0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0gfAotCQkJCQlOT1VWRUFVX0dFTV9ET01BSU5fR0FSVDsKLQllbHNlIGlmIChjaGFuLT5wdXNoYnVmX2JvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pCisJaWYgKG5vdXZlYXVfdnJhbV9wdXNoYnVmID09IDApIHsKKwkJaWYgKGNoYW4tPmRtYS5pYl9tYXgpCisJCQlpbml0LT5wdXNoYnVmX2RvbWFpbnMgPSBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTSB8CisJCQkJCQlOT1VWRUFVX0dFTV9ET01BSU5fR0FSVDsKKwkJZWxzZSBpZiAoY2hhbi0+cHVzaGJ1Zl9iby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNKQorCQkJaW5pdC0+cHVzaGJ1Zl9kb21haW5zID0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU07CisJCWVsc2UKKwkJCWluaXQtPnB1c2hidWZfZG9tYWlucyA9IE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUOworCX0gZWxzZSB7CiAJCWluaXQtPnB1c2hidWZfZG9tYWlucyA9IE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNOwotCWVsc2UKLQkJaW5pdC0+cHVzaGJ1Zl9kb21haW5zID0gTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQ7CisJfQogCiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkgewogCQlpbml0LT5zdWJjaGFuWzBdLmhhbmRsZSA9IE52TTJNRjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jCmluZGV4IDkzOWQ0ZGYuLmNlYTY2OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuYwpAQCAtMzksNyArMzksNyBAQAogCiBzdGF0aWMgdm9pZCBub3V2ZWF1X2Nvbm5lY3Rvcl9ob3RwbHVnKHZvaWQgKiwgaW50KTsKIAotc3RhdGljIHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKgorc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqCiBmaW5kX2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IHR5cGUpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwpAQCAtMTE2LDEwICsxMTYsNiBAQAogCQkJCSAgICAgIG5vdXZlYXVfY29ubmVjdG9yX2hvdHBsdWcsIGNvbm5lY3Rvcik7CiAJfQogCi0JaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMgfHwKLQkgICAgY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKQotCQlub3V2ZWF1X2JhY2tsaWdodF9leGl0KGNvbm5lY3Rvcik7Ci0KIAlrZnJlZShudl9jb25uZWN0b3ItPmVkaWQpOwogCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CiAJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CkBAIC03MTIsMTIgKzcwOCw5IEBACiAJY2FzZSBPVVRQVVRfVFY6CiAJCXJldHVybiBnZXRfc2xhdmVfZnVuY3MoZW5jb2RlciktPm1vZGVfdmFsaWQoZW5jb2RlciwgbW9kZSk7CiAJY2FzZSBPVVRQVVRfRFA6Ci0JCWlmIChudl9lbmNvZGVyLT5kcC5saW5rX2J3ID09IERQX0xJTktfQldfMl83KQotCQkJbWF4X2Nsb2NrID0gbnZfZW5jb2Rlci0+ZHAubGlua19uciAqIDI3MDAwMDsKLQkJZWxzZQotCQkJbWF4X2Nsb2NrID0gbnZfZW5jb2Rlci0+ZHAubGlua19uciAqIDE2MjAwMDsKLQotCQljbG9jayA9IGNsb2NrICogbm91dmVhdV9jb25uZWN0b3JfYnBwKGNvbm5lY3RvcikgLyA4OworCQltYXhfY2xvY2sgID0gbnZfZW5jb2Rlci0+ZHAubGlua19ucjsKKwkJbWF4X2Nsb2NrICo9IG52X2VuY29kZXItPmRwLmxpbmtfYnc7CisJCWNsb2NrID0gY2xvY2sgKiBub3V2ZWF1X2Nvbm5lY3Rvcl9icHAoY29ubmVjdG9yKSAvIDEwOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUdfT04oMSk7CkBAIC04NzEsNyArODY0LDYgQEAKIAkJCQkJZGV2LT5tb2RlX2NvbmZpZy5zY2FsaW5nX21vZGVfcHJvcGVydHksCiAJCQkJCW52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlKTsKIAkJfQotCQljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9DT05ORUNUOwogCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIERDQl9DT05ORUNUT1JfVFZfMDoKIAljYXNlIERDQl9DT05ORUNUT1JfVFZfMToKQEAgLTg4OCwyNyArODgwLDIwIEBACiAJCQkJZGV2LT5tb2RlX2NvbmZpZy5kaXRoZXJpbmdfbW9kZV9wcm9wZXJ0eSwKIAkJCQludl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcgPwogCQkJCURSTV9NT0RFX0RJVEhFUklOR19PTiA6IERSTV9NT0RFX0RJVEhFUklOR19PRkYpOwotCi0JCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlICE9IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKSB7Ci0JCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkKLQkJCQljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7Ci0JCQllbHNlCi0JCQkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVDsKLQkJfQogCQlicmVhazsKIAl9CiAKLQlpZiAocGdwaW8tPmlycV9yZWdpc3RlcikgeworCWlmIChudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcgIT0gMHhmZiAmJiBwZ3Bpby0+aXJxX3JlZ2lzdGVyKSB7CiAJCXBncGlvLT5pcnFfcmVnaXN0ZXIoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsCiAJCQkJICAgIG5vdXZlYXVfY29ubmVjdG9yX2hvdHBsdWcsIGNvbm5lY3Rvcik7CisKKwkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOworCX0gZWxzZSB7CisJCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0NPTk5FQ1Q7CiAJfQogCiAJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKIAotCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTIHx8Ci0JICAgIGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkKLQkJbm91dmVhdV9iYWNrbGlnaHRfaW5pdChjb25uZWN0b3IpOwotCiAJZGNiLT5kcm0gPSBjb25uZWN0b3I7CiAJcmV0dXJuIGRjYi0+ZHJtOwogCkBAIC05MjUsMjIgKzkxMCwxMyBAQAogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSBkYXRhOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKIAotCU5WX0lORk8oZGV2LCAiJXNwbHVnZ2VkICVzXG4iLCBwbHVnZ2VkID8gIiIgOiAidW4iLAotCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCU5WX0RFQlVHKGRldiwgIiVzcGx1Z2dlZCAlc1xuIiwgcGx1Z2dlZCA/ICIiIDogInVuIiwKKwkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CiAKLQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyICYmIGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0YyAmJgotCSAgICBjb25uZWN0b3ItPmVuY29kZXItPmNydGMtPmVuYWJsZWQpIHsKLQkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2Rlcihjb25uZWN0b3ItPmVuY29kZXIpOwotCQlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXIgPQotCQkJY29ubmVjdG9yLT5lbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKLQotCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9EUCkgewotCQkJaWYgKHBsdWdnZWQpCi0JCQkJaGVscGVyLT5kcG1zKGNvbm5lY3Rvci0+ZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7Ci0JCQllbHNlCi0JCQkJaGVscGVyLT5kcG1zKGNvbm5lY3Rvci0+ZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOwotCQl9Ci0JfQorCWlmIChwbHVnZ2VkKQorCQlkcm1faGVscGVyX2Nvbm5lY3Rvcl9kcG1zKGNvbm5lY3RvciwgRFJNX01PREVfRFBNU19PTik7CisJZWxzZQorCQlkcm1faGVscGVyX2Nvbm5lY3Rvcl9kcG1zKGNvbm5lY3RvciwgRFJNX01PREVfRFBNU19PRkYpOwogCiAJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NydGMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY3J0Yy5oCmluZGV4IGNiMWNlMmEuLmJmOGUxMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY3J0Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY3J0Yy5oCkBAIC04MiwxNCArODIsMTMgQEAKIH0KIAogaW50IG52NTBfY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGluZGV4KTsKLWludCBudjUwX2N1cnNvcl9pbml0KHN0cnVjdCBub3V2ZWF1X2NydGMgKik7Ci12b2lkIG52NTBfY3Vyc29yX2Zpbmkoc3RydWN0IG5vdXZlYXVfY3J0YyAqKTsKIGludCBudjUwX2NydGNfY3Vyc29yX3NldChzdHJ1Y3QgZHJtX2NydGMgKmRybV9jcnRjLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKIAkJCSB1aW50MzJfdCBidWZmZXJfaGFuZGxlLCB1aW50MzJfdCB3aWR0aCwKIAkJCSB1aW50MzJfdCBoZWlnaHQpOwogaW50IG52NTBfY3J0Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmRybV9jcnRjLCBpbnQgeCwgaW50IHkpOwogCiBpbnQgbnYwNF9jdXJzb3JfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jcnRjICopOworaW50IG52NTBfY3Vyc29yX2luaXQoc3RydWN0IG5vdXZlYXVfY3J0YyAqKTsKIAogc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICoKIG5vdXZlYXVfY3J0Y19jb25uZWN0b3JfZ2V0KHN0cnVjdCBub3V2ZWF1X2NydGMgKmNydGMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rpc3BsYXkuYwppbmRleCBlYjUxNGVhLi5kZGJhYmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rpc3BsYXkuYwpAQCAtMTA1LDkgKzEwNSwxMiBAQAogCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkKIAkJCW52X2ZiLT5yX2Zvcm1hdCB8PSAodGlsZV9mbGFncyA8PCA4KTsKIAotCQlpZiAoIXRpbGVfZmxhZ3MpCi0JCQludl9mYi0+cl9waXRjaCA9IDB4MDAxMDAwMDAgfCBmYi0+cGl0Y2g7Ci0JCWVsc2UgeworCQlpZiAoIXRpbGVfZmxhZ3MpIHsKKwkJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfRDApCisJCQkJbnZfZmItPnJfcGl0Y2ggPSAweDAwMTAwMDAwIHwgZmItPnBpdGNoOworCQkJZWxzZQorCQkJCW52X2ZiLT5yX3BpdGNoID0gMHgwMTAwMDAwMCB8IGZiLT5waXRjaDsKKwkJfSBlbHNlIHsKIAkJCXUzMiBtb2RlID0gbnZiby0+dGlsZV9tb2RlOwogCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfQzApCiAJCQkJbW9kZSA+Pj0gNDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYwppbmRleCA3YmViODJhLi5kZTVlZmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcC5jCkBAIC0yOCw0MTggKzI4LDYxOSBAQAogI2luY2x1ZGUgIm5vdXZlYXVfaTJjLmgiCiAjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKICNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYXV4IGNoYW5uZWwgdXRpbCBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQVVYX0RCRyhmbXQsIGFyZ3MuLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKG5vdXZlYXVfcmVnX2RlYnVnICYgTk9VVkVBVV9SRUdfREVCVUdfQVVYQ0gpIHsgICAgICAgICAgICAgICAgICAgICBcCisJCU5WX1BSSU5USyhLRVJOX0RFQlVHLCBkZXYsICJBVVhDSCglZCk6ICIgZm10LCBjaCwgIyNhcmdzKTsgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEFVWF9FUlIoZm10LCBhcmdzLi4uKSBOVl9FUlJPUihkZXYsICJBVVhDSCglZCk6ICIgZm10LCBjaCwgIyNhcmdzKQorCitzdGF0aWMgdm9pZAorYXV4Y2hfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2gpCit7CisJbnZfbWFzayhkZXYsIDB4MDBlNGU0ICsgKGNoICogMHg1MCksIDB4MDAzMTAwMDAsIDB4MDAwMDAwMDApOworfQogCiBzdGF0aWMgaW50Ci1hdXhjaF9yZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhZGRyZXNzLCB1aW50OF90ICpidWYsIGludCBzaXplKQorYXV4Y2hfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2gpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaDsKLQlpbnQgcmV0OworCWNvbnN0IHUzMiB1bmtzZWwgPSAxOyAvKiBuZmkgd2hpY2ggdG8gdXNlLCBvciBpZiBpdCBtYXR0ZXJzLi4gKi8KKwljb25zdCB1MzIgdXJlcSA9IHVua3NlbCA/IDB4MDAxMDAwMDAgOiAweDAwMjAwMDAwOworCWNvbnN0IHUzMiB1cmVwID0gdW5rc2VsID8gMHgwMTAwMDAwMCA6IDB4MDIwMDAwMDA7CisJdTMyIGN0cmwsIHRpbWVvdXQ7CiAKLQlhdXhjaCA9IG5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBudl9lbmNvZGVyLT5kY2ItPmkyY19pbmRleCk7Ci0JaWYgKCFhdXhjaCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogd2FpdCB1cCB0byAxbXMgZm9yIGFueSBwcmV2aW91cyB0cmFuc2FjdGlvbiB0byBiZSBkb25lLi4uICovCisJdGltZW91dCA9IDEwMDA7CisJZG8geworCQljdHJsID0gbnZfcmQzMihkZXYsIDB4MDBlNGU0ICsgKGNoICogMHg1MCkpOworCQl1ZGVsYXkoMSk7CisJCWlmICghdGltZW91dC0tKSB7CisJCQlBVVhfRVJSKCJiZWdpbiBpZGxlIHRpbWVvdXQgMHglMDh4IiwgY3RybCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfSB3aGlsZSAoY3RybCAmIDB4MDMwMTAwMDApOwogCi0JcmV0ID0gbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgOSwgYWRkcmVzcywgYnVmLCBzaXplKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCS8qIHNldCBzb21lIG1hZ2ljLCBhbmQgd2FpdCB1cCB0byAxbXMgZm9yIGl0IHRvIGFwcGVhciAqLworCW52X21hc2soZGV2LCAweDAwZTRlNCArIChjaCAqIDB4NTApLCAweDAwMzAwMDAwLCB1cmVxKTsKKwl0aW1lb3V0ID0gMTAwMDsKKwlkbyB7CisJCWN0cmwgPSBudl9yZDMyKGRldiwgMHgwMGU0ZTQgKyAoY2ggKiAweDUwKSk7CisJCXVkZWxheSgxKTsKKwkJaWYgKCF0aW1lb3V0LS0pIHsKKwkJCUFVWF9FUlIoIm1hZ2ljIHdhaXQgMHglMDh4XG4iLCBjdHJsKTsKKwkJCWF1eGNoX2ZpbmkoZGV2LCBjaCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfSB3aGlsZSAoKGN0cmwgJiAweDAzMDAwMDAwKSAhPSB1cmVwKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1hdXhjaF93cihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhZGRyZXNzLCB1aW50OF90ICpidWYsIGludCBzaXplKQorYXV4Y2hfdHgoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoLCB1OCB0eXBlLCB1MzIgYWRkciwgdTggKmRhdGEsIHU4IHNpemUpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaDsKLQlpbnQgcmV0OworCXUzMiBjdHJsLCBzdGF0LCB0aW1lb3V0LCByZXRyaWVzOworCXUzMiB4YnVmWzRdID0ge307CisJaW50IHJldCwgaTsKIAotCWF1eGNoID0gbm91dmVhdV9pMmNfZmluZChkZXYsIG52X2VuY29kZXItPmRjYi0+aTJjX2luZGV4KTsKLQlpZiAoIWF1eGNoKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlBVVhfREJHKCIlZDogMHglMDh4ICVkXG4iLCB0eXBlLCBhZGRyLCBzaXplKTsKIAotCXJldCA9IG5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDgsIGFkZHJlc3MsIGJ1Ziwgc2l6ZSk7CisJcmV0ID0gYXV4Y2hfaW5pdChkZXYsIGNoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXN0YXQgPSBudl9yZDMyKGRldiwgMHgwMGU0ZTggKyAoY2ggKiAweDUwKSk7CisJaWYgKCEoc3RhdCAmIDB4MTAwMDAwMDApKSB7CisJCUFVWF9EQkcoInNpbmsgbm90IGRldGVjdGVkXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoISh0eXBlICYgMSkpIHsKKwkJbWVtY3B5KHhidWYsIGRhdGEsIHNpemUpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gNCkgeworCQkJQVVYX0RCRygid3IgMHglMDh4XG4iLCB4YnVmW2kgLyA0XSk7CisJCQludl93cjMyKGRldiwgMHgwMGU0YzAgKyAoY2ggKiAweDUwKSArIGksIHhidWZbaSAvIDRdKTsKKwkJfQorCX0KKworCWN0cmwgID0gbnZfcmQzMihkZXYsIDB4MDBlNGU0ICsgKGNoICogMHg1MCkpOworCWN0cmwgJj0gfjB4MDAwMWYwZmY7CisJY3RybCB8PSB0eXBlIDw8IDEyOworCWN0cmwgfD0gc2l6ZSAtIDE7CisJbnZfd3IzMihkZXYsIDB4MDBlNGUwICsgKGNoICogMHg1MCksIGFkZHIpOworCisJLyogcmV0cnkgdHJhbnNhY3Rpb24gYSBudW1iZXIgb2YgdGltZXMgb24gZmFpbHVyZS4uLiAqLworCXJldCA9IC1FUkVNT1RFSU87CisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDMyOyByZXRyaWVzKyspIHsKKwkJLyogcmVzZXQsIGFuZCBkZWxheSBhIHdoaWxlIGlmIHRoaXMgaXMgYSByZXRyeSAqLworCQludl93cjMyKGRldiwgMHgwMGU0ZTQgKyAoY2ggKiAweDUwKSwgMHg4MDAwMDAwMCB8IGN0cmwpOworCQludl93cjMyKGRldiwgMHgwMGU0ZTQgKyAoY2ggKiAweDUwKSwgMHgwMDAwMDAwMCB8IGN0cmwpOworCQlpZiAocmV0cmllcykKKwkJCXVkZWxheSg0MDApOworCisJCS8qIHRyYW5zYWN0aW9uIHJlcXVlc3QsIHdhaXQgdXAgdG8gMW1zIGZvciBpdCB0byBjb21wbGV0ZSAqLworCQludl93cjMyKGRldiwgMHgwMGU0ZTQgKyAoY2ggKiAweDUwKSwgMHgwMDAxMDAwMCB8IGN0cmwpOworCisJCXRpbWVvdXQgPSAxMDAwOworCQlkbyB7CisJCQljdHJsID0gbnZfcmQzMihkZXYsIDB4MDBlNGU0ICsgKGNoICogMHg1MCkpOworCQkJdWRlbGF5KDEpOworCQkJaWYgKCF0aW1lb3V0LS0pIHsKKwkJCQlBVVhfRVJSKCJ0eCByZXEgdGltZW91dCAweCUwOHhcbiIsIGN0cmwpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IHdoaWxlIChjdHJsICYgMHgwMDAxMDAwMCk7CisKKwkJLyogcmVhZCBzdGF0dXMsIGFuZCBjaGVjayBpZiB0cmFuc2FjdGlvbiBjb21wbGV0ZWQgb2sgKi8KKwkJc3RhdCA9IG52X21hc2soZGV2LCAweDAwZTRlOCArIChjaCAqIDB4NTApLCAwLCAwKTsKKwkJaWYgKCEoc3RhdCAmIDB4MDAwZjBmMDApKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlBVVhfREJHKCIlMDJkIDB4JTA4eCAweCUwOHhcbiIsIHJldHJpZXMsIGN0cmwsIHN0YXQpOworCX0KKworCWlmICh0eXBlICYgMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gNCkgeworCQkJeGJ1ZltpIC8gNF0gPSBudl9yZDMyKGRldiwgMHgwMGU0ZDAgKyAoY2ggKiAweDUwKSArIGkpOworCQkJQVVYX0RCRygicmQgMHglMDh4XG4iLCB4YnVmW2kgLyA0XSk7CisJCX0KKwkJbWVtY3B5KGRhdGEsIHhidWYsIHNpemUpOworCX0KKworb3V0OgorCWF1eGNoX2ZpbmkoZGV2LCBjaCk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludAotbm91dmVhdV9kcF9sYW5lX2NvdW50X3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHVpbnQ4X3QgY21kKQorc3RhdGljIHUzMgorZHBfbGlua19id19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG9yLCBpbnQgbGluaykKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7Ci0JdWludDMyX3QgdG1wOwotCWludCBvciA9IG52X2VuY29kZXItPm9yLCBsaW5rID0gIShudl9lbmNvZGVyLT5kY2ItPnNvcmNvbmYubGluayAmIDEpOwotCi0JdG1wICA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSk7Ci0JdG1wICY9IH4oTlY1MF9TT1JfRFBfQ1RSTF9FTkhBTkNFRF9GUkFNRV9FTkFCTEVEIHwKLQkJIE5WNTBfU09SX0RQX0NUUkxfTEFORV9NQVNLKTsKLQl0bXAgfD0gKCgxIDw8IChjbWQgJiBEUF9MQU5FX0NPVU5UX01BU0spKSAtIDEpIDw8IDE2OwotCWlmIChjbWQgJiBEUF9MQU5FX0NPVU5UX0VOSEFOQ0VEX0ZSQU1FX0VOKQotCQl0bXAgfD0gTlY1MF9TT1JfRFBfQ1RSTF9FTkhBTkNFRF9GUkFNRV9FTkFCTEVEOwotCW52X3dyMzIoZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSwgdG1wKTsKLQotCXJldHVybiBhdXhjaF93cihlbmNvZGVyLCBEUF9MQU5FX0NPVU5UX1NFVCwgJmNtZCwgMSk7CisJdTMyIGN0cmwgPSBudl9yZDMyKGRldiwgMHg2MTQzMDAgKyAob3IgKiAweDgwMCkpOworCWlmICghKGN0cmwgJiAweDAwMGMwMDAwKSkKKwkJcmV0dXJuIDE2MjAwMDsKKwlyZXR1cm4gMjcwMDAwOwogfQogCiBzdGF0aWMgaW50Ci1ub3V2ZWF1X2RwX2xpbmtfYndfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgdWludDhfdCBjbWQpCitkcF9sYW5lX2NvdW50X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3IsIGludCBsaW5rKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQl1aW50MzJfdCB0bXA7Ci0JaW50IHJlZyA9IDB4NjE0MzAwICsgKG52X2VuY29kZXItPm9yICogMHg4MDApOworCXUzMiBjdHJsID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspKTsKKwlzd2l0Y2ggKGN0cmwgJiAweDAwMGYwMDAwKSB7CisJY2FzZSAweDAwMDEwMDAwOiByZXR1cm4gMTsKKwljYXNlIDB4MDAwMzAwMDA6IHJldHVybiAyOworCWRlZmF1bHQ6CisJCXJldHVybiA0OworCX0KK30KIAotCXRtcCAgPSBudl9yZDMyKGRldiwgcmVnKTsKLQl0bXAgJj0gMHhmZmYzZmZmZjsKLQlpZiAoY21kID09IERQX0xJTktfQldfMl83KQotCQl0bXAgfD0gMHgwMDA0MDAwMDsKLQludl93cjMyKGRldiwgcmVnLCB0bXApOwordm9pZAorbm91dmVhdV9kcF90dV91cGRhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG9yLCBpbnQgbGluaywgdTMyIGNsaywgdTMyIGJwcCkKK3sKKwljb25zdCB1MzIgc3ltYm9sID0gMTAwMDAwOworCWludCBiZXN0VFUgPSAwLCBiZXN0VlRVaSA9IDAsIGJlc3RWVFVmID0gMCwgYmVzdFZUVWEgPSAwOworCWludCBUVSwgVlRVaSwgVlRVZiwgVlRVYTsKKwl1NjQgbGlua19kYXRhX3JhdGUsIGxpbmtfcmF0aW8sIHVuazsKKwl1MzIgYmVzdF9kaWZmID0gNjQgKiBzeW1ib2w7CisJdTMyIGxpbmtfbnIsIGxpbmtfYncsIHI7CiAKLQlyZXR1cm4gYXV4Y2hfd3IoZW5jb2RlciwgRFBfTElOS19CV19TRVQsICZjbWQsIDEpOworCS8qIGNhbGN1bGF0ZSBwYWNrZWQgZGF0YSByYXRlIGZvciBlYWNoIGxhbmUgKi8KKwlsaW5rX25yID0gZHBfbGFuZV9jb3VudF9nZXQoZGV2LCBvciwgbGluayk7CisJbGlua19kYXRhX3JhdGUgPSAoY2xrICogYnBwIC8gOCkgLyBsaW5rX25yOworCisJLyogY2FsY3VsYXRlIHJhdGlvIG9mIHBhY2tlZCBkYXRhIHJhdGUgdG8gbGluayBzeW1ib2wgcmF0ZSAqLworCWxpbmtfYncgPSBkcF9saW5rX2J3X2dldChkZXYsIG9yLCBsaW5rKTsKKwlsaW5rX3JhdGlvID0gbGlua19kYXRhX3JhdGUgKiBzeW1ib2w7CisJciA9IGRvX2RpdihsaW5rX3JhdGlvLCBsaW5rX2J3KTsKKworCWZvciAoVFUgPSA2NDsgVFUgPj0gMzI7IFRVLS0pIHsKKwkJLyogY2FsY3VsYXRlIGF2ZXJhZ2UgbnVtYmVyIG9mIHZhbGlkIHN5bWJvbHMgaW4gZWFjaCBUVSAqLworCQl1MzIgdHVfdmFsaWQgPSBsaW5rX3JhdGlvICogVFU7CisJCXUzMiBjYWxjLCBkaWZmOworCisJCS8qIGZpbmQgYSBodyByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGZyYWN0aW9uLi4gKi8KKwkJVlRVaSA9IHR1X3ZhbGlkIC8gc3ltYm9sOworCQljYWxjID0gVlRVaSAqIHN5bWJvbDsKKwkJZGlmZiA9IHR1X3ZhbGlkIC0gY2FsYzsKKwkJaWYgKGRpZmYpIHsKKwkJCWlmIChkaWZmID49IChzeW1ib2wgLyAyKSkgeworCQkJCVZUVWYgPSBzeW1ib2wgLyAoc3ltYm9sIC0gZGlmZik7CisJCQkJaWYgKHN5bWJvbCAtIChWVFVmICogZGlmZikpCisJCQkJCVZUVWYrKzsKKworCQkJCWlmIChWVFVmIDw9IDE1KSB7CisJCQkJCVZUVWEgID0gMTsKKwkJCQkJY2FsYyArPSBzeW1ib2wgLSAoc3ltYm9sIC8gVlRVZik7CisJCQkJfSBlbHNlIHsKKwkJCQkJVlRVYSAgPSAwOworCQkJCQlWVFVmICA9IDE7CisJCQkJCWNhbGMgKz0gc3ltYm9sOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJVlRVYSAgPSAwOworCQkJCVZUVWYgID0gbWluKChpbnQpKHN5bWJvbCAvIGRpZmYpLCAxNSk7CisJCQkJY2FsYyArPSBzeW1ib2wgLyBWVFVmOworCQkJfQorCisJCQlkaWZmID0gY2FsYyAtIHR1X3ZhbGlkOworCQl9IGVsc2UgeworCQkJLyogbm8gcmVtYWluZGVyLCBidXQgdGhlIGh3IGRvZXNuJ3QgbGlrZSB0aGUgZnJhY3Rpb25hbAorCQkJICogcGFydCB0byBiZSB6ZXJvLiAgZGVjcmVtZW50IHRoZSBpbnRlZ2VyIHBhcnQgYW5kCisJCQkgKiBoYXZlIHRoZSBmcmFjdGlvbiBhZGQgYSB3aG9sZSBzeW1ib2wgYmFjaworCQkJICovCisJCQlWVFVhID0gMDsKKwkJCVZUVWYgPSAxOworCQkJVlRVaS0tOworCQl9CisKKwkJaWYgKGRpZmYgPCBiZXN0X2RpZmYpIHsKKwkJCWJlc3RfZGlmZiA9IGRpZmY7CisJCQliZXN0VFUgPSBUVTsKKwkJCWJlc3RWVFVhID0gVlRVYTsKKwkJCWJlc3RWVFVmID0gVlRVZjsKKwkJCWJlc3RWVFVpID0gVlRVaTsKKwkJCWlmIChkaWZmID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWJlc3RUVSkgeworCQlOVl9FUlJPUihkZXYsICJEUDogdW5hYmxlIHRvIGZpbmQgc3VpdGFibGUgY29uZmlnXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFhYWCBjbG9zZSB0byB2YmlvcyBudW1iZXJzLCBidXQgbm90IHJpZ2h0ICovCisJdW5rICA9IChzeW1ib2wgLSBsaW5rX3JhdGlvKSAqIGJlc3RUVTsKKwl1bmsgKj0gbGlua19yYXRpbzsKKwlyID0gZG9fZGl2KHVuaywgc3ltYm9sKTsKKwlyID0gZG9fZGl2KHVuaywgc3ltYm9sKTsKKwl1bmsgKz0gNjsKKworCW52X21hc2soZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSwgMHgwMDAwMDFmYywgYmVzdFRVIDw8IDIpOworCW52X21hc2soZGV2LCBOVjUwX1NPUl9EUF9TQ0ZHKG9yLCBsaW5rKSwgMHgwMTBmN2YzZiwgYmVzdFZUVWEgPDwgMjQgfAorCQkJCQkJCSAgICAgYmVzdFZUVWYgPDwgMTYgfAorCQkJCQkJCSAgICAgYmVzdFZUVWkgPDwgOCB8CisJCQkJCQkJICAgICB1bmspOworfQorCit1OCAqCitub3V2ZWF1X2RwX2Jpb3NfZGF0YShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IsIHU4ICoqZW50cnkpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT52YmlvczsKKwlzdHJ1Y3QgYml0X2VudHJ5IGQ7CisJdTggKnRhYmxlOworCWludCBpOworCisJaWYgKGJpdF90YWJsZShkZXYsICdkJywgJmQpKSB7CisJCU5WX0VSUk9SKGRldiwgIkJJVCAnZCcgdGFibGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGQudmVyc2lvbiAhPSAxKSB7CisJCU5WX0VSUk9SKGRldiwgIkJJVCAnZCcgdGFibGUgdmVyc2lvbiAlZCB1bmtub3duXG4iLCBkLnZlcnNpb24pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0YWJsZSA9IFJPTVBUUihiaW9zLCBkLmRhdGFbMF0pOworCWlmICghdGFibGUpIHsKKwkJTlZfRVJST1IoZGV2LCAiZGlzcGxheXBvcnQgdGFibGUgcG9pbnRlciBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3dpdGNoICh0YWJsZVswXSkgeworCWNhc2UgMHgyMDoKKwljYXNlIDB4MjE6CisJY2FzZSAweDMwOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsICJkaXNwbGF5cG9ydCB0YWJsZSAweCUwMnggdW5rbm93blxuIiwgdGFibGVbMF0pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVbM107IGkrKykgeworCQkqZW50cnkgPSBST01QVFIoYmlvcywgdGFibGVbdGFibGVbMV0gKyAoaSAqIHRhYmxlWzJdKV0pOworCQlpZiAoKmVudHJ5ICYmIGJpb3NfZW5jb2Rlcl9tYXRjaChkY2IsIFJPTTMyKCgqZW50cnkpWzBdKSkpCisJCQlyZXR1cm4gdGFibGU7CisJfQorCisJTlZfRVJST1IoZGV2LCAiZGlzcGxheXBvcnQgZW5jb2RlciB0YWJsZSBub3QgZm91bmRcbiIpOworCXJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBsaW5rIHRyYWluaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZHBfc3RhdGUgeworCXN0cnVjdCBkY2JfZW50cnkgKmRjYjsKKwl1OCAqdGFibGU7CisJdTggKmVudHJ5OworCWludCBhdXhjaDsKKwlpbnQgY3J0YzsKKwlpbnQgb3I7CisJaW50IGxpbms7CisJdTggKmRwY2Q7CisJaW50IGxpbmtfbnI7CisJdTMyIGxpbmtfYnc7CisJdTggIHN0YXRbNl07CisJdTggIGNvbmZbNF07Cit9OworCitzdGF0aWMgdm9pZAorZHBfc2V0X2xpbmtfY29uZmlnKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcF9zdGF0ZSAqZHApCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgb3IgPSBkcC0+b3IsIGxpbmsgPSBkcC0+bGluazsKKwl1OCAqZW50cnksIHNpbmtbMl07CisJdTMyIGRwX2N0cmw7CisJdTE2IHNjcmlwdDsKKworCU5WX0RFQlVHX0tNUyhkZXYsICIlZCBsYW5lcyBhdCAlZCBLQi9zXG4iLCBkcC0+bGlua19uciwgZHAtPmxpbmtfYncpOworCisJLyogc2V0IHNlbGVjdGVkIGxpbmsgcmF0ZSBvbiBzb3VyY2UgKi8KKwlzd2l0Y2ggKGRwLT5saW5rX2J3KSB7CisJY2FzZSAyNzAwMDA6CisJCW52X21hc2soZGV2LCAweDYxNDMwMCArIChvciAqIDB4ODAwKSwgMHgwMDBjMDAwMCwgMHgwMDA0MDAwMCk7CisJCXNpbmtbMF0gPSBEUF9MSU5LX0JXXzJfNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnZfbWFzayhkZXYsIDB4NjE0MzAwICsgKG9yICogMHg4MDApLCAweDAwMGMwMDAwLCAweDAwMDAwMDAwKTsKKwkJc2lua1swXSA9IERQX0xJTktfQldfMV82MjsKKwkJYnJlYWs7CisJfQorCisJLyogb2Zmc2V0ICsweDBhIG9mIGVhY2ggZHAgZW5jb2RlciB0YWJsZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlcgorCSAqIHRhYmxlLCB0aGF0IGhhcyAoYW1vbmcgb3RoZXIgdGhpbmdzKSBwb2ludGVycyB0byBtb3JlIHNjcmlwdHMgdGhhdAorCSAqIG5lZWQgdG8gYmUgZXhlY3V0ZWQsIHRoaXMgdGltZSBkZXBlbmRpbmcgb24gbGluayBzcGVlZC4KKwkgKi8KKwllbnRyeSA9IFJPTVBUUigmZGV2X3ByaXYtPnZiaW9zLCBkcC0+ZW50cnlbMTBdKTsKKwlpZiAoZW50cnkpIHsKKwkJaWYgKGRwLT50YWJsZVswXSA8IDB4MzApIHsKKwkJCXdoaWxlIChkcC0+bGlua19idyA8IChST00xNihlbnRyeVswXSkgKiAxMCkpCisJCQkJZW50cnkgKz0gNDsKKwkJCXNjcmlwdCA9IFJPTTE2KGVudHJ5WzJdKTsKKwkJfSBlbHNlIHsKKwkJCXdoaWxlIChkcC0+bGlua19idyA8IChlbnRyeVswXSAqIDI3MDAwKSkKKwkJCQllbnRyeSArPSAzOworCQkJc2NyaXB0ID0gUk9NMTYoZW50cnlbMV0pOworCQl9CisKKwkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBkcC0+ZGNiLCBkcC0+Y3J0Yyk7CisJfQorCisJLyogY29uZmlndXJlIGxhbmUgY291bnQgb24gdGhlIHNvdXJjZSAqLworCWRwX2N0cmwgPSAoKDEgPDwgZHAtPmxpbmtfbnIpIC0gMSkgPDwgMTY7CisJc2lua1sxXSA9IGRwLT5saW5rX25yOworCWlmIChkcC0+ZHBjZFsyXSAmIERQX0VOSEFOQ0VEX0ZSQU1FX0NBUCkgeworCQlkcF9jdHJsIHw9IDB4MDAwMDQwMDA7CisJCXNpbmtbMV0gfD0gRFBfTEFORV9DT1VOVF9FTkhBTkNFRF9GUkFNRV9FTjsKKwl9CisKKwludl9tYXNrKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluayksIDB4MDAxZjQwMDAsIGRwX2N0cmwpOworCisJLyogaW5mb3JtIHRoZSBzaW5rIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLworCWF1eGNoX3R4KGRldiwgZHAtPmF1eGNoLCA4LCBEUF9MSU5LX0JXX1NFVCwgc2luaywgMik7Cit9CisKK3N0YXRpYyB2b2lkCitkcF9zZXRfdHJhaW5pbmdfcGF0dGVybihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHBfc3RhdGUgKmRwLCB1OCB0cCkKK3sKKwl1OCBzaW5rX3RwOworCisJTlZfREVCVUdfS01TKGRldiwgInRyYWluaW5nIHBhdHRlcm4gJWRcbiIsIHRwKTsKKworCW52X21hc2soZGV2LCBOVjUwX1NPUl9EUF9DVFJMKGRwLT5vciwgZHAtPmxpbmspLCAweDBmMDAwMDAwLCB0cCA8PCAyNCk7CisKKwlhdXhjaF90eChkZXYsIGRwLT5hdXhjaCwgOSwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsICZzaW5rX3RwLCAxKTsKKwlzaW5rX3RwICY9IH5EUF9UUkFJTklOR19QQVRURVJOX01BU0s7CisJc2lua190cCB8PSB0cDsKKwlhdXhjaF90eChkZXYsIGRwLT5hdXhjaCwgOCwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsICZzaW5rX3RwLCAxKTsKK30KKworc3RhdGljIGNvbnN0IHU4IG52NTBfbGFuZV9tYXBbXSA9IHsgMTYsIDgsIDAsIDI0IH07CitzdGF0aWMgY29uc3QgdTggbnZhZl9sYW5lX21hcFtdID0geyAyNCwgMTYsIDgsIDAgfTsKKworc3RhdGljIGludAorZHBfbGlua190cmFpbl9jb21taXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRwX3N0YXRlICpkcCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBtYXNrID0gMCwgZHJ2ID0gMCwgcHJlID0gMCwgdW5rID0gMDsKKwljb25zdCB1OCAqc2hpZnRzOworCWludCBsaW5rID0gZHAtPmxpbms7CisJaW50IG9yID0gZHAtPm9yOworCWludCBpOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4YWYpCisJCXNoaWZ0cyA9IG52NTBfbGFuZV9tYXA7CisJZWxzZQorCQlzaGlmdHMgPSBudmFmX2xhbmVfbWFwOworCisJZm9yIChpID0gMDsgaSA8IGRwLT5saW5rX25yOyBpKyspIHsKKwkJdTggKmNvbmYgPSBkcC0+ZW50cnkgKyBkcC0+dGFibGVbNF07CisJCXU4IGxhbmUgPSAoZHAtPnN0YXRbNCArIChpID4+IDEpXSA+PiAoKGkgJiAxKSAqIDQpKSAmIDB4ZjsKKwkJdTggbHByZSA9IChsYW5lICYgMHgwYykgPj4gMjsKKwkJdTggbHZzdyA9IChsYW5lICYgMHgwMykgPj4gMDsKKworCQltYXNrIHw9IDB4ZmYgPDwgc2hpZnRzW2ldOworCQl1bmsgfD0gMSA8PCAoc2hpZnRzW2ldID4+IDMpOworCisJCWRwLT5jb25mW2ldID0gKGxwcmUgPDwgMykgfCBsdnN3OworCQlpZiAobHZzdyA9PSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzEyMDApCisJCQlkcC0+Y29uZltpXSB8PSBEUF9UUkFJTl9NQVhfU1dJTkdfUkVBQ0hFRDsKKwkJaWYgKGxwcmUgPT0gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzlfNSkKKwkJCWRwLT5jb25mW2ldIHw9IERQX1RSQUlOX01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRDsKKworCQlOVl9ERUJVR19LTVMoZGV2LCAiY29uZmlnIGxhbmUgJWQgJTAyeFxuIiwgaSwgZHAtPmNvbmZbaV0pOworCisJCWlmIChkcC0+dGFibGVbMF0gPCAweDMwKSB7CisJCQl1OCAqbGFzdCA9IGNvbmYgKyAoZHAtPmVudHJ5WzRdICogZHAtPnRhYmxlWzVdKTsKKwkJCXdoaWxlIChsdnN3ICE9IGNvbmZbMF0gfHwgbHByZSAhPSBjb25mWzFdKSB7CisJCQkJY29uZiArPSBkcC0+dGFibGVbNV07CisJCQkJaWYgKGNvbmYgPj0gbGFzdCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWNvbmYgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCS8qIG5vIGxvb2t1cCB0YWJsZSBhbnltb3JlLCBzZXQgZW50cmllcyBmb3IgZWFjaAorCQkJICogY29tYmluYXRpb24gb2Ygdm9sdGFnZSBzd2luZyBhbmQgcHJlLWVtcGhhc2lzCisJCQkgKiBsZXZlbCBhbGxvd2VkIGJ5IHRoZSBEUCBzcGVjLgorCQkJICovCisJCQlzd2l0Y2ggKGx2c3cpIHsKKwkJCWNhc2UgMDogbHByZSArPSAwOyBicmVhazsKKwkJCWNhc2UgMTogbHByZSArPSA0OyBicmVhazsKKwkJCWNhc2UgMjogbHByZSArPSA3OyBicmVhazsKKwkJCWNhc2UgMzogbHByZSArPSA5OyBicmVhazsKKwkJCX0KKworCQkJY29uZiA9IGNvbmYgKyAobHByZSAqIGRwLT50YWJsZVs1XSk7CisJCQljb25mKys7CisJCX0KKworCQlkcnYgfD0gY29uZlswXSA8PCBzaGlmdHNbaV07CisJCXByZSB8PSBjb25mWzFdIDw8IHNoaWZ0c1tpXTsKKwkJdW5rICA9ICh1bmsgJiB+MHgwMDAwZmYwMCkgfCAoY29uZlsyXSA8PCA4KTsKKwl9CisKKwludl9tYXNrKGRldiwgTlY1MF9TT1JfRFBfVU5LMTE4KG9yLCBsaW5rKSwgbWFzaywgZHJ2KTsKKwludl9tYXNrKGRldiwgTlY1MF9TT1JfRFBfVU5LMTIwKG9yLCBsaW5rKSwgbWFzaywgcHJlKTsKKwludl9tYXNrKGRldiwgTlY1MF9TT1JfRFBfVU5LMTMwKG9yLCBsaW5rKSwgMHgwMDAwZmYwZiwgdW5rKTsKKworCXJldHVybiBhdXhjaF90eChkZXYsIGRwLT5hdXhjaCwgOCwgRFBfVFJBSU5JTkdfTEFORTBfU0VULCBkcC0+Y29uZiwgNCk7CiB9CiAKIHN0YXRpYyBpbnQKLW5vdXZlYXVfZHBfbGlua190cmFpbl9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgcGF0dGVybikKK2RwX2xpbmtfdHJhaW5fdXBkYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcF9zdGF0ZSAqZHAsIHUzMiBkZWxheSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7Ci0JdWludDMyX3QgdG1wOwotCXVpbnQ4X3QgY21kOwotCWludCBvciA9IG52X2VuY29kZXItPm9yLCBsaW5rID0gIShudl9lbmNvZGVyLT5kY2ItPnNvcmNvbmYubGluayAmIDEpOwogCWludCByZXQ7CiAKLQl0bXAgID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspKTsKLQl0bXAgJj0gfk5WNTBfU09SX0RQX0NUUkxfVFJBSU5JTkdfUEFUVEVSTjsKLQl0bXAgfD0gKHBhdHRlcm4gPDwgMjQpOwotCW52X3dyMzIoZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSwgdG1wKTsKKwl1ZGVsYXkoZGVsYXkpOwogCi0JcmV0ID0gYXV4Y2hfcmQoZW5jb2RlciwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsICZjbWQsIDEpOworCXJldCA9IGF1eGNoX3R4KGRldiwgZHAtPmF1eGNoLCA5LCBEUF9MQU5FMF8xX1NUQVRVUywgZHAtPnN0YXQsIDYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JY21kICY9IH5EUF9UUkFJTklOR19QQVRURVJOX01BU0s7Ci0JY21kIHw9IChwYXR0ZXJuICYgRFBfVFJBSU5JTkdfUEFUVEVSTl9NQVNLKTsKLQlyZXR1cm4gYXV4Y2hfd3IoZW5jb2RlciwgRFBfVFJBSU5JTkdfUEFUVEVSTl9TRVQsICZjbWQsIDEpOworCisJTlZfREVCVUdfS01TKGRldiwgInN0YXR1cyAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJICAgICBkcC0+c3RhdFswXSwgZHAtPnN0YXRbMV0sIGRwLT5zdGF0WzJdLCBkcC0+c3RhdFszXSwKKwkJICAgICBkcC0+c3RhdFs0XSwgZHAtPnN0YXRbNV0pOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1ub3V2ZWF1X2RwX21heF92b2x0YWdlX3N3aW5nKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK2RwX2xpbmtfdHJhaW5fY3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRwX3N0YXRlICpkcCkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlX2VudHJ5ICpkcHNlOwotCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSAqZHBlOwotCWludCBpLCBkcGVfaGVhZGVybGVuLCBtYXhfdnMgPSAwOworCWJvb2wgY3JfZG9uZSA9IGZhbHNlLCBhYm9ydCA9IGZhbHNlOworCWludCB2b2x0YWdlID0gZHAtPmNvbmZbMF0gJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0s7CisJaW50IHRyaWVzID0gMCwgaTsKIAotCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOwotCWlmICghZHBlKQotCQlyZXR1cm4gZmFsc2U7Ci0JZHBzZSA9ICh2b2lkICopKChjaGFyICopZHBlICsgZHBlX2hlYWRlcmxlbik7CisJZHBfc2V0X3RyYWluaW5nX3BhdHRlcm4oZGV2LCBkcCwgRFBfVFJBSU5JTkdfUEFUVEVSTl8xKTsKIAotCWZvciAoaSA9IDA7IGkgPCBkcGVfaGVhZGVybGVuOyBpKyssIGRwc2UrKykgewotCQlpZiAoZHBzZS0+dnNfbGV2ZWwgPiBtYXhfdnMpCi0JCQltYXhfdnMgPSBkcHNlLT52c19sZXZlbDsKLQl9Ci0KLQlyZXR1cm4gbWF4X3ZzOwotfQotCi1zdGF0aWMgaW50Ci1ub3V2ZWF1X2RwX21heF9wcmVfZW1waGFzaXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgdnMpCi17Ci0Jc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZV9lbnRyeSAqZHBzZTsKLQlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKLQlpbnQgaSwgZHBlX2hlYWRlcmxlbiwgbWF4X3ByZSA9IDA7Ci0KLQlkcGUgPSBub3V2ZWF1X2Jpb3NfZHBfdGFibGUoZGV2LCBudl9lbmNvZGVyLT5kY2IsICZkcGVfaGVhZGVybGVuKTsKLQlpZiAoIWRwZSkKLQkJcmV0dXJuIGZhbHNlOwotCWRwc2UgPSAodm9pZCAqKSgoY2hhciAqKWRwZSArIGRwZV9oZWFkZXJsZW4pOwotCi0JZm9yIChpID0gMDsgaSA8IGRwZV9oZWFkZXJsZW47IGkrKywgZHBzZSsrKSB7Ci0JCWlmIChkcHNlLT52c19sZXZlbCAhPSB2cykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChkcHNlLT5wcmVfbGV2ZWwgPiBtYXhfcHJlKQotCQkJbWF4X3ByZSA9IGRwc2UtPnByZV9sZXZlbDsKLQl9Ci0KLQlyZXR1cm4gbWF4X3ByZTsKLX0KLQotc3RhdGljIGJvb2wKLW5vdXZlYXVfZHBfbGlua190cmFpbl9hZGp1c3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1aW50OF90ICpjb25maWcpCi17Ci0Jc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSAqZHBlOwotCWludCByZXQsIGksIGRwZV9oZWFkZXJsZW4sIHZzID0gMCwgcHJlID0gMDsKLQl1aW50OF90IHJlcXVlc3RbMl07Ci0KLQlkcGUgPSBub3V2ZWF1X2Jpb3NfZHBfdGFibGUoZGV2LCBudl9lbmNvZGVyLT5kY2IsICZkcGVfaGVhZGVybGVuKTsKLQlpZiAoIWRwZSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0ID0gYXV4Y2hfcmQoZW5jb2RlciwgRFBfQURKVVNUX1JFUVVFU1RfTEFORTBfMSwgcmVxdWVzdCwgMik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JTlZfREVCVUdfS01TKGRldiwgIlx0XHRhZGp1c3QgMHglMDJ4IDB4JTAyeFxuIiwgcmVxdWVzdFswXSwgcmVxdWVzdFsxXSk7Ci0KLQkvKiBLZWVwIGFsbCBsYW5lcyBhdCB0aGUgc2FtZSBsZXZlbC4uICovCi0JZm9yIChpID0gMDsgaSA8IG52X2VuY29kZXItPmRwLmxpbmtfbnI7IGkrKykgewotCQlpbnQgbGFuZV9yZXEgPSAocmVxdWVzdFtpID4+IDFdID4+ICgoaSAmIDEpIDw8IDIpKSAmIDB4ZjsKLQkJaW50IGxhbmVfdnMgPSBsYW5lX3JlcSAmIDM7Ci0JCWludCBsYW5lX3ByZSA9IChsYW5lX3JlcSA+PiAyKSAmIDM7Ci0KLQkJaWYgKGxhbmVfdnMgPiB2cykKLQkJCXZzID0gbGFuZV92czsKLQkJaWYgKGxhbmVfcHJlID4gcHJlKQotCQkJcHJlID0gbGFuZV9wcmU7Ci0JfQotCi0JaWYgKHZzID49IG5vdXZlYXVfZHBfbWF4X3ZvbHRhZ2Vfc3dpbmcoZW5jb2RlcikpIHsKLQkJdnMgID0gbm91dmVhdV9kcF9tYXhfdm9sdGFnZV9zd2luZyhlbmNvZGVyKTsKLQkJdnMgfD0gNDsKLQl9Ci0KLQlpZiAocHJlID49IG5vdXZlYXVfZHBfbWF4X3ByZV9lbXBoYXNpcyhlbmNvZGVyLCB2cyAmIDMpKSB7Ci0JCXByZSAgPSBub3V2ZWF1X2RwX21heF9wcmVfZW1waGFzaXMoZW5jb2RlciwgdnMgJiAzKTsKLQkJcHJlIHw9IDQ7Ci0JfQotCi0JLyogVXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIGZvciBhbGwgbGFuZXMuLiAqLwotCWZvciAoaSA9IDA7IGkgPCBudl9lbmNvZGVyLT5kcC5saW5rX25yOyBpKyspCi0JCWNvbmZpZ1tpXSA9IChwcmUgPDwgMykgfCB2czsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotbm91dmVhdV9kcF9saW5rX3RyYWluX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHVpbnQ4X3QgKmNvbmZpZykKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlX2VudHJ5ICpkcHNlOwotCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSAqZHBlOwotCWludCBvciA9IG52X2VuY29kZXItPm9yLCBsaW5rID0gIShudl9lbmNvZGVyLT5kY2ItPnNvcmNvbmYubGluayAmIDEpOwotCWludCBkcGVfaGVhZGVybGVuLCByZXQsIGk7Ci0KLQlOVl9ERUJVR19LTVMoZGV2LCAiXHRcdGNvbmZpZyAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCi0JCSBjb25maWdbMF0sIGNvbmZpZ1sxXSwgY29uZmlnWzJdLCBjb25maWdbM10pOwotCi0JZHBlID0gbm91dmVhdV9iaW9zX2RwX3RhYmxlKGRldiwgbnZfZW5jb2Rlci0+ZGNiLCAmZHBlX2hlYWRlcmxlbik7Ci0JaWYgKCFkcGUpCi0JCXJldHVybiBmYWxzZTsKLQlkcHNlID0gKHZvaWQgKikoKGNoYXIgKilkcGUgKyBkcGVfaGVhZGVybGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBkcGUtPnJlY29yZF9ucjsgaSsrLCBkcHNlKyspIHsKLQkJaWYgKGRwc2UtPnZzX2xldmVsID09IChjb25maWdbMF0gJiAzKSAmJgotCQkgICAgZHBzZS0+cHJlX2xldmVsID09ICgoY29uZmlnWzBdID4+IDMpICYgMykpCisJZG8geworCQlpZiAoZHBfbGlua190cmFpbl9jb21taXQoZGV2LCBkcCkgfHwKKwkJICAgIGRwX2xpbmtfdHJhaW5fdXBkYXRlKGRldiwgZHAsIDEwMCkpCiAJCQlicmVhazsKLQl9Ci0JQlVHX09OKGkgPT0gZHBlLT5yZWNvcmRfbnIpOwogCi0JZm9yIChpID0gMDsgaSA8IG52X2VuY29kZXItPmRwLmxpbmtfbnI7IGkrKykgewotCQljb25zdCBpbnQgc2hpZnRbNF0gPSB7IDE2LCA4LCAwLCAyNCB9OwotCQl1aW50MzJfdCBtYXNrID0gMHhmZiA8PCBzaGlmdFtpXTsKLQkJdWludDMyX3QgcmVnMCwgcmVnMSwgcmVnMjsKKwkJY3JfZG9uZSA9IHRydWU7CisJCWZvciAoaSA9IDA7IGkgPCBkcC0+bGlua19ucjsgaSsrKSB7CisJCQl1OCBsYW5lID0gKGRwLT5zdGF0W2kgPj4gMV0gPj4gKChpICYgMSkgKiA0KSkgJiAweGY7CisJCQlpZiAoIShsYW5lICYgRFBfTEFORV9DUl9ET05FKSkgeworCQkJCWNyX2RvbmUgPSBmYWxzZTsKKwkJCQlpZiAoZHAtPmNvbmZbaV0gJiBEUF9UUkFJTl9NQVhfU1dJTkdfUkVBQ0hFRCkKKwkJCQkJYWJvcnQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CiAKLQkJcmVnMCAgPSBudl9yZDMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTE4KG9yLCBsaW5rKSkgJiB+bWFzazsKLQkJcmVnMCB8PSAoZHBzZS0+cmVnMCA8PCBzaGlmdFtpXSk7Ci0JCXJlZzEgID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX1VOSzEyMChvciwgbGluaykpICYgfm1hc2s7Ci0JCXJlZzEgfD0gKGRwc2UtPnJlZzEgPDwgc2hpZnRbaV0pOwotCQlyZWcyICA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMzAob3IsIGxpbmspKSAmIDB4ZmZmZjAwZmY7Ci0JCXJlZzIgfD0gKGRwc2UtPnJlZzIgPDwgOCk7Ci0JCW52X3dyMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMTgob3IsIGxpbmspLCByZWcwKTsKLQkJbnZfd3IzMihkZXYsIE5WNTBfU09SX0RQX1VOSzEyMChvciwgbGluayksIHJlZzEpOwotCQludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTMwKG9yLCBsaW5rKSwgcmVnMik7Ci0JfQorCQlpZiAoKGRwLT5jb25mWzBdICYgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVNLKSAhPSB2b2x0YWdlKSB7CisJCQl2b2x0YWdlID0gZHAtPmNvbmZbMF0gJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0s7CisJCQl0cmllcyA9IDA7CisJCX0KKwl9IHdoaWxlICghY3JfZG9uZSAmJiAhYWJvcnQgJiYgKyt0cmllcyA8IDUpOwogCi0JcmV0ID0gYXV4Y2hfd3IoZW5jb2RlciwgRFBfVFJBSU5JTkdfTEFORTBfU0VULCBjb25maWcsIDQpOwotCWlmIChyZXQpCi0JCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gY3JfZG9uZSA/IDAgOiAtMTsKK30KIAotCXJldHVybiB0cnVlOworc3RhdGljIGludAorZHBfbGlua190cmFpbl9lcShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHBfc3RhdGUgKmRwKQoreworCWJvb2wgZXFfZG9uZSwgY3JfZG9uZSA9IHRydWU7CisJaW50IHRyaWVzID0gMCwgaTsKKworCWRwX3NldF90cmFpbmluZ19wYXR0ZXJuKGRldiwgZHAsIERQX1RSQUlOSU5HX1BBVFRFUk5fMik7CisKKwlkbyB7CisJCWlmIChkcF9saW5rX3RyYWluX3VwZGF0ZShkZXYsIGRwLCA0MDApKQorCQkJYnJlYWs7CisKKwkJZXFfZG9uZSA9ICEhKGRwLT5zdGF0WzJdICYgRFBfSU5URVJMQU5FX0FMSUdOX0RPTkUpOworCQlmb3IgKGkgPSAwOyBpIDwgZHAtPmxpbmtfbnIgJiYgZXFfZG9uZTsgaSsrKSB7CisJCQl1OCBsYW5lID0gKGRwLT5zdGF0W2kgPj4gMV0gPj4gKChpICYgMSkgKiA0KSkgJiAweGY7CisJCQlpZiAoIShsYW5lICYgRFBfTEFORV9DUl9ET05FKSkKKwkJCQljcl9kb25lID0gZmFsc2U7CisJCQlpZiAoIShsYW5lICYgRFBfTEFORV9DSEFOTkVMX0VRX0RPTkUpIHx8CisJCQkgICAgIShsYW5lICYgRFBfTEFORV9TWU1CT0xfTE9DS0VEKSkKKwkJCQllcV9kb25lID0gZmFsc2U7CisJCX0KKworCQlpZiAoZHBfbGlua190cmFpbl9jb21taXQoZGV2LCBkcCkpCisJCQlicmVhazsKKwl9IHdoaWxlICghZXFfZG9uZSAmJiBjcl9kb25lICYmICsrdHJpZXMgPD0gNSk7CisKKwlyZXR1cm4gZXFfZG9uZSA/IDAgOiAtMTsKIH0KIAogYm9vbAotbm91dmVhdV9kcF9saW5rX3RyYWluKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK25vdXZlYXVfZHBfbGlua190cmFpbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHUzMiBkYXRhcmF0ZSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSAqcGdwaW8gPSAmZGV2X3ByaXYtPmVuZ2luZS5ncGlvOwogCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3I7Ci0Jc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlICpkcGU7Ci0JaW50IGRwZV9oZWFkZXJsZW47Ci0JdWludDhfdCBjb25maWdbNF0sIHN0YXR1c1szXTsKLQlib29sIGNyX2RvbmUsIGNyX21heF92cywgZXFfZG9uZSwgaHBkX3N0YXRlOwotCWludCByZXQgPSAwLCBpLCB0cmllcywgdm9sdGFnZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0KKwkJbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2g7CisJY29uc3QgdTMyIGJ3X2xpc3RbXSA9IHsgMjcwMDAwLCAxNjIwMDAsIDAgfTsKKwljb25zdCB1MzIgKmxpbmtfYncgPSBid19saXN0OworCXN0cnVjdCBkcF9zdGF0ZSBkcDsKIAotCU5WX0RFQlVHX0tNUyhkZXYsICJsaW5rIHRyYWluaW5nISFcbiIpOwotCi0JbnZfY29ubmVjdG9yID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7Ci0JaWYgKCFudl9jb25uZWN0b3IpCisJYXV4Y2ggPSBub3V2ZWF1X2kyY19maW5kKGRldiwgbnZfZW5jb2Rlci0+ZGNiLT5pMmNfaW5kZXgpOworCWlmICghYXV4Y2gpCiAJCXJldHVybiBmYWxzZTsKIAotCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOwotCWlmICghZHBlKSB7Ci0JCU5WX0VSUk9SKGRldiwgIlNPUi0lZDogbm8gRFAgZW5jb2RlciB0YWJsZSFcbiIsIG52X2VuY29kZXItPm9yKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KKwlkcC50YWJsZSA9IG5vdXZlYXVfZHBfYmlvc19kYXRhKGRldiwgbnZfZW5jb2Rlci0+ZGNiLCAmZHAuZW50cnkpOworCWlmICghZHAudGFibGUpCisJCXJldHVybiAtRUlOVkFMOwogCi0JLyogZGlzYWJsZSBob3RwbHVnIGRldGVjdCwgdGhpcyBmbGlwcyBhcm91bmQgb24gc29tZSBwYW5lbHMgZHVyaW5nCi0JICogbGluayB0cmFpbmluZy4KKwlkcC5kY2IgPSBudl9lbmNvZGVyLT5kY2I7CisJZHAuY3J0YyA9IG52X2NydGMtPmluZGV4OworCWRwLmF1eGNoID0gYXV4Y2gtPnJkOworCWRwLm9yID0gbnZfZW5jb2Rlci0+b3I7CisJZHAubGluayA9ICEobnZfZW5jb2Rlci0+ZGNiLT5zb3Jjb25mLmxpbmsgJiAxKTsKKwlkcC5kcGNkID0gbnZfZW5jb2Rlci0+ZHAuZHBjZDsKKworCS8qIHNvbWUgc2lua3MgdG9nZ2xlIGhvdHBsdWcgaW4gcmVzcG9uc2UgdG8gc29tZSBvZiB0aGUgYWN0aW9ucworCSAqIHdlIHRha2UgZHVyaW5nIGxpbmsgdHJhaW5pbmcgKERQX1NFVF9QT1dFUiBpcyBvbmUpLCB3ZSBuZWVkCisJICogdG8gaWdub3JlIHRoZW0gZm9yIHRoZSBtb21lbnQgdG8gYXZvaWQgcmFjZXMuCiAJICovCi0JaHBkX3N0YXRlID0gcGdwaW8tPmlycV9lbmFibGUoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsIGZhbHNlKTsKKwlwZ3Bpby0+aXJxX2VuYWJsZShkZXYsIG52X2Nvbm5lY3Rvci0+ZGNiLT5ncGlvX3RhZywgZmFsc2UpOwogCi0JaWYgKGRwZS0+c2NyaXB0MCkgewotCQlOVl9ERUJVR19LTVMoZGV2LCAiU09SLSVkOiBydW5uaW5nIERQIHNjcmlwdCAwXG4iLCBudl9lbmNvZGVyLT5vcik7Ci0JCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIGxlMTZfdG9fY3B1KGRwZS0+c2NyaXB0MCksCi0JCQkJCSAgICBudl9lbmNvZGVyLT5kY2IpOworCS8qIGVuYWJsZSBkb3duLXNwcmVhZGluZywgaWYgcG9zc2libGUgKi8KKwlpZiAoZHAudGFibGVbMV0gPj0gMTYpIHsKKwkJdTE2IHNjcmlwdCA9IFJPTTE2KGRwLmVudHJ5WzE0XSk7CisJCWlmIChudl9lbmNvZGVyLT5kcC5kcGNkWzNdICYgMSkKKwkJCXNjcmlwdCA9IFJPTTE2KGRwLmVudHJ5WzEyXSk7CisKKwkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBkcC5kY2IsIGRwLmNydGMpOwogCX0KIAotdHJhaW46Ci0JY3JfZG9uZSA9IGVxX2RvbmUgPSBmYWxzZTsKKwkvKiBleGVjdXRlIHByZS10cmFpbiBzY3JpcHQgZnJvbSB2YmlvcyAqLworCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIFJPTTE2KGRwLmVudHJ5WzZdKSwgZHAuZGNiLCBkcC5jcnRjKTsKIAotCS8qIHNldCBsaW5rIGNvbmZpZ3VyYXRpb24gKi8KLQlOVl9ERUJVR19LTVMoZGV2LCAiXHRiZWdpbiB0cmFpbjogYncgJWQsIGxhbmVzICVkXG4iLAotCQkgbnZfZW5jb2Rlci0+ZHAubGlua19idywgbnZfZW5jb2Rlci0+ZHAubGlua19ucik7CisJLyogc3RhcnQgb2ZmIGF0IGhpZ2hlc3QgbGluayByYXRlIHN1cHBvcnRlZCBieSBlbmNvZGVyIGFuZCBkaXNwbGF5ICovCisJd2hpbGUgKCpsaW5rX2J3ID4gbnZfZW5jb2Rlci0+ZHAubGlua19idykKKwkJbGlua19idysrOwogCi0JcmV0ID0gbm91dmVhdV9kcF9saW5rX2J3X3NldChlbmNvZGVyLCBudl9lbmNvZGVyLT5kcC5saW5rX2J3KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gZmFsc2U7CisJd2hpbGUgKGxpbmtfYndbMF0pIHsKKwkJLyogZmluZCBtaW5pbXVtIHJlcXVpcmVkIGxhbmUgY291bnQgYXQgdGhpcyBsaW5rIHJhdGUgKi8KKwkJZHAubGlua19uciA9IG52X2VuY29kZXItPmRwLmxpbmtfbnI7CisJCXdoaWxlICgoZHAubGlua19uciA+PiAxKSAqIGxpbmtfYndbMF0gPiBkYXRhcmF0ZSkKKwkJCWRwLmxpbmtfbnIgPj49IDE7CiAKLQljb25maWdbMF0gPSBudl9lbmNvZGVyLT5kcC5saW5rX25yOwotCWlmIChudl9lbmNvZGVyLT5kcC5kcGNkX3ZlcnNpb24gPj0gMHgxMSAmJgotCSAgICBudl9lbmNvZGVyLT5kcC5lbmhhbmNlZF9mcmFtZSkKLQkJY29uZmlnWzBdIHw9IERQX0xBTkVfQ09VTlRfRU5IQU5DRURfRlJBTUVfRU47CisJCS8qIGRyb3AgbGluayByYXRlIHRvIG1pbmltdW0gd2l0aCB0aGlzIGxhbmUgY291bnQgKi8KKwkJd2hpbGUgKChsaW5rX2J3WzFdICogZHAubGlua19ucikgPiBkYXRhcmF0ZSkKKwkJCWxpbmtfYncrKzsKKwkJZHAubGlua19idyA9IGxpbmtfYndbMF07CiAKLQlyZXQgPSBub3V2ZWF1X2RwX2xhbmVfY291bnRfc2V0KGVuY29kZXIsIGNvbmZpZ1swXSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIGZhbHNlOworCQkvKiBwcm9ncmFtIHNlbGVjdGVkIGxpbmsgY29uZmlndXJhdGlvbiAqLworCQlkcF9zZXRfbGlua19jb25maWcoZGV2LCAmZHApOwogCi0JLyogY2xvY2sgcmVjb3ZlcnkgKi8KLQlOVl9ERUJVR19LTVMoZGV2LCAiXHRiZWdpbiBjclxuIik7Ci0JcmV0ID0gbm91dmVhdV9kcF9saW5rX3RyYWluX3NldChlbmNvZGVyLCBEUF9UUkFJTklOR19QQVRURVJOXzEpOwotCWlmIChyZXQpCi0JCWdvdG8gc3RvcDsKLQotCXRyaWVzID0gMDsKLQl2b2x0YWdlID0gLTE7Ci0JbWVtc2V0KGNvbmZpZywgMHgwMCwgc2l6ZW9mKGNvbmZpZykpOwotCWZvciAoOzspIHsKLQkJaWYgKCFub3V2ZWF1X2RwX2xpbmtfdHJhaW5fY29tbWl0KGVuY29kZXIsIGNvbmZpZykpCisJCS8qIGF0dGVtcHQgdG8gdHJhaW4gdGhlIGxpbmsgYXQgdGhpcyBjb25maWd1cmF0aW9uICovCisJCW1lbXNldChkcC5zdGF0LCAweDAwLCBzaXplb2YoZHAuc3RhdCkpOworCQlpZiAoIWRwX2xpbmtfdHJhaW5fY3IoZGV2LCAmZHApICYmCisJCSAgICAhZHBfbGlua190cmFpbl9lcShkZXYsICZkcCkpCiAJCQlicmVhazsKIAotCQl1ZGVsYXkoMTAwKTsKLQotCQlyZXQgPSBhdXhjaF9yZChlbmNvZGVyLCBEUF9MQU5FMF8xX1NUQVRVUywgc3RhdHVzLCAyKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCQlOVl9ERUJVR19LTVMoZGV2LCAiXHRcdHN0YXR1czogMHglMDJ4IDB4JTAyeFxuIiwKLQkJCSBzdGF0dXNbMF0sIHN0YXR1c1sxXSk7Ci0KLQkJY3JfZG9uZSA9IHRydWU7Ci0JCWNyX21heF92cyA9IGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgbnZfZW5jb2Rlci0+ZHAubGlua19ucjsgaSsrKSB7Ci0JCQlpbnQgbGFuZSA9IChzdGF0dXNbaSA+PiAxXSA+PiAoKGkgJiAxKSAqIDQpKSAmIDB4ZjsKLQotCQkJaWYgKCEobGFuZSAmIERQX0xBTkVfQ1JfRE9ORSkpIHsKLQkJCQljcl9kb25lID0gZmFsc2U7Ci0JCQkJaWYgKGNvbmZpZ1tpXSAmIERQX1RSQUlOX01BWF9QUkVfRU1QSEFTSVNfUkVBQ0hFRCkKLQkJCQkJY3JfbWF4X3ZzID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmICgoY29uZmlnWzBdICYgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVNLKSAhPSB2b2x0YWdlKSB7Ci0JCQl2b2x0YWdlID0gY29uZmlnWzBdICYgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVNLOwotCQkJdHJpZXMgPSAwOwotCQl9Ci0KLQkJaWYgKGNyX2RvbmUgfHwgY3JfbWF4X3ZzIHx8ICgrK3RyaWVzID09IDUpKQotCQkJYnJlYWs7Ci0KLQkJaWYgKCFub3V2ZWF1X2RwX2xpbmtfdHJhaW5fYWRqdXN0KGVuY29kZXIsIGNvbmZpZykpCi0JCQlicmVhazsKKwkJLyogcmV0cnkgYXQgbG93ZXIgcmF0ZSAqLworCQlsaW5rX2J3Kys7CiAJfQogCi0JaWYgKCFjcl9kb25lKQotCQlnb3RvIHN0b3A7CisJLyogZmluaXNoIGxpbmsgdHJhaW5pbmcgKi8KKwlkcF9zZXRfdHJhaW5pbmdfcGF0dGVybihkZXYsICZkcCwgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKIAotCS8qIGNoYW5uZWwgZXF1YWxpc2F0aW9uICovCi0JTlZfREVCVUdfS01TKGRldiwgIlx0YmVnaW4gZXFcbiIpOwotCXJldCA9IG5vdXZlYXVfZHBfbGlua190cmFpbl9zZXQoZW5jb2RlciwgRFBfVFJBSU5JTkdfUEFUVEVSTl8yKTsKLQlpZiAocmV0KQotCQlnb3RvIHN0b3A7Ci0KLQlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPD0gNTsgdHJpZXMrKykgewotCQl1ZGVsYXkoNDAwKTsKLQotCQlyZXQgPSBhdXhjaF9yZChlbmNvZGVyLCBEUF9MQU5FMF8xX1NUQVRVUywgc3RhdHVzLCAzKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCQlOVl9ERUJVR19LTVMoZGV2LCAiXHRcdHN0YXR1czogMHglMDJ4IDB4JTAyeFxuIiwKLQkJCSBzdGF0dXNbMF0sIHN0YXR1c1sxXSk7Ci0KLQkJZXFfZG9uZSA9IHRydWU7Ci0JCWlmICghKHN0YXR1c1syXSAmIERQX0lOVEVSTEFORV9BTElHTl9ET05FKSkKLQkJCWVxX2RvbmUgPSBmYWxzZTsKLQotCQlmb3IgKGkgPSAwOyBlcV9kb25lICYmIGkgPCBudl9lbmNvZGVyLT5kcC5saW5rX25yOyBpKyspIHsKLQkJCWludCBsYW5lID0gKHN0YXR1c1tpID4+IDFdID4+ICgoaSAmIDEpICogNCkpICYgMHhmOwotCi0JCQlpZiAoIShsYW5lICYgRFBfTEFORV9DUl9ET05FKSkgewotCQkJCWNyX2RvbmUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKCEobGFuZSAmIERQX0xBTkVfQ0hBTk5FTF9FUV9ET05FKSB8fAotCQkJICAgICEobGFuZSAmIERQX0xBTkVfU1lNQk9MX0xPQ0tFRCkpIHsKLQkJCQllcV9kb25lID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZXFfZG9uZSB8fCAhY3JfZG9uZSkKLQkJCWJyZWFrOwotCi0JCWlmICghbm91dmVhdV9kcF9saW5rX3RyYWluX2FkanVzdChlbmNvZGVyLCBjb25maWcpIHx8Ci0JCSAgICAhbm91dmVhdV9kcF9saW5rX3RyYWluX2NvbW1pdChlbmNvZGVyLCBjb25maWcpKQotCQkJYnJlYWs7Ci0JfQotCi1zdG9wOgotCS8qIGVuZCBsaW5rIHRyYWluaW5nICovCi0JcmV0ID0gbm91dmVhdV9kcF9saW5rX3RyYWluX3NldChlbmNvZGVyLCBEUF9UUkFJTklOR19QQVRURVJOX0RJU0FCTEUpOwotCWlmIChyZXQpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIHJldHJ5IGF0IGEgbG93ZXIgc2V0dGluZywgaWYgcG9zc2libGUgKi8KLQlpZiAoIXJldCAmJiAhKGVxX2RvbmUgJiYgY3JfZG9uZSkpIHsKLQkJTlZfREVCVUdfS01TKGRldiwgIlx0d2UgZmFpbGVkXG4iKTsKLQkJaWYgKG52X2VuY29kZXItPmRwLmxpbmtfYncgIT0gRFBfTElOS19CV18xXzYyKSB7Ci0JCQlOVl9ERUJVR19LTVMoZGV2LCAicmV0cnkgbGluayB0cmFpbmluZyBhdCBsb3cgcmF0ZVxuIik7Ci0JCQludl9lbmNvZGVyLT5kcC5saW5rX2J3ID0gRFBfTElOS19CV18xXzYyOwotCQkJZ290byB0cmFpbjsKLQkJfQotCX0KLQotCWlmIChkcGUtPnNjcmlwdDEpIHsKLQkJTlZfREVCVUdfS01TKGRldiwgIlNPUi0lZDogcnVubmluZyBEUCBzY3JpcHQgMVxuIiwgbnZfZW5jb2Rlci0+b3IpOwotCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBsZTE2X3RvX2NwdShkcGUtPnNjcmlwdDEpLAotCQkJCQkgICAgbnZfZW5jb2Rlci0+ZGNiKTsKLQl9CisJLyogZXhlY3V0ZSBwb3N0LXRyYWluIHNjcmlwdCBmcm9tIHZiaW9zICovCisJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgUk9NMTYoZHAuZW50cnlbOF0pLCBkcC5kY2IsIGRwLmNydGMpOwogCiAJLyogcmUtZW5hYmxlIGhvdHBsdWcgZGV0ZWN0ICovCi0JcGdwaW8tPmlycV9lbmFibGUoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsIGhwZF9zdGF0ZSk7Ci0KLQlyZXR1cm4gZXFfZG9uZTsKKwlwZ3Bpby0+aXJxX2VuYWJsZShkZXYsIG52X2Nvbm5lY3Rvci0+ZGNiLT5ncGlvX3RhZywgdHJ1ZSk7CisJcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wKQEAgLTQ0NywzMSArNjQ4LDM0IEBACiB7CiAJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXVpbnQ4X3QgZHBjZFs0XTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2g7CisJdTggKmRwY2QgPSBudl9lbmNvZGVyLT5kcC5kcGNkOwogCWludCByZXQ7CiAKLQlyZXQgPSBhdXhjaF9yZChlbmNvZGVyLCAweDAwMDAsIGRwY2QsIDQpOworCWF1eGNoID0gbm91dmVhdV9pMmNfZmluZChkZXYsIG52X2VuY29kZXItPmRjYi0+aTJjX2luZGV4KTsKKwlpZiAoIWF1eGNoKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXQgPSBhdXhjaF90eChkZXYsIGF1eGNoLT5yZCwgOSwgRFBfRFBDRF9SRVYsIGRwY2QsIDgpOwogCWlmIChyZXQpCiAJCXJldHVybiBmYWxzZTsKIAotCU5WX0RFQlVHX0tNUyhkZXYsICJlbmNvZGVyOiBsaW5rX2J3ICVkLCBsaW5rX25yICVkXG4iCi0JCSAgICAgICJkaXNwbGF5OiBsaW5rX2J3ICVkLCBsaW5rX25yICVkIHZlcnNpb24gMHglMDJ4XG4iLAotCQkgbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19idywKLQkJIG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfbnIsCi0JCSBkcGNkWzFdLCBkcGNkWzJdICYgMHgwZiwgZHBjZFswXSk7Ci0KLQludl9lbmNvZGVyLT5kcC5kcGNkX3ZlcnNpb24gPSBkcGNkWzBdOwotCi0JbnZfZW5jb2Rlci0+ZHAubGlua19idyA9IGRwY2RbMV07Ci0JaWYgKG52X2VuY29kZXItPmRwLmxpbmtfYncgIT0gRFBfTElOS19CV18xXzYyICYmCi0JICAgICFudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX2J3KQotCQludl9lbmNvZGVyLT5kcC5saW5rX2J3ID0gRFBfTElOS19CV18xXzYyOwotCisJbnZfZW5jb2Rlci0+ZHAubGlua19idyA9IDI3MDAwICogZHBjZFsxXTsKIAludl9lbmNvZGVyLT5kcC5saW5rX25yID0gZHBjZFsyXSAmIERQX01BWF9MQU5FX0NPVU5UX01BU0s7Ci0JaWYgKG52X2VuY29kZXItPmRwLmxpbmtfbnIgPiBudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX25yKQotCQludl9lbmNvZGVyLT5kcC5saW5rX25yID0gbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19ucjsKIAotCW52X2VuY29kZXItPmRwLmVuaGFuY2VkX2ZyYW1lID0gKGRwY2RbMl0gJiBEUF9FTkhBTkNFRF9GUkFNRV9DQVApOworCU5WX0RFQlVHX0tNUyhkZXYsICJkaXNwbGF5OiAlZHglZCBkcGNkIDB4JTAyeFxuIiwKKwkJICAgICBudl9lbmNvZGVyLT5kcC5saW5rX25yLCBudl9lbmNvZGVyLT5kcC5saW5rX2J3LCBkcGNkWzBdKTsKKwlOVl9ERUJVR19LTVMoZGV2LCAiZW5jb2RlcjogJWR4JWRcbiIsCisJCSAgICAgbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19uciwKKwkJICAgICBudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX2J3KTsKKworCWlmIChudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX25yIDwgbnZfZW5jb2Rlci0+ZHAubGlua19ucikKKwkJbnZfZW5jb2Rlci0+ZHAubGlua19uciA9IG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfbnI7CisJaWYgKG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfYncgPCBudl9lbmNvZGVyLT5kcC5saW5rX2J3KQorCQludl9lbmNvZGVyLT5kcC5saW5rX2J3ID0gbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19idzsKKworCU5WX0RFQlVHX0tNUyhkZXYsICJtYXhpbXVtOiAlZHglZFxuIiwKKwkJICAgICBudl9lbmNvZGVyLT5kcC5saW5rX25yLCBudl9lbmNvZGVyLT5kcC5saW5rX2J3KTsKIAogCXJldHVybiB0cnVlOwogfQpAQCAtNDgwLDEwNSArNjg0LDEzIEBACiBub3V2ZWF1X2RwX2F1eGNoKHN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaCwgaW50IGNtZCwgaW50IGFkZHIsCiAJCSB1aW50OF90ICpkYXRhLCBpbnQgZGF0YV9ucikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYXV4Y2gtPmRldjsKLQl1aW50MzJfdCB0bXAsIGN0cmwsIHN0YXQgPSAwLCBkYXRhMzJbNF0gPSB7fTsKLQlpbnQgcmV0ID0gMCwgaSwgaW5kZXggPSBhdXhjaC0+cmQ7Ci0KLQlOVl9ERUJVR19LTVMoZGV2LCAiY2ggJWQgY21kICVkIGFkZHIgMHgleCBsZW4gJWRcbiIsIGluZGV4LCBjbWQsIGFkZHIsIGRhdGFfbnIpOwotCi0JdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChhdXhjaC0+cmQpKTsKLQludl93cjMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGF1eGNoLT5yZCksIHRtcCB8IDB4MDAxMDAwMDApOwotCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSk7Ci0JaWYgKCEodG1wICYgMHgwMTAwMDAwMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAiZXhwZWN0ZWQgYml0IDI0ID09IDEsIGdvdCAweCUwOHhcbiIsIHRtcCk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfU1RBVChhdXhjaC0+cmQpKTsKLQkJaWYgKHRtcCAmIE5WNTBfQVVYQ0hfU1RBVF9TVEFURV9SRUFEWSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMTAwKTsKLQl9Ci0KLQlpZiAoaSA9PSAzKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKCEoY21kICYgMSkpIHsKLQkJbWVtY3B5KGRhdGEzMiwgZGF0YSwgZGF0YV9ucik7Ci0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCU5WX0RFQlVHX0tNUyhkZXYsICJ3ciAlZDogMHglMDh4XG4iLCBpLCBkYXRhMzJbaV0pOwotCQkJbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfREFUQV9PVVQoaW5kZXgsIGkpLCBkYXRhMzJbaV0pOwotCQl9Ci0JfQotCi0JbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfQUREUihpbmRleCksIGFkZHIpOwotCWN0cmwgID0gbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChpbmRleCkpOwotCWN0cmwgJj0gfihOVjUwX0FVWENIX0NUUkxfQ01EIHwgTlY1MF9BVVhDSF9DVFJMX0xFTik7Ci0JY3RybCB8PSAoY21kIDw8IE5WNTBfQVVYQ0hfQ1RSTF9DTURfU0hJRlQpOwotCWN0cmwgfD0gKChkYXRhX25yIC0gMSkgPDwgTlY1MF9BVVhDSF9DVFJMX0xFTl9TSElGVCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQludl93cjMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGluZGV4KSwgY3RybCB8IDB4ODAwMDAwMDApOwotCQludl93cjMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGluZGV4KSwgY3RybCk7Ci0JCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoaW5kZXgpLCBjdHJsIHwgMHgwMDAxMDAwMCk7Ci0JCWlmICghbnZfd2FpdChkZXYsIE5WNTBfQVVYQ0hfQ1RSTChpbmRleCksCi0JCQkgICAgIDB4MDAwMTAwMDAsIDB4MDAwMDAwMDApKSB7Ci0JCQlOVl9FUlJPUihkZXYsICJleHBlY3RlZCBiaXQgMTYgPT0gMCwgZ290IDB4JTA4eFxuIiwKLQkJCQkgbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChpbmRleCkpKTsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJdWRlbGF5KDQwMCk7Ci0KLQkJc3RhdCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX1NUQVQoaW5kZXgpKTsKLQkJaWYgKChzdGF0ICYgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0FVWCkgIT0KLQkJCSAgICBOVjUwX0FVWENIX1NUQVRfUkVQTFlfQVVYX0RFRkVSKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gMTYpIHsKLQkJTlZfRVJST1IoZGV2LCAiYXV4Y2ggREVGRVIgdG9vIG1hbnkgdGltZXMsIGJhaWxpbmdcbiIpOwotCQlyZXQgPSAtRVJFTU9URUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoY21kICYgMSkgewotCQlpZiAoKHN0YXQgJiBOVjUwX0FVWENIX1NUQVRfQ09VTlQpICE9IGRhdGFfbnIpIHsKLQkJCXJldCA9IC1FUkVNT1RFSU87Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCWRhdGEzMltpXSA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0RBVEFfSU4oaW5kZXgsIGkpKTsKLQkJCU5WX0RFQlVHX0tNUyhkZXYsICJyZCAlZDogMHglMDh4XG4iLCBpLCBkYXRhMzJbaV0pOwotCQl9Ci0JCW1lbWNweShkYXRhLCBkYXRhMzIsIGRhdGFfbnIpOwotCX0KLQotb3V0OgotCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChhdXhjaC0+cmQpLCB0bXAgJiB+MHgwMDEwMDAwMCk7Ci0JdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChhdXhjaC0+cmQpKTsKLQlpZiAodG1wICYgMHgwMTAwMDAwMCkgewotCQlOVl9FUlJPUihkZXYsICJleHBlY3RlZCBiaXQgMjQgPT0gMCwgZ290IDB4JTA4eFxuIiwgdG1wKTsKLQkJcmV0ID0gLUVJTzsKLQl9Ci0KLQl1ZGVsYXkoNDAwKTsKLQotCXJldHVybiByZXQgPyByZXQgOiAoc3RhdCAmIE5WNTBfQVVYQ0hfU1RBVF9SRVBMWSk7CisJcmV0dXJuIGF1eGNoX3R4KGF1eGNoLT5kZXYsIGF1eGNoLT5yZCwgY21kLCBhZGRyLCBkYXRhLCBkYXRhX25yKTsKIH0KIAogc3RhdGljIGludAogbm91dmVhdV9kcF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQogewogCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaCA9IChzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqKWFkYXA7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGF1eGNoLT5kZXY7CiAJc3RydWN0IGkyY19tc2cgKm1zZyA9IG1zZ3M7CiAJaW50IHJldCwgbWNudCA9IG51bTsKIApAQCAtNjAyLDE5ICs3MTQsNiBAQAogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKIAotCQkJc3dpdGNoIChyZXQgJiBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDKSB7Ci0JCQljYXNlIE5WNTBfQVVYQ0hfU1RBVF9SRVBMWV9JMkNfQUNLOgotCQkJCWJyZWFrOwotCQkJY2FzZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDX05BQ0s6Ci0JCQkJcmV0dXJuIC1FUkVNT1RFSU87Ci0JCQljYXNlIE5WNTBfQVVYQ0hfU1RBVF9SRVBMWV9JMkNfREVGRVI6Ci0JCQkJdWRlbGF5KDEwMCk7Ci0JCQkJY29udGludWU7Ci0JCQlkZWZhdWx0OgotCQkJCU5WX0VSUk9SKGRldiwgImJhZCBhdXhjaCByZXBseTogMHglMDh4XG4iLCByZXQpOwotCQkJCXJldHVybiAtRVJFTU9URUlPOwotCQkJfQotCiAJCQlwdHIgKz0gY250OwogCQkJcmVtYWluaW5nIC09IGNudDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmMKaW5kZXggYjMwZGRkOC4uOWY3YmIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5jCkBAIC0yMyw2ICsyMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKQEAgLTQxLDcgKzQyLDcgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChhZ3Btb2RlLCBub3V2ZWF1X2FncG1vZGUsIGludCwgMDQwMCk7CiAKIE1PRFVMRV9QQVJNX0RFU0MobW9kZXNldCwgIkVuYWJsZSBrZXJuZWwgbW9kZXNldHRpbmciKTsKLXN0YXRpYyBpbnQgbm91dmVhdV9tb2Rlc2V0ID0gLTE7IC8qIGttcyAqLworaW50IG5vdXZlYXVfbW9kZXNldCA9IC0xOwogbW9kdWxlX3BhcmFtX25hbWVkKG1vZGVzZXQsIG5vdXZlYXVfbW9kZXNldCwgaW50LCAwNDAwKTsKIAogTU9EVUxFX1BBUk1fREVTQyh2YmlvcywgIk92ZXJyaWRlIGRlZmF1bHQgVkJJT1MgbG9jYXRpb24iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5oCmluZGV4IGQ3ZDUxZGUuLjI5ODM3ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaApAQCAtNDE0LDEyICs0MTQsMTMgQEAKIH07CiAKIHN0cnVjdCBub3V2ZWF1X3BtX3ZvbHRhZ2VfbGV2ZWwgewotCXU4IHZvbHRhZ2U7Ci0JdTggdmlkOworCXUzMiB2b2x0YWdlOyAvKiBtaWNyb3ZvbHRzICovCisJdTggIHZpZDsKIH07CiAKIHN0cnVjdCBub3V2ZWF1X3BtX3ZvbHRhZ2UgewogCWJvb2wgc3VwcG9ydGVkOworCXU4IHZlcnNpb247CiAJdTggdmlkX21hc2s7CiAKIAlzdHJ1Y3Qgbm91dmVhdV9wbV92b2x0YWdlX2xldmVsICpsZXZlbDsKQEAgLTQyOCwxNyArNDI5LDQ4IEBACiAKIHN0cnVjdCBub3V2ZWF1X3BtX21lbXRpbWluZyB7CiAJaW50IGlkOwotCXUzMiByZWdfMTAwMjIwOwotCXUzMiByZWdfMTAwMjI0OwotCXUzMiByZWdfMTAwMjI4OwotCXUzMiByZWdfMTAwMjJjOwotCXUzMiByZWdfMTAwMjMwOwotCXUzMiByZWdfMTAwMjM0OwotCXUzMiByZWdfMTAwMjM4OwotCXUzMiByZWdfMTAwMjNjOwotCXUzMiByZWdfMTAwMjQwOworCXUzMiByZWdfMDsgLyogMHgxMGYyOTAgb24gRmVybWksIDB4MTAwMjIwIGZvciBvbGRlciAqLworCXUzMiByZWdfMTsKKwl1MzIgcmVnXzI7CisJdTMyIHJlZ18zOworCXUzMiByZWdfNDsKKwl1MzIgcmVnXzU7CisJdTMyIHJlZ182OworCXUzMiByZWdfNzsKKwl1MzIgcmVnXzg7CisJLyogVG8gYmUgd3JpdHRlbiB0byAweDEwMDJjMCAqLworCXU4IENMOworCXU4IFdSOwogfTsKIAorc3RydWN0IG5vdXZlYXVfcG1fdGJsX2hlYWRlcnsKKwl1OCB2ZXJzaW9uOworCXU4IGhlYWRlcl9sZW47CisJdTggZW50cnlfY250OworCXU4IGVudHJ5X2xlbjsKK307CisKK3N0cnVjdCBub3V2ZWF1X3BtX3RibF9lbnRyeXsKKwl1OCB0V1I7CisJdTggdFVOS18xOworCXU4IHRDTDsKKwl1OCB0UlA7CQkvKiBCeXRlIDMgKi8KKwl1OCBlbXB0eV80OworCXU4IHRSQVM7CS8qIEJ5dGUgNSAqLworCXU4IGVtcHR5XzY7CisJdTggdFJGQzsJLyogQnl0ZSA3ICovCisJdTggZW1wdHlfODsKKwl1OCB0UkM7CQkvKiBCeXRlIDkgKi8KKwl1OCB0VU5LXzEwLCB0VU5LXzExLCB0VU5LXzEyLCB0VU5LXzEzLCB0VU5LXzE0OworCXU4IGVtcHR5XzE1LGVtcHR5XzE2LGVtcHR5XzE3OworCXU4IHRVTktfMTgsIHRVTktfMTksIHRVTktfMjAsIHRVTktfMjE7Cit9OworCisvKiBub3V2ZWF1X21lbS5jICovCit2b2lkIG52MzBfbWVtX3RpbWluZ19lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfaGVhZGVyICpoZHIsCisJCQkJCQkJc3RydWN0IG5vdXZlYXVfcG1fdGJsX2VudHJ5ICplLCB1aW50OF90IG1hZ2ljX251bWJlciwKKwkJCQkJCQlzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmcgKnRpbWluZyk7CisKICNkZWZpbmUgTk9VVkVBVV9QTV9NQVhfTEVWRUwgOAogc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgewogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyOwpAQCAtNDQ4LDExICs0ODAsMTkgQEAKIAl1MzIgY29yZTsKIAl1MzIgbWVtb3J5OwogCXUzMiBzaGFkZXI7Ci0JdTMyIHVuazA1OwotCXUzMiB1bmswYTsKKwl1MzIgcm9wOworCXUzMiBjb3B5OworCXUzMiBkYWVtb247CisJdTMyIHZkZWM7CisJdTMyIHVuazA1OwkvKiBudjUwOm52YTMsIHJvdWdobHkuLiAqLworCXUzMiB1bmthMDsJLyogbnZhMzpudmMwICovCisJdTMyIGh1YjAxOwkvKiBudmMwLSAqLworCXUzMiBodWIwNjsJLyogbnZjMC0gKi8KKwl1MzIgaHViMDc7CS8qIG52YzAtICovCiAKLQl1OCB2b2x0YWdlOwotCXU4IGZhbnNwZWVkOworCXUzMiB2b2x0X21pbjsgLyogbWljcm92b2x0cyAqLworCXUzMiB2b2x0X21heDsKKwl1OCAgZmFuc3BlZWQ7CiAKIAl1MTYgbWVtc2NyaXB0OwogCXN0cnVjdCBub3V2ZWF1X3BtX21lbXRpbWluZyAqdGltaW5nOwpAQCAtNDk2LDYgKzUzNiwxMSBAQAogCXZvaWQgKigqY2xvY2tfcHJlKShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqLAogCQkJICAgdTMyIGlkLCBpbnQga2h6KTsKIAl2b2lkICgqY2xvY2tfc2V0KShzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICopOworCisJaW50ICAoKmNsb2Nrc19nZXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICopOworCXZvaWQgKigqY2xvY2tzX3ByZSkoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKik7CisJdm9pZCAoKmNsb2Nrc19zZXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKik7CisKIAlpbnQgKCp2b2x0YWdlX2dldCkoc3RydWN0IGRybV9kZXZpY2UgKik7CiAJaW50ICgqdm9sdGFnZV9zZXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCB2b2x0YWdlKTsKIAlpbnQgKCpmYW5zcGVlZF9nZXQpKHN0cnVjdCBkcm1fZGV2aWNlICopOwpAQCAtNTA0LDcgKzU0OSw3IEBACiB9OwogCiBzdHJ1Y3Qgbm91dmVhdV92cmFtX2VuZ2luZSB7Ci0Jc3RydWN0IG5vdXZlYXVfbW0gKm1tOworCXN0cnVjdCBub3V2ZWF1X21tIG1tOwogCiAJaW50ICAoKmluaXQpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCXZvaWQgKCp0YWtlZG93bikoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC02MjMsNiArNjY4LDcgQEAKIAlOVl80MCAgICAgID0gMHg0MCwKIAlOVl81MCAgICAgID0gMHg1MCwKIAlOVl9DMCAgICAgID0gMHhjMCwKKwlOVl9EMCAgICAgID0gMHhkMAogfTsKIAogc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgewpAQCAtNjMzLDggKzY3OSw4IEBACiAJZW51bSBub3V2ZWF1X2NhcmRfdHlwZSBjYXJkX3R5cGU7CiAJLyogZXhhY3QgY2hpcHNldCwgZGVyaXZlZCBmcm9tIE5WX1BNQ19CT09UXzAgKi8KIAlpbnQgY2hpcHNldDsKLQlpbnQgc3RlcHBpbmc7CiAJaW50IGZsYWdzOworCXUzMiBjcnlzdGFsOwogCiAJdm9pZCBfX2lvbWVtICptbWlvOwogCkBAIC03MjEsNyArNzY3LDYgQEAKIAl1aW50NjRfdCB2cmFtX3NpemU7CiAJdWludDY0X3QgdnJhbV9zeXNfYmFzZTsKIAotCXVpbnQ2NF90IGZiX3BoeXM7CiAJdWludDY0X3QgZmJfYXZhaWxhYmxlX3NpemU7CiAJdWludDY0X3QgZmJfbWFwcGFibGVfcGFnZXM7CiAJdWludDY0X3QgZmJfYXBlcl9mcmVlOwpAQCAtNzg0LDYgKzgyOSw3IEBACiB9CiAKIC8qIG5vdXZlYXVfZHJ2LmMgKi8KK2V4dGVybiBpbnQgbm91dmVhdV9tb2Rlc2V0OwogZXh0ZXJuIGludCBub3V2ZWF1X2FncG1vZGU7CiBleHRlcm4gaW50IG5vdXZlYXVfZHVhbGxpbms7CiBleHRlcm4gaW50IG5vdXZlYXVfdXNjcmlwdF9sdmRzOwpAQCAtODI0LDYgKzg3MCw4IEBACiAJCQkgICAgdWludDMyX3QgcmVnLCB1aW50MzJfdCBtYXNrLCB1aW50MzJfdCB2YWwpOwogZXh0ZXJuIGJvb2wgbm91dmVhdV93YWl0X25lKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQ2NF90IHRpbWVvdXQsCiAJCQkgICAgdWludDMyX3QgcmVnLCB1aW50MzJfdCBtYXNrLCB1aW50MzJfdCB2YWwpOworZXh0ZXJuIGJvb2wgbm91dmVhdV93YWl0X2NiKHN0cnVjdCBkcm1fZGV2aWNlICosIHU2NCB0aW1lb3V0LAorCQkJICAgIGJvb2wgKCpjb25kKSh2b2lkICopLCB2b2lkICopOwogZXh0ZXJuIGJvb2wgbm91dmVhdV93YWl0X2Zvcl9pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCAgbm91dmVhdV9jYXJkX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiAKQEAgLTEwMDYsMTUgKzEwNTQsMTUgQEAKIAogLyogbm91dmVhdV9iYWNrbGlnaHQuYyAqLwogI2lmZGVmIENPTkZJR19EUk1fTk9VVkVBVV9CQUNLTElHSFQKLWV4dGVybiBpbnQgbm91dmVhdV9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKTsKLWV4dGVybiB2b2lkIG5vdXZlYXVfYmFja2xpZ2h0X2V4aXQoc3RydWN0IGRybV9jb25uZWN0b3IgKik7CitleHRlcm4gaW50IG5vdXZlYXVfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2JhY2tsaWdodF9leGl0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IG5vdXZlYXVfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9jb25uZWN0b3IgKmRldikKK3N0YXRpYyBpbmxpbmUgaW50IG5vdXZlYXVfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG5vdXZlYXVfYmFja2xpZ2h0X2V4aXQoc3RydWN0IGRybV9jb25uZWN0b3IgKmRldikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgbm91dmVhdV9iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KSB7IH0KICNlbmRpZgogCiAvKiBub3V2ZWF1X2Jpb3MuYyAqLwpAQCAtMTAyMiw3ICsxMDcwLDggQEAKIGV4dGVybiB2b2lkIG5vdXZlYXVfYmlvc190YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgbm91dmVhdV9ydW5fdmJpb3NfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqLCB1aW50MTZfdCB0YWJsZSwKLQkJCQkJc3RydWN0IGRjYl9lbnRyeSAqKTsKKwkJCQkJc3RydWN0IGRjYl9lbnRyeSAqLCBpbnQgY3J0Yyk7CitleHRlcm4gdm9pZCBub3V2ZWF1X2Jpb3NfaW5pdF9leGVjKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQxNl90IHRhYmxlKTsKIGV4dGVybiBzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKm5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICosCiAJCQkJCQkgICAgICBlbnVtIGRjYl9ncGlvX3RhZyk7CiBleHRlcm4gc3RydWN0IGRjYl9jb25uZWN0b3JfdGFibGVfZW50cnkgKgpAQCAtMTAzMCwxMSArMTA3OSw4IEBACiBleHRlcm4gdTMyIGdldF9wbGxfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBwbGxfdHlwZXMpOwogZXh0ZXJuIGludCBnZXRfcGxsX2xpbWl0cyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB1aW50MzJfdCBsaW1pdF9tYXRjaCwKIAkJCSAgc3RydWN0IHBsbF9saW1zICopOwotZXh0ZXJuIGludCBub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKiwKLQkJCQkJICBzdHJ1Y3QgZGNiX2VudHJ5ICosCi0JCQkJCSAgdWludDMyX3Qgc2NyaXB0LCBpbnQgcHhjbGspOwotZXh0ZXJuIHZvaWQgKm5vdXZlYXVfYmlvc19kcF90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZGNiX2VudHJ5ICosCi0JCQkJICAgaW50ICpsZW5ndGgpOworZXh0ZXJuIGludCBub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKiwgdTE2IGlkLCBpbnQgY2xrLAorCQkJCQkgIHN0cnVjdCBkY2JfZW50cnkgKiwgaW50IGNydGMpOwogZXh0ZXJuIGJvb2wgbm91dmVhdV9iaW9zX2ZwX21vZGUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKik7CiBleHRlcm4gdWludDhfdCAqbm91dmVhdV9iaW9zX2VtYmVkZGVkX2VkaWQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50IG5vdXZlYXVfYmlvc19wYXJzZV9sdmRzX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBweGNsaywKQEAgLTEwNDMsNiArMTA4OSw3IEBACiAJCQkgIGludCBoZWFkLCBpbnQgcHhjbGspOwogZXh0ZXJuIGludCBjYWxsX2x2ZHNfc2NyaXB0KHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkY2JfZW50cnkgKiwgaW50IGhlYWQsCiAJCQkgICAgZW51bSBMVkRTX3NjcmlwdCwgaW50IHB4Y2xrKTsKK2Jvb2wgYmlvc19lbmNvZGVyX21hdGNoKHN0cnVjdCBkY2JfZW50cnkgKiwgdTMyIGhhc2gpOwogCiAvKiBub3V2ZWF1X3R0bS5jICovCiBpbnQgbm91dmVhdV90dG1fZ2xvYmFsX2luaXQoc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKik7CkBAIC0xMDUzLDcgKzExMDAsOSBAQAogaW50IG5vdXZlYXVfZHBfYXV4Y2goc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmF1eGNoLCBpbnQgY21kLCBpbnQgYWRkciwKIAkJICAgICB1aW50OF90ICpkYXRhLCBpbnQgZGF0YV9ucik7CiBib29sIG5vdXZlYXVfZHBfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqKTsKLWJvb2wgbm91dmVhdV9kcF9saW5rX3RyYWluKHN0cnVjdCBkcm1fZW5jb2RlciAqKTsKK2Jvb2wgbm91dmVhdV9kcF9saW5rX3RyYWluKHN0cnVjdCBkcm1fZW5jb2RlciAqLCB1MzIgZGF0YXJhdGUpOwordm9pZCBub3V2ZWF1X2RwX3R1X3VwZGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIGludCwgdTMyLCB1MzIpOwordTggKm5vdXZlYXVfZHBfYmlvc19kYXRhKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkY2JfZW50cnkgKiwgdTggKiopOwogCiAvKiBudjA0X2ZiLmMgKi8KIGV4dGVybiBpbnQgIG52MDRfZmJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKQEAgLTExNzksOCArMTIyOCw4IEBACiAvKiBudmMwX2NvcHkuYyAqLwogZXh0ZXJuIGludCAgbnZjMF9jb3B5X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lKTsKIAotLyogbnY0MF9tcGVnLmMgKi8KLWV4dGVybiBpbnQgIG52NDBfbXBlZ19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisvKiBudjMxX21wZWcuYyAqLworZXh0ZXJuIGludCAgbnYzMV9tcGVnX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogLyogbnY1MF9tcGVnLmMgKi8KIGV4dGVybiBpbnQgIG52NTBfbXBlZ19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC0xMjY1LDYgKzEzMTQsMTEgQEAKIGV4dGVybiBpbnQgbnYwNF9kaXNwbGF5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjA0X2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAorLyogbnZkMF9kaXNwbGF5LmMgKi8KK2V4dGVybiBpbnQgbnZkMF9kaXNwbGF5X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgbnZkMF9kaXNwbGF5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudmQwX2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwogLyogbnYwNF9jcnRjLmMgKi8KIGV4dGVybiBpbnQgbnYwNF9jcnRjX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgaW5kZXgpOwogCkBAIC0xMzc0LDYgKzE0MjgsOCBAQAogdm9pZCBudjUwX2dwaW9fZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGludCBudjUwX2dwaW9fZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZyk7CiBpbnQgbnY1MF9ncGlvX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcsIGludCBzdGF0ZSk7CitpbnQgbnZkMF9ncGlvX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcpOworaW50IG52ZDBfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpOwogaW50ICBudjUwX2dwaW9faXJxX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gZGNiX2dwaW9fdGFnLAogCQkJICAgIHZvaWQgKCopKHZvaWQgKiwgaW50KSwgdm9pZCAqKTsKIHZvaWQgbnY1MF9ncGlvX2lycV91bnJlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gZGNiX2dwaW9fdGFnLApAQCAtMTQ0OCw2ICsxNTA0LDggQEAKIAlub3V2ZWF1X3dhaXRfZXEoZGV2LCAyMDAwMDAwMDAwVUxMLCAocmVnKSwgKG1hc2spLCAodmFsKSkKICNkZWZpbmUgbnZfd2FpdF9uZShkZXYsIHJlZywgbWFzaywgdmFsKSBcCiAJbm91dmVhdV93YWl0X25lKGRldiwgMjAwMDAwMDAwMFVMTCwgKHJlZyksIChtYXNrKSwgKHZhbCkpCisjZGVmaW5lIG52X3dhaXRfY2IoZGV2LCBmdW5jLCBkYXRhKSBcCisJbm91dmVhdV93YWl0X2NiKGRldiwgMjAwMDAwMDAwMFVMTCwgKGZ1bmMpLCAoZGF0YSkpCiAKIC8qIFBSQU1JTiBhY2Nlc3MgKi8KIHN0YXRpYyBpbmxpbmUgdTMyIG52X3JpMzIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgb2Zmc2V0KQpAQCAtMTUxNCw2ICsxNTcyLDcgQEAKIAlOT1VWRUFVX1JFR19ERUJVR19STVZJTyAgICAgICAgICA9IDB4ODAsCiAJTk9VVkVBVV9SRUdfREVCVUdfVkdBQVRUUiAgICAgICAgPSAweDEwMCwKIAlOT1VWRUFVX1JFR19ERUJVR19FVk8gICAgICAgICAgICA9IDB4MjAwLAorCU5PVVZFQVVfUkVHX0RFQlVHX0FVWENIICAgICAgICAgID0gMHg0MDAKIH07CiAKICNkZWZpbmUgTlZfUkVHX0RFQlVHKHR5cGUsIGRldiwgZm10LCBhcmcuLi4pIGRvIHsgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9lbmNvZGVyLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2VuY29kZXIuaAppbmRleCBhZTY5YjYxLi5lNWQ2ZTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2VuY29kZXIuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2VuY29kZXIuaApAQCAtNDksMTcgKzQ5LDE3IEBACiAKIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQlpbnQgbWNfdW5rbm93bjsKLQkJCXVpbnQzMl90IHVuazA7Ci0JCQl1aW50MzJfdCB1bmsxOwotCQkJaW50IGRwY2RfdmVyc2lvbjsKKwkJCXU4ICBkcGNkWzhdOwogCQkJaW50IGxpbmtfbnI7CiAJCQlpbnQgbGlua19idzsKLQkJCWJvb2wgZW5oYW5jZWRfZnJhbWU7CisJCQl1MzIgZGF0YXJhdGU7CiAJCX0gZHA7CiAJfTsKIH07CiAKK3N0cnVjdCBub3V2ZWF1X2VuY29kZXIgKgorZmluZF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCB0eXBlKTsKKwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpub3V2ZWF1X2VuY29kZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmMpCiB7CiAJc3RydWN0IGRybV9lbmNvZGVyX3NsYXZlICpzbGF2ZSA9IHRvX2VuY29kZXJfc2xhdmUoZW5jKTsKQEAgLTgzLDIxICs4Myw0IEBACiBpbnQgbnY1MF9zb3JfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICosIHN0cnVjdCBkY2JfZW50cnkgKik7CiBpbnQgbnY1MF9kYWNfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICosIHN0cnVjdCBkY2JfZW50cnkgKik7CiAKLXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSB7Ci0JdWludDMyX3QgbWF0Y2g7Ci0JdWludDhfdCAgcmVjb3JkX25yOwotCXVpbnQ4X3QgIHVua25vd247Ci0JdWludDE2X3Qgc2NyaXB0MDsKLQl1aW50MTZfdCBzY3JpcHQxOwotCXVpbnQxNl90IHVua25vd25fdGFibGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlX2VudHJ5IHsKLQl1aW50OF90IHZzX2xldmVsOwotCXVpbnQ4X3QgcHJlX2xldmVsOwotCXVpbnQ4X3QgcmVnMDsKLQl1aW50OF90IHJlZzE7Ci0JdWludDhfdCByZWcyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KICNlbmRpZiAvKiBfX05PVVZFQVVfRU5DT0RFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uYwppbmRleCAxNGE4NjI3Li4zYTRjYzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5jCkBAIC00ODcsNiArNDg3LDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2ZiZGV2ICpuZmJkZXY7CisJaW50IHByZWZlcnJlZF9icHA7CiAJaW50IHJldDsKIAogCW5mYmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub3V2ZWF1X2ZiZGV2KSwgR0ZQX0tFUk5FTCk7CkBAIC01MDUsNyArNTA2LDE1IEBACiAJfQogCiAJZHJtX2ZiX2hlbHBlcl9zaW5nbGVfYWRkX2FsbF9jb25uZWN0b3JzKCZuZmJkZXYtPmhlbHBlcik7Ci0JZHJtX2ZiX2hlbHBlcl9pbml0aWFsX2NvbmZpZygmbmZiZGV2LT5oZWxwZXIsIDMyKTsKKworCWlmIChkZXZfcHJpdi0+dnJhbV9zaXplIDw9IDMyICogMTAyNCAqIDEwMjQpCisJCXByZWZlcnJlZF9icHAgPSA4OworCWVsc2UgaWYgKGRldl9wcml2LT52cmFtX3NpemUgPD0gNjQgKiAxMDI0ICogMTAyNCkKKwkJcHJlZmVycmVkX2JwcCA9IDE2OworCWVsc2UKKwkJcHJlZmVycmVkX2JwcCA9IDMyOworCisJZHJtX2ZiX2hlbHBlcl9pbml0aWFsX2NvbmZpZygmbmZiZGV2LT5oZWxwZXIsIHByZWZlcnJlZF9icHApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKaW5kZXggYzkxOWNmYy4uMmY2ZGFhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYwpAQCAtNTE5LDcgKzUxOSw3IEBACiAJaWYgKFVTRV9TRU1BKGRldikgJiYgZGV2X3ByaXYtPmNoaXBzZXQgPCAweDg0KSB7CiAJCXN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtID0gJmRldl9wcml2LT5mZW5jZS5iby0+Ym8ubWVtOwogCi0JCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfRlJPTV9NRU1PUlksCiAJCQkJCSAgICAgbWVtLT5zdGFydCA8PCBQQUdFX1NISUZULAogCQkJCQkgICAgIG1lbS0+c2l6ZSwgTlZfTUVNX0FDQ0VTU19SVywKIAkJCQkJICAgICBOVl9NRU1fVEFSR0VUX1ZSQU0sICZvYmopOwpAQCAtNTM5LDggKzUzOSw2IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5mZW5jZS5wZW5kaW5nKTsKLQlzcGluX2xvY2tfaW5pdCgmY2hhbi0+ZmVuY2UubG9jayk7CiAJYXRvbWljX3NldCgmY2hhbi0+ZmVuY2UubGFzdF9zZXF1ZW5jZV9pcnEsIDApOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmMKaW5kZXggY2IzODlkMC4uZDM5YjIyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2kyYy5jCkBAIC0yMiw2ICsyMiw4IEBACiAgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9pMmMuaCIKQEAgLTEwNyw2ICsxMDksMTMgQEAKIAlyZXR1cm4gISEoKG52X3JkMzIoZGV2LCBpMmMtPnJkKSA+PiAxNikgJiA4KTsKIH0KIAorc3RhdGljIGNvbnN0IHVpbnQzMl90IG52NTBfaTJjX3BvcnRbXSA9IHsKKwkweDAwZTEzOCwgMHgwMGUxNTAsIDB4MDBlMTY4LCAweDAwZTE4MCwKKwkweDAwZTI1NCwgMHgwMGUyNzQsIDB4MDBlNzY0LCAweDAwZTc4MCwKKwkweDAwZTc5YywgMHgwMGU3YjgKK307CisjZGVmaW5lIE5WNTBfSTJDX1BPUlRTIEFSUkFZX1NJWkUobnY1MF9pMmNfcG9ydCkKKwogc3RhdGljIGludAogbnY1MF9pMmNfZ2V0c2NsKHZvaWQgKmRhdGEpCiB7CkBAIC0xMzAsMjggKzEzOSwzMiBAQAogbnY1MF9pMmNfc2V0c2NsKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CiAKLQludl93cjMyKGRldiwgaTJjLT53ciwgNCB8IChpMmMtPmRhdGEgPyAyIDogMCkgfCAoc3RhdGUgPyAxIDogMCkpOworCW52X3dyMzIoaTJjLT5kZXYsIGkyYy0+d3IsIDQgfCAoaTJjLT5kYXRhID8gMiA6IDApIHwgKHN0YXRlID8gMSA6IDApKTsKIH0KIAogc3RhdGljIHZvaWQKIG52NTBfaTJjX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OwogCi0JbnZfd3IzMihkZXYsIGkyYy0+d3IsCi0JCQkobnZfcmQzMihkZXYsIGkyYy0+cmQpICYgMSkgfCA0IHwgKHN0YXRlID8gMiA6IDApKTsKKwludl9tYXNrKGkyYy0+ZGV2LCBpMmMtPndyLCAweDAwMDAwMDA2LCA0IHwgKHN0YXRlID8gMiA6IDApKTsKIAlpMmMtPmRhdGEgPSBzdGF0ZTsKIH0KIAotc3RhdGljIGNvbnN0IHVpbnQzMl90IG52NTBfaTJjX3BvcnRbXSA9IHsKLQkweDAwZTEzOCwgMHgwMGUxNTAsIDB4MDBlMTY4LCAweDAwZTE4MCwKLQkweDAwZTI1NCwgMHgwMGUyNzQsIDB4MDBlNzY0LCAweDAwZTc4MCwKLQkweDAwZTc5YywgMHgwMGU3YjgKLX07Ci0jZGVmaW5lIE5WNTBfSTJDX1BPUlRTIEFSUkFZX1NJWkUobnY1MF9pMmNfcG9ydCkKK3N0YXRpYyBpbnQKK252ZDBfaTJjX2dldHNjbCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBkYXRhOworCXJldHVybiAhIShudl9yZDMyKGkyYy0+ZGV2LCBpMmMtPnJkKSAmIDB4MTApOworfQorCitzdGF0aWMgaW50CitudmQwX2kyY19nZXRzZGEodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlyZXR1cm4gISEobnZfcmQzMihpMmMtPmRldiwgaTJjLT5yZCkgJiAweDIwKTsKK30KIAogaW50CiBub3V2ZWF1X2kyY19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfaTJjX2VudHJ5ICplbnRyeSwgaW50IGluZGV4KQpAQCAtMTYzLDcgKzE3Niw4IEBACiAJaWYgKGVudHJ5LT5jaGFuKQogCQlyZXR1cm4gLUVFWElTVDsKIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwICYmIGVudHJ5LT5yZWFkID49IE5WNTBfSTJDX1BPUlRTKSB7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTAgJiYKKwkgICAgZGV2X3ByaXYtPmNhcmRfdHlwZSA8PSBOVl9DMCAmJiBlbnRyeS0+cmVhZCA+PSBOVjUwX0kyQ19QT1JUUykgewogCQlOVl9FUlJPUihkZXYsICJ1bmtub3duIGkyYyBwb3J0ICVkXG4iLCBlbnRyeS0+cmVhZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE5MiwxMCArMjA2LDE3IEBACiAJY2FzZSA1OgogCQlpMmMtPmJpdC5zZXRzZGEgPSBudjUwX2kyY19zZXRzZGE7CiAJCWkyYy0+Yml0LnNldHNjbCA9IG52NTBfaTJjX3NldHNjbDsKLQkJaTJjLT5iaXQuZ2V0c2RhID0gbnY1MF9pMmNfZ2V0c2RhOwotCQlpMmMtPmJpdC5nZXRzY2wgPSBudjUwX2kyY19nZXRzY2w7Ci0JCWkyYy0+cmQgPSBudjUwX2kyY19wb3J0W2VudHJ5LT5yZWFkXTsKLQkJaTJjLT53ciA9IGkyYy0+cmQ7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfRDApIHsKKwkJCWkyYy0+Yml0LmdldHNkYSA9IG52NTBfaTJjX2dldHNkYTsKKwkJCWkyYy0+Yml0LmdldHNjbCA9IG52NTBfaTJjX2dldHNjbDsKKwkJCWkyYy0+cmQgPSBudjUwX2kyY19wb3J0W2VudHJ5LT5yZWFkXTsKKwkJCWkyYy0+d3IgPSBpMmMtPnJkOworCQl9IGVsc2UgeworCQkJaTJjLT5iaXQuZ2V0c2RhID0gbnZkMF9pMmNfZ2V0c2RhOworCQkJaTJjLT5iaXQuZ2V0c2NsID0gbnZkMF9pMmNfZ2V0c2NsOworCQkJaTJjLT5yZCA9IDB4MDBkMDE0ICsgKGVudHJ5LT5yZWFkICogMHgyMCk7CisJCQlpMmMtPndyID0gaTJjLT5yZDsKKwkJfQogCQlicmVhazsKIAljYXNlIDY6CiAJCWkyYy0+cmQgPSBlbnRyeS0+cmVhZDsKQEAgLTI2Nyw3ICsyODgsMTAgQEAKIAkJCXZhbCAgPSAweGUwMDE7CiAJCX0KIAotCQludl93cjMyKGRldiwgcmVnLCAobnZfcmQzMihkZXYsIHJlZykgJiB+MHhmMDAzKSB8IHZhbCk7CisJCS8qIG5maSwgYnV0IG5laXRoZXIgYXV4Y2ggb3IgaTJjIHdvcmsgaWYgaXQncyAxICovCisJCW52X21hc2soZGV2LCByZWcgKyAweDBjLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwkJLyogbmZpLCBidXQgc3dpdGNoZXMgYXV4Y2ggdnMgbm9ybWFsIGkyYyAqLworCQludl9tYXNrKGRldiwgcmVnICsgMHgwMCwgMHgwMDAwZjAwMywgdmFsKTsKIAl9CiAKIAlpZiAoIWkyYy0+Y2hhbiAmJiBub3V2ZWF1X2kyY19pbml0KGRldiwgaTJjLCBpbmRleCkpCkBAIC0zMDksNyArMzMzLDcgQEAKIAogCU5WX0RFQlVHKGRldiwgIlByb2JpbmcgJXNzIG9uIEkyQyBidXM6ICVkXG4iLCB3aGF0LCBpbmRleCk7CiAKLQlmb3IgKGkgPSAwOyBpbmZvW2ldLmFkZHI7IGkrKykgeworCWZvciAoaSA9IDA7IGkyYyAmJiBpbmZvW2ldLmFkZHI7IGkrKykgewogCQlpZiAobm91dmVhdV9wcm9iZV9pMmNfYWRkcihpMmMsIGluZm9baV0uYWRkcikgJiYKIAkJICAgICghbWF0Y2ggfHwgbWF0Y2goaTJjLCAmaW5mb1tpXSkpKSB7CiAJCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkICVzOiAlc1xuIiwgd2hhdCwgaW5mb1tpXS50eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jCmluZGV4IGY5YWUyZmMuLjM2YmVjNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tZW0uYwpAQCAtNDA4LDggKzQwOCw2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWRldl9wcml2LT5mYl9waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7Ci0KIAlyZXQgPSBub3V2ZWF1X3R0bV9nbG9iYWxfaW5pdChkZXZfcHJpdik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTUwNCwzNSArNTAyLDE0NiBAQAogCXJldHVybiAwOwogfQogCisvKiBYWFg6IEZvciBub3cgYSBkdW1teS4gTW9yZSBzYW1wbGVzIHJlcXVpcmVkLCBwb3NzaWJseSBldmVuIGEgY2FyZAorICogQ2FsbGVkIGZyb20gbm91dmVhdV9wZXJmLmMgKi8KK3ZvaWQgbnYzMF9tZW1fdGltaW5nX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X3BtX3RibF9oZWFkZXIgKmhkciwKKwkJCQkJCQlzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfZW50cnkgKmUsIHVpbnQ4X3QgbWFnaWNfbnVtYmVyLAorCQkJCQkJCXN0cnVjdCBub3V2ZWF1X3BtX21lbXRpbWluZyAqdGltaW5nKSB7CisKKwlOVl9ERUJVRyhkZXYsIlRpbWluZyBlbnRyeSBmb3JtYXQgdW5rbm93biwgcGxlYXNlIGNvbnRhY3Qgbm91dmVhdSBkZXZlbG9wZXJzIik7Cit9CisKK3ZvaWQgbnY0MF9tZW1fdGltaW5nX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X3BtX3RibF9oZWFkZXIgKmhkciwKKwkJCQkJCQlzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfZW50cnkgKmUsIHVpbnQ4X3QgbWFnaWNfbnVtYmVyLAorCQkJCQkJCXN0cnVjdCBub3V2ZWF1X3BtX21lbXRpbWluZyAqdGltaW5nKSB7CisKKwl0aW1pbmctPnJlZ18wID0gKGUtPnRSQyA8PCAyNCB8IGUtPnRSRkMgPDwgMTYgfCBlLT50UkFTIDw8IDggfCBlLT50UlApOworCisJLyogWFhYOiBJIGRvbid0IHRydXN0IHRoZSAtMSdzIGFuZCArMSdzLi4uIHRoZXkgbXVzdCBjb21lCisJICogICAgICBmcm9tIHNvbWV3aGVyZSEgKi8KKwl0aW1pbmctPnJlZ18xID0gKGUtPnRXUiArIDIgKyBtYWdpY19udW1iZXIpIDw8IDI0IHwKKwkJCQkgIDEgPDwgMTYgfAorCQkJCSAgKGUtPnRVTktfMSArIDIgKyBtYWdpY19udW1iZXIpIDw8IDggfAorCQkJCSAgKGUtPnRDTCArIDIgLSBtYWdpY19udW1iZXIpOworCXRpbWluZy0+cmVnXzIgPSAobWFnaWNfbnVtYmVyIDw8IDI0IHwgZS0+dFVOS18xMiA8PCAxNiB8IGUtPnRVTktfMTEgPDwgOCB8IGUtPnRVTktfMTApOworCXRpbWluZy0+cmVnXzIgfD0gMHgyMDIwMDAwMDsKKworCU5WX0RFQlVHKGRldiwgIkVudHJ5ICVkOiAyMjA6ICUwOHggJTA4eCAlMDh4XG4iLCB0aW1pbmctPmlkLAorCQkgdGltaW5nLT5yZWdfMCwgdGltaW5nLT5yZWdfMSx0aW1pbmctPnJlZ18yKTsKK30KKwordm9pZCBudjUwX21lbV90aW1pbmdfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGJpdF9lbnRyeSAqUCwgc3RydWN0IG5vdXZlYXVfcG1fdGJsX2hlYWRlciAqaGRyLAorCQkJCQkJCXN0cnVjdCBub3V2ZWF1X3BtX3RibF9lbnRyeSAqZSwgdWludDhfdCBtYWdpY19udW1iZXIsc3RydWN0IG5vdXZlYXVfcG1fbWVtdGltaW5nICp0aW1pbmcpIHsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJdWludDhfdCB1bmsxOCA9IDEsCisJCXVuazE5ID0gMSwKKwkJdW5rMjAgPSAwLAorCQl1bmsyMSA9IDA7CisKKwlzd2l0Y2ggKG1pbihoZHItPmVudHJ5X2xlbiwgKHU4KSAyMikpIHsKKwljYXNlIDIyOgorCQl1bmsyMSA9IGUtPnRVTktfMjE7CisJY2FzZSAyMToKKwkJdW5rMjAgPSBlLT50VU5LXzIwOworCWNhc2UgMjA6CisJCXVuazE5ID0gZS0+dFVOS18xOTsKKwljYXNlIDE5OgorCQl1bmsxOCA9IGUtPnRVTktfMTg7CisJCWJyZWFrOworCX0KKworCXRpbWluZy0+cmVnXzAgPSAoZS0+dFJDIDw8IDI0IHwgZS0+dFJGQyA8PCAxNiB8IGUtPnRSQVMgPDwgOCB8IGUtPnRSUCk7CisKKwkvKiBYWFg6IEkgZG9uJ3QgdHJ1c3QgdGhlIC0xJ3MgYW5kICsxJ3MuLi4gdGhleSBtdXN0IGNvbWUKKwkgKiAgICAgIGZyb20gc29tZXdoZXJlISAqLworCXRpbWluZy0+cmVnXzEgPSAoZS0+dFdSICsgdW5rMTkgKyAxICsgbWFnaWNfbnVtYmVyKSA8PCAyNCB8CisJCQkJICBtYXgodW5rMTgsICh1OCkgMSkgPDwgMTYgfAorCQkJCSAgKGUtPnRVTktfMSArIHVuazE5ICsgMSArIG1hZ2ljX251bWJlcikgPDwgODsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHhhOCkgeworCQl0aW1pbmctPnJlZ18xIHw9IChlLT50Q0wgLSAxKTsKKwl9IGVsc2UgeworCQl0aW1pbmctPnJlZ18xIHw9IChlLT50Q0wgKyAyIC0gbWFnaWNfbnVtYmVyKTsKKwl9CisJdGltaW5nLT5yZWdfMiA9IChlLT50VU5LXzEyIDw8IDE2IHwgZS0+dFVOS18xMSA8PCA4IHwgZS0+dFVOS18xMCk7CisKKwl0aW1pbmctPnJlZ181ID0gKGUtPnRSQVMgPDwgMjQgfCBlLT50UkMpOworCXRpbWluZy0+cmVnXzUgKz0gbWF4KGUtPnRVTktfMTAsIGUtPnRVTktfMTEpIDw8IDE2OworCisJaWYgKFAtPnZlcnNpb24gPT0gMSkgeworCQl0aW1pbmctPnJlZ18yIHw9IG1hZ2ljX251bWJlciA8PCAyNDsKKwkJdGltaW5nLT5yZWdfMyA9ICgweDE0ICsgZS0+dENMKSA8PCAyNCB8CisJCQkJCQkweDE2IDw8IDE2IHwKKwkJCQkJCShlLT50Q0wgLSAxKSA8PCA4IHwKKwkJCQkJCShlLT50Q0wgLSAxKTsKKwkJdGltaW5nLT5yZWdfNCA9IChudl9yZDMyKGRldiwweDEwMDIyYykgJiAweGZmZmYwMDAwKSB8IGUtPnRVTktfMTMgPDwgOCAgfCBlLT50VU5LXzEzOworCQl0aW1pbmctPnJlZ181IHw9IChlLT50Q0wgKyAyKSA8PCA4OworCQl0aW1pbmctPnJlZ183ID0gMHg0MDAwMjAyIHwgKGUtPnRDTCAtIDEpIDw8IDE2OworCX0gZWxzZSB7CisJCXRpbWluZy0+cmVnXzIgfD0gKHVuazE5IC0gMSkgPDwgMjQ7CisJCS8qIFhYWDogcmVnXzEwMDIyYyBmb3IgcmVjZW50aXNoIGNhcmRzIHByZXR0eSBtdWNoIHVua25vd24qLworCQl0aW1pbmctPnJlZ18zID0gZS0+dENMIC0gMTsKKwkJdGltaW5nLT5yZWdfNCA9ICh1bmsyMCA8PCAyNCB8IHVuazIxIDw8IDE2IHwKKwkJCQkJCQllLT50VU5LXzEzIDw8IDggIHwgZS0+dFVOS18xMyk7CisJCS8qIFhYWDogKzY/ICovCisJCXRpbWluZy0+cmVnXzUgfD0gKHVuazE5ICsgNikgPDwgODsKKworCQkvKiBYWFg6IHJlZ18xMDAyM2MgY3VycmVudGx5IHVua25vd24KKwkJICogMTAwMjNjIHNlZW4gYXMgMDZ4eHh4eHgsIDBieHh4eHh4IG9yIDBmeHh4eHh4ICovCisJCXRpbWluZy0+cmVnXzcgPSAweDIwMjsKKwl9CisKKwlOVl9ERUJVRyhkZXYsICJFbnRyeSAlZDogMjIwOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCB0aW1pbmctPmlkLAorCQkgdGltaW5nLT5yZWdfMCwgdGltaW5nLT5yZWdfMSwKKwkJIHRpbWluZy0+cmVnXzIsIHRpbWluZy0+cmVnXzMpOworCU5WX0RFQlVHKGRldiwgIiAgICAgICAgIDIzMDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkJIHRpbWluZy0+cmVnXzQsIHRpbWluZy0+cmVnXzUsCisJCSB0aW1pbmctPnJlZ182LCB0aW1pbmctPnJlZ183KTsKKwlOVl9ERUJVRyhkZXYsICIgICAgICAgICAyNDA6ICUwOHhcbiIsIHRpbWluZy0+cmVnXzgpOworfQorCit2b2lkIG52YzBfbWVtX3RpbWluZ19lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfaGVhZGVyICpoZHIsCisJCQkJCQkJc3RydWN0IG5vdXZlYXVfcG1fdGJsX2VudHJ5ICplLCBzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmcgKnRpbWluZykgeworCXRpbWluZy0+cmVnXzAgPSAoZS0+dFJDIDw8IDI0IHwgKGUtPnRSRkMgJiAweDdmKSA8PCAxNyB8IGUtPnRSQVMgPDwgOCB8IGUtPnRSUCk7CisJdGltaW5nLT5yZWdfMSA9IChudl9yZDMyKGRldiwweDEwZjI5NCkgJiAweGZmMDAwMDAwKSB8IChlLT50VU5LXzExJjB4MGYpIDw8IDIwIHwgKGUtPnRVTktfMTkgPDwgNykgfCAoZS0+dENMICYgMHgwZik7CisJdGltaW5nLT5yZWdfMiA9IChudl9yZDMyKGRldiwweDEwZjI5OCkgJiAweGZmMDAwMGZmKSB8IGUtPnRXUiA8PCAxNiB8IGUtPnRVTktfMSA8PCA4OworCXRpbWluZy0+cmVnXzMgPSBlLT50VU5LXzIwIDw8IDkgfCBlLT50VU5LXzEzOworCXRpbWluZy0+cmVnXzQgPSAobnZfcmQzMihkZXYsMHgxMGYyYTApICYgMHhmZmYwMDBmZikgfCBlLT50VU5LXzEyIDw8IDE1OworCU5WX0RFQlVHKGRldiwgIkVudHJ5ICVkOiAyOTA6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIHRpbWluZy0+aWQsCisJCSB0aW1pbmctPnJlZ18wLCB0aW1pbmctPnJlZ18xLAorCQkgdGltaW5nLT5yZWdfMiwgdGltaW5nLT5yZWdfMyk7CisJTlZfREVCVUcoZGV2LCAiICAgICAgICAgMmEwOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkgdGltaW5nLT5yZWdfNCwgdGltaW5nLT5yZWdfNSwKKwkJIHRpbWluZy0+cmVnXzYsIHRpbWluZy0+cmVnXzcpOworfQorCisvKioKKyAqIFByb2Nlc3NlcyB0aGUgTWVtb3J5IFRpbWluZyBCSU9TIHRhYmxlLCBzdG9yZXMgZ2VuZXJhdGVkCisgKiByZWdpc3RlciB2YWx1ZXMKKyAqIEBwcmUgaW5pdCBzY3JpcHRzIHdlcmUgcnVuLCBtZW10aW1pbmcgcmVncyBhcmUgaW5pdGlhbGl6ZWQKKyAqLwogdm9pZAogbm91dmVhdV9tZW1fdGltaW5nX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQkvKiBjYXJkcyA8IE5WQzAgb25seSAqLwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfcG1fZW5naW5lICpwbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnBtOwogCXN0cnVjdCBub3V2ZWF1X3BtX21lbXRpbWluZ3MgKm1lbXRpbWluZ3MgPSAmcG0tPm1lbXRpbWluZ3M7CiAJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7CiAJc3RydWN0IGJpdF9lbnRyeSBQOwotCXU4IHRVTktfMCwgdFVOS18xLCB0VU5LXzI7Ci0JdTggdFJQOwkJLyogQnl0ZSAzICovCi0JdTggdFJBUzsJLyogQnl0ZSA1ICovCi0JdTggdFJGQzsJLyogQnl0ZSA3ICovCi0JdTggdFJDOwkJLyogQnl0ZSA5ICovCi0JdTggdFVOS18xMCwgdFVOS18xMSwgdFVOS18xMiwgdFVOS18xMywgdFVOS18xNDsKLQl1OCB0VU5LXzE4LCB0VU5LXzE5LCB0VU5LXzIwLCB0VU5LXzIxOwotCXU4IG1hZ2ljX251bWJlciA9IDA7IC8qIFllYWguLi4gc29ycnkqLwotCXU4ICptZW0gPSBOVUxMLCAqZW50cnk7Ci0JaW50IGksIHJlY29yZGxlbiwgZW50cmllczsKKwlzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfaGVhZGVyICpoZHIgPSBOVUxMOworCXVpbnQ4X3QgbWFnaWNfbnVtYmVyOworCXU4ICplbnRyeTsKKwlpbnQgaTsKIAogCWlmIChiaW9zLT50eXBlID09IE5WQklPU19CSVQpIHsKIAkJaWYgKGJpdF90YWJsZShkZXYsICdQJywgJlApKQogCQkJcmV0dXJuOwogCiAJCWlmIChQLnZlcnNpb24gPT0gMSkKLQkJCW1lbSA9IFJPTVBUUihiaW9zLCBQLmRhdGFbNF0pOworCQkJaGRyID0gKHN0cnVjdCBub3V2ZWF1X3BtX3RibF9oZWFkZXIgKikgUk9NUFRSKGJpb3MsIFAuZGF0YVs0XSk7CiAJCWVsc2UKIAkJaWYgKFAudmVyc2lvbiA9PSAyKQotCQkJbWVtID0gUk9NUFRSKGJpb3MsIFAuZGF0YVs4XSk7CisJCQloZHIgPSAoc3RydWN0IG5vdXZlYXVfcG1fdGJsX2hlYWRlciAqKSBST01QVFIoYmlvcywgUC5kYXRhWzhdKTsKIAkJZWxzZSB7CiAJCQlOVl9XQVJOKGRldiwgInVua25vd24gbWVtIGZvciBCSVQgUCAlZFxuIiwgUC52ZXJzaW9uKTsKIAkJfQpAQCAtNTQxLDE1MCArNjUwLDU2IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIW1lbSkgeworCWlmICghaGRyKSB7CiAJCU5WX0RFQlVHKGRldiwgIm1lbW9yeSB0aW1pbmcgdGFibGUgcG9pbnRlciBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChtZW1bMF0gIT0gMHgxMCkgewotCQlOVl9XQVJOKGRldiwgIm1lbW9yeSB0aW1pbmcgdGFibGUgMHglMDJ4IHVua25vd25cbiIsIG1lbVswXSk7CisJaWYgKGhkci0+dmVyc2lvbiAhPSAweDEwKSB7CisJCU5WX1dBUk4oZGV2LCAibWVtb3J5IHRpbWluZyB0YWJsZSAweCUwMnggdW5rbm93blxuIiwgaGRyLT52ZXJzaW9uKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIHZhbGlkYXRlIHJlY29yZCBsZW5ndGggKi8KLQllbnRyaWVzICAgPSBtZW1bMl07Ci0JcmVjb3JkbGVuID0gbWVtWzNdOwotCWlmIChyZWNvcmRsZW4gPCAxNSkgewotCQlOVl9FUlJPUihkZXYsICJtZW0gdGltaW5nIHRhYmxlIGxlbmd0aCB1bmtub3duOiAlZFxuIiwgbWVtWzNdKTsKKwlpZiAoaGRyLT5lbnRyeV9sZW4gPCAxNSkgeworCQlOVl9FUlJPUihkZXYsICJtZW0gdGltaW5nIHRhYmxlIGxlbmd0aCB1bmtub3duOiAlZFxuIiwgaGRyLT5lbnRyeV9sZW4pOwogCQlyZXR1cm47CiAJfQogCiAJLyogcGFyc2UgdmJpb3MgZW50cmllcyBpbnRvIGNvbW1vbiBmb3JtYXQgKi8KIAltZW10aW1pbmdzLT50aW1pbmcgPQotCQlrY2FsbG9jKGVudHJpZXMsIHNpemVvZigqbWVtdGltaW5ncy0+dGltaW5nKSwgR0ZQX0tFUk5FTCk7CisJCWtjYWxsb2MoaGRyLT5lbnRyeV9jbnQsIHNpemVvZigqbWVtdGltaW5ncy0+dGltaW5nKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW10aW1pbmdzLT50aW1pbmcpCiAJCXJldHVybjsKIAogCS8qIEdldCAic29tZSBudW1iZXIiIGZyb20gdGhlIHRpbWluZyByZWcgZm9yIE5WXzQwIGFuZCBOVl81MAotCSAqIFVzZWQgaW4gY2FsY3VsYXRpb25zIGxhdGVyICovCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNDAgJiYgZGV2X3ByaXYtPmNoaXBzZXQgPCAweDk4KSB7CisJICogVXNlZCBpbiBjYWxjdWxhdGlvbnMgbGF0ZXIuLi4gc291cmNlIHVua25vd24gKi8KKwltYWdpY19udW1iZXIgPSAwOworCWlmIChQLnZlcnNpb24gPT0gMSkgewogCQltYWdpY19udW1iZXIgPSAobnZfcmQzMihkZXYsIDB4MTAwMjI4KSAmIDB4MGYwMDAwMDApID4+IDI0OwogCX0KIAotCWVudHJ5ID0gbWVtICsgbWVtWzFdOwotCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyssIGVudHJ5ICs9IHJlY29yZGxlbikgeworCWVudHJ5ID0gKHU4KikgaGRyICsgaGRyLT5oZWFkZXJfbGVuOworCWZvciAoaSA9IDA7IGkgPCBoZHItPmVudHJ5X2NudDsgaSsrLCBlbnRyeSArPSBoZHItPmVudHJ5X2xlbikgewogCQlzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmcgKnRpbWluZyA9ICZwbS0+bWVtdGltaW5ncy50aW1pbmdbaV07CiAJCWlmIChlbnRyeVswXSA9PSAwKQogCQkJY29udGludWU7CiAKLQkJdFVOS18xOCA9IDE7Ci0JCXRVTktfMTkgPSAxOwotCQl0VU5LXzIwID0gMDsKLQkJdFVOS18yMSA9IDA7Ci0JCXN3aXRjaCAobWluKHJlY29yZGxlbiwgMjIpKSB7Ci0JCWNhc2UgMjI6Ci0JCQl0VU5LXzIxID0gZW50cnlbMjFdOwotCQljYXNlIDIxOgotCQkJdFVOS18yMCA9IGVudHJ5WzIwXTsKLQkJY2FzZSAyMDoKLQkJCXRVTktfMTkgPSBlbnRyeVsxOV07Ci0JCWNhc2UgMTk6Ci0JCQl0VU5LXzE4ID0gZW50cnlbMThdOwotCQlkZWZhdWx0OgotCQkJdFVOS18wICA9IGVudHJ5WzBdOwotCQkJdFVOS18xICA9IGVudHJ5WzFdOwotCQkJdFVOS18yICA9IGVudHJ5WzJdOwotCQkJdFJQICAgICA9IGVudHJ5WzNdOwotCQkJdFJBUyAgICA9IGVudHJ5WzVdOwotCQkJdFJGQyAgICA9IGVudHJ5WzddOwotCQkJdFJDICAgICA9IGVudHJ5WzldOwotCQkJdFVOS18xMCA9IGVudHJ5WzEwXTsKLQkJCXRVTktfMTEgPSBlbnRyeVsxMV07Ci0JCQl0VU5LXzEyID0gZW50cnlbMTJdOwotCQkJdFVOS18xMyA9IGVudHJ5WzEzXTsKLQkJCXRVTktfMTQgPSBlbnRyeVsxNF07Ci0JCQlicmVhazsKLQkJfQotCi0JCXRpbWluZy0+cmVnXzEwMDIyMCA9ICh0UkMgPDwgMjQgfCB0UkZDIDw8IDE2IHwgdFJBUyA8PCA4IHwgdFJQKTsKLQotCQkvKiBYWFg6IEkgZG9uJ3QgdHJ1c3QgdGhlIC0xJ3MgYW5kICsxJ3MuLi4gdGhleSBtdXN0IGNvbWUKLQkJICogICAgICBmcm9tIHNvbWV3aGVyZSEgKi8KLQkJdGltaW5nLT5yZWdfMTAwMjI0ID0gKHRVTktfMCArIHRVTktfMTkgKyAxICsgbWFnaWNfbnVtYmVyKSA8PCAyNCB8Ci0JCQkJICAgICAgbWF4KHRVTktfMTgsICh1OCkgMSkgPDwgMTYgfAotCQkJCSAgICAgICh0VU5LXzEgKyB0VU5LXzE5ICsgMSArIG1hZ2ljX251bWJlcikgPDwgODsKLQkJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4YTgpIHsKLQkJCXRpbWluZy0+cmVnXzEwMDIyNCB8PSAodFVOS18yIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aW1pbmctPnJlZ18xMDAyMjQgfD0gKHRVTktfMiArIDIgLSBtYWdpY19udW1iZXIpOwotCQl9Ci0KLQkJdGltaW5nLT5yZWdfMTAwMjI4ID0gKHRVTktfMTIgPDwgMTYgfCB0VU5LXzExIDw8IDggfCB0VU5LXzEwKTsKLQkJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4YTMgJiYgZGV2X3ByaXYtPmNoaXBzZXQgPCAweGFhKQotCQkJdGltaW5nLT5yZWdfMTAwMjI4IHw9ICh0VU5LXzE5IC0gMSkgPDwgMjQ7Ci0JCWVsc2UKLQkJCXRpbWluZy0+cmVnXzEwMDIyOCB8PSBtYWdpY19udW1iZXIgPDwgMjQ7Ci0KLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApIHsKLQkJCS8qIE5WNDA6IGRvbid0IGtub3cgd2hhdCB0aGUgcmVzdCBvZiB0aGUgcmVncyBhcmUuLgotCQkJICogQW5kIGRvbid0IG5lZWQgdG8ga25vdyBlaXRoZXIgKi8KLQkJCXRpbWluZy0+cmVnXzEwMDIyOCB8PSAweDIwMjAwMDAwOwotCQl9IGVsc2UgaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKLQkJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4OTggfHwKLQkJCSAgICAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg5OCAmJgotCQkJICAgICBkZXZfcHJpdi0+c3RlcHBpbmcgPD0gMHhhMSkpIHsKLQkJCQl0aW1pbmctPnJlZ18xMDAyMmMgPSAoMHgxNCArIHRVTktfMikgPDwgMjQgfAotCQkJCQkJICAgICAweDE2IDw8IDE2IHwKLQkJCQkJCSAgICAgKHRVTktfMiAtIDEpIDw8IDggfAotCQkJCQkJICAgICAodFVOS18yIC0gMSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIFhYWDogcmVnXzEwMDIyYyBmb3IgcmVjZW50aXNoIGNhcmRzICovCi0JCQkJdGltaW5nLT5yZWdfMTAwMjJjID0gdFVOS18yIC0gMTsKLQkJCX0KLQotCQkJdGltaW5nLT5yZWdfMTAwMjMwID0gKHRVTktfMjAgPDwgMjQgfCB0VU5LXzIxIDw8IDE2IHwKLQkJCQkJCSAgdFVOS18xMyA8PCA4ICB8IHRVTktfMTMpOwotCi0JCQl0aW1pbmctPnJlZ18xMDAyMzQgPSAodFJBUyA8PCAyNCB8IHRSQyk7Ci0JCQl0aW1pbmctPnJlZ18xMDAyMzQgKz0gbWF4KHRVTktfMTAsIHRVTktfMTEpIDw8IDE2OwotCi0JCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDk4IHx8Ci0JCQkgICAgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4OTggJiYKLQkJCSAgICAgZGV2X3ByaXYtPnN0ZXBwaW5nIDw9IDB4YTEpKSB7Ci0JCQkJdGltaW5nLT5yZWdfMTAwMjM0IHw9ICh0VU5LXzIgKyAyKSA8PCA4OwotCQkJfSBlbHNlIHsKLQkJCQkvKiBYWFg6ICs2PyAqLwotCQkJCXRpbWluZy0+cmVnXzEwMDIzNCB8PSAodFVOS18xOSArIDYpIDw8IDg7Ci0JCQl9Ci0KLQkJCS8qIFhYWDsgcmVnXzEwMDIzOAotCQkJICogcmVnXzEwMDIzODogMHgwMD8/Pz8/PyAqLwotCQkJdGltaW5nLT5yZWdfMTAwMjNjID0gMHgyMDI7Ci0JCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDk4IHx8Ci0JCQkgICAgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4OTggJiYKLQkJCSAgICAgZGV2X3ByaXYtPnN0ZXBwaW5nIDw9IDB4YTEpKSB7Ci0JCQkJdGltaW5nLT5yZWdfMTAwMjNjIHw9IDB4NDAwMDAwMCB8ICh0VU5LXzIgLSAxKSA8PCAxNjsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogWFhYOiByZWdfMTAwMjNjCi0JCQkJICogY3VycmVudGx5IHVua25vd24KLQkJCQkgKiAxMDAyM2Mgc2VlbiBhcyAwNnh4eHh4eCwgMGJ4eHh4eHggb3IgMGZ4eHh4eHggKi8KLQkJCX0KLQotCQkJLyogWFhYOiByZWdfMTAwMjQwPyAqLwotCQl9CiAJCXRpbWluZy0+aWQgPSBpOworCQl0aW1pbmctPldSID0gZW50cnlbMF07CisJCXRpbWluZy0+Q0wgPSBlbnRyeVsyXTsKIAotCQlOVl9ERUJVRyhkZXYsICJFbnRyeSAlZDogMjIwOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBpLAotCQkJIHRpbWluZy0+cmVnXzEwMDIyMCwgdGltaW5nLT5yZWdfMTAwMjI0LAotCQkJIHRpbWluZy0+cmVnXzEwMDIyOCwgdGltaW5nLT5yZWdfMTAwMjJjKTsKLQkJTlZfREVCVUcoZGV2LCAiICAgICAgICAgMjMwOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAotCQkJIHRpbWluZy0+cmVnXzEwMDIzMCwgdGltaW5nLT5yZWdfMTAwMjM0LAotCQkJIHRpbWluZy0+cmVnXzEwMDIzOCwgdGltaW5nLT5yZWdfMTAwMjNjKTsKLQkJTlZfREVCVUcoZGV2LCAiICAgICAgICAgMjQwOiAlMDh4XG4iLCB0aW1pbmctPnJlZ18xMDAyNDApOworCQlpZihkZXZfcHJpdi0+Y2FyZF90eXBlIDw9IE5WXzQwKSB7CisJCQludjQwX21lbV90aW1pbmdfZW50cnkoZGV2LGhkciwoc3RydWN0IG5vdXZlYXVfcG1fdGJsX2VudHJ5KikgZW50cnksbWFnaWNfbnVtYmVyLCZwbS0+bWVtdGltaW5ncy50aW1pbmdbaV0pOworCQl9IGVsc2UgaWYoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCl7CisJCQludjUwX21lbV90aW1pbmdfZW50cnkoZGV2LCZQLGhkciwoc3RydWN0IG5vdXZlYXVfcG1fdGJsX2VudHJ5KikgZW50cnksbWFnaWNfbnVtYmVyLCZwbS0+bWVtdGltaW5ncy50aW1pbmdbaV0pOworCQl9IGVsc2UgaWYoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl9DMCkgeworCQkJbnZjMF9tZW1fdGltaW5nX2VudHJ5KGRldixoZHIsKHN0cnVjdCBub3V2ZWF1X3BtX3RibF9lbnRyeSopIGVudHJ5LCZwbS0+bWVtdGltaW5ncy50aW1pbmdbaV0pOworCQl9CiAJfQogCi0JbWVtdGltaW5ncy0+bnJfdGltaW5nID0gZW50cmllczsKLQltZW10aW1pbmdzLT5zdXBwb3J0ZWQgPSAoZGV2X3ByaXYtPmNoaXBzZXQgPD0gMHg5OCk7CisJbWVtdGltaW5ncy0+bnJfdGltaW5nID0gaGRyLT5lbnRyeV9jbnQ7CisJbWVtdGltaW5ncy0+c3VwcG9ydGVkID0gUC52ZXJzaW9uID09IDE7CiB9CiAKIHZvaWQKQEAgLTY5Myw3ICs3MDgsMTAgQEAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X3BtX21lbXRpbWluZ3MgKm1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnBtLm1lbXRpbWluZ3M7CiAKLQlrZnJlZShtZW0tPnRpbWluZyk7CisJaWYobWVtLT50aW1pbmcpIHsKKwkJa2ZyZWUobWVtLT50aW1pbmcpOworCQltZW0tPnRpbWluZyA9IE5VTEw7CisJfQogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21tLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21tLmMKaW5kZXggMTY0MGRlYy4uYjI5ZmZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbW0uYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKIAogc3RhdGljIGlubGluZSB2b2lkCi1yZWdpb25fcHV0KHN0cnVjdCBub3V2ZWF1X21tICpybW0sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKmEpCityZWdpb25fcHV0KHN0cnVjdCBub3V2ZWF1X21tICptbSwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqYSkKIHsKIAlsaXN0X2RlbCgmYS0+bmxfZW50cnkpOwogCWxpc3RfZGVsKCZhLT5mbF9lbnRyeSk7CkBAIC0zNSw3ICszNSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICoKLXJlZ2lvbl9zcGxpdChzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICphLCB1MzIgc2l6ZSkKK3JlZ2lvbl9zcGxpdChzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKmEsIHUzMiBzaXplKQogewogCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKmI7CiAKQEAgLTU3LDMzICs1NywzMyBAQAogCXJldHVybiBiOwogfQogCi0jZGVmaW5lIG5vZGUocm9vdCwgZGlyKSAoKHJvb3QpLT5ubF9lbnRyeS5kaXIgPT0gJnJtbS0+bm9kZXMpID8gTlVMTCA6IFwKKyNkZWZpbmUgbm9kZShyb290LCBkaXIpICgocm9vdCktPm5sX2VudHJ5LmRpciA9PSAmbW0tPm5vZGVzKSA/IE5VTEwgOiBcCiAJbGlzdF9lbnRyeSgocm9vdCktPm5sX2VudHJ5LmRpciwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSwgbmxfZW50cnkpCiAKIHZvaWQKLW5vdXZlYXVfbW1fcHV0KHN0cnVjdCBub3V2ZWF1X21tICpybW0sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnRoaXMpCitub3V2ZWF1X21tX3B1dChzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnRoaXMpCiB7CiAJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqcHJldiA9IG5vZGUodGhpcywgcHJldik7CiAJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqbmV4dCA9IG5vZGUodGhpcywgbmV4dCk7CiAKLQlsaXN0X2FkZCgmdGhpcy0+ZmxfZW50cnksICZybW0tPmZyZWUpOworCWxpc3RfYWRkKCZ0aGlzLT5mbF9lbnRyeSwgJm1tLT5mcmVlKTsKIAl0aGlzLT50eXBlID0gMDsKIAogCWlmIChwcmV2ICYmIHByZXYtPnR5cGUgPT0gMCkgewogCQlwcmV2LT5sZW5ndGggKz0gdGhpcy0+bGVuZ3RoOwotCQlyZWdpb25fcHV0KHJtbSwgdGhpcyk7CisJCXJlZ2lvbl9wdXQobW0sIHRoaXMpOwogCQl0aGlzID0gcHJldjsKIAl9CiAKIAlpZiAobmV4dCAmJiBuZXh0LT50eXBlID09IDApIHsKIAkJbmV4dC0+b2Zmc2V0ICA9IHRoaXMtPm9mZnNldDsKIAkJbmV4dC0+bGVuZ3RoICs9IHRoaXMtPmxlbmd0aDsKLQkJcmVnaW9uX3B1dChybW0sIHRoaXMpOworCQlyZWdpb25fcHV0KG1tLCB0aGlzKTsKIAl9CiB9CiAKIGludAotbm91dmVhdV9tbV9nZXQoc3RydWN0IG5vdXZlYXVfbW0gKnJtbSwgaW50IHR5cGUsIHUzMiBzaXplLCB1MzIgc2l6ZV9uYywKK25vdXZlYXVfbW1fZ2V0KHN0cnVjdCBub3V2ZWF1X21tICptbSwgaW50IHR5cGUsIHUzMiBzaXplLCB1MzIgc2l6ZV9uYywKIAkgICAgICAgdTMyIGFsaWduLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICoqcG5vZGUpCiB7CiAJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqcHJldiwgKnRoaXMsICpuZXh0OwpAQCAtOTIsMTcgKzkyLDE3IEBACiAJdTMyIHNwbGl0b2ZmOwogCXUzMiBzLCBlOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmcm1tLT5mcmVlLCBmbF9lbnRyeSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJm1tLT5mcmVlLCBmbF9lbnRyeSkgewogCQllID0gdGhpcy0+b2Zmc2V0ICsgdGhpcy0+bGVuZ3RoOwogCQlzID0gdGhpcy0+b2Zmc2V0OwogCiAJCXByZXYgPSBub2RlKHRoaXMsIHByZXYpOwogCQlpZiAocHJldiAmJiBwcmV2LT50eXBlICE9IHR5cGUpCi0JCQlzID0gcm91bmR1cChzLCBybW0tPmJsb2NrX3NpemUpOworCQkJcyA9IHJvdW5kdXAocywgbW0tPmJsb2NrX3NpemUpOwogCiAJCW5leHQgPSBub2RlKHRoaXMsIG5leHQpOwogCQlpZiAobmV4dCAmJiBuZXh0LT50eXBlICE9IHR5cGUpCi0JCQllID0gcm91bmRkb3duKGUsIHJtbS0+YmxvY2tfc2l6ZSk7CisJCQllID0gcm91bmRkb3duKGUsIG1tLT5ibG9ja19zaXplKTsKIAogCQlzICA9IChzICsgYWxpZ25fbWFzaykgJiB+YWxpZ25fbWFzazsKIAkJZSAmPSB+YWxpZ25fbWFzazsKQEAgLTExMCwxMCArMTEwLDEwIEBACiAJCQljb250aW51ZTsKIAogCQlzcGxpdG9mZiA9IHMgLSB0aGlzLT5vZmZzZXQ7Ci0JCWlmIChzcGxpdG9mZiAmJiAhcmVnaW9uX3NwbGl0KHJtbSwgdGhpcywgc3BsaXRvZmYpKQorCQlpZiAoc3BsaXRvZmYgJiYgIXJlZ2lvbl9zcGxpdChtbSwgdGhpcywgc3BsaXRvZmYpKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJdGhpcyA9IHJlZ2lvbl9zcGxpdChybW0sIHRoaXMsIG1pbihzaXplLCBlIC0gcykpOworCQl0aGlzID0gcmVnaW9uX3NwbGl0KG1tLCB0aGlzLCBtaW4oc2l6ZSwgZSAtIHMpKTsKIAkJaWYgKCF0aGlzKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEyNyw1MiArMTI3LDQ5IEBACiB9CiAKIGludAotbm91dmVhdV9tbV9pbml0KHN0cnVjdCBub3V2ZWF1X21tICoqcHJtbSwgdTMyIG9mZnNldCwgdTMyIGxlbmd0aCwgdTMyIGJsb2NrKQorbm91dmVhdV9tbV9pbml0KHN0cnVjdCBub3V2ZWF1X21tICptbSwgdTMyIG9mZnNldCwgdTMyIGxlbmd0aCwgdTMyIGJsb2NrKQogewotCXN0cnVjdCBub3V2ZWF1X21tICpybW07Ci0Jc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqaGVhcDsKKwlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpub2RlOwogCi0JaGVhcCA9IGt6YWxsb2Moc2l6ZW9mKCpoZWFwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoZWFwKQotCQlyZXR1cm4gLUVOT01FTTsKLQloZWFwLT5vZmZzZXQgPSByb3VuZHVwKG9mZnNldCwgYmxvY2spOwotCWhlYXAtPmxlbmd0aCA9IHJvdW5kZG93bihvZmZzZXQgKyBsZW5ndGgsIGJsb2NrKSAtIGhlYXAtPm9mZnNldDsKLQotCXJtbSA9IGt6YWxsb2Moc2l6ZW9mKCpybW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJtbSkgewotCQlrZnJlZShoZWFwKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGJsb2NrKSB7CisJCW11dGV4X2luaXQoJm1tLT5tdXRleCk7CisJCUlOSVRfTElTVF9IRUFEKCZtbS0+bm9kZXMpOworCQlJTklUX0xJU1RfSEVBRCgmbW0tPmZyZWUpOworCQltbS0+YmxvY2tfc2l6ZSA9IGJsb2NrOworCQltbS0+aGVhcF9ub2RlcyA9IDA7CiAJfQotCXJtbS0+YmxvY2tfc2l6ZSA9IGJsb2NrOwotCW11dGV4X2luaXQoJnJtbS0+bXV0ZXgpOwotCUlOSVRfTElTVF9IRUFEKCZybW0tPm5vZGVzKTsKLQlJTklUX0xJU1RfSEVBRCgmcm1tLT5mcmVlKTsKLQlsaXN0X2FkZCgmaGVhcC0+bmxfZW50cnksICZybW0tPm5vZGVzKTsKLQlsaXN0X2FkZCgmaGVhcC0+ZmxfZW50cnksICZybW0tPmZyZWUpOwogCi0JKnBybW0gPSBybW07CisJbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpub2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlub2RlLT5vZmZzZXQgPSByb3VuZHVwKG9mZnNldCwgbW0tPmJsb2NrX3NpemUpOworCW5vZGUtPmxlbmd0aCA9IHJvdW5kZG93bihvZmZzZXQgKyBsZW5ndGgsIG1tLT5ibG9ja19zaXplKSAtIG5vZGUtPm9mZnNldDsKKworCWxpc3RfYWRkX3RhaWwoJm5vZGUtPm5sX2VudHJ5LCAmbW0tPm5vZGVzKTsKKwlsaXN0X2FkZF90YWlsKCZub2RlLT5mbF9lbnRyeSwgJm1tLT5mcmVlKTsKKwltbS0+aGVhcF9ub2RlcysrOwogCXJldHVybiAwOwogfQogCiBpbnQKLW5vdXZlYXVfbW1fZmluaShzdHJ1Y3Qgbm91dmVhdV9tbSAqKnBybW0pCitub3V2ZWF1X21tX2Zpbmkoc3RydWN0IG5vdXZlYXVfbW0gKm1tKQogewotCXN0cnVjdCBub3V2ZWF1X21tICpybW0gPSAqcHJtbTsKIAlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpub2RlLCAqaGVhcCA9Ci0JCWxpc3RfZmlyc3RfZW50cnkoJnJtbS0+bm9kZXMsIHN0cnVjdCBub3V2ZWF1X21tX25vZGUsIG5sX2VudHJ5KTsKKwkJbGlzdF9maXJzdF9lbnRyeSgmbW0tPm5vZGVzLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlLCBubF9lbnRyeSk7CisJaW50IG5vZGVzID0gMDsKIAotCWlmICghbGlzdF9pc19zaW5ndWxhcigmcm1tLT5ub2RlcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJub3V2ZWF1X21tIG5vdCBlbXB0eSBhdCBkZXN0cm95IHRpbWUhXG4iKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmcm1tLT5ub2RlcywgbmxfZW50cnkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiMHglMDJ4OiAweCUwOHggMHglMDh4XG4iLAotCQkJICAgICAgIG5vZGUtPnR5cGUsIG5vZGUtPm9mZnNldCwgbm9kZS0+bGVuZ3RoKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZtbS0+bm9kZXMsIG5sX2VudHJ5KSB7CisJCWlmIChub2RlcysrID09IG1tLT5oZWFwX25vZGVzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm5vdXZlYXVfbW0gaW4gdXNlIGF0IGRlc3Ryb3kgdGltZSFcbiIpOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmbW0tPm5vZGVzLCBubF9lbnRyeSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiMHglMDJ4OiAweCUwOHggMHglMDh4XG4iLAorCQkJCSAgICAgICBub2RlLT50eXBlLCBub2RlLT5vZmZzZXQsIG5vZGUtPmxlbmd0aCk7CisJCQl9CisJCQlXQVJOX09OKDEpOworCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQotCQlXQVJOX09OKDEpOwotCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWtmcmVlKGhlYXApOwotCWtmcmVlKHJtbSk7Ci0JKnBybW0gPSBOVUxMOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5oCmluZGV4IGI5YzAxNmQuLjU3YTYwMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbW0uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21tLmgKQEAgLTQyLDEwICs0MiwxMSBAQAogCXN0cnVjdCBtdXRleCBtdXRleDsKIAogCXUzMiBibG9ja19zaXplOworCWludCBoZWFwX25vZGVzOwogfTsKIAotaW50ICBub3V2ZWF1X21tX2luaXQoc3RydWN0IG5vdXZlYXVfbW0gKiosIHUzMiBvZmZzZXQsIHUzMiBsZW5ndGgsIHUzMiBibG9jayk7Ci1pbnQgIG5vdXZlYXVfbW1fZmluaShzdHJ1Y3Qgbm91dmVhdV9tbSAqKik7CitpbnQgIG5vdXZlYXVfbW1faW5pdChzdHJ1Y3Qgbm91dmVhdV9tbSAqLCB1MzIgb2Zmc2V0LCB1MzIgbGVuZ3RoLCB1MzIgYmxvY2spOworaW50ICBub3V2ZWF1X21tX2Zpbmkoc3RydWN0IG5vdXZlYXVfbW0gKik7CiBpbnQgIG5vdXZlYXVfbW1fcHJlKHN0cnVjdCBub3V2ZWF1X21tICopOwogaW50ICBub3V2ZWF1X21tX2dldChzdHJ1Y3Qgbm91dmVhdV9tbSAqLCBpbnQgdHlwZSwgdTMyIHNpemUsIHUzMiBzaXplX25jLAogCQkgICAgdTMyIGFsaWduLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICoqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jCmluZGV4IDE1OWI3YzQuLjAyMjIyYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9vYmplY3QuYwpAQCAtNjkzLDYgKzY5Myw3IEBACiBzdGF0aWMgaW50CiBudmMwX2dwdW9ial9jaGFubmVsX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgc3RydWN0IG5vdXZlYXVfdm0gKnZtKQogeworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBnZCA9IE5VTEw7CiAJc3RydWN0IG5vdXZlYXVfdm1fcGdkICp2cGdkOwpAQCAtNzIyLDYgKzcyMyw5IEBACiAJbnZfd28zMihjaGFuLT5yYW1pbiwgMHgwMjBjLCAweDAwMDAwMGZmKTsKIAogCS8qIG1hcCBkaXNwbGF5IHNlbWFwaG9yZSBidWZmZXJzIGludG8gY2hhbm5lbCdzIHZtICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfRDApCisJCXJldHVybiAwOworCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlzdHJ1Y3QgbnY1MF9kaXNwbGF5X2NydGMgKmRpc3BjID0gJm52NTBfZGlzcGxheShkZXYpLT5jcnRjW2ldOwogCkBAIC03NDYsNyArNzUwLDcgQEAKIAlpbnQgcmV0LCBpOwogCiAJTlZfREVCVUcoZGV2LCAiY2glZCB2cmFtPTB4JTA4eCB0dD0weCUwOHhcbiIsIGNoYW4tPmlkLCB2cmFtX2gsIHR0X2gpOwotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WX0MwKQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WX0MwKQogCQlyZXR1cm4gbnZjMF9ncHVvYmpfY2hhbm5lbF9pbml0KGNoYW4sIHZtKTsKIAogCS8qIEFsbG9jYXRlIGEgY2h1bmsgb2YgbWVtb3J5IGZvciBwZXItY2hhbm5lbCBvYmplY3Qgc3RvcmFnZSAqLwpAQCAtNzkzLDcgKzc5Nyw3IEBACiAJCQlyZXR1cm4gcmV0OwogCiAJCS8qIGRtYSBvYmplY3RzIGZvciBkaXNwbGF5IHN5bmMgY2hhbm5lbCBzZW1hcGhvcmUgYmxvY2tzICovCi0JCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bW9kZV9jb25maWcubnVtX2NydGM7IGkrKykgewogCQkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpzZW0gPSBOVUxMOwogCQkJc3RydWN0IG52NTBfZGlzcGxheV9jcnRjICpkaXNwYyA9CiAJCQkJJm52NTBfZGlzcGxheShkZXYpLT5jcnRjW2ldOwpAQCAtODc1LDE4ICs4NzksMTggQEAKIAogCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKSB7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTAgJiYgZGV2X3ByaXYtPmNhcmRfdHlwZSA8PSBOVl9DMCkgewogCQlzdHJ1Y3QgbnY1MF9kaXNwbGF5ICpkaXNwID0gbnY1MF9kaXNwbGF5KGRldik7CiAKLQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YzsgaSsrKSB7CiAJCQlzdHJ1Y3QgbnY1MF9kaXNwbGF5X2NydGMgKmRpc3BjID0gJmRpc3AtPmNydGNbaV07CiAJCQlub3V2ZWF1X2JvX3ZtYV9kZWwoZGlzcGMtPnNlbS5ibywgJmNoYW4tPmRpc3BjX3ZtYVtpXSk7CiAJCX0KLQotCQlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmY2hhbi0+dm0sIGNoYW4tPnZtX3BkKTsKLQkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT52bV9wZCk7CiAJfQogCisJbm91dmVhdV92bV9yZWYoTlVMTCwgJmNoYW4tPnZtLCBjaGFuLT52bV9wZCk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT52bV9wZCk7CisKIAlpZiAoZHJtX21tX2luaXRpYWxpemVkKCZjaGFuLT5yYW1pbl9oZWFwKSkKIAkJZHJtX21tX3Rha2Vkb3duKCZjaGFuLT5yYW1pbl9oZWFwKTsKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnJhbWluKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcGVyZi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wZXJmLmMKaW5kZXggZWY5ZGVjMC4uMzNkMDNmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wZXJmLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wZXJmLmMKQEAgLTEyNywxMyArMTI3LDU3IEBACiAKIAllbnRyeSArPSByYW1jZmcgKiByZWNvcmRsZW47CiAJaWYgKGVudHJ5WzFdID49IHBtLT5tZW10aW1pbmdzLm5yX3RpbWluZykgewotCQlOVl9XQVJOKGRldiwgInRpbWluZ3NldCAlZCBkb2VzIG5vdCBleGlzdFxuIiwgZW50cnlbMV0pOworCQlpZiAoZW50cnlbMV0gIT0gMHhmZikKKwkJCU5WX1dBUk4oZGV2LCAidGltaW5nc2V0ICVkIGRvZXMgbm90IGV4aXN0XG4iLCBlbnRyeVsxXSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCXJldHVybiAmcG0tPm1lbXRpbWluZ3MudGltaW5nW2VudHJ5WzFdXTsKIH0KIAorc3RhdGljIHZvaWQKK25vdXZlYXVfcGVyZl92b2x0YWdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBiaXRfZW50cnkgKlAsCisJCSAgICAgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKnBlcmZsdmwpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT52YmlvczsKKwl1OCAqdm1hcDsKKwlpbnQgaWQ7CisKKwlpZCA9IHBlcmZsdmwtPnZvbHRfbWluOworCXBlcmZsdmwtPnZvbHRfbWluID0gMDsKKworCS8qIGJvYXJkcyB1c2luZyB2b2x0YWdlIHRhYmxlIHZlcnNpb24gPDB4NDAgc3RvcmUgdGhlIHZvbHRhZ2UKKwkgKiBsZXZlbCBkaXJlY3RseSBpbiB0aGUgcGVyZmx2bCBlbnRyeSBhcyBhIG11bHRpcGxlIG9mIDEwbVYKKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmVuZ2luZS5wbS52b2x0YWdlLnZlcnNpb24gPCAweDQwKSB7CisJCXBlcmZsdmwtPnZvbHRfbWluID0gaWQgKiAxMDAwMDsKKwkJcGVyZmx2bC0+dm9sdF9tYXggPSBwZXJmbHZsLT52b2x0X21pbjsKKwkJcmV0dXJuOworCX0KKworCS8qIG9uIG5ld2VyIG9uZXMsIHRoZSBwZXJmbHZsIHN0b3JlcyBhbiBpbmRleCBpbnRvIHlldCBhbm90aGVyCisJICogdmJpb3MgdGFibGUgY29udGFpbmluZyBhIG1pbi9tYXggdm9sdGFnZSB2YWx1ZSBmb3IgdGhlIHBlcmZsdmwKKwkgKi8KKwlpZiAoUC0+dmVyc2lvbiAhPSAyIHx8IFAtPmxlbmd0aCA8IDM0KSB7CisJCU5WX0RFQlVHKGRldiwgIndoZXJlJ3Mgb3VyIHZvbHQgbWFwIHRhYmxlIHB0cj8gJWQgJWRcbiIsCisJCQkgUC0+dmVyc2lvbiwgUC0+bGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKworCXZtYXAgPSBST01QVFIoYmlvcywgUC0+ZGF0YVszMl0pOworCWlmICghdm1hcCkgeworCQlOVl9ERUJVRyhkZXYsICJ2b2x0IG1hcCB0YWJsZSBwb2ludGVyIGludmFsaWRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlkIDwgdm1hcFszXSkgeworCQl2bWFwICs9IHZtYXBbMV0gKyAodm1hcFsyXSAqIGlkKTsKKwkJcGVyZmx2bC0+dm9sdF9taW4gPSBST00zMih2bWFwWzBdKTsKKwkJcGVyZmx2bC0+dm9sdF9tYXggPSBST00zMih2bWFwWzRdKTsKKwl9Cit9CisKIHZvaWQKIG5vdXZlYXVfcGVyZl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC0xNDEsNiArMTg1LDggQEAKIAlzdHJ1Y3Qgbm91dmVhdV9wbV9lbmdpbmUgKnBtID0gJmRldl9wcml2LT5lbmdpbmUucG07CiAJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7CiAJc3RydWN0IGJpdF9lbnRyeSBQOworCXN0cnVjdCBub3V2ZWF1X3BtX21lbXRpbWluZ3MgKm1lbXRpbWluZ3MgPSAmcG0tPm1lbXRpbWluZ3M7CisJc3RydWN0IG5vdXZlYXVfcG1fdGJsX2hlYWRlciBtdF9oZHI7CiAJdTggdmVyc2lvbiwgaGVhZGVybGVuLCByZWNvcmRsZW4sIGVudHJpZXM7CiAJdTggKnBlcmYsICplbnRyeTsKIAlpbnQgdmlkLCBpOwpAQCAtMTg4LDYgKzIzNCwyMiBAQAogCX0KIAogCWVudHJ5ID0gcGVyZiArIGhlYWRlcmxlbjsKKworCS8qIEZvciB2ZXJzaW9uIDB4MTUsIGluaXRpYWxpemUgbWVtdGltaW5nIHRhYmxlICovCisJaWYodmVyc2lvbiA9PSAweDE1KSB7CisJCW1lbXRpbWluZ3MtPnRpbWluZyA9CisJCQkJa2NhbGxvYyhlbnRyaWVzLCBzaXplb2YoKm1lbXRpbWluZ3MtPnRpbWluZyksIEdGUF9LRVJORUwpOworCQlpZiAoIW1lbXRpbWluZ3MtPnRpbWluZykgeworCQkJTlZfV0FSTihkZXYsIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW10aW1pbmcgdGFibGVcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJbXRfaGRyLmVudHJ5X2NudCA9IGVudHJpZXM7CisJCW10X2hkci5lbnRyeV9sZW4gPSAxNDsKKwkJbXRfaGRyLnZlcnNpb24gPSB2ZXJzaW9uOworCQltdF9oZHIuaGVhZGVyX2xlbiA9IDQ7CisJfQorCiAJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgewogCQlzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqcGVyZmx2bCA9ICZwbS0+cGVyZmx2bFtwbS0+bnJfcGVyZmx2bF07CiAKQEAgLTIwMyw3ICsyNjUsOCBAQAogCQljYXNlIDB4MTM6CiAJCWNhc2UgMHgxNToKIAkJCXBlcmZsdmwtPmZhbnNwZWVkID0gZW50cnlbNTVdOwotCQkJcGVyZmx2bC0+dm9sdGFnZSA9IChyZWNvcmRsZW4gPiA1NikgPyBlbnRyeVs1Nl0gOiAwOworCQkJaWYgKHJlY29yZGxlbiA+IDU2KQorCQkJCXBlcmZsdmwtPnZvbHRfbWluID0gZW50cnlbNTZdOwogCQkJcGVyZmx2bC0+Y29yZSA9IFJPTTMyKGVudHJ5WzFdKSAqIDEwOwogCQkJcGVyZmx2bC0+bWVtb3J5ID0gUk9NMzIoZW50cnlbNV0pICogMjA7CiAJCQlicmVhazsKQEAgLTIxMSw5ICsyNzQsMTAgQEAKIAkJY2FzZSAweDIzOgogCQljYXNlIDB4MjQ6CiAJCQlwZXJmbHZsLT5mYW5zcGVlZCA9IGVudHJ5WzRdOwotCQkJcGVyZmx2bC0+dm9sdGFnZSA9IGVudHJ5WzVdOwotCQkJcGVyZmx2bC0+Y29yZSA9IFJPTTE2KGVudHJ5WzZdKSAqIDEwMDA7Ci0KKwkJCXBlcmZsdmwtPnZvbHRfbWluID0gZW50cnlbNV07CisJCQlwZXJmbHZsLT5zaGFkZXIgPSBST00xNihlbnRyeVs2XSkgKiAxMDAwOworCQkJcGVyZmx2bC0+Y29yZSA9IHBlcmZsdmwtPnNoYWRlcjsKKwkJCXBlcmZsdmwtPmNvcmUgKz0gKHNpZ25lZCBjaGFyKWVudHJ5WzhdICogMTAwMDsKIAkJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDQ5IHx8CiAJCQkgICAgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg0YikKIAkJCQlwZXJmbHZsLT5tZW1vcnkgPSBST00xNihlbnRyeVsxMV0pICogMTAwMDsKQEAgLTIyMyw3ICsyODcsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgMHgyNToKIAkJCXBlcmZsdmwtPmZhbnNwZWVkID0gZW50cnlbNF07Ci0JCQlwZXJmbHZsLT52b2x0YWdlID0gZW50cnlbNV07CisJCQlwZXJmbHZsLT52b2x0X21pbiA9IGVudHJ5WzVdOwogCQkJcGVyZmx2bC0+Y29yZSA9IFJPTTE2KGVudHJ5WzZdKSAqIDEwMDA7CiAJCQlwZXJmbHZsLT5zaGFkZXIgPSBST00xNihlbnRyeVsxMF0pICogMTAwMDsKIAkJCXBlcmZsdmwtPm1lbW9yeSA9IFJPTTE2KGVudHJ5WzEyXSkgKiAxMDAwOwpAQCAtMjMyLDcgKzI5Niw3IEBACiAJCQlwZXJmbHZsLT5tZW1zY3JpcHQgPSBST00xNihlbnRyeVsyXSk7CiAJCWNhc2UgMHgzNToKIAkJCXBlcmZsdmwtPmZhbnNwZWVkID0gZW50cnlbNl07Ci0JCQlwZXJmbHZsLT52b2x0YWdlID0gZW50cnlbN107CisJCQlwZXJmbHZsLT52b2x0X21pbiA9IGVudHJ5WzddOwogCQkJcGVyZmx2bC0+Y29yZSA9IFJPTTE2KGVudHJ5WzhdKSAqIDEwMDA7CiAJCQlwZXJmbHZsLT5zaGFkZXIgPSBST00xNihlbnRyeVsxMF0pICogMTAwMDsKIAkJCXBlcmZsdmwtPm1lbW9yeSA9IFJPTTE2KGVudHJ5WzEyXSkgKiAxMDAwOwpAQCAtMjQwLDMwICszMDQsMzQgQEAKIAkJCXBlcmZsdmwtPnVuazA1ID0gUk9NMTYoZW50cnlbMTZdKSAqIDEwMDA7CiAJCQlicmVhazsKIAkJY2FzZSAweDQwOgotI2RlZmluZSBzdWJlbnQobikgZW50cnlbcGVyZlsyXSArICgobikgKiBwZXJmWzNdKV0KKyNkZWZpbmUgc3ViZW50KG4pIChST00xNihlbnRyeVtwZXJmWzJdICsgKChuKSAqIHBlcmZbM10pXSkgJiAweGZmZikgKiAxMDAwCiAJCQlwZXJmbHZsLT5mYW5zcGVlZCA9IDA7IC8qWFhYKi8KLQkJCXBlcmZsdmwtPnZvbHRhZ2UgPSBlbnRyeVsyXTsKKwkJCXBlcmZsdmwtPnZvbHRfbWluID0gZW50cnlbMl07CiAJCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgewotCQkJCXBlcmZsdmwtPmNvcmUgPSBST00xNihzdWJlbnQoMCkpICYgMHhmZmY7Ci0JCQkJcGVyZmx2bC0+c2hhZGVyID0gUk9NMTYoc3ViZW50KDEpKSAmIDB4ZmZmOwotCQkJCXBlcmZsdmwtPm1lbW9yeSA9IFJPTTE2KHN1YmVudCgyKSkgJiAweGZmZjsKKwkJCQlwZXJmbHZsLT5jb3JlICAgPSBzdWJlbnQoMCk7CisJCQkJcGVyZmx2bC0+c2hhZGVyID0gc3ViZW50KDEpOworCQkJCXBlcmZsdmwtPm1lbW9yeSA9IHN1YmVudCgyKTsKKwkJCQlwZXJmbHZsLT52ZGVjICAgPSBzdWJlbnQoMyk7CisJCQkJcGVyZmx2bC0+dW5rYTAgID0gc3ViZW50KDQpOwogCQkJfSBlbHNlIHsKLQkJCQlwZXJmbHZsLT5zaGFkZXIgPSBST00xNihzdWJlbnQoMykpICYgMHhmZmY7CisJCQkJcGVyZmx2bC0+aHViMDYgID0gc3ViZW50KDApOworCQkJCXBlcmZsdmwtPmh1YjAxICA9IHN1YmVudCgxKTsKKwkJCQlwZXJmbHZsLT5jb3B5ICAgPSBzdWJlbnQoMik7CisJCQkJcGVyZmx2bC0+c2hhZGVyID0gc3ViZW50KDMpOworCQkJCXBlcmZsdmwtPnJvcCAgICA9IHN1YmVudCg0KTsKKwkJCQlwZXJmbHZsLT5tZW1vcnkgPSBzdWJlbnQoNSk7CisJCQkJcGVyZmx2bC0+dmRlYyAgID0gc3ViZW50KDYpOworCQkJCXBlcmZsdmwtPmRhZW1vbiA9IHN1YmVudCgxMCk7CisJCQkJcGVyZmx2bC0+aHViMDcgID0gc3ViZW50KDExKTsKIAkJCQlwZXJmbHZsLT5jb3JlICAgPSBwZXJmbHZsLT5zaGFkZXIgLyAyOwotCQkJCXBlcmZsdmwtPnVuazBhICA9IFJPTTE2KHN1YmVudCg0KSkgJiAweGZmZjsKLQkJCQlwZXJmbHZsLT5tZW1vcnkgPSBST00xNihzdWJlbnQoNSkpICYgMHhmZmY7CiAJCQl9Ci0KLQkJCXBlcmZsdmwtPmNvcmUgKj0gMTAwMDsKLQkJCXBlcmZsdmwtPnNoYWRlciAqPSAxMDAwOwotCQkJcGVyZmx2bC0+bWVtb3J5ICo9IDEwMDA7Ci0JCQlwZXJmbHZsLT51bmswYSAqPSAxMDAwOwogCQkJYnJlYWs7CiAJCX0KIAogCQkvKiBtYWtlIHN1cmUgdmlkIGlzIHZhbGlkICovCi0JCWlmIChwbS0+dm9sdGFnZS5zdXBwb3J0ZWQgJiYgcGVyZmx2bC0+dm9sdGFnZSkgewotCQkJdmlkID0gbm91dmVhdV92b2x0X3ZpZF9sb29rdXAoZGV2LCBwZXJmbHZsLT52b2x0YWdlKTsKKwkJbm91dmVhdV9wZXJmX3ZvbHRhZ2UoZGV2LCAmUCwgcGVyZmx2bCk7CisJCWlmIChwbS0+dm9sdGFnZS5zdXBwb3J0ZWQgJiYgcGVyZmx2bC0+dm9sdF9taW4pIHsKKwkJCXZpZCA9IG5vdXZlYXVfdm9sdF92aWRfbG9va3VwKGRldiwgcGVyZmx2bC0+dm9sdF9taW4pOwogCQkJaWYgKHZpZCA8IDApIHsKIAkJCQlOVl9ERUJVRyhkZXYsICJkcm9wIHBlcmZsdmwgJWQsIGJhZCB2aWRcbiIsIGkpOwogCQkJCWVudHJ5ICs9IHJlY29yZGxlbjsKQEAgLTI3Miw3ICszNDAsMTEgQEAKIAkJfQogCiAJCS8qIGdldCB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgdGltaW5ncyAqLwotCQlpZiAodmVyc2lvbiA+IDB4MTUpIHsKKwkJaWYgKHZlcnNpb24gPT0gMHgxNSkgeworCQkJbWVtdGltaW5ncy0+dGltaW5nW2ldLmlkID0gaTsKKwkJCW52MzBfbWVtX3RpbWluZ19lbnRyeShkZXYsJm10X2hkciwoc3RydWN0IG5vdXZlYXVfcG1fdGJsX2VudHJ5KikgJmVudHJ5WzQxXSwwLCZtZW10aW1pbmdzLT50aW1pbmdbaV0pOworCQkJcGVyZmx2bC0+dGltaW5nID0gJm1lbXRpbWluZ3MtPnRpbWluZ1tpXTsKKwkJfSBlbHNlIGlmICh2ZXJzaW9uID4gMHgxNSkgewogCQkJLyogbGFzdCAzIGFyZ3MgYXJlIGZvciA8IDB4NDAsIGlnbm9yZWQgZm9yID49IDB4NDAgKi8KIAkJCXBlcmZsdmwtPnRpbWluZyA9CiAJCQkJbm91dmVhdV9wZXJmX3RpbWluZyhkZXYsICZQLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wbS5jCmluZGV4IGRhOGQ5OTQuLmE1MzlmZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BtLmMKQEAgLTY0LDE4ICs2NCwyNiBAQAogCWlmIChwZXJmbHZsID09IHBtLT5jdXIpCiAJCXJldHVybiAwOwogCi0JaWYgKHBtLT52b2x0YWdlLnN1cHBvcnRlZCAmJiBwbS0+dm9sdGFnZV9zZXQgJiYgcGVyZmx2bC0+dm9sdGFnZSkgewotCQlyZXQgPSBwbS0+dm9sdGFnZV9zZXQoZGV2LCBwZXJmbHZsLT52b2x0YWdlKTsKKwlpZiAocG0tPnZvbHRhZ2Uuc3VwcG9ydGVkICYmIHBtLT52b2x0YWdlX3NldCAmJiBwZXJmbHZsLT52b2x0X21pbikgeworCQlyZXQgPSBwbS0+dm9sdGFnZV9zZXQoZGV2LCBwZXJmbHZsLT52b2x0X21pbik7CiAJCWlmIChyZXQpIHsKIAkJCU5WX0VSUk9SKGRldiwgInZvbHRhZ2Vfc2V0ICVkIGZhaWxlZDogJWRcbiIsCi0JCQkJIHBlcmZsdmwtPnZvbHRhZ2UsIHJldCk7CisJCQkJIHBlcmZsdmwtPnZvbHRfbWluLCByZXQpOwogCQl9CiAJfQogCi0Jbm91dmVhdV9wbV9jbG9ja19zZXQoZGV2LCBwZXJmbHZsLCBQTExfQ09SRSwgcGVyZmx2bC0+Y29yZSk7Ci0Jbm91dmVhdV9wbV9jbG9ja19zZXQoZGV2LCBwZXJmbHZsLCBQTExfU0hBREVSLCBwZXJmbHZsLT5zaGFkZXIpOwotCW5vdXZlYXVfcG1fY2xvY2tfc2V0KGRldiwgcGVyZmx2bCwgUExMX01FTU9SWSwgcGVyZmx2bC0+bWVtb3J5KTsKLQlub3V2ZWF1X3BtX2Nsb2NrX3NldChkZXYsIHBlcmZsdmwsIFBMTF9VTkswNSwgcGVyZmx2bC0+dW5rMDUpOworCWlmIChwbS0+Y2xvY2tzX3ByZSkgeworCQl2b2lkICpzdGF0ZSA9IHBtLT5jbG9ja3NfcHJlKGRldiwgcGVyZmx2bCk7CisJCWlmIChJU19FUlIoc3RhdGUpKQorCQkJcmV0dXJuIFBUUl9FUlIoc3RhdGUpOworCQlwbS0+Y2xvY2tzX3NldChkZXYsIHN0YXRlKTsKKwl9IGVsc2UKKwlpZiAocG0tPmNsb2NrX3NldCkgeworCQlub3V2ZWF1X3BtX2Nsb2NrX3NldChkZXYsIHBlcmZsdmwsIFBMTF9DT1JFLCBwZXJmbHZsLT5jb3JlKTsKKwkJbm91dmVhdV9wbV9jbG9ja19zZXQoZGV2LCBwZXJmbHZsLCBQTExfU0hBREVSLCBwZXJmbHZsLT5zaGFkZXIpOworCQlub3V2ZWF1X3BtX2Nsb2NrX3NldChkZXYsIHBlcmZsdmwsIFBMTF9NRU1PUlksIHBlcmZsdmwtPm1lbW9yeSk7CisJCW5vdXZlYXVfcG1fY2xvY2tfc2V0KGRldiwgcGVyZmx2bCwgUExMX1VOSzA1LCBwZXJmbHZsLT51bmswNSk7CisJfQogCiAJcG0tPmN1ciA9IHBlcmZsdmw7CiAJcmV0dXJuIDA7CkBAIC05Miw5ICsxMDAsNiBAQAogCWlmIChub3V2ZWF1X3BlcmZsdmxfd3IgIT0gNzc3NykKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICghcG0tPmNsb2NrX3NldCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlpZiAoIXN0cm5jbXAocHJvZmlsZSwgImJvb3QiLCA0KSkKIAkJcGVyZmx2bCA9ICZwbS0+Ym9vdDsKIAllbHNlIHsKQEAgLTEyMywzMSArMTI4LDM3IEBACiAJc3RydWN0IG5vdXZlYXVfcG1fZW5naW5lICpwbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnBtOwogCWludCByZXQ7CiAKLQlpZiAoIXBtLT5jbG9ja19nZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJbWVtc2V0KHBlcmZsdmwsIDAsIHNpemVvZigqcGVyZmx2bCkpOwogCi0JcmV0ID0gcG0tPmNsb2NrX2dldChkZXYsIFBMTF9DT1JFKTsKLQlpZiAocmV0ID4gMCkKLQkJcGVyZmx2bC0+Y29yZSA9IHJldDsKKwlpZiAocG0tPmNsb2Nrc19nZXQpIHsKKwkJcmV0ID0gcG0tPmNsb2Nrc19nZXQoZGV2LCBwZXJmbHZsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlCisJaWYgKHBtLT5jbG9ja19nZXQpIHsKKwkJcmV0ID0gcG0tPmNsb2NrX2dldChkZXYsIFBMTF9DT1JFKTsKKwkJaWYgKHJldCA+IDApCisJCQlwZXJmbHZsLT5jb3JlID0gcmV0OwogCi0JcmV0ID0gcG0tPmNsb2NrX2dldChkZXYsIFBMTF9NRU1PUlkpOwotCWlmIChyZXQgPiAwKQotCQlwZXJmbHZsLT5tZW1vcnkgPSByZXQ7CisJCXJldCA9IHBtLT5jbG9ja19nZXQoZGV2LCBQTExfTUVNT1JZKTsKKwkJaWYgKHJldCA+IDApCisJCQlwZXJmbHZsLT5tZW1vcnkgPSByZXQ7CiAKLQlyZXQgPSBwbS0+Y2xvY2tfZ2V0KGRldiwgUExMX1NIQURFUik7Ci0JaWYgKHJldCA+IDApCi0JCXBlcmZsdmwtPnNoYWRlciA9IHJldDsKKwkJcmV0ID0gcG0tPmNsb2NrX2dldChkZXYsIFBMTF9TSEFERVIpOworCQlpZiAocmV0ID4gMCkKKwkJCXBlcmZsdmwtPnNoYWRlciA9IHJldDsKIAotCXJldCA9IHBtLT5jbG9ja19nZXQoZGV2LCBQTExfVU5LMDUpOwotCWlmIChyZXQgPiAwKQotCQlwZXJmbHZsLT51bmswNSA9IHJldDsKKwkJcmV0ID0gcG0tPmNsb2NrX2dldChkZXYsIFBMTF9VTkswNSk7CisJCWlmIChyZXQgPiAwKQorCQkJcGVyZmx2bC0+dW5rMDUgPSByZXQ7CisJfQogCiAJaWYgKHBtLT52b2x0YWdlLnN1cHBvcnRlZCAmJiBwbS0+dm9sdGFnZV9nZXQpIHsKIAkJcmV0ID0gcG0tPnZvbHRhZ2VfZ2V0KGRldik7Ci0JCWlmIChyZXQgPiAwKQotCQkJcGVyZmx2bC0+dm9sdGFnZSA9IHJldDsKKwkJaWYgKHJldCA+IDApIHsKKwkJCXBlcmZsdmwtPnZvbHRfbWluID0gcmV0OworCQkJcGVyZmx2bC0+dm9sdF9tYXggPSByZXQ7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE1Niw3ICsxNjcsNyBAQAogc3RhdGljIHZvaWQKIG5vdXZlYXVfcG1fcGVyZmx2bF9pbmZvKHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICpwZXJmbHZsLCBjaGFyICpwdHIsIGludCBsZW4pCiB7Ci0JY2hhciBjWzE2XSwgc1sxNl0sIHZbMTZdLCBmWzE2XSwgdFsxNl07CisJY2hhciBjWzE2XSwgc1sxNl0sIHZbMzJdLCBmWzE2XSwgdFsxNl0sIG1bMTZdOwogCiAJY1swXSA9ICdcMCc7CiAJaWYgKHBlcmZsdmwtPmNvcmUpCkBAIC0xNjYsOSArMTc3LDE5IEBACiAJaWYgKHBlcmZsdmwtPnNoYWRlcikKIAkJc25wcmludGYocywgc2l6ZW9mKHMpLCAiIHNoYWRlciAlZE1IeiIsIHBlcmZsdmwtPnNoYWRlciAvIDEwMDApOwogCisJbVswXSA9ICdcMCc7CisJaWYgKHBlcmZsdmwtPm1lbW9yeSkKKwkJc25wcmludGYobSwgc2l6ZW9mKG0pLCAiIG1lbW9yeSAlZE1IeiIsIHBlcmZsdmwtPm1lbW9yeSAvIDEwMDApOworCiAJdlswXSA9ICdcMCc7Ci0JaWYgKHBlcmZsdmwtPnZvbHRhZ2UpCi0JCXNucHJpbnRmKHYsIHNpemVvZih2KSwgIiB2b2x0YWdlICVkbVYiLCBwZXJmbHZsLT52b2x0YWdlICogMTApOworCWlmIChwZXJmbHZsLT52b2x0X21pbiAmJiBwZXJmbHZsLT52b2x0X21pbiAhPSBwZXJmbHZsLT52b2x0X21heCkgeworCQlzbnByaW50Zih2LCBzaXplb2YodiksICIgdm9sdGFnZSAlZG1WLSVkbVYiLAorCQkJIHBlcmZsdmwtPnZvbHRfbWluIC8gMTAwMCwgcGVyZmx2bC0+dm9sdF9tYXggLyAxMDAwKTsKKwl9IGVsc2UKKwlpZiAocGVyZmx2bC0+dm9sdF9taW4pIHsKKwkJc25wcmludGYodiwgc2l6ZW9mKHYpLCAiIHZvbHRhZ2UgJWRtViIsCisJCQkgcGVyZmx2bC0+dm9sdF9taW4gLyAxMDAwKTsKKwl9CiAKIAlmWzBdID0gJ1wwJzsKIAlpZiAocGVyZmx2bC0+ZmFuc3BlZWQpCkBAIC0xNzgsOCArMTk5LDcgQEAKIAlpZiAocGVyZmx2bC0+dGltaW5nKQogCQlzbnByaW50Zih0LCBzaXplb2YodCksICIgdGltaW5nICVkIiwgcGVyZmx2bC0+dGltaW5nLT5pZCk7CiAKLQlzbnByaW50ZihwdHIsIGxlbiwgIm1lbW9yeSAlZE1IeiVzJXMlcyVzJXNcbiIsIHBlcmZsdmwtPm1lbW9yeSAvIDEwMDAsCi0JCSBjLCBzLCB2LCBmLCB0KTsKKwlzbnByaW50ZihwdHIsIGxlbiwgIiVzJXMlcyVzJXMlc1xuIiwgYywgcywgbSwgdCwgdiwgZik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0xOTAsNyArMjEwLDcgQEAKIAljaGFyICpwdHIgPSBidWY7CiAJaW50IGxlbiA9IFBBR0VfU0laRTsKIAotCXNucHJpbnRmKHB0ciwgbGVuLCAiJWQ6ICIsIHBlcmZsdmwtPmlkKTsKKwlzbnByaW50ZihwdHIsIGxlbiwgIiVkOiIsIHBlcmZsdmwtPmlkKTsKIAlwdHIgKz0gc3RybGVuKGJ1Zik7CiAJbGVuIC09IHN0cmxlbihidWYpOwogCkBAIC0yMTEsOSArMjMxLDkgQEAKIAlpZiAoIXBtLT5jdXIpCiAJCXNucHJpbnRmKHB0ciwgbGVuLCAic2V0dGluZzogYm9vdFxuIik7CiAJZWxzZSBpZiAocG0tPmN1ciA9PSAmcG0tPmJvb3QpCi0JCXNucHJpbnRmKHB0ciwgbGVuLCAic2V0dGluZzogYm9vdFxuYzogIik7CisJCXNucHJpbnRmKHB0ciwgbGVuLCAic2V0dGluZzogYm9vdFxuYzoiKTsKIAllbHNlCi0JCXNucHJpbnRmKHB0ciwgbGVuLCAic2V0dGluZzogc3RhdGljICVkXG5jOiAiLCBwbS0+Y3VyLT5pZCk7CisJCXNucHJpbnRmKHB0ciwgbGVuLCAic2V0dGluZzogc3RhdGljICVkXG5jOiIsIHBtLT5jdXItPmlkKTsKIAlwdHIgKz0gc3RybGVuKGJ1Zik7CiAJbGVuIC09IHN0cmxlbihidWYpOwogCkBAIC0yOTIsNyArMzEyLDcgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfSFdNT04KKyNpZiBkZWZpbmVkKENPTkZJR19IV01PTikgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19IV01PTl9NT0RVTEUpKQogc3RhdGljIHNzaXplX3QKIG5vdXZlYXVfaHdtb25fc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphLCBjaGFyICpidWYpCiB7CkBAIC00MDksNyArNDI5LDcgQEAKIHN0YXRpYyBpbnQKIG5vdXZlYXVfaHdtb25faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotI2lmZGVmIENPTkZJR19IV01PTgorI2lmIGRlZmluZWQoQ09ORklHX0hXTU9OKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0hXTU9OX01PRFVMRSkpCiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9wbV9lbmdpbmUgKnBtID0gJmRldl9wcml2LT5lbmdpbmUucG07CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwpAQCAtNDQyLDcgKzQ2Miw3IEBACiBzdGF0aWMgdm9pZAogbm91dmVhdV9od21vbl9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0jaWZkZWYgQ09ORklHX0hXTU9OCisjaWYgZGVmaW5lZChDT05GSUdfSFdNT04pIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfSFdNT05fTU9EVUxFKSkKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X3BtX2VuZ2luZSAqcG0gPSAmZGV2X3ByaXYtPmVuZ2luZS5wbTsKIApAQCAtNDg4LDcgKzUwOCw3IEBACiAJTlZfSU5GTyhkZXYsICIlZCBhdmFpbGFibGUgcGVyZm9ybWFuY2UgbGV2ZWwocylcbiIsIHBtLT5ucl9wZXJmbHZsKTsKIAlmb3IgKGkgPSAwOyBpIDwgcG0tPm5yX3BlcmZsdmw7IGkrKykgewogCQlub3V2ZWF1X3BtX3BlcmZsdmxfaW5mbygmcG0tPnBlcmZsdmxbaV0sIGluZm8sIHNpemVvZihpbmZvKSk7Ci0JCU5WX0lORk8oZGV2LCAiJWQ6ICVzIiwgcG0tPnBlcmZsdmxbaV0uaWQsIGluZm8pOworCQlOVl9JTkZPKGRldiwgIiVkOiVzIiwgcG0tPnBlcmZsdmxbaV0uaWQsIGluZm8pOwogCX0KIAogCS8qIGRldGVybWluZSBjdXJyZW50ICgiYm9vdCIpIHBlcmZvcm1hbmNlIGxldmVsICovCkBAIC00OTgsNyArNTE4LDcgQEAKIAkJcG0tPmN1ciA9ICZwbS0+Ym9vdDsKIAogCQlub3V2ZWF1X3BtX3BlcmZsdmxfaW5mbygmcG0tPmJvb3QsIGluZm8sIHNpemVvZihpbmZvKSk7Ci0JCU5WX0lORk8oZGV2LCAiYzogJXMiLCBpbmZvKTsKKwkJTlZfSU5GTyhkZXYsICJjOiVzIiwgaW5mbyk7CiAJfQogCiAJLyogc3dpdGNoIHBlcmZvcm1hbmNlIGxldmVscyBub3cgaWYgcmVxdWVzdGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BtLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BtLmgKaW5kZXggNGE5ODM4ZGQuLjhhYzAyY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcG0uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BtLmgKQEAgLTUyLDYgKzUyLDExIEBACiAJCQl1MzIgaWQsIGludCBraHopOwogdm9pZCBudjA0X3BtX2Nsb2NrX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICopOwogCisvKiBudjQwX3BtLmMgKi8KK2ludCBudjQwX3BtX2Nsb2Nrc19nZXQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKik7Cit2b2lkICpudjQwX3BtX2Nsb2Nrc19wcmUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKik7Cit2b2lkIG52NDBfcG1fY2xvY2tzX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICopOworCiAvKiBudjUwX3BtLmMgKi8KIGludCBudjUwX3BtX2Nsb2NrX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1MzIgaWQpOwogdm9pZCAqbnY1MF9wbV9jbG9ja19wcmUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKiwKQEAgLTU5LDEwICs2NCwxMiBAQAogdm9pZCBudjUwX3BtX2Nsb2NrX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICopOwogCiAvKiBudmEzX3BtLmMgKi8KLWludCBudmEzX3BtX2Nsb2NrX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1MzIgaWQpOwotdm9pZCAqbnZhM19wbV9jbG9ja19wcmUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKiwKLQkJCXUzMiBpZCwgaW50IGtoeik7Ci12b2lkIG52YTNfcG1fY2xvY2tfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKik7CitpbnQgbnZhM19wbV9jbG9ja3NfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICopOwordm9pZCAqbnZhM19wbV9jbG9ja3NfcHJlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICopOwordm9pZCBudmEzX3BtX2Nsb2Nrc19zZXQoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqKTsKKworLyogbnZjMF9wbS5jICovCitpbnQgbnZjMF9wbV9jbG9ja3NfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICopOwogCiAvKiBub3V2ZWF1X3RlbXAuYyAqLwogdm9pZCBub3V2ZWF1X3RlbXBfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JlZy5oCmluZGV4IGYxOGNkZmMuLjQzYTk2YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yZWcuaApAQCAtODI2LDkgKzgyNiwxMiBAQAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX1NUQVRFX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX1NUQVRFX0JMQU5LRUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX1NUQVRFX1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9CQUNLTElHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxYzA4NAotI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9CQUNLTElHSFRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9CQUNLTElHSFRfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMGZmZgorI2RlZmluZSBOVjUwX1BESVNQX1NPUl9QV01fRElWKGkpICAgICAgICAgICAgICAgICAgICAgKDB4MDA2MWMwODAgKyAoaSkgKiAweDgwMCkKKyNkZWZpbmUgTlY1MF9QRElTUF9TT1JfUFdNX0NUTChpKSAgICAgICAgICAgICAgICAgICAgICgweDAwNjFjMDg0ICsgKGkpICogMHg4MDApCisjZGVmaW5lIE5WNTBfUERJU1BfU09SX1BXTV9DVExfTkVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5WQTNfUERJU1BfU09SX1BXTV9DVExfVU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BfU09SX1BXTV9DVExfVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwN2ZmCisjZGVmaW5lIE5WQTNfUERJU1BfU09SX1BXTV9DVExfVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZmZmZmZmCiAjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkwoaSwgbCkgICAgICAgICAgICgweDAwNjFjMTBjICsgKGkpICogMHg4MDAgKyAobCkgKiAweDgwKQogI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX0VOSEFOQ0VEX0ZSQU1FX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMApAQCAtODQzLDcgKzg0Niw3IEBACiAjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfVFJBSU5JTkdfUEFUVEVSTl8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCiAjZGVmaW5lIE5WNTBfU09SX0RQX1VOSzExOChpLCBsKSAgICAgICAgICgweDAwNjFjMTE4ICsgKGkpICogMHg4MDAgKyAobCkgKiAweDgwKQogI2RlZmluZSBOVjUwX1NPUl9EUF9VTksxMjAoaSwgbCkgICAgICAgICAoMHgwMDYxYzEyMCArIChpKSAqIDB4ODAwICsgKGwpICogMHg4MCkKLSNkZWZpbmUgTlY1MF9TT1JfRFBfVU5LMTI4KGksIGwpICAgICAgICAgKDB4MDA2MWMxMjggKyAoaSkgKiAweDgwMCArIChsKSAqIDB4ODApCisjZGVmaW5lIE5WNTBfU09SX0RQX1NDRkcoaSwgbCkgICAgICAgICAgICgweDAwNjFjMTI4ICsgKGkpICogMHg4MDAgKyAobCkgKiAweDgwKQogI2RlZmluZSBOVjUwX1NPUl9EUF9VTksxMzAoaSwgbCkgICAgICAgICAoMHgwMDYxYzEzMCArIChpKSAqIDB4ODAwICsgKGwpICogMHg4MCkKIAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1VTRVIoaSkgICAgICAgICAgICAgICAgICAgICAgICAoKGkpICogMHgxMDAwICsgMHgwMDY0MDAwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYwppbmRleCAyNzA2Y2IzLi5iNzUyNThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCkBAIC0xMiw4ICsxMiw4IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAogCWRtYV9hZGRyX3QgKnBhZ2VzOwotCWJvb2wgKnR0bV9hbGxvY2VkOwogCXVuc2lnbmVkIG5yX3BhZ2VzOworCWJvb2wgdW5tYXBfcGFnZXM7CiAKIAl1NjQgb2Zmc2V0OwogCWJvb2wgYm91bmQ7CkBAIC0yNiw0MyArMjYsMjggQEAKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZSA9IChzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqKWJlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudmJlLT5kZXY7CisJaW50IGk7CiAKIAlOVl9ERUJVRyhudmJlLT5kZXYsICJudW1fcGFnZXMgPSAlbGRcbiIsIG51bV9wYWdlcyk7CiAKLQlpZiAobnZiZS0+cGFnZXMpCi0JCXJldHVybiAtRUlOVkFMOworCW52YmUtPnBhZ2VzID0gZG1hX2FkZHJzOworCW52YmUtPm5yX3BhZ2VzID0gbnVtX3BhZ2VzOworCW52YmUtPnVubWFwX3BhZ2VzID0gdHJ1ZTsKIAotCW52YmUtPnBhZ2VzID0ga21hbGxvYyhzaXplb2YoZG1hX2FkZHJfdCkgKiBudW1fcGFnZXMsIEdGUF9LRVJORUwpOwotCWlmICghbnZiZS0+cGFnZXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbnZiZS0+dHRtX2FsbG9jZWQgPSBrbWFsbG9jKHNpemVvZihib29sKSAqIG51bV9wYWdlcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFudmJlLT50dG1fYWxsb2NlZCkgewotCQlrZnJlZShudmJlLT5wYWdlcyk7Ci0JCW52YmUtPnBhZ2VzID0gTlVMTDsKLQkJcmV0dXJuIC1FTk9NRU07CisJLyogdGhpcyBjb2RlIHBhdGggaXNuJ3QgY2FsbGVkIGFuZCBpcyBpbmNvcnJlY3QgYW55d2F5cyAqLworCWlmICgwKSB7IC8qIGRtYV9hZGRyc1swXSAhPSBETUFfRVJST1JfQ09ERSkgeyAqLworCQludmJlLT51bm1hcF9wYWdlcyA9IGZhbHNlOworCQlyZXR1cm4gMDsKIAl9CiAKLQludmJlLT5ucl9wYWdlcyA9IDA7Ci0Jd2hpbGUgKG51bV9wYWdlcy0tKSB7Ci0JCS8qIHRoaXMgY29kZSBwYXRoIGlzbid0IGNhbGxlZCBhbmQgaXMgaW5jb3JyZWN0IGFueXdheXMgKi8KLQkJaWYgKDApIHsgLypkbWFfYWRkcnNbbnZiZS0+bnJfcGFnZXNdICE9IERNQV9FUlJPUl9DT0RFKSovCi0JCQludmJlLT5wYWdlc1tudmJlLT5ucl9wYWdlc10gPQotCQkJCQlkbWFfYWRkcnNbbnZiZS0+bnJfcGFnZXNdOwotCQkgCW52YmUtPnR0bV9hbGxvY2VkW252YmUtPm5yX3BhZ2VzXSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQludmJlLT5wYWdlc1tudmJlLT5ucl9wYWdlc10gPQotCQkJCXBjaV9tYXBfcGFnZShkZXYtPnBkZXYsIHBhZ2VzW252YmUtPm5yX3BhZ2VzXSwgMCwKLQkJCQkgICAgIFBBR0VfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQkJCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoZGV2LT5wZGV2LAotCQkJCQkJICBudmJlLT5wYWdlc1tudmJlLT5ucl9wYWdlc10pKSB7Ci0JCQkJYmUtPmZ1bmMtPmNsZWFyKGJlKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCW52YmUtPnR0bV9hbGxvY2VkW252YmUtPm5yX3BhZ2VzXSA9IGZhbHNlOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQludmJlLT5wYWdlc1tpXSA9IHBjaV9tYXBfcGFnZShkZXYtPnBkZXYsIHBhZ2VzW2ldLCAwLAorCQkJCQkgICAgICBQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoZGV2LT5wZGV2LCBudmJlLT5wYWdlc1tpXSkpIHsKKwkJCW52YmUtPm5yX3BhZ2VzID0gLS1pOworCQkJYmUtPmZ1bmMtPmNsZWFyKGJlKTsKKwkJCXJldHVybiAtRUZBVUxUOwogCQl9Ci0KLQkJbnZiZS0+bnJfcGFnZXMrKzsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTcyLDI1ICs1NywxNiBAQAogbm91dmVhdV9zZ2RtYV9jbGVhcihzdHJ1Y3QgdHRtX2JhY2tlbmQgKmJlKQogewogCXN0cnVjdCBub3V2ZWF1X3NnZG1hX2JlICpudmJlID0gKHN0cnVjdCBub3V2ZWF1X3NnZG1hX2JlICopYmU7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZiZS0+ZGV2OwogCi0JaWYgKG52YmUgJiYgbnZiZS0+cGFnZXMpIHsKLQkJZGV2ID0gbnZiZS0+ZGV2OwotCQlOVl9ERUJVRyhkZXYsICJcbiIpOworCWlmIChudmJlLT5ib3VuZCkKKwkJYmUtPmZ1bmMtPnVuYmluZChiZSk7CiAKLQkJaWYgKG52YmUtPmJvdW5kKQotCQkJYmUtPmZ1bmMtPnVuYmluZChiZSk7Ci0KKwlpZiAobnZiZS0+dW5tYXBfcGFnZXMpIHsKIAkJd2hpbGUgKG52YmUtPm5yX3BhZ2VzLS0pIHsKLQkJCWlmICghbnZiZS0+dHRtX2FsbG9jZWRbbnZiZS0+bnJfcGFnZXNdKQotCQkJCXBjaV91bm1hcF9wYWdlKGRldi0+cGRldiwgbnZiZS0+cGFnZXNbbnZiZS0+bnJfcGFnZXNdLAorCQkJcGNpX3VubWFwX3BhZ2UoZGV2LT5wZGV2LCBudmJlLT5wYWdlc1tudmJlLT5ucl9wYWdlc10sCiAJCQkJICAgICAgIFBBR0VfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAkJfQotCQlrZnJlZShudmJlLT5wYWdlcyk7Ci0JCWtmcmVlKG52YmUtPnR0bV9hbGxvY2VkKTsKLQkJbnZiZS0+cGFnZXMgPSBOVUxMOwotCQludmJlLT50dG1fYWxsb2NlZCA9IE5VTEw7Ci0JCW52YmUtPm5yX3BhZ2VzID0gMDsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYwppbmRleCAxMDY1NmU0Li5kODgzMWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCkBAIC0yODYsOSArMjg2LDkgQEAKIAkJZW5naW5lLT5ncGlvLmdldAkJPSBudjEwX2dwaW9fZ2V0OwogCQllbmdpbmUtPmdwaW8uc2V0CQk9IG52MTBfZ3Bpb19zZXQ7CiAJCWVuZ2luZS0+Z3Bpby5pcnFfZW5hYmxlCQk9IE5VTEw7Ci0JCWVuZ2luZS0+cG0uY2xvY2tfZ2V0CQk9IG52MDRfcG1fY2xvY2tfZ2V0OwotCQllbmdpbmUtPnBtLmNsb2NrX3ByZQkJPSBudjA0X3BtX2Nsb2NrX3ByZTsKLQkJZW5naW5lLT5wbS5jbG9ja19zZXQJCT0gbnYwNF9wbV9jbG9ja19zZXQ7CisJCWVuZ2luZS0+cG0uY2xvY2tzX2dldAkJPSBudjQwX3BtX2Nsb2Nrc19nZXQ7CisJCWVuZ2luZS0+cG0uY2xvY2tzX3ByZQkJPSBudjQwX3BtX2Nsb2Nrc19wcmU7CisJCWVuZ2luZS0+cG0uY2xvY2tzX3NldAkJPSBudjQwX3BtX2Nsb2Nrc19zZXQ7CiAJCWVuZ2luZS0+cG0udm9sdGFnZV9nZXQJCT0gbm91dmVhdV92b2x0YWdlX2dwaW9fZ2V0OwogCQllbmdpbmUtPnBtLnZvbHRhZ2Vfc2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX3NldDsKIAkJZW5naW5lLT5wbS50ZW1wX2dldAkJPSBudjQwX3RlbXBfZ2V0OwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJY2FzZSAweDUwOgogCWNhc2UgMHg4MDogLyogZ290dGEgbG92ZSBOVklESUEncyBjb25zaXN0ZW5jeS4uICovCiAJY2FzZSAweDkwOgotCWNhc2UgMHhBMDoKKwljYXNlIDB4YTA6CiAJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52NTBfaW5zdG1lbV9pbml0OwogCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjUwX2luc3RtZW1fdGFrZWRvd247CiAJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52NTBfaW5zdG1lbV9zdXNwZW5kOwpAQCAtMzU5LDkgKzM1OSw5IEBACiAJCQllbmdpbmUtPnBtLmNsb2NrX3NldAk9IG52NTBfcG1fY2xvY2tfc2V0OwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQllbmdpbmUtPnBtLmNsb2NrX2dldAk9IG52YTNfcG1fY2xvY2tfZ2V0OwotCQkJZW5naW5lLT5wbS5jbG9ja19wcmUJPSBudmEzX3BtX2Nsb2NrX3ByZTsKLQkJCWVuZ2luZS0+cG0uY2xvY2tfc2V0CT0gbnZhM19wbV9jbG9ja19zZXQ7CisJCQllbmdpbmUtPnBtLmNsb2Nrc19nZXQJPSBudmEzX3BtX2Nsb2Nrc19nZXQ7CisJCQllbmdpbmUtPnBtLmNsb2Nrc19wcmUJPSBudmEzX3BtX2Nsb2Nrc19wcmU7CisJCQllbmdpbmUtPnBtLmNsb2Nrc19zZXQJPSBudmEzX3BtX2Nsb2Nrc19zZXQ7CiAJCQlicmVhazsKIAkJfQogCQllbmdpbmUtPnBtLnZvbHRhZ2VfZ2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX2dldDsKQEAgLTM3Niw3ICszNzYsNyBAQAogCQllbmdpbmUtPnZyYW0ucHV0CQk9IG52NTBfdnJhbV9kZWw7CiAJCWVuZ2luZS0+dnJhbS5mbGFnc192YWxpZAk9IG52NTBfdnJhbV9mbGFnc192YWxpZDsKIAkJYnJlYWs7Ci0JY2FzZSAweEMwOgorCWNhc2UgMHhjMDoKIAkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnZjMF9pbnN0bWVtX2luaXQ7CiAJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52YzBfaW5zdG1lbV90YWtlZG93bjsKIAkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnZjMF9pbnN0bWVtX3N1c3BlbmQ7CkBAIC00MjIsMTIgKzQyMiw3MyBAQAogCQllbmdpbmUtPnZyYW0ucHV0CQk9IG52NTBfdnJhbV9kZWw7CiAJCWVuZ2luZS0+dnJhbS5mbGFnc192YWxpZAk9IG52YzBfdnJhbV9mbGFnc192YWxpZDsKIAkJZW5naW5lLT5wbS50ZW1wX2dldAkJPSBudjg0X3RlbXBfZ2V0OworCQllbmdpbmUtPnBtLmNsb2Nrc19nZXQJCT0gbnZjMF9wbV9jbG9ja3NfZ2V0OworCQllbmdpbmUtPnBtLnZvbHRhZ2VfZ2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX2dldDsKKwkJZW5naW5lLT5wbS52b2x0YWdlX3NldAkJPSBub3V2ZWF1X3ZvbHRhZ2VfZ3Bpb19zZXQ7CisJCWJyZWFrOworCWNhc2UgMHhkMDoKKwkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnZjMF9pbnN0bWVtX2luaXQ7CisJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52YzBfaW5zdG1lbV90YWtlZG93bjsKKwkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnZjMF9pbnN0bWVtX3N1c3BlbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnZjMF9pbnN0bWVtX3Jlc3VtZTsKKwkJZW5naW5lLT5pbnN0bWVtLmdldAkJPSBudjUwX2luc3RtZW1fZ2V0OworCQllbmdpbmUtPmluc3RtZW0ucHV0CQk9IG52NTBfaW5zdG1lbV9wdXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5tYXAJCT0gbnY1MF9pbnN0bWVtX21hcDsKKwkJZW5naW5lLT5pbnN0bWVtLnVubWFwCQk9IG52NTBfaW5zdG1lbV91bm1hcDsKKwkJZW5naW5lLT5pbnN0bWVtLmZsdXNoCQk9IG52ODRfaW5zdG1lbV9mbHVzaDsKKwkJZW5naW5lLT5tYy5pbml0CQkJPSBudjUwX21jX2luaXQ7CisJCWVuZ2luZS0+bWMudGFrZWRvd24JCT0gbnY1MF9tY190YWtlZG93bjsKKwkJZW5naW5lLT50aW1lci5pbml0CQk9IG52MDRfdGltZXJfaW5pdDsKKwkJZW5naW5lLT50aW1lci5yZWFkCQk9IG52MDRfdGltZXJfcmVhZDsKKwkJZW5naW5lLT50aW1lci50YWtlZG93bgkJPSBudjA0X3RpbWVyX3Rha2Vkb3duOworCQllbmdpbmUtPmZiLmluaXQJCQk9IG52YzBfZmJfaW5pdDsKKwkJZW5naW5lLT5mYi50YWtlZG93bgkJPSBudmMwX2ZiX3Rha2Vkb3duOworCQllbmdpbmUtPmZpZm8uY2hhbm5lbHMJCT0gMTI4OworCQllbmdpbmUtPmZpZm8uaW5pdAkJPSBudmMwX2ZpZm9faW5pdDsKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG52YzBfZmlmb190YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLmRpc2FibGUJCT0gbnZjMF9maWZvX2Rpc2FibGU7CisJCWVuZ2luZS0+Zmlmby5lbmFibGUJCT0gbnZjMF9maWZvX2VuYWJsZTsKKwkJZW5naW5lLT5maWZvLnJlYXNzaWduCQk9IG52YzBfZmlmb19yZWFzc2lnbjsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxfaWQJCT0gbnZjMF9maWZvX2NoYW5uZWxfaWQ7CisJCWVuZ2luZS0+Zmlmby5jcmVhdGVfY29udGV4dAk9IG52YzBfZmlmb19jcmVhdGVfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52YzBfZmlmb19kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5sb2FkX2NvbnRleHQJPSBudmMwX2ZpZm9fbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmZpZm8udW5sb2FkX2NvbnRleHQJPSBudmMwX2ZpZm9fdW5sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+ZGlzcGxheS5lYXJseV9pbml0CT0gbm91dmVhdV9zdHViX2luaXQ7CisJCWVuZ2luZS0+ZGlzcGxheS5sYXRlX3Rha2Vkb3duCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmRpc3BsYXkuY3JlYXRlCQk9IG52ZDBfZGlzcGxheV9jcmVhdGU7CisJCWVuZ2luZS0+ZGlzcGxheS5pbml0CQk9IG52ZDBfZGlzcGxheV9pbml0OworCQllbmdpbmUtPmRpc3BsYXkuZGVzdHJveQkJPSBudmQwX2Rpc3BsYXlfZGVzdHJveTsKKwkJZW5naW5lLT5ncGlvLmluaXQJCT0gbnY1MF9ncGlvX2luaXQ7CisJCWVuZ2luZS0+Z3Bpby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3Bpby5nZXQJCT0gbnZkMF9ncGlvX2dldDsKKwkJZW5naW5lLT5ncGlvLnNldAkJPSBudmQwX2dwaW9fc2V0OworCQllbmdpbmUtPmdwaW8uaXJxX3JlZ2lzdGVyCT0gbnY1MF9ncGlvX2lycV9yZWdpc3RlcjsKKwkJZW5naW5lLT5ncGlvLmlycV91bnJlZ2lzdGVyCT0gbnY1MF9ncGlvX2lycV91bnJlZ2lzdGVyOworCQllbmdpbmUtPmdwaW8uaXJxX2VuYWJsZQkJPSBudjUwX2dwaW9faXJxX2VuYWJsZTsKKwkJZW5naW5lLT52cmFtLmluaXQJCT0gbnZjMF92cmFtX2luaXQ7CisJCWVuZ2luZS0+dnJhbS50YWtlZG93bgkJPSBudjUwX3ZyYW1fZmluaTsKKwkJZW5naW5lLT52cmFtLmdldAkJPSBudmMwX3ZyYW1fbmV3OworCQllbmdpbmUtPnZyYW0ucHV0CQk9IG52NTBfdnJhbV9kZWw7CisJCWVuZ2luZS0+dnJhbS5mbGFnc192YWxpZAk9IG52YzBfdnJhbV9mbGFnc192YWxpZDsKKwkJZW5naW5lLT5wbS5jbG9ja3NfZ2V0CQk9IG52YzBfcG1fY2xvY2tzX2dldDsKKwkJZW5naW5lLT5wbS52b2x0YWdlX2dldAkJPSBub3V2ZWF1X3ZvbHRhZ2VfZ3Bpb19nZXQ7CisJCWVuZ2luZS0+cG0udm9sdGFnZV9zZXQJCT0gbm91dmVhdV92b2x0YWdlX2dwaW9fc2V0OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlOVl9FUlJPUihkZXYsICJOViUwMnggdW5zdXBwb3J0ZWRcbiIsIGRldl9wcml2LT5jaGlwc2V0KTsKIAkJcmV0dXJuIDE7CiAJfQogCisJLyogaGVhZGxlc3MgbW9kZSAqLworCWlmIChub3V2ZWF1X21vZGVzZXQgPT0gMikgeworCQllbmdpbmUtPmRpc3BsYXkuZWFybHlfaW5pdCA9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmRpc3BsYXkubGF0ZV90YWtlZG93biA9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5kaXNwbGF5LmNyZWF0ZSA9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmRpc3BsYXkuaW5pdCA9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmRpc3BsYXkuZGVzdHJveSA9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQ5LDIxICs1MTAsNiBAQAogCQlyZXR1cm4gVkdBX1JTUkNfTk9STUFMX0lPIHwgVkdBX1JTUkNfTk9STUFMX01FTTsKIH0KIAotc3RhdGljIGludAotbm91dmVhdV9jYXJkX2luaXRfY2hhbm5lbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vdXZlYXVfY2hhbm5lbF9hbGxvYyhkZXYsICZkZXZfcHJpdi0+Y2hhbm5lbCwgTlVMTCwKLQkJCQkgICAgTnZEbWFGQiwgTnZEbWFUVCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNoYW5uZWwtPm11dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgbm91dmVhdV9zd2l0Y2hlcm9vX3NldF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkJIGVudW0gdmdhX3N3aXRjaGVyb29fc3RhdGUgc3RhdGUpCiB7CkBAIC01MzMsNiArNTc5LDE0IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfZGlzcGxheV9lYXJseTsKIAorCS8qIHdvcmthcm91bmQgYW4gb2RkIGlzc3VlIG9uIG52YzEgYnkgZGlzYWJsaW5nIHRoZSBkZXZpY2UncworCSAqIG5vc25vb3AgY2FwYWJpbGl0eS4gIGhvcGVmdWxseSB3b24ndCBjYXVzZSBpc3N1ZXMgdW50aWwgYQorCSAqIGJldHRlciBmaXggaXMgZm91bmQgLSBhc3N1bWluZyB0aGVyZSBpcyBvbmUuLi4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHhjMSkgeworCQludl9tYXNrKGRldiwgMHgwMDA4ODA4MCwgMHgwMDAwMDgwMCwgMHgwMDAwMDAwMCk7CisJfQorCiAJbm91dmVhdV9wbV9pbml0KGRldik7CiAKIAlyZXQgPSBlbmdpbmUtPnZyYW0uaW5pdChkZXYpOwpAQCAtNjMwLDggKzY4NCwxMSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkKLQkJCW52NDBfbXBlZ19jcmVhdGUoZGV2KTsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDAgfHwKKwkJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4MzEgfHwKKwkJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4MzQgfHwKKwkJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4MzYpCisJCQludjMxX21wZWdfY3JlYXRlKGRldik7CiAJCWVsc2UKIAkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTAgJiYKIAkJICAgIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4OTggfHwgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHhhMCkpCkBAIC02NTEsNDEgKzcwOCw2OSBAQAogCQkJZ290byBvdXRfZW5naW5lOwogCX0KIAotCXJldCA9IGVuZ2luZS0+ZGlzcGxheS5jcmVhdGUoZGV2KTsKKwlyZXQgPSBub3V2ZWF1X2lycV9pbml0KGRldik7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZmlmbzsKIAotCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIG52X3R3b19oZWFkcyhkZXYpID8gMiA6IDEpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3ZibGFuazsKKwkvKiBpbml0aWFsaXNlIGdlbmVyYWwgbW9kZXNldHRpbmcgKi8KKwlkcm1fbW9kZV9jb25maWdfaW5pdChkZXYpOworCWRybV9tb2RlX2NyZWF0ZV9zY2FsaW5nX21vZGVfcHJvcGVydHkoZGV2KTsKKwlkcm1fbW9kZV9jcmVhdGVfZGl0aGVyaW5nX3Byb3BlcnR5KGRldik7CisJZGV2LT5tb2RlX2NvbmZpZy5mdW5jcyA9ICh2b2lkICopJm5vdXZlYXVfbW9kZV9jb25maWdfZnVuY3M7CisJZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7CisJZGV2LT5tb2RlX2NvbmZpZy5taW5fd2lkdGggPSAwOworCWRldi0+bW9kZV9jb25maWcubWluX2hlaWdodCA9IDA7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl8xMCkgeworCQlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDIwNDg7CisJCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDIwNDg7CisJfSBlbHNlCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDQwOTY7CisJCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDQwOTY7CisJfSBlbHNlIHsKKwkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA4MTkyOworCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA4MTkyOworCX0KIAotCXJldCA9IG5vdXZlYXVfaXJxX2luaXQoZGV2KTsKKwlyZXQgPSBlbmdpbmUtPmRpc3BsYXkuY3JlYXRlKGRldik7CiAJaWYgKHJldCkKLQkJZ290byBvdXRfdmJsYW5rOworCQlnb3RvIG91dF9pcnE7CiAKLQkvKiB3aGF0IGFib3V0IFBWSURFTy9QQ1JUQy9QUkFNREFDIGV0Yz8gKi8KKwlub3V2ZWF1X2JhY2tsaWdodF9pbml0KGRldik7CiAKIAlpZiAoZGV2X3ByaXYtPmVuZ1tOVk9CSl9FTkdJTkVfR1JdKSB7CiAJCXJldCA9IG5vdXZlYXVfZmVuY2VfaW5pdChkZXYpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXRfaXJxOworCQkJZ290byBvdXRfZGlzcDsKIAotCQlyZXQgPSBub3V2ZWF1X2NhcmRfaW5pdF9jaGFubmVsKGRldik7CisJCXJldCA9IG5vdXZlYXVfY2hhbm5lbF9hbGxvYyhkZXYsICZkZXZfcHJpdi0+Y2hhbm5lbCwgTlVMTCwKKwkJCQkJICAgIE52RG1hRkIsIE52RG1hVFQpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXRfZmVuY2U7CisKKwkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+Y2hhbm5lbC0+bXV0ZXgpOwogCX0KIAotCW5vdXZlYXVfZmJjb25faW5pdChkZXYpOwotCWRybV9rbXNfaGVscGVyX3BvbGxfaW5pdChkZXYpOworCWlmIChkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjKSB7CisJCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIGRldi0+bW9kZV9jb25maWcubnVtX2NydGMpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfY2hhbjsKKworCQlub3V2ZWF1X2ZiY29uX2luaXQoZGV2KTsKKwkJZHJtX2ttc19oZWxwZXJfcG9sbF9pbml0KGRldik7CisJfQorCiAJcmV0dXJuIDA7CiAKK291dF9jaGFuOgorCW5vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoJmRldl9wcml2LT5jaGFubmVsKTsKIG91dF9mZW5jZToKIAlub3V2ZWF1X2ZlbmNlX2ZpbmkoZGV2KTsKK291dF9kaXNwOgorCW5vdXZlYXVfYmFja2xpZ2h0X2V4aXQoZGV2KTsKKwllbmdpbmUtPmRpc3BsYXkuZGVzdHJveShkZXYpOwogb3V0X2lycToKIAlub3V2ZWF1X2lycV9maW5pKGRldik7Ci1vdXRfdmJsYW5rOgotCWRybV92YmxhbmtfY2xlYW51cChkZXYpOwotCWVuZ2luZS0+ZGlzcGxheS5kZXN0cm95KGRldik7CiBvdXRfZmlmbzoKIAlpZiAoIWRldl9wcml2LT5ub2FjY2VsKQogCQllbmdpbmUtPmZpZm8udGFrZWRvd24oZGV2KTsKQEAgLTczMiwxNSArODE3LDIwIEBACiAJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKIAlpbnQgZTsKIAotCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkZXYpOwotCW5vdXZlYXVfZmJjb25fZmluaShkZXYpOworCWlmIChkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjKSB7CisJCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkZXYpOworCQlub3V2ZWF1X2ZiY29uX2ZpbmkoZGV2KTsKKwkJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CisJfQogCiAJaWYgKGRldl9wcml2LT5jaGFubmVsKSB7CiAJCW5vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoJmRldl9wcml2LT5jaGFubmVsKTsKIAkJbm91dmVhdV9mZW5jZV9maW5pKGRldik7CiAJfQogCisJbm91dmVhdV9iYWNrbGlnaHRfZXhpdChkZXYpOwogCWVuZ2luZS0+ZGlzcGxheS5kZXN0cm95KGRldik7CisJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKIAogCWlmICghZGV2X3ByaXYtPm5vYWNjZWwpIHsKIAkJZW5naW5lLT5maWZvLnRha2Vkb3duKGRldik7CkBAIC03NzQsNyArODY0LDYgQEAKIAllbmdpbmUtPnZyYW0udGFrZWRvd24oZGV2KTsKIAogCW5vdXZlYXVfaXJxX2ZpbmkoZGV2KTsKLQlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKIAogCW5vdXZlYXVfcG1fZmluaShkZXYpOwogCW5vdXZlYXVfYmlvc190YWtlZG93bihkZXYpOwpAQCAtOTA3LDcgKzk5Niw3IEBACiBpbnQgbm91dmVhdV9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2OwotCXVpbnQzMl90IHJlZzA7CisJdWludDMyX3QgcmVnMCwgc3RyYXA7CiAJcmVzb3VyY2Vfc2l6ZV90IG1taW9fc3RhcnRfb2ZmczsKIAlpbnQgcmV0OwogCkBAIC05NTEsMTMgKzEwNDAsMTEgQEAKIAogCS8qIFRpbWUgdG8gZGV0ZXJtaW5lIHRoZSBjYXJkIGFyY2hpdGVjdHVyZSAqLwogCXJlZzAgPSBudl9yZDMyKGRldiwgTlYwM19QTUNfQk9PVF8wKTsKLQlkZXZfcHJpdi0+c3RlcHBpbmcgPSAwOyAvKiBYWFg6IGFkZCBzdGVwcGluZyBmb3IgcHJlLU5WMTA/ICovCiAKIAkvKiBXZSdyZSBkZWFsaW5nIHdpdGggPj1OVjEwICovCiAJaWYgKChyZWcwICYgMHgwZjAwMDAwMCkgPiAwKSB7CiAJCS8qIEJpdCAyNy0yMCBjb250YWluIHRoZSBhcmNoaXRlY3R1cmUgaW4gaGV4ICovCiAJCWRldl9wcml2LT5jaGlwc2V0ID0gKHJlZzAgJiAweGZmMDAwMDApID4+IDIwOwotCQlkZXZfcHJpdi0+c3RlcHBpbmcgPSAocmVnMCAmIDB4ZmYpOwogCS8qIE5WMDQgb3IgTlYwNSAqLwogCX0gZWxzZSBpZiAoKHJlZzAgJiAweGZmMDBmZmYwKSA9PSAweDIwMDA0MDAwKSB7CiAJCWlmIChyZWcwICYgMHgwMGYwMDAwMCkKQEAgLTk4Nyw2ICsxMDc0LDkgQEAKIAljYXNlIDB4YzA6CiAJCWRldl9wcml2LT5jYXJkX3R5cGUgPSBOVl9DMDsKIAkJYnJlYWs7CisJY2FzZSAweGQwOgorCQlkZXZfcHJpdi0+Y2FyZF90eXBlID0gTlZfRDA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCU5WX0lORk8oZGV2LCAiVW5zdXBwb3J0ZWQgY2hpcHNldCAweCUwOHhcbiIsIHJlZzApOwogCQlyZXQgPSAtRUlOVkFMOwpAQCAtOTk2LDYgKzEwODYsMjMgQEAKIAlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGFuIE5WJTJ4IGdlbmVyYXRpb24gY2FyZCAoMHglMDh4KVxuIiwKIAkJZGV2X3ByaXYtPmNhcmRfdHlwZSwgcmVnMCk7CiAKKwkvKiBkZXRlcm1pbmUgZnJlcXVlbmN5IG9mIHRpbWluZyBjcnlzdGFsICovCisJc3RyYXAgPSBudl9yZDMyKGRldiwgMHgxMDEwMDApOworCWlmICggZGV2X3ByaXYtPmNoaXBzZXQgPCAweDE3IHx8CisJICAgIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDIwICYmIGRldl9wcml2LT5jaGlwc2V0IDw9IDB4MjUpKQorCQlzdHJhcCAmPSAweDAwMDAwMDQwOworCWVsc2UKKwkJc3RyYXAgJj0gMHgwMDQwMDA0MDsKKworCXN3aXRjaCAoc3RyYXApIHsKKwljYXNlIDB4MDAwMDAwMDA6IGRldl9wcml2LT5jcnlzdGFsID0gMTM1MDA7IGJyZWFrOworCWNhc2UgMHgwMDAwMDA0MDogZGV2X3ByaXYtPmNyeXN0YWwgPSAxNDMxODsgYnJlYWs7CisJY2FzZSAweDAwNDAwMDAwOiBkZXZfcHJpdi0+Y3J5c3RhbCA9IDI3MDAwOyBicmVhazsKKwljYXNlIDB4MDA0MDAwNDA6IGRldl9wcml2LT5jcnlzdGFsID0gMjUwMDA7IGJyZWFrOworCX0KKworCU5WX0RFQlVHKGRldiwgImNyeXN0YWwgZnJlcTogJWRLSHpcbiIsIGRldl9wcml2LT5jcnlzdGFsKTsKKwogCS8qIERldGVybWluZSB3aGV0aGVyIHdlJ2xsIGF0dGVtcHQgYWNjZWxlcmF0aW9uIG9yIG5vdCwgc29tZQogCSAqIGNhcmRzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IGhlcmUgZHVlIHRvIHRoZW0gYmVpbmcga25vd24KIAkgKiBub24tZnVuY3Rpb25hbCwgb3IgbmV2ZXIgYmVlbiB0ZXN0ZWQgZHVlIHRvIGxhY2sgb2YgaHcuCkBAIC0xMDAzLDEyICsxMTEwLDEzIEBACiAJZGV2X3ByaXYtPm5vYWNjZWwgPSAhIW5vdXZlYXVfbm9hY2NlbDsKIAlpZiAobm91dmVhdV9ub2FjY2VsID09IC0xKSB7CiAJCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKLQkJY2FzZSAweGMxOiAvKiBrbm93biBicm9rZW4gKi8KLQkJY2FzZSAweGM4OiAvKiBuZXZlciB0ZXN0ZWQgKi8KKyNpZiAwCisJCWNhc2UgMHhYWDogLyoga25vd24gYnJva2VuICovCiAJCQlOVl9JTkZPKGRldiwgImFjY2VsZXJhdGlvbiBkaXNhYmxlZCBieSBkZWZhdWx0LCBwYXNzICIKIAkJCQkgICAgICJub2FjY2VsPTAgdG8gZm9yY2UgZW5hYmxlXG4iKTsKIAkJCWRldl9wcml2LT5ub2FjY2VsID0gdHJ1ZTsKIAkJCWJyZWFrOworI2VuZGlmCiAJCWRlZmF1bHQ6CiAJCQlkZXZfcHJpdi0+bm9hY2NlbCA9IGZhbHNlOwogCQkJYnJlYWs7CkBAIC0xMDMwLDcgKzExMzgsNyBAQAogCQkJaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCByYW1pbl9iYXIpLAogCQkJCWRldl9wcml2LT5yYW1pbl9zaXplKTsKIAkJaWYgKCFkZXZfcHJpdi0+cmFtaW4pIHsKLQkJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBQUkFNSU4gQkFSIik7CisJCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gbWFwIFBSQU1JTiBCQVJcbiIpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyX21taW87CiAJCX0KQEAgLTExMzAsNyArMTIzOCw3IEBACiAJCWdldHBhcmFtLT52YWx1ZSA9IDE7CiAJCWJyZWFrOwogCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9IQVNfUEFHRUZMSVA6Ci0JCWdldHBhcmFtLT52YWx1ZSA9IDE7CisJCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9EMDsKIAkJYnJlYWs7CiAJY2FzZSBOT1VWRUFVX0dFVFBBUkFNX0dSQVBIX1VOSVRTOgogCQkvKiBOVjQwIGFuZCBOVjUwIHZlcnNpb25zIGFyZSBxdWl0ZSBkaWZmZXJlbnQsIGJ1dCByZWdpc3RlcgpAQCAtMTE5OCw2ICsxMzA2LDIzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCisvKiBXYWl0IHVudGlsIGNvbmQoZGF0YSkgPT0gdHJ1ZSwgdXAgdW50aWwgdGltZW91dCBoYXMgaGl0ICovCitib29sCitub3V2ZWF1X3dhaXRfY2Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTY0IHRpbWVvdXQsCisJCWJvb2wgKCpjb25kKSh2b2lkICopLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGltZXJfZW5naW5lICpwdGltZXIgPSAmZGV2X3ByaXYtPmVuZ2luZS50aW1lcjsKKwl1NjQgc3RhcnQgPSBwdGltZXItPnJlYWQoZGV2KTsKKworCWRvIHsKKwkJaWYgKGNvbmQoZGF0YSkgPT0gdHJ1ZSkKKwkJCXJldHVybiB0cnVlOworCX0gd2hpbGUgKHB0aW1lci0+cmVhZChkZXYpIC0gc3RhcnQgPCB0aW1lb3V0KTsKKworCXJldHVybiBmYWxzZTsKK30KKwogLyogV2FpdHMgZm9yIFBHUkFQSCB0byBnbyBjb21wbGV0ZWx5IGlkbGUgKi8KIGJvb2wgbm91dmVhdV93YWl0X2Zvcl9pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3RlbXAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdGVtcC5jCmluZGV4IDA4MWNhN2IuLjVhNDY0NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdGVtcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdGVtcC5jCkBAIC0yMiw2ICsyMiw4IEBACiAgKiBBdXRob3JzOiBNYXJ0aW4gUGVyZXMKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5jCmluZGV4IDI0NGZkMzguLmVmMDgzMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmMKQEAgLTE3Miw5ICsxNzIsOSBAQAogCQkJdm0tPm1hcF9wZ3QodnBnZC0+b2JqLCBwZGUsIHZwZ3QtPm9iaik7CiAJCX0KIAotCQltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJnZtLT5tbS5tdXRleCk7CiAJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcGd0KTsKLQkJbXV0ZXhfbG9jaygmdm0tPm1tLT5tdXRleCk7CisJCW11dGV4X2xvY2soJnZtLT5tbS5tdXRleCk7CiAJfQogfQogCkBAIC0xOTEsMTggKzE5MSwxOCBAQAogCXBndF9zaXplICA9ICgxIDw8ICh2bS0+cGd0X2JpdHMgKyAxMikpID4+IHR5cGU7CiAJcGd0X3NpemUgKj0gODsKIAotCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyh2bS0+ZGV2LCBOVUxMLCBwZ3Rfc2l6ZSwgMHgxMDAwLAogCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZwZ3QpOwotCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCW11dGV4X2xvY2soJnZtLT5tbS5tdXRleCk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBzb21lb25lIGJlYXQgdXMgdG8gZmlsbGluZyB0aGUgUERFIHdoaWxlIHdlIGRpZG4ndCBoYXZlIHRoZSBsb2NrICovCiAJaWYgKHVubGlrZWx5KHZwZ3QtPnJlZmNvdW50W2JpZ10rKykpIHsKLQkJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnBndCk7Ci0JCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCQltdXRleF9sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTIyMywxMCArMjIzLDEwIEBACiAJdTMyIGZwZGUsIGxwZGUsIHBkZTsKIAlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmdm0tPm1tLT5tdXRleCk7Ci0JcmV0ID0gbm91dmVhdV9tbV9nZXQodm0tPm1tLCBwYWdlX3NoaWZ0LCBtc2l6ZSwgMCwgYWxpZ24sICZ2bWEtPm5vZGUpOworCW11dGV4X2xvY2soJnZtLT5tbS5tdXRleCk7CisJcmV0ID0gbm91dmVhdV9tbV9nZXQoJnZtLT5tbSwgcGFnZV9zaGlmdCwgbXNpemUsIDAsIGFsaWduLCAmdm1hLT5ub2RlKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7Ci0JCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmdm0tPm1tLm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTI0NSwxMyArMjQ1LDEzIEBACiAJCWlmIChyZXQpIHsKIAkJCWlmIChwZGUgIT0gZnBkZSkKIAkJCQlub3V2ZWF1X3ZtX3VubWFwX3BndCh2bSwgYmlnLCBmcGRlLCBwZGUgLSAxKTsKLQkJCW5vdXZlYXVfbW1fcHV0KHZtLT5tbSwgdm1hLT5ub2RlKTsKLQkJCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJCQlub3V2ZWF1X21tX3B1dCgmdm0tPm1tLCB2bWEtPm5vZGUpOworCQkJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCQkJdm1hLT5ub2RlID0gTlVMTDsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwltdXRleF91bmxvY2soJnZtLT5tbS5tdXRleCk7CiAKIAl2bWEtPnZtICAgICA9IHZtOwogCXZtYS0+b2Zmc2V0ID0gKHU2NCl2bWEtPm5vZGUtPm9mZnNldCA8PCAxMjsKQEAgLTI3MCwxMSArMjcwLDExIEBACiAJZnBkZSA9ICh2bWEtPm5vZGUtPm9mZnNldCA+PiB2bS0+cGd0X2JpdHMpOwogCWxwZGUgPSAodm1hLT5ub2RlLT5vZmZzZXQgKyB2bWEtPm5vZGUtPmxlbmd0aCAtIDEpID4+IHZtLT5wZ3RfYml0czsKIAotCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCW11dGV4X2xvY2soJnZtLT5tbS5tdXRleCk7CiAJbm91dmVhdV92bV91bm1hcF9wZ3Qodm0sIHZtYS0+bm9kZS0+dHlwZSAhPSB2bS0+c3BnX3NoaWZ0LCBmcGRlLCBscGRlKTsKLQlub3V2ZWF1X21tX3B1dCh2bS0+bW0sIHZtYS0+bm9kZSk7CisJbm91dmVhdV9tbV9wdXQoJnZtLT5tbSwgdm1hLT5ub2RlKTsKIAl2bWEtPm5vZGUgPSBOVUxMOwotCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogfQogCiBpbnQKQEAgLTMwNiw3ICszMDYsNyBAQAogCQkJYmxvY2sgPSBsZW5ndGg7CiAKIAl9IGVsc2UKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl9DMCkgeworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WX0MwKSB7CiAJCXZtLT5tYXBfcGd0ID0gbnZjMF92bV9tYXBfcGd0OwogCQl2bS0+bWFwID0gbnZjMF92bV9tYXA7CiAJCXZtLT5tYXBfc2cgPSBudmMwX3ZtX21hcF9zZzsKQEAgLTM2MCwxMSArMzYwLDExIEBACiAKIAlub3V2ZWF1X2dwdW9ial9yZWYocGdkLCAmdnBnZC0+b2JqKTsKIAotCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCW11dGV4X2xvY2soJnZtLT5tbS5tdXRleCk7CiAJZm9yIChpID0gdm0tPmZwZGU7IGkgPD0gdm0tPmxwZGU7IGkrKykKIAkJdm0tPm1hcF9wZ3QocGdkLCBpLCB2bS0+cGd0W2kgLSB2bS0+ZnBkZV0ub2JqKTsKIAlsaXN0X2FkZCgmdnBnZC0+aGVhZCwgJnZtLT5wZ2RfbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwltdXRleF91bmxvY2soJnZtLT5tbS5tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3Nyw3ICszNzcsNyBAQAogCWlmICghbXBnZCkKIAkJcmV0dXJuOwogCi0JbXV0ZXhfbG9jaygmdm0tPm1tLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmdm0tPm1tLm11dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodnBnZCwgdG1wLCAmdm0tPnBnZF9saXN0LCBoZWFkKSB7CiAJCWlmICh2cGdkLT5vYmogPT0gbXBnZCkgewogCQkJcGdkID0gdnBnZC0+b2JqOwpAQCAtMzg2LDcgKzM4Niw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmdm0tPm1tLm11dGV4KTsKIAogCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcGdkKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uaAppbmRleCA1NzljYThjLi42Y2U5OTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5oCkBAIC01MSw3ICs1MSw3IEBACiAKIHN0cnVjdCBub3V2ZWF1X3ZtIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwotCXN0cnVjdCBub3V2ZWF1X21tICptbTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSBtbTsKIAlpbnQgcmVmY291bnQ7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBnZF9saXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92b2x0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZvbHQuYwppbmRleCA3NWU4NzI3NC4uODZkMDNlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92b2x0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92b2x0LmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcG0uaCIKIAotc3RhdGljIGNvbnN0IGVudW0gZGNiX2dwaW9fdGFnIHZpZHRhZ1tdID0geyAweDA0LCAweDA1LCAweDA2LCAweDFhIH07CitzdGF0aWMgY29uc3QgZW51bSBkY2JfZ3Bpb190YWcgdmlkdGFnW10gPSB7IDB4MDQsIDB4MDUsIDB4MDYsIDB4MWEsIDB4NzMgfTsKIHN0YXRpYyBpbnQgbnJfdmlkdGFnID0gc2l6ZW9mKHZpZHRhZykgLyBzaXplb2YodmlkdGFnWzBdKTsKIAogaW50CkBAIC0xNzAsNiArMTcwLDEzIEBACiAJCSAqLwogCQl2aWRzaGlmdCAgPSAyOwogCQlicmVhazsKKwljYXNlIDB4NDA6CisJCWhlYWRlcmxlbiA9IHZvbHRbMV07CisJCXJlY29yZGxlbiA9IHZvbHRbMl07CisJCWVudHJpZXMgICA9IHZvbHRbM107IC8qIG5vdCBhIGNsdWUgd2hhdCB0aGUgZW50cmllcyBhcmUgZm9yLi4gKi8KKwkJdmlkbWFzayAgID0gdm9sdFsxMV07IC8qIGd1ZXNzLi4gKi8KKwkJdmlkc2hpZnQgID0gMDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJTlZfV0FSTihkZXYsICJ2b2x0YWdlIHRhYmxlIDB4JTAyeCB1bmtub3duXG4iLCB2b2x0WzBdKTsKIAkJcmV0dXJuOwpAQCAtMTk3LDE2ICsyMDQsMzcgQEAKIAl9CiAKIAkvKiBwYXJzZSB2YmlvcyBlbnRyaWVzIGludG8gY29tbW9uIGZvcm1hdCAqLwotCXZvbHRhZ2UtPmxldmVsID0ga2NhbGxvYyhlbnRyaWVzLCBzaXplb2YoKnZvbHRhZ2UtPmxldmVsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2b2x0YWdlLT5sZXZlbCkKLQkJcmV0dXJuOworCXZvbHRhZ2UtPnZlcnNpb24gPSB2b2x0WzBdOworCWlmICh2b2x0YWdlLT52ZXJzaW9uIDwgMHg0MCkgeworCQl2b2x0YWdlLT5ucl9sZXZlbCA9IGVudHJpZXM7CisJCXZvbHRhZ2UtPmxldmVsID0KKwkJCWtjYWxsb2MoZW50cmllcywgc2l6ZW9mKCp2b2x0YWdlLT5sZXZlbCksIEdGUF9LRVJORUwpOworCQlpZiAoIXZvbHRhZ2UtPmxldmVsKQorCQkJcmV0dXJuOwogCi0JZW50cnkgPSB2b2x0ICsgaGVhZGVybGVuOwotCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyssIGVudHJ5ICs9IHJlY29yZGxlbikgewotCQl2b2x0YWdlLT5sZXZlbFtpXS52b2x0YWdlID0gZW50cnlbMF07Ci0JCXZvbHRhZ2UtPmxldmVsW2ldLnZpZCAgICAgPSBlbnRyeVsxXSA+PiB2aWRzaGlmdDsKKwkJZW50cnkgPSB2b2x0ICsgaGVhZGVybGVuOworCQlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrLCBlbnRyeSArPSByZWNvcmRsZW4pIHsKKwkJCXZvbHRhZ2UtPmxldmVsW2ldLnZvbHRhZ2UgPSBlbnRyeVswXSAqIDEwMDAwOworCQkJdm9sdGFnZS0+bGV2ZWxbaV0udmlkICAgICA9IGVudHJ5WzFdID4+IHZpZHNoaWZ0OworCQl9CisJfSBlbHNlIHsKKwkJdTMyIHZvbHRfdXYgPSBST00zMih2b2x0WzRdKTsKKwkJczE2IHN0ZXBfdXYgPSBST00xNih2b2x0WzhdKTsKKwkJdTggdmlkOworCisJCXZvbHRhZ2UtPm5yX2xldmVsID0gdm9sdGFnZS0+dmlkX21hc2sgKyAxOworCQl2b2x0YWdlLT5sZXZlbCA9IGtjYWxsb2Modm9sdGFnZS0+bnJfbGV2ZWwsCisJCQkJCSBzaXplb2YoKnZvbHRhZ2UtPmxldmVsKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdm9sdGFnZS0+bGV2ZWwpCisJCQlyZXR1cm47CisKKwkJZm9yICh2aWQgPSAwOyB2aWQgPD0gdm9sdGFnZS0+dmlkX21hc2s7IHZpZCsrKSB7CisJCQl2b2x0YWdlLT5sZXZlbFt2aWRdLnZvbHRhZ2UgPSB2b2x0X3V2OworCQkJdm9sdGFnZS0+bGV2ZWxbdmlkXS52aWQgPSB2aWQ7CisJCQl2b2x0X3V2ICs9IHN0ZXBfdXY7CisJCX0KIAl9Ci0Jdm9sdGFnZS0+bnJfbGV2ZWwgID0gZW50cmllczsKKwogCXZvbHRhZ2UtPnN1cHBvcnRlZCA9IHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kaXNwbGF5LmMKaW5kZXggMTcxNWUxNC4uNmJkODUxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kaXNwbGF5LmMKQEAgLTEyNiwyNyArMTI2LDYgQEAKIAogCW5vdXZlYXVfaHdfc2F2ZV92Z2FfZm9udHMoZGV2LCAxKTsKIAotCWRybV9tb2RlX2NvbmZpZ19pbml0KGRldik7Ci0JZHJtX21vZGVfY3JlYXRlX3NjYWxpbmdfbW9kZV9wcm9wZXJ0eShkZXYpOwotCWRybV9tb2RlX2NyZWF0ZV9kaXRoZXJpbmdfcHJvcGVydHkoZGV2KTsKLQotCWRldi0+bW9kZV9jb25maWcuZnVuY3MgPSAodm9pZCAqKSZub3V2ZWF1X21vZGVfY29uZmlnX2Z1bmNzOwotCi0JZGV2LT5tb2RlX2NvbmZpZy5taW5fd2lkdGggPSAwOwotCWRldi0+bW9kZV9jb25maWcubWluX2hlaWdodCA9IDA7Ci0Jc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7Ci0JY2FzZSBOVl8wNDoKLQkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSAyMDQ4OwotCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSAyMDQ4OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDQwOTY7Ci0JCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDQwOTY7Ci0JCWJyZWFrOwotCX0KLQotCWRldi0+bW9kZV9jb25maWcuZmJfYmFzZSA9IGRldl9wcml2LT5mYl9waHlzOwotCiAJbnYwNF9jcnRjX2NyZWF0ZShkZXYsIDApOwogCWlmIChudl90d29faGVhZHMoZGV2KSkKIAkJbnYwNF9jcnRjX2NyZWF0ZShkZXYsIDEpOwpAQCAtMjM1LDggKzIxNCw2IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpCiAJCWNydGMtPmZ1bmNzLT5yZXN0b3JlKGNydGMpOwogCi0JZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKLQogCW5vdXZlYXVfaHdfc2F2ZV92Z2FfZm9udHMoZGV2LCAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9wbS5jCmluZGV4IGViMWM3MGQuLjlhZTkyYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3BtLmMKQEAgLTY4LDYgKzY4LDcgQEAKIG52MDRfcG1fY2xvY2tfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKnByZV9zdGF0ZSkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3RpbWVyX2VuZ2luZSAqcHRpbWVyID0gJmRldl9wcml2LT5lbmdpbmUudGltZXI7CiAJc3RydWN0IG52MDRfcG1fc3RhdGUgKnN0YXRlID0gcHJlX3N0YXRlOwogCXUzMiByZWcgPSBzdGF0ZS0+cGxsLnJlZzsKIApAQCAtODUsNiArODYsOSBAQAogCQludl9tYXNrKGRldiwgMHgxMDAyYzAsIDAsIDEgPDwgOCk7CiAJfQogCisJaWYgKHJlZyA9PSBOVl9QUkFNREFDX05WUExMX0NPRUZGKQorCQlwdGltZXItPmluaXQoZGV2KTsKKwogCWtmcmVlKHN0YXRlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF90aW1lci5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF90aW1lci5jCmluZGV4IDFkMDlkZGQuLjI2MzMwMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfdGltZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3RpbWVyLmMKQEAgLTYsNDMgKzYsNzUgQEAKIGludAogbnYwNF90aW1lcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgbSwgbiwgZDsKKwogCW52X3dyMzIoZGV2LCBOVjA0X1BUSU1FUl9JTlRSX0VOXzAsIDB4MDAwMDAwMDApOwogCW52X3dyMzIoZGV2LCBOVjA0X1BUSU1FUl9JTlRSXzAsIDB4RkZGRkZGRkYpOwogCi0JLyogSnVzdCB1c2UgdGhlIHByZS1leGlzdGluZyB2YWx1ZXMgd2hlbiBwb3NzaWJsZSBmb3Igbm93OyB0aGVzZSByZWdzCi0JICogYXJlIG5vdCB3cml0dGVuIGluIG52IChkcml2ZXIgd3JpdGVyIG1pc3NlZCBhIC80IG9uIHRoZSBhZGRyZXNzKSwgYW5kCi0JICogd3JpdGluZyA4IGFuZCAzIHRvIHRoZSBjb3JyZWN0IHJlZ3MgYnJlYWtzIHRoZSB0aW1pbmdzIG9uIHRoZSBMVkRTCi0JICogaGFyZHdhcmUgc2VxdWVuY2luZyBtaWNyb2NvZGUuCi0JICogQSBjb3JyZWN0IHNvbHV0aW9uIChpbnZvbHZpbmcgY2FsY3VsYXRpb25zIHdpdGggdGhlIEdQVSBQTEwpIGNhbgotCSAqIGJlIGRvbmUgd2hlbiBrZXJuZWwgbW9kZXNldHRpbmcgbGFuZHMKLQkgKi8KLQlpZiAoIW52X3JkMzIoZGV2LCBOVjA0X1BUSU1FUl9OVU1FUkFUT1IpIHx8Ci0JCQkJIW52X3JkMzIoZGV2LCBOVjA0X1BUSU1FUl9ERU5PTUlOQVRPUikpIHsKLQkJbnZfd3IzMihkZXYsIE5WMDRfUFRJTUVSX05VTUVSQVRPUiwgMHgwMDAwMDAwOCk7Ci0JCW52X3dyMzIoZGV2LCBOVjA0X1BUSU1FUl9ERU5PTUlOQVRPUiwgMHgwMDAwMDAwMyk7CisJLyogYWltIGZvciAzMS4yNU1Ieiwgd2hpY2ggZ2l2ZXMgdXMgbmFub3NlY29uZCB0aW1lc3RhbXBzICovCisJZCA9IDEwMDAwMDAgLyAzMjsKKworCS8qIGRldGVybWluZSBiYXNlIGNsb2NrIGZvciB0aW1lciBzb3VyY2UgKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDQwKSB7CisJCW4gPSBkZXZfcHJpdi0+ZW5naW5lLnBtLmNsb2NrX2dldChkZXYsIFBMTF9DT1JFKTsKKwl9IGVsc2UKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg0MCkgeworCQkvKlhYWDogZmlndXJlIHRoaXMgb3V0ICovCisJCW4gPSAwOworCX0gZWxzZSB7CisJCW4gPSBkZXZfcHJpdi0+Y3J5c3RhbDsKKwkJbSA9IDE7CisJCXdoaWxlIChuIDwgKGQgKiAyKSkgeworCQkJbiArPSAobiAvIG0pOworCQkJbSsrOworCQl9CisKKwkJbnZfd3IzMihkZXYsIDB4MDA5MjIwLCBtIC0gMSk7CiAJfQogCisJaWYgKCFuKSB7CisJCU5WX1dBUk4oZGV2LCAiUFRJTUVSOiB1bmtub3duIGlucHV0IGNsb2NrIGZyZXFcbiIpOworCQlpZiAoIW52X3JkMzIoZGV2LCBOVjA0X1BUSU1FUl9OVU1FUkFUT1IpIHx8CisJCSAgICAhbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX0RFTk9NSU5BVE9SKSkgeworCQkJbnZfd3IzMihkZXYsIE5WMDRfUFRJTUVSX05VTUVSQVRPUiwgMSk7CisJCQludl93cjMyKGRldiwgTlYwNF9QVElNRVJfREVOT01JTkFUT1IsIDEpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIHJlZHVjZSByYXRpbyB0byBhY2NlcHRhYmxlIHZhbHVlcyAqLworCXdoaWxlICgoKG4gJSA1KSA9PSAwKSAmJiAoKGQgJSA1KSA9PSAwKSkgeworCQluIC89IDU7CisJCWQgLz0gNTsKKwl9CisKKwl3aGlsZSAoKChuICUgMikgPT0gMCkgJiYgKChkICUgMikgPT0gMCkpIHsKKwkJbiAvPSAyOworCQlkIC89IDI7CisJfQorCisJd2hpbGUgKG4gPiAweGZmZmYgfHwgZCA+IDB4ZmZmZikgeworCQluID4+PSAxOworCQlkID4+PSAxOworCX0KKworCW52X3dyMzIoZGV2LCBOVjA0X1BUSU1FUl9OVU1FUkFUT1IsIG4pOworCW52X3dyMzIoZGV2LCBOVjA0X1BUSU1FUl9ERU5PTUlOQVRPUiwgZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXVpbnQ2NF90Cit1NjQKIG52MDRfdGltZXJfcmVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXVpbnQzMl90IGxvdzsKLQkvKiBGcm9tIGttbWlvIGR1bXBzIG9uIG52MjggdGhpcyBsb29rcyBsaWtlIGhvdyB0aGUgYmxvYiBkb2VzIHRoaXMuCi0JICogSXQgcmVhZHMgdGhlIGhpZ2ggZHdvcmQgdHdpY2UsIGJlZm9yZSBhbmQgYWZ0ZXIuCi0JICogVGhlIG9ubHkgZXhwbGFuYXRpb24gc2VlbXMgdG8gYmUgdGhhdCB0aGUgNjQtYml0IHRpbWVyIGNvdW50ZXIKLQkgKiBhZHZhbmNlcyBiZXR3ZWVuIGhpZ2ggYW5kIGxvdyBkd29yZCByZWFkcyBhbmQgbWF5IGNvcnJ1cHQgdGhlCi0JICogcmVzdWx0LiBOb3QgY29uZmlybWVkLgotCSAqLwotCXVpbnQzMl90IGhpZ2gyID0gbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX1RJTUVfMSk7Ci0JdWludDMyX3QgaGlnaDE7CisJdTMyIGhpLCBsbzsKKwogCWRvIHsKLQkJaGlnaDEgPSBoaWdoMjsKLQkJbG93ID0gbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX1RJTUVfMCk7Ci0JCWhpZ2gyID0gbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX1RJTUVfMSk7Ci0JfSB3aGlsZSAoaGlnaDEgIT0gaGlnaDIpOwotCXJldHVybiAoKCh1aW50NjRfdCloaWdoMikgPDwgMzIpIHwgKHVpbnQ2NF90KWxvdzsKKwkJaGkgPSBudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfVElNRV8xKTsKKwkJbG8gPSBudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfVElNRV8wKTsKKwl9IHdoaWxlIChoaSAhPSBudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfVElNRV8xKSk7CisKKwlyZXR1cm4gKCh1NjQpaGkgPDwgMzIgfCBsbyk7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MzFfbXBlZy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYzMV9tcGVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwNmEwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MzFfbXBlZy5jCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCisKK3N0cnVjdCBudjMxX21wZWdfZW5naW5lIHsKKwlzdHJ1Y3Qgbm91dmVhdV9leGVjX2VuZ2luZSBiYXNlOworCWF0b21pY190IHJlZmNvdW50OworfTsKKworCitzdGF0aWMgaW50CitudjMxX21wZWdfY29udGV4dF9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGVuZ2luZSkKK3sKKwlzdHJ1Y3QgbnYzMV9tcGVnX2VuZ2luZSAqcG1wZWcgPSBudl9lbmdpbmUoY2hhbi0+ZGV2LCBlbmdpbmUpOworCisJaWYgKCFhdG9taWNfYWRkX3VubGVzcygmcG1wZWctPnJlZmNvdW50LCAxLCAxKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWNoYW4tPmVuZ2N0eFtlbmdpbmVdID0gKHZvaWQgKikweGRlYWRjYWZlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbnYzMV9tcGVnX2NvbnRleHRfZGVsKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBlbmdpbmUpCit7CisJc3RydWN0IG52MzFfbXBlZ19lbmdpbmUgKnBtcGVnID0gbnZfZW5naW5lKGNoYW4tPmRldiwgZW5naW5lKTsKKwlhdG9taWNfZGVjKCZwbXBlZy0+cmVmY291bnQpOworCWNoYW4tPmVuZ2N0eFtlbmdpbmVdID0gTlVMTDsKK30KKworc3RhdGljIGludAorbnY0MF9tcGVnX2NvbnRleHRfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBlbmdpbmUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAyNjQgKiA0LCAxNiwgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0ZSRUUsICZjdHgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludl93bzMyKGN0eCwgMHg3OCwgMHgwMjAwMWVjMSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwludl9tYXNrKGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCWlmICgobnZfcmQzMihkZXYsIDB4MDAzMjA0KSAmIDB4MWYpID09IGNoYW4tPmlkKQorCQludl93cjMyKGRldiwgMHgwMDMzMGMsIGN0eC0+cGluc3QgPj4gNCk7CisJbnZfd28zMihjaGFuLT5yYW1mYywgMHg1NCwgY3R4LT5waW5zdCA+PiA0KTsKKwludl9tYXNrKGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisKKwljaGFuLT5lbmdjdHhbZW5naW5lXSA9IGN0eDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252NDBfbXBlZ19jb250ZXh0X2RlbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZW5naW5lKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHggPSBjaGFuLT5lbmdjdHhbZW5naW5lXTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGluc3QgPSAweDgwMDAwMDAwIHwgKGN0eC0+cGluc3QgPj4gNCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwludl9tYXNrKGRldiwgMHgwMGIzMmMsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCWlmIChudl9yZDMyKGRldiwgMHgwMGIzMTgpID09IGluc3QpCisJCW52X21hc2soZGV2LCAweDAwYjMxOCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7CisJbnZfbWFzayhkZXYsIDB4MDBiMzJjLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjdHgpOworCWNoYW4tPmVuZ2N0eFtlbmdpbmVdID0gTlVMTDsKK30KKworc3RhdGljIGludAorbnYzMV9tcGVnX29iamVjdF9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGVuZ2luZSwKKwkJICAgICAgdTMyIGhhbmRsZSwgdTE2IGNsYXNzKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmogPSBOVUxMOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCAyMCwgMTYsIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8CisJCQkJIE5WT0JKX0ZMQUdfWkVST19GUkVFLCAmb2JqKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW9iai0+ZW5naW5lID0gMjsKKwlvYmotPmNsYXNzICA9IGNsYXNzOworCisJbnZfd28zMihvYmosIDB4MDAsIGNsYXNzKTsKKworCXJldCA9IG5vdXZlYXVfcmFtaHRfaW5zZXJ0KGNoYW4sIGhhbmRsZSwgb2JqKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJm9iaik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbnYzMV9tcGVnX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjMxX21wZWdfZW5naW5lICpwbXBlZyA9IG52X2VuZ2luZShkZXYsIGVuZ2luZSk7CisJaW50IGk7CisKKwkvKiBWUEUgaW5pdCAqLworCW52X21hc2soZGV2LCAweDAwMDIwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCk7CisJbnZfbWFzayhkZXYsIDB4MDAwMjAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDAyKTsKKwludl93cjMyKGRldiwgMHgwMGIwZTAsIDB4MDAwMDAwMjApOyAvKiBudmlkaWE6IHJkIDB4MDEsIHdyIDB4MjAgKi8KKwludl93cjMyKGRldiwgMHgwMGIwZTgsIDB4MDAwMDAwMjApOyAvKiBudmlkaWE6IHJkIDB4MDEsIHdyIDB4MjAgKi8KKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZiLm51bV90aWxlczsgaSsrKQorCQlwbXBlZy0+YmFzZS5zZXRfdGlsZV9yZWdpb24oZGV2LCBpKTsKKworCS8qIFBNUEVHIGluaXQgKi8KKwludl93cjMyKGRldiwgMHgwMGIzMmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwYjMxNCwgMHgwMDAwMDEwMCk7CisJbnZfd3IzMihkZXYsIDB4MDBiMjIwLCBudjQ0X2dyYXBoX2NsYXNzKGRldikgPyAweDAwMDAwMDQ0IDogMHgwMDAwMDAzMSk7CisJbnZfd3IzMihkZXYsIDB4MDBiMzAwLCAweDAyMDAxZWMxKTsKKwludl9tYXNrKGRldiwgMHgwMGIzMmMsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpOworCisJbnZfd3IzMihkZXYsIDB4MDBiMTAwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHgwMGIxNDAsIDB4ZmZmZmZmZmYpOworCisJaWYgKCFudl93YWl0KGRldiwgMHgwMGIyMDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgIlBNUEVHIGluaXQ6IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MDBiMjAwKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252MzFfbXBlZ19maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUsIGJvb2wgc3VzcGVuZCkKK3sKKwkvKlhYWDogY29udGV4dCBzYXZlPyAqLworCW52X21hc2soZGV2LCAweDAwYjMyYywgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDBiMTQwLCAweDAwMDAwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnYzMV9tcGVnX210aGRfZG1hKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJdTMyIGluc3QgPSBkYXRhIDw8IDQ7CisJdTMyIGRtYTAgPSBudl9yaTMyKGRldiwgaW5zdCArIDApOworCXUzMiBkbWExID0gbnZfcmkzMihkZXYsIGluc3QgKyA0KTsKKwl1MzIgZG1hMiA9IG52X3JpMzIoZGV2LCBpbnN0ICsgOCk7CisJdTMyIGJhc2UgPSAoZG1hMiAmIDB4ZmZmZmYwMDApIHwgKGRtYTAgPj4gMjApOworCXUzMiBzaXplID0gZG1hMSArIDE7CisKKwkvKiBvbmx5IGFsbG93IGxpbmVhciBETUEgb2JqZWN0cyAqLworCWlmICghKGRtYTAgJiAweDAwMDAyMDAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobXRoZCA9PSAweDAxOTApIHsKKwkJLyogRE1BX0NNRCAqLworCQludl9tYXNrKGRldiwgMHgwMGIzMDAsIDB4MDAwMzAwMDAsIChkbWEwICYgMHgwMDAzMDAwMCkpOworCQludl93cjMyKGRldiwgMHgwMGIzMzQsIGJhc2UpOworCQludl93cjMyKGRldiwgMHgwMGIzMjQsIHNpemUpOworCX0gZWxzZQorCWlmIChtdGhkID09IDB4MDFhMCkgeworCQkvKiBETUFfREFUQSAqLworCQludl9tYXNrKGRldiwgMHgwMGIzMDAsIDB4MDAwYzAwMDAsIChkbWEwICYgMHgwMDAzMDAwMCkgPDwgMik7CisJCW52X3dyMzIoZGV2LCAweDAwYjM2MCwgYmFzZSk7CisJCW52X3dyMzIoZGV2LCAweDAwYjM2NCwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJLyogRE1BX0lNQUdFLCBWUkFNIG9ubHkgKi8KKwkJaWYgKGRtYTAgJiAweDAwMGMwMDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbnZfd3IzMihkZXYsIDB4MDBiMzcwLCBiYXNlKTsKKwkJbnZfd3IzMihkZXYsIDB4MDBiMzc0LCBzaXplKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnYzMV9tcGVnX2lzcl9jaGlkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBpbnN0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCS8qIGhhcmRjb2RlIGRybSBjaGFubmVsIGlkIG9uIG52M3gsIHNvIHN3bXRoZCBsb29rdXAgd29ya3MgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQlpZiAoIWRldl9wcml2LT5jaGFubmVscy5wdHJbaV0pCisJCQljb250aW51ZTsKKworCQljdHggPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldLT5lbmdjdHhbTlZPQkpfRU5HSU5FX01QRUddOworCQlpZiAoY3R4ICYmIGN0eC0+cGluc3QgPT0gaW5zdCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZAorbnYzMV92cGVfc2V0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGUucmVnW2ldOworCisJbnZfd3IzMihkZXYsIDB4MDBiMDA4ICsgKGkgKiAweDEwKSwgdGlsZS0+cGl0Y2gpOworCW52X3dyMzIoZGV2LCAweDAwYjAwNCArIChpICogMHgxMCksIHRpbGUtPmxpbWl0KTsKKwludl93cjMyKGRldiwgMHgwMGIwMDAgKyAoaSAqIDB4MTApLCB0aWxlLT5hZGRyKTsKK30KKworc3RhdGljIHZvaWQKK252MzFfbXBlZ19pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1MzIgaW5zdCA9IChudl9yZDMyKGRldiwgMHgwMGIzMTgpICYgMHgwMDBmZmZmZikgPDwgNDsKKwl1MzIgY2hpZCA9IG52MzFfbXBlZ19pc3JfY2hpZChkZXYsIGluc3QpOworCXUzMiBzdGF0ID0gbnZfcmQzMihkZXYsIDB4MDBiMTAwKTsKKwl1MzIgdHlwZSA9IG52X3JkMzIoZGV2LCAweDAwYjIzMCk7CisJdTMyIG10aGQgPSBudl9yZDMyKGRldiwgMHgwMGIyMzQpOworCXUzMiBkYXRhID0gbnZfcmQzMihkZXYsIDB4MDBiMjM4KTsKKwl1MzIgc2hvdyA9IHN0YXQ7CisKKwlpZiAoc3RhdCAmIDB4MDEwMDAwMDApIHsKKwkJLyogaGFwcGVucyBvbiBpbml0aWFsIGJpbmRpbmcgb2YgdGhlIG9iamVjdCAqLworCQlpZiAodHlwZSA9PSAweDAwMDAwMDIwICYmIG10aGQgPT0gMHgwMDAwKSB7CisJCQludl9tYXNrKGRldiwgMHgwMGIzMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApOworCQkJc2hvdyAmPSB+MHgwMTAwMDAwMDsKKwkJfQorCisJCWlmICh0eXBlID09IDB4MDAwMDAwMTApIHsKKwkJCWlmICghbm91dmVhdV9ncHVvYmpfbXRoZF9jYWxsMihkZXYsIGNoaWQsIDB4MzE3NCwgbXRoZCwgZGF0YSkpCisJCQkJc2hvdyAmPSB+MHgwMTAwMDAwMDsKKwkJfQorCX0KKworCW52X3dyMzIoZGV2LCAweDAwYjEwMCwgc3RhdCk7CisJbnZfd3IzMihkZXYsIDB4MDBiMjMwLCAweDAwMDAwMDAxKTsKKworCWlmIChzaG93ICYmIG5vdXZlYXVfcmF0ZWxpbWl0KCkpIHsKKwkJTlZfSU5GTyhkZXYsICJQTVBFRzogQ2ggJWQgWzB4JTA4eF0gMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAorCQkJY2hpZCwgaW5zdCwgc3RhdCwgdHlwZSwgbXRoZCwgZGF0YSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbnYzMV92cGVfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaWYgKG52X3JkMzIoZGV2LCAweDAwYjEwMCkpCisJCW52MzFfbXBlZ19pc3IoZGV2KTsKKworCWlmIChudl9yZDMyKGRldiwgMHgwMGI4MDApKSB7CisJCXUzMiBzdGF0ID0gbnZfcmQzMihkZXYsIDB4MDBiODAwKTsKKwkJTlZfSU5GTyhkZXYsICJQTVNSQ0g6IDB4JTA4eFxuIiwgc3RhdCk7CisJCW52X3dyMzIoZGV2LCAweGI4MDAsIHN0YXQpOworCX0KK30KKworc3RhdGljIHZvaWQKK252MzFfbXBlZ19kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUpCit7CisJc3RydWN0IG52MzFfbXBlZ19lbmdpbmUgKnBtcGVnID0gbnZfZW5naW5lKGRldiwgZW5naW5lKTsKKworCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAwKTsKKworCU5WT0JKX0VOR0lORV9ERUwoZGV2LCBNUEVHKTsKKwlrZnJlZShwbXBlZyk7Cit9CisKK2ludAorbnYzMV9tcGVnX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52MzFfbXBlZ19lbmdpbmUgKnBtcGVnOworCisJcG1wZWcgPSBremFsbG9jKHNpemVvZigqcG1wZWcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtcGVnKQorCQlyZXR1cm4gLUVOT01FTTsKKwlhdG9taWNfc2V0KCZwbXBlZy0+cmVmY291bnQsIDApOworCisJcG1wZWctPmJhc2UuZGVzdHJveSA9IG52MzFfbXBlZ19kZXN0cm95OworCXBtcGVnLT5iYXNlLmluaXQgPSBudjMxX21wZWdfaW5pdDsKKwlwbXBlZy0+YmFzZS5maW5pID0gbnYzMV9tcGVnX2Zpbmk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl80MCkgeworCQlwbXBlZy0+YmFzZS5jb250ZXh0X25ldyA9IG52MzFfbXBlZ19jb250ZXh0X25ldzsKKwkJcG1wZWctPmJhc2UuY29udGV4dF9kZWwgPSBudjMxX21wZWdfY29udGV4dF9kZWw7CisJfSBlbHNlIHsKKwkJcG1wZWctPmJhc2UuY29udGV4dF9uZXcgPSBudjQwX21wZWdfY29udGV4dF9uZXc7CisJCXBtcGVnLT5iYXNlLmNvbnRleHRfZGVsID0gbnY0MF9tcGVnX2NvbnRleHRfZGVsOworCX0KKwlwbXBlZy0+YmFzZS5vYmplY3RfbmV3ID0gbnYzMV9tcGVnX29iamVjdF9uZXc7CisKKwkvKiBJU1IgdmVjdG9yLCBQTUNfRU5BQkxFIGJpdCwgIGFuZCBUSUxFIHJlZ3MgYXJlIHNoYXJlZCBiZXR3ZWVuCisJICogYWxsIFZQRSBlbmdpbmVzLCBmb3IgdGhpcyBkcml2ZXIncyBwdXJwb3NlcyB0aGUgUE1QRUcgZW5naW5lCisJICogd2lsbCBiZSB0cmVhdGVkIGFzIHRoZSAibWFzdGVyIiBhbmQgaGFuZGxlIHRoZSBnbG9iYWwgVlBFCisJICogYml0cyB0b28KKwkgKi8KKwlwbXBlZy0+YmFzZS5zZXRfdGlsZV9yZWdpb24gPSBudjMxX3ZwZV9zZXRfdGlsZV9yZWdpb247CisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAwLCBudjMxX3ZwZV9pc3IpOworCisJTlZPQkpfRU5HSU5FX0FERChkZXYsIE1QRUcsICZwbXBlZy0+YmFzZSk7CisJTlZPQkpfQ0xBU1MoZGV2LCAweDMxNzQsIE1QRUcpOworCU5WT0JKX01USEQgKGRldiwgMHgzMTc0LCAweDAxOTAsIG52MzFfbXBlZ19tdGhkX2RtYSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDMxNzQsIDB4MDFhMCwgbnYzMV9tcGVnX210aGRfZG1hKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MzE3NCwgMHgwMWIwLCBudjMxX21wZWdfbXRoZF9kbWEpOworCisjaWYgMAorCU5WT0JKX0VOR0lORV9BREQoZGV2LCBNRSwgJnBtZS0+YmFzZSk7CisJTlZPQkpfQ0xBU1MoZGV2LCAweDQwNzUsIE1FKTsKKyNlbmRpZgorCXJldHVybiAwOworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX21wZWcuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfbXBlZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDAzYTBlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfbXBlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSBSZWQgSGF0IEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLSAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKiBBdXRob3JzOiBCZW4gU2tlZ2dzCi0gKi8KLQotI2luY2x1ZGUgImRybVAuaCIKLSNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgotI2luY2x1ZGUgIm5vdXZlYXVfcmFtaHQuaCIKLQotc3RydWN0IG52NDBfbXBlZ19lbmdpbmUgewotCXN0cnVjdCBub3V2ZWF1X2V4ZWNfZW5naW5lIGJhc2U7Ci19OwotCi1zdGF0aWMgaW50Ci1udjQwX21wZWdfY29udGV4dF9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGVuZ2luZSkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHggPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKLQotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIDI2NCAqIDQsIDE2LCBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfAotCQkJCSBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgJmN0eCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW52X3dvMzIoY3R4LCAweDc4LCAweDAyMDAxZWMxKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwotCW52X21hc2soZGV2LCAweDAwMjUwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7Ci0JaWYgKChudl9yZDMyKGRldiwgMHgwMDMyMDQpICYgMHgxZikgPT0gY2hhbi0+aWQpCi0JCW52X3dyMzIoZGV2LCAweDAwMzMwYywgY3R4LT5waW5zdCA+PiA0KTsKLQludl93bzMyKGNoYW4tPnJhbWZjLCAweDU0LCBjdHgtPnBpbnN0ID4+IDQpOwotCW52X21hc2soZGV2LCAweDAwMjUwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKLQotCWNoYW4tPmVuZ2N0eFtlbmdpbmVdID0gY3R4OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotbnY0MF9tcGVnX2NvbnRleHRfZGVsKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBlbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN0eCA9IGNoYW4tPmVuZ2N0eFtlbmdpbmVdOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgaW5zdCA9IDB4ODAwMDAwMDAgfCAoY3R4LT5waW5zdCA+PiA0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwotCW52X21hc2soZGV2LCAweDAwYjMyYywgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7Ci0JaWYgKG52X3JkMzIoZGV2LCAweDAwYjMxOCkgPT0gaW5zdCkKLQkJbnZfbWFzayhkZXYsIDB4MDBiMzE4LCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKTsKLQludl9tYXNrKGRldiwgMHgwMGIzMmMsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7Ci0KLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmN0eCk7Ci0JY2hhbi0+ZW5nY3R4W2VuZ2luZV0gPSBOVUxMOwotfQotCi1zdGF0aWMgaW50Ci1udjQwX21wZWdfb2JqZWN0X25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZW5naW5lLAotCQkgICAgICB1MzIgaGFuZGxlLCB1MTYgY2xhc3MpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm9iaiA9IE5VTEw7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIDIwLCAxNiwgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKLQkJCQkgTlZPQkpfRkxBR19aRVJPX0ZSRUUsICZvYmopOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0Jb2JqLT5lbmdpbmUgPSAyOwotCW9iai0+Y2xhc3MgID0gY2xhc3M7Ci0KLQludl93bzMyKG9iaiwgMHgwMCwgY2xhc3MpOwotCi0JcmV0ID0gbm91dmVhdV9yYW1odF9pbnNlcnQoY2hhbiwgaGFuZGxlLCBvYmopOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmb2JqKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci1udjQwX21wZWdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG52NDBfbXBlZ19lbmdpbmUgKnBtcGVnID0gbnZfZW5naW5lKGRldiwgZW5naW5lKTsKLQlpbnQgaTsKLQotCS8qIFZQRSBpbml0ICovCi0JbnZfbWFzayhkZXYsIDB4MDAwMjAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDAwKTsKLQludl9tYXNrKGRldiwgMHgwMDAyMDAsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDIpOwotCW52X3dyMzIoZGV2LCAweDAwYjBlMCwgMHgwMDAwMDAyMCk7IC8qIG52aWRpYTogcmQgMHgwMSwgd3IgMHgyMCAqLwotCW52X3dyMzIoZGV2LCAweDAwYjBlOCwgMHgwMDAwMDAyMCk7IC8qIG52aWRpYTogcmQgMHgwMSwgd3IgMHgyMCAqLwotCi0JZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmIubnVtX3RpbGVzOyBpKyspCi0JCXBtcGVnLT5iYXNlLnNldF90aWxlX3JlZ2lvbihkZXYsIGkpOwotCi0JLyogUE1QRUcgaW5pdCAqLwotCW52X3dyMzIoZGV2LCAweDAwYjMyYywgMHgwMDAwMDAwMCk7Ci0JbnZfd3IzMihkZXYsIDB4MDBiMzE0LCAweDAwMDAwMTAwKTsKLQludl93cjMyKGRldiwgMHgwMGIyMjAsIDB4MDAwMDAwNDQpOwotCW52X3dyMzIoZGV2LCAweDAwYjMwMCwgMHgwMjAwMWVjMSk7Ci0JbnZfbWFzayhkZXYsIDB4MDBiMzJjLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKLQotCW52X3dyMzIoZGV2LCAweDAwYjEwMCwgMHhmZmZmZmZmZik7Ci0JbnZfd3IzMihkZXYsIDB4MDBiMTQwLCAweGZmZmZmZmZmKTsKLQotCWlmICghbnZfd2FpdChkZXYsIDB4MDBiMjAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgewotCQlOVl9FUlJPUihkZXYsICJQTVBFRyBpbml0OiAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDAwYjIwMCkpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1udjQwX21wZWdfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lLCBib29sIHN1c3BlbmQpCi17Ci0JLypYWFg6IGNvbnRleHQgc2F2ZT8gKi8KLQludl9tYXNrKGRldiwgMHgwMGIzMmMsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOwotCW52X3dyMzIoZGV2LCAweDAwYjE0MCwgMHgwMDAwMDAwMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW52NDBfbXBlZ19tdGhkX2RtYShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwotCXUzMiBpbnN0ID0gZGF0YSA8PCA0OwotCXUzMiBkbWEwID0gbnZfcmkzMihkZXYsIGluc3QgKyAwKTsKLQl1MzIgZG1hMSA9IG52X3JpMzIoZGV2LCBpbnN0ICsgNCk7Ci0JdTMyIGRtYTIgPSBudl9yaTMyKGRldiwgaW5zdCArIDgpOwotCXUzMiBiYXNlID0gKGRtYTIgJiAweGZmZmZmMDAwKSB8IChkbWEwID4+IDIwKTsKLQl1MzIgc2l6ZSA9IGRtYTEgKyAxOwotCi0JLyogb25seSBhbGxvdyBsaW5lYXIgRE1BIG9iamVjdHMgKi8KLQlpZiAoIShkbWEwICYgMHgwMDAwMjAwMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKG10aGQgPT0gMHgwMTkwKSB7Ci0JCS8qIERNQV9DTUQgKi8KLQkJbnZfbWFzayhkZXYsIDB4MDBiMzAwLCAweDAwMDMwMDAwLCAoZG1hMCAmIDB4MDAwMzAwMDApKTsKLQkJbnZfd3IzMihkZXYsIDB4MDBiMzM0LCBiYXNlKTsKLQkJbnZfd3IzMihkZXYsIDB4MDBiMzI0LCBzaXplKTsKLQl9IGVsc2UKLQlpZiAobXRoZCA9PSAweDAxYTApIHsKLQkJLyogRE1BX0RBVEEgKi8KLQkJbnZfbWFzayhkZXYsIDB4MDBiMzAwLCAweDAwMGMwMDAwLCAoZG1hMCAmIDB4MDAwMzAwMDApIDw8IDIpOwotCQludl93cjMyKGRldiwgMHgwMGIzNjAsIGJhc2UpOwotCQludl93cjMyKGRldiwgMHgwMGIzNjQsIHNpemUpOwotCX0gZWxzZSB7Ci0JCS8qIERNQV9JTUFHRSwgVlJBTSBvbmx5ICovCi0JCWlmIChkbWEwICYgMHgwMDBjMDAwMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCW52X3dyMzIoZGV2LCAweDAwYjM3MCwgYmFzZSk7Ci0JCW52X3dyMzIoZGV2LCAweDAwYjM3NCwgc2l6ZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW52NDBfbXBlZ19pc3JfY2hpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgaW5zdCkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKLQkJaWYgKCFkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldKQotCQkJY29udGludWU7Ci0KLQkJY3R4ID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXS0+ZW5nY3R4W05WT0JKX0VOR0lORV9NUEVHXTsKLQkJaWYgKGN0eCAmJiBjdHgtPnBpbnN0ID09IGluc3QpCi0JCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gaTsKLX0KLQotc3RhdGljIHZvaWQKLW52NDBfdnBlX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlID0gJmRldl9wcml2LT50aWxlLnJlZ1tpXTsKLQotCW52X3dyMzIoZGV2LCAweDAwYjAwOCArIChpICogMHgxMCksIHRpbGUtPnBpdGNoKTsKLQludl93cjMyKGRldiwgMHgwMGIwMDQgKyAoaSAqIDB4MTApLCB0aWxlLT5saW1pdCk7Ci0JbnZfd3IzMihkZXYsIDB4MDBiMDAwICsgKGkgKiAweDEwKSwgdGlsZS0+YWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udjQwX21wZWdfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JdTMyIGluc3QgPSAobnZfcmQzMihkZXYsIDB4MDBiMzE4KSAmIDB4MDAwZmZmZmYpIDw8IDQ7Ci0JdTMyIGNoaWQgPSBudjQwX21wZWdfaXNyX2NoaWQoZGV2LCBpbnN0KTsKLQl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDAwYjEwMCk7Ci0JdTMyIHR5cGUgPSBudl9yZDMyKGRldiwgMHgwMGIyMzApOwotCXUzMiBtdGhkID0gbnZfcmQzMihkZXYsIDB4MDBiMjM0KTsKLQl1MzIgZGF0YSA9IG52X3JkMzIoZGV2LCAweDAwYjIzOCk7Ci0JdTMyIHNob3cgPSBzdGF0OwotCi0JaWYgKHN0YXQgJiAweDAxMDAwMDAwKSB7Ci0JCS8qIGhhcHBlbnMgb24gaW5pdGlhbCBiaW5kaW5nIG9mIHRoZSBvYmplY3QgKi8KLQkJaWYgKHR5cGUgPT0gMHgwMDAwMDAyMCAmJiBtdGhkID09IDB4MDAwMCkgewotCQkJbnZfbWFzayhkZXYsIDB4MDBiMzA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKTsKLQkJCXNob3cgJj0gfjB4MDEwMDAwMDA7Ci0JCX0KLQotCQlpZiAodHlwZSA9PSAweDAwMDAwMDEwKSB7Ci0JCQlpZiAoIW5vdXZlYXVfZ3B1b2JqX210aGRfY2FsbDIoZGV2LCBjaGlkLCAweDMxNzQsIG10aGQsIGRhdGEpKQotCQkJCXNob3cgJj0gfjB4MDEwMDAwMDA7Ci0JCX0KLQl9Ci0KLQludl93cjMyKGRldiwgMHgwMGIxMDAsIHN0YXQpOwotCW52X3dyMzIoZGV2LCAweDAwYjIzMCwgMHgwMDAwMDAwMSk7Ci0KLQlpZiAoc2hvdyAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKSB7Ci0JCU5WX0lORk8oZGV2LCAiUE1QRUc6IENoICVkIFsweCUwOHhdIDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKLQkJCWNoaWQsIGluc3QsIHN0YXQsIHR5cGUsIG10aGQsIGRhdGEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLW52NDBfdnBlX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCWlmIChudl9yZDMyKGRldiwgMHgwMGIxMDApKQotCQludjQwX21wZWdfaXNyKGRldik7Ci0KLQlpZiAobnZfcmQzMihkZXYsIDB4MDBiODAwKSkgewotCQl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDAwYjgwMCk7Ci0JCU5WX0lORk8oZGV2LCAiUE1TUkNIOiAweCUwOHhcbiIsIHN0YXQpOwotCQludl93cjMyKGRldiwgMHhiODAwLCBzdGF0KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1udjQwX21wZWdfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lKQotewotCXN0cnVjdCBudjQwX21wZWdfZW5naW5lICpwbXBlZyA9IG52X2VuZ2luZShkZXYsIGVuZ2luZSk7Ci0KLQlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMCk7Ci0KLQlOVk9CSl9FTkdJTkVfREVMKGRldiwgTVBFRyk7Ci0Ja2ZyZWUocG1wZWcpOwotfQotCi1pbnQKLW52NDBfbXBlZ19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbnY0MF9tcGVnX2VuZ2luZSAqcG1wZWc7Ci0KLQlwbXBlZyA9IGt6YWxsb2Moc2l6ZW9mKCpwbXBlZyksIEdGUF9LRVJORUwpOwotCWlmICghcG1wZWcpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcG1wZWctPmJhc2UuZGVzdHJveSA9IG52NDBfbXBlZ19kZXN0cm95OwotCXBtcGVnLT5iYXNlLmluaXQgPSBudjQwX21wZWdfaW5pdDsKLQlwbXBlZy0+YmFzZS5maW5pID0gbnY0MF9tcGVnX2Zpbmk7Ci0JcG1wZWctPmJhc2UuY29udGV4dF9uZXcgPSBudjQwX21wZWdfY29udGV4dF9uZXc7Ci0JcG1wZWctPmJhc2UuY29udGV4dF9kZWwgPSBudjQwX21wZWdfY29udGV4dF9kZWw7Ci0JcG1wZWctPmJhc2Uub2JqZWN0X25ldyA9IG52NDBfbXBlZ19vYmplY3RfbmV3OwotCi0JLyogSVNSIHZlY3RvciwgUE1DX0VOQUJMRSBiaXQsICBhbmQgVElMRSByZWdzIGFyZSBzaGFyZWQgYmV0d2VlbgotCSAqIGFsbCBWUEUgZW5naW5lcywgZm9yIHRoaXMgZHJpdmVyJ3MgcHVycG9zZXMgdGhlIFBNUEVHIGVuZ2luZQotCSAqIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgIm1hc3RlciIgYW5kIGhhbmRsZSB0aGUgZ2xvYmFsIFZQRQotCSAqIGJpdHMgdG9vCi0JICovCi0JcG1wZWctPmJhc2Uuc2V0X3RpbGVfcmVnaW9uID0gbnY0MF92cGVfc2V0X3RpbGVfcmVnaW9uOwotCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMCwgbnY0MF92cGVfaXNyKTsKLQotCU5WT0JKX0VOR0lORV9BREQoZGV2LCBNUEVHLCAmcG1wZWctPmJhc2UpOwotCU5WT0JKX0NMQVNTKGRldiwgMHgzMTc0LCBNUEVHKTsKLQlOVk9CSl9NVEhEIChkZXYsIDB4MzE3NCwgMHgwMTkwLCBudjQwX21wZWdfbXRoZF9kbWEpOwotCU5WT0JKX01USEQgKGRldiwgMHgzMTc0LCAweDAxYTAsIG52NDBfbXBlZ19tdGhkX2RtYSk7Ci0JTlZPQkpfTVRIRCAoZGV2LCAweDMxNzQsIDB4MDFiMCwgbnY0MF9tcGVnX210aGRfZG1hKTsKLQotI2lmIDAKLQlOVk9CSl9FTkdJTkVfQUREKGRldiwgTUUsICZwbWUtPmJhc2UpOwotCU5WT0JKX0NMQVNTKGRldiwgMHg0MDc1LCBNRSk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzZiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX3BtLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfYmlvcy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfcG0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisKKyNkZWZpbmUgbWluMihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKK3N0YXRpYyB1MzIKK3JlYWRfcGxsXzEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHJlZykKK3sKKwl1MzIgY3RybCA9IG52X3JkMzIoZGV2LCByZWcgKyAweDAwKTsKKwlpbnQgUCA9IChjdHJsICYgMHgwMDA3MDAwMCkgPj4gMTY7CisJaW50IE4gPSAoY3RybCAmIDB4MDAwMGZmMDApID4+IDg7CisJaW50IE0gPSAoY3RybCAmIDB4MDAwMDAwZmYpID4+IDA7CisJdTMyIHJlZiA9IDI3MDAwLCBjbGsgPSAwOworCisJaWYgKGN0cmwgJiAweDgwMDAwMDAwKQorCQljbGsgPSByZWYgKiBOIC8gTTsKKworCXJldHVybiBjbGsgPj4gUDsKK30KKworc3RhdGljIHUzMgorcmVhZF9wbGxfMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgcmVnKQoreworCXUzMiBjdHJsID0gbnZfcmQzMihkZXYsIHJlZyArIDB4MDApOworCXUzMiBjb2VmID0gbnZfcmQzMihkZXYsIHJlZyArIDB4MDQpOworCWludCBOMiA9IChjb2VmICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJaW50IE0yID0gKGNvZWYgJiAweDAwZmYwMDAwKSA+PiAxNjsKKwlpbnQgTjEgPSAoY29lZiAmIDB4MDAwMGZmMDApID4+IDg7CisJaW50IE0xID0gKGNvZWYgJiAweDAwMDAwMGZmKSA+PiAwOworCWludCBQID0gKGN0cmwgJiAweDAwMDcwMDAwKSA+PiAxNjsKKwl1MzIgcmVmID0gMjcwMDAsIGNsayA9IDA7CisKKwlpZiAoKGN0cmwgJiAweDgwMDAwMDAwKSAmJiBNMSkgeworCQljbGsgPSByZWYgKiBOMSAvIE0xOworCQlpZiAoKGN0cmwgJiAweDQwMDAwMTAwKSA9PSAweDQwMDAwMDAwKSB7CisJCQlpZiAoTTIpCisJCQkJY2xrID0gY2xrICogTjIgLyBNMjsKKwkJCWVsc2UKKwkJCQljbGsgPSAwOworCQl9CisJfQorCisJcmV0dXJuIGNsayA+PiBQOworfQorCitzdGF0aWMgdTMyCityZWFkX2NsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc3JjKQoreworCXN3aXRjaCAoc3JjKSB7CisJY2FzZSAzOgorCQlyZXR1cm4gcmVhZF9wbGxfMihkZXYsIDB4MDA0MDAwKTsKKwljYXNlIDI6CisJCXJldHVybiByZWFkX3BsbF8xKGRldiwgMHgwMDQwMDgpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK252NDBfcG1fY2xvY2tzX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqcGVyZmx2bCkKK3sKKwl1MzIgY3RybCA9IG52X3JkMzIoZGV2LCAweDAwYzA0MCk7CisKKwlwZXJmbHZsLT5jb3JlICAgPSByZWFkX2NsayhkZXYsIChjdHJsICYgMHgwMDAwMDAwMykgPj4gMCk7CisJcGVyZmx2bC0+c2hhZGVyID0gcmVhZF9jbGsoZGV2LCAoY3RybCAmIDB4MDAwMDAwMzApID4+IDQpOworCXBlcmZsdmwtPm1lbW9yeSA9IHJlYWRfcGxsXzIoZGV2LCAweDQwMjApOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbnY0MF9wbV9zdGF0ZSB7CisJdTMyIGN0cmw7CisJdTMyIG5wbGxfY3RybDsKKwl1MzIgbnBsbF9jb2VmOworCXUzMiBzcGxsOworCXUzMiBtcGxsX2N0cmw7CisJdTMyIG1wbGxfY29lZjsKK307CisKK3N0YXRpYyBpbnQKK252NDBfY2FsY19wbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHJlZywgc3RydWN0IHBsbF9saW1zICpwbGwsCisJICAgICAgdTMyIGNsaywgaW50ICpOMSwgaW50ICpNMSwgaW50ICpOMiwgaW50ICpNMiwgaW50ICpsb2cyUCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyBjb2VmOworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfcGxsX2xpbWl0cyhkZXYsIHJlZywgcGxsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNsayA8IHBsbC0+dmNvMS5tYXhmcmVxKQorCQlwbGwtPnZjbzIubWF4ZnJlcSA9IDA7CisKKwlyZXQgPSBub3V2ZWF1X2NhbGNfcGxsX21ucChkZXYsIHBsbCwgY2xrLCAmY29lZik7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCSpOMSA9IGNvZWYuTjE7CisJKk0xID0gY29lZi5NMTsKKwlpZiAoTjIgJiYgTTIpIHsKKwkJaWYgKHBsbC0+dmNvMi5tYXhmcmVxKSB7CisJCQkqTjIgPSBjb2VmLk4yOworCQkJKk0yID0gY29lZi5NMjsKKwkJfSBlbHNlIHsKKwkJCSpOMiA9IDE7CisJCQkqTTIgPSAxOworCQl9CisJfQorCSpsb2cyUCA9IGNvZWYubG9nMlA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgKgorbnY0MF9wbV9jbG9ja3NfcHJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICpwZXJmbHZsKQoreworCXN0cnVjdCBudjQwX3BtX3N0YXRlICppbmZvOworCXN0cnVjdCBwbGxfbGltcyBwbGw7CisJaW50IE4xLCBOMiwgTTEsIE0yLCBsb2cyUDsKKwlpbnQgcmV0OworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCS8qIGNvcmUvZ2VvbWV0cmljIGNsb2NrICovCisJcmV0ID0gbnY0MF9jYWxjX3BsbChkZXYsIDB4MDA0MDAwLCAmcGxsLCBwZXJmbHZsLT5jb3JlLAorCQkJICAgICZOMSwgJk0xLCAmTjIsICZNMiwgJmxvZzJQKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoTjIgPT0gTTIpIHsKKwkJaW5mby0+bnBsbF9jdHJsID0gMHg4MDAwMDEwMCB8IChsb2cyUCA8PCAxNik7CisJCWluZm8tPm5wbGxfY29lZiA9IChOMSA8PCA4KSB8IE0xOworCX0gZWxzZSB7CisJCWluZm8tPm5wbGxfY3RybCA9IDB4YzAwMDAwMDAgfCAobG9nMlAgPDwgMTYpOworCQlpbmZvLT5ucGxsX2NvZWYgPSAoTjIgPDwgMjQpIHwgKE0yIDw8IDE2KSB8IChOMSA8PCA4KSB8IE0xOworCX0KKworCS8qIHVzZSB0aGUgc2Vjb25kIFBMTCBmb3Igc2hhZGVyL3JvcCBjbG9jaywgaWYgaXQgZGlmZmVycyBmcm9tIGNvcmUgKi8KKwlpZiAocGVyZmx2bC0+c2hhZGVyICYmIHBlcmZsdmwtPnNoYWRlciAhPSBwZXJmbHZsLT5jb3JlKSB7CisJCXJldCA9IG52NDBfY2FsY19wbGwoZGV2LCAweDAwNDAwOCwgJnBsbCwgcGVyZmx2bC0+c2hhZGVyLAorCQkJCSAgICAmTjEsICZNMSwgTlVMTCwgTlVMTCwgJmxvZzJQKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQlpbmZvLT5zcGxsID0gMHhjMDAwMDAwMCB8IChsb2cyUCA8PCAxNikgfCAoTjEgPDwgOCkgfCBNMTsKKwkJaW5mby0+Y3RybCA9IDB4MDAwMDAyMjM7CisJfSBlbHNlIHsKKwkJaW5mby0+c3BsbCA9IDB4MDAwMDAwMDA7CisJCWluZm8tPmN0cmwgPSAweDAwMDAwMzMzOworCX0KKworCS8qIG1lbW9yeSBjbG9jayAqLworCWlmICghcGVyZmx2bC0+bWVtb3J5KSB7CisJCWluZm8tPm1wbGxfY3RybCA9IDB4MDAwMDAwMDA7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG52NDBfY2FsY19wbGwoZGV2LCAweDAwNDAyMCwgJnBsbCwgcGVyZmx2bC0+bWVtb3J5LAorCQkJICAgICZOMSwgJk0xLCAmTjIsICZNMiwgJmxvZzJQKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlpbmZvLT5tcGxsX2N0cmwgID0gMHg4MDAwMDAwMCB8IChsb2cyUCA8PCAxNik7CisJaW5mby0+bXBsbF9jdHJsIHw9IG1pbjIocGxsLmxvZzJwX2JpYXMgKyBsb2cyUCwgcGxsLm1heF9sb2cycCkgPDwgMjA7CisJaWYgKE4yID09IE0yKSB7CisJCWluZm8tPm1wbGxfY3RybCB8PSAweDAwMDAwMTAwOworCQlpbmZvLT5tcGxsX2NvZWYgID0gKE4xIDw8IDgpIHwgTTE7CisJfSBlbHNlIHsKKwkJaW5mby0+bXBsbF9jdHJsIHw9IDB4NDAwMDAwMDA7CisJCWluZm8tPm1wbGxfY29lZiAgPSAoTjIgPDwgMjQpIHwgKE0yIDw8IDE2KSB8IChOMSA8PCA4KSB8IE0xOworCX0KKworb3V0OgorCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKGluZm8pOworCQlpbmZvID0gRVJSX1BUUihyZXQpOworCX0KKwlyZXR1cm4gaW5mbzsKK30KKworc3RhdGljIGJvb2wKK252NDBfcG1fZ3JfaWRsZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkYXRhOworCisJaWYgKChudl9yZDMyKGRldiwgMHg0MDA3NjApICYgMHgwMDAwMDBmMCkgPj4gNCAhPQorCSAgICAobnZfcmQzMihkZXYsIDB4NDAwNzYwKSAmIDB4MDAwMDAwMGYpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAobnZfcmQzMihkZXYsIDB4NDAwNzAwKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQKK252NDBfcG1fY2xvY2tzX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpwcmVfc3RhdGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY0MF9wbV9zdGF0ZSAqaW5mbyA9IHByZV9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaXRfZW50cnkgTTsKKwl1MzIgY3J0Y19tYXNrID0gMDsKKwl1OCBzcjFbMl07CisJaW50IGk7CisKKwkvKiBkZXRlcm1pbmUgd2hpY2ggQ1JUQ3MgYXJlIGFjdGl2ZSwgZmV0Y2ggVkdBX1NSMSBmb3IgZWFjaCAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdTMyIHZibCA9IG52X3JkMzIoZGV2LCAweDYwMDgwOCArIChpICogMHgyMDAwKSk7CisJCXUzMiBjbnQgPSAwOworCQlkbyB7CisJCQlpZiAodmJsICE9IG52X3JkMzIoZGV2LCAweDYwMDgwOCArIChpICogMHgyMDAwKSkpIHsKKwkJCQludl93cjA4KGRldiwgMHgwYzAzYzQgKyAoaSAqIDB4MjAwMCksIDB4MDEpOworCQkJCXNyMVtpXSA9IG52X3JkMDgoZGV2LCAweDBjMDNjNSArIChpICogMHgyMDAwKSk7CisJCQkJaWYgKCEoc3IxW2ldICYgMHgyMCkpCisJCQkJCWNydGNfbWFzayB8PSAoMSA8PCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxKTsKKwkJfSB3aGlsZSAoY250KysgPCAzMik7CisJfQorCisJLyogaGFsdCBhbmQgaWRsZSBlbmdpbmVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJbnZfbWFzayhkZXYsIDB4MDAyNTAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwlpZiAoIW52X3dhaXQoZGV2LCAweDAwMjUwMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCkpCisJCWdvdG8gcmVzdW1lOworCW52X21hc2soZGV2LCAweDAwMzIyMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJaWYgKCFudl93YWl0KGRldiwgMHgwMDMyMjAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDApKQorCQlnb3RvIHJlc3VtZTsKKwludl9tYXNrKGRldiwgMHgwMDMyMDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCW52MDRfZmlmb19jYWNoZV9wdWxsKGRldiwgZmFsc2UpOworCisJaWYgKCFudl93YWl0X2NiKGRldiwgbnY0MF9wbV9ncl9pZGxlLCBkZXYpKQorCQlnb3RvIHJlc3VtZTsKKworCS8qIHNldCBlbmdpbmUgY2xvY2tzICovCisJbnZfbWFzayhkZXYsIDB4MDBjMDQwLCAweDAwMDAwMzMzLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDQwMDQsIGluZm8tPm5wbGxfY29lZik7CisJbnZfbWFzayhkZXYsIDB4MDA0MDAwLCAweGMwMDcwMTAwLCBpbmZvLT5ucGxsX2N0cmwpOworCW52X21hc2soZGV2LCAweDAwNDAwOCwgMHhjMDA3ZmZmZiwgaW5mby0+c3BsbCk7CisJbWRlbGF5KDUpOworCW52X21hc2soZGV2LCAweDAwYzA0MCwgMHgwMDAwMDMzMywgaW5mby0+Y3RybCk7CisKKwlpZiAoIWluZm8tPm1wbGxfY3RybCkKKwkJZ290byByZXN1bWU7CisKKwkvKiB3YWl0IGZvciB2Ymxhbmsgc3RhcnQgb24gYWN0aXZlIGNydGNzLCBkaXNhYmxlIG1lbW9yeSBhY2Nlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlmICghKGNydGNfbWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQludl93YWl0KGRldiwgMHg2MDA4MDggKyAoaSAqIDB4MjAwMCksIDB4MDAwMTAwMDAsIDB4MDAwMDAwMDApOworCQludl93YWl0KGRldiwgMHg2MDA4MDggKyAoaSAqIDB4MjAwMCksIDB4MDAwMTAwMDAsIDB4MDAwMTAwMDApOworCQludl93cjA4KGRldiwgMHgwYzAzYzQgKyAoaSAqIDB4MjAwMCksIDB4MDEpOworCQludl93cjA4KGRldiwgMHgwYzAzYzUgKyAoaSAqIDB4MjAwMCksIHNyMVtpXSB8IDB4MjApOworCX0KKworCS8qIHByZXBhcmUgcmFtIGZvciByZWNsb2NraW5nICovCisJbnZfd3IzMihkZXYsIDB4MTAwMmQ0LCAweDAwMDAwMDAxKTsgLyogcHJlY2hhcmdlICovCisJbnZfd3IzMihkZXYsIDB4MTAwMmQwLCAweDAwMDAwMDAxKTsgLyogcmVmcmVzaCAqLworCW52X3dyMzIoZGV2LCAweDEwMDJkMCwgMHgwMDAwMDAwMSk7IC8qIHJlZnJlc2ggKi8KKwludl9tYXNrKGRldiwgMHgxMDAyMTAsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOyAvKiBubyBhdXRvIHJlZnJlc2ggKi8KKwludl93cjMyKGRldiwgMHgxMDAyZGMsIDB4MDAwMDAwMDEpOyAvKiBlbmFibGUgc2VsZi1yZWZyZXNoICovCisKKwkvKiBjaGFuZ2UgdGhlIFBMTCBvZiBlYWNoIG1lbW9yeSBwYXJ0aXRpb24gKi8KKwludl9tYXNrKGRldiwgMHgwMGMwNDAsIDB4MDAwMGMwMDAsIDB4MDAwMDAwMDApOworCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4NDA6CisJY2FzZSAweDQ1OgorCWNhc2UgMHg0MToKKwljYXNlIDB4NDI6CisJY2FzZSAweDQ3OgorCQludl9tYXNrKGRldiwgMHgwMDQwNDQsIDB4YzA3NzExMDAsIGluZm8tPm1wbGxfY3RybCk7CisJCW52X21hc2soZGV2LCAweDAwNDAyYywgMHhjMDc3MTEwMCwgaW5mby0+bXBsbF9jdHJsKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA0MDQ4LCBpbmZvLT5tcGxsX2NvZWYpOworCQludl93cjMyKGRldiwgMHgwMDQwMzAsIGluZm8tPm1wbGxfY29lZik7CisJY2FzZSAweDQzOgorCWNhc2UgMHg0OToKKwljYXNlIDB4NGI6CisJCW52X21hc2soZGV2LCAweDAwNDAzOCwgMHhjMDc3MTEwMCwgaW5mby0+bXBsbF9jdHJsKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA0MDNjLCBpbmZvLT5tcGxsX2NvZWYpOworCWRlZmF1bHQ6CisJCW52X21hc2soZGV2LCAweDAwNDAyMCwgMHhjMDc3MTEwMCwgaW5mby0+bXBsbF9jdHJsKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA0MDI0LCBpbmZvLT5tcGxsX2NvZWYpOworCQlicmVhazsKKwl9CisJdWRlbGF5KDEwMCk7CisJbnZfbWFzayhkZXYsIDB4MDBjMDQwLCAweDAwMDBjMDAwLCAweDAwMDBjMDAwKTsKKworCS8qIHJlLWVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIG9mIG1lbW9yeSBjb250cm9sbGVyICovCisJbnZfd3IzMihkZXYsIDB4MTAwMmRjLCAweDAwMDAwMDAwKTsKKwludl9tYXNrKGRldiwgMHgxMDAyMTAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDApOworCXVkZWxheSgxMDApOworCisJLyogZXhlY3V0ZSBtZW1vcnkgcmVzZXQgc2NyaXB0IGZyb20gdmJpb3MgKi8KKwlpZiAoIWJpdF90YWJsZShkZXYsICdNJywgJk0pKQorCQlub3V2ZWF1X2Jpb3NfaW5pdF9leGVjKGRldiwgUk9NMTYoTS5kYXRhWzBdKSk7CisKKwkvKiBtYWtlIHN1cmUgd2UncmUgaW4gdmJsYW5rIChob3BlZnVsbHkgdGhlIHNhbWUgb25lIGFzIGJlZm9yZSksIGFuZAorCSAqIHRoZW4gcmUtZW5hYmxlIGNydGMgbWVtb3J5IGFjY2VzcworCSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYgKCEoY3J0Y19tYXNrICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCW52X3dhaXQoZGV2LCAweDYwMDgwOCArIChpICogMHgyMDAwKSwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMCk7CisJCW52X3dyMDgoZGV2LCAweDBjMDNjNCArIChpICogMHgyMDAwKSwgMHgwMSk7CisJCW52X3dyMDgoZGV2LCAweDBjMDNjNSArIChpICogMHgyMDAwKSwgc3IxW2ldKTsKKwl9CisKKwkvKiByZXN1bWUgZW5naW5lcyAqLworcmVzdW1lOgorCW52X3dyMzIoZGV2LCAweDAwMzI1MCwgMHgwMDAwMDAwMSk7CisJbnZfbWFzayhkZXYsIDB4MDAzMjIwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHgwMDMyMDAsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDAwMjUwMCwgMHgwMDAwMDAwMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKworCWtmcmVlKGluZm8pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2NydGMuYwppbmRleCA1ZDk4OTA3My4uODgyMDgwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMKQEAgLTMyOSw4ICszMjksNiBAQAogCiAJZHJtX2NydGNfY2xlYW51cCgmbnZfY3J0Yy0+YmFzZSk7CiAKLQludjUwX2N1cnNvcl9maW5pKG52X2NydGMpOwotCiAJbm91dmVhdV9ib191bm1hcChudl9jcnRjLT5sdXQubnZibyk7CiAJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52X2NydGMtPmx1dC5udmJvKTsKIAlub3V2ZWF1X2JvX3VubWFwKG52X2NydGMtPmN1cnNvci5udmJvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3Vyc29yLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2N1cnNvci5jCmluZGV4IDk3NTJjMzUuLmFkZmM5YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3Vyc29yLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jdXJzb3IuYwpAQCAtMTM3LDIxICsxMzcsMyBAQAogCW52X2NydGMtPmN1cnNvci5zaG93ID0gbnY1MF9jdXJzb3Jfc2hvdzsKIAlyZXR1cm4gMDsKIH0KLQotdm9pZAotbnY1MF9jdXJzb3JfZmluaShzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKLQlpbnQgaWR4ID0gbnZfY3J0Yy0+aW5kZXg7Ci0KLQlOVl9ERUJVR19LTVMoZGV2LCAiXG4iKTsKLQotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaWR4KSwgMCk7Ci0JaWYgKCFudl93YWl0KGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGlkeCksCi0JCSAgICAgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyX1NUQVRVUywgMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogQ1VSU09SX0NUUkwyX1NUQVRVUyA9PSAwXG4iKTsKLQkJTlZfRVJST1IoZGV2LCAiQ1VSU09SX0NUUkwyID0gMHglMDh4XG4iLAotCQkJIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaWR4KSkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYwppbmRleCBkYjFhNWY0Li5kMjNjYTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYwpAQCAtMjQ3LDYgKzI0NywxNiBAQAogCQl9CiAJfQogCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGkpLCAwKTsKKwkJaWYgKCFudl93YWl0KGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGkpLAorCQkJICAgICBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDJfU1RBVFVTLCAwKSkgeworCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogQ1VSU09SX0NUUkwyX1NUQVRVUyA9PSAwXG4iKTsKKwkJCU5WX0VSUk9SKGRldiwgIkNVUlNPUl9DVFJMMiA9IDB4JTA4eFxuIiwKKwkJCQkgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpKSkpOworCQl9CisJfQorCiAJbnY1MF9ldm9fZmluaShkZXYpOwogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewpAQCAtMjg2LDIzICsyOTYsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlkZXZfcHJpdi0+ZW5naW5lLmRpc3BsYXkucHJpdiA9IHByaXY7CiAKLQkvKiBpbml0IGJhc2ljIGtlcm5lbCBtb2Rlc2V0dGluZyAqLwotCWRybV9tb2RlX2NvbmZpZ19pbml0KGRldik7Ci0KLQkvKiBJbml0aWFsaXNlIHNvbWUgb3B0aW9uYWwgY29ubmVjdG9yIHByb3BlcnRpZXMuICovCi0JZHJtX21vZGVfY3JlYXRlX3NjYWxpbmdfbW9kZV9wcm9wZXJ0eShkZXYpOwotCWRybV9tb2RlX2NyZWF0ZV9kaXRoZXJpbmdfcHJvcGVydHkoZGV2KTsKLQotCWRldi0+bW9kZV9jb25maWcubWluX3dpZHRoID0gMDsKLQlkZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSAwOwotCi0JZGV2LT5tb2RlX2NvbmZpZy5mdW5jcyA9ICh2b2lkICopJm5vdXZlYXVfbW9kZV9jb25maWdfZnVuY3M7Ci0KLQlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDgxOTI7Ci0JZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gODE5MjsKLQotCWRldi0+bW9kZV9jb25maWcuZmJfYmFzZSA9IGRldl9wcml2LT5mYl9waHlzOwotCiAJLyogQ3JlYXRlIENSVEMgb2JqZWN0cyAqLwogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCiAJCW52NTBfY3J0Y19jcmVhdGUoZGV2LCBpKTsKQEAgLTM2NCw4ICszNTcsNiBAQAogCiAJTlZfREVCVUdfS01TKGRldiwgIlxuIik7CiAKLQlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkZXYpOwotCiAJbnY1MF9kaXNwbGF5X2Rpc2FibGUoZGV2KTsKIAlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMjYpOwogCWtmcmVlKGRpc3ApOwpAQCAtNjk4LDcgKzY4OSw3IEBACiAJCXN0cnVjdCBkY2JfZW50cnkgKmRjYiA9ICZkZXZfcHJpdi0+dmJpb3MuZGNiLmVudHJ5W2ldOwogCiAJCWlmIChkY2ItPnR5cGUgPT0gdHlwZSAmJiAoZGNiLT5vciAmICgxIDw8IG9yKSkpIHsKLQkJCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGRjYiwgMCwgLTEpOworCQkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgMCwgLTEsIGRjYiwgLTEpOwogCQkJZGlzcC0+aXJxLmRjYiA9IGRjYjsKIAkJCWdvdG8gYWNrOwogCQl9CkBAIC03MTEsMzcgKzcwMiw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1udjUwX2Rpc3BsYXlfdW5rMjBfZHBfaGFjayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IpCi17Ci0JaW50IG9yID0gZmZzKGRjYi0+b3IpIC0gMSwgbGluayA9ICEoZGNiLT5kcGNvbmYuc29yLmxpbmsgJiAxKTsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7Ci0JdWludDMyX3QgdG1wLCB1bmswID0gMCwgdW5rMSA9IDA7Ci0KLQlpZiAoZGNiLT50eXBlICE9IE9VVFBVVF9EUCkKLQkJcmV0dXJuOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKLQkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQotCQlpZiAobnZfZW5jb2Rlci0+ZGNiID09IGRjYikgewotCQkJdW5rMCA9IG52X2VuY29kZXItPmRwLnVuazA7Ci0JCQl1bmsxID0gbnZfZW5jb2Rlci0+ZHAudW5rMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKHVuazAgfHwgdW5rMSkgewotCQl0bXAgID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspKTsKLQkJdG1wICY9IDB4ZmZmZmZlMDM7Ci0JCW52X3dyMzIoZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSwgdG1wIHwgdW5rMCk7Ci0KLQkJdG1wICA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMjgob3IsIGxpbmspKTsKLQkJdG1wICY9IDB4ZmVmMDgwYzA7Ci0JCW52X3dyMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMjgob3IsIGxpbmspLCB0bXAgfCB1bmsxKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCiBudjUwX2Rpc3BsYXlfdW5rMjBfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC03NTMsNyArNzEzLDcgQEAKIAlOVl9ERUJVR19LTVMoZGV2LCAiMHg2MTAwMzA6IDB4JTA4eFxuIiwgdW5rMzApOwogCWRjYiA9IGRpc3AtPmlycS5kY2I7CiAJaWYgKGRjYikgewotCQlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBkY2IsIDAsIC0yKTsKKwkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgMCwgLTIsIGRjYiwgLTEpOwogCQlkaXNwLT5pcnEuZGNiID0gTlVMTDsKIAl9CiAKQEAgLTgzNyw5ICs3OTcsMTUgQEAKIAl9CiAKIAlzY3JpcHQgPSBudjUwX2Rpc3BsYXlfc2NyaXB0X3NlbGVjdChkZXYsIGRjYiwgbWMsIHBjbGspOwotCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGRjYiwgc2NyaXB0LCBwY2xrKTsKKwlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBzY3JpcHQsIHBjbGssIGRjYiwgLTEpOwogCi0JbnY1MF9kaXNwbGF5X3VuazIwX2RwX2hhY2soZGV2LCBkY2IpOworCWlmICh0eXBlID09IE9VVFBVVF9EUCkgeworCQlpbnQgbGluayA9ICEoZGNiLT5kcGNvbmYuc29yLmxpbmsgJiAxKTsKKwkJaWYgKChtYyAmIDB4MDAwZjAwMDApID09IDB4MDAwMjAwMDApCisJCQlub3V2ZWF1X2RwX3R1X3VwZGF0ZShkZXYsIG9yLCBsaW5rLCBwY2xrLCAxOCk7CisJCWVsc2UKKwkJCW5vdXZlYXVfZHBfdHVfdXBkYXRlKGRldiwgb3IsIGxpbmssIHBjbGssIDI0KTsKKwl9CiAKIAlpZiAoZGNiLT50eXBlICE9IE9VVFBVVF9BTkFMT0cpIHsKIAkJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0NMS19DVFJMMihvcikpOwpAQCAtOTA0LDcgKzg3MCw3IEBACiAJaWYgKCFkY2IpCiAJCWdvdG8gYWNrOwogCi0Jbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgZGNiLCBzY3JpcHQsIC1wY2xrKTsKKwlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBzY3JpcHQsIC1wY2xrLCBkY2IsIC0xKTsKIAludjUwX2Rpc3BsYXlfdW5rNDBfZHBfc2V0X3RtZHMoZGV2LCBkY2IpOwogCiBhY2s6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dwaW8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3Bpby5jCmluZGV4IGQ0ZjQyMDYuLjc5M2E1Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3Bpby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3Bpby5jCkBAIC05OCw2ICs5OCwzNyBAQAogfQogCiBpbnQKK252ZDBfZ3Bpb19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnKQoreworCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKKwl1MzIgdjsKKworCWdwaW8gPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIHRhZyk7CisJaWYgKCFncGlvKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXYgID0gbnZfcmQzMihkZXYsIDB4MDBkNjEwICsgKGdwaW8tPmxpbmUgKiA0KSk7CisJdiAmPSAweDAwMDA0MDAwOworCXJldHVybiAoISF2ID09IChncGlvLT5zdGF0ZVsxXSAmIDEpKTsKK30KKworaW50CitudmQwX2dwaW9fc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZywgaW50IHN0YXRlKQoreworCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKKwl1MzIgdjsKKworCWdwaW8gPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIHRhZyk7CisJaWYgKCFncGlvKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXYgPSBncGlvLT5zdGF0ZVtzdGF0ZV0gXiAyOworCisJbnZfbWFzayhkZXYsIDB4MDBkNjEwICsgKGdwaW8tPmxpbmUgKiA0KSwgMHgwMDAwMzAwMCwgdiA8PCAxMik7CisJcmV0dXJuIDA7Cit9CisKK2ludAogbnY1MF9ncGlvX2lycV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcsCiAJCSAgICAgICB2b2lkICgqaGFuZGxlcikodm9pZCAqLCBpbnQpLCB2b2lkICpkYXRhKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jCmluZGV4IGQ0M2M0NmMuLmFjNjAxZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyYXBoLmMKQEAgLTEyMCw3MCArMTIwLDYyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1udjUwX2dyYXBoX2luaXRfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQl1aW50MzJfdCBwbWNfZSA9IE5WX1BNQ19FTkFCTEVfUEdSQVBIIHwgKDEgPDwgMjEpOwotCU5WX0RFQlVHKGRldiwgIlxuIik7Ci0KLQludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmIH5wbWNfZSk7Ci0JbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfCAgcG1jX2UpOwotfQotCi1zdGF0aWMgdm9pZAotbnY1MF9ncmFwaF9pbml0X2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlOVl9ERUJVRyhkZXYsICJcbiIpOwotCi0JbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4ZmZmZmZmZmYpOwotCW52X3dyMzIoZGV2LCAweDQwMDEzOCwgMHhmZmZmZmZmZik7Ci0JbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0lOVFJfRU4sIDB4ZmZmZmZmZmYpOwotfQotCi1zdGF0aWMgdm9pZAotbnY1MF9ncmFwaF9pbml0X3JlZ3NfX252KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50CitudjUwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHVuaXRzID0gbnZfcmQzMihkZXYsIDB4MTU0MCk7CisJc3RydWN0IG52NTBfZ3JhcGhfZW5naW5lICpwZ3JhcGggPSBudl9lbmdpbmUoZGV2LCBlbmdpbmUpOworCXUzMiB1bml0cyA9IG52X3JkMzIoZGV2LCAweDAwMTU0MCk7CiAJaW50IGk7CiAKIAlOVl9ERUJVRyhkZXYsICJcbiIpOwogCisJLyogbWFzdGVyIHJlc2V0ICovCisJbnZfbWFzayhkZXYsIDB4MDAwMjAwLCAweDAwMjAxMDAwLCAweDAwMDAwMDAwKTsKKwludl9tYXNrKGRldiwgMHgwMDAyMDAsIDB4MDAyMDEwMDAsIDB4MDAyMDEwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDA4YywgMHgwMDAwMDAwNCk7IC8qIEhXX0NUWF9TV0lUQ0hfRU5BQkxFRCAqLworCisJLyogcmVzZXQvZW5hYmxlIHRyYXBzIGFuZCBpbnRlcnJ1cHRzICovCiAJbnZfd3IzMihkZXYsIDB4NDAwODA0LCAweGMwMDAwMDAwKTsKIAludl93cjMyKGRldiwgMHg0MDY4MDAsIDB4YzAwMDAwMDApOwogCW52X3dyMzIoZGV2LCAweDQwMGMwNCwgMHhjMDAwMDAwMCk7CiAJbnZfd3IzMihkZXYsIDB4NDAxODAwLCAweGMwMDAwMDAwKTsKIAludl93cjMyKGRldiwgMHg0MDUwMTgsIDB4YzAwMDAwMDApOwogCW52X3dyMzIoZGV2LCAweDQwMjAwMCwgMHhjMDAwMDAwMCk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlpZiAodW5pdHMgJiAxIDw8IGkpIHsKLQkJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4YTApIHsKLQkJCQludl93cjMyKGRldiwgMHg0MDg5MDAgKyAoaSA8PCAxMiksIDB4YzAwMDAwMDApOwotCQkJCW52X3dyMzIoZGV2LCAweDQwOGUwOCArIChpIDw8IDEyKSwgMHhjMDAwMDAwMCk7Ci0JCQkJbnZfd3IzMihkZXYsIDB4NDA4MzE0ICsgKGkgPDwgMTIpLCAweGMwMDAwMDAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbnZfd3IzMihkZXYsIDB4NDA4NjAwICsgKGkgPDwgMTEpLCAweGMwMDAwMDAwKTsKLQkJCQludl93cjMyKGRldiwgMHg0MDg3MDggKyAoaSA8PCAxMSksIDB4YzAwMDAwMDApOwotCQkJCW52X3dyMzIoZGV2LCAweDQwODMxYyArIChpIDw8IDExKSwgMHhjMDAwMDAwMCk7Ci0JCQl9CisJCWlmICghKHVuaXRzICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisKKwkJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHhhMCkgeworCQkJbnZfd3IzMihkZXYsIDB4NDA4OTAwICsgKGkgPDwgMTIpLCAweGMwMDAwMDAwKTsKKwkJCW52X3dyMzIoZGV2LCAweDQwOGUwOCArIChpIDw8IDEyKSwgMHhjMDAwMDAwMCk7CisJCQludl93cjMyKGRldiwgMHg0MDgzMTQgKyAoaSA8PCAxMiksIDB4YzAwMDAwMDApOworCQl9IGVsc2UgeworCQkJbnZfd3IzMihkZXYsIDB4NDA4NjAwICsgKGkgPDwgMTEpLCAweGMwMDAwMDAwKTsKKwkJCW52X3dyMzIoZGV2LCAweDQwODcwOCArIChpIDw8IDExKSwgMHhjMDAwMDAwMCk7CisJCQludl93cjMyKGRldiwgMHg0MDgzMWMgKyAoaSA8PCAxMSksIDB4YzAwMDAwMDApOwogCQl9CiAJfQogCiAJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweGZmZmZmZmZmKTsKLQotCW52X3dyMzIoZGV2LCAweDQwMDgyNCwgMHgwMDAwNDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMTM4LCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDAxMDAsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwMDEzYywgMHhmZmZmZmZmZik7CiAJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAweDAwMDEwMDAxKTsKLX0KIAotc3RhdGljIHZvaWQKLW52NTBfZ3JhcGhfaW5pdF96Y3VsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IGk7CisJLyogdXBsb2FkIGNvbnRleHQgcHJvZ3JhbSwgaW5pdGlhbGlzZSBjdHhjdGwgZGVmYXVsdHMgKi8KKwludl93cjMyKGRldiwgMHg0MDAzMjQsIDB4MDAwMDAwMDApOworCWZvciAoaSA9IDA7IGkgPCBwZ3JhcGgtPmN0eHByb2dfc2l6ZTsgaSsrKQorCQludl93cjMyKGRldiwgMHg0MDAzMjgsIHBncmFwaC0+Y3R4cHJvZ1tpXSk7CisJbnZfd3IzMihkZXYsIDB4NDAwODI0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDA4MjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDgyYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwODMwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDA3MjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDMyYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMzIwLCA0KTsJLyogQ1RYQ1RMX0NNRCA9IE5FV0NUWERNQSAqLwogCi0JTlZfREVCVUcoZGV2LCAiXG4iKTsKLQorCS8qIHNvbWUgdW5rbm93biB6Y3VsbCBtYWdpYyAqLwogCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQgJiAweGYwKSB7CiAJY2FzZSAweDUwOgogCWNhc2UgMHg4MDoKQEAgLTIxMiw0MyArMjA0LDcgQEAKIAkJbnZfd3IzMihkZXYsIDB4NDAyYzI4ICsgKGkgKiA4KSwgMHgwMDAwMDAwMCk7CiAJCW52X3dyMzIoZGV2LCAweDQwMmMyYyArIChpICogOCksIDB4MDAwMDAwMDApOwogCX0KLX0KIAotc3RhdGljIGludAotbnY1MF9ncmFwaF9pbml0X2N0eGN0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBudjUwX2dyYXBoX2VuZ2luZSAqcGdyYXBoID0gbnZfZW5naW5lKGRldiwgTlZPQkpfRU5HSU5FX0dSKTsKLQlpbnQgaTsKLQotCU5WX0RFQlVHKGRldiwgIlxuIik7Ci0KLQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX0lOREVYLCAwKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGdyYXBoLT5jdHhwcm9nX3NpemU7IGkrKykKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9EQVRBLCBwZ3JhcGgtPmN0eHByb2dbaV0pOwotCi0JbnZfd3IzMihkZXYsIDB4NDAwMDhjLCAweDAwMDAwMDA0KTsgLyogSFdfQ1RYX1NXSVRDSF9FTkFCTEVEICovCi0JbnZfd3IzMihkZXYsIDB4NDAwMzIwLCA0KTsKLQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUiwgMCk7Ci0JbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1BPSU5URVIsIDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1udjUwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKLXsKLQlpbnQgcmV0OwotCi0JTlZfREVCVUcoZGV2LCAiXG4iKTsKLQotCW52NTBfZ3JhcGhfaW5pdF9yZXNldChkZXYpOwotCW52NTBfZ3JhcGhfaW5pdF9yZWdzX19udihkZXYpOwotCW52NTBfZ3JhcGhfaW5pdF96Y3VsbChkZXYpOwotCi0JcmV0ID0gbnY1MF9ncmFwaF9pbml0X2N0eGN0bChkZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQludjUwX2dyYXBoX2luaXRfaW50cihkZXYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyY3R4LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyY3R4LmMKaW5kZXggZGU5YWJmZi4uNGI0NmQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmN0eC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JjdHguYwpAQCAtNDAsNiArNDAsMTIgQEAKICNkZWZpbmUgQ1BfRkxBR19VTkswQiAgICAgICAgICAgICAgICAgKCgwICogMzIpICsgMHhiKQogI2RlZmluZSBDUF9GTEFHX1VOSzBCX0NMRUFSICAgICAgICAgICAwCiAjZGVmaW5lIENQX0ZMQUdfVU5LMEJfU0VUICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1BfRkxBR19YRkVSX1NXSVRDSCAgICAgICAgICAgKCgwICogMzIpICsgMHhlKQorI2RlZmluZSBDUF9GTEFHX1hGRVJfU1dJVENIX0RJU0FCTEUgICAwCisjZGVmaW5lIENQX0ZMQUdfWEZFUl9TV0lUQ0hfRU5BQkxFICAgIDEKKyNkZWZpbmUgQ1BfRkxBR19TVEFURSAgICAgICAgICAgICAgICAgKCgwICogMzIpICsgMHgxYykKKyNkZWZpbmUgQ1BfRkxBR19TVEFURV9TVE9QUEVEICAgICAgICAgMAorI2RlZmluZSBDUF9GTEFHX1NUQVRFX1JVTk5JTkcgICAgICAgICAxCiAjZGVmaW5lIENQX0ZMQUdfVU5LMUQgICAgICAgICAgICAgICAgICgoMCAqIDMyKSArIDB4MWQpCiAjZGVmaW5lIENQX0ZMQUdfVU5LMURfQ0xFQVIgICAgICAgICAgIDAKICNkZWZpbmUgQ1BfRkxBR19VTksxRF9TRVQgICAgICAgICAgICAgMQpAQCAtMTk0LDYgKzIwMCw5IEBACiAJCQkJICAgInRoZSBkZXZzLlxuIik7CiAJCXJldHVybiAtRU5PU1lTOwogCX0KKworCWNwX3NldCAoY3R4LCBTVEFURSwgUlVOTklORyk7CisJY3Bfc2V0IChjdHgsIFhGRVJfU1dJVENILCBFTkFCTEUpOwogCS8qIGRlY2lkZSB3aGV0aGVyIHdlJ3JlIGxvYWRpbmcvdW5sb2FkaW5nIHRoZSBjb250ZXh0ICovCiAJY3BfYnJhIChjdHgsIEFVVE9fU0FWRSwgUEVORElORywgY3Bfc2V0dXBfc2F2ZSk7CiAJY3BfYnJhIChjdHgsIFVTRVJfU0FWRSwgUEVORElORywgY3Bfc2V0dXBfc2F2ZSk7CkBAIC0yNjAsNiArMjY5LDggQEAKIAljcF9uYW1lKGN0eCwgY3BfZXhpdCk7CiAJY3Bfc2V0IChjdHgsIFVTRVJfU0FWRSwgTk9UX1BFTkRJTkcpOwogCWNwX3NldCAoY3R4LCBVU0VSX0xPQUQsIE5PVF9QRU5ESU5HKTsKKwljcF9zZXQgKGN0eCwgWEZFUl9TV0lUQ0gsIERJU0FCTEUpOworCWNwX3NldCAoY3R4LCBTVEFURSwgU1RPUFBFRCk7CiAJY3Bfb3V0IChjdHgsIENQX0VORCk7CiAJY3R4LT5jdHh2YWxzX3BvcyArPSAweDQwMDsgLyogcGFkZGluZy4uLiBubyBpZGVhIHdoeSB5b3UgbmVlZCBpdCAqLwogCkBAIC01OTAsNyArNjAxLDcgQEAKIAkJCQkJZ3JfZGVmKGN0eCwgb2Zmc2V0ICsgMHgxYywgMHgwMDg4MDAwMCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMHg4NjoKLQkJCQkJZ3JfZGVmKGN0eCwgb2Zmc2V0ICsgMHgxYywgMHgwMDhjMDAwMCk7CisJCQkJCWdyX2RlZihjdHgsIG9mZnNldCArIDB4MWMsIDB4MDE4YzAwMDApOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDB4OTI6CiAJCQkJY2FzZSAweDk2OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9wbS5jCmluZGV4IDhhMjgxMDAuLjNkNWE4NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3BtLmMKQEAgLTExNSwxNSArMTE1LDE1IEBACiAJICAgIEJJVF9NLnZlcnNpb24gPT0gMSAmJiBCSVRfTS5sZW5ndGggPj0gMHgwYikgewogCQlzY3JpcHQgPSBST00xNihCSVRfTS5kYXRhWzB4MDVdKTsKIAkJaWYgKHNjcmlwdCkKLQkJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgTlVMTCk7CisJCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIE5VTEwsIC0xKTsKIAkJc2NyaXB0ID0gUk9NMTYoQklUX00uZGF0YVsweDA3XSk7CiAJCWlmIChzY3JpcHQpCi0JCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIE5VTEwpOworCQkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBOVUxMLCAtMSk7CiAJCXNjcmlwdCA9IFJPTTE2KEJJVF9NLmRhdGFbMHgwOV0pOwogCQlpZiAoc2NyaXB0KQotCQkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBOVUxMKTsKKwkJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgTlVMTCwgLTEpOwogCi0JCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHBlcmZsdmwtPm1lbXNjcmlwdCwgTlVMTCk7CisJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHBlcmZsdmwtPm1lbXNjcmlwdCwgTlVMTCwgLTEpOwogCX0KIAogCWlmIChzdGF0ZS0+dHlwZSA9PSBQTExfTUVNT1JZKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3Nvci5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9zb3IuYwppbmRleCBmZmU4YjQ4Li4yNjMzYWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3Nvci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfc29yLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKSB7CiAJCQl1OCBzdGF0dXMgPSBEUF9TRVRfUE9XRVJfRDA7CiAJCQlub3V2ZWF1X2RwX2F1eGNoKGF1eGNoLCA4LCBEUF9TRVRfUE9XRVIsICZzdGF0dXMsIDEpOwotCQkJbm91dmVhdV9kcF9saW5rX3RyYWluKGVuY29kZXIpOworCQkJbm91dmVhdV9kcF9saW5rX3RyYWluKGVuY29kZXIsIG52X2VuY29kZXItPmRwLmRhdGFyYXRlKTsKIAkJfSBlbHNlIHsKIAkJCXU4IHN0YXR1cyA9IERQX1NFVF9QT1dFUl9EMzsKIAkJCW5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDgsIERQX1NFVF9QT1dFUiwgJnN0YXR1cywgMSk7CkBAIC0xODcsMTQgKzE4NywxMyBAQAogCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yOwogCXVpbnQzMl90IG1vZGVfY3RsID0gMDsKIAlpbnQgcmV0OwogCiAJTlZfREVCVUdfS01TKGRldiwgIm9yICVkIHR5cGUgJWQgLT4gY3J0YyAlZFxuIiwKIAkJICAgICBudl9lbmNvZGVyLT5vciwgbnZfZW5jb2Rlci0+ZGNiLT50eXBlLCBjcnRjLT5pbmRleCk7CiAKLQludjUwX3Nvcl9kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOwotCiAJc3dpdGNoIChudl9lbmNvZGVyLT5kY2ItPnR5cGUpIHsKIAljYXNlIE9VVFBVVF9UTURTOgogCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT5zb3Jjb25mLmxpbmsgJiAxKSB7CkBAIC0yMDYsNyArMjA1LDE1IEBACiAJCQltb2RlX2N0bCA9IDB4MDIwMDsKIAkJYnJlYWs7CiAJY2FzZSBPVVRQVVRfRFA6Ci0JCW1vZGVfY3RsIHw9IChudl9lbmNvZGVyLT5kcC5tY191bmtub3duIDw8IDE2KTsKKwkJbnZfY29ubmVjdG9yID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7CisJCWlmIChudl9jb25uZWN0b3IgJiYgbnZfY29ubmVjdG9yLT5iYXNlLmRpc3BsYXlfaW5mby5icGMgPT0gNikgeworCQkJbnZfZW5jb2Rlci0+ZHAuZGF0YXJhdGUgPSBjcnRjLT5tb2RlLT5jbG9jayAqIDE4IC8gODsKKwkJCW1vZGVfY3RsIHw9IDB4MDAwMjAwMDA7CisJCX0gZWxzZSB7CisJCQludl9lbmNvZGVyLT5kcC5kYXRhcmF0ZSA9IGNydGMtPm1vZGUtPmNsb2NrICogMjQgLyA4OworCQkJbW9kZV9jdGwgfD0gMHgwMDA1MDAwMDsKKwkJfQorCiAJCWlmIChudl9lbmNvZGVyLT5kY2ItPnNvcmNvbmYubGluayAmIDEpCiAJCQltb2RlX2N0bCB8PSAweDAwMDAwODAwOwogCQllbHNlCkBAIC0yMjcsNiArMjM0LDggQEAKIAlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQykKIAkJbW9kZV9jdGwgfD0gTlY1MF9FVk9fU09SX01PREVfQ1RSTF9OVlNZTkM7CiAKKwludjUwX3Nvcl9kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOworCiAJcmV0ID0gUklOR19TUEFDRShldm8sIDIpOwogCWlmIChyZXQpIHsKIAkJTlZfRVJST1IoZGV2LCAibm8gc3BhY2Ugd2hpbGUgY29ubmVjdGluZyBTT1JcbiIpOwpAQCAtMzEzLDMxICszMjIsNiBAQAogCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gZW50cnktPmhlYWRzOwogCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CiAKLQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9EUCkgewotCQlpbnQgb3IgPSBudl9lbmNvZGVyLT5vciwgbGluayA9ICEoZW50cnktPmRwY29uZi5zb3IubGluayAmIDEpOwotCQl1aW50MzJfdCB0bXA7Ci0KLQkJdG1wID0gbnZfcmQzMihkZXYsIDB4NjFjNzAwICsgKG9yICogMHg4MDApKTsKLQkJaWYgKCF0bXApCi0JCQl0bXAgPSBudl9yZDMyKGRldiwgMHg2MTA3OTggKyAob3IgKiA4KSk7Ci0KLQkJc3dpdGNoICgodG1wICYgMHgwMDAwMGYwMCkgPj4gOCkgewotCQljYXNlIDg6Ci0JCWNhc2UgOToKLQkJCW52X2VuY29kZXItPmRwLm1jX3Vua25vd24gPSAodG1wICYgMHgwMDBmMDAwMCkgPj4gMTY7Ci0JCQl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluaykpOwotCQkJbnZfZW5jb2Rlci0+ZHAudW5rMCA9IHRtcCAmIDB4MDAwMDAxZmM7Ci0JCQl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTI4KG9yLCBsaW5rKSk7Ci0JCQludl9lbmNvZGVyLT5kcC51bmsxID0gdG1wICYgMHgwMTBmN2YzZjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoIW52X2VuY29kZXItPmRwLm1jX3Vua25vd24pCi0JCQludl9lbmNvZGVyLT5kcC5tY191bmtub3duID0gNTsKLQl9Ci0KIAlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfdnJhbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF92cmFtLmMKaW5kZXggYWYzMmRhZS4uMmU0NWU1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF92cmFtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF92cmFtLmMKQEAgLTUxLDcgKzUxLDcgQEAKIG52NTBfdnJhbV9kZWwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfbWVtICoqcG1lbSkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X21tICptbSA9IGRldl9wcml2LT5lbmdpbmUudnJhbS5tbTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0gPSAmZGV2X3ByaXYtPmVuZ2luZS52cmFtLm1tOwogCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnRoaXM7CiAJc3RydWN0IG5vdXZlYXVfbWVtICptZW07CiAKQEAgLTgyLDcgKzgyLDcgQEAKIAkgICAgICB1MzIgbWVtdHlwZSwgc3RydWN0IG5vdXZlYXVfbWVtICoqcG1lbSkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X21tICptbSA9IGRldl9wcml2LT5lbmdpbmUudnJhbS5tbTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0gPSAmZGV2X3ByaXYtPmVuZ2luZS52cmFtLm1tOwogCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnI7CiAJc3RydWN0IG5vdXZlYXVfbWVtICptZW07CiAJaW50IGNvbXAgPSAobWVtdHlwZSAmIDB4MzAwKSA+PiA4OwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJY29sYml0cyAgPSAgKHI0ICYgMHgwMDAwZjAwMCkgPj4gMTI7CiAJcm93Yml0c2EgPSAoKHI0ICYgMHgwMDBmMDAwMCkgPj4gMTYpICsgODsKIAlyb3diaXRzYiA9ICgocjQgJiAweDAwZjAwMDAwKSA+PiAyMCkgKyA4OwotCWJhbmtzICAgID0gKChyNCAmIDB4MDEwMDAwMDApID8gOCA6IDQpOworCWJhbmtzICAgID0gMSA8PCAoKChyNCAmIDB4MDMwMDAwMDApID4+IDI0KSArIDIpOwogCiAJcm93c2l6ZSA9IHBhcnRzICogYmFua3MgKiAoMSA8PCBjb2xiaXRzKSAqIDg7CiAJcHJlZGljdGVkID0gcm93c2l6ZSA8PCByb3diaXRzYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YTNfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YTNfcG0uYwppbmRleCBlNGIyYjllLi42MThjMTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmEzX3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZhM19wbS5jCkBAIC0yNywxNzggKzI3LDMxNiBAQAogI2luY2x1ZGUgIm5vdXZlYXVfYmlvcy5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcG0uaCIKIAotLyogVGhpcyBpcyBhY3R1YWxseSBhIGxvdCBtb3JlIGNvbXBsZXggdGhhbiBpdCBhcHBlYXJzIGhlcmUsIGJ1dCBob3BlZnVsbHkKLSAqIHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gZGVhbCB3aXRoIHdoYXQgdGhlIFZCSU9TIGxlYXZlcyBmb3IgdXMuLgotICoKLSAqIElmIG5vdCwgd2VsbCwgSSdsbCBqdW1wIG9mZiB0aGF0IGJyaWRnZSB3aGVuIEkgY29tZSB0byBpdC4KLSAqLworc3RhdGljIHUzMiByZWFkX2NsayhzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIGJvb2wpOworc3RhdGljIHUzMiByZWFkX3BsbChzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHUzMik7CiAKLXN0cnVjdCBudmEzX3BtX3N0YXRlIHsKLQllbnVtIHBsbF90eXBlcyB0eXBlOwotCXUzMiBzcmMwOwotCXUzMiBzcmMxOwotCXUzMiBjdHJsOwotCXUzMiBjb2VmOwotCXUzMiBvbGRfcG5tOwotCXUzMiBuZXdfcG5tOwotCXUzMiBuZXdfZGl2Oworc3RhdGljIHUzMgorcmVhZF92Y28oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNsaykKK3sKKwl1MzIgc2N0bCA9IG52X3JkMzIoZGV2LCAweDQxMjAgKyAoY2xrICogNCkpOworCWlmICgoc2N0bCAmIDB4MDAwMDAwMzApICE9IDB4MDAwMDAwMzApCisJCXJldHVybiByZWFkX3BsbChkZXYsIDB4NDEsIDB4MDBlODIwKTsKKwlyZXR1cm4gcmVhZF9wbGwoZGV2LCAweDQyLCAweDAwZThhMCk7Cit9CisKK3N0YXRpYyB1MzIKK3JlYWRfY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjbGssIGJvb2wgaWdub3JlX2VuKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHNjdGwsIHNkaXYsIHNjbGs7CisKKwkvKiByZWZjbGsgZm9yIHRoZSAweGU4eHggcGxscyBpcyBhIGZpeGVkIGZyZXF1ZW5jeSAqLworCWlmIChjbGsgPj0gMHg0MCkgeworCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHhhZikgeworCQkJLyogbm8gam9rZS4uIHNlcmlvdXNseS4uIHNpZ2guLiAqLworCQkJcmV0dXJuIG52X3JkMzIoZGV2LCAweDAwNDcxYykgKiAxMDAwOworCQl9CisKKwkJcmV0dXJuIGRldl9wcml2LT5jcnlzdGFsOworCX0KKworCXNjdGwgPSBudl9yZDMyKGRldiwgMHg0MTIwICsgKGNsayAqIDQpKTsKKwlpZiAoIWlnbm9yZV9lbiAmJiAhKHNjdGwgJiAweDAwMDAwMTAwKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHNjdGwgJiAweDAwMDAzMDAwKSB7CisJY2FzZSAweDAwMDAwMDAwOgorCQlyZXR1cm4gZGV2X3ByaXYtPmNyeXN0YWw7CisJY2FzZSAweDAwMDAyMDAwOgorCQlpZiAoc2N0bCAmIDB4MDAwMDAwNDApCisJCQlyZXR1cm4gMTA4MDAwOworCQlyZXR1cm4gMTAwMDAwOworCWNhc2UgMHgwMDAwMzAwMDoKKwkJc2NsayA9IHJlYWRfdmNvKGRldiwgY2xrKTsKKwkJc2RpdiA9ICgoc2N0bCAmIDB4MDAzZjAwMDApID4+IDE2KSArIDI7CisJCXJldHVybiAoc2NsayAqIDIpIC8gc2RpdjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB1MzIKK3JlYWRfcGxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjbGssIHUzMiBwbGwpCit7CisJdTMyIGN0cmwgPSBudl9yZDMyKGRldiwgcGxsICsgMCk7CisJdTMyIHNjbGsgPSAwLCBQID0gMSwgTiA9IDEsIE0gPSAxOworCisJaWYgKCEoY3RybCAmIDB4MDAwMDAwMDgpKSB7CisJCWlmIChjdHJsICYgMHgwMDAwMDAwMSkgeworCQkJdTMyIGNvZWYgPSBudl9yZDMyKGRldiwgcGxsICsgNCk7CisJCQlNID0gKGNvZWYgJiAweDAwMDAwMGZmKSA+PiAwOworCQkJTiA9IChjb2VmICYgMHgwMDAwZmYwMCkgPj4gODsKKwkJCVAgPSAoY29lZiAmIDB4MDAzZjAwMDApID4+IDE2OworCisJCQkvKiBubyBwb3N0LWRpdmlkZXIgb24gdGhlc2UuLiAqLworCQkJaWYgKChwbGwgJiAweDAwZmYwMCkgPT0gMHgwMGU4MDApCisJCQkJUCA9IDE7CisKKwkJCXNjbGsgPSByZWFkX2NsayhkZXYsIDB4MDAgKyBjbGssIGZhbHNlKTsKKwkJfQorCX0gZWxzZSB7CisJCXNjbGsgPSByZWFkX2NsayhkZXYsIDB4MTAgKyBjbGssIGZhbHNlKTsKKwl9CisKKwlyZXR1cm4gc2NsayAqIE4gLyAoTSAqIFApOworfQorCitzdHJ1Y3QgY3JlZyB7CisJdTMyIGNsazsKKwl1MzIgcGxsOwogfTsKIAogc3RhdGljIGludAotbnZhM19wbV9wbGxfb2Zmc2V0KHUzMiBpZCkKK2NhbGNfY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjbGssIHUzMiBwbGwsIHUzMiBraHosIHN0cnVjdCBjcmVnICpyZWcpCiB7Ci0Jc3RhdGljIGNvbnN0IHUzMiBwbGxfbWFwW10gPSB7Ci0JCTB4MDAsIFBMTF9DT1JFLAotCQkweDAxLCBQTExfU0hBREVSLAotCQkweDAyLCBQTExfTUVNT1JZLAotCQkweDAwLCAweDAwCi0JfTsKLQljb25zdCB1MzIgKm1hcCA9IHBsbF9tYXA7CisJc3RydWN0IHBsbF9saW1zIGxpbWl0czsKKwl1MzIgb2Nsaywgc2Nsaywgc2RpdjsKKwlpbnQgUCwgTiwgTSwgZGlmZjsKKwlpbnQgcmV0OwogCi0Jd2hpbGUgKG1hcFsxXSkgewotCQlpZiAoaWQgPT0gbWFwWzFdKQotCQkJcmV0dXJuIG1hcFswXTsKLQkJbWFwICs9IDI7CisJcmVnLT5wbGwgPSAwOworCXJlZy0+Y2xrID0gMDsKKwlpZiAoIWtoeikgeworCQlOVl9ERUJVRyhkZXYsICJubyBjbG9jayBmb3IgMHglMDR4LzB4JTAyeFxuIiwgcGxsLCBjbGspOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gLUVOT0VOVDsKLX0KKwlzd2l0Y2ggKGtoeikgeworCWNhc2UgMjcwMDA6CisJCXJlZy0+Y2xrID0gMHgwMDAwMDEwMDsKKwkJcmV0dXJuIGtoejsKKwljYXNlIDEwMDAwMDoKKwkJcmVnLT5jbGsgPSAweDAwMDAyMTAwOworCQlyZXR1cm4ga2h6OworCWNhc2UgMTA4MDAwOgorCQlyZWctPmNsayA9IDB4MDAwMDIxNDA7CisJCXJldHVybiBraHo7CisJZGVmYXVsdDoKKwkJc2NsayA9IHJlYWRfdmNvKGRldiwgY2xrKTsKKwkJc2RpdiA9IG1pbigoc2NsayAqIDIpIC8gKGtoeiAtIDI5OTkpLCAodTMyKTY1KTsKKwkJLyogaWYgdGhlIGNsb2NrIGhhcyBhIFBMTCBhdHRhY2hlZCwgYW5kIHdlIGNhbiBnZXQgYSB3aXRoaW4KKwkJICogWy0yLCAzKSBNSHogb2YgYSBkaXZpZGVyLCB3ZSdsbCBkaXNhYmxlIHRoZSBQTEwgYW5kIHVzZQorCQkgKiB0aGUgZGl2aWRlciBpbnN0ZWFkLgorCQkgKgorCQkgKiBkaXZpZGVyIGNhbiBnbyBhcyBsb3cgYXMgMiwgbGltaXRlZCBoZXJlIGJlY2F1c2UgTlZJRElBCisJCSAqIGFuZCB0aGUgVkJJT1Mgb24gbXkgTlZBOCBzZWVtIHRvIHByZWZlciB1c2luZyB0aGUgUExMCisJCSAqIGZvciA4MTBNSHogLSBpcyB0aGVyZSBhIGdvb2QgcmVhc29uPworCQkgKi8KKwkJaWYgKHNkaXYgPiA0KSB7CisJCQlvY2xrID0gKHNjbGsgKiAyKSAvIHNkaXY7CisJCQlkaWZmID0ga2h6IC0gb2NsazsKKwkJCWlmICghcGxsIHx8IChkaWZmID49IC0yMDAwICYmIGRpZmYgPCAzMDAwKSkgeworCQkJCXJlZy0+Y2xrID0gKCgoc2RpdiAtIDIpIDw8IDE2KSB8IDB4MDAwMDMxMDApOworCQkJCXJldHVybiBvY2xrOworCQkJfQorCQl9CiAKLWludAotbnZhM19wbV9jbG9ja19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGlkKQotewotCXUzMiBzcmMwLCBzcmMxLCBjdHJsLCBjb2VmOwotCXN0cnVjdCBwbGxfbGltcyBwbGw7Ci0JaW50IHJldCwgb2ZmOwotCWludCBQLCBOLCBNOworCQlpZiAoIXBsbCkgeworCQkJTlZfRVJST1IoZGV2LCAiYmFkIGZyZXEgJTAyeDogJWQgJWRcbiIsIGNsaywga2h6LCBzY2xrKTsKKwkJCXJldHVybiAtRVJBTkdFOworCQl9CiAKLQlyZXQgPSBnZXRfcGxsX2xpbWl0cyhkZXYsIGlkLCAmcGxsKTsKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gZ2V0X3BsbF9saW1pdHMoZGV2LCBwbGwsICZsaW1pdHMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlvZmYgPSBudmEzX3BtX3BsbF9vZmZzZXQoaWQpOwotCWlmIChvZmYgPCAwKQotCQlyZXR1cm4gb2ZmOworCWxpbWl0cy5yZWZjbGsgPSByZWFkX2NsayhkZXYsIGNsayAtIDB4MTAsIHRydWUpOworCWlmICghbGltaXRzLnJlZmNsaykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcmMwID0gbnZfcmQzMihkZXYsIDB4NDEyMCArIChvZmYgKiA0KSk7Ci0Jc3JjMSA9IG52X3JkMzIoZGV2LCAweDQxNjAgKyAob2ZmICogNCkpOwotCWN0cmwgPSBudl9yZDMyKGRldiwgcGxsLnJlZyArIDApOwotCWNvZWYgPSBudl9yZDMyKGRldiwgcGxsLnJlZyArIDQpOwotCU5WX0RFQlVHKGRldiwgIlBMTCAlMDJ4OiAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCi0JCSAgICAgIGlkLCBzcmMwLCBzcmMxLCBjdHJsLCBjb2VmKTsKLQotCWlmIChjdHJsICYgMHgwMDAwMDAwOCkgewotCQl1MzIgZGl2ID0gKChzcmMxICYgMHgwMDNjMDAwMCkgPj4gMTgpICsgMTsKLQkJcmV0dXJuIChwbGwucmVmY2xrICogMikgLyBkaXY7CisJcmV0ID0gbnZhM19jYWxjX3BsbChkZXYsICZsaW1pdHMsIGtoeiwgJk4sIE5VTEwsICZNLCAmUCk7CisJaWYgKHJldCA+PSAwKSB7CisJCXJlZy0+Y2xrID0gbnZfcmQzMihkZXYsIDB4NDEyMCArIChjbGsgKiA0KSk7CisJCXJlZy0+cGxsID0gKFAgPDwgMTYpIHwgKE4gPDwgOCkgfCBNOwogCX0KLQotCVAgPSAoY29lZiAmIDB4MDAzZjAwMDApID4+IDE2OwotCU4gPSAoY29lZiAmIDB4MDAwMGZmMDApID4+IDg7Ci0JTSA9IChjb2VmICYgMHgwMDAwMDBmZik7Ci0JcmV0dXJuIHBsbC5yZWZjbGsgKiBOIC8gTSAvIFA7CisJcmV0dXJuIHJldDsKIH0KIAotdm9pZCAqCi1udmEzX3BtX2Nsb2NrX3ByZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqcGVyZmx2bCwKLQkJICB1MzIgaWQsIGludCBraHopCitzdGF0aWMgdm9pZAorcHJvZ19wbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNsaywgdTMyIHBsbCwgc3RydWN0IGNyZWcgKnJlZykKIHsKLQlzdHJ1Y3QgbnZhM19wbV9zdGF0ZSAqcGxsOwotCXN0cnVjdCBwbGxfbGltcyBsaW1pdHM7Ci0JaW50IE4sIE0sIFAsIGRpZmY7Ci0JaW50IHJldCwgb2ZmOworCWNvbnN0IHUzMiBzcmMwID0gMHgwMDQxMjAgKyAoY2xrICogNCk7CisJY29uc3QgdTMyIHNyYzEgPSAweDAwNDE2MCArIChjbGsgKiA0KTsKKwljb25zdCB1MzIgY3RybCA9IHBsbCArIDA7CisJY29uc3QgdTMyIGNvZWYgPSBwbGwgKyA0OworCXUzMiBjbnRsOwogCi0JcmV0ID0gZ2V0X3BsbF9saW1pdHMoZGV2LCBpZCwgJmxpbWl0cyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAocmV0ID09IC1FTk9FTlQpID8gTlVMTCA6IEVSUl9QVFIocmV0KTsKLQotCW9mZiA9IG52YTNfcG1fcGxsX29mZnNldChpZCk7Ci0JaWYgKGlkIDwgMCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQotCXBsbCA9IGt6YWxsb2Moc2l6ZW9mKCpwbGwpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBsbCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JcGxsLT50eXBlID0gaWQ7Ci0JcGxsLT5zcmMwID0gMHgwMDQxMjAgKyAob2ZmICogNCk7Ci0JcGxsLT5zcmMxID0gMHgwMDQxNjAgKyAob2ZmICogNCk7Ci0JcGxsLT5jdHJsID0gbGltaXRzLnJlZyArIDA7Ci0JcGxsLT5jb2VmID0gbGltaXRzLnJlZyArIDQ7Ci0KLQkvKiBJZiB0YXJnZXQgY2xvY2sgaXMgd2l0aGluIFstMiwgMykgTUh6IG9mIGEgZGl2aXNvciwgd2UnbGwKLQkgKiB1c2UgdGhhdCBpbnN0ZWFkIG9mIGNhbGN1bGF0aW5nIE1OUCB2YWx1ZXMKLQkgKi8KLQlwbGwtPm5ld19kaXYgPSBtaW4oKGxpbWl0cy5yZWZjbGsgKiAyKSAvIChraHogLSAyOTk5KSwgMTYpOwotCWlmIChwbGwtPm5ld19kaXYpIHsKLQkJZGlmZiA9IGtoeiAtICgobGltaXRzLnJlZmNsayAqIDIpIC8gcGxsLT5uZXdfZGl2KTsKLQkJaWYgKGRpZmYgPCAtMjAwMCB8fCBkaWZmID49IDMwMDApCi0JCQlwbGwtPm5ld19kaXYgPSAwOworCWlmICghcmVnLT5jbGsgJiYgIXJlZy0+cGxsKSB7CisJCU5WX0RFQlVHKGRldiwgIm5vIGNsb2NrIGZvciAlMDJ4XG4iLCBjbGspOworCQlyZXR1cm47CiAJfQogCi0JaWYgKCFwbGwtPm5ld19kaXYpIHsKLQkJcmV0ID0gbnZhM19jYWxjX3BsbChkZXYsICZsaW1pdHMsIGtoeiwgJk4sIE5VTEwsICZNLCAmUCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQotCQlwbGwtPm5ld19wbm0gPSAoUCA8PCAxNikgfCAoTiA8PCA4KSB8IE07Ci0JCXBsbC0+bmV3X2RpdiA9IDIgLSAxOworCWNudGwgPSBudl9yZDMyKGRldiwgY3RybCkgJiAweGZmZmZmZmYyOworCWlmIChyZWctPnBsbCkgeworCQludl9tYXNrKGRldiwgc3JjMCwgMHgwMDAwMDEwMSwgMHgwMDAwMDEwMSk7CisJCW52X3dyMzIoZGV2LCBjb2VmLCByZWctPnBsbCk7CisJCW52X3dyMzIoZGV2LCBjdHJsLCBjbnRsIHwgMHgwMDAwMDAxNSk7CisJCW52X21hc2soZGV2LCBzcmMxLCAweDAwMDAwMTAwLCAweDAwMDAwMDAwKTsKKwkJbnZfbWFzayhkZXYsIHNyYzEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOwogCX0gZWxzZSB7Ci0JCXBsbC0+bmV3X3BubSA9IDA7Ci0JCXBsbC0+bmV3X2Rpdi0tOworCQludl9tYXNrKGRldiwgc3JjMSwgMHgwMDNmMzE0MSwgMHgwMDAwMDEwMSB8IHJlZy0+Y2xrKTsKKwkJbnZfd3IzMihkZXYsIGN0cmwsIGNudGwgfCAweDAwMDAwMDFkKTsKKwkJbnZfbWFzayhkZXYsIGN0cmwsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCQludl9tYXNrKGRldiwgc3JjMCwgMHgwMDAwMDEwMCwgMHgwMDAwMDAwMCk7CisJCW52X21hc2soZGV2LCBzcmMwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcm9nX2NsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2xrLCBzdHJ1Y3QgY3JlZyAqcmVnKQoreworCWlmICghcmVnLT5jbGspIHsKKwkJTlZfREVCVUcoZGV2LCAibm8gY2xvY2sgZm9yICUwMnhcbiIsIGNsayk7CisJCXJldHVybjsKIAl9CiAKLQlpZiAoKG52X3JkMzIoZGV2LCBwbGwtPnNyYzEpICYgMHgwMDAwMDEwMSkgIT0gMHgwMDAwMDEwMSkKLQkJcGxsLT5vbGRfcG5tID0gbnZfcmQzMihkZXYsIHBsbC0+Y29lZik7Ci0JcmV0dXJuIHBsbDsKKwludl9tYXNrKGRldiwgMHgwMDQxMjAgKyAoY2xrICogNCksIDB4MDAzZjMxNDEsIDB4MDAwMDAxMDEgfCByZWctPmNsayk7Cit9CisKK2ludAorbnZhM19wbV9jbG9ja3NfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICpwZXJmbHZsKQoreworCXBlcmZsdmwtPmNvcmUgICA9IHJlYWRfcGxsKGRldiwgMHgwMCwgMHg0MjAwKTsKKwlwZXJmbHZsLT5zaGFkZXIgPSByZWFkX3BsbChkZXYsIDB4MDEsIDB4NDIyMCk7CisJcGVyZmx2bC0+bWVtb3J5ID0gcmVhZF9wbGwoZGV2LCAweDAyLCAweDQwMDApOworCXBlcmZsdmwtPnVua2EwICA9IHJlYWRfY2xrKGRldiwgMHgyMCwgZmFsc2UpOworCXBlcmZsdmwtPnZkZWMgICA9IHJlYWRfY2xrKGRldiwgMHgyMSwgZmFsc2UpOworCXBlcmZsdmwtPmRhZW1vbiA9IHJlYWRfY2xrKGRldiwgMHgyNSwgZmFsc2UpOworCXBlcmZsdmwtPmNvcHkgICA9IHBlcmZsdmwtPmNvcmU7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBudmEzX3BtX3N0YXRlIHsKKwlzdHJ1Y3QgY3JlZyBuY2xrOworCXN0cnVjdCBjcmVnIHNjbGs7CisJc3RydWN0IGNyZWcgbWNsazsKKwlzdHJ1Y3QgY3JlZyB2ZGVjOworCXN0cnVjdCBjcmVnIHVua2EwOworfTsKKwordm9pZCAqCitudmEzX3BtX2Nsb2Nrc19wcmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKnBlcmZsdmwpCit7CisJc3RydWN0IG52YTNfcG1fc3RhdGUgKmluZm87CisJaW50IHJldDsKKworCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyZXQgPSBjYWxjX2NsayhkZXYsIDB4MTAsIDB4NDIwMCwgcGVyZmx2bC0+Y29yZSwgJmluZm8tPm5jbGspOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGNhbGNfY2xrKGRldiwgMHgxMSwgMHg0MjIwLCBwZXJmbHZsLT5zaGFkZXIsICZpbmZvLT5zY2xrKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBjYWxjX2NsayhkZXYsIDB4MTIsIDB4NDAwMCwgcGVyZmx2bC0+bWVtb3J5LCAmaW5mby0+bWNsayk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gY2FsY19jbGsoZGV2LCAweDIwLCAweDAwMDAsIHBlcmZsdmwtPnVua2EwLCAmaW5mby0+dW5rYTApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGNhbGNfY2xrKGRldiwgMHgyMSwgMHgwMDAwLCBwZXJmbHZsLT52ZGVjLCAmaW5mby0+dmRlYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCitvdXQ6CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoaW5mbyk7CisJCWluZm8gPSBFUlJfUFRSKHJldCk7CisJfQorCXJldHVybiBpbmZvOworfQorCitzdGF0aWMgYm9vbAorbnZhM19wbV9ncmNwX2lkbGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGF0YTsKKworCWlmICghKG52X3JkMzIoZGV2LCAweDQwMDMwNCkgJiAweDAwMDAwMDAxKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKG52X3JkMzIoZGV2LCAweDQwMDMwOCkgPT0gMHgwMDUwMDAxYykKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkCi1udmEzX3BtX2Nsb2NrX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpwcmVfc3RhdGUpCitudmEzX3BtX2Nsb2Nrc19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqcHJlX3N0YXRlKQogewotCXN0cnVjdCBudmEzX3BtX3N0YXRlICpwbGwgPSBwcmVfc3RhdGU7Ci0JdTMyIGN0cmwgPSAwOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YTNfcG1fc3RhdGUgKmluZm8gPSBwcmVfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIEZvciB0aGUgbWVtb3J5IGNsb2NrLCBOVklESUEgd2lsbCBidWlsZCBhICJzY3JpcHQiIGRlc2NyaWJpbmcKLQkgKiB0aGUgcmVjbG9ja2luZyBwcm9jZXNzIGFuZCBhc2sgUERBRU1PTiB0byBleGVjdXRlIGl0LgotCSAqLwotCWlmIChwbGwtPnR5cGUgPT0gUExMX01FTU9SWSkgeworCS8qIHByZXZlbnQgYW55IG5ldyBncmN0eCBzd2l0Y2hlcyBmcm9tIHN0YXJ0aW5nICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJbnZfd3IzMihkZXYsIDB4NDAwMzI0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAzMjgsIDB4MDA1MDAwMWMpOyAvKiB3YWl0IGZsYWcgMHgxYyAqLworCS8qIHdhaXQgZm9yIGFueSBwZW5kaW5nIGdyY3R4IHN3aXRjaGVzIHRvIGNvbXBsZXRlICovCisJaWYgKCFudl93YWl0X2NiKGRldiwgbnZhM19wbV9ncmNwX2lkbGUsIGRldikpIHsKKwkJTlZfRVJST1IoZGV2LCAicG06IGN0eHByb2cgZGlkbid0IGdvIGlkbGVcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCS8qIGZyZWV6ZSBQRklGTyAqLworCW52X21hc2soZGV2LCAweDAwMjUwNCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7CisJaWYgKCFudl93YWl0KGRldiwgMHgwMDI1MDQsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTApKSB7CisJCU5WX0VSUk9SKGRldiwgInBtOiBmaWZvIGRpZG4ndCBnbyBpZGxlXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXByb2dfcGxsKGRldiwgMHgwMCwgMHgwMDQyMDAsICZpbmZvLT5uY2xrKTsKKwlwcm9nX3BsbChkZXYsIDB4MDEsIDB4MDA0MjIwLCAmaW5mby0+c2Nsayk7CisJcHJvZ19jbGsoZGV2LCAweDIwLCAmaW5mby0+dW5rYTApOworCXByb2dfY2xrKGRldiwgMHgyMSwgJmluZm8tPnZkZWMpOworCisJaWYgKGluZm8tPm1jbGsuY2xrIHx8IGluZm8tPm1jbGsucGxsKSB7CiAJCW52X3dyMzIoZGV2LCAweDEwMDIxMCwgMCk7CiAJCW52X3dyMzIoZGV2LCAweDEwMDJkYywgMSk7CiAJCW52X3dyMzIoZGV2LCAweDAwNDAxOCwgMHgwMDAwMTAwMCk7Ci0JCWN0cmwgPSAweDE4MDAwMTAwOwotCX0KLQotCWlmIChwbGwtPm9sZF9wbm0gfHwgIXBsbC0+bmV3X3BubSkgewotCQludl9tYXNrKGRldiwgcGxsLT5zcmMxLCAweDAwM2MwMTAxLCAweDAwMDAwMTAxIHwKLQkJCQkJCSAgICAocGxsLT5uZXdfZGl2IDw8IDE4KSk7Ci0JCW52X3dyMzIoZGV2LCBwbGwtPmN0cmwsIDB4MDAwMTAwMWQgfCBjdHJsKTsKLQkJbnZfbWFzayhkZXYsIHBsbC0+Y3RybCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7Ci0JfQotCi0JaWYgKHBsbC0+bmV3X3BubSkgewotCQludl9tYXNrKGRldiwgcGxsLT5zcmMwLCAweDAwMDAwMTAxLCAweDAwMDAwMTAxKTsKLQkJbnZfd3IzMihkZXYsIHBsbC0+Y29lZiwgcGxsLT5uZXdfcG5tKTsKLQkJbnZfd3IzMihkZXYsIHBsbC0+Y3RybCwgMHgwMDAxMDAxZCB8IGN0cmwpOwotCQludl9tYXNrKGRldiwgcGxsLT5jdHJsLCAweDAwMDAwMDEwLCAweDAwMDAwMDAwKTsKLQkJbnZfbWFzayhkZXYsIHBsbC0+Y3RybCwgMHgwMDAyMDAxMCwgMHgwMDAyMDAxMCk7Ci0JCW52X3dyMzIoZGV2LCBwbGwtPmN0cmwsIDB4MDAwMTAwMTUgfCBjdHJsKTsKLQkJbnZfbWFzayhkZXYsIHBsbC0+c3JjMSwgMHgwMDAwMDEwMCwgMHgwMDAwMDAwMCk7Ci0JCW52X21hc2soZGV2LCBwbGwtPnNyYzEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOwotCQlpZiAocGxsLT50eXBlID09IFBMTF9NRU1PUlkpCi0JCQludl93cjMyKGRldiwgMHg0MDE4LCAweDEwMDA1MDAwKTsKLQl9IGVsc2UgewotCQludl9tYXNrKGRldiwgcGxsLT5jdHJsLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKLQkJbnZfbWFzayhkZXYsIHBsbC0+c3JjMCwgMHgwMDAwMDEwMCwgMHgwMDAwMDAwMCk7Ci0JCW52X21hc2soZGV2LCBwbGwtPnNyYzAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOwotCQlpZiAocGxsLT50eXBlID09IFBMTF9NRU1PUlkpCi0JCQludl93cjMyKGRldiwgMHg0MDE4LCAweDEwMDBkMDAwKTsKLQl9Ci0KLQlpZiAocGxsLT50eXBlID09IFBMTF9NRU1PUlkpIHsKKwkJcHJvZ19wbGwoZGV2LCAweDAyLCAweDAwNDAwMCwgJmluZm8tPm1jbGspOworCQlpZiAobnZfcmQzMihkZXYsIDB4NDAwMCkgJiAweDAwMDAwMDA4KQorCQkJbnZfd3IzMihkZXYsIDB4MDA0MDE4LCAweDEwMDBkMDAwKTsKKwkJZWxzZQorCQkJbnZfd3IzMihkZXYsIDB4MDA0MDE4LCAweDEwMDA1MDAwKTsKIAkJbnZfd3IzMihkZXYsIDB4MTAwMmRjLCAwKTsKIAkJbnZfd3IzMihkZXYsIDB4MTAwMjEwLCAweDgwMDAwMDAwKTsKIAl9CiAKLQlrZnJlZShwbGwpOworY2xlYW51cDoKKwkvKiB1bmZyZWV6ZSBQRklGTyAqLworCW52X21hc2soZGV2LCAweDAwMjUwNCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJLyogcmVzdG9yZSBjdHhwcm9nIHRvIG5vcm1hbCAqLworCW52X3dyMzIoZGV2LCAweDQwMDMyNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMzI4LCAweDAwNzAwMDljKTsgLyogc2V0IGZsYWcgMHgxYyAqLworCS8qIHVuYmxvY2sgaXQgaWYgbmVjZXNzYXJ5ICovCisJaWYgKG52X3JkMzIoZGV2LCAweDQwMDMwOCkgPT0gMHgwMDUwMDAxYykKKwkJbnZfbWFzayhkZXYsIDB4NDAwODI0LCAweDEwMDAwMDAwLCAweDEwMDAwMDAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCWtmcmVlKGluZm8pOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZiLmMKaW5kZXggMDhlNmIxMS4uNWJmNTUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZmIuYwpAQCAtMzIsNiArMzIsMzAgQEAKIAlkbWFfYWRkcl90IHIxMDBjMTA7CiB9OwogCitzdGF0aWMgaW5saW5lIHZvaWQKK252YzBfbWZiX3N1YnBfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCB1bml0LCBpbnQgc3VicCkKK3sKKwl1MzIgc3VicF9iYXNlID0gMHgxNDEwMDAgKyAodW5pdCAqIDB4MjAwMCkgKyAoc3VicCAqIDB4NDAwKTsKKwl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCBzdWJwX2Jhc2UgKyAweDAyMCk7CisKKwlpZiAoc3RhdCkgeworCQlOVl9JTkZPKGRldiwgIlBNRkIlZF9TVUJQJWQ6IDB4JTA4eFxuIiwgdW5pdCwgc3VicCwgc3RhdCk7CisJCW52X3dyMzIoZGV2LCBzdWJwX2Jhc2UgKyAweDAyMCwgc3RhdCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbnZjMF9tZmJfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdTMyIHVuaXRzID0gbnZfcmQzMihkZXYsIDB4MDAwMTdjKTsKKwl3aGlsZSAodW5pdHMpIHsKKwkJdTMyIHN1YnAsIHVuaXQgPSBmZnModW5pdHMpIC0gMTsKKwkJZm9yIChzdWJwID0gMDsgc3VicCA8IDI7IHN1YnArKykKKwkJCW52YzBfbWZiX3N1YnBfaXNyKGRldiwgdW5pdCwgc3VicCk7CisJCXVuaXRzICY9IH4oMSA8PCB1bml0KTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkCiBudmMwX2ZiX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKQEAgLTM5LDYgKzYzLDggQEAKIAlzdHJ1Y3Qgbm91dmVhdV9mYl9lbmdpbmUgKnBmYiA9ICZkZXZfcHJpdi0+ZW5naW5lLmZiOwogCXN0cnVjdCBudmMwX2ZiX3ByaXYgKnByaXYgPSBwZmItPnByaXY7CiAKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMjUpOworCiAJaWYgKHByaXYtPnIxMDBjMTBfcGFnZSkgewogCQlwY2lfdW5tYXBfcGFnZShkZXYtPnBkZXYsIHByaXYtPnIxMDBjMTAsIFBBR0VfU0laRSwKIAkJCSAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwpAQCAtNzQsNiArMTAwLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAyNSwgbnZjMF9tZmJfaXNyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZpZm8uYwppbmRleCA2ZjlmMzQxLi5kY2JlMGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZpZm8uYwpAQCAtMzIyLDcgKzMyMiw3IEBACiAJfQogCiAJLyogUFNVQkZJRk9bbl0gKi8KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnNwb29uX25yOyBpKyspIHsKIAkJbnZfbWFzayhkZXYsIDB4MDQwMTNjICsgKGkgKiAweDIwMDApLCAweDEwMDAwMTAwLCAweDAwMDAwMDAwKTsKIAkJbnZfd3IzMihkZXYsIDB4MDQwMTA4ICsgKGkgKiAweDIwMDApLCAweGZmZmZmZmZmKTsgLyogSU5UUiAqLwogCQludl93cjMyKGRldiwgMHgwNDAxMGMgKyAoaSAqIDB4MjAwMCksIDB4ZmZmZmZlZmYpOyAvKiBJTlRSX0VOICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmMKaW5kZXggNWIyZjZmNC4uYTc0ZTUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguYwpAQCAtMjMsNiArMjMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiZHJtUC5oIgogCkBAIC0xNTYsOCArMTU3LDggQEAKIAlzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2ID0gbnZfZW5naW5lKGNoYW4tPmRldiwgTlZPQkpfRU5HSU5FX0dSKTsKIAlzdHJ1Y3QgbnZjMF9ncmFwaF9jaGFuICpncmNoID0gY2hhbi0+ZW5nY3R4W05WT0JKX0VOR0lORV9HUl07CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpID0gMCwgZ3BjLCB0cCwgcmV0OwotCXUzMiBtYWdpYzsKIAogCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIDB4MjAwMCwgMjU2LCBOVk9CSl9GTEFHX1ZNLAogCQkJCSAmZ3JjaC0+dW5rNDA4MDA0KTsKQEAgLTIwNiwxNCArMjA3LDM3IEBACiAJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDE4ODBjKTsKIAludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4ODAwMDAwMTgpOwogCi0JbWFnaWMgPSAweDAyMTgwMDAwOwotCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgwMDQwNTgzMCk7Ci0JbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCBtYWdpYyk7Ci0JZm9yIChncGMgPSAwOyBncGMgPCBwcml2LT5ncGNfbnI7IGdwYysrKSB7Ci0JCWZvciAodHAgPSAwOyB0cCA8IHByaXYtPnRwX25yW2dwY107IHRwKyssIG1hZ2ljICs9IDB4MDMyNCkgewotCQkJdTMyIHJlZyA9IDB4NTA0NTIwICsgKGdwYyAqIDB4ODAwMCkgKyAodHAgKiAweDA4MDApOwotCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCByZWcpOwotCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCBtYWdpYyk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4YzEpIHsKKwkJdTMyIG1hZ2ljID0gMHgwMjE4MDAwMDsKKwkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDA1ODMwKTsKKwkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCBtYWdpYyk7CisJCWZvciAoZ3BjID0gMDsgZ3BjIDwgcHJpdi0+Z3BjX25yOyBncGMrKykgeworCQkJZm9yICh0cCA9IDA7IHRwIDwgcHJpdi0+dHBfbnJbZ3BjXTsgdHArKykgeworCQkJCXUzMiByZWcgPSBUUF9VTklUKGdwYywgdHAsIDB4NTIwKTsKKwkJCQludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIHJlZyk7CisJCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCBtYWdpYyk7CisJCQkJbWFnaWMgKz0gMHgwMzI0OworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdTMyIG1hZ2ljID0gMHgwMjE4MDAwMDsKKwkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDA1ODMwKTsKKwkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCBtYWdpYyB8IDB4MDAwMDIxOCk7CisJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgwMDQwNjRjNCk7CisJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgwMDg2ZmZmZik7CisJCWZvciAoZ3BjID0gMDsgZ3BjIDwgcHJpdi0+Z3BjX25yOyBncGMrKykgeworCQkJZm9yICh0cCA9IDA7IHRwIDwgcHJpdi0+dHBfbnJbZ3BjXTsgdHArKykgeworCQkJCXUzMiByZWcgPSBUUF9VTklUKGdwYywgdHAsIDB4NTIwKTsKKwkJCQludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIHJlZyk7CisJCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAoMSA8PCAyOCkgfCBtYWdpYyk7CisJCQkJbWFnaWMgKz0gMHgwMzI0OworCQkJfQorCQkJZm9yICh0cCA9IDA7IHRwIDwgcHJpdi0+dHBfbnJbZ3BjXTsgdHArKykgeworCQkJCXUzMiByZWcgPSBUUF9VTklUKGdwYywgdHAsIDB4NTQ0KTsKKwkJCQludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIHJlZyk7CisJCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCBtYWdpYyk7CisJCQkJbWFnaWMgKz0gMHgwMzI0OworCQkJfQogCQl9CiAJfQogCkBAIC0zOTAsNyArNDE0LDcgQEAKIAl9CiAKIAludl93cjMyKGRldiwgR1BDX0JDQVNUKDB4MWJkNCksIG1hZ2ljZ3BjOTE4KTsKLQludl93cjMyKGRldiwgR1BDX0JDQVNUKDB4MDhhYyksIHByaXYtPnJvcF9ucik7CisJbnZfd3IzMihkZXYsIEdQQ19CQ0FTVCgweDA4YWMpLCBudl9yZDMyKGRldiwgMHgxMDA4MDApKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTcwMCwyMiArNzI0LDYgQEAKIAludl93cjMyKGRldiwgMHg0MDA1MDAsIDB4MDAwMTAwMDEpOwogfQogCi1zdGF0aWMgdm9pZAotbnZjMF9ydW5rMTQwX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXUzMiB1bml0cyA9IG52X3JkMzIoZGV2LCAweDAwMDE3YykgJiAweDFmOwotCi0Jd2hpbGUgKHVuaXRzKSB7Ci0JCXUzMiB1bml0ID0gZmZzKHVuaXRzKSAtIDE7Ci0JCXUzMiByZWcgPSAweDE0MDAwMCArIHVuaXQgKiAweDIwMDA7Ci0JCXUzMiBzdDAgPSBudl9tYXNrKGRldiwgcmVnICsgMHgxMDIwLCAwLCAwKTsKLQkJdTMyIHN0MSA9IG52X21hc2soZGV2LCByZWcgKyAweDE0MjAsIDAsIDApOwotCi0JCU5WX0RFQlVHKGRldiwgIlBSVU5LMTQwOiAlZCAweCUwOHggMHglMDh4XG4iLCB1bml0LCBzdDAsIHN0MSk7Ci0JCXVuaXRzICY9IH4oMSA8PCB1bml0KTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQKIG52YzBfZ3JhcGhfY3JlYXRlX2Z3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZ3bmFtZSwKIAkJICAgICBzdHJ1Y3QgbnZjMF9ncmFwaF9mdWMgKmZ1YykKQEAgLTc2NCw3ICs3NzIsNiBAQAogCX0KIAogCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAxMik7Ci0Jbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDI1KTsKIAogCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+dW5rNDE4OGI4KTsKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPnVuazQxODhiNCk7CkBAIC04MDMsNyArODEwLDYgQEAKIAogCU5WT0JKX0VOR0lORV9BREQoZGV2LCBHUiwgJnByaXYtPmJhc2UpOwogCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMTIsIG52YzBfZ3JhcGhfaXNyKTsKLQlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDI1LCBudmMwX3J1bmsxNDBfaXNyKTsKIAogCWlmIChub3V2ZWF1X2N0eGZ3KSB7CiAJCU5WX0lORk8oZGV2LCAiUEdSQVBIOiB1c2luZyBleHRlcm5hbCBmaXJtd2FyZVxuIik7CkBAIC04NjQsNiArODcwLDkgQEAKIAljYXNlIDB4Y2U6IC8qIDQvNC8wLzAsIDQgKi8KIAkJcHJpdi0+bWFnaWNfbm90X3JvcF9uciA9IDB4MDM7CiAJCWJyZWFrOworCWNhc2UgMHhjZjogLyogNC8wLzAvMCwgMyAqLworCQlwcml2LT5tYWdpY19ub3Rfcm9wX25yID0gMHgwMzsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKCFwcml2LT5tYWdpY19ub3Rfcm9wX25yKSB7CkBAIC04ODksMjAgKzg5OCwzIEBACiAJbnZjMF9ncmFwaF9kZXN0cm95KGRldiwgTlZPQkpfRU5HSU5FX0dSKTsKIAlyZXR1cm4gcmV0OwogfQotCi1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjMF9mdWM0MDljIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjMF9mdWM0MDlkIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjMF9mdWM0MWFjIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjMF9mdWM0MWFkIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjM19mdWM0MDljIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjM19mdWM0MDlkIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjM19mdWM0MWFjIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjM19mdWM0MWFkIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjNF9mdWM0MDljIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjNF9mdWM0MDlkIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjNF9mdWM0MWFjIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZjNF9mdWM0MWFkIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvZnVjNDA5YyIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L2Z1YzQwOWQiKTsKLU1PRFVMRV9GSVJNV0FSRSgibm91dmVhdS9mdWM0MWFjIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvZnVjNDFhZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5oCmluZGV4IDU1Njg5ZTkuLjYzNmZlOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmgKQEAgLTgyLDYgKzgyLDcgQEAKIAljYXNlIDB4YzM6CiAJY2FzZSAweGM0OgogCWNhc2UgMHhjZTogLyogZ3Vlc3MsIG1taW8gdHJhY2Ugc2hvd3Mgb25seSAweDkwOTcgc3RhdGUgKi8KKwljYXNlIDB4Y2Y6IC8qIGd1ZXNzLCBtbWlvIHRyYWNlIHNob3dzIG9ubHkgMHg5MDk3IHN0YXRlICovCiAJCXJldHVybiAweDkwOTc7CiAJY2FzZSAweGMxOgogCQlyZXR1cm4gMHg5MTk3OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmN0eC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmN0eC5jCmluZGV4IDMxMDE4ZWEuLjk2YjBiOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JjdHguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyY3R4LmMKQEAgLTE2NzgsNyArMTY3OCwxMCBAQAogCW52X3dyMzIoZGV2LCAweDQxOWMwNCwgMHgwMDAwMDAwNik7CiAJbnZfd3IzMihkZXYsIDB4NDE5YzA4LCAweDAwMDAwMDAyKTsKIAludl93cjMyKGRldiwgMHg0MTljMjAsIDB4MDAwMDAwMDApOwotCW52X3dyMzIoZGV2LCAweDQxOWNiMCwgMHgwMDA2MDA0OCk7IC8vWFhYOiAweGNlIDB4MDAwMjAwNDgKKwlpZiAoY2hpcHNldCA9PSAweGNlIHx8IGNoaXBzZXQgPT0gMHhjZikKKwkJbnZfd3IzMihkZXYsIDB4NDE5Y2IwLCAweDAwMDIwMDQ4KTsKKwllbHNlCisJCW52X3dyMzIoZGV2LCAweDQxOWNiMCwgMHgwMDA2MDA0OCk7CiAJbnZfd3IzMihkZXYsIDB4NDE5Y2U4LCAweDAwMDAwMDAwKTsKIAludl93cjMyKGRldiwgMHg0MTljZjQsIDB4MDAwMDAxODMpOwogCW52X3dyMzIoZGV2LCAweDQxOWQyMCwgY2hpcHNldCAhPSAweGMxID8gMHgwMjE4MDAwMCA6IDB4MTIxODAwMDApOwpAQCAtMTc4MywxMSArMTc4Niw3IEBACiAJbnZfd3IzMihkZXYsIDB4NDA1ODdjLCAweDAwMDAwMDAwKTsKIAogCWlmICgxKSB7Ci0JCWNvbnN0IHU4IGNoaXBzZXRfdHBfbWF4W10gPSB7IDE2LCA0LCAwLCA0LCA4LCAwLCAwLCAwLAotCQkJCQkgICAgICAxNiwgMCwgMCwgMCwgMCwgMCwgOCwgMCB9OwotCQl1OCBtYXggPSBjaGlwc2V0X3RwX21heFtkZXZfcHJpdi0+Y2hpcHNldCAmIDB4MGZdOwotCQl1OCB0cG5yW0dQQ19NQVhdOwotCQl1OCBkYXRhW1RQX01BWF07CisJCXU4IHRwbnJbR1BDX01BWF0sIGRhdGFbVFBfTUFYXTsKIAogCQltZW1jcHkodHBuciwgcHJpdi0+dHBfbnIsIHNpemVvZihwcml2LT50cF9ucikpOwogCQltZW1zZXQoZGF0YSwgMHgxZiwgc2l6ZW9mKGRhdGEpKTsKQEAgLTE4MDEsNyArMTgwMCw3IEBACiAJCQlkYXRhW3RwXSA9IGdwYzsKIAkJfQogCi0JCWZvciAoaSA9IDA7IGkgPCBtYXggLyA0OyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCQludl93cjMyKGRldiwgMHg0MDYwYTggKyAoaSAqIDQpLCAoKHUzMiAqKWRhdGEpW2ldKTsKIAl9CiAKQEAgLTE4MTMsNiArMTgxMiw3IEBACiAJCS8qIGNhbGN1bGF0ZSBmaXJzdCBzZXQgb2YgbWFnaWNzICovCiAJCW1lbWNweSh0cG5yLCBwcml2LT50cF9uciwgc2l6ZW9mKHByaXYtPnRwX25yKSk7CiAKKwkJZ3BjID0gLTE7CiAJCWZvciAodHAgPSAwOyB0cCA8IHByaXYtPnRwX3RvdGFsOyB0cCsrKSB7CiAJCQlkbyB7CiAJCQkJZ3BjID0gKGdwYyArIDEpICUgcHJpdi0+Z3BjX25yOwpAQCAtMTg2MiwzMCArMTg2MiwyNiBAQAogCiAJaWYgKDEpIHsKIAkJdTMyIHRwX21hc2sgPSAwLCB0cF9zZXQgPSAwOwotCQl1OCAgdHBucltHUENfTUFYXTsKKwkJdTggIHRwbnJbR1BDX01BWF0sIGEsIGI7CiAKIAkJbWVtY3B5KHRwbnIsIHByaXYtPnRwX25yLCBzaXplb2YocHJpdi0+dHBfbnIpKTsKIAkJZm9yIChncGMgPSAwOyBncGMgPCBwcml2LT5ncGNfbnI7IGdwYysrKQogCQkJdHBfbWFzayB8PSAoKDEgPDwgcHJpdi0+dHBfbnJbZ3BjXSkgLSAxKSA8PCAoZ3BjICogOCk7CiAKLQkJZ3BjID0gLTE7Ci0JCWZvciAoaSA9IDAsIGdwYyA9IC0xOyBpIDwgMzI7IGkrKykgewotCQkJaW50IGx0cCA9IGkgKiAocHJpdi0+dHBfdG90YWwgLSAxKSAvIDMyOworCQlmb3IgKGkgPSAwLCBncGMgPSAtMSwgYiA9IC0xOyBpIDwgMzI7IGkrKykgeworCQkJYSA9IChpICogKHByaXYtPnRwX3RvdGFsIC0gMSkpIC8gMzI7CisJCQlpZiAoYSAhPSBiKSB7CisJCQkJYiA9IGE7CisJCQkJZG8geworCQkJCQlncGMgPSAoZ3BjICsgMSkgJSBwcml2LT5ncGNfbnI7CisJCQkJfSB3aGlsZSAoIXRwbnJbZ3BjXSk7CisJCQkJdHAgPSBwcml2LT50cF9ucltncGNdIC0gdHBucltncGNdLS07CiAKLQkJCWRvIHsKLQkJCQlncGMgPSAoZ3BjICsgMSkgJSBwcml2LT5ncGNfbnI7Ci0JCQl9IHdoaWxlICghdHBucltncGNdKTsKLQkJCXRwID0gcHJpdi0+dHBfbnJbZ3BjXSAtIHRwbnJbZ3BjXS0tOworCQkJCXRwX3NldCB8PSAxIDw8ICgoZ3BjICogOCkgKyB0cCk7CisJCQl9CiAKLQkJCXRwX3NldCB8PSAxIDw8ICgoZ3BjICogOCkgKyB0cCk7Ci0KLQkJCWRvIHsKLQkJCQludl93cjMyKGRldiwgMHg0MDY4MDAgKyAoaSAqIDB4MjApLCB0cF9zZXQpOwotCQkJCXRwX3NldCBePSB0cF9tYXNrOwotCQkJCW52X3dyMzIoZGV2LCAweDQwNmMwMCArIChpICogMHgyMCksIHRwX3NldCk7Ci0JCQkJdHBfc2V0IF49IHRwX21hc2s7Ci0JCQl9IHdoaWxlIChsdHAgPT0gKCsraSAqIChwcml2LT50cF90b3RhbCAtIDEpIC8gMzIpKTsKLQkJCWktLTsKKwkJCW52X3dyMzIoZGV2LCAweDQwNjgwMCArIChpICogMHgyMCksIHRwX3NldCk7CisJCQludl93cjMyKGRldiwgMHg0MDZjMDAgKyAoaSAqIDB4MjApLCB0cF9zZXQgXiB0cF9tYXNrKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmdwYy5mdWMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyZ3BjLmZ1YwppbmRleCAwZWMyYWRkLi4wNmY1ZTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyZ3BjLmZ1YworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyZ3BjLmZ1YwpAQCAtNzcsNiArNzcsMTEgQEAKIC5iMTYgbnZjMF9ncGNfbW1pb190YWlsCiAuYjE2IG52YzBfdHBjX21taW9faGVhZAogLmIxNiBudmMzX3RwY19tbWlvX3RhaWwKKy5iOCAgMHhjZiAwIDAgMAorLmIxNiBudmMwX2dwY19tbWlvX2hlYWQKKy5iMTYgbnZjMF9ncGNfbW1pb190YWlsCisuYjE2IG52YzBfdHBjX21taW9faGVhZAorLmIxNiBudmNmX3RwY19tbWlvX3RhaWwKIC5iOCAgMCAwIDAgMAogCiAvLyBHUEMgbW1pbyBsaXN0cwpAQCAtMTM0LDggKzEzOSw5IEBACiBudmMwX3RwY19tbWlvX3RhaWw6CiBtbWN0eF9kYXRhKDB4MDAwNzU4LCAxKQogbW1jdHhfZGF0YSgweDAwMDJjNCwgMSkKLW1tY3R4X2RhdGEoMHgwMDA0YmMsIDEpCiBtbWN0eF9kYXRhKDB4MDAwNmUwLCAxKQorbnZjZl90cGNfbW1pb190YWlsOgorbW1jdHhfZGF0YSgweDAwMDRiYywgMSkKIG52YzNfdHBjX21taW9fdGFpbDoKIG1tY3R4X2RhdGEoMHgwMDA1NDQsIDEpCiBudmMxX3RwY19tbWlvX3RhaWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyZ3BjLmZ1Yy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmdwYy5mdWMuaAppbmRleCAxODk2Yzg5Li42ZjgyMDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyZ3BjLmZ1Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JncGMuZnVjLmgKQEAgLTI1LDIzICsyNSwyNiBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMGMwLAotCTB4MDExMDAwYjAsCi0JMHgwMTY0MDExNCwKKwkweDAxMWMwMGJjLAorCTB4MDE3MDAxMjAsCiAJMHgwMDAwMDBjMSwKLQkweDAxMTQwMGIwLAotCTB4MDE3ODAxMTQsCisJMHgwMTIwMDBiYywKKwkweDAxODQwMTIwLAogCTB4MDAwMDAwYzMsCi0JMHgwMTEwMDBiMCwKLQkweDAxNzQwMTE0LAorCTB4MDExYzAwYmMsCisJMHgwMTgwMDEyMCwKIAkweDAwMDAwMGM0LAotCTB4MDExMDAwYjAsCi0JMHgwMTc0MDExNCwKKwkweDAxMWMwMGJjLAorCTB4MDE4MDAxMjAsCiAJMHgwMDAwMDBjOCwKLQkweDAxMTAwMGIwLAotCTB4MDE2NDAxMTQsCisJMHgwMTFjMDBiYywKKwkweDAxNzAwMTIwLAogCTB4MDAwMDAwY2UsCi0JMHgwMTEwMDBiMCwKLQkweDAxNzQwMTE0LAorCTB4MDExYzAwYmMsCisJMHgwMTgwMDEyMCwKKwkweDAwMDAwMGNmLAorCTB4MDExYzAwYmMsCisJMHgwMTdjMDEyMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAzODAsCiAJMHgxNDAwMDQwMCwKQEAgLTkwLDggKzkzLDggQEAKIAkweDA0MDAwNzUwLAogCTB4MDAwMDA3NTgsCiAJMHgwMDAwMDJjNCwKLQkweDAwMDAwNGJjLAogCTB4MDAwMDA2ZTAsCisJMHgwMDAwMDRiYywKIAkweDAwMDAwNTQ0LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmh1Yi5mdWMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyaHViLmZ1YwppbmRleCBhMWE1OTkxLi5lNGY4YzdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyaHViLmZ1YworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyaHViLmZ1YwpAQCAtNTYsNiArNTYsOSBAQAogLmI4ICAweGNlIDAgMCAwCiAuYjE2IG52YzBfaHViX21taW9faGVhZAogLmIxNiBudmMwX2h1Yl9tbWlvX3RhaWwKKy5iOCAgMHhjZiAwIDAgMAorLmIxNiBudmMwX2h1Yl9tbWlvX2hlYWQKKy5iMTYgbnZjMF9odWJfbW1pb190YWlsCiAuYjggIDAgMCAwIDAKIAogbnZjMF9odWJfbW1pb19oZWFkOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmh1Yi5mdWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JodWIuZnVjLmgKaW5kZXggYjNiNTQxYi4uMjQxZDMyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmh1Yi5mdWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyaHViLmZ1Yy5oCkBAIC0yMywxNyArMjMsMTkgQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDBjMCwKLQkweDAxMmMwMDkwLAorCTB4MDEzNDAwOTgsCiAJMHgwMDAwMDBjMSwKLQkweDAxMzAwMDkwLAorCTB4MDEzODAwOTgsCiAJMHgwMDAwMDBjMywKLQkweDAxMmMwMDkwLAorCTB4MDEzNDAwOTgsCiAJMHgwMDAwMDBjNCwKLQkweDAxMmMwMDkwLAorCTB4MDEzNDAwOTgsCiAJMHgwMDAwMDBjOCwKLQkweDAxMmMwMDkwLAorCTB4MDEzNDAwOTgsCiAJMHgwMDAwMDBjZSwKLQkweDAxMmMwMDkwLAorCTB4MDEzNDAwOTgsCisJMHgwMDAwMDBjZiwKKwkweDAxMzQwMDk4LAogCTB4MDAwMDAwMDAsCiAJMHgwNDE3ZTkxYywKIAkweDA0NDAwMjA0LApAQCAtMTkwLDggKzE5Miw2IEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAogfTsKIAogdWludDMyX3QgbnZjMF9ncmh1Yl9jb2RlW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3BtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5YWRlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfcG0uYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9iaW9zLmgiCisjaW5jbHVkZSAibm91dmVhdV9wbS5oIgorCitzdGF0aWMgdTMyIHJlYWRfZGl2KHN0cnVjdCBkcm1fZGV2aWNlICosIGludCwgdTMyLCB1MzIpOworc3RhdGljIHUzMiByZWFkX3BsbChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1MzIpOworCitzdGF0aWMgdTMyCityZWFkX3ZjbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgZHNyYykKK3sKKwl1MzIgc3NyYyA9IG52X3JkMzIoZGV2LCBkc3JjKTsKKwlpZiAoIShzc3JjICYgMHgwMDAwMDEwMCkpCisJCXJldHVybiByZWFkX3BsbChkZXYsIDB4MDBlODAwKTsKKwlyZXR1cm4gcmVhZF9wbGwoZGV2LCAweDAwZTgyMCk7Cit9CisKK3N0YXRpYyB1MzIKK3JlYWRfcGxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBwbGwpCit7CisJdTMyIGN0cmwgPSBudl9yZDMyKGRldiwgcGxsICsgMCk7CisJdTMyIGNvZWYgPSBudl9yZDMyKGRldiwgcGxsICsgNCk7CisJdTMyIFAgPSAoY29lZiAmIDB4MDAzZjAwMDApID4+IDE2OworCXUzMiBOID0gKGNvZWYgJiAweDAwMDBmZjAwKSA+PiA4OworCXUzMiBNID0gKGNvZWYgJiAweDAwMDAwMGZmKSA+PiAwOworCXUzMiBzY2xrLCBkb2ZmOworCisJaWYgKCEoY3RybCAmIDB4MDAwMDAwMDEpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocGxsICYgMHhmZmYwMDApIHsKKwljYXNlIDB4MDBlMDAwOgorCQlzY2xrID0gMjcwMDA7CisJCVAgPSAxOworCQlicmVhazsKKwljYXNlIDB4MTM3MDAwOgorCQlkb2ZmID0gKHBsbCAtIDB4MTM3MDAwKSAvIDB4MjA7CisJCXNjbGsgPSByZWFkX2RpdihkZXYsIGRvZmYsIDB4MTM3MTIwLCAweDEzNzE0MCk7CisJCWJyZWFrOworCWNhc2UgMHgxMzIwMDA6CisJCXN3aXRjaCAocGxsKSB7CisJCWNhc2UgMHgxMzIwMDA6CisJCQlzY2xrID0gcmVhZF9wbGwoZGV2LCAweDEzMjAyMCk7CisJCQlicmVhazsKKwkJY2FzZSAweDEzMjAyMDoKKwkJCXNjbGsgPSByZWFkX2RpdihkZXYsIDAsIDB4MTM3MzIwLCAweDEzNzMzMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBzY2xrICogTiAvIE0gLyBQOworfQorCitzdGF0aWMgdTMyCityZWFkX2RpdihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZG9mZiwgdTMyIGRzcmMsIHUzMiBkY3RsKQoreworCXUzMiBzc3JjID0gbnZfcmQzMihkZXYsIGRzcmMgKyAoZG9mZiAqIDQpKTsKKwl1MzIgc2N0bCA9IG52X3JkMzIoZGV2LCBkY3RsICsgKGRvZmYgKiA0KSk7CisKKwlzd2l0Y2ggKHNzcmMgJiAweDAwMDAwMDAzKSB7CisJY2FzZSAwOgorCQlpZiAoKHNzcmMgJiAweDAwMDMwMDAwKSAhPSAweDAwMDMwMDAwKQorCQkJcmV0dXJuIDI3MDAwOworCQlyZXR1cm4gMTA4MDAwOworCWNhc2UgMjoKKwkJcmV0dXJuIDEwMDAwMDsKKwljYXNlIDM6CisJCWlmIChzY3RsICYgMHg4MDAwMDAwMCkgeworCQkJdTMyIHNjbGsgPSByZWFkX3ZjbyhkZXYsIGRzcmMgKyAoZG9mZiAqIDQpKTsKKwkJCXUzMiBzZGl2ID0gKHNjdGwgJiAweDAwMDAwMDNmKSArIDI7CisJCQlyZXR1cm4gKHNjbGsgKiAyKSAvIHNkaXY7CisJCX0KKworCQlyZXR1cm4gcmVhZF92Y28oZGV2LCBkc3JjICsgKGRvZmYgKiA0KSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdTMyCityZWFkX21lbShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXUzMiBzc2VsID0gbnZfcmQzMihkZXYsIDB4MTM3M2YwKTsKKwlpZiAoc3NlbCAmIDB4MDAwMDAwMDEpCisJCXJldHVybiByZWFkX2RpdihkZXYsIDAsIDB4MTM3MzAwLCAweDEzNzMxMCk7CisJcmV0dXJuIHJlYWRfcGxsKGRldiwgMHgxMzIwMDApOworfQorCitzdGF0aWMgdTMyCityZWFkX2NsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2xrKQoreworCXUzMiBzY3RsID0gbnZfcmQzMihkZXYsIDB4MTM3MjUwICsgKGNsayAqIDQpKTsKKwl1MzIgc3NlbCA9IG52X3JkMzIoZGV2LCAweDEzNzEwMCk7CisJdTMyIHNjbGssIHNkaXY7CisKKwlpZiAoc3NlbCAmICgxIDw8IGNsaykpIHsKKwkJaWYgKGNsayA8IDcpCisJCQlzY2xrID0gcmVhZF9wbGwoZGV2LCAweDEzNzAwMCArIChjbGsgKiAweDIwKSk7CisJCWVsc2UKKwkJCXNjbGsgPSByZWFkX3BsbChkZXYsIDB4MTM3MGUwKTsKKwkJc2RpdiA9ICgoc2N0bCAmIDB4MDAwMDNmMDApID4+IDgpICsgMjsKKwl9IGVsc2UgeworCQlzY2xrID0gcmVhZF9kaXYoZGV2LCBjbGssIDB4MTM3MTYwLCAweDEzNzFkMCk7CisJCXNkaXYgPSAoKHNjdGwgJiAweDAwMDAwMDNmKSA+PiAwKSArIDI7CisJfQorCisJaWYgKHNjdGwgJiAweDgwMDAwMDAwKQorCQlyZXR1cm4gKHNjbGsgKiAyKSAvIHNkaXY7CisJcmV0dXJuIHNjbGs7Cit9CisKK2ludAorbnZjMF9wbV9jbG9ja3NfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICpwZXJmbHZsKQoreworCXBlcmZsdmwtPnNoYWRlciA9IHJlYWRfY2xrKGRldiwgMHgwMCk7CisJcGVyZmx2bC0+Y29yZSAgID0gcGVyZmx2bC0+c2hhZGVyIC8gMjsKKwlwZXJmbHZsLT5tZW1vcnkgPSByZWFkX21lbShkZXYpOworCXBlcmZsdmwtPnJvcCAgICA9IHJlYWRfY2xrKGRldiwgMHgwMSk7CisJcGVyZmx2bC0+aHViMDcgID0gcmVhZF9jbGsoZGV2LCAweDAyKTsKKwlwZXJmbHZsLT5odWIwNiAgPSByZWFkX2NsayhkZXYsIDB4MDcpOworCXBlcmZsdmwtPmh1YjAxICA9IHJlYWRfY2xrKGRldiwgMHgwOCk7CisJcGVyZmx2bC0+Y29weSAgID0gcmVhZF9jbGsoZGV2LCAweDA5KTsKKwlwZXJmbHZsLT5kYWVtb24gPSByZWFkX2NsayhkZXYsIDB4MGMpOworCXBlcmZsdmwtPnZkZWMgICA9IHJlYWRfY2xrKGRldiwgMHgwZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3ZyYW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfdnJhbS5jCmluZGV4IGU0NWEyNGQuLmNlOTg0ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfdnJhbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfdnJhbS5jCkBAIC00Myw3ICs0Myw3IEBACiAJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIAkwLCAwLCAwLCAzLCAzLCAzLCAzLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLAogCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsCi0JMywgMywgMywgMywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMywgMywgMywKKwkzLCAzLCAzLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAzLCAzLCAzLAogCTMsIDMsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIDMsIDAsIDMsIDAsIDMsCiAJMywgMCwgMywgMywgMywgMywgMywgMCwgMCwgMywgMCwgMywgMCwgMywgMywgMCwKIAkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAwLCAxLCAxLCAwCkBAIC02MSw3ICs2MSw3IEBACiAJICAgICAgdTMyIHR5cGUsIHN0cnVjdCBub3V2ZWF1X21lbSAqKnBtZW0pCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0gPSBkZXZfcHJpdi0+ZW5naW5lLnZyYW0ubW07CisJc3RydWN0IG5vdXZlYXVfbW0gKm1tID0gJmRldl9wcml2LT5lbmdpbmUudnJhbS5tbTsKIAlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpyOwogCXN0cnVjdCBub3V2ZWF1X21lbSAqbWVtOwogCWludCByZXQ7CkBAIC0xMDYsMTIgKzEwNiw1NCBAQAogCXN0cnVjdCBub3V2ZWF1X3ZyYW1fZW5naW5lICp2cmFtID0gJmRldl9wcml2LT5lbmdpbmUudnJhbTsKIAljb25zdCB1MzIgcnN2ZF9oZWFkID0gKCAyNTYgKiAxMDI0KSA+PiAxMjsgLyogdmdhIG1lbW9yeSAqLwogCWNvbnN0IHUzMiByc3ZkX3RhaWwgPSAoMTAyNCAqIDEwMjQpID4+IDEyOyAvKiB2YmlvcyBldGMgKi8KLQl1MzIgbGVuZ3RoOworCXUzMiBwYXJ0cyA9IG52X3JkMzIoZGV2LCAweDEyMWM3NCk7CisJdTMyIGJzaXplID0gbnZfcmQzMihkZXYsIDB4MTBmMjBjKTsKKwl1MzIgb2Zmc2V0LCBsZW5ndGg7CisJYm9vbCB1bmlmb3JtID0gdHJ1ZTsKKwlpbnQgcmV0LCBwYXJ0OwogCi0JZGV2X3ByaXYtPnZyYW1fc2l6ZSAgPSBudl9yZDMyKGRldiwgMHgxMGYyMGMpIDw8IDIwOwotCWRldl9wcml2LT52cmFtX3NpemUgKj0gbnZfcmQzMihkZXYsIDB4MTIxYzc0KTsKKwlOVl9ERUJVRyhkZXYsICIweDEwMDgwMDogMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHgxMDA4MDApKTsKKwlOVl9ERUJVRyhkZXYsICJwYXJ0cyAweCUwOHggYmNhc3RfbWVtX2Ftb3VudCAweCUwOHhcbiIsIHBhcnRzLCBic2l6ZSk7CiAKLQlsZW5ndGggPSAoZGV2X3ByaXYtPnZyYW1fc2l6ZSA+PiAxMikgLSByc3ZkX2hlYWQgLSByc3ZkX3RhaWw7CisJLyogcmVhZCBhbW91bnQgb2YgdnJhbSBhdHRhY2hlZCB0byBlYWNoIG1lbW9yeSBjb250cm9sbGVyICovCisJcGFydCA9IDA7CisJd2hpbGUgKHBhcnRzKSB7CisJCXUzMiBwc2l6ZSA9IG52X3JkMzIoZGV2LCAweDExMDIwYyArIChwYXJ0KysgKiAweDEwMDApKTsKKwkJaWYgKHBzaXplID09IDApCisJCQljb250aW51ZTsKKwkJcGFydHMtLTsKIAotCXJldHVybiBub3V2ZWF1X21tX2luaXQoJnZyYW0tPm1tLCByc3ZkX2hlYWQsIGxlbmd0aCwgMSk7CisJCWlmIChwc2l6ZSAhPSBic2l6ZSkgeworCQkJaWYgKHBzaXplIDwgYnNpemUpCisJCQkJYnNpemUgPSBwc2l6ZTsKKwkJCXVuaWZvcm0gPSBmYWxzZTsKKwkJfQorCisJCU5WX0RFQlVHKGRldiwgIiVkOiBtZW1fYW1vdW50IDB4JTA4eFxuIiwgcGFydCwgcHNpemUpOworCQlkZXZfcHJpdi0+dnJhbV9zaXplICs9ICh1NjQpcHNpemUgPDwgMjA7CisJfQorCisJLyogaWYgYWxsIGNvbnRyb2xsZXJzIGhhdmUgdGhlIHNhbWUgYW1vdW50IGF0dGFjaGVkLCB0aGVyZSdzIG5vIGhvbGVzICovCisJaWYgKHVuaWZvcm0pIHsKKwkJb2Zmc2V0ID0gcnN2ZF9oZWFkOworCQlsZW5ndGggPSAoZGV2X3ByaXYtPnZyYW1fc2l6ZSA+PiAxMikgLSByc3ZkX2hlYWQgLSByc3ZkX3RhaWw7CisJCXJldHVybiBub3V2ZWF1X21tX2luaXQoJnZyYW0tPm1tLCBvZmZzZXQsIGxlbmd0aCwgMSk7CisJfQorCisJLyogb3RoZXJ3aXNlLCBhZGRyZXNzIGxvd2VzdCBjb21tb24gYW1vdW50IGZyb20gMEdpQiAqLworCXJldCA9IG5vdXZlYXVfbW1faW5pdCgmdnJhbS0+bW0sIHJzdmRfaGVhZCwgKGJzaXplIDw8IDgpICogcGFydHMsIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBhbmQgdGhlIHJlc3Qgc3RhcnRpbmcgZnJvbSAoOEdpQiArIGNvbW1vbl9zaXplKSAqLworCW9mZnNldCA9ICgweDAyMDAwMDAwMDBVTEwgPj4gMTIpICsgKGJzaXplIDw8IDgpOworCWxlbmd0aCA9IChkZXZfcHJpdi0+dnJhbV9zaXplID4+IDEyKSAtIChic2l6ZSA8PCA4KSAtIHJzdmRfdGFpbDsKKworCXJldCA9IG5vdXZlYXVfbW1faW5pdCgmdnJhbS0+bW0sIG9mZnNldCwgbGVuZ3RoLCAwKTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfbW1fZmluaSgmdnJhbS0+bW0pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZkMF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmQwX2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Q2M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZkMF9kaXNwbGF5LmMKQEAgLTAsMCArMSwxNDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisjaW5jbHVkZSAibm91dmVhdV9mYi5oIgorI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorCitzdHJ1Y3QgbnZkMF9kaXNwbGF5IHsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm1lbTsKKwlzdHJ1Y3QgeworCQlkbWFfYWRkcl90IGhhbmRsZTsKKwkJdTMyICpwdHI7CisJfSBldm9bMV07CisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKKwl1MzIgbW9kZXNldDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbnZkMF9kaXNwbGF5ICoKK252ZDBfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJcmV0dXJuIGRldl9wcml2LT5lbmdpbmUuZGlzcGxheS5wcml2OworfQorCitzdGF0aWMgaW5saW5lIGludAorZXZvX2ljbWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGlkLCB1MzIgbXRoZCwgdTMyIGRhdGEpCit7CisJaW50IHJldCA9IDA7CisJbnZfbWFzayhkZXYsIDB4NjEwNzAwICsgKGlkICogMHgxMCksIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDYxMDcwNCArIChpZCAqIDB4MTApLCBkYXRhKTsKKwludl9tYXNrKGRldiwgMHg2MTA3MDQgKyAoaWQgKiAweDEwKSwgMHg4MDAwMGZmYywgMHg4MDAwMDAwMCB8IG10aGQpOworCWlmICghbnZfd2FpdChkZXYsIDB4NjEwNzA0ICsgKGlkICogMHgxMCksIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApKQorCQlyZXQgPSAtRUJVU1k7CisJbnZfbWFzayhkZXYsIDB4NjEwNzAwICsgKGlkICogMHgxMCksIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgKgorZXZvX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGlkLCBpbnQgbnIpCit7CisJc3RydWN0IG52ZDBfZGlzcGxheSAqZGlzcCA9IG52ZDBfZGlzcGxheShkZXYpOworCXUzMiBwdXQgPSBudl9yZDMyKGRldiwgMHg2NDAwMDAgKyAoaWQgKiAweDEwMDApKSAvIDQ7CisKKwlpZiAocHV0ICsgbnIgPj0gKFBBR0VfU0laRSAvIDQpKSB7CisJCWRpc3AtPmV2b1tpZF0ucHRyW3B1dF0gPSAweDIwMDAwMDAwOworCisJCW52X3dyMzIoZGV2LCAweDY0MDAwMCArIChpZCAqIDB4MTAwMCksIDB4MDAwMDAwMDApOworCQlpZiAoIW52X3dhaXQoZGV2LCAweDY0MDAwNCArIChpZCAqIDB4MTAwMCksIH4wLCAweDAwMDAwMDAwKSkgeworCQkJTlZfRVJST1IoZGV2LCAiZXZvICVkIGRtYSBzdGFsbGVkXG4iLCBpZCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXB1dCA9IDA7CisJfQorCisJcmV0dXJuIGRpc3AtPmV2b1tpZF0ucHRyICsgcHV0OworfQorCitzdGF0aWMgdm9pZAorZXZvX2tpY2sodTMyICpwdXNoLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaWQpCit7CisJc3RydWN0IG52ZDBfZGlzcGxheSAqZGlzcCA9IG52ZDBfZGlzcGxheShkZXYpOworCW52X3dyMzIoZGV2LCAweDY0MDAwMCArIChpZCAqIDB4MTAwMCksIChwdXNoIC0gZGlzcC0+ZXZvW2lkXS5wdHIpIDw8IDIpOworfQorCisjZGVmaW5lIGV2b19tdGhkKHAsbSxzKSAqKChwKSsrKSA9ICgoKHMpIDw8IDE4KSB8IChtKSkKKyNkZWZpbmUgZXZvX2RhdGEocCxkKSAgICooKHApKyspID0gKGQpCisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2NydGMgKgorbnZkMF9kaXNwbGF5X2NydGNfZ2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlyZXR1cm4gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5jcnRjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDUlRDCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitudmQwX2NydGNfc2V0X2RpdGhlcihzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBib29sIG9uLCBib29sIHVwZGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfY3J0Yy0+YmFzZS5kZXY7CisJdTMyICpwdXNoLCBtb2RlOworCisJbW9kZSA9IDB4MDAwMDAwMDA7CisJaWYgKG9uKSB7CisJCS8qIDB4MTE6IDZicGMgZHluYW1pYyAyeDIKKwkJICogMHgxMzogOGJwYyBkeW5hbWljIDJ4MgorCQkgKiAweDE5OiA2YnBjIHN0YXRpYyAyeDIKKwkJICogMHgxYjogOGJwYyBzdGF0aWMgMngyCisJCSAqIDB4MjE6IDZicGMgdGVtcG9yYWwKKwkJICogMHgyMzogOGJwYyB0ZW1wb3JhbAorCQkgKi8KKwkJbW9kZSA9IDB4MDAwMDAwMTE7CisJfQorCisJcHVzaCA9IGV2b193YWl0KGRldiwgMCwgNCk7CisJaWYgKHB1c2gpIHsKKwkJZXZvX210aGQocHVzaCwgMHgwNDkwICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJZXZvX2RhdGEocHVzaCwgbW9kZSk7CisJCWlmICh1cGRhdGUpIHsKKwkJCWV2b19tdGhkKHB1c2gsIDB4MDA4MCwgMSk7CisJCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwkJfQorCQlldm9fa2ljayhwdXNoLCBkZXYsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudmQwX2NydGNfc2V0X3NjYWxlKHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIGludCB0eXBlLCBib29sIHVwZGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZudl9jcnRjLT5iYXNlLm1vZGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yOworCXUzMiAqcHVzaCwgb3V0WCwgb3V0WTsKKworCW91dFggPSBtb2RlLT5oZGlzcGxheTsKKwlvdXRZID0gbW9kZS0+dmRpc3BsYXk7CisKKwludl9jb25uZWN0b3IgPSBub3V2ZWF1X2NydGNfY29ubmVjdG9yX2dldChudl9jcnRjKTsKKwlpZiAobnZfY29ubmVjdG9yICYmIG52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpIHsKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5hdGl2ZSA9IG52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGU7CisJCXUzMiB4cmF0aW8gPSAobmF0aXZlLT5oZGlzcGxheSA8PCAxOSkgLyBtb2RlLT5oZGlzcGxheTsKKwkJdTMyIHlyYXRpbyA9IChuYXRpdmUtPnZkaXNwbGF5IDw8IDE5KSAvIG1vZGUtPnZkaXNwbGF5OworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIERSTV9NT0RFX1NDQUxFX0FTUEVDVDoKKwkJCWlmICh4cmF0aW8gPiB5cmF0aW8pIHsKKwkJCQlvdXRYID0gKG1vZGUtPmhkaXNwbGF5ICogeXJhdGlvKSA+PiAxOTsKKwkJCQlvdXRZID0gKG1vZGUtPnZkaXNwbGF5ICogeXJhdGlvKSA+PiAxOTsKKwkJCX0gZWxzZSB7CisJCQkJb3V0WCA9IChtb2RlLT5oZGlzcGxheSAqIHhyYXRpbykgPj4gMTk7CisJCQkJb3V0WSA9IChtb2RlLT52ZGlzcGxheSAqIHhyYXRpbykgPj4gMTk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBEUk1fTU9ERV9TQ0FMRV9GVUxMU0NSRUVOOgorCQkJb3V0WCA9IG5hdGl2ZS0+aGRpc3BsYXk7CisJCQlvdXRZID0gbmF0aXZlLT52ZGlzcGxheTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwdXNoID0gZXZvX3dhaXQoZGV2LCAwLCAxNik7CisJaWYgKHB1c2gpIHsKKwkJZXZvX210aGQocHVzaCwgMHgwNGMwICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAzKTsKKwkJZXZvX2RhdGEocHVzaCwgKG91dFkgPDwgMTYpIHwgb3V0WCk7CisJCWV2b19kYXRhKHB1c2gsIChvdXRZIDw8IDE2KSB8IG91dFgpOworCQlldm9fZGF0YShwdXNoLCAob3V0WSA8PCAxNikgfCBvdXRYKTsKKwkJZXZvX210aGQocHVzaCwgMHgwNDk0ICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDRiOCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIChtb2RlLT52ZGlzcGxheSA8PCAxNikgfCBtb2RlLT5oZGlzcGxheSk7CisJCWlmICh1cGRhdGUpIHsKKwkJCWV2b19tdGhkKHB1c2gsIDB4MDA4MCwgMSk7CisJCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwkJfQorCQlldm9fa2ljayhwdXNoLCBkZXYsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudmQwX2NydGNfc2V0X2ltYWdlKHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkgICAgaW50IHgsIGludCB5LCBib29sIHVwZGF0ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mcmFtZWJ1ZmZlciAqbnZmYiA9IG5vdXZlYXVfZnJhbWVidWZmZXIoZmIpOworCXUzMiAqcHVzaDsKKworCXB1c2ggPSBldm9fd2FpdChmYi0+ZGV2LCAwLCAxNik7CisJaWYgKHB1c2gpIHsKKwkJZXZvX210aGQocHVzaCwgMHgwNDYwICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJZXZvX2RhdGEocHVzaCwgbnZmYi0+bnZiby0+Ym8ub2Zmc2V0ID4+IDgpOworCQlldm9fbXRoZChwdXNoLCAweDA0NjggKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDQpOworCQlldm9fZGF0YShwdXNoLCAoZmItPmhlaWdodCA8PCAxNikgfCBmYi0+d2lkdGgpOworCQlldm9fZGF0YShwdXNoLCBudmZiLT5yX3BpdGNoKTsKKwkJZXZvX2RhdGEocHVzaCwgbnZmYi0+cl9mb3JtYXQpOworCQlldm9fZGF0YShwdXNoLCBudmZiLT5yX2RtYSk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDRiMCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsICh5IDw8IDE2KSB8IHgpOworCQlpZiAodXBkYXRlKSB7CisJCQlldm9fbXRoZChwdXNoLCAweDAwODAsIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCX0KKwkJZXZvX2tpY2socHVzaCwgZmItPmRldiwgMCk7CisJfQorCisJbnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9IG52ZmItPnJfZG1hOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9jcnRjX2N1cnNvcl9zaG93KHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIGJvb2wgc2hvdywgYm9vbCB1cGRhdGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCXUzMiAqcHVzaCA9IGV2b193YWl0KGRldiwgMCwgMTYpOworCWlmIChwdXNoKSB7CisJCWlmIChzaG93KSB7CisJCQlldm9fbXRoZChwdXNoLCAweDA0ODAgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDIpOworCQkJZXZvX2RhdGEocHVzaCwgMHg4NTAwMDAwMCk7CisJCQlldm9fZGF0YShwdXNoLCBudl9jcnRjLT5jdXJzb3IubnZiby0+Ym8ub2Zmc2V0ID4+IDgpOworCQkJZXZvX210aGQocHVzaCwgMHgwNDhjICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJCWV2b19kYXRhKHB1c2gsIE52RXZvVlJBTSk7CisJCX0gZWxzZSB7CisJCQlldm9fbXRoZChwdXNoLCAweDA0ODAgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwNTAwMDAwMCk7CisJCQlldm9fbXRoZChwdXNoLCAweDA0OGMgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCX0KKworCQlpZiAodXBkYXRlKSB7CisJCQlldm9fbXRoZChwdXNoLCAweDAwODAsIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCX0KKworCQlldm9fa2ljayhwdXNoLCBkZXYsIDApOworCX0KK30KKworc3RhdGljIHZvaWQKK252ZDBfY3J0Y19kcG1zKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IG1vZGUpCit7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2NydGNfcHJlcGFyZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwl1MzIgKnB1c2g7CisKKwlwdXNoID0gZXZvX3dhaXQoY3J0Yy0+ZGV2LCAwLCAyKTsKKwlpZiAocHVzaCkgeworCQlldm9fbXRoZChwdXNoLCAweDA0NzQgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDEpOworCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwkJZXZvX210aGQocHVzaCwgMHgwNDQwICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJZXZvX2RhdGEocHVzaCwgMHgwMzAwMDAwMCk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQ1YyArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOworCQlldm9fa2ljayhwdXNoLCBjcnRjLT5kZXYsIDApOworCX0KKworCW52ZDBfY3J0Y19jdXJzb3Jfc2hvdyhudl9jcnRjLCBmYWxzZSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9jcnRjX2NvbW1pdChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwl1MzIgKnB1c2g7CisKKwlwdXNoID0gZXZvX3dhaXQoY3J0Yy0+ZGV2LCAwLCAzMik7CisJaWYgKHB1c2gpIHsKKwkJZXZvX210aGQocHVzaCwgMHgwNDc0ICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJZXZvX2RhdGEocHVzaCwgbnZfY3J0Yy0+ZmIudGlsZV9mbGFncyk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQ0MCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgNCk7CisJCWV2b19kYXRhKHB1c2gsIDB4ODMwMDAwMDApOworCQlldm9fZGF0YShwdXNoLCBudl9jcnRjLT5sdXQubnZiby0+Ym8ub2Zmc2V0ID4+IDgpOworCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQ1YyArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIE52RXZvVlJBTSk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQzMCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIDB4ZmZmZmZmMDApOworCQlldm9fa2ljayhwdXNoLCBjcnRjLT5kZXYsIDApOworCX0KKworCW52ZDBfY3J0Y19jdXJzb3Jfc2hvdyhudl9jcnRjLCBudl9jcnRjLT5jdXJzb3IudmlzaWJsZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBib29sCitudmQwX2NydGNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50CitudmQwX2NydGNfc3dhcF9mYnMoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCit7CisJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm52ZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGNydGMtPmZiKTsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ib19waW4obnZmYi0+bnZibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChvbGRfZmIpIHsKKwkJbnZmYiA9IG5vdXZlYXVfZnJhbWVidWZmZXIob2xkX2ZiKTsKKwkJbm91dmVhdV9ib191bnBpbihudmZiLT5udmJvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnZkMF9jcnRjX21vZGVfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnVtb2RlLAorCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwgaW50IHgsIGludCB5LAorCQkgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvcjsKKwl1MzIgaHRvdGFsID0gbW9kZS0+aHRvdGFsOworCXUzMiB2dG90YWwgPSBtb2RlLT52dG90YWw7CisJdTMyIGhzeW5jdyA9IG1vZGUtPmhzeW5jX2VuZCAtIG1vZGUtPmhzeW5jX3N0YXJ0IC0gMTsKKwl1MzIgdnN5bmN3ID0gbW9kZS0+dnN5bmNfZW5kIC0gbW9kZS0+dnN5bmNfc3RhcnQgLSAxOworCXUzMiBoZnJudHAgPSBtb2RlLT5oc3luY19zdGFydCAtIG1vZGUtPmhkaXNwbGF5OworCXUzMiB2ZnJudHAgPSBtb2RlLT52c3luY19zdGFydCAtIG1vZGUtPnZkaXNwbGF5OworCXUzMiBoYmFja3AgPSBtb2RlLT5odG90YWwgLSBtb2RlLT5oc3luY19lbmQ7CisJdTMyIHZiYWNrcCA9IG1vZGUtPnZ0b3RhbCAtIG1vZGUtPnZzeW5jX2VuZDsKKwl1MzIgaHNzMmJlID0gaHN5bmN3ICsgaGJhY2twOworCXUzMiB2c3MyYmUgPSB2c3luY3cgKyB2YmFja3A7CisJdTMyIGhzczJkZSA9IGh0b3RhbCAtIGhmcm50cDsKKwl1MzIgdnNzMmRlID0gdnRvdGFsIC0gdmZybnRwOworCXUzMiBzeW5jcywgKnB1c2g7CisJaW50IHJldDsKKworCXN5bmNzID0gMHgwMDAwMDAwMTsKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05IU1lOQykKKwkJc3luY3MgfD0gMHgwMDAwMDAwODsKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQykKKwkJc3luY3MgfD0gMHgwMDAwMDAxMDsKKworCXJldCA9IG52ZDBfY3J0Y19zd2FwX2ZicyhjcnRjLCBvbGRfZmIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwdXNoID0gZXZvX3dhaXQoY3J0Yy0+ZGV2LCAwLCA2NCk7CisJaWYgKHB1c2gpIHsKKwkJZXZvX210aGQocHVzaCwgMHgwNDEwICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCA1KTsKKwkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCWV2b19kYXRhKHB1c2gsICh2dG90YWwgPDwgMTYpIHwgaHRvdGFsKTsKKwkJZXZvX2RhdGEocHVzaCwgKHZzeW5jdyA8PCAxNikgfCBoc3luY3cpOworCQlldm9fZGF0YShwdXNoLCAodnNzMmJlIDw8IDE2KSB8IGhzczJiZSk7CisJCWV2b19kYXRhKHB1c2gsICh2c3MyZGUgPDwgMTYpIHwgaHNzMmRlKTsKKwkJZXZvX210aGQocHVzaCwgMHgwNDJjICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7IC8qID8/PyAqLworCQlldm9fbXRoZChwdXNoLCAweDA0NTAgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDMpOworCQlldm9fZGF0YShwdXNoLCBtb2RlLT5jbG9jayAqIDEwMDApOworCQlldm9fZGF0YShwdXNoLCAweDAwMjAwMDAwKTsgLyogPz8/ICovCisJCWV2b19kYXRhKHB1c2gsIG1vZGUtPmNsb2NrICogMTAwMCk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQwNCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIHN5bmNzKTsKKwkJZXZvX2tpY2socHVzaCwgY3J0Yy0+ZGV2LCAwKTsKKwl9CisKKwludl9jb25uZWN0b3IgPSBub3V2ZWF1X2NydGNfY29ubmVjdG9yX2dldChudl9jcnRjKTsKKwludmQwX2NydGNfc2V0X2RpdGhlcihudl9jcnRjLCBudl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcsIGZhbHNlKTsKKwludmQwX2NydGNfc2V0X3NjYWxlKG52X2NydGMsIG52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlLCBmYWxzZSk7CisJbnZkMF9jcnRjX3NldF9pbWFnZShudl9jcnRjLCBjcnRjLT5mYiwgeCwgeSwgZmFsc2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudmQwX2NydGNfbW9kZV9zZXRfYmFzZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSwKKwkJCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCWludCByZXQ7CisKKwlpZiAoIWNydGMtPmZiKSB7CisJCU5WX0RFQlVHX0tNUyhjcnRjLT5kZXYsICJObyBGQiBib3VuZFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IG52ZDBfY3J0Y19zd2FwX2ZicyhjcnRjLCBvbGRfZmIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludmQwX2NydGNfc2V0X2ltYWdlKG52X2NydGMsIGNydGMtPmZiLCB4LCB5LCB0cnVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnZkMF9jcnRjX21vZGVfc2V0X2Jhc2VfYXRvbWljKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgaW50IHgsIGludCB5LAorCQkJICAgICAgIGVudW0gbW9kZV9zZXRfYXRvbWljIHN0YXRlKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJbnZkMF9jcnRjX3NldF9pbWFnZShudl9jcnRjLCBmYiwgeCwgeSwgdHJ1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2NydGNfbHV0X2xvYWQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJdm9pZCBfX2lvbWVtICpsdXQgPSBudmJvX2ttYXBfb2JqX2lvdmlydHVhbChudl9jcnRjLT5sdXQubnZibyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJd3JpdGV3KDB4NjAwMCArIChudl9jcnRjLT5sdXQucltpXSA+PiAyKSwgbHV0ICsgKGkgKiAweDIwKSArIDApOworCQl3cml0ZXcoMHg2MDAwICsgKG52X2NydGMtPmx1dC5nW2ldID4+IDIpLCBsdXQgKyAoaSAqIDB4MjApICsgMik7CisJCXdyaXRldygweDYwMDAgKyAobnZfY3J0Yy0+bHV0LmJbaV0gPj4gMiksIGx1dCArIChpICogMHgyMCkgKyA0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK252ZDBfY3J0Y19jdXJzb3Jfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCSAgICAgdWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibzsKKwlib29sIHZpc2libGUgPSAoaGFuZGxlICE9IDApOworCWludCBpLCByZXQgPSAwOworCisJaWYgKHZpc2libGUpIHsKKwkJaWYgKHdpZHRoICE9IDY0IHx8IGhlaWdodCAhPSA2NCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWdlbSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgaGFuZGxlKTsKKwkJaWYgKHVubGlrZWx5KCFnZW0pKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCW52Ym8gPSBub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKTsKKworCQlyZXQgPSBub3V2ZWF1X2JvX21hcChudmJvKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgNjQgKiA2NDsgaSsrKSB7CisJCQkJdTMyIHYgPSBub3V2ZWF1X2JvX3JkMzIobnZibywgaSk7CisJCQkJbm91dmVhdV9ib193cjMyKG52X2NydGMtPmN1cnNvci5udmJvLCBpLCB2KTsKKwkJCX0KKwkJCW5vdXZlYXVfYm9fdW5tYXAobnZibyk7CisJCX0KKworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChnZW0pOworCX0KKworCWlmICh2aXNpYmxlICE9IG52X2NydGMtPmN1cnNvci52aXNpYmxlKSB7CisJCW52ZDBfY3J0Y19jdXJzb3Jfc2hvdyhudl9jcnRjLCB2aXNpYmxlLCB0cnVlKTsKKwkJbnZfY3J0Yy0+Y3Vyc29yLnZpc2libGUgPSB2aXNpYmxlOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK252ZDBfY3J0Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCWNvbnN0IHUzMiBkYXRhID0gKHkgPDwgMTYpIHwgeDsKKworCW52X3dyMzIoY3J0Yy0+ZGV2LCAweDY0ZDA4NCArIChudl9jcnRjLT5pbmRleCAqIDB4MTAwMCksIGRhdGEpOworCW52X3dyMzIoY3J0Yy0+ZGV2LCAweDY0ZDA4MCArIChudl9jcnRjLT5pbmRleCAqIDB4MTAwMCksIDB4MDAwMDAwMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9jcnRjX2dhbW1hX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUxNiAqciwgdTE2ICpnLCB1MTYgKmIsCisJCSAgICB1aW50MzJfdCBzdGFydCwgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXUzMiBlbmQgPSBtYXgoc3RhcnQgKyBzaXplLCAodTMyKTI1Nik7CisJdTMyIGk7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisJCW52X2NydGMtPmx1dC5yW2ldID0gcltpXTsKKwkJbnZfY3J0Yy0+bHV0LmdbaV0gPSBnW2ldOworCQludl9jcnRjLT5sdXQuYltpXSA9IGJbaV07CisJfQorCisJbnZkMF9jcnRjX2x1dF9sb2FkKGNydGMpOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9jcnRjX2Rlc3Ryb3koc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJbm91dmVhdV9ib191bm1hcChudl9jcnRjLT5jdXJzb3IubnZibyk7CisJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52X2NydGMtPmN1cnNvci5udmJvKTsKKwlub3V2ZWF1X2JvX3VubWFwKG52X2NydGMtPmx1dC5udmJvKTsKKwlub3V2ZWF1X2JvX3JlZihOVUxMLCAmbnZfY3J0Yy0+bHV0Lm52Ym8pOworCWRybV9jcnRjX2NsZWFudXAoY3J0Yyk7CisJa2ZyZWUoY3J0Yyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIG52ZDBfY3J0Y19oZnVuYyA9IHsKKwkuZHBtcyA9IG52ZDBfY3J0Y19kcG1zLAorCS5wcmVwYXJlID0gbnZkMF9jcnRjX3ByZXBhcmUsCisJLmNvbW1pdCA9IG52ZDBfY3J0Y19jb21taXQsCisJLm1vZGVfZml4dXAgPSBudmQwX2NydGNfbW9kZV9maXh1cCwKKwkubW9kZV9zZXQgPSBudmQwX2NydGNfbW9kZV9zZXQsCisJLm1vZGVfc2V0X2Jhc2UgPSBudmQwX2NydGNfbW9kZV9zZXRfYmFzZSwKKwkubW9kZV9zZXRfYmFzZV9hdG9taWMgPSBudmQwX2NydGNfbW9kZV9zZXRfYmFzZV9hdG9taWMsCisJLmxvYWRfbHV0ID0gbnZkMF9jcnRjX2x1dF9sb2FkLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19mdW5jcyBudmQwX2NydGNfZnVuYyA9IHsKKwkuY3Vyc29yX3NldCA9IG52ZDBfY3J0Y19jdXJzb3Jfc2V0LAorCS5jdXJzb3JfbW92ZSA9IG52ZDBfY3J0Y19jdXJzb3JfbW92ZSwKKwkuZ2FtbWFfc2V0ID0gbnZkMF9jcnRjX2dhbW1hX3NldCwKKwkuc2V0X2NvbmZpZyA9IGRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnLAorCS5kZXN0cm95ID0gbnZkMF9jcnRjX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgdm9pZAorbnZkMF9jdXJzb3Jfc2V0X3BvcyhzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBpbnQgeCwgaW50IHkpCit7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2N1cnNvcl9zZXRfb2Zmc2V0KHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIHVpbnQzMl90IG9mZnNldCkKK3sKK30KKworc3RhdGljIGludAorbnZkMF9jcnRjX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YzsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJaW50IHJldCwgaTsKKworCW52X2NydGMgPSBremFsbG9jKHNpemVvZigqbnZfY3J0YyksIEdGUF9LRVJORUwpOworCWlmICghbnZfY3J0YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwludl9jcnRjLT5pbmRleCA9IGluZGV4OworCW52X2NydGMtPnNldF9kaXRoZXIgPSBudmQwX2NydGNfc2V0X2RpdGhlcjsKKwludl9jcnRjLT5zZXRfc2NhbGUgPSBudmQwX2NydGNfc2V0X3NjYWxlOworCW52X2NydGMtPmN1cnNvci5zZXRfb2Zmc2V0ID0gbnZkMF9jdXJzb3Jfc2V0X29mZnNldDsKKwludl9jcnRjLT5jdXJzb3Iuc2V0X3BvcyA9IG52ZDBfY3Vyc29yX3NldF9wb3M7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCW52X2NydGMtPmx1dC5yW2ldID0gaSA8PCA4OworCQludl9jcnRjLT5sdXQuZ1tpXSA9IGkgPDwgODsKKwkJbnZfY3J0Yy0+bHV0LmJbaV0gPSBpIDw8IDg7CisJfQorCisJY3J0YyA9ICZudl9jcnRjLT5iYXNlOworCWRybV9jcnRjX2luaXQoZGV2LCBjcnRjLCAmbnZkMF9jcnRjX2Z1bmMpOworCWRybV9jcnRjX2hlbHBlcl9hZGQoY3J0YywgJm52ZDBfY3J0Y19oZnVuYyk7CisJZHJtX21vZGVfY3J0Y19zZXRfZ2FtbWFfc2l6ZShjcnRjLCAyNTYpOworCisJcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCA2NCAqIDY0ICogNCwgMHgxMDAsIFRUTV9QTF9GTEFHX1ZSQU0sCisJCQkgICAgIDAsIDB4MDAwMCwgJm52X2NydGMtPmN1cnNvci5udmJvKTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSBub3V2ZWF1X2JvX3Bpbihudl9jcnRjLT5jdXJzb3IubnZibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gbm91dmVhdV9ib19tYXAobnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCQlpZiAocmV0KQorCQkJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52X2NydGMtPmN1cnNvci5udmJvKTsKKwl9CisKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IG5vdXZlYXVfYm9fbmV3KGRldiwgODE5MiwgMHgxMDAsIFRUTV9QTF9GTEFHX1ZSQU0sCisJCQkgICAgIDAsIDB4MDAwMCwgJm52X2NydGMtPmx1dC5udmJvKTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSBub3V2ZWF1X2JvX3Bpbihudl9jcnRjLT5sdXQubnZibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gbm91dmVhdV9ib19tYXAobnZfY3J0Yy0+bHV0Lm52Ym8pOworCQlpZiAocmV0KQorCQkJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52X2NydGMtPmx1dC5udmJvKTsKKwl9CisKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW52ZDBfY3J0Y19sdXRfbG9hZChjcnRjKTsKKworb3V0OgorCWlmIChyZXQpCisJCW52ZDBfY3J0Y19kZXN0cm95KGNydGMpOworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERBQworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK252ZDBfZGFjX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJaW50IG9yID0gbnZfZW5jb2Rlci0+b3I7CisJdTMyIGRwbXNfY3RybDsKKworCWRwbXNfY3RybCA9IDB4ODAwMDAwMDA7CisJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19TVEFOREJZIHx8IG1vZGUgPT0gRFJNX01PREVfRFBNU19PRkYpCisJCWRwbXNfY3RybCB8PSAweDAwMDAwMDAxOworCWlmIChtb2RlID09IERSTV9NT0RFX0RQTVNfU1VTUEVORCB8fCBtb2RlID09IERSTV9NT0RFX0RQTVNfT0ZGKQorCQlkcG1zX2N0cmwgfD0gMHgwMDAwMDAwNDsKKworCW52X3dhaXQoZGV2LCAweDYxYTAwNCArIChvciAqIDB4MDgwMCksIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOworCW52X21hc2soZGV2LCAweDYxYTAwNCArIChvciAqIDB4MDgwMCksIDB4YzAwMDAwN2YsIGRwbXNfY3RybCk7CisJbnZfd2FpdChkZXYsIDB4NjFhMDA0ICsgKG9yICogMHgwODAwKSwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7Cit9CisKK3N0YXRpYyBib29sCitudmQwX2RhY19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yOworCisJbnZfY29ubmVjdG9yID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7CisJaWYgKG52X2Nvbm5lY3RvciAmJiBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7CisJCWlmIChudl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSAhPSBEUk1fTU9ERV9TQ0FMRV9OT05FKSB7CisJCQlpbnQgaWQgPSBhZGp1c3RlZF9tb2RlLT5iYXNlLmlkOworCQkJKmFkanVzdGVkX21vZGUgPSAqbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZTsKKwkJCWFkanVzdGVkX21vZGUtPmJhc2UuaWQgPSBpZDsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9kYWNfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2RhY19jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworfQorCitzdGF0aWMgdm9pZAorbnZkMF9kYWNfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJdTMyICpwdXNoOworCisJbnZkMF9kYWNfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKworCXB1c2ggPSBldm9fd2FpdChlbmNvZGVyLT5kZXYsIDAsIDQpOworCWlmIChwdXNoKSB7CisJCWV2b19tdGhkKHB1c2gsIDB4MDE4MCArIChudl9lbmNvZGVyLT5vciAqIDB4MjApLCAyKTsKKwkJZXZvX2RhdGEocHVzaCwgMSA8PCBudl9jcnRjLT5pbmRleCk7CisJCWV2b19kYXRhKHB1c2gsIDB4MDBmZik7CisJCWV2b19raWNrKHB1c2gsIGVuY29kZXItPmRldiwgMCk7CisJfQorCisJbnZfZW5jb2Rlci0+Y3J0YyA9IGVuY29kZXItPmNydGM7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2RhY19kaXNjb25uZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJdTMyICpwdXNoOworCisJaWYgKG52X2VuY29kZXItPmNydGMpIHsKKwkJbnZkMF9jcnRjX3ByZXBhcmUobnZfZW5jb2Rlci0+Y3J0Yyk7CisKKwkJcHVzaCA9IGV2b193YWl0KGRldiwgMCwgNCk7CisJCWlmIChwdXNoKSB7CisJCQlldm9fbXRoZChwdXNoLCAweDAxODAgKyAobnZfZW5jb2Rlci0+b3IgKiAweDIwKSwgMSk7CisJCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwkJCWV2b19tdGhkKHB1c2gsIDB4MDA4MCwgMSk7CisJCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwkJCWV2b19raWNrKHB1c2gsIGRldiwgMCk7CisJCX0KKworCQludl9lbmNvZGVyLT5jcnRjID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCitudmQwX2RhY19kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCWludCBvciA9IG52X2VuY29kZXItPm9yOworCXUzMiBsb2FkOworCisJbnZfd3IzMihkZXYsIDB4NjFhMDBjICsgKG9yICogMHg4MDApLCAweDAwMTAwMDAwKTsKKwl1ZGVsYXkoOTUwMCk7CisJbnZfd3IzMihkZXYsIDB4NjFhMDBjICsgKG9yICogMHg4MDApLCAweDgwMDAwMDAwKTsKKworCWxvYWQgPSBudl9yZDMyKGRldiwgMHg2MWEwMGMgKyAob3IgKiAweDgwMCkpOworCWlmICgobG9hZCAmIDB4MzgwMDAwMDApID09IDB4MzgwMDAwMDApCisJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCisJbnZfd3IzMihkZXYsIDB4NjFhMDBjICsgKG9yICogMHg4MDApLCAweDAwMDAwMDAwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9kYWNfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwlrZnJlZShlbmNvZGVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgbnZkMF9kYWNfaGZ1bmMgPSB7CisJLmRwbXMgPSBudmQwX2RhY19kcG1zLAorCS5tb2RlX2ZpeHVwID0gbnZkMF9kYWNfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IG52ZDBfZGFjX3ByZXBhcmUsCisJLmNvbW1pdCA9IG52ZDBfZGFjX2NvbW1pdCwKKwkubW9kZV9zZXQgPSBudmQwX2RhY19tb2RlX3NldCwKKwkuZGlzYWJsZSA9IG52ZDBfZGFjX2Rpc2Nvbm5lY3QsCisJLmdldF9jcnRjID0gbnZkMF9kaXNwbGF5X2NydGNfZ2V0LAorCS5kZXRlY3QgPSBudmQwX2RhY19kZXRlY3QKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgbnZkMF9kYWNfZnVuYyA9IHsKKwkuZGVzdHJveSA9IG52ZDBfZGFjX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgaW50CitudmQwX2RhY19jcmVhdGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisKKwludl9lbmNvZGVyID0ga3phbGxvYyhzaXplb2YoKm52X2VuY29kZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52X2VuY29kZXIpCisJCXJldHVybiAtRU5PTUVNOworCW52X2VuY29kZXItPmRjYiA9IGRjYmU7CisJbnZfZW5jb2Rlci0+b3IgPSBmZnMoZGNiZS0+b3IpIC0gMTsKKworCWVuY29kZXIgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKTsKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGRjYmUtPmhlYWRzOworCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZudmQwX2RhY19mdW5jLCBEUk1fTU9ERV9FTkNPREVSX0RBQyk7CisJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmbnZkMF9kYWNfaGZ1bmMpOworCisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNPUgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK252ZDBfc29yX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9lbmNvZGVyICpwYXJ0bmVyOworCWludCBvciA9IG52X2VuY29kZXItPm9yOworCXUzMiBkcG1zX2N0cmw7CisKKwludl9lbmNvZGVyLT5sYXN0X2RwbXMgPSBtb2RlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXJ0bmVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfcGFydG5lciA9IG5vdXZlYXVfZW5jb2RlcihwYXJ0bmVyKTsKKworCQlpZiAocGFydG5lci0+ZW5jb2Rlcl90eXBlICE9IERSTV9NT0RFX0VOQ09ERVJfVE1EUykKKwkJCWNvbnRpbnVlOworCisJCWlmIChudl9wYXJ0bmVyICE9IG52X2VuY29kZXIgJiYKKwkJICAgIG52X3BhcnRuZXItPmRjYi0+b3IgPT0gbnZfZW5jb2Rlci0+b3IpIHsKKwkJCWlmIChudl9wYXJ0bmVyLT5sYXN0X2RwbXMgPT0gRFJNX01PREVfRFBNU19PTikKKwkJCQlyZXR1cm47CisJCQlicmVhazsKKwkJfQorCX0KKworCWRwbXNfY3RybCAgPSAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKTsKKwlkcG1zX2N0cmwgfD0gMHg4MDAwMDAwMDsKKworCW52X3dhaXQoZGV2LCAweDYxYzAwNCArIChvciAqIDB4MDgwMCksIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOworCW52X21hc2soZGV2LCAweDYxYzAwNCArIChvciAqIDB4MDgwMCksIDB4ODAwMDAwMDEsIGRwbXNfY3RybCk7CisJbnZfd2FpdChkZXYsIDB4NjFjMDA0ICsgKG9yICogMHgwODAwKSwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7CisJbnZfd2FpdChkZXYsIDB4NjFjMDMwICsgKG9yICogMHgwODAwKSwgMHgxMDAwMDAwMCwgMHgwMDAwMDAwMCk7Cit9CisKK3N0YXRpYyBib29sCitudmQwX3Nvcl9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yOworCisJbnZfY29ubmVjdG9yID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7CisJaWYgKG52X2Nvbm5lY3RvciAmJiBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7CisJCWlmIChudl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSAhPSBEUk1fTU9ERV9TQ0FMRV9OT05FKSB7CisJCQlpbnQgaWQgPSBhZGp1c3RlZF9tb2RlLT5iYXNlLmlkOworCQkJKmFkanVzdGVkX21vZGUgPSAqbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZTsKKwkJCWFkanVzdGVkX21vZGUtPmJhc2UuaWQgPSBpZDsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9zb3JfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX3Nvcl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworfQorCitzdGF0aWMgdm9pZAorbnZkMF9zb3JfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqdW1vZGUsCisJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3I7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7CisJdTMyIG1vZGVfY3RybCA9ICgxIDw8IG52X2NydGMtPmluZGV4KTsKKwl1MzIgKnB1c2gsIG9yX2NvbmZpZzsKKworCW52X2Nvbm5lY3RvciA9IG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpOworCXN3aXRjaCAobnZfZW5jb2Rlci0+ZGNiLT50eXBlKSB7CisJY2FzZSBPVVRQVVRfVE1EUzoKKwkJaWYgKG52X2VuY29kZXItPmRjYi0+c29yY29uZi5saW5rICYgMSkgeworCQkJaWYgKG1vZGUtPmNsb2NrIDwgMTY1MDAwKQorCQkJCW1vZGVfY3RybCB8PSAweDAwMDAwMTAwOworCQkJZWxzZQorCQkJCW1vZGVfY3RybCB8PSAweDAwMDAwNTAwOworCQl9IGVsc2UgeworCQkJbW9kZV9jdHJsIHw9IDB4MDAwMDAyMDA7CisJCX0KKworCQlvcl9jb25maWcgPSAobW9kZV9jdHJsICYgMHgwMDAwMGYwMCkgPj4gODsKKwkJaWYgKG1vZGUtPmNsb2NrID49IDE2NTAwMCkKKwkJCW9yX2NvbmZpZyB8PSAweDAxMDA7CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX0xWRFM6CisJCW9yX2NvbmZpZyA9IChtb2RlX2N0cmwgJiAweDAwMDAwZjAwKSA+PiA4OworCQlpZiAoYmlvcy0+ZnBfbm9fZGRjKSB7CisJCQlpZiAoYmlvcy0+ZnAuZHVhbF9saW5rKQorCQkJCW9yX2NvbmZpZyB8PSAweDAxMDA7CisJCQlpZiAoYmlvcy0+ZnAuaWZfaXNfMjRiaXQpCisJCQkJb3JfY29uZmlnIHw9IDB4MDIwMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChudl9jb25uZWN0b3ItPmRjYi0+dHlwZSA9PSBEQ0JfQ09OTkVDVE9SX0xWRFNfU1BXRykgeworCQkJCWlmICgoKHU4ICopbnZfY29ubmVjdG9yLT5lZGlkKVsxMjFdID09IDIpCisJCQkJCW9yX2NvbmZpZyB8PSAweDAxMDA7CisJCQl9IGVsc2UKKwkJCWlmIChtb2RlLT5jbG9jayA+PSBiaW9zLT5mcC5kdWFsbGlua190cmFuc2l0aW9uX2NsaykgeworCQkJCW9yX2NvbmZpZyB8PSAweDAxMDA7CisJCQl9CisKKwkJCWlmIChvcl9jb25maWcgJiAweDAxMDApIHsKKwkJCQlpZiAoYmlvcy0+ZnAuc3RyYXBsZXNzX2lzXzI0Yml0ICYgMikKKwkJCQkJb3JfY29uZmlnIHw9IDB4MDIwMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGJpb3MtPmZwLnN0cmFwbGVzc19pc18yNGJpdCAmIDEpCisJCQkJCW9yX2NvbmZpZyB8PSAweDAyMDA7CisJCQl9CisKKwkJCWlmIChudl9jb25uZWN0b3ItPmJhc2UuZGlzcGxheV9pbmZvLmJwYyA9PSA4KQorCQkJCW9yX2NvbmZpZyB8PSAweDAyMDA7CisKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUdfT04oMSk7CisJCWJyZWFrOworCX0KKworCW52ZDBfc29yX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisKKwlwdXNoID0gZXZvX3dhaXQoZW5jb2Rlci0+ZGV2LCAwLCA0KTsKKwlpZiAocHVzaCkgeworCQlldm9fbXRoZChwdXNoLCAweDAyMDAgKyAobnZfZW5jb2Rlci0+b3IgKiAweDIwKSwgMik7CisJCWV2b19kYXRhKHB1c2gsIG1vZGVfY3RybCk7CisJCWV2b19kYXRhKHB1c2gsIG9yX2NvbmZpZyk7CisJCWV2b19raWNrKHB1c2gsIGVuY29kZXItPmRldiwgMCk7CisJfQorCisJbnZfZW5jb2Rlci0+Y3J0YyA9IGVuY29kZXItPmNydGM7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX3Nvcl9kaXNjb25uZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJdTMyICpwdXNoOworCisJaWYgKG52X2VuY29kZXItPmNydGMpIHsKKwkJbnZkMF9jcnRjX3ByZXBhcmUobnZfZW5jb2Rlci0+Y3J0Yyk7CisKKwkJcHVzaCA9IGV2b193YWl0KGRldiwgMCwgNCk7CisJCWlmIChwdXNoKSB7CisJCQlldm9fbXRoZChwdXNoLCAweDAyMDAgKyAobnZfZW5jb2Rlci0+b3IgKiAweDIwKSwgMSk7CisJCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwkJCWV2b19tdGhkKHB1c2gsIDB4MDA4MCwgMSk7CisJCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwkJCWV2b19raWNrKHB1c2gsIGRldiwgMCk7CisJCX0KKworCQludl9lbmNvZGVyLT5jcnRjID0gTlVMTDsKKwkJbnZfZW5jb2Rlci0+bGFzdF9kcG1zID0gRFJNX01PREVfRFBNU19PRkY7CisJfQorfQorCitzdGF0aWMgdm9pZAorbnZkMF9zb3JfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwlrZnJlZShlbmNvZGVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgbnZkMF9zb3JfaGZ1bmMgPSB7CisJLmRwbXMgPSBudmQwX3Nvcl9kcG1zLAorCS5tb2RlX2ZpeHVwID0gbnZkMF9zb3JfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IG52ZDBfc29yX3ByZXBhcmUsCisJLmNvbW1pdCA9IG52ZDBfc29yX2NvbW1pdCwKKwkubW9kZV9zZXQgPSBudmQwX3Nvcl9tb2RlX3NldCwKKwkuZGlzYWJsZSA9IG52ZDBfc29yX2Rpc2Nvbm5lY3QsCisJLmdldF9jcnRjID0gbnZkMF9kaXNwbGF5X2NydGNfZ2V0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBudmQwX3Nvcl9mdW5jID0geworCS5kZXN0cm95ID0gbnZkMF9zb3JfZGVzdHJveSwKK307CisKK3N0YXRpYyBpbnQKK252ZDBfc29yX2NyZWF0ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKworCW52X2VuY29kZXIgPSBremFsbG9jKHNpemVvZigqbnZfZW5jb2RlciksIEdGUF9LRVJORUwpOworCWlmICghbnZfZW5jb2RlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJbnZfZW5jb2Rlci0+ZGNiID0gZGNiZTsKKwludl9lbmNvZGVyLT5vciA9IGZmcyhkY2JlLT5vcikgLSAxOworCW52X2VuY29kZXItPmxhc3RfZHBtcyA9IERSTV9NT0RFX0RQTVNfT0ZGOworCisJZW5jb2RlciA9IHRvX2RybV9lbmNvZGVyKG52X2VuY29kZXIpOworCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gZGNiZS0+aGVhZHM7CisJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKKwlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJm52ZDBfc29yX2Z1bmMsIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7CisJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmbnZkMF9zb3JfaGZ1bmMpOworCisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElSUQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBkY2JfZW50cnkgKgorbG9va3VwX2RjYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaWQsIHUzMiBtYykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCB0eXBlLCBvciwgaTsKKworCWlmIChpZCA8IDQpIHsKKwkJdHlwZSA9IE9VVFBVVF9BTkFMT0c7CisJCW9yICAgPSBpZDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKG1jICYgMHgwMDAwMGYwMCkgeworCQljYXNlIDB4MDAwMDAwMDA6IHR5cGUgPSBPVVRQVVRfTFZEUzsgYnJlYWs7CisJCWNhc2UgMHgwMDAwMDEwMDogdHlwZSA9IE9VVFBVVF9UTURTOyBicmVhazsKKwkJY2FzZSAweDAwMDAwMjAwOiB0eXBlID0gT1VUUFVUX1RNRFM7IGJyZWFrOworCQljYXNlIDB4MDAwMDA1MDA6IHR5cGUgPSBPVVRQVVRfVE1EUzsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlOVl9FUlJPUihkZXYsICJQRElTUDogdW5rbm93biBTT1IgbWMgMHglMDh4XG4iLCBtYyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW9yID0gaWQgLSA0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dmJpb3MuZGNiLmVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSAmZGV2X3ByaXYtPnZiaW9zLmRjYi5lbnRyeVtpXTsKKwkJaWYgKGRjYi0+dHlwZSA9PSB0eXBlICYmIChkY2ItPm9yICYgKDEgPDwgb3IpKSkKKwkJCXJldHVybiBkY2I7CisJfQorCisJTlZfRVJST1IoZGV2LCAiUERJU1A6IERDQiBmb3IgJWQvMHglMDh4IG5vdCBmb3VuZFxuIiwgaWQsIG1jKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK252ZDBfZGlzcGxheV91bmsxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGNydGMsIHUzMiBtYXNrKQoreworCXN0cnVjdCBkY2JfZW50cnkgKmRjYjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IG1hc2sgJiYgaSA8IDg7IGkrKykgeworCQl1MzIgbWNjID0gbnZfcmQzMihkZXYsIDB4NjQwMTgwICsgKGkgKiAweDIwKSk7CisJCWlmICghKG1jYyAmICgxIDw8IGNydGMpKSkKKwkJCWNvbnRpbnVlOworCisJCWRjYiA9IGxvb2t1cF9kY2IoZGV2LCBpLCBtY2MpOworCQlpZiAoIWRjYikKKwkJCWNvbnRpbnVlOworCisJCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIDB4MDAwMCwgLTEsIGRjYiwgY3J0Yyk7CisJfQorCisJbnZfd3IzMihkZXYsIDB4NjEwMWQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg2MTA5ZDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDYxMDFkMCwgMHg4MDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2Rpc3BsYXlfdW5rMl9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBjcnRjLCB1MzIgbWFzaykKK3sKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2I7CisJdTMyIG9yLCB0bXAsIHBjbGs7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBtYXNrICYmIGkgPCA4OyBpKyspIHsKKwkJdTMyIG1jYyA9IG52X3JkMzIoZGV2LCAweDY0MDE4MCArIChpICogMHgyMCkpOworCQlpZiAoIShtY2MgJiAoMSA8PCBjcnRjKSkpCisJCQljb250aW51ZTsKKworCQlkY2IgPSBsb29rdXBfZGNiKGRldiwgaSwgbWNjKTsKKwkJaWYgKCFkY2IpCisJCQljb250aW51ZTsKKworCQlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCAweDAwMDAsIC0yLCBkY2IsIGNydGMpOworCX0KKworCXBjbGsgPSBudl9yZDMyKGRldiwgMHg2NjA0NTAgKyAoY3J0YyAqIDB4MzAwKSkgLyAxMDAwOworCWlmIChtYXNrICYgMHgwMDAxMDAwMCkgeworCQludjUwX2NydGNfc2V0X2Nsb2NrKGRldiwgY3J0YywgcGNsayk7CisJfQorCisJZm9yIChpID0gMDsgbWFzayAmJiBpIDwgODsgaSsrKSB7CisJCXUzMiBtY3AgPSBudl9yZDMyKGRldiwgMHg2NjAxODAgKyAoaSAqIDB4MjApKTsKKwkJdTMyIGNmZyA9IG52X3JkMzIoZGV2LCAweDY2MDE4NCArIChpICogMHgyMCkpOworCQlpZiAoIShtY3AgJiAoMSA8PCBjcnRjKSkpCisJCQljb250aW51ZTsKKworCQlkY2IgPSBsb29rdXBfZGNiKGRldiwgaSwgbWNwKTsKKwkJaWYgKCFkY2IpCisJCQljb250aW51ZTsKKwkJb3IgPSBmZnMoZGNiLT5vcikgLSAxOworCisJCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGNmZywgcGNsaywgZGNiLCBjcnRjKTsKKworCQludl93cjMyKGRldiwgMHg2MTIyMDAgKyAoY3J0YyAqIDB4ODAwKSwgMHgwMDAwMDAwMCk7CisJCXN3aXRjaCAoZGNiLT50eXBlKSB7CisJCWNhc2UgT1VUUFVUX0FOQUxPRzoKKwkJCW52X3dyMzIoZGV2LCAweDYxMjI4MCArIChvciAqIDB4ODAwKSwgMHgwMDAwMDAwMCk7CisJCQlicmVhazsKKwkJY2FzZSBPVVRQVVRfVE1EUzoKKwkJY2FzZSBPVVRQVVRfTFZEUzoKKwkJCWlmIChjZmcgJiAweDAwMDAwMTAwKQorCQkJCXRtcCA9IDB4MDAwMDAxMDE7CisJCQllbHNlCisJCQkJdG1wID0gMHgwMDAwMDAwMDsKKworCQkJbnZfbWFzayhkZXYsIDB4NjEyMzAwICsgKG9yICogMHg4MDApLCAweDAwMDAwNzA3LCB0bXApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCX0KKworCW52X3dyMzIoZGV2LCAweDYxMDFkNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NjEwOWQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg2MTAxZDAsIDB4ODAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9kaXNwbGF5X3VuazRfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgY3J0YywgdTMyIG1hc2spCit7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiOworCWludCBwY2xrLCBpOworCisJcGNsayA9IG52X3JkMzIoZGV2LCAweDY2MDQ1MCArIChjcnRjICogMHgzMDApKSAvIDEwMDA7CisKKwlmb3IgKGkgPSAwOyBtYXNrICYmIGkgPCA4OyBpKyspIHsKKwkJdTMyIG1jcCA9IG52X3JkMzIoZGV2LCAweDY2MDE4MCArIChpICogMHgyMCkpOworCQl1MzIgY2ZnID0gbnZfcmQzMihkZXYsIDB4NjYwMTg0ICsgKGkgKiAweDIwKSk7CisJCWlmICghKG1jcCAmICgxIDw8IGNydGMpKSkKKwkJCWNvbnRpbnVlOworCisJCWRjYiA9IGxvb2t1cF9kY2IoZGV2LCBpLCBtY3ApOworCQlpZiAoIWRjYikKKwkJCWNvbnRpbnVlOworCisJCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGNmZywgLXBjbGssIGRjYiwgY3J0Yyk7CisJfQorCisJbnZfd3IzMihkZXYsIDB4NjEwMWQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg2MTA5ZDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDYxMDFkMCwgMHg4MDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2Rpc3BsYXlfYmgodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBudmQwX2Rpc3BsYXkgKmRpc3AgPSBudmQwX2Rpc3BsYXkoZGV2KTsKKwl1MzIgbWFzaywgY3J0YzsKKwlpbnQgaTsKKworCWlmIChkcm1fZGVidWcgJiAoRFJNX1VUX0RSSVZFUiB8IERSTV9VVF9LTVMpKSB7CisJCU5WX0lORk8oZGV2LCAiUERJU1A6IG1vZGVzZXQgcmVxICVkXG4iLCBkaXNwLT5tb2Rlc2V0KTsKKwkJTlZfSU5GTyhkZXYsICIgU1RBVDogMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCisJCQkgbnZfcmQzMihkZXYsIDB4NjEwMWQwKSwKKwkJCSBudl9yZDMyKGRldiwgMHg2MTAxZDQpLCBudl9yZDMyKGRldiwgMHg2MTA5ZDQpKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJTlZfSU5GTyhkZXYsICIgJXMlZDogMHglMDh4IDB4JTA4eFxuIiwKKwkJCQlpIDwgNCA/ICJEQUMiIDogIlNPUiIsIGksCisJCQkJbnZfcmQzMihkZXYsIDB4NjQwMTgwICsgKGkgKiAweDIwKSksCisJCQkJbnZfcmQzMihkZXYsIDB4NjYwMTgwICsgKGkgKiAweDIwKSkpOworCQl9CisJfQorCisJbWFzayA9IG52X3JkMzIoZGV2LCAweDYxMDFkNCk7CisJY3J0YyA9IDA7CisJaWYgKCFtYXNrKSB7CisJCW1hc2sgPSBudl9yZDMyKGRldiwgMHg2MTA5ZDQpOworCQljcnRjID0gMTsKKwl9CisKKwlpZiAoZGlzcC0+bW9kZXNldCAmIDB4MDAwMDAwMDEpCisJCW52ZDBfZGlzcGxheV91bmsxX2hhbmRsZXIoZGV2LCBjcnRjLCBtYXNrKTsKKwlpZiAoZGlzcC0+bW9kZXNldCAmIDB4MDAwMDAwMDIpCisJCW52ZDBfZGlzcGxheV91bmsyX2hhbmRsZXIoZGV2LCBjcnRjLCBtYXNrKTsKKwlpZiAoZGlzcC0+bW9kZXNldCAmIDB4MDAwMDAwMDQpCisJCW52ZDBfZGlzcGxheV91bms0X2hhbmRsZXIoZGV2LCBjcnRjLCBtYXNrKTsKK30KKworc3RhdGljIHZvaWQKK252ZDBfZGlzcGxheV9pbnRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG52ZDBfZGlzcGxheSAqZGlzcCA9IG52ZDBfZGlzcGxheShkZXYpOworCXUzMiBpbnRyID0gbnZfcmQzMihkZXYsIDB4NjEwMDg4KTsKKworCWlmIChpbnRyICYgMHgwMDAwMDAwMikgeworCQl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDYxMDA5Yyk7CisJCWludCBjaGlkID0gZmZzKHN0YXQpIC0gMTsKKwkJaWYgKGNoaWQgPj0gMCkgeworCQkJdTMyIG10aGQgPSBudl9yZDMyKGRldiwgMHg2MTAxZjAgKyAoY2hpZCAqIDEyKSk7CisJCQl1MzIgZGF0YSA9IG52X3JkMzIoZGV2LCAweDYxMDFmNCArIChjaGlkICogMTIpKTsKKwkJCXUzMiB1bmtuID0gbnZfcmQzMihkZXYsIDB4NjEwMWY4ICsgKGNoaWQgKiAxMikpOworCisJCQlOVl9JTkZPKGRldiwgIkV2b0NoOiBjaGlkICVkIG10aGQgMHglMDR4IGRhdGEgMHglMDh4ICIKKwkJCQkgICAgICIweCUwOHggMHglMDh4XG4iLAorCQkJCWNoaWQsIChtdGhkICYgMHgwMDAwZmZjKSwgZGF0YSwgbXRoZCwgdW5rbik7CisJCQludl93cjMyKGRldiwgMHg2MTAwOWMsICgxIDw8IGNoaWQpKTsKKwkJCW52X3dyMzIoZGV2LCAweDYxMDFmMCArIChjaGlkICogMTIpLCAweDkwMDAwMDAwKTsKKwkJfQorCisJCWludHIgJj0gfjB4MDAwMDAwMDI7CisJfQorCisJaWYgKGludHIgJiAweDAwMTAwMDAwKSB7CisJCXUzMiBzdGF0ID0gbnZfcmQzMihkZXYsIDB4NjEwMGFjKTsKKworCQlpZiAoc3RhdCAmIDB4MDAwMDAwMDcpIHsKKwkJCWRpc3AtPm1vZGVzZXQgPSBzdGF0OworCQkJdGFza2xldF9zY2hlZHVsZSgmZGlzcC0+dGFza2xldCk7CisKKwkJCW52X3dyMzIoZGV2LCAweDYxMDBhYywgKHN0YXQgJiAweDAwMDAwMDA3KSk7CisJCQlzdGF0ICY9IH4weDAwMDAwMDA3OworCQl9CisKKwkJaWYgKHN0YXQpIHsKKwkJCU5WX0lORk8oZGV2LCAiUERJU1A6IHVua25vd24gaW50cjI0IDB4JTA4eFxuIiwgc3RhdCk7CisJCQludl93cjMyKGRldiwgMHg2MTAwYWMsIHN0YXQpOworCQl9CisKKwkJaW50ciAmPSB+MHgwMDEwMDAwMDsKKwl9CisKKwlpZiAoaW50ciAmIDB4MDEwMDAwMDApIHsKKwkJdTMyIHN0YXQgPSBudl9yZDMyKGRldiwgMHg2MTAwYmMpOworCQludl93cjMyKGRldiwgMHg2MTAwYmMsIHN0YXQpOworCQlpbnRyICY9IH4weDAxMDAwMDAwOworCX0KKworCWlmIChpbnRyICYgMHgwMjAwMDAwMCkgeworCQl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDYxMDhiYyk7CisJCW52X3dyMzIoZGV2LCAweDYxMDhiYywgc3RhdCk7CisJCWludHIgJj0gfjB4MDIwMDAwMDA7CisJfQorCisJaWYgKGludHIpCisJCU5WX0lORk8oZGV2LCAiUERJU1A6IHVua25vd24gaW50ciAweCUwOHhcbiIsIGludHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbml0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorbnZkMF9kaXNwbGF5X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCS8qIGZpbmkgY3Vyc29ycyAqLworCWZvciAoaSA9IDE0OyBpID49IDEzOyBpLS0pIHsKKwkJaWYgKCEobnZfcmQzMihkZXYsIDB4NjEwNDkwICsgKGkgKiAweDEwKSkgJiAweDAwMDAwMDAxKSkKKwkJCWNvbnRpbnVlOworCisJCW52X21hc2soZGV2LCAweDYxMDQ5MCArIChpICogMHgxMCksIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCQludl93YWl0KGRldiwgMHg2MTA0OTAgKyAoaSAqIDB4MTApLCAweDAwMDEwMDAwLCAweDAwMDAwMDAwKTsKKwkJbnZfbWFzayhkZXYsIDB4NjEwMDkwLCAxIDw8IGksIDB4MDAwMDAwMDApOworCQludl9tYXNrKGRldiwgMHg2MTAwYTAsIDEgPDwgaSwgMHgwMDAwMDAwMCk7CisJfQorCisJLyogZmluaSBtYXN0ZXIgKi8KKwlpZiAobnZfcmQzMihkZXYsIDB4NjEwNDkwKSAmIDB4MDAwMDAwMTApIHsKKwkJbnZfbWFzayhkZXYsIDB4NjEwNDkwLCAweDAwMDAwMDEwLCAweDAwMDAwMDAwKTsKKwkJbnZfbWFzayhkZXYsIDB4NjEwNDkwLCAweDAwMDAwMDAzLCAweDAwMDAwMDAwKTsKKwkJbnZfd2FpdChkZXYsIDB4NjEwNDkwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKTsKKwkJbnZfbWFzayhkZXYsIDB4NjEwMDkwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwkJbnZfbWFzayhkZXYsIDB4NjEwMGEwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwl9Cit9CisKK2ludAorbnZkMF9kaXNwbGF5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbnZkMF9kaXNwbGF5ICpkaXNwID0gbnZkMF9kaXNwbGF5KGRldik7CisJdTMyICpwdXNoOworCWludCBpOworCisJaWYgKG52X3JkMzIoZGV2LCAweDYxMDBhYykgJiAweDAwMDAwMTAwKSB7CisJCW52X3dyMzIoZGV2LCAweDYxMDBhYywgMHgwMDAwMDEwMCk7CisJCW52X21hc2soZGV2LCAweDYxOTRlOCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJCWlmICghbnZfd2FpdChkZXYsIDB4NjE5NGU4LCAweDAwMDAwMDAyLCAweDAwMDAwMDAwKSkgeworCQkJTlZfRVJST1IoZGV2LCAiUERJU1A6IDB4NjE5NGU4IDB4JTA4eFxuIiwKKwkJCQkgbnZfcmQzMihkZXYsIDB4NjE5NGU4KSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJLyogbmZpIHdoYXQgdGhlc2UgYXJlIGV4YWN0bHksIGkgZG8ga25vdyB0aGF0IFNPUl9NT0RFX0NUUkwgd29uJ3QKKwkgKiB3b3JrIGF0IGFsbCB1bmxlc3MgeW91IGRvIHRoZSBTT1IgcGFydCBiZWxvdy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXUzMiBkYWMgPSBudl9yZDMyKGRldiwgMHg2MWEwMDAgKyAoaSAqIDB4ODAwKSk7CisJCW52X3dyMzIoZGV2LCAweDYxMDFjMCArIChpICogMHg4MDApLCBkYWMpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdTMyIHNvciA9IG52X3JkMzIoZGV2LCAweDYxYzAwMCArIChpICogMHg4MDApKTsKKwkJbnZfd3IzMihkZXYsIDB4NjMwMWM0ICsgKGkgKiAweDgwMCksIHNvcik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQl1MzIgY3J0YzAgPSBudl9yZDMyKGRldiwgMHg2MTYxMDQgKyAoaSAqIDB4ODAwKSk7CisJCXUzMiBjcnRjMSA9IG52X3JkMzIoZGV2LCAweDYxNjEwOCArIChpICogMHg4MDApKTsKKwkJdTMyIGNydGMyID0gbnZfcmQzMihkZXYsIDB4NjE2MTBjICsgKGkgKiAweDgwMCkpOworCQludl93cjMyKGRldiwgMHg2MTAxYjQgKyAoaSAqIDB4ODAwKSwgY3J0YzApOworCQludl93cjMyKGRldiwgMHg2MTAxYjggKyAoaSAqIDB4ODAwKSwgY3J0YzEpOworCQludl93cjMyKGRldiwgMHg2MTAxYmMgKyAoaSAqIDB4ODAwKSwgY3J0YzIpOworCX0KKworCS8qIHBvaW50IGF0IG91ciBoYXNoIHRhYmxlIC8gb2JqZWN0cywgZW5hYmxlIGludGVycnVwdHMgKi8KKwludl93cjMyKGRldiwgMHg2MTAwMTAsIChkaXNwLT5tZW0tPnZpbnN0ID4+IDgpIHwgOSk7CisJbnZfbWFzayhkZXYsIDB4NjEwMGIwLCAweDAwMDAwMzA3LCAweDAwMDAwMzA3KTsKKworCS8qIGluaXQgbWFzdGVyICovCisJbnZfd3IzMihkZXYsIDB4NjEwNDk0LCAoZGlzcC0+ZXZvWzBdLmhhbmRsZSA+PiA4KSB8IDMpOworCW52X3dyMzIoZGV2LCAweDYxMDQ5OCwgMHgwMDAxMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NjEwNDljLCAweDAwMDAwMDAxKTsKKwludl9tYXNrKGRldiwgMHg2MTA0OTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTApOworCW52X3dyMzIoZGV2LCAweDY0MDAwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NjEwNDkwLCAweDAxMDAwMDEzKTsKKwlpZiAoIW52X3dhaXQoZGV2LCAweDYxMDQ5MCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAiUERJU1A6IG1hc3RlciAweCUwOHhcbiIsCisJCQkgbnZfcmQzMihkZXYsIDB4NjEwNDkwKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCW52X21hc2soZGV2LCAweDYxMDA5MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7CisJbnZfbWFzayhkZXYsIDB4NjEwMGEwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKKworCS8qIGluaXQgY3Vyc29ycyAqLworCWZvciAoaSA9IDEzOyBpIDw9IDE0OyBpKyspIHsKKwkJbnZfd3IzMihkZXYsIDB4NjEwNDkwICsgKGkgKiAweDEwKSwgMHgwMDAwMDAwMSk7CisJCWlmICghbnZfd2FpdChkZXYsIDB4NjEwNDkwICsgKGkgKiAweDEwKSwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMCkpIHsKKwkJCU5WX0VSUk9SKGRldiwgIlBESVNQOiBjdXJzJWQgMHglMDh4XG4iLCBpLAorCQkJCSBudl9yZDMyKGRldiwgMHg2MTA0OTAgKyAoaSAqIDB4MTApKSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJbnZfbWFzayhkZXYsIDB4NjEwMDkwLCAxIDw8IGksIDEgPDwgaSk7CisJCW52X21hc2soZGV2LCAweDYxMDBhMCwgMSA8PCBpLCAxIDw8IGkpOworCX0KKworCXB1c2ggPSBldm9fd2FpdChkZXYsIDAsIDMyKTsKKwlpZiAoIXB1c2gpCisJCXJldHVybiAtRUJVU1k7CisJZXZvX210aGQocHVzaCwgMHgwMDg4LCAxKTsKKwlldm9fZGF0YShwdXNoLCBOdkV2b1N5bmMpOworCWV2b19tdGhkKHB1c2gsIDB4MDA4NCwgMSk7CisJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJZXZvX210aGQocHVzaCwgMHgwMDg0LCAxKTsKKwlldm9fZGF0YShwdXNoLCAweDgwMDAwMDAwKTsKKwlldm9fbXRoZChwdXNoLCAweDAwOGMsIDEpOworCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOworCWV2b19raWNrKHB1c2gsIGRldiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnZkMF9kaXNwbGF5X2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmQwX2Rpc3BsYXkgKmRpc3AgPSBudmQwX2Rpc3BsYXkoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKKworCW52ZDBfZGlzcGxheV9maW5pKGRldik7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFBBR0VfU0laRSwgZGlzcC0+ZXZvWzBdLnB0ciwgZGlzcC0+ZXZvWzBdLmhhbmRsZSk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZkaXNwLT5tZW0pOworCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAyNik7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmRpc3BsYXkucHJpdiA9IE5VTEw7CisJa2ZyZWUoZGlzcCk7Cit9CisKK2ludAorbnZkMF9kaXNwbGF5X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKnBpbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlzdHJ1Y3QgZGNiX3RhYmxlICpkY2IgPSAmZGV2X3ByaXYtPnZiaW9zLmRjYjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCAqdG1wOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OworCXN0cnVjdCBudmQwX2Rpc3BsYXkgKmRpc3A7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiZTsKKwlpbnQgcmV0LCBpOworCisJZGlzcCA9IGt6YWxsb2Moc2l6ZW9mKCpkaXNwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkaXNwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkZXZfcHJpdi0+ZW5naW5lLmRpc3BsYXkucHJpdiA9IGRpc3A7CisKKwkvKiBjcmVhdGUgY3J0YyBvYmplY3RzIHRvIHJlcHJlc2VudCB0aGUgaHcgaGVhZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXJldCA9IG52ZDBfY3J0Y19jcmVhdGUoZGV2LCBpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIGNyZWF0ZSBlbmNvZGVyL2Nvbm5lY3RvciBvYmplY3RzIGJhc2VkIG9uIFZCSU9TIERDQiB0YWJsZSAqLworCWZvciAoaSA9IDAsIGRjYmUgPSAmZGNiLT5lbnRyeVswXTsgaSA8IGRjYi0+ZW50cmllczsgaSsrLCBkY2JlKyspIHsKKwkJY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3JfY3JlYXRlKGRldiwgZGNiZS0+Y29ubmVjdG9yKTsKKwkJaWYgKElTX0VSUihjb25uZWN0b3IpKQorCQkJY29udGludWU7CisKKwkJaWYgKGRjYmUtPmxvY2F0aW9uICE9IERDQl9MT0NfT05fQ0hJUCkgeworCQkJTlZfV0FSTihkZXYsICJza2lwcGluZyBvZmYtY2hpcCBlbmNvZGVyICVkLyVkXG4iLAorCQkJCWRjYmUtPnR5cGUsIGZmcyhkY2JlLT5vcikgLSAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChkY2JlLT50eXBlKSB7CisJCWNhc2UgT1VUUFVUX1RNRFM6CisJCWNhc2UgT1VUUFVUX0xWRFM6CisJCQludmQwX3Nvcl9jcmVhdGUoY29ubmVjdG9yLCBkY2JlKTsKKwkJCWJyZWFrOworCQljYXNlIE9VVFBVVF9BTkFMT0c6CisJCQludmQwX2RhY19jcmVhdGUoY29ubmVjdG9yLCBkY2JlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJTlZfV0FSTihkZXYsICJza2lwcGluZyB1bnN1cHBvcnRlZCBlbmNvZGVyICVkLyVkXG4iLAorCQkJCWRjYmUtPnR5cGUsIGZmcyhkY2JlLT5vcikgLSAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJLyogY3VsbCBhbnkgY29ubmVjdG9ycyB3ZSBjcmVhdGVkIHRoYXQgZG9uJ3QgaGF2ZSBhbiBlbmNvZGVyICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm5lY3RvciwgdG1wLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyX2lkc1swXSkKKwkJCWNvbnRpbnVlOworCisJCU5WX1dBUk4oZGV2LCAiJXMgaGFzIG5vIGVuY29kZXJzLCByZW1vdmluZ1xuIiwKKwkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCWNvbm5lY3Rvci0+ZnVuY3MtPmRlc3Ryb3koY29ubmVjdG9yKTsKKwl9CisKKwkvKiBzZXR1cCBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKwl0YXNrbGV0X2luaXQoJmRpc3AtPnRhc2tsZXQsIG52ZDBfZGlzcGxheV9iaCwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDI2LCBudmQwX2Rpc3BsYXlfaW50cik7CisKKwkvKiBoYXNoIHRhYmxlIGFuZCBkbWEgb2JqZWN0cyBmb3IgdGhlIG1lbW9yeSBhcmVhcyB3ZSBjYXJlIGFib3V0ICovCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHg0MDAwLCAweDEwMDAwLAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZkaXNwLT5tZW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTAwMCwgMHgwMDAwMDA0OSk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTAwNCwgKGRpc3AtPm1lbS0+dmluc3QgKyAweDIwMDApID4+IDgpOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwMDgsIChkaXNwLT5tZW0tPnZpbnN0ICsgMHgyZmZmKSA+PiA4KTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDBjLCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDEwLCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDE0LCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgwMDAwLCBOdkV2b1N5bmMpOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDAwMDQsICgweDEwMDAgPDwgOSkgfCAweDAwMDAwMDAxKTsKKworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwMjAsIDB4MDAwMDAwNDkpOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwMjQsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwMjgsIChkZXZfcHJpdi0+dnJhbV9zaXplIC0gMSkgPj4gOCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTAyYywgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTAzMCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTAzNCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MDAwOCwgTnZFdm9WUkFNKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgwMDBjLCAoMHgxMDIwIDw8IDkpIHwgMHgwMDAwMDAwMSk7CisKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDQwLCAweDAwMDAwMDA5KTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDQ0LCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDQ4LCAoZGV2X3ByaXYtPnZyYW1fc2l6ZSAtIDEpID4+IDgpOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwNGMsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwNTAsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwNTQsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDAwMTAsIE52RXZvVlJBTV9MUCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MDAxNCwgKDB4MTA0MCA8PCA5KSB8IDB4MDAwMDAwMDEpOworCisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTA2MCwgMHgwZmUwMDAwOSk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTA2NCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTA2OCwgKGRldl9wcml2LT52cmFtX3NpemUgLSAxKSA+PiA4KTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDZjLCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDcwLCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDc0LCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgwMDE4LCBOdkV2b0ZCMzIpOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDAwMWMsICgweDEwNjAgPDwgOSkgfCAweDAwMDAwMDAxKTsKKworCXBpbnN0bWVtLT5mbHVzaChkZXYpOworCisJLyogcHVzaCBidWZmZXJzIGZvciBldm8gY2hhbm5lbHMgKi8KKwlkaXNwLT5ldm9bMF0ucHRyID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUEFHRV9TSVpFLCAmZGlzcC0+ZXZvWzBdLmhhbmRsZSk7CisJaWYgKCFkaXNwLT5ldm9bMF0ucHRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG52ZDBfZGlzcGxheV9pbml0KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKK291dDoKKwlpZiAocmV0KQorCQludmQwX2Rpc3BsYXlfZGVzdHJveShkZXYpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2NjZS5jIGIvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9jY2UuYwppbmRleCA1NzBlMTkwLi5iY2FjOTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2NjZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfY2NlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2Rydi5jCmluZGV4IGI5ZThlZmQuLjRjODc5NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9kcnYuYwpAQCAtMjksNiArMjksOCBAQAogICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJyMTI4X2RybS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vTWFrZWZpbGUKaW5kZXggOWYzNjNlMC4uY2Y4YjRiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL01ha2VmaWxlCkBAIC03MCw3ICs3MCw3IEBACiAJcjIwMC5vIHJhZGVvbl9sZWdhY3lfdHYubyByNjAwX2NzLm8gcjYwMF9ibGl0Lm8gcjYwMF9ibGl0X3NoYWRlcnMubyBcCiAJcjYwMF9ibGl0X2ttcy5vIHJhZGVvbl9wbS5vIGF0b21iaW9zX2RwLm8gcjYwMF9hdWRpby5vIHI2MDBfaGRtaS5vIFwKIAlldmVyZ3JlZW4ubyBldmVyZ3JlZW5fY3MubyBldmVyZ3JlZW5fYmxpdF9zaGFkZXJzLm8gZXZlcmdyZWVuX2JsaXRfa21zLm8gXAotCXJhZGVvbl90cmFjZV9wb2ludHMubyBuaS5vIGNheW1hbl9ibGl0X3NoYWRlcnMubworCXJhZGVvbl90cmFjZV9wb2ludHMubyBuaS5vIGNheW1hbl9ibGl0X3NoYWRlcnMubyBhdG9tYmlvc19lbmNvZGVycy5vCiAKIHJhZGVvbi0kKENPTkZJR19DT01QQVQpICs9IHJhZGVvbl9pb2MzMi5vCiByYWRlb24tJChDT05GSUdfVkdBX1NXSVRDSEVST08pICs9IHJhZGVvbl9hdHB4X2hhbmRsZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwppbmRleCBhNTE1YjJhLi44NzYzMWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwpAQCAtNTU4LDcgKzU1OCw3IEBACiAJCQkJYnBjID0gY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uYnBjOwogCQkJZW5jb2Rlcl9tb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKIAkJCWlmICgocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHx8Ci0JCQkgICAgcmFkZW9uX2VuY29kZXJfaXNfZHBfYnJpZGdlKGVuY29kZXIpKSB7CisJCQkgICAgKHJhZGVvbl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChlbmNvZGVyKSAhPSBFTkNPREVSX09CSkVDVF9JRF9OT05FKSkgewogCQkJCWlmIChjb25uZWN0b3IpIHsKIAkJCQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJCQkJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yID0KQEAgLTYzOCw0NCArNjM4LDI5IEBACiAJCQkJaWYgKHNzX2VuYWJsZWQgJiYgc3MtPnBlcmNlbnRhZ2UpCiAJCQkJCWFyZ3MudjMuc0lucHV0LnVjRGlzcFBsbENvbmZpZyB8PQogCQkJCQkJRElTUFBMTF9DT05GSUdfU1NfRU5BQkxFOwotCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkgfHwKLQkJCQkgICAgcmFkZW9uX2VuY29kZXJfaXNfZHBfYnJpZGdlKGVuY29kZXIpKSB7CisJCQkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChlbmNvZGVyX21vZGUpKSB7CisJCQkJCWFyZ3MudjMuc0lucHV0LnVjRGlzcFBsbENvbmZpZyB8PQorCQkJCQkJRElTUFBMTF9DT05GSUdfQ09IRVJFTlRfTU9ERTsKKwkJCQkJLyogMTYyMDAgb3IgMjcwMDAgKi8KKwkJCQkJYXJncy52My5zSW5wdXQudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYoZHBfY2xvY2sgLyAxMCk7CisJCQkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKIAkJCQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0JCQkJCWlmIChlbmNvZGVyX21vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHsKKwkJCQkJaWYgKGVuY29kZXJfbW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JKQorCQkJCQkJLyogZGVlcCBjb2xvciBzdXBwb3J0ICovCisJCQkJCQlhcmdzLnYzLnNJbnB1dC51c1BpeGVsQ2xvY2sgPQorCQkJCQkJCWNwdV90b19sZTE2KChtb2RlLT5jbG9jayAqIGJwYyAvIDgpIC8gMTApOworCQkJCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQogCQkJCQkJYXJncy52My5zSW5wdXQudWNEaXNwUGxsQ29uZmlnIHw9CiAJCQkJCQkJRElTUFBMTF9DT05GSUdfQ09IRVJFTlRfTU9ERTsKLQkJCQkJCS8qIDE2MjAwIG9yIDI3MDAwICovCi0JCQkJCQlhcmdzLnYzLnNJbnB1dC51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihkcF9jbG9jayAvIDEwKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChlbmNvZGVyX21vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkgewotCQkJCQkJCS8qIGRlZXAgY29sb3Igc3VwcG9ydCAqLwotCQkJCQkJCWFyZ3MudjMuc0lucHV0LnVzUGl4ZWxDbG9jayA9Ci0JCQkJCQkJCWNwdV90b19sZTE2KChtb2RlLT5jbG9jayAqIGJwYyAvIDgpIC8gMTApOwotCQkJCQkJfQotCQkJCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKLQkJCQkJCQlhcmdzLnYzLnNJbnB1dC51Y0Rpc3BQbGxDb25maWcgfD0KLQkJCQkJCQkJRElTUFBMTF9DT05GSUdfQ09IRVJFTlRfTU9ERTsKLQkJCQkJCWlmIChtb2RlLT5jbG9jayA+IDE2NTAwMCkKLQkJCQkJCQlhcmdzLnYzLnNJbnB1dC51Y0Rpc3BQbGxDb25maWcgfD0KLQkJCQkJCQkJRElTUFBMTF9DT05GSUdfRFVBTF9MSU5LOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHsKLQkJCQkJaWYgKGVuY29kZXJfbW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgeworCQkJCQlpZiAobW9kZS0+Y2xvY2sgPiAxNjUwMDApCiAJCQkJCQlhcmdzLnYzLnNJbnB1dC51Y0Rpc3BQbGxDb25maWcgfD0KLQkJCQkJCQlESVNQUExMX0NPTkZJR19DT0hFUkVOVF9NT0RFOwotCQkJCQkJLyogMTYyMDAgb3IgMjcwMDAgKi8KLQkJCQkJCWFyZ3MudjMuc0lucHV0LnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KGRwX2Nsb2NrIC8gMTApOwotCQkJCQl9IGVsc2UgaWYgKGVuY29kZXJfbW9kZSAhPSBBVE9NX0VOQ09ERVJfTU9ERV9MVkRTKSB7Ci0JCQkJCQlpZiAobW9kZS0+Y2xvY2sgPiAxNjUwMDApCi0JCQkJCQkJYXJncy52My5zSW5wdXQudWNEaXNwUGxsQ29uZmlnIHw9Ci0JCQkJCQkJCURJU1BQTExfQ09ORklHX0RVQUxfTElOSzsKLQkJCQkJfQorCQkJCQkJCURJU1BQTExfQ09ORklHX0RVQUxfTElOSzsKIAkJCQl9Ci0JCQkJaWYgKHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShlbmNvZGVyKSkgewotCQkJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7Ci0JCQkJCXN0cnVjdCByYWRlb25fZW5jb2RlciAqZXh0X3JhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZXh0X2VuY29kZXIpOwotCQkJCQlhcmdzLnYzLnNJbnB1dC51Y0V4dFRyYW5zbWl0dGVySUQgPSBleHRfcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQ7Ci0JCQkJfSBlbHNlCisJCQkJaWYgKHJhZGVvbl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChlbmNvZGVyKSAhPQorCQkJCSAgICBFTkNPREVSX09CSkVDVF9JRF9OT05FKQorCQkJCQlhcmdzLnYzLnNJbnB1dC51Y0V4dFRyYW5zbWl0dGVySUQgPQorCQkJCQkJcmFkZW9uX2VuY29kZXJfZ2V0X2RwX2JyaWRnZV9lbmNvZGVyX2lkKGVuY29kZXIpOworCQkJCWVsc2UKIAkJCQkJYXJncy52My5zSW5wdXQudWNFeHRUcmFuc21pdHRlcklEID0gMDsKIAogCQkJCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LApAQCAtOTQ1LDYgKzkzMCw3IEBACiAJCWJwYyA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYzsKIAogCQlzd2l0Y2ggKGVuY29kZXJfbW9kZSkgeworCQljYXNlIEFUT01fRU5DT0RFUl9NT0RFX0RQX01TVDoKIAkJY2FzZSBBVE9NX0VOQ09ERVJfTU9ERV9EUDoKIAkJCS8qIERQL2VEUCAqLwogCQkJZHBfY2xvY2sgPSBkaWdfY29ubmVjdG9yLT5kcF9jbG9jayAvIDEwOwpAQCAtMTQ1MCw3ICsxNDM2LDcgQEAKIAkJCQkgKiBQUExML0RDUExMIHByb2dyYW1taW5nIGFuZCBvbmx5IHByb2dyYW0gdGhlIERQIERUTyBmb3IgdGhlCiAJCQkJICogY3J0YyB2aXJ0dWFsIHBpeGVsIGNsb2NrLgogCQkJCSAqLwotCQkJCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKHRlc3RfZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHsKKwkJCQlpZiAoRU5DT0RFUl9NT0RFX0lTX0RQKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUodGVzdF9lbmNvZGVyKSkpIHsKIAkJCQkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSB8fCByZGV2LT5jbG9jay5kcF9leHRjbGspCiAJCQkJCQlyZXR1cm4gQVRPTV9QUExMX0lOVkFMSUQ7CiAJCQkJfQpAQCAtMTUzNiwxMiArMTUyMiw2IEBACiAJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JLyogYWRqdXN0IHBtIHRvIHVwY29taW5nIG1vZGUgY2hhbmdlICovCi0JcmFkZW9uX3BtX2NvbXB1dGVfY2xvY2tzKHJkZXYpOwotCiAJaWYgKCFyYWRlb25fY3J0Y19zY2FsaW5nX21vZGVfZml4dXAoY3J0YywgbW9kZSwgYWRqdXN0ZWRfbW9kZSkpCiAJCXJldHVybiBmYWxzZTsKIAlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYwppbmRleCA3OWU4ZWJjLi42ZmIzMzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19kcC5jCkBAIC0yODMsNyArMjgzLDcgQEAKIAkJfQogCX0KIAotCURSTV9FUlJPUigiYXV4IGkyYyB0b28gbWFueSByZXRyaWVzLCBnaXZpbmcgdXBcbiIpOworCURSTV9ERUJVR19LTVMoImF1eCBpMmMgdG9vIG1hbnkgcmV0cmllcywgZ2l2aW5nIHVwXG4iKTsKIAlyZXR1cm4gLUVSRU1PVEVJTzsKIH0KIApAQCAtNDgyLDcgKzQ4Miw4IEBACiAJaW50IGJwcCA9IGNvbnZlcnRfYnBjX3RvX2JwcChjb25uZWN0b3ItPmRpc3BsYXlfaW5mby5icGMpOwogCWludCBsYW5lX251bSwgbWF4X3BpeF9jbG9jazsKIAotCWlmIChyYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfZHBfYnJpZGdlKGNvbm5lY3RvcikpCisJaWYgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoY29ubmVjdG9yKSA9PQorCSAgICBFTkNPREVSX09CSkVDVF9JRF9OVVRNRUcpCiAJCXJldHVybiAyNzAwMDA7CiAKIAlsYW5lX251bSA9IHJhZGVvbl9kcF9nZXRfZHBfbGFuZV9udW1iZXIoY29ubmVjdG9yLCBkcGNkLCBwaXhfY2xvY2spOwpAQCAtNTUzLDE3ICs1NTQsMzIgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAlpbnQgcGFuZWxfbW9kZSA9IERQX1BBTkVMX01PREVfRVhURVJOQUxfRFBfTU9ERTsKIAogCWlmICghQVNJQ19JU19EQ0U0KHJkZXYpKQogCQlyZXR1cm47CiAKLQlpZiAocmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2lzX2RwX2JyaWRnZShjb25uZWN0b3IpKQorCWlmIChyYWRlb25fY29ubmVjdG9yX2VuY29kZXJfZ2V0X2RwX2JyaWRnZV9lbmNvZGVyX2lkKGNvbm5lY3RvcikgPT0KKwkgICAgRU5DT0RFUl9PQkpFQ1RfSURfTlVUTUVHKQogCQlwYW5lbF9tb2RlID0gRFBfUEFORUxfTU9ERV9JTlRFUk5BTF9EUDFfTU9ERTsKKwllbHNlIGlmIChyYWRlb25fY29ubmVjdG9yX2VuY29kZXJfZ2V0X2RwX2JyaWRnZV9lbmNvZGVyX2lkKGNvbm5lY3RvcikgPT0KKwkJIEVOQ09ERVJfT0JKRUNUX0lEX1RSQVZJUykKKwkJcGFuZWxfbW9kZSA9IERQX1BBTkVMX01PREVfSU5URVJOQUxfRFAyX01PREU7CisJZWxzZSBpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKSB7CisJCXU4IHRtcCA9IHJhZGVvbl9yZWFkX2RwY2RfcmVnKHJhZGVvbl9jb25uZWN0b3IsIERQX0VEUF9DT05GSUdVUkFUSU9OX0NBUCk7CisJCWlmICh0bXAgJiAxKQorCQkJcGFuZWxfbW9kZSA9IERQX1BBTkVMX01PREVfSU5URVJOQUxfRFAyX01PREU7CisJfQogCiAJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwKIAkJCQkgICBBVE9NX0VOQ09ERVJfQ01EX1NFVFVQX1BBTkVMX01PREUsCiAJCQkJICAgcGFuZWxfbW9kZSk7CisKKwlpZiAoKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgJiYKKwkgICAgKHBhbmVsX21vZGUgPT0gRFBfUEFORUxfTU9ERV9JTlRFUk5BTF9EUDJfTU9ERSkpIHsKKwkJcmFkZW9uX3dyaXRlX2RwY2RfcmVnKHJhZGVvbl9jb25uZWN0b3IsIERQX0VEUF9DT05GSUdVUkFUSU9OX1NFVCwgMSk7CisJfQogfQogCiB2b2lkIHJhZGVvbl9kcF9zZXRfbGlua19jb25maWcoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZW5jb2RlcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZW5jb2RlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWMwNGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19lbmNvZGVycy5jCkBAIC0wLDAgKzEsMjM2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3LTExIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IERhdmUgQWlybGllCisgKiAgICAgICAgICBBbGV4IERldWNoZXIKKyAqLworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uLmgiCisjaW5jbHVkZSAiYXRvbS5oIgorCitleHRlcm4gaW50IGF0b21fZGVidWc7CisKKy8qIGV2aWwgYnV0IGluY2x1ZGluZyBhdG9tYmlvcy5oIGlzIG11Y2ggd29yc2UgKi8KK2Jvb2wgcmFkZW9uX2F0b21fZ2V0X3R2X3RpbWluZ3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpbmRleCwKKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7CisKKworc3RhdGljIGlubGluZSBib29sIHJhZGVvbl9lbmNvZGVyX2lzX2RpZ2l0YWwoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVlRNMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RWTzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3IgKgorcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXJfaW5pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiByYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzKQorCQkJcmV0dXJuIGNvbm5lY3RvcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIHJhZGVvbl9hdG9tX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIHNldCB0aGUgYWN0aXZlIGVuY29kZXIgdG8gY29ubmVjdG9yIHJvdXRpbmcgKi8KKwlyYWRlb25fZW5jb2Rlcl9zZXRfYWN0aXZlX2RldmljZShlbmNvZGVyKTsKKwlkcm1fbW9kZV9zZXRfY3J0Y2luZm8oYWRqdXN0ZWRfbW9kZSwgMCk7CisKKwkvKiBodyBidWcgKi8KKwlpZiAoKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJICAgICYmIChtb2RlLT5jcnRjX3ZzeW5jX3N0YXJ0IDwgKG1vZGUtPmNydGNfdmRpc3BsYXkgKyAyKSkpCisJCWFkanVzdGVkX21vZGUtPmNydGNfdnN5bmNfc3RhcnQgPSBhZGp1c3RlZF9tb2RlLT5jcnRjX3ZkaXNwbGF5ICsgMjsKKworCS8qIGdldCB0aGUgbmF0aXZlIG1vZGUgZm9yIExWRFMgKi8KKwlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKQorCQlyYWRlb25fcGFuZWxfbW9kZV9maXh1cChlbmNvZGVyLCBhZGp1c3RlZF9tb2RlKTsKKworCS8qIGdldCB0aGUgbmF0aXZlIG1vZGUgZm9yIFRWICovCisJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKSB7CisJCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RhYyAqdHZfZGFjID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OworCQlpZiAodHZfZGFjKSB7CisJCQlpZiAodHZfZGFjLT50dl9zdGQgPT0gVFZfU1REX05UU0MgfHwKKwkJCSAgICB0dl9kYWMtPnR2X3N0ZCA9PSBUVl9TVERfTlRTQ19KIHx8CisJCQkgICAgdHZfZGFjLT50dl9zdGQgPT0gVFZfU1REX1BBTF9NKQorCQkJCXJhZGVvbl9hdG9tX2dldF90dl90aW1pbmdzKHJkZXYsIDAsIGFkanVzdGVkX21vZGUpOworCQkJZWxzZQorCQkJCXJhZGVvbl9hdG9tX2dldF90dl90aW1pbmdzKHJkZXYsIDEsIGFkanVzdGVkX21vZGUpOworCQl9CisJfQorCisJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSAmJgorCSAgICAoKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB8fAorCSAgICAgKHJhZGVvbl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChlbmNvZGVyKSAhPSBFTkNPREVSX09CSkVDVF9JRF9OT05FKSkpIHsKKwkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOworCQlyYWRlb25fZHBfc2V0X2xpbmtfY29uZmlnKGNvbm5lY3RvciwgbW9kZSk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tYmlvc19kYWNfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlEQUNfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gYXJnczsKKwlpbnQgaW5kZXggPSAwOworCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RhYyAqZGFjX2luZm8gPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisKKwlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6CisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgREFDMUVuY29kZXJDb250cm9sKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMyOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6CisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgREFDMkVuY29kZXJDb250cm9sKTsKKwkJYnJlYWs7CisJfQorCisJYXJncy51Y0FjdGlvbiA9IGFjdGlvbjsKKworCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkpCisJCWFyZ3MudWNEYWNTdGFuZGFyZCA9IEFUT01fREFDMV9QUzI7CisJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCisJCWFyZ3MudWNEYWNTdGFuZGFyZCA9IEFUT01fREFDMV9DVjsKKwllbHNlIHsKKwkJc3dpdGNoIChkYWNfaW5mby0+dHZfc3RkKSB7CisJCWNhc2UgVFZfU1REX1BBTDoKKwkJY2FzZSBUVl9TVERfUEFMX006CisJCWNhc2UgVFZfU1REX1NDQVJUX1BBTDoKKwkJY2FzZSBUVl9TVERfU0VDQU06CisJCWNhc2UgVFZfU1REX1BBTF9DTjoKKwkJCWFyZ3MudWNEYWNTdGFuZGFyZCA9IEFUT01fREFDMV9QQUw7CisJCQlicmVhazsKKwkJY2FzZSBUVl9TVERfTlRTQzoKKwkJY2FzZSBUVl9TVERfTlRTQ19KOgorCQljYXNlIFRWX1NURF9QQUxfNjA6CisJCWRlZmF1bHQ6CisJCQlhcmdzLnVjRGFjU3RhbmRhcmQgPSBBVE9NX0RBQzFfTlRTQzsKKwkJCWJyZWFrOworCQl9CisJfQorCWFyZ3MudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisKK30KKworc3RhdGljIHZvaWQKK2F0b21iaW9zX3R2X3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJVFZfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gYXJnczsKKwlpbnQgaW5kZXggPSAwOworCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RhYyAqZGFjX2luZm8gPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisKKwlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRWRW5jb2RlckNvbnRyb2wpOworCisJYXJncy5zVFZFbmNvZGVyLnVjQWN0aW9uID0gYWN0aW9uOworCisJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9DVjsKKwllbHNlIHsKKwkJc3dpdGNoIChkYWNfaW5mby0+dHZfc3RkKSB7CisJCWNhc2UgVFZfU1REX05UU0M6CisJCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9OVFNDOworCQkJYnJlYWs7CisJCWNhc2UgVFZfU1REX1BBTDoKKwkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTDsKKwkJCWJyZWFrOworCQljYXNlIFRWX1NURF9QQUxfTToKKwkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTE07CisJCQlicmVhazsKKwkJY2FzZSBUVl9TVERfUEFMXzYwOgorCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfUEFMNjA7CisJCQlicmVhazsKKwkJY2FzZSBUVl9TVERfTlRTQ19KOgorCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfTlRTQ0o7CisJCQlicmVhazsKKwkJY2FzZSBUVl9TVERfU0NBUlRfUEFMOgorCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfUEFMOyAvKiA/Pz8gKi8KKwkJCWJyZWFrOworCQljYXNlIFRWX1NURF9TRUNBTToKKwkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1NFQ0FNOworCQkJYnJlYWs7CisJCWNhc2UgVFZfU1REX1BBTF9DTjoKKwkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTENOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9OVFNDOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlhcmdzLnNUVkVuY29kZXIudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisKK30KKwordW5pb24gZHZvX2VuY29kZXJfY29udHJvbCB7CisJRU5BQkxFX0VYVEVSTkFMX1RNRFNfRU5DT0RFUl9QU19BTExPQ0FUSU9OIGV4dF90bWRzOworCURWT19FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiBkdm87CisJRFZPX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OX1YzIGR2b192MzsKK307CisKK3ZvaWQKK2F0b21iaW9zX2R2b19zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXVuaW9uIGR2b19lbmNvZGVyX2NvbnRyb2wgYXJnczsKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEVk9FbmNvZGVyQ29udHJvbCk7CisJdWludDhfdCBmcmV2LCBjcmV2OworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCisJCXJldHVybjsKKworCXN3aXRjaCAoZnJldikgeworCWNhc2UgMToKKwkJc3dpdGNoIChjcmV2KSB7CisJCWNhc2UgMToKKwkJCS8qIFI0eHgsIFI1eHggKi8KKwkJCWFyZ3MuZXh0X3RtZHMuc1hUbWRzRW5jb2Rlci51Y0VuYWJsZSA9IGFjdGlvbjsKKworCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJCQlhcmdzLmV4dF90bWRzLnNYVG1kc0VuY29kZXIudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19EVUFMOworCisJCQlhcmdzLmV4dF90bWRzLnNYVG1kc0VuY29kZXIudWNNaXNjIHw9IEFUT01fUEFORUxfTUlTQ184ODhSR0I7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJLyogUlM2MDAvNjkwLzc0MCAqLworCQkJYXJncy5kdm8uc0RWT0VuY29kZXIudWNBY3Rpb24gPSBhY3Rpb247CisJCQlhcmdzLmR2by5zRFZPRW5jb2Rlci51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQkvKiBERlAxLCBDUlQxLCBUVjEgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHBvcnQgKi8KKwkJCWFyZ3MuZHZvLnNEVk9FbmNvZGVyLnVjRGV2aWNlVHlwZSA9IEFUT01fREVWSUNFX0RGUDFfSU5ERVg7CisKKwkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy5kdm8uc0RWT0VuY29kZXIudXNEZXZBdHRyLnNEaWdBdHRyaWIudWNBdHRyaWJ1dGUgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJLyogUjZ4eCAqLworCQkJYXJncy5kdm9fdjMudWNBY3Rpb24gPSBhY3Rpb247CisJCQlhcmdzLmR2b192My51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQlhcmdzLmR2b192My51Y0RWT0NvbmZpZyA9IDA7IC8qIFhYWCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoIlVua25vd24gdGFibGUgdmVyc2lvbiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKKwkJYnJlYWs7CisJfQorCisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Cit9CisKK3VuaW9uIGx2ZHNfZW5jb2Rlcl9jb250cm9sIHsKKwlMVkRTX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OICAgIHYxOworCUxWRFNfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT05fVjIgdjI7Cit9OworCit2b2lkCithdG9tYmlvc19kaWdpdGFsX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisJdW5pb24gbHZkc19lbmNvZGVyX2NvbnRyb2wgYXJnczsKKwlpbnQgaW5kZXggPSAwOworCWludCBoZG1pX2RldGVjdGVkID0gMDsKKwl1aW50OF90IGZyZXYsIGNyZXY7CisKKwlpZiAoIWRpZykKKwkJcmV0dXJuOworCisJaWYgKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkKKwkJaGRtaV9kZXRlY3RlZCA9IDE7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisKKwlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgorCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIExWRFNFbmNvZGVyQ29udHJvbCk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6CisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVE1EUzFFbmNvZGVyQ29udHJvbCk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpCisJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIExWRFNFbmNvZGVyQ29udHJvbCk7CisJCWVsc2UKKwkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVE1EUzJFbmNvZGVyQ29udHJvbCk7CisJCWJyZWFrOworCX0KKworCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGZyZXYpIHsKKwljYXNlIDE6CisJY2FzZSAyOgorCQlzd2l0Y2ggKGNyZXYpIHsKKwkJY2FzZSAxOgorCQkJYXJncy52MS51Y01pc2MgPSAwOworCQkJYXJncy52MS51Y0FjdGlvbiA9IGFjdGlvbjsKKwkJCWlmIChoZG1pX2RldGVjdGVkKQorCQkJCWFyZ3MudjEudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19IRE1JX1RZUEU7CisJCQlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKwkJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHsKKwkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ19EVUFMKQorCQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfRFVBTDsKKwkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ184ODhSR0IpCisJCQkJCWFyZ3MudjEudWNNaXNjIHw9IEFUT01fUEFORUxfTUlTQ184ODhSR0I7CisJCQl9IGVsc2UgeworCQkJCWlmIChkaWctPmxpbmtiKQorCQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfVE1EU19MSU5LQjsKKwkJCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfRFVBTDsKKwkJCQkvKmlmIChwU2Nybi0+cmdiQml0cyA9PSA4KSAqLworCQkJCWFyZ3MudjEudWNNaXNjIHw9IEFUT01fUEFORUxfTUlTQ184ODhSR0I7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCQlhcmdzLnYyLnVjTWlzYyA9IDA7CisJCQlhcmdzLnYyLnVjQWN0aW9uID0gYWN0aW9uOworCQkJaWYgKGNyZXYgPT0gMykgeworCQkJCWlmIChkaWctPmNvaGVyZW50X21vZGUpCisJCQkJCWFyZ3MudjIudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19DT0hFUkVOVDsKKwkJCX0KKwkJCWlmIChoZG1pX2RldGVjdGVkKQorCQkJCWFyZ3MudjIudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19IRE1JX1RZUEU7CisJCQlhcmdzLnYyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKwkJCWFyZ3MudjIudWNUcnVuY2F0ZSA9IDA7CisJCQlhcmdzLnYyLnVjU3BhdGlhbCA9IDA7CisJCQlhcmdzLnYyLnVjVGVtcG9yYWwgPSAwOworCQkJYXJncy52Mi51Y0ZSQyA9IDA7CisJCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7CisJCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfRFVBTCkKKwkJCQkJYXJncy52Mi51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7CisJCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfU1BBVElBTCkgeworCQkJCQlhcmdzLnYyLnVjU3BhdGlhbCA9IFBBTkVMX0VOQ09ERVJfU1BBVElBTF9ESVRIRVJfRU47CisJCQkJCWlmIChkaWctPmxjZF9taXNjICYgQVRPTV9QQU5FTF9NSVNDXzg4OFJHQikKKwkJCQkJCWFyZ3MudjIudWNTcGF0aWFsIHw9IFBBTkVMX0VOQ09ERVJfU1BBVElBTF9ESVRIRVJfREVQVEg7CisJCQkJfQorCQkJCWlmIChkaWctPmxjZF9taXNjICYgQVRPTV9QQU5FTF9NSVNDX1RFTVBPUkFMKSB7CisJCQkJCWFyZ3MudjIudWNUZW1wb3JhbCA9IFBBTkVMX0VOQ09ERVJfVEVNUE9SQUxfRElUSEVSX0VOOworCQkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ184ODhSR0IpCisJCQkJCQlhcmdzLnYyLnVjVGVtcG9yYWwgfD0gUEFORUxfRU5DT0RFUl9URU1QT1JBTF9ESVRIRVJfREVQVEg7CisJCQkJCWlmICgoKGRpZy0+bGNkX21pc2MgPj4gQVRPTV9QQU5FTF9NSVNDX0dSRVlfTEVWRUxfU0hJRlQpICYgMHgzKSA9PSAyKQorCQkJCQkJYXJncy52Mi51Y1RlbXBvcmFsIHw9IFBBTkVMX0VOQ09ERVJfVEVNUE9SQUxfTEVWRUxfNDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChkaWctPmxpbmtiKQorCQkJCQlhcmdzLnYyLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfVE1EU19MSU5LQjsKKwkJCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCQlhcmdzLnYyLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfRFVBTDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCWJyZWFrOworCX0KKworCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworfQorCitpbnQKK2F0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yOworCisJLyogZHAgYnJpZGdlcyBhcmUgYWx3YXlzIERQICovCisJaWYgKHJhZGVvbl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChlbmNvZGVyKSAhPSBFTkNPREVSX09CSkVDVF9JRF9OT05FKQorCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFA7CisKKwkvKiBEVk8gaXMgYWx3YXlzIERWTyAqLworCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EVk8pCisJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVk87CisKKwljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKKwkvKiBpZiB3ZSBkb24ndCBoYXZlIGFuIGFjdGl2ZSBkZXZpY2UgeWV0LCBqdXN0IHVzZSBvbmUgb2YKKwkgKiB0aGUgY29ubmVjdG9ycyB0aWVkIHRvIHRoZSBlbmNvZGVyLgorCSAqLworCWlmICghY29ubmVjdG9yKQorCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2Rlcl9pbml0KGVuY29kZXIpOworCXJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisKKwlzd2l0Y2ggKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUpIHsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJOgorCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0hETUlCOiAvKiBIRE1JLUIgaXMgYmFzaWNhbGx5IERMLURWSTsgYW5hbG9nIHdvcmtzIGZpbmUgKi8KKwkJaWYgKGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhyYWRlb25fY29ubmVjdG9yLT5lZGlkKSAmJiByYWRlb25fYXVkaW8pIHsKKwkJCS8qIGZpeCBtZSAqLworCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKKwkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOworCQkJZWxzZQorCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JOworCQl9IGVsc2UgaWYgKHJhZGVvbl9jb25uZWN0b3ItPnVzZV9kaWdpdGFsKQorCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWSTsKKwkJZWxzZQorCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0NSVDsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRDoKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQToKKwlkZWZhdWx0OgorCQlpZiAoZHJtX2RldGVjdF9tb25pdG9yX2F1ZGlvKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpICYmIHJhZGVvbl9hdWRpbykgeworCQkJLyogZml4IG1lICovCisJCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQorCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7CisJCQllbHNlCisJCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0hETUk7CisJCX0gZWxzZQorCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWSTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUzoKKwkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0xWRFM7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0OgorCQlkaWdfY29ubmVjdG9yID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisJCWlmICgoZGlnX2Nvbm5lY3Rvci0+ZHBfc2lua190eXBlID09IENPTk5FQ1RPUl9PQkpFQ1RfSURfRElTUExBWVBPUlQpIHx8CisJCSAgICAoZGlnX2Nvbm5lY3Rvci0+ZHBfc2lua190eXBlID09IENPTk5FQ1RPUl9PQkpFQ1RfSURfZURQKSkKKwkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EUDsKKwkJZWxzZSBpZiAoZHJtX2RldGVjdF9tb25pdG9yX2F1ZGlvKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpICYmIHJhZGVvbl9hdWRpbykgeworCQkJLyogZml4IG1lICovCisJCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQorCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7CisJCQllbHNlCisJCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0hETUk7CisJCX0gZWxzZQorCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWSTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfZURQOgorCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFA7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJQToKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E6CisJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9DUlQ7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvc2l0ZToKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU86CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfOVBpbkRJTjoKKwkJLyogZml4IG1lICovCisJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9UVjsKKwkJLypyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfQ1Y7Ki8KKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRElHIEVuY29kZXIvVHJhbnNtaXR0ZXIgU2V0dXAKKyAqCisgKiBEQ0UgMy4wLzMuMQorICogLSAyIERJRyB0cmFuc21pdHRlciBibG9ja3MuIFVOSVBIWSAobGlua3MgQSBhbmQgQikgYW5kIExWVE1BLgorICogU3VwcG9ydHMgdXAgdG8gMyBkaWdpdGFsIG91dHB1dHMKKyAqIC0gMiBESUcgZW5jb2RlciBibG9ja3MuCisgKiBESUcxIGNhbiBkcml2ZSBVTklQSFkgbGluayBBIG9yIGxpbmsgQgorICogRElHMiBjYW4gZHJpdmUgVU5JUEhZIGxpbmsgQiBvciBMVlRNQQorICoKKyAqIERDRSAzLjIKKyAqIC0gMyBESUcgdHJhbnNtaXR0ZXIgYmxvY2tzLiBVTklQSFkwLzEvMiAobGlua3MgQSBhbmQgQikuCisgKiBTdXBwb3J0cyB1cCB0byA1IGRpZ2l0YWwgb3V0cHV0cworICogLSAyIERJRyBlbmNvZGVyIGJsb2Nrcy4KKyAqIERJRzEvMiBjYW4gZHJpdmUgVU5JUEhZMC8xLzIgbGluayBBIG9yIGxpbmsgQgorICoKKyAqIERDRSA0LjAvNS4wCisgKiAtIDMgRElHIHRyYW5zbWl0dGVyIGJsb2NrcyBVTklQSFkwLzEvMiAobGlua3MgQSBhbmQgQikuCisgKiBTdXBwb3J0cyB1cCB0byA2IGRpZ2l0YWwgb3V0cHV0cworICogLSA2IERJRyBlbmNvZGVyIGJsb2Nrcy4KKyAqIC0gRElHIHRvIFBIWSBtYXBwaW5nIGlzIGhhcmRjb2RlZAorICogRElHMSBkcml2ZXMgVU5JUEhZMCBsaW5rIEEsIEErQgorICogRElHMiBkcml2ZXMgVU5JUEhZMCBsaW5rIEIKKyAqIERJRzMgZHJpdmVzIFVOSVBIWTEgbGluayBBLCBBK0IKKyAqIERJRzQgZHJpdmVzIFVOSVBIWTEgbGluayBCCisgKiBESUc1IGRyaXZlcyBVTklQSFkyIGxpbmsgQSwgQStCCisgKiBESUc2IGRyaXZlcyBVTklQSFkyIGxpbmsgQgorICoKKyAqIERDRSA0LjEKKyAqIC0gMyBESUcgdHJhbnNtaXR0ZXIgYmxvY2tzIFVOSVBIWTAvMS8yIChsaW5rcyBBIGFuZCBCKS4KKyAqIFN1cHBvcnRzIHVwIHRvIDYgZGlnaXRhbCBvdXRwdXRzCisgKiAtIDIgRElHIGVuY29kZXIgYmxvY2tzLgorICogRElHMS8yIGNhbiBkcml2ZSBVTklQSFkwLzEvMiBsaW5rIEEgb3IgbGluayBCCisgKgorICogUm91dGluZworICogY3J0YyAtPiBkaWcgZW5jb2RlciAtPiBVTklQSFkvTFZUTUEgKDEgb3IgMiBsaW5rcykKKyAqIEV4YW1wbGVzOgorICogY3J0YzAgLT4gZGlnMiAtPiBMVlRNQSAgIGxpbmtzIEErQiAtPiBUTURTL0hETUkKKyAqIGNydGMxIC0+IGRpZzEgLT4gVU5JUEhZMCBsaW5rICBCICAgLT4gRFAKKyAqIGNydGMwIC0+IGRpZzEgLT4gVU5JUEhZMiBsaW5rICBBICAgLT4gTFZEUworICogY3J0YzEgLT4gZGlnMiAtPiBVTklQSFkxIGxpbmsgIEIrQSAtPiBUTURTL0hETUkKKyAqLworCit1bmlvbiBkaWdfZW5jb2Rlcl9jb250cm9sIHsKKwlESUdfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gdjE7CisJRElHX0VOQ09ERVJfQ09OVFJPTF9QQVJBTUVURVJTX1YyIHYyOworCURJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WMyB2MzsKKwlESUdfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjQgdjQ7Cit9OworCit2b2lkCithdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24sIGludCBwYW5lbF9tb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CisJdW5pb24gZGlnX2VuY29kZXJfY29udHJvbCBhcmdzOworCWludCBpbmRleCA9IDA7CisJdWludDhfdCBmcmV2LCBjcmV2OworCWludCBkcF9jbG9jayA9IDA7CisJaW50IGRwX2xhbmVfY291bnQgPSAwOworCWludCBocGRfaWQgPSBSQURFT05fSFBEX05PTkU7CisJaW50IGJwYyA9IDg7CisKKwlpZiAoY29ubmVjdG9yKSB7CisJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9CisJCQlyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKworCQlkcF9jbG9jayA9IGRpZ19jb25uZWN0b3ItPmRwX2Nsb2NrOworCQlkcF9sYW5lX2NvdW50ID0gZGlnX2Nvbm5lY3Rvci0+ZHBfbGFuZV9jb3VudDsKKwkJaHBkX2lkID0gcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZDsKKwkJYnBjID0gY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uYnBjOworCX0KKworCS8qIG5vIGRpZyBlbmNvZGVyIGFzc2lnbmVkICovCisJaWYgKGRpZy0+ZGlnX2VuY29kZXIgPT0gLTEpCisJCXJldHVybjsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKworCWlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRElHeEVuY29kZXJDb250cm9sKTsKKwllbHNlIHsKKwkJaWYgKGRpZy0+ZGlnX2VuY29kZXIpCisJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERJRzJFbmNvZGVyQ29udHJvbCk7CisJCWVsc2UKKwkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRElHMUVuY29kZXJDb250cm9sKTsKKwl9CisKKwlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChmcmV2KSB7CisJY2FzZSAxOgorCQlzd2l0Y2ggKGNyZXYpIHsKKwkJY2FzZSAxOgorCQkJYXJncy52MS51Y0FjdGlvbiA9IGFjdGlvbjsKKwkJCWFyZ3MudjEudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCQkJaWYgKGFjdGlvbiA9PSBBVE9NX0VOQ09ERVJfQ01EX1NFVFVQX1BBTkVMX01PREUpCisJCQkJYXJncy52My51Y1BhbmVsTW9kZSA9IHBhbmVsX21vZGU7CisJCQllbHNlCisJCQkJYXJncy52MS51Y0VuY29kZXJNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKKworCQkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhcmdzLnYxLnVjRW5jb2Rlck1vZGUpKQorCQkJCWFyZ3MudjEudWNMYW5lTnVtID0gZHBfbGFuZV9jb3VudDsKKwkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJCQlhcmdzLnYxLnVjTGFuZU51bSA9IDg7CisJCQllbHNlCisJCQkJYXJncy52MS51Y0xhbmVOdW0gPSA0OworCisJCQlpZiAoRU5DT0RFUl9NT0RFX0lTX0RQKGFyZ3MudjEudWNFbmNvZGVyTW9kZSkgJiYgKGRwX2Nsb2NrID09IDI3MDAwMCkpCisJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0RQTElOS1JBVEVfMl83MEdIWjsKKwkJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgorCQkJCWFyZ3MudjEudWNDb25maWcgPSBBVE9NX0VOQ09ERVJfQ09ORklHX1YyX1RSQU5TTUlUVEVSMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgorCQkJCWFyZ3MudjEudWNDb25maWcgPSBBVE9NX0VOQ09ERVJfQ09ORklHX1YyX1RSQU5TTUlUVEVSMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKKwkJCQlhcmdzLnYxLnVjQ29uZmlnID0gQVRPTV9FTkNPREVSX0NPTkZJR19WMl9UUkFOU01JVFRFUjM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZGlnLT5saW5rYikKKwkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfTElOS0I7CisJCQllbHNlCisJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0xJTktBOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJYXJncy52My51Y0FjdGlvbiA9IGFjdGlvbjsKKwkJCWFyZ3MudjMudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCQkJaWYgKGFjdGlvbiA9PSBBVE9NX0VOQ09ERVJfQ01EX1NFVFVQX1BBTkVMX01PREUpCisJCQkJYXJncy52My51Y1BhbmVsTW9kZSA9IHBhbmVsX21vZGU7CisJCQllbHNlCisJCQkJYXJncy52My51Y0VuY29kZXJNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKKworCQkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhcmdzLnYxLnVjRW5jb2Rlck1vZGUpKQorCQkJCWFyZ3MudjMudWNMYW5lTnVtID0gZHBfbGFuZV9jb3VudDsKKwkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJCQlhcmdzLnYzLnVjTGFuZU51bSA9IDg7CisJCQllbHNlCisJCQkJYXJncy52My51Y0xhbmVOdW0gPSA0OworCisJCQlpZiAoRU5DT0RFUl9NT0RFX0lTX0RQKGFyZ3MudjEudWNFbmNvZGVyTW9kZSkgJiYgKGRwX2Nsb2NrID09IDI3MDAwMCkpCisJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfMl83MEdIWjsKKwkJCWFyZ3MudjMuYWNDb25maWcudWNEaWdTZWwgPSBkaWctPmRpZ19lbmNvZGVyOworCQkJc3dpdGNoIChicGMpIHsKKwkJCWNhc2UgMDoKKwkJCQlhcmdzLnYzLnVjQml0UGVyQ29sb3IgPSBQQU5FTF9CUENfVU5ERUZJTkU7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJYXJncy52My51Y0JpdFBlckNvbG9yID0gUEFORUxfNkJJVF9QRVJfQ09MT1I7CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQlkZWZhdWx0OgorCQkJCWFyZ3MudjMudWNCaXRQZXJDb2xvciA9IFBBTkVMXzhCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDoKKwkJCQlhcmdzLnYzLnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xMEJJVF9QRVJfQ09MT1I7CisJCQkJYnJlYWs7CisJCQljYXNlIDEyOgorCQkJCWFyZ3MudjMudWNCaXRQZXJDb2xvciA9IFBBTkVMXzEyQklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTY6CisJCQkJYXJncy52My51Y0JpdFBlckNvbG9yID0gUEFORUxfMTZCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWFyZ3MudjQudWNBY3Rpb24gPSBhY3Rpb247CisJCQlhcmdzLnY0LnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKwkJCWlmIChhY3Rpb24gPT0gQVRPTV9FTkNPREVSX0NNRF9TRVRVUF9QQU5FTF9NT0RFKQorCQkJCWFyZ3MudjQudWNQYW5lbE1vZGUgPSBwYW5lbF9tb2RlOworCQkJZWxzZQorCQkJCWFyZ3MudjQudWNFbmNvZGVyTW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7CisKKwkJCWlmIChFTkNPREVSX01PREVfSVNfRFAoYXJncy52MS51Y0VuY29kZXJNb2RlKSkKKwkJCQlhcmdzLnY0LnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7CisJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy52NC51Y0xhbmVOdW0gPSA4OworCQkJZWxzZQorCQkJCWFyZ3MudjQudWNMYW5lTnVtID0gNDsKKworCQkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhcmdzLnYxLnVjRW5jb2Rlck1vZGUpKSB7CisJCQkJaWYgKGRwX2Nsb2NrID09IDI3MDAwMCkKKwkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RQTElOS1JBVEVfMl83MEdIWjsKKwkJCQllbHNlIGlmIChkcF9jbG9jayA9PSA1NDAwMDApCisJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19WNF9EUExJTktSQVRFXzVfNDBHSFo7CisJCQl9CisJCQlhcmdzLnY0LmFjQ29uZmlnLnVjRGlnU2VsID0gZGlnLT5kaWdfZW5jb2RlcjsKKwkJCXN3aXRjaCAoYnBjKSB7CisJCQljYXNlIDA6CisJCQkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfQlBDX1VOREVGSU5FOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCWFyZ3MudjQudWNCaXRQZXJDb2xvciA9IFBBTkVMXzZCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJZGVmYXVsdDoKKwkJCQlhcmdzLnY0LnVjQml0UGVyQ29sb3IgPSBQQU5FTF84QklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfMTBCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJY2FzZSAxMjoKKwkJCQlhcmdzLnY0LnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xMkJJVF9QRVJfQ09MT1I7CisJCQkJYnJlYWs7CisJCQljYXNlIDE2OgorCQkJCWFyZ3MudjQudWNCaXRQZXJDb2xvciA9IFBBTkVMXzE2QklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChocGRfaWQgPT0gUkFERU9OX0hQRF9OT05FKQorCQkJCWFyZ3MudjQudWNIUERfSUQgPSAwOworCQkJZWxzZQorCQkJCWFyZ3MudjQudWNIUERfSUQgPSBocGRfaWQgKyAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoIlVua25vd24gdGFibGUgdmVyc2lvbiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKKwkJYnJlYWs7CisJfQorCisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisKK30KKwordW5pb24gZGlnX3RyYW5zbWl0dGVyX2NvbnRyb2wgeworCURJR19UUkFOU01JVFRFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gdjE7CisJRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WMiB2MjsKKwlESUdfVFJBTlNNSVRURVJfQ09OVFJPTF9QQVJBTUVURVJTX1YzIHYzOworCURJR19UUkFOU01JVFRFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjQgdjQ7Cit9OworCit2b2lkCithdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWN0aW9uLCB1aW50OF90IGxhbmVfbnVtLCB1aW50OF90IGxhbmVfc2V0KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXVuaW9uIGRpZ190cmFuc21pdHRlcl9jb250cm9sIGFyZ3M7CisJaW50IGluZGV4ID0gMDsKKwl1aW50OF90IGZyZXYsIGNyZXY7CisJYm9vbCBpc19kcCA9IGZhbHNlOworCWludCBwbGxfaWQgPSAwOworCWludCBkcF9jbG9jayA9IDA7CisJaW50IGRwX2xhbmVfY291bnQgPSAwOworCWludCBjb25uZWN0b3Jfb2JqZWN0X2lkID0gMDsKKwlpbnQgaWdwX2xhbmVfaW5mbyA9IDA7CisJaW50IGRpZ19lbmNvZGVyID0gZGlnLT5kaWdfZW5jb2RlcjsKKworCWlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fSU5JVCkgeworCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2Rlcl9pbml0KGVuY29kZXIpOworCQkvKiBqdXN0IG5lZWRlZCB0byBhdm9pZCBiYWlsaW5nIGluIHRoZSBlbmNvZGVyIGNoZWNrLiAgdGhlIGVuY29kZXIKKwkJICogaXNuJ3QgdXNlZCBmb3IgaW5pdAorCQkgKi8KKwkJZGlnX2VuY29kZXIgPSAwOworCX0gZWxzZQorCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKKworCWlmIChjb25uZWN0b3IpIHsKKwkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yID0KKwkJCXJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCisJCWRwX2Nsb2NrID0gZGlnX2Nvbm5lY3Rvci0+ZHBfY2xvY2s7CisJCWRwX2xhbmVfY291bnQgPSBkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50OworCQljb25uZWN0b3Jfb2JqZWN0X2lkID0KKwkJCShyYWRlb25fY29ubmVjdG9yLT5jb25uZWN0b3Jfb2JqZWN0X2lkICYgT0JKRUNUX0lEX01BU0spID4+IE9CSkVDVF9JRF9TSElGVDsKKwkJaWdwX2xhbmVfaW5mbyA9IGRpZ19jb25uZWN0b3ItPmlncF9sYW5lX2luZm87CisJfQorCisJaWYgKGVuY29kZXItPmNydGMpIHsKKwkJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGVuY29kZXItPmNydGMpOworCQlwbGxfaWQgPSByYWRlb25fY3J0Yy0+cGxsX2lkOworCX0KKworCS8qIG5vIGRpZyBlbmNvZGVyIGFzc2lnbmVkICovCisJaWYgKGRpZ19lbmNvZGVyID09IC0xKQorCQlyZXR1cm47CisKKwlpZiAoRU5DT0RFUl9NT0RFX0lTX0RQKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikpKQorCQlpc19kcCA9IHRydWU7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisKKwlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKKwkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEVk9PdXRwdXRDb250cm9sKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKKwkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBVTklQSFlUcmFuc21pdHRlckNvbnRyb2wpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKKwkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMVlRNQVRyYW5zbWl0dGVyQ29udHJvbCk7CisJCWJyZWFrOworCX0KKworCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGZyZXYpIHsKKwljYXNlIDE6CisJCXN3aXRjaCAoY3JldikgeworCQljYXNlIDE6CisJCQlhcmdzLnYxLnVjQWN0aW9uID0gYWN0aW9uOworCQkJaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9JTklUKSB7CisJCQkJYXJncy52MS51c0luaXRJbmZvID0gY3B1X3RvX2xlMTYoY29ubmVjdG9yX29iamVjdF9pZCk7CisJCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9TRVRVUF9WU0VNUEgpIHsKKwkJCQlhcmdzLnYxLmFzTW9kZS51Y0xhbmVTZWwgPSBsYW5lX251bTsKKwkJCQlhcmdzLnYxLmFzTW9kZS51Y0xhbmVTZXQgPSBsYW5lX3NldDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlzX2RwKQorCQkJCQlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9CisJCQkJCQljcHVfdG9fbGUxNihkcF9jbG9jayAvIDEwKTsKKwkJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJCWFyZ3MudjEudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYoKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDIpIC8gMTApOworCQkJCWVsc2UKKwkJCQkJYXJncy52MS51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQl9CisKKwkJCWFyZ3MudjEudWNDb25maWcgPSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19DTEtTUkNfUFBMTDsKKworCQkJaWYgKGRpZ19lbmNvZGVyKQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfRElHMl9FTkNPREVSOworCQkJZWxzZQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfRElHMV9FTkNPREVSOworCisJCQlpZiAoKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgJiYKKwkJCSAgICAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZKSkgeworCQkJCWlmIChpc19kcCB8fCAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIDw9IDE2NTAwMCkpIHsKKwkJCQkJaWYgKGlncF9sYW5lX2luZm8gJiAweDEpCisJCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xBTkVfMF8zOworCQkJCQllbHNlIGlmIChpZ3BfbGFuZV9pbmZvICYgMHgyKQorCQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzRfNzsKKwkJCQkJZWxzZSBpZiAoaWdwX2xhbmVfaW5mbyAmIDB4NCkKKwkJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV84XzExOworCQkJCQllbHNlIGlmIChpZ3BfbGFuZV9pbmZvICYgMHg4KQorCQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzEyXzE1OworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChpZ3BfbGFuZV9pbmZvICYgMHgzKQorCQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzBfNzsKKwkJCQkJZWxzZSBpZiAoaWdwX2xhbmVfaW5mbyAmIDB4YykKKwkJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV84XzE1OworCQkJCX0KKwkJCX0KKworCQkJaWYgKGRpZy0+bGlua2IpCisJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MSU5LQjsKKwkJCWVsc2UKKwkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xJTktBOworCisJCQlpZiAoaXNfZHApCisJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19DT0hFUkVOVDsKKwkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUKSkgeworCQkJCWlmIChkaWctPmNvaGVyZW50X21vZGUpCisJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfQ09IRVJFTlQ7CisJCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR184TEFORV9MSU5LOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWFyZ3MudjIudWNBY3Rpb24gPSBhY3Rpb247CisJCQlpZiAoYWN0aW9uID09IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0lOSVQpIHsKKwkJCQlhcmdzLnYyLnVzSW5pdEluZm8gPSBjcHVfdG9fbGUxNihjb25uZWN0b3Jfb2JqZWN0X2lkKTsKKwkJCX0gZWxzZSBpZiAoYWN0aW9uID09IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1NFVFVQX1ZTRU1QSCkgeworCQkJCWFyZ3MudjIuYXNNb2RlLnVjTGFuZVNlbCA9IGxhbmVfbnVtOworCQkJCWFyZ3MudjIuYXNNb2RlLnVjTGFuZVNldCA9IGxhbmVfc2V0OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaXNfZHApCisJCQkJCWFyZ3MudjIudXNQaXhlbENsb2NrID0KKwkJCQkJCWNwdV90b19sZTE2KGRwX2Nsb2NrIC8gMTApOworCQkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJCQkJYXJncy52Mi51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNigocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMikgLyAxMCk7CisJCQkJZWxzZQorCQkJCQlhcmdzLnYyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKwkJCX0KKworCQkJYXJncy52Mi5hY0NvbmZpZy51Y0VuY29kZXJTZWwgPSBkaWdfZW5jb2RlcjsKKwkJCWlmIChkaWctPmxpbmtiKQorCQkJCWFyZ3MudjIuYWNDb25maWcudWNMaW5rU2VsID0gMTsKKworCQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJCQkJYXJncy52Mi5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwkJCQlhcmdzLnYyLmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCQkJCWFyZ3MudjIuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpc19kcCkgeworCQkJCWFyZ3MudjIuYWNDb25maWcuZkNvaGVyZW50TW9kZSA9IDE7CisJCQkJYXJncy52Mi5hY0NvbmZpZy5mRFBDb25uZWN0b3IgPSAxOworCQkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKKwkJCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQorCQkJCQlhcmdzLnYyLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOworCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJCWFyZ3MudjIuYWNDb25maWcuZkR1YWxMaW5rQ29ubmVjdG9yID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlhcmdzLnYzLnVjQWN0aW9uID0gYWN0aW9uOworCQkJaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9JTklUKSB7CisJCQkJYXJncy52My51c0luaXRJbmZvID0gY3B1X3RvX2xlMTYoY29ubmVjdG9yX29iamVjdF9pZCk7CisJCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9TRVRVUF9WU0VNUEgpIHsKKwkJCQlhcmdzLnYzLmFzTW9kZS51Y0xhbmVTZWwgPSBsYW5lX251bTsKKwkJCQlhcmdzLnYzLmFzTW9kZS51Y0xhbmVTZXQgPSBsYW5lX3NldDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlzX2RwKQorCQkJCQlhcmdzLnYzLnVzUGl4ZWxDbG9jayA9CisJCQkJCQljcHVfdG9fbGUxNihkcF9jbG9jayAvIDEwKTsKKwkJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJCWFyZ3MudjMudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYoKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDIpIC8gMTApOworCQkJCWVsc2UKKwkJCQkJYXJncy52My51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQl9CisKKwkJCWlmIChpc19kcCkKKwkJCQlhcmdzLnYzLnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7CisJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy52My51Y0xhbmVOdW0gPSA4OworCQkJZWxzZQorCQkJCWFyZ3MudjMudWNMYW5lTnVtID0gNDsKKworCQkJaWYgKGRpZy0+bGlua2IpCisJCQkJYXJncy52My5hY0NvbmZpZy51Y0xpbmtTZWwgPSAxOworCQkJaWYgKGRpZ19lbmNvZGVyICYgMSkKKwkJCQlhcmdzLnYzLmFjQ29uZmlnLnVjRW5jb2RlclNlbCA9IDE7CisKKwkJCS8qIFNlbGVjdCB0aGUgUExMIGZvciB0aGUgUEhZCisJCQkgKiBEUCBQSFkgc2hvdWxkIGJlIGNsb2NrZWQgZnJvbSBleHRlcm5hbCBzcmMgaWYgdGhlcmUgaXMKKwkJCSAqIG9uZS4KKwkJCSAqLworCQkJLyogT24gRENFNCwgaWYgdGhlcmUgaXMgYW4gZXh0ZXJuYWwgY2xvY2ssIGl0IGdlbmVyYXRlcyB0aGUgRFAgcmVmIGNsb2NrICovCisJCQlpZiAoaXNfZHAgJiYgcmRldi0+Y2xvY2suZHBfZXh0Y2xrKQorCQkJCWFyZ3MudjMuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSAyOyAvKiBleHRlcm5hbCBzcmMgKi8KKwkJCWVsc2UKKwkJCQlhcmdzLnYzLmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gcGxsX2lkOworCisJCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwkJCQlhcmdzLnYzLmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCQkJCWFyZ3MudjMuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJCQkJYXJncy52My5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGlzX2RwKQorCQkJCWFyZ3MudjMuYWNDb25maWcuZkNvaGVyZW50TW9kZSA9IDE7IC8qIERQIHJlcXVpcmVzIGNvaGVyZW50ICovCisJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKKwkJCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQorCQkJCQlhcmdzLnYzLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOworCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJCWFyZ3MudjMuYWNDb25maWcuZkR1YWxMaW5rQ29ubmVjdG9yID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlhcmdzLnY0LnVjQWN0aW9uID0gYWN0aW9uOworCQkJaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9JTklUKSB7CisJCQkJYXJncy52NC51c0luaXRJbmZvID0gY3B1X3RvX2xlMTYoY29ubmVjdG9yX29iamVjdF9pZCk7CisJCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9TRVRVUF9WU0VNUEgpIHsKKwkJCQlhcmdzLnY0LmFzTW9kZS51Y0xhbmVTZWwgPSBsYW5lX251bTsKKwkJCQlhcmdzLnY0LmFzTW9kZS51Y0xhbmVTZXQgPSBsYW5lX3NldDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlzX2RwKQorCQkJCQlhcmdzLnY0LnVzUGl4ZWxDbG9jayA9CisJCQkJCQljcHVfdG9fbGUxNihkcF9jbG9jayAvIDEwKTsKKwkJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJCWFyZ3MudjQudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYoKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDIpIC8gMTApOworCQkJCWVsc2UKKwkJCQkJYXJncy52NC51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQl9CisKKwkJCWlmIChpc19kcCkKKwkJCQlhcmdzLnY0LnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7CisJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy52NC51Y0xhbmVOdW0gPSA4OworCQkJZWxzZQorCQkJCWFyZ3MudjQudWNMYW5lTnVtID0gNDsKKworCQkJaWYgKGRpZy0+bGlua2IpCisJCQkJYXJncy52NC5hY0NvbmZpZy51Y0xpbmtTZWwgPSAxOworCQkJaWYgKGRpZ19lbmNvZGVyICYgMSkKKwkJCQlhcmdzLnY0LmFjQ29uZmlnLnVjRW5jb2RlclNlbCA9IDE7CisKKwkJCS8qIFNlbGVjdCB0aGUgUExMIGZvciB0aGUgUEhZCisJCQkgKiBEUCBQSFkgc2hvdWxkIGJlIGNsb2NrZWQgZnJvbSBleHRlcm5hbCBzcmMgaWYgdGhlcmUgaXMKKwkJCSAqIG9uZS4KKwkJCSAqLworCQkJLyogT24gRENFNSBEQ1BMTCB1c3VhbGx5IGdlbmVyYXRlcyB0aGUgRFAgcmVmIGNsb2NrICovCisJCQlpZiAoaXNfZHApIHsKKwkJCQlpZiAocmRldi0+Y2xvY2suZHBfZXh0Y2xrKQorCQkJCQlhcmdzLnY0LmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gRU5DT0RFUl9SRUZDTEtfU1JDX0VYVENMSzsKKwkJCQllbHNlCisJCQkJCWFyZ3MudjQuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSBFTkNPREVSX1JFRkNMS19TUkNfRENQTEw7CisJCQl9IGVsc2UKKwkJCQlhcmdzLnY0LmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gcGxsX2lkOworCisJCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwkJCQlhcmdzLnY0LmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCQkJCWFyZ3MudjQuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJCQkJYXJncy52NC5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGlzX2RwKQorCQkJCWFyZ3MudjQuYWNDb25maWcuZkNvaGVyZW50TW9kZSA9IDE7IC8qIERQIHJlcXVpcmVzIGNvaGVyZW50ICovCisJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKKwkJCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQorCQkJCQlhcmdzLnY0LmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOworCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJCWFyZ3MudjQuYWNDb25maWcuZkR1YWxMaW5rQ29ubmVjdG9yID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCWJyZWFrOworCX0KKworCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworfQorCitib29sCithdG9tYmlvc19zZXRfZWRwX3BhbmVsX3Bvd2VyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCBhY3Rpb24pCit7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJhZGVvbl9jb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bmlvbiBkaWdfdHJhbnNtaXR0ZXJfY29udHJvbCBhcmdzOworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFVOSVBIWVRyYW5zbWl0dGVyQ29udHJvbCk7CisJdWludDhfdCBmcmV2LCBjcmV2OworCisJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkKKwkJZ290byBkb25lOworCisJaWYgKCFBU0lDX0lTX0RDRTQocmRldikpCisJCWdvdG8gZG9uZTsKKworCWlmICgoYWN0aW9uICE9IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09OKSAmJgorCSAgICAoYWN0aW9uICE9IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09GRikpCisJCWdvdG8gZG9uZTsKKworCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQorCQlnb3RvIGRvbmU7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisKKwlhcmdzLnYxLnVjQWN0aW9uID0gYWN0aW9uOworCisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisKKwkvKiB3YWl0IGZvciB0aGUgcGFuZWwgdG8gcG93ZXIgdXAgKi8KKwlpZiAoYWN0aW9uID09IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09OKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAzMDA7IGkrKykgeworCQkJaWYgKHJhZGVvbl9ocGRfc2Vuc2UocmRldiwgcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCkpCisJCQkJcmV0dXJuIHRydWU7CisJCQltZGVsYXkoMSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK2RvbmU6CisJcmV0dXJuIHRydWU7Cit9CisKK3VuaW9uIGV4dGVybmFsX2VuY29kZXJfY29udHJvbCB7CisJRVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gdjE7CisJRVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT05fVjMgdjM7Cit9OworCitzdGF0aWMgdm9pZAorYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciwKKwkJCQlpbnQgYWN0aW9uKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmV4dF9yYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGV4dF9lbmNvZGVyKTsKKwl1bmlvbiBleHRlcm5hbF9lbmNvZGVyX2NvbnRyb2wgYXJnczsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIEV4dGVybmFsRW5jb2RlckNvbnRyb2wpOworCXU4IGZyZXYsIGNyZXY7CisJaW50IGRwX2Nsb2NrID0gMDsKKwlpbnQgZHBfbGFuZV9jb3VudCA9IDA7CisJaW50IGNvbm5lY3Rvcl9vYmplY3RfaWQgPSAwOworCXUzMiBleHRfZW51bSA9IChleHRfcmFkZW9uX2VuY29kZXItPmVuY29kZXJfZW51bSAmIEVOVU1fSURfTUFTSykgPj4gRU5VTV9JRF9TSElGVDsKKwlpbnQgYnBjID0gODsKKworCWlmIChhY3Rpb24gPT0gRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9JTklUKQorCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2Rlcl9pbml0KGVuY29kZXIpOworCWVsc2UKKwkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CisKKwlpZiAoY29ubmVjdG9yKSB7CisJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9CisJCQlyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKworCQlkcF9jbG9jayA9IGRpZ19jb25uZWN0b3ItPmRwX2Nsb2NrOworCQlkcF9sYW5lX2NvdW50ID0gZGlnX2Nvbm5lY3Rvci0+ZHBfbGFuZV9jb3VudDsKKwkJY29ubmVjdG9yX29iamVjdF9pZCA9CisJCQkocmFkZW9uX2Nvbm5lY3Rvci0+Y29ubmVjdG9yX29iamVjdF9pZCAmIE9CSkVDVF9JRF9NQVNLKSA+PiBPQkpFQ1RfSURfU0hJRlQ7CisJCWJwYyA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYzsKKwl9CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisKKwlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChmcmV2KSB7CisJY2FzZSAxOgorCQkvKiBubyBwYXJhbXMgb24gZnJldiAxICovCisJCWJyZWFrOworCWNhc2UgMjoKKwkJc3dpdGNoIChjcmV2KSB7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0FjdGlvbiA9IGFjdGlvbjsKKwkJCWFyZ3MudjEuc0RpZ0VuY29kZXIudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0VuY29kZXJNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKKworCQkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhcmdzLnYxLnNEaWdFbmNvZGVyLnVjRW5jb2Rlck1vZGUpKSB7CisJCQkJaWYgKGRwX2Nsb2NrID09IDI3MDAwMCkKKwkJCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0RQTElOS1JBVEVfMl83MEdIWjsKKwkJCQlhcmdzLnYxLnNEaWdFbmNvZGVyLnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7CisJCQl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJCQlhcmdzLnYxLnNEaWdFbmNvZGVyLnVjTGFuZU51bSA9IDg7CisJCQllbHNlCisJCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0xhbmVOdW0gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNBY3Rpb24gPSBhY3Rpb247CisJCQlpZiAoYWN0aW9uID09IEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfSU5JVCkKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVzQ29ubmVjdG9ySWQgPSBjcHVfdG9fbGUxNihjb25uZWN0b3Jfb2JqZWN0X2lkKTsKKwkJCWVsc2UKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKwkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNFbmNvZGVyTW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7CisKKwkJCWlmIChFTkNPREVSX01PREVfSVNfRFAoYXJncy52My5zRXh0RW5jb2Rlci51Y0VuY29kZXJNb2RlKSkgeworCQkJCWlmIChkcF9jbG9jayA9PSAyNzAwMDApCisJCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV8yXzcwR0haOworCQkJCWVsc2UgaWYgKGRwX2Nsb2NrID09IDU0MDAwMCkKKwkJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0NvbmZpZyB8PSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFXzVfNDBHSFo7CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0xhbmVOdW0gPSBkcF9sYW5lX2NvdW50OworCQkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0xhbmVOdW0gPSA4OworCQkJZWxzZQorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNMYW5lTnVtID0gNDsKKwkJCXN3aXRjaCAoZXh0X2VudW0pIHsKKwkJCWNhc2UgR1JBUEhfT0JKRUNUX0VOVU1fSUQxOgorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRU5DT0RFUjE7CisJCQkJYnJlYWs7CisJCQljYXNlIEdSQVBIX09CSkVDVF9FTlVNX0lEMjoKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVIyOworCQkJCWJyZWFrOworCQkJY2FzZSBHUkFQSF9PQkpFQ1RfRU5VTV9JRDM6CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0NvbmZpZyB8PSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSMzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAoYnBjKSB7CisJCQljYXNlIDA6CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0JpdFBlckNvbG9yID0gUEFORUxfQlBDX1VOREVGSU5FOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNCaXRQZXJDb2xvciA9IFBBTkVMXzZCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJZGVmYXVsdDoKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQml0UGVyQ29sb3IgPSBQQU5FTF84QklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0JpdFBlckNvbG9yID0gUEFORUxfMTBCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJY2FzZSAxMjoKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xMkJJVF9QRVJfQ09MT1I7CisJCQkJYnJlYWs7CisJCQljYXNlIDE2OgorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNCaXRQZXJDb2xvciA9IFBBTkVMXzE2QklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb246ICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb246ICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCXJldHVybjsKKwl9CisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tYmlvc195dXZfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGVuY29kZXItPmNydGMpOworCUVOQUJMRV9ZVVZfUFNfQUxMT0NBVElPTiBhcmdzOworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIEVuYWJsZVlVVik7CisJdWludDMyX3QgdGVtcCwgcmVnOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApCisJCXJlZyA9IFI2MDBfQklPU18zX1NDUkFUQ0g7CisJZWxzZQorCQlyZWcgPSBSQURFT05fQklPU18zX1NDUkFUQ0g7CisKKwkvKiBYWFg6IGZpeCB1cCBzY3JhdGNoIHJlZyBoYW5kbGluZyAqLworCXRlbXAgPSBSUkVHMzIocmVnKTsKKwlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCisJCVdSRUczMihyZWcsIChBVE9NX1MzX1RWMV9BQ1RJVkUgfAorCQkJICAgICAocmFkZW9uX2NydGMtPmNydGNfaWQgPDwgMTgpKSk7CisJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCisJCVdSRUczMihyZWcsIChBVE9NX1MzX0NWX0FDVElWRSB8IChyYWRlb25fY3J0Yy0+Y3J0Y19pZCA8PCAyNCkpKTsKKwllbHNlCisJCVdSRUczMihyZWcsIDApOworCisJaWYgKGVuYWJsZSkKKwkJYXJncy51Y0VuYWJsZSA9IEFUT01fRU5BQkxFOworCWFyZ3MudWNDUlRDID0gcmFkZW9uX2NydGMtPmNydGNfaWQ7CisKKwlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKworCVdSRUczMihyZWcsIHRlbXApOworfQorCitzdGF0aWMgdm9pZAorcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zX2F2aXZvKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCURJU1BMQVlfREVWSUNFX09VVFBVVF9DT05UUk9MX1BTX0FMTE9DQVRJT04gYXJnczsKKwlpbnQgaW5kZXggPSAwOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6CisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVE1EU0FPdXRwdXRDb250cm9sKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRERJOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRFZPT3V0cHV0Q29udHJvbCk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKKwkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMQ0QxT3V0cHV0Q29udHJvbCk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpCisJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIExDRDFPdXRwdXRDb250cm9sKTsKKwkJZWxzZQorCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMVlRNQU91dHB1dENvbnRyb2wpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQorCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBUVjFPdXRwdXRDb250cm9sKTsKKwkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCisJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIENWMU91dHB1dENvbnRyb2wpOworCQllbHNlCisJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQzFPdXRwdXRDb250cm9sKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMyOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6CisJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKKwkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVFYxT3V0cHV0Q29udHJvbCk7CisJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBDVjFPdXRwdXRDb250cm9sKTsKKwkJZWxzZQorCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEQUMyT3V0cHV0Q29udHJvbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIERSTV9NT0RFX0RQTVNfT046CisJCWFyZ3MudWNBY3Rpb24gPSBBVE9NX0VOQUJMRTsKKwkJLyogd29ya2Fyb3VuZCBmb3IgRFZPT3V0cHV0Q29udHJvbCBvbiBzb21lIFJTNjkwIHN5c3RlbXMgKi8KKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESSkgeworCQkJdTMyIHJlZyA9IFJSRUczMihSQURFT05fQklPU18zX1NDUkFUQ0gpOworCQkJV1JFRzMyKFJBREVPTl9CSU9TXzNfU0NSQVRDSCwgcmVnICYgfkFUT01fUzNfREZQMklfQUNUSVZFKTsKKwkJCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCQkJV1JFRzMyKFJBREVPTl9CSU9TXzNfU0NSQVRDSCwgcmVnKTsKKwkJfSBlbHNlCisJCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgeworCQkJYXJncy51Y0FjdGlvbiA9IEFUT01fTENEX0JMT047CisJCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQlhcmdzLnVjQWN0aW9uID0gQVRPTV9ESVNBQkxFOworCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgeworCQkJYXJncy51Y0FjdGlvbiA9IEFUT01fTENEX0JMT0ZGOworCQkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zX2RpZyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSBOVUxMOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpyYWRlb25fZGlnX2Nvbm5lY3RvciA9IE5VTEw7CisKKwlpZiAoY29ubmVjdG9yKSB7CisJCXJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCXJhZGVvbl9kaWdfY29ubmVjdG9yID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisJfQorCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgorCQkvKiBzb21lIGVhcmx5IGRjZTMuMiBib2FyZHMgaGF2ZSBhIGJ1ZyBpbiB0aGVpciB0cmFuc21pdHRlciBjb250cm9sIHRhYmxlICovCisJCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlY3MTApIHx8IChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjczMCkpCisJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFLCAwLCAwKTsKKwkJZWxzZQorCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRV9PVVRQVVQsIDAsIDApOworCQlpZiAoRU5DT0RFUl9NT0RFX0lTX0RQKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikpICYmIGNvbm5lY3RvcikgeworCQkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgeworCQkJCWF0b21iaW9zX3NldF9lZHBfcGFuZWxfcG93ZXIoY29ubmVjdG9yLAorCQkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT04pOworCQkJCXJhZGVvbl9kaWdfY29ubmVjdG9yLT5lZHBfb24gPSB0cnVlOworCQkJfQorCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKKwkJCQlhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBBVE9NX0VOQ09ERVJfQ01EX0RQX1ZJREVPX09GRiwgMCk7CisJCQlyYWRlb25fZHBfbGlua190cmFpbihlbmNvZGVyLCBjb25uZWN0b3IpOworCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKKwkJCQlhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBBVE9NX0VOQ09ERVJfQ01EX0RQX1ZJREVPX09OLCAwKTsKKwkJfQorCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKQorCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0xDRF9CTE9OLCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CisJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CisJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKKwkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0RJU0FCTEVfT1VUUFVULCAwLCAwKTsKKwkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpKSAmJiBjb25uZWN0b3IpIHsKKwkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkNPREVSX0NNRF9EUF9WSURFT19PRkYsIDApOworCQkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgeworCQkJCWF0b21iaW9zX3NldF9lZHBfcGFuZWxfcG93ZXIoY29ubmVjdG9yLAorCQkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT0ZGKTsKKwkJCQlyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZWRwX29uID0gZmFsc2U7CisJCQl9CisJCX0KKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKKwkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9MQ0RfQkxPRkYsIDAsIDApOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCityYWRlb25fYXRvbV9lbmNvZGVyX2RwbXNfZXh0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciwKKwkJCSAgICAgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIERSTV9NT0RFX0RQTVNfT046CisJZGVmYXVsdDoKKwkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpIHsKKwkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5BQkxFX09VVFBVVCk7CisJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfQkxBTktJTkdfT0ZGKTsKKwkJfSBlbHNlCisJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLCBBVE9NX0VOQUJMRSk7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgorCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgorCWNhc2UgRFJNX01PREVfRFBNU19PRkY6CisJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKSB7CisJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfQkxBTktJTkcpOworCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19ESVNBQkxFX09VVFBVVCk7CisJCX0gZWxzZQorCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIgPSByYWRlb25fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7CisKKwlEUk1fREVCVUdfS01TKCJlbmNvZGVyIGRwbXMgJWQgdG8gbW9kZSAlZCwgZGV2aWNlcyAlMDh4LCBhY3RpdmVfZGV2aWNlcyAlMDh4XG4iLAorCQkgIHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkLCBtb2RlLCByYWRlb25fZW5jb2Rlci0+ZGV2aWNlcywKKwkJICByYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSk7CisJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRERJOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgorCQlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXNfYXZpdm8oZW5jb2RlciwgbW9kZSk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6CisJCXJhZGVvbl9hdG9tX2VuY29kZXJfZHBtc19kaWcoZW5jb2RlciwgbW9kZSk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpIHsKKwkJCXN3aXRjaCAobW9kZSkgeworCQkJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgorCQkJCWF0b21iaW9zX2R2b19zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwkJCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgorCQkJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKKwkJCQlhdG9tYmlvc19kdm9fc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIGlmIChBU0lDX0lTX0RDRTMocmRldikpCisJCQlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXNfZGlnKGVuY29kZXIsIG1vZGUpOworCQllbHNlCisJCQlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXNfYXZpdm8oZW5jb2RlciwgbW9kZSk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgorCQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKSB7CisJCQlzd2l0Y2ggKG1vZGUpIHsKKwkJCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwkJCQlhdG9tYmlvc19kYWNfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CisJCQljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwkJCWNhc2UgRFJNX01PREVfRFBNU19PRkY6CisJCQkJYXRvbWJpb3NfZGFjX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorCQkJcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zX2F2aXZvKGVuY29kZXIsIG1vZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJaWYgKGV4dF9lbmNvZGVyKQorCQlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXNfZXh0KGVuY29kZXIsIGV4dF9lbmNvZGVyLCBtb2RlKTsKKworCXJhZGVvbl9hdG9tYmlvc19lbmNvZGVyX2RwbXNfc2NyYXRjaF9yZWdzKGVuY29kZXIsIChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pID8gdHJ1ZSA6IGZhbHNlKTsKKworfQorCit1bmlvbiBjcnRjX3NvdXJjZV9wYXJhbSB7CisJU0VMRUNUX0NSVENfU09VUkNFX1BTX0FMTE9DQVRJT04gdjE7CisJU0VMRUNUX0NSVENfU09VUkNFX1BBUkFNRVRFUlNfVjIgdjI7Cit9OworCitzdGF0aWMgdm9pZAorYXRvbWJpb3Nfc2V0X2VuY29kZXJfY3J0Y19zb3VyY2Uoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJdW5pb24gY3J0Y19zb3VyY2VfcGFyYW0gYXJnczsKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBTZWxlY3RDUlRDX1NvdXJjZSk7CisJdWludDhfdCBmcmV2LCBjcmV2OworCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCisJCXJldHVybjsKKworCXN3aXRjaCAoZnJldikgeworCWNhc2UgMToKKwkJc3dpdGNoIChjcmV2KSB7CisJCWNhc2UgMToKKwkJZGVmYXVsdDoKKwkJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQorCQkJCWFyZ3MudjEudWNDUlRDID0gcmFkZW9uX2NydGMtPmNydGNfaWQ7CisJCQllbHNlIHsKKwkJCQlpZiAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMSkgeworCQkJCQlhcmdzLnYxLnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOworCQkJCX0gZWxzZSB7CisJCQkJCWFyZ3MudjEudWNDUlRDID0gcmFkZW9uX2NydGMtPmNydGNfaWQgPDwgMjsKKwkJCQl9CisJCQl9CisJCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgorCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6CisJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0RGUDFfSU5ERVg7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgorCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCkKKwkJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0xDRDFfSU5ERVg7CisJCQkJZWxzZQorCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfREZQM19JTkRFWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRERJOgorCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKKwkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfREZQMl9JTkRFWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMToKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6CisJCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQorCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfVFYxX0lOREVYOworCQkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfQ1ZfSU5ERVg7CisJCQkJZWxzZQorCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfQ1JUMV9JTkRFWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6CisJCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQorCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfVFYxX0lOREVYOworCQkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfQ1ZfSU5ERVg7CisJCQkJZWxzZQorCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfQ1JUMl9JTkRFWDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlhcmdzLnYyLnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOworCQkJaWYgKHJhZGVvbl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChlbmNvZGVyKSAhPSBFTkNPREVSX09CSkVDVF9JRF9OT05FKSB7CisJCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOworCisJCQkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpCisJCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gQVRPTV9FTkNPREVSX01PREVfTFZEUzsKKwkJCQllbHNlIGlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EpCisJCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gQVRPTV9FTkNPREVSX01PREVfQ1JUOworCQkJCWVsc2UKKwkJCQkJYXJncy52Mi51Y0VuY29kZU1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOworCQkJfSBlbHNlCisJCQkJYXJncy52Mi51Y0VuY29kZU1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOworCQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKKwkJCQlkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisJCQkJc3dpdGNoIChkaWctPmRpZ19lbmNvZGVyKSB7CisJCQkJY2FzZSAwOgorCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHMV9FTkNPREVSX0lEOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUcyX0VOQ09ERVJfSUQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RJRzNfRU5DT0RFUl9JRDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHNF9FTkNPREVSX0lEOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUc1X0VOQ09ERVJfSUQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNToKKwkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RJRzZfRU5DT0RFUl9JRDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKKwkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRFZPX0VOQ09ERVJfSUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgorCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKKwkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX1RWX0VOQ09ERVJfSUQ7CisJCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCisJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9UVl9FTkNPREVSX0lEOworCQkJCWVsc2UKKwkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RBQzFfRU5DT0RFUl9JRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6CisJCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQorCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfVFZfRU5DT0RFUl9JRDsKKwkJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKKwkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX1RWX0VOQ09ERVJfSUQ7CisJCQkJZWxzZQorCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfREFDMl9FTkNPREVSX0lEOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb246ICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCXJldHVybjsKKwl9CisKKwlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKworCS8qIHVwZGF0ZSBzY3JhdGNoIHJlZ3Mgd2l0aCBuZXcgcm91dGluZyAqLworCXJhZGVvbl9hdG9tYmlvc19lbmNvZGVyX2NydGNfc2NyYXRjaF9yZWdzKGVuY29kZXIsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21iaW9zX2FwcGx5X2VuY29kZXJfcXVpcmtzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisKKwkvKiBGdW5reSBtYWNib29rcyAqLworCWlmICgoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg3MUM1KSAmJgorCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTA2YikgJiYKKwkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAwODApKSB7CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCkgeworCQkJdWludDMyX3QgbHZ0bWFfYml0X2RlcHRoX2NvbnRyb2wgPSBSUkVHMzIoQVZJVk9fTFZUTUFfQklUX0RFUFRIX0NPTlRST0wpOworCisJCQlsdnRtYV9iaXRfZGVwdGhfY29udHJvbCAmPSB+QVZJVk9fTFZUTUFfQklUX0RFUFRIX0NPTlRST0xfVFJVTkNBVEVfRU47CisJCQlsdnRtYV9iaXRfZGVwdGhfY29udHJvbCAmPSB+QVZJVk9fTFZUTUFfQklUX0RFUFRIX0NPTlRST0xfU1BBVElBTF9ESVRIRVJfRU47CisKKwkJCVdSRUczMihBVklWT19MVlRNQV9CSVRfREVQVEhfQ09OVFJPTCwgbHZ0bWFfYml0X2RlcHRoX2NvbnRyb2wpOworCQl9CisJfQorCisJLyogc2V0IHNjYWxlciBjbGVhcnMgdGhpcyBvbiBzb21lIGNoaXBzICovCisJaWYgKEFTSUNfSVNfQVZJVk8ocmRldikgJiYKKwkgICAgKCEocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpKSkgeworCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CisJCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKKwkJCQlXUkVHMzIoRVZFUkdSRUVOX0RBVEFfRk9STUFUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCQkJCSAgICAgICBFVkVSR1JFRU5fSU5URVJMRUFWRV9FTik7CisJCQllbHNlCisJCQkJV1JFRzMyKEVWRVJHUkVFTl9EQVRBX0ZPUk1BVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisJCX0gZWxzZSB7CisJCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKKwkJCQlXUkVHMzIoQVZJVk9fRDFNT0RFX0RBVEFfRk9STUFUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCQkJCSAgICAgICBBVklWT19EMU1PREVfSU5URVJMRUFWRV9FTik7CisJCQllbHNlCisJCQkJV1JFRzMyKEFWSVZPX0QxTU9ERV9EQVRBX0ZPUk1BVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2F0b21fcGlja19kaWdfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKnRlc3RfZW5jb2RlcjsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZzsKKwl1aW50MzJfdCBkaWdfZW5jX2luX3VzZSA9IDA7CisKKwkvKiBEQ0U0LzUgKi8KKwlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CisJCWRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKKwkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpIHsKKwkJCS8qIG9udGFyaW8gZm9sbG93cyBEQ0U0ICovCisJCQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfUEFMTSkgeworCQkJCWlmIChkaWctPmxpbmtiKQorCQkJCQlyZXR1cm4gMTsKKwkJCQllbHNlCisJCQkJCXJldHVybiAwOworCQkJfSBlbHNlCisJCQkJLyogbGxhbm8gZm9sbG93cyBEQ0UzLjIgKi8KKwkJCQlyZXR1cm4gcmFkZW9uX2NydGMtPmNydGNfaWQ7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwkJCQlpZiAoZGlnLT5saW5rYikKKwkJCQkJcmV0dXJuIDE7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwkJCQlpZiAoZGlnLT5saW5rYikKKwkJCQkJcmV0dXJuIDM7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKKwkJCQlpZiAoZGlnLT5saW5rYikKKwkJCQkJcmV0dXJuIDU7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIG9uIERDRTMyIGFuZCBlbmNvZGVyIGNhbiBkcml2ZXIgYW55IGJsb2NrIHNvIGp1c3QgY3J0YyBpZCAqLworCWlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKSB7CisJCXJldHVybiByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKKwl9CisKKwkvKiBvbiBEQ0UzIC0gTFZUTUEgY2FuIG9ubHkgYmUgZHJpdmVuIGJ5IERJR0IgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlc3RfZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX3Rlc3RfZW5jb2RlcjsKKworCQlpZiAoZW5jb2RlciA9PSB0ZXN0X2VuY29kZXIpCisJCQljb250aW51ZTsKKworCQlpZiAoIXJhZGVvbl9lbmNvZGVyX2lzX2RpZ2l0YWwodGVzdF9lbmNvZGVyKSkKKwkJCWNvbnRpbnVlOworCisJCXJhZGVvbl90ZXN0X2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2Rlcih0ZXN0X2VuY29kZXIpOworCQlkaWcgPSByYWRlb25fdGVzdF9lbmNvZGVyLT5lbmNfcHJpdjsKKworCQlpZiAoZGlnLT5kaWdfZW5jb2RlciA+PSAwKQorCQkJZGlnX2VuY19pbl91c2UgfD0gKDEgPDwgZGlnLT5kaWdfZW5jb2Rlcik7CisJfQorCisJaWYgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQSkgeworCQlpZiAoZGlnX2VuY19pbl91c2UgJiAweDIpCisJCQlEUk1fRVJST1IoIkxWRFMgcmVxdWlyZWQgZGlnaXRhbCBlbmNvZGVyIDIgYnV0IGl0IHdhcyBpbiB1c2UgLSBzdGVhbGluZ1xuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoIShkaWdfZW5jX2luX3VzZSAmIDEpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyogVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0dXAgKi8KK3ZvaWQKK3JhZGVvbl9hdG9tX2VuY29kZXJfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmRldi0+ZGRldjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIgPSByYWRlb25fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7CisKKwkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgorCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0lOSVQsIDAsIDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChleHRfZW5jb2RlciAmJiBBU0lDX0lTX0RDRTQxKHJkZXYpKQorCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0lOSVQpOworCX0KK30KKworc3RhdGljIHZvaWQKK3JhZGVvbl9hdG9tX2VuY29kZXJfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIgPSByYWRlb25fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7CisKKwlyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPSBhZGp1c3RlZF9tb2RlLT5jbG9jazsKKworCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpICYmICFBU0lDX0lTX0RDRTQocmRldikpIHsKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKKwkJCWF0b21iaW9zX3l1dl9zZXR1cChlbmNvZGVyLCB0cnVlKTsKKwkJZWxzZQorCQkJYXRvbWJpb3NfeXV2X3NldHVwKGVuY29kZXIsIGZhbHNlKTsKKwl9CisKKwlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9UTURTMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9UTURTMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVlRNMToKKwkJYXRvbWJpb3NfZGlnaXRhbF9zZXR1cChlbmNvZGVyLCBQQU5FTF9FTkNPREVSX0FDVElPTl9FTkFCTEUpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgorCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CisJCQkvKiBkaXNhYmxlIHRoZSB0cmFuc21pdHRlciAqLworCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0RJU0FCTEUsIDAsIDApOworCQkJLyogc2V0dXAgYW5kIGVuYWJsZSB0aGUgZW5jb2RlciAqLworCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkNPREVSX0NNRF9TRVRVUCwgMCk7CisKKwkJCS8qIGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKwkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEUsIDAsIDApOworCQl9IGVsc2UgeworCQkJLyogZGlzYWJsZSB0aGUgZW5jb2RlciBhbmQgdHJhbnNtaXR0ZXIgKi8KKwkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9ESVNBQkxFLCAwLCAwKTsKKwkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSwgMCk7CisKKwkJCS8qIHNldHVwIGFuZCBlbmFibGUgdGhlIGVuY29kZXIgYW5kIHRyYW5zbWl0dGVyICovCisJCQlhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSwgMCk7CisJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fU0VUVVAsIDAsIDApOworCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRSwgMCwgMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CisJCWF0b21iaW9zX2R2b19zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgorCQlhdG9tYmlvc19kYWNfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUpOworCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCB8IEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKSB7CisJCQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCB8IEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQkJCWF0b21iaW9zX3R2X3NldHVwKGVuY29kZXIsIEFUT01fRU5BQkxFKTsKKwkJCWVsc2UKKwkJCQlhdG9tYmlvc190dl9zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOworCQl9CisJCWJyZWFrOworCX0KKworCWlmIChleHRfZW5jb2RlcikgeworCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkKKwkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9TRVRVUCk7CisJCWVsc2UKKwkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsIEFUT01fRU5BQkxFKTsKKwl9CisKKwlhdG9tYmlvc19hcHBseV9lbmNvZGVyX3F1aXJrcyhlbmNvZGVyLCBhZGp1c3RlZF9tb2RlKTsKKworCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0hETUkpIHsKKwkJcjYwMF9oZG1pX2VuYWJsZShlbmNvZGVyKTsKKwkJcjYwMF9oZG1pX3NldG1vZGUoZW5jb2RlciwgYWRqdXN0ZWRfbW9kZSk7CisJfQorfQorCitzdGF0aWMgYm9vbAorYXRvbWJpb3NfZGFjX2xvYWRfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisKKwlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCB8CisJCQkJICAgICAgIEFUT01fREVWSUNFX0NWX1NVUFBPUlQgfAorCQkJCSAgICAgICBBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkpIHsKKwkJREFDX0xPQURfREVURUNUSU9OX1BTX0FMTE9DQVRJT04gYXJnczsKKwkJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgREFDX0xvYWREZXRlY3Rpb24pOworCQl1aW50OF90IGZyZXYsIGNyZXY7CisKKwkJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWFyZ3Muc0RhY2xvYWQudWNNaXNjID0gMDsKKworCQlpZiAoKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzEpIHx8CisJCSAgICAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzEpKQorCQkJYXJncy5zRGFjbG9hZC51Y0RhY1R5cGUgPSBBVE9NX0RBQ19BOworCQllbHNlCisJCQlhcmdzLnNEYWNsb2FkLnVjRGFjVHlwZSA9IEFUT01fREFDX0I7CisKKwkJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQpCisJCQlhcmdzLnNEYWNsb2FkLnVzRGV2aWNlSUQgPSBjcHVfdG9fbGUxNihBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQpOworCQllbHNlIGlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMl9TVVBQT1JUKQorCQkJYXJncy5zRGFjbG9hZC51c0RldmljZUlEID0gY3B1X3RvX2xlMTYoQVRPTV9ERVZJQ0VfQ1JUMl9TVVBQT1JUKTsKKwkJZWxzZSBpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NWX1NVUFBPUlQpIHsKKwkJCWFyZ3Muc0RhY2xvYWQudXNEZXZpY2VJRCA9IGNwdV90b19sZTE2KEFUT01fREVWSUNFX0NWX1NVUFBPUlQpOworCQkJaWYgKGNyZXYgPj0gMykKKwkJCQlhcmdzLnNEYWNsb2FkLnVjTWlzYyA9IERBQ19MT0FEX01JU0NfWVByUGI7CisJCX0gZWxzZSBpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX1RWMV9TVVBQT1JUKSB7CisJCQlhcmdzLnNEYWNsb2FkLnVzRGV2aWNlSUQgPSBjcHVfdG9fbGUxNihBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCk7CisJCQlpZiAoY3JldiA+PSAzKQorCQkJCWFyZ3Muc0RhY2xvYWQudWNNaXNjID0gREFDX0xPQURfTUlTQ19ZUHJQYjsKKwkJfQorCisJCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCisJCXJldHVybiB0cnVlOworCX0gZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCityYWRlb25fYXRvbV9kYWNfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJdWludDMyX3QgYmlvc18wX3NjcmF0Y2g7CisKKwlpZiAoIWF0b21iaW9zX2RhY19sb2FkX2RldGVjdChlbmNvZGVyLCBjb25uZWN0b3IpKSB7CisJCURSTV9ERUJVR19LTVMoImRldGVjdCByZXR1cm5lZCBmYWxzZSBcbiIpOworCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOworCX0KKworCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SNjAwKQorCQliaW9zXzBfc2NyYXRjaCA9IFJSRUczMihSNjAwX0JJT1NfMF9TQ1JBVENIKTsKKwllbHNlCisJCWJpb3NfMF9zY3JhdGNoID0gUlJFRzMyKFJBREVPTl9CSU9TXzBfU0NSQVRDSCk7CisKKwlEUk1fREVCVUdfS01TKCJCaW9zIDAgc2NyYXRjaCAleCAlMDh4XG4iLCBiaW9zXzBfc2NyYXRjaCwgcmFkZW9uX2VuY29kZXItPmRldmljZXMpOworCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIEFUT01fUzBfQ1JUMV9NQVNLKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCkgeworCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiBBVE9NX1MwX0NSVDJfTUFTSykKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwl9CisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX0NWX01BU0t8QVRPTV9TMF9DVl9NQVNLX0EpKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX1RWMV9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX1RWMV9DT01QT1NJVEUgfCBBVE9NX1MwX1RWMV9DT01QT1NJVEVfQSkpCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7IC8qIENUViAqLworCQllbHNlIGlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX1RWMV9TVklERU8gfCBBVE9NX1MwX1RWMV9TVklERU9fQSkpCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7IC8qIFNUViAqLworCX0KKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCityYWRlb25fYXRvbV9kaWdfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciA9IHJhZGVvbl9nZXRfZXh0ZXJuYWxfZW5jb2RlcihlbmNvZGVyKTsKKwl1MzIgYmlvc18wX3NjcmF0Y2g7CisKKwlpZiAoIUFTSUNfSVNfRENFNChyZGV2KSkKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKKworCWlmICghZXh0X2VuY29kZXIpCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisKKwlpZiAoKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkgPT0gMCkKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKKworCS8qIGxvYWQgZGV0ZWN0IG9uIHRoZSBkcCBicmlkZ2UgKi8KKwlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19EQUNMT0FEX0RFVEVDVElPTik7CisKKwliaW9zXzBfc2NyYXRjaCA9IFJSRUczMihSNjAwX0JJT1NfMF9TQ1JBVENIKTsKKworCURSTV9ERUJVR19LTVMoIkJpb3MgMCBzY3JhdGNoICV4ICUwOHhcbiIsIGJpb3NfMF9zY3JhdGNoLCByYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyk7CisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQpIHsKKwkJaWYgKGJpb3NfMF9zY3JhdGNoICYgQVRPTV9TMF9DUlQxX01BU0spCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMl9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIEFUT01fUzBfQ1JUMl9NQVNLKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NWX1NVUFBPUlQpIHsKKwkJaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfQ1ZfTUFTS3xBVE9NX1MwX0NWX01BU0tfQSkpCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpIHsKKwkJaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfVFYxX0NPTVBPU0lURSB8IEFUT01fUzBfVFYxX0NPTVBPU0lURV9BKSkKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsgLyogQ1RWICovCisJCWVsc2UgaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfVFYxX1NWSURFTyB8IEFUT01fUzBfVFYxX1NWSURFT19BKSkKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsgLyogU1RWICovCisJfQorCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKK30KKwordm9pZAorcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOworCisJaWYgKGV4dF9lbmNvZGVyKQorCQkvKiBkZGNfc2V0dXAgb24gdGhlIGRwIGJyaWRnZSAqLworCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRERDX1NFVFVQKTsKKworfQorCitzdGF0aWMgdm9pZCByYWRlb25fYXRvbV9lbmNvZGVyX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CisKKwlpZiAoKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYKKwkgICAgIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCB8IEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgfHwKKwkgICAgKHJhZGVvbl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChlbmNvZGVyKSAhPQorCSAgICAgRU5DT0RFUl9PQkpFQ1RfSURfTk9ORSkpIHsKKwkJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisJCWlmIChkaWcpCisJCQlkaWctPmRpZ19lbmNvZGVyID0gcmFkZW9uX2F0b21fcGlja19kaWdfZW5jb2RlcihlbmNvZGVyKTsKKwl9CisKKwlyYWRlb25fYXRvbV9vdXRwdXRfbG9jayhlbmNvZGVyLCB0cnVlKTsKKwlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworCisJaWYgKGNvbm5lY3RvcikgeworCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKworCQkvKiBzZWxlY3QgdGhlIGNsb2NrL2RhdGEgcG9ydCBpZiBpdCB1c2VzIGEgcm91dGVyICovCisJCWlmIChyYWRlb25fY29ubmVjdG9yLT5yb3V0ZXIuY2RfdmFsaWQpCisJCQlyYWRlb25fcm91dGVyX3NlbGVjdF9jZF9wb3J0KHJhZGVvbl9jb25uZWN0b3IpOworCisJCS8qIHR1cm4gZURQIHBhbmVsIG9uIGZvciBtb2RlIHNldCAqLworCQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKQorCQkJYXRvbWJpb3Nfc2V0X2VkcF9wYW5lbF9wb3dlcihjb25uZWN0b3IsCisJCQkJCQkgICAgIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09OKTsKKwl9CisKKwkvKiB0aGlzIGlzIG5lZWRlZCBmb3IgdGhlIHBsbC9zcyBzZXR1cCB0byB3b3JrIGNvcnJlY3RseSBpbiBzb21lIGNhc2VzICovCisJYXRvbWJpb3Nfc2V0X2VuY29kZXJfY3J0Y19zb3VyY2UoZW5jb2Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9hdG9tX2VuY29kZXJfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisJcmFkZW9uX2F0b21fb3V0cHV0X2xvY2soZW5jb2RlciwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fYXRvbV9lbmNvZGVyX2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZzsKKworCS8qIGNoZWNrIGZvciBwcmUtRENFMyBjYXJkcyB3aXRoIHNoYXJlZCBlbmNvZGVyczsKKwkgKiBjYW4ndCByZWFsbHkgdXNlIHRoZSBsaW5rcyBpbmRpdmlkdWFsbHksIHNvIGRvbid0IGRpc2FibGUKKwkgKiB0aGUgZW5jb2RlciBpZiBpdCdzIGluIHVzZSBieSBhbm90aGVyIGNvbm5lY3RvcgorCSAqLworCWlmICghQVNJQ19JU19EQ0UzKHJkZXYpKSB7CisJCXN0cnVjdCBkcm1fZW5jb2RlciAqb3RoZXJfZW5jb2RlcjsKKwkJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpvdGhlcl9yYWRlb25fZW5jb2RlcjsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG90aGVyX2VuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQkJb3RoZXJfcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihvdGhlcl9lbmNvZGVyKTsKKwkJCWlmICgocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gb3RoZXJfcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpICYmCisJCQkgICAgZHJtX2hlbHBlcl9lbmNvZGVyX2luX3VzZShvdGhlcl9lbmNvZGVyKSkKKwkJCQlnb3RvIGRpc2FibGVfZG9uZTsKKwkJfQorCX0KKworCXJhZGVvbl9hdG9tX2VuY29kZXJfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisKKwlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9UTURTMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9UTURTMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVlRNMToKKwkJYXRvbWJpb3NfZGlnaXRhbF9zZXR1cChlbmNvZGVyLCBQQU5FTF9FTkNPREVSX0FDVElPTl9ESVNBQkxFKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKKwkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKKwkJCS8qIGRpc2FibGUgdGhlIHRyYW5zbWl0dGVyICovCisJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRElTQUJMRSwgMCwgMCk7CisJCWVsc2UgeworCQkJLyogZGlzYWJsZSB0aGUgZW5jb2RlciBhbmQgdHJhbnNtaXR0ZXIgKi8KKwkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9ESVNBQkxFLCAwLCAwKTsKKwkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSwgMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CisJCWF0b21iaW9zX2R2b19zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzI6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMjoKKwkJYXRvbWJpb3NfZGFjX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSk7CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCisJCQlhdG9tYmlvc190dl9zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOworCQlicmVhazsKKwl9CisKK2Rpc2FibGVfZG9uZToKKwlpZiAocmFkZW9uX2VuY29kZXJfaXNfZGlnaXRhbChlbmNvZGVyKSkgeworCQlpZiAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JKQorCQkJcjYwMF9oZG1pX2Rpc2FibGUoZW5jb2Rlcik7CisJCWRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKKwkJZGlnLT5kaWdfZW5jb2RlciA9IC0xOworCX0KKwlyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSA9IDA7Cit9CisKKy8qIHRoZXNlIGFyZSBoYW5kbGVkIGJ5IHRoZSBwcmltYXJ5IGVuY29kZXJzICovCitzdGF0aWMgdm9pZCByYWRlb25fYXRvbV9leHRfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZXh0X2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisKK30KKworc3RhdGljIHZvaWQKK3JhZGVvbl9hdG9tX2V4dF9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZXh0X2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCit9CisKK3N0YXRpYyB2b2lkCityYWRlb25fYXRvbV9leHRfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCit9CisKK3N0YXRpYyBib29sIHJhZGVvbl9hdG9tX2V4dF9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyByYWRlb25fYXRvbV9leHRfaGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gcmFkZW9uX2F0b21fZXh0X2RwbXMsCisJLm1vZGVfZml4dXAgPSByYWRlb25fYXRvbV9leHRfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IHJhZGVvbl9hdG9tX2V4dF9wcmVwYXJlLAorCS5tb2RlX3NldCA9IHJhZGVvbl9hdG9tX2V4dF9tb2RlX3NldCwKKwkuY29tbWl0ID0gcmFkZW9uX2F0b21fZXh0X2NvbW1pdCwKKwkuZGlzYWJsZSA9IHJhZGVvbl9hdG9tX2V4dF9kaXNhYmxlLAorCS8qIG5vIGRldGVjdCBmb3IgVE1EUy9MVkRTIHlldCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgcmFkZW9uX2F0b21fZGlnX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IHJhZGVvbl9hdG9tX2VuY29kZXJfZHBtcywKKwkubW9kZV9maXh1cCA9IHJhZGVvbl9hdG9tX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSByYWRlb25fYXRvbV9lbmNvZGVyX3ByZXBhcmUsCisJLm1vZGVfc2V0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9tb2RlX3NldCwKKwkuY29tbWl0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9jb21taXQsCisJLmRpc2FibGUgPSByYWRlb25fYXRvbV9lbmNvZGVyX2Rpc2FibGUsCisJLmRldGVjdCA9IHJhZGVvbl9hdG9tX2RpZ19kZXRlY3QsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyByYWRlb25fYXRvbV9kYWNfaGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zLAorCS5tb2RlX2ZpeHVwID0gcmFkZW9uX2F0b21fbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IHJhZGVvbl9hdG9tX2VuY29kZXJfcHJlcGFyZSwKKwkubW9kZV9zZXQgPSByYWRlb25fYXRvbV9lbmNvZGVyX21vZGVfc2V0LAorCS5jb21taXQgPSByYWRlb25fYXRvbV9lbmNvZGVyX2NvbW1pdCwKKwkuZGV0ZWN0ID0gcmFkZW9uX2F0b21fZGFjX2RldGVjdCwKK307CisKK3ZvaWQgcmFkZW9uX2VuY19kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJa2ZyZWUocmFkZW9uX2VuY29kZXItPmVuY19wcml2KTsKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworCWtmcmVlKHJhZGVvbl9lbmNvZGVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyByYWRlb25fYXRvbV9lbmNfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSByYWRlb25fZW5jX2Rlc3Ryb3ksCit9OworCitzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKgorcmFkZW9uX2F0b21iaW9zX3NldF9kYWNfaW5mbyhzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByYWRlb25fZW5jb2Rlci0+YmFzZS5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RhYyAqZGFjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGFjKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRhYykKKwkJcmV0dXJuIE5VTEw7CisKKwlkYWMtPnR2X3N0ZCA9IHJhZGVvbl9hdG9tYmlvc19nZXRfdHZfaW5mbyhyZGV2KTsKKwlyZXR1cm4gZGFjOworfQorCitzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKgorcmFkZW9uX2F0b21iaW9zX3NldF9kaWdfaW5mbyhzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyKQoreworCWludCBlbmNvZGVyX2VudW0gPSAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfZW51bSAmIEVOVU1fSURfTUFTSykgPj4gRU5VTV9JRF9TSElGVDsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyksIEdGUF9LRVJORUwpOworCisJaWYgKCFkaWcpCisJCXJldHVybiBOVUxMOworCisJLyogY29oZXJlbnQgbW9kZSBieSBkZWZhdWx0ICovCisJZGlnLT5jb2hlcmVudF9tb2RlID0gdHJ1ZTsKKwlkaWctPmRpZ19lbmNvZGVyID0gLTE7CisKKwlpZiAoZW5jb2Rlcl9lbnVtID09IDIpCisJCWRpZy0+bGlua2IgPSB0cnVlOworCWVsc2UKKwkJZGlnLT5saW5rYiA9IGZhbHNlOworCisJcmV0dXJuIGRpZzsKK30KKwordm9pZAorcmFkZW9uX2FkZF9hdG9tX2VuY29kZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCXVpbnQzMl90IGVuY29kZXJfZW51bSwKKwkJCXVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsCisJCQl1MTYgY2FwcykKK3sKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXI7CisKKwkvKiBzZWUgaWYgd2UgYWxyZWFkeSBhZGRlZCBpdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9lbnVtID09IGVuY29kZXJfZW51bSkgeworCQkJcmFkZW9uX2VuY29kZXItPmRldmljZXMgfD0gc3VwcG9ydGVkX2RldmljZTsKKwkJCXJldHVybjsKKwkJfQorCisJfQorCisJLyogYWRkIGEgbmV3IG9uZSAqLworCXJhZGVvbl9lbmNvZGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYWRlb25fZW5jb2RlcikKKwkJcmV0dXJuOworCisJZW5jb2RlciA9ICZyYWRlb25fZW5jb2Rlci0+YmFzZTsKKwlzd2l0Y2ggKHJkZXYtPm51bV9jcnRjKSB7CisJY2FzZSAxOgorCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4MTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWRlZmF1bHQ6CisJCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHgzOworCQlicmVhazsKKwljYXNlIDQ6CisJCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHhmOworCQlicmVhazsKKwljYXNlIDY6CisJCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHgzZjsKKwkJYnJlYWs7CisJfQorCisJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gTlVMTDsKKworCXJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2VudW0gPSBlbmNvZGVyX2VudW07CisJcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPSAoZW5jb2Rlcl9lbnVtICYgT0JKRUNUX0lEX01BU0spID4+IE9CSkVDVF9JRF9TSElGVDsKKwlyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyA9IHN1cHBvcnRlZF9kZXZpY2U7CisJcmFkZW9uX2VuY29kZXItPnJteF90eXBlID0gUk1YX09GRjsKKwlyYWRlb25fZW5jb2Rlci0+dW5kZXJzY2FuX3R5cGUgPSBVTkRFUlNDQU5fT0ZGOworCXJhZGVvbl9lbmNvZGVyLT5pc19leHRfZW5jb2RlciA9IGZhbHNlOworCXJhZGVvbl9lbmNvZGVyLT5jYXBzID0gY2FwczsKKworCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9UTURTMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9UTURTMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgorCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7CisJCQlyYWRlb25fZW5jb2Rlci0+cm14X3R5cGUgPSBSTVhfRlVMTDsKKwkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX0xWRFMpOworCQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX2dldF9sdmRzX2luZm8ocmFkZW9uX2VuY29kZXIpOworCQl9IGVsc2UgeworCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7CisJCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fYXRvbWJpb3Nfc2V0X2RpZ19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKKwkJfQorCQlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZyYWRlb25fYXRvbV9kaWdfaGVscGVyX2Z1bmNzKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgorCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9EQUMpOworCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fYXRvbWJpb3Nfc2V0X2RhY19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKKwkJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmcmFkZW9uX2F0b21fZGFjX2hlbHBlcl9mdW5jcyk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6CisJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX1RWREFDKTsKKwkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX3NldF9kYWNfaW5mbyhyYWRlb25fZW5jb2Rlcik7CisJCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJnJhZGVvbl9hdG9tX2RhY19oZWxwZXJfZnVuY3MpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RWTzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7CisJCQlyYWRlb25fZW5jb2Rlci0+cm14X3R5cGUgPSBSTVhfRlVMTDsKKwkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX0xWRFMpOworCQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX2dldF9sdmRzX2luZm8ocmFkZW9uX2VuY29kZXIpOworCQl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0NSVF9TVVBQT1JUKSkgeworCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfREFDKTsKKwkJCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IHJhZGVvbl9hdG9tYmlvc19zZXRfZGlnX2luZm8ocmFkZW9uX2VuY29kZXIpOworCQl9IGVsc2UgeworCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7CisJCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fYXRvbWJpb3Nfc2V0X2RpZ19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKKwkJfQorCQlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZyYWRlb25fYXRvbV9kaWdfaGVscGVyX2Z1bmNzKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9TSTE3MEI6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9DSDczMDM6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9FWFRFUk5BTF9TRFZPQToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0VYVEVSTkFMX1NEVk9COgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfVElURlA1MTM6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9WVDE2MjM6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9IRE1JX1NJMTkzMDoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX1RSQVZJUzoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX05VVE1FRzoKKwkJLyogdGhlc2UgYXJlIGhhbmRsZWQgYnkgdGhlIHByaW1hcnkgZW5jb2RlcnMgKi8KKwkJcmFkZW9uX2VuY29kZXItPmlzX2V4dF9lbmNvZGVyID0gdHJ1ZTsKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKKwkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX0xWRFMpOworCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkpCisJCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9EQUMpOworCQllbHNlCisJCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9UTURTKTsKKwkJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmcmFkZW9uX2F0b21fZXh0X2hlbHBlcl9mdW5jcyk7CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCmluZGV4IGM0ZmZhMTRmLi4xZDYwM2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogc3RhdGljIHZvaWQgZXZlcmdyZWVuX2dwdV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgZXZlcmdyZWVuX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotc3RhdGljIHZvaWQgZXZlcmdyZWVuX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCBldmVyZ3JlZW5fcGNpZV9nZW4yX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIHZvaWQgZXZlcmdyZWVuX2ZpeF9wY2lfbWF4X3JlYWRfcmVxX3NpemUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CkBAIC0xNTcsNiArMTU3LDU3IEBACiAJcmV0dXJuIGFjdHVhbF90ZW1wICogMTAwMDsKIH0KIAordm9pZCBzdW1vX3BtX2luaXRfcHJvZmlsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgaWR4OworCisJLyogZGVmYXVsdCAqLworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfREVGQVVMVF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9IHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXg7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ERUZBVUxUX0lEWF0uZHBtc19vbl9wc19pZHggPSByZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfREVGQVVMVF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ERUZBVUxUX0lEWF0uZHBtc19vbl9jbV9pZHggPSAwOworCisJLyogbG93LG1pZCBzaC9taCAqLworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19NT0JJTElUWSkKKwkJaWR4ID0gcmFkZW9uX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWSwgMCk7CisJZWxzZQorCQlpZHggPSByYWRlb25fcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMCk7CisKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9IGlkeDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0gaWR4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKKworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vbl9wc19pZHggPSBpZHg7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfTUhfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vbl9jbV9pZHggPSAwOworCisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29mZl9wc19pZHggPSBpZHg7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29uX2NtX2lkeCA9IDA7CisKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9IGlkeDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0gaWR4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX01IX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKKworCS8qIGhpZ2ggc2gvbWggKi8KKwlpZHggPSByYWRlb25fcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMCk7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX1NIX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9TSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0gaWR4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9TSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX1NIX0lEWF0uZHBtc19vbl9jbV9pZHggPQorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpZHhdLm51bV9jbG9ja19tb2RlcyAtIDE7CisKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfTUhfSURYXS5kcG1zX29mZl9wc19pZHggPSBpZHg7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX01IX0lEWF0uZHBtc19vbl9wc19pZHggPSBpZHg7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX01IX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfTUhfSURYXS5kcG1zX29uX2NtX2lkeCA9CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW2lkeF0ubnVtX2Nsb2NrX21vZGVzIC0gMTsKK30KKwogdm9pZCBldmVyZ3JlZW5fcG1fbWlzYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgcmVxX3BzX2lkeCA9IHJkZXYtPnBtLnJlcXVlc3RlZF9wb3dlcl9zdGF0ZV9pbmRleDsKQEAgLTM1Myw2ICs0MDQsNyBAQAogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KKwkJcmFkZW9uX2hwZF9zZXRfcG9sYXJpdHkocmRldiwgcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCk7CiAJfQogCWlmIChyZGV2LT5pcnEuaW5zdGFsbGVkKQogCQlldmVyZ3JlZW5faXJxX3NldChyZGV2KTsKQEAgLTg5Myw3ICs5NDUsNyBAQAogCXUzMiB0bXA7CiAJaW50IHI7CiAKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmogPT0gTlVMTCkgeworCWlmIChyZGV2LT5nYXJ0LnJvYmogPT0gTlVMTCkgewogCQlkZXZfZXJyKHJkZXYtPmRldiwgIk5vIFZSQU0gb2JqZWN0IGZvciBQQ0lFIEdBUlQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTM1LDYgKzk4Nyw5IEBACiAJV1JFRzMyKFZNX0NPTlRFWFQxX0NOVEwsIDApOwogCiAJZXZlcmdyZWVuX3BjaWVfZ2FydF90bGJfZmx1c2gocmRldik7CisJRFJNX0lORk8oIlBDSUUgR0FSVCBvZiAldU0gZW5hYmxlZCAodGFibGUgYXQgMHglMDE2bGxYKS5cbiIsCisJCSAodW5zaWduZWQpKHJkZXYtPm1jLmd0dF9zaXplID4+IDIwKSwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKIAlyZGV2LT5nYXJ0LnJlYWR5ID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTk0Miw3ICs5OTcsNiBAQAogdm9pZCBldmVyZ3JlZW5fcGNpZV9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHRtcDsKLQlpbnQgcjsKIAogCS8qIERpc2FibGUgYWxsIHRhYmxlcyAqLwogCVdSRUczMihWTV9DT05URVhUMF9DTlRMLCAwKTsKQEAgLTk2MiwxNCArMTAxNiw3IEBACiAJV1JFRzMyKE1DX1ZNX01CX0wxX1RMQjFfQ05UTCwgdG1wKTsKIAlXUkVHMzIoTUNfVk1fTUJfTDFfVExCMl9DTlRMLCB0bXApOwogCVdSRUczMihNQ19WTV9NQl9MMV9UTEIzX0NOVEwsIHRtcCk7Ci0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKSB7Ci0JCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiwgZmFsc2UpOwotCQlpZiAobGlrZWx5KHIgPT0gMCkpIHsKLQkJCXJhZGVvbl9ib19rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQl9Ci0JfQorCXJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fdW5waW4ocmRldik7CiB9CiAKIHZvaWQgZXZlcmdyZWVuX3BjaWVfZ2FydF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtMTIyMyw3ICsxMjcwLDcgQEAKIAkJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9ISUdIX0FERFIsCiAJCQlyZGV2LT5tYy52cmFtX2VuZCA+PiAxMik7CiAJfQotCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfREVGQVVMVF9BRERSLCAwKTsKKwlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0RFRkFVTFRfQUREUiwgcmRldi0+dnJhbV9zY3JhdGNoLmdwdV9hZGRyID4+IDEyKTsKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSB7CiAJCXRtcCA9IFJSRUczMihNQ19GVVNfVk1fRkJfT0ZGU0VUKSAmIDB4MDAwRkZGRkY7CiAJCXRtcCB8PSAoKHJkZXYtPm1jLnZyYW1fZW5kID4+IDIwKSAmIDB4RikgPDwgMjQ7CkBAIC0yNTg2LDcgKzI2MzMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZXZlcmdyZWVuX2lycV9hY2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitzdGF0aWMgdm9pZCBldmVyZ3JlZW5faXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgdG1wOwogCkBAIC0yNjk3LDcgKzI3NDQsNyBAQAogCXI2MDBfcmxjX3N0b3AocmRldik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGV2ZXJncmVlbl9nZXRfaWhfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3N0YXRpYyB1MzIgZXZlcmdyZWVuX2dldF9paF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB3cHRyLCB0bXA7CiAKQEAgLTMwMDMsOCArMzA1MCw3IEBACiAJaW50IHI7CiAKIAkvKiBlbmFibGUgcGNpZSBnZW4yIGxpbmsgKi8KLQlpZiAoIUFTSUNfSVNfRENFNShyZGV2KSkKLQkJZXZlcmdyZWVuX3BjaWVfZ2VuMl9lbmFibGUocmRldik7CisJZXZlcmdyZWVuX3BjaWVfZ2VuMl9lbmFibGUocmRldik7CiAKIAlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKSB7CiAJCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+cmxjX2Z3IHx8ICFyZGV2LT5tY19mdykgewpAQCAtMzAyOSw2ICszMDc1LDEwIEBACiAJCX0KIAl9CiAKKwlyID0gcjYwMF92cmFtX3NjcmF0Y2hfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKIAlldmVyZ3JlZW5fbWNfcHJvZ3JhbShyZGV2KTsKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CiAJCWV2ZXJncmVlbl9hZ3BfZW5hYmxlKHJkZXYpOwpAQCAtMzA0MSw3ICszMDkxLDcgQEAKIAogCXIgPSBldmVyZ3JlZW5fYmxpdF9pbml0KHJkZXYpOwogCWlmIChyKSB7Ci0JCWV2ZXJncmVlbl9ibGl0X2ZpbmkocmRldik7CisJCXI2MDBfYmxpdF9maW5pKHJkZXYpOwogCQlyZGV2LT5hc2ljLT5jb3B5ID0gTlVMTDsKIAkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiZmFpbGVkIGJsaXR0ZXIgKCVkKSBmYWxsaW5nIGJhY2sgdG8gbWVtY3B5XG4iLCByKTsKIAl9CkBAIC0zMTA3LDQ1ICszMTU3LDE0IEBACiAKIGludCBldmVyZ3JlZW5fc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpbnQgcjsKLQogCS8qIEZJWE1FOiB3ZSBzaG91bGQgd2FpdCBmb3IgcmluZyB0byBiZSBlbXB0eSAqLwogCXI3MDBfY3Bfc3RvcChyZGV2KTsKIAlyZGV2LT5jcC5yZWFkeSA9IGZhbHNlOwogCWV2ZXJncmVlbl9pcnFfc3VzcGVuZChyZGV2KTsKIAlyYWRlb25fd2JfZGlzYWJsZShyZGV2KTsKIAlldmVyZ3JlZW5fcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7CisJcjYwMF9ibGl0X3N1c3BlbmQocmRldik7CiAKLQkvKiB1bnBpbiBzaGFkZXJzIGJvICovCi0JciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqLCBmYWxzZSk7Ci0JaWYgKGxpa2VseShyID09IDApKSB7Ci0JCXJhZGVvbl9ib191bnBpbihyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7Ci0JCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgZXZlcmdyZWVuX2NvcHlfYmxpdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCXVpbnQ2NF90IHNyY19vZmZzZXQsCi0JCQl1aW50NjRfdCBkc3Rfb2Zmc2V0LAotCQkJdW5zaWduZWQgbnVtX2dwdV9wYWdlcywKLQkJCXN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKQotewotCWludCByOwotCi0JbXV0ZXhfbG9jaygmcmRldi0+cjYwMF9ibGl0Lm11dGV4KTsKLQlyZGV2LT5yNjAwX2JsaXQudmJfaWIgPSBOVUxMOwotCXIgPSBldmVyZ3JlZW5fYmxpdF9wcmVwYXJlX2NvcHkocmRldiwgbnVtX2dwdV9wYWdlcyAqIFJBREVPTl9HUFVfUEFHRV9TSVpFKTsKLQlpZiAocikgewotCQlpZiAocmRldi0+cjYwMF9ibGl0LnZiX2liKQotCQkJcmFkZW9uX2liX2ZyZWUocmRldiwgJnJkZXYtPnI2MDBfYmxpdC52Yl9pYik7Ci0JCW11dGV4X3VubG9jaygmcmRldi0+cjYwMF9ibGl0Lm11dGV4KTsKLQkJcmV0dXJuIHI7Ci0JfQotCWV2ZXJncmVlbl9rbXNfYmxpdF9jb3B5KHJkZXYsIHNyY19vZmZzZXQsIGRzdF9vZmZzZXQsIG51bV9ncHVfcGFnZXMgKiBSQURFT05fR1BVX1BBR0VfU0laRSk7Ci0JZXZlcmdyZWVuX2JsaXRfZG9uZV9jb3B5KHJkZXYsIGZlbmNlKTsKLQltdXRleF91bmxvY2soJnJkZXYtPnI2MDBfYmxpdC5tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMyNTcsMTMgKzMyNzYsMTQgQEAKIAogdm9pZCBldmVyZ3JlZW5fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlldmVyZ3JlZW5fYmxpdF9maW5pKHJkZXYpOworCXI2MDBfYmxpdF9maW5pKHJkZXYpOwogCXI3MDBfY3BfZmluaShyZGV2KTsKIAlyNjAwX2lycV9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOwogCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlldmVyZ3JlZW5fcGNpZV9nYXJ0X2ZpbmkocmRldik7CisJcjYwMF92cmFtX3NjcmF0Y2hfZmluaShyZGV2KTsKIAlyYWRlb25fZ2VtX2ZpbmkocmRldik7CiAJcmFkZW9uX2ZlbmNlX2RyaXZlcl9maW5pKHJkZXYpOwogCXJhZGVvbl9hZ3BfZmluaShyZGV2KTsKQEAgLTMyNzMsNyArMzI5Myw3IEBACiAJcmRldi0+YmlvcyA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGV2ZXJncmVlbl9wY2llX2dlbjJfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQordm9pZCBldmVyZ3JlZW5fcGNpZV9nZW4yX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgbGlua193aWR0aF9jbnRsLCBzcGVlZF9jbnRsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9ibGl0X2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fYmxpdF9rbXMuYwppbmRleCAyZWIyNTE4Li45MTRlNWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9ibGl0X2ttcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2JsaXRfa21zLmMKQEAgLTU2LDcgKzU2LDkgQEAKIAlpZiAoaCA8IDgpCiAJCWggPSA4OwogCi0JY2JfY29sb3JfaW5mbyA9ICgoZm9ybWF0IDw8IDIpIHwgKDEgPDwgMjQpIHwgKDEgPDwgOCkpOworCWNiX2NvbG9yX2luZm8gPSBDQl9GT1JNQVQoZm9ybWF0KSB8CisJCUNCX1NPVVJDRV9GT1JNQVQoQ0JfU0ZfRVhQT1JUX05PUk0pIHwKKwkJQ0JfQVJSQVlfTU9ERShBUlJBWV8xRF9USUxFRF9USElOMSk7CiAJcGl0Y2ggPSAodyAvIDgpIC0gMTsKIAlzbGljZSA9ICgodyAqIGgpIC8gNjQpIC0gMTsKIApAQCAtNjcsNyArNjksNyBAQAogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNsaWNlKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCBjYl9jb2xvcl9pbmZvKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAoMSA8PCA0KSk7CisJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgKHcgLSAxKSB8ICgoaCAtIDEpIDw8IDE2KSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CkBAIC05Miw2ICs5NCwxNSBAQAogCWVsc2UKIAkJY3BfY29oZXJfc2l6ZSA9ICgoc2l6ZSArIDI1NSkgPj4gOCk7CiAKKwlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfQ0FZTUFOKSB7CisJCS8qIENQX0NPSEVSX0NOVEwyIGhhcyB0byBiZSBzZXQgbWFudWFsbHkgd2hlbiBzdWJtaXR0aW5nIGEgc3VyZmFjZV9zeW5jCisJCSAqIHRvIHRoZSBSQiBkaXJlY3RseS4gRm9yIElCcywgdGhlIENQIHByb2dyYW1zIHRoaXMgYXMgcGFydCBvZiB0aGUKKwkJICogc3VyZmFjZV9zeW5jIHBhY2tldC4KKwkJICovCisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19TRVRfQ09ORklHX1JFRywgMSkpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAoMHg4NWU4IC0gUEFDS0VUM19TRVRfQ09ORklHX1JFR19TVEFSVCkgPj4gMik7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOyAvKiBDUF9DT0hFUl9DTlRMMiAqLworCX0KIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU1VSRkFDRV9TWU5DLCAzKSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3luY190eXBlKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCBjcF9jb2hlcl9zaXplKTsKQEAgLTEzMywxMiArMTQ0LDE2IEBACiAJdTMyIHNxX3Z0eF9jb25zdGFudF93b3JkMiwgc3FfdnR4X2NvbnN0YW50X3dvcmQzOwogCiAJLyogaGlnaCBhZGRyLCBzdHJpZGUgKi8KLQlzcV92dHhfY29uc3RhbnRfd29yZDIgPSAoKHVwcGVyXzMyX2JpdHMoZ3B1X2FkZHIpICYgMHhmZikgfCAoMTYgPDwgOCkpOworCXNxX3Z0eF9jb25zdGFudF93b3JkMiA9IFNRX1ZUWENfQkFTRV9BRERSX0hJKHVwcGVyXzMyX2JpdHMoZ3B1X2FkZHIpICYgMHhmZikgfAorCQlTUV9WVFhDX1NUUklERSgxNik7CiAjaWZkZWYgX19CSUdfRU5ESUFOCi0Jc3FfdnR4X2NvbnN0YW50X3dvcmQyIHw9ICgyIDw8IDMwKTsKKwlzcV92dHhfY29uc3RhbnRfd29yZDIgfD0gU1FfVlRYQ19FTkRJQU5fU1dBUChTUV9FTkRJQU5fOElOMzIpOwogI2VuZGlmCiAJLyogeHl6dyBzd2l6emxlcyAqLwotCXNxX3Z0eF9jb25zdGFudF93b3JkMyA9ICgwIDw8IDMpIHwgKDEgPDwgNikgfCAoMiA8PCA5KSB8ICgzIDw8IDEyKTsKKwlzcV92dHhfY29uc3RhbnRfd29yZDMgPSBTUV9WVENYX1NFTF9YKFNRX1NFTF9YKSB8CisJCVNRX1ZUQ1hfU0VMX1koU1FfU0VMX1kpIHwKKwkJU1FfVlRDWF9TRUxfWihTUV9TRUxfWikgfAorCQlTUV9WVENYX1NFTF9XKFNRX1NFTF9XKTsKIAogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19TRVRfUkVTT1VSQ0UsIDgpKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCAweDU4MCk7CkBAIC0xNDksNyArMTY0LDcgQEAKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKLQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBTUV9URVhfVlRYX1ZBTElEX0JVRkZFUiA8PCAzMCk7CisJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgU19fU1FfQ09OU1RBTlRfVFlQRShTUV9URVhfVlRYX1ZBTElEX0JVRkZFUikpOwogCiAJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DRURBUikgfHwKIAkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1BBTE0pIHx8CkBAIC0xNjgsNyArMTgzLDcgQEAKIHN0YXRpYyB2b2lkCiBzZXRfdGV4X3Jlc291cmNlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkgaW50IGZvcm1hdCwgaW50IHcsIGludCBoLCBpbnQgcGl0Y2gsCi0JCSB1NjQgZ3B1X2FkZHIpCisJCSB1NjQgZ3B1X2FkZHIsIHUzMiBzaXplKQogewogCXUzMiBzcV90ZXhfcmVzb3VyY2Vfd29yZDAsIHNxX3RleF9yZXNvdXJjZV93b3JkMTsKIAl1MzIgc3FfdGV4X3Jlc291cmNlX3dvcmQ0LCBzcV90ZXhfcmVzb3VyY2Vfd29yZDc7CkBAIC0xNzYsMTQgKzE5MSwyMiBAQAogCWlmIChoIDwgMSkKIAkJaCA9IDE7CiAKLQlzcV90ZXhfcmVzb3VyY2Vfd29yZDAgPSAoMSA8PCAwKTsgLyogMkQgKi8KKwlzcV90ZXhfcmVzb3VyY2Vfd29yZDAgPSBURVhfRElNKFNRX1RFWF9ESU1fMkQpOwogCXNxX3RleF9yZXNvdXJjZV93b3JkMCB8PSAoKCgocGl0Y2ggPj4gMykgLSAxKSA8PCA2KSB8CiAJCQkJICAoKHcgLSAxKSA8PCAxOCkpOwotCXNxX3RleF9yZXNvdXJjZV93b3JkMSA9ICgoaCAtIDEpIDw8IDApIHwgKDEgPDwgMjgpOworCXNxX3RleF9yZXNvdXJjZV93b3JkMSA9ICgoaCAtIDEpIDw8IDApIHwKKwkJCQlURVhfQVJSQVlfTU9ERShBUlJBWV8xRF9USUxFRF9USElOMSk7CiAJLyogeHl6dyBzd2l6emxlcyAqLwotCXNxX3RleF9yZXNvdXJjZV93b3JkNCA9ICgwIDw8IDE2KSB8ICgxIDw8IDE5KSB8ICgyIDw8IDIyKSB8ICgzIDw8IDI1KTsKKwlzcV90ZXhfcmVzb3VyY2Vfd29yZDQgPSBURVhfRFNUX1NFTF9YKFNRX1NFTF9YKSB8CisJCQkJVEVYX0RTVF9TRUxfWShTUV9TRUxfWSkgfAorCQkJCVRFWF9EU1RfU0VMX1ooU1FfU0VMX1opIHwKKwkJCQlURVhfRFNUX1NFTF9XKFNRX1NFTF9XKTsKIAotCXNxX3RleF9yZXNvdXJjZV93b3JkNyA9IGZvcm1hdCB8IChTUV9URVhfVlRYX1ZBTElEX1RFWFRVUkUgPDwgMzApOworCXNxX3RleF9yZXNvdXJjZV93b3JkNyA9IGZvcm1hdCB8CisJCVNfX1NRX0NPTlNUQU5UX1RZUEUoU1FfVEVYX1ZUWF9WQUxJRF9URVhUVVJFKTsKKworCWNwX3NldF9zdXJmYWNlX3N5bmMocmRldiwKKwkJCSAgICBQQUNLRVQzX1RDX0FDVElPTl9FTkEsIHNpemUsIGdwdV9hZGRyKTsKIAogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19TRVRfUkVTT1VSQ0UsIDgpKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKQEAgLTU4NCwzMSArNjA3LDYgQEAKIAogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IGkyZih1aW50MzJfdCBpbnB1dCkKLXsKLQl1MzIgcmVzdWx0LCBpLCBleHBvbmVudCwgZnJhY3Rpb247Ci0KLQlpZiAoKGlucHV0ICYgMHgzZmZmKSA9PSAwKQotCQlyZXN1bHQgPSAwOyAvKiAwIGlzIGEgc3BlY2lhbCBjYXNlICovCi0JZWxzZSB7Ci0JCWV4cG9uZW50ID0gMTQwOyAvKiBleHBvbmVudCBiaWFzZWQgYnkgMTI3OyAqLwotCQlmcmFjdGlvbiA9IChpbnB1dCAmIDB4M2ZmZikgPDwgMTA7IC8qIGNoZWF0IGFuZCBvbmx5Ci0JCQkJCQkgICAgICBoYW5kbGUgbnVtYmVycyBiZWxvdyAyXl4xNSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykgewotCQkJaWYgKGZyYWN0aW9uICYgMHg4MDAwMDApCi0JCQkJYnJlYWs7Ci0JCQllbHNlIHsKLQkJCQlmcmFjdGlvbiA9IGZyYWN0aW9uIDw8IDE7IC8qIGtlZXAKLQkJCQkJCQkgICAgIHNoaWZ0aW5nIGxlZnQgdW50aWwgdG9wIGJpdCA9IDEgKi8KLQkJCQlleHBvbmVudCA9IGV4cG9uZW50IC0gMTsKLQkJCX0KLQkJfQotCQlyZXN1bHQgPSBleHBvbmVudCA8PCAyMyB8IChmcmFjdGlvbiAmIDB4N2ZmZmZmKTsgLyogbWFzawotCQkJCQkJCQkgICAgb2ZmIHRvcCBiaXQ7IGFzc3VtZWQgMSAqLwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCiBpbnQgZXZlcmdyZWVuX2JsaXRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgb2JqX3NpemU7CkBAIC02MTcsNiArNjE1LDI2IEBACiAJdTMyIHBhY2tldDJzWzE2XTsKIAlpbnQgbnVtX3BhY2tldDJzID0gMDsKIAorCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF9yZW5kZXJfdGFyZ2V0ID0gc2V0X3JlbmRlcl90YXJnZXQ7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuY3Bfc2V0X3N1cmZhY2Vfc3luYyA9IGNwX3NldF9zdXJmYWNlX3N5bmM7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3NoYWRlcnMgPSBzZXRfc2hhZGVyczsKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfdnR4X3Jlc291cmNlID0gc2V0X3Z0eF9yZXNvdXJjZTsKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfdGV4X3Jlc291cmNlID0gc2V0X3RleF9yZXNvdXJjZTsKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfc2Npc3NvcnMgPSBzZXRfc2Npc3NvcnM7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuZHJhd19hdXRvID0gZHJhd19hdXRvOworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF9kZWZhdWx0X3N0YXRlID0gc2V0X2RlZmF1bHRfc3RhdGU7CisKKwlyZGV2LT5yNjAwX2JsaXQucmluZ19zaXplX2NvbW1vbiA9IDU1OyAvKiBzaGFkZXJzICsgZGVmIHN0YXRlICovCisJcmRldi0+cjYwMF9ibGl0LnJpbmdfc2l6ZV9jb21tb24gKz0gMTY7IC8qIGZlbmNlIGVtaXQgZm9yIFZCIElCICovCisJcmRldi0+cjYwMF9ibGl0LnJpbmdfc2l6ZV9jb21tb24gKz0gNTsgLyogZG9uZSBjb3B5ICovCisJcmRldi0+cjYwMF9ibGl0LnJpbmdfc2l6ZV9jb21tb24gKz0gMTY7IC8qIGZlbmNlIGVtaXQgZm9yIGRvbmUgY29weSAqLworCisJcmRldi0+cjYwMF9ibGl0LnJpbmdfc2l6ZV9wZXJfbG9vcCA9IDc0OworCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9DQVlNQU4pCisJCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfcGVyX2xvb3AgKz0gOTsgLyogYWRkaXRpb25hbCBEV3MgZm9yIHN1cmZhY2Ugc3luYyAqLworCisJcmRldi0+cjYwMF9ibGl0Lm1heF9kaW0gPSAxNjM4NDsKKwogCS8qIHBpbiBjb3B5IHNoYWRlciBpbnRvIHZyYW0gaWYgYWxyZWFkeSBpbml0aWFsaXplZCAqLwogCWlmIChyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaikKIAkJZ290byBkb25lOwpAQCAtNzEyLDI3NyArNzMwLDMgQEAKIAlyYWRlb25fdHRtX3NldF9hY3RpdmVfdnJhbV9zaXplKHJkZXYsIHJkZXYtPm1jLnJlYWxfdnJhbV9zaXplKTsKIAlyZXR1cm4gMDsKIH0KLQotdm9pZCBldmVyZ3JlZW5fYmxpdF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCWludCByOwotCi0JcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShyZGV2LCByZGV2LT5tYy52aXNpYmxlX3ZyYW1fc2l6ZSk7Ci0JaWYgKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqID09IE5VTEwpCi0JCXJldHVybjsKLQkvKiBJZiB3ZSBjYW4ndCByZXNlcnZlIHRoZSBibywgdW5yZWYgc2hvdWxkIGJlIGVub3VnaCB0byBkZXN0cm95Ci0JICogaXQgd2hlbiBpdCBiZWNvbWVzIGlkbGUuCi0JICovCi0JciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqLCBmYWxzZSk7Ci0JaWYgKCFyKSB7Ci0JCXJhZGVvbl9ib191bnBpbihyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7Ci0JCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwotCX0KLQlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKLX0KLQotc3RhdGljIGludCBldmVyZ3JlZW5fdmJfaWJfZ2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCWludCByOwotCXIgPSByYWRlb25faWJfZ2V0KHJkZXYsICZyZGV2LT5yNjAwX2JsaXQudmJfaWIpOwotCWlmIChyKSB7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCBJQiBmb3IgdmVydGV4IGJ1ZmZlclxuIik7Ci0JCXJldHVybiByOwotCX0KLQotCXJkZXYtPnI2MDBfYmxpdC52Yl90b3RhbCA9IDY0KjEwMjQ7Ci0JcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBldmVyZ3JlZW5fdmJfaWJfcHV0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCXJhZGVvbl9mZW5jZV9lbWl0KHJkZXYsIHJkZXYtPnI2MDBfYmxpdC52Yl9pYi0+ZmVuY2UpOwotCXJhZGVvbl9pYl9mcmVlKHJkZXYsICZyZGV2LT5yNjAwX2JsaXQudmJfaWIpOwotfQotCi1pbnQgZXZlcmdyZWVuX2JsaXRfcHJlcGFyZV9jb3B5KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgc2l6ZV9ieXRlcykKLXsKLQlpbnQgcjsKLQlpbnQgcmluZ19zaXplLCBsaW5lX3NpemU7Ci0JaW50IG1heF9zaXplOwotCS8qIGxvb3BzIG9mIGVtaXRzICsgZmVuY2UgZW1pdCBwb3NzaWJsZSAqLwotCWludCBkd29yZHNfcGVyX2xvb3AgPSA3NCwgbnVtX2xvb3BzOwotCi0JciA9IGV2ZXJncmVlbl92Yl9pYl9nZXQocmRldik7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JLyogOCBicHAgdnMgMzIgYnBwIGZvciB4ZmVyIHVuaXQgKi8KLQlpZiAoc2l6ZV9ieXRlcyAmIDMpCi0JCWxpbmVfc2l6ZSA9IDgxOTI7Ci0JZWxzZQotCQlsaW5lX3NpemUgPSA4MTkyICogNDsKLQotCW1heF9zaXplID0gODE5MiAqIGxpbmVfc2l6ZTsKLQotCS8qIG1ham9yIGxvb3BzIGNvdmVyIHRoZSBtYXggc2l6ZSB0cmFuc2ZlciAqLwotCW51bV9sb29wcyA9ICgoc2l6ZV9ieXRlcyArIG1heF9zaXplKSAvIG1heF9zaXplKTsKLQkvKiBtaW5vciBsb29wcyBjb3ZlciB0aGUgZXh0cmEgbm9uIGFsaWduZWQgYml0cyAqLwotCW51bV9sb29wcyArPSAoKHNpemVfYnl0ZXMgJSBsaW5lX3NpemUpID8gMSA6IDApOwotCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbG9vcHMgY29ycmVjdGx5ICovCi0JcmluZ19zaXplID0gbnVtX2xvb3BzICogZHdvcmRzX3Blcl9sb29wOwotCS8qIHNldCBkZWZhdWx0ICArIHNoYWRlcnMgKi8KLQlyaW5nX3NpemUgKz0gNTU7IC8qIHNoYWRlcnMgKyBkZWYgc3RhdGUgKi8KLQlyaW5nX3NpemUgKz0gMTA7IC8qIGZlbmNlIGVtaXQgZm9yIFZCIElCICovCi0JcmluZ19zaXplICs9IDU7IC8qIGRvbmUgY29weSAqLwotCXJpbmdfc2l6ZSArPSAxMDsgLyogZmVuY2UgZW1pdCBmb3IgZG9uZSBjb3B5ICovCi0JciA9IHJhZGVvbl9yaW5nX2xvY2socmRldiwgcmluZ19zaXplKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlzZXRfZGVmYXVsdF9zdGF0ZShyZGV2KTsgLyogMzYgKi8KLQlzZXRfc2hhZGVycyhyZGV2KTsgLyogMTYgKi8KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBldmVyZ3JlZW5fYmxpdF9kb25lX2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKQotewotCWludCByOwotCi0JaWYgKHJkZXYtPnI2MDBfYmxpdC52Yl9pYikKLQkJZXZlcmdyZWVuX3ZiX2liX3B1dChyZGV2KTsKLQotCWlmIChmZW5jZSkKLQkJciA9IHJhZGVvbl9mZW5jZV9lbWl0KHJkZXYsIGZlbmNlKTsKLQotCXJhZGVvbl9yaW5nX3VubG9ja19jb21taXQocmRldik7Ci19Ci0KLXZvaWQgZXZlcmdyZWVuX2ttc19ibGl0X2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkgICAgIHU2NCBzcmNfZ3B1X2FkZHIsIHU2NCBkc3RfZ3B1X2FkZHIsCi0JCQkgICAgIGludCBzaXplX2J5dGVzKQotewotCWludCBtYXhfYnl0ZXM7Ci0JdTY0IHZiX2dwdV9hZGRyOwotCXUzMiAqdmI7Ci0KLQlEUk1fREVCVUcoImVtaXR0aW5nIGNvcHkgJTE2bGx4ICUxNmxseCAlZCAlZFxuIiwgc3JjX2dwdV9hZGRyLCBkc3RfZ3B1X2FkZHIsCi0JCSAgc2l6ZV9ieXRlcywgcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQpOwotCXZiID0gKHUzMiAqKShyZGV2LT5yNjAwX2JsaXQudmJfaWItPnB0ciArIHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkKTsKLQlpZiAoKHNpemVfYnl0ZXMgJiAzKSB8fCAoc3JjX2dwdV9hZGRyICYgMykgfHwgKGRzdF9ncHVfYWRkciAmIDMpKSB7Ci0JCW1heF9ieXRlcyA9IDgxOTI7Ci0KLQkJd2hpbGUgKHNpemVfYnl0ZXMpIHsKLQkJCWludCBjdXJfc2l6ZSA9IHNpemVfYnl0ZXM7Ci0JCQlpbnQgc3JjX3ggPSBzcmNfZ3B1X2FkZHIgJiAyNTU7Ci0JCQlpbnQgZHN0X3ggPSBkc3RfZ3B1X2FkZHIgJiAyNTU7Ci0JCQlpbnQgaCA9IDE7Ci0JCQlzcmNfZ3B1X2FkZHIgPSBzcmNfZ3B1X2FkZHIgJiB+MjU1VUxMOwotCQkJZHN0X2dwdV9hZGRyID0gZHN0X2dwdV9hZGRyICYgfjI1NVVMTDsKLQotCQkJaWYgKCFzcmNfeCAmJiAhZHN0X3gpIHsKLQkJCQloID0gKGN1cl9zaXplIC8gbWF4X2J5dGVzKTsKLQkJCQlpZiAoaCA+IDgxOTIpCi0JCQkJCWggPSA4MTkyOwotCQkJCWlmIChoID09IDApCi0JCQkJCWggPSAxOwotCQkJCWVsc2UKLQkJCQkJY3VyX3NpemUgPSBtYXhfYnl0ZXM7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjdXJfc2l6ZSA+IG1heF9ieXRlcykKLQkJCQkJY3VyX3NpemUgPSBtYXhfYnl0ZXM7Ci0JCQkJaWYgKGN1cl9zaXplID4gKG1heF9ieXRlcyAtIGRzdF94KSkKLQkJCQkJY3VyX3NpemUgPSAobWF4X2J5dGVzIC0gZHN0X3gpOwotCQkJCWlmIChjdXJfc2l6ZSA+IChtYXhfYnl0ZXMgLSBzcmNfeCkpCi0JCQkJCWN1cl9zaXplID0gKG1heF9ieXRlcyAtIHNyY194KTsKLQkJCX0KLQotCQkJaWYgKChyZGV2LT5yNjAwX2JsaXQudmJfdXNlZCArIDQ4KSA+IHJkZXYtPnI2MDBfYmxpdC52Yl90b3RhbCkgewotCQkJCVdBUk5fT04oMSk7Ci0JCQl9Ci0KLQkJCXZiWzBdID0gaTJmKGRzdF94KTsKLQkJCXZiWzFdID0gMDsKLQkJCXZiWzJdID0gaTJmKHNyY194KTsKLQkJCXZiWzNdID0gMDsKLQotCQkJdmJbNF0gPSBpMmYoZHN0X3gpOwotCQkJdmJbNV0gPSBpMmYoaCk7Ci0JCQl2Yls2XSA9IGkyZihzcmNfeCk7Ci0JCQl2Yls3XSA9IGkyZihoKTsKLQotCQkJdmJbOF0gPSBpMmYoZHN0X3ggKyBjdXJfc2l6ZSk7Ci0JCQl2Yls5XSA9IGkyZihoKTsKLQkJCXZiWzEwXSA9IGkyZihzcmNfeCArIGN1cl9zaXplKTsKLQkJCXZiWzExXSA9IGkyZihoKTsKLQotCQkJLyogc3JjIDEwICovCi0JCQlzZXRfdGV4X3Jlc291cmNlKHJkZXYsIEZNVF84LAotCQkJCQkgc3JjX3ggKyBjdXJfc2l6ZSwgaCwgc3JjX3ggKyBjdXJfc2l6ZSwKLQkJCQkJIHNyY19ncHVfYWRkcik7Ci0KLQkJCS8qIDUgKi8KLQkJCWNwX3NldF9zdXJmYWNlX3N5bmMocmRldiwKLQkJCQkJICAgIFBBQ0tFVDNfVENfQUNUSU9OX0VOQSwgKHNyY194ICsgY3VyX3NpemUgKiBoKSwgc3JjX2dwdV9hZGRyKTsKLQotCi0JCQkvKiBkc3QgMTcgKi8KLQkJCXNldF9yZW5kZXJfdGFyZ2V0KHJkZXYsIENPTE9SXzgsCi0JCQkJCSAgZHN0X3ggKyBjdXJfc2l6ZSwgaCwKLQkJCQkJICBkc3RfZ3B1X2FkZHIpOwotCi0JCQkvKiBzY2lzc29ycyAxMiAqLwotCQkJc2V0X3NjaXNzb3JzKHJkZXYsIGRzdF94LCAwLCBkc3RfeCArIGN1cl9zaXplLCBoKTsKLQotCQkJLyogMTUgKi8KLQkJCXZiX2dwdV9hZGRyID0gcmRldi0+cjYwMF9ibGl0LnZiX2liLT5ncHVfYWRkciArIHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkOwotCQkJc2V0X3Z0eF9yZXNvdXJjZShyZGV2LCB2Yl9ncHVfYWRkcik7Ci0KLQkJCS8qIGRyYXcgMTAgKi8KLQkJCWRyYXdfYXV0byhyZGV2KTsKLQotCQkJLyogNSAqLwotCQkJY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAotCQkJCQkgICAgUEFDS0VUM19DQl9BQ1RJT05fRU5BIHwgUEFDS0VUM19DQjBfREVTVF9CQVNFX0VOQSwKLQkJCQkJICAgIGN1cl9zaXplICogaCwgZHN0X2dwdV9hZGRyKTsKLQotCQkJdmIgKz0gMTI7Ci0JCQlyZGV2LT5yNjAwX2JsaXQudmJfdXNlZCArPSAxMiAqIDQ7Ci0KLQkJCXNyY19ncHVfYWRkciArPSBjdXJfc2l6ZSAqIGg7Ci0JCQlkc3RfZ3B1X2FkZHIgKz0gY3VyX3NpemUgKiBoOwotCQkJc2l6ZV9ieXRlcyAtPSBjdXJfc2l6ZSAqIGg7Ci0JCX0KLQl9IGVsc2UgewotCQltYXhfYnl0ZXMgPSA4MTkyICogNDsKLQotCQl3aGlsZSAoc2l6ZV9ieXRlcykgewotCQkJaW50IGN1cl9zaXplID0gc2l6ZV9ieXRlczsKLQkJCWludCBzcmNfeCA9IChzcmNfZ3B1X2FkZHIgJiAyNTUpOwotCQkJaW50IGRzdF94ID0gKGRzdF9ncHVfYWRkciAmIDI1NSk7Ci0JCQlpbnQgaCA9IDE7Ci0JCQlzcmNfZ3B1X2FkZHIgPSBzcmNfZ3B1X2FkZHIgJiB+MjU1VUxMOwotCQkJZHN0X2dwdV9hZGRyID0gZHN0X2dwdV9hZGRyICYgfjI1NVVMTDsKLQotCQkJaWYgKCFzcmNfeCAmJiAhZHN0X3gpIHsKLQkJCQloID0gKGN1cl9zaXplIC8gbWF4X2J5dGVzKTsKLQkJCQlpZiAoaCA+IDgxOTIpCi0JCQkJCWggPSA4MTkyOwotCQkJCWlmIChoID09IDApCi0JCQkJCWggPSAxOwotCQkJCWVsc2UKLQkJCQkJY3VyX3NpemUgPSBtYXhfYnl0ZXM7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjdXJfc2l6ZSA+IG1heF9ieXRlcykKLQkJCQkJY3VyX3NpemUgPSBtYXhfYnl0ZXM7Ci0JCQkJaWYgKGN1cl9zaXplID4gKG1heF9ieXRlcyAtIGRzdF94KSkKLQkJCQkJY3VyX3NpemUgPSAobWF4X2J5dGVzIC0gZHN0X3gpOwotCQkJCWlmIChjdXJfc2l6ZSA+IChtYXhfYnl0ZXMgLSBzcmNfeCkpCi0JCQkJCWN1cl9zaXplID0gKG1heF9ieXRlcyAtIHNyY194KTsKLQkJCX0KLQotCQkJaWYgKChyZGV2LT5yNjAwX2JsaXQudmJfdXNlZCArIDQ4KSA+IHJkZXYtPnI2MDBfYmxpdC52Yl90b3RhbCkgewotCQkJCVdBUk5fT04oMSk7Ci0JCQl9Ci0KLQkJCXZiWzBdID0gaTJmKGRzdF94IC8gNCk7Ci0JCQl2YlsxXSA9IDA7Ci0JCQl2YlsyXSA9IGkyZihzcmNfeCAvIDQpOwotCQkJdmJbM10gPSAwOwotCi0JCQl2Yls0XSA9IGkyZihkc3RfeCAvIDQpOwotCQkJdmJbNV0gPSBpMmYoaCk7Ci0JCQl2Yls2XSA9IGkyZihzcmNfeCAvIDQpOwotCQkJdmJbN10gPSBpMmYoaCk7Ci0KLQkJCXZiWzhdID0gaTJmKChkc3RfeCArIGN1cl9zaXplKSAvIDQpOwotCQkJdmJbOV0gPSBpMmYoaCk7Ci0JCQl2YlsxMF0gPSBpMmYoKHNyY194ICsgY3VyX3NpemUpIC8gNCk7Ci0JCQl2YlsxMV0gPSBpMmYoaCk7Ci0KLQkJCS8qIHNyYyAxMCAqLwotCQkJc2V0X3RleF9yZXNvdXJjZShyZGV2LCBGTVRfOF84XzhfOCwKLQkJCQkJIChzcmNfeCArIGN1cl9zaXplKSAvIDQsCi0JCQkJCSBoLCAoc3JjX3ggKyBjdXJfc2l6ZSkgLyA0LAotCQkJCQkgc3JjX2dwdV9hZGRyKTsKLQkJCS8qIDUgKi8KLQkJCWNwX3NldF9zdXJmYWNlX3N5bmMocmRldiwKLQkJCQkJICAgIFBBQ0tFVDNfVENfQUNUSU9OX0VOQSwgKHNyY194ICsgY3VyX3NpemUgKiBoKSwgc3JjX2dwdV9hZGRyKTsKLQotCQkJLyogZHN0IDE3ICovCi0JCQlzZXRfcmVuZGVyX3RhcmdldChyZGV2LCBDT0xPUl84XzhfOF84LAotCQkJCQkgIChkc3RfeCArIGN1cl9zaXplKSAvIDQsIGgsCi0JCQkJCSAgZHN0X2dwdV9hZGRyKTsKLQotCQkJLyogc2Npc3NvcnMgMTIgICovCi0JCQlzZXRfc2Npc3NvcnMocmRldiwgKGRzdF94IC8gNCksIDAsIChkc3RfeCArIGN1cl9zaXplIC8gNCksIGgpOwotCi0JCQkvKiBWZXJ0ZXggYnVmZmVyIHNldHVwIDE1ICovCi0JCQl2Yl9ncHVfYWRkciA9IHJkZXYtPnI2MDBfYmxpdC52Yl9pYi0+Z3B1X2FkZHIgKyByZGV2LT5yNjAwX2JsaXQudmJfdXNlZDsKLQkJCXNldF92dHhfcmVzb3VyY2UocmRldiwgdmJfZ3B1X2FkZHIpOwotCi0JCQkvKiBkcmF3IDEwICovCi0JCQlkcmF3X2F1dG8ocmRldik7Ci0KLQkJCS8qIDUgKi8KLQkJCWNwX3NldF9zdXJmYWNlX3N5bmMocmRldiwKLQkJCQkJICAgIFBBQ0tFVDNfQ0JfQUNUSU9OX0VOQSB8IFBBQ0tFVDNfQ0IwX0RFU1RfQkFTRV9FTkEsCi0JCQkJCSAgICBjdXJfc2l6ZSAqIGgsIGRzdF9ncHVfYWRkcik7Ci0KLQkJCS8qIDc0IHJpbmcgZHdvcmRzIHBlciBsb29wICovCi0JCQl2YiArPSAxMjsKLQkJCXJkZXYtPnI2MDBfYmxpdC52Yl91c2VkICs9IDEyICogNDsKLQotCQkJc3JjX2dwdV9hZGRyICs9IGN1cl9zaXplICogaDsKLQkJCWRzdF9ncHVfYWRkciArPSBjdXJfc2l6ZSAqIGg7Ci0JCQlzaXplX2J5dGVzIC09IGN1cl9zaXplICogaDsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2NzLmMKaW5kZXggYTEzNDc5MC4uN2ZkZmE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9jcy5jCkBAIC0xMjIsMTIgKzEyMiw2IEBACiAJdHJhY2stPmRiX3Nfd3JpdGVfYm8gPSBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBldmVyZ3JlZW5fY3NfdHJhY2tfdmFsaWRhdGVfY2Ioc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIGludCBpKQotewotCS8qIFhYWCBmaWxsIGluICovCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZXZlcmdyZWVuX2NzX3RyYWNrX2NoZWNrKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwKQogewogCXN0cnVjdCBldmVyZ3JlZW5fY3NfdHJhY2sgKnRyYWNrID0gcC0+dHJhY2s7CkBAIC0yMzYsMjggKzIzMCw2IEBACiB9CiAKIC8qKgotICogZXZlcmdyZWVuX2NzX3BhY2tldF9uZXh0X2lzX3BrdDNfbm9wKCkgLSB0ZXN0IGlmIG5leHQgcGFja2V0IGlzIHBhY2tldDMgbm9wIGZvciByZWxvYwotICogQHBhcnNlcjoJCXBhcnNlciBzdHJ1Y3R1cmUgaG9sZGluZyBwYXJzaW5nIGNvbnRleHQuCi0gKgotICogQ2hlY2sgbmV4dCBwYWNrZXQgaXMgcmVsb2NhdGlvbiBwYWNrZXQzLCBkbyBibyB2YWxpZGF0aW9uIGFuZCBjb21wdXRlCi0gKiBHUFUgb2Zmc2V0IHVzaW5nIHRoZSBwcm92aWRlZCBzdGFydC4KLSAqKi8KLXN0YXRpYyBpbmxpbmUgaW50IGV2ZXJncmVlbl9jc19wYWNrZXRfbmV4dF9pc19wa3QzX25vcChzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCBwM3JlbG9jOwotCWludCByOwotCi0JciA9IGV2ZXJncmVlbl9jc19wYWNrZXRfcGFyc2UocCwgJnAzcmVsb2MsIHAtPmlkeCk7Ci0JaWYgKHIpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChwM3JlbG9jLnR5cGUgIT0gUEFDS0VUX1RZUEUzIHx8IHAzcmVsb2Mub3Bjb2RlICE9IFBBQ0tFVDNfTk9QKSB7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotLyoqCiAgKiBldmVyZ3JlZW5fY3NfcGFja2V0X25leHRfdmxpbmUoKSAtIHBhcnNlIHVzZXJzcGFjZSBWTElORSBwYWNrZXQKICAqIEBwYXJzZXI6CQlwYXJzZXIgc3RydWN0dXJlIGhvbGRpbmcgcGFyc2luZyBjb250ZXh0LgogICoKQEAgLTQxNCw3ICszODYsNyBAQAogICogaWYgcmVnaXN0ZXIgaXMgc2FmZS4gSWYgcmVnaXN0ZXIgaXMgbm90IGZsYWcgYXMgc2FmZSB0aGlzIGZ1bmN0aW9uCiAgKiB3aWxsIHRlc3QgaXQgYWdhaW5zdCBhIGxpc3Qgb2YgcmVnaXN0ZXIgbmVlZGluZCBzcGVjaWFsIGhhbmRsaW5nLgogICovCi1zdGF0aWMgaW5saW5lIGludCBldmVyZ3JlZW5fY3NfY2hlY2tfcmVnKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCB1MzIgcmVnLCB1MzIgaWR4KQorc3RhdGljIGludCBldmVyZ3JlZW5fY3NfY2hlY2tfcmVnKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCB1MzIgcmVnLCB1MzIgaWR4KQogewogCXN0cnVjdCBldmVyZ3JlZW5fY3NfdHJhY2sgKnRyYWNrID0gKHN0cnVjdCBldmVyZ3JlZW5fY3NfdHJhY2sgKilwLT50cmFjazsKIAlzdHJ1Y3QgcmFkZW9uX2NzX3JlbG9jICpyZWxvYzsKQEAgLTk5MCw3ICs5NjIsNyBAQAogICogVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIHRoYXQgdGhlIHJlc291cmNlIGhhcyB2YWxpZCBmaWVsZCBhbmQgdGhhdAogICogdGhlIHRleHR1cmUgYW5kIG1pcG1hcCBibyBvYmplY3QgYXJlIGJpZyBlbm91Z2ggdG8gY292ZXIgdGhpcyByZXNvdXJjZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZXZlcmdyZWVuX2NoZWNrX3RleHR1cmVfcmVzb3VyY2Uoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsICB1MzIgaWR4LAorc3RhdGljIGludCBldmVyZ3JlZW5fY2hlY2tfdGV4dHVyZV9yZXNvdXJjZShzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgIHUzMiBpZHgsCiAJCQkJCQkgICBzdHJ1Y3QgcmFkZW9uX2JvICp0ZXh0dXJlLAogCQkJCQkJICAgc3RydWN0IHJhZGVvbl9ibyAqbWlwbWFwKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaAppbmRleCA3MzYzZDlkLi5iOTM3YzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaApAQCAtOTQxLDExICs5NDEsMTUgQEAKICNkZWZpbmUJQ0JfQ09MT1IwX1NMSUNFCQkJCQkweDI4YzY4CiAjZGVmaW5lCUNCX0NPTE9SMF9WSUVXCQkJCQkweDI4YzZjCiAjZGVmaW5lCUNCX0NPTE9SMF9JTkZPCQkJCQkweDI4YzcwCisjCWRlZmluZSBDQl9GT1JNQVQoeCkJCQkJKCh4KSA8PCAyKQogIyAgICAgICBkZWZpbmUgQ0JfQVJSQVlfTU9ERSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDgpCiAjICAgICAgIGRlZmluZSBBUlJBWV9MSU5FQVJfR0VORVJBTCAgICAgICAgICAgICAgICAgICAgIDAKICMgICAgICAgZGVmaW5lIEFSUkFZX0xJTkVBUl9BTElHTkVEICAgICAgICAgICAgICAgICAgICAgMQogIyAgICAgICBkZWZpbmUgQVJSQVlfMURfVElMRURfVEhJTjEgICAgICAgICAgICAgICAgICAgICAyCiAjICAgICAgIGRlZmluZSBBUlJBWV8yRF9USUxFRF9USElOMSAgICAgICAgICAgICAgICAgICAgIDQKKyMJZGVmaW5lIENCX1NPVVJDRV9GT1JNQVQoeCkJCQkoKHgpIDw8IDI0KQorIwlkZWZpbmUgQ0JfU0ZfRVhQT1JUX0ZVTEwJCQkwCisjCWRlZmluZSBDQl9TRl9FWFBPUlRfTk9STQkJCTEKICNkZWZpbmUJQ0JfQ09MT1IwX0FUVFJJQgkJCQkweDI4Yzc0CiAjZGVmaW5lCUNCX0NPTE9SMF9ESU0JCQkJCTB4MjhjNzgKIC8qIG9ubHkgQ0IwLTcgYmxvY2tzIGhhdmUgdGhlc2UgcmVncyAqLwpAQCAtMTEwNywxNSArMTExMSw1MyBAQAogI2RlZmluZQlDQl9DT0xPUjdfQ0xFQVJfV09SRDMJCQkJMHgyOGUzYwogCiAjZGVmaW5lIFNRX1RFWF9SRVNPVVJDRV9XT1JEMF8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMDAKKyMJZGVmaW5lIFRFWF9ESU0oeCkJCQkJKCh4KSA8PCAwKQorIwlkZWZpbmUgU1FfVEVYX0RJTV8xRAkJCQkwCisjCWRlZmluZSBTUV9URVhfRElNXzJECQkJCTEKKyMJZGVmaW5lIFNRX1RFWF9ESU1fM0QJCQkJMgorIwlkZWZpbmUgU1FfVEVYX0RJTV9DVUJFTUFQCQkJMworIwlkZWZpbmUgU1FfVEVYX0RJTV8xRF9BUlJBWQkJCTQKKyMJZGVmaW5lIFNRX1RFWF9ESU1fMkRfQVJSQVkJCQk1CisjCWRlZmluZSBTUV9URVhfRElNXzJEX01TQUEJCQk2CisjCWRlZmluZSBTUV9URVhfRElNXzJEX0FSUkFZX01TQUEJCQk3CiAjZGVmaW5lIFNRX1RFWF9SRVNPVVJDRV9XT1JEMV8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMDQKICMgICAgICAgZGVmaW5lIFRFWF9BUlJBWV9NT0RFKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCAyOCkKICNkZWZpbmUgU1FfVEVYX1JFU09VUkNFX1dPUkQyXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwOAogI2RlZmluZSBTUV9URVhfUkVTT1VSQ0VfV09SRDNfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDBDCiAjZGVmaW5lIFNRX1RFWF9SRVNPVVJDRV9XT1JENF8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMTAKKyMJZGVmaW5lIFRFWF9EU1RfU0VMX1goeCkJCQkJKCh4KSA8PCAxNikKKyMJZGVmaW5lIFRFWF9EU1RfU0VMX1koeCkJCQkJKCh4KSA8PCAxOSkKKyMJZGVmaW5lIFRFWF9EU1RfU0VMX1ooeCkJCQkJKCh4KSA8PCAyMikKKyMJZGVmaW5lIFRFWF9EU1RfU0VMX1coeCkJCQkJKCh4KSA8PCAyNSkKKyMJZGVmaW5lIFNRX1NFTF9YCQkJCQkwCisjCWRlZmluZSBTUV9TRUxfWQkJCQkJMQorIwlkZWZpbmUgU1FfU0VMX1oJCQkJCTIKKyMJZGVmaW5lIFNRX1NFTF9XCQkJCQkzCisjCWRlZmluZSBTUV9TRUxfMAkJCQkJNAorIwlkZWZpbmUgU1FfU0VMXzEJCQkJCTUKICNkZWZpbmUgU1FfVEVYX1JFU09VUkNFX1dPUkQ1XzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAxNAogI2RlZmluZSBTUV9URVhfUkVTT1VSQ0VfV09SRDZfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDE4CiAjZGVmaW5lIFNRX1RFWF9SRVNPVVJDRV9XT1JEN18wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMWMKIAorI2RlZmluZSBTUV9WVFhfQ09OU1RBTlRfV09SRDBfMAkJCQkweDMwMDAwCisjZGVmaW5lIFNRX1ZUWF9DT05TVEFOVF9XT1JEMV8wCQkJCTB4MzAwMDQKKyNkZWZpbmUgU1FfVlRYX0NPTlNUQU5UX1dPUkQyXzAJCQkJMHgzMDAwOAorIwlkZWZpbmUgU1FfVlRYQ19CQVNFX0FERFJfSEkoeCkJCQkoKHgpIDw8IDApCisjCWRlZmluZSBTUV9WVFhDX1NUUklERSh4KQkJCSgoeCkgPDwgOCkKKyMJZGVmaW5lIFNRX1ZUWENfRU5ESUFOX1NXQVAoeCkJCQkoKHgpIDw8IDMwKQorIwlkZWZpbmUgU1FfRU5ESUFOX05PTkUJCQkJMAorIwlkZWZpbmUgU1FfRU5ESUFOXzhJTjE2CQkJCTEKKyMJZGVmaW5lIFNRX0VORElBTl84SU4zMgkJCQkyCisjZGVmaW5lIFNRX1ZUWF9DT05TVEFOVF9XT1JEM18wCQkJCTB4MzAwMEMKKyMJZGVmaW5lIFNRX1ZUQ1hfU0VMX1goeCkJCQkJKCh4KSA8PCAzKQorIwlkZWZpbmUgU1FfVlRDWF9TRUxfWSh4KQkJCQkoKHgpIDw8IDYpCisjCWRlZmluZSBTUV9WVENYX1NFTF9aKHgpCQkJCSgoeCkgPDwgOSkKKyMJZGVmaW5lIFNRX1ZUQ1hfU0VMX1coeCkJCQkJKCh4KSA8PCAxMikKKyNkZWZpbmUgU1FfVlRYX0NPTlNUQU5UX1dPUkQ0XzAJCQkJMHgzMDAxMAorI2RlZmluZSBTUV9WVFhfQ09OU1RBTlRfV09SRDVfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDE0CisjZGVmaW5lIFNRX1ZUWF9DT05TVEFOVF9XT1JENl8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMTgKKyNkZWZpbmUgU1FfVlRYX0NPTlNUQU5UX1dPUkQ3XzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAxYworCiAvKiBjYXltYW4gM0QgcmVncyAqLwogI2RlZmluZSBDQVlNQU5fVkdUX09GRkNISVBfTERTX0JBU0UJCQkweDg5QjAKICNkZWZpbmUgQ0FZTUFOX0RCX0VRQUEJCQkJCTB4Mjg4MDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYwppbmRleCA4Yzc5Y2E5Li4wZTU3OTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgogI2luY2x1ZGUgInJhZGVvbl9hc2ljLmgiCkBAIC00MCw2ICs0MSw3IEBACiBleHRlcm4gdm9pZCBldmVyZ3JlZW5faXJxX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCBldmVyZ3JlZW5fbWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fZml4X3BjaV9tYXhfcmVhZF9yZXFfc2l6ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCBldmVyZ3JlZW5fcGNpZV9nZW4yX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKICNkZWZpbmUgRVZFUkdSRUVOX1BGUF9VQ09ERV9TSVpFIDExMjAKICNkZWZpbmUgRVZFUkdSRUVOX1BNNF9VQ09ERV9TSVpFIDEzNzYKQEAgLTI2MCw4ICsyNjIsMTEgQEAKIAkJV1JFRzMyKE1DX1NFUV9TVVBfQ05UTCwgMHgwMDAwMDAwMSk7CiAKIAkJLyogd2FpdCBmb3IgdHJhaW5pbmcgdG8gY29tcGxldGUgKi8KLQkJd2hpbGUgKCEoUlJFRzMyKE1DX0lPX1BBRF9DTlRMX0QwKSAmIE1FTV9GQUxMX09VVF9DTUQpKQotCQkJdWRlbGF5KDEwKTsKKwkJZm9yIChpID0gMDsgaSA8IHJkZXYtPnVzZWNfdGltZW91dDsgaSsrKSB7CisJCQlpZiAoUlJFRzMyKE1DX0lPX1BBRF9DTlRMX0QwKSAmIE1FTV9GQUxMX09VVF9DTUQpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMSk7CisJCX0KIAogCQlpZiAocnVubmluZykKIAkJCVdSRUczMihNQ19TSEFSRURfQkxBQ0tPVVRfQ05UTCwgYmxhY2tvdXQpOwpAQCAtOTMxLDcgKzkzNiw3IEBACiB7CiAJaW50IHI7CiAKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmogPT0gTlVMTCkgeworCWlmIChyZGV2LT5nYXJ0LnJvYmogPT0gTlVMTCkgewogCQlkZXZfZXJyKHJkZXYtPmRldiwgIk5vIFZSQU0gb2JqZWN0IGZvciBQQ0lFIEdBUlQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTY3LDE0ICs5NzIsMTUgQEAKIAlXUkVHMzIoVk1fQ09OVEVYVDFfQ05UTCwgMCk7CiAKIAljYXltYW5fcGNpZV9nYXJ0X3RsYl9mbHVzaChyZGV2KTsKKwlEUk1fSU5GTygiUENJRSBHQVJUIG9mICV1TSBlbmFibGVkICh0YWJsZSBhdCAweCUwMTZsbFgpLlxuIiwKKwkJICh1bnNpZ25lZCkocmRldi0+bWMuZ3R0X3NpemUgPj4gMjApLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZGV2LT5nYXJ0LnRhYmxlX2FkZHIpOwogCXJkZXYtPmdhcnQucmVhZHkgPSB0cnVlOwogCXJldHVybiAwOwogfQogCiB2b2lkIGNheW1hbl9wY2llX2dhcnRfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpbnQgcjsKLQogCS8qIERpc2FibGUgYWxsIHRhYmxlcyAqLwogCVdSRUczMihWTV9DT05URVhUMF9DTlRMLCAwKTsKIAlXUkVHMzIoVk1fQ09OVEVYVDFfQ05UTCwgMCk7CkBAIC05OTAsMTQgKzk5Niw3IEBACiAJV1JFRzMyKFZNX0wyX0NOVEwyLCAwKTsKIAlXUkVHMzIoVk1fTDJfQ05UTDMsIEwyX0NBQ0hFX0JJR0tfQVNTT0NJQVRJVklUWSB8CiAJICAgICAgIEwyX0NBQ0hFX0JJR0tfRlJBR01FTlRfU0laRSg2KSk7Ci0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKSB7Ci0JCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiwgZmFsc2UpOwotCQlpZiAobGlrZWx5KHIgPT0gMCkpIHsKLQkJCXJhZGVvbl9ib19rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQl9Ci0JfQorCXJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fdW5waW4ocmRldik7CiB9CiAKIHZvaWQgY2F5bWFuX3BjaWVfZ2FydF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtMTM0MSw2ICsxMzQwLDkgQEAKIHsKIAlpbnQgcjsKIAorCS8qIGVuYWJsZSBwY2llIGdlbjIgbGluayAqLworCWV2ZXJncmVlbl9wY2llX2dlbjJfZW5hYmxlKHJkZXYpOworCiAJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncgfHwgIXJkZXYtPm1jX2Z3KSB7CiAJCXIgPSBuaV9pbml0X21pY3JvY29kZShyZGV2KTsKIAkJaWYgKHIpIHsKQEAgLTEzNTQsNiArMTM1NiwxMCBAQAogCQlyZXR1cm4gcjsKIAl9CiAKKwlyID0gcjYwMF92cmFtX3NjcmF0Y2hfaW5pdChyZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKIAlldmVyZ3JlZW5fbWNfcHJvZ3JhbShyZGV2KTsKIAlyID0gY2F5bWFuX3BjaWVfZ2FydF9lbmFibGUocmRldik7CiAJaWYgKHIpCkBAIC0xMzYyLDcgKzEzNjgsNyBAQAogCiAJciA9IGV2ZXJncmVlbl9ibGl0X2luaXQocmRldik7CiAJaWYgKHIpIHsKLQkJZXZlcmdyZWVuX2JsaXRfZmluaShyZGV2KTsKKwkJcjYwMF9ibGl0X2ZpbmkocmRldik7CiAJCXJkZXYtPmFzaWMtPmNvcHkgPSBOVUxMOwogCQlkZXZfd2FybihyZGV2LT5kZXYsICJmYWlsZWQgYmxpdHRlciAoJWQpIGZhbGxpbmcgYmFjayB0byBtZW1jcHlcbiIsIHIpOwogCX0KQEAgLTE0MjMsMjEgKzE0MjksMTMgQEAKIAogaW50IGNheW1hbl9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCWludCByOwotCiAJLyogRklYTUU6IHdlIHNob3VsZCB3YWl0IGZvciByaW5nIHRvIGJlIGVtcHR5ICovCiAJY2F5bWFuX2NwX2VuYWJsZShyZGV2LCBmYWxzZSk7CiAJcmRldi0+Y3AucmVhZHkgPSBmYWxzZTsKIAlldmVyZ3JlZW5faXJxX3N1c3BlbmQocmRldik7CiAJcmFkZW9uX3diX2Rpc2FibGUocmRldik7CiAJY2F5bWFuX3BjaWVfZ2FydF9kaXNhYmxlKHJkZXYpOwotCi0JLyogdW5waW4gc2hhZGVycyBibyAqLwotCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgZmFsc2UpOwotCWlmIChsaWtlbHkociA9PSAwKSkgewotCQlyYWRlb25fYm9fdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwotCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKLQl9CisJcjYwMF9ibGl0X3N1c3BlbmQocmRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1NTAsMTMgKzE1NDgsMTQgQEAKIAogdm9pZCBjYXltYW5fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlldmVyZ3JlZW5fYmxpdF9maW5pKHJkZXYpOworCXI2MDBfYmxpdF9maW5pKHJkZXYpOwogCWNheW1hbl9jcF9maW5pKHJkZXYpOwogCXI2MDBfaXJxX2ZpbmkocmRldik7CiAJcmFkZW9uX3diX2ZpbmkocmRldik7CiAJcmFkZW9uX2liX3Bvb2xfZmluaShyZGV2KTsKIAlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOwogCWNheW1hbl9wY2llX2dhcnRfZmluaShyZGV2KTsKKwlyNjAwX3ZyYW1fc2NyYXRjaF9maW5pKHJkZXYpOwogCXJhZGVvbl9nZW1fZmluaShyZGV2KTsKIAlyYWRlb25fZmVuY2VfZHJpdmVyX2ZpbmkocmRldik7CiAJcmFkZW9uX2JvX2ZpbmkocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCmluZGV4IDdmY2RiYmIuLmFkMTU4ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCkBAIC00MSw2ICs0MSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAicjEwMF9yZWdfc2FmZS5oIgogI2luY2x1ZGUgInJuNTBfcmVnX3NhZmUuaCIKQEAgLTY4LDYgKzY5LDEwOCBAQAogICogcjEwMCxydjEwMCxyczEwMCxydjIwMCxyczIwMCxyMjAwLHJ2MjUwLHJzMzAwLHJ2MjgwCiAgKi8KIAoraW50IHIxMDBfcmVsb2NfcGl0Y2hfb2Zmc2V0KHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLAorCQkJICAgIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QsCisJCQkgICAgdW5zaWduZWQgaWR4LAorCQkJICAgIHVuc2lnbmVkIHJlZykKK3sKKwlpbnQgcjsKKwl1MzIgdGlsZV9mbGFncyA9IDA7CisJdTMyIHRtcDsKKwlzdHJ1Y3QgcmFkZW9uX2NzX3JlbG9jICpyZWxvYzsKKwl1MzIgdmFsdWU7CisKKwlyID0gcjEwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOworCWlmIChyKSB7CisJCURSTV9FUlJPUigiTm8gcmVsb2MgZm9yIGliWyVkXT0weCUwNFhcbiIsCisJCQkgIGlkeCwgcmVnKTsKKwkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOworCQlyZXR1cm4gcjsKKwl9CisJdmFsdWUgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CisJdG1wID0gdmFsdWUgJiAweDAwM2ZmZmZmOworCXRtcCArPSAoKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCkgPj4gMTApOworCisJaWYgKHJlbG9jLT5sb2JqLnRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pCisJCXRpbGVfZmxhZ3MgfD0gUkFERU9OX0RTVF9USUxFX01BQ1JPOworCWlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01JQ1JPKSB7CisJCWlmIChyZWcgPT0gUkFERU9OX1NSQ19QSVRDSF9PRkZTRVQpIHsKKwkJCURSTV9FUlJPUigiQ2Fubm90IHNyYyBibGl0IGZyb20gbWljcm90aWxlZCBzdXJmYWNlXG4iKTsKKwkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXRpbGVfZmxhZ3MgfD0gUkFERU9OX0RTVF9USUxFX01JQ1JPOworCX0KKworCXRtcCB8PSB0aWxlX2ZsYWdzOworCXAtPmliLT5wdHJbaWR4XSA9ICh2YWx1ZSAmIDB4M2ZjMDAwMDApIHwgdG1wOworCXJldHVybiAwOworfQorCitpbnQgcjEwMF9wYWNrZXQzX2xvYWRfdmJwbnRyKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLAorCQkJICAgICBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAorCQkJICAgICBpbnQgaWR4KQoreworCXVuc2lnbmVkIGMsIGk7CisJc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqcmVsb2M7CisJc3RydWN0IHIxMDBfY3NfdHJhY2sgKnRyYWNrOworCWludCByID0gMDsKKwl2b2xhdGlsZSB1aW50MzJfdCAqaWI7CisJdTMyIGlkeF92YWx1ZTsKKworCWliID0gcC0+aWItPnB0cjsKKwl0cmFjayA9IChzdHJ1Y3QgcjEwMF9jc190cmFjayAqKXAtPnRyYWNrOworCWMgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCsrKSAmIDB4MUY7CisJaWYgKGMgPiAxNikgeworCSAgICBEUk1fRVJST1IoIk9ubHkgMTYgdmVydGV4IGJ1ZmZlcnMgYXJlIGFsbG93ZWQgJWRcbiIsCisJCSAgICAgIHBrdC0+b3Bjb2RlKTsKKwkgICAgcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOworCSAgICByZXR1cm4gLUVJTlZBTDsKKwl9CisJdHJhY2stPm51bV9hcnJheXMgPSBjOworCWZvciAoaSA9IDA7IGkgPCAoYyAtIDEpOyBpKz0yLCBpZHgrPTMpIHsKKwkJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKKwkJaWYgKHIpIHsKKwkJCURSTV9FUlJPUigiTm8gcmVsb2MgZm9yIHBhY2tldDMgJWRcbiIsCisJCQkJICBwa3QtPm9wY29kZSk7CisJCQlyMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7CisJCQlyZXR1cm4gcjsKKwkJfQorCQlpZHhfdmFsdWUgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7CisJCWliW2lkeCsxXSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgMSkgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKworCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5lc2l6ZSA9IGlkeF92YWx1ZSA+PiA4OworCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5yb2JqID0gcmVsb2MtPnJvYmo7CisJCXRyYWNrLT5hcnJheXNbaSArIDBdLmVzaXplICY9IDB4N0Y7CisJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CisJCWlmIChyKSB7CisJCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBwYWNrZXQzICVkXG4iLAorCQkJCSAgcGt0LT5vcGNvZGUpOworCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJaWJbaWR4KzJdID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAyKSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOworCQl0cmFjay0+YXJyYXlzW2kgKyAxXS5yb2JqID0gcmVsb2MtPnJvYmo7CisJCXRyYWNrLT5hcnJheXNbaSArIDFdLmVzaXplID0gaWR4X3ZhbHVlID4+IDI0OworCQl0cmFjay0+YXJyYXlzW2kgKyAxXS5lc2l6ZSAmPSAweDdGOworCX0KKwlpZiAoYyAmIDEpIHsKKwkJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKKwkJaWYgKHIpIHsKKwkJCURSTV9FUlJPUigiTm8gcmVsb2MgZm9yIHBhY2tldDMgJWRcbiIsCisJCQkJCSAgcGt0LT5vcGNvZGUpOworCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJaWR4X3ZhbHVlID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOworCQlpYltpZHgrMV0gPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCArIDEpICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisJCXRyYWNrLT5hcnJheXNbaSArIDBdLnJvYmogPSByZWxvYy0+cm9iajsKKwkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgPSBpZHhfdmFsdWUgPj4gODsKKwkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgJj0gMHg3RjsKKwl9CisJcmV0dXJuIHI7Cit9CisKIHZvaWQgcjEwMF9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YykKIHsKIAkvKiBlbmFibGUgdGhlIHBmbGlwIGludCAqLwpAQCAtNDM0LDYgKzUzNyw3IEBACiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQorCQlyYWRlb25faHBkX3NldF9wb2xhcml0eShyZGV2LCByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKTsKIAl9CiAJaWYgKHJkZXYtPmlycS5pbnN0YWxsZWQpCiAJCXIxMDBfaXJxX3NldChyZGV2KTsKQEAgLTQ3NCw3ICs1NzgsNyBAQAogewogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUucmFtLnB0cikgeworCWlmIChyZGV2LT5nYXJ0LnB0cikgewogCQlXQVJOKDEsICJSMTAwIFBDSSBHQVJUIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC01MTMsNiArNjE3LDkgQEAKIAl0bXAgPSBSUkVHMzIoUkFERU9OX0FJQ19DTlRMKSB8IFJBREVPTl9QQ0lHQVJUX1RSQU5TTEFURV9FTjsKIAlXUkVHMzIoUkFERU9OX0FJQ19DTlRMLCB0bXApOwogCXIxMDBfcGNpX2dhcnRfdGxiX2ZsdXNoKHJkZXYpOworCURSTV9JTkZPKCJQQ0lFIEdBUlQgb2YgJXVNIGVuYWJsZWQgKHRhYmxlIGF0IDB4JTAxNmxsWCkuXG4iLAorCQkgKHVuc2lnbmVkKShyZGV2LT5tYy5ndHRfc2l6ZSA+PiAyMCksCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXJkZXYtPmdhcnQudGFibGVfYWRkcik7CiAJcmRldi0+Z2FydC5yZWFkeSA9IHRydWU7CiAJcmV0dXJuIDA7CiB9CkBAIC01MzAsMTAgKzYzNywxMiBAQAogCiBpbnQgcjEwMF9wY2lfZ2FydF9zZXRfcGFnZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGksIHVpbnQ2NF90IGFkZHIpCiB7CisJdTMyICpndHQgPSByZGV2LT5nYXJ0LnB0cjsKKwogCWlmIChpIDwgMCB8fCBpID4gcmRldi0+Z2FydC5udW1fZ3B1X3BhZ2VzKSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZGV2LT5nYXJ0LnRhYmxlLnJhbS5wdHJbaV0gPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKGFkZHIpKTsKKwlndHRbaV0gPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKGFkZHIpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTg4LDcgKzY5Nyw3IEBACiAJV1JFRzMyKFJfMDAwMDQ0X0dFTl9JTlRfU1RBVFVTLCB0bXApOwogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IHIxMDBfaXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3N0YXRpYyB1aW50MzJfdCByMTAwX2lycV9hY2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdWludDMyX3QgaXJxcyA9IFJSRUczMihSQURFT05fR0VOX0lOVF9TVEFUVVMpOwogCXVpbnQzMl90IGlycV9tYXNrID0gUkFERU9OX1NXX0lOVF9URVNUIHwKQEAgLTMxNDcsNyArMzI1Niw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcjEwMF9jc190cmFja190ZXh0dXJlX3ByaW50KHN0cnVjdCByMTAwX2NzX3RyYWNrX3RleHR1cmUgKnQpCitzdGF0aWMgdm9pZCByMTAwX2NzX3RyYWNrX3RleHR1cmVfcHJpbnQoc3RydWN0IHIxMDBfY3NfdHJhY2tfdGV4dHVyZSAqdCkKIHsKIAlEUk1fRVJST1IoInBpdGNoICAgICAgICAgICAgICAgICAgICAgICVkXG4iLCB0LT5waXRjaCk7CiAJRFJNX0VSUk9SKCJ1c2VfcGl0Y2ggICAgICAgICAgICAgICAgICAlZFxuIiwgdC0+dXNlX3BpdGNoKTsKQEAgLTM5NjUsMyArNDA3NCw0MyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKwordWludDMyX3QgcjEwMF9tbV9ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpCit7CisJaWYgKHJlZyA8IHJkZXYtPnJtbWlvX3NpemUpCisJCXJldHVybiByZWFkbCgoKHZvaWQgX19pb21lbSAqKXJkZXYtPnJtbWlvKSArIHJlZyk7CisJZWxzZSB7CisJCXdyaXRlbChyZWcsICgodm9pZCBfX2lvbWVtICopcmRldi0+cm1taW8pICsgUkFERU9OX01NX0lOREVYKTsKKwkJcmV0dXJuIHJlYWRsKCgodm9pZCBfX2lvbWVtICopcmRldi0+cm1taW8pICsgUkFERU9OX01NX0RBVEEpOworCX0KK30KKwordm9pZCByMTAwX21tX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdikKK3sKKwlpZiAocmVnIDwgcmRldi0+cm1taW9fc2l6ZSkKKwkJd3JpdGVsKHYsICgodm9pZCBfX2lvbWVtICopcmRldi0+cm1taW8pICsgcmVnKTsKKwllbHNlIHsKKwkJd3JpdGVsKHJlZywgKCh2b2lkIF9faW9tZW0gKilyZGV2LT5ybW1pbykgKyBSQURFT05fTU1fSU5ERVgpOworCQl3cml0ZWwodiwgKCh2b2lkIF9faW9tZW0gKilyZGV2LT5ybW1pbykgKyBSQURFT05fTU1fREFUQSk7CisJfQorfQorCit1MzIgcjEwMF9pb19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgcmVnKQoreworCWlmIChyZWcgPCByZGV2LT5yaW9fbWVtX3NpemUpCisJCXJldHVybiBpb3JlYWQzMihyZGV2LT5yaW9fbWVtICsgcmVnKTsKKwllbHNlIHsKKwkJaW93cml0ZTMyKHJlZywgcmRldi0+cmlvX21lbSArIFJBREVPTl9NTV9JTkRFWCk7CisJCXJldHVybiBpb3JlYWQzMihyZGV2LT5yaW9fbWVtICsgUkFERU9OX01NX0RBVEEpOworCX0KK30KKwordm9pZCByMTAwX2lvX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiByZWcsIHUzMiB2KQoreworCWlmIChyZWcgPCByZGV2LT5yaW9fbWVtX3NpemUpCisJCWlvd3JpdGUzMih2LCByZGV2LT5yaW9fbWVtICsgcmVnKTsKKwllbHNlIHsKKwkJaW93cml0ZTMyKHJlZywgcmRldi0+cmlvX21lbSArIFJBREVPTl9NTV9JTkRFWCk7CisJCWlvd3JpdGUzMih2LCByZGV2LT5yaW9fbWVtICsgUkFERU9OX01NX0RBVEEpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwX3RyYWNrLmgKaW5kZXggNjg2ZjlkYy4uNmE2MDNiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwX3RyYWNrLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwX3RyYWNrLmgKQEAgLTkyLDEwNiArOTIsMTAgQEAKIAkJICAgICAgIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QsCiAJCSAgICAgICB1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIHJlZyk7CiAKLQotCi1zdGF0aWMgaW5saW5lIGludCByMTAwX3JlbG9jX3BpdGNoX29mZnNldChzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKLQkJCQkJICBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAotCQkJCQkgIHVuc2lnbmVkIGlkeCwKLQkJCQkJICB1bnNpZ25lZCByZWcpCi17Ci0JaW50IHI7Ci0JdTMyIHRpbGVfZmxhZ3MgPSAwOwotCXUzMiB0bXA7Ci0Jc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqcmVsb2M7Ci0JdTMyIHZhbHVlOwotCi0JciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKLQlpZiAocikgewotCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBpYlslZF09MHglMDRYXG4iLAotCQkJICBpZHgsIHJlZyk7Ci0JCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKLQkJcmV0dXJuIHI7Ci0JfQotCXZhbHVlID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwotCXRtcCA9IHZhbHVlICYgMHgwMDNmZmZmZjsKLQl0bXAgKz0gKCgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpID4+IDEwKTsKLQotCWlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKQotCQl0aWxlX2ZsYWdzIHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKLQlpZiAocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykgewotCQlpZiAocmVnID09IFJBREVPTl9TUkNfUElUQ0hfT0ZGU0VUKSB7Ci0JCQlEUk1fRVJST1IoIkNhbm5vdCBzcmMgYmxpdCBmcm9tIG1pY3JvdGlsZWQgc3VyZmFjZVxuIik7Ci0JCQlyMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQl0aWxlX2ZsYWdzIHw9IFJBREVPTl9EU1RfVElMRV9NSUNSTzsKLQl9Ci0KLQl0bXAgfD0gdGlsZV9mbGFnczsKLQlwLT5pYi0+cHRyW2lkeF0gPSAodmFsdWUgJiAweDNmYzAwMDAwKSB8IHRtcDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcjEwMF9wYWNrZXQzX2xvYWRfdmJwbnRyKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLAotCQkJCQkgICBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAotCQkJCQkgICBpbnQgaWR4KQotewotCXVuc2lnbmVkIGMsIGk7Ci0Jc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqcmVsb2M7Ci0Jc3RydWN0IHIxMDBfY3NfdHJhY2sgKnRyYWNrOwotCWludCByID0gMDsKLQl2b2xhdGlsZSB1aW50MzJfdCAqaWI7Ci0JdTMyIGlkeF92YWx1ZTsKLQotCWliID0gcC0+aWItPnB0cjsKLQl0cmFjayA9IChzdHJ1Y3QgcjEwMF9jc190cmFjayAqKXAtPnRyYWNrOwotCWMgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCsrKSAmIDB4MUY7Ci0JaWYgKGMgPiAxNikgewotCSAgICBEUk1fRVJST1IoIk9ubHkgMTYgdmVydGV4IGJ1ZmZlcnMgYXJlIGFsbG93ZWQgJWRcbiIsCi0JCSAgICAgIHBrdC0+b3Bjb2RlKTsKLQkgICAgcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwotCSAgICByZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdHJhY2stPm51bV9hcnJheXMgPSBjOwotCWZvciAoaSA9IDA7IGkgPCAoYyAtIDEpOyBpKz0yLCBpZHgrPTMpIHsKLQkJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKLQkJaWYgKHIpIHsKLQkJCURSTV9FUlJPUigiTm8gcmVsb2MgZm9yIHBhY2tldDMgJWRcbiIsCi0JCQkJICBwa3QtPm9wY29kZSk7Ci0JCQlyMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7Ci0JCQlyZXR1cm4gcjsKLQkJfQotCQlpZHhfdmFsdWUgPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCk7Ci0JCWliW2lkeCsxXSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgMSkgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKLQotCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5lc2l6ZSA9IGlkeF92YWx1ZSA+PiA4OwotCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5yb2JqID0gcmVsb2MtPnJvYmo7Ci0JCXRyYWNrLT5hcnJheXNbaSArIDBdLmVzaXplICY9IDB4N0Y7Ci0JCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7Ci0JCWlmIChyKSB7Ci0JCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBwYWNrZXQzICVkXG4iLAotCQkJCSAgcGt0LT5vcGNvZGUpOwotCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwotCQkJcmV0dXJuIHI7Ci0JCX0KLQkJaWJbaWR4KzJdID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAyKSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwotCQl0cmFjay0+YXJyYXlzW2kgKyAxXS5yb2JqID0gcmVsb2MtPnJvYmo7Ci0JCXRyYWNrLT5hcnJheXNbaSArIDFdLmVzaXplID0gaWR4X3ZhbHVlID4+IDI0OwotCQl0cmFjay0+YXJyYXlzW2kgKyAxXS5lc2l6ZSAmPSAweDdGOwotCX0KLQlpZiAoYyAmIDEpIHsKLQkJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKLQkJaWYgKHIpIHsKLQkJCURSTV9FUlJPUigiTm8gcmVsb2MgZm9yIHBhY2tldDMgJWRcbiIsCi0JCQkJCSAgcGt0LT5vcGNvZGUpOwotCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwotCQkJcmV0dXJuIHI7Ci0JCX0KLQkJaWR4X3ZhbHVlID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwotCQlpYltpZHgrMV0gPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCArIDEpICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7Ci0JCXRyYWNrLT5hcnJheXNbaSArIDBdLnJvYmogPSByZWxvYy0+cm9iajsKLQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgPSBpZHhfdmFsdWUgPj4gODsKLQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgJj0gMHg3RjsKLQl9Ci0JcmV0dXJuIHI7Ci19CitpbnQgcjEwMF9yZWxvY19waXRjaF9vZmZzZXQoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCisJCQkgICAgc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKKwkJCSAgICB1bnNpZ25lZCBpZHgsCisJCQkgICAgdW5zaWduZWQgcmVnKTsKK2ludCByMTAwX3BhY2tldDNfbG9hZF92YnBudHIoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCisJCQkgICAgIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QsCisJCQkgICAgIGludCBpZHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYwppbmRleCA1NWE3ZjE5Li40MDBiMjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYwpAQCAtNzQsNyArNzQsNyBAQAogCiBpbnQgcnYzNzBfcGNpZV9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaSwgdWludDY0X3QgYWRkcikKIHsKLQl2b2lkIF9faW9tZW0gKnB0ciA9ICh2b2lkICopcmRldi0+Z2FydC50YWJsZS52cmFtLnB0cjsKKwl2b2lkIF9faW9tZW0gKnB0ciA9IHJkZXYtPmdhcnQucHRyOwogCiAJaWYgKGkgPCAwIHx8IGkgPiByZGV2LT5nYXJ0Lm51bV9ncHVfcGFnZXMpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05Myw3ICs5Myw3IEBACiB7CiAJaW50IHI7CiAKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqKSB7CiAJCVdBUk4oMSwgIlJWMzcwIFBDSUUgR0FSVCBhbHJlYWR5IGluaXRpYWxpemVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTE2LDcgKzExNiw3IEBACiAJdWludDMyX3QgdG1wOwogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqID09IE5VTEwpIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKIAkJZGV2X2VycihyZGV2LT5kZXYsICJObyBWUkFNIG9iamVjdCBmb3IgUENJRSBHQVJULlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE0NCw4ICsxNDQsOSBAQAogCXRtcCB8PSBSQURFT05fUENJRV9UWF9HQVJUX1VOTUFQUEVEX0FDQ0VTU19ESVNDQVJEOwogCVdSRUczMl9QQ0lFKFJBREVPTl9QQ0lFX1RYX0dBUlRfQ05UTCwgdG1wKTsKIAlydjM3MF9wY2llX2dhcnRfdGxiX2ZsdXNoKHJkZXYpOwotCURSTV9JTkZPKCJQQ0lFIEdBUlQgb2YgJXVNIGVuYWJsZWQgKHRhYmxlIGF0IDB4JTA4WCkuXG4iLAotCQkgKHVuc2lnbmVkKShyZGV2LT5tYy5ndHRfc2l6ZSA+PiAyMCksIHRhYmxlX2FkZHIpOworCURSTV9JTkZPKCJQQ0lFIEdBUlQgb2YgJXVNIGVuYWJsZWQgKHRhYmxlIGF0IDB4JTAxNmxsWCkuXG4iLAorCQkgKHVuc2lnbmVkKShyZGV2LT5tYy5ndHRfc2l6ZSA+PiAyMCksCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXRhYmxlX2FkZHIpOwogCXJkZXYtPmdhcnQucmVhZHkgPSB0cnVlOwogCXJldHVybiAwOwogfQpAQCAtMTUzLDcgKzE1NCw2IEBACiB2b2lkIHJ2MzcwX3BjaWVfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB0bXA7Ci0JaW50IHI7CiAKIAlXUkVHMzJfUENJRShSQURFT05fUENJRV9UWF9HQVJUX1NUQVJUX0xPLCAwKTsKIAlXUkVHMzJfUENJRShSQURFT05fUENJRV9UWF9HQVJUX0VORF9MTywgMCk7CkBAIC0xNjIsMTQgKzE2Miw3IEBACiAJdG1wID0gUlJFRzMyX1BDSUUoUkFERU9OX1BDSUVfVFhfR0FSVF9DTlRMKTsKIAl0bXAgfD0gUkFERU9OX1BDSUVfVFhfR0FSVF9VTk1BUFBFRF9BQ0NFU1NfRElTQ0FSRDsKIAlXUkVHMzJfUENJRShSQURFT05fUENJRV9UWF9HQVJUX0NOVEwsIHRtcCAmIH5SQURFT05fUENJRV9UWF9HQVJUX0VOKTsKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKLQkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7Ci0JCWlmIChsaWtlbHkociA9PSAwKSkgewotCQkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCX0KLQl9CisJcmFkZW9uX2dhcnRfdGFibGVfdnJhbV91bnBpbihyZGV2KTsKIH0KIAogdm9pZCBydjM3MF9wY2llX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMF9jbWRidWYuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMF9jbWRidWYuYwppbmRleCBjNWMyNzQyLi4xZmU5OGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBfY21kYnVmLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwX2NtZGJ1Zi5jCkBAIC03OTEsNyArNzkxLDcgQEAKIC8qKgogICogRW1pdCB0aGUgc2VxdWVuY2UgdG8gcGFjaWZ5IFIzMDAuCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgcjMwMF9wYWNpZnkoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2KQorc3RhdGljIHZvaWQgcjMwMF9wYWNpZnkoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2KQogewogCXVpbnQzMl90IGNhY2hlX3osIGNhY2hlXzNkLCBjYWNoZV8yZDsKIAlSSU5HX0xPQ0FMUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKaW5kZXggNzIwZGQ5OS4uOWNkZGEwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInJhZGVvbl9kcm0uaCIKICNpbmNsdWRlICJyYWRlb24uaCIKQEAgLTI4NywyNCArMjg4LDYgQEAKIAkJICBwY2llX2xhbmVzKTsKIH0KIAotc3RhdGljIGludCByNjAwX3BtX2dldF90eXBlX2luZGV4KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJCSAgZW51bSByYWRlb25fcG1fc3RhdGVfdHlwZSBwc190eXBlLAotCQkJCSAgaW50IGluc3RhbmNlKQotewotCWludCBpOwotCWludCBmb3VuZF9pbnN0YW5jZSA9IC0xOwotCi0JZm9yIChpID0gMDsgaSA8IHJkZXYtPnBtLm51bV9wb3dlcl9zdGF0ZXM7IGkrKykgewotCQlpZiAocmRldi0+cG0ucG93ZXJfc3RhdGVbaV0udHlwZSA9PSBwc190eXBlKSB7Ci0JCQlmb3VuZF9pbnN0YW5jZSsrOwotCQkJaWYgKGZvdW5kX2luc3RhbmNlID09IGluc3RhbmNlKQotCQkJCXJldHVybiBpOwotCQl9Ci0JfQotCS8qIHJldHVybiBkZWZhdWx0IGlmIG5vIG1hdGNoICovCi0JcmV0dXJuIHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXg7Ci19Ci0KIHZvaWQgcnM3ODBfcG1faW5pdF9wcm9maWxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWlmIChyZGV2LT5wbS5udW1fcG93ZXJfc3RhdGVzID09IDIpIHsKQEAgLTQyMCw2ICs0MDMsOCBAQAogCiB2b2lkIHI2MDBfcG1faW5pdF9wcm9maWxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogeworCWludCBpZHg7CisKIAlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfUjYwMCkgewogCQkvKiBYWFggKi8KIAkJLyogZGVmYXVsdCAqLwpAQCAtNTAxLDgxICs0ODYsNDMgQEAKIAkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfREVGQVVMVF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CiAJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0RFRkFVTFRfSURYXS5kcG1zX29uX2NtX2lkeCA9IDI7CiAJCQkvKiBsb3cgc2ggKi8KLQkJCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19NT0JJTElUWSkgewotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlksIDApOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vbl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWSwgMCk7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfU0hfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vbl9jbV9pZHggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMCk7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfU0hfSURYXS5kcG1zX29uX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMCk7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfU0hfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vbl9jbV9pZHggPSAwOwotCQkJfQorCQkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX01PQklMSVRZKQorCQkJCWlkeCA9IHJhZGVvbl9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlksIDApOworCQkJZWxzZQorCQkJCWlkeCA9IHJhZGVvbl9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFLCAwKTsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfU0hfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vbl9jbV9pZHggPSAwOwogCQkJLyogbWlkIHNoICovCi0JCQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfTU9CSUxJVFkpIHsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZLCAwKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlksIDApOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29mZl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDApOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vbl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDApOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMTsKLQkJCX0KKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vbl9jbV9pZHggPSAxOwogCQkJLyogaGlnaCBzaCAqLwotCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX1NIX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0KLQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDApOwotCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX1NIX0lEWF0uZHBtc19vbl9wc19pZHggPQotCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMCk7CisJCQlpZHggPSByYWRlb25fcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMCk7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfU0hfSURYXS5kcG1zX29mZl9wc19pZHggPSBpZHg7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfU0hfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKIAkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9TSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CiAJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfU0hfSURYXS5kcG1zX29uX2NtX2lkeCA9IDI7CiAJCQkvKiBsb3cgbWggKi8KLQkJCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19NT0JJTElUWSkgewotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlksIDEpOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vbl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWSwgMSk7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfTUhfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vbl9jbV9pZHggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMSk7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfTUhfSURYXS5kcG1zX29uX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMSk7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfTUhfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vbl9jbV9pZHggPSAwOwotCQkJfQorCQkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX01PQklMSVRZKQorCQkJCWlkeCA9IHJhZGVvbl9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlksIDEpOworCQkJZWxzZQorCQkJCWlkeCA9IHJhZGVvbl9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFLCAxKTsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfTUhfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vbl9jbV9pZHggPSAwOwogCQkJLyogbWlkIG1oICovCi0JCQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfTU9CSUxJVFkpIHsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZLCAxKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlksIDEpOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX01IX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfTUhfSURYXS5kcG1zX29mZl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDEpOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX01IX0lEWF0uZHBtc19vbl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDEpOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX01IX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMTsKLQkJCX0KKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX01IX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfTUhfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX01IX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX01IX0lEWF0uZHBtc19vbl9jbV9pZHggPSAxOwogCQkJLyogaGlnaCBtaCAqLwotCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX01IX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0KLQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDEpOwotCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX01IX0lEWF0uZHBtc19vbl9wc19pZHggPQotCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMSk7CisJCQlpZHggPSByYWRlb25fcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMSk7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfTUhfSURYXS5kcG1zX29mZl9wc19pZHggPSBpZHg7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfTUhfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKIAkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9NSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CiAJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfTUhfSURYXS5kcG1zX29uX2NtX2lkeCA9IDI7CiAJCX0KQEAgLTc2MiwxMyArNzA5LDE0IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJkZXYtPmRkZXY7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKIAotCWlmIChBU0lDX0lTX0RDRTMocmRldikpIHsKLQkJdTMyIHRtcCA9IERDX0hQRHhfQ09OTkVDVElPTl9USU1FUigweDljNCkgfCBEQ19IUER4X1JYX0lOVF9USU1FUigweGZhKTsKLQkJaWYgKEFTSUNfSVNfRENFMzIocmRldikpCi0JCQl0bXAgfD0gRENfSFBEeF9FTjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7Ci0JCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgeworCQkJdTMyIHRtcCA9IERDX0hQRHhfQ09OTkVDVElPTl9USU1FUigweDljNCkgfCBEQ19IUER4X1JYX0lOVF9USU1FUigweGZhKTsKKwkJCWlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKQorCQkJCXRtcCB8PSBEQ19IUER4X0VOOworCiAJCQlzd2l0Y2ggKHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQpIHsKIAkJCWNhc2UgUkFERU9OX0hQRF8xOgogCQkJCVdSRUczMihEQ19IUEQxX0NPTlRST0wsIHRtcCk7CkBAIC03OTgsMTAgKzc0Niw3IEBACiAJCQlkZWZhdWx0OgogCQkJCWJyZWFrOwogCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7Ci0JCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJfSBlbHNlIHsKIAkJCXN3aXRjaCAocmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCkgewogCQkJY2FzZSBSQURFT05fSFBEXzE6CiAJCQkJV1JFRzMyKERDX0hPVF9QTFVHX0RFVEVDVDFfQ09OVFJPTCwgRENfSE9UX1BMVUdfREVURUNUeF9FTik7CkBAIC04MTksNiArNzY0LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQorCQlyYWRlb25faHBkX3NldF9wb2xhcml0eShyZGV2LCByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKTsKIAl9CiAJaWYgKHJkZXYtPmlycS5pbnN0YWxsZWQpCiAJCXI2MDBfaXJxX3NldChyZGV2KTsKQEAgLTg5Niw3ICs4NDIsNyBAQAogCS8qIGZsdXNoIGhkcCBjYWNoZSBzbyB1cGRhdGVzIGhpdCB2cmFtICovCiAJaWYgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjc3MCkgJiYgKHJkZXYtPmZhbWlseSA8PSBDSElQX1JWNzQwKSAmJgogCSAgICAhKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkpIHsKLQkJdm9pZCBfX2lvbWVtICpwdHIgPSAodm9pZCAqKXJkZXYtPmdhcnQudGFibGUudnJhbS5wdHI7CisJCXZvaWQgX19pb21lbSAqcHRyID0gKHZvaWQgKilyZGV2LT5nYXJ0LnB0cjsKIAkJdTMyIHRtcDsKIAogCQkvKiByN3h4IGh3IGJ1Zy4gIHdyaXRlIHRvIEhEUF9ERUJVRzEgZm9sbG93ZWQgYnkgZmIgcmVhZApAQCAtOTMxLDcgKzg3Nyw3IEBACiB7CiAJaW50IHI7CiAKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqKSB7CiAJCVdBUk4oMSwgIlI2MDAgUENJRSBHQVJUIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC05NDgsNyArODk0LDcgQEAKIAl1MzIgdG1wOwogCWludCByLCBpOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqID09IE5VTEwpIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKIAkJZGV2X2VycihyZGV2LT5kZXYsICJObyBWUkFNIG9iamVjdCBmb3IgUENJRSBHQVJULlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTk5Myw2ICs5MzksOSBAQAogCQlXUkVHMzIoVk1fQ09OVEVYVDBfQ05UTCArIChpICogNCksIDApOwogCiAJcjYwMF9wY2llX2dhcnRfdGxiX2ZsdXNoKHJkZXYpOworCURSTV9JTkZPKCJQQ0lFIEdBUlQgb2YgJXVNIGVuYWJsZWQgKHRhYmxlIGF0IDB4JTAxNmxsWCkuXG4iLAorCQkgKHVuc2lnbmVkKShyZGV2LT5tYy5ndHRfc2l6ZSA+PiAyMCksCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXJkZXYtPmdhcnQudGFibGVfYWRkcik7CiAJcmRldi0+Z2FydC5yZWFkeSA9IHRydWU7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDAwLDcgKzk0OSw3IEBACiB2b2lkIHI2MDBfcGNpZV9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHRtcDsKLQlpbnQgaSwgcjsKKwlpbnQgaTsKIAogCS8qIERpc2FibGUgYWxsIHRhYmxlcyAqLwogCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCkBAIC0xMDI3LDE0ICs5NzYsNyBAQAogCVdSRUczMihNQ19WTV9MMV9UTEJfTUNCX1dSX1NZU19DTlRMLCB0bXApOwogCVdSRUczMihNQ19WTV9MMV9UTEJfTUNCX1JEX0hEUF9DTlRMLCB0bXApOwogCVdSRUczMihNQ19WTV9MMV9UTEJfTUNCX1dSX0hEUF9DTlRMLCB0bXApOwotCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaikgewotCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmosIGZhbHNlKTsKLQkJaWYgKGxpa2VseShyID09IDApKSB7Ci0JCQlyYWRlb25fYm9fa3VubWFwKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJCXJhZGVvbl9ib191bnBpbihyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJfQotCX0KKwlyYWRlb25fZ2FydF90YWJsZV92cmFtX3VucGluKHJkZXYpOwogfQogCiB2b2lkIHI2MDBfcGNpZV9nYXJ0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC0xMTM0LDcgKzEwNzYsNyBAQAogCQlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0xPV19BRERSLCByZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDEyKTsKIAkJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9ISUdIX0FERFIsIHJkZXYtPm1jLnZyYW1fZW5kID4+IDEyKTsKIAl9Ci0JV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9ERUZBVUxUX0FERFIsIDApOworCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfREVGQVVMVF9BRERSLCByZGV2LT52cmFtX3NjcmF0Y2guZ3B1X2FkZHIgPj4gMTIpOwogCXRtcCA9ICgocmRldi0+bWMudnJhbV9lbmQgPj4gMjQpICYgMHhGRkZGKSA8PCAxNjsKIAl0bXAgfD0gKChyZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDI0KSAmIDB4RkZGRik7CiAJV1JFRzMyKE1DX1ZNX0ZCX0xPQ0FUSU9OLCB0bXApOwpAQCAtMTI3Myw2ICsxMjE1LDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCByNjAwX3ZyYW1fc2NyYXRjaF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCisJaWYgKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqID09IE5VTEwpIHsKKwkJciA9IHJhZGVvbl9ib19jcmVhdGUocmRldiwgUkFERU9OX0dQVV9QQUdFX1NJWkUsCisJCQkJICAgICBQQUdFX1NJWkUsIHRydWUsIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCisJCQkJICAgICAmcmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOworCQlpZiAocikgeworCQkJcmV0dXJuIHI7CisJCX0KKwl9CisKKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+dnJhbV9zY3JhdGNoLnJvYmosIGZhbHNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJcmV0dXJuIHI7CisJciA9IHJhZGVvbl9ib19waW4ocmRldi0+dnJhbV9zY3JhdGNoLnJvYmosCisJCQkgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZyZGV2LT52cmFtX3NjcmF0Y2guZ3B1X2FkZHIpOworCWlmIChyKSB7CisJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOworCQlyZXR1cm4gcjsKKwl9CisJciA9IHJhZGVvbl9ib19rbWFwKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqLAorCQkJCSh2b2lkICoqKSZyZGV2LT52cmFtX3NjcmF0Y2gucHRyKTsKKwlpZiAocikKKwkJcmFkZW9uX2JvX3VucGluKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKKwlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKKworCXJldHVybiByOworfQorCit2b2lkIHI2MDBfdnJhbV9zY3JhdGNoX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHI7CisKKwlpZiAocmRldi0+dnJhbV9zY3JhdGNoLnJvYmogPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT52cmFtX3NjcmF0Y2gucm9iaiwgZmFsc2UpOworCWlmIChsaWtlbHkociA9PSAwKSkgeworCQlyYWRlb25fYm9fa3VubWFwKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKKwkJcmFkZW9uX2JvX3VucGluKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKKwkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7CisJfQorCXJhZGVvbl9ib191bnJlZigmcmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOworfQorCiAvKiBXZSBkb2Vzbid0IGNoZWNrIHRoYXQgdGhlIEdQVSByZWFsbHkgbmVlZHMgYSByZXNldCB3ZSBzaW1wbHkgZG8gdGhlCiAgKiByZXNldCwgaXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGRldGVybWluZSBpZiB0aGUgR1BVIG5lZWRzIG9uZS4gV2UKICAqIG1pZ2h0IGFkZCBhbiBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdC4KQEAgLTIzMjgsNiArMjMxNywxNCBAQAogCWlmIChyZGV2LT53Yi51c2VfZXZlbnQpIHsKIAkJdTY0IGFkZHIgPSByZGV2LT53Yi5ncHVfYWRkciArIFI2MDBfV0JfRVZFTlRfT0ZGU0VUICsKIAkJCSh1NjQpKHJkZXYtPmZlbmNlX2Rydi5zY3JhdGNoX3JlZyAtIHJkZXYtPnNjcmF0Y2gucmVnX2Jhc2UpOworCQkvKiBmbHVzaCByZWFkIGNhY2hlIG92ZXIgZ2FydCAqLworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU1VSRkFDRV9TWU5DLCAzKSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDNfVENfQUNUSU9OX0VOQSB8CisJCQkJCVBBQ0tFVDNfVkNfQUNUSU9OX0VOQSB8CisJCQkJCVBBQ0tFVDNfU0hfQUNUSU9OX0VOQSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDB4RkZGRkZGRkYpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMTApOyAvKiBwb2xsIGludGVydmFsICovCiAJCS8qIEVWRU5UX1dSSVRFX0VPUCAtIGZsdXNoIGNhY2hlcywgc2VuZCBpbnQgKi8KIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX0VWRU5UX1dSSVRFX0VPUCwgNCkpOwogCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBFVkVOVF9UWVBFKENBQ0hFX0ZMVVNIX0FORF9JTlZfRVZFTlRfVFMpIHwgRVZFTlRfSU5ERVgoNSkpOwpAQCAtMjMzNiw2ICsyMzMzLDE0IEBACiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIGZlbmNlLT5zZXEpOwogCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKIAl9IGVsc2UgeworCQkvKiBmbHVzaCByZWFkIGNhY2hlIG92ZXIgZ2FydCAqLworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU1VSRkFDRV9TWU5DLCAzKSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDNfVENfQUNUSU9OX0VOQSB8CisJCQkJCVBBQ0tFVDNfVkNfQUNUSU9OX0VOQSB8CisJCQkJCVBBQ0tFVDNfU0hfQUNUSU9OX0VOQSk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDB4RkZGRkZGRkYpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMTApOyAvKiBwb2xsIGludGVydmFsICovCiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19FVkVOVF9XUklURSwgMCkpOwogCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBFVkVOVF9UWVBFKENBQ0hFX0ZMVVNIX0FORF9JTlZfRVZFTlQpIHwgRVZFTlRfSU5ERVgoMCkpOwogCQkvKiB3YWl0IGZvciAzRCBpZGxlIGNsZWFuICovCkBAIC0yMzYyLDE5ICsyMzY3LDMzIEBACiAKIAltdXRleF9sb2NrKCZyZGV2LT5yNjAwX2JsaXQubXV0ZXgpOwogCXJkZXYtPnI2MDBfYmxpdC52Yl9pYiA9IE5VTEw7Ci0JciA9IHI2MDBfYmxpdF9wcmVwYXJlX2NvcHkocmRldiwgbnVtX2dwdV9wYWdlcyAqIFJBREVPTl9HUFVfUEFHRV9TSVpFKTsKKwlyID0gcjYwMF9ibGl0X3ByZXBhcmVfY29weShyZGV2LCBudW1fZ3B1X3BhZ2VzKTsKIAlpZiAocikgewogCQlpZiAocmRldi0+cjYwMF9ibGl0LnZiX2liKQogCQkJcmFkZW9uX2liX2ZyZWUocmRldiwgJnJkZXYtPnI2MDBfYmxpdC52Yl9pYik7CiAJCW11dGV4X3VubG9jaygmcmRldi0+cjYwMF9ibGl0Lm11dGV4KTsKIAkJcmV0dXJuIHI7CiAJfQotCXI2MDBfa21zX2JsaXRfY29weShyZGV2LCBzcmNfb2Zmc2V0LCBkc3Rfb2Zmc2V0LCBudW1fZ3B1X3BhZ2VzICogUkFERU9OX0dQVV9QQUdFX1NJWkUpOworCXI2MDBfa21zX2JsaXRfY29weShyZGV2LCBzcmNfb2Zmc2V0LCBkc3Rfb2Zmc2V0LCBudW1fZ3B1X3BhZ2VzKTsKIAlyNjAwX2JsaXRfZG9uZV9jb3B5KHJkZXYsIGZlbmNlKTsKIAltdXRleF91bmxvY2soJnJkZXYtPnI2MDBfYmxpdC5tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgcjYwMF9ibGl0X3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IHI7CisKKwkvKiB1bnBpbiBzaGFkZXJzIGJvICovCisJaWYgKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKSB7CisJCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgZmFsc2UpOworCQlpZiAoIXIpIHsKKwkJCXJhZGVvbl9ib191bnBpbihyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CisJCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKKwkJfQorCX0KK30KKwogaW50IHI2MDBfc2V0X3N1cmZhY2VfcmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgcmVnLAogCQkJIHVpbnQzMl90IHRpbGluZ19mbGFncywgdWludDMyX3QgcGl0Y2gsCiAJCQkgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBvYmpfc2l6ZSkKQEAgLTI0MDMsNiArMjQyMiwxMCBAQAogCQl9CiAJfQogCisJciA9IHI2MDBfdnJhbV9zY3JhdGNoX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCiAJcjYwMF9tY19wcm9ncmFtKHJkZXYpOwogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKIAkJcjYwMF9hZ3BfZW5hYmxlKHJkZXYpOwpAQCAtMjQ5NCw4ICsyNTE3LDYgQEAKIAogaW50IHI2MDBfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpbnQgcjsKLQogCXI2MDBfYXVkaW9fZmluaShyZGV2KTsKIAkvKiBGSVhNRTogd2Ugc2hvdWxkIHdhaXQgZm9yIHJpbmcgdG8gYmUgZW1wdHkgKi8KIAlyNjAwX2NwX3N0b3AocmRldik7CkBAIC0yNTAzLDE0ICsyNTI0LDggQEAKIAlyNjAwX2lycV9zdXNwZW5kKHJkZXYpOwogCXJhZGVvbl93Yl9kaXNhYmxlKHJkZXYpOwogCXI2MDBfcGNpZV9nYXJ0X2Rpc2FibGUocmRldik7Ci0JLyogdW5waW4gc2hhZGVycyBibyAqLwotCWlmIChyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaikgewotCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIGZhbHNlKTsKLQkJaWYgKCFyKSB7Ci0JCQlyYWRlb25fYm9fdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwotCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7Ci0JCX0KLQl9CisJcjYwMF9ibGl0X3N1c3BlbmQocmRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjYzMSw2ICsyNjQ2LDcgQEAKIAlyYWRlb25faWJfcG9vbF9maW5pKHJkZXYpOwogCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CiAJcjYwMF9wY2llX2dhcnRfZmluaShyZGV2KTsKKwlyNjAwX3ZyYW1fc2NyYXRjaF9maW5pKHJkZXYpOwogCXJhZGVvbl9hZ3BfZmluaShyZGV2KTsKIAlyYWRlb25fZ2VtX2ZpbmkocmRldik7CiAJcmFkZW9uX2ZlbmNlX2RyaXZlcl9maW5pKHJkZXYpOwpAQCAtMzEzNyw3ICszMTUzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHI2MDBfaXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3N0YXRpYyB2b2lkIHI2MDBfaXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgdG1wOwogCkBAIC0zMjM4LDcgKzMyNTQsNyBAQAogCXI2MDBfZGlzYWJsZV9pbnRlcnJ1cHRfc3RhdGUocmRldik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIHI2MDBfZ2V0X2loX3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitzdGF0aWMgdTMyIHI2MDBfZ2V0X2loX3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHdwdHIsIHRtcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXQuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0LmMKaW5kZXggN2YxMDQzNC4uM2MwMzFhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYmxpdC5jCkBAIC00MSw3ICs0MSw3IEBACiAjZGVmaW5lIENPTE9SXzVfNl81ICAgICAgICAgICAweDgKICNkZWZpbmUgQ09MT1JfOF84XzhfOCAgICAgICAgIDB4MWEKIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogc2V0X3JlbmRlcl90YXJnZXQoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgsIHU2NCBncHVfYWRkcikKIHsKIAl1MzIgY2JfY29sb3JfaW5mbzsKQEAgLTk5LDcgKzk5LDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogY3Bfc2V0X3N1cmZhY2Vfc3luYyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCiAJCSAgICB1MzIgc3luY190eXBlLCB1MzIgc2l6ZSwgdTY0IG1jX2FkZHIpCiB7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogc2V0X3NoYWRlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCQkgICAgUjYwMF9TSF9BQ1RJT05fRU5BLCA1MTIsIGdwdV9hZGRyKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogc2V0X3Z0eF9yZXNvdXJjZShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHU2NCBncHVfYWRkcikKIHsKIAl1aW50MzJfdCBzcV92dHhfY29uc3RhbnRfd29yZDI7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAkJCQkgICAgUjYwMF9WQ19BQ1RJT05fRU5BLCA0OCwgZ3B1X2FkZHIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBzZXRfdGV4X3Jlc291cmNlKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKIAkJIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCwgaW50IHBpdGNoLCB1NjQgZ3B1X2FkZHIpCiB7CkBAIC0yNTgsNyArMjU4LDcgQEAKIAogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBzZXRfc2Npc3NvcnMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpCiB7CiAJUklOR19MT0NBTFM7CkBAIC0yODIsNyArMjgyLDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogZHJhd19hdXRvKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlSSU5HX0xPQ0FMUzsKQEAgLTMxMSw3ICszMTEsNyBAQAogCUNPTU1JVF9SSU5HKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIHNldF9kZWZhdWx0X3N0YXRlKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAlpbnQgaTsKQEAgLTQ4OSw3ICs0ODksNyBAQAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IGkyZih1aW50MzJfdCBpbnB1dCkKK3N0YXRpYyB1aW50MzJfdCBpMmYodWludDMyX3QgaW5wdXQpCiB7CiAJdTMyIHJlc3VsdCwgaSwgZXhwb25lbnQsIGZyYWN0aW9uOwogCkBAIC01MTUsNyArNTE1LDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCByNjAwX25vbW1fZ2V0X3ZiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHI2MDBfbm9tbV9nZXRfdmIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRldl9wcml2LT5ibGl0X3ZiID0gcmFkZW9uX2ZyZWVsaXN0X2dldChkZXYpOwpAQCAtNTI2LDcgKzUyNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByNjAwX25vbW1fcHV0X3ZiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCByNjAwX25vbW1fcHV0X3ZiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNTM0LDcgKzUzNCw3IEBACiAJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgZGV2X3ByaXYtPmJsaXRfdmItPmZpbGVfcHJpdi0+bWFzdGVyLCBkZXZfcHJpdi0+YmxpdF92Yik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqcjYwMF9ub21tX2dldF92Yl9wdHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkICpyNjAwX25vbW1fZ2V0X3ZiX3B0cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJcmV0dXJuICgoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXRfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYmxpdF9rbXMuYwppbmRleCA5YWE3NGMzZi4uZTA5ZDI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXRfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXRfa21zLmMKQEAgLTQyLDYgKzQyLDkgQEAKICNkZWZpbmUgQ09MT1JfNV82XzUgICAgICAgICAgIDB4OAogI2RlZmluZSBDT0xPUl84XzhfOF84ICAgICAgICAgMHgxYQogCisjZGVmaW5lIFJFQ1RfVU5JVF9IICAgICAgICAgICAzMgorI2RlZmluZSBSRUNUX1VOSVRfVyAgICAgICAgICAgKFJBREVPTl9HUFVfUEFHRV9TSVpFIC8gNCAvIFJFQ1RfVU5JVF9IKQorCiAvKiBlbWl0cyAyMSBvbiBydjc3MCssIDIzIG9uIHI2MDAgKi8KIHN0YXRpYyB2b2lkCiBzZXRfcmVuZGVyX3RhcmdldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGZvcm1hdCwKQEAgLTU0LDcgKzU3LDkgQEAKIAlpZiAoaCA8IDgpCiAJCWggPSA4OwogCi0JY2JfY29sb3JfaW5mbyA9ICgoZm9ybWF0IDw8IDIpIHwgKDEgPDwgMjcpIHwgKDEgPDwgOCkpOworCWNiX2NvbG9yX2luZm8gPSBDQl9GT1JNQVQoZm9ybWF0KSB8CisJCUNCX1NPVVJDRV9GT1JNQVQoQ0JfU0ZfRVhQT1JUX05PUk0pIHwKKwkJQ0JfQVJSQVlfTU9ERShBUlJBWV8xRF9USUxFRF9USElOMSk7CiAJcGl0Y2ggPSAodyAvIDgpIC0gMTsKIAlzbGljZSA9ICgodyAqIGgpIC8gNjQpIC0gMTsKIApAQCAtMTY0LDkgKzE2OSwxMCBAQAogewogCXUzMiBzcV92dHhfY29uc3RhbnRfd29yZDI7CiAKLQlzcV92dHhfY29uc3RhbnRfd29yZDIgPSAoKHVwcGVyXzMyX2JpdHMoZ3B1X2FkZHIpICYgMHhmZikgfCAoMTYgPDwgOCkpOworCXNxX3Z0eF9jb25zdGFudF93b3JkMiA9IFNRX1ZUWENfQkFTRV9BRERSX0hJKHVwcGVyXzMyX2JpdHMoZ3B1X2FkZHIpICYgMHhmZikgfAorCQlTUV9WVFhDX1NUUklERSgxNik7CiAjaWZkZWYgX19CSUdfRU5ESUFOCi0Jc3FfdnR4X2NvbnN0YW50X3dvcmQyIHw9ICgyIDw8IDMwKTsKKwlzcV92dHhfY29uc3RhbnRfd29yZDIgfD0gIFNRX1ZUWENfRU5ESUFOX1NXQVAoU1FfRU5ESUFOXzhJTjMyKTsKICNlbmRpZgogCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX1NFVF9SRVNPVVJDRSwgNykpOwpAQCAtMTk1LDI1ICsyMDEsMjkgQEAKIHN0YXRpYyB2b2lkCiBzZXRfdGV4X3Jlc291cmNlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkgaW50IGZvcm1hdCwgaW50IHcsIGludCBoLCBpbnQgcGl0Y2gsCi0JCSB1NjQgZ3B1X2FkZHIpCisJCSB1NjQgZ3B1X2FkZHIsIHUzMiBzaXplKQogewogCXVpbnQzMl90IHNxX3RleF9yZXNvdXJjZV93b3JkMCwgc3FfdGV4X3Jlc291cmNlX3dvcmQxLCBzcV90ZXhfcmVzb3VyY2Vfd29yZDQ7CiAKIAlpZiAoaCA8IDEpCiAJCWggPSAxOwogCi0Jc3FfdGV4X3Jlc291cmNlX3dvcmQwID0gKDEgPDwgMCkgfCAoMSA8PCAzKTsKLQlzcV90ZXhfcmVzb3VyY2Vfd29yZDAgfD0gKCgoKHBpdGNoID4+IDMpIC0gMSkgPDwgOCkgfAotCQkJCSAgKCh3IC0gMSkgPDwgMTkpKTsKKwlzcV90ZXhfcmVzb3VyY2Vfd29yZDAgPSBTXzAzODAwMF9ESU0oVl8wMzgwMDBfU1FfVEVYX0RJTV8yRCkgfAorCQlTXzAzODAwMF9USUxFX01PREUoVl8wMzgwMDBfQVJSQVlfMURfVElMRURfVEhJTjEpOworCXNxX3RleF9yZXNvdXJjZV93b3JkMCB8PSBTXzAzODAwMF9QSVRDSCgocGl0Y2ggPj4gMykgLSAxKSB8CisJCVNfMDM4MDAwX1RFWF9XSURUSCh3IC0gMSk7CiAKLQlzcV90ZXhfcmVzb3VyY2Vfd29yZDEgPSAoZm9ybWF0IDw8IDI2KTsKLQlzcV90ZXhfcmVzb3VyY2Vfd29yZDEgfD0gKChoIC0gMSkgPDwgMCk7CisJc3FfdGV4X3Jlc291cmNlX3dvcmQxID0gU18wMzgwMDRfREFUQV9GT1JNQVQoZm9ybWF0KTsKKwlzcV90ZXhfcmVzb3VyY2Vfd29yZDEgfD0gU18wMzgwMDRfVEVYX0hFSUdIVChoIC0gMSk7CiAKLQlzcV90ZXhfcmVzb3VyY2Vfd29yZDQgPSAoKDEgPDwgMTQpIHwKLQkJCQkgKDAgPDwgMTYpIHwKLQkJCQkgKDEgPDwgMTkpIHwKLQkJCQkgKDIgPDwgMjIpIHwKLQkJCQkgKDMgPDwgMjUpKTsKKwlzcV90ZXhfcmVzb3VyY2Vfd29yZDQgPSBTXzAzODAxMF9SRVFVRVNUX1NJWkUoMSkgfAorCQlTXzAzODAxMF9EU1RfU0VMX1goU1FfU0VMX1gpIHwKKwkJU18wMzgwMTBfRFNUX1NFTF9ZKFNRX1NFTF9ZKSB8CisJCVNfMDM4MDEwX0RTVF9TRUxfWihTUV9TRUxfWikgfAorCQlTXzAzODAxMF9EU1RfU0VMX1coU1FfU0VMX1cpOworCisJY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAorCQkJICAgIFBBQ0tFVDNfVENfQUNUSU9OX0VOQSwgc2l6ZSwgZ3B1X2FkZHIpOwogCiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX1NFVF9SRVNPVVJDRSwgNykpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOwpAQCAtNDUwLDcgKzQ2MCw3IEBACiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgc3Ffc3RhY2tfcmVzb3VyY2VfbWdtdF8yKTsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdCBpMmYodWludDMyX3QgaW5wdXQpCitzdGF0aWMgdWludDMyX3QgaTJmKHVpbnQzMl90IGlucHV0KQogewogCXUzMiByZXN1bHQsIGksIGV4cG9uZW50LCBmcmFjdGlvbjsKIApAQCAtNDgzLDYgKzQ5MywyNyBAQAogCXUzMiBwYWNrZXQyc1sxNl07CiAJaW50IG51bV9wYWNrZXQycyA9IDA7CiAKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfcmVuZGVyX3RhcmdldCA9IHNldF9yZW5kZXJfdGFyZ2V0OworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLmNwX3NldF9zdXJmYWNlX3N5bmMgPSBjcF9zZXRfc3VyZmFjZV9zeW5jOworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF9zaGFkZXJzID0gc2V0X3NoYWRlcnM7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3Z0eF9yZXNvdXJjZSA9IHNldF92dHhfcmVzb3VyY2U7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3RleF9yZXNvdXJjZSA9IHNldF90ZXhfcmVzb3VyY2U7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3NjaXNzb3JzID0gc2V0X3NjaXNzb3JzOworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLmRyYXdfYXV0byA9IGRyYXdfYXV0bzsKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfZGVmYXVsdF9zdGF0ZSA9IHNldF9kZWZhdWx0X3N0YXRlOworCisJcmRldi0+cjYwMF9ibGl0LnJpbmdfc2l6ZV9jb21tb24gPSA0MDsgLyogc2hhZGVycyArIGRlZiBzdGF0ZSAqLworCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfY29tbW9uICs9IDE2OyAvKiBmZW5jZSBlbWl0IGZvciBWQiBJQiAqLworCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfY29tbW9uICs9IDU7IC8qIGRvbmUgY29weSAqLworCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfY29tbW9uICs9IDE2OyAvKiBmZW5jZSBlbWl0IGZvciBkb25lIGNvcHkgKi8KKworCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfcGVyX2xvb3AgPSA3NjsKKwkvKiBzZXRfcmVuZGVyX3RhcmdldCBlbWl0cyAyIGV4dHJhIGR3b3JkcyBvbiBydjZ4eCAqLworCWlmIChyZGV2LT5mYW1pbHkgPiBDSElQX1I2MDAgJiYgcmRldi0+ZmFtaWx5IDwgQ0hJUF9SVjc3MCkKKwkJcmRldi0+cjYwMF9ibGl0LnJpbmdfc2l6ZV9wZXJfbG9vcCArPSAyOworCisJcmRldi0+cjYwMF9ibGl0Lm1heF9kaW0gPSA4MTkyOworCiAJLyogcGluIGNvcHkgc2hhZGVyIGludG8gdnJhbSBpZiBhbHJlYWR5IGluaXRpYWxpemVkICovCiAJaWYgKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKQogCQlnb3RvIGRvbmU7CkBAIC02MDAsNDcgKzYzMSw4MCBAQAogCXJhZGVvbl9pYl9mcmVlKHJkZXYsICZyZGV2LT5yNjAwX2JsaXQudmJfaWIpOwogfQogCi1pbnQgcjYwMF9ibGl0X3ByZXBhcmVfY29weShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHNpemVfYnl0ZXMpCitzdGF0aWMgdW5zaWduZWQgcjYwMF9ibGl0X2NyZWF0ZV9yZWN0KHVuc2lnbmVkIG51bV9ncHVfcGFnZXMsCisJCQkJICAgICAgaW50ICp3aWR0aCwgaW50ICpoZWlnaHQsIGludCBtYXhfZGltKQoreworCXVuc2lnbmVkIG1heF9wYWdlczsKKwl1bnNpZ25lZCBwYWdlcyA9IG51bV9ncHVfcGFnZXM7CisJaW50IHcsIGg7CisKKwlpZiAobnVtX2dwdV9wYWdlcyA9PSAwKSB7CisJCS8qIG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQgd2l0aCBubyBwYWdlcywgYnV0IGp1c3QgaW4gY2FzZSAqLworCQloID0gMDsKKwkJdyA9IDA7CisJCXBhZ2VzID0gMDsKKwkJV0FSTl9PTigxKTsKKwl9IGVsc2UgeworCQlpbnQgcmVjdF9vcmRlciA9IDI7CisJCWggPSBSRUNUX1VOSVRfSDsKKwkJd2hpbGUgKG51bV9ncHVfcGFnZXMgLyByZWN0X29yZGVyKSB7CisJCQloICo9IDI7CisJCQlyZWN0X29yZGVyICo9IDQ7CisJCQlpZiAoaCA+PSBtYXhfZGltKSB7CisJCQkJaCA9IG1heF9kaW07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbWF4X3BhZ2VzID0gKG1heF9kaW0gKiBoKSAvIChSRUNUX1VOSVRfVyAqIFJFQ1RfVU5JVF9IKTsKKwkJaWYgKHBhZ2VzID4gbWF4X3BhZ2VzKQorCQkJcGFnZXMgPSBtYXhfcGFnZXM7CisJCXcgPSAocGFnZXMgKiBSRUNUX1VOSVRfVyAqIFJFQ1RfVU5JVF9IKSAvIGg7CisJCXcgPSAodyAvIFJFQ1RfVU5JVF9XKSAqIFJFQ1RfVU5JVF9XOworCQlwYWdlcyA9ICh3ICogaCkgLyAoUkVDVF9VTklUX1cgKiBSRUNUX1VOSVRfSCk7CisJCUJVR19PTihwYWdlcyA9PSAwKTsKKwl9CisKKworCURSTV9ERUJVRygiYmxpdF9yZWN0YW5nbGU6IGg9JWQsIHc9JWQsIHBhZ2VzPSVkXG4iLCBoLCB3LCBwYWdlcyk7CisKKwkvKiByZXR1cm4gd2lkdGggYW5kIGhlaWdodCBvbmx5IG9mIHRoZSBjYWxsZXIgd2FudHMgaXQgKi8KKwlpZiAoaGVpZ2h0KQorCQkqaGVpZ2h0ID0gaDsKKwlpZiAod2lkdGgpCisJCSp3aWR0aCA9IHc7CisKKwlyZXR1cm4gcGFnZXM7Cit9CisKKworaW50IHI2MDBfYmxpdF9wcmVwYXJlX2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIG51bV9ncHVfcGFnZXMpCiB7CiAJaW50IHI7Ci0JaW50IHJpbmdfc2l6ZSwgbGluZV9zaXplOwotCWludCBtYXhfc2l6ZTsKLQkvKiBsb29wcyBvZiBlbWl0cyA2NCArIGZlbmNlIGVtaXQgcG9zc2libGUgKi8KLQlpbnQgZHdvcmRzX3Blcl9sb29wID0gNzYsIG51bV9sb29wczsKKwlpbnQgcmluZ19zaXplOworCWludCBudW1fbG9vcHMgPSAwOworCWludCBkd29yZHNfcGVyX2xvb3AgPSByZGV2LT5yNjAwX2JsaXQucmluZ19zaXplX3Blcl9sb29wOwogCiAJciA9IHI2MDBfdmJfaWJfZ2V0KHJkZXYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCS8qIHNldF9yZW5kZXJfdGFyZ2V0IGVtaXRzIDIgZXh0cmEgZHdvcmRzIG9uIHJ2Nnh4ICovCi0JaWYgKHJkZXYtPmZhbWlseSA+IENISVBfUjYwMCAmJiByZGV2LT5mYW1pbHkgPCBDSElQX1JWNzcwKQotCQlkd29yZHNfcGVyX2xvb3AgKz0gMjsKKwkvKiBudW0gbG9vcHMgKi8KKwl3aGlsZSAobnVtX2dwdV9wYWdlcykgeworCQludW1fZ3B1X3BhZ2VzIC09CisJCQlyNjAwX2JsaXRfY3JlYXRlX3JlY3QobnVtX2dwdV9wYWdlcywgTlVMTCwgTlVMTCwKKwkJCQkJICAgICAgcmRldi0+cjYwMF9ibGl0Lm1heF9kaW0pOworCQludW1fbG9vcHMrKzsKKwl9CiAKLQkvKiA4IGJwcCB2cyAzMiBicHAgZm9yIHhmZXIgdW5pdCAqLwotCWlmIChzaXplX2J5dGVzICYgMykKLQkJbGluZV9zaXplID0gODE5MjsKLQllbHNlCi0JCWxpbmVfc2l6ZSA9IDgxOTIqNDsKLQotCW1heF9zaXplID0gODE5MiAqIGxpbmVfc2l6ZTsKLQotCS8qIG1ham9yIGxvb3BzIGNvdmVyIHRoZSBtYXggc2l6ZSB0cmFuc2ZlciAqLwotCW51bV9sb29wcyA9ICgoc2l6ZV9ieXRlcyArIG1heF9zaXplKSAvIG1heF9zaXplKTsKLQkvKiBtaW5vciBsb29wcyBjb3ZlciB0aGUgZXh0cmEgbm9uIGFsaWduZWQgYml0cyAqLwotCW51bV9sb29wcyArPSAoKHNpemVfYnl0ZXMgJSBsaW5lX3NpemUpID8gMSA6IDApOwogCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbG9vcHMgY29ycmVjdGx5ICovCiAJcmluZ19zaXplID0gbnVtX2xvb3BzICogZHdvcmRzX3Blcl9sb29wOwotCS8qIHNldCBkZWZhdWx0ICArIHNoYWRlcnMgKi8KLQlyaW5nX3NpemUgKz0gNDA7IC8qIHNoYWRlcnMgKyBkZWYgc3RhdGUgKi8KLQlyaW5nX3NpemUgKz0gMTA7IC8qIGZlbmNlIGVtaXQgZm9yIFZCIElCICovCi0JcmluZ19zaXplICs9IDU7IC8qIGRvbmUgY29weSAqLwotCXJpbmdfc2l6ZSArPSAxMDsgLyogZmVuY2UgZW1pdCBmb3IgZG9uZSBjb3B5ICovCisJcmluZ19zaXplICs9IHJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfY29tbW9uOwogCXIgPSByYWRlb25fcmluZ19sb2NrKHJkZXYsIHJpbmdfc2l6ZSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0Jc2V0X2RlZmF1bHRfc3RhdGUocmRldik7IC8qIDE0ICovCi0Jc2V0X3NoYWRlcnMocmRldik7IC8qIDI2ICovCisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X2RlZmF1bHRfc3RhdGUocmRldik7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3NoYWRlcnMocmRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY1OSwxODIgKzcyMyw2MSBAQAogCiB2b2lkIHI2MDBfa21zX2JsaXRfY29weShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJCXU2NCBzcmNfZ3B1X2FkZHIsIHU2NCBkc3RfZ3B1X2FkZHIsCi0JCQlpbnQgc2l6ZV9ieXRlcykKKwkJCXVuc2lnbmVkIG51bV9ncHVfcGFnZXMpCiB7Ci0JaW50IG1heF9ieXRlczsKIAl1NjQgdmJfZ3B1X2FkZHI7CiAJdTMyICp2YjsKIAotCURSTV9ERUJVRygiZW1pdHRpbmcgY29weSAlMTZsbHggJTE2bGx4ICVkICVkXG4iLCBzcmNfZ3B1X2FkZHIsIGRzdF9ncHVfYWRkciwKLQkJICBzaXplX2J5dGVzLCByZGV2LT5yNjAwX2JsaXQudmJfdXNlZCk7CisJRFJNX0RFQlVHKCJlbWl0dGluZyBjb3B5ICUxNmxseCAlMTZsbHggJWQgJWRcbiIsCisJCSAgc3JjX2dwdV9hZGRyLCBkc3RfZ3B1X2FkZHIsCisJCSAgbnVtX2dwdV9wYWdlcywgcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQpOwogCXZiID0gKHUzMiAqKShyZGV2LT5yNjAwX2JsaXQudmJfaWItPnB0ciArIHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkKTsKLQlpZiAoKHNpemVfYnl0ZXMgJiAzKSB8fCAoc3JjX2dwdV9hZGRyICYgMykgfHwgKGRzdF9ncHVfYWRkciAmIDMpKSB7Ci0JCW1heF9ieXRlcyA9IDgxOTI7CiAKLQkJd2hpbGUgKHNpemVfYnl0ZXMpIHsKLQkJCWludCBjdXJfc2l6ZSA9IHNpemVfYnl0ZXM7Ci0JCQlpbnQgc3JjX3ggPSBzcmNfZ3B1X2FkZHIgJiAyNTU7Ci0JCQlpbnQgZHN0X3ggPSBkc3RfZ3B1X2FkZHIgJiAyNTU7Ci0JCQlpbnQgaCA9IDE7Ci0JCQlzcmNfZ3B1X2FkZHIgPSBzcmNfZ3B1X2FkZHIgJiB+MjU1VUxMOwotCQkJZHN0X2dwdV9hZGRyID0gZHN0X2dwdV9hZGRyICYgfjI1NVVMTDsKKwl3aGlsZSAobnVtX2dwdV9wYWdlcykgeworCQlpbnQgdywgaDsKKwkJdW5zaWduZWQgc2l6ZV9pbl9ieXRlczsKKwkJdW5zaWduZWQgcGFnZXNfcGVyX2xvb3AgPQorCQkJcjYwMF9ibGl0X2NyZWF0ZV9yZWN0KG51bV9ncHVfcGFnZXMsICZ3LCAmaCwKKwkJCQkJICAgICAgcmRldi0+cjYwMF9ibGl0Lm1heF9kaW0pOwogCi0JCQlpZiAoIXNyY194ICYmICFkc3RfeCkgewotCQkJCWggPSAoY3VyX3NpemUgLyBtYXhfYnl0ZXMpOwotCQkJCWlmIChoID4gODE5MikKLQkJCQkJaCA9IDgxOTI7Ci0JCQkJaWYgKGggPT0gMCkKLQkJCQkJaCA9IDE7Ci0JCQkJZWxzZQotCQkJCQljdXJfc2l6ZSA9IG1heF9ieXRlczsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGN1cl9zaXplID4gbWF4X2J5dGVzKQotCQkJCQljdXJfc2l6ZSA9IG1heF9ieXRlczsKLQkJCQlpZiAoY3VyX3NpemUgPiAobWF4X2J5dGVzIC0gZHN0X3gpKQotCQkJCQljdXJfc2l6ZSA9IChtYXhfYnl0ZXMgLSBkc3RfeCk7Ci0JCQkJaWYgKGN1cl9zaXplID4gKG1heF9ieXRlcyAtIHNyY194KSkKLQkJCQkJY3VyX3NpemUgPSAobWF4X2J5dGVzIC0gc3JjX3gpOwotCQkJfQorCQlzaXplX2luX2J5dGVzID0gcGFnZXNfcGVyX2xvb3AgKiBSQURFT05fR1BVX1BBR0VfU0laRTsKKwkJRFJNX0RFQlVHKCJyZWN0YW5nbGUgdz0lZCBoPSVkXG4iLCB3LCBoKTsKIAotCQkJaWYgKChyZGV2LT5yNjAwX2JsaXQudmJfdXNlZCArIDQ4KSA+IHJkZXYtPnI2MDBfYmxpdC52Yl90b3RhbCkgewotCQkJCVdBUk5fT04oMSk7Ci0JCQl9Ci0KLQkJCXZiWzBdID0gaTJmKGRzdF94KTsKLQkJCXZiWzFdID0gMDsKLQkJCXZiWzJdID0gaTJmKHNyY194KTsKLQkJCXZiWzNdID0gMDsKLQotCQkJdmJbNF0gPSBpMmYoZHN0X3gpOwotCQkJdmJbNV0gPSBpMmYoaCk7Ci0JCQl2Yls2XSA9IGkyZihzcmNfeCk7Ci0JCQl2Yls3XSA9IGkyZihoKTsKLQotCQkJdmJbOF0gPSBpMmYoZHN0X3ggKyBjdXJfc2l6ZSk7Ci0JCQl2Yls5XSA9IGkyZihoKTsKLQkJCXZiWzEwXSA9IGkyZihzcmNfeCArIGN1cl9zaXplKTsKLQkJCXZiWzExXSA9IGkyZihoKTsKLQotCQkJLyogc3JjIDkgKi8KLQkJCXNldF90ZXhfcmVzb3VyY2UocmRldiwgRk1UXzgsCi0JCQkJCSBzcmNfeCArIGN1cl9zaXplLCBoLCBzcmNfeCArIGN1cl9zaXplLAotCQkJCQkgc3JjX2dwdV9hZGRyKTsKLQotCQkJLyogNSAqLwotCQkJY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAotCQkJCQkgICAgUEFDS0VUM19UQ19BQ1RJT05fRU5BLCAoc3JjX3ggKyBjdXJfc2l6ZSAqIGgpLCBzcmNfZ3B1X2FkZHIpOwotCi0JCQkvKiBkc3QgMjMgKi8KLQkJCXNldF9yZW5kZXJfdGFyZ2V0KHJkZXYsIENPTE9SXzgsCi0JCQkJCSAgZHN0X3ggKyBjdXJfc2l6ZSwgaCwKLQkJCQkJICBkc3RfZ3B1X2FkZHIpOwotCi0JCQkvKiBzY2lzc29ycyAxMiAqLwotCQkJc2V0X3NjaXNzb3JzKHJkZXYsIGRzdF94LCAwLCBkc3RfeCArIGN1cl9zaXplLCBoKTsKLQotCQkJLyogMTQgKi8KLQkJCXZiX2dwdV9hZGRyID0gcmRldi0+cjYwMF9ibGl0LnZiX2liLT5ncHVfYWRkciArIHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkOwotCQkJc2V0X3Z0eF9yZXNvdXJjZShyZGV2LCB2Yl9ncHVfYWRkcik7Ci0KLQkJCS8qIGRyYXcgMTAgKi8KLQkJCWRyYXdfYXV0byhyZGV2KTsKLQotCQkJLyogNSAqLwotCQkJY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAotCQkJCQkgICAgUEFDS0VUM19DQl9BQ1RJT05fRU5BIHwgUEFDS0VUM19DQjBfREVTVF9CQVNFX0VOQSwKLQkJCQkJICAgIGN1cl9zaXplICogaCwgZHN0X2dwdV9hZGRyKTsKLQotCQkJdmIgKz0gMTI7Ci0JCQlyZGV2LT5yNjAwX2JsaXQudmJfdXNlZCArPSAxMiAqIDQ7Ci0KLQkJCXNyY19ncHVfYWRkciArPSBjdXJfc2l6ZSAqIGg7Ci0JCQlkc3RfZ3B1X2FkZHIgKz0gY3VyX3NpemUgKiBoOwotCQkJc2l6ZV9ieXRlcyAtPSBjdXJfc2l6ZSAqIGg7CisJCWlmICgocmRldi0+cjYwMF9ibGl0LnZiX3VzZWQgKyA0OCkgPiByZGV2LT5yNjAwX2JsaXQudmJfdG90YWwpIHsKKwkJCVdBUk5fT04oMSk7CiAJCX0KLQl9IGVsc2UgewotCQltYXhfYnl0ZXMgPSA4MTkyICogNDsKIAotCQl3aGlsZSAoc2l6ZV9ieXRlcykgewotCQkJaW50IGN1cl9zaXplID0gc2l6ZV9ieXRlczsKLQkJCWludCBzcmNfeCA9IChzcmNfZ3B1X2FkZHIgJiAyNTUpOwotCQkJaW50IGRzdF94ID0gKGRzdF9ncHVfYWRkciAmIDI1NSk7Ci0JCQlpbnQgaCA9IDE7Ci0JCQlzcmNfZ3B1X2FkZHIgPSBzcmNfZ3B1X2FkZHIgJiB+MjU1VUxMOwotCQkJZHN0X2dwdV9hZGRyID0gZHN0X2dwdV9hZGRyICYgfjI1NVVMTDsKKwkJdmJbMF0gPSAwOworCQl2YlsxXSA9IDA7CisJCXZiWzJdID0gMDsKKwkJdmJbM10gPSAwOwogCi0JCQlpZiAoIXNyY194ICYmICFkc3RfeCkgewotCQkJCWggPSAoY3VyX3NpemUgLyBtYXhfYnl0ZXMpOwotCQkJCWlmIChoID4gODE5MikKLQkJCQkJaCA9IDgxOTI7Ci0JCQkJaWYgKGggPT0gMCkKLQkJCQkJaCA9IDE7Ci0JCQkJZWxzZQotCQkJCQljdXJfc2l6ZSA9IG1heF9ieXRlczsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGN1cl9zaXplID4gbWF4X2J5dGVzKQotCQkJCQljdXJfc2l6ZSA9IG1heF9ieXRlczsKLQkJCQlpZiAoY3VyX3NpemUgPiAobWF4X2J5dGVzIC0gZHN0X3gpKQotCQkJCQljdXJfc2l6ZSA9IChtYXhfYnl0ZXMgLSBkc3RfeCk7Ci0JCQkJaWYgKGN1cl9zaXplID4gKG1heF9ieXRlcyAtIHNyY194KSkKLQkJCQkJY3VyX3NpemUgPSAobWF4X2J5dGVzIC0gc3JjX3gpOwotCQkJfQorCQl2Yls0XSA9IDA7CisJCXZiWzVdID0gaTJmKGgpOworCQl2Yls2XSA9IDA7CisJCXZiWzddID0gaTJmKGgpOwogCi0JCQlpZiAoKHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkICsgNDgpID4gcmRldi0+cjYwMF9ibGl0LnZiX3RvdGFsKSB7Ci0JCQkJV0FSTl9PTigxKTsKLQkJCX0KKwkJdmJbOF0gPSBpMmYodyk7CisJCXZiWzldID0gaTJmKGgpOworCQl2YlsxMF0gPSBpMmYodyk7CisJCXZiWzExXSA9IGkyZihoKTsKIAotCQkJdmJbMF0gPSBpMmYoZHN0X3ggLyA0KTsKLQkJCXZiWzFdID0gMDsKLQkJCXZiWzJdID0gaTJmKHNyY194IC8gNCk7Ci0JCQl2YlszXSA9IDA7CisJCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF90ZXhfcmVzb3VyY2UocmRldiwgRk1UXzhfOF84XzgsCisJCQkJCQkJICAgIHcsIGgsIHcsIHNyY19ncHVfYWRkciwgc2l6ZV9pbl9ieXRlcyk7CisJCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF9yZW5kZXJfdGFyZ2V0KHJkZXYsIENPTE9SXzhfOF84XzgsCisJCQkJCQkJICAgICB3LCBoLCBkc3RfZ3B1X2FkZHIpOworCQlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfc2Npc3NvcnMocmRldiwgMCwgMCwgdywgaCk7CisJCXZiX2dwdV9hZGRyID0gcmRldi0+cjYwMF9ibGl0LnZiX2liLT5ncHVfYWRkciArIHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkOworCQlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfdnR4X3Jlc291cmNlKHJkZXYsIHZiX2dwdV9hZGRyKTsKKwkJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuZHJhd19hdXRvKHJkZXYpOworCQlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5jcF9zZXRfc3VyZmFjZV9zeW5jKHJkZXYsCisJCQkJICAgIFBBQ0tFVDNfQ0JfQUNUSU9OX0VOQSB8IFBBQ0tFVDNfQ0IwX0RFU1RfQkFTRV9FTkEsCisJCQkJICAgIHNpemVfaW5fYnl0ZXMsIGRzdF9ncHVfYWRkcik7CiAKLQkJCXZiWzRdID0gaTJmKGRzdF94IC8gNCk7Ci0JCQl2Yls1XSA9IGkyZihoKTsKLQkJCXZiWzZdID0gaTJmKHNyY194IC8gNCk7Ci0JCQl2Yls3XSA9IGkyZihoKTsKLQotCQkJdmJbOF0gPSBpMmYoKGRzdF94ICsgY3VyX3NpemUpIC8gNCk7Ci0JCQl2Yls5XSA9IGkyZihoKTsKLQkJCXZiWzEwXSA9IGkyZigoc3JjX3ggKyBjdXJfc2l6ZSkgLyA0KTsKLQkJCXZiWzExXSA9IGkyZihoKTsKLQotCQkJLyogc3JjIDkgKi8KLQkJCXNldF90ZXhfcmVzb3VyY2UocmRldiwgRk1UXzhfOF84XzgsCi0JCQkJCSAoc3JjX3ggKyBjdXJfc2l6ZSkgLyA0LAotCQkJCQkgaCwgKHNyY194ICsgY3VyX3NpemUpIC8gNCwKLQkJCQkJIHNyY19ncHVfYWRkcik7Ci0JCQkvKiA1ICovCi0JCQljcF9zZXRfc3VyZmFjZV9zeW5jKHJkZXYsCi0JCQkJCSAgICBQQUNLRVQzX1RDX0FDVElPTl9FTkEsIChzcmNfeCArIGN1cl9zaXplICogaCksIHNyY19ncHVfYWRkcik7Ci0KLQkJCS8qIGRzdCAyMyAqLwotCQkJc2V0X3JlbmRlcl90YXJnZXQocmRldiwgQ09MT1JfOF84XzhfOCwKLQkJCQkJICAoZHN0X3ggKyBjdXJfc2l6ZSkgLyA0LCBoLAotCQkJCQkgIGRzdF9ncHVfYWRkcik7Ci0KLQkJCS8qIHNjaXNzb3JzIDEyICAqLwotCQkJc2V0X3NjaXNzb3JzKHJkZXYsIChkc3RfeCAvIDQpLCAwLCAoZHN0X3ggKyBjdXJfc2l6ZSAvIDQpLCBoKTsKLQotCQkJLyogVmVydGV4IGJ1ZmZlciBzZXR1cCAxNCAqLwotCQkJdmJfZ3B1X2FkZHIgPSByZGV2LT5yNjAwX2JsaXQudmJfaWItPmdwdV9hZGRyICsgcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQ7Ci0JCQlzZXRfdnR4X3Jlc291cmNlKHJkZXYsIHZiX2dwdV9hZGRyKTsKLQotCQkJLyogZHJhdyAxMCAqLwotCQkJZHJhd19hdXRvKHJkZXYpOwotCi0JCQkvKiA1ICovCi0JCQljcF9zZXRfc3VyZmFjZV9zeW5jKHJkZXYsCi0JCQkJCSAgICBQQUNLRVQzX0NCX0FDVElPTl9FTkEgfCBQQUNLRVQzX0NCMF9ERVNUX0JBU0VfRU5BLAotCQkJCQkgICAgY3VyX3NpemUgKiBoLCBkc3RfZ3B1X2FkZHIpOwotCi0JCQkvKiA3OCByaW5nIGR3b3JkcyBwZXIgbG9vcCAqLwotCQkJdmIgKz0gMTI7Ci0JCQlyZGV2LT5yNjAwX2JsaXQudmJfdXNlZCArPSAxMiAqIDQ7Ci0KLQkJCXNyY19ncHVfYWRkciArPSBjdXJfc2l6ZSAqIGg7Ci0JCQlkc3RfZ3B1X2FkZHIgKz0gY3VyX3NpemUgKiBoOwotCQkJc2l6ZV9ieXRlcyAtPSBjdXJfc2l6ZSAqIGg7Ci0JCX0KKwkJdmIgKz0gMTI7CisJCXJkZXYtPnI2MDBfYmxpdC52Yl91c2VkICs9IDQqMTI7CisJCXNyY19ncHVfYWRkciArPSBzaXplX2luX2J5dGVzOworCQlkc3RfZ3B1X2FkZHIgKz0gc2l6ZV9pbl9ieXRlczsKKwkJbnVtX2dwdV9wYWdlcyAtPSBwYWdlc19wZXJfbG9vcDsKIAl9CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NwLmMKaW5kZXggNDVmZDU5Mi4uYzlkYjQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NwLmMKQEAgLTI2LDYgKzI2LDggQEAKICAqICAgICBBbGV4IERldWNoZXIgPGFsZXhhbmRlci5kZXVjaGVyQGFtZC5jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgInJhZGVvbl9kcm0uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKaW5kZXggY2Y4M2FhMC4uMGEyZTAyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2NzLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCVtWXzAzODAwNF9GTVRfMzJfQVNfMzJfMzJfMzJfMzJdID0geyAxLCAxLCA0LCAwLCBDSElQX0NFREFSfSwKIH07CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBmbXRfaXNfdmFsaWRfY29sb3IodTMyIGZvcm1hdCkKK3N0YXRpYyBib29sIGZtdF9pc192YWxpZF9jb2xvcih1MzIgZm9ybWF0KQogewogCWlmIChmb3JtYXQgPj0gQVJSQVlfU0laRShjb2xvcl9mb3JtYXRzX3RhYmxlKSkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTczLDcgKzE3Myw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgZm10X2lzX3ZhbGlkX3RleHR1cmUodTMyIGZvcm1hdCwgZW51bSByYWRlb25fZmFtaWx5IGZhbWlseSkKK3N0YXRpYyBib29sIGZtdF9pc192YWxpZF90ZXh0dXJlKHUzMiBmb3JtYXQsIGVudW0gcmFkZW9uX2ZhbWlseSBmYW1pbHkpCiB7CiAJaWYgKGZvcm1hdCA+PSBBUlJBWV9TSVpFKGNvbG9yX2Zvcm1hdHNfdGFibGUpKQogCQlyZXR1cm4gZmFsc2U7CkBAIC0xODcsNyArMTg3LDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZtdF9nZXRfYmxvY2tzaXplKHUzMiBmb3JtYXQpCitzdGF0aWMgaW50IGZtdF9nZXRfYmxvY2tzaXplKHUzMiBmb3JtYXQpCiB7CiAJaWYgKGZvcm1hdCA+PSBBUlJBWV9TSVpFKGNvbG9yX2Zvcm1hdHNfdGFibGUpKQogCQlyZXR1cm4gMDsKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiBjb2xvcl9mb3JtYXRzX3RhYmxlW2Zvcm1hdF0uYmxvY2tzaXplOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmbXRfZ2V0X25ibG9ja3N4KHUzMiBmb3JtYXQsIHUzMiB3KQorc3RhdGljIGludCBmbXRfZ2V0X25ibG9ja3N4KHUzMiBmb3JtYXQsIHUzMiB3KQogewogCXVuc2lnbmVkIGJ3OwogCkBAIC0yMDksNyArMjA5LDcgQEAKIAlyZXR1cm4gKHcgKyBidyAtIDEpIC8gYnc7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZtdF9nZXRfbmJsb2Nrc3kodTMyIGZvcm1hdCwgdTMyIGgpCitzdGF0aWMgaW50IGZtdF9nZXRfbmJsb2Nrc3kodTMyIGZvcm1hdCwgdTMyIGgpCiB7CiAJdW5zaWduZWQgYmg7CiAKQEAgLTIyMywyNSArMjIzLDYgQEAKIAlyZXR1cm4gKGggKyBiaCAtIDEpIC8gYmg7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHI2MDBfYnBlX2Zyb21fZm9ybWF0KHUzMiAqYnBlLCB1MzIgZm9ybWF0KQotewotIAl1bnNpZ25lZCByZXM7Ci0KLQlpZiAoZm9ybWF0ID49IEFSUkFZX1NJWkUoY29sb3JfZm9ybWF0c190YWJsZSkpCi0JCWdvdG8gZmFpbDsKLQotCXJlcyA9IGNvbG9yX2Zvcm1hdHNfdGFibGVbZm9ybWF0XS5ibG9ja3NpemU7Ci0JaWYgKHJlcyA9PSAwKQotCQlnb3RvIGZhaWw7Ci0KLQkqYnBlID0gcmVzOwotCXJldHVybiAwOwotCi1mYWlsOgotCSpicGUgPSAxNjsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQogc3RydWN0IGFycmF5X21vZGVfY2hlY2tlciB7CiAJaW50IGFycmF5X21vZGU7CiAJdTMyIGdyb3VwX3NpemU7CkBAIC0yNTIsNyArMjMzLDcgQEAKIH07CiAKIC8qIHJldHVybnMgYWxpZ25tZW50IGluIHBpeGVscyBmb3IgcGl0Y2gvaGVpZ2h0L2RlcHRoIGFuZCBieXRlcyBmb3IgYmFzZSAqLwotc3RhdGljIGlubGluZSBpbnQgcjYwMF9nZXRfYXJyYXlfbW9kZV9hbGlnbm1lbnQoc3RydWN0IGFycmF5X21vZGVfY2hlY2tlciAqdmFsdWVzLAorc3RhdGljIGludCByNjAwX2dldF9hcnJheV9tb2RlX2FsaWdubWVudChzdHJ1Y3QgYXJyYXlfbW9kZV9jaGVja2VyICp2YWx1ZXMsCiAJCQkJCQl1MzIgKnBpdGNoX2FsaWduLAogCQkJCQkJdTMyICpoZWlnaHRfYWxpZ24sCiAJCQkJCQl1MzIgKmRlcHRoX2FsaWduLApAQCAtMzMxLDcgKzMxMiw3IEBACiAJdHJhY2stPmRiX2RlcHRoX2NvbnRyb2wgPSAweEZGRkZGRkZGOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByNjAwX2NzX3RyYWNrX3ZhbGlkYXRlX2NiKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCBpbnQgaSkKK3N0YXRpYyBpbnQgcjYwMF9jc190cmFja192YWxpZGF0ZV9jYihzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgaW50IGkpCiB7CiAJc3RydWN0IHI2MDBfY3NfdHJhY2sgKnRyYWNrID0gcC0+dHJhY2s7CiAJdTMyIHNsaWNlX3RpbGVfbWF4LCBzaXplLCB0bXA7CkBAIC03MzcsNyArNzE4LDcgQEAKICAqIENoZWNrIG5leHQgcGFja2V0IGlzIHJlbG9jYXRpb24gcGFja2V0MywgZG8gYm8gdmFsaWRhdGlvbiBhbmQgY29tcHV0ZQogICogR1BVIG9mZnNldCB1c2luZyB0aGUgcHJvdmlkZWQgc3RhcnQuCiAgKiovCi1zdGF0aWMgaW5saW5lIGludCByNjAwX2NzX3BhY2tldF9uZXh0X2lzX3BrdDNfbm9wKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwKQorc3RhdGljIGludCByNjAwX2NzX3BhY2tldF9uZXh0X2lzX3BrdDNfbm9wKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwKQogewogCXN0cnVjdCByYWRlb25fY3NfcGFja2V0IHAzcmVsb2M7CiAJaW50IHI7CkBAIC05MTEsNyArODkyLDcgQEAKICAqIGlmIHJlZ2lzdGVyIGlzIHNhZmUuIElmIHJlZ2lzdGVyIGlzIG5vdCBmbGFnIGFzIHNhZmUgdGhpcyBmdW5jdGlvbgogICogd2lsbCB0ZXN0IGl0IGFnYWluc3QgYSBsaXN0IG9mIHJlZ2lzdGVyIG5lZWRpbmQgc3BlY2lhbCBoYW5kbGluZy4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcjYwMF9jc19jaGVja19yZWcoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIHUzMiByZWcsIHUzMiBpZHgpCitzdGF0aWMgaW50IHI2MDBfY3NfY2hlY2tfcmVnKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCB1MzIgcmVnLCB1MzIgaWR4KQogewogCXN0cnVjdCByNjAwX2NzX3RyYWNrICp0cmFjayA9IChzdHJ1Y3QgcjYwMF9jc190cmFjayAqKXAtPnRyYWNrOwogCXN0cnVjdCByYWRlb25fY3NfcmVsb2MgKnJlbG9jOwpAQCAtMTIxNSw3ICsxMTk2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBtaXBfbWluaWZ5KHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGxldmVsKQorc3RhdGljIHVuc2lnbmVkIG1pcF9taW5pZnkodW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgbGV2ZWwpCiB7CiAJdW5zaWduZWQgdmFsOwogCkBAIC0xMjg1LDcgKzEyNjYsNyBAQAogICogVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIHRoYXQgdGhlIHJlc291cmNlIGhhcyB2YWxpZCBmaWVsZCBhbmQgdGhhdAogICogdGhlIHRleHR1cmUgYW5kIG1pcG1hcCBibyBvYmplY3QgYXJlIGJpZyBlbm91Z2ggdG8gY292ZXIgdGhpcyByZXNvdXJjZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcjYwMF9jaGVja190ZXh0dXJlX3Jlc291cmNlKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCAgdTMyIGlkeCwKK3N0YXRpYyBpbnQgcjYwMF9jaGVja190ZXh0dXJlX3Jlc291cmNlKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCAgdTMyIGlkeCwKIAkJCQkJICAgICAgc3RydWN0IHJhZGVvbl9ibyAqdGV4dHVyZSwKIAkJCQkJICAgICAgc3RydWN0IHJhZGVvbl9ibyAqbWlwbWFwLAogCQkJCQkgICAgICB1NjQgYmFzZV9vZmZzZXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKaW5kZXggMDI0NWFlNi4uYmZlMWI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaApAQCAtNzksNiArNzksMTEgQEAKICNkZWZpbmUgQ0JfQ09MT1IwX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODA2MAogI2RlZmluZSBDQl9DT0xPUjBfVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4MDgwCiAjZGVmaW5lIENCX0NPTE9SMF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjgwYTAKKyMJZGVmaW5lIENCX0ZPUk1BVCh4KQkJCQkoKHgpIDw8IDIpCisjICAgICAgIGRlZmluZSBDQl9BUlJBWV9NT0RFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgOCkKKyMJZGVmaW5lIENCX1NPVVJDRV9GT1JNQVQoeCkJCQkoKHgpIDw8IDI3KQorIwlkZWZpbmUgQ0JfU0ZfRVhQT1JUX0ZVTEwJCQkwCisjCWRlZmluZSBDQl9TRl9FWFBPUlRfTk9STQkJCTEKICNkZWZpbmUgQ0JfQ09MT1IwX1RJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODBjMAogI2RlZmluZSBDQl9DT0xPUjBfRlJBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4MGUwCiAjZGVmaW5lIENCX0NPTE9SMF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjgxMDAKQEAgLTQxNyw2ICs0MjIsMTcgQEAKICNkZWZpbmUJU1FfUEdNX1NUQVJUX1ZTCQkJCQkweDI4ODU4CiAjZGVmaW5lIFNRX1BHTV9SRVNPVVJDRVNfVlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Mjg4NjgKICNkZWZpbmUgU1FfUEdNX0NGX09GRlNFVF9WUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODhkMAorCisjZGVmaW5lIFNRX1ZUWF9DT05TVEFOVF9XT1JEMF8wCQkJCTB4MzAwMDAKKyNkZWZpbmUgU1FfVlRYX0NPTlNUQU5UX1dPUkQxXzAJCQkJMHgzMDAwNAorI2RlZmluZSBTUV9WVFhfQ09OU1RBTlRfV09SRDJfMAkJCQkweDMwMDA4CisjCWRlZmluZSBTUV9WVFhDX0JBU0VfQUREUl9ISSh4KQkJCSgoeCkgPDwgMCkKKyMJZGVmaW5lIFNRX1ZUWENfU1RSSURFKHgpCQkJKCh4KSA8PCA4KQorIwlkZWZpbmUgU1FfVlRYQ19FTkRJQU5fU1dBUCh4KQkJCSgoeCkgPDwgMzApCisjCWRlZmluZSBTUV9FTkRJQU5fTk9ORQkJCQkwCisjCWRlZmluZSBTUV9FTkRJQU5fOElOMTYJCQkJMQorIwlkZWZpbmUgU1FfRU5ESUFOXzhJTjMyCQkJCTIKKyNkZWZpbmUgU1FfVlRYX0NPTlNUQU5UX1dPUkQzXzAJCQkJMHgzMDAwYwogI2RlZmluZQlTUV9WVFhfQ09OU1RBTlRfV09SRDZfMAkJCQkweDM4MDE4CiAjZGVmaW5lCQlTX19TUV9WVFhfQ09OU1RBTlRfVFlQRSh4KQkJCSgoKHgpICYgMykgPDwgMzApCiAjZGVmaW5lCQlHX19TUV9WVFhfQ09OU1RBTlRfVFlQRSh4KQkJCSgoKHgpID4+IDMwKSAmIDMpCkBAIC0xMzUyLDYgKzEzNjgsMTIgQEAKICNkZWZpbmUgICBTXzAzODAxMF9EU1RfU0VMX1coeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4NykgPDwgMjUpCiAjZGVmaW5lICAgR18wMzgwMTBfRFNUX1NFTF9XKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjUpICYgMHg3KQogI2RlZmluZSAgIENfMDM4MDEwX0RTVF9TRUxfVyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjFGRkZGRkYKKyMJZGVmaW5lIFNRX1NFTF9YCQkJCQkwCisjCWRlZmluZSBTUV9TRUxfWQkJCQkJMQorIwlkZWZpbmUgU1FfU0VMX1oJCQkJCTIKKyMJZGVmaW5lIFNRX1NFTF9XCQkJCQkzCisjCWRlZmluZSBTUV9TRUxfMAkJCQkJNAorIwlkZWZpbmUgU1FfU0VMXzEJCQkJCTUKICNkZWZpbmUgICBTXzAzODAxMF9CQVNFX0xFVkVMKHgpICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4RikgPDwgMjgpCiAjZGVmaW5lICAgR18wMzgwMTBfQkFTRV9MRVZFTCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgPj4gMjgpICYgMHhGKQogI2RlZmluZSAgIENfMDM4MDEwX0JBU0VfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZGRkZGRkYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCmluZGV4IGMxZTA1NmIuLmZjNWExZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaApAQCAtOTMsNiArOTMsNyBAQAogZXh0ZXJuIGludCByYWRlb25fZGlzcF9wcmlvcml0eTsKIGV4dGVybiBpbnQgcmFkZW9uX2h3X2kyYzsKIGV4dGVybiBpbnQgcmFkZW9uX3BjaWVfZ2VuMjsKK2V4dGVybiBpbnQgcmFkZW9uX21zaTsKIAogLyoKICAqIENvcHkgZnJvbSByYWRlb25fZHJ2Lmggc28gd2UgZG9uJ3QgaGF2ZSB0byBpbmNsdWRlIGJvdGggYW5kIGhhdmUgY29uZmxpY3RpbmcKQEAgLTEwMiw3ICsxMDMsNyBAQAogI2RlZmluZSBSQURFT05fRkVOQ0VfSklGRklFU19USU1FT1VUCShIWiAvIDIpCiAvKiBSQURFT05fSUJfUE9PTF9TSVpFIG11c3QgYmUgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIFJBREVPTl9JQl9QT09MX1NJWkUJCTE2Ci0jZGVmaW5lIFJBREVPTl9ERUJVR0ZTX01BWF9OVU1fRklMRVMJMzIKKyNkZWZpbmUgUkFERU9OX0RFQlVHRlNfTUFYX0NPTVBPTkVOVFMJMzIKICNkZWZpbmUgUkFERU9ORkJfQ09OTl9MSU1JVAkJNAogI2RlZmluZSBSQURFT05fQklPU19OVU1fU0NSQVRDSAkJOAogCkBAIC0zMDYsMzAgKzMwNywxNyBAQAogICovCiBzdHJ1Y3QgcmFkZW9uX21jOwogCi1zdHJ1Y3QgcmFkZW9uX2dhcnRfdGFibGVfcmFtIHsKLQl2b2xhdGlsZSB1aW50MzJfdAkJKnB0cjsKLX07Ci0KLXN0cnVjdCByYWRlb25fZ2FydF90YWJsZV92cmFtIHsKLQlzdHJ1Y3QgcmFkZW9uX2JvCQkqcm9iajsKLQl2b2xhdGlsZSB1aW50MzJfdAkJKnB0cjsKLX07Ci0KLXVuaW9uIHJhZGVvbl9nYXJ0X3RhYmxlIHsKLQlzdHJ1Y3QgcmFkZW9uX2dhcnRfdGFibGVfcmFtCXJhbTsKLQlzdHJ1Y3QgcmFkZW9uX2dhcnRfdGFibGVfdnJhbQl2cmFtOwotfTsKLQogI2RlZmluZSBSQURFT05fR1BVX1BBR0VfU0laRSA0MDk2CiAjZGVmaW5lIFJBREVPTl9HUFVfUEFHRV9NQVNLIChSQURFT05fR1BVX1BBR0VfU0laRSAtIDEpCiAjZGVmaW5lIFJBREVPTl9HUFVfUEFHRV9TSElGVCAxMgogCiBzdHJ1Y3QgcmFkZW9uX2dhcnQgewogCWRtYV9hZGRyX3QJCQl0YWJsZV9hZGRyOworCXN0cnVjdCByYWRlb25fYm8JCSpyb2JqOworCXZvaWQJCQkJKnB0cjsKIAl1bnNpZ25lZAkJCW51bV9ncHVfcGFnZXM7CiAJdW5zaWduZWQJCQludW1fY3B1X3BhZ2VzOwogCXVuc2lnbmVkCQkJdGFibGVfc2l6ZTsKLQl1bmlvbiByYWRlb25fZ2FydF90YWJsZQkJdGFibGU7CiAJc3RydWN0IHBhZ2UJCQkqKnBhZ2VzOwogCWRtYV9hZGRyX3QJCQkqcGFnZXNfYWRkcjsKIAlib29sCQkJCSp0dG1fYWxsb2NlZDsKQEAgLTM0MCw2ICszMjgsOCBAQAogdm9pZCByYWRlb25fZ2FydF90YWJsZV9yYW1fZnJlZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcmFkZW9uX2dhcnRfdGFibGVfdnJhbV9hbGxvYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fZnJlZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitpbnQgcmFkZW9uX2dhcnRfdGFibGVfdnJhbV9waW4oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByYWRlb25fZ2FydF90YWJsZV92cmFtX3VucGluKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByYWRlb25fZ2FydF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcmFkZW9uX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9nYXJ0X3VuYmluZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdW5zaWduZWQgb2Zmc2V0LApAQCAtMzQ3LDYgKzMzNyw3IEBACiBpbnQgcmFkZW9uX2dhcnRfYmluZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdW5zaWduZWQgb2Zmc2V0LAogCQkgICAgIGludCBwYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlbGlzdCwKIAkJICAgICBkbWFfYWRkcl90ICpkbWFfYWRkcik7Cit2b2lkIHJhZGVvbl9nYXJ0X3Jlc3RvcmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiAKIC8qCkBAIC00MzcsMjUgKzQyOCwyNiBAQAogCXN0cnVjdCBldmVyZ3JlZW5faXJxX3N0YXRfcmVncyBldmVyZ3JlZW47CiB9OwogCisjZGVmaW5lIFJBREVPTl9NQVhfSFBEX1BJTlMgNgorI2RlZmluZSBSQURFT05fTUFYX0NSVENTIDYKKyNkZWZpbmUgUkFERU9OX01BWF9IRE1JX0JMT0NLUyAyCisKIHN0cnVjdCByYWRlb25faXJxIHsKIAlib29sCQlpbnN0YWxsZWQ7CiAJYm9vbAkJc3dfaW50OwotCS8qIEZJWE1FOiB1c2UgYSBkZWZpbmUgbWF4IGNydGMgcmF0aGVyIHRoYW4gaGFyZGNvZGUgaXQgKi8KLQlib29sCQljcnRjX3ZibGFua19pbnRbNl07Ci0JYm9vbAkJcGZsaXBbNl07CisJYm9vbAkJY3J0Y192YmxhbmtfaW50W1JBREVPTl9NQVhfQ1JUQ1NdOworCWJvb2wJCXBmbGlwW1JBREVPTl9NQVhfQ1JUQ1NdOwogCXdhaXRfcXVldWVfaGVhZF90CXZibGFua19xdWV1ZTsKLQkvKiBGSVhNRTogdXNlIGRlZmluZXMgZm9yIG1heCBocGQvZGFjcyAqLwotCWJvb2wgICAgICAgICAgICBocGRbNl07CisJYm9vbCAgICAgICAgICAgIGhwZFtSQURFT05fTUFYX0hQRF9QSU5TXTsKIAlib29sICAgICAgICAgICAgZ3VpX2lkbGU7CiAJYm9vbCAgICAgICAgICAgIGd1aV9pZGxlX2Fja2VkOwogCXdhaXRfcXVldWVfaGVhZF90CWlkbGVfcXVldWU7Ci0JLyogRklYTUU6IHVzZSBkZWZpbmVzIGZvciBtYXggSERNSSBibG9ja3MgKi8KLQlib29sCQloZG1pWzJdOworCWJvb2wJCWhkbWlbUkFERU9OX01BWF9IRE1JX0JMT0NLU107CiAJc3BpbmxvY2tfdCBzd19sb2NrOwogCWludCBzd19yZWZjb3VudDsKIAl1bmlvbiByYWRlb25faXJxX3N0YXRfcmVncyBzdGF0X3JlZ3M7Ci0Jc3BpbmxvY2tfdCBwZmxpcF9sb2NrWzZdOwotCWludCBwZmxpcF9yZWZjb3VudFs2XTsKKwlzcGlubG9ja190IHBmbGlwX2xvY2tbUkFERU9OX01BWF9DUlRDU107CisJaW50IHBmbGlwX3JlZmNvdW50W1JBREVPTl9NQVhfQ1JUQ1NdOwogfTsKIAogaW50IHJhZGVvbl9pcnFfa21zX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtNTIzLDkgKzUxNSwzMCBAQAogCWJvb2wgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ7CiB9OwogCitzdHJ1Y3QgcjYwMF9ibGl0X2NwX3ByaW1pdGl2ZXMgeworCXZvaWQgKCpzZXRfcmVuZGVyX3RhcmdldCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBmb3JtYXQsCisJCQkJICBpbnQgdywgaW50IGgsIHU2NCBncHVfYWRkcik7CisJdm9pZCAoKmNwX3NldF9zdXJmYWNlX3N5bmMpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCSAgICB1MzIgc3luY190eXBlLCB1MzIgc2l6ZSwKKwkJCQkgICAgdTY0IG1jX2FkZHIpOworCXZvaWQgKCpzZXRfc2hhZGVycykoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCXZvaWQgKCpzZXRfdnR4X3Jlc291cmNlKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTY0IGdwdV9hZGRyKTsKKwl2b2lkICgqc2V0X3RleF9yZXNvdXJjZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCwgaW50IHBpdGNoLAorCQkJCSB1NjQgZ3B1X2FkZHIsIHUzMiBzaXplKTsKKwl2b2lkICgqc2V0X3NjaXNzb3JzKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHgxLCBpbnQgeTEsCisJCQkgICAgIGludCB4MiwgaW50IHkyKTsKKwl2b2lkICgqZHJhd19hdXRvKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisJdm9pZCAoKnNldF9kZWZhdWx0X3N0YXRlKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit9OworCiBzdHJ1Y3QgcjYwMF9ibGl0IHsKIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCXN0cnVjdCByYWRlb25fYm8JKnNoYWRlcl9vYmo7CisJc3RydWN0IHI2MDBfYmxpdF9jcF9wcmltaXRpdmVzIHByaW1pdGl2ZXM7CisJaW50IG1heF9kaW07CisJaW50IHJpbmdfc2l6ZV9jb21tb247CisJaW50IHJpbmdfc2l6ZV9wZXJfbG9vcDsKIAl1NjQgc2hhZGVyX2dwdV9hZGRyOwogCXUzMiB2c19vZmZzZXQsIHBzX29mZnNldDsKIAl1MzIgc3RhdGVfb2Zmc2V0OwpAQCAtNTM0LDYgKzU0Nyw4IEBACiAJc3RydWN0IHJhZGVvbl9pYiAqdmJfaWI7CiB9OwogCit2b2lkIHI2MDBfYmxpdF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKwogaW50IHJhZGVvbl9pYl9nZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25faWIgKippYik7CiB2b2lkIHJhZGVvbl9pYl9mcmVlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX2liICoqaWIpOwogaW50IHJhZGVvbl9pYl9zY2hlZHVsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9pYiAqaWIpOwpAQCAtNjAxLDMyICs2MTYsNyBAQAogCiBleHRlcm4gaW50IHJhZGVvbl9jc191cGRhdGVfcGFnZXMoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIGludCBwZ19pZHgpOwogZXh0ZXJuIGludCByYWRlb25fY3NfZmluaXNoX3BhZ2VzKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwKTsKLQotCi1zdGF0aWMgaW5saW5lIHUzMiByYWRlb25fZ2V0X2liX3ZhbHVlKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCBpbnQgaWR4KQotewotCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKmliYyA9ICZwLT5jaHVua3NbcC0+Y2h1bmtfaWJfaWR4XTsKLQl1MzIgcGdfaWR4LCBwZ19vZmZzZXQ7Ci0JdTMyIGlkeF92YWx1ZSA9IDA7Ci0JaW50IG5ld19wYWdlOwotCi0JcGdfaWR4ID0gKGlkeCAqIDQpIC8gUEFHRV9TSVpFOwotCXBnX29mZnNldCA9IChpZHggKiA0KSAlIFBBR0VfU0laRTsKLQotCWlmIChpYmMtPmtwYWdlX2lkeFswXSA9PSBwZ19pZHgpCi0JCXJldHVybiBpYmMtPmtwYWdlWzBdW3BnX29mZnNldC80XTsKLQlpZiAoaWJjLT5rcGFnZV9pZHhbMV0gPT0gcGdfaWR4KQotCQlyZXR1cm4gaWJjLT5rcGFnZVsxXVtwZ19vZmZzZXQvNF07Ci0KLQluZXdfcGFnZSA9IHJhZGVvbl9jc191cGRhdGVfcGFnZXMocCwgcGdfaWR4KTsKLQlpZiAobmV3X3BhZ2UgPCAwKSB7Ci0JCXAtPnBhcnNlcl9lcnJvciA9IG5ld19wYWdlOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZHhfdmFsdWUgPSBpYmMtPmtwYWdlW25ld19wYWdlXVtwZ19vZmZzZXQvNF07Ci0JcmV0dXJuIGlkeF92YWx1ZTsKLX0KK2V4dGVybiB1MzIgcmFkZW9uX2dldF9pYl92YWx1ZShzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgaW50IGlkeCk7CiAKIHN0cnVjdCByYWRlb25fY3NfcGFja2V0IHsKIAl1bnNpZ25lZAlpZHg7CkBAIC03OTQsOCArNzg0LDcgQEAKIAogc3RydWN0IHJhZGVvbl9wb3dlcl9zdGF0ZSB7CiAJZW51bSByYWRlb25fcG1fc3RhdGVfdHlwZSB0eXBlOwotCS8qIFhYWDogdXNlIGEgZGVmaW5lIGZvciBudW0gY2xvY2sgbW9kZXMgKi8KLQlzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8gY2xvY2tfaW5mb1s4XTsKKwlzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8gKmNsb2NrX2luZm87CiAJLyogbnVtYmVyIG9mIHZhbGlkIGNsb2NrIG1vZGVzIGluIHRoaXMgcG93ZXIgc3RhdGUgKi8KIAlpbnQgbnVtX2Nsb2NrX21vZGVzOwogCXN0cnVjdCByYWRlb25fcG1fY2xvY2tfaW5mbyAqZGVmYXVsdF9jbG9ja19tb2RlOwpAQCAtODY1LDExICs4NTQsMTQgQEAKIAlzdHJ1Y3QgZGV2aWNlCSAgICAgICAgKmludF9od21vbl9kZXY7CiB9OwogCitpbnQgcmFkZW9uX3BtX2dldF90eXBlX2luZGV4KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJICAgICBlbnVtIHJhZGVvbl9wbV9zdGF0ZV90eXBlIHBzX3R5cGUsCisJCQkgICAgIGludCBpbnN0YW5jZSk7CiAKIC8qCiAgKiBCZW5jaG1hcmtpbmcKICAqLwotdm9pZCByYWRlb25fYmVuY2htYXJrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcmFkZW9uX2JlbmNobWFyayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHRlc3RfbnVtYmVyKTsKIAogCiAvKgpAQCAtMTE0NSwxMiArMTEzNyw1NSBAQAogaW50IHJhZGVvbl9nZW1fZ2V0X3RpbGluZ19pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlscCk7CiAKLS8qIFZSQU0gc2NyYXRjaCBwYWdlIGZvciBIRFAgYnVnICovCi1zdHJ1Y3QgcjcwMF92cmFtX3NjcmF0Y2ggeworLyogVlJBTSBzY3JhdGNoIHBhZ2UgZm9yIEhEUCBidWcsIGRlZmF1bHQgdnJhbSBwYWdlICovCitzdHJ1Y3QgcjYwMF92cmFtX3NjcmF0Y2ggewogCXN0cnVjdCByYWRlb25fYm8JCSpyb2JqOwogCXZvbGF0aWxlIHVpbnQzMl90CQkqcHRyOworCXU2NAkJCQlncHVfYWRkcjsKIH07CiAKKworLyoKKyAqIE11dGV4IHdoaWNoIGFsbG93cyByZWN1cnNpdmUgbG9ja2luZyBmcm9tIHRoZSBzYW1lIHByb2Nlc3MuCisgKi8KK3N0cnVjdCByYWRlb25fbXV0ZXggeworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CisJc3RydWN0IHRhc2tfc3RydWN0CSpvd25lcjsKKwlpbnQJCQlsZXZlbDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWRlb25fbXV0ZXhfaW5pdChzdHJ1Y3QgcmFkZW9uX211dGV4ICptdXRleCkKK3sKKwltdXRleF9pbml0KCZtdXRleC0+bXV0ZXgpOworCW11dGV4LT5vd25lciA9IE5VTEw7CisJbXV0ZXgtPmxldmVsID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbl9tdXRleF9sb2NrKHN0cnVjdCByYWRlb25fbXV0ZXggKm11dGV4KQoreworCWlmIChtdXRleF90cnlsb2NrKCZtdXRleC0+bXV0ZXgpKSB7CisJCS8qIFRoZSBtdXRleCB3YXMgdW5sb2NrZWQgYmVmb3JlLCBzbyBpdCdzIG91cnMgbm93ICovCisJCW11dGV4LT5vd25lciA9IGN1cnJlbnQ7CisJfSBlbHNlIGlmIChtdXRleC0+b3duZXIgIT0gY3VycmVudCkgeworCQkvKiBBbm90aGVyIHByb2Nlc3MgbG9ja2VkIHRoZSBtdXRleCwgdGFrZSBpdCAqLworCQltdXRleF9sb2NrKCZtdXRleC0+bXV0ZXgpOworCQltdXRleC0+b3duZXIgPSBjdXJyZW50OworCX0KKwkvKiBPdGhlcndpc2UgdGhlIG11dGV4IHdhcyBhbHJlYWR5IGxvY2tlZCBieSB0aGlzIHByb2Nlc3MgKi8KKworCW11dGV4LT5sZXZlbCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmFkZW9uX211dGV4X3VubG9jayhzdHJ1Y3QgcmFkZW9uX211dGV4ICptdXRleCkKK3sKKwlpZiAoLS1tdXRleC0+bGV2ZWwgPiAwKQorCQlyZXR1cm47CisKKwltdXRleC0+b3duZXIgPSBOVUxMOworCW11dGV4X3VubG9jaygmbXV0ZXgtPm11dGV4KTsKK30KKworCiAvKgogICogQ29yZSBzdHJ1Y3R1cmUsIGZ1bmN0aW9ucyBhbmQgaGVscGVycy4KICAqLwpAQCAtMTIwNiw3ICsxMjQxLDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2dlbQkJZ2VtOwogCXN0cnVjdCByYWRlb25fcG0JCXBtOwogCXVpbnQzMl90CQkJYmlvc19zY3JhdGNoW1JBREVPTl9CSU9TX05VTV9TQ1JBVENIXTsKLQlzdHJ1Y3QgbXV0ZXgJCQljc19tdXRleDsKKwlzdHJ1Y3QgcmFkZW9uX211dGV4CQljc19tdXRleDsKIAlzdHJ1Y3QgcmFkZW9uX3diCQl3YjsKIAlzdHJ1Y3QgcmFkZW9uX2R1bW15X3BhZ2UJZHVtbXlfcGFnZTsKIAlib29sCQkJCWdwdV9sb2NrdXA7CkBAIC0xMjIwLDcgKzEyNTUsNyBAQAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqcmxjX2Z3OwkvKiByNi83MDAgUkxDIGZpcm13YXJlICovCiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICptY19mdzsJLyogTkkgTUMgZmlybXdhcmUgKi8KIAlzdHJ1Y3QgcjYwMF9ibGl0IHI2MDBfYmxpdDsKLQlzdHJ1Y3QgcjcwMF92cmFtX3NjcmF0Y2ggdnJhbV9zY3JhdGNoOworCXN0cnVjdCByNjAwX3ZyYW1fc2NyYXRjaCB2cmFtX3NjcmF0Y2g7CiAJaW50IG1zaV9lbmFibGVkOyAvKiBtc2kgZW5hYmxlZCAqLwogCXN0cnVjdCByNjAwX2loIGloOyAvKiByNi83MDAgaW50ZXJydXB0IHJpbmcgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaG90cGx1Z193b3JrOwpAQCAtMTI1Miw0NSArMTI4NywxMCBAQAogdm9pZCByYWRlb25fZGV2aWNlX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJhZGVvbl9ncHVfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgcjEwMF9tbV9ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpCi17Ci0JaWYgKHJlZyA8IHJkZXYtPnJtbWlvX3NpemUpCi0JCXJldHVybiByZWFkbCgocmRldi0+cm1taW8pICsgcmVnKTsKLQllbHNlIHsKLQkJd3JpdGVsKHJlZywgKHJkZXYtPnJtbWlvKSArIFJBREVPTl9NTV9JTkRFWCk7Ci0JCXJldHVybiByZWFkbCgocmRldi0+cm1taW8pICsgUkFERU9OX01NX0RBVEEpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHIxMDBfbW1fd3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2KQotewotCWlmIChyZWcgPCByZGV2LT5ybW1pb19zaXplKQotCQl3cml0ZWwodiwgKHJkZXYtPnJtbWlvKSArIHJlZyk7Ci0JZWxzZSB7Ci0JCXdyaXRlbChyZWcsIChyZGV2LT5ybW1pbykgKyBSQURFT05fTU1fSU5ERVgpOwotCQl3cml0ZWwodiwgKHJkZXYtPnJtbWlvKSArIFJBREVPTl9NTV9EQVRBKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIHIxMDBfaW9fcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHJlZykKLXsKLQlpZiAocmVnIDwgcmRldi0+cmlvX21lbV9zaXplKQotCQlyZXR1cm4gaW9yZWFkMzIocmRldi0+cmlvX21lbSArIHJlZyk7Ci0JZWxzZSB7Ci0JCWlvd3JpdGUzMihyZWcsIHJkZXYtPnJpb19tZW0gKyBSQURFT05fTU1fSU5ERVgpOwotCQlyZXR1cm4gaW9yZWFkMzIocmRldi0+cmlvX21lbSArIFJBREVPTl9NTV9EQVRBKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByMTAwX2lvX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiByZWcsIHUzMiB2KQotewotCWlmIChyZWcgPCByZGV2LT5yaW9fbWVtX3NpemUpCi0JCWlvd3JpdGUzMih2LCByZGV2LT5yaW9fbWVtICsgcmVnKTsKLQllbHNlIHsKLQkJaW93cml0ZTMyKHJlZywgcmRldi0+cmlvX21lbSArIFJBREVPTl9NTV9JTkRFWCk7Ci0JCWlvd3JpdGUzMih2LCByZGV2LT5yaW9fbWVtICsgUkFERU9OX01NX0RBVEEpOwotCX0KLX0KK3VpbnQzMl90IHIxMDBfbW1fcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnKTsKK3ZvaWQgcjEwMF9tbV93cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHYpOwordTMyIHIxMDBfaW9fcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHJlZyk7Cit2b2lkIHIxMDBfaW9fd3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHJlZywgdTMyIHYpOwogCiAvKgogICogQ2FzdCBoZWxwZXIKQEAgLTE0MTMsMTkgKzE0MTMsMTkgQEAKIC8qCiAgKiBSSU5HIGhlbHBlcnMuCiAgKi8KKworI2lmIERSTV9ERUJVR19DT0RFID09IDAKIHN0YXRpYyBpbmxpbmUgdm9pZCByYWRlb25fcmluZ193cml0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgdikKIHsKLSNpZiBEUk1fREVCVUdfQ09ERQotCWlmIChyZGV2LT5jcC5jb3VudF9kdyA8PSAwKSB7Ci0JCURSTV9FUlJPUigicmFkZW9uOiB3cml0dGluZyBtb3JlIGR3b3JkIHRvIHJpbmcgdGhhbiBleHBlY3RlZCAhXG4iKTsKLQl9Ci0jZW5kaWYKIAlyZGV2LT5jcC5yaW5nW3JkZXYtPmNwLndwdHIrK10gPSB2OwogCXJkZXYtPmNwLndwdHIgJj0gcmRldi0+Y3AucHRyX21hc2s7CiAJcmRldi0+Y3AuY291bnRfZHctLTsKIAlyZGV2LT5jcC5yaW5nX2ZyZWVfZHctLTsKIH0KLQorI2Vsc2UKKy8qIFdpdGggZGVidWdnaW5nIHRoaXMgaXMganVzdCB0b28gYmlnIHRvIGlubGluZSAqLwordm9pZCByYWRlb25fcmluZ193cml0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3Qgdik7CisjZW5kaWYKIAogLyoKICAqIEFTSUNzIG1hY3JvLgpAQCAtMTQ3OSw4ICsxNDc5LDYgQEAKIC8qIEFHUCAqLwogZXh0ZXJuIGludCByYWRlb25fZ3B1X3Jlc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJhZGVvbl9hZ3BfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gaW50IHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fcGluKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHJhZGVvbl9nYXJ0X3Jlc3RvcmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCByYWRlb25fbW9kZXNldF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJhZGVvbl9tb2Rlc2V0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGJvb2wgcmFkZW9uX2NhcmRfcG9zdGVkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTE1MDQsNiArMTUwMiwxMiBAQAogZXh0ZXJuIHZvaWQgcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTY0IHNpemUpOwogCiAvKgorICogUjYwMCB2cmFtIHNjcmF0Y2ggZnVuY3Rpb25zCisgKi8KK2ludCByNjAwX3ZyYW1fc2NyYXRjaF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcjYwMF92cmFtX3NjcmF0Y2hfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKKy8qCiAgKiByNjAwIGZ1bmN0aW9ucyB1c2VkIGJ5IHJhZGVvbl9lbmNvZGVyLmMKICAqLwogZXh0ZXJuIHZvaWQgcjYwMF9oZG1pX2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCmluZGV4IGRmODIxOGIuLmEyZTFlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKQEAgLTc2NSw5ICs3NjUsOSBAQAogCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSAmZXZlcmdyZWVuX2dldF92YmxhbmtfY291bnRlciwKIAkuZmVuY2VfcmluZ19lbWl0ID0gJnI2MDBfZmVuY2VfcmluZ19lbWl0LAogCS5jc19wYXJzZSA9ICZldmVyZ3JlZW5fY3NfcGFyc2UsCi0JLmNvcHlfYmxpdCA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5X2JsaXQgPSAmcjYwMF9jb3B5X2JsaXQsCiAJLmNvcHlfZG1hID0gTlVMTCwKLQkuY29weSA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5ID0gJnI2MDBfY29weV9ibGl0LAogCS5nZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9lbmdpbmVfY2xvY2ssCiAJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKIAkuZ2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfbWVtb3J5X2Nsb2NrLApAQCAtODEyLDkgKzgxMiw5IEBACiAJLmdldF92YmxhbmtfY291bnRlciA9ICZldmVyZ3JlZW5fZ2V0X3ZibGFua19jb3VudGVyLAogCS5mZW5jZV9yaW5nX2VtaXQgPSAmcjYwMF9mZW5jZV9yaW5nX2VtaXQsCiAJLmNzX3BhcnNlID0gJmV2ZXJncmVlbl9jc19wYXJzZSwKLQkuY29weV9ibGl0ID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCisJLmNvcHlfYmxpdCA9ICZyNjAwX2NvcHlfYmxpdCwKIAkuY29weV9kbWEgPSBOVUxMLAotCS5jb3B5ID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCisJLmNvcHkgPSAmcjYwMF9jb3B5X2JsaXQsCiAJLmdldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fZ2V0X2VuZ2luZV9jbG9jaywKIAkuc2V0X2VuZ2luZV9jbG9jayA9ICZyYWRlb25fYXRvbV9zZXRfZW5naW5lX2Nsb2NrLAogCS5nZXRfbWVtb3J5X2Nsb2NrID0gTlVMTCwKQEAgLTgzNCw3ICs4MzQsNyBAQAogCS5wbV9taXNjID0gJmV2ZXJncmVlbl9wbV9taXNjLAogCS5wbV9wcmVwYXJlID0gJmV2ZXJncmVlbl9wbV9wcmVwYXJlLAogCS5wbV9maW5pc2ggPSAmZXZlcmdyZWVuX3BtX2ZpbmlzaCwKLQkucG1faW5pdF9wcm9maWxlID0gJnJzNzgwX3BtX2luaXRfcHJvZmlsZSwKKwkucG1faW5pdF9wcm9maWxlID0gJnN1bW9fcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjYwMF9wbV9nZXRfZHlucG1fc3RhdGUsCiAJLnByZV9wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAsCiAJLnBhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcGFnZV9mbGlwLApAQCAtODU5LDkgKzg1OSw5IEBACiAJLmdldF92YmxhbmtfY291bnRlciA9ICZldmVyZ3JlZW5fZ2V0X3ZibGFua19jb3VudGVyLAogCS5mZW5jZV9yaW5nX2VtaXQgPSAmcjYwMF9mZW5jZV9yaW5nX2VtaXQsCiAJLmNzX3BhcnNlID0gJmV2ZXJncmVlbl9jc19wYXJzZSwKLQkuY29weV9ibGl0ID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCisJLmNvcHlfYmxpdCA9ICZyNjAwX2NvcHlfYmxpdCwKIAkuY29weV9kbWEgPSBOVUxMLAotCS5jb3B5ID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCisJLmNvcHkgPSAmcjYwMF9jb3B5X2JsaXQsCiAJLmdldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fZ2V0X2VuZ2luZV9jbG9jaywKIAkuc2V0X2VuZ2luZV9jbG9jayA9ICZyYWRlb25fYXRvbV9zZXRfZW5naW5lX2Nsb2NrLAogCS5nZXRfbWVtb3J5X2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9tZW1vcnlfY2xvY2ssCkBAIC05MDYsOSArOTA2LDkgQEAKIAkuZ2V0X3ZibGFua19jb3VudGVyID0gJmV2ZXJncmVlbl9nZXRfdmJsYW5rX2NvdW50ZXIsCiAJLmZlbmNlX3JpbmdfZW1pdCA9ICZyNjAwX2ZlbmNlX3JpbmdfZW1pdCwKIAkuY3NfcGFyc2UgPSAmZXZlcmdyZWVuX2NzX3BhcnNlLAotCS5jb3B5X2JsaXQgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weV9ibGl0ID0gJnI2MDBfY29weV9ibGl0LAogCS5jb3B5X2RtYSA9IE5VTEwsCi0JLmNvcHkgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weSA9ICZyNjAwX2NvcHlfYmxpdCwKIAkuZ2V0X2VuZ2luZV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfZW5naW5lX2Nsb2NrLAogCS5zZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX3NldF9lbmdpbmVfY2xvY2ssCiAJLmdldF9tZW1vcnlfY2xvY2sgPSAmcmFkZW9uX2F0b21fZ2V0X21lbW9yeV9jbG9jaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaAppbmRleCAzZGVkYWEwLi41OTkxNDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oCkBAIC0zNjQsMTEgKzM2NCwxMSBAQAogaW50IHI2MDBfaGRtaV9idWZmZXJfc3RhdHVzX2NoYW5nZWQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIHZvaWQgcjYwMF9oZG1pX3VwZGF0ZV9hdWRpb19zZXR0aW5ncyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogLyogcjYwMCBibGl0ICovCi1pbnQgcjYwMF9ibGl0X3ByZXBhcmVfY29weShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHNpemVfYnl0ZXMpOworaW50IHI2MDBfYmxpdF9wcmVwYXJlX2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIG51bV9ncHVfcGFnZXMpOwogdm9pZCByNjAwX2JsaXRfZG9uZV9jb3B5KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSk7CiB2b2lkIHI2MDBfa21zX2JsaXRfY29weShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJCXU2NCBzcmNfZ3B1X2FkZHIsIHU2NCBkc3RfZ3B1X2FkZHIsCi0JCQlpbnQgc2l6ZV9ieXRlcyk7CisJCQl1bnNpZ25lZCBudW1fZ3B1X3BhZ2VzKTsKIAogLyoKICAqIHJ2NzcwLHJ2NzMwLHJ2NzEwLHJ2NzQwCkBAIC00MDEsOSArNDAxLDYgQEAKIGludCBldmVyZ3JlZW5fYXNpY19yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIGV2ZXJncmVlbl9iYW5kd2lkdGhfdXBkYXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgZXZlcmdyZWVuX3JpbmdfaWJfZXhlY3V0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9pYiAqaWIpOwotaW50IGV2ZXJncmVlbl9jb3B5X2JsaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQl1aW50NjRfdCBzcmNfb2Zmc2V0LCB1aW50NjRfdCBkc3Rfb2Zmc2V0LAotCQkJdW5zaWduZWQgbnVtX2dwdV9wYWdlcywgc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpOwogdm9pZCBldmVyZ3JlZW5faHBkX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBldmVyZ3JlZW5faHBkX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogYm9vbCBldmVyZ3JlZW5faHBkX3NlbnNlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBlbnVtIHJhZGVvbl9ocGRfaWQgaHBkKTsKQEAgLTQxNiwxOCArNDEzLDEyIEBACiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fcG1fbWlzYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fcG1fcHJlcGFyZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fcG1fZmluaXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHN1bW9fcG1faW5pdF9wcm9maWxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIGV2ZXJncmVlbl9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdTMyIGV2ZXJncmVlbl9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjLCB1NjQgY3J0Y19iYXNlKTsKIGV4dGVybiB2b2lkIGV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogdm9pZCBldmVyZ3JlZW5fZGlzYWJsZV9pbnRlcnJ1cHRfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IGV2ZXJncmVlbl9ibGl0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotdm9pZCBldmVyZ3JlZW5fYmxpdF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLS8qIGV2ZXJncmVlbiBibGl0ICovCi1pbnQgZXZlcmdyZWVuX2JsaXRfcHJlcGFyZV9jb3B5KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgc2l6ZV9ieXRlcyk7Ci12b2lkIGV2ZXJncmVlbl9ibGl0X2RvbmVfY29weShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpOwotdm9pZCBldmVyZ3JlZW5fa21zX2JsaXRfY29weShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCSAgICAgdTY0IHNyY19ncHVfYWRkciwgdTY0IGRzdF9ncHVfYWRkciwKLQkJCSAgICAgaW50IHNpemVfYnl0ZXMpOwogCiAvKgogICogY2F5bWFuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYwppbmRleCBiZjJiNjE1Li5kMmQxNzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAlzdHJ1Y3QgX0FUT01fU1VQUE9SVEVEX0RFVklDRVNfSU5GT18yZDEgaW5mb18yZDE7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgcmFkZW9uX2xvb2t1cF9pMmNfZ3BpbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKK3N0YXRpYyBzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjIHJhZGVvbl9sb29rdXBfaTJjX2dwaW8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkJCQkJICAgICAgIHVpbnQ4X3QgaWQpCiB7CiAJc3RydWN0IGF0b21fY29udGV4dCAqY3R4ID0gcmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dDsKQEAgLTIyOCw3ICsyMjgsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmFkZW9uX2dwaW9fcmVjIHJhZGVvbl9sb29rdXBfZ3BpbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKK3N0YXRpYyBzdHJ1Y3QgcmFkZW9uX2dwaW9fcmVjIHJhZGVvbl9sb29rdXBfZ3BpbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJCQkJCQl1OCBpZCkKIHsKIAlzdHJ1Y3QgYXRvbV9jb250ZXh0ICpjdHggPSByZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0OwpAQCAtMTk5OSw2ICsxOTk5LDEwIEBACiAJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudHlwZSA9IFZPTFRBR0VfTk9ORTsKIAkJc3dpdGNoIChmcmV2KSB7CiAJCWNhc2UgMToKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvID0KKwkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8pICogMSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvKQorCQkJCXJldHVybiBzdGF0ZV9pbmRleDsKIAkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5udW1fY2xvY2tfbW9kZXMgPSAxOwogCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9CiAJCQkJbGUxNl90b19jcHUocG93ZXJfaW5mby0+aW5mby5hc1Bvd2VyUGxheUluZm9baV0udXNNZW1vcnlDbG9jayk7CkBAIC0yMDM1LDYgKzIwMzksMTAgQEAKIAkJCXN0YXRlX2luZGV4Kys7CiAJCQlicmVhazsKIAkJY2FzZSAyOgorCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm8gPQorCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fcG1fY2xvY2tfaW5mbykgKiAxLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm8pCisJCQkJcmV0dXJuIHN0YXRlX2luZGV4OwogCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IDE7CiAJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID0KIAkJCQlsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzIuYXNQb3dlclBsYXlJbmZvW2ldLnVsTWVtb3J5Q2xvY2spOwpAQCAtMjA3Miw2ICsyMDgwLDEwIEBACiAJCQlzdGF0ZV9pbmRleCsrOwogCQkJYnJlYWs7CiAJCWNhc2UgMzoKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvID0KKwkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8pICogMSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvKQorCQkJCXJldHVybiBzdGF0ZV9pbmRleDsKIAkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5udW1fY2xvY2tfbW9kZXMgPSAxOwogCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9CiAJCQkJbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1lbW9yeUNsb2NrKTsKQEAgLTIyNTcsNyArMjI2OSw3IEBACiAJCXJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPSBzdGF0ZV9pbmRleDsKIAkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmRlZmF1bHRfY2xvY2tfbW9kZSA9CiAJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleCAtIDFdOwotCQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKSB7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikgJiYgIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CiAJCQkvKiBOSSBjaGlwcyBwb3N0IHdpdGhvdXQgTUMgdWNvZGUsIHNvIGRlZmF1bHQgY2xvY2tzIGFyZSBzdHJvYmUgbW9kZSBvbmx5ICovCiAJCQlyZGV2LT5wbS5kZWZhdWx0X3NjbGsgPSByZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrOwogCQkJcmRldi0+cG0uZGVmYXVsdF9tY2xrID0gcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsazsKQEAgLTIzNzcsMTcgKzIzODksMzEgQEAKIAkJCSBsZTE2X3RvX2NwdShwb3dlcl9pbmZvLT5wcGxpYi51c05vbkNsb2NrSW5mb0FycmF5T2Zmc2V0KSArCiAJCQkgKHBvd2VyX3N0YXRlLT52MS51Y05vbkNsb2NrU3RhdGVJbmRleCAqCiAJCQkgIHBvd2VyX2luZm8tPnBwbGliLnVjTm9uQ2xvY2tTaXplKSk7Ci0JCWZvciAoaiA9IDA7IGogPCAocG93ZXJfaW5mby0+cHBsaWIudWNTdGF0ZUVudHJ5U2l6ZSAtIDEpOyBqKyspIHsKLQkJCWNsb2NrX2luZm8gPSAodW5pb24gcHBsaWJfY2xvY2tfaW5mbyAqKQotCQkJCShtb2RlX2luZm8tPmF0b21fY29udGV4dC0+YmlvcyArIGRhdGFfb2Zmc2V0ICsKLQkJCQkgbGUxNl90b19jcHUocG93ZXJfaW5mby0+cHBsaWIudXNDbG9ja0luZm9BcnJheU9mZnNldCkgKwotCQkJCSAocG93ZXJfc3RhdGUtPnYxLnVjQ2xvY2tTdGF0ZUluZGljZXNbal0gKgotCQkJCSAgcG93ZXJfaW5mby0+cHBsaWIudWNDbG9ja0luZm9TaXplKSk7Ci0JCQl2YWxpZCA9IHJhZGVvbl9hdG9tYmlvc19wYXJzZV9wcGxpYl9jbG9ja19pbmZvKHJkZXYsCi0JCQkJCQkJCSAgICAgICBzdGF0ZV9pbmRleCwgbW9kZV9pbmRleCwKLQkJCQkJCQkJICAgICAgIGNsb2NrX2luZm8pOwotCQkJaWYgKHZhbGlkKQotCQkJCW1vZGVfaW5kZXgrKzsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbaV0uY2xvY2tfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fcG1fY2xvY2tfaW5mbykgKgorCQkJCQkJCSAgICAgKChwb3dlcl9pbmZvLT5wcGxpYi51Y1N0YXRlRW50cnlTaXplIC0gMSkgPworCQkJCQkJCSAgICAgIChwb3dlcl9pbmZvLT5wcGxpYi51Y1N0YXRlRW50cnlTaXplIC0gMSkgOiAxKSwKKwkJCQkJCQkgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXJkZXYtPnBtLnBvd2VyX3N0YXRlW2ldLmNsb2NrX2luZm8pCisJCQlyZXR1cm4gc3RhdGVfaW5kZXg7CisJCWlmIChwb3dlcl9pbmZvLT5wcGxpYi51Y1N0YXRlRW50cnlTaXplIC0gMSkgeworCQkJZm9yIChqID0gMDsgaiA8IChwb3dlcl9pbmZvLT5wcGxpYi51Y1N0YXRlRW50cnlTaXplIC0gMSk7IGorKykgeworCQkJCWNsb2NrX2luZm8gPSAodW5pb24gcHBsaWJfY2xvY2tfaW5mbyAqKQorCQkJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCArCisJCQkJCSBsZTE2X3RvX2NwdShwb3dlcl9pbmZvLT5wcGxpYi51c0Nsb2NrSW5mb0FycmF5T2Zmc2V0KSArCisJCQkJCSAocG93ZXJfc3RhdGUtPnYxLnVjQ2xvY2tTdGF0ZUluZGljZXNbal0gKgorCQkJCQkgIHBvd2VyX2luZm8tPnBwbGliLnVjQ2xvY2tJbmZvU2l6ZSkpOworCQkJCXZhbGlkID0gcmFkZW9uX2F0b21iaW9zX3BhcnNlX3BwbGliX2Nsb2NrX2luZm8ocmRldiwKKwkJCQkJCQkJCSAgICAgICBzdGF0ZV9pbmRleCwgbW9kZV9pbmRleCwKKwkJCQkJCQkJCSAgICAgICBjbG9ja19pbmZvKTsKKwkJCQlpZiAodmFsaWQpCisJCQkJCW1vZGVfaW5kZXgrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPQorCQkJCXJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsazsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPQorCQkJCXJkZXYtPmNsb2NrLmRlZmF1bHRfc2NsazsKKwkJCW1vZGVfaW5kZXgrKzsKIAkJfQogCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gbW9kZV9pbmRleDsKIAkJaWYgKG1vZGVfaW5kZXgpIHsKQEAgLTI0NTYsMTggKzI0ODIsMzIgQEAKIAkJbm9uX2Nsb2NrX2FycmF5X2luZGV4ID0gaTsgLyogcG93ZXJfc3RhdGUtPnYyLm5vbkNsb2NrSW5mb0luZGV4ICovCiAJCW5vbl9jbG9ja19pbmZvID0gKHN0cnVjdCBfQVRPTV9QUExJQl9OT05DTE9DS19JTkZPICopCiAJCQkmbm9uX2Nsb2NrX2luZm9fYXJyYXktPm5vbkNsb2NrSW5mb1tub25fY2xvY2tfYXJyYXlfaW5kZXhdOwotCQlmb3IgKGogPSAwOyBqIDwgcG93ZXJfc3RhdGUtPnYyLnVjTnVtRFBNTGV2ZWxzOyBqKyspIHsKLQkJCWNsb2NrX2FycmF5X2luZGV4ID0gcG93ZXJfc3RhdGUtPnYyLmNsb2NrSW5mb0luZGV4W2pdOwotCQkJLyogWFhYIHRoaXMgbWlnaHQgYmUgYW4gaW5hZ3VhIGJ1Zy4uLiAqLwotCQkJaWYgKGNsb2NrX2FycmF5X2luZGV4ID49IGNsb2NrX2luZm9fYXJyYXktPnVjTnVtRW50cmllcykKLQkJCQljb250aW51ZTsKLQkJCWNsb2NrX2luZm8gPSAodW5pb24gcHBsaWJfY2xvY2tfaW5mbyAqKQotCQkJCSZjbG9ja19pbmZvX2FycmF5LT5jbG9ja0luZm9bY2xvY2tfYXJyYXlfaW5kZXhdOwotCQkJdmFsaWQgPSByYWRlb25fYXRvbWJpb3NfcGFyc2VfcHBsaWJfY2xvY2tfaW5mbyhyZGV2LAotCQkJCQkJCQkgICAgICAgc3RhdGVfaW5kZXgsIG1vZGVfaW5kZXgsCi0JCQkJCQkJCSAgICAgICBjbG9ja19pbmZvKTsKLQkJCWlmICh2YWxpZCkKLQkJCQltb2RlX2luZGV4Kys7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW2ldLmNsb2NrX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8pICoKKwkJCQkJCQkgICAgIChwb3dlcl9zdGF0ZS0+djIudWNOdW1EUE1MZXZlbHMgPworCQkJCQkJCSAgICAgIHBvd2VyX3N0YXRlLT52Mi51Y051bURQTUxldmVscyA6IDEpLAorCQkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcmRldi0+cG0ucG93ZXJfc3RhdGVbaV0uY2xvY2tfaW5mbykKKwkJCXJldHVybiBzdGF0ZV9pbmRleDsKKwkJaWYgKHBvd2VyX3N0YXRlLT52Mi51Y051bURQTUxldmVscykgeworCQkJZm9yIChqID0gMDsgaiA8IHBvd2VyX3N0YXRlLT52Mi51Y051bURQTUxldmVsczsgaisrKSB7CisJCQkJY2xvY2tfYXJyYXlfaW5kZXggPSBwb3dlcl9zdGF0ZS0+djIuY2xvY2tJbmZvSW5kZXhbal07CisJCQkJLyogWFhYIHRoaXMgbWlnaHQgYmUgYW4gaW5hZ3VhIGJ1Zy4uLiAqLworCQkJCWlmIChjbG9ja19hcnJheV9pbmRleCA+PSBjbG9ja19pbmZvX2FycmF5LT51Y051bUVudHJpZXMpCisJCQkJCWNvbnRpbnVlOworCQkJCWNsb2NrX2luZm8gPSAodW5pb24gcHBsaWJfY2xvY2tfaW5mbyAqKQorCQkJCQkmY2xvY2tfaW5mb19hcnJheS0+Y2xvY2tJbmZvW2Nsb2NrX2FycmF5X2luZGV4XTsKKwkJCQl2YWxpZCA9IHJhZGVvbl9hdG9tYmlvc19wYXJzZV9wcGxpYl9jbG9ja19pbmZvKHJkZXYsCisJCQkJCQkJCQkgICAgICAgc3RhdGVfaW5kZXgsIG1vZGVfaW5kZXgsCisJCQkJCQkJCQkgICAgICAgY2xvY2tfaW5mbyk7CisJCQkJaWYgKHZhbGlkKQorCQkJCQltb2RlX2luZGV4Kys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID0KKwkJCQlyZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrID0KKwkJCQlyZGV2LT5jbG9jay5kZWZhdWx0X3NjbGs7CisJCQltb2RlX2luZGV4Kys7CiAJCX0KIAkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IG1vZGVfaW5kZXg7CiAJCWlmIChtb2RlX2luZGV4KSB7CkBAIC0yNTI0LDE5ICsyNTY0LDIzIEBACiAJfSBlbHNlIHsKIAkJcmRldi0+cG0ucG93ZXJfc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3Bvd2VyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZSkgewotCQkJLyogYWRkIHRoZSBkZWZhdWx0IG1vZGUgKi8KLQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQlQT1dFUl9TVEFURV9UWVBFX0RFRkFVTFQ7Ci0JCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gMTsKLQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPSByZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7Ci0JCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrID0gcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOwotCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmRlZmF1bHRfY2xvY2tfbW9kZSA9Ci0JCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdOwotCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0gVk9MVEFHRV9OT05FOwotCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnBjaWVfbGFuZXMgPSAxNjsKLQkJCXJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPSBzdGF0ZV9pbmRleDsKLQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5mbGFncyA9IDA7Ci0JCQlzdGF0ZV9pbmRleCsrOworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0uY2xvY2tfaW5mbyA9CisJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9wbV9jbG9ja19pbmZvKSAqIDEsIEdGUF9LRVJORUwpOworCQkJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlWzBdLmNsb2NrX2luZm8pIHsKKwkJCQkvKiBhZGQgdGhlIGRlZmF1bHQgbW9kZSAqLworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KKwkJCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5udW1fY2xvY2tfbW9kZXMgPSAxOworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPSByZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9IHJkZXYtPmNsb2NrLmRlZmF1bHRfc2NsazsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZGVmYXVsdF9jbG9ja19tb2RlID0KKwkJCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdOworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudHlwZSA9IFZPTFRBR0VfTk9ORTsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ucGNpZV9sYW5lcyA9IDE2OworCQkJCXJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPSBzdGF0ZV9pbmRleDsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgPSAwOworCQkJCXN0YXRlX2luZGV4Kys7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2JlbmNobWFyay5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmVuY2htYXJrLmMKaW5kZXggMTAxOTFkOS4uMTdlMWE5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmVuY2htYXJrLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmVuY2htYXJrLmMKQEAgLTI2LDIxICsyNiw4MSBAQAogI2luY2x1ZGUgInJhZGVvbl9yZWcuaCIKICNpbmNsdWRlICJyYWRlb24uaCIKIAotdm9pZCByYWRlb25fYmVuY2htYXJrX21vdmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIGJzaXplLAotCQkJICAgdW5zaWduZWQgc2RvbWFpbiwgdW5zaWduZWQgZGRvbWFpbikKKyNkZWZpbmUgUkFERU9OX0JFTkNITUFSS19DT1BZX0JMSVQgMQorI2RlZmluZSBSQURFT05fQkVOQ0hNQVJLX0NPUFlfRE1BICAwCisKKyNkZWZpbmUgUkFERU9OX0JFTkNITUFSS19JVEVSQVRJT05TIDEwMjQKKyNkZWZpbmUgUkFERU9OX0JFTkNITUFSS19DT01NT05fTU9ERVNfTiAxNworCitzdGF0aWMgaW50IHJhZGVvbl9iZW5jaG1hcmtfZG9fbW92ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdW5zaWduZWQgc2l6ZSwKKwkJCQkgICAgdWludDY0X3Qgc2FkZHIsIHVpbnQ2NF90IGRhZGRyLAorCQkJCSAgICBpbnQgZmxhZywgaW50IG4pCit7CisJdW5zaWduZWQgbG9uZyBzdGFydF9qaWZmaWVzOworCXVuc2lnbmVkIGxvbmcgZW5kX2ppZmZpZXM7CisJc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UgPSBOVUxMOworCWludCBpLCByOworCisJc3RhcnRfamlmZmllcyA9IGppZmZpZXM7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlyID0gcmFkZW9uX2ZlbmNlX2NyZWF0ZShyZGV2LCAmZmVuY2UpOworCQlpZiAocikKKwkJCXJldHVybiByOworCisJCXN3aXRjaCAoZmxhZykgeworCQljYXNlIFJBREVPTl9CRU5DSE1BUktfQ09QWV9ETUE6CisJCQlyID0gcmFkZW9uX2NvcHlfZG1hKHJkZXYsIHNhZGRyLCBkYWRkciwKKwkJCQkJICAgIHNpemUgLyBSQURFT05fR1BVX1BBR0VfU0laRSwKKwkJCQkJICAgIGZlbmNlKTsKKwkJCWJyZWFrOworCQljYXNlIFJBREVPTl9CRU5DSE1BUktfQ09QWV9CTElUOgorCQkJciA9IHJhZGVvbl9jb3B5X2JsaXQocmRldiwgc2FkZHIsIGRhZGRyLAorCQkJCQkgICAgIHNpemUgLyBSQURFT05fR1BVX1BBR0VfU0laRSwKKwkJCQkJICAgICBmZW5jZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiVW5rbm93biBjb3B5IG1ldGhvZFxuIik7CisJCQlyID0gLUVJTlZBTDsKKwkJfQorCQlpZiAocikKKwkJCWdvdG8gZXhpdF9kb19tb3ZlOworCQlyID0gcmFkZW9uX2ZlbmNlX3dhaXQoZmVuY2UsIGZhbHNlKTsKKwkJaWYgKHIpCisJCQlnb3RvIGV4aXRfZG9fbW92ZTsKKwkJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7CisJfQorCWVuZF9qaWZmaWVzID0gamlmZmllczsKKwlyID0gamlmZmllc190b19tc2VjcyhlbmRfamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpOworCitleGl0X2RvX21vdmU6CisJaWYgKGZlbmNlKQorCQlyYWRlb25fZmVuY2VfdW5yZWYoJmZlbmNlKTsKKwlyZXR1cm4gcjsKK30KKworCitzdGF0aWMgdm9pZCByYWRlb25fYmVuY2htYXJrX2xvZ19yZXN1bHRzKGludCBuLCB1bnNpZ25lZCBzaXplLAorCQkJCQkgdW5zaWduZWQgaW50IHRpbWUsCisJCQkJCSB1bnNpZ25lZCBzZG9tYWluLCB1bnNpZ25lZCBkZG9tYWluLAorCQkJCQkgY2hhciAqa2luZCkKK3sKKwl1bnNpZ25lZCBpbnQgdGhyb3VnaHB1dCA9IChuICogKHNpemUgPj4gMTApKSAvIHRpbWU7CisJRFJNX0lORk8oInJhZGVvbjogJXMgJXUgYm8gbW92ZXMgb2YgJXUga0IgZnJvbSIKKwkJICIgJWQgdG8gJWQgaW4gJXUgbXMsIHRocm91Z2hwdXQ6ICV1IE1iL3Mgb3IgJXUgTUIvc1xuIiwKKwkJIGtpbmQsIG4sIHNpemUgPj4gMTAsIHNkb21haW4sIGRkb21haW4sIHRpbWUsCisJCSB0aHJvdWdocHV0ICogOCwgdGhyb3VnaHB1dCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9iZW5jaG1hcmtfbW92ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdW5zaWduZWQgc2l6ZSwKKwkJCQkgIHVuc2lnbmVkIHNkb21haW4sIHVuc2lnbmVkIGRkb21haW4pCiB7CiAJc3RydWN0IHJhZGVvbl9ibyAqZG9iaiA9IE5VTEw7CiAJc3RydWN0IHJhZGVvbl9ibyAqc29iaiA9IE5VTEw7Ci0Jc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UgPSBOVUxMOwogCXVpbnQ2NF90IHNhZGRyLCBkYWRkcjsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X2ppZmZpZXM7Ci0JdW5zaWduZWQgbG9uZyBlbmRfamlmZmllczsKLQl1bnNpZ25lZCBsb25nIHRpbWU7Ci0JdW5zaWduZWQgaSwgbiwgc2l6ZTsKLQlpbnQgcjsKKwlpbnQgciwgbjsKKwlpbnQgdGltZTsKIAotCXNpemUgPSBic2l6ZTsKLQluID0gMTAyNDsKKwluID0gUkFERU9OX0JFTkNITUFSS19JVEVSQVRJT05TOwogCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIHNpemUsIFBBR0VfU0laRSwgdHJ1ZSwgc2RvbWFpbiwgJnNvYmopOwogCWlmIChyKSB7CiAJCWdvdG8gb3V0X2NsZWFudXA7CkBAIC02Nyw2NSArMTI3LDI2IEBACiAJfQogCiAJLyogcjEwMCBkb2Vzbid0IGhhdmUgZG1hIGVuZ2luZSBzbyBza2lwIHRoZSB0ZXN0ICovCi0JaWYgKHJkZXYtPmFzaWMtPmNvcHlfZG1hKSB7Ci0KLQkJc3RhcnRfamlmZmllcyA9IGppZmZpZXM7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXIgPSByYWRlb25fZmVuY2VfY3JlYXRlKHJkZXYsICZmZW5jZSk7Ci0JCQlpZiAocikgewotCQkJCWdvdG8gb3V0X2NsZWFudXA7Ci0JCQl9Ci0KLQkJCXIgPSByYWRlb25fY29weV9kbWEocmRldiwgc2FkZHIsIGRhZGRyLAotCQkJCQlzaXplIC8gUkFERU9OX0dQVV9QQUdFX1NJWkUsIGZlbmNlKTsKLQotCQkJaWYgKHIpIHsKLQkJCQlnb3RvIG91dF9jbGVhbnVwOwotCQkJfQotCQkJciA9IHJhZGVvbl9mZW5jZV93YWl0KGZlbmNlLCBmYWxzZSk7Ci0JCQlpZiAocikgewotCQkJCWdvdG8gb3V0X2NsZWFudXA7Ci0JCQl9Ci0JCQlyYWRlb25fZmVuY2VfdW5yZWYoJmZlbmNlKTsKLQkJfQotCQllbmRfamlmZmllcyA9IGppZmZpZXM7Ci0JCXRpbWUgPSBlbmRfamlmZmllcyAtIHN0YXJ0X2ppZmZpZXM7Ci0JCXRpbWUgPSBqaWZmaWVzX3RvX21zZWNzKHRpbWUpOwotCQlpZiAodGltZSA+IDApIHsKLQkJCWkgPSAoKG4gKiBzaXplKSA+PiAxMCkgLyB0aW1lOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFkZW9uOiBkbWEgJXUgYm8gbW92ZXMgb2YgJXVrYiBmcm9tIgotCQkJCQkiICVkIHRvICVkIGluICVsdW1zICgldWtiL21zICV1a2IvcyAldU0vcylcbiIsCi0JCQkJCW4sIHNpemUgPj4gMTAsCi0JCQkJCXNkb21haW4sIGRkb21haW4sIHRpbWUsCi0JCQkJCWksIGkgKiAxMDAwLCAoaSAqIDEwMDApIC8gMTAyNCk7Ci0JCX0KKwkvKiBhbHNvLCBWUkFNLXRvLVZSQU0gdGVzdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSBmb3IgRE1BICovCisJLyogc2tpcCBpdCBhcyB3ZWxsIGlmIGRvbWFpbnMgYXJlIHRoZSBzYW1lICovCisJaWYgKChyZGV2LT5hc2ljLT5jb3B5X2RtYSkgJiYgKHNkb21haW4gIT0gZGRvbWFpbikpIHsKKwkJdGltZSA9IHJhZGVvbl9iZW5jaG1hcmtfZG9fbW92ZShyZGV2LCBzaXplLCBzYWRkciwgZGFkZHIsCisJCQkJCQlSQURFT05fQkVOQ0hNQVJLX0NPUFlfRE1BLCBuKTsKKwkJaWYgKHRpbWUgPCAwKQorCQkJZ290byBvdXRfY2xlYW51cDsKKwkJaWYgKHRpbWUgPiAwKQorCQkJcmFkZW9uX2JlbmNobWFya19sb2dfcmVzdWx0cyhuLCBzaXplLCB0aW1lLAorCQkJCQkJICAgICBzZG9tYWluLCBkZG9tYWluLCAiZG1hIik7CiAJfQogCi0Jc3RhcnRfamlmZmllcyA9IGppZmZpZXM7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlyID0gcmFkZW9uX2ZlbmNlX2NyZWF0ZShyZGV2LCAmZmVuY2UpOwotCQlpZiAocikgewotCQkJZ290byBvdXRfY2xlYW51cDsKLQkJfQotCQlyID0gcmFkZW9uX2NvcHlfYmxpdChyZGV2LCBzYWRkciwgZGFkZHIsIHNpemUgLyBSQURFT05fR1BVX1BBR0VfU0laRSwgZmVuY2UpOwotCQlpZiAocikgewotCQkJZ290byBvdXRfY2xlYW51cDsKLQkJfQotCQlyID0gcmFkZW9uX2ZlbmNlX3dhaXQoZmVuY2UsIGZhbHNlKTsKLQkJaWYgKHIpIHsKLQkJCWdvdG8gb3V0X2NsZWFudXA7Ci0JCX0KLQkJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7Ci0JfQotCWVuZF9qaWZmaWVzID0gamlmZmllczsKLQl0aW1lID0gZW5kX2ppZmZpZXMgLSBzdGFydF9qaWZmaWVzOwotCXRpbWUgPSBqaWZmaWVzX3RvX21zZWNzKHRpbWUpOwotCWlmICh0aW1lID4gMCkgewotCQlpID0gKChuICogc2l6ZSkgPj4gMTApIC8gdGltZTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicmFkZW9uOiBibGl0ICV1IGJvIG1vdmVzIG9mICV1a2IgZnJvbSAlZCB0byAlZCIKLQkJICAgICAgICIgaW4gJWx1bXMgKCV1a2IvbXMgJXVrYi9zICV1TS9zKVxuIiwgbiwgc2l6ZSA+PiAxMCwKLQkJICAgICAgIHNkb21haW4sIGRkb21haW4sIHRpbWUsIGksIGkgKiAxMDAwLCAoaSAqIDEwMDApIC8gMTAyNCk7Ci0JfQorCXRpbWUgPSByYWRlb25fYmVuY2htYXJrX2RvX21vdmUocmRldiwgc2l6ZSwgc2FkZHIsIGRhZGRyLAorCQkJCQlSQURFT05fQkVOQ0hNQVJLX0NPUFlfQkxJVCwgbik7CisJaWYgKHRpbWUgPCAwKQorCQlnb3RvIG91dF9jbGVhbnVwOworCWlmICh0aW1lID4gMCkKKwkJcmFkZW9uX2JlbmNobWFya19sb2dfcmVzdWx0cyhuLCBzaXplLCB0aW1lLAorCQkJCQkgICAgIHNkb21haW4sIGRkb21haW4sICJibGl0Iik7CisKIG91dF9jbGVhbnVwOgogCWlmIChzb2JqKSB7CiAJCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShzb2JqLCBmYWxzZSk7CkBAIC0xNDMsMTggKzE2NCw5MiBAQAogCQl9CiAJCXJhZGVvbl9ib191bnJlZigmZG9iaik7CiAJfQotCWlmIChmZW5jZSkgewotCQlyYWRlb25fZmVuY2VfdW5yZWYoJmZlbmNlKTsKLQl9CisKIAlpZiAocikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciB3aGlsZSBiZW5jaG1hcmtpbmcgQk8gbW92ZS5cbiIpOworCQlEUk1fRVJST1IoIkVycm9yIHdoaWxlIGJlbmNobWFya2luZyBCTyBtb3ZlLlxuIik7CiAJfQogfQogCi12b2lkIHJhZGVvbl9iZW5jaG1hcmsoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit2b2lkIHJhZGVvbl9iZW5jaG1hcmsoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCB0ZXN0X251bWJlcikKIHsKLQlyYWRlb25fYmVuY2htYXJrX21vdmUocmRldiwgMTAyNCoxMDI0LCBSQURFT05fR0VNX0RPTUFJTl9HVFQsCi0JCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNKTsKLQlyYWRlb25fYmVuY2htYXJrX21vdmUocmRldiwgMTAyNCoxMDI0LCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAotCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fR1RUKTsKKwlpbnQgaTsKKwlpbnQgY29tbW9uX21vZGVzW1JBREVPTl9CRU5DSE1BUktfQ09NTU9OX01PREVTX05dID0geworCQk2NDAgKiA0ODAgKiA0LAorCQk3MjAgKiA0ODAgKiA0LAorCQk4MDAgKiA2MDAgKiA0LAorCQk4NDggKiA0ODAgKiA0LAorCQkxMDI0ICogNzY4ICogNCwKKwkJMTE1MiAqIDc2OCAqIDQsCisJCTEyODAgKiA3MjAgKiA0LAorCQkxMjgwICogODAwICogNCwKKwkJMTI4MCAqIDg1NCAqIDQsCisJCTEyODAgKiA5NjAgKiA0LAorCQkxMjgwICogMTAyNCAqIDQsCisJCTE0NDAgKiA5MDAgKiA0LAorCQkxNDAwICogMTA1MCAqIDQsCisJCTE2ODAgKiAxMDUwICogNCwKKwkJMTYwMCAqIDEyMDAgKiA0LAorCQkxOTIwICogMTA4MCAqIDQsCisJCTE5MjAgKiAxMjAwICogNAorCX07CisKKwlzd2l0Y2ggKHRlc3RfbnVtYmVyKSB7CisJY2FzZSAxOgorCQkvKiBzaW1wbGUgdGVzdCwgVlJBTSB0byBHVFQgYW5kIEdUVCB0byBWUkFNICovCisJCXJhZGVvbl9iZW5jaG1hcmtfbW92ZShyZGV2LCAxMDI0KjEwMjQsIFJBREVPTl9HRU1fRE9NQUlOX0dUVCwKKwkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNKTsKKwkJcmFkZW9uX2JlbmNobWFya19tb3ZlKHJkZXYsIDEwMjQqMTAyNCwgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKKwkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9HVFQpOworCQlicmVhazsKKwljYXNlIDI6CisJCS8qIHNpbXBsZSB0ZXN0LCBWUkFNIHRvIFZSQU0gKi8KKwkJcmFkZW9uX2JlbmNobWFya19tb3ZlKHJkZXYsIDEwMjQqMTAyNCwgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKKwkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKiBHVFQgdG8gVlJBTSwgYnVmZmVyIHNpemUgc3dlZXAsIHBvd2VycyBvZiAyICovCisJCWZvciAoaSA9IDE7IGkgPD0gNjU1MzY7IGkgPDw9IDEpCisJCQlyYWRlb25fYmVuY2htYXJrX21vdmUocmRldiwgaSoxMDI0LAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9HVFQsCisJCQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0pOworCQlicmVhazsKKwljYXNlIDQ6CisJCS8qIFZSQU0gdG8gR1RULCBidWZmZXIgc2l6ZSBzd2VlcCwgcG93ZXJzIG9mIDIgKi8KKwkJZm9yIChpID0gMTsgaSA8PSA2NTUzNjsgaSA8PD0gMSkKKwkJCXJhZGVvbl9iZW5jaG1hcmtfbW92ZShyZGV2LCBpKjEwMjQsCisJCQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCisJCQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX0dUVCk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJLyogVlJBTSB0byBWUkFNLCBidWZmZXIgc2l6ZSBzd2VlcCwgcG93ZXJzIG9mIDIgKi8KKwkJZm9yIChpID0gMTsgaSA8PSA2NTUzNjsgaSA8PD0gMSkKKwkJCXJhZGVvbl9iZW5jaG1hcmtfbW92ZShyZGV2LCBpKjEwMjQsCisJCQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCisJCQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0pOworCQlicmVhazsKKwljYXNlIDY6CisJCS8qIEdUVCB0byBWUkFNLCBidWZmZXIgc2l6ZSBzd2VlcCwgY29tbW9uIG1vZGVzICovCisJCWZvciAoaSA9IDE7IGkgPCBSQURFT05fQkVOQ0hNQVJLX0NPTU1PTl9NT0RFU19OOyBpKyspCisJCQlyYWRlb25fYmVuY2htYXJrX21vdmUocmRldiwgY29tbW9uX21vZGVzW2ldLAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9HVFQsCisJCQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0pOworCQlicmVhazsKKwljYXNlIDc6CisJCS8qIFZSQU0gdG8gR1RULCBidWZmZXIgc2l6ZSBzd2VlcCwgY29tbW9uIG1vZGVzICovCisJCWZvciAoaSA9IDE7IGkgPCBSQURFT05fQkVOQ0hNQVJLX0NPTU1PTl9NT0RFU19OOyBpKyspCisJCQlyYWRlb25fYmVuY2htYXJrX21vdmUocmRldiwgY29tbW9uX21vZGVzW2ldLAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9HVFQpOworCQlicmVhazsKKwljYXNlIDg6CisJCS8qIFZSQU0gdG8gVlJBTSwgYnVmZmVyIHNpemUgc3dlZXAsIGNvbW1vbiBtb2RlcyAqLworCQlmb3IgKGkgPSAxOyBpIDwgUkFERU9OX0JFTkNITUFSS19DT01NT05fTU9ERVNfTjsgaSsrKQorCQkJcmFkZW9uX2JlbmNobWFya19tb3ZlKHJkZXYsIGNvbW1vbl9tb2Rlc1tpXSwKKwkJCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKKwkJCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fVlJBTSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbmtub3duIGJlbmNobWFya1xuIik7CisJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCmluZGV4IDYzNjc1MjQuLjgxZmMxMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKQEAgLTYyMCw4ICs2MjAsOCBAQAogCQlpMmMueV9kYXRhX21hc2sgPSAweDgwOwogCX0gZWxzZSB7CiAJCS8qIGRlZmF1bHQgbWFza3MgZm9yIGRkYyBwYWRzICovCi0JCWkyYy5tYXNrX2Nsa19tYXNrID0gUkFERU9OX0dQSU9fRU5fMTsKLQkJaTJjLm1hc2tfZGF0YV9tYXNrID0gUkFERU9OX0dQSU9fRU5fMDsKKwkJaTJjLm1hc2tfY2xrX21hc2sgPSBSQURFT05fR1BJT19NQVNLXzE7CisJCWkyYy5tYXNrX2RhdGFfbWFzayA9IFJBREVPTl9HUElPX01BU0tfMDsKIAkJaTJjLmFfY2xrX21hc2sgPSBSQURFT05fR1BJT19BXzE7CiAJCWkyYy5hX2RhdGFfbWFzayA9IFJBREVPTl9HUElPX0FfMDsKIAkJaTJjLmVuX2Nsa19tYXNrID0gUkFERU9OX0dQSU9fRU5fMTsKQEAgLTI1NjMsMTQgKzI1NjMsMTcgQEAKIAogCS8qIGFsbG9jYXRlIDIgcG93ZXIgc3RhdGVzICovCiAJcmRldi0+cG0ucG93ZXJfc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3Bvd2VyX3N0YXRlKSAqIDIsIEdGUF9LRVJORUwpOwotCWlmICghcmRldi0+cG0ucG93ZXJfc3RhdGUpIHsKLQkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IHN0YXRlX2luZGV4OwotCQlyZGV2LT5wbS5udW1fcG93ZXJfc3RhdGVzID0gMDsKLQotCQlyZGV2LT5wbS5jdXJyZW50X3Bvd2VyX3N0YXRlX2luZGV4ID0gcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleDsKLQkJcmRldi0+cG0uY3VycmVudF9jbG9ja19tb2RlX2luZGV4ID0gMDsKLQkJcmV0dXJuOwotCX0KKwlpZiAocmRldi0+cG0ucG93ZXJfc3RhdGUpIHsKKwkJLyogYWxsb2NhdGUgMSBjbG9jayBtb2RlIHBlciBzdGF0ZSAqLworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVswXS5jbG9ja19pbmZvID0KKwkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fcG1fY2xvY2tfaW5mbykgKiAxLCBHRlBfS0VSTkVMKTsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbMV0uY2xvY2tfaW5mbyA9CisJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8pICogMSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0uY2xvY2tfaW5mbyB8fAorCQkgICAgIXJkZXYtPnBtLnBvd2VyX3N0YXRlWzFdLmNsb2NrX2luZm8pCisJCQlnb3RvIHBtX2ZhaWxlZDsKKwl9IGVsc2UKKwkJZ290byBwbV9mYWlsZWQ7CiAKIAkvKiBjaGVjayBmb3IgYSB0aGVybWFsIGNoaXAgKi8KIAlvZmZzZXQgPSBjb21iaW9zX2dldF90YWJsZV9vZmZzZXQoZGV2LCBDT01CSU9TX09WRVJEUklWRV9JTkZPX1RBQkxFKTsKQEAgLTI3MzUsNiArMjczOCwxNCBAQAogCiAJcmRldi0+cG0uY3VycmVudF9wb3dlcl9zdGF0ZV9pbmRleCA9IHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXg7CiAJcmRldi0+cG0uY3VycmVudF9jbG9ja19tb2RlX2luZGV4ID0gMDsKKwlyZXR1cm47CisKK3BtX2ZhaWxlZDoKKwlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7CisJcmRldi0+cG0ubnVtX3Bvd2VyX3N0YXRlcyA9IDA7CisKKwlyZGV2LT5wbS5jdXJyZW50X3Bvd2VyX3N0YXRlX2luZGV4ID0gcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleDsKKwlyZGV2LT5wbS5jdXJyZW50X2Nsb2NrX21vZGVfaW5kZXggPSAwOwogfQogCiB2b2lkIHJhZGVvbl9leHRlcm5hbF90bWRzX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwppbmRleCA0NDljM2Q4Li5lN2NiM2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCkBAIC00NCw4ICs0NCw2IEBACiByYWRlb25fbGVnYWN5X2JhY2tsaWdodF9pbml0KHN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIsCiAJCQkgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpkcm1fY29ubmVjdG9yKTsKIAotYm9vbCByYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfZHBfYnJpZGdlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwotCiB2b2lkIHJhZGVvbl9jb25uZWN0b3JfaG90cGx1ZyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKQEAgLTQzMiw1NSArNDMwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFNvbWUgaW50ZWdyYXRlZCBBVEkgUmFkZW9uIGNoaXBzZXQgaW1wbGVtZW50YXRpb25zIChlLiBnLgotICogQXN1cyBNMkEtVk0gSERNSSkgbWF5IGluZGljYXRlIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBEREMsCi0gKiBldmVuIHdoZW4gdGhlcmUncyBubyBtb25pdG9yIGNvbm5lY3RlZC4gRm9yIHRoZXNlIGNvbm5lY3RvcnMKLSAqIGZvbGxvd2luZyBEREMgcHJvYmUgZXh0ZW5zaW9uIHdpbGwgYmUgYXBwbGllZDogY2hlY2sgYWxzbyBmb3IgdGhlCi0gKiBhdmFpbGFiaWxpdHkgb2YgRURJRCB3aXRoIGF0IGxlYXN0IGEgY29ycmVjdCBFRElEIGhlYWRlci4gT25seSB0aGVuLAotICogRERDIGlzIGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlLiBUaGlzIHByZXZlbnRzIGRybV9nZXRfZWRpZCgpIGFuZAotICogZHJtX2VkaWRfYmxvY2tfdmFsaWQoKSBmcm9tIHBlcmlvZGljYWxseSBkdW1waW5nIGRhdGEgYW5kIGtlcm5lbAotICogZXJyb3JzIGludG8gdGhlIGxvZ3MgYW5kIG9udG8gdGhlIHRlcm1pbmFsLgotICovCi1zdGF0aWMgYm9vbCByYWRlb25fY29ubmVjdG9yX25lZWRzX2V4dGVuZGVkX3Byb2JlKHN0cnVjdCByYWRlb25fZGV2aWNlICpkZXYsCi0JCQkJICAgICB1aW50MzJfdCBzdXBwb3J0ZWRfZGV2aWNlLAotCQkJCSAgICAgaW50IGNvbm5lY3Rvcl90eXBlKQotewotCS8qIEFzdXMgTTJBLVZNIEhETUkgYm9hcmQgc2VuZHMgZGF0YSB0byBpMmMgYnVzIGV2ZW4sCi0JICogaWYgSERNSSBhZGQtb24gY2FyZCBpcyBub3QgcGx1Z2dlZCBpbiBvciBIRE1JIGlzIGRpc2FibGVkIGluCi0JICogQklPUy4gVmFsaWQgRERDIGNhbiBvbmx5IGJlIGFzc3VtZWQsIGlmIGFsc28gYSB2YWxpZCBFRElEIGhlYWRlcgotCSAqIGNhbiBiZSByZXRyaWV2ZWQgdmlhIGkyYyBidXMgZHVyaW5nIEREQyBwcm9iZSAqLwotCWlmICgoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg3OTFlKSAmJgotCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTA0MykgJiYKLQkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDgyNmQpKSB7Ci0JCWlmICgoY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0hETUlBKSAmJgotCQkgICAgKHN1cHBvcnRlZF9kZXZpY2UgPT0gQVRPTV9ERVZJQ0VfREZQMl9TVVBQT1JUKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQkvKiBFQ1MgQTc0MEdNLU0gd2l0aCBBVEkgUkFERU9OIDIxMDAgc2VuZHMgZGF0YSB0byBpMmMgYnVzCi0JICogZm9yIGEgRFZJIGNvbm5lY3RvciB0aGF0IGlzIG5vdCBpbXBsZW1lbnRlZCAqLwotCWlmICgoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg3OTZlKSAmJgotCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAxOSkgJiYKLQkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDI2MTUpKSB7Ci0JCWlmICgoY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUQpICYmCi0JCSAgICAoc3VwcG9ydGVkX2RldmljZSA9PSBBVE9NX0RFVklDRV9ERlAyX1NVUFBPUlQpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIFRPU0hJQkEgU2F0ZWxsaXRlIEwzMDBEIHdpdGggQVRJIE1vYmlsaXR5IFJhZGVvbiB4MTEwMAotCSAqIChSUzY5ME0pIHNlbmRzIGRhdGEgdG8gaTJjIGJ1cyBmb3IgYSBIRE1JIGNvbm5lY3RvciB0aGF0Ci0JICogaXMgbm90IGltcGxlbWVudGVkICovCi0JaWYgKChkZXYtPnBkZXYtPmRldmljZSA9PSAweDc5MWYpICYmCi0JICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMTc5KSAmJgotCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4ZmY2OCkpIHsKLQkJaWYgKChjb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEpICYmCi0JCSAgICAoc3VwcG9ydGVkX2RldmljZSA9PSBBVE9NX0RFVklDRV9ERlAyX1NVUFBPUlQpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogRGVmYXVsdDogbm8gRURJRCBoZWFkZXIgcHJvYmUgcmVxdWlyZWQgZm9yIEREQyBwcm9iaW5nICovCi0JcmV0dXJuIGZhbHNlOwotfQotCiBzdGF0aWMgdm9pZCByYWRlb25fZml4dXBfbHZkc19uYXRpdmVfbW9kZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCiAJCQkJCSAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKQEAgLTcyMSw5ICs2NzAsOSBAQAogCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIAogCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzKQotCQlkcmV0ID0gcmFkZW9uX2RkY19wcm9iZShyYWRlb25fY29ubmVjdG9yLAotCQkJCQlyYWRlb25fY29ubmVjdG9yLT5yZXF1aXJlc19leHRlbmRlZF9wcm9iZSk7CisJCWRyZXQgPSByYWRlb25fZGRjX3Byb2JlKHJhZGVvbl9jb25uZWN0b3IpOwogCWlmIChkcmV0KSB7CisJCXJhZGVvbl9jb25uZWN0b3ItPmRldGVjdGVkX2J5X2xvYWQgPSBmYWxzZTsKIAkJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpIHsKIAkJCWtmcmVlKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpOwogCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCA9IE5VTEw7CkBAIC03NTAsMTIgKzY5OSwyMSBAQAogCX0gZWxzZSB7CiAKIAkJLyogaWYgd2UgYXJlbid0IGZvcmNpbmcgZG9uJ3QgZG8gZGVzdHJ1Y3RpdmUgcG9sbGluZyAqLwotCQlpZiAoIWZvcmNlKQotCQkJcmV0dXJuIGNvbm5lY3Rvci0+c3RhdHVzOworCQlpZiAoIWZvcmNlKSB7CisJCQkvKiBvbmx5IHJldHVybiB0aGUgcHJldmlvdXMgc3RhdHVzIGlmIHdlIGxhc3QKKwkJCSAqIGRldGVjdGVkIGEgbW9uaXRvciB2aWEgbG9hZC4KKwkJCSAqLworCQkJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldGVjdGVkX2J5X2xvYWQpCisJCQkJcmV0dXJuIGNvbm5lY3Rvci0+c3RhdHVzOworCQkJZWxzZQorCQkJCXJldHVybiByZXQ7CisJCX0KIAogCQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0ICYmIGVuY29kZXIpIHsKIAkJCWVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKIAkJCXJldCA9IGVuY29kZXJfZnVuY3MtPmRldGVjdChlbmNvZGVyLCBjb25uZWN0b3IpOworCQkJaWYgKHJldCAhPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZCkKKwkJCQlyYWRlb25fY29ubmVjdG9yLT5kZXRlY3RlZF9ieV9sb2FkID0gdHJ1ZTsKIAkJfQogCX0KIApAQCAtODk0LDkgKzg1Miw5IEBACiAJYm9vbCBkcmV0ID0gZmFsc2U7CiAKIAlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKLQkJZHJldCA9IHJhZGVvbl9kZGNfcHJvYmUocmFkZW9uX2Nvbm5lY3RvciwKLQkJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+cmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmUpOworCQlkcmV0ID0gcmFkZW9uX2RkY19wcm9iZShyYWRlb25fY29ubmVjdG9yKTsKIAlpZiAoZHJldCkgeworCQlyYWRlb25fY29ubmVjdG9yLT5kZXRlY3RlZF9ieV9sb2FkID0gZmFsc2U7CiAJCWlmIChyYWRlb25fY29ubmVjdG9yLT5lZGlkKSB7CiAJCQlrZnJlZShyYWRlb25fY29ubmVjdG9yLT5lZGlkKTsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBOVUxMOwpAQCAtOTU5LDggKzkxNywxOCBAQAogCWlmICgocmV0ID09IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkKSAmJiAocmFkZW9uX2Nvbm5lY3Rvci0+dXNlX2RpZ2l0YWwgPT0gdHJ1ZSkpCiAJCWdvdG8gb3V0OwogCisJLyogRFZJLUQgYW5kIEhETUktQSBhcmUgZGlnaXRhbCBvbmx5ICovCisJaWYgKChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEKSB8fAorCSAgICAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEpKQorCQlnb3RvIG91dDsKKworCS8qIGlmIHdlIGFyZW4ndCBmb3JjaW5nIGRvbid0IGRvIGRlc3RydWN0aXZlIHBvbGxpbmcgKi8KIAlpZiAoIWZvcmNlKSB7Ci0JCXJldCA9IGNvbm5lY3Rvci0+c3RhdHVzOworCQkvKiBvbmx5IHJldHVybiB0aGUgcHJldmlvdXMgc3RhdHVzIGlmIHdlIGxhc3QKKwkJICogZGV0ZWN0ZWQgYSBtb25pdG9yIHZpYSBsb2FkLgorCQkgKi8KKwkJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldGVjdGVkX2J5X2xvYWQpCisJCQlyZXQgPSBjb25uZWN0b3ItPnN0YXR1czsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC05ODUsNiArOTUzLDggQEAKIAkJCQkJaWYgKHJldCA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkgewogCQkJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+dXNlX2RpZ2l0YWwgPSBmYWxzZTsKIAkJCQkJfQorCQkJCQlpZiAocmV0ICE9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkKQorCQkJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGV0ZWN0ZWRfYnlfbG9hZCA9IHRydWU7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTE4MSw3ICsxMTUxLDggQEAKIAkJfQogCX0gZWxzZSB7CiAJCS8qIG5lZWQgdG8gc2V0dXAgZGRjIG9uIHRoZSBicmlkZ2UgKi8KLQkJaWYgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2UoY29ubmVjdG9yKSkgeworCQlpZiAocmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChjb25uZWN0b3IpICE9CisJCQlFTkNPREVSX09CSkVDVF9JRF9OT05FKSB7CiAJCQlpZiAoZW5jb2RlcikKIAkJCQlyYWRlb25fYXRvbV9leHRfZW5jb2Rlcl9zZXR1cF9kZGMoZW5jb2Rlcik7CiAJCX0KQEAgLTExOTEsMTMgKzExNjIsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1ib29sIHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2Uoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3UxNiByYWRlb25fY29ubmVjdG9yX2VuY29kZXJfZ2V0X2RwX2JyaWRnZV9lbmNvZGVyX2lkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKIAlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyOwogCWludCBpOwotCWJvb2wgZm91bmQgPSBmYWxzZTsKIAogCWZvciAoaSA9IDA7IGkgPCBEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSOyBpKyspIHsKIAkJaWYgKGNvbm5lY3Rvci0+ZW5jb2Rlcl9pZHNbaV0gPT0gMCkKQEAgLTEyMTMsMTQgKzExODMsMTMgQEAKIAkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewogCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX1RSQVZJUzoKIAkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9OVVRNRUc6Ci0JCQlmb3VuZCA9IHRydWU7Ci0JCQlicmVhazsKKwkJCXJldHVybiByYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZDsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JcmV0dXJuIGZvdW5kOworCXJldHVybiBFTkNPREVSX09CSkVDVF9JRF9OT05FOwogfQogCiBib29sIHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19oYnIyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCkBAIC0xMjk3LDcgKzEyNjYsOCBAQAogCQlpZiAoIXJhZGVvbl9kaWdfY29ubmVjdG9yLT5lZHBfb24pCiAJCQlhdG9tYmlvc19zZXRfZWRwX3BhbmVsX3Bvd2VyKGNvbm5lY3RvciwKIAkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT0ZGKTsKLQl9IGVsc2UgaWYgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2UoY29ubmVjdG9yKSkgeworCX0gZWxzZSBpZiAocmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChjb25uZWN0b3IpICE9CisJCSAgIEVOQ09ERVJfT0JKRUNUX0lEX05PTkUpIHsKIAkJLyogRFAgYnJpZGdlcyBhcmUgYWx3YXlzIERQICovCiAJCXJhZGVvbl9kaWdfY29ubmVjdG9yLT5kcF9zaW5rX3R5cGUgPSBDT05ORUNUT1JfT0JKRUNUX0lEX0RJU1BMQVlQT1JUOwogCQkvKiBnZXQgdGhlIERQQ0QgZnJvbSB0aGUgYnJpZGdlICovCkBAIC0xMzA2LDggKzEyNzYsNyBAQAogCQlpZiAoZW5jb2RlcikgewogCQkJLyogc2V0dXAgZGRjIG9uIHRoZSBicmlkZ2UgKi8KIAkJCXJhZGVvbl9hdG9tX2V4dF9lbmNvZGVyX3NldHVwX2RkYyhlbmNvZGVyKTsKLQkJCWlmIChyYWRlb25fZGRjX3Byb2JlKHJhZGVvbl9jb25uZWN0b3IsCi0JCQkJCSAgICAgcmFkZW9uX2Nvbm5lY3Rvci0+cmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmUpKSAvKiB0cnkgRERDICovCisJCQlpZiAocmFkZW9uX2RkY19wcm9iZShyYWRlb25fY29ubmVjdG9yKSkgLyogdHJ5IEREQyAqLwogCQkJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogCQkJZWxzZSBpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGFjX2xvYWRfZGV0ZWN0KSB7IC8qIHRyeSBsb2FkIGRldGVjdGlvbiAqLwogCQkJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKQEAgLTEzMjUsOCArMTI5NCw3IEBACiAJCQkJaWYgKHJhZGVvbl9kcF9nZXRkcGNkKHJhZGVvbl9jb25uZWN0b3IpKQogCQkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJhZGVvbl9kZGNfcHJvYmUocmFkZW9uX2Nvbm5lY3RvciwKLQkJCQkJCSAgICAgcmFkZW9uX2Nvbm5lY3Rvci0+cmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmUpKQorCQkJCWlmIChyYWRlb25fZGRjX3Byb2JlKHJhZGVvbl9jb25uZWN0b3IpKQogCQkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAkJCX0KIAkJfQpAQCAtMTQ3MSw5ICsxNDM5LDcgQEAKIAlyYWRlb25fY29ubmVjdG9yLT5zaGFyZWRfZGRjID0gc2hhcmVkX2RkYzsKIAlyYWRlb25fY29ubmVjdG9yLT5jb25uZWN0b3Jfb2JqZWN0X2lkID0gY29ubmVjdG9yX29iamVjdF9pZDsKIAlyYWRlb25fY29ubmVjdG9yLT5ocGQgPSAqaHBkOwotCXJhZGVvbl9jb25uZWN0b3ItPnJlcXVpcmVzX2V4dGVuZGVkX3Byb2JlID0KLQkJcmFkZW9uX2Nvbm5lY3Rvcl9uZWVkc19leHRlbmRlZF9wcm9iZShyZGV2LCBzdXBwb3J0ZWRfZGV2aWNlLAotCQkJCQkJCWNvbm5lY3Rvcl90eXBlKTsKKwogCXJhZGVvbl9jb25uZWN0b3ItPnJvdXRlciA9ICpyb3V0ZXI7CiAJaWYgKHJvdXRlci0+ZGRjX3ZhbGlkIHx8IHJvdXRlci0+Y2RfdmFsaWQpIHsKIAkJcmFkZW9uX2Nvbm5lY3Rvci0+cm91dGVyX2J1cyA9IHJhZGVvbl9pMmNfbG9va3VwKHJkZXYsICZyb3V0ZXItPmkyY19pbmZvKTsKQEAgLTE4MjAsOSArMTc4Niw3IEBACiAJcmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyA9IHN1cHBvcnRlZF9kZXZpY2U7CiAJcmFkZW9uX2Nvbm5lY3Rvci0+Y29ubmVjdG9yX29iamVjdF9pZCA9IGNvbm5lY3Rvcl9vYmplY3RfaWQ7CiAJcmFkZW9uX2Nvbm5lY3Rvci0+aHBkID0gKmhwZDsKLQlyYWRlb25fY29ubmVjdG9yLT5yZXF1aXJlc19leHRlbmRlZF9wcm9iZSA9Ci0JCXJhZGVvbl9jb25uZWN0b3JfbmVlZHNfZXh0ZW5kZWRfcHJvYmUocmRldiwgc3VwcG9ydGVkX2RldmljZSwKLQkJCQkJCQljb25uZWN0b3JfdHlwZSk7CisKIAlzd2l0Y2ggKGNvbm5lY3Rvcl90eXBlKSB7CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBOgogCQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCAmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl92Z2FfY29ubmVjdG9yX2Z1bmNzLCBjb25uZWN0b3JfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3AuYwppbmRleCAwNDVlYzU5Li43MmFlODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NwLmMKQEAgLTI5LDYgKzI5LDggQEAKICAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAiZHJtX3NhcmVhLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYwppbmRleCBmYWUwMGMwLi5jY2FhMjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCXN0cnVjdCByYWRlb25fY3NfY2h1bmsgKmliX2NodW5rOwogCWludCByOwogCi0JbXV0ZXhfbG9jaygmcmRldi0+Y3NfbXV0ZXgpOworCXJhZGVvbl9tdXRleF9sb2NrKCZyZGV2LT5jc19tdXRleCk7CiAJLyogaW5pdGlhbGl6ZSBwYXJzZXIgKi8KIAltZW1zZXQoJnBhcnNlciwgMCwgc2l6ZW9mKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyKSk7CiAJcGFyc2VyLmZpbHAgPSBmaWxwOwpAQCAtMjMzLDE0ICsyMzMsMTQgQEAKIAlpZiAocikgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBpbml0aWFsaXplIHBhcnNlciAhXG4iKTsKIAkJcmFkZW9uX2NzX3BhcnNlcl9maW5pKCZwYXJzZXIsIHIpOwotCQltdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKKwkJcmFkZW9uX211dGV4X3VubG9jaygmcmRldi0+Y3NfbXV0ZXgpOwogCQlyZXR1cm4gcjsKIAl9CiAJciA9ICByYWRlb25faWJfZ2V0KHJkZXYsICZwYXJzZXIuaWIpOwogCWlmIChyKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIGdldCBpYiAhXG4iKTsKIAkJcmFkZW9uX2NzX3BhcnNlcl9maW5pKCZwYXJzZXIsIHIpOwotCQltdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKKwkJcmFkZW9uX211dGV4X3VubG9jaygmcmRldi0+Y3NfbXV0ZXgpOwogCQlyZXR1cm4gcjsKIAl9CiAJciA9IHJhZGVvbl9jc19wYXJzZXJfcmVsb2NzKCZwYXJzZXIpOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCWlmIChyICE9IC1FUkVTVEFSVFNZUykKIAkJCURSTV9FUlJPUigiRmFpbGVkIHRvIHBhcnNlIHJlbG9jYXRpb24gJWQhXG4iLCByKTsKIAkJcmFkZW9uX2NzX3BhcnNlcl9maW5pKCZwYXJzZXIsIHIpOwotCQltdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKKwkJcmFkZW9uX211dGV4X3VubG9jaygmcmRldi0+Y3NfbXV0ZXgpOwogCQlyZXR1cm4gcjsKIAl9CiAJLyogQ29weSB0aGUgcGFja2V0IGludG8gdGhlIElCLCB0aGUgcGFyc2VyIHdpbGwgcmVhZCBmcm9tIHRoZQpAQCAtMjYwLDE0ICsyNjAsMTQgQEAKIAlpZiAociB8fCBwYXJzZXIucGFyc2VyX2Vycm9yKSB7CiAJCURSTV9FUlJPUigiSW52YWxpZCBjb21tYW5kIHN0cmVhbSAhXG4iKTsKIAkJcmFkZW9uX2NzX3BhcnNlcl9maW5pKCZwYXJzZXIsIHIpOwotCQltdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKKwkJcmFkZW9uX211dGV4X3VubG9jaygmcmRldi0+Y3NfbXV0ZXgpOwogCQlyZXR1cm4gcjsKIAl9CiAJciA9IHJhZGVvbl9jc19maW5pc2hfcGFnZXMoJnBhcnNlcik7CiAJaWYgKHIpIHsKIAkJRFJNX0VSUk9SKCJJbnZhbGlkIGNvbW1hbmQgc3RyZWFtICFcbiIpOwogCQlyYWRlb25fY3NfcGFyc2VyX2ZpbmkoJnBhcnNlciwgcik7Ci0JCW11dGV4X3VubG9jaygmcmRldi0+Y3NfbXV0ZXgpOworCQlyYWRlb25fbXV0ZXhfdW5sb2NrKCZyZGV2LT5jc19tdXRleCk7CiAJCXJldHVybiByOwogCX0KIAlyID0gcmFkZW9uX2liX3NjaGVkdWxlKHJkZXYsIHBhcnNlci5pYik7CkBAIC0yNzUsNyArMjc1LDcgQEAKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gc2NoZWR1bGUgSUIgIVxuIik7CiAJfQogCXJhZGVvbl9jc19wYXJzZXJfZmluaSgmcGFyc2VyLCByKTsKLQltdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKKwlyYWRlb25fbXV0ZXhfdW5sb2NrKCZyZGV2LT5jc19tdXRleCk7CiAJcmV0dXJuIHI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKaW5kZXggYjUxZTE1Ny4uYzRkMDBhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKQEAgLTcxNiw3ICs3MTYsNyBAQAogCiAJLyogbXV0ZXggaW5pdGlhbGl6YXRpb24gYXJlIGFsbCBkb25lIGhlcmUgc28gd2UKIAkgKiBjYW4gcmVjYWxsIGZ1bmN0aW9uIHdpdGhvdXQgaGF2aW5nIGxvY2tpbmcgaXNzdWVzICovCi0JbXV0ZXhfaW5pdCgmcmRldi0+Y3NfbXV0ZXgpOworCXJhZGVvbl9tdXRleF9pbml0KCZyZGV2LT5jc19tdXRleCk7CiAJbXV0ZXhfaW5pdCgmcmRldi0+aWJfcG9vbC5tdXRleCk7CiAJbXV0ZXhfaW5pdCgmcmRldi0+Y3AubXV0ZXgpOwogCW11dGV4X2luaXQoJnJkZXYtPmRjX2h3X2kyY19tdXRleCk7CkBAIC03NTAsMTQgKzc1MCwxNSBAQAogCiAJLyogc2V0IERNQSBtYXNrICsgbmVlZF9kbWEzMiBmbGFncy4KIAkgKiBQQ0lFIC0gY2FuIGhhbmRsZSA0MC1iaXRzLgotCSAqIElHUCAtIGNhbiBoYW5kbGUgNDAtYml0cyAoaW4gdGhlb3J5KQorCSAqIElHUCAtIGNhbiBoYW5kbGUgNDAtYml0cwogCSAqIEFHUCAtIGdlbmVyYWxseSBkbWEzMiBpcyBzYWZlc3QKLQkgKiBQQ0kgLSBvbmx5IGRtYTMyCisJICogUENJIC0gZG1hMzIgZm9yIGxlZ2FjeSBwY2kgZ2FydCwgNDAgYml0cyBvbiBuZXdlciBhc2ljcwogCSAqLwogCXJkZXYtPm5lZWRfZG1hMzIgPSBmYWxzZTsKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKQogCQlyZGV2LT5uZWVkX2RtYTMyID0gdHJ1ZTsKLQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJKQorCWlmICgocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJKSAmJgorCSAgICAocmRldi0+ZmFtaWx5IDwgQ0hJUF9SUzQwMCkpCiAJCXJkZXYtPm5lZWRfZG1hMzIgPSB0cnVlOwogCiAJZG1hX2JpdHMgPSByZGV2LT5uZWVkX2RtYTMyID8gMzIgOiA0MDsKQEAgLTgxNyw3ICs4MTgsNyBAQAogCQlyYWRlb25fdGVzdF9tb3ZlcyhyZGV2KTsKIAl9CiAJaWYgKHJhZGVvbl9iZW5jaG1hcmtpbmcpIHsKLQkJcmFkZW9uX2JlbmNobWFyayhyZGV2KTsKKwkJcmFkZW9uX2JlbmNobWFyayhyZGV2LCByYWRlb25fYmVuY2htYXJraW5nKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC05NTQsNiArOTU1LDkgQEAKIAlpbnQgcjsKIAlpbnQgcmVzY2hlZDsKIAorCS8qIFByZXZlbnQgQ1MgaW9jdGwgZnJvbSBpbnRlcmZlcmluZyAqLworCXJhZGVvbl9tdXRleF9sb2NrKCZyZGV2LT5jc19tdXRleCk7CisKIAlyYWRlb25fc2F2ZV9iaW9zX3NjcmF0Y2hfcmVncyhyZGV2KTsKIAkvKiBibG9jayBUVE0gKi8KIAlyZXNjaGVkID0gdHRtX2JvX2xvY2tfZGVsYXllZF93b3JrcXVldWUoJnJkZXYtPm1tYW4uYmRldik7CkBAIC05NjYsMTAgKzk3MCwxNSBAQAogCQlyYWRlb25fcmVzdG9yZV9iaW9zX3NjcmF0Y2hfcmVncyhyZGV2KTsKIAkJZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9kZShyZGV2LT5kZGV2KTsKIAkJdHRtX2JvX3VubG9ja19kZWxheWVkX3dvcmtxdWV1ZSgmcmRldi0+bW1hbi5iZGV2LCByZXNjaGVkKTsKLQkJcmV0dXJuIDA7CiAJfQotCS8qIGJhZCBuZXdzLCBob3cgdG8gdGVsbCBpdCB0byB1c2Vyc3BhY2UgPyAqLwotCWRldl9pbmZvKHJkZXYtPmRldiwgIkdQVSByZXNldCBmYWlsZWRcbiIpOworCisJcmFkZW9uX211dGV4X3VubG9jaygmcmRldi0+Y3NfbXV0ZXgpOworCisJaWYgKHIpIHsKKwkJLyogYmFkIG5ld3MsIGhvdyB0byB0ZWxsIGl0IHRvIHVzZXJzcGFjZSA/ICovCisJCWRldl9pbmZvKHJkZXYtPmRldiwgIkdQVSByZXNldCBmYWlsZWRcbiIpOworCX0KKwogCXJldHVybiByOwogfQogCkBAIC05ODEsNyArOTkwLDcgQEAKIAlzdHJ1Y3QgZHJtX2luZm9fbGlzdAkqZmlsZXM7CiAJdW5zaWduZWQJCW51bV9maWxlczsKIH07Ci1zdGF0aWMgc3RydWN0IHJhZGVvbl9kZWJ1Z2ZzIF9yYWRlb25fZGVidWdmc1tSQURFT05fREVCVUdGU19NQVhfTlVNX0ZJTEVTXTsKK3N0YXRpYyBzdHJ1Y3QgcmFkZW9uX2RlYnVnZnMgX3JhZGVvbl9kZWJ1Z2ZzW1JBREVPTl9ERUJVR0ZTX01BWF9DT01QT05FTlRTXTsKIHN0YXRpYyB1bnNpZ25lZCBfcmFkZW9uX2RlYnVnZnNfY291bnQgPSAwOwogCiBpbnQgcmFkZW9uX2RlYnVnZnNfYWRkX2ZpbGVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LApAQCAtOTk2LDE0ICsxMDA1LDE3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQlpZiAoKF9yYWRlb25fZGVidWdmc19jb3VudCArIG5maWxlcykgPiBSQURFT05fREVCVUdGU19NQVhfTlVNX0ZJTEVTKSB7Ci0JCURSTV9FUlJPUigiUmVhY2hlZCBtYXhpbXVtIG51bWJlciBvZiBkZWJ1Z2ZzIGZpbGVzLlxuIik7Ci0JCURSTV9FUlJPUigiUmVwb3J0IHNvIHdlIGluY3JlYXNlIFJBREVPTl9ERUJVR0ZTX01BWF9OVU1fRklMRVMuXG4iKTsKKworCWkgPSBfcmFkZW9uX2RlYnVnZnNfY291bnQgKyAxOworCWlmIChpID4gUkFERU9OX0RFQlVHRlNfTUFYX0NPTVBPTkVOVFMpIHsKKwkJRFJNX0VSUk9SKCJSZWFjaGVkIG1heGltdW0gbnVtYmVyIG9mIGRlYnVnZnMgY29tcG9uZW50cy5cbiIpOworCQlEUk1fRVJST1IoIlJlcG9ydCBzbyB3ZSBpbmNyZWFzZSAiCisJCSAgICAgICAgICAiUkFERU9OX0RFQlVHRlNfTUFYX0NPTVBPTkVOVFMuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCV9yYWRlb25fZGVidWdmc1tfcmFkZW9uX2RlYnVnZnNfY291bnRdLmZpbGVzID0gZmlsZXM7CiAJX3JhZGVvbl9kZWJ1Z2ZzW19yYWRlb25fZGVidWdmc19jb3VudF0ubnVtX2ZpbGVzID0gbmZpbGVzOwotCV9yYWRlb25fZGVidWdmc19jb3VudCsrOworCV9yYWRlb25fZGVidWdmc19jb3VudCA9IGk7CiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCiAJZHJtX2RlYnVnZnNfY3JlYXRlX2ZpbGVzKGZpbGVzLCBuZmlsZXMsCiAJCQkJIHJkZXYtPmRkZXYtPmNvbnRyb2wtPmRlYnVnZnNfcm9vdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYwppbmRleCA2YWRiM2U1Li5hMjJkNmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCkBAIC0zMyw4ICszMyw2IEBACiAjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCiAjaW5jbHVkZSAiZHJtX2VkaWQuaCIKIAotc3RhdGljIGludCByYWRlb25fZGRjX2R1bXAoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Ci0KIHN0YXRpYyB2b2lkIGF2aXZvX2NydGNfbG9hZF9sdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhjcnRjKTsKQEAgLTY2OSw3ICs2NjcsNiBAQAogc3RhdGljIGJvb2wgcmFkZW9uX3NldHVwX2VuY19jb25uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fY29ubmVjdG9yICpkcm1fY29ubmVjdG9yOwogCWJvb2wgcmV0ID0gZmFsc2U7CiAKIAlpZiAocmRldi0+YmlvcykgewpAQCAtNjg5LDggKzY4Niw2IEBACiAJaWYgKHJldCkgewogCQlyYWRlb25fc2V0dXBfZW5jb2Rlcl9jbG9uZXMoZGV2KTsKIAkJcmFkZW9uX3ByaW50X2Rpc3BsYXlfc2V0dXAoZGV2KTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkcm1fY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkKLQkJCXJhZGVvbl9kZGNfZHVtcChkcm1fY29ubmVjdG9yKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNzA4LDcgKzcwMyw4IEBACiAKIAlpZiAoKHJhZGVvbl9jb25uZWN0b3ItPmJhc2UuY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0KSB8fAogCSAgICAocmFkZW9uX2Nvbm5lY3Rvci0+YmFzZS5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKSB8fAotCSAgICByYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfZHBfYnJpZGdlKCZyYWRlb25fY29ubmVjdG9yLT5iYXNlKSkgeworCSAgICAocmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSkgIT0KKwkgICAgIEVOQ09ERVJfT0JKRUNUX0lEX05PTkUpKSB7CiAJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWcgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKIAogCQlpZiAoKGRpZy0+ZHBfc2lua190eXBlID09IENPTk5FQ1RPUl9PQkpFQ1RfSURfRElTUExBWVBPUlQgfHwKQEAgLTc0MywzNCArNzM5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fZGRjX2R1bXAoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKLQlzdHJ1Y3QgZWRpZCAqZWRpZDsKLQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIG9uIGh3IHdpdGggcm91dGVycywgc2VsZWN0IHJpZ2h0IHBvcnQgKi8KLQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+cm91dGVyLmRkY192YWxpZCkKLQkJcmFkZW9uX3JvdXRlcl9zZWxlY3RfZGRjX3BvcnQocmFkZW9uX2Nvbm5lY3Rvcik7Ci0KLQlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMpCi0JCXJldHVybiAtMTsKLQllZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJnJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPmFkYXB0ZXIpOwotCS8qIExvZyBFRElEIHJldHJpZXZhbCBzdGF0dXMgaGVyZS4gSW4gcGFydGljdWxhciB3aXRoIHJlZ2FyZCB0bwotCSAqIGNvbm5lY3RvcnMgd2l0aCByZXF1aXJlc19leHRlbmRlZF9wcm9iZSBmbGFnIHNldCwgdGhhdCB3aWxsIHByZXZlbnQKLQkgKiBmdW5jdGlvbiByYWRlb25fZHZpX2RldGVjdCgpIHRvIGZldGNoIEVESUQgb24gdGhpcyBjb25uZWN0b3IsCi0JICogYXMgbG9uZyBhcyB0aGVyZSBpcyBubyB2YWxpZCBFRElEIGhlYWRlciBmb3VuZCAqLwotCWlmIChlZGlkKSB7Ci0JCURSTV9JTkZPKCJSYWRlb24gZGlzcGxheSBjb25uZWN0b3IgJXM6IEZvdW5kIHZhbGlkIEVESUQiLAotCQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7Ci0JCWtmcmVlKGVkaWQpOwotCX0gZWxzZSB7Ci0JCURSTV9JTkZPKCJSYWRlb24gZGlzcGxheSBjb25uZWN0b3IgJXM6IE5vIG1vbml0b3IgY29ubmVjdGVkIG9yIGludmFsaWQgRURJRCIsCi0JCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQogLyogYXZpdm8gKi8KIHN0YXRpYyB2b2lkIGF2aXZvX2dldF9mYl9kaXYoc3RydWN0IHJhZGVvbl9wbGwgKnBsbCwKIAkJCSAgICAgdTMyIHRhcmdldF9jbG9jaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKaW5kZXggZTcxZDJlZC4uYTBiMzVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogLyoKQEAgLTExOCw2ICsxMTksNyBAQAogaW50IHJhZGVvbl9kaXNwX3ByaW9yaXR5ID0gMDsKIGludCByYWRlb25faHdfaTJjID0gMDsKIGludCByYWRlb25fcGNpZV9nZW4yID0gMDsKK2ludCByYWRlb25fbXNpID0gLTE7CiAKIE1PRFVMRV9QQVJNX0RFU0Mobm9fd2IsICJEaXNhYmxlIEFHUCB3cml0ZWJhY2sgZm9yIHNjcmF0Y2ggcmVnaXN0ZXJzIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQobm9fd2IsIHJhZGVvbl9ub193YiwgaW50LCAwNDQ0KTsKQEAgLTE2NCw2ICsxNjYsOSBAQAogTU9EVUxFX1BBUk1fREVTQyhwY2llX2dlbjIsICJQQ0lFIEdlbjIgbW9kZSAoMSA9IGVuYWJsZSkiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChwY2llX2dlbjIsIHJhZGVvbl9wY2llX2dlbjIsIGludCwgMDQ0NCk7CiAKK01PRFVMRV9QQVJNX0RFU0MobXNpLCAiTVNJIHN1cHBvcnQgKDEgPSBlbmFibGUsIDAgPSBkaXNhYmxlLCAtMSA9IGF1dG8pIik7Cittb2R1bGVfcGFyYW1fbmFtZWQobXNpLCByYWRlb25fbXNpLCBpbnQsIDA0NDQpOworCiBzdGF0aWMgaW50IHJhZGVvbl9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKaW5kZXggZWIzZjZkYy4uMDZlNDEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCkBAIC0yOSwxMiArMjksNiBAQAogI2luY2x1ZGUgInJhZGVvbi5oIgogI2luY2x1ZGUgImF0b20uaCIKIAotZXh0ZXJuIGludCBhdG9tX2RlYnVnOwotCi0vKiBldmlsIGJ1dCBpbmNsdWRpbmcgYXRvbWJpb3MuaCBpcyBtdWNoIHdvcnNlICovCi1ib29sIHJhZGVvbl9hdG9tX2dldF90dl90aW1pbmdzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaW5kZXgsCi0JCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOwotCiBzdGF0aWMgdWludDMyX3QgcmFkZW9uX2VuY29kZXJfY2xvbmVzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwpAQCAtMTU2LDI3ICsxNTAsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCByYWRlb25fZW5jb2Rlcl9pc19kaWdpdGFsKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQkJcmV0dXJuIHRydWU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQogdm9pZAogcmFkZW9uX2xpbmtfZW5jb2Rlcl9jb25uZWN0b3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKQEAgLTIyOSwyMyArMjAyLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yICoKLXJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyX2luaXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7Ci0Jc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3I7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKLQkJcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgcmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcykKLQkJCXJldHVybiBjb25uZWN0b3I7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdHJ1Y3QgZHJtX2VuY29kZXIgKnJhZGVvbl9hdG9tX2dldF9leHRlcm5hbF9lbmNvZGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3N0cnVjdCBkcm1fZW5jb2RlciAqcmFkZW9uX2dldF9leHRlcm5hbF9lbmNvZGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKQEAgLTI2Niw5ICsyMjMsOSBAQAogCXJldHVybiBOVUxMOwogfQogCi1ib29sIHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit1MTYgcmFkZW9uX2VuY29kZXJfZ2V0X2RwX2JyaWRnZV9lbmNvZGVyX2lkKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKm90aGVyX2VuY29kZXIgPSByYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKm90aGVyX2VuY29kZXIgPSByYWRlb25fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7CiAKIAlpZiAob3RoZXJfZW5jb2RlcikgewogCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIob3RoZXJfZW5jb2Rlcik7CkBAIC0zMzIsMjEwNSArMjg5LDMgQEAKIAogfQogCi1zdGF0aWMgYm9vbCByYWRlb25fYXRvbV9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKLQkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQkvKiBzZXQgdGhlIGFjdGl2ZSBlbmNvZGVyIHRvIGNvbm5lY3RvciByb3V0aW5nICovCi0JcmFkZW9uX2VuY29kZXJfc2V0X2FjdGl2ZV9kZXZpY2UoZW5jb2Rlcik7Ci0JZHJtX21vZGVfc2V0X2NydGNpbmZvKGFkanVzdGVkX21vZGUsIDApOwotCi0JLyogaHcgYnVnICovCi0JaWYgKChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQotCSAgICAmJiAobW9kZS0+Y3J0Y192c3luY19zdGFydCA8IChtb2RlLT5jcnRjX3ZkaXNwbGF5ICsgMikpKQotCQlhZGp1c3RlZF9tb2RlLT5jcnRjX3ZzeW5jX3N0YXJ0ID0gYWRqdXN0ZWRfbW9kZS0+Y3J0Y192ZGlzcGxheSArIDI7Ci0KLQkvKiBnZXQgdGhlIG5hdGl2ZSBtb2RlIGZvciBMVkRTICovCi0JaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKLQkJcmFkZW9uX3BhbmVsX21vZGVfZml4dXAoZW5jb2RlciwgYWRqdXN0ZWRfbW9kZSk7Ci0KLQkvKiBnZXQgdGhlIG5hdGl2ZSBtb2RlIGZvciBUViAqLwotCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkgewotCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKnR2X2RhYyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKLQkJaWYgKHR2X2RhYykgewotCQkJaWYgKHR2X2RhYy0+dHZfc3RkID09IFRWX1NURF9OVFNDIHx8Ci0JCQkgICAgdHZfZGFjLT50dl9zdGQgPT0gVFZfU1REX05UU0NfSiB8fAotCQkJICAgIHR2X2RhYy0+dHZfc3RkID09IFRWX1NURF9QQUxfTSkKLQkJCQlyYWRlb25fYXRvbV9nZXRfdHZfdGltaW5ncyhyZGV2LCAwLCBhZGp1c3RlZF9tb2RlKTsKLQkJCWVsc2UKLQkJCQlyYWRlb25fYXRvbV9nZXRfdHZfdGltaW5ncyhyZGV2LCAxLCBhZGp1c3RlZF9tb2RlKTsKLQkJfQotCX0KLQotCWlmIChBU0lDX0lTX0RDRTMocmRldikgJiYKLQkgICAgKChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCB8IEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgfHwKLQkgICAgIHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShlbmNvZGVyKSkpIHsKLQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwotCQlyYWRlb25fZHBfc2V0X2xpbmtfY29uZmlnKGNvbm5lY3RvciwgbW9kZSk7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hdG9tYmlvc19kYWNfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWN0aW9uKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlEQUNfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gYXJnczsKLQlpbnQgaW5kZXggPSAwOwotCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RhYyAqZGFjX2luZm8gPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6Ci0JCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgREFDMUVuY29kZXJDb250cm9sKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMyOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6Ci0JCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgREFDMkVuY29kZXJDb250cm9sKTsKLQkJYnJlYWs7Ci0JfQotCi0JYXJncy51Y0FjdGlvbiA9IGFjdGlvbjsKLQotCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkpCi0JCWFyZ3MudWNEYWNTdGFuZGFyZCA9IEFUT01fREFDMV9QUzI7Ci0JZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCWFyZ3MudWNEYWNTdGFuZGFyZCA9IEFUT01fREFDMV9DVjsKLQllbHNlIHsKLQkJc3dpdGNoIChkYWNfaW5mby0+dHZfc3RkKSB7Ci0JCWNhc2UgVFZfU1REX1BBTDoKLQkJY2FzZSBUVl9TVERfUEFMX006Ci0JCWNhc2UgVFZfU1REX1NDQVJUX1BBTDoKLQkJY2FzZSBUVl9TVERfU0VDQU06Ci0JCWNhc2UgVFZfU1REX1BBTF9DTjoKLQkJCWFyZ3MudWNEYWNTdGFuZGFyZCA9IEFUT01fREFDMV9QQUw7Ci0JCQlicmVhazsKLQkJY2FzZSBUVl9TVERfTlRTQzoKLQkJY2FzZSBUVl9TVERfTlRTQ19KOgotCQljYXNlIFRWX1NURF9QQUxfNjA6Ci0JCWRlZmF1bHQ6Ci0JCQlhcmdzLnVjRGFjU3RhbmRhcmQgPSBBVE9NX0RBQzFfTlRTQzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWFyZ3MudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOwotCi0JYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLWF0b21iaW9zX3R2X3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0JVFZfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gYXJnczsKLQlpbnQgaW5kZXggPSAwOwotCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RhYyAqZGFjX2luZm8gPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRWRW5jb2RlckNvbnRyb2wpOwotCi0JYXJncy5zVFZFbmNvZGVyLnVjQWN0aW9uID0gYWN0aW9uOwotCi0JaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9DVjsKLQllbHNlIHsKLQkJc3dpdGNoIChkYWNfaW5mby0+dHZfc3RkKSB7Ci0JCWNhc2UgVFZfU1REX05UU0M6Ci0JCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9OVFNDOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFZfU1REX1BBTDoKLQkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTDsKLQkJCWJyZWFrOwotCQljYXNlIFRWX1NURF9QQUxfTToKLQkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTE07Ci0JCQlicmVhazsKLQkJY2FzZSBUVl9TVERfUEFMXzYwOgotCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfUEFMNjA7Ci0JCQlicmVhazsKLQkJY2FzZSBUVl9TVERfTlRTQ19KOgotCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfTlRTQ0o7Ci0JCQlicmVhazsKLQkJY2FzZSBUVl9TVERfU0NBUlRfUEFMOgotCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfUEFMOyAvKiA/Pz8gKi8KLQkJCWJyZWFrOwotCQljYXNlIFRWX1NURF9TRUNBTToKLQkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1NFQ0FNOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFZfU1REX1BBTF9DTjoKLQkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTENOOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9OVFNDOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlhcmdzLnNUVkVuY29kZXIudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOwotCi0JYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0KLX0KLQotdW5pb24gZHZvX2VuY29kZXJfY29udHJvbCB7Ci0JRU5BQkxFX0VYVEVSTkFMX1RNRFNfRU5DT0RFUl9QU19BTExPQ0FUSU9OIGV4dF90bWRzOwotCURWT19FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiBkdm87Ci0JRFZPX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OX1YzIGR2b192MzsKLX07Ci0KLXZvaWQKLWF0b21iaW9zX2R2b19zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24pCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXVuaW9uIGR2b19lbmNvZGVyX2NvbnRyb2wgYXJnczsKLQlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEVk9FbmNvZGVyQ29udHJvbCk7Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7Ci0JCS8qIERDRTMrICovCi0JCWFyZ3MuZHZvX3YzLnVjQWN0aW9uID0gYWN0aW9uOwotCQlhcmdzLmR2b192My51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7Ci0JCWFyZ3MuZHZvX3YzLnVjRFZPQ29uZmlnID0gMDsgLyogWFhYICovCi0JfSBlbHNlIGlmIChBU0lDX0lTX0RDRTIocmRldikpIHsKLQkJLyogRENFMiAocHJlLURDRTMgUjZ4eCwgUlM2MDAvNjkwLzc0MCAqLwotCQlhcmdzLmR2by5zRFZPRW5jb2Rlci51Y0FjdGlvbiA9IGFjdGlvbjsKLQkJYXJncy5kdm8uc0RWT0VuY29kZXIudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOwotCQkvKiBERlAxLCBDUlQxLCBUVjEgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHBvcnQgKi8KLQkJYXJncy5kdm8uc0RWT0VuY29kZXIudWNEZXZpY2VUeXBlID0gQVRPTV9ERVZJQ0VfREZQMV9JTkRFWDsKLQotCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJYXJncy5kdm8uc0RWT0VuY29kZXIudXNEZXZBdHRyLnNEaWdBdHRyaWIudWNBdHRyaWJ1dGUgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7Ci0JfSBlbHNlIHsKLQkJLyogUjR4eCwgUjV4eCAqLwotCQlhcmdzLmV4dF90bWRzLnNYVG1kc0VuY29kZXIudWNFbmFibGUgPSBhY3Rpb247Ci0KLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKLQkJCWFyZ3MuZXh0X3RtZHMuc1hUbWRzRW5jb2Rlci51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7Ci0KLQkJLyppZiAocFNjcm4tPnJnYkJpdHMgPT0gOCkqLwotCQlhcmdzLmV4dF90bWRzLnNYVG1kc0VuY29kZXIudWNNaXNjIHw9IEFUT01fUEFORUxfTUlTQ184ODhSR0I7Ci0JfQotCi0JYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci19Ci0KLXVuaW9uIGx2ZHNfZW5jb2Rlcl9jb250cm9sIHsKLQlMVkRTX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OICAgIHYxOwotCUxWRFNfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT05fVjIgdjI7Ci19OwotCi12b2lkCi1hdG9tYmlvc19kaWdpdGFsX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0JdW5pb24gbHZkc19lbmNvZGVyX2NvbnRyb2wgYXJnczsKLQlpbnQgaW5kZXggPSAwOwotCWludCBoZG1pX2RldGVjdGVkID0gMDsKLQl1aW50OF90IGZyZXYsIGNyZXY7Ci0KLQlpZiAoIWRpZykKLQkJcmV0dXJuOwotCi0JaWYgKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkKLQkJaGRtaV9kZXRlY3RlZCA9IDE7Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIExWRFNFbmNvZGVyQ29udHJvbCk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6Ci0JCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVE1EUzFFbmNvZGVyQ29udHJvbCk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpCi0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIExWRFNFbmNvZGVyQ29udHJvbCk7Ci0JCWVsc2UKLQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVE1EUzJFbmNvZGVyQ29udHJvbCk7Ci0JCWJyZWFrOwotCX0KLQotCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKGZyZXYpIHsKLQljYXNlIDE6Ci0JY2FzZSAyOgotCQlzd2l0Y2ggKGNyZXYpIHsKLQkJY2FzZSAxOgotCQkJYXJncy52MS51Y01pc2MgPSAwOwotCQkJYXJncy52MS51Y0FjdGlvbiA9IGFjdGlvbjsKLQkJCWlmIChoZG1pX2RldGVjdGVkKQotCQkJCWFyZ3MudjEudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19IRE1JX1RZUEU7Ci0JCQlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKLQkJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHsKLQkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ19EVUFMKQotCQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfRFVBTDsKLQkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ184ODhSR0IpCi0JCQkJCWFyZ3MudjEudWNNaXNjIHw9IEFUT01fUEFORUxfTUlTQ184ODhSR0I7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkaWctPmxpbmtiKQotCQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfVE1EU19MSU5LQjsKLQkJCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfRFVBTDsKLQkJCQkvKmlmIChwU2Nybi0+cmdiQml0cyA9PSA4KSAqLwotCQkJCWFyZ3MudjEudWNNaXNjIHw9IEFUT01fUEFORUxfTUlTQ184ODhSR0I7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQljYXNlIDM6Ci0JCQlhcmdzLnYyLnVjTWlzYyA9IDA7Ci0JCQlhcmdzLnYyLnVjQWN0aW9uID0gYWN0aW9uOwotCQkJaWYgKGNyZXYgPT0gMykgewotCQkJCWlmIChkaWctPmNvaGVyZW50X21vZGUpCi0JCQkJCWFyZ3MudjIudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19DT0hFUkVOVDsKLQkJCX0KLQkJCWlmIChoZG1pX2RldGVjdGVkKQotCQkJCWFyZ3MudjIudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19IRE1JX1RZUEU7Ci0JCQlhcmdzLnYyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKLQkJCWFyZ3MudjIudWNUcnVuY2F0ZSA9IDA7Ci0JCQlhcmdzLnYyLnVjU3BhdGlhbCA9IDA7Ci0JCQlhcmdzLnYyLnVjVGVtcG9yYWwgPSAwOwotCQkJYXJncy52Mi51Y0ZSQyA9IDA7Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7Ci0JCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfRFVBTCkKLQkJCQkJYXJncy52Mi51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7Ci0JCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfU1BBVElBTCkgewotCQkJCQlhcmdzLnYyLnVjU3BhdGlhbCA9IFBBTkVMX0VOQ09ERVJfU1BBVElBTF9ESVRIRVJfRU47Ci0JCQkJCWlmIChkaWctPmxjZF9taXNjICYgQVRPTV9QQU5FTF9NSVNDXzg4OFJHQikKLQkJCQkJCWFyZ3MudjIudWNTcGF0aWFsIHw9IFBBTkVMX0VOQ09ERVJfU1BBVElBTF9ESVRIRVJfREVQVEg7Ci0JCQkJfQotCQkJCWlmIChkaWctPmxjZF9taXNjICYgQVRPTV9QQU5FTF9NSVNDX1RFTVBPUkFMKSB7Ci0JCQkJCWFyZ3MudjIudWNUZW1wb3JhbCA9IFBBTkVMX0VOQ09ERVJfVEVNUE9SQUxfRElUSEVSX0VOOwotCQkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ184ODhSR0IpCi0JCQkJCQlhcmdzLnYyLnVjVGVtcG9yYWwgfD0gUEFORUxfRU5DT0RFUl9URU1QT1JBTF9ESVRIRVJfREVQVEg7Ci0JCQkJCWlmICgoKGRpZy0+bGNkX21pc2MgPj4gQVRPTV9QQU5FTF9NSVNDX0dSRVlfTEVWRUxfU0hJRlQpICYgMHgzKSA9PSAyKQotCQkJCQkJYXJncy52Mi51Y1RlbXBvcmFsIHw9IFBBTkVMX0VOQ09ERVJfVEVNUE9SQUxfTEVWRUxfNDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkaWctPmxpbmtiKQotCQkJCQlhcmdzLnYyLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfVE1EU19MSU5LQjsKLQkJCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJCQlhcmdzLnYyLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfRFVBTDsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7Ci0JCWJyZWFrOwotCX0KLQotCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotfQotCi1pbnQKLWF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yOwotCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yOwotCi0JLyogZHAgYnJpZGdlcyBhcmUgYWx3YXlzIERQICovCi0JaWYgKHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShlbmNvZGVyKSkKLQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RQOwotCi0JLyogRFZPIGlzIGFsd2F5cyBEVk8gKi8KLQlpZiAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gQVRPTV9FTkNPREVSX01PREVfRFZPKQotCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZPOwotCi0JY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7Ci0JLyogaWYgd2UgZG9uJ3QgaGF2ZSBhbiBhY3RpdmUgZGV2aWNlIHlldCwganVzdCB1c2Ugb25lIG9mCi0JICogdGhlIGNvbm5lY3RvcnMgdGllZCB0byB0aGUgZW5jb2Rlci4KLQkgKi8KLQlpZiAoIWNvbm5lY3RvcikKLQkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXJfaW5pdChlbmNvZGVyKTsKLQlyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCi0Jc3dpdGNoIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSB7Ci0JY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQjogLyogSERNSS1CIGlzIGJhc2ljYWxseSBETC1EVkk7IGFuYWxvZyB3b3JrcyBmaW5lICovCi0JCWlmIChkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8ocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgJiYgcmFkZW9uX2F1ZGlvKSB7Ci0JCQkvKiBmaXggbWUgKi8KLQkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCi0JCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWSTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfSERNSTsKLQkJfSBlbHNlIGlmIChyYWRlb25fY29ubmVjdG9yLT51c2VfZGlnaXRhbCkKLQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7Ci0JCWVsc2UKLQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9DUlQ7Ci0JCWJyZWFrOwotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQ6Ci0JY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUE6Ci0JZGVmYXVsdDoKLQkJaWYgKGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhyYWRlb25fY29ubmVjdG9yLT5lZGlkKSAmJiByYWRlb25fYXVkaW8pIHsKLQkJCS8qIGZpeCBtZSAqLwotCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKLQkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOwotCQkJZWxzZQotCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JOwotCQl9IGVsc2UKLQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7Ci0JCWJyZWFrOwotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0xWRFM6Ci0JCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9MVkRTOwotCQlicmVhazsKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydDoKLQkJZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OwotCQlpZiAoKGRpZ19jb25uZWN0b3ItPmRwX3NpbmtfdHlwZSA9PSBDT05ORUNUT1JfT0JKRUNUX0lEX0RJU1BMQVlQT1JUKSB8fAotCQkgICAgKGRpZ19jb25uZWN0b3ItPmRwX3NpbmtfdHlwZSA9PSBDT05ORUNUT1JfT0JKRUNUX0lEX2VEUCkpCi0JCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFA7Ci0JCWVsc2UgaWYgKGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhyYWRlb25fY29ubmVjdG9yLT5lZGlkKSAmJiByYWRlb25fYXVkaW8pIHsKLQkJCS8qIGZpeCBtZSAqLwotCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKLQkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOwotCQkJZWxzZQotCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JOwotCQl9IGVsc2UKLQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7Ci0JCWJyZWFrOwotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX2VEUDoKLQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RQOwotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUE6Ci0JY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBOgotCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfQ1JUOwotCQlicmVhazsKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb3NpdGU6Ci0JY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPOgotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SXzlQaW5ESU46Ci0JCS8qIGZpeCBtZSAqLwotCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfVFY7Ci0JCS8qcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0NWOyovCi0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIERJRyBFbmNvZGVyL1RyYW5zbWl0dGVyIFNldHVwCi0gKgotICogRENFIDMuMC8zLjEKLSAqIC0gMiBESUcgdHJhbnNtaXR0ZXIgYmxvY2tzLiBVTklQSFkgKGxpbmtzIEEgYW5kIEIpIGFuZCBMVlRNQS4KLSAqIFN1cHBvcnRzIHVwIHRvIDMgZGlnaXRhbCBvdXRwdXRzCi0gKiAtIDIgRElHIGVuY29kZXIgYmxvY2tzLgotICogRElHMSBjYW4gZHJpdmUgVU5JUEhZIGxpbmsgQSBvciBsaW5rIEIKLSAqIERJRzIgY2FuIGRyaXZlIFVOSVBIWSBsaW5rIEIgb3IgTFZUTUEKLSAqCi0gKiBEQ0UgMy4yCi0gKiAtIDMgRElHIHRyYW5zbWl0dGVyIGJsb2Nrcy4gVU5JUEhZMC8xLzIgKGxpbmtzIEEgYW5kIEIpLgotICogU3VwcG9ydHMgdXAgdG8gNSBkaWdpdGFsIG91dHB1dHMKLSAqIC0gMiBESUcgZW5jb2RlciBibG9ja3MuCi0gKiBESUcxLzIgY2FuIGRyaXZlIFVOSVBIWTAvMS8yIGxpbmsgQSBvciBsaW5rIEIKLSAqCi0gKiBEQ0UgNC4wLzUuMAotICogLSAzIERJRyB0cmFuc21pdHRlciBibG9ja3MgVU5JUEhZMC8xLzIgKGxpbmtzIEEgYW5kIEIpLgotICogU3VwcG9ydHMgdXAgdG8gNiBkaWdpdGFsIG91dHB1dHMKLSAqIC0gNiBESUcgZW5jb2RlciBibG9ja3MuCi0gKiAtIERJRyB0byBQSFkgbWFwcGluZyBpcyBoYXJkY29kZWQKLSAqIERJRzEgZHJpdmVzIFVOSVBIWTAgbGluayBBLCBBK0IKLSAqIERJRzIgZHJpdmVzIFVOSVBIWTAgbGluayBCCi0gKiBESUczIGRyaXZlcyBVTklQSFkxIGxpbmsgQSwgQStCCi0gKiBESUc0IGRyaXZlcyBVTklQSFkxIGxpbmsgQgotICogRElHNSBkcml2ZXMgVU5JUEhZMiBsaW5rIEEsIEErQgotICogRElHNiBkcml2ZXMgVU5JUEhZMiBsaW5rIEIKLSAqCi0gKiBEQ0UgNC4xCi0gKiAtIDMgRElHIHRyYW5zbWl0dGVyIGJsb2NrcyBVTklQSFkwLzEvMiAobGlua3MgQSBhbmQgQikuCi0gKiBTdXBwb3J0cyB1cCB0byA2IGRpZ2l0YWwgb3V0cHV0cwotICogLSAyIERJRyBlbmNvZGVyIGJsb2Nrcy4KLSAqIERJRzEvMiBjYW4gZHJpdmUgVU5JUEhZMC8xLzIgbGluayBBIG9yIGxpbmsgQgotICoKLSAqIFJvdXRpbmcKLSAqIGNydGMgLT4gZGlnIGVuY29kZXIgLT4gVU5JUEhZL0xWVE1BICgxIG9yIDIgbGlua3MpCi0gKiBFeGFtcGxlczoKLSAqIGNydGMwIC0+IGRpZzIgLT4gTFZUTUEgICBsaW5rcyBBK0IgLT4gVE1EUy9IRE1JCi0gKiBjcnRjMSAtPiBkaWcxIC0+IFVOSVBIWTAgbGluayAgQiAgIC0+IERQCi0gKiBjcnRjMCAtPiBkaWcxIC0+IFVOSVBIWTIgbGluayAgQSAgIC0+IExWRFMKLSAqIGNydGMxIC0+IGRpZzIgLT4gVU5JUEhZMSBsaW5rICBCK0EgLT4gVE1EUy9IRE1JCi0gKi8KLQotdW5pb24gZGlnX2VuY29kZXJfY29udHJvbCB7Ci0JRElHX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OIHYxOwotCURJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WMiB2MjsKLQlESUdfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjMgdjM7Ci0JRElHX0VOQ09ERVJfQ09OVFJPTF9QQVJBTUVURVJTX1Y0IHY0OwotfTsKLQotdm9pZAotYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWN0aW9uLCBpbnQgcGFuZWxfbW9kZSkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwotCXVuaW9uIGRpZ19lbmNvZGVyX2NvbnRyb2wgYXJnczsKLQlpbnQgaW5kZXggPSAwOwotCXVpbnQ4X3QgZnJldiwgY3JldjsKLQlpbnQgZHBfY2xvY2sgPSAwOwotCWludCBkcF9sYW5lX2NvdW50ID0gMDsKLQlpbnQgaHBkX2lkID0gUkFERU9OX0hQRF9OT05FOwotCWludCBicGMgPSA4OwotCi0JaWYgKGNvbm5lY3RvcikgewotCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKmRpZ19jb25uZWN0b3IgPQotCQkJcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7Ci0KLQkJZHBfY2xvY2sgPSBkaWdfY29ubmVjdG9yLT5kcF9jbG9jazsKLQkJZHBfbGFuZV9jb3VudCA9IGRpZ19jb25uZWN0b3ItPmRwX2xhbmVfY291bnQ7Ci0JCWhwZF9pZCA9IHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQ7Ci0JCWJwYyA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYzsKLQl9Ci0KLQkvKiBubyBkaWcgZW5jb2RlciBhc3NpZ25lZCAqLwotCWlmIChkaWctPmRpZ19lbmNvZGVyID09IC0xKQotCQlyZXR1cm47Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERJR3hFbmNvZGVyQ29udHJvbCk7Ci0JZWxzZSB7Ci0JCWlmIChkaWctPmRpZ19lbmNvZGVyKQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBESUcyRW5jb2RlckNvbnRyb2wpOwotCQllbHNlCi0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERJRzFFbmNvZGVyQ29udHJvbCk7Ci0JfQotCi0JaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCi0JCXJldHVybjsKLQotCWFyZ3MudjEudWNBY3Rpb24gPSBhY3Rpb247Ci0JYXJncy52MS51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7Ci0JaWYgKGFjdGlvbiA9PSBBVE9NX0VOQ09ERVJfQ01EX1NFVFVQX1BBTkVMX01PREUpCi0JCWFyZ3MudjMudWNQYW5lbE1vZGUgPSBwYW5lbF9tb2RlOwotCWVsc2UKLQkJYXJncy52MS51Y0VuY29kZXJNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKLQotCWlmICgoYXJncy52MS51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB8fAotCSAgICAoYXJncy52MS51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQX01TVCkpCi0JCWFyZ3MudjEudWNMYW5lTnVtID0gZHBfbGFuZV9jb3VudDsKLQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCi0JCWFyZ3MudjEudWNMYW5lTnVtID0gODsKLQllbHNlCi0JCWFyZ3MudjEudWNMYW5lTnVtID0gNDsKLQotCWlmIChBU0lDX0lTX0RDRTUocmRldikpIHsKLQkJaWYgKChhcmdzLnYxLnVjRW5jb2Rlck1vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHx8Ci0JCSAgICAoYXJncy52MS51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQX01TVCkpIHsKLQkJCWlmIChkcF9jbG9jayA9PSAyNzAwMDApCi0JCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RQTElOS1JBVEVfMl83MEdIWjsKLQkJCWVsc2UgaWYgKGRwX2Nsb2NrID09IDU0MDAwMCkKLQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRFBMSU5LUkFURV81XzQwR0haOwotCQl9Ci0JCWFyZ3MudjQuYWNDb25maWcudWNEaWdTZWwgPSBkaWctPmRpZ19lbmNvZGVyOwotCQlzd2l0Y2ggKGJwYykgewotCQljYXNlIDA6Ci0JCQlhcmdzLnY0LnVjQml0UGVyQ29sb3IgPSBQQU5FTF9CUENfVU5ERUZJTkU7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfNkJJVF9QRVJfQ09MT1I7Ci0JCQlicmVhazsKLQkJY2FzZSA4OgotCQlkZWZhdWx0OgotCQkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfOEJJVF9QRVJfQ09MT1I7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoKLQkJCWFyZ3MudjQudWNCaXRQZXJDb2xvciA9IFBBTkVMXzEwQklUX1BFUl9DT0xPUjsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfMTJCSVRfUEVSX0NPTE9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlhcmdzLnY0LnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xNkJJVF9QRVJfQ09MT1I7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaHBkX2lkID09IFJBREVPTl9IUERfTk9ORSkKLQkJCWFyZ3MudjQudWNIUERfSUQgPSAwOwotCQllbHNlCi0JCQlhcmdzLnY0LnVjSFBEX0lEID0gaHBkX2lkICsgMTsKLQl9IGVsc2UgaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgewotCQlpZiAoKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgJiYgKGRwX2Nsb2NrID09IDI3MDAwMCkpCi0JCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV8yXzcwR0haOwotCQlhcmdzLnYzLmFjQ29uZmlnLnVjRGlnU2VsID0gZGlnLT5kaWdfZW5jb2RlcjsKLQkJc3dpdGNoIChicGMpIHsKLQkJY2FzZSAwOgotCQkJYXJncy52My51Y0JpdFBlckNvbG9yID0gUEFORUxfQlBDX1VOREVGSU5FOwotCQkJYnJlYWs7Ci0JCWNhc2UgNjoKLQkJCWFyZ3MudjMudWNCaXRQZXJDb2xvciA9IFBBTkVMXzZCSVRfUEVSX0NPTE9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgODoKLQkJZGVmYXVsdDoKLQkJCWFyZ3MudjMudWNCaXRQZXJDb2xvciA9IFBBTkVMXzhCSVRfUEVSX0NPTE9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQlhcmdzLnYzLnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xMEJJVF9QRVJfQ09MT1I7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWFyZ3MudjMudWNCaXRQZXJDb2xvciA9IFBBTkVMXzEyQklUX1BFUl9DT0xPUjsKLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQkJYXJncy52My51Y0JpdFBlckNvbG9yID0gUEFORUxfMTZCSVRfUEVSX0NPTE9SOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgJiYgKGRwX2Nsb2NrID09IDI3MDAwMCkpCi0JCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfRFBMSU5LUkFURV8yXzcwR0haOwotCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCQkJYXJncy52MS51Y0NvbmZpZyA9IEFUT01fRU5DT0RFUl9DT05GSUdfVjJfVFJBTlNNSVRURVIxOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6Ci0JCQlhcmdzLnYxLnVjQ29uZmlnID0gQVRPTV9FTkNPREVSX0NPTkZJR19WMl9UUkFOU01JVFRFUjI7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgotCQkJYXJncy52MS51Y0NvbmZpZyA9IEFUT01fRU5DT0RFUl9DT05GSUdfVjJfVFJBTlNNSVRURVIzOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGRpZy0+bGlua2IpCi0JCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfTElOS0I7Ci0JCWVsc2UKLQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19MSU5LQTsKLQl9Ci0KLQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLQotfQotCi11bmlvbiBkaWdfdHJhbnNtaXR0ZXJfY29udHJvbCB7Ci0JRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiB2MTsKLQlESUdfVFJBTlNNSVRURVJfQ09OVFJPTF9QQVJBTUVURVJTX1YyIHYyOwotCURJR19UUkFOU01JVFRFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjMgdjM7Ci0JRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WNCB2NDsKLX07Ci0KLXZvaWQKLWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24sIHVpbnQ4X3QgbGFuZV9udW0sIHVpbnQ4X3QgbGFuZV9zZXQpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7Ci0JdW5pb24gZGlnX3RyYW5zbWl0dGVyX2NvbnRyb2wgYXJnczsKLQlpbnQgaW5kZXggPSAwOwotCXVpbnQ4X3QgZnJldiwgY3JldjsKLQlib29sIGlzX2RwID0gZmFsc2U7Ci0JaW50IHBsbF9pZCA9IDA7Ci0JaW50IGRwX2Nsb2NrID0gMDsKLQlpbnQgZHBfbGFuZV9jb3VudCA9IDA7Ci0JaW50IGNvbm5lY3Rvcl9vYmplY3RfaWQgPSAwOwotCWludCBpZ3BfbGFuZV9pbmZvID0gMDsKLQlpbnQgZGlnX2VuY29kZXIgPSBkaWctPmRpZ19lbmNvZGVyOwotCi0JaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9JTklUKSB7Ci0JCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyX2luaXQoZW5jb2Rlcik7Ci0JCS8qIGp1c3QgbmVlZGVkIHRvIGF2b2lkIGJhaWxpbmcgaW4gdGhlIGVuY29kZXIgY2hlY2suICB0aGUgZW5jb2RlcgotCQkgKiBpc24ndCB1c2VkIGZvciBpbml0Ci0JCSAqLwotCQlkaWdfZW5jb2RlciA9IDA7Ci0JfSBlbHNlCi0JCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwotCi0JaWYgKGNvbm5lY3RvcikgewotCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKmRpZ19jb25uZWN0b3IgPQotCQkJcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7Ci0KLQkJZHBfY2xvY2sgPSBkaWdfY29ubmVjdG9yLT5kcF9jbG9jazsKLQkJZHBfbGFuZV9jb3VudCA9IGRpZ19jb25uZWN0b3ItPmRwX2xhbmVfY291bnQ7Ci0JCWNvbm5lY3Rvcl9vYmplY3RfaWQgPQotCQkJKHJhZGVvbl9jb25uZWN0b3ItPmNvbm5lY3Rvcl9vYmplY3RfaWQgJiBPQkpFQ1RfSURfTUFTSykgPj4gT0JKRUNUX0lEX1NISUZUOwotCQlpZ3BfbGFuZV9pbmZvID0gZGlnX2Nvbm5lY3Rvci0+aWdwX2xhbmVfaW5mbzsKLQl9Ci0KLQkvKiBubyBkaWcgZW5jb2RlciBhc3NpZ25lZCAqLwotCWlmIChkaWdfZW5jb2RlciA9PSAtMSkKLQkJcmV0dXJuOwotCi0JaWYgKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfRFApCi0JCWlzX2RwID0gdHJ1ZTsKLQotCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLQotCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERWT091dHB1dENvbnRyb2wpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFVOSVBIWVRyYW5zbWl0dGVyQ29udHJvbCk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIExWVE1BVHJhbnNtaXR0ZXJDb250cm9sKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCi0JCXJldHVybjsKLQotCWFyZ3MudjEudWNBY3Rpb24gPSBhY3Rpb247Ci0JaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9JTklUKSB7Ci0JCWFyZ3MudjEudXNJbml0SW5mbyA9IGNwdV90b19sZTE2KGNvbm5lY3Rvcl9vYmplY3RfaWQpOwotCX0gZWxzZSBpZiAoYWN0aW9uID09IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1NFVFVQX1ZTRU1QSCkgewotCQlhcmdzLnYxLmFzTW9kZS51Y0xhbmVTZWwgPSBsYW5lX251bTsKLQkJYXJncy52MS5hc01vZGUudWNMYW5lU2V0ID0gbGFuZV9zZXQ7Ci0JfSBlbHNlIHsKLQkJaWYgKGlzX2RwKQotCQkJYXJncy52MS51c1BpeGVsQ2xvY2sgPQotCQkJCWNwdV90b19sZTE2KGRwX2Nsb2NrIC8gMTApOwotCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCi0JCQlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAyKSAvIDEwKTsKLQkJZWxzZQotCQkJYXJncy52MS51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7Ci0JfQotCWlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKLQkJaWYgKGlzX2RwKQotCQkJYXJncy52My51Y0xhbmVOdW0gPSBkcF9sYW5lX2NvdW50OwotCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCi0JCQlhcmdzLnYzLnVjTGFuZU51bSA9IDg7Ci0JCWVsc2UKLQkJCWFyZ3MudjMudWNMYW5lTnVtID0gNDsKLQotCQlpZiAoZGlnLT5saW5rYikKLQkJCWFyZ3MudjMuYWNDb25maWcudWNMaW5rU2VsID0gMTsKLQkJaWYgKGRpZ19lbmNvZGVyICYgMSkKLQkJCWFyZ3MudjMuYWNDb25maWcudWNFbmNvZGVyU2VsID0gMTsKLQotCQkvKiBTZWxlY3QgdGhlIFBMTCBmb3IgdGhlIFBIWQotCQkgKiBEUCBQSFkgc2hvdWxkIGJlIGNsb2NrZWQgZnJvbSBleHRlcm5hbCBzcmMgaWYgdGhlcmUgaXMKLQkJICogb25lLgotCQkgKi8KLQkJaWYgKGVuY29kZXItPmNydGMpIHsKLQkJCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhlbmNvZGVyLT5jcnRjKTsKLQkJCXBsbF9pZCA9IHJhZGVvbl9jcnRjLT5wbGxfaWQ7Ci0JCX0KLQotCQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKSB7Ci0JCQkvKiBPbiBEQ0U1IERDUExMIHVzdWFsbHkgZ2VuZXJhdGVzIHRoZSBEUCByZWYgY2xvY2sgKi8KLQkJCWlmIChpc19kcCkgewotCQkJCWlmIChyZGV2LT5jbG9jay5kcF9leHRjbGspCi0JCQkJCWFyZ3MudjQuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSBFTkNPREVSX1JFRkNMS19TUkNfRVhUQ0xLOwotCQkJCWVsc2UKLQkJCQkJYXJncy52NC5hY0NvbmZpZy51Y1JlZkNsa1NvdXJjZSA9IEVOQ09ERVJfUkVGQ0xLX1NSQ19EQ1BMTDsKLQkJCX0gZWxzZQotCQkJCWFyZ3MudjQuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSBwbGxfaWQ7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBPbiBEQ0U0LCBpZiB0aGVyZSBpcyBhbiBleHRlcm5hbCBjbG9jaywgaXQgZ2VuZXJhdGVzIHRoZSBEUCByZWYgY2xvY2sgKi8KLQkJCWlmIChpc19kcCAmJiByZGV2LT5jbG9jay5kcF9leHRjbGspCi0JCQkJYXJncy52My5hY0NvbmZpZy51Y1JlZkNsa1NvdXJjZSA9IDI7IC8qIGV4dGVybmFsIHNyYyAqLwotCQkJZWxzZQotCQkJCWFyZ3MudjMuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSBwbGxfaWQ7Ci0JCX0KLQotCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCQkJYXJncy52My5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6Ci0JCQlhcmdzLnYzLmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQkJCWFyZ3MudjMuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDI7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChpc19kcCkKLQkJCWFyZ3MudjMuYWNDb25maWcuZkNvaGVyZW50TW9kZSA9IDE7IC8qIERQIHJlcXVpcmVzIGNvaGVyZW50ICovCi0JCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUKSkgewotCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKLQkJCQlhcmdzLnYzLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOwotCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKLQkJCQlhcmdzLnYzLmFjQ29uZmlnLmZEdWFsTGlua0Nvbm5lY3RvciA9IDE7Ci0JCX0KLQl9IGVsc2UgaWYgKEFTSUNfSVNfRENFMzIocmRldikpIHsKLQkJYXJncy52Mi5hY0NvbmZpZy51Y0VuY29kZXJTZWwgPSBkaWdfZW5jb2RlcjsKLQkJaWYgKGRpZy0+bGlua2IpCi0JCQlhcmdzLnYyLmFjQ29uZmlnLnVjTGlua1NlbCA9IDE7Ci0KLQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKLQkJCWFyZ3MudjIuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCQkJYXJncy52Mi5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JCQlhcmdzLnYyLmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAyOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaXNfZHApIHsKLQkJCWFyZ3MudjIuYWNDb25maWcuZkNvaGVyZW50TW9kZSA9IDE7Ci0JCQlhcmdzLnYyLmFjQ29uZmlnLmZEUENvbm5lY3RvciA9IDE7Ci0JCX0gZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpKSB7Ci0JCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQotCQkJCWFyZ3MudjIuYWNDb25maWcuZkNvaGVyZW50TW9kZSA9IDE7Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJCWFyZ3MudjIuYWNDb25maWcuZkR1YWxMaW5rQ29ubmVjdG9yID0gMTsKLQkJfQotCX0gZWxzZSB7Ci0JCWFyZ3MudjEudWNDb25maWcgPSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19DTEtTUkNfUFBMTDsKLQotCQlpZiAoZGlnX2VuY29kZXIpCi0JCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0RJRzJfRU5DT0RFUjsKLQkJZWxzZQotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19ESUcxX0VOQ09ERVI7Ci0KLQkJaWYgKChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApICYmCi0JCSAgICAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZKSkgewotCQkJaWYgKGlzX2RwIHx8IChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPD0gMTY1MDAwKSkgewotCQkJCWlmIChpZ3BfbGFuZV9pbmZvICYgMHgxKQotCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xBTkVfMF8zOwotCQkJCWVsc2UgaWYgKGlncF9sYW5lX2luZm8gJiAweDIpCi0JCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV80Xzc7Ci0JCQkJZWxzZSBpZiAoaWdwX2xhbmVfaW5mbyAmIDB4NCkKLQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzhfMTE7Ci0JCQkJZWxzZSBpZiAoaWdwX2xhbmVfaW5mbyAmIDB4OCkKLQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzEyXzE1OwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaWdwX2xhbmVfaW5mbyAmIDB4MykKLQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzBfNzsKLQkJCQllbHNlIGlmIChpZ3BfbGFuZV9pbmZvICYgMHhjKQotCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xBTkVfOF8xNTsKLQkJCX0KLQkJfQotCi0JCWlmIChkaWctPmxpbmtiKQotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MSU5LQjsKLQkJZWxzZQotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MSU5LQTsKLQotCQlpZiAoaXNfZHApCi0JCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0NPSEVSRU5UOwotCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKLQkJCWlmIChkaWctPmNvaGVyZW50X21vZGUpCi0JCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19DT0hFUkVOVDsKLQkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCi0JCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR184TEFORV9MSU5LOwotCQl9Ci0JfQotCi0JYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci19Ci0KLWJvb2wKLWF0b21iaW9zX3NldF9lZHBfcGFuZWxfcG93ZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IGFjdGlvbikKLXsKLQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZS5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVuaW9uIGRpZ190cmFuc21pdHRlcl9jb250cm9sIGFyZ3M7Ci0JaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVU5JUEhZVHJhbnNtaXR0ZXJDb250cm9sKTsKLQl1aW50OF90IGZyZXYsIGNyZXY7Ci0KLQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAoIUFTSUNfSVNfRENFNChyZGV2KSkKLQkJZ290byBkb25lOwotCi0JaWYgKChhY3Rpb24gIT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT04pICYmCi0JICAgIChhY3Rpb24gIT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT0ZGKSkKLQkJZ290byBkb25lOwotCi0JaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCi0JCWdvdG8gZG9uZTsKLQotCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLQotCWFyZ3MudjEudWNBY3Rpb24gPSBhY3Rpb247Ci0KLQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLQotCS8qIHdhaXQgZm9yIHRoZSBwYW5lbCB0byBwb3dlciB1cCAqLwotCWlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT04pIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMwMDsgaSsrKSB7Ci0JCQlpZiAocmFkZW9uX2hwZF9zZW5zZShyZGV2LCByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCW1kZWxheSgxKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotZG9uZToKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdW5pb24gZXh0ZXJuYWxfZW5jb2Rlcl9jb250cm9sIHsKLQlFWFRFUk5BTF9FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiB2MTsKLQlFWFRFUk5BTF9FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTl9WMyB2MzsKLX07Ci0KLXN0YXRpYyB2b2lkCi1hdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyLAotCQkJCWludCBhY3Rpb24pCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqZXh0X3JhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZXh0X2VuY29kZXIpOwotCXVuaW9uIGV4dGVybmFsX2VuY29kZXJfY29udHJvbCBhcmdzOwotCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7Ci0JaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRXh0ZXJuYWxFbmNvZGVyQ29udHJvbCk7Ci0JdTggZnJldiwgY3JldjsKLQlpbnQgZHBfY2xvY2sgPSAwOwotCWludCBkcF9sYW5lX2NvdW50ID0gMDsKLQlpbnQgY29ubmVjdG9yX29iamVjdF9pZCA9IDA7Ci0JdTMyIGV4dF9lbnVtID0gKGV4dF9yYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9lbnVtICYgRU5VTV9JRF9NQVNLKSA+PiBFTlVNX0lEX1NISUZUOwotCWludCBicGMgPSA4OwotCi0JaWYgKGFjdGlvbiA9PSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0lOSVQpCi0JCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyX2luaXQoZW5jb2Rlcik7Ci0JZWxzZQotCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKLQotCWlmIChjb25uZWN0b3IpIHsKLQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yID0KLQkJCXJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OwotCi0JCWRwX2Nsb2NrID0gZGlnX2Nvbm5lY3Rvci0+ZHBfY2xvY2s7Ci0JCWRwX2xhbmVfY291bnQgPSBkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50OwotCQljb25uZWN0b3Jfb2JqZWN0X2lkID0KLQkJCShyYWRlb25fY29ubmVjdG9yLT5jb25uZWN0b3Jfb2JqZWN0X2lkICYgT0JKRUNUX0lEX01BU0spID4+IE9CSkVDVF9JRF9TSElGVDsKLQkJYnBjID0gY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uYnBjOwotCX0KLQotCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLQotCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKGZyZXYpIHsKLQljYXNlIDE6Ci0JCS8qIG5vIHBhcmFtcyBvbiBmcmV2IDEgKi8KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlzd2l0Y2ggKGNyZXYpIHsKLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCQlhcmdzLnYxLnNEaWdFbmNvZGVyLnVjQWN0aW9uID0gYWN0aW9uOwotCQkJYXJncy52MS5zRGlnRW5jb2Rlci51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7Ci0JCQlhcmdzLnYxLnNEaWdFbmNvZGVyLnVjRW5jb2Rlck1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOwotCi0JCQlpZiAoYXJncy52MS5zRGlnRW5jb2Rlci51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB7Ci0JCQkJaWYgKGRwX2Nsb2NrID09IDI3MDAwMCkKLQkJCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0RQTElOS1JBVEVfMl83MEdIWjsKLQkJCQlhcmdzLnYxLnNEaWdFbmNvZGVyLnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7Ci0JCQl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKLQkJCQlhcmdzLnYxLnNEaWdFbmNvZGVyLnVjTGFuZU51bSA9IDg7Ci0JCQllbHNlCi0JCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0xhbmVOdW0gPSA0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNBY3Rpb24gPSBhY3Rpb247Ci0JCQlpZiAoYWN0aW9uID09IEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfSU5JVCkKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVzQ29ubmVjdG9ySWQgPSBjcHVfdG9fbGUxNihjb25uZWN0b3Jfb2JqZWN0X2lkKTsKLQkJCWVsc2UKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKLQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNFbmNvZGVyTW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7Ci0KLQkJCWlmIChhcmdzLnYzLnNFeHRFbmNvZGVyLnVjRW5jb2Rlck1vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHsKLQkJCQlpZiAoZHBfY2xvY2sgPT0gMjcwMDAwKQotCQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfMl83MEdIWjsKLQkJCQllbHNlIGlmIChkcF9jbG9jayA9PSA1NDAwMDApCi0JCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV81XzQwR0haOwotCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNMYW5lTnVtID0gZHBfbGFuZV9jb3VudDsKLQkJCX0gZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNMYW5lTnVtID0gODsKLQkJCWVsc2UKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjTGFuZU51bSA9IDQ7Ci0JCQlzd2l0Y2ggKGV4dF9lbnVtKSB7Ci0JCQljYXNlIEdSQVBIX09CSkVDVF9FTlVNX0lEMToKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVIxOwotCQkJCWJyZWFrOwotCQkJY2FzZSBHUkFQSF9PQkpFQ1RfRU5VTV9JRDI6Ci0JCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0NvbmZpZyB8PSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgR1JBUEhfT0JKRUNUX0VOVU1fSUQzOgotCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRU5DT0RFUjM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzd2l0Y2ggKGJwYykgewotCQkJY2FzZSAwOgotCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNCaXRQZXJDb2xvciA9IFBBTkVMX0JQQ19VTkRFRklORTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNjoKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQml0UGVyQ29sb3IgPSBQQU5FTF82QklUX1BFUl9DT0xPUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgODoKLQkJCWRlZmF1bHQ6Ci0JCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0JpdFBlckNvbG9yID0gUEFORUxfOEJJVF9QRVJfQ09MT1I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEwOgotCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNCaXRQZXJDb2xvciA9IFBBTkVMXzEwQklUX1BFUl9DT0xPUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTI6Ci0JCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0JpdFBlckNvbG9yID0gUEFORUxfMTJCSVRfUEVSX0NPTE9SOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNjoKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xNkJJVF9QRVJfQ09MT1I7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uOiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uOiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOwotCQlyZXR1cm47Ci0JfQotCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotYXRvbWJpb3NfeXV2X3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhlbmNvZGVyLT5jcnRjKTsKLQlFTkFCTEVfWVVWX1BTX0FMTE9DQVRJT04gYXJnczsKLQlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBFbmFibGVZVVYpOwotCXVpbnQzMl90IHRlbXAsIHJlZzsKLQotCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLQotCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SNjAwKQotCQlyZWcgPSBSNjAwX0JJT1NfM19TQ1JBVENIOwotCWVsc2UKLQkJcmVnID0gUkFERU9OX0JJT1NfM19TQ1JBVENIOwotCi0JLyogWFhYOiBmaXggdXAgc2NyYXRjaCByZWcgaGFuZGxpbmcgKi8KLQl0ZW1wID0gUlJFRzMyKHJlZyk7Ci0JaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQotCQlXUkVHMzIocmVnLCAoQVRPTV9TM19UVjFfQUNUSVZFIHwKLQkJCSAgICAgKHJhZGVvbl9jcnRjLT5jcnRjX2lkIDw8IDE4KSkpOwotCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQlXUkVHMzIocmVnLCAoQVRPTV9TM19DVl9BQ1RJVkUgfCAocmFkZW9uX2NydGMtPmNydGNfaWQgPDwgMjQpKSk7Ci0JZWxzZQotCQlXUkVHMzIocmVnLCAwKTsKLQotCWlmIChlbmFibGUpCi0JCWFyZ3MudWNFbmFibGUgPSBBVE9NX0VOQUJMRTsKLQlhcmdzLnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOwotCi0JYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0KLQlXUkVHMzIocmVnLCB0ZW1wKTsKLX0KLQotc3RhdGljIHZvaWQKLXJhZGVvbl9hdG9tX2VuY29kZXJfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7Ci0JRElTUExBWV9ERVZJQ0VfT1VUUFVUX0NPTlRST0xfUFNfQUxMT0NBVElPTiBhcmdzOwotCWludCBpbmRleCA9IDA7Ci0JYm9vbCBpc19kaWcgPSBmYWxzZTsKLQlib29sIGlzX2RjZTVfZGFjID0gZmFsc2U7Ci0JYm9vbCBpc19kY2U1X2R2byA9IGZhbHNlOwotCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotCi0JRFJNX0RFQlVHX0tNUygiZW5jb2RlciBkcG1zICVkIHRvIG1vZGUgJWQsIGRldmljZXMgJTA4eCwgYWN0aXZlX2RldmljZXMgJTA4eFxuIiwKLQkJICByYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCwgbW9kZSwgcmFkZW9uX2VuY29kZXItPmRldmljZXMsCi0JCSAgcmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UpOwotCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxOgotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRNRFNBT3V0cHV0Q29udHJvbCk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6Ci0JCWlzX2RpZyA9IHRydWU7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESToKLQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEVk9PdXRwdXRDb250cm9sKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKLQkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkKLQkJCWlzX2RjZTVfZHZvID0gdHJ1ZTsKLQkJZWxzZSBpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKQotCQkJaXNfZGlnID0gdHJ1ZTsKLQkJZWxzZQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEVk9PdXRwdXRDb250cm9sKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIExDRDFPdXRwdXRDb250cm9sKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVlRNMToKLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKLQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgTENEMU91dHB1dENvbnRyb2wpOwotCQllbHNlCi0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIExWVE1BT3V0cHV0Q29udHJvbCk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgotCQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKQotCQkJaXNfZGNlNV9kYWMgPSB0cnVlOwotCQllbHNlIHsKLQkJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKLQkJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRWMU91dHB1dENvbnRyb2wpOwotCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBDVjFPdXRwdXRDb250cm9sKTsKLQkJCWVsc2UKLQkJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQzFPdXRwdXRDb250cm9sKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzI6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMjoKLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBUVjFPdXRwdXRDb250cm9sKTsKLQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIENWMU91dHB1dENvbnRyb2wpOwotCQllbHNlCi0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQzJPdXRwdXRDb250cm9sKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGlzX2RpZykgewotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgotCQkJLyogc29tZSBlYXJseSBkY2UzLjIgYm9hcmRzIGhhdmUgYSBidWcgaW4gdGhlaXIgdHJhbnNtaXR0ZXIgY29udHJvbCB0YWJsZSAqLwotCQkJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjcxMCkgfHwgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNzMwKSkKLQkJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFLCAwLCAwKTsKLQkJCWVsc2UKLQkJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFX09VVFBVVCwgMCwgMCk7Ci0JCQlpZiAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgewotCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKLQotCQkJCWlmIChjb25uZWN0b3IgJiYKLQkJCQkgICAgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkpIHsKLQkJCQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JCQkJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpyYWRlb25fZGlnX2Nvbm5lY3RvciA9Ci0JCQkJCQlyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKLQkJCQkJYXRvbWJpb3Nfc2V0X2VkcF9wYW5lbF9wb3dlcihjb25uZWN0b3IsCi0JCQkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT04pOwotCQkJCQlyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZWRwX29uID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKLQkJCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkNPREVSX0NNRF9EUF9WSURFT19PRkYsIDApOwotCQkJCXJhZGVvbl9kcF9saW5rX3RyYWluKGVuY29kZXIsIGNvbm5lY3Rvcik7Ci0JCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKLQkJCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkNPREVSX0NNRF9EUF9WSURFT19PTiwgMCk7Ci0JCQl9Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKQotCQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9MQ0RfQkxPTiwgMCwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6Ci0JCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgotCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgotCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0RJU0FCTEVfT1VUUFVULCAwLCAwKTsKLQkJCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB7Ci0JCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwotCi0JCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKLQkJCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkNPREVSX0NNRF9EUF9WSURFT19PRkYsIDApOwotCQkJCWlmIChjb25uZWN0b3IgJiYKLQkJCQkgICAgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkpIHsKLQkJCQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JCQkJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpyYWRlb25fZGlnX2Nvbm5lY3RvciA9Ci0JCQkJCQlyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKLQkJCQkJYXRvbWJpb3Nfc2V0X2VkcF9wYW5lbF9wb3dlcihjb25uZWN0b3IsCi0JCQkJCQkJCSAgICAgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fUE9XRVJfT0ZGKTsKLQkJCQkJcmFkZW9uX2RpZ19jb25uZWN0b3ItPmVkcF9vbiA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpCi0JCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0xDRF9CTE9GRiwgMCwgMCk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSBpZiAoaXNfZGNlNV9kYWMpIHsKLQkJc3dpdGNoIChtb2RlKSB7Ci0JCWNhc2UgRFJNX01PREVfRFBNU19PTjoKLQkJCWF0b21iaW9zX2RhY19zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSk7Ci0JCQlicmVhazsKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6Ci0JCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgotCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgotCQkJYXRvbWJpb3NfZGFjX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSBpZiAoaXNfZGNlNV9kdm8pIHsKLQkJc3dpdGNoIChtb2RlKSB7Ci0JCWNhc2UgRFJNX01PREVfRFBNU19PTjoKLQkJCWF0b21iaW9zX2R2b19zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSk7Ci0JCQlicmVhazsKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6Ci0JCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgotCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgotCQkJYXRvbWJpb3NfZHZvX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCXN3aXRjaCAobW9kZSkgewotCQljYXNlIERSTV9NT0RFX0RQTVNfT046Ci0JCQlhcmdzLnVjQWN0aW9uID0gQVRPTV9FTkFCTEU7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBEVk9PdXRwdXRDb250cm9sIG9uIHNvbWUgUlM2OTAgc3lzdGVtcyAqLwotCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESSkgewotCQkJCXUzMiByZWcgPSBSUkVHMzIoUkFERU9OX0JJT1NfM19TQ1JBVENIKTsKLQkJCQlXUkVHMzIoUkFERU9OX0JJT1NfM19TQ1JBVENILCByZWcgJiB+QVRPTV9TM19ERlAySV9BQ1RJVkUpOwotCQkJCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotCQkJCVdSRUczMihSQURFT05fQklPU18zX1NDUkFUQ0gsIHJlZyk7Ci0JCQl9IGVsc2UKLQkJCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLQkJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHsKLQkJCQlhcmdzLnVjQWN0aW9uID0gQVRPTV9MQ0RfQkxPTjsKLQkJCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6Ci0JCWNhc2UgRFJNX01PREVfRFBNU19PRkY6Ci0JCQlhcmdzLnVjQWN0aW9uID0gQVRPTV9ESVNBQkxFOwotCQkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7Ci0JCQkJYXJncy51Y0FjdGlvbiA9IEFUT01fTENEX0JMT0ZGOwotCQkJCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoZXh0X2VuY29kZXIpIHsKLQkJc3dpdGNoIChtb2RlKSB7Ci0JCWNhc2UgRFJNX01PREVfRFBNU19PTjoKLQkJZGVmYXVsdDoKLQkJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKSB7Ci0JCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKLQkJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5BQkxFX09VVFBVVCk7Ci0JCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKLQkJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9CTEFOS0lOR19PRkYpOwotCQkJfSBlbHNlCi0JCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgQVRPTV9FTkFCTEUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgotCQljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKLQkJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKSB7Ci0JCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKLQkJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9CTEFOS0lORyk7Ci0JCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKLQkJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRElTQUJMRV9PVVRQVVQpOwotCQkJfSBlbHNlCi0JCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmFkZW9uX2F0b21iaW9zX2VuY29kZXJfZHBtc19zY3JhdGNoX3JlZ3MoZW5jb2RlciwgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikgPyB0cnVlIDogZmFsc2UpOwotCi19Ci0KLXVuaW9uIGNydGNfc291cmNlX3BhcmFtIHsKLQlTRUxFQ1RfQ1JUQ19TT1VSQ0VfUFNfQUxMT0NBVElPTiB2MTsKLQlTRUxFQ1RfQ1JUQ19TT1VSQ0VfUEFSQU1FVEVSU19WMiB2MjsKLX07Ci0KLXN0YXRpYyB2b2lkCi1hdG9tYmlvc19zZXRfZW5jb2Rlcl9jcnRjX3NvdXJjZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhlbmNvZGVyLT5jcnRjKTsKLQl1bmlvbiBjcnRjX3NvdXJjZV9wYXJhbSBhcmdzOwotCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFNlbGVjdENSVENfU291cmNlKTsKLQl1aW50OF90IGZyZXYsIGNyZXY7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWc7Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChmcmV2KSB7Ci0JY2FzZSAxOgotCQlzd2l0Y2ggKGNyZXYpIHsKLQkJY2FzZSAxOgotCQlkZWZhdWx0OgotCQkJaWYgKEFTSUNfSVNfQVZJVk8ocmRldikpCi0JCQkJYXJncy52MS51Y0NSVEMgPSByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKLQkJCWVsc2UgewotCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxKSB7Ci0JCQkJCWFyZ3MudjEudWNDUlRDID0gcmFkZW9uX2NydGMtPmNydGNfaWQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXJncy52MS51Y0NSVEMgPSByYWRlb25fY3J0Yy0+Y3J0Y19pZCA8PCAyOwotCQkJCX0KLQkJCX0KLQkJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9UTURTMToKLQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfREZQMV9JTkRFWDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6Ci0JCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfTENEMV9TVVBQT1JUKQotCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfTENEMV9JTkRFWDsKLQkJCQllbHNlCi0JCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9ERlAzX0lOREVYOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgotCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9ERlAyX0lOREVYOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKLQkJCQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCi0JCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9UVjFfSU5ERVg7Ci0JCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9DVl9JTkRFWDsKLQkJCQllbHNlCi0JCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9DUlQxX0lOREVYOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMyOgotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMjoKLQkJCQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCi0JCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9UVjFfSU5ERVg7Ci0JCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9DVl9JTkRFWDsKLQkJCQllbHNlCi0JCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9DUlQyX0lOREVYOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWFyZ3MudjIudWNDUlRDID0gcmFkZW9uX2NydGMtPmNydGNfaWQ7Ci0JCQlpZiAocmFkZW9uX2VuY29kZXJfaXNfZHBfYnJpZGdlKGVuY29kZXIpKSB7Ci0JCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwotCi0JCQkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpCi0JCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gQVRPTV9FTkNPREVSX01PREVfTFZEUzsKLQkJCQllbHNlIGlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EpCi0JCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gQVRPTV9FTkNPREVSX01PREVfQ1JUOwotCQkJCWVsc2UKLQkJCQkJYXJncy52Mi51Y0VuY29kZU1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOwotCQkJfSBlbHNlCi0JCQkJYXJncy52Mi51Y0VuY29kZU1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOwotCQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKLQkJCQlkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0JCQkJc3dpdGNoIChkaWctPmRpZ19lbmNvZGVyKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHMV9FTkNPREVSX0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUcyX0VOQ09ERVJfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RJRzNfRU5DT0RFUl9JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHNF9FTkNPREVSX0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ6Ci0JCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUc1X0VOQ09ERVJfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNToKLQkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RJRzZfRU5DT0RFUl9JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKLQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRFZPX0VOQ09ERVJfSUQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgotCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKLQkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX1RWX0VOQ09ERVJfSUQ7Ci0JCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9UVl9FTkNPREVSX0lEOwotCQkJCWVsc2UKLQkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RBQzFfRU5DT0RFUl9JRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6Ci0JCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQotCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfVFZfRU5DT0RFUl9JRDsKLQkJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKLQkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX1RWX0VOQ09ERVJfSUQ7Ci0JCQkJZWxzZQotCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfREFDMl9FTkNPREVSX0lEOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb246ICVkLCAlZFxuIiwgZnJldiwgY3Jldik7Ci0JCXJldHVybjsKLQl9Ci0KLQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLQotCS8qIHVwZGF0ZSBzY3JhdGNoIHJlZ3Mgd2l0aCBuZXcgcm91dGluZyAqLwotCXJhZGVvbl9hdG9tYmlvc19lbmNvZGVyX2NydGNfc2NyYXRjaF9yZWdzKGVuY29kZXIsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKLX0KLQotc3RhdGljIHZvaWQKLWF0b21iaW9zX2FwcGx5X2VuY29kZXJfcXVpcmtzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoZW5jb2Rlci0+Y3J0Yyk7Ci0KLQkvKiBGdW5reSBtYWNib29rcyAqLwotCWlmICgoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg3MUM1KSAmJgotCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTA2YikgJiYKLQkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAwODApKSB7Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCkgewotCQkJdWludDMyX3QgbHZ0bWFfYml0X2RlcHRoX2NvbnRyb2wgPSBSUkVHMzIoQVZJVk9fTFZUTUFfQklUX0RFUFRIX0NPTlRST0wpOwotCi0JCQlsdnRtYV9iaXRfZGVwdGhfY29udHJvbCAmPSB+QVZJVk9fTFZUTUFfQklUX0RFUFRIX0NPTlRST0xfVFJVTkNBVEVfRU47Ci0JCQlsdnRtYV9iaXRfZGVwdGhfY29udHJvbCAmPSB+QVZJVk9fTFZUTUFfQklUX0RFUFRIX0NPTlRST0xfU1BBVElBTF9ESVRIRVJfRU47Ci0KLQkJCVdSRUczMihBVklWT19MVlRNQV9CSVRfREVQVEhfQ09OVFJPTCwgbHZ0bWFfYml0X2RlcHRoX2NvbnRyb2wpOwotCQl9Ci0JfQotCi0JLyogc2V0IHNjYWxlciBjbGVhcnMgdGhpcyBvbiBzb21lIGNoaXBzICovCi0JaWYgKEFTSUNfSVNfQVZJVk8ocmRldikgJiYKLQkgICAgKCEocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpKSkgewotCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7Ci0JCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKLQkJCQlXUkVHMzIoRVZFUkdSRUVOX0RBVEFfRk9STUFUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAotCQkJCSAgICAgICBFVkVSR1JFRU5fSU5URVJMRUFWRV9FTik7Ci0JCQllbHNlCi0JCQkJV1JFRzMyKEVWRVJHUkVFTl9EQVRBX0ZPUk1BVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKLQkJCQlXUkVHMzIoQVZJVk9fRDFNT0RFX0RBVEFfRk9STUFUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAotCQkJCSAgICAgICBBVklWT19EMU1PREVfSU5URVJMRUFWRV9FTik7Ci0JCQllbHNlCi0JCQkJV1JFRzMyKEFWSVZPX0QxTU9ERV9EQVRBX0ZPUk1BVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgcmFkZW9uX2F0b21fcGlja19kaWdfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGVuY29kZXItPmNydGMpOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKnRlc3RfZW5jb2RlcjsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZzsKLQl1aW50MzJfdCBkaWdfZW5jX2luX3VzZSA9IDA7Ci0KLQkvKiBEQ0U0LzUgKi8KLQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7Ci0JCWRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKLQkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpIHsKLQkJCS8qIG9udGFyaW8gZm9sbG93cyBEQ0U0ICovCi0JCQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfUEFMTSkgewotCQkJCWlmIChkaWctPmxpbmtiKQotCQkJCQlyZXR1cm4gMTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiAwOwotCQkJfSBlbHNlCi0JCQkJLyogbGxhbm8gZm9sbG93cyBEQ0UzLjIgKi8KLQkJCQlyZXR1cm4gcmFkZW9uX2NydGMtPmNydGNfaWQ7Ci0JCX0gZWxzZSB7Ci0JCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKLQkJCQlpZiAoZGlnLT5saW5rYikKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKLQkJCQlpZiAoZGlnLT5saW5rYikKLQkJCQkJcmV0dXJuIDM7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQkJCQlpZiAoZGlnLT5saW5rYikKLQkJCQkJcmV0dXJuIDU7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gNDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qIG9uIERDRTMyIGFuZCBlbmNvZGVyIGNhbiBkcml2ZXIgYW55IGJsb2NrIHNvIGp1c3QgY3J0YyBpZCAqLwotCWlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKSB7Ci0JCXJldHVybiByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKLQl9Ci0KLQkvKiBvbiBEQ0UzIC0gTFZUTUEgY2FuIG9ubHkgYmUgZHJpdmVuIGJ5IERJR0IgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlc3RfZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7Ci0JCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX3Rlc3RfZW5jb2RlcjsKLQotCQlpZiAoZW5jb2RlciA9PSB0ZXN0X2VuY29kZXIpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIXJhZGVvbl9lbmNvZGVyX2lzX2RpZ2l0YWwodGVzdF9lbmNvZGVyKSkKLQkJCWNvbnRpbnVlOwotCi0JCXJhZGVvbl90ZXN0X2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2Rlcih0ZXN0X2VuY29kZXIpOwotCQlkaWcgPSByYWRlb25fdGVzdF9lbmNvZGVyLT5lbmNfcHJpdjsKLQotCQlpZiAoZGlnLT5kaWdfZW5jb2RlciA+PSAwKQotCQkJZGlnX2VuY19pbl91c2UgfD0gKDEgPDwgZGlnLT5kaWdfZW5jb2Rlcik7Ci0JfQotCi0JaWYgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQSkgewotCQlpZiAoZGlnX2VuY19pbl91c2UgJiAweDIpCi0JCQlEUk1fRVJST1IoIkxWRFMgcmVxdWlyZWQgZGlnaXRhbCBlbmNvZGVyIDIgYnV0IGl0IHdhcyBpbiB1c2UgLSBzdGVhbGluZ1xuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIShkaWdfZW5jX2luX3VzZSAmIDEpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotLyogVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0dXAgKi8KLXZvaWQKLXJhZGVvbl9hdG9tX2VuY29kZXJfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmRldi0+ZGRldjsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewotCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0JCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIgPSByYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihlbmNvZGVyKTsKLQotCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6Ci0JCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fSU5JVCwgMCwgMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGV4dF9lbmNvZGVyICYmIEFTSUNfSVNfRENFNDEocmRldikpCi0JCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAotCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfSU5JVCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcmFkZW9uX2F0b21fZW5jb2Rlcl9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAotCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciA9IHJhZGVvbl9hdG9tX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOwotCi0JcmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID0gYWRqdXN0ZWRfbW9kZS0+Y2xvY2s7Ci0KLQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSAmJiAhQVNJQ19JU19EQ0U0KHJkZXYpKSB7Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCi0JCQlhdG9tYmlvc195dXZfc2V0dXAoZW5jb2RlciwgdHJ1ZSk7Ci0JCWVsc2UKLQkJCWF0b21iaW9zX3l1dl9zZXR1cChlbmNvZGVyLCBmYWxzZSk7Ci0JfQotCi0Jc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6Ci0JCWF0b21iaW9zX2RpZ2l0YWxfc2V0dXAoZW5jb2RlciwgUEFORUxfRU5DT0RFUl9BQ1RJT05fRU5BQkxFKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKLQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgewotCQkJLyogZGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KLQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9ESVNBQkxFLCAwLCAwKTsKLQkJCS8qIHNldHVwIGFuZCBlbmFibGUgdGhlIGVuY29kZXIgKi8KLQkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRU5DT0RFUl9DTURfU0VUVVAsIDApOwotCi0JCQkvKiBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCi0JCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFLCAwLCAwKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGRpc2FibGUgdGhlIGVuY29kZXIgYW5kIHRyYW5zbWl0dGVyICovCi0JCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRElTQUJMRSwgMCwgMCk7Ci0JCQlhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUsIDApOwotCi0JCQkvKiBzZXR1cCBhbmQgZW5hYmxlIHRoZSBlbmNvZGVyIGFuZCB0cmFuc21pdHRlciAqLwotCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUsIDApOwotCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1NFVFVQLCAwLCAwKTsKLQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEUsIDAsIDApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRERJOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgotCQlhdG9tYmlvc19kdm9fc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzI6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMjoKLQkJYXRvbWJpb3NfZGFjX3NldHVwKGVuY29kZXIsIEFUT01fRU5BQkxFKTsKLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkgewotCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKLQkJCQlhdG9tYmlvc190dl9zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSk7Ci0JCQllbHNlCi0JCQkJYXRvbWJpb3NfdHZfc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlpZiAoZXh0X2VuY29kZXIpIHsKLQkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpCi0JCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAotCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfU0VUVVApOwotCQllbHNlCi0JCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLCBBVE9NX0VOQUJMRSk7Ci0JfQotCi0JYXRvbWJpb3NfYXBwbHlfZW5jb2Rlcl9xdWlya3MoZW5jb2RlciwgYWRqdXN0ZWRfbW9kZSk7Ci0KLQlpZiAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JKSB7Ci0JCXI2MDBfaGRtaV9lbmFibGUoZW5jb2Rlcik7Ci0JCXI2MDBfaGRtaV9zZXRtb2RlKGVuY29kZXIsIGFkanVzdGVkX21vZGUpOwotCX0KLX0KLQotc3RhdGljIGJvb2wKLWF0b21iaW9zX2RhY19sb2FkX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCi0JaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQgfAotCQkJCSAgICAgICBBVE9NX0RFVklDRV9DVl9TVVBQT1JUIHwKLQkJCQkgICAgICAgQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpKSB7Ci0JCURBQ19MT0FEX0RFVEVDVElPTl9QU19BTExPQ0FUSU9OIGFyZ3M7Ci0JCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQ19Mb2FkRGV0ZWN0aW9uKTsKLQkJdWludDhfdCBmcmV2LCBjcmV2OwotCi0JCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLQotCQlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlhcmdzLnNEYWNsb2FkLnVjTWlzYyA9IDA7Ci0KLQkJaWYgKChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxKSB8fAotCQkgICAgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxKSkKLQkJCWFyZ3Muc0RhY2xvYWQudWNEYWNUeXBlID0gQVRPTV9EQUNfQTsKLQkJZWxzZQotCQkJYXJncy5zRGFjbG9hZC51Y0RhY1R5cGUgPSBBVE9NX0RBQ19COwotCi0JCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKQotCQkJYXJncy5zRGFjbG9hZC51c0RldmljZUlEID0gY3B1X3RvX2xlMTYoQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKTsKLQkJZWxzZSBpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCkKLQkJCWFyZ3Muc0RhY2xvYWQudXNEZXZpY2VJRCA9IGNwdV90b19sZTE2KEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCk7Ci0JCWVsc2UgaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSB7Ci0JCQlhcmdzLnNEYWNsb2FkLnVzRGV2aWNlSUQgPSBjcHVfdG9fbGUxNihBVE9NX0RFVklDRV9DVl9TVVBQT1JUKTsKLQkJCWlmIChjcmV2ID49IDMpCi0JCQkJYXJncy5zRGFjbG9hZC51Y01pc2MgPSBEQUNfTE9BRF9NSVNDX1lQclBiOwotCQl9IGVsc2UgaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCkgewotCQkJYXJncy5zRGFjbG9hZC51c0RldmljZUlEID0gY3B1X3RvX2xlMTYoQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpOwotCQkJaWYgKGNyZXYgPj0gMykKLQkJCQlhcmdzLnNEYWNsb2FkLnVjTWlzYyA9IERBQ19MT0FEX01JU0NfWVByUGI7Ci0JCX0KLQotCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwotcmFkZW9uX2F0b21fZGFjX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCXVpbnQzMl90IGJpb3NfMF9zY3JhdGNoOwotCi0JaWYgKCFhdG9tYmlvc19kYWNfbG9hZF9kZXRlY3QoZW5jb2RlciwgY29ubmVjdG9yKSkgewotCQlEUk1fREVCVUdfS01TKCJkZXRlY3QgcmV0dXJuZWQgZmFsc2UgXG4iKTsKLQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKLQl9Ci0KLQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUjYwMCkKLQkJYmlvc18wX3NjcmF0Y2ggPSBSUkVHMzIoUjYwMF9CSU9TXzBfU0NSQVRDSCk7Ci0JZWxzZQotCQliaW9zXzBfc2NyYXRjaCA9IFJSRUczMihSQURFT05fQklPU18wX1NDUkFUQ0gpOwotCi0JRFJNX0RFQlVHX0tNUygiQmlvcyAwIHNjcmF0Y2ggJXggJTA4eFxuIiwgYmlvc18wX3NjcmF0Y2gsIHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzKTsKLQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCkgewotCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiBBVE9NX1MwX0NSVDFfTUFTSykKLQkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKLQl9Ci0JaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQpIHsKLQkJaWYgKGJpb3NfMF9zY3JhdGNoICYgQVRPTV9TMF9DUlQyX01BU0spCi0JCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Ci0JfQotCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkgewotCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiAoQVRPTV9TMF9DVl9NQVNLfEFUT01fUzBfQ1ZfTUFTS19BKSkKLQkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKLQl9Ci0JaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCkgewotCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiAoQVRPTV9TMF9UVjFfQ09NUE9TSVRFIHwgQVRPTV9TMF9UVjFfQ09NUE9TSVRFX0EpKQotCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOyAvKiBDVFYgKi8KLQkJZWxzZSBpZiAoYmlvc18wX3NjcmF0Y2ggJiAoQVRPTV9TMF9UVjFfU1ZJREVPIHwgQVRPTV9TMF9UVjFfU1ZJREVPX0EpKQotCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOyAvKiBTVFYgKi8KLQl9Ci0JcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwotfQotCi1zdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwotcmFkZW9uX2F0b21fZGlnX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIgPSByYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihlbmNvZGVyKTsKLQl1MzIgYmlvc18wX3NjcmF0Y2g7Ci0KLQlpZiAoIUFTSUNfSVNfRENFNChyZGV2KSkKLQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKLQotCWlmICghZXh0X2VuY29kZXIpCi0JCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247Ci0KLQlpZiAoKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkgPT0gMCkKLQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKLQotCS8qIGxvYWQgZGV0ZWN0IG9uIHRoZSBkcCBicmlkZ2UgKi8KLQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAotCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19EQUNMT0FEX0RFVEVDVElPTik7Ci0KLQliaW9zXzBfc2NyYXRjaCA9IFJSRUczMihSNjAwX0JJT1NfMF9TQ1JBVENIKTsKLQotCURSTV9ERUJVR19LTVMoIkJpb3MgMCBzY3JhdGNoICV4ICUwOHhcbiIsIGJpb3NfMF9zY3JhdGNoLCByYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyk7Ci0JaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQpIHsKLQkJaWYgKGJpb3NfMF9zY3JhdGNoICYgQVRPTV9TMF9DUlQxX01BU0spCi0JCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Ci0JfQotCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMl9TVVBQT1JUKSB7Ci0JCWlmIChiaW9zXzBfc2NyYXRjaCAmIEFUT01fUzBfQ1JUMl9NQVNLKQotCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotCX0KLQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NWX1NVUFBPUlQpIHsKLQkJaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfQ1ZfTUFTS3xBVE9NX1MwX0NWX01BU0tfQSkpCi0JCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Ci0JfQotCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpIHsKLQkJaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfVFYxX0NPTVBPU0lURSB8IEFUT01fUzBfVFYxX0NPTVBPU0lURV9BKSkKLQkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsgLyogQ1RWICovCi0JCWVsc2UgaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfVFYxX1NWSURFTyB8IEFUT01fUzBfVFYxX1NWSURFT19BKSkKLQkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsgLyogU1RWICovCi0JfQotCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKLX0KLQotdm9pZAotcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7Ci0KLQlpZiAoZXh0X2VuY29kZXIpCi0JCS8qIGRkY19zZXR1cCBvbiB0aGUgZHAgYnJpZGdlICovCi0JCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCi0JCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19ERENfU0VUVVApOwotCi19Ci0KLXN0YXRpYyB2b2lkIHJhZGVvbl9hdG9tX2VuY29kZXJfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKLQotCWlmICgocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJgotCSAgICAgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB8fAotCSAgICByYWRlb25fZW5jb2Rlcl9pc19kcF9icmlkZ2UoZW5jb2RlcikpIHsKLQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0JCWlmIChkaWcpCi0JCQlkaWctPmRpZ19lbmNvZGVyID0gcmFkZW9uX2F0b21fcGlja19kaWdfZW5jb2RlcihlbmNvZGVyKTsKLQl9Ci0KLQlyYWRlb25fYXRvbV9vdXRwdXRfbG9jayhlbmNvZGVyLCB0cnVlKTsKLQlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOwotCi0JaWYgKGNvbm5lY3RvcikgewotCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQotCQkvKiBzZWxlY3QgdGhlIGNsb2NrL2RhdGEgcG9ydCBpZiBpdCB1c2VzIGEgcm91dGVyICovCi0JCWlmIChyYWRlb25fY29ubmVjdG9yLT5yb3V0ZXIuY2RfdmFsaWQpCi0JCQlyYWRlb25fcm91dGVyX3NlbGVjdF9jZF9wb3J0KHJhZGVvbl9jb25uZWN0b3IpOwotCi0JCS8qIHR1cm4gZURQIHBhbmVsIG9uIGZvciBtb2RlIHNldCAqLwotCQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfZURQKQotCQkJYXRvbWJpb3Nfc2V0X2VkcF9wYW5lbF9wb3dlcihjb25uZWN0b3IsCi0JCQkJCQkgICAgIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09OKTsKLQl9Ci0KLQkvKiB0aGlzIGlzIG5lZWRlZCBmb3IgdGhlIHBsbC9zcyBzZXR1cCB0byB3b3JrIGNvcnJlY3RseSBpbiBzb21lIGNhc2VzICovCi0JYXRvbWJpb3Nfc2V0X2VuY29kZXJfY3J0Y19zb3VyY2UoZW5jb2Rlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJhZGVvbl9hdG9tX2VuY29kZXJfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7Ci0JcmFkZW9uX2F0b21fb3V0cHV0X2xvY2soZW5jb2RlciwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCByYWRlb25fYXRvbV9lbmNvZGVyX2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZzsKLQotCS8qIGNoZWNrIGZvciBwcmUtRENFMyBjYXJkcyB3aXRoIHNoYXJlZCBlbmNvZGVyczsKLQkgKiBjYW4ndCByZWFsbHkgdXNlIHRoZSBsaW5rcyBpbmRpdmlkdWFsbHksIHNvIGRvbid0IGRpc2FibGUKLQkgKiB0aGUgZW5jb2RlciBpZiBpdCdzIGluIHVzZSBieSBhbm90aGVyIGNvbm5lY3RvcgotCSAqLwotCWlmICghQVNJQ19JU19EQ0UzKHJkZXYpKSB7Ci0JCXN0cnVjdCBkcm1fZW5jb2RlciAqb3RoZXJfZW5jb2RlcjsKLQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpvdGhlcl9yYWRlb25fZW5jb2RlcjsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG90aGVyX2VuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewotCQkJb3RoZXJfcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihvdGhlcl9lbmNvZGVyKTsKLQkJCWlmICgocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gb3RoZXJfcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpICYmCi0JCQkgICAgZHJtX2hlbHBlcl9lbmNvZGVyX2luX3VzZShvdGhlcl9lbmNvZGVyKSkKLQkJCQlnb3RvIGRpc2FibGVfZG9uZTsKLQkJfQotCX0KLQotCXJhZGVvbl9hdG9tX2VuY29kZXJfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7Ci0KLQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9UTURTMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9UTURTMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVlRNMToKLQkJYXRvbWJpb3NfZGlnaXRhbF9zZXR1cChlbmNvZGVyLCBQQU5FTF9FTkNPREVSX0FDVElPTl9ESVNBQkxFKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKLQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKLQkJCS8qIGRpc2FibGUgdGhlIHRyYW5zbWl0dGVyICovCi0JCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRElTQUJMRSwgMCwgMCk7Ci0JCWVsc2UgewotCQkJLyogZGlzYWJsZSB0aGUgZW5jb2RlciBhbmQgdHJhbnNtaXR0ZXIgKi8KLQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9ESVNBQkxFLCAwLCAwKTsKLQkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSwgMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6Ci0JCWF0b21iaW9zX2R2b19zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzI6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMjoKLQkJYXRvbWJpb3NfZGFjX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSk7Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCQlhdG9tYmlvc190dl9zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOwotCQlicmVhazsKLQl9Ci0KLWRpc2FibGVfZG9uZToKLQlpZiAocmFkZW9uX2VuY29kZXJfaXNfZGlnaXRhbChlbmNvZGVyKSkgewotCQlpZiAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JKQotCQkJcjYwMF9oZG1pX2Rpc2FibGUoZW5jb2Rlcik7Ci0JCWRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKLQkJZGlnLT5kaWdfZW5jb2RlciA9IC0xOwotCX0KLQlyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSA9IDA7Ci19Ci0KLS8qIHRoZXNlIGFyZSBoYW5kbGVkIGJ5IHRoZSBwcmltYXJ5IGVuY29kZXJzICovCi1zdGF0aWMgdm9pZCByYWRlb25fYXRvbV9leHRfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0KLX0KLQotc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZXh0X2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0KLX0KLQotc3RhdGljIHZvaWQKLXJhZGVvbl9hdG9tX2V4dF9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCi0JCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCi17Ci0KLX0KLQotc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZXh0X2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCi19Ci0KLXN0YXRpYyB2b2lkCi1yYWRlb25fYXRvbV9leHRfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQotewotCi19Ci0KLXN0YXRpYyBib29sIHJhZGVvbl9hdG9tX2V4dF9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKLQkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCi0JCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQotewotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyByYWRlb25fYXRvbV9leHRfaGVscGVyX2Z1bmNzID0gewotCS5kcG1zID0gcmFkZW9uX2F0b21fZXh0X2RwbXMsCi0JLm1vZGVfZml4dXAgPSByYWRlb25fYXRvbV9leHRfbW9kZV9maXh1cCwKLQkucHJlcGFyZSA9IHJhZGVvbl9hdG9tX2V4dF9wcmVwYXJlLAotCS5tb2RlX3NldCA9IHJhZGVvbl9hdG9tX2V4dF9tb2RlX3NldCwKLQkuY29tbWl0ID0gcmFkZW9uX2F0b21fZXh0X2NvbW1pdCwKLQkuZGlzYWJsZSA9IHJhZGVvbl9hdG9tX2V4dF9kaXNhYmxlLAotCS8qIG5vIGRldGVjdCBmb3IgVE1EUy9MVkRTIHlldCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgcmFkZW9uX2F0b21fZGlnX2hlbHBlcl9mdW5jcyA9IHsKLQkuZHBtcyA9IHJhZGVvbl9hdG9tX2VuY29kZXJfZHBtcywKLQkubW9kZV9maXh1cCA9IHJhZGVvbl9hdG9tX21vZGVfZml4dXAsCi0JLnByZXBhcmUgPSByYWRlb25fYXRvbV9lbmNvZGVyX3ByZXBhcmUsCi0JLm1vZGVfc2V0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9tb2RlX3NldCwKLQkuY29tbWl0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9jb21taXQsCi0JLmRpc2FibGUgPSByYWRlb25fYXRvbV9lbmNvZGVyX2Rpc2FibGUsCi0JLmRldGVjdCA9IHJhZGVvbl9hdG9tX2RpZ19kZXRlY3QsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyByYWRlb25fYXRvbV9kYWNfaGVscGVyX2Z1bmNzID0gewotCS5kcG1zID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zLAotCS5tb2RlX2ZpeHVwID0gcmFkZW9uX2F0b21fbW9kZV9maXh1cCwKLQkucHJlcGFyZSA9IHJhZGVvbl9hdG9tX2VuY29kZXJfcHJlcGFyZSwKLQkubW9kZV9zZXQgPSByYWRlb25fYXRvbV9lbmNvZGVyX21vZGVfc2V0LAotCS5jb21taXQgPSByYWRlb25fYXRvbV9lbmNvZGVyX2NvbW1pdCwKLQkuZGV0ZWN0ID0gcmFkZW9uX2F0b21fZGFjX2RldGVjdCwKLX07Ci0KLXZvaWQgcmFkZW9uX2VuY19kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Ja2ZyZWUocmFkZW9uX2VuY29kZXItPmVuY19wcml2KTsKLQlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOwotCWtmcmVlKHJhZGVvbl9lbmNvZGVyKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyByYWRlb25fYXRvbV9lbmNfZnVuY3MgPSB7Ci0JLmRlc3Ryb3kgPSByYWRlb25fZW5jX2Rlc3Ryb3ksCi19OwotCi1zdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKgotcmFkZW9uX2F0b21iaW9zX3NldF9kYWNfaW5mbyhzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByYWRlb25fZW5jb2Rlci0+YmFzZS5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RhYyAqZGFjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGFjKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWRhYykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkYWMtPnR2X3N0ZCA9IHJhZGVvbl9hdG9tYmlvc19nZXRfdHZfaW5mbyhyZGV2KTsKLQlyZXR1cm4gZGFjOwotfQotCi1zdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKgotcmFkZW9uX2F0b21iaW9zX3NldF9kaWdfaW5mbyhzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyKQotewotCWludCBlbmNvZGVyX2VudW0gPSAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfZW51bSAmIEVOVU1fSURfTUFTSykgPj4gRU5VTV9JRF9TSElGVDsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFkaWcpCi0JCXJldHVybiBOVUxMOwotCi0JLyogY29oZXJlbnQgbW9kZSBieSBkZWZhdWx0ICovCi0JZGlnLT5jb2hlcmVudF9tb2RlID0gdHJ1ZTsKLQlkaWctPmRpZ19lbmNvZGVyID0gLTE7Ci0KLQlpZiAoZW5jb2Rlcl9lbnVtID09IDIpCi0JCWRpZy0+bGlua2IgPSB0cnVlOwotCWVsc2UKLQkJZGlnLT5saW5rYiA9IGZhbHNlOwotCi0JcmV0dXJuIGRpZzsKLX0KLQotdm9pZAotcmFkZW9uX2FkZF9hdG9tX2VuY29kZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCXVpbnQzMl90IGVuY29kZXJfZW51bSwKLQkJCXVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsCi0JCQl1MTYgY2FwcykKLXsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXI7Ci0KLQkvKiBzZWUgaWYgd2UgYWxyZWFkeSBhZGRlZCBpdCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7Ci0JCXJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9lbnVtID09IGVuY29kZXJfZW51bSkgewotCQkJcmFkZW9uX2VuY29kZXItPmRldmljZXMgfD0gc3VwcG9ydGVkX2RldmljZTsKLQkJCXJldHVybjsKLQkJfQotCi0JfQotCi0JLyogYWRkIGEgbmV3IG9uZSAqLwotCXJhZGVvbl9lbmNvZGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyYWRlb25fZW5jb2RlcikKLQkJcmV0dXJuOwotCi0JZW5jb2RlciA9ICZyYWRlb25fZW5jb2Rlci0+YmFzZTsKLQlzd2l0Y2ggKHJkZXYtPm51bV9jcnRjKSB7Ci0JY2FzZSAxOgotCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4MTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCWRlZmF1bHQ6Ci0JCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHgzOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHhmOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gMHgzZjsKLQkJYnJlYWs7Ci0JfQotCi0JcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gTlVMTDsKLQotCXJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2VudW0gPSBlbmNvZGVyX2VudW07Ci0JcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPSAoZW5jb2Rlcl9lbnVtICYgT0JKRUNUX0lEX01BU0spID4+IE9CSkVDVF9JRF9TSElGVDsKLQlyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyA9IHN1cHBvcnRlZF9kZXZpY2U7Ci0JcmFkZW9uX2VuY29kZXItPnJteF90eXBlID0gUk1YX09GRjsKLQlyYWRlb25fZW5jb2Rlci0+dW5kZXJzY2FuX3R5cGUgPSBVTkRFUlNDQU5fT0ZGOwotCXJhZGVvbl9lbmNvZGVyLT5pc19leHRfZW5jb2RlciA9IGZhbHNlOwotCXJhZGVvbl9lbmNvZGVyLT5jYXBzID0gY2FwczsKLQotCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9UTURTMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9UTURTMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgotCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7Ci0JCQlyYWRlb25fZW5jb2Rlci0+cm14X3R5cGUgPSBSTVhfRlVMTDsKLQkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX0xWRFMpOwotCQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX2dldF9sdmRzX2luZm8ocmFkZW9uX2VuY29kZXIpOwotCQl9IGVsc2UgewotCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7Ci0JCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fYXRvbWJpb3Nfc2V0X2RpZ19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKLQkJfQotCQlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZyYWRlb25fYXRvbV9kaWdfaGVscGVyX2Z1bmNzKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgotCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9EQUMpOwotCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fYXRvbWJpb3Nfc2V0X2RhY19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKLQkJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmcmFkZW9uX2F0b21fZGFjX2hlbHBlcl9mdW5jcyk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6Ci0JCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX1RWREFDKTsKLQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX3NldF9kYWNfaW5mbyhyYWRlb25fZW5jb2Rlcik7Ci0JCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJnJhZGVvbl9hdG9tX2RhY19oZWxwZXJfZnVuY3MpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RWTzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgotCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7Ci0JCQlyYWRlb25fZW5jb2Rlci0+cm14X3R5cGUgPSBSTVhfRlVMTDsKLQkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX0xWRFMpOwotCQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX2dldF9sdmRzX2luZm8ocmFkZW9uX2VuY29kZXIpOwotCQl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0NSVF9TVVBQT1JUKSkgewotCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfREFDKTsKLQkJCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IHJhZGVvbl9hdG9tYmlvc19zZXRfZGlnX2luZm8ocmFkZW9uX2VuY29kZXIpOwotCQl9IGVsc2UgewotCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7Ci0JCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fYXRvbWJpb3Nfc2V0X2RpZ19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKLQkJfQotCQlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZyYWRlb25fYXRvbV9kaWdfaGVscGVyX2Z1bmNzKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9TSTE3MEI6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9DSDczMDM6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9FWFRFUk5BTF9TRFZPQToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0VYVEVSTkFMX1NEVk9COgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfVElURlA1MTM6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9WVDE2MjM6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9IRE1JX1NJMTkzMDoKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX1RSQVZJUzoKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX05VVE1FRzoKLQkJLyogdGhlc2UgYXJlIGhhbmRsZWQgYnkgdGhlIHByaW1hcnkgZW5jb2RlcnMgKi8KLQkJcmFkZW9uX2VuY29kZXItPmlzX2V4dF9lbmNvZGVyID0gdHJ1ZTsKLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKLQkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX0xWRFMpOwotCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkpCi0JCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9EQUMpOwotCQllbHNlCi0JCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9UTURTKTsKLQkJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmcmFkZW9uX2F0b21fZXh0X2hlbHBlcl9mdW5jcyk7Ci0JCWJyZWFrOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCmluZGV4IDM0NzVhMDkuLjc2ZWMwZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJCSAqLwogCQlpZiAoc2VxID09IHJkZXYtPmZlbmNlX2Rydi5sYXN0X3NlcSAmJiByYWRlb25fZ3B1X2lzX2xvY2t1cChyZGV2KSkgewogCQkJLyogZ29vZCBuZXdzIHdlIGJlbGlldmUgaXQncyBhIGxvY2t1cCAqLwotCQkJV0FSTigxLCAiR1BVIGxvY2t1cCAod2FpdGluZyBmb3IgMHglMDhYIGxhc3QgZmVuY2UgaWQgMHglMDhYKVxuIiwKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdQVSBsb2NrdXAgKHdhaXRpbmcgZm9yIDB4JTA4WCBsYXN0IGZlbmNlIGlkIDB4JTA4WClcbiIsCiAJCQkgICAgIGZlbmNlLT5zZXEsIHNlcSk7CiAJCQkvKiBGSVhNRTogd2hhdCBzaG91bGQgd2UgZG8gPyBtYXJraW5nIGV2ZXJ5b25lCiAJCQkgKiBhcyBzaWduYWxlZCBmb3Igbm93CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nYXJ0LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nYXJ0LmMKaW5kZXggYTUzM2Y1Mi4uYmE3YWI3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZ2FydC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2dhcnQuYwpAQCAtNDksMjcgKzQ5LDI3IEBACiAJCQkgICAgICByZGV2LT5nYXJ0LnRhYmxlX3NpemUgPj4gUEFHRV9TSElGVCk7CiAJfQogI2VuZGlmCi0JcmRldi0+Z2FydC50YWJsZS5yYW0ucHRyID0gcHRyOwotCW1lbXNldCgodm9pZCAqKXJkZXYtPmdhcnQudGFibGUucmFtLnB0ciwgMCwgcmRldi0+Z2FydC50YWJsZV9zaXplKTsKKwlyZGV2LT5nYXJ0LnB0ciA9IHB0cjsKKwltZW1zZXQoKHZvaWQgKilyZGV2LT5nYXJ0LnB0ciwgMCwgcmRldi0+Z2FydC50YWJsZV9zaXplKTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCByYWRlb25fZ2FydF90YWJsZV9yYW1fZnJlZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpZiAocmRldi0+Z2FydC50YWJsZS5yYW0ucHRyID09IE5VTEwpIHsKKwlpZiAocmRldi0+Z2FydC5wdHIgPT0gTlVMTCkgewogCQlyZXR1cm47CiAJfQogI2lmZGVmIENPTkZJR19YODYKIAlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfUlM0MDAgfHwgcmRldi0+ZmFtaWx5ID09IENISVBfUlM0ODAgfHwKIAkgICAgcmRldi0+ZmFtaWx5ID09IENISVBfUlM2OTAgfHwgcmRldi0+ZmFtaWx5ID09IENISVBfUlM3NDApIHsKLQkJc2V0X21lbW9yeV93YigodW5zaWduZWQgbG9uZylyZGV2LT5nYXJ0LnRhYmxlLnJhbS5wdHIsCisJCXNldF9tZW1vcnlfd2IoKHVuc2lnbmVkIGxvbmcpcmRldi0+Z2FydC5wdHIsCiAJCQkgICAgICByZGV2LT5nYXJ0LnRhYmxlX3NpemUgPj4gUEFHRV9TSElGVCk7CiAJfQogI2VuZGlmCiAJcGNpX2ZyZWVfY29uc2lzdGVudChyZGV2LT5wZGV2LCByZGV2LT5nYXJ0LnRhYmxlX3NpemUsCi0JCQkgICAgKHZvaWQgKilyZGV2LT5nYXJ0LnRhYmxlLnJhbS5wdHIsCisJCQkgICAgKHZvaWQgKilyZGV2LT5nYXJ0LnB0ciwKIAkJCSAgICByZGV2LT5nYXJ0LnRhYmxlX2FkZHIpOwotCXJkZXYtPmdhcnQudGFibGUucmFtLnB0ciA9IE5VTEw7CisJcmRldi0+Z2FydC5wdHIgPSBOVUxMOwogCXJkZXYtPmdhcnQudGFibGVfYWRkciA9IDA7CiB9CiAKQEAgLTc3LDEwICs3NywxMCBAQAogewogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqID09IE5VTEwpIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKIAkJciA9IHJhZGVvbl9ib19jcmVhdGUocmRldiwgcmRldi0+Z2FydC50YWJsZV9zaXplLAogCQkJCSAgICAgUEFHRV9TSVpFLCB0cnVlLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAotCQkJCSAgICAgJnJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKKwkJCQkgICAgICZyZGV2LT5nYXJ0LnJvYmopOwogCQlpZiAocikgewogCQkJcmV0dXJuIHI7CiAJCX0KQEAgLTkzLDM4ICs5Myw0NiBAQAogCXVpbnQ2NF90IGdwdV9hZGRyOwogCWludCByOwogCi0JciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7CisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQucm9iaiwgZmFsc2UpOwogCWlmICh1bmxpa2VseShyICE9IDApKQogCQlyZXR1cm4gcjsKLQlyID0gcmFkZW9uX2JvX3BpbihyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiwKKwlyID0gcmFkZW9uX2JvX3BpbihyZGV2LT5nYXJ0LnJvYmosCiAJCQkJUkFERU9OX0dFTV9ET01BSU5fVlJBTSwgJmdwdV9hZGRyKTsKIAlpZiAocikgewotCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKKwkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnJvYmopOwogCQlyZXR1cm4gcjsKIAl9Ci0JciA9IHJhZGVvbl9ib19rbWFwKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLAotCQkJCSh2b2lkICoqKSZyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucHRyKTsKKwlyID0gcmFkZW9uX2JvX2ttYXAocmRldi0+Z2FydC5yb2JqLCAmcmRldi0+Z2FydC5wdHIpOwogCWlmIChyKQotCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC5yb2JqKTsKKwlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQucm9iaik7CiAJcmRldi0+Z2FydC50YWJsZV9hZGRyID0gZ3B1X2FkZHI7CiAJcmV0dXJuIHI7CiB9CiAKLXZvaWQgcmFkZW9uX2dhcnRfdGFibGVfdnJhbV9mcmVlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQordm9pZCByYWRlb25fZ2FydF90YWJsZV92cmFtX3VucGluKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqID09IE5VTEwpIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKIAkJcmV0dXJuOwogCX0KLQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmosIGZhbHNlKTsKKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+Z2FydC5yb2JqLCBmYWxzZSk7CiAJaWYgKGxpa2VseShyID09IDApKSB7Ci0JCXJhZGVvbl9ib19rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKKwkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5nYXJ0LnJvYmopOworCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC5yb2JqKTsKKwkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnJvYmopOworCQlyZGV2LT5nYXJ0LnB0ciA9IE5VTEw7CiAJfQotCXJhZGVvbl9ib191bnJlZigmcmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOworfQorCit2b2lkIHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fZnJlZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpZiAocmRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwlyYWRlb25fZ2FydF90YWJsZV92cmFtX3VucGluKHJkZXYpOworCXJhZGVvbl9ib191bnJlZigmcmRldi0+Z2FydC5yb2JqKTsKIH0KIAogCkBAIC0xNDIsNyArMTUwLDcgQEAKIAl1NjQgcGFnZV9iYXNlOwogCiAJaWYgKCFyZGV2LT5nYXJ0LnJlYWR5KSB7Ci0JCVdBUk4oMSwgInRyeWluZyB0byB1bmJpbmQgbWVtb3J5IHRvIHVuaXRpYWxpemVkIEdBUlQgIVxuIik7CisJCVdBUk4oMSwgInRyeWluZyB0byB1bmJpbmQgbWVtb3J5IGZyb20gdW5pbml0aWFsaXplZCBHQVJUICFcbiIpOwogCQlyZXR1cm47CiAJfQogCXQgPSBvZmZzZXQgLyBSQURFT05fR1BVX1BBR0VfU0laRTsKQEAgLTE1MSwxMiArMTU5LDE0IEBACiAJCWlmIChyZGV2LT5nYXJ0LnBhZ2VzW3BdKSB7CiAJCQlpZiAoIXJkZXYtPmdhcnQudHRtX2FsbG9jZWRbcF0pCiAJCQkJcGNpX3VubWFwX3BhZ2UocmRldi0+cGRldiwgcmRldi0+Z2FydC5wYWdlc19hZGRyW3BdLAotCQkJCSAgICAgICAJCVBBR0VfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJCQkJCVBBR0VfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAkJCXJkZXYtPmdhcnQucGFnZXNbcF0gPSBOVUxMOwogCQkJcmRldi0+Z2FydC5wYWdlc19hZGRyW3BdID0gcmRldi0+ZHVtbXlfcGFnZS5hZGRyOwogCQkJcGFnZV9iYXNlID0gcmRldi0+Z2FydC5wYWdlc19hZGRyW3BdOwogCQkJZm9yIChqID0gMDsgaiA8IChQQUdFX1NJWkUgLyBSQURFT05fR1BVX1BBR0VfU0laRSk7IGorKywgdCsrKSB7Ci0JCQkJcmFkZW9uX2dhcnRfc2V0X3BhZ2UocmRldiwgdCwgcGFnZV9iYXNlKTsKKwkJCQlpZiAocmRldi0+Z2FydC5wdHIpIHsKKwkJCQkJcmFkZW9uX2dhcnRfc2V0X3BhZ2UocmRldiwgdCwgcGFnZV9iYXNlKTsKKwkJCQl9CiAJCQkJcGFnZV9iYXNlICs9IFJBREVPTl9HUFVfUEFHRV9TSVpFOwogCQkJfQogCQl9CkBAIC0xNzQsNyArMTg0LDcgQEAKIAlpbnQgaSwgajsKIAogCWlmICghcmRldi0+Z2FydC5yZWFkeSkgewotCQlXQVJOKDEsICJ0cnlpbmcgdG8gYmluZCBtZW1vcnkgdG8gdW5pdGlhbGl6ZWQgR0FSVCAhXG4iKTsKKwkJV0FSTigxLCAidHJ5aW5nIHRvIGJpbmQgbWVtb3J5IHRvIHVuaW5pdGlhbGl6ZWQgR0FSVCAhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXQgPSBvZmZzZXQgLyBSQURFT05fR1BVX1BBR0VfU0laRTsKQEAgLTE5OSwxMCArMjA5LDEyIEBACiAJCQl9CiAJCX0KIAkJcmRldi0+Z2FydC5wYWdlc1twXSA9IHBhZ2VsaXN0W2ldOwotCQlwYWdlX2Jhc2UgPSByZGV2LT5nYXJ0LnBhZ2VzX2FkZHJbcF07Ci0JCWZvciAoaiA9IDA7IGogPCAoUEFHRV9TSVpFIC8gUkFERU9OX0dQVV9QQUdFX1NJWkUpOyBqKyssIHQrKykgewotCQkJcmFkZW9uX2dhcnRfc2V0X3BhZ2UocmRldiwgdCwgcGFnZV9iYXNlKTsKLQkJCXBhZ2VfYmFzZSArPSBSQURFT05fR1BVX1BBR0VfU0laRTsKKwkJaWYgKHJkZXYtPmdhcnQucHRyKSB7CisJCQlwYWdlX2Jhc2UgPSByZGV2LT5nYXJ0LnBhZ2VzX2FkZHJbcF07CisJCQlmb3IgKGogPSAwOyBqIDwgKFBBR0VfU0laRSAvIFJBREVPTl9HUFVfUEFHRV9TSVpFKTsgaisrLCB0KyspIHsKKwkJCQlyYWRlb25fZ2FydF9zZXRfcGFnZShyZGV2LCB0LCBwYWdlX2Jhc2UpOworCQkJCXBhZ2VfYmFzZSArPSBSQURFT05fR1BVX1BBR0VfU0laRTsKKwkJCX0KIAkJfQogCX0KIAltYigpOwpAQCAtMjE1LDYgKzIyNyw5IEBACiAJaW50IGksIGosIHQ7CiAJdTY0IHBhZ2VfYmFzZTsKIAorCWlmICghcmRldi0+Z2FydC5wdHIpIHsKKwkJcmV0dXJuOworCX0KIAlmb3IgKGkgPSAwLCB0ID0gMDsgaSA8IHJkZXYtPmdhcnQubnVtX2NwdV9wYWdlczsgaSsrKSB7CiAJCXBhZ2VfYmFzZSA9IHJkZXYtPmdhcnQucGFnZXNfYWRkcltpXTsKIAkJZm9yIChqID0gMDsgaiA8IChQQUdFX1NJWkUgLyBSQURFT05fR1BVX1BBR0VfU0laRSk7IGorKywgdCsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pMmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2kyYy5jCmluZGV4IDZjMTExYzEuLjdiYjFiMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2kyYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2kyYy5jCkBAIC0yMyw2ICsyMyw4IEBACiAgKiBBdXRob3JzOiBEYXZlIEFpcmxpZQogICogICAgICAgICAgQWxleCBEZXVjaGVyCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJyYWRlb25fZHJtLmgiCiAjaW5jbHVkZSAicmFkZW9uLmgiCkBAIC0zMiw3ICszNCw3IEBACiAgKiByYWRlb25fZGRjX3Byb2JlCiAgKgogICovCi1ib29sIHJhZGVvbl9kZGNfcHJvYmUoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IsIGJvb2wgcmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmUpCitib29sIHJhZGVvbl9kZGNfcHJvYmUoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IpCiB7CiAJdTggb3V0ID0gMHgwOwogCXU4IGJ1Zls4XTsKQEAgLTQ3LDE1ICs0OSwxMSBAQAogCQl7CiAJCQkuYWRkciA9IDB4NTAsCiAJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCS5sZW4gPSAxLAorCQkJLmxlbiA9IDgsCiAJCQkuYnVmID0gYnVmLAogCQl9CiAJfTsKIAotCS8qIFJlYWQgOCBieXRlcyBmcm9tIGkyYyBmb3IgZXh0ZW5kZWQgcHJvYmUgb2YgRURJRCBoZWFkZXIgKi8KLQlpZiAocmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmUpCi0JCW1zZ3NbMV0ubGVuID0gODsKLQogCS8qIG9uIGh3IHdpdGggcm91dGVycywgc2VsZWN0IHJpZ2h0IHBvcnQgKi8KIAlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+cm91dGVyLmRkY192YWxpZCkKIAkJcmFkZW9uX3JvdXRlcl9zZWxlY3RfZGRjX3BvcnQocmFkZW9uX2Nvbm5lY3Rvcik7CkBAIC02NCwyNSArNjIsMjQgQEAKIAlpZiAocmV0ICE9IDIpCiAJCS8qIENvdWxkbid0IGZpbmQgYW4gYWNjZXNzaWJsZSBEREMgb24gdGhpcyBjb25uZWN0b3IgKi8KIAkJcmV0dXJuIGZhbHNlOwotCWlmIChyZXF1aXJlc19leHRlbmRlZF9wcm9iZSkgewotCQkvKiBQcm9iZSBhbHNvIGZvciB2YWxpZCBFRElEIGhlYWRlcgotCQkgKiBFRElEIGhlYWRlciBzdGFydHMgd2l0aDoKLQkJICogMHgwMCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDAwLgotCQkgKiBPbmx5IHRoZSBmaXJzdCA2IGJ5dGVzIG11c3QgYmUgdmFsaWQgYXMKLQkJICogZHJtX2VkaWRfYmxvY2tfdmFsaWQoKSBjYW4gZml4IHRoZSBsYXN0IDIgYnl0ZXMgKi8KLQkJaWYgKGRybV9lZGlkX2hlYWRlcl9pc192YWxpZChidWYpIDwgNikgewotCQkJLyogQ291bGRuJ3QgZmluZCBhbiBhY2Nlc3NpYmxlIEVESUQgb24gdGhpcwotCQkJICogY29ubmVjdG9yICovCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKwkvKiBQcm9iZSBhbHNvIGZvciB2YWxpZCBFRElEIGhlYWRlcgorCSAqIEVESUQgaGVhZGVyIHN0YXJ0cyB3aXRoOgorCSAqIDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMC4KKwkgKiBPbmx5IHRoZSBmaXJzdCA2IGJ5dGVzIG11c3QgYmUgdmFsaWQgYXMKKwkgKiBkcm1fZWRpZF9ibG9ja192YWxpZCgpIGNhbiBmaXggdGhlIGxhc3QgMiBieXRlcyAqLworCWlmIChkcm1fZWRpZF9oZWFkZXJfaXNfdmFsaWQoYnVmKSA8IDYpIHsKKwkJLyogQ291bGRuJ3QgZmluZCBhbiBhY2Nlc3NpYmxlIEVESUQgb24gdGhpcworCQkgKiBjb25uZWN0b3IgKi8KKwkJcmV0dXJuIGZhbHNlOwogCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KIAogLyogYml0IGJhbmdpbmcgaTJjICovCiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9pMmNfZG9fbG9jayhzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICppMmMsIGludCBsb2NrX3N0YXRlKQorc3RhdGljIGludCBwcmVfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwKQogeworCXN0cnVjdCByYWRlb25faTJjX2NoYW4gKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoaTJjX2FkYXApOwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gaTJjLT5kZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKnJlYyA9ICZpMmMtPnJlYzsKIAl1aW50MzJfdCB0ZW1wOwpAQCAtMTM3LDE5ICsxMzQsMzAgQEAKIAlXUkVHMzIocmVjLT5lbl9kYXRhX3JlZywgdGVtcCk7CiAKIAkvKiBtYXNrIHRoZSBncGlvIHBpbnMgZm9yIHNvZnR3YXJlIHVzZSAqLwotCXRlbXAgPSBSUkVHMzIocmVjLT5tYXNrX2Nsa19yZWcpOwotCWlmIChsb2NrX3N0YXRlKQotCQl0ZW1wIHw9IHJlYy0+bWFza19jbGtfbWFzazsKLQllbHNlCi0JCXRlbXAgJj0gfnJlYy0+bWFza19jbGtfbWFzazsKKwl0ZW1wID0gUlJFRzMyKHJlYy0+bWFza19jbGtfcmVnKSB8IHJlYy0+bWFza19jbGtfbWFzazsKIAlXUkVHMzIocmVjLT5tYXNrX2Nsa19yZWcsIHRlbXApOwogCXRlbXAgPSBSUkVHMzIocmVjLT5tYXNrX2Nsa19yZWcpOwogCisJdGVtcCA9IFJSRUczMihyZWMtPm1hc2tfZGF0YV9yZWcpIHwgcmVjLT5tYXNrX2RhdGFfbWFzazsKKwlXUkVHMzIocmVjLT5tYXNrX2RhdGFfcmVnLCB0ZW1wKTsKIAl0ZW1wID0gUlJFRzMyKHJlYy0+bWFza19kYXRhX3JlZyk7Ci0JaWYgKGxvY2tfc3RhdGUpCi0JCXRlbXAgfD0gcmVjLT5tYXNrX2RhdGFfbWFzazsKLQllbHNlCi0JCXRlbXAgJj0gfnJlYy0+bWFza19kYXRhX21hc2s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG9zdF94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXApCit7CisJc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShpMmNfYWRhcCk7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBpMmMtPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyAqcmVjID0gJmkyYy0+cmVjOworCXVpbnQzMl90IHRlbXA7CisKKwkvKiB1bm1hc2sgdGhlIGdwaW8gcGlucyBmb3Igc29mdHdhcmUgdXNlICovCisJdGVtcCA9IFJSRUczMihyZWMtPm1hc2tfY2xrX3JlZykgJiB+cmVjLT5tYXNrX2Nsa19tYXNrOworCVdSRUczMihyZWMtPm1hc2tfY2xrX3JlZywgdGVtcCk7CisJdGVtcCA9IFJSRUczMihyZWMtPm1hc2tfY2xrX3JlZyk7CisKKwl0ZW1wID0gUlJFRzMyKHJlYy0+bWFza19kYXRhX3JlZykgJiB+cmVjLT5tYXNrX2RhdGFfbWFzazsKIAlXUkVHMzIocmVjLT5tYXNrX2RhdGFfcmVnLCB0ZW1wKTsKIAl0ZW1wID0gUlJFRzMyKHJlYy0+bWFza19kYXRhX3JlZyk7CiB9CkBAIC0yMDksMjIgKzIxNyw2IEBACiAJV1JFRzMyKHJlYy0+ZW5fZGF0YV9yZWcsIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgcHJlX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICppMmMgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKLQotCXJhZGVvbl9pMmNfZG9fbG9jayhpMmMsIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvc3RfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwKQotewotCXN0cnVjdCByYWRlb25faTJjX2NoYW4gKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoaTJjX2FkYXApOwotCi0JcmFkZW9uX2kyY19kb19sb2NrKGkyYywgMCk7Ci19Ci0KIC8qIGh3IGkyYyAqLwogCiBzdGF0aWMgdTMyIHJhZGVvbl9nZXRfaTJjX3ByZXNjYWxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnEuYwppbmRleCA0NjU3NDZiLi4wMGRhMzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnEuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHUzMiByYWRlb25fYWNrbm93bGVkZ2VfaXJxcyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHUzMiAqcjUwMF9kaXNwX2ludCkKK3N0YXRpYyB1MzIgcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgKnI1MDBfZGlzcF9pbnQpCiB7CiAJdTMyIGlycXMgPSBSQURFT05fUkVBRChSQURFT05fR0VOX0lOVF9TVEFUVVMpOwogCXUzMiBpcnFfbWFzayA9IFJBREVPTl9TV19JTlRfVEVTVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYwppbmRleCA5ZWM4MzBjLi44Zjg2YWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jCkBAIC02NywxMCArNjcsMTAgQEAKIAkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KIAlyZGV2LT5pcnEuc3dfaW50ID0gZmFsc2U7CiAJcmRldi0+aXJxLmd1aV9pZGxlID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IHJkZXYtPm51bV9jcnRjOyBpKyspCi0JCXJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbaV0gPSBmYWxzZTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFJBREVPTl9NQVhfSFBEX1BJTlM7IGkrKykKIAkJcmRldi0+aXJxLmhwZFtpXSA9IGZhbHNlOworCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX0NSVENTOyBpKyspIHsKKwkJcmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFtpXSA9IGZhbHNlOwogCQlyZGV2LT5pcnEucGZsaXBbaV0gPSBmYWxzZTsKIAl9CiAJcmFkZW9uX2lycV9zZXQocmRldik7CkBAIC05OSwxNSArOTksNTUgQEAKIAkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KIAlyZGV2LT5pcnEuc3dfaW50ID0gZmFsc2U7CiAJcmRldi0+aXJxLmd1aV9pZGxlID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IHJkZXYtPm51bV9jcnRjOyBpKyspCi0JCXJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbaV0gPSBmYWxzZTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFJBREVPTl9NQVhfSFBEX1BJTlM7IGkrKykKIAkJcmRldi0+aXJxLmhwZFtpXSA9IGZhbHNlOworCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX0NSVENTOyBpKyspIHsKKwkJcmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFtpXSA9IGZhbHNlOwogCQlyZGV2LT5pcnEucGZsaXBbaV0gPSBmYWxzZTsKIAl9CiAJcmFkZW9uX2lycV9zZXQocmRldik7CiB9CiAKK3N0YXRpYyBib29sIHJhZGVvbl9tc2lfb2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJLyogUlYzNzAvUlYzODAgd2FzIGZpcnN0IGFzaWMgd2l0aCBNU0kgc3VwcG9ydCAqLworCWlmIChyZGV2LT5mYW1pbHkgPCBDSElQX1JWMzgwKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBNU0lzIGRvbid0IHdvcmsgb24gQUdQICovCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogZm9yY2UgTVNJIG9uICovCisJaWYgKHJhZGVvbl9tc2kgPT0gMSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZSBpZiAocmFkZW9uX21zaSA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBRdWlya3MgKi8KKwkvKiBIUCBSUzY5MCBvbmx5IHNlZW1zIHRvIHdvcmsgd2l0aCBNU0lzLiAqLworCWlmICgocmRldi0+cGRldi0+ZGV2aWNlID09IDB4NzkxZikgJiYKKwkgICAgKHJkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDNjKSAmJgorCSAgICAocmRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDMwYzIpKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIERlbGwgUlM2OTAgb25seSBzZWVtcyB0byB3b3JrIHdpdGggTVNJcy4gKi8KKwlpZiAoKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDc5MWYpICYmCisJICAgIChyZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyOCkgJiYKKwkgICAgKHJkZXYtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMWZkKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSB7CisJCS8qIEFQVXMgd29yayBmaW5lIHdpdGggTVNJcyAqLworCQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUEFMTSkKKwkJCXJldHVybiB0cnVlOworCQkvKiBsb3RzIG9mIElHUHMgaGF2ZSBwcm9ibGVtcyB3aXRoIE1TSXMgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCiBpbnQgcmFkZW9uX2lycV9rbXNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgaTsKQEAgLTEyNCwxMiArMTY0LDggQEAKIAl9CiAJLyogZW5hYmxlIG1zaSAqLwogCXJkZXYtPm1zaV9lbmFibGVkID0gMDsKLQkvKiBNU0lzIGRvbid0IHNlZW0gdG8gd29yayByZWxpYWJseSBvbiBhbGwgSUdQCi0JICogY2hpcHMuICBEaXNhYmxlIE1TSSBvbiB0aGVtIGZvciBub3cuCi0JICovCi0JaWYgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjM4MCkgJiYKLQkgICAgKCghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHx8IChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9QQUxNKSkgJiYKLQkgICAgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSkpIHsKKworCWlmIChyYWRlb25fbXNpX29rKHJkZXYpKSB7CiAJCWludCByZXQgPSBwY2lfZW5hYmxlX21zaShyZGV2LT5wZGV2KTsKIAkJaWYgKCFyZXQpIHsKIAkJCXJkZXYtPm1zaV9lbmFibGVkID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfY3J0Yy5jCmluZGV4IDQxYTVkNDguLmRhYWRmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2NydGMuYwpAQCAtOTkxLDEyICs5OTEsNiBAQAogCQkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAogCQkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JLyogYWRqdXN0IHBtIHRvIHVwY29taW5nIG1vZGUgY2hhbmdlICovCi0JcmFkZW9uX3BtX2NvbXB1dGVfY2xvY2tzKHJkZXYpOwotCiAJaWYgKCFyYWRlb25fY3J0Y19zY2FsaW5nX21vZGVfZml4dXAoY3J0YywgbW9kZSwgYWRqdXN0ZWRfbW9kZSkpCiAJCXJldHVybiBmYWxzZTsKIAlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV90di5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X3R2LmMKaW5kZXggYzdiNmNiNC4uYjM3ZWMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X3R2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X3R2LmMKQEAgLTg2NCw3ICs4NjQsNyBAQAogCSp2X3N5bmNfc3RydF93aWQgPSB0bXA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGdldF9wb3N0X2RpdihpbnQgdmFsdWUpCitzdGF0aWMgaW50IGdldF9wb3N0X2RpdihpbnQgdmFsdWUpCiB7CiAJaW50IHBvc3RfZGl2OwogCXN3aXRjaCAodmFsdWUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaAppbmRleCA2ODgyMGY1Li4yYzJlNzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCkBAIC00MzgsMTUgKzQzOCwxMyBAQAogCXN0cnVjdCByYWRlb25faTJjX2NoYW4gKmRkY19idXM7CiAJLyogc29tZSBzeXN0ZW1zIGhhdmUgYW4gaGRtaSBhbmQgdmdhIHBvcnQgd2l0aCBhIHNoYXJlZCBkZGMgbGluZSAqLwogCWJvb2wgc2hhcmVkX2RkYzsKLQkvKiBmb3Igc29tZSBSYWRlb24gY2hpcCBmYW1pbGllcyB3ZSBhcHBseSBhbiBhZGRpdGlvbmFsIEVESUQgaGVhZGVyCi0JICAgY2hlY2sgYXMgcGFydCBvZiB0aGUgRERDIHByb2JlICovCi0JYm9vbCByZXF1aXJlc19leHRlbmRlZF9wcm9iZTsKIAlib29sIHVzZV9kaWdpdGFsOwogCS8qIHdlIG5lZWQgdG8gbWluZCB0aGUgRURJRCBiZXR3ZWVuIGRldGVjdAogCSAgIGFuZCBnZXQgbW9kZXMgZHVlIHRvIGFuYWxvZy9kaWdpdGFsL3R2ZW5jb2RlciAqLwogCXN0cnVjdCBlZGlkICplZGlkOwogCXZvaWQgKmNvbl9wcml2OwogCWJvb2wgZGFjX2xvYWRfZGV0ZWN0OworCWJvb2wgZGV0ZWN0ZWRfYnlfbG9hZDsgLyogaWYgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIHdhcyBkZXRlcm1pbmVkIGJ5IGxvYWQgKi8KIAl1aW50MTZfdCBjb25uZWN0b3Jfb2JqZWN0X2lkOwogCXN0cnVjdCByYWRlb25faHBkIGhwZDsKIAlzdHJ1Y3QgcmFkZW9uX3JvdXRlciByb3V0ZXI7CkBAIC00NTgsNiArNDU2LDggQEAKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKIH07CiAKKyNkZWZpbmUgRU5DT0RFUl9NT0RFX0lTX0RQKGVtKSAoKChlbSkgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHx8IFwKKwkJCQkoKGVtKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUF9NU1QpKQogCiBleHRlcm4gZW51bSByYWRlb25fdHZfc3RkCiByYWRlb25fY29tYmlvc19nZXRfdHZfaW5mbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CkBAIC00NjcsOCArNDY3LDggQEAKIGV4dGVybiBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqCiByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogCi1leHRlcm4gYm9vbCByYWRlb25fZW5jb2Rlcl9pc19kcF9icmlkZ2Uoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKLWV4dGVybiBib29sIHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2Uoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CitleHRlcm4gdTE2IHJhZGVvbl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworZXh0ZXJuIHUxNiByYWRlb25fY29ubmVjdG9yX2VuY29kZXJfZ2V0X2RwX2JyaWRnZV9lbmNvZGVyX2lkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogZXh0ZXJuIGJvb2wgcmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2lzX2hicjIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CiBleHRlcm4gYm9vbCByYWRlb25fY29ubmVjdG9yX2lzX2RwMTJfY2FwYWJsZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKIApAQCAtNDg4LDcgKzQ4OCw3IEBACiAJCQkJCSAgIGludCBhY3Rpb24sIHVpbnQ4X3QgbGFuZV9udW0sCiAJCQkJCSAgIHVpbnQ4X3QgbGFuZV9zZXQpOwogZXh0ZXJuIHZvaWQgcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7Ci1leHRlcm4gc3RydWN0IGRybV9lbmNvZGVyICpyYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworZXh0ZXJuIHN0cnVjdCBkcm1fZW5jb2RlciAqcmFkZW9uX2dldF9leHRlcm5hbF9lbmNvZGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiBleHRlcm4gaW50IHJhZGVvbl9kcF9pMmNfYXV4X2NoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IG1vZGUsCiAJCQkJdTggd3JpdGVfYnl0ZSwgdTggKnJlYWRfYnl0ZSk7CiAKQEAgLTUxOCw4ICs1MTgsNyBAQAogCQkJCXU4IHZhbCk7CiBleHRlcm4gdm9pZCByYWRlb25fcm91dGVyX3NlbGVjdF9kZGNfcG9ydChzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3Rvcik7CiBleHRlcm4gdm9pZCByYWRlb25fcm91dGVyX3NlbGVjdF9jZF9wb3J0KHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yKTsKLWV4dGVybiBib29sIHJhZGVvbl9kZGNfcHJvYmUoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IsCi0JCQlib29sIHJlcXVpcmVzX2V4dGVuZGVkX3Byb2JlKTsKK2V4dGVybiBib29sIHJhZGVvbl9kZGNfcHJvYmUoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IpOwogZXh0ZXJuIGludCByYWRlb25fZGRjX2dldF9tb2RlcyhzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3Rvcik7CiAKIGV4dGVybiBzdHJ1Y3QgZHJtX2VuY29kZXIgKnJhZGVvbl9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jCmluZGV4IDk3NmMzYjEuLjFjODUxNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jCkBAIC01MTUsMyArNTE1LDQ0IEBACiAJfQogCXJldHVybiAwOwogfQorCitpbnQgcmFkZW9uX2JvX3dhaXQoc3RydWN0IHJhZGVvbl9ibyAqYm8sIHUzMiAqbWVtX3R5cGUsIGJvb2wgbm9fd2FpdCkKK3sKKwlpbnQgcjsKKworCXIgPSB0dG1fYm9fcmVzZXJ2ZSgmYm8tPnRibywgdHJ1ZSwgbm9fd2FpdCwgZmFsc2UsIDApOworCWlmICh1bmxpa2VseShyICE9IDApKQorCQlyZXR1cm4gcjsKKwlzcGluX2xvY2soJmJvLT50Ym8uYmRldi0+ZmVuY2VfbG9jayk7CisJaWYgKG1lbV90eXBlKQorCQkqbWVtX3R5cGUgPSBiby0+dGJvLm1lbS5tZW1fdHlwZTsKKwlpZiAoYm8tPnRiby5zeW5jX29iaikKKwkJciA9IHR0bV9ib193YWl0KCZiby0+dGJvLCB0cnVlLCB0cnVlLCBub193YWl0KTsKKwlzcGluX3VubG9jaygmYm8tPnRiby5iZGV2LT5mZW5jZV9sb2NrKTsKKwl0dG1fYm9fdW5yZXNlcnZlKCZiby0+dGJvKTsKKwlyZXR1cm4gcjsKK30KKworCisvKioKKyAqIHJhZGVvbl9ib19yZXNlcnZlIC0gcmVzZXJ2ZSBibworICogQGJvOgkJYm8gc3RydWN0dXJlCisgKiBAbm9fd2FpdDoJCWRvbid0IHNsZWVwIHdoaWxlIHRyeWluZyB0byByZXNlcnZlIChyZXR1cm4gLUVCVVNZKQorICoKKyAqIFJldHVybnM6CisgKiAtRUJVU1k6IGJ1ZmZlciBpcyBidXN5IGFuZCBAbm9fd2FpdCBpcyB0cnVlCisgKiAtRVJFU1RBUlRTWVM6IEEgd2FpdCBmb3IgdGhlIGJ1ZmZlciB0byBiZWNvbWUgdW5yZXNlcnZlZCB3YXMgaW50ZXJydXB0ZWQgYnkKKyAqIGEgc2lnbmFsLiBSZWxlYXNlIGFsbCBidWZmZXIgcmVzZXJ2YXRpb25zIGFuZCByZXR1cm4gdG8gdXNlci1zcGFjZS4KKyAqLworaW50IHJhZGVvbl9ib19yZXNlcnZlKHN0cnVjdCByYWRlb25fYm8gKmJvLCBib29sIG5vX3dhaXQpCit7CisJaW50IHI7CisKKwlyID0gdHRtX2JvX3Jlc2VydmUoJmJvLT50Ym8sIHRydWUsIG5vX3dhaXQsIGZhbHNlLCAwKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkgeworCQlpZiAociAhPSAtRVJFU1RBUlRTWVMpCisJCQlkZXZfZXJyKGJvLT5yZGV2LT5kZXYsICIlcCByZXNlcnZlIGZhaWxlZFxuIiwgYm8pOworCQlyZXR1cm4gcjsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5oCmluZGV4IGVkZTZjMTMuLmIwN2YwZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5oCkBAIC01MiwyOCArNTIsNyBAQAogCXJldHVybiAwOwogfQogCi0vKioKLSAqIHJhZGVvbl9ib19yZXNlcnZlIC0gcmVzZXJ2ZSBibwotICogQGJvOgkJYm8gc3RydWN0dXJlCi0gKiBAbm9fd2FpdDoJCWRvbid0IHNsZWVwIHdoaWxlIHRyeWluZyB0byByZXNlcnZlIChyZXR1cm4gLUVCVVNZKQotICoKLSAqIFJldHVybnM6Ci0gKiAtRUJVU1k6IGJ1ZmZlciBpcyBidXN5IGFuZCBAbm9fd2FpdCBpcyB0cnVlCi0gKiAtRVJFU1RBUlRTWVM6IEEgd2FpdCBmb3IgdGhlIGJ1ZmZlciB0byBiZWNvbWUgdW5yZXNlcnZlZCB3YXMgaW50ZXJydXB0ZWQgYnkKLSAqIGEgc2lnbmFsLiBSZWxlYXNlIGFsbCBidWZmZXIgcmVzZXJ2YXRpb25zIGFuZCByZXR1cm4gdG8gdXNlci1zcGFjZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcmFkZW9uX2JvX3Jlc2VydmUoc3RydWN0IHJhZGVvbl9ibyAqYm8sIGJvb2wgbm9fd2FpdCkKLXsKLQlpbnQgcjsKLQotCXIgPSB0dG1fYm9fcmVzZXJ2ZSgmYm8tPnRibywgdHJ1ZSwgbm9fd2FpdCwgZmFsc2UsIDApOwotCWlmICh1bmxpa2VseShyICE9IDApKSB7Ci0JCWlmIChyICE9IC1FUkVTVEFSVFNZUykKLQkJCWRldl9lcnIoYm8tPnJkZXYtPmRldiwgIiVwIHJlc2VydmUgZmFpbGVkXG4iLCBibyk7Ci0JCXJldHVybiByOwotCX0KLQlyZXR1cm4gMDsKLX0KK2ludCByYWRlb25fYm9fcmVzZXJ2ZShzdHJ1Y3QgcmFkZW9uX2JvICpibywgYm9vbCBub193YWl0KTsKIAogc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbl9ib191bnJlc2VydmUoc3RydWN0IHJhZGVvbl9ibyAqYm8pCiB7CkBAIC0xMTgsMjMgKzk3LDggQEAKIAlyZXR1cm4gYm8tPnRiby5hZGRyX3NwYWNlX29mZnNldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmFkZW9uX2JvX3dhaXQoc3RydWN0IHJhZGVvbl9ibyAqYm8sIHUzMiAqbWVtX3R5cGUsCi0JCQkJCWJvb2wgbm9fd2FpdCkKLXsKLQlpbnQgcjsKLQotCXIgPSB0dG1fYm9fcmVzZXJ2ZSgmYm8tPnRibywgdHJ1ZSwgbm9fd2FpdCwgZmFsc2UsIDApOwotCWlmICh1bmxpa2VseShyICE9IDApKQotCQlyZXR1cm4gcjsKLQlzcGluX2xvY2soJmJvLT50Ym8uYmRldi0+ZmVuY2VfbG9jayk7Ci0JaWYgKG1lbV90eXBlKQotCQkqbWVtX3R5cGUgPSBiby0+dGJvLm1lbS5tZW1fdHlwZTsKLQlpZiAoYm8tPnRiby5zeW5jX29iaikKLQkJciA9IHR0bV9ib193YWl0KCZiby0+dGJvLCB0cnVlLCB0cnVlLCBub193YWl0KTsKLQlzcGluX3VubG9jaygmYm8tPnRiby5iZGV2LT5mZW5jZV9sb2NrKTsKLQl0dG1fYm9fdW5yZXNlcnZlKCZiby0+dGJvKTsKLQlyZXR1cm4gcjsKLX0KK2V4dGVybiBpbnQgcmFkZW9uX2JvX3dhaXQoc3RydWN0IHJhZGVvbl9ibyAqYm8sIHUzMiAqbWVtX3R5cGUsCisJCQkgIGJvb2wgbm9fd2FpdCk7CiAKIGV4dGVybiBpbnQgcmFkZW9uX2JvX2NyZWF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJCQl1bnNpZ25lZCBsb25nIHNpemUsIGludCBieXRlX2FsaWduLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKaW5kZXggNmZhYmU4OS4uNzhhNjY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCkBAIC01Myw2ICs1MywyNCBAQAogCiAjZGVmaW5lIEFDUElfQUNfQ0xBU1MgICAgICAgICAgICJhY19hZGFwdGVyIgogCitpbnQgcmFkZW9uX3BtX2dldF90eXBlX2luZGV4KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJICAgICBlbnVtIHJhZGVvbl9wbV9zdGF0ZV90eXBlIHBzX3R5cGUsCisJCQkgICAgIGludCBpbnN0YW5jZSkKK3sKKwlpbnQgaTsKKwlpbnQgZm91bmRfaW5zdGFuY2UgPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCByZGV2LT5wbS5udW1fcG93ZXJfc3RhdGVzOyBpKyspIHsKKwkJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW2ldLnR5cGUgPT0gcHNfdHlwZSkgeworCQkJZm91bmRfaW5zdGFuY2UrKzsKKwkJCWlmIChmb3VuZF9pbnN0YW5jZSA9PSBpbnN0YW5jZSkKKwkJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwkvKiByZXR1cm4gZGVmYXVsdCBpZiBubyBtYXRjaCAqLworCXJldHVybiByZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4OworfQorCiAjaWZkZWYgQ09ORklHX0FDUEkKIHN0YXRpYyBpbnQgcmFkZW9uX2FjcGlfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yaW5nLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yaW5nLmMKaW5kZXggMDhjMDIzMy4uNDlkNTgyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmluZy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JpbmcuYwpAQCAtMzUsNiArMzUsNDQgQEAKIAogaW50IHJhZGVvbl9kZWJ1Z2ZzX2liX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCit1MzIgcmFkZW9uX2dldF9pYl92YWx1ZShzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NzX2NodW5rICppYmMgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF07CisJdTMyIHBnX2lkeCwgcGdfb2Zmc2V0OworCXUzMiBpZHhfdmFsdWUgPSAwOworCWludCBuZXdfcGFnZTsKKworCXBnX2lkeCA9IChpZHggKiA0KSAvIFBBR0VfU0laRTsKKwlwZ19vZmZzZXQgPSAoaWR4ICogNCkgJSBQQUdFX1NJWkU7CisKKwlpZiAoaWJjLT5rcGFnZV9pZHhbMF0gPT0gcGdfaWR4KQorCQlyZXR1cm4gaWJjLT5rcGFnZVswXVtwZ19vZmZzZXQvNF07CisJaWYgKGliYy0+a3BhZ2VfaWR4WzFdID09IHBnX2lkeCkKKwkJcmV0dXJuIGliYy0+a3BhZ2VbMV1bcGdfb2Zmc2V0LzRdOworCisJbmV3X3BhZ2UgPSByYWRlb25fY3NfdXBkYXRlX3BhZ2VzKHAsIHBnX2lkeCk7CisJaWYgKG5ld19wYWdlIDwgMCkgeworCQlwLT5wYXJzZXJfZXJyb3IgPSBuZXdfcGFnZTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWR4X3ZhbHVlID0gaWJjLT5rcGFnZVtuZXdfcGFnZV1bcGdfb2Zmc2V0LzRdOworCXJldHVybiBpZHhfdmFsdWU7Cit9CisKK3ZvaWQgcmFkZW9uX3Jpbmdfd3JpdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHYpCit7CisjaWYgRFJNX0RFQlVHX0NPREUKKwlpZiAocmRldi0+Y3AuY291bnRfZHcgPD0gMCkgeworCQlEUk1fRVJST1IoInJhZGVvbjogd3JpdHRpbmcgbW9yZSBkd29yZCB0byByaW5nIHRoYW4gZXhwZWN0ZWQgIVxuIik7CisJfQorI2VuZGlmCisJcmRldi0+Y3AucmluZ1tyZGV2LT5jcC53cHRyKytdID0gdjsKKwlyZGV2LT5jcC53cHRyICY9IHJkZXYtPmNwLnB0cl9tYXNrOworCXJkZXYtPmNwLmNvdW50X2R3LS07CisJcmRldi0+Y3AucmluZ19mcmVlX2R3LS07Cit9CisKIHZvaWQgcmFkZW9uX2liX2JvZ3VzX2NsZWFudXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJc3RydWN0IHJhZGVvbl9pYiAqaWIsICpuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fc3RhdGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3N0YXRlLmMKaW5kZXggOTJlN2VhNy4uZTg0MjJhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fc3RhdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9zdGF0ZS5jCkBAIC0yNzIsMTIgKzI3MiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKGRybV9yYWRlb25fcHJpdmF0ZV90ICoKLQkJCQkJCSAgICAgZGV2X3ByaXYsCi0JCQkJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAotCQkJCQkJICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKgotCQkJCQkJICAgICBjbWRidWYsCi0JCQkJCQkgICAgIHVuc2lnbmVkIGludCAqY21kc3opCitzdGF0aWMgaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0Myhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqCisJCQkJCSAgZGV2X3ByaXYsCisJCQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJCSAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICoKKwkJCQkJICBjbWRidWYsCisJCQkJCSAgdW5zaWduZWQgaW50ICpjbWRzeikKIHsKIAl1MzIgKmNtZCA9IGRybV9idWZmZXJfcG9pbnRlcl90b19kd29yZChjbWRidWYtPmJ1ZmZlciwgMCk7CiAJdTMyIG9mZnNldCwgbmFycmF5czsKQEAgLTQ0Niw4ICs0NDYsOCBAQAogICogQ1AgaGFyZHdhcmUgc3RhdGUgcHJvZ3JhbW1pbmcgZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCByYWRlb25fZW1pdF9jbGlwX3JlY3QoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkJICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIGJveCkKK3N0YXRpYyB2b2lkIHJhZGVvbl9lbWl0X2NsaXBfcmVjdChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAorCQkJCSAgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBib3gpCiB7CiAJUklOR19MT0NBTFM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYwppbmRleCBhYTZhNjZlLi4wNmI5MGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMC5jCkBAIC03Nyw3ICs3Nyw3IEBACiB7CiAJaW50IHI7CiAKLQlpZiAocmRldi0+Z2FydC50YWJsZS5yYW0ucHRyKSB7CisJaWYgKHJkZXYtPmdhcnQucHRyKSB7CiAJCVdBUk4oMSwgIlJTNDAwIEdBUlQgYWxyZWFkeSBpbml0aWFsaXplZFxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTE4Miw2ICsxODIsOSBAQAogCS8qIEVuYWJsZSBnYXJ0ICovCiAJV1JFRzMyX01DKFJTNDgwX0FHUF9BRERSRVNTX1NQQUNFX1NJWkUsIChSUzQ4MF9HQVJUX0VOIHwgc2l6ZV9yZWcpKTsKIAlyczQwMF9nYXJ0X3RsYl9mbHVzaChyZGV2KTsKKwlEUk1fSU5GTygiUENJRSBHQVJUIG9mICV1TSBlbmFibGVkICh0YWJsZSBhdCAweCUwMTZsbFgpLlxuIiwKKwkJICh1bnNpZ25lZCkocmRldi0+bWMuZ3R0X3NpemUgPj4gMjApLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZGV2LT5nYXJ0LnRhYmxlX2FkZHIpOwogCXJkZXYtPmdhcnQucmVhZHkgPSB0cnVlOwogCXJldHVybiAwOwogfQpAQCAtMjA5LDYgKzIxMiw3IEBACiBpbnQgcnM0MDBfZ2FydF9zZXRfcGFnZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGksIHVpbnQ2NF90IGFkZHIpCiB7CiAJdWludDMyX3QgZW50cnk7CisJdTMyICpndHQgPSByZGV2LT5nYXJ0LnB0cjsKIAogCWlmIChpIDwgMCB8fCBpID4gcmRldi0+Z2FydC5udW1fZ3B1X3BhZ2VzKSB7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjE4LDcgKzIyMiw3IEBACiAJCSgodXBwZXJfMzJfYml0cyhhZGRyKSAmIDB4ZmYpIDw8IDQpIHwKIAkJUlM0MDBfUFRFX1dSSVRFQUJMRSB8IFJTNDAwX1BURV9SRUFEQUJMRTsKIAllbnRyeSA9IGNwdV90b19sZTMyKGVudHJ5KTsKLQlyZGV2LT5nYXJ0LnRhYmxlLnJhbS5wdHJbaV0gPSBlbnRyeTsKKwlndHRbaV0gPSBlbnRyeTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCmluZGV4IDRiNWQwZTYuLjQ4MWI5OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKQEAgLTI4Nyw2ICsyODcsNyBAQAogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KKwkJcmFkZW9uX2hwZF9zZXRfcG9sYXJpdHkocmRldiwgcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCk7CiAJfQogCWlmIChyZGV2LT5pcnEuaW5zdGFsbGVkKQogCQlyczYwMF9pcnFfc2V0KHJkZXYpOwpAQCAtNDEzLDcgKzQxNCw3IEBACiB7CiAJaW50IHI7CiAKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqKSB7CiAJCVdBUk4oMSwgIlJTNjAwIEdBUlQgYWxyZWFkeSBpbml0aWFsaXplZFxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTQzMSw3ICs0MzIsNyBAQAogCXUzMiB0bXA7CiAJaW50IHIsIGk7CiAKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmogPT0gTlVMTCkgeworCWlmIChyZGV2LT5nYXJ0LnJvYmogPT0gTlVMTCkgewogCQlkZXZfZXJyKHJkZXYtPmRldiwgIk5vIFZSQU0gb2JqZWN0IGZvciBQQ0lFIEdBUlQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDg0LDYgKzQ4NSw5IEBACiAJdG1wID0gUlJFRzMyX01DKFJfMDAwMDA5X01DX0NOVEwxKTsKIAlXUkVHMzJfTUMoUl8wMDAwMDlfTUNfQ05UTDEsICh0bXAgfCBTXzAwMDAwOV9FTkFCTEVfUEFHRV9UQUJMRVMoMSkpKTsKIAlyczYwMF9nYXJ0X3RsYl9mbHVzaChyZGV2KTsKKwlEUk1fSU5GTygiUENJRSBHQVJUIG9mICV1TSBlbmFibGVkICh0YWJsZSBhdCAweCUwMTZsbFgpLlxuIiwKKwkJICh1bnNpZ25lZCkocmRldi0+bWMuZ3R0X3NpemUgPj4gMjApLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZGV2LT5nYXJ0LnRhYmxlX2FkZHIpOwogCXJkZXYtPmdhcnQucmVhZHkgPSB0cnVlOwogCXJldHVybiAwOwogfQpAQCAtNDkxLDIwICs0OTUsMTIgQEAKIHZvaWQgcnM2MDBfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB0bXA7Ci0JaW50IHI7CiAKIAkvKiBGSVhNRTogZGlzYWJsZSBvdXQgb2YgZ2FydCBhY2Nlc3MgKi8KIAlXUkVHMzJfTUMoUl8wMDAxMDBfTUNfUFQwX0NOVEwsIDApOwogCXRtcCA9IFJSRUczMl9NQyhSXzAwMDAwOV9NQ19DTlRMMSk7CiAJV1JFRzMyX01DKFJfMDAwMDA5X01DX0NOVEwxLCB0bXAgJiBDXzAwMDAwOV9FTkFCTEVfUEFHRV9UQUJMRVMpOwotCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaikgewotCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmosIGZhbHNlKTsKLQkJaWYgKHIgPT0gMCkgewotCQkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCX0KLQl9CisJcmFkZW9uX2dhcnRfdGFibGVfdnJhbV91bnBpbihyZGV2KTsKIH0KIAogdm9pZCByczYwMF9nYXJ0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC01MjIsNyArNTE4LDcgQEAKIAogaW50IHJzNjAwX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKQogewotCXZvaWQgX19pb21lbSAqcHRyID0gKHZvaWQgKilyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucHRyOworCXZvaWQgX19pb21lbSAqcHRyID0gKHZvaWQgKilyZGV2LT5nYXJ0LnB0cjsKIAogCWlmIChpIDwgMCB8fCBpID4gcmRldi0+Z2FydC5udW1fZ3B1X3BhZ2VzKSB7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCmluZGV4IGIxM2MyZWUuLmE5ODNmNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCXUzMiB0bXA7CiAJaW50IHIsIGk7CiAKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmogPT0gTlVMTCkgeworCWlmIChyZGV2LT5nYXJ0LnJvYmogPT0gTlVMTCkgewogCQlkZXZfZXJyKHJkZXYtPmRldiwgIk5vIFZSQU0gb2JqZWN0IGZvciBQQ0lFIEdBUlQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTYxLDYgKzE2MSw5IEBACiAJCVdSRUczMihWTV9DT05URVhUMF9DTlRMICsgKGkgKiA0KSwgMCk7CiAKIAlyNjAwX3BjaWVfZ2FydF90bGJfZmx1c2gocmRldik7CisJRFJNX0lORk8oIlBDSUUgR0FSVCBvZiAldU0gZW5hYmxlZCAodGFibGUgYXQgMHglMDE2bGxYKS5cbiIsCisJCSAodW5zaWduZWQpKHJkZXYtPm1jLmd0dF9zaXplID4+IDIwKSwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKIAlyZGV2LT5nYXJ0LnJlYWR5ID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE2OCw3ICsxNzEsNyBAQAogdm9pZCBydjc3MF9wY2llX2dhcnRfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgdG1wOwotCWludCBpLCByOworCWludCBpOwogCiAJLyogRGlzYWJsZSBhbGwgdGFibGVzICovCiAJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKQEAgLTE4OCwxNCArMTkxLDcgQEAKIAlXUkVHMzIoTUNfVk1fTUJfTDFfVExCMV9DTlRMLCB0bXApOwogCVdSRUczMihNQ19WTV9NQl9MMV9UTEIyX0NOVEwsIHRtcCk7CiAJV1JFRzMyKE1DX1ZNX01CX0wxX1RMQjNfQ05UTCwgdG1wKTsKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKLQkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7Ci0JCWlmIChsaWtlbHkociA9PSAwKSkgewotCQkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCX0KLQl9CisJcmFkZW9uX2dhcnRfdGFibGVfdnJhbV91bnBpbihyZGV2KTsKIH0KIAogdm9pZCBydjc3MF9wY2llX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTI3OSw3ICsyNzUsNyBAQAogCQlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0hJR0hfQUREUiwKIAkJCXJkZXYtPm1jLnZyYW1fZW5kID4+IDEyKTsKIAl9Ci0JV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9ERUZBVUxUX0FERFIsIDApOworCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfREVGQVVMVF9BRERSLCByZGV2LT52cmFtX3NjcmF0Y2guZ3B1X2FkZHIgPj4gMTIpOwogCXRtcCA9ICgocmRldi0+bWMudnJhbV9lbmQgPj4gMjQpICYgMHhGRkZGKSA8PCAxNjsKIAl0bXAgfD0gKChyZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDI0KSAmIDB4RkZGRik7CiAJV1JFRzMyKE1DX1ZNX0ZCX0xPQ0FUSU9OLCB0bXApOwpAQCAtOTU2LDU0ICs5NTIsNiBAQAogCiB9CiAKLXN0YXRpYyBpbnQgcnY3NzBfdnJhbV9zY3JhdGNoX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCi17Ci0JaW50IHI7Ci0JdTY0IGdwdV9hZGRyOwotCi0JaWYgKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqID09IE5VTEwpIHsKLQkJciA9IHJhZGVvbl9ib19jcmVhdGUocmRldiwgUkFERU9OX0dQVV9QQUdFX1NJWkUsCi0JCQkJICAgICBQQUdFX1NJWkUsIHRydWUsIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCi0JCQkJICAgICAmcmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOwotCQlpZiAocikgewotCQkJcmV0dXJuIHI7Ci0JCX0KLQl9Ci0KLQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+dnJhbV9zY3JhdGNoLnJvYmosIGZhbHNlKTsKLQlpZiAodW5saWtlbHkociAhPSAwKSkKLQkJcmV0dXJuIHI7Ci0JciA9IHJhZGVvbl9ib19waW4ocmRldi0+dnJhbV9zY3JhdGNoLnJvYmosCi0JCQkgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZncHVfYWRkcik7Ci0JaWYgKHIpIHsKLQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7Ci0JCXJldHVybiByOwotCX0KLQlyID0gcmFkZW9uX2JvX2ttYXAocmRldi0+dnJhbV9zY3JhdGNoLnJvYmosCi0JCQkJKHZvaWQgKiopJnJkZXYtPnZyYW1fc2NyYXRjaC5wdHIpOwotCWlmIChyKQotCQlyYWRlb25fYm9fdW5waW4ocmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOwotCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOwotCi0JcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ2NzcwX3ZyYW1fc2NyYXRjaF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCWludCByOwotCi0JaWYgKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqID09IE5VTEwpIHsKLQkJcmV0dXJuOwotCX0KLQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+dnJhbV9zY3JhdGNoLnJvYmosIGZhbHNlKTsKLQlpZiAobGlrZWx5KHIgPT0gMCkpIHsKLQkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7Ci0JCXJhZGVvbl9ib191bnBpbihyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7Ci0JCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOwotCX0KLQlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKLX0KLQogdm9pZCByNzAwX3ZyYW1fZ3R0X2xvY2F0aW9uKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX21jICptYykKIHsKIAl1NjQgc2l6ZV9iZiwgc2l6ZV9hZjsKQEAgLTExMDMsNiArMTA1MSwxMCBAQAogCQl9CiAJfQogCisJciA9IHI2MDBfdnJhbV9zY3JhdGNoX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCiAJcnY3NzBfbWNfcHJvZ3JhbShyZGV2KTsKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CiAJCXJ2NzcwX2FncF9lbmFibGUocmRldik7CkBAIC0xMTExLDkgKzEwNjMsNyBAQAogCQlpZiAocikKIAkJCXJldHVybiByOwogCX0KLQlyID0gcnY3NzBfdnJhbV9zY3JhdGNoX2luaXQocmRldik7Ci0JaWYgKHIpCi0JCXJldHVybiByOworCiAJcnY3NzBfZ3B1X2luaXQocmRldik7CiAJciA9IHI2MDBfYmxpdF9pbml0KHJkZXYpOwogCWlmIChyKSB7CkBAIC0xMTg0LDggKzExMzQsNiBAQAogCiBpbnQgcnY3NzBfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpbnQgcjsKLQogCXI2MDBfYXVkaW9fZmluaShyZGV2KTsKIAkvKiBGSVhNRTogd2Ugc2hvdWxkIHdhaXQgZm9yIHJpbmcgdG8gYmUgZW1wdHkgKi8KIAlyNzAwX2NwX3N0b3AocmRldik7CkBAIC0xMTkzLDE0ICsxMTQxLDggQEAKIAlyNjAwX2lycV9zdXNwZW5kKHJkZXYpOwogCXJhZGVvbl93Yl9kaXNhYmxlKHJkZXYpOwogCXJ2NzcwX3BjaWVfZ2FydF9kaXNhYmxlKHJkZXYpOwotCS8qIHVucGluIHNoYWRlcnMgYm8gKi8KLQlpZiAocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopIHsKLQkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqLCBmYWxzZSk7Ci0JCWlmIChsaWtlbHkociA9PSAwKSkgewotCQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKLQkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwotCQl9Ci0JfQorCXI2MDBfYmxpdF9zdXNwZW5kKHJkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMjEsNyArMTI2Myw3IEBACiAJcmFkZW9uX2liX3Bvb2xfZmluaShyZGV2KTsKIAlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOwogCXJ2NzcwX3BjaWVfZ2FydF9maW5pKHJkZXYpOwotCXJ2NzcwX3ZyYW1fc2NyYXRjaF9maW5pKHJkZXYpOworCXI2MDBfdnJhbV9zY3JhdGNoX2ZpbmkocmRldik7CiAJcmFkZW9uX2dlbV9maW5pKHJkZXYpOwogCXJhZGVvbl9mZW5jZV9kcml2ZXJfZmluaShyZGV2KTsKIAlyYWRlb25fYWdwX2ZpbmkocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX2Rydi5jCmluZGV4IDY0NjQ0OTAuLjU0NjhkMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9zYXZhZ2Uvc2F2YWdlX2Rydi5jCkBAIC0yMyw2ICsyMyw4IEBACiAgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAic2F2YWdlX2RybS5oIgogI2luY2x1ZGUgInNhdmFnZV9kcnYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmMKaW5kZXggNDZkNWJlNi4uYTljNTcxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Npcy9zaXNfZHJ2LmMKQEAgLTI1LDYgKzI1LDggQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInNpc19kcm0uaCIKICNpbmNsdWRlICJzaXNfZHJ2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGRmeC90ZGZ4X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3RkZngvdGRmeF9kcnYuYwppbmRleCA4YmY5ODgxLi5jZGEyOTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGRmeC90ZGZ4X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90ZGZ4L3RkZnhfZHJ2LmMKQEAgLTMwLDYgKzMwLDggQEAKICAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAidGRmeF9kcnYuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKaW5kZXggZWYwNjE5NC4uNjE3YjY0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCkBAIC0xMjkzLDYgKzEyOTMsNyBAQAogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0wodHRtX2JvX2NyZWF0ZSk7CiAKIHN0YXRpYyBpbnQgdHRtX2JvX2ZvcmNlX2xpc3RfY2xlYW4oc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCiAJCQkJCXVuc2lnbmVkIG1lbV90eXBlLCBib29sIGFsbG93X2Vycm9ycykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jCmluZGV4IDU4YzI3MWUuLmY5Y2M1NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybV9jYWNoZS5oIgogI2luY2x1ZGUgImRybV9tZW1fdXRpbC5oIgogI2luY2x1ZGUgInR0bS90dG1fbW9kdWxlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2Rydi5jCmluZGV4IDkyMGE1NTIuLmE4M2U4NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92aWEvdmlhX2Rydi5jCkBAIC0yMiw2ICsyMiw4IEBACiAgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInZpYV9kcm0uaCIKICNpbmNsdWRlICJ2aWFfZHJ2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L0tjb25maWcKaW5kZXggMzBhZDEzMy4uNzk0ZmY2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvS2NvbmZpZwpAQCAtNyw3ICs3LDggQEAKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAogCXNlbGVjdCBEUk1fVFRNCiAJaGVscAotCSAgS01TIGVuYWJsZWQgRFJNIGRyaXZlciBmb3IgU1ZHQTIgdmlydHVhbCBoYXJkd2FyZS4KLQotCSAgSWYgdW5zdXJlIHNheSBuLiBUaGUgY29tcGlsZWQgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCB2bXdnZngua28KKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd291bGQgbGlrZSB0byBydW4gM0QgYWNjZWxlcmF0aW9uCisJICBpbiBhIFZNd2FyZSB2aXJ0dWFsIG1hY2hpbmUuCisJICBUaGlzIGlzIGEgS01TIGVuYWJsZWQgRFJNIGRyaXZlciBmb3IgdGhlIFZNd2FyZSBTVkdBMgorCSAgdmlydHVhbCBoYXJkd2FyZS4KKwkgIFRoZSBjb21waWxlZCBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgInZtd2dmeC5rbyIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9NYWtlZmlsZQppbmRleCBjOTI4MWExLi41ODY4NjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiB2bXdnZngteSA6PSB2bXdnZnhfZXhlY2J1Zi5vIHZtd2dmeF9nbXIubyB2bXdnZnhfa21zLm8gdm13Z2Z4X2Rydi5vIFwKIAkgICAgdm13Z2Z4X2ZiLm8gdm13Z2Z4X2lvY3RsLm8gdm13Z2Z4X3Jlc291cmNlLm8gdm13Z2Z4X2J1ZmZlci5vIFwKIAkgICAgdm13Z2Z4X2ZpZm8ubyB2bXdnZnhfaXJxLm8gdm13Z2Z4X2xkdS5vIHZtd2dmeF90dG1fZ2x1ZS5vIFwKLQkgICAgdm13Z2Z4X292ZXJsYXkubyB2bXdnZnhfZmVuY2UubyB2bXdnZnhfZ21yaWRfbWFuYWdlci5vCisJICAgIHZtd2dmeF9vdmVybGF5Lm8gdm13Z2Z4X21hcmtlci5vIHZtd2dmeF9nbXJpZF9tYW5hZ2VyLm8gXAorCSAgICB2bXdnZnhfZmVuY2UubyB2bXdnZnhfZG1hYnVmLm8gdm13Z2Z4X3Njcm4ubwogCiBvYmotJChDT05GSUdfRFJNX1ZNV0dGWCkgOj0gdm13Z2Z4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYTNkX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhM2RfcmVnLmgKaW5kZXggNzdjYjQ1My4uZDBlMDg1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhM2RfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhM2RfcmVnLmgKQEAgLTU3LDcgKzU3LDggQEAKICAgIFNWR0EzRF9IV1ZFUlNJT05fV1M2X0IxICAgID0gU1ZHQTNEX01BS0VfSFdWRVJTSU9OKDEsIDEpLAogICAgU1ZHQTNEX0hXVkVSU0lPTl9GVVNJT05fMTEgPSBTVkdBM0RfTUFLRV9IV1ZFUlNJT04oMSwgNCksCiAgICBTVkdBM0RfSFdWRVJTSU9OX1dTNjVfQjEgICA9IFNWR0EzRF9NQUtFX0hXVkVSU0lPTigyLCAwKSwKLSAgIFNWR0EzRF9IV1ZFUlNJT05fQ1VSUkVOVCAgID0gU1ZHQTNEX0hXVkVSU0lPTl9XUzY1X0IxLAorICAgU1ZHQTNEX0hXVkVSU0lPTl9XUzhfQjEgICAgPSBTVkdBM0RfTUFLRV9IV1ZFUlNJT04oMiwgMSksCisgICBTVkdBM0RfSFdWRVJTSU9OX0NVUlJFTlQgICA9IFNWR0EzRF9IV1ZFUlNJT05fV1M4X0IxLAogfSBTVkdBM2RIYXJkd2FyZVZlcnNpb247CiAKIC8qCkBAIC02Nyw3ICs2OCw4IEBACiB0eXBlZGVmIHVpbnQzMiBTVkdBM2RCb29sOyAvKiAzMi1iaXQgQm9vbCBkZWZpbml0aW9uICovCiAjZGVmaW5lIFNWR0EzRF9OVU1fQ0xJUFBMQU5FUyAgICAgICAgICAgICAgICAgICA2CiAjZGVmaW5lIFNWR0EzRF9NQVhfU0lNVUxUQU5FT1VTX1JFTkRFUl9UQVJHRVRTICA4Ci0KKyNkZWZpbmUgU1ZHQTNEX01BWF9DT05URVhUX0lEUyAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBTVkdBM0RfTUFYX1NVUkZBQ0VfSURTICAgICAgICAgICAgICAgICAgKDMyICogMTAyNCkKIAogLyoKICAqIFN1cmZhY2UgZm9ybWF0cy4KQEAgLTc5LDc2ICs4MSw5MSBAQAogICovCiAKIHR5cGVkZWYgZW51bSBTVkdBM2RTdXJmYWNlRm9ybWF0IHsKLSAgIFNWR0EzRF9GT1JNQVRfSU5WQUxJRCA9IDAsCisgICBTVkdBM0RfRk9STUFUX0lOVkFMSUQgICAgICAgICAgICAgICA9IDAsCiAKLSAgIFNWR0EzRF9YOFI4RzhCOCAgICAgICA9IDEsCi0gICBTVkdBM0RfQThSOEc4QjggICAgICAgPSAyLAorICAgU1ZHQTNEX1g4UjhHOEI4ICAgICAgICAgICAgICAgICAgICAgPSAxLAorICAgU1ZHQTNEX0E4UjhHOEI4ICAgICAgICAgICAgICAgICAgICAgPSAyLAogCi0gICBTVkdBM0RfUjVHNkI1ICAgICAgICAgPSAzLAotICAgU1ZHQTNEX1gxUjVHNUI1ICAgICAgID0gNCwKLSAgIFNWR0EzRF9BMVI1RzVCNSAgICAgICA9IDUsCi0gICBTVkdBM0RfQTRSNEc0QjQgICAgICAgPSA2LAorICAgU1ZHQTNEX1I1RzZCNSAgICAgICAgICAgICAgICAgICAgICAgPSAzLAorICAgU1ZHQTNEX1gxUjVHNUI1ICAgICAgICAgICAgICAgICAgICAgPSA0LAorICAgU1ZHQTNEX0ExUjVHNUI1ICAgICAgICAgICAgICAgICAgICAgPSA1LAorICAgU1ZHQTNEX0E0UjRHNEI0ICAgICAgICAgICAgICAgICAgICAgPSA2LAogCi0gICBTVkdBM0RfWl9EMzIgICAgICAgICAgPSA3LAotICAgU1ZHQTNEX1pfRDE2ICAgICAgICAgID0gOCwKLSAgIFNWR0EzRF9aX0QyNFM4ICAgICAgICA9IDksCi0gICBTVkdBM0RfWl9EMTVTMSAgICAgICAgPSAxMCwKKyAgIFNWR0EzRF9aX0QzMiAgICAgICAgICAgICAgICAgICAgICAgID0gNywKKyAgIFNWR0EzRF9aX0QxNiAgICAgICAgICAgICAgICAgICAgICAgID0gOCwKKyAgIFNWR0EzRF9aX0QyNFM4ICAgICAgICAgICAgICAgICAgICAgID0gOSwKKyAgIFNWR0EzRF9aX0QxNVMxICAgICAgICAgICAgICAgICAgICAgID0gMTAsCiAKLSAgIFNWR0EzRF9MVU1JTkFOQ0U4ICAgICAgICAgICAgPSAxMSwKLSAgIFNWR0EzRF9MVU1JTkFOQ0U0X0FMUEhBNCAgICAgPSAxMiwKLSAgIFNWR0EzRF9MVU1JTkFOQ0UxNiAgICAgICAgICAgPSAxMywKLSAgIFNWR0EzRF9MVU1JTkFOQ0U4X0FMUEhBOCAgICAgPSAxNCwKKyAgIFNWR0EzRF9MVU1JTkFOQ0U4ICAgICAgICAgICAgICAgICAgID0gMTEsCisgICBTVkdBM0RfTFVNSU5BTkNFNF9BTFBIQTQgICAgICAgICAgICA9IDEyLAorICAgU1ZHQTNEX0xVTUlOQU5DRTE2ICAgICAgICAgICAgICAgICAgPSAxMywKKyAgIFNWR0EzRF9MVU1JTkFOQ0U4X0FMUEhBOCAgICAgICAgICAgID0gMTQsCiAKLSAgIFNWR0EzRF9EWFQxICAgICAgICAgICA9IDE1LAotICAgU1ZHQTNEX0RYVDIgICAgICAgICAgID0gMTYsCi0gICBTVkdBM0RfRFhUMyAgICAgICAgICAgPSAxNywKLSAgIFNWR0EzRF9EWFQ0ICAgICAgICAgICA9IDE4LAotICAgU1ZHQTNEX0RYVDUgICAgICAgICAgID0gMTksCisgICBTVkdBM0RfRFhUMSAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LAorICAgU1ZHQTNEX0RYVDIgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwKKyAgIFNWR0EzRF9EWFQzICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsCisgICBTVkdBM0RfRFhUNCAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LAorICAgU1ZHQTNEX0RYVDUgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwKIAotICAgU1ZHQTNEX0JVTVBVOFY4ICAgICAgID0gMjAsCi0gICBTVkdBM0RfQlVNUEw2VjVVNSAgICAgPSAyMSwKLSAgIFNWR0EzRF9CVU1QWDhMOFY4VTggICA9IDIyLAotICAgU1ZHQTNEX0JVTVBMOFY4VTggICAgID0gMjMsCisgICBTVkdBM0RfQlVNUFU4VjggICAgICAgICAgICAgICAgICAgICA9IDIwLAorICAgU1ZHQTNEX0JVTVBMNlY1VTUgICAgICAgICAgICAgICAgICAgPSAyMSwKKyAgIFNWR0EzRF9CVU1QWDhMOFY4VTggICAgICAgICAgICAgICAgID0gMjIsCisgICBTVkdBM0RfQlVNUEw4VjhVOCAgICAgICAgICAgICAgICAgICA9IDIzLAogCi0gICBTVkdBM0RfQVJHQl9TMTBFNSAgICAgPSAyNCwgICAvKiAxNi1iaXQgZmxvYXRpbmctcG9pbnQgQVJHQiAqLwotICAgU1ZHQTNEX0FSR0JfUzIzRTggICAgID0gMjUsICAgLyogMzItYml0IGZsb2F0aW5nLXBvaW50IEFSR0IgKi8KKyAgIFNWR0EzRF9BUkdCX1MxMEU1ICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyogMTYtYml0IGZsb2F0aW5nLXBvaW50IEFSR0IgKi8KKyAgIFNWR0EzRF9BUkdCX1MyM0U4ICAgICAgICAgICAgICAgICAgID0gMjUsICAgLyogMzItYml0IGZsb2F0aW5nLXBvaW50IEFSR0IgKi8KIAotICAgU1ZHQTNEX0EyUjEwRzEwQjEwICAgID0gMjYsCisgICBTVkdBM0RfQTJSMTBHMTBCMTAgICAgICAgICAgICAgICAgICA9IDI2LAogCiAgICAvKiBzaWduZWQgZm9ybWF0cyAqLwotICAgU1ZHQTNEX1Y4VTggICAgICAgICAgID0gMjcsCi0gICBTVkdBM0RfUThXOFY4VTggICAgICAgPSAyOCwKLSAgIFNWR0EzRF9DeFY4VTggICAgICAgICA9IDI5LAorICAgU1ZHQTNEX1Y4VTggICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywKKyAgIFNWR0EzRF9ROFc4VjhVOCAgICAgICAgICAgICAgICAgICAgID0gMjgsCisgICBTVkdBM0RfQ3hWOFU4ICAgICAgICAgICAgICAgICAgICAgICA9IDI5LAogCiAgICAvKiBtaXhlZCBmb3JtYXRzICovCi0gICBTVkdBM0RfWDhMOFY4VTggICAgICAgPSAzMCwKLSAgIFNWR0EzRF9BMlcxMFYxMFUxMCAgICA9IDMxLAorICAgU1ZHQTNEX1g4TDhWOFU4ICAgICAgICAgICAgICAgICAgICAgPSAzMCwKKyAgIFNWR0EzRF9BMlcxMFYxMFUxMCAgICAgICAgICAgICAgICAgID0gMzEsCiAKLSAgIFNWR0EzRF9BTFBIQTggICAgICAgICA9IDMyLAorICAgU1ZHQTNEX0FMUEhBOCAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwKIAogICAgLyogU2luZ2xlLSBhbmQgZHVhbC1jb21wb25lbnQgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cyAqLwotICAgU1ZHQTNEX1JfUzEwRTUgICAgICAgID0gMzMsCi0gICBTVkdBM0RfUl9TMjNFOCAgICAgICAgPSAzNCwKLSAgIFNWR0EzRF9SR19TMTBFNSAgICAgICA9IDM1LAotICAgU1ZHQTNEX1JHX1MyM0U4ICAgICAgID0gMzYsCisgICBTVkdBM0RfUl9TMTBFNSAgICAgICAgICAgICAgICAgICAgICA9IDMzLAorICAgU1ZHQTNEX1JfUzIzRTggICAgICAgICAgICAgICAgICAgICAgPSAzNCwKKyAgIFNWR0EzRF9SR19TMTBFNSAgICAgICAgICAgICAgICAgICAgID0gMzUsCisgICBTVkdBM0RfUkdfUzIzRTggICAgICAgICAgICAgICAgICAgICA9IDM2LAogCiAgICAvKgogICAgICogQW55IHN1cmZhY2UgY2FuIGJlIHVzZWQgYXMgYSBidWZmZXIgb2JqZWN0LCBidXQgU1ZHQTNEX0JVRkZFUiBpcwogICAgICogdGhlIG1vc3QgZWZmaWNpZW50IGZvcm1hdCB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgc3VyZmFjZXMKICAgICAqIGV4cHJlc3NseSBmb3IgaW5kZXggb3IgdmVydGV4IGRhdGEuCiAgICAgKi8KLSAgIFNWR0EzRF9CVUZGRVIgICAgICAgICA9IDM3LAogCi0gICBTVkdBM0RfWl9EMjRYOCAgICAgICAgPSAzOCwKKyAgIFNWR0EzRF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgID0gMzcsCiAKLSAgIFNWR0EzRF9WMTZVMTYgICAgICAgICA9IDM5LAorICAgU1ZHQTNEX1pfRDI0WDggICAgICAgICAgICAgICAgICAgICAgPSAzOCwKIAotICAgU1ZHQTNEX0cxNlIxNiAgICAgICAgID0gNDAsCi0gICBTVkdBM0RfQTE2QjE2RzE2UjE2ICAgPSA0MSwKKyAgIFNWR0EzRF9WMTZVMTYgICAgICAgICAgICAgICAgICAgICAgID0gMzksCisKKyAgIFNWR0EzRF9HMTZSMTYgICAgICAgICAgICAgICAgICAgICAgID0gNDAsCisgICBTVkdBM0RfQTE2QjE2RzE2UjE2ICAgICAgICAgICAgICAgICA9IDQxLAogCiAgICAvKiBQYWNrZWQgVmlkZW8gZm9ybWF0cyAqLwotICAgU1ZHQTNEX1VZVlkgICAgICAgICAgID0gNDIsCi0gICBTVkdBM0RfWVVZMiAgICAgICAgICAgPSA0MywKKyAgIFNWR0EzRF9VWVZZICAgICAgICAgICAgICAgICAgICAgICAgID0gNDIsCisgICBTVkdBM0RfWVVZMiAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzLAorCisgICAvKiBQbGFuYXIgdmlkZW8gZm9ybWF0cyAqLworICAgU1ZHQTNEX05WMTIgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NCwKKworICAgLyogVmlkZW8gZm9ybWF0IHdpdGggYWxwaGEgKi8KKyAgIFNWR0EzRF9BWVVWICAgICAgICAgICAgICAgICAgICAgICAgID0gNDUsCisKKyAgIFNWR0EzRF9CQzRfVU5PUk0gICAgICAgICAgICAgICAgICAgID0gMTA4LAorICAgU1ZHQTNEX0JDNV9VTk9STSAgICAgICAgICAgICAgICAgICAgPSAxMTEsCisKKyAgIC8qIEFkdmFuY2VkIEQzRDkgZGVwdGggZm9ybWF0cy4gKi8KKyAgIFNWR0EzRF9aX0RGMTYgICAgICAgICAgICAgICAgICAgICAgID0gMTE4LAorICAgU1ZHQTNEX1pfREYyNCAgICAgICAgICAgICAgICAgICAgICAgPSAxMTksCisgICBTVkdBM0RfWl9EMjRTOF9JTlQgICAgICAgICAgICAgICAgICA9IDEyMCwKIAogICAgU1ZHQTNEX0ZPUk1BVF9NQVgKIH0gU1ZHQTNkU3VyZmFjZUZvcm1hdDsKQEAgLTQxNCwxMCArNDMxLDIwIEBACiAgICBTVkdBM0RfUlNfU1JDQkxFTkRBTFBIQSAgICAgICAgICAgICA9IDk0LCAgICAvKiBTVkdBM2RCbGVuZE9wICovCiAgICBTVkdBM0RfUlNfRFNUQkxFTkRBTFBIQSAgICAgICAgICAgICA9IDk1LCAgICAvKiBTVkdBM2RCbGVuZE9wICovCiAgICBTVkdBM0RfUlNfQkxFTkRFUVVBVElPTkFMUEhBICAgICAgICA9IDk2LCAgICAvKiBTVkdBM2RCbGVuZEVxdWF0aW9uICovCisgICBTVkdBM0RfUlNfVFJBTlNQQVJFTkNZQU5USUFMSUFTICAgICA9IDk3LCAgICAvKiBTVkdBM2RUcmFuc3BhcmVuY3lBbnRpYWxpYXNUeXBlICovCisgICBTVkdBM0RfUlNfTElORUFBICAgICAgICAgICAgICAgICAgICA9IDk4LCAgICAvKiBTVkdBM2RCb29sICovCisgICBTVkdBM0RfUlNfTElORVdJRFRIICAgICAgICAgICAgICAgICA9IDk5LCAgICAvKiBmbG9hdCAqLwogICAgU1ZHQTNEX1JTX01BWAogfSBTVkdBM2RSZW5kZXJTdGF0ZU5hbWU7CiAKIHR5cGVkZWYgZW51bSB7CisgICBTVkdBM0RfVFJBTlNQQVJFTkNZQU5USUFMSUFTX05PUk1BTCAgICAgICAgICAgID0gMCwKKyAgIFNWR0EzRF9UUkFOU1BBUkVOQ1lBTlRJQUxJQVNfQUxQSEFUT0NPVkVSQUdFICAgPSAxLAorICAgU1ZHQTNEX1RSQU5TUEFSRU5DWUFOVElBTElBU19TVVBFUlNBTVBMRSAgICAgICA9IDIsCisgICBTVkdBM0RfVFJBTlNQQVJFTkNZQU5USUFMSUFTX01BWAorfSBTVkdBM2RUcmFuc3BhcmVuY3lBbnRpYWxpYXNUeXBlOworCit0eXBlZGVmIGVudW0gewogICAgU1ZHQTNEX1ZFUlRFWE1BVEVSSUFMX05PTkUgICAgID0gMCwgICAgLyogVXNlIHRoZSB2YWx1ZSBpbiB0aGUgY3VycmVudCBtYXRlcmlhbCAqLwogICAgU1ZHQTNEX1ZFUlRFWE1BVEVSSUFMX0RJRkZVU0UgID0gMSwgICAgLyogVXNlIHRoZSB2YWx1ZSBpbiB0aGUgZGlmZnVzZSBjb21wb25lbnQgKi8KICAgIFNWR0EzRF9WRVJURVhNQVRFUklBTF9TUEVDVUxBUiA9IDIsICAgIC8qIFVzZSB0aGUgdmFsdWUgaW4gdGhlIHNwZWN1bGFyIGNvbXBvbmVudCAqLwpAQCAtNzI4LDEwICs3NTUsMTAgQEAKICAgIFNWR0EzRF9URVhfRklMVEVSX05FQVJFU1QgICAgICAgID0gMSwKICAgIFNWR0EzRF9URVhfRklMVEVSX0xJTkVBUiAgICAgICAgID0gMiwKICAgIFNWR0EzRF9URVhfRklMVEVSX0FOSVNPVFJPUElDICAgID0gMywKLSAgIFNWR0EzRF9URVhfRklMVEVSX0ZMQVRDVUJJQyAgICAgID0gNCwgLy8gRGVwcmVjYXRlZCwgbm90IGltcGxlbWVudGVkCi0gICBTVkdBM0RfVEVYX0ZJTFRFUl9HQVVTU0lBTkNVQklDICA9IDUsIC8vIERlcHJlY2F0ZWQsIG5vdCBpbXBsZW1lbnRlZAotICAgU1ZHQTNEX1RFWF9GSUxURVJfUFlSQU1JREFMUVVBRCAgPSA2LCAvLyBOb3QgY3VycmVudGx5IGltcGxlbWVudGVkCi0gICBTVkdBM0RfVEVYX0ZJTFRFUl9HQVVTU0lBTlFVQUQgICA9IDcsIC8vIE5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQKKyAgIFNWR0EzRF9URVhfRklMVEVSX0ZMQVRDVUJJQyAgICAgID0gNCwgLyogRGVwcmVjYXRlZCwgbm90IGltcGxlbWVudGVkICovCisgICBTVkdBM0RfVEVYX0ZJTFRFUl9HQVVTU0lBTkNVQklDICA9IDUsIC8qIERlcHJlY2F0ZWQsIG5vdCBpbXBsZW1lbnRlZCAqLworICAgU1ZHQTNEX1RFWF9GSUxURVJfUFlSQU1JREFMUVVBRCAgPSA2LCAvKiBOb3QgY3VycmVudGx5IGltcGxlbWVudGVkICovCisgICBTVkdBM0RfVEVYX0ZJTFRFUl9HQVVTU0lBTlFVQUQgICA9IDcsIC8qIE5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKi8KICAgIFNWR0EzRF9URVhfRklMVEVSX01BWAogfSBTVkdBM2RUZXh0dXJlRmlsdGVyOwogCkBAIC03OTksMTkgKzgyNiwxOSBAQAogCiB0eXBlZGVmIGVudW0gewogICAgU1ZHQTNEX0RFQ0xVU0FHRV9QT1NJVElPTiAgICAgPSAwLAotICAgU1ZHQTNEX0RFQ0xVU0FHRV9CTEVORFdFSUdIVCwgICAgICAgLy8gIDEKLSAgIFNWR0EzRF9ERUNMVVNBR0VfQkxFTkRJTkRJQ0VTLCAgICAgIC8vICAyCi0gICBTVkdBM0RfREVDTFVTQUdFX05PUk1BTCwgICAgICAgICAgICAvLyAgMwotICAgU1ZHQTNEX0RFQ0xVU0FHRV9QU0laRSwgICAgICAgICAgICAgLy8gIDQKLSAgIFNWR0EzRF9ERUNMVVNBR0VfVEVYQ09PUkQsICAgICAgICAgIC8vICA1Ci0gICBTVkdBM0RfREVDTFVTQUdFX1RBTkdFTlQsICAgICAgICAgICAvLyAgNgotICAgU1ZHQTNEX0RFQ0xVU0FHRV9CSU5PUk1BTCwgICAgICAgICAgLy8gIDcKLSAgIFNWR0EzRF9ERUNMVVNBR0VfVEVTU0ZBQ1RPUiwgICAgICAgIC8vICA4Ci0gICBTVkdBM0RfREVDTFVTQUdFX1BPU0lUSU9OVCwgICAgICAgICAvLyAgOQotICAgU1ZHQTNEX0RFQ0xVU0FHRV9DT0xPUiwgICAgICAgICAgICAgLy8gMTAKLSAgIFNWR0EzRF9ERUNMVVNBR0VfRk9HLCAgICAgICAgICAgICAgIC8vIDExCi0gICBTVkdBM0RfREVDTFVTQUdFX0RFUFRILCAgICAgICAgICAgICAvLyAxMgotICAgU1ZHQTNEX0RFQ0xVU0FHRV9TQU1QTEUsICAgICAgICAgICAgLy8gMTMKKyAgIFNWR0EzRF9ERUNMVVNBR0VfQkxFTkRXRUlHSFQsICAgICAgIC8qICAxICovCisgICBTVkdBM0RfREVDTFVTQUdFX0JMRU5ESU5ESUNFUywgICAgICAvKiAgMiAqLworICAgU1ZHQTNEX0RFQ0xVU0FHRV9OT1JNQUwsICAgICAgICAgICAgLyogIDMgKi8KKyAgIFNWR0EzRF9ERUNMVVNBR0VfUFNJWkUsICAgICAgICAgICAgIC8qICA0ICovCisgICBTVkdBM0RfREVDTFVTQUdFX1RFWENPT1JELCAgICAgICAgICAvKiAgNSAqLworICAgU1ZHQTNEX0RFQ0xVU0FHRV9UQU5HRU5ULCAgICAgICAgICAgLyogIDYgKi8KKyAgIFNWR0EzRF9ERUNMVVNBR0VfQklOT1JNQUwsICAgICAgICAgIC8qICA3ICovCisgICBTVkdBM0RfREVDTFVTQUdFX1RFU1NGQUNUT1IsICAgICAgICAvKiAgOCAqLworICAgU1ZHQTNEX0RFQ0xVU0FHRV9QT1NJVElPTlQsICAgICAgICAgLyogIDkgKi8KKyAgIFNWR0EzRF9ERUNMVVNBR0VfQ09MT1IsICAgICAgICAgICAgIC8qIDEwICovCisgICBTVkdBM0RfREVDTFVTQUdFX0ZPRywgICAgICAgICAgICAgICAvKiAxMSAqLworICAgU1ZHQTNEX0RFQ0xVU0FHRV9ERVBUSCwgICAgICAgICAgICAgLyogMTIgKi8KKyAgIFNWR0EzRF9ERUNMVVNBR0VfU0FNUExFLCAgICAgICAgICAgIC8qIDEzICovCiAgICBTVkdBM0RfREVDTFVTQUdFX01BWAogfSBTVkdBM2REZWNsVXNhZ2U7CiAKQEAgLTgxOSwxMCArODQ2LDEwIEBACiAgICBTVkdBM0RfREVDTE1FVEhPRF9ERUZBVUxUICAgICA9IDAsCiAgICBTVkdBM0RfREVDTE1FVEhPRF9QQVJUSUFMVSwKICAgIFNWR0EzRF9ERUNMTUVUSE9EX1BBUlRJQUxWLAotICAgU1ZHQTNEX0RFQ0xNRVRIT0RfQ1JPU1NVViwgICAgICAgICAgLy8gTm9ybWFsCisgICBTVkdBM0RfREVDTE1FVEhPRF9DUk9TU1VWLCAgICAgICAgICAvKiBOb3JtYWwgKi8KICAgIFNWR0EzRF9ERUNMTUVUSE9EX1VWLAotICAgU1ZHQTNEX0RFQ0xNRVRIT0RfTE9PS1VQLCAgICAgICAgICAgLy8gTG9va3VwIGEgZGlzcGxhY2VtZW50IG1hcAotICAgU1ZHQTNEX0RFQ0xNRVRIT0RfTE9PS1VQUFJFU0FNUExFRCwgLy8gTG9va3VwIGEgcHJlLXNhbXBsZWQgZGlzcGxhY2VtZW50IG1hcAorICAgU1ZHQTNEX0RFQ0xNRVRIT0RfTE9PS1VQLCAgICAgICAgICAgLyogTG9va3VwIGEgZGlzcGxhY2VtZW50IG1hcCAqLworICAgU1ZHQTNEX0RFQ0xNRVRIT0RfTE9PS1VQUFJFU0FNUExFRCwgLyogTG9va3VwIGEgcHJlLXNhbXBsZWQgZGlzcGxhY2VtZW50IG1hcCAqLwogfSBTVkdBM2REZWNsTWV0aG9kOwogCiB0eXBlZGVmIGVudW0gewpAQCAtOTMwLDcgKzk1Nyw2IEBACiB9IFNWR0EzZEN1YmVGYWNlOwogCiB0eXBlZGVmIGVudW0gewotICAgU1ZHQTNEX1NIQURFUlRZUEVfQ09NUElMRURfRFg4ICAgICAgICAgICAgICAgPSAwLAogICAgU1ZHQTNEX1NIQURFUlRZUEVfVlMgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLAogICAgU1ZHQTNEX1NIQURFUlRZUEVfUFMgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLAogICAgU1ZHQTNEX1NIQURFUlRZUEVfTUFYCkBAIC05NjgsMTIgKzk5NCwxOCBAQAogfSBTVkdBM2RUcmFuc2ZlclR5cGU7CiAKIC8qCi0gKiBUaGUgbWF4aW11bSBudW1iZXIgdmVydGV4IGFycmF5cyB3ZSdyZSBndWFyYW50ZWVkIHRvIHN1cHBvcnQgaW4KKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB2ZXJ0ZXggYXJyYXlzIHdlJ3JlIGd1YXJhbnRlZWQgdG8gc3VwcG9ydCBpbgogICogU1ZHQV8zRF9DTURfRFJBV1BSSU1JVElWRVMuCiAgKi8KICNkZWZpbmUgU1ZHQTNEX01BWF9WRVJURVhfQVJSQVlTICAgMzIKIAogLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcmltaXRpdmUgcmFuZ2VzIHdlJ3JlIGd1YXJhbnRlZWQgdG8gc3VwcG9ydAorICogaW4gU1ZHQV8zRF9DTURfRFJBV1BSSU1JVElWRVMuCisgKi8KKyNkZWZpbmUgU1ZHQTNEX01BWF9EUkFXX1BSSU1JVElWRV9SQU5HRVMgMzIKKworLyoKICAqIElkZW50aWZpZXJzIGZvciBjb21tYW5kcyBpbiB0aGUgY29tbWFuZCBGSUZPLgogICoKICAqIElEcyBiZXR3ZWVuIDEwMDAgYW5kIDEwMzkgKGluY2x1c2l2ZSkgd2VyZSB1c2VkIGJ5IG9ic29sZXRlIHZlcnNpb25zIG9mCkBAIC05OTAsNyArMTAyMiw3IEBACiAjZGVmaW5lIFNWR0FfM0RfQ01EX0xFR0FDWV9CQVNFICAgICAgICAgICAgMTAwMAogI2RlZmluZSBTVkdBXzNEX0NNRF9CQVNFICAgICAgICAgICAgICAgICAgIDEwNDAKIAotI2RlZmluZSBTVkdBXzNEX0NNRF9TVVJGQUNFX0RFRklORSAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAwCisjZGVmaW5lIFNWR0FfM0RfQ01EX1NVUkZBQ0VfREVGSU5FICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDAgICAgIC8qIERlcHJlY2F0ZWQgKi8KICNkZWZpbmUgU1ZHQV8zRF9DTURfU1VSRkFDRV9ERVNUUk9ZICAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMQogI2RlZmluZSBTVkdBXzNEX0NNRF9TVVJGQUNFX0NPUFkgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAyCiAjZGVmaW5lIFNWR0FfM0RfQ01EX1NVUkZBQ0VfU1RSRVRDSEJMVCAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDMKQEAgLTEwMDgsNyArMTA0MCw3IEBACiAjZGVmaW5lIFNWR0FfM0RfQ01EX1NFVFZJRVdQT1JUICAgICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDE1CiAjZGVmaW5lIFNWR0FfM0RfQ01EX1NFVENMSVBQTEFORSAgICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDE2CiAjZGVmaW5lIFNWR0FfM0RfQ01EX0NMRUFSICAgICAgICAgICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDE3Ci0jZGVmaW5lIFNWR0FfM0RfQ01EX1BSRVNFTlQgICAgICAgICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDE4ICAgIC8vIERlcHJlY2F0ZWQKKyNkZWZpbmUgU1ZHQV8zRF9DTURfUFJFU0VOVCAgICAgICAgICAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMTggICAgLyogRGVwcmVjYXRlZCAqLwogI2RlZmluZSBTVkdBXzNEX0NNRF9TSEFERVJfREVGSU5FICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAxOQogI2RlZmluZSBTVkdBXzNEX0NNRF9TSEFERVJfREVTVFJPWSAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAyMAogI2RlZmluZSBTVkdBXzNEX0NNRF9TRVRfU0hBREVSICAgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAyMQpAQCAtMTAxOCw5ICsxMDUwLDEzIEBACiAjZGVmaW5lIFNWR0FfM0RfQ01EX0JFR0lOX1FVRVJZICAgICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDI1CiAjZGVmaW5lIFNWR0FfM0RfQ01EX0VORF9RVUVSWSAgICAgICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDI2CiAjZGVmaW5lIFNWR0FfM0RfQ01EX1dBSVRfRk9SX1FVRVJZICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDI3Ci0jZGVmaW5lIFNWR0FfM0RfQ01EX1BSRVNFTlRfUkVBREJBQ0sgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDI4ICAgIC8vIERlcHJlY2F0ZWQKKyNkZWZpbmUgU1ZHQV8zRF9DTURfUFJFU0VOVF9SRUFEQkFDSyAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMjggICAgLyogRGVwcmVjYXRlZCAqLwogI2RlZmluZSBTVkdBXzNEX0NNRF9CTElUX1NVUkZBQ0VfVE9fU0NSRUVOIFNWR0FfM0RfQ01EX0JBU0UgKyAyOQotI2RlZmluZSBTVkdBXzNEX0NNRF9NQVggICAgICAgICAgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAzMAorI2RlZmluZSBTVkdBXzNEX0NNRF9TVVJGQUNFX0RFRklORV9WMiAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAzMAorI2RlZmluZSBTVkdBXzNEX0NNRF9HRU5FUkFURV9NSVBNQVBTICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAzMQorI2RlZmluZSBTVkdBXzNEX0NNRF9BQ1RJVkFURV9TVVJGQUNFICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyA0MAorI2RlZmluZSBTVkdBXzNEX0NNRF9ERUFDVElWQVRFX1NVUkZBQ0UgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyA0MQorI2RlZmluZSBTVkdBXzNEX0NNRF9NQVggICAgICAgICAgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyA0MgogCiAjZGVmaW5lIFNWR0FfM0RfQ01EX0ZVVFVSRV9NQVggICAgICAgICAgICAgMjAwMAogCkBAIC0xMDMxLDkgKzEwNjcsOSBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgdW5pb24gewogICAgICAgc3RydWN0IHsKLSAgICAgICAgIHVpbnQxNiAgZnVuY3Rpb247ICAgICAgIC8vIFNWR0EzZEZvZ0Z1bmN0aW9uCi0gICAgICAgICB1aW50OCAgIHR5cGU7ICAgICAgICAgICAvLyBTVkdBM2RGb2dUeXBlCi0gICAgICAgICB1aW50OCAgIGJhc2U7ICAgICAgICAgICAvLyBTVkdBM2RGb2dCYXNlCisgICAgICAgICB1aW50MTYgIGZ1bmN0aW9uOyAgICAgICAvKiBTVkdBM2RGb2dGdW5jdGlvbiAqLworICAgICAgICAgdWludDggICB0eXBlOyAgICAgICAgICAgLyogU1ZHQTNkRm9nVHlwZSAqLworICAgICAgICAgdWludDggICBiYXNlOyAgICAgICAgICAgLyogU1ZHQTNkRm9nQmFzZSAqLwogICAgICAgfTsKICAgICAgIHVpbnQzMiAgICAgdWludFZhbHVlOwogICAgfTsKQEAgLTExMDksNiArMTE0NSw4IEBACiAgICBTVkdBM0RfU1VSRkFDRV9ISU5UX1JFTkRFUlRBUkdFVCAgICA9ICgxIDw8IDYpLAogICAgU1ZHQTNEX1NVUkZBQ0VfSElOVF9ERVBUSFNURU5DSUwgICAgPSAoMSA8PCA3KSwKICAgIFNWR0EzRF9TVVJGQUNFX0hJTlRfV1JJVEVPTkxZICAgICAgID0gKDEgPDwgOCksCisgICBTVkdBM0RfU1VSRkFDRV9NQVNLQUJMRV9BTlRJQUxJQVMgICA9ICgxIDw8IDkpLAorICAgU1ZHQTNEX1NVUkZBQ0VfQVVUT0dFTk1JUE1BUFMgICAgICAgPSAoMSA8PCAxMCksCiB9IFNWR0EzZFN1cmZhY2VGbGFnczsKIAogdHlwZWRlZgpAQCAtMTEyMSw2ICsxMTU5LDEyIEBACiAgICB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgc2lkOwogICAgU1ZHQTNkU3VyZmFjZUZsYWdzICAgICAgICAgIHN1cmZhY2VGbGFnczsKICAgIFNWR0EzZFN1cmZhY2VGb3JtYXQgICAgICAgICBmb3JtYXQ7CisgICAvKgorICAgICogSWYgc3VyZmFjZUZsYWdzIGhhcyBTVkdBM0RfU1VSRkFDRV9DVUJFTUFQIGJpdCBzZXQsIGFsbCBTVkdBM2RTdXJmYWNlRmFjZQorICAgICogc3RydWN0dXJlcyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWUgb2YgbnVtTWlwTGV2ZWxzIGZpZWxkLgorICAgICogT3RoZXJ3aXNlLCBhbGwgYnV0IHRoZSBmaXJzdCBTVkdBM2RTdXJmYWNlRmFjZSBzdHJ1Y3R1cmVzIG11c3QgaGF2ZSB0aGUKKyAgICAqIG51bU1pcExldmVscyBzZXQgdG8gMC4KKyAgICAqLwogICAgU1ZHQTNkU3VyZmFjZUZhY2UgICAgICAgICAgIGZhY2VbU1ZHQTNEX01BWF9TVVJGQUNFX0ZBQ0VTXTsKICAgIC8qCiAgICAgKiBGb2xsb3dlZCBieSBhbiBTVkdBM2RTaXplIHN0cnVjdHVyZSBmb3IgZWFjaCBtaXAgbGV2ZWwgaW4gZWFjaCBmYWNlLgpAQCAtMTEzNSw2ICsxMTc5LDMxIEBACiAKIHR5cGVkZWYKIHN0cnVjdCB7CisgICB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgc2lkOworICAgU1ZHQTNkU3VyZmFjZUZsYWdzICAgICAgICAgIHN1cmZhY2VGbGFnczsKKyAgIFNWR0EzZFN1cmZhY2VGb3JtYXQgICAgICAgICBmb3JtYXQ7CisgICAvKgorICAgICogSWYgc3VyZmFjZUZsYWdzIGhhcyBTVkdBM0RfU1VSRkFDRV9DVUJFTUFQIGJpdCBzZXQsIGFsbCBTVkdBM2RTdXJmYWNlRmFjZQorICAgICogc3RydWN0dXJlcyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWUgb2YgbnVtTWlwTGV2ZWxzIGZpZWxkLgorICAgICogT3RoZXJ3aXNlLCBhbGwgYnV0IHRoZSBmaXJzdCBTVkdBM2RTdXJmYWNlRmFjZSBzdHJ1Y3R1cmVzIG11c3QgaGF2ZSB0aGUKKyAgICAqIG51bU1pcExldmVscyBzZXQgdG8gMC4KKyAgICAqLworICAgU1ZHQTNkU3VyZmFjZUZhY2UgICAgICAgICAgIGZhY2VbU1ZHQTNEX01BWF9TVVJGQUNFX0ZBQ0VTXTsKKyAgIHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICBtdWx0aXNhbXBsZUNvdW50OworICAgU1ZHQTNkVGV4dHVyZUZpbHRlciAgICAgICAgIGF1dG9nZW5GaWx0ZXI7CisgICAvKgorICAgICogRm9sbG93ZWQgYnkgYW4gU1ZHQTNkU2l6ZSBzdHJ1Y3R1cmUgZm9yIGVhY2ggbWlwIGxldmVsIGluIGVhY2ggZmFjZS4KKyAgICAqCisgICAgKiBBIG5vdGUgb24gc3VyZmFjZSBzaXplczogU2l6ZXMgYXJlIGFsd2F5cyBzcGVjaWZpZWQgaW4gcGl4ZWxzLAorICAgICogZXZlbiBpZiB0aGUgdHJ1ZSBzdXJmYWNlIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIG1pbmltdW0KKyAgICAqIGJsb2NrIHNpemUgb2YgdGhlIHN1cmZhY2UncyBmb3JtYXQuIEZvciBleGFtcGxlLCBhIDN4M3gxIERYVDEKKyAgICAqIGNvbXByZXNzZWQgdGV4dHVyZSB3b3VsZCBhY3R1YWxseSBiZSBzdG9yZWQgYXMgYSA0eDR4MSBpbWFnZSBpbgorICAgICogbWVtb3J5LgorICAgICovCit9IFNWR0EzZENtZERlZmluZVN1cmZhY2VfdjI7ICAgICAvKiBTVkdBXzNEX0NNRF9TVVJGQUNFX0RFRklORV9WMiAqLworCit0eXBlZGVmCitzdHJ1Y3QgewogICAgdWludDMyICAgICAgICAgICAgICAgc2lkOwogfSBTVkdBM2RDbWREZXN0cm95U3VyZmFjZTsgICAgICAvKiBTVkdBXzNEX0NNRF9TVVJGQUNFX0RFU1RST1kgKi8KIApAQCAtMTQ3NCwxMCArMTU0MywxMiBAQAogICAgICogU1ZHQTNkQ21kRHJhd1ByaW1pdGl2ZXMgc3RydWN0dXJlLiBJbiBvcmRlciwKICAgICAqIHRoZXkgYXJlOgogICAgICoKLSAgICAqIDEuIFNWR0EzZFZlcnRleERlY2wsIHF1YW50aXR5ICdudW1WZXJ0ZXhEZWNscycKLSAgICAqIDIuIFNWR0EzZFByaW1pdGl2ZVJhbmdlLCBxdWFudGl0eSAnbnVtUmFuZ2VzJworICAgICogMS4gU1ZHQTNkVmVydGV4RGVjbCwgcXVhbnRpdHkgJ251bVZlcnRleERlY2xzJywgYnV0IG5vIG1vcmUgdGhhbgorICAgICogICAgU1ZHQTNEX01BWF9WRVJURVhfQVJSQVlTOworICAgICogMi4gU1ZHQTNkUHJpbWl0aXZlUmFuZ2UsIHF1YW50aXR5ICdudW1SYW5nZXMnLCBidXQgbm8gbW9yZSB0aGFuCisgICAgKiAgICBTVkdBM0RfTUFYX0RSQVdfUFJJTUlUSVZFX1JBTkdFUzsKICAgICAqIDMuIE9wdGlvbmFsbHksIFNWR0EzZFZlcnRleERpdmlzb3IsIHF1YW50aXR5ICdudW1WZXJ0ZXhEZWNscycgKGNvbnRhaW5zCi0gICAgKiAgICB0aGUgZnJlcXVlbmN5IGRpdmlzb3IgZm9yIHRoaXMgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGV4IGRlY2wpCisgICAgKiAgICB0aGUgZnJlcXVlbmN5IGRpdmlzb3IgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBkZWNsKS4KICAgICAqLwogfSBTVkdBM2RDbWREcmF3UHJpbWl0aXZlczsgICAgICAvKiBTVkdBXzNEX0NNRF9EUkFXUFJJTUlUSVZFUyAqLwogCkBAIC0xNjcxLDYgKzE3NDIsMTIgQEAKICAgIC8qIENsaXBwaW5nOiB6ZXJvIG9yIG1vcmUgU1ZHQVNpZ25lZFJlY3RzIGZvbGxvdyAqLwogfSBTVkdBM2RDbWRCbGl0U3VyZmFjZVRvU2NyZWVuOyAgICAgICAgIC8qIFNWR0FfM0RfQ01EX0JMSVRfU1VSRkFDRV9UT19TQ1JFRU4gKi8KIAordHlwZWRlZgorc3RydWN0IHsKKyAgIHVpbnQzMiAgICAgICAgICAgICAgIHNpZDsKKyAgIFNWR0EzZFRleHR1cmVGaWx0ZXIgIGZpbHRlcjsKK30gU1ZHQTNkQ21kR2VuZXJhdGVNaXBtYXBzOyAgICAgICAgICAgICAvKiBTVkdBXzNEX0NNRF9HRU5FUkFURV9NSVBNQVBTICovCisKIAogLyoKICAqIENhcGFiaWxpdHkgcXVlcnkgaW5kZXguCkBAIC0xNzc0LDYgKzE4NTEsMzIgQEAKICAgIFNWR0EzRF9ERVZDQVBfU1VSRkFDRUZNVF9BMTZCMTZHMTZSMTYgICAgICAgICAgID0gNjcsCiAgICBTVkdBM0RfREVWQ0FQX1NVUkZBQ0VGTVRfVVlWWSAgICAgICAgICAgICAgICAgICA9IDY4LAogICAgU1ZHQTNEX0RFVkNBUF9TVVJGQUNFRk1UX1lVWTIgICAgICAgICAgICAgICAgICAgPSA2OSwKKyAgIFNWR0EzRF9ERVZDQVBfTVVMVElTQU1QTEVfTk9OTUFTS0FCTEVTQU1QTEVTICAgID0gNzAsCisgICBTVkdBM0RfREVWQ0FQX01VTFRJU0FNUExFX01BU0tBQkxFU0FNUExFUyAgICAgICA9IDcxLAorICAgU1ZHQTNEX0RFVkNBUF9BTFBIQVRPQ09WRVJBR0UgICAgICAgICAgICAgICAgICAgPSA3MiwKKyAgIFNWR0EzRF9ERVZDQVBfU1VQRVJTQU1QTEUgICAgICAgICAgICAgICAgICAgICAgID0gNzMsCisgICBTVkdBM0RfREVWQ0FQX0FVVE9HRU5NSVBNQVBTICAgICAgICAgICAgICAgICAgICA9IDc0LAorICAgU1ZHQTNEX0RFVkNBUF9TVVJGQUNFRk1UX05WMTIgICAgICAgICAgICAgICAgICAgPSA3NSwKKyAgIFNWR0EzRF9ERVZDQVBfU1VSRkFDRUZNVF9BWVVWICAgICAgICAgICAgICAgICAgID0gNzYsCisKKyAgIC8qCisgICAgKiBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBTVkdBIGNvbnRleHQgSURzIHRoYXQgdGhlIGd1ZXN0CisgICAgKiBjYW4gZGVmaW5lIHVzaW5nIFNWR0FfM0RfQ01EX0NPTlRFWFRfREVGSU5FLgorICAgICovCisgICBTVkdBM0RfREVWQ0FQX01BWF9DT05URVhUX0lEUyAgICAgICAgICAgICAgICAgICA9IDc3LAorCisgICAvKgorICAgICogVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgU1ZHQSBzdXJmYWNlIElEcyB0aGF0IHRoZSBndWVzdAorICAgICogY2FuIGRlZmluZSB1c2luZyBTVkdBXzNEX0NNRF9TVVJGQUNFX0RFRklORSouCisgICAgKi8KKyAgIFNWR0EzRF9ERVZDQVBfTUFYX1NVUkZBQ0VfSURTICAgICAgICAgICAgICAgICAgID0gNzgsCisKKyAgIFNWR0EzRF9ERVZDQVBfU1VSRkFDRUZNVF9aX0RGMTYgICAgICAgICAgICAgICAgID0gNzksCisgICBTVkdBM0RfREVWQ0FQX1NVUkZBQ0VGTVRfWl9ERjI0ICAgICAgICAgICAgICAgICA9IDgwLAorICAgU1ZHQTNEX0RFVkNBUF9TVVJGQUNFRk1UX1pfRDI0UzhfSU5UICAgICAgICAgICAgPSA4MSwKKworICAgU1ZHQTNEX0RFVkNBUF9TVVJGQUNFRk1UX0JDNF9VTk9STSAgICAgICAgICAgICAgPSA4MiwKKyAgIFNWR0EzRF9ERVZDQVBfU1VSRkFDRUZNVF9CQzVfVU5PUk0gICAgICAgICAgICAgID0gODMsCiAKICAgIC8qCiAgICAgKiBEb24ndCBhZGQgbmV3IGNhcHMgaW50byB0aGUgcHJldmlvdXMgc2VjdGlvbjsgdGhlIHZhbHVlcyBpbiB0aGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2FfZXNjYXBlLmggYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2FfZXNjYXBlLmgKaW5kZXggN2I4NWU5Yi4uOGU4ZDk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhX2VzY2FwZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYV9lc2NhcGUuaApAQCAtNzUsNyArNzUsNyBAQAogICovCiAKICNkZWZpbmUgU1ZHQV9FU0NBUEVfVk1XQVJFX0hJTlQgICAgICAgICAgICAgICAweDAwMDMwMDAwCi0jZGVmaW5lIFNWR0FfRVNDQVBFX1ZNV0FSRV9ISU5UX0ZVTExTQ1JFRU4gICAgMHgwMDAzMDAwMSAgLy8gRGVwcmVjYXRlZAorI2RlZmluZSBTVkdBX0VTQ0FQRV9WTVdBUkVfSElOVF9GVUxMU0NSRUVOICAgIDB4MDAwMzAwMDEgIC8qIERlcHJlY2F0ZWQgKi8KIAogdHlwZWRlZgogc3RydWN0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYV9vdmVybGF5LmggYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2Ffb3ZlcmxheS5oCmluZGV4IGY3NTNkNzMuLmYzODQxNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYV9vdmVybGF5LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhX292ZXJsYXkuaApAQCAtMzgsOSArMzgsOSBAQAogICogVmlkZW8gZm9ybWF0cyB3ZSBzdXBwb3J0CiAgKi8KIAotI2RlZmluZSBWTVdBUkVfRk9VUkNDX1lWMTIgMHgzMjMxNTY1OSAvLyAnWScgJ1YnICcxJyAnMicKLSNkZWZpbmUgVk1XQVJFX0ZPVVJDQ19ZVVkyIDB4MzI1OTU1NTkgLy8gJ1knICdVJyAnWScgJzInCi0jZGVmaW5lIFZNV0FSRV9GT1VSQ0NfVVlWWSAweDU5NTY1OTU1IC8vICdVJyAnWScgJ1YnICdZJworI2RlZmluZSBWTVdBUkVfRk9VUkNDX1lWMTIgMHgzMjMxNTY1OSAvKiAnWScgJ1YnICcxJyAnMicgKi8KKyNkZWZpbmUgVk1XQVJFX0ZPVVJDQ19ZVVkyIDB4MzI1OTU1NTkgLyogJ1knICdVJyAnWScgJzInICovCisjZGVmaW5lIFZNV0FSRV9GT1VSQ0NfVVlWWSAweDU5NTY1OTU1IC8qICdVJyAnWScgJ1YnICdZJyAqLwogCiB0eXBlZGVmIGVudW0gewogICAgU1ZHQV9PVkVSTEFZX0ZPUk1BVF9JTlZBTElEID0gMCwKQEAgLTY4LDcgKzY4LDcgQEAKICAgICAgIHVpbnQzMiBzdHJlYW1JZDsKICAgIH0gaGVhZGVyOwogCi0gICAvLyBNYXkgaW5jbHVkZSB6ZXJvIG9yIG1vcmUgaXRlbXMuCisgICAvKiBNYXkgaW5jbHVkZSB6ZXJvIG9yIG1vcmUgaXRlbXMuICovCiAgICBzdHJ1Y3QgewogICAgICAgdWludDMyIHJlZ2lzdGVySWQ7CiAgICAgICB1aW50MzIgdmFsdWU7CkBAIC0xMzQsMTIgKzEzNCwxMiBAQAogICovCiAKIHN0YXRpYyBpbmxpbmUgYm9vbAotVk13YXJlVmlkZW9HZXRBdHRyaWJ1dGVzKGNvbnN0IFNWR0FPdmVybGF5Rm9ybWF0IGZvcm1hdCwgICAgLy8gSU4KLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgKndpZHRoLCAgICAgICAgICAgICAgICAgICAgIC8vIElOIC8gT1VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyICpoZWlnaHQsICAgICAgICAgICAgICAgICAgICAvLyBJTiAvIE9VVAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiAqc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gT1VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyICpwaXRjaGVzLCAgICAgICAgICAgICAgICAgICAvLyBPVVQgKG9wdGlvbmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiAqb2Zmc2V0cykgICAgICAgICAgICAgICAgICAgLy8gT1VUIChvcHRpb25hbCkKK1ZNd2FyZVZpZGVvR2V0QXR0cmlidXRlcyhjb25zdCBTVkdBT3ZlcmxheUZvcm1hdCBmb3JtYXQsICAgIC8qIElOICovCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyICp3aWR0aCwgICAgICAgICAgICAgICAgICAgICAvKiBJTiAvIE9VVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiAqaGVpZ2h0LCAgICAgICAgICAgICAgICAgICAgLyogSU4gLyBPVVQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgKnNpemUsICAgICAgICAgICAgICAgICAgICAgIC8qIE9VVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiAqcGl0Y2hlcywgICAgICAgICAgICAgICAgICAgLyogT1VUIChvcHRpb25hbCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgKm9mZnNldHMpICAgICAgICAgICAgICAgICAgIC8qIE9VVCAob3B0aW9uYWwpICovCiB7CiAgICAgaW50IHRtcDsKIApAQCAtMTk4LDQgKzE5OCw0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLSNlbmRpZiAvLyBfU1ZHQV9PVkVSTEFZX0hfCisjZW5kaWYgLyogX1NWR0FfT1ZFUkxBWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhX3JlZy5oCmluZGV4IDFiOTZjMmUuLjAxZjYzY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYV9yZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2FfcmVnLmgKQEAgLTM5LDYgKzM5LDE1IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk1XQVJFX1NWR0EyICAgICAgMHgwNDA1CiAKIC8qCisgKiBTVkdBX1JFR19FTkFCTEUgYml0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFNWR0FfUkVHX0VOQUJMRV9ESVNBQkxFICAgICAwCisjZGVmaW5lIFNWR0FfUkVHX0VOQUJMRV9FTkFCTEUgICAgICAxCisjZGVmaW5lIFNWR0FfUkVHX0VOQUJMRV9ISURFICAgICAgICAyCisjZGVmaW5lIFNWR0FfUkVHX0VOQUJMRV9FTkFCTEVfSElERSAoU1ZHQV9SRUdfRU5BQkxFX0VOQUJMRSB8XAorCQkJCSAgICAgU1ZHQV9SRUdfRU5BQkxFX0hJREUpCisKKy8qCiAgKiBMZWdhbCB2YWx1ZXMgZm9yIHRoZSBTVkdBX1JFR19DVVJTT1JfT04gcmVnaXN0ZXIgaW4gb2xkLWZhc2hpb25lZAogICogY3Vyc29yIGJ5cGFzcyBtb2RlLiBUaGlzIGlzIHN0aWxsIHN1cHBvcnRlZCwgYnV0IG5vIG5ldyBndWVzdAogICogZHJpdmVycyBzaG91bGQgdXNlIGl0LgpAQCAtMTU4LDcgKzE2Nyw5IEBACiAgICBTVkdBX1JFR19HTVJfTUFYX0RFU0NSSVBUT1JfTEVOR1RIID0gNDQsCiAKICAgIFNWR0FfUkVHX1RSQUNFUyA9IDQ1LCAgICAgICAgICAgIC8qIEVuYWJsZSB0cmFjZS1iYXNlZCB1cGRhdGVzIGV2ZW4gd2hlbiBGSUZPIGlzIG9uICovCi0gICBTVkdBX1JFR19UT1AgPSA0NiwgICAgICAgICAgICAgICAvKiBNdXN0IGJlIDEgbW9yZSB0aGFuIHRoZSBsYXN0IHJlZ2lzdGVyICovCisgICBTVkdBX1JFR19HTVJTX01BWF9QQUdFUyA9IDQ2LCAgICAvKiBNYXhpbXVtIG51bWJlciBvZiA0S0IgcGFnZXMgZm9yIGFsbCBHTVJzICovCisgICBTVkdBX1JFR19NRU1PUllfU0laRSA9IDQ3LCAgICAgICAvKiBUb3RhbCBkZWRpY2F0ZWQgZGV2aWNlIG1lbW9yeSBleGNsdWRpbmcgRklGTyAqLworICAgU1ZHQV9SRUdfVE9QID0gNDgsICAgICAgICAgICAgICAgLyogTXVzdCBiZSAxIG1vcmUgdGhhbiB0aGUgbGFzdCByZWdpc3RlciAqLwogCiAgICBTVkdBX1BBTEVUVEVfQkFTRSA9IDEwMjQsICAgICAgICAvKiBCYXNlIG9mIFNWR0EgY29sb3IgbWFwICovCiAgICAvKiBOZXh0IDc2OCAoPT0gMjU2KjMpIHJlZ2lzdGVycyBleGlzdCBmb3IgY29sb3JtYXAgKi8KQEAgLTI2NSw3ICsyNzYsNyBAQAogICogcG9zc2libGUuCiAgKi8KICNkZWZpbmUgU1ZHQV9HTVJfTlVMTCAgICAgICAgICgodWludDMyKSAtMSkKLSNkZWZpbmUgU1ZHQV9HTVJfRlJBTUVCVUZGRVIgICgodWludDMyKSAtMikgIC8vIEd1ZXN0IEZyYW1lYnVmZmVyIChHRkIpCisjZGVmaW5lIFNWR0FfR01SX0ZSQU1FQlVGRkVSICAoKHVpbnQzMikgLTIpICAvKiBHdWVzdCBGcmFtZWJ1ZmZlciAoR0ZCKSAqLwogCiB0eXBlZGVmCiBzdHJ1Y3QgU1ZHQUd1ZXN0TWVtRGVzY3JpcHRvciB7CkBAIC0zMDYsMTMgKzMxNywzNSBAQAogICAgICAgc3RydWN0IHsKICAgICAgICAgIHVpbnQzMiBiaXRzUGVyUGl4ZWwgOiA4OwogICAgICAgICAgdWludDMyIGNvbG9yRGVwdGggICA6IDg7Ci0gICAgICAgICB1aW50MzIgcmVzZXJ2ZWQgICAgIDogMTY7ICAvLyBNdXN0IGJlIHplcm8KKyAgICAgICAgIHVpbnQzMiByZXNlcnZlZCAgICAgOiAxNjsgIC8qIE11c3QgYmUgemVybyAqLwogICAgICAgfTsKIAogICAgICAgdWludDMyIHZhbHVlOwogICAgfTsKIH0gU1ZHQUdNUkltYWdlRm9ybWF0OwogCit0eXBlZGVmCitzdHJ1Y3QgU1ZHQUd1ZXN0SW1hZ2UgeworICAgU1ZHQUd1ZXN0UHRyICAgICAgICAgcHRyOworCisgICAvKgorICAgICogQSBub3RlIG9uIGludGVycHJldGF0aW9uIG9mIHBpdGNoOiBUaGlzIHZhbHVlIG9mIHBpdGNoIGlzIHRoZQorICAgICogbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gdmVydGljYWxseSBhZGphY2VudCBpbWFnZQorICAgICogYmxvY2tzLiBOb3JtYWxseSB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiB0aGUgZmlyc3QKKyAgICAqIHBpeGVsIG9mIHR3byBhZGphY2VudCBzY2FubGluZXMuIFdpdGggY29tcHJlc3NlZCB0ZXh0dXJlcywKKyAgICAqIGhvd2V2ZXIsIHRoaXMgbWF5IHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4KKyAgICAqIGNvbXByZXNzaW9uIGJsb2NrcyByYXRoZXIgdGhhbiBiZXR3ZWVuIHJvd3Mgb2YgcGl4ZWxzLgorICAgICoKKyAgICAqIFhYWDogQ29tcHJlc3NlZCB0ZXh0dXJlcyBjdXJyZW50bHkgbXVzdCBiZSB0aWdodGx5IHBhY2tlZCBpbiBndWVzdCBtZW1vcnkuCisgICAgKgorICAgICogSWYgdGhlIGltYWdlIGlzIDEtZGltZW5zaW9uYWwsIHBpdGNoIGlzIGlnbm9yZWQuCisgICAgKgorICAgICogSWYgJ3BpdGNoJyBpcyB6ZXJvLCB0aGUgU1ZHQTNEIGRldmljZSBjYWxjdWxhdGVzIGEgcGl0Y2ggdmFsdWUKKyAgICAqIGFzc3VtaW5nIGVhY2ggcm93IG9mIGJsb2NrcyBpcyB0aWdodGx5IHBhY2tlZC4KKyAgICAqLworICAgdWludDMyIHBpdGNoOworfSBTVkdBR3Vlc3RJbWFnZTsKKwogLyoKICAqIFNWR0FDb2xvckJHUlggLS0KICAqCkBAIC0zMjgsNyArMzYxLDcgQEAKICAgICAgICAgIHVpbnQzMiBiIDogODsKICAgICAgICAgIHVpbnQzMiBnIDogODsKICAgICAgICAgIHVpbnQzMiByIDogODsKLSAgICAgICAgIHVpbnQzMiB4IDogODsgIC8vIFVudXNlZAorICAgICAgICAgdWludDMyIHggOiA4OyAgLyogVW51c2VkICovCiAgICAgICB9OwogCiAgICAgICB1aW50MzIgdmFsdWU7CkBAIC0zNzAsMjMgKzQwMywzNCBAQAogICogIE5vdGUgdGhlIGhvbGVzIGluIHRoZSBiaXRmaWVsZC4gTWlzc2luZyBiaXRzIGhhdmUgYmVlbiBkZXByZWNhdGVkLAogICogIGFuZCBtdXN0IG5vdCBiZSByZXVzZWQuIFRob3NlIGNhcGFiaWxpdGllcyB3aWxsIG5ldmVyIGJlIHJlcG9ydGVkCiAgKiAgYnkgbmV3IHZlcnNpb25zIG9mIHRoZSBTVkdBIGRldmljZS4KKyAqCisgKiBTVkdBX0NBUF9HTVIyIC0tCisgKiAgICBQcm92aWRlcyBhc3luY2hyb25vdXMgY29tbWFuZHMgdG8gZGVmaW5lIGFuZCByZW1hcCBndWVzdCBtZW1vcnkKKyAqICAgIHJlZ2lvbnMuICBBZGRzIGRldmljZSByZWdpc3RlcnMgU1ZHQV9SRUdfR01SU19NQVhfUEFHRVMgYW5kCisgKiAgICBTVkdBX1JFR19NRU1PUllfU0laRS4KKyAqCisgKiBTVkdBX0NBUF9TQ1JFRU5fT0JKRUNUXzIgLS0KKyAqICAgIEFsbG93IHNjcmVlbiBvYmplY3Qgc3VwcG9ydCwgYW5kIHJlcXVpcmUgYmFja2luZyBzdG9yZXMgZnJvbSB0aGUKKyAqICAgIGd1ZXN0IGZvciBlYWNoIHNjcmVlbiBvYmplY3QuCiAgKi8KIAogI2RlZmluZSBTVkdBX0NBUF9OT05FICAgICAgICAgICAgICAgMHgwMDAwMDAwMAogI2RlZmluZSBTVkdBX0NBUF9SRUNUX0NPUFkgICAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBTVkdBX0NBUF9DVVJTT1IgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBTVkdBX0NBUF9DVVJTT1JfQllQQVNTICAgICAgMHgwMDAwMDA0MCAgIC8vIExlZ2FjeSAoVXNlIEN1cnNvciBCeXBhc3MgMyBpbnN0ZWFkKQotI2RlZmluZSBTVkdBX0NBUF9DVVJTT1JfQllQQVNTXzIgICAgMHgwMDAwMDA4MCAgIC8vIExlZ2FjeSAoVXNlIEN1cnNvciBCeXBhc3MgMyBpbnN0ZWFkKQorI2RlZmluZSBTVkdBX0NBUF9DVVJTT1JfQllQQVNTICAgICAgMHgwMDAwMDA0MCAgIC8qIExlZ2FjeSAoVXNlIEN1cnNvciBCeXBhc3MgMyBpbnN0ZWFkKSAqLworI2RlZmluZSBTVkdBX0NBUF9DVVJTT1JfQllQQVNTXzIgICAgMHgwMDAwMDA4MCAgIC8qIExlZ2FjeSAoVXNlIEN1cnNvciBCeXBhc3MgMyBpbnN0ZWFkKSAqLwogI2RlZmluZSBTVkdBX0NBUF84QklUX0VNVUxBVElPTiAgICAgMHgwMDAwMDEwMAogI2RlZmluZSBTVkdBX0NBUF9BTFBIQV9DVVJTT1IgICAgICAgMHgwMDAwMDIwMAogI2RlZmluZSBTVkdBX0NBUF8zRCAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAogI2RlZmluZSBTVkdBX0NBUF9FWFRFTkRFRF9GSUZPICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBTVkdBX0NBUF9NVUxUSU1PTiAgICAgICAgICAgMHgwMDAxMDAwMCAgIC8vIExlZ2FjeSBtdWx0aS1tb25pdG9yIHN1cHBvcnQKKyNkZWZpbmUgU1ZHQV9DQVBfTVVMVElNT04gICAgICAgICAgIDB4MDAwMTAwMDAgICAvKiBMZWdhY3kgbXVsdGktbW9uaXRvciBzdXBwb3J0ICovCiAjZGVmaW5lIFNWR0FfQ0FQX1BJVENITE9DSyAgICAgICAgICAweDAwMDIwMDAwCiAjZGVmaW5lIFNWR0FfQ0FQX0lSUU1BU0sgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIFNWR0FfQ0FQX0RJU1BMQVlfVE9QT0xPR1kgICAweDAwMDgwMDAwICAgLy8gTGVnYWN5IG11bHRpLW1vbml0b3Igc3VwcG9ydAorI2RlZmluZSBTVkdBX0NBUF9ESVNQTEFZX1RPUE9MT0dZICAgMHgwMDA4MDAwMCAgIC8qIExlZ2FjeSBtdWx0aS1tb25pdG9yIHN1cHBvcnQgKi8KICNkZWZpbmUgU1ZHQV9DQVBfR01SICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKICNkZWZpbmUgU1ZHQV9DQVBfVFJBQ0VTICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgU1ZHQV9DQVBfR01SMiAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgU1ZHQV9DQVBfU0NSRUVOX09CSkVDVF8yICAgIDB4MDA4MDAwMDAKIAogCiAvKgpAQCAtNDMxLDcgKzQ3NSw3IEBACiAKICAgIFNWR0FfRklGT19DQVBBQklMSVRJRVMgPSA0LAogICAgU1ZHQV9GSUZPX0ZMQUdTLAotICAgLy8gVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX0ZFTkNFOgorICAgLyogVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX0ZFTkNFOiAqLwogICAgU1ZHQV9GSUZPX0ZFTkNFLAogCiAgICAvKgpAQCAtNDQ0LDMzICs0ODgsNDcgQEAKICAgICAqIGV4dGVuZGVkIEZJRk8uCiAgICAgKi8KIAotICAgLy8gVmFsaWQgaWYgZXhpc3RzIChpLmUuIGlmIGV4dGVuZGVkIEZJRk8gZW5hYmxlZCk6CisgICAvKiBWYWxpZCBpZiBleGlzdHMgKGkuZS4gaWYgZXh0ZW5kZWQgRklGTyBlbmFibGVkKTogKi8KICAgIFNWR0FfRklGT18zRF9IV1ZFUlNJT04sICAgICAgIC8qIFNlZSBTVkdBM2RIYXJkd2FyZVZlcnNpb24gaW4gc3ZnYTNkX3JlZy5oICovCi0gICAvLyBWYWxpZCB3aXRoIFNWR0FfRklGT19DQVBfUElUQ0hMT0NLOgorICAgLyogVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX1BJVENITE9DSzogKi8KICAgIFNWR0FfRklGT19QSVRDSExPQ0ssCiAKLSAgIC8vIFZhbGlkIHdpdGggU1ZHQV9GSUZPX0NBUF9DVVJTT1JfQllQQVNTXzM6CisgICAvKiBWYWxpZCB3aXRoIFNWR0FfRklGT19DQVBfQ1VSU09SX0JZUEFTU18zOiAqLwogICAgU1ZHQV9GSUZPX0NVUlNPUl9PTiwgICAgICAgICAgLyogQ3Vyc29yIGJ5cGFzcyAzIHNob3cvaGlkZSByZWdpc3RlciAqLwogICAgU1ZHQV9GSUZPX0NVUlNPUl9YLCAgICAgICAgICAgLyogQ3Vyc29yIGJ5cGFzcyAzIHggcmVnaXN0ZXIgKi8KICAgIFNWR0FfRklGT19DVVJTT1JfWSwgICAgICAgICAgIC8qIEN1cnNvciBieXBhc3MgMyB5IHJlZ2lzdGVyICovCiAgICBTVkdBX0ZJRk9fQ1VSU09SX0NPVU5ULCAgICAgICAvKiBJbmNyZW1lbnRlZCB3aGVuIGFueSBvZiB0aGUgb3RoZXIgMyBjaGFuZ2UgKi8KICAgIFNWR0FfRklGT19DVVJTT1JfTEFTVF9VUERBVEVELC8qIExhc3QgdGltZSB0aGUgaG9zdCB1cGRhdGVkIHRoZSBjdXJzb3IgKi8KIAotICAgLy8gVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX1JFU0VSVkU6CisgICAvKiBWYWxpZCB3aXRoIFNWR0FfRklGT19DQVBfUkVTRVJWRTogKi8KICAgIFNWR0FfRklGT19SRVNFUlZFRCwgICAgICAgICAgIC8qIEJ5dGVzIHBhc3QgTkVYVF9DTUQgd2l0aCByZWFsIGNvbnRlbnRzICovCiAKICAgIC8qCi0gICAgKiBWYWxpZCB3aXRoIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVDoKKyAgICAqIFZhbGlkIHdpdGggU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUIG9yIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVF8yOgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQgdGhpcyBpcyBTVkdBX0lEX0lOVkFMSUQsIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnNvcgogICAgICogY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCByb290LiBJZiB0aGlzCiAgICAgKiBpcyBzZXQgdG8gYSBzcGVjaWZpYyBzY3JlZW4gSUQsIGN1cnNvciBwb3NpdGlvbiBpcyByZWludGVycHJldGVkCi0gICAgKiBhcyBhIHNpZ25lZCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhhdCBzY3JlZW4ncyBvcmlnaW4uIFRoaXMgaXMgdGhlCi0gICAgKiBvbmx5IHdheSB0byBwbGFjZSB0aGUgY3Vyc29yIG9uIGEgbm9uLXJvb3RlZCBzY3JlZW4uCisgICAgKiBhcyBhIHNpZ25lZCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhhdCBzY3JlZW4ncyBvcmlnaW4uCiAgICAgKi8KICAgIFNWR0FfRklGT19DVVJTT1JfU0NSRUVOX0lELAogCiAgICAvKgorICAgICogVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX0RFQUQKKyAgICAqCisgICAgKiBBbiBhcmJpdHJhcnkgdmFsdWUgd3JpdHRlbiBieSB0aGUgaG9zdCwgZHJpdmVycyBzaG91bGQgbm90IHVzZSBpdC4KKyAgICAqLworICAgU1ZHQV9GSUZPX0RFQUQsCisKKyAgIC8qCisgICAgKiBWYWxpZCB3aXRoIFNWR0FfRklGT19DQVBfM0RfSFdWRVJTSU9OX1JFVklTRUQ6CisgICAgKgorICAgICogQ29udGFpbnMgM0QgSFdWRVJTSU9OIChzZWUgU1ZHQTNkSGFyZHdhcmVWZXJzaW9uIGluIHN2Z2EzZF9yZWcuaCkKKyAgICAqIG9uIHBsYXRmb3JtcyB0aGF0IGNhbiBlbmZvcmNlIGdyYXBoaWNzIHJlc291cmNlIGxpbWl0cy4KKyAgICAqLworICAgU1ZHQV9GSUZPXzNEX0hXVkVSU0lPTl9SRVZJU0VELAorCisgICAvKgogICAgICogWFhYOiBUaGUgZ2FwIGhlcmUsIHVwIHVudGlsIFNWR0FfRklGT18zRF9DQVBTLCBjYW4gYmUgdXNlZCBmb3IgbmV3CiAgICAgKiByZWdpc3RlcnMsIGJ1dCB0aGlzIG11c3QgYmUgZG9uZSBjYXJlZnVsbHkgYW5kIHdpdGgganVkaWNpb3VzIHVzZSBvZgogICAgICogY2FwYWJpbGl0eSBiaXRzLCBzaW5jZSBjb21wYXJpc29ucyBiYXNlZCBvbiBTVkdBX0ZJRk9fTUlOIGFyZW4ndApAQCAtNTA4LDcgKzU2Niw3IEBACiAgICAgKiBzZXRzIFNWR0FfRklGT19NSU4gaGlnaCBlbm91Z2ggdG8gbGVhdmUgcm9vbSBmb3IgdGhlbS4KICAgICAqLwogCi0gICAvLyBWYWxpZCBpZiByZWdpc3RlciBleGlzdHM6CisgICAvKiBWYWxpZCBpZiByZWdpc3RlciBleGlzdHM6ICovCiAgICBTVkdBX0ZJRk9fR1VFU1RfM0RfSFdWRVJTSU9OLCAvKiBHdWVzdCBkcml2ZXIncyAzRCB2ZXJzaW9uICovCiAgICBTVkdBX0ZJRk9fRkVOQ0VfR09BTCwgICAgICAgICAvKiBNYXRjaGluZyB0YXJnZXQgZm9yIFNWR0FfSVJRRkxBR19GRU5DRV9HT0FMICovCiAgICBTVkdBX0ZJRk9fQlVTWSwgICAgICAgICAgICAgICAvKiBTZWUgIkZJRk8gU3luY2hyb25pemF0aW9uIFJlZ2lzdGVycyIgKi8KQEAgLTcwOSw2ICs3NjcsMzcgQEAKICAqCiAgKiAgICAgICAtIFdoZW4gYSBzY3JlZW4gaXMgcmVzaXplZCwgZWl0aGVyIHVzaW5nIFNjcmVlbiBPYmplY3QgY29tbWFuZHMgb3IKICAqICAgICAgICAgbGVnYWN5IG11bHRpbW9uIHJlZ2lzdGVycywgaXRzIGNvbnRlbnRzIGFyZSBwcmVzZXJ2ZWQuCisgKgorICogU1ZHQV9GSUZPX0NBUF9HTVIyIC0tCisgKgorICogICAgUHJvdmlkZXMgbmV3IGNvbW1hbmRzIHRvIGRlZmluZSBhbmQgcmVtYXAgZ3Vlc3QgbWVtb3J5IHJlZ2lvbnMgKEdNUikuCisgKgorICogICAgTmV3IDJEIGNvbW1hbmRzOgorICogICAgICAgREVGSU5FX0dNUjIsIFJFTUFQX0dNUjIuCisgKgorICogU1ZHQV9GSUZPX0NBUF8zRF9IV1ZFUlNJT05fUkVWSVNFRCAtLQorICoKKyAqICAgIEluZGljYXRlcyBuZXcgcmVnaXN0ZXIgU1ZHQV9GSUZPXzNEX0hXVkVSU0lPTl9SRVZJU0VEIGV4aXN0cy4KKyAqICAgIFRoaXMgcmVnaXN0ZXIgbWF5IHJlcGxhY2UgU1ZHQV9GSUZPXzNEX0hXVkVSU0lPTiBvbiBwbGF0Zm9ybXMKKyAqICAgIHRoYXQgZW5mb3JjZSBncmFwaGljcyByZXNvdXJjZSBsaW1pdHMuICBUaGlzIGFsbG93cyB0aGUgcGxhdGZvcm0KKyAqICAgIHRvIGNsZWFyIFNWR0FfRklGT18zRF9IV1ZFUlNJT04gYW5kIGRpc2FibGUgM0QgaW4gbGVnYWN5IGd1ZXN0CisgKiAgICBkcml2ZXJzIHRoYXQgZG8gbm90IGxpbWl0IHRoZWlyIHJlc291cmNlcy4KKyAqCisgKiAgICBOb3RlIHRoaXMgaXMgYW4gYWxpYXMgdG8gU1ZHQV9GSUZPX0NBUF9HTVIyIGJlY2F1c2UgdGhlc2UgaW5kaWNhdG9ycworICogICAgYXJlIGNvZGVwZW5kZW50IChhbmQgdGh1cyB3ZSB1c2UgYSBzaW5nbGUgY2FwYWJpbGl0eSBiaXQpLgorICoKKyAqIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVF8yIC0tCisgKgorICogICAgTW9kaWZpZXMgdGhlIERFRklORV9TQ1JFRU4gY29tbWFuZCB0byBpbmNsdWRlIGEgZ3Vlc3QgcHJvdmlkZWQKKyAqICAgIGJhY2tpbmcgc3RvcmUgaW4gR01SIG1lbW9yeSBhbmQgdGhlIGJ5dGVzUGVyTGluZSBmb3IgdGhlIGJhY2tpbmcKKyAqICAgIHN0b3JlLiAgVGhpcyBjYXBhYmlsaXR5IHJlcXVpcmVzIHRoZSB1c2Ugb2YgYSBiYWNraW5nIHN0b3JlIHdoZW4KKyAqICAgIGNyZWF0aW5nIHNjcmVlbiBvYmplY3RzLiAgSG93ZXZlciBpZiBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QKKyAqICAgIGlzIHByZXNlbnQgdGhlbiBiYWNraW5nIHN0b3JlcyBhcmUgb3B0aW9uYWwuCisgKgorICogU1ZHQV9GSUZPX0NBUF9ERUFEIC0tCisgKgorICogICAgRHJpdmVycyBzaG91bGQgbm90IHVzZSB0aGlzIGNhcCBiaXQuICBUaGlzIGNhcCBiaXQgY2FuIG5vdCBiZQorICogICAgcmV1c2VkIHNpbmNlIHNvbWUgaG9zdHMgYWxyZWFkeSBleHBvc2UgaXQuCiAgKi8KIAogI2RlZmluZSBTVkdBX0ZJRk9fQ0FQX05PTkUgICAgICAgICAgICAgICAgICAwCkBAIC03MjAsNiArODA5LDEwIEBACiAjZGVmaW5lIFNWR0FfRklGT19DQVBfRVNDQVBFICAgICAgICAgICAgKDE8PDUpCiAjZGVmaW5lIFNWR0FfRklGT19DQVBfUkVTRVJWRSAgICAgICAgICAgKDE8PDYpCiAjZGVmaW5lIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVCAgICAgKDE8PDcpCisjZGVmaW5lIFNWR0FfRklGT19DQVBfR01SMiAgICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIFNWR0FfRklGT19DQVBfM0RfSFdWRVJTSU9OX1JFVklTRUQgIFNWR0FfRklGT19DQVBfR01SMgorI2RlZmluZSBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMiAgICgxPDw5KQorI2RlZmluZSBTVkdBX0ZJRk9fQ0FQX0RFQUQgICAgICAgICAgICAgICgxPDwxMCkKIAogCiAvKgpAQCAtNzMwLDcgKzgyMyw3IEBACiAKICNkZWZpbmUgU1ZHQV9GSUZPX0ZMQUdfTk9ORSAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBTVkdBX0ZJRk9fRkxBR19BQ0NFTEZST05UICAgICAgICgxPDwwKQotI2RlZmluZSBTVkdBX0ZJRk9fRkxBR19SRVNFUlZFRCAgICAgICAgKDE8PDMxKSAvLyBJbnRlcm5hbCB1c2Ugb25seQorI2RlZmluZSBTVkdBX0ZJRk9fRkxBR19SRVNFUlZFRCAgICAgICAgKDE8PDMxKSAvKiBJbnRlcm5hbCB1c2Ugb25seSAqLwogCiAvKgogICogRklGTyByZXNlcnZhdGlvbiBzZW50aW5lbCB2YWx1ZQpAQCAtNzYzLDIyICs4NTYsMjIgQEAKICAgIFNWR0FfVklERU9fREFUQV9PRkZTRVQsCiAgICBTVkdBX1ZJREVPX0ZPUk1BVCwKICAgIFNWR0FfVklERU9fQ09MT1JLRVksCi0gICBTVkdBX1ZJREVPX1NJWkUsICAgICAgICAgIC8vIERlcHJlY2F0ZWQKKyAgIFNWR0FfVklERU9fU0laRSwgICAgICAgICAgLyogRGVwcmVjYXRlZCAqLwogICAgU1ZHQV9WSURFT19XSURUSCwKICAgIFNWR0FfVklERU9fSEVJR0hULAogICAgU1ZHQV9WSURFT19TUkNfWCwKICAgIFNWR0FfVklERU9fU1JDX1ksCiAgICBTVkdBX1ZJREVPX1NSQ19XSURUSCwKICAgIFNWR0FfVklERU9fU1JDX0hFSUdIVCwKLSAgIFNWR0FfVklERU9fRFNUX1gsICAgICAgICAgLy8gU2lnbmVkIGludDMyCi0gICBTVkdBX1ZJREVPX0RTVF9ZLCAgICAgICAgIC8vIFNpZ25lZCBpbnQzMgorICAgU1ZHQV9WSURFT19EU1RfWCwgICAgICAgICAvKiBTaWduZWQgaW50MzIgKi8KKyAgIFNWR0FfVklERU9fRFNUX1ksICAgICAgICAgLyogU2lnbmVkIGludDMyICovCiAgICBTVkdBX1ZJREVPX0RTVF9XSURUSCwKICAgIFNWR0FfVklERU9fRFNUX0hFSUdIVCwKICAgIFNWR0FfVklERU9fUElUQ0hfMSwKICAgIFNWR0FfVklERU9fUElUQ0hfMiwKICAgIFNWR0FfVklERU9fUElUQ0hfMywKLSAgIFNWR0FfVklERU9fREFUQV9HTVJJRCwgICAgLy8gT3B0aW9uYWwsIGRlZmF1bHRzIHRvIFNWR0FfR01SX0ZSQU1FQlVGRkVSCi0gICBTVkdBX1ZJREVPX0RTVF9TQ1JFRU5fSUQsIC8vIE9wdGlvbmFsLCBkZWZhdWx0cyB0byB2aXJ0dWFsIGNvb3JkcyAoU1ZHQV9JRF9JTlZBTElEKQorICAgU1ZHQV9WSURFT19EQVRBX0dNUklELCAgICAvKiBPcHRpb25hbCwgZGVmYXVsdHMgdG8gU1ZHQV9HTVJfRlJBTUVCVUZGRVIgKi8KKyAgIFNWR0FfVklERU9fRFNUX1NDUkVFTl9JRCwgLyogT3B0aW9uYWwsIGRlZmF1bHRzIHRvIHZpcnR1YWwgY29vcmRzIChTVkdBX0lEX0lOVkFMSUQpICovCiAgICBTVkdBX1ZJREVPX05VTV9SRUdTCiB9OwogCkBAIC04MjksMTUgKzkyMiw1MSBAQAogICogICAgY29tcGF0aWJpbGl0eS4gTmV3IGZsYWdzIGNhbiBiZSBhZGRlZCwgYW5kIHRoZSBzdHJ1Y3QgbWF5IGdyb3csCiAgKiAgICBidXQgZXhpc3RpbmcgZmllbGRzIG11c3QgcmV0YWluIHRoZWlyIG1lYW5pbmcuCiAgKgorICogICAgQWRkZWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMiBhcmUgcmVxdWlyZWQgZmllbGRzIG9mCisgKiAgICBhIFNWR0FHdWVzdFB0ciB0aGF0IGlzIHVzZWQgdG8gYmFjayB0aGUgc2NyZWVuIGNvbnRlbnRzLiAgVGhpcworICogICAgbWVtb3J5IG11c3QgY29tZSBmcm9tIHRoZSBHRkIuICBUaGUgZ3Vlc3QgaXMgbm90IGFsbG93ZWQgdG8KKyAqICAgIGFjY2VzcyB0aGUgbWVtb3J5IGFuZCBkb2luZyBzbyB3aWxsIGhhdmUgdW5kZWZpbmVkIHJlc3VsdHMuICBUaGUKKyAqICAgIGJhY2tpbmcgc3RvcmUgaXMgcmVxdWlyZWQgdG8gYmUgcGFnZSBhbGlnbmVkIGFuZCB0aGUgc2l6ZSBpcworICogICAgcGFkZGVkIHRvIHRoZSBuZXh0IHBhZ2UgYm91bmRyeS4gIFRoZSBudW1iZXIgb2YgcGFnZXMgaXM6CisgKiAgICAgICAoYnl0ZXNQZXJMaW5lICogc2l6ZS53aWR0aCAqIDQgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRQorICoKKyAqICAgIFRoZSBwaXRjaCBpbiB0aGUgYmFja2luZ1N0b3JlIGlzIHJlcXVpcmVkIHRvIGJlIGF0IGxlYXN0IGxhcmdlCisgKiAgICBlbm91Z2ggdG8gaG9sZCBhIDMyYmJwIHNjYW5saW5lLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUKKyAqICAgIGRyaXZlciBwYWQgYnl0ZXNQZXJMaW5lIGZvciBhIHBvdGVudGlhbCBwZXJmb3JtYW5jZSB3aW4uCisgKgorICogICAgVGhlIGNsb25lQ291bnQgZmllbGQgaXMgdHJlYXRlZCBhcyBhIGhpbnQgZnJvbSB0aGUgZ3Vlc3QgdGhhdAorICogICAgdGhlIHVzZXIgd2FudHMgdGhpcyBkaXNwbGF5IHRvIGJlIGNsb25lZCwgY291bnRDb3VudCB0aW1lcy4gIEEKKyAqICAgIHZhbHVlIG9mIHplcm8gbWVhbnMgbm8gY2xvbmluZyBzaG91bGQgaGFwcGVuLgogICovCiAKLSNkZWZpbmUgU1ZHQV9TQ1JFRU5fSEFTX1JPT1QgICAgKDEgPDwgMCkgIC8vIFNjcmVlbiBpcyBwcmVzZW50IGluIHRoZSB2aXJ0dWFsIGNvb3JkIHNwYWNlCi0jZGVmaW5lIFNWR0FfU0NSRUVOX0lTX1BSSU1BUlkgICgxIDw8IDEpICAvLyBHdWVzdCBjb25zaWRlcnMgdGhpcyBzY3JlZW4gdG8gYmUgJ3ByaW1hcnknCi0jZGVmaW5lIFNWR0FfU0NSRUVOX0ZVTExTQ1JFRU5fSElOVCAoMSA8PCAyKSAgIC8vIEd1ZXN0IGlzIHJ1bm5pbmcgYSBmdWxsc2NyZWVuIGFwcCBoZXJlCisjZGVmaW5lIFNWR0FfU0NSRUVOX01VU1RfQkVfU0VUICAgICAoMSA8PCAwKSAvKiBNdXN0IGJlIHNldCBvciByZXN1bHRzIHVuZGVmaW5lZCAqLworI2RlZmluZSBTVkdBX1NDUkVFTl9IQVNfUk9PVCBTVkdBX1NDUkVFTl9NVVNUX0JFX1NFVCAvKiBEZXByZWNhdGVkICovCisjZGVmaW5lIFNWR0FfU0NSRUVOX0lTX1BSSU1BUlkgICAgICAoMSA8PCAxKSAvKiBHdWVzdCBjb25zaWRlcnMgdGhpcyBzY3JlZW4gdG8gYmUgJ3ByaW1hcnknICovCisjZGVmaW5lIFNWR0FfU0NSRUVOX0ZVTExTQ1JFRU5fSElOVCAoMSA8PCAyKSAvKiBHdWVzdCBpcyBydW5uaW5nIGEgZnVsbHNjcmVlbiBhcHAgaGVyZSAqLworCisvKgorICogQWRkZWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMi4gIFdoZW4gdGhlIHNjcmVlbiBpcworICogZGVhY3RpdmF0ZWQgdGhlIGJhc2UgbGF5ZXIgaXMgZGVmaW5lZCB0byBsb3NlIGFsbCBjb250ZW50cyBhbmQKKyAqIGJlY29tZSBibGFjay4gIFdoZW4gYSBzY3JlZW4gaXMgZGVhY3RpdmF0ZWQgdGhlIGJhY2tpbmcgc3RvcmUgaXMKKyAqIG9wdGlvbmFsLiAgV2hlbiBzZXQgYmFja2luZ1B0ciBhbmQgYnl0ZXNQZXJMaW5lIHdpbGwgYmUgaWdub3JlZC4KKyAqLworI2RlZmluZSBTVkdBX1NDUkVFTl9ERUFDVElWQVRFICAoMSA8PCAzKQorCisvKgorICogQWRkZWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMi4gIFdoZW4gdGhpcyBmbGFnIGlzIHNldAorICogdGhlIHNjcmVlbiBjb250ZW50cyB3aWxsIGJlIG91dHB1dHRlZCBhcyBhbGwgYmxhY2sgdG8gdGhlIHVzZXIKKyAqIHRob3VnaCB0aGUgYmFzZSBsYXllciBjb250ZW50cyBpcyBwcmVzZXJ2ZWQuICBUaGUgc2NyZWVuIGJhc2UgbGF5ZXIKKyAqIGNhbiBzdGlsbCBiZSByZWFkIGFuZCB3cml0dGVuIHRvIGxpa2Ugbm9ybWFsIHRob3VnaCB0aGUgbm8gdmlzaWJsZQorICogZWZmZWN0IHdpbGwgYmUgc2VlbiBieSB0aGUgdXNlci4gIFdoZW4gdGhlIGZsYWcgaXMgY2hhbmdlZCB0aGUKKyAqIHNjcmVlbiB3aWxsIGJlIGJsYW5rZWQgb3IgcmVkcmF3biB0byB0aGUgY3VycmVudCBjb250ZW50cyBhcyBuZWVkZWQKKyAqIHdpdGhvdXQgYW55IGV4dHJhIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlci4gIFRoaXMgZmxhZyBvbmx5IGhhcyBhbgorICogZWZmZWN0IHdoZW4gdGhlIHNjcmVlbiBpcyBub3QgZGVhY3RpdmF0ZWQuCisgKi8KKyNkZWZpbmUgU1ZHQV9TQ1JFRU5fQkxBTktJTkcgKDEgPDwgNCkKIAogdHlwZWRlZgogc3RydWN0IFNWR0FTY3JlZW5PYmplY3QgewotICAgdWludDMyIHN0cnVjdFNpemU7ICAgLy8gc2l6ZW9mKFNWR0FTY3JlZW5PYmplY3QpCisgICB1aW50MzIgc3RydWN0U2l6ZTsgICAvKiBzaXplb2YoU1ZHQVNjcmVlbk9iamVjdCkgKi8KICAgIHVpbnQzMiBpZDsKICAgIHVpbnQzMiBmbGFnczsKICAgIHN0cnVjdCB7CkBAIC04NDcsNyArOTc2LDE0IEBACiAgICBzdHJ1Y3QgewogICAgICAgaW50MzIgeDsKICAgICAgIGludDMyIHk7Ci0gICB9IHJvb3Q7ICAgICAgICAgICAgICAvLyBPbmx5IHVzZWQgaWYgU1ZHQV9TQ1JFRU5fSEFTX1JPT1QgaXMgc2V0LgorICAgfSByb290OworCisgICAvKgorICAgICogQWRkZWQgYW5kIHJlcXVpcmVkIGJ5IFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVF8yLCBvcHRpb25hbAorICAgICogd2l0aCBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QuCisgICAgKi8KKyAgIFNWR0FHdWVzdEltYWdlIGJhY2tpbmdTdG9yZTsKKyAgIHVpbnQzMiBjbG9uZUNvdW50OwogfSBTVkdBU2NyZWVuT2JqZWN0OwogCiAKQEAgLTg4NSw2ICsxMDIxLDggQEAKICAgIFNWR0FfQ01EX0JMSVRfU0NSRUVOX1RPX0dNUkZCICA9IDM4LAogICAgU1ZHQV9DTURfQU5OT1RBVElPTl9GSUxMICAgICAgID0gMzksCiAgICBTVkdBX0NNRF9BTk5PVEFUSU9OX0NPUFkgICAgICAgPSA0MCwKKyAgIFNWR0FfQ01EX0RFRklORV9HTVIyICAgICAgICAgICA9IDQxLAorICAgU1ZHQV9DTURfUkVNQVBfR01SMiAgICAgICAgICAgID0gNDIsCiAgICBTVkdBX0NNRF9NQVgKIH0gU1ZHQUZpZm9DbWRJZDsKIApAQCAtOTIwLDcgKzEwNTgsNyBAQAogICovCiAKIHR5cGVkZWYKLXN0cnVjdCB7CitzdHJ1Y3QgU1ZHQUZpZm9DbWRVcGRhdGUgewogICAgdWludDMyIHg7CiAgICB1aW50MzIgeTsKICAgIHVpbnQzMiB3aWR0aDsKQEAgLTkzOSw3ICsxMDc3LDcgQEAKICAqLwogCiB0eXBlZGVmCi1zdHJ1Y3Qgeworc3RydWN0IFNWR0FGaWZvQ21kUmVjdENvcHkgewogICAgdWludDMyIHNyY1g7CiAgICB1aW50MzIgc3JjWTsKICAgIHVpbnQzMiBkZXN0WDsKQEAgLTk2MywxNCArMTEwMSwxNCBAQAogICovCiAKIHR5cGVkZWYKLXN0cnVjdCB7Ci0gICB1aW50MzIgaWQ7ICAgICAgICAgICAgIC8vIFJlc2VydmVkLCBtdXN0IGJlIHplcm8uCitzdHJ1Y3QgU1ZHQUZpZm9DbWREZWZpbmVDdXJzb3IgeworICAgdWludDMyIGlkOyAgICAgICAgICAgICAvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvLiAqLwogICAgdWludDMyIGhvdHNwb3RYOwogICAgdWludDMyIGhvdHNwb3RZOwogICAgdWludDMyIHdpZHRoOwogICAgdWludDMyIGhlaWdodDsKLSAgIHVpbnQzMiBhbmRNYXNrRGVwdGg7ICAgLy8gVmFsdWUgbXVzdCBiZSAxIG9yIGVxdWFsIHRvIEJJVFNfUEVSX1BJWEVMCi0gICB1aW50MzIgeG9yTWFza0RlcHRoOyAgIC8vIFZhbHVlIG11c3QgYmUgMSBvciBlcXVhbCB0byBCSVRTX1BFUl9QSVhFTAorICAgdWludDMyIGFuZE1hc2tEZXB0aDsgICAvKiBWYWx1ZSBtdXN0IGJlIDEgb3IgZXF1YWwgdG8gQklUU19QRVJfUElYRUwgKi8KKyAgIHVpbnQzMiB4b3JNYXNrRGVwdGg7ICAgLyogVmFsdWUgbXVzdCBiZSAxIG9yIGVxdWFsIHRvIEJJVFNfUEVSX1BJWEVMICovCiAgICAvKgogICAgICogRm9sbG93ZWQgYnkgc2NhbmxpbmUgZGF0YSBmb3IgQU5EIG1hc2ssIHRoZW4gWE9SIG1hc2suCiAgICAgKiBFYWNoIHNjYW5saW5lIGlzIHBhZGRlZCB0byBhIDMyLWJpdCBib3VuZGFyeS4KQEAgLTk5Miw4ICsxMTMwLDggQEAKICAqLwogCiB0eXBlZGVmCi1zdHJ1Y3QgewotICAgdWludDMyIGlkOyAgICAgICAgICAgICAvLyBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvLgorc3RydWN0IFNWR0FGaWZvQ21kRGVmaW5lQWxwaGFDdXJzb3IgeworICAgdWludDMyIGlkOyAgICAgICAgICAgICAvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvLiAqLwogICAgdWludDMyIGhvdHNwb3RYOwogICAgdWludDMyIGhvdHNwb3RZOwogICAgdWludDMyIHdpZHRoOwpAQCAtMTAxNSw3ICsxMTUzLDcgQEAKICAqLwogCiB0eXBlZGVmCi1zdHJ1Y3Qgeworc3RydWN0IFNWR0FGaWZvQ21kVXBkYXRlVmVyYm9zZSB7CiAgICB1aW50MzIgeDsKICAgIHVpbnQzMiB5OwogICAgdWludDMyIHdpZHRoOwpAQCAtMTA0MCwxMyArMTE3OCwxMyBAQAogI2RlZmluZSAgU1ZHQV9ST1BfQ09QWSAgICAgICAgICAgICAgICAgICAgMHgwMwogCiB0eXBlZGVmCi1zdHJ1Y3QgewotICAgdWludDMyIGNvbG9yOyAgICAgLy8gSW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBHRkIKK3N0cnVjdCBTVkdBRmlmb0NtZEZyb250Um9wRmlsbCB7CisgICB1aW50MzIgY29sb3I7ICAgICAvKiBJbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIEdGQiAqLwogICAgdWludDMyIHg7CiAgICB1aW50MzIgeTsKICAgIHVpbnQzMiB3aWR0aDsKICAgIHVpbnQzMiBoZWlnaHQ7Ci0gICB1aW50MzIgcm9wOyAgICAgICAvLyBNdXN0IGJlIFNWR0FfUk9QX0NPUFkKKyAgIHVpbnQzMiByb3A7ICAgICAgIC8qIE11c3QgYmUgU1ZHQV9ST1BfQ09QWSAqLwogfSBTVkdBRmlmb0NtZEZyb250Um9wRmlsbDsKIAogCkBAIC0xMDgzLDcgKzEyMjEsNyBAQAogICovCiAKIHR5cGVkZWYKLXN0cnVjdCB7CitzdHJ1Y3QgU1ZHQUZpZm9DbWRFc2NhcGUgewogICAgdWludDMyIG5zaWQ7CiAgICB1aW50MzIgc2l6ZTsKICAgIC8qIGZvbGxvd2VkIGJ5ICdzaXplJyBieXRlcyBvZiBkYXRhICovCkBAIC0xMTEzLDEyICsxMjUxLDEyIEBACiAgKiAgICByZWdpc3RlcnMgKFNWR0FfUkVHX05VTV9HVUVTVF9ESVNQTEFZUywgU1ZHQV9SRUdfRElTUExBWV8qKS4KICAqCiAgKiBBdmFpbGFiaWxpdHk6Ci0gKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QKKyAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVCBvciBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMgogICovCiAKIHR5cGVkZWYKIHN0cnVjdCB7Ci0gICBTVkdBU2NyZWVuT2JqZWN0IHNjcmVlbjsgICAvLyBWYXJpYWJsZS1sZW5ndGggYWNjb3JkaW5nIHRvIHZlcnNpb24KKyAgIFNWR0FTY3JlZW5PYmplY3Qgc2NyZWVuOyAgIC8qIFZhcmlhYmxlLWxlbmd0aCBhY2NvcmRpbmcgdG8gdmVyc2lvbiAqLwogfSBTVkdBRmlmb0NtZERlZmluZVNjcmVlbjsKIAogCkBAIC0xMTI5LDcgKzEyNjcsNyBAQAogICogICAgcmUtdXNlLgogICoKICAqIEF2YWlsYWJpbGl0eToKLSAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVAorICogICAgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUIG9yIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVF8yCiAgKi8KIAogdHlwZWRlZgpAQCAtMTE4Miw3ICsxMzIwLDcgQEAKICAqICAgIEdNUkZCLgogICoKICAqIEF2YWlsYWJpbGl0eToKLSAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVAorICogICAgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUIG9yIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVF8yCiAgKi8KIAogdHlwZWRlZgpAQCAtMTIxOSw3ICsxMzU3LDcgQEAKICAqICAgIFNWR0FfQ01EX0FOTk9UQVRJT05fKiBjb21tYW5kcyBmb3IgZGV0YWlscy4KICAqCiAgKiBBdmFpbGFiaWxpdHk6Ci0gKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QKKyAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVCBvciBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMgogICovCiAKIHR5cGVkZWYKQEAgLTEyNjcsNyArMTQwNSw3IEBACiAgKiAgICB0aGUgdGltZSBhbnkgc3Vic2VxdWVudCBGRU5DRSBjb21tYW5kcyBhcmUgcmVhY2hlZC4KICAqCiAgKiBBdmFpbGFiaWxpdHk6Ci0gKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QKKyAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVCBvciBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMgogICovCiAKIHR5cGVkZWYKQEAgLTEzMDIsNyArMTQ0MCw3IEBACiAgKiAgICB1c2VyJ3MgZGlzcGxheSBpcyBiZWluZyByZW1vdGVkIG92ZXIgYSBuZXR3b3JrIGNvbm5lY3Rpb24uCiAgKgogICogQXZhaWxhYmlsaXR5OgotICogICAgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUCisgKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1Qgb3IgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUXzIKICAqLwogCiB0eXBlZGVmCkBAIC0xMzM0LDcgKzE0NzIsNyBAQAogICogICAgdW5kZWZpbmVkLgogICoKICAqIEF2YWlsYWJpbGl0eToKLSAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVAorICogICAgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUIG9yIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVF8yCiAgKi8KIAogdHlwZWRlZgpAQCAtMTM0Myw0ICsxNDgxLDcyIEBACiAgICB1aW50MzIgICAgICAgICAgIHNyY1NjcmVlbklkOwogfSBTVkdBRmlmb0NtZEFubm90YXRpb25Db3B5OwogCisKKy8qCisgKiBTVkdBX0NNRF9ERUZJTkVfR01SMiAtLQorICoKKyAqICAgIERlZmluZSBndWVzdCBtZW1vcnkgcmVnaW9uIHYyLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBHTVJzIGFib3ZlLgorICoKKyAqIEF2YWlsYWJpbGl0eToKKyAqICAgIFNWR0FfQ0FQX0dNUjIKKyAqLworCit0eXBlZGVmCitzdHJ1Y3QgeworICAgdWludDMyIGdtcklkOworICAgdWludDMyIG51bVBhZ2VzOworfSBTVkdBRmlmb0NtZERlZmluZUdNUjI7CisKKworLyoKKyAqIFNWR0FfQ01EX1JFTUFQX0dNUjIgLS0KKyAqCisgKiAgICBSZW1hcCBndWVzdCBtZW1vcnkgcmVnaW9uIHYyLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBHTVJzIGFib3ZlLgorICoKKyAqICAgIFRoaXMgY29tbWFuZCBhbGxvd3MgZ3Vlc3QgdG8gbW9kaWZ5IGEgcG9ydGlvbiBvZiBhbiBleGlzdGluZyBHTVIgYnkKKyAqICAgIGludmFsaWRhdGluZyBpdCBvciByZWFzc2lnbmluZyBpdCB0byBkaWZmZXJlbnQgZ3Vlc3QgcGh5c2ljYWwgcGFnZXMuCisgKiAgICBUaGUgcGFnZXMgYXJlIGlkZW50aWZpZWQgYnkgcGh5c2ljYWwgcGFnZSBudW1iZXIgKFBQTikuICBUaGUgcGFnZXMKKyAqICAgIGFyZSBhc3N1bWVkIHRvIGJlIHBpbm5lZCBhbmQgdmFsaWQgZm9yIERNQSBvcGVyYXRpb25zLgorICoKKyAqICAgIERlc2NyaXB0aW9uIG9mIGNvbW1hbmQgZmxhZ3M6CisgKgorICogICAgU1ZHQV9SRU1BUF9HTVIyX1ZJQV9HTVI6IElmIGVuYWJsZWQsIHJlZmVyZW5jZXMgYSBQUE4gbGlzdCBpbiBhIEdNUi4KKyAqICAgICAgIFRoZSBQUE4gbGlzdCBtdXN0IG5vdCBvdmVybGFwIHdpdGggdGhlIHJlbWFwIHJlZ2lvbiAodGhpcyBjYW4gYmUKKyAqICAgICAgIGhhbmRsZWQgdHJpdmlhbGx5IGJ5IHJlZmVyZW5jaW5nIGEgc2VwYXJhdGUgR01SKS4gIElmIGZsYWcgaXMKKyAqICAgICAgIGRpc2FibGVkLCBQUE4gbGlzdCBpcyBhcHBlbmRlZCB0byBTVkdBUmVtYXBHTVIgY29tbWFuZC4KKyAqCisgKiAgICBTVkdBX1JFTUFQX0dNUjJfUFBONjQ6IElmIHNldCwgUFBOIGxpc3QgaXMgaW4gUFBONjQgZm9ybWF0LCBvdGhlcndpc2UKKyAqICAgICAgIGl0IGlzIGluIFBQTjMyIGZvcm1hdC4KKyAqCisgKiAgICBTVkdBX1JFTUFQX0dNUjJfU0lOR0xFX1BQTjogSWYgc2V0LCBQUE4gbGlzdCBjb250YWlucyBhIHNpbmdsZSBlbnRyeS4KKyAqICAgICAgIEEgc2luZ2xlIFBQTiBjYW4gYmUgdXNlZCB0byBpbnZhbGlkYXRlIGEgcG9ydGlvbiBvZiBhIEdNUiBvcgorICogICAgICAgbWFwIGl0IHRvIHRvIGEgc2luZ2xlIGd1ZXN0IHNjcmF0Y2ggcGFnZS4KKyAqCisgKiBBdmFpbGFiaWxpdHk6CisgKiAgICBTVkdBX0NBUF9HTVIyCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgIFNWR0FfUkVNQVBfR01SMl9QUE4zMiAgICAgICAgID0gMCwKKyAgIFNWR0FfUkVNQVBfR01SMl9WSUFfR01SICAgICAgID0gKDEgPDwgMCksCisgICBTVkdBX1JFTUFQX0dNUjJfUFBONjQgICAgICAgICA9ICgxIDw8IDEpLAorICAgU1ZHQV9SRU1BUF9HTVIyX1NJTkdMRV9QUE4gICAgPSAoMSA8PCAyKSwKK30gU1ZHQVJlbWFwR01SMkZsYWdzOworCit0eXBlZGVmCitzdHJ1Y3QgeworICAgdWludDMyIGdtcklkOworICAgU1ZHQVJlbWFwR01SMkZsYWdzIGZsYWdzOworICAgdWludDMyIG9mZnNldFBhZ2VzOyAvKiBvZmZzZXQgaW4gcGFnZXMgdG8gYmVnaW4gcmVtYXAgKi8KKyAgIHVpbnQzMiBudW1QYWdlczsgLyogbnVtYmVyIG9mIHBhZ2VzIHRvIHJlbWFwICovCisgICAvKgorICAgICogRm9sbG93ZWQgYnkgYWRkaXRpb25hbCBkYXRhIGRlcGVuZGluZyBvbiBTVkdBUmVtYXBHTVIyRmxhZ3MuCisgICAgKgorICAgICogSWYgZmxhZyBTVkdBX1JFTUFQX0dNUjJfVklBX0dNUiBpcyBzZXQsIHNpbmdsZSBTVkdBR3Vlc3RQdHIgZm9sbG93cy4KKyAgICAqIE90aGVyd2lzZSBhbiBhcnJheSBvZiBwYWdlIGRlc2NyaXB0b3JzIGluIFBQTjMyIG9yIFBQTjY0IGZvcm1hdAorICAgICogKGFjY29yZGluZyB0byBmbGFnIFNWR0FfUkVNQVBfR01SMl9QUE42NCkgZm9sbG93cy4gIElmIGZsYWcKKyAgICAqIFNWR0FfUkVNQVBfR01SMl9TSU5HTEVfUFBOIGlzIHNldCwgYXJyYXkgY29udGFpbnMgYSBzaW5nbGUgZW50cnkuCisgICAgKi8KK30gU1ZHQUZpZm9DbWRSZW1hcEdNUjI7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9idWZmZXIuYwppbmRleCA4N2U0M2UwLi41YTcyZWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9idWZmZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9idWZmZXIuYwpAQCAtNDIsNiArNDIsMTAgQEAKIHN0YXRpYyB1aW50MzJfdCBnbXJfcGxhY2VtZW50X2ZsYWdzID0gVk1XX1BMX0ZMQUdfR01SIHwKIAlUVE1fUExfRkxBR19DQUNIRUQ7CiAKK3N0YXRpYyB1aW50MzJfdCBnbXJfbmVfcGxhY2VtZW50X2ZsYWdzID0gVk1XX1BMX0ZMQUdfR01SIHwKKwlUVE1fUExfRkxBR19DQUNIRUQgfAorCVRUTV9QTF9GTEFHX05PX0VWSUNUOworCiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfdnJhbV9wbGFjZW1lbnQgPSB7CiAJLmZwZm4gPSAwLAogCS5scGZuID0gMCwKQEAgLTU2LDYgKzYwLDExIEBACiAJVk1XX1BMX0ZMQUdfR01SIHwgVFRNX1BMX0ZMQUdfQ0FDSEVECiB9OwogCitzdGF0aWMgdWludDMyX3QgZ21yX3ZyYW1fcGxhY2VtZW50X2ZsYWdzW10gPSB7CisJVk1XX1BMX0ZMQUdfR01SIHwgVFRNX1BMX0ZMQUdfQ0FDSEVELAorCVRUTV9QTF9GTEFHX1ZSQU0gfCBUVE1fUExfRkxBR19DQUNIRUQKK307CisKIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd192cmFtX2dtcl9wbGFjZW1lbnQgPSB7CiAJLmZwZm4gPSAwLAogCS5scGZuID0gMCwKQEAgLTY1LDYgKzc0LDIwIEBACiAJLmJ1c3lfcGxhY2VtZW50ID0gJmdtcl9wbGFjZW1lbnRfZmxhZ3MKIH07CiAKK3N0YXRpYyB1aW50MzJfdCB2cmFtX2dtcl9uZV9wbGFjZW1lbnRfZmxhZ3NbXSA9IHsKKwlUVE1fUExfRkxBR19WUkFNIHwgVFRNX1BMX0ZMQUdfQ0FDSEVEIHwgVFRNX1BMX0ZMQUdfTk9fRVZJQ1QsCisJVk1XX1BMX0ZMQUdfR01SIHwgVFRNX1BMX0ZMQUdfQ0FDSEVEIHwgVFRNX1BMX0ZMQUdfTk9fRVZJQ1QKK307CisKK3N0cnVjdCB0dG1fcGxhY2VtZW50IHZtd192cmFtX2dtcl9uZV9wbGFjZW1lbnQgPSB7CisJLmZwZm4gPSAwLAorCS5scGZuID0gMCwKKwkubnVtX3BsYWNlbWVudCA9IDIsCisJLnBsYWNlbWVudCA9IHZyYW1fZ21yX25lX3BsYWNlbWVudF9mbGFncywKKwkubnVtX2J1c3lfcGxhY2VtZW50ID0gMSwKKwkuYnVzeV9wbGFjZW1lbnQgPSAmZ21yX25lX3BsYWNlbWVudF9mbGFncworfTsKKwogc3RydWN0IHR0bV9wbGFjZW1lbnQgdm13X3ZyYW1fc3lzX3BsYWNlbWVudCA9IHsKIAkuZnBmbiA9IDAsCiAJLmxwZm4gPSAwLApAQCAtOTIsNiArMTE1LDMwIEBACiAJLmJ1c3lfcGxhY2VtZW50ID0gJnN5c19wbGFjZW1lbnRfZmxhZ3MKIH07CiAKK3N0YXRpYyB1aW50MzJfdCBldmljdGFibGVfcGxhY2VtZW50X2ZsYWdzW10gPSB7CisJVFRNX1BMX0ZMQUdfU1lTVEVNIHwgVFRNX1BMX0ZMQUdfQ0FDSEVELAorCVRUTV9QTF9GTEFHX1ZSQU0gfCBUVE1fUExfRkxBR19DQUNIRUQsCisJVk1XX1BMX0ZMQUdfR01SIHwgVFRNX1BMX0ZMQUdfQ0FDSEVECit9OworCitzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfZXZpY3RhYmxlX3BsYWNlbWVudCA9IHsKKwkuZnBmbiA9IDAsCisJLmxwZm4gPSAwLAorCS5udW1fcGxhY2VtZW50ID0gMywKKwkucGxhY2VtZW50ID0gZXZpY3RhYmxlX3BsYWNlbWVudF9mbGFncywKKwkubnVtX2J1c3lfcGxhY2VtZW50ID0gMSwKKwkuYnVzeV9wbGFjZW1lbnQgPSAmc3lzX3BsYWNlbWVudF9mbGFncworfTsKKworc3RydWN0IHR0bV9wbGFjZW1lbnQgdm13X3NyZl9wbGFjZW1lbnQgPSB7CisJLmZwZm4gPSAwLAorCS5scGZuID0gMCwKKwkubnVtX3BsYWNlbWVudCA9IDEsCisJLm51bV9idXN5X3BsYWNlbWVudCA9IDIsCisJLnBsYWNlbWVudCA9ICZnbXJfcGxhY2VtZW50X2ZsYWdzLAorCS5idXN5X3BsYWNlbWVudCA9IGdtcl92cmFtX3BsYWNlbWVudF9mbGFncworfTsKKwogc3RydWN0IHZtd190dG1fYmFja2VuZCB7CiAJc3RydWN0IHR0bV9iYWNrZW5kIGJhY2tlbmQ7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKQEAgLTI3NCwzOSArMzIxLDM5IEBACiAKIHN0YXRpYyB2b2lkICp2bXdfc3luY19vYmpfcmVmKHZvaWQgKnN5bmNfb2JqKQogewotCXJldHVybiBzeW5jX29iajsKKworCXJldHVybiAodm9pZCAqKQorCQl2bXdfZmVuY2Vfb2JqX3JlZmVyZW5jZSgoc3RydWN0IHZtd19mZW5jZV9vYmogKikgc3luY19vYmopOwogfQogCiBzdGF0aWMgdm9pZCB2bXdfc3luY19vYmpfdW5yZWYodm9pZCAqKnN5bmNfb2JqKQogewotCSpzeW5jX29iaiA9IE5VTEw7CisJdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZSgoc3RydWN0IHZtd19mZW5jZV9vYmogKiopIHN5bmNfb2JqKTsKIH0KIAogc3RhdGljIGludCB2bXdfc3luY19vYmpfZmx1c2godm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnKQogewotCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSAoc3RydWN0IHZtd19wcml2YXRlICopc3luY19hcmc7Ci0KLQltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwotCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9SRUdfU1lOQywgU1ZHQV9TWU5DX0dFTkVSSUMpOwotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKKwl2bXdfZmVuY2Vfb2JqX2ZsdXNoKChzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKSBzeW5jX29iaik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBib29sIHZtd19zeW5jX29ial9zaWduYWxlZCh2b2lkICpzeW5jX29iaiwgdm9pZCAqc3luY19hcmcpCiB7Ci0Jc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IChzdHJ1Y3Qgdm13X3ByaXZhdGUgKilzeW5jX2FyZzsKLQl1aW50MzJfdCBzZXF1ZW5jZSA9ICh1bnNpZ25lZCBsb25nKSBzeW5jX29iajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gKHVuc2lnbmVkIGxvbmcpIHN5bmNfYXJnOworCXJldHVybgl2bXdfZmVuY2Vfb2JqX3NpZ25hbGVkKChzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKSBzeW5jX29iaiwKKwkJCQkgICAgICAgKHVpbnQzMl90KSBmbGFncyk7CiAKLQlyZXR1cm4gdm13X2ZlbmNlX3NpZ25hbGVkKGRldl9wcml2LCBzZXF1ZW5jZSk7CiB9CiAKIHN0YXRpYyBpbnQgdm13X3N5bmNfb2JqX3dhaXQodm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnLAogCQkJICAgICBib29sIGxhenksIGJvb2wgaW50ZXJydXB0aWJsZSkKIHsKLQlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gKHN0cnVjdCB2bXdfcHJpdmF0ZSAqKXN5bmNfYXJnOwotCXVpbnQzMl90IHNlcXVlbmNlID0gKHVuc2lnbmVkIGxvbmcpIHN5bmNfb2JqOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAodW5zaWduZWQgbG9uZykgc3luY19hcmc7CiAKLQlyZXR1cm4gdm13X3dhaXRfZmVuY2UoZGV2X3ByaXYsIGZhbHNlLCBzZXF1ZW5jZSwgZmFsc2UsIDMqSFopOworCXJldHVybiB2bXdfZmVuY2Vfb2JqX3dhaXQoKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICopIHN5bmNfb2JqLAorCQkJCSAgKHVpbnQzMl90KSBmbGFncywKKwkJCQkgIGxhenksIGludGVycnVwdGlibGUsCisJCQkJICBWTVdfRkVOQ0VfV0FJVF9USU1FT1VUKTsKIH0KIAogc3RydWN0IHR0bV9ib19kcml2ZXIgdm13X2JvX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2RtYWJ1Zi5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZG1hYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhODg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2RtYWJ1Zi5jCkBAIC0wLDAgKzEsMzIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInR0bS90dG1fcGxhY2VtZW50LmgiCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAidm13Z2Z4X2Rydi5oIgorCisKKy8qKgorICogdm13X2RtYWJ1Zl90b19wbGFjZW1lbnQgLSBWYWxpZGF0ZSBhIGJ1ZmZlciB0byBwbGFjZW1lbnQuCisgKgorICogQGRldl9wcml2OiAgRHJpdmVyIHByaXZhdGUuCisgKiBAYnVmOiAgRE1BIGJ1ZmZlciB0byBtb3ZlLgorICogQHBpbjogIFBpbiBidWZmZXIgaWYgdHJ1ZS4KKyAqIEBpbnRlcnJ1cHRpYmxlOiAgVXNlIGludGVycnVwdGlibGUgd2FpdC4KKyAqCisgKiBNYXkgb25seSBiZSBjYWxsZWQgYnkgdGhlIGN1cnJlbnQgbWFzdGVyIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUKKyAqIG1hc3RlciBsb2NrIGlzIHRoZSBjdXJyZW50IG1hc3RlcidzIGxvY2suCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBtYXN0ZXIncyBsb2NrIGluIHdyaXRlIG1vZGUuCisgKiBGbHVzaGVzIGFuZCB1bnBpbnMgdGhlIHF1ZXJ5IGJvIHRvIGF2b2lkIGZhaWx1cmVzLgorICoKKyAqIFJldHVybnMKKyAqICAtRVJFU1RBUlRTWVMgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisgKi8KK2ludCB2bXdfZG1hYnVmX3RvX3BsYWNlbWVudChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYnVmLAorCQkJICAgIHN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQsCisJCQkgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKQoreworCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gZGV2X3ByaXYtPmFjdGl2ZV9tYXN0ZXI7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9ICZidWYtPmJhc2U7CisJaW50IHJldDsKKworCXJldCA9IHR0bV93cml0ZV9sb2NrKCZ2bWFzdGVyLT5sb2NrLCBpbnRlcnJ1cHRpYmxlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJdm13X2V4ZWNidWZfcmVsZWFzZV9waW5uZWRfYm8oZGV2X3ByaXYsIGZhbHNlLCAwKTsKKworCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSwgZmFsc2UsIDApOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gZXJyOworCisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCBwbGFjZW1lbnQsIGludGVycnVwdGlibGUsIGZhbHNlLCBmYWxzZSk7CisKKwl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKKworZXJyOgorCXR0bV93cml0ZV91bmxvY2soJnZtYXN0ZXItPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdm13X2RtYWJ1Zl90b192cmFtX29yX2dtciAtIE1vdmUgYSBidWZmZXIgdG8gdnJhbSBvciBnbXIuCisgKgorICogTWF5IG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBjdXJyZW50IG1hc3RlciBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlCisgKiBtYXN0ZXIgbG9jayBpcyB0aGUgY3VycmVudCBtYXN0ZXIncyBsb2NrLgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbWFzdGVyJ3MgbG9jayBpbiB3cml0ZSBtb2RlLgorICogRmx1c2hlcyBhbmQgdW5waW5zIHRoZSBxdWVyeSBibyBpZiBAcGluID09IHRydWUgdG8gYXZvaWQgZmFpbHVyZXMuCisgKgorICogQGRldl9wcml2OiAgRHJpdmVyIHByaXZhdGUuCisgKiBAYnVmOiAgRE1BIGJ1ZmZlciB0byBtb3ZlLgorICogQHBpbjogIFBpbiBidWZmZXIgaWYgdHJ1ZS4KKyAqIEBpbnRlcnJ1cHRpYmxlOiAgVXNlIGludGVycnVwdGlibGUgd2FpdC4KKyAqCisgKiBSZXR1cm5zCisgKiAtRVJFU1RBUlRTWVMgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisgKi8KK2ludCB2bXdfZG1hYnVmX3RvX3ZyYW1fb3JfZ21yKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZiwKKwkJCSAgICAgIGJvb2wgcGluLCBib29sIGludGVycnVwdGlibGUpCit7CisJc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIgPSBkZXZfcHJpdi0+YWN0aXZlX21hc3RlcjsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gJmJ1Zi0+YmFzZTsKKwlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50OworCWludCByZXQ7CisKKwlyZXQgPSB0dG1fd3JpdGVfbG9jaygmdm1hc3Rlci0+bG9jaywgaW50ZXJydXB0aWJsZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwaW4pCisJCXZtd19leGVjYnVmX3JlbGVhc2VfcGlubmVkX2JvKGRldl9wcml2LCBmYWxzZSwgMCk7CisKKwlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShibywgaW50ZXJydXB0aWJsZSwgZmFsc2UsIGZhbHNlLCAwKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIGVycjsKKworCS8qKgorCSAqIFB1dCBCTyBpbiBWUkFNIGlmIHRoZXJlIGlzIHNwYWNlLCBvdGhlcndpc2UgYXMgYSBHTVIuCisJICogSWYgdGhlcmUgaXMgbm8gc3BhY2UgaW4gVlJBTSBhbmQgR01SIGlkcyBhcmUgYWxsIHVzZWQgdXAsCisJICogc3RhcnQgZXZpY3RpbmcgR01ScyB0byBtYWtlIHJvb20uIElmIHRoZSBETUEgYnVmZmVyIGNhbid0IGJlCisJICogdXNlZCBhcyBhIEdNUiwgdGhpcyB3aWxsIHJldHVybiAtRU5PTUVNLgorCSAqLworCisJaWYgKHBpbikKKwkJcGxhY2VtZW50ID0gJnZtd192cmFtX2dtcl9uZV9wbGFjZW1lbnQ7CisJZWxzZQorCQlwbGFjZW1lbnQgPSAmdm13X3ZyYW1fZ21yX3BsYWNlbWVudDsKKworCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgcGxhY2VtZW50LCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSwgZmFsc2UpOworCWlmIChsaWtlbHkocmV0ID09IDApIHx8IHJldCA9PSAtRVJFU1RBUlRTWVMpCisJCWdvdG8gZXJyX3VucmVzZXJ2ZTsKKworCisJLyoqCisJICogSWYgdGhhdCBmYWlsZWQsIHRyeSBWUkFNIGFnYWluLCB0aGlzIHRpbWUgZXZpY3RpbmcKKwkgKiBwcmV2aW91cyBjb250ZW50cy4KKwkgKi8KKworCWlmIChwaW4pCisJCXBsYWNlbWVudCA9ICZ2bXdfdnJhbV9uZV9wbGFjZW1lbnQ7CisJZWxzZQorCQlwbGFjZW1lbnQgPSAmdm13X3ZyYW1fcGxhY2VtZW50OworCisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCBwbGFjZW1lbnQsIGludGVycnVwdGlibGUsIGZhbHNlLCBmYWxzZSk7CisKK2Vycl91bnJlc2VydmU6CisJdHRtX2JvX3VucmVzZXJ2ZShibyk7CitlcnI6CisJdHRtX3dyaXRlX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2bXdfZG1hYnVmX3RvX3ZyYW0gLSBNb3ZlIGEgYnVmZmVyIHRvIHZyYW0uCisgKgorICogTWF5IG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBjdXJyZW50IG1hc3RlciBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlCisgKiBtYXN0ZXIgbG9jayBpcyB0aGUgY3VycmVudCBtYXN0ZXIncyBsb2NrLgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbWFzdGVyJ3MgbG9jayBpbiB3cml0ZSBtb2RlLgorICoKKyAqIEBkZXZfcHJpdjogIERyaXZlciBwcml2YXRlLgorICogQGJ1ZjogIERNQSBidWZmZXIgdG8gbW92ZS4KKyAqIEBwaW46ICBQaW4gYnVmZmVyIGluIHZyYW0gaWYgdHJ1ZS4KKyAqIEBpbnRlcnJ1cHRpYmxlOiAgVXNlIGludGVycnVwdGlibGUgd2FpdC4KKyAqCisgKiBSZXR1cm5zCisgKiAtRVJFU1RBUlRTWVMgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisgKi8KK2ludCB2bXdfZG1hYnVmX3RvX3ZyYW0oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJICAgICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYnVmLAorCQkgICAgICAgYm9vbCBwaW4sIGJvb2wgaW50ZXJydXB0aWJsZSkKK3sKKwlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50OworCisJaWYgKHBpbikKKwkJcGxhY2VtZW50ID0gJnZtd192cmFtX25lX3BsYWNlbWVudDsKKwllbHNlCisJCXBsYWNlbWVudCA9ICZ2bXdfdnJhbV9wbGFjZW1lbnQ7CisKKwlyZXR1cm4gdm13X2RtYWJ1Zl90b19wbGFjZW1lbnQoZGV2X3ByaXYsIGJ1ZiwKKwkJCQkgICAgICAgcGxhY2VtZW50LAorCQkJCSAgICAgICBpbnRlcnJ1cHRpYmxlKTsKK30KKworLyoqCisgKiB2bXdfZG1hYnVmX3RvX3N0YXJ0X29mX3ZyYW0gLSBNb3ZlIGEgYnVmZmVyIHRvIHN0YXJ0IG9mIHZyYW0uCisgKgorICogTWF5IG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBjdXJyZW50IG1hc3RlciBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlCisgKiBtYXN0ZXIgbG9jayBpcyB0aGUgY3VycmVudCBtYXN0ZXIncyBsb2NrLgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbWFzdGVyJ3MgbG9jayBpbiB3cml0ZSBtb2RlLgorICogRmx1c2hlcyBhbmQgdW5waW5zIHRoZSBxdWVyeSBibyBpZiBAcGluID09IHRydWUgdG8gYXZvaWQgZmFpbHVyZXMuCisgKgorICogQGRldl9wcml2OiAgRHJpdmVyIHByaXZhdGUuCisgKiBAYnVmOiAgRE1BIGJ1ZmZlciB0byBtb3ZlLgorICogQHBpbjogIFBpbiBidWZmZXIgaW4gdnJhbSBpZiB0cnVlLgorICogQGludGVycnVwdGlibGU6ICBVc2UgaW50ZXJydXB0aWJsZSB3YWl0LgorICoKKyAqIFJldHVybnMKKyAqIC1FUkVTVEFSVFNZUyBpZiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KKyAqLworaW50IHZtd19kbWFidWZfdG9fc3RhcnRfb2ZfdnJhbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCXN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYnVmLAorCQkJCWJvb2wgcGluLCBib29sIGludGVycnVwdGlibGUpCit7CisJc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIgPSBkZXZfcHJpdi0+YWN0aXZlX21hc3RlcjsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gJmJ1Zi0+YmFzZTsKKwlzdHJ1Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAocGluKQorCQlwbGFjZW1lbnQgPSB2bXdfdnJhbV9uZV9wbGFjZW1lbnQ7CisJZWxzZQorCQlwbGFjZW1lbnQgPSB2bXdfdnJhbV9wbGFjZW1lbnQ7CisJcGxhY2VtZW50LmxwZm4gPSBiby0+bnVtX3BhZ2VzOworCisJcmV0ID0gdHRtX3dyaXRlX2xvY2soJnZtYXN0ZXItPmxvY2ssIGludGVycnVwdGlibGUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlpZiAocGluKQorCQl2bXdfZXhlY2J1Zl9yZWxlYXNlX3Bpbm5lZF9ibyhkZXZfcHJpdiwgZmFsc2UsIDApOworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoYm8sIGludGVycnVwdGlibGUsIGZhbHNlLCBmYWxzZSwgMCk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBlcnJfdW5sb2NrOworCisJLyogSXMgdGhpcyBidWZmZXIgYWxyZWFkeSBpbiB2cmFtIGJ1dCBub3QgYXQgdGhlIHN0YXJ0IG9mIGl0PyAqLworCWlmIChiby0+bWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNICYmCisJICAgIGJvLT5tZW0uc3RhcnQgPCBiby0+bnVtX3BhZ2VzICYmCisJICAgIGJvLT5tZW0uc3RhcnQgPiAwKQorCQkodm9pZCkgdHRtX2JvX3ZhbGlkYXRlKGJvLCAmdm13X3N5c19wbGFjZW1lbnQsIGZhbHNlLAorCQkJCSAgICAgICBmYWxzZSwgZmFsc2UpOworCisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCAmcGxhY2VtZW50LCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSwgZmFsc2UpOworCisJLyogRm9yIHNvbWUgcmVhc29uIHdlIGRpZG4ndCB1cCBhdCB0aGUgc3RhcnQgb2YgdnJhbSAqLworCVdBUk5fT04ocmV0ID09IDAgJiYgYm8tPm9mZnNldCAhPSAwKTsKKworCXR0bV9ib191bnJlc2VydmUoYm8pOworZXJyX3VubG9jazoKKwl0dG1fd3JpdGVfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiB2bXdfZG1hYnVmX3VwaW4gLSBVbnBpbiB0aGUgYnVmZmVyIGdpdmVuIGJ1ZmZlciwgZG9lcyBub3QgbW92ZSB0aGUgYnVmZmVyLgorICoKKyAqIE1heSBvbmx5IGJlIGNhbGxlZCBieSB0aGUgY3VycmVudCBtYXN0ZXIgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZQorICogbWFzdGVyIGxvY2sgaXMgdGhlIGN1cnJlbnQgbWFzdGVyJ3MgbG9jay4KKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIG1hc3RlcidzIGxvY2sgaW4gd3JpdGUgbW9kZS4KKyAqCisgKiBAZGV2X3ByaXY6ICBEcml2ZXIgcHJpdmF0ZS4KKyAqIEBidWY6ICBETUEgYnVmZmVyIHRvIHVucGluLgorICogQGludGVycnVwdGlibGU6ICBVc2UgaW50ZXJydXB0aWJsZSB3YWl0LgorICoKKyAqIFJldHVybnMKKyAqIC1FUkVTVEFSVFNZUyBpZiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KKyAqLworaW50IHZtd19kbWFidWZfdW5waW4oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJICAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZiwKKwkJICAgICBib29sIGludGVycnVwdGlibGUpCit7CisJLyoKKwkgKiBXZSBjb3VsZCBpbiB0aGVvcnkgZWFybHkgb3V0IGlmIHRoZSBidWZmZXIgaXMKKwkgKiB1bnBpbm5lZCBidXQgd2UgbmVlZCB0byBsb2NrIGFuZCByZXNlcnZlIHRoZSBidWZmZXIKKwkgKiBhbnl3YXlzIHNvIHdlIGRvbid0IGdhaW4gbXVjaCBieSB0aGF0LgorCSAqLworCXJldHVybiB2bXdfZG1hYnVmX3RvX3BsYWNlbWVudChkZXZfcHJpdiwgYnVmLAorCQkJCSAgICAgICAmdm13X2V2aWN0YWJsZV9wbGFjZW1lbnQsCisJCQkJICAgICAgIGludGVycnVwdGlibGUpOworfQorCisKKy8qKgorICogdm13X2JvX2dldF9ndWVzdF9wdHIgLSBHZXQgdGhlIGd1ZXN0IHB0ciByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcGxhY2VtZW50CisgKiBvZiBhIGJ1ZmZlci4KKyAqCisgKiBAYm86IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QuIE11c3QgYmUgcGlubmVkIG9yIHJlc2VydmVkLgorICogQHB0cjogU1ZHQUd1ZXN0UHRyIHJldHVybmluZyB0aGUgcmVzdWx0LgorICovCit2b2lkIHZtd19ib19nZXRfZ3Vlc3RfcHRyKGNvbnN0IHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCisJCQkgIFNWR0FHdWVzdFB0ciAqcHRyKQoreworCWlmIChiby0+bWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNKSB7CisJCXB0ci0+Z21ySWQgPSBTVkdBX0dNUl9GUkFNRUJVRkZFUjsKKwkJcHRyLT5vZmZzZXQgPSBiby0+b2Zmc2V0OworCX0gZWxzZSB7CisJCXB0ci0+Z21ySWQgPSBiby0+bWVtLnN0YXJ0OworCQlwdHItPm9mZnNldCA9IDA7CisJfQorfQorCisKKy8qKgorICogdm13X2JvX3BpbiAtIFBpbiBvciB1bnBpbiBhIGJ1ZmZlciBvYmplY3Qgd2l0aG91dCBtb3ZpbmcgaXQuCisgKgorICogQGJvOiBUaGUgYnVmZmVyIG9iamVjdC4gTXVzdCBiZSByZXNlcnZlZCwgYW5kIHByZXNlbnQgZWl0aGVyIGluIFZSQU0KKyAqIG9yIEdNUiBtZW1vcnkuCisgKiBAcGluOiBXaGV0aGVyIHRvIHBpbiBvciB1bnBpbi4KKyAqCisgKi8KK3ZvaWQgdm13X2JvX3BpbihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBib29sIHBpbikKK3sKKwl1aW50MzJfdCBwbF9mbGFnczsKKwlzdHJ1Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQ7CisJdWludDMyX3Qgb2xkX21lbV90eXBlID0gYm8tPm1lbS5tZW1fdHlwZTsKKwlpbnQgcmV0OworCisJQlVHX09OKCFhdG9taWNfcmVhZCgmYm8tPnJlc2VydmVkKSk7CisJQlVHX09OKG9sZF9tZW1fdHlwZSAhPSBUVE1fUExfVlJBTSAmJgorCSAgICAgICBvbGRfbWVtX3R5cGUgIT0gVk1XX1BMX0ZMQUdfR01SKTsKKworCXBsX2ZsYWdzID0gVFRNX1BMX0ZMQUdfVlJBTSB8IFZNV19QTF9GTEFHX0dNUiB8IFRUTV9QTF9GTEFHX0NBQ0hFRDsKKwlpZiAocGluKQorCQlwbF9mbGFncyB8PSBUVE1fUExfRkxBR19OT19FVklDVDsKKworCW1lbXNldCgmcGxhY2VtZW50LCAwLCBzaXplb2YocGxhY2VtZW50KSk7CisJcGxhY2VtZW50Lm51bV9wbGFjZW1lbnQgPSAxOworCXBsYWNlbWVudC5wbGFjZW1lbnQgPSAmcGxfZmxhZ3M7CisKKwlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoYm8sICZwbGFjZW1lbnQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKworCUJVR19PTihyZXQgIT0gMCB8fCBiby0+bWVtLm1lbV90eXBlICE9IG9sZF9tZW1fdHlwZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5jCmluZGV4IDk2OTQ5YjkuLmRmZjhmYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5jCkBAIC0yNCw2ICsyNCw3IEBACiAgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJ2bXdnZnhfZHJ2LmgiCkBAIC04MiwxNyArODMsMzEgQEAKICNkZWZpbmUgRFJNX0lPQ1RMX1ZNV19FWEVDQlVGCQkJCQlcCiAJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19FWEVDQlVGLAkJXAogCQlzdHJ1Y3QgZHJtX3Ztd19leGVjYnVmX2FyZykKLSNkZWZpbmUgRFJNX0lPQ1RMX1ZNV19GSUZPX0RFQlVHCQkJCVwKLQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19GSUZPX0RFQlVHLAkJXAotCQkgc3RydWN0IGRybV92bXdfZmlmb19kZWJ1Z19hcmcpCisjZGVmaW5lIERSTV9JT0NUTF9WTVdfR0VUXzNEX0NBUAkJCQlcCisJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19HRVRfM0RfQ0FQLAkJXAorCQkgc3RydWN0IGRybV92bXdfZ2V0XzNkX2NhcF9hcmcpCiAjZGVmaW5lIERSTV9JT0NUTF9WTVdfRkVOQ0VfV0FJVAkJCQlcCiAJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WTVdfRkVOQ0VfV0FJVCwJCVwKIAkJIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnKQorI2RlZmluZSBEUk1fSU9DVExfVk1XX0ZFTkNFX1NJR05BTEVECQkJCVwKKwlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19GRU5DRV9TSUdOQUxFRCwJXAorCQkgc3RydWN0IGRybV92bXdfZmVuY2Vfc2lnbmFsZWRfYXJnKQorI2RlZmluZSBEUk1fSU9DVExfVk1XX0ZFTkNFX1VOUkVGCQkJCVwKKwlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVk1XX0ZFTkNFX1VOUkVGLAkJXAorCQkgc3RydWN0IGRybV92bXdfZmVuY2VfYXJnKQorI2RlZmluZSBEUk1fSU9DVExfVk1XX0ZFTkNFX0VWRU5UCQkJCVwKKwlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVk1XX0ZFTkNFX0VWRU5ULAkJXAorCQkgc3RydWN0IGRybV92bXdfZmVuY2VfZXZlbnRfYXJnKQorI2RlZmluZSBEUk1fSU9DVExfVk1XX1BSRVNFTlQJCQkJCVwKKwlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVk1XX1BSRVNFTlQsCQlcCisJCSBzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X2FyZykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZNV19QUkVTRU5UX1JFQURCQUNLCQkJCVwKKwlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVk1XX1BSRVNFTlRfUkVBREJBQ0ssCVwKKwkJIHN0cnVjdCBkcm1fdm13X3ByZXNlbnRfcmVhZGJhY2tfYXJnKQogI2RlZmluZSBEUk1fSU9DVExfVk1XX1VQREFURV9MQVlPVVQJCQkJXAotCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVk1XX1VQREFURV9MQVlPVVQsCVwKKwlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVk1XX1VQREFURV9MQVlPVVQsCVwKIAkJIHN0cnVjdCBkcm1fdm13X3VwZGF0ZV9sYXlvdXRfYXJnKQogCi0KIC8qKgogICogVGhlIGNvcmUgRFJNIHZlcnNpb24gb2YgdGhpcyBtYWNybyBkb2Vzbid0IGFjY291bnQgZm9yCiAgKiBEUk1fQ09NTUFORF9CQVNFLgpAQCAtMTM1LDEyICsxNTAsMjggQEAKIAkJICAgICAgRFJNX0FVVEggfCBEUk1fVU5MT0NLRUQpLAogCVZNV19JT0NUTF9ERUYoVk1XX0VYRUNCVUYsIHZtd19leGVjYnVmX2lvY3RsLAogCQkgICAgICBEUk1fQVVUSCB8IERSTV9VTkxPQ0tFRCksCi0JVk1XX0lPQ1RMX0RFRihWTVdfRklGT19ERUJVRywgdm13X2ZpZm9fZGVidWdfaW9jdGwsCi0JCSAgICAgIERSTV9BVVRIIHwgRFJNX1JPT1RfT05MWSB8IERSTV9NQVNURVIgfCBEUk1fVU5MT0NLRUQpLAotCVZNV19JT0NUTF9ERUYoVk1XX0ZFTkNFX1dBSVQsIHZtd19mZW5jZV93YWl0X2lvY3RsLAorCVZNV19JT0NUTF9ERUYoVk1XX0ZFTkNFX1dBSVQsIHZtd19mZW5jZV9vYmpfd2FpdF9pb2N0bCwKIAkJICAgICAgRFJNX0FVVEggfCBEUk1fVU5MT0NLRUQpLAotCVZNV19JT0NUTF9ERUYoVk1XX1VQREFURV9MQVlPVVQsIHZtd19rbXNfdXBkYXRlX2xheW91dF9pb2N0bCwKLQkJICAgICAgRFJNX01BU1RFUiB8IERSTV9DT05UUk9MX0FMTE9XIHwgRFJNX1VOTE9DS0VEKQorCVZNV19JT0NUTF9ERUYoVk1XX0ZFTkNFX1NJR05BTEVELAorCQkgICAgICB2bXdfZmVuY2Vfb2JqX3NpZ25hbGVkX2lvY3RsLAorCQkgICAgICBEUk1fQVVUSCB8IERSTV9VTkxPQ0tFRCksCisJVk1XX0lPQ1RMX0RFRihWTVdfRkVOQ0VfVU5SRUYsIHZtd19mZW5jZV9vYmpfdW5yZWZfaW9jdGwsCisJCSAgICAgIERSTV9BVVRIIHwgRFJNX1VOTE9DS0VEKSwKKwlWTVdfSU9DVExfREVGKFZNV19GRU5DRV9FVkVOVCwKKwkJICAgICAgdm13X2ZlbmNlX2V2ZW50X2lvY3RsLAorCQkgICAgICBEUk1fQVVUSCB8IERSTV9VTkxPQ0tFRCksCisJVk1XX0lPQ1RMX0RFRihWTVdfR0VUXzNEX0NBUCwgdm13X2dldF9jYXBfM2RfaW9jdGwsCisJCSAgICAgIERSTV9BVVRIIHwgRFJNX1VOTE9DS0VEKSwKKworCS8qIHRoZXNlIGFsbG93IGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGZyYW1lYnVmZmVycyBtYXJrIGFzIG1hc3RlciBvbmx5ICovCisJVk1XX0lPQ1RMX0RFRihWTVdfUFJFU0VOVCwgdm13X3ByZXNlbnRfaW9jdGwsCisJCSAgICAgIERSTV9NQVNURVIgfCBEUk1fQVVUSCB8IERSTV9VTkxPQ0tFRCksCisJVk1XX0lPQ1RMX0RFRihWTVdfUFJFU0VOVF9SRUFEQkFDSywKKwkJICAgICAgdm13X3ByZXNlbnRfcmVhZGJhY2tfaW9jdGwsCisJCSAgICAgIERSTV9NQVNURVIgfCBEUk1fQVVUSCB8IERSTV9VTkxPQ0tFRCksCisJVk1XX0lPQ1RMX0RFRihWTVdfVVBEQVRFX0xBWU9VVCwKKwkJICAgICAgdm13X2ttc191cGRhdGVfbGF5b3V0X2lvY3RsLAorCQkgICAgICBEUk1fTUFTVEVSIHwgRFJNX1VOTE9DS0VEKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2bXdfcGNpX2lkX2xpc3RbXSA9IHsKQEAgLTE4OSw4ICsyMjAsNzggQEAKIAkJRFJNX0lORk8oIiAgR01SLlxuIik7CiAJaWYgKGNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX1RSQUNFUykKIAkJRFJNX0lORk8oIiAgVHJhY2VzLlxuIik7CisJaWYgKGNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dNUjIpCisJCURSTV9JTkZPKCIgIEdNUjIuXG4iKTsKKwlpZiAoY2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfU0NSRUVOX09CSkVDVF8yKQorCQlEUk1fSU5GTygiICBTY3JlZW4gT2JqZWN0IDIuXG4iKTsKIH0KIAorCisvKioKKyAqIHZtd19leGVjYnVmX3ByZXBhcmVfZHVtbXlfcXVlcnkgLSBJbml0aWFsaXplIGEgcXVlcnkgcmVzdWx0IHN0cnVjdHVyZSBhdAorICogdGhlIHN0YXJ0IG9mIGEgYnVmZmVyIG9iamVjdC4KKyAqCisgKiBAZGV2X3ByaXY6IFRoZSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGlkbGUgdGhlIGJ1ZmZlciB1c2luZyBhbiB1bmludGVycnVwdGlibGUgd2FpdCwgdGhlbgorICogbWFwIHRoZSBmaXJzdCBwYWdlIGFuZCBpbml0aWFsaXplIGEgcGVuZGluZyBvY2NsdXNpb24gcXVlcnkgcmVzdWx0IHN0cnVjdHVyZSwKKyAqIEZpbmFsbHkgaXQgd2lsbCB1bm1hcCB0aGUgYnVmZmVyLgorICoKKyAqIFRPRE86IFNpbmNlIHdlJ3JlIG9ubHkgbWFwcGluZyBhIHNpbmdsZSBwYWdlLCB3ZSBzaG91bGQgb3B0aW1pemUgdGhlIG1hcAorICogdG8gdXNlIGttYXBfYXRvbWljIC8gaW9tYXBfYXRvbWljLgorICovCitzdGF0aWMgdm9pZCB2bXdfZHVtbXlfcXVlcnlfYm9fcHJlcGFyZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCB0dG1fYm9fa21hcF9vYmogbWFwOworCXZvbGF0aWxlIFNWR0EzZFF1ZXJ5UmVzdWx0ICpyZXN1bHQ7CisJYm9vbCBkdW1teTsKKwlpbnQgcmV0OworCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2ID0gJmRldl9wcml2LT5iZGV2OworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSBkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm87CisKKwl0dG1fYm9fcmVzZXJ2ZShibywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKKwlyZXQgPSB0dG1fYm9fd2FpdChibywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCSh2b2lkKSB2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgZmFsc2UsIHRydWUsIDAsIGZhbHNlLAorCQkJCQkgMTAqSFopOworCisJcmV0ID0gdHRtX2JvX2ttYXAoYm8sIDAsIDEsICZtYXApOworCWlmIChsaWtlbHkocmV0ID09IDApKSB7CisJCXJlc3VsdCA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZtYXAsICZkdW1teSk7CisJCXJlc3VsdC0+dG90YWxTaXplID0gc2l6ZW9mKCpyZXN1bHQpOworCQlyZXN1bHQtPnN0YXRlID0gU1ZHQTNEX1FVRVJZU1RBVEVfUEVORElORzsKKwkJcmVzdWx0LT5yZXN1bHQzMiA9IDB4ZmY7CisJCXR0bV9ib19rdW5tYXAoJm1hcCk7CisJfSBlbHNlCisJCURSTV9FUlJPUigiRHVtbXkgcXVlcnkgYnVmZmVyIG1hcCBmYWlsZWQuXG4iKTsKKwl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKK30KKworCisvKioKKyAqIHZtd19kdW1teV9xdWVyeV9ib19jcmVhdGUgLSBjcmVhdGUgYSBibyB0byBob2xkIGEgZHVtbXkgcXVlcnkgcmVzdWx0CisgKgorICogQGRldl9wcml2OiBBIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzbWFsbCBidWZmZXIgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIHF1ZXJ5CisgKiByZXN1bHQgZm9yIGR1bW15IHF1ZXJpZXMgZW1pdHRlZCBhcyBxdWVyeSBiYXJyaWVycy4KKyAqIE5vIGludGVycnVwdGlibGUgd2FpdHMgYXJlIGRvbmUgd2l0aGluIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJucyBhbiBlcnJvciBpZiBibyBjcmVhdGlvbiBmYWlscy4KKyAqLworc3RhdGljIGludCB2bXdfZHVtbXlfcXVlcnlfYm9fY3JlYXRlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJcmV0dXJuIHR0bV9ib19jcmVhdGUoJmRldl9wcml2LT5iZGV2LAorCQkJICAgICBQQUdFX1NJWkUsCisJCQkgICAgIHR0bV9ib190eXBlX2RldmljZSwKKwkJCSAgICAgJnZtd192cmFtX3N5c19wbGFjZW1lbnQsCisJCQkgICAgIDAsIDAsIGZhbHNlLCBOVUxMLAorCQkJICAgICAmZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvKTsKK30KKworCiBzdGF0aWMgaW50IHZtd19yZXF1ZXN0X2RldmljZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQogewogCWludCByZXQ7CkBAIC0yMDAsMTYgKzMwMSw0MiBAQAogCQlEUk1fRVJST1IoIlVuYWJsZSB0byBpbml0aWFsaXplIEZJRk8uXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CisJdm13X2ZlbmNlX2ZpZm9fdXAoZGV2X3ByaXYtPmZtYW4pOworCXJldCA9IHZtd19kdW1teV9xdWVyeV9ib19jcmVhdGUoZGV2X3ByaXYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X25vX3F1ZXJ5X2JvOworCXZtd19kdW1teV9xdWVyeV9ib19wcmVwYXJlKGRldl9wcml2KTsKIAogCXJldHVybiAwOworCitvdXRfbm9fcXVlcnlfYm86CisJdm13X2ZlbmNlX2ZpZm9fZG93bihkZXZfcHJpdi0+Zm1hbik7CisJdm13X2ZpZm9fcmVsZWFzZShkZXZfcHJpdiwgJmRldl9wcml2LT5maWZvKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCB2bXdfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKIHsKKwkvKgorCSAqIFByZXZpb3VzIGRlc3RydWN0aW9ucyBzaG91bGQndmUgcmVsZWFzZWQKKwkgKiB0aGUgcGlubmVkIGJvLgorCSAqLworCisJQlVHX09OKGRldl9wcml2LT5waW5uZWRfYm8gIT0gTlVMTCk7CisKKwl0dG1fYm9fdW5yZWYoJmRldl9wcml2LT5kdW1teV9xdWVyeV9ibyk7CisJdm13X2ZlbmNlX2ZpZm9fZG93bihkZXZfcHJpdi0+Zm1hbik7CiAJdm13X2ZpZm9fcmVsZWFzZShkZXZfcHJpdiwgJmRldl9wcml2LT5maWZvKTsKIH0KIAotaW50IHZtd18zZF9yZXNvdXJjZV9pbmMoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKKy8qKgorICogSW5jcmVhc2UgdGhlIDNkIHJlc291cmNlIHJlZmNvdW50LgorICogSWYgdGhlIGNvdW50IHdhcyBwcmV2b3VzbHkgemVybywgaW5pdGlhbGl6ZSB0aGUgZmlmbywgc3dpdGNoaW5nIHRvIHN2Z2EKKyAqIG1vZGUuIE5vdGUgdGhhdCB0aGUgbWFzdGVyIGhvbGRzIGEgcmVmIGFzIHdlbGwsIGFuZCBtYXkgcmVxdWVzdCBhbgorICogZXhwbGljaXQgc3dpdGNoIHRvIHN2Z2EgbW9kZSBpZiBmYiBpcyBub3QgcnVubmluZywgdXNpbmcgQHVuaGlkZV9zdmdhLgorICovCitpbnQgdm13XzNkX3Jlc291cmNlX2luYyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJYm9vbCB1bmhpZGVfc3ZnYSkKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjE4LDE5ICszNDUsNDIgQEAKIAkJcmV0ID0gdm13X3JlcXVlc3RfZGV2aWNlKGRldl9wcml2KTsKIAkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJCS0tZGV2X3ByaXYtPm51bV8zZF9yZXNvdXJjZXM7CisJfSBlbHNlIGlmICh1bmhpZGVfc3ZnYSkgeworCQltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0VOQUJMRSwKKwkJCSAgdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX0VOQUJMRSkgJgorCQkJICB+U1ZHQV9SRUdfRU5BQkxFX0hJREUpOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7CiAJfQorCiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cmVsZWFzZV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIAotCi12b2lkIHZtd18zZF9yZXNvdXJjZV9kZWMoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKKy8qKgorICogRGVjcmVhc2UgdGhlIDNkIHJlc291cmNlIHJlZmNvdW50LgorICogSWYgdGhlIGNvdW50IHJlYWNoZXMgemVybywgZGlzYWJsZSB0aGUgZmlmbywgc3dpdGNoaW5nIHRvIHZnYSBtb2RlLgorICogTm90ZSB0aGF0IHRoZSBtYXN0ZXIgaG9sZHMgYSByZWZjb3VudCBhcyB3ZWxsLCBhbmQgbWF5IHJlcXVlc3QgYW4KKyAqIGV4cGxpY2l0IHN3aXRjaCB0byB2Z2EgbW9kZSB3aGVuIGl0IHJlbGVhc2VzIGl0cyByZWZjb3VudCB0byBhY2NvdW50CisgKiBmb3IgdGhlIHNpdHVhdGlvbiBvZiBhbiBYIHNlcnZlciB2dCBzd2l0Y2ggdG8gVkdBIHdpdGggM2QgcmVzb3VyY2VzCisgKiBhY3RpdmUuCisgKi8KK3ZvaWQgdm13XzNkX3Jlc291cmNlX2RlYyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJIGJvb2wgaGlkZV9zdmdhKQogewogCWludDMyX3QgbjNkOwogCiAJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJlbGVhc2VfbXV0ZXgpOwogCWlmICh1bmxpa2VseSgtLWRldl9wcml2LT5udW1fM2RfcmVzb3VyY2VzID09IDApKQogCQl2bXdfcmVsZWFzZV9kZXZpY2UoZGV2X3ByaXYpOworCWVsc2UgaWYgKGhpZGVfc3ZnYSkgeworCQltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0VOQUJMRSwKKwkJCSAgdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX0VOQUJMRSkgfAorCQkJICBTVkdBX1JFR19FTkFCTEVfSElERSk7CisJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKKwl9CisKIAluM2QgPSAoaW50MzJfdCkgZGV2X3ByaXYtPm51bV8zZF9yZXNvdXJjZXM7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cmVsZWFzZV9tdXRleCk7CiAKQEAgLTI1Miw3ICs0MDIsNyBAQAogCiAJZGV2X3ByaXYtPmRldiA9IGRldjsKIAlkZXZfcHJpdi0+dm13X2NoaXBzZXQgPSBjaGlwc2V0OwotCWRldl9wcml2LT5sYXN0X3JlYWRfc2VxdWVuY2UgPSAodWludDMyX3QpIC0xMDA7CisJZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXFubyA9ICh1aW50MzJfdCkgLTEwMDsKIAltdXRleF9pbml0KCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwogCW11dGV4X2luaXQoJmRldl9wcml2LT5jbWRidWZfbXV0ZXgpOwogCW11dGV4X2luaXQoJmRldl9wcml2LT5yZWxlYXNlX211dGV4KTsKQEAgLTI2Myw4ICs0MTMsMTAgQEAKIAltdXRleF9pbml0KCZkZXZfcHJpdi0+aW5pdF9tdXRleCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2X3ByaXYtPmZlbmNlX3F1ZXVlKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZfcHJpdi0+Zmlmb19xdWV1ZSk7Ci0JYXRvbWljX3NldCgmZGV2X3ByaXYtPmZlbmNlX3F1ZXVlX3dhaXRlcnMsIDApOworCWRldl9wcml2LT5mZW5jZV9xdWV1ZV93YWl0ZXJzID0gMDsKIAlhdG9taWNfc2V0KCZkZXZfcHJpdi0+Zmlmb19xdWV1ZV93YWl0ZXJzLCAwKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2X3ByaXYtPnN1cmZhY2VfbHJ1KTsKKwlkZXZfcHJpdi0+dXNlZF9tZW1vcnlfc2l6ZSA9IDA7CiAKIAlkZXZfcHJpdi0+aW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKTsKIAlkZXZfcHJpdi0+dnJhbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpOwpAQCAtMjg1LDYgKzQzNywxMCBAQAogCiAJZGV2X3ByaXYtPmNhcGFiaWxpdGllcyA9IHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19DQVBBQklMSVRJRVMpOwogCisJZGV2X3ByaXYtPnZyYW1fc2l6ZSA9IHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19WUkFNX1NJWkUpOworCWRldl9wcml2LT5tbWlvX3NpemUgPSB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfTUVNX1NJWkUpOworCWRldl9wcml2LT5mYl9tYXhfd2lkdGggPSB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfTUFYX1dJRFRIKTsKKwlkZXZfcHJpdi0+ZmJfbWF4X2hlaWdodCA9IHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19NQVhfSEVJR0hUKTsKIAlpZiAoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dNUikgewogCQlkZXZfcHJpdi0+bWF4X2dtcl9kZXNjcmlwdG9ycyA9CiAJCQl2bXdfcmVhZChkZXZfcHJpdiwKQEAgLTI5MiwxMSArNDQ4LDE5IEBACiAJCWRldl9wcml2LT5tYXhfZ21yX2lkcyA9CiAJCQl2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfR01SX01BWF9JRFMpOwogCX0KLQotCWRldl9wcml2LT52cmFtX3NpemUgPSB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfVlJBTV9TSVpFKTsKLQlkZXZfcHJpdi0+bW1pb19zaXplID0gdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX01FTV9TSVpFKTsKLQlkZXZfcHJpdi0+ZmJfbWF4X3dpZHRoID0gdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX01BWF9XSURUSCk7Ci0JZGV2X3ByaXYtPmZiX21heF9oZWlnaHQgPSB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfTUFYX0hFSUdIVCk7CisJaWYgKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9HTVIyKSB7CisJCWRldl9wcml2LT5tYXhfZ21yX3BhZ2VzID0KKwkJCXZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19HTVJTX01BWF9QQUdFUyk7CisJCWRldl9wcml2LT5tZW1vcnlfc2l6ZSA9CisJCQl2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfTUVNT1JZX1NJWkUpOworCQlkZXZfcHJpdi0+bWVtb3J5X3NpemUgLT0gZGV2X3ByaXYtPnZyYW1fc2l6ZTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBbiBhcmJpdHJhcnkgbGltaXQgb2YgNTEyTWlCIG9uIHN1cmZhY2UKKwkJICogbWVtb3J5LiBCdXQgYWxsIEhXVjggaGFyZHdhcmUgc3VwcG9ydHMgR01SMi4KKwkJICovCisJCWRldl9wcml2LT5tZW1vcnlfc2l6ZSA9IDUxMioxMDI0KjEwMjQ7CisJfQogCiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwogCkBAIC0zMDgsNiArNDcyLDEyIEBACiAJCURSTV9JTkZPKCJNYXggR01SIGRlc2NyaXB0b3JzIGlzICV1XG4iLAogCQkJICh1bnNpZ25lZClkZXZfcHJpdi0+bWF4X2dtcl9kZXNjcmlwdG9ycyk7CiAJfQorCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SMikgeworCQlEUk1fSU5GTygiTWF4IG51bWJlciBvZiBHTVIgcGFnZXMgaXMgJXVcbiIsCisJCQkgKHVuc2lnbmVkKWRldl9wcml2LT5tYXhfZ21yX3BhZ2VzKTsKKwkJRFJNX0lORk8oIk1heCBkZWRpY2F0ZWQgaHlwZXJ2aXNvciBzdXJmYWNlIG1lbW9yeSBpcyAldSBraUJcbiIsCisJCQkgKHVuc2lnbmVkKWRldl9wcml2LT5tZW1vcnlfc2l6ZSAvIDEwMjQpOworCX0KIAlEUk1fSU5GTygiVlJBTSBhdCAweCUwOHggc2l6ZSBpcyAldSBraUJcbiIsCiAJCSBkZXZfcHJpdi0+dnJhbV9zdGFydCwgZGV2X3ByaXYtPnZyYW1fc2l6ZSAvIDEwMjQpOwogCURSTV9JTkZPKCJNTUlPIGF0IDB4JTA4eCBzaXplIGlzICV1IGtpQlxuIiwKQEAgLTM5NCwyMiArNTY0LDM0IEBACiAJCQlnb3RvIG91dF9ub19kZXZpY2U7CiAJCX0KIAl9CisKKwlkZXZfcHJpdi0+Zm1hbiA9IHZtd19mZW5jZV9tYW5hZ2VyX2luaXQoZGV2X3ByaXYpOworCWlmICh1bmxpa2VseShkZXZfcHJpdi0+Zm1hbiA9PSBOVUxMKSkKKwkJZ290byBvdXRfbm9fZm1hbjsKKworCS8qIE5lZWQgdG8gc3RhcnQgdGhlIGZpZm8gdG8gY2hlY2sgaWYgd2UgY2FuIGRvIHNjcmVlbiBvYmplY3RzICovCisJcmV0ID0gdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXRfbm9fZmlmbzsKKwl2bXdfa21zX3NhdmVfdmdhKGRldl9wcml2KTsKKworCS8qIFN0YXJ0IGttcyBhbmQgb3ZlcmxheSBzeXN0ZW1zLCBuZWVkcyBmaWZvLiAqLwogCXJldCA9IHZtd19rbXNfaW5pdChkZXZfcHJpdik7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXRfbm9fa21zOwogCXZtd19vdmVybGF5X2luaXQoZGV2X3ByaXYpOworCisJLyogM0QgRGVwZW5kcyBvbiBTY3JlZW4gT2JqZWN0cyBiZWluZyB1c2VkLiAqLworCURSTV9JTkZPKCJEZXRlY3RlZCAlc2RldmljZSAzRCBhdmFpbGFiaWxpdHkuXG4iLAorCQkgdm13X2ZpZm9faGF2ZV8zZChkZXZfcHJpdikgPworCQkgIiIgOiAibm8gIik7CisKKwkvKiBXZSBtaWdodCBiZSBkb25lIHdpdGggdGhlIGZpZm8gbm93ICovCiAJaWYgKGRldl9wcml2LT5lbmFibGVfZmIpIHsKLQkJcmV0ID0gdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdik7Ci0JCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCQlnb3RvIG91dF9ub19maWZvOwotCQl2bXdfa21zX3NhdmVfdmdhKGRldl9wcml2KTsKIAkJdm13X2ZiX2luaXQoZGV2X3ByaXYpOwotCQlEUk1fSU5GTygiJXMiLCB2bXdfZmlmb19oYXZlXzNkKGRldl9wcml2KSA/Ci0JCQkgIkRldGVjdGVkIGRldmljZSAzRCBhdmFpbGFiaWxpdHkuXG4iIDoKLQkJCSAiRGV0ZWN0ZWQgbm8gZGV2aWNlIDNEIGF2YWlsYWJpbGl0eS5cbiIpOwogCX0gZWxzZSB7Ci0JCURSTV9JTkZPKCJEZWxheWVkIDNEIGRldGVjdGlvbiBzaW5jZSB3ZSdyZSBub3QgIgotCQkJICJydW5uaW5nIHRoZSBkZXZpY2UgaW4gU1ZHQSBtb2RlIHlldC5cbiIpOworCQl2bXdfa21zX3Jlc3RvcmVfdmdhKGRldl9wcml2KTsKKwkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdiwgdHJ1ZSk7CiAJfQogCiAJaWYgKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9JUlFNQVNLKSB7CkBAIC00MjYsMTUgKzYwOCwxOSBAQAogCXJldHVybiAwOwogCiBvdXRfbm9faXJxOgotCWlmIChkZXZfcHJpdi0+ZW5hYmxlX2ZiKSB7CisJaWYgKGRldl9wcml2LT5lbmFibGVfZmIpCiAJCXZtd19mYl9jbG9zZShkZXZfcHJpdik7Ci0JCXZtd19rbXNfcmVzdG9yZV92Z2EoZGV2X3ByaXYpOwotCQl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2KTsKLQl9Ci1vdXRfbm9fZmlmbzoKIAl2bXdfb3ZlcmxheV9jbG9zZShkZXZfcHJpdik7CiAJdm13X2ttc19jbG9zZShkZXZfcHJpdik7CiBvdXRfbm9fa21zOgorCS8qIFdlIHN0aWxsIGhhdmUgYSAzRCByZXNvdXJjZSByZWZlcmVuY2UgaGVsZCAqLworCWlmIChkZXZfcHJpdi0+ZW5hYmxlX2ZiKSB7CisJCXZtd19rbXNfcmVzdG9yZV92Z2EoZGV2X3ByaXYpOworCQl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2LCBmYWxzZSk7CisJfQorb3V0X25vX2ZpZm86CisJdm13X2ZlbmNlX21hbmFnZXJfdGFrZWRvd24oZGV2X3ByaXYtPmZtYW4pOworb3V0X25vX2ZtYW46CiAJaWYgKGRldl9wcml2LT5zdGVhbHRoKQogCQlwY2lfcmVsZWFzZV9yZWdpb24oZGV2LT5wZGV2LCAyKTsKIAllbHNlCkBAIC00NjcsMTUgKzY1MywxOCBAQAogCiAJdW5yZWdpc3Rlcl9wbV9ub3RpZmllcigmZGV2X3ByaXYtPnBtX25iKTsKIAorCWlmIChkZXZfcHJpdi0+Y3R4LmNtZF9ib3VuY2UpCisJCXZmcmVlKGRldl9wcml2LT5jdHguY21kX2JvdW5jZSk7CiAJaWYgKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9JUlFNQVNLKQogCQlkcm1faXJxX3VuaW5zdGFsbChkZXZfcHJpdi0+ZGV2KTsKIAlpZiAoZGV2X3ByaXYtPmVuYWJsZV9mYikgewogCQl2bXdfZmJfY2xvc2UoZGV2X3ByaXYpOwogCQl2bXdfa21zX3Jlc3RvcmVfdmdhKGRldl9wcml2KTsKLQkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdik7CisJCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIGZhbHNlKTsKIAl9CiAJdm13X2ttc19jbG9zZShkZXZfcHJpdik7CiAJdm13X292ZXJsYXlfY2xvc2UoZGV2X3ByaXYpOworCXZtd19mZW5jZV9tYW5hZ2VyX3Rha2Vkb3duKGRldl9wcml2LT5mbWFuKTsKIAlpZiAoZGV2X3ByaXYtPnN0ZWFsdGgpCiAJCXBjaV9yZWxlYXNlX3JlZ2lvbihkZXYtPnBkZXYsIDIpOwogCWVsc2UKQEAgLTY0Niw3ICs4MzUsNyBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKCFkZXZfcHJpdi0+ZW5hYmxlX2ZiKSB7Ci0JCXJldCA9IHZtd18zZF9yZXNvdXJjZV9pbmMoZGV2X3ByaXYpOworCQlyZXQgPSB2bXdfM2RfcmVzb3VyY2VfaW5jKGRldl9wcml2LCB0cnVlKTsKIAkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJCXJldHVybiByZXQ7CiAJCXZtd19rbXNfc2F2ZV92Z2EoZGV2X3ByaXYpOwpAQCAtNjg4LDcgKzg3Nyw3IEBACiAJCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9SRUdfVFJBQ0VTLCAxKTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwogCQl2bXdfa21zX3Jlc3RvcmVfdmdhKGRldl9wcml2KTsKLQkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdik7CisJCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIHRydWUpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtNzA5LDcgKzg5OCw3IEBACiAKIAl2bXdfZnAtPmxvY2tlZF9tYXN0ZXIgPSBkcm1fbWFzdGVyX2dldChmaWxlX3ByaXYtPm1hc3Rlcik7CiAJcmV0ID0gdHRtX3Z0X2xvY2soJnZtYXN0ZXItPmxvY2ssIGZhbHNlLCB2bXdfZnAtPnRmaWxlKTsKLQl2bXdfa21zX2lkbGVfd29ya3F1ZXVlcyh2bWFzdGVyKTsKKwl2bXdfZXhlY2J1Zl9yZWxlYXNlX3Bpbm5lZF9ibyhkZXZfcHJpdiwgZmFsc2UsIDApOwogCiAJaWYgKHVubGlrZWx5KChyZXQgIT0gMCkpKSB7CiAJCURSTV9FUlJPUigiVW5hYmxlIHRvIGxvY2sgVFRNIGF0IFZUIHN3aXRjaC5cbiIpOwpAQCAtNzI2LDcgKzkxNSw3IEBACiAJCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9SRUdfVFJBQ0VTLCAxKTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwogCQl2bXdfa21zX3Jlc3RvcmVfdmdhKGRldl9wcml2KTsKLQkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdik7CisJCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIHRydWUpOwogCX0KIAogCWRldl9wcml2LT5hY3RpdmVfbWFzdGVyID0gJmRldl9wcml2LT5mYmRldl9tYXN0ZXI7CkBAIC03NjEsNiArOTUwLDcgQEAKIAkJICogVGhpcyBlbXB0aWVzIFZSQU0gYW5kIHVuYmluZHMgYWxsIEdNUiBiaW5kaW5ncy4KIAkJICogQnVmZmVyIGNvbnRlbnRzIGlzIG1vdmVkIHRvIHN3YXBwYWJsZSBtZW1vcnkuCiAJCSAqLworCQl2bXdfZXhlY2J1Zl9yZWxlYXNlX3Bpbm5lZF9ibyhkZXZfcHJpdiwgZmFsc2UsIDApOwogCQl0dG1fYm9fc3dhcG91dF9hbGwoJmRldl9wcml2LT5iZGV2KTsKIAogCQlicmVhazsKQEAgLTgzNSw3ICsxMDI1LDcgQEAKIAkgKi8KIAlkZXZfcHJpdi0+c3VzcGVuZGVkID0gdHJ1ZTsKIAlpZiAoZGV2X3ByaXYtPmVuYWJsZV9mYikKLQkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdik7CisJCQl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2LCB0cnVlKTsKIAogCWlmIChkZXZfcHJpdi0+bnVtXzNkX3Jlc291cmNlcyAhPSAwKSB7CiAKQEAgLTg0Myw3ICsxMDMzLDcgQEAKIAkJCSAid2hpbGUgM0QgcmVzb3VyY2VzIGFyZSBhY3RpdmUuXG4iKTsKIAogCQlpZiAoZGV2X3ByaXYtPmVuYWJsZV9mYikKLQkJCXZtd18zZF9yZXNvdXJjZV9pbmMoZGV2X3ByaXYpOworCQkJdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgdHJ1ZSk7CiAJCWRldl9wcml2LT5zdXNwZW5kZWQgPSBmYWxzZTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC04NjIsNyArMTA1Miw3IEBACiAJICogc3RhcnQgZmlmby4KIAkgKi8KIAlpZiAoZGV2X3ByaXYtPmVuYWJsZV9mYikKLQkJdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdik7CisJCQl2bXdfM2RfcmVzb3VyY2VfaW5jKGRldl9wcml2LCBmYWxzZSk7CiAKIAlkZXZfcHJpdi0+c3VzcGVuZGVkID0gZmFsc2U7CiB9CkBAIC04ODYsNiArMTA3Niw4IEBACiAJLmlycV91bmluc3RhbGwgPSB2bXdfaXJxX3VuaW5zdGFsbCwKIAkuaXJxX2hhbmRsZXIgPSB2bXdfaXJxX2hhbmRsZXIsCiAJLmdldF92YmxhbmtfY291bnRlciA9IHZtd19nZXRfdmJsYW5rX2NvdW50ZXIsCisJLmVuYWJsZV92YmxhbmsgPSB2bXdfZW5hYmxlX3ZibGFuaywKKwkuZGlzYWJsZV92YmxhbmsgPSB2bXdfZGlzYWJsZV92YmxhbmssCiAJLnJlY2xhaW1fYnVmZmVyc19sb2NrZWQgPSBOVUxMLAogCS5pb2N0bHMgPSB2bXdfaW9jdGxzLAogCS5udW1faW9jdGxzID0gRFJNX0FSUkFZX1NJWkUodm13X2lvY3RscyksCkBAIC05MDIsNyArMTA5NCw4IEBACiAJCSAucmVsZWFzZSA9IGRybV9yZWxlYXNlLAogCQkgLnVubG9ja2VkX2lvY3RsID0gdm13X3VubG9ja2VkX2lvY3RsLAogCQkgLm1tYXAgPSB2bXdfbW1hcCwKLQkJIC5wb2xsID0gZHJtX3BvbGwsCisJCSAucG9sbCA9IHZtd19mb3BzX3BvbGwsCisJCSAucmVhZCA9IHZtd19mb3BzX3JlYWQsCiAJCSAuZmFzeW5jID0gZHJtX2Zhc3luYywKICNpZiBkZWZpbmVkKENPTkZJR19DT01QQVQpCiAJCSAuY29tcGF0X2lvY3RsID0gZHJtX2NvbXBhdF9pb2N0bCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKaW5kZXggMTBmYzAxZi4uOGNjYTkxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKQEAgLTM4LDIwICszOCwyNyBAQAogI2luY2x1ZGUgInR0bS90dG1fbG9jay5oIgogI2luY2x1ZGUgInR0bS90dG1fZXhlY2J1Zl91dGlsLmgiCiAjaW5jbHVkZSAidHRtL3R0bV9tb2R1bGUuaCIKKyNpbmNsdWRlICJ2bXdnZnhfZmVuY2UuaCIKIAotI2RlZmluZSBWTVdHRlhfRFJJVkVSX0RBVEUgIjIwMTAwOTI3IgotI2RlZmluZSBWTVdHRlhfRFJJVkVSX01BSk9SIDEKLSNkZWZpbmUgVk1XR0ZYX0RSSVZFUl9NSU5PUiA0CisjZGVmaW5lIFZNV0dGWF9EUklWRVJfREFURSAiMjAxMTEwMjUiCisjZGVmaW5lIFZNV0dGWF9EUklWRVJfTUFKT1IgMgorI2RlZmluZSBWTVdHRlhfRFJJVkVSX01JTk9SIDMKICNkZWZpbmUgVk1XR0ZYX0RSSVZFUl9QQVRDSExFVkVMIDAKICNkZWZpbmUgVk1XR0ZYX0ZJTEVfUEFHRV9PRkZTRVQgMHgwMDEwMDAwMAogI2RlZmluZSBWTVdHRlhfRklGT19TVEFUSUNfU0laRSAoMTAyNCoxMDI0KQogI2RlZmluZSBWTVdHRlhfTUFYX1JFTE9DQVRJT05TIDIwNDgKLSNkZWZpbmUgVk1XR0ZYX01BWF9HTVJTIDIwNDgKKyNkZWZpbmUgVk1XR0ZYX01BWF9WQUxJREFUSU9OUyAyMDQ4CiAjZGVmaW5lIFZNV0dGWF9NQVhfRElTUExBWVMgMTYKKyNkZWZpbmUgVk1XR0ZYX0NNRF9CT1VOQ0VfSU5JVF9TSVpFIDMyNzY4CiAKICNkZWZpbmUgVk1XX1BMX0dNUiBUVE1fUExfUFJJVjAKICNkZWZpbmUgVk1XX1BMX0ZMQUdfR01SIFRUTV9QTF9GTEFHX1BSSVYwCiAKKyNkZWZpbmUgVk1XX1JFU19DT05URVhUIHR0bV9kcml2ZXJfdHlwZTAKKyNkZWZpbmUgVk1XX1JFU19TVVJGQUNFIHR0bV9kcml2ZXJfdHlwZTEKKyNkZWZpbmUgVk1XX1JFU19TVFJFQU0gdHRtX2RyaXZlcl90eXBlMgorI2RlZmluZSBWTVdfUkVTX0ZFTkNFIHR0bV9kcml2ZXJfdHlwZTMKKwogc3RydWN0IHZtd19mcHJpdiB7CiAJc3RydWN0IGRybV9tYXN0ZXIgKmxvY2tlZF9tYXN0ZXI7CiAJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGU7CkBAIC03Miw5ICs3OSwxMSBAQAogCWludCBpZDsKIAllbnVtIHR0bV9vYmplY3RfdHlwZSByZXNfdHlwZTsKIAlib29sIGF2YWlsOworCXZvaWQgKCpyZW1vdmVfZnJvbV9saXN0cykgKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyk7CiAJdm9pZCAoKmh3X2Rlc3Ryb3kpIChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOwogCXZvaWQgKCpyZXNfZnJlZSkgKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyk7Ci0KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZhbGlkYXRlX2hlYWQ7CisJc3RydWN0IGxpc3RfaGVhZCBxdWVyeV9oZWFkOyAvKiBQcm90ZWN0ZWQgYnkgdGhlIGNtZGJ1ZiBtdXRleCAqLwogCS8qIFRPRE8gaXMgYSBnZW5lcmljIHNub29wZXIgbmVlZGVkPyAqLwogI2lmIDAKIAl2b2lkICgqc25vb3ApKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcywKQEAgLTkwLDggKzk5LDEyIEBACiAJdWludDMyX3QgKmltYWdlOwogfTsKIAorc3RydWN0IHZtd19mcmFtZWJ1ZmZlcjsKK3N0cnVjdCB2bXdfc3VyZmFjZV9vZmZzZXQ7CisKIHN0cnVjdCB2bXdfc3VyZmFjZSB7CiAJc3RydWN0IHZtd19yZXNvdXJjZSByZXM7CisJc3RydWN0IGxpc3RfaGVhZCBscnVfaGVhZDsgLyogUHJvdGVjdGVkIGJ5IHRoZSByZXNvdXJjZSBsb2NrICovCiAJdWludDMyX3QgZmxhZ3M7CiAJdWludDMyX3QgZm9ybWF0OwogCXVpbnQzMl90IG1pcF9sZXZlbHNbRFJNX1ZNV19NQVhfU1VSRkFDRV9GQUNFU107CkBAIC0xMDIsOSArMTE1LDEyIEBACiAKIAkvKiBUT0RPIHNvIGZhciBqdXN0IGEgZXh0cmEgcG9pbnRlciAqLwogCXN0cnVjdCB2bXdfY3Vyc29yX3Nub29wZXIgc25vb3BlcjsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJhY2t1cDsKKwlzdHJ1Y3Qgdm13X3N1cmZhY2Vfb2Zmc2V0ICpvZmZzZXRzOworCXVpbnQzMl90IGJhY2t1cF9zaXplOwogfTsKIAotc3RydWN0IHZtd19mZW5jZV9xdWV1ZSB7CitzdHJ1Y3Qgdm13X21hcmtlcl9xdWV1ZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwogCXN0cnVjdCB0aW1lc3BlYyBsYWc7CiAJc3RydWN0IHRpbWVzcGVjIGxhZ190aW1lOwpAQCAtMTE1LDE2ICsxMzEsMTIgQEAKIAl1bnNpZ25lZCBsb25nIHJlc2VydmVkX3NpemU7CiAJX19sZTMyICpkeW5hbWljX2J1ZmZlcjsKIAlfX2xlMzIgKnN0YXRpY19idWZmZXI7Ci0JX19sZTMyICpsYXN0X2J1ZmZlcjsKLQl1aW50MzJfdCBsYXN0X2RhdGFfc2l6ZTsKLQl1aW50MzJfdCBsYXN0X2J1ZmZlcl9zaXplOwotCWJvb2wgbGFzdF9idWZmZXJfYWRkOwogCXVuc2lnbmVkIGxvbmcgc3RhdGljX2J1ZmZlcl9zaXplOwogCWJvb2wgdXNpbmdfYm91bmNlX2J1ZmZlcjsKIAl1aW50MzJfdCBjYXBhYmlsaXRpZXM7CiAJc3RydWN0IG11dGV4IGZpZm9fbXV0ZXg7CiAJc3RydWN0IHJ3X3NlbWFwaG9yZSByd3NlbTsKLQlzdHJ1Y3Qgdm13X2ZlbmNlX3F1ZXVlIGZlbmNlX3F1ZXVlOworCXN0cnVjdCB2bXdfbWFya2VyX3F1ZXVlIG1hcmtlcl9xdWV1ZTsKIH07CiAKIHN0cnVjdCB2bXdfcmVsb2NhdGlvbiB7CkBAIC0xMzYsNiArMTQ4LDggQEAKIAlzdHJ1Y3QgaWRhIGJvX2xpc3Q7CiAJdWludDMyX3QgbGFzdF9jaWQ7CiAJYm9vbCBjaWRfdmFsaWQ7CisJYm9vbCBrZXJuZWw7IC8qKjwgaXMgdGhlIGNhbGxlZCBtYWRlIGZyb20gdGhlIGtlcm5lbCAqLworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKmN1cl9jdHg7CiAJdWludDMyX3QgbGFzdF9zaWQ7CiAJdWludDMyX3Qgc2lkX3RyYW5zbGF0aW9uOwogCWJvb2wgc2lkX3ZhbGlkOwpAQCAtMTQzLDggKzE1NywxNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdmFsaWRhdGVfbm9kZXM7CiAJc3RydWN0IHZtd19yZWxvY2F0aW9uIHJlbG9jc1tWTVdHRlhfTUFYX1JFTE9DQVRJT05TXTsKIAl1aW50MzJfdCBjdXJfcmVsb2M7Ci0Jc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgdmFsX2J1ZnNbVk1XR0ZYX01BWF9HTVJTXTsKKwlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciB2YWxfYnVmc1tWTVdHRlhfTUFYX1ZBTElEQVRJT05TXTsKIAl1aW50MzJfdCBjdXJfdmFsX2J1ZjsKKwl1aW50MzJfdCAqY21kX2JvdW5jZTsKKwl1aW50MzJfdCBjbWRfYm91bmNlX3NpemU7CisJc3RydWN0IGxpc3RfaGVhZCByZXNvdXJjZV9saXN0OworCXVpbnQzMl90IGZlbmNlX2ZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgcXVlcnlfbGlzdDsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmN1cl9xdWVyeV9ibzsKKwl1aW50MzJfdCBjdXJfcXVlcnlfY2lkOworCWJvb2wgcXVlcnlfY2lkX3ZhbGlkOwogfTsKIAogc3RydWN0IHZtd19sZWdhY3lfZGlzcGxheTsKQEAgLTE4NSw2ICsyMDcsOCBAQAogCXVpbnQzMl90IGNhcGFiaWxpdGllczsKIAl1aW50MzJfdCBtYXhfZ21yX2Rlc2NyaXB0b3JzOwogCXVpbnQzMl90IG1heF9nbXJfaWRzOworCXVpbnQzMl90IG1heF9nbXJfcGFnZXM7CisJdWludDMyX3QgbWVtb3J5X3NpemU7CiAJYm9vbCBoYXNfZ21yOwogCXN0cnVjdCBtdXRleCBod19tdXRleDsKIApAQCAtMTk1LDEyICsyMTksNyBAQAogCXN0cnVjdCB2bXdfdmdhX3RvcG9sb2d5X3N0YXRlIHZnYV9zYXZlW1ZNV0dGWF9NQVhfRElTUExBWVNdOwogCXVpbnQzMl90IHZnYV93aWR0aDsKIAl1aW50MzJfdCB2Z2FfaGVpZ2h0OwotCXVpbnQzMl90IHZnYV9kZXB0aDsKIAl1aW50MzJfdCB2Z2FfYnBwOwotCXVpbnQzMl90IHZnYV9wc2V1ZG87Ci0JdWludDMyX3QgdmdhX3JlZF9tYXNrOwotCXVpbnQzMl90IHZnYV9ncmVlbl9tYXNrOwotCXVpbnQzMl90IHZnYV9ibHVlX21hc2s7CiAJdWludDMyX3QgdmdhX2JwbDsKIAl1aW50MzJfdCB2Z2FfcGl0Y2hsb2NrOwogCkBAIC0yMTIsNiArMjMxLDcgQEAKIAogCXZvaWQgKmZiX2luZm87CiAJc3RydWN0IHZtd19sZWdhY3lfZGlzcGxheSAqbGR1X3ByaXY7CisJc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X2Rpc3BsYXkgKnNvdV9wcml2OwogCXN0cnVjdCB2bXdfb3ZlcmxheSAqb3ZlcmxheV9wcml2OwogCiAJLyoKQEAgLTI0MCwxMyArMjYwLDE2IEBACiAJICogRmVuY2luZyBhbmQgSVJRcy4KIAkgKi8KIAotCWF0b21pY190IGZlbmNlX3NlcTsKKwlhdG9taWNfdCBtYXJrZXJfc2VxOwogCXdhaXRfcXVldWVfaGVhZF90IGZlbmNlX3F1ZXVlOwogCXdhaXRfcXVldWVfaGVhZF90IGZpZm9fcXVldWU7Ci0JYXRvbWljX3QgZmVuY2VfcXVldWVfd2FpdGVyczsKKwlpbnQgZmVuY2VfcXVldWVfd2FpdGVyczsgLyogUHJvdGVjdGVkIGJ5IGh3X211dGV4ICovCisJaW50IGdvYWxfcXVldWVfd2FpdGVyczsgLyogUHJvdGVjdGVkIGJ5IGh3X211dGV4ICovCiAJYXRvbWljX3QgZmlmb19xdWV1ZV93YWl0ZXJzOwotCXVpbnQzMl90IGxhc3RfcmVhZF9zZXF1ZW5jZTsKKwl1aW50MzJfdCBsYXN0X3JlYWRfc2Vxbm87CiAJc3BpbmxvY2tfdCBpcnFfbG9jazsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW47CisJdWludDMyX3QgaXJxX21hc2s7CiAKIAkvKgogCSAqIERldmljZSBzdGF0ZQpAQCAtMjg1LDYgKzMwOCwyNiBAQAogCiAJc3RydWN0IG11dGV4IHJlbGVhc2VfbXV0ZXg7CiAJdWludDMyX3QgbnVtXzNkX3Jlc291cmNlczsKKworCS8qCisJICogUXVlcnkgcHJvY2Vzc2luZy4gVGhlc2UgbWVtYmVycworCSAqIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGNtZGJ1ZiBtdXRleC4KKwkgKi8KKworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqZHVtbXlfcXVlcnlfYm87CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpwaW5uZWRfYm87CisJdWludDMyX3QgcXVlcnlfY2lkOworCWJvb2wgZHVtbXlfcXVlcnlfYm9fcGlubmVkOworCisJLyoKKwkgKiBTdXJmYWNlIHN3YXBwaW5nLiBUaGUgInN1cmZhY2VfbHJ1IiBsaXN0IGlzIHByb3RlY3RlZCBieSB0aGUKKwkgKiByZXNvdXJjZSBsb2NrIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZGVzdHJveSBhIHN1cmZhY2UgYW5kIHRha2UKKwkgKiBpdCBvZmYgdGhlIGxydSBhdG9taWNhbGx5LiAidXNlZF9tZW1vcnlfc2l6ZSIgaXMgY3VycmVudGx5CisJICogcHJvdGVjdGVkIGJ5IHRoZSBjbWRidWYgbXV0ZXggZm9yIHNpbXBsaWNpdHkuCisJICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1cmZhY2VfbHJ1OworCXVpbnQzMl90IHVzZWRfbWVtb3J5X3NpemU7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTMxOSw4ICszNjIsOCBAQAogCXJldHVybiB2YWw7CiB9CiAKLWludCB2bXdfM2RfcmVzb3VyY2VfaW5jKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpOwotdm9pZCB2bXdfM2RfcmVzb3VyY2VfZGVjKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpOworaW50IHZtd18zZF9yZXNvdXJjZV9pbmMoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgYm9vbCB1bmhpZGVfc3ZnYSk7Cit2b2lkIHZtd18zZF9yZXNvdXJjZV9kZWMoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgYm9vbCBoaWRlX3N2Z2EpOwogCiAvKioKICAqIEdNUiB1dGlsaXRpZXMgLSB2bXdnZnhfZ21yLmMKQEAgLTM0NSw3ICszODgsOCBAQAogCQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gaW50IHZtd19jb250ZXh0X2NoZWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkgICAgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAotCQkJICAgICBpbnQgaWQpOworCQkJICAgICBpbnQgaWQsCisJCQkgICAgIHN0cnVjdCB2bXdfcmVzb3VyY2UgKipwX3Jlcyk7CiBleHRlcm4gdm9pZCB2bXdfc3VyZmFjZV9yZXNfZnJlZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOwogZXh0ZXJuIGludCB2bXdfc3VyZmFjZV9pbml0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkgICAgc3RydWN0IHZtd19zdXJmYWNlICpzcmYsCkBAIC0zNjMsNiArNDA3LDggQEAKIGV4dGVybiBpbnQgdm13X3N1cmZhY2VfY2hlY2soc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCSAgICAgc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCiAJCQkgICAgIHVpbnQzMl90IGhhbmRsZSwgaW50ICppZCk7CitleHRlcm4gaW50IHZtd19zdXJmYWNlX3ZhbGlkYXRlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJc3RydWN0IHZtd19zdXJmYWNlICpzcmYpOwogZXh0ZXJuIHZvaWQgdm13X2RtYWJ1Zl9ib19mcmVlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOwogZXh0ZXJuIGludCB2bXdfZG1hYnVmX2luaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCSAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqdm13X2JvLApAQCAtMzc4LDEwICs0MjQsNiBAQAogZXh0ZXJuIHZvaWQgdm13X2RtYWJ1Zl92YWxpZGF0ZV9jbGVhcihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKIGV4dGVybiBpbnQgdm13X3VzZXJfZG1hYnVmX2xvb2t1cChzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKIAkJCQkgIHVpbnQzMl90IGlkLCBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKipvdXQpOwotZXh0ZXJuIGludCB2bXdfZG1hYnVmX3RvX3N0YXJ0X29mX3ZyYW0oc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdiwKLQkJCQkgICAgICAgc3RydWN0IHZtd19kbWFfYnVmZmVyICpibyk7Ci1leHRlcm4gaW50IHZtd19kbWFidWZfZnJvbV92cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYsCi0JCQkJc3RydWN0IHZtd19kbWFfYnVmZmVyICpibyk7CiBleHRlcm4gaW50IHZtd19zdHJlYW1fY2xhaW1faW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGV4dGVybiBpbnQgdm13X3N0cmVhbV91bnJlZl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLApAQCAtMzkwLDcgKzQzMiwzMCBAQAogCQkJCSAgc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCiAJCQkJICB1aW50MzJfdCAqaW5vdXRfaWQsCiAJCQkJICBzdHJ1Y3Qgdm13X3Jlc291cmNlICoqb3V0KTsKK2V4dGVybiB2b2lkIHZtd19yZXNvdXJjZV91bnJlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CiAKKy8qKgorICogRE1BIGJ1ZmZlciBoZWxwZXIgcm91dGluZXMgLSB2bXdnZnhfZG1hYnVmLmMKKyAqLworZXh0ZXJuIGludCB2bXdfZG1hYnVmX3RvX3BsYWNlbWVudChzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAorCQkJCSAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYm8sCisJCQkJICAgc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCwKKwkJCQkgICBib29sIGludGVycnVwdGlibGUpOworZXh0ZXJuIGludCB2bXdfZG1hYnVmX3RvX3ZyYW0oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYnVmLAorCQkJICAgICAgYm9vbCBwaW4sIGJvb2wgaW50ZXJydXB0aWJsZSk7CitleHRlcm4gaW50IHZtd19kbWFidWZfdG9fdnJhbV9vcl9nbXIoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYnVmLAorCQkJCSAgICAgYm9vbCBwaW4sIGJvb2wgaW50ZXJydXB0aWJsZSk7CitleHRlcm4gaW50IHZtd19kbWFidWZfdG9fc3RhcnRfb2ZfdnJhbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAorCQkJCSAgICAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJvLAorCQkJCSAgICAgICBib29sIHBpbiwgYm9vbCBpbnRlcnJ1cHRpYmxlKTsKK2V4dGVybiBpbnQgdm13X2RtYWJ1Zl91bnBpbihzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAorCQkJICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYm8sCisJCQkgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKTsKK2V4dGVybiB2b2lkIHZtd19ib19nZXRfZ3Vlc3RfcHRyKGNvbnN0IHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYnVmLAorCQkJCSBTVkdBR3Vlc3RQdHIgKnB0cik7CitleHRlcm4gdm9pZCB2bXdfYm9fcGluKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIGJvb2wgcGluKTsKIAogLyoqCiAgKiBNaXNjIElvY3RsIGZ1bmN0aW9uYWxpdHkgLSB2bXdnZnhfaW9jdGwuYwpAQCAtMzk4LDggKzQ2MywxNiBAQAogCiBleHRlcm4gaW50IHZtd19nZXRwYXJhbV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwotZXh0ZXJuIGludCB2bXdfZmlmb19kZWJ1Z19pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorZXh0ZXJuIGludCB2bXdfZ2V0X2NhcF8zZF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgdm13X3ByZXNlbnRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGludCB2bXdfcHJlc2VudF9yZWFkYmFja19pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdm13X2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7CitleHRlcm4gc3NpemVfdCB2bXdfZm9wc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KTsKIAogLyoqCiAgKiBGaWZvIHV0aWxpdGllcyAtIHZtd2dmeF9maWZvLmMKQEAgLTQxMiwxMSArNDg1LDEyIEBACiBleHRlcm4gdm9pZCAqdm13X2ZpZm9fcmVzZXJ2ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCB1aW50MzJfdCBieXRlcyk7CiBleHRlcm4gdm9pZCB2bXdfZmlmb19jb21taXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdWludDMyX3QgYnl0ZXMpOwogZXh0ZXJuIGludCB2bXdfZmlmb19zZW5kX2ZlbmNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkgICAgICAgdWludDMyX3QgKnNlcXVlbmNlKTsKKwkJCSAgICAgICB1aW50MzJfdCAqc2Vxbm8pOwogZXh0ZXJuIHZvaWQgdm13X2ZpZm9fcGluZ19ob3N0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90IHJlYXNvbik7Ci1leHRlcm4gaW50IHZtd19maWZvX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIGV4dGVybiBib29sIHZtd19maWZvX2hhdmVfM2Qoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CiBleHRlcm4gYm9vbCB2bXdfZmlmb19oYXZlX3BpdGNobG9jayhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKK2V4dGVybiBpbnQgdm13X2ZpZm9fZW1pdF9kdW1teV9xdWVyeShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSAgICAgdWludDMyX3QgY2lkKTsKIAogLyoqCiAgKiBUVE0gZ2x1ZSAtIHZtd2dmeF90dG1fZ2x1ZS5jCkBAIC00MzQsNyArNTA4LDEwIEBACiBleHRlcm4gc3RydWN0IHR0bV9wbGFjZW1lbnQgdm13X3ZyYW1fbmVfcGxhY2VtZW50OwogZXh0ZXJuIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd192cmFtX3N5c19wbGFjZW1lbnQ7CiBleHRlcm4gc3RydWN0IHR0bV9wbGFjZW1lbnQgdm13X3ZyYW1fZ21yX3BsYWNlbWVudDsKK2V4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfdnJhbV9nbXJfbmVfcGxhY2VtZW50OwogZXh0ZXJuIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd19zeXNfcGxhY2VtZW50OworZXh0ZXJuIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd19ldmljdGFibGVfcGxhY2VtZW50OworZXh0ZXJuIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd19zcmZfcGxhY2VtZW50OwogZXh0ZXJuIHN0cnVjdCB0dG1fYm9fZHJpdmVyIHZtd19ib19kcml2ZXI7CiBleHRlcm4gaW50IHZtd19kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCkBAIC00NDQsNDUgKzUyMSw3MCBAQAogCiBleHRlcm4gaW50IHZtd19leGVjYnVmX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgdm13X2V4ZWNidWZfcHJvY2VzcyhzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgICAgIHZvaWQgX191c2VyICp1c2VyX2NvbW1hbmRzLAorCQkJICAgICAgIHZvaWQgKmtlcm5lbF9jb21tYW5kcywKKwkJCSAgICAgICB1aW50MzJfdCBjb21tYW5kX3NpemUsCisJCQkgICAgICAgdWludDY0X3QgdGhyb3R0bGVfdXMsCisJCQkgICAgICAgc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIF9fdXNlcgorCQkJICAgICAgICp1c2VyX2ZlbmNlX3JlcCk7CisKK2V4dGVybiB2b2lkCit2bXdfZXhlY2J1Zl9yZWxlYXNlX3Bpbm5lZF9ibyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgICAgYm9vbCBvbmx5X29uX2NpZF9tYXRjaCwgdWludDMyX3QgY2lkKTsKKworZXh0ZXJuIGludCB2bXdfZXhlY2J1Zl9mZW5jZV9jb21tYW5kcyhzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSAgICAgIHN0cnVjdCB2bXdfZmVuY2Vfb2JqICoqcF9mZW5jZSwKKwkJCQkgICAgICB1aW50MzJfdCAqcF9oYW5kbGUpOworZXh0ZXJuIHZvaWQgdm13X2V4ZWNidWZfY29weV9mZW5jZV91c2VyKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJCXN0cnVjdCB2bXdfZnByaXYgKnZtd19mcCwKKwkJCQkJaW50IHJldCwKKwkJCQkJc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIF9fdXNlcgorCQkJCQkqdXNlcl9mZW5jZV9yZXAsCisJCQkJCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSwKKwkJCQkJdWludDMyX3QgZmVuY2VfaGFuZGxlKTsKIAogLyoqCiAgKiBJUlFzIGFuZCB3YXRpbmcgLSB2bXdnZnhfaXJxLmMKICAqLwogCiBleHRlcm4gaXJxcmV0dXJuX3Qgdm13X2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gaW50IHZtd193YWl0X2ZlbmNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIGJvb2wgbGF6eSwKLQkJCSAgdWludDMyX3Qgc2VxdWVuY2UsIGJvb2wgaW50ZXJydXB0aWJsZSwKLQkJCSAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKK2V4dGVybiBpbnQgdm13X3dhaXRfc2Vxbm8oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgYm9vbCBsYXp5LAorCQkJICAgICB1aW50MzJfdCBzZXFubywgYm9vbCBpbnRlcnJ1cHRpYmxlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwogZXh0ZXJuIHZvaWQgdm13X2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCB2bXdfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgdm13X2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci1leHRlcm4gYm9vbCB2bXdfZmVuY2Vfc2lnbmFsZWQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKLQkJCSAgICAgICB1aW50MzJfdCBzZXF1ZW5jZSk7Ci1leHRlcm4gaW50IHZtd19mZW5jZV93YWl0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGJvb2wgdm13X3NlcW5vX3Bhc3NlZChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCXVpbnQzMl90IHNlcW5vKTsKIGV4dGVybiBpbnQgdm13X2ZhbGxiYWNrX3dhaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCSAgICAgYm9vbCBsYXp5LAogCQkJICAgICBib29sIGZpZm9faWRsZSwKLQkJCSAgICAgdWludDMyX3Qgc2VxdWVuY2UsCisJCQkgICAgIHVpbnQzMl90IHNlcW5vLAogCQkJICAgICBib29sIGludGVycnVwdGlibGUsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7Ci1leHRlcm4gdm9pZCB2bXdfdXBkYXRlX3NlcXVlbmNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCitleHRlcm4gdm9pZCB2bXdfdXBkYXRlX3NlcW5vKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkJc3RydWN0IHZtd19maWZvX3N0YXRlICpmaWZvX3N0YXRlKTsKLQorZXh0ZXJuIHZvaWQgdm13X3NlcW5vX3dhaXRlcl9hZGQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CitleHRlcm4gdm9pZCB2bXdfc2Vxbm9fd2FpdGVyX3JlbW92ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKK2V4dGVybiB2b2lkIHZtd19nb2FsX3dhaXRlcl9hZGQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CitleHRlcm4gdm9pZCB2bXdfZ29hbF93YWl0ZXJfcmVtb3ZlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpOwogCiAvKioKLSAqIFJ1ZGltZW50YXJ5IGZlbmNlIG9iamVjdHMgY3VycmVudGx5IHVzZWQgb25seSBmb3IgdGhyb3R0bGluZyAtCi0gKiB2bXdnZnhfZmVuY2UuYworICogUnVkaW1lbnRhcnkgZmVuY2UtbGlrZSBvYmplY3RzIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRocm90dGxpbmcgLQorICogdm13Z2Z4X21hcmtlci5jCiAgKi8KIAotZXh0ZXJuIHZvaWQgdm13X2ZlbmNlX3F1ZXVlX2luaXQoc3RydWN0IHZtd19mZW5jZV9xdWV1ZSAqcXVldWUpOwotZXh0ZXJuIHZvaWQgdm13X2ZlbmNlX3F1ZXVlX3Rha2Vkb3duKHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlKTsKLWV4dGVybiBpbnQgdm13X2ZlbmNlX3B1c2goc3RydWN0IHZtd19mZW5jZV9xdWV1ZSAqcXVldWUsCi0JCQkgIHVpbnQzMl90IHNlcXVlbmNlKTsKLWV4dGVybiBpbnQgdm13X2ZlbmNlX3B1bGwoc3RydWN0IHZtd19mZW5jZV9xdWV1ZSAqcXVldWUsCi0JCQkgIHVpbnQzMl90IHNpZ25hbGVkX3NlcXVlbmNlKTsKK2V4dGVybiB2b2lkIHZtd19tYXJrZXJfcXVldWVfaW5pdChzdHJ1Y3Qgdm13X21hcmtlcl9xdWV1ZSAqcXVldWUpOworZXh0ZXJuIHZvaWQgdm13X21hcmtlcl9xdWV1ZV90YWtlZG93bihzdHJ1Y3Qgdm13X21hcmtlcl9xdWV1ZSAqcXVldWUpOworZXh0ZXJuIGludCB2bXdfbWFya2VyX3B1c2goc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlLAorCQkJICB1aW50MzJfdCBzZXFubyk7CitleHRlcm4gaW50IHZtd19tYXJrZXJfcHVsbChzdHJ1Y3Qgdm13X21hcmtlcl9xdWV1ZSAqcXVldWUsCisJCQkgIHVpbnQzMl90IHNpZ25hbGVkX3NlcW5vKTsKIGV4dGVybiBpbnQgdm13X3dhaXRfbGFnKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQlzdHJ1Y3Qgdm13X2ZlbmNlX3F1ZXVlICpxdWV1ZSwgdWludDMyX3QgdXMpOworCQkJc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlLCB1aW50MzJfdCB1cyk7CiAKIC8qKgogICogS2VybmVsIGZyYW1lYnVmZmVyIC0gdm13Z2Z4X2ZiLmMKQEAgLTUwOCwxNiArNjEwLDMxIEBACiAJCQkgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAogCQkJICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAogCQkJICBTVkdBM2RDbWRIZWFkZXIgKmhlYWRlcik7Ci12b2lkIHZtd19rbXNfd3JpdGVfc3ZnYShzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAotCQkJdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgcGl0Y2gsCi0JCQl1bnNpZ25lZCBiYnAsIHVuc2lnbmVkIGRlcHRoKTsKLWludCB2bXdfa21zX3VwZGF0ZV9sYXlvdXRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitpbnQgdm13X2ttc193cml0ZV9zdmdhKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYsCisJCSAgICAgICB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBwaXRjaCwKKwkJICAgICAgIHVuc2lnbmVkIGJwcCwgdW5zaWduZWQgZGVwdGgpOwogdm9pZCB2bXdfa21zX2lkbGVfd29ya3F1ZXVlcyhzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3Rlcik7CiBib29sIHZtd19rbXNfdmFsaWRhdGVfbW9kZV92cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkJdWludDMyX3QgcGl0Y2gsCiAJCQkJdWludDMyX3QgaGVpZ2h0KTsKIHUzMiB2bXdfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKK2ludCB2bXdfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7Cit2b2lkIHZtd19kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CitpbnQgdm13X2ttc19wcmVzZW50KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJICAgIHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYiwKKwkJICAgIHN0cnVjdCB2bXdfc3VyZmFjZSAqc3VyZmFjZSwKKwkJICAgIHVpbnQzMl90IHNpZCwgaW50MzJfdCBkZXN0WCwgaW50MzJfdCBkZXN0WSwKKwkJICAgIHN0cnVjdCBkcm1fdm13X3JlY3QgKmNsaXBzLAorCQkgICAgdWludDMyX3QgbnVtX2NsaXBzKTsKK2ludCB2bXdfa21zX3JlYWRiYWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCSAgICAgc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiLAorCQkgICAgIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIgKnVzZXJfZmVuY2VfcmVwLAorCQkgICAgIHN0cnVjdCBkcm1fdm13X3JlY3QgKmNsaXBzLAorCQkgICAgIHVpbnQzMl90IG51bV9jbGlwcyk7CitpbnQgdm13X2ttc191cGRhdGVfbGF5b3V0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogCiAvKioKICAqIE92ZXJsYXkgY29udHJvbCAtIHZtd2dmeF9vdmVybGF5LmMKQEAgLTU3Niw0ICs2OTMsOCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqdm13X21lbV9nbG9iKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJcmV0dXJuIChzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKikgZGV2X3ByaXYtPm1lbV9nbG9iYWxfcmVmLm9iamVjdDsKK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZXhlY2J1Zi5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZXhlY2J1Zi5jCmluZGV4IDQxYjk1ZWQuLjQwOTMyZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2V4ZWNidWYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9leGVjYnVmLmMKQEAgLTQ0LDEwICs0NCw3MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB2bXdfcmVzb3VyY2VfdG9fdmFsaWRhdGVfbGlzdChzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCisJCQkJCSAgc3RydWN0IHZtd19yZXNvdXJjZSAqKnBfcmVzKQoreworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyA9ICpwX3JlczsKKworCWlmIChsaXN0X2VtcHR5KCZyZXMtPnZhbGlkYXRlX2hlYWQpKSB7CisJCWxpc3RfYWRkX3RhaWwoJnJlcy0+dmFsaWRhdGVfaGVhZCwgJnN3X2NvbnRleHQtPnJlc291cmNlX2xpc3QpOworCQkqcF9yZXMgPSBOVUxMOworCX0gZWxzZQorCQl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UocF9yZXMpOworfQorCisvKioKKyAqIHZtd19ib190b192YWxpZGF0ZV9saXN0IC0gYWRkIGEgYm8gdG8gYSB2YWxpZGF0ZSBsaXN0CisgKgorICogQHN3X2NvbnRleHQ6IFRoZSBzb2Z0d2FyZSBjb250ZXh0IHVzZWQgZm9yIHRoaXMgY29tbWFuZCBzdWJtaXNzaW9uIGJhdGNoLgorICogQGJvOiBUaGUgYnVmZmVyIG9iamVjdCB0byBhZGQuCisgKiBAZmVuY2VfZmxhZ3M6IEZlbmNlIGZsYWdzIHRvIGJlIG9yJ2VkIHdpdGggYW55IG90aGVyIGZlbmNlIGZsYWdzIGZvcgorICogdGhpcyBidWZmZXIgb24gdGhpcyBzdWJtaXNzaW9uIGJhdGNoLgorICogQHBfdmFsX25vZGU6IElmIG5vbi1OVUxMIFdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSB2YWxpZGF0ZSBub2RlIG51bWJlcgorICogb24gcmV0dXJuLgorICoKKyAqIFJldHVybnMgLUVJTlZBTCBpZiB0aGUgbGltaXQgb2YgbnVtYmVyIG9mIGJ1ZmZlciBvYmplY3RzIHBlciBjb21tYW5kCisgKiBzdWJtaXNzaW9uIGlzIHJlYWNoZWQuCisgKi8KK3N0YXRpYyBpbnQgdm13X2JvX3RvX3ZhbGlkYXRlX2xpc3Qoc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCSAgIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCisJCQkJICAgdWludDMyX3QgZmVuY2VfZmxhZ3MsCisJCQkJICAgdWludDMyX3QgKnBfdmFsX25vZGUpCit7CisJdWludDMyX3QgdmFsX25vZGU7CisJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKnZhbF9idWY7CisKKwl2YWxfbm9kZSA9IHZtd19kbWFidWZfdmFsaWRhdGVfbm9kZShibywgc3dfY29udGV4dC0+Y3VyX3ZhbF9idWYpOworCisJaWYgKHVubGlrZWx5KHZhbF9ub2RlID49IFZNV0dGWF9NQVhfVkFMSURBVElPTlMpKSB7CisJCURSTV9FUlJPUigiTWF4IG51bWJlciBvZiBETUEgYnVmZmVycyBwZXIgc3VibWlzc2lvbiIKKwkJCSAgIiBleGNlZWRlZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2YWxfYnVmID0gJnN3X2NvbnRleHQtPnZhbF9idWZzW3ZhbF9ub2RlXTsKKwlpZiAodW5saWtlbHkodmFsX25vZGUgPT0gc3dfY29udGV4dC0+Y3VyX3ZhbF9idWYpKSB7CisJCXZhbF9idWYtPm5ld19zeW5jX29ial9hcmcgPSBOVUxMOworCQl2YWxfYnVmLT5ibyA9IHR0bV9ib19yZWZlcmVuY2UoYm8pOworCQlsaXN0X2FkZF90YWlsKCZ2YWxfYnVmLT5oZWFkLCAmc3dfY29udGV4dC0+dmFsaWRhdGVfbm9kZXMpOworCQkrK3N3X2NvbnRleHQtPmN1cl92YWxfYnVmOworCX0KKworCXZhbF9idWYtPm5ld19zeW5jX29ial9hcmcgPSAodm9pZCAqKQorCQkoKHVuc2lnbmVkIGxvbmcpIHZhbF9idWYtPm5ld19zeW5jX29ial9hcmcgfCBmZW5jZV9mbGFncyk7CisJc3dfY29udGV4dC0+ZmVuY2VfZmxhZ3MgfD0gZmVuY2VfZmxhZ3M7CisKKwlpZiAocF92YWxfbm9kZSkKKwkJKnBfdmFsX25vZGUgPSB2YWxfbm9kZTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHZtd19jbWRfY2lkX2NoZWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKIAkJCSAgICAgU1ZHQTNkQ21kSGVhZGVyICpoZWFkZXIpCiB7CisJc3RydWN0IHZtd19yZXNvdXJjZSAqY3R4OworCiAJc3RydWN0IHZtd19jaWRfY21kIHsKIAkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKIAkJX19sZTMyIGNpZDsKQEAgLTU4LDcgKzExOSw4IEBACiAJaWYgKGxpa2VseShzd19jb250ZXh0LT5jaWRfdmFsaWQgJiYgY21kLT5jaWQgPT0gc3dfY29udGV4dC0+bGFzdF9jaWQpKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHZtd19jb250ZXh0X2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LT50ZmlsZSwgY21kLT5jaWQpOworCXJldCA9IHZtd19jb250ZXh0X2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LT50ZmlsZSwgY21kLT5jaWQsCisJCQkJJmN0eCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQlEUk1fRVJST1IoIkNvdWxkIG5vdCBmaW5kIG9yIHVzZSBjb250ZXh0ICV1XG4iLAogCQkJICAodW5zaWduZWQpIGNtZC0+Y2lkKTsKQEAgLTY3LDYgKzEyOSw4IEBACiAKIAlzd19jb250ZXh0LT5sYXN0X2NpZCA9IGNtZC0+Y2lkOwogCXN3X2NvbnRleHQtPmNpZF92YWxpZCA9IHRydWU7CisJc3dfY29udGV4dC0+Y3VyX2N0eCA9IGN0eDsKKwl2bXdfcmVzb3VyY2VfdG9fdmFsaWRhdGVfbGlzdChzd19jb250ZXh0LCAmY3R4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNzUsMjkgKzEzOSw0NSBAQAogCQkJICAgICBzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCiAJCQkgICAgIHVpbnQzMl90ICpzaWQpCiB7CisJc3RydWN0IHZtd19zdXJmYWNlICpzcmY7CisJaW50IHJldDsKKwlzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXM7CisKIAlpZiAoKnNpZCA9PSBTVkdBM0RfSU5WQUxJRF9JRCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAodW5saWtlbHkoKCFzd19jb250ZXh0LT5zaWRfdmFsaWQgIHx8Ci0JCSAgICAgICpzaWQgIT0gc3dfY29udGV4dC0+bGFzdF9zaWQpKSkgewotCQlpbnQgcmVhbF9pZDsKLQkJaW50IHJldCA9IHZtd19zdXJmYWNlX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LT50ZmlsZSwKLQkJCQkJICAgICpzaWQsICZyZWFsX2lkKTsKLQotCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7Ci0JCQlEUk1fRVJST1IoIkNvdWxkIG90IGZpbmQgb3IgdXNlIHN1cmZhY2UgMHglMDh4ICIKLQkJCQkgICJhZGRyZXNzIDB4JTA4bHhcbiIsCi0JCQkJICAodW5zaWduZWQgaW50KSAqc2lkLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHNpZCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJc3dfY29udGV4dC0+bGFzdF9zaWQgPSAqc2lkOwotCQlzd19jb250ZXh0LT5zaWRfdmFsaWQgPSB0cnVlOwotCQkqc2lkID0gcmVhbF9pZDsKLQkJc3dfY29udGV4dC0+c2lkX3RyYW5zbGF0aW9uID0gcmVhbF9pZDsKLQl9IGVsc2UKKwlpZiAobGlrZWx5KChzd19jb250ZXh0LT5zaWRfdmFsaWQgICYmCisJCSAgICAgICpzaWQgPT0gc3dfY29udGV4dC0+bGFzdF9zaWQpKSkgewogCQkqc2lkID0gc3dfY29udGV4dC0+c2lkX3RyYW5zbGF0aW9uOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSB2bXdfdXNlcl9zdXJmYWNlX2xvb2t1cF9oYW5kbGUoZGV2X3ByaXYsCisJCQkJCSAgICAgc3dfY29udGV4dC0+dGZpbGUsCisJCQkJCSAgICAgKnNpZCwgJnNyZik7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlEUk1fRVJST1IoIkNvdWxkIG90IGZpbmQgb3IgdXNlIHN1cmZhY2UgMHglMDh4ICIKKwkJCSAgImFkZHJlc3MgMHglMDhseFxuIiwKKwkJCSAgKHVuc2lnbmVkIGludCkgKnNpZCwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpIHNpZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gdm13X3N1cmZhY2VfdmFsaWRhdGUoZGV2X3ByaXYsIHNyZik7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJCURSTV9FUlJPUigiQ291bGQgbm90IHZhbGlkYXRlIHN1cmZhY2UuXG4iKTsKKwkJdm13X3N1cmZhY2VfdW5yZWZlcmVuY2UoJnNyZik7CisJCXJldHVybiByZXQ7CisJfQorCisJc3dfY29udGV4dC0+bGFzdF9zaWQgPSAqc2lkOworCXN3X2NvbnRleHQtPnNpZF92YWxpZCA9IHRydWU7CisJc3dfY29udGV4dC0+c2lkX3RyYW5zbGF0aW9uID0gc3JmLT5yZXMuaWQ7CisJKnNpZCA9IHN3X2NvbnRleHQtPnNpZF90cmFuc2xhdGlvbjsKKworCXJlcyA9ICZzcmYtPnJlczsKKwl2bXdfcmVzb3VyY2VfdG9fdmFsaWRhdGVfbGlzdChzd19jb250ZXh0LCAmcmVzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY2LDYgKzI0NiwxMiBAQAogCX0gKmNtZDsKIAogCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfc2lkX2NtZCwgaGVhZGVyKTsKKworCWlmICh1bmxpa2VseSghc3dfY29udGV4dC0+a2VybmVsKSkgeworCQlEUk1fRVJST1IoIktlcm5lbCBvbmx5IFNWR0EzZCBjb21tYW5kOiAldS5cbiIsIGNtZC0+aGVhZGVyLmlkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKIAlyZXR1cm4gdm13X2NtZF9zaWRfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsICZjbWQtPmJvZHkuc3JjSW1hZ2Uuc2lkKTsKIH0KIApAQCAtMTc4LDEwICsyNjQsMTc5IEBACiAJCVNWR0EzZENtZFByZXNlbnQgYm9keTsKIAl9ICpjbWQ7CiAKKwogCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfc2lkX2NtZCwgaGVhZGVyKTsKKworCWlmICh1bmxpa2VseSghc3dfY29udGV4dC0+a2VybmVsKSkgeworCQlEUk1fRVJST1IoIktlcm5lbCBvbmx5IFNWR0EzZCBjb21tYW5kOiAldS5cbiIsIGNtZC0+aGVhZGVyLmlkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKIAlyZXR1cm4gdm13X2NtZF9zaWRfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsICZjbWQtPmJvZHkuc2lkKTsKIH0KIAorLyoqCisgKiB2bXdfcXVlcnlfYm9fc3dpdGNoX3ByZXBhcmUgLSBQcmVwYXJlIHRvIHN3aXRjaCBwaW5uZWQgYnVmZmVyIGZvciBxdWVyaWVzLgorICoKKyAqIEBkZXZfcHJpdjogVGhlIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqIEBjaWQ6IFRoZSBoYXJkd2FyZSBjb250ZXh0IGZvciB0aGUgbmV4dCBxdWVyeS4KKyAqIEBuZXdfcXVlcnlfYm86IFRoZSBuZXcgYnVmZmVyIGhvbGRpbmcgcXVlcnkgcmVzdWx0cy4KKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCB1c2VkIGZvciB0aGlzIGNvbW1hbmQgc3VibWlzc2lvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIEBuZXdfcXVlcnlfYm8gaXMgc3VpdGFibGUgZm9yIGhvbGRpbmcKKyAqIHF1ZXJ5IHJlc3VsdHMsIGFuZCBpZiBhbm90aGVyIGJ1ZmZlciBjdXJyZW50bHkgaXMgcGlubmVkIGZvciBxdWVyeQorICogcmVzdWx0cy4gSWYgc28sIHRoZSBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgc3RhdGUgb2YgQHN3X2NvbnRleHQgZm9yCisgKiBzd2l0Y2hpbmcgcGlubmVkIGJ1ZmZlcnMgYWZ0ZXIgc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uIG9mIHRoZSBjdXJyZW50CisgKiBjb21tYW5kIGJhdGNoLiBJdCBhbHNvIGNoZWNrcyB3aGV0aGVyIHdlJ3JlIHVzaW5nIGEgbmV3IHF1ZXJ5IGNvbnRleHQuCisgKiBJbiB0aGF0IGNhc2UsIGl0IG1ha2VzIHN1cmUgd2UgZW1pdCBhIHF1ZXJ5IGJhcnJpZXIgZm9yIHRoZSBvbGQKKyAqIGNvbnRleHQgYmVmb3JlIHRoZSBjdXJyZW50IHF1ZXJ5IGJ1ZmZlciBpcyBmZW5jZWQuCisgKi8KK3N0YXRpYyBpbnQgdm13X3F1ZXJ5X2JvX3N3aXRjaF9wcmVwYXJlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICAgICAgIHVpbnQzMl90IGNpZCwKKwkJCQkgICAgICAgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpuZXdfcXVlcnlfYm8sCisJCQkJICAgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCkKK3sKKwlpbnQgcmV0OworCWJvb2wgYWRkX2NpZCA9IGZhbHNlOworCXVpbnQzMl90IGNpZF90b19hZGQ7CisKKwlpZiAodW5saWtlbHkobmV3X3F1ZXJ5X2JvICE9IHN3X2NvbnRleHQtPmN1cl9xdWVyeV9ibykpIHsKKworCQlpZiAodW5saWtlbHkobmV3X3F1ZXJ5X2JvLT5udW1fcGFnZXMgPiA0KSkgeworCQkJRFJNX0VSUk9SKCJRdWVyeSBidWZmZXIgdG9vIGxhcmdlLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICh1bmxpa2VseShzd19jb250ZXh0LT5jdXJfcXVlcnlfYm8gIT0gTlVMTCkpIHsKKwkJCUJVR19PTighc3dfY29udGV4dC0+cXVlcnlfY2lkX3ZhbGlkKTsKKwkJCWFkZF9jaWQgPSB0cnVlOworCQkJY2lkX3RvX2FkZCA9IHN3X2NvbnRleHQtPmN1cl9xdWVyeV9jaWQ7CisJCQlyZXQgPSB2bXdfYm9fdG9fdmFsaWRhdGVfbGlzdChzd19jb250ZXh0LAorCQkJCQkJICAgICAgc3dfY29udGV4dC0+Y3VyX3F1ZXJ5X2JvLAorCQkJCQkJICAgICAgRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUMsCisJCQkJCQkgICAgICBOVUxMKTsKKwkJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzd19jb250ZXh0LT5jdXJfcXVlcnlfYm8gPSBuZXdfcXVlcnlfYm87CisKKwkJcmV0ID0gdm13X2JvX3RvX3ZhbGlkYXRlX2xpc3Qoc3dfY29udGV4dCwKKwkJCQkJICAgICAgZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvLAorCQkJCQkgICAgICBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQywKKwkJCQkJICAgICAgTlVMTCk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlyZXR1cm4gcmV0OworCisJfQorCisJaWYgKHVubGlrZWx5KGNpZCAhPSBzd19jb250ZXh0LT5jdXJfcXVlcnlfY2lkICYmCisJCSAgICAgc3dfY29udGV4dC0+cXVlcnlfY2lkX3ZhbGlkKSkgeworCQlhZGRfY2lkID0gdHJ1ZTsKKwkJY2lkX3RvX2FkZCA9IHN3X2NvbnRleHQtPmN1cl9xdWVyeV9jaWQ7CisJfQorCisJc3dfY29udGV4dC0+Y3VyX3F1ZXJ5X2NpZCA9IGNpZDsKKwlzd19jb250ZXh0LT5xdWVyeV9jaWRfdmFsaWQgPSB0cnVlOworCisJaWYgKGFkZF9jaWQpIHsKKwkJc3RydWN0IHZtd19yZXNvdXJjZSAqY3R4ID0gc3dfY29udGV4dC0+Y3VyX2N0eDsKKworCQlpZiAobGlzdF9lbXB0eSgmY3R4LT5xdWVyeV9oZWFkKSkKKwkJCWxpc3RfYWRkX3RhaWwoJmN0eC0+cXVlcnlfaGVhZCwKKwkJCQkgICAgICAmc3dfY29udGV4dC0+cXVlcnlfbGlzdCk7CisJCXJldCA9IHZtd19ib190b192YWxpZGF0ZV9saXN0KHN3X2NvbnRleHQsCisJCQkJCSAgICAgIGRldl9wcml2LT5kdW1teV9xdWVyeV9ibywKKwkJCQkJICAgICAgRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUMsCisJCQkJCSAgICAgIE5VTEwpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiB2bXdfcXVlcnlfYm9fc3dpdGNoX2NvbW1pdCAtIEZpbmFsaXplIHN3aXRjaGluZyBwaW5uZWQgcXVlcnkgYnVmZmVyCisgKgorICogQGRldl9wcml2OiBUaGUgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgorICogQHN3X2NvbnRleHQ6IFRoZSBzb2Z0d2FyZSBjb250ZXh0IHVzZWQgZm9yIHRoaXMgY29tbWFuZCBzdWJtaXNzaW9uIGJhdGNoLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpZiB3ZSdyZSBzd2l0Y2hpbmcgcXVlcnkgYnVmZmVycywgYW5kIHdpbGwgdGhlbiwKKyAqIGlmIG5vIG90aGVyIHF1ZXJ5IHdhaXRzIGFyZSBpc3N1ZWQgdGhpcyBjb21tYW5kIHN1Ym1pc3Npb24gYmF0Y2gsCisgKiBpc3N1ZSBhIGR1bW15IG9jY2x1c2lvbiBxdWVyeSB3YWl0IHVzZWQgYXMgYSBxdWVyeSBiYXJyaWVyLiBXaGVuIHRoZSBmZW5jZQorICogb2JqZWN0IGZvbGxvd2luZyB0aGF0IHF1ZXJ5IHdhaXQgaGFzIHNpZ25hbGVkLCB3ZSBhcmUgc3VyZSB0aGF0IGFsbAorICogcHJlc2VkaW5nIHF1ZXJpZXMgaGF2ZSBmaW5pc2hlZCwgYW5kIHRoZSBvbGQgcXVlcnkgYnVmZmVyIGNhbiBiZSB1bnBpbm5lZC4KKyAqIEhvd2V2ZXIsIHNpbmNlIGJvdGggdGhlIG5ldyBxdWVyeSBidWZmZXIgYW5kIHRoZSBvbGQgb25lIGFyZSBmZW5jZWQgd2l0aAorICogdGhhdCBmZW5jZSwgd2UgY2FuIGRvIGFuIGFzeW5jaHJvbnVzIHVucGluIG5vdywgYW5kIGJlIHN1cmUgdGhhdCB0aGUKKyAqIG9sZCBxdWVyeSBidWZmZXIgd29uJ3QgYmUgbW92ZWQgdW50aWwgdGhlIGZlbmNlIGhhcyBzaWduYWxlZC4KKyAqCisgKiBBcyBtZW50aW9uZWQgYWJvdmUsIGJvdGggdGhlIG5ldyAtIGFuZCBvbGQgcXVlcnkgYnVmZmVycyBuZWVkIHRvIGJlIGZlbmNlZAorICogdXNpbmcgYSBzZXF1ZW5jZSBlbWl0dGVkICphZnRlciogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCB2bXdfcXVlcnlfYm9fc3dpdGNoX2NvbW1pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSAgICAgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0KQoreworCisJc3RydWN0IHZtd19yZXNvdXJjZSAqY3R4LCAqbmV4dF9jdHg7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIHZhbGlkYXRlIGxpc3Qgc2hvdWxkIHN0aWxsIGhvbGQgcmVmZXJlbmNlcyB0byBhbGwKKwkgKiBjb250ZXh0cyBoZXJlLgorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN0eCwgbmV4dF9jdHgsICZzd19jb250ZXh0LT5xdWVyeV9saXN0LAorCQkJCSBxdWVyeV9oZWFkKSB7CisJCWxpc3RfZGVsX2luaXQoJmN0eC0+cXVlcnlfaGVhZCk7CisKKwkJQlVHX09OKGxpc3RfZW1wdHkoJmN0eC0+dmFsaWRhdGVfaGVhZCkpOworCisJCXJldCA9IHZtd19maWZvX2VtaXRfZHVtbXlfcXVlcnkoZGV2X3ByaXYsIGN0eC0+aWQpOworCisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlEUk1fRVJST1IoIk91dCBvZiBmaWZvIHNwYWNlIGZvciBkdW1teSBxdWVyeS5cbiIpOworCX0KKworCWlmIChkZXZfcHJpdi0+cGlubmVkX2JvICE9IHN3X2NvbnRleHQtPmN1cl9xdWVyeV9ibykgeworCQlpZiAoZGV2X3ByaXYtPnBpbm5lZF9ibykgeworCQkJdm13X2JvX3BpbihkZXZfcHJpdi0+cGlubmVkX2JvLCBmYWxzZSk7CisJCQl0dG1fYm9fdW5yZWYoJmRldl9wcml2LT5waW5uZWRfYm8pOworCQl9CisKKwkJdm13X2JvX3Bpbihzd19jb250ZXh0LT5jdXJfcXVlcnlfYm8sIHRydWUpOworCisJCS8qCisJCSAqIFdlIHBpbiBhbHNvIHRoZSBkdW1teV9xdWVyeV9ibyBidWZmZXIgc28gdGhhdCB3ZQorCQkgKiBkb24ndCBuZWVkIHRvIHZhbGlkYXRlIGl0IHdoZW4gZW1pdHRpbmcKKwkJICogZHVtbXkgcXVlcmllcyBpbiBjb250ZXh0IGRlc3Ryb3kgcGF0aHMuCisJCSAqLworCisJCXZtd19ib19waW4oZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvLCB0cnVlKTsKKwkJZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvX3Bpbm5lZCA9IHRydWU7CisKKwkJZGV2X3ByaXYtPnF1ZXJ5X2NpZCA9IHN3X2NvbnRleHQtPmN1cl9xdWVyeV9jaWQ7CisJCWRldl9wcml2LT5waW5uZWRfYm8gPQorCQkJdHRtX2JvX3JlZmVyZW5jZShzd19jb250ZXh0LT5jdXJfcXVlcnlfYm8pOworCX0KK30KKworLyoqCisgKiB2bXdfcXVlcnlfc3dpdGNoX2JhY2tvZmYgLSBjbGVhciBxdWVyeSBiYXJyaWVyIGxpc3QKKyAqIEBzd19jb250ZXh0OiBUaGUgc3cgY29udGV4dCB1c2VkIGZvciB0aGlzIHN1Ym1pc3Npb24gYmF0Y2guCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIHBhcnQgb2YgYW4gZXJyb3IgcGF0aCwgd2hlcmUgYSBwcmV2aW91c2x5CisgKiBzZXQgdXAgbGlzdCBvZiBxdWVyeSBiYXJyaWVycyBuZWVkcyB0byBiZSBjbGVhcmVkLgorICoKKyAqLworc3RhdGljIHZvaWQgdm13X3F1ZXJ5X3N3aXRjaF9iYWNrb2ZmKHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCBuZXh0LCAmc3dfY29udGV4dC0+cXVlcnlfbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KGxpc3QpOworCX0KK30KKwogc3RhdGljIGludCB2bXdfdHJhbnNsYXRlX2d1ZXN0X3B0cihzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJCSAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKIAkJCQkgICBTVkdBR3Vlc3RQdHIgKnB0ciwKQEAgLTE5MSw4ICs0NDYsNiBAQAogCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm87CiAJdWludDMyX3QgaGFuZGxlID0gcHRyLT5nbXJJZDsKIAlzdHJ1Y3Qgdm13X3JlbG9jYXRpb24gKnJlbG9jOwotCXVpbnQzMl90IGN1cl92YWxpZGF0ZV9ub2RlOwotCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICp2YWxfYnVmOwogCWludCByZXQ7CiAKIAlyZXQgPSB2bXdfdXNlcl9kbWFidWZfbG9va3VwKHN3X2NvbnRleHQtPnRmaWxlLCBoYW5kbGUsICZ2bXdfYm8pOwpAQCAtMjEyLDIyICs0NjUsMTEgQEAKIAlyZWxvYyA9ICZzd19jb250ZXh0LT5yZWxvY3Nbc3dfY29udGV4dC0+Y3VyX3JlbG9jKytdOwogCXJlbG9jLT5sb2NhdGlvbiA9IHB0cjsKIAotCWN1cl92YWxpZGF0ZV9ub2RlID0gdm13X2RtYWJ1Zl92YWxpZGF0ZV9ub2RlKGJvLCBzd19jb250ZXh0LT5jdXJfdmFsX2J1Zik7Ci0JaWYgKHVubGlrZWx5KGN1cl92YWxpZGF0ZV9ub2RlID49IFZNV0dGWF9NQVhfR01SUykpIHsKLQkJRFJNX0VSUk9SKCJNYXggbnVtYmVyIG9mIERNQSBidWZmZXJzIHBlciBzdWJtaXNzaW9uIgotCQkJICAiIGV4Y2VlZGVkLlxuIik7Ci0JCXJldCA9IC1FSU5WQUw7CisJcmV0ID0gdm13X2JvX3RvX3ZhbGlkYXRlX2xpc3Qoc3dfY29udGV4dCwgYm8sIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDLAorCQkJCSAgICAgICZyZWxvYy0+aW5kZXgpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X25vX3JlbG9jOwotCX0KIAotCXJlbG9jLT5pbmRleCA9IGN1cl92YWxpZGF0ZV9ub2RlOwotCWlmICh1bmxpa2VseShjdXJfdmFsaWRhdGVfbm9kZSA9PSBzd19jb250ZXh0LT5jdXJfdmFsX2J1ZikpIHsKLQkJdmFsX2J1ZiA9ICZzd19jb250ZXh0LT52YWxfYnVmc1tjdXJfdmFsaWRhdGVfbm9kZV07Ci0JCXZhbF9idWYtPmJvID0gdHRtX2JvX3JlZmVyZW5jZShibyk7Ci0JCXZhbF9idWYtPm5ld19zeW5jX29ial9hcmcgPSAodm9pZCAqKSBkZXZfcHJpdjsKLQkJbGlzdF9hZGRfdGFpbCgmdmFsX2J1Zi0+aGVhZCwgJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzKTsKLQkJKytzd19jb250ZXh0LT5jdXJfdmFsX2J1ZjsKLQl9CiAJKnZtd19ib19wID0gdm13X2JvOwogCXJldHVybiAwOwogCkBAIC0yNTksOCArNTAxLDExIEBACiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IHZtd19xdWVyeV9ib19zd2l0Y2hfcHJlcGFyZShkZXZfcHJpdiwgY21kLT5xLmNpZCwKKwkJCQkJICAmdm13X2JvLT5iYXNlLCBzd19jb250ZXh0KTsKKwogCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJnZtd19ibyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB2bXdfY21kX3dhaXRfcXVlcnkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKQEAgLTI3Myw2ICs1MTgsNyBAQAogCQlTVkdBM2RDbWRXYWl0Rm9yUXVlcnkgcTsKIAl9ICpjbWQ7CiAJaW50IHJldDsKKwlzdHJ1Y3Qgdm13X3Jlc291cmNlICpjdHg7CiAKIAljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X3F1ZXJ5X2NtZCwgaGVhZGVyKTsKIAlyZXQgPSB2bXdfY21kX2NpZF9jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dCwgaGVhZGVyKTsKQEAgLTI4NiwxMCArNTMyLDE5IEBACiAJCXJldHVybiByZXQ7CiAKIAl2bXdfZG1hYnVmX3VucmVmZXJlbmNlKCZ2bXdfYm8pOworCisJLyoKKwkgKiBUaGlzIHdhaXQgd2lsbCBhY3QgYXMgYSBiYXJyaWVyIGZvciBwcmV2aW91cyB3YWl0cyBmb3IgdGhpcworCSAqIGNvbnRleHQuCisJICovCisKKwljdHggPSBzd19jb250ZXh0LT5jdXJfY3R4OworCWlmICghbGlzdF9lbXB0eSgmY3R4LT5xdWVyeV9oZWFkKSkKKwkJbGlzdF9kZWxfaW5pdCgmY3R4LT5xdWVyeV9oZWFkKTsKKwogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgdm13X2NtZF9kbWEoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJICAgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKIAkJICAgICAgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQpAQCAtMzAyLDYgKzU1Nyw3IEBACiAJCVNWR0EzZENtZFN1cmZhY2VETUEgZG1hOwogCX0gKmNtZDsKIAlpbnQgcmV0OworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlczsKIAogCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfZG1hX2NtZCwgaGVhZGVyKTsKIAlyZXQgPSB2bXdfdHJhbnNsYXRlX2d1ZXN0X3B0cihkZXZfcHJpdiwgc3dfY29udGV4dCwKQEAgLTMxOCwxOCArNTc0LDI4IEBACiAJCWdvdG8gb3V0X25vX3JlbG9jOwogCX0KIAotCS8qKgorCXJldCA9IHZtd19zdXJmYWNlX3ZhbGlkYXRlKGRldl9wcml2LCBzcmYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlEUk1fRVJST1IoIkN1bGQgbm90IHZhbGlkYXRlIHN1cmZhY2UuXG4iKTsKKwkJZ290byBvdXRfbm9fdmFsaWRhdGU7CisJfQorCisJLyoKIAkgKiBQYXRjaCBjb21tYW5kIHN0cmVhbSB3aXRoIGRldmljZSBTSUQuCiAJICovCi0KIAljbWQtPmRtYS5ob3N0LnNpZCA9IHNyZi0+cmVzLmlkOwogCXZtd19rbXNfY3Vyc29yX3Nub29wKHNyZiwgc3dfY29udGV4dC0+dGZpbGUsIGJvLCBoZWFkZXIpOwotCS8qKgotCSAqIEZJWE1FOiBNYXkgZGVhZGxvY2sgaGVyZSB3aGVuIGNhbGxlZCBmcm9tIHRoZQotCSAqIGNvbW1hbmQgcGFyc2luZyBjb2RlLgotCSAqLwotCXZtd19zdXJmYWNlX3VucmVmZXJlbmNlKCZzcmYpOwogCisJdm13X2RtYWJ1Zl91bnJlZmVyZW5jZSgmdm13X2JvKTsKKworCXJlcyA9ICZzcmYtPnJlczsKKwl2bXdfcmVzb3VyY2VfdG9fdmFsaWRhdGVfbGlzdChzd19jb250ZXh0LCAmcmVzKTsKKworCXJldHVybiAwOworCitvdXRfbm9fdmFsaWRhdGU6CisJdm13X3N1cmZhY2VfdW5yZWZlcmVuY2UoJnNyZik7CiBvdXRfbm9fcmVsb2M6CiAJdm13X2RtYWJ1Zl91bnJlZmVyZW5jZSgmdm13X2JvKTsKIAlyZXR1cm4gcmV0OwpAQCAtNDE5LDYgKzY4NSw3MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHZtd19jbWRfY2hlY2tfZGVmaW5lX2dtcmZiKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICAgICAgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCSAgICAgIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKnZtd19ibzsKKwlpbnQgcmV0OworCisJc3RydWN0IHsKKwkJdWludDMyX3QgaGVhZGVyOworCQlTVkdBRmlmb0NtZERlZmluZUdNUkZCIGJvZHk7CisJfSAqY21kID0gYnVmOworCisJcmV0ID0gdm13X3RyYW5zbGF0ZV9ndWVzdF9wdHIoZGV2X3ByaXYsIHN3X2NvbnRleHQsCisJCQkJICAgICAgJmNtZC0+Ym9keS5wdHIsCisJCQkJICAgICAgJnZtd19ibyk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJnZtd19ibyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZtd19jbWRfY2hlY2tfbm90XzNkKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCXZvaWQgKmJ1ZiwgdWludDMyX3QgKnNpemUpCit7CisJdWludDMyX3Qgc2l6ZV9yZW1haW5pbmcgPSAqc2l6ZTsKKwl1aW50MzJfdCBjbWRfaWQ7CisKKwljbWRfaWQgPSBsZTMyX3RvX2NwdSgoKHVpbnQzMl90ICopYnVmKVswXSk7CisJc3dpdGNoIChjbWRfaWQpIHsKKwljYXNlIFNWR0FfQ01EX1VQREFURToKKwkJKnNpemUgPSBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKFNWR0FGaWZvQ21kVXBkYXRlKTsKKwkJYnJlYWs7CisJY2FzZSBTVkdBX0NNRF9ERUZJTkVfR01SRkI6CisJCSpzaXplID0gc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihTVkdBRmlmb0NtZERlZmluZUdNUkZCKTsKKwkJYnJlYWs7CisJY2FzZSBTVkdBX0NNRF9CTElUX0dNUkZCX1RPX1NDUkVFTjoKKwkJKnNpemUgPSBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKFNWR0FGaWZvQ21kQmxpdEdNUkZCVG9TY3JlZW4pOworCQlicmVhazsKKwljYXNlIFNWR0FfQ01EX0JMSVRfU0NSRUVOX1RPX0dNUkZCOgorCQkqc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YoU1ZHQUZpZm9DbWRCbGl0R01SRkJUb1NjcmVlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5zdXBwb3J0ZWQgU1ZHQSBjb21tYW5kOiAldS5cbiIsIGNtZF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgqc2l6ZSA+IHNpemVfcmVtYWluaW5nKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBTVkdBIGNvbW1hbmQgKHNpemUgbWlzbWF0Y2gpOiIKKwkJCSAgIiAldS5cbiIsIGNtZF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh1bmxpa2VseSghc3dfY29udGV4dC0+a2VybmVsKSkgeworCQlEUk1fRVJST1IoIktlcm5lbCBvbmx5IFNWR0EgY29tbWFuZDogJXUuXG4iLCBjbWRfaWQpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChjbWRfaWQgPT0gU1ZHQV9DTURfREVGSU5FX0dNUkZCKQorCQlyZXR1cm4gdm13X2NtZF9jaGVja19kZWZpbmVfZ21yZmIoZGV2X3ByaXYsIHN3X2NvbnRleHQsIGJ1Zik7CisKKwlyZXR1cm4gMDsKK30KIAogdHlwZWRlZiBpbnQgKCp2bXdfY21kX2Z1bmMpIChzdHJ1Y3Qgdm13X3ByaXZhdGUgKiwKIAkJCSAgICAgc3RydWN0IHZtd19zd19jb250ZXh0ICosCkBAIC00NzEsMTEgKzgwMiwxMSBAQAogCVNWR0EzZENtZEhlYWRlciAqaGVhZGVyID0gKFNWR0EzZENtZEhlYWRlciAqKSBidWY7CiAJaW50IHJldDsKIAotCWNtZF9pZCA9ICgodWludDMyX3QgKilidWYpWzBdOwotCWlmIChjbWRfaWQgPT0gU1ZHQV9DTURfVVBEQVRFKSB7Ci0JCSpzaXplID0gNSA8PCAyOwotCQlyZXR1cm4gMDsKLQl9CisJY21kX2lkID0gbGUzMl90b19jcHUoKCh1aW50MzJfdCAqKWJ1ZilbMF0pOworCS8qIEhhbmRsZSBhbnkgbm9uZSAzRCBjb21tYW5kcyAqLworCWlmICh1bmxpa2VseShjbWRfaWQgPCBTVkdBX0NNRF9NQVgpKQorCQlyZXR1cm4gdm13X2NtZF9jaGVja19ub3RfM2QoZGV2X3ByaXYsIHN3X2NvbnRleHQsIGJ1Ziwgc2l6ZSk7CisKIAogCWNtZF9pZCA9IGxlMzJfdG9fY3B1KGhlYWRlci0+aWQpOwogCSpzaXplID0gbGUzMl90b19jcHUoaGVhZGVyLT5zaXplKSArIHNpemVvZihTVkdBM2RDbWRIZWFkZXIpOwpAQCAtNTAwLDcgKzgzMSw4IEBACiAKIHN0YXRpYyBpbnQgdm13X2NtZF9jaGVja19hbGwoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCSAgICAgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAotCQkJICAgICB2b2lkICpidWYsIHVpbnQzMl90IHNpemUpCisJCQkgICAgIHZvaWQgKmJ1ZiwKKwkJCSAgICAgdWludDMyX3Qgc2l6ZSkKIHsKIAlpbnQzMl90IGN1cl9zaXplID0gc2l6ZTsKIAlpbnQgcmV0OwpAQCAtNTUwLDcgKzg4MiwxMSBAQAogc3RhdGljIHZvaWQgdm13X2NsZWFyX3ZhbGlkYXRpb25zKHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCkKIHsKIAlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqZW50cnksICpuZXh0OworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcywgKnJlc19uZXh0OwogCisJLyoKKwkgKiBEcm9wIHJlZmVyZW5jZXMgdG8gRE1BIGJ1ZmZlcnMgaGVsZCBkdXJpbmcgY29tbWFuZCBzdWJtaXNzaW9uLgorCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzLAogCQkJCSBoZWFkKSB7CiAJCWxpc3RfZGVsKCZlbnRyeS0+aGVhZCk7CkBAIC01NTksNiArODk1LDE2IEBACiAJCXN3X2NvbnRleHQtPmN1cl92YWxfYnVmLS07CiAJfQogCUJVR19PTihzd19jb250ZXh0LT5jdXJfdmFsX2J1ZiAhPSAwKTsKKworCS8qCisJICogRHJvcCByZWZlcmVuY2VzIHRvIHJlc291cmNlcyBoZWxkIGR1cmluZyBjb21tYW5kIHN1Ym1pc3Npb24uCisJICovCisJdm13X3Jlc291cmNlX3VucmVzZXJ2ZSgmc3dfY29udGV4dC0+cmVzb3VyY2VfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgcmVzX25leHQsICZzd19jb250ZXh0LT5yZXNvdXJjZV9saXN0LAorCQkJCSB2YWxpZGF0ZV9oZWFkKSB7CisJCWxpc3RfZGVsX2luaXQoJnJlcy0+dmFsaWRhdGVfaGVhZCk7CisJCXZtd19yZXNvdXJjZV91bnJlZmVyZW5jZSgmcmVzKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdm13X3ZhbGlkYXRlX3NpbmdsZV9idWZmZXIoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKQEAgLTU2Niw2ICs5MTIsMTYgQEAKIHsKIAlpbnQgcmV0OwogCisKKwkvKgorCSAqIERvbid0IHZhbGlkYXRlIHBpbm5lZCBidWZmZXJzLgorCSAqLworCisJaWYgKGJvID09IGRldl9wcml2LT5waW5uZWRfYm8gfHwKKwkgICAgKGJvID09IGRldl9wcml2LT5kdW1teV9xdWVyeV9ibyAmJgorCSAgICAgZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvX3Bpbm5lZCkpCisJCXJldHVybiAwOworCiAJLyoqCiAJICogUHV0IEJPIGluIFZSQU0gaWYgdGhlcmUgaXMgc3BhY2UsIG90aGVyd2lzZSBhcyBhIEdNUi4KIAkgKiBJZiB0aGVyZSBpcyBubyBzcGFjZSBpbiBWUkFNIGFuZCBHTVIgaWRzIGFyZSBhbGwgdXNlZCB1cCwKQEAgLTYwMiw1NyArOTU4LDIwOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdm13X2V4ZWNidWZfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCitzdGF0aWMgaW50IHZtd19yZXNpemVfY21kX2JvdW5jZShzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCisJCQkJIHVpbnQzMl90IHNpemUpCiB7Ci0Jc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KGRldik7Ci0Jc3RydWN0IGRybV92bXdfZXhlY2J1Zl9hcmcgKmFyZyA9IChzdHJ1Y3QgZHJtX3Ztd19leGVjYnVmX2FyZyAqKWRhdGE7Ci0Jc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIGZlbmNlX3JlcDsKLQlzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAgX191c2VyICp1c2VyX2ZlbmNlX3JlcDsKLQlpbnQgcmV0OwotCXZvaWQgKnVzZXJfY21kOwotCXZvaWQgKmNtZDsKLQl1aW50MzJfdCBzZXF1ZW5jZTsKLQlzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQgPSAmZGV2X3ByaXYtPmN0eDsKLQlzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3RlciA9IHZtd19tYXN0ZXIoZmlsZV9wcml2LT5tYXN0ZXIpOworCWlmIChsaWtlbHkoc3dfY29udGV4dC0+Y21kX2JvdW5jZV9zaXplID49IHNpemUpKQorCQlyZXR1cm4gMDsKIAotCXJldCA9IHR0bV9yZWFkX2xvY2soJnZtYXN0ZXItPmxvY2ssIHRydWUpOwotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCXJldHVybiByZXQ7CisJaWYgKHN3X2NvbnRleHQtPmNtZF9ib3VuY2Vfc2l6ZSA9PSAwKQorCQlzd19jb250ZXh0LT5jbWRfYm91bmNlX3NpemUgPSBWTVdHRlhfQ01EX0JPVU5DRV9JTklUX1NJWkU7CisKKwl3aGlsZSAoc3dfY29udGV4dC0+Y21kX2JvdW5jZV9zaXplIDwgc2l6ZSkgeworCQlzd19jb250ZXh0LT5jbWRfYm91bmNlX3NpemUgPQorCQkJUEFHRV9BTElHTihzd19jb250ZXh0LT5jbWRfYm91bmNlX3NpemUgKworCQkJCSAgIChzd19jb250ZXh0LT5jbWRfYm91bmNlX3NpemUgPj4gMSkpOworCX0KKworCWlmIChzd19jb250ZXh0LT5jbWRfYm91bmNlICE9IE5VTEwpCisJCXZmcmVlKHN3X2NvbnRleHQtPmNtZF9ib3VuY2UpOworCisJc3dfY29udGV4dC0+Y21kX2JvdW5jZSA9IHZtYWxsb2Moc3dfY29udGV4dC0+Y21kX2JvdW5jZV9zaXplKTsKKworCWlmIChzd19jb250ZXh0LT5jbWRfYm91bmNlID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgY29tbWFuZCBib3VuY2UgYnVmZmVyLlxuIik7CisJCXN3X2NvbnRleHQtPmNtZF9ib3VuY2Vfc2l6ZSA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZtd19leGVjYnVmX2ZlbmNlX2NvbW1hbmRzIC0gY3JlYXRlIGFuZCBzdWJtaXQgYSBjb21tYW5kIHN0cmVhbSBmZW5jZQorICoKKyAqIENyZWF0ZXMgYSBmZW5jZSBvYmplY3QgYW5kIHN1Ym1pdHMgYSBjb21tYW5kIHN0cmVhbSBtYXJrZXIuCisgKiBJZiB0aGlzIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgV2Ugc3luYyB0aGUgZmlmbyBhbmQgcmV0dXJuIE5VTEwuCisgKiBJdCBpcyB0aGVuIHNhZmUgdG8gZmVuY2UgYnVmZmVycyB3aXRoIGEgTlVMTCBwb2ludGVyLgorICoKKyAqIElmIEBwX2hhbmRsZSBpcyBub3QgTlVMTCBAZmlsZV9wcml2IG11c3QgYWxzbyBub3QgYmUgTlVMTC4gQ3JlYXRlcworICogYSB1c2Vyc3BhY2UgaGFuZGxlIGlmIEBwX2hhbmRsZSBpcyBub3QgTlVMTCwgb3RoZXJ3aXNlIG5vdC4KKyAqLworCitpbnQgdm13X2V4ZWNidWZfZmVuY2VfY29tbWFuZHMoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkgICAgICAgc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKnBfZmVuY2UsCisJCQkgICAgICAgdWludDMyX3QgKnBfaGFuZGxlKQoreworCXVpbnQzMl90IHNlcXVlbmNlOworCWludCByZXQ7CisJYm9vbCBzeW5jZWQgPSBmYWxzZTsKKworCS8qIHBfaGFuZGxlIGltcGxpZXMgZmlsZV9wcml2LiAqLworCUJVR19PTihwX2hhbmRsZSAhPSBOVUxMICYmIGZpbGVfcHJpdiA9PSBOVUxMKTsKKworCXJldCA9IHZtd19maWZvX3NlbmRfZmVuY2UoZGV2X3ByaXYsICZzZXF1ZW5jZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlEUk1fRVJST1IoIkZlbmNlIHN1Ym1pc3Npb24gZXJyb3IuIFN5bmNpbmcuXG4iKTsKKwkJc3luY2VkID0gdHJ1ZTsKKwl9CisKKwlpZiAocF9oYW5kbGUgIT0gTlVMTCkKKwkJcmV0ID0gdm13X3VzZXJfZmVuY2VfY3JlYXRlKGZpbGVfcHJpdiwgZGV2X3ByaXYtPmZtYW4sCisJCQkJCSAgICBzZXF1ZW5jZSwKKwkJCQkJICAgIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDLAorCQkJCQkgICAgcF9mZW5jZSwgcF9oYW5kbGUpOworCWVsc2UKKwkJcmV0ID0gdm13X2ZlbmNlX2NyZWF0ZShkZXZfcHJpdi0+Zm1hbiwgc2VxdWVuY2UsCisJCQkJICAgICAgIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDLAorCQkJCSAgICAgICBwX2ZlbmNlKTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gMCAmJiAhc3luY2VkKSkgeworCQkodm9pZCkgdm13X2ZhbGxiYWNrX3dhaXQoZGV2X3ByaXYsIGZhbHNlLCBmYWxzZSwKKwkJCQkJIHNlcXVlbmNlLCBmYWxzZSwKKwkJCQkJIFZNV19GRU5DRV9XQUlUX1RJTUVPVVQpOworCQkqcF9mZW5jZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdm13X2V4ZWNidWZfY29weV9mZW5jZV91c2VyIC0gY29weSBmZW5jZSBvYmplY3QgaW5mb3JtYXRpb24gdG8KKyAqIHVzZXItc3BhY2UuCisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgdm13X3ByaXZhdGUgc3RydWN0LgorICogQHZtd19mcDogUG9pbnRlciB0byB0aGUgc3RydWN0IHZtd19mcHJpdiByZXByZXNlbnRpbmcgdGhlIGNhbGxpbmcgZmlsZS4KKyAqIEByZXQ6IFJldHVybiB2YWx1ZSBmcm9tIGZlbmNlIG9iamVjdCBjcmVhdGlvbi4KKyAqIEB1c2VyX2ZlbmNlX3JlcDogVXNlciBzcGFjZSBhZGRyZXNzIG9mIGEgc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIHRvCisgKiB3aGljaCB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNvcGllZC4KKyAqIEBmZW5jZTogUG9pbnRlciB0byB0aGUgZmVuYyBvYmplY3QuCisgKiBAZmVuY2VfaGFuZGxlOiBVc2VyLXNwYWNlIGZlbmNlIGhhbmRsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyBmZW5jZSBpbmZvcm1hdGlvbiB0byB1c2VyLXNwYWNlLiBJZiBjb3B5aW5nIGZhaWxzLAorICogVGhlIHVzZXItc3BhY2Ugc3RydWN0IGRybV92bXdfZmVuY2VfcmVwOjplcnJvciBtZW1iZXIgaXMgaG9wZWZ1bGx5CisgKiBsZWZ0IHVudG91Y2hlZCwgYW5kIGlmIGl0J3MgcHJlbG9hZGVkIHdpdGggYW4gLUVGQVVMVCBieSB1c2VyLXNwYWNlLAorICogdGhlIGVycm9yIHdpbGwgaG9wZWZ1bGx5IGJlIGRldGVjdGVkLgorICogQWxzbyBpZiBjb3B5aW5nIGZhaWxzLCB1c2VyLXNwYWNlIHdpbGwgYmUgdW5hYmxlIHRvIHNpZ25hbCB0aGUgZmVuY2UKKyAqIG9iamVjdCBzbyB3ZSB3YWl0IGZvciBpdCBpbW1lZGlhdGVseSwgYW5kIHRoZW4gdW5yZWZlcmVuY2UgdGhlCisgKiB1c2VyLXNwYWNlIHJlZmVyZW5jZS4KKyAqLwordm9pZAordm13X2V4ZWNidWZfY29weV9mZW5jZV91c2VyKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgc3RydWN0IHZtd19mcHJpdiAqdm13X2ZwLAorCQkJICAgIGludCByZXQsCisJCQkgICAgc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIF9fdXNlciAqdXNlcl9mZW5jZV9yZXAsCisJCQkgICAgc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlLAorCQkJICAgIHVpbnQzMl90IGZlbmNlX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAgZmVuY2VfcmVwOworCisJaWYgKHVzZXJfZmVuY2VfcmVwID09IE5VTEwpCisJCXJldHVybjsKKworCW1lbXNldCgmZmVuY2VfcmVwLCAwLCBzaXplb2YoZmVuY2VfcmVwKSk7CisKKwlmZW5jZV9yZXAuZXJyb3IgPSByZXQ7CisJaWYgKHJldCA9PSAwKSB7CisJCUJVR19PTihmZW5jZSA9PSBOVUxMKTsKKworCQlmZW5jZV9yZXAuaGFuZGxlID0gZmVuY2VfaGFuZGxlOworCQlmZW5jZV9yZXAuc2Vxbm8gPSBmZW5jZS0+c2Vxbm87CisJCXZtd191cGRhdGVfc2Vxbm8oZGV2X3ByaXYsICZkZXZfcHJpdi0+Zmlmbyk7CisJCWZlbmNlX3JlcC5wYXNzZWRfc2Vxbm8gPSBkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcW5vOworCX0KKworCS8qCisJICogY29weV90b191c2VyIGVycm9ycyB3aWxsIGJlIGRldGVjdGVkIGJ5IHVzZXIgc3BhY2Ugbm90CisJICogc2VlaW5nIGZlbmNlX3JlcDo6ZXJyb3IgZmlsbGVkIGluLiBUeXBpY2FsbHkKKwkgKiB1c2VyLXNwYWNlIHdvdWxkIGhhdmUgcHJlLXNldCB0aGF0IG1lbWJlciB0byAtRUZBVUxULgorCSAqLworCXJldCA9IGNvcHlfdG9fdXNlcih1c2VyX2ZlbmNlX3JlcCwgJmZlbmNlX3JlcCwKKwkJCSAgIHNpemVvZihmZW5jZV9yZXApKTsKKworCS8qCisJICogVXNlci1zcGFjZSBsb3N0IHRoZSBmZW5jZSBvYmplY3QuIFdlIG5lZWQgdG8gc3luYworCSAqIGFuZCB1bnJlZmVyZW5jZSB0aGUgaGFuZGxlLgorCSAqLworCWlmICh1bmxpa2VseShyZXQgIT0gMCkgJiYgKGZlbmNlX3JlcC5lcnJvciA9PSAwKSkgeworCQl0dG1fcmVmX29iamVjdF9iYXNlX3VucmVmKHZtd19mcC0+dGZpbGUsCisJCQkJCSAgZmVuY2VfaGFuZGxlLCBUVE1fUkVGX1VTQUdFKTsKKwkJRFJNX0VSUk9SKCJGZW5jZSBjb3B5IGVycm9yLiBTeW5jaW5nLlxuIik7CisJCSh2b2lkKSB2bXdfZmVuY2Vfb2JqX3dhaXQoZmVuY2UsIGZlbmNlLT5zaWduYWxfbWFzaywKKwkJCQkJICBmYWxzZSwgZmFsc2UsCisJCQkJCSAgVk1XX0ZFTkNFX1dBSVRfVElNRU9VVCk7CisJfQorfQorCitpbnQgdm13X2V4ZWNidWZfcHJvY2VzcyhzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQl2b2lkIF9fdXNlciAqdXNlcl9jb21tYW5kcywKKwkJCXZvaWQgKmtlcm5lbF9jb21tYW5kcywKKwkJCXVpbnQzMl90IGNvbW1hbmRfc2l6ZSwKKwkJCXVpbnQ2NF90IHRocm90dGxlX3VzLAorCQkJc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIF9fdXNlciAqdXNlcl9mZW5jZV9yZXApCit7CisJc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0ID0gJmRldl9wcml2LT5jdHg7CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOworCXVpbnQzMl90IGhhbmRsZTsKKwl2b2lkICpjbWQ7CisJaW50IHJldDsKIAogCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2X3ByaXYtPmNtZGJ1Zl9tdXRleCk7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewotCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCWdvdG8gb3V0X25vX2NtZF9tdXRleDsKLQl9CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIGFyZy0+Y29tbWFuZF9zaXplKTsKLQlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBmaWZvIHNwYWNlIGZvciBjb21tYW5kcy5cbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQorCWlmIChrZXJuZWxfY29tbWFuZHMgPT0gTlVMTCkgeworCQlzd19jb250ZXh0LT5rZXJuZWwgPSBmYWxzZTsKIAotCXVzZXJfY21kID0gKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpYXJnLT5jb21tYW5kczsKLQlyZXQgPSBjb3B5X2Zyb21fdXNlcihjbWQsIHVzZXJfY21kLCBhcmctPmNvbW1hbmRfc2l6ZSk7CisJCXJldCA9IHZtd19yZXNpemVfY21kX2JvdW5jZShzd19jb250ZXh0LCBjb21tYW5kX3NpemUpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJZ290byBvdXRfdW5sb2NrOwogCi0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewotCQlyZXQgPSAtRUZBVUxUOwotCQlEUk1fRVJST1IoIkZhaWxlZCBjb3B5aW5nIGNvbW1hbmRzLlxuIik7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKLQl9CisKKwkJcmV0ID0gY29weV9mcm9tX3VzZXIoc3dfY29udGV4dC0+Y21kX2JvdW5jZSwKKwkJCQkgICAgIHVzZXJfY29tbWFuZHMsIGNvbW1hbmRfc2l6ZSk7CisKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCURSTV9FUlJPUigiRmFpbGVkIGNvcHlpbmcgY29tbWFuZHMuXG4iKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlrZXJuZWxfY29tbWFuZHMgPSBzd19jb250ZXh0LT5jbWRfYm91bmNlOworCX0gZWxzZQorCQlzd19jb250ZXh0LT5rZXJuZWwgPSB0cnVlOwogCiAJc3dfY29udGV4dC0+dGZpbGUgPSB2bXdfZnByaXYoZmlsZV9wcml2KS0+dGZpbGU7CiAJc3dfY29udGV4dC0+Y2lkX3ZhbGlkID0gZmFsc2U7CiAJc3dfY29udGV4dC0+c2lkX3ZhbGlkID0gZmFsc2U7CiAJc3dfY29udGV4dC0+Y3VyX3JlbG9jID0gMDsKIAlzd19jb250ZXh0LT5jdXJfdmFsX2J1ZiA9IDA7CisJc3dfY29udGV4dC0+ZmVuY2VfZmxhZ3MgPSAwOworCUlOSVRfTElTVF9IRUFEKCZzd19jb250ZXh0LT5xdWVyeV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmc3dfY29udGV4dC0+cmVzb3VyY2VfbGlzdCk7CisJc3dfY29udGV4dC0+Y3VyX3F1ZXJ5X2JvID0gZGV2X3ByaXYtPnBpbm5lZF9ibzsKKwlzd19jb250ZXh0LT5jdXJfcXVlcnlfY2lkID0gZGV2X3ByaXYtPnF1ZXJ5X2NpZDsKKwlzd19jb250ZXh0LT5xdWVyeV9jaWRfdmFsaWQgPSAoZGV2X3ByaXYtPnBpbm5lZF9ibyAhPSBOVUxMKTsKIAogCUlOSVRfTElTVF9IRUFEKCZzd19jb250ZXh0LT52YWxpZGF0ZV9ub2Rlcyk7CiAKLQlyZXQgPSB2bXdfY21kX2NoZWNrX2FsbChkZXZfcHJpdiwgc3dfY29udGV4dCwgY21kLCBhcmctPmNvbW1hbmRfc2l6ZSk7CisJcmV0ID0gdm13X2NtZF9jaGVja19hbGwoZGV2X3ByaXYsIHN3X2NvbnRleHQsIGtlcm5lbF9jb21tYW5kcywKKwkJCQljb21tYW5kX3NpemUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X2VycjsKKwogCXJldCA9IHR0bV9ldV9yZXNlcnZlX2J1ZmZlcnMoJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dF9lcnI7CkBAIC02NjMsNTcgKzExNzAsMjA2IEBACiAKIAl2bXdfYXBwbHlfcmVsb2NhdGlvbnMoc3dfY29udGV4dCk7CiAKLQlpZiAoYXJnLT50aHJvdHRsZV91cykgewotCQlyZXQgPSB2bXdfd2FpdF9sYWcoZGV2X3ByaXYsICZkZXZfcHJpdi0+Zmlmby5mZW5jZV9xdWV1ZSwKLQkJCQkgICBhcmctPnRocm90dGxlX3VzKTsKKwlpZiAodGhyb3R0bGVfdXMpIHsKKwkJcmV0ID0gdm13X3dhaXRfbGFnKGRldl9wcml2LCAmZGV2X3ByaXYtPmZpZm8ubWFya2VyX3F1ZXVlLAorCQkJCSAgIHRocm90dGxlX3VzKTsKIAogCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQkJZ290byBvdXRfZXJyOworCQkJZ290byBvdXRfdGhyb3R0bGU7CiAJfQogCi0Jdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBhcmctPmNvbW1hbmRfc2l6ZSk7CisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgY29tbWFuZF9zaXplKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBmaWZvIHNwYWNlIGZvciBjb21tYW5kcy5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF90aHJvdHRsZTsKKwl9CiAKLQlyZXQgPSB2bXdfZmlmb19zZW5kX2ZlbmNlKGRldl9wcml2LCAmc2VxdWVuY2UpOworCW1lbWNweShjbWQsIGtlcm5lbF9jb21tYW5kcywgY29tbWFuZF9zaXplKTsKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIGNvbW1hbmRfc2l6ZSk7CiAKLQl0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMoJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzLAotCQkJCSAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKSBzZXF1ZW5jZSk7Ci0Jdm13X2NsZWFyX3ZhbGlkYXRpb25zKHN3X2NvbnRleHQpOwotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNtZGJ1Zl9tdXRleCk7Ci0KKwl2bXdfcXVlcnlfYm9fc3dpdGNoX2NvbW1pdChkZXZfcHJpdiwgc3dfY29udGV4dCk7CisJcmV0ID0gdm13X2V4ZWNidWZfZmVuY2VfY29tbWFuZHMoZmlsZV9wcml2LCBkZXZfcHJpdiwKKwkJCQkJICZmZW5jZSwKKwkJCQkJICh1c2VyX2ZlbmNlX3JlcCkgPyAmaGFuZGxlIDogTlVMTCk7CiAJLyoKIAkgKiBUaGlzIGVycm9yIGlzIGhhcm1sZXNzLCBiZWNhdXNlIGlmIGZlbmNlIHN1Ym1pc3Npb24gZmFpbHMsCi0JICogdm13X2ZpZm9fc2VuZF9mZW5jZSB3aWxsIHN5bmMuCisJICogdm13X2ZpZm9fc2VuZF9mZW5jZSB3aWxsIHN5bmMuIFRoZSBlcnJvciB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8KKwkgKiB1c2VyLXNwYWNlIGluIEBmZW5jZV9yZXAKIAkgKi8KIAogCWlmIChyZXQgIT0gMCkKIAkJRFJNX0VSUk9SKCJGZW5jZSBzdWJtaXNzaW9uIGVycm9yLiBTeW5jaW5nLlxuIik7CiAKLQlmZW5jZV9yZXAuZXJyb3IgPSByZXQ7Ci0JZmVuY2VfcmVwLmZlbmNlX3NlcSA9ICh1aW50NjRfdCkgc2VxdWVuY2U7Ci0JZmVuY2VfcmVwLnBhZDY0ID0gMDsKKwl0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMoJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzLAorCQkJCSAgICAodm9pZCAqKSBmZW5jZSk7CiAKLQl1c2VyX2ZlbmNlX3JlcCA9IChzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAgX191c2VyICopCi0JICAgICh1bnNpZ25lZCBsb25nKWFyZy0+ZmVuY2VfcmVwOworCXZtd19jbGVhcl92YWxpZGF0aW9ucyhzd19jb250ZXh0KTsKKwl2bXdfZXhlY2J1Zl9jb3B5X2ZlbmNlX3VzZXIoZGV2X3ByaXYsIHZtd19mcHJpdihmaWxlX3ByaXYpLCByZXQsCisJCQkJICAgIHVzZXJfZmVuY2VfcmVwLCBmZW5jZSwgaGFuZGxlKTsKIAotCS8qCi0JICogY29weV90b191c2VyIGVycm9ycyB3aWxsIGJlIGRldGVjdGVkIGJ5IHVzZXIgc3BhY2Ugbm90Ci0JICogc2VlaW5nIGZlbmNlX3JlcDo6ZXJyb3IgZmlsbGVkIGluLgotCSAqLworCWlmIChsaWtlbHkoZmVuY2UgIT0gTlVMTCkpCisJCXZtd19mZW5jZV9vYmpfdW5yZWZlcmVuY2UoJmZlbmNlKTsKIAotCXJldCA9IGNvcHlfdG9fdXNlcih1c2VyX2ZlbmNlX3JlcCwgJmZlbmNlX3JlcCwgc2l6ZW9mKGZlbmNlX3JlcCkpOwotCi0Jdm13X2ttc19jdXJzb3JfcG9zdF9leGVjYnVmKGRldl9wcml2KTsKLQl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNtZGJ1Zl9tdXRleCk7CiAJcmV0dXJuIDA7CisKIG91dF9lcnI6CiAJdm13X2ZyZWVfcmVsb2NhdGlvbnMoc3dfY29udGV4dCk7CitvdXRfdGhyb3R0bGU6CisJdm13X3F1ZXJ5X3N3aXRjaF9iYWNrb2ZmKHN3X2NvbnRleHQpOwogCXR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKCZzd19jb250ZXh0LT52YWxpZGF0ZV9ub2Rlcyk7CiAJdm13X2NsZWFyX3ZhbGlkYXRpb25zKHN3X2NvbnRleHQpOwotb3V0X2NvbW1pdDoKLQl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIDApOwogb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5jbWRidWZfbXV0ZXgpOwotb3V0X25vX2NtZF9tdXRleDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHZtd19leGVjYnVmX3VucGluX3BhbmljIC0gSWRsZSB0aGUgZmlmbyBhbmQgdW5waW4gdGhlIHF1ZXJ5IGJ1ZmZlci4KKyAqCisgKiBAZGV2X3ByaXY6IFRoZSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaWRsZSB0aGUgZmlmbyBhbmQgdW5waW4gdGhlIHF1ZXJ5IGJ1ZmZlcgorICogaWYgdGhlIG5vcm1hbCB3YXkgdG8gZG8gdGhpcyBoaXRzIGFuIGVycm9yLCB3aGljaCBzaG91bGQgdHlwaWNhbGx5IGJlCisgKiBleHRyZW1lbHkgcmFyZS4KKyAqLworc3RhdGljIHZvaWQgdm13X2V4ZWNidWZfdW5waW5fcGFuaWMoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwlEUk1fRVJST1IoIkNhbid0IHVucGluIHF1ZXJ5IGJ1ZmZlci4gVHJ5aW5nIHRvIHJlY292ZXIuXG4iKTsKKworCSh2b2lkKSB2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgZmFsc2UsIHRydWUsIDAsIGZhbHNlLCAxMCpIWik7CisJdm13X2JvX3BpbihkZXZfcHJpdi0+cGlubmVkX2JvLCBmYWxzZSk7CisJdm13X2JvX3BpbihkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm8sIGZhbHNlKTsKKwlkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm9fcGlubmVkID0gZmFsc2U7Cit9CisKKworLyoqCisgKiB2bXdfZXhlY2J1Zl9yZWxlYXNlX3Bpbm5lZF9ibyAtIEZsdXNoIHF1ZXJpZXMgYW5kIHVucGluIHRoZSBwaW5uZWQKKyAqIHF1ZXJ5IGJvLgorICoKKyAqIEBkZXZfcHJpdjogVGhlIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqIEBvbmx5X29uX2NpZF9tYXRjaDogT25seSBmbHVzaCBhbmQgdW5waW4gaWYgdGhlIGN1cnJlbnQgYWN0aXZlIHF1ZXJ5IGNpZAorICogbWF0Y2hlcyBAY2lkLgorICogQGNpZDogT3B0aW9uYWwgY29udGV4dCBpZCB0byBtYXRjaC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHRvIHVucGluIHRoZSBwaW5uZWQgcXVlcnkgYm8sIG9yCisgKiBhcyBhIHF1ZXJ5IGJhcnJpZXIgd2hlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBxdWVyaWVzIGhhdmUKKyAqIGZpbmlzaGVkIGJlZm9yZSB0aGUgbmV4dCBmaWZvIGNvbW1hbmQuIChGb3IgZXhhbXBsZSBvbiBoYXJkd2FyZQorICogY29udGV4dCBkZXN0cnVjdGlvbnMgd2hlcmUgdGhlIGhhcmR3YXJlIG1heSBvdGhlcndpc2UgbGVhayB1bmZpbmlzaGVkCisgKiBxdWVyaWVzKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhbnkgZmFpbHVyZSBjb2RlcywgYnV0IG1ha2UgYXR0ZW1wdHMKKyAqIHRvIGRvIHNhZmUgdW5waW5uaW5nIGluIGNhc2Ugb2YgZXJyb3JzLgorICoKKyAqIFRoZSBmdW5jdGlvbiB3aWxsIHN5bmNocm9uaXplIG9uIHRoZSBwcmV2aW91cyBxdWVyeSBiYXJyaWVyLCBhbmQgd2lsbAorICogdGh1cyBub3QgZmluaXNoIHVudGlsIHRoYXQgYmFycmllciBoYXMgZXhlY3V0ZWQuCisgKi8KK3ZvaWQgdm13X2V4ZWNidWZfcmVsZWFzZV9waW5uZWRfYm8oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgICBib29sIG9ubHlfb25fY2lkX21hdGNoLCB1aW50MzJfdCBjaWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCB2YWxpZGF0ZV9saXN0OworCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyIHBpbm5lZF92YWwsIHF1ZXJ5X3ZhbDsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2U7CisKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKKworCWlmIChkZXZfcHJpdi0+cGlubmVkX2JvID09IE5VTEwpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChvbmx5X29uX2NpZF9tYXRjaCAmJiBjaWQgIT0gZGV2X3ByaXYtPnF1ZXJ5X2NpZCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJSU5JVF9MSVNUX0hFQUQoJnZhbGlkYXRlX2xpc3QpOworCisJcGlubmVkX3ZhbC5uZXdfc3luY19vYmpfYXJnID0gKHZvaWQgKikodW5zaWduZWQgbG9uZykKKwkJRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUM7CisJcGlubmVkX3ZhbC5ibyA9IHR0bV9ib19yZWZlcmVuY2UoZGV2X3ByaXYtPnBpbm5lZF9ibyk7CisJbGlzdF9hZGRfdGFpbCgmcGlubmVkX3ZhbC5oZWFkLCAmdmFsaWRhdGVfbGlzdCk7CisKKwlxdWVyeV92YWwubmV3X3N5bmNfb2JqX2FyZyA9IHBpbm5lZF92YWwubmV3X3N5bmNfb2JqX2FyZzsKKwlxdWVyeV92YWwuYm8gPSB0dG1fYm9fcmVmZXJlbmNlKGRldl9wcml2LT5kdW1teV9xdWVyeV9ibyk7CisJbGlzdF9hZGRfdGFpbCgmcXVlcnlfdmFsLmhlYWQsICZ2YWxpZGF0ZV9saXN0KTsKKworCWRvIHsKKwkJcmV0ID0gdHRtX2V1X3Jlc2VydmVfYnVmZmVycygmdmFsaWRhdGVfbGlzdCk7CisJfSB3aGlsZSAocmV0ID09IC1FUkVTVEFSVFNZUyk7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCXZtd19leGVjYnVmX3VucGluX3BhbmljKGRldl9wcml2KTsKKwkJZ290byBvdXRfbm9fcmVzZXJ2ZTsKKwl9CisKKwlyZXQgPSB2bXdfZmlmb19lbWl0X2R1bW15X3F1ZXJ5KGRldl9wcml2LCBkZXZfcHJpdi0+cXVlcnlfY2lkKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCXZtd19leGVjYnVmX3VucGluX3BhbmljKGRldl9wcml2KTsKKwkJZ290byBvdXRfbm9fZW1pdDsKKwl9CisKKwl2bXdfYm9fcGluKGRldl9wcml2LT5waW5uZWRfYm8sIGZhbHNlKTsKKwl2bXdfYm9fcGluKGRldl9wcml2LT5kdW1teV9xdWVyeV9ibywgZmFsc2UpOworCWRldl9wcml2LT5kdW1teV9xdWVyeV9ib19waW5uZWQgPSBmYWxzZTsKKworCSh2b2lkKSB2bXdfZXhlY2J1Zl9mZW5jZV9jb21tYW5kcyhOVUxMLCBkZXZfcHJpdiwgJmZlbmNlLCBOVUxMKTsKKwl0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMoJnZhbGlkYXRlX2xpc3QsICh2b2lkICopIGZlbmNlKTsKKworCXR0bV9ib191bnJlZigmcXVlcnlfdmFsLmJvKTsKKwl0dG1fYm9fdW5yZWYoJnBpbm5lZF92YWwuYm8pOworCXR0bV9ib191bnJlZigmZGV2X3ByaXYtPnBpbm5lZF9ibyk7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKKwlyZXR1cm47CisKK291dF9ub19lbWl0OgorCXR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKCZ2YWxpZGF0ZV9saXN0KTsKK291dF9ub19yZXNlcnZlOgorCXR0bV9ib191bnJlZigmcXVlcnlfdmFsLmJvKTsKKwl0dG1fYm9fdW5yZWYoJnBpbm5lZF92YWwuYm8pOworCXR0bV9ib191bnJlZigmZGV2X3ByaXYtPnBpbm5lZF9ibyk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKK30KKworCitpbnQgdm13X2V4ZWNidWZfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KGRldik7CisJc3RydWN0IGRybV92bXdfZXhlY2J1Zl9hcmcgKmFyZyA9IChzdHJ1Y3QgZHJtX3Ztd19leGVjYnVmX2FyZyAqKWRhdGE7CisJc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIgPSB2bXdfbWFzdGVyKGZpbGVfcHJpdi0+bWFzdGVyKTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gZXh0ZW5kIHRoZSBpb2N0bCBhcmd1bWVudCB3aGlsZQorCSAqIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorCSAqIFdlIHRha2UgZGlmZmVyZW50IGNvZGUgcGF0aHMgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZgorCSAqIGFyZy0+dmVyc2lvbi4KKwkgKi8KKworCWlmICh1bmxpa2VseShhcmctPnZlcnNpb24gIT0gRFJNX1ZNV19FWEVDQlVGX1ZFUlNJT04pKSB7CisJCURSTV9FUlJPUigiSW5jb3JyZWN0IGV4ZWNidWYgdmVyc2lvbi5cbiIpOworCQlEUk1fRVJST1IoIllvdSdyZSBydW5uaW5nIG91dGRhdGVkIGV4cGVyaW1lbnRhbCAiCisJCQkgICJ2bXdnZnggdXNlci1zcGFjZSBkcml2ZXJzLiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSB0dG1fcmVhZF9sb2NrKCZ2bWFzdGVyLT5sb2NrLCB0cnVlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdm13X2V4ZWNidWZfcHJvY2VzcyhmaWxlX3ByaXYsIGRldl9wcml2LAorCQkJCSAgKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpYXJnLT5jb21tYW5kcywKKwkJCQkgIE5VTEwsIGFyZy0+Y29tbWFuZF9zaXplLCBhcmctPnRocm90dGxlX3VzLAorCQkJCSAgKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpYXJnLT5mZW5jZV9yZXApOworCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJdm13X2ttc19jdXJzb3JfcG9zdF9leGVjYnVmKGRldl9wcml2KTsKKworb3V0X3VubG9jazoKIAl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmIuYwppbmRleCBiZmFiNjBjLi4zNGU1MWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZiLmMKQEAgLTI2LDYgKzI2LDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJ2bXdnZnhfZHJ2LmgiCiAKQEAgLTE1OCwxMCArMTYwLDE0IEBACiB7CiAJc3RydWN0IHZtd19mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2ID0gcGFyLT52bXdfcHJpdjsKKwlpbnQgcmV0OwogCi0Jdm13X2ttc193cml0ZV9zdmdhKHZtd19wcml2LCBpbmZvLT52YXIueHJlcywgaW5mby0+dmFyLnlyZXMsCi0JCQkgICBpbmZvLT5maXgubGluZV9sZW5ndGgsCi0JCQkgICBwYXItPmJwcCwgcGFyLT5kZXB0aCk7CisJcmV0ID0gdm13X2ttc193cml0ZV9zdmdhKHZtd19wcml2LCBpbmZvLT52YXIueHJlcywgaW5mby0+dmFyLnlyZXMsCisJCQkJIGluZm8tPmZpeC5saW5lX2xlbmd0aCwKKwkJCQkgcGFyLT5icHAsIHBhci0+ZGVwdGgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlpZiAodm13X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0RJU1BMQVlfVE9QT0xPR1kpIHsKIAkJLyogVE9ETyBjaGVjayBpZiBwaXRjaCBhbmQgb2Zmc2V0IGNoYW5nZXMgKi8KIAkJdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19OVU1fR1VFU1RfRElTUExBWVMsIDEpOwpAQCAtNDA1LDE0ICs0MTEsMTQgQEAKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAl1bnNpZ25lZCBpbml0aWFsX3dpZHRoLCBpbml0aWFsX2hlaWdodDsKIAl1bnNpZ25lZCBmYl93aWR0aCwgZmJfaGVpZ2h0OwotCXVuc2lnbmVkIGZiX2JicCwgZmJfZGVwdGgsIGZiX29mZnNldCwgZmJfcGl0Y2gsIGZiX3NpemU7CisJdW5zaWduZWQgZmJfYnBwLCBmYl9kZXB0aCwgZmJfb2Zmc2V0LCBmYl9waXRjaCwgZmJfc2l6ZTsKIAlpbnQgcmV0OwogCiAJLyogWFhYIFRoZXNlIHNob3VsZG4ndCBiZSBoYXJkY29kZWQuICovCiAJaW5pdGlhbF93aWR0aCA9IDgwMDsKIAlpbml0aWFsX2hlaWdodCA9IDYwMDsKIAotCWZiX2JicCA9IDMyOworCWZiX2JwcCA9IDMyOwogCWZiX2RlcHRoID0gMjQ7CiAKIAkvKiBYWFggQXMgc2hvdWxkbid0IHRoZXNlIGJlIGFzIHdlbGwuICovCkBAIC00MjIsNyArNDI4LDcgQEAKIAlpbml0aWFsX3dpZHRoID0gbWluKGZiX3dpZHRoLCBpbml0aWFsX3dpZHRoKTsKIAlpbml0aWFsX2hlaWdodCA9IG1pbihmYl9oZWlnaHQsIGluaXRpYWxfaGVpZ2h0KTsKIAotCWZiX3BpdGNoID0gZmJfd2lkdGggKiBmYl9iYnAgLyA4OworCWZiX3BpdGNoID0gZmJfd2lkdGggKiBmYl9icHAgLyA4OwogCWZiX3NpemUgPSBmYl9waXRjaCAqIGZiX2hlaWdodDsKIAlmYl9vZmZzZXQgPSB2bXdfcmVhZCh2bXdfcHJpdiwgU1ZHQV9SRUdfRkJfT0ZGU0VUKTsKIApAQCAtNDM3LDcgKzQ0Myw3IEBACiAJcGFyID0gaW5mby0+cGFyOwogCXBhci0+dm13X3ByaXYgPSB2bXdfcHJpdjsKIAlwYXItPmRlcHRoID0gZmJfZGVwdGg7Ci0JcGFyLT5icHAgPSBmYl9iYnA7CisJcGFyLT5icHAgPSBmYl9icHA7CiAJcGFyLT52bWFsbG9jID0gTlVMTDsKIAlwYXItPm1heF93aWR0aCA9IGZiX3dpZHRoOwogCXBhci0+bWF4X2hlaWdodCA9IGZiX2hlaWdodDsKQEAgLTU4OCw1OCArNTk0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHZtd19kbWFidWZfZnJvbV92cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYsCi0JCQkgc3RydWN0IHZtd19kbWFfYnVmZmVyICp2bXdfYm8pCi17Ci0Jc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9ICZ2bXdfYm8tPmJhc2U7Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShibywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgJnZtd19zeXNfcGxhY2VtZW50LCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2bXdfZG1hYnVmX3RvX3N0YXJ0X29mX3ZyYW0oc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdiwKLQkJCQlzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKnZtd19ibykKLXsKLQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gJnZtd19iby0+YmFzZTsKLQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCBuZV9wbGFjZW1lbnQgPSB2bXdfdnJhbV9uZV9wbGFjZW1lbnQ7Ci0JaW50IHJldCA9IDA7Ci0KLQluZV9wbGFjZW1lbnQubHBmbiA9IGJvLT5udW1fcGFnZXM7Ci0KLQkvKiBpbnRlcnVwdGFibGU/ICovCi0JcmV0ID0gdHRtX3dyaXRlX2xvY2soJnZtd19wcml2LT5hY3RpdmVfbWFzdGVyLT5sb2NrLCBmYWxzZSk7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKLQlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQlnb3RvIGVycl91bmxvY2s7Ci0KLQlpZiAoYm8tPm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSAmJgotCSAgICBiby0+bWVtLnN0YXJ0IDwgYm8tPm51bV9wYWdlcyAmJgotCSAgICBiby0+bWVtLnN0YXJ0ID4gMCkKLQkJKHZvaWQpIHR0bV9ib192YWxpZGF0ZShibywgJnZtd19zeXNfcGxhY2VtZW50LCBmYWxzZSwKLQkJCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKLQotCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgJm5lX3BsYWNlbWVudCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLQkvKiBDb3VsZCBwcm9iYWJseSBidWcgb24gKi8KLQlXQVJOX09OKGJvLT5vZmZzZXQgIT0gMCk7Ci0KLQl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKLWVycl91bmxvY2s6Ci0JdHRtX3dyaXRlX3VubG9jaygmdm13X3ByaXYtPmFjdGl2ZV9tYXN0ZXItPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQogaW50IHZtd19mYl9vZmYoc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKQEAgLTY2MSw3ICs2MTUsNyBAQAogCXBhci0+Ym9fcHRyID0gTlVMTDsKIAl0dG1fYm9fa3VubWFwKCZwYXItPm1hcCk7CiAKLQl2bXdfZG1hYnVmX2Zyb21fdnJhbSh2bXdfcHJpdiwgcGFyLT52bXdfYm8pOworCXZtd19kbWFidWZfdW5waW4odm13X3ByaXYsIHBhci0+dm13X2JvLCBmYWxzZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY4Nyw3ICs2NDEsNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGF0IGFsbCBvdmVybGF5cyBhcmUgc3RvcGVkIHdoZW4gd2UgdGFrZSBvdmVyICovCiAJdm13X292ZXJsYXlfc3RvcF9hbGwodm13X3ByaXYpOwogCi0JcmV0ID0gdm13X2RtYWJ1Zl90b19zdGFydF9vZl92cmFtKHZtd19wcml2LCBwYXItPnZtd19ibyk7CisJcmV0ID0gdm13X2RtYWJ1Zl90b19zdGFydF9vZl92cmFtKHZtd19wcml2LCBwYXItPnZtd19ibywgdHJ1ZSwgZmFsc2UpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJRFJNX0VSUk9SKCJjb3VsZCBub3QgbW92ZSBidWZmZXIgdG8gc3RhcnQgb2YgVlJBTVxuIik7CiAJCWdvdG8gZXJyX25vX2J1ZmZlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mZW5jZS5jCmluZGV4IDYxZWFjYzEuLjE1ZmIyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZlbmNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmVuY2UuYwpAQCAtMSw2ICsxLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIENvcHlyaWdodCDCqSAyMDExIFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQpAQCAtMjUsMTQ5ICsyNSwxMTAwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KKyNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAidm13Z2Z4X2Rydi5oIgogCi1zdHJ1Y3Qgdm13X2ZlbmNlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7Ci0JdWludDMyX3Qgc2VxdWVuY2U7Ci0Jc3RydWN0IHRpbWVzcGVjIHN1Ym1pdHRlZDsKKyNkZWZpbmUgVk1XX0ZFTkNFX1dSQVAgKDEgPDwgMzEpCisKK3N0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciB7CisJaW50IG51bV9mZW5jZV9vYmplY3RzOworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXY7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgZmVuY2VfbGlzdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwl1MzIgdXNlcl9mZW5jZV9zaXplOworCXUzMiBmZW5jZV9zaXplOworCXUzMiBldmVudF9mZW5jZV9hY3Rpb25fc2l6ZTsKKwlib29sIGZpZm9fZG93bjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNsZWFudXBfbGlzdDsKKwl1aW50MzJfdCBwZW5kaW5nX2FjdGlvbnNbVk1XX0FDVElPTl9NQVhdOworCXN0cnVjdCBtdXRleCBnb2FsX2lycV9tdXRleDsKKwlib29sIGdvYWxfaXJxX29uOyAvKiBQcm90ZWN0ZWQgYnkgQGdvYWxfaXJxX211dGV4ICovCisJYm9vbCBzZXFub192YWxpZDsgLyogUHJvdGVjdGVkIGJ5IEBsb2NrLCBhbmQgbWF5IG5vdCBiZSBzZXQgdG8gdHJ1ZQorCQkJICAgICB3aXRob3V0IHRoZSBAZ29hbF9pcnFfbXV0ZXggaGVsZC4gKi8KIH07CiAKLXZvaWQgdm13X2ZlbmNlX3F1ZXVlX2luaXQoc3RydWN0IHZtd19mZW5jZV9xdWV1ZSAqcXVldWUpCi17Ci0JSU5JVF9MSVNUX0hFQUQoJnF1ZXVlLT5oZWFkKTsKLQlxdWV1ZS0+bGFnID0gbnNfdG9fdGltZXNwZWMoMCk7Ci0JZ2V0cmF3bW9ub3RvbmljKCZxdWV1ZS0+bGFnX3RpbWUpOwotCXNwaW5fbG9ja19pbml0KCZxdWV1ZS0+bG9jayk7Ci19CitzdHJ1Y3Qgdm13X3VzZXJfZmVuY2UgeworCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgYmFzZTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiBmZW5jZTsKK307CiAKLXZvaWQgdm13X2ZlbmNlX3F1ZXVlX3Rha2Vkb3duKHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlKQotewotCXN0cnVjdCB2bXdfZmVuY2UgKmZlbmNlLCAqbmV4dDsKKy8qKgorICogc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24gLSBmZW5jZSBhY3Rpb24gdGhhdCBkZWxpdmVycyBhIGRybSBldmVudC4KKyAqCisgKiBAZTogQSBzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQgdGhhdCBjb250cm9scyB0aGUgZXZlbnQgZGVsaXZlcnkuCisgKiBAYWN0aW9uOiBBIHN0cnVjdCB2bXdfZmVuY2VfYWN0aW9uIHRvIGhvb2sgdXAgdG8gYSBmZW5jZS4KKyAqIEBmZW5jZTogQSByZWZlcmVuY2VkIHBvaW50ZXIgdG8gdGhlIGZlbmNlIHRvIGtlZXAgaXQgYWxpdmUgd2hpbGUgQGFjdGlvbgorICogaGFuZ3Mgb24gaXQuCisgKiBAZGV2OiBQb2ludGVyIHRvIGEgc3RydWN0IGRybV9kZXZpY2Ugc28gd2UgY2FuIGFjY2VzcyB0aGUgZXZlbnQgc3R1ZmYuCisgKiBAa3JlZjogQm90aCBAZSBhbmQgQGFjdGlvbiBoYXMgZGVzdHJ1Y3RvcnMsIHNvIHdlIG5lZWQgdG8gcmVmY291bnQuCisgKiBAc2l6ZTogU2l6ZSBhY2NvdW50ZWQgZm9yIHRoaXMgb2JqZWN0LgorICogQHR2X3NlYzogSWYgbm9uLW51bGwsIHRoZSB2YXJpYWJsZSBwb2ludGVkIHRvIHdpbGwgYmUgYXNzaWduZWQKKyAqIGN1cnJlbnQgdGltZSB0dl9zZWMgdmFsIHdoZW4gdGhlIGZlbmNlIHNpZ25hbHMuCisgKiBAdHZfdXNlYzogTXVzdCBiZSBzZXQgaWYgQHR2X3NlYyBpcyBzZXQsIGFuZCB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byB3aWxsCisgKiBiZSBhc3NpZ25lZCB0aGUgY3VycmVudCB0aW1lIHR2X3VzZWMgdmFsIHdoZW4gdGhlIGZlbmNlIHNpZ25hbHMuCisgKi8KK3N0cnVjdCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uIHsKKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQgZTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiBhY3Rpb247CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJc3RydWN0IGtyZWYga3JlZjsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90ICp0dl9zZWM7CisJdWludDMyX3QgKnR2X3VzZWM7Cit9OwogCi0Jc3Bpbl9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZlbmNlLCBuZXh0LCAmcXVldWUtPmhlYWQsIGhlYWQpIHsKKy8qKgorICogTm90ZSBvbiBmZW5jaW5nIHN1YnN5c3RlbSB1c2FnZSBvZiBpcnFzOgorICogVHlwaWNhbGx5IHRoZSB2bXdfZmVuY2VzX3VwZGF0ZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqCisgKiBhKSBXaGVuIGEgbmV3IGZlbmNlIHNlcW5vIGhhcyBiZWVuIHN1Ym1pdHRlZCBieSB0aGUgZmlmbyBjb2RlLgorICogYikgT24tZGVtYW5kIHdoZW4gd2UgaGF2ZSB3YWl0ZXJzLiBTbGVlcGluZyB3YWl0ZXJzIHdpbGwgc3dpdGNoIG9uIHRoZQorICogQU5ZX0ZFTkNFIGlycSBhbmQgY2FsbCB2bXdfZmVuY2VzX3VwZGF0ZSBmdW5jdGlvbiBlYWNoIHRpbWUgYW4gQU5ZX0ZFTkNFCisgKiBpcnEgaXMgcmVjZWl2ZWQuIFdoZW4gdGhlIGxhc3QgZmVuY2Ugd2FpdGVyIGlzIGdvbmUsIHRoYXQgSVJRIGlzIG1hc2tlZAorICogYXdheS4KKyAqCisgKiBJbiBzaXR1YXRpb25zIHdoZXJlIHRoZXJlIGFyZSBubyB3YWl0ZXJzIGFuZCB3ZSBkb24ndCBzdWJtaXQgYW55IG5ldyBmZW5jZXMsCisgKiBmZW5jZSBvYmplY3RzIG1heSBub3QgYmUgc2lnbmFsZWQuIFRoaXMgaXMgcGVyZmVjdGx5IE9LLCBzaW5jZSB0aGVyZSBhcmUKKyAqIG5vIGNvbnN1bWVycyBvZiB0aGUgc2lnbmFsZWQgZGF0YSwgYnV0IHRoYXQgaXMgTk9UIG9rIHdoZW4gdGhlcmUgYXJlIGZlbmNlCisgKiBhY3Rpb25zIGF0dGFjaGVkIHRvIGEgZmVuY2UuIFRoZSBmZW5jaW5nIHN1YnN5c3RlbSB0aGVuIG1ha2VzIHVzZSBvZiB0aGUKKyAqIEZFTkNFX0dPQUwgaXJxIGFuZCBzZXRzIHRoZSBmZW5jZSBnb2FsIHNlcW5vIHRvIHRoYXQgb2YgdGhlIG5leHQgZmVuY2UKKyAqIHdoaWNoIGhhcyBhbiBhY3Rpb24gYXR0YWNoZWQsIGFuZCBlYWNoIHRpbWUgdm13X2ZlbmNlc191cGRhdGUgaXMgY2FsbGVkLAorICogdGhlIHN1YnN5c3RlbSBtYWtlcyBzdXJlIHRoZSBmZW5jZSBnb2FsIHNlcW5vIGlzIHVwZGF0ZWQuCisgKgorICogVGhlIGZlbmNlIGdvYWwgc2Vxbm8gaXJxIGlzIG9uIGFzIGxvbmcgYXMgdGhlcmUgYXJlIHVuc2lnbmFsZWQgZmVuY2UKKyAqIG9iamVjdHMgd2l0aCBhY3Rpb25zIGF0dGFjaGVkIHRvIHRoZW0uCisgKi8KKworc3RhdGljIHZvaWQgdm13X2ZlbmNlX29ial9kZXN0cm95X2xvY2tlZChzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UgPQorCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHZtd19mZW5jZV9vYmosIGtyZWYpOworCisJc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuID0gZmVuY2UtPmZtYW47CisJdW5zaWduZWQgaW50IG51bV9mZW5jZXM7CisKKwlsaXN0X2RlbF9pbml0KCZmZW5jZS0+aGVhZCk7CisJbnVtX2ZlbmNlcyA9IC0tZm1hbi0+bnVtX2ZlbmNlX29iamVjdHM7CisJc3Bpbl91bmxvY2tfaXJxKCZmbWFuLT5sb2NrKTsKKwlpZiAoZmVuY2UtPmRlc3Ryb3kpCisJCWZlbmNlLT5kZXN0cm95KGZlbmNlKTsKKwllbHNlCiAJCWtmcmVlKGZlbmNlKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKworCXNwaW5fbG9ja19pcnEoJmZtYW4tPmxvY2spOwogfQogCi1pbnQgdm13X2ZlbmNlX3B1c2goc3RydWN0IHZtd19mZW5jZV9xdWV1ZSAqcXVldWUsCi0JCSAgIHVpbnQzMl90IHNlcXVlbmNlKQorCisvKioKKyAqIEV4ZWN1dGUgc2lnbmFsIGFjdGlvbnMgb24gZmVuY2VzIHJlY2VudGx5IHNpZ25hbGVkLgorICogVGhpcyBpcyBkb25lIGZyb20gYSB3b3JrcXVldWUgc28gd2UgZG9uJ3QgaGF2ZSB0byBleGVjdXRlCisgKiBzaWduYWwgYWN0aW9ucyBmcm9tIGF0b21pYyBjb250ZXh0LgorICovCisKK3N0YXRpYyB2b2lkIHZtd19mZW5jZV93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB2bXdfZmVuY2UgKmZlbmNlID0ga21hbGxvYyhzaXplb2YoKmZlbmNlKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciwgd29yayk7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB2bXdfZmVuY2VfYWN0aW9uICphY3Rpb24sICpuZXh0X2FjdGlvbjsKKwlib29sIHNlcW5vX3ZhbGlkOwogCi0JaWYgKHVubGlrZWx5KCFmZW5jZSkpCi0JCXJldHVybiAtRU5PTUVNOworCWRvIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmxpc3QpOworCQltdXRleF9sb2NrKCZmbWFuLT5nb2FsX2lycV9tdXRleCk7CiAKLQlmZW5jZS0+c2VxdWVuY2UgPSBzZXF1ZW5jZTsKLQlnZXRyYXdtb25vdG9uaWMoJmZlbmNlLT5zdWJtaXR0ZWQpOwotCXNwaW5fbG9jaygmcXVldWUtPmxvY2spOwotCWxpc3RfYWRkX3RhaWwoJmZlbmNlLT5oZWFkLCAmcXVldWUtPmhlYWQpOwotCXNwaW5fdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmZtYW4tPmxvY2spOworCQlsaXN0X3NwbGljZV9pbml0KCZmbWFuLT5jbGVhbnVwX2xpc3QsICZsaXN0KTsKKwkJc2Vxbm9fdmFsaWQgPSBmbWFuLT5zZXFub192YWxpZDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZmbWFuLT5sb2NrKTsKIAotCXJldHVybiAwOworCQlpZiAoIXNlcW5vX3ZhbGlkICYmIGZtYW4tPmdvYWxfaXJxX29uKSB7CisJCQlmbWFuLT5nb2FsX2lycV9vbiA9IGZhbHNlOworCQkJdm13X2dvYWxfd2FpdGVyX3JlbW92ZShmbWFuLT5kZXZfcHJpdik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZmbWFuLT5nb2FsX2lycV9tdXRleCk7CisKKwkJaWYgKGxpc3RfZW1wdHkoJmxpc3QpKQorCQkJcmV0dXJuOworCisJCS8qCisJCSAqIEF0IHRoaXMgcG9pbnQsIG9ubHkgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUKKwkJICogbGlzdCBoZWFkcyBvZiB0aGUgYWN0aW9ucyB3ZSBoYXZlIG9uIHRoZSBwcml2YXRlIGxpc3QuCisJCSAqIGhlbmNlIGZtYW46OmxvY2sgbm90IGhlbGQuCisJCSAqLworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhY3Rpb24sIG5leHRfYWN0aW9uLCAmbGlzdCwgaGVhZCkgeworCQkJbGlzdF9kZWxfaW5pdCgmYWN0aW9uLT5oZWFkKTsKKwkJCWlmIChhY3Rpb24tPmNsZWFudXApCisJCQkJYWN0aW9uLT5jbGVhbnVwKGFjdGlvbik7CisJCX0KKwl9IHdoaWxlICgxKTsKIH0KIAotaW50IHZtd19mZW5jZV9wdWxsKHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlLAotCQkgICB1aW50MzJfdCBzaWduYWxlZF9zZXF1ZW5jZSkKK3N0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqdm13X2ZlbmNlX21hbmFnZXJfaW5pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQogewotCXN0cnVjdCB2bXdfZmVuY2UgKmZlbmNlLCAqbmV4dDsKLQlzdHJ1Y3QgdGltZXNwZWMgbm93OwotCWJvb2wgdXBkYXRlZCA9IGZhbHNlOworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiA9IGt6YWxsb2Moc2l6ZW9mKCpmbWFuKSwgR0ZQX0tFUk5FTCk7CiAKLQlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKLQlnZXRyYXdtb25vdG9uaWMoJm5vdyk7CisJaWYgKHVubGlrZWx5KGZtYW4gPT0gTlVMTCkpCisJCXJldHVybiBOVUxMOwogCi0JaWYgKGxpc3RfZW1wdHkoJnF1ZXVlLT5oZWFkKSkgewotCQlxdWV1ZS0+bGFnID0gbnNfdG9fdGltZXNwZWMoMCk7Ci0JCXF1ZXVlLT5sYWdfdGltZSA9IG5vdzsKLQkJdXBkYXRlZCA9IHRydWU7CisJZm1hbi0+ZGV2X3ByaXYgPSBkZXZfcHJpdjsKKwlzcGluX2xvY2tfaW5pdCgmZm1hbi0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmZtYW4tPmZlbmNlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZmbWFuLT5jbGVhbnVwX2xpc3QpOworCUlOSVRfV09SSygmZm1hbi0+d29yaywgJnZtd19mZW5jZV93b3JrX2Z1bmMpOworCWZtYW4tPmZpZm9fZG93biA9IHRydWU7CisJZm1hbi0+dXNlcl9mZW5jZV9zaXplID0gdHRtX3JvdW5kX3BvdChzaXplb2Yoc3RydWN0IHZtd191c2VyX2ZlbmNlKSk7CisJZm1hbi0+ZmVuY2Vfc2l6ZSA9IHR0bV9yb3VuZF9wb3Qoc2l6ZW9mKHN0cnVjdCB2bXdfZmVuY2Vfb2JqKSk7CisJZm1hbi0+ZXZlbnRfZmVuY2VfYWN0aW9uX3NpemUgPQorCQl0dG1fcm91bmRfcG90KHNpemVvZihzdHJ1Y3Qgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbikpOworCW11dGV4X2luaXQoJmZtYW4tPmdvYWxfaXJxX211dGV4KTsKKworCXJldHVybiBmbWFuOworfQorCit2b2lkIHZtd19mZW5jZV9tYW5hZ2VyX3Rha2Vkb3duKHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbikKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlib29sIGxpc3RzX2VtcHR5OworCisJKHZvaWQpIGNhbmNlbF93b3JrX3N5bmMoJmZtYW4tPndvcmspOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7CisJbGlzdHNfZW1wdHkgPSBsaXN0X2VtcHR5KCZmbWFuLT5mZW5jZV9saXN0KSAmJgorCQlsaXN0X2VtcHR5KCZmbWFuLT5jbGVhbnVwX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7CisKKwlCVUdfT04oIWxpc3RzX2VtcHR5KTsKKwlrZnJlZShmbWFuKTsKK30KKworc3RhdGljIGludCB2bXdfZmVuY2Vfb2JqX2luaXQoc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuLAorCQkJICAgICAgc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlLAorCQkJICAgICAgdTMyIHNlcW5vLAorCQkJICAgICAgdWludDMyX3QgbWFzaywKKwkJCSAgICAgIHZvaWQgKCpkZXN0cm95KSAoc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlKSkKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwl1bnNpZ25lZCBpbnQgbnVtX2ZlbmNlczsKKwlpbnQgcmV0ID0gMDsKKworCWZlbmNlLT5zZXFubyA9IHNlcW5vOworCUlOSVRfTElTVF9IRUFEKCZmZW5jZS0+c2VxX3Bhc3NlZF9hY3Rpb25zKTsKKwlmZW5jZS0+Zm1hbiA9IGZtYW47CisJZmVuY2UtPnNpZ25hbGVkID0gMDsKKwlmZW5jZS0+c2lnbmFsX21hc2sgPSBtYXNrOworCWtyZWZfaW5pdCgmZmVuY2UtPmtyZWYpOworCWZlbmNlLT5kZXN0cm95ID0gZGVzdHJveTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmZW5jZS0+cXVldWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7CisJaWYgKHVubGlrZWx5KGZtYW4tPmZpZm9fZG93bikpIHsKKwkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZlbmNlLCBuZXh0LCAmcXVldWUtPmhlYWQsIGhlYWQpIHsKLQkJaWYgKHNpZ25hbGVkX3NlcXVlbmNlIC0gZmVuY2UtPnNlcXVlbmNlID4gKDEgPDwgMzApKQotCQkJY29udGludWU7Ci0KLQkJcXVldWUtPmxhZyA9IHRpbWVzcGVjX3N1Yihub3csIGZlbmNlLT5zdWJtaXR0ZWQpOwotCQlxdWV1ZS0+bGFnX3RpbWUgPSBub3c7Ci0JCXVwZGF0ZWQgPSB0cnVlOwotCQlsaXN0X2RlbCgmZmVuY2UtPmhlYWQpOwotCQlrZnJlZShmZW5jZSk7Ci0JfQorCWxpc3RfYWRkX3RhaWwoJmZlbmNlLT5oZWFkLCAmZm1hbi0+ZmVuY2VfbGlzdCk7CisJbnVtX2ZlbmNlcyA9ICsrZm1hbi0+bnVtX2ZlbmNlX29iamVjdHM7CiAKIG91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gKHVwZGF0ZWQpID8gMCA6IC1FQlVTWTsKIH0KIAotc3RhdGljIHN0cnVjdCB0aW1lc3BlYyB2bXdfdGltZXNwZWNfYWRkKHN0cnVjdCB0aW1lc3BlYyB0MSwKLQkJCQkJc3RydWN0IHRpbWVzcGVjIHQyKQorc3RydWN0IHZtd19mZW5jZV9vYmogKnZtd19mZW5jZV9vYmpfcmVmZXJlbmNlKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSkKIHsKLQl0MS50dl9zZWMgKz0gdDIudHZfc2VjOwotCXQxLnR2X25zZWMgKz0gdDIudHZfbnNlYzsKLQlpZiAodDEudHZfbnNlYyA+PSAxMDAwMDAwMDAwTCkgewotCQl0MS50dl9zZWMgKz0gMTsKLQkJdDEudHZfbnNlYyAtPSAxMDAwMDAwMDAwTDsKKwlpZiAodW5saWtlbHkoZmVuY2UgPT0gTlVMTCkpCisJCXJldHVybiBOVUxMOworCisJa3JlZl9nZXQoJmZlbmNlLT5rcmVmKTsKKwlyZXR1cm4gZmVuY2U7Cit9CisKKy8qKgorICogdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZQorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSBub3QgYmUgZW50ZXJlZCB3aXRoIGRpc2FibGVkIGlycXMgc2luY2UKKyAqIGl0IG1heSByZS1lbmFibGUgdGhlbSBpbiB0aGUgZGVzdHJveSBmdW5jdGlvbi4KKyAqCisgKi8KK3ZvaWQgdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZShzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKmZlbmNlX3ApCit7CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlID0gKmZlbmNlX3A7CisJc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuOworCisJaWYgKHVubGlrZWx5KGZlbmNlID09IE5VTEwpKQorCQlyZXR1cm47CisKKwlmbWFuID0gZmVuY2UtPmZtYW47CisJKmZlbmNlX3AgPSBOVUxMOworCXNwaW5fbG9ja19pcnEoJmZtYW4tPmxvY2spOworCUJVR19PTihhdG9taWNfcmVhZCgmZmVuY2UtPmtyZWYucmVmY291bnQpID09IDApOworCWtyZWZfcHV0KCZmZW5jZS0+a3JlZiwgdm13X2ZlbmNlX29ial9kZXN0cm95X2xvY2tlZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZmbWFuLT5sb2NrKTsKK30KKwordm9pZCB2bXdfZmVuY2VzX3BlcmZvcm1fYWN0aW9ucyhzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4sCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiAqYWN0aW9uLCAqbmV4dF9hY3Rpb247CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0aW9uLCBuZXh0X2FjdGlvbiwgbGlzdCwgaGVhZCkgeworCQlsaXN0X2RlbF9pbml0KCZhY3Rpb24tPmhlYWQpOworCQlmbWFuLT5wZW5kaW5nX2FjdGlvbnNbYWN0aW9uLT50eXBlXS0tOworCQlpZiAoYWN0aW9uLT5zZXFfcGFzc2VkICE9IE5VTEwpCisJCQlhY3Rpb24tPnNlcV9wYXNzZWQoYWN0aW9uKTsKKworCQkvKgorCQkgKiBBZGQgdGhlIGNsZWFudXAgYWN0aW9uIHRvIHRoZSBjbGVhbnVwIGxpc3Qgc28gdGhhdAorCQkgKiBpdCB3aWxsIGJlIHBlcmZvcm1lZCBieSBhIHdvcmtlciB0YXNrLgorCQkgKi8KKworCQlsaXN0X2FkZF90YWlsKCZhY3Rpb24tPmhlYWQsICZmbWFuLT5jbGVhbnVwX2xpc3QpOworCX0KK30KKworLyoqCisgKiB2bXdfZmVuY2VfZ29hbF9uZXdfbG9ja2VkIC0gRmlndXJlIG91dCBhIG5ldyBkZXZpY2UgZmVuY2UgZ29hbAorICogc2Vxbm8gaWYgbmVlZGVkLgorICoKKyAqIEBmbWFuOiBQb2ludGVyIHRvIGEgZmVuY2UgbWFuYWdlci4KKyAqIEBwYXNzZWRfc2Vxbm86IFRoZSBzZXFubyB0aGUgZGV2aWNlIGN1cnJlbnRseSBzaWduYWxzIGFzIHBhc3NlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgZmVuY2UgbWFuYWdlciBsb2NrIGhlbGQuCisgKiBJdCBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gd2UgaGF2ZSBhIG5ldyBwYXNzZWRfc2Vxbm8sIGFuZAorICogd2UgbWlnaHQgbmVlZCB0byB1cGRhdGUgdGhlIGZlbmNlIGdvYWwuIEl0IGNoZWNrcyB0byBzZWUgd2hldGhlcgorICogdGhlIGN1cnJlbnQgZmVuY2UgZ29hbCBoYXMgYWxyZWFkeSBwYXNzZWQsIGFuZCwgaW4gdGhhdCBjYXNlLAorICogc2NhbnMgdGhyb3VnaCBhbGwgdW5zaWduYWxlZCBmZW5jZXMgdG8gZ2V0IHRoZSBuZXh0IGZlbmNlIG9iamVjdCB3aXRoIGFuCisgKiBhY3Rpb24gYXR0YWNoZWQsIGFuZCBzZXRzIHRoZSBzZXFubyBvZiB0aGF0IGZlbmNlIGFzIGEgbmV3IGZlbmNlIGdvYWwuCisgKgorICogcmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgZ29hbCBzZXFubyB3YXMgdXBkYXRlZC4gRmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgYm9vbCB2bXdfZmVuY2VfZ29hbF9uZXdfbG9ja2VkKHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiwKKwkJCQkgICAgICB1MzIgcGFzc2VkX3NlcW5vKQoreworCXUzMiBnb2FsX3NlcW5vOworCV9fbGUzMiBfX2lvbWVtICpmaWZvX21lbTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2U7CisKKwlpZiAobGlrZWx5KCFmbWFuLT5zZXFub192YWxpZCkpCisJCXJldHVybiBmYWxzZTsKKworCWZpZm9fbWVtID0gZm1hbi0+ZGV2X3ByaXYtPm1taW9fdmlydDsKKwlnb2FsX3NlcW5vID0gaW9yZWFkMzIoZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0VfR09BTCk7CisJaWYgKGxpa2VseShwYXNzZWRfc2Vxbm8gLSBnb2FsX3NlcW5vID49IFZNV19GRU5DRV9XUkFQKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZm1hbi0+c2Vxbm9fdmFsaWQgPSBmYWxzZTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZlbmNlLCAmZm1hbi0+ZmVuY2VfbGlzdCwgaGVhZCkgeworCQlpZiAoIWxpc3RfZW1wdHkoJmZlbmNlLT5zZXFfcGFzc2VkX2FjdGlvbnMpKSB7CisJCQlmbWFuLT5zZXFub192YWxpZCA9IHRydWU7CisJCQlpb3dyaXRlMzIoZmVuY2UtPnNlcW5vLAorCQkJCSAgZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0VfR09BTCk7CisJCQlicmVhazsKKwkJfQogCX0KIAotCXJldHVybiB0MTsKLX0KLQotc3RhdGljIHN0cnVjdCB0aW1lc3BlYyB2bXdfZmlmb19sYWcoc3RydWN0IHZtd19mZW5jZV9xdWV1ZSAqcXVldWUpCi17Ci0Jc3RydWN0IHRpbWVzcGVjIG5vdzsKLQotCXNwaW5fbG9jaygmcXVldWUtPmxvY2spOwotCWdldHJhd21vbm90b25pYygmbm93KTsKLQlxdWV1ZS0+bGFnID0gdm13X3RpbWVzcGVjX2FkZChxdWV1ZS0+bGFnLAotCQkJCSAgICAgIHRpbWVzcGVjX3N1Yihub3csIHF1ZXVlLT5sYWdfdGltZSkpOwotCXF1ZXVlLT5sYWdfdGltZSA9IG5vdzsKLQlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOwotCXJldHVybiBxdWV1ZS0+bGFnOworCXJldHVybiB0cnVlOwogfQogCiAKLXN0YXRpYyBib29sIHZtd19sYWdfbHQoc3RydWN0IHZtd19mZW5jZV9xdWV1ZSAqcXVldWUsCi0JCSAgICAgICB1aW50MzJfdCB1cykKKy8qKgorICogdm13X2ZlbmNlX2dvYWxfY2hlY2tfbG9ja2VkIC0gUmVwbGFjZSB0aGUgZGV2aWNlIGZlbmNlIGdvYWwgc2Vxbm8gaWYKKyAqIG5lZWRlZC4KKyAqCisgKiBAZmVuY2U6IFBvaW50ZXIgdG8gYSBzdHJ1Y3Qgdm13X2ZlbmNlX29iaiB0aGUgc2Vxbm8gb2Ygd2hpY2ggc2hvdWxkIGJlCisgKiBjb25zaWRlcmVkIGFzIGEgZGV2aWNlIGZlbmNlIGdvYWwuCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGZlbmNlIG1hbmFnZXIgbG9jayBoZWxkLgorICogSXQgaXMgdHlwaWNhbGx5IGNhbGxlZCB3aGVuIGFuIGFjdGlvbiBoYXMgYmVlbiBhdHRhY2hlZCB0byBhIGZlbmNlIHRvCisgKiBjaGVjayB3aGV0aGVyIHRoZSBzZXFubyBvZiB0aGF0IGZlbmNlIHNob3VsZCBiZSB1c2VkIGZvciBhIGZlbmNlCisgKiBnb2FsIGludGVycnVwdC4gVGhpcyBpcyB0eXBpY2FsbHkgbmVlZGVkIGlmIHRoZSBjdXJyZW50IGZlbmNlIGdvYWwgaXMKKyAqIGludmFsaWQsIG9yIGhhcyBhIGhpZ2hlciBzZXFubyB0aGFuIHRoYXQgb2YgdGhlIGN1cnJlbnQgZmVuY2Ugb2JqZWN0LgorICoKKyAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGdvYWwgc2Vxbm8gd2FzIHVwZGF0ZWQuIEZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGJvb2wgdm13X2ZlbmNlX2dvYWxfY2hlY2tfbG9ja2VkKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSkKIHsKLQlzdHJ1Y3QgdGltZXNwZWMgbGFnLCBjb25kOworCXUzMiBnb2FsX3NlcW5vOworCV9fbGUzMiBfX2lvbWVtICpmaWZvX21lbTsKIAotCWNvbmQgPSBuc190b190aW1lc3BlYygoczY0KSB1cyAqIDEwMDApOwotCWxhZyA9IHZtd19maWZvX2xhZyhxdWV1ZSk7Ci0JcmV0dXJuICh0aW1lc3BlY19jb21wYXJlKCZsYWcsICZjb25kKSA8IDEpOworCWlmIChmZW5jZS0+c2lnbmFsZWQgJiBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQykKKwkJcmV0dXJuIGZhbHNlOworCisJZmlmb19tZW0gPSBmZW5jZS0+Zm1hbi0+ZGV2X3ByaXYtPm1taW9fdmlydDsKKwlnb2FsX3NlcW5vID0gaW9yZWFkMzIoZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0VfR09BTCk7CisJaWYgKGxpa2VseShmZW5jZS0+Zm1hbi0+c2Vxbm9fdmFsaWQgJiYKKwkJICAgZ29hbF9zZXFubyAtIGZlbmNlLT5zZXFubyA8IFZNV19GRU5DRV9XUkFQKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaW93cml0ZTMyKGZlbmNlLT5zZXFubywgZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0VfR09BTCk7CisJZmVuY2UtPmZtYW4tPnNlcW5vX3ZhbGlkID0gdHJ1ZTsKKworCXJldHVybiB0cnVlOwogfQogCi1pbnQgdm13X3dhaXRfbGFnKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCSBzdHJ1Y3Qgdm13X2ZlbmNlX3F1ZXVlICpxdWV1ZSwgdWludDMyX3QgdXMpCit2b2lkIHZtd19mZW5jZXNfdXBkYXRlKHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbikKIHsKLQlzdHJ1Y3Qgdm13X2ZlbmNlICpmZW5jZTsKLQl1aW50MzJfdCBzZXF1ZW5jZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSwgKm5leHRfZmVuY2U7CisJc3RydWN0IGxpc3RfaGVhZCBhY3Rpb25fbGlzdDsKKwlib29sIG5lZWRzX3JlcnVuOworCXVpbnQzMl90IHNlcW5vLCBuZXdfc2Vxbm87CisJX19sZTMyIF9faW9tZW0gKmZpZm9fbWVtID0gZm1hbi0+ZGV2X3ByaXYtPm1taW9fdmlydDsKKworCXNlcW5vID0gaW9yZWFkMzIoZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0UpOworcmVydW46CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZtYW4tPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmVuY2UsIG5leHRfZmVuY2UsICZmbWFuLT5mZW5jZV9saXN0LCBoZWFkKSB7CisJCWlmIChzZXFubyAtIGZlbmNlLT5zZXFubyA8IFZNV19GRU5DRV9XUkFQKSB7CisJCQlsaXN0X2RlbF9pbml0KCZmZW5jZS0+aGVhZCk7CisJCQlmZW5jZS0+c2lnbmFsZWQgfD0gRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUM7CisJCQlJTklUX0xJU1RfSEVBRCgmYWN0aW9uX2xpc3QpOworCQkJbGlzdF9zcGxpY2VfaW5pdCgmZmVuY2UtPnNlcV9wYXNzZWRfYWN0aW9ucywKKwkJCQkJICZhY3Rpb25fbGlzdCk7CisJCQl2bXdfZmVuY2VzX3BlcmZvcm1fYWN0aW9ucyhmbWFuLCAmYWN0aW9uX2xpc3QpOworCQkJd2FrZV91cF9hbGwoJmZlbmNlLT5xdWV1ZSk7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJbmVlZHNfcmVydW4gPSB2bXdfZmVuY2VfZ29hbF9uZXdfbG9ja2VkKGZtYW4sIHNlcW5vKTsKKworCWlmICghbGlzdF9lbXB0eSgmZm1hbi0+Y2xlYW51cF9saXN0KSkKKwkJKHZvaWQpIHNjaGVkdWxlX3dvcmsoJmZtYW4tPndvcmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZtYW4tPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogUmVydW4gaWYgdGhlIGZlbmNlIGdvYWwgc2Vxbm8gd2FzIHVwZGF0ZWQsIGFuZCB0aGUKKwkgKiBoYXJkd2FyZSBtaWdodCBoYXZlIHJhY2VkIHdpdGggdGhhdCB1cGRhdGUsIHNvIHRoYXQKKwkgKiB3ZSBtaXNzZWQgYSBmZW5jZV9nb2FsIGlycS4KKwkgKi8KKworCWlmICh1bmxpa2VseShuZWVkc19yZXJ1bikpIHsKKwkJbmV3X3NlcW5vID0gaW9yZWFkMzIoZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0UpOworCQlpZiAobmV3X3NlcW5vICE9IHNlcW5vKSB7CisJCQlzZXFubyA9IG5ld19zZXFubzsKKwkJCWdvdG8gcmVydW47CisJCX0KKwl9Cit9CisKK2Jvb2wgdm13X2ZlbmNlX29ial9zaWduYWxlZChzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UsCisJCQkgICAgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuID0gZmVuY2UtPmZtYW47CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdWludDMyX3Qgc2lnbmFsZWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZm1hbi0+bG9jaywgaXJxX2ZsYWdzKTsKKwlzaWduYWxlZCA9IGZlbmNlLT5zaWduYWxlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJZmxhZ3MgJj0gZmVuY2UtPnNpZ25hbF9tYXNrOworCWlmICgoc2lnbmFsZWQgJiBmbGFncykgPT0gZmxhZ3MpCisJCXJldHVybiAxOworCisJaWYgKChzaWduYWxlZCAmIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDKSA9PSAwKQorCQl2bXdfZmVuY2VzX3VwZGF0ZShmbWFuKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCXNpZ25hbGVkID0gZmVuY2UtPnNpZ25hbGVkOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7CisKKwlyZXR1cm4gKChzaWduYWxlZCAmIGZsYWdzKSA9PSBmbGFncyk7Cit9CisKK2ludCB2bXdfZmVuY2Vfb2JqX3dhaXQoc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlLAorCQkgICAgICAgdWludDMyX3QgZmxhZ3MsIGJvb2wgbGF6eSwKKwkJICAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSBmZW5jZS0+Zm1hbi0+ZGV2X3ByaXY7CisJbG9uZyByZXQ7CisKKwlpZiAobGlrZWx5KHZtd19mZW5jZV9vYmpfc2lnbmFsZWQoZmVuY2UsIGZsYWdzKSkpCisJCXJldHVybiAwOworCisJdm13X2ZpZm9fcGluZ19ob3N0KGRldl9wcml2LCBTVkdBX1NZTkNfR0VORVJJQyk7CisJdm13X3NlcW5vX3dhaXRlcl9hZGQoZGV2X3ByaXYpOworCisJaWYgKGludGVycnVwdGlibGUpCisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0CisJCQkoZmVuY2UtPnF1ZXVlLAorCQkJIHZtd19mZW5jZV9vYmpfc2lnbmFsZWQoZmVuY2UsIGZsYWdzKSwKKwkJCSB0aW1lb3V0KTsKKwllbHNlCisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dAorCQkJKGZlbmNlLT5xdWV1ZSwKKwkJCSB2bXdfZmVuY2Vfb2JqX3NpZ25hbGVkKGZlbmNlLCBmbGFncyksCisJCQkgdGltZW91dCk7CisKKwl2bXdfc2Vxbm9fd2FpdGVyX3JlbW92ZShkZXZfcHJpdik7CisKKwlpZiAodW5saWtlbHkocmV0ID09IDApKQorCQlyZXQgPSAtRUJVU1k7CisJZWxzZSBpZiAobGlrZWx5KHJldCA+IDApKQorCQlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCB2bXdfZmVuY2Vfb2JqX2ZsdXNoKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gZmVuY2UtPmZtYW4tPmRldl9wcml2OworCisJdm13X2ZpZm9fcGluZ19ob3N0KGRldl9wcml2LCBTVkdBX1NZTkNfR0VORVJJQyk7Cit9CisKK3N0YXRpYyB2b2lkIHZtd19mZW5jZV9kZXN0cm95KHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4gPSBmZW5jZS0+Zm1hbjsKKworCWtmcmVlKGZlbmNlKTsKKwkvKgorCSAqIEZyZWUga2VybmVsIHNwYWNlIGFjY291bnRpbmcuCisJICovCisJdHRtX21lbV9nbG9iYWxfZnJlZSh2bXdfbWVtX2dsb2IoZm1hbi0+ZGV2X3ByaXYpLAorCQkJICAgIGZtYW4tPmZlbmNlX3NpemUpOworfQorCitpbnQgdm13X2ZlbmNlX2NyZWF0ZShzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4sCisJCSAgICAgdWludDMyX3Qgc2Vxbm8sCisJCSAgICAgdWludDMyX3QgbWFzaywKKwkJICAgICBzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKnBfZmVuY2UpCit7CisJc3RydWN0IHR0bV9tZW1fZ2xvYmFsICptZW1fZ2xvYiA9IHZtd19tZW1fZ2xvYihmbWFuLT5kZXZfcHJpdik7CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOwogCWludCByZXQ7CiAKLQl3aGlsZSAoIXZtd19sYWdfbHQocXVldWUsIHVzKSkgewotCQlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKLQkJaWYgKGxpc3RfZW1wdHkoJnF1ZXVlLT5oZWFkKSkKLQkJCXNlcXVlbmNlID0gYXRvbWljX3JlYWQoJmRldl9wcml2LT5mZW5jZV9zZXEpOwotCQllbHNlIHsKLQkJCWZlbmNlID0gbGlzdF9maXJzdF9lbnRyeSgmcXVldWUtPmhlYWQsCi0JCQkJCQkgc3RydWN0IHZtd19mZW5jZSwgaGVhZCk7Ci0JCQlzZXF1ZW5jZSA9IGZlbmNlLT5zZXF1ZW5jZTsKLQkJfQotCQlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOworCXJldCA9IHR0bV9tZW1fZ2xvYmFsX2FsbG9jKG1lbV9nbG9iLCBmbWFuLT5mZW5jZV9zaXplLAorCQkJCSAgIGZhbHNlLCBmYWxzZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKIAotCQlyZXQgPSB2bXdfd2FpdF9mZW5jZShkZXZfcHJpdiwgZmFsc2UsIHNlcXVlbmNlLCB0cnVlLAotCQkJCSAgICAgMypIWik7Ci0KLQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJCXJldHVybiByZXQ7Ci0KLQkJKHZvaWQpIHZtd19mZW5jZV9wdWxsKHF1ZXVlLCBzZXF1ZW5jZSk7CisJZmVuY2UgPSBremFsbG9jKHNpemVvZigqZmVuY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoZmVuY2UgPT0gTlVMTCkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fb2JqZWN0OwogCX0KKworCXJldCA9IHZtd19mZW5jZV9vYmpfaW5pdChmbWFuLCBmZW5jZSwgc2Vxbm8sIG1hc2ssCisJCQkJIHZtd19mZW5jZV9kZXN0cm95KTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dF9lcnJfaW5pdDsKKworCSpwX2ZlbmNlID0gZmVuY2U7CisJcmV0dXJuIDA7CisKK291dF9lcnJfaW5pdDoKKwlrZnJlZShmZW5jZSk7CitvdXRfbm9fb2JqZWN0OgorCXR0bV9tZW1fZ2xvYmFsX2ZyZWUobWVtX2dsb2IsIGZtYW4tPmZlbmNlX3NpemUpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgdm13X3VzZXJfZmVuY2VfZGVzdHJveShzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UpCit7CisJc3RydWN0IHZtd191c2VyX2ZlbmNlICp1ZmVuY2UgPQorCQljb250YWluZXJfb2YoZmVuY2UsIHN0cnVjdCB2bXdfdXNlcl9mZW5jZSwgZmVuY2UpOworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiA9IGZlbmNlLT5mbWFuOworCisJa2ZyZWUodWZlbmNlKTsKKwkvKgorCSAqIEZyZWUga2VybmVsIHNwYWNlIGFjY291bnRpbmcuCisJICovCisJdHRtX21lbV9nbG9iYWxfZnJlZSh2bXdfbWVtX2dsb2IoZm1hbi0+ZGV2X3ByaXYpLAorCQkJICAgIGZtYW4tPnVzZXJfZmVuY2Vfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHZtd191c2VyX2ZlbmNlX2Jhc2VfcmVsZWFzZShzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICoqcF9iYXNlKQoreworCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKmJhc2UgPSAqcF9iYXNlOworCXN0cnVjdCB2bXdfdXNlcl9mZW5jZSAqdWZlbmNlID0KKwkJY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCB2bXdfdXNlcl9mZW5jZSwgYmFzZSk7CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlID0gJnVmZW5jZS0+ZmVuY2U7CisKKwkqcF9iYXNlID0gTlVMTDsKKwl2bXdfZmVuY2Vfb2JqX3VucmVmZXJlbmNlKCZmZW5jZSk7Cit9CisKK2ludCB2bXdfdXNlcl9mZW5jZV9jcmVhdGUoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkgIHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiwKKwkJCSAgdWludDMyX3Qgc2Vxbm8sCisJCQkgIHVpbnQzMl90IG1hc2ssCisJCQkgIHN0cnVjdCB2bXdfZmVuY2Vfb2JqICoqcF9mZW5jZSwKKwkJCSAgdWludDMyX3QgKnBfaGFuZGxlKQoreworCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlID0gdm13X2Zwcml2KGZpbGVfcHJpdiktPnRmaWxlOworCXN0cnVjdCB2bXdfdXNlcl9mZW5jZSAqdWZlbmNlOworCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICp0bXA7CisJc3RydWN0IHR0bV9tZW1fZ2xvYmFsICptZW1fZ2xvYiA9IHZtd19tZW1fZ2xvYihmbWFuLT5kZXZfcHJpdik7CisJaW50IHJldDsKKworCS8qCisJICogS2VybmVsIG1lbW9yeSBzcGFjZSBhY2NvdW50aW5nLCBzaW5jZSB0aGlzIG9iamVjdCBtYXkKKwkgKiBiZSBjcmVhdGVkIGJ5IGEgdXNlci1zcGFjZSByZXF1ZXN0LgorCSAqLworCisJcmV0ID0gdHRtX21lbV9nbG9iYWxfYWxsb2MobWVtX2dsb2IsIGZtYW4tPnVzZXJfZmVuY2Vfc2l6ZSwKKwkJCQkgICBmYWxzZSwgZmFsc2UpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwl1ZmVuY2UgPSBremFsbG9jKHNpemVvZigqdWZlbmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KHVmZW5jZSA9PSBOVUxMKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub19vYmplY3Q7CisJfQorCisJcmV0ID0gdm13X2ZlbmNlX29ial9pbml0KGZtYW4sICZ1ZmVuY2UtPmZlbmNlLCBzZXFubywKKwkJCQkgbWFzaywgdm13X3VzZXJfZmVuY2VfZGVzdHJveSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlrZnJlZSh1ZmVuY2UpOworCQlnb3RvIG91dF9ub19vYmplY3Q7CisJfQorCisJLyoKKwkgKiBUaGUgYmFzZSBvYmplY3QgaG9sZHMgYSByZWZlcmVuY2Ugd2hpY2ggaXMgZnJlZWQgaW4KKwkgKiB2bXdfdXNlcl9mZW5jZV9iYXNlX3JlbGVhc2UuCisJICovCisJdG1wID0gdm13X2ZlbmNlX29ial9yZWZlcmVuY2UoJnVmZW5jZS0+ZmVuY2UpOworCXJldCA9IHR0bV9iYXNlX29iamVjdF9pbml0KHRmaWxlLCAmdWZlbmNlLT5iYXNlLCBmYWxzZSwKKwkJCQkgICBWTVdfUkVTX0ZFTkNFLAorCQkJCSAgICZ2bXdfdXNlcl9mZW5jZV9iYXNlX3JlbGVhc2UsIE5VTEwpOworCisKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCS8qCisJCSAqIEZyZWUgdGhlIGJhc2Ugb2JqZWN0J3MgcmVmZXJlbmNlCisJCSAqLworCQl2bXdfZmVuY2Vfb2JqX3VucmVmZXJlbmNlKCZ0bXApOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJKnBfZmVuY2UgPSAmdWZlbmNlLT5mZW5jZTsKKwkqcF9oYW5kbGUgPSB1ZmVuY2UtPmJhc2UuaGFzaC5rZXk7CisKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJdG1wID0gJnVmZW5jZS0+ZmVuY2U7CisJdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZSgmdG1wKTsKK291dF9ub19vYmplY3Q6CisJdHRtX21lbV9nbG9iYWxfZnJlZShtZW1fZ2xvYiwgZm1hbi0+dXNlcl9mZW5jZV9zaXplKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogdm13X2ZlbmNlX2ZpZm9fZG93biAtIHNpZ25hbCBhbGwgdW5zaWduYWxlZCBmZW5jZSBvYmplY3RzLgorICovCisKK3ZvaWQgdm13X2ZlbmNlX2ZpZm9fZG93bihzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4pCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCBhY3Rpb25fbGlzdDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUaGUgbGlzdCBtYXkgYmUgYWx0ZXJlZCB3aGlsZSB3ZSB0cmF2ZXJzZSBpdCwgc28gYWx3YXlzCisJICogcmVzdGFydCB3aGVuIHdlJ3ZlIHJlbGVhc2VkIHRoZSBmbWFuLT5sb2NrLgorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7CisJZm1hbi0+Zmlmb19kb3duID0gdHJ1ZTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmZtYW4tPmZlbmNlX2xpc3QpKSB7CisJCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSA9CisJCQlsaXN0X2VudHJ5KGZtYW4tPmZlbmNlX2xpc3QucHJldiwgc3RydWN0IHZtd19mZW5jZV9vYmosCisJCQkJICAgaGVhZCk7CisJCWtyZWZfZ2V0KCZmZW5jZS0+a3JlZik7CisJCXNwaW5fdW5sb2NrX2lycSgmZm1hbi0+bG9jayk7CisKKwkJcmV0ID0gdm13X2ZlbmNlX29ial93YWl0KGZlbmNlLCBmZW5jZS0+c2lnbmFsX21hc2ssCisJCQkJCSBmYWxzZSwgZmFsc2UsCisJCQkJCSBWTVdfRkVOQ0VfV0FJVF9USU1FT1VUKTsKKworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCQlsaXN0X2RlbF9pbml0KCZmZW5jZS0+aGVhZCk7CisJCQlmZW5jZS0+c2lnbmFsZWQgfD0gRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUM7CisJCQlJTklUX0xJU1RfSEVBRCgmYWN0aW9uX2xpc3QpOworCQkJbGlzdF9zcGxpY2VfaW5pdCgmZmVuY2UtPnNlcV9wYXNzZWRfYWN0aW9ucywKKwkJCQkJICZhY3Rpb25fbGlzdCk7CisJCQl2bXdfZmVuY2VzX3BlcmZvcm1fYWN0aW9ucyhmbWFuLCAmYWN0aW9uX2xpc3QpOworCQkJd2FrZV91cF9hbGwoJmZlbmNlLT5xdWV1ZSk7CisJCX0KKworCQlzcGluX2xvY2tfaXJxKCZmbWFuLT5sb2NrKTsKKworCQlCVUdfT04oIWxpc3RfZW1wdHkoJmZlbmNlLT5oZWFkKSk7CisJCWtyZWZfcHV0KCZmZW5jZS0+a3JlZiwgdm13X2ZlbmNlX29ial9kZXN0cm95X2xvY2tlZCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7Cit9CisKK3ZvaWQgdm13X2ZlbmNlX2ZpZm9fdXAoc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuKQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7CisJZm1hbi0+Zmlmb19kb3duID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm1hbi0+bG9jaywgaXJxX2ZsYWdzKTsKK30KKworCitpbnQgdm13X2ZlbmNlX29ial93YWl0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnICphcmcgPQorCSAgICAoc3RydWN0IGRybV92bXdfZmVuY2Vfd2FpdF9hcmcgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICpiYXNlOworCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZTsKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9IHZtd19mcHJpdihmaWxlX3ByaXYpLT50ZmlsZTsKKwlpbnQgcmV0OworCXVpbnQ2NF90IHdhaXRfdGltZW91dCA9ICgodWludDY0X3QpYXJnLT50aW1lb3V0X3VzICogSFopOworCisJLyoKKwkgKiA2NC1iaXQgZGl2aXNpb24gbm90IHByZXNlbnQgb24gMzItYml0IHN5c3RlbXMsIHNvIGRvIGFuCisJICogYXBwcm94aW1hdGlvbi4gKERpdmlkZSBieSAxMDAwMDAwKS4KKwkgKi8KKworCXdhaXRfdGltZW91dCA9ICh3YWl0X3RpbWVvdXQgPj4gMjApICsgKHdhaXRfdGltZW91dCA+PiAyNCkgLQorCSAgKHdhaXRfdGltZW91dCA+PiAyNik7CisKKwlpZiAoIWFyZy0+Y29va2llX3ZhbGlkKSB7CisJCWFyZy0+Y29va2llX3ZhbGlkID0gMTsKKwkJYXJnLT5rZXJuZWxfY29va2llID0gamlmZmllcyArIHdhaXRfdGltZW91dDsKKwl9CisKKwliYXNlID0gdHRtX2Jhc2Vfb2JqZWN0X2xvb2t1cCh0ZmlsZSwgYXJnLT5oYW5kbGUpOworCWlmICh1bmxpa2VseShiYXNlID09IE5VTEwpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV2FpdCBpbnZhbGlkIGZlbmNlIG9iamVjdCBoYW5kbGUgIgorCQkgICAgICAgIjB4JTA4bHguXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYXJnLT5oYW5kbGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmZW5jZSA9ICYoY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCB2bXdfdXNlcl9mZW5jZSwgYmFzZSktPmZlbmNlKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzOworCWlmICh0aW1lX2FmdGVyX2VxKHRpbWVvdXQsICh1bnNpZ25lZCBsb25nKWFyZy0+a2VybmVsX2Nvb2tpZSkpIHsKKwkJcmV0ID0gKCh2bXdfZmVuY2Vfb2JqX3NpZ25hbGVkKGZlbmNlLCBhcmctPmZsYWdzKSkgPworCQkgICAgICAgMCA6IC1FQlVTWSk7CisJCWdvdG8gb3V0OworCX0KKworCXRpbWVvdXQgPSAodW5zaWduZWQgbG9uZylhcmctPmtlcm5lbF9jb29raWUgLSB0aW1lb3V0OworCisJcmV0ID0gdm13X2ZlbmNlX29ial93YWl0KGZlbmNlLCBhcmctPmZsYWdzLCBhcmctPmxhenksIHRydWUsIHRpbWVvdXQpOworCitvdXQ6CisJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZiYXNlKTsKKworCS8qCisJICogT3B0aW9uYWxseSB1bnJlZiB0aGUgZmVuY2Ugb2JqZWN0LgorCSAqLworCisJaWYgKHJldCA9PSAwICYmIChhcmctPndhaXRfb3B0aW9ucyAmIERSTV9WTVdfV0FJVF9PUFRJT05fVU5SRUYpKQorCQlyZXR1cm4gdHRtX3JlZl9vYmplY3RfYmFzZV91bnJlZih0ZmlsZSwgYXJnLT5oYW5kbGUsCisJCQkJCQkgVFRNX1JFRl9VU0FHRSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHZtd19mZW5jZV9vYmpfc2lnbmFsZWRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV92bXdfZmVuY2Vfc2lnbmFsZWRfYXJnICphcmcgPQorCQkoc3RydWN0IGRybV92bXdfZmVuY2Vfc2lnbmFsZWRfYXJnICopIGRhdGE7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2U7CisJc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuOworCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlID0gdm13X2Zwcml2KGZpbGVfcHJpdiktPnRmaWxlOworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOworCisJYmFzZSA9IHR0bV9iYXNlX29iamVjdF9sb29rdXAodGZpbGUsIGFyZy0+aGFuZGxlKTsKKwlpZiAodW5saWtlbHkoYmFzZSA9PSBOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZlbmNlIHNpZ25hbGVkIGludmFsaWQgZmVuY2Ugb2JqZWN0IGhhbmRsZSAiCisJCSAgICAgICAiMHglMDhseC5cbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylhcmctPmhhbmRsZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZlbmNlID0gJihjb250YWluZXJfb2YoYmFzZSwgc3RydWN0IHZtd191c2VyX2ZlbmNlLCBiYXNlKS0+ZmVuY2UpOworCWZtYW4gPSBmZW5jZS0+Zm1hbjsKKworCWFyZy0+c2lnbmFsZWQgPSB2bXdfZmVuY2Vfb2JqX3NpZ25hbGVkKGZlbmNlLCBhcmctPmZsYWdzKTsKKwlzcGluX2xvY2tfaXJxKCZmbWFuLT5sb2NrKTsKKworCWFyZy0+c2lnbmFsZWRfZmxhZ3MgPSBmZW5jZS0+c2lnbmFsZWQ7CisJYXJnLT5wYXNzZWRfc2Vxbm8gPSBkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcW5vOworCXNwaW5fdW5sb2NrX2lycSgmZm1hbi0+bG9jayk7CisKKwl0dG1fYmFzZV9vYmplY3RfdW5yZWYoJmJhc2UpOworCiAJcmV0dXJuIDA7CiB9CiAKIAoraW50IHZtd19mZW5jZV9vYmpfdW5yZWZfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fdm13X2ZlbmNlX2FyZyAqYXJnID0KKwkJKHN0cnVjdCBkcm1fdm13X2ZlbmNlX2FyZyAqKSBkYXRhOworCisJcmV0dXJuIHR0bV9yZWZfb2JqZWN0X2Jhc2VfdW5yZWYodm13X2Zwcml2KGZpbGVfcHJpdiktPnRmaWxlLAorCQkJCQkgYXJnLT5oYW5kbGUsCisJCQkJCSBUVE1fUkVGX1VTQUdFKTsKK30KKworLyoqCisgKiB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX2Rlc3Ryb3kKKyAqCisgKiBAa3JlZjogVGhlIHN0cnVjdCBrcmVmIGVtYmVkZGVkIGluIGEgc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24uCisgKgorICogVGhlIHZtd19ldmVudF9mZW5jZV9hY3Rpb24gZGVzdHJ1Y3RvciB0aGF0IG1heSBiZSBjYWxsZWQgZWl0aGVyIGFmdGVyCisgKiB0aGUgZmVuY2UgYWN0aW9uIGNsZWFudXAsIG9yIHdoZW4gdGhlIGV2ZW50IGlzIGRlbGl2ZXJlZC4KKyAqIEl0IGZyZWVzIGJvdGggdGhlIHZtd19ldmVudF9mZW5jZV9hY3Rpb24gc3RydWN0IGFuZCB0aGUgYWN0dWFsCisgKiBldmVudCBzdHJ1Y3R1cmUgY29waWVkIHRvIHVzZXItc3BhY2UuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19ldmVudF9mZW5jZV9hY3Rpb25fZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3Qgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbiAqZWFjdGlvbiA9CisJCWNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbiwga3JlZik7CisJc3RydWN0IHR0bV9tZW1fZ2xvYmFsICptZW1fZ2xvYiA9CisJCXZtd19tZW1fZ2xvYih2bXdfcHJpdihlYWN0aW9uLT5kZXYpKTsKKwl1aW50MzJfdCBzaXplID0gZWFjdGlvbi0+c2l6ZTsKKworCWtmcmVlKGVhY3Rpb24tPmUuZXZlbnQpOworCWtmcmVlKGVhY3Rpb24pOworCXR0bV9tZW1fZ2xvYmFsX2ZyZWUobWVtX2dsb2IsIHNpemUpOworfQorCisKKy8qKgorICogdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9kZWxpdmVyZWQKKyAqCisgKiBAZTogVGhlIHN0cnVjdCBkcm1fcGVuZGluZ19ldmVudCBlbWJlZGRlZCBpbiBhIHN0cnVjdAorICogdm13X2V2ZW50X2ZlbmNlX2FjdGlvbi4KKyAqCisgKiBUaGUgc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50IGRlc3RydWN0b3IgdGhhdCBpcyBjYWxsZWQgYnkgZHJtCisgKiBvbmNlIHRoZSBldmVudCBpcyBkZWxpdmVyZWQuIFNpbmNlIHdlIGRvbid0IGtub3cgd2hldGhlciB0aGlzIGZ1bmN0aW9uCisgKiB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGZlbmNlIGFjdGlvbiBkZXN0cnVjdG9yLCB3ZQorICogZnJlZSBhIHJlZmNvdW50IGFuZCBkZXN0cm95IGlmIGl0IGJlY29tZXMgemVyby4KKyAqLworc3RhdGljIHZvaWQgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9kZWxpdmVyZWQoc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50ICplKQoreworCXN0cnVjdCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uICplYWN0aW9uID0KKwkJY29udGFpbmVyX29mKGUsIHN0cnVjdCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uLCBlKTsKKworCWtyZWZfcHV0KCZlYWN0aW9uLT5rcmVmLCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX2Rlc3Ryb3kpOworfQorCisKKy8qKgorICogdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9zZXFfcGFzc2VkCisgKgorICogQGFjdGlvbjogVGhlIHN0cnVjdCB2bXdfZmVuY2VfYWN0aW9uIGVtYmVkZGVkIGluIGEgc3RydWN0CisgKiB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHNlcW5vIG9mIHRoZSBmZW5jZSB3aGVyZSBAYWN0aW9uIGlzCisgKiBhdHRhY2hlZCBoYXMgcGFzc2VkLiBJdCBxdWV1ZXMgdGhlIGV2ZW50IG9uIHRoZSBzdWJtaXR0ZXIncyBldmVudCBsaXN0LgorICogVGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgY2FsbGVkIGZyb20gYXRvbWljIGNvbnRleHQsIGFuZCBtYXkgYmUgY2FsbGVkCisgKiBmcm9tIGlycSBjb250ZXh0LiBJdCB1cHMgYSByZWZjb3VudCByZWZsZWN0aW5nIHRoYXQgd2Ugbm93IGhhdmUgdHdvCisgKiBkZXN0cnVjdG9ycy4KKyAqLworc3RhdGljIHZvaWQgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9zZXFfcGFzc2VkKHN0cnVjdCB2bXdfZmVuY2VfYWN0aW9uICphY3Rpb24pCit7CisJc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24gKmVhY3Rpb24gPQorCQljb250YWluZXJfb2YoYWN0aW9uLCBzdHJ1Y3Qgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbiwgYWN0aW9uKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZWFjdGlvbi0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2ID0gZWFjdGlvbi0+ZS5maWxlX3ByaXY7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwlrcmVmX2dldCgmZWFjdGlvbi0+a3JlZik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgaXJxX2ZsYWdzKTsKKworCWlmIChsaWtlbHkoZWFjdGlvbi0+dHZfc2VjICE9IE5VTEwpKSB7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQkqZWFjdGlvbi0+dHZfc2VjID0gdHYudHZfc2VjOworCQkqZWFjdGlvbi0+dHZfdXNlYyA9IHR2LnR2X3VzZWM7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmZWFjdGlvbi0+ZS5saW5rLCAmZmlsZV9wcml2LT5ldmVudF9saXN0KTsKKwl3YWtlX3VwX2FsbCgmZmlsZV9wcml2LT5ldmVudF93YWl0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGlycV9mbGFncyk7Cit9CisKKy8qKgorICogdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9jbGVhbnVwCisgKgorICogQGFjdGlvbjogVGhlIHN0cnVjdCB2bXdfZmVuY2VfYWN0aW9uIGVtYmVkZGVkIGluIGEgc3RydWN0CisgKiB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHN0cnVjdCB2bXdfZmVuY2VfYWN0aW9uIGRlc3RydWN0b3IuIEl0J3MgdHlwaWNhbGx5CisgKiBjYWxsZWQgZnJvbSBhIHdvcmtxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9jbGVhbnVwKHN0cnVjdCB2bXdfZmVuY2VfYWN0aW9uICphY3Rpb24pCit7CisJc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24gKmVhY3Rpb24gPQorCQljb250YWluZXJfb2YoYWN0aW9uLCBzdHJ1Y3Qgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbiwgYWN0aW9uKTsKKworCXZtd19mZW5jZV9vYmpfdW5yZWZlcmVuY2UoJmVhY3Rpb24tPmZlbmNlKTsKKwlrcmVmX3B1dCgmZWFjdGlvbi0+a3JlZiwgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9kZXN0cm95KTsKK30KKworCisvKioKKyAqIHZtd19mZW5jZV9vYmpfYWRkX2FjdGlvbiAtIEFkZCBhbiBhY3Rpb24gdG8gYSBmZW5jZSBvYmplY3QuCisgKgorICogQGZlbmNlIC0gVGhlIGZlbmNlIG9iamVjdC4KKyAqIEBhY3Rpb24gLSBUaGUgYWN0aW9uIHRvIGFkZC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGFjdGlvbiBjYWxsYmFja3MgbWF5IGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zLgorICovCit2b2lkIHZtd19mZW5jZV9vYmpfYWRkX2FjdGlvbihzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UsCisJCQkgICAgICBzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiAqYWN0aW9uKQoreworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiA9IGZlbmNlLT5mbWFuOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCWJvb2wgcnVuX3VwZGF0ZSA9IGZhbHNlOworCisJbXV0ZXhfbG9jaygmZm1hbi0+Z29hbF9pcnFfbXV0ZXgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJZm1hbi0+cGVuZGluZ19hY3Rpb25zW2FjdGlvbi0+dHlwZV0rKzsKKwlpZiAoZmVuY2UtPnNpZ25hbGVkICYgRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUMpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCBhY3Rpb25fbGlzdDsKKworCQlJTklUX0xJU1RfSEVBRCgmYWN0aW9uX2xpc3QpOworCQlsaXN0X2FkZF90YWlsKCZhY3Rpb24tPmhlYWQsICZhY3Rpb25fbGlzdCk7CisJCXZtd19mZW5jZXNfcGVyZm9ybV9hY3Rpb25zKGZtYW4sICZhY3Rpb25fbGlzdCk7CisJfSBlbHNlIHsKKwkJbGlzdF9hZGRfdGFpbCgmYWN0aW9uLT5oZWFkLCAmZmVuY2UtPnNlcV9wYXNzZWRfYWN0aW9ucyk7CisKKwkJLyoKKwkJICogVGhpcyBmdW5jdGlvbiBtYXkgc2V0IGZtYW46OnNlcW5vX3ZhbGlkLCBzbyBpdCBtdXN0CisJCSAqIGJlIHJ1biB3aXRoIHRoZSBnb2FsX2lycV9tdXRleCBoZWxkLgorCQkgKi8KKwkJcnVuX3VwZGF0ZSA9IHZtd19mZW5jZV9nb2FsX2NoZWNrX2xvY2tlZChmZW5jZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm1hbi0+bG9jaywgaXJxX2ZsYWdzKTsKKworCWlmIChydW5fdXBkYXRlKSB7CisJCWlmICghZm1hbi0+Z29hbF9pcnFfb24pIHsKKwkJCWZtYW4tPmdvYWxfaXJxX29uID0gdHJ1ZTsKKwkJCXZtd19nb2FsX3dhaXRlcl9hZGQoZm1hbi0+ZGV2X3ByaXYpOworCQl9CisJCXZtd19mZW5jZXNfdXBkYXRlKGZtYW4pOworCX0KKwltdXRleF91bmxvY2soJmZtYW4tPmdvYWxfaXJxX211dGV4KTsKKworfQorCisvKioKKyAqIHZtd19ldmVudF9mZW5jZV9hY3Rpb25fY3JlYXRlIC0gUG9zdCBhbiBldmVudCBmb3Igc2VuZGluZyB3aGVuIGEgZmVuY2UKKyAqIG9iamVjdCBzZXFubyBoYXMgcGFzc2VkLgorICoKKyAqIEBmaWxlX3ByaXY6IFRoZSBmaWxlIGNvbm5lY3Rpb24gb24gd2hpY2ggdGhlIGV2ZW50IHNob3VsZCBiZSBwb3N0ZWQuCisgKiBAZmVuY2U6IFRoZSBmZW5jZSBvYmplY3Qgb24gd2hpY2ggdG8gcG9zdCB0aGUgZXZlbnQuCisgKiBAZXZlbnQ6IEV2ZW50IHRvIGJlIHBvc3RlZC4gVGhpcyBldmVudCBzaG91bGQndmUgYmVlbiBhbGxvY2VkCisgKiB1c2luZyBrW216XWFsbG9jLCBhbmQgc2hvdWxkJ3ZlIGJlZW4gY29tcGxldGVseSBpbml0aWFsaXplZC4KKyAqIEBpbnRlcnJ1cHRpYmxlOiBJbnRlcnJ1cHRpYmxlIHdhaXRzIGlmIHBvc3NpYmxlLgorICoKKyAqIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSBAZXZlbnQgbWF5IGhhdmUgYmVlbgorICogZnJlZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aXRoCisgKiBhbiBlcnJvciBjb2RlLCB0aGUgY2FsbGVyIG5lZWRzIHRvIGZyZWUgdGhhdCBvYmplY3QuCisgKi8KKworaW50IHZtd19ldmVudF9mZW5jZV9hY3Rpb25fY3JlYXRlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJCSAgc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlLAorCQkJCSAgc3RydWN0IGRybV9ldmVudCAqZXZlbnQsCisJCQkJICB1aW50MzJfdCAqdHZfc2VjLAorCQkJCSAgdWludDMyX3QgKnR2X3VzZWMsCisJCQkJICBib29sIGludGVycnVwdGlibGUpCit7CisJc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24gKmVhY3Rpb247CisJc3RydWN0IHR0bV9tZW1fZ2xvYmFsICptZW1fZ2xvYiA9CisJCXZtd19tZW1fZ2xvYihmZW5jZS0+Zm1hbi0+ZGV2X3ByaXYpOworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiA9IGZlbmNlLT5mbWFuOworCXVpbnQzMl90IHNpemUgPSBmbWFuLT5ldmVudF9mZW5jZV9hY3Rpb25fc2l6ZSArCisJCXR0bV9yb3VuZF9wb3QoZXZlbnQtPmxlbmd0aCk7CisJaW50IHJldDsKKworCS8qCisJICogQWNjb3VudCBmb3IgaW50ZXJuYWwgc3RydWN0dXJlIHNpemUgYXMgd2VsbCBhcyB0aGUKKwkgKiBldmVudCBzaXplIGl0c2VsZi4KKwkgKi8KKworCXJldCA9IHR0bV9tZW1fZ2xvYmFsX2FsbG9jKG1lbV9nbG9iLCBzaXplLCBmYWxzZSwgaW50ZXJydXB0aWJsZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCWVhY3Rpb24gPSBremFsbG9jKHNpemVvZigqZWFjdGlvbiksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShlYWN0aW9uID09IE5VTEwpKSB7CisJCXR0bV9tZW1fZ2xvYmFsX2ZyZWUobWVtX2dsb2IsIHNpemUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllYWN0aW9uLT5lLmV2ZW50ID0gZXZlbnQ7CisJZWFjdGlvbi0+ZS5maWxlX3ByaXYgPSBmaWxlX3ByaXY7CisJZWFjdGlvbi0+ZS5kZXN0cm95ID0gdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9kZWxpdmVyZWQ7CisKKwllYWN0aW9uLT5hY3Rpb24uc2VxX3Bhc3NlZCA9IHZtd19ldmVudF9mZW5jZV9hY3Rpb25fc2VxX3Bhc3NlZDsKKwllYWN0aW9uLT5hY3Rpb24uY2xlYW51cCA9IHZtd19ldmVudF9mZW5jZV9hY3Rpb25fY2xlYW51cDsKKwllYWN0aW9uLT5hY3Rpb24udHlwZSA9IFZNV19BQ1RJT05fRVZFTlQ7CisKKwllYWN0aW9uLT5mZW5jZSA9IHZtd19mZW5jZV9vYmpfcmVmZXJlbmNlKGZlbmNlKTsKKwllYWN0aW9uLT5kZXYgPSBmbWFuLT5kZXZfcHJpdi0+ZGV2OworCWVhY3Rpb24tPnNpemUgPSBzaXplOworCWVhY3Rpb24tPnR2X3NlYyA9IHR2X3NlYzsKKwllYWN0aW9uLT50dl91c2VjID0gdHZfdXNlYzsKKworCWtyZWZfaW5pdCgmZWFjdGlvbi0+a3JlZik7CisJdm13X2ZlbmNlX29ial9hZGRfYWN0aW9uKGZlbmNlLCAmZWFjdGlvbi0+YWN0aW9uKTsKKworCXJldHVybiAwOworfQorCitpbnQgdm13X2ZlbmNlX2V2ZW50X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOworCXN0cnVjdCBkcm1fdm13X2ZlbmNlX2V2ZW50X2FyZyAqYXJnID0KKwkJKHN0cnVjdCBkcm1fdm13X2ZlbmNlX2V2ZW50X2FyZyAqKSBkYXRhOworCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSA9IE5VTEw7CisJc3RydWN0IHZtd19mcHJpdiAqdm13X2ZwID0gdm13X2Zwcml2KGZpbGVfcHJpdik7CisJc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIF9fdXNlciAqdXNlcl9mZW5jZV9yZXAgPQorCQkoc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKQorCQlhcmctPmZlbmNlX3JlcDsKKwl1aW50MzJfdCBoYW5kbGU7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IGRybV92bXdfZXZlbnRfZmVuY2UgKmV2ZW50OworCWludCByZXQ7CisKKwkvKgorCSAqIExvb2sgdXAgYW4gZXhpc3RpbmcgZmVuY2Ugb2JqZWN0LAorCSAqIGFuZCBpZiB1c2VyLXNwYWNlIHdhbnRzIGEgbmV3IHJlZmVyZW5jZSwKKwkgKiBhZGQgb25lLgorCSAqLworCWlmIChhcmctPmhhbmRsZSkgeworCQlzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICpiYXNlID0KKwkJCXR0bV9iYXNlX29iamVjdF9sb29rdXAodm13X2ZwLT50ZmlsZSwgYXJnLT5oYW5kbGUpOworCisJCWlmICh1bmxpa2VseShiYXNlID09IE5VTEwpKSB7CisJCQlEUk1fRVJST1IoIkZlbmNlIGV2ZW50IGludmFsaWQgZmVuY2Ugb2JqZWN0IGhhbmRsZSAiCisJCQkJICAiMHglMDhseC5cbiIsCisJCQkJICAodW5zaWduZWQgbG9uZylhcmctPmhhbmRsZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlmZW5jZSA9ICYoY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCB2bXdfdXNlcl9mZW5jZSwKKwkJCQkgICAgICAgYmFzZSktPmZlbmNlKTsKKwkJKHZvaWQpIHZtd19mZW5jZV9vYmpfcmVmZXJlbmNlKGZlbmNlKTsKKworCQlpZiAodXNlcl9mZW5jZV9yZXAgIT0gTlVMTCkgeworCQkJYm9vbCBleGlzdGVkOworCisJCQlyZXQgPSB0dG1fcmVmX29iamVjdF9hZGQodm13X2ZwLT50ZmlsZSwgYmFzZSwKKwkJCQkJCSBUVE1fUkVGX1VTQUdFLCAmZXhpc3RlZCk7CisJCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVmZXJlbmNlIGEgZmVuY2UgIgorCQkJCQkgICJvYmplY3QuXG4iKTsKKwkJCQlnb3RvIG91dF9ub19yZWZfb2JqOworCQkJfQorCQkJaGFuZGxlID0gYmFzZS0+aGFzaC5rZXk7CisJCX0KKwkJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZiYXNlKTsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSBhIG5ldyBmZW5jZSBvYmplY3QuCisJICovCisJaWYgKCFmZW5jZSkgeworCQlyZXQgPSB2bXdfZXhlY2J1Zl9mZW5jZV9jb21tYW5kcyhmaWxlX3ByaXYsIGRldl9wcml2LAorCQkJCQkJICZmZW5jZSwKKwkJCQkJCSAodXNlcl9mZW5jZV9yZXApID8KKwkJCQkJCSAmaGFuZGxlIDogTlVMTCk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJCURSTV9FUlJPUigiRmVuY2UgZXZlbnQgZmFpbGVkIHRvIGNyZWF0ZSBmZW5jZS5cbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCUJVR19PTihmZW5jZSA9PSBOVUxMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGlycV9mbGFncyk7CisKKwlyZXQgPSAoZmlsZV9wcml2LT5ldmVudF9zcGFjZSA8IHNpemVvZigqZXZlbnQpKSA/IC1FQlVTWSA6IDA7CisJaWYgKGxpa2VseShyZXQgPT0gMCkpCisJCWZpbGVfcHJpdi0+ZXZlbnRfc3BhY2UgLT0gc2l6ZW9mKCpldmVudCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGlycV9mbGFncyk7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGV2ZW50IHNwYWNlIGZvciB0aGlzIGZpbGUuXG4iKTsKKwkJZ290byBvdXRfbm9fZXZlbnRfc3BhY2U7CisJfQorCisJZXZlbnQgPSBremFsbG9jKHNpemVvZigqZXZlbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoZXZlbnQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgYW4gZXZlbnQuXG4iKTsKKwkJZ290byBvdXRfbm9fZXZlbnQ7CisJfQorCisJZXZlbnQtPmJhc2UudHlwZSA9IERSTV9WTVdfRVZFTlRfRkVOQ0VfU0lHTkFMRUQ7CisJZXZlbnQtPmJhc2UubGVuZ3RoID0gc2l6ZW9mKCpldmVudCk7CisJZXZlbnQtPnVzZXJfZGF0YSA9IGFyZy0+dXNlcl9kYXRhOworCisJaWYgKGFyZy0+ZmxhZ3MgJiBEUk1fVk1XX0ZFX0ZMQUdfUkVRX1RJTUUpCisJCXJldCA9IHZtd19ldmVudF9mZW5jZV9hY3Rpb25fY3JlYXRlKGZpbGVfcHJpdiwgZmVuY2UsCisJCQkJCQkgICAgJmV2ZW50LT5iYXNlLAorCQkJCQkJICAgICZldmVudC0+dHZfc2VjLAorCQkJCQkJICAgICZldmVudC0+dHZfdXNlYywKKwkJCQkJCSAgICB0cnVlKTsKKwllbHNlCisJCXJldCA9IHZtd19ldmVudF9mZW5jZV9hY3Rpb25fY3JlYXRlKGZpbGVfcHJpdiwgZmVuY2UsCisJCQkJCQkgICAgJmV2ZW50LT5iYXNlLAorCQkJCQkJICAgIE5VTEwsCisJCQkJCQkgICAgTlVMTCwKKwkJCQkJCSAgICB0cnVlKTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhdHRhY2ggZXZlbnQgdG8gZmVuY2UuXG4iKTsKKwkJZ290byBvdXRfbm9fYXR0YWNoOworCX0KKworCXZtd19leGVjYnVmX2NvcHlfZmVuY2VfdXNlcihkZXZfcHJpdiwgdm13X2ZwLCAwLCB1c2VyX2ZlbmNlX3JlcCwgZmVuY2UsCisJCQkJICAgIGhhbmRsZSk7CisJdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZSgmZmVuY2UpOworCXJldHVybiAwOworb3V0X25vX2F0dGFjaDoKKwlrZnJlZShldmVudCk7CitvdXRfbm9fZXZlbnQ6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgaXJxX2ZsYWdzKTsKKwlmaWxlX3ByaXYtPmV2ZW50X3NwYWNlICs9IHNpemVvZigqZXZlbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgaXJxX2ZsYWdzKTsKK291dF9ub19ldmVudF9zcGFjZToKKwlpZiAodXNlcl9mZW5jZV9yZXAgIT0gTlVMTCkKKwkJdHRtX3JlZl9vYmplY3RfYmFzZV91bnJlZih2bXdfZnByaXYoZmlsZV9wcml2KS0+dGZpbGUsCisJCQkJCSAgaGFuZGxlLCBUVE1fUkVGX1VTQUdFKTsKK291dF9ub19yZWZfb2JqOgorCXZtd19mZW5jZV9vYmpfdW5yZWZlcmVuY2UoJmZlbmNlKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmVuY2UuaCBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZlbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1NGEyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZlbmNlLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCDCqSAyMDExIFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9WTVdHRlhfRkVOQ0VfSF8KKworI2RlZmluZSBWTVdfRkVOQ0VfV0FJVF9USU1FT1VUICg1KkhaKQorCitzdHJ1Y3Qgdm13X3ByaXZhdGU7CisKK3N0cnVjdCB2bXdfZmVuY2VfbWFuYWdlcjsKKworLyoqCisgKgorICoKKyAqLworZW51bSB2bXdfYWN0aW9uX3R5cGUgeworCVZNV19BQ1RJT05fRVZFTlQgPSAwLAorCVZNV19BQ1RJT05fTUFYCit9OworCitzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCWVudW0gdm13X2FjdGlvbl90eXBlIHR5cGU7CisJdm9pZCAoKnNlcV9wYXNzZWQpIChzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiAqYWN0aW9uKTsKKwl2b2lkICgqY2xlYW51cCkgKHN0cnVjdCB2bXdfZmVuY2VfYWN0aW9uICphY3Rpb24pOworfTsKKworc3RydWN0IHZtd19mZW5jZV9vYmogeworCXN0cnVjdCBrcmVmIGtyZWY7CisJdTMyIHNlcW5vOworCisJc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuOworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwl1aW50MzJfdCBzaWduYWxlZDsKKwl1aW50MzJfdCBzaWduYWxfbWFzazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNlcV9wYXNzZWRfYWN0aW9uczsKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlKTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKK307CisKK2V4dGVybiBzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKgordm13X2ZlbmNlX21hbmFnZXJfaW5pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKKworZXh0ZXJuIHZvaWQgdm13X2ZlbmNlX21hbmFnZXJfdGFrZWRvd24oc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuKTsKKworZXh0ZXJuIHZvaWQgdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZShzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKmZlbmNlX3ApOworCitleHRlcm4gc3RydWN0IHZtd19mZW5jZV9vYmogKgordm13X2ZlbmNlX29ial9yZWZlcmVuY2Uoc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlKTsKKworZXh0ZXJuIHZvaWQgdm13X2ZlbmNlc191cGRhdGUoc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuKTsKKworZXh0ZXJuIGJvb2wgdm13X2ZlbmNlX29ial9zaWduYWxlZChzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UsCisJCQkJICAgdWludDMyX3QgZmxhZ3MpOworCitleHRlcm4gaW50IHZtd19mZW5jZV9vYmpfd2FpdChzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UsIHVpbnQzMl90IGZsYWdzLAorCQkJICAgICAgYm9vbCBsYXp5LAorCQkJICAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCitleHRlcm4gdm9pZCB2bXdfZmVuY2Vfb2JqX2ZsdXNoKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSk7CisKK2V4dGVybiBpbnQgdm13X2ZlbmNlX2NyZWF0ZShzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4sCisJCQkgICAgdWludDMyX3Qgc2Vxbm8sCisJCQkgICAgdWludDMyX3QgbWFzaywKKwkJCSAgICBzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKnBfZmVuY2UpOworCitleHRlcm4gaW50IHZtd191c2VyX2ZlbmNlX2NyZWF0ZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkgc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuLAorCQkJCSB1aW50MzJfdCBzZXF1ZW5jZSwKKwkJCQkgdWludDMyX3QgbWFzaywKKwkJCQkgc3RydWN0IHZtd19mZW5jZV9vYmogKipwX2ZlbmNlLAorCQkJCSB1aW50MzJfdCAqcF9oYW5kbGUpOworCitleHRlcm4gdm9pZCB2bXdfZmVuY2VfZmlmb191cChzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4pOworCitleHRlcm4gdm9pZCB2bXdfZmVuY2VfZmlmb19kb3duKHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbik7CisKK2V4dGVybiBpbnQgdm13X2ZlbmNlX29ial93YWl0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKKworZXh0ZXJuIGludCB2bXdfZmVuY2Vfb2JqX3NpZ25hbGVkX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKKworZXh0ZXJuIGludCB2bXdfZmVuY2Vfb2JqX3VucmVmX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IHZtd19mZW5jZV9ldmVudF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CisKKyNlbmRpZiAvKiBfVk1XR0ZYX0ZFTkNFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9maWZvLmMKaW5kZXggNjM1YzBmZi4uMDNiYmMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmlmby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZpZm8uYwpAQCAtNDUsNyArNDUsMTEgQEAKIAlpZiAoaHd2ZXJzaW9uID09IDApCiAJCXJldHVybiBmYWxzZTsKIAotCWlmIChod3ZlcnNpb24gPCBTVkdBM0RfSFdWRVJTSU9OX1dTNjVfQjEpCisJaWYgKGh3dmVyc2lvbiA8IFNWR0EzRF9IV1ZFUlNJT05fV1M4X0IxKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBOb24tU2NyZWVuIE9iamVjdCBwYXRoIGRvZXMgbm90IHN1cHBvcnQgc3VyZmFjZXMgKi8KKwlpZiAoIWRldl9wcml2LT5zb3VfcHJpdikKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0dXJuIHRydWU7CkBAIC03MiwyMiArNzYsMTIgQEAKIAl1aW50MzJfdCBtYXg7CiAJdWludDMyX3QgbWluOwogCXVpbnQzMl90IGR1bW15OwotCWludCByZXQ7CiAKIAlmaWZvLT5zdGF0aWNfYnVmZmVyX3NpemUgPSBWTVdHRlhfRklGT19TVEFUSUNfU0laRTsKIAlmaWZvLT5zdGF0aWNfYnVmZmVyID0gdm1hbGxvYyhmaWZvLT5zdGF0aWNfYnVmZmVyX3NpemUpOwogCWlmICh1bmxpa2VseShmaWZvLT5zdGF0aWNfYnVmZmVyID09IE5VTEwpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZpZm8tPmxhc3RfYnVmZmVyX3NpemUgPSBWTVdHRlhfRklGT19TVEFUSUNfU0laRTsKLQlmaWZvLT5sYXN0X2RhdGFfc2l6ZSA9IDA7Ci0JZmlmby0+bGFzdF9idWZmZXJfYWRkID0gZmFsc2U7Ci0JZmlmby0+bGFzdF9idWZmZXIgPSB2bWFsbG9jKGZpZm8tPmxhc3RfYnVmZmVyX3NpemUpOwotCWlmICh1bmxpa2VseShmaWZvLT5sYXN0X2J1ZmZlciA9PSBOVUxMKSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCiAJZmlmby0+ZHluYW1pY19idWZmZXIgPSBOVUxMOwogCWZpZm8tPnJlc2VydmVkX3NpemUgPSAwOwogCWZpZm8tPnVzaW5nX2JvdW5jZV9idWZmZXIgPSBmYWxzZTsKQEAgLTEzNywxNCArMTMxLDEwIEBACiAJCSAodW5zaWduZWQgaW50KSBtaW4sCiAJCSAodW5zaWduZWQgaW50KSBmaWZvLT5jYXBhYmlsaXRpZXMpOwogCi0JYXRvbWljX3NldCgmZGV2X3ByaXYtPmZlbmNlX3NlcSwgZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXF1ZW5jZSk7Ci0JaW93cml0ZTMyKGRldl9wcml2LT5sYXN0X3JlYWRfc2VxdWVuY2UsIGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFKTsKLQl2bXdfZmVuY2VfcXVldWVfaW5pdCgmZmlmby0+ZmVuY2VfcXVldWUpOworCWF0b21pY19zZXQoJmRldl9wcml2LT5tYXJrZXJfc2VxLCBkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcW5vKTsKKwlpb3dyaXRlMzIoZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXFubywgZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0UpOworCXZtd19tYXJrZXJfcXVldWVfaW5pdCgmZmlmby0+bWFya2VyX3F1ZXVlKTsKIAlyZXR1cm4gdm13X2ZpZm9fc2VuZF9mZW5jZShkZXZfcHJpdiwgJmR1bW15KTsKLW91dF9lcnI6Ci0JdmZyZWUoZmlmby0+c3RhdGljX2J1ZmZlcik7Ci0JZmlmby0+c3RhdGljX2J1ZmZlciA9IE5VTEw7Ci0JcmV0dXJuIHJldDsKIH0KIAogdm9pZCB2bXdfZmlmb19waW5nX2hvc3Qoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdWludDMyX3QgcmVhc29uKQpAQCAtMTcwLDcgKzE2MCw3IEBACiAJd2hpbGUgKHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19CVVNZKSAhPSAwKQogCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX1NZTkMsIFNWR0FfU1lOQ19HRU5FUklDKTsKIAotCWRldl9wcml2LT5sYXN0X3JlYWRfc2VxdWVuY2UgPSBpb3JlYWQzMihmaWZvX21lbSArIFNWR0FfRklGT19GRU5DRSk7CisJZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXFubyA9IGlvcmVhZDMyKGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFKTsKIAogCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9SRUdfQ09ORklHX0RPTkUsCiAJCSAgZGV2X3ByaXYtPmNvbmZpZ19kb25lX3N0YXRlKTsKQEAgLTE4MCwxMiArMTcwLDcgQEAKIAkJICBkZXZfcHJpdi0+dHJhY2VzX3N0YXRlKTsKIAogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKLQl2bXdfZmVuY2VfcXVldWVfdGFrZWRvd24oJmZpZm8tPmZlbmNlX3F1ZXVlKTsKLQotCWlmIChsaWtlbHkoZmlmby0+bGFzdF9idWZmZXIgIT0gTlVMTCkpIHsKLQkJdmZyZWUoZmlmby0+bGFzdF9idWZmZXIpOwotCQlmaWZvLT5sYXN0X2J1ZmZlciA9IE5VTEw7Ci0JfQorCXZtd19tYXJrZXJfcXVldWVfdGFrZWRvd24oJmZpZm8tPm1hcmtlcl9xdWV1ZSk7CiAKIAlpZiAobGlrZWx5KGZpZm8tPnN0YXRpY19idWZmZXIgIT0gTlVMTCkpIHsKIAkJdmZyZWUoZmlmby0+c3RhdGljX2J1ZmZlcik7CkBAIC0yNjIsOSArMjQ3LDggQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKIAkJb3V0bChTVkdBX0lSUUZMQUdfRklGT19QUk9HUkVTUywKIAkJICAgICBkZXZfcHJpdi0+aW9fc3RhcnQgKyBWTVdHRlhfSVJRU1RBVFVTX1BPUlQpOwotCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0ssCi0JCQkgIHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLKSB8Ci0JCQkgIFNWR0FfSVJRRkxBR19GSUZPX1BST0dSRVNTKTsKKwkJZGV2X3ByaXYtPmlycV9tYXNrIHw9IFNWR0FfSVJRRkxBR19GSUZPX1BST0dSRVNTOworCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0ssIGRldl9wcml2LT5pcnFfbWFzayk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwpAQCAtMjg2LDkgKzI3MCw4IEBACiAJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2X3ByaXYtPmZpZm9fcXVldWVfd2FpdGVycykpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKLQkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLLAotCQkJICB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfSVJRTUFTSykgJgotCQkJICB+U1ZHQV9JUlFGTEFHX0ZJRk9fUFJPR1JFU1MpOworCQlkZXZfcHJpdi0+aXJxX21hc2sgJj0gflNWR0FfSVJRRkxBR19GSUZPX1BST0dSRVNTOworCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0ssIGRldl9wcml2LT5pcnFfbWFzayk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwpAQCAtMjk2LDYgKzI3OSwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogUmVzZXJ2ZSBAYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBmaWZvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTCAoZXJyb3IpIG9uIHR3byBjb25kaXRpb25zOgorICogIElmIGl0IHRpbWVvdXRzIHdhaXRpbmcgZm9yIGZpZm8gc3BhY2UsIG9yIGlmIEBieXRlcyBpcyBsYXJnZXIgdGhhbiB0aGUKKyAqICAgYXZhaWxhYmxlIGZpZm8gc3BhY2UuCisgKgorICogUmV0dXJuczoKKyAqICAgUG9pbnRlciB0byB0aGUgZmlmbywgb3IgbnVsbCBvbiBlcnJvciAocG9zc2libGUgaGFyZHdhcmUgaGFuZykuCisgKi8KIHZvaWQgKnZtd19maWZvX3Jlc2VydmUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdWludDMyX3QgYnl0ZXMpCiB7CiAJc3RydWN0IHZtd19maWZvX3N0YXRlICpmaWZvX3N0YXRlID0gJmRldl9wcml2LT5maWZvOwpAQCAtNDY2LDcgKzQ1OSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZmaWZvX3N0YXRlLT5maWZvX211dGV4KTsKIH0KIAotaW50IHZtd19maWZvX3NlbmRfZmVuY2Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdWludDMyX3QgKnNlcXVlbmNlKQoraW50IHZtd19maWZvX3NlbmRfZmVuY2Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdWludDMyX3QgKnNlcW5vKQogewogCXN0cnVjdCB2bXdfZmlmb19zdGF0ZSAqZmlmb19zdGF0ZSA9ICZkZXZfcHJpdi0+ZmlmbzsKIAlzdHJ1Y3Qgc3ZnYV9maWZvX2NtZF9mZW5jZSAqY21kX2ZlbmNlOwpAQCAtNDc2LDE2ICs0NjksMTYgQEAKIAogCWZtID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgYnl0ZXMpOwogCWlmICh1bmxpa2VseShmbSA9PSBOVUxMKSkgewotCQkqc2VxdWVuY2UgPSBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPmZlbmNlX3NlcSk7CisJCSpzZXFubyA9IGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bWFya2VyX3NlcSk7CiAJCXJldCA9IC1FTk9NRU07Ci0JCSh2b2lkKXZtd19mYWxsYmFja193YWl0KGRldl9wcml2LCBmYWxzZSwgdHJ1ZSwgKnNlcXVlbmNlLAorCQkodm9pZCl2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgZmFsc2UsIHRydWUsICpzZXFubywKIAkJCQkJZmFsc2UsIDMqSFopOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCiAJZG8gewotCQkqc2VxdWVuY2UgPSBhdG9taWNfYWRkX3JldHVybigxLCAmZGV2X3ByaXYtPmZlbmNlX3NlcSk7Ci0JfSB3aGlsZSAoKnNlcXVlbmNlID09IDApOworCQkqc2Vxbm8gPSBhdG9taWNfYWRkX3JldHVybigxLCAmZGV2X3ByaXYtPm1hcmtlcl9zZXEpOworCX0gd2hpbGUgKCpzZXFubyA9PSAwKTsKIAogCWlmICghKGZpZm9fc3RhdGUtPmNhcGFiaWxpdGllcyAmIFNWR0FfRklGT19DQVBfRkVOQ0UpKSB7CiAKQEAgLTUwMiw2MSArNDk1LDY4IEBACiAJY21kX2ZlbmNlID0gKHN0cnVjdCBzdmdhX2ZpZm9fY21kX2ZlbmNlICopCiAJICAgICgodW5zaWduZWQgbG9uZylmbSArIHNpemVvZihfX2xlMzIpKTsKIAotCWlvd3JpdGUzMigqc2VxdWVuY2UsICZjbWRfZmVuY2UtPmZlbmNlKTsKLQlmaWZvX3N0YXRlLT5sYXN0X2J1ZmZlcl9hZGQgPSB0cnVlOworCWlvd3JpdGUzMigqc2Vxbm8sICZjbWRfZmVuY2UtPmZlbmNlKTsKIAl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIGJ5dGVzKTsKLQlmaWZvX3N0YXRlLT5sYXN0X2J1ZmZlcl9hZGQgPSBmYWxzZTsKLQkodm9pZCkgdm13X2ZlbmNlX3B1c2goJmZpZm9fc3RhdGUtPmZlbmNlX3F1ZXVlLCAqc2VxdWVuY2UpOwotCXZtd191cGRhdGVfc2VxdWVuY2UoZGV2X3ByaXYsIGZpZm9fc3RhdGUpOworCSh2b2lkKSB2bXdfbWFya2VyX3B1c2goJmZpZm9fc3RhdGUtPm1hcmtlcl9xdWV1ZSwgKnNlcW5vKTsKKwl2bXdfdXBkYXRlX3NlcW5vKGRldl9wcml2LCBmaWZvX3N0YXRlKTsKIAogb3V0X2VycjoKIAlyZXR1cm4gcmV0OwogfQogCiAvKioKLSAqIE1hcCB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgRklGTyByZWFkLW9ubHkgdG8gdXNlci1zcGFjZS4KKyAqIHZtd19maWZvX2VtaXRfZHVtbXlfcXVlcnkgLSBlbWl0cyBhIGR1bW15IHF1ZXJ5IHRvIHRoZSBmaWZvLgorICoKKyAqIEBkZXZfcHJpdjogVGhlIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqIEBjaWQ6IFRoZSBoYXJkd2FyZSBjb250ZXh0IGlkIHVzZWQgZm9yIHRoZSBxdWVyeS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW1pdCBhIGR1bW15IG9jY2x1c2lvbiBxdWVyeSB3aXRoCisgKiBubyBwcmltaXRpdmVzIHJlbmRlcmVkIGJldHdlZW4gcXVlcnkgYmVnaW4gYW5kIHF1ZXJ5IGVuZC4KKyAqIEl0J3MgdXNlZCB0byBwcm92aWRlIGEgcXVlcnkgYmFycmllciwgaW4gb3JkZXIgdG8ga25vdyB0aGF0IHdoZW4KKyAqIHRoaXMgcXVlcnkgaXMgZmluaXNoZWQsIGFsbCBwcmVjZWRpbmcgcXVlcmllcyBhcmUgYWxzbyBmaW5pc2hlZC4KKyAqCisgKiBBIFF1ZXJ5IHJlc3VsdHMgc3RydWN0dXJlIHNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYXQgdGhlIHN0YXJ0CisgKiBvZiB0aGUgZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvIGJ1ZmZlciBvYmplY3QuIEFuZCB0aGF0IGJ1ZmZlciBvYmplY3QKKyAqIG11c3QgYWxzbyBiZSBlaXRoZXIgcmVzZXJ2ZWQgb3IgcGlubmVkIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKgorICogUmV0dXJucyAtRU5PTUVNIG9uIGZhaWx1cmUgdG8gcmVzZXJ2ZSBmaWZvIHNwYWNlLgogICovCi0KLXN0YXRpYyBpbnQgdm13X2ZpZm9fdm1fZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQoraW50IHZtd19maWZvX2VtaXRfZHVtbXlfcXVlcnkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgIHVpbnQzMl90IGNpZCkKIHsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzOworCS8qCisJICogQSBxdWVyeSB3YWl0IHdpdGhvdXQgYSBwcmVjZWRpbmcgcXVlcnkgZW5kIHdpbGwKKwkgKiBhY3R1YWxseSBmaW5pc2ggYWxsIHF1ZXJpZXMgZm9yIHRoaXMgY2lkCisJICogd2l0aG91dCB3cml0aW5nIHRvIHRoZSBxdWVyeSByZXN1bHQgc3RydWN0dXJlLgorCSAqLwogCi0JaWYgKGFkZHJlc3MgIT0gdm1hLT52bV9zdGFydCkKLQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvOworCXN0cnVjdCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZFdhaXRGb3JRdWVyeSBib2R5OworCX0gKmNtZDsKIAotCXJldCA9IHZtX2luc2VydF9wZm4odm1hLCBhZGRyZXNzLCB2bWEtPnZtX3Bnb2ZmKTsKLQlpZiAobGlrZWx5KHJldCA9PSAtRUJVU1kgfHwgcmV0ID09IDApKQotCQlyZXR1cm4gVk1fRkFVTFRfTk9QQUdFOwotCWVsc2UgaWYgKHJldCA9PSAtRU5PTUVNKQotCQlyZXR1cm4gVk1fRkFVTFRfT09NOworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CiAKLQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOwotfQorCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJPdXQgb2YgZmlmbyBzcGFjZSBmb3IgZHVtbXkgcXVlcnkuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHZtd19maWZvX3ZtX29wcyA9IHsKLQkuZmF1bHQgPSB2bXdfZmlmb192bV9mYXVsdCwKLQkub3BlbiA9IE5VTEwsCi0JLmNsb3NlID0gTlVMTAotfTsKKwljbWQtPmhlYWRlci5pZCA9IFNWR0FfM0RfQ01EX1dBSVRfRk9SX1FVRVJZOworCWNtZC0+aGVhZGVyLnNpemUgPSBzaXplb2YoY21kLT5ib2R5KTsKKwljbWQtPmJvZHkuY2lkID0gY2lkOworCWNtZC0+Ym9keS50eXBlID0gU1ZHQTNEX1FVRVJZVFlQRV9PQ0NMVVNJT047CiAKLWludCB2bXdfZmlmb19tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdjsKLQlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2OworCWlmIChiby0+bWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNKSB7CisJCWNtZC0+Ym9keS5ndWVzdFJlc3VsdC5nbXJJZCA9IFNWR0FfR01SX0ZSQU1FQlVGRkVSOworCQljbWQtPmJvZHkuZ3Vlc3RSZXN1bHQub2Zmc2V0ID0gYm8tPm9mZnNldDsKKwl9IGVsc2UgeworCQljbWQtPmJvZHkuZ3Vlc3RSZXN1bHQuZ21ySWQgPSBiby0+bWVtLnN0YXJ0OworCQljbWQtPmJvZHkuZ3Vlc3RSZXN1bHQub2Zmc2V0ID0gMDsKKwl9CiAKLQlmaWxlX3ByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZGV2X3ByaXYgPSB2bXdfcHJpdihmaWxlX3ByaXYtPm1pbm9yLT5kZXYpOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKIAotCWlmICh2bWEtPnZtX3Bnb2ZmICE9IChkZXZfcHJpdi0+bW1pb19zdGFydCA+PiBQQUdFX1NISUZUKSB8fAotCSAgICAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAhPSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jdm1hLT52bV9mbGFncyAmPSB+KFZNX1dSSVRFIHwgVk1fTUFZV1JJVEUpOwotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9QRk5NQVAgfCBWTV9ET05URVhQQU5EIHwgVk1fU0hBUkVEOwotCXZtYS0+dm1fcGFnZV9wcm90ID0gdm1fZ2V0X3BhZ2VfcHJvdCh2bWEtPnZtX2ZsYWdzKTsKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHR0bV9pb19wcm90KFRUTV9QTF9GTEFHX1VOQ0FDSEVELAotCQkJCQl2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0Jdm1hLT52bV9vcHMgPSAmdm13X2ZpZm9fdm1fb3BzOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9nbXIuYwppbmRleCBkZTBjNTk0Li5mNGU3NzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9nbXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9nbXIuYwpAQCAtMSw2ICsxLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIENvcHlyaWdodCDCqSAyMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQ29weXJpZ2h0IMKpIDIwMDktMjAxMSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKQEAgLTI5LDYgKzI5LDc3IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInR0bS90dG1fYm9fZHJpdmVyLmgiCiAKKyNkZWZpbmUgVk1XX1BQTl9TSVpFIHNpemVvZih1bnNpZ25lZCBsb25nKQorCitzdGF0aWMgaW50IHZtd19nbXIyX2JpbmQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSBzdHJ1Y3QgcGFnZSAqcGFnZXNbXSwKKwkJCSB1bnNpZ25lZCBsb25nIG51bV9wYWdlcywKKwkJCSBpbnQgZ21yX2lkKQoreworCVNWR0FGaWZvQ21kRGVmaW5lR01SMiBkZWZpbmVfY21kOworCVNWR0FGaWZvQ21kUmVtYXBHTVIyIHJlbWFwX2NtZDsKKwl1aW50MzJfdCBkZWZpbmVfc2l6ZSA9IHNpemVvZihkZWZpbmVfY21kKSArIDQ7CisJdWludDMyX3QgcmVtYXBfc2l6ZSA9IFZNV19QUE5fU0laRSAqIG51bV9wYWdlcyArIHNpemVvZihyZW1hcF9jbWQpICsgNDsKKwl1aW50MzJfdCAqY21kOworCXVpbnQzMl90ICpjbWRfb3JpZzsKKwl1aW50MzJfdCBpOworCisJY21kX29yaWcgPSBjbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBkZWZpbmVfc2l6ZSArIHJlbWFwX3NpemUpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVmaW5lX2NtZC5nbXJJZCA9IGdtcl9pZDsKKwlkZWZpbmVfY21kLm51bVBhZ2VzID0gbnVtX3BhZ2VzOworCisJcmVtYXBfY21kLmdtcklkID0gZ21yX2lkOworCXJlbWFwX2NtZC5mbGFncyA9IChWTVdfUFBOX1NJWkUgPiBzaXplb2YoKmNtZCkpID8KKwkJU1ZHQV9SRU1BUF9HTVIyX1BQTjY0IDogU1ZHQV9SRU1BUF9HTVIyX1BQTjMyOworCXJlbWFwX2NtZC5vZmZzZXRQYWdlcyA9IDA7CisJcmVtYXBfY21kLm51bVBhZ2VzID0gbnVtX3BhZ2VzOworCisJKmNtZCsrID0gU1ZHQV9DTURfREVGSU5FX0dNUjI7CisJbWVtY3B5KGNtZCwgJmRlZmluZV9jbWQsIHNpemVvZihkZWZpbmVfY21kKSk7CisJY21kICs9IHNpemVvZihkZWZpbmVfY21kKSAvIHNpemVvZih1aW50MzIpOworCisJKmNtZCsrID0gU1ZHQV9DTURfUkVNQVBfR01SMjsKKwltZW1jcHkoY21kLCAmcmVtYXBfY21kLCBzaXplb2YocmVtYXBfY21kKSk7CisJY21kICs9IHNpemVvZihyZW1hcF9jbWQpIC8gc2l6ZW9mKHVpbnQzMik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyArK2kpIHsKKwkJaWYgKFZNV19QUE5fU0laRSA+IDQpCisJCQkqY21kID0gcGFnZV90b19wZm4oKnBhZ2VzKyspOworCQllbHNlCisJCQkqKCh1aW50NjRfdCAqKWNtZCkgPSBwYWdlX3RvX3BmbigqcGFnZXMrKyk7CisKKwkJY21kICs9IFZNV19QUE5fU0laRSAvIHNpemVvZigqY21kKTsKKwl9CisKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIGRlZmluZV9zaXplICsgcmVtYXBfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm13X2dtcjJfdW5iaW5kKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgaW50IGdtcl9pZCkKK3sKKwlTVkdBRmlmb0NtZERlZmluZUdNUjIgZGVmaW5lX2NtZDsKKwl1aW50MzJfdCBkZWZpbmVfc2l6ZSA9IHNpemVvZihkZWZpbmVfY21kKSArIDQ7CisJdWludDMyX3QgKmNtZDsKKworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIGRlZmluZV9zaXplKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiR01SMiB1bmJpbmQgZmFpbGVkLlxuIik7CisJCXJldHVybjsKKwl9CisJZGVmaW5lX2NtZC5nbXJJZCA9IGdtcl9pZDsKKwlkZWZpbmVfY21kLm51bVBhZ2VzID0gMDsKKworCSpjbWQrKyA9IFNWR0FfQ01EX0RFRklORV9HTVIyOworCW1lbWNweShjbWQsICZkZWZpbmVfY21kLCBzaXplb2YoZGVmaW5lX2NtZCkpOworCisJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBkZWZpbmVfc2l6ZSk7Cit9CisKIC8qKgogICogRklYTUU6IEFkanVzdCB0byB0aGUgdHRtIGxvd21lbSAvIGhpZ2htZW0gc3RvcmFnZSB0byBtaW5pbWl6ZQogICogdGhlIG51bWJlciBvZiB1c2VkIGRlc2NyaXB0b3JzLgpAQCAtMTcwLDYgKzI0MSw5IEBACiAJc3RydWN0IGxpc3RfaGVhZCBkZXNjX3BhZ2VzOwogCWludCByZXQ7CiAKKwlpZiAobGlrZWx5KGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9HTVIyKSkKKwkJcmV0dXJuIHZtd19nbXIyX2JpbmQoZGV2X3ByaXYsIHBhZ2VzLCBudW1fcGFnZXMsIGdtcl9pZCk7CisKIAlpZiAodW5saWtlbHkoIShkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xOTIsNiArMjY2LDExIEBACiAKIHZvaWQgdm13X2dtcl91bmJpbmQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgaW50IGdtcl9pZCkKIHsKKwlpZiAobGlrZWx5KGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9HTVIyKSkgeworCQl2bXdfZ21yMl91bmJpbmQoZGV2X3ByaXYsIGdtcl9pZCk7CisJCXJldHVybjsKKwl9CisKIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwogCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9SRUdfR01SX0lELCBnbXJfaWQpOwogCXdtYigpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yaWRfbWFuYWdlci5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yaWRfbWFuYWdlci5jCmluZGV4IGFjNmUwZDEuLjVmNzE3MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2dtcmlkX21hbmFnZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9nbXJpZF9tYW5hZ2VyLmMKQEAgLTQwLDYgKzQwLDggQEAKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IGlkYSBnbXJfaWRhOwogCXVpbnQzMl90IG1heF9nbXJfaWRzOworCXVpbnQzMl90IG1heF9nbXJfcGFnZXM7CisJdWludDMyX3QgdXNlZF9nbXJfcGFnZXM7CiB9OwogCiBzdGF0aWMgaW50IHZtd19nbXJpZF9tYW5fZ2V0X25vZGUoc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4sCkBAIC00OSwzMyArNTEsNTAgQEAKIHsKIAlzdHJ1Y3Qgdm13Z2Z4X2dtcmlkX21hbiAqZ21hbiA9CiAJCShzdHJ1Y3Qgdm13Z2Z4X2dtcmlkX21hbiAqKW1hbi0+cHJpdjsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCWludCBpZDsKIAogCW1lbS0+bW1fbm9kZSA9IE5VTEw7CiAKKwlzcGluX2xvY2soJmdtYW4tPmxvY2spOworCisJaWYgKGdtYW4tPm1heF9nbXJfcGFnZXMgPiAwKSB7CisJCWdtYW4tPnVzZWRfZ21yX3BhZ2VzICs9IGJvLT5udW1fcGFnZXM7CisJCWlmICh1bmxpa2VseShnbWFuLT51c2VkX2dtcl9wYWdlcyA+IGdtYW4tPm1heF9nbXJfcGFnZXMpKQorCQkJZ290byBvdXRfZXJyX2xvY2tlZDsKKwl9CisKIAlkbyB7Ci0JCWlmICh1bmxpa2VseShpZGFfcHJlX2dldCgmZ21hbi0+Z21yX2lkYSwgR0ZQX0tFUk5FTCkgPT0gMCkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQorCQlzcGluX3VubG9jaygmZ21hbi0+bG9jayk7CisJCWlmICh1bmxpa2VseShpZGFfcHJlX2dldCgmZ21hbi0+Z21yX2lkYSwgR0ZQX0tFUk5FTCkgPT0gMCkpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9lcnI7CisJCX0KIAkJc3Bpbl9sb2NrKCZnbWFuLT5sb2NrKTsKLQkJcmV0ID0gaWRhX2dldF9uZXcoJmdtYW4tPmdtcl9pZGEsICZpZCk7CiAKKwkJcmV0ID0gaWRhX2dldF9uZXcoJmdtYW4tPmdtcl9pZGEsICZpZCk7CiAJCWlmICh1bmxpa2VseShyZXQgPT0gMCAmJiBpZCA+PSBnbWFuLT5tYXhfZ21yX2lkcykpIHsKIAkJCWlkYV9yZW1vdmUoJmdtYW4tPmdtcl9pZGEsIGlkKTsKLQkJCXNwaW5fdW5sb2NrKCZnbWFuLT5sb2NrKTsKLQkJCXJldHVybiAwOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0X2Vycl9sb2NrZWQ7CiAJCX0KLQotCQlzcGluX3VubG9jaygmZ21hbi0+bG9jayk7Ci0KIAl9IHdoaWxlIChyZXQgPT0gLUVBR0FJTik7CiAKIAlpZiAobGlrZWx5KHJldCA9PSAwKSkgewogCQltZW0tPm1tX25vZGUgPSBnbWFuOwogCQltZW0tPnN0YXJ0ID0gaWQ7Ci0JfQorCQltZW0tPm51bV9wYWdlcyA9IGJvLT5udW1fcGFnZXM7CisJfSBlbHNlCisJCWdvdG8gb3V0X2Vycl9sb2NrZWQ7CiAKKwlzcGluX3VubG9jaygmZ21hbi0+bG9jayk7CisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJc3Bpbl9sb2NrKCZnbWFuLT5sb2NrKTsKK291dF9lcnJfbG9ja2VkOgorCWdtYW4tPnVzZWRfZ21yX3BhZ2VzIC09IGJvLT5udW1fcGFnZXM7CisJc3Bpbl91bmxvY2soJmdtYW4tPmxvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg4LDYgKzEwNyw3IEBACiAJaWYgKG1lbS0+bW1fbm9kZSkgewogCQlzcGluX2xvY2soJmdtYW4tPmxvY2spOwogCQlpZGFfcmVtb3ZlKCZnbWFuLT5nbXJfaWRhLCBtZW0tPnN0YXJ0KTsKKwkJZ21hbi0+dXNlZF9nbXJfcGFnZXMgLT0gbWVtLT5udW1fcGFnZXM7CiAJCXNwaW5fdW5sb2NrKCZnbWFuLT5sb2NrKTsKIAkJbWVtLT5tbV9ub2RlID0gTlVMTDsKIAl9CkBAIC05Niw2ICsxMTYsOCBAQAogc3RhdGljIGludCB2bXdfZ21yaWRfbWFuX2luaXQoc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4sCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHBfc2l6ZSkKIHsKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0KKwkJY29udGFpbmVyX29mKG1hbi0+YmRldiwgc3RydWN0IHZtd19wcml2YXRlLCBiZGV2KTsKIAlzdHJ1Y3Qgdm13Z2Z4X2dtcmlkX21hbiAqZ21hbiA9CiAJCWt6YWxsb2Moc2l6ZW9mKCpnbWFuKSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTEwMyw2ICsxMjUsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwaW5fbG9ja19pbml0KCZnbWFuLT5sb2NrKTsKKwlnbWFuLT5tYXhfZ21yX3BhZ2VzID0gZGV2X3ByaXYtPm1heF9nbXJfcGFnZXM7CisJZ21hbi0+dXNlZF9nbXJfcGFnZXMgPSAwOwogCWlkYV9pbml0KCZnbWFuLT5nbXJfaWRhKTsKIAlnbWFuLT5tYXhfZ21yX2lkcyA9IHBfc2l6ZTsKIAltYW4tPnByaXYgPSAodm9pZCAqKSBnbWFuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaW9jdGwuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2lvY3RsLmMKaW5kZXggNTcwZDU3Ny4uM2Y2MzQzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaW9jdGwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pb2N0bC5jCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlICJ2bXdnZnhfZHJ2LmgiCiAjaW5jbHVkZSAidm13Z2Z4X2RybS5oIgorI2luY2x1ZGUgInZtd2dmeF9rbXMuaCIKIAogaW50IHZtd19nZXRwYXJhbV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCkBAIC00NSw5ICs0Niw2IEBACiAJY2FzZSBEUk1fVk1XX1BBUkFNXzNEOgogCQlwYXJhbS0+dmFsdWUgPSB2bXdfZmlmb19oYXZlXzNkKGRldl9wcml2KSA/IDEgOiAwOwogCQlicmVhazsKLQljYXNlIERSTV9WTVdfUEFSQU1fRklGT19PRkZTRVQ6Ci0JCXBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5tbWlvX3N0YXJ0OwotCQlicmVhazsKIAljYXNlIERSTV9WTVdfUEFSQU1fSFdfQ0FQUzoKIAkJcGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPmNhcGFiaWxpdGllczsKIAkJYnJlYWs7CkBAIC01Nyw2ICs1NSwxMyBAQAogCWNhc2UgRFJNX1ZNV19QQVJBTV9NQVhfRkJfU0laRToKIAkJcGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPnZyYW1fc2l6ZTsKIAkJYnJlYWs7CisJY2FzZSBEUk1fVk1XX1BBUkFNX0ZJRk9fSFdfVkVSU0lPTjoKKwl7CisJCV9fbGUzMiBfX2lvbWVtICpmaWZvX21lbSA9IGRldl9wcml2LT5tbWlvX3ZpcnQ7CisKKwkJcGFyYW0tPnZhbHVlID0gaW9yZWFkMzIoZmlmb19tZW0gKyBTVkdBX0ZJRk9fM0RfSFdWRVJTSU9OKTsKKwkJYnJlYWs7CisJfQogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigiSWxsZWdhbCB2bXdnZnggZ2V0IHBhcmFtIHJlcXVlc3Q6ICVkXG4iLAogCQkJICBwYXJhbS0+cGFyYW0pOwpAQCAtNjYsMjUgKzcxLDI1OSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdm13X2ZpZm9fZGVidWdfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKworaW50IHZtd19nZXRfY2FwXzNkX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CisJc3RydWN0IGRybV92bXdfZ2V0XzNkX2NhcF9hcmcgKmFyZyA9CisJCShzdHJ1Y3QgZHJtX3Ztd19nZXRfM2RfY2FwX2FyZyAqKSBkYXRhOwogCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOwotCXN0cnVjdCB2bXdfZmlmb19zdGF0ZSAqZmlmb19zdGF0ZSA9ICZkZXZfcHJpdi0+ZmlmbzsKLQlzdHJ1Y3QgZHJtX3Ztd19maWZvX2RlYnVnX2FyZyAqYXJnID0KLQkgICAgKHN0cnVjdCBkcm1fdm13X2ZpZm9fZGVidWdfYXJnICopZGF0YTsKLQlfX2xlMzIgX191c2VyICpidWZmZXIgPSAoX19sZTMyIF9fdXNlciAqKQotCSAgICAodW5zaWduZWQgbG9uZylhcmctPmRlYnVnX2J1ZmZlcjsKKwl1aW50MzJfdCBzaXplOworCV9fbGUzMiBfX2lvbWVtICpmaWZvX21lbTsKKwl2b2lkIF9fdXNlciAqYnVmZmVyID0gKHZvaWQgX191c2VyICopKCh1bnNpZ25lZCBsb25nKShhcmctPmJ1ZmZlcikpOworCXZvaWQgKmJvdW5jZTsKKwlpbnQgcmV0OwogCi0JaWYgKHVubGlrZWx5KGZpZm9fc3RhdGUtPmxhc3RfYnVmZmVyID09IE5VTEwpKQorCWlmICh1bmxpa2VseShhcmctPnBhZDY0ICE9IDApKSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCBHRVRfM0RfQ0FQIGFyZ3VtZW50LlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGFyZy0+ZGVidWdfYnVmZmVyX3NpemUgPCBmaWZvX3N0YXRlLT5sYXN0X2RhdGFfc2l6ZSkgewotCQlhcmctPnVzZWRfc2l6ZSA9IGFyZy0+ZGVidWdfYnVmZmVyX3NpemU7Ci0JCWFyZy0+ZGlkX25vdF9maXQgPSAxOwotCX0gZWxzZSB7Ci0JCWFyZy0+dXNlZF9zaXplID0gZmlmb19zdGF0ZS0+bGFzdF9kYXRhX3NpemU7Ci0JCWFyZy0+ZGlkX25vdF9maXQgPSAwOwogCX0KLQlyZXR1cm4gY29weV90b191c2VyKGJ1ZmZlciwgZmlmb19zdGF0ZS0+bGFzdF9idWZmZXIsIGFyZy0+dXNlZF9zaXplKTsKKworCXNpemUgPSAoU1ZHQV9GSUZPXzNEX0NBUFNfTEFTVCAtIFNWR0FfRklGT18zRF9DQVBTICsgMSkgPDwgMjsKKworCWlmIChhcmctPm1heF9zaXplIDwgc2l6ZSkKKwkJc2l6ZSA9IGFyZy0+bWF4X3NpemU7CisKKwlib3VuY2UgPSB2bWFsbG9jKHNpemUpOworCWlmICh1bmxpa2VseShib3VuY2UgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgYm91bmNlIGJ1ZmZlciBmb3IgM0QgY2Fwcy5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmaWZvX21lbSA9IGRldl9wcml2LT5tbWlvX3ZpcnQ7CisJbWVtY3B5X2Zyb21pbyhib3VuY2UsICZmaWZvX21lbVtTVkdBX0ZJRk9fM0RfQ0FQU10sIHNpemUpOworCisJcmV0ID0gY29weV90b191c2VyKGJ1ZmZlciwgYm91bmNlLCBzaXplKTsKKwl2ZnJlZShib3VuY2UpOworCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVwb3J0IDNEIGNhcHMgaW5mby5cbiIpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHZtd19wcmVzZW50X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlID0gdm13X2Zwcml2KGZpbGVfcHJpdiktPnRmaWxlOworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOworCXN0cnVjdCBkcm1fdm13X3ByZXNlbnRfYXJnICphcmcgPQorCQkoc3RydWN0IGRybV92bXdfcHJlc2VudF9hcmcgKilkYXRhOworCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3VyZmFjZTsKKwlzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3RlciA9IHZtd19tYXN0ZXIoZmlsZV9wcml2LT5tYXN0ZXIpOworCXN0cnVjdCBkcm1fdm13X3JlY3QgX191c2VyICpjbGlwc19wdHI7CisJc3RydWN0IGRybV92bXdfcmVjdCAqY2xpcHMgPSBOVUxMOworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKwlzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICp2ZmI7CisJdWludDMyX3QgbnVtX2NsaXBzOworCWludCByZXQ7CisKKwludW1fY2xpcHMgPSBhcmctPm51bV9jbGlwczsKKwljbGlwc19wdHIgPSAoc3RydWN0IGRybV92bXdfcmVjdCAqKSh1bnNpZ25lZCBsb25nKWFyZy0+Y2xpcHNfcHRyOworCisJaWYgKHVubGlrZWx5KG51bV9jbGlwcyA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2xpcHNfcHRyID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJWYXJpYWJsZSBjbGlwc19wdHIgbXVzdCBiZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfY2xpcHM7CisJfQorCisJY2xpcHMgPSBremFsbG9jKG51bV9jbGlwcyAqIHNpemVvZigqY2xpcHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2xpcHMgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBjbGlwIHJlY3QgbGlzdC5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9jbGlwczsKKwl9CisKKwlyZXQgPSBjb3B5X2Zyb21fdXNlcihjbGlwcywgY2xpcHNfcHRyLCBudW1fY2xpcHMgKiBzaXplb2YoKmNsaXBzKSk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBjb3B5IGNsaXAgcmVjdHMgZnJvbSB1c2Vyc3BhY2UuXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXRfbm9fY29weTsKKwl9CisKKwlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIG91dF9ub19tb2RlX211dGV4OworCX0KKworCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgYXJnLT5mYl9pZCwgRFJNX01PREVfT0JKRUNUX0ZCKTsKKwlpZiAoIW9iaikgeworCQlEUk1fRVJST1IoIkludmFsaWQgZnJhbWVidWZmZXIgaWQuXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfbm9fZmI7CisJfQorCisJdmZiID0gdm13X2ZyYW1lYnVmZmVyX3RvX3ZmYihvYmpfdG9fZmIob2JqKSk7CisJaWYgKCF2ZmItPmRtYWJ1ZikgeworCQlEUk1fRVJST1IoIkZyYW1lYnVmZmVyIG5vdCBkbWFidWYgYmFja2VkLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X25vX2ZiOworCX0KKworCXJldCA9IHR0bV9yZWFkX2xvY2soJnZtYXN0ZXItPmxvY2ssIHRydWUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X25vX3R0bV9sb2NrOworCisJcmV0ID0gdm13X3VzZXJfc3VyZmFjZV9sb29rdXBfaGFuZGxlKGRldl9wcml2LCB0ZmlsZSwgYXJnLT5zaWQsCisJCQkJCSAgICAgJnN1cmZhY2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X25vX3N1cmZhY2U7CisKKwlyZXQgPSB2bXdfa21zX3ByZXNlbnQoZGV2X3ByaXYsIGZpbGVfcHJpdiwKKwkJCSAgICAgIHZmYiwgc3VyZmFjZSwgYXJnLT5zaWQsCisJCQkgICAgICBhcmctPmRlc3RfeCwgYXJnLT5kZXN0X3ksCisJCQkgICAgICBjbGlwcywgbnVtX2NsaXBzKTsKKworCS8qIHZtd191c2VyX3N1cmZhY2VfbG9va3VwIHRha2VzIG9uZSByZWYgc28gZG9lcyBuZXdfZmIgKi8KKwl2bXdfc3VyZmFjZV91bnJlZmVyZW5jZSgmc3VyZmFjZSk7CisKK291dF9ub19zdXJmYWNlOgorCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CitvdXRfbm9fdHRtX2xvY2s6CitvdXRfbm9fZmI6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKK291dF9ub19tb2RlX211dGV4Ogorb3V0X25vX2NvcHk6CisJa2ZyZWUoY2xpcHMpOworb3V0X2NsaXBzOgorCXJldHVybiByZXQ7Cit9CisKK2ludCB2bXdfcHJlc2VudF9yZWFkYmFja19pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOworCXN0cnVjdCBkcm1fdm13X3ByZXNlbnRfcmVhZGJhY2tfYXJnICphcmcgPQorCQkoc3RydWN0IGRybV92bXdfcHJlc2VudF9yZWFkYmFja19hcmcgKilkYXRhOworCXN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIgKnVzZXJfZmVuY2VfcmVwID0KKwkJKHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIgKikKKwkJKHVuc2lnbmVkIGxvbmcpYXJnLT5mZW5jZV9yZXA7CisJc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIgPSB2bXdfbWFzdGVyKGZpbGVfcHJpdi0+bWFzdGVyKTsKKwlzdHJ1Y3QgZHJtX3Ztd19yZWN0IF9fdXNlciAqY2xpcHNfcHRyOworCXN0cnVjdCBkcm1fdm13X3JlY3QgKmNsaXBzID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiOworCXVpbnQzMl90IG51bV9jbGlwczsKKwlpbnQgcmV0OworCisJbnVtX2NsaXBzID0gYXJnLT5udW1fY2xpcHM7CisJY2xpcHNfcHRyID0gKHN0cnVjdCBkcm1fdm13X3JlY3QgKikodW5zaWduZWQgbG9uZylhcmctPmNsaXBzX3B0cjsKKworCWlmICh1bmxpa2VseShudW1fY2xpcHMgPT0gMCkpCisJCXJldHVybiAwOworCisJaWYgKGNsaXBzX3B0ciA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiQXJndW1lbnQgY2xpcHNfcHRyIG11c3QgYmUgc3BlY2lmaWVkLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2NsaXBzOworCX0KKworCWNsaXBzID0ga3phbGxvYyhudW1fY2xpcHMgKiBzaXplb2YoKmNsaXBzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNsaXBzID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgY2xpcCByZWN0IGxpc3QuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfY2xpcHM7CisJfQorCisJcmV0ID0gY29weV9mcm9tX3VzZXIoY2xpcHMsIGNsaXBzX3B0ciwgbnVtX2NsaXBzICogc2l6ZW9mKCpjbGlwcykpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gY29weSBjbGlwIHJlY3RzIGZyb20gdXNlcnNwYWNlLlxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X25vX2NvcHk7CisJfQorCisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBvdXRfbm9fbW9kZV9tdXRleDsKKwl9CisKKwlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGFyZy0+ZmJfaWQsIERSTV9NT0RFX09CSkVDVF9GQik7CisJaWYgKCFvYmopIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGZyYW1lYnVmZmVyIGlkLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X25vX2ZiOworCX0KKworCXZmYiA9IHZtd19mcmFtZWJ1ZmZlcl90b192ZmIob2JqX3RvX2ZiKG9iaikpOworCWlmICghdmZiLT5kbWFidWYpIHsKKwkJRFJNX0VSUk9SKCJGcmFtZWJ1ZmZlciBub3QgZG1hYnVmIGJhY2tlZC5cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9ub19mYjsKKwl9CisKKwlyZXQgPSB0dG1fcmVhZF9sb2NrKCZ2bWFzdGVyLT5sb2NrLCB0cnVlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dF9ub190dG1fbG9jazsKKworCXJldCA9IHZtd19rbXNfcmVhZGJhY2soZGV2X3ByaXYsIGZpbGVfcHJpdiwKKwkJCSAgICAgICB2ZmIsIHVzZXJfZmVuY2VfcmVwLAorCQkJICAgICAgIGNsaXBzLCBudW1fY2xpcHMpOworCisJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKK291dF9ub190dG1fbG9jazoKK291dF9ub19mYjoKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworb3V0X25vX21vZGVfbXV0ZXg6CitvdXRfbm9fY29weToKKwlrZnJlZShjbGlwcyk7CitvdXRfY2xpcHM6CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIHZtd19mb3BzX3BvbGwgLSB3cmFwcGVyIGFyb3VuZCB0aGUgZHJtX3BvbGwgZnVuY3Rpb24KKyAqCisgKiBAZmlscDogU2VlIHRoZSBsaW51eCBmb3BzIHBvbGwgZG9jdW1lbnRhdGlvbi4KKyAqIEB3YWl0OiBTZWUgdGhlIGxpbnV4IGZvcHMgcG9sbCBkb2N1bWVudGF0aW9uLgorICoKKyAqIFdyYXBwZXIgYXJvdW5kIHRoZSBkcm1fcG9sbCBmdW5jdGlvbiB0aGF0IG1ha2VzIHN1cmUgdGhlIGRldmljZSBpcworICogcHJvY2Vzc2luZyB0aGUgZmlmbyBpZiBkcm1fcG9sbCBkZWNpZGVzIHRvIHdhaXQuCisgKi8KK3Vuc2lnbmVkIGludCB2bXdfZm9wc19wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9CisJCXZtd19wcml2KGZpbGVfcHJpdi0+bWlub3ItPmRldik7CisKKwl2bXdfZmlmb19waW5nX2hvc3QoZGV2X3ByaXYsIFNWR0FfU1lOQ19HRU5FUklDKTsKKwlyZXR1cm4gZHJtX3BvbGwoZmlscCwgd2FpdCk7Cit9CisKKworLyoqCisgKiB2bXdfZm9wc19yZWFkIC0gd3JhcHBlciBhcm91bmQgdGhlIGRybV9yZWFkIGZ1bmN0aW9uCisgKgorICogQGZpbHA6IFNlZSB0aGUgbGludXggZm9wcyByZWFkIGRvY3VtZW50YXRpb24uCisgKiBAYnVmZmVyOiBTZWUgdGhlIGxpbnV4IGZvcHMgcmVhZCBkb2N1bWVudGF0aW9uLgorICogQGNvdW50OiBTZWUgdGhlIGxpbnV4IGZvcHMgcmVhZCBkb2N1bWVudGF0aW9uLgorICogb2Zmc2V0OiBTZWUgdGhlIGxpbnV4IGZvcHMgcmVhZCBkb2N1bWVudGF0aW9uLgorICoKKyAqIFdyYXBwZXIgYXJvdW5kIHRoZSBkcm1fcmVhZCBmdW5jdGlvbiB0aGF0IG1ha2VzIHN1cmUgdGhlIGRldmljZSBpcworICogcHJvY2Vzc2luZyB0aGUgZmlmbyBpZiBkcm1fcmVhZCBkZWNpZGVzIHRvIHdhaXQuCisgKi8KK3NzaXplX3Qgdm13X2ZvcHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0KKwkJdm13X3ByaXYoZmlsZV9wcml2LT5taW5vci0+ZGV2KTsKKworCXZtd19maWZvX3BpbmdfaG9zdChkZXZfcHJpdiwgU1ZHQV9TWU5DX0dFTkVSSUMpOworCXJldHVybiBkcm1fcmVhZChmaWxwLCBidWZmZXIsIGNvdW50LCBvZmZzZXQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pcnEuYwppbmRleCBlOTIyOThhLi5jYWJjOTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pcnEuYwpAQCAtMzQsMjYgKzM0LDMzIEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWFyZzsKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKLQl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3Qgc3RhdHVzLCBtYXNrZWRfc3RhdHVzOwogCiAJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+aXJxX2xvY2spOwogCXN0YXR1cyA9IGlubChkZXZfcHJpdi0+aW9fc3RhcnQgKyBWTVdHRlhfSVJRU1RBVFVTX1BPUlQpOworCW1hc2tlZF9zdGF0dXMgPSBzdGF0dXMgJiBkZXZfcHJpdi0+aXJxX21hc2s7CiAJc3Bpbl91bmxvY2soJmRldl9wcml2LT5pcnFfbG9jayk7CiAKLQlpZiAoc3RhdHVzICYgU1ZHQV9JUlFGTEFHX0FOWV9GRU5DRSkKLQkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5mZW5jZV9xdWV1ZSk7Ci0JaWYgKHN0YXR1cyAmIFNWR0FfSVJRRkxBR19GSUZPX1BST0dSRVNTKQotCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPmZpZm9fcXVldWUpOwotCi0JaWYgKGxpa2VseShzdGF0dXMpKSB7CisJaWYgKGxpa2VseShzdGF0dXMpKQogCQlvdXRsKHN0YXR1cywgZGV2X3ByaXYtPmlvX3N0YXJ0ICsgVk1XR0ZYX0lSUVNUQVRVU19QT1JUKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKCFtYXNrZWRfc3RhdHVzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpZiAobWFza2VkX3N0YXR1cyAmIChTVkdBX0lSUUZMQUdfQU5ZX0ZFTkNFIHwKKwkJCSAgICAgU1ZHQV9JUlFGTEFHX0ZFTkNFX0dPQUwpKSB7CisJCXZtd19mZW5jZXNfdXBkYXRlKGRldl9wcml2LT5mbWFuKTsKKwkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5mZW5jZV9xdWV1ZSk7CiAJfQogCi0JcmV0dXJuIElSUV9OT05FOworCWlmIChtYXNrZWRfc3RhdHVzICYgU1ZHQV9JUlFGTEFHX0ZJRk9fUFJPR1JFU1MpCisJCXdha2VfdXBfYWxsKCZkZXZfcHJpdi0+Zmlmb19xdWV1ZSk7CisKKworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGJvb2wgdm13X2ZpZm9faWRsZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCB1aW50MzJfdCBzZXF1ZW5jZSkKK3N0YXRpYyBib29sIHZtd19maWZvX2lkbGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdWludDMyX3Qgc2Vxbm8pCiB7CiAJdWludDMyX3QgYnVzeTsKIApAQCAtNjQsNDMgKzcxLDQzIEBACiAJcmV0dXJuIChidXN5ID09IDApOwogfQogCi12b2lkIHZtd191cGRhdGVfc2VxdWVuY2Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKK3ZvaWQgdm13X3VwZGF0ZV9zZXFubyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJIHN0cnVjdCB2bXdfZmlmb19zdGF0ZSAqZmlmb19zdGF0ZSkKIHsKIAlfX2xlMzIgX19pb21lbSAqZmlmb19tZW0gPSBkZXZfcHJpdi0+bW1pb192aXJ0OworCXVpbnQzMl90IHNlcW5vID0gaW9yZWFkMzIoZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0UpOwogCi0JdWludDMyX3Qgc2VxdWVuY2UgPSBpb3JlYWQzMihmaWZvX21lbSArIFNWR0FfRklGT19GRU5DRSk7Ci0KLQlpZiAoZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXF1ZW5jZSAhPSBzZXF1ZW5jZSkgewotCQlkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcXVlbmNlID0gc2VxdWVuY2U7Ci0JCXZtd19mZW5jZV9wdWxsKCZmaWZvX3N0YXRlLT5mZW5jZV9xdWV1ZSwgc2VxdWVuY2UpOworCWlmIChkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcW5vICE9IHNlcW5vKSB7CisJCWRldl9wcml2LT5sYXN0X3JlYWRfc2Vxbm8gPSBzZXFubzsKKwkJdm13X21hcmtlcl9wdWxsKCZmaWZvX3N0YXRlLT5tYXJrZXJfcXVldWUsIHNlcW5vKTsKKwkJdm13X2ZlbmNlc191cGRhdGUoZGV2X3ByaXYtPmZtYW4pOwogCX0KIH0KIAotYm9vbCB2bXdfZmVuY2Vfc2lnbmFsZWQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKLQkJCXVpbnQzMl90IHNlcXVlbmNlKQorYm9vbCB2bXdfc2Vxbm9fcGFzc2VkKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgdWludDMyX3Qgc2Vxbm8pCiB7CiAJc3RydWN0IHZtd19maWZvX3N0YXRlICpmaWZvX3N0YXRlOwogCWJvb2wgcmV0OwogCi0JaWYgKGxpa2VseShkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcXVlbmNlIC0gc2VxdWVuY2UgPCBWTVdfRkVOQ0VfV1JBUCkpCisJaWYgKGxpa2VseShkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcW5vIC0gc2Vxbm8gPCBWTVdfRkVOQ0VfV1JBUCkpCiAJCXJldHVybiB0cnVlOwogCiAJZmlmb19zdGF0ZSA9ICZkZXZfcHJpdi0+ZmlmbzsKLQl2bXdfdXBkYXRlX3NlcXVlbmNlKGRldl9wcml2LCBmaWZvX3N0YXRlKTsKLQlpZiAobGlrZWx5KGRldl9wcml2LT5sYXN0X3JlYWRfc2VxdWVuY2UgLSBzZXF1ZW5jZSA8IFZNV19GRU5DRV9XUkFQKSkKKwl2bXdfdXBkYXRlX3NlcW5vKGRldl9wcml2LCBmaWZvX3N0YXRlKTsKKwlpZiAobGlrZWx5KGRldl9wcml2LT5sYXN0X3JlYWRfc2Vxbm8gLSBzZXFubyA8IFZNV19GRU5DRV9XUkFQKSkKIAkJcmV0dXJuIHRydWU7CiAKIAlpZiAoIShmaWZvX3N0YXRlLT5jYXBhYmlsaXRpZXMgJiBTVkdBX0ZJRk9fQ0FQX0ZFTkNFKSAmJgotCSAgICB2bXdfZmlmb19pZGxlKGRldl9wcml2LCBzZXF1ZW5jZSkpCisJICAgIHZtd19maWZvX2lkbGUoZGV2X3ByaXYsIHNlcW5vKSkKIAkJcmV0dXJuIHRydWU7CiAKIAkvKioKLQkgKiBUaGVuIGNoZWNrIGlmIHRoZSBzZXF1ZW5jZSBpcyBoaWdoZXIgdGhhbiB3aGF0IHdlJ3ZlIGFjdHVhbGx5CisJICogVGhlbiBjaGVjayBpZiB0aGUgc2Vxbm8gaXMgaGlnaGVyIHRoYW4gd2hhdCB3ZSd2ZSBhY3R1YWxseQogCSAqIGVtaXR0ZWQuIFRoZW4gdGhlIGZlbmNlIGlzIHN0YWxlIGFuZCBzaWduYWxlZC4KIAkgKi8KIAotCXJldCA9ICgoYXRvbWljX3JlYWQoJmRldl9wcml2LT5mZW5jZV9zZXEpIC0gc2VxdWVuY2UpCisJcmV0ID0gKChhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1hcmtlcl9zZXEpIC0gc2Vxbm8pCiAJICAgICAgID4gVk1XX0ZFTkNFX1dSQVApOwogCiAJcmV0dXJuIHJldDsKQEAgLTEwOSw3ICsxMTYsNyBAQAogaW50IHZtd19mYWxsYmFja193YWl0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCSAgICAgIGJvb2wgbGF6eSwKIAkJICAgICAgYm9vbCBmaWZvX2lkbGUsCi0JCSAgICAgIHVpbnQzMl90IHNlcXVlbmNlLAorCQkgICAgICB1aW50MzJfdCBzZXFubywKIAkJICAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLAogCQkgICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7CkBAIC0xMjMsNyArMTMwLDcgQEAKIAlERUZJTkVfV0FJVChfX3dhaXQpOwogCiAJd2FpdF9jb25kaXRpb24gPSAoZmlmb19pZGxlKSA/ICZ2bXdfZmlmb19pZGxlIDoKLQkJJnZtd19mZW5jZV9zaWduYWxlZDsKKwkJJnZtd19zZXFub19wYXNzZWQ7CiAKIAkvKioKIAkgKiBCbG9jayBjb21tYW5kIHN1Ym1pc3Npb24gd2hpbGUgd2FpdGluZyBmb3IgaWRsZS4KQEAgLTEzMSwxNCArMTM4LDE0IEBACiAKIAlpZiAoZmlmb19pZGxlKQogCQlkb3duX3JlYWQoJmZpZm9fc3RhdGUtPnJ3c2VtKTsKLQlzaWduYWxfc2VxID0gYXRvbWljX3JlYWQoJmRldl9wcml2LT5mZW5jZV9zZXEpOworCXNpZ25hbF9zZXEgPSBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1hcmtlcl9zZXEpOwogCXJldCA9IDA7CiAKIAlmb3IgKDs7KSB7CiAJCXByZXBhcmVfdG9fd2FpdCgmZGV2X3ByaXYtPmZlbmNlX3F1ZXVlLCAmX193YWl0LAogCQkJCShpbnRlcnJ1cHRpYmxlKSA/CiAJCQkJVEFTS19JTlRFUlJVUFRJQkxFIDogVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlpZiAod2FpdF9jb25kaXRpb24oZGV2X3ByaXYsIHNlcXVlbmNlKSkKKwkJaWYgKHdhaXRfY29uZGl0aW9uKGRldl9wcml2LCBzZXFubykpCiAJCQlicmVhazsKIAkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kX2ppZmZpZXMpKSB7CiAJCQlEUk1fRVJST1IoIlNWR0EgZGV2aWNlIGxvY2t1cC5cbiIpOwpAQCAtMTc1LDY4ICsxODIsMTEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHZtd193YWl0X2ZlbmNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCSAgIGJvb2wgbGF6eSwgdWludDMyX3Qgc2VxdWVuY2UsCi0JCSAgIGJvb2wgaW50ZXJydXB0aWJsZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQordm9pZCB2bXdfc2Vxbm9fd2FpdGVyX2FkZChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQoreworCW11dGV4X2xvY2soJmRldl9wcml2LT5od19tdXRleCk7CisJaWYgKGRldl9wcml2LT5mZW5jZV9xdWV1ZV93YWl0ZXJzKysgPT0gMCkgeworCQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFfZmxhZ3MpOworCQlvdXRsKFNWR0FfSVJRRkxBR19BTllfRkVOQ0UsCisJCSAgICAgZGV2X3ByaXYtPmlvX3N0YXJ0ICsgVk1XR0ZYX0lSUVNUQVRVU19QT1JUKTsKKwkJZGV2X3ByaXYtPmlycV9tYXNrIHw9IFNWR0FfSVJRRkxBR19BTllfRkVOQ0U7CisJCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9SRUdfSVJRTUFTSywgZGV2X3ByaXYtPmlycV9tYXNrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFfZmxhZ3MpOworCX0KKwltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7Cit9CisKK3ZvaWQgdm13X3NlcW5vX3dhaXRlcl9yZW1vdmUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCWlmICgtLWRldl9wcml2LT5mZW5jZV9xdWV1ZV93YWl0ZXJzID09IDApIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKKwkJZGV2X3ByaXYtPmlycV9tYXNrICY9IH5TVkdBX0lSUUZMQUdfQU5ZX0ZFTkNFOworCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0ssIGRldl9wcml2LT5pcnFfbWFzayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworfQorCisKK3ZvaWQgdm13X2dvYWxfd2FpdGVyX2FkZChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQoreworCW11dGV4X2xvY2soJmRldl9wcml2LT5od19tdXRleCk7CisJaWYgKGRldl9wcml2LT5nb2FsX3F1ZXVlX3dhaXRlcnMrKyA9PSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7CisJCW91dGwoU1ZHQV9JUlFGTEFHX0ZFTkNFX0dPQUwsCisJCSAgICAgZGV2X3ByaXYtPmlvX3N0YXJ0ICsgVk1XR0ZYX0lSUVNUQVRVU19QT1JUKTsKKwkJZGV2X3ByaXYtPmlycV9tYXNrIHw9IFNWR0FfSVJRRkxBR19GRU5DRV9HT0FMOworCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0ssIGRldl9wcml2LT5pcnFfbWFzayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworfQorCit2b2lkIHZtd19nb2FsX3dhaXRlcl9yZW1vdmUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCWlmICgtLWRldl9wcml2LT5nb2FsX3F1ZXVlX3dhaXRlcnMgPT0gMCkgeworCQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFfZmxhZ3MpOworCQlkZXZfcHJpdi0+aXJxX21hc2sgJj0gflNWR0FfSVJRRkxBR19GRU5DRV9HT0FMOworCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0ssIGRldl9wcml2LT5pcnFfbWFzayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworfQorCitpbnQgdm13X3dhaXRfc2Vxbm8oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJICAgICAgYm9vbCBsYXp5LCB1aW50MzJfdCBzZXFubywKKwkJICAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7CiAJbG9uZyByZXQ7Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiAJc3RydWN0IHZtd19maWZvX3N0YXRlICpmaWZvID0gJmRldl9wcml2LT5maWZvOwogCi0JaWYgKGxpa2VseShkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcXVlbmNlIC0gc2VxdWVuY2UgPCBWTVdfRkVOQ0VfV1JBUCkpCisJaWYgKGxpa2VseShkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcW5vIC0gc2Vxbm8gPCBWTVdfRkVOQ0VfV1JBUCkpCiAJCXJldHVybiAwOwogCi0JaWYgKGxpa2VseSh2bXdfZmVuY2Vfc2lnbmFsZWQoZGV2X3ByaXYsIHNlcXVlbmNlKSkpCisJaWYgKGxpa2VseSh2bXdfc2Vxbm9fcGFzc2VkKGRldl9wcml2LCBzZXFubykpKQogCQlyZXR1cm4gMDsKIAogCXZtd19maWZvX3BpbmdfaG9zdChkZXZfcHJpdiwgU1ZHQV9TWU5DX0dFTkVSSUMpOwogCiAJaWYgKCEoZmlmby0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9GSUZPX0NBUF9GRU5DRSkpCi0JCXJldHVybiB2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgbGF6eSwgdHJ1ZSwgc2VxdWVuY2UsCisJCXJldHVybiB2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgbGF6eSwgdHJ1ZSwgc2Vxbm8sCiAJCQkJCSBpbnRlcnJ1cHRpYmxlLCB0aW1lb3V0KTsKIAogCWlmICghKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9JUlFNQVNLKSkKLQkJcmV0dXJuIHZtd19mYWxsYmFja193YWl0KGRldl9wcml2LCBsYXp5LCBmYWxzZSwgc2VxdWVuY2UsCisJCXJldHVybiB2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgbGF6eSwgZmFsc2UsIHNlcW5vLAogCQkJCQkgaW50ZXJydXB0aWJsZSwgdGltZW91dCk7CiAKLQltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwotCWlmIChhdG9taWNfYWRkX3JldHVybigxLCAmZGV2X3ByaXYtPmZlbmNlX3F1ZXVlX3dhaXRlcnMpID4gMCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFfZmxhZ3MpOwotCQlvdXRsKFNWR0FfSVJRRkxBR19BTllfRkVOQ0UsCi0JCSAgICAgZGV2X3ByaXYtPmlvX3N0YXJ0ICsgVk1XR0ZYX0lSUVNUQVRVU19QT1JUKTsKLQkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLLAotCQkJICB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfSVJRTUFTSykgfAotCQkJICBTVkdBX0lSUUZMQUdfQU5ZX0ZFTkNFKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFfZmxhZ3MpOwotCX0KLQltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7CisJdm13X3NlcW5vX3dhaXRlcl9hZGQoZGV2X3ByaXYpOwogCiAJaWYgKGludGVycnVwdGlibGUpCiAJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0CiAJCSAgICAoZGV2X3ByaXYtPmZlbmNlX3F1ZXVlLAotCQkgICAgIHZtd19mZW5jZV9zaWduYWxlZChkZXZfcHJpdiwgc2VxdWVuY2UpLAorCQkgICAgIHZtd19zZXFub19wYXNzZWQoZGV2X3ByaXYsIHNlcW5vKSwKIAkJICAgICB0aW1lb3V0KTsKIAllbHNlCiAJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dAogCQkgICAgKGRldl9wcml2LT5mZW5jZV9xdWV1ZSwKLQkJICAgICB2bXdfZmVuY2Vfc2lnbmFsZWQoZGV2X3ByaXYsIHNlcXVlbmNlKSwKKwkJICAgICB2bXdfc2Vxbm9fcGFzc2VkKGRldl9wcml2LCBzZXFubyksCiAJCSAgICAgdGltZW91dCk7CiAKKwl2bXdfc2Vxbm9fd2FpdGVyX3JlbW92ZShkZXZfcHJpdik7CisKIAlpZiAodW5saWtlbHkocmV0ID09IDApKQogCQlyZXQgPSAtRUJVU1k7CiAJZWxzZSBpZiAobGlrZWx5KHJldCA+IDApKQogCQlyZXQgPSAwOwogCi0JbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2X3ByaXYtPmZlbmNlX3F1ZXVlX3dhaXRlcnMpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7Ci0JCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9SRUdfSVJRTUFTSywKLQkJCSAgdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0spICYKLQkJCSAgflNWR0FfSVJRRkxBR19BTllfRkVOQ0UpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7Ci0JfQotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI3MywyNSArMzIyLDMgQEAKIAlzdGF0dXMgPSBpbmwoZGV2X3ByaXYtPmlvX3N0YXJ0ICsgVk1XR0ZYX0lSUVNUQVRVU19QT1JUKTsKIAlvdXRsKHN0YXR1cywgZGV2X3ByaXYtPmlvX3N0YXJ0ICsgVk1XR0ZYX0lSUVNUQVRVU19QT1JUKTsKIH0KLQotI2RlZmluZSBWTVdfRkVOQ0VfV0FJVF9USU1FT1VUIDMqSFo7Ci0KLWludCB2bXdfZmVuY2Vfd2FpdF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQotewotCXN0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnICphcmcgPQotCSAgICAoc3RydWN0IGRybV92bXdfZmVuY2Vfd2FpdF9hcmcgKilkYXRhOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCWlmICghYXJnLT5jb29raWVfdmFsaWQpIHsKLQkJYXJnLT5jb29raWVfdmFsaWQgPSAxOwotCQlhcmctPmtlcm5lbF9jb29raWUgPSBqaWZmaWVzICsgVk1XX0ZFTkNFX1dBSVRfVElNRU9VVDsKLQl9Ci0KLQl0aW1lb3V0ID0gamlmZmllczsKLQlpZiAodGltZV9hZnRlcl9lcSh0aW1lb3V0LCAodW5zaWduZWQgbG9uZylhcmctPmtlcm5lbF9jb29raWUpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JdGltZW91dCA9ICh1bnNpZ25lZCBsb25nKWFyZy0+a2VybmVsX2Nvb2tpZSAtIHRpbWVvdXQ7Ci0JcmV0dXJuIHZtd193YWl0X2ZlbmNlKHZtd19wcml2KGRldiksIHRydWUsIGFyZy0+c2VxdWVuY2UsIHRydWUsIHRpbWVvdXQpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuYwppbmRleCBkZmUzMmU2Li44ODBlMjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuYwpAQCAtMjcsMTIgKzI3LDEwIEBACiAKICNpbmNsdWRlICJ2bXdnZnhfa21zLmgiCiAKKwogLyogTWlnaHQgbmVlZCBhIGhydGltZXIgaGVyZT8gKi8KICNkZWZpbmUgVk1XR0ZYX1BSRVNFTlRfUkFURSAoKEhaIC8gNjAgPiAwKSA/IEhaIC8gNjAgOiAxKQogCi1zdGF0aWMgaW50IHZtd19zdXJmYWNlX2RtYWJ1Zl9waW4oc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiKTsKLXN0YXRpYyBpbnQgdm13X3N1cmZhY2VfZG1hYnVmX3VucGluKHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYik7Ci0KIHZvaWQgdm13X2Rpc3BsYXlfdW5pdF9jbGVhbnVwKHN0cnVjdCB2bXdfZGlzcGxheV91bml0ICpkdSkKIHsKIAlpZiAoZHUtPmN1cnNvcl9zdXJmYWNlKQpAQCAtMTA3LDEyICsxMDUsMTcgQEAKIAlzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmRtYWJ1ZiA9IE5VTEw7CiAJaW50IHJldDsKIAorCS8qIEEgbG90IG9mIHRoZSBjb2RlIGFzc3VtZXMgdGhpcyAqLworCWlmIChoYW5kbGUgJiYgKHdpZHRoICE9IDY0IHx8IGhlaWdodCAhPSA2NCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGhhbmRsZSkgewogCQlyZXQgPSB2bXdfdXNlcl9zdXJmYWNlX2xvb2t1cF9oYW5kbGUoZGV2X3ByaXYsIHRmaWxlLAogCQkJCQkJICAgICBoYW5kbGUsICZzdXJmYWNlKTsKIAkJaWYgKCFyZXQpIHsKIAkJCWlmICghc3VyZmFjZS0+c25vb3Blci5pbWFnZSkgewogCQkJCURSTV9FUlJPUigic3VyZmFjZSBub3Qgc3VpdGFibGUgZm9yIGN1cnNvclxuIik7CisJCQkJdm13X3N1cmZhY2VfdW5yZWZlcmVuY2UoJnN1cmZhY2UpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMTc4LDcgKzE4MSw5IEBACiAJCXJldHVybiAwOwogCX0KIAotCXZtd19jdXJzb3JfdXBkYXRlX3Bvc2l0aW9uKGRldl9wcml2LCB0cnVlLCBkdS0+Y3Vyc29yX3gsIGR1LT5jdXJzb3JfeSk7CisJdm13X2N1cnNvcl91cGRhdGVfcG9zaXRpb24oZGV2X3ByaXYsIHRydWUsCisJCQkJICAgZHUtPmN1cnNvcl94ICsgZHUtPmhvdHNwb3RfeCwKKwkJCQkgICBkdS0+Y3Vyc29yX3kgKyBkdS0+aG90c3BvdF95KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkzLDcgKzE5OCw4IEBACiAJZHUtPmN1cnNvcl95ID0geSArIGNydGMtPnk7CiAKIAl2bXdfY3Vyc29yX3VwZGF0ZV9wb3NpdGlvbihkZXZfcHJpdiwgc2hvd24sCi0JCQkJICAgZHUtPmN1cnNvcl94LCBkdS0+Y3Vyc29yX3kpOworCQkJCSAgIGR1LT5jdXJzb3JfeCArIGR1LT5ob3RzcG90X3gsCisJCQkJICAgZHUtPmN1cnNvcl95ICsgZHUtPmhvdHNwb3RfeSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxNCw3ICsyMjAsNyBAQAogCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOwogCQlTVkdBM2RDbWRTdXJmYWNlRE1BIGRtYTsKIAl9ICpjbWQ7Ci0JaW50IHJldDsKKwlpbnQgaSwgcmV0OwogCiAJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19kbWFfY21kLCBoZWFkZXIpOwogCkBAIC0yMzYsMTYgKzI0MiwxOSBAQAogCWJveF9jb3VudCA9IChjbWQtPmhlYWRlci5zaXplIC0gc2l6ZW9mKFNWR0EzZENtZFN1cmZhY2VETUEpKSAvCiAJCQlzaXplb2YoU1ZHQTNkQ29weUJveCk7CiAKLQlpZiAoY21kLT5kbWEuZ3Vlc3QucGl0Y2ggIT0gKDY0ICogNCkgfHwKLQkgICAgY21kLT5kbWEuZ3Vlc3QucHRyLm9mZnNldCAlIFBBR0VfU0laRSB8fAorCWlmIChjbWQtPmRtYS5ndWVzdC5wdHIub2Zmc2V0ICUgUEFHRV9TSVpFIHx8CiAJICAgIGJveC0+eCAhPSAwICAgIHx8IGJveC0+eSAhPSAwICAgIHx8IGJveC0+eiAhPSAwICAgIHx8CiAJICAgIGJveC0+c3JjeCAhPSAwIHx8IGJveC0+c3JjeSAhPSAwIHx8IGJveC0+c3JjeiAhPSAwIHx8Ci0JICAgIGJveC0+dyAhPSA2NCAgIHx8IGJveC0+aCAhPSA2NCAgIHx8IGJveC0+ZCAhPSAxICAgIHx8Ci0JICAgIGJveF9jb3VudCAhPSAxKSB7CisJICAgIGJveC0+ZCAhPSAxICAgIHx8IGJveF9jb3VudCAhPSAxKSB7CiAJCS8qIFRPRE8gaGFuZGxlIG5vbmUgcGFnZSBhbGlnbmVkIG9mZnNldHMgKi8KLQkJLyogVE9ETyBoYW5kbGUgcGFydGlhbCB1cGxvYWRzIGFuZCBwaXRjaCAhPSAyNTYgKi8KLQkJLyogVE9ETyBoYW5kbGUgbW9yZSB0aGVuIG9uZSBjb3B5IChzaXplICE9IDY0KSAqLwotCQlEUk1fRVJST1IoImxhenkgcHJvZ3JhbW1lciwgY2FuJ3QgaGFuZGxlIHdlaXJkIHN0dWZmXG4iKTsKKwkJLyogVE9ETyBoYW5kbGUgbW9yZSBkc3QgJiBzcmMgIT0gMCAqLworCQkvKiBUT0RPIGhhbmRsZSBtb3JlIHRoZW4gb25lIGNvcHkgKi8KKwkJRFJNX0VSUk9SKCJDYW50IHNub29wIGRtYSByZXF1ZXN0IGZvciBjdXJzb3IhXG4iKTsKKwkJRFJNX0VSUk9SKCIoJXUsICV1LCAldSkgKCV1LCAldSwgJXUpICgldXgldXgldSkgJXUgJXVcbiIsCisJCQkgIGJveC0+c3JjeCwgYm94LT5zcmN5LCBib3gtPnNyY3osCisJCQkgIGJveC0+eCwgYm94LT55LCBib3gtPnosCisJCQkgIGJveC0+dywgYm94LT5oLCBib3gtPmQsIGJveF9jb3VudCwKKwkJCSAgY21kLT5kbWEuZ3Vlc3QucHRyLm9mZnNldCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI2NCw3ICsyNzMsMTYgQEAKIAogCXZpcnR1YWwgPSB0dG1fa21hcF9vYmpfdmlydHVhbCgmbWFwLCAmZHVtbXkpOwogCi0JbWVtY3B5KHNyZi0+c25vb3Blci5pbWFnZSwgdmlydHVhbCwgNjQqNjQqNCk7CisJaWYgKGJveC0+dyA9PSA2NCAmJiBjbWQtPmRtYS5ndWVzdC5waXRjaCA9PSA2NCo0KSB7CisJCW1lbWNweShzcmYtPnNub29wZXIuaW1hZ2UsIHZpcnR1YWwsIDY0KjY0KjQpOworCX0gZWxzZSB7CisJCS8qIEltYWdlIGlzIHVuc2lnbmVkIHBvaW50ZXIuICovCisJCWZvciAoaSA9IDA7IGkgPCBib3gtPmg7IGkrKykKKwkJCW1lbWNweShzcmYtPnNub29wZXIuaW1hZ2UgKyBpICogNjQsCisJCQkgICAgICAgdmlydHVhbCArIGkgKiBjbWQtPmRtYS5ndWVzdC5waXRjaCwKKwkJCSAgICAgICBib3gtPncgKiA0KTsKKwl9CisKIAlzcmYtPnNub29wZXIuYWdlKys7CiAKIAkvKiB3ZSBjYW4ndCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGlzIGZ1bmN0aW9uIHNpbmNlIGV4ZWNidWYgaGFzCkBAIC0zMjksNDEgKzM0NywxMCBAQAogCXN0cnVjdCB2bXdfZnJhbWVidWZmZXIgYmFzZTsKIAlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnN1cmZhY2U7CiAJc3RydWN0IHZtd19kbWFfYnVmZmVyICpidWZmZXI7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkX3dvcms7Ci0Jc3RydWN0IG11dGV4IHdvcmtfbG9jazsKLQlib29sIHByZXNlbnRfZnM7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwogCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXI7CiB9OwogCi0vKioKLSAqIHZtd19rbXNfaWRsZV93b3JrcXVldWVzIC0gRmx1c2ggd29ya3F1ZXVlcyBvbiB0aGlzIG1hc3RlcgotICoKLSAqIEB2bWFzdGVyIC0gUG9pbnRlciBpZGVudGlmeWluZyB0aGUgbWFzdGVyLCBmb3IgdGhlIHN1cmZhY2VzIG9mIHdoaWNoCi0gKiB3ZSBpZGxlIHRoZSBkaXJ0eSB3b3JrIHF1ZXVlcy4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgdHRtIGxvY2sgaGVsZCBpbiBleGNsdXNpdmUgbW9kZQotICogdG8gaWRsZSBhbGwgZGlydHkgd29yayBxdWV1ZXMgYmVmb3JlIHRoZSBmaWZvIGlzIHRha2VuIGRvd24uCi0gKgotICogVGhlIHdvcmsgdGFzayBtYXkgYWN0dWFsbHkgcmVxdWV1ZSBpdHNlbGYsIGJ1dCBhZnRlciB0aGUgZmx1c2ggcmV0dXJucyB3ZSdyZQotICogc3VyZSB0aGF0IHRoZXJlJ3Mgbm90aGluZyB0byBwcmVzZW50LCBzaW5jZSB0aGUgdHRtIGxvY2sgaXMgaGVsZCBpbgotICogZXhjbHVzaXZlIG1vZGUsIHNvIHRoZSBmaWZvIHdpbGwgbmV2ZXIgZ2V0IHVzZWQuCi0gKi8KLQotdm9pZCB2bXdfa21zX2lkbGVfd29ya3F1ZXVlcyhzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3RlcikKLXsKLQlzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyX3N1cmZhY2UgKmVudHJ5OwotCi0JbXV0ZXhfbG9jaygmdm1hc3Rlci0+ZmJfc3VyZl9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnZtYXN0ZXItPmZiX3N1cmYsIGhlYWQpIHsKLQkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZW50cnktPmRfd29yaykpCi0JCQkodm9pZCkgZW50cnktPmRfd29yay53b3JrLmZ1bmMoJmVudHJ5LT5kX3dvcmsud29yayk7Ci0KLQkJKHZvaWQpIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZW50cnktPmRfd29yayk7Ci0JfQotCW11dGV4X3VubG9jaygmdm1hc3Rlci0+ZmJfc3VyZl9tdXRleCk7Ci19Ci0KIHZvaWQgdm13X2ZyYW1lYnVmZmVyX3N1cmZhY2VfZGVzdHJveShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlcikKIHsKIAlzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyX3N1cmZhY2UgKnZmYnMgPQpAQCAtMzc1LDY1ICszNjIsMTI5IEBACiAJbGlzdF9kZWwoJnZmYnMtPmhlYWQpOwogCW11dGV4X3VubG9jaygmdm1hc3Rlci0+ZmJfc3VyZl9tdXRleCk7CiAKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnZmYnMtPmRfd29yayk7CiAJZHJtX21hc3Rlcl9wdXQoJnZmYnMtPm1hc3Rlcik7CiAJZHJtX2ZyYW1lYnVmZmVyX2NsZWFudXAoZnJhbWVidWZmZXIpOwogCXZtd19zdXJmYWNlX3VucmVmZXJlbmNlKCZ2ZmJzLT5zdXJmYWNlKTsKKwl0dG1fYmFzZV9vYmplY3RfdW5yZWYoJnZmYnMtPmJhc2UudXNlcl9vYmopOwogCiAJa2ZyZWUodmZicyk7CiB9CiAKLXN0YXRpYyB2b2lkIHZtd19mcmFtZWJ1ZmZlcl9wcmVzZW50X2ZzX2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyBpbnQgZG9fc3VyZmFjZV9kaXJ0eV9zb3Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQlzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciwKKwkJCQl1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgY29sb3IsCisJCQkJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXBzLAorCQkJCXVuc2lnbmVkIG51bV9jbGlwcywgaW50IGluYykKIHsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkX3dvcmsgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7Ci0Jc3RydWN0IHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlICp2ZmJzID0KLQkJY29udGFpbmVyX29mKGRfd29yaywgc3RydWN0IHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlLCBkX3dvcmspOwotCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3VyZiA9IHZmYnMtPnN1cmZhY2U7Ci0Jc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIgPSAmdmZicy0+YmFzZS5iYXNlOwotCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihmcmFtZWJ1ZmZlci0+ZGV2KTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHNfcHRyOworCXN0cnVjdCB2bXdfZGlzcGxheV91bml0ICp1bml0c1tWTVdHRlhfTlVNX0RJU1BMQVlfVU5JVFNdOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlzaXplX3QgZmlmb19zaXplOworCWludCBpLCBudW1fdW5pdHM7CisJaW50IHJldCA9IDA7IC8qIHNpbGVuY2Ugd2FybmluZyAqLworCWludCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b207CiAKIAlzdHJ1Y3QgewogCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOwotCQlTVkdBM2RDbWRQcmVzZW50IGJvZHk7Ci0JCVNWR0EzZENvcHlSZWN0IGNyOworCQlTVkdBM2RDbWRCbGl0U3VyZmFjZVRvU2NyZWVuIGJvZHk7CiAJfSAqY21kOworCVNWR0FTaWduZWRSZWN0ICpibGl0czsKIAotCS8qKgotCSAqIFN0cmljdGx5IHdlIHNob3VsZCB0YWtlIHRoZSB0dG1fbG9jayBpbiByZWFkIG1vZGUgYmVmb3JlIGFjY2Vzc2luZwotCSAqIHRoZSBmaWZvLCB0byBtYWtlIHN1cmUgdGhlIGZpZm8gaXMgcHJlc2VudCBhbmQgdXAuIEhvd2V2ZXIsCi0JICogaW5zdGVhZCB3ZSBmbHVzaCBhbGwgd29ya3F1ZXVlcyB1bmRlciB0aGUgdHRtIGxvY2sgaW4gZXhjbHVzaXZlIG1vZGUKLQkgKiBiZWZvcmUgdGFraW5nIGRvd24gdGhlIGZpZm8uCi0JICovCi0JbXV0ZXhfbG9jaygmdmZicy0+d29ya19sb2NrKTsKLQlpZiAoIXZmYnMtPnByZXNlbnRfZnMpCi0JCWdvdG8gb3V0X3VubG9jazsKIAotCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7Ci0JaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkKLQkJZ290byBvdXRfcmVzY2hlZDsKKwludW1fdW5pdHMgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldl9wcml2LT5kZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwKKwkJCSAgICBoZWFkKSB7CisJCWlmIChjcnRjLT5mYiAhPSAmZnJhbWVidWZmZXItPmJhc2UpCisJCQljb250aW51ZTsKKwkJdW5pdHNbbnVtX3VuaXRzKytdID0gdm13X2NydGNfdG9fZHUoY3J0Yyk7CisJfQogCi0JY21kLT5oZWFkZXIuaWQgPSBjcHVfdG9fbGUzMihTVkdBXzNEX0NNRF9QUkVTRU5UKTsKLQljbWQtPmhlYWRlci5zaXplID0gY3B1X3RvX2xlMzIoc2l6ZW9mKGNtZC0+Ym9keSkgKyBzaXplb2YoY21kLT5jcikpOwotCWNtZC0+Ym9keS5zaWQgPSBjcHVfdG9fbGUzMihzdXJmLT5yZXMuaWQpOwotCWNtZC0+Y3IueCA9IGNwdV90b19sZTMyKDApOwotCWNtZC0+Y3IueSA9IGNwdV90b19sZTMyKDApOwotCWNtZC0+Y3Iuc3JjeCA9IGNtZC0+Y3IueDsKLQljbWQtPmNyLnNyY3kgPSBjbWQtPmNyLnk7Ci0JY21kLT5jci53ID0gY3B1X3RvX2xlMzIoZnJhbWVidWZmZXItPndpZHRoKTsKLQljbWQtPmNyLmggPSBjcHVfdG9fbGUzMihmcmFtZWJ1ZmZlci0+aGVpZ2h0KTsKLQl2ZmJzLT5wcmVzZW50X2ZzID0gZmFsc2U7Ci0Jdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzaXplb2YoKmNtZCkpOwotb3V0X3Jlc2NoZWQ6Ci0JLyoqCi0JICogV2lsbCBub3QgcmUtYWRkIGlmIGFscmVhZHkgcGVuZGluZy4KLQkgKi8KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnZmYnMtPmRfd29yaywgVk1XR0ZYX1BSRVNFTlRfUkFURSk7Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmdmZicy0+d29ya19sb2NrKTsKKwlCVUdfT04oIWNsaXBzIHx8ICFudW1fY2xpcHMpOworCisJZmlmb19zaXplID0gc2l6ZW9mKCpjbWQpICsgc2l6ZW9mKFNWR0FTaWduZWRSZWN0KSAqIG51bV9jbGlwczsKKwljbWQgPSBremFsbG9jKGZpZm9fc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIlRlbXBvcmFyeSBmaWZvIG1lbW9yeSBhbGxvYyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbGVmdCA9IGNsaXBzLT54MTsKKwlyaWdodCA9IGNsaXBzLT54MjsKKwl0b3AgPSBjbGlwcy0+eTE7CisJYm90dG9tID0gY2xpcHMtPnkyOworCisJLyogc2tpcCB0aGUgZmlyc3QgY2xpcCByZWN0ICovCisJZm9yIChpID0gMSwgY2xpcHNfcHRyID0gY2xpcHMgKyBpbmM7CisJICAgICBpIDwgbnVtX2NsaXBzOyBpKyssIGNsaXBzX3B0ciArPSBpbmMpIHsKKwkJbGVmdCA9IG1pbl90KGludCwgbGVmdCwgKGludCljbGlwc19wdHItPngxKTsKKwkJcmlnaHQgPSBtYXhfdChpbnQsIHJpZ2h0LCAoaW50KWNsaXBzX3B0ci0+eDIpOworCQl0b3AgPSBtaW5fdChpbnQsIHRvcCwgKGludCljbGlwc19wdHItPnkxKTsKKwkJYm90dG9tID0gbWF4X3QoaW50LCBib3R0b20sIChpbnQpY2xpcHNfcHRyLT55Mik7CisJfQorCisJLyogb25seSBuZWVkIHRvIGRvIHRoaXMgb25jZSAqLworCW1lbXNldChjbWQsIDAsIGZpZm9fc2l6ZSk7CisJY21kLT5oZWFkZXIuaWQgPSBjcHVfdG9fbGUzMihTVkdBXzNEX0NNRF9CTElUX1NVUkZBQ0VfVE9fU0NSRUVOKTsKKwljbWQtPmhlYWRlci5zaXplID0gY3B1X3RvX2xlMzIoZmlmb19zaXplIC0gc2l6ZW9mKGNtZC0+aGVhZGVyKSk7CisKKwljbWQtPmJvZHkuc3JjUmVjdC5sZWZ0ID0gbGVmdDsKKwljbWQtPmJvZHkuc3JjUmVjdC5yaWdodCA9IHJpZ2h0OworCWNtZC0+Ym9keS5zcmNSZWN0LnRvcCA9IHRvcDsKKwljbWQtPmJvZHkuc3JjUmVjdC5ib3R0b20gPSBib3R0b207CisKKwljbGlwc19wdHIgPSBjbGlwczsKKwlibGl0cyA9IChTVkdBU2lnbmVkUmVjdCAqKSZjbWRbMV07CisJZm9yIChpID0gMDsgaSA8IG51bV9jbGlwczsgaSsrLCBjbGlwc19wdHIgKz0gaW5jKSB7CisJCWJsaXRzW2ldLmxlZnQgICA9IGNsaXBzX3B0ci0+eDEgLSBsZWZ0OworCQlibGl0c1tpXS5yaWdodCAgPSBjbGlwc19wdHItPngyIC0gbGVmdDsKKwkJYmxpdHNbaV0udG9wICAgID0gY2xpcHNfcHRyLT55MSAtIHRvcDsKKwkJYmxpdHNbaV0uYm90dG9tID0gY2xpcHNfcHRyLT55MiAtIHRvcDsKKwl9CisKKwkvKiBkbyBwZXIgdW5pdCB3cml0aW5nLCByZXVzZSBmaWZvIGZvciBlYWNoICovCisJZm9yIChpID0gMDsgaSA8IG51bV91bml0czsgaSsrKSB7CisJCXN0cnVjdCB2bXdfZGlzcGxheV91bml0ICp1bml0ID0gdW5pdHNbaV07CisJCWludCBjbGlwX3gxID0gbGVmdCAtIHVuaXQtPmNydGMueDsKKwkJaW50IGNsaXBfeTEgPSB0b3AgLSB1bml0LT5jcnRjLnk7CisJCWludCBjbGlwX3gyID0gcmlnaHQgLSB1bml0LT5jcnRjLng7CisJCWludCBjbGlwX3kyID0gYm90dG9tIC0gdW5pdC0+Y3J0Yy55OworCisJCS8qIHNraXAgYW55IGNydGNzIHRoYXQgbWlzc2VzIHRoZSBjbGlwIHJlZ2lvbiAqLworCQlpZiAoY2xpcF94MSA+PSB1bml0LT5jcnRjLm1vZGUuaGRpc3BsYXkgfHwKKwkJICAgIGNsaXBfeTEgPj0gdW5pdC0+Y3J0Yy5tb2RlLnZkaXNwbGF5IHx8CisJCSAgICBjbGlwX3gyIDw9IDAgfHwgY2xpcF95MiA8PSAwKQorCQkJY29udGludWU7CisKKwkJLyogbmVlZCB0byByZXNldCBzaWQgYXMgaXQgaXMgY2hhbmdlZCBieSBleGVjYnVmICovCisJCWNtZC0+Ym9keS5zcmNJbWFnZS5zaWQgPSBjcHVfdG9fbGUzMihmcmFtZWJ1ZmZlci0+dXNlcl9oYW5kbGUpOworCisJCWNtZC0+Ym9keS5kZXN0U2NyZWVuSWQgPSB1bml0LT51bml0OworCisJCS8qCisJCSAqIFRoZSBibGl0IGNvbW1hbmQgaXMgYSBsb3QgbW9yZSByZXNpbGllbnQgdGhlbiB0aGUKKwkJICogcmVhZGJhY2sgY29tbWFuZCB3aGVuIGl0IGNvbWVzIHRvIGNsaXAgcmVjdHMuIFNvIGl0cworCQkgKiBva2F5IHRvIGdvIG91dCBvZiBib3VuZHMuCisJCSAqLworCisJCWNtZC0+Ym9keS5kZXN0UmVjdC5sZWZ0ID0gY2xpcF94MTsKKwkJY21kLT5ib2R5LmRlc3RSZWN0LnJpZ2h0ID0gY2xpcF94MjsKKwkJY21kLT5ib2R5LmRlc3RSZWN0LnRvcCA9IGNsaXBfeTE7CisJCWNtZC0+Ym9keS5kZXN0UmVjdC5ib3R0b20gPSBjbGlwX3kyOworCisKKwkJcmV0ID0gdm13X2V4ZWNidWZfcHJvY2VzcyhmaWxlX3ByaXYsIGRldl9wcml2LCBOVUxMLCBjbWQsCisJCQkJCSAgZmlmb19zaXplLCAwLCBOVUxMKTsKKworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJYnJlYWs7CisJfQorCisJa2ZyZWUoY21kKTsKKworCXJldHVybiByZXQ7CiB9CiAKLQogaW50IHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlX2RpcnR5KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyLAogCQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCiAJCQkJICB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgY29sb3IsCkBAIC00NDQsNDQgKzQ5NSwyMCBAQAogCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gdm13X21hc3RlcihmaWxlX3ByaXYtPm1hc3Rlcik7CiAJc3RydWN0IHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlICp2ZmJzID0KIAkJdm13X2ZyYW1lYnVmZmVyX3RvX3ZmYnMoZnJhbWVidWZmZXIpOwotCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3VyZiA9IHZmYnMtPnN1cmZhY2U7CiAJc3RydWN0IGRybV9jbGlwX3JlY3Qgbm9yZWN0OwotCVNWR0EzZENvcHlSZWN0ICpjcjsKLQlpbnQgaSwgaW5jID0gMTsKLQlpbnQgcmV0OwotCi0Jc3RydWN0IHsKLQkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKLQkJU1ZHQTNkQ21kUHJlc2VudCBib2R5OwotCQlTVkdBM2RDb3B5UmVjdCBjcjsKLQl9ICpjbWQ7CisJaW50IHJldCwgaW5jID0gMTsKIAogCWlmICh1bmxpa2VseSh2ZmJzLT5tYXN0ZXIgIT0gZmlsZV9wcml2LT5tYXN0ZXIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIFJlcXVpcmUgU2NyZWVuT2JqZWN0IHN1cHBvcnQgZm9yIDNEICovCisJaWYgKCFkZXZfcHJpdi0+c291X3ByaXYpCisJCXJldHVybiAtRUlOVkFMOworCiAJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmV0dXJuIHJldDsKIAotCWlmICghbnVtX2NsaXBzIHx8Ci0JICAgICEoZGV2X3ByaXYtPmZpZm8uY2FwYWJpbGl0aWVzICYKLQkgICAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QpKSB7Ci0JCWludCByZXQ7Ci0KLQkJbXV0ZXhfbG9jaygmdmZicy0+d29ya19sb2NrKTsKLQkJdmZicy0+cHJlc2VudF9mcyA9IHRydWU7Ci0JCXJldCA9IHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdmZicy0+ZF93b3JrLCBWTVdHRlhfUFJFU0VOVF9SQVRFKTsKLQkJbXV0ZXhfdW5sb2NrKCZ2ZmJzLT53b3JrX2xvY2spOwotCQlpZiAocmV0KSB7Ci0JCQkvKioKLQkJCSAqIE5vIHdvcmsgcGVuZGluZywgRm9yY2UgaW1tZWRpYXRlIHByZXNlbnQuCi0JCQkgKi8KLQkJCXZtd19mcmFtZWJ1ZmZlcl9wcmVzZW50X2ZzX2NhbGxiYWNrKCZ2ZmJzLT5kX3dvcmsud29yayk7Ci0JCX0KLQkJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJaWYgKCFudW1fY2xpcHMpIHsKIAkJbnVtX2NsaXBzID0gMTsKIAkJY2xpcHMgPSAmbm9yZWN0OwpAQCAtNDkzLDI5ICs1MjAsMTAgQEAKIAkJaW5jID0gMjsgLyogc2tpcCBzb3VyY2UgcmVjdHMgKi8KIAl9CiAKLQljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkgKyAobnVtX2NsaXBzIC0gMSkgKiBzaXplb2YoY21kLT5jcikpOwotCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKLQkJRFJNX0VSUk9SKCJGaWZvIHJlc2VydmUgZmFpbGVkLlxuIik7Ci0JCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlyZXQgPSBkb19zdXJmYWNlX2RpcnR5X3NvdShkZXZfcHJpdiwgZmlsZV9wcml2LCAmdmZicy0+YmFzZSwKKwkJCQkgICBmbGFncywgY29sb3IsCisJCQkJICAgY2xpcHMsIG51bV9jbGlwcywgaW5jKTsKIAotCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7Ci0KLQljbWQtPmhlYWRlci5pZCA9IGNwdV90b19sZTMyKFNWR0FfM0RfQ01EX1BSRVNFTlQpOwotCWNtZC0+aGVhZGVyLnNpemUgPSBjcHVfdG9fbGUzMihzaXplb2YoY21kLT5ib2R5KSArIG51bV9jbGlwcyAqIHNpemVvZihjbWQtPmNyKSk7Ci0JY21kLT5ib2R5LnNpZCA9IGNwdV90b19sZTMyKHN1cmYtPnJlcy5pZCk7Ci0KLQlmb3IgKGkgPSAwLCBjciA9ICZjbWQtPmNyOyBpIDwgbnVtX2NsaXBzOyBpKyssIGNyKyssIGNsaXBzICs9IGluYykgewotCQljci0+eCA9IGNwdV90b19sZTE2KGNsaXBzLT54MSk7Ci0JCWNyLT55ID0gY3B1X3RvX2xlMTYoY2xpcHMtPnkxKTsKLQkJY3ItPnNyY3ggPSBjci0+eDsKLQkJY3ItPnNyY3kgPSBjci0+eTsKLQkJY3ItPncgPSBjcHVfdG9fbGUxNihjbGlwcy0+eDIgLSBjbGlwcy0+eDEpOwotCQljci0+aCA9IGNwdV90b19sZTE2KGNsaXBzLT55MiAtIGNsaXBzLT55MSk7Ci0JfQotCi0Jdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzaXplb2YoKmNtZCkgKyAobnVtX2NsaXBzIC0gMSkgKiBzaXplb2YoY21kLT5jcikpOwogCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CkBAIC01NDAsNiArNTQ4LDEwIEBACiAJc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIgPSB2bXdfbWFzdGVyKGZpbGVfcHJpdi0+bWFzdGVyKTsKIAlpbnQgcmV0OwogCisJLyogM0QgaXMgb25seSBzdXBwb3J0ZWQgb24gSFd2OCBob3N0cyB3aGljaCBzdXBwb3J0cyBzY3JlZW4gb2JqZWN0cyAqLworCWlmICghZGV2X3ByaXYtPnNvdV9wcml2KQorCQlyZXR1cm4gLUVOT1NZUzsKKwogCS8qCiAJICogU2FuaXR5IGNoZWNrcy4KIAkgKi8KQEAgLTU2Nyw2ICs1NzksOSBAQAogCWNhc2UgMTU6CiAJCWZvcm1hdCA9IFNWR0EzRF9BMVI1RzVCNTsKIAkJYnJlYWs7CisJY2FzZSA4OgorCQlmb3JtYXQgPSBTVkdBM0RfTFVNSU5BTkNFODsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0VSUk9SKCJJbnZhbGlkIGNvbG9yIGRlcHRoOiAlZFxuIiwgbW9kZV9jbWQtPmRlcHRoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01OTksMTQgKzYxNCwxMSBAQAogCXZmYnMtPmJhc2UuYmFzZS5kZXB0aCA9IG1vZGVfY21kLT5kZXB0aDsKIAl2ZmJzLT5iYXNlLmJhc2Uud2lkdGggPSBtb2RlX2NtZC0+d2lkdGg7CiAJdmZicy0+YmFzZS5iYXNlLmhlaWdodCA9IG1vZGVfY21kLT5oZWlnaHQ7Ci0JdmZicy0+YmFzZS5waW4gPSAmdm13X3N1cmZhY2VfZG1hYnVmX3BpbjsKLQl2ZmJzLT5iYXNlLnVucGluID0gJnZtd19zdXJmYWNlX2RtYWJ1Zl91bnBpbjsKIAl2ZmJzLT5zdXJmYWNlID0gc3VyZmFjZTsKKwl2ZmJzLT5iYXNlLnVzZXJfaGFuZGxlID0gbW9kZV9jbWQtPmhhbmRsZTsKIAl2ZmJzLT5tYXN0ZXIgPSBkcm1fbWFzdGVyX2dldChmaWxlX3ByaXYtPm1hc3Rlcik7Ci0JbXV0ZXhfaW5pdCgmdmZicy0+d29ya19sb2NrKTsKIAogCW11dGV4X2xvY2soJnZtYXN0ZXItPmZiX3N1cmZfbXV0ZXgpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZ2ZmJzLT5kX3dvcmssICZ2bXdfZnJhbWVidWZmZXJfcHJlc2VudF9mc19jYWxsYmFjayk7CiAJbGlzdF9hZGRfdGFpbCgmdmZicy0+aGVhZCwgJnZtYXN0ZXItPmZiX3N1cmYpOwogCW11dGV4X3VubG9jaygmdm1hc3Rlci0+ZmJfc3VyZl9tdXRleCk7CiAKQEAgLTY0MSwxMCArNjUzLDE3MCBAQAogCiAJZHJtX2ZyYW1lYnVmZmVyX2NsZWFudXAoZnJhbWVidWZmZXIpOwogCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJnZmYmQtPmJ1ZmZlcik7CisJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZ2ZmJkLT5iYXNlLnVzZXJfb2JqKTsKIAogCWtmcmVlKHZmYmQpOwogfQogCitzdGF0aWMgaW50IGRvX2RtYWJ1Zl9kaXJ0eV9sZHUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciwKKwkJCSAgICAgICB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgY29sb3IsCisJCQkgICAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXBzLAorCQkJICAgICAgIHVuc2lnbmVkIG51bV9jbGlwcywgaW50IGluY3JlbWVudCkKK3sKKwlzaXplX3QgZmlmb19zaXplOworCWludCBpOworCisJc3RydWN0IHsKKwkJdWludDMyX3QgaGVhZGVyOworCQlTVkdBRmlmb0NtZFVwZGF0ZSBib2R5OworCX0gKmNtZDsKKworCWZpZm9fc2l6ZSA9IHNpemVvZigqY21kKSAqIG51bV9jbGlwczsKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBmaWZvX3NpemUpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGaWZvIHJlc2VydmUgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChjbWQsIDAsIGZpZm9fc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9jbGlwczsgaSsrLCBjbGlwcyArPSBpbmNyZW1lbnQpIHsKKwkJY21kW2ldLmhlYWRlciA9IGNwdV90b19sZTMyKFNWR0FfQ01EX1VQREFURSk7CisJCWNtZFtpXS5ib2R5LnggPSBjcHVfdG9fbGUzMihjbGlwcy0+eDEpOworCQljbWRbaV0uYm9keS55ID0gY3B1X3RvX2xlMzIoY2xpcHMtPnkxKTsKKwkJY21kW2ldLmJvZHkud2lkdGggPSBjcHVfdG9fbGUzMihjbGlwcy0+eDIgLSBjbGlwcy0+eDEpOworCQljbWRbaV0uYm9keS5oZWlnaHQgPSBjcHVfdG9fbGUzMihjbGlwcy0+eTIgLSBjbGlwcy0+eTEpOworCX0KKworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgZmlmb19zaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19kbWFidWZfZGVmaW5lX2dtcmZiKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJCSAgc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgIHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyKQoreworCWludCBkZXB0aCA9IGZyYW1lYnVmZmVyLT5iYXNlLmRlcHRoOworCXNpemVfdCBmaWZvX3NpemU7CisJaW50IHJldDsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90IGhlYWRlcjsKKwkJU1ZHQUZpZm9DbWREZWZpbmVHTVJGQiBib2R5OworCX0gKmNtZDsKKworCS8qIEVtdWxhdGUgUkdCQSBzdXBwb3J0LCBjb250cmFyeSB0byBzdmdhX3JlZy5oIHRoaXMgaXMgbm90CisJICogc3VwcG9ydGVkIGJ5IGhvc3RzLiBUaGlzIGlzIG9ubHkgYSBwcm9ibGVtIGlmIHdlIGFyZSByZWFkaW5nCisJICogdGhpcyB2YWx1ZSBsYXRlciBhbmQgZXhwZWN0aW5nIHdoYXQgd2UgdXBsb2FkZWQgYmFjay4KKwkgKi8KKwlpZiAoZGVwdGggPT0gMzIpCisJCWRlcHRoID0gMjQ7CisKKwlmaWZvX3NpemUgPSBzaXplb2YoKmNtZCk7CisJY21kID0ga21hbGxvYyhmaWZvX3NpemUsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgdGVtcG9yYXJ5IGNtZCBidWZmZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGNtZCwgMCwgZmlmb19zaXplKTsKKwljbWQtPmhlYWRlciA9IFNWR0FfQ01EX0RFRklORV9HTVJGQjsKKwljbWQtPmJvZHkuZm9ybWF0LmJpdHNQZXJQaXhlbCA9IGZyYW1lYnVmZmVyLT5iYXNlLmJpdHNfcGVyX3BpeGVsOworCWNtZC0+Ym9keS5mb3JtYXQuY29sb3JEZXB0aCA9IGRlcHRoOworCWNtZC0+Ym9keS5mb3JtYXQucmVzZXJ2ZWQgPSAwOworCWNtZC0+Ym9keS5ieXRlc1BlckxpbmUgPSBmcmFtZWJ1ZmZlci0+YmFzZS5waXRjaDsKKwljbWQtPmJvZHkucHRyLmdtcklkID0gZnJhbWVidWZmZXItPnVzZXJfaGFuZGxlOworCWNtZC0+Ym9keS5wdHIub2Zmc2V0ID0gMDsKKworCXJldCA9IHZtd19leGVjYnVmX3Byb2Nlc3MoZmlsZV9wcml2LCBkZXZfcHJpdiwgTlVMTCwgY21kLAorCQkJCSAgZmlmb19zaXplLCAwLCBOVUxMKTsKKworCWtmcmVlKGNtZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRvX2RtYWJ1Zl9kaXJ0eV9zb3Uoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkgICAgICAgc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciwKKwkJCSAgICAgICB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgY29sb3IsCisJCQkgICAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXBzLAorCQkJICAgICAgIHVuc2lnbmVkIG51bV9jbGlwcywgaW50IGluY3JlbWVudCkKK3sKKwlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqdW5pdHNbVk1XR0ZYX05VTV9ESVNQTEFZX1VOSVRTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHNfcHRyOworCWludCBpLCBrLCBudW1fdW5pdHMsIHJldDsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJc2l6ZV90IGZpZm9fc2l6ZTsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90IGhlYWRlcjsKKwkJU1ZHQUZpZm9DbWRCbGl0R01SRkJUb1NjcmVlbiBib2R5OworCX0gKmJsaXRzOworCisJcmV0ID0gZG9fZG1hYnVmX2RlZmluZV9nbXJmYihmaWxlX3ByaXYsIGRldl9wcml2LCBmcmFtZWJ1ZmZlcik7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsgLyogZGVmaW5lX2dtcmZiIHByaW50cyB3YXJuaW5ncyAqLworCisJZmlmb19zaXplID0gc2l6ZW9mKCpibGl0cykgKiBudW1fY2xpcHM7CisJYmxpdHMgPSBrbWFsbG9jKGZpZm9fc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGJsaXRzID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBjbWQgYnVmZmVyLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW51bV91bml0cyA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2X3ByaXYtPmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCWlmIChjcnRjLT5mYiAhPSAmZnJhbWVidWZmZXItPmJhc2UpCisJCQljb250aW51ZTsKKwkJdW5pdHNbbnVtX3VuaXRzKytdID0gdm13X2NydGNfdG9fZHUoY3J0Yyk7CisJfQorCisJZm9yIChrID0gMDsgayA8IG51bV91bml0czsgaysrKSB7CisJCXN0cnVjdCB2bXdfZGlzcGxheV91bml0ICp1bml0ID0gdW5pdHNba107CisJCWludCBoaXRfbnVtID0gMDsKKworCQljbGlwc19wdHIgPSBjbGlwczsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9jbGlwczsgaSsrLCBjbGlwc19wdHIgKz0gaW5jcmVtZW50KSB7CisJCQlpbnQgY2xpcF94MSA9IGNsaXBzX3B0ci0+eDEgLSB1bml0LT5jcnRjLng7CisJCQlpbnQgY2xpcF95MSA9IGNsaXBzX3B0ci0+eTEgLSB1bml0LT5jcnRjLnk7CisJCQlpbnQgY2xpcF94MiA9IGNsaXBzX3B0ci0+eDIgLSB1bml0LT5jcnRjLng7CisJCQlpbnQgY2xpcF95MiA9IGNsaXBzX3B0ci0+eTIgLSB1bml0LT5jcnRjLnk7CisKKwkJCS8qIHNraXAgYW55IGNydGNzIHRoYXQgbWlzc2VzIHRoZSBjbGlwIHJlZ2lvbiAqLworCQkJaWYgKGNsaXBfeDEgPj0gdW5pdC0+Y3J0Yy5tb2RlLmhkaXNwbGF5IHx8CisJCQkgICAgY2xpcF95MSA+PSB1bml0LT5jcnRjLm1vZGUudmRpc3BsYXkgfHwKKwkJCSAgICBjbGlwX3gyIDw9IDAgfHwgY2xpcF95MiA8PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlibGl0c1toaXRfbnVtXS5oZWFkZXIgPSBTVkdBX0NNRF9CTElUX0dNUkZCX1RPX1NDUkVFTjsKKwkJCWJsaXRzW2hpdF9udW1dLmJvZHkuZGVzdFNjcmVlbklkID0gdW5pdC0+dW5pdDsKKwkJCWJsaXRzW2hpdF9udW1dLmJvZHkuc3JjT3JpZ2luLnggPSBjbGlwc19wdHItPngxOworCQkJYmxpdHNbaGl0X251bV0uYm9keS5zcmNPcmlnaW4ueSA9IGNsaXBzX3B0ci0+eTE7CisJCQlibGl0c1toaXRfbnVtXS5ib2R5LmRlc3RSZWN0LmxlZnQgPSBjbGlwX3gxOworCQkJYmxpdHNbaGl0X251bV0uYm9keS5kZXN0UmVjdC50b3AgPSBjbGlwX3kxOworCQkJYmxpdHNbaGl0X251bV0uYm9keS5kZXN0UmVjdC5yaWdodCA9IGNsaXBfeDI7CisJCQlibGl0c1toaXRfbnVtXS5ib2R5LmRlc3RSZWN0LmJvdHRvbSA9IGNsaXBfeTI7CisJCQloaXRfbnVtKys7CisJCX0KKworCQkvKiBubyBjbGlwcyBoaXQgdGhlIGNydGMgKi8KKwkJaWYgKGhpdF9udW0gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWZpZm9fc2l6ZSA9IHNpemVvZigqYmxpdHMpICogaGl0X251bTsKKwkJcmV0ID0gdm13X2V4ZWNidWZfcHJvY2VzcyhmaWxlX3ByaXYsIGRldl9wcml2LCBOVUxMLCBibGl0cywKKwkJCQkJICBmaWZvX3NpemUsIDAsIE5VTEwpOworCisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlicmVhazsKKwl9CisKKwlrZnJlZShibGl0cyk7CisKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgdm13X2ZyYW1lYnVmZmVyX2RtYWJ1Zl9kaXJ0eShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciwKIAkJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCiAJCQkJIHVuc2lnbmVkIGZsYWdzLCB1bnNpZ25lZCBjb2xvciwKQEAgLTY1MywxMyArODI1LDEwIEBACiB7CiAJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KGZyYW1lYnVmZmVyLT5kZXYpOwogCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gdm13X21hc3RlcihmaWxlX3ByaXYtPm1hc3Rlcik7CisJc3RydWN0IHZtd19mcmFtZWJ1ZmZlcl9kbWFidWYgKnZmYmQgPQorCQl2bXdfZnJhbWVidWZmZXJfdG9fdmZiZChmcmFtZWJ1ZmZlcik7CiAJc3RydWN0IGRybV9jbGlwX3JlY3Qgbm9yZWN0OwotCWludCByZXQ7Ci0Jc3RydWN0IHsKLQkJdWludDMyX3QgaGVhZGVyOwotCQlTVkdBRmlmb0NtZFVwZGF0ZSBib2R5OwotCX0gKmNtZDsKLQlpbnQgaSwgaW5jcmVtZW50ID0gMTsKKwlpbnQgcmV0LCBpbmNyZW1lbnQgPSAxOwogCiAJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTY3NiwyNSArODQ1LDE4IEBACiAJCWluY3JlbWVudCA9IDI7CiAJfQogCi0JY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpICogbnVtX2NsaXBzKTsKLQlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7Ci0JCURSTV9FUlJPUigiRmlmbyByZXNlcnZlIGZhaWxlZC5cbiIpOwotCQl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOwotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoZGV2X3ByaXYtPmxkdV9wcml2KSB7CisJCXJldCA9IGRvX2RtYWJ1Zl9kaXJ0eV9sZHUoZGV2X3ByaXYsICZ2ZmJkLT5iYXNlLAorCQkJCQkgIGZsYWdzLCBjb2xvciwKKwkJCQkJICBjbGlwcywgbnVtX2NsaXBzLCBpbmNyZW1lbnQpOworCX0gZWxzZSB7CisJCXJldCA9IGRvX2RtYWJ1Zl9kaXJ0eV9zb3UoZmlsZV9wcml2LCBkZXZfcHJpdiwgJnZmYmQtPmJhc2UsCisJCQkJCSAgZmxhZ3MsIGNvbG9yLAorCQkJCQkgIGNsaXBzLCBudW1fY2xpcHMsIGluY3JlbWVudCk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IG51bV9jbGlwczsgaSsrLCBjbGlwcyArPSBpbmNyZW1lbnQpIHsKLQkJY21kW2ldLmhlYWRlciA9IGNwdV90b19sZTMyKFNWR0FfQ01EX1VQREFURSk7Ci0JCWNtZFtpXS5ib2R5LnggPSBjcHVfdG9fbGUzMihjbGlwcy0+eDEpOwotCQljbWRbaV0uYm9keS55ID0gY3B1X3RvX2xlMzIoY2xpcHMtPnkxKTsKLQkJY21kW2ldLmJvZHkud2lkdGggPSBjcHVfdG9fbGUzMihjbGlwcy0+eDIgLSBjbGlwcy0+eDEpOwotCQljbWRbaV0uYm9keS5oZWlnaHQgPSBjcHVfdG9fbGUzMihjbGlwcy0+eTIgLSBjbGlwcy0+eTEpOwotCX0KLQotCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpICogbnVtX2NsaXBzKTsKIAl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCBkcm1fZnJhbWVidWZmZXJfZnVuY3Mgdm13X2ZyYW1lYnVmZmVyX2RtYWJ1Zl9mdW5jcyA9IHsKQEAgLTcwMyw0NSArODY1LDkgQEAKIAkuY3JlYXRlX2hhbmRsZSA9IHZtd19mcmFtZWJ1ZmZlcl9jcmVhdGVfaGFuZGxlLAogfTsKIAotc3RhdGljIGludCB2bXdfc3VyZmFjZV9kbWFidWZfcGluKHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYikKLXsKLQlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYodmZiLT5iYXNlLmRldik7Ci0Jc3RydWN0IHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlICp2ZmJzID0KLQkJdm13X2ZyYW1lYnVmZmVyX3RvX3ZmYnMoJnZmYi0+YmFzZSk7Ci0JdW5zaWduZWQgbG9uZyBzaXplID0gdmZicy0+YmFzZS5iYXNlLnBpdGNoICogdmZicy0+YmFzZS5iYXNlLmhlaWdodDsKLQlpbnQgcmV0OwotCi0JdmZicy0+YnVmZmVyID0ga3phbGxvYyhzaXplb2YoKnZmYnMtPmJ1ZmZlciksIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSh2ZmJzLT5idWZmZXIgPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jdm13X292ZXJsYXlfcGF1c2VfYWxsKGRldl9wcml2KTsKLQlyZXQgPSB2bXdfZG1hYnVmX2luaXQoZGV2X3ByaXYsIHZmYnMtPmJ1ZmZlciwgc2l6ZSwKLQkJCSAgICAgICAmdm13X3ZyYW1fbmVfcGxhY2VtZW50LAotCQkJICAgICAgIGZhbHNlLCAmdm13X2RtYWJ1Zl9ib19mcmVlKTsKLQl2bXdfb3ZlcmxheV9yZXN1bWVfYWxsKGRldl9wcml2KTsKLQlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQl2ZmJzLT5idWZmZXIgPSBOVUxMOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2bXdfc3VyZmFjZV9kbWFidWZfdW5waW4oc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiKQotewotCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm87Ci0Jc3RydWN0IHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlICp2ZmJzID0KLQkJdm13X2ZyYW1lYnVmZmVyX3RvX3ZmYnMoJnZmYi0+YmFzZSk7Ci0KLQlpZiAodW5saWtlbHkodmZicy0+YnVmZmVyID09IE5VTEwpKQotCQlyZXR1cm4gMDsKLQotCWJvID0gJnZmYnMtPmJ1ZmZlci0+YmFzZTsKLQl0dG1fYm9fdW5yZWYoJmJvKTsKLQl2ZmJzLT5idWZmZXIgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KKy8qKgorICogUGluIHRoZSBkbWFidWZmZXIgdG8gdGhlIHN0YXJ0IG9mIHZyYW0uCisgKi8KIHN0YXRpYyBpbnQgdm13X2ZyYW1lYnVmZmVyX2RtYWJ1Zl9waW4oc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiKQogewogCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdih2ZmItPmJhc2UuZGV2KTsKQEAgLTc0OSwxMCArODc1LDEyIEBACiAJCXZtd19mcmFtZWJ1ZmZlcl90b192ZmJkKCZ2ZmItPmJhc2UpOwogCWludCByZXQ7CiAKKwkvKiBUaGlzIGNvZGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggc2NyZWVuIG9iamVjdHMgKi8KKwlCVUdfT04oZGV2X3ByaXYtPnNvdV9wcml2KTsKIAogCXZtd19vdmVybGF5X3BhdXNlX2FsbChkZXZfcHJpdik7CiAKLQlyZXQgPSB2bXdfZG1hYnVmX3RvX3N0YXJ0X29mX3ZyYW0oZGV2X3ByaXYsIHZmYmQtPmJ1ZmZlcik7CisJcmV0ID0gdm13X2RtYWJ1Zl90b19zdGFydF9vZl92cmFtKGRldl9wcml2LCB2ZmJkLT5idWZmZXIsIHRydWUsIGZhbHNlKTsKIAogCXZtd19vdmVybGF5X3Jlc3VtZV9hbGwoZGV2X3ByaXYpOwogCkBAIC03NzIsNyArOTAwLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIHZtd19kbWFidWZfZnJvbV92cmFtKGRldl9wcml2LCB2ZmJkLT5idWZmZXIpOworCXJldHVybiB2bXdfZG1hYnVmX3VucGluKGRldl9wcml2LCB2ZmJkLT5idWZmZXIsIGZhbHNlKTsKIH0KIAogc3RhdGljIGludCB2bXdfa21zX25ld19mcmFtZWJ1ZmZlcl9kbWFidWYoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKQEAgLTc5NCw2ICs5MjIsMzMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogTGltaXRlZCBmcmFtZWJ1ZmZlciBjb2xvciBkZXB0aCBzdXBwb3J0IGZvciBzY3JlZW4gb2JqZWN0cyAqLworCWlmIChkZXZfcHJpdi0+c291X3ByaXYpIHsKKwkJc3dpdGNoIChtb2RlX2NtZC0+ZGVwdGgpIHsKKwkJY2FzZSAzMjoKKwkJY2FzZSAyNDoKKwkJCS8qIE9ubHkgc3VwcG9ydCAzMiBicHAgZm9yIDMyIGFuZCAyNCBkZXB0aCBmYnMgKi8KKwkJCWlmIChtb2RlX2NtZC0+YnBwID09IDMyKQorCQkJCWJyZWFrOworCisJCQlEUk1fRVJST1IoIkludmFsaWQgY29sb3IgZGVwdGgvYmJwOiAlZCAlZFxuIiwKKwkJCQkgIG1vZGVfY21kLT5kZXB0aCwgbW9kZV9jbWQtPmJwcCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSAxNjoKKwkJY2FzZSAxNToKKwkJCS8qIE9ubHkgc3VwcG9ydCAxNiBicHAgZm9yIDE2IGFuZCAxNSBkZXB0aCBmYnMgKi8KKwkJCWlmIChtb2RlX2NtZC0+YnBwID09IDE2KQorCQkJCWJyZWFrOworCisJCQlEUk1fRVJST1IoIkludmFsaWQgY29sb3IgZGVwdGgvYmJwOiAlZCAlZFxuIiwKKwkJCQkgIG1vZGVfY21kLT5kZXB0aCwgbW9kZV9jbWQtPmJwcCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiSW52YWxpZCBjb2xvciBkZXB0aDogJWRcbiIsIG1vZGVfY21kLT5kZXB0aCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwogCXZmYmQgPSBremFsbG9jKHNpemVvZigqdmZiZCksIEdGUF9LRVJORUwpOwogCWlmICghdmZiZCkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtODE1LDkgKzk3MCwxMyBAQAogCXZmYmQtPmJhc2UuYmFzZS5kZXB0aCA9IG1vZGVfY21kLT5kZXB0aDsKIAl2ZmJkLT5iYXNlLmJhc2Uud2lkdGggPSBtb2RlX2NtZC0+d2lkdGg7CiAJdmZiZC0+YmFzZS5iYXNlLmhlaWdodCA9IG1vZGVfY21kLT5oZWlnaHQ7Ci0JdmZiZC0+YmFzZS5waW4gPSB2bXdfZnJhbWVidWZmZXJfZG1hYnVmX3BpbjsKLQl2ZmJkLT5iYXNlLnVucGluID0gdm13X2ZyYW1lYnVmZmVyX2RtYWJ1Zl91bnBpbjsKKwlpZiAoIWRldl9wcml2LT5zb3VfcHJpdikgeworCQl2ZmJkLT5iYXNlLnBpbiA9IHZtd19mcmFtZWJ1ZmZlcl9kbWFidWZfcGluOworCQl2ZmJkLT5iYXNlLnVucGluID0gdm13X2ZyYW1lYnVmZmVyX2RtYWJ1Zl91bnBpbjsKKwl9CisJdmZiZC0+YmFzZS5kbWFidWYgPSB0cnVlOwogCXZmYmQtPmJ1ZmZlciA9IGRtYWJ1ZjsKKwl2ZmJkLT5iYXNlLnVzZXJfaGFuZGxlID0gbW9kZV9jbWQtPmhhbmRsZTsKIAkqb3V0ID0gJnZmYmQtPmJhc2U7CiAKIAlyZXR1cm4gMDsKQEAgLTg0Myw2ICsxMDAyLDcgQEAKIAlzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICp2ZmIgPSBOVUxMOwogCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3VyZmFjZSA9IE5VTEw7CiAJc3RydWN0IHZtd19kbWFfYnVmZmVyICpibyA9IE5VTEw7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqdXNlcl9vYmo7CiAJdTY0IHJlcXVpcmVkX3NpemU7CiAJaW50IHJldDsKIApAQCAtODU1LDcgKzEwMTUsMjIgQEAKIAlyZXF1aXJlZF9zaXplID0gbW9kZV9jbWQtPnBpdGNoICogbW9kZV9jbWQtPmhlaWdodDsKIAlpZiAodW5saWtlbHkocmVxdWlyZWRfc2l6ZSA+ICh1NjQpIGRldl9wcml2LT52cmFtX3NpemUpKSB7CiAJCURSTV9FUlJPUigiVlJBTSBzaXplIGlzIHRvbyBzbWFsbCBmb3IgcmVxdWVzdGVkIG1vZGUuXG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCS8qCisJICogVGFrZSBhIHJlZmVyZW5jZSBvbiB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIHJlc291cmNlCisJICogYmFja2luZyB0aGUga21zIGZiLiBUaGlzIGVuc3VyZXMgdGhhdCB1c2VyLXNwYWNlIGhhbmRsZQorCSAqIGxvb2t1cHMgb24gdGhhdCByZXNvdXJjZSB3aWxsIGFsd2F5cyB3b3JrIGFzIGxvbmcgYXMKKwkgKiBpdCdzIHJlZ2lzdGVyZWQgd2l0aCBhIGttcyBmcmFtZWJ1ZmZlci4gVGhpcyBpcyBpbXBvcnRhbnQsCisJICogc2luY2Ugdm13X2V4ZWNidWZfcHJvY2VzcyBpZGVudGlmaWVzIHJlc291cmNlcyBpbiB0aGUKKwkgKiBjb21tYW5kIHN0cmVhbSB1c2luZyB1c2VyLXNwYWNlIGhhbmRsZXMuCisJICovCisKKwl1c2VyX29iaiA9IHR0bV9iYXNlX29iamVjdF9sb29rdXAodGZpbGUsIG1vZGVfY21kLT5oYW5kbGUpOworCWlmICh1bmxpa2VseSh1c2VyX29iaiA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkNvdWxkIG5vdCBsb2NhdGUgcmVxdWVzdGVkIGttcyBmcmFtZSBidWZmZXIuXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiAJfQogCiAJLyoqCkBAIC04NzgsOCArMTA1MywxMCBAQAogCiAJaWYgKHJldCkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBjcmVhdGUgdm13X2ZyYW1lYnVmZmVyOiAlaVxuIiwgcmV0KTsKKwkJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZ1c2VyX29iaik7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQorCX0gZWxzZQorCQl2ZmItPnVzZXJfb2JqID0gdXNlcl9vYmo7CiAJcmV0dXJuICZ2ZmItPmJhc2U7CiAKIHRyeV9kbWFidWY6CkBAIC04OTksOCArMTA3NiwxMCBAQAogCiAJaWYgKHJldCkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBjcmVhdGUgdm13X2ZyYW1lYnVmZmVyOiAlaVxuIiwgcmV0KTsKKwkJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZ1c2VyX29iaik7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQorCX0gZWxzZQorCQl2ZmItPnVzZXJfb2JqID0gdXNlcl9vYmo7CiAKIAlyZXR1cm4gJnZmYi0+YmFzZTsKIApAQCAtOTA4LDYgKzEwODcsNyBAQAogCURSTV9FUlJPUigic3VyZmFjZSBub3QgbWFya2VkIGFzIHNjYW5vdXRcbiIpOwogCS8qIHZtd191c2VyX3N1cmZhY2VfbG9va3VwIHRha2VzIG9uZSByZWYgKi8KIAl2bXdfc3VyZmFjZV91bnJlZmVyZW5jZSgmc3VyZmFjZSk7CisJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZ1c2VyX29iaik7CiAKIAlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIH0KQEAgLTkxNiw2ICsxMDk2LDIxMCBAQAogCS5mYl9jcmVhdGUgPSB2bXdfa21zX2ZiX2NyZWF0ZSwKIH07CiAKK2ludCB2bXdfa21zX3ByZXNlbnQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkgICAgc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiLAorCQkgICAgc3RydWN0IHZtd19zdXJmYWNlICpzdXJmYWNlLAorCQkgICAgdWludDMyX3Qgc2lkLAorCQkgICAgaW50MzJfdCBkZXN0WCwgaW50MzJfdCBkZXN0WSwKKwkJICAgIHN0cnVjdCBkcm1fdm13X3JlY3QgKmNsaXBzLAorCQkgICAgdWludDMyX3QgbnVtX2NsaXBzKQoreworCXN0cnVjdCB2bXdfZGlzcGxheV91bml0ICp1bml0c1tWTVdHRlhfTlVNX0RJU1BMQVlfVU5JVFNdOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlzaXplX3QgZmlmb19zaXplOworCWludCBpLCBrLCBudW1fdW5pdHM7CisJaW50IHJldCA9IDA7IC8qIHNpbGVuY2Ugd2FybmluZyAqLworCisJc3RydWN0IHsKKwkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwkJU1ZHQTNkQ21kQmxpdFN1cmZhY2VUb1NjcmVlbiBib2R5OworCX0gKmNtZDsKKwlTVkdBU2lnbmVkUmVjdCAqYmxpdHM7CisKKwludW1fdW5pdHMgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldl9wcml2LT5kZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlpZiAoY3J0Yy0+ZmIgIT0gJnZmYi0+YmFzZSkKKwkJCWNvbnRpbnVlOworCQl1bml0c1tudW1fdW5pdHMrK10gPSB2bXdfY3J0Y190b19kdShjcnRjKTsKKwl9CisKKwlCVUdfT04oc3VyZmFjZSA9PSBOVUxMKTsKKwlCVUdfT04oIWNsaXBzIHx8ICFudW1fY2xpcHMpOworCisJZmlmb19zaXplID0gc2l6ZW9mKCpjbWQpICsgc2l6ZW9mKFNWR0FTaWduZWRSZWN0KSAqIG51bV9jbGlwczsKKwljbWQgPSBrbWFsbG9jKGZpZm9fc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB0ZW1wb3JhcnkgZmlmbyBtZW1vcnkuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogb25seSBuZWVkIHRvIGRvIHRoaXMgb25jZSAqLworCW1lbXNldChjbWQsIDAsIGZpZm9fc2l6ZSk7CisJY21kLT5oZWFkZXIuaWQgPSBjcHVfdG9fbGUzMihTVkdBXzNEX0NNRF9CTElUX1NVUkZBQ0VfVE9fU0NSRUVOKTsKKwljbWQtPmhlYWRlci5zaXplID0gY3B1X3RvX2xlMzIoZmlmb19zaXplIC0gc2l6ZW9mKGNtZC0+aGVhZGVyKSk7CisKKwljbWQtPmJvZHkuc3JjUmVjdC5sZWZ0ID0gMDsKKwljbWQtPmJvZHkuc3JjUmVjdC5yaWdodCA9IHN1cmZhY2UtPnNpemVzWzBdLndpZHRoOworCWNtZC0+Ym9keS5zcmNSZWN0LnRvcCA9IDA7CisJY21kLT5ib2R5LnNyY1JlY3QuYm90dG9tID0gc3VyZmFjZS0+c2l6ZXNbMF0uaGVpZ2h0OworCisJYmxpdHMgPSAoU1ZHQVNpZ25lZFJlY3QgKikmY21kWzFdOworCWZvciAoaSA9IDA7IGkgPCBudW1fY2xpcHM7IGkrKykgeworCQlibGl0c1tpXS5sZWZ0ICAgPSBjbGlwc1tpXS54OworCQlibGl0c1tpXS5yaWdodCAgPSBjbGlwc1tpXS54ICsgY2xpcHNbaV0udzsKKwkJYmxpdHNbaV0udG9wICAgID0gY2xpcHNbaV0ueTsKKwkJYmxpdHNbaV0uYm90dG9tID0gY2xpcHNbaV0ueSArIGNsaXBzW2ldLmg7CisJfQorCisJZm9yIChrID0gMDsgayA8IG51bV91bml0czsgaysrKSB7CisJCXN0cnVjdCB2bXdfZGlzcGxheV91bml0ICp1bml0ID0gdW5pdHNba107CisJCWludCBjbGlwX3gxID0gZGVzdFggLSB1bml0LT5jcnRjLng7CisJCWludCBjbGlwX3kxID0gZGVzdFkgLSB1bml0LT5jcnRjLnk7CisJCWludCBjbGlwX3gyID0gY2xpcF94MSArIHN1cmZhY2UtPnNpemVzWzBdLndpZHRoOworCQlpbnQgY2xpcF95MiA9IGNsaXBfeTEgKyBzdXJmYWNlLT5zaXplc1swXS5oZWlnaHQ7CisKKwkJLyogc2tpcCBhbnkgY3J0Y3MgdGhhdCBtaXNzZXMgdGhlIGNsaXAgcmVnaW9uICovCisJCWlmIChjbGlwX3gxID49IHVuaXQtPmNydGMubW9kZS5oZGlzcGxheSB8fAorCQkgICAgY2xpcF95MSA+PSB1bml0LT5jcnRjLm1vZGUudmRpc3BsYXkgfHwKKwkJICAgIGNsaXBfeDIgPD0gMCB8fCBjbGlwX3kyIDw9IDApCisJCQljb250aW51ZTsKKworCQkvKiBuZWVkIHRvIHJlc2V0IHNpZCBhcyBpdCBpcyBjaGFuZ2VkIGJ5IGV4ZWNidWYgKi8KKwkJY21kLT5ib2R5LnNyY0ltYWdlLnNpZCA9IHNpZDsKKworCQljbWQtPmJvZHkuZGVzdFNjcmVlbklkID0gdW5pdC0+dW5pdDsKKworCQkvKgorCQkgKiBUaGUgYmxpdCBjb21tYW5kIGlzIGEgbG90IG1vcmUgcmVzaWxpZW50IHRoZW4gdGhlCisJCSAqIHJlYWRiYWNrIGNvbW1hbmQgd2hlbiBpdCBjb21lcyB0byBjbGlwIHJlY3RzLiBTbyBpdHMKKwkJICogb2theSB0byBnbyBvdXQgb2YgYm91bmRzLgorCQkgKi8KKworCQljbWQtPmJvZHkuZGVzdFJlY3QubGVmdCA9IGNsaXBfeDE7CisJCWNtZC0+Ym9keS5kZXN0UmVjdC5yaWdodCA9IGNsaXBfeDI7CisJCWNtZC0+Ym9keS5kZXN0UmVjdC50b3AgPSBjbGlwX3kxOworCQljbWQtPmJvZHkuZGVzdFJlY3QuYm90dG9tID0gY2xpcF95MjsKKworCQlyZXQgPSB2bXdfZXhlY2J1Zl9wcm9jZXNzKGZpbGVfcHJpdiwgZGV2X3ByaXYsIE5VTEwsIGNtZCwKKwkJCQkJICBmaWZvX3NpemUsIDAsIE5VTEwpOworCisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlicmVhazsKKwl9CisKKwlrZnJlZShjbWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHZtd19rbXNfcmVhZGJhY2soc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJICAgICBzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICp2ZmIsCisJCSAgICAgc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIF9fdXNlciAqdXNlcl9mZW5jZV9yZXAsCisJCSAgICAgc3RydWN0IGRybV92bXdfcmVjdCAqY2xpcHMsCisJCSAgICAgdWludDMyX3QgbnVtX2NsaXBzKQoreworCXN0cnVjdCB2bXdfZnJhbWVidWZmZXJfZG1hYnVmICp2ZmJkID0KKwkJdm13X2ZyYW1lYnVmZmVyX3RvX3ZmYmQoJnZmYi0+YmFzZSk7CisJc3RydWN0IHZtd19kbWFfYnVmZmVyICpkbWFidWYgPSB2ZmJkLT5idWZmZXI7CisJc3RydWN0IHZtd19kaXNwbGF5X3VuaXQgKnVuaXRzW1ZNV0dGWF9OVU1fRElTUExBWV9VTklUU107CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXNpemVfdCBmaWZvX3NpemU7CisJaW50IGksIGssIHJldCwgbnVtX3VuaXRzLCBibGl0c19wb3M7CisKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBoZWFkZXI7CisJCVNWR0FGaWZvQ21kRGVmaW5lR01SRkIgYm9keTsKKwl9ICpjbWQ7CisJc3RydWN0IHsKKwkJdWludDMyX3QgaGVhZGVyOworCQlTVkdBRmlmb0NtZEJsaXRTY3JlZW5Ub0dNUkZCIGJvZHk7CisJfSAqYmxpdHM7CisKKwludW1fdW5pdHMgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldl9wcml2LT5kZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlpZiAoY3J0Yy0+ZmIgIT0gJnZmYi0+YmFzZSkKKwkJCWNvbnRpbnVlOworCQl1bml0c1tudW1fdW5pdHMrK10gPSB2bXdfY3J0Y190b19kdShjcnRjKTsKKwl9CisKKwlCVUdfT04oZG1hYnVmID09IE5VTEwpOworCUJVR19PTighY2xpcHMgfHwgIW51bV9jbGlwcyk7CisKKwkvKiB0YWtlIGEgc2FmZSBndWVzcyBhdCBmaWZvIHNpemUgKi8KKwlmaWZvX3NpemUgPSBzaXplb2YoKmNtZCkgKyBzaXplb2YoKmJsaXRzKSAqIG51bV9jbGlwcyAqIG51bV91bml0czsKKwljbWQgPSBrbWFsbG9jKGZpZm9fc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB0ZW1wb3JhcnkgZmlmbyBtZW1vcnkuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGNtZCwgMCwgZmlmb19zaXplKTsKKwljbWQtPmhlYWRlciA9IFNWR0FfQ01EX0RFRklORV9HTVJGQjsKKwljbWQtPmJvZHkuZm9ybWF0LmJpdHNQZXJQaXhlbCA9IHZmYi0+YmFzZS5iaXRzX3Blcl9waXhlbDsKKwljbWQtPmJvZHkuZm9ybWF0LmNvbG9yRGVwdGggPSB2ZmItPmJhc2UuZGVwdGg7CisJY21kLT5ib2R5LmZvcm1hdC5yZXNlcnZlZCA9IDA7CisJY21kLT5ib2R5LmJ5dGVzUGVyTGluZSA9IHZmYi0+YmFzZS5waXRjaDsKKwljbWQtPmJvZHkucHRyLmdtcklkID0gdmZiLT51c2VyX2hhbmRsZTsKKwljbWQtPmJvZHkucHRyLm9mZnNldCA9IDA7CisKKwlibGl0cyA9ICh2b2lkICopJmNtZFsxXTsKKwlibGl0c19wb3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fdW5pdHM7IGkrKykgeworCQlzdHJ1Y3QgZHJtX3Ztd19yZWN0ICpjID0gY2xpcHM7CisJCWZvciAoayA9IDA7IGsgPCBudW1fY2xpcHM7IGsrKywgYysrKSB7CisJCQkvKiB0cmFuc2Zvcm0gY2xpcCBjb29yZHMgdG8gY3J0YyBvcmlnaW4gYmFzZWQgY29vcmRzICovCisJCQlpbnQgY2xpcF94MSA9IGMtPnggLSB1bml0c1tpXS0+Y3J0Yy54OworCQkJaW50IGNsaXBfeDIgPSBjLT54IC0gdW5pdHNbaV0tPmNydGMueCArIGMtPnc7CisJCQlpbnQgY2xpcF95MSA9IGMtPnkgLSB1bml0c1tpXS0+Y3J0Yy55OworCQkJaW50IGNsaXBfeTIgPSBjLT55IC0gdW5pdHNbaV0tPmNydGMueSArIGMtPmg7CisJCQlpbnQgZGVzdF94ID0gYy0+eDsKKwkJCWludCBkZXN0X3kgPSBjLT55OworCisJCQkvKiBjb21wZW5zYXRlIGZvciBjbGlwcGluZywgd2UgbmVnYXRlCisJCQkgKiBhIG5lZ2F0aXZlIG51bWJlciBhbmQgYWRkIHRoYXQuCisJCQkgKi8KKwkJCWlmIChjbGlwX3gxIDwgMCkKKwkJCQlkZXN0X3ggKz0gLWNsaXBfeDE7CisJCQlpZiAoY2xpcF95MSA8IDApCisJCQkJZGVzdF95ICs9IC1jbGlwX3kxOworCisJCQkvKiBjbGlwICovCisJCQljbGlwX3gxID0gbWF4KGNsaXBfeDEsIDApOworCQkJY2xpcF95MSA9IG1heChjbGlwX3kxLCAwKTsKKwkJCWNsaXBfeDIgPSBtaW4oY2xpcF94MiwgdW5pdHNbaV0tPmNydGMubW9kZS5oZGlzcGxheSk7CisJCQljbGlwX3kyID0gbWluKGNsaXBfeTIsIHVuaXRzW2ldLT5jcnRjLm1vZGUudmRpc3BsYXkpOworCisJCQkvKiBhbmQgY3VsbCBhbnkgcmVjdHMgdGhhdCBtaXNzZXMgdGhlIGNydGMgKi8KKwkJCWlmIChjbGlwX3gxID49IHVuaXRzW2ldLT5jcnRjLm1vZGUuaGRpc3BsYXkgfHwKKwkJCSAgICBjbGlwX3kxID49IHVuaXRzW2ldLT5jcnRjLm1vZGUudmRpc3BsYXkgfHwKKwkJCSAgICBjbGlwX3gyIDw9IDAgfHwgY2xpcF95MiA8PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlibGl0c1tibGl0c19wb3NdLmhlYWRlciA9IFNWR0FfQ01EX0JMSVRfU0NSRUVOX1RPX0dNUkZCOworCQkJYmxpdHNbYmxpdHNfcG9zXS5ib2R5LnNyY1NjcmVlbklkID0gdW5pdHNbaV0tPnVuaXQ7CisJCQlibGl0c1tibGl0c19wb3NdLmJvZHkuZGVzdE9yaWdpbi54ID0gZGVzdF94OworCQkJYmxpdHNbYmxpdHNfcG9zXS5ib2R5LmRlc3RPcmlnaW4ueSA9IGRlc3RfeTsKKworCQkJYmxpdHNbYmxpdHNfcG9zXS5ib2R5LnNyY1JlY3QubGVmdCA9IGNsaXBfeDE7CisJCQlibGl0c1tibGl0c19wb3NdLmJvZHkuc3JjUmVjdC50b3AgPSBjbGlwX3kxOworCQkJYmxpdHNbYmxpdHNfcG9zXS5ib2R5LnNyY1JlY3QucmlnaHQgPSBjbGlwX3gyOworCQkJYmxpdHNbYmxpdHNfcG9zXS5ib2R5LnNyY1JlY3QuYm90dG9tID0gY2xpcF95MjsKKwkJCWJsaXRzX3BvcysrOworCQl9CisJfQorCS8qIHJlc2V0IHNpemUgaGVyZSBhbmQgdXNlIGNhbGN1bGF0ZWQgZXhhY3Qgc2l6ZSBmcm9tIGxvb3BzICovCisJZmlmb19zaXplID0gc2l6ZW9mKCpjbWQpICsgc2l6ZW9mKCpibGl0cykgKiBibGl0c19wb3M7CisKKwlyZXQgPSB2bXdfZXhlY2J1Zl9wcm9jZXNzKGZpbGVfcHJpdiwgZGV2X3ByaXYsIE5VTEwsIGNtZCwgZmlmb19zaXplLAorCQkJCSAgMCwgdXNlcl9mZW5jZV9yZXApOworCisJa2ZyZWUoY21kKTsKKworCXJldHVybiByZXQ7Cit9CisKIGludCB2bXdfa21zX2luaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKQEAgLTkyOSw3ICsxMzEzLDkgQEAKIAlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDgxOTI7CiAJZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gODE5MjsKIAotCXJldCA9IHZtd19rbXNfaW5pdF9sZWdhY3lfZGlzcGxheV9zeXN0ZW0oZGV2X3ByaXYpOworCXJldCA9IHZtd19rbXNfaW5pdF9zY3JlZW5fb2JqZWN0X2Rpc3BsYXkoZGV2X3ByaXYpOworCWlmIChyZXQpIC8qIEZhbGxiYWNrICovCisJCSh2b2lkKXZtd19rbXNfaW5pdF9sZWdhY3lfZGlzcGxheV9zeXN0ZW0oZGV2X3ByaXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NDIsNyArMTMyOCwxMCBAQAogCSAqIGRybV9lbmNvZGVyX2NsZWFudXAgd2hpY2ggdGFrZXMgdGhlIGxvY2sgd2UgZGVhZGxvY2suCiAJICovCiAJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2X3ByaXYtPmRldik7Ci0Jdm13X2ttc19jbG9zZV9sZWdhY3lfZGlzcGxheV9zeXN0ZW0oZGV2X3ByaXYpOworCWlmIChkZXZfcHJpdi0+c291X3ByaXYpCisJCXZtd19rbXNfY2xvc2Vfc2NyZWVuX29iamVjdF9kaXNwbGF5KGRldl9wcml2KTsKKwllbHNlCisJCXZtd19rbXNfY2xvc2VfbGVnYWN5X2Rpc3BsYXlfc3lzdGVtKGRldl9wcml2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTg3LDkgKzEzNzYsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgdm13X2ttc193cml0ZV9zdmdhKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYsCitpbnQgdm13X2ttc193cml0ZV9zdmdhKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYsCiAJCQl1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBwaXRjaCwKLQkJCXVuc2lnbmVkIGJicCwgdW5zaWduZWQgZGVwdGgpCisJCQl1bnNpZ25lZCBicHAsIHVuc2lnbmVkIGRlcHRoKQogewogCWlmICh2bXdfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfUElUQ0hMT0NLKQogCQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX1BJVENITE9DSywgcGl0Y2gpOwpAQCAtOTk3LDExICsxMzg2LDE1IEBACiAJCWlvd3JpdGUzMihwaXRjaCwgdm13X3ByaXYtPm1taW9fdmlydCArIFNWR0FfRklGT19QSVRDSExPQ0spOwogCXZtd193cml0ZSh2bXdfcHJpdiwgU1ZHQV9SRUdfV0lEVEgsIHdpZHRoKTsKIAl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0hFSUdIVCwgaGVpZ2h0KTsKLQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0JJVFNfUEVSX1BJWEVMLCBiYnApOwotCXZtd193cml0ZSh2bXdfcHJpdiwgU1ZHQV9SRUdfREVQVEgsIGRlcHRoKTsKLQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX1JFRF9NQVNLLCAweDAwZmYwMDAwKTsKLQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0dSRUVOX01BU0ssIDB4MDAwMGZmMDApOwotCXZtd193cml0ZSh2bXdfcHJpdiwgU1ZHQV9SRUdfQkxVRV9NQVNLLCAweDAwMDAwMGZmKTsKKwl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0JJVFNfUEVSX1BJWEVMLCBicHApOworCisJaWYgKHZtd19yZWFkKHZtd19wcml2LCBTVkdBX1JFR19ERVBUSCkgIT0gZGVwdGgpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGRlcHRoICV1IGZvciAldSBicHAsIGhvc3QgZXhwZWN0cyAldVxuIiwKKwkJCSAgZGVwdGgsIGJwcCwgdm13X3JlYWQodm13X3ByaXYsIFNWR0FfUkVHX0RFUFRIKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOwogfQogCiBpbnQgdm13X2ttc19zYXZlX3ZnYShzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2KQpAQCAtMTAxMSwxMiArMTQwNCw3IEBACiAKIAl2bXdfcHJpdi0+dmdhX3dpZHRoID0gdm13X3JlYWQodm13X3ByaXYsIFNWR0FfUkVHX1dJRFRIKTsKIAl2bXdfcHJpdi0+dmdhX2hlaWdodCA9IHZtd19yZWFkKHZtd19wcml2LCBTVkdBX1JFR19IRUlHSFQpOwotCXZtd19wcml2LT52Z2FfZGVwdGggPSB2bXdfcmVhZCh2bXdfcHJpdiwgU1ZHQV9SRUdfREVQVEgpOwogCXZtd19wcml2LT52Z2FfYnBwID0gdm13X3JlYWQodm13X3ByaXYsIFNWR0FfUkVHX0JJVFNfUEVSX1BJWEVMKTsKLQl2bXdfcHJpdi0+dmdhX3BzZXVkbyA9IHZtd19yZWFkKHZtd19wcml2LCBTVkdBX1JFR19QU0VVRE9DT0xPUik7Ci0Jdm13X3ByaXYtPnZnYV9yZWRfbWFzayA9IHZtd19yZWFkKHZtd19wcml2LCBTVkdBX1JFR19SRURfTUFTSyk7Ci0Jdm13X3ByaXYtPnZnYV9ibHVlX21hc2sgPSB2bXdfcmVhZCh2bXdfcHJpdiwgU1ZHQV9SRUdfQkxVRV9NQVNLKTsKLQl2bXdfcHJpdi0+dmdhX2dyZWVuX21hc2sgPSB2bXdfcmVhZCh2bXdfcHJpdiwgU1ZHQV9SRUdfR1JFRU5fTUFTSyk7CiAJaWYgKHZtd19wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9QSVRDSExPQ0spCiAJCXZtd19wcml2LT52Z2FfcGl0Y2hsb2NrID0KIAkJICB2bXdfcmVhZCh2bXdfcHJpdiwgU1ZHQV9SRUdfUElUQ0hMT0NLKTsKQEAgLTEwNjUsMTIgKzE0NTMsNyBAQAogCiAJdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19XSURUSCwgdm13X3ByaXYtPnZnYV93aWR0aCk7CiAJdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19IRUlHSFQsIHZtd19wcml2LT52Z2FfaGVpZ2h0KTsKLQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0RFUFRILCB2bXdfcHJpdi0+dmdhX2RlcHRoKTsKIAl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0JJVFNfUEVSX1BJWEVMLCB2bXdfcHJpdi0+dmdhX2JwcCk7Ci0Jdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19QU0VVRE9DT0xPUiwgdm13X3ByaXYtPnZnYV9wc2V1ZG8pOwotCXZtd193cml0ZSh2bXdfcHJpdiwgU1ZHQV9SRUdfUkVEX01BU0ssIHZtd19wcml2LT52Z2FfcmVkX21hc2spOwotCXZtd193cml0ZSh2bXdfcHJpdiwgU1ZHQV9SRUdfR1JFRU5fTUFTSywgdm13X3ByaXYtPnZnYV9ncmVlbl9tYXNrKTsKLQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0JMVUVfTUFTSywgdm13X3ByaXYtPnZnYV9ibHVlX21hc2spOwogCWlmICh2bXdfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfUElUQ0hMT0NLKQogCQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX1BJVENITE9DSywKIAkJCSAgdm13X3ByaXYtPnZnYV9waXRjaGxvY2spOwpAQCAtMTA5NSw2ICsxNDc4LDMxMiBAQAogCXJldHVybiAwOwogfQogCitib29sIHZtd19rbXNfdmFsaWRhdGVfbW9kZV92cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJdWludDMyX3QgcGl0Y2gsCisJCQkJdWludDMyX3QgaGVpZ2h0KQoreworCXJldHVybiAoKHU2NCkgcGl0Y2ggKiAodTY0KSBoZWlnaHQpIDwgKHU2NCkgZGV2X3ByaXYtPnZyYW1fc2l6ZTsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uIGNhbGxlZCBieSBEUk0gY29kZSBjYWxsZWQgd2l0aCB2YmxfbG9jayBoZWxkLgorICovCit1MzIgdm13X2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBGdW5jdGlvbiBjYWxsZWQgYnkgRFJNIGNvZGUgY2FsbGVkIHdpdGggdmJsX2xvY2sgaGVsZC4KKyAqLworaW50IHZtd19lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCXJldHVybiAtRU5PU1lTOworfQorCisvKioKKyAqIEZ1bmN0aW9uIGNhbGxlZCBieSBEUk0gY29kZSBjYWxsZWQgd2l0aCB2YmxfbG9jayBoZWxkLgorICovCit2b2lkIHZtd19kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKK30KKworCisvKgorICogU21hbGwgc2hhcmVkIGttcyBmdW5jdGlvbnMuCisgKi8KKworaW50IHZtd19kdV91cGRhdGVfbGF5b3V0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVuc2lnbmVkIG51bSwKKwkJCSBzdHJ1Y3QgZHJtX3Ztd19yZWN0ICpyZWN0cykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKwlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqZHU7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbjsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisjaWYgMAorCXsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJRFJNX0lORk8oIiVzOiBuZXcgbGF5b3V0ICIsIF9fZnVuY19fKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQkJRFJNX0lORk8oIiglaSwgJWkgJXV4JXUpICIsIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksCisJCQkJIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgpOworCQlEUk1fSU5GTygiXG4iKTsKKwl9CisjZW5kaWYKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29uLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlkdSA9IHZtd19jb25uZWN0b3JfdG9fZHUoY29uKTsKKwkJaWYgKG51bSA+IGR1LT51bml0KSB7CisJCQlkdS0+cHJlZl93aWR0aCA9IHJlY3RzW2R1LT51bml0XS53OworCQkJZHUtPnByZWZfaGVpZ2h0ID0gcmVjdHNbZHUtPnVuaXRdLmg7CisJCQlkdS0+cHJlZl9hY3RpdmUgPSB0cnVlOworCQkJZHUtPmd1aV94ID0gcmVjdHNbZHUtPnVuaXRdLng7CisJCQlkdS0+Z3VpX3kgPSByZWN0c1tkdS0+dW5pdF0ueTsKKwkJfSBlbHNlIHsKKwkJCWR1LT5wcmVmX3dpZHRoID0gODAwOworCQkJZHUtPnByZWZfaGVpZ2h0ID0gNjAwOworCQkJZHUtPnByZWZfYWN0aXZlID0gZmFsc2U7CisJCX0KKwkJY29uLT5zdGF0dXMgPSB2bXdfZHVfY29ubmVjdG9yX2RldGVjdChjb24sIHRydWUpOworCX0KKworCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2bXdfZHVfY3J0Y19zYXZlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKK30KKwordm9pZCB2bXdfZHVfY3J0Y19yZXN0b3JlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKK30KKwordm9pZCB2bXdfZHVfY3J0Y19nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJICAgdTE2ICpyLCB1MTYgKmcsIHUxNiAqYiwKKwkJCSAgIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBzaXplKQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihjcnRjLT5kZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlEUk1fREVCVUcoIiVkIHIvZy9iID0gMHglMDR4IC8gMHglMDR4IC8gMHglMDR4XG4iLCBpLAorCQkJICByW2ldLCBnW2ldLCBiW2ldKTsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1BBTEVUVEVfQkFTRSArIGkgKiAzICsgMCwgcltpXSA+PiA4KTsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1BBTEVUVEVfQkFTRSArIGkgKiAzICsgMSwgZ1tpXSA+PiA4KTsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1BBTEVUVEVfQkFTRSArIGkgKiAzICsgMiwgYltpXSA+PiA4KTsKKwl9Cit9CisKK3ZvaWQgdm13X2R1X2Nvbm5lY3Rvcl9kcG1zKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCBtb2RlKQoreworfQorCit2b2lkIHZtd19kdV9jb25uZWN0b3Jfc2F2ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworfQorCit2b2lkIHZtd19kdV9jb25uZWN0b3JfcmVzdG9yZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworfQorCitlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCit2bXdfZHVfY29ubmVjdG9yX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBib29sIGZvcmNlKQoreworCXVpbnQzMl90IG51bV9kaXNwbGF5czsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KGRldik7CisJc3RydWN0IHZtd19kaXNwbGF5X3VuaXQgKmR1ID0gdm13X2Nvbm5lY3Rvcl90b19kdShjb25uZWN0b3IpOworCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKKwludW1fZGlzcGxheXMgPSB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfTlVNX0RJU1BMQVlTKTsKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7CisKKwlyZXR1cm4gKCh2bXdfY29ubmVjdG9yX3RvX2R1KGNvbm5lY3RvciktPnVuaXQgPCBudW1fZGlzcGxheXMgJiYKKwkJIGR1LT5wcmVmX2FjdGl2ZSkgPworCQljb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCA6IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkKTsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIHZtd19rbXNfY29ubmVjdG9yX2J1aWx0aW5bXSA9IHsKKwkvKiA2NDB4NDgwQDYwSHogKi8KKwl7IERSTV9NT0RFKCI2NDB4NDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDI1MTc1LCA2NDAsIDY1NiwKKwkJICAgNzUyLCA4MDAsIDAsIDQ4MCwgNDg5LCA0OTIsIDUyNSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykgfSwKKwkvKiA4MDB4NjAwQDYwSHogKi8KKwl7IERSTV9NT0RFKCI4MDB4NjAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDQwMDAwLCA4MDAsIDg0MCwKKwkJICAgOTY4LCAxMDU2LCAwLCA2MDAsIDYwMSwgNjA1LCA2MjgsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJLyogMTAyNHg3NjhANjBIeiAqLworCXsgRFJNX01PREUoIjEwMjR4NzY4IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDY1MDAwLCAxMDI0LCAxMDQ4LAorCQkgICAxMTg0LCAxMzQ0LCAwLCA3NjgsIDc3MSwgNzc3LCA4MDYsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpIH0sCisJLyogMTE1Mng4NjRANzVIeiAqLworCXsgRFJNX01PREUoIjExNTJ4ODY0IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEwODAwMCwgMTE1MiwgMTIxNiwKKwkJICAgMTM0NCwgMTYwMCwgMCwgODY0LCA4NjUsIDg2OCwgOTAwLCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDEyODB4NzY4QDYwSHogKi8KKwl7IERSTV9NT0RFKCIxMjgweDc2OCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA3OTUwMCwgMTI4MCwgMTM0NCwKKwkJICAgMTQ3MiwgMTY2NCwgMCwgNzY4LCA3NzEsIDc3OCwgNzk4LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDEyODB4ODAwQDYwSHogKi8KKwl7IERSTV9NT0RFKCIxMjgweDgwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA4MzUwMCwgMTI4MCwgMTM1MiwKKwkJICAgMTQ4MCwgMTY4MCwgMCwgODAwLCA4MDMsIDgwOSwgODMxLCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LAorCS8qIDEyODB4OTYwQDYwSHogKi8KKwl7IERSTV9NT0RFKCIxMjgweDk2MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMDgwMDAsIDEyODAsIDEzNzYsCisJCSAgIDE0ODgsIDE4MDAsIDAsIDk2MCwgOTYxLCA5NjQsIDEwMDAsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJLyogMTI4MHgxMDI0QDYwSHogKi8KKwl7IERSTV9NT0RFKCIxMjgweDEwMjQiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCAxMjgwLCAxMzI4LAorCQkgICAxNDQwLCAxNjg4LCAwLCAxMDI0LCAxMDI1LCAxMDI4LCAxMDY2LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDEzNjB4NzY4QDYwSHogKi8KKwl7IERSTV9NT0RFKCIxMzYweDc2OCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA4NTUwMCwgMTM2MCwgMTQyNCwKKwkJICAgMTUzNiwgMTc5MiwgMCwgNzY4LCA3NzEsIDc3NywgNzk1LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDE0NDB4MTA1MEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTQwMHgxMDUwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEyMTc1MCwgMTQwMCwgMTQ4OCwKKwkJICAgMTYzMiwgMTg2NCwgMCwgMTA1MCwgMTA1MywgMTA1NywgMTA4OSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiAxNDQweDkwMEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTQ0MHg5MDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA2NTAwLCAxNDQwLCAxNTIwLAorCQkgICAxNjcyLCAxOTA0LCAwLCA5MDAsIDkwMywgOTA5LCA5MzQsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJLyogMTYwMHgxMjAwQDYwSHogKi8KKwl7IERSTV9NT0RFKCIxNjAweDEyMDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTYyMDAwLCAxNjAwLCAxNjY0LAorCQkgICAxODU2LCAyMTYwLCAwLCAxMjAwLCAxMjAxLCAxMjA0LCAxMjUwLCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDE2ODB4MTA1MEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTY4MHgxMDUwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDE0NjI1MCwgMTY4MCwgMTc4NCwKKwkJICAgMTk2MCwgMjI0MCwgMCwgMTA1MCwgMTA1MywgMTA1OSwgMTA4OSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiAxNzkyeDEzNDRANjBIeiAqLworCXsgRFJNX01PREUoIjE3OTJ4MTM0NCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyMDQ3NTAsIDE3OTIsIDE5MjAsCisJCSAgIDIxMjAsIDI0NDgsIDAsIDEzNDQsIDEzNDUsIDEzNDgsIDEzOTQsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJLyogMTg1M3gxMzkyQDYwSHogKi8KKwl7IERSTV9NT0RFKCIxODU2eDEzOTIiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjE4MjUwLCAxODU2LCAxOTUyLAorCQkgICAyMTc2LCAyNTI4LCAwLCAxMzkyLCAxMzkzLCAxMzk2LCAxNDM5LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDE5MjB4MTIwMEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTkyMHgxMjAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDE5MzI1MCwgMTkyMCwgMjA1NiwKKwkJICAgMjI1NiwgMjU5MiwgMCwgMTIwMCwgMTIwMywgMTIwOSwgMTI0NSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiAxOTIweDE0NDBANjBIeiAqLworCXsgRFJNX01PREUoIjE5MjB4MTQ0MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyMzQwMDAsIDE5MjAsIDIwNDgsCisJCSAgIDIyNTYsIDI2MDAsIDAsIDE0NDAsIDE0NDEsIDE0NDQsIDE1MDAsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJLyogMjU2MHgxNjAwQDYwSHogKi8KKwl7IERSTV9NT0RFKCIyNTYweDE2MDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMzQ4NTAwLCAyNTYwLCAyNzUyLAorCQkgICAzMDMyLCAzNTA0LCAwLCAxNjAwLCAxNjAzLCAxNjA5LCAxNjU4LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIFRlcm1pbmF0ZSAqLworCXsgRFJNX01PREUoIiIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApIH0sCit9OworCisvKioKKyAqIHZtd19ndWVzc19tb2RlX3RpbWluZyAtIFByb3ZpZGUgZmFrZSB0aW1pbmdzIGZvciBhCisgKiA2MEh6IHZyZWZyZXNoIG1vZGUuCisgKgorICogQG1vZGUgLSBQb2ludGVyIHRvIGEgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgd2l0aCBoZGlzcGxheSBhbmQgdmRpc3BsYXkKKyAqIG1lbWJlcnMgZmlsbGVkIGluLgorICovCitzdGF0aWMgdm9pZCB2bXdfZ3Vlc3NfbW9kZV90aW1pbmcoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJbW9kZS0+aHN5bmNfc3RhcnQgPSBtb2RlLT5oZGlzcGxheSArIDUwOworCW1vZGUtPmhzeW5jX2VuZCA9IG1vZGUtPmhzeW5jX3N0YXJ0ICsgNTA7CisJbW9kZS0+aHRvdGFsID0gbW9kZS0+aHN5bmNfZW5kICsgNTA7CisKKwltb2RlLT52c3luY19zdGFydCA9IG1vZGUtPnZkaXNwbGF5ICsgNTA7CisJbW9kZS0+dnN5bmNfZW5kID0gbW9kZS0+dnN5bmNfc3RhcnQgKyA1MDsKKwltb2RlLT52dG90YWwgPSBtb2RlLT52c3luY19lbmQgKyA1MDsKKworCW1vZGUtPmNsb2NrID0gKHUzMiltb2RlLT5odG90YWwgKiAodTMyKW1vZGUtPnZ0b3RhbCAvIDEwMCAqIDY7CisJbW9kZS0+dnJlZnJlc2ggPSBkcm1fbW9kZV92cmVmcmVzaChtb2RlKTsKK30KKworCitpbnQgdm13X2R1X2Nvbm5lY3Rvcl9maWxsX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJdWludDMyX3QgbWF4X3dpZHRoLCB1aW50MzJfdCBtYXhfaGVpZ2h0KQoreworCXN0cnVjdCB2bXdfZGlzcGxheV91bml0ICpkdSA9IHZtd19jb25uZWN0b3JfdG9fZHUoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KGRldik7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSBOVUxMOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpibW9kZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBwcmVmbW9kZSA9IHsgRFJNX01PREUoInByZWZlcnJlZCIsCisJCURSTV9NT0RFX1RZUEVfRFJJVkVSIHwgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCURSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpCisJfTsKKwlpbnQgaTsKKworCS8qIEFkZCBwcmVmZXJyZWQgbW9kZSAqLworCXsKKwkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsICZwcmVmbW9kZSk7CisJCWlmICghbW9kZSkKKwkJCXJldHVybiAwOworCQltb2RlLT5oZGlzcGxheSA9IGR1LT5wcmVmX3dpZHRoOworCQltb2RlLT52ZGlzcGxheSA9IGR1LT5wcmVmX2hlaWdodDsKKwkJdm13X2d1ZXNzX21vZGVfdGltaW5nKG1vZGUpOworCisJCWlmICh2bXdfa21zX3ZhbGlkYXRlX21vZGVfdnJhbShkZXZfcHJpdiwgbW9kZS0+aGRpc3BsYXkgKiAyLAorCQkJCQkgICAgICAgbW9kZS0+dmRpc3BsYXkpKSB7CisJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CisJCX0gZWxzZSB7CisJCQlkcm1fbW9kZV9kZXN0cm95KGRldiwgbW9kZSk7CisJCQltb2RlID0gTlVMTDsKKwkJfQorCisJCWlmIChkdS0+cHJlZl9tb2RlKSB7CisJCQlsaXN0X2RlbF9pbml0KCZkdS0+cHJlZl9tb2RlLT5oZWFkKTsKKwkJCWRybV9tb2RlX2Rlc3Ryb3koZGV2LCBkdS0+cHJlZl9tb2RlKTsKKwkJfQorCisJCS8qIG1vZGUgbWlnaHQgYmUgbnVsbCBoZXJlLCB0aGlzIGlzIGludGVuZGVkICovCisJCWR1LT5wcmVmX21vZGUgPSBtb2RlOworCX0KKworCWZvciAoaSA9IDA7IHZtd19rbXNfY29ubmVjdG9yX2J1aWx0aW5baV0udHlwZSAhPSAwOyBpKyspIHsKKwkJYm1vZGUgPSAmdm13X2ttc19jb25uZWN0b3JfYnVpbHRpbltpXTsKKwkJaWYgKGJtb2RlLT5oZGlzcGxheSA+IG1heF93aWR0aCB8fAorCQkgICAgYm1vZGUtPnZkaXNwbGF5ID4gbWF4X2hlaWdodCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghdm13X2ttc192YWxpZGF0ZV9tb2RlX3ZyYW0oZGV2X3ByaXYsIGJtb2RlLT5oZGlzcGxheSAqIDIsCisJCQkJCQlibW9kZS0+dmRpc3BsYXkpKQorCQkJY29udGludWU7CisKKwkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGJtb2RlKTsKKwkJaWYgKCFtb2RlKQorCQkJcmV0dXJuIDA7CisJCW1vZGUtPnZyZWZyZXNoID0gZHJtX21vZGVfdnJlZnJlc2gobW9kZSk7CisKKwkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOworCX0KKworCS8qIE1vdmUgdGhlIHByZWZlcmVkIG1vZGUgZmlyc3QsIGhlbHAgYXBwcyBwaWNrIHRoZSByaWdodCBtb2RlLiAqLworCWlmIChkdS0+cHJlZl9tb2RlKQorCQlsaXN0X21vdmUoJmR1LT5wcmVmX21vZGUtPmhlYWQsICZjb25uZWN0b3ItPnByb2JlZF9tb2Rlcyk7CisKKwlkcm1fbW9kZV9jb25uZWN0b3JfbGlzdF91cGRhdGUoY29ubmVjdG9yKTsKKworCXJldHVybiAxOworfQorCitpbnQgdm13X2R1X2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJCSAgdWludDY0X3QgdmFsKQoreworCXJldHVybiAwOworfQorCisKIGludCB2bXdfa21zX3VwZGF0ZV9sYXlvdXRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKQEAgLTExMDYsNiArMTc5NSw4IEBACiAJc3RydWN0IGRybV92bXdfcmVjdCAqcmVjdHM7CiAJdW5zaWduZWQgcmVjdHNfc2l6ZTsKIAlpbnQgcmV0OworCWludCBpOworCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKm1vZGVfY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7CiAKIAlyZXQgPSB0dG1fcmVhZF9sb2NrKCZ2bWFzdGVyLT5sb2NrLCB0cnVlKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtMTExMyw3ICsxODA0LDcgQEAKIAogCWlmICghYXJnLT5udW1fb3V0cHV0cykgewogCQlzdHJ1Y3QgZHJtX3Ztd19yZWN0IGRlZl9yZWN0ID0gezAsIDAsIDgwMCwgNjAwfTsKLQkJdm13X2ttc19sZHVfdXBkYXRlX2xheW91dChkZXZfcHJpdiwgMSwgJmRlZl9yZWN0KTsKKwkJdm13X2R1X3VwZGF0ZV9sYXlvdXQoZGV2X3ByaXYsIDEsICZkZWZfcmVjdCk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKQEAgLTExMzIsNyArMTgyMywxOCBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCXZtd19rbXNfbGR1X3VwZGF0ZV9sYXlvdXQoZGV2X3ByaXYsIGFyZy0+bnVtX291dHB1dHMsIHJlY3RzKTsKKwlmb3IgKGkgPSAwOyBpIDwgYXJnLT5udW1fb3V0cHV0czsgKytpKSB7CisJCWlmIChyZWN0cy0+eCA8IDAgfHwKKwkJICAgIHJlY3RzLT55IDwgMCB8fAorCQkgICAgcmVjdHMtPnggKyByZWN0cy0+dyA+IG1vZGVfY29uZmlnLT5tYXhfd2lkdGggfHwKKwkJICAgIHJlY3RzLT55ICsgcmVjdHMtPmggPiBtb2RlX2NvbmZpZy0+bWF4X2hlaWdodCkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIEdVSSBsYXlvdXQuXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJfQorCisJdm13X2R1X3VwZGF0ZV9sYXlvdXQoZGV2X3ByaXYsIGFyZy0+bnVtX291dHB1dHMsIHJlY3RzKTsKIAogb3V0X2ZyZWU6CiAJa2ZyZWUocmVjdHMpOwpAQCAtMTE0MCwxNSArMTg0MiwzIEBACiAJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQotCi1ib29sIHZtd19rbXNfdmFsaWRhdGVfbW9kZV92cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJdWludDMyX3QgcGl0Y2gsCi0JCQkJdWludDMyX3QgaGVpZ2h0KQotewotCXJldHVybiAoKHU2NCkgcGl0Y2ggKiAodTY0KSBoZWlnaHQpIDwgKHU2NCkgZGV2X3ByaXYtPnZyYW1fc2l6ZTsKLX0KLQotdTMyIHZtd19nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCi17Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuaCBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ttcy5oCmluZGV4IDhhMzk4YTAuLmFmOGU2ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ttcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ttcy5oCkBAIC0zMSw2ICszMSw4IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInZtd2dmeF9kcnYuaCIKIAorI2RlZmluZSBWTVdHRlhfTlVNX0RJU1BMQVlfVU5JVFMgOAorCiAKICNkZWZpbmUgdm13X2ZyYW1lYnVmZmVyX3RvX3ZmYih4KSBcCiAJY29udGFpbmVyX29mKHgsIHN0cnVjdCB2bXdfZnJhbWVidWZmZXIsIGJhc2UpCkBAIC00NSw2ICs0Nyw5IEBACiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciBiYXNlOwogCWludCAoKnBpbikoc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqZmIpOwogCWludCAoKnVucGluKShzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICpmYik7CisJYm9vbCBkbWFidWY7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqdXNlcl9vYmo7CisJdWludDMyX3QgdXNlcl9oYW5kbGU7CiB9OwogCiAKQEAgLTgzLDIyICs4OCw2NSBAQAogCWludCBob3RzcG90X3k7CiAKIAl1bnNpZ25lZCB1bml0OworCisJLyoKKwkgKiBQcmVmZXJlZCBtb2RlIHRyYWNraW5nLgorCSAqLworCXVuc2lnbmVkIHByZWZfd2lkdGg7CisJdW5zaWduZWQgcHJlZl9oZWlnaHQ7CisJYm9vbCBwcmVmX2FjdGl2ZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcHJlZl9tb2RlOworCisJLyoKKwkgKiBHdWkgcG9zaXRpb25pbmcKKwkgKi8KKwlpbnQgZ3VpX3g7CisJaW50IGd1aV95OworCWJvb2wgaXNfaW1wbGljaXQ7CiB9OwogCisjZGVmaW5lIHZtd19jcnRjX3RvX2R1KHgpIFwKKwljb250YWluZXJfb2YoeCwgc3RydWN0IHZtd19kaXNwbGF5X3VuaXQsIGNydGMpCisjZGVmaW5lIHZtd19jb25uZWN0b3JfdG9fZHUoeCkgXAorCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCwgY29ubmVjdG9yKQorCisKIC8qCiAgKiBTaGFyZWQgZGlzcGxheSB1bml0IGZ1bmN0aW9ucyAtIHZtd2dmeF9rbXMuYwogICovCiB2b2lkIHZtd19kaXNwbGF5X3VuaXRfY2xlYW51cChzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqZHUpOwordm9pZCB2bXdfZHVfY3J0Y19zYXZlKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7Cit2b2lkIHZtd19kdV9jcnRjX3Jlc3RvcmUoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKK3ZvaWQgdm13X2R1X2NydGNfZ2FtbWFfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgIHUxNiAqciwgdTE2ICpnLCB1MTYgKmIsCisJCQkgICB1aW50MzJfdCBzdGFydCwgdWludDMyX3Qgc2l6ZSk7CiBpbnQgdm13X2R1X2NydGNfY3Vyc29yX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAogCQkJICAgdWludDMyX3QgaGFuZGxlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKIGludCB2bXdfZHVfY3J0Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSk7Cit2b2lkIHZtd19kdV9jb25uZWN0b3JfZHBtcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgbW9kZSk7Cit2b2lkIHZtd19kdV9jb25uZWN0b3Jfc2F2ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKK3ZvaWQgdm13X2R1X2Nvbm5lY3Rvcl9yZXN0b3JlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwordm13X2R1X2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBmb3JjZSk7CitpbnQgdm13X2R1X2Nvbm5lY3Rvcl9maWxsX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJdWludDMyX3QgbWF4X3dpZHRoLCB1aW50MzJfdCBtYXhfaGVpZ2h0KTsKK2ludCB2bXdfZHVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCSAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCisJCQkJICB1aW50NjRfdCB2YWwpOworCiAKIC8qCiAgKiBMZWdhY3kgZGlzcGxheSB1bml0IGZ1bmN0aW9ucyAtIHZtd2dmeF9sZHUuYwogICovCiBpbnQgdm13X2ttc19pbml0X2xlZ2FjeV9kaXNwbGF5X3N5c3RlbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKIGludCB2bXdfa21zX2Nsb3NlX2xlZ2FjeV9kaXNwbGF5X3N5c3RlbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKLWludCB2bXdfa21zX2xkdV91cGRhdGVfbGF5b3V0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVuc2lnbmVkIG51bSwKKworLyoKKyAqIFNjcmVlbiBPYmplY3RzIGRpc3BsYXkgZnVuY3Rpb25zIC0gdm13Z2Z4X3Njcm4uYworICovCitpbnQgdm13X2ttc19pbml0X3NjcmVlbl9vYmplY3RfZGlzcGxheShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKK2ludCB2bXdfa21zX2Nsb3NlX3NjcmVlbl9vYmplY3RfZGlzcGxheShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKK2ludCB2bXdfa21zX3NvdV91cGRhdGVfbGF5b3V0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVuc2lnbmVkIG51bSwKIAkJCSAgICAgIHN0cnVjdCBkcm1fdm13X3JlY3QgKnJlY3RzKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9sZHUuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2xkdS5jCmluZGV4IGIzYTJjZDUuLjkwYzVlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2xkdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2xkdS5jCkBAIC0yNyw3ICsyNyw2IEBACiAKICNpbmNsdWRlICJ2bXdnZnhfa21zLmgiCiAKLSNkZWZpbmUgVk1XR0ZYX0xEVV9OVU1fRFUgOAogCiAjZGVmaW5lIHZtd19jcnRjX3RvX2xkdSh4KSBcCiAJY29udGFpbmVyX29mKHgsIHN0cnVjdCB2bXdfbGVnYWN5X2Rpc3BsYXlfdW5pdCwgYmFzZS5jcnRjKQpAQCAtNTEsMTEgKzUwLDYgQEAKIHN0cnVjdCB2bXdfbGVnYWN5X2Rpc3BsYXlfdW5pdCB7CiAJc3RydWN0IHZtd19kaXNwbGF5X3VuaXQgYmFzZTsKIAotCXVuc2lnbmVkIHByZWZfd2lkdGg7Ci0JdW5zaWduZWQgcHJlZl9oZWlnaHQ7Ci0JYm9vbCBwcmVmX2FjdGl2ZTsKLQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcHJlZl9tb2RlOwotCiAJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmU7CiB9OwogCkBAIC03MSwyMCArNjUsNiBAQAogICogTGVnYWN5IERpc3BsYXkgVW5pdCBDUlRDIGZ1bmN0aW9ucwogICovCiAKLXN0YXRpYyB2b2lkIHZtd19sZHVfY3J0Y19zYXZlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLX0KLQotc3RhdGljIHZvaWQgdm13X2xkdV9jcnRjX3Jlc3RvcmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQotewotfQotCi1zdGF0aWMgdm9pZCB2bXdfbGR1X2NydGNfZ2FtbWFfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKLQkJCQkgICB1MTYgKnIsIHUxNiAqZywgdTE2ICpiLAotCQkJCSAgIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBzaXplKQotewotfQotCiBzdGF0aWMgdm9pZCB2bXdfbGR1X2NydGNfZGVzdHJveShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJdm13X2xkdV9kZXN0cm95KHZtd19jcnRjX3RvX2xkdShjcnRjKSk7CkBAIC0xMTQsMTAgKzk0LDggQEAKIAkJCXJldHVybiAwOwogCQlmYiA9IGVudHJ5LT5iYXNlLmNydGMuZmI7CiAKLQkJdm13X2ttc193cml0ZV9zdmdhKGRldl9wcml2LCB3LCBoLCBmYi0+cGl0Y2gsCi0JCQkJICAgZmItPmJpdHNfcGVyX3BpeGVsLCBmYi0+ZGVwdGgpOwotCi0JCXJldHVybiAwOworCQlyZXR1cm4gdm13X2ttc193cml0ZV9zdmdhKGRldl9wcml2LCB3LCBoLCBmYi0+cGl0Y2gsCisJCQkJCSAgZmItPmJpdHNfcGVyX3BpeGVsLCBmYi0+ZGVwdGgpOwogCX0KIAogCWlmICghbGlzdF9lbXB0eSgmbGRzLT5hY3RpdmUpKSB7CkBAIC0yNjUsOSArMjQzLDcgQEAKIAogCQl2bXdfbGR1X2RlbF9hY3RpdmUoZGV2X3ByaXYsIGxkdSk7CiAKLQkJdm13X2xkdV9jb21taXRfbGlzdChkZXZfcHJpdik7Ci0KLQkJcmV0dXJuIDA7CisJCXJldHVybiB2bXdfbGR1X2NvbW1pdF9saXN0KGRldl9wcml2KTsKIAl9CiAKIApAQCAtMjkyLDIxICsyNjgsMjAgQEAKIAogCXZtd19sZHVfYWRkX2FjdGl2ZShkZXZfcHJpdiwgbGR1LCB2ZmIpOwogCi0Jdm13X2xkdV9jb21taXRfbGlzdChkZXZfcHJpdik7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gdm13X2xkdV9jb21taXRfbGlzdChkZXZfcHJpdik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2NydGNfZnVuY3Mgdm13X2xlZ2FjeV9jcnRjX2Z1bmNzID0gewotCS5zYXZlID0gdm13X2xkdV9jcnRjX3NhdmUsCi0JLnJlc3RvcmUgPSB2bXdfbGR1X2NydGNfcmVzdG9yZSwKKwkuc2F2ZSA9IHZtd19kdV9jcnRjX3NhdmUsCisJLnJlc3RvcmUgPSB2bXdfZHVfY3J0Y19yZXN0b3JlLAogCS5jdXJzb3Jfc2V0ID0gdm13X2R1X2NydGNfY3Vyc29yX3NldCwKIAkuY3Vyc29yX21vdmUgPSB2bXdfZHVfY3J0Y19jdXJzb3JfbW92ZSwKLQkuZ2FtbWFfc2V0ID0gdm13X2xkdV9jcnRjX2dhbW1hX3NldCwKKwkuZ2FtbWFfc2V0ID0gdm13X2R1X2NydGNfZ2FtbWFfc2V0LAogCS5kZXN0cm95ID0gdm13X2xkdV9jcnRjX2Rlc3Ryb3ksCiAJLnNldF9jb25maWcgPSB2bXdfbGR1X2NydGNfc2V0X2NvbmZpZywKIH07CiAKKwogLyoKICAqIExlZ2FjeSBEaXNwbGF5IFVuaXQgZW5jb2RlciBmdW5jdGlvbnMKICAqLwpAQCAtMzI0LDE4MyArMjk5LDE4IEBACiAgKiBMZWdhY3kgRGlzcGxheSBVbml0IGNvbm5lY3RvciBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCB2bXdfbGR1X2Nvbm5lY3Rvcl9kcG1zKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCBtb2RlKQotewotfQotCi1zdGF0aWMgdm9pZCB2bXdfbGR1X2Nvbm5lY3Rvcl9zYXZlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHZtd19sZHVfY29ubmVjdG9yX3Jlc3RvcmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKLX0KLQotc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKLQl2bXdfbGR1X2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKLQkJCQkgYm9vbCBmb3JjZSkKLXsKLQlpZiAodm13X2Nvbm5lY3Rvcl90b19sZHUoY29ubmVjdG9yKS0+cHJlZl9hY3RpdmUpCi0JCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKLQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSB2bXdfbGR1X2Nvbm5lY3Rvcl9idWlsdGluW10gPSB7Ci0JLyogNjQweDQ4MEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiNjQweDQ4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyNTE3NSwgNjQwLCA2NTYsCi0JCSAgIDc1MiwgODAwLCAwLCA0ODAsIDQ4OSwgNDkyLCA1MjUsIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpIH0sCi0JLyogODAweDYwMEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiODAweDYwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA0MDAwMCwgODAwLCA4NDAsCi0JCSAgIDk2OCwgMTA1NiwgMCwgNjAwLCA2MDEsIDYwNSwgNjI4LCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAotCS8qIDEwMjR4NzY4QDYwSHogKi8KLQl7IERSTV9NT0RFKCIxMDI0eDc2OCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA2NTAwMCwgMTAyNCwgMTA0OCwKLQkJICAgMTE4NCwgMTM0NCwgMCwgNzY4LCA3NzEsIDc3NywgODA2LCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LAotCS8qIDExNTJ4ODY0QDc1SHogKi8KLQl7IERSTV9NT0RFKCIxMTUyeDg2NCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMDgwMDAsIDExNTIsIDEyMTYsCi0JCSAgIDEzNDQsIDE2MDAsIDAsIDg2NCwgODY1LCA4NjgsIDkwMCwgMCwKLQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxMjgweDc2OEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTI4MHg3NjgiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNzk1MDAsIDEyODAsIDEzNDQsCi0JCSAgIDE0NzIsIDE2NjQsIDAsIDc2OCwgNzcxLCA3NzgsIDc5OCwgMCwKLQkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxMjgweDgwMEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTI4MHg4MDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgODM1MDAsIDEyODAsIDEzNTIsCi0JCSAgIDE0ODAsIDE2ODAsIDAsIDgwMCwgODAzLCA4MDksIDgzMSwgMCwKLQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykgfSwKLQkvKiAxMjgweDk2MEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTI4MHg5NjAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCAxMjgwLCAxMzc2LAotCQkgICAxNDg4LCAxODAwLCAwLCA5NjAsIDk2MSwgOTY0LCAxMDAwLCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAotCS8qIDEyODB4MTAyNEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTI4MHgxMDI0IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEwODAwMCwgMTI4MCwgMTMyOCwKLQkJICAgMTQ0MCwgMTY4OCwgMCwgMTAyNCwgMTAyNSwgMTAyOCwgMTA2NiwgMCwKLQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxMzYweDc2OEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTM2MHg3NjgiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgODU1MDAsIDEzNjAsIDE0MjQsCi0JCSAgIDE1MzYsIDE3OTIsIDAsIDc2OCwgNzcxLCA3NzcsIDc5NSwgMCwKLQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxNDQweDEwNTBANjBIeiAqLwotCXsgRFJNX01PREUoIjE0MDB4MTA1MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMjE3NTAsIDE0MDAsIDE0ODgsCi0JCSAgIDE2MzIsIDE4NjQsIDAsIDEwNTAsIDEwNTMsIDEwNTcsIDEwODksIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogMTQ0MHg5MDBANjBIeiAqLwotCXsgRFJNX01PREUoIjE0NDB4OTAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEwNjUwMCwgMTQ0MCwgMTUyMCwKLQkJICAgMTY3MiwgMTkwNCwgMCwgOTAwLCA5MDMsIDkwOSwgOTM0LCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAotCS8qIDE2MDB4MTIwMEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTYwMHgxMjAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDE2MjAwMCwgMTYwMCwgMTY2NCwKLQkJICAgMTg1NiwgMjE2MCwgMCwgMTIwMCwgMTIwMSwgMTIwNCwgMTI1MCwgMCwKLQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxNjgweDEwNTBANjBIeiAqLwotCXsgRFJNX01PREUoIjE2ODB4MTA1MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxNDYyNTAsIDE2ODAsIDE3ODQsCi0JCSAgIDE5NjAsIDIyNDAsIDAsIDEwNTAsIDEwNTMsIDEwNTksIDEwODksIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogMTc5MngxMzQ0QDYwSHogKi8KLQl7IERSTV9NT0RFKCIxNzkyeDEzNDQiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjA0NzUwLCAxNzkyLCAxOTIwLAotCQkgICAyMTIwLCAyNDQ4LCAwLCAxMzQ0LCAxMzQ1LCAxMzQ4LCAxMzk0LCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAotCS8qIDE4NTN4MTM5MkA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTg1NngxMzkyIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDIxODI1MCwgMTg1NiwgMTk1MiwKLQkJICAgMjE3NiwgMjUyOCwgMCwgMTM5MiwgMTM5MywgMTM5NiwgMTQzOSwgMCwKLQkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxOTIweDEyMDBANjBIeiAqLwotCXsgRFJNX01PREUoIjE5MjB4MTIwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxOTMyNTAsIDE5MjAsIDIwNTYsCi0JCSAgIDIyNTYsIDI1OTIsIDAsIDEyMDAsIDEyMDMsIDEyMDksIDEyNDUsIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogMTkyMHgxNDQwQDYwSHogKi8KLQl7IERSTV9NT0RFKCIxOTIweDE0NDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjM0MDAwLCAxOTIwLCAyMDQ4LAotCQkgICAyMjU2LCAyNjAwLCAwLCAxNDQwLCAxNDQxLCAxNDQ0LCAxNTAwLCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAotCS8qIDI1NjB4MTYwMEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMjU2MHgxNjAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDM0ODUwMCwgMjU2MCwgMjc1MiwKLQkJICAgMzAzMiwgMzUwNCwgMCwgMTYwMCwgMTYwMywgMTYwOSwgMTY1OCwgMCwKLQkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiBUZXJtaW5hdGUgKi8KLQl7IERSTV9NT0RFKCIiLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSB9LAotfTsKLQotc3RhdGljIGludCB2bXdfbGR1X2Nvbm5lY3Rvcl9maWxsX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJCXVpbnQzMl90IG1heF93aWR0aCwgdWludDMyX3QgbWF4X2hlaWdodCkKLXsKLQlzdHJ1Y3Qgdm13X2xlZ2FjeV9kaXNwbGF5X3VuaXQgKmxkdSA9IHZtd19jb25uZWN0b3JfdG9fbGR1KGNvbm5lY3Rvcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwotCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOwotCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gTlVMTDsKLQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBwcmVmbW9kZSA9IHsgRFJNX01PREUoInByZWZlcnJlZCIsCi0JCURSTV9NT0RFX1RZUEVfRFJJVkVSIHwgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQsCi0JCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JCURSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpCi0JfTsKLQlpbnQgaTsKLQotCS8qIEFkZCBwcmVmZXJyZWQgbW9kZSAqLwotCXsKLQkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsICZwcmVmbW9kZSk7Ci0JCWlmICghbW9kZSkKLQkJCXJldHVybiAwOwotCQltb2RlLT5oZGlzcGxheSA9IGxkdS0+cHJlZl93aWR0aDsKLQkJbW9kZS0+dmRpc3BsYXkgPSBsZHUtPnByZWZfaGVpZ2h0OwotCQltb2RlLT52cmVmcmVzaCA9IGRybV9tb2RlX3ZyZWZyZXNoKG1vZGUpOwotCQlpZiAodm13X2ttc192YWxpZGF0ZV9tb2RlX3ZyYW0oZGV2X3ByaXYsIG1vZGUtPmhkaXNwbGF5ICogMiwKLQkJCQkJICAgICAgIG1vZGUtPnZkaXNwbGF5KSkgewotCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwotCi0JCQlpZiAobGR1LT5wcmVmX21vZGUpIHsKLQkJCQlsaXN0X2RlbF9pbml0KCZsZHUtPnByZWZfbW9kZS0+aGVhZCk7Ci0JCQkJZHJtX21vZGVfZGVzdHJveShkZXYsIGxkdS0+cHJlZl9tb2RlKTsKLQkJCX0KLQotCQkJbGR1LT5wcmVmX21vZGUgPSBtb2RlOwotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgdm13X2xkdV9jb25uZWN0b3JfYnVpbHRpbltpXS50eXBlICE9IDA7IGkrKykgewotCQljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYm1vZGU7Ci0KLQkJYm1vZGUgPSAmdm13X2xkdV9jb25uZWN0b3JfYnVpbHRpbltpXTsKLQkJaWYgKGJtb2RlLT5oZGlzcGxheSA+IG1heF93aWR0aCB8fAotCQkgICAgYm1vZGUtPnZkaXNwbGF5ID4gbWF4X2hlaWdodCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghdm13X2ttc192YWxpZGF0ZV9tb2RlX3ZyYW0oZGV2X3ByaXYsIGJtb2RlLT5oZGlzcGxheSAqIDIsCi0JCQkJCQlibW9kZS0+dmRpc3BsYXkpKQotCQkJY29udGludWU7Ci0KLQkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGJtb2RlKTsKLQkJaWYgKCFtb2RlKQotCQkJcmV0dXJuIDA7Ci0JCW1vZGUtPnZyZWZyZXNoID0gZHJtX21vZGVfdnJlZnJlc2gobW9kZSk7Ci0KLQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwotCX0KLQotCWRybV9tb2RlX2Nvbm5lY3Rvcl9saXN0X3VwZGF0ZShjb25uZWN0b3IpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdm13X2xkdV9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJCSAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCi0JCQkJCSAgdWludDY0X3QgdmFsKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCB2bXdfbGR1X2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJdm13X2xkdV9kZXN0cm95KHZtd19jb25uZWN0b3JfdG9fbGR1KGNvbm5lY3RvcikpOwogfQogCiBzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3Mgdm13X2xlZ2FjeV9jb25uZWN0b3JfZnVuY3MgPSB7Ci0JLmRwbXMgPSB2bXdfbGR1X2Nvbm5lY3Rvcl9kcG1zLAotCS5zYXZlID0gdm13X2xkdV9jb25uZWN0b3Jfc2F2ZSwKLQkucmVzdG9yZSA9IHZtd19sZHVfY29ubmVjdG9yX3Jlc3RvcmUsCi0JLmRldGVjdCA9IHZtd19sZHVfY29ubmVjdG9yX2RldGVjdCwKLQkuZmlsbF9tb2RlcyA9IHZtd19sZHVfY29ubmVjdG9yX2ZpbGxfbW9kZXMsCi0JLnNldF9wcm9wZXJ0eSA9IHZtd19sZHVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSwKKwkuZHBtcyA9IHZtd19kdV9jb25uZWN0b3JfZHBtcywKKwkuc2F2ZSA9IHZtd19kdV9jb25uZWN0b3Jfc2F2ZSwKKwkucmVzdG9yZSA9IHZtd19kdV9jb25uZWN0b3JfcmVzdG9yZSwKKwkuZGV0ZWN0ID0gdm13X2R1X2Nvbm5lY3Rvcl9kZXRlY3QsCisJLmZpbGxfbW9kZXMgPSB2bXdfZHVfY29ubmVjdG9yX2ZpbGxfbW9kZXMsCisJLnNldF9wcm9wZXJ0eSA9IHZtd19kdV9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5LAogCS5kZXN0cm95ID0gdm13X2xkdV9jb25uZWN0b3JfZGVzdHJveSwKIH07CiAKQEAgLTUyMywyMyArMzMzLDI2IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmbGR1LT5hY3RpdmUpOwogCi0JbGR1LT5wcmVmX2FjdGl2ZSA9ICh1bml0ID09IDApOwotCWxkdS0+cHJlZl93aWR0aCA9IDgwMDsKLQlsZHUtPnByZWZfaGVpZ2h0ID0gNjAwOwotCWxkdS0+cHJlZl9tb2RlID0gTlVMTDsKKwlsZHUtPmJhc2UucHJlZl9hY3RpdmUgPSAodW5pdCA9PSAwKTsKKwlsZHUtPmJhc2UucHJlZl93aWR0aCA9IDgwMDsKKwlsZHUtPmJhc2UucHJlZl9oZWlnaHQgPSA2MDA7CisJbGR1LT5iYXNlLnByZWZfbW9kZSA9IE5VTEw7CisJbGR1LT5iYXNlLmlzX2ltcGxpY2l0ID0gdHJ1ZTsKIAogCWRybV9jb25uZWN0b3JfaW5pdChkZXYsIGNvbm5lY3RvciwgJnZtd19sZWdhY3lfY29ubmVjdG9yX2Z1bmNzLAotCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpOwotCWNvbm5lY3Rvci0+c3RhdHVzID0gdm13X2xkdV9jb25uZWN0b3JfZGV0ZWN0KGNvbm5lY3RvciwgdHJ1ZSk7CisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfVklSVFVBTCk7CisJY29ubmVjdG9yLT5zdGF0dXMgPSB2bXdfZHVfY29ubmVjdG9yX2RldGVjdChjb25uZWN0b3IsIHRydWUpOwogCiAJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZ2bXdfbGVnYWN5X2VuY29kZXJfZnVuY3MsCi0JCQkgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKKwkJCSBEUk1fTU9ERV9FTkNPREVSX1ZJUlRVQUwpOwogCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOwogCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gKDEgPDwgdW5pdCk7CiAJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKIAogCWRybV9jcnRjX2luaXQoZGV2LCBjcnRjLCAmdm13X2xlZ2FjeV9jcnRjX2Z1bmNzKTsKIAorCWRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUoY3J0YywgMjU2KTsKKwogCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKIAkJCQkgICAgICBkZXYtPm1vZGVfY29uZmlnLmRpcnR5X2luZm9fcHJvcGVydHksCiAJCQkJICAgICAgMSk7CkBAIC01NTAsOCArMzYzLDcgQEAKIGludCB2bXdfa21zX2luaXRfbGVnYWN5X2Rpc3BsYXlfc3lzdGVtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Ci0JaW50IGk7Ci0JaW50IHJldDsKKwlpbnQgaSwgcmV0OwogCiAJaWYgKGRldl9wcml2LT5sZHVfcHJpdikgewogCQlEUk1fSU5GTygibGR1IHN5c3RlbSBhbHJlYWR5IG9uXG4iKTsKQEAgLTU1OSw3ICszNzEsNiBAQAogCX0KIAogCWRldl9wcml2LT5sZHVfcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpkZXZfcHJpdi0+bGR1X3ByaXYpLCBHRlBfS0VSTkVMKTsKLQogCWlmICghZGV2X3ByaXYtPmxkdV9wcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNTY4LDE4ICszNzksMzEgQEAKIAlkZXZfcHJpdi0+bGR1X3ByaXYtPmxhc3RfbnVtX2FjdGl2ZSA9IDA7CiAJZGV2X3ByaXYtPmxkdV9wcml2LT5mYiA9IE5VTEw7CiAKLQlkcm1fbW9kZV9jcmVhdGVfZGlydHlfaW5mb19wcm9wZXJ0eShkZXZfcHJpdi0+ZGV2KTsKLQotCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfTVVMVElNT04pIHsKLQkJZm9yIChpID0gMDsgaSA8IFZNV0dGWF9MRFVfTlVNX0RVOyArK2kpCi0JCQl2bXdfbGR1X2luaXQoZGV2X3ByaXYsIGkpOwotCQlyZXQgPSBkcm1fdmJsYW5rX2luaXQoZGV2LCBWTVdHRlhfTERVX05VTV9EVSk7Ci0JfSBlbHNlIHsKLQkJLyogZm9yIG9sZCBoYXJkd2FyZSB3aXRob3V0IG11bHRpbW9uIG9ubHkgZW5hYmxlIG9uZSBkaXNwbGF5ICovCi0JCXZtd19sZHVfaW5pdChkZXZfcHJpdiwgMCk7CisJLyogZm9yIG9sZCBoYXJkd2FyZSB3aXRob3V0IG11bHRpbW9uIG9ubHkgZW5hYmxlIG9uZSBkaXNwbGF5ICovCisJaWYgKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9NVUxUSU1PTikKKwkJcmV0ID0gZHJtX3ZibGFua19pbml0KGRldiwgVk1XR0ZYX05VTV9ESVNQTEFZX1VOSVRTKTsKKwllbHNlCiAJCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIDEpOwotCX0KKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZXJyX2ZyZWU7CiAKKwlyZXQgPSBkcm1fbW9kZV9jcmVhdGVfZGlydHlfaW5mb19wcm9wZXJ0eShkZXYpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBlcnJfdmJsYW5rX2NsZWFudXA7CisKKwlpZiAoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX01VTFRJTU9OKQorCQlmb3IgKGkgPSAwOyBpIDwgVk1XR0ZYX05VTV9ESVNQTEFZX1VOSVRTOyArK2kpCisJCQl2bXdfbGR1X2luaXQoZGV2X3ByaXYsIGkpOworCWVsc2UKKwkJdm13X2xkdV9pbml0KGRldl9wcml2LCAwKTsKKworCXJldHVybiAwOworCitlcnJfdmJsYW5rX2NsZWFudXA6CisJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CitlcnJfZnJlZToKKwlrZnJlZShkZXZfcHJpdi0+bGR1X3ByaXYpOworCWRldl9wcml2LT5sZHVfcHJpdiA9IE5VTEw7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTg3LDUyICs0MTEsMTQgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKIAotCWRybV92YmxhbmtfY2xlYW51cChkZXYpOwogCWlmICghZGV2X3ByaXYtPmxkdV9wcml2KQogCQlyZXR1cm4gLUVOT1NZUzsKIAorCWRybV92YmxhbmtfY2xlYW51cChkZXYpOworCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bGR1X3ByaXYtPmFjdGl2ZSkpOwogCiAJa2ZyZWUoZGV2X3ByaXYtPmxkdV9wcml2KTsKIAogCXJldHVybiAwOwogfQotCi1pbnQgdm13X2ttc19sZHVfdXBkYXRlX2xheW91dChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCB1bnNpZ25lZCBudW0sCi0JCQkgICAgICBzdHJ1Y3QgZHJtX3Ztd19yZWN0ICpyZWN0cykKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKLQlzdHJ1Y3Qgdm13X2xlZ2FjeV9kaXNwbGF5X3VuaXQgKmxkdTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29uOwotCWludCBpOwotCi0JbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7Ci0KLSNpZiAwCi0JRFJNX0lORk8oIiVzOiBuZXcgbGF5b3V0ICIsIF9fZnVuY19fKTsKLQlmb3IgKGkgPSAwOyBpIDwgKGludCludW07IGkrKykKLQkJRFJNX0lORk8oIiglaSwgJWkgJXV4JXUpICIsIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksCi0JCQkgcmVjdHNbaV0udywgcmVjdHNbaV0uaCk7Ci0JRFJNX0lORk8oIlxuIik7Ci0jZWxzZQotCSh2b2lkKWk7Ci0jZW5kaWYKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29uLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgewotCQlsZHUgPSB2bXdfY29ubmVjdG9yX3RvX2xkdShjb24pOwotCQlpZiAobnVtID4gbGR1LT5iYXNlLnVuaXQpIHsKLQkJCWxkdS0+cHJlZl93aWR0aCA9IHJlY3RzW2xkdS0+YmFzZS51bml0XS53OwotCQkJbGR1LT5wcmVmX2hlaWdodCA9IHJlY3RzW2xkdS0+YmFzZS51bml0XS5oOwotCQkJbGR1LT5wcmVmX2FjdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlsZHUtPnByZWZfd2lkdGggPSA4MDA7Ci0JCQlsZHUtPnByZWZfaGVpZ2h0ID0gNjAwOwotCQkJbGR1LT5wcmVmX2FjdGl2ZSA9IGZhbHNlOwotCQl9Ci0JCWNvbi0+c3RhdHVzID0gdm13X2xkdV9jb25uZWN0b3JfZGV0ZWN0KGNvbiwgdHJ1ZSk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfbWFya2VyLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9tYXJrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg3MjVjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X21hcmtlci5jCkBAIC0wLDAgKzEsMTcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgInZtd2dmeF9kcnYuaCIKKworc3RydWN0IHZtd19tYXJrZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwl1aW50MzJfdCBzZXFubzsKKwlzdHJ1Y3QgdGltZXNwZWMgc3VibWl0dGVkOworfTsKKwordm9pZCB2bXdfbWFya2VyX3F1ZXVlX2luaXQoc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlKQoreworCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+aGVhZCk7CisJcXVldWUtPmxhZyA9IG5zX3RvX3RpbWVzcGVjKDApOworCWdldHJhd21vbm90b25pYygmcXVldWUtPmxhZ190aW1lKTsKKwlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmxvY2spOworfQorCit2b2lkIHZtd19tYXJrZXJfcXVldWVfdGFrZWRvd24oc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlKQoreworCXN0cnVjdCB2bXdfbWFya2VyICptYXJrZXIsICpuZXh0OworCisJc3Bpbl9sb2NrKCZxdWV1ZS0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1hcmtlciwgbmV4dCwgJnF1ZXVlLT5oZWFkLCBoZWFkKSB7CisJCWtmcmVlKG1hcmtlcik7CisJfQorCXNwaW5fdW5sb2NrKCZxdWV1ZS0+bG9jayk7Cit9CisKK2ludCB2bXdfbWFya2VyX3B1c2goc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlLAorCQkgICB1aW50MzJfdCBzZXFubykKK3sKKwlzdHJ1Y3Qgdm13X21hcmtlciAqbWFya2VyID0ga21hbGxvYyhzaXplb2YoKm1hcmtlciksIEdGUF9LRVJORUwpOworCisJaWYgKHVubGlrZWx5KCFtYXJrZXIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hcmtlci0+c2Vxbm8gPSBzZXFubzsKKwlnZXRyYXdtb25vdG9uaWMoJm1hcmtlci0+c3VibWl0dGVkKTsKKwlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZtYXJrZXItPmhlYWQsICZxdWV1ZS0+aGVhZCk7CisJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgdm13X21hcmtlcl9wdWxsKHN0cnVjdCB2bXdfbWFya2VyX3F1ZXVlICpxdWV1ZSwKKwkJICAgdWludDMyX3Qgc2lnbmFsZWRfc2Vxbm8pCit7CisJc3RydWN0IHZtd19tYXJrZXIgKm1hcmtlciwgKm5leHQ7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwlib29sIHVwZGF0ZWQgPSBmYWxzZTsKKworCXNwaW5fbG9jaygmcXVldWUtPmxvY2spOworCWdldHJhd21vbm90b25pYygmbm93KTsKKworCWlmIChsaXN0X2VtcHR5KCZxdWV1ZS0+aGVhZCkpIHsKKwkJcXVldWUtPmxhZyA9IG5zX3RvX3RpbWVzcGVjKDApOworCQlxdWV1ZS0+bGFnX3RpbWUgPSBub3c7CisJCXVwZGF0ZWQgPSB0cnVlOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1hcmtlciwgbmV4dCwgJnF1ZXVlLT5oZWFkLCBoZWFkKSB7CisJCWlmIChzaWduYWxlZF9zZXFubyAtIG1hcmtlci0+c2Vxbm8gPiAoMSA8PCAzMCkpCisJCQljb250aW51ZTsKKworCQlxdWV1ZS0+bGFnID0gdGltZXNwZWNfc3ViKG5vdywgbWFya2VyLT5zdWJtaXR0ZWQpOworCQlxdWV1ZS0+bGFnX3RpbWUgPSBub3c7CisJCXVwZGF0ZWQgPSB0cnVlOworCQlsaXN0X2RlbCgmbWFya2VyLT5oZWFkKTsKKwkJa2ZyZWUobWFya2VyKTsKKwl9CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKworCXJldHVybiAodXBkYXRlZCkgPyAwIDogLUVCVVNZOworfQorCitzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHZtd190aW1lc3BlY19hZGQoc3RydWN0IHRpbWVzcGVjIHQxLAorCQkJCQlzdHJ1Y3QgdGltZXNwZWMgdDIpCit7CisJdDEudHZfc2VjICs9IHQyLnR2X3NlYzsKKwl0MS50dl9uc2VjICs9IHQyLnR2X25zZWM7CisJaWYgKHQxLnR2X25zZWMgPj0gMTAwMDAwMDAwMEwpIHsKKwkJdDEudHZfc2VjICs9IDE7CisJCXQxLnR2X25zZWMgLT0gMTAwMDAwMDAwMEw7CisJfQorCisJcmV0dXJuIHQxOworfQorCitzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHZtd19maWZvX2xhZyhzdHJ1Y3Qgdm13X21hcmtlcl9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKworCXNwaW5fbG9jaygmcXVldWUtPmxvY2spOworCWdldHJhd21vbm90b25pYygmbm93KTsKKwlxdWV1ZS0+bGFnID0gdm13X3RpbWVzcGVjX2FkZChxdWV1ZS0+bGFnLAorCQkJCSAgICAgIHRpbWVzcGVjX3N1Yihub3csIHF1ZXVlLT5sYWdfdGltZSkpOworCXF1ZXVlLT5sYWdfdGltZSA9IG5vdzsKKwlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOworCXJldHVybiBxdWV1ZS0+bGFnOworfQorCisKK3N0YXRpYyBib29sIHZtd19sYWdfbHQoc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlLAorCQkgICAgICAgdWludDMyX3QgdXMpCit7CisJc3RydWN0IHRpbWVzcGVjIGxhZywgY29uZDsKKworCWNvbmQgPSBuc190b190aW1lc3BlYygoczY0KSB1cyAqIDEwMDApOworCWxhZyA9IHZtd19maWZvX2xhZyhxdWV1ZSk7CisJcmV0dXJuICh0aW1lc3BlY19jb21wYXJlKCZsYWcsICZjb25kKSA8IDEpOworfQorCitpbnQgdm13X3dhaXRfbGFnKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSBzdHJ1Y3Qgdm13X21hcmtlcl9xdWV1ZSAqcXVldWUsIHVpbnQzMl90IHVzKQoreworCXN0cnVjdCB2bXdfbWFya2VyICptYXJrZXI7CisJdWludDMyX3Qgc2Vxbm87CisJaW50IHJldDsKKworCXdoaWxlICghdm13X2xhZ19sdChxdWV1ZSwgdXMpKSB7CisJCXNwaW5fbG9jaygmcXVldWUtPmxvY2spOworCQlpZiAobGlzdF9lbXB0eSgmcXVldWUtPmhlYWQpKQorCQkJc2Vxbm8gPSBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1hcmtlcl9zZXEpOworCQllbHNlIHsKKwkJCW1hcmtlciA9IGxpc3RfZmlyc3RfZW50cnkoJnF1ZXVlLT5oZWFkLAorCQkJCQkJIHN0cnVjdCB2bXdfbWFya2VyLCBoZWFkKTsKKwkJCXNlcW5vID0gbWFya2VyLT5zZXFubzsKKwkJfQorCQlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOworCisJCXJldCA9IHZtd193YWl0X3NlcW5vKGRldl9wcml2LCBmYWxzZSwgc2Vxbm8sIHRydWUsCisJCQkJCTMqSFopOworCisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlyZXR1cm4gcmV0OworCisJCSh2b2lkKSB2bXdfbWFya2VyX3B1bGwocXVldWUsIHNlcW5vKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9vdmVybGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9vdmVybGF5LmMKaW5kZXggMDdjZTAyZC4uMTQzOTllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfb3ZlcmxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X292ZXJsYXkuYwpAQCAtODcsNDggKzg3LDYgQEAKIH0KIAogLyoqCi0gKiBQaW4gb3IgdW5waW4gYSBidWZmZXIgaW4gdnJhbS4KLSAqCi0gKiBAZGV2X3ByaXY6ICBEcml2ZXIgcHJpdmF0ZS4KLSAqIEBidWY6ICBETUEgYnVmZmVyIHRvIHBpbiBvciB1bnBpbi4KLSAqIEBwaW46ICBQaW4gYnVmZmVyIGluIHZyYW0gaWYgdHJ1ZS4KLSAqIEBpbnRlcnJ1cHRpYmxlOiAgVXNlIGludGVycnVwdGlibGUgd2FpdC4KLSAqCi0gKiBUYWtlcyB0aGUgY3VycmVudCBtYXN0ZXJzIHR0bSBsb2NrIGluIHJlYWQuCi0gKgotICogUmV0dXJucwotICogLUVSRVNUQVJUU1lTIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgotICovCi1zdGF0aWMgaW50IHZtd19kbWFidWZfcGluX2luX3ZyYW0oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKLQkJCQkgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYnVmLAotCQkJCSAgYm9vbCBwaW4sIGJvb2wgaW50ZXJydXB0aWJsZSkKLXsKLQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gJmJ1Zi0+YmFzZTsKLQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqb3ZlcmxheV9wbGFjZW1lbnQgPSAmdm13X3ZyYW1fcGxhY2VtZW50OwotCWludCByZXQ7Ci0KLQlyZXQgPSB0dG1fcmVhZF9sb2NrKCZkZXZfcHJpdi0+YWN0aXZlX21hc3Rlci0+bG9jaywgaW50ZXJydXB0aWJsZSk7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSwgZmFsc2UsIDApOwotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCWdvdG8gZXJyOwotCi0JaWYgKHBpbikKLQkJb3ZlcmxheV9wbGFjZW1lbnQgPSAmdm13X3ZyYW1fbmVfcGxhY2VtZW50OwotCi0JcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCBvdmVybGF5X3BsYWNlbWVudCwgaW50ZXJydXB0aWJsZSwgZmFsc2UsIGZhbHNlKTsKLQotCXR0bV9ib191bnJlc2VydmUoYm8pOwotCi1lcnI6Ci0JdHRtX3JlYWRfdW5sb2NrKCZkZXZfcHJpdi0+YWN0aXZlX21hc3Rlci0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKICAqIFNlbmQgcHV0IGNvbW1hbmQgdG8gaHcuCiAgKgogICogUmV0dXJucwpAQCAtMTM5LDY4ICs5Nyw4MCBAQAogCQkJCXN0cnVjdCBkcm1fdm13X2NvbnRyb2xfc3RyZWFtX2FyZyAqYXJnLAogCQkJCWJvb2wgaW50ZXJydXB0aWJsZSkKIHsKKwlzdHJ1Y3Qgdm13X2VzY2FwZV92aWRlb19mbHVzaCAqZmx1c2g7CisJc2l6ZV90IGZpZm9fc2l6ZTsKKwlib29sIGhhdmVfc28gPSBkZXZfcHJpdi0+c291X3ByaXYgPyB0cnVlIDogZmFsc2U7CisJaW50IGksIG51bV9pdGVtczsKKwlTVkdBR3Vlc3RQdHIgcHRyOworCiAJc3RydWN0IHsKIAkJc3RydWN0IHZtd19lc2NhcGVfaGVhZGVyIGVzY2FwZTsKIAkJc3RydWN0IHsKLQkJCXN0cnVjdCB7Ci0JCQkJdWludDMyX3QgY21kVHlwZTsKLQkJCQl1aW50MzJfdCBzdHJlYW1JZDsKLQkJCX0gaGVhZGVyOwotCQkJc3RydWN0IHsKLQkJCQl1aW50MzJfdCByZWdpc3RlcklkOwotCQkJCXVpbnQzMl90IHZhbHVlOwotCQkJfSBpdGVtc1tTVkdBX1ZJREVPX1BJVENIXzMgKyAxXTsKLQkJfSBib2R5OwotCQlzdHJ1Y3Qgdm13X2VzY2FwZV92aWRlb19mbHVzaCBmbHVzaDsKKwkJCXVpbnQzMl90IGNtZFR5cGU7CisJCQl1aW50MzJfdCBzdHJlYW1JZDsKKwkJfSBoZWFkZXI7CiAJfSAqY21kczsKLQl1aW50MzJfdCBvZmZzZXQ7Ci0JaW50IGksIHJldDsKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCByZWdpc3RlcklkOworCQl1aW50MzJfdCB2YWx1ZTsKKwl9ICppdGVtczsKIAotCWZvciAoOzspIHsKLQkJY21kcyA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kcykpOwotCQlpZiAoY21kcykKLQkJCWJyZWFrOworCS8qIGRlZmluZXMgYXJlIGEgaW5kZXggbmVlZHMgKyAxICovCisJaWYgKGhhdmVfc28pCisJCW51bV9pdGVtcyA9IFNWR0FfVklERU9fRFNUX1NDUkVFTl9JRCArIDE7CisJZWxzZQorCQludW1faXRlbXMgPSBTVkdBX1ZJREVPX1BJVENIXzMgKyAxOwogCi0JCXJldCA9IHZtd19mYWxsYmFja193YWl0KGRldl9wcml2LCBmYWxzZSwgdHJ1ZSwgMCwKLQkJCQkJaW50ZXJydXB0aWJsZSwgMypIWik7Ci0JCWlmIChpbnRlcnJ1cHRpYmxlICYmIHJldCA9PSAtRVJFU1RBUlRTWVMpCi0JCQlyZXR1cm4gcmV0OwotCQllbHNlCi0JCQlCVUdfT04ocmV0ICE9IDApOworCWZpZm9fc2l6ZSA9IHNpemVvZigqY21kcykgKyBzaXplb2YoKmZsdXNoKSArIHNpemVvZigqaXRlbXMpICogbnVtX2l0ZW1zOworCisJY21kcyA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIGZpZm9fc2l6ZSk7CisJLyogaGFyZHdhcmUgaGFzIGh1bmcsIGNhbid0IGRvIGFueXRoaW5nIGhlcmUgKi8KKwlpZiAoIWNtZHMpCisJCXJldHVybiAtRU5PTUVNOworCisJaXRlbXMgPSAodHlwZW9mKGl0ZW1zKSkmY21kc1sxXTsKKwlmbHVzaCA9IChzdHJ1Y3Qgdm13X2VzY2FwZV92aWRlb19mbHVzaCAqKSZpdGVtc1tudW1faXRlbXNdOworCisJLyogdGhlIHNpemUgaXMgaGVhZGVyICsgbnVtYmVyIG9mIGl0ZW1zICovCisJZmlsbF9lc2NhcGUoJmNtZHMtPmVzY2FwZSwgc2l6ZW9mKCppdGVtcykgKiAobnVtX2l0ZW1zICsgMSkpOworCisJY21kcy0+aGVhZGVyLmNtZFR5cGUgPSBTVkdBX0VTQ0FQRV9WTVdBUkVfVklERU9fU0VUX1JFR1M7CisJY21kcy0+aGVhZGVyLnN0cmVhbUlkID0gYXJnLT5zdHJlYW1faWQ7CisKKwkvKiB0aGUgSURzIGFyZSBuZWF0bHkgbnVtYmVyZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2l0ZW1zOyBpKyspCisJCWl0ZW1zW2ldLnJlZ2lzdGVySWQgPSBpOworCisJdm13X2JvX2dldF9ndWVzdF9wdHIoJmJ1Zi0+YmFzZSwgJnB0cik7CisJcHRyLm9mZnNldCArPSBhcmctPm9mZnNldDsKKworCWl0ZW1zW1NWR0FfVklERU9fRU5BQkxFRF0udmFsdWUgICAgID0gdHJ1ZTsKKwlpdGVtc1tTVkdBX1ZJREVPX0ZMQUdTXS52YWx1ZSAgICAgICA9IGFyZy0+ZmxhZ3M7CisJaXRlbXNbU1ZHQV9WSURFT19EQVRBX09GRlNFVF0udmFsdWUgPSBwdHIub2Zmc2V0OworCWl0ZW1zW1NWR0FfVklERU9fRk9STUFUXS52YWx1ZSAgICAgID0gYXJnLT5mb3JtYXQ7CisJaXRlbXNbU1ZHQV9WSURFT19DT0xPUktFWV0udmFsdWUgICAgPSBhcmctPmNvbG9yX2tleTsKKwlpdGVtc1tTVkdBX1ZJREVPX1NJWkVdLnZhbHVlICAgICAgICA9IGFyZy0+c2l6ZTsKKwlpdGVtc1tTVkdBX1ZJREVPX1dJRFRIXS52YWx1ZSAgICAgICA9IGFyZy0+d2lkdGg7CisJaXRlbXNbU1ZHQV9WSURFT19IRUlHSFRdLnZhbHVlICAgICAgPSBhcmctPmhlaWdodDsKKwlpdGVtc1tTVkdBX1ZJREVPX1NSQ19YXS52YWx1ZSAgICAgICA9IGFyZy0+c3JjLng7CisJaXRlbXNbU1ZHQV9WSURFT19TUkNfWV0udmFsdWUgICAgICAgPSBhcmctPnNyYy55OworCWl0ZW1zW1NWR0FfVklERU9fU1JDX1dJRFRIXS52YWx1ZSAgID0gYXJnLT5zcmMudzsKKwlpdGVtc1tTVkdBX1ZJREVPX1NSQ19IRUlHSFRdLnZhbHVlICA9IGFyZy0+c3JjLmg7CisJaXRlbXNbU1ZHQV9WSURFT19EU1RfWF0udmFsdWUgICAgICAgPSBhcmctPmRzdC54OworCWl0ZW1zW1NWR0FfVklERU9fRFNUX1ldLnZhbHVlICAgICAgID0gYXJnLT5kc3QueTsKKwlpdGVtc1tTVkdBX1ZJREVPX0RTVF9XSURUSF0udmFsdWUgICA9IGFyZy0+ZHN0Lnc7CisJaXRlbXNbU1ZHQV9WSURFT19EU1RfSEVJR0hUXS52YWx1ZSAgPSBhcmctPmRzdC5oOworCWl0ZW1zW1NWR0FfVklERU9fUElUQ0hfMV0udmFsdWUgICAgID0gYXJnLT5waXRjaFswXTsKKwlpdGVtc1tTVkdBX1ZJREVPX1BJVENIXzJdLnZhbHVlICAgICA9IGFyZy0+cGl0Y2hbMV07CisJaXRlbXNbU1ZHQV9WSURFT19QSVRDSF8zXS52YWx1ZSAgICAgPSBhcmctPnBpdGNoWzJdOworCWlmIChoYXZlX3NvKSB7CisJCWl0ZW1zW1NWR0FfVklERU9fREFUQV9HTVJJRF0udmFsdWUgICAgPSBwdHIuZ21ySWQ7CisJCWl0ZW1zW1NWR0FfVklERU9fRFNUX1NDUkVFTl9JRF0udmFsdWUgPSBTVkdBX0lEX0lOVkFMSUQ7CiAJfQogCi0JZmlsbF9lc2NhcGUoJmNtZHMtPmVzY2FwZSwgc2l6ZW9mKGNtZHMtPmJvZHkpKTsKLQljbWRzLT5ib2R5LmhlYWRlci5jbWRUeXBlID0gU1ZHQV9FU0NBUEVfVk1XQVJFX1ZJREVPX1NFVF9SRUdTOwotCWNtZHMtPmJvZHkuaGVhZGVyLnN0cmVhbUlkID0gYXJnLT5zdHJlYW1faWQ7CisJZmlsbF9mbHVzaChmbHVzaCwgYXJnLT5zdHJlYW1faWQpOwogCi0JZm9yIChpID0gMDsgaSA8PSBTVkdBX1ZJREVPX1BJVENIXzM7IGkrKykKLQkJY21kcy0+Ym9keS5pdGVtc1tpXS5yZWdpc3RlcklkID0gaTsKLQotCW9mZnNldCA9IGJ1Zi0+YmFzZS5vZmZzZXQgKyBhcmctPm9mZnNldDsKLQotCWNtZHMtPmJvZHkuaXRlbXNbU1ZHQV9WSURFT19FTkFCTEVEXS52YWx1ZSAgICAgPSB0cnVlOwotCWNtZHMtPmJvZHkuaXRlbXNbU1ZHQV9WSURFT19GTEFHU10udmFsdWUgICAgICAgPSBhcmctPmZsYWdzOwotCWNtZHMtPmJvZHkuaXRlbXNbU1ZHQV9WSURFT19EQVRBX09GRlNFVF0udmFsdWUgPSBvZmZzZXQ7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX0ZPUk1BVF0udmFsdWUgICAgICA9IGFyZy0+Zm9ybWF0OwotCWNtZHMtPmJvZHkuaXRlbXNbU1ZHQV9WSURFT19DT0xPUktFWV0udmFsdWUgICAgPSBhcmctPmNvbG9yX2tleTsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fU0laRV0udmFsdWUgICAgICAgID0gYXJnLT5zaXplOwotCWNtZHMtPmJvZHkuaXRlbXNbU1ZHQV9WSURFT19XSURUSF0udmFsdWUgICAgICAgPSBhcmctPndpZHRoOwotCWNtZHMtPmJvZHkuaXRlbXNbU1ZHQV9WSURFT19IRUlHSFRdLnZhbHVlICAgICAgPSBhcmctPmhlaWdodDsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fU1JDX1hdLnZhbHVlICAgICAgID0gYXJnLT5zcmMueDsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fU1JDX1ldLnZhbHVlICAgICAgID0gYXJnLT5zcmMueTsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fU1JDX1dJRFRIXS52YWx1ZSAgID0gYXJnLT5zcmMudzsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fU1JDX0hFSUdIVF0udmFsdWUgID0gYXJnLT5zcmMuaDsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fRFNUX1hdLnZhbHVlICAgICAgID0gYXJnLT5kc3QueDsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fRFNUX1ldLnZhbHVlICAgICAgID0gYXJnLT5kc3QueTsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fRFNUX1dJRFRIXS52YWx1ZSAgID0gYXJnLT5kc3QudzsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fRFNUX0hFSUdIVF0udmFsdWUgID0gYXJnLT5kc3QuaDsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fUElUQ0hfMV0udmFsdWUgICAgID0gYXJnLT5waXRjaFswXTsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fUElUQ0hfMl0udmFsdWUgICAgID0gYXJnLT5waXRjaFsxXTsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fUElUQ0hfM10udmFsdWUgICAgID0gYXJnLT5waXRjaFsyXTsKLQotCWZpbGxfZmx1c2goJmNtZHMtPmZsdXNoLCBhcmctPnN0cmVhbV9pZCk7Ci0KLQl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHNpemVvZigqY21kcykpOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgZmlmb19zaXplKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQ4LDYgKzIxOCwyNSBAQAogfQogCiAvKioKKyAqIE1vdmUgYSBidWZmZXIgdG8gdnJhbSBvciBnbXIgaWYgQHBpbiBpcyBzZXQsIGVsc2UgdW5waW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBXaXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygc2NyZWVuIG9iamVjdHMgYnVmZmVycyBjb3VsZCBub3cgYmUKKyAqIHVzZWQgd2l0aCBHTVJzIGluc3RlYWQgb2YgYmVpbmcgbG9ja2VkIHRvIHZyYW0uCisgKi8KK3N0YXRpYyBpbnQgdm13X292ZXJsYXlfbW92ZV9idWZmZXIoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZiwKKwkJCQkgICBib29sIHBpbiwgYm9vbCBpbnRlcikKK3sKKwlpZiAoIXBpbikKKwkJcmV0dXJuIHZtd19kbWFidWZfdW5waW4oZGV2X3ByaXYsIGJ1ZiwgaW50ZXIpOworCisJaWYgKCFkZXZfcHJpdi0+c291X3ByaXYpCisJCXJldHVybiB2bXdfZG1hYnVmX3RvX3ZyYW0oZGV2X3ByaXYsIGJ1ZiwgdHJ1ZSwgaW50ZXIpOworCisJcmV0dXJuIHZtd19kbWFidWZfdG9fdnJhbV9vcl9nbXIoZGV2X3ByaXYsIGJ1ZiwgdHJ1ZSwgaW50ZXIpOworfQorCisvKioKICAqIFN0b3Agb3IgcGF1c2UgYSBzdHJlYW0uCiAgKgogICogSWYgdGhlIHN0cmVhbSBpcyBwYXVzZWQgdGhlIG5vIGV2aWN0IGZsYWcgaXMgcmVtb3ZlZCBmcm9tIHRoZSBidWZmZXIKQEAgLTI3OSw4ICsyNjgsOCBAQAogCQkJcmV0dXJuIHJldDsKIAogCQkvKiBXZSBqdXN0IHJlbW92ZSB0aGUgTk9fRVZJQ1QgZmxhZyBzbyBubyAtRU5PTUVNICovCi0JCXJldCA9IHZtd19kbWFidWZfcGluX2luX3ZyYW0oZGV2X3ByaXYsIHN0cmVhbS0+YnVmLCBmYWxzZSwKLQkJCQkJICAgICBpbnRlcnJ1cHRpYmxlKTsKKwkJcmV0ID0gdm13X292ZXJsYXlfbW92ZV9idWZmZXIoZGV2X3ByaXYsIHN0cmVhbS0+YnVmLCBmYWxzZSwKKwkJCQkJICAgICAgaW50ZXJydXB0aWJsZSk7CiAJCWlmIChpbnRlcnJ1cHRpYmxlICYmIHJldCA9PSAtRVJFU1RBUlRTWVMpCiAJCQlyZXR1cm4gcmV0OwogCQllbHNlCkBAIC0zNDIsNyArMzMxLDcgQEAKIAkvKiBXZSBkb24ndCBzdGFydCB0aGUgb2xkIHN0cmVhbSBpZiB3ZSBhcmUgaW50ZXJydXB0ZWQuCiAJICogTWlnaHQgcmV0dXJuIC1FTk9NRU0gaWYgaXQgY2FuJ3QgZml0IHRoZSBidWZmZXIgaW4gdnJhbS4KIAkgKi8KLQlyZXQgPSB2bXdfZG1hYnVmX3Bpbl9pbl92cmFtKGRldl9wcml2LCBidWYsIHRydWUsIGludGVycnVwdGlibGUpOworCXJldCA9IHZtd19vdmVybGF5X21vdmVfYnVmZmVyKGRldl9wcml2LCBidWYsIHRydWUsIGludGVycnVwdGlibGUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTM1MSw3ICszNDAsOCBAQAogCQkvKiBUaGlzIG9uZSBuZWVkcyB0byBoYXBwZW4gbm8gbWF0dGVyIHdoYXQuIFdlIG9ubHkgcmVtb3ZlCiAJCSAqIHRoZSBOT19FVklDVCBmbGFnIHNvIHRoaXMgaXMgc2FmZSBmcm9tIC1FTk9NRU0uCiAJCSAqLwotCQlCVUdfT04odm13X2RtYWJ1Zl9waW5faW5fdnJhbShkZXZfcHJpdiwgYnVmLCBmYWxzZSwgZmFsc2UpICE9IDApOworCQlCVUdfT04odm13X292ZXJsYXlfbW92ZV9idWZmZXIoZGV2X3ByaXYsIGJ1ZiwgZmFsc2UsIGZhbHNlKQorCQkgICAgICAgIT0gMCk7CiAJCXJldHVybiByZXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9yZXNvdXJjZS5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYwppbmRleCBiZmUxYmNjLi44NmM1ZTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9yZXNvdXJjZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3Jlc291cmNlLmMKQEAgLTMxLDEwICszMSw2IEBACiAjaW5jbHVkZSAidHRtL3R0bV9wbGFjZW1lbnQuaCIKICNpbmNsdWRlICJkcm1QLmgiCiAKLSNkZWZpbmUgVk1XX1JFU19DT05URVhUIHR0bV9kcml2ZXJfdHlwZTAKLSNkZWZpbmUgVk1XX1JFU19TVVJGQUNFIHR0bV9kcml2ZXJfdHlwZTEKLSNkZWZpbmUgVk1XX1JFU19TVFJFQU0gdHRtX2RyaXZlcl90eXBlMgotCiBzdHJ1Y3Qgdm13X3VzZXJfY29udGV4dCB7CiAJc3RydWN0IHR0bV9iYXNlX29iamVjdCBiYXNlOwogCXN0cnVjdCB2bXdfcmVzb3VyY2UgcmVzOwpAQCAtNDMsNiArMzksNyBAQAogc3RydWN0IHZtd191c2VyX3N1cmZhY2UgewogCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgYmFzZTsKIAlzdHJ1Y3Qgdm13X3N1cmZhY2Ugc3JmOworCXVpbnQzMl90IHNpemU7CiB9OwogCiBzdHJ1Y3Qgdm13X3VzZXJfZG1hX2J1ZmZlciB7CkBAIC02NSw2ICs2MiwxNyBAQAogCXN0cnVjdCB2bXdfc3RyZWFtIHN0cmVhbTsKIH07CiAKK3N0cnVjdCB2bXdfc3VyZmFjZV9vZmZzZXQgeworCXVpbnQzMl90IGZhY2U7CisJdWludDMyX3QgbWlwOworCXVpbnQzMl90IGJvX29mZnNldDsKK307CisKKworc3RhdGljIHVpbnQ2NF90IHZtd191c2VyX2NvbnRleHRfc2l6ZTsKK3N0YXRpYyB1aW50NjRfdCB2bXdfdXNlcl9zdXJmYWNlX3NpemU7CitzdGF0aWMgdWludDY0X3Qgdm13X3VzZXJfc3RyZWFtX3NpemU7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHZtd19kbWFfYnVmZmVyICoKIHZtd19kbWFfYnVmZmVyKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCiB7CkBAIC04NCwxMyArOTIsMzYgQEAKIAlyZXR1cm4gcmVzOwogfQogCisKKy8qKgorICogdm13X3Jlc291cmNlX3JlbGVhc2VfaWQgLSByZWxlYXNlIGEgcmVzb3VyY2UgaWQgdG8gdGhlIGlkIG1hbmFnZXIuCisgKgorICogQHJlczogUG9pbnRlciB0byB0aGUgcmVzb3VyY2UuCisgKgorICogUmVsZWFzZSB0aGUgcmVzb3VyY2UgaWQgdG8gdGhlIHJlc291cmNlIGlkIG1hbmFnZXIgYW5kIHNldCBpdCB0byAtMQorICovCitzdGF0aWMgdm9pZCB2bXdfcmVzb3VyY2VfcmVsZWFzZV9pZChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHJlcy0+ZGV2X3ByaXY7CisKKwl3cml0ZV9sb2NrKCZkZXZfcHJpdi0+cmVzb3VyY2VfbG9jayk7CisJaWYgKHJlcy0+aWQgIT0gLTEpCisJCWlkcl9yZW1vdmUocmVzLT5pZHIsIHJlcy0+aWQpOworCXJlcy0+aWQgPSAtMTsKKwl3cml0ZV91bmxvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKK30KKwogc3RhdGljIHZvaWQgdm13X3Jlc291cmNlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCiB7CiAJc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzID0KIAkgICAgY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB2bXdfcmVzb3VyY2UsIGtyZWYpOwogCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSByZXMtPmRldl9wcml2OworCWludCBpZCA9IHJlcy0+aWQ7CisJc3RydWN0IGlkciAqaWRyID0gcmVzLT5pZHI7CiAKLQlpZHJfcmVtb3ZlKHJlcy0+aWRyLCByZXMtPmlkKTsKKwlyZXMtPmF2YWlsID0gZmFsc2U7CisJaWYgKHJlcy0+cmVtb3ZlX2Zyb21fbGlzdHMgIT0gTlVMTCkKKwkJcmVzLT5yZW1vdmVfZnJvbV9saXN0cyhyZXMpOwogCXdyaXRlX3VubG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOwogCiAJaWYgKGxpa2VseShyZXMtPmh3X2Rlc3Ryb3kgIT0gTlVMTCkpCkBAIC0xMDIsNiArMTMzLDkgQEAKIAkJa2ZyZWUocmVzKTsKIAogCXdyaXRlX2xvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKKworCWlmIChpZCAhPSAtMSkKKwkJaWRyX3JlbW92ZShpZHIsIGlkKTsKIH0KIAogdm9pZCB2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2Uoc3RydWN0IHZtd19yZXNvdXJjZSAqKnBfcmVzKQpAQCAtMTE1LDI4ICsxNDksMjkgQEAKIAl3cml0ZV91bmxvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKIH0KIAotc3RhdGljIGludCB2bXdfcmVzb3VyY2VfaW5pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICAgICBzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsCi0JCQkgICAgIHN0cnVjdCBpZHIgKmlkciwKLQkJCSAgICAgZW51bSB0dG1fb2JqZWN0X3R5cGUgb2JqX3R5cGUsCi0JCQkgICAgIHZvaWQgKCpyZXNfZnJlZSkgKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykpCisKKy8qKgorICogdm13X3Jlc291cmNlX2FsbG9jX2lkIC0gcmVsZWFzZSBhIHJlc291cmNlIGlkIHRvIHRoZSBpZCBtYW5hZ2VyLgorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byB0aGUgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgorICogQHJlczogUG9pbnRlciB0byB0aGUgcmVzb3VyY2UuCisgKgorICogQWxsb2NhdGUgdGhlIGxvd2VzdCBmcmVlIHJlc291cmNlIGZyb20gdGhlIHJlc291cmNlIG1hbmFnZXIsIGFuZCBzZXQKKyAqIEByZXMtPmlkIHRvIHRoYXQgaWQuIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCAtRU5PTUVNIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgdm13X3Jlc291cmNlX2FsbG9jX2lkKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJIHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykKIHsKIAlpbnQgcmV0OwogCi0Ja3JlZl9pbml0KCZyZXMtPmtyZWYpOwotCXJlcy0+aHdfZGVzdHJveSA9IE5VTEw7Ci0JcmVzLT5yZXNfZnJlZSA9IHJlc19mcmVlOwotCXJlcy0+cmVzX3R5cGUgPSBvYmpfdHlwZTsKLQlyZXMtPmlkciA9IGlkcjsKLQlyZXMtPmF2YWlsID0gZmFsc2U7Ci0JcmVzLT5kZXZfcHJpdiA9IGRldl9wcml2OworCUJVR19PTihyZXMtPmlkICE9IC0xKTsKIAogCWRvIHsKLQkJaWYgKHVubGlrZWx5KGlkcl9wcmVfZ2V0KGlkciwgR0ZQX0tFUk5FTCkgPT0gMCkpCisJCWlmICh1bmxpa2VseShpZHJfcHJlX2dldChyZXMtPmlkciwgR0ZQX0tFUk5FTCkgPT0gMCkpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAogCQl3cml0ZV9sb2NrKCZkZXZfcHJpdi0+cmVzb3VyY2VfbG9jayk7Ci0JCXJldCA9IGlkcl9nZXRfbmV3X2Fib3ZlKGlkciwgcmVzLCAxLCAmcmVzLT5pZCk7CisJCXJldCA9IGlkcl9nZXRfbmV3X2Fib3ZlKHJlcy0+aWRyLCByZXMsIDEsICZyZXMtPmlkKTsKIAkJd3JpdGVfdW5sb2NrKCZkZXZfcHJpdi0+cmVzb3VyY2VfbG9jayk7CiAKIAl9IHdoaWxlIChyZXQgPT0gLUVBR0FJTik7CkBAIC0xNDQsNiArMTc5LDMzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorCitzdGF0aWMgaW50IHZtd19yZXNvdXJjZV9pbml0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgIHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcywKKwkJCSAgICAgc3RydWN0IGlkciAqaWRyLAorCQkJICAgICBlbnVtIHR0bV9vYmplY3RfdHlwZSBvYmpfdHlwZSwKKwkJCSAgICAgYm9vbCBkZWxheV9pZCwKKwkJCSAgICAgdm9pZCAoKnJlc19mcmVlKSAoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKSwKKwkJCSAgICAgdm9pZCAoKnJlbW92ZV9mcm9tX2xpc3RzKQorCQkJICAgICAoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKSkKK3sKKwlrcmVmX2luaXQoJnJlcy0+a3JlZik7CisJcmVzLT5od19kZXN0cm95ID0gTlVMTDsKKwlyZXMtPnJlc19mcmVlID0gcmVzX2ZyZWU7CisJcmVzLT5yZW1vdmVfZnJvbV9saXN0cyA9IHJlbW92ZV9mcm9tX2xpc3RzOworCXJlcy0+cmVzX3R5cGUgPSBvYmpfdHlwZTsKKwlyZXMtPmlkciA9IGlkcjsKKwlyZXMtPmF2YWlsID0gZmFsc2U7CisJcmVzLT5kZXZfcHJpdiA9IGRldl9wcml2OworCUlOSVRfTElTVF9IRUFEKCZyZXMtPnF1ZXJ5X2hlYWQpOworCUlOSVRfTElTVF9IRUFEKCZyZXMtPnZhbGlkYXRlX2hlYWQpOworCXJlcy0+aWQgPSAtMTsKKwlpZiAoZGVsYXlfaWQpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIHZtd19yZXNvdXJjZV9hbGxvY19pZChkZXZfcHJpdiwgcmVzKTsKK30KKwogLyoqCiAgKiB2bXdfcmVzb3VyY2VfYWN0aXZhdGUKICAqCkBAIC0xOTgsOCArMjYwLDEyIEBACiAJc3RydWN0IHsKIAkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKIAkJU1ZHQTNkQ21kRGVzdHJveUNvbnRleHQgYm9keTsKLQl9ICpjbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOworCX0gKmNtZDsKIAorCisJdm13X2V4ZWNidWZfcmVsZWFzZV9waW5uZWRfYm8oZGV2X3ByaXYsIHRydWUsIHJlcy0+aWQpOworCisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKIAlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBzdXJmYWNlICIKIAkJCSAgImRlc3RydWN0aW9uLlxuIik7CkBAIC0yMTEsNyArMjc3LDcgQEAKIAljbWQtPmJvZHkuY2lkID0gY3B1X3RvX2xlMzIocmVzLT5pZCk7CiAKIAl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7Ci0Jdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdik7CisJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdiwgZmFsc2UpOwogfQogCiBzdGF0aWMgaW50IHZtd19jb250ZXh0X2luaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKQEAgLTIyNiwxNCArMjkyLDE3IEBACiAJfSAqY21kOwogCiAJcmV0ID0gdm13X3Jlc291cmNlX2luaXQoZGV2X3ByaXYsIHJlcywgJmRldl9wcml2LT5jb250ZXh0X2lkciwKLQkJCQlWTVdfUkVTX0NPTlRFWFQsIHJlc19mcmVlKTsKKwkJCQlWTVdfUkVTX0NPTlRFWFQsIGZhbHNlLCByZXNfZnJlZSwgTlVMTCk7CiAKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7Ci0JCWlmIChyZXNfZnJlZSA9PSBOVUxMKQotCQkJa2ZyZWUocmVzKTsKLQkJZWxzZQotCQkJcmVzX2ZyZWUocmVzKTsKLQkJcmV0dXJuIHJldDsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSByZXNvdXJjZSBpZC5cbiIpOworCQlnb3RvIG91dF9lYXJseTsKKwl9CisKKwlpZiAodW5saWtlbHkocmVzLT5pZCA+PSBTVkdBM0RfTUFYX0NPTlRFWFRfSURTKSkgeworCQlEUk1fRVJST1IoIk91dCBvZiBodyBjb250ZXh0IGlkcy5cbiIpOworCQl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnJlcyk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CkBAIC0yNDgsOSArMzE3LDE2IEBACiAJY21kLT5ib2R5LmNpZCA9IGNwdV90b19sZTMyKHJlcy0+aWQpOwogCiAJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzaXplb2YoKmNtZCkpOwotCSh2b2lkKSB2bXdfM2RfcmVzb3VyY2VfaW5jKGRldl9wcml2KTsKKwkodm9pZCkgdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgZmFsc2UpOwogCXZtd19yZXNvdXJjZV9hY3RpdmF0ZShyZXMsIHZtd19od19jb250ZXh0X2Rlc3Ryb3kpOwogCXJldHVybiAwOworCitvdXRfZWFybHk6CisJaWYgKHJlc19mcmVlID09IE5VTEwpCisJCWtmcmVlKHJlcyk7CisJZWxzZQorCQlyZXNfZnJlZShyZXMpOworCXJldHVybiByZXQ7CiB9CiAKIHN0cnVjdCB2bXdfcmVzb3VyY2UgKnZtd19jb250ZXh0X2FsbG9jKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCkBAIC0yNzMsOCArMzQ5LDExIEBACiB7CiAJc3RydWN0IHZtd191c2VyX2NvbnRleHQgKmN0eCA9CiAJICAgIGNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfdXNlcl9jb250ZXh0LCByZXMpOworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSByZXMtPmRldl9wcml2OwogCiAJa2ZyZWUoY3R4KTsKKwl0dG1fbWVtX2dsb2JhbF9mcmVlKHZtd19tZW1fZ2xvYihkZXZfcHJpdiksCisJCQkgICAgdm13X3VzZXJfY29udGV4dF9zaXplKTsKIH0KIAogLyoqCkBAIC0zMjgsMjMgKzQwNyw1NiBAQAogCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgdm13X3VzZXJfY29udGV4dCAqY3R4ID0ga21hbGxvYyhzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOworCXN0cnVjdCB2bXdfdXNlcl9jb250ZXh0ICpjdHg7CiAJc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzOwogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnRtcDsKIAlzdHJ1Y3QgZHJtX3Ztd19jb250ZXh0X2FyZyAqYXJnID0gKHN0cnVjdCBkcm1fdm13X2NvbnRleHRfYXJnICopZGF0YTsKIAlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9IHZtd19mcHJpdihmaWxlX3ByaXYpLT50ZmlsZTsKKwlzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3RlciA9IHZtd19tYXN0ZXIoZmlsZV9wcml2LT5tYXN0ZXIpOwogCWludCByZXQ7CiAKLQlpZiAodW5saWtlbHkoY3R4ID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogQXBwcm94aW1hdGUgaWRyIG1lbW9yeSB1c2FnZSB3aXRoIDEyOCBieXRlcy4gSXQgd2lsbCBiZSBsaW1pdGVkCisJICogYnkgbWF4aW11bSBudW1iZXJfb2YgY29udGV4dHMgYW55d2F5LgorCSAqLworCisJaWYgKHVubGlrZWx5KHZtd191c2VyX2NvbnRleHRfc2l6ZSA9PSAwKSkKKwkJdm13X3VzZXJfY29udGV4dF9zaXplID0gdHRtX3JvdW5kX3BvdChzaXplb2YoKmN0eCkpICsgMTI4OworCisJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHR0bV9tZW1fZ2xvYmFsX2FsbG9jKHZtd19tZW1fZ2xvYihkZXZfcHJpdiksCisJCQkJICAgdm13X3VzZXJfY29udGV4dF9zaXplLAorCQkJCSAgIGZhbHNlLCB0cnVlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJRFJNX0VSUk9SKCJPdXQgb2YgZ3JhcGhpY3MgbWVtb3J5IGZvciBjb250ZXh0IgorCQkJCSAgIiBjcmVhdGlvbi5cbiIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJY3R4ID0ga21hbGxvYyhzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShjdHggPT0gTlVMTCkpIHsKKwkJdHRtX21lbV9nbG9iYWxfZnJlZSh2bXdfbWVtX2dsb2IoZGV2X3ByaXYpLAorCQkJCSAgICB2bXdfdXNlcl9jb250ZXh0X3NpemUpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bmxvY2s7CisJfQogCiAJcmVzID0gJmN0eC0+cmVzOwogCWN0eC0+YmFzZS5zaGFyZWFibGUgPSBmYWxzZTsKIAljdHgtPmJhc2UudGZpbGUgPSBOVUxMOwogCisJLyoKKwkgKiBGcm9tIGhlcmUgb24sIHRoZSBkZXN0cnVjdG9yIHRha2VzIG92ZXIgcmVzb3VyY2UgZnJlZWluZy4KKwkgKi8KKwogCXJldCA9IHZtd19jb250ZXh0X2luaXQoZGV2X3ByaXYsIHJlcywgdm13X3VzZXJfY29udGV4dF9mcmVlKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dF91bmxvY2s7CiAKIAl0bXAgPSB2bXdfcmVzb3VyY2VfcmVmZXJlbmNlKCZjdHgtPnJlcyk7CiAJcmV0ID0gdHRtX2Jhc2Vfb2JqZWN0X2luaXQodGZpbGUsICZjdHgtPmJhc2UsIGZhbHNlLCBWTVdfUkVTX0NPTlRFWFQsCkBAIC0zNTgsMTMgKzQ3MCwxNiBAQAogCWFyZy0+Y2lkID0gcmVzLT5pZDsKIG91dF9lcnI6CiAJdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKCZyZXMpOworb3V0X3VubG9jazoKKwl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOwogCXJldHVybiByZXQ7CiAKIH0KIAogaW50IHZtd19jb250ZXh0X2NoZWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCSAgICAgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAotCQkgICAgICBpbnQgaWQpCisJCSAgICAgIGludCBpZCwKKwkJICAgICAgc3RydWN0IHZtd19yZXNvdXJjZSAqKnBfcmVzKQogewogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0ID0gMDsKQEAgLTM3Niw2ICs0OTEsOCBAQAogCQkJY29udGFpbmVyX29mKHJlcywgc3RydWN0IHZtd191c2VyX2NvbnRleHQsIHJlcyk7CiAJCWlmIChjdHgtPmJhc2UudGZpbGUgIT0gdGZpbGUgJiYgIWN0eC0+YmFzZS5zaGFyZWFibGUpCiAJCQlyZXQgPSAtRVBFUk07CisJCWlmIChwX3JlcykKKwkJCSpwX3JlcyA9IHZtd19yZXNvdXJjZV9yZWZlcmVuY2UocmVzKTsKIAl9IGVsc2UKIAkJcmV0ID0gLUVJTlZBTDsKIAlyZWFkX3VubG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOwpAQCAtMzgzLDEwMiArNTAwLDYzOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0cnVjdCB2bXdfYnBwIHsKKwl1aW50OF90IGJwcDsKKwl1aW50OF90IHNfYnBwOworfTsKKworLyoKKyAqIFNpemUgdGFibGUgZm9yIHRoZSBzdXBwb3J0ZWQgU1ZHQTNEIHN1cmZhY2UgZm9ybWF0cy4gSXQgY29uc2lzdHMgb2YKKyAqIHR3byB2YWx1ZXMuIFRoZSBicHAgdmFsdWUgYW5kIHRoZSBzX2JwcCB2YWx1ZSB3aGljaCBpcyBzaG9ydCBmb3IKKyAqICJzdHJpZGUgYml0cyBwZXIgcGl4ZWwiIFRoZSB2YWx1ZXMgYXJlIGdpdmVuIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUKKyAqIG1pbmltdW0gc3RyaWRlIGZvciB0aGUgaW1hZ2UgaXMgY2FsY3VsYXRlZCB1c2luZworICoKKyAqIG1pbl9zdHJpZGUgPSB3KnNfYnBwCisgKgorICogYW5kIHRoZSB0b3RhbCBtZW1vcnkgcmVxdWlyZW1lbnQgZm9yIHRoZSBpbWFnZSBpcworICoKKyAqIGgqbWluX3N0cmlkZSpicHAvc19icHAKKyAqCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm13X2JwcCB2bXdfc2ZfYnBwW10gPSB7CisJW1NWR0EzRF9GT1JNQVRfSU5WQUxJRF0gPSB7MCwgMH0sCisJW1NWR0EzRF9YOFI4RzhCOF0gPSB7MzIsIDMyfSwKKwlbU1ZHQTNEX0E4UjhHOEI4XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfUjVHNkI1XSA9IHsxNiwgMTZ9LAorCVtTVkdBM0RfWDFSNUc1QjVdID0gezE2LCAxNn0sCisJW1NWR0EzRF9BMVI1RzVCNV0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX0E0UjRHNEI0XSA9IHsxNiwgMTZ9LAorCVtTVkdBM0RfWl9EMzJdID0gezMyLCAzMn0sCisJW1NWR0EzRF9aX0QxNl0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX1pfRDI0UzhdID0gezMyLCAzMn0sCisJW1NWR0EzRF9aX0QxNVMxXSA9IHsxNiwgMTZ9LAorCVtTVkdBM0RfTFVNSU5BTkNFOF0gPSB7OCwgOH0sCisJW1NWR0EzRF9MVU1JTkFOQ0U0X0FMUEhBNF0gPSB7OCwgOH0sCisJW1NWR0EzRF9MVU1JTkFOQ0UxNl0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX0xVTUlOQU5DRThfQUxQSEE4XSA9IHsxNiwgMTZ9LAorCVtTVkdBM0RfRFhUMV0gPSB7NCwgMTZ9LAorCVtTVkdBM0RfRFhUMl0gPSB7OCwgMzJ9LAorCVtTVkdBM0RfRFhUM10gPSB7OCwgMzJ9LAorCVtTVkdBM0RfRFhUNF0gPSB7OCwgMzJ9LAorCVtTVkdBM0RfRFhUNV0gPSB7OCwgMzJ9LAorCVtTVkdBM0RfQlVNUFU4VjhdID0gezE2LCAxNn0sCisJW1NWR0EzRF9CVU1QTDZWNVU1XSA9IHsxNiwgMTZ9LAorCVtTVkdBM0RfQlVNUFg4TDhWOFU4XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfQVJHQl9TMTBFNV0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX0FSR0JfUzIzRThdID0gezMyLCAzMn0sCisJW1NWR0EzRF9BMlIxMEcxMEIxMF0gPSB7MzIsIDMyfSwKKwlbU1ZHQTNEX1Y4VThdID0gezE2LCAxNn0sCisJW1NWR0EzRF9ROFc4VjhVOF0gPSB7MzIsIDMyfSwKKwlbU1ZHQTNEX0N4VjhVOF0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX1g4TDhWOFU4XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfQTJXMTBWMTBVMTBdID0gezMyLCAzMn0sCisJW1NWR0EzRF9BTFBIQThdID0gezgsIDh9LAorCVtTVkdBM0RfUl9TMTBFNV0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX1JfUzIzRThdID0gezMyLCAzMn0sCisJW1NWR0EzRF9SR19TMTBFNV0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX1JHX1MyM0U4XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfQlVGRkVSXSA9IHs4LCA4fSwKKwlbU1ZHQTNEX1pfRDI0WDhdID0gezMyLCAzMn0sCisJW1NWR0EzRF9WMTZVMTZdID0gezMyLCAzMn0sCisJW1NWR0EzRF9HMTZSMTZdID0gezMyLCAzMn0sCisJW1NWR0EzRF9BMTZCMTZHMTZSMTZdID0gezY0LCAgNjR9LAorCVtTVkdBM0RfVVlWWV0gPSB7MTIsIDEyfSwKKwlbU1ZHQTNEX1lVWTJdID0gezEyLCAxMn0sCisJW1NWR0EzRF9OVjEyXSA9IHsxMiwgOH0sCisJW1NWR0EzRF9BWVVWXSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfQkM0X1VOT1JNXSA9IHs0LCAgMTZ9LAorCVtTVkdBM0RfQkM1X1VOT1JNXSA9IHs4LCAgMzJ9LAorCVtTVkdBM0RfWl9ERjE2XSA9IHsxNiwgIDE2fSwKKwlbU1ZHQTNEX1pfREYyNF0gPSB7MjQsICAyNH0sCisJW1NWR0EzRF9aX0QyNFM4X0lOVF0gPSB7MzIsICAzMn0KK307CisKIAogLyoqCiAgKiBTdXJmYWNlIG1hbmFnZW1lbnQuCiAgKi8KIAorc3RydWN0IHZtd19zdXJmYWNlX2RtYSB7CisJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKKwlTVkdBM2RDbWRTdXJmYWNlRE1BIGJvZHk7CisJU1ZHQTNkQ29weUJveCBjYjsKKwlTVkdBM2RDbWRTdXJmYWNlRE1BU3VmZml4IHN1ZmZpeDsKK307CisKK3N0cnVjdCB2bXdfc3VyZmFjZV9kZWZpbmUgeworCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJU1ZHQTNkQ21kRGVmaW5lU3VyZmFjZSBib2R5OworfTsKKworc3RydWN0IHZtd19zdXJmYWNlX2Rlc3Ryb3kgeworCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJU1ZHQTNkQ21kRGVzdHJveVN1cmZhY2UgYm9keTsKK307CisKKworLyoqCisgKiB2bXdfc3VyZmFjZV9kbWFfc2l6ZSAtIENvbXB1dGUgZmlmbyBzaXplIGZvciBhIGRtYSBjb21tYW5kLgorICoKKyAqIEBzcmY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3Qgdm13X3N1cmZhY2UKKyAqCisgKiBDb21wdXRlcyB0aGUgcmVxdWlyZWQgc2l6ZSBmb3IgYSBzdXJmYWNlIGRtYSBjb21tYW5kIGZvciBiYWNrdXAgb3IKKyAqIHJlc3RvcmF0aW9uIG9mIHRoZSBzdXJmYWNlIHJlcHJlc2VudGVkIGJ5IEBzcmYuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgdm13X3N1cmZhY2VfZG1hX3NpemUoY29uc3Qgc3RydWN0IHZtd19zdXJmYWNlICpzcmYpCit7CisJcmV0dXJuIHNyZi0+bnVtX3NpemVzICogc2l6ZW9mKHN0cnVjdCB2bXdfc3VyZmFjZV9kbWEpOworfQorCisKKy8qKgorICogdm13X3N1cmZhY2VfZGVmaW5lX3NpemUgLSBDb21wdXRlIGZpZm8gc2l6ZSBmb3IgYSBzdXJmYWNlIGRlZmluZSBjb21tYW5kLgorICoKKyAqIEBzcmY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3Qgdm13X3N1cmZhY2UKKyAqCisgKiBDb21wdXRlcyB0aGUgcmVxdWlyZWQgc2l6ZSBmb3IgYSBzdXJmYWNlIGRlZmluZSBjb21tYW5kIGZvciB0aGUgZGVmaW5pdGlvbgorICogb2YgdGhlIHN1cmZhY2UgcmVwcmVzZW50ZWQgYnkgQHNyZi4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCB2bXdfc3VyZmFjZV9kZWZpbmVfc2l6ZShjb25zdCBzdHJ1Y3Qgdm13X3N1cmZhY2UgKnNyZikKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCB2bXdfc3VyZmFjZV9kZWZpbmUpICsgc3JmLT5udW1fc2l6ZXMgKgorCQlzaXplb2YoU1ZHQTNkU2l6ZSk7Cit9CisKKworLyoqCisgKiB2bXdfc3VyZmFjZV9kZXN0cm95X3NpemUgLSBDb21wdXRlIGZpZm8gc2l6ZSBmb3IgYSBzdXJmYWNlIGRlc3Ryb3kgY29tbWFuZC4KKyAqCisgKiBDb21wdXRlcyB0aGUgcmVxdWlyZWQgc2l6ZSBmb3IgYSBzdXJmYWNlIGRlc3Ryb3kgY29tbWFuZCBmb3IgdGhlIGRlc3RydWN0aW9uCisgKiBvZiBhIGh3IHN1cmZhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgdm13X3N1cmZhY2VfZGVzdHJveV9zaXplKHZvaWQpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgdm13X3N1cmZhY2VfZGVzdHJveSk7Cit9CisKKy8qKgorICogdm13X3N1cmZhY2VfZGVzdHJveV9lbmNvZGUgLSBFbmNvZGUgYSBzdXJmYWNlX2Rlc3Ryb3kgY29tbWFuZC4KKyAqCisgKiBAaWQ6IFRoZSBzdXJmYWNlIGlkCisgKiBAY21kX3NwYWNlOiBQb2ludGVyIHRvIG1lbW9yeSBhcmVhIGluIHdoaWNoIHRoZSBjb21tYW5kcyBzaG91bGQgYmUgZW5jb2RlZC4KKyAqLworc3RhdGljIHZvaWQgdm13X3N1cmZhY2VfZGVzdHJveV9lbmNvZGUodWludDMyX3QgaWQsCisJCQkJICAgICAgIHZvaWQgKmNtZF9zcGFjZSkKK3sKKwlzdHJ1Y3Qgdm13X3N1cmZhY2VfZGVzdHJveSAqY21kID0gKHN0cnVjdCB2bXdfc3VyZmFjZV9kZXN0cm95ICopCisJCWNtZF9zcGFjZTsKKworCWNtZC0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfU1VSRkFDRV9ERVNUUk9ZOworCWNtZC0+aGVhZGVyLnNpemUgPSBzaXplb2YoY21kLT5ib2R5KTsKKwljbWQtPmJvZHkuc2lkID0gaWQ7Cit9CisKKy8qKgorICogdm13X3N1cmZhY2VfZGVmaW5lX2VuY29kZSAtIEVuY29kZSBhIHN1cmZhY2VfZGVmaW5lIGNvbW1hbmQuCisgKgorICogQHNyZjogUG9pbnRlciB0byBhIHN0cnVjdCB2bXdfc3VyZmFjZSBvYmplY3QuCisgKiBAY21kX3NwYWNlOiBQb2ludGVyIHRvIG1lbW9yeSBhcmVhIGluIHdoaWNoIHRoZSBjb21tYW5kcyBzaG91bGQgYmUgZW5jb2RlZC4KKyAqLworc3RhdGljIHZvaWQgdm13X3N1cmZhY2VfZGVmaW5lX2VuY29kZShjb25zdCBzdHJ1Y3Qgdm13X3N1cmZhY2UgKnNyZiwKKwkJCQkgICAgICB2b2lkICpjbWRfc3BhY2UpCit7CisJc3RydWN0IHZtd19zdXJmYWNlX2RlZmluZSAqY21kID0gKHN0cnVjdCB2bXdfc3VyZmFjZV9kZWZpbmUgKikKKwkJY21kX3NwYWNlOworCXN0cnVjdCBkcm1fdm13X3NpemUgKnNyY19zaXplOworCVNWR0EzZFNpemUgKmNtZF9zaXplOworCXVpbnQzMl90IGNtZF9sZW47CisJaW50IGk7CisKKwljbWRfbGVuID0gc2l6ZW9mKGNtZC0+Ym9keSkgKyBzcmYtPm51bV9zaXplcyAqIHNpemVvZihTVkdBM2RTaXplKTsKKworCWNtZC0+aGVhZGVyLmlkID0gU1ZHQV8zRF9DTURfU1VSRkFDRV9ERUZJTkU7CisJY21kLT5oZWFkZXIuc2l6ZSA9IGNtZF9sZW47CisJY21kLT5ib2R5LnNpZCA9IHNyZi0+cmVzLmlkOworCWNtZC0+Ym9keS5zdXJmYWNlRmxhZ3MgPSBzcmYtPmZsYWdzOworCWNtZC0+Ym9keS5mb3JtYXQgPSBjcHVfdG9fbGUzMihzcmYtPmZvcm1hdCk7CisJZm9yIChpID0gMDsgaSA8IERSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVM7ICsraSkKKwkJY21kLT5ib2R5LmZhY2VbaV0ubnVtTWlwTGV2ZWxzID0gc3JmLT5taXBfbGV2ZWxzW2ldOworCisJY21kICs9IDE7CisJY21kX3NpemUgPSAoU1ZHQTNkU2l6ZSAqKSBjbWQ7CisJc3JjX3NpemUgPSBzcmYtPnNpemVzOworCisJZm9yIChpID0gMDsgaSA8IHNyZi0+bnVtX3NpemVzOyArK2ksIGNtZF9zaXplKyssIHNyY19zaXplKyspIHsKKwkJY21kX3NpemUtPndpZHRoID0gc3JjX3NpemUtPndpZHRoOworCQljbWRfc2l6ZS0+aGVpZ2h0ID0gc3JjX3NpemUtPmhlaWdodDsKKwkJY21kX3NpemUtPmRlcHRoID0gc3JjX3NpemUtPmRlcHRoOworCX0KK30KKworCisvKioKKyAqIHZtd19zdXJmYWNlX2RtYV9lbmNvZGUgLSBFbmNvZGUgYSBzdXJmYWNlX2RtYSBjb21tYW5kLgorICoKKyAqIEBzcmY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3Qgdm13X3N1cmZhY2Ugb2JqZWN0LgorICogQGNtZF9zcGFjZTogUG9pbnRlciB0byBtZW1vcnkgYXJlYSBpbiB3aGljaCB0aGUgY29tbWFuZHMgc2hvdWxkIGJlIGVuY29kZWQuCisgKiBAcHRyOiBQb2ludGVyIHRvIGFuIFNWR0FHdWVzdFB0ciBpbmRpY2F0aW5nIHdoZXJlIHRoZSBzdXJmYWNlIGNvbnRlbnRzCisgKiBzaG91bGQgYmUgcGxhY2VkIG9yIHJlYWQgZnJvbS4KKyAqIEB0b19zdXJmYWNlOiBCb29sZWFuIHdoZXRoZXIgdG8gRE1BIHRvIHRoZSBzdXJmYWNlIG9yIGZyb20gdGhlIHN1cmZhY2UuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19zdXJmYWNlX2RtYV9lbmNvZGUoc3RydWN0IHZtd19zdXJmYWNlICpzcmYsCisJCQkJICAgdm9pZCAqY21kX3NwYWNlLAorCQkJCSAgIGNvbnN0IFNWR0FHdWVzdFB0ciAqcHRyLAorCQkJCSAgIGJvb2wgdG9fc3VyZmFjZSkKK3sKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IGJwcCA9IHZtd19zZl9icHBbc3JmLT5mb3JtYXRdLmJwcDsKKwl1aW50MzJfdCBzdHJpZGVfYnBwID0gdm13X3NmX2JwcFtzcmYtPmZvcm1hdF0uc19icHA7CisJc3RydWN0IHZtd19zdXJmYWNlX2RtYSAqY21kID0gKHN0cnVjdCB2bXdfc3VyZmFjZV9kbWEgKiljbWRfc3BhY2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3JmLT5udW1fc2l6ZXM7ICsraSkgeworCQlTVkdBM2RDbWRIZWFkZXIgKmhlYWRlciA9ICZjbWQtPmhlYWRlcjsKKwkJU1ZHQTNkQ21kU3VyZmFjZURNQSAqYm9keSA9ICZjbWQtPmJvZHk7CisJCVNWR0EzZENvcHlCb3ggKmNiID0gJmNtZC0+Y2I7CisJCVNWR0EzZENtZFN1cmZhY2VETUFTdWZmaXggKnN1ZmZpeCA9ICZjbWQtPnN1ZmZpeDsKKwkJY29uc3Qgc3RydWN0IHZtd19zdXJmYWNlX29mZnNldCAqY3VyX29mZnNldCA9ICZzcmYtPm9mZnNldHNbaV07CisJCWNvbnN0IHN0cnVjdCBkcm1fdm13X3NpemUgKmN1cl9zaXplID0gJnNyZi0+c2l6ZXNbaV07CisKKwkJaGVhZGVyLT5pZCA9IFNWR0FfM0RfQ01EX1NVUkZBQ0VfRE1BOworCQloZWFkZXItPnNpemUgPSBzaXplb2YoKmJvZHkpICsgc2l6ZW9mKCpjYikgKyBzaXplb2YoKnN1ZmZpeCk7CisKKwkJYm9keS0+Z3Vlc3QucHRyID0gKnB0cjsKKwkJYm9keS0+Z3Vlc3QucHRyLm9mZnNldCArPSBjdXJfb2Zmc2V0LT5ib19vZmZzZXQ7CisJCWJvZHktPmd1ZXN0LnBpdGNoID0gKGN1cl9zaXplLT53aWR0aCAqIHN0cmlkZV9icHAgKyA3KSA+PiAzOworCQlib2R5LT5ob3N0LnNpZCA9IHNyZi0+cmVzLmlkOworCQlib2R5LT5ob3N0LmZhY2UgPSBjdXJfb2Zmc2V0LT5mYWNlOworCQlib2R5LT5ob3N0Lm1pcG1hcCA9IGN1cl9vZmZzZXQtPm1pcDsKKwkJYm9keS0+dHJhbnNmZXIgPSAoKHRvX3N1cmZhY2UpID8gIFNWR0EzRF9XUklURV9IT1NUX1ZSQU0gOgorCQkJCSAgU1ZHQTNEX1JFQURfSE9TVF9WUkFNKTsKKwkJY2ItPnggPSAwOworCQljYi0+eSA9IDA7CisJCWNiLT56ID0gMDsKKwkJY2ItPnNyY3ggPSAwOworCQljYi0+c3JjeSA9IDA7CisJCWNiLT5zcmN6ID0gMDsKKwkJY2ItPncgPSBjdXJfc2l6ZS0+d2lkdGg7CisJCWNiLT5oID0gY3VyX3NpemUtPmhlaWdodDsKKwkJY2ItPmQgPSBjdXJfc2l6ZS0+ZGVwdGg7CisKKwkJc3VmZml4LT5zdWZmaXhTaXplID0gc2l6ZW9mKCpzdWZmaXgpOworCQlzdWZmaXgtPm1heGltdW1PZmZzZXQgPSBib2R5LT5ndWVzdC5waXRjaCpjdXJfc2l6ZS0+aGVpZ2h0KgorCQkJY3VyX3NpemUtPmRlcHRoKmJwcCAvIHN0cmlkZV9icHA7CisJCXN1ZmZpeC0+ZmxhZ3MuZGlzY2FyZCA9IDA7CisJCXN1ZmZpeC0+ZmxhZ3MudW5zeW5jaHJvbml6ZWQgPSAwOworCQlzdWZmaXgtPmZsYWdzLnJlc2VydmVkID0gMDsKKwkJKytjbWQ7CisJfQorfTsKKworCiBzdGF0aWMgdm9pZCB2bXdfaHdfc3VyZmFjZV9kZXN0cm95KHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykKIHsKIAogCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSByZXMtPmRldl9wcml2OwotCXN0cnVjdCB7Ci0JCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7Ci0JCVNWR0EzZENtZERlc3Ryb3lTdXJmYWNlIGJvZHk7Ci0JfSAqY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnNyZjsKKwl2b2lkICpjbWQ7CiAKLQlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBzdXJmYWNlICIKLQkJCSAgImRlc3RydWN0aW9uLlxuIik7Ci0JCXJldHVybjsKKwlpZiAocmVzLT5pZCAhPSAtMSkgeworCisJCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHZtd19zdXJmYWNlX2Rlc3Ryb3lfc2l6ZSgpKTsKKwkJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQkJRFJNX0VSUk9SKCJGYWlsZWQgcmVzZXJ2aW5nIEZJRk8gc3BhY2UgZm9yIHN1cmZhY2UgIgorCQkJCSAgImRlc3RydWN0aW9uLlxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQl2bXdfc3VyZmFjZV9kZXN0cm95X2VuY29kZShyZXMtPmlkLCBjbWQpOworCQl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHZtd19zdXJmYWNlX2Rlc3Ryb3lfc2l6ZSgpKTsKKworCQkvKgorCQkgKiB1c2VkX21lbW9yeV9zaXplX2F0b21pYywgb3Igc2VwYXJhdGUgbG9jaworCQkgKiB0byBhdm9pZCB0YWtpbmcgZGV2X3ByaXY6OmNtZGJ1Zl9tdXRleCBpbgorCQkgKiB0aGUgZGVzdHJveSBwYXRoLgorCQkgKi8KKworCQltdXRleF9sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKKwkJc3JmID0gY29udGFpbmVyX29mKHJlcywgc3RydWN0IHZtd19zdXJmYWNlLCByZXMpOworCQlkZXZfcHJpdi0+dXNlZF9tZW1vcnlfc2l6ZSAtPSBzcmYtPmJhY2t1cF9zaXplOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5jbWRidWZfbXV0ZXgpOworCiAJfQotCi0JY21kLT5oZWFkZXIuaWQgPSBjcHVfdG9fbGUzMihTVkdBXzNEX0NNRF9TVVJGQUNFX0RFU1RST1kpOwotCWNtZC0+aGVhZGVyLnNpemUgPSBjcHVfdG9fbGUzMihzaXplb2YoY21kLT5ib2R5KSk7Ci0JY21kLT5ib2R5LnNpZCA9IGNwdV90b19sZTMyKHJlcy0+aWQpOwotCi0Jdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzaXplb2YoKmNtZCkpOwotCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYpOworCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIGZhbHNlKTsKIH0KIAogdm9pZCB2bXdfc3VyZmFjZV9yZXNfZnJlZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCiB7CiAJc3RydWN0IHZtd19zdXJmYWNlICpzcmYgPSBjb250YWluZXJfb2YocmVzLCBzdHJ1Y3Qgdm13X3N1cmZhY2UsIHJlcyk7CiAKKwlpZiAoc3JmLT5iYWNrdXApCisJCXR0bV9ib191bnJlZigmc3JmLT5iYWNrdXApOworCWtmcmVlKHNyZi0+b2Zmc2V0cyk7CiAJa2ZyZWUoc3JmLT5zaXplcyk7CiAJa2ZyZWUoc3JmLT5zbm9vcGVyLmltYWdlKTsKIAlrZnJlZShzcmYpOwogfQogCisKKy8qKgorICogdm13X3N1cmZhY2VfZG9fdmFsaWRhdGUgLSBtYWtlIGEgc3VyZmFjZSBhdmFpbGFibGUgdG8gdGhlIGRldmljZS4KKyAqCisgKiBAZGV2X3ByaXY6IFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3QuCisgKiBAc3JmOiBQb2ludGVyIHRvIGEgc3RydWN0IHZtd19zdXJmYWNlLgorICoKKyAqIElmIHRoZSBzdXJmYWNlIGRvZXNuJ3QgaGF2ZSBhIGh3IGlkLCBhbGxvY2F0ZSBvbmUsIGFuZCBvcHRpb25hbGx5CisgKiBETUEgdGhlIGJhY2tlZCB1cCBzdXJmYWNlIGNvbnRlbnRzIHRvIHRoZSBkZXZpY2UuCisgKgorICogUmV0dXJucyAtRUJVU1kgaWYgdGhlcmUgd2Fzbid0IHN1ZmZpY2llbnQgZGV2aWNlIHJlc291cmNlcyB0bworICogY29tcGxldGUgdGhlIHZhbGlkYXRpb24uIFJldHJ5IGFmdGVyIGZyZWVpbmcgdXAgcmVzb3VyY2VzLgorICoKKyAqIE1heSByZXR1cm4gb3RoZXIgZXJyb3JzIGlmIHRoZSBrZXJuZWwgaXMgb3V0IG9mIGd1ZXN0IHJlc291cmNlcy4KKyAqLworaW50IHZtd19zdXJmYWNlX2RvX3ZhbGlkYXRlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgc3RydWN0IHZtd19zdXJmYWNlICpzcmYpCit7CisJc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzID0gJnNyZi0+cmVzOworCXN0cnVjdCBsaXN0X2hlYWQgdmFsX2xpc3Q7CisJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgdmFsX2J1ZjsKKwl1aW50MzJfdCBzdWJtaXRfc2l6ZTsKKwl1aW50OF90ICpjbWQ7CisJaW50IHJldDsKKworCWlmIChsaWtlbHkocmVzLT5pZCAhPSAtMSkpCisJCXJldHVybiAwOworCisJaWYgKHVubGlrZWx5KGRldl9wcml2LT51c2VkX21lbW9yeV9zaXplICsgc3JmLT5iYWNrdXBfc2l6ZSA+PQorCQkgICAgIGRldl9wcml2LT5tZW1vcnlfc2l6ZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKgorCSAqIFJlc2VydmUtIGFuZCB2YWxpZGF0ZSB0aGUgYmFja3VwIERNQSBiby4KKwkgKi8KKworCWlmIChzcmYtPmJhY2t1cCkgeworCQlJTklUX0xJU1RfSEVBRCgmdmFsX2xpc3QpOworCQl2YWxfYnVmLmJvID0gdHRtX2JvX3JlZmVyZW5jZShzcmYtPmJhY2t1cCk7CisJCXZhbF9idWYubmV3X3N5bmNfb2JqX2FyZyA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKQorCQkJCQkJICAgIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDKTsKKwkJbGlzdF9hZGRfdGFpbCgmdmFsX2J1Zi5oZWFkLCAmdmFsX2xpc3QpOworCQlyZXQgPSB0dG1fZXVfcmVzZXJ2ZV9idWZmZXJzKCZ2YWxfbGlzdCk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlnb3RvIG91dF9ub19yZXNlcnZlOworCisJCXJldCA9IHR0bV9ib192YWxpZGF0ZShzcmYtPmJhY2t1cCwgJnZtd19zcmZfcGxhY2VtZW50LAorCQkJCSAgICAgIHRydWUsIGZhbHNlLCBmYWxzZSk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlnb3RvIG91dF9ub192YWxpZGF0ZTsKKwl9CisKKwkvKgorCSAqIEFsbG9jIGlkIGZvciB0aGUgcmVzb3VyY2UuCisJICovCisKKwlyZXQgPSB2bXdfcmVzb3VyY2VfYWxsb2NfaWQoZGV2X3ByaXYsIHJlcyk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIHN1cmZhY2UgaWQuXG4iKTsKKwkJZ290byBvdXRfbm9faWQ7CisJfQorCWlmICh1bmxpa2VseShyZXMtPmlkID49IFNWR0EzRF9NQVhfU1VSRkFDRV9JRFMpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRfbm9fZmlmbzsKKwl9CisKKworCS8qCisJICogRW5jb2RlIHN1cmZhY2UgZGVmaW5lLSBhbmQgZG1hIGNvbW1hbmRzLgorCSAqLworCisJc3VibWl0X3NpemUgPSB2bXdfc3VyZmFjZV9kZWZpbmVfc2l6ZShzcmYpOworCWlmIChzcmYtPmJhY2t1cCkKKwkJc3VibWl0X3NpemUgKz0gdm13X3N1cmZhY2VfZG1hX3NpemUoc3JmKTsKKworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHN1Ym1pdF9zaXplKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBzdXJmYWNlICIKKwkJCSAgInZhbGlkYXRpb24uXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fZmlmbzsKKwl9CisKKwl2bXdfc3VyZmFjZV9kZWZpbmVfZW5jb2RlKHNyZiwgY21kKTsKKwlpZiAoc3JmLT5iYWNrdXApIHsKKwkJU1ZHQUd1ZXN0UHRyIHB0cjsKKworCQljbWQgKz0gdm13X3N1cmZhY2VfZGVmaW5lX3NpemUoc3JmKTsKKwkJdm13X2JvX2dldF9ndWVzdF9wdHIoc3JmLT5iYWNrdXAsICZwdHIpOworCQl2bXdfc3VyZmFjZV9kbWFfZW5jb2RlKHNyZiwgY21kLCAmcHRyLCB0cnVlKTsKKwl9CisKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHN1Ym1pdF9zaXplKTsKKworCS8qCisJICogQ3JlYXRlIGEgZmVuY2Ugb2JqZWN0IGFuZCBmZW5jZSB0aGUgYmFja3VwIGJ1ZmZlci4KKwkgKi8KKworCWlmIChzcmYtPmJhY2t1cCkgeworCQlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2U7CisKKwkJKHZvaWQpIHZtd19leGVjYnVmX2ZlbmNlX2NvbW1hbmRzKE5VTEwsIGRldl9wcml2LAorCQkJCQkJICAmZmVuY2UsIE5VTEwpOworCQl0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMoJnZhbF9saXN0LCBmZW5jZSk7CisJCWlmIChsaWtlbHkoZmVuY2UgIT0gTlVMTCkpCisJCQl2bXdfZmVuY2Vfb2JqX3VucmVmZXJlbmNlKCZmZW5jZSk7CisJCXR0bV9ib191bnJlZigmdmFsX2J1Zi5ibyk7CisJCXR0bV9ib191bnJlZigmc3JmLT5iYWNrdXApOworCX0KKworCS8qCisJICogU3VyZmFjZSBtZW1vcnkgdXNhZ2UgYWNjb3VudGluZy4KKwkgKi8KKworCWRldl9wcml2LT51c2VkX21lbW9yeV9zaXplICs9IHNyZi0+YmFja3VwX3NpemU7CisKKwlyZXR1cm4gMDsKKworb3V0X25vX2ZpZm86CisJdm13X3Jlc291cmNlX3JlbGVhc2VfaWQocmVzKTsKK291dF9ub19pZDoKK291dF9ub192YWxpZGF0ZToKKwlpZiAoc3JmLT5iYWNrdXApCisJCXR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKCZ2YWxfbGlzdCk7CitvdXRfbm9fcmVzZXJ2ZToKKwlpZiAoc3JmLT5iYWNrdXApCisJCXR0bV9ib191bnJlZigmdmFsX2J1Zi5ibyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2bXdfc3VyZmFjZV9ldmljdCAtIEV2aWN0IGEgaHcgc3VyZmFjZS4KKyAqCisgKiBAZGV2X3ByaXY6IFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3QuCisgKiBAc3JmOiBQb2ludGVyIHRvIGEgc3RydWN0IHZtd19zdXJmYWNlCisgKgorICogRE1BIHRoZSBjb250ZW50cyBvZiBhIGh3IHN1cmZhY2UgdG8gYSBiYWNrdXAgZ3Vlc3QgYnVmZmVyIG9iamVjdCwKKyAqIGFuZCBkZXN0cm95IHRoZSBodyBzdXJmYWNlLCByZWxlYXNpbmcgaXRzIGlkLgorICovCitpbnQgdm13X3N1cmZhY2VfZXZpY3Qoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJICAgICAgc3RydWN0IHZtd19zdXJmYWNlICpzcmYpCit7CisJc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzID0gJnNyZi0+cmVzOworCXN0cnVjdCBsaXN0X2hlYWQgdmFsX2xpc3Q7CisJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgdmFsX2J1ZjsKKwl1aW50MzJfdCBzdWJtaXRfc2l6ZTsKKwl1aW50OF90ICpjbWQ7CisJaW50IHJldDsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2U7CisJU1ZHQUd1ZXN0UHRyIHB0cjsKKworCUJVR19PTihyZXMtPmlkID09IC0xKTsKKworCS8qCisJICogQ3JlYXRlIGEgc3VyZmFjZSBiYWNrdXAgYnVmZmVyIG9iamVjdC4KKwkgKi8KKworCWlmICghc3JmLT5iYWNrdXApIHsKKwkJcmV0ID0gdHRtX2JvX2NyZWF0ZSgmZGV2X3ByaXYtPmJkZXYsIHNyZi0+YmFja3VwX3NpemUsCisJCQkJICAgIHR0bV9ib190eXBlX2RldmljZSwKKwkJCQkgICAgJnZtd19zcmZfcGxhY2VtZW50LCAwLCAwLCB0cnVlLAorCQkJCSAgICBOVUxMLCAmc3JmLT5iYWNrdXApOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFJlc2VydmUtIGFuZCB2YWxpZGF0ZSB0aGUgYmFja3VwIERNQSBiby4KKwkgKi8KKworCUlOSVRfTElTVF9IRUFEKCZ2YWxfbGlzdCk7CisJdmFsX2J1Zi5ibyA9IHR0bV9ib19yZWZlcmVuY2Uoc3JmLT5iYWNrdXApOworCXZhbF9idWYubmV3X3N5bmNfb2JqX2FyZyA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpCisJCURSTV9WTVdfRkVOQ0VfRkxBR19FWEVDOworCWxpc3RfYWRkX3RhaWwoJnZhbF9idWYuaGVhZCwgJnZhbF9saXN0KTsKKwlyZXQgPSB0dG1fZXVfcmVzZXJ2ZV9idWZmZXJzKCZ2YWxfbGlzdCk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXRfbm9fcmVzZXJ2ZTsKKworCXJldCA9IHR0bV9ib192YWxpZGF0ZShzcmYtPmJhY2t1cCwgJnZtd19zcmZfcGxhY2VtZW50LAorCQkJICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dF9ub192YWxpZGF0ZTsKKworCisJLyoKKwkgKiBFbmNvZGUgdGhlIGRtYS0gYW5kIHN1cmZhY2UgZGVzdHJveSBjb21tYW5kcy4KKwkgKi8KKworCXN1Ym1pdF9zaXplID0gdm13X3N1cmZhY2VfZG1hX3NpemUoc3JmKSArIHZtd19zdXJmYWNlX2Rlc3Ryb3lfc2l6ZSgpOworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHN1Ym1pdF9zaXplKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBzdXJmYWNlICIKKwkJCSAgImV2aWN0aW9uLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX2ZpZm87CisJfQorCisJdm13X2JvX2dldF9ndWVzdF9wdHIoc3JmLT5iYWNrdXAsICZwdHIpOworCXZtd19zdXJmYWNlX2RtYV9lbmNvZGUoc3JmLCBjbWQsICZwdHIsIGZhbHNlKTsKKwljbWQgKz0gdm13X3N1cmZhY2VfZG1hX3NpemUoc3JmKTsKKwl2bXdfc3VyZmFjZV9kZXN0cm95X2VuY29kZShyZXMtPmlkLCBjbWQpOworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc3VibWl0X3NpemUpOworCisJLyoKKwkgKiBTdXJmYWNlIG1lbW9yeSB1c2FnZSBhY2NvdW50aW5nLgorCSAqLworCisJZGV2X3ByaXYtPnVzZWRfbWVtb3J5X3NpemUgLT0gc3JmLT5iYWNrdXBfc2l6ZTsKKworCS8qCisJICogQ3JlYXRlIGEgZmVuY2Ugb2JqZWN0IGFuZCBmZW5jZSB0aGUgRE1BIGJ1ZmZlci4KKwkgKi8KKworCSh2b2lkKSB2bXdfZXhlY2J1Zl9mZW5jZV9jb21tYW5kcyhOVUxMLCBkZXZfcHJpdiwKKwkJCQkJICAmZmVuY2UsIE5VTEwpOworCXR0bV9ldV9mZW5jZV9idWZmZXJfb2JqZWN0cygmdmFsX2xpc3QsIGZlbmNlKTsKKwlpZiAobGlrZWx5KGZlbmNlICE9IE5VTEwpKQorCQl2bXdfZmVuY2Vfb2JqX3VucmVmZXJlbmNlKCZmZW5jZSk7CisJdHRtX2JvX3VucmVmKCZ2YWxfYnVmLmJvKTsKKworCS8qCisJICogUmVsZWFzZSB0aGUgc3VyZmFjZSBJRC4KKwkgKi8KKworCXZtd19yZXNvdXJjZV9yZWxlYXNlX2lkKHJlcyk7CisKKwlyZXR1cm4gMDsKKworb3V0X25vX2ZpZm86CitvdXRfbm9fdmFsaWRhdGU6CisJaWYgKHNyZi0+YmFja3VwKQorCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbigmdmFsX2xpc3QpOworb3V0X25vX3Jlc2VydmU6CisJdHRtX2JvX3VucmVmKCZ2YWxfYnVmLmJvKTsKKwl0dG1fYm9fdW5yZWYoJnNyZi0+YmFja3VwKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogdm13X3N1cmZhY2VfdmFsaWRhdGUgLSBtYWtlIGEgc3VyZmFjZSBhdmFpbGFibGUgdG8gdGhlIGRldmljZSwgZXZpY3RpbmcKKyAqIG90aGVyIHN1cmZhY2VzIGlmIG5lZWRlZC4KKyAqCisgKiBAZGV2X3ByaXY6IFBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3QuCisgKiBAc3JmOiBQb2ludGVyIHRvIGEgc3RydWN0IHZtd19zdXJmYWNlLgorICoKKyAqIFRyeSB0byB2YWxpZGF0ZSBhIHN1cmZhY2UgYW5kIGlmIGl0IGZhaWxzIGR1ZSB0byBsaW1pdGVkIGRldmljZSByZXNvdXJjZXMsCisgKiByZXBlYXRlZGx5IHRyeSB0byBldmljdCBvdGhlciBzdXJmYWNlcyB1bnRpbCB0aGUgcmVxdWVzdCBjYW4gYmUKKyAqIGFjb21tb2RhdGVkLgorICoKKyAqIE1heSByZXR1cm4gZXJyb3JzIGlmIG91dCBvZiByZXNvdXJjZXMuCisgKi8KK2ludCB2bXdfc3VyZmFjZV92YWxpZGF0ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJIHN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmKQoreworCWludCByZXQ7CisJc3RydWN0IHZtd19zdXJmYWNlICpldmljdF9zcmY7CisKKwlkbyB7CisJCXdyaXRlX2xvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmc3JmLT5scnVfaGVhZCk7CisJCXdyaXRlX3VubG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOworCisJCXJldCA9IHZtd19zdXJmYWNlX2RvX3ZhbGlkYXRlKGRldl9wcml2LCBzcmYpOworCQlpZiAobGlrZWx5KHJldCAhPSAtRUJVU1kpKQorCQkJYnJlYWs7CisKKwkJd3JpdGVfbG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOworCQlpZiAobGlzdF9lbXB0eSgmZGV2X3ByaXYtPnN1cmZhY2VfbHJ1KSkgeworCQkJRFJNX0VSUk9SKCJPdXQgb2YgZGV2aWNlIG1lbW9yeSBmb3Igc3VyZmFjZXMuXG4iKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCXdyaXRlX3VubG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOworCQkJYnJlYWs7CisJCX0KKworCQlldmljdF9zcmYgPSB2bXdfc3VyZmFjZV9yZWZlcmVuY2UKKwkJCShsaXN0X2ZpcnN0X2VudHJ5KCZkZXZfcHJpdi0+c3VyZmFjZV9scnUsCisJCQkJCSAgc3RydWN0IHZtd19zdXJmYWNlLAorCQkJCQkgIGxydV9oZWFkKSk7CisJCWxpc3RfZGVsX2luaXQoJmV2aWN0X3NyZi0+bHJ1X2hlYWQpOworCisJCXdyaXRlX3VubG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOworCQkodm9pZCkgdm13X3N1cmZhY2VfZXZpY3QoZGV2X3ByaXYsIGV2aWN0X3NyZik7CisKKwkJdm13X3N1cmZhY2VfdW5yZWZlcmVuY2UoJmV2aWN0X3NyZik7CisKKwl9IHdoaWxlICgxKTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gMCAmJiBzcmYtPnJlcy5pZCAhPSAtMSkpIHsKKwkJd3JpdGVfbG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZzcmYtPmxydV9oZWFkLCAmZGV2X3ByaXYtPnN1cmZhY2VfbHJ1KTsKKwkJd3JpdGVfdW5sb2NrKCZkZXZfcHJpdi0+cmVzb3VyY2VfbG9jayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIHZtd19zdXJmYWNlX3JlbW92ZV9mcm9tX2xpc3RzIC0gUmVtb3ZlIHN1cmZhY2UgcmVzb3VyY2VzIGZyb20gbG9va3VwIGxpc3RzCisgKgorICogQHJlczogUG9pbnRlciB0byBhIHN0cnVjdCB2bXdfcmVzb3VyY2UgZW1iZWRkZWQgaW4gYSBzdHJ1Y3Qgdm13X3N1cmZhY2UKKyAqCisgKiBBcyBwYXJ0IG9mIHRoZSByZXNvdXJjZSBkZXN0cnVjdGlvbiwgcmVtb3ZlIHRoZSBzdXJmYWNlIGZyb20gYW55CisgKiBsb29rdXAgbGlzdHMuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19zdXJmYWNlX3JlbW92ZV9mcm9tX2xpc3RzKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykKK3sKKwlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnNyZiA9IGNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfc3VyZmFjZSwgcmVzKTsKKworCWxpc3RfZGVsX2luaXQoJnNyZi0+bHJ1X2hlYWQpOworfQorCiBpbnQgdm13X3N1cmZhY2VfaW5pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkgICAgIHN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmLAogCQkgICAgIHZvaWQgKCpyZXNfZnJlZSkgKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgewotCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOwotCQlTVkdBM2RDbWREZWZpbmVTdXJmYWNlIGJvZHk7Ci0JfSAqY21kOwotCVNWR0EzZFNpemUgKmNtZF9zaXplOwogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyA9ICZzcmYtPnJlczsKLQlzdHJ1Y3QgZHJtX3Ztd19zaXplICpzcmNfc2l6ZTsKLQlzaXplX3Qgc3VibWl0X3NpemU7Ci0JdWludDMyX3QgY21kX2xlbjsKLQlpbnQgaTsKIAogCUJVR19PTihyZXNfZnJlZSA9PSBOVUxMKTsKKwlJTklUX0xJU1RfSEVBRCgmc3JmLT5scnVfaGVhZCk7CiAJcmV0ID0gdm13X3Jlc291cmNlX2luaXQoZGV2X3ByaXYsIHJlcywgJmRldl9wcml2LT5zdXJmYWNlX2lkciwKLQkJCQlWTVdfUkVTX1NVUkZBQ0UsIHJlc19mcmVlKTsKKwkJCQlWTVdfUkVTX1NVUkZBQ0UsIHRydWUsIHJlc19mcmVlLAorCQkJCXZtd19zdXJmYWNlX3JlbW92ZV9mcm9tX2xpc3RzKTsKIAotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlyZXNfZnJlZShyZXMpOwotCQlyZXR1cm4gcmV0OwotCX0KIAotCXN1Ym1pdF9zaXplID0gc2l6ZW9mKCpjbWQpICsgc3JmLT5udW1fc2l6ZXMgKiBzaXplb2YoU1ZHQTNkU2l6ZSk7Ci0JY21kX2xlbiA9IHNpemVvZihjbWQtPmJvZHkpICsgc3JmLT5udW1fc2l6ZXMgKiBzaXplb2YoU1ZHQTNkU2l6ZSk7CisJLyoKKwkgKiBUaGUgc3VyZmFjZSB3b24ndCBiZSB2aXNpYmxlIHRvIGhhcmR3YXJlIHVudGlsIGEKKwkgKiBzdXJmYWNlIHZhbGlkYXRlLgorCSAqLwogCi0JY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc3VibWl0X3NpemUpOwotCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKLQkJRFJNX0VSUk9SKCJGaWZvIHJlc2VydmUgZmFpbGVkIGZvciBjcmVhdGUgc3VyZmFjZS5cbiIpOwotCQl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnJlcyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWNtZC0+aGVhZGVyLmlkID0gY3B1X3RvX2xlMzIoU1ZHQV8zRF9DTURfU1VSRkFDRV9ERUZJTkUpOwotCWNtZC0+aGVhZGVyLnNpemUgPSBjcHVfdG9fbGUzMihjbWRfbGVuKTsKLQljbWQtPmJvZHkuc2lkID0gY3B1X3RvX2xlMzIocmVzLT5pZCk7Ci0JY21kLT5ib2R5LnN1cmZhY2VGbGFncyA9IGNwdV90b19sZTMyKHNyZi0+ZmxhZ3MpOwotCWNtZC0+Ym9keS5mb3JtYXQgPSBjcHVfdG9fbGUzMihzcmYtPmZvcm1hdCk7Ci0JZm9yIChpID0gMDsgaSA8IERSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVM7ICsraSkgewotCQljbWQtPmJvZHkuZmFjZVtpXS5udW1NaXBMZXZlbHMgPQotCQkgICAgY3B1X3RvX2xlMzIoc3JmLT5taXBfbGV2ZWxzW2ldKTsKLQl9Ci0KLQljbWQgKz0gMTsKLQljbWRfc2l6ZSA9IChTVkdBM2RTaXplICopIGNtZDsKLQlzcmNfc2l6ZSA9IHNyZi0+c2l6ZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3JmLT5udW1fc2l6ZXM7ICsraSwgY21kX3NpemUrKywgc3JjX3NpemUrKykgewotCQljbWRfc2l6ZS0+d2lkdGggPSBjcHVfdG9fbGUzMihzcmNfc2l6ZS0+d2lkdGgpOwotCQljbWRfc2l6ZS0+aGVpZ2h0ID0gY3B1X3RvX2xlMzIoc3JjX3NpemUtPmhlaWdodCk7Ci0JCWNtZF9zaXplLT5kZXB0aCA9IGNwdV90b19sZTMyKHNyY19zaXplLT5kZXB0aCk7Ci0JfQotCi0Jdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzdWJtaXRfc2l6ZSk7Ci0JKHZvaWQpIHZtd18zZF9yZXNvdXJjZV9pbmMoZGV2X3ByaXYpOworCSh2b2lkKSB2bXdfM2RfcmVzb3VyY2VfaW5jKGRldl9wcml2LCBmYWxzZSk7CiAJdm13X3Jlc291cmNlX2FjdGl2YXRlKHJlcywgdm13X2h3X3N1cmZhY2VfZGVzdHJveSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgdm13X3VzZXJfc3VyZmFjZV9mcmVlKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykKQEAgLTQ4NiwxMiArMTEzOSw1OCBAQAogCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmID0gY29udGFpbmVyX29mKHJlcywgc3RydWN0IHZtd19zdXJmYWNlLCByZXMpOwogCXN0cnVjdCB2bXdfdXNlcl9zdXJmYWNlICp1c2VyX3NyZiA9CiAJICAgIGNvbnRhaW5lcl9vZihzcmYsIHN0cnVjdCB2bXdfdXNlcl9zdXJmYWNlLCBzcmYpOworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSBzcmYtPnJlcy5kZXZfcHJpdjsKKwl1aW50MzJfdCBzaXplID0gdXNlcl9zcmYtPnNpemU7CiAKKwlpZiAoc3JmLT5iYWNrdXApCisJCXR0bV9ib191bnJlZigmc3JmLT5iYWNrdXApOworCWtmcmVlKHNyZi0+b2Zmc2V0cyk7CiAJa2ZyZWUoc3JmLT5zaXplcyk7CiAJa2ZyZWUoc3JmLT5zbm9vcGVyLmltYWdlKTsKIAlrZnJlZSh1c2VyX3NyZik7CisJdHRtX21lbV9nbG9iYWxfZnJlZSh2bXdfbWVtX2dsb2IoZGV2X3ByaXYpLCBzaXplKTsKIH0KIAorLyoqCisgKiB2bXdfcmVzb3VyY2VfdW5yZXNlcnZlIC0gdW5yZXNlcnZlIHJlc291cmNlcyBwcmV2aW91c2x5IHJlc2VydmVkIGZvcgorICogY29tbWFuZCBzdWJtaXNzaW9uLgorICoKKyAqIEBsaXN0X2hlYWQ6IGxpc3Qgb2YgcmVzb3VyY2VzIHRvIHVucmVzZXJ2ZS4KKyAqCisgKiBDdXJyZW50bHkgb25seSBzdXJmYWNlcyBhcmUgY29uc2lkZXJlZCwgYW5kIHVucmVzZXJ2aW5nIGEgc3VyZmFjZQorICogbWVhbnMgcHV0dGluZyBpdCBiYWNrIG9uIHRoZSBkZXZpY2UncyBzdXJmYWNlIGxydSBsaXN0LAorICogc28gdGhhdCBpdCBjYW4gYmUgZXZpY3RlZCBpZiBuZWNlc3NhcnkuCisgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB0aGUgcmVzb3VyY2UgbGlzdCBhbmQKKyAqIGNoZWNrcyB3aGV0aGVyIHJlc291cmNlcyBhcmUgc3VyZmFjZXMsIGFuZCBpbiB0aGF0IGNhc2UgcHV0cyB0aGVtIGJhY2sKKyAqIG9uIHRoZSBkZXZpY2UncyBzdXJmYWNlIExSVSBsaXN0LgorICovCit2b2lkIHZtd19yZXNvdXJjZV91bnJlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXM7CisJc3RydWN0IHZtd19zdXJmYWNlICpzcmY7CisJcndsb2NrX3QgKmxvY2sgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsIGxpc3QsIHZhbGlkYXRlX2hlYWQpIHsKKworCQlpZiAocmVzLT5yZXNfZnJlZSAhPSAmdm13X3N1cmZhY2VfcmVzX2ZyZWUgJiYKKwkJICAgIHJlcy0+cmVzX2ZyZWUgIT0gJnZtd191c2VyX3N1cmZhY2VfZnJlZSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh1bmxpa2VseShsb2NrID09IE5VTEwpKSB7CisJCQlsb2NrID0gJnJlcy0+ZGV2X3ByaXYtPnJlc291cmNlX2xvY2s7CisJCQl3cml0ZV9sb2NrKGxvY2spOworCQl9CisKKwkJc3JmID0gY29udGFpbmVyX29mKHJlcywgc3RydWN0IHZtd19zdXJmYWNlLCByZXMpOworCQlsaXN0X2RlbF9pbml0KCZzcmYtPmxydV9oZWFkKTsKKwkJbGlzdF9hZGRfdGFpbCgmc3JmLT5scnVfaGVhZCwgJnJlcy0+ZGV2X3ByaXYtPnN1cmZhY2VfbHJ1KTsKKwl9CisKKwlpZiAobG9jayAhPSBOVUxMKQorCQl3cml0ZV91bmxvY2sobG9jayk7Cit9CisKKwogaW50IHZtd191c2VyX3N1cmZhY2VfbG9va3VwX2hhbmRsZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJCSAgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAogCQkJCSAgIHVpbnQzMl90IGhhbmRsZSwgc3RydWN0IHZtd19zdXJmYWNlICoqb3V0KQpAQCAtNTU2LDggKzEyNTUsNyBAQAogCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgdm13X3VzZXJfc3VyZmFjZSAqdXNlcl9zcmYgPQotCSAgICBrbWFsbG9jKHNpemVvZigqdXNlcl9zcmYpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3Qgdm13X3VzZXJfc3VyZmFjZSAqdXNlcl9zcmY7CiAJc3RydWN0IHZtd19zdXJmYWNlICpzcmY7CiAJc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzOwogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnRtcDsKQEAgLTU2OCwxMCArMTI2Niw1MSBAQAogCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlID0gdm13X2Zwcml2KGZpbGVfcHJpdiktPnRmaWxlOwogCXN0cnVjdCBkcm1fdm13X3NpemUgX191c2VyICp1c2VyX3NpemVzOwogCWludCByZXQ7Ci0JaW50IGk7CisJaW50IGksIGo7CisJdWludDMyX3QgY3VyX2JvX29mZnNldDsKKwlzdHJ1Y3QgZHJtX3Ztd19zaXplICpjdXJfc2l6ZTsKKwlzdHJ1Y3Qgdm13X3N1cmZhY2Vfb2Zmc2V0ICpjdXJfb2Zmc2V0OworCXVpbnQzMl90IHN0cmlkZV9icHA7CisJdWludDMyX3QgYnBwOworCXVpbnQzMl90IG51bV9zaXplczsKKwl1aW50MzJfdCBzaXplOworCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gdm13X21hc3RlcihmaWxlX3ByaXYtPm1hc3Rlcik7CiAKLQlpZiAodW5saWtlbHkodXNlcl9zcmYgPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICh1bmxpa2VseSh2bXdfdXNlcl9zdXJmYWNlX3NpemUgPT0gMCkpCisJCXZtd191c2VyX3N1cmZhY2Vfc2l6ZSA9IHR0bV9yb3VuZF9wb3Qoc2l6ZW9mKCp1c2VyX3NyZikpICsKKwkJCTEyODsKKworCW51bV9zaXplcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IERSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVM7ICsraSkKKwkJbnVtX3NpemVzICs9IHJlcS0+bWlwX2xldmVsc1tpXTsKKworCWlmIChudW1fc2l6ZXMgPiBEUk1fVk1XX01BWF9TVVJGQUNFX0ZBQ0VTICoKKwkgICAgRFJNX1ZNV19NQVhfTUlQX0xFVkVMUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaXplID0gdm13X3VzZXJfc3VyZmFjZV9zaXplICsgMTI4ICsKKwkJdHRtX3JvdW5kX3BvdChudW1fc2l6ZXMgKiBzaXplb2Yoc3RydWN0IGRybV92bXdfc2l6ZSkpICsKKwkJdHRtX3JvdW5kX3BvdChudW1fc2l6ZXMgKiBzaXplb2Yoc3RydWN0IHZtd19zdXJmYWNlX29mZnNldCkpOworCisKKwlyZXQgPSB0dG1fcmVhZF9sb2NrKCZ2bWFzdGVyLT5sb2NrLCB0cnVlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX21lbV9nbG9iYWxfYWxsb2Modm13X21lbV9nbG9iKGRldl9wcml2KSwKKwkJCQkgICBzaXplLCBmYWxzZSwgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJCURSTV9FUlJPUigiT3V0IG9mIGdyYXBoaWNzIG1lbW9yeSBmb3Igc3VyZmFjZSIKKwkJCQkgICIgY3JlYXRpb24uXG4iKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXVzZXJfc3JmID0ga21hbGxvYyhzaXplb2YoKnVzZXJfc3JmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KHVzZXJfc3JmID09IE5VTEwpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3VzZXJfc3JmOworCX0KIAogCXNyZiA9ICZ1c2VyX3NyZi0+c3JmOwogCXJlcyA9ICZzcmYtPnJlczsKQEAgLTU3OSwyMSArMTMxOCwyMiBAQAogCXNyZi0+ZmxhZ3MgPSByZXEtPmZsYWdzOwogCXNyZi0+Zm9ybWF0ID0gcmVxLT5mb3JtYXQ7CiAJc3JmLT5zY2Fub3V0ID0gcmVxLT5zY2Fub3V0OwotCW1lbWNweShzcmYtPm1pcF9sZXZlbHMsIHJlcS0+bWlwX2xldmVscywgc2l6ZW9mKHNyZi0+bWlwX2xldmVscykpOwotCXNyZi0+bnVtX3NpemVzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgRFJNX1ZNV19NQVhfU1VSRkFDRV9GQUNFUzsgKytpKQotCQlzcmYtPm51bV9zaXplcyArPSBzcmYtPm1pcF9sZXZlbHNbaV07CisJc3JmLT5iYWNrdXAgPSBOVUxMOwogCi0JaWYgKHNyZi0+bnVtX3NpemVzID4gRFJNX1ZNV19NQVhfU1VSRkFDRV9GQUNFUyAqCi0JICAgIERSTV9WTVdfTUFYX01JUF9MRVZFTFMpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfZXJyMDsKLQl9CisJbWVtY3B5KHNyZi0+bWlwX2xldmVscywgcmVxLT5taXBfbGV2ZWxzLCBzaXplb2Yoc3JmLT5taXBfbGV2ZWxzKSk7CisJc3JmLT5udW1fc2l6ZXMgPSBudW1fc2l6ZXM7CisJdXNlcl9zcmYtPnNpemUgPSBzaXplOwogCiAJc3JmLT5zaXplcyA9IGttYWxsb2Moc3JmLT5udW1fc2l6ZXMgKiBzaXplb2YoKnNyZi0+c2l6ZXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoc3JmLT5zaXplcyA9PSBOVUxMKSkgewogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9lcnIwOworCQlnb3RvIG91dF9ub19zaXplczsKKwl9CisJc3JmLT5vZmZzZXRzID0ga21hbGxvYyhzcmYtPm51bV9zaXplcyAqIHNpemVvZigqc3JmLT5vZmZzZXRzKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoc3JmLT5zaXplcyA9PSBOVUxMKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub19vZmZzZXRzOwogCX0KIAogCXVzZXJfc2l6ZXMgPSAoc3RydWN0IGRybV92bXdfc2l6ZSBfX3VzZXIgKikodW5zaWduZWQgbG9uZykKQEAgLTYwMyw5ICsxMzQzLDMyIEBACiAJCQkgICAgIHNyZi0+bnVtX3NpemVzICogc2l6ZW9mKCpzcmYtPnNpemVzKSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIG91dF9lcnIxOworCQlnb3RvIG91dF9ub19jb3B5OwogCX0KIAorCWN1cl9ib19vZmZzZXQgPSAwOworCWN1cl9vZmZzZXQgPSBzcmYtPm9mZnNldHM7CisJY3VyX3NpemUgPSBzcmYtPnNpemVzOworCisJYnBwID0gdm13X3NmX2JwcFtzcmYtPmZvcm1hdF0uYnBwOworCXN0cmlkZV9icHAgPSB2bXdfc2ZfYnBwW3NyZi0+Zm9ybWF0XS5zX2JwcDsKKworCWZvciAoaSA9IDA7IGkgPCBEUk1fVk1XX01BWF9TVVJGQUNFX0ZBQ0VTOyArK2kpIHsKKwkJZm9yIChqID0gMDsgaiA8IHNyZi0+bWlwX2xldmVsc1tpXTsgKytqKSB7CisJCQl1aW50MzJfdCBzdHJpZGUgPQorCQkJCShjdXJfc2l6ZS0+d2lkdGggKiBzdHJpZGVfYnBwICsgNykgPj4gMzsKKworCQkJY3VyX29mZnNldC0+ZmFjZSA9IGk7CisJCQljdXJfb2Zmc2V0LT5taXAgPSBqOworCQkJY3VyX29mZnNldC0+Ym9fb2Zmc2V0ID0gY3VyX2JvX29mZnNldDsKKwkJCWN1cl9ib19vZmZzZXQgKz0gc3RyaWRlICogY3VyX3NpemUtPmhlaWdodCAqCisJCQkJY3VyX3NpemUtPmRlcHRoICogYnBwIC8gc3RyaWRlX2JwcDsKKwkJCSsrY3VyX29mZnNldDsKKwkJCSsrY3VyX3NpemU7CisJCX0KKwl9CisJc3JmLT5iYWNrdXBfc2l6ZSA9IGN1cl9ib19vZmZzZXQ7CisKIAlpZiAoc3JmLT5zY2Fub3V0ICYmCiAJICAgIHNyZi0+bnVtX3NpemVzID09IDEgJiYKIAkgICAgc3JmLT5zaXplc1swXS53aWR0aCA9PSA2NCAmJgpAQCAtNjE3LDcgKzEzODAsNyBAQAogCQlpZiAoIXNyZi0+c25vb3Blci5pbWFnZSkgewogCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgY3Vyc29yX2ltYWdlXG4iKTsKIAkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF9lcnIxOworCQkJZ290byBvdXRfbm9fY29weTsKIAkJfQogCX0gZWxzZSB7CiAJCXNyZi0+c25vb3Blci5pbWFnZSA9IE5VTEw7CkBAIC02MzQsNyArMTM5Nyw3IEBACiAKIAlyZXQgPSB2bXdfc3VyZmFjZV9pbml0KGRldl9wcml2LCBzcmYsIHZtd191c2VyX3N1cmZhY2VfZnJlZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJdG1wID0gdm13X3Jlc291cmNlX3JlZmVyZW5jZSgmc3JmLT5yZXMpOwogCXJldCA9IHR0bV9iYXNlX29iamVjdF9pbml0KHRmaWxlLCAmdXNlcl9zcmYtPmJhc2UsCkBAIC02NDQsNyArMTQwNyw3IEBACiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnRtcCk7CiAJCXZtd19yZXNvdXJjZV91bnJlZmVyZW5jZSgmcmVzKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCXJlcC0+c2lkID0gdXNlcl9zcmYtPmJhc2UuaGFzaC5rZXk7CkBAIC02NTIsMTEgKzE0MTUsMTkgQEAKIAkJRFJNX0VSUk9SKCJDcmVhdGVkIGJhZCBTdXJmYWNlIElELlxuIik7CiAKIAl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnJlcyk7CisKKwl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOwogCXJldHVybiAwOwotb3V0X2VycjE6CitvdXRfbm9fY29weToKKwlrZnJlZShzcmYtPm9mZnNldHMpOworb3V0X25vX29mZnNldHM6CiAJa2ZyZWUoc3JmLT5zaXplcyk7Ci1vdXRfZXJyMDoKK291dF9ub19zaXplczoKIAlrZnJlZSh1c2VyX3NyZik7CitvdXRfbm9fdXNlcl9zcmY6CisJdHRtX21lbV9nbG9iYWxfZnJlZSh2bXdfbWVtX2dsb2IoZGV2X3ByaXYpLCBzaXplKTsKK291dF91bmxvY2s6CisJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05NzAsNyArMTc0MSw3IEBACiAJaW50IHJldDsKIAogCXJldCA9IHZtd19yZXNvdXJjZV9pbml0KGRldl9wcml2LCByZXMsICZkZXZfcHJpdi0+c3RyZWFtX2lkciwKLQkJCQlWTVdfUkVTX1NUUkVBTSwgcmVzX2ZyZWUpOworCQkJCVZNV19SRVNfU1RSRUFNLCBmYWxzZSwgcmVzX2ZyZWUsIE5VTEwpOwogCiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQlpZiAocmVzX2ZyZWUgPT0gTlVMTCkKQEAgLTEwMDAsOCArMTc3MSwxMSBAQAogewogCXN0cnVjdCB2bXdfdXNlcl9zdHJlYW0gKnN0cmVhbSA9CiAJICAgIGNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfdXNlcl9zdHJlYW0sIHN0cmVhbS5yZXMpOworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSByZXMtPmRldl9wcml2OwogCiAJa2ZyZWUoc3RyZWFtKTsKKwl0dG1fbWVtX2dsb2JhbF9mcmVlKHZtd19tZW1fZ2xvYihkZXZfcHJpdiksCisJCQkgICAgdm13X3VzZXJfc3RyZWFtX3NpemUpOwogfQogCiAvKioKQEAgLTEwNTUsMjMgKzE4MjksNTYgQEAKIAkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOwotCXN0cnVjdCB2bXdfdXNlcl9zdHJlYW0gKnN0cmVhbSA9IGttYWxsb2Moc2l6ZW9mKCpzdHJlYW0pLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3Qgdm13X3VzZXJfc3RyZWFtICpzdHJlYW07CiAJc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzOwogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnRtcDsKIAlzdHJ1Y3QgZHJtX3Ztd19zdHJlYW1fYXJnICphcmcgPSAoc3RydWN0IGRybV92bXdfc3RyZWFtX2FyZyAqKWRhdGE7CiAJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUgPSB2bXdfZnByaXYoZmlsZV9wcml2KS0+dGZpbGU7CisJc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIgPSB2bXdfbWFzdGVyKGZpbGVfcHJpdi0+bWFzdGVyKTsKIAlpbnQgcmV0OwogCi0JaWYgKHVubGlrZWx5KHN0cmVhbSA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FTk9NRU07CisJLyoKKwkgKiBBcHByb3hpbWF0ZSBpZHIgbWVtb3J5IHVzYWdlIHdpdGggMTI4IGJ5dGVzLiBJdCB3aWxsIGJlIGxpbWl0ZWQKKwkgKiBieSBtYXhpbXVtIG51bWJlcl9vZiBzdHJlYW1zIGFueXdheT8KKwkgKi8KKworCWlmICh1bmxpa2VseSh2bXdfdXNlcl9zdHJlYW1fc2l6ZSA9PSAwKSkKKwkJdm13X3VzZXJfc3RyZWFtX3NpemUgPSB0dG1fcm91bmRfcG90KHNpemVvZigqc3RyZWFtKSkgKyAxMjg7CisKKwlyZXQgPSB0dG1fcmVhZF9sb2NrKCZ2bWFzdGVyLT5sb2NrLCB0cnVlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX21lbV9nbG9iYWxfYWxsb2Modm13X21lbV9nbG9iKGRldl9wcml2KSwKKwkJCQkgICB2bXdfdXNlcl9zdHJlYW1fc2l6ZSwKKwkJCQkgICBmYWxzZSwgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJCURSTV9FUlJPUigiT3V0IG9mIGdyYXBoaWNzIG1lbW9yeSBmb3Igc3RyZWFtIgorCQkJCSAgIiBjcmVhdGlvbi5cbiIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisKKwlzdHJlYW0gPSBrbWFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KHN0cmVhbSA9PSBOVUxMKSkgeworCQl0dG1fbWVtX2dsb2JhbF9mcmVlKHZtd19tZW1fZ2xvYihkZXZfcHJpdiksCisJCQkJICAgIHZtd191c2VyX3N0cmVhbV9zaXplKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KIAogCXJlcyA9ICZzdHJlYW0tPnN0cmVhbS5yZXM7CiAJc3RyZWFtLT5iYXNlLnNoYXJlYWJsZSA9IGZhbHNlOwogCXN0cmVhbS0+YmFzZS50ZmlsZSA9IE5VTEw7CiAKKwkvKgorCSAqIEZyb20gaGVyZSBvbiwgdGhlIGRlc3RydWN0b3IgdGFrZXMgb3ZlciByZXNvdXJjZSBmcmVlaW5nLgorCSAqLworCiAJcmV0ID0gdm13X3N0cmVhbV9pbml0KGRldl9wcml2LCAmc3RyZWFtLT5zdHJlYW0sIHZtd191c2VyX3N0cmVhbV9mcmVlKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dF91bmxvY2s7CiAKIAl0bXAgPSB2bXdfcmVzb3VyY2VfcmVmZXJlbmNlKHJlcyk7CiAJcmV0ID0gdHRtX2Jhc2Vfb2JqZWN0X2luaXQodGZpbGUsICZzdHJlYW0tPmJhc2UsIGZhbHNlLCBWTVdfUkVTX1NUUkVBTSwKQEAgLTEwODUsNiArMTg5Miw4IEBACiAJYXJnLT5zdHJlYW1faWQgPSByZXMtPmlkOwogb3V0X2VycjoKIAl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnJlcyk7CitvdXRfdW5sb2NrOgorCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfc2Nybi5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfc2Nybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZWZkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9zY3JuLmMKQEAgLTAsMCArMSw1MzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCDCqSAyMDExIFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidm13Z2Z4X2ttcy5oIgorCisKKyNkZWZpbmUgdm13X2NydGNfdG9fc291KHgpIFwKKwljb250YWluZXJfb2YoeCwgc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQsIGJhc2UuY3J0YykKKyNkZWZpbmUgdm13X2VuY29kZXJfdG9fc291KHgpIFwKKwljb250YWluZXJfb2YoeCwgc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQsIGJhc2UuZW5jb2RlcikKKyNkZWZpbmUgdm13X2Nvbm5lY3Rvcl90b19zb3UoeCkgXAorCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCwgYmFzZS5jb25uZWN0b3IpCisKK3N0cnVjdCB2bXdfc2NyZWVuX29iamVjdF9kaXNwbGF5IHsKKwl1bnNpZ25lZCBudW1faW1wbGljaXQ7CisKKwlzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICppbXBsaWNpdF9mYjsKK307CisKKy8qKgorICogRGlzcGxheSB1bml0IHVzaW5nIHNjcmVlbiBvYmplY3RzLgorICovCitzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCB7CisJc3RydWN0IHZtd19kaXNwbGF5X3VuaXQgYmFzZTsKKworCXVuc2lnbmVkIGxvbmcgYnVmZmVyX3NpemU7IC8qKjwgU2l6ZSBvZiBhbGxvY2F0ZWQgYnVmZmVyICovCisJc3RydWN0IHZtd19kbWFfYnVmZmVyICpidWZmZXI7IC8qKjwgQmFja2luZyBzdG9yZSBidWZmZXIgKi8KKworCWJvb2wgZGVmaW5lZDsKKwlib29sIGFjdGl2ZV9pbXBsaWNpdDsKK307CisKK3N0YXRpYyB2b2lkIHZtd19zb3VfZGVzdHJveShzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCAqc291KQoreworCXZtd19kaXNwbGF5X3VuaXRfY2xlYW51cCgmc291LT5iYXNlKTsKKwlrZnJlZShzb3UpOworfQorCisKKy8qCisgKiBTY3JlZW4gT2JqZWN0IERpc3BsYXkgVW5pdCBDUlRDIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIHZtd19zb3VfY3J0Y19kZXN0cm95KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwl2bXdfc291X2Rlc3Ryb3kodm13X2NydGNfdG9fc291KGNydGMpKTsKK30KKworc3RhdGljIHZvaWQgdm13X3NvdV9kZWxfYWN0aXZlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYsCisJCQkgICAgICBzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCAqc291KQoreworCXN0cnVjdCB2bXdfc2NyZWVuX29iamVjdF9kaXNwbGF5ICpsZCA9IHZtd19wcml2LT5zb3VfcHJpdjsKKworCWlmIChzb3UtPmFjdGl2ZV9pbXBsaWNpdCkgeworCQlpZiAoLS0obGQtPm51bV9pbXBsaWNpdCkgPT0gMCkKKwkJCWxkLT5pbXBsaWNpdF9mYiA9IE5VTEw7CisJCXNvdS0+YWN0aXZlX2ltcGxpY2l0ID0gZmFsc2U7CisJfQorfQorCitzdGF0aWMgdm9pZCB2bXdfc291X2FkZF9hY3RpdmUoc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdiwKKwkJCSAgICAgIHN0cnVjdCB2bXdfc2NyZWVuX29iamVjdF91bml0ICpzb3UsCisJCQkgICAgICBzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICp2ZmIpCit7CisJc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X2Rpc3BsYXkgKmxkID0gdm13X3ByaXYtPnNvdV9wcml2OworCisJQlVHX09OKCFsZC0+bnVtX2ltcGxpY2l0ICYmIGxkLT5pbXBsaWNpdF9mYik7CisKKwlpZiAoIXNvdS0+YWN0aXZlX2ltcGxpY2l0ICYmIHNvdS0+YmFzZS5pc19pbXBsaWNpdCkgeworCQlsZC0+aW1wbGljaXRfZmIgPSB2ZmI7CisJCXNvdS0+YWN0aXZlX2ltcGxpY2l0ID0gdHJ1ZTsKKwkJbGQtPm51bV9pbXBsaWNpdCsrOworCX0KK30KKworLyoqCisgKiBTZW5kIHRoZSBmaWZvIGNvbW1hbmQgdG8gY3JlYXRlIGEgc2NyZWVuLgorICovCitzdGF0aWMgaW50IHZtd19zb3VfZmlmb19jcmVhdGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCAqc291LAorCQkJICAgICAgIHVpbnQzMl90IHgsIHVpbnQzMl90IHksCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc2l6ZV90IGZpZm9fc2l6ZTsKKworCXN0cnVjdCB7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCBjbWRUeXBlOworCQl9IGhlYWRlcjsKKwkJU1ZHQVNjcmVlbk9iamVjdCBvYmo7CisJfSAqY21kOworCisJQlVHX09OKCFzb3UtPmJ1ZmZlcik7CisKKwlmaWZvX3NpemUgPSBzaXplb2YoKmNtZCk7CisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgZmlmb19zaXplKTsKKwkvKiBUaGUgaGFyZHdhcmUgaGFzIGh1bmcsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0IGhlcmUuICovCisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZpZm8gcmVzZXJ2ZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGNtZCwgMCwgZmlmb19zaXplKTsKKwljbWQtPmhlYWRlci5jbWRUeXBlID0gU1ZHQV9DTURfREVGSU5FX1NDUkVFTjsKKwljbWQtPm9iai5zdHJ1Y3RTaXplID0gc2l6ZW9mKFNWR0FTY3JlZW5PYmplY3QpOworCWNtZC0+b2JqLmlkID0gc291LT5iYXNlLnVuaXQ7CisJY21kLT5vYmouZmxhZ3MgPSBTVkdBX1NDUkVFTl9IQVNfUk9PVCB8CisJCShzb3UtPmJhc2UudW5pdCA9PSAwID8gU1ZHQV9TQ1JFRU5fSVNfUFJJTUFSWSA6IDApOworCWNtZC0+b2JqLnNpemUud2lkdGggPSBtb2RlLT5oZGlzcGxheTsKKwljbWQtPm9iai5zaXplLmhlaWdodCA9IG1vZGUtPnZkaXNwbGF5OworCWlmIChzb3UtPmJhc2UuaXNfaW1wbGljaXQpIHsKKwkJY21kLT5vYmoucm9vdC54ID0geDsKKwkJY21kLT5vYmoucm9vdC55ID0geTsKKwl9IGVsc2UgeworCQljbWQtPm9iai5yb290LnggPSBzb3UtPmJhc2UuZ3VpX3g7CisJCWNtZC0+b2JqLnJvb3QueSA9IHNvdS0+YmFzZS5ndWlfeTsKKwl9CisKKwkvKiBPayB0byBhc3N1bWUgdGhhdCBidWZmZXIgaXMgcGlubmVkIGluIHZyYW0gKi8KKwl2bXdfYm9fZ2V0X2d1ZXN0X3B0cigmc291LT5idWZmZXItPmJhc2UsICZjbWQtPm9iai5iYWNraW5nU3RvcmUucHRyKTsKKwljbWQtPm9iai5iYWNraW5nU3RvcmUucGl0Y2ggPSBtb2RlLT5oZGlzcGxheSAqIDQ7CisKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIGZpZm9fc2l6ZSk7CisKKwlzb3UtPmRlZmluZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2VuZCB0aGUgZmlmbyBjb21tYW5kIHRvIGRlc3Ryb3kgYSBzY3JlZW4uCisgKi8KK3N0YXRpYyBpbnQgdm13X3NvdV9maWZvX2Rlc3Ryb3koc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQlzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCAqc291KQoreworCXNpemVfdCBmaWZvX3NpemU7CisJaW50IHJldDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCBjbWRUeXBlOworCQl9IGhlYWRlcjsKKwkJU1ZHQUZpZm9DbWREZXN0cm95U2NyZWVuIGJvZHk7CisJfSAqY21kOworCisJLyogbm8gbmVlZCB0byBkbyBhbnl0aGluZyAqLworCWlmICh1bmxpa2VseSghc291LT5kZWZpbmVkKSkKKwkJcmV0dXJuIDA7CisKKwlmaWZvX3NpemUgPSBzaXplb2YoKmNtZCk7CisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgZmlmb19zaXplKTsKKwkvKiB0aGUgaGFyZHdhcmUgaGFzIGh1bmcsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0IGhlcmUgKi8KKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmlmbyByZXNlcnZlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoY21kLCAwLCBmaWZvX3NpemUpOworCWNtZC0+aGVhZGVyLmNtZFR5cGUgPSBTVkdBX0NNRF9ERVNUUk9ZX1NDUkVFTjsKKwljbWQtPmJvZHkuc2NyZWVuSWQgPSBzb3UtPmJhc2UudW5pdDsKKworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgZmlmb19zaXplKTsKKworCS8qIEZvcmNlIHN5bmMgKi8KKwlyZXQgPSB2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgZmFsc2UsIHRydWUsIDAsIGZhbHNlLCAzKkhaKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlEUk1fRVJST1IoIkZhaWxlZCB0byBzeW5jIHdpdGggSFciKTsKKwllbHNlCisJCXNvdS0+ZGVmaW5lZCA9IGZhbHNlOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBGcmVlIHRoZSBiYWNraW5nIHN0b3JlLgorICovCitzdGF0aWMgdm9pZCB2bXdfc291X2JhY2tpbmdfZnJlZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSBzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCAqc291KQoreworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm87CisKKwlpZiAodW5saWtlbHkoc291LT5idWZmZXIgPT0gTlVMTCkpCisJCXJldHVybjsKKworCWJvID0gJnNvdS0+YnVmZmVyLT5iYXNlOworCXR0bV9ib191bnJlZigmYm8pOworCXNvdS0+YnVmZmVyID0gTlVMTDsKKwlzb3UtPmJ1ZmZlcl9zaXplID0gMDsKK30KKworLyoqCisgKiBBbGxvY2F0ZSB0aGUgYmFja2luZyBzdG9yZSBmb3IgdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCB2bXdfc291X2JhY2tpbmdfYWxsb2Moc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQgKnNvdSwKKwkJCQkgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCByZXQ7CisKKwlpZiAoc291LT5idWZmZXJfc2l6ZSA9PSBzaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChzb3UtPmJ1ZmZlcikKKwkJdm13X3NvdV9iYWNraW5nX2ZyZWUoZGV2X3ByaXYsIHNvdSk7CisKKwlzb3UtPmJ1ZmZlciA9IGt6YWxsb2Moc2l6ZW9mKCpzb3UtPmJ1ZmZlciksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShzb3UtPmJ1ZmZlciA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBBZnRlciB3ZSBoYXZlIGFsbG9jZWQgdGhlIGJhY2tpbmcgc3RvcmUgbWlnaHQgbm90IGJlIGFibGUgdG8KKwkgKiByZXN1bWUgdGhlIG92ZXJsYXlzLCB0aGlzIGlzIHByZWZlcnJlZCB0byBmYWlsaW5nIHRvIGFsbG9jLgorCSAqLworCXZtd19vdmVybGF5X3BhdXNlX2FsbChkZXZfcHJpdik7CisJcmV0ID0gdm13X2RtYWJ1Zl9pbml0KGRldl9wcml2LCBzb3UtPmJ1ZmZlciwgc2l6ZSwKKwkJCSAgICAgICZ2bXdfdnJhbV9uZV9wbGFjZW1lbnQsCisJCQkgICAgICBmYWxzZSwgJnZtd19kbWFidWZfYm9fZnJlZSk7CisJdm13X292ZXJsYXlfcmVzdW1lX2FsbChkZXZfcHJpdik7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlzb3UtPmJ1ZmZlciA9IE5VTEw7IC8qIHZtd19kbWFidWZfaW5pdCBmcmVlcyBvbiBlcnJvciAqLworCWVsc2UKKwkJc291LT5idWZmZXJfc2l6ZSA9IHNpemU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZtd19zb3VfY3J0Y19zZXRfY29uZmlnKHN0cnVjdCBkcm1fbW9kZV9zZXQgKnNldCkKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2OworCXN0cnVjdCB2bXdfc2NyZWVuX29iamVjdF91bml0ICpzb3U7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghc2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2V0LT5jcnRjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGdldCB0aGUgc291ICovCisJY3J0YyA9IHNldC0+Y3J0YzsKKwlzb3UgPSB2bXdfY3J0Y190b19zb3UoY3J0Yyk7CisJdmZiID0gc2V0LT5mYiA/IHZtd19mcmFtZWJ1ZmZlcl90b192ZmIoc2V0LT5mYikgOiBOVUxMOworCWRldl9wcml2ID0gdm13X3ByaXYoY3J0Yy0+ZGV2KTsKKworCWlmIChzZXQtPm51bV9jb25uZWN0b3JzID4gMSkgeworCQlEUk1fRVJST1IoInRvIG1hbnkgY29ubmVjdG9yc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzZXQtPm51bV9jb25uZWN0b3JzID09IDEgJiYKKwkgICAgc2V0LT5jb25uZWN0b3JzWzBdICE9ICZzb3UtPmJhc2UuY29ubmVjdG9yKSB7CisJCURSTV9FUlJPUigiY29ubmVjdG9yIGRvZXNuJ3QgbWF0Y2ggJXAgJXBcbiIsCisJCQlzZXQtPmNvbm5lY3RvcnNbMF0sICZzb3UtPmJhc2UuY29ubmVjdG9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc291IG9ubHkgc3VwcG9ydHMgb25lIGZiIGFjdGl2ZSBhdCB0aGUgdGltZSAqLworCWlmIChzb3UtPmJhc2UuaXNfaW1wbGljaXQgJiYKKwkgICAgZGV2X3ByaXYtPnNvdV9wcml2LT5pbXBsaWNpdF9mYiAmJiB2ZmIgJiYKKwkgICAgIShkZXZfcHJpdi0+c291X3ByaXYtPm51bV9pbXBsaWNpdCA9PSAxICYmCisJICAgICAgc291LT5hY3RpdmVfaW1wbGljaXQpICYmCisJICAgIGRldl9wcml2LT5zb3VfcHJpdi0+aW1wbGljaXRfZmIgIT0gdmZiKSB7CisJCURSTV9FUlJPUigiTXVsdGlwbGUgZnJhbWVidWZmZXJzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzaW5jZSB0aGV5IGFsd2F5cyBtYXAgb25lIHRvIG9uZSB0aGVzZSBhcmUgc2FmZSAqLworCWNvbm5lY3RvciA9ICZzb3UtPmJhc2UuY29ubmVjdG9yOworCWVuY29kZXIgPSAmc291LT5iYXNlLmVuY29kZXI7CisKKwkvKiBzaG91bGQgd2UgdHVybiB0aGUgY3J0YyBvZmYgKi8KKwlpZiAoc2V0LT5udW1fY29ubmVjdG9ycyA9PSAwIHx8ICFzZXQtPm1vZGUgfHwgIXNldC0+ZmIpIHsKKwkJcmV0ID0gdm13X3NvdV9maWZvX2Rlc3Ryb3koZGV2X3ByaXYsIHNvdSk7CisJCS8qIHRoZSBoYXJkd2FyZSBoYXMgaHVuZyBkb24ndCBkbyBhbnl0aGluZyBtb3JlICovCisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlyZXR1cm4gcmV0OworCisJCWNvbm5lY3Rvci0+ZW5jb2RlciA9IE5VTEw7CisJCWVuY29kZXItPmNydGMgPSBOVUxMOworCQljcnRjLT5mYiA9IE5VTEw7CisJCWNydGMtPnggPSAwOworCQljcnRjLT55ID0gMDsKKworCQl2bXdfc291X2RlbF9hY3RpdmUoZGV2X3ByaXYsIHNvdSk7CisKKwkJdm13X3NvdV9iYWNraW5nX2ZyZWUoZGV2X3ByaXYsIHNvdSk7CisKKwkJcmV0dXJuIDA7CisJfQorCisKKwkvKiB3ZSBub3cga25vdyB3ZSB3YW50IHRvIHNldCBhIG1vZGUgKi8KKwltb2RlID0gc2V0LT5tb2RlOworCWZiID0gc2V0LT5mYjsKKworCWlmIChzZXQtPnggKyBtb2RlLT5oZGlzcGxheSA+IGZiLT53aWR0aCB8fAorCSAgICBzZXQtPnkgKyBtb2RlLT52ZGlzcGxheSA+IGZiLT5oZWlnaHQpIHsKKwkJRFJNX0VSUk9SKCJzZXQgb3V0c2lkZSBvZiBmcmFtZWJ1ZmZlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZtd19mYl9vZmYoZGV2X3ByaXYpOworCisJaWYgKG1vZGUtPmhkaXNwbGF5ICE9IGNydGMtPm1vZGUuaGRpc3BsYXkgfHwKKwkgICAgbW9kZS0+dmRpc3BsYXkgIT0gY3J0Yy0+bW9kZS52ZGlzcGxheSkgeworCQkvKiBubyBuZWVkIHRvIGNoZWNrIGlmIGRlcHRoIGlzIGRpZmZlcmVudCwgYmVjYXVzZSBiYWNraW5nCisJCSAqIHN0b3JlIGRlcHRoIGlzIGZvcmNlZCB0byA0IGJ5IHRoZSBkZXZpY2UuCisJCSAqLworCisJCXJldCA9IHZtd19zb3VfZmlmb19kZXN0cm95KGRldl9wcml2LCBzb3UpOworCQkvKiB0aGUgaGFyZHdhcmUgaGFzIGh1bmcgZG9uJ3QgZG8gYW55dGhpbmcgbW9yZSAqLworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJcmV0dXJuIHJldDsKKworCQl2bXdfc291X2JhY2tpbmdfZnJlZShkZXZfcHJpdiwgc291KTsKKwl9CisKKwlpZiAoIXNvdS0+YnVmZmVyKSB7CisJCS8qIGZvcmNlZCB0byBkZXB0aCA0IGJ5IHRoZSBkZXZpY2UgKi8KKwkJc2l6ZV90IHNpemUgPSBtb2RlLT5oZGlzcGxheSAqIG1vZGUtPnZkaXNwbGF5ICogNDsKKwkJcmV0ID0gdm13X3NvdV9iYWNraW5nX2FsbG9jKGRldl9wcml2LCBzb3UsIHNpemUpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB2bXdfc291X2ZpZm9fY3JlYXRlKGRldl9wcml2LCBzb3UsIHNldC0+eCwgc2V0LT55LCBtb2RlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCS8qCisJCSAqIFdlIGFyZSBpbiBhIGJpdCBvZiBhIHNpdHVhdGlvbiBoZXJlLCB0aGUgaGFyZHdhcmUgaGFzCisJCSAqIGh1bmcgYW5kIHdlIG1heSBvciBtYXkgbm90IGhhdmUgYSBidWZmZXIgaGFuZ2luZyBvZgorCQkgKiB0aGUgc2NyZWVuIG9iamVjdCwgYmVzdCB0aGluZyB0byBkbyBpcyBub3QgZG8gYW55dGhpbmcKKwkJICogaWYgd2Ugd2hlcmUgZGVmaW5lZCwgaWYgbm90IGp1c3QgdHVybiB0aGUgY3J0YyBvZi4KKwkJICogTm90IHdoYXQgdXNlcnNwYWNlIHdhbnRzIGJ1dCBpdCBuZWVkcyB0byBodGZ1LgorCQkgKi8KKwkJaWYgKHNvdS0+ZGVmaW5lZCkKKwkJCXJldHVybiByZXQ7CisKKwkJY29ubmVjdG9yLT5lbmNvZGVyID0gTlVMTDsKKwkJZW5jb2Rlci0+Y3J0YyA9IE5VTEw7CisJCWNydGMtPmZiID0gTlVMTDsKKwkJY3J0Yy0+eCA9IDA7CisJCWNydGMtPnkgPSAwOworCisJCXJldHVybiByZXQ7CisJfQorCisJdm13X3NvdV9hZGRfYWN0aXZlKGRldl9wcml2LCBzb3UsIHZmYik7CisKKwljb25uZWN0b3ItPmVuY29kZXIgPSBlbmNvZGVyOworCWVuY29kZXItPmNydGMgPSBjcnRjOworCWNydGMtPm1vZGUgPSAqbW9kZTsKKwljcnRjLT5mYiA9IGZiOworCWNydGMtPnggPSBzZXQtPng7CisJY3J0Yy0+eSA9IHNldC0+eTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRybV9jcnRjX2Z1bmNzIHZtd19zY3JlZW5fb2JqZWN0X2NydGNfZnVuY3MgPSB7CisJLnNhdmUgPSB2bXdfZHVfY3J0Y19zYXZlLAorCS5yZXN0b3JlID0gdm13X2R1X2NydGNfcmVzdG9yZSwKKwkuY3Vyc29yX3NldCA9IHZtd19kdV9jcnRjX2N1cnNvcl9zZXQsCisJLmN1cnNvcl9tb3ZlID0gdm13X2R1X2NydGNfY3Vyc29yX21vdmUsCisJLmdhbW1hX3NldCA9IHZtd19kdV9jcnRjX2dhbW1hX3NldCwKKwkuZGVzdHJveSA9IHZtd19zb3VfY3J0Y19kZXN0cm95LAorCS5zZXRfY29uZmlnID0gdm13X3NvdV9jcnRjX3NldF9jb25maWcsCit9OworCisvKgorICogU2NyZWVuIE9iamVjdCBEaXNwbGF5IFVuaXQgZW5jb2RlciBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCB2bXdfc291X2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJdm13X3NvdV9kZXN0cm95KHZtd19lbmNvZGVyX3RvX3NvdShlbmNvZGVyKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3Mgdm13X3NjcmVlbl9vYmplY3RfZW5jb2Rlcl9mdW5jcyA9IHsKKwkuZGVzdHJveSA9IHZtd19zb3VfZW5jb2Rlcl9kZXN0cm95LAorfTsKKworLyoKKyAqIFNjcmVlbiBPYmplY3QgRGlzcGxheSBVbml0IGNvbm5lY3RvciBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCB2bXdfc291X2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJdm13X3NvdV9kZXN0cm95KHZtd19jb25uZWN0b3JfdG9fc291KGNvbm5lY3RvcikpOworfQorCitzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3Mgdm13X2xlZ2FjeV9jb25uZWN0b3JfZnVuY3MgPSB7CisJLmRwbXMgPSB2bXdfZHVfY29ubmVjdG9yX2RwbXMsCisJLnNhdmUgPSB2bXdfZHVfY29ubmVjdG9yX3NhdmUsCisJLnJlc3RvcmUgPSB2bXdfZHVfY29ubmVjdG9yX3Jlc3RvcmUsCisJLmRldGVjdCA9IHZtd19kdV9jb25uZWN0b3JfZGV0ZWN0LAorCS5maWxsX21vZGVzID0gdm13X2R1X2Nvbm5lY3Rvcl9maWxsX21vZGVzLAorCS5zZXRfcHJvcGVydHkgPSB2bXdfZHVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSwKKwkuZGVzdHJveSA9IHZtd19zb3VfY29ubmVjdG9yX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgaW50IHZtd19zb3VfaW5pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCB1bnNpZ25lZCB1bml0KQoreworCXN0cnVjdCB2bXdfc2NyZWVuX29iamVjdF91bml0ICpzb3U7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCisJc291ID0ga3phbGxvYyhzaXplb2YoKnNvdSksIEdGUF9LRVJORUwpOworCWlmICghc291KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNvdS0+YmFzZS51bml0ID0gdW5pdDsKKwljcnRjID0gJnNvdS0+YmFzZS5jcnRjOworCWVuY29kZXIgPSAmc291LT5iYXNlLmVuY29kZXI7CisJY29ubmVjdG9yID0gJnNvdS0+YmFzZS5jb25uZWN0b3I7CisKKwlzb3UtPmFjdGl2ZV9pbXBsaWNpdCA9IGZhbHNlOworCisJc291LT5iYXNlLnByZWZfYWN0aXZlID0gKHVuaXQgPT0gMCk7CisJc291LT5iYXNlLnByZWZfd2lkdGggPSA4MDA7CisJc291LT5iYXNlLnByZWZfaGVpZ2h0ID0gNjAwOworCXNvdS0+YmFzZS5wcmVmX21vZGUgPSBOVUxMOworCXNvdS0+YmFzZS5pc19pbXBsaWNpdCA9IHRydWU7CisKKwlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25uZWN0b3IsICZ2bXdfbGVnYWN5X2Nvbm5lY3Rvcl9mdW5jcywKKwkJCSAgIERSTV9NT0RFX0NPTk5FQ1RPUl9WSVJUVUFMKTsKKwljb25uZWN0b3ItPnN0YXR1cyA9IHZtd19kdV9jb25uZWN0b3JfZGV0ZWN0KGNvbm5lY3RvciwgdHJ1ZSk7CisKKwlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnZtd19zY3JlZW5fb2JqZWN0X2VuY29kZXJfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RFUl9WSVJUVUFMKTsKKwlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9ICgxIDw8IHVuaXQpOworCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CisKKwlkcm1fY3J0Y19pbml0KGRldiwgY3J0YywgJnZtd19zY3JlZW5fb2JqZWN0X2NydGNfZnVuY3MpOworCisJZHJtX21vZGVfY3J0Y19zZXRfZ2FtbWFfc2l6ZShjcnRjLCAyNTYpOworCisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCSAgICAgIGRldi0+bW9kZV9jb25maWcuZGlydHlfaW5mb19wcm9wZXJ0eSwKKwkJCQkgICAgICAxKTsKKworCXJldHVybiAwOworfQorCitpbnQgdm13X2ttc19pbml0X3NjcmVlbl9vYmplY3RfZGlzcGxheShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCWludCBpLCByZXQ7CisKKwlpZiAoZGV2X3ByaXYtPnNvdV9wcml2KSB7CisJCURSTV9JTkZPKCJzb3Ugc3lzdGVtIGFscmVhZHkgb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIShkZXZfcHJpdi0+Zmlmby5jYXBhYmlsaXRpZXMgJiBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMikpIHsKKwkJRFJNX0lORk8oIk5vdCB1c2luZyBzY3JlZW4gb2JqZWN0cywiCisJCQkgIiBtaXNzaW5nIGNhcCBTQ1JFRU5fT0JKRUNUXzJcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlyZXQgPSAtRU5PTUVNOworCWRldl9wcml2LT5zb3VfcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpkZXZfcHJpdi0+c291X3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWRldl9wcml2LT5zb3VfcHJpdikpCisJCWdvdG8gZXJyX25vX21lbTsKKworCWRldl9wcml2LT5zb3VfcHJpdi0+bnVtX2ltcGxpY2l0ID0gMDsKKwlkZXZfcHJpdi0+c291X3ByaXYtPmltcGxpY2l0X2ZiID0gTlVMTDsKKworCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIFZNV0dGWF9OVU1fRElTUExBWV9VTklUUyk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBlcnJfZnJlZTsKKworCXJldCA9IGRybV9tb2RlX2NyZWF0ZV9kaXJ0eV9pbmZvX3Byb3BlcnR5KGRldik7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBlcnJfdmJsYW5rX2NsZWFudXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgVk1XR0ZYX05VTV9ESVNQTEFZX1VOSVRTOyArK2kpCisJCXZtd19zb3VfaW5pdChkZXZfcHJpdiwgaSk7CisKKwlEUk1fSU5GTygiU2NyZWVuIG9iamVjdHMgc3lzdGVtIGluaXRpYWxpemVkXG4iKTsKKworCXJldHVybiAwOworCitlcnJfdmJsYW5rX2NsZWFudXA6CisJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CitlcnJfZnJlZToKKwlrZnJlZShkZXZfcHJpdi0+c291X3ByaXYpOworCWRldl9wcml2LT5zb3VfcHJpdiA9IE5VTEw7CitlcnJfbm9fbWVtOgorCXJldHVybiByZXQ7Cit9CisKK2ludCB2bXdfa21zX2Nsb3NlX3NjcmVlbl9vYmplY3RfZGlzcGxheShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCisJaWYgKCFkZXZfcHJpdi0+c291X3ByaXYpCisJCXJldHVybiAtRU5PU1lTOworCisJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CisKKwlrZnJlZShkZXZfcHJpdi0+c291X3ByaXYpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF90dG1fZ2x1ZS5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfdHRtX2dsdWUuYwppbmRleCAxZThlZWRkLi5kM2MxMWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF90dG1fZ2x1ZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3R0bV9nbHVlLmMKQEAgLTM0LDkgKzM0LDggQEAKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2OwogCiAJaWYgKHVubGlrZWx5KHZtYS0+dm1fcGdvZmYgPCBWTVdHRlhfRklMRV9QQUdFX09GRlNFVCkpIHsKLQkJaWYgKHZtd19maWZvX21tYXAoZmlscCwgdm1hKSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBkcm1fbW1hcChmaWxwLCB2bWEpOworCQlEUk1fRVJST1IoIklsbGVnYWwgYXR0ZW1wdCB0byBtbWFwIG9sZCBmaWZvIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWZpbGVfcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1hcHBsZS5jIGIvZHJpdmVycy9oaWQvaGlkLWFwcGxlLmMKaW5kZXggOWJjN2IwMy4uMjk5ZDIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWFwcGxlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWFwcGxlLmMKQEAgLTE4Myw5ICsxODMsNiBAQAogCQlpZiAoaGlkLT5wcm9kdWN0ID49IFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfQU5TSSAmJgogCQkJCWhpZC0+cHJvZHVjdCA8PSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9KSVMpCiAJCQl0YWJsZSA9IG1hY2Jvb2thaXJfZm5fa2V5czsKLQkJZWxzZSBpZiAoaGlkLT5wcm9kdWN0ID49IFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzZfQU5TSSAmJgotCQkJCWhpZC0+cHJvZHVjdCA8PSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc2X0pJUykKLQkJCXRhYmxlID0gbWFjYm9va2Fpcl9mbl9rZXlzOwogCQllbHNlIGlmIChoaWQtPnByb2R1Y3QgPCAweDIxZCB8fCBoaWQtPnByb2R1Y3QgPj0gMHgzMDApCiAJCQl0YWJsZSA9IHBvd2VyYm9va19mbl9rZXlzOwogCQllbHNlCkBAIC00NTgsNiArNDU1LDkgQEAKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0lTTyksCiAJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKIAkJCUFQUExFX0lTT19LRVlCT0FSRCB9LAorCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAxMV9JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JU09fS0VZQk9BUkQgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0pJUyksCiAJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfQU5TSSksCkBAIC01MDgsNiArNTA4LDEyIEBACiAJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX0lTT19LRVlCT0FSRCB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNkFfSklTKSwKIAkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfUkRFU0NfSklTIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9BTlNJKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JU09fS0VZQk9BUkQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVBX0pJUyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX1JERVNDX0pJUyB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9BTlNJKSwKIAkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfSVNPKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtYXhmZi5jCmluZGV4IDNiZGI0NTAuLjViZTg1OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWF4ZmYuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImhpZC1pZHMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKaW5kZXggOTFhZGNjNS4uODQ4YTU2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCkBAIC0xMzYyLDYgKzEzNjIsOSBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNV9BTlNJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNV9JU08pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1X0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVBX0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9JU08pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9KSVMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9SRVZCX0FOU0kpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9SRVZCX0lTTykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1JFVkJfSklTKSB9LApAQCAtMTM3NCw2ICsxMzc3LDcgQEAKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfQU5TSSkgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfSVNPKSB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9KSVMpIH0sCisJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDExX0lTTykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fVFBfT05MWSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BU1VTLCBVU0JfREVWSUNFX0lEX0FTVVNfVDkxTVQpIH0sCkBAIC0xOTQyLDYgKzE5NDYsOSBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNV9BTlNJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNV9JU08pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1X0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVBX0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9JU08pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9KSVMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc2X0FOU0kpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc2X0lTTykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzZfSklTKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWRlYnVnLmMgYi9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYwppbmRleCA5YTI0M2NhLi5lZTgwZDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZHIuYyBiL2RyaXZlcnMvaGlkL2hpZC1kci5jCmluZGV4IDYxZWVjZTQuLmU4MzJmNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1kci5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1kci5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiaGlkLWlkcy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZW1zZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1lbXNmZi5jCmluZGV4IGE1ZGMxM2YuLjliZGRlODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1lbXNmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1lbXNmZi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImhpZC1pZHMuaCIKICNpbmNsdWRlICJ1c2JoaWQvdXNiaGlkLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZ2FmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWdhZmYuYwppbmRleCAyNzliYTUzLi5mMWUxYmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZ2FmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1nYWZmLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiaGlkLWlkcy5oIgogCiAjaWZkZWYgQ09ORklHX0dSRUVOQVNJQV9GRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWhvbHRla2ZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtaG9sdGVrZmYuYwppbmRleCA5MWUzYTAzLi40ZTc1NDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaG9sdGVrZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtaG9sdGVrZmYuYwpAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaCBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAppbmRleCAxNjgwZTk5Li4wNmNlOTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCkBAIC0xMTIsNiArMTEyLDkgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfUkVWQl9BTlNJCTB4MDI0ZgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9SRVZCX0lTTwkweDAyNTAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfUkVWQl9KSVMJMHgwMjUxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVBX0FOU0kJMHgwMjUyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVBX0lTTwkweDAyNTMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNUFfSklTCTB4MDI1NAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc2QV9BTlNJCTB4MDI0OQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc2QV9JU08JMHgwMjRhCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzZBX0pJUwkweDAyNGIKQEAgLTEyMSw2ICsxMjQsNyBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0FOU0kgIDB4MDIzOQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0lTTyAgIDB4MDIzYQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0pJUyAgIDB4MDIzYgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDExX0lTTyAgIDB4MDI1NgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFkJMHgwMzBhCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZCTB4MDMwYgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FUVl9JUkNPTlRST0wJMHg4MjQxCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jIGIvZHJpdmVycy9oaWQvaGlkLW11bHRpdG91Y2guYwppbmRleCBmYTVkN2ExLi5mMWM5MDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMKQEAgLTI5MSw3ICsyOTEsNiBAQAogCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CiAJCQl0ZC0+bGFzdF9maWVsZF9pbmRleCA9IGZpZWxkLT5pbmRleDsKIAkJCXRkLT5sYXN0X210X2NvbGxlY3Rpb24gPSB1c2FnZS0+Y29sbGVjdGlvbl9pbmRleDsKLQkJCWhkZXYtPnF1aXJrcyAmPSB+SElEX1FVSVJLX01VTFRJVE9VQ0g7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSBISURfREdfV0lEVEg6CiAJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsCkBAIC01MzAsNDQgKzUyOSwxMiBAQAogCX0KIH0KIAotLyogYSBsaXN0IG9mIGRldmljZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgc3BlY2lhbGl6ZWQgbXVsdGl0b3VjaCBkcml2ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBtdF9oYXZlX3NwZWNpYWxfZHJpdmVyW10gPSB7Ci0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX05UUklHLCAweDAwMDEpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX05UUklHLCAweDAwMDYpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1FVQU5UQSwKLQkJCVVTQl9ERVZJQ0VfSURfUElYQVJUX0lNQUdJTkdfSU5DX09QVElDQUxfVE9VQ0hfU0NSRUVOKSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9RVUFOVEEsCi0JCQlVU0JfREVWSUNFX0lEX1FVQU5UQV9PUFRJQ0FMX1RPVUNIKSB9LAotCXsgfQotfTsKLQotc3RhdGljIGJvb2wgbXRfbWF0Y2hfb25lX2lkKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAotCQljb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCi17Ci0JcmV0dXJuIGlkLT5idXMgPT0gaGRldi0+YnVzICYmCi0JCShpZC0+dmVuZG9yID09IEhJRF9BTllfSUQgfHwgaWQtPnZlbmRvciA9PSBoZGV2LT52ZW5kb3IpICYmCi0JCShpZC0+cHJvZHVjdCA9PSBISURfQU5ZX0lEIHx8IGlkLT5wcm9kdWN0ID09IGhkZXYtPnByb2R1Y3QpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKm10X21hdGNoX2lkKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAotCQljb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCi17Ci0JZm9yICg7IGlkLT5idXM7IGlkKyspCi0JCWlmIChtdF9tYXRjaF9vbmVfaWQoaGRldiwgaWQpKQotCQkJcmV0dXJuIGlkOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyBpbnQgbXRfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgcmV0LCBpOwogCXN0cnVjdCBtdF9kZXZpY2UgKnRkOwogCXN0cnVjdCBtdF9jbGFzcyAqbXRjbGFzcyA9IG10X2NsYXNzZXM7IC8qIE1UX0NMU19ERUZBVUxUICovCiAKLQlpZiAobXRfbWF0Y2hfaWQoaGRldiwgbXRfaGF2ZV9zcGVjaWFsX2RyaXZlcikpCi0JCXJldHVybiAtRU5PREVWOwotCiAJZm9yIChpID0gMDsgbXRfY2xhc3Nlc1tpXS5uYW1lIDsgaSsrKSB7CiAJCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gbXRfY2xhc3Nlc1tpXS5uYW1lKSB7CiAJCQltdGNsYXNzID0gJihtdF9jbGFzc2VzW2ldKTsKQEAgLTU3NSw2ICs1NDIsMTAgQEAKIAkJfQogCX0KIAorCS8qIFRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gY29ycmVjdGx5IHN1cHBvcnQgZGV2aWNlcworCSAqIHRoYXQgZW1pdCBldmVudHMgb3ZlciBzZXZlcmFsIEhJRCBtZXNzYWdlcy4KKwkgKi8KKwloZGV2LT5xdWlya3MgfD0gSElEX1FVSVJLX05PX0lOUFVUX1NZTkM7CiAKIAl0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtdF9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRkKSB7CkBAIC01OTAsMTYgKzU2MSwxMCBAQAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBmYWlsOwogCi0JaGRldi0+cXVpcmtzIHw9IEhJRF9RVUlSS19NVUxUSVRPVUNIOwogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWw7CiAKLQkvKiBUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIGNvcnJlY3RseSBzdXBwb3J0IGRldmljZXMKLQkgKiB0aGF0IGVtaXQgZXZlbnRzIG92ZXIgc2V2ZXJhbCBISUQgbWVzc2FnZXMuCi0JICovCi0JaGRldi0+cXVpcmtzIHw9IEhJRF9RVUlSS19OT19JTlBVVF9TWU5DOwotCiAJdGQtPnNsb3RzID0ga3phbGxvYyh0ZC0+bWF4Y29udGFjdHMgKiBzaXplb2Yoc3RydWN0IG10X3Nsb3QpLAogCQkJCUdGUF9LRVJORUwpOwogCWlmICghdGQtPnNsb3RzKSB7CkBAIC03OTMsMTAgKzc1OCw2IEBACiAJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWEFULAogCQkJVVNCX0RFVklDRV9JRF9YQVRfQ1NSKSB9LAogCi0JLyogUmVzdCBvZiB0aGUgd29ybGQgKi8KLQl7IC5kcml2ZXJfZGF0YSA9IE1UX0NMU19ERUZBVUxULAotCQlISURfVVNCX0RFVklDRShISURfQU5ZX0lELCBISURfQU5ZX0lEKSB9LAotCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIG10X2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXBpY29sY2QuYyBiL2RyaXZlcnMvaGlkL2hpZC1waWNvbGNkLmMKaW5kZXggMTc4MjY5My4uMDFlN2QyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXBpY29sY2QuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcGljb2xjZC5jCkBAIC0zNiw2ICszNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIFBJQ09MQ0RfTkFNRSAiUGljb0xDRCAoZ3JhcGhpYykiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1wbC5jIGIvZHJpdmVycy9oaWQvaGlkLXBsLmMKaW5kZXggMDZlNTMwMC4uMDcwZjkzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXBsLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXBsLmMKQEAgLTQwLDYgKzQwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWNvbW1vbi5jIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1jb21tb24uYwppbmRleCBlZGY4OThkLi5iMDdlN2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtY29tbW9uLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJoaWQtcm9jY2F0LWNvbW1vbi5oIgogCiBzdGF0aWMgaW5saW5lIHVpbnQxNl90IHJvY2NhdF9jb21tb25fZmVhdHVyZV9yZXBvcnQodWludDhfdCByZXBvcnRfaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmMgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmMKaW5kZXggNTY2NmU3NS4uYjY4NWIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC1yb2NjYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBST0NDQVRfRklSU1RfTUlOT1IgMAogI2RlZmluZSBST0NDQVRfTUFYX0RFVklDRVMgOApAQCAtMTYyLDI3ICsxNjMsMjcgQEAKIAogCWRldmljZSA9IGRldmljZXNbbWlub3JdOwogCi0JbXV0ZXhfbG9jaygmZGV2aWNlLT5yZWFkZXJzX2xvY2spOwotCiAJaWYgKCFkZXZpY2UpIHsKIAkJcHJfZW1lcmcoInJvY2NhdCBkZXZpY2Ugd2l0aCBtaW5vciAlZCBkb2Vzbid0IGV4aXN0XG4iLCBtaW5vcik7CiAJCWVycm9yID0gLUVOT0RFVjsKLQkJZ290byBleGl0X2VycjsKKwkJZ290byBleGl0X2Vycl9kZXZpY2VzOwogCX0KIAorCW11dGV4X2xvY2soJmRldmljZS0+cmVhZGVyc19sb2NrKTsKKwogCWlmICghZGV2aWNlLT5vcGVuKyspIHsKIAkJLyogcG93ZXIgb24gZGV2aWNlIG9uIGFkZGluZyBmaXJzdCByZWFkZXIgKi8KIAkJZXJyb3IgPSBoaWRfaHdfcG93ZXIoZGV2aWNlLT5oaWQsIFBNX0hJTlRfRlVMTE9OKTsKIAkJaWYgKGVycm9yIDwgMCkgewogCQkJLS1kZXZpY2UtPm9wZW47Ci0JCQlnb3RvIGV4aXRfZXJyOworCQkJZ290byBleGl0X2Vycl9yZWFkZXJzOwogCQl9CiAKIAkJZXJyb3IgPSBoaWRfaHdfb3BlbihkZXZpY2UtPmhpZCk7CiAJCWlmIChlcnJvciA8IDApIHsKIAkJCWhpZF9od19wb3dlcihkZXZpY2UtPmhpZCwgUE1fSElOVF9OT1JNQUwpOwogCQkJLS1kZXZpY2UtPm9wZW47Ci0JCQlnb3RvIGV4aXRfZXJyOworCQkJZ290byBleGl0X2Vycl9yZWFkZXJzOwogCQl9CiAJfQogCkBAIC0xOTMsMTMgKzE5NCwxMyBAQAogCWxpc3RfYWRkX3RhaWwoJnJlYWRlci0+bm9kZSwgJmRldmljZS0+cmVhZGVycyk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcmVhZGVyOwogCi1leGl0X3VubG9jazoKK2V4aXRfZXJyX3JlYWRlcnM6CiAJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPnJlYWRlcnNfbG9jayk7CitleGl0X2Vycl9kZXZpY2VzOgogCW11dGV4X3VubG9jaygmZGV2aWNlc19sb2NrKTsKKwlpZiAoZXJyb3IpCisJCWtmcmVlKHJlYWRlcik7CiAJcmV0dXJuIGVycm9yOwotZXhpdF9lcnI6Ci0Ja2ZyZWUocmVhZGVyKTsKLQlnb3RvIGV4aXRfdW5sb2NrOwogfQogCiBzdGF0aWMgaW50IHJvY2NhdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXNqb3kuYyBiL2RyaXZlcnMvaGlkL2hpZC1zam95LmMKaW5kZXggNjcwZGE5MS4uNGIxNDQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXNqb3kuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtc2pveS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImhpZC1pZHMuaCIKIAogI2lmZGVmIENPTkZJR19TTUFSVEpPWVBMVVNfRkYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC10bWZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtdG1mZi5jCmluZGV4IDU3NTg2MmIuLjgzYTkzM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC10bWZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRtZmYuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiaGlkLWlkcy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtenBmZi5jIGIvZHJpdmVycy9oaWQvaGlkLXpwZmYuYwppbmRleCBmMzFmYWIwLi5mNmJhODFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtenBmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC16cGZmLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImhpZC1pZHMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKaW5kZXggNGVhNDY0MS4uNTAyOGQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIi4uL2hpZC1pZHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCA5YjM0N2FjLi45ZWM4NTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0zMzUsNiArMzM1LDcgQEAKIAogY29uZmlnIFNFTlNPUlNfRjcxODA1RgogCXRyaXN0YXRlICJGaW50ZWsgRjcxODA1Ri9GRywgRjcxODA2Ri9GRyBhbmQgRjcxODcyRi9GRyIKKwlkZXBlbmRzIG9uICFQUEMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwogCSAgZmVhdHVyZXMgb2YgdGhlIEZpbnRlayBGNzE4MDVGL0ZHLCBGNzE4MDZGL0ZHIGFuZCBGNzE4NzJGL0ZHCkBAIC0zNDUsNiArMzQ2LDcgQEAKIAogY29uZmlnIFNFTlNPUlNfRjcxODgyRkcKIAl0cmlzdGF0ZSAiRmludGVrIEY3MTg4MkZHIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uICFQUEMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwogCSAgZmVhdHVyZXMgb2YgbWFueSBGaW50ZWsgU3VwZXItSS9PIChMUEMpIGNoaXBzLiBUaGUgY3VycmVudGx5CkBAIC00NjgsNiArNDcwLDcgQEAKIAogY29uZmlnIFNFTlNPUlNfSVQ4NwogCXRyaXN0YXRlICJJVEUgSVQ4N3h4IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uICFQUEMKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIElURSBJVDg3MDVGLCBJVDg3MTJGLApAQCAtODI0LDYgKzgyNyw3IEBACiAKIGNvbmZpZyBTRU5TT1JTX1BDODczNjAKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzYwIGZhbWlseSIKKwlkZXBlbmRzIG9uICFQUEMKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGFjY2VzcyB0byB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZwpAQCAtODM3LDYgKzg0MSw3IEBACiAKIGNvbmZpZyBTRU5TT1JTX1BDODc0MjcKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3NDI3IgorCWRlcGVuZHMgb24gIVBQQwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKIAkgIGZ1bmN0aW9ucyBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3NDI3IFN1cGVyLUkvTyBjaGlwLgpAQCAtOTI4LDcgKzkzMyw3IEBACiAKIGNvbmZpZyBTRU5TT1JTX0RNRTE3MzcKIAl0cmlzdGF0ZSAiU01TQyBETUUxNzM3LCBTQ0gzMTF4IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwgJiYgIVBQQwogCXNlbGVjdCBIV01PTl9WSUQKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKQEAgLTk3MCw2ICs5NzUsNyBAQAogCiBjb25maWcgU0VOU09SU19TTVNDNDdNMQogCXRyaXN0YXRlICJTTVNDIExQQzQ3TTEweCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiAhUFBDCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIGZhbgogCSAgbW9uaXRvcmluZyBhbmQgY29udHJvbCBjYXBhYmlsaXRpZXMgb2YgdGhlIFNNU0MgTFBDNDdCMjd4LApAQCAtMTAwMyw3ICsxMDA5LDcgQEAKIAogY29uZmlnIFNFTlNPUlNfU01TQzQ3QjM5NwogCXRyaXN0YXRlICJTTVNDIExQQzQ3QjM5Ny1OQyIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmICFQUEMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFNNU0MgTFBDNDdCMzk3LU5DCiAJICBzZW5zb3IgY2hpcC4KQEAgLTEwMTcsNiArMTAyMyw3IEBACiAKIGNvbmZpZyBTRU5TT1JTX1NDSDU2MjcKIAl0cmlzdGF0ZSAiU01TQyBTQ0g1NjI3IgorCWRlcGVuZHMgb24gIVBQQwogCXNlbGVjdCBTRU5TT1JTX1NDSDU2WFhfQ09NTU9OCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCkBAIC0xMDI3LDYgKzEwMzQsNyBAQAogCiBjb25maWcgU0VOU09SU19TQ0g1NjM2CiAJdHJpc3RhdGUgIlNNU0MgU0NINTYzNiIKKwlkZXBlbmRzIG9uICFQUEMKIAlzZWxlY3QgU0VOU09SU19TQ0g1NlhYX0NPTU1PTgogCWhlbHAKIAkgIFNNU0MgU0NINTYzNiBTdXBlciBJL08gY2hpcHMgaW5jbHVkZSBhbiBlbWJlZGRlZCBtaWNyb2NvbnRyb2xsZXIgZm9yCkBAIC0xMTUwLDYgKzExNTgsNyBAQAogCiBjb25maWcgU0VOU09SU19WVDEyMTEKIAl0cmlzdGF0ZSAiVklBIFZUMTIxMSIKKwlkZXBlbmRzIG9uICFQUEMKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB0aGVuIHlvdSBnZXQgc3VwcG9ydCBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwpAQCAtMTI2Miw2ICsxMjcxLDcgQEAKIAogY29uZmlnIFNFTlNPUlNfVzgzNjI3SEYKIAl0cmlzdGF0ZSAiV2luYm9uZCBXODM2MjdIRiwgVzgzNjI3VEhGLCBXODM2MzdIRiwgVzgzNjg3VEhGLCBXODM2OTdIRiIKKwlkZXBlbmRzIG9uICFQUEMKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4MzZYNyBzZXJpZXMKQEAgLTEyNzIsNyArMTI4Miw4IEBACiAJICB3aWxsIGJlIGNhbGxlZCB3ODM2MjdoZi4KIAogY29uZmlnIFNFTlNPUlNfVzgzNjI3RUhGCi0JdHJpc3RhdGUgIldpbmJvbmQgVzgzNjI3RUhGL0VIRy9ESEcsIFc4MzY2N0hHLCBOQ1Q2Nzc1RiwgTkNUNjc3NkYiCisJdHJpc3RhdGUgIldpbmJvbmQgVzgzNjI3RUhGL0VIRy9ESEcvVUhHLCBXODM2NjdIRywgTkNUNjc3NUYsIE5DVDY3NzZGIgorCWRlcGVuZHMgb24gIVBQQwogCXNlbGVjdCBIV01PTl9WSUQKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGhhcmR3YXJlCkBAIC0xMjgxLDcgKzEyOTIsOCBAQAogCSAgVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyB0aGUgVzgzNjI3RUhHLCB3aGljaCBpcyB0aGUgbGVhZC1mcmVlCiAJICB2ZXJzaW9uIG9mIHRoZSBXODM2MjdFSEYsIGFuZCB0aGUgVzgzNjI3REhHLCB3aGljaCBpcyBhIHNpbWlsYXIKIAkgIGNoaXAgc3VpdGVkIGZvciBzcGVjaWZpYyBJbnRlbCBwcm9jZXNzb3JzIHRoYXQgdXNlIFBFQ0kgc3VjaCBhcwotCSAgdGhlIENvcmUgMiBEdW8uCisJICB0aGUgQ29yZSAyIER1by4gQW5kIGFsc28gdGhlIFc4MzYyN1VIRywgd2hpY2ggaXMgYSBzdHJpcHBlZCBkb3duCisJICB2ZXJzaW9uIG9mIHRoZSBXODM2MjdESEcgKGFzIGZhciBhcyBoYXJkd2FyZSBtb25pdG9yaW5nIGdvZXMuKQogCiAJICBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIE51dm90b24gVzgzNjY3SEcsIFc4MzY2N0hHLUIsIE5DVDY3NzVGCiAJICAoYWxzbyBrbm93biBhcyBXODM2NjdIRy1JKSwgYW5kIE5DVDY3NzZGLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZDc0MTQuYyBiL2RyaXZlcnMvaHdtb24vYWQ3NDE0LmMKaW5kZXggZDQ2YzBjNy4uZGYyOWE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZDc0MTQuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkNzQxNC5jCkBAIC01OCwxMCArNTgsOSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhZDc0MTRfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCiB7Ci0JaWYgKHJlZyA9PSBBRDc0MTRfUkVHX1RFTVApIHsKLQkJaW50IHZhbHVlID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKTsKLQkJcmV0dXJuICh2YWx1ZSA8IDApID8gdmFsdWUgOiBzd2FiMTYodmFsdWUpOwotCX0gZWxzZQorCWlmIChyZWcgPT0gQUQ3NDE0X1JFR19URU1QKQorCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgcmVnKTsKKwllbHNlCiAJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkNzQxOC5jIGIvZHJpdmVycy9od21vbi9hZDc0MTguYwppbmRleCBmZmM3ODFmLi44Y2I3MThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkNzQxOC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWQ3NDE4LmMKQEAgLTc2LDIwICs3Niw2IEBACiAJLmlkX3RhYmxlCT0gYWQ3NDE4X2lkLAogfTsKIAotLyogQWxsIHJlZ2lzdGVycyBhcmUgd29yZC1zaXplZCwgZXhjZXB0IGZvciB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCi0gKiBBRDc0MTggdXNlcyBhIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLiBEbyBOT1QgdXNlIHRob3NlIGZ1bmN0aW9ucyB0bwotICogYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBDT05GIGFuZCBDT05GMiwgYXMgdGhleSBhcmUgYnl0ZS1zaXplZC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgYWQ3NDE4X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQotewotCXJldHVybiBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFkNzQxOF93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKLXsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGFkNzQxOF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBhZDc0MThfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwpAQCAtMTI4LDcgKzExNCw5IEBACiAJCXVkZWxheSgzMCk7CiAKIAkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQkJZGF0YS0+dGVtcFtpXSA9IGFkNzQxOF9yZWFkKGNsaWVudCwgQUQ3NDE4X1JFR19URU1QW2ldKTsKKwkJCWRhdGEtPnRlbXBbaV0gPQorCQkJCWkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJCQlBRDc0MThfUkVHX1RFTVBbaV0pOwogCQl9CiAKIAkJZm9yIChpID0gMCwgY2ggPSA0OyBpIDwgZGF0YS0+YWRjX21heDsgaSsrLCBjaC0tKSB7CkBAIC0xMzgsMTEgKzEyNiwxMiBAQAogCiAJCQl1ZGVsYXkoMTUpOwogCQkJZGF0YS0+aW5bZGF0YS0+YWRjX21heCAtIDEgLSBpXSA9Ci0JCQkJYWQ3NDE4X3JlYWQoY2xpZW50LCBBRDc0MThfUkVHX0FEQyk7CisJCQkJaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkJCUFENzQxOF9SRUdfQURDKTsKIAkJfQogCiAJCS8qIHJlc3RvcmUgb2xkIGNvbmZpZ3VyYXRpb24gdmFsdWUgKi8KLQkJYWQ3NDE4X3dyaXRlKGNsaWVudCwgQUQ3NDE4X1JFR19DT05GLCBjZmcpOworCQlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgQUQ3NDE4X1JFR19DT05GLCBjZmcpOwogCiAJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CiAJCWRhdGEtPnZhbGlkID0gMTsKQEAgLTE4Miw3ICsxNzEsOSBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CiAJZGF0YS0+dGVtcFthdHRyLT5pbmRleF0gPSBMTTc1X1RFTVBfVE9fUkVHKHRlbXApOwotCWFkNzQxOF93cml0ZShjbGllbnQsIEFENzQxOF9SRUdfVEVNUFthdHRyLT5pbmRleF0sIGRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkgICAgIEFENzQxOF9SRUdfVEVNUFthdHRyLT5pbmRleF0sCisJCQkJICAgICBkYXRhLT50ZW1wW2F0dHItPmluZGV4XSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkczEwMTUuYyBiL2RyaXZlcnMvaHdtb24vYWRzMTAxNS5jCmluZGV4IGU5YmVlZGEuLmVlZGNhM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWRzMTAxNS5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWRzMTAxNS5jCkBAIC01OSwxOSArNTksNiBAQAogCXN0cnVjdCBhZHMxMDE1X2NoYW5uZWxfZGF0YSBjaGFubmVsX2RhdGFbQURTMTAxNV9DSEFOTkVMU107CiB9OwogCi1zdGF0aWMgczMyIGFkczEwMTVfcmVhZF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IHJlZykKLXsKLQlzMzIgZGF0YSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7Ci0KLQlyZXR1cm4gKGRhdGEgPCAwKSA/IGRhdGEgOiBzd2FiMTYoZGF0YSk7Ci19Ci0KLXN0YXRpYyBzMzIgYWRzMTAxNV93cml0ZV9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IHJlZywKLQkJCSAgICAgdTE2IHZhbCkKLXsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbCkpOwotfQotCiBzdGF0aWMgaW50IGFkczEwMTVfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKIAkJCSAgICAgIGludCAqdmFsdWUpCiB7CkBAIC04Nyw3ICs3NCw3IEBACiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogZ2V0IGNoYW5uZWwgcGFyYW1ldGVycyAqLwotCXJlcyA9IGFkczEwMTVfcmVhZF9yZWcoY2xpZW50LCBBRFMxMDE1X0NPTkZJRyk7CisJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgQURTMTAxNV9DT05GSUcpOwogCWlmIChyZXMgPCAwKQogCQlnb3RvIGVycl91bmxvY2s7CiAJY29uZmlnID0gcmVzOwpAQCAtMTAxLDEzICs4OCwxMyBAQAogCWNvbmZpZyB8PSAocGdhICYgMHgwMDA3KSA8PCA5OwogCWNvbmZpZyB8PSAoZGF0YV9yYXRlICYgMHgwMDA3KSA8PCA1OwogCi0JcmVzID0gYWRzMTAxNV93cml0ZV9yZWcoY2xpZW50LCBBRFMxMDE1X0NPTkZJRywgY29uZmlnKTsKKwlyZXMgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgQURTMTAxNV9DT05GSUcsIGNvbmZpZyk7CiAJaWYgKHJlcyA8IDApCiAJCWdvdG8gZXJyX3VubG9jazsKIAogCS8qIHdhaXQgdW50aWwgY29udmVyc2lvbiBmaW5pc2hlZCAqLwogCW1zbGVlcChjb252ZXJzaW9uX3RpbWVfbXMpOwotCXJlcyA9IGFkczEwMTVfcmVhZF9yZWcoY2xpZW50LCBBRFMxMDE1X0NPTkZJRyk7CisJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgQURTMTAxNV9DT05GSUcpOwogCWlmIChyZXMgPCAwKQogCQlnb3RvIGVycl91bmxvY2s7CiAJY29uZmlnID0gcmVzOwpAQCAtMTE3LDcgKzEwNCw3IEBACiAJCWdvdG8gZXJyX3VubG9jazsKIAl9CiAKLQlyZXMgPSBhZHMxMDE1X3JlYWRfcmVnKGNsaWVudCwgQURTMTAxNV9DT05WRVJTSU9OKTsKKwlyZXMgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCBBRFMxMDE1X0NPTlZFUlNJT04pOwogCWlmIChyZXMgPCAwKQogCQlnb3RvIGVycl91bmxvY2s7CiAJY29udmVyc2lvbiA9IHJlczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWRzNzgyOC5jIGIvZHJpdmVycy9od21vbi9hZHM3ODI4LmMKaW5kZXggYzQyYzVhNi4uY2ZjYzNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZHM3ODI4LmMKKysrIGIvZHJpdmVycy9od21vbi9hZHM3ODI4LmMKQEAgLTc0LDEzICs3NCw2IEBACiBzdGF0aWMgaW50IGFkczc4MjhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwogCi0vKiBUaGUgQURTNzgyOCByZXR1cm5zIHRoZSAxMi1iaXQgc2FtcGxlIGluIHR3byBieXRlcywKLQl0aGVzZSBhcmUgcmVhZCBhcyBhIHdvcmQgdGhlbiBieXRlLXN3YXBwZWQgKi8KLXN0YXRpYyB1MTYgYWRzNzgyOF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKLXsKLQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOwotfQotCiBzdGF0aWMgaW5saW5lIHU4IGNoYW5uZWxfY21kX2J5dGUoaW50IGNoKQogewogCS8qIGNtZCBieXRlIEMyLEMxLEMwIC0gc2VlIGRhdGFzaGVldCAqLwpAQCAtMTA0LDcgKzk3LDggQEAKIAogCQlmb3IgKGNoID0gMDsgY2ggPCBBRFM3ODI4X05DSDsgY2grKykgewogCQkJdTggY21kID0gY2hhbm5lbF9jbWRfYnl0ZShjaCk7Ci0JCQlkYXRhLT5hZGNfaW5wdXRbY2hdID0gYWRzNzgyOF9yZWFkX3ZhbHVlKGNsaWVudCwgY21kKTsKKwkJCWRhdGEtPmFkY19pbnB1dFtjaF0gPQorCQkJCWkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIGNtZCk7CiAJCX0KIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKIAkJZGF0YS0+dmFsaWQgPSAxOwpAQCAtMjAzLDcgKzE5Nyw3IEBACiAJZm9yIChjaCA9IDA7IGNoIDwgQURTNzgyOF9OQ0g7IGNoKyspIHsKIAkJdTE2IGluX2RhdGE7CiAJCXU4IGNtZCA9IGNoYW5uZWxfY21kX2J5dGUoY2gpOwotCQlpbl9kYXRhID0gYWRzNzgyOF9yZWFkX3ZhbHVlKGNsaWVudCwgY21kKTsKKwkJaW5fZGF0YSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIGNtZCk7CiAJCWlmIChpbl9kYXRhICYgMHhGMDAwKSB7CiAJCQlwcl9kZWJ1ZygiJXMgOiBEb2Vzbid0IGxvb2sgbGlrZSBhbiBhZHM3ODI4IGRldmljZVxuIiwKIAkJCQkgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hc2IxMDAuYyBiL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKaW5kZXggYzAyYTA1Mi4uZDdiZDFmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hc2IxMDAuYworKysgYi9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCkBAIC04MjksMTcgKzgyOSwxNyBAQAogCQkvKiBjb252ZXJ0IGZyb20gSVNBIHRvIExNNzUgSTJDIGFkZHJlc3NlcyAqLwogCQlzd2l0Y2ggKHJlZyAmIDB4ZmYpIHsKIAkJY2FzZSAweDUwOiAvKiBURU1QICovCi0JCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsLCAwKSk7CisJCQlyZXMgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2wsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg1MjogLyogQ09ORklHICovCiAJCQlyZXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2wsIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg1MzogLyogSFlTVCAqLwotCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbCwgMikpOworCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsLCAyKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTU6IC8qIE1BWCAqLwogCQlkZWZhdWx0OgotCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbCwgMykpOworCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsLCAzKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtODc3LDEwICs4NzcsMTAgQEAKIAkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2wsIDEsIHZhbHVlICYgMHhmZik7CiAJCQlicmVhazsKIAkJY2FzZSAweDUzOiAvKiBIWVNUICovCi0JCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsLCAyLCBzd2FiMTYodmFsdWUpKTsKKwkJCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2wsIDIsIHZhbHVlKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTU6IC8qIE1BWCAqLwotCQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbCwgMywgc3dhYjE2KHZhbHVlKSk7CisJCQlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsLCAzLCB2YWx1ZSk7CiAJCQlicmVhazsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYyBiL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYwppbmRleCA5MzIzODM3Li4xMDRiMzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKKysrIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCkBAIC02MCwxNCArNjAsMTMgQEAKICNpZmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIFRPX1BIWVNfSUQoY3B1KQkJY3B1X2RhdGEoY3B1KS5waHlzX3Byb2NfaWQKICNkZWZpbmUgVE9fQ09SRV9JRChjcHUpCQljcHVfZGF0YShjcHUpLmNwdV9jb3JlX2lkCi0jZGVmaW5lIFRPX0FUVFJfTk8oY3B1KQkJKFRPX0NPUkVfSUQoY3B1KSArIEJBU0VfU1lTRlNfQVRUUl9OTykKICNkZWZpbmUgZm9yX2VhY2hfc2libGluZyhpLCBjcHUpCWZvcl9lYWNoX2NwdShpLCBjcHVfc2libGluZ19tYXNrKGNwdSkpCiAjZWxzZQogI2RlZmluZSBUT19QSFlTX0lEKGNwdSkJCShjcHUpCiAjZGVmaW5lIFRPX0NPUkVfSUQoY3B1KQkJKGNwdSkKLSNkZWZpbmUgVE9fQVRUUl9OTyhjcHUpCQkoY3B1KQogI2RlZmluZSBmb3JfZWFjaF9zaWJsaW5nKGksIGNwdSkJZm9yIChpID0gMDsgZmFsc2U7ICkKICNlbmRpZgorI2RlZmluZSBUT19BVFRSX05PKGNwdSkJCShUT19DT1JFX0lEKGNwdSkgKyBCQVNFX1NZU0ZTX0FUVFJfTk8pCiAKIC8qCiAgKiBQZXItQ29yZSBUZW1wZXJhdHVyZSBEYXRhCkBAIC0zMjUsMTUgKzMyNCw2IEBACiAJcmV0dXJuIGFkanVzdF90am1heChjLCBpZCwgZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF91Y29kZV9yZXZfb25fY3B1KHZvaWQgKmVkeCkKLXsKLQl1MzIgZWF4OwotCi0Jd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKLQlzeW5jX2NvcmUoKTsKLQlyZG1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIGVheCwgKih1MzIgKillZHgpOwotfQotCiBzdGF0aWMgaW50IGNyZWF0ZV9uYW1lX2F0dHIoc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3lzZnNfYXR0cl9pbml0KCZwZGF0YS0+bmFtZV9hdHRyLmF0dHIpOwpAQCAtMzgwLDI3ICszNzAsMTYgQEAKIHN0YXRpYyBpbnQgX19jcHVpbml0IGNoa191Y29kZV92ZXJzaW9uKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhKGNwdSk7Ci0JaW50IGVycjsKLQl1MzIgZWR4OwogCiAJLyoKIAkgKiBDaGVjayBpZiB3ZSBoYXZlIHByb2JsZW0gd2l0aCBlcnJhdGEgQUUxOCBvZiBDb3JlIHByb2Nlc3NvcnM6CiAJICogUmVhZGluZ3MgbWlnaHQgc3RvcCB1cGRhdGUgd2hlbiBwcm9jZXNzb3IgdmlzaXRlZCB0b28gZGVlcCBzbGVlcCwKIAkgKiBmaXhlZCBmb3Igc3RlcHBpbmcgRDAgKDZFQykuCiAJICovCi0JaWYgKGMtPng4Nl9tb2RlbCA9PSAweGUgJiYgYy0+eDg2X21hc2sgPCAweGMpIHsKLQkJLyogY2hlY2sgZm9yIG1pY3JvY29kZSB1cGRhdGUgKi8KLQkJZXJyID0gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgZ2V0X3Vjb2RlX3Jldl9vbl9jcHUsCi0JCQkJCSAgICAgICAmZWR4LCAxKTsKLQkJaWYgKGVycikgewotCQkJcHJfZXJyKCJDYW5ub3QgZGV0ZXJtaW5lIG1pY3JvY29kZSByZXZpc2lvbiBvZiAiCi0JCQkgICAgICAgIkNQVSMldSAoJWQpIVxuIiwgY3B1LCBlcnIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0gZWxzZSBpZiAoZWR4IDwgMHgzOSkgewotCQkJcHJfZXJyKCJFcnJhdGEgQUUxOCBub3QgZml4ZWQsIHVwZGF0ZSBCSU9TIG9yICIKLQkJCSAgICAgICAibWljcm9jb2RlIG9mIHRoZSBDUFUhXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJaWYgKGMtPng4Nl9tb2RlbCA9PSAweGUgJiYgYy0+eDg2X21hc2sgPCAweGMgJiYgYy0+bWljcm9jb2RlIDwgMHgzOSkgeworCQlwcl9lcnIoIkVycmF0YSBBRTE4IG5vdCBmaXhlZCwgdXBkYXRlIEJJT1Mgb3IgIgorCQkgICAgICAgIm1pY3JvY29kZSBvZiB0aGUgQ1BVIVxuIik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZHMxNjIxLmMgYi9kcml2ZXJzL2h3bW9uL2RzMTYyMS5jCmluZGV4IGUxMTM2MzQuLmVmMWFjOTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2RzMTYyMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vZHMxNjIxLmMKQEAgLTgwLDI0ICs4MCw2IEBACiAJdTggY29uZjsJCQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KIH07CiAKLS8qIFRlbXBlcmF0dXJlIHJlZ2lzdGVycyBhcmUgd29yZC1zaXplZC4KLSAgIERTMTYyMSB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24sIHdoaWNoIGlzIGV4YWN0bHkgb3Bwb3NpdGUgdG8KLSAgIHRoZSBTTUJ1cyBzdGFuZGFyZC4gKi8KLXN0YXRpYyBpbnQgZHMxNjIxX3JlYWRfdGVtcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIHN3YWIxNihyZXQpOwotfQotCi1zdGF0aWMgaW50IGRzMTYyMV93cml0ZV90ZW1wKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQotewotCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKLX0KLQogc3RhdGljIHZvaWQgZHMxNjIxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJdTggY29uZiwgbmV3X2NvbmY7CkBAIC0xMzYsNyArMTE4LDcgQEAKIAkJZGF0YS0+Y29uZiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERTMTYyMV9SRUdfQ09ORik7CiAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+dGVtcCk7IGkrKykKLQkJCWRhdGEtPnRlbXBbaV0gPSBkczE2MjFfcmVhZF90ZW1wKGNsaWVudCwKKwkJCWRhdGEtPnRlbXBbaV0gPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAogCQkJCQkJCSBEUzE2MjFfUkVHX1RFTVBbaV0pOwogCiAJCS8qIHJlc2V0IGFsYXJtcyBpZiBuZWNlc3NhcnkgKi8KQEAgLTE3Nyw4ICsxNTksOCBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdID0gdmFsOwotCWRzMTYyMV93cml0ZV90ZW1wKGNsaWVudCwgRFMxNjIxX1JFR19URU1QW2F0dHItPmluZGV4XSwKLQkJCSAgZGF0YS0+dGVtcFthdHRyLT5pbmRleF0pOworCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBEUzE2MjFfUkVHX1RFTVBbYXR0ci0+aW5kZXhdLAorCQkJCSAgICAgZGF0YS0+dGVtcFthdHRyLT5pbmRleF0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZHM2MjAuYyBiL2RyaXZlcnMvaHdtb24vZHM2MjAuYwppbmRleCA0ZjdjM2ZjLi4yMjVhZTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2RzNjIwLmMKKysrIGIvZHJpdmVycy9od21vbi9kczYyMC5jCkBAIC03NSwzMyArNzUsMTMgQEAKIAlzMTYgdGVtcFszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlcywgd29yZCAqLwogfTsKIAotLyoKLSAqICBUZW1wZXJhdHVyZSByZWdpc3RlcnMgYXJlIHdvcmQtc2l6ZWQuCi0gKiAgRFM2MjAgdXNlcyBhIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLCB3aGljaCBpcyBleGFjdGx5IG9wcG9zaXRlIHRvCi0gKiAgdGhlIFNNQnVzIHN0YW5kYXJkLgotICovCi1zdGF0aWMgaW50IGRzNjIwX3JlYWRfdGVtcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIHN3YWIxNihyZXQpOwotfQotCi1zdGF0aWMgaW50IGRzNjIwX3dyaXRlX3RlbXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCi17Ci0JcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNih2YWx1ZSkpOwotfQotCiBzdGF0aWMgdm9pZCBkczYyMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBkczYyMF9wbGF0Zm9ybV9kYXRhICpkczYyMF9pbmZvID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAl1MTYgY29uZiwgbmV3X2NvbmY7CiAKIAluZXdfY29uZiA9IGNvbmYgPQotCSAgICBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgRFM2MjBfUkVHX0NPTkYpKTsKKwkgICAgaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgRFM2MjBfUkVHX0NPTkYpOwogCiAJLyogc3dpdGNoIHRvIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlICovCiAJbmV3X2NvbmYgJj0gfkRTNjIwX1JFR19DT05GSUdfMVNIT1Q7CkBAIC0xMTgsOCArOTgsNyBAQAogCW5ld19jb25mIHw9IERTNjIwX1JFR19DT05GSUdfUjEgfCBEUzYyMF9SRUdfQ09ORklHX1IwOwogCiAJaWYgKGNvbmYgIT0gbmV3X2NvbmYpCi0JCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBEUzYyMF9SRUdfQ09ORiwKLQkJCQkJICBzd2FiMTYobmV3X2NvbmYpKTsKKwkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIERTNjIwX1JFR19DT05GLCBuZXdfY29uZik7CiAKIAkvKiBzdGFydCBjb252ZXJzaW9uICovCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBEUzYyMF9DT01fU1RBUlQpOwpAQCAtMTQxLDggKzEyMCw4IEBACiAJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgZHM2MjAgdXBkYXRlXG4iKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT50ZW1wKTsgaSsrKSB7Ci0JCQlyZXMgPSBkczYyMF9yZWFkX3RlbXAoY2xpZW50LAotCQkJCQkgICAgICBEUzYyMF9SRUdfVEVNUFtpXSk7CisJCQlyZXMgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCQkJCSAgRFM2MjBfUkVHX1RFTVBbaV0pOwogCQkJaWYgKHJlcyA8IDApIHsKIAkJCQlyZXQgPSBFUlJfUFRSKHJlcyk7CiAJCQkJZ290byBhYm9ydDsKQEAgLTE5MSw4ICsxNzAsOCBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdID0gdmFsOwotCWRzNjIwX3dyaXRlX3RlbXAoY2xpZW50LCBEUzYyMF9SRUdfVEVNUFthdHRyLT5pbmRleF0sCi0JCQkgZGF0YS0+dGVtcFthdHRyLT5pbmRleF0pOworCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBEUzYyMF9SRUdfVEVNUFthdHRyLT5pbmRleF0sCisJCQkJICAgICBkYXRhLT50ZW1wW2F0dHItPmluZGV4XSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMjEwLDE2ICsxODksMTUgQEAKIAkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CiAKIAkvKiByZXNldCBhbGFybXMgaWYgbmVjZXNzYXJ5ICovCi0JcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgRFM2MjBfUkVHX0NPTkYpOworCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIERTNjIwX1JFR19DT05GKTsKIAlpZiAocmVzIDwgMCkKIAkJcmV0dXJuIHJlczsKIAotCWNvbmYgPSBzd2FiMTYocmVzKTsKLQluZXdfY29uZiA9IGNvbmY7CisJbmV3X2NvbmYgPSBjb25mID0gcmVzOwogCW5ld19jb25mICY9IH5hdHRyLT5pbmRleDsKIAlpZiAoY29uZiAhPSBuZXdfY29uZikgewotCQlyZXMgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgRFM2MjBfUkVHX0NPTkYsCi0JCQkJCQlzd2FiMTYobmV3X2NvbmYpKTsKKwkJcmVzID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIERTNjIwX1JFR19DT05GLAorCQkJCQkJICAgbmV3X2NvbmYpOwogCQlpZiAocmVzIDwgMCkKIAkJCXJldHVybiByZXM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9nbDUxOHNtLmMgYi9kcml2ZXJzL2h3bW9uL2dsNTE4c20uYwppbmRleCBlN2FlNTc0Li5hMTNlMmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2dsNTE4c20uYworKysgYi9kcml2ZXJzL2h3bW9uL2dsNTE4c20uYwpAQCAtNTkxLDcgKzU5MSw3IEBACiBzdGF0aWMgaW50IGdsNTE4X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQogewogCWlmICgocmVnID49IDB4MDcpICYmIChyZWcgPD0gMHgwYykpCi0JCXJldHVybiBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKSk7CisJCXJldHVybiBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcpOwogCWVsc2UKIAkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CiB9CkBAIC01OTksNyArNTk5LDcgQEAKIHN0YXRpYyBpbnQgZ2w1MThfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCiB7CiAJaWYgKChyZWcgPj0gMHgwNykgJiYgKHJlZyA8PSAweDBjKSkKLQkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNih2YWx1ZSkpOworCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIHJlZywgdmFsdWUpOwogCWVsc2UKIAkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZ2w1MjBzbS5jIGIvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKaW5kZXggMTMxZWE4Ni4uY2Q2MDg1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKKysrIGIvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKQEAgLTgyMSw3ICs4MjEsNyBAQAogc3RhdGljIGludCBnbDUyMF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKIHsKIAlpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQotCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOworCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgcmVnKTsKIAllbHNlCiAJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwogfQpAQCAtODI5LDcgKzgyOSw3IEBACiBzdGF0aWMgaW50IGdsNTIwX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQogewogCWlmICgocmVnID49IDB4MDcpICYmIChyZWcgPD0gMHgwYykpCi0JCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcsIHZhbHVlKTsKIAllbHNlCiAJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKaW5kZXggYTYxZTc4MS4uNjQ2MDQ4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwpAQCAtMjcsOCArMjcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsYXNzICpod21vbl9jbGFzczsKIAotc3RhdGljIERFRklORV9JRFIoaHdtb25faWRyKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaWRyX2xvY2spOworc3RhdGljIERFRklORV9JREEoaHdtb25faWRhKTsKIAogLyoqCiAgKiBod21vbl9kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciB3LyBod21vbgpAQCAtNDIsMzAgKzQxLDE3IEBACiBzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmh3ZGV2OwotCWludCBpZCwgZXJyOworCWludCBpZDsKIAotYWdhaW46Ci0JaWYgKHVubGlrZWx5KGlkcl9wcmVfZ2V0KCZod21vbl9pZHIsIEdGUF9LRVJORUwpID09IDApKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZod21vbl9pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCWlmIChpZCA8IDApCisJCXJldHVybiBFUlJfUFRSKGlkKTsKIAotCXNwaW5fbG9jaygmaWRyX2xvY2spOwotCWVyciA9IGlkcl9nZXRfbmV3KCZod21vbl9pZHIsIE5VTEwsICZpZCk7Ci0Jc3Bpbl91bmxvY2soJmlkcl9sb2NrKTsKLQotCWlmICh1bmxpa2VseShlcnIgPT0gLUVBR0FJTikpCi0JCWdvdG8gYWdhaW47Ci0JZWxzZSBpZiAodW5saWtlbHkoZXJyKSkKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQotCWlkID0gaWQgJiBNQVhfSURfTUFTSzsKIAlod2RldiA9IGRldmljZV9jcmVhdGUoaHdtb25fY2xhc3MsIGRldiwgTUtERVYoMCwgMCksIE5VTEwsCiAJCQkgICAgICBIV01PTl9JRF9GT1JNQVQsIGlkKTsKIAotCWlmIChJU19FUlIoaHdkZXYpKSB7Ci0JCXNwaW5fbG9jaygmaWRyX2xvY2spOwotCQlpZHJfcmVtb3ZlKCZod21vbl9pZHIsIGlkKTsKLQkJc3Bpbl91bmxvY2soJmlkcl9sb2NrKTsKLQl9CisJaWYgKElTX0VSUihod2RldikpCisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZod21vbl9pZGEsIGlkKTsKIAogCXJldHVybiBod2RldjsKIH0KQEAgLTgxLDkgKzY3LDcgQEAKIAogCWlmIChsaWtlbHkoc3NjYW5mKGRldl9uYW1lKGRldiksIEhXTU9OX0lEX0ZPUk1BVCwgJmlkKSA9PSAxKSkgewogCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwotCQlzcGluX2xvY2soJmlkcl9sb2NrKTsKLQkJaWRyX3JlbW92ZSgmaHdtb25faWRyLCBpZCk7Ci0JCXNwaW5fdW5sb2NrKCZpZHJfbG9jayk7CisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZod21vbl9pZGEsIGlkKTsKIAl9IGVsc2UKIAkJZGV2X2RiZyhkZXYtPnBhcmVudCwKIAkJCSJod21vbl9kZXZpY2VfdW5yZWdpc3RlcigpIGZhaWxlZDogYmFkIGNsYXNzIElEIVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2libWFlbS5jIGIvZHJpdmVycy9od21vbi9pYm1hZW0uYwppbmRleCBjMzE2Mjk0Li42YTk2N2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2libWFlbS5jCisrKyBiL2RyaXZlcnMvaHdtb24vaWJtYWVtLmMKQEAgLTg4LDggKzg4LDcgQEAKICNkZWZpbmUgQUVNX01JTl9QT1dFUl9JTlRFUlZBTAkyMDAKICNkZWZpbmUgVUpfUEVSX01KCQkxMDAwTAogCi1zdGF0aWMgREVGSU5FX0lEUihhZW1faWRyKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWVtX2lkcl9sb2NrKTsKK3N0YXRpYyBERUZJTkVfSURBKGFlbV9pZGEpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhZW1fZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CkBAIC0xNDgsOCArMTQ3LDkgQEAKIAlpbnQJCQlpZDsKIAlzdHJ1Y3QgYWVtX2lwbWlfZGF0YQlpcG1pOwogCi0JLyogRnVuY3Rpb24gdG8gdXBkYXRlIHNlbnNvcnMgKi8KKwkvKiBGdW5jdGlvbiBhbmQgYnVmZmVyIHRvIHVwZGF0ZSBzZW5zb3JzICovCiAJdm9pZCAoKnVwZGF0ZSkoc3RydWN0IGFlbV9kYXRhICpkYXRhKTsKKwlzdHJ1Y3QgYWVtX3JlYWRfc2Vuc29yX3Jlc3AgKnJzX3Jlc3A7CiAKIAkvKgogCSAqIEFFTSAxLnggc2Vuc29yczoKQEAgLTI0Niw4ICsyNDYsNiBAQAogc3RhdGljIHZvaWQgYWVtX21zZ19oYW5kbGVyKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2csIHZvaWQgKnVzZXJfbXNnX2RhdGEpOwogCiBzdGF0aWMgdm9pZCBhZW1fcmVtb3ZlX3NlbnNvcnMoc3RydWN0IGFlbV9kYXRhICpkYXRhKTsKLXN0YXRpYyBpbnQgYWVtX2luaXRfYWVtMShzdHJ1Y3QgYWVtX2lwbWlfZGF0YSAqcHJvYmUpOwotc3RhdGljIGludCBhZW1faW5pdF9hZW0yKHN0cnVjdCBhZW1faXBtaV9kYXRhICpwcm9iZSk7CiBzdGF0aWMgaW50IGFlbTFfZmluZF9zZW5zb3JzKHN0cnVjdCBhZW1fZGF0YSAqZGF0YSk7CiBzdGF0aWMgaW50IGFlbTJfZmluZF9zZW5zb3JzKHN0cnVjdCBhZW1fZGF0YSAqZGF0YSk7CiBzdGF0aWMgdm9pZCB1cGRhdGVfYWVtMV9zZW5zb3JzKHN0cnVjdCBhZW1fZGF0YSAqZGF0YSk7CkBAIC0zNTYsNDcgKzM1NCwxNiBAQAogCWNvbXBsZXRlKCZkYXRhLT5yZWFkX2NvbXBsZXRlKTsKIH0KIAotLyogSUQgZnVuY3Rpb25zICovCi0KLS8qIE9idGFpbiBhbiBpZCAqLwotc3RhdGljIGludCBhZW1faWRyX2dldChpbnQgKmlkKQotewotCWludCBpLCBlcnI7Ci0KLWFnYWluOgotCWlmICh1bmxpa2VseSghaWRyX3ByZV9nZXQoJmFlbV9pZHIsIEdGUF9LRVJORUwpKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2soJmFlbV9pZHJfbG9jayk7Ci0JZXJyID0gaWRyX2dldF9uZXcoJmFlbV9pZHIsIE5VTEwsICZpKTsKLQlzcGluX3VubG9jaygmYWVtX2lkcl9sb2NrKTsKLQotCWlmICh1bmxpa2VseShlcnIgPT0gLUVBR0FJTikpCi0JCWdvdG8gYWdhaW47Ci0JZWxzZSBpZiAodW5saWtlbHkoZXJyKSkKLQkJcmV0dXJuIGVycjsKLQotCSppZCA9IGkgJiBNQVhfSURfTUFTSzsKLQlyZXR1cm4gMDsKLX0KLQotLyogUmVsZWFzZSBhbiBvYmplY3QgSUQgKi8KLXN0YXRpYyB2b2lkIGFlbV9pZHJfcHV0KGludCBpZCkKLXsKLQlzcGluX2xvY2soJmFlbV9pZHJfbG9jayk7Ci0JaWRyX3JlbW92ZSgmYWVtX2lkciwgaWQpOwotCXNwaW5fdW5sb2NrKCZhZW1faWRyX2xvY2spOwotfQotCiAvKiBTZW5zb3Igc3VwcG9ydCBmdW5jdGlvbnMgKi8KIAotLyogUmVhZCBhIHNlbnNvciB2YWx1ZSAqLworLyogUmVhZCBhIHNlbnNvciB2YWx1ZTsgbXVzdCBiZSBjYWxsZWQgd2l0aCBkYXRhLT5sb2NrIGhlbGQgKi8KIHN0YXRpYyBpbnQgYWVtX3JlYWRfc2Vuc29yKHN0cnVjdCBhZW1fZGF0YSAqZGF0YSwgdTggZWx0LCB1OCByZWcsCiAJCQkgICB2b2lkICpidWYsIHNpemVfdCBzaXplKQogewogCWludCByc19zaXplLCByZXM7CiAJc3RydWN0IGFlbV9yZWFkX3NlbnNvcl9yZXEgcnNfcmVxOwotCXN0cnVjdCBhZW1fcmVhZF9zZW5zb3JfcmVzcCAqcnNfcmVzcDsKKwkvKiBVc2UgcHJlYWxsb2NhdGVkIHJ4IGJ1ZmZlciAqLworCXN0cnVjdCBhZW1fcmVhZF9zZW5zb3JfcmVzcCAqcnNfcmVzcCA9IGRhdGEtPnJzX3Jlc3A7CiAJc3RydWN0IGFlbV9pcG1pX2RhdGEgKmlwbWkgPSAmZGF0YS0+aXBtaTsKIAogCS8qIEFFTSByZWdpc3RlcnMgYXJlIDEsIDIsIDQgb3IgOCBieXRlcyAqLwpAQCAtNDIyLDEwICszODksNiBAQAogCWlwbWktPnR4X21lc3NhZ2UuZGF0YV9sZW4gPSBzaXplb2YocnNfcmVxKTsKIAogCXJzX3NpemUgPSBzaXplb2YoKnJzX3Jlc3ApICsgc2l6ZTsKLQlyc19yZXNwID0ga3phbGxvYyhyc19zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJzX3Jlc3ApCi0JCXJldHVybiAtRU5PTUVNOwotCiAJaXBtaS0+cnhfbXNnX2RhdGEgPSByc19yZXNwOwogCWlwbWktPnJ4X21zZ19sZW4gPSByc19zaXplOwogCkBAIC00NjgsNyArNDMxLDYgQEAKIAlyZXMgPSAwOwogCiBvdXQ6Ci0Ja2ZyZWUocnNfcmVzcCk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNTI2LDExICs0ODgsMTIgQEAKIHsKIAlsaXN0X2RlbCgmZGF0YS0+bGlzdCk7CiAJYWVtX3JlbW92ZV9zZW5zb3JzKGRhdGEpOworCWtmcmVlKGRhdGEtPnJzX3Jlc3ApOwogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAJaXBtaV9kZXN0cm95X3VzZXIoZGF0YS0+aXBtaS51c2VyKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkYXRhLT5wZGV2LCBOVUxMKTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5wZGV2KTsKLQlhZW1faWRyX3B1dChkYXRhLT5pZCk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmFlbV9pZGEsIGRhdGEtPmlkKTsKIAlrZnJlZShkYXRhKTsKIH0KIApAQCAtNTg3LDcgKzU1MCw4IEBACiAJCWRhdGEtPnBvd2VyX3BlcmlvZFtpXSA9IEFFTV9ERUZBVUxUX1BPV0VSX0lOVEVSVkFMOwogCiAJLyogQ3JlYXRlIHN1Yi1kZXZpY2UgZm9yIHRoaXMgZncgaW5zdGFuY2UgKi8KLQlpZiAoYWVtX2lkcl9nZXQoJmRhdGEtPmlkKSkKKwlkYXRhLT5pZCA9IGlkYV9zaW1wbGVfZ2V0KCZhZW1faWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YS0+aWQgPCAwKQogCQlnb3RvIGlkX2VycjsKIAogCWRhdGEtPnBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgZGF0YS0+aWQpOwpAQCAtNjAyLDI0ICs1NjYsMzEgQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkYXRhLT5wZGV2LCBkYXRhKTsKIAogCS8qIFNldCB1cCBJUE1JIGludGVyZmFjZSAqLwotCWlmIChhZW1faW5pdF9pcG1pX2RhdGEoJmRhdGEtPmlwbWksIHByb2JlLT5pbnRlcmZhY2UsCi0JCQkgICAgICAgcHJvYmUtPmJtY19kZXZpY2UpKQorCXJlcyA9IGFlbV9pbml0X2lwbWlfZGF0YSgmZGF0YS0+aXBtaSwgcHJvYmUtPmludGVyZmFjZSwKKwkJCQkgcHJvYmUtPmJtY19kZXZpY2UpOworCWlmIChyZXMpCiAJCWdvdG8gaXBtaV9lcnI7CiAKIAkvKiBSZWdpc3RlciB3aXRoIGh3bW9uICovCiAJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZkYXRhLT5wZGV2LT5kZXYpOwotCiAJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CiAJCWRldl9lcnIoJmRhdGEtPnBkZXYtPmRldiwgIlVuYWJsZSB0byByZWdpc3RlciBod21vbiAiCiAJCQkiZGV2aWNlIGZvciBJUE1JIGludGVyZmFjZSAlZFxuIiwKIAkJCXByb2JlLT5pbnRlcmZhY2UpOworCQlyZXMgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CiAJCWdvdG8gaHdtb25fcmVnX2VycjsKIAl9CiAKIAlkYXRhLT51cGRhdGUgPSB1cGRhdGVfYWVtMV9zZW5zb3JzOworCWRhdGEtPnJzX3Jlc3AgPSBremFsbG9jKHNpemVvZigqKGRhdGEtPnJzX3Jlc3ApKSArIDgsIEdGUF9LRVJORUwpOworCWlmICghZGF0YS0+cnNfcmVzcCkgeworCQlyZXMgPSAtRU5PTUVNOworCQlnb3RvIGFsbG9jX3Jlc3BfZXJyOworCX0KIAogCS8qIEZpbmQgc2Vuc29ycyAqLwotCWlmIChhZW0xX2ZpbmRfc2Vuc29ycyhkYXRhKSkKKwlyZXMgPSBhZW0xX2ZpbmRfc2Vuc29ycyhkYXRhKTsKKwlpZiAocmVzKQogCQlnb3RvIHNlbnNvcl9lcnI7CiAKIAkvKiBBZGQgdG8gb3VyIGxpc3Qgb2YgQUVNIGRldmljZXMgKi8KQEAgLTYzMSw2ICs2MDIsOCBAQAogCXJldHVybiAwOwogCiBzZW5zb3JfZXJyOgorCWtmcmVlKGRhdGEtPnJzX3Jlc3ApOworYWxsb2NfcmVzcF9lcnI6CiAJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKIGh3bW9uX3JlZ19lcnI6CiAJaXBtaV9kZXN0cm95X3VzZXIoZGF0YS0+aXBtaS51c2VyKTsKQEAgLTYzOCw3ICs2MTEsNyBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRhdGEtPnBkZXYsIE5VTEwpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPnBkZXYpOwogZGV2X2VycjoKLQlhZW1faWRyX3B1dChkYXRhLT5pZCk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmFlbV9pZGEsIGRhdGEtPmlkKTsKIGlkX2VycjoKIAlrZnJlZShkYXRhKTsKIApAQCAtNjQ2LDcgKzYxOSw3IEBACiB9CiAKIC8qIEZpbmQgYW5kIGluaXRpYWxpemUgYWxsIEFFTTEgaW5zdGFuY2VzICovCi1zdGF0aWMgaW50IGFlbV9pbml0X2FlbTEoc3RydWN0IGFlbV9pcG1pX2RhdGEgKnByb2JlKQorc3RhdGljIHZvaWQgYWVtX2luaXRfYWVtMShzdHJ1Y3QgYWVtX2lwbWlfZGF0YSAqcHJvYmUpCiB7CiAJaW50IG51bSwgaSwgZXJyOwogCkBAIC02NTcsMTEgKzYzMCw4IEBACiAJCQlkZXZfZXJyKHByb2JlLT5ibWNfZGV2aWNlLAogCQkJCSJFcnJvciAlZCBpbml0aWFsaXppbmcgQUVNMSAweCVYXG4iLAogCQkJCWVyciwgaSk7Ci0JCQlyZXR1cm4gZXJyOwogCQl9CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIC8qIFByb2JlIGZ1bmN0aW9ucyBmb3IgQUVNMiBkZXZpY2VzICovCkBAIC03MjAsNyArNjkwLDggQEAKIAkJZGF0YS0+cG93ZXJfcGVyaW9kW2ldID0gQUVNX0RFRkFVTFRfUE9XRVJfSU5URVJWQUw7CiAKIAkvKiBDcmVhdGUgc3ViLWRldmljZSBmb3IgdGhpcyBmdyBpbnN0YW5jZSAqLwotCWlmIChhZW1faWRyX2dldCgmZGF0YS0+aWQpKQorCWRhdGEtPmlkID0gaWRhX3NpbXBsZV9nZXQoJmFlbV9pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCWlmIChkYXRhLT5pZCA8IDApCiAJCWdvdG8gaWRfZXJyOwogCiAJZGF0YS0+cGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBkYXRhLT5pZCk7CkBAIC03MzUsMjQgKzcwNiwzMSBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRhdGEtPnBkZXYsIGRhdGEpOwogCiAJLyogU2V0IHVwIElQTUkgaW50ZXJmYWNlICovCi0JaWYgKGFlbV9pbml0X2lwbWlfZGF0YSgmZGF0YS0+aXBtaSwgcHJvYmUtPmludGVyZmFjZSwKLQkJCSAgICAgICBwcm9iZS0+Ym1jX2RldmljZSkpCisJcmVzID0gYWVtX2luaXRfaXBtaV9kYXRhKCZkYXRhLT5pcG1pLCBwcm9iZS0+aW50ZXJmYWNlLAorCQkJCSBwcm9iZS0+Ym1jX2RldmljZSk7CisJaWYgKHJlcykKIAkJZ290byBpcG1pX2VycjsKIAogCS8qIFJlZ2lzdGVyIHdpdGggaHdtb24gKi8KIAlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmRhdGEtPnBkZXYtPmRldik7Ci0KIAlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKIAkJZGV2X2VycigmZGF0YS0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGh3bW9uICIKIAkJCSJkZXZpY2UgZm9yIElQTUkgaW50ZXJmYWNlICVkXG4iLAogCQkJcHJvYmUtPmludGVyZmFjZSk7CisJCXJlcyA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKIAkJZ290byBod21vbl9yZWdfZXJyOwogCX0KIAogCWRhdGEtPnVwZGF0ZSA9IHVwZGF0ZV9hZW0yX3NlbnNvcnM7CisJZGF0YS0+cnNfcmVzcCA9IGt6YWxsb2Moc2l6ZW9mKCooZGF0YS0+cnNfcmVzcCkpICsgOCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhLT5yc19yZXNwKSB7CisJCXJlcyA9IC1FTk9NRU07CisJCWdvdG8gYWxsb2NfcmVzcF9lcnI7CisJfQogCiAJLyogRmluZCBzZW5zb3JzICovCi0JaWYgKGFlbTJfZmluZF9zZW5zb3JzKGRhdGEpKQorCXJlcyA9IGFlbTJfZmluZF9zZW5zb3JzKGRhdGEpOworCWlmIChyZXMpCiAJCWdvdG8gc2Vuc29yX2VycjsKIAogCS8qIEFkZCB0byBvdXIgbGlzdCBvZiBBRU0gZGV2aWNlcyAqLwpAQCAtNzY0LDYgKzc0Miw4IEBACiAJcmV0dXJuIDA7CiAKIHNlbnNvcl9lcnI6CisJa2ZyZWUoZGF0YS0+cnNfcmVzcCk7CithbGxvY19yZXNwX2VycjoKIAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogaHdtb25fcmVnX2VycjoKIAlpcG1pX2Rlc3Ryb3lfdXNlcihkYXRhLT5pcG1pLnVzZXIpOwpAQCAtNzcxLDcgKzc1MSw3IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGF0YS0+cGRldiwgTlVMTCk7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+cGRldik7CiBkZXZfZXJyOgotCWFlbV9pZHJfcHV0KGRhdGEtPmlkKTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmYWVtX2lkYSwgZGF0YS0+aWQpOwogaWRfZXJyOgogCWtmcmVlKGRhdGEpOwogCkBAIC03NzksNyArNzU5LDcgQEAKIH0KIAogLyogRmluZCBhbmQgaW5pdGlhbGl6ZSBhbGwgQUVNMiBpbnN0YW5jZXMgKi8KLXN0YXRpYyBpbnQgYWVtX2luaXRfYWVtMihzdHJ1Y3QgYWVtX2lwbWlfZGF0YSAqcHJvYmUpCitzdGF0aWMgdm9pZCBhZW1faW5pdF9hZW0yKHN0cnVjdCBhZW1faXBtaV9kYXRhICpwcm9iZSkKIHsKIAlzdHJ1Y3QgYWVtX2ZpbmRfaW5zdGFuY2VfcmVzcCBmaV9yZXNwOwogCWludCBlcnI7CkBAIC03OTgsMTIgKzc3OCw5IEBACiAJCQlkZXZfZXJyKHByb2JlLT5ibWNfZGV2aWNlLAogCQkJCSJFcnJvciAlZCBpbml0aWFsaXppbmcgQUVNMiAweCVYXG4iLAogCQkJCWVyciwgZmlfcmVzcC5tb2R1bGVfaGFuZGxlKTsKLQkJCXJldHVybiBlcnI7CiAJCX0KIAkJaSsrOwogCX0KLQotCXJldHVybiAwOwogfQogCiAvKiBQcm9iZSBhIEJNQyBmb3IgQUVNIGZpcm13YXJlIGluc3RhbmNlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9qYzQyLmMgYi9kcml2ZXJzL2h3bW9uL2pjNDIuYwppbmRleCAwMmNlYmI3Li4yZDNkNzI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2pjNDIuYworKysgYi9kcml2ZXJzL2h3bW9uL2pjNDIuYwpAQCAtMTU0LDggKzE1NCw2IEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCk7CiBzdGF0aWMgaW50IGpjNDJfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbyk7CiBzdGF0aWMgaW50IGpjNDJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotc3RhdGljIGludCBqYzQyX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKTsKLXN0YXRpYyBpbnQgamM0Ml93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgamM0Ml9kYXRhICpqYzQyX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKIApAQCAtMTg3LDcgKzE4NSw3IEBACiAJc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJZGF0YS0+Y29uZmlnIHw9IEpDNDJfQ0ZHX1NIVVRET1dOOwotCWpjNDJfd3JpdGVfdmFsdWUoY2xpZW50LCBKQzQyX1JFR19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIEpDNDJfUkVHX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk3LDcgKzE5NSw3IEBACiAJc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJZGF0YS0+Y29uZmlnICY9IH5KQzQyX0NGR19TSFVURE9XTjsKLQlqYzQyX3dyaXRlX3ZhbHVlKGNsaWVudCwgSkM0Ml9SRUdfQ09ORklHLCBkYXRhLT5jb25maWcpOworCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBKQzQyX1JFR19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxNSw3ICszMTMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwkJCQkJXAogCWRhdGEtPnZhbHVlID0gamM0Ml90ZW1wX3RvX3JlZyh2YWwsIGRhdGEtPmV4dGVuZGVkKTsJCVwKLQllcnIgPSBqYzQyX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT52YWx1ZSk7CQlcCisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOwlcCiAJaWYgKGVyciA8IDApCQkJCQkJCVwKIAkJcmV0ID0gZXJyOwkJCQkJCVwKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsJCQkJXApAQCAtMzU3LDcgKzM1NSw4IEBACiAJZGF0YS0+Y29uZmlnID0gKGRhdGEtPmNvbmZpZwogCQkJJiB+KEpDNDJfQ0ZHX0hZU1RfTUFTSyA8PCBKQzQyX0NGR19IWVNUX1NISUZUKSkKIAkgIHwgKGh5c3QgPDwgSkM0Ml9DRkdfSFlTVF9TSElGVCk7Ci0JZXJyID0gamM0Ml93cml0ZV92YWx1ZShjbGllbnQsIEpDNDJfUkVHX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKwllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgSkM0Ml9SRUdfQ09ORklHLAorCQkJCQkgICBkYXRhLT5jb25maWcpOwogCWlmIChlcnIgPCAwKQogCQlyZXQgPSBlcnI7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CkBAIC00NTIsMTAgKzQ1MSwxMCBAQAogCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQljYXAgPSBqYzQyX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgSkM0Ml9SRUdfQ0FQKTsKLQljb25maWcgPSBqYzQyX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgSkM0Ml9SRUdfQ09ORklHKTsKLQltYW5pZCA9IGpjNDJfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBKQzQyX1JFR19NQU5JRCk7Ci0JZGV2aWQgPSBqYzQyX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgSkM0Ml9SRUdfREVWSUNFSUQpOworCWNhcCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChuZXdfY2xpZW50LCBKQzQyX1JFR19DQVApOworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChuZXdfY2xpZW50LCBKQzQyX1JFR19DT05GSUcpOworCW1hbmlkID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKG5ld19jbGllbnQsIEpDNDJfUkVHX01BTklEKTsKKwlkZXZpZCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChuZXdfY2xpZW50LCBKQzQyX1JFR19ERVZJQ0VJRCk7CiAKIAlpZiAoY2FwIDwgMCB8fCBjb25maWcgPCAwIHx8IG1hbmlkIDwgMCB8fCBkZXZpZCA8IDApCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNDg5LDE0ICs0ODgsMTQgQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JY2FwID0gamM0Ml9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEpDNDJfUkVHX0NBUCk7CisJY2FwID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKG5ld19jbGllbnQsIEpDNDJfUkVHX0NBUCk7CiAJaWYgKGNhcCA8IDApIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBleGl0X2ZyZWU7CiAJfQogCWRhdGEtPmV4dGVuZGVkID0gISEoY2FwICYgSkM0Ml9DQVBfUkFOR0UpOwogCi0JY29uZmlnID0gamM0Ml9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEpDNDJfUkVHX0NPTkZJRyk7CisJY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKG5ld19jbGllbnQsIEpDNDJfUkVHX0NPTkZJRyk7CiAJaWYgKGNvbmZpZyA8IDApIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBleGl0X2ZyZWU7CkBAIC01MDQsNyArNTAzLDggQEAKIAlkYXRhLT5vcmlnX2NvbmZpZyA9IGNvbmZpZzsKIAlpZiAoY29uZmlnICYgSkM0Ml9DRkdfU0hVVERPV04pIHsKIAkJY29uZmlnICY9IH5KQzQyX0NGR19TSFVURE9XTjsKLQkJamM0Ml93cml0ZV92YWx1ZShuZXdfY2xpZW50LCBKQzQyX1JFR19DT05GSUcsIGNvbmZpZyk7CisJCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQobmV3X2NsaWVudCwgSkM0Ml9SRUdfQ09ORklHLAorCQkJCQkgICAgIGNvbmZpZyk7CiAJfQogCWRhdGEtPmNvbmZpZyA9IGNvbmZpZzsKIApAQCAtNTM1LDI1ICs1MzUsMTIgQEAKIAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmpjNDJfZ3JvdXApOwogCWlmIChkYXRhLT5jb25maWcgIT0gZGF0YS0+b3JpZ19jb25maWcpCi0JCWpjNDJfd3JpdGVfdmFsdWUoY2xpZW50LCBKQzQyX1JFR19DT05GSUcsIGRhdGEtPm9yaWdfY29uZmlnKTsKKwkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIEpDNDJfUkVHX0NPTkZJRywKKwkJCQkJICAgICBkYXRhLT5vcmlnX2NvbmZpZyk7CiAJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qIEFsbCByZWdpc3RlcnMgYXJlIHdvcmQtc2l6ZWQuICovCi1zdGF0aWMgaW50IGpjNDJfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCi17Ci0JaW50IHJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIHN3YWIxNihyZXQpOwotfQotCi1zdGF0aWMgaW50IGpjNDJfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCi17Ci0JcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNih2YWx1ZSkpOwotfQotCiBzdGF0aWMgc3RydWN0IGpjNDJfZGF0YSAqamM0Ml91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwpAQCAtNTY0LDI4ICs1NTEsMjkgQEAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikgfHwgIWRhdGEtPnZhbGlkKSB7Ci0JCXZhbCA9IGpjNDJfcmVhZF92YWx1ZShjbGllbnQsIEpDNDJfUkVHX1RFTVApOworCQl2YWwgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCBKQzQyX1JFR19URU1QKTsKIAkJaWYgKHZhbCA8IDApIHsKIAkJCXJldCA9IEVSUl9QVFIodmFsKTsKIAkJCWdvdG8gYWJvcnQ7CiAJCX0KIAkJZGF0YS0+dGVtcF9pbnB1dCA9IHZhbDsKIAotCQl2YWwgPSBqYzQyX3JlYWRfdmFsdWUoY2xpZW50LCBKQzQyX1JFR19URU1QX0NSSVRJQ0FMKTsKKwkJdmFsID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkJCSAgSkM0Ml9SRUdfVEVNUF9DUklUSUNBTCk7CiAJCWlmICh2YWwgPCAwKSB7CiAJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CiAJCQlnb3RvIGFib3J0OwogCQl9CiAJCWRhdGEtPnRlbXBfY3JpdCA9IHZhbDsKIAotCQl2YWwgPSBqYzQyX3JlYWRfdmFsdWUoY2xpZW50LCBKQzQyX1JFR19URU1QX0xPV0VSKTsKKwkJdmFsID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgSkM0Ml9SRUdfVEVNUF9MT1dFUik7CiAJCWlmICh2YWwgPCAwKSB7CiAJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CiAJCQlnb3RvIGFib3J0OwogCQl9CiAJCWRhdGEtPnRlbXBfbWluID0gdmFsOwogCi0JCXZhbCA9IGpjNDJfcmVhZF92YWx1ZShjbGllbnQsIEpDNDJfUkVHX1RFTVBfVVBQRVIpOworCQl2YWwgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCBKQzQyX1JFR19URU1QX1VQUEVSKTsKIAkJaWYgKHZhbCA8IDApIHsKIAkJCXJldCA9IEVSUl9QVFIodmFsKTsKIAkJCWdvdG8gYWJvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzMuYyBiL2RyaXZlcnMvaHdtb24vbG03My5jCmluZGV4IDI5YjkwMzAuLjllNjRkOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03My5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03My5jCkBAIC0zNCw3ICszNCw3IEBACiAjZGVmaW5lIExNNzNfUkVHX0NUUkwJCTB4MDQKICNkZWZpbmUgTE03M19SRUdfSUQJCTB4MDcKIAotI2RlZmluZSBMTTczX0lECQkJMHg5MDAxIC8qIG9yIDB4MTkwIGFmdGVyIGEgc3dhYjE2KCkgKi8KKyNkZWZpbmUgTE03M19JRAkJCTB4OTAwMQkvKiAweDAxOTAsIGJ5dGUtc3dhcHBlZCAqLwogI2RlZmluZSBEUlZOQU1FCQkJImxtNzMiCiAjZGVmaW5lIExNNzNfVEVNUF9NSU4JCSgtNDApCiAjZGVmaW5lIExNNzNfVEVNUF9NQVgJCTE1MApAQCAtNTcsNyArNTcsNyBAQAogCS8qIFdyaXRlIHZhbHVlICovCiAJdmFsdWUgPSAoc2hvcnQpIFNFTlNPUlNfTElNSVQodGVtcC8yNTAsIChMTTczX1RFTVBfTUlOKjQpLAogCQkoTE03M19URU1QX01BWCo0KSkgPDwgNTsKLQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgYXR0ci0+aW5kZXgsIHN3YWIxNih2YWx1ZSkpOworCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBhdHRyLT5pbmRleCwgdmFsdWUpOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtNjgsOCArNjgsOCBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJLyogdXNlIGludGVnZXIgZGl2aXNpb24gaW5zdGVhZCBvZiBlcXVpdmFsZW50IHJpZ2h0IHNoaWZ0IHRvCiAJICAgZ3VhcmFudGVlIGFyaXRobWV0aWMgc2hpZnQgYW5kIHByZXNlcnZlIHRoZSBzaWduICovCi0JaW50IHRlbXAgPSAoKHMxNikgKHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAotCQlhdHRyLT5pbmRleCkpKSoyNTApIC8gMzI7CisJaW50IHRlbXAgPSAoKHMxNikgKGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCSAgICBhdHRyLT5pbmRleCkpKjI1MCkgLyAzMjsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7CiB9CiAKQEAgLTE1MCwxNyArMTUwLDMxIEBACiAJCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gbmV3X2NsaWVudC0+YWRhcHRlcjsKLQl1MTYgaWQ7Ci0JdTggY3RybDsKKwlpbnQgaWQsIGN0cmwsIGNvbmY7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CiAJCQkJCUkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyoKKwkgKiBEbyBhcyBtdWNoIGRldGVjdGlvbiBhcyBwb3NzaWJsZSB3aXRoIGJ5dGUgcmVhZHMgZmlyc3QsIGFzIHdvcmQKKwkgKiByZWFkcyBjYW4gY29uZnVzZSBvdGhlciBkZXZpY2VzLgorCSAqLworCWN0cmwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE03M19SRUdfQ1RSTCk7CisJaWYgKGN0cmwgPCAwIHx8IChjdHJsICYgMHgxMCkpCisJCXJldHVybiAtRU5PREVWOworCisJY29uZiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTczX1JFR19DT05GKTsKKwlpZiAoY29uZiA8IDAgfHwgKGNvbmYgJiAweDBjKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTczX1JFR19JRCk7CisJaWYgKGlkIDwgMCB8fCBpZCAhPSAoTE03M19JRCAmIDB4ZmYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCS8qIENoZWNrIGRldmljZSBJRCAqLwogCWlkID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKG5ld19jbGllbnQsIExNNzNfUkVHX0lEKTsKLQljdHJsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNNzNfUkVHX0NUUkwpOwotCWlmICgoaWQgIT0gTE03M19JRCkgfHwgKGN0cmwgJiAweDEwKSkKKwlpZiAoaWQgPCAwIHx8IGlkICE9IExNNzNfSUQpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc3RybGNweShpbmZvLT50eXBlLCAibG03MyIsIEkyQ19OQU1FX1NJWkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTc1LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzUuYwppbmRleCA5MDEyNmEyLi4xODg4ZGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzUuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzUuYwpAQCAtMzg0LDEzICszODQsMTAgQEAKICAqLwogc3RhdGljIGludCBsbTc1X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQogewotCWludCB2YWx1ZTsKLQogCWlmIChyZWcgPT0gTE03NV9SRUdfQ09ORikKIAkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Ci0KLQl2YWx1ZSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7Ci0JcmV0dXJuICh2YWx1ZSA8IDApID8gdmFsdWUgOiBzd2FiMTYodmFsdWUpOworCWVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIHJlZyk7CiB9CiAKIHN0YXRpYyBpbnQgbG03NV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKQEAgLTM5OCw3ICszOTUsNyBAQAogCWlmIChyZWcgPT0gTE03NV9SRUdfQ09ORikKIAkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKIAllbHNlCi0JCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcsIHZhbHVlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBsbTc1X2RhdGEgKmxtNzVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzcuYyBiL2RyaXZlcnMvaHdtb24vbG03Ny5jCmluZGV4IGIyOGEyOTcuLjhkZmM2NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03Ny5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03Ny5jCkBAIC0zNjUsNyArMzY1LDcgQEAKIAlpZiAocmVnID09IExNNzdfUkVHX0NPTkYpCiAJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwogCWVsc2UKLQkJcmV0dXJuIHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpKTsKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIHJlZyk7CiB9CiAKIHN0YXRpYyBpbnQgbG03N193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKQEAgLTM3Myw3ICszNzMsNyBAQAogCWlmIChyZWcgPT0gTE03N19SRUdfQ09ORikKIAkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKIAllbHNlCi0JCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcsIHZhbHVlKTsKIH0KIAogc3RhdGljIHZvaWQgbG03N19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTkwLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwppbmRleCA5MGRkYjg3Li42MTViYzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwpAQCAtMTEwNSw0MSArMTEwNSwzNyBAQAogICovCiAKIC8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLwotc3RhdGljIGludCBsbTkwX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKK3N0YXRpYyBpbnQgbG05MF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJICAgICAgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXdfY2xpZW50LT5hZGFwdGVyOwotCWludCBhZGRyZXNzID0gbmV3X2NsaWVudC0+YWRkcjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJaW50IGFkZHJlc3MgPSBjbGllbnQtPmFkZHI7CiAJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7Ci0JaW50IG1hbl9pZCwgY2hpcF9pZCwgcmVnX2NvbmZpZzEsIHJlZ19jb25maWcyLCByZWdfY29udnJhdGU7CisJaW50IG1hbl9pZCwgY2hpcF9pZCwgY29uZmlnMSwgY29uZmlnMiwgY29udnJhdGU7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogZGV0ZWN0aW9uIGFuZCBpZGVudGlmaWNhdGlvbiAqLwotCWlmICgobWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkJCQlMTTkwX1JFR19SX01BTl9JRCkpIDwgMAotCSB8fCAoY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJCQkJTE05MF9SRUdfUl9DSElQX0lEKSkgPCAwCi0JIHx8IChyZWdfY29uZmlnMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJCQkJTE05MF9SRUdfUl9DT05GSUcxKSkgPCAwCi0JIHx8IChyZWdfY29udnJhdGUgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCQkJCUxNOTBfUkVHX1JfQ09OVlJBVEUpKSA8IDApCisJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfUl9NQU5fSUQpOworCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTkwX1JFR19SX0NISVBfSUQpOworCWNvbmZpZzEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTkwX1JFR19SX0NPTkZJRzEpOworCWNvbnZyYXRlID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfUl9DT05WUkFURSk7CisJaWYgKG1hbl9pZCA8IDAgfHwgY2hpcF9pZCA8IDAgfHwgY29uZmlnMSA8IDAgfHwgY29udnJhdGUgPCAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChtYW5faWQgPT0gMHgwMSB8fCBtYW5faWQgPT0gMHg1QyB8fCBtYW5faWQgPT0gMHg0MSkgewotCQlyZWdfY29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJCQkJTE05MF9SRUdfUl9DT05GSUcyKTsKLQkJaWYgKHJlZ19jb25maWcyIDwgMCkKKwkJY29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1JfQ09ORklHMik7CisJCWlmIChjb25maWcyIDwgMCkKIAkJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZQotCQlyZWdfY29uZmlnMiA9IDA7CS8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKwkJY29uZmlnMiA9IDA7CQkvKiBNYWtlIGNvbXBpbGVyIGhhcHB5ICovCiAKIAlpZiAoKGFkZHJlc3MgPT0gMHg0QyB8fCBhZGRyZXNzID09IDB4NEQpCiAJICYmIG1hbl9pZCA9PSAweDAxKSB7IC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KLQkJaWYgKChyZWdfY29uZmlnMSAmIDB4MkEpID09IDB4MDAKLQkJICYmIChyZWdfY29uZmlnMiAmIDB4RjgpID09IDB4MDAKLQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA5KSB7CisJCWlmICgoY29uZmlnMSAmIDB4MkEpID09IDB4MDAKKwkJICYmIChjb25maWcyICYgMHhGOCkgPT0gMHgwMAorCQkgJiYgY29udnJhdGUgPD0gMHgwOSkgewogCQkJaWYgKGFkZHJlc3MgPT0gMHg0QwogCQkJICYmIChjaGlwX2lkICYgMHhGMCkgPT0gMHgyMCkgeyAvKiBMTTkwICovCiAJCQkJbmFtZSA9ICJsbTkwIjsKQEAgLTExNjMsOCArMTE1OSw4IEBACiAJaWYgKChhZGRyZXNzID09IDB4NEMgfHwgYWRkcmVzcyA9PSAweDREKQogCSAmJiBtYW5faWQgPT0gMHg0MSkgeyAvKiBBbmFsb2cgRGV2aWNlcyAqLwogCQlpZiAoKGNoaXBfaWQgJiAweEYwKSA9PSAweDQwIC8qIEFETTEwMzIgKi8KLQkJICYmIChyZWdfY29uZmlnMSAmIDB4M0YpID09IDB4MDAKLQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDBBKSB7CisJCSAmJiAoY29uZmlnMSAmIDB4M0YpID09IDB4MDAKKwkJICYmIGNvbnZyYXRlIDw9IDB4MEEpIHsKIAkJCW5hbWUgPSAiYWRtMTAzMiI7CiAJCQkvKiBUaGUgQURNMTAzMiBzdXBwb3J0cyBQRUMsIGJ1dCBvbmx5IGlmIGNvbWJpbmVkCiAJCQkgICB0cmFuc2FjdGlvbnMgYXJlIG5vdCB1c2VkLiAqLwpAQCAtMTE3MywxOCArMTE2OSwxOCBAQAogCQkJCWluZm8tPmZsYWdzIHw9IEkyQ19DTElFTlRfUEVDOwogCQl9IGVsc2UKIAkJaWYgKGNoaXBfaWQgPT0gMHg1MSAvKiBBRFQ3NDYxICovCi0JCSAmJiAocmVnX2NvbmZpZzEgJiAweDFCKSA9PSAweDAwCi0JCSAmJiByZWdfY29udnJhdGUgPD0gMHgwQSkgeworCQkgJiYgKGNvbmZpZzEgJiAweDFCKSA9PSAweDAwCisJCSAmJiBjb252cmF0ZSA8PSAweDBBKSB7CiAJCQluYW1lID0gImFkdDc0NjEiOwogCQl9IGVsc2UKIAkJaWYgKGNoaXBfaWQgPT0gMHg1NyAvKiBBRFQ3NDYxQSwgTkNUMTAwOCAqLwotCQkgJiYgKHJlZ19jb25maWcxICYgMHgxQikgPT0gMHgwMAotCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MEEpIHsKKwkJICYmIChjb25maWcxICYgMHgxQikgPT0gMHgwMAorCQkgJiYgY29udnJhdGUgPD0gMHgwQSkgewogCQkJbmFtZSA9ICJhZHQ3NDYxYSI7CiAJCX0KIAl9IGVsc2UKIAlpZiAobWFuX2lkID09IDB4NEQpIHsgLyogTWF4aW0gKi8KLQkJaW50IHJlZ19lbWVyZywgcmVnX2VtZXJnMiwgcmVnX3N0YXR1czI7CisJCWludCBlbWVyZywgZW1lcmcyLCBzdGF0dXMyOwogCiAJCS8qCiAJCSAqIFdlIHJlYWQgTUFYNjY1OV9SRUdfUl9SRU1PVEVfRU1FUkcgdHdpY2UsIGFuZCByZS1yZWFkCkBAIC0xMTkyLDEzICsxMTg4LDE1IEBACiAJCSAqIGV4aXN0cywgYm90aCByZWFkaW5ncyB3aWxsIHJlZmxlY3QgdGhlIHNhbWUgdmFsdWUuIE90aGVyd2lzZSwKIAkJICogdGhlIHJlYWRpbmdzIHdpbGwgYmUgZGlmZmVyZW50LgogCQkgKi8KLQkJaWYgKChyZWdfZW1lcmcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCQkJCU1BWDY2NTlfUkVHX1JfUkVNT1RFX0VNRVJHKSkgPCAwCi0JCSB8fCBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05MF9SRUdfUl9NQU5fSUQpIDwgMAotCQkgfHwgKHJlZ19lbWVyZzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCQkJCU1BWDY2NTlfUkVHX1JfUkVNT1RFX0VNRVJHKSkgPCAwCi0JCSB8fCAocmVnX3N0YXR1czIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCQkJCU1BWDY2OTZfUkVHX1JfU1RBVFVTMikpIDwgMCkKKwkJZW1lcmcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJIE1BWDY2NTlfUkVHX1JfUkVNT1RFX0VNRVJHKTsKKwkJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgTE05MF9SRUdfUl9NQU5fSUQpOworCQllbWVyZzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJICBNQVg2NjU5X1JFR19SX1JFTU9URV9FTUVSRyk7CisJCXN0YXR1czIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJICAgTUFYNjY5Nl9SRUdfUl9TVEFUVVMyKTsKKwkJaWYgKGVtZXJnIDwgMCB8fCBtYW5faWQgPCAwIHx8IGVtZXJnMiA8IDAgfHwgc3RhdHVzMiA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQkvKgpAQCAtMTIxNiw4ICsxMjE0LDggQEAKIAkJICovCiAJCWlmIChjaGlwX2lkID09IG1hbl9pZAogCQkgJiYgKGFkZHJlc3MgPT0gMHg0QyB8fCBhZGRyZXNzID09IDB4NEQgfHwgYWRkcmVzcyA9PSAweDRFKQotCQkgJiYgKHJlZ19jb25maWcxICYgMHgxRikgPT0gKG1hbl9pZCAmIDB4MEYpCi0JCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOSkgeworCQkgJiYgKGNvbmZpZzEgJiAweDFGKSA9PSAobWFuX2lkICYgMHgwRikKKwkJICYmIGNvbnZyYXRlIDw9IDB4MDkpIHsKIAkJCWlmIChhZGRyZXNzID09IDB4NEMpCiAJCQkJbmFtZSA9ICJtYXg2NjU3IjsKIAkJCWVsc2UKQEAgLTEyMzUsMTAgKzEyMzMsMTAgQEAKIAkJICogb25lIG9mIHRob3NlIHJlZ2lzdGVycyBleGlzdHMuCiAJCSAqLwogCQlpZiAoY2hpcF9pZCA9PSAweDAxCi0JCSAmJiAocmVnX2NvbmZpZzEgJiAweDEwKSA9PSAweDAwCi0JCSAmJiAocmVnX3N0YXR1czIgJiAweDAxKSA9PSAweDAwCi0JCSAmJiByZWdfZW1lcmcgPT0gcmVnX2VtZXJnMgotCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MDcpIHsKKwkJICYmIChjb25maWcxICYgMHgxMCkgPT0gMHgwMAorCQkgJiYgKHN0YXR1czIgJiAweDAxKSA9PSAweDAwCisJCSAmJiBlbWVyZyA9PSBlbWVyZzIKKwkJICYmIGNvbnZyYXRlIDw9IDB4MDcpIHsKIAkJCW5hbWUgPSAibWF4NjY5NiI7CiAJCX0gZWxzZQogCQkvKgpAQCAtMTI0OCw4ICsxMjQ2LDggQEAKIAkJICogc2Vjb25kIHRvIGxhc3QgYml0IG9mIGNvbmZpZzEgKHNvZnR3YXJlIHJlc2V0KS4KIAkJICovCiAJCWlmIChjaGlwX2lkID09IDB4MDEKLQkJICYmIChyZWdfY29uZmlnMSAmIDB4MDMpID09IDB4MDAKLQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA3KSB7CisJCSAmJiAoY29uZmlnMSAmIDB4MDMpID09IDB4MDAKKwkJICYmIGNvbnZyYXRlIDw9IDB4MDcpIHsKIAkJCW5hbWUgPSAibWF4NjY4MCI7CiAJCX0gZWxzZQogCQkvKgpAQCAtMTI1OCwyMSArMTI1NiwyMSBAQAogCQkgKiByZWdpc3RlciBhcmUgdW51c2VkIGFuZCBzaG91bGQgcmV0dXJuIHplcm8gd2hlbiByZWFkLgogCQkgKi8KIAkJaWYgKGNoaXBfaWQgPT0gMHg1OQotCQkgJiYgKHJlZ19jb25maWcxICYgMHgzZikgPT0gMHgwMAotCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MDcpIHsKKwkJICYmIChjb25maWcxICYgMHgzZikgPT0gMHgwMAorCQkgJiYgY29udnJhdGUgPD0gMHgwNykgewogCQkJbmFtZSA9ICJtYXg2NjQ2IjsKIAkJfQogCX0gZWxzZQogCWlmIChhZGRyZXNzID09IDB4NEMKIAkgJiYgbWFuX2lkID09IDB4NUMpIHsgLyogV2luYm9uZC9OdXZvdG9uICovCi0JCWlmICgocmVnX2NvbmZpZzEgJiAweDJBKSA9PSAweDAwCi0JCSAmJiAocmVnX2NvbmZpZzIgJiAweEY4KSA9PSAweDAwKSB7CisJCWlmICgoY29uZmlnMSAmIDB4MkEpID09IDB4MDAKKwkJICYmIChjb25maWcyICYgMHhGOCkgPT0gMHgwMCkgewogCQkJaWYgKGNoaXBfaWQgPT0gMHgwMSAvKiBXODNMNzcxVy9HICovCi0JCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MDkpIHsKKwkJCSAmJiBjb252cmF0ZSA8PSAweDA5KSB7CiAJCQkJbmFtZSA9ICJ3ODNsNzcxIjsKIAkJCX0gZWxzZQogCQkJaWYgKChjaGlwX2lkICYgMHhGRSkgPT0gMHgxMCAvKiBXODNMNzcxQVdHL0FTRyAqLwotCQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA4KSB7CisJCQkgJiYgY29udnJhdGUgPD0gMHgwOCkgewogCQkJCW5hbWUgPSAidzgzbDc3MSI7CiAJCQl9CiAJCX0KQEAgLTEyODAsOSArMTI3OCw5IEBACiAJaWYgKGFkZHJlc3MgPj0gMHg0OCAmJiBhZGRyZXNzIDw9IDB4NEYKIAkgJiYgbWFuX2lkID09IDB4QTEpIHsgLyogIE5YUCBTZW1pY29uZHVjdG9yL1BoaWxpcHMgKi8KIAkJaWYgKGNoaXBfaWQgPT0gMHgwMAotCQkgJiYgKHJlZ19jb25maWcxICYgMHgyQSkgPT0gMHgwMAotCQkgJiYgKHJlZ19jb25maWcyICYgMHhGRSkgPT0gMHgwMAotCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MDkpIHsKKwkJICYmIChjb25maWcxICYgMHgyQSkgPT0gMHgwMAorCQkgJiYgKGNvbmZpZzIgJiAweEZFKSA9PSAweDAwCisJCSAmJiBjb252cmF0ZSA8PSAweDA5KSB7CiAJCQluYW1lID0gInNhNTYwMDQiOwogCQl9CiAJfQpAQCAtMTMwMSwxOSArMTI5OSwxOCBAQAogCiBzdGF0aWMgdm9pZCBsbTkwX3JlbW92ZV9maWxlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgbG05MF9kYXRhICpkYXRhKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwogCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9URU1QMykKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbG05MF90ZW1wM19ncm91cCk7CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmbG05MF90ZW1wM19ncm91cCk7CiAJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX0VNRVJHRU5DWV9BTEFSTSkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLAotCQkJCSAgICZsbTkwX2VtZXJnZW5jeV9hbGFybV9ncm91cCk7CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmbG05MF9lbWVyZ2VuY3lfYWxhcm1fZ3JvdXApOwogCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9FTUVSR0VOQ1kpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwKLQkJCQkgICAmbG05MF9lbWVyZ2VuY3lfZ3JvdXApOworCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmxtOTBfZW1lcmdlbmN5X2dyb3VwKTsKIAlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfT0ZGU0VUKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNsaWVudC0+ZGV2LAotCQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfb2Zmc2V0LmRldl9hdHRyKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcGVjKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsbTkwX2dyb3VwKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9vZmZzZXQuZGV2X2F0dHIpOworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9wZWMpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmbG05MF9ncm91cCk7CiB9CiAKIHN0YXRpYyB2b2lkIGxtOTBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKQEAgLTEzNjIsMTAgKzEzNTksMTEgQEAKIAkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfQ09ORklHMSwgY29uZmlnKTsKIH0KIAotc3RhdGljIGludCBsbTkwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LAorc3RhdGljIGludCBsbTkwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihuZXdfY2xpZW50LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoZGV2LT5wYXJlbnQpOwogCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGE7CiAJaW50IGVycjsKIApAQCAtMTM3NCwxNCArMTM3MiwxNCBAQAogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGV4aXQ7CiAJfQotCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBTZXQgdGhlIGRldmljZSB0eXBlICovCiAJZGF0YS0+a2luZCA9IGlkLT5kcml2ZXJfZGF0YTsKIAlpZiAoZGF0YS0+a2luZCA9PSBhZG0xMDMyKSB7CiAJCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURSkpCi0JCQluZXdfY2xpZW50LT5mbGFncyAmPSB+STJDX0NMSUVOVF9QRUM7CisJCQljbGllbnQtPmZsYWdzICY9IH5JMkNfQ0xJRU5UX1BFQzsKIAl9CiAKIAkvKiBEaWZmZXJlbnQgZGV2aWNlcyBoYXZlIGRpZmZlcmVudCBhbGFybSBiaXRzIHRyaWdnZXJpbmcgdGhlCkBAIC0xMzk2LDQzICsxMzk0LDQxIEBACiAJZGF0YS0+bWF4X2NvbnZyYXRlID0gbG05MF9wYXJhbXNbZGF0YS0+a2luZF0ubWF4X2NvbnZyYXRlOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgTE05MCBjaGlwICovCi0JbG05MF9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKwlsbTkwX2luaXRfY2xpZW50KGNsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZsbTkwX2dyb3VwKTsKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmxtOTBfZ3JvdXApOwogCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9mcmVlOwotCWlmIChuZXdfY2xpZW50LT5mbGFncyAmIEkyQ19DTElFTlRfUEVDKSB7Ci0JCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcGVjKTsKKwlpZiAoY2xpZW50LT5mbGFncyAmIEkyQ19DTElFTlRfUEVDKSB7CisJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9wZWMpOwogCQlpZiAoZXJyKQogCQkJZ290byBleGl0X3JlbW92ZV9maWxlczsKIAl9CiAJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX09GRlNFVCkgewotCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCQkJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9vZmZzZXQuZGV2X2F0dHIpOwogCQlpZiAoZXJyKQogCQkJZ290byBleGl0X3JlbW92ZV9maWxlczsKIAl9CiAJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX0VNRVJHRU5DWSkgewotCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLAotCQkJCQkgJmxtOTBfZW1lcmdlbmN5X2dyb3VwKTsKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZsbTkwX2VtZXJnZW5jeV9ncm91cCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwogCX0KIAlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfRU1FUkdFTkNZX0FMQVJNKSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosCisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLAogCQkJCQkgJmxtOTBfZW1lcmdlbmN5X2FsYXJtX2dyb3VwKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CiAJfQogCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9URU1QMykgewotCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLAotCQkJCQkgJmxtOTBfdGVtcDNfZ3JvdXApOworCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmxtOTBfdGVtcDNfZ3JvdXApOwogCQlpZiAoZXJyKQogCQkJZ290byBleGl0X3JlbW92ZV9maWxlczsKIAl9CiAKLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRldik7CiAJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CiAJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKIAkJZ290byBleGl0X3JlbW92ZV9maWxlczsKQEAgLTE0NDEsNyArMTQzNyw3IEBACiAJcmV0dXJuIDA7CiAKIGV4aXRfcmVtb3ZlX2ZpbGVzOgotCWxtOTBfcmVtb3ZlX2ZpbGVzKG5ld19jbGllbnQsIGRhdGEpOworCWxtOTBfcmVtb3ZlX2ZpbGVzKGNsaWVudCwgZGF0YSk7CiBleGl0X2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTkyLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTIuYwppbmRleCA3YzMxZTYyLi44ZmNiZDRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTkyLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTkyLmMKQEAgLTExNywxNiArMTE3LDE2IEBACiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopCiAJIHx8ICFkYXRhLT52YWxpZCkgewogCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVwZGF0aW5nIGxtOTIgZGF0YVxuIik7Ci0JCWRhdGEtPnRlbXAxX2lucHV0ID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsCi0JCQkJICAgIExNOTJfUkVHX1RFTVApKTsKLQkJZGF0YS0+dGVtcDFfaHlzdCA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAotCQkJCSAgICBMTTkyX1JFR19URU1QX0hZU1QpKTsKLQkJZGF0YS0+dGVtcDFfY3JpdCA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAotCQkJCSAgICBMTTkyX1JFR19URU1QX0NSSVQpKTsKLQkJZGF0YS0+dGVtcDFfbWluID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsCi0JCQkJICAgIExNOTJfUkVHX1RFTVBfTE9XKSk7Ci0JCWRhdGEtPnRlbXAxX21heCA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAotCQkJCSAgICBMTTkyX1JFR19URU1QX0hJR0gpKTsKKwkJZGF0YS0+dGVtcDFfaW5wdXQgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QKTsKKwkJZGF0YS0+dGVtcDFfaHlzdCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJICAgIExNOTJfUkVHX1RFTVBfSFlTVCk7CisJCWRhdGEtPnRlbXAxX2NyaXQgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QX0NSSVQpOworCQlkYXRhLT50ZW1wMV9taW4gPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QX0xPVyk7CisJCWRhdGEtPnRlbXAxX21heCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJICAgIExNOTJfUkVHX1RFTVBfSElHSCk7CiAKIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKIAkJZGF0YS0+dmFsaWQgPSAxOwpAQCAtMTU4LDcgKzE1OCw3IEBACiAgXAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAogCWRhdGEtPnZhbHVlID0gVEVNUF9UT19SRUcodmFsKTsgXAotCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNihkYXRhLT52YWx1ZSkpOyBcCisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOyBcCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKIAlyZXR1cm4gY291bnQ7IFwKIH0KQEAgLTE5NCw4ICsxOTQsOCBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPnRlbXAxX2h5c3QgPSBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXAxX2NyaXQpIC0gdmFsOwotCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBMTTkyX1JFR19URU1QX0hZU1QsCi0JCQkJICBzd2FiMTYoVEVNUF9UT19SRUcoZGF0YS0+dGVtcDFfaHlzdCkpKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgTE05Ml9SRUdfVEVNUF9IWVNULAorCQkJCSAgICAgVEVNUF9UT19SRUcoZGF0YS0+dGVtcDFfaHlzdCkpOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4MTYwNjUuYyBiL2RyaXZlcnMvaHdtb24vbWF4MTYwNjUuYwppbmRleCBkZDJkN2I5Li4zODU4ODZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDE2MDY1LmMKKysrIGIvZHJpdmVycy9od21vbi9tYXgxNjA2NS5jCkBAIC0xMzcsMTAgKzEzNywxMCBAQAogewogCWludCBydjsKIAotCXJ2ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKTsKKwlydiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIHJlZyk7CiAJaWYgKHVubGlrZWx5KHJ2IDwgMCkpCiAJCXJldHVybiBydjsKLQlyZXR1cm4gKChydiAmIDB4ZmYpIDw8IDIpIHwgKChydiA+PiAxNCkgJiAweDAzKTsKKwlyZXR1cm4gcnYgPj4gNjsKIH0KIAogc3RhdGljIHN0cnVjdCBtYXgxNjA2NV9kYXRhICptYXgxNjA2NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWMxMzc4My1hZGMuYyBiL2RyaXZlcnMvaHdtb24vbWMxMzc4My1hZGMuYwppbmRleCBkNTIyNmM5Li5lZjY1YWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21jMTM3ODMtYWRjLmMKKysrIGIvZHJpdmVycy9od21vbi9tYzEzNzgzLWFkYy5jCkBAIC0zMSw3ICszMSw3IEBACiAjZGVmaW5lIE1DMTM3ODNfQURDX05BTUUJIm1jMTM3ODMtYWRjIgogCiBzdHJ1Y3QgbWMxMzc4M19hZGNfcHJpdiB7Ci0Jc3RydWN0IG1jMTM3ODMgKm1jMTM3ODM7CisJc3RydWN0IG1jMTN4eHggKm1jMTN4eHg7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogfTsKIApAQCAtNTEsOCArNTEsOCBAQAogCXVuc2lnbmVkIGludCBzYW1wbGVbNF07CiAJaW50IHJldDsKIAotCXJldCA9IG1jMTM3ODNfYWRjX2RvX2NvbnZlcnNpb24ocHJpdi0+bWMxMzc4MywKLQkJCU1DMTM3ODNfQURDX01PREVfTVVMVF9DSEFOLAorCXJldCA9IG1jMTN4eHhfYWRjX2RvX2NvbnZlcnNpb24ocHJpdi0+bWMxM3h4eCwKKwkJCU1DMTNYWFhfQURDX01PREVfTVVMVF9DSEFOLAogCQkJY2hhbm5lbCwgc2FtcGxlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMTQ3LDkgKzE0Nyw5IEBACiBzdGF0aWMgaW50IG1jMTM3ODNfYWRjX3VzZV90b3VjaHNjcmVlbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtYzEzNzgzX2FkY19wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JdW5zaWduZWQgZmxhZ3MgPSBtYzEzNzgzX2dldF9mbGFncyhwcml2LT5tYzEzNzgzKTsKKwl1bnNpZ25lZCBmbGFncyA9IG1jMTN4eHhfZ2V0X2ZsYWdzKHByaXYtPm1jMTN4eHgpOwogCi0JcmV0dXJuIGZsYWdzICYgTUMxMzc4M19VU0VfVE9VQ0hTQ1JFRU47CisJcmV0dXJuIGZsYWdzICYgTUMxM1hYWF9VU0VfVE9VQ0hTQ1JFRU47CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IG1jMTM3ODNfYWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xNjEsNyArMTYxLDcgQEAKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcHJpdi0+bWMxMzc4MyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlwcml2LT5tYzEzeHh4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc2h0MjEuYyBiL2RyaXZlcnMvaHdtb24vc2h0MjEuYwppbmRleCAxYzhjOTgxLi4xNTM5ODc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NodDIxLmMKKysrIGIvZHJpdmVycy9od21vbi9zaHQyMS5jCkBAIC04MywyNSArODMsNiBAQAogfQogCiAvKioKLSAqIHNodDIxX3JlYWRfd29yZF9kYXRhKCkgLSByZWFkIHdvcmQgZnJvbSByZWdpc3RlcgotICogQGNsaWVudDogSTJDIGNsaWVudCBkZXZpY2UKLSAqIEByZWc6IEkyQyBjb21tYW5kIGJ5dGUKLSAqCi0gKiBSZXR1cm5zIHZhbHVlLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgc2h0MjFfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQotewotCWludCByZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCS8qCi0JICogU01CdXMgc3BlY2lmaWVzIGxvdyBieXRlIGZpcnN0LCBidXQgdGhlIFNIVDIxIHJldHVybnMgTVNCCi0JICogZmlyc3QsIHNvIHdlIGhhdmUgdG8gc3dhYjE2IHRoZSB2YWx1ZXMKLQkgKi8KLQlyZXR1cm4gc3dhYjE2KHJldCk7Ci19Ci0KLS8qKgogICogc2h0MjFfdXBkYXRlX21lYXN1cmVtZW50cygpIC0gZ2V0IHVwZGF0ZWQgbWVhc3VyZW1lbnRzIGZyb20gZGV2aWNlCiAgKiBAY2xpZW50OiBJMkMgY2xpZW50IGRldmljZQogICoKQEAgLTExOSwxMiArMTAwLDEzIEBACiAJICogbWF4aW11bSB0d28gbWVhc3VyZW1lbnRzIHBlciBzZWNvbmQgYXQgMTJiaXQgYWNjdXJhY3kgc2hhbGwgYmUgbWFkZS4KIAkgKi8KIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzaHQyMS0+bGFzdF91cGRhdGUgKyBIWiAvIDIpIHx8ICFzaHQyMS0+dmFsaWQpIHsKLQkJcmV0ID0gc2h0MjFfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBTSFQyMV9UUklHX1RfTUVBU1VSRU1FTlRfSE0pOworCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCQkJICBTSFQyMV9UUklHX1RfTUVBU1VSRU1FTlRfSE0pOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwogCQlzaHQyMS0+dGVtcGVyYXR1cmUgPSBzaHQyMV90ZW1wX3RpY2tzX3RvX21pbGxpY2Vsc2l1cyhyZXQpOwotCQlyZXQgPSBzaHQyMV9yZWFkX3dvcmRfZGF0YShjbGllbnQsCi0JCQkJCVNIVDIxX1RSSUdfUkhfTUVBU1VSRU1FTlRfSE0pOworCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCQkJICBTSFQyMV9UUklHX1JIX01FQVNVUkVNRU5UX0hNKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAkJc2h0MjEtPmh1bWlkaXR5ID0gc2h0MjFfcmhfdGlja3NfdG9fcGVyX2NlbnRfbWlsbGUocmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21tNjY1LmMgYi9kcml2ZXJzL2h3bW9uL3NtbTY2NS5jCmluZGV4IDQyNWRmNWJjLi40MTE2MzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NtbTY2NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21tNjY1LmMKQEAgLTIxNCwzMyArMjE0LDI2IEBACiAJICoKIAkgKiBOZWl0aGVyIGkyY19zbWJ1c19yZWFkX2J5dGUoKSBub3IKIAkgKiBpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKCkgd29ya2VkIGhlcmUsCi0JICogc28gdXNlIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YSgpIGluc3RlYWQuCisJICogc28gdXNlIGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZCgpIGluc3RlYWQuCiAJICogV2UgY291bGQgYWxzbyB0cnkgdG8gdXNlIGkyY19tYXN0ZXJfcmVjdigpLAogCSAqIGJ1dCB0aGF0IGlzIG5vdCBhbHdheXMgc3VwcG9ydGVkLgogCSAqLwotCXJ2ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCk7CisJcnYgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCAwKTsKIAlpZiAocnYgPCAwKSB7CiAJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgQURDIHZhbHVlOiBlcnJvciAlZCIsIHJ2KTsKIAkJcmV0dXJuIC0xOwogCX0KIAkvKgogCSAqIFZhbGlkYXRlL3ZlcmlmeSByZWFkYmFjayBhZGMgY2hhbm5lbCAoaW4gYml0IDExLi4xNCkuCi0JICogSGlnaCBieXRlIGlzIGluIGxvd2VyIDggYml0IG9mIHJ2LCBzbyBvbmx5IHNoaWZ0IGJ5IDMuCiAJICovCi0JcmFkYyA9IChydiA+PiAzKSAmIDB4MGY7CisJcmFkYyA9IChydiA+PiAxMSkgJiAweDBmOwogCWlmIChyYWRjICE9IGFkYykgewogCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVuZXhwZWN0ZWQgUkFEQzogRXhwZWN0ZWQgJWQgZ290ICVkIiwKIAkJCWFkYywgcmFkYyk7CiAJCXJldHVybiAtRUlPOwogCX0KLQkvKgotCSAqIENoaXAgcmVwbGllcyB3aXRoIEgvTCwgd2hpbGUgU01CdXMgZXhwZWN0cyBML0guCi0JICogVGh1cywgYnl0ZSBvcmRlciBpcyByZXZlcnNlZCwgYW5kIHdlIGhhdmUgdG8gc3dhcAotCSAqIHRoZSByZXN1bHQuCi0JICovCi0JcnYgPSBzd2FiMTYocnYpICYgU01NNjY1X0FEQ19NQVNLOwogCi0JcmV0dXJuIHJ2OworCXJldHVybiBydiAmIFNNTTY2NV9BRENfTUFTSzsKIH0KIAogc3RhdGljIHN0cnVjdCBzbW02NjVfZGF0YSAqc21tNjY1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwppbmRleCA5ZmI3NTE2Li42NWM4OGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYworKysgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJdTggdGVtcFs0XTsKIH07CiAKLXN0YXRpYyBpbnQgc21zYzQ3YjM5N19yZWFkX3ZhbHVlKHN0cnVjdCBzbXNjNDdiMzk3X2RhdGEqIGRhdGEsIHU4IHJlZykKK3N0YXRpYyBpbnQgc21zYzQ3YjM5N19yZWFkX3ZhbHVlKHN0cnVjdCBzbXNjNDdiMzk3X2RhdGEgKmRhdGEsIHU4IHJlZykKIHsKIAlpbnQgcmVzOwogCkBAIC0yNjUsNyArMjY1LDggQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlpZiAoIShkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNtc2M0N2IzOTdfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc21zYzQ3YjM5N19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfcmVsZWFzZTsKIAl9CkBAIC0yNzYsNyArMjc3LDggQEAKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CiAKLQlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmc21zYzQ3YjM5N19ncm91cCkpKQorCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmc21zYzQ3YjM5N19ncm91cCk7CisJaWYgKGVycikKIAkJZ290byBlcnJvcl9mcmVlOwogCiAJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRldik7CkBAIC0zNDUsNyArMzQ3LDcgQEAKIAlzdXBlcmlvX2VudGVyKCk7CiAJaWQgPSBmb3JjZV9pZCA/IGZvcmNlX2lkIDogc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfREVWSUQpOwogCi0Jc3dpdGNoKGlkKSB7CisJc3dpdGNoIChpZCkgewogCWNhc2UgMHg4MToKIAkJbmFtZSA9ICJTQ0g1MzA3LU5TIjsKIAkJYnJlYWs7CkBAIC0zNzksNyArMzgxLDggQEAKIAl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzOwogCWludCByZXQ7CiAKLQlpZiAoKHJldCA9IHNtc2M0N2IzOTdfZmluZCgmYWRkcmVzcykpKQorCXJldCA9IHNtc2M0N2IzOTdfZmluZCgmYWRkcmVzcyk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc21zYzQ3YjM5N19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi90bXAxMDIuYyBiL2RyaXZlcnMvaHdtb24vdG1wMTAyLmMKaW5kZXggNWJkMTk0OTYuLjY0M2FhOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdG1wMTAyLmMKKysrIGIvZHJpdmVycy9od21vbi90bXAxMDIuYwpAQCAtNTUsMTkgKzU1LDYgQEAKIAlpbnQgdGVtcFszXTsKIH07CiAKLS8qIFNNQnVzIHNwZWNpZmllcyBsb3cgYnl0ZSBmaXJzdCwgYnV0IHRoZSBUTVAxMDIgcmV0dXJucyBoaWdoIGJ5dGUgZmlyc3QsCi0gKiBzbyB3ZSBoYXZlIHRvIHN3YWIxNiB0aGUgdmFsdWVzICovCi1zdGF0aWMgaW5saW5lIGludCB0bXAxMDJfcmVhZF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQotewotCWludCByZXN1bHQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOwotCXJldHVybiByZXN1bHQgPCAwID8gcmVzdWx0IDogc3dhYjE2KHJlc3VsdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRtcDEwMl93cml0ZV9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsKQotewotCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsKSk7Ci19Ci0KIC8qIGNvbnZlcnQgbGVmdCBhZGp1c3RlZCAxMy1iaXQgVE1QMTAyIHJlZ2lzdGVyIHZhbHVlIHRvIG1pbGxpQ2Vsc2l1cyAqLwogc3RhdGljIGlubGluZSBpbnQgdG1wMTAyX3JlZ190b19tQyhzMTYgdmFsKQogewpAQCAtOTQsNyArODEsOCBAQAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtcDEwMi0+bGFzdF91cGRhdGUgKyBIWiAvIDMpKSB7CiAJCWludCBpOwogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0bXAxMDItPnRlbXApOyArK2kpIHsKLQkJCWludCBzdGF0dXMgPSB0bXAxMDJfcmVhZF9yZWcoY2xpZW50LCB0bXAxMDJfcmVnW2ldKTsKKwkJCWludCBzdGF0dXMgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCQkJCQkgdG1wMTAyX3JlZ1tpXSk7CiAJCQlpZiAoc3RhdHVzID4gLTEpCiAJCQkJdG1wMTAyLT50ZW1wW2ldID0gdG1wMTAyX3JlZ190b19tQyhzdGF0dXMpOwogCQl9CkBAIC0xMzAsOCArMTE4LDggQEAKIAogCW11dGV4X2xvY2soJnRtcDEwMi0+bG9jayk7CiAJdG1wMTAyLT50ZW1wW3NkYS0+aW5kZXhdID0gdmFsOwotCXN0YXR1cyA9IHRtcDEwMl93cml0ZV9yZWcoY2xpZW50LCB0bXAxMDJfcmVnW3NkYS0+aW5kZXhdLAotCQkJCSAgdG1wMTAyX21DX3RvX3JlZyh2YWwpKTsKKwlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgdG1wMTAyX3JlZ1tzZGEtPmluZGV4XSwKKwkJCQkJICAgICAgdG1wMTAyX21DX3RvX3JlZyh2YWwpKTsKIAltdXRleF91bmxvY2soJnRtcDEwMi0+bG9jayk7CiAJcmV0dXJuIHN0YXR1cyA/IDogY291bnQ7CiB9CkBAIC0xNzgsMTggKzE2NiwxOSBAQAogCX0KIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0bXAxMDIpOwogCi0Jc3RhdHVzID0gdG1wMTAyX3JlYWRfcmVnKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHKTsKKwlzdGF0dXMgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZXJyb3IgcmVhZGluZyBjb25maWcgcmVnaXN0ZXJcbiIpOwogCQlnb3RvIGZhaWxfZnJlZTsKIAl9CiAJdG1wMTAyLT5jb25maWdfb3JpZyA9IHN0YXR1czsKLQlzdGF0dXMgPSB0bXAxMDJfd3JpdGVfcmVnKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHLCBUTVAxMDJfQ09ORklHKTsKKwlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHLAorCQkJCQkgICAgICBUTVAxMDJfQ09ORklHKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImVycm9yIHdyaXRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKIAkJZ290byBmYWlsX3Jlc3RvcmVfY29uZmlnOwogCX0KLQlzdGF0dXMgPSB0bXAxMDJfcmVhZF9yZWcoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcpOworCXN0YXR1cyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIFRNUDEwMl9DT05GX1JFRyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJlcnJvciByZWFkaW5nIGNvbmZpZyByZWdpc3RlclxuIik7CiAJCWdvdG8gZmFpbF9yZXN0b3JlX2NvbmZpZzsKQEAgLTIyMiw3ICsyMTEsOCBAQAogZmFpbF9yZW1vdmVfc3lzZnM6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmdG1wMTAyX2F0dHJfZ3JvdXApOwogZmFpbF9yZXN0b3JlX2NvbmZpZzoKLQl0bXAxMDJfd3JpdGVfcmVnKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHLCB0bXAxMDItPmNvbmZpZ19vcmlnKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHLAorCQkJCSAgICAgdG1wMTAyLT5jb25maWdfb3JpZyk7CiBmYWlsX2ZyZWU6CiAJa2ZyZWUodG1wMTAyKTsKIApAQCAtMjQwLDEwICsyMzAsMTAgQEAKIAlpZiAodG1wMTAyLT5jb25maWdfb3JpZyAmIFRNUDEwMl9DT05GX1NEKSB7CiAJCWludCBjb25maWc7CiAKLQkJY29uZmlnID0gdG1wMTAyX3JlYWRfcmVnKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHKTsKKwkJY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHKTsKIAkJaWYgKGNvbmZpZyA+PSAwKQotCQkJdG1wMTAyX3dyaXRlX3JlZyhjbGllbnQsIFRNUDEwMl9DT05GX1JFRywKLQkJCQkJIGNvbmZpZyB8IFRNUDEwMl9DT05GX1NEKTsKKwkJCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcsCisJCQkJCQkgICAgIGNvbmZpZyB8IFRNUDEwMl9DT05GX1NEKTsKIAl9CiAKIAlrZnJlZSh0bXAxMDIpOwpAQCAtMjU3LDEyICsyNDcsMTIgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCWludCBjb25maWc7CiAKLQljb25maWcgPSB0bXAxMDJfcmVhZF9yZWcoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcpOworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIFRNUDEwMl9DT05GX1JFRyk7CiAJaWYgKGNvbmZpZyA8IDApCiAJCXJldHVybiBjb25maWc7CiAKIAljb25maWcgfD0gVE1QMTAyX0NPTkZfU0Q7Ci0JcmV0dXJuIHRtcDEwMl93cml0ZV9yZWcoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcsIGNvbmZpZyk7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcsIGNvbmZpZyk7CiB9CiAKIHN0YXRpYyBpbnQgdG1wMTAyX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0yNzAsMTIgKzI2MCwxMiBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJaW50IGNvbmZpZzsKIAotCWNvbmZpZyA9IHRtcDEwMl9yZWFkX3JlZyhjbGllbnQsIFRNUDEwMl9DT05GX1JFRyk7CisJY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHKTsKIAlpZiAoY29uZmlnIDwgMCkKIAkJcmV0dXJuIGNvbmZpZzsKIAogCWNvbmZpZyAmPSB+VE1QMTAyX0NPTkZfU0Q7Ci0JcmV0dXJuIHRtcDEwMl93cml0ZV9yZWcoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcsIGNvbmZpZyk7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcsIGNvbmZpZyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB0bXAxMDJfZGV2X3BtX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdWx0cmE0NV9lbnYuYyBiL2RyaXZlcnMvaHdtb24vdWx0cmE0NV9lbnYuYwppbmRleCAyN2E2MjcxLi4zY2QwN2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3VsdHJhNDVfZW52LmMKKysrIGIvZHJpdmVycy9od21vbi91bHRyYTQ1X2Vudi5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCmluZGV4IDk4YWFiNGIuLjkzZjVmYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgICAgdzgzNjI3ZWhmIC0gRHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZyBmdW5jdGlvbmFsaXR5IG9mCiAJCXRoZSBXaW5ib25kIFc4MzYyN0VIRiBTdXBlci1JL08gY2hpcAotICAgIENvcHlyaWdodCAoQykgMjAwNSAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTEgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgogICAgIENvcHlyaWdodCAoQykgMjAwNiAgWXVhbiBNdSAoV2luYm9uZCksCiAJCQlSdWRvbGYgTWFyZWsgPHIubWFyZWtAYXNzZW1ibGVyLmN6PgogCQkJRGF2aWQgSHViYmFyZCA8ZGF2aWQuYy5odWJiYXJkQGdtYWlsLmNvbT4KQEAgLTM5LDYgKzM5LDcgQEAKIAkJCQkJICAgICAgIDB4ODg2MCAweGExCiAgICAgdzgzNjI3ZGhnICAgIDkgICAgICA1ICAgICAgIDQgICAgICAgMyAgICAgIDB4YTAyMCAweGMxICAgIDB4NWNhMwogICAgIHc4MzYyN2RoZy1wICA5ICAgICAgNSAgICAgICA0ICAgICAgIDMgICAgICAweGIwNzAgMHhjMSAgICAweDVjYTMKKyAgICB3ODM2Mjd1aGcgICAgOCAgICAgIDIgICAgICAgMiAgICAgICAyICAgICAgMHhhMjMwIDB4YzEgICAgMHg1Y2EzCiAgICAgdzgzNjY3aGcgICAgIDkgICAgICA1ICAgICAgIDMgICAgICAgMyAgICAgIDB4YTUxMCAweGMxICAgIDB4NWNhMwogICAgIHc4MzY2N2hnLWIgICA5ICAgICAgNSAgICAgICAzICAgICAgIDQgICAgICAweGIzNTAgMHhjMSAgICAweDVjYTMKICAgICBuY3Q2Nzc1ZiAgICAgOSAgICAgIDQgICAgICAgMyAgICAgICA5ICAgICAgMHhiNDcwIDB4YzEgICAgMHg1Y2EzCkBAIC02MSwxNCArNjIsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgImxtNzUuaCIKIAotZW51bSBraW5kcyB7IHc4MzYyN2VoZiwgdzgzNjI3ZGhnLCB3ODM2MjdkaGdfcCwgdzgzNjY3aGcsIHc4MzY2N2hnX2IsIG5jdDY3NzUsCi0JbmN0Njc3NiB9OworZW51bSBraW5kcyB7CisJdzgzNjI3ZWhmLCB3ODM2MjdkaGcsIHc4MzYyN2RoZ19wLCB3ODM2Mjd1aGcsCisJdzgzNjY3aGcsIHc4MzY2N2hnX2IsIG5jdDY3NzUsIG5jdDY3NzYsCit9OwogCiAvKiB1c2VkIHRvIHNldCBkYXRhLT5uYW1lID0gdzgzNjI3ZWhmX2RldmljZV9uYW1lc1tkYXRhLT5zaW9fa2luZF0gKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdzgzNjI3ZWhmX2RldmljZV9uYW1lc1tdID0gewogCSJ3ODM2MjdlaGYiLAogCSJ3ODM2MjdkaGciLAogCSJ3ODM2MjdkaGciLAorCSJ3ODM2Mjd1aGciLAogCSJ3ODM2NjdoZyIsCiAJInc4MzY2N2hnIiwKIAkibmN0Njc3NSIsCkBAIC0xMDQsNiArMTA4LDcgQEAKICNkZWZpbmUgU0lPX1c4MzYyN0VIR19JRAkweDg4NjAKICNkZWZpbmUgU0lPX1c4MzYyN0RIR19JRAkweGEwMjAKICNkZWZpbmUgU0lPX1c4MzYyN0RIR19QX0lECTB4YjA3MAorI2RlZmluZSBTSU9fVzgzNjI3VUhHX0lECTB4YTIzMAogI2RlZmluZSBTSU9fVzgzNjY3SEdfSUQJCTB4YTUxMAogI2RlZmluZSBTSU9fVzgzNjY3SEdfQl9JRAkweGIzNTAKICNkZWZpbmUgU0lPX05DVDY3NzVfSUQJCTB4YjQ3MApAQCAtMzg4LDE4ICszOTMsMjMgQEAKIAlyZXR1cm4gMSA8PCByZWc7CiB9CiAKLS8qIFNvbWUgb2YgYW5hbG9nIGlucHV0cyBoYXZlIGludGVybmFsIHNjYWxpbmcgKDJ4KSwgOG1WIGlzIEFEQyBMU0IgKi8KKy8qIFNvbWUgb2YgdGhlIHZvbHRhZ2UgaW5wdXRzIGhhdmUgaW50ZXJuYWwgc2NhbGluZywgdGhlIHRhYmxlcyBiZWxvdworICogY29udGFpbiA4ICh0aGUgQURDIExTQiBpbiBtVikgKiBzY2FsaW5nIGZhY3RvciAqIDEwMCAqLworc3RhdGljIGNvbnN0IHUxNiBzY2FsZV9pbl9jb21tb25bMTBdID0geworCTgwMCwgODAwLCAxNjAwLCAxNjAwLCA4MDAsIDgwMCwgODAwLCAxNjAwLCAxNjAwLCA4MDAKK307CitzdGF0aWMgY29uc3QgdTE2IHNjYWxlX2luX3c4MzYyN3VoZ1s5XSA9IHsKKwk4MDAsIDgwMCwgMzMyOCwgMzQyNCwgODAwLCA4MDAsIDAsIDMzMjgsIDM0MDAKK307CiAKLXN0YXRpYyB1OCBzY2FsZV9pblsxMF0gPSB7IDgsIDgsIDE2LCAxNiwgOCwgOCwgOCwgMTYsIDE2LCA4IH07Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBpbl9mcm9tX3JlZyh1OCByZWcsIHU4IG5yKQorc3RhdGljIGlubGluZSBsb25nIGluX2Zyb21fcmVnKHU4IHJlZywgdTggbnIsIGNvbnN0IHUxNiAqc2NhbGVfaW4pCiB7Ci0JcmV0dXJuIHJlZyAqIHNjYWxlX2luW25yXTsKKwlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QocmVnICogc2NhbGVfaW5bbnJdLCAxMDApOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IGluX3RvX3JlZyh1MzIgdmFsLCB1OCBucikKK3N0YXRpYyBpbmxpbmUgdTggaW5fdG9fcmVnKHUzMiB2YWwsIHU4IG5yLCBjb25zdCB1MTYgKnNjYWxlX2luKQogewotCXJldHVybiBTRU5TT1JTX0xJTUlUKCgodmFsICsgKHNjYWxlX2luW25yXSAvIDIpKSAvIHNjYWxlX2luW25yXSksIDAsCisJcmV0dXJuIFNFTlNPUlNfTElNSVQoRElWX1JPVU5EX0NMT1NFU1QodmFsICogMTAwLCBzY2FsZV9pbltucl0pLCAwLAogCQkJICAgICAyNTUpOwogfQogCkBAIC00MzAsNiArNDQwLDcgQEAKIAljb25zdCB1MTYgKlJFR19GQU5fU1RPUF9USU1FOwogCWNvbnN0IHUxNiAqUkVHX0ZBTl9NQVhfT1VUUFVUOwogCWNvbnN0IHUxNiAqUkVHX0ZBTl9TVEVQX09VVFBVVDsKKwljb25zdCB1MTYgKnNjYWxlX2luOwogCiAJdW5zaWduZWQgaW50ICgqZmFuX2Zyb21fcmVnKSh1MTYgcmVnLCB1bnNpZ25lZCBpbnQgZGl2cmVnKTsKIAl1bnNpZ25lZCBpbnQgKCpmYW5fZnJvbV9yZWdfbWluKSh1MTYgcmVnLCB1bnNpZ25lZCBpbnQgZGl2cmVnKTsKQEAgLTQ4MSw3ICs0OTIsOCBAQAogCXU4IHZybTsKIAogCXUxNiBoYXZlX3RlbXA7Ci0JdTggaW42X3NraXA7CisJdTggaW42X3NraXA6MTsKKwl1OCB0ZW1wM192YWxfb25seToxOwogfTsKIAogc3RydWN0IHc4MzYyN2VoZl9zaW9fZGF0YSB7CkBAIC05MDcsNyArOTE5LDggQEAKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gXAogCQl0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7IFwKIAlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGluX2Zyb21fcmVnKGRhdGEtPnJlZ1tucl0sIG5yKSk7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGluX2Zyb21fcmVnKGRhdGEtPnJlZ1tucl0sIG5yLCBcCisJCSAgICAgICBkYXRhLT5zY2FsZV9pbikpOyBcCiB9CiBzaG93X2luX3JlZyhpbikKIHNob3dfaW5fcmVnKGluX21pbikKQEAgLTkyOCw3ICs5NDEsNyBAQAogCWlmIChlcnIgPCAwKSBcCiAJCXJldHVybiBlcnI7IFwKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLQlkYXRhLT5pbl8jI3JlZ1tucl0gPSBpbl90b19yZWcodmFsLCBucik7IFwKKwlkYXRhLT5pbl8jI3JlZ1tucl0gPSBpbl90b19yZWcodmFsLCBuciwgZGF0YS0+c2NhbGVfaW4pOyBcCiAJdzgzNjI3ZWhmX3dyaXRlX3ZhbHVlKGRhdGEsIFc4MzYyN0VIRl9SRUdfSU5fIyNSRUcobnIpLCBcCiAJCQkgICAgICBkYXRhLT5pbl8jI3JlZ1tucl0pOyBcCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKQEAgLTE2MTcsMjUgKzE2MzAsMjggQEAKIAkJICAgIHN0b3JlX2Zhbl9zdGVwX291dHB1dCwgMyksCiB9OwogCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNkYV9zZjNfYXJyYXlzX2ZhbjNbXSA9IHsKKwlTRU5TT1JfQVRUUihwd20zX3N0b3BfdGltZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX3N0b3BfdGltZSwKKwkJICAgIHN0b3JlX2Zhbl9zdG9wX3RpbWUsIDIpLAorCVNFTlNPUl9BVFRSKHB3bTNfc3RhcnRfb3V0cHV0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fc3RhcnRfb3V0cHV0LAorCQkgICAgc3RvcmVfZmFuX3N0YXJ0X291dHB1dCwgMiksCisJU0VOU09SX0FUVFIocHdtM19zdG9wX291dHB1dCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX3N0b3Bfb3V0cHV0LAorCQkgICAgc3RvcmVfZmFuX3N0b3Bfb3V0cHV0LCAyKSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX3NmM19hcnJheXNbXSA9IHsKIAlTRU5TT1JfQVRUUihwd20xX3N0b3BfdGltZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX3N0b3BfdGltZSwKIAkJICAgIHN0b3JlX2Zhbl9zdG9wX3RpbWUsIDApLAogCVNFTlNPUl9BVFRSKHB3bTJfc3RvcF90aW1lLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fc3RvcF90aW1lLAogCQkgICAgc3RvcmVfZmFuX3N0b3BfdGltZSwgMSksCi0JU0VOU09SX0FUVFIocHdtM19zdG9wX3RpbWUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9zdG9wX3RpbWUsCi0JCSAgICBzdG9yZV9mYW5fc3RvcF90aW1lLCAyKSwKIAlTRU5TT1JfQVRUUihwd20xX3N0YXJ0X291dHB1dCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX3N0YXJ0X291dHB1dCwKIAkJICAgIHN0b3JlX2Zhbl9zdGFydF9vdXRwdXQsIDApLAogCVNFTlNPUl9BVFRSKHB3bTJfc3RhcnRfb3V0cHV0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fc3RhcnRfb3V0cHV0LAogCQkgICAgc3RvcmVfZmFuX3N0YXJ0X291dHB1dCwgMSksCi0JU0VOU09SX0FUVFIocHdtM19zdGFydF9vdXRwdXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9zdGFydF9vdXRwdXQsCi0JCSAgICBzdG9yZV9mYW5fc3RhcnRfb3V0cHV0LCAyKSwKIAlTRU5TT1JfQVRUUihwd20xX3N0b3Bfb3V0cHV0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fc3RvcF9vdXRwdXQsCiAJCSAgICBzdG9yZV9mYW5fc3RvcF9vdXRwdXQsIDApLAogCVNFTlNPUl9BVFRSKHB3bTJfc3RvcF9vdXRwdXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9zdG9wX291dHB1dCwKIAkJICAgIHN0b3JlX2Zhbl9zdG9wX291dHB1dCwgMSksCi0JU0VOU09SX0FUVFIocHdtM19zdG9wX291dHB1dCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX3N0b3Bfb3V0cHV0LAotCQkgICAgc3RvcmVfZmFuX3N0b3Bfb3V0cHV0LCAyKSwKIH07CiAKIApAQCAtMTcyOCw2ICsxNzQ0LDggQEAKIAkJICAgIGRhdGEtPlJFR19GQU5fU1RFUF9PVVRQVVRbYXR0ci0+aW5kZXhdICE9IDB4ZmYpCiAJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmYXR0ci0+ZGV2X2F0dHIpOwogCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZGFfc2YzX2FycmF5c19mYW4zKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmc2RhX3NmM19hcnJheXNfZmFuM1tpXS5kZXZfYXR0cik7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2RhX3NmM19hcnJheXNfZmFuNCk7IGkrKykKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnNkYV9zZjNfYXJyYXlzX2ZhbjRbaV0uZGV2X2F0dHIpOwogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5pbl9udW07IGkrKykgewpAQCAtMTc1Niw2ICsxNzc0LDggQEAKIAkJCWNvbnRpbnVlOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmc2RhX3RlbXBfaW5wdXRbaV0uZGV2X2F0dHIpOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmc2RhX3RlbXBfbGFiZWxbaV0uZGV2X2F0dHIpOworCQlpZiAoaSA9PSAyICYmIGRhdGEtPnRlbXAzX3ZhbF9vbmx5KQorCQkJY29udGludWU7CiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZzZGFfdGVtcF9tYXhbaV0uZGV2X2F0dHIpOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmc2RhX3RlbXBfbWF4X2h5c3RbaV0uZGV2X2F0dHIpOwogCQlpZiAoaSA+IDIpCkBAIC0xODA4LDExICsxODI4LDI0IEBACiAJY2FzZSB3ODM2MjdlaGY6CiAJCWRpb2RlID0gdzgzNjI3ZWhmX3JlYWRfdmFsdWUoZGF0YSwgVzgzNjI3RUhGX1JFR19ESU9ERSk7CiAJCWJyZWFrOworCWNhc2UgdzgzNjI3dWhnOgorCQlkaW9kZSA9IDB4MDA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRpb2RlID0gMHg3MDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlpZiAoKHRtcCAmICgweDAyIDw8IGkpKSkKKwkJY29uc3QgY2hhciAqbGFiZWwgPSBOVUxMOworCisJCWlmIChkYXRhLT50ZW1wX2xhYmVsKQorCQkJbGFiZWwgPSBkYXRhLT50ZW1wX2xhYmVsW2RhdGEtPnRlbXBfc3JjW2ldXTsKKworCQkvKiBEaWdpdGFsIHNvdXJjZSBvdmVycmlkZXMgYW5hbG9nIHR5cGUgKi8KKwkJaWYgKGxhYmVsICYmIHN0cm5jbXAobGFiZWwsICJQRUNJIiwgNCkgPT0gMCkKKwkJCWRhdGEtPnRlbXBfdHlwZVtpXSA9IDY7CisJCWVsc2UgaWYgKGxhYmVsICYmIHN0cm5jbXAobGFiZWwsICJBTUQiLCAzKSA9PSAwKQorCQkJZGF0YS0+dGVtcF90eXBlW2ldID0gNTsKKwkJZWxzZSBpZiAoKHRtcCAmICgweDAyIDw8IGkpKSkKIAkJCWRhdGEtPnRlbXBfdHlwZVtpXSA9IChkaW9kZSAmICgweDEwIDw8IGkpKSA/IDEgOiAzOwogCQllbHNlCiAJCQlkYXRhLT50ZW1wX3R5cGVbaV0gPSA0OyAvKiB0aGVybWlzdG9yICovCkBAIC0xODQ2LDExICsxODc5LDMxIEBACiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdAordzgzNjI3ZWhmX3NldF90ZW1wX3JlZ19laGYoc3RydWN0IHc4MzYyN2VoZl9kYXRhICpkYXRhLCBpbnQgbl90ZW1wKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5fdGVtcDsgaSsrKSB7CisJCWRhdGEtPnJlZ190ZW1wW2ldID0gVzgzNjI3RUhGX1JFR19URU1QW2ldOworCQlkYXRhLT5yZWdfdGVtcF9vdmVyW2ldID0gVzgzNjI3RUhGX1JFR19URU1QX09WRVJbaV07CisJCWRhdGEtPnJlZ190ZW1wX2h5c3RbaV0gPSBXODM2MjdFSEZfUkVHX1RFTVBfSFlTVFtpXTsKKwkJZGF0YS0+cmVnX3RlbXBfY29uZmlnW2ldID0gVzgzNjI3RUhGX1JFR19URU1QX0NPTkZJR1tpXTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAogdzgzNjI3ZWhmX2NoZWNrX2Zhbl9pbnB1dHMoY29uc3Qgc3RydWN0IHc4MzYyN2VoZl9zaW9fZGF0YSAqc2lvX2RhdGEsCiAJCQkgICBzdHJ1Y3QgdzgzNjI3ZWhmX2RhdGEgKmRhdGEpCiB7CiAJaW50IGZhbjNwaW4sIGZhbjRwaW4sIGZhbjRtaW4sIGZhbjVwaW4sIHJlZ3ZhbDsKIAorCS8qIFRoZSBXODM2MjdVSEcgaXMgc2ltcGxlLCBvbmx5IHR3byBmYW4gaW5wdXRzLCBubyBjb25maWcgKi8KKwlpZiAoc2lvX2RhdGEtPmtpbmQgPT0gdzgzNjI3dWhnKSB7CisJCWRhdGEtPmhhc19mYW4gPSAweDAzOyAvKiBmYW4xIGFuZCBmYW4yICovCisJCWRhdGEtPmhhc19mYW5fbWluID0gMHgwMzsKKwkJcmV0dXJuOworCX0KKwogCXN1cGVyaW9fZW50ZXIoc2lvX2RhdGEtPnNpb3JlZyk7CiAKIAkvKiBmYW40IGFuZCBmYW41IHNoYXJlIHNvbWUgcGlucyB3aXRoIHRoZSBHUElPIGFuZCBzZXJpYWwgZmxhc2ggKi8KQEAgLTE5NDIsMjQgKzE5OTUsMjUgQEAKIAogCS8qIDYyN0VIRyBhbmQgNjI3RUhGIGhhdmUgMTAgdm9sdGFnZSBpbnB1dHM7IDYyN0RIRyBhbmQgNjY3SEcgaGF2ZSA5ICovCiAJZGF0YS0+aW5fbnVtID0gKHNpb19kYXRhLT5raW5kID09IHc4MzYyN2VoZikgPyAxMCA6IDk7Ci0JLyogNjY3SEcsIE5DVDY3NzVGLCBhbmQgTkNUNjc3NkYgaGF2ZSAzIHB3bXMgKi8KLQlkYXRhLT5wd21fbnVtID0gKHNpb19kYXRhLT5raW5kID09IHc4MzY2N2hnCi0JCQkgfHwgc2lvX2RhdGEtPmtpbmQgPT0gdzgzNjY3aGdfYgotCQkJIHx8IHNpb19kYXRhLT5raW5kID09IG5jdDY3NzUKLQkJCSB8fCBzaW9fZGF0YS0+a2luZCA9PSBuY3Q2Nzc2KSA/IDMgOiA0OwotCi0JZGF0YS0+aGF2ZV90ZW1wID0gMHgwNzsKLQkvKiBDaGVjayB0ZW1wMyBjb25maWd1cmF0aW9uIGJpdCBmb3IgNjY3SEcgKi8KLQlpZiAoc2lvX2RhdGEtPmtpbmQgPT0gdzgzNjY3aGcpIHsKLQkJdTggcmVnOwotCi0JCXJlZyA9IHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGRhdGEsIFc4MzYyN0VIRl9SRUdfVEVNUF9DT05GSUdbMl0pOwotCQlpZiAocmVnICYgMHgwMSkKLQkJCWRhdGEtPmhhdmVfdGVtcCAmPSB+KDEgPDwgMik7Ci0JCWVsc2UKLQkJCWRhdGEtPmluNl9za2lwID0gMTsJLyogZWl0aGVyIHRlbXAzIG9yIGluNiAqLworCS8qIDY2N0hHLCBOQ1Q2Nzc1RiwgYW5kIE5DVDY3NzZGIGhhdmUgMyBwd21zLCBhbmQgNjI3VUhHIGhhcyBvbmx5IDIgKi8KKwlzd2l0Y2ggKHNpb19kYXRhLT5raW5kKSB7CisJZGVmYXVsdDoKKwkJZGF0YS0+cHdtX251bSA9IDQ7CisJCWJyZWFrOworCWNhc2UgdzgzNjY3aGc6CisJY2FzZSB3ODM2NjdoZ19iOgorCWNhc2UgbmN0Njc3NToKKwljYXNlIG5jdDY3NzY6CisJCWRhdGEtPnB3bV9udW0gPSAzOworCQlicmVhazsKKwljYXNlIHc4MzYyN3VoZzoKKwkJZGF0YS0+cHdtX251bSA9IDI7CisJCWJyZWFrOwogCX0KIAorCS8qIERlZmF1bHQgdG8gMyB0ZW1wZXJhdHVyZSBpbnB1dHMsIGNvZGUgYmVsb3cgd2lsbCBhZGp1c3QgYXMgbmVlZGVkICovCisJZGF0YS0+aGF2ZV90ZW1wID0gMHgwNzsKKwogCS8qIERlYWwgd2l0aCB0ZW1wZXJhdHVyZSByZWdpc3RlciBzZXR1cCBmaXJzdC4gKi8KIAlpZiAoc2lvX2RhdGEtPmtpbmQgPT0gbmN0Njc3NSB8fCBzaW9fZGF0YS0+a2luZCA9PSBuY3Q2Nzc2KSB7CiAJCWludCBtYXNrID0gMDsKQEAgLTIwMzUsMTYgKzIwODksMTIgQEAKIAl9IGVsc2UgaWYgKHNpb19kYXRhLT5raW5kID09IHc4MzY2N2hnX2IpIHsKIAkJdTggcmVnOwogCisJCXc4MzYyN2VoZl9zZXRfdGVtcF9yZWdfZWhmKGRhdGEsIDQpOworCiAJCS8qCiAJCSAqIFRlbXBlcmF0dXJlIHNvdXJjZXMgYXJlIHNlbGVjdGVkIHdpdGggYmFuayAwLCByZWdpc3RlcnMgMHg0OQogCQkgKiBhbmQgMHg0YS4KIAkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFc4MzYyN0VIRl9SRUdfVEVNUCk7IGkrKykgewotCQkJZGF0YS0+cmVnX3RlbXBbaV0gPSBXODM2MjdFSEZfUkVHX1RFTVBbaV07Ci0JCQlkYXRhLT5yZWdfdGVtcF9vdmVyW2ldID0gVzgzNjI3RUhGX1JFR19URU1QX09WRVJbaV07Ci0JCQlkYXRhLT5yZWdfdGVtcF9oeXN0W2ldID0gVzgzNjI3RUhGX1JFR19URU1QX0hZU1RbaV07Ci0JCQlkYXRhLT5yZWdfdGVtcF9jb25maWdbaV0gPSBXODM2MjdFSEZfUkVHX1RFTVBfQ09ORklHW2ldOwotCQl9CiAJCXJlZyA9IHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGRhdGEsIDB4NGEpOwogCQlkYXRhLT50ZW1wX3NyY1swXSA9IHJlZyA+PiA1OwogCQlyZWcgPSB3ODM2MjdlaGZfcmVhZF92YWx1ZShkYXRhLCAweDQ5KTsKQEAgLTIwNzgsMTMgKzIxMjgsNjAgQEAKIAkJCWRhdGEtPmluNl9za2lwID0gMTsKIAogCQlkYXRhLT50ZW1wX2xhYmVsID0gdzgzNjY3aGdfYl90ZW1wX2xhYmVsOworCX0gZWxzZSBpZiAoc2lvX2RhdGEtPmtpbmQgPT0gdzgzNjI3dWhnKSB7CisJCXU4IHJlZzsKKworCQl3ODM2MjdlaGZfc2V0X3RlbXBfcmVnX2VoZihkYXRhLCAzKTsKKworCQkvKgorCQkgKiBUZW1wZXJhdHVyZSBzb3VyY2VzIGZvciB0ZW1wMSBhbmQgdGVtcDIgYXJlIHNlbGVjdGVkIHdpdGgKKwkJICogYmFuayAwLCByZWdpc3RlcnMgMHg0OSBhbmQgMHg0YS4KKwkJICovCisJCWRhdGEtPnRlbXBfc3JjWzBdID0gMDsJLyogU1lTVElOICovCisJCXJlZyA9IHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGRhdGEsIDB4NDkpICYgMHgwNzsKKwkJLyogQWRqdXN0IHRvIGhhdmUgdGhlIHNhbWUgbWFwcGluZyBhcyBvdGhlciBzb3VyY2UgcmVnaXN0ZXJzICovCisJCWlmIChyZWcgPT0gMCkKKwkJCWRhdGEtPnRlbXBfc3JjWzFdKys7CisJCWVsc2UgaWYgKHJlZyA+PSAyICYmIHJlZyA8PSA1KQorCQkJZGF0YS0+dGVtcF9zcmNbMV0gKz0gMjsKKwkJZWxzZQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQlkYXRhLT5oYXZlX3RlbXAgJj0gfigxIDw8IDEpOworCQlyZWcgPSB3ODM2MjdlaGZfcmVhZF92YWx1ZShkYXRhLCAweDRhKTsKKwkJZGF0YS0+dGVtcF9zcmNbMl0gPSByZWcgPj4gNTsKKworCQkvKgorCQkgKiBTa2lwIHRlbXAzIGlmIHNvdXJjZSBpcyBpbnZhbGlkIG9yIHRoZSBzYW1lIGFzIHRlbXAxCisJCSAqIG9yIHRlbXAyLgorCQkgKi8KKwkJaWYgKGRhdGEtPnRlbXBfc3JjWzJdID09IDIgfHwgZGF0YS0+dGVtcF9zcmNbMl0gPT0gMyB8fAorCQkgICAgZGF0YS0+dGVtcF9zcmNbMl0gPT0gZGF0YS0+dGVtcF9zcmNbMF0gfHwKKwkJICAgICgoZGF0YS0+aGF2ZV90ZW1wICYgKDEgPDwgMSkpICYmCisJCSAgICAgZGF0YS0+dGVtcF9zcmNbMl0gPT0gZGF0YS0+dGVtcF9zcmNbMV0pKQorCQkJZGF0YS0+aGF2ZV90ZW1wICY9IH4oMSA8PCAyKTsKKwkJZWxzZQorCQkJZGF0YS0+dGVtcDNfdmFsX29ubHkgPSAxOwkvKiBObyBsaW1pdCByZWdzICovCisKKwkJZGF0YS0+aW42X3NraXAgPSAxOwkJCS8qIE5vIFZJTjMgKi8KKworCQlkYXRhLT50ZW1wX2xhYmVsID0gdzgzNjY3aGdfYl90ZW1wX2xhYmVsOwogCX0gZWxzZSB7CisJCXc4MzYyN2VoZl9zZXRfdGVtcF9yZWdfZWhmKGRhdGEsIDMpOworCiAJCS8qIFRlbXBlcmF0dXJlIHNvdXJjZXMgYXJlIGZpeGVkICovCi0JCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWRhdGEtPnJlZ190ZW1wW2ldID0gVzgzNjI3RUhGX1JFR19URU1QW2ldOwotCQkJZGF0YS0+cmVnX3RlbXBfb3ZlcltpXSA9IFc4MzYyN0VIRl9SRUdfVEVNUF9PVkVSW2ldOwotCQkJZGF0YS0+cmVnX3RlbXBfaHlzdFtpXSA9IFc4MzYyN0VIRl9SRUdfVEVNUF9IWVNUW2ldOwotCQkJZGF0YS0+cmVnX3RlbXBfY29uZmlnW2ldID0gVzgzNjI3RUhGX1JFR19URU1QX0NPTkZJR1tpXTsKKworCQlpZiAoc2lvX2RhdGEtPmtpbmQgPT0gdzgzNjY3aGcpIHsKKwkJCXU4IHJlZzsKKworCQkJLyoKKwkJCSAqIENoaXAgc3VwcG9ydHMgZWl0aGVyIEFVWFRJTiBvciBWSU4zLiBUcnkgdG8gZmluZAorCQkJICogb3V0IHdoaWNoIG9uZS4KKwkJCSAqLworCQkJcmVnID0gdzgzNjI3ZWhmX3JlYWRfdmFsdWUoZGF0YSwKKwkJCQkJCVc4MzYyN0VIRl9SRUdfVEVNUF9DT05GSUdbMl0pOworCQkJaWYgKHJlZyAmIDB4MDEpCisJCQkJZGF0YS0+aGF2ZV90ZW1wICY9IH4oMSA8PCAyKTsKKwkJCWVsc2UKKwkJCQlkYXRhLT5pbjZfc2tpcCA9IDE7CiAJCX0KIAl9CiAKQEAgLTIxNDQsNiArMjI0MSwxMiBAQAogCQkgIFc4MzYyN0VIRl9SRUdfRkFOX1NURVBfT1VUUFVUX0NPTU1PTjsKIAl9CiAKKwkvKiBTZXR1cCBpbnB1dCB2b2x0YWdlIHNjYWxpbmcgZmFjdG9ycyAqLworCWlmIChzaW9fZGF0YS0+a2luZCA9PSB3ODM2Mjd1aGcpCisJCWRhdGEtPnNjYWxlX2luID0gc2NhbGVfaW5fdzgzNjI3dWhnOworCWVsc2UKKwkJZGF0YS0+c2NhbGVfaW4gPSBzY2FsZV9pbl9jb21tb247CisKIAkvKiBJbml0aWFsaXplIHRoZSBjaGlwICovCiAJdzgzNjI3ZWhmX2luaXRfZGV2aWNlKGRhdGEsIHNpb19kYXRhLT5raW5kKTsKIApAQCAtMjE2MCw3ICsyMjYzLDcgQEAKIAkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdF9yZWxlYXNlOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChzaW9fZGF0YS0+a2luZCAhPSB3ODM2Mjd1aGcpIHsKIAkJc3VwZXJpb19zZWxlY3Qoc2lvX2RhdGEtPnNpb3JlZywgVzgzNjI3RUhGX0xEX0hXTSk7CiAJCWlmIChzdXBlcmlvX2luYihzaW9fZGF0YS0+c2lvcmVnLCBTSU9fUkVHX1ZJRF9DVFJMKSAmIDB4ODApIHsKIAkJCS8qIFNldCBWSUQgaW5wdXQgc2Vuc2liaWxpdHkgaWYgbmVlZGVkLiBJbiB0aGVvcnkgdGhlCkBAIC0yMjUwLDcgKzIzNTMsMTQgQEAKIAkJCQlnb3RvIGV4aXRfcmVtb3ZlOwogCQl9CiAJfQotCS8qIGlmIGZhbjQgaXMgZW5hYmxlZCBjcmVhdGUgdGhlIHNmMyBmaWxlcyBmb3IgaXQgKi8KKwkvKiBpZiBmYW4zIGFuZCBmYW40IGFyZSBlbmFibGVkIGNyZWF0ZSB0aGUgc2YzIGZpbGVzIGZvciB0aGVtICovCisJaWYgKChkYXRhLT5oYXNfZmFuICYgKDEgPDwgMikpICYmIGRhdGEtPnB3bV9udW0gPj0gMykKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2RhX3NmM19hcnJheXNfZmFuMyk7IGkrKykgeworCQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkJJnNkYV9zZjNfYXJyYXlzX2ZhbjNbaV0uZGV2X2F0dHIpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGV4aXRfcmVtb3ZlOworCQl9CiAJaWYgKChkYXRhLT5oYXNfZmFuICYgKDEgPDwgMykpICYmIGRhdGEtPnB3bV9udW0gPj0gNCkKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2RhX3NmM19hcnJheXNfZmFuNCk7IGkrKykgewogCQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKQEAgLTIzMTgsNiArMjQyOCw4IEBACiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXhpdF9yZW1vdmU7CiAJCX0KKwkJaWYgKGkgPT0gMiAmJiBkYXRhLT50ZW1wM192YWxfb25seSkKKwkJCWNvbnRpbnVlOwogCQlpZiAoZGF0YS0+cmVnX3RlbXBfb3ZlcltpXSkgewogCQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCQkmc2RhX3RlbXBfbWF4W2ldLmRldl9hdHRyKTsKQEAgLTI0MDEsNiArMjUxMyw3IEBACiAJc3RhdGljIGNvbnN0IGNoYXIgX19pbml0ZGF0YSBzaW9fbmFtZV9XODM2MjdFSEdbXSA9ICJXODM2MjdFSEciOwogCXN0YXRpYyBjb25zdCBjaGFyIF9faW5pdGRhdGEgc2lvX25hbWVfVzgzNjI3REhHW10gPSAiVzgzNjI3REhHIjsKIAlzdGF0aWMgY29uc3QgY2hhciBfX2luaXRkYXRhIHNpb19uYW1lX1c4MzYyN0RIR19QW10gPSAiVzgzNjI3REhHLVAiOworCXN0YXRpYyBjb25zdCBjaGFyIF9faW5pdGRhdGEgc2lvX25hbWVfVzgzNjI3VUhHW10gPSAiVzgzNjI3VUhHIjsKIAlzdGF0aWMgY29uc3QgY2hhciBfX2luaXRkYXRhIHNpb19uYW1lX1c4MzY2N0hHW10gPSAiVzgzNjY3SEciOwogCXN0YXRpYyBjb25zdCBjaGFyIF9faW5pdGRhdGEgc2lvX25hbWVfVzgzNjY3SEdfQltdID0gIlc4MzY2N0hHLUIiOwogCXN0YXRpYyBjb25zdCBjaGFyIF9faW5pdGRhdGEgc2lvX25hbWVfTkNUNjc3NVtdID0gIk5DVDY3NzVGIjsKQEAgLTI0MzMsNiArMjU0NiwxMCBAQAogCQlzaW9fZGF0YS0+a2luZCA9IHc4MzYyN2RoZ19wOwogCQlzaW9fbmFtZSA9IHNpb19uYW1lX1c4MzYyN0RIR19QOwogCQlicmVhazsKKwljYXNlIFNJT19XODM2MjdVSEdfSUQ6CisJCXNpb19kYXRhLT5raW5kID0gdzgzNjI3dWhnOworCQlzaW9fbmFtZSA9IHNpb19uYW1lX1c4MzYyN1VIRzsKKwkJYnJlYWs7CiAJY2FzZSBTSU9fVzgzNjY3SEdfSUQ6CiAJCXNpb19kYXRhLT5raW5kID0gdzgzNjY3aGc7CiAJCXNpb19uYW1lID0gc2lvX25hbWVfVzgzNjY3SEc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmluZGV4IGVlZDQzYTAuLjY1YjY4NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCkBAIC0xMjQ1LDE3ICsxMjQ1LDE3IEBACiAJCS8qIGNvbnZlcnQgZnJvbSBJU0EgdG8gTE03NSBJMkMgYWRkcmVzc2VzICovCiAJCXN3aXRjaCAocmVnICYgMHhmZikgewogCQljYXNlIDB4NTA6CS8qIFRFTVAgKi8KLQkJCXJlcyA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2wsIDApKTsKKwkJCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbCwgMCk7CiAJCQlicmVhazsKIAkJY2FzZSAweDUyOgkvKiBDT05GSUcgKi8KIAkJCXJlcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbCwgMSk7CiAJCQlicmVhazsKIAkJY2FzZSAweDUzOgkvKiBIWVNUICovCi0JCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsLCAyKSk7CisJCQlyZXMgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2wsIDIpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg1NToJLyogT1ZFUiAqLwogCQlkZWZhdWx0OgotCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbCwgMykpOworCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsLCAzKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTI4OSwxMCArMTI4OSwxMCBAQAogCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbCwgMSwgdmFsdWUgJiAweGZmKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTM6CS8qIEhZU1QgKi8KLQkJCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2wsIDIsIHN3YWIxNih2YWx1ZSkpOworCQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbCwgMiwgdmFsdWUpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg1NToJLyogT1ZFUiAqLwotCQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbCwgMywgc3dhYjE2KHZhbHVlKSk7CisJCQlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsLCAzLCB2YWx1ZSk7CiAJCQlicmVhazsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdzcGlubG9jay9LY29uZmlnIGIvZHJpdmVycy9od3NwaW5sb2NrL0tjb25maWcKaW5kZXggMWYyOWJhYi4uYzdjMzEyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3NwaW5sb2NrL0tjb25maWcKKysrIGIvZHJpdmVycy9od3NwaW5sb2NrL0tjb25maWcKQEAgLTIsMjIgKzIsMzEgQEAKICMgR2VuZXJpYyBIV1NQSU5MT0NLIGZyYW1ld29yawogIwogCisjIEhXU1BJTkxPQ0sgYWx3YXlzIGdldHMgc2VsZWN0ZWQgYnkgd2hvZXZlciB3YW50cyBpdC4KIGNvbmZpZyBIV1NQSU5MT0NLCi0JdHJpc3RhdGUgIkdlbmVyaWMgSGFyZHdhcmUgU3BpbmxvY2sgZnJhbWV3b3JrIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQNAotCWhlbHAKLQkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCB0aGUgZ2VuZXJpYyBoYXJkd2FyZSBzcGlubG9jayBmcmFtZXdvcmsuCi0JICBZb3Ugb25seSBuZWVkIHRvIGVuYWJsZSB0aGlzIGlmIHlvdSBoYXZlIGhhcmR3YXJlIHNwaW5sb2NrIG1vZHVsZQotCSAgb24geW91ciBzeXN0ZW0gKHVzdWFsbHkgb25seSByZWxldmFudCBpZiB5b3VyIHN5c3RlbSBoYXMgcmVtb3RlIHNsYXZlCi0JICBjb3Byb2Nlc3NvcnMpLgorCXRyaXN0YXRlCiAKLQkgIElmIHVuc3VyZSwgc2F5IE4uCittZW51ICJIYXJkd2FyZSBTcGlubG9jayBkcml2ZXJzIgogCiBjb25maWcgSFdTUElOTE9DS19PTUFQCiAJdHJpc3RhdGUgIk9NQVAgSGFyZHdhcmUgU3BpbmxvY2sgZGV2aWNlIgotCWRlcGVuZHMgb24gSFdTUElOTE9DSyAmJiBBUkNIX09NQVA0CisJZGVwZW5kcyBvbiBBUkNIX09NQVA0CisJc2VsZWN0IEhXU1BJTkxPQ0sKIAloZWxwCiAJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgdGhlIE9NQVAgSGFyZHdhcmUgU3BpbmxvY2sgZGV2aWNlIChmaXJzdGx5CiAJICBpbnRyb2R1Y2VkIGluIE9NQVA0KS4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhTRU1fVTg1MDAKKwl0cmlzdGF0ZSAiU1RFIEhhcmR3YXJlIFNlbWFwaG9yZSBmdW5jdGlvbmFsaXR5IgorCWRlcGVuZHMgb24gQVJDSF9VODUwMAorCXNlbGVjdCBIV1NQSU5MT0NLCisJaGVscAorCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IHRoZSBTVEUgSGFyZHdhcmUgU2VtYXBob3JlIGZ1bmN0aW9uYWxpdHksIHdoaWNoCisJICBwcm92aWRlcyBhIHN5bmNocm9uaXNhdGlvbiBtZWNoYW5pc20gZm9yIHRoZSB2YXJpb3VzIHByb2Nlc3NvciBvbiB0aGUKKwkgIFNvQy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3NwaW5sb2NrL01ha2VmaWxlIGIvZHJpdmVycy9od3NwaW5sb2NrL01ha2VmaWxlCmluZGV4IDU3MjlhM2YuLjkzZWI2NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdzcGlubG9jay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3c3BpbmxvY2svTWFrZWZpbGUKQEAgLTQsMyArNCw0IEBACiAKIG9iai0kKENPTkZJR19IV1NQSU5MT0NLKQkJKz0gaHdzcGlubG9ja19jb3JlLm8KIG9iai0kKENPTkZJR19IV1NQSU5MT0NLX09NQVApCQkrPSBvbWFwX2h3c3BpbmxvY2subworb2JqLSQoQ09ORklHX0hTRU1fVTg1MDApCQkrPSB1ODUwMF9oc2VtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdzcGlubG9jay9od3NwaW5sb2NrX2NvcmUuYyBiL2RyaXZlcnMvaHdzcGlubG9jay9od3NwaW5sb2NrX2NvcmUuYwppbmRleCA0M2E2MjcxLi42MWM5Y2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3c3BpbmxvY2svaHdzcGlubG9ja19jb3JlLmMKKysrIGIvZHJpdmVycy9od3NwaW5sb2NrL2h3c3BpbmxvY2tfY29yZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2h3c3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgImh3c3BpbmxvY2tfaW50ZXJuYWwuaCIKIApAQCAtNTIsMTAgKzUzLDEyIEBACiBzdGF0aWMgUkFESVhfVFJFRShod3NwaW5sb2NrX3RyZWUsIEdGUF9LRVJORUwpOwogCiAvKgotICogU3luY2hyb25pemF0aW9uIG9mIGFjY2VzcyB0byB0aGUgdHJlZSBpcyBhY2hpZXZlZCB1c2luZyB0aGlzIHNwaW5sb2NrLAorICogU3luY2hyb25pemF0aW9uIG9mIGFjY2VzcyB0byB0aGUgdHJlZSBpcyBhY2hpZXZlZCB1c2luZyB0aGlzIG11dGV4LAogICogYXMgdGhlIHJhZGl4LXRyZWUgQVBJIHJlcXVpcmVzIHRoYXQgdXNlcnMgcHJvdmlkZSBhbGwgc3luY2hyb25pc2F0aW9uLgorICogQSBtdXRleCBpcyBuZWVkZWQgYmVjYXVzZSB3ZSdyZSB1c2luZyBub24tYXRvbWljIHJhZGl4IHRyZWUgYWxsb2NhdGlvbnMuCiAgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHdzcGlubG9ja190cmVlX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChod3NwaW5sb2NrX3RyZWVfbG9jayk7CisKIAogLyoqCiAgKiBfX2h3c3Bpbl90cnlsb2NrKCkgLSBhdHRlbXB0IHRvIGxvY2sgYSBzcGVjaWZpYyBod3NwaW5sb2NrCkBAIC0xMTQsNyArMTE3LDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCS8qIHRyeSB0byB0YWtlIHRoZSBod3NwaW5sb2NrIGRldmljZSAqLwotCXJldCA9IGh3bG9jay0+b3BzLT50cnlsb2NrKGh3bG9jayk7CisJcmV0ID0gaHdsb2NrLT5iYW5rLT5vcHMtPnRyeWxvY2soaHdsb2NrKTsKIAogCS8qIGlmIGh3bG9jayBpcyBhbHJlYWR5IHRha2VuLCB1bmRvIHNwaW5fdHJ5bG9ja18qIGFuZCBleGl0ICovCiAJaWYgKCFyZXQpIHsKQEAgLTE5Niw4ICsxOTksOCBAQAogCQkgKiBBbGxvdyBwbGF0Zm9ybS1zcGVjaWZpYyByZWxheCBoYW5kbGVycyB0byBwcmV2ZW50CiAJCSAqIGhvZ2dpbmcgdGhlIGludGVyY29ubmVjdCAobm8gc2xlZXBpbmcsIHRob3VnaCkKIAkJICovCi0JCWlmIChod2xvY2stPm9wcy0+cmVsYXgpCi0JCQlod2xvY2stPm9wcy0+cmVsYXgoaHdsb2NrKTsKKwkJaWYgKGh3bG9jay0+YmFuay0+b3BzLT5yZWxheCkKKwkJCWh3bG9jay0+YmFuay0+b3BzLT5yZWxheChod2xvY2spOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0yNDIsNyArMjQ1LDcgQEAKIAkgKi8KIAltYigpOwogCi0JaHdsb2NrLT5vcHMtPnVubG9jayhod2xvY2spOworCWh3bG9jay0+YmFuay0+b3BzLT51bmxvY2soaHdsb2NrKTsKIAogCS8qIFVuZG8gdGhlIHNwaW5fdHJ5bG9ja3tfaXJxLCBfaXJxc2F2ZX0gY2FsbGVkIHdoaWxlIGxvY2tpbmcgKi8KIAlpZiAobW9kZSA9PSBIV0xPQ0tfSVJRU1RBVEUpCkBAIC0yNTQsNjggKzI1NywzNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19od3NwaW5fdW5sb2NrKTsKIAotLyoqCi0gKiBod3NwaW5fbG9ja19yZWdpc3RlcigpIC0gcmVnaXN0ZXIgYSBuZXcgaHcgc3BpbmxvY2sKLSAqIEBod2xvY2s6IGh3c3BpbmxvY2sgdG8gcmVnaXN0ZXIuCi0gKgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0tc3BlY2lmaWMKLSAqIGltcGxlbWVudGF0aW9uLCB0byByZWdpc3RlciBhIG5ldyBod3NwaW5sb2NrIGluc3RhbmNlLgotICoKLSAqIENhbiBiZSBjYWxsZWQgZnJvbSBhbiBhdG9taWMgY29udGV4dCAod2lsbCBub3Qgc2xlZXApIGJ1dCBub3QgZnJvbQotICogd2l0aGluIGludGVycnVwdCBjb250ZXh0LgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKLSAqLwotaW50IGh3c3Bpbl9sb2NrX3JlZ2lzdGVyKHN0cnVjdCBod3NwaW5sb2NrICpod2xvY2spCitzdGF0aWMgaW50IGh3c3Bpbl9sb2NrX3JlZ2lzdGVyX3NpbmdsZShzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrLCBpbnQgaWQpCiB7CiAJc3RydWN0IGh3c3BpbmxvY2sgKnRtcDsKIAlpbnQgcmV0OwogCi0JaWYgKCFod2xvY2sgfHwgIWh3bG9jay0+b3BzIHx8Ci0JCSFod2xvY2stPm9wcy0+dHJ5bG9jayB8fCAhaHdsb2NrLT5vcHMtPnVubG9jaykgewotCQlwcl9lcnIoImludmFsaWQgcGFyYW1ldGVyc1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKKworCXJldCA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZod3NwaW5sb2NrX3RyZWUsIGlkLCBod2xvY2spOworCWlmIChyZXQpIHsKKwkJaWYgKHJldCA9PSAtRUVYSVNUKQorCQkJcHJfZXJyKCJod3NwaW5sb2NrIGlkICVkIGFscmVhZHkgZXhpc3RzIVxuIiwgaWQpOworCQlnb3RvIG91dDsKIAl9CiAKLQlzcGluX2xvY2tfaW5pdCgmaHdsb2NrLT5sb2NrKTsKLQotCXNwaW5fbG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOwotCi0JcmV0ID0gcmFkaXhfdHJlZV9pbnNlcnQoJmh3c3BpbmxvY2tfdHJlZSwgaHdsb2NrLT5pZCwgaHdsb2NrKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQogCS8qIG1hcmsgdGhpcyBod3NwaW5sb2NrIGFzIGF2YWlsYWJsZSAqLwotCXRtcCA9IHJhZGl4X3RyZWVfdGFnX3NldCgmaHdzcGlubG9ja190cmVlLCBod2xvY2stPmlkLAotCQkJCQkJCUhXU1BJTkxPQ0tfVU5VU0VEKTsKKwl0bXAgPSByYWRpeF90cmVlX3RhZ19zZXQoJmh3c3BpbmxvY2tfdHJlZSwgaWQsIEhXU1BJTkxPQ0tfVU5VU0VEKTsKIAogCS8qIHNlbGYtc2FuaXR5IGNoZWNrIHdoaWNoIHNob3VsZCBuZXZlciBmYWlsICovCiAJV0FSTl9PTih0bXAgIT0gaHdsb2NrKTsKIAogb3V0OgotCXNwaW5fdW5sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7Ci0JcmV0dXJuIHJldDsKKwltdXRleF91bmxvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKKwlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGh3c3Bpbl9sb2NrX3JlZ2lzdGVyKTsKIAotLyoqCi0gKiBod3NwaW5fbG9ja191bnJlZ2lzdGVyKCkgLSB1bnJlZ2lzdGVyIGFuIGh3IHNwaW5sb2NrCi0gKiBAaWQ6IGluZGV4IG9mIHRoZSBzcGVjaWZpYyBod3NwaW5sb2NrIHRvIHVucmVnaXN0ZXIKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybS1zcGVjaWZpYwotICogaW1wbGVtZW50YXRpb24sIHRvIHVucmVnaXN0ZXIgYW4gZXhpc3RpbmcgKGFuZCB1bnVzZWQpIGh3c3BpbmxvY2suCi0gKgotICogQ2FuIGJlIGNhbGxlZCBmcm9tIGFuIGF0b21pYyBjb250ZXh0ICh3aWxsIG5vdCBzbGVlcCkgYnV0IG5vdCBmcm9tCi0gKiB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQuCi0gKgotICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiBod3NwaW5sb2NrIEBpZCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUKLSAqLwotc3RydWN0IGh3c3BpbmxvY2sgKmh3c3Bpbl9sb2NrX3VucmVnaXN0ZXIodW5zaWduZWQgaW50IGlkKQorc3RhdGljIHN0cnVjdCBod3NwaW5sb2NrICpod3NwaW5fbG9ja191bnJlZ2lzdGVyX3NpbmdsZSh1bnNpZ25lZCBpbnQgaWQpCiB7CiAJc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jayA9IE5VTEw7CiAJaW50IHJldDsKIAotCXNwaW5fbG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOworCW11dGV4X2xvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKIAogCS8qIG1ha2Ugc3VyZSB0aGUgaHdzcGlubG9jayBpcyBub3QgaW4gdXNlICh0YWcgaXMgc2V0KSAqLwogCXJldCA9IHJhZGl4X3RyZWVfdGFnX2dldCgmaHdzcGlubG9ja190cmVlLCBpZCwgSFdTUElOTE9DS19VTlVTRUQpOwpAQCAtMzMxLDkgKzMwMyw5MSBAQAogCX0KIAogb3V0OgotCXNwaW5fdW5sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CiAJcmV0dXJuIGh3bG9jazsKIH0KKworLyoqCisgKiBod3NwaW5fbG9ja19yZWdpc3RlcigpIC0gcmVnaXN0ZXIgYSBuZXcgaHcgc3BpbmxvY2sgZGV2aWNlCisgKiBAYmFuazogdGhlIGh3c3BpbmxvY2sgZGV2aWNlLCB3aGljaCB1c3VhbGx5IHByb3ZpZGVzIG51bWVyb3VzIGh3IGxvY2tzCisgKiBAZGV2OiB0aGUgYmFja2luZyBkZXZpY2UKKyAqIEBvcHM6IGh3c3BpbmxvY2sgaGFuZGxlcnMgZm9yIHRoaXMgZGV2aWNlCisgKiBAYmFzZV9pZDogaWQgb2YgdGhlIGZpcnN0IGhhcmR3YXJlIHNwaW5sb2NrIGluIHRoaXMgYmFuaworICogQG51bV9sb2NrczogbnVtYmVyIG9mIGh3c3BpbmxvY2tzIHByb3ZpZGVkIGJ5IHRoaXMgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0tc3BlY2lmaWMKKyAqIGltcGxlbWVudGF0aW9uLCB0byByZWdpc3RlciBhIG5ldyBod3NwaW5sb2NrIGRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gYSBwcm9jZXNzIGNvbnRleHQgKG1pZ2h0IHNsZWVwKQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGh3c3Bpbl9sb2NrX3JlZ2lzdGVyKHN0cnVjdCBod3NwaW5sb2NrX2RldmljZSAqYmFuaywgc3RydWN0IGRldmljZSAqZGV2LAorCQljb25zdCBzdHJ1Y3QgaHdzcGlubG9ja19vcHMgKm9wcywgaW50IGJhc2VfaWQsIGludCBudW1fbG9ja3MpCit7CisJc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jazsKKwlpbnQgcmV0ID0gMCwgaTsKKworCWlmICghYmFuayB8fCAhb3BzIHx8ICFkZXYgfHwgIW51bV9sb2NrcyB8fCAhb3BzLT50cnlsb2NrIHx8CisJCQkJCQkJIW9wcy0+dW5sb2NrKSB7CisJCXByX2VycigiaW52YWxpZCBwYXJhbWV0ZXJzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmFuay0+ZGV2ID0gZGV2OworCWJhbmstPm9wcyA9IG9wczsKKwliYW5rLT5iYXNlX2lkID0gYmFzZV9pZDsKKwliYW5rLT5udW1fbG9ja3MgPSBudW1fbG9ja3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2xvY2tzOyBpKyspIHsKKwkJaHdsb2NrID0gJmJhbmstPmxvY2tbaV07CisKKwkJc3Bpbl9sb2NrX2luaXQoJmh3bG9jay0+bG9jayk7CisJCWh3bG9jay0+YmFuayA9IGJhbms7CisKKwkJcmV0ID0gaHdzcGluX2xvY2tfcmVnaXN0ZXJfc2luZ2xlKGh3bG9jaywgaSk7CisJCWlmIChyZXQpCisJCQlnb3RvIHJlZ19mYWlsZWQ7CisJfQorCisJcmV0dXJuIDA7CisKK3JlZ19mYWlsZWQ6CisJd2hpbGUgKC0taSA+PSAwKQorCQlod3NwaW5fbG9ja191bnJlZ2lzdGVyX3NpbmdsZShpKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaHdzcGluX2xvY2tfcmVnaXN0ZXIpOworCisvKioKKyAqIGh3c3Bpbl9sb2NrX3VucmVnaXN0ZXIoKSAtIHVucmVnaXN0ZXIgYW4gaHcgc3BpbmxvY2sgZGV2aWNlCisgKiBAYmFuazogdGhlIGh3c3BpbmxvY2sgZGV2aWNlLCB3aGljaCB1c3VhbGx5IHByb3ZpZGVzIG51bWVyb3VzIGh3IGxvY2tzCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0tc3BlY2lmaWMKKyAqIGltcGxlbWVudGF0aW9uLCB0byB1bnJlZ2lzdGVyIGFuIGV4aXN0aW5nIChhbmQgdW51c2VkKSBod3NwaW5sb2NrLgorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MgY29udGV4dCAobWlnaHQgc2xlZXApCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgaHdzcGluX2xvY2tfdW5yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbmspCit7CisJc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jaywgKnRtcDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBiYW5rLT5udW1fbG9ja3M7IGkrKykgeworCQlod2xvY2sgPSAmYmFuay0+bG9ja1tpXTsKKworCQl0bXAgPSBod3NwaW5fbG9ja191bnJlZ2lzdGVyX3NpbmdsZShiYW5rLT5iYXNlX2lkICsgaSk7CisJCWlmICghdG1wKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQkvKiBzZWxmLXNhbml0eSBjaGVjayB0aGF0IHNob3VsZCBuZXZlciBmYWlsICovCisJCVdBUk5fT04odG1wICE9IGh3bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChod3NwaW5fbG9ja191bnJlZ2lzdGVyKTsKIAogLyoqCkBAIC0zNDgsMjQgKzQwMiwyNSBAQAogICovCiBzdGF0aWMgaW50IF9faHdzcGluX2xvY2tfcmVxdWVzdChzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGh3bG9jay0+YmFuay0+ZGV2OwogCXN0cnVjdCBod3NwaW5sb2NrICp0bXA7CiAJaW50IHJldDsKIAogCS8qIHByZXZlbnQgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIHJlbW92ZWQgKi8KLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGh3bG9jay0+b3duZXIpKSB7Ci0JCWRldl9lcnIoaHdsb2NrLT5kZXYsICIlczogY2FuJ3QgZ2V0IG93bmVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRyaXZlci0+b3duZXIpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IGNhbid0IGdldCBvd25lclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBub3RpZnkgUE0gY29yZSB0aGF0IHBvd2VyIGlzIG5vdyBuZWVkZWQgKi8KLQlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGh3bG9jay0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihod2xvY2stPmRldiwgIiVzOiBjYW4ndCBwb3dlciBvbiBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycihkZXYsICIlczogY2FuJ3QgcG93ZXIgb24gZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJLyogbWFyayBod3NwaW5sb2NrIGFzIHVzZWQsIHNob3VsZCBub3QgZmFpbCAqLwotCXRtcCA9IHJhZGl4X3RyZWVfdGFnX2NsZWFyKCZod3NwaW5sb2NrX3RyZWUsIGh3bG9jay0+aWQsCisJdG1wID0gcmFkaXhfdHJlZV90YWdfY2xlYXIoJmh3c3BpbmxvY2tfdHJlZSwgaHdsb2NrX3RvX2lkKGh3bG9jayksCiAJCQkJCQkJSFdTUElOTE9DS19VTlVTRUQpOwogCiAJLyogc2VsZi1zYW5pdHkgY2hlY2sgdGhhdCBzaG91bGQgbmV2ZXIgZmFpbCAqLwpAQCAtMzg3LDcgKzQ0Miw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiBod2xvY2stPmlkOworCXJldHVybiBod2xvY2tfdG9faWQoaHdsb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGh3c3Bpbl9sb2NrX2dldF9pZCk7CiAKQEAgLTQwMCw5ICs0NTUsNyBAQAogICogdG8gdGhlIHJlbW90ZSBjb3JlIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBmb3Igc3luY2hyb25pemF0aW9uICh0byBnZXQgdGhlCiAgKiBpZCBvZiBhIGdpdmVuIGh3bG9jaywgdXNlIGh3c3Bpbl9sb2NrX2dldF9pZCgpKS4KICAqCi0gKiBDYW4gYmUgY2FsbGVkIGZyb20gYW4gYXRvbWljIGNvbnRleHQgKHdpbGwgbm90IHNsZWVwKSBidXQgbm90IGZyb20KLSAqIHdpdGhpbiBpbnRlcnJ1cHQgY29udGV4dCAoc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gdXNlIGNhc2UgZm9yCi0gKiB0aGF0IHlldCkuCisgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gYSBwcm9jZXNzIGNvbnRleHQgKG1pZ2h0IHNsZWVwKQogICoKICAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGFzc2lnbmVkIGh3c3BpbmxvY2ssIG9yIE5VTEwgb24gZXJyb3IKICAqLwpAQCAtNDExLDcgKzQ2NCw3IEBACiAJc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jazsKIAlpbnQgcmV0OwogCi0Jc3Bpbl9sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CisJbXV0ZXhfbG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOwogCiAJLyogbG9vayBmb3IgYW4gdW51c2VkIGxvY2sgKi8KIAlyZXQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwX3RhZygmaHdzcGlubG9ja190cmVlLCAodm9pZCAqKikmaHdsb2NrLApAQCAtNDMxLDcgKzQ4NCw3IEBACiAJCWh3bG9jayA9IE5VTEw7CiAKIG91dDoKLQlzcGluX3VubG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOworCW11dGV4X3VubG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOwogCXJldHVybiBod2xvY2s7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChod3NwaW5fbG9ja19yZXF1ZXN0KTsKQEAgLTQ0NSw5ICs0OTgsNyBAQAogICogVXN1YWxseSBlYXJseSBib2FyZCBjb2RlIHdpbGwgYmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGluIG9yZGVyIHRvCiAgKiByZXNlcnZlIHNwZWNpZmljIGh3c3BpbmxvY2sgaWRzIGZvciBwcmVkZWZpbmVkIHB1cnBvc2VzLgogICoKLSAqIENhbiBiZSBjYWxsZWQgZnJvbSBhbiBhdG9taWMgY29udGV4dCAod2lsbCBub3Qgc2xlZXApIGJ1dCBub3QgZnJvbQotICogd2l0aGluIGludGVycnVwdCBjb250ZXh0IChzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyB1c2UgY2FzZSBmb3IKLSAqIHRoYXQgeWV0KS4KKyAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MgY29udGV4dCAobWlnaHQgc2xlZXApCiAgKgogICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgYXNzaWduZWQgaHdzcGlubG9jaywgb3IgTlVMTCBvbiBlcnJvcgogICovCkBAIC00NTYsNyArNTA3LDcgQEAKIAlzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrOwogCWludCByZXQ7CiAKLQlzcGluX2xvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKKwltdXRleF9sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CiAKIAkvKiBtYWtlIHN1cmUgdGhpcyBod3NwaW5sb2NrIGV4aXN0cyAqLwogCWh3bG9jayA9IHJhZGl4X3RyZWVfbG9va3VwKCZod3NwaW5sb2NrX3RyZWUsIGlkKTsKQEAgLTQ2Niw3ICs1MTcsNyBAQAogCX0KIAogCS8qIHNhbml0eSBjaGVjayAodGhpcyBzaG91bGRuJ3QgaGFwcGVuKSAqLwotCVdBUk5fT04oaHdsb2NrLT5pZCAhPSBpZCk7CisJV0FSTl9PTihod2xvY2tfdG9faWQoaHdsb2NrKSAhPSBpZCk7CiAKIAkvKiBtYWtlIHN1cmUgdGhpcyBod3NwaW5sb2NrIGlzIHVudXNlZCAqLwogCXJldCA9IHJhZGl4X3RyZWVfdGFnX2dldCgmaHdzcGlubG9ja190cmVlLCBpZCwgSFdTUElOTE9DS19VTlVTRUQpOwpAQCAtNDgyLDcgKzUzMyw3IEBACiAJCWh3bG9jayA9IE5VTEw7CiAKIG91dDoKLQlzcGluX3VubG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOworCW11dGV4X3VubG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOwogCXJldHVybiBod2xvY2s7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChod3NwaW5fbG9ja19yZXF1ZXN0X3NwZWNpZmljKTsKQEAgLTQ5NSwxNCArNTQ2LDEzIEBACiAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aCBhbiBAaHdsb2NrIHRoYXQgd2FzIHJldHJpZXZlZCBmcm9tCiAgKiBhbiBlYXJsaWVyIGNhbGwgdG8gb21hcF9od3NwaW5fbG9ja19yZXF1ZXN0e19zcGVjaWZpY30uCiAgKgotICogQ2FuIGJlIGNhbGxlZCBmcm9tIGFuIGF0b21pYyBjb250ZXh0ICh3aWxsIG5vdCBzbGVlcCkgYnV0IG5vdCBmcm9tCi0gKiB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQgKHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHVzZSBjYXNlIGZvcgotICogdGhhdCB5ZXQpLgorICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0IChtaWdodCBzbGVlcCkKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCiAgKi8KIGludCBod3NwaW5fbG9ja19mcmVlKHN0cnVjdCBod3NwaW5sb2NrICpod2xvY2spCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaHdsb2NrLT5iYW5rLT5kZXY7CiAJc3RydWN0IGh3c3BpbmxvY2sgKnRtcDsKIAlpbnQgcmV0OwogCkBAIC01MTEsMzQgKzU2MSwzNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzcGluX2xvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKKwltdXRleF9sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CiAKIAkvKiBtYWtlIHN1cmUgdGhlIGh3c3BpbmxvY2sgaXMgdXNlZCAqLwotCXJldCA9IHJhZGl4X3RyZWVfdGFnX2dldCgmaHdzcGlubG9ja190cmVlLCBod2xvY2stPmlkLAorCXJldCA9IHJhZGl4X3RyZWVfdGFnX2dldCgmaHdzcGlubG9ja190cmVlLCBod2xvY2tfdG9faWQoaHdsb2NrKSwKIAkJCQkJCQlIV1NQSU5MT0NLX1VOVVNFRCk7CiAJaWYgKHJldCA9PSAxKSB7Ci0JCWRldl9lcnIoaHdsb2NrLT5kZXYsICIlczogaHdsb2NrIGlzIGFscmVhZHkgZnJlZVxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKGRldiwgIiVzOiBod2xvY2sgaXMgYWxyZWFkeSBmcmVlXG4iLCBfX2Z1bmNfXyk7CiAJCWR1bXBfc3RhY2soKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCiAJLyogbm90aWZ5IHRoZSB1bmRlcmx5aW5nIGRldmljZSB0aGF0IHBvd2VyIGlzIG5vdCBuZWVkZWQgKi8KLQlyZXQgPSBwbV9ydW50aW1lX3B1dChod2xvY2stPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9wdXQoZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKIAkvKiBtYXJrIHRoaXMgaHdzcGlubG9jayBhcyBhdmFpbGFibGUgKi8KLQl0bXAgPSByYWRpeF90cmVlX3RhZ19zZXQoJmh3c3BpbmxvY2tfdHJlZSwgaHdsb2NrLT5pZCwKKwl0bXAgPSByYWRpeF90cmVlX3RhZ19zZXQoJmh3c3BpbmxvY2tfdHJlZSwgaHdsb2NrX3RvX2lkKGh3bG9jayksCiAJCQkJCQkJSFdTUElOTE9DS19VTlVTRUQpOwogCiAJLyogc2FuaXR5IGNoZWNrICh0aGlzIHNob3VsZG4ndCBoYXBwZW4pICovCiAJV0FSTl9PTih0bXAgIT0gaHdsb2NrKTsKIAotCW1vZHVsZV9wdXQoaHdsb2NrLT5vd25lcik7CisJbW9kdWxlX3B1dChkZXYtPmRyaXZlci0+b3duZXIpOwogCiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKKwltdXRleF91bmxvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaHdzcGluX2xvY2tfZnJlZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3c3BpbmxvY2svaHdzcGlubG9ja19pbnRlcm5hbC5oIGIvZHJpdmVycy9od3NwaW5sb2NrL2h3c3BpbmxvY2tfaW50ZXJuYWwuaAppbmRleCA2OTkzNWU2Li5kMjZmNzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3c3BpbmxvY2svaHdzcGlubG9ja19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvaHdzcGlubG9jay9od3NwaW5sb2NrX2ludGVybmFsLmgKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCitzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2U7CisKIC8qKgogICogc3RydWN0IGh3c3BpbmxvY2tfb3BzIC0gcGxhdGZvcm0tc3BlY2lmaWMgaHdzcGlubG9jayBoYW5kbGVycwogICoKQEAgLTM5LDIzICs0MSwzNyBAQAogCiAvKioKICAqIHN0cnVjdCBod3NwaW5sb2NrIC0gdGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyBhIHNpbmdsZSBod3NwaW5sb2NrIGluc3RhbmNlCi0gKgotICogQGRldjogdW5kZXJseWluZyBkZXZpY2UsIHdpbGwgYmUgdXNlZCB0byBpbnZva2UgcnVudGltZSBQTSBhcGkKLSAqIEBvcHM6IHBsYXRmb3JtLXNwZWNpZmljIGh3c3BpbmxvY2sgaGFuZGxlcnMKLSAqIEBpZDogYSBnbG9iYWwsIHVuaXF1ZSwgc3lzdGVtLXdpZGUsIGluZGV4IG9mIHRoZSBsb2NrLgorICogQGJhbms6IHRoZSBod3NwaW5sb2NrX2RldmljZSBzdHJ1Y3R1cmUgd2hpY2ggb3ducyB0aGlzIGxvY2sKICAqIEBsb2NrOiBpbml0aWFsaXplZCBhbmQgdXNlZCBieSBod3NwaW5sb2NrIGNvcmUKLSAqIEBvd25lcjogdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBtb2R1bGUsIHVzZWQgdG8gbWFpbnRhaW4gbW9kdWxlIHJlZiBjb3VudAotICoKLSAqIE5vdGU6IGN1cnJlbnRseSBzaW1wbGljaXR5IHdhcyBvcHRlZCBmb3IsIGJ1dCBsYXRlciB3ZSBjYW4gc3F1ZWV6ZSBzb21lCi0gKiBtZW1vcnkgYnl0ZXMgYnkgZ3JvdXBpbmcgdGhlIGRldiwgb3BzIGFuZCBvd25lciBtZW1iZXJzIGluIGEgc2luZ2xlCi0gKiBwZXItcGxhdGZvcm0gc3RydWN0LCBhbmQgaGF2ZSBhbGwgaHdzcGlubG9ja3MgcG9pbnQgYXQgaXQuCisgKiBAcHJpdjogcHJpdmF0ZSBkYXRhLCBvd25lZCBieSB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybS1zcGVjaWZpYyBod3NwaW5sb2NrIGRydgogICovCiBzdHJ1Y3QgaHdzcGlubG9jayB7CisJc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rOworCXNwaW5sb2NrX3QgbG9jazsKKwl2b2lkICpwcml2OworfTsKKworLyoqCisgKiBzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgLSBhIGRldmljZSB3aGljaCB1c3VhbGx5IHNwYW5zIG51bWVyb3VzIGh3c3BpbmxvY2tzCisgKiBAZGV2OiB1bmRlcmx5aW5nIGRldmljZSwgd2lsbCBiZSB1c2VkIHRvIGludm9rZSBydW50aW1lIFBNIGFwaQorICogQG9wczogcGxhdGZvcm0tc3BlY2lmaWMgaHdzcGlubG9jayBoYW5kbGVycworICogQGJhc2VfaWQ6IGlkIGluZGV4IG9mIHRoZSBmaXJzdCBsb2NrIGluIHRoaXMgZGV2aWNlCisgKiBAbnVtX2xvY2tzOiBudW1iZXIgb2YgbG9ja3MgaW4gdGhpcyBkZXZpY2UKKyAqIEBsb2NrOiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYXJyYXkgb2YgJ3N0cnVjdCBod3NwaW5sb2NrJworICovCitzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAljb25zdCBzdHJ1Y3QgaHdzcGlubG9ja19vcHMgKm9wczsKLQlpbnQgaWQ7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCWludCBiYXNlX2lkOworCWludCBudW1fbG9ja3M7CisJc3RydWN0IGh3c3BpbmxvY2sgbG9ja1swXTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgaW50IGh3bG9ja190b19pZChzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrKQoreworCWludCBsb2NhbF9pZCA9IGh3bG9jayAtICZod2xvY2stPmJhbmstPmxvY2tbMF07CisKKwlyZXR1cm4gaHdsb2NrLT5iYW5rLT5iYXNlX2lkICsgbG9jYWxfaWQ7Cit9CisKICNlbmRpZiAvKiBfX0hXU1BJTkxPQ0tfSFdTUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3c3BpbmxvY2svb21hcF9od3NwaW5sb2NrLmMgYi9kcml2ZXJzL2h3c3BpbmxvY2svb21hcF9od3NwaW5sb2NrLmMKaW5kZXggYThmMDI3My4uODg3ZDM0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3NwaW5sb2NrL29tYXBfaHdzcGlubG9jay5jCisrKyBiL2RyaXZlcnMvaHdzcGlubG9jay9vbWFwX2h3c3BpbmxvY2suYwpAQCAtNDEsMzMgKzQxLDIwIEBACiAjZGVmaW5lIFNQSU5MT0NLX05PVFRBS0VOCQkoMCkJLyogZnJlZSAqLwogI2RlZmluZSBTUElOTE9DS19UQUtFTgkJCSgxKQkvKiBsb2NrZWQgKi8KIAotI2RlZmluZSB0b19vbWFwX2h3c3BpbmxvY2sobG9jaykJXAotCWNvbnRhaW5lcl9vZihsb2NrLCBzdHJ1Y3Qgb21hcF9od3NwaW5sb2NrLCBsb2NrKQotCi1zdHJ1Y3Qgb21hcF9od3NwaW5sb2NrIHsKLQlzdHJ1Y3QgaHdzcGlubG9jayBsb2NrOwotCXZvaWQgX19pb21lbSAqYWRkcjsKLX07Ci0KLXN0cnVjdCBvbWFwX2h3c3BpbmxvY2tfc3RhdGUgewotCWludCBudW1fbG9ja3M7CQkJLyogVG90YWwgbnVtYmVyIG9mIGxvY2tzIGluIHN5c3RlbSAqLwotCXZvaWQgX19pb21lbSAqaW9fYmFzZTsJCS8qIE1hcHBlZCBiYXNlIGFkZHJlc3MgKi8KLX07Ci0KIHN0YXRpYyBpbnQgb21hcF9od3NwaW5sb2NrX3RyeWxvY2soc3RydWN0IGh3c3BpbmxvY2sgKmxvY2spCiB7Ci0Jc3RydWN0IG9tYXBfaHdzcGlubG9jayAqb21hcF9sb2NrID0gdG9fb21hcF9od3NwaW5sb2NrKGxvY2spOworCXZvaWQgX19pb21lbSAqbG9ja19hZGRyID0gbG9jay0+cHJpdjsKIAogCS8qIGF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgbG9jayBieSByZWFkaW5nIGl0cyB2YWx1ZSAqLwotCXJldHVybiAoU1BJTkxPQ0tfTk9UVEFLRU4gPT0gcmVhZGwob21hcF9sb2NrLT5hZGRyKSk7CisJcmV0dXJuIChTUElOTE9DS19OT1RUQUtFTiA9PSByZWFkbChsb2NrX2FkZHIpKTsKIH0KIAogc3RhdGljIHZvaWQgb21hcF9od3NwaW5sb2NrX3VubG9jayhzdHJ1Y3QgaHdzcGlubG9jayAqbG9jaykKIHsKLQlzdHJ1Y3Qgb21hcF9od3NwaW5sb2NrICpvbWFwX2xvY2sgPSB0b19vbWFwX2h3c3BpbmxvY2sobG9jayk7CisJdm9pZCBfX2lvbWVtICpsb2NrX2FkZHIgPSBsb2NrLT5wcml2OwogCiAJLyogcmVsZWFzZSB0aGUgbG9jayBieSB3cml0aW5nIDAgdG8gaXQgKi8KLQl3cml0ZWwoU1BJTkxPQ0tfTk9UVEFLRU4sIG9tYXBfbG9jay0+YWRkcik7CisJd3JpdGVsKFNQSU5MT0NLX05PVFRBS0VOLCBsb2NrX2FkZHIpOwogfQogCiAvKgpAQCAtOTMsMjYgKzgwLDIzIEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG9tYXBfaHdzcGlubG9ja19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBvbWFwX2h3c3BpbmxvY2sgKm9tYXBfbG9jazsKLQlzdHJ1Y3Qgb21hcF9od3NwaW5sb2NrX3N0YXRlICpzdGF0ZTsKLQlzdHJ1Y3QgaHdzcGlubG9jayAqbG9jazsKKwlzdHJ1Y3QgaHdzcGlubG9ja19wZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbms7CisJc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jazsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAl2b2lkIF9faW9tZW0gKmlvX2Jhc2U7Ci0JaW50IGksIHJldDsKKwlpbnQgbnVtX2xvY2tzLCBpLCByZXQ7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3RhdGUgPSBremFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0YXRlKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWlvX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKCFpb19iYXNlKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZnJlZV9zdGF0ZTsKLQl9CisJaWYgKCFpb19iYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIERldGVybWluZSBudW1iZXIgb2YgbG9ja3MgKi8KIAlpID0gcmVhZGwoaW9fYmFzZSArIFNZU1NUQVRVU19PRkZTRVQpOwpAQCAtMTI0LDEwICsxMDgsMTggQEAKIAkJZ290byBpb3VubWFwX2Jhc2U7CiAJfQogCi0Jc3RhdGUtPm51bV9sb2NrcyA9IGkgKiAzMjsKLQlzdGF0ZS0+aW9fYmFzZSA9IGlvX2Jhc2U7CisJbnVtX2xvY2tzID0gaSAqIDMyOyAvKiBhY3R1YWwgbnVtYmVyIG9mIGxvY2tzIGluIHRoaXMgZGV2aWNlICovCiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzdGF0ZSk7CisJYmFuayA9IGt6YWxsb2Moc2l6ZW9mKCpiYW5rKSArIG51bV9sb2NrcyAqIHNpemVvZigqaHdsb2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiYW5rKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gaW91bm1hcF9iYXNlOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGJhbmspOworCisJZm9yIChpID0gMCwgaHdsb2NrID0gJmJhbmstPmxvY2tbMF07IGkgPCBudW1fbG9ja3M7IGkrKywgaHdsb2NrKyspCisJCWh3bG9jay0+cHJpdiA9IGlvX2Jhc2UgKyBMT0NLX0JBU0VfT0ZGU0VUICsgc2l6ZW9mKHUzMikgKiBpOwogCiAJLyoKIAkgKiBydW50aW1lIFBNIHdpbGwgbWFrZSBzdXJlIHRoZSBjbG9jayBvZiB0aGlzIG1vZHVsZSBpcwpAQCAtMTM1LDc5ICsxMjcsNDYgQEAKIAkgKi8KIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAotCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+bnVtX2xvY2tzOyBpKyspIHsKLQkJb21hcF9sb2NrID0ga3phbGxvYyhzaXplb2YoKm9tYXBfbG9jayksIEdGUF9LRVJORUwpOwotCQlpZiAoIW9tYXBfbG9jaykgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZnJlZV9sb2NrczsKLQkJfQotCi0JCW9tYXBfbG9jay0+bG9jay5kZXYgPSAmcGRldi0+ZGV2OwotCQlvbWFwX2xvY2stPmxvY2sub3duZXIgPSBUSElTX01PRFVMRTsKLQkJb21hcF9sb2NrLT5sb2NrLmlkID0gaTsKLQkJb21hcF9sb2NrLT5sb2NrLm9wcyA9ICZvbWFwX2h3c3BpbmxvY2tfb3BzOwotCQlvbWFwX2xvY2stPmFkZHIgPSBpb19iYXNlICsgTE9DS19CQVNFX09GRlNFVCArIHNpemVvZih1MzIpICogaTsKLQotCQlyZXQgPSBod3NwaW5fbG9ja19yZWdpc3Rlcigmb21hcF9sb2NrLT5sb2NrKTsKLQkJaWYgKHJldCkgewotCQkJa2ZyZWUob21hcF9sb2NrKTsKLQkJCWdvdG8gZnJlZV9sb2NrczsKLQkJfQotCX0KKwlyZXQgPSBod3NwaW5fbG9ja19yZWdpc3RlcihiYW5rLCAmcGRldi0+ZGV2LCAmb21hcF9od3NwaW5sb2NrX29wcywKKwkJCQkJCXBkYXRhLT5iYXNlX2lkLCBudW1fbG9ja3MpOworCWlmIChyZXQpCisJCWdvdG8gcmVnX2ZhaWw7CiAKIAlyZXR1cm4gMDsKIAotZnJlZV9sb2NrczoKLQl3aGlsZSAoLS1pID49IDApIHsKLQkJbG9jayA9IGh3c3Bpbl9sb2NrX3VucmVnaXN0ZXIoaSk7Ci0JCS8qIHRoaXMgc2hvdWxkJ3QgaGFwcGVuLCBidXQgbGV0J3MgZ2l2ZSBvdXIgYmVzdCBlZmZvcnQgKi8KLQkJaWYgKCFsb2NrKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogY2xlYW51cHMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlvbWFwX2xvY2sgPSB0b19vbWFwX2h3c3BpbmxvY2sobG9jayk7Ci0JCWtmcmVlKG9tYXBfbG9jayk7Ci0JfQorcmVnX2ZhaWw6CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCWtmcmVlKGJhbmspOwogaW91bm1hcF9iYXNlOgogCWlvdW5tYXAoaW9fYmFzZSk7Ci1mcmVlX3N0YXRlOgotCWtmcmVlKHN0YXRlKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG9tYXBfaHdzcGlubG9ja19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IG9tYXBfaHdzcGlubG9ja19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3Qgb21hcF9od3NwaW5sb2NrX3N0YXRlICpzdGF0ZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBod3NwaW5sb2NrICpsb2NrOwotCXN0cnVjdCBvbWFwX2h3c3BpbmxvY2sgKm9tYXBfbG9jazsKLQlpbnQgaTsKKwlzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbmsgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvX2Jhc2UgPSBiYW5rLT5sb2NrWzBdLnByaXYgLSBMT0NLX0JBU0VfT0ZGU0VUOworCWludCByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPm51bV9sb2NrczsgaSsrKSB7Ci0JCWxvY2sgPSBod3NwaW5fbG9ja191bnJlZ2lzdGVyKGkpOwotCQkvKiB0aGlzIHNob3VsZG4ndCBoYXBwZW4gYXQgdGhpcyBwb2ludC4gaWYgaXQgZG9lcywgYXQgbGVhc3QKLQkJICogZG9uJ3QgY29udGludWUgd2l0aCB0aGUgcmVtb3ZlICovCi0JCWlmICghbG9jaykgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCBvbiAlZFxuIiwgX19mdW5jX18sIGkpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCi0JCW9tYXBfbG9jayA9IHRvX29tYXBfaHdzcGlubG9jayhsb2NrKTsKLQkJa2ZyZWUob21hcF9sb2NrKTsKKwlyZXQgPSBod3NwaW5fbG9ja191bnJlZ2lzdGVyKGJhbmspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCWlvdW5tYXAoc3RhdGUtPmlvX2Jhc2UpOwotCWtmcmVlKHN0YXRlKTsKKwlpb3VubWFwKGlvX2Jhc2UpOworCWtmcmVlKGJhbmspOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfaHdzcGlubG9ja19kcml2ZXIgPSB7CiAJLnByb2JlCQk9IG9tYXBfaHdzcGlubG9ja19wcm9iZSwKLQkucmVtb3ZlCQk9IG9tYXBfaHdzcGlubG9ja19yZW1vdmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvbWFwX2h3c3BpbmxvY2tfcmVtb3ZlKSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAib21hcF9od3NwaW5sb2NrIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdzcGlubG9jay91ODUwMF9oc2VtLmMgYi9kcml2ZXJzL2h3c3BpbmxvY2svdTg1MDBfaHNlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTgwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3c3BpbmxvY2svdTg1MDBfaHNlbS5jCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogdTg1MDAgSFdTRU0gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgU1QtRXJpY3Nzb24KKyAqCisgKiBJbXBsZW1lbnRzIHU4NTAwIHNlbWFwaG9yZSBoYW5kbGluZyBmb3IgcHJvdG9jb2wgMSwgbm8gaW50ZXJydXB0cy4KKyAqCisgKiBBdXRob3I6IE1hdGhpZXUgUG9pcmllciA8bWF0aGlldS5wb2lyaWVyQGxpbmFyby5vcmc+CisgKiBIZWF2aWx5IGJvcnJvd2VkIGZyb20gdGhlIHdvcmsgb2YgOgorICogICBTaW1vbiBRdWUgPHNxdWVAdGkuY29tPgorICogICBIYXJpIEthbmlnZXJpIDxoLWthbmlnZXJpMkB0aS5jb20+CisgKiAgIE9oYWQgQmVuLUNvaGVuIDxvaGFkQHdpemVyeS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2h3c3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgImh3c3BpbmxvY2tfaW50ZXJuYWwuaCIKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIFNURSdzIEhTZW0gcHJvdG9jb2wgMSB3aXRob3V0IGludGVycnV0cHMuCisgKiBUaGUgb25seSBtYXN0ZXJJRCB3ZSBhbGxvdyBpcyAnMHgwMScgdG8gZm9yY2UgcGVvcGxlIHRvIHVzZQorICogSFNlbXMgZm9yIHN5bmNocm9uaXNhdGlvbiBiZXR3ZWVuIHByb2Nlc3NvcnMgcmF0aGVyIHRoYW4gcHJvY2Vzc2VzCisgKiBvbiB0aGUgQVJNIGNvcmUuCisgKi8KKworI2RlZmluZSBVODUwMF9NQVhfU0VNQVBIT1JFCQkzMgkvKiBhIHRvdGFsIG9mIDMyIHNlbWFwaG9yZSAqLworI2RlZmluZSBSRVNFVF9TRU1BUEhPUkUJCQkoMCkJLyogZnJlZSAqLworCisvKgorICogQ1BVIElEIGZvciBtYXN0ZXIgcnVubmluZyB1ODUwMCBrZXJuZWwuCisgKiBIc3dwaW5sb2NrcyBzaG91bGQgb25seSBiZSB1c2VkIHRvIHN5bmNob25pc2Ugb3BlcmF0aW9ucworICogYmV0d2VlbiB0aGUgQ29ydGV4IEE5IGNvcmUgYW5kIHRoZSBvdGhlciBDUFVzLiAgSGVuY2UKKyAqIGZvcmNpbmcgdGhlIG1hc3RlcklEIHRvIGEgcHJlc2V0IHZhbHVlLgorICovCisjZGVmaW5lIEhTRU1fTUFTVEVSX0lECQkJMHgwMQorCisjZGVmaW5lIEhTRU1fUkVHSVNURVJfT0ZGU0VUCQkweDA4CisKKyNkZWZpbmUgSFNFTV9DVFJMX1JFRwkJCTB4MDAKKyNkZWZpbmUgSFNFTV9JQ1JBTEwJCQkweDkwCisjZGVmaW5lIEhTRU1fUFJPVE9DT0xfMQkJCTB4MDEKKworc3RhdGljIGludCB1ODUwMF9oc2VtX3RyeWxvY2soc3RydWN0IGh3c3BpbmxvY2sgKmxvY2spCit7CisJdm9pZCBfX2lvbWVtICpsb2NrX2FkZHIgPSBsb2NrLT5wcml2OworCisJd3JpdGVsKEhTRU1fTUFTVEVSX0lELCBsb2NrX2FkZHIpOworCisJLyogZ2V0IG9ubHkgZmlyc3QgNCBiaXQgYW5kIGNvbXBhcmUgdG8gbWFzdGVySUQuCisJICogaWYgZXF1YWwsIHdlIGhhdmUgdGhlIHNlbWFwaG9yZSwgb3RoZXJ3aXNlCisJICogc29tZW9uZSBlbHNlIGhhcyBpdC4KKwkgKi8KKwlyZXR1cm4gKEhTRU1fTUFTVEVSX0lEID09ICgweDBGICYgcmVhZGwobG9ja19hZGRyKSkpOworfQorCitzdGF0aWMgdm9pZCB1ODUwMF9oc2VtX3VubG9jayhzdHJ1Y3QgaHdzcGlubG9jayAqbG9jaykKK3sKKwl2b2lkIF9faW9tZW0gKmxvY2tfYWRkciA9IGxvY2stPnByaXY7CisKKwkvKiByZWxlYXNlIHRoZSBsb2NrIGJ5IHdyaXRpbmcgMCB0byBpdCAqLworCXdyaXRlbChSRVNFVF9TRU1BUEhPUkUsIGxvY2tfYWRkcik7Cit9CisKKy8qCisgKiB1ODUwMDogd2hhdCB2YWx1ZSBpcyByZWNvbW1lbmRlZCBoZXJlID8KKyAqLworc3RhdGljIHZvaWQgdTg1MDBfaHNlbV9yZWxheChzdHJ1Y3QgaHdzcGlubG9jayAqbG9jaykKK3sKKwluZGVsYXkoNTApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3c3BpbmxvY2tfb3BzIHU4NTAwX2h3c3BpbmxvY2tfb3BzID0geworCS50cnlsb2NrCT0gdTg1MDBfaHNlbV90cnlsb2NrLAorCS51bmxvY2sJCT0gdTg1MDBfaHNlbV91bmxvY2ssCisJLnJlbGF4CQk9IHU4NTAwX2hzZW1fcmVsYXgsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB1ODUwMF9oc2VtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGh3c3BpbmxvY2tfcGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rOworCXN0cnVjdCBod3NwaW5sb2NrICpod2xvY2s7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCBfX2lvbWVtICppb19iYXNlOworCWludCBpLCByZXQsIG51bV9sb2NrcyA9IFU4NTAwX01BWF9TRU1BUEhPUkU7CisJdWxvbmcgdmFsOworCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlvX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFpb19iYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIG1ha2Ugc3VyZSBwcm90b2NvbCAxIGlzIHNlbGVjdGVkICovCisJdmFsID0gcmVhZGwoaW9fYmFzZSArIEhTRU1fQ1RSTF9SRUcpOworCXdyaXRlbCgodmFsICYgfkhTRU1fUFJPVE9DT0xfMSksIGlvX2Jhc2UgKyBIU0VNX0NUUkxfUkVHKTsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDB4RkZGRiwgaW9fYmFzZSArIEhTRU1fSUNSQUxMKTsKKworCWJhbmsgPSBremFsbG9jKHNpemVvZigqYmFuaykgKyBudW1fbG9ja3MgKiBzaXplb2YoKmh3bG9jayksIEdGUF9LRVJORUwpOworCWlmICghYmFuaykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGlvdW5tYXBfYmFzZTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBiYW5rKTsKKworCWZvciAoaSA9IDAsIGh3bG9jayA9ICZiYW5rLT5sb2NrWzBdOyBpIDwgbnVtX2xvY2tzOyBpKyssIGh3bG9jaysrKQorCQlod2xvY2stPnByaXYgPSBpb19iYXNlICsgSFNFTV9SRUdJU1RFUl9PRkZTRVQgKyBzaXplb2YodTMyKSAqIGk7CisKKwkvKiBubyBwbSBuZWVkZWQgZm9yIEhTZW0gYnV0IHJlcXVpcmVkIHRvIGNvbXBseSB3aXRoIGh3c3BpbG9jayBjb3JlICovCisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisKKwlyZXQgPSBod3NwaW5fbG9ja19yZWdpc3RlcihiYW5rLCAmcGRldi0+ZGV2LCAmdTg1MDBfaHdzcGlubG9ja19vcHMsCisJCQkJCQlwZGF0YS0+YmFzZV9pZCwgbnVtX2xvY2tzKTsKKwlpZiAocmV0KQorCQlnb3RvIHJlZ19mYWlsOworCisJcmV0dXJuIDA7CisKK3JlZ19mYWlsOgorCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwlrZnJlZShiYW5rKTsKK2lvdW5tYXBfYmFzZToKKwlpb3VubWFwKGlvX2Jhc2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHU4NTAwX2hzZW1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb19iYXNlID0gYmFuay0+bG9ja1swXS5wcml2IC0gSFNFTV9SRUdJU1RFUl9PRkZTRVQ7CisJaW50IHJldDsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDB4RkZGRiwgaW9fYmFzZSArIEhTRU1fSUNSQUxMKTsKKworCXJldCA9IGh3c3Bpbl9sb2NrX3VucmVnaXN0ZXIoYmFuayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJaW91bm1hcChpb19iYXNlKTsKKwlrZnJlZShiYW5rKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1ODUwMF9oc2VtX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdTg1MDBfaHNlbV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHU4NTAwX2hzZW1fcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidTg1MDBfaHNlbSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1ODUwMF9oc2VtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ1ODUwMF9oc2VtX2RyaXZlcik7Cit9CisvKiBib2FyZCBpbml0IGNvZGUgbWlnaHQgbmVlZCB0byByZXNlcnZlIGh3c3BpbmxvY2tzIGZvciBwcmVkZWZpbmVkIHB1cnBvc2VzICovCitwb3N0Y29yZV9pbml0Y2FsbCh1ODUwMF9oc2VtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdTg1MDBfaHNlbV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnU4NTAwX2hzZW1fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHU4NTAwX2hzZW1fZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSGFyZHdhcmUgU3BpbmxvY2sgZHJpdmVyIGZvciB1ODUwMCIpOworTU9EVUxFX0FVVEhPUigiTWF0aGlldSBQb2lyaWVyIDxtYXRoaWV1LnBvaXJpZXJAbGluYXJvLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMKaW5kZXggZDZkNTg2OC4uODU1ODRhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMKQEAgLTQ3LDggKzQ3LDggQEAKIC8qIC0tLS0tIGdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCiAKIHN0YXRpYyBpbnQgYml0X3Rlc3Q7CS8qIHNlZSBpZiB0aGUgbGluZS1zZXR0aW5nIGZ1bmN0aW9ucyB3b3JrCSovCi1tb2R1bGVfcGFyYW0oYml0X3Rlc3QsIGJvb2wsIDApOwotTU9EVUxFX1BBUk1fREVTQyhiaXRfdGVzdCwgIlRlc3QgdGhlIGxpbmVzIG9mIHRoZSBidXMgdG8gc2VlIGlmIGl0IGlzIHN0dWNrIik7Cittb2R1bGVfcGFyYW0oYml0X3Rlc3QsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGJpdF90ZXN0LCAibGluZXMgdGVzdGluZyAtIDAgb2ZmOyAxIHJlcG9ydDsgMiBmYWlsIGlmIHN0dWNrIik7CiAKICNpZmRlZiBERUJVRwogc3RhdGljIGludCBpMmNfZGVidWcgPSAxOwpAQCAtMjUwLDcgKzI1MCw5IEBACiAJc2RhID0gZ2V0c2RhKGFkYXApOwogCXNjbCA9IChhZGFwLT5nZXRzY2wgPT0gTlVMTCkgPyAxIDogZ2V0c2NsKGFkYXApOwogCWlmICghc2NsIHx8ICFzZGEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJ1cyBzZWVtcyB0byBiZSBidXN5XG4iLCBuYW1lKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBidXMgc2VlbXMgdG8gYmUgYnVzeSAoc2NsPSVkLCBzZGE9JWQpXG4iLAorCQkgICAgICAgbmFtZSwgc2NsLCBzZGEpOwogCQlnb3RvIGJhaWxvdXQ7CiAJfQogCkBAIC00NDEsNyArNDQzLDcgQEAKIAkJCQkJYWNrbmFrKGkyY19hZGFwLCAwKTsKIAkJCQlkZXZfZXJyKCZpMmNfYWRhcC0+ZGV2LCAicmVhZGJ5dGVzOiBpbnZhbGlkICIKIAkJCQkJImJsb2NrIGxlbmd0aCAoJWQpXG4iLCBpbnZhbCk7Ci0JCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCQkJcmV0dXJuIC1FUFJPVE87CiAJCQl9CiAJCQkvKiBUaGUgb3JpZ2luYWwgY291bnQgdmFsdWUgYWNjb3VudHMgZm9yIHRoZSBleHRyYQogCQkJICAgYnl0ZXMsIHRoYXQgaXMsIGVpdGhlciAxIGZvciBhIHJlZ3VsYXIgdHJhbnNhY3Rpb24sCkBAIC00NzAsNyArNDcyLDcgQEAKICAqIHJlYWRzLCB3cml0ZXMgYXMgd2VsbCBhcyAxMGJpdC1hZGRyZXNzZXMuCiAgKiByZXR1cm5zOgogICogIDAgZXZlcnl0aGluZyB3ZW50IG9rYXksIHRoZSBjaGlwIGFjaydlZCwgb3IgSUdOT1JFX05BSyBmbGFnIHdhcyBzZXQKLSAqIC14IGFuIGVycm9yIG9jY3VycmVkIChsaWtlOiAtRVJFTU9URUlPIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBhbnN3ZXIsIG9yCisgKiAteCBhbiBlcnJvciBvY2N1cnJlZCAobGlrZTogLUVOWElPIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBhbnN3ZXIsIG9yCiAgKgktRVRJTUVET1VULCBmb3IgZXhhbXBsZSBpZiB0aGUgbGluZXMgYXJlIHN0dWNrLi4uKQogICovCiBzdGF0aWMgaW50IGJpdF9kb0FkZHJlc3Moc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZykKQEAgLTQ5MywxNCArNDk1LDE0IEBACiAJCWlmICgocmV0ICE9IDEpICYmICFuYWtfb2spICB7CiAJCQlkZXZfZXJyKCZpMmNfYWRhcC0+ZGV2LAogCQkJCSJkaWVkIGF0IGV4dGVuZGVkIGFkZHJlc3MgY29kZVxuIik7Ci0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJCXJldHVybiAtRU5YSU87CiAJCX0KIAkJLyogdGhlIHJlbWFpbmluZyA4IGJpdCBhZGRyZXNzICovCiAJCXJldCA9IGkyY19vdXRiKGkyY19hZGFwLCBtc2ctPmFkZHIgJiAweDdmKTsKIAkJaWYgKChyZXQgIT0gMSkgJiYgIW5ha19vaykgewogCQkJLyogdGhlIGNoaXAgZGlkIG5vdCBhY2sgLyB4bWlzc2lvbiBlcnJvciBvY2N1cnJlZCAqLwogCQkJZGV2X2VycigmaTJjX2FkYXAtPmRldiwgImRpZWQgYXQgMm5kIGFkZHJlc3MgY29kZVxuIik7Ci0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJCXJldHVybiAtRU5YSU87CiAJCX0KIAkJaWYgKGZsYWdzICYgSTJDX01fUkQpIHsKIAkJCWJpdF9kYmcoMywgJmkyY19hZGFwLT5kZXYsICJlbWl0dGluZyByZXBlYXRlZCAiCkBAIC01MTIsNyArNTE0LDcgQEAKIAkJCWlmICgocmV0ICE9IDEpICYmICFuYWtfb2spIHsKIAkJCQlkZXZfZXJyKCZpMmNfYWRhcC0+ZGV2LAogCQkJCQkiZGllZCBhdCByZXBlYXRlZCBhZGRyZXNzIGNvZGVcbiIpOwotCQkJCXJldHVybiAtRVJFTU9URUlPOworCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQl9CiAJfSBlbHNlIHsJCS8qIG5vcm1hbCA3Yml0IGFkZHJlc3MJKi8KQEAgLTU3MCw3ICs1NzIsNyBAQAogCQkJCQlyZXQsIHJldCA9PSAxID8gIiIgOiAicyIpOwogCQkJaWYgKHJldCA8IHBtc2ctPmxlbikgewogCQkJCWlmIChyZXQgPj0gMCkKLQkJCQkJcmV0ID0gLUVSRU1PVEVJTzsKKwkJCQkJcmV0ID0gLUVJTzsKIAkJCQlnb3RvIGJhaWxvdXQ7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC01ODEsNyArNTgzLDcgQEAKIAkJCQkJcmV0LCByZXQgPT0gMSA/ICIiIDogInMiKTsKIAkJCWlmIChyZXQgPCBwbXNnLT5sZW4pIHsKIAkJCQlpZiAocmV0ID49IDApCi0JCQkJCXJldCA9IC1FUkVNT1RFSU87CisJCQkJCXJldCA9IC1FSU87CiAJCQkJZ290byBiYWlsb3V0OwogCQkJfQogCQl9CkBAIC02MjQsNyArNjI2LDcgQEAKIAogCWlmIChiaXRfdGVzdCkgewogCQlyZXQgPSB0ZXN0X2J1cyhhZGFwKTsKLQkJaWYgKHJldCA8IDApCisJCWlmIChiaXRfdGVzdCA+PSAyICYmIHJldCA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKaW5kZXggNGNhOWNmOS4uYmViOWZmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogCQl9IGVsc2UgewogCQkJZGV2X2RiZygmaTJjX2FkYXAtPmRldiwgImJ1cyBpcyBub3QgaWRsZS4gc3RhdHVzIGlzICIKIAkJCQkiJSMwNHhcbiIsIHN0YXRlKTsKLQkJCXJldHVybiAtRUFHQUlOOworCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KIApAQCAtMjI0LDcgKzIyNCw3IEBACiAJfQogCiAJY3VybXNnID0gMDsKLQlyZXQgPSAtRVJFTU9URUlPOworCXJldCA9IC1FSU87CiAJd2hpbGUgKGN1cm1zZyA8IG51bSkgewogCQlzdGF0ZSA9IHBjYV9zdGF0dXMoYWRhcCk7CiAKQEAgLTI1OSw2ICsyNTksNyBAQAogCQljYXNlIDB4MjA6IC8qIFNMQStXIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBOT1QgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCiAJCQlERUIyKCJOT1QgQUNLIHJlY2VpdmVkIGFmdGVyIFNMQStXXG4iKTsKIAkJCXBjYV9zdG9wKGFkYXApOworCQkJcmV0ID0gLUVOWElPOwogCQkJZ290byBvdXQ7CiAKIAkJY2FzZSAweDQwOiAvKiBTTEErUiBoYXMgYmVlbiB0cmFuc21pdHRlZDsgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCkBAIC0yODMsNiArMjg0LDcgQEAKIAkJY2FzZSAweDQ4OiAvKiBTTEErUiBoYXMgYmVlbiB0cmFuc21pdHRlZDsgTk9UIEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLwogCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBTTEErUlxuIik7CiAJCQlwY2Ffc3RvcChhZGFwKTsKKwkJCXJldCA9IC1FTlhJTzsKIAkJCWdvdG8gb3V0OwogCiAJCWNhc2UgMHgzMDogLyogRGF0YSBieXRlIGluIEkyQ0RBVCBoYXMgYmVlbiB0cmFuc21pdHRlZDsgTk9UIEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwppbmRleCA2NDYwNjhlLi5hM2FmYWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwpAQCAtMTEwLDcgKzExMCw2IEBACiBjb25maWcgSTJDX0lTQ0gKIAl0cmlzdGF0ZSAiSW50ZWwgU0NIIFNNQnVzIDEuMCIKIAlkZXBlbmRzIG9uIFBDSQotCXNlbGVjdCBNRkRfQ09SRQogCXNlbGVjdCBMUENfU0NICiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgU01CdXMgY29udHJvbGxlciBvbiB0aGUgSW50ZWwgU0NICkBAIC0zMDEsNyArMzAwLDcgQEAKIAogY29uZmlnIEkyQ19BVTE1NTAKIAl0cmlzdGF0ZSAiQXUxNTUwL0F1MTIwMCBTTUJ1cyBpbnRlcmZhY2UiCi0JZGVwZW5kcyBvbiBTT0NfQVUxNTUwIHx8IFNPQ19BVTEyMDAKKwlkZXBlbmRzIG9uIE1JUFNfQUxDSEVNWQogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQogCSAgQXUxNTUwIGFuZCBBdTEyMDAgU01CdXMgaW50ZXJmYWNlLgpAQCAtMzUwLDE1ICszNDksMjUgQEAKIAkgIGRldmljZXMgc3VjaCBhcyBEYVZpbmNpIE5JQy4KIAkgIEZvciBkZXRhaWxzIHBsZWFzZSBzZWUgaHR0cDovL3d3dy50aS5jb20vZGF2aW5jaQogCi1jb25maWcgSTJDX0RFU0lHTldBUkUKLQl0cmlzdGF0ZSAiU3lub3BzeXMgRGVzaWduV2FyZSIKK2NvbmZpZyBJMkNfREVTSUdOV0FSRV9QTEFURk9STQorCXRyaXN0YXRlICJTeW5vcHN5cyBEZXNpZ25XYXJlIFBsYXRmcm9tIgogCWRlcGVuZHMgb24gSEFWRV9DTEsKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKIAkgIFN5bm9wc3lzIERlc2lnbldhcmUgSTJDIGFkYXB0ZXIuIE9ubHkgbWFzdGVyIG1vZGUgaXMgc3VwcG9ydGVkLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBpMmMtZGVzaWdud2FyZS4KKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1kZXNpZ253YXJlLXBsYXRmb3JtLgorCitjb25maWcgSTJDX0RFU0lHTldBUkVfUENJCisJdHJpc3RhdGUgIlN5bm9wc3lzIERlc2lnbldhcmUgUENJIgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlCisJICBTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBhZGFwdGVyLiBPbmx5IG1hc3RlciBtb2RlIGlzIHN1cHBvcnRlZC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWRlc2lnbndhcmUtcGNpLgogCiBjb25maWcgSTJDX0dQSU8KIAl0cmlzdGF0ZSAiR1BJTy1iYXNlZCBiaXRiYW5naW5nIEkyQyIKQEAgLTc4OSw3ICs3OTgsNyBAQAogCiBjb25maWcgSTJDX0VMRUtUT1IKIAl0cmlzdGF0ZSAiRWxla3RvciBJU0EgY2FyZCIKLQlkZXBlbmRzIG9uIElTQSAmJiBCUk9LRU5fT05fU01QCisJZGVwZW5kcyBvbiBJU0EgJiYgSEFTX0lPUE9SVCAmJiBCUk9LRU5fT05fU01QCiAJc2VsZWN0IEkyQ19BTEdPUENGCiAJaGVscAogCSAgVGhpcyBzdXBwb3J0cyB0aGUgUENGODU4NCBJU0EgYnVzIEkyQyBhZGFwdGVyLiAgU2F5IFkgaWYgeW91IG93bgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCmluZGV4IGU2Y2YyOTQuLmZiYTZkYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKQEAgLTMzLDcgKzMzLDEwIEBACiBvYmotJChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkJKz0gaTJjLWJmaW4tdHdpLm8KIG9iai0kKENPTkZJR19JMkNfQ1BNKQkJKz0gaTJjLWNwbS5vCiBvYmotJChDT05GSUdfSTJDX0RBVklOQ0kpCSs9IGkyYy1kYXZpbmNpLm8KLW9iai0kKENPTkZJR19JMkNfREVTSUdOV0FSRSkJKz0gaTJjLWRlc2lnbndhcmUubworb2JqLSQoQ09ORklHX0kyQ19ERVNJR05XQVJFX1BMQVRGT1JNKQkrPSBpMmMtZGVzaWdud2FyZS1wbGF0Zm9ybS5vCitpMmMtZGVzaWdud2FyZS1wbGF0Zm9ybS1vYmpzIDo9IGkyYy1kZXNpZ253YXJlLXBsYXRkcnYubyBpMmMtZGVzaWdud2FyZS1jb3JlLm8KK29iai0kKENPTkZJR19JMkNfREVTSUdOV0FSRV9QQ0kpCSs9IGkyYy1kZXNpZ253YXJlLXBjaS5vCitpMmMtZGVzaWdud2FyZS1wY2ktb2JqcyA6PSBpMmMtZGVzaWdud2FyZS1wY2lkcnYubyBpMmMtZGVzaWdud2FyZS1jb3JlLm8KIG9iai0kKENPTkZJR19JMkNfR1BJTykJCSs9IGkyYy1ncGlvLm8KIG9iai0kKENPTkZJR19JMkNfSElHSExBTkRFUikJKz0gaTJjLWhpZ2hsYW5kZXIubwogb2JqLSQoQ09ORklHX0kyQ19JQk1fSUlDKQkrPSBpMmMtaWJtX2lpYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF1MTU1MC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYwppbmRleCA1MzI4MjhiLi5mMzE0ZDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF1MTU1MC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXUxNTUwLmMKQEAgLTM2LDMyICszNiw0NCBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHguaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaD4KIAorI2RlZmluZSBQU0NfU0VMCQkweDAwCisjZGVmaW5lIFBTQ19DVFJMCTB4MDQKKyNkZWZpbmUgUFNDX1NNQkNGRwkweDA4CisjZGVmaW5lIFBTQ19TTUJNU0sJMHgwQworI2RlZmluZSBQU0NfU01CUENSCTB4MTAKKyNkZWZpbmUgUFNDX1NNQlNUQVQJMHgxNAorI2RlZmluZSBQU0NfU01CRVZOVAkweDE4CisjZGVmaW5lIFBTQ19TTUJUWFJYCTB4MUMKKyNkZWZpbmUgUFNDX1NNQlRNUgkweDIwCisKIHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgewotCXUzMglwc2NfYmFzZTsKKwl2b2lkIF9faW9tZW0gKnBzY19iYXNlOwogCWludAl4ZmVyX3RpbWVvdXQ7Ci0JaW50CWFja190aW1lb3V0OwogCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwOwogCXN0cnVjdCByZXNvdXJjZSAqaW9hcmVhOwogfTsKIAotc3RhdGljIGludAotd2FpdF94ZmVyX2RvbmUoc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUihzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphLCBpbnQgciwgdW5zaWduZWQgbG9uZyB2KQogewotCXUzMglzdGF0OwotCWludAlpOwotCXZvbGF0aWxlIHBzY19zbWJfdAkqc3A7CisJX19yYXdfd3JpdGVsKHYsIGEtPnBzY19iYXNlICsgcik7CisJd21iKCk7Cit9CiAKLQlzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKikoYWRhcC0+cHNjX2Jhc2UpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIFJEKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmEsIGludCByKQoreworCXJldHVybiBfX3Jhd19yZWFkbChhLT5wc2NfYmFzZSArIHIpOworfQogCi0JLyogV2FpdCBmb3IgVHggQnVmZmVyIEVtcHR5Ci0JKi8KK3N0YXRpYyBpbnQgd2FpdF94ZmVyX2RvbmUoc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCkKK3sKKwlpbnQgaTsKKworCS8qIFdhaXQgZm9yIFR4IEJ1ZmZlciBFbXB0eSAqLwogCWZvciAoaSA9IDA7IGkgPCBhZGFwLT54ZmVyX3RpbWVvdXQ7IGkrKykgewotCQlzdGF0ID0gc3AtPnBzY19zbWJzdGF0OwotCQlhdV9zeW5jKCk7Ci0JCWlmICgoc3RhdCAmIFBTQ19TTUJTVEFUX1RFKSAhPSAwKQorCQlpZiAoUkQoYWRhcCwgUFNDX1NNQlNUQVQpICYgUFNDX1NNQlNUQVRfVEUpCiAJCQlyZXR1cm4gMDsKIAogCQl1ZGVsYXkoMSk7CkBAIC03MCw0MSArODIsMjcgQEAKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAotc3RhdGljIGludAotd2FpdF9hY2soc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCkKK3N0YXRpYyBpbnQgd2FpdF9hY2soc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCkKIHsKLQl1MzIJc3RhdDsKLQl2b2xhdGlsZSBwc2Nfc21iX3QJKnNwOworCXVuc2lnbmVkIGxvbmcgc3RhdDsKIAogCWlmICh3YWl0X3hmZXJfZG9uZShhZGFwKSkKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAKLQlzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKikoYWRhcC0+cHNjX2Jhc2UpOwotCi0Jc3RhdCA9IHNwLT5wc2Nfc21iZXZudDsKLQlhdV9zeW5jKCk7Ci0KKwlzdGF0ID0gUkQoYWRhcCwgUFNDX1NNQkVWTlQpOwogCWlmICgoc3RhdCAmIChQU0NfU01CRVZOVF9ETiB8IFBTQ19TTUJFVk5UX0FOIHwgUFNDX1NNQkVWTlRfQUwpKSAhPSAwKQogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci13YWl0X21hc3Rlcl9kb25lKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXApCitzdGF0aWMgaW50IHdhaXRfbWFzdGVyX2RvbmUoc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCkKIHsKLQl1MzIJc3RhdDsKLQlpbnQJaTsKLQl2b2xhdGlsZSBwc2Nfc21iX3QJKnNwOworCWludCBpOwogCi0Jc3AgPSAodm9sYXRpbGUgcHNjX3NtYl90ICopKGFkYXAtPnBzY19iYXNlKTsKLQotCS8qIFdhaXQgZm9yIE1hc3RlciBEb25lLgotCSovCi0JZm9yIChpID0gMDsgaSA8IGFkYXAtPnhmZXJfdGltZW91dDsgaSsrKSB7Ci0JCXN0YXQgPSBzcC0+cHNjX3NtYmV2bnQ7Ci0JCWF1X3N5bmMoKTsKLQkJaWYgKChzdGF0ICYgUFNDX1NNQkVWTlRfTUQpICE9IDApCisJLyogV2FpdCBmb3IgTWFzdGVyIERvbmUuICovCisJZm9yIChpID0gMDsgaSA8IDIgKiBhZGFwLT54ZmVyX3RpbWVvdXQ7IGkrKykgeworCQlpZiAoKFJEKGFkYXAsIFBTQ19TTUJFVk5UKSAmIFBTQ19TTUJFVk5UX01EKSAhPSAwKQogCQkJcmV0dXJuIDA7CiAJCXVkZWxheSgxKTsKIAl9CkBAIC0xMTUsMjkgKzExMywyMCBAQAogc3RhdGljIGludAogZG9fYWRkcmVzcyhzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwLCB1bnNpZ25lZCBpbnQgYWRkciwgaW50IHJkLCBpbnQgcSkKIHsKLQl2b2xhdGlsZSBwc2Nfc21iX3QJKnNwOwotCXUzMgkJCXN0YXQ7CisJdW5zaWduZWQgbG9uZyBzdGF0OwogCi0Jc3AgPSAodm9sYXRpbGUgcHNjX3NtYl90ICopKGFkYXAtPnBzY19iYXNlKTsKLQotCS8qIFJlc2V0IHRoZSBGSUZPcywgY2xlYXIgZXZlbnRzLgotCSovCi0Jc3RhdCA9IHNwLT5wc2Nfc21ic3RhdDsKLQlzcC0+cHNjX3NtYmV2bnQgPSBQU0NfU01CRVZOVF9BTExDTFI7Ci0JYXVfc3luYygpOworCS8qIFJlc2V0IHRoZSBGSUZPcywgY2xlYXIgZXZlbnRzLiAqLworCXN0YXQgPSBSRChhZGFwLCBQU0NfU01CU1RBVCk7CisJV1IoYWRhcCwgUFNDX1NNQkVWTlQsIFBTQ19TTUJFVk5UX0FMTENMUik7CiAKIAlpZiAoIShzdGF0ICYgUFNDX1NNQlNUQVRfVEUpIHx8ICEoc3RhdCAmIFBTQ19TTUJTVEFUX1JFKSkgewotCQlzcC0+cHNjX3NtYnBjciA9IFBTQ19TTUJQQ1JfREM7Ci0JCWF1X3N5bmMoKTsKLQkJZG8gewotCQkJc3RhdCA9IHNwLT5wc2Nfc21icGNyOwotCQkJYXVfc3luYygpOwotCQl9IHdoaWxlICgoc3RhdCAmIFBTQ19TTUJQQ1JfREMpICE9IDApOworCQlXUihhZGFwLCBQU0NfU01CUENSLCBQU0NfU01CUENSX0RDKTsKKwkJd2hpbGUgKChSRChhZGFwLCBQU0NfU01CUENSKSAmIFBTQ19TTUJQQ1JfREMpICE9IDApCisJCQljcHVfcmVsYXgoKTsKIAkJdWRlbGF5KDUwKTsKIAl9CiAKLQkvKiBXcml0ZSBvdXQgdGhlIGkyYyBjaGlwIGFkZHJlc3MgYW5kIHNwZWNpZnkgb3BlcmF0aW9uCi0JKi8KKwkvKiBXcml0ZSBvdXQgdGhlIGkyYyBjaGlwIGFkZHJlc3MgYW5kIHNwZWNpZnkgb3BlcmF0aW9uICovCiAJYWRkciA8PD0gMTsKIAlpZiAocmQpCiAJCWFkZHIgfD0gMTsKQEAgLTE0Niw1NiArMTM1LDQyIEBACiAJaWYgKHEpCiAJCWFkZHIgfD0gUFNDX1NNQlRYUlhfU1RQOwogCi0JLyogUHV0IGJ5dGUgaW50byBmaWZvLCBzdGFydCB1cCBtYXN0ZXIuCi0JKi8KLQlzcC0+cHNjX3NtYnR4cnggPSBhZGRyOwotCWF1X3N5bmMoKTsKLQlzcC0+cHNjX3NtYnBjciA9IFBTQ19TTUJQQ1JfTVM7Ci0JYXVfc3luYygpOworCS8qIFB1dCBieXRlIGludG8gZmlmbywgc3RhcnQgdXAgbWFzdGVyLiAqLworCVdSKGFkYXAsIFBTQ19TTUJUWFJYLCBhZGRyKTsKKwlXUihhZGFwLCBQU0NfU01CUENSLCBQU0NfU01CUENSX01TKTsKIAlpZiAod2FpdF9hY2soYWRhcCkpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAocSkgPyB3YWl0X21hc3Rlcl9kb25lKGFkYXApIDogMDsKIH0KIAotc3RhdGljIHUzMgotd2FpdF9mb3JfcnhfYnl0ZShzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwLCB1MzIgKnJldF9kYXRhKQorc3RhdGljIGludCB3YWl0X2Zvcl9yeF9ieXRlKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXAsIHVuc2lnbmVkIGNoYXIgKm91dCkKIHsKLQlpbnQJajsKLQl1MzIJZGF0YSwgc3RhdDsKLQl2b2xhdGlsZSBwc2Nfc21iX3QJKnNwOworCWludCBqOwogCiAJaWYgKHdhaXRfeGZlcl9kb25lKGFkYXApKQogCQlyZXR1cm4gLUVJTzsKIAotCXNwID0gKHZvbGF0aWxlIHBzY19zbWJfdCAqKShhZGFwLT5wc2NfYmFzZSk7Ci0KIAlqID0gIGFkYXAtPnhmZXJfdGltZW91dCAqIDEwMDsKIAlkbyB7CiAJCWotLTsKIAkJaWYgKGogPD0gMCkKIAkJCXJldHVybiAtRUlPOwogCi0JCXN0YXQgPSBzcC0+cHNjX3NtYnN0YXQ7Ci0JCWF1X3N5bmMoKTsKLQkJaWYgKChzdGF0ICYgUFNDX1NNQlNUQVRfUkUpID09IDApCisJCWlmICgoUkQoYWRhcCwgUFNDX1NNQlNUQVQpICYgUFNDX1NNQlNUQVRfUkUpID09IDApCiAJCQlqID0gMDsKIAkJZWxzZQogCQkJdWRlbGF5KDEpOwogCX0gd2hpbGUgKGogPiAwKTsKLQlkYXRhID0gc3AtPnBzY19zbWJ0eHJ4OwotCWF1X3N5bmMoKTsKLQkqcmV0X2RhdGEgPSBkYXRhOworCisJKm91dCA9IFJEKGFkYXAsIFBTQ19TTUJUWFJYKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1pMmNfcmVhZChzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwLCB1bnNpZ25lZCBjaGFyICpidWYsCitzdGF0aWMgaW50IGkyY19yZWFkKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKIAkJICAgIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaW50CWk7Ci0JdTMyCWRhdGE7Ci0Jdm9sYXRpbGUgcHNjX3NtYl90CSpzcDsKKwlpbnQgaTsKIAogCWlmIChsZW4gPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC0yMDQsNjIgKzE3OSw0NiBAQAogCSAqIHplcm8gYnl0ZXMgZm9yIHRpbWluZywgd2FpdGluZyBmb3IgYnl0ZXMgdG8gYXBwZWFyIGluIHRoZQogCSAqIHJlY2VpdmUgZmlmbywgdGhlbiByZWFkaW5nIHRoZSBieXRlcy4KIAkgKi8KLQotCXNwID0gKHZvbGF0aWxlIHBzY19zbWJfdCAqKShhZGFwLT5wc2NfYmFzZSk7Ci0KIAlpID0gMDsKLQl3aGlsZSAoaSA8IChsZW4tMSkpIHsKLQkJc3AtPnBzY19zbWJ0eHJ4ID0gMDsKLQkJYXVfc3luYygpOwotCQlpZiAod2FpdF9mb3JfcnhfYnl0ZShhZGFwLCAmZGF0YSkpCisJd2hpbGUgKGkgPCAobGVuIC0gMSkpIHsKKwkJV1IoYWRhcCwgUFNDX1NNQlRYUlgsIDApOworCQlpZiAod2FpdF9mb3JfcnhfYnl0ZShhZGFwLCAmYnVmW2ldKSkKIAkJCXJldHVybiAtRUlPOwogCi0JCWJ1ZltpXSA9IGRhdGE7CiAJCWkrKzsKIAl9CiAKLQkvKiBUaGUgbGFzdCBieXRlIGhhcyB0byBpbmRpY2F0ZSB0cmFuc2ZlciBkb25lLgotCSovCi0Jc3AtPnBzY19zbWJ0eHJ4ID0gUFNDX1NNQlRYUlhfU1RQOwotCWF1X3N5bmMoKTsKKwkvKiBUaGUgbGFzdCBieXRlIGhhcyB0byBpbmRpY2F0ZSB0cmFuc2ZlciBkb25lLiAqLworCVdSKGFkYXAsIFBTQ19TTUJUWFJYLCBQU0NfU01CVFhSWF9TVFApOwogCWlmICh3YWl0X21hc3Rlcl9kb25lKGFkYXApKQogCQlyZXR1cm4gLUVJTzsKIAotCWRhdGEgPSBzcC0+cHNjX3NtYnR4cng7Ci0JYXVfc3luYygpOwotCWJ1ZltpXSA9IGRhdGE7CisJYnVmW2ldID0gKHVuc2lnbmVkIGNoYXIpKFJEKGFkYXAsIFBTQ19TTUJUWFJYKSAmIDB4ZmYpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1pMmNfd3JpdGUoc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCwgdW5zaWduZWQgY2hhciAqYnVmLAorc3RhdGljIGludCBpMmNfd3JpdGUoc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCwgdW5zaWduZWQgY2hhciAqYnVmLAogCQkgICAgIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaW50CWk7Ci0JdTMyCWRhdGE7Ci0Jdm9sYXRpbGUgcHNjX3NtYl90CSpzcDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CiAKIAlpZiAobGVuID09IDApCiAJCXJldHVybiAwOwogCi0Jc3AgPSAodm9sYXRpbGUgcHNjX3NtYl90ICopKGFkYXAtPnBzY19iYXNlKTsKLQogCWkgPSAwOwogCXdoaWxlIChpIDwgKGxlbi0xKSkgewogCQlkYXRhID0gYnVmW2ldOwotCQlzcC0+cHNjX3NtYnR4cnggPSBkYXRhOwotCQlhdV9zeW5jKCk7CisJCVdSKGFkYXAsIFBTQ19TTUJUWFJYLCBkYXRhKTsKIAkJaWYgKHdhaXRfYWNrKGFkYXApKQogCQkJcmV0dXJuIC1FSU87CiAJCWkrKzsKIAl9CiAKLQkvKiBUaGUgbGFzdCBieXRlIGhhcyB0byBpbmRpY2F0ZSB0cmFuc2ZlciBkb25lLgotCSovCisJLyogVGhlIGxhc3QgYnl0ZSBoYXMgdG8gaW5kaWNhdGUgdHJhbnNmZXIgZG9uZS4gKi8KIAlkYXRhID0gYnVmW2ldOwogCWRhdGEgfD0gUFNDX1NNQlRYUlhfU1RQOwotCXNwLT5wc2Nfc21idHhyeCA9IGRhdGE7Ci0JYXVfc3luYygpOworCVdSKGFkYXAsIFBTQ19TTUJUWFJYLCBkYXRhKTsKIAlpZiAod2FpdF9tYXN0ZXJfZG9uZShhZGFwKSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CkBAIC0yNjksMTIgKzIyOCwxMCBAQAogYXUxNTUwX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCiB7CiAJc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7Ci0Jdm9sYXRpbGUgcHNjX3NtYl90ICpzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKilhZGFwLT5wc2NfYmFzZTsKIAlzdHJ1Y3QgaTJjX21zZyAqcDsKIAlpbnQgaSwgZXJyID0gMDsKIAotCXNwLT5wc2NfY3RybCA9IFBTQ19DVFJMX0VOQUJMRTsKLQlhdV9zeW5jKCk7CisJV1IoYWRhcCwgUFNDX0NUUkwsIFBTQ19DVFJMX0VOQUJMRSk7CiAKIAlmb3IgKGkgPSAwOyAhZXJyICYmIGkgPCBudW07IGkrKykgewogCQlwID0gJm1zZ3NbaV07CkBAIC0yOTMsMTQgKzI1MCwxMiBAQAogCWlmIChlcnIgPT0gMCkKIAkJZXJyID0gbnVtOwogCi0Jc3AtPnBzY19jdHJsID0gUFNDX0NUUkxfU1VTUEVORDsKLQlhdV9zeW5jKCk7CisJV1IoYWRhcCwgUFNDX0NUUkwsIFBTQ19DVFJMX1NVU1BFTkQpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHUzMgotYXUxNTUwX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQorc3RhdGljIHUzMiBhdTE1NTBfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCiB7CiAJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUw7CiB9CkBAIC0zMTIsNTcgKzI2Nyw0NSBAQAogCiBzdGF0aWMgdm9pZCBpMmNfYXUxNTUwX3NldHVwKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKnByaXYpCiB7Ci0Jdm9sYXRpbGUgcHNjX3NtYl90ICpzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKilwcml2LT5wc2NfYmFzZTsKLQl1MzIgc3RhdDsKKwl1bnNpZ25lZCBsb25nIGNmZzsKIAotCXNwLT5wc2NfY3RybCA9IFBTQ19DVFJMX0RJU0FCTEU7Ci0JYXVfc3luYygpOwotCXNwLT5wc2Nfc2VsID0gUFNDX1NFTF9QU19TTUJVU01PREU7Ci0Jc3AtPnBzY19zbWJjZmcgPSAwOwotCWF1X3N5bmMoKTsKLQlzcC0+cHNjX2N0cmwgPSBQU0NfQ1RSTF9FTkFCTEU7Ci0JYXVfc3luYygpOwotCWRvIHsKLQkJc3RhdCA9IHNwLT5wc2Nfc21ic3RhdDsKLQkJYXVfc3luYygpOwotCX0gd2hpbGUgKChzdGF0ICYgUFNDX1NNQlNUQVRfU1IpID09IDApOworCVdSKHByaXYsIFBTQ19DVFJMLCBQU0NfQ1RSTF9ESVNBQkxFKTsKKwlXUihwcml2LCBQU0NfU0VMLCBQU0NfU0VMX1BTX1NNQlVTTU9ERSk7CisJV1IocHJpdiwgUFNDX1NNQkNGRywgMCk7CisJV1IocHJpdiwgUFNDX0NUUkwsIFBTQ19DVFJMX0VOQUJMRSk7CisJd2hpbGUgKChSRChwcml2LCBQU0NfU01CU1RBVCkgJiBQU0NfU01CU1RBVF9TUikgPT0gMCkKKwkJY3B1X3JlbGF4KCk7CiAKLQlzcC0+cHNjX3NtYmNmZyA9IChQU0NfU01CQ0ZHX1JUX0ZJRk84IHwgUFNDX1NNQkNGR19UVF9GSUZPOCB8Ci0JCQkJUFNDX1NNQkNGR19ERF9ESVNBQkxFKTsKKwljZmcgPSBQU0NfU01CQ0ZHX1JUX0ZJRk84IHwgUFNDX1NNQkNGR19UVF9GSUZPOCB8IFBTQ19TTUJDRkdfRERfRElTQUJMRTsKKwlXUihwcml2LCBQU0NfU01CQ0ZHLCBjZmcpOwogCiAJLyogRGl2aWRlIGJ5IDggdG8gZ2V0IGEgNi4yNSBNSHogY2xvY2suICBUaGUgbGF0ZXIgcHJvdG9jb2wKIAkgKiB0aW1pbmdzIGFyZSBiYXNlZCBvbiB0aGlzIGNsb2NrLgogCSAqLwotCXNwLT5wc2Nfc21iY2ZnIHw9IFBTQ19TTUJDRkdfU0VUX0RJVihQU0NfU01CQ0ZHX0RJVjgpOwotCXNwLT5wc2Nfc21ibXNrID0gUFNDX1NNQk1TS19BTExNQVNLOwotCWF1X3N5bmMoKTsKKwljZmcgfD0gUFNDX1NNQkNGR19TRVRfRElWKFBTQ19TTUJDRkdfRElWOCk7CisJV1IocHJpdiwgUFNDX1NNQkNGRywgY2ZnKTsKKwlXUihwcml2LCBQU0NfU01CTVNLLCBQU0NfU01CTVNLX0FMTE1BU0spOwogCiAJLyogU2V0IHRoZSBwcm90b2NvbCB0aW1lciB2YWx1ZXMuICBTZWUgVGFibGUgNzEgaW4gdGhlCiAJICogQXUxNTUwIERhdGEgQm9vayBmb3Igc3RhbmRhcmQgdGltaW5nIHZhbHVlcy4KIAkgKi8KLQlzcC0+cHNjX3NtYnRtciA9IFBTQ19TTUJUTVJfU0VUX1RIKDApIHwgUFNDX1NNQlRNUl9TRVRfUFMoMTUpIHwgXAorCVdSKHByaXYsIFBTQ19TTUJUTVIsIFBTQ19TTUJUTVJfU0VUX1RIKDApIHwgUFNDX1NNQlRNUl9TRVRfUFMoMTUpIHwgXAogCQlQU0NfU01CVE1SX1NFVF9QVSgxNSkgfCBQU0NfU01CVE1SX1NFVF9TSCgxNSkgfCBcCiAJCVBTQ19TTUJUTVJfU0VUX1NVKDE1KSB8IFBTQ19TTUJUTVJfU0VUX0NMKDE1KSB8IFwKLQkJUFNDX1NNQlRNUl9TRVRfQ0goMTUpOwotCWF1X3N5bmMoKTsKKwkJUFNDX1NNQlRNUl9TRVRfQ0goMTUpKTsKIAotCXNwLT5wc2Nfc21iY2ZnIHw9IFBTQ19TTUJDRkdfREVfRU5BQkxFOwotCWRvIHsKLQkJc3RhdCA9IHNwLT5wc2Nfc21ic3RhdDsKLQkJYXVfc3luYygpOwotCX0gd2hpbGUgKChzdGF0ICYgUFNDX1NNQlNUQVRfU1IpID09IDApOworCWNmZyB8PSBQU0NfU01CQ0ZHX0RFX0VOQUJMRTsKKwlXUihwcml2LCBQU0NfU01CQ0ZHLCBjZmcpOworCXdoaWxlICgoUkQocHJpdiwgUFNDX1NNQlNUQVQpICYgUFNDX1NNQlNUQVRfU1IpID09IDApCisJCWNwdV9yZWxheCgpOwogCi0Jc3AtPnBzY19jdHJsID0gUFNDX0NUUkxfU1VTUEVORDsKLQlhdV9zeW5jKCk7CisJV1IocHJpdiwgUFNDX0NUUkwsIFBTQ19DVFJMX1NVU1BFTkQpOwogfQogCiBzdGF0aWMgdm9pZCBpMmNfYXUxNTUwX2Rpc2FibGUoc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqcHJpdikKIHsKLQl2b2xhdGlsZSBwc2Nfc21iX3QgKnNwID0gKHZvbGF0aWxlIHBzY19zbWJfdCAqKXByaXYtPnBzY19iYXNlOwotCi0Jc3AtPnBzY19zbWJjZmcgPSAwOwotCXNwLT5wc2NfY3RybCA9IFBTQ19DVFJMX0RJU0FCTEU7Ci0JYXVfc3luYygpOworCVdSKHByaXYsIFBTQ19TTUJDRkcsIDApOworCVdSKHByaXYsIFBTQ19DVFJMLCBQU0NfQ1RSTF9ESVNBQkxFKTsKIH0KIAogLyoKQEAgLTM5Niw5ICszMzksMTIgQEAKIAkJZ290byBvdXRfbWVtOwogCX0KIAotCXByaXYtPnBzY19iYXNlID0gQ0tTRUcxQUREUihyLT5zdGFydCk7CisJcHJpdi0+cHNjX2Jhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlpZiAoIXByaXYtPnBzY19iYXNlKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X21hcDsKKwl9CiAJcHJpdi0+eGZlcl90aW1lb3V0ID0gMjAwOwotCXByaXYtPmFja190aW1lb3V0ID0gMjAwOwogCiAJcHJpdi0+YWRhcC5uciA9IHBkZXYtPmlkOwogCXByaXYtPmFkYXAuYWxnbyA9ICZhdTE1NTBfYWxnbzsKQEAgLTQwNiw4ICszNTIsNyBAQAogCXByaXYtPmFkYXAuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAJc3RybGNweShwcml2LT5hZGFwLm5hbWUsICJBdTF4eHggUFNDIEkyQyIsIHNpemVvZihwcml2LT5hZGFwLm5hbWUpKTsKIAotCS8qIE5vdywgc2V0IHVwIHRoZSBQU0MgZm9yIFNNQnVzIFBJTyBtb2RlLgotCSovCisJLyogTm93LCBzZXQgdXAgdGhlIFBTQyBmb3IgU01CdXMgUElPIG1vZGUuICovCiAJaTJjX2F1MTU1MF9zZXR1cChwcml2KTsKIAogCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcigmcHJpdi0+YWRhcCk7CkBAIC00MTcsNyArMzYyLDggQEAKIAl9CiAKIAlpMmNfYXUxNTUwX2Rpc2FibGUocHJpdik7Ci0KKwlpb3VubWFwKHByaXYtPnBzY19iYXNlKTsKK291dF9tYXA6CiAJcmVsZWFzZV9yZXNvdXJjZShwcml2LT5pb2FyZWEpOwogCWtmcmVlKHByaXYtPmlvYXJlYSk7CiBvdXRfbWVtOgpAQCAtNDI2LDE0ICszNzIsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdAotaTJjX2F1MTU1MF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGkyY19hdTE1NTBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaTJjX2RlbF9hZGFwdGVyKCZwcml2LT5hZGFwKTsKIAlpMmNfYXUxNTUwX2Rpc2FibGUocHJpdik7CisJaW91bm1hcChwcml2LT5wc2NfYmFzZSk7CiAJcmVsZWFzZV9yZXNvdXJjZShwcml2LT5pb2FyZWEpOwogCWtmcmVlKHByaXYtPmlvYXJlYSk7CiAJa2ZyZWUocHJpdik7CkBAIC00NDEsNDkgKzM4Nyw1MSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50Ci1pMmNfYXUxNTUwX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBpMmNfYXUxNTUwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpMmNfYXUxNTUwX2Rpc2FibGUocHJpdik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotaTJjX2F1MTU1MF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaTJjX2F1MTU1MF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpMmNfYXUxNTUwX3NldHVwKHByaXYpOwogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpMmNfYXUxNTUwX3Btb3BzID0geworCS5zdXNwZW5kCT0gaTJjX2F1MTU1MF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaTJjX2F1MTU1MF9yZXN1bWUsCit9OworCisjZGVmaW5lIEFVMVhQU0NfU01CVVNfUE1PUFMgKCZpMmNfYXUxNTUwX3Btb3BzKQorCiAjZWxzZQotI2RlZmluZSBpMmNfYXUxNTUwX3N1c3BlbmQJTlVMTAotI2RlZmluZSBpMmNfYXUxNTUwX3Jlc3VtZQlOVUxMCisjZGVmaW5lIEFVMVhQU0NfU01CVVNfUE1PUFMgTlVMTAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1MXhwc2Nfc21idXNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImF1MXhwc2Nfc21idXMiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gQVUxWFBTQ19TTUJVU19QTU9QUywKIAl9LAogCS5wcm9iZQkJPSBpMmNfYXUxNTUwX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaTJjX2F1MTU1MF9yZW1vdmUpLAotCS5zdXNwZW5kCT0gaTJjX2F1MTU1MF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gaTJjX2F1MTU1MF9yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdAotaTJjX2F1MTU1MF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpMmNfYXUxNTUwX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdTF4cHNjX3NtYnVzX2RyaXZlcik7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotaTJjX2F1MTU1MF9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX2F1MTU1MF9leGl0KHZvaWQpCiB7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1MXhwc2Nfc21idXNfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYwppbmRleCBjYmM5OGFlLi5jZGI1OWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jCkBAIC02MzEsNyArNjMxLDcgQEAKIAlzdHJ1Y3QgYmZpbl90d2lfaWZhY2UgKmlmYWNlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlpbnQgcmMgPSByZXF1ZXN0X2lycShpZmFjZS0+aXJxLCBiZmluX3R3aV9pbnRlcnJ1cHRfZW50cnksCi0JCUlSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIGlmYWNlKTsKKwkJMCwgcGRldi0+bmFtZSwgaWZhY2UpOwogCWlmIChyYykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgSVJRICVkICFcbiIsIGlmYWNlLT5pcnEpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTcwMiw3ICs3MDIsNyBAQAogCX0KIAogCXJjID0gcmVxdWVzdF9pcnEoaWZhY2UtPmlycSwgYmZpbl90d2lfaW50ZXJydXB0X2VudHJ5LAotCQlJUlFGX0RJU0FCTEVELCBwZGV2LT5uYW1lLCBpZmFjZSk7CisJCTAsIHBkZXYtPm5hbWUsIGlmYWNlKTsKIAlpZiAocmMpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IElSUSAlZCAhXG4iLCBpZmFjZS0+aXJxKTsKIAkJcmMgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4Nzk5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmMKQEAgLTAsMCArMSw3MDUgQEAKKy8qCisgKiBTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBhZGFwdGVyIGRyaXZlciAobWFzdGVyIG9ubHkpLgorICoKKyAqIEJhc2VkIG9uIHRoZSBUSSBEQVZJTkNJIEkyQyBhZGFwdGVyIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUHJvdmlnZW50IEx0ZC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImkyYy1kZXNpZ253YXJlLWNvcmUuaCIKKworLyoKKyAqIFJlZ2lzdGVycyBvZmZzZXQKKyAqLworI2RlZmluZSBEV19JQ19DT04JCTB4MAorI2RlZmluZSBEV19JQ19UQVIJCTB4NAorI2RlZmluZSBEV19JQ19EQVRBX0NNRAkJMHgxMAorI2RlZmluZSBEV19JQ19TU19TQ0xfSENOVAkweDE0CisjZGVmaW5lIERXX0lDX1NTX1NDTF9MQ05UCTB4MTgKKyNkZWZpbmUgRFdfSUNfRlNfU0NMX0hDTlQJMHgxYworI2RlZmluZSBEV19JQ19GU19TQ0xfTENOVAkweDIwCisjZGVmaW5lIERXX0lDX0lOVFJfU1RBVAkJMHgyYworI2RlZmluZSBEV19JQ19JTlRSX01BU0sJCTB4MzAKKyNkZWZpbmUgRFdfSUNfUkFXX0lOVFJfU1RBVAkweDM0CisjZGVmaW5lIERXX0lDX1JYX1RMCQkweDM4CisjZGVmaW5lIERXX0lDX1RYX1RMCQkweDNjCisjZGVmaW5lIERXX0lDX0NMUl9JTlRSCQkweDQwCisjZGVmaW5lIERXX0lDX0NMUl9SWF9VTkRFUgkweDQ0CisjZGVmaW5lIERXX0lDX0NMUl9SWF9PVkVSCTB4NDgKKyNkZWZpbmUgRFdfSUNfQ0xSX1RYX09WRVIJMHg0YworI2RlZmluZSBEV19JQ19DTFJfUkRfUkVRCTB4NTAKKyNkZWZpbmUgRFdfSUNfQ0xSX1RYX0FCUlQJMHg1NAorI2RlZmluZSBEV19JQ19DTFJfUlhfRE9ORQkweDU4CisjZGVmaW5lIERXX0lDX0NMUl9BQ1RJVklUWQkweDVjCisjZGVmaW5lIERXX0lDX0NMUl9TVE9QX0RFVAkweDYwCisjZGVmaW5lIERXX0lDX0NMUl9TVEFSVF9ERVQJMHg2NAorI2RlZmluZSBEV19JQ19DTFJfR0VOX0NBTEwJMHg2OAorI2RlZmluZSBEV19JQ19FTkFCTEUJCTB4NmMKKyNkZWZpbmUgRFdfSUNfU1RBVFVTCQkweDcwCisjZGVmaW5lIERXX0lDX1RYRkxSCQkweDc0CisjZGVmaW5lIERXX0lDX1JYRkxSCQkweDc4CisjZGVmaW5lIERXX0lDX1RYX0FCUlRfU09VUkNFCTB4ODAKKyNkZWZpbmUgRFdfSUNfQ09NUF9QQVJBTV8xCTB4ZjQKKyNkZWZpbmUgRFdfSUNfQ09NUF9UWVBFCQkweGZjCisjZGVmaW5lIERXX0lDX0NPTVBfVFlQRV9WQUxVRQkweDQ0NTcwMTQwCisKKyNkZWZpbmUgRFdfSUNfSU5UUl9SWF9VTkRFUgkweDAwMQorI2RlZmluZSBEV19JQ19JTlRSX1JYX09WRVIJMHgwMDIKKyNkZWZpbmUgRFdfSUNfSU5UUl9SWF9GVUxMCTB4MDA0CisjZGVmaW5lIERXX0lDX0lOVFJfVFhfT1ZFUgkweDAwOAorI2RlZmluZSBEV19JQ19JTlRSX1RYX0VNUFRZCTB4MDEwCisjZGVmaW5lIERXX0lDX0lOVFJfUkRfUkVRCTB4MDIwCisjZGVmaW5lIERXX0lDX0lOVFJfVFhfQUJSVAkweDA0MAorI2RlZmluZSBEV19JQ19JTlRSX1JYX0RPTkUJMHgwODAKKyNkZWZpbmUgRFdfSUNfSU5UUl9BQ1RJVklUWQkweDEwMAorI2RlZmluZSBEV19JQ19JTlRSX1NUT1BfREVUCTB4MjAwCisjZGVmaW5lIERXX0lDX0lOVFJfU1RBUlRfREVUCTB4NDAwCisjZGVmaW5lIERXX0lDX0lOVFJfR0VOX0NBTEwJMHg4MDAKKworI2RlZmluZSBEV19JQ19JTlRSX0RFRkFVTFRfTUFTSwkJKERXX0lDX0lOVFJfUlhfRlVMTCB8IFwKKwkJCQkJIERXX0lDX0lOVFJfVFhfRU1QVFkgfCBcCisJCQkJCSBEV19JQ19JTlRSX1RYX0FCUlQgfCBcCisJCQkJCSBEV19JQ19JTlRSX1NUT1BfREVUKQorCisjZGVmaW5lIERXX0lDX1NUQVRVU19BQ1RJVklUWQkweDEKKworI2RlZmluZSBEV19JQ19FUlJfVFhfQUJSVAkweDEKKworLyoKKyAqIHN0YXR1cyBjb2RlcworICovCisjZGVmaW5lIFNUQVRVU19JRExFCQkJMHgwCisjZGVmaW5lIFNUQVRVU19XUklURV9JTl9QUk9HUkVTUwkweDEKKyNkZWZpbmUgU1RBVFVTX1JFQURfSU5fUFJPR1JFU1MJCTB4MgorCisjZGVmaW5lIFRJTUVPVVQJCQkyMCAvKiBtcyAqLworCisvKgorICogaGFyZHdhcmUgYWJvcnQgY29kZXMgZnJvbSB0aGUgRFdfSUNfVFhfQUJSVF9TT1VSQ0UgcmVnaXN0ZXIKKyAqCisgKiBvbmx5IGV4cGVjdGVkIGFib3J0IGNvZGVzIGFyZSBsaXN0ZWQgaGVyZQorICogcmVmZXIgdG8gdGhlIGRhdGFzaGVldCBmb3IgdGhlIGZ1bGwgbGlzdAorICovCisjZGVmaW5lIEFCUlRfN0JfQUREUl9OT0FDSwkwCisjZGVmaW5lIEFCUlRfMTBBRERSMV9OT0FDSwkxCisjZGVmaW5lIEFCUlRfMTBBRERSMl9OT0FDSwkyCisjZGVmaW5lIEFCUlRfVFhEQVRBX05PQUNLCTMKKyNkZWZpbmUgQUJSVF9HQ0FMTF9OT0FDSwk0CisjZGVmaW5lIEFCUlRfR0NBTExfUkVBRAkJNQorI2RlZmluZSBBQlJUX1NCWVRFX0FDS0RFVAk3CisjZGVmaW5lIEFCUlRfU0JZVEVfTk9SU1RSVAk5CisjZGVmaW5lIEFCUlRfMTBCX1JEX05PUlNUUlQJMTAKKyNkZWZpbmUgQUJSVF9NQVNURVJfRElTCQkxMQorI2RlZmluZSBBUkJfTE9TVAkJMTIKKworI2RlZmluZSBEV19JQ19UWF9BQlJUXzdCX0FERFJfTk9BQ0sJKDFVTCA8PCBBQlJUXzdCX0FERFJfTk9BQ0spCisjZGVmaW5lIERXX0lDX1RYX0FCUlRfMTBBRERSMV9OT0FDSwkoMVVMIDw8IEFCUlRfMTBBRERSMV9OT0FDSykKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF8xMEFERFIyX05PQUNLCSgxVUwgPDwgQUJSVF8xMEFERFIyX05PQUNLKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX1RYREFUQV9OT0FDSwkoMVVMIDw8IEFCUlRfVFhEQVRBX05PQUNLKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX0dDQUxMX05PQUNLCSgxVUwgPDwgQUJSVF9HQ0FMTF9OT0FDSykKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF9HQ0FMTF9SRUFECSgxVUwgPDwgQUJSVF9HQ0FMTF9SRUFEKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX1NCWVRFX0FDS0RFVAkoMVVMIDw8IEFCUlRfU0JZVEVfQUNLREVUKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX1NCWVRFX05PUlNUUlQJKDFVTCA8PCBBQlJUX1NCWVRFX05PUlNUUlQpCisjZGVmaW5lIERXX0lDX1RYX0FCUlRfMTBCX1JEX05PUlNUUlQJKDFVTCA8PCBBQlJUXzEwQl9SRF9OT1JTVFJUKQorI2RlZmluZSBEV19JQ19UWF9BQlJUX01BU1RFUl9ESVMJKDFVTCA8PCBBQlJUX01BU1RFUl9ESVMpCisjZGVmaW5lIERXX0lDX1RYX0FSQl9MT1NUCQkoMVVMIDw8IEFSQl9MT1NUKQorCisjZGVmaW5lIERXX0lDX1RYX0FCUlRfTk9BQ0sJCShEV19JQ19UWF9BQlJUXzdCX0FERFJfTk9BQ0sgfCBcCisJCQkJCSBEV19JQ19UWF9BQlJUXzEwQUREUjFfTk9BQ0sgfCBcCisJCQkJCSBEV19JQ19UWF9BQlJUXzEwQUREUjJfTk9BQ0sgfCBcCisJCQkJCSBEV19JQ19UWF9BQlJUX1RYREFUQV9OT0FDSyB8IFwKKwkJCQkJIERXX0lDX1RYX0FCUlRfR0NBTExfTk9BQ0spCisKK3N0YXRpYyBjaGFyICphYm9ydF9zb3VyY2VzW10gPSB7CisJW0FCUlRfN0JfQUREUl9OT0FDS10gPQorCQkic2xhdmUgYWRkcmVzcyBub3QgYWNrbm93bGVkZ2VkICg3Yml0IG1vZGUpIiwKKwlbQUJSVF8xMEFERFIxX05PQUNLXSA9CisJCSJmaXJzdCBhZGRyZXNzIGJ5dGUgbm90IGFja25vd2xlZGdlZCAoMTBiaXQgbW9kZSkiLAorCVtBQlJUXzEwQUREUjJfTk9BQ0tdID0KKwkJInNlY29uZCBhZGRyZXNzIGJ5dGUgbm90IGFja25vd2xlZGdlZCAoMTBiaXQgbW9kZSkiLAorCVtBQlJUX1RYREFUQV9OT0FDS10gPQorCQkiZGF0YSBub3QgYWNrbm93bGVkZ2VkIiwKKwlbQUJSVF9HQ0FMTF9OT0FDS10gPQorCQkibm8gYWNrbm93bGVkZ2VtZW50IGZvciBhIGdlbmVyYWwgY2FsbCIsCisJW0FCUlRfR0NBTExfUkVBRF0gPQorCQkicmVhZCBhZnRlciBnZW5lcmFsIGNhbGwiLAorCVtBQlJUX1NCWVRFX0FDS0RFVF0gPQorCQkic3RhcnQgYnl0ZSBhY2tub3dsZWRnZWQiLAorCVtBQlJUX1NCWVRFX05PUlNUUlRdID0KKwkJInRyeWluZyB0byBzZW5kIHN0YXJ0IGJ5dGUgd2hlbiByZXN0YXJ0IGlzIGRpc2FibGVkIiwKKwlbQUJSVF8xMEJfUkRfTk9SU1RSVF0gPQorCQkidHJ5aW5nIHRvIHJlYWQgd2hlbiByZXN0YXJ0IGlzIGRpc2FibGVkICgxMGJpdCBtb2RlKSIsCisJW0FCUlRfTUFTVEVSX0RJU10gPQorCQkidHJ5aW5nIHRvIHVzZSBkaXNhYmxlZCBhZGFwdGVyIiwKKwlbQVJCX0xPU1RdID0KKwkJImxvc3QgYXJiaXRyYXRpb24iLAorfTsKKwordTMyIGR3X3JlYWRsKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYsIGludCBvZmZzZXQpCit7CisJdTMyIHZhbHVlID0gcmVhZGwoZGV2LT5iYXNlICsgb2Zmc2V0KTsKKworCWlmIChkZXYtPnN3YWIpCisJCXJldHVybiBzd2FiMzIodmFsdWUpOworCWVsc2UKKwkJcmV0dXJuIHZhbHVlOworfQorCit2b2lkIGR3X3dyaXRlbChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2LCB1MzIgYiwgaW50IG9mZnNldCkKK3sKKwlpZiAoZGV2LT5zd2FiKQorCQliID0gc3dhYjMyKGIpOworCisJd3JpdGVsKGIsIGRldi0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB1MzIKK2kyY19kd19zY2xfaGNudCh1MzIgaWNfY2xrLCB1MzIgdFNZTUJPTCwgdTMyIHRmLCBpbnQgY29uZCwgaW50IG9mZnNldCkKK3sKKwkvKgorCSAqIERlc2lnbldhcmUgSTJDIGNvcmUgZG9lc24ndCBzZWVtIHRvIGhhdmUgc29saWQgc3RyYXRlZ3kgdG8gbWVldAorCSAqIHRoZSB0SEQ7U1RBIHRpbWluZyBzcGVjLiAgQ29uZmlndXJpbmcgX0hDTlQgYmFzZWQgb24gdEhJR0ggc3BlYworCSAqIHdpbGwgcmVzdWx0IGluIHZpb2xhdGlvbiBvZiB0aGUgdEhEO1NUQSBzcGVjLgorCSAqLworCWlmIChjb25kKQorCQkvKgorCQkgKiBDb25kaXRpb25hbCBleHByZXNzaW9uOgorCQkgKgorCQkgKiAgIElDX1tGU11TX1NDTF9IQ05UICsgKDErNCszKSA+PSBJQ19DTEsgKiB0SElHSAorCQkgKgorCQkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBEVyBtYW51YWxzLCBhbmQgcmVwcmVzZW50cyBhbiBpZGVhbAorCQkgKiBjb25maWd1cmF0aW9uLiAgVGhlIHJlc3VsdGluZyBJMkMgYnVzIHNwZWVkIHdpbGwgYmUKKwkJICogZmFzdGVyIHRoYW4gYW55IG9mIHRoZSBvdGhlcnMuCisJCSAqCisJCSAqIElmIHlvdXIgaGFyZHdhcmUgaXMgZnJlZSBmcm9tIHRIRDtTVEEgaXNzdWUsIHRyeSB0aGlzIG9uZS4KKwkJICovCisJCXJldHVybiAoaWNfY2xrICogdFNZTUJPTCArIDUwMDApIC8gMTAwMDAgLSA4ICsgb2Zmc2V0OworCWVsc2UKKwkJLyoKKwkJICogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbjoKKwkJICoKKwkJICogICBJQ19bRlNdU19TQ0xfSENOVCArIDMgPj0gSUNfQ0xLICogKHRIRDtTVEEgKyB0ZikKKwkJICoKKwkJICogVGhpcyBpcyBqdXN0IGV4cGVyaW1lbnRhbCBydWxlOyB0aGUgdEhEO1NUQSBwZXJpb2QgdHVybmVkCisJCSAqIG91dCB0byBiZSBwcm9wb3J0aW5hbCB0byAoX0hDTlQgKyAzKS4gIFdpdGggdGhpcyBzZXR0aW5nLAorCQkgKiB3ZSBjb3VsZCBtZWV0IGJvdGggdEhJR0ggYW5kIHRIRDtTVEEgdGltaW5nIHNwZWNzLgorCQkgKgorCQkgKiBJZiB1bnN1cmUsIHlvdSdkIGJldHRlciB0byB0YWtlIHRoaXMgYWx0ZXJuYXRpdmUuCisJCSAqCisJCSAqIFRoZSByZWFzb24gd2h5IHdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgInRmIiBoZXJlLAorCQkgKiBpcyB0aGUgc2FtZSBhcyBkZXNjcmliZWQgaW4gaTJjX2R3X3NjbF9sY250KCkuCisJCSAqLworCQlyZXR1cm4gKGljX2NsayAqICh0U1lNQk9MICsgdGYpICsgNTAwMCkgLyAxMDAwMCAtIDMgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyB1MzIgaTJjX2R3X3NjbF9sY250KHUzMiBpY19jbGssIHUzMiB0TE9XLCB1MzIgdGYsIGludCBvZmZzZXQpCit7CisJLyoKKwkgKiBDb25kaXRpb25hbCBleHByZXNzaW9uOgorCSAqCisJICogICBJQ19bRlNdU19TQ0xfTENOVCArIDEgPj0gSUNfQ0xLICogKHRMT1cgKyB0ZikKKwkgKgorCSAqIERXIEkyQyBjb3JlIHN0YXJ0cyBjb3VudGluZyB0aGUgU0NMIENOVHMgZm9yIHRoZSBMT1cgcGVyaW9kCisJICogb2YgdGhlIFNDTCBjbG9jayAodExPVykgYXMgc29vbiBhcyBpdCBwdWxscyB0aGUgU0NMIGxpbmUuCisJICogSW4gb3JkZXIgdG8gbWVldCB0aGUgdExPVyB0aW1pbmcgc3BlYywgd2UgbmVlZCB0byB0YWtlIGludG8KKwkgKiBhY2NvdW50IHRoZSBmYWxsIHRpbWUgb2YgU0NMIHNpZ25hbCAodGYpLiAgRGVmYXVsdCB0ZiB2YWx1ZQorCSAqIHNob3VsZCBiZSAwLjMgdXMsIGZvciBzYWZldHkuCisJICovCisJcmV0dXJuICgoaWNfY2xrICogKHRMT1cgKyB0ZikgKyA1MDAwKSAvIDEwMDAwKSAtIDEgKyBvZmZzZXQ7Cit9CisKKy8qKgorICogaTJjX2R3X2luaXQoKSAtIGluaXRpYWxpemUgdGhlIGRlc2lnbndhcmUgaTJjIG1hc3RlciBoYXJkd2FyZQorICogQGRldjogZGV2aWNlIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb25zIGNvbmZpZ3VyZXMgYW5kIGVuYWJsZXMgdGhlIEkyQyBtYXN0ZXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgSTJDIGluaXQgZnVuY3Rpb24sIGFuZCBpbiBjYXNlIG9mIHRpbWVvdXQgYXQKKyAqIHJ1biB0aW1lLgorICovCitpbnQgaTJjX2R3X2luaXQoc3RydWN0IGR3X2kyY19kZXYgKmRldikKK3sKKwl1MzIgaW5wdXRfY2xvY2tfa2h6OworCXUzMiBoY250LCBsY250OworCXUzMiByZWc7CisKKwlpbnB1dF9jbG9ja19raHogPSBkZXYtPmdldF9jbGtfcmF0ZV9raHooZGV2KTsKKworCS8qIENvbmZpZ3VyZSByZWdpc3RlciBlbmRpYW5lc3MgYWNjZXNzICovCisJcmVnID0gZHdfcmVhZGwoZGV2LCBEV19JQ19DT01QX1RZUEUpOworCWlmIChyZWcgPT0gX19fY29uc3RhbnRfc3dhYjMyKERXX0lDX0NPTVBfVFlQRV9WQUxVRSkpIHsKKwkJZGV2LT5zd2FiID0gMTsKKwkJcmVnID0gRFdfSUNfQ09NUF9UWVBFX1ZBTFVFOworCX0KKworCWlmIChyZWcgIT0gRFdfSUNfQ09NUF9UWVBFX1ZBTFVFKSB7CisJCWRldl9lcnIoZGV2LT5kZXYsICJVbmtub3duIFN5bm9wc3lzIGNvbXBvbmVudCB0eXBlOiAiCisJCQkiMHglMDh4XG4iLCByZWcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBEaXNhYmxlIHRoZSBhZGFwdGVyICovCisJZHdfd3JpdGVsKGRldiwgMCwgRFdfSUNfRU5BQkxFKTsKKworCS8qIHNldCBzdGFuZGFyZCBhbmQgZmFzdCBzcGVlZCBkZXZpZGVycyBmb3IgaGlnaC9sb3cgcGVyaW9kcyAqLworCisJLyogU3RhbmRhcmQtbW9kZSAqLworCWhjbnQgPSBpMmNfZHdfc2NsX2hjbnQoaW5wdXRfY2xvY2tfa2h6LAorCQkJCTQwLAkvKiB0SEQ7U1RBID0gdEhJR0ggPSA0LjAgdXMgKi8KKwkJCQkzLAkvKiB0ZiA9IDAuMyB1cyAqLworCQkJCTAsCS8qIDA6IERXIGRlZmF1bHQsIDE6IElkZWFsICovCisJCQkJMCk7CS8qIE5vIG9mZnNldCAqLworCWxjbnQgPSBpMmNfZHdfc2NsX2xjbnQoaW5wdXRfY2xvY2tfa2h6LAorCQkJCTQ3LAkvKiB0TE9XID0gNC43IHVzICovCisJCQkJMywJLyogdGYgPSAwLjMgdXMgKi8KKwkJCQkwKTsJLyogTm8gb2Zmc2V0ICovCisJZHdfd3JpdGVsKGRldiwgaGNudCwgRFdfSUNfU1NfU0NMX0hDTlQpOworCWR3X3dyaXRlbChkZXYsIGxjbnQsIERXX0lDX1NTX1NDTF9MQ05UKTsKKwlkZXZfZGJnKGRldi0+ZGV2LCAiU3RhbmRhcmQtbW9kZSBIQ05UOkxDTlQgPSAlZDolZFxuIiwgaGNudCwgbGNudCk7CisKKwkvKiBGYXN0LW1vZGUgKi8KKwloY250ID0gaTJjX2R3X3NjbF9oY250KGlucHV0X2Nsb2NrX2toeiwKKwkJCQk2LAkvKiB0SEQ7U1RBID0gdEhJR0ggPSAwLjYgdXMgKi8KKwkJCQkzLAkvKiB0ZiA9IDAuMyB1cyAqLworCQkJCTAsCS8qIDA6IERXIGRlZmF1bHQsIDE6IElkZWFsICovCisJCQkJMCk7CS8qIE5vIG9mZnNldCAqLworCWxjbnQgPSBpMmNfZHdfc2NsX2xjbnQoaW5wdXRfY2xvY2tfa2h6LAorCQkJCTEzLAkvKiB0TE9XID0gMS4zIHVzICovCisJCQkJMywJLyogdGYgPSAwLjMgdXMgKi8KKwkJCQkwKTsJLyogTm8gb2Zmc2V0ICovCisJZHdfd3JpdGVsKGRldiwgaGNudCwgRFdfSUNfRlNfU0NMX0hDTlQpOworCWR3X3dyaXRlbChkZXYsIGxjbnQsIERXX0lDX0ZTX1NDTF9MQ05UKTsKKwlkZXZfZGJnKGRldi0+ZGV2LCAiRmFzdC1tb2RlIEhDTlQ6TENOVCA9ICVkOiVkXG4iLCBoY250LCBsY250KTsKKworCS8qIENvbmZpZ3VyZSBUeC9SeCBGSUZPIHRocmVzaG9sZCBsZXZlbHMgKi8KKwlkd193cml0ZWwoZGV2LCBkZXYtPnR4X2ZpZm9fZGVwdGggLSAxLCBEV19JQ19UWF9UTCk7CisJZHdfd3JpdGVsKGRldiwgMCwgRFdfSUNfUlhfVEwpOworCisJLyogY29uZmlndXJlIHRoZSBpMmMgbWFzdGVyICovCisJZHdfd3JpdGVsKGRldiwgZGV2LT5tYXN0ZXJfY2ZnICwgRFdfSUNfQ09OKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdhaXRpbmcgZm9yIGJ1cyBub3QgYnVzeQorICovCitzdGF0aWMgaW50IGkyY19kd193YWl0X2J1c19ub3RfYnVzeShzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCWludCB0aW1lb3V0ID0gVElNRU9VVDsKKworCXdoaWxlIChkd19yZWFkbChkZXYsIERXX0lDX1NUQVRVUykgJiBEV19JQ19TVEFUVVNfQUNUSVZJVFkpIHsKKwkJaWYgKHRpbWVvdXQgPD0gMCkgeworCQkJZGV2X3dhcm4oZGV2LT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGJ1cyByZWFkeVxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQl0aW1lb3V0LS07CisJCW1kZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaTJjX2R3X3hmZXJfaW5pdChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCXN0cnVjdCBpMmNfbXNnICptc2dzID0gZGV2LT5tc2dzOworCXUzMiBpY19jb247CisKKwkvKiBEaXNhYmxlIHRoZSBhZGFwdGVyICovCisJZHdfd3JpdGVsKGRldiwgMCwgRFdfSUNfRU5BQkxFKTsKKworCS8qIHNldCB0aGUgc2xhdmUgKHRhcmdldCkgYWRkcmVzcyAqLworCWR3X3dyaXRlbChkZXYsIG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5hZGRyLCBEV19JQ19UQVIpOworCisJLyogaWYgdGhlIHNsYXZlIGFkZHJlc3MgaXMgdGVuIGJpdCBhZGRyZXNzLCBlbmFibGUgMTBCSVRBRERSICovCisJaWNfY29uID0gZHdfcmVhZGwoZGV2LCBEV19JQ19DT04pOworCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uZmxhZ3MgJiBJMkNfTV9URU4pCisJCWljX2NvbiB8PSBEV19JQ19DT05fMTBCSVRBRERSX01BU1RFUjsKKwllbHNlCisJCWljX2NvbiAmPSB+RFdfSUNfQ09OXzEwQklUQUREUl9NQVNURVI7CisJZHdfd3JpdGVsKGRldiwgaWNfY29uLCBEV19JQ19DT04pOworCisJLyogRW5hYmxlIHRoZSBhZGFwdGVyICovCisJZHdfd3JpdGVsKGRldiwgMSwgRFdfSUNfRU5BQkxFKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJZHdfd3JpdGVsKGRldiwgRFdfSUNfSU5UUl9ERUZBVUxUX01BU0ssIERXX0lDX0lOVFJfTUFTSyk7Cit9CisKKy8qCisgKiBJbml0aWF0ZSAoYW5kIGNvbnRpbnVlKSBsb3cgbGV2ZWwgbWFzdGVyIHJlYWQvd3JpdGUgdHJhbnNhY3Rpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gaTJjX2R3X2lzciwgYW5kIHB1bXBpbmcgaTJjX21zZworICogbWVzc2FnZXMgaW50byB0aGUgdHggYnVmZmVyLiAgRXZlbiBpZiB0aGUgc2l6ZSBvZiBpMmNfbXNnIGRhdGEgaXMKKyAqIGxvbmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSB0eCBidWZmZXIsIGl0IGhhbmRsZXMgZXZlcnl0aGluZy4KKyAqLwordm9pZAoraTJjX2R3X3hmZXJfbXNnKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJc3RydWN0IGkyY19tc2cgKm1zZ3MgPSBkZXYtPm1zZ3M7CisJdTMyIGludHJfbWFzazsKKwlpbnQgdHhfbGltaXQsIHJ4X2xpbWl0OworCXUzMiBhZGRyID0gbXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmFkZHI7CisJdTMyIGJ1Zl9sZW4gPSBkZXYtPnR4X2J1Zl9sZW47CisJdTggKmJ1ZiA9IGRldi0+dHhfYnVmOworCisJaW50cl9tYXNrID0gRFdfSUNfSU5UUl9ERUZBVUxUX01BU0s7CisKKwlmb3IgKDsgZGV2LT5tc2dfd3JpdGVfaWR4IDwgZGV2LT5tc2dzX251bTsgZGV2LT5tc2dfd3JpdGVfaWR4KyspIHsKKwkJLyoKKwkJICogaWYgdGFyZ2V0IGFkZHJlc3MgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8KKwkJICogcmVwcm9ncmFtIHRoZSB0YXJnZXQgYWRkcmVzcyBpbiB0aGUgaTJjCisJCSAqIGFkYXB0ZXIgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgdHJhbnNmZXIKKwkJICovCisJCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYWRkciAhPSBhZGRyKSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2LAorCQkJCSIlczogaW52YWxpZCB0YXJnZXQgYWRkcmVzc1xuIiwgX19mdW5jX18pOworCQkJZGV2LT5tc2dfZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5sZW4gPT0gMCkgeworCQkJZGV2X2VycihkZXYtPmRldiwKKwkJCQkiJXM6IGludmFsaWQgbWVzc2FnZSBsZW5ndGhcbiIsIF9fZnVuY19fKTsKKwkJCWRldi0+bXNnX2VyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghKGRldi0+c3RhdHVzICYgU1RBVFVTX1dSSVRFX0lOX1BST0dSRVNTKSkgeworCQkJLyogbmV3IGkyY19tc2cgKi8KKwkJCWJ1ZiA9IG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5idWY7CisJCQlidWZfbGVuID0gbXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmxlbjsKKwkJfQorCisJCXR4X2xpbWl0ID0gZGV2LT50eF9maWZvX2RlcHRoIC0gZHdfcmVhZGwoZGV2LCBEV19JQ19UWEZMUik7CisJCXJ4X2xpbWl0ID0gZGV2LT5yeF9maWZvX2RlcHRoIC0gZHdfcmVhZGwoZGV2LCBEV19JQ19SWEZMUik7CisKKwkJd2hpbGUgKGJ1Zl9sZW4gPiAwICYmIHR4X2xpbWl0ID4gMCAmJiByeF9saW1pdCA+IDApIHsKKwkJCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uZmxhZ3MgJiBJMkNfTV9SRCkgeworCQkJCWR3X3dyaXRlbChkZXYsIDB4MTAwLCBEV19JQ19EQVRBX0NNRCk7CisJCQkJcnhfbGltaXQtLTsKKwkJCX0gZWxzZQorCQkJCWR3X3dyaXRlbChkZXYsICpidWYrKywgRFdfSUNfREFUQV9DTUQpOworCQkJdHhfbGltaXQtLTsgYnVmX2xlbi0tOworCQl9CisKKwkJZGV2LT50eF9idWYgPSBidWY7CisJCWRldi0+dHhfYnVmX2xlbiA9IGJ1Zl9sZW47CisKKwkJaWYgKGJ1Zl9sZW4gPiAwKSB7CisJCQkvKiBtb3JlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gKi8KKwkJCWRldi0+c3RhdHVzIHw9IFNUQVRVU19XUklURV9JTl9QUk9HUkVTUzsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWRldi0+c3RhdHVzICY9IH5TVEFUVVNfV1JJVEVfSU5fUFJPR1JFU1M7CisJfQorCisJLyoKKwkgKiBJZiBpMmNfbXNnIGluZGV4IHNlYXJjaCBpcyBjb21wbGV0ZWQsIHdlIGRvbid0IG5lZWQgVFhfRU1QVFkKKwkgKiBpbnRlcnJ1cHQgYW55IG1vcmUuCisJICovCisJaWYgKGRldi0+bXNnX3dyaXRlX2lkeCA9PSBkZXYtPm1zZ3NfbnVtKQorCQlpbnRyX21hc2sgJj0gfkRXX0lDX0lOVFJfVFhfRU1QVFk7CisKKwlpZiAoZGV2LT5tc2dfZXJyKQorCQlpbnRyX21hc2sgPSAwOworCisJZHdfd3JpdGVsKGRldiwgaW50cl9tYXNrLCAgRFdfSUNfSU5UUl9NQVNLKTsKK30KKworc3RhdGljIHZvaWQKK2kyY19kd19yZWFkKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJc3RydWN0IGkyY19tc2cgKm1zZ3MgPSBkZXYtPm1zZ3M7CisJaW50IHJ4X3ZhbGlkOworCisJZm9yICg7IGRldi0+bXNnX3JlYWRfaWR4IDwgZGV2LT5tc2dzX251bTsgZGV2LT5tc2dfcmVhZF9pZHgrKykgeworCQl1MzIgbGVuOworCQl1OCAqYnVmOworCisJCWlmICghKG1zZ3NbZGV2LT5tc2dfcmVhZF9pZHhdLmZsYWdzICYgSTJDX01fUkQpKQorCQkJY29udGludWU7CisKKwkJaWYgKCEoZGV2LT5zdGF0dXMgJiBTVEFUVVNfUkVBRF9JTl9QUk9HUkVTUykpIHsKKwkJCWxlbiA9IG1zZ3NbZGV2LT5tc2dfcmVhZF9pZHhdLmxlbjsKKwkJCWJ1ZiA9IG1zZ3NbZGV2LT5tc2dfcmVhZF9pZHhdLmJ1ZjsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IGRldi0+cnhfYnVmX2xlbjsKKwkJCWJ1ZiA9IGRldi0+cnhfYnVmOworCQl9CisKKwkJcnhfdmFsaWQgPSBkd19yZWFkbChkZXYsIERXX0lDX1JYRkxSKTsKKworCQlmb3IgKDsgbGVuID4gMCAmJiByeF92YWxpZCA+IDA7IGxlbi0tLCByeF92YWxpZC0tKQorCQkJKmJ1ZisrID0gZHdfcmVhZGwoZGV2LCBEV19JQ19EQVRBX0NNRCk7CisKKwkJaWYgKGxlbiA+IDApIHsKKwkJCWRldi0+c3RhdHVzIHw9IFNUQVRVU19SRUFEX0lOX1BST0dSRVNTOworCQkJZGV2LT5yeF9idWZfbGVuID0gbGVuOworCQkJZGV2LT5yeF9idWYgPSBidWY7CisJCQlyZXR1cm47CisJCX0gZWxzZQorCQkJZGV2LT5zdGF0dXMgJj0gflNUQVRVU19SRUFEX0lOX1BST0dSRVNTOworCX0KK30KKworc3RhdGljIGludCBpMmNfZHdfaGFuZGxlX3R4X2Fib3J0KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBhYm9ydF9zb3VyY2UgPSBkZXYtPmFib3J0X3NvdXJjZTsKKwlpbnQgaTsKKworCWlmIChhYm9ydF9zb3VyY2UgJiBEV19JQ19UWF9BQlJUX05PQUNLKSB7CisJCWZvcl9lYWNoX3NldF9iaXQoaSwgJmFib3J0X3NvdXJjZSwgQVJSQVlfU0laRShhYm9ydF9zb3VyY2VzKSkKKwkJCWRldl9kYmcoZGV2LT5kZXYsCisJCQkJIiVzOiAlc1xuIiwgX19mdW5jX18sIGFib3J0X3NvdXJjZXNbaV0pOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZhYm9ydF9zb3VyY2UsIEFSUkFZX1NJWkUoYWJvcnRfc291cmNlcykpCisJCWRldl9lcnIoZGV2LT5kZXYsICIlczogJXNcbiIsIF9fZnVuY19fLCBhYm9ydF9zb3VyY2VzW2ldKTsKKworCWlmIChhYm9ydF9zb3VyY2UgJiBEV19JQ19UWF9BUkJfTE9TVCkKKwkJcmV0dXJuIC1FQUdBSU47CisJZWxzZSBpZiAoYWJvcnRfc291cmNlICYgRFdfSUNfVFhfQUJSVF9HQ0FMTF9SRUFEKQorCQlyZXR1cm4gLUVJTlZBTDsgLyogd3JvbmcgbXNnc1tdIGRhdGEgKi8KKwllbHNlCisJCXJldHVybiAtRUlPOworfQorCisvKgorICogUHJlcGFyZSBjb250cm9sbGVyIGZvciBhIHRyYW5zYWN0aW9uIGFuZCBjYWxsIGkyY19kd194ZmVyX21zZworICovCitpbnQKK2kyY19kd194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnc1tdLCBpbnQgbnVtKQoreworCXN0cnVjdCBkd19pMmNfZGV2ICpkZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldi0+ZGV2LCAiJXM6IG1zZ3M6ICVkXG4iLCBfX2Z1bmNfXywgbnVtKTsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJcG1fcnVudGltZV9nZXRfc3luYyhkZXYtPmRldik7CisKKwlJTklUX0NPTVBMRVRJT04oZGV2LT5jbWRfY29tcGxldGUpOworCWRldi0+bXNncyA9IG1zZ3M7CisJZGV2LT5tc2dzX251bSA9IG51bTsKKwlkZXYtPmNtZF9lcnIgPSAwOworCWRldi0+bXNnX3dyaXRlX2lkeCA9IDA7CisJZGV2LT5tc2dfcmVhZF9pZHggPSAwOworCWRldi0+bXNnX2VyciA9IDA7CisJZGV2LT5zdGF0dXMgPSBTVEFUVVNfSURMRTsKKwlkZXYtPmFib3J0X3NvdXJjZSA9IDA7CisKKwlyZXQgPSBpMmNfZHdfd2FpdF9idXNfbm90X2J1c3koZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJLyogc3RhcnQgdGhlIHRyYW5zZmVycyAqLworCWkyY19kd194ZmVyX2luaXQoZGV2KTsKKworCS8qIHdhaXQgZm9yIHR4IHRvIGNvbXBsZXRlICovCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmRldi0+Y21kX2NvbXBsZXRlLCBIWik7CisJaWYgKHJldCA9PSAwKSB7CisJCWRldl9lcnIoZGV2LT5kZXYsICJjb250cm9sbGVyIHRpbWVkIG91dFxuIik7CisJCWkyY19kd19pbml0KGRldik7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCWlmIChkZXYtPm1zZ19lcnIpIHsKKwkJcmV0ID0gZGV2LT5tc2dfZXJyOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogbm8gZXJyb3IgKi8KKwlpZiAobGlrZWx5KCFkZXYtPmNtZF9lcnIpKSB7CisJCS8qIERpc2FibGUgdGhlIGFkYXB0ZXIgKi8KKwkJZHdfd3JpdGVsKGRldiwgMCwgRFdfSUNfRU5BQkxFKTsKKwkJcmV0ID0gbnVtOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogV2UgaGF2ZSBhbiBlcnJvciAqLworCWlmIChkZXYtPmNtZF9lcnIgPT0gRFdfSUNfRVJSX1RYX0FCUlQpIHsKKwkJcmV0ID0gaTJjX2R3X2hhbmRsZV90eF9hYm9ydChkZXYpOworCQlnb3RvIGRvbmU7CisJfQorCXJldCA9IC1FSU87CisKK2RvbmU6CisJcG1fcnVudGltZV9wdXQoZGV2LT5kZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3UzMiBpMmNfZHdfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGR3X2kyY19kZXYgKmRldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJcmV0dXJuIGRldi0+ZnVuY3Rpb25hbGl0eTsKK30KKworc3RhdGljIHUzMiBpMmNfZHdfcmVhZF9jbGVhcl9pbnRyYml0cyhzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCXUzMiBzdGF0OworCisJLyoKKwkgKiBUaGUgSUNfSU5UUl9TVEFUIHJlZ2lzdGVyIGp1c3QgaW5kaWNhdGVzICJlbmFibGVkIiBpbnRlcnJ1cHRzLgorCSAqIFRocyB1bm1hc2tlZCByYXcgdmVyc2lvbiBvZiBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgYXJlIGF2YWlsYWJsZQorCSAqIGluIHRoZSBJQ19SQVdfSU5UUl9TVEFUIHJlZ2lzdGVyLgorCSAqCisJICogVGhhdCBpcywKKwkgKiAgIHN0YXQgPSBkd19yZWFkbChJQ19JTlRSX1NUQVQpOworCSAqIGVxdWFscyB0bywKKwkgKiAgIHN0YXQgPSBkd19yZWFkbChJQ19SQVdfSU5UUl9TVEFUKSAmIGR3X3JlYWRsKElDX0lOVFJfTUFTSyk7CisJICoKKwkgKiBUaGUgcmF3IHZlcnNpb24gbWlnaHQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisJICovCisJc3RhdCA9IGR3X3JlYWRsKGRldiwgRFdfSUNfSU5UUl9TVEFUKTsKKworCS8qCisJICogRG8gbm90IHVzZSB0aGUgSUNfQ0xSX0lOVFIgcmVnaXN0ZXIgdG8gY2xlYXIgaW50ZXJydXB0cywgb3IKKwkgKiB5b3UnbGwgbWlzcyBzb21lIGludGVycnVwdHMsIHRyaWdnZXJlZCBkdXJpbmcgdGhlIHBlcmlvZCBmcm9tCisJICogZHdfcmVhZGwoSUNfSU5UUl9TVEFUKSB0byBkd19yZWFkbChJQ19DTFJfSU5UUikuCisJICoKKwkgKiBJbnN0ZWFkLCB1c2UgdGhlIHNlcGFyYXRlbHktcHJlcGFyZWQgSUNfQ0xSXyogcmVnaXN0ZXJzLgorCSAqLworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9SWF9VTkRFUikKKwkJZHdfcmVhZGwoZGV2LCBEV19JQ19DTFJfUlhfVU5ERVIpOworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9SWF9PVkVSKQorCQlkd19yZWFkbChkZXYsIERXX0lDX0NMUl9SWF9PVkVSKTsKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfVFhfT1ZFUikKKwkJZHdfcmVhZGwoZGV2LCBEV19JQ19DTFJfVFhfT1ZFUik7CisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1JEX1JFUSkKKwkJZHdfcmVhZGwoZGV2LCBEV19JQ19DTFJfUkRfUkVRKTsKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfVFhfQUJSVCkgeworCQkvKgorCQkgKiBUaGUgSUNfVFhfQUJSVF9TT1VSQ0UgcmVnaXN0ZXIgaXMgY2xlYXJlZCB3aGVuZXZlcgorCQkgKiB0aGUgSUNfQ0xSX1RYX0FCUlQgaXMgcmVhZC4gIFByZXNlcnZlIGl0IGJlZm9yZWhhbmQuCisJCSAqLworCQlkZXYtPmFib3J0X3NvdXJjZSA9IGR3X3JlYWRsKGRldiwgRFdfSUNfVFhfQUJSVF9TT1VSQ0UpOworCQlkd19yZWFkbChkZXYsIERXX0lDX0NMUl9UWF9BQlJUKTsKKwl9CisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1JYX0RPTkUpCisJCWR3X3JlYWRsKGRldiwgRFdfSUNfQ0xSX1JYX0RPTkUpOworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9BQ1RJVklUWSkKKwkJZHdfcmVhZGwoZGV2LCBEV19JQ19DTFJfQUNUSVZJVFkpOworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9TVE9QX0RFVCkKKwkJZHdfcmVhZGwoZGV2LCBEV19JQ19DTFJfU1RPUF9ERVQpOworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9TVEFSVF9ERVQpCisJCWR3X3JlYWRsKGRldiwgRFdfSUNfQ0xSX1NUQVJUX0RFVCk7CisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX0dFTl9DQUxMKQorCQlkd19yZWFkbChkZXYsIERXX0lDX0NMUl9HRU5fQ0FMTCk7CisKKwlyZXR1cm4gc3RhdDsKK30KKworLyoKKyAqIEludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbmV2ZXIgYW4gSTJDIGludGVycnVwdAorICogb2NjdXJzLgorICovCitpcnFyZXR1cm5fdCBpMmNfZHdfaXNyKGludCB0aGlzX2lycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkd19pMmNfZGV2ICpkZXYgPSBkZXZfaWQ7CisJdTMyIHN0YXQsIGVuYWJsZWQ7CisKKwllbmFibGVkID0gZHdfcmVhZGwoZGV2LCBEV19JQ19FTkFCTEUpOworCXN0YXQgPSBkd19yZWFkbChkZXYsIERXX0lDX1JBV19JTlRSX1NUQVQpOworCWRldl9kYmcoZGV2LT5kZXYsICIlczogICVzIGVuYWJsZWQ9IDB4JXggc3RhdD0weCV4XG4iLCBfX2Z1bmNfXywKKwkJZGV2LT5hZGFwdGVyLm5hbWUsIGVuYWJsZWQsIHN0YXQpOworCWlmICghZW5hYmxlZCB8fCAhKHN0YXQgJiB+RFdfSUNfSU5UUl9BQ1RJVklUWSkpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXN0YXQgPSBpMmNfZHdfcmVhZF9jbGVhcl9pbnRyYml0cyhkZXYpOworCisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1RYX0FCUlQpIHsKKwkJZGV2LT5jbWRfZXJyIHw9IERXX0lDX0VSUl9UWF9BQlJUOworCQlkZXYtPnN0YXR1cyA9IFNUQVRVU19JRExFOworCisJCS8qCisJCSAqIEFueXRpbWUgVFhfQUJSVCBpcyBzZXQsIHRoZSBjb250ZW50cyBvZiB0aGUgdHgvcngKKwkJICogYnVmZmVycyBhcmUgZmx1c2hlZC4gIE1ha2Ugc3VyZSB0byBza2lwIHRoZW0uCisJCSAqLworCQlkd193cml0ZWwoZGV2LCAwLCBEV19JQ19JTlRSX01BU0spOworCQlnb3RvIHR4X2Fib3J0ZWQ7CisJfQorCisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1JYX0ZVTEwpCisJCWkyY19kd19yZWFkKGRldik7CisKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfVFhfRU1QVFkpCisJCWkyY19kd194ZmVyX21zZyhkZXYpOworCisJLyoKKwkgKiBObyBuZWVkIHRvIG1vZGlmeSBvciBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgbWFzayBoZXJlLgorCSAqIGkyY19kd194ZmVyX21zZygpIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGFjY29yZGluZyB0bworCSAqIHRoZSBjdXJyZW50IHRyYW5zbWl0IHN0YXR1cy4KKwkgKi8KKwordHhfYWJvcnRlZDoKKwlpZiAoKHN0YXQgJiAoRFdfSUNfSU5UUl9UWF9BQlJUIHwgRFdfSUNfSU5UUl9TVE9QX0RFVCkpIHx8IGRldi0+bXNnX2VycikKKwkJY29tcGxldGUoJmRldi0+Y21kX2NvbXBsZXRlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwordm9pZCBpMmNfZHdfZW5hYmxlKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisgICAgICAgLyogRW5hYmxlIHRoZSBhZGFwdGVyICovCisJZHdfd3JpdGVsKGRldiwgMSwgRFdfSUNfRU5BQkxFKTsKK30KKwordTMyIGkyY19kd19pc19lbmFibGVkKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJcmV0dXJuIGR3X3JlYWRsKGRldiwgRFdfSUNfRU5BQkxFKTsKK30KKwordm9pZCBpMmNfZHdfZGlzYWJsZShzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCS8qIERpc2FibGUgY29udHJvbGxlciAqLworCWR3X3dyaXRlbChkZXYsIDAsIERXX0lDX0VOQUJMRSk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnVwdHMgKi8KKwlkd193cml0ZWwoZGV2LCAwLCBEV19JQ19JTlRSX01BU0spOworCWR3X3JlYWRsKGRldiwgRFdfSUNfQ0xSX0lOVFIpOworfQorCit2b2lkIGkyY19kd19jbGVhcl9pbnQoc3RydWN0IGR3X2kyY19kZXYgKmRldikKK3sKKwlkd19yZWFkbChkZXYsIERXX0lDX0NMUl9JTlRSKTsKK30KKwordm9pZCBpMmNfZHdfZGlzYWJsZV9pbnQoc3RydWN0IGR3X2kyY19kZXYgKmRldikKK3sKKwlkd193cml0ZWwoZGV2LCAwLCBEV19JQ19JTlRSX01BU0spOworfQorCit1MzIgaTJjX2R3X3JlYWRfY29tcF9wYXJhbShzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCXJldHVybiBkd19yZWFkbChkZXYsIERXX0lDX0NPTVBfUEFSQU1fMSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtY29yZS5oIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQxYTJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIFN5bm9wc3lzIERlc2lnbldhcmUgSTJDIGFkYXB0ZXIgZHJpdmVyIChtYXN0ZXIgb25seSkuCisgKgorICogQmFzZWQgb24gdGhlIFRJIERBVklOQ0kgSTJDIGFkYXB0ZXIgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUZXhhcyBJbnN0cnVtZW50cy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBQcm92aWdlbnQgTHRkLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworCisjZGVmaW5lIERXX0lDX0NPTl9NQVNURVIJCTB4MQorI2RlZmluZSBEV19JQ19DT05fU1BFRURfU1RECQkweDIKKyNkZWZpbmUgRFdfSUNfQ09OX1NQRUVEX0ZBU1QJCTB4NAorI2RlZmluZSBEV19JQ19DT05fMTBCSVRBRERSX01BU1RFUgkweDEwCisjZGVmaW5lIERXX0lDX0NPTl9SRVNUQVJUX0VOCQkweDIwCisjZGVmaW5lIERXX0lDX0NPTl9TTEFWRV9ESVNBQkxFCQkweDQwCisKKworLyoqCisgKiBzdHJ1Y3QgZHdfaTJjX2RldiAtIHByaXZhdGUgaTJjLWRlc2lnbndhcmUgZGF0YQorICogQGRldjogZHJpdmVyIG1vZGVsIGRldmljZSBub2RlCisgKiBAYmFzZTogSU8gcmVnaXN0ZXJzIHBvaW50ZXIKKyAqIEBjbWRfY29tcGxldGU6IHR4IGNvbXBsZXRpb24gaW5kaWNhdG9yCisgKiBAbG9jazogcHJvdGVjdCB0aGlzIHN0cnVjdCBhbmQgSU8gcmVnaXN0ZXJzCisgKiBAY2xrOiBpbnB1dCByZWZlcmVuY2UgY2xvY2sKKyAqIEBjbWRfZXJyOiBydW4gdGltZSBoYWR3YXJlIGVycm9yIGNvZGUKKyAqIEBtc2dzOiBwb2ludHMgdG8gYW4gYXJyYXkgb2YgbWVzc2FnZXMgY3VycmVudGx5IGJlaW5nIHRyYW5zZmVyZWQKKyAqIEBtc2dzX251bTogdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBtc2dzCisgKiBAbXNnX3dyaXRlX2lkeDogdGhlIGVsZW1lbnQgaW5kZXggb2YgdGhlIGN1cnJlbnQgdHggbWVzc2FnZSBpbiB0aGUgbXNncworICoJYXJyYXkKKyAqIEB0eF9idWZfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHR4IGJ1ZmZlcgorICogQHR4X2J1ZjogdGhlIGN1cnJlbnQgdHggYnVmZmVyCisgKiBAbXNnX3JlYWRfaWR4OiB0aGUgZWxlbWVudCBpbmRleCBvZiB0aGUgY3VycmVudCByeCBtZXNzYWdlIGluIHRoZSBtc2dzCisgKglhcnJheQorICogQHJ4X2J1Zl9sZW46IHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgcnggYnVmZmVyCisgKiBAcnhfYnVmOiB0aGUgY3VycmVudCByeCBidWZmZXIKKyAqIEBtc2dfZXJyOiBlcnJvciBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNmZXIKKyAqIEBzdGF0dXM6IGkyYyBtYXN0ZXIgc3RhdHVzLCBvbmUgb2YgU1RBVFVTXyoKKyAqIEBhYm9ydF9zb3VyY2U6IGNvcHkgb2YgdGhlIFRYX0FCUlRfU09VUkNFIHJlZ2lzdGVyCisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyIGZvciB0aGUgaTJjIG1hc3RlcgorICogQGFkYXB0ZXI6IGkyYyBzdWJzeXN0ZW0gYWRhcHRlciBub2RlCisgKiBAdHhfZmlmb19kZXB0aDogZGVwdGggb2YgdGhlIGhhcmR3YXJlIHR4IGZpZm8KKyAqIEByeF9maWZvX2RlcHRoOiBkZXB0aCBvZiB0aGUgaGFyZHdhcmUgcnggZmlmbworICovCitzdHJ1Y3QgZHdfaTJjX2RldiB7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXN0cnVjdCBjb21wbGV0aW9uCWNtZF9jb21wbGV0ZTsKKwlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CisJc3RydWN0IGNsawkJKmNsazsKKwl1MzIJCQkoKmdldF9jbGtfcmF0ZV9raHopIChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KTsKKwlzdHJ1Y3QgZHdfcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CisJaW50CQkJY21kX2VycjsKKwlzdHJ1Y3QgaTJjX21zZwkJKm1zZ3M7CisJaW50CQkJbXNnc19udW07CisJaW50CQkJbXNnX3dyaXRlX2lkeDsKKwl1MzIJCQl0eF9idWZfbGVuOworCXU4CQkJKnR4X2J1ZjsKKwlpbnQJCQltc2dfcmVhZF9pZHg7CisJdTMyCQkJcnhfYnVmX2xlbjsKKwl1OAkJCSpyeF9idWY7CisJaW50CQkJbXNnX2VycjsKKwl1bnNpZ25lZCBpbnQJCXN0YXR1czsKKwl1MzIJCQlhYm9ydF9zb3VyY2U7CisJaW50CQkJaXJxOworCWludAkJCXN3YWI7CisJc3RydWN0IGkyY19hZGFwdGVyCWFkYXB0ZXI7CisJdTMyCQkJZnVuY3Rpb25hbGl0eTsKKwl1MzIJCQltYXN0ZXJfY2ZnOworCXVuc2lnbmVkIGludAkJdHhfZmlmb19kZXB0aDsKKwl1bnNpZ25lZCBpbnQJCXJ4X2ZpZm9fZGVwdGg7Cit9OworCitleHRlcm4gdTMyIGR3X3JlYWRsKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYsIGludCBvZmZzZXQpOworZXh0ZXJuIHZvaWQgZHdfd3JpdGVsKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYsIHUzMiBiLCBpbnQgb2Zmc2V0KTsKK2V4dGVybiBpbnQgaTJjX2R3X2luaXQoc3RydWN0IGR3X2kyY19kZXYgKmRldik7CitleHRlcm4gaW50IGkyY19kd194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnc1tdLAorCQlpbnQgbnVtKTsKK2V4dGVybiB1MzIgaTJjX2R3X2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBpMmNfZHdfaXNyKGludCB0aGlzX2lycSwgdm9pZCAqZGV2X2lkKTsKK2V4dGVybiB2b2lkIGkyY19kd19lbmFibGUoc3RydWN0IGR3X2kyY19kZXYgKmRldik7CitleHRlcm4gdTMyIGkyY19kd19pc19lbmFibGVkKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgaTJjX2R3X2Rpc2FibGUoc3RydWN0IGR3X2kyY19kZXYgKmRldik7CitleHRlcm4gdm9pZCBpMmNfZHdfY2xlYXJfaW50KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgaTJjX2R3X2Rpc2FibGVfaW50KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpOworZXh0ZXJuIHUzMiBpMmNfZHdfcmVhZF9jb21wX3BhcmFtKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLXBjaWRydi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLXBjaWRydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODllNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtcGNpZHJ2LmMKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBhZGFwdGVyIGRyaXZlciAobWFzdGVyIG9ubHkpLgorICoKKyAqIEJhc2VkIG9uIHRoZSBUSSBEQVZJTkNJIEkyQyBhZGFwdGVyIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUHJvdmlnZW50IEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBJbnRlbCBjb3Jwb3JhdGlvbi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSAiaTJjLWRlc2lnbndhcmUtY29yZS5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJpMmMtZGVzaWdud2FyZS1wY2kiCisKK2VudW0gZHdfcGNpX2N0bF9pZF90IHsKKwltb29yZXN0b3duXzAsCisJbW9vcmVzdG93bl8xLAorCW1vb3Jlc3Rvd25fMiwKKworCW1lZGZpZWxkXzAsCisJbWVkZmllbGRfMSwKKwltZWRmaWVsZF8yLAorCW1lZGZpZWxkXzMsCisJbWVkZmllbGRfNCwKKwltZWRmaWVsZF81LAorfTsKKworc3RydWN0IGR3X3BjaV9jb250cm9sbGVyIHsKKwl1MzIgYnVzX251bTsKKwl1MzIgYnVzX2NmZzsKKwl1MzIgdHhfZmlmb19kZXB0aDsKKwl1MzIgcnhfZmlmb19kZXB0aDsKKwl1MzIgY2xrX2toejsKK307CisKKyNkZWZpbmUgSU5URUxfTUlEX1NURF9DRkcgIChEV19JQ19DT05fTUFTVEVSIHwJCQlcCisJCQkJRFdfSUNfQ09OX1NMQVZFX0RJU0FCTEUgfAlcCisJCQkJRFdfSUNfQ09OX1JFU1RBUlRfRU4pCisKK3N0YXRpYyBzdHJ1Y3QgIGR3X3BjaV9jb250cm9sbGVyICBkd19wY2lfY29udHJvbGxlcnNbXSA9IHsKKwlbbW9vcmVzdG93bl8wXSA9IHsKKwkJLmJ1c19udW0gICAgID0gMCwKKwkJLmJ1c19jZmcgICA9IElOVEVMX01JRF9TVERfQ0ZHIHwgRFdfSUNfQ09OX1NQRUVEX0ZBU1QsCisJCS50eF9maWZvX2RlcHRoID0gMzIsCisJCS5yeF9maWZvX2RlcHRoID0gMzIsCisJCS5jbGtfa2h6ICAgICAgPSAyNTAwMCwKKwl9LAorCVttb29yZXN0b3duXzFdID0geworCQkuYnVzX251bSAgICAgPSAxLAorCQkuYnVzX2NmZyAgID0gSU5URUxfTUlEX1NURF9DRkcgfCBEV19JQ19DT05fU1BFRURfRkFTVCwKKwkJLnR4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLnJ4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLmNsa19raHogICAgICA9IDI1MDAwLAorCX0sCisJW21vb3Jlc3Rvd25fMl0gPSB7CisJCS5idXNfbnVtICAgICA9IDIsCisJCS5idXNfY2ZnICAgPSBJTlRFTF9NSURfU1REX0NGRyB8IERXX0lDX0NPTl9TUEVFRF9GQVNULAorCQkudHhfZmlmb19kZXB0aCA9IDMyLAorCQkucnhfZmlmb19kZXB0aCA9IDMyLAorCQkuY2xrX2toeiAgICAgID0gMjUwMDAsCisJfSwKKwlbbWVkZmllbGRfMF0gPSB7CisJCS5idXNfbnVtICAgICA9IDAsCisJCS5idXNfY2ZnICAgPSBJTlRFTF9NSURfU1REX0NGRyB8IERXX0lDX0NPTl9TUEVFRF9GQVNULAorCQkudHhfZmlmb19kZXB0aCA9IDMyLAorCQkucnhfZmlmb19kZXB0aCA9IDMyLAorCQkuY2xrX2toeiAgICAgID0gMjUwMDAsCisJfSwKKwlbbWVkZmllbGRfMV0gPSB7CisJCS5idXNfbnVtICAgICA9IDEsCisJCS5idXNfY2ZnICAgPSBJTlRFTF9NSURfU1REX0NGRyB8IERXX0lDX0NPTl9TUEVFRF9GQVNULAorCQkudHhfZmlmb19kZXB0aCA9IDMyLAorCQkucnhfZmlmb19kZXB0aCA9IDMyLAorCQkuY2xrX2toeiAgICAgID0gMjUwMDAsCisJfSwKKwlbbWVkZmllbGRfMl0gPSB7CisJCS5idXNfbnVtICAgICA9IDIsCisJCS5idXNfY2ZnICAgPSBJTlRFTF9NSURfU1REX0NGRyB8IERXX0lDX0NPTl9TUEVFRF9GQVNULAorCQkudHhfZmlmb19kZXB0aCA9IDMyLAorCQkucnhfZmlmb19kZXB0aCA9IDMyLAorCQkuY2xrX2toeiAgICAgID0gMjUwMDAsCisJfSwKKwlbbWVkZmllbGRfM10gPSB7CisJCS5idXNfbnVtICAgICA9IDMsCisJCS5idXNfY2ZnICAgPSBJTlRFTF9NSURfU1REX0NGRyB8IERXX0lDX0NPTl9TUEVFRF9TVEQsCisJCS50eF9maWZvX2RlcHRoID0gMzIsCisJCS5yeF9maWZvX2RlcHRoID0gMzIsCisJCS5jbGtfa2h6ICAgICAgPSAyNTAwMCwKKwl9LAorCVttZWRmaWVsZF80XSA9IHsKKwkJLmJ1c19udW0gICAgID0gNCwKKwkJLmJ1c19jZmcgICA9IElOVEVMX01JRF9TVERfQ0ZHIHwgRFdfSUNfQ09OX1NQRUVEX0ZBU1QsCisJCS50eF9maWZvX2RlcHRoID0gMzIsCisJCS5yeF9maWZvX2RlcHRoID0gMzIsCisJCS5jbGtfa2h6ICAgICAgPSAyNTAwMCwKKwl9LAorCVttZWRmaWVsZF81XSA9IHsKKwkJLmJ1c19udW0gICAgID0gNSwKKwkJLmJ1c19jZmcgICA9IElOVEVMX01JRF9TVERfQ0ZHIHwgRFdfSUNfQ09OX1NQRUVEX0ZBU1QsCisJCS50eF9maWZvX2RlcHRoID0gMzIsCisJCS5yeF9maWZvX2RlcHRoID0gMzIsCisJCS5jbGtfa2h6ICAgICAgPSAyNTAwMCwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpMmNfZHdfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIJPSBpMmNfZHdfeGZlciwKKwkuZnVuY3Rpb25hbGl0eQk9IGkyY19kd19mdW5jLAorfTsKKworc3RhdGljIGludCBpMmNfZHdfcGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldik7CisJc3RydWN0IGR3X2kyY19kZXYgKmkyYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgZXJyOworCisKKwlpMmNfZHdfZGlzYWJsZShpMmMpOworCisJZXJyID0gcGNpX3NhdmVfc3RhdGUocGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfc2F2ZV9zdGF0ZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9zZXRfcG93ZXJfc3RhdGUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMmNfZHdfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKKwlzdHJ1Y3QgZHdfaTJjX2RldiAqaTJjID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBlcnI7CisJdTMyIGVuYWJsZWQ7CisKKwllbmFibGVkID0gaTJjX2R3X2lzX2VuYWJsZWQoaTJjKTsKKwlpZiAoZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfc2V0X3Bvd2VyX3N0YXRlKCkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCWkyY19kd19pbml0KGkyYyk7CisJaTJjX2R3X2VuYWJsZShpMmMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyY19kd19wY2lfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyID0gcG1fc2NoZWR1bGVfc3VzcGVuZChkZXYsIDUwMCk7CisJZGV2X2RiZyhkZXYsICJydW50aW1lX2lkbGUgY2FsbGVkXG4iKTsKKworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGkyY19kd19wbV9vcHMgPSB7CisJLnJlc3VtZSAgICAgICAgID0gaTJjX2R3X3BjaV9yZXN1bWUsCisJLnN1c3BlbmQgICAgICAgID0gaTJjX2R3X3BjaV9zdXNwZW5kLAorCVNFVF9SVU5USU1FX1BNX09QUyhpMmNfZHdfcGNpX3N1c3BlbmQsIGkyY19kd19wY2lfcmVzdW1lLAorCQkJICAgaTJjX2R3X3BjaV9ydW50aW1lX2lkbGUpCit9OworCitzdGF0aWMgdTMyIGkyY19kd19nZXRfY2xrX3JhdGVfa2h6KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJcmV0dXJuIGRldi0+Y29udHJvbGxlci0+Y2xrX2toejsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaTJjX2R3X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKK2NvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2OworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBsZW47CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCByOworCXN0cnVjdCAgZHdfcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CisKKwlpZiAoaWQtPmRyaXZlcl9kYXRhID49IEFSUkFZX1NJWkUoZHdfcGNpX2NvbnRyb2xsZXJzKSkgeworCQlwcmludGsoS0VSTl9FUlIgImR3X2kyY19wY2lfcHJvYmU6IGludmFsaWQgZHJpdmVyIGRhdGEgJWxkXG4iLAorCQkJaWQtPmRyaXZlcl9kYXRhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29udHJvbGxlciA9ICZkd19wY2lfY29udHJvbGxlcnNbaWQtPmRyaXZlcl9kYXRhXTsKKworCXIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIEkyQyBQQ0kgZGV2aWNlICglZClcbiIsCisJCQlyKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIERldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgSTJDIGFyZWEgKi8KKwlzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCWlmICghc3RhcnQgfHwgbGVuID09IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYmFzZSBhZGRyZXNzIG5vdCBzZXRcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCXIgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgRFJJVkVSX05BTUUpOworCWlmIChyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IEkyQyByZWdpb24gIgorCQkJIjB4JWx4LTB4JWx4XG4iLCBzdGFydCwKKwkJCSh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9lbmQocGRldiwgMCkpOworCQlnb3RvIGV4aXQ7CisJfQorCisJYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShzdGFydCwgbGVuKTsKKwlpZiAoIWJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSS9PIG1lbW9yeSByZW1hcHBpbmcgZmFpbGVkXG4iKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworCX0KKworCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR3X2kyY19kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikgeworCQlyID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmNtZF9jb21wbGV0ZSk7CisJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKKwlkZXYtPmNsayA9IE5VTEw7CisJZGV2LT5jb250cm9sbGVyID0gY29udHJvbGxlcjsKKwlkZXYtPmdldF9jbGtfcmF0ZV9raHogPSBpMmNfZHdfZ2V0X2Nsa19yYXRlX2toejsKKwlkZXYtPmJhc2UgPSBiYXNlOworCWRldi0+ZGV2ID0gZ2V0X2RldmljZSgmcGRldi0+ZGV2KTsKKwlkZXYtPmZ1bmN0aW9uYWxpdHkgPQorCQlJMkNfRlVOQ19JMkMgfAorCQlJMkNfRlVOQ19TTUJVU19CWVRFIHwKKwkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwKKwkJSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLOworCWRldi0+bWFzdGVyX2NmZyA9ICBjb250cm9sbGVyLT5idXNfY2ZnOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlkZXYtPnR4X2ZpZm9fZGVwdGggPSBjb250cm9sbGVyLT50eF9maWZvX2RlcHRoOworCWRldi0+cnhfZmlmb19kZXB0aCA9IGNvbnRyb2xsZXItPnJ4X2ZpZm9fZGVwdGg7CisJciA9IGkyY19kd19pbml0KGRldik7CisJaWYgKHIpCisJCWdvdG8gZXJyX2lvdW5tYXA7CisKKwlhZGFwID0gJmRldi0+YWRhcHRlcjsKKwlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGRldik7CisJYWRhcC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlhZGFwLT5jbGFzcyA9IDA7CisJYWRhcC0+YWxnbyA9ICZpMmNfZHdfYWxnbzsKKwlhZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlhZGFwLT5uciA9IGNvbnRyb2xsZXItPmJ1c19udW07CisJc25wcmludGYoYWRhcC0+bmFtZSwgc2l6ZW9mKGFkYXAtPm5hbWUpLCAiaTJjLWRlc2lnbndhcmUtcGNpLSVkIiwKKwkJYWRhcC0+bnIpOworCisJciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaTJjX2R3X2lzciwgSVJRRl9TSEFSRUQsIGFkYXAtPm5hbWUsIGRldik7CisJaWYgKHIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbHVyZSByZXF1ZXN0aW5nIGlycSAlaVxuIiwgZGV2LT5pcnEpOworCQlnb3RvIGVycl9pb3VubWFwOworCX0KKworCWkyY19kd19kaXNhYmxlX2ludChkZXYpOworCWkyY19kd19jbGVhcl9pbnQoZGV2KTsKKwlyID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKGFkYXApOworCWlmIChyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgYWRkaW5nIGFkYXB0ZXJcbiIpOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9hbGxvdygmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworZXJyX2lvdW5tYXA6CisJaW91bm1hcChkZXYtPmJhc2UpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwdXRfZGV2aWNlKCZwZGV2LT5kZXYpOworCWtmcmVlKGRldik7CitlcnJfcmVsZWFzZV9yZWdpb246CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworZXhpdDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGkyY19kd19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkd19pMmNfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpMmNfZHdfZGlzYWJsZShkZXYpOworCXBtX3J1bnRpbWVfZm9yYmlkKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKCZwZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWkyY19kZWxfYWRhcHRlcigmZGV2LT5hZGFwdGVyKTsKKwlwdXRfZGV2aWNlKCZwZGV2LT5kZXYpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJa2ZyZWUoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7Cit9CisKKy8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLworTU9EVUxFX0FMSUFTKCJpMmNfZGVzaWdud2FyZS1wY2kiKTsKKworREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaTJfZGVzaWdud2FyZV9wY2lfaWRzKSA9IHsKKwkvKiBNb29yZXN0b3duICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwODAyKSwgbW9vcmVzdG93bl8wIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwODAzKSwgbW9vcmVzdG93bl8xIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwODA0KSwgbW9vcmVzdG93bl8yIH0sCisJLyogTWVkZmllbGQgKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDA4MTcpLCBtZWRmaWVsZF8zLH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwODE4KSwgbWVkZmllbGRfNCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MDgxOSksIG1lZGZpZWxkXzUgfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDA4MkMpLCBtZWRmaWVsZF8wIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwODJEKSwgbWVkZmllbGRfMSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MDgyRSksIG1lZGZpZWxkXzIgfSwKKwl7IDAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpMl9kZXNpZ253YXJlX3BjaV9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHdfaTJjX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUklWRVJfTkFNRSwKKwkuaWRfdGFibGUJPSBpMl9kZXNpZ253YXJlX3BjaV9pZHMsCisJLnByb2JlCQk9IGkyY19kd19wY2lfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChpMmNfZHdfcGNpX3JlbW92ZSksCisJLmRyaXZlciAgICAgICAgID0geworCQkucG0gICAgID0gJmkyY19kd19wbV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGR3X2kyY19pbml0X2RyaXZlcih2b2lkKQoreworCXJldHVybiAgcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHdfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChkd19pMmNfaW5pdF9kcml2ZXIpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZHdfaTJjX2V4aXRfZHJpdmVyKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkd19pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGR3X2kyY19leGl0X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkJhcnVjaCBTaWFjaCA8YmFydWNoQHRrb3MuY28uaWw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN5bm9wc3lzIERlc2lnbldhcmUgUENJIEkyQyBidXMgYWRhcHRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLXBsYXRkcnYuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wbGF0ZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzNjU3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wbGF0ZHJ2LmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBhZGFwdGVyIGRyaXZlciAobWFzdGVyIG9ubHkpLgorICoKKyAqIEJhc2VkIG9uIHRoZSBUSSBEQVZJTkNJIEkyQyBhZGFwdGVyIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUHJvdmlnZW50IEx0ZC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiaTJjLWRlc2lnbndhcmUtY29yZS5oIgorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaTJjX2R3X2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyCT0gaTJjX2R3X3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBpMmNfZHdfZnVuYywKK307CitzdGF0aWMgdTMyIGkyY19kd19nZXRfY2xrX3JhdGVfa2h6KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShkZXYtPmNsaykvMTAwMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZHdfaTJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGR3X2kyY19kZXYgKmRldjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CisJc3RydWN0IHJlc291cmNlICptZW0sICppb2FyZWE7CisJaW50IGlycSwgcjsKKworCS8qIE5PVEU6IGRyaXZlciB1c2VzIHRoZSBzdGF0aWMgcmVnaXN0ZXIgbWFwcGluZyAqLworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gbWVtIHJlc291cmNlP1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIHJlc291cmNlP1xuIik7CisJCXJldHVybiBpcnE7IC8qIC1FTlhJTyAqLworCX0KKworCWlvYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSksCisJCQlwZGV2LT5uYW1lKTsKKwlpZiAoIWlvYXJlYSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJMkMgcmVnaW9uIGFscmVhZHkgY2xhaW1lZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR3X2kyY19kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikgeworCQlyID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmNtZF9jb21wbGV0ZSk7CisJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKKwlkZXYtPmRldiA9IGdldF9kZXZpY2UoJnBkZXYtPmRldik7CisJZGV2LT5pcnEgPSBpcnE7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWRldi0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlkZXYtPmdldF9jbGtfcmF0ZV9raHogPSBpMmNfZHdfZ2V0X2Nsa19yYXRlX2toejsKKworCWlmIChJU19FUlIoZGV2LT5jbGspKSB7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisJY2xrX2VuYWJsZShkZXYtPmNsayk7CisKKwlkZXYtPmZ1bmN0aW9uYWxpdHkgPQorCQlJMkNfRlVOQ19JMkMgfAorCQlJMkNfRlVOQ18xMEJJVF9BRERSIHwKKwkJSTJDX0ZVTkNfU01CVVNfQllURSB8CisJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCUkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8CisJCUkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSzsKKwlkZXYtPm1hc3Rlcl9jZmcgPSAgRFdfSUNfQ09OX01BU1RFUiB8IERXX0lDX0NPTl9TTEFWRV9ESVNBQkxFIHwKKwkJRFdfSUNfQ09OX1JFU1RBUlRfRU4gfCBEV19JQ19DT05fU1BFRURfRkFTVDsKKworCWRldi0+YmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKwlpZiAoZGV2LT5iYXNlID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbHVyZSBtYXBwaW5nIGlvIHJlc291cmNlc1xuIik7CisJCXIgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3VudXNlX2Nsb2NrczsKKwl9CisJeworCQl1MzIgcGFyYW0xID0gaTJjX2R3X3JlYWRfY29tcF9wYXJhbShkZXYpOworCisJCWRldi0+dHhfZmlmb19kZXB0aCA9ICgocGFyYW0xID4+IDE2KSAmIDB4ZmYpICsgMTsKKwkJZGV2LT5yeF9maWZvX2RlcHRoID0gKChwYXJhbTEgPj4gOCkgICYgMHhmZikgKyAxOworCX0KKwlyID0gaTJjX2R3X2luaXQoZGV2KTsKKwlpZiAocikKKwkJZ290byBlcnJfaW91bm1hcDsKKworCWkyY19kd19kaXNhYmxlX2ludChkZXYpOworCXIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaTJjX2R3X2lzciwgSVJRRl9ESVNBQkxFRCwgcGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsdXJlIHJlcXVlc3RpbmcgaXJxICVpXG4iLCBkZXYtPmlycSk7CisJCWdvdG8gZXJyX2lvdW5tYXA7CisJfQorCisJYWRhcCA9ICZkZXYtPmFkYXB0ZXI7CisJaTJjX3NldF9hZGFwZGF0YShhZGFwLCBkZXYpOworCWFkYXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJYWRhcC0+Y2xhc3MgPSBJMkNfQ0xBU1NfSFdNT047CisJc3RybGNweShhZGFwLT5uYW1lLCAiU3lub3BzeXMgRGVzaWduV2FyZSBJMkMgYWRhcHRlciIsCisJCQlzaXplb2YoYWRhcC0+bmFtZSkpOworCWFkYXAtPmFsZ28gPSAmaTJjX2R3X2FsZ287CisJYWRhcC0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisKKwlhZGFwLT5uciA9IHBkZXYtPmlkOworCXIgPSBpMmNfYWRkX251bWJlcmVkX2FkYXB0ZXIoYWRhcCk7CisJaWYgKHIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbHVyZSBhZGRpbmcgYWRhcHRlclxuIik7CisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCX0KKworCXJldHVybiAwOworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitlcnJfaW91bm1hcDoKKwlpb3VubWFwKGRldi0+YmFzZSk7CitlcnJfdW51c2VfY2xvY2tzOgorCWNsa19kaXNhYmxlKGRldi0+Y2xrKTsKKwljbGtfcHV0KGRldi0+Y2xrKTsKKwlkZXYtPmNsayA9IE5VTEw7CitlcnJfZnJlZV9tZW06CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcHV0X2RldmljZSgmcGRldi0+ZGV2KTsKKwlrZnJlZShkZXYpOworZXJyX3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGR3X2kyY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICptZW07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlpMmNfZGVsX2FkYXB0ZXIoJmRldi0+YWRhcHRlcik7CisJcHV0X2RldmljZSgmcGRldi0+ZGV2KTsKKworCWNsa19kaXNhYmxlKGRldi0+Y2xrKTsKKwljbGtfcHV0KGRldi0+Y2xrKTsKKwlkZXYtPmNsayA9IE5VTEw7CisKKwlpMmNfZHdfZGlzYWJsZShkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWtmcmVlKGRldik7CisKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCXJldHVybiAwOworfQorCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06aTJjX2Rlc2lnbndhcmUiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHdfaTJjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGR3X2kyY19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJpMmNfZGVzaWdud2FyZSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkd19pMmNfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZkd19pMmNfZHJpdmVyLCBkd19pMmNfcHJvYmUpOworfQorbW9kdWxlX2luaXQoZHdfaTJjX2luaXRfZHJpdmVyKTsKKworc3RhdGljIHZvaWQgX19leGl0IGR3X2kyY19leGl0X2RyaXZlcih2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkd19pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGR3X2kyY19leGl0X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkJhcnVjaCBTaWFjaCA8YmFydWNoQHRrb3MuY28uaWw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN5bm9wc3lzIERlc2lnbldhcmUgSTJDIGJ1cyBhZGFwdGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjQyYjUwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODQ3ICswLDAgQEAKLS8qCi0gKiBTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBhZGFwdGVyIGRyaXZlciAobWFzdGVyIG9ubHkpLgotICoKLSAqIEJhc2VkIG9uIHRoZSBUSSBEQVZJTkNJIEkyQyBhZGFwdGVyIGRyaXZlci4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGV4YXMgSW5zdHJ1bWVudHMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgUHJvdmlnZW50IEx0ZC4KLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLS8qCi0gKiBSZWdpc3RlcnMgb2Zmc2V0Ci0gKi8KLSNkZWZpbmUgRFdfSUNfQ09OCQkweDAKLSNkZWZpbmUgRFdfSUNfVEFSCQkweDQKLSNkZWZpbmUgRFdfSUNfREFUQV9DTUQJCTB4MTAKLSNkZWZpbmUgRFdfSUNfU1NfU0NMX0hDTlQJMHgxNAotI2RlZmluZSBEV19JQ19TU19TQ0xfTENOVAkweDE4Ci0jZGVmaW5lIERXX0lDX0ZTX1NDTF9IQ05UCTB4MWMKLSNkZWZpbmUgRFdfSUNfRlNfU0NMX0xDTlQJMHgyMAotI2RlZmluZSBEV19JQ19JTlRSX1NUQVQJCTB4MmMKLSNkZWZpbmUgRFdfSUNfSU5UUl9NQVNLCQkweDMwCi0jZGVmaW5lIERXX0lDX1JBV19JTlRSX1NUQVQJMHgzNAotI2RlZmluZSBEV19JQ19SWF9UTAkJMHgzOAotI2RlZmluZSBEV19JQ19UWF9UTAkJMHgzYwotI2RlZmluZSBEV19JQ19DTFJfSU5UUgkJMHg0MAotI2RlZmluZSBEV19JQ19DTFJfUlhfVU5ERVIJMHg0NAotI2RlZmluZSBEV19JQ19DTFJfUlhfT1ZFUgkweDQ4Ci0jZGVmaW5lIERXX0lDX0NMUl9UWF9PVkVSCTB4NGMKLSNkZWZpbmUgRFdfSUNfQ0xSX1JEX1JFUQkweDUwCi0jZGVmaW5lIERXX0lDX0NMUl9UWF9BQlJUCTB4NTQKLSNkZWZpbmUgRFdfSUNfQ0xSX1JYX0RPTkUJMHg1OAotI2RlZmluZSBEV19JQ19DTFJfQUNUSVZJVFkJMHg1YwotI2RlZmluZSBEV19JQ19DTFJfU1RPUF9ERVQJMHg2MAotI2RlZmluZSBEV19JQ19DTFJfU1RBUlRfREVUCTB4NjQKLSNkZWZpbmUgRFdfSUNfQ0xSX0dFTl9DQUxMCTB4NjgKLSNkZWZpbmUgRFdfSUNfRU5BQkxFCQkweDZjCi0jZGVmaW5lIERXX0lDX1NUQVRVUwkJMHg3MAotI2RlZmluZSBEV19JQ19UWEZMUgkJMHg3NAotI2RlZmluZSBEV19JQ19SWEZMUgkJMHg3OAotI2RlZmluZSBEV19JQ19DT01QX1BBUkFNXzEJMHhmNAotI2RlZmluZSBEV19JQ19UWF9BQlJUX1NPVVJDRQkweDgwCi0KLSNkZWZpbmUgRFdfSUNfQ09OX01BU1RFUgkJMHgxCi0jZGVmaW5lIERXX0lDX0NPTl9TUEVFRF9TVEQJCTB4MgotI2RlZmluZSBEV19JQ19DT05fU1BFRURfRkFTVAkJMHg0Ci0jZGVmaW5lIERXX0lDX0NPTl8xMEJJVEFERFJfTUFTVEVSCTB4MTAKLSNkZWZpbmUgRFdfSUNfQ09OX1JFU1RBUlRfRU4JCTB4MjAKLSNkZWZpbmUgRFdfSUNfQ09OX1NMQVZFX0RJU0FCTEUJCTB4NDAKLQotI2RlZmluZSBEV19JQ19JTlRSX1JYX1VOREVSCTB4MDAxCi0jZGVmaW5lIERXX0lDX0lOVFJfUlhfT1ZFUgkweDAwMgotI2RlZmluZSBEV19JQ19JTlRSX1JYX0ZVTEwJMHgwMDQKLSNkZWZpbmUgRFdfSUNfSU5UUl9UWF9PVkVSCTB4MDA4Ci0jZGVmaW5lIERXX0lDX0lOVFJfVFhfRU1QVFkJMHgwMTAKLSNkZWZpbmUgRFdfSUNfSU5UUl9SRF9SRVEJMHgwMjAKLSNkZWZpbmUgRFdfSUNfSU5UUl9UWF9BQlJUCTB4MDQwCi0jZGVmaW5lIERXX0lDX0lOVFJfUlhfRE9ORQkweDA4MAotI2RlZmluZSBEV19JQ19JTlRSX0FDVElWSVRZCTB4MTAwCi0jZGVmaW5lIERXX0lDX0lOVFJfU1RPUF9ERVQJMHgyMDAKLSNkZWZpbmUgRFdfSUNfSU5UUl9TVEFSVF9ERVQJMHg0MDAKLSNkZWZpbmUgRFdfSUNfSU5UUl9HRU5fQ0FMTAkweDgwMAotCi0jZGVmaW5lIERXX0lDX0lOVFJfREVGQVVMVF9NQVNLCQkoRFdfSUNfSU5UUl9SWF9GVUxMIHwgXAotCQkJCQkgRFdfSUNfSU5UUl9UWF9FTVBUWSB8IFwKLQkJCQkJIERXX0lDX0lOVFJfVFhfQUJSVCB8IFwKLQkJCQkJIERXX0lDX0lOVFJfU1RPUF9ERVQpCi0KLSNkZWZpbmUgRFdfSUNfU1RBVFVTX0FDVElWSVRZCTB4MQotCi0jZGVmaW5lIERXX0lDX0VSUl9UWF9BQlJUCTB4MQotCi0vKgotICogc3RhdHVzIGNvZGVzCi0gKi8KLSNkZWZpbmUgU1RBVFVTX0lETEUJCQkweDAKLSNkZWZpbmUgU1RBVFVTX1dSSVRFX0lOX1BST0dSRVNTCTB4MQotI2RlZmluZSBTVEFUVVNfUkVBRF9JTl9QUk9HUkVTUwkJMHgyCi0KLSNkZWZpbmUgVElNRU9VVAkJCTIwIC8qIG1zICovCi0KLS8qCi0gKiBoYXJkd2FyZSBhYm9ydCBjb2RlcyBmcm9tIHRoZSBEV19JQ19UWF9BQlJUX1NPVVJDRSByZWdpc3RlcgotICoKLSAqIG9ubHkgZXhwZWN0ZWQgYWJvcnQgY29kZXMgYXJlIGxpc3RlZCBoZXJlCi0gKiByZWZlciB0byB0aGUgZGF0YXNoZWV0IGZvciB0aGUgZnVsbCBsaXN0Ci0gKi8KLSNkZWZpbmUgQUJSVF83Ql9BRERSX05PQUNLCTAKLSNkZWZpbmUgQUJSVF8xMEFERFIxX05PQUNLCTEKLSNkZWZpbmUgQUJSVF8xMEFERFIyX05PQUNLCTIKLSNkZWZpbmUgQUJSVF9UWERBVEFfTk9BQ0sJMwotI2RlZmluZSBBQlJUX0dDQUxMX05PQUNLCTQKLSNkZWZpbmUgQUJSVF9HQ0FMTF9SRUFECQk1Ci0jZGVmaW5lIEFCUlRfU0JZVEVfQUNLREVUCTcKLSNkZWZpbmUgQUJSVF9TQllURV9OT1JTVFJUCTkKLSNkZWZpbmUgQUJSVF8xMEJfUkRfTk9SU1RSVAkxMAotI2RlZmluZSBBQlJUX01BU1RFUl9ESVMJCTExCi0jZGVmaW5lIEFSQl9MT1NUCQkxMgotCi0jZGVmaW5lIERXX0lDX1RYX0FCUlRfN0JfQUREUl9OT0FDSwkoMVVMIDw8IEFCUlRfN0JfQUREUl9OT0FDSykKLSNkZWZpbmUgRFdfSUNfVFhfQUJSVF8xMEFERFIxX05PQUNLCSgxVUwgPDwgQUJSVF8xMEFERFIxX05PQUNLKQotI2RlZmluZSBEV19JQ19UWF9BQlJUXzEwQUREUjJfTk9BQ0sJKDFVTCA8PCBBQlJUXzEwQUREUjJfTk9BQ0spCi0jZGVmaW5lIERXX0lDX1RYX0FCUlRfVFhEQVRBX05PQUNLCSgxVUwgPDwgQUJSVF9UWERBVEFfTk9BQ0spCi0jZGVmaW5lIERXX0lDX1RYX0FCUlRfR0NBTExfTk9BQ0sJKDFVTCA8PCBBQlJUX0dDQUxMX05PQUNLKQotI2RlZmluZSBEV19JQ19UWF9BQlJUX0dDQUxMX1JFQUQJKDFVTCA8PCBBQlJUX0dDQUxMX1JFQUQpCi0jZGVmaW5lIERXX0lDX1RYX0FCUlRfU0JZVEVfQUNLREVUCSgxVUwgPDwgQUJSVF9TQllURV9BQ0tERVQpCi0jZGVmaW5lIERXX0lDX1RYX0FCUlRfU0JZVEVfTk9SU1RSVAkoMVVMIDw8IEFCUlRfU0JZVEVfTk9SU1RSVCkKLSNkZWZpbmUgRFdfSUNfVFhfQUJSVF8xMEJfUkRfTk9SU1RSVAkoMVVMIDw8IEFCUlRfMTBCX1JEX05PUlNUUlQpCi0jZGVmaW5lIERXX0lDX1RYX0FCUlRfTUFTVEVSX0RJUwkoMVVMIDw8IEFCUlRfTUFTVEVSX0RJUykKLSNkZWZpbmUgRFdfSUNfVFhfQVJCX0xPU1QJCSgxVUwgPDwgQVJCX0xPU1QpCi0KLSNkZWZpbmUgRFdfSUNfVFhfQUJSVF9OT0FDSwkJKERXX0lDX1RYX0FCUlRfN0JfQUREUl9OT0FDSyB8IFwKLQkJCQkJIERXX0lDX1RYX0FCUlRfMTBBRERSMV9OT0FDSyB8IFwKLQkJCQkJIERXX0lDX1RYX0FCUlRfMTBBRERSMl9OT0FDSyB8IFwKLQkJCQkJIERXX0lDX1RYX0FCUlRfVFhEQVRBX05PQUNLIHwgXAotCQkJCQkgRFdfSUNfVFhfQUJSVF9HQ0FMTF9OT0FDSykKLQotc3RhdGljIGNoYXIgKmFib3J0X3NvdXJjZXNbXSA9IHsKLQlbQUJSVF83Ql9BRERSX05PQUNLXSA9Ci0JCSJzbGF2ZSBhZGRyZXNzIG5vdCBhY2tub3dsZWRnZWQgKDdiaXQgbW9kZSkiLAotCVtBQlJUXzEwQUREUjFfTk9BQ0tdID0KLQkJImZpcnN0IGFkZHJlc3MgYnl0ZSBub3QgYWNrbm93bGVkZ2VkICgxMGJpdCBtb2RlKSIsCi0JW0FCUlRfMTBBRERSMl9OT0FDS10gPQotCQkic2Vjb25kIGFkZHJlc3MgYnl0ZSBub3QgYWNrbm93bGVkZ2VkICgxMGJpdCBtb2RlKSIsCi0JW0FCUlRfVFhEQVRBX05PQUNLXSA9Ci0JCSJkYXRhIG5vdCBhY2tub3dsZWRnZWQiLAotCVtBQlJUX0dDQUxMX05PQUNLXSA9Ci0JCSJubyBhY2tub3dsZWRnZW1lbnQgZm9yIGEgZ2VuZXJhbCBjYWxsIiwKLQlbQUJSVF9HQ0FMTF9SRUFEXSA9Ci0JCSJyZWFkIGFmdGVyIGdlbmVyYWwgY2FsbCIsCi0JW0FCUlRfU0JZVEVfQUNLREVUXSA9Ci0JCSJzdGFydCBieXRlIGFja25vd2xlZGdlZCIsCi0JW0FCUlRfU0JZVEVfTk9SU1RSVF0gPQotCQkidHJ5aW5nIHRvIHNlbmQgc3RhcnQgYnl0ZSB3aGVuIHJlc3RhcnQgaXMgZGlzYWJsZWQiLAotCVtBQlJUXzEwQl9SRF9OT1JTVFJUXSA9Ci0JCSJ0cnlpbmcgdG8gcmVhZCB3aGVuIHJlc3RhcnQgaXMgZGlzYWJsZWQgKDEwYml0IG1vZGUpIiwKLQlbQUJSVF9NQVNURVJfRElTXSA9Ci0JCSJ0cnlpbmcgdG8gdXNlIGRpc2FibGVkIGFkYXB0ZXIiLAotCVtBUkJfTE9TVF0gPQotCQkibG9zdCBhcmJpdHJhdGlvbiIsCi19OwotCi0vKioKLSAqIHN0cnVjdCBkd19pMmNfZGV2IC0gcHJpdmF0ZSBpMmMtZGVzaWdud2FyZSBkYXRhCi0gKiBAZGV2OiBkcml2ZXIgbW9kZWwgZGV2aWNlIG5vZGUKLSAqIEBiYXNlOiBJTyByZWdpc3RlcnMgcG9pbnRlcgotICogQGNtZF9jb21wbGV0ZTogdHggY29tcGxldGlvbiBpbmRpY2F0b3IKLSAqIEBsb2NrOiBwcm90ZWN0IHRoaXMgc3RydWN0IGFuZCBJTyByZWdpc3RlcnMKLSAqIEBjbGs6IGlucHV0IHJlZmVyZW5jZSBjbG9jawotICogQGNtZF9lcnI6IHJ1biB0aW1lIGhhZHdhcmUgZXJyb3IgY29kZQotICogQG1zZ3M6IHBvaW50cyB0byBhbiBhcnJheSBvZiBtZXNzYWdlcyBjdXJyZW50bHkgYmVpbmcgdHJhbnNmZXJyZWQKLSAqIEBtc2dzX251bTogdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBtc2dzCi0gKiBAbXNnX3dyaXRlX2lkeDogdGhlIGVsZW1lbnQgaW5kZXggb2YgdGhlIGN1cnJlbnQgdHggbWVzc2FnZSBpbiB0aGUgbXNncwotICoJYXJyYXkKLSAqIEB0eF9idWZfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHR4IGJ1ZmZlcgotICogQHR4X2J1ZjogdGhlIGN1cnJlbnQgdHggYnVmZmVyCi0gKiBAbXNnX3JlYWRfaWR4OiB0aGUgZWxlbWVudCBpbmRleCBvZiB0aGUgY3VycmVudCByeCBtZXNzYWdlIGluIHRoZSBtc2dzCi0gKglhcnJheQotICogQHJ4X2J1Zl9sZW46IHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgcnggYnVmZmVyCi0gKiBAcnhfYnVmOiB0aGUgY3VycmVudCByeCBidWZmZXIKLSAqIEBtc2dfZXJyOiBlcnJvciBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNmZXIKLSAqIEBzdGF0dXM6IGkyYyBtYXN0ZXIgc3RhdHVzLCBvbmUgb2YgU1RBVFVTXyoKLSAqIEBhYm9ydF9zb3VyY2U6IGNvcHkgb2YgdGhlIFRYX0FCUlRfU09VUkNFIHJlZ2lzdGVyCi0gKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyIGZvciB0aGUgaTJjIG1hc3RlcgotICogQGFkYXB0ZXI6IGkyYyBzdWJzeXN0ZW0gYWRhcHRlciBub2RlCi0gKiBAdHhfZmlmb19kZXB0aDogZGVwdGggb2YgdGhlIGhhcmR3YXJlIHR4IGZpZm8KLSAqIEByeF9maWZvX2RlcHRoOiBkZXB0aCBvZiB0aGUgaGFyZHdhcmUgcnggZmlmbwotICovCi1zdHJ1Y3QgZHdfaTJjX2RldiB7Ci0Jc3RydWN0IGRldmljZQkJKmRldjsKLQl2b2lkIF9faW9tZW0JCSpiYXNlOwotCXN0cnVjdCBjb21wbGV0aW9uCWNtZF9jb21wbGV0ZTsKLQlzdHJ1Y3QgbXV0ZXgJCWxvY2s7Ci0Jc3RydWN0IGNsawkJKmNsazsKLQlpbnQJCQljbWRfZXJyOwotCXN0cnVjdCBpMmNfbXNnCQkqbXNnczsKLQlpbnQJCQltc2dzX251bTsKLQlpbnQJCQltc2dfd3JpdGVfaWR4OwotCXUzMgkJCXR4X2J1Zl9sZW47Ci0JdTgJCQkqdHhfYnVmOwotCWludAkJCW1zZ19yZWFkX2lkeDsKLQl1MzIJCQlyeF9idWZfbGVuOwotCXU4CQkJKnJ4X2J1ZjsKLQlpbnQJCQltc2dfZXJyOwotCXVuc2lnbmVkIGludAkJc3RhdHVzOwotCXUzMgkJCWFib3J0X3NvdXJjZTsKLQlpbnQJCQlpcnE7Ci0Jc3RydWN0IGkyY19hZGFwdGVyCWFkYXB0ZXI7Ci0JdW5zaWduZWQgaW50CQl0eF9maWZvX2RlcHRoOwotCXVuc2lnbmVkIGludAkJcnhfZmlmb19kZXB0aDsKLX07Ci0KLXN0YXRpYyB1MzIKLWkyY19kd19zY2xfaGNudCh1MzIgaWNfY2xrLCB1MzIgdFNZTUJPTCwgdTMyIHRmLCBpbnQgY29uZCwgaW50IG9mZnNldCkKLXsKLQkvKgotCSAqIERlc2lnbldhcmUgSTJDIGNvcmUgZG9lc24ndCBzZWVtIHRvIGhhdmUgc29saWQgc3RyYXRlZ3kgdG8gbWVldAotCSAqIHRoZSB0SEQ7U1RBIHRpbWluZyBzcGVjLiAgQ29uZmlndXJpbmcgX0hDTlQgYmFzZWQgb24gdEhJR0ggc3BlYwotCSAqIHdpbGwgcmVzdWx0IGluIHZpb2xhdGlvbiBvZiB0aGUgdEhEO1NUQSBzcGVjLgotCSAqLwotCWlmIChjb25kKQotCQkvKgotCQkgKiBDb25kaXRpb25hbCBleHByZXNzaW9uOgotCQkgKgotCQkgKiAgIElDX1tGU11TX1NDTF9IQ05UICsgKDErNCszKSA+PSBJQ19DTEsgKiB0SElHSAotCQkgKgotCQkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBEVyBtYW51YWxzLCBhbmQgcmVwcmVzZW50cyBhbiBpZGVhbAotCQkgKiBjb25maWd1cmF0aW9uLiAgVGhlIHJlc3VsdGluZyBJMkMgYnVzIHNwZWVkIHdpbGwgYmUKLQkJICogZmFzdGVyIHRoYW4gYW55IG9mIHRoZSBvdGhlcnMuCi0JCSAqCi0JCSAqIElmIHlvdXIgaGFyZHdhcmUgaXMgZnJlZSBmcm9tIHRIRDtTVEEgaXNzdWUsIHRyeSB0aGlzIG9uZS4KLQkJICovCi0JCXJldHVybiAoaWNfY2xrICogdFNZTUJPTCArIDUwMDApIC8gMTAwMDAgLSA4ICsgb2Zmc2V0OwotCWVsc2UKLQkJLyoKLQkJICogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbjoKLQkJICoKLQkJICogICBJQ19bRlNdU19TQ0xfSENOVCArIDMgPj0gSUNfQ0xLICogKHRIRDtTVEEgKyB0ZikKLQkJICoKLQkJICogVGhpcyBpcyBqdXN0IGV4cGVyaW1lbnRhbCBydWxlOyB0aGUgdEhEO1NUQSBwZXJpb2QgdHVybmVkCi0JCSAqIG91dCB0byBiZSBwcm9wb3J0aW5hbCB0byAoX0hDTlQgKyAzKS4gIFdpdGggdGhpcyBzZXR0aW5nLAotCQkgKiB3ZSBjb3VsZCBtZWV0IGJvdGggdEhJR0ggYW5kIHRIRDtTVEEgdGltaW5nIHNwZWNzLgotCQkgKgotCQkgKiBJZiB1bnN1cmUsIHlvdSdkIGJldHRlciB0byB0YWtlIHRoaXMgYWx0ZXJuYXRpdmUuCi0JCSAqCi0JCSAqIFRoZSByZWFzb24gd2h5IHdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgInRmIiBoZXJlLAotCQkgKiBpcyB0aGUgc2FtZSBhcyBkZXNjcmliZWQgaW4gaTJjX2R3X3NjbF9sY250KCkuCi0JCSAqLwotCQlyZXR1cm4gKGljX2NsayAqICh0U1lNQk9MICsgdGYpICsgNTAwMCkgLyAxMDAwMCAtIDMgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyB1MzIgaTJjX2R3X3NjbF9sY250KHUzMiBpY19jbGssIHUzMiB0TE9XLCB1MzIgdGYsIGludCBvZmZzZXQpCi17Ci0JLyoKLQkgKiBDb25kaXRpb25hbCBleHByZXNzaW9uOgotCSAqCi0JICogICBJQ19bRlNdU19TQ0xfTENOVCArIDEgPj0gSUNfQ0xLICogKHRMT1cgKyB0ZikKLQkgKgotCSAqIERXIEkyQyBjb3JlIHN0YXJ0cyBjb3VudGluZyB0aGUgU0NMIENOVHMgZm9yIHRoZSBMT1cgcGVyaW9kCi0JICogb2YgdGhlIFNDTCBjbG9jayAodExPVykgYXMgc29vbiBhcyBpdCBwdWxscyB0aGUgU0NMIGxpbmUuCi0JICogSW4gb3JkZXIgdG8gbWVldCB0aGUgdExPVyB0aW1pbmcgc3BlYywgd2UgbmVlZCB0byB0YWtlIGludG8KLQkgKiBhY2NvdW50IHRoZSBmYWxsIHRpbWUgb2YgU0NMIHNpZ25hbCAodGYpLiAgRGVmYXVsdCB0ZiB2YWx1ZQotCSAqIHNob3VsZCBiZSAwLjMgdXMsIGZvciBzYWZldHkuCi0JICovCi0JcmV0dXJuICgoaWNfY2xrICogKHRMT1cgKyB0ZikgKyA1MDAwKSAvIDEwMDAwKSAtIDEgKyBvZmZzZXQ7Ci19Ci0KLS8qKgotICogaTJjX2R3X2luaXQoKSAtIGluaXRpYWxpemUgdGhlIGRlc2lnbndhcmUgaTJjIG1hc3RlciBoYXJkd2FyZQotICogQGRldjogZGV2aWNlIHByaXZhdGUgZGF0YQotICoKLSAqIFRoaXMgZnVuY3Rpb25zIGNvbmZpZ3VyZXMgYW5kIGVuYWJsZXMgdGhlIEkyQyBtYXN0ZXIuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgSTJDIGluaXQgZnVuY3Rpb24sIGFuZCBpbiBjYXNlIG9mIHRpbWVvdXQgYXQKLSAqIHJ1biB0aW1lLgotICovCi1zdGF0aWMgdm9pZCBpMmNfZHdfaW5pdChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQotewotCXUzMiBpbnB1dF9jbG9ja19raHogPSBjbGtfZ2V0X3JhdGUoZGV2LT5jbGspIC8gMTAwMDsKLQl1MzIgaWNfY29uLCBoY250LCBsY250OwotCi0JLyogRGlzYWJsZSB0aGUgYWRhcHRlciAqLwotCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBEV19JQ19FTkFCTEUpOwotCi0JLyogc2V0IHN0YW5kYXJkIGFuZCBmYXN0IHNwZWVkIGRldmlkZXJzIGZvciBoaWdoL2xvdyBwZXJpb2RzICovCi0KLQkvKiBTdGFuZGFyZC1tb2RlICovCi0JaGNudCA9IGkyY19kd19zY2xfaGNudChpbnB1dF9jbG9ja19raHosCi0JCQkJNDAsCS8qIHRIRDtTVEEgPSB0SElHSCA9IDQuMCB1cyAqLwotCQkJCTMsCS8qIHRmID0gMC4zIHVzICovCi0JCQkJMCwJLyogMDogRFcgZGVmYXVsdCwgMTogSWRlYWwgKi8KLQkJCQkwKTsJLyogTm8gb2Zmc2V0ICovCi0JbGNudCA9IGkyY19kd19zY2xfbGNudChpbnB1dF9jbG9ja19raHosCi0JCQkJNDcsCS8qIHRMT1cgPSA0LjcgdXMgKi8KLQkJCQkzLAkvKiB0ZiA9IDAuMyB1cyAqLwotCQkJCTApOwkvKiBObyBvZmZzZXQgKi8KLQl3cml0ZWwoaGNudCwgZGV2LT5iYXNlICsgRFdfSUNfU1NfU0NMX0hDTlQpOwotCXdyaXRlbChsY250LCBkZXYtPmJhc2UgKyBEV19JQ19TU19TQ0xfTENOVCk7Ci0JZGV2X2RiZyhkZXYtPmRldiwgIlN0YW5kYXJkLW1vZGUgSENOVDpMQ05UID0gJWQ6JWRcbiIsIGhjbnQsIGxjbnQpOwotCi0JLyogRmFzdC1tb2RlICovCi0JaGNudCA9IGkyY19kd19zY2xfaGNudChpbnB1dF9jbG9ja19raHosCi0JCQkJNiwJLyogdEhEO1NUQSA9IHRISUdIID0gMC42IHVzICovCi0JCQkJMywJLyogdGYgPSAwLjMgdXMgKi8KLQkJCQkwLAkvKiAwOiBEVyBkZWZhdWx0LCAxOiBJZGVhbCAqLwotCQkJCTApOwkvKiBObyBvZmZzZXQgKi8KLQlsY250ID0gaTJjX2R3X3NjbF9sY250KGlucHV0X2Nsb2NrX2toeiwKLQkJCQkxMywJLyogdExPVyA9IDEuMyB1cyAqLwotCQkJCTMsCS8qIHRmID0gMC4zIHVzICovCi0JCQkJMCk7CS8qIE5vIG9mZnNldCAqLwotCXdyaXRlbChoY250LCBkZXYtPmJhc2UgKyBEV19JQ19GU19TQ0xfSENOVCk7Ci0Jd3JpdGVsKGxjbnQsIGRldi0+YmFzZSArIERXX0lDX0ZTX1NDTF9MQ05UKTsKLQlkZXZfZGJnKGRldi0+ZGV2LCAiRmFzdC1tb2RlIEhDTlQ6TENOVCA9ICVkOiVkXG4iLCBoY250LCBsY250KTsKLQotCS8qIENvbmZpZ3VyZSBUeC9SeCBGSUZPIHRocmVzaG9sZCBsZXZlbHMgKi8KLQl3cml0ZWwoZGV2LT50eF9maWZvX2RlcHRoIC0gMSwgZGV2LT5iYXNlICsgRFdfSUNfVFhfVEwpOwotCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBEV19JQ19SWF9UTCk7Ci0KLQkvKiBjb25maWd1cmUgdGhlIGkyYyBtYXN0ZXIgKi8KLQlpY19jb24gPSBEV19JQ19DT05fTUFTVEVSIHwgRFdfSUNfQ09OX1NMQVZFX0RJU0FCTEUgfAotCQlEV19JQ19DT05fUkVTVEFSVF9FTiB8IERXX0lDX0NPTl9TUEVFRF9GQVNUOwotCXdyaXRlbChpY19jb24sIGRldi0+YmFzZSArIERXX0lDX0NPTik7Ci19Ci0KLS8qCi0gKiBXYWl0aW5nIGZvciBidXMgbm90IGJ1c3kKLSAqLwotc3RhdGljIGludCBpMmNfZHdfd2FpdF9idXNfbm90X2J1c3koc3RydWN0IGR3X2kyY19kZXYgKmRldikKLXsKLQlpbnQgdGltZW91dCA9IFRJTUVPVVQ7Ci0KLQl3aGlsZSAocmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfU1RBVFVTKSAmIERXX0lDX1NUQVRVU19BQ1RJVklUWSkgewotCQlpZiAodGltZW91dCA8PSAwKSB7Ci0JCQlkZXZfd2FybihkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgYnVzIHJlYWR5XG4iKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JCXRpbWVvdXQtLTsKLQkJbWRlbGF5KDEpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpMmNfZHdfeGZlcl9pbml0KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGkyY19tc2cgKm1zZ3MgPSBkZXYtPm1zZ3M7Ci0JdTMyIGljX2NvbjsKLQotCS8qIERpc2FibGUgdGhlIGFkYXB0ZXIgKi8KLQl3cml0ZWwoMCwgZGV2LT5iYXNlICsgRFdfSUNfRU5BQkxFKTsKLQotCS8qIHNldCB0aGUgc2xhdmUgKHRhcmdldCkgYWRkcmVzcyAqLwotCXdyaXRlbChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYWRkciwgZGV2LT5iYXNlICsgRFdfSUNfVEFSKTsKLQotCS8qIGlmIHRoZSBzbGF2ZSBhZGRyZXNzIGlzIHRlbiBiaXQgYWRkcmVzcywgZW5hYmxlIDEwQklUQUREUiAqLwotCWljX2NvbiA9IHJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NPTik7Ci0JaWYgKG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5mbGFncyAmIEkyQ19NX1RFTikKLQkJaWNfY29uIHw9IERXX0lDX0NPTl8xMEJJVEFERFJfTUFTVEVSOwotCWVsc2UKLQkJaWNfY29uICY9IH5EV19JQ19DT05fMTBCSVRBRERSX01BU1RFUjsKLQl3cml0ZWwoaWNfY29uLCBkZXYtPmJhc2UgKyBEV19JQ19DT04pOwotCi0JLyogRW5hYmxlIHRoZSBhZGFwdGVyICovCi0Jd3JpdGVsKDEsIGRldi0+YmFzZSArIERXX0lDX0VOQUJMRSk7Ci0KLQkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwotCXdyaXRlbChEV19JQ19JTlRSX0RFRkFVTFRfTUFTSywgZGV2LT5iYXNlICsgRFdfSUNfSU5UUl9NQVNLKTsKLX0KLQotLyoKLSAqIEluaXRpYXRlIChhbmQgY29udGludWUpIGxvdyBsZXZlbCBtYXN0ZXIgcmVhZC93cml0ZSB0cmFuc2FjdGlvbi4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZnJvbSBpMmNfZHdfaXNyLCBhbmQgcHVtcGluZyBpMmNfbXNnCi0gKiBtZXNzYWdlcyBpbnRvIHRoZSB0eCBidWZmZXIuICBFdmVuIGlmIHRoZSBzaXplIG9mIGkyY19tc2cgZGF0YSBpcwotICogbG9uZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIHR4IGJ1ZmZlciwgaXQgaGFuZGxlcyBldmVyeXRoaW5nLgotICovCi1zdGF0aWMgdm9pZAotaTJjX2R3X3hmZXJfbXNnKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGkyY19tc2cgKm1zZ3MgPSBkZXYtPm1zZ3M7Ci0JdTMyIGludHJfbWFzazsKLQlpbnQgdHhfbGltaXQsIHJ4X2xpbWl0OwotCXUzMiBhZGRyID0gbXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmFkZHI7Ci0JdTMyIGJ1Zl9sZW4gPSBkZXYtPnR4X2J1Zl9sZW47Ci0JdTggKmJ1ZiA9IGRldi0+dHhfYnVmOwotCi0JaW50cl9tYXNrID0gRFdfSUNfSU5UUl9ERUZBVUxUX01BU0s7Ci0KLQlmb3IgKDsgZGV2LT5tc2dfd3JpdGVfaWR4IDwgZGV2LT5tc2dzX251bTsgZGV2LT5tc2dfd3JpdGVfaWR4KyspIHsKLQkJLyoKLQkJICogaWYgdGFyZ2V0IGFkZHJlc3MgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8KLQkJICogcmVwcm9ncmFtIHRoZSB0YXJnZXQgYWRkcmVzcyBpbiB0aGUgaTJjCi0JCSAqIGFkYXB0ZXIgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgdHJhbnNmZXIKLQkJICovCi0JCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYWRkciAhPSBhZGRyKSB7Ci0JCQlkZXZfZXJyKGRldi0+ZGV2LAotCQkJCSIlczogaW52YWxpZCB0YXJnZXQgYWRkcmVzc1xuIiwgX19mdW5jX18pOwotCQkJZGV2LT5tc2dfZXJyID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5sZW4gPT0gMCkgewotCQkJZGV2X2VycihkZXYtPmRldiwKLQkJCQkiJXM6IGludmFsaWQgbWVzc2FnZSBsZW5ndGhcbiIsIF9fZnVuY19fKTsKLQkJCWRldi0+bXNnX2VyciA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICghKGRldi0+c3RhdHVzICYgU1RBVFVTX1dSSVRFX0lOX1BST0dSRVNTKSkgewotCQkJLyogbmV3IGkyY19tc2cgKi8KLQkJCWJ1ZiA9IG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5idWY7Ci0JCQlidWZfbGVuID0gbXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmxlbjsKLQkJfQotCi0JCXR4X2xpbWl0ID0gZGV2LT50eF9maWZvX2RlcHRoIC0gcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfVFhGTFIpOwotCQlyeF9saW1pdCA9IGRldi0+cnhfZmlmb19kZXB0aCAtIHJlYWRsKGRldi0+YmFzZSArIERXX0lDX1JYRkxSKTsKLQotCQl3aGlsZSAoYnVmX2xlbiA+IDAgJiYgdHhfbGltaXQgPiAwICYmIHJ4X2xpbWl0ID4gMCkgewotCQkJaWYgKG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5mbGFncyAmIEkyQ19NX1JEKSB7Ci0JCQkJd3JpdGVsKDB4MTAwLCBkZXYtPmJhc2UgKyBEV19JQ19EQVRBX0NNRCk7Ci0JCQkJcnhfbGltaXQtLTsKLQkJCX0gZWxzZQotCQkJCXdyaXRlbCgqYnVmKyssIGRldi0+YmFzZSArIERXX0lDX0RBVEFfQ01EKTsKLQkJCXR4X2xpbWl0LS07IGJ1Zl9sZW4tLTsKLQkJfQotCi0JCWRldi0+dHhfYnVmID0gYnVmOwotCQlkZXYtPnR4X2J1Zl9sZW4gPSBidWZfbGVuOwotCi0JCWlmIChidWZfbGVuID4gMCkgewotCQkJLyogbW9yZSBieXRlcyB0byBiZSB3cml0dGVuICovCi0JCQlkZXYtPnN0YXR1cyB8PSBTVEFUVVNfV1JJVEVfSU5fUFJPR1JFU1M7Ci0JCQlicmVhazsKLQkJfSBlbHNlCi0JCQlkZXYtPnN0YXR1cyAmPSB+U1RBVFVTX1dSSVRFX0lOX1BST0dSRVNTOwotCX0KLQotCS8qCi0JICogSWYgaTJjX21zZyBpbmRleCBzZWFyY2ggaXMgY29tcGxldGVkLCB3ZSBkb24ndCBuZWVkIFRYX0VNUFRZCi0JICogaW50ZXJydXB0IGFueSBtb3JlLgotCSAqLwotCWlmIChkZXYtPm1zZ193cml0ZV9pZHggPT0gZGV2LT5tc2dzX251bSkKLQkJaW50cl9tYXNrICY9IH5EV19JQ19JTlRSX1RYX0VNUFRZOwotCi0JaWYgKGRldi0+bXNnX2VycikKLQkJaW50cl9tYXNrID0gMDsKLQotCXdyaXRlbChpbnRyX21hc2ssIGRldi0+YmFzZSArIERXX0lDX0lOVFJfTUFTSyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pMmNfZHdfcmVhZChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQotewotCXN0cnVjdCBpMmNfbXNnICptc2dzID0gZGV2LT5tc2dzOwotCWludCByeF92YWxpZDsKLQotCWZvciAoOyBkZXYtPm1zZ19yZWFkX2lkeCA8IGRldi0+bXNnc19udW07IGRldi0+bXNnX3JlYWRfaWR4KyspIHsKLQkJdTMyIGxlbjsKLQkJdTggKmJ1ZjsKLQotCQlpZiAoIShtc2dzW2Rldi0+bXNnX3JlYWRfaWR4XS5mbGFncyAmIEkyQ19NX1JEKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghKGRldi0+c3RhdHVzICYgU1RBVFVTX1JFQURfSU5fUFJPR1JFU1MpKSB7Ci0JCQlsZW4gPSBtc2dzW2Rldi0+bXNnX3JlYWRfaWR4XS5sZW47Ci0JCQlidWYgPSBtc2dzW2Rldi0+bXNnX3JlYWRfaWR4XS5idWY7Ci0JCX0gZWxzZSB7Ci0JCQlsZW4gPSBkZXYtPnJ4X2J1Zl9sZW47Ci0JCQlidWYgPSBkZXYtPnJ4X2J1ZjsKLQkJfQotCi0JCXJ4X3ZhbGlkID0gcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfUlhGTFIpOwotCi0JCWZvciAoOyBsZW4gPiAwICYmIHJ4X3ZhbGlkID4gMDsgbGVuLS0sIHJ4X3ZhbGlkLS0pCi0JCQkqYnVmKysgPSByZWFkbChkZXYtPmJhc2UgKyBEV19JQ19EQVRBX0NNRCk7Ci0KLQkJaWYgKGxlbiA+IDApIHsKLQkJCWRldi0+c3RhdHVzIHw9IFNUQVRVU19SRUFEX0lOX1BST0dSRVNTOwotCQkJZGV2LT5yeF9idWZfbGVuID0gbGVuOwotCQkJZGV2LT5yeF9idWYgPSBidWY7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZQotCQkJZGV2LT5zdGF0dXMgJj0gflNUQVRVU19SRUFEX0lOX1BST0dSRVNTOwotCX0KLX0KLQotc3RhdGljIGludCBpMmNfZHdfaGFuZGxlX3R4X2Fib3J0KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCi17Ci0JdW5zaWduZWQgbG9uZyBhYm9ydF9zb3VyY2UgPSBkZXYtPmFib3J0X3NvdXJjZTsKLQlpbnQgaTsKLQotCWlmIChhYm9ydF9zb3VyY2UgJiBEV19JQ19UWF9BQlJUX05PQUNLKSB7Ci0JCWZvcl9lYWNoX3NldF9iaXQoaSwgJmFib3J0X3NvdXJjZSwgQVJSQVlfU0laRShhYm9ydF9zb3VyY2VzKSkKLQkJCWRldl9kYmcoZGV2LT5kZXYsCi0JCQkJIiVzOiAlc1xuIiwgX19mdW5jX18sIGFib3J0X3NvdXJjZXNbaV0pOwotCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQl9Ci0KLQlmb3JfZWFjaF9zZXRfYml0KGksICZhYm9ydF9zb3VyY2UsIEFSUkFZX1NJWkUoYWJvcnRfc291cmNlcykpCi0JCWRldl9lcnIoZGV2LT5kZXYsICIlczogJXNcbiIsIF9fZnVuY19fLCBhYm9ydF9zb3VyY2VzW2ldKTsKLQotCWlmIChhYm9ydF9zb3VyY2UgJiBEV19JQ19UWF9BUkJfTE9TVCkKLQkJcmV0dXJuIC1FQUdBSU47Ci0JZWxzZSBpZiAoYWJvcnRfc291cmNlICYgRFdfSUNfVFhfQUJSVF9HQ0FMTF9SRUFEKQotCQlyZXR1cm4gLUVJTlZBTDsgLyogd3JvbmcgbXNnc1tdIGRhdGEgKi8KLQllbHNlCi0JCXJldHVybiAtRUlPOwotfQotCi0vKgotICogUHJlcGFyZSBjb250cm9sbGVyIGZvciBhIHRyYW5zYWN0aW9uIGFuZCBjYWxsIGkyY19kd194ZmVyX21zZwotICovCi1zdGF0aWMgaW50Ci1pMmNfZHdfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ3NbXSwgaW50IG51bSkKLXsKLQlzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2ID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyhkZXYtPmRldiwgIiVzOiBtc2dzOiAlZFxuIiwgX19mdW5jX18sIG51bSk7Ci0KLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCi0JSU5JVF9DT01QTEVUSU9OKGRldi0+Y21kX2NvbXBsZXRlKTsKLQlkZXYtPm1zZ3MgPSBtc2dzOwotCWRldi0+bXNnc19udW0gPSBudW07Ci0JZGV2LT5jbWRfZXJyID0gMDsKLQlkZXYtPm1zZ193cml0ZV9pZHggPSAwOwotCWRldi0+bXNnX3JlYWRfaWR4ID0gMDsKLQlkZXYtPm1zZ19lcnIgPSAwOwotCWRldi0+c3RhdHVzID0gU1RBVFVTX0lETEU7Ci0JZGV2LT5hYm9ydF9zb3VyY2UgPSAwOwotCi0JcmV0ID0gaTJjX2R3X3dhaXRfYnVzX25vdF9idXN5KGRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZG9uZTsKLQotCS8qIHN0YXJ0IHRoZSB0cmFuc2ZlcnMgKi8KLQlpMmNfZHdfeGZlcl9pbml0KGRldik7Ci0KLQkvKiB3YWl0IGZvciB0eCB0byBjb21wbGV0ZSAqLwotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZkZXYtPmNtZF9jb21wbGV0ZSwgSFopOwotCWlmIChyZXQgPT0gMCkgewotCQlkZXZfZXJyKGRldi0+ZGV2LCAiY29udHJvbGxlciB0aW1lZCBvdXRcbiIpOwotCQlpMmNfZHdfaW5pdChkZXYpOwotCQlyZXQgPSAtRVRJTUVET1VUOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIGlmIChyZXQgPCAwKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAoZGV2LT5tc2dfZXJyKSB7Ci0JCXJldCA9IGRldi0+bXNnX2VycjsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIG5vIGVycm9yICovCi0JaWYgKGxpa2VseSghZGV2LT5jbWRfZXJyKSkgewotCQkvKiBEaXNhYmxlIHRoZSBhZGFwdGVyICovCi0JCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBEV19JQ19FTkFCTEUpOwotCQlyZXQgPSBudW07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBXZSBoYXZlIGFuIGVycm9yICovCi0JaWYgKGRldi0+Y21kX2VyciA9PSBEV19JQ19FUlJfVFhfQUJSVCkgewotCQlyZXQgPSBpMmNfZHdfaGFuZGxlX3R4X2Fib3J0KGRldik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gLUVJTzsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdTMyIGkyY19kd19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlyZXR1cm4JSTJDX0ZVTkNfSTJDIHwKLQkJSTJDX0ZVTkNfMTBCSVRfQUREUiB8Ci0JCUkyQ19GVU5DX1NNQlVTX0JZVEUgfAotCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAotCQlJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAotCQlJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0s7Ci19Ci0KLXN0YXRpYyB1MzIgaTJjX2R3X3JlYWRfY2xlYXJfaW50cmJpdHMoc3RydWN0IGR3X2kyY19kZXYgKmRldikKLXsKLQl1MzIgc3RhdDsKLQotCS8qCi0JICogVGhlIElDX0lOVFJfU1RBVCByZWdpc3RlciBqdXN0IGluZGljYXRlcyAiZW5hYmxlZCIgaW50ZXJydXB0cy4KLQkgKiBUaHMgdW5tYXNrZWQgcmF3IHZlcnNpb24gb2YgaW50ZXJydXB0IHN0YXR1cyBiaXRzIGFyZSBhdmFpbGFibGUKLQkgKiBpbiB0aGUgSUNfUkFXX0lOVFJfU1RBVCByZWdpc3Rlci4KLQkgKgotCSAqIFRoYXQgaXMsCi0JICogICBzdGF0ID0gcmVhZGwoSUNfSU5UUl9TVEFUKTsKLQkgKiBlcXVhbHMgdG8sCi0JICogICBzdGF0ID0gcmVhZGwoSUNfUkFXX0lOVFJfU1RBVCkgJiByZWFkbChJQ19JTlRSX01BU0spOwotCSAqCi0JICogVGhlIHJhdyB2ZXJzaW9uIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotCSAqLwotCXN0YXQgPSByZWFkbChkZXYtPmJhc2UgKyBEV19JQ19JTlRSX1NUQVQpOwotCi0JLyoKLQkgKiBEbyBub3QgdXNlIHRoZSBJQ19DTFJfSU5UUiByZWdpc3RlciB0byBjbGVhciBpbnRlcnJ1cHRzLCBvcgotCSAqIHlvdSdsbCBtaXNzIHNvbWUgaW50ZXJydXB0cywgdHJpZ2dlcmVkIGR1cmluZyB0aGUgcGVyaW9kIGZyb20KLQkgKiByZWFkbChJQ19JTlRSX1NUQVQpIHRvIHJlYWRsKElDX0NMUl9JTlRSKS4KLQkgKgotCSAqIEluc3RlYWQsIHVzZSB0aGUgc2VwYXJhdGVseS1wcmVwYXJlZCBJQ19DTFJfKiByZWdpc3RlcnMuCi0JICovCi0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1JYX1VOREVSKQotCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfUlhfVU5ERVIpOwotCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9SWF9PVkVSKQotCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfUlhfT1ZFUik7Ci0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1RYX09WRVIpCi0JCXJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NMUl9UWF9PVkVSKTsKLQlpZiAoc3RhdCAmIERXX0lDX0lOVFJfUkRfUkVRKQotCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfUkRfUkVRKTsKLQlpZiAoc3RhdCAmIERXX0lDX0lOVFJfVFhfQUJSVCkgewotCQkvKgotCQkgKiBUaGUgSUNfVFhfQUJSVF9TT1VSQ0UgcmVnaXN0ZXIgaXMgY2xlYXJlZCB3aGVuZXZlcgotCQkgKiB0aGUgSUNfQ0xSX1RYX0FCUlQgaXMgcmVhZC4gIFByZXNlcnZlIGl0IGJlZm9yZWhhbmQuCi0JCSAqLwotCQlkZXYtPmFib3J0X3NvdXJjZSA9IHJlYWRsKGRldi0+YmFzZSArIERXX0lDX1RYX0FCUlRfU09VUkNFKTsKLQkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX1RYX0FCUlQpOwotCX0KLQlpZiAoc3RhdCAmIERXX0lDX0lOVFJfUlhfRE9ORSkKLQkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX1JYX0RPTkUpOwotCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9BQ1RJVklUWSkKLQkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX0FDVElWSVRZKTsKLQlpZiAoc3RhdCAmIERXX0lDX0lOVFJfU1RPUF9ERVQpCi0JCXJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NMUl9TVE9QX0RFVCk7Ci0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1NUQVJUX0RFVCkKLQkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX1NUQVJUX0RFVCk7Ci0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX0dFTl9DQUxMKQotCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfR0VOX0NBTEwpOwotCi0JcmV0dXJuIHN0YXQ7Ci19Ci0KLS8qCi0gKiBJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiBUaGlzIGdldHMgY2FsbGVkIHdoZW5ldmVyIGFuIEkyQyBpbnRlcnJ1cHQKLSAqIG9jY3Vycy4KLSAqLwotc3RhdGljIGlycXJldHVybl90IGkyY19kd19pc3IoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGR3X2kyY19kZXYgKmRldiA9IGRldl9pZDsKLQl1MzIgc3RhdDsKLQotCXN0YXQgPSBpMmNfZHdfcmVhZF9jbGVhcl9pbnRyYml0cyhkZXYpOwotCWRldl9kYmcoZGV2LT5kZXYsICIlczogc3RhdD0weCV4XG4iLCBfX2Z1bmNfXywgc3RhdCk7Ci0KLQlpZiAoc3RhdCAmIERXX0lDX0lOVFJfVFhfQUJSVCkgewotCQlkZXYtPmNtZF9lcnIgfD0gRFdfSUNfRVJSX1RYX0FCUlQ7Ci0JCWRldi0+c3RhdHVzID0gU1RBVFVTX0lETEU7Ci0KLQkJLyoKLQkJICogQW55dGltZSBUWF9BQlJUIGlzIHNldCwgdGhlIGNvbnRlbnRzIG9mIHRoZSB0eC9yeAotCQkgKiBidWZmZXJzIGFyZSBmbHVzaGVkLiAgTWFrZSBzdXJlIHRvIHNraXAgdGhlbS4KLQkJICovCi0JCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBEV19JQ19JTlRSX01BU0spOwotCQlnb3RvIHR4X2Fib3J0ZWQ7Ci0JfQotCi0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1JYX0ZVTEwpCi0JCWkyY19kd19yZWFkKGRldik7Ci0KLQlpZiAoc3RhdCAmIERXX0lDX0lOVFJfVFhfRU1QVFkpCi0JCWkyY19kd194ZmVyX21zZyhkZXYpOwotCi0JLyoKLQkgKiBObyBuZWVkIHRvIG1vZGlmeSBvciBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgbWFzayBoZXJlLgotCSAqIGkyY19kd194ZmVyX21zZygpIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGFjY29yZGluZyB0bwotCSAqIHRoZSBjdXJyZW50IHRyYW5zbWl0IHN0YXR1cy4KLQkgKi8KLQotdHhfYWJvcnRlZDoKLQlpZiAoKHN0YXQgJiAoRFdfSUNfSU5UUl9UWF9BQlJUIHwgRFdfSUNfSU5UUl9TVE9QX0RFVCkpIHx8IGRldi0+bXNnX2VycikKLQkJY29tcGxldGUoJmRldi0+Y21kX2NvbXBsZXRlKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19kd19hbGdvID0gewotCS5tYXN0ZXJfeGZlcgk9IGkyY19kd194ZmVyLAotCS5mdW5jdGlvbmFsaXR5CT0gaTJjX2R3X2Z1bmMsCi19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkd19pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgKmlvYXJlYTsKLQlpbnQgaXJxLCByOwotCi0JLyogTk9URTogZHJpdmVyIHVzZXMgdGhlIHN0YXRpYyByZWdpc3RlciBtYXBwaW5nICovCi0JbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIW1lbSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW0gcmVzb3VyY2U/XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoaXJxIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpcnEgcmVzb3VyY2U/XG4iKTsKLQkJcmV0dXJuIGlycTsgLyogLUVOWElPICovCi0JfQotCi0JaW9hcmVhID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSwKLQkJCXBkZXYtPm5hbWUpOwotCWlmICghaW9hcmVhKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkkyQyByZWdpb24gYWxyZWFkeSBjbGFpbWVkXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHdfaTJjX2RldiksIEdGUF9LRVJORUwpOwotCWlmICghZGV2KSB7Ci0JCXIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQlpbml0X2NvbXBsZXRpb24oJmRldi0+Y21kX2NvbXBsZXRlKTsKLQltdXRleF9pbml0KCZkZXYtPmxvY2spOwotCWRldi0+ZGV2ID0gZ2V0X2RldmljZSgmcGRldi0+ZGV2KTsKLQlkZXYtPmlycSA9IGlycTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwotCi0JZGV2LT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwotCWlmIChJU19FUlIoZGV2LT5jbGspKSB7Ci0JCXIgPSAtRU5PREVWOwotCQlnb3RvIGVycl9mcmVlX21lbTsKLQl9Ci0JY2xrX2VuYWJsZShkZXYtPmNsayk7Ci0KLQlkZXYtPmJhc2UgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7Ci0JaWYgKGRldi0+YmFzZSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgbWFwcGluZyBpbyByZXNvdXJjZXNcbiIpOwotCQlyID0gLUVCVVNZOwotCQlnb3RvIGVycl91bnVzZV9jbG9ja3M7Ci0JfQotCXsKLQkJdTMyIHBhcmFtMSA9IHJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NPTVBfUEFSQU1fMSk7Ci0KLQkJZGV2LT50eF9maWZvX2RlcHRoID0gKChwYXJhbTEgPj4gMTYpICYgMHhmZikgKyAxOwotCQlkZXYtPnJ4X2ZpZm9fZGVwdGggPSAoKHBhcmFtMSA+PiA4KSAgJiAweGZmKSArIDE7Ci0JfQotCWkyY19kd19pbml0KGRldik7Ci0KLQl3cml0ZWwoMCwgZGV2LT5iYXNlICsgRFdfSUNfSU5UUl9NQVNLKTsgLyogZGlzYWJsZSBJUlEgKi8KLQlyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGkyY19kd19pc3IsIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIGRldik7Ci0JaWYgKHIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbHVyZSByZXF1ZXN0aW5nIGlycSAlaVxuIiwgZGV2LT5pcnEpOwotCQlnb3RvIGVycl9pb3VubWFwOwotCX0KLQotCWFkYXAgPSAmZGV2LT5hZGFwdGVyOwotCWkyY19zZXRfYWRhcGRhdGEoYWRhcCwgZGV2KTsKLQlhZGFwLT5vd25lciA9IFRISVNfTU9EVUxFOwotCWFkYXAtPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOwotCXN0cmxjcHkoYWRhcC0+bmFtZSwgIlN5bm9wc3lzIERlc2lnbldhcmUgSTJDIGFkYXB0ZXIiLAotCQkJc2l6ZW9mKGFkYXAtPm5hbWUpKTsKLQlhZGFwLT5hbGdvID0gJmkyY19kd19hbGdvOwotCWFkYXAtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwotCi0JYWRhcC0+bnIgPSBwZGV2LT5pZDsKLQlyID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKGFkYXApOwotCWlmIChyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgYWRkaW5nIGFkYXB0ZXJcbiIpOwotCQlnb3RvIGVycl9mcmVlX2lycTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2ZyZWVfaXJxOgotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotZXJyX2lvdW5tYXA6Ci0JaW91bm1hcChkZXYtPmJhc2UpOwotZXJyX3VudXNlX2Nsb2NrczoKLQljbGtfZGlzYWJsZShkZXYtPmNsayk7Ci0JY2xrX3B1dChkZXYtPmNsayk7Ci0JZGV2LT5jbGsgPSBOVUxMOwotZXJyX2ZyZWVfbWVtOgotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCXB1dF9kZXZpY2UoJnBkZXYtPmRldik7Ci0Ja2ZyZWUoZGV2KTsKLWVycl9yZWxlYXNlX3JlZ2lvbjoKLQlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKLQotCXJldHVybiByOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBkd19pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGR3X2kyY19kZXYgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCByZXNvdXJjZSAqbWVtOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JaTJjX2RlbF9hZGFwdGVyKCZkZXYtPmFkYXB0ZXIpOwotCXB1dF9kZXZpY2UoJnBkZXYtPmRldik7Ci0KLQljbGtfZGlzYWJsZShkZXYtPmNsayk7Ci0JY2xrX3B1dChkZXYtPmNsayk7Ci0JZGV2LT5jbGsgPSBOVUxMOwotCi0Jd3JpdGVsKDAsIGRldi0+YmFzZSArIERXX0lDX0VOQUJMRSk7Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0Ja2ZyZWUoZGV2KTsKLQotCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTppMmNfZGVzaWdud2FyZSIpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkd19pMmNfZHJpdmVyID0gewotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHdfaTJjX3JlbW92ZSksCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gImkyY19kZXNpZ253YXJlIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGR3X2kyY19pbml0X2RyaXZlcih2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmR3X2kyY19kcml2ZXIsIGR3X2kyY19wcm9iZSk7Ci19Ci1tb2R1bGVfaW5pdChkd19pMmNfaW5pdF9kcml2ZXIpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZHdfaTJjX2V4aXRfZHJpdmVyKHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3X2kyY19kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoZHdfaTJjX2V4aXRfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiQmFydWNoIFNpYWNoIDxiYXJ1Y2hAdGtvcy5jby5pbD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU3lub3BzeXMgRGVzaWduV2FyZSBJMkMgYnVzIGFkYXB0ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYwppbmRleCBjZTFhMzJiLi44Y2ViZWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVnMjB0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lZzIwdC5jCkBAIC02NCw2ICs2NCw3IEBACiAjZGVmaW5lIFRFTl9CSVRfQUREUl9ERUZBVUxUCTB4RjAwMAogI2RlZmluZSBURU5fQklUX0FERFJfTUFTSwkweEYwCiAjZGVmaW5lIFBDSF9TVEFSVAkJMHgwMDIwCisjZGVmaW5lIFBDSF9SRVNUQVJUCQkweDAwMDQKICNkZWZpbmUgUENIX0VTUl9TVEFSVAkJMHgwMDAxCiAjZGVmaW5lIFBDSF9CVUZGX1NUQVJUCQkweDEKICNkZWZpbmUgUENIX1JFUFNUQVJUCQkweDAwMDQKQEAgLTI3MywyMyArMjc0LDI0IEBACiAJCQkJICAgICBzMzIgdGltZW91dCkKIHsKIAl2b2lkIF9faW9tZW0gKnAgPSBhZGFwLT5wY2hfYmFzZV9hZGRyZXNzOworCWt0aW1lX3QgbnNfdmFsOworCisJaWYgKChpb3JlYWQzMihwICsgUENIX0kyQ1NSKSAmIEkyQ01CQl9CSVQpID09IDApCisJCXJldHVybiAwOwogCiAJLyogTUFYIHRpbWVvdXQgdmFsdWUgaXMgdGltZW91dCoxMDAwKjEwMDBuc2VjICovCi0Ja3RpbWVfdCBuc192YWwgPSBrdGltZV9hZGRfbnMoa3RpbWVfZ2V0KCksIHRpbWVvdXQqMTAwMCoxMDAwKTsKKwluc192YWwgPSBrdGltZV9hZGRfbnMoa3RpbWVfZ2V0KCksIHRpbWVvdXQqMTAwMCoxMDAwKTsKIAlkbyB7Ci0JCWlmICgoaW9yZWFkMzIocCArIFBDSF9JMkNTUikgJiBJMkNNQkJfQklUKSA9PSAwKQotCQkJYnJlYWs7CiAJCW1zbGVlcCgyMCk7CisJCWlmICgoaW9yZWFkMzIocCArIFBDSF9JMkNTUikgJiBJMkNNQkJfQklUKSA9PSAwKQorCQkJcmV0dXJuIDA7CiAJfSB3aGlsZSAoa3RpbWVfbHQoa3RpbWVfZ2V0KCksIG5zX3ZhbCkpOwogCiAJcGNoX2RiZyhhZGFwLCAiSTJDU1IgPSAleFxuIiwgaW9yZWFkMzIocCArIFBDSF9JMkNTUikpOworCXBjaF9lcnIoYWRhcCwgIiVzOiBUaW1lb3V0IEVycm9yLnJldHVybiVkXG4iLCBfX2Z1bmNfXywgLUVUSU1FKTsKKwlwY2hfaTJjX2luaXQoYWRhcCk7CiAKLQlpZiAodGltZW91dCA9PSAwKSB7Ci0JCXBjaF9lcnIoYWRhcCwgIiVzOiBUaW1lb3V0IEVycm9yLnJldHVybiVkXG4iLCBfX2Z1bmNfXywgLUVUSU1FKTsKLQkJcmV0dXJuIC1FVElNRTsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVUSU1FOwogfQogCiAvKioKQEAgLTMxMSwyMSArMzEzLDE5IEBACiAgKi8KIHN0YXRpYyBzMzIgcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRhcCkKIHsKLQlzMzIgcmV0OworCWxvbmcgcmV0OwogCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwY2hfZXZlbnQsCiAJCQkoYWRhcC0+cGNoX2V2ZW50X2ZsYWcgIT0gMCksIG1zZWNzX3RvX2ppZmZpZXMoNTApKTsKLQlpZiAocmV0IDwgMCkgewotCQlwY2hfZXJyKGFkYXAsICJ0aW1lb3V0OiAleFxuIiwgYWRhcC0+cGNoX2V2ZW50X2ZsYWcpOwotCQlyZXR1cm4gcmV0OwotCX0KIAogCWlmIChyZXQgPT0gMCkgewogCQlwY2hfZXJyKGFkYXAsICJ0aW1lb3V0OiAleFxuIiwgYWRhcC0+cGNoX2V2ZW50X2ZsYWcpOworCQlhZGFwLT5wY2hfZXZlbnRfZmxhZyA9IDA7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIAogCWlmIChhZGFwLT5wY2hfZXZlbnRfZmxhZyAmIEkyQ19FUlJPUl9NQVNLKSB7CiAJCXBjaF9lcnIoYWRhcCwgImVycm9yIGJpdHMgc2V0OiAleFxuIiwgYWRhcC0+cGNoX2V2ZW50X2ZsYWcpOworCQlhZGFwLT5wY2hfZXZlbnRfZmxhZyA9IDA7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMzk0LDYgKzM5NCw3IEBACiAJdTMyIGFkZHJfMl9tc2I7CiAJdTMyIGFkZHJfOF9sc2I7CiAJczMyIHdyY291bnQ7CisJczMyIHJ0bjsKIAl2b2lkIF9faW9tZW0gKnAgPSBhZGFwLT5wY2hfYmFzZV9hZGRyZXNzOwogCiAJbGVuZ3RoID0gbXNncy0+bGVuOwpAQCAtNDEyLDE1ICs0MTMsMjkgQEAKIAl9CiAKIAlpZiAobXNncy0+ZmxhZ3MgJiBJMkNfTV9URU4pIHsKLQkJYWRkcl8yX21zYiA9ICgoYWRkciAmIEkyQ19NU0JfMkJfTVNLKSA+PiA3KTsKKwkJYWRkcl8yX21zYiA9ICgoYWRkciAmIEkyQ19NU0JfMkJfTVNLKSA+PiA3KSAmIDB4MDY7CiAJCWlvd3JpdGUzMihhZGRyXzJfbXNiIHwgVEVOX0JJVF9BRERSX01BU0ssIHAgKyBQQ0hfSTJDRFIpOwogCQlpZiAoZmlyc3QpCiAJCQlwY2hfaTJjX3N0YXJ0KGFkYXApOwotCQlpZiAocGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApID09IDAgJiYKLQkJICAgIHBjaF9pMmNfZ2V0YWNrKGFkYXApID09IDApIHsKKworCQlydG4gPSBwY2hfaTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoYWRhcCk7CisJCWlmIChydG4gPT0gMCkgeworCQkJaWYgKHBjaF9pMmNfZ2V0YWNrKGFkYXApKSB7CisJCQkJcGNoX2RiZyhhZGFwLCAiUmVjZWl2ZSBOQUNLIGZvciBzbGF2ZSBhZGRyZXNzIgorCQkJCQkic2V0dGluZ1xuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CiAJCQlhZGRyXzhfbHNiID0gKGFkZHIgJiBJMkNfQUREUl9NU0spOwogCQkJaW93cml0ZTMyKGFkZHJfOF9sc2IsIHAgKyBQQ0hfSTJDRFIpOwotCQl9IGVsc2UgeworCQl9IGVsc2UgaWYgKHJ0biA9PSAtRUlPKSB7IC8qIEFyYml0cmF0aW9uIExvc3QgKi8KKwkJCXBjaF9lcnIoYWRhcCwgIkxvc3QgQXJiaXRyYXRpb25cbiIpOworCQkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsCisJCQkJICAgSTJDTUFMX0JJVCk7CisJCQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwKKwkJCQkgICBJMkNNSUZfQklUKTsKKwkJCXBjaF9pMmNfaW5pdChhZGFwKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9IGVsc2UgeyAvKiB3YWl0LWV2ZW50IHRpbWVvdXQgKi8KIAkJCXBjaF9pMmNfc3RvcChhZGFwKTsKIAkJCXJldHVybiAtRVRJTUU7CiAJCX0KQEAgLTQzMSwzMSArNDQ2LDUyIEBACiAJCQlwY2hfaTJjX3N0YXJ0KGFkYXApOwogCX0KIAotCWlmICgocGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApID09IDApICYmCi0JICAgIChwY2hfaTJjX2dldGFjayhhZGFwKSA9PSAwKSkgewotCQlmb3IgKHdyY291bnQgPSAwOyB3cmNvdW50IDwgbGVuZ3RoOyArK3dyY291bnQpIHsKLQkJCS8qIHdyaXRlIGJ1ZmZlciB2YWx1ZSB0byBJMkMgZGF0YSByZWdpc3RlciAqLwotCQkJaW93cml0ZTMyKGJ1Zlt3cmNvdW50XSwgcCArIFBDSF9JMkNEUik7Ci0JCQlwY2hfZGJnKGFkYXAsICJ3cml0aW5nICV4IHRvIERhdGEgcmVnaXN0ZXJcbiIsCi0JCQkJYnVmW3dyY291bnRdKTsKLQotCQkJaWYgKHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKSAhPSAwKQotCQkJCXJldHVybiAtRVRJTUU7Ci0KLQkJCWlmIChwY2hfaTJjX2dldGFjayhhZGFwKSkKLQkJCQlyZXR1cm4gLUVJTzsKKwlydG4gPSBwY2hfaTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoYWRhcCk7CisJaWYgKHJ0biA9PSAwKSB7CisJCWlmIChwY2hfaTJjX2dldGFjayhhZGFwKSkgeworCQkJcGNoX2RiZyhhZGFwLCAiUmVjZWl2ZSBOQUNLIGZvciBzbGF2ZSBhZGRyZXNzIgorCQkJCSJzZXR0aW5nXG4iKTsKKwkJCXJldHVybiAtRUlPOwogCQl9Ci0KLQkJLyogY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFzdCBtZXNzYWdlICovCi0JCWlmIChsYXN0KQotCQkJcGNoX2kyY19zdG9wKGFkYXApOwotCQllbHNlCi0JCQlwY2hfaTJjX3JlcHN0YXJ0KGFkYXApOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChydG4gPT0gLUVJTykgeyAvKiBBcmJpdHJhdGlvbiBMb3N0ICovCisJCXBjaF9lcnIoYWRhcCwgIkxvc3QgQXJiaXRyYXRpb25cbiIpOworCQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwgSTJDTUFMX0JJVCk7CisJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLCBJMkNNSUZfQklUKTsKKwkJcGNoX2kyY19pbml0KGFkYXApOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9IGVsc2UgeyAvKiB3YWl0LWV2ZW50IHRpbWVvdXQgKi8KIAkJcGNoX2kyY19zdG9wKGFkYXApOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIC1FVElNRTsKIAl9CiAKKwlmb3IgKHdyY291bnQgPSAwOyB3cmNvdW50IDwgbGVuZ3RoOyArK3dyY291bnQpIHsKKwkJLyogd3JpdGUgYnVmZmVyIHZhbHVlIHRvIEkyQyBkYXRhIHJlZ2lzdGVyICovCisJCWlvd3JpdGUzMihidWZbd3Jjb3VudF0sIHAgKyBQQ0hfSTJDRFIpOworCQlwY2hfZGJnKGFkYXAsICJ3cml0aW5nICV4IHRvIERhdGEgcmVnaXN0ZXJcbiIsIGJ1Zlt3cmNvdW50XSk7CisKKwkJcnRuID0gcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApOworCQlpZiAocnRuID09IDApIHsKKwkJCWlmIChwY2hfaTJjX2dldGFjayhhZGFwKSkgeworCQkJCXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBmb3Igc2xhdmUgYWRkcmVzcyIKKwkJCQkJInNldHRpbmdcbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsCisJCQkJICAgSTJDTUNGX0JJVCk7CisJCQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwKKwkJCQkgICBJMkNNSUZfQklUKTsKKwkJfSBlbHNlIHsgLyogd2FpdC1ldmVudCB0aW1lb3V0ICovCisJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCisJLyogY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFzdCBtZXNzYWdlICovCisJaWYgKGxhc3QpCisJCXBjaF9pMmNfc3RvcChhZGFwKTsKKwllbHNlCisJCXBjaF9pMmNfcmVwc3RhcnQoYWRhcCk7CisKIAlwY2hfZGJnKGFkYXAsICJyZXR1cm49JWRcbiIsIHdyY291bnQpOwogCiAJcmV0dXJuIHdyY291bnQ7CkBAIC00ODQsNiArNTIwLDE5IEBACiB9CiAKIC8qKgorICogcGNoX2kyY19yZXN0YXJ0KCkgLSBHZW5lcmF0ZSBJMkMgcmVzdGFydCBjb25kaXRpb24gaW4gbm9ybWFsIG1vZGUuCisgKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCisgKgorICogR2VuZXJhdGUgSTJDIHJlc3RhcnQgY29uZGl0aW9uIGluIG5vcm1hbCBtb2RlIGJ5IHNldHRpbmcgSTJDQ1RMLkkyQ1JTVEEuCisgKi8KK3N0YXRpYyB2b2lkIHBjaF9pMmNfcmVzdGFydChzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXApCit7CisJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKKwlwY2hfZGJnKGFkYXAsICJJMkNDVEwgPSAleFxuIiwgaW9yZWFkMzIocCArIFBDSF9JMkNDVEwpKTsKKwlwY2hfc2V0Yml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNDVEwsIFBDSF9SRVNUQVJUKTsKK30KKworLyoqCiAgKiBwY2hfaTJjX3JlYWRieXRlcygpIC0gcmVhZCBkYXRhICBmcm9tIEkyQyBidXMgaW4gbm9ybWFsIG1vZGUuCiAgKiBAaTJjX2FkYXA6CVBvaW50ZXIgdG8gdGhlIHN0cnVjdCBpMmNfYWRhcHRlci4KICAqIEBtc2dzOglQb2ludGVyIHRvIGkyY19tc2cgc3RydWN0dXJlLgpAQCAtNTAwLDcgKzU0OSw5IEBACiAJdTMyIGxlbmd0aDsKIAl1MzIgYWRkcjsKIAl1MzIgYWRkcl8yX21zYjsKKwl1MzIgYWRkcl84X2xzYjsKIAl2b2lkIF9faW9tZW0gKnAgPSBhZGFwLT5wY2hfYmFzZV9hZGRyZXNzOworCXMzMiBydG47CiAKIAlsZW5ndGggPSBtc2dzLT5sZW47CiAJYnVmID0gbXNncy0+YnVmOwpAQCAtNTE1LDkgKzU2Niw1NSBAQAogCX0KIAogCWlmIChtc2dzLT5mbGFncyAmIEkyQ19NX1RFTikgewotCQlhZGRyXzJfbXNiID0gKCgoYWRkciAmIEkyQ19NU0JfMkJfTVNLKSA+PiA3KSB8IChJMkNfUkQpKTsKKwkJYWRkcl8yX21zYiA9ICgoYWRkciAmIEkyQ19NU0JfMkJfTVNLKSA+PiA3KTsKIAkJaW93cml0ZTMyKGFkZHJfMl9tc2IgfCBURU5fQklUX0FERFJfTUFTSywgcCArIFBDSF9JMkNEUik7CisJCWlmIChmaXJzdCkKKwkJCXBjaF9pMmNfc3RhcnQoYWRhcCk7CiAKKwkJcnRuID0gcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApOworCQlpZiAocnRuID09IDApIHsKKwkJCWlmIChwY2hfaTJjX2dldGFjayhhZGFwKSkgeworCQkJCXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBmb3Igc2xhdmUgYWRkcmVzcyIKKwkJCQkJInNldHRpbmdcbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJYWRkcl84X2xzYiA9IChhZGRyICYgSTJDX0FERFJfTVNLKTsKKwkJCWlvd3JpdGUzMihhZGRyXzhfbHNiLCBwICsgUENIX0kyQ0RSKTsKKwkJfSBlbHNlIGlmIChydG4gPT0gLUVJTykgeyAvKiBBcmJpdHJhdGlvbiBMb3N0ICovCisJCQlwY2hfZXJyKGFkYXAsICJMb3N0IEFyYml0cmF0aW9uXG4iKTsKKwkJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLAorCQkJCSAgIEkyQ01BTF9CSVQpOworCQkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsCisJCQkJICAgSTJDTUlGX0JJVCk7CisJCQlwY2hfaTJjX2luaXQoYWRhcCk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSBlbHNlIHsgLyogd2FpdC1ldmVudCB0aW1lb3V0ICovCisJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJCXBjaF9pMmNfcmVzdGFydChhZGFwKTsKKwkJcnRuID0gcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApOworCQlpZiAocnRuID09IDApIHsKKwkJCWlmIChwY2hfaTJjX2dldGFjayhhZGFwKSkgeworCQkJCXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBmb3Igc2xhdmUgYWRkcmVzcyIKKwkJCQkJInNldHRpbmdcbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJYWRkcl8yX21zYiB8PSBJMkNfUkQ7CisJCQlpb3dyaXRlMzIoYWRkcl8yX21zYiB8IFRFTl9CSVRfQUREUl9NQVNLLAorCQkJCSAgcCArIFBDSF9JMkNEUik7CisJCX0gZWxzZSBpZiAocnRuID09IC1FSU8pIHsgLyogQXJiaXRyYXRpb24gTG9zdCAqLworCQkJcGNoX2VycihhZGFwLCAiTG9zdCBBcmJpdHJhdGlvblxuIik7CisJCQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwKKwkJCQkgICBJMkNNQUxfQklUKTsKKwkJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLAorCQkJCSAgIEkyQ01JRl9CSVQpOworCQkJcGNoX2kyY19pbml0KGFkYXApOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0gZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLworCQkJcGNoX2kyY19zdG9wKGFkYXApOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIDcgYWRkcmVzcyBiaXRzICsgUi9XIGJpdCAqLwogCQlhZGRyID0gKCgoYWRkcikgPDwgMSkgfCAoSTJDX1JEKSk7CkBAIC01MjgsNTYgKzYyNSw4MSBAQAogCWlmIChmaXJzdCkKIAkJcGNoX2kyY19zdGFydChhZGFwKTsKIAotCWlmICgocGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApID09IDApICYmCi0JICAgIChwY2hfaTJjX2dldGFjayhhZGFwKSA9PSAwKSkgewotCQlwY2hfZGJnKGFkYXAsICJyZXR1cm4gJWRcbiIsIDApOworCXJ0biA9IHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKTsKKwlpZiAocnRuID09IDApIHsKKwkJaWYgKHBjaF9pMmNfZ2V0YWNrKGFkYXApKSB7CisJCQlwY2hfZGJnKGFkYXAsICJSZWNlaXZlIE5BQ0sgZm9yIHNsYXZlIGFkZHJlc3MiCisJCQkJInNldHRpbmdcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgaWYgKHJ0biA9PSAtRUlPKSB7IC8qIEFyYml0cmF0aW9uIExvc3QgKi8KKwkJcGNoX2VycihhZGFwLCAiTG9zdCBBcmJpdHJhdGlvblxuIik7CisJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLCBJMkNNQUxfQklUKTsKKwkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsIEkyQ01JRl9CSVQpOworCQlwY2hfaTJjX2luaXQoYWRhcCk7CisJCXJldHVybiAtRUFHQUlOOworCX0gZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLworCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJCXJldHVybiAtRVRJTUU7CisJfQogCi0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcGNoX2kyY19zdG9wKGFkYXApOwotCQkJaW9yZWFkMzIocCArIFBDSF9JMkNEUik7IC8qIER1bW15IHJlYWQgbmVlZHMgKi8KKwlpZiAobGVuZ3RoID09IDApIHsKKwkJcGNoX2kyY19zdG9wKGFkYXApOworCQlpb3JlYWQzMihwICsgUENIX0kyQ0RSKTsgLyogRHVtbXkgcmVhZCBuZWVkcyAqLwogCi0JCQljb3VudCA9IGxlbmd0aDsKLQkJfSBlbHNlIHsKLQkJCWludCByZWFkX2luZGV4OwotCQkJaW50IGxvb3A7Ci0JCQlwY2hfaTJjX3NlbmRhY2soYWRhcCk7CisJCWNvdW50ID0gbGVuZ3RoOworCX0gZWxzZSB7CisJCWludCByZWFkX2luZGV4OworCQlpbnQgbG9vcDsKKwkJcGNoX2kyY19zZW5kYWNrKGFkYXApOwogCi0JCQkvKiBEdW1teSByZWFkICovCi0JCQlmb3IgKGxvb3AgPSAxLCByZWFkX2luZGV4ID0gMDsgbG9vcCA8IGxlbmd0aDsgbG9vcCsrKSB7Ci0JCQkJYnVmW3JlYWRfaW5kZXhdID0gaW9yZWFkMzIocCArIFBDSF9JMkNEUik7Ci0KLQkJCQlpZiAobG9vcCAhPSAxKQotCQkJCQlyZWFkX2luZGV4Kys7Ci0KLQkJCQlpZiAocGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApICE9IDApIHsKLQkJCQkJcGNoX2kyY19zdG9wKGFkYXApOwotCQkJCQlyZXR1cm4gLUVUSU1FOwotCQkJCX0KLQkJCX0JLyogZW5kIGZvciAqLwotCi0JCQlwY2hfaTJjX3NlbmRuYWNrKGFkYXApOwotCisJCS8qIER1bW15IHJlYWQgKi8KKwkJZm9yIChsb29wID0gMSwgcmVhZF9pbmRleCA9IDA7IGxvb3AgPCBsZW5ndGg7IGxvb3ArKykgewogCQkJYnVmW3JlYWRfaW5kZXhdID0gaW9yZWFkMzIocCArIFBDSF9JMkNEUik7CiAKLQkJCWlmIChsZW5ndGggIT0gMSkKKwkJCWlmIChsb29wICE9IDEpCiAJCQkJcmVhZF9pbmRleCsrOwogCi0JCQlpZiAocGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApID09IDApIHsKLQkJCQlpZiAobGFzdCkKLQkJCQkJcGNoX2kyY19zdG9wKGFkYXApOwotCQkJCWVsc2UKLQkJCQkJcGNoX2kyY19yZXBzdGFydChhZGFwKTsKLQotCQkJCWJ1ZltyZWFkX2luZGV4KytdID0gaW9yZWFkMzIocCArIFBDSF9JMkNEUik7Ci0JCQkJY291bnQgPSByZWFkX2luZGV4OwotCQkJfSBlbHNlIHsKLQkJCQljb3VudCA9IC1FVElNRTsKKwkJCXJ0biA9IHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKTsKKwkJCWlmIChydG4gPT0gMCkgeworCQkJCWlmIChwY2hfaTJjX2dldGFjayhhZGFwKSkgeworCQkJCQlwY2hfZGJnKGFkYXAsICJSZWNlaXZlIE5BQ0sgZm9yIHNsYXZlIgorCQkJCQkJImFkZHJlc3Mgc2V0dGluZ1xuIik7CisJCQkJCXJldHVybiAtRUlPOworCQkJCX0KKwkJCX0gZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLworCQkJCXBjaF9pMmNfc3RvcChhZGFwKTsKKwkJCQlyZXR1cm4gLUVUSU1FOwogCQkJfQogCisJCX0JLyogZW5kIGZvciAqLworCisJCXBjaF9pMmNfc2VuZG5hY2soYWRhcCk7CisKKwkJYnVmW3JlYWRfaW5kZXhdID0gaW9yZWFkMzIocCArIFBDSF9JMkNEUik7IC8qIFJlYWQgZmluYWwgLSAxICovCisKKwkJaWYgKGxlbmd0aCAhPSAxKQorCQkJcmVhZF9pbmRleCsrOworCisJCXJ0biA9IHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKTsKKwkJaWYgKHJ0biA9PSAwKSB7CisJCQlpZiAocGNoX2kyY19nZXRhY2soYWRhcCkpIHsKKwkJCQlwY2hfZGJnKGFkYXAsICJSZWNlaXZlIE5BQ0sgZm9yIHNsYXZlIgorCQkJCQkiYWRkcmVzcyBzZXR0aW5nXG4iKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfSBlbHNlIHsgLyogd2FpdC1ldmVudCB0aW1lb3V0ICovCisJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJCQlyZXR1cm4gLUVUSU1FOwogCQl9Ci0JfSBlbHNlIHsKLQkJY291bnQgPSAtRVRJTUU7Ci0JCXBjaF9pMmNfc3RvcChhZGFwKTsKKworCQlpZiAobGFzdCkKKwkJCXBjaF9pMmNfc3RvcChhZGFwKTsKKwkJZWxzZQorCQkJcGNoX2kyY19yZXBzdGFydChhZGFwKTsKKworCQlidWZbcmVhZF9pbmRleCsrXSA9IGlvcmVhZDMyKHAgKyBQQ0hfSTJDRFIpOyAvKiBSZWFkIEZpbmFsICovCisJCWNvdW50ID0gcmVhZF9pbmRleDsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaGlnaGxhbmRlci5jCmluZGV4IDM4NzZhMjQuLjYzYmIxY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaGlnaGxhbmRlci5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaGlnaGxhbmRlci5jCkBAIC0zODcsNyArMzg3LDcgQEAKIAkJZGV2LT5pcnEgPSAwOwogCiAJaWYgKGRldi0+aXJxKSB7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBoaWdobGFuZGVyX2kyY19pcnEsIElSUUZfRElTQUJMRUQsCisJCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBoaWdobGFuZGVyX2kyY19pcnEsIDAsCiAJCQkJICBwZGV2LT5uYW1lLCBkZXYpOwogCQlpZiAodW5saWtlbHkocmV0KSkKIAkJCWdvdG8gZXJyX3VubWFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMKaW5kZXggNGMyYTYyYi4uNTg4MzJlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlteC5jCkBAIC00OCw2ICs0OCw5IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaTJjLmg+CiAKICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0xMjUsNiArMTI4LDExIEBACiAJdW5zaWduZWQgaW50CQlpZmRyOyAvKiBJTVhfSTJDX0lGRFIgKi8KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGkyY19pbXhfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MS1pMmMiLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKwogLyoqIEZ1bmN0aW9ucyBmb3IgSU1YIEkyQyBhZGFwdGVyIGRyaXZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQ2NiwxMCArNDc0LDEwIEBACiB7CiAJc3RydWN0IGlteF9pMmNfc3RydWN0ICppMmNfaW14OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlyZXNvdXJjZV9zaXplX3QgcmVzX3NpemU7Ci0JaW50IGlycTsKKwlpbnQgaXJxLCBiaXRyYXRlOwogCWludCByZXQ7CiAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICI8JXM+XG4iLCBfX2Z1bmNfXyk7CkBAIC00ODUsMTkgKzQ5MywxMSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5pbml0KSB7Ci0JCXJldCA9IHBkYXRhLT5pbml0KCZwZGV2LT5kZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXNfc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc19zaXplLCBEUklWRVJfTkFNRSkpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGZhaWwwOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAliYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNfc2l6ZSk7CkBAIC01MjAsNiArNTIwLDcgQEAKIAlpMmNfaW14LT5hZGFwdGVyLmFsZ28JCT0gJmkyY19pbXhfYWxnbzsKIAlpMmNfaW14LT5hZGFwdGVyLmRldi5wYXJlbnQJPSAmcGRldi0+ZGV2OwogCWkyY19pbXgtPmFkYXB0ZXIubnIgCQk9IHBkZXYtPmlkOworCWkyY19pbXgtPmFkYXB0ZXIuZGV2Lm9mX25vZGUJPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlpMmNfaW14LT5pcnEJCQk9IGlycTsKIAlpMmNfaW14LT5iYXNlCQkJPSBiYXNlOwogCWkyY19pbXgtPnJlcwkJCT0gcmVzOwpAQCAtNTQ2LDEwICs1NDcsMTIgQEAKIAlpMmNfc2V0X2FkYXBkYXRhKCZpMmNfaW14LT5hZGFwdGVyLCBpMmNfaW14KTsKIAogCS8qIFNldCB1cCBjbG9jayBkaXZpZGVyICovCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5iaXRyYXRlKQotCQlpMmNfaW14X3NldF9jbGsoaTJjX2lteCwgcGRhdGEtPmJpdHJhdGUpOwotCWVsc2UKLQkJaTJjX2lteF9zZXRfY2xrKGkyY19pbXgsIElNWF9JMkNfQklUX1JBVEUpOworCWJpdHJhdGUgPSBJTVhfSTJDX0JJVF9SQVRFOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAgICJjbG9jay1mcmVxdWVuY3kiLCAmYml0cmF0ZSk7CisJaWYgKHJldCA8IDAgJiYgcGRhdGEgJiYgcGRhdGEtPmJpdHJhdGUpCisJCWJpdHJhdGUgPSBwZGF0YS0+Yml0cmF0ZTsKKwlpMmNfaW14X3NldF9jbGsoaTJjX2lteCwgYml0cmF0ZSk7CiAKIAkvKiBTZXQgdXAgY2hpcCByZWdpc3RlcnMgdG8gZGVmYXVsdHMgKi8KIAl3cml0ZWIoMCwgaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSTJDUik7CkBAIC01NjIsNiArNTY1LDggQEAKIAkJZ290byBmYWlsNTsKIAl9CiAKKwlvZl9pMmNfcmVnaXN0ZXJfZGV2aWNlcygmaTJjX2lteC0+YWRhcHRlcik7CisKIAkvKiBTZXQgdXAgcGxhdGZvcm0gZHJpdmVyIGRhdGEgKi8KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpMmNfaW14KTsKIApAQCAtNTg2LDE2ICs1OTEsMTIgQEAKIAlpb3VubWFwKGJhc2UpOwogZmFpbDE6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci1mYWlsMDoKLQlpZiAocGRhdGEgJiYgcGRhdGEtPmV4aXQpCi0JCXBkYXRhLT5leGl0KCZwZGV2LT5kZXYpOwogCXJldHVybiByZXQ7IC8qIFJldHVybiBlcnJvciBudW1iZXIgKi8KIH0KIAogc3RhdGljIGludCBfX2V4aXQgaTJjX2lteF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgaW14X2kyY19zdHJ1Y3QgKmkyY19pbXggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKIAkvKiByZW1vdmUgYWRhcHRlciAqLwogCWRldl9kYmcoJmkyY19pbXgtPmFkYXB0ZXIuZGV2LCAiYWRhcHRlciByZW1vdmVkXG4iKTsKQEAgLTYxMSwxMCArNjEyLDYgQEAKIAl3cml0ZWIoMCwgaTJjX2lteC0+YmFzZSArIElNWF9JMkNfSTJDUik7CiAJd3JpdGViKDAsIGkyY19pbXgtPmJhc2UgKyBJTVhfSTJDX0kyU1IpOwogCi0JLyogU2h1dCBkb3duIGhhcmR3YXJlICovCi0JaWYgKHBkYXRhICYmIHBkYXRhLT5leGl0KQotCQlwZGF0YS0+ZXhpdCgmcGRldi0+ZGV2KTsKLQogCWNsa19wdXQoaTJjX2lteC0+Y2xrKTsKIAogCWlvdW5tYXAoaTJjX2lteC0+YmFzZSk7CkBAIC02MjgsNiArNjI1LDcgQEAKIAkuZHJpdmVyCT0gewogCQkubmFtZQk9IERSSVZFUl9OQU1FLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gaTJjX2lteF9kdF9pZHMsCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYwppbmRleCA1ZDhhZWQ1Li5jMDFlOTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4JLyogUGljayB1cCBJWFAyMDAwLXNwZWNpZmljIGJpdHMgKi8KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8taXhwMjAwMC5oPgogCiBzdGF0aWMgaW5saW5lIGludCBpeHAyMDAwX3NjbF9waW4odm9pZCAqZGF0YSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbm9tYWRpay5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ub21hZGlrLmMKaW5kZXggYjIyOGUwOS4uNTI2N2FiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ub21hZGlrLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ub21hZGlrLmMKQEAgLTYzLDExICs2MywxMSBAQAogLyogTWFzdGVyIGNvbnRyb2xsZXIgKE1DUikgcmVnaXN0ZXIgKi8KICNkZWZpbmUgSTJDX01DUl9PUAkJKDB4MSA8PCAwKQkvKiBPcGVyYXRpb24gKi8KICNkZWZpbmUgSTJDX01DUl9BNwkJKDB4N2YgPDwgMSkJLyogNy1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJMkNfTUNSX0VBMTAJCSgweDcgPDwgOCkgCS8qIDEwLWJpdCBFeHRlbmRlZCBhZGRyZXNzICovCisjZGVmaW5lIEkyQ19NQ1JfRUExMAkJKDB4NyA8PCA4KQkvKiAxMC1iaXQgRXh0ZW5kZWQgYWRkcmVzcyAqLwogI2RlZmluZSBJMkNfTUNSX1NCCQkoMHgxIDw8IDExKQkvKiBFeHRlbmRlZCBhZGRyZXNzICovCiAjZGVmaW5lIEkyQ19NQ1JfQU0JCSgweDMgPDwgMTIpCS8qIEFkZHJlc3MgdHlwZSAqLwotI2RlZmluZSBJMkNfTUNSX1NUT1AJCSgweDEgPDwgMTQpIAkvKiBTdG9wIGNvbmRpdGlvbiAqLwotI2RlZmluZSBJMkNfTUNSX0xFTkdUSAkJKDB4N2ZmIDw8IDE1KSAJLyogVHJhbnNhY3Rpb24gbGVuZ3RoICovCisjZGVmaW5lIEkyQ19NQ1JfU1RPUAkJKDB4MSA8PCAxNCkJLyogU3RvcCBjb25kaXRpb24gKi8KKyNkZWZpbmUgSTJDX01DUl9MRU5HVEgJCSgweDdmZiA8PCAxNSkJLyogVHJhbnNhY3Rpb24gbGVuZ3RoICovCiAKIC8qIFN0YXR1cyByZWdpc3RlciAoU1IpICovCiAjZGVmaW5lIEkyQ19TUl9PUAkJKDB4MyA8PCAwKQkvKiBPcGVyYXRpb24gKi8KQEAgLTc3LDcgKzc3LDcgQEAKICNkZWZpbmUgSTJDX1NSX0xFTkdUSAkJKDB4N2ZmIDw8IDkpCS8qIFRyYW5zZmVyIGxlbmd0aCAqLwogCiAvKiBJbnRlcnJ1cHQgbWFzayBzZXQvY2xlYXIgKElNU0NSKSBiaXRzICovCi0jZGVmaW5lIEkyQ19JVF9UWEZFIAkJKDB4MSA8PCAwKQorI2RlZmluZSBJMkNfSVRfVFhGRQkJKDB4MSA8PCAwKQogI2RlZmluZSBJMkNfSVRfVFhGTkUJCSgweDEgPDwgMSkKICNkZWZpbmUgSTJDX0lUX1RYRkYJCSgweDEgPDwgMikKICNkZWZpbmUgSTJDX0lUX1RYRk9WUgkJKDB4MSA8PCAzKQpAQCAtMTM1LDMxICsxMzUsMzEgQEAKIH07CiAKIC8qKgotICogc3RydWN0IG5ta19pMmNfZGV2IC0gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBvZiB0aGUgY29udHJvbGxlcgotICogQHBkZXY6IHBhcmVudCBwbGF0Zm9ybSBkZXZpY2UKLSAqIEBhZGFwOiBjb3JyZXNwb25kaW5nIEkyQyBhZGFwdGVyCi0gKiBAaXJxOiBpbnRlcnJ1cHQgbGluZSBmb3IgdGhlIGNvbnRyb2xsZXIKLSAqIEB2aXJ0YmFzZTogdmlydHVhbCBpbyBtZW1vcnkgYXJlYQotICogQGNsazogaGFyZHdhcmUgaTJjIGJsb2NrIGNsb2NrCi0gKiBAY2ZnOiBtYWNoaW5lIHByb3ZpZGVkIGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbgotICogQGNsaTogaG9sZGVyIG9mIGNsaWVudCBzcGVjaWZpYyBkYXRhCi0gKiBAc3RvcDogc3RvcCBjb25kaXRpb24KLSAqIEB4ZmVyX2NvbXBsZXRlOiBhY2tub3dsZWRnZSBjb21wbGV0aW9uIGZvciBhIEkyQyBtZXNzYWdlCi0gKiBAcmVzdWx0OiBjb250cm9sbGVyIHByb3BvZ2F0ZWQgcmVzdWx0Ci0gKiBAcmVndWxhdG9yOiBwb2ludGVyIHRvIGkyYyByZWd1bGF0b3IKLSAqIEBidXN5OiBCdXN5IGRvaW5nIHRyYW5zZmVyCisgKiBzdHJ1Y3Qgbm1rX2kyY19kZXYgLSBwcml2YXRlIGRhdGEgc3RydWN0dXJlIG9mIHRoZSBjb250cm9sbGVyLgorICogQHBkZXY6IHBhcmVudCBwbGF0Zm9ybSBkZXZpY2UuCisgKiBAYWRhcDogY29ycmVzcG9uZGluZyBJMkMgYWRhcHRlci4KKyAqIEBpcnE6IGludGVycnVwdCBsaW5lIGZvciB0aGUgY29udHJvbGxlci4KKyAqIEB2aXJ0YmFzZTogdmlydHVhbCBpbyBtZW1vcnkgYXJlYS4KKyAqIEBjbGs6IGhhcmR3YXJlIGkyYyBibG9jayBjbG9jay4KKyAqIEBjZmc6IG1hY2hpbmUgcHJvdmlkZWQgY29udHJvbGxlciBjb25maWd1cmF0aW9uLgorICogQGNsaTogaG9sZGVyIG9mIGNsaWVudCBzcGVjaWZpYyBkYXRhLgorICogQHN0b3A6IHN0b3AgY29uZGl0aW9uLgorICogQHhmZXJfY29tcGxldGU6IGFja25vd2xlZGdlIGNvbXBsZXRpb24gZm9yIGEgSTJDIG1lc3NhZ2UuCisgKiBAcmVzdWx0OiBjb250cm9sbGVyIHByb3BvZ2F0ZWQgcmVzdWx0LgorICogQHJlZ3VsYXRvcjogcG9pbnRlciB0byBpMmMgcmVndWxhdG9yLgorICogQGJ1c3k6IEJ1c3kgZG9pbmcgdHJhbnNmZXIuCiAgKi8KIHN0cnVjdCBubWtfaTJjX2RldiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7Ci0Jc3RydWN0IGkyY19hZGFwdGVyIAkJYWRhcDsKLQlpbnQgCQkJCWlycTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJCWFkYXA7CisJaW50CQkJCWlycTsKIAl2b2lkIF9faW9tZW0JCQkqdmlydGJhc2U7CiAJc3RydWN0IGNsawkJCSpjbGs7CiAJc3RydWN0IG5ta19pMmNfY29udHJvbGxlcgljZmc7CiAJc3RydWN0IGkyY19ubWtfY2xpZW50CQljbGk7Ci0JaW50IAkJCQlzdG9wOworCWludAkJCQlzdG9wOwogCXN0cnVjdCBjb21wbGV0aW9uCQl4ZmVyX2NvbXBsZXRlOwotCWludCAJCQkJcmVzdWx0OworCWludAkJCQlyZXN1bHQ7CiAJc3RydWN0IHJlZ3VsYXRvcgkJKnJlZ3VsYXRvcjsKIAlib29sCQkJCWJ1c3k7CiB9OwpAQCAtMjE3LDggKzIxNyw5IEBACiAJCX0KIAl9CiAKLQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImZsdXNoaW5nIG9wZXJhdGlvbiB0aW1lZCBvdXQgIgotCQkiZ2l2aW5nIHVwIGFmdGVyICVkIGF0dGVtcHRzIiwgTE9PUF9BVFRFTVBUUyk7CisJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsCisJCSJmbHVzaGluZyBvcGVyYXRpb24gdGltZWQgb3V0IGdpdmluZyB1cCBhZnRlciAlZCBhdHRlbXB0cyIsCisJCUxPT1BfQVRURU1QVFMpOwogCiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CkBAIC0yNzAsNyArMjcxLDcgQEAKIH0KIAogLyogZW5hYmxlIHBlcmlwaGVyYWwsIG1hc3RlciBtb2RlIG9wZXJhdGlvbiAqLwotI2RlZmluZSBERUZBVUxUX0kyQ19SRUdfQ1IgCSgoMSA8PCAxKSB8IEkyQ19DUl9QRSkKKyNkZWZpbmUgREVGQVVMVF9JMkNfUkVHX0NSCSgoMSA8PCAxKSB8IEkyQ19DUl9QRSkKIAogLyoqCiAgKiBsb2FkX2kyY19tY3JfcmVnKCkgLSBsb2FkIHRoZSBNQ1IgcmVnaXN0ZXIKQEAgLTM2Myw4ICszNjQsOCBAQAogCSAqIGFuZCBoaWdoIHNwZWVkICh1cCB0byAzLjQgTWIvcykKIAkgKi8KIAlpZiAoZGV2LT5jZmcuc20gPiBJMkNfRlJFUV9NT0RFX0ZBU1QpIHsKLQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJkbyBub3Qgc3VwcG9ydCB0aGlzIG1vZGUgIgotCQkJImRlZmF1bHRpbmcgdG8gc3RkLiBtb2RlXG4iKTsKKwkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsCisJCQkiZG8gbm90IHN1cHBvcnQgdGhpcyBtb2RlIGRlZmF1bHRpbmcgdG8gc3RkLiBtb2RlXG4iKTsKIAkJYnJjcjIgPSBpMmNfY2xrLygxMDAwMDAgKiAyKSAmIDB4ZmZmZjsKIAkJd3JpdGVsKChicmNyMSB8IGJyY3IyKSwgZGV2LT52aXJ0YmFzZSArIEkyQ19CUkNSKTsKIAkJd3JpdGVsKEkyQ19GUkVRX01PREVfU1RBTkRBUkQgPDwgNCwKQEAgLTQyMyw3ICs0MjQsNyBAQAogCiAJaWYgKHRpbWVvdXQgPCAwKSB7CiAJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAotCQkJIndhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCIKKwkJCSJ3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQgIgogCQkJInJldHVybmVkICVkIHdhaXRpbmcgZm9yIGV2ZW50XG4iLCB0aW1lb3V0KTsKIAkJc3RhdHVzID0gdGltZW91dDsKIAl9CkBAIC01NTYsOCArNTU3LDggQEAKIAkJaWYgKCgoaTJjX3NyID4+IDIpICYgMHgzKSA9PSAweDMpIHsKIAkJCS8qIGdldCB0aGUgYWJvcnQgY2F1c2UgKi8KIAkJCWNhdXNlID0JKGkyY19zciA+PiA0KSAmIDB4NzsKLQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiJXNcbiIsIGNhdXNlCi0JCQkJPj0gQVJSQVlfU0laRShhYm9ydF9jYXVzZXMpID8KKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiJXNcbiIsCisJCQkJY2F1c2UgPj0gQVJSQVlfU0laRShhYm9ydF9jYXVzZXMpID8KIAkJCQkidW5rbm93biByZWFzb24iIDoKIAkJCQlhYm9ydF9jYXVzZXNbY2F1c2VdKTsKIAkJfQpAQCAtNTgyLDEzICs1ODMsMTMgQEAKICAqCiAgKiBOT1RFOgogICogUkVBRCBUUkFOU0ZFUiA6IFdlIGltcG9zZSBhIHJlc3RyaWN0aW9uIG9mIHRoZSBmaXJzdCBtZXNzYWdlIHRvIGJlIHRoZQotICogCQlpbmRleCBtZXNzYWdlIGZvciBhbnkgcmVhZCB0cmFuc2FjdGlvbi4KLSAqIAkJLSBhIG5vIGluZGV4IGlzIGNvZGVkIGFzICcwJywKLSAqIAkJLSAyYnl0ZSBiaWcgZW5kaWFuIGluZGV4IGlzIGNvZGVkIGFzICczJwotICogCQkhISEgbXNnWzBdLmJ1ZiBob2xkcyB0aGUgYWN0dWFsIGluZGV4LgotICogCQlUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBnZW5lcmljIG1lc3NhZ2VzIG9mIHNtYnVzIGVtdWxhdG9yCi0gKiAJCXRoYXQgc2VuZCBhIG9uZSBieXRlIGluZGV4LgotICogCQllZy4gYSBJMkMgdHJhbnNhdGlvbiB0byByZWFkIDIgYnl0ZXMgZnJvbSBpbmRleCAwCisgKgkJaW5kZXggbWVzc2FnZSBmb3IgYW55IHJlYWQgdHJhbnNhY3Rpb24uCisgKgkJLSBhIG5vIGluZGV4IGlzIGNvZGVkIGFzICcwJywKKyAqCQktIDJieXRlIGJpZyBlbmRpYW4gaW5kZXggaXMgY29kZWQgYXMgJzMnCisgKgkJISEhIG1zZ1swXS5idWYgaG9sZHMgdGhlIGFjdHVhbCBpbmRleC4KKyAqCQlUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBnZW5lcmljIG1lc3NhZ2VzIG9mIHNtYnVzIGVtdWxhdG9yCisgKgkJdGhhdCBzZW5kIGEgb25lIGJ5dGUgaW5kZXguCisgKgkJZWcuIGEgSTJDIHRyYW5zYXRpb24gdG8gcmVhZCAyIGJ5dGVzIGZyb20gaW5kZXggMAogICoJCQlpZHggPSAwOwogICoJCQltc2dbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKICAqCQkJbXNnWzBdLmZsYWdzID0gMHgwOwpAQCAtNjQ0LDggKzY0NSw4IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IG51bV9tc2dzOyBpKyspIHsKIAkJCWlmICh1bmxpa2VseShtc2dzW2ldLmZsYWdzICYgSTJDX01fVEVOKSkgewotCQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiMTAgYml0IGFkZHJlc3NpbmciCi0JCQkJCQkibm90IHN1cHBvcnRlZFxuIik7CisJCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsCisJCQkJCSIxMCBiaXQgYWRkcmVzc2luZyBub3Qgc3VwcG9ydGVkXG4iKTsKIAogCQkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXQ7CkBAIC03ODksOCArNzkwLDkgQEAKIAogCQlpZiAoZGV2LT5jbGkuY291bnQpIHsKIAkJCWRldi0+cmVzdWx0ID0gLUVJTzsKLQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiJWx1IGJ5dGVzIHN0aWxsIHJlbWFpbiB0byBiZSIKLQkJCQkJInhmZXJlZFxuIiwgZGV2LT5jbGkuY291bnQpOworCQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsCisJCQkJIiVsdSBieXRlcyBzdGlsbCByZW1haW4gdG8gYmUgeGZlcmVkXG4iLAorCQkJCWRldi0+Y2xpLmNvdW50KTsKIAkJCSh2b2lkKSBpbml0X2h3KGRldik7CiAJCX0KIAkJY29tcGxldGUoJmRldi0+eGZlcl9jb21wbGV0ZSk7CkBAIC05MjMsNyArOTI1LDcgQEAKIAl9CiAKIAlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKLQkJRFJJVkVSX05BTUUgIkkvTyByZWdpb24iKSA9PSAJTlVMTCkJeworCQlEUklWRVJfTkFNRSAiSS9PIHJlZ2lvbiIpID09IE5VTEwpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIGVycl9ub19yZWdpb247CiAJfQpAQCAtOTM1LDcgKzkzNyw3IEBACiAJfQogCiAJZGV2LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBpMmNfaXJxX2hhbmRsZXIsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGkyY19pcnFfaGFuZGxlciwgMCwKIAkJCQlEUklWRVJfTkFNRSwgZGV2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBjbGFpbSB0aGUgaXJxICVkXG4iLCBkZXYtPmlycSk7CkBAIC05ODAsOCArOTgyLDkgQEAKIAogCWkyY19zZXRfYWRhcGRhdGEoYWRhcCwgZGV2KTsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpbml0aWFsaXplICVzIG9uIHZpcnR1YWwgIgotCQkiYmFzZSAlcFxuIiwgYWRhcC0+bmFtZSwgZGV2LT52aXJ0YmFzZSk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJICJpbml0aWFsaXplICVzIG9uIHZpcnR1YWwgYmFzZSAlcFxuIiwKKwkJIGFkYXAtPm5hbWUsIGRldi0+dmlydGJhc2UpOwogCiAJcmV0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKGFkYXApOwogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbnVjOTAwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW51YzkwMC5jCmluZGV4IDcyNDM0MjYuLjgzNWU0N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbnVjOTAwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1udWM5MDAuYwpAQCAtNjEwLDcgKzYxMCw3IEBACiAJCWdvdG8gZXJyX2lvbWFwOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKGkyYy0+aXJxLCBudWM5MDBfaTJjX2lycSwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorCXJldCA9IHJlcXVlc3RfaXJxKGkyYy0+aXJxLCBudWM5MDBfaTJjX2lycSwgSVJRRl9TSEFSRUQsCiAJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBpMmMpOwogCiAJaWYgKHJldCAhPSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCmluZGV4IDJkZmI2MzEuLmE0M2QwMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCkBAIC00MiwxMiArNDIsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKIC8qIEkyQyBjb250cm9sbGVyIHJldmlzaW9ucyAqLwotI2RlZmluZSBPTUFQX0kyQ19SRVZfMgkJCTB4MjAKKyNkZWZpbmUgT01BUF9JMkNfT01BUDFfUkVWXzIJCTB4MjAKIAogLyogSTJDIGNvbnRyb2xsZXIgcmV2aXNpb25zIHByZXNlbnQgb24gc3BlY2lmaWMgaGFyZHdhcmUgKi8KICNkZWZpbmUgT01BUF9JMkNfUkVWX09OXzI0MzAJCTB4MzYKICNkZWZpbmUgT01BUF9JMkNfUkVWX09OXzM0MzAJCTB4M0MKLSNkZWZpbmUgT01BUF9JMkNfUkVWX09OXzQ0MzAJCTB4NDAKKyNkZWZpbmUgT01BUF9JMkNfUkVWX09OXzM1MzBfNDQzMAkweDQwCiAKIC8qIHRpbWVvdXQgd2FpdGluZyBmb3IgdGhlIGNvbnRyb2xsZXIgdG8gcmVzcG9uZCAqLwogI2RlZmluZSBPTUFQX0kyQ19USU1FT1VUIChtc2Vjc190b19qaWZmaWVzKDEwMDApKQpAQCAtNzIsMTEgKzcyLDEyIEBACiAJT01BUF9JMkNfU0NMSF9SRUcsCiAJT01BUF9JMkNfU1lTVEVTVF9SRUcsCiAJT01BUF9JMkNfQlVGU1RBVF9SRUcsCi0JT01BUF9JMkNfUkVWTkJfTE8sCi0JT01BUF9JMkNfUkVWTkJfSEksCi0JT01BUF9JMkNfSVJRU1RBVFVTX1JBVywKLQlPTUFQX0kyQ19JUlFFTkFCTEVfU0VULAotCU9NQVBfSTJDX0lSUUVOQUJMRV9DTFIsCisJLyogb25seSBvbiBPTUFQNDQzMCAqLworCU9NQVBfSTJDX0lQX1YyX1JFVk5CX0xPLAorCU9NQVBfSTJDX0lQX1YyX1JFVk5CX0hJLAorCU9NQVBfSTJDX0lQX1YyX0lSUVNUQVRVU19SQVcsCisJT01BUF9JMkNfSVBfVjJfSVJRRU5BQkxFX1NFVCwKKwlPTUFQX0kyQ19JUF9WMl9JUlFFTkFCTEVfQ0xSLAogfTsKIAogLyogSTJDIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKE9NQVBfSTJDX0lFKTogKi8KQEAgLTE5Myw3ICsxOTQsNiBAQAogCQkJCQkJICovCiAJdTgJCQlyZXY7CiAJdW5zaWduZWQJCWJfaHc6MTsJCS8qIGJhZCBoL3cgZml4ZXMgKi8KLQl1bnNpZ25lZAkJaWRsZToxOwogCXUxNgkJCWllc3RhdGU7CS8qIFNhdmVkIGludGVycnVwdCByZWdpc3RlciAqLwogCXUxNgkJCXBzY3N0YXRlOwogCXUxNgkJCXNjbGxzdGF0ZTsKQEAgLTIwNCw3ICsyMDQsNyBAQAogCXUxNgkJCWVycmF0YTsKIH07CiAKLXN0YXRpYyBjb25zdCB1OCByZWdfbWFwW10gPSB7CitzdGF0aWMgY29uc3QgdTggcmVnX21hcF9pcF92MVtdID0gewogCVtPTUFQX0kyQ19SRVZfUkVHXSA9IDB4MDAsCiAJW09NQVBfSTJDX0lFX1JFR10gPSAweDAxLAogCVtPTUFQX0kyQ19TVEFUX1JFR10gPSAweDAyLApAQCAtMjI1LDcgKzIyNSw3IEBACiAJW09NQVBfSTJDX0JVRlNUQVRfUkVHXSA9IDB4MTAsCiB9OwogCi1zdGF0aWMgY29uc3QgdTggb21hcDRfcmVnX21hcFtdID0geworc3RhdGljIGNvbnN0IHU4IHJlZ19tYXBfaXBfdjJbXSA9IHsKIAlbT01BUF9JMkNfUkVWX1JFR10gPSAweDA0LAogCVtPTUFQX0kyQ19JRV9SRUddID0gMHgyYywKIAlbT01BUF9JMkNfU1RBVF9SRUddID0gMHgyOCwKQEAgLTI0NCwxMSArMjQ0LDExIEBACiAJW09NQVBfSTJDX1NDTEhfUkVHXSA9IDB4YjgsCiAJW09NQVBfSTJDX1NZU1RFU1RfUkVHXSA9IDB4YkMsCiAJW09NQVBfSTJDX0JVRlNUQVRfUkVHXSA9IDB4YzAsCi0JW09NQVBfSTJDX1JFVk5CX0xPXSA9IDB4MDAsCi0JW09NQVBfSTJDX1JFVk5CX0hJXSA9IDB4MDQsCi0JW09NQVBfSTJDX0lSUVNUQVRVU19SQVddID0gMHgyNCwKLQlbT01BUF9JMkNfSVJRRU5BQkxFX1NFVF0gPSAweDJjLAotCVtPTUFQX0kyQ19JUlFFTkFCTEVfQ0xSXSA9IDB4MzAsCisJW09NQVBfSTJDX0lQX1YyX1JFVk5CX0xPXSA9IDB4MDAsCisJW09NQVBfSTJDX0lQX1YyX1JFVk5CX0hJXSA9IDB4MDQsCisJW09NQVBfSTJDX0lQX1YyX0lSUVNUQVRVU19SQVddID0gMHgyNCwKKwlbT01BUF9JMkNfSVBfVjJfSVJRRU5BQkxFX1NFVF0gPSAweDJjLAorCVtPTUFQX0kyQ19JUF9WMl9JUlFFTkFCTEVfQ0xSXSA9IDB4MzAsCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pMmNfd3JpdGVfcmVnKHN0cnVjdCBvbWFwX2kyY19kZXYgKmkyY19kZXYsCkBAIC0yNjYsMTcgKzI2NiwxMSBAQAogCiBzdGF0aWMgdm9pZCBvbWFwX2kyY191bmlkbGUoc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IG9tYXBfaTJjX2J1c19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAotCVdBUk5fT04oIWRldi0+aWRsZSk7CisJcGRhdGEgPSBkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAotCXBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2LT5kZXYpOwotCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlwbV9ydW50aW1lX2dldF9zeW5jKCZwZGV2LT5kZXYpOwotCi0JaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJaWYgKHBkYXRhLT5mbGFncyAmIE9NQVBfSTJDX0ZMQUdfUkVTRVRfUkVHU19QT1NUSURMRSkgewogCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCAwKTsKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfUFNDX1JFRywgZGV2LT5wc2NzdGF0ZSk7CiAJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NDTExfUkVHLCBkZXYtPnNjbGxzdGF0ZSk7CkBAIC0yODYsNyArMjgwLDYgQEAKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfV0VfUkVHLCBkZXYtPndlc3RhdGUpOwogCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCBPTUFQX0kyQ19DT05fRU4pOwogCX0KLQlkZXYtPmlkbGUgPSAwOwogCiAJLyoKIAkgKiBEb24ndCB3cml0ZSB0byB0aGlzIHJlZ2lzdGVyIGlmIHRoZSBJRSBzdGF0ZSBpcyAwIGFzIGl0IGNhbgpAQCAtMjk4LDMyICsyOTEsMjUgQEAKIAogc3RhdGljIHZvaWQgb21hcF9pMmNfaWRsZShzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3Qgb21hcF9pMmNfYnVzX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXUxNiBpdjsKIAotCVdBUk5fT04oZGV2LT5pZGxlKTsKLQotCXBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2LT5kZXYpOwotCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJcGRhdGEgPSBkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAogCWRldi0+aWVzdGF0ZSA9IG9tYXBfaTJjX3JlYWRfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHKTsKLQlpZiAoZGV2LT5yZXYgPj0gT01BUF9JMkNfUkVWX09OXzQ0MzApCi0JCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0lSUUVOQUJMRV9DTFIsIDEpOworCWlmIChwZGF0YS0+cmV2ID09IE9NQVBfSTJDX0lQX1ZFUlNJT05fMikKKwkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfSVBfVjJfSVJRRU5BQkxFX0NMUiwgMSk7CiAJZWxzZQogCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19JRV9SRUcsIDApOwogCi0JaWYgKGRldi0+cmV2IDwgT01BUF9JMkNfUkVWXzIpIHsKKwlpZiAoZGV2LT5yZXYgPCBPTUFQX0kyQ19PTUFQMV9SRVZfMikgewogCQlpdiA9IG9tYXBfaTJjX3JlYWRfcmVnKGRldiwgT01BUF9JMkNfSVZfUkVHKTsgLyogUmVhZCBjbGVhcnMgKi8KIAl9IGVsc2UgewogCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19TVEFUX1JFRywgZGV2LT5pZXN0YXRlKTsKIAotCQkvKiBGbHVzaCBwb3N0ZWQgd3JpdGUgYmVmb3JlIHRoZSBkZXYtPmlkbGUgc3RvcmUgb2NjdXJzICovCisJCS8qIEZsdXNoIHBvc3RlZCB3cml0ZSAqLwogCQlvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1NUQVRfUkVHKTsKIAl9Ci0JZGV2LT5pZGxlID0gMTsKLQotCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9pMmNfaW5pdChzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYpCkBAIC0zMzQsOCArMzIwLDExIEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCXVuc2lnbmVkIGxvbmcgaW50ZXJuYWxfY2xrID0gMDsKIAlzdHJ1Y3QgY2xrICpmY2xrOworCXN0cnVjdCBvbWFwX2kyY19idXNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAKLQlpZiAoZGV2LT5yZXYgPj0gT01BUF9JMkNfUkVWXzIpIHsKKwlwZGF0YSA9IGRldi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJaWYgKGRldi0+cmV2ID49IE9NQVBfSTJDX09NQVAxX1JFVl8yKSB7CiAJCS8qIERpc2FibGUgSTJDIGNvbnRyb2xsZXIgYmVmb3JlIHNvZnQgcmVzZXQgKi8KIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywKIAkJCW9tYXBfaTJjX3JlYWRfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRykgJgpAQCAtMzc4LDEyICszNjcsMTMgQEAKIAkJCSAqIFJFVklTSVQ6IFNvbWUgd2t1cCBzb3VyY2VzIG1pZ2h0IG5vdCBiZSBuZWVkZWQuCiAJCQkgKi8KIAkJCWRldi0+d2VzdGF0ZSA9IE9NQVBfSTJDX1dFX0FMTDsKLQkJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1dFX1JFRywgZGV2LT53ZXN0YXRlKTsKKwkJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1dFX1JFRywKKwkJCQkJCQlkZXYtPndlc3RhdGUpOwogCQl9CiAJfQogCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIDApOwogCi0JaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7CisJaWYgKHBkYXRhLT5mbGFncyAmIE9NQVBfSTJDX0ZMQUdfQUxXQVlTX0FSTVhPUl9DTEspIHsKIAkJLyoKIAkJICogVGhlIEkyQyBmdW5jdGlvbmFsIGNsb2NrIGlzIHRoZSBhcm14b3JfY2ssIHNvIHRoZXJlJ3MKIAkJICogbm8gbmVlZCB0byBnZXQgImFybXhvcl9jayIgc2VwYXJhdGVseS4gIE5vdywgaWYgT01BUDI0MjAKQEAgLTQwNyw3ICszOTcsNyBAQAogCQkJcHNjID0gZmNsa19yYXRlIC8gMTIwMDAwMDA7CiAJfQogCi0JaWYgKCEoY3B1X2NsYXNzX2lzX29tYXAxKCkgfHwgY3B1X2lzX29tYXAyNDIwKCkpKSB7CisJaWYgKCEocGRhdGEtPmZsYWdzICYgT01BUF9JMkNfRkxBR19TSU1QTEVfQ0xPQ0spKSB7CiAKIAkJLyoKIAkJICogSFNJMkMgY29udHJvbGxlciBpbnRlcm5hbCBjbGsgcmF0ZSBzaG91bGQgYmUgMTkuMiBNaHogZm9yCkBAIC00MTUsNyArNDA1LDggQEAKIAkJICogdG8gZ2V0IGxvbmdlciBmaWx0ZXIgcGVyaW9kIGZvciBiZXR0ZXIgbm9pc2Ugc3VwcHJlc3Npb24uCiAJCSAqIFRoZSBmaWx0ZXIgaXMgaWNsayAoZmNsayBmb3IgSFMpIHBlcmlvZC4KIAkJICovCi0JCWlmIChkZXYtPnNwZWVkID4gNDAwIHx8IGNwdV9pc19vbWFwMjQzMCgpKQorCQlpZiAoZGV2LT5zcGVlZCA+IDQwMCB8fAorCQkJICAgICAgIHBkYXRhLT5mbGFncyAmIE9NQVBfSTJDX0ZMQUdfRk9SQ0VfMTkyMDBfSU5UX0NMSykKIAkJCWludGVybmFsX2NsayA9IDE5MjAwOwogCQllbHNlIGlmIChkZXYtPnNwZWVkID4gMTAwKQogCQkJaW50ZXJuYWxfY2xrID0gOTYwMDsKQEAgLTQ4NCw3ICs0NzUsNyBAQAogCiAJZGV2LT5lcnJhdGEgPSAwOwogCi0JaWYgKGNwdV9pc19vbWFwMjQzMCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpKQorCWlmIChwZGF0YS0+ZmxhZ3MgJiBPTUFQX0kyQ19GTEFHX0FQUExZX0VSUkFUQV9JMjA3KQogCQlkZXYtPmVycmF0YSB8PSBJMkNfT01BUF9FUlJBVEFfSTIwNzsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCkBAIC00OTMsNyArNDg0LDcgQEAKIAkJCU9NQVBfSTJDX0lFX0FMKSAgfCAoKGRldi0+Zmlmb19zaXplKSA/CiAJCQkJKE9NQVBfSTJDX0lFX1JEUiB8IE9NQVBfSTJDX0lFX1hEUikgOiAwKTsKIAlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19JRV9SRUcsIGRldi0+aWVzdGF0ZSk7Ci0JaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJaWYgKHBkYXRhLT5mbGFncyAmIE9NQVBfSTJDX0ZMQUdfUkVTRVRfUkVHU19QT1NUSURMRSkgewogCQlkZXYtPnBzY3N0YXRlID0gcHNjOwogCQlkZXYtPnNjbGxzdGF0ZSA9IHNjbGw7CiAJCWRldi0+c2NsaHN0YXRlID0gc2NsaDsKQEAgLTY0Miw3ICs2MzMsNyBAQAogCWludCBpOwogCWludCByOwogCi0Jb21hcF9pMmNfdW5pZGxlKGRldik7CisJcG1fcnVudGltZV9nZXRfc3luYyhkZXYtPmRldik7CiAKIAlyID0gb21hcF9pMmNfd2FpdF9mb3JfYmIoZGV2KTsKIAlpZiAociA8IDApCkBAIC02NjUsNyArNjU2LDcgQEAKIAogCW9tYXBfaTJjX3dhaXRfZm9yX2JiKGRldik7CiBvdXQ6Ci0Jb21hcF9pMmNfaWRsZShkZXYpOworCXBtX3J1bnRpbWVfcHV0KGRldi0+ZGV2KTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtNzIwLDEyICs3MTEsMTIgQEAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWAogCiBzdGF0aWMgaXJxcmV0dXJuX3QKLW9tYXBfaTJjX3JldjFfaXNyKGludCB0aGlzX2lycSwgdm9pZCAqZGV2X2lkKQorb21hcF9pMmNfb21hcDFfaXNyKGludCB0aGlzX2lycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBvbWFwX2kyY19kZXYgKmRldiA9IGRldl9pZDsKIAl1MTYgaXYsIHc7CiAKLQlpZiAoZGV2LT5pZGxlKQorCWlmIChwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYtPmRldikpCiAJCXJldHVybiBJUlFfTk9ORTsKIAogCWl2ID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19JVl9SRUcpOwpAQCAtNzc0LDcgKzc2NSw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogI2Vsc2UKLSNkZWZpbmUgb21hcF9pMmNfcmV2MV9pc3IJCU5VTEwKKyNkZWZpbmUgb21hcF9pMmNfb21hcDFfaXNyCQlOVUxMCiAjZW5kaWYKIAogLyoKQEAgLTgxMyw4ICs4MDQsMTEgQEAKIAl1MTYgYml0czsKIAl1MTYgc3RhdCwgdzsKIAlpbnQgZXJyLCBjb3VudCA9IDA7CisJc3RydWN0IG9tYXBfaTJjX2J1c19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAotCWlmIChkZXYtPmlkbGUpCisJcGRhdGEgPSBkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKworCWlmIChwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYtPmRldikpCiAJCXJldHVybiBJUlFfTk9ORTsKIAogCWJpdHMgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0lFX1JFRyk7CkBAIC04ODEsOCArODc1LDggQEAKIAkJCQkJICogRGF0YSByZWcgaW4gMjQzMCwgb21hcDMgYW5kCiAJCQkJCSAqIG9tYXA0IGlzIDggYml0IHdpZGUKIAkJCQkJICovCi0JCQkJCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSB8fAotCQkJCQkJCWNwdV9pc19vbWFwMjQyMCgpKSB7CisJCQkJCWlmIChwZGF0YS0+ZmxhZ3MgJgorCQkJCQkJIE9NQVBfSTJDX0ZMQUdfMTZCSVRfREFUQV9SRUcpIHsKIAkJCQkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKIAkJCQkJCQkqZGV2LT5idWYrKyA9IHcgPj4gODsKIAkJCQkJCQlkZXYtPmJ1Zl9sZW4tLTsKQEAgLTkyNCw4ICs5MTgsOCBAQAogCQkJCQkgKiBEYXRhIHJlZyBpbiAyNDMwLCBvbWFwMyBhbmQKIAkJCQkJICogb21hcDQgaXMgOCBiaXQgd2lkZQogCQkJCQkgKi8KLQkJCQkJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpIHx8Ci0JCQkJCQkJY3B1X2lzX29tYXAyNDIwKCkpIHsKKwkJCQkJaWYgKHBkYXRhLT5mbGFncyAmCisJCQkJCQkgT01BUF9JMkNfRkxBR18xNkJJVF9EQVRBX1JFRykgewogCQkJCQkJaWYgKGRldi0+YnVmX2xlbikgewogCQkJCQkJCXcgfD0gKmRldi0+YnVmKysgPDwgODsKIAkJCQkJCQlkZXYtPmJ1Zl9sZW4tLTsKQEAgLTEwMTYsNyArMTAxMCw2IEBACiAJfQogCiAJZGV2LT5zcGVlZCA9IHNwZWVkOwotCWRldi0+aWRsZSA9IDE7CiAJZGV2LT5kZXYgPSAmcGRldi0+ZGV2OwogCWRldi0+aXJxID0gaXJxLT5zdGFydDsKIAlkZXYtPmJhc2UgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CkBAIC0xMDI3LDI3ICsxMDIwLDIyIEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCi0JaWYgKGNwdV9pc19vbWFwN3h4KCkpCi0JCWRldi0+cmVnX3NoaWZ0ID0gMTsKLQllbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkKLQkJZGV2LT5yZWdfc2hpZnQgPSAwOwotCWVsc2UKLQkJZGV2LT5yZWdfc2hpZnQgPSAyOworCWRldi0+cmVnX3NoaWZ0ID0gKHBkYXRhLT5mbGFncyA+PiBPTUFQX0kyQ19GTEFHX0JVU19TSElGVF9fU0hJRlQpICYgMzsKIAotCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkKLQkJZGV2LT5yZWdzID0gKHU4ICopIG9tYXA0X3JlZ19tYXA7CisJaWYgKHBkYXRhLT5yZXYgPT0gT01BUF9JMkNfSVBfVkVSU0lPTl8yKQorCQlkZXYtPnJlZ3MgPSAodTggKilyZWdfbWFwX2lwX3YyOwogCWVsc2UKLQkJZGV2LT5yZWdzID0gKHU4ICopIHJlZ19tYXA7CisJCWRldi0+cmVncyA9ICh1OCAqKXJlZ19tYXBfaXBfdjE7CiAKLQlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKLQlvbWFwX2kyY191bmlkbGUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYtPmRldik7CisJcG1fcnVudGltZV9nZXRfc3luYyhkZXYtPmRldik7CiAKIAlkZXYtPnJldiA9IG9tYXBfaTJjX3JlYWRfcmVnKGRldiwgT01BUF9JMkNfUkVWX1JFRykgJiAweGZmOwogCiAJaWYgKGRldi0+cmV2IDw9IE9NQVBfSTJDX1JFVl9PTl8zNDMwKQogCQlkZXYtPmVycmF0YSB8PSBJMkNfT01BUDNfMVAxNTM7CiAKLQlpZiAoIShjcHVfY2xhc3NfaXNfb21hcDEoKSB8fCBjcHVfaXNfb21hcDI0MjAoKSkpIHsKKwlpZiAoIShwZGF0YS0+ZmxhZ3MgJiBPTUFQX0kyQ19GTEFHX05PX0ZJRk8pKSB7CiAJCXUxNiBzOwogCiAJCS8qIFNldCB1cCB0aGUgZmlmbyBzaXplIC0gR2V0IHRvdGFsIHNpemUgKi8KQEAgLTEwNTksNyArMTA0Nyw3IEBACiAJCSAqIHNpemUuIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIGhhbmRsZSB0aGUgc3RhdHVzIG9uIGludAogCQkgKiBjYWxsIGJhY2sgbGF0ZW5jaWVzLgogCQkgKi8KLQkJaWYgKGRldi0+cmV2ID49IE9NQVBfSTJDX1JFVl9PTl80NDMwKSB7CisJCWlmIChkZXYtPnJldiA+PSBPTUFQX0kyQ19SRVZfT05fMzUzMF80NDMwKSB7CiAJCQlkZXYtPmZpZm9fc2l6ZSA9IDA7CiAJCQlkZXYtPmJfaHcgPSAwOyAvKiBEaXNhYmxlIGhhcmR3YXJlIGZpeGVzICovCiAJCX0gZWxzZSB7CkBAIC0xMDc1LDcgKzEwNjMsOCBAQAogCS8qIHJlc2V0IEFTQVAsIGNsZWFyaW5nIGFueSBJUlFzICovCiAJb21hcF9pMmNfaW5pdChkZXYpOwogCi0JaXNyID0gKGRldi0+cmV2IDwgT01BUF9JMkNfUkVWXzIpID8gb21hcF9pMmNfcmV2MV9pc3IgOiBvbWFwX2kyY19pc3I7CisJaXNyID0gKGRldi0+cmV2IDwgT01BUF9JMkNfT01BUDFfUkVWXzIpID8gb21hcF9pMmNfb21hcDFfaXNyIDoKKwkJCQkJCQkJICAgb21hcF9pMmNfaXNyOwogCXIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaXNyLCAwLCBwZGV2LT5uYW1lLCBkZXYpOwogCiAJaWYgKHIpIHsKQEAgLTEwODMsMTAgKzEwNzIsMTAgQEAKIAkJZ290byBlcnJfdW51c2VfY2xvY2tzOwogCX0KIAotCWRldl9pbmZvKGRldi0+ZGV2LCAiYnVzICVkIHJldiVkLiVkIGF0ICVkIGtIelxuIiwKLQkJIHBkZXYtPmlkLCBkZXYtPnJldiA+PiA0LCBkZXYtPnJldiAmIDB4ZiwgZGV2LT5zcGVlZCk7CisJZGV2X2luZm8oZGV2LT5kZXYsICJidXMgJWQgcmV2JWQuJWQuJWQgYXQgJWQga0h6XG4iLCBwZGV2LT5pZCwKKwkJIHBkYXRhLT5yZXYsIGRldi0+cmV2ID4+IDQsIGRldi0+cmV2ICYgMHhmLCBkZXYtPnNwZWVkKTsKIAotCW9tYXBfaTJjX2lkbGUoZGV2KTsKKwlwbV9ydW50aW1lX3B1dChkZXYtPmRldik7CiAKIAlhZGFwID0gJmRldi0+YWRhcHRlcjsKIAlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGRldik7CkBAIC0xMTEwLDcgKzEwOTksNyBAQAogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogZXJyX3VudXNlX2Nsb2NrczoKIAlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCAwKTsKLQlvbWFwX2kyY19pZGxlKGRldik7CisJcG1fcnVudGltZV9wdXQoZGV2LT5kZXYpOwogCWlvdW5tYXAoZGV2LT5iYXNlKTsKIGVycl9mcmVlX21lbToKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKQEAgLTExMzksMTIgKzExMjgsNDMgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitzdGF0aWMgaW50IG9tYXBfaTJjX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBvbWFwX2kyY19kZXYgKl9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW9tYXBfaTJjX2lkbGUoX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX2kyY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBvbWFwX2kyY19kZXYgKl9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW9tYXBfaTJjX3VuaWRsZShfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgb21hcF9pMmNfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSBvbWFwX2kyY19ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lID0gb21hcF9pMmNfcnVudGltZV9yZXN1bWUsCit9OworI2RlZmluZSBPTUFQX0kyQ19QTV9PUFMgKCZvbWFwX2kyY19wbV9vcHMpCisjZWxzZQorI2RlZmluZSBPTUFQX0kyQ19QTV9PUFMgTlVMTAorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfaTJjX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gb21hcF9pMmNfcHJvYmUsCiAJLnJlbW92ZQkJPSBvbWFwX2kyY19yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gIm9tYXBfaTJjIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wbQk9IE9NQVBfSTJDX1BNX09QUywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMKaW5kZXggZGZhN2FlOS4uMTI3MDUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jCkBAIC0zMDYsNyArMzA2LDcgQEAKIAlwbWNtc3B0d2lfZGF0YS5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBsZGV2LCAwKTsKIAlpZiAocG1jbXNwdHdpX2RhdGEuaXJxKSB7CiAJCXJjID0gcmVxdWVzdF9pcnEocG1jbXNwdHdpX2RhdGEuaXJxLCAmcG1jbXNwdHdpX2ludGVycnVwdCwKLQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0FNUExFX1JBTkRPTSwKKwkJCUlSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAogCQkJcGxkZXYtPm5hbWUsICZwbWNtc3B0d2lfZGF0YSk7CiAJCWlmIChyYyA9PSAwKSB7CiAJCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEtcGNpLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS1wY2kuYwppbmRleCBiNzNkYTZjLi42MzJlMDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS1wY2kuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS1wY2kuYwpAQCAtMyw2ICszLDcgQEAKICAqIEl0IGRvZXMgbm90IHN1cHBvcnQgc2xhdmUgbW9kZSwgdGhlIHJlZ2lzdGVyIHNsaWdodGx5IG1vdmVkLiBUaGlzIFBDSQogICogZGV2aWNlIHByb3ZpZGVzIHRocmVlIGJhcnMsIGV2ZXJ5IGNvbnRhaW5zIGEgc2luZ2xlIEkyQyBjb250cm9sbGVyLgogICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3B4YS1pMmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKaW5kZXggZjg0YTYzYy4uMjc1NGNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKQEAgLTM1LDYgKzM1LDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaTJjLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCkBAIC03OCw2ICs4MCw4IEBACiAJc3RydWN0IHJlc291cmNlCQkqaW9hcmVhOwogCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwOwogCisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjCSpwZGF0YTsKKwlpbnQJCQlncGlvc1syXTsKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJZnJlcV90cmFuc2l0aW9uOwogI2VuZGlmCkBAIC05NSw2ICs5OSwxMiBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoaTJjLT5kZXYpOwogCWVudW0gczNjMjR4eF9pMmNfdHlwZSB0eXBlOwogCisjaWZkZWYgQ09ORklHX09GCisJaWYgKGkyYy0+ZGV2LT5vZl9ub2RlKQorCQlyZXR1cm4gb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoaTJjLT5kZXYtPm9mX25vZGUsCisJCQkJInNhbXN1bmcsczNjMjQ0MC1pMmMiKTsKKyNlbmRpZgorCiAJdHlwZSA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOwogCXJldHVybiB0eXBlID09IFRZUEVfUzNDMjQ0MDsKIH0KQEAgLTYyNSw3ICs2MzUsNyBAQAogCiBzdGF0aWMgaW50IHMzYzI0eHhfaTJjX2Nsb2NrcmF0ZShzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYywgdW5zaWduZWQgaW50ICpnb3QpCiB7Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZGF0YSA9IGkyYy0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGRhdGEgPSBpMmMtPnBkYXRhOwogCXVuc2lnbmVkIGxvbmcgY2xraW4gPSBjbGtfZ2V0X3JhdGUoaTJjLT5jbGspOwogCXVuc2lnbmVkIGludCBkaXZzLCBkaXYxOwogCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X2ZyZXF1ZW5jeTsKQEAgLTc0MSw2ICs3NTEsNDkgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgaW50IHMzYzI0eHhfaTJjX3BhcnNlX2R0X2dwaW8oc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCit7CisJaW50IGlkeCwgZ3BpbywgcmV0OworCisJZm9yIChpZHggPSAwOyBpZHggPCAyOyBpZHgrKykgeworCQlncGlvID0gb2ZfZ2V0X2dwaW8oaTJjLT5kZXYtPm9mX25vZGUsIGlkeCk7CisJCWlmICghZ3Bpb19pc192YWxpZChncGlvKSkgeworCQkJZGV2X2VycihpMmMtPmRldiwgImludmFsaWQgZ3Bpb1slZF06ICVkXG4iLCBpZHgsIGdwaW8pOworCQkJZ290byBmcmVlX2dwaW87CisJCX0KKworCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3BpbywgImkyYy1idXMiKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihpMmMtPmRldiwgImdwaW8gWyVkXSByZXF1ZXN0IGZhaWxlZFxuIiwgZ3Bpbyk7CisJCQlnb3RvIGZyZWVfZ3BpbzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworZnJlZV9ncGlvOgorCXdoaWxlICgtLWlkeCA+PSAwKQorCQlncGlvX2ZyZWUoaTJjLT5ncGlvc1tpZHhdKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgczNjMjR4eF9pMmNfZHRfZ3Bpb19mcmVlKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworCXVuc2lnbmVkIGludCBpZHg7CisJZm9yIChpZHggPSAwOyBpZHggPCAyOyBpZHgrKykKKwkJZ3Bpb19mcmVlKGkyYy0+Z3Bpb3NbaWR4XSk7Cit9CisjZWxzZQorc3RhdGljIGludCBzM2MyNHh4X2kyY19wYXJzZV9kdF9ncGlvKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBzM2MyNHh4X2kyY19kdF9ncGlvX2ZyZWUoc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCit7Cit9CisjZW5kaWYKKwogLyogczNjMjR4eF9pMmNfaW5pdAogICoKICAqIGluaXRpYWxpc2UgdGhlIGNvbnRyb2xsZXIsIHNldCB0aGUgSU8gbGluZXMgYW5kIGZyZXF1ZW5jeQpAQCAtNzU0LDEyICs4MDcsMTUgQEAKIAogCS8qIGdldCB0aGUgcGxhZnJvbSBkYXRhICovCiAKLQlwZGF0YSA9IGkyYy0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCXBkYXRhID0gaTJjLT5wZGF0YTsKIAogCS8qIGluaXRpdGFsaXNlIHRoZSBncGlvICovCiAKIAlpZiAocGRhdGEtPmNmZ19ncGlvKQogCQlwZGF0YS0+Y2ZnX2dwaW8odG9fcGxhdGZvcm1fZGV2aWNlKGkyYy0+ZGV2KSk7CisJZWxzZQorCQlpZiAoczNjMjR4eF9pMmNfcGFyc2VfZHRfZ3BpbyhpMmMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiB3cml0ZSBzbGF2ZSBhZGRyZXNzICovCiAKQEAgLTc4NSw2ICs4NDEsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19PRgorLyogczNjMjR4eF9pMmNfcGFyc2VfZHQKKyAqCisgKiBQYXJzZSB0aGUgZGV2aWNlIHRyZWUgbm9kZSBhbmQgcmV0cmVpdmUgdGhlIHBsYXRmb3JtIGRhdGEuCisqLworCitzdGF0aWMgdm9pZAorczNjMjR4eF9pMmNfcGFyc2VfZHQoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCit7CisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZGF0YSA9IGkyYy0+cGRhdGE7CisKKwlpZiAoIW5wKQorCQlyZXR1cm47CisKKwlwZGF0YS0+YnVzX251bSA9IC0xOyAvKiBpMmMgYnVzIG51bWJlciBpcyBkeW5hbWljYWxseSBhc3NpZ25lZCAqLworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic2Ftc3VuZyxpMmMtc2RhLWRlbGF5IiwgJnBkYXRhLT5zZGFfZGVsYXkpOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic2Ftc3VuZyxpMmMtc2xhdmUtYWRkciIsICZwZGF0YS0+c2xhdmVfYWRkcik7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzYW1zdW5nLGkyYy1tYXgtYnVzLWZyZXEiLAorCQkJCSh1MzIgKikmcGRhdGEtPmZyZXF1ZW5jeSk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQKK3MzYzI0eHhfaTJjX3BhcnNlX2R0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworCXJldHVybjsKK30KKyNlbmRpZgorCiAvKiBzM2MyNHh4X2kyY19wcm9iZQogICoKICAqIGNhbGxlZCBieSB0aGUgYnVzIGRyaXZlciB3aGVuIGEgc3VpdGFibGUgZGV2aWNlIGlzIGZvdW5kCkBAIC03OTMsMTQgKzg3NywxNiBAQAogc3RhdGljIGludCBzM2MyNHh4X2kyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjOwotCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGRhdGE7CisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldDsKIAotCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFwZGV2LT5kZXYub2Zfbm9kZSkgeworCQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCQlpZiAoIXBkYXRhKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiAJaTJjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHMzYzI0eHhfaTJjKSwgR0ZQX0tFUk5FTCk7CkBAIC04MDksNiArODk1LDE3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWkyYy0+cGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghaTJjLT5wZGF0YSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9ub2NsazsKKwl9CisKKwlpZiAocGRhdGEpCisJCW1lbWNweShpMmMtPnBkYXRhLCBwZGF0YSwgc2l6ZW9mKCpwZGF0YSkpOworCWVsc2UKKwkJczNjMjR4eF9pMmNfcGFyc2VfZHQocGRldi0+ZGV2Lm9mX25vZGUsIGkyYyk7CisKIAlzdHJsY3B5KGkyYy0+YWRhcC5uYW1lLCAiczNjMjQxMC1pMmMiLCBzaXplb2YoaTJjLT5hZGFwLm5hbWUpKTsKIAlpMmMtPmFkYXAub3duZXIgICA9IFRISVNfTU9EVUxFOwogCWkyYy0+YWRhcC5hbGdvICAgID0gJnMzYzI0eHhfaTJjX2FsZ29yaXRobTsKQEAgLTg4Myw3ICs5ODAsNyBAQAogCQlnb3RvIGVycl9pb21hcDsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpMmMtPmlycSwgczNjMjR4eF9pMmNfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKGkyYy0+aXJxLCBzM2MyNHh4X2kyY19pcnEsIDAsCiAJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBpMmMpOwogCiAJaWYgKHJldCAhPSAwKSB7CkBAIC05MDMsNyArMTAwMCw4IEBACiAJICogYmVpbmcgYnVzIDAuCiAJICovCiAKLQlpMmMtPmFkYXAubnIgPSBwZGF0YS0+YnVzX251bTsKKwlpMmMtPmFkYXAubnIgPSBpMmMtPnBkYXRhLT5idXNfbnVtOworCWkyYy0+YWRhcC5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCiAJcmV0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKCZpMmMtPmFkYXApOwogCWlmIChyZXQgPCAwKSB7CkBAIC05MTEsNiArMTAwOSw3IEBACiAJCWdvdG8gZXJyX2NwdWZyZXE7CiAJfQogCisJb2ZfaTJjX3JlZ2lzdGVyX2RldmljZXMoJmkyYy0+YWRhcCk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjKTsKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogUzNDIEkyQyBhZGFwdGVyXG4iLCBkZXZfbmFtZSgmaTJjLT5hZGFwLmRldikpOwpAQCAtOTU5LDYgKzEwNTgsNyBAQAogCWlvdW5tYXAoaTJjLT5yZWdzKTsKIAogCXJlbGVhc2VfcmVzb3VyY2UoaTJjLT5pb2FyZWEpOworCXMzYzI0eHhfaTJjX2R0X2dwaW9fZnJlZShpMmMpOwogCWtmcmVlKGkyYy0+aW9hcmVhKTsKIAlrZnJlZShpMmMpOwogCkBAIC0xMDEyLDYgKzExMTIsMTcgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBzM2MyNHh4X2RyaXZlcl9pZHMpOwogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzM2MyNHh4X2kyY19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzM2MyNDEwLWkyYyIgfSwKKwl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsczNjMjQ0MC1pMmMiIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgczNjMjR4eF9pMmNfbWF0Y2gpOworI2Vsc2UKKyNkZWZpbmUgczNjMjR4eF9pMmNfbWF0Y2ggTlVMTAorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0eHhfaTJjX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gczNjMjR4eF9pMmNfcHJvYmUsCiAJLnJlbW92ZQkJPSBzM2MyNHh4X2kyY19yZW1vdmUsCkBAIC0xMDIwLDYgKzExMzEsNyBAQAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAiczNjLWkyYyIsCiAJCS5wbQk9IFMzQzI0WFhfREVWX1BNX09QUywKKwkJLm9mX21hdGNoX3RhYmxlID0gczNjMjR4eF9pMmNfbWF0Y2gsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoNzc2MC5jCmluZGV4IDNjYWQ4ZmUuLmE2NzEzMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2kyYy1zaDc3NjAuaD4KQEAgLTUwMiw3ICs1MDMsNyBAQAogCX0KIAlPVVQzMihpZCwgSTJDQ0NSLCByZXQpOwogCi0JaWYgKHJlcXVlc3RfaXJxKGlkLT5pcnEsIHNoNzc2MF9pMmNfaXJxLCBJUlFGX0RJU0FCTEVELAorCWlmIChyZXF1ZXN0X2lycShpZC0+aXJxLCBzaDc3NjBfaTJjX2lycSwgMCwKIAkJCVNINzc2MF9JMkNfREVWTkFNRSwgaWQpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgaXJxICVkXG4iLCBpZC0+aXJxKTsKIAkJcmV0ID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMKaW5kZXggZjYzM2E1My4uNjc1Yzk2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jCkBAIC01NDMsNyArNTQzLDcgQEAKIAogCXdoaWxlICgocmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9JUlEsIGspKSkgewogCQlmb3IgKG4gPSByZXMtPnN0YXJ0OyBob29rICYmIG4gPD0gcmVzLT5lbmQ7IG4rKykgewotCQkJaWYgKHJlcXVlc3RfaXJxKG4sIHNoX21vYmlsZV9pMmNfaXNyLCBJUlFGX0RJU0FCTEVELAorCQkJaWYgKHJlcXVlc3RfaXJxKG4sIHNoX21vYmlsZV9pMmNfaXNyLCAwLAogCQkJCQlkZXZfbmFtZSgmZGV2LT5kZXYpLCBkZXYpKSB7CiAJCQkJZm9yIChuLS07IG4gPj0gcmVzLT5zdGFydDsgbi0tKQogCQkJCQlmcmVlX2lycShuLCBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdHUzMDAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc3R1MzAwLmMKaW5kZXggOTk4Nzk2MS4uNGQ0NGFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdHUzMDAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dTMwMC5jCkBAIC05MTYsNyArOTE2LDcgQEAKIAl9CiAKIAlkZXYtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzdHUzMDBfaXJoLCBJUlFGX0RJU0FCTEVELAorCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgc3R1MzAwX2lyaCwgMCwKIAkJCU5BTUUsIGRldikpIHsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBlcnJfbm9faXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10ZWdyYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10ZWdyYS5jCmluZGV4IDNjOTRjNGEuLjQ2YjY1MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGVncmEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLXRlZ3JhLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKQEAgLTU2Niw3ICs1NjcsNyBAQAogCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3QgY2xrICppMmNfY2xrOwogCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvcDsKLQl2b2lkICpiYXNlOworCXZvaWQgX19pb21lbSAqYmFzZTsKIAlpbnQgaXJxOwogCWludCByZXQgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYwppbmRleCA5ODZlNWY2Li45MWUzNDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMKQEAgLTU1MCw3ICs1NTAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzY3gyMDBfcGNpX2RydiA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNjeDIwMF9wY2lfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImNzNTUzNS1zbWIiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKQEAgLTU5MywxNCArNTkzLDE0IEBACiAJCXJldHVybiAwOwogCiAJLyogTm8gSVNBIGRldmljZXM7IHJlZ2lzdGVyIHRoZSBwbGF0Zm9ybSBkcml2ZXIgZm9yIFBDSS1iYXNlZCBkZXZpY2VzICovCi0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2N4MjAwX3BjaV9kcnYpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNjeDIwMF9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNjeDIwMF9hY2JfY2xlYW51cCh2b2lkKQogewogCXN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZTsKIAotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzY3gyMDBfcGNpX2Rydik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNjeDIwMF9wY2lfZHJpdmVyKTsKIAogCW11dGV4X2xvY2soJnNjeDIwMF9hY2JfbGlzdF9tdXRleCk7CiAJd2hpbGUgKChpZmFjZSA9IHNjeDIwMF9hY2JfbGlzdCkgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWJvYXJkaW5mby5jIGIvZHJpdmVycy9pMmMvaTJjLWJvYXJkaW5mby5jCmluZGV4IDNjYTJlMDEuLjEwMjc0ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1ib2FyZGluZm8uYworKysgYi9kcml2ZXJzL2kyYy9pMmMtYm9hcmRpbmZvLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KIAogI2luY2x1ZGUgImkyYy1jb3JlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9LY29uZmlnIGIvZHJpdmVycy9pZGUvS2NvbmZpZwppbmRleCA3NmI2ZDk4Li41YTI2NTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWRlL0tjb25maWcKQEAgLTY3NywxOSArNjc3LDE5IEBACiAKIGNvbmZpZyBCTEtfREVWX0lERV9BVTFYWFgKICAgICAgICBib29sICJJREUgZm9yIEFNRCBBbGNoZW15IEF1MTIwMCIKLSAgICAgICBkZXBlbmRzIG9uIFNPQ19BVTEyMDAKKyAgICAgICBkZXBlbmRzIG9uIE1JUFNfQUxDSEVNWQogICAgICAgIHNlbGVjdCBJREVfWEZFUl9NT0RFCiBjaG9pY2UKICAgICAgICBwcm9tcHQgIklERSBNb2RlIGZvciBBTUQgQWxjaGVteSBBdTEyMDAiCiAgICAgICAgZGVmYXVsdCBCTEtfREVWX0lERV9BVTFYWFhfUElPX0RCRE1BCi0gICAgICAgZGVwZW5kcyBvbiBTT0NfQVUxMjAwICYmIEJMS19ERVZfSURFX0FVMVhYWAorICAgICAgIGRlcGVuZHMgb24gQkxLX0RFVl9JREVfQVUxWFhYCiAKIGNvbmZpZyBCTEtfREVWX0lERV9BVTFYWFhfUElPX0RCRE1BCiAgICAgICAgYm9vbCAiUElPK0RiRE1BIElERSBmb3IgQU1EIEFsY2hlbXkgQXUxMjAwIgogCiBjb25maWcgQkxLX0RFVl9JREVfQVUxWFhYX01ETUEyX0RCRE1BCiAgICAgICAgYm9vbCAiTURNQTIrRGJETUEgSURFIGZvciBBTUQgQWxjaGVteSBBdTEyMDAiCi0gICAgICAgZGVwZW5kcyBvbiBTT0NfQVUxMjAwICYmIEJMS19ERVZfSURFX0FVMVhYWAorICAgICAgIGRlcGVuZHMgb24gQkxLX0RFVl9JREVfQVUxWFhYCiBlbmRjaG9pY2UKIAogY29uZmlnIEJMS19ERVZfSURFX1RYNDkzOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYXQ5MV9pZGUuYyBiL2RyaXZlcnMvaWRlL2F0OTFfaWRlLmMKaW5kZXggMDAwYTc4ZS4uNmRlZGU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYXQ5MV9pZGUuYworKysgYi9kcml2ZXJzL2lkZS9hdDkxX2lkZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJhdDkxX2lkZSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYyBiL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYwppbmRleCBiMjZjMjM0Li4yNTk3ODZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9hdTF4eHgtaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvYXUxeHh4LWlkZS5jCkBAIC0zNiwxMyArMzYsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9pZGUuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkiYXUxMjAwLWlkZSIKICNkZWZpbmUgRFJWX0FVVEhPUgkiRW5yaWNvIFdhbHRoZXIgPGVucmljby53YWx0aGVyQGFtZC5jb20+IC8gUGV0ZSBQb3BvdiA8cHBvcG92QGVtYmVkZGVkYWxsZXkuY29tPiIKIAorI2lmbmRlZiBJREVfUkVHX1NISUZUCisjZGVmaW5lIElERV9SRUdfU0hJRlQgNQorI2VuZGlmCisKIC8qIGVuYWJsZSB0aGUgYnVyc3Rtb2RlIGluIHRoZSBkYmRtYSAqLwogI2RlZmluZSBJREVfQVUxWFhYX0JVUlNUTU9ERQkxCiAKQEAgLTMxNywxMCArMzIxLDExIEBACiB9CiAjZW5kaWYgLyogZW5kIENPTkZJR19CTEtfREVWX0lERV9BVTFYWFhfTURNQTJfREJETUEgKi8KIAotc3RhdGljIHZvaWQgYXVpZGVfaW5pdF9kYmRtYV9kZXYoZGJkZXZfdGFiX3QgKmRldiwgdTMyIGRldl9pZCwgdTMyIHRzaXplLCB1MzIgZGV2d2lkdGgsIHUzMiBmbGFncykKK3N0YXRpYyB2b2lkIGF1aWRlX2luaXRfZGJkbWFfZGV2KGRiZGV2X3RhYl90ICpkZXYsIHUzMiBkZXZfaWQsIHUzMiB0c2l6ZSwKKwkJCQkgdTMyIGRldndpZHRoLCB1MzIgZmxhZ3MsIHUzMiByZWdiYXNlKQogewogCWRldi0+ZGV2X2lkICAgICAgICAgID0gZGV2X2lkOwotCWRldi0+ZGV2X3BoeXNhZGRyICAgID0gKHUzMilJREVfUEhZU19BRERSOworCWRldi0+ZGV2X3BoeXNhZGRyICAgID0gQ1BIWVNBRERSKHJlZ2Jhc2UpOwogCWRldi0+ZGV2X2ludGxldmVsICAgID0gMDsKIAlkZXYtPmRldl9pbnRwb2xhcml0eSA9IDA7CiAJZGV2LT5kZXZfdHNpemUgICAgICAgPSB0c2l6ZTsKQEAgLTM0NCw3ICszNDksNyBAQAogCWRiZGV2X3RhYl90IHNvdXJjZV9kZXZfdGFiLCB0YXJnZXRfZGV2X3RhYjsKIAl1MzIgZGV2X2lkLCB0c2l6ZSwgZGV2d2lkdGgsIGZsYWdzOwogCi0JZGV2X2lkCSA9IElERV9ERE1BX1JFUTsKKwlkZXZfaWQJID0gaHdpZi0+ZGRtYV9pZDsKIAogCXRzaXplICAgID0gIDg7IC8qICAxICovCiAJZGV2d2lkdGggPSAzMjsgLyogMTYgKi8KQEAgLTM1NiwyMCArMzYxLDE3IEBACiAjZW5kaWYKIAogCS8qIHNldHVwIGRldl90YWIgZm9yIHR4IGNoYW5uZWwgKi8KLQlhdWlkZV9pbml0X2RiZG1hX2RldiggJnNvdXJjZV9kZXZfdGFiLAotCQkJICAgICAgZGV2X2lkLAotCQkJICAgICAgdHNpemUsIGRldndpZHRoLCBERVZfRkxBR1NfT1VUIHwgZmxhZ3MpOworCWF1aWRlX2luaXRfZGJkbWFfZGV2KCZzb3VyY2VfZGV2X3RhYiwgZGV2X2lkLCB0c2l6ZSwgZGV2d2lkdGgsCisJCQkgICAgIERFVl9GTEFHU19PVVQgfCBmbGFncywgYXVpZGUtPnJlZ2Jhc2UpOwogIAlhdWlkZS0+dHhfZGV2X2lkID0gYXUxeHh4X2RkbWFfYWRkX2RldmljZSggJnNvdXJjZV9kZXZfdGFiICk7CiAKLQlhdWlkZV9pbml0X2RiZG1hX2RldiggJnNvdXJjZV9kZXZfdGFiLAotCQkJICAgICAgZGV2X2lkLAotCQkJICAgICAgdHNpemUsIGRldndpZHRoLCBERVZfRkxBR1NfSU4gfCBmbGFncyk7CisJYXVpZGVfaW5pdF9kYmRtYV9kZXYoJnNvdXJjZV9kZXZfdGFiLCBkZXZfaWQsIHRzaXplLCBkZXZ3aWR0aCwKKwkJCSAgICAgREVWX0ZMQUdTX0lOIHwgZmxhZ3MsIGF1aWRlLT5yZWdiYXNlKTsKICAJYXVpZGUtPnJ4X2Rldl9pZCA9IGF1MXh4eF9kZG1hX2FkZF9kZXZpY2UoICZzb3VyY2VfZGV2X3RhYiApOwogCQogCS8qIFdlIGFsc28gbmVlZCB0byBhZGQgYSB0YXJnZXQgZGV2aWNlIGZvciB0aGUgRE1BICovCi0JYXVpZGVfaW5pdF9kYmRtYV9kZXYoICZ0YXJnZXRfZGV2X3RhYiwKLQkJCSAgICAgICh1MzIpRFNDUl9DTUQwX0FMV0FZUywKLQkJCSAgICAgIHRzaXplLCBkZXZ3aWR0aCwgREVWX0ZMQUdTX0FOWVVTRSk7CisJYXVpZGVfaW5pdF9kYmRtYV9kZXYoJnRhcmdldF9kZXZfdGFiLCAodTMyKURTQ1JfQ01EMF9BTFdBWVMsIHRzaXplLAorCQkJICAgICBkZXZ3aWR0aCwgREVWX0ZMQUdTX0FOWVVTRSwgYXVpZGUtPnJlZ2Jhc2UpOwogCWF1aWRlLT50YXJnZXRfZGV2X2lkID0gYXUxeHh4X2RkbWFfYWRkX2RldmljZSgmdGFyZ2V0X2Rldl90YWIpOwkKICAKIAkvKiBHZXQgYSBjaGFubmVsIGZvciBUWCAqLwpAQCAtNDExLDE0ICs0MTMsMTIgQEAKICNlbmRpZgogCiAJLyogc2V0dXAgZGV2X3RhYiBmb3IgdHggY2hhbm5lbCAqLwotCWF1aWRlX2luaXRfZGJkbWFfZGV2KCAmc291cmNlX2Rldl90YWIsCi0JCQkgICAgICAodTMyKURTQ1JfQ01EMF9BTFdBWVMsCi0JCQkgICAgICA4LCAzMiwgREVWX0ZMQUdTX09VVCB8IGZsYWdzKTsKKwlhdWlkZV9pbml0X2RiZG1hX2Rldigmc291cmNlX2Rldl90YWIsICh1MzIpRFNDUl9DTUQwX0FMV0FZUywgOCwgMzIsCisJCQkgICAgIERFVl9GTEFHU19PVVQgfCBmbGFncywgYXVpZGUtPnJlZ2Jhc2UpOwogIAlhdWlkZS0+dHhfZGV2X2lkID0gYXUxeHh4X2RkbWFfYWRkX2RldmljZSggJnNvdXJjZV9kZXZfdGFiICk7CiAKLQlhdWlkZV9pbml0X2RiZG1hX2RldiggJnNvdXJjZV9kZXZfdGFiLAotCQkJICAgICAgKHUzMilEU0NSX0NNRDBfQUxXQVlTLAotCQkJICAgICAgOCwgMzIsIERFVl9GTEFHU19JTiB8IGZsYWdzKTsKKwlhdWlkZV9pbml0X2RiZG1hX2Rldigmc291cmNlX2Rldl90YWIsICh1MzIpRFNDUl9DTUQwX0FMV0FZUywgOCwgMzIsCisJCQkgICAgIERFVl9GTEFHU19JTiB8IGZsYWdzLCBhdWlkZS0+cmVnYmFzZSk7CiAgCWF1aWRlLT5yeF9kZXZfaWQgPSBhdTF4eHhfZGRtYV9hZGRfZGV2aWNlKCAmc291cmNlX2Rldl90YWIgKTsKIAkKIAkvKiBHZXQgYSBjaGFubmVsIGZvciBUWCAqLwpAQCAtNTQwLDYgKzU0MCwxNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJcHJfZGVidWcoIiVzOiBubyBERE1BIElEIHJlc291cmNlXG4iLCBEUlZfTkFNRSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwlhaHdpZi0+ZGRtYV9pZCA9IHJlcy0+c3RhcnQ7CisKIAltZW1zZXQoJmh3LCAwLCBzaXplb2YoaHcpKTsKIAlhdWlkZV9zZXR1cF9wb3J0cygmaHcsIGFod2lmKTsKIAlody5pcnEgPSBhaHdpZi0+aXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYnVkZGhhLmMgYi9kcml2ZXJzL2lkZS9idWRkaGEuYwppbmRleCBhYjRmMTY5Li5iMWQzODU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9idWRkaGEuYworKysgYi9kcml2ZXJzL2lkZS9idWRkaGEuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KICNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jbWQ2NDAuYyBiL2RyaXZlcnMvaWRlL2NtZDY0MC5jCmluZGV4IGNiMTAyMDEuLmE4MWJkNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2NtZDY0MC5jCisrKyBiL2RyaXZlcnMvaWRlL2NtZDY0MC5jCkBAIC0xMDUsNiArMTA1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jIGIvZHJpdmVycy9pZGUvaWRlLWFjcGkuYwppbmRleCAyYWY4Y2I0Li5mMjJlZGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWF0YXBpLmMgYi9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYwppbmRleCA2ZjIxOGUwMS4uZmFjM2Q5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWF0YXBpLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWF0YXBpLmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuYyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCmluZGV4IDA0YjA5NTYuLjgxMjY4MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCkBAIC00Myw3ICs0Myw2IEBACiAvKiBGb3IgU0NTSSAtPiBBVEFQSSBjb21tYW5kIGNvbnZlcnNpb24gKi8KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KIAotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrX3Byb2MuYyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrX3Byb2MuYwppbmRleCBmOWJiZDkwLi44YjU3MGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZGlza19wcm9jLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRpc2tfcHJvYy5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjaW5jbHVkZSAiaWRlLWRpc2suaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jCmluZGV4IGU0Y2RmNzguLjI4OWQxNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRtYS1zZmYuYwpAQCAtMSw1ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kbWEuYyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEuYwppbmRleCBkNDEzNjkwLi4xN2E2NWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRtYS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZWguYyBiL2RyaXZlcnMvaWRlL2lkZS1laC5jCmluZGV4IGMwYWE5M2YuLjMyOTcwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1laC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1laC5jCkBAIC0xLDUgKzEsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCmluZGV4IDYxZmRmNTQ0Li4zZDQyMDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweV9wcm9jLmMgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5X3Byb2MuYwppbmRleCBkNzExZDliLi4xNjAwNzIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5X3Byb2MuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5X3Byb2MuYwpAQCAtMSw0ICsxLDUgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW8tc3RkLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW8tc3RkLmMKaW5kZXggNDY3MjFjNC4uMTk3NjM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvLXN0ZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1pby1zdGQuYwpAQCAtMSw1ICsxLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJNKSB8fCBkZWZpbmVkKENPTkZJR19NNjhLKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTKSB8fCBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW9jdGxzLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW9jdGxzLmMKaW5kZXggOTk2NWVjZC4uNGQxOWViOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvY3Rscy5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1pb2N0bHMuYwpAQCAtMiw2ICsyLDcgQEAKICAqIElERSBpb2N0bHMgaGFuZGxpbmcuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWxlZ2FjeS5jIGIvZHJpdmVycy9pZGUvaWRlLWxlZ2FjeS5jCmluZGV4IGI5NjU0YTcuLjMwZmUzNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1sZWdhY3kuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtbGVnYWN5LmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAKIHN0YXRpYyB2b2lkIGlkZV9sZWdhY3lfaW5pdF9vbmUoc3RydWN0IGlkZV9odyAqKmh3cywgc3RydWN0IGlkZV9odyAqaHcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtbGliLmMgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKaW5kZXggZTM4NmEzMi4uZDljOTgyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1saWIuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXBucC5jIGIvZHJpdmVycy9pZGUvaWRlLXBucC5jCmluZGV4IDAxN2IxZGYuLmU1ZjNkYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wbnAuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcG5wLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgImlkZS1wbnAiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCmluZGV4IDdlY2IxYWQuLmNlODIzN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKaW5kZXggNjAwYzg5YS4uNWJjMjgzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS14ZmVyLW1vZGUuYyBiL2RyaXZlcnMvaWRlL2lkZS14ZmVyLW1vZGUuYwppbmRleCA1ZmM4ZDVjLi5lYjQyMTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUteGZlci1tb2RlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXhmZXItbW9kZS5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9tYWNpZGUuYyBiL2RyaXZlcnMvaWRlL21hY2lkZS5jCmluZGV4IDUwNWVjNDMuLmFkYzVmZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL21hY2lkZS5jCisrKyBiL2RyaXZlcnMvaWRlL21hY2lkZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNpbnRvc2guaD4KICNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcG1hYy5jIGIvZHJpdmVycy9pZGUvcG1hYy5jCmluZGV4IDFkYjdjNDMuLmU5NDRjN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BtYWMuYworKysgYi9kcml2ZXJzL2lkZS9wbWFjLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvYWRiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9xNDBpZGUuYyBiL2RyaXZlcnMvaWRlL3E0MGlkZS5jCmluZGV4IDkwNzg2MDguLmVjZDBhNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3E0MGlkZS5jCisrKyBiL2RyaXZlcnMvaWRlL3E0MGlkZS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaWRlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKaW5kZXggYWIzZGI2MS4uMzRhNWU1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKKysrIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3RjODZjMDAxLmMgYi9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jCmluZGV4IGU0NDRkMjQuLjQ3OTlkNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3RjODZjMDAxLmMKKysrIGIvZHJpdmVycy9pZGUvdGM4NmMwMDEuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInRjODZjMDAxIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkbGUvaW50ZWxfaWRsZS5jIGIvZHJpdmVycy9pZGxlL2ludGVsX2lkbGUuYwppbmRleCBhNDZkZGRmLi41ZDJmOGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkbGUvaW50ZWxfaWRsZS5jCisrKyBiL2RyaXZlcnMvaWRsZS9pbnRlbF9pZGxlLmMKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL213YWl0Lmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgogCkBAIC04MSw3ICs4Miw4IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGxhcGljX3RpbWVyX3JlbGlhYmxlX3N0YXRlcyA9ICgxIDw8IDEpOwkgLyogRGVmYXVsdCB0byBvbmx5IEMxICovCiAKIHN0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgX19wZXJjcHUgKmludGVsX2lkbGVfY3B1aWRsZV9kZXZpY2VzOwotc3RhdGljIGludCBpbnRlbF9pZGxlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LCBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpOworc3RhdGljIGludCBpbnRlbF9pZGxlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIGludCBpbmRleCk7CiAKIHN0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqY3B1aWRsZV9zdGF0ZV90YWJsZTsKIApAQCAtMTA5LDcgKzExMSw2IEBACiAJeyAvKiBNV0FJVCBDMSAqLwogCQkubmFtZSA9ICJDMS1OSE0iLAogCQkuZGVzYyA9ICJNV0FJVCAweDAwIiwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikgMHgwMCwKIAkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCiAJCS5leGl0X2xhdGVuY3kgPSAzLAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDYsCkBAIC0xMTcsNyArMTE4LDYgQEAKIAl7IC8qIE1XQUlUIEMyICovCiAJCS5uYW1lID0gIkMzLU5ITSIsCiAJCS5kZXNjID0gIk1XQUlUIDB4MTAiLAotCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSAweDEwLAogCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCB8IENQVUlETEVfRkxBR19UTEJfRkxVU0hFRCwKIAkJLmV4aXRfbGF0ZW5jeSA9IDIwLAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDgwLApAQCAtMTI1LDcgKzEyNSw2IEBACiAJeyAvKiBNV0FJVCBDMyAqLwogCQkubmFtZSA9ICJDNi1OSE0iLAogCQkuZGVzYyA9ICJNV0FJVCAweDIwIiwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikgMHgyMCwKIAkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQgfCBDUFVJRExFX0ZMQUdfVExCX0ZMVVNIRUQsCiAJCS5leGl0X2xhdGVuY3kgPSAyMDAsCiAJCS50YXJnZXRfcmVzaWRlbmN5ID0gODAwLApAQCAtMTM3LDcgKzEzNiw2IEBACiAJeyAvKiBNV0FJVCBDMSAqLwogCQkubmFtZSA9ICJDMS1TTkIiLAogCQkuZGVzYyA9ICJNV0FJVCAweDAwIiwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikgMHgwMCwKIAkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCiAJCS5leGl0X2xhdGVuY3kgPSAxLAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDEsCkBAIC0xNDUsNyArMTQzLDYgQEAKIAl7IC8qIE1XQUlUIEMyICovCiAJCS5uYW1lID0gIkMzLVNOQiIsCiAJCS5kZXNjID0gIk1XQUlUIDB4MTAiLAotCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSAweDEwLAogCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCB8IENQVUlETEVfRkxBR19UTEJfRkxVU0hFRCwKIAkJLmV4aXRfbGF0ZW5jeSA9IDgwLAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDIxMSwKQEAgLTE1Myw3ICsxNTAsNiBAQAogCXsgLyogTVdBSVQgQzMgKi8KIAkJLm5hbWUgPSAiQzYtU05CIiwKIAkJLmRlc2MgPSAiTVdBSVQgMHgyMCIsCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopIDB4MjAsCiAJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAogCQkuZXhpdF9sYXRlbmN5ID0gMTA0LAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDM0NSwKQEAgLTE2MSw3ICsxNTcsNiBAQAogCXsgLyogTVdBSVQgQzQgKi8KIAkJLm5hbWUgPSAiQzctU05CIiwKIAkJLmRlc2MgPSAiTVdBSVQgMHgzMCIsCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopIDB4MzAsCiAJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAogCQkuZXhpdF9sYXRlbmN5ID0gMTA5LAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDM0NSwKQEAgLTE3Myw3ICsxNjgsNiBAQAogCXsgLyogTVdBSVQgQzEgKi8KIAkJLm5hbWUgPSAiQzEtQVRNIiwKIAkJLmRlc2MgPSAiTVdBSVQgMHgwMCIsCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopIDB4MDAsCiAJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElELAogCQkuZXhpdF9sYXRlbmN5ID0gMSwKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSA0LApAQCAtMTgxLDcgKzE3NSw2IEBACiAJeyAvKiBNV0FJVCBDMiAqLwogCQkubmFtZSA9ICJDMi1BVE0iLAogCQkuZGVzYyA9ICJNV0FJVCAweDEwIiwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikgMHgxMCwKIAkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCiAJCS5leGl0X2xhdGVuY3kgPSAyMCwKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSA4MCwKQEAgLTE5MCw3ICsxODMsNiBAQAogCXsgLyogTVdBSVQgQzQgKi8KIAkJLm5hbWUgPSAiQzQtQVRNIiwKIAkJLmRlc2MgPSAiTVdBSVQgMHgzMCIsCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopIDB4MzAsCiAJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAogCQkuZXhpdF9sYXRlbmN5ID0gMTAwLAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDQwMCwKQEAgLTE5OSwyMyArMTkxLDU1IEBACiAJeyAvKiBNV0FJVCBDNiAqLwogCQkubmFtZSA9ICJDNi1BVE0iLAogCQkuZGVzYyA9ICJNV0FJVCAweDUyIiwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikgMHg1MiwKIAkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQgfCBDUFVJRExFX0ZMQUdfVExCX0ZMVVNIRUQsCiAJCS5leGl0X2xhdGVuY3kgPSAxNDAsCiAJCS50YXJnZXRfcmVzaWRlbmN5ID0gNTYwLAogCQkuZW50ZXIgPSAmaW50ZWxfaWRsZSB9LAogfTsKIAorc3RhdGljIGludCBnZXRfZHJpdmVyX2RhdGEoaW50IGNzdGF0ZSkKK3sKKwlpbnQgZHJpdmVyX2RhdGE7CisJc3dpdGNoIChjc3RhdGUpIHsKKworCWNhc2UgMToJLyogTVdBSVQgQzEgKi8KKwkJZHJpdmVyX2RhdGEgPSAweDAwOworCQlicmVhazsKKwljYXNlIDI6CS8qIE1XQUlUIEMyICovCisJCWRyaXZlcl9kYXRhID0gMHgxMDsKKwkJYnJlYWs7CisJY2FzZSAzOgkvKiBNV0FJVCBDMyAqLworCQlkcml2ZXJfZGF0YSA9IDB4MjA7CisJCWJyZWFrOworCWNhc2UgNDoJLyogTVdBSVQgQzQgKi8KKwkJZHJpdmVyX2RhdGEgPSAweDMwOworCQlicmVhazsKKwljYXNlIDU6CS8qIE1XQUlUIEM1ICovCisJCWRyaXZlcl9kYXRhID0gMHg0MDsKKwkJYnJlYWs7CisJY2FzZSA2OgkvKiBNV0FJVCBDNiAqLworCQlkcml2ZXJfZGF0YSA9IDB4NTI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRyaXZlcl9kYXRhID0gMHgwMDsKKwl9CisJcmV0dXJuIGRyaXZlcl9kYXRhOworfQorCiAvKioKICAqIGludGVsX2lkbGUKICAqIEBkZXY6IGNwdWlkbGVfZGV2aWNlCi0gKiBAc3RhdGU6IGNwdWlkbGUgc3RhdGUKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyCisgKiBAaW5kZXg6IGluZGV4IG9mIGNwdWlkbGUgc3RhdGUKICAqCiAgKi8KLXN0YXRpYyBpbnQgaW50ZWxfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKQorc3RhdGljIGludCBpbnRlbF9pZGxlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwgaW50IGluZGV4KQogewogCXVuc2lnbmVkIGxvbmcgZWN4ID0gMTsgLyogYnJlYWsgb24gaW50ZXJydXB0IGZsYWcgKi8KLQl1bnNpZ25lZCBsb25nIGVheCA9ICh1bnNpZ25lZCBsb25nKWNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZSk7CisJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlID0gJmRydi0+c3RhdGVzW2luZGV4XTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RhdGVfdXNhZ2UgPSAmZGV2LT5zdGF0ZXNfdXNhZ2VbaW5kZXhdOworCXVuc2lnbmVkIGxvbmcgZWF4ID0gKHVuc2lnbmVkIGxvbmcpY3B1aWRsZV9nZXRfc3RhdGVkYXRhKHN0YXRlX3VzYWdlKTsKIAl1bnNpZ25lZCBpbnQgY3N0YXRlOwogCWt0aW1lX3Qga3RfYmVmb3JlLCBrdF9hZnRlcjsKIAlzNjQgdXNlY19kZWx0YTsKQEAgLTI1Niw3ICsyODAsMTAgQEAKIAlpZiAoIShsYXBpY190aW1lcl9yZWxpYWJsZV9zdGF0ZXMgJiAoMSA8PCAoY3N0YXRlKSkpKQogCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRVhJVCwgJmNwdSk7CiAKLQlyZXR1cm4gdXNlY19kZWx0YTsKKwkvKiBVcGRhdGUgY3B1aWRsZSBjb3VudGVycyAqLworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSAoaW50KXVzZWNfZGVsdGE7CisKKwlyZXR1cm4gaW5kZXg7CiB9CiAKIHN0YXRpYyB2b2lkIF9fc2V0dXBfYnJvYWRjYXN0X3RpbWVyKHZvaWQgKmFyZykKQEAgLTM5Nyw2ICs0MjQsNjAgQEAKIAlyZXR1cm47CiB9CiAvKgorICogaW50ZWxfaWRsZV9jcHVpZGxlX2RyaXZlcl9pbml0KCkKKyAqIGFsbG9jYXRlLCBpbml0aWFsaXplIGNwdWlkbGVfc3RhdGVzCisgKi8KK3N0YXRpYyBpbnQgaW50ZWxfaWRsZV9jcHVpZGxlX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IGNzdGF0ZTsKKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiA9ICZpbnRlbF9pZGxlX2RyaXZlcjsKKworCWRydi0+c3RhdGVfY291bnQgPSAxOworCisJZm9yIChjc3RhdGUgPSAxOyBjc3RhdGUgPCBNV0FJVF9NQVhfTlVNX0NTVEFURVM7ICsrY3N0YXRlKSB7CisJCWludCBudW1fc3Vic3RhdGVzOworCisJCWlmIChjc3RhdGUgPiBtYXhfY3N0YXRlKSB7CisJCQlwcmludGsoUFJFRklYICJtYXhfY3N0YXRlICVkIHJlYWNoZWRcbiIsCisJCQkJbWF4X2NzdGF0ZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGRvZXMgdGhlIHN0YXRlIGV4aXN0IGluIENQVUlELk1XQUlUPyAqLworCQludW1fc3Vic3RhdGVzID0gKG13YWl0X3N1YnN0YXRlcyA+PiAoKGNzdGF0ZSkgKiA0KSkKKwkJCQkJJiBNV0FJVF9TVUJTVEFURV9NQVNLOworCQlpZiAobnVtX3N1YnN0YXRlcyA9PSAwKQorCQkJY29udGludWU7CisJCS8qIGlzIHRoZSBzdGF0ZSBub3QgZW5hYmxlZD8gKi8KKwkJaWYgKGNwdWlkbGVfc3RhdGVfdGFibGVbY3N0YXRlXS5lbnRlciA9PSBOVUxMKSB7CisJCQkvKiBkb2VzIHRoZSBkcml2ZXIgbm90IGtub3cgYWJvdXQgdGhlIHN0YXRlPyAqLworCQkJaWYgKCpjcHVpZGxlX3N0YXRlX3RhYmxlW2NzdGF0ZV0ubmFtZSA9PSAnXDAnKQorCQkJCXByX2RlYnVnKFBSRUZJWCAidW5hd2FyZSBvZiBtb2RlbCAweCV4IgorCQkJCQkiIE1XQUlUICVkIHBsZWFzZSIKKwkJCQkJIiBjb250YWN0IGxlbmJAa2VybmVsLm9yZyIsCisJCQkJYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwsIGNzdGF0ZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoY3N0YXRlID4gMikgJiYKKwkJCSFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfTk9OU1RPUF9UU0MpKQorCQkJbWFya190c2NfdW5zdGFibGUoIlRTQyBoYWx0cyBpbiBpZGxlIgorCQkJCQkiIHN0YXRlcyBkZWVwZXIgdGhhbiBDMiIpOworCisJCWRydi0+c3RhdGVzW2Rydi0+c3RhdGVfY291bnRdID0JLyogc3RydWN0dXJlIGNvcHkgKi8KKwkJCWNwdWlkbGVfc3RhdGVfdGFibGVbY3N0YXRlXTsKKworCQlkcnYtPnN0YXRlX2NvdW50ICs9IDE7CisJfQorCisJaWYgKGF1dG9fZGVtb3Rpb25fZGlzYWJsZV9mbGFncykKKwkJc21wX2NhbGxfZnVuY3Rpb24oYXV0b19kZW1vdGlvbl9kaXNhYmxlLCBOVUxMLCAxKTsKKworCXJldHVybiAwOworfQorCisKKy8qCiAgKiBpbnRlbF9pZGxlX2NwdWlkbGVfZGV2aWNlc19pbml0KCkKICAqIGFsbG9jYXRlLCBpbml0aWFsaXplLCByZWdpc3RlciBjcHVpZGxlX2RldmljZXMKICAqLwpAQCAtNDMwLDIyICs1MTEsMTEgQEAKIAkJCQljb250aW51ZTsKIAkJCS8qIGlzIHRoZSBzdGF0ZSBub3QgZW5hYmxlZD8gKi8KIAkJCWlmIChjcHVpZGxlX3N0YXRlX3RhYmxlW2NzdGF0ZV0uZW50ZXIgPT0gTlVMTCkgewotCQkJCS8qIGRvZXMgdGhlIGRyaXZlciBub3Qga25vdyBhYm91dCB0aGUgc3RhdGU/ICovCi0JCQkJaWYgKCpjcHVpZGxlX3N0YXRlX3RhYmxlW2NzdGF0ZV0ubmFtZSA9PSAnXDAnKQotCQkJCQlwcl9kZWJ1ZyhQUkVGSVggInVuYXdhcmUgb2YgbW9kZWwgMHgleCIKLQkJCQkJCSIgTVdBSVQgJWQgcGxlYXNlIgotCQkJCQkJIiBjb250YWN0IGxlbmJAa2VybmVsLm9yZyIsCi0JCQkJCWJvb3RfY3B1X2RhdGEueDg2X21vZGVsLCBjc3RhdGUpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlpZiAoKGNzdGF0ZSA+IDIpICYmCi0JCQkJIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9OT05TVE9QX1RTQykpCi0JCQkJbWFya190c2NfdW5zdGFibGUoIlRTQyBoYWx0cyBpbiBpZGxlIgotCQkJCQkiIHN0YXRlcyBkZWVwZXIgdGhhbiBDMiIpOwotCi0JCQlkZXYtPnN0YXRlc1tkZXYtPnN0YXRlX2NvdW50XSA9CS8qIHN0cnVjdHVyZSBjb3B5ICovCi0JCQkJY3B1aWRsZV9zdGF0ZV90YWJsZVtjc3RhdGVdOworCQkJZGV2LT5zdGF0ZXNfdXNhZ2VbZGV2LT5zdGF0ZV9jb3VudF0uZHJpdmVyX2RhdGEgPQorCQkJCSh2b2lkICopZ2V0X2RyaXZlcl9kYXRhKGNzdGF0ZSk7CiAKIAkJCWRldi0+c3RhdGVfY291bnQgKz0gMTsKIAkJfQpAQCAtNDU4LDggKzUyOCw2IEBACiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KLQlpZiAoYXV0b19kZW1vdGlvbl9kaXNhYmxlX2ZsYWdzKQotCQlzbXBfY2FsbF9mdW5jdGlvbihhdXRvX2RlbW90aW9uX2Rpc2FibGUsIE5VTEwsIDEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NzcsNiArNTQ1LDcgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCisJaW50ZWxfaWRsZV9jcHVpZGxlX2RyaXZlcl9pbml0KCk7CiAJcmV0dmFsID0gY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJmludGVsX2lkbGVfZHJpdmVyKTsKIAlpZiAocmV0dmFsKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAiaW50ZWxfaWRsZSB5aWVsZGluZyB0byAlcyIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKaW5kZXggMjM2YWQ5YS4uNjkxMjc2YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KICNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYwppbmRleCBmYzBmMmJkLi44YjcyZjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTg4OSw2ICs4OTAsOCBAQAogCQlicmVhazsKIAljYXNlIElCX0NNX0VTVEFCTElTSEVEOgogCQlzcGluX3VubG9ja19pcnEoJmNtX2lkX3ByaXYtPmxvY2spOworCQlpZiAoY21faWRfcHJpdi0+cXBfdHlwZSA9PSBJQl9RUFRfWFJDX1RHVCkKKwkJCWJyZWFrOwogCQlpYl9zZW5kX2NtX2RyZXEoY21faWQsIE5VTEwsIDApOwogCQlnb3RvIHJldGVzdDsKIAljYXNlIElCX0NNX0RSRVFfU0VOVDoKQEAgLTEwMDgsNyArMTAxMSw2IEBACiAJcmVxX21zZy0+c2VydmljZV9pZCA9IHBhcmFtLT5zZXJ2aWNlX2lkOwogCXJlcV9tc2ctPmxvY2FsX2NhX2d1aWQgPSBjbV9pZF9wcml2LT5pZC5kZXZpY2UtPm5vZGVfZ3VpZDsKIAljbV9yZXFfc2V0X2xvY2FsX3FwbihyZXFfbXNnLCBjcHVfdG9fYmUzMihwYXJhbS0+cXBfbnVtKSk7Ci0JY21fcmVxX3NldF9yZXNwX3JlcyhyZXFfbXNnLCBwYXJhbS0+cmVzcG9uZGVyX3Jlc291cmNlcyk7CiAJY21fcmVxX3NldF9pbml0X2RlcHRoKHJlcV9tc2csIHBhcmFtLT5pbml0aWF0b3JfZGVwdGgpOwogCWNtX3JlcV9zZXRfcmVtb3RlX3Jlc3BfdGltZW91dChyZXFfbXNnLAogCQkJCSAgICAgICBwYXJhbS0+cmVtb3RlX2NtX3Jlc3BvbnNlX3RpbWVvdXQpOwpAQCAtMTAxNywxMiArMTAxOSwxNiBAQAogCWNtX3JlcV9zZXRfc3RhcnRpbmdfcHNuKHJlcV9tc2csIGNwdV90b19iZTMyKHBhcmFtLT5zdGFydGluZ19wc24pKTsKIAljbV9yZXFfc2V0X2xvY2FsX3Jlc3BfdGltZW91dChyZXFfbXNnLAogCQkJCSAgICAgIHBhcmFtLT5sb2NhbF9jbV9yZXNwb25zZV90aW1lb3V0KTsKLQljbV9yZXFfc2V0X3JldHJ5X2NvdW50KHJlcV9tc2csIHBhcmFtLT5yZXRyeV9jb3VudCk7CiAJcmVxX21zZy0+cGtleSA9IHBhcmFtLT5wcmltYXJ5X3BhdGgtPnBrZXk7CiAJY21fcmVxX3NldF9wYXRoX210dShyZXFfbXNnLCBwYXJhbS0+cHJpbWFyeV9wYXRoLT5tdHUpOwotCWNtX3JlcV9zZXRfcm5yX3JldHJ5X2NvdW50KHJlcV9tc2csIHBhcmFtLT5ybnJfcmV0cnlfY291bnQpOwogCWNtX3JlcV9zZXRfbWF4X2NtX3JldHJpZXMocmVxX21zZywgcGFyYW0tPm1heF9jbV9yZXRyaWVzKTsKLQljbV9yZXFfc2V0X3NycShyZXFfbXNnLCBwYXJhbS0+c3JxKTsKKworCWlmIChwYXJhbS0+cXBfdHlwZSAhPSBJQl9RUFRfWFJDX0lOSSkgeworCQljbV9yZXFfc2V0X3Jlc3BfcmVzKHJlcV9tc2csIHBhcmFtLT5yZXNwb25kZXJfcmVzb3VyY2VzKTsKKwkJY21fcmVxX3NldF9yZXRyeV9jb3VudChyZXFfbXNnLCBwYXJhbS0+cmV0cnlfY291bnQpOworCQljbV9yZXFfc2V0X3Jucl9yZXRyeV9jb3VudChyZXFfbXNnLCBwYXJhbS0+cm5yX3JldHJ5X2NvdW50KTsKKwkJY21fcmVxX3NldF9zcnEocmVxX21zZywgcGFyYW0tPnNycSk7CisJfQogCiAJaWYgKHByaV9wYXRoLT5ob3BfbGltaXQgPD0gMSkgewogCQlyZXFfbXNnLT5wcmltYXJ5X2xvY2FsX2xpZCA9IHByaV9wYXRoLT5zbGlkOwpAQCAtMTA4MCw3ICsxMDg2LDggQEAKIAlpZiAoIXBhcmFtLT5wcmltYXJ5X3BhdGgpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHBhcmFtLT5xcF90eXBlICE9IElCX1FQVF9SQyAmJiBwYXJhbS0+cXBfdHlwZSAhPSBJQl9RUFRfVUMpCisJaWYgKHBhcmFtLT5xcF90eXBlICE9IElCX1FQVF9SQyAmJiBwYXJhbS0+cXBfdHlwZSAhPSBJQl9RUFRfVUMgJiYKKwkgICAgcGFyYW0tPnFwX3R5cGUgIT0gSUJfUVBUX1hSQ19JTkkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHBhcmFtLT5wcml2YXRlX2RhdGEgJiYKQEAgLTE2MDEsMTggKzE2MDgsMjQgQEAKIAljbV9mb3JtYXRfbWFkX2hkcigmcmVwX21zZy0+aGRyLCBDTV9SRVBfQVRUUl9JRCwgY21faWRfcHJpdi0+dGlkKTsKIAlyZXBfbXNnLT5sb2NhbF9jb21tX2lkID0gY21faWRfcHJpdi0+aWQubG9jYWxfaWQ7CiAJcmVwX21zZy0+cmVtb3RlX2NvbW1faWQgPSBjbV9pZF9wcml2LT5pZC5yZW1vdGVfaWQ7Ci0JY21fcmVwX3NldF9sb2NhbF9xcG4ocmVwX21zZywgY3B1X3RvX2JlMzIocGFyYW0tPnFwX251bSkpOwogCWNtX3JlcF9zZXRfc3RhcnRpbmdfcHNuKHJlcF9tc2csIGNwdV90b19iZTMyKHBhcmFtLT5zdGFydGluZ19wc24pKTsKIAlyZXBfbXNnLT5yZXNwX3Jlc291cmNlcyA9IHBhcmFtLT5yZXNwb25kZXJfcmVzb3VyY2VzOwotCXJlcF9tc2ctPmluaXRpYXRvcl9kZXB0aCA9IHBhcmFtLT5pbml0aWF0b3JfZGVwdGg7CiAJY21fcmVwX3NldF90YXJnZXRfYWNrX2RlbGF5KHJlcF9tc2csCiAJCQkJICAgIGNtX2lkX3ByaXYtPmF2LnBvcnQtPmNtX2Rldi0+YWNrX2RlbGF5KTsKIAljbV9yZXBfc2V0X2ZhaWxvdmVyKHJlcF9tc2csIHBhcmFtLT5mYWlsb3Zlcl9hY2NlcHRlZCk7Ci0JY21fcmVwX3NldF9mbG93X2N0cmwocmVwX21zZywgcGFyYW0tPmZsb3dfY29udHJvbCk7CiAJY21fcmVwX3NldF9ybnJfcmV0cnlfY291bnQocmVwX21zZywgcGFyYW0tPnJucl9yZXRyeV9jb3VudCk7Ci0JY21fcmVwX3NldF9zcnEocmVwX21zZywgcGFyYW0tPnNycSk7CiAJcmVwX21zZy0+bG9jYWxfY2FfZ3VpZCA9IGNtX2lkX3ByaXYtPmlkLmRldmljZS0+bm9kZV9ndWlkOwogCisJaWYgKGNtX2lkX3ByaXYtPnFwX3R5cGUgIT0gSUJfUVBUX1hSQ19UR1QpIHsKKwkJcmVwX21zZy0+aW5pdGlhdG9yX2RlcHRoID0gcGFyYW0tPmluaXRpYXRvcl9kZXB0aDsKKwkJY21fcmVwX3NldF9mbG93X2N0cmwocmVwX21zZywgcGFyYW0tPmZsb3dfY29udHJvbCk7CisJCWNtX3JlcF9zZXRfc3JxKHJlcF9tc2csIHBhcmFtLT5zcnEpOworCQljbV9yZXBfc2V0X2xvY2FsX3FwbihyZXBfbXNnLCBjcHVfdG9fYmUzMihwYXJhbS0+cXBfbnVtKSk7CisJfSBlbHNlIHsKKwkJY21fcmVwX3NldF9zcnEocmVwX21zZywgMSk7CisJCWNtX3JlcF9zZXRfbG9jYWxfZWVjbihyZXBfbXNnLCBjcHVfdG9fYmUzMihwYXJhbS0+cXBfbnVtKSk7CisJfQorCiAJaWYgKHBhcmFtLT5wcml2YXRlX2RhdGEgJiYgcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4pCiAJCW1lbWNweShyZXBfbXNnLT5wcml2YXRlX2RhdGEsIHBhcmFtLT5wcml2YXRlX2RhdGEsCiAJCSAgICAgICBwYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbik7CkBAIC0xNjYwLDcgKzE2NzMsNyBAQAogCWNtX2lkX3ByaXYtPmluaXRpYXRvcl9kZXB0aCA9IHBhcmFtLT5pbml0aWF0b3JfZGVwdGg7CiAJY21faWRfcHJpdi0+cmVzcG9uZGVyX3Jlc291cmNlcyA9IHBhcmFtLT5yZXNwb25kZXJfcmVzb3VyY2VzOwogCWNtX2lkX3ByaXYtPnJxX3BzbiA9IGNtX3JlcF9nZXRfc3RhcnRpbmdfcHNuKHJlcF9tc2cpOwotCWNtX2lkX3ByaXYtPmxvY2FsX3FwbiA9IGNtX3JlcF9nZXRfbG9jYWxfcXBuKHJlcF9tc2cpOworCWNtX2lkX3ByaXYtPmxvY2FsX3FwbiA9IGNwdV90b19iZTMyKHBhcmFtLT5xcF9udW0gJiAweEZGRkZGRik7CiAKIG91dDoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CkBAIC0xNzMxLDcgKzE3NDQsNyBAQAogfQogRVhQT1JUX1NZTUJPTChpYl9zZW5kX2NtX3J0dSk7CiAKLXN0YXRpYyB2b2lkIGNtX2Zvcm1hdF9yZXBfZXZlbnQoc3RydWN0IGNtX3dvcmsgKndvcmspCitzdGF0aWMgdm9pZCBjbV9mb3JtYXRfcmVwX2V2ZW50KHN0cnVjdCBjbV93b3JrICp3b3JrLCBlbnVtIGliX3FwX3R5cGUgcXBfdHlwZSkKIHsKIAlzdHJ1Y3QgY21fcmVwX21zZyAqcmVwX21zZzsKIAlzdHJ1Y3QgaWJfY21fcmVwX2V2ZW50X3BhcmFtICpwYXJhbTsKQEAgLTE3NDAsNyArMTc1Myw3IEBACiAJcGFyYW0gPSAmd29yay0+Y21fZXZlbnQucGFyYW0ucmVwX3JjdmQ7CiAJcGFyYW0tPnJlbW90ZV9jYV9ndWlkID0gcmVwX21zZy0+bG9jYWxfY2FfZ3VpZDsKIAlwYXJhbS0+cmVtb3RlX3FrZXkgPSBiZTMyX3RvX2NwdShyZXBfbXNnLT5sb2NhbF9xa2V5KTsKLQlwYXJhbS0+cmVtb3RlX3FwbiA9IGJlMzJfdG9fY3B1KGNtX3JlcF9nZXRfbG9jYWxfcXBuKHJlcF9tc2cpKTsKKwlwYXJhbS0+cmVtb3RlX3FwbiA9IGJlMzJfdG9fY3B1KGNtX3JlcF9nZXRfcXBuKHJlcF9tc2csIHFwX3R5cGUpKTsKIAlwYXJhbS0+c3RhcnRpbmdfcHNuID0gYmUzMl90b19jcHUoY21fcmVwX2dldF9zdGFydGluZ19wc24ocmVwX21zZykpOwogCXBhcmFtLT5yZXNwb25kZXJfcmVzb3VyY2VzID0gcmVwX21zZy0+aW5pdGlhdG9yX2RlcHRoOwogCXBhcmFtLT5pbml0aWF0b3JfZGVwdGggPSByZXBfbXNnLT5yZXNwX3Jlc291cmNlczsKQEAgLTE4MDgsNyArMTgyMSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWNtX2Zvcm1hdF9yZXBfZXZlbnQod29yayk7CisJY21fZm9ybWF0X3JlcF9ldmVudCh3b3JrLCBjbV9pZF9wcml2LT5xcF90eXBlKTsKIAogCXNwaW5fbG9ja19pcnEoJmNtX2lkX3ByaXYtPmxvY2spOwogCXN3aXRjaCAoY21faWRfcHJpdi0+aWQuc3RhdGUpIHsKQEAgLTE4MjMsNyArMTgzNiw3IEBACiAKIAljbV9pZF9wcml2LT50aW1ld2FpdF9pbmZvLT53b3JrLnJlbW90ZV9pZCA9IHJlcF9tc2ctPmxvY2FsX2NvbW1faWQ7CiAJY21faWRfcHJpdi0+dGltZXdhaXRfaW5mby0+cmVtb3RlX2NhX2d1aWQgPSByZXBfbXNnLT5sb2NhbF9jYV9ndWlkOwotCWNtX2lkX3ByaXYtPnRpbWV3YWl0X2luZm8tPnJlbW90ZV9xcG4gPSBjbV9yZXBfZ2V0X2xvY2FsX3FwbihyZXBfbXNnKTsKKwljbV9pZF9wcml2LT50aW1ld2FpdF9pbmZvLT5yZW1vdGVfcXBuID0gY21fcmVwX2dldF9xcG4ocmVwX21zZywgY21faWRfcHJpdi0+cXBfdHlwZSk7CiAKIAlzcGluX2xvY2soJmNtLmxvY2spOwogCS8qIENoZWNrIGZvciBkdXBsaWNhdGUgUkVQLiAqLwpAQCAtMTg1MCw3ICsxODYzLDcgQEAKIAogCWNtX2lkX3ByaXYtPmlkLnN0YXRlID0gSUJfQ01fUkVQX1JDVkQ7CiAJY21faWRfcHJpdi0+aWQucmVtb3RlX2lkID0gcmVwX21zZy0+bG9jYWxfY29tbV9pZDsKLQljbV9pZF9wcml2LT5yZW1vdGVfcXBuID0gY21fcmVwX2dldF9sb2NhbF9xcG4ocmVwX21zZyk7CisJY21faWRfcHJpdi0+cmVtb3RlX3FwbiA9IGNtX3JlcF9nZXRfcXBuKHJlcF9tc2csIGNtX2lkX3ByaXYtPnFwX3R5cGUpOwogCWNtX2lkX3ByaXYtPmluaXRpYXRvcl9kZXB0aCA9IHJlcF9tc2ctPnJlc3BfcmVzb3VyY2VzOwogCWNtX2lkX3ByaXYtPnJlc3BvbmRlcl9yZXNvdXJjZXMgPSByZXBfbXNnLT5pbml0aWF0b3JfZGVwdGg7CiAJY21faWRfcHJpdi0+c3FfcHNuID0gY21fcmVwX2dldF9zdGFydGluZ19wc24ocmVwX21zZyk7CkBAIC0zNDkyLDcgKzM1MDUsOCBAQAogCQlxcF9hdHRyLT5wYXRoX210dSA9IGNtX2lkX3ByaXYtPnBhdGhfbXR1OwogCQlxcF9hdHRyLT5kZXN0X3FwX251bSA9IGJlMzJfdG9fY3B1KGNtX2lkX3ByaXYtPnJlbW90ZV9xcG4pOwogCQlxcF9hdHRyLT5ycV9wc24gPSBiZTMyX3RvX2NwdShjbV9pZF9wcml2LT5ycV9wc24pOwotCQlpZiAoY21faWRfcHJpdi0+cXBfdHlwZSA9PSBJQl9RUFRfUkMpIHsKKwkJaWYgKGNtX2lkX3ByaXYtPnFwX3R5cGUgPT0gSUJfUVBUX1JDIHx8CisJCSAgICBjbV9pZF9wcml2LT5xcF90eXBlID09IElCX1FQVF9YUkNfVEdUKSB7CiAJCQkqcXBfYXR0cl9tYXNrIHw9IElCX1FQX01BWF9ERVNUX1JEX0FUT01JQyB8CiAJCQkJCSBJQl9RUF9NSU5fUk5SX1RJTUVSOwogCQkJcXBfYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljID0KQEAgLTM1MzcsMTUgKzM1NTEsMjEgQEAKIAkJaWYgKGNtX2lkX3ByaXYtPmlkLmxhcF9zdGF0ZSA9PSBJQl9DTV9MQVBfVU5JTklUKSB7CiAJCQkqcXBfYXR0cl9tYXNrID0gSUJfUVBfU1RBVEUgfCBJQl9RUF9TUV9QU047CiAJCQlxcF9hdHRyLT5zcV9wc24gPSBiZTMyX3RvX2NwdShjbV9pZF9wcml2LT5zcV9wc24pOwotCQkJaWYgKGNtX2lkX3ByaXYtPnFwX3R5cGUgPT0gSUJfUVBUX1JDKSB7Ci0JCQkJKnFwX2F0dHJfbWFzayB8PSBJQl9RUF9USU1FT1VUIHwgSUJfUVBfUkVUUllfQ05UIHwKLQkJCQkJCSBJQl9RUF9STlJfUkVUUlkgfAorCQkJc3dpdGNoIChjbV9pZF9wcml2LT5xcF90eXBlKSB7CisJCQljYXNlIElCX1FQVF9SQzoKKwkJCWNhc2UgSUJfUVBUX1hSQ19JTkk6CisJCQkJKnFwX2F0dHJfbWFzayB8PSBJQl9RUF9SRVRSWV9DTlQgfCBJQl9RUF9STlJfUkVUUlkgfAogCQkJCQkJIElCX1FQX01BWF9RUF9SRF9BVE9NSUM7Ci0JCQkJcXBfYXR0ci0+dGltZW91dCA9IGNtX2lkX3ByaXYtPmF2LnRpbWVvdXQ7CiAJCQkJcXBfYXR0ci0+cmV0cnlfY250ID0gY21faWRfcHJpdi0+cmV0cnlfY291bnQ7CiAJCQkJcXBfYXR0ci0+cm5yX3JldHJ5ID0gY21faWRfcHJpdi0+cm5yX3JldHJ5X2NvdW50OwotCQkJCXFwX2F0dHItPm1heF9yZF9hdG9taWMgPQotCQkJCQljbV9pZF9wcml2LT5pbml0aWF0b3JfZGVwdGg7CisJCQkJcXBfYXR0ci0+bWF4X3JkX2F0b21pYyA9IGNtX2lkX3ByaXYtPmluaXRpYXRvcl9kZXB0aDsKKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCWNhc2UgSUJfUVBUX1hSQ19UR1Q6CisJCQkJKnFwX2F0dHJfbWFzayB8PSBJQl9RUF9USU1FT1VUOworCQkJCXFwX2F0dHItPnRpbWVvdXQgPSBjbV9pZF9wcml2LT5hdi50aW1lb3V0OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChjbV9pZF9wcml2LT5hbHRfYXYuYWhfYXR0ci5kbGlkKSB7CiAJCQkJKnFwX2F0dHJfbWFzayB8PSBJQl9RUF9QQVRIX01JR19TVEFURTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtX21zZ3MuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtX21zZ3MuaAppbmRleCA3ZTYzYzA4Li41MDVkYjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbV9tc2dzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21fbXNncy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDA0IFRvcHNwaW4gQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDA0IFZvbHRhaXJlIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC04Niw3ICs4Niw3IEBACiAJX19iZTE2IHBrZXk7CiAJLyogcGF0aCBNVFU6NCwgUkRDIGV4aXN0czoxLCBSTlIgcmV0cnkgY291bnQ6My4gKi8KIAl1OCBvZmZzZXQ1MDsKLQkvKiBtYXggQ00gUmV0cmllczo0LCBTUlE6MSwgcnN2ZDozICovCisJLyogbWF4IENNIFJldHJpZXM6NCwgU1JROjEsIGV4dGVuZGVkIHRyYW5zcG9ydCB0eXBlOjMgKi8KIAl1OCBvZmZzZXQ1MTsKIAogCV9fYmUxNiBwcmltYXJ5X2xvY2FsX2xpZDsKQEAgLTE3NSw2ICsxNzUsMTEgQEAKIAlzd2l0Y2godHJhbnNwb3J0X3R5cGUpIHsKIAljYXNlIDA6IHJldHVybiBJQl9RUFRfUkM7CiAJY2FzZSAxOiByZXR1cm4gSUJfUVBUX1VDOworCWNhc2UgMzoKKwkJc3dpdGNoIChyZXFfbXNnLT5vZmZzZXQ1MSAmIDB4NykgeworCQljYXNlIDE6IHJldHVybiBJQl9RUFRfWFJDX1RHVDsKKwkJZGVmYXVsdDogcmV0dXJuIDA7CisJCX0KIAlkZWZhdWx0OiByZXR1cm4gMDsKIAl9CiB9CkBAIC0xODgsNiArMTkzLDEyIEBACiAJCQkJCQkgIHJlcV9tc2ctPm9mZnNldDQwKSAmCiAJCQkJCQkgICAweEZGRkZGRkY5KSB8IDB4Mik7CiAJCWJyZWFrOworCWNhc2UgSUJfUVBUX1hSQ19JTkk6CisJCXJlcV9tc2ctPm9mZnNldDQwID0gY3B1X3RvX2JlMzIoKGJlMzJfdG9fY3B1KAorCQkJCQkJIHJlcV9tc2ctPm9mZnNldDQwKSAmCisJCQkJCQkgICAweEZGRkZGRkY5KSB8IDB4Nik7CisJCXJlcV9tc2ctPm9mZnNldDUxID0gKHJlcV9tc2ctPm9mZnNldDUxICYgMHhGOCkgfCAxOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXFfbXNnLT5vZmZzZXQ0MCA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KAogCQkJCQkJIHJlcV9tc2ctPm9mZnNldDQwKSAmCkBAIC01MjcsNiArNTM4LDIzIEBACiAJCQkgICAgKGJlMzJfdG9fY3B1KHJlcF9tc2ctPm9mZnNldDEyKSAmIDB4MDAwMDAwRkYpKTsKIH0KIAorc3RhdGljIGlubGluZSBfX2JlMzIgY21fcmVwX2dldF9sb2NhbF9lZWNuKHN0cnVjdCBjbV9yZXBfbXNnICpyZXBfbXNnKQoreworCXJldHVybiBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdShyZXBfbXNnLT5vZmZzZXQxNikgPj4gOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbV9yZXBfc2V0X2xvY2FsX2VlY24oc3RydWN0IGNtX3JlcF9tc2cgKnJlcF9tc2csIF9fYmUzMiBlZWNuKQoreworCXJlcF9tc2ctPm9mZnNldDE2ID0gY3B1X3RvX2JlMzIoKGJlMzJfdG9fY3B1KGVlY24pIDw8IDgpIHwKKwkJCSAgICAoYmUzMl90b19jcHUocmVwX21zZy0+b2Zmc2V0MTYpICYgMHgwMDAwMDBGRikpOworfQorCitzdGF0aWMgaW5saW5lIF9fYmUzMiBjbV9yZXBfZ2V0X3FwbihzdHJ1Y3QgY21fcmVwX21zZyAqcmVwX21zZywgZW51bSBpYl9xcF90eXBlIHFwX3R5cGUpCit7CisJcmV0dXJuIChxcF90eXBlID09IElCX1FQVF9YUkNfSU5JKSA/CisJCWNtX3JlcF9nZXRfbG9jYWxfZWVjbihyZXBfbXNnKSA6IGNtX3JlcF9nZXRfbG9jYWxfcXBuKHJlcF9tc2cpOworfQorCiBzdGF0aWMgaW5saW5lIF9fYmUzMiBjbV9yZXBfZ2V0X3N0YXJ0aW5nX3BzbihzdHJ1Y3QgY21fcmVwX21zZyAqcmVwX21zZykKIHsKIAlyZXR1cm4gY3B1X3RvX2JlMzIoYmUzMl90b19jcHUocmVwX21zZy0+b2Zmc2V0MjApID4+IDgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYwppbmRleCBjYTRjNWRjLi43NWZmODIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KQEAgLTgxLDYgKzgyLDcgQEAKIHN0YXRpYyBERUZJTkVfSURSKHRjcF9wcyk7CiBzdGF0aWMgREVGSU5FX0lEUih1ZHBfcHMpOwogc3RhdGljIERFRklORV9JRFIoaXBvaWJfcHMpOworc3RhdGljIERFRklORV9JRFIoaWJfcHMpOwogCiBzdHJ1Y3QgY21hX2RldmljZSB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwpAQCAtMTE3OSw2ICsxMTgxLDE1IEBACiAJZXZlbnQtPnBhcmFtLmNvbm4ucXBfbnVtID0gcmVxX2RhdGEtPnJlbW90ZV9xcG47CiB9CiAKK3N0YXRpYyBpbnQgY21hX2NoZWNrX3JlcV9xcF90eXBlKHN0cnVjdCByZG1hX2NtX2lkICppZCwgc3RydWN0IGliX2NtX2V2ZW50ICppYl9ldmVudCkKK3sKKwlyZXR1cm4gKCgoaWJfZXZlbnQtPmV2ZW50ID09IElCX0NNX1JFUV9SRUNFSVZFRCkgfHwKKwkJIChpYl9ldmVudC0+cGFyYW0ucmVxX3JjdmQucXBfdHlwZSA9PSBpZC0+cXBfdHlwZSkpIHx8CisJCSgoaWJfZXZlbnQtPmV2ZW50ID09IElCX0NNX1NJRFJfUkVRX1JFQ0VJVkVEKSAmJgorCQkgKGlkLT5xcF90eXBlID09IElCX1FQVF9VRCkpIHx8CisJCSghaWQtPnFwX3R5cGUpKTsKK30KKwogc3RhdGljIGludCBjbWFfcmVxX2hhbmRsZXIoc3RydWN0IGliX2NtX2lkICpjbV9pZCwgc3RydWN0IGliX2NtX2V2ZW50ICppYl9ldmVudCkKIHsKIAlzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICpsaXN0ZW5faWQsICpjb25uX2lkOwpAQCAtMTE4NiwxMyArMTE5NywxNiBAQAogCWludCBvZmZzZXQsIHJldDsKIAogCWxpc3Rlbl9pZCA9IGNtX2lkLT5jb250ZXh0OworCWlmICghY21hX2NoZWNrX3JlcV9xcF90eXBlKCZsaXN0ZW5faWQtPmlkLCBpYl9ldmVudCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGNtYV9kaXNhYmxlX2NhbGxiYWNrKGxpc3Rlbl9pZCwgUkRNQV9DTV9MSVNURU4pKQogCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKIAogCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZiBldmVudCk7CiAJb2Zmc2V0ID0gY21hX3VzZXJfZGF0YV9vZmZzZXQobGlzdGVuX2lkLT5pZC5wcyk7CiAJZXZlbnQuZXZlbnQgPSBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVDsKLQlpZiAobGlzdGVuX2lkLT5pZC5xcF90eXBlID09IElCX1FQVF9VRCkgeworCWlmIChpYl9ldmVudC0+ZXZlbnQgPT0gSUJfQ01fU0lEUl9SRVFfUkVDRUlWRUQpIHsKIAkJY29ubl9pZCA9IGNtYV9uZXdfdWRwX2lkKCZsaXN0ZW5faWQtPmlkLCBpYl9ldmVudCk7CiAJCWV2ZW50LnBhcmFtLnVkLnByaXZhdGVfZGF0YSA9IGliX2V2ZW50LT5wcml2YXRlX2RhdGEgKyBvZmZzZXQ7CiAJCWV2ZW50LnBhcmFtLnVkLnByaXZhdGVfZGF0YV9sZW4gPQpAQCAtMTMyOCw2ICsxMzQyLDggQEAKIAkJc3dpdGNoIChpd19ldmVudC0+c3RhdHVzKSB7CiAJCWNhc2UgMDoKIAkJCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9FU1RBQkxJU0hFRDsKKwkJCWV2ZW50LnBhcmFtLmNvbm4uaW5pdGlhdG9yX2RlcHRoID0gaXdfZXZlbnQtPmlyZDsKKwkJCWV2ZW50LnBhcmFtLmNvbm4ucmVzcG9uZGVyX3Jlc291cmNlcyA9IGl3X2V2ZW50LT5vcmQ7CiAJCQlicmVhazsKIAkJY2FzZSAtRUNPTk5SRVNFVDoKIAkJY2FzZSAtRUNPTk5SRUZVU0VEOgpAQCAtMTM0Myw2ICsxMzU5LDggQEAKIAkJYnJlYWs7CiAJY2FzZSBJV19DTV9FVkVOVF9FU1RBQkxJU0hFRDoKIAkJZXZlbnQuZXZlbnQgPSBSRE1BX0NNX0VWRU5UX0VTVEFCTElTSEVEOworCQlldmVudC5wYXJhbS5jb25uLmluaXRpYXRvcl9kZXB0aCA9IGl3X2V2ZW50LT5pcmQ7CisJCWV2ZW50LnBhcmFtLmNvbm4ucmVzcG9uZGVyX3Jlc291cmNlcyA9IGl3X2V2ZW50LT5vcmQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVR19PTigxKTsKQEAgLTE0MzMsOCArMTQ1MSw4IEBACiAJZXZlbnQuZXZlbnQgPSBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVDsKIAlldmVudC5wYXJhbS5jb25uLnByaXZhdGVfZGF0YSA9IGl3X2V2ZW50LT5wcml2YXRlX2RhdGE7CiAJZXZlbnQucGFyYW0uY29ubi5wcml2YXRlX2RhdGFfbGVuID0gaXdfZXZlbnQtPnByaXZhdGVfZGF0YV9sZW47Ci0JZXZlbnQucGFyYW0uY29ubi5pbml0aWF0b3JfZGVwdGggPSBhdHRyLm1heF9xcF9pbml0X3JkX2F0b207Ci0JZXZlbnQucGFyYW0uY29ubi5yZXNwb25kZXJfcmVzb3VyY2VzID0gYXR0ci5tYXhfcXBfcmRfYXRvbTsKKwlldmVudC5wYXJhbS5jb25uLmluaXRpYXRvcl9kZXB0aCA9IGl3X2V2ZW50LT5pcmQ7CisJZXZlbnQucGFyYW0uY29ubi5yZXNwb25kZXJfcmVzb3VyY2VzID0gaXdfZXZlbnQtPm9yZDsKIAogCS8qCiAJICogUHJvdGVjdCBhZ2FpbnN0IHRoZSB1c2VyIGRlc3Ryb3lpbmcgY29ubl9pZCBmcm9tIGFub3RoZXIgdGhyZWFkCkBAIC0yMjM0LDYgKzIyNTIsOSBAQAogCWNhc2UgUkRNQV9QU19JUE9JQjoKIAkJcHMgPSAmaXBvaWJfcHM7CiAJCWJyZWFrOworCWNhc2UgUkRNQV9QU19JQjoKKwkJcHMgPSAmaWJfcHM7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCX0KQEAgLTI1NjksNyArMjU5MCw3IEBACiAJcmVxLnNlcnZpY2VfaWQgPSBjbWFfZ2V0X3NlcnZpY2VfaWQoaWRfcHJpdi0+aWQucHMsCiAJCQkJCSAgICAoc3RydWN0IHNvY2thZGRyICopICZyb3V0ZS0+YWRkci5kc3RfYWRkcik7CiAJcmVxLnFwX251bSA9IGlkX3ByaXYtPnFwX251bTsKLQlyZXEucXBfdHlwZSA9IElCX1FQVF9SQzsKKwlyZXEucXBfdHlwZSA9IGlkX3ByaXYtPmlkLnFwX3R5cGU7CiAJcmVxLnN0YXJ0aW5nX3BzbiA9IGlkX3ByaXYtPnNlcV9udW07CiAJcmVxLnJlc3BvbmRlcl9yZXNvdXJjZXMgPSBjb25uX3BhcmFtLT5yZXNwb25kZXJfcmVzb3VyY2VzOwogCXJlcS5pbml0aWF0b3JfZGVwdGggPSBjb25uX3BhcmFtLT5pbml0aWF0b3JfZGVwdGg7CkBAIC0yNjE2LDE0ICsyNjM3LDE2IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQlpd19wYXJhbS5vcmQgPSBjb25uX3BhcmFtLT5pbml0aWF0b3JfZGVwdGg7Ci0JaXdfcGFyYW0uaXJkID0gY29ubl9wYXJhbS0+cmVzcG9uZGVyX3Jlc291cmNlczsKLQlpd19wYXJhbS5wcml2YXRlX2RhdGEgPSBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGE7Ci0JaXdfcGFyYW0ucHJpdmF0ZV9kYXRhX2xlbiA9IGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW47Ci0JaWYgKGlkX3ByaXYtPmlkLnFwKQorCWlmIChjb25uX3BhcmFtKSB7CisJCWl3X3BhcmFtLm9yZCA9IGNvbm5fcGFyYW0tPmluaXRpYXRvcl9kZXB0aDsKKwkJaXdfcGFyYW0uaXJkID0gY29ubl9wYXJhbS0+cmVzcG9uZGVyX3Jlc291cmNlczsKKwkJaXdfcGFyYW0ucHJpdmF0ZV9kYXRhID0gY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhOworCQlpd19wYXJhbS5wcml2YXRlX2RhdGFfbGVuID0gY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbjsKKwkJaXdfcGFyYW0ucXBuID0gaWRfcHJpdi0+aWQucXAgPyBpZF9wcml2LT5xcF9udW0gOiBjb25uX3BhcmFtLT5xcF9udW07CisJfSBlbHNlIHsKKwkJbWVtc2V0KCZpd19wYXJhbSwgMCwgc2l6ZW9mIGl3X3BhcmFtKTsKIAkJaXdfcGFyYW0ucXBuID0gaWRfcHJpdi0+cXBfbnVtOwotCWVsc2UKLQkJaXdfcGFyYW0ucXBuID0gY29ubl9wYXJhbS0+cXBfbnVtOworCX0KIAlyZXQgPSBpd19jbV9jb25uZWN0KGNtX2lkLCAmaXdfcGFyYW0pOwogb3V0OgogCWlmIChyZXQpIHsKQEAgLTI3NjUsMTQgKzI3ODgsMjAgQEAKIAogCXN3aXRjaCAocmRtYV9ub2RlX2dldF90cmFuc3BvcnQoaWQtPmRldmljZS0+bm9kZV90eXBlKSkgewogCWNhc2UgUkRNQV9UUkFOU1BPUlRfSUI6Ci0JCWlmIChpZC0+cXBfdHlwZSA9PSBJQl9RUFRfVUQpCi0JCQlyZXQgPSBjbWFfc2VuZF9zaWRyX3JlcChpZF9wcml2LCBJQl9TSURSX1NVQ0NFU1MsCi0JCQkJCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGEsCi0JCQkJCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKLQkJZWxzZSBpZiAoY29ubl9wYXJhbSkKLQkJCXJldCA9IGNtYV9hY2NlcHRfaWIoaWRfcHJpdiwgY29ubl9wYXJhbSk7Ci0JCWVsc2UKLQkJCXJldCA9IGNtYV9yZXBfcmVjdihpZF9wcml2KTsKKwkJaWYgKGlkLT5xcF90eXBlID09IElCX1FQVF9VRCkgeworCQkJaWYgKGNvbm5fcGFyYW0pCisJCQkJcmV0ID0gY21hX3NlbmRfc2lkcl9yZXAoaWRfcHJpdiwgSUJfU0lEUl9TVUNDRVNTLAorCQkJCQkJCWNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YSwKKwkJCQkJCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBjbWFfc2VuZF9zaWRyX3JlcChpZF9wcml2LCBJQl9TSURSX1NVQ0NFU1MsCisJCQkJCQkJTlVMTCwgMCk7CisJCX0gZWxzZSB7CisJCQlpZiAoY29ubl9wYXJhbSkKKwkJCQlyZXQgPSBjbWFfYWNjZXB0X2liKGlkX3ByaXYsIGNvbm5fcGFyYW0pOworCQkJZWxzZQorCQkJCXJldCA9IGNtYV9yZXBfcmVjdihpZF9wcml2KTsKKwkJfQogCQlicmVhazsKIAljYXNlIFJETUFfVFJBTlNQT1JUX0lXQVJQOgogCQlyZXQgPSBjbWFfYWNjZXB0X2l3KGlkX3ByaXYsIGNvbm5fcGFyYW0pOwpAQCAtMzQ2MCw2ICszNDg5LDcgQEAKIAlpZHJfZGVzdHJveSgmdGNwX3BzKTsKIAlpZHJfZGVzdHJveSgmdWRwX3BzKTsKIAlpZHJfZGVzdHJveSgmaXBvaWJfcHMpOworCWlkcl9kZXN0cm95KCZpYl9wcyk7CiB9CiAKIG1vZHVsZV9pbml0KGNtYV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2Ztcl9wb29sLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9mbXJfcG9vbC5jCmluZGV4IDQ1MDcwNDMuLjE3NmM4ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2Ztcl9wb29sLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZm1yX3Bvb2wuYwpAQCAtMzMsNiArMzMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2l3Y20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2l3Y20uYwppbmRleCBhOWMwNDIzLi4xYTY5NmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9pd2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvaXdjbS5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHJkbWEvaXdfY20uaD4KICNpbmNsdWRlIDxyZG1hL2liX2FkZHIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkLmMKaW5kZXggYjRkODY3Mi4uMmZlNDI4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkLmMKQEAgLTM1LDYgKzM1LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHJkbWEvaWJfY2FjaGUuaD4KIAogI2luY2x1ZGUgIm1hZF9wcml2LmgiCkBAIC0xNTk2LDYgKzE1OTcsOSBAQAogCQkJCQltYWQtPm1hZF9oZHIuY2xhc3NfdmVyc2lvbl0uY2xhc3M7CiAJCQlpZiAoIWNsYXNzKQogCQkJCWdvdG8gb3V0OworCQkJaWYgKGNvbnZlcnRfbWdtdF9jbGFzcyhtYWQtPm1hZF9oZHIubWdtdF9jbGFzcykgPj0KKwkJCSAgICBJQl9NR01UX01BWF9NRVRIT0RTKQorCQkJCWdvdG8gb3V0OwogCQkJbWV0aG9kID0gY2xhc3MtPm1ldGhvZF90YWJsZVtjb252ZXJ0X21nbXRfY2xhc3MoCiAJCQkJCQkJbWFkLT5tYWRfaGRyLm1nbXRfY2xhc3MpXTsKIAkJCWlmIChtZXRob2QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL211bHRpY2FzdC5jCmluZGV4IDY4YjQxNjIuLmQyMzYwYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL211bHRpY2FzdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL211bHRpY2FzdC5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9uZXRsaW5rLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9uZXRsaW5rLmMKaW5kZXggOTIyN2Y0YS4uZDFjODE5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbmV0bGluay5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL25ldGxpbmsuYwpAQCAtMzIsNiArMzIsNyBAQAogCiAjZGVmaW5lIHByX2ZtdChmbXQpICIlczolczogIiBmbXQsIEtCVUlMRF9NT0ROQU1FLCBfX2Z1bmNfXwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9wYWNrZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3BhY2tlci5jCmluZGV4IDAxOWJkNGIuLjFiNjU5ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3BhY2tlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3BhY2tlci5jCkBAIC0zMSw2ICszMSw3IEBACiAgKiBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCmluZGV4IDlhYjVkZjcuLmM2MWJjYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgImNvcmVfcHJpdi5oIgogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPHJkbWEvaWJfbWFkLmg+CkBAIC0xODUsMTcgKzE4NiwzNSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwlyYXRlID0gKDI1ICogYXR0ci5hY3RpdmVfc3BlZWQpIC8gMTA7CisKIAlzd2l0Y2ggKGF0dHIuYWN0aXZlX3NwZWVkKSB7Ci0JY2FzZSAyOiBzcGVlZCA9ICIgRERSIjsgYnJlYWs7Ci0JY2FzZSA0OiBzcGVlZCA9ICIgUURSIjsgYnJlYWs7CisJY2FzZSAyOgorCQlzcGVlZCA9ICIgRERSIjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzcGVlZCA9ICIgUURSIjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlzcGVlZCA9ICIgRkRSMTAiOworCQlyYXRlID0gMTA7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXNwZWVkID0gIiBGRFIiOworCQlyYXRlID0gMTQ7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXNwZWVkID0gIiBFRFIiOworCQlyYXRlID0gMjU7CisJCWJyZWFrOwogCX0KIAotCXJhdGUgPSAyNSAqIGliX3dpZHRoX2VudW1fdG9faW50KGF0dHIuYWN0aXZlX3dpZHRoKSAqIGF0dHIuYWN0aXZlX3NwZWVkOworCXJhdGUgKj0gaWJfd2lkdGhfZW51bV90b19pbnQoYXR0ci5hY3RpdmVfd2lkdGgpOwogCWlmIChyYXRlIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZCVzIEdiL3NlYyAoJWRYJXMpXG4iLAotCQkgICAgICAgcmF0ZSAvIDEwLCByYXRlICUgMTAgPyAiLjUiIDogIiIsCisJCSAgICAgICByYXRlLCAoYXR0ci5hY3RpdmVfc3BlZWQgPT0gMSkgPyAiLjUiIDogIiIsCiAJCSAgICAgICBpYl93aWR0aF9lbnVtX3RvX2ludChhdHRyLmFjdGl2ZV93aWR0aCksIHNwZWVkKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYwppbmRleCAwOGY5NDhkLi5iOGEwYjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYwpAQCAtMTEyMiw3ICsxMTIyLDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmhkciwgYnVmLCBzaXplb2YoaGRyKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKGhkci5jbWQgPCAwIHx8IGhkci5jbWQgPj0gQVJSQVlfU0laRSh1Y21fY21kX3RhYmxlKSkKKwlpZiAoaGRyLmNtZCA+PSBBUlJBWV9TSVpFKHVjbV9jbWRfdGFibGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChoZHIuaW4gKyBzaXplb2YoaGRyKSA+IGxlbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbWEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbWEuYwppbmRleCA3MWJlNWVlLi5iMzdiMGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y21hLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtYS5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHJkbWEvcmRtYV91c2VyX2NtLmg+CiAjaW5jbHVkZSA8cmRtYS9pYl9tYXJzaGFsbC5oPgpAQCAtMjc2LDcgKzI3Nyw3IEBACiAJdWNtYV9zZXRfZXZlbnRfY29udGV4dChjdHgsIGV2ZW50LCB1ZXZlbnQpOwogCXVldmVudC0+cmVzcC5ldmVudCA9IGV2ZW50LT5ldmVudDsKIAl1ZXZlbnQtPnJlc3Auc3RhdHVzID0gZXZlbnQtPnN0YXR1czsKLQlpZiAoY21faWQtPnBzID09IFJETUFfUFNfVURQIHx8IGNtX2lkLT5wcyA9PSBSRE1BX1BTX0lQT0lCKQorCWlmIChjbV9pZC0+cXBfdHlwZSA9PSBJQl9RUFRfVUQpCiAJCXVjbWFfY29weV91ZF9ldmVudCgmdWV2ZW50LT5yZXNwLnBhcmFtLnVkLCAmZXZlbnQtPnBhcmFtLnVkKTsKIAllbHNlCiAJCXVjbWFfY29weV9jb25uX2V2ZW50KCZ1ZXZlbnQtPnJlc3AucGFyYW0uY29ubiwKQEAgLTM3Nyw2ICszNzgsOSBAQAogCWNhc2UgUkRNQV9QU19JUE9JQjoKIAkJKnFwX3R5cGUgPSBJQl9RUFRfVUQ7CiAJCXJldHVybiAwOworCWNhc2UgUkRNQV9QU19JQjoKKwkJKnFwX3R5cGUgPSBjbWQtPnFwX3R5cGU7CisJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEyNzAsNyArMTI3NCw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsIGJ1Ziwgc2l6ZW9mKGhkcikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChoZHIuY21kIDwgMCB8fCBoZHIuY21kID49IEFSUkFZX1NJWkUodWNtYV9jbWRfdGFibGUpKQorCWlmIChoZHIuY21kID49IEFSUkFZX1NJWkUodWNtYV9jbWRfdGFibGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChoZHIuaW4gKyBzaXplb2YoaGRyKSA+IGxlbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VkX2hlYWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWRfaGVhZGVyLmMKaW5kZXggOWI3MzdmZi4uNzJmZWVlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWRfaGVhZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWRfaGVhZGVyLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KIAogI2luY2x1ZGUgPHJkbWEvaWJfcGFjay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdW1lbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdW1lbS5jCmluZGV4IGI2NDVlNTUuLjcxZjBjMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VtZW0uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91bWVtLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWF0dHJzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTM2LDcgKzEzNyw3IEBACiAKIAlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCi0JbG9ja2VkICAgICA9IG5wYWdlcyArIGN1cnJlbnQtPm1tLT5sb2NrZWRfdm07CisJbG9ja2VkICAgICA9IG5wYWdlcyArIGN1cnJlbnQtPm1tLT5waW5uZWRfdm07CiAJbG9ja19saW1pdCA9IHJsaW1pdChSTElNSVRfTUVNTE9DSykgPj4gUEFHRV9TSElGVDsKIAogCWlmICgobG9ja2VkID4gbG9ja19saW1pdCkgJiYgIWNhcGFibGUoQ0FQX0lQQ19MT0NLKSkgewpAQCAtMjA2LDcgKzIwNyw3IEBACiAJCV9faWJfdW1lbV9yZWxlYXNlKGNvbnRleHQtPmRldmljZSwgdW1lbSwgMCk7CiAJCWtmcmVlKHVtZW0pOwogCX0gZWxzZQotCQljdXJyZW50LT5tbS0+bG9ja2VkX3ZtID0gbG9ja2VkOworCQljdXJyZW50LT5tbS0+cGlubmVkX3ZtID0gbG9ja2VkOwogCiAJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJaWYgKHZtYV9saXN0KQpAQCAtMjIyLDcgKzIyMyw3IEBACiAJc3RydWN0IGliX3VtZW0gKnVtZW0gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGliX3VtZW0sIHdvcmspOwogCiAJZG93bl93cml0ZSgmdW1lbS0+bW0tPm1tYXBfc2VtKTsKLQl1bWVtLT5tbS0+bG9ja2VkX3ZtIC09IHVtZW0tPmRpZmY7CisJdW1lbS0+bW0tPnBpbm5lZF92bSAtPSB1bWVtLT5kaWZmOwogCXVwX3dyaXRlKCZ1bWVtLT5tbS0+bW1hcF9zZW0pOwogCW1tcHV0KHVtZW0tPm1tKTsKIAlrZnJlZSh1bWVtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jCmluZGV4IDhkMjYxYjYuLjA3ZGIyMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXNlcl9tYWQuYwpAQCAtNDU4LDggKzQ1OCw3IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCWlmIChwYWNrZXQtPm1hZC5oZHIuaWQgPCAwIHx8Ci0JICAgIHBhY2tldC0+bWFkLmhkci5pZCA+PSBJQl9VTUFEX01BWF9BR0VOVFMpIHsKKwlpZiAocGFja2V0LT5tYWQuaGRyLmlkID49IElCX1VNQURfTUFYX0FHRU5UUykgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKIAl9CkBAIC03MDMsNyArNzAyLDcgQEAKIAltdXRleF9sb2NrKCZmaWxlLT5wb3J0LT5maWxlX211dGV4KTsKIAltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CiAKLQlpZiAoaWQgPCAwIHx8IGlkID49IElCX1VNQURfTUFYX0FHRU5UUyB8fCAhX19nZXRfYWdlbnQoZmlsZSwgaWQpKSB7CisJaWYgKGlkID49IElCX1VNQURfTUFYX0FHRU5UUyB8fCAhX19nZXRfYWdlbnQoZmlsZSwgaWQpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzLmgKaW5kZXggYTA3OGU1Ni4uNWJjYjJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzLmgKQEAgLTc2LDYgKzc2LDggQEAKIAlzdHJ1Y3QgaWJfZGV2aWNlCQkgICAgICAgKmliX2RldjsKIAlpbnQJCQkJCWRldm51bTsKIAlzdHJ1Y3QgY2RldgkJCSAgICAgICAgY2RldjsKKwlzdHJ1Y3QgcmJfcm9vdAkJCQl4cmNkX3RyZWU7CisJc3RydWN0IG11dGV4CQkJCXhyY2RfdHJlZV9tdXRleDsKIH07CiAKIHN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZSB7CkBAIC0xMjAsNiArMTIyLDE2IEBACiAJdTMyCQkJZXZlbnRzX3JlcG9ydGVkOwogfTsKIAorc3RydWN0IGliX3V4cmNkX29iamVjdCB7CisJc3RydWN0IGliX3VvYmplY3QJdW9iamVjdDsKKwlhdG9taWNfdAkJcmVmY250OworfTsKKworc3RydWN0IGliX3VzcnFfb2JqZWN0IHsKKwlzdHJ1Y3QgaWJfdWV2ZW50X29iamVjdAl1ZXZlbnQ7CisJc3RydWN0IGliX3V4cmNkX29iamVjdCAqdXhyY2Q7Cit9OworCiBzdHJ1Y3QgaWJfdXFwX29iamVjdCB7CiAJc3RydWN0IGliX3VldmVudF9vYmplY3QJdWV2ZW50OwogCXN0cnVjdCBsaXN0X2hlYWQgCW1jYXN0X2xpc3Q7CkBAIC0xNDIsNiArMTU0LDcgQEAKIGV4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19jcV9pZHI7CiBleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfcXBfaWRyOwogZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX3NycV9pZHI7CitleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfeHJjZF9pZHI7CiAKIHZvaWQgaWRyX3JlbW92ZV91b2JqKHN0cnVjdCBpZHIgKmlkcCwgc3RydWN0IGliX3VvYmplY3QgKnVvYmopOwogCkBAIC0xNjEsNiArMTc0LDcgQEAKIHZvaWQgaWJfdXZlcmJzX3NycV9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvbnRleHRfcHRyKTsKIHZvaWQgaWJfdXZlcmJzX2V2ZW50X2hhbmRsZXIoc3RydWN0IGliX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCiAJCQkgICAgIHN0cnVjdCBpYl9ldmVudCAqZXZlbnQpOwordm9pZCBpYl91dmVyYnNfZGVhbGxvY194cmNkKHN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICpkZXYsIHN0cnVjdCBpYl94cmNkICp4cmNkKTsKIAogI2RlZmluZSBJQl9VVkVSQlNfREVDTEFSRV9DTUQobmFtZSkJCQkJCVwKIAlzc2l6ZV90IGliX3V2ZXJic18jI25hbWUoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAkJXApAQCAtMTgxLDYgKzE5NSw3IEBACiBJQl9VVkVSQlNfREVDTEFSRV9DTUQocmVxX25vdGlmeV9jcSk7CiBJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGVzdHJveV9jcSk7CiBJQl9VVkVSQlNfREVDTEFSRV9DTUQoY3JlYXRlX3FwKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChvcGVuX3FwKTsKIElCX1VWRVJCU19ERUNMQVJFX0NNRChxdWVyeV9xcCk7CiBJQl9VVkVSQlNfREVDTEFSRV9DTUQobW9kaWZ5X3FwKTsKIElCX1VWRVJCU19ERUNMQVJFX0NNRChkZXN0cm95X3FwKTsKQEAgLTE5NSw1ICsyMTAsOCBAQAogSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKG1vZGlmeV9zcnEpOwogSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKHF1ZXJ5X3NycSk7CiBJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGVzdHJveV9zcnEpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGNyZWF0ZV94c3JxKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChvcGVuX3hyY2QpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGNsb3NlX3hyY2QpOwogCiAjZW5kaWYgLyogVVZFUkJTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwppbmRleCBjNDI2OTkyLi4yNTRmMTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCkBAIC00Nyw2ICs0Nyw3IEBACiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHFwX2xvY2tfa2V5Owogc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBhaF9sb2NrX2tleTsKIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgc3JxX2xvY2tfa2V5Oworc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSB4cmNkX2xvY2tfa2V5OwogCiAjZGVmaW5lIElOSVRfVURBVEEodWRhdGEsIGlidWYsIG9idWYsIGlsZW4sIG9sZW4pCQkJXAogCWRvIHsJCQkJCQkJCVwKQEAgLTI1NSw2ICsyNTYsMTggQEAKIAlwdXRfdW9ial9yZWFkKHNycS0+dW9iamVjdCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaWJfeHJjZCAqaWRyX3JlYWRfeHJjZChpbnQgeHJjZF9oYW5kbGUsIHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkgICAgIHN0cnVjdCBpYl91b2JqZWN0ICoqdW9iaikKK3sKKwkqdW9iaiA9IGlkcl9yZWFkX3VvYmooJmliX3V2ZXJic194cmNkX2lkciwgeHJjZF9oYW5kbGUsIGNvbnRleHQsIDApOworCXJldHVybiAqdW9iaiA/ICgqdW9iaiktPm9iamVjdCA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF94cmNkX3JlYWQoc3RydWN0IGliX3VvYmplY3QgKnVvYmopCit7CisJcHV0X3VvYmpfcmVhZCh1b2JqKTsKK30KKwogc3NpemVfdCBpYl91dmVyYnNfZ2V0X2NvbnRleHQoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAogCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSAgICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQpAQCAtMjk4LDYgKzMxMSw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnVjb250ZXh0LT5xcF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmdWNvbnRleHQtPnNycV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmdWNvbnRleHQtPmFoX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZ1Y29udGV4dC0+eHJjZF9saXN0KTsKIAl1Y29udGV4dC0+Y2xvc2luZyA9IDA7CiAKIAlyZXNwLm51bV9jb21wX3ZlY3RvcnMgPSBmaWxlLT5kZXZpY2UtPm51bV9jb21wX3ZlY3RvcnM7CkBAIC01NzksNiArNTkzLDMxMCBAQAogCXJldHVybiBpbl9sZW47CiB9CiAKK3N0cnVjdCB4cmNkX3RhYmxlX2VudHJ5IHsKKwlzdHJ1Y3QgcmJfbm9kZSAgbm9kZTsKKwlzdHJ1Y3QgaWJfeHJjZCAqeHJjZDsKKwlzdHJ1Y3QgaW5vZGUgICAqaW5vZGU7Cit9OworCitzdGF0aWMgaW50IHhyY2RfdGFibGVfaW5zZXJ0KHN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgaWJfeHJjZCAqeHJjZCkKK3sKKwlzdHJ1Y3QgeHJjZF90YWJsZV9lbnRyeSAqZW50cnksICpzY2FuOworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZkZXYtPnhyY2RfdHJlZS5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZiAqZW50cnksIEdGUF9LRVJORUwpOworCWlmICghZW50cnkpCisJCXJldHVybiAtRU5PTUVNOworCisJZW50cnktPnhyY2QgID0geHJjZDsKKwllbnRyeS0+aW5vZGUgPSBpbm9kZTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJc2NhbiA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHhyY2RfdGFibGVfZW50cnksIG5vZGUpOworCisJCWlmIChpbm9kZSA8IHNjYW4tPmlub2RlKSB7CisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoaW5vZGUgPiBzY2FuLT5pbm9kZSkgeworCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJfSBlbHNlIHsKKwkJCWtmcmVlKGVudHJ5KTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCisJcmJfbGlua19ub2RlKCZlbnRyeS0+bm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmVudHJ5LT5ub2RlLCAmZGV2LT54cmNkX3RyZWUpOworCWlncmFiKGlub2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB4cmNkX3RhYmxlX2VudHJ5ICp4cmNkX3RhYmxlX3NlYXJjaChzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSAqZGV2LAorCQkJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCB4cmNkX3RhYmxlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCA9IGRldi0+eHJjZF90cmVlLnJiX25vZGU7CisKKwl3aGlsZSAocCkgeworCQllbnRyeSA9IHJiX2VudHJ5KHAsIHN0cnVjdCB4cmNkX3RhYmxlX2VudHJ5LCBub2RlKTsKKworCQlpZiAoaW5vZGUgPCBlbnRyeS0+aW5vZGUpCisJCQlwID0gcC0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoaW5vZGUgPiBlbnRyeS0+aW5vZGUpCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBlbnRyeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBpYl94cmNkICpmaW5kX3hyY2Qoc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKmRldiwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgeHJjZF90YWJsZV9lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IHhyY2RfdGFibGVfc2VhcmNoKGRldiwgaW5vZGUpOworCWlmICghZW50cnkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGVudHJ5LT54cmNkOworfQorCitzdGF0aWMgdm9pZCB4cmNkX3RhYmxlX2RlbGV0ZShzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgeHJjZF90YWJsZV9lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IHhyY2RfdGFibGVfc2VhcmNoKGRldiwgaW5vZGUpOworCWlmIChlbnRyeSkgeworCQlpcHV0KGlub2RlKTsKKwkJcmJfZXJhc2UoJmVudHJ5LT5ub2RlLCAmZGV2LT54cmNkX3RyZWUpOworCQlrZnJlZShlbnRyeSk7CisJfQorfQorCitzc2l6ZV90IGliX3V2ZXJic19vcGVuX3hyY2Qoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19vcGVuX3hyY2QJY21kOworCXN0cnVjdCBpYl91dmVyYnNfb3Blbl94cmNkX3Jlc3AJcmVzcDsKKwlzdHJ1Y3QgaWJfdWRhdGEJCQl1ZGF0YTsKKwlzdHJ1Y3QgaWJfdXhyY2Rfb2JqZWN0ICAgICAgICAgKm9iajsKKwlzdHJ1Y3QgaWJfeHJjZCAgICAgICAgICAgICAgICAgKnhyY2QgPSBOVUxMOworCXN0cnVjdCBmaWxlICAgICAgICAgICAgICAgICAgICAqZiA9IE5VTEw7CisJc3RydWN0IGlub2RlICAgICAgICAgICAgICAgICAgICppbm9kZSA9IE5VTEw7CisJaW50CQkJCXJldCA9IDA7CisJaW50CQkJCW5ld194cmNkID0gMDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJSU5JVF9VREFUQSgmdWRhdGEsIGJ1ZiArIHNpemVvZiBjbWQsCisJCSAgICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UgKyBzaXplb2YgcmVzcCwKKwkJICAgaW5fbGVuIC0gc2l6ZW9mIGNtZCwgb3V0X2xlbiAtIHNpemVvZiAgcmVzcCk7CisKKwltdXRleF9sb2NrKCZmaWxlLT5kZXZpY2UtPnhyY2RfdHJlZV9tdXRleCk7CisKKwlpZiAoY21kLmZkICE9IC0xKSB7CisJCS8qIHNlYXJjaCBmb3IgZmlsZSBkZXNjcmlwdG9yICovCisJCWYgPSBmZ2V0KGNtZC5mZCk7CisJCWlmICghZikgeworCQkJcmV0ID0gLUVCQURGOworCQkJZ290byBlcnJfdHJlZV9tdXRleF91bmxvY2s7CisJCX0KKworCQlpbm9kZSA9IGYtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpZiAoIWlub2RlKSB7CisJCQlyZXQgPSAtRUJBREY7CisJCQlnb3RvIGVycl90cmVlX211dGV4X3VubG9jazsKKwkJfQorCisJCXhyY2QgPSBmaW5kX3hyY2QoZmlsZS0+ZGV2aWNlLCBpbm9kZSk7CisJCWlmICgheHJjZCAmJiAhKGNtZC5vZmxhZ3MgJiBPX0NSRUFUKSkgeworCQkJLyogbm8gZmlsZSBkZXNjcmlwdG9yLiBOZWVkIENSRUFURSBmbGFnICovCisJCQlyZXQgPSAtRUFHQUlOOworCQkJZ290byBlcnJfdHJlZV9tdXRleF91bmxvY2s7CisJCX0KKworCQlpZiAoeHJjZCAmJiBjbWQub2ZsYWdzICYgT19FWENMKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfdHJlZV9tdXRleF91bmxvY2s7CisJCX0KKwl9CisKKwlvYmogPSBrbWFsbG9jKHNpemVvZiAqb2JqLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl90cmVlX211dGV4X3VubG9jazsKKwl9CisKKwlpbml0X3VvYmooJm9iai0+dW9iamVjdCwgMCwgZmlsZS0+dWNvbnRleHQsICZ4cmNkX2xvY2tfa2V5KTsKKworCWRvd25fd3JpdGUoJm9iai0+dW9iamVjdC5tdXRleCk7CisKKwlpZiAoIXhyY2QpIHsKKwkJeHJjZCA9IGZpbGUtPmRldmljZS0+aWJfZGV2LT5hbGxvY194cmNkKGZpbGUtPmRldmljZS0+aWJfZGV2LAorCQkJCQkJCWZpbGUtPnVjb250ZXh0LCAmdWRhdGEpOworCQlpZiAoSVNfRVJSKHhyY2QpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHhyY2QpOworCQkJZ290byBlcnI7CisJCX0KKworCQl4cmNkLT5pbm9kZSAgID0gaW5vZGU7CisJCXhyY2QtPmRldmljZSAgPSBmaWxlLT5kZXZpY2UtPmliX2RldjsKKwkJYXRvbWljX3NldCgmeHJjZC0+dXNlY250LCAwKTsKKwkJbXV0ZXhfaW5pdCgmeHJjZC0+dGd0X3FwX211dGV4KTsKKwkJSU5JVF9MSVNUX0hFQUQoJnhyY2QtPnRndF9xcF9saXN0KTsKKwkJbmV3X3hyY2QgPSAxOworCX0KKworCWF0b21pY19zZXQoJm9iai0+cmVmY250LCAwKTsKKwlvYmotPnVvYmplY3Qub2JqZWN0ID0geHJjZDsKKwlyZXQgPSBpZHJfYWRkX3VvYmooJmliX3V2ZXJic194cmNkX2lkciwgJm9iai0+dW9iamVjdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaWRyOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisJcmVzcC54cmNkX2hhbmRsZSA9IG9iai0+dW9iamVjdC5pZDsKKworCWlmIChpbm9kZSkgeworCQlpZiAobmV3X3hyY2QpIHsKKwkJCS8qIGNyZWF0ZSBuZXcgaW5vZGUveHJjZCB0YWJsZSBlbnRyeSAqLworCQkJcmV0ID0geHJjZF90YWJsZV9pbnNlcnQoZmlsZS0+ZGV2aWNlLCBpbm9kZSwgeHJjZCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyX2luc2VydF94cmNkOworCQl9CisJCWF0b21pY19pbmMoJnhyY2QtPnVzZWNudCk7CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2NvcHk7CisJfQorCisJaWYgKGYpCisJCWZwdXQoZik7CisKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmb2JqLT51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+eHJjZF9saXN0KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKKworCW9iai0+dW9iamVjdC5saXZlID0gMTsKKwl1cF93cml0ZSgmb2JqLT51b2JqZWN0Lm11dGV4KTsKKworCW11dGV4X3VubG9jaygmZmlsZS0+ZGV2aWNlLT54cmNkX3RyZWVfbXV0ZXgpOworCXJldHVybiBpbl9sZW47CisKK2Vycl9jb3B5OgorCWlmIChpbm9kZSkgeworCQlpZiAobmV3X3hyY2QpCisJCQl4cmNkX3RhYmxlX2RlbGV0ZShmaWxlLT5kZXZpY2UsIGlub2RlKTsKKwkJYXRvbWljX2RlYygmeHJjZC0+dXNlY250KTsKKwl9CisKK2Vycl9pbnNlcnRfeHJjZDoKKwlpZHJfcmVtb3ZlX3VvYmooJmliX3V2ZXJic194cmNkX2lkciwgJm9iai0+dW9iamVjdCk7CisKK2Vycl9pZHI6CisJaWJfZGVhbGxvY194cmNkKHhyY2QpOworCitlcnI6CisJcHV0X3VvYmpfd3JpdGUoJm9iai0+dW9iamVjdCk7CisKK2Vycl90cmVlX211dGV4X3VubG9jazoKKwlpZiAoZikKKwkJZnB1dChmKTsKKworCW11dGV4X3VubG9jaygmZmlsZS0+ZGV2aWNlLT54cmNkX3RyZWVfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBpYl91dmVyYnNfY2xvc2VfeHJjZChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfY2xvc2VfeHJjZCBjbWQ7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAgICAgICp1b2JqOworCXN0cnVjdCBpYl94cmNkICAgICAgICAgICAgICAqeHJjZCA9IE5VTEw7CisJc3RydWN0IGlub2RlICAgICAgICAgICAgICAgICppbm9kZSA9IE5VTEw7CisJc3RydWN0IGliX3V4cmNkX29iamVjdCAgICAgICpvYmo7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltdXRleF9sb2NrKCZmaWxlLT5kZXZpY2UtPnhyY2RfdHJlZV9tdXRleCk7CisJdW9iaiA9IGlkcl93cml0ZV91b2JqKCZpYl91dmVyYnNfeHJjZF9pZHIsIGNtZC54cmNkX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQpOworCWlmICghdW9iaikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl4cmNkICA9IHVvYmotPm9iamVjdDsKKwlpbm9kZSA9IHhyY2QtPmlub2RlOworCW9iaiAgID0gY29udGFpbmVyX29mKHVvYmosIHN0cnVjdCBpYl91eHJjZF9vYmplY3QsIHVvYmplY3QpOworCWlmIChhdG9taWNfcmVhZCgmb2JqLT5yZWZjbnQpKSB7CisJCXB1dF91b2JqX3dyaXRlKHVvYmopOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghaW5vZGUgfHwgYXRvbWljX2RlY19hbmRfdGVzdCgmeHJjZC0+dXNlY250KSkgeworCQlyZXQgPSBpYl9kZWFsbG9jX3hyY2QodW9iai0+b2JqZWN0KTsKKwkJaWYgKCFyZXQpCisJCQl1b2JqLT5saXZlID0gMDsKKwl9CisKKwlsaXZlID0gdW9iai0+bGl2ZTsKKwlpZiAoaW5vZGUgJiYgcmV0KQorCQlhdG9taWNfaW5jKCZ4cmNkLT51c2VjbnQpOworCisJcHV0X3VvYmpfd3JpdGUodW9iaik7CisKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmIChpbm9kZSAmJiAhbGl2ZSkKKwkJeHJjZF90YWJsZV9kZWxldGUoZmlsZS0+ZGV2aWNlLCBpbm9kZSk7CisKKwlpZHJfcmVtb3ZlX3VvYmooJmliX3V2ZXJic194cmNkX2lkciwgdW9iaik7CisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKKworCXB1dF91b2JqKHVvYmopOworCXJldCA9IGluX2xlbjsKKworb3V0OgorCW11dGV4X3VubG9jaygmZmlsZS0+ZGV2aWNlLT54cmNkX3RyZWVfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaWJfdXZlcmJzX2RlYWxsb2NfeHJjZChzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpYl94cmNkICp4cmNkKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpbm9kZSA9IHhyY2QtPmlub2RlOworCWlmIChpbm9kZSAmJiAhYXRvbWljX2RlY19hbmRfdGVzdCgmeHJjZC0+dXNlY250KSkKKwkJcmV0dXJuOworCisJaWJfZGVhbGxvY194cmNkKHhyY2QpOworCisJaWYgKGlub2RlKQorCQl4cmNkX3RhYmxlX2RlbGV0ZShkZXYsIGlub2RlKTsKK30KKwogc3NpemVfdCBpYl91dmVyYnNfcmVnX21yKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKIAkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAogCQkJIGludCBvdXRfbGVuKQpAQCAtMTA1Miw5ICsxMzcwLDEyIEBACiAJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfcXBfcmVzcCByZXNwOwogCXN0cnVjdCBpYl91ZGF0YSAgICAgICAgICAgICAgICAgdWRhdGE7CiAJc3RydWN0IGliX3VxcF9vYmplY3QgICAgICAgICAgICpvYmo7Ci0Jc3RydWN0IGliX3BkICAgICAgICAgICAgICAgICAgICpwZDsKLQlzdHJ1Y3QgaWJfY3EgICAgICAgICAgICAgICAgICAgKnNjcSwgKnJjcTsKLQlzdHJ1Y3QgaWJfc3JxICAgICAgICAgICAgICAgICAgKnNycTsKKwlzdHJ1Y3QgaWJfZGV2aWNlCSAgICAgICAqZGV2aWNlOworCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICAgICAqcGQgPSBOVUxMOworCXN0cnVjdCBpYl94cmNkCQkgICAgICAgKnhyY2QgPSBOVUxMOworCXN0cnVjdCBpYl91b2JqZWN0CSAgICAgICAqdW5pbml0aWFsaXplZF92YXIoeHJjZF91b2JqKTsKKwlzdHJ1Y3QgaWJfY3EgICAgICAgICAgICAgICAgICAgKnNjcSA9IE5VTEwsICpyY3EgPSBOVUxMOworCXN0cnVjdCBpYl9zcnEgICAgICAgICAgICAgICAgICAqc3JxID0gTlVMTDsKIAlzdHJ1Y3QgaWJfcXAgICAgICAgICAgICAgICAgICAgKnFwOwogCXN0cnVjdCBpYl9xcF9pbml0X2F0dHIgICAgICAgICAgYXR0cjsKIAlpbnQgcmV0OwpAQCAtMTA3NiwxNSArMTM5NywzOSBAQAogCWluaXRfdW9iaigmb2JqLT51ZXZlbnQudW9iamVjdCwgY21kLnVzZXJfaGFuZGxlLCBmaWxlLT51Y29udGV4dCwgJnFwX2xvY2tfa2V5KTsKIAlkb3duX3dyaXRlKCZvYmotPnVldmVudC51b2JqZWN0Lm11dGV4KTsKIAotCXNycSA9IGNtZC5pc19zcnEgPyBpZHJfcmVhZF9zcnEoY21kLnNycV9oYW5kbGUsIGZpbGUtPnVjb250ZXh0KSA6IE5VTEw7Ci0JcGQgID0gaWRyX3JlYWRfcGQoY21kLnBkX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQpOwotCXNjcSA9IGlkcl9yZWFkX2NxKGNtZC5zZW5kX2NxX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsIDApOwotCXJjcSA9IGNtZC5yZWN2X2NxX2hhbmRsZSA9PSBjbWQuc2VuZF9jcV9oYW5kbGUgPwotCQlzY3EgOiBpZHJfcmVhZF9jcShjbWQucmVjdl9jcV9oYW5kbGUsIGZpbGUtPnVjb250ZXh0LCAxKTsKKwlpZiAoY21kLnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19UR1QpIHsKKwkJeHJjZCA9IGlkcl9yZWFkX3hyY2QoY21kLnBkX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsICZ4cmNkX3VvYmopOworCQlpZiAoIXhyY2QpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9wdXQ7CisJCX0KKwkJZGV2aWNlID0geHJjZC0+ZGV2aWNlOworCX0gZWxzZSB7CisJCXBkICA9IGlkcl9yZWFkX3BkKGNtZC5wZF9oYW5kbGUsIGZpbGUtPnVjb250ZXh0KTsKKwkJc2NxID0gaWRyX3JlYWRfY3EoY21kLnNlbmRfY3FfaGFuZGxlLCBmaWxlLT51Y29udGV4dCwgMCk7CisJCWlmICghcGQgfHwgIXNjcSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3B1dDsKKwkJfQogCi0JaWYgKCFwZCB8fCAhc2NxIHx8ICFyY3EgfHwgKGNtZC5pc19zcnEgJiYgIXNycSkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcHV0OworCQlpZiAoY21kLnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19JTkkpIHsKKwkJCWNtZC5tYXhfcmVjdl93ciA9IGNtZC5tYXhfcmVjdl9zZ2UgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKGNtZC5pc19zcnEpIHsKKwkJCQlzcnEgPSBpZHJfcmVhZF9zcnEoY21kLnNycV9oYW5kbGUsIGZpbGUtPnVjb250ZXh0KTsKKwkJCQlpZiAoIXNycSB8fCBzcnEtPnNycV90eXBlICE9IElCX1NSUVRfQkFTSUMpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJZ290byBlcnJfcHV0OworCQkJCX0KKwkJCX0KKwkJCXJjcSA9IChjbWQucmVjdl9jcV9oYW5kbGUgPT0gY21kLnNlbmRfY3FfaGFuZGxlKSA/CisJCQkgICAgICAgc2NxIDogaWRyX3JlYWRfY3EoY21kLnJlY3ZfY3FfaGFuZGxlLCBmaWxlLT51Y29udGV4dCwgMSk7CisJCQlpZiAoIXJjcSkgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJfcHV0OworCQkJfQorCQl9CisJCWRldmljZSA9IHBkLT5kZXZpY2U7CiAJfQogCiAJYXR0ci5ldmVudF9oYW5kbGVyID0gaWJfdXZlcmJzX3FwX2V2ZW50X2hhbmRsZXI7CkBAIC0xMDkyLDYgKzE0MzcsNyBAQAogCWF0dHIuc2VuZF9jcSAgICAgICA9IHNjcTsKIAlhdHRyLnJlY3ZfY3EgICAgICAgPSByY3E7CiAJYXR0ci5zcnEgICAgICAgICAgID0gc3JxOworCWF0dHIueHJjZAkgICA9IHhyY2Q7CiAJYXR0ci5zcV9zaWdfdHlwZSAgID0gY21kLnNxX3NpZ19hbGwgPyBJQl9TSUdOQUxfQUxMX1dSIDogSUJfU0lHTkFMX1JFUV9XUjsKIAlhdHRyLnFwX3R5cGUgICAgICAgPSBjbWQucXBfdHlwZTsKIAlhdHRyLmNyZWF0ZV9mbGFncyAgPSAwOwpAQCAtMTEwNiwyNiArMTQ1MiwzNCBAQAogCUlOSVRfTElTVF9IRUFEKCZvYmotPnVldmVudC5ldmVudF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmb2JqLT5tY2FzdF9saXN0KTsKIAotCXFwID0gcGQtPmRldmljZS0+Y3JlYXRlX3FwKHBkLCAmYXR0ciwgJnVkYXRhKTsKKwlpZiAoY21kLnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19UR1QpCisJCXFwID0gaWJfY3JlYXRlX3FwKHBkLCAmYXR0cik7CisJZWxzZQorCQlxcCA9IGRldmljZS0+Y3JlYXRlX3FwKHBkLCAmYXR0ciwgJnVkYXRhKTsKKwogCWlmIChJU19FUlIocXApKSB7CiAJCXJldCA9IFBUUl9FUlIocXApOwogCQlnb3RvIGVycl9wdXQ7CiAJfQogCi0JcXAtPmRldmljZSAgICAgCSAgPSBwZC0+ZGV2aWNlOwotCXFwLT5wZCAgICAgICAgIAkgID0gcGQ7Ci0JcXAtPnNlbmRfY3EgICAgCSAgPSBhdHRyLnNlbmRfY3E7Ci0JcXAtPnJlY3ZfY3EgICAgCSAgPSBhdHRyLnJlY3ZfY3E7Ci0JcXAtPnNycQkgICAgICAgCSAgPSBhdHRyLnNycTsKLQlxcC0+dW9iamVjdCAgICAgICA9ICZvYmotPnVldmVudC51b2JqZWN0OwotCXFwLT5ldmVudF9oYW5kbGVyID0gYXR0ci5ldmVudF9oYW5kbGVyOwotCXFwLT5xcF9jb250ZXh0ICAgID0gYXR0ci5xcF9jb250ZXh0OwotCXFwLT5xcF90eXBlCSAgPSBhdHRyLnFwX3R5cGU7Ci0JYXRvbWljX2luYygmcGQtPnVzZWNudCk7Ci0JYXRvbWljX2luYygmYXR0ci5zZW5kX2NxLT51c2VjbnQpOwotCWF0b21pY19pbmMoJmF0dHIucmVjdl9jcS0+dXNlY250KTsKLQlpZiAoYXR0ci5zcnEpCi0JCWF0b21pY19pbmMoJmF0dHIuc3JxLT51c2VjbnQpOworCWlmIChjbWQucXBfdHlwZSAhPSBJQl9RUFRfWFJDX1RHVCkgeworCQlxcC0+cmVhbF9xcAkgID0gcXA7CisJCXFwLT5kZXZpY2UJICA9IGRldmljZTsKKwkJcXAtPnBkCQkgID0gcGQ7CisJCXFwLT5zZW5kX2NxCSAgPSBhdHRyLnNlbmRfY3E7CisJCXFwLT5yZWN2X2NxCSAgPSBhdHRyLnJlY3ZfY3E7CisJCXFwLT5zcnEJCSAgPSBhdHRyLnNycTsKKwkJcXAtPmV2ZW50X2hhbmRsZXIgPSBhdHRyLmV2ZW50X2hhbmRsZXI7CisJCXFwLT5xcF9jb250ZXh0CSAgPSBhdHRyLnFwX2NvbnRleHQ7CisJCXFwLT5xcF90eXBlCSAgPSBhdHRyLnFwX3R5cGU7CisJCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOworCQlhdG9taWNfaW5jKCZhdHRyLnNlbmRfY3EtPnVzZWNudCk7CisJCWlmIChhdHRyLnJlY3ZfY3EpCisJCQlhdG9taWNfaW5jKCZhdHRyLnJlY3ZfY3EtPnVzZWNudCk7CisJCWlmIChhdHRyLnNycSkKKwkJCWF0b21pY19pbmMoJmF0dHIuc3JxLT51c2VjbnQpOworCX0KKwlxcC0+dW9iamVjdCA9ICZvYmotPnVldmVudC51b2JqZWN0OwogCiAJb2JqLT51ZXZlbnQudW9iamVjdC5vYmplY3QgPSBxcDsKIAlyZXQgPSBpZHJfYWRkX3VvYmooJmliX3V2ZXJic19xcF9pZHIsICZvYmotPnVldmVudC51b2JqZWN0KTsKQEAgLTExNDcsOSArMTUwMSwxMyBAQAogCQlnb3RvIGVycl9jb3B5OwogCX0KIAotCXB1dF9wZF9yZWFkKHBkKTsKLQlwdXRfY3FfcmVhZChzY3EpOwotCWlmIChyY3EgIT0gc2NxKQorCWlmICh4cmNkKQorCQlwdXRfeHJjZF9yZWFkKHhyY2RfdW9iaik7CisJaWYgKHBkKQorCQlwdXRfcGRfcmVhZChwZCk7CisJaWYgKHNjcSkKKwkJcHV0X2NxX3JlYWQoc2NxKTsKKwlpZiAocmNxICYmIHJjcSAhPSBzY3EpCiAJCXB1dF9jcV9yZWFkKHJjcSk7CiAJaWYgKHNycSkKIAkJcHV0X3NycV9yZWFkKHNycSk7CkBAIC0xMTcxLDYgKzE1MjksOCBAQAogCWliX2Rlc3Ryb3lfcXAocXApOwogCiBlcnJfcHV0OgorCWlmICh4cmNkKQorCQlwdXRfeHJjZF9yZWFkKHhyY2RfdW9iaik7CiAJaWYgKHBkKQogCQlwdXRfcGRfcmVhZChwZCk7CiAJaWYgKHNjcSkKQEAgLTExODQsNiArMTU0NCw5OCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3NzaXplX3QgaWJfdXZlcmJzX29wZW5fcXAoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX29wZW5fcXAgICAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9xcF9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgICB1ZGF0YTsKKwlzdHJ1Y3QgaWJfdXFwX29iamVjdCAgICAgICAgICAgKm9iajsKKwlzdHJ1Y3QgaWJfeHJjZAkJICAgICAgICp4cmNkOworCXN0cnVjdCBpYl91b2JqZWN0CSAgICAgICAqdW5pbml0aWFsaXplZF92YXIoeHJjZF91b2JqKTsKKwlzdHJ1Y3QgaWJfcXAgICAgICAgICAgICAgICAgICAgKnFwOworCXN0cnVjdCBpYl9xcF9vcGVuX2F0dHIgICAgICAgICAgYXR0cjsKKwlpbnQgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlJTklUX1VEQVRBKCZ1ZGF0YSwgYnVmICsgc2l6ZW9mIGNtZCwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSArIHNpemVvZiByZXNwLAorCQkgICBpbl9sZW4gLSBzaXplb2YgY21kLCBvdXRfbGVuIC0gc2l6ZW9mIHJlc3ApOworCisJb2JqID0ga21hbGxvYyhzaXplb2YgKm9iaiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvYmopCisJCXJldHVybiAtRU5PTUVNOworCisJaW5pdF91b2JqKCZvYmotPnVldmVudC51b2JqZWN0LCBjbWQudXNlcl9oYW5kbGUsIGZpbGUtPnVjb250ZXh0LCAmcXBfbG9ja19rZXkpOworCWRvd25fd3JpdGUoJm9iai0+dWV2ZW50LnVvYmplY3QubXV0ZXgpOworCisJeHJjZCA9IGlkcl9yZWFkX3hyY2QoY21kLnBkX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsICZ4cmNkX3VvYmopOworCWlmICgheHJjZCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wdXQ7CisJfQorCisJYXR0ci5ldmVudF9oYW5kbGVyID0gaWJfdXZlcmJzX3FwX2V2ZW50X2hhbmRsZXI7CisJYXR0ci5xcF9jb250ZXh0ICAgID0gZmlsZTsKKwlhdHRyLnFwX251bSAgICAgICAgPSBjbWQucXBuOworCWF0dHIucXBfdHlwZSAgICAgICA9IGNtZC5xcF90eXBlOworCisJb2JqLT51ZXZlbnQuZXZlbnRzX3JlcG9ydGVkID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmb2JqLT51ZXZlbnQuZXZlbnRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm9iai0+bWNhc3RfbGlzdCk7CisKKwlxcCA9IGliX29wZW5fcXAoeHJjZCwgJmF0dHIpOworCWlmIChJU19FUlIocXApKSB7CisJCXJldCA9IFBUUl9FUlIocXApOworCQlnb3RvIGVycl9wdXQ7CisJfQorCisJcXAtPnVvYmplY3QgPSAmb2JqLT51ZXZlbnQudW9iamVjdDsKKworCW9iai0+dWV2ZW50LnVvYmplY3Qub2JqZWN0ID0gcXA7CisJcmV0ID0gaWRyX2FkZF91b2JqKCZpYl91dmVyYnNfcXBfaWRyLCAmb2JqLT51ZXZlbnQudW9iamVjdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGVzdHJveTsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCXJlc3AucXBuICAgICAgID0gcXAtPnFwX251bTsKKwlyZXNwLnFwX2hhbmRsZSA9IG9iai0+dWV2ZW50LnVvYmplY3QuaWQ7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfcmVtb3ZlOworCX0KKworCXB1dF94cmNkX3JlYWQoeHJjZF91b2JqKTsKKworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZvYmotPnVldmVudC51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+cXBfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CisKKwlvYmotPnVldmVudC51b2JqZWN0LmxpdmUgPSAxOworCisJdXBfd3JpdGUoJm9iai0+dWV2ZW50LnVvYmplY3QubXV0ZXgpOworCisJcmV0dXJuIGluX2xlbjsKKworZXJyX3JlbW92ZToKKwlpZHJfcmVtb3ZlX3VvYmooJmliX3V2ZXJic19xcF9pZHIsICZvYmotPnVldmVudC51b2JqZWN0KTsKKworZXJyX2Rlc3Ryb3k6CisJaWJfZGVzdHJveV9xcChxcCk7CisKK2Vycl9wdXQ6CisJcHV0X3hyY2RfcmVhZCh4cmNkX3VvYmopOworCXB1dF91b2JqX3dyaXRlKCZvYmotPnVldmVudC51b2JqZWN0KTsKKwlyZXR1cm4gcmV0OworfQorCiBzc2l6ZV90IGliX3V2ZXJic19xdWVyeV9xcChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCiAJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAogCQkJICAgaW50IG91dF9sZW4pCkBAIC0xMjg0LDYgKzE3MzYsMjAgQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQogCisvKiBSZW1vdmUgaWdub3JlZCBmaWVsZHMgc2V0IGluIHRoZSBhdHRyaWJ1dGUgbWFzayAqLworc3RhdGljIGludCBtb2RpZnlfcXBfbWFzayhlbnVtIGliX3FwX3R5cGUgcXBfdHlwZSwgaW50IG1hc2spCit7CisJc3dpdGNoIChxcF90eXBlKSB7CisJY2FzZSBJQl9RUFRfWFJDX0lOSToKKwkJcmV0dXJuIG1hc2sgJiB+KElCX1FQX01BWF9ERVNUX1JEX0FUT01JQyB8IElCX1FQX01JTl9STlJfVElNRVIpOworCWNhc2UgSUJfUVBUX1hSQ19UR1Q6CisJCXJldHVybiBtYXNrICYgfihJQl9RUF9NQVhfUVBfUkRfQVRPTUlDIHwgSUJfUVBfUkVUUllfQ05UIHwKKwkJCQlJQl9RUF9STlJfUkVUUlkpOworCWRlZmF1bHQ6CisJCXJldHVybiBtYXNrOworCX0KK30KKwogc3NpemVfdCBpYl91dmVyYnNfbW9kaWZ5X3FwKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKIAkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAogCQkJICAgIGludCBvdXRfbGVuKQpAQCAtMTM1Niw3ICsxODIyLDEyIEBACiAJYXR0ci0+YWx0X2FoX2F0dHIuYWhfZmxhZ3MgCSAgICA9IGNtZC5hbHRfZGVzdC5pc19nbG9iYWwgPyBJQl9BSF9HUkggOiAwOwogCWF0dHItPmFsdF9haF9hdHRyLnBvcnRfbnVtIAkgICAgPSBjbWQuYWx0X2Rlc3QucG9ydF9udW07CiAKLQlyZXQgPSBxcC0+ZGV2aWNlLT5tb2RpZnlfcXAocXAsIGF0dHIsIGNtZC5hdHRyX21hc2ssICZ1ZGF0YSk7CisJaWYgKHFwLT5yZWFsX3FwID09IHFwKSB7CisJCXJldCA9IHFwLT5kZXZpY2UtPm1vZGlmeV9xcChxcCwgYXR0ciwKKwkJCW1vZGlmeV9xcF9tYXNrKHFwLT5xcF90eXBlLCBjbWQuYXR0cl9tYXNrKSwgJnVkYXRhKTsKKwl9IGVsc2UgeworCQlyZXQgPSBpYl9tb2RpZnlfcXAocXAsIGF0dHIsIG1vZGlmeV9xcF9tYXNrKHFwLT5xcF90eXBlLCBjbWQuYXR0cl9tYXNrKSk7CisJfQogCiAJcHV0X3FwX3JlYWQocXApOwogCkBAIC0xNTUzLDcgKzIwMjQsNyBAQAogCX0KIAogCXJlc3AuYmFkX3dyID0gMDsKLQlyZXQgPSBxcC0+ZGV2aWNlLT5wb3N0X3NlbmQocXAsIHdyLCAmYmFkX3dyKTsKKwlyZXQgPSBxcC0+ZGV2aWNlLT5wb3N0X3NlbmQocXAtPnJlYWxfcXAsIHdyLCAmYmFkX3dyKTsKIAlpZiAocmV0KQogCQlmb3IgKG5leHQgPSB3cjsgbmV4dDsgbmV4dCA9IG5leHQtPm5leHQpIHsKIAkJCSsrcmVzcC5iYWRfd3I7CkBAIC0xNjkxLDcgKzIxNjIsNyBAQAogCQlnb3RvIG91dDsKIAogCXJlc3AuYmFkX3dyID0gMDsKLQlyZXQgPSBxcC0+ZGV2aWNlLT5wb3N0X3JlY3YocXAsIHdyLCAmYmFkX3dyKTsKKwlyZXQgPSBxcC0+ZGV2aWNlLT5wb3N0X3JlY3YocXAtPnJlYWxfcXAsIHdyLCAmYmFkX3dyKTsKIAogCXB1dF9xcF9yZWFkKHFwKTsKIApAQCAtMTk3NSwxNyArMjQ0NiwxODAgQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOwogfQogCitpbnQgX191dmVyYnNfY3JlYXRlX3hzcnEoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJIHN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3hzcnEgKmNtZCwKKwkJCSBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKQoreworCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3NycV9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VzcnFfb2JqZWN0ICAgICAgICAgICAqb2JqOworCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICAgICAgKnBkOworCXN0cnVjdCBpYl9zcnEgICAgICAgICAgICAgICAgICAgKnNycTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAgICAgICp1bmluaXRpYWxpemVkX3Zhcih4cmNkX3VvYmopOworCXN0cnVjdCBpYl9zcnFfaW5pdF9hdHRyICAgICAgICAgIGF0dHI7CisJaW50IHJldDsKKworCW9iaiA9IGttYWxsb2Moc2l6ZW9mICpvYmosIEdGUF9LRVJORUwpOworCWlmICghb2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRfdW9iaigmb2JqLT51ZXZlbnQudW9iamVjdCwgY21kLT51c2VyX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsICZzcnFfbG9ja19rZXkpOworCWRvd25fd3JpdGUoJm9iai0+dWV2ZW50LnVvYmplY3QubXV0ZXgpOworCisJcGQgID0gaWRyX3JlYWRfcGQoY21kLT5wZF9oYW5kbGUsIGZpbGUtPnVjb250ZXh0KTsKKwlpZiAoIXBkKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChjbWQtPnNycV90eXBlID09IElCX1NSUVRfWFJDKSB7CisJCWF0dHIuZXh0LnhyYy5jcSAgPSBpZHJfcmVhZF9jcShjbWQtPmNxX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsIDApOworCQlpZiAoIWF0dHIuZXh0LnhyYy5jcSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3B1dF9wZDsKKwkJfQorCisJCWF0dHIuZXh0LnhyYy54cmNkICA9IGlkcl9yZWFkX3hyY2QoY21kLT54cmNkX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsICZ4cmNkX3VvYmopOworCQlpZiAoIWF0dHIuZXh0LnhyYy54cmNkKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfcHV0X2NxOworCQl9CisKKwkJb2JqLT51eHJjZCA9IGNvbnRhaW5lcl9vZih4cmNkX3VvYmosIHN0cnVjdCBpYl91eHJjZF9vYmplY3QsIHVvYmplY3QpOworCQlhdG9taWNfaW5jKCZvYmotPnV4cmNkLT5yZWZjbnQpOworCX0KKworCWF0dHIuZXZlbnRfaGFuZGxlciAgPSBpYl91dmVyYnNfc3JxX2V2ZW50X2hhbmRsZXI7CisJYXR0ci5zcnFfY29udGV4dCAgICA9IGZpbGU7CisJYXR0ci5zcnFfdHlwZSAgICAgICA9IGNtZC0+c3JxX3R5cGU7CisJYXR0ci5hdHRyLm1heF93ciAgICA9IGNtZC0+bWF4X3dyOworCWF0dHIuYXR0ci5tYXhfc2dlICAgPSBjbWQtPm1heF9zZ2U7CisJYXR0ci5hdHRyLnNycV9saW1pdCA9IGNtZC0+c3JxX2xpbWl0OworCisJb2JqLT51ZXZlbnQuZXZlbnRzX3JlcG9ydGVkID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmb2JqLT51ZXZlbnQuZXZlbnRfbGlzdCk7CisKKwlzcnEgPSBwZC0+ZGV2aWNlLT5jcmVhdGVfc3JxKHBkLCAmYXR0ciwgdWRhdGEpOworCWlmIChJU19FUlIoc3JxKSkgeworCQlyZXQgPSBQVFJfRVJSKHNycSk7CisJCWdvdG8gZXJyX3B1dDsKKwl9CisKKwlzcnEtPmRldmljZSAgICAgICAgPSBwZC0+ZGV2aWNlOworCXNycS0+cGQgICAgICAgICAgICA9IHBkOworCXNycS0+c3JxX3R5cGUJICAgPSBjbWQtPnNycV90eXBlOworCXNycS0+dW9iamVjdCAgICAgICA9ICZvYmotPnVldmVudC51b2JqZWN0OworCXNycS0+ZXZlbnRfaGFuZGxlciA9IGF0dHIuZXZlbnRfaGFuZGxlcjsKKwlzcnEtPnNycV9jb250ZXh0ICAgPSBhdHRyLnNycV9jb250ZXh0OworCisJaWYgKGNtZC0+c3JxX3R5cGUgPT0gSUJfU1JRVF9YUkMpIHsKKwkJc3JxLT5leHQueHJjLmNxICAgPSBhdHRyLmV4dC54cmMuY3E7CisJCXNycS0+ZXh0LnhyYy54cmNkID0gYXR0ci5leHQueHJjLnhyY2Q7CisJCWF0b21pY19pbmMoJmF0dHIuZXh0LnhyYy5jcS0+dXNlY250KTsKKwkJYXRvbWljX2luYygmYXR0ci5leHQueHJjLnhyY2QtPnVzZWNudCk7CisJfQorCisJYXRvbWljX2luYygmcGQtPnVzZWNudCk7CisJYXRvbWljX3NldCgmc3JxLT51c2VjbnQsIDApOworCisJb2JqLT51ZXZlbnQudW9iamVjdC5vYmplY3QgPSBzcnE7CisJcmV0ID0gaWRyX2FkZF91b2JqKCZpYl91dmVyYnNfc3JxX2lkciwgJm9iai0+dWV2ZW50LnVvYmplY3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rlc3Ryb3k7CisKKwltZW1zZXQoJnJlc3AsIDAsIHNpemVvZiByZXNwKTsKKwlyZXNwLnNycV9oYW5kbGUgPSBvYmotPnVldmVudC51b2JqZWN0LmlkOworCXJlc3AubWF4X3dyICAgICA9IGF0dHIuYXR0ci5tYXhfd3I7CisJcmVzcC5tYXhfc2dlICAgID0gYXR0ci5hdHRyLm1heF9zZ2U7CisJaWYgKGNtZC0+c3JxX3R5cGUgPT0gSUJfU1JRVF9YUkMpCisJCXJlc3Auc3JxbiA9IHNycS0+ZXh0LnhyYy5zcnFfbnVtOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC0+cmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZiByZXNwKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycl9jb3B5OworCX0KKworCWlmIChjbWQtPnNycV90eXBlID09IElCX1NSUVRfWFJDKSB7CisJCXB1dF91b2JqX3JlYWQoeHJjZF91b2JqKTsKKwkJcHV0X2NxX3JlYWQoYXR0ci5leHQueHJjLmNxKTsKKwl9CisJcHV0X3BkX3JlYWQocGQpOworCisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJm9iai0+dWV2ZW50LnVvYmplY3QubGlzdCwgJmZpbGUtPnVjb250ZXh0LT5zcnFfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CisKKwlvYmotPnVldmVudC51b2JqZWN0LmxpdmUgPSAxOworCisJdXBfd3JpdGUoJm9iai0+dWV2ZW50LnVvYmplY3QubXV0ZXgpOworCisJcmV0dXJuIDA7CisKK2Vycl9jb3B5OgorCWlkcl9yZW1vdmVfdW9iaigmaWJfdXZlcmJzX3NycV9pZHIsICZvYmotPnVldmVudC51b2JqZWN0KTsKKworZXJyX2Rlc3Ryb3k6CisJaWJfZGVzdHJveV9zcnEoc3JxKTsKKworZXJyX3B1dDoKKwlpZiAoY21kLT5zcnFfdHlwZSA9PSBJQl9TUlFUX1hSQykgeworCQlhdG9taWNfZGVjKCZvYmotPnV4cmNkLT5yZWZjbnQpOworCQlwdXRfdW9ial9yZWFkKHhyY2RfdW9iaik7CisJfQorCitlcnJfcHV0X2NxOgorCWlmIChjbWQtPnNycV90eXBlID09IElCX1NSUVRfWFJDKQorCQlwdXRfY3FfcmVhZChhdHRyLmV4dC54cmMuY3EpOworCitlcnJfcHV0X3BkOgorCXB1dF9wZF9yZWFkKHBkKTsKKworZXJyOgorCXB1dF91b2JqX3dyaXRlKCZvYmotPnVldmVudC51b2JqZWN0KTsKKwlyZXR1cm4gcmV0OworfQorCiBzc2l6ZV90IGliX3V2ZXJic19jcmVhdGVfc3JxKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKIAkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKIAkJCSAgICAgaW50IG91dF9sZW4pCiB7CiAJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfc3JxICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3hzcnEgICAgIHhjbWQ7CiAJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfc3JxX3Jlc3AgcmVzcDsKIAlzdHJ1Y3QgaWJfdWRhdGEgICAgICAgICAgICAgICAgICB1ZGF0YTsKLQlzdHJ1Y3QgaWJfdWV2ZW50X29iamVjdCAgICAgICAgICpvYmo7Ci0Jc3RydWN0IGliX3BkICAgICAgICAgICAgICAgICAgICAqcGQ7Ci0Jc3RydWN0IGliX3NycSAgICAgICAgICAgICAgICAgICAqc3JxOwotCXN0cnVjdCBpYl9zcnFfaW5pdF9hdHRyICAgICAgICAgIGF0dHI7CisJaW50IHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJeGNtZC5yZXNwb25zZQkgPSBjbWQucmVzcG9uc2U7CisJeGNtZC51c2VyX2hhbmRsZSA9IGNtZC51c2VyX2hhbmRsZTsKKwl4Y21kLnNycV90eXBlCSA9IElCX1NSUVRfQkFTSUM7CisJeGNtZC5wZF9oYW5kbGUJID0gY21kLnBkX2hhbmRsZTsKKwl4Y21kLm1heF93cgkgPSBjbWQubWF4X3dyOworCXhjbWQubWF4X3NnZQkgPSBjbWQubWF4X3NnZTsKKwl4Y21kLnNycV9saW1pdAkgPSBjbWQuc3JxX2xpbWl0OworCisJSU5JVF9VREFUQSgmdWRhdGEsIGJ1ZiArIHNpemVvZiBjbWQsCisJCSAgICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UgKyBzaXplb2YgcmVzcCwKKwkJICAgaW5fbGVuIC0gc2l6ZW9mIGNtZCwgb3V0X2xlbiAtIHNpemVvZiByZXNwKTsKKworCXJldCA9IF9fdXZlcmJzX2NyZWF0ZV94c3JxKGZpbGUsICZ4Y21kLCAmdWRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaW5fbGVuOworfQorCitzc2l6ZV90IGliX3V2ZXJic19jcmVhdGVfeHNycShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV94c3JxICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfc3JxX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgaWJfdWRhdGEgICAgICAgICAgICAgICAgICB1ZGF0YTsKIAlpbnQgcmV0OwogCiAJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKQEAgLTE5OTgsODIgKzI2MzIsMTEgQEAKIAkJICAgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSArIHNpemVvZiByZXNwLAogCQkgICBpbl9sZW4gLSBzaXplb2YgY21kLCBvdXRfbGVuIC0gc2l6ZW9mIHJlc3ApOwogCi0Jb2JqID0ga21hbGxvYyhzaXplb2YgKm9iaiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvYmopCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaW5pdF91b2JqKCZvYmotPnVvYmplY3QsIGNtZC51c2VyX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsICZzcnFfbG9ja19rZXkpOwotCWRvd25fd3JpdGUoJm9iai0+dW9iamVjdC5tdXRleCk7Ci0KLQlwZCAgPSBpZHJfcmVhZF9wZChjbWQucGRfaGFuZGxlLCBmaWxlLT51Y29udGV4dCk7Ci0JaWYgKCFwZCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlhdHRyLmV2ZW50X2hhbmRsZXIgID0gaWJfdXZlcmJzX3NycV9ldmVudF9oYW5kbGVyOwotCWF0dHIuc3JxX2NvbnRleHQgICAgPSBmaWxlOwotCWF0dHIuYXR0ci5tYXhfd3IgICAgPSBjbWQubWF4X3dyOwotCWF0dHIuYXR0ci5tYXhfc2dlICAgPSBjbWQubWF4X3NnZTsKLQlhdHRyLmF0dHIuc3JxX2xpbWl0ID0gY21kLnNycV9saW1pdDsKLQotCW9iai0+ZXZlbnRzX3JlcG9ydGVkICAgICA9IDA7Ci0JSU5JVF9MSVNUX0hFQUQoJm9iai0+ZXZlbnRfbGlzdCk7Ci0KLQlzcnEgPSBwZC0+ZGV2aWNlLT5jcmVhdGVfc3JxKHBkLCAmYXR0ciwgJnVkYXRhKTsKLQlpZiAoSVNfRVJSKHNycSkpIHsKLQkJcmV0ID0gUFRSX0VSUihzcnEpOwotCQlnb3RvIGVycl9wdXQ7Ci0JfQotCi0Jc3JxLT5kZXZpY2UgICAgCSAgID0gcGQtPmRldmljZTsKLQlzcnEtPnBkICAgICAgICAJICAgPSBwZDsKLQlzcnEtPnVvYmplY3QgICAgICAgPSAmb2JqLT51b2JqZWN0OwotCXNycS0+ZXZlbnRfaGFuZGxlciA9IGF0dHIuZXZlbnRfaGFuZGxlcjsKLQlzcnEtPnNycV9jb250ZXh0ICAgPSBhdHRyLnNycV9jb250ZXh0OwotCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOwotCWF0b21pY19zZXQoJnNycS0+dXNlY250LCAwKTsKLQotCW9iai0+dW9iamVjdC5vYmplY3QgPSBzcnE7Ci0JcmV0ID0gaWRyX2FkZF91b2JqKCZpYl91dmVyYnNfc3JxX2lkciwgJm9iai0+dW9iamVjdCk7CisJcmV0ID0gX191dmVyYnNfY3JlYXRlX3hzcnEoZmlsZSwgJmNtZCwgJnVkYXRhKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl9kZXN0cm95OwotCi0JbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7Ci0JcmVzcC5zcnFfaGFuZGxlID0gb2JqLT51b2JqZWN0LmlkOwotCXJlc3AubWF4X3dyICAgICA9IGF0dHIuYXR0ci5tYXhfd3I7Ci0JcmVzcC5tYXhfc2dlICAgID0gYXR0ci5hdHRyLm1heF9zZ2U7Ci0KLQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAotCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBlcnJfY29weTsKLQl9Ci0KLQlwdXRfcGRfcmVhZChwZCk7Ci0KLQltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7Ci0JbGlzdF9hZGRfdGFpbCgmb2JqLT51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+c3JxX2xpc3QpOwotCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOwotCi0Jb2JqLT51b2JqZWN0LmxpdmUgPSAxOwotCi0JdXBfd3JpdGUoJm9iai0+dW9iamVjdC5tdXRleCk7CisJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gaW5fbGVuOwotCi1lcnJfY29weToKLQlpZHJfcmVtb3ZlX3VvYmooJmliX3V2ZXJic19zcnFfaWRyLCAmb2JqLT51b2JqZWN0KTsKLQotZXJyX2Rlc3Ryb3k6Ci0JaWJfZGVzdHJveV9zcnEoc3JxKTsKLQotZXJyX3B1dDoKLQlwdXRfcGRfcmVhZChwZCk7Ci0KLWVycjoKLQlwdXRfdW9ial93cml0ZSgmb2JqLT51b2JqZWN0KTsKLQlyZXR1cm4gcmV0OwogfQogCiBzc2l6ZV90IGliX3V2ZXJic19tb2RpZnlfc3JxKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCmluZGV4IDU2ODk4YjYuLjg3OTYzNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwpAQCAtNzIsNiArNzIsNyBAQAogREVGSU5FX0lEUihpYl91dmVyYnNfY3FfaWRyKTsKIERFRklORV9JRFIoaWJfdXZlcmJzX3FwX2lkcik7CiBERUZJTkVfSURSKGliX3V2ZXJic19zcnFfaWRyKTsKK0RFRklORV9JRFIoaWJfdXZlcmJzX3hyY2RfaWRyKTsKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhtYXBfbG9jayk7CiBzdGF0aWMgREVDTEFSRV9CSVRNQVAoZGV2X21hcCwgSUJfVVZFUkJTX01BWF9ERVZJQ0VTKTsKQEAgLTEwNyw2ICsxMDgsMTAgQEAKIAlbSUJfVVNFUl9WRVJCU19DTURfTU9ESUZZX1NSUV0JCT0gaWJfdXZlcmJzX21vZGlmeV9zcnEsCiAJW0lCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1NSUV0JCT0gaWJfdXZlcmJzX3F1ZXJ5X3NycSwKIAlbSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9TUlFdCQk9IGliX3V2ZXJic19kZXN0cm95X3NycSwKKwlbSUJfVVNFUl9WRVJCU19DTURfT1BFTl9YUkNEXQkJPSBpYl91dmVyYnNfb3Blbl94cmNkLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9DTE9TRV9YUkNEXQkJPSBpYl91dmVyYnNfY2xvc2VfeHJjZCwKKwlbSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX1hTUlFdCQk9IGliX3V2ZXJic19jcmVhdGVfeHNycSwKKwlbSUJfVVNFUl9WRVJCU19DTURfT1BFTl9RUF0JCT0gaWJfdXZlcmJzX29wZW5fcXAKIH07CiAKIHN0YXRpYyB2b2lkIGliX3V2ZXJic19hZGRfb25lKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSk7CkBAIC0yMDIsOCArMjA3LDEyIEBACiAJCQljb250YWluZXJfb2YodW9iaiwgc3RydWN0IGliX3VxcF9vYmplY3QsIHVldmVudC51b2JqZWN0KTsKIAogCQlpZHJfcmVtb3ZlX3VvYmooJmliX3V2ZXJic19xcF9pZHIsIHVvYmopOwotCQlpYl91dmVyYnNfZGV0YWNoX3VtY2FzdChxcCwgdXFwKTsKLQkJaWJfZGVzdHJveV9xcChxcCk7CisJCWlmIChxcCAhPSBxcC0+cmVhbF9xcCkgeworCQkJaWJfY2xvc2VfcXAocXApOworCQl9IGVsc2UgeworCQkJaWJfdXZlcmJzX2RldGFjaF91bWNhc3QocXAsIHVxcCk7CisJCQlpYl9kZXN0cm95X3FwKHFwKTsKKwkJfQogCQlpYl91dmVyYnNfcmVsZWFzZV91ZXZlbnQoZmlsZSwgJnVxcC0+dWV2ZW50KTsKIAkJa2ZyZWUodXFwKTsKIAl9CkBAIC0yNDEsNiArMjUwLDE4IEBACiAJCWtmcmVlKHVvYmopOwogCX0KIAorCW11dGV4X2xvY2soJmZpbGUtPmRldmljZS0+eHJjZF90cmVlX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW9iaiwgdG1wLCAmY29udGV4dC0+eHJjZF9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpYl94cmNkICp4cmNkID0gdW9iai0+b2JqZWN0OworCQlzdHJ1Y3QgaWJfdXhyY2Rfb2JqZWN0ICp1eHJjZCA9CisJCQljb250YWluZXJfb2YodW9iaiwgc3RydWN0IGliX3V4cmNkX29iamVjdCwgdW9iamVjdCk7CisKKwkJaWRyX3JlbW92ZV91b2JqKCZpYl91dmVyYnNfeHJjZF9pZHIsIHVvYmopOworCQlpYl91dmVyYnNfZGVhbGxvY194cmNkKGZpbGUtPmRldmljZSwgeHJjZCk7CisJCWtmcmVlKHV4cmNkKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5kZXZpY2UtPnhyY2RfdHJlZV9tdXRleCk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW9iaiwgdG1wLCAmY29udGV4dC0+cGRfbGlzdCwgbGlzdCkgewogCQlzdHJ1Y3QgaWJfcGQgKnBkID0gdW9iai0+b2JqZWN0OwogCkBAIC01NTcsOCArNTc4LDcgQEAKIAlpZiAoaGRyLmluX3dvcmRzICogNCAhPSBjb3VudCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaGRyLmNvbW1hbmQgPCAwCQkJCXx8Ci0JICAgIGhkci5jb21tYW5kID49IEFSUkFZX1NJWkUodXZlcmJzX2NtZF90YWJsZSkgfHwKKwlpZiAoaGRyLmNvbW1hbmQgPj0gQVJSQVlfU0laRSh1dmVyYnNfY21kX3RhYmxlKSB8fAogCSAgICAhdXZlcmJzX2NtZF90YWJsZVtoZHIuY29tbWFuZF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC03NDEsNiArNzYxLDggQEAKIAogCWtyZWZfaW5pdCgmdXZlcmJzX2Rldi0+cmVmKTsKIAlpbml0X2NvbXBsZXRpb24oJnV2ZXJic19kZXYtPmNvbXApOworCXV2ZXJic19kZXYtPnhyY2RfdHJlZSA9IFJCX1JPT1Q7CisJbXV0ZXhfaW5pdCgmdXZlcmJzX2Rldi0+eHJjZF90cmVlX211dGV4KTsKIAogCXNwaW5fbG9jaygmbWFwX2xvY2spOwogCWRldm51bSA9IGZpbmRfZmlyc3RfemVyb19iaXQoZGV2X21hcCwgSUJfVVZFUkJTX01BWF9ERVZJQ0VTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYXJzaGFsbC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21hcnNoYWxsLmMKaW5kZXggMWIxMTQ2Zi4uZTdiZWU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21hcnNoYWxsLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21hcnNoYWxsLmMKQEAgLTMwLDYgKzMwLDcgQEAKICAqIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxyZG1hL2liX21hcnNoYWxsLmg+CiAKIHZvaWQgaWJfY29weV9haF9hdHRyX3RvX3VzZXIoc3RydWN0IGliX3V2ZXJic19haF9hdHRyICpkc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdmVyYnMuYwppbmRleCBhZjdhOGIwLi42MDJiMWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3ZlcmJzLmMKQEAgLTM4LDcgKzM4LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8cmRtYS9pYl92ZXJicy5oPgogI2luY2x1ZGUgPHJkbWEvaWJfY2FjaGUuaD4KQEAgLTc3LDYgKzc5LDMxIEBACiB9CiBFWFBPUlRfU1lNQk9MKG11bHRfdG9faWJfcmF0ZSk7CiAKK2ludCBpYl9yYXRlX3RvX21icHMoZW51bSBpYl9yYXRlIHJhdGUpCit7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSBJQl9SQVRFXzJfNV9HQlBTOiByZXR1cm4gMjUwMDsKKwljYXNlIElCX1JBVEVfNV9HQlBTOiAgIHJldHVybiA1MDAwOworCWNhc2UgSUJfUkFURV8xMF9HQlBTOiAgcmV0dXJuIDEwMDAwOworCWNhc2UgSUJfUkFURV8yMF9HQlBTOiAgcmV0dXJuIDIwMDAwOworCWNhc2UgSUJfUkFURV8zMF9HQlBTOiAgcmV0dXJuIDMwMDAwOworCWNhc2UgSUJfUkFURV80MF9HQlBTOiAgcmV0dXJuIDQwMDAwOworCWNhc2UgSUJfUkFURV82MF9HQlBTOiAgcmV0dXJuIDYwMDAwOworCWNhc2UgSUJfUkFURV84MF9HQlBTOiAgcmV0dXJuIDgwMDAwOworCWNhc2UgSUJfUkFURV8xMjBfR0JQUzogcmV0dXJuIDEyMDAwMDsKKwljYXNlIElCX1JBVEVfMTRfR0JQUzogIHJldHVybiAxNDA2MjsKKwljYXNlIElCX1JBVEVfNTZfR0JQUzogIHJldHVybiA1NjI1MDsKKwljYXNlIElCX1JBVEVfMTEyX0dCUFM6IHJldHVybiAxMTI1MDA7CisJY2FzZSBJQl9SQVRFXzE2OF9HQlBTOiByZXR1cm4gMTY4NzUwOworCWNhc2UgSUJfUkFURV8yNV9HQlBTOiAgcmV0dXJuIDI1NzgxOworCWNhc2UgSUJfUkFURV8xMDBfR0JQUzogcmV0dXJuIDEwMzEyNTsKKwljYXNlIElCX1JBVEVfMjAwX0dCUFM6IHJldHVybiAyMDYyNTA7CisJY2FzZSBJQl9SQVRFXzMwMF9HQlBTOiByZXR1cm4gMzA5Mzc1OworCWRlZmF1bHQ6CSAgICAgICByZXR1cm4gLTE7CisJfQorfQorRVhQT1JUX1NZTUJPTChpYl9yYXRlX3RvX21icHMpOworCiBlbnVtIHJkbWFfdHJhbnNwb3J0X3R5cGUKIHJkbWFfbm9kZV9nZXRfdHJhbnNwb3J0KGVudW0gcmRtYV9ub2RlX3R5cGUgbm9kZV90eXBlKQogewpAQCAtMjUwLDYgKzI3NywxMyBAQAogCQlzcnEtPnVvYmplY3QgICAgICAgPSBOVUxMOwogCQlzcnEtPmV2ZW50X2hhbmRsZXIgPSBzcnFfaW5pdF9hdHRyLT5ldmVudF9oYW5kbGVyOwogCQlzcnEtPnNycV9jb250ZXh0ICAgPSBzcnFfaW5pdF9hdHRyLT5zcnFfY29udGV4dDsKKwkJc3JxLT5zcnFfdHlwZSAgICAgID0gc3JxX2luaXRfYXR0ci0+c3JxX3R5cGU7CisJCWlmIChzcnEtPnNycV90eXBlID09IElCX1NSUVRfWFJDKSB7CisJCQlzcnEtPmV4dC54cmMueHJjZCA9IHNycV9pbml0X2F0dHItPmV4dC54cmMueHJjZDsKKwkJCXNycS0+ZXh0LnhyYy5jcSAgID0gc3JxX2luaXRfYXR0ci0+ZXh0LnhyYy5jcTsKKwkJCWF0b21pY19pbmMoJnNycS0+ZXh0LnhyYy54cmNkLT51c2VjbnQpOworCQkJYXRvbWljX2luYygmc3JxLT5leHQueHJjLmNxLT51c2VjbnQpOworCQl9CiAJCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOwogCQlhdG9taWNfc2V0KCZzcnEtPnVzZWNudCwgMCk7CiAJfQpAQCAtMjc5LDE2ICszMTMsMjkgQEAKIGludCBpYl9kZXN0cm95X3NycShzdHJ1Y3QgaWJfc3JxICpzcnEpCiB7CiAJc3RydWN0IGliX3BkICpwZDsKKwllbnVtIGliX3NycV90eXBlIHNycV90eXBlOworCXN0cnVjdCBpYl94cmNkICp1bmluaXRpYWxpemVkX3Zhcih4cmNkKTsKKwlzdHJ1Y3QgaWJfY3EgKnVuaW5pdGlhbGl6ZWRfdmFyKGNxKTsKIAlpbnQgcmV0OwogCiAJaWYgKGF0b21pY19yZWFkKCZzcnEtPnVzZWNudCkpCiAJCXJldHVybiAtRUJVU1k7CiAKIAlwZCA9IHNycS0+cGQ7CisJc3JxX3R5cGUgPSBzcnEtPnNycV90eXBlOworCWlmIChzcnFfdHlwZSA9PSBJQl9TUlFUX1hSQykgeworCQl4cmNkID0gc3JxLT5leHQueHJjLnhyY2Q7CisJCWNxID0gc3JxLT5leHQueHJjLmNxOworCX0KIAogCXJldCA9IHNycS0+ZGV2aWNlLT5kZXN0cm95X3NycShzcnEpOwotCWlmICghcmV0KQorCWlmICghcmV0KSB7CiAJCWF0b21pY19kZWMoJnBkLT51c2VjbnQpOworCQlpZiAoc3JxX3R5cGUgPT0gSUJfU1JRVF9YUkMpIHsKKwkJCWF0b21pY19kZWMoJnhyY2QtPnVzZWNudCk7CisJCQlhdG9taWNfZGVjKCZjcS0+dXNlY250KTsKKwkJfQorCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC0yOTYsMjggKzM0MywxMjMgQEAKIAogLyogUXVldWUgcGFpcnMgKi8KIAorc3RhdGljIHZvaWQgX19pYl9zaGFyZWRfcXBfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaWJfZXZlbnQgKmV2ZW50LCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBpYl9xcCAqcXAgPSBjb250ZXh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudC0+ZWxlbWVudC5xcCwgJnFwLT5vcGVuX2xpc3QsIG9wZW5fbGlzdCkKKwkJZXZlbnQtPmVsZW1lbnQucXAtPmV2ZW50X2hhbmRsZXIoZXZlbnQsIGV2ZW50LT5lbGVtZW50LnFwLT5xcF9jb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQgX19pYl9pbnNlcnRfeHJjZF9xcChzdHJ1Y3QgaWJfeHJjZCAqeHJjZCwgc3RydWN0IGliX3FwICpxcCkKK3sKKwltdXRleF9sb2NrKCZ4cmNkLT50Z3RfcXBfbXV0ZXgpOworCWxpc3RfYWRkKCZxcC0+eHJjZF9saXN0LCAmeHJjZC0+dGd0X3FwX2xpc3QpOworCW11dGV4X3VubG9jaygmeHJjZC0+dGd0X3FwX211dGV4KTsKK30KKworc3RhdGljIHN0cnVjdCBpYl9xcCAqX19pYl9vcGVuX3FwKHN0cnVjdCBpYl9xcCAqcmVhbF9xcCwKKwkJCQkgIHZvaWQgKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgaWJfZXZlbnQgKiwgdm9pZCAqKSwKKwkJCQkgIHZvaWQgKnFwX2NvbnRleHQpCit7CisJc3RydWN0IGliX3FwICpxcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcXAgPSBremFsbG9jKHNpemVvZiAqcXAsIEdGUF9LRVJORUwpOworCWlmICghcXApCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcXAtPnJlYWxfcXAgPSByZWFsX3FwOworCWF0b21pY19pbmMoJnJlYWxfcXAtPnVzZWNudCk7CisJcXAtPmRldmljZSA9IHJlYWxfcXAtPmRldmljZTsKKwlxcC0+ZXZlbnRfaGFuZGxlciA9IGV2ZW50X2hhbmRsZXI7CisJcXAtPnFwX2NvbnRleHQgPSBxcF9jb250ZXh0OworCXFwLT5xcF9udW0gPSByZWFsX3FwLT5xcF9udW07CisJcXAtPnFwX3R5cGUgPSByZWFsX3FwLT5xcF90eXBlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJlYWxfcXAtPmRldmljZS0+ZXZlbnRfaGFuZGxlcl9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJnFwLT5vcGVuX2xpc3QsICZyZWFsX3FwLT5vcGVuX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlYWxfcXAtPmRldmljZS0+ZXZlbnRfaGFuZGxlcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcXA7Cit9CisKK3N0cnVjdCBpYl9xcCAqaWJfb3Blbl9xcChzdHJ1Y3QgaWJfeHJjZCAqeHJjZCwKKwkJCSBzdHJ1Y3QgaWJfcXBfb3Blbl9hdHRyICpxcF9vcGVuX2F0dHIpCit7CisJc3RydWN0IGliX3FwICpxcCwgKnJlYWxfcXA7CisKKwlpZiAocXBfb3Blbl9hdHRyLT5xcF90eXBlICE9IElCX1FQVF9YUkNfVEdUKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXFwID0gRVJSX1BUUigtRUlOVkFMKTsKKwltdXRleF9sb2NrKCZ4cmNkLT50Z3RfcXBfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVhbF9xcCwgJnhyY2QtPnRndF9xcF9saXN0LCB4cmNkX2xpc3QpIHsKKwkJaWYgKHJlYWxfcXAtPnFwX251bSA9PSBxcF9vcGVuX2F0dHItPnFwX251bSkgeworCQkJcXAgPSBfX2liX29wZW5fcXAocmVhbF9xcCwgcXBfb3Blbl9hdHRyLT5ldmVudF9oYW5kbGVyLAorCQkJCQkgIHFwX29wZW5fYXR0ci0+cXBfY29udGV4dCk7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnhyY2QtPnRndF9xcF9tdXRleCk7CisJcmV0dXJuIHFwOworfQorRVhQT1JUX1NZTUJPTChpYl9vcGVuX3FwKTsKKwogc3RydWN0IGliX3FwICppYl9jcmVhdGVfcXAoc3RydWN0IGliX3BkICpwZCwKIAkJCSAgIHN0cnVjdCBpYl9xcF9pbml0X2F0dHIgKnFwX2luaXRfYXR0cikKIHsKLQlzdHJ1Y3QgaWJfcXAgKnFwOworCXN0cnVjdCBpYl9xcCAqcXAsICpyZWFsX3FwOworCXN0cnVjdCBpYl9kZXZpY2UgKmRldmljZTsKIAotCXFwID0gcGQtPmRldmljZS0+Y3JlYXRlX3FwKHBkLCBxcF9pbml0X2F0dHIsIE5VTEwpOworCWRldmljZSA9IHBkID8gcGQtPmRldmljZSA6IHFwX2luaXRfYXR0ci0+eHJjZC0+ZGV2aWNlOworCXFwID0gZGV2aWNlLT5jcmVhdGVfcXAocGQsIHFwX2luaXRfYXR0ciwgTlVMTCk7CiAKIAlpZiAoIUlTX0VSUihxcCkpIHsKLQkJcXAtPmRldmljZSAgICAgCSAgPSBwZC0+ZGV2aWNlOwotCQlxcC0+cGQgICAgICAgICAJICA9IHBkOwotCQlxcC0+c2VuZF9jcSAgICAJICA9IHFwX2luaXRfYXR0ci0+c2VuZF9jcTsKLQkJcXAtPnJlY3ZfY3EgICAgCSAgPSBxcF9pbml0X2F0dHItPnJlY3ZfY3E7Ci0JCXFwLT5zcnEJICAgICAgIAkgID0gcXBfaW5pdF9hdHRyLT5zcnE7Ci0JCXFwLT51b2JqZWN0ICAgICAgID0gTlVMTDsKLQkJcXAtPmV2ZW50X2hhbmRsZXIgPSBxcF9pbml0X2F0dHItPmV2ZW50X2hhbmRsZXI7Ci0JCXFwLT5xcF9jb250ZXh0ICAgID0gcXBfaW5pdF9hdHRyLT5xcF9jb250ZXh0OwotCQlxcC0+cXBfdHlwZQkgID0gcXBfaW5pdF9hdHRyLT5xcF90eXBlOwotCQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKLQkJYXRvbWljX2luYygmcXBfaW5pdF9hdHRyLT5zZW5kX2NxLT51c2VjbnQpOwotCQlhdG9taWNfaW5jKCZxcF9pbml0X2F0dHItPnJlY3ZfY3EtPnVzZWNudCk7Ci0JCWlmIChxcF9pbml0X2F0dHItPnNycSkKLQkJCWF0b21pY19pbmMoJnFwX2luaXRfYXR0ci0+c3JxLT51c2VjbnQpOworCQlxcC0+ZGV2aWNlICAgICA9IGRldmljZTsKKwkJcXAtPnJlYWxfcXAgICAgPSBxcDsKKwkJcXAtPnVvYmplY3QgICAgPSBOVUxMOworCQlxcC0+cXBfdHlwZSAgICA9IHFwX2luaXRfYXR0ci0+cXBfdHlwZTsKKworCQlpZiAocXBfaW5pdF9hdHRyLT5xcF90eXBlID09IElCX1FQVF9YUkNfVEdUKSB7CisJCQlxcC0+ZXZlbnRfaGFuZGxlciA9IF9faWJfc2hhcmVkX3FwX2V2ZW50X2hhbmRsZXI7CisJCQlxcC0+cXBfY29udGV4dCA9IHFwOworCQkJcXAtPnBkID0gTlVMTDsKKwkJCXFwLT5zZW5kX2NxID0gcXAtPnJlY3ZfY3EgPSBOVUxMOworCQkJcXAtPnNycSA9IE5VTEw7CisJCQlxcC0+eHJjZCA9IHFwX2luaXRfYXR0ci0+eHJjZDsKKwkJCWF0b21pY19pbmMoJnFwX2luaXRfYXR0ci0+eHJjZC0+dXNlY250KTsKKwkJCUlOSVRfTElTVF9IRUFEKCZxcC0+b3Blbl9saXN0KTsKKwkJCWF0b21pY19zZXQoJnFwLT51c2VjbnQsIDApOworCisJCQlyZWFsX3FwID0gcXA7CisJCQlxcCA9IF9faWJfb3Blbl9xcChyZWFsX3FwLCBxcF9pbml0X2F0dHItPmV2ZW50X2hhbmRsZXIsCisJCQkJCSAgcXBfaW5pdF9hdHRyLT5xcF9jb250ZXh0KTsKKwkJCWlmICghSVNfRVJSKHFwKSkKKwkJCQlfX2liX2luc2VydF94cmNkX3FwKHFwX2luaXRfYXR0ci0+eHJjZCwgcmVhbF9xcCk7CisJCQllbHNlCisJCQkJcmVhbF9xcC0+ZGV2aWNlLT5kZXN0cm95X3FwKHJlYWxfcXApOworCQl9IGVsc2UgeworCQkJcXAtPmV2ZW50X2hhbmRsZXIgPSBxcF9pbml0X2F0dHItPmV2ZW50X2hhbmRsZXI7CisJCQlxcC0+cXBfY29udGV4dCA9IHFwX2luaXRfYXR0ci0+cXBfY29udGV4dDsKKwkJCWlmIChxcF9pbml0X2F0dHItPnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19JTkkpIHsKKwkJCQlxcC0+cmVjdl9jcSA9IE5VTEw7CisJCQkJcXAtPnNycSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXFwLT5yZWN2X2NxID0gcXBfaW5pdF9hdHRyLT5yZWN2X2NxOworCQkJCWF0b21pY19pbmMoJnFwX2luaXRfYXR0ci0+cmVjdl9jcS0+dXNlY250KTsKKwkJCQlxcC0+c3JxID0gcXBfaW5pdF9hdHRyLT5zcnE7CisJCQkJaWYgKHFwLT5zcnEpCisJCQkJCWF0b21pY19pbmMoJnFwX2luaXRfYXR0ci0+c3JxLT51c2VjbnQpOworCQkJfQorCisJCQlxcC0+cGQJICAgID0gcGQ7CisJCQlxcC0+c2VuZF9jcSA9IHFwX2luaXRfYXR0ci0+c2VuZF9jcTsKKwkJCXFwLT54cmNkICAgID0gTlVMTDsKKworCQkJYXRvbWljX2luYygmcGQtPnVzZWNudCk7CisJCQlhdG9taWNfaW5jKCZxcF9pbml0X2F0dHItPnNlbmRfY3EtPnVzZWNudCk7CisJCX0KIAl9CiAKIAlyZXR1cm4gcXA7CkBAIC0zMjYsOCArNDY4LDggQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJaW50CQkJdmFsaWQ7Ci0JZW51bSBpYl9xcF9hdHRyX21hc2sJcmVxX3BhcmFtW0lCX1FQVF9SQVdfRVRIRVJUWVBFICsgMV07Ci0JZW51bSBpYl9xcF9hdHRyX21hc2sJb3B0X3BhcmFtW0lCX1FQVF9SQVdfRVRIRVJUWVBFICsgMV07CisJZW51bSBpYl9xcF9hdHRyX21hc2sJcmVxX3BhcmFtW0lCX1FQVF9NQVhdOworCWVudW0gaWJfcXBfYXR0cl9tYXNrCW9wdF9wYXJhbVtJQl9RUFRfTUFYXTsKIH0gcXBfc3RhdGVfdGFibGVbSUJfUVBTX0VSUiArIDFdW0lCX1FQU19FUlIgKyAxXSA9IHsKIAlbSUJfUVBTX1JFU0VUXSA9IHsKIAkJW0lCX1FQU19SRVNFVF0gPSB7IC52YWxpZCA9IDEgfSwKQEAgLTM0Myw2ICs0ODUsMTIgQEAKIAkJCQlbSUJfUVBUX1JDXSAgPSAoSUJfUVBfUEtFWV9JTkRFWAkJfAogCQkJCQkJSUJfUVBfUE9SVAkJCXwKIAkJCQkJCUlCX1FQX0FDQ0VTU19GTEFHUyksCisJCQkJW0lCX1FQVF9YUkNfSU5JXSA9IChJQl9RUF9QS0VZX0lOREVYCQl8CisJCQkJCQlJQl9RUF9QT1JUCQkJfAorCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTKSwKKwkJCQlbSUJfUVBUX1hSQ19UR1RdID0gKElCX1FQX1BLRVlfSU5ERVgJCXwKKwkJCQkJCUlCX1FQX1BPUlQJCQl8CisJCQkJCQlJQl9RUF9BQ0NFU1NfRkxBR1MpLAogCQkJCVtJQl9RUFRfU01JXSA9IChJQl9RUF9QS0VZX0lOREVYCQl8CiAJCQkJCQlJQl9RUF9RS0VZKSwKIAkJCQlbSUJfUVBUX0dTSV0gPSAoSUJfUVBfUEtFWV9JTkRFWAkJfApAQCAtMzY1LDYgKzUxMywxMiBAQAogCQkJCVtJQl9RUFRfUkNdICA9IChJQl9RUF9QS0VZX0lOREVYCQl8CiAJCQkJCQlJQl9RUF9QT1JUCQkJfAogCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTKSwKKwkJCQlbSUJfUVBUX1hSQ19JTkldID0gKElCX1FQX1BLRVlfSU5ERVgJCXwKKwkJCQkJCUlCX1FQX1BPUlQJCQl8CisJCQkJCQlJQl9RUF9BQ0NFU1NfRkxBR1MpLAorCQkJCVtJQl9RUFRfWFJDX1RHVF0gPSAoSUJfUVBfUEtFWV9JTkRFWAkJfAorCQkJCQkJSUJfUVBfUE9SVAkJCXwKKwkJCQkJCUlCX1FQX0FDQ0VTU19GTEFHUyksCiAJCQkJW0lCX1FQVF9TTUldID0gKElCX1FQX1BLRVlfSU5ERVgJCXwKIAkJCQkJCUlCX1FQX1FLRVkpLAogCQkJCVtJQl9RUFRfR1NJXSA9IChJQl9RUF9QS0VZX0lOREVYCQl8CkBAIC0zODQsNiArNTM4LDE2IEBACiAJCQkJCQlJQl9RUF9SUV9QU04JCQl8CiAJCQkJCQlJQl9RUF9NQVhfREVTVF9SRF9BVE9NSUMJfAogCQkJCQkJSUJfUVBfTUlOX1JOUl9USU1FUiksCisJCQkJW0lCX1FQVF9YUkNfSU5JXSA9IChJQl9RUF9BVgkJCXwKKwkJCQkJCUlCX1FQX1BBVEhfTVRVCQkJfAorCQkJCQkJSUJfUVBfREVTVF9RUE4JCQl8CisJCQkJCQlJQl9RUF9SUV9QU04pLAorCQkJCVtJQl9RUFRfWFJDX1RHVF0gPSAoSUJfUVBfQVYJCQl8CisJCQkJCQlJQl9RUF9QQVRIX01UVQkJCXwKKwkJCQkJCUlCX1FQX0RFU1RfUVBOCQkJfAorCQkJCQkJSUJfUVBfUlFfUFNOCQkJfAorCQkJCQkJSUJfUVBfTUFYX0RFU1RfUkRfQVRPTUlDCXwKKwkJCQkJCUlCX1FQX01JTl9STlJfVElNRVIpLAogCQkJfSwKIAkJCS5vcHRfcGFyYW0gPSB7CiAJCQkJIFtJQl9RUFRfVURdICA9IChJQl9RUF9QS0VZX0lOREVYCQl8CkBAIC0zOTQsNiArNTU4LDEyIEBACiAJCQkJIFtJQl9RUFRfUkNdICA9IChJQl9RUF9BTFRfUEFUSAkJCXwKIAkJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MJCXwKIAkJCQkJCSBJQl9RUF9QS0VZX0lOREVYKSwKKwkJCQkgW0lCX1FQVF9YUkNfSU5JXSA9IChJQl9RUF9BTFRfUEFUSAkJfAorCQkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUwkJfAorCQkJCQkJIElCX1FQX1BLRVlfSU5ERVgpLAorCQkJCSBbSUJfUVBUX1hSQ19UR1RdID0gKElCX1FQX0FMVF9QQVRICQl8CisJCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CisJCQkJCQkgSUJfUVBfUEtFWV9JTkRFWCksCiAJCQkJIFtJQl9RUFRfU01JXSA9IChJQl9RUF9QS0VZX0lOREVYCQl8CiAJCQkJCQkgSUJfUVBfUUtFWSksCiAJCQkJIFtJQl9RUFRfR1NJXSA9IChJQl9RUF9QS0VZX0lOREVYCQl8CkBAIC00MTQsNiArNTg0LDEzIEBACiAJCQkJCQlJQl9RUF9STlJfUkVUUlkJCQl8CiAJCQkJCQlJQl9RUF9TUV9QU04JCQl8CiAJCQkJCQlJQl9RUF9NQVhfUVBfUkRfQVRPTUlDKSwKKwkJCQlbSUJfUVBUX1hSQ19JTkldID0gKElCX1FQX1RJTUVPVVQJCXwKKwkJCQkJCUlCX1FQX1JFVFJZX0NOVAkJCXwKKwkJCQkJCUlCX1FQX1JOUl9SRVRSWQkJCXwKKwkJCQkJCUlCX1FQX1NRX1BTTgkJCXwKKwkJCQkJCUlCX1FQX01BWF9RUF9SRF9BVE9NSUMpLAorCQkJCVtJQl9RUFRfWFJDX1RHVF0gPSAoSUJfUVBfVElNRU9VVAkJfAorCQkJCQkJSUJfUVBfU1FfUFNOKSwKIAkJCQlbSUJfUVBUX1NNSV0gPSBJQl9RUF9TUV9QU04sCiAJCQkJW0lCX1FQVF9HU0ldID0gSUJfUVBfU1FfUFNOLAogCQkJfSwKQEAgLTQyOSw2ICs2MDYsMTUgQEAKIAkJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MJCXwKIAkJCQkJCSBJQl9RUF9NSU5fUk5SX1RJTUVSCQl8CiAJCQkJCQkgSUJfUVBfUEFUSF9NSUdfU1RBVEUpLAorCQkJCSBbSUJfUVBUX1hSQ19JTkldID0gKElCX1FQX0NVUl9TVEFURQkJfAorCQkJCQkJIElCX1FQX0FMVF9QQVRICQkJfAorCQkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUwkJfAorCQkJCQkJIElCX1FQX1BBVEhfTUlHX1NUQVRFKSwKKwkJCQkgW0lCX1FQVF9YUkNfVEdUXSA9IChJQl9RUF9DVVJfU1RBVEUJCXwKKwkJCQkJCSBJQl9RUF9BTFRfUEFUSAkJCXwKKwkJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MJCXwKKwkJCQkJCSBJQl9RUF9NSU5fUk5SX1RJTUVSCQl8CisJCQkJCQkgSUJfUVBfUEFUSF9NSUdfU1RBVEUpLAogCQkJCSBbSUJfUVBUX1NNSV0gPSAoSUJfUVBfQ1VSX1NUQVRFCQl8CiAJCQkJCQkgSUJfUVBfUUtFWSksCiAJCQkJIFtJQl9RUFRfR1NJXSA9IChJQl9RUF9DVVJfU1RBVEUJCXwKQEAgLTQ1Myw2ICs2MzksMTUgQEAKIAkJCQkJCUlCX1FQX0FMVF9QQVRICQkJfAogCQkJCQkJSUJfUVBfUEFUSF9NSUdfU1RBVEUJCXwKIAkJCQkJCUlCX1FQX01JTl9STlJfVElNRVIpLAorCQkJCVtJQl9RUFRfWFJDX0lOSV0gPSAoSUJfUVBfQ1VSX1NUQVRFCQl8CisJCQkJCQlJQl9RUF9BQ0NFU1NfRkxBR1MJCXwKKwkJCQkJCUlCX1FQX0FMVF9QQVRICQkJfAorCQkJCQkJSUJfUVBfUEFUSF9NSUdfU1RBVEUpLAorCQkJCVtJQl9RUFRfWFJDX1RHVF0gPSAoSUJfUVBfQ1VSX1NUQVRFCQl8CisJCQkJCQlJQl9RUF9BQ0NFU1NfRkxBR1MJCXwKKwkJCQkJCUlCX1FQX0FMVF9QQVRICQkJfAorCQkJCQkJSUJfUVBfUEFUSF9NSUdfU1RBVEUJCXwKKwkJCQkJCUlCX1FQX01JTl9STlJfVElNRVIpLAogCQkJCVtJQl9RUFRfU01JXSA9IChJQl9RUF9DVVJfU1RBVEUJCQl8CiAJCQkJCQlJQl9RUF9RS0VZKSwKIAkJCQlbSUJfUVBUX0dTSV0gPSAoSUJfUVBfQ1VSX1NUQVRFCQkJfApAQCAtNDY1LDYgKzY2MCw4IEBACiAJCQkJW0lCX1FQVF9VRF0gID0gSUJfUVBfRU5fU1FEX0FTWU5DX05PVElGWSwKIAkJCQlbSUJfUVBUX1VDXSAgPSBJQl9RUF9FTl9TUURfQVNZTkNfTk9USUZZLAogCQkJCVtJQl9RUFRfUkNdICA9IElCX1FQX0VOX1NRRF9BU1lOQ19OT1RJRlksCisJCQkJW0lCX1FQVF9YUkNfSU5JXSA9IElCX1FQX0VOX1NRRF9BU1lOQ19OT1RJRlksCisJCQkJW0lCX1FQVF9YUkNfVEdUXSA9IElCX1FQX0VOX1NRRF9BU1lOQ19OT1RJRlksIC8qID8/PyAqLwogCQkJCVtJQl9RUFRfU01JXSA9IElCX1FQX0VOX1NRRF9BU1lOQ19OT1RJRlksCiAJCQkJW0lCX1FQVF9HU0ldID0gSUJfUVBfRU5fU1FEX0FTWU5DX05PVElGWQogCQkJfQpAQCAtNDg3LDYgKzY4NCwxNSBAQAogCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CiAJCQkJCQlJQl9RUF9NSU5fUk5SX1RJTUVSCQl8CiAJCQkJCQlJQl9RUF9QQVRIX01JR19TVEFURSksCisJCQkJW0lCX1FQVF9YUkNfSU5JXSA9IChJQl9RUF9DVVJfU1RBVEUJCXwKKwkJCQkJCUlCX1FQX0FMVF9QQVRICQkJfAorCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CisJCQkJCQlJQl9RUF9QQVRIX01JR19TVEFURSksCisJCQkJW0lCX1FQVF9YUkNfVEdUXSA9IChJQl9RUF9DVVJfU1RBVEUJCXwKKwkJCQkJCUlCX1FQX0FMVF9QQVRICQkJfAorCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CisJCQkJCQlJQl9RUF9NSU5fUk5SX1RJTUVSCQl8CisJCQkJCQlJQl9RUF9QQVRIX01JR19TVEFURSksCiAJCQkJW0lCX1FQVF9TTUldID0gKElCX1FQX0NVUl9TVEFURQkJCXwKIAkJCQkJCUlCX1FQX1FLRVkpLAogCQkJCVtJQl9RUFRfR1NJXSA9IChJQl9RUF9DVVJfU1RBVEUJCQl8CkBAIC01MTUsNiArNzIxLDI1IEBACiAJCQkJCQlJQl9RUF9QS0VZX0lOREVYCQl8CiAJCQkJCQlJQl9RUF9NSU5fUk5SX1RJTUVSCQl8CiAJCQkJCQlJQl9RUF9QQVRIX01JR19TVEFURSksCisJCQkJW0lCX1FQVF9YUkNfSU5JXSA9IChJQl9RUF9QT1JUCQkJfAorCQkJCQkJSUJfUVBfQVYJCQl8CisJCQkJCQlJQl9RUF9USU1FT1VUCQkJfAorCQkJCQkJSUJfUVBfUkVUUllfQ05UCQkJfAorCQkJCQkJSUJfUVBfUk5SX1JFVFJZCQkJfAorCQkJCQkJSUJfUVBfTUFYX1FQX1JEX0FUT01JQwkJfAorCQkJCQkJSUJfUVBfQUxUX1BBVEgJCQl8CisJCQkJCQlJQl9RUF9BQ0NFU1NfRkxBR1MJCXwKKwkJCQkJCUlCX1FQX1BLRVlfSU5ERVgJCXwKKwkJCQkJCUlCX1FQX1BBVEhfTUlHX1NUQVRFKSwKKwkJCQlbSUJfUVBUX1hSQ19UR1RdID0gKElCX1FQX1BPUlQJCQl8CisJCQkJCQlJQl9RUF9BVgkJCXwKKwkJCQkJCUlCX1FQX1RJTUVPVVQJCQl8CisJCQkJCQlJQl9RUF9NQVhfREVTVF9SRF9BVE9NSUMJfAorCQkJCQkJSUJfUVBfQUxUX1BBVEgJCQl8CisJCQkJCQlJQl9RUF9BQ0NFU1NfRkxBR1MJCXwKKwkJCQkJCUlCX1FQX1BLRVlfSU5ERVgJCXwKKwkJCQkJCUlCX1FQX01JTl9STlJfVElNRVIJCXwKKwkJCQkJCUlCX1FQX1BBVEhfTUlHX1NUQVRFKSwKIAkJCQlbSUJfUVBUX1NNSV0gPSAoSUJfUVBfUEtFWV9JTkRFWAkJfAogCQkJCQkJSUJfUVBfUUtFWSksCiAJCQkJW0lCX1FQVF9HU0ldID0gKElCX1FQX1BLRVlfSU5ERVgJCXwKQEAgLTU3OSw3ICs4MDQsNyBAQAogCQkgc3RydWN0IGliX3FwX2F0dHIgKnFwX2F0dHIsCiAJCSBpbnQgcXBfYXR0cl9tYXNrKQogewotCXJldHVybiBxcC0+ZGV2aWNlLT5tb2RpZnlfcXAocXAsIHFwX2F0dHIsIHFwX2F0dHJfbWFzaywgTlVMTCk7CisJcmV0dXJuIHFwLT5kZXZpY2UtPm1vZGlmeV9xcChxcC0+cmVhbF9xcCwgcXBfYXR0ciwgcXBfYXR0cl9tYXNrLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0woaWJfbW9kaWZ5X3FwKTsKIApAQCAtNTg5LDExICs4MTQsNTkgQEAKIAkJc3RydWN0IGliX3FwX2luaXRfYXR0ciAqcXBfaW5pdF9hdHRyKQogewogCXJldHVybiBxcC0+ZGV2aWNlLT5xdWVyeV9xcCA/Ci0JCXFwLT5kZXZpY2UtPnF1ZXJ5X3FwKHFwLCBxcF9hdHRyLCBxcF9hdHRyX21hc2ssIHFwX2luaXRfYXR0cikgOgorCQlxcC0+ZGV2aWNlLT5xdWVyeV9xcChxcC0+cmVhbF9xcCwgcXBfYXR0ciwgcXBfYXR0cl9tYXNrLCBxcF9pbml0X2F0dHIpIDoKIAkJLUVOT1NZUzsKIH0KIEVYUE9SVF9TWU1CT0woaWJfcXVlcnlfcXApOwogCitpbnQgaWJfY2xvc2VfcXAoc3RydWN0IGliX3FwICpxcCkKK3sKKwlzdHJ1Y3QgaWJfcXAgKnJlYWxfcXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJlYWxfcXAgPSBxcC0+cmVhbF9xcDsKKwlpZiAocmVhbF9xcCA9PSBxcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmVhbF9xcC0+ZGV2aWNlLT5ldmVudF9oYW5kbGVyX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmcXAtPm9wZW5fbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVhbF9xcC0+ZGV2aWNlLT5ldmVudF9oYW5kbGVyX2xvY2ssIGZsYWdzKTsKKworCWF0b21pY19kZWMoJnJlYWxfcXAtPnVzZWNudCk7CisJa2ZyZWUocXApOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGliX2Nsb3NlX3FwKTsKKworc3RhdGljIGludCBfX2liX2Rlc3Ryb3lfc2hhcmVkX3FwKHN0cnVjdCBpYl9xcCAqcXApCit7CisJc3RydWN0IGliX3hyY2QgKnhyY2Q7CisJc3RydWN0IGliX3FwICpyZWFsX3FwOworCWludCByZXQ7CisKKwlyZWFsX3FwID0gcXAtPnJlYWxfcXA7CisJeHJjZCA9IHJlYWxfcXAtPnhyY2Q7CisKKwltdXRleF9sb2NrKCZ4cmNkLT50Z3RfcXBfbXV0ZXgpOworCWliX2Nsb3NlX3FwKHFwKTsKKwlpZiAoYXRvbWljX3JlYWQoJnJlYWxfcXAtPnVzZWNudCkgPT0gMCkKKwkJbGlzdF9kZWwoJnJlYWxfcXAtPnhyY2RfbGlzdCk7CisJZWxzZQorCQlyZWFsX3FwID0gTlVMTDsKKwltdXRleF91bmxvY2soJnhyY2QtPnRndF9xcF9tdXRleCk7CisKKwlpZiAocmVhbF9xcCkgeworCQlyZXQgPSBpYl9kZXN0cm95X3FwKHJlYWxfcXApOworCQlpZiAoIXJldCkKKwkJCWF0b21pY19kZWMoJnhyY2QtPnVzZWNudCk7CisJCWVsc2UKKwkJCV9faWJfaW5zZXJ0X3hyY2RfcXAoeHJjZCwgcmVhbF9xcCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIGludCBpYl9kZXN0cm95X3FwKHN0cnVjdCBpYl9xcCAqcXApCiB7CiAJc3RydWN0IGliX3BkICpwZDsKQEAgLTYwMSwxNiArODc0LDI1IEBACiAJc3RydWN0IGliX3NycSAqc3JxOwogCWludCByZXQ7CiAKLQlwZCAgPSBxcC0+cGQ7Ci0Jc2NxID0gcXAtPnNlbmRfY3E7Ci0JcmNxID0gcXAtPnJlY3ZfY3E7Ci0Jc3JxID0gcXAtPnNycTsKKwlpZiAoYXRvbWljX3JlYWQoJnFwLT51c2VjbnQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHFwLT5yZWFsX3FwICE9IHFwKQorCQlyZXR1cm4gX19pYl9kZXN0cm95X3NoYXJlZF9xcChxcCk7CisKKwlwZCAgID0gcXAtPnBkOworCXNjcSAgPSBxcC0+c2VuZF9jcTsKKwlyY3EgID0gcXAtPnJlY3ZfY3E7CisJc3JxICA9IHFwLT5zcnE7CiAKIAlyZXQgPSBxcC0+ZGV2aWNlLT5kZXN0cm95X3FwKHFwKTsKIAlpZiAoIXJldCkgewotCQlhdG9taWNfZGVjKCZwZC0+dXNlY250KTsKLQkJYXRvbWljX2RlYygmc2NxLT51c2VjbnQpOwotCQlhdG9taWNfZGVjKCZyY3EtPnVzZWNudCk7CisJCWlmIChwZCkKKwkJCWF0b21pY19kZWMoJnBkLT51c2VjbnQpOworCQlpZiAoc2NxKQorCQkJYXRvbWljX2RlYygmc2NxLT51c2VjbnQpOworCQlpZiAocmNxKQorCQkJYXRvbWljX2RlYygmcmNxLT51c2VjbnQpOwogCQlpZiAoc3JxKQogCQkJYXRvbWljX2RlYygmc3JxLT51c2VjbnQpOwogCX0KQEAgLTkyMCwzICsxMjAyLDQyIEBACiAJcmV0dXJuIHFwLT5kZXZpY2UtPmRldGFjaF9tY2FzdChxcCwgZ2lkLCBsaWQpOwogfQogRVhQT1JUX1NZTUJPTChpYl9kZXRhY2hfbWNhc3QpOworCitzdHJ1Y3QgaWJfeHJjZCAqaWJfYWxsb2NfeHJjZChzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGliX3hyY2QgKnhyY2Q7CisKKwlpZiAoIWRldmljZS0+YWxsb2NfeHJjZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CisKKwl4cmNkID0gZGV2aWNlLT5hbGxvY194cmNkKGRldmljZSwgTlVMTCwgTlVMTCk7CisJaWYgKCFJU19FUlIoeHJjZCkpIHsKKwkJeHJjZC0+ZGV2aWNlID0gZGV2aWNlOworCQl4cmNkLT5pbm9kZSA9IE5VTEw7CisJCWF0b21pY19zZXQoJnhyY2QtPnVzZWNudCwgMCk7CisJCW11dGV4X2luaXQoJnhyY2QtPnRndF9xcF9tdXRleCk7CisJCUlOSVRfTElTVF9IRUFEKCZ4cmNkLT50Z3RfcXBfbGlzdCk7CisJfQorCisJcmV0dXJuIHhyY2Q7Cit9CitFWFBPUlRfU1lNQk9MKGliX2FsbG9jX3hyY2QpOworCitpbnQgaWJfZGVhbGxvY194cmNkKHN0cnVjdCBpYl94cmNkICp4cmNkKQoreworCXN0cnVjdCBpYl9xcCAqcXA7CisJaW50IHJldDsKKworCWlmIChhdG9taWNfcmVhZCgmeHJjZC0+dXNlY250KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmeHJjZC0+dGd0X3FwX2xpc3QpKSB7CisJCXFwID0gbGlzdF9lbnRyeSh4cmNkLT50Z3RfcXBfbGlzdC5uZXh0LCBzdHJ1Y3QgaWJfcXAsIHhyY2RfbGlzdCk7CisJCXJldCA9IGliX2Rlc3Ryb3lfcXAocXApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4geHJjZC0+ZGV2aWNlLT5kZWFsbG9jX3hyY2QoeHJjZCk7Cit9CitFWFBPUlRfU1lNQk9MKGliX2RlYWxsb2NfeHJjZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWUuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9hZS5jCmluZGV4IDI0ZjllM2EuLjMyZDM0ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9hZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9hZS5jCkBAIC0yODgsNiArMjg4LDExIEBACiAJCWNtX2V2ZW50LnByaXZhdGVfZGF0YV9sZW4gPQogCQkJYmUzMl90b19jcHUocmVxLT5wcml2YXRlX2RhdGFfbGVuZ3RoKTsKIAkJY21fZXZlbnQucHJpdmF0ZV9kYXRhID0gcmVxLT5wcml2YXRlX2RhdGE7CisJCS8qCisJCSAqIFVudGlsIGlyZC9vcmQgbmVnb3RpYXRpb24gdmlhIE1QQXYyIHN1cHBvcnQgaXMgYWRkZWQsIHNlbmQKKwkJICogbWF4IHN1cHBvcnRlZCB2YWx1ZXMKKwkJICovCisJCWNtX2V2ZW50LmlyZCA9IGNtX2V2ZW50Lm9yZCA9IDEyODsKIAogCQlpZiAoY21faWQtPmV2ZW50X2hhbmRsZXIpCiAJCQljbV9pZC0+ZXZlbnRfaGFuZGxlcihjbV9pZCwgJmNtX2V2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9pbnRyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfaW50ci5jCmluZGV4IDBlYmU0ZTguLjg5NTFkYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9pbnRyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX2ludHIuYwpAQCAtMTgzLDYgKzE4MywxMSBAQAogCWNhc2UgSVdfQ01fRVZFTlRfRVNUQUJMSVNIRUQ6CiAJCWMyX3NldF9xcF9zdGF0ZShyZXEtPnFwLAogCQkJCUMyX1FQX1NUQVRFX1JUUyk7CisJCS8qCisJCSAqIFVudGlsIGlyZC9vcmQgbmVnb3RpYXRpb24gdmlhIE1QQXYyIHN1cHBvcnQgaXMgYWRkZWQsIHNlbmQKKwkJICogbWF4IHN1cHBvcnRlZCB2YWx1ZXMKKwkJICovCisJCWNtX2V2ZW50LmlyZCA9IGNtX2V2ZW50Lm9yZCA9IDEyODsKIAljYXNlIElXX0NNX0VWRU5UX0NMT1NFOgogCiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jCmluZGV4IGYxMDFiYjcuLjEyZjkyM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jCkBAIC03NTMsMTAgKzc1Myw3IEBACiAJbWVtY3B5X2Zyb21pbyhuZXRkZXYtPmRldl9hZGRyLCBjMmRldi0+a3ZhICsgQzJfUkVHU19SRE1BX0VOQUREUiwgNik7CiAKIAkvKiBQcmludCBvdXQgdGhlIE1BQyBhZGRyZXNzICovCi0JcHJfZGVidWcoIiVzOiBNQUMgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCi0JCW5ldGRldi0+bmFtZSwKLQkJbmV0ZGV2LT5kZXZfYWRkclswXSwgbmV0ZGV2LT5kZXZfYWRkclsxXSwgbmV0ZGV2LT5kZXZfYWRkclsyXSwKLQkJbmV0ZGV2LT5kZXZfYWRkclszXSwgbmV0ZGV2LT5kZXZfYWRkcls0XSwgbmV0ZGV2LT5kZXZfYWRkcls1XSk7CisJcHJfZGVidWcoIiVzOiBNQUMgJXBNXG4iLCBuZXRkZXYtPm5hbWUsIG5ldGRldi0+ZGV2X2FkZHIpOwogCiAjaWYgMAogCS8qIERpc2FibGUgbmV0d29yayBwYWNrZXRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfY20uYwppbmRleCA2Y2Q2NDJhLi5kZTZkMDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2NtLmMKQEAgLTc1Myw2ICs3NTMsMTEgQEAKIAlldmVudC5wcml2YXRlX2RhdGFfbGVuID0gZXAtPnBsZW47CiAJZXZlbnQucHJpdmF0ZV9kYXRhID0gZXAtPm1wYV9wa3QgKyBzaXplb2Yoc3RydWN0IG1wYV9tZXNzYWdlKTsKIAlldmVudC5wcm92aWRlcl9kYXRhID0gZXA7CisJLyoKKwkgKiBVbnRpbCBpcmQvb3JkIG5lZ290aWF0aW9uIHZpYSBNUEF2MiBzdXBwb3J0IGlzIGFkZGVkLCBzZW5kIG1heAorCSAqIHN1cHBvcnRlZCB2YWx1ZXMKKwkgKi8KKwlldmVudC5pcmQgPSBldmVudC5vcmQgPSA4OwogCWlmIChzdGF0ZV9yZWFkKCZlcC0+cGFyZW50X2VwLT5jb20pICE9IERFQUQpIHsKIAkJZ2V0X2VwKCZlcC0+Y29tKTsKIAkJZXAtPnBhcmVudF9lcC0+Y29tLmNtX2lkLT5ldmVudF9oYW5kbGVyKApAQCAtNzcwLDYgKzc3NSwxMSBAQAogCVBEQkcoIiVzIGVwICVwXG4iLCBfX2Z1bmNfXywgZXApOwogCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwogCWV2ZW50LmV2ZW50ID0gSVdfQ01fRVZFTlRfRVNUQUJMSVNIRUQ7CisJLyoKKwkgKiBVbnRpbCBpcmQvb3JkIG5lZ290aWF0aW9uIHZpYSBNUEF2MiBzdXBwb3J0IGlzIGFkZGVkLCBzZW5kIG1heAorCSAqIHN1cHBvcnRlZCB2YWx1ZXMKKwkgKi8KKwlldmVudC5pcmQgPSBldmVudC5vcmQgPSA4OwogCWlmIChlcC0+Y29tLmNtX2lkKSB7CiAJCVBEQkcoIiVzIGVwICVwIHRpZCAlZFxuIiwgX19mdW5jX18sIGVwLCBlcC0+aHd0aWQpOwogCQllcC0+Y29tLmNtX2lkLT5ldmVudF9oYW5kbGVyKGVwLT5jb20uY21faWQsICZldmVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9ldi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfZXYuYwppbmRleCA3MWUwZDg0Li5hYmNjOWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9ldi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2V2LmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIAlzdHJ1Y3QgaWJfZXZlbnQgZXZlbnQ7CiAJc3RydWN0IGl3Y2hfcXBfYXR0cmlidXRlcyBhdHRyczsKIAlzdHJ1Y3QgaXdjaF9xcCAqcWhwOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAogCXNwaW5fbG9jaygmcm5pY3AtPmxvY2spOwogCXFocCA9IGdldF9xaHAocm5pY3AsIENRRV9RUElEKHJzcF9tc2ctPmNxZSkpOwpAQCAtOTQsNyArOTUsOSBAQAogCWlmIChxaHAtPmlicXAuZXZlbnRfaGFuZGxlcikKIAkJKCpxaHAtPmlicXAuZXZlbnRfaGFuZGxlcikoJmV2ZW50LCBxaHAtPmlicXAucXBfY29udGV4dCk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CiAJKCpjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmY2hwLT5pYmNxLCBjaHAtPmliY3EuY3FfY29udGV4dCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcWhwLT5yZWZjbnQpKQogCQl3YWtlX3VwKCZxaHAtPndhaXQpOwpAQCAtMTA3LDYgKzExMCw3IEBACiAJc3RydWN0IGl3Y2hfY3EgKmNocDsKIAlzdHJ1Y3QgaXdjaF9xcCAqcWhwOwogCXUzMiBjcWlkID0gUlNQUV9DUUlEKHJzcF9tc2cpOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAogCXJuaWNwID0gKHN0cnVjdCBpd2NoX2RldiAqKSByZGV2X3AtPnVscDsKIAlzcGluX2xvY2soJnJuaWNwLT5sb2NrKTsKQEAgLTE3MCw3ICsxNzQsOSBAQAogCQkgKi8KIAkJaWYgKHFocC0+ZXAgJiYgU1FfVFlQRShyc3BfbXNnLT5jcWUpKQogCQkJZHN0X2NvbmZpcm0ocWhwLT5lcC0+ZHN0KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOwogCQkoKmNocC0+aWJjcS5jb21wX2hhbmRsZXIpKCZjaHAtPmliY3EsIGNocC0+aWJjcS5jcV9jb250ZXh0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBUUFRfRVJSX1NUQUc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuYwppbmRleCBjN2Q5NDExLi4zN2MyMjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmMKQEAgLTE5MCw2ICsxOTAsNyBAQAogCWNocC0+cmhwID0gcmhwOwogCWNocC0+aWJjcS5jcWUgPSAxIDw8IGNocC0+Y3Euc2l6ZV9sb2cyOwogCXNwaW5fbG9ja19pbml0KCZjaHAtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZjaHAtPmNvbXBfaGFuZGxlcl9sb2NrKTsKIAlhdG9taWNfc2V0KCZjaHAtPnJlZmNudCwgMSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2hwLT53YWl0KTsKIAlpZiAoaW5zZXJ0X2hhbmRsZShyaHAsICZyaHAtPmNxaWRyLCBjaHAsIGNocC0+Y3EuY3FpZCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5oCmluZGV4IDlhMzQyYzkuLjg3YzE0YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuaApAQCAtMTAzLDYgKzEwMyw3IEBACiAJc3RydWN0IGl3Y2hfZGV2ICpyaHA7CiAJc3RydWN0IHQzX2NxIGNxOwogCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IGNvbXBfaGFuZGxlcl9sb2NrOwogCWF0b21pY190IHJlZmNudDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwogCXUzMiBfX3VzZXIgKnVzZXJfcnB0cl9hZGRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMKaW5kZXggZWNkMzEzZi4uYmVhNTgzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9xcC5jCkBAIC04MjIsOCArODIyLDExIEBACiAJZmx1c2hlZCA9IGN4aW9fZmx1c2hfcnEoJnFocC0+d3EsICZyY2hwLT5jcSwgY291bnQpOwogCXNwaW5fdW5sb2NrKCZxaHAtPmxvY2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjaHAtPmxvY2ssICpmbGFnKTsKLQlpZiAoZmx1c2hlZCkKKwlpZiAoZmx1c2hlZCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssICpmbGFnKTsKIAkJKCpyY2hwLT5pYmNxLmNvbXBfaGFuZGxlcikoJnJjaHAtPmliY3EsIHJjaHAtPmliY3EuY3FfY29udGV4dCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCAqZmxhZyk7CisJfQogCiAJLyogbG9ja2luZyBoaWVyYXJjaHk6IGNxIGxvY2sgZmlyc3QsIHRoZW4gcXAgbG9jay4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2NocC0+bG9jaywgKmZsYWcpOwpAQCAtODMzLDggKzgzNiwxMSBAQAogCWZsdXNoZWQgPSBjeGlvX2ZsdXNoX3NxKCZxaHAtPndxLCAmc2NocC0+Y3EsIGNvdW50KTsKIAlzcGluX3VubG9jaygmcWhwLT5sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2hwLT5sb2NrLCAqZmxhZyk7Ci0JaWYgKGZsdXNoZWQpCisJaWYgKGZsdXNoZWQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCAqZmxhZyk7CiAJCSgqc2NocC0+aWJjcS5jb21wX2hhbmRsZXIpKCZzY2hwLT5pYmNxLCBzY2hwLT5pYmNxLmNxX2NvbnRleHQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgKmZsYWcpOworCX0KIAogCS8qIGRlcmVmICovCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnFocC0+cmVmY250KSkKQEAgLTg1MywxMSArODU5LDE1IEBACiAJaWYgKHFocC0+aWJxcC51b2JqZWN0KSB7CiAJCWN4aW9fc2V0X3dxX2luX2Vycm9yKCZxaHAtPndxKTsKIAkJY3hpb19zZXRfY3FfaW5fZXJyb3IoJnJjaHAtPmNxKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCAqZmxhZyk7CiAJCSgqcmNocC0+aWJjcS5jb21wX2hhbmRsZXIpKCZyY2hwLT5pYmNxLCByY2hwLT5pYmNxLmNxX2NvbnRleHQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgKmZsYWcpOwogCQlpZiAoc2NocCAhPSByY2hwKSB7CiAJCQljeGlvX3NldF9jcV9pbl9lcnJvcigmc2NocC0+Y3EpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCAqZmxhZyk7CiAJCQkoKnNjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmc2NocC0+aWJjcSwKIAkJCQkJCSAgIHNjaHAtPmliY3EuY3FfY29udGV4dCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgKmZsYWcpOwogCQl9CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCmluZGV4IDc3Zjc2OWQuLmIzNmNkYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCkBAIC0xMDMsNyArMTAzLDggQEAKIHN0YXRpYyBpbnQgbXBhX3JldiA9IDE7CiBtb2R1bGVfcGFyYW0obXBhX3JldiwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobXBhX3JldiwgIk1QQSBSZXZpc2lvbiwgMCBzdXBwb3J0cyBhbXNvMTEwMCwgIgotCQkgIjEgaXMgc3BlYyBjb21wbGlhbnQuIChkZWZhdWx0PTEpIik7CisJCSIxIGlzIFJGQzA1NDQgc3BlYyBjb21wbGlhbnQsIDIgaXMgSUVURiBNUEEgUGVlciBDb25uZWN0IERyYWZ0IgorCQkiIGNvbXBsaWFudCAoZGVmYXVsdD0xKSIpOwogCiBzdGF0aWMgaW50IG1hcmtlcnNfZW5hYmxlZDsKIG1vZHVsZV9wYXJhbShtYXJrZXJzX2VuYWJsZWQsIGludCwgMDY0NCk7CkBAIC00OTcsMTcgKzQ5OCwyMSBAQAogCXJldHVybiBjNGl3X2wydF9zZW5kKCZlcC0+Y29tLmRldi0+cmRldiwgc2tiLCBlcC0+bDJ0KTsKIH0KIAotc3RhdGljIHZvaWQgc2VuZF9tcGFfcmVxKHN0cnVjdCBjNGl3X2VwICplcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIHNlbmRfbXBhX3JlcShzdHJ1Y3QgYzRpd19lcCAqZXAsIHN0cnVjdCBza19idWZmICpza2IsCisJCXU4IG1wYV9yZXZfdG9fdXNlKQogewogCWludCBtcGFsZW4sIHdybGVuOwogCXN0cnVjdCBmd19vZmxkX3R4X2RhdGFfd3IgKnJlcTsKIAlzdHJ1Y3QgbXBhX21lc3NhZ2UgKm1wYTsKKwlzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zIG1wYV92Ml9wYXJhbXM7CiAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXUgcGRfbGVuICVkXG4iLCBfX2Z1bmNfXywgZXAsIGVwLT5od3RpZCwgZXAtPnBsZW4pOwogCiAJQlVHX09OKHNrYl9jbG9uZWQoc2tiKSk7CiAKIAltcGFsZW4gPSBzaXplb2YoKm1wYSkgKyBlcC0+cGxlbjsKKwlpZiAobXBhX3Jldl90b191c2UgPT0gMikKKwkJbXBhbGVuICs9IHNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKTsKIAl3cmxlbiA9IHJvdW5kdXAobXBhbGVuICsgc2l6ZW9mICpyZXEsIDE2KTsKIAlza2IgPSBnZXRfc2tiKHNrYiwgd3JsZW4sIEdGUF9LRVJORUwpOwogCWlmICghc2tiKSB7CkBAIC01MzMsMTIgKzUzOCwzOSBAQAogCW1wYSA9IChzdHJ1Y3QgbXBhX21lc3NhZ2UgKikocmVxICsgMSk7CiAJbWVtY3B5KG1wYS0+a2V5LCBNUEFfS0VZX1JFUSwgc2l6ZW9mKG1wYS0+a2V5KSk7CiAJbXBhLT5mbGFncyA9IChjcmNfZW5hYmxlZCA/IE1QQV9DUkMgOiAwKSB8Ci0JCSAgICAgKG1hcmtlcnNfZW5hYmxlZCA/IE1QQV9NQVJLRVJTIDogMCk7CisJCSAgICAgKG1hcmtlcnNfZW5hYmxlZCA/IE1QQV9NQVJLRVJTIDogMCkgfAorCQkgICAgIChtcGFfcmV2X3RvX3VzZSA9PSAyID8gTVBBX0VOSEFOQ0VEX1JETUFfQ09OTiA6IDApOwogCW1wYS0+cHJpdmF0ZV9kYXRhX3NpemUgPSBodG9ucyhlcC0+cGxlbik7Ci0JbXBhLT5yZXZpc2lvbiA9IG1wYV9yZXY7CisJbXBhLT5yZXZpc2lvbiA9IG1wYV9yZXZfdG9fdXNlOworCWlmIChtcGFfcmV2X3RvX3VzZSA9PSAxKQorCQllcC0+dHJpZWRfd2l0aF9tcGFfdjEgPSAxOwogCi0JaWYgKGVwLT5wbGVuKQotCQltZW1jcHkobXBhLT5wcml2YXRlX2RhdGEsIGVwLT5tcGFfcGt0ICsgc2l6ZW9mKCptcGEpLCBlcC0+cGxlbik7CisJaWYgKG1wYV9yZXZfdG9fdXNlID09IDIpIHsKKwkJbXBhLT5wcml2YXRlX2RhdGFfc2l6ZSArPQorCQkJaHRvbnMoc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpKTsKKwkJbXBhX3YyX3BhcmFtcy5pcmQgPSBodG9ucygodTE2KWVwLT5pcmQpOworCQltcGFfdjJfcGFyYW1zLm9yZCA9IGh0b25zKCh1MTYpZXAtPm9yZCk7CisKKwkJaWYgKHBlZXIycGVlcikgeworCQkJbXBhX3YyX3BhcmFtcy5pcmQgfD0gaHRvbnMoTVBBX1YyX1BFRVIyUEVFUl9NT0RFTCk7CisJCQlpZiAocDJwX3R5cGUgPT0gRldfUklfSU5JVF9QMlBUWVBFX1JETUFfV1JJVEUpCisJCQkJbXBhX3YyX3BhcmFtcy5vcmQgfD0KKwkJCQkJaHRvbnMoTVBBX1YyX1JETUFfV1JJVEVfUlRSKTsKKwkJCWVsc2UgaWYgKHAycF90eXBlID09IEZXX1JJX0lOSVRfUDJQVFlQRV9SRUFEX1JFUSkKKwkJCQltcGFfdjJfcGFyYW1zLm9yZCB8PQorCQkJCQlodG9ucyhNUEFfVjJfUkRNQV9SRUFEX1JUUik7CisJCX0KKwkJbWVtY3B5KG1wYS0+cHJpdmF0ZV9kYXRhLCAmbXBhX3YyX3BhcmFtcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKSk7CisKKwkJaWYgKGVwLT5wbGVuKQorCQkJbWVtY3B5KG1wYS0+cHJpdmF0ZV9kYXRhICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcyksCisJCQkgICAgICAgZXAtPm1wYV9wa3QgKyBzaXplb2YoKm1wYSksIGVwLT5wbGVuKTsKKwl9IGVsc2UKKwkJaWYgKGVwLT5wbGVuKQorCQkJbWVtY3B5KG1wYS0+cHJpdmF0ZV9kYXRhLAorCQkJCQllcC0+bXBhX3BrdCArIHNpemVvZigqbXBhKSwgZXAtPnBsZW4pOwogCiAJLyoKIAkgKiBSZWZlcmVuY2UgdGhlIG1wYSBza2IuICBUaGlzIGVuc3VyZXMgdGhlIGRhdGEgYXJlYQpAQCAtNTYyLDEwICs1OTQsMTMgQEAKIAlzdHJ1Y3QgZndfb2ZsZF90eF9kYXRhX3dyICpyZXE7CiAJc3RydWN0IG1wYV9tZXNzYWdlICptcGE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zIG1wYV92Ml9wYXJhbXM7CiAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXUgcGRfbGVuICVkXG4iLCBfX2Z1bmNfXywgZXAsIGVwLT5od3RpZCwgZXAtPnBsZW4pOwogCiAJbXBhbGVuID0gc2l6ZW9mKCptcGEpICsgcGxlbjsKKwlpZiAoZXAtPm1wYV9hdHRyLnZlcnNpb24gPT0gMiAmJiBlcC0+bXBhX2F0dHIuZW5oYW5jZWRfcmRtYV9jb25uKQorCQltcGFsZW4gKz0gc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpOwogCXdybGVuID0gcm91bmR1cChtcGFsZW4gKyBzaXplb2YgKnJlcSwgMTYpOwogCiAJc2tiID0gZ2V0X3NrYihOVUxMLCB3cmxlbiwgR0ZQX0tFUk5FTCk7CkBAIC01OTUsOCArNjMwLDI5IEBACiAJbXBhLT5mbGFncyA9IE1QQV9SRUpFQ1Q7CiAJbXBhLT5yZXZpc2lvbiA9IG1wYV9yZXY7CiAJbXBhLT5wcml2YXRlX2RhdGFfc2l6ZSA9IGh0b25zKHBsZW4pOwotCWlmIChwbGVuKQotCQltZW1jcHkobXBhLT5wcml2YXRlX2RhdGEsIHBkYXRhLCBwbGVuKTsKKworCWlmIChlcC0+bXBhX2F0dHIudmVyc2lvbiA9PSAyICYmIGVwLT5tcGFfYXR0ci5lbmhhbmNlZF9yZG1hX2Nvbm4pIHsKKwkJbXBhLT5mbGFncyB8PSBNUEFfRU5IQU5DRURfUkRNQV9DT05OOworCQltcGEtPnByaXZhdGVfZGF0YV9zaXplICs9CisJCQlodG9ucyhzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcykpOworCQltcGFfdjJfcGFyYW1zLmlyZCA9IGh0b25zKCgodTE2KWVwLT5pcmQpIHwKKwkJCQkJICAocGVlcjJwZWVyID8gTVBBX1YyX1BFRVIyUEVFUl9NT0RFTCA6CisJCQkJCSAgIDApKTsKKwkJbXBhX3YyX3BhcmFtcy5vcmQgPSBodG9ucygoKHUxNillcC0+b3JkKSB8IChwZWVyMnBlZXIgPworCQkJCQkgIChwMnBfdHlwZSA9PQorCQkJCQkgICBGV19SSV9JTklUX1AyUFRZUEVfUkRNQV9XUklURSA/CisJCQkJCSAgIE1QQV9WMl9SRE1BX1dSSVRFX1JUUiA6IHAycF90eXBlID09CisJCQkJCSAgIEZXX1JJX0lOSVRfUDJQVFlQRV9SRUFEX1JFUSA/CisJCQkJCSAgIE1QQV9WMl9SRE1BX1JFQURfUlRSIDogMCkgOiAwKSk7CisJCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSwgJm1wYV92Ml9wYXJhbXMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcykpOworCisJCWlmIChlcC0+cGxlbikKKwkJCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSArCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpLCBwZGF0YSwgcGxlbik7CisJfSBlbHNlCisJCWlmIChwbGVuKQorCQkJbWVtY3B5KG1wYS0+cHJpdmF0ZV9kYXRhLCBwZGF0YSwgcGxlbik7CiAKIAkvKgogCSAqIFJlZmVyZW5jZSB0aGUgbXBhIHNrYiBhZ2Fpbi4gIFRoaXMgZW5zdXJlcyB0aGUgZGF0YSBhcmVhCkBAIC02MTcsMTAgKzY3MywxMyBAQAogCXN0cnVjdCBmd19vZmxkX3R4X2RhdGFfd3IgKnJlcTsKIAlzdHJ1Y3QgbXBhX21lc3NhZ2UgKm1wYTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMgbXBhX3YyX3BhcmFtczsKIAogCVBEQkcoIiVzIGVwICVwIHRpZCAldSBwZF9sZW4gJWRcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkLCBlcC0+cGxlbik7CiAKIAltcGFsZW4gPSBzaXplb2YoKm1wYSkgKyBwbGVuOworCWlmIChlcC0+bXBhX2F0dHIudmVyc2lvbiA9PSAyICYmIGVwLT5tcGFfYXR0ci5lbmhhbmNlZF9yZG1hX2Nvbm4pCisJCW1wYWxlbiArPSBzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcyk7CiAJd3JsZW4gPSByb3VuZHVwKG1wYWxlbiArIHNpemVvZiAqcmVxLCAxNik7CiAKIAlza2IgPSBnZXRfc2tiKE5VTEwsIHdybGVuLCBHRlBfS0VSTkVMKTsKQEAgLTY0OSwxMCArNzA4LDM2IEBACiAJbWVtY3B5KG1wYS0+a2V5LCBNUEFfS0VZX1JFUCwgc2l6ZW9mKG1wYS0+a2V5KSk7CiAJbXBhLT5mbGFncyA9IChlcC0+bXBhX2F0dHIuY3JjX2VuYWJsZWQgPyBNUEFfQ1JDIDogMCkgfAogCQkgICAgIChtYXJrZXJzX2VuYWJsZWQgPyBNUEFfTUFSS0VSUyA6IDApOwotCW1wYS0+cmV2aXNpb24gPSBtcGFfcmV2OworCW1wYS0+cmV2aXNpb24gPSBlcC0+bXBhX2F0dHIudmVyc2lvbjsKIAltcGEtPnByaXZhdGVfZGF0YV9zaXplID0gaHRvbnMocGxlbik7Ci0JaWYgKHBsZW4pCi0JCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSwgcGRhdGEsIHBsZW4pOworCisJaWYgKGVwLT5tcGFfYXR0ci52ZXJzaW9uID09IDIgJiYgZXAtPm1wYV9hdHRyLmVuaGFuY2VkX3JkbWFfY29ubikgeworCQltcGEtPmZsYWdzIHw9IE1QQV9FTkhBTkNFRF9SRE1BX0NPTk47CisJCW1wYS0+cHJpdmF0ZV9kYXRhX3NpemUgKz0KKwkJCWh0b25zKHNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKSk7CisJCW1wYV92Ml9wYXJhbXMuaXJkID0gaHRvbnMoKHUxNillcC0+aXJkKTsKKwkJbXBhX3YyX3BhcmFtcy5vcmQgPSBodG9ucygodTE2KWVwLT5vcmQpOworCQlpZiAocGVlcjJwZWVyICYmIChlcC0+bXBhX2F0dHIucDJwX3R5cGUgIT0KKwkJCQkJRldfUklfSU5JVF9QMlBUWVBFX0RJU0FCTEVEKSkgeworCQkJbXBhX3YyX3BhcmFtcy5pcmQgfD0gaHRvbnMoTVBBX1YyX1BFRVIyUEVFUl9NT0RFTCk7CisKKwkJCWlmIChwMnBfdHlwZSA9PSBGV19SSV9JTklUX1AyUFRZUEVfUkRNQV9XUklURSkKKwkJCQltcGFfdjJfcGFyYW1zLm9yZCB8PQorCQkJCQlodG9ucyhNUEFfVjJfUkRNQV9XUklURV9SVFIpOworCQkJZWxzZSBpZiAocDJwX3R5cGUgPT0gRldfUklfSU5JVF9QMlBUWVBFX1JFQURfUkVRKQorCQkJCW1wYV92Ml9wYXJhbXMub3JkIHw9CisJCQkJCWh0b25zKE1QQV9WMl9SRE1BX1JFQURfUlRSKTsKKwkJfQorCisJCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSwgJm1wYV92Ml9wYXJhbXMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcykpOworCisJCWlmIChlcC0+cGxlbikKKwkJCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSArCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpLCBwZGF0YSwgcGxlbik7CisJfSBlbHNlCisJCWlmIChwbGVuKQorCQkJbWVtY3B5KG1wYS0+cHJpdmF0ZV9kYXRhLCBwZGF0YSwgcGxlbik7CiAKIAkvKgogCSAqIFJlZmVyZW5jZSB0aGUgbXBhIHNrYi4gIFRoaXMgZW5zdXJlcyB0aGUgZGF0YSBhcmVhCkBAIC02OTUsNyArNzgwLDEwIEBACiAKIAkvKiBzdGFydCBNUEEgbmVnb3RpYXRpb24gKi8KIAlzZW5kX2Zsb3djKGVwLCBOVUxMKTsKLQlzZW5kX21wYV9yZXEoZXAsIHNrYik7CisJaWYgKGVwLT5yZXRyeV93aXRoX21wYV92MSkKKwkJc2VuZF9tcGFfcmVxKGVwLCBza2IsIDEpOworCWVsc2UKKwkJc2VuZF9tcGFfcmVxKGVwLCBza2IsIG1wYV9yZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NjksOCArODU3LDE5IEBACiAJZXZlbnQucmVtb3RlX2FkZHIgPSBlcC0+Y29tLnJlbW90ZV9hZGRyOwogCiAJaWYgKChzdGF0dXMgPT0gMCkgfHwgKHN0YXR1cyA9PSAtRUNPTk5SRUZVU0VEKSkgewotCQlldmVudC5wcml2YXRlX2RhdGFfbGVuID0gZXAtPnBsZW47Ci0JCWV2ZW50LnByaXZhdGVfZGF0YSA9IGVwLT5tcGFfcGt0ICsgc2l6ZW9mKHN0cnVjdCBtcGFfbWVzc2FnZSk7CisJCWlmICghZXAtPnRyaWVkX3dpdGhfbXBhX3YxKSB7CisJCQkvKiB0aGlzIG1lYW5zIE1QQV92MiBpcyB1c2VkICovCisJCQlldmVudC5wcml2YXRlX2RhdGFfbGVuID0gZXAtPnBsZW4gLQorCQkJCXNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKTsKKwkJCWV2ZW50LnByaXZhdGVfZGF0YSA9IGVwLT5tcGFfcGt0ICsKKwkJCQlzaXplb2Yoc3RydWN0IG1wYV9tZXNzYWdlKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpOworCQl9IGVsc2UgeworCQkJLyogdGhpcyBtZWFucyBNUEFfdjEgaXMgdXNlZCAqLworCQkJZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9IGVwLT5wbGVuOworCQkJZXZlbnQucHJpdmF0ZV9kYXRhID0gZXAtPm1wYV9wa3QgKworCQkJCXNpemVvZihzdHJ1Y3QgbXBhX21lc3NhZ2UpOworCQl9CiAJfQogCiAJUERCRygiJXMgZXAgJXAgdGlkICV1IHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIGVwLApAQCAtNzkzLDkgKzg5MiwyMiBAQAogCWV2ZW50LmV2ZW50ID0gSVdfQ01fRVZFTlRfQ09OTkVDVF9SRVFVRVNUOwogCWV2ZW50LmxvY2FsX2FkZHIgPSBlcC0+Y29tLmxvY2FsX2FkZHI7CiAJZXZlbnQucmVtb3RlX2FkZHIgPSBlcC0+Y29tLnJlbW90ZV9hZGRyOwotCWV2ZW50LnByaXZhdGVfZGF0YV9sZW4gPSBlcC0+cGxlbjsKLQlldmVudC5wcml2YXRlX2RhdGEgPSBlcC0+bXBhX3BrdCArIHNpemVvZihzdHJ1Y3QgbXBhX21lc3NhZ2UpOwogCWV2ZW50LnByb3ZpZGVyX2RhdGEgPSBlcDsKKwlpZiAoIWVwLT50cmllZF93aXRoX21wYV92MSkgeworCQkvKiB0aGlzIG1lYW5zIE1QQV92MiBpcyB1c2VkICovCisJCWV2ZW50Lm9yZCA9IGVwLT5vcmQ7CisJCWV2ZW50LmlyZCA9IGVwLT5pcmQ7CisJCWV2ZW50LnByaXZhdGVfZGF0YV9sZW4gPSBlcC0+cGxlbiAtCisJCQlzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcyk7CisJCWV2ZW50LnByaXZhdGVfZGF0YSA9IGVwLT5tcGFfcGt0ICsgc2l6ZW9mKHN0cnVjdCBtcGFfbWVzc2FnZSkgKworCQkJc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpOworCX0gZWxzZSB7CisJCS8qIHRoaXMgbWVhbnMgTVBBX3YxIGlzIHVzZWQuIFNlbmQgbWF4IHN1cHBvcnRlZCAqLworCQlldmVudC5vcmQgPSBjNGl3X21heF9yZWFkX2RlcHRoOworCQlldmVudC5pcmQgPSBjNGl3X21heF9yZWFkX2RlcHRoOworCQlldmVudC5wcml2YXRlX2RhdGFfbGVuID0gZXAtPnBsZW47CisJCWV2ZW50LnByaXZhdGVfZGF0YSA9IGVwLT5tcGFfcGt0ICsgc2l6ZW9mKHN0cnVjdCBtcGFfbWVzc2FnZSk7CisJfQogCWlmIChzdGF0ZV9yZWFkKCZlcC0+cGFyZW50X2VwLT5jb20pICE9IERFQUQpIHsKIAkJYzRpd19nZXRfZXAoJmVwLT5jb20pOwogCQllcC0+cGFyZW50X2VwLT5jb20uY21faWQtPmV2ZW50X2hhbmRsZXIoCkBAIC04MTMsNiArOTI1LDggQEAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKIAltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKIAlldmVudC5ldmVudCA9IElXX0NNX0VWRU5UX0VTVEFCTElTSEVEOworCWV2ZW50LmlyZCA9IGVwLT5pcmQ7CisJZXZlbnQub3JkID0gZXAtPm9yZDsKIAlpZiAoZXAtPmNvbS5jbV9pZCkgewogCQlQREJHKCIlcyBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKIAkJZXAtPmNvbS5jbV9pZC0+ZXZlbnRfaGFuZGxlcihlcC0+Y29tLmNtX2lkLCAmZXZlbnQpOwpAQCAtODQ4LDcgKzk2MiwxMCBAQAogc3RhdGljIHZvaWQgcHJvY2Vzc19tcGFfcmVwbHkoc3RydWN0IGM0aXdfZXAgKmVwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBtcGFfbWVzc2FnZSAqbXBhOworCXN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMgKm1wYV92Ml9wYXJhbXM7CiAJdTE2IHBsZW47CisJdTE2IHJlc3BfaXJkLCByZXNwX29yZDsKKwl1OCBydHJfbWlzbWF0Y2ggPSAwLCBpbnN1ZmZfaXJkID0gMDsKIAlzdHJ1Y3QgYzRpd19xcF9hdHRyaWJ1dGVzIGF0dHJzOwogCWVudW0gYzRpd19xcF9hdHRyX21hc2sgbWFzazsKIAlpbnQgZXJyOwpAQCAtODg4LDcgKzEwMDUsOSBAQAogCW1wYSA9IChzdHJ1Y3QgbXBhX21lc3NhZ2UgKikgZXAtPm1wYV9wa3Q7CiAKIAkvKiBWYWxpZGF0ZSBNUEEgaGVhZGVyLiAqLwotCWlmIChtcGEtPnJldmlzaW9uICE9IG1wYV9yZXYpIHsKKwlpZiAobXBhLT5yZXZpc2lvbiA+IG1wYV9yZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiJXMgTVBBIHZlcnNpb24gbWlzbWF0Y2guIExvY2FsID0gJWQsIgorCQkgICAgICAgIiBSZWNlaXZlZCA9ICVkXG4iLCBfX2Z1bmNfXywgbXBhX3JldiwgbXBhLT5yZXZpc2lvbik7CiAJCWVyciA9IC1FUFJPVE87CiAJCWdvdG8gZXJyOwogCX0KQEAgLTkzOCwxMyArMTA1Nyw2NiBAQAogCWVwLT5tcGFfYXR0ci5jcmNfZW5hYmxlZCA9IChtcGEtPmZsYWdzICYgTVBBX0NSQykgfCBjcmNfZW5hYmxlZCA/IDEgOiAwOwogCWVwLT5tcGFfYXR0ci5yZWN2X21hcmtlcl9lbmFibGVkID0gbWFya2Vyc19lbmFibGVkOwogCWVwLT5tcGFfYXR0ci54bWl0X21hcmtlcl9lbmFibGVkID0gbXBhLT5mbGFncyAmIE1QQV9NQVJLRVJTID8gMSA6IDA7Ci0JZXAtPm1wYV9hdHRyLnZlcnNpb24gPSBtcGFfcmV2OwotCWVwLT5tcGFfYXR0ci5wMnBfdHlwZSA9IHBlZXIycGVlciA/IHAycF90eXBlIDoKLQkJCQkJICAgIEZXX1JJX0lOSVRfUDJQVFlQRV9ESVNBQkxFRDsKKwllcC0+bXBhX2F0dHIudmVyc2lvbiA9IG1wYS0+cmV2aXNpb247CisJZXAtPm1wYV9hdHRyLnAycF90eXBlID0gRldfUklfSU5JVF9QMlBUWVBFX0RJU0FCTEVEOworCisJaWYgKG1wYS0+cmV2aXNpb24gPT0gMikgeworCQllcC0+bXBhX2F0dHIuZW5oYW5jZWRfcmRtYV9jb25uID0KKwkJCW1wYS0+ZmxhZ3MgJiBNUEFfRU5IQU5DRURfUkRNQV9DT05OID8gMSA6IDA7CisJCWlmIChlcC0+bXBhX2F0dHIuZW5oYW5jZWRfcmRtYV9jb25uKSB7CisJCQltcGFfdjJfcGFyYW1zID0gKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMgKikKKwkJCQkoZXAtPm1wYV9wa3QgKyBzaXplb2YoKm1wYSkpOworCQkJcmVzcF9pcmQgPSBudG9ocyhtcGFfdjJfcGFyYW1zLT5pcmQpICYKKwkJCQlNUEFfVjJfSVJEX09SRF9NQVNLOworCQkJcmVzcF9vcmQgPSBudG9ocyhtcGFfdjJfcGFyYW1zLT5vcmQpICYKKwkJCQlNUEFfVjJfSVJEX09SRF9NQVNLOworCisJCQkvKgorCQkJICogVGhpcyBpcyBhIGRvdWJsZS1jaGVjay4gSWRlYWxseSwgYmVsb3cgY2hlY2tzIGFyZQorCQkJICogbm90IHJlcXVpcmVkIHNpbmNlIGlyZC9vcmQgc3R1ZmYgaGFzIGJlZW4gdGFrZW4KKwkJCSAqIGNhcmUgb2YgaW4gYzRpd19hY2NlcHRfY3IKKwkJCSAqLworCQkJaWYgKChlcC0+aXJkIDwgcmVzcF9vcmQpIHx8IChlcC0+b3JkID4gcmVzcF9pcmQpKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQllcC0+aXJkID0gcmVzcF9vcmQ7CisJCQkJZXAtPm9yZCA9IHJlc3BfaXJkOworCQkJCWluc3VmZl9pcmQgPSAxOworCQkJfQorCisJCQlpZiAobnRvaHMobXBhX3YyX3BhcmFtcy0+aXJkKSAmCisJCQkJCU1QQV9WMl9QRUVSMlBFRVJfTU9ERUwpIHsKKwkJCQlpZiAobnRvaHMobXBhX3YyX3BhcmFtcy0+b3JkKSAmCisJCQkJCQlNUEFfVjJfUkRNQV9XUklURV9SVFIpCisJCQkJCWVwLT5tcGFfYXR0ci5wMnBfdHlwZSA9CisJCQkJCQlGV19SSV9JTklUX1AyUFRZUEVfUkRNQV9XUklURTsKKwkJCQllbHNlIGlmIChudG9ocyhtcGFfdjJfcGFyYW1zLT5vcmQpICYKKwkJCQkJCU1QQV9WMl9SRE1BX1JFQURfUlRSKQorCQkJCQllcC0+bXBhX2F0dHIucDJwX3R5cGUgPQorCQkJCQkJRldfUklfSU5JVF9QMlBUWVBFX1JFQURfUkVROworCQkJfQorCQl9CisJfSBlbHNlIGlmIChtcGEtPnJldmlzaW9uID09IDEpCisJCWlmIChwZWVyMnBlZXIpCisJCQllcC0+bXBhX2F0dHIucDJwX3R5cGUgPSBwMnBfdHlwZTsKKwogCVBEQkcoIiVzIC0gY3JjX2VuYWJsZWQ9JWQsIHJlY3ZfbWFya2VyX2VuYWJsZWQ9JWQsICIKLQkgICAgICJ4bWl0X21hcmtlcl9lbmFibGVkPSVkLCB2ZXJzaW9uPSVkXG4iLCBfX2Z1bmNfXywKLQkgICAgIGVwLT5tcGFfYXR0ci5jcmNfZW5hYmxlZCwgZXAtPm1wYV9hdHRyLnJlY3ZfbWFya2VyX2VuYWJsZWQsCi0JICAgICBlcC0+bXBhX2F0dHIueG1pdF9tYXJrZXJfZW5hYmxlZCwgZXAtPm1wYV9hdHRyLnZlcnNpb24pOworCSAgICAgInhtaXRfbWFya2VyX2VuYWJsZWQ9JWQsIHZlcnNpb249JWQgcDJwX3R5cGU9JWQgbG9jYWwtcDJwX3R5cGUgPSAiCisJICAgICAiJWRcbiIsIF9fZnVuY19fLCBlcC0+bXBhX2F0dHIuY3JjX2VuYWJsZWQsCisJICAgICBlcC0+bXBhX2F0dHIucmVjdl9tYXJrZXJfZW5hYmxlZCwKKwkgICAgIGVwLT5tcGFfYXR0ci54bWl0X21hcmtlcl9lbmFibGVkLCBlcC0+bXBhX2F0dHIudmVyc2lvbiwKKwkgICAgIGVwLT5tcGFfYXR0ci5wMnBfdHlwZSwgcDJwX3R5cGUpOworCisJLyoKKwkgKiBJZiByZXNwb25kZXIncyBSVFIgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGF0IG9mIGluaXRpYXRvciwgYXNzaWduCisJICogRldfUklfSU5JVF9QMlBUWVBFX0RJU0FCTEVEIGluIG1wYSBhdHRyaWJ1dGVzIHNvIHRoYXQgUlRSIGlzIG5vdAorCSAqIGdlbmVyYXRlZCB3aGVuIG1vdmluZyBRUCB0byBSVFMgc3RhdGUuCisJICogQSBURVJNIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IGFmdGVyIFFQIGhhcyBtb3ZlZCB0byBSVFMgc3RhdGUKKwkgKi8KKwlpZiAoKGVwLT5tcGFfYXR0ci52ZXJzaW9uID09IDIpICYmCisJCQkoZXAtPm1wYV9hdHRyLnAycF90eXBlICE9IHAycF90eXBlKSkgeworCQllcC0+bXBhX2F0dHIucDJwX3R5cGUgPSBGV19SSV9JTklUX1AyUFRZUEVfRElTQUJMRUQ7CisJCXJ0cl9taXNtYXRjaCA9IDE7CisJfQogCiAJYXR0cnMubXBhX2F0dHIgPSBlcC0+bXBhX2F0dHI7CiAJYXR0cnMubWF4X2lyZCA9IGVwLT5pcmQ7CkBAIC05NjEsNiArMTEzMywzOSBAQAogCQkJICAgICBlcC0+Y29tLnFwLCBtYXNrLCAmYXR0cnMsIDEpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyOworCisJLyoKKwkgKiBJZiByZXNwb25kZXIncyBSVFIgcmVxdWlyZW1lbnQgZGlkIG5vdCBtYXRjaCB3aXRoIHdoYXQgaW5pdGlhdG9yCisJICogc3VwcG9ydHMsIGdlbmVyYXRlIFRFUk0gbWVzc2FnZQorCSAqLworCWlmIChydHJfbWlzbWF0Y2gpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlRSIG1pc21hdGNoLCBzZW5kaW5nIFRFUk1cbiIsIF9fZnVuY19fKTsKKwkJYXR0cnMubGF5ZXJfZXR5cGUgPSBMQVlFUl9NUEEgfCBERFBfTExQOworCQlhdHRycy5lY29kZSA9IE1QQV9OT01BVENIX1JUUjsKKwkJYXR0cnMubmV4dF9zdGF0ZSA9IEM0SVdfUVBfU1RBVEVfVEVSTUlOQVRFOworCQllcnIgPSBjNGl3X21vZGlmeV9xcChlcC0+Y29tLnFwLT5yaHAsIGVwLT5jb20ucXAsCisJCQkJQzRJV19RUF9BVFRSX05FWFRfU1RBVEUsICZhdHRycywgMCk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogR2VuZXJhdGUgVEVSTSBpZiBpbml0aWF0b3IgSVJEIGlzIG5vdCBzdWZmaWNpZW50IGZvciByZXNwb25kZXIKKwkgKiBwcm92aWRlZCBPUkQuIEN1cnJlbnRseSwgd2UgZG8gdGhlIHNhbWUgYmVoYXZpb3VyIGV2ZW4gd2hlbgorCSAqIHJlc3BvbmRlciBwcm92aWRlZCBJUkQgaXMgYWxzbyBub3Qgc3VmZmljaWVudCBhcyByZWdhcmRzIHRvCisJICogaW5pdGlhdG9yIE9SRC4KKwkgKi8KKwlpZiAoaW5zdWZmX2lyZCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnN1ZmZpY2llbnQgSVJELCBzZW5kaW5nIFRFUk1cbiIsCisJCQkJX19mdW5jX18pOworCQlhdHRycy5sYXllcl9ldHlwZSA9IExBWUVSX01QQSB8IEREUF9MTFA7CisJCWF0dHJzLmVjb2RlID0gTVBBX0lOU1VGRl9JUkQ7CisJCWF0dHJzLm5leHRfc3RhdGUgPSBDNElXX1FQX1NUQVRFX1RFUk1JTkFURTsKKwkJZXJyID0gYzRpd19tb2RpZnlfcXAoZXAtPmNvbS5xcC0+cmhwLCBlcC0+Y29tLnFwLAorCQkJCUM0SVdfUVBfQVRUUl9ORVhUX1NUQVRFLCAmYXR0cnMsIDApOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CiAJZ290byBvdXQ7CiBlcnI6CiAJc3RhdGVfc2V0KCZlcC0+Y29tLCBBQk9SVElORyk7CkBAIC05NzMsNiArMTE3OCw3IEBACiBzdGF0aWMgdm9pZCBwcm9jZXNzX21wYV9yZXF1ZXN0KHN0cnVjdCBjNGl3X2VwICplcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbXBhX21lc3NhZ2UgKm1wYTsKKwlzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zICptcGFfdjJfcGFyYW1zOwogCXUxNiBwbGVuOwogCiAJUERCRygiJXMgZXAgJXAgdGlkICV1XG4iLCBfX2Z1bmNfXywgZXAsIGVwLT5od3RpZCk7CkBAIC0xMDEzLDcgKzEyMTksOSBAQAogCS8qCiAJICogVmFsaWRhdGUgTVBBIEhlYWRlci4KIAkgKi8KLQlpZiAobXBhLT5yZXZpc2lvbiAhPSBtcGFfcmV2KSB7CisJaWYgKG1wYS0+cmV2aXNpb24gPiBtcGFfcmV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIE1QQSB2ZXJzaW9uIG1pc21hdGNoLiBMb2NhbCA9ICVkLCIKKwkJICAgICAgICIgUmVjZWl2ZWQgPSAlZFxuIiwgX19mdW5jX18sIG1wYV9yZXYsIG1wYS0+cmV2aXNpb24pOwogCQlhYm9ydF9jb25uZWN0aW9uKGVwLCBza2IsIEdGUF9LRVJORUwpOwogCQlyZXR1cm47CiAJfQpAQCAtMTA1Niw5ICsxMjY0LDM3IEBACiAJZXAtPm1wYV9hdHRyLmNyY19lbmFibGVkID0gKG1wYS0+ZmxhZ3MgJiBNUEFfQ1JDKSB8IGNyY19lbmFibGVkID8gMSA6IDA7CiAJZXAtPm1wYV9hdHRyLnJlY3ZfbWFya2VyX2VuYWJsZWQgPSBtYXJrZXJzX2VuYWJsZWQ7CiAJZXAtPm1wYV9hdHRyLnhtaXRfbWFya2VyX2VuYWJsZWQgPSBtcGEtPmZsYWdzICYgTVBBX01BUktFUlMgPyAxIDogMDsKLQllcC0+bXBhX2F0dHIudmVyc2lvbiA9IG1wYV9yZXY7Ci0JZXAtPm1wYV9hdHRyLnAycF90eXBlID0gcGVlcjJwZWVyID8gcDJwX3R5cGUgOgotCQkJCQkgICAgRldfUklfSU5JVF9QMlBUWVBFX0RJU0FCTEVEOworCWVwLT5tcGFfYXR0ci52ZXJzaW9uID0gbXBhLT5yZXZpc2lvbjsKKwlpZiAobXBhLT5yZXZpc2lvbiA9PSAxKQorCQllcC0+dHJpZWRfd2l0aF9tcGFfdjEgPSAxOworCWVwLT5tcGFfYXR0ci5wMnBfdHlwZSA9IEZXX1JJX0lOSVRfUDJQVFlQRV9ESVNBQkxFRDsKKworCWlmIChtcGEtPnJldmlzaW9uID09IDIpIHsKKwkJZXAtPm1wYV9hdHRyLmVuaGFuY2VkX3JkbWFfY29ubiA9CisJCQltcGEtPmZsYWdzICYgTVBBX0VOSEFOQ0VEX1JETUFfQ09OTiA/IDEgOiAwOworCQlpZiAoZXAtPm1wYV9hdHRyLmVuaGFuY2VkX3JkbWFfY29ubikgeworCQkJbXBhX3YyX3BhcmFtcyA9IChzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zICopCisJCQkJKGVwLT5tcGFfcGt0ICsgc2l6ZW9mKCptcGEpKTsKKwkJCWVwLT5pcmQgPSBudG9ocyhtcGFfdjJfcGFyYW1zLT5pcmQpICYKKwkJCQlNUEFfVjJfSVJEX09SRF9NQVNLOworCQkJZXAtPm9yZCA9IG50b2hzKG1wYV92Ml9wYXJhbXMtPm9yZCkgJgorCQkJCU1QQV9WMl9JUkRfT1JEX01BU0s7CisJCQlpZiAobnRvaHMobXBhX3YyX3BhcmFtcy0+aXJkKSAmIE1QQV9WMl9QRUVSMlBFRVJfTU9ERUwpCisJCQkJaWYgKHBlZXIycGVlcikgeworCQkJCQlpZiAobnRvaHMobXBhX3YyX3BhcmFtcy0+b3JkKSAmCisJCQkJCQkJTVBBX1YyX1JETUFfV1JJVEVfUlRSKQorCQkJCQkJZXAtPm1wYV9hdHRyLnAycF90eXBlID0KKwkJCQkJCUZXX1JJX0lOSVRfUDJQVFlQRV9SRE1BX1dSSVRFOworCQkJCQllbHNlIGlmIChudG9ocyhtcGFfdjJfcGFyYW1zLT5vcmQpICYKKwkJCQkJCQlNUEFfVjJfUkRNQV9SRUFEX1JUUikKKwkJCQkJCWVwLT5tcGFfYXR0ci5wMnBfdHlwZSA9CisJCQkJCQlGV19SSV9JTklUX1AyUFRZUEVfUkVBRF9SRVE7CisJCQkJfQorCQl9CisJfSBlbHNlIGlmIChtcGEtPnJldmlzaW9uID09IDEpCisJCWlmIChwZWVyMnBlZXIpCisJCQllcC0+bXBhX2F0dHIucDJwX3R5cGUgPSBwMnBfdHlwZTsKKwogCVBEQkcoIiVzIC0gY3JjX2VuYWJsZWQ9JWQsIHJlY3ZfbWFya2VyX2VuYWJsZWQ9JWQsICIKIAkgICAgICJ4bWl0X21hcmtlcl9lbmFibGVkPSVkLCB2ZXJzaW9uPSVkIHAycF90eXBlPSVkXG4iLCBfX2Z1bmNfXywKIAkgICAgIGVwLT5tcGFfYXR0ci5jcmNfZW5hYmxlZCwgZXAtPm1wYV9hdHRyLnJlY3ZfbWFya2VyX2VuYWJsZWQsCkBAIC0xNTUwLDYgKzE3ODYsMTEyIEBACiAJICAgICAgIHN0YXR1cyA9PSBDUExfRVJSX1BFUlNJU1RfTkVHX0FEVklDRTsKIH0KIAorc3RhdGljIGludCBjNGl3X3JlY29ubmVjdChzdHJ1Y3QgYzRpd19lcCAqZXApCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBkZXY7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CisJaW50IHN0ZXA7CisKKwlQREJHKCIlcyBxcCAlcCBjbV9pZCAlcFxuIiwgX19mdW5jX18sIGVwLT5jb20ucXAsIGVwLT5jb20uY21faWQpOworCWluaXRfdGltZXIoJmVwLT50aW1lcik7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuIGFjdGl2ZSBUSUQgdG8gaW5pdGlhdGUgYSBUQ1AgY29ubmVjdGlvbi4KKwkgKi8KKwllcC0+YXRpZCA9IGN4Z2I0X2FsbG9jX2F0aWQoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS50aWRzLCBlcCk7CisJaWYgKGVwLT5hdGlkID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gY2Fubm90IGFsbG9jIGF0aWQuXG4iLCBfX2Z1bmNfXyk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDI7CisJfQorCisJLyogZmluZCBhIHJvdXRlICovCisJcnQgPSBmaW5kX3JvdXRlKGVwLT5jb20uZGV2LAorCQkJZXAtPmNvbS5jbV9pZC0+bG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIsCisJCQllcC0+Y29tLmNtX2lkLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIsCisJCQllcC0+Y29tLmNtX2lkLT5sb2NhbF9hZGRyLnNpbl9wb3J0LAorCQkJZXAtPmNvbS5jbV9pZC0+cmVtb3RlX2FkZHIuc2luX3BvcnQsIDApOworCWlmICghcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiJXMgLSBjYW5ub3QgZmluZCByb3V0ZS5cbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVIT1NUVU5SRUFDSDsKKwkJZ290byBmYWlsMzsKKwl9CisJZXAtPmRzdCA9ICZydC0+ZHN0OworCisJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cihlcC0+ZHN0KTsKKworCS8qIGdldCBhIGwydCBlbnRyeSAqLworCWlmIChuZWlnaC0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgeworCQlQREJHKCIlcyBMT09QQkFDS1xuIiwgX19mdW5jX18pOworCQlwZGV2ID0gaXBfZGV2X2ZpbmQoJmluaXRfbmV0LAorCQkJCSAgIGVwLT5jb20uY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkcik7CisJCWVwLT5sMnQgPSBjeGdiNF9sMnRfZ2V0KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubDJ0LAorCQkJCQluZWlnaCwgcGRldiwgMCk7CisJCWVwLT5tdHUgPSBwZGV2LT5tdHU7CisJCWVwLT50eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKHBkZXYpOworCQllcC0+c21hY19pZHggPSAoY3hnYjRfcG9ydF92aWlkKHBkZXYpICYgMHg3RikgPDwgMTsKKwkJc3RlcCA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubnR4cSAvCisJCQllcC0+Y29tLmRldi0+cmRldi5sbGRpLm5jaGFuOworCQllcC0+dHhxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KHBkZXYpICogc3RlcDsKKwkJc3RlcCA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubnJ4cSAvCisJCQllcC0+Y29tLmRldi0+cmRldi5sbGRpLm5jaGFuOworCQllcC0+Y3RybHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgocGRldik7CisJCWVwLT5yc3NfcWlkID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5yeHFfaWRzWworCQkJY3hnYjRfcG9ydF9pZHgocGRldikgKiBzdGVwXTsKKwkJZGV2X3B1dChwZGV2KTsKKwl9IGVsc2UgeworCQllcC0+bDJ0ID0gY3hnYjRfbDJ0X2dldChlcC0+Y29tLmRldi0+cmRldi5sbGRpLmwydCwKKwkJCQkJbmVpZ2gsIG5laWdoLT5kZXYsIDApOworCQllcC0+bXR1ID0gZHN0X210dShlcC0+ZHN0KTsKKwkJZXAtPnR4X2NoYW4gPSBjeGdiNF9wb3J0X2NoYW4obmVpZ2gtPmRldik7CisJCWVwLT5zbWFjX2lkeCA9IChjeGdiNF9wb3J0X3ZpaWQobmVpZ2gtPmRldikgJiAweDdGKSA8PCAxOworCQlzdGVwID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5udHhxIC8KKwkJCWVwLT5jb20uZGV2LT5yZGV2LmxsZGkubmNoYW47CisJCWVwLT50eHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldikgKiBzdGVwOworCQllcC0+Y3RybHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldik7CisJCXN0ZXAgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLm5yeHEgLworCQkJZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5uY2hhbjsKKwkJZXAtPnJzc19xaWQgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLnJ4cV9pZHNbCisJCQljeGdiNF9wb3J0X2lkeChuZWlnaC0+ZGV2KSAqIHN0ZXBdOworCX0KKwlpZiAoIWVwLT5sMnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiJXMgLSBjYW5ub3QgYWxsb2MgbDJlLlxuIiwgX19mdW5jX18pOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw0OworCX0KKworCVBEQkcoIiVzIHR4cV9pZHggJXUgdHhfY2hhbiAldSBzbWFjX2lkeCAldSByc3NfcWlkICV1IGwydF9pZHggJXVcbiIsCisJICAgICBfX2Z1bmNfXywgZXAtPnR4cV9pZHgsIGVwLT50eF9jaGFuLCBlcC0+c21hY19pZHgsIGVwLT5yc3NfcWlkLAorCSAgICAgZXAtPmwydC0+aWR4KTsKKworCXN0YXRlX3NldCgmZXAtPmNvbSwgQ09OTkVDVElORyk7CisJZXAtPnRvcyA9IDA7CisKKwkvKiBzZW5kIGNvbm5lY3QgcmVxdWVzdCB0byBybmljICovCisJZXJyID0gc2VuZF9jb25uZWN0KGVwKTsKKwlpZiAoIWVycikKKwkJZ290byBvdXQ7CisKKwljeGdiNF9sMnRfcmVsZWFzZShlcC0+bDJ0KTsKK2ZhaWw0OgorCWRzdF9yZWxlYXNlKGVwLT5kc3QpOworZmFpbDM6CisJY3hnYjRfZnJlZV9hdGlkKGVwLT5jb20uZGV2LT5yZGV2LmxsZGkudGlkcywgZXAtPmF0aWQpOworZmFpbDI6CisJLyoKKwkgKiByZW1lbWJlciB0byBzZW5kIG5vdGlmaWNhdGlvbiB0byB1cHBlciBsYXllci4KKwkgKiBXZSBhcmUgaW4gaGVyZSBzbyB0aGUgdXBwZXIgbGF5ZXIgaXMgbm90IGF3YXJlIHRoYXQgdGhpcyBpcworCSAqIHJlLWNvbm5lY3QgYXR0ZW1wdCBhbmQgc28sIHVwcGVyIGxheWVyIGlzIHN0aWxsIHdhaXRpbmcgZm9yCisJICogcmVzcG9uc2Ugb2YgMXN0IGNvbm5lY3QgcmVxdWVzdC4KKwkgKi8KKwljb25uZWN0X3JlcGx5X3VwY2FsbChlcCwgLUVDT05OUkVTRVQpOworCWM0aXdfcHV0X2VwKCZlcC0+Y29tKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IHBlZXJfYWJvcnQoc3RydWN0IGM0aXdfZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGNwbF9hYm9ydF9yZXFfcnNzICpyZXEgPSBjcGxoZHIoc2tiKTsKQEAgLTE1NzMsOCArMTkxNSwxMSBAQAogCiAJLyoKIAkgKiBXYWtlIHVwIGFueSB0aHJlYWRzIGluIHJkbWFfaW5pdCgpIG9yIHJkbWFfZmluaSgpLgorCSAqIEhvd2V2ZXIsIHRoaXMgaXMgbm90IG5lZWRlZCBpZiBjb20gc3RhdGUgaXMganVzdAorCSAqIE1QQV9SRVFfU0VOVAogCSAqLwotCWM0aXdfd2FrZV91cCgmZXAtPmNvbS53cl93YWl0LCAtRUNPTk5SRVNFVCk7CisJaWYgKGVwLT5jb20uc3RhdGUgIT0gTVBBX1JFUV9TRU5UKQorCQljNGl3X3dha2VfdXAoJmVwLT5jb20ud3Jfd2FpdCwgLUVDT05OUkVTRVQpOwogCiAJbXV0ZXhfbG9jaygmZXAtPmNvbS5tdXRleCk7CiAJc3dpdGNoIChlcC0+Y29tLnN0YXRlKSB7CkBAIC0xNTg1LDcgKzE5MzAsMjEgQEAKIAkJYnJlYWs7CiAJY2FzZSBNUEFfUkVRX1NFTlQ6CiAJCXN0b3BfZXBfdGltZXIoZXApOwotCQljb25uZWN0X3JlcGx5X3VwY2FsbChlcCwgLUVDT05OUkVTRVQpOworCQlpZiAobXBhX3JldiA9PSAyICYmIGVwLT50cmllZF93aXRoX21wYV92MSkKKwkJCWNvbm5lY3RfcmVwbHlfdXBjYWxsKGVwLCAtRUNPTk5SRVNFVCk7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIHdlIGp1c3QgZG9uJ3Qgc2VuZCBub3RpZmljYXRpb24gdXB3YXJkcyBiZWNhdXNlIHdlCisJCQkgKiB3YW50IHRvIHJldHJ5IHdpdGggbXBhX3YxIHdpdGhvdXQgdXBwZXIgbGF5ZXJzIGV2ZW4KKwkJCSAqIGtub3dpbmcgaXQuCisJCQkgKgorCQkJICogZG8gc29tZSBob3VzZWtlZXBpbmcgc28gYXMgdG8gcmUtaW5pdGlhdGUgdGhlCisJCQkgKiBjb25uZWN0aW9uCisJCQkgKi8KKwkJCVBEQkcoIiVzOiBtcGFfcmV2PSVkLiBSZXRyeWluZyB3aXRoIG1wYXYxXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgbXBhX3Jldik7CisJCQllcC0+cmV0cnlfd2l0aF9tcGFfdjEgPSAxOworCQl9CiAJCWJyZWFrOwogCWNhc2UgTVBBX1JFUF9TRU5UOgogCQlicmVhazsKQEAgLTE2MjEsNyArMTk4MCw5IEBACiAJZHN0X2NvbmZpcm0oZXAtPmRzdCk7CiAJaWYgKGVwLT5jb20uc3RhdGUgIT0gQUJPUlRJTkcpIHsKIAkJX19zdGF0ZV9zZXQoJmVwLT5jb20sIERFQUQpOwotCQlyZWxlYXNlID0gMTsKKwkJLyogd2UgZG9uJ3QgcmVsZWFzZSBpZiB3ZSB3YW50IHRvIHJldHJ5IHdpdGggbXBhX3YxICovCisJCWlmICghZXAtPnJldHJ5X3dpdGhfbXBhX3YxKQorCQkJcmVsZWFzZSA9IDE7CiAJfQogCW11dGV4X3VubG9jaygmZXAtPmNvbS5tdXRleCk7CiAKQEAgLTE2NDEsNiArMjAwMiwxNSBAQAogb3V0OgogCWlmIChyZWxlYXNlKQogCQlyZWxlYXNlX2VwX3Jlc291cmNlcyhlcCk7CisKKwkvKiByZXRyeSB3aXRoIG1wYS12MSAqLworCWlmIChlcCAmJiBlcC0+cmV0cnlfd2l0aF9tcGFfdjEpIHsKKwkJY3hnYjRfcmVtb3ZlX3RpZChlcC0+Y29tLmRldi0+cmRldi5sbGRpLnRpZHMsIDAsIGVwLT5od3RpZCk7CisJCWRzdF9yZWxlYXNlKGVwLT5kc3QpOworCQljeGdiNF9sMnRfcmVsZWFzZShlcC0+bDJ0KTsKKwkJYzRpd19yZWNvbm5lY3QoZXApOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xNzkyLDE4ICsyMTYyLDQwIEBACiAJCWdvdG8gZXJyOwogCX0KIAotCWNtX2lkLT5hZGRfcmVmKGNtX2lkKTsKLQllcC0+Y29tLmNtX2lkID0gY21faWQ7Ci0JZXAtPmNvbS5xcCA9IHFwOworCWlmIChlcC0+bXBhX2F0dHIudmVyc2lvbiA9PSAyICYmIGVwLT5tcGFfYXR0ci5lbmhhbmNlZF9yZG1hX2Nvbm4pIHsKKwkJaWYgKGNvbm5fcGFyYW0tPm9yZCA+IGVwLT5pcmQpIHsKKwkJCWVwLT5pcmQgPSBjb25uX3BhcmFtLT5pcmQ7CisJCQllcC0+b3JkID0gY29ubl9wYXJhbS0+b3JkOworCQkJc2VuZF9tcGFfcmVqZWN0KGVwLCBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGEsCisJCQkJCWNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4pOworCQkJYWJvcnRfY29ubmVjdGlvbihlcCwgTlVMTCwgR0ZQX0tFUk5FTCk7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKGNvbm5fcGFyYW0tPmlyZCA+IGVwLT5vcmQpIHsKKwkJCWlmICghZXAtPm9yZCkKKwkJCQljb25uX3BhcmFtLT5pcmQgPSAxOworCQkJZWxzZSB7CisJCQkJYWJvcnRfY29ubmVjdGlvbihlcCwgTlVMTCwgR0ZQX0tFUk5FTCk7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQogCisJfQogCWVwLT5pcmQgPSBjb25uX3BhcmFtLT5pcmQ7CiAJZXAtPm9yZCA9IGNvbm5fcGFyYW0tPm9yZDsKIAotCWlmIChwZWVyMnBlZXIgJiYgZXAtPmlyZCA9PSAwKQotCQllcC0+aXJkID0gMTsKKwlpZiAoZXAtPm1wYV9hdHRyLnZlcnNpb24gIT0gMikKKwkJaWYgKHBlZXIycGVlciAmJiBlcC0+aXJkID09IDApCisJCQllcC0+aXJkID0gMTsKIAogCVBEQkcoIiVzICVkIGlyZCAlZCBvcmQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZXAtPmlyZCwgZXAtPm9yZCk7CiAKKwljbV9pZC0+YWRkX3JlZihjbV9pZCk7CisJZXAtPmNvbS5jbV9pZCA9IGNtX2lkOworCWVwLT5jb20ucXAgPSBxcDsKKwogCS8qIGJpbmQgUVAgdG8gRVAgYW5kIG1vdmUgdG8gUlRTICovCiAJYXR0cnMubXBhX2F0dHIgPSBlcC0+bXBhX2F0dHI7CiAJYXR0cnMubWF4X2lyZCA9IGVwLT5pcmQ7CkBAIC0xOTQ0LDYgKzIzMzYsOCBAQAogCQkgICAgICAgZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5uY2hhbjsKIAkJZXAtPnJzc19xaWQgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLnJ4cV9pZHNbCiAJCQkgICAgICBjeGdiNF9wb3J0X2lkeChuZWlnaC0+ZGV2KSAqIHN0ZXBdOworCQllcC0+cmV0cnlfd2l0aF9tcGFfdjEgPSAwOworCQllcC0+dHJpZWRfd2l0aF9tcGFfdjEgPSAwOwogCX0KIAlpZiAoIWVwLT5sMnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiJXMgLSBjYW5ub3QgYWxsb2MgbDJlLlxuIiwgX19mdW5jX18pOwpAQCAtMjMyMyw4ICsyNzE3LDExIEBACiAKIAkvKgogCSAqIFdha2UgdXAgYW55IHRocmVhZHMgaW4gcmRtYV9pbml0KCkgb3IgcmRtYV9maW5pKCkuCisJICogSG93ZXZlciwgdGhpcyBpcyBub3QgbmVlZGVkIGlmIGNvbSBzdGF0ZSBpcyBqdXN0CisJICogTVBBX1JFUV9TRU5UCiAJICovCi0JYzRpd193YWtlX3VwKCZlcC0+Y29tLndyX3dhaXQsIC1FQ09OTlJFU0VUKTsKKwlpZiAoZXAtPmNvbS5zdGF0ZSAhPSBNUEFfUkVRX1NFTlQpCisJCWM0aXdfd2FrZV91cCgmZXAtPmNvbS53cl93YWl0LCAtRUNPTk5SRVNFVCk7CiAJc2NoZWQoZGV2LCBza2IpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYwppbmRleCAxNzIwZGM3Li5mMzVhOTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYwpAQCAtMTg1LDcgKzE4NSw3IEBACiAJCQkJIFZfQ1FFX09QQ09ERShGV19SSV9TRU5EKSB8CiAJCQkJIFZfQ1FFX1RZUEUoMCkgfAogCQkJCSBWX0NRRV9TV0NRRSgxKSB8Ci0JCQkJIFZfQ1FFX1FQSUQod3EtPnJxLnFpZCkpOworCQkJCSBWX0NRRV9RUElEKHdxLT5zcS5xaWQpKTsKIAljcWUuYml0c190eXBlX3RzID0gY3B1X3RvX2JlNjQoVl9DUUVfR0VOQklUKCh1NjQpY3EtPmdlbikpOwogCWNxLT5zd19xdWV1ZVtjcS0+c3dfcGlkeF0gPSBjcWU7CiAJdDRfc3djcV9wcm9kdWNlKGNxKTsKQEAgLTgxOCw2ICs4MTgsNyBAQAogCWNocC0+Y3Euc2l6ZS0tOwkJCQkvKiBzdGF0dXMgcGFnZSAqLwogCWNocC0+aWJjcS5jcWUgPSBlbnRyaWVzIC0gMjsKIAlzcGluX2xvY2tfaW5pdCgmY2hwLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY2hwLT5jb21wX2hhbmRsZXJfbG9jayk7CiAJYXRvbWljX3NldCgmY2hwLT5yZWZjbnQsIDEpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNocC0+d2FpdCk7CiAJcmV0ID0gaW5zZXJ0X2hhbmRsZShyaHAsICZyaHAtPmNxaWRyLCBjaHAsIGNocC0+Y3EuY3FpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvZGV2aWNlLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvZGV2aWNlLmMKaW5kZXggNDBhMTNjYy4uNmQwZGY2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2RldmljZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9kZXZpY2UuYwpAQCAtMzc2LDEwICszNzYsOCBAQAogCXN0cnVjdCBjNGl3X2RldiAqZGV2OwogfTsKIAotc3RhdGljIHZvaWQgYzRpd19yZW1vdmUoc3RydWN0IHVsZF9jdHggKmN0eCkKK3N0YXRpYyB2b2lkIGM0aXdfZGVhbGxvYyhzdHJ1Y3QgdWxkX2N0eCAqY3R4KQogewotCVBEQkcoIiVzIGM0aXdfZGV2ICVwXG4iLCBfX2Z1bmNfXywgIGN0eC0+ZGV2KTsKLQljNGl3X3VucmVnaXN0ZXJfZGV2aWNlKGN0eC0+ZGV2KTsKIAljNGl3X3JkZXZfY2xvc2UoJmN0eC0+ZGV2LT5yZGV2KTsKIAlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPmNxaWRyKTsKIAlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPnFwaWRyKTsKQEAgLTM4OSwxMSArMzg3LDMwIEBACiAJY3R4LT5kZXYgPSBOVUxMOwogfQogCitzdGF0aWMgdm9pZCBjNGl3X3JlbW92ZShzdHJ1Y3QgdWxkX2N0eCAqY3R4KQoreworCVBEQkcoIiVzIGM0aXdfZGV2ICVwXG4iLCBfX2Z1bmNfXywgIGN0eC0+ZGV2KTsKKwljNGl3X3VucmVnaXN0ZXJfZGV2aWNlKGN0eC0+ZGV2KTsKKwljNGl3X2RlYWxsb2MoY3R4KTsKK30KKworc3RhdGljIGludCByZG1hX3N1cHBvcnRlZChjb25zdCBzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKmluZm9wKQoreworCXJldHVybiBpbmZvcC0+dnItPnN0YWcuc2l6ZSA+IDAgJiYgaW5mb3AtPnZyLT5wYmwuc2l6ZSA+IDAgJiYKKwkgICAgICAgaW5mb3AtPnZyLT5ycS5zaXplID4gMCAmJiBpbmZvcC0+dnItPnFwLnNpemUgPiAwICYmCisJICAgICAgIGluZm9wLT52ci0+Y3Euc2l6ZSA+IDAgJiYgaW5mb3AtPnZyLT5vY3Euc2l6ZSA+IDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYzRpd19kZXYgKmM0aXdfYWxsb2MoY29uc3Qgc3RydWN0IGN4Z2I0X2xsZF9pbmZvICppbmZvcCkKIHsKIAlzdHJ1Y3QgYzRpd19kZXYgKmRldnA7CiAJaW50IHJldDsKIAorCWlmICghcmRtYV9zdXBwb3J0ZWQoaW5mb3ApKSB7CisJCXByaW50ayhLRVJOX0lORk8gTU9EICIlczogUkRNQSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLlxuIiwKKwkJICAgICAgIHBjaV9uYW1lKGluZm9wLT5wZGV2KSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworCX0KIAlkZXZwID0gKHN0cnVjdCBjNGl3X2RldiAqKWliX2FsbG9jX2RldmljZShzaXplb2YoKmRldnApKTsKIAlpZiAoIWRldnApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiQ2Fubm90IGFsbG9jYXRlIGliIGRldmljZVxuIik7CkBAIC00MTQsNyArNDMxLDYgQEAKIAogCXJldCA9IGM0aXdfcmRldl9vcGVuKCZkZXZwLT5yZGV2KTsKIAlpZiAocmV0KSB7Ci0JCW11dGV4X3VubG9jaygmZGV2X211dGV4KTsKIAkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiVW5hYmxlIHRvIG9wZW4gQ1hJTyByZGV2IGVyciAlZFxuIiwgcmV0KTsKIAkJaWJfZGVhbGxvY19kZXZpY2UoJmRldnAtPmliZGV2KTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKQEAgLTUxOSwxNSArNTM1LDI0IEBACiAJY2FzZSBDWEdCNF9TVEFURV9VUDoKIAkJcHJpbnRrKEtFUk5fSU5GTyBNT0QgIiVzOiBVcFxuIiwgcGNpX25hbWUoY3R4LT5sbGRpLnBkZXYpKTsKIAkJaWYgKCFjdHgtPmRldikgewotCQkJaW50IHJldCA9IDA7CisJCQlpbnQgcmV0OwogCiAJCQljdHgtPmRldiA9IGM0aXdfYWxsb2MoJmN0eC0+bGxkaSk7Ci0JCQlpZiAoIUlTX0VSUihjdHgtPmRldikpCi0JCQkJcmV0ID0gYzRpd19yZWdpc3Rlcl9kZXZpY2UoY3R4LT5kZXYpOwotCQkJaWYgKElTX0VSUihjdHgtPmRldikgfHwgcmV0KQorCQkJaWYgKElTX0VSUihjdHgtPmRldikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgTU9ECisJCQkJICAgICAgICIlczogaW5pdGlhbGl6YXRpb24gZmFpbGVkOiAlbGRcbiIsCisJCQkJICAgICAgIHBjaV9uYW1lKGN0eC0+bGxkaS5wZGV2KSwKKwkJCQkgICAgICAgUFRSX0VSUihjdHgtPmRldikpOworCQkJCWN0eC0+ZGV2ID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldCA9IGM0aXdfcmVnaXN0ZXJfZGV2aWNlKGN0eC0+ZGV2KTsKKwkJCWlmIChyZXQpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgTU9ECiAJCQkJICAgICAgICIlczogUkRNQSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwKIAkJCQkgICAgICAgcGNpX25hbWUoY3R4LT5sbGRpLnBkZXYpLCByZXQpOworCQkJCWM0aXdfZGVhbGxvYyhjdHgpOworCQkJfQogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1hHQjRfU1RBVEVfRE9XTjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9ldi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2V2LmMKaW5kZXggYzEzMDQxYS4uMzk3Y2IzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2V2LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2V2LmMKQEAgLTQyLDYgKzQyLDcgQEAKIHsKIAlzdHJ1Y3QgaWJfZXZlbnQgZXZlbnQ7CiAJc3RydWN0IGM0aXdfcXBfYXR0cmlidXRlcyBhdHRyczsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CiAKIAlpZiAoKHFocC0+YXR0ci5zdGF0ZSA9PSBDNElXX1FQX1NUQVRFX0VSUk9SKSB8fAogCSAgICAocWhwLT5hdHRyLnN0YXRlID09IEM0SVdfUVBfU1RBVEVfVEVSTUlOQVRFKSkgewpAQCAtNzIsNyArNzMsOSBAQAogCWlmIChxaHAtPmlicXAuZXZlbnRfaGFuZGxlcikKIAkJKCpxaHAtPmlicXAuZXZlbnRfaGFuZGxlcikoJmV2ZW50LCBxaHAtPmlicXAucXBfY29udGV4dCk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CiAJKCpjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmY2hwLT5pYmNxLCBjaHAtPmliY3EuY3FfY29udGV4dCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CiB9CiAKIHZvaWQgYzRpd19ldl9kaXNwYXRjaChzdHJ1Y3QgYzRpd19kZXYgKmRldiwgc3RydWN0IHQ0X2NxZSAqZXJyX2NxZSkKQEAgLTE4MywxMSArMTg2LDE0IEBACiBpbnQgYzRpd19ldl9oYW5kbGVyKHN0cnVjdCBjNGl3X2RldiAqZGV2LCB1MzIgcWlkKQogewogCXN0cnVjdCBjNGl3X2NxICpjaHA7CisJdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJY2hwID0gZ2V0X2NocChkZXYsIHFpZCk7Ci0JaWYgKGNocCkKKwlpZiAoY2hwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCBmbGFnKTsKIAkJKCpjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmY2hwLT5pYmNxLCBjaHAtPmliY3EuY3FfY29udGV4dCk7Ci0JZWxzZQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCBmbGFnKTsKKwl9IGVsc2UKIAkJUERCRygiJXMgdW5rbm93biBjcWlkIDB4JXhcbiIsIF9fZnVuY19fLCBxaWQpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaAppbmRleCA0ZjA0NTM3Li4xMzU3YzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaApAQCAtMzA5LDYgKzMwOSw3IEBACiAJc3RydWN0IGM0aXdfZGV2ICpyaHA7CiAJc3RydWN0IHQ0X2NxIGNxOwogCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IGNvbXBfaGFuZGxlcl9sb2NrOwogCWF0b21pY190IHJlZmNudDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwogfTsKQEAgLTMyMyw2ICszMjQsNyBAQAogCXU4IHJlY3ZfbWFya2VyX2VuYWJsZWQ7CiAJdTggeG1pdF9tYXJrZXJfZW5hYmxlZDsKIAl1OCBjcmNfZW5hYmxlZDsKKwl1OCBlbmhhbmNlZF9yZG1hX2Nvbm47CiAJdTggdmVyc2lvbjsKIAl1OCBwMnBfdHlwZTsKIH07CkBAIC0zNDksNiArMzUxLDggQEAKIAl1OCBpc190ZXJtaW5hdGVfbG9jYWw7CiAJc3RydWN0IGM0aXdfbXBhX2F0dHJpYnV0ZXMgbXBhX2F0dHI7CiAJc3RydWN0IGM0aXdfZXAgKmxscF9zdHJlYW1faGFuZGxlOworCXU4IGxheWVyX2V0eXBlOworCXU4IGVjb2RlOwogfTsKIAogc3RydWN0IGM0aXdfcXAgewpAQCAtNTAxLDExICs1MDUsMTggQEAKICNkZWZpbmUgTVBBX0tFWV9SRVAgIk1QQSBJRCBSZXAgRnJhbWUiCiAKICNkZWZpbmUgTVBBX01BWF9QUklWQVRFX0RBVEEJMjU2CisjZGVmaW5lIE1QQV9FTkhBTkNFRF9SRE1BX0NPTk4JMHgxMAogI2RlZmluZSBNUEFfUkVKRUNUCQkweDIwCiAjZGVmaW5lIE1QQV9DUkMJCQkweDQwCiAjZGVmaW5lIE1QQV9NQVJLRVJTCQkweDgwCiAjZGVmaW5lIE1QQV9GTEFHU19NQVNLCQkweEUwCiAKKyNkZWZpbmUgTVBBX1YyX1BFRVIyUEVFUl9NT0RFTCAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgTVBBX1YyX1pFUk9fTEVOX0ZQRFVfUlRSICAgICAgICAweDQwMDAKKyNkZWZpbmUgTVBBX1YyX1JETUFfV1JJVEVfUlRSICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgTVBBX1YyX1JETUFfUkVBRF9SVFIgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgTVBBX1YyX0lSRF9PUkRfTUFTSyAgICAgICAgICAgICAweDNGRkYKKwogI2RlZmluZSBjNGl3X3B1dF9lcChlcCkgeyBcCiAJUERCRygicHV0X2VwICh2aWEgJXM6JXUpIGVwICVwIHJlZmNudCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCAgXAogCSAgICAgZXAsIGF0b21pY19yZWFkKCYoKGVwKS0+a3JlZi5yZWZjb3VudCkpKTsgXApAQCAtNTI4LDYgKzUzOSwxMSBAQAogCXU4IHByaXZhdGVfZGF0YVswXTsKIH07CiAKK3N0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMgeworCV9fYmUxNiBpcmQ7CisJX19iZTE2IG9yZDsKK307CisKIHN0cnVjdCB0ZXJtaW5hdGVfbWVzc2FnZSB7CiAJdTggbGF5ZXJfZXR5cGU7CiAJdTggZWNvZGU7CkBAIC01ODAsNyArNTk2LDEwIEBACiAKIGVudW0gYzRpd19tcGFfZWNvZGVzIHsKIAlNUEFfQ1JDX0VSUgkJPSAweDAyLAotCU1QQV9NQVJLRVJfRVJSCQk9IDB4MDMKKwlNUEFfTUFSS0VSX0VSUiAgICAgICAgICA9IDB4MDMsCisJTVBBX0xPQ0FMX0NBVEEgICAgICAgICAgPSAweDA1LAorCU1QQV9JTlNVRkZfSVJEICAgICAgICAgID0gMHgwNiwKKwlNUEFfTk9NQVRDSF9SVFIgICAgICAgICA9IDB4MDcsCiB9OwogCiBlbnVtIGM0aXdfZXBfc3RhdGUgewpAQCAtNjUxLDYgKzY3MCw4IEBACiAJdTE2IHR4cV9pZHg7CiAJdTE2IGN0cmxxX2lkeDsKIAl1OCB0b3M7CisJdTggcmV0cnlfd2l0aF9tcGFfdjE7CisJdTggdHJpZWRfd2l0aF9tcGFfdjE7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjNGl3X2VwICp0b19lcChzdHJ1Y3QgaXdfY21faWQgKmNtX2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYwppbmRleCBhNDE1NzhlLi41Zjk0MGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYwpAQCAtMjksNiArMjksOSBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQogICogU09GVFdBUkUuCiAgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiaXdfY3hnYjQuaCIKIAogc3RhdGljIGludCBvY3FwX3N1cHBvcnQgPSAxOwpAQCAtOTE3LDcgKzkyMCwxMSBAQAogCXdxZS0+dS50ZXJtaW5hdGUudHlwZSA9IEZXX1JJX1RZUEVfVEVSTUlOQVRFOwogCXdxZS0+dS50ZXJtaW5hdGUuaW1tZGxlbiA9IGNwdV90b19iZTMyKHNpemVvZiAqdGVybSk7CiAJdGVybSA9IChzdHJ1Y3QgdGVybWluYXRlX21lc3NhZ2UgKil3cWUtPnUudGVybWluYXRlLnRlcm1tc2c7Ci0JYnVpbGRfdGVybV9jb2RlcyhlcnJfY3FlLCAmdGVybS0+bGF5ZXJfZXR5cGUsICZ0ZXJtLT5lY29kZSk7CisJaWYgKHFocC0+YXR0ci5sYXllcl9ldHlwZSA9PSAoTEFZRVJfTVBBfEREUF9MTFApKSB7CisJCXRlcm0tPmxheWVyX2V0eXBlID0gcWhwLT5hdHRyLmxheWVyX2V0eXBlOworCQl0ZXJtLT5lY29kZSA9IHFocC0+YXR0ci5lY29kZTsKKwl9IGVsc2UKKwkJYnVpbGRfdGVybV9jb2RlcyhlcnJfY3FlLCAmdGVybS0+bGF5ZXJfZXR5cGUsICZ0ZXJtLT5lY29kZSk7CiAJYzRpd19vZmxkX3NlbmQoJnFocC0+cmhwLT5yZGV2LCBza2IpOwogfQogCkBAIC05NDEsOCArOTQ4LDExIEBACiAJZmx1c2hlZCA9IGM0aXdfZmx1c2hfcnEoJnFocC0+d3EsICZyY2hwLT5jcSwgY291bnQpOwogCXNwaW5fdW5sb2NrKCZxaHAtPmxvY2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjaHAtPmxvY2ssIGZsYWcpOwotCWlmIChmbHVzaGVkKQorCWlmIChmbHVzaGVkKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZyY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CiAJCSgqcmNocC0+aWJjcS5jb21wX2hhbmRsZXIpKCZyY2hwLT5pYmNxLCByY2hwLT5pYmNxLmNxX2NvbnRleHQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CisJfQogCiAJLyogbG9ja2luZyBoaWVyYXJjaHk6IGNxIGxvY2sgZmlyc3QsIHRoZW4gcXAgbG9jay4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2NocC0+bG9jaywgZmxhZyk7CkBAIC05NTIsMTMgKzk2MiwxNyBAQAogCWZsdXNoZWQgPSBjNGl3X2ZsdXNoX3NxKCZxaHAtPndxLCAmc2NocC0+Y3EsIGNvdW50KTsKIAlzcGluX3VubG9jaygmcWhwLT5sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2hwLT5sb2NrLCBmbGFnKTsKLQlpZiAoZmx1c2hlZCkKKwlpZiAoZmx1c2hlZCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOwogCQkoKnNjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmc2NocC0+aWJjcSwgc2NocC0+aWJjcS5jcV9jb250ZXh0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOworCX0KIH0KIAogc3RhdGljIHZvaWQgZmx1c2hfcXAoc3RydWN0IGM0aXdfcXAgKnFocCkKIHsKIAlzdHJ1Y3QgYzRpd19jcSAqcmNocCwgKnNjaHA7CisJdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJcmNocCA9IGdldF9jaHAocWhwLT5yaHAsIHFocC0+YXR0ci5yY3EpOwogCXNjaHAgPSBnZXRfY2hwKHFocC0+cmhwLCBxaHAtPmF0dHIuc2NxKTsKQEAgLTk2Niw4ICs5ODAsMTYgQEAKIAlpZiAocWhwLT5pYnFwLnVvYmplY3QpIHsKIAkJdDRfc2V0X3dxX2luX2Vycm9yKCZxaHAtPndxKTsKIAkJdDRfc2V0X2NxX2luX2Vycm9yKCZyY2hwLT5jcSk7Ci0JCWlmIChzY2hwICE9IHJjaHApCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CisJCSgqcmNocC0+aWJjcS5jb21wX2hhbmRsZXIpKCZyY2hwLT5pYmNxLCByY2hwLT5pYmNxLmNxX2NvbnRleHQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CisJCWlmIChzY2hwICE9IHJjaHApIHsKIAkJCXQ0X3NldF9jcV9pbl9lcnJvcigmc2NocC0+Y3EpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCBmbGFnKTsKKwkJCSgqc2NocC0+aWJjcS5jb21wX2hhbmRsZXIpKCZzY2hwLT5pYmNxLAorCQkJCQlzY2hwLT5pYmNxLmNxX2NvbnRleHQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOworCQl9CiAJCXJldHVybjsKIAl9CiAJX19mbHVzaF9xcChxaHAsIHJjaHAsIHNjaHApOwpAQCAtMTAxMiw2ICsxMDM0LDcgQEAKIAogc3RhdGljIHZvaWQgYnVpbGRfcnRyX21zZyh1OCBwMnBfdHlwZSwgc3RydWN0IGZ3X3JpX2luaXQgKmluaXQpCiB7CisJUERCRygiJXMgcDJwX3R5cGUgPSAlZFxuIiwgX19mdW5jX18sIHAycF90eXBlKTsKIAltZW1zZXQoJmluaXQtPnUsIDAsIHNpemVvZiBpbml0LT51KTsKIAlzd2l0Y2ggKHAycF90eXBlKSB7CiAJY2FzZSBGV19SSV9JTklUX1AyUFRZUEVfUkRNQV9XUklURToKQEAgLTEyMDYsMTIgKzEyMjksMTYgQEAKIAkJCQlkaXNjb25uZWN0ID0gMTsKIAkJCQljNGl3X2dldF9lcCgmcWhwLT5lcC0+Y29tKTsKIAkJCX0KKwkJCWlmIChxaHAtPmlicXAudW9iamVjdCkKKwkJCQl0NF9zZXRfd3FfaW5fZXJyb3IoJnFocC0+d3EpOwogCQkJcmV0ID0gcmRtYV9maW5pKHJocCwgcWhwLCBlcCk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZXJyOwogCQkJYnJlYWs7CiAJCWNhc2UgQzRJV19RUF9TVEFURV9URVJNSU5BVEU6CiAJCQlzZXRfc3RhdGUocWhwLCBDNElXX1FQX1NUQVRFX1RFUk1JTkFURSk7CisJCQlxaHAtPmF0dHIubGF5ZXJfZXR5cGUgPSBhdHRycy0+bGF5ZXJfZXR5cGU7CisJCQlxaHAtPmF0dHIuZWNvZGUgPSBhdHRycy0+ZWNvZGU7CiAJCQlpZiAocWhwLT5pYnFwLnVvYmplY3QpCiAJCQkJdDRfc2V0X3dxX2luX2Vycm9yKCZxaHAtPndxKTsKIAkJCWVwID0gcWhwLT5lcDsKQEAgLTEyMjIsNiArMTI0OSw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBDNElXX1FQX1NUQVRFX0VSUk9SOgogCQkJc2V0X3N0YXRlKHFocCwgQzRJV19RUF9TVEFURV9FUlJPUik7CisJCQlpZiAocWhwLT5pYnFwLnVvYmplY3QpCisJCQkJdDRfc2V0X3dxX2luX2Vycm9yKCZxaHAtPndxKTsKIAkJCWlmICghaW50ZXJuYWwpIHsKIAkJCQlhYm9ydCA9IDE7CiAJCQkJZGlzY29ubmVjdCA9IDE7CkBAIC0xMzM0LDcgKzEzNjMsMTAgQEAKIAlyaHAgPSBxaHAtPnJocDsKIAogCWF0dHJzLm5leHRfc3RhdGUgPSBDNElXX1FQX1NUQVRFX0VSUk9SOwotCWM0aXdfbW9kaWZ5X3FwKHJocCwgcWhwLCBDNElXX1FQX0FUVFJfTkVYVF9TVEFURSwgJmF0dHJzLCAwKTsKKwlpZiAocWhwLT5hdHRyLnN0YXRlID09IEM0SVdfUVBfU1RBVEVfVEVSTUlOQVRFKQorCQljNGl3X21vZGlmeV9xcChyaHAsIHFocCwgQzRJV19RUF9BVFRSX05FWFRfU1RBVEUsICZhdHRycywgMSk7CisJZWxzZQorCQljNGl3X21vZGlmeV9xcChyaHAsIHFocCwgQzRJV19RUF9BVFRSX05FWFRfU1RBVEUsICZhdHRycywgMCk7CiAJd2FpdF9ldmVudChxaHAtPndhaXQsICFxaHAtPmVwKTsKIAogCXJlbW92ZV9oYW5kbGUocmhwLCAmcmhwLT5xcGlkciwgcWhwLT53cS5zcS5xaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9lcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9lcS5jCmluZGV4IGQ5YjFiYjQuLjgxOGQ3MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfZXEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2VxLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCQl0YXNrbGV0X2luaXQoJmVxLT5pbnRlcnJ1cHRfdGFzaywgZWhjYV90YXNrbGV0X2VxLCAobG9uZylzaGNhKTsKIAogCQlyZXQgPSBpYm1lYnVzX3JlcXVlc3RfaXJxKGVxLT5pc3QsIGVoY2FfaW50ZXJydXB0X2VxLAotCQkJCQkgIElSUUZfRElTQUJMRUQsICJlaGNhX2VxIiwKKwkJCQkJICAwLCAiZWhjYV9lcSIsCiAJCQkJCSAgKHZvaWQgKilzaGNhKTsKIAkJaWYgKHJldCA8IDApCiAJCQllaGNhX2VycihpYl9kZXYsICJDYW4ndCBtYXAgaW50ZXJydXB0IGhhbmRsZXIuIik7CkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJdGFza2xldF9pbml0KCZlcS0+aW50ZXJydXB0X3Rhc2ssIGVoY2FfdGFza2xldF9uZXEsIChsb25nKXNoY2EpOwogCiAJCXJldCA9IGlibWVidXNfcmVxdWVzdF9pcnEoZXEtPmlzdCwgZWhjYV9pbnRlcnJ1cHRfbmVxLAotCQkJCQkgIElSUUZfRElTQUJMRUQsICJlaGNhX25lcSIsCisJCQkJCSAgMCwgImVoY2FfbmVxIiwKIAkJCQkJICAodm9pZCAqKXNoY2EpOwogCQlpZiAocmV0IDwgMCkKIAkJCWVoY2FfZXJyKGliX2RldiwgIkNhbid0IG1hcCBpbnRlcnJ1cHQgaGFuZGxlci4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYwppbmRleCAzMmZiMzQyLi45NjRmODU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9xcC5jCkBAIC05NzcsNiArOTc3LDkgQEAKIAlzdHJ1Y3QgaGNwX21vZGlmeV9xcF9jb250cm9sX2Jsb2NrICptcXBjYjsKIAl1NjQgaHJldCwgdXBkYXRlX21hc2s7CiAKKwlpZiAoc3JxX2luaXRfYXR0ci0+c3JxX3R5cGUgIT0gSUJfU1JRVF9CQVNJQykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CisKIAkvKiBGb3IgY29tbW9uIGF0dHJpYnV0ZXMsIGludGVybmFsX2NyZWF0ZV9xcCgpIHRha2VzIGl0cyBpbmZvCiAJICogb3V0IG9mIHFwX2luaXRfYXR0ciwgc28gY29weSBhbGwgY29tbW9uIGF0dHJzIHRoZXJlLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RpYWcuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMKaW5kZXggZGFlZjYxZC4uNzE0MjkzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RpYWcuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZGlhZy5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgImlwYXRoX2tlcm5lbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCmluZGV4IGJlMjRhYzcuLmJmY2EzN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiaXBhdGhfa2VybmVsLmgiCiAjaW5jbHVkZSAiaXBhdGhfdmVyYnMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKaW5kZXggODY5N2VjYS4uNzM2ZDllZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbml0X2NoaXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbml0X2NoaXAuYwppbmRleCA3YzFlZWJlLi40OWIwOWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2luaXRfY2hpcC5jCkBAIC0zMyw3ICszMyw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSAiaXBhdGhfa2VybmVsLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc3JxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc3JxLmMKaW5kZXggMzg2ZTJjNy4uMjYyNzE5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3NycS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zcnEuYwpAQCAtMTA3LDYgKzEwNywxMSBAQAogCXUzMiBzejsKIAlzdHJ1Y3QgaWJfc3JxICpyZXQ7CiAKKwlpZiAoc3JxX2luaXRfYXR0ci0+c3JxX3R5cGUgIT0gSUJfU1JRVF9CQVNJQykgeworCQlyZXQgPSBFUlJfUFRSKC1FTk9TWVMpOworCQlnb3RvIGRvbmU7CisJfQorCiAJaWYgKHNycV9pbml0X2F0dHItPmF0dHIubWF4X3dyID09IDApIHsKIAkJcmV0ID0gRVJSX1BUUigtRUlOVkFMKTsKIAkJZ290byBkb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc3lzZnMuYwppbmRleCA4OTkxNjc3Li43NTU1OGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc3lzZnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc3lzZnMuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KIAogI2luY2x1ZGUgImlwYXRoX2tlcm5lbC5oIgogI2luY2x1ZGUgImlwYXRoX3ZlcmJzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdXNlcl9wYWdlcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VzZXJfcGFnZXMuYwppbmRleCBjZmVkNTM5Li5kYzY2YzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdXNlcl9wYWdlcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF91c2VyX3BhZ2VzLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAkJCWdvdG8gYmFpbF9yZWxlYXNlOwogCX0KIAotCWN1cnJlbnQtPm1tLT5sb2NrZWRfdm0gKz0gbnVtX3BhZ2VzOworCWN1cnJlbnQtPm1tLT5waW5uZWRfdm0gKz0gbnVtX3BhZ2VzOwogCiAJcmV0ID0gMDsKIAlnb3RvIGJhaWw7CkBAIC0xNzgsNyArMTc4LDcgQEAKIAogCV9faXBhdGhfcmVsZWFzZV91c2VyX3BhZ2VzKHAsIG51bV9wYWdlcywgMSk7CiAKLQljdXJyZW50LT5tbS0+bG9ja2VkX3ZtIC09IG51bV9wYWdlczsKKwljdXJyZW50LT5tbS0+cGlubmVkX3ZtIC09IG51bV9wYWdlczsKIAogCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogfQpAQCAtMTk1LDcgKzE5NSw3IEBACiAJCWNvbnRhaW5lcl9vZihfd29yaywgc3RydWN0IGlwYXRoX3VzZXJfcGFnZXNfd29yaywgd29yayk7CiAKIAlkb3duX3dyaXRlKCZ3b3JrLT5tbS0+bW1hcF9zZW0pOwotCXdvcmstPm1tLT5sb2NrZWRfdm0gLT0gd29yay0+bnVtX3BhZ2VzOworCXdvcmstPm1tLT5waW5uZWRfdm0gLT0gd29yay0+bnVtX3BhZ2VzOwogCXVwX3dyaXRlKCZ3b3JrLT5tbS0+bW1hcF9zZW0pOwogCW1tcHV0KHdvcmstPm1tKTsKIAlrZnJlZSh3b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKaW5kZXggZGQ3ZjI2ZC4uNDM5YzM1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxyZG1hL2liX3VzZXJfdmVyYnMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKaW5kZXggZmE2NDNmNC4uNzdmM2RiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYwpAQCAtMTI4LDYgKzEyOCw4IEBACiAJICAgIChkZXYtPmRldi0+Y2Fwcy5ibW1lX2ZsYWdzICYgTUxYNF9CTU1FX0ZMQUdfUkVNT1RFX0lOVikgJiYKIAkgICAgKGRldi0+ZGV2LT5jYXBzLmJtbWVfZmxhZ3MgJiBNTFg0X0JNTUVfRkxBR19GQVNUX1JFR19XUikpCiAJCXByb3BzLT5kZXZpY2VfY2FwX2ZsYWdzIHw9IElCX0RFVklDRV9NRU1fTUdUX0VYVEVOU0lPTlM7CisJaWYgKGRldi0+ZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfWFJDKQorCQlwcm9wcy0+ZGV2aWNlX2NhcF9mbGFncyB8PSBJQl9ERVZJQ0VfWFJDOwogCiAJcHJvcHMtPnZlbmRvcl9pZAkgICA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopIChvdXRfbWFkLT5kYXRhICsgMzYpKSAmCiAJCTB4ZmZmZmZmOwpAQCAtMTgxLDggKzE4MywxMiBAQAogCiBzdGF0aWMgaW50IGliX2xpbmtfcXVlcnlfcG9ydChzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgdTggcG9ydCwKIAkJCSAgICAgIHN0cnVjdCBpYl9wb3J0X2F0dHIgKnByb3BzLAorCQkJICAgICAgc3RydWN0IGliX3NtcCAqaW5fbWFkLAogCQkJICAgICAgc3RydWN0IGliX3NtcCAqb3V0X21hZCkKIHsKKwlpbnQgZXh0X2FjdGl2ZV9zcGVlZDsKKwlpbnQgZXJyOworCiAJcHJvcHMtPmxpZAkJPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSAob3V0X21hZC0+ZGF0YSArIDE2KSk7CiAJcHJvcHMtPmxtYwkJPSBvdXRfbWFkLT5kYXRhWzM0XSAmIDB4NzsKIAlwcm9wcy0+c21fbGlkCQk9IGJlMTZfdG9fY3B1cCgoX19iZTE2ICopIChvdXRfbWFkLT5kYXRhICsgMTgpKTsKQEAgLTIwMyw2ICsyMDksMzkgQEAKIAlwcm9wcy0+bWF4X3ZsX251bQk9IG91dF9tYWQtPmRhdGFbMzddID4+IDQ7CiAJcHJvcHMtPmluaXRfdHlwZV9yZXBseQk9IG91dF9tYWQtPmRhdGFbNDFdID4+IDQ7CiAKKwkvKiBDaGVjayBpZiBleHRlbmRlZCBzcGVlZHMgKEVEUi9GRFIvLi4uKSBhcmUgc3VwcG9ydGVkICovCisJaWYgKHByb3BzLT5wb3J0X2NhcF9mbGFncyAmIElCX1BPUlRfRVhURU5ERURfU1BFRURTX1NVUCkgeworCQlleHRfYWN0aXZlX3NwZWVkID0gb3V0X21hZC0+ZGF0YVs2Ml0gPj4gNDsKKworCQlzd2l0Y2ggKGV4dF9hY3RpdmVfc3BlZWQpIHsKKwkJY2FzZSAxOgorCQkJcHJvcHMtPmFjdGl2ZV9zcGVlZCA9IDE2OyAvKiBGRFIgKi8KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwcm9wcy0+YWN0aXZlX3NwZWVkID0gMzI7IC8qIEVEUiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBJZiByZXBvcnRlZCBhY3RpdmUgc3BlZWQgaXMgUURSLCBjaGVjayBpZiBpcyBGRFItMTAgKi8KKwlpZiAocHJvcHMtPmFjdGl2ZV9zcGVlZCA9PSA0KSB7CisJCWlmICh0b19tZGV2KGliZGV2KS0+ZGV2LT5jYXBzLmV4dF9wb3J0X2NhcFtwb3J0XSAmCisJCSAgICBNTFhfRVhUX1BPUlRfQ0FQX0ZMQUdfRVhURU5ERURfUE9SVF9JTkZPKSB7CisJCQlpbml0X3F1ZXJ5X21hZChpbl9tYWQpOworCQkJaW5fbWFkLT5hdHRyX2lkID0gTUxYNF9BVFRSX0VYVEVOREVEX1BPUlRfSU5GTzsKKwkJCWluX21hZC0+YXR0cl9tb2QgPSBjcHVfdG9fYmUzMihwb3J0KTsKKworCQkJZXJyID0gbWx4NF9NQURfSUZDKHRvX21kZXYoaWJkZXYpLCAxLCAxLCBwb3J0LAorCQkJCQkgICBOVUxMLCBOVUxMLCBpbl9tYWQsIG91dF9tYWQpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCisJCQkvKiBDaGVja2luZyBMaW5rU3BlZWRBY3RpdmUgZm9yIEZEUi0xMCAqLworCQkJaWYgKG91dF9tYWQtPmRhdGFbMTVdICYgMHgxKQorCQkJCXByb3BzLT5hY3RpdmVfc3BlZWQgPSA4OworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyNyw3ICsyNjYsNyBAQAogCXByb3BzLT5wa2V5X3RibF9sZW4JPSAxOwogCXByb3BzLT5iYWRfcGtleV9jbnRyCT0gYmUxNl90b19jcHVwKChfX2JlMTYgKikgKG91dF9tYWQtPmRhdGEgKyA0NikpOwogCXByb3BzLT5xa2V5X3Zpb2xfY250cgk9IGJlMTZfdG9fY3B1cCgoX19iZTE2ICopIChvdXRfbWFkLT5kYXRhICsgNDgpKTsKLQlwcm9wcy0+bWF4X210dQkJPSBJQl9NVFVfMjA0ODsKKwlwcm9wcy0+bWF4X210dQkJPSBJQl9NVFVfNDA5NjsKIAlwcm9wcy0+c3VibmV0X3RpbWVvdXQJPSAwOwogCXByb3BzLT5tYXhfdmxfbnVtCT0gb3V0X21hZC0+ZGF0YVszN10gPj4gNDsKIAlwcm9wcy0+aW5pdF90eXBlX3JlcGx5CT0gMDsKQEAgLTI3NCw3ICszMTMsNyBAQAogCQlnb3RvIG91dDsKIAogCWVyciA9IG1seDRfaWJfcG9ydF9saW5rX2xheWVyKGliZGV2LCBwb3J0KSA9PSBJQl9MSU5LX0xBWUVSX0lORklOSUJBTkQgPwotCQlpYl9saW5rX3F1ZXJ5X3BvcnQoaWJkZXYsIHBvcnQsIHByb3BzLCBvdXRfbWFkKSA6CisJCWliX2xpbmtfcXVlcnlfcG9ydChpYmRldiwgcG9ydCwgcHJvcHMsIGluX21hZCwgb3V0X21hZCkgOgogCQlldGhfbGlua19xdWVyeV9wb3J0KGliZGV2LCBwb3J0LCBwcm9wcywgb3V0X21hZCk7CiAKIG91dDoKQEAgLTU2Niw2ICs2MDUsNTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBpYl94cmNkICptbHg0X2liX2FsbG9jX3hyY2Qoc3RydWN0IGliX2RldmljZSAqaWJkZXYsCisJCQkJCSAgc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0LAorCQkJCQkgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCit7CisJc3RydWN0IG1seDRfaWJfeHJjZCAqeHJjZDsKKwlpbnQgZXJyOworCisJaWYgKCEodG9fbWRldihpYmRldiktPmRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1hSQykpCisJCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworCisJeHJjZCA9IGttYWxsb2Moc2l6ZW9mICp4cmNkLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXhyY2QpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gbWx4NF94cmNkX2FsbG9jKHRvX21kZXYoaWJkZXYpLT5kZXYsICZ4cmNkLT54cmNkbik7CisJaWYgKGVycikKKwkJZ290byBlcnIxOworCisJeHJjZC0+cGQgPSBpYl9hbGxvY19wZChpYmRldik7CisJaWYgKElTX0VSUih4cmNkLT5wZCkpIHsKKwkJZXJyID0gUFRSX0VSUih4cmNkLT5wZCk7CisJCWdvdG8gZXJyMjsKKwl9CisKKwl4cmNkLT5jcSA9IGliX2NyZWF0ZV9jcShpYmRldiwgTlVMTCwgTlVMTCwgeHJjZCwgMSwgMCk7CisJaWYgKElTX0VSUih4cmNkLT5jcSkpIHsKKwkJZXJyID0gUFRSX0VSUih4cmNkLT5jcSk7CisJCWdvdG8gZXJyMzsKKwl9CisKKwlyZXR1cm4gJnhyY2QtPmlieHJjZDsKKworZXJyMzoKKwlpYl9kZWFsbG9jX3BkKHhyY2QtPnBkKTsKK2VycjI6CisJbWx4NF94cmNkX2ZyZWUodG9fbWRldihpYmRldiktPmRldiwgeHJjZC0+eHJjZG4pOworZXJyMToKKwlrZnJlZSh4cmNkKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IG1seDRfaWJfZGVhbGxvY194cmNkKHN0cnVjdCBpYl94cmNkICp4cmNkKQoreworCWliX2Rlc3Ryb3lfY3EodG9fbXhyY2QoeHJjZCktPmNxKTsKKwlpYl9kZWFsbG9jX3BkKHRvX214cmNkKHhyY2QpLT5wZCk7CisJbWx4NF94cmNkX2ZyZWUodG9fbWRldih4cmNkLT5kZXZpY2UpLT5kZXYsIHRvX214cmNkKHhyY2QpLT54cmNkbik7CisJa2ZyZWUoeHJjZCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhZGRfZ2lkX2VudHJ5KHN0cnVjdCBpYl9xcCAqaWJxcCwgdW5pb24gaWJfZ2lkICpnaWQpCiB7CiAJc3RydWN0IG1seDRfaWJfcXAgKm1xcCA9IHRvX21xcChpYnFwKTsKQEAgLTEwNDQsNyArMTEzNCw5IEBACiAJCSgxdWxsIDw8IElCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9TUlEpCQl8CiAJCSgxdWxsIDw8IElCX1VTRVJfVkVSQlNfQ01EX01PRElGWV9TUlEpCQl8CiAJCSgxdWxsIDw8IElCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1NSUSkJCXwKLQkJKDF1bGwgPDwgSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9TUlEpOworCQkoMXVsbCA8PCBJQl9VU0VSX1ZFUkJTX0NNRF9ERVNUUk9ZX1NSUSkJCXwKKwkJKDF1bGwgPDwgSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX1hTUlEpCQl8CisJCSgxdWxsIDw8IElCX1VTRVJfVkVSQlNfQ01EX09QRU5fUVApOwogCiAJaWJkZXYtPmliX2Rldi5xdWVyeV9kZXZpY2UJPSBtbHg0X2liX3F1ZXJ5X2RldmljZTsKIAlpYmRldi0+aWJfZGV2LnF1ZXJ5X3BvcnQJPSBtbHg0X2liX3F1ZXJ5X3BvcnQ7CkBAIC0xMDkzLDYgKzExODUsMTQgQEAKIAlpYmRldi0+aWJfZGV2LnVubWFwX2ZtcgkJPSBtbHg0X2liX3VubWFwX2ZtcjsKIAlpYmRldi0+aWJfZGV2LmRlYWxsb2NfZm1yCT0gbWx4NF9pYl9mbXJfZGVhbGxvYzsKIAorCWlmIChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19YUkMpIHsKKwkJaWJkZXYtPmliX2Rldi5hbGxvY194cmNkID0gbWx4NF9pYl9hbGxvY194cmNkOworCQlpYmRldi0+aWJfZGV2LmRlYWxsb2NfeHJjZCA9IG1seDRfaWJfZGVhbGxvY194cmNkOworCQlpYmRldi0+aWJfZGV2LnV2ZXJic19jbWRfbWFzayB8PQorCQkJKDF1bGwgPDwgSUJfVVNFUl9WRVJCU19DTURfT1BFTl9YUkNEKSB8CisJCQkoMXVsbCA8PCBJQl9VU0VSX1ZFUkJTX0NNRF9DTE9TRV9YUkNEKTsKKwl9CisKIAlzcGluX2xvY2tfaW5pdCgmaWJvZS0+bG9jayk7CiAKIAlpZiAoaW5pdF9ub2RlX2RhdGEoaWJkZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWx4NF9pYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWx4NF9pYi5oCmluZGV4IGU0YmYyY2YuLmVkODAzNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tbHg0X2liLmgKQEAgLTU2LDYgKzU2LDEzIEBACiAJdTMyCQkJcGRuOwogfTsKIAorc3RydWN0IG1seDRfaWJfeHJjZCB7CisJc3RydWN0IGliX3hyY2QJCWlieHJjZDsKKwl1MzIJCQl4cmNkbjsKKwlzdHJ1Y3QgaWJfcGQJICAgICAgICpwZDsKKwlzdHJ1Y3QgaWJfY3EJICAgICAgICpjcTsKK307CisKIHN0cnVjdCBtbHg0X2liX2NxX2J1ZiB7CiAJc3RydWN0IG1seDRfYnVmCQlidWY7CiAJc3RydWN0IG1seDRfbXR0CQltdHQ7CkBAIC0xMzgsNiArMTQ1LDcgQEAKIAlzdHJ1Y3QgbWx4NF9tdHQJCW10dDsKIAlpbnQJCQlidWZfc2l6ZTsKIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OworCXUxNgkJCXhyY2RuOwogCXUzMgkJCWZsYWdzOwogCXU4CQkJcG9ydDsKIAl1OAkJCWFsdF9wb3J0OwpAQCAtMjExLDYgKzIxOSwxMSBAQAogCXJldHVybiBjb250YWluZXJfb2YoaWJwZCwgc3RydWN0IG1seDRfaWJfcGQsIGlicGQpOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtbHg0X2liX3hyY2QgKnRvX214cmNkKHN0cnVjdCBpYl94cmNkICppYnhyY2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihpYnhyY2QsIHN0cnVjdCBtbHg0X2liX3hyY2QsIGlieHJjZCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1seDRfaWJfY3EgKnRvX21jcShzdHJ1Y3QgaWJfY3EgKmliY3EpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihpYmNxLCBzdHJ1Y3QgbWx4NF9pYl9jcSwgaWJjcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYwppbmRleCAzYTkxZDlkLi5hMTZmMGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKQEAgLTMwMiwxNSArMzAyLDE0IEBACiB9CiAKIHN0YXRpYyBpbnQgc2V0X3JxX3NpemUoc3RydWN0IG1seDRfaWJfZGV2ICpkZXYsIHN0cnVjdCBpYl9xcF9jYXAgKmNhcCwKLQkJICAgICAgIGludCBpc191c2VyLCBpbnQgaGFzX3NycSwgc3RydWN0IG1seDRfaWJfcXAgKnFwKQorCQkgICAgICAgaW50IGlzX3VzZXIsIGludCBoYXNfcnEsIHN0cnVjdCBtbHg0X2liX3FwICpxcCkKIHsKIAkvKiBTYW5pdHkgY2hlY2sgUlEgc2l6ZSBiZWZvcmUgcHJvY2VlZGluZyAqLwogCWlmIChjYXAtPm1heF9yZWN2X3dyICA+IGRldi0+ZGV2LT5jYXBzLm1heF93cWVzICB8fAogCSAgICBjYXAtPm1heF9yZWN2X3NnZSA+IGRldi0+ZGV2LT5jYXBzLm1heF9ycV9zZykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaGFzX3NycSkgewotCQkvKiBRUHMgYXR0YWNoZWQgdG8gYW4gU1JRIHNob3VsZCBoYXZlIG5vIFJRICovCisJaWYgKCFoYXNfcnEpIHsKIAkJaWYgKGNhcC0+bWF4X3JlY3Zfd3IpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNDYzLDYgKzQ2MiwxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHFwX2hhc19ycShzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICphdHRyKQoreworCWlmIChhdHRyLT5xcF90eXBlID09IElCX1FQVF9YUkNfSU5JIHx8IGF0dHItPnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19UR1QpCisJCXJldHVybiAwOworCisJcmV0dXJuICFhdHRyLT5zcnE7Cit9CisKIHN0YXRpYyBpbnQgY3JlYXRlX3FwX2NvbW1vbihzdHJ1Y3QgbWx4NF9pYl9kZXYgKmRldiwgc3RydWN0IGliX3BkICpwZCwKIAkJCSAgICBzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICppbml0X2F0dHIsCiAJCQkgICAgc3RydWN0IGliX3VkYXRhICp1ZGF0YSwgaW50IHNxcG4sIHN0cnVjdCBtbHg0X2liX3FwICpxcCkKQEAgLTQ3OSw3ICs0ODYsNyBAQAogCWlmIChpbml0X2F0dHItPnNxX3NpZ190eXBlID09IElCX1NJR05BTF9BTExfV1IpCiAJCXFwLT5zcV9zaWduYWxfYml0cyA9IGNwdV90b19iZTMyKE1MWDRfV1FFX0NUUkxfQ1FfVVBEQVRFKTsKIAotCWVyciA9IHNldF9ycV9zaXplKGRldiwgJmluaXRfYXR0ci0+Y2FwLCAhIXBkLT51b2JqZWN0LCAhIWluaXRfYXR0ci0+c3JxLCBxcCk7CisJZXJyID0gc2V0X3JxX3NpemUoZGV2LCAmaW5pdF9hdHRyLT5jYXAsICEhcGQtPnVvYmplY3QsIHFwX2hhc19ycShpbml0X2F0dHIpLCBxcCk7CiAJaWYgKGVycikKIAkJZ290byBlcnI7CiAKQEAgLTUxMyw3ICs1MjAsNyBAQAogCQlpZiAoZXJyKQogCQkJZ290byBlcnJfbXR0OwogCi0JCWlmICghaW5pdF9hdHRyLT5zcnEpIHsKKwkJaWYgKHFwX2hhc19ycShpbml0X2F0dHIpKSB7CiAJCQllcnIgPSBtbHg0X2liX2RiX21hcF91c2VyKHRvX211Y29udGV4dChwZC0+dW9iamVjdC0+Y29udGV4dCksCiAJCQkJCQkgIHVjbWQuZGJfYWRkciwgJnFwLT5kYik7CiAJCQlpZiAoZXJyKQpAQCAtNTMyLDcgKzUzOSw3IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycjsKIAotCQlpZiAoIWluaXRfYXR0ci0+c3JxKSB7CisJCWlmIChxcF9oYXNfcnEoaW5pdF9hdHRyKSkgewogCQkJZXJyID0gbWx4NF9kYl9hbGxvYyhkZXYtPmRldiwgJnFwLT5kYiwgMCk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXJyOwpAQCAtNTc1LDYgKzU4Miw5IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfcXBuOwogCisJaWYgKGluaXRfYXR0ci0+cXBfdHlwZSA9PSBJQl9RUFRfWFJDX1RHVCkKKwkJcXAtPm1xcC5xcG4gfD0gKDEgPDwgMjMpOworCiAJLyoKIAkgKiBIYXJkd2FyZSB3YW50cyBRUE4gd3JpdHRlbiBpbiBiaWctZW5kaWFuIG9yZGVyIChhZnRlcgogCSAqIHNoaWZ0aW5nKSBmb3Igc2VuZCBkb29yYmVsbC4gIFByZWNvbXB1dGUgdGhpcyB2YWx1ZSB0byBzYXZlCkBAIC01OTIsOSArNjAyLDggQEAKIAogZXJyX3dyaWQ6CiAJaWYgKHBkLT51b2JqZWN0KSB7Ci0JCWlmICghaW5pdF9hdHRyLT5zcnEpCi0JCQltbHg0X2liX2RiX3VubWFwX3VzZXIodG9fbXVjb250ZXh0KHBkLT51b2JqZWN0LT5jb250ZXh0KSwKLQkJCQkJICAgICAgJnFwLT5kYik7CisJCWlmIChxcF9oYXNfcnEoaW5pdF9hdHRyKSkKKwkJCW1seDRfaWJfZGJfdW5tYXBfdXNlcih0b19tdWNvbnRleHQocGQtPnVvYmplY3QtPmNvbnRleHQpLCAmcXAtPmRiKTsKIAl9IGVsc2UgewogCQlrZnJlZShxcC0+c3Eud3JpZCk7CiAJCWtmcmVlKHFwLT5ycS53cmlkKTsKQEAgLTYxMCw3ICs2MTksNyBAQAogCQltbHg0X2J1Zl9mcmVlKGRldi0+ZGV2LCBxcC0+YnVmX3NpemUsICZxcC0+YnVmKTsKIAogZXJyX2RiOgotCWlmICghcGQtPnVvYmplY3QgJiYgIWluaXRfYXR0ci0+c3JxKQorCWlmICghcGQtPnVvYmplY3QgJiYgcXBfaGFzX3JxKGluaXRfYXR0cikpCiAJCW1seDRfZGJfZnJlZShkZXYtPmRldiwgJnFwLT5kYik7CiAKIGVycjoKQEAgLTY3MSw2ICs2ODAsMzMgQEAKIAl9CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbWx4NF9pYl9wZCAqZ2V0X3BkKHN0cnVjdCBtbHg0X2liX3FwICpxcCkKK3sKKwlpZiAocXAtPmlicXAucXBfdHlwZSA9PSBJQl9RUFRfWFJDX1RHVCkKKwkJcmV0dXJuIHRvX21wZCh0b19teHJjZChxcC0+aWJxcC54cmNkKS0+cGQpOworCWVsc2UKKwkJcmV0dXJuIHRvX21wZChxcC0+aWJxcC5wZCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9jcXMoc3RydWN0IG1seDRfaWJfcXAgKnFwLAorCQkgICAgc3RydWN0IG1seDRfaWJfY3EgKipzZW5kX2NxLCBzdHJ1Y3QgbWx4NF9pYl9jcSAqKnJlY3ZfY3EpCit7CisJc3dpdGNoIChxcC0+aWJxcC5xcF90eXBlKSB7CisJY2FzZSBJQl9RUFRfWFJDX1RHVDoKKwkJKnNlbmRfY3EgPSB0b19tY3EodG9fbXhyY2QocXAtPmlicXAueHJjZCktPmNxKTsKKwkJKnJlY3ZfY3EgPSAqc2VuZF9jcTsKKwkJYnJlYWs7CisJY2FzZSBJQl9RUFRfWFJDX0lOSToKKwkJKnNlbmRfY3EgPSB0b19tY3EocXAtPmlicXAuc2VuZF9jcSk7CisJCSpyZWN2X2NxID0gKnNlbmRfY3E7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpzZW5kX2NxID0gdG9fbWNxKHFwLT5pYnFwLnNlbmRfY3EpOworCQkqcmVjdl9jcSA9IHRvX21jcShxcC0+aWJxcC5yZWN2X2NxKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgdm9pZCBkZXN0cm95X3FwX2NvbW1vbihzdHJ1Y3QgbWx4NF9pYl9kZXYgKmRldiwgc3RydWN0IG1seDRfaWJfcXAgKnFwLAogCQkJICAgICAgaW50IGlzX3VzZXIpCiB7CkBAIC02ODIsOCArNzE4LDcgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1seDRfaWI6IG1vZGlmeSBRUCAlMDZ4IHRvIFJFU0VUIGZhaWxlZC5cbiIsCiAJCQkgICAgICAgcXAtPm1xcC5xcG4pOwogCi0Jc2VuZF9jcSA9IHRvX21jcShxcC0+aWJxcC5zZW5kX2NxKTsKLQlyZWN2X2NxID0gdG9fbWNxKHFwLT5pYnFwLnJlY3ZfY3EpOworCWdldF9jcXMocXAsICZzZW5kX2NxLCAmcmVjdl9jcSk7CiAKIAltbHg0X2liX2xvY2tfY3FzKHNlbmRfY3EsIHJlY3ZfY3EpOwogCkBAIC03MDYsNyArNzQxLDcgQEAKIAltbHg0X210dF9jbGVhbnVwKGRldi0+ZGV2LCAmcXAtPm10dCk7CiAKIAlpZiAoaXNfdXNlcikgewotCQlpZiAoIXFwLT5pYnFwLnNycSkKKwkJaWYgKHFwLT5ycS53cWVfY250KQogCQkJbWx4NF9pYl9kYl91bm1hcF91c2VyKHRvX211Y29udGV4dChxcC0+aWJxcC51b2JqZWN0LT5jb250ZXh0KSwKIAkJCQkJICAgICAgJnFwLT5kYik7CiAJCWliX3VtZW1fcmVsZWFzZShxcC0+dW1lbSk7CkBAIC03MTQsNyArNzQ5LDcgQEAKIAkJa2ZyZWUocXAtPnNxLndyaWQpOwogCQlrZnJlZShxcC0+cnEud3JpZCk7CiAJCW1seDRfYnVmX2ZyZWUoZGV2LT5kZXYsIHFwLT5idWZfc2l6ZSwgJnFwLT5idWYpOwotCQlpZiAoIXFwLT5pYnFwLnNycSkKKwkJaWYgKHFwLT5ycS53cWVfY250KQogCQkJbWx4NF9kYl9mcmVlKGRldi0+ZGV2LCAmcXAtPmRiKTsKIAl9CiAKQEAgLTcyNSwxMCArNzYwLDEwIEBACiAJCQkJc3RydWN0IGliX3FwX2luaXRfYXR0ciAqaW5pdF9hdHRyLAogCQkJCXN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCiB7Ci0Jc3RydWN0IG1seDRfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHBkLT5kZXZpY2UpOwogCXN0cnVjdCBtbHg0X2liX3NxcCAqc3FwOwogCXN0cnVjdCBtbHg0X2liX3FwICpxcDsKIAlpbnQgZXJyOworCXUxNiB4cmNkbiA9IDA7CiAKIAkvKgogCSAqIFdlIG9ubHkgc3VwcG9ydCBMU08gYW5kIG11bHRpY2FzdCBsb29wYmFjayBibG9ja2luZywgYW5kCkBAIC03MzksMTAgKzc3NCwyMCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWlmIChpbml0X2F0dHItPmNyZWF0ZV9mbGFncyAmJgotCSAgICAocGQtPnVvYmplY3QgfHwgaW5pdF9hdHRyLT5xcF90eXBlICE9IElCX1FQVF9VRCkpCisJICAgICh1ZGF0YSB8fCBpbml0X2F0dHItPnFwX3R5cGUgIT0gSUJfUVBUX1VEKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlzd2l0Y2ggKGluaXRfYXR0ci0+cXBfdHlwZSkgeworCWNhc2UgSUJfUVBUX1hSQ19UR1Q6CisJCXBkID0gdG9fbXhyY2QoaW5pdF9hdHRyLT54cmNkKS0+cGQ7CisJCXhyY2RuID0gdG9fbXhyY2QoaW5pdF9hdHRyLT54cmNkKS0+eHJjZG47CisJCWluaXRfYXR0ci0+c2VuZF9jcSA9IHRvX214cmNkKGluaXRfYXR0ci0+eHJjZCktPmNxOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIElCX1FQVF9YUkNfSU5JOgorCQlpZiAoISh0b19tZGV2KHBkLT5kZXZpY2UpLT5kZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19YUkMpKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CisJCWluaXRfYXR0ci0+cmVjdl9jcSA9IGluaXRfYXR0ci0+c2VuZF9jcTsKKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBJQl9RUFRfUkM6CiAJY2FzZSBJQl9RUFRfVUM6CiAJY2FzZSBJQl9RUFRfVUQ6CkBAIC03NTEsMTMgKzc5NiwxNCBAQAogCQlpZiAoIXFwKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQkJZXJyID0gY3JlYXRlX3FwX2NvbW1vbihkZXYsIHBkLCBpbml0X2F0dHIsIHVkYXRhLCAwLCBxcCk7CisJCWVyciA9IGNyZWF0ZV9xcF9jb21tb24odG9fbWRldihwZC0+ZGV2aWNlKSwgcGQsIGluaXRfYXR0ciwgdWRhdGEsIDAsIHFwKTsKIAkJaWYgKGVycikgewogCQkJa2ZyZWUocXApOwogCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAkJfQogCiAJCXFwLT5pYnFwLnFwX251bSA9IHFwLT5tcXAucXBuOworCQlxcC0+eHJjZG4gPSB4cmNkbjsKIAogCQlicmVhazsKIAl9CkBAIC03NjUsNyArODExLDcgQEAKIAljYXNlIElCX1FQVF9HU0k6CiAJewogCQkvKiBVc2Vyc3BhY2UgaXMgbm90IGFsbG93ZWQgdG8gY3JlYXRlIHNwZWNpYWwgUVBzOiAqLwotCQlpZiAocGQtPnVvYmplY3QpCisJCWlmICh1ZGF0YSkKIAkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJCXNxcCA9IGt6YWxsb2Moc2l6ZW9mICpzcXAsIEdGUF9LRVJORUwpOwpAQCAtNzc0LDggKzgyMCw4IEBACiAKIAkJcXAgPSAmc3FwLT5xcDsKIAotCQllcnIgPSBjcmVhdGVfcXBfY29tbW9uKGRldiwgcGQsIGluaXRfYXR0ciwgdWRhdGEsCi0JCQkJICAgICAgIGRldi0+ZGV2LT5jYXBzLnNxcF9zdGFydCArCisJCWVyciA9IGNyZWF0ZV9xcF9jb21tb24odG9fbWRldihwZC0+ZGV2aWNlKSwgcGQsIGluaXRfYXR0ciwgdWRhdGEsCisJCQkJICAgICAgIHRvX21kZXYocGQtPmRldmljZSktPmRldi0+Y2Fwcy5zcXBfc3RhcnQgKwogCQkJCSAgICAgICAoaW5pdF9hdHRyLT5xcF90eXBlID09IElCX1FQVF9TTUkgPyAwIDogMikgKwogCQkJCSAgICAgICBpbml0X2F0dHItPnBvcnRfbnVtIC0gMSwKIAkJCQkgICAgICAgcXApOwpAQCAtODAxLDExICs4NDcsMTMgQEAKIHsKIAlzdHJ1Y3QgbWx4NF9pYl9kZXYgKmRldiA9IHRvX21kZXYocXAtPmRldmljZSk7CiAJc3RydWN0IG1seDRfaWJfcXAgKm1xcCA9IHRvX21xcChxcCk7CisJc3RydWN0IG1seDRfaWJfcGQgKnBkOwogCiAJaWYgKGlzX3FwMChkZXYsIG1xcCkpCiAJCW1seDRfQ0xPU0VfUE9SVChkZXYtPmRldiwgbXFwLT5wb3J0KTsKIAotCWRlc3Ryb3lfcXBfY29tbW9uKGRldiwgbXFwLCAhIXFwLT5wZC0+dW9iamVjdCk7CisJcGQgPSBnZXRfcGQobXFwKTsKKwlkZXN0cm95X3FwX2NvbW1vbihkZXYsIG1xcCwgISFwZC0+aWJwZC51b2JqZWN0KTsKIAogCWlmIChpc19zcXAoZGV2LCBtcXApKQogCQlrZnJlZSh0b19tc3FwKG1xcCkpOwpAQCAtODIxLDYgKzg2OSw4IEBACiAJY2FzZSBJQl9RUFRfUkM6CQlyZXR1cm4gTUxYNF9RUF9TVF9SQzsKIAljYXNlIElCX1FQVF9VQzoJCXJldHVybiBNTFg0X1FQX1NUX1VDOwogCWNhc2UgSUJfUVBUX1VEOgkJcmV0dXJuIE1MWDRfUVBfU1RfVUQ7CisJY2FzZSBJQl9RUFRfWFJDX0lOSToKKwljYXNlIElCX1FQVF9YUkNfVEdUOglyZXR1cm4gTUxYNF9RUF9TVF9YUkM7CiAJY2FzZSBJQl9RUFRfU01JOgogCWNhc2UgSUJfUVBUX0dTSToJcmV0dXJuIE1MWDRfUVBfU1RfTUxYOwogCWRlZmF1bHQ6CQlyZXR1cm4gLTE7CkBAIC05NTksNiArMTAwOSw4IEBACiB7CiAJc3RydWN0IG1seDRfaWJfZGV2ICpkZXYgPSB0b19tZGV2KGlicXAtPmRldmljZSk7CiAJc3RydWN0IG1seDRfaWJfcXAgKnFwID0gdG9fbXFwKGlicXApOworCXN0cnVjdCBtbHg0X2liX3BkICpwZDsKKwlzdHJ1Y3QgbWx4NF9pYl9jcSAqc2VuZF9jcSwgKnJlY3ZfY3E7CiAJc3RydWN0IG1seDRfcXBfY29udGV4dCAqY29udGV4dDsKIAllbnVtIG1seDRfcXBfb3B0cGFyIG9wdHBhciA9IDA7CiAJaW50IHNxZF9ldmVudDsKQEAgLTEwMTQsOCArMTA2NiwxMCBAQAogCQljb250ZXh0LT5zcV9zaXplX3N0cmlkZSA9IGlsb2cyKHFwLT5zcS53cWVfY250KSA8PCAzOwogCWNvbnRleHQtPnNxX3NpemVfc3RyaWRlIHw9IHFwLT5zcS53cWVfc2hpZnQgLSA0OwogCi0JaWYgKGN1cl9zdGF0ZSA9PSBJQl9RUFNfUkVTRVQgJiYgbmV3X3N0YXRlID09IElCX1FQU19JTklUKQorCWlmIChjdXJfc3RhdGUgPT0gSUJfUVBTX1JFU0VUICYmIG5ld19zdGF0ZSA9PSBJQl9RUFNfSU5JVCkgewogCQljb250ZXh0LT5zcV9zaXplX3N0cmlkZSB8PSAhIXFwLT5zcV9ub19wcmVmZXRjaCA8PCA3OworCQljb250ZXh0LT54cmNkID0gY3B1X3RvX2JlMzIoKHUzMikgcXAtPnhyY2RuKTsKKwl9CiAKIAlpZiAocXAtPmlicXAudW9iamVjdCkKIAkJY29udGV4dC0+dXNyX3BhZ2UgPSBjcHVfdG9fYmUzMih0b19tdWNvbnRleHQoaWJxcC0+dW9iamVjdC0+Y29udGV4dCktPnVhci5pbmRleCk7CkBAIC0xMDc5LDggKzExMzMsMTIgQEAKIAkJb3B0cGFyIHw9IE1MWDRfUVBfT1BUUEFSX0FMVF9BRERSX1BBVEg7CiAJfQogCi0JY29udGV4dC0+cGQJICAgID0gY3B1X3RvX2JlMzIodG9fbXBkKGlicXAtPnBkKS0+cGRuKTsKLQljb250ZXh0LT5wYXJhbXMxICAgID0gY3B1X3RvX2JlMzIoTUxYNF9JQl9BQ0tfUkVRX0ZSRVEgPDwgMjgpOworCXBkID0gZ2V0X3BkKHFwKTsKKwlnZXRfY3FzKHFwLCAmc2VuZF9jcSwgJnJlY3ZfY3EpOworCWNvbnRleHQtPnBkICAgICAgID0gY3B1X3RvX2JlMzIocGQtPnBkbik7CisJY29udGV4dC0+Y3FuX3NlbmQgPSBjcHVfdG9fYmUzMihzZW5kX2NxLT5tY3EuY3FuKTsKKwljb250ZXh0LT5jcW5fcmVjdiA9IGNwdV90b19iZTMyKHJlY3ZfY3EtPm1jcS5jcW4pOworCWNvbnRleHQtPnBhcmFtczEgID0gY3B1X3RvX2JlMzIoTUxYNF9JQl9BQ0tfUkVRX0ZSRVEgPDwgMjgpOwogCiAJLyogU2V0ICJmYXN0IHJlZ2lzdHJhdGlvbiBlbmFibGVkIiBmb3IgYWxsIGtlcm5lbCBRUHMgKi8KIAlpZiAoIXFwLT5pYnFwLnVvYmplY3QpCkBAIC0xMTA2LDggKzExNjQsNiBAQAogCWlmIChhdHRyX21hc2sgJiBJQl9RUF9TUV9QU04pCiAJCWNvbnRleHQtPm5leHRfc2VuZF9wc24gPSBjcHVfdG9fYmUzMihhdHRyLT5zcV9wc24pOwogCi0JY29udGV4dC0+Y3FuX3NlbmQgPSBjcHVfdG9fYmUzMih0b19tY3EoaWJxcC0+c2VuZF9jcSktPm1jcS5jcW4pOwotCiAJaWYgKGF0dHJfbWFzayAmIElCX1FQX01BWF9ERVNUX1JEX0FUT01JQykgewogCQlpZiAoYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljKQogCQkJY29udGV4dC0+cGFyYW1zMiB8PQpAQCAtMTEzMCw4ICsxMTg2LDYgQEAKIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfUlFfUFNOKQogCQljb250ZXh0LT5ybnJfbmV4dHJlY3Zwc24gfD0gY3B1X3RvX2JlMzIoYXR0ci0+cnFfcHNuKTsKIAotCWNvbnRleHQtPmNxbl9yZWN2ID0gY3B1X3RvX2JlMzIodG9fbWNxKGlicXAtPnJlY3ZfY3EpLT5tY3EuY3FuKTsKLQogCWlmIChhdHRyX21hc2sgJiBJQl9RUF9RS0VZKSB7CiAJCWNvbnRleHQtPnFrZXkgPSBjcHVfdG9fYmUzMihhdHRyLT5xa2V5KTsKIAkJb3B0cGFyIHw9IE1MWDRfUVBfT1BUUEFSX1FfS0VZOwpAQCAtMTE0MCw3ICsxMTk0LDcgQEAKIAlpZiAoaWJxcC0+c3JxKQogCQljb250ZXh0LT5zcnFuID0gY3B1X3RvX2JlMzIoMSA8PCAyNCB8IHRvX21zcnEoaWJxcC0+c3JxKS0+bXNycS5zcnFuKTsKIAotCWlmICghaWJxcC0+c3JxICYmIGN1cl9zdGF0ZSA9PSBJQl9RUFNfUkVTRVQgJiYgbmV3X3N0YXRlID09IElCX1FQU19JTklUKQorCWlmIChxcC0+cnEud3FlX2NudCAmJiBjdXJfc3RhdGUgPT0gSUJfUVBTX1JFU0VUICYmIG5ld19zdGF0ZSA9PSBJQl9RUFNfSU5JVCkKIAkJY29udGV4dC0+ZGJfcmVjX2FkZHIgPSBjcHVfdG9fYmU2NChxcC0+ZGIuZG1hKTsKIAogCWlmIChjdXJfc3RhdGUgPT0gSUJfUVBTX0lOSVQgJiYKQEAgLTEyMjUsMTcgKzEyNzksMTcgQEAKIAkgKiBlbnRyaWVzIGFuZCByZWluaXRpYWxpemUgdGhlIFFQLgogCSAqLwogCWlmIChuZXdfc3RhdGUgPT0gSUJfUVBTX1JFU0VUICYmICFpYnFwLT51b2JqZWN0KSB7Ci0JCW1seDRfaWJfY3FfY2xlYW4odG9fbWNxKGlicXAtPnJlY3ZfY3EpLCBxcC0+bXFwLnFwbiwKKwkJbWx4NF9pYl9jcV9jbGVhbihyZWN2X2NxLCBxcC0+bXFwLnFwbiwKIAkJCQkgaWJxcC0+c3JxID8gdG9fbXNycShpYnFwLT5zcnEpOiBOVUxMKTsKLQkJaWYgKGlicXAtPnNlbmRfY3EgIT0gaWJxcC0+cmVjdl9jcSkKLQkJCW1seDRfaWJfY3FfY2xlYW4odG9fbWNxKGlicXAtPnNlbmRfY3EpLCBxcC0+bXFwLnFwbiwgTlVMTCk7CisJCWlmIChzZW5kX2NxICE9IHJlY3ZfY3EpCisJCQltbHg0X2liX2NxX2NsZWFuKHNlbmRfY3EsIHFwLT5tcXAucXBuLCBOVUxMKTsKIAogCQlxcC0+cnEuaGVhZCA9IDA7CiAJCXFwLT5ycS50YWlsID0gMDsKIAkJcXAtPnNxLmhlYWQgPSAwOwogCQlxcC0+c3EudGFpbCA9IDA7CiAJCXFwLT5zcV9uZXh0X3dxZSA9IDA7Ci0JCWlmICghaWJxcC0+c3JxKQorCQlpZiAocXAtPnJxLndxZV9jbnQpCiAJCQkqcXAtPmRiLmRiICA9IDA7CiAJfQogCkBAIC0xNTQ3LDE0ICsxNjAxLDEzIEBACiB9CiAKIHN0YXRpYyB2b2lkIHNldF9kYXRhZ3JhbV9zZWcoc3RydWN0IG1seDRfd3FlX2RhdGFncmFtX3NlZyAqZHNlZywKLQkJCSAgICAgc3RydWN0IGliX3NlbmRfd3IgKndyLCBfX2JlMTYgKnZsYW4pCisJCQkgICAgIHN0cnVjdCBpYl9zZW5kX3dyICp3cikKIHsKIAltZW1jcHkoZHNlZy0+YXYsICZ0b19tYWgod3ItPndyLnVkLmFoKS0+YXYsIHNpemVvZiAoc3RydWN0IG1seDRfYXYpKTsKIAlkc2VnLT5kcXBuID0gY3B1X3RvX2JlMzIod3ItPndyLnVkLnJlbW90ZV9xcG4pOwogCWRzZWctPnFrZXkgPSBjcHVfdG9fYmUzMih3ci0+d3IudWQucmVtb3RlX3FrZXkpOwogCWRzZWctPnZsYW4gPSB0b19tYWgod3ItPndyLnVkLmFoKS0+YXYuZXRoLnZsYW47CiAJbWVtY3B5KGRzZWctPm1hYywgdG9fbWFoKHdyLT53ci51ZC5haCktPmF2LmV0aC5tYWMsIDYpOwotCSp2bGFuID0gZHNlZy0+dmxhbjsKIH0KIAogc3RhdGljIHZvaWQgc2V0X21seF9pY3JjX3NlZyh2b2lkICpkc2VnKQpAQCAtMTY1Nyw3ICsxNzEwLDYgQEAKIAlfX2JlMzIgdW5pbml0aWFsaXplZF92YXIobHNvX2hkcl9zeik7CiAJX19iZTMyIGJsaDsKIAlpbnQgaTsKLQlfX2JlMTYgdmxhbiA9IGNwdV90b19iZTE2KDB4ZmZmZik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXAtPnNxLmxvY2ssIGZsYWdzKTsKIApAQCAtMTc2MSw3ICsxODEzLDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgSUJfUVBUX1VEOgotCQkJc2V0X2RhdGFncmFtX3NlZyh3cWUsIHdyLCAmdmxhbik7CisJCQlzZXRfZGF0YWdyYW1fc2VnKHdxZSwgd3IpOwogCQkJd3FlICArPSBzaXplb2YgKHN0cnVjdCBtbHg0X3dxZV9kYXRhZ3JhbV9zZWcpOwogCQkJc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBtbHg0X3dxZV9kYXRhZ3JhbV9zZWcpIC8gMTY7CiAKQEAgLTE4MjQsMTEgKzE4NzYsNiBAQAogCQljdHJsLT5mZW5jZV9zaXplID0gKHdyLT5zZW5kX2ZsYWdzICYgSUJfU0VORF9GRU5DRSA/CiAJCQkJICAgIE1MWDRfV1FFX0NUUkxfRkVOQ0UgOiAwKSB8IHNpemU7CiAKLQkJaWYgKGJlMTZfdG9fY3B1KHZsYW4pIDwgMHgxMDAwKSB7Ci0JCQljdHJsLT5pbnNfdmxhbiA9IDEgPDwgNjsKLQkJCWN0cmwtPnZsYW5fdGFnID0gdmxhbjsKLQkJfQotCiAJCS8qCiAJCSAqIE1ha2Ugc3VyZSBkZXNjcmlwdG9yIGlzIGZ1bGx5IHdyaXR0ZW4gYmVmb3JlCiAJCSAqIHNldHRpbmcgb3duZXJzaGlwIGJpdCAoYmVjYXVzZSBIVyBjYW4gc3RhcnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3NycS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvc3JxLmMKaW5kZXggODE4YjdlYy4uMzk1NDJmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvc3JxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvc3JxLmMKQEAgLTc2LDYgKzc2LDggQEAKIAlzdHJ1Y3QgbWx4NF9pYl9zcnEgKnNycTsKIAlzdHJ1Y3QgbWx4NF93cWVfc3JxX25leHRfc2VnICpuZXh0OwogCXN0cnVjdCBtbHg0X3dxZV9kYXRhX3NlZyAqc2NhdHRlcjsKKwl1MzIgY3FuOworCXUxNiB4cmNkbjsKIAlpbnQgZGVzY19zaXplOwogCWludCBidWZfc2l6ZTsKIAlpbnQgZXJyOwpAQCAtMTc0LDEyICsxNzYsMTggQEAKIAkJfQogCX0KIAotCWVyciA9IG1seDRfc3JxX2FsbG9jKGRldi0+ZGV2LCB0b19tcGQocGQpLT5wZG4sICZzcnEtPm10dCwKKwljcW4gPSAoaW5pdF9hdHRyLT5zcnFfdHlwZSA9PSBJQl9TUlFUX1hSQykgPworCQl0b19tY3EoaW5pdF9hdHRyLT5leHQueHJjLmNxKS0+bWNxLmNxbiA6IDA7CisJeHJjZG4gPSAoaW5pdF9hdHRyLT5zcnFfdHlwZSA9PSBJQl9TUlFUX1hSQykgPworCQl0b19teHJjZChpbml0X2F0dHItPmV4dC54cmMueHJjZCktPnhyY2RuIDoKKwkJKHUxNikgZGV2LT5kZXYtPmNhcHMucmVzZXJ2ZWRfeHJjZHM7CisJZXJyID0gbWx4NF9zcnFfYWxsb2MoZGV2LT5kZXYsIHRvX21wZChwZCktPnBkbiwgY3FuLCB4cmNkbiwgJnNycS0+bXR0LAogCQkJICAgICBzcnEtPmRiLmRtYSwgJnNycS0+bXNycSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfd3JpZDsKIAogCXNycS0+bXNycS5ldmVudCA9IG1seDRfaWJfc3JxX2V2ZW50OworCXNycS0+aWJzcnEuZXh0LnhyYy5zcnFfbnVtID0gc3JxLT5tc3JxLnNycW47CiAKIAlpZiAocGQtPnVvYmplY3QpCiAJCWlmIChpYl9jb3B5X3RvX3VkYXRhKHVkYXRhLCAmc3JxLT5tc3JxLnNycW4sIHNpemVvZiAoX191MzIpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY2F0YXMuYwppbmRleCBlNGEwOGMyLi43MTJkMmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY2F0YXMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY2F0YXMuYwpAQCAtMzEsNiArMzEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCmluZGV4IDMwODJiM2IuLjlkM2U1YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHJkbWEvaWJfbWFkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCmluZGV4IGFiODc2ZjkuLmVkOWE5ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogCWJ1ZGR5LT5iaXRzID0ga3phbGxvYygoYnVkZHktPm1heF9vcmRlciArIDEpICogc2l6ZW9mIChsb25nICopLAogCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JYnVkZHktPm51bV9mcmVlID0ga3phbGxvYygoYnVkZHktPm1heF9vcmRlciArIDEpICogc2l6ZW9mIChpbnQgKiksCisJYnVkZHktPm51bV9mcmVlID0ga2NhbGxvYygoYnVkZHktPm1heF9vcmRlciArIDEpLCBzaXplb2YgKmJ1ZGR5LT5udW1fZnJlZSwKIAkJCQkgIEdGUF9LRVJORUwpOwogCWlmICghYnVkZHktPmJpdHMgfHwgIWJ1ZGR5LT5udW1fZnJlZSkKIAkJZ290byBlcnJfb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYwppbmRleCAzNjVmZTBlLi41YjcxZDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYwpAQCAtNDAsNyArNDAsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJtdGhjYV9kZXYuaCIKICNpbmNsdWRlICJtdGhjYV9jbWQuaCIKQEAgLTQzOCw2ICs0NDAsOSBAQAogCXN0cnVjdCBtdGhjYV9zcnEgKnNycTsKIAlpbnQgZXJyOwogCisJaWYgKGluaXRfYXR0ci0+c3JxX3R5cGUgIT0gSUJfU1JRVF9CQVNJQykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CisKIAlzcnEgPSBrbWFsbG9jKHNpemVvZiAqc3JxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNycSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL01ha2VmaWxlIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9NYWtlZmlsZQppbmRleCAzNTE0ODUxLi45NzgyMGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvTWFrZWZpbGUKQEAgLTEsMyArMSwzIEBACiBvYmotJChDT05GSUdfSU5GSU5JQkFORF9ORVMpICs9IGl3X25lcy5vCiAKLWl3X25lcy1vYmpzIDo9IG5lcy5vIG5lc19ody5vIG5lc19uaWMubyBuZXNfdXRpbHMubyBuZXNfdmVyYnMubyBuZXNfY20ubworaXdfbmVzLW9ianMgOj0gbmVzLm8gbmVzX2h3Lm8gbmVzX25pYy5vIG5lc191dGlscy5vIG5lc192ZXJicy5vIG5lc19jbS5vIG5lc19tZ3QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzLmMKaW5kZXggMmQ2NjhjNi4uNTk2NWIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lcy5jCkBAIC04NCw3ICs4NCw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHNlbmRfZmlyc3QsICJTZW5kIFJETUEgTWVzc2FnZSBGaXJzdCBvbiBBY3RpdmUgQ29ubmVjdGlvbiIpOwogCiAKLXVuc2lnbmVkIGludCBuZXNfZHJ2X29wdCA9IDA7Cit1bnNpZ25lZCBpbnQgbmVzX2Rydl9vcHQgPSBORVNfRFJWX09QVF9ESVNBQkxFX0lOVF9NT0QgfCBORVNfRFJWX09QVF9FTkFCTEVfUEFVOwogbW9kdWxlX3BhcmFtKG5lc19kcnZfb3B0LCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhuZXNfZHJ2X29wdCwgIkRyaXZlciBvcHRpb24gcGFyYW1ldGVycyIpOwogCkBAIC0xMzAsOSArMTMwLDYgQEAKIAkubm90aWZpZXJfY2FsbCA9IG5lc19uZXRfZXZlbnQKIH07CiAKLQotCi0KIC8qKgogICogbmVzX2luZXRhZGRyX2V2ZW50CiAgKi8KQEAgLTMyMSw2ICszMTgsOSBAQAogCX0KIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZuZXNxcC0+cmVmY291bnQpKSB7CisJCWlmIChuZXNxcC0+cGF1X21vZGUpCisJCQluZXNfZGVzdHJveV9wYXVfcXAobmVzZGV2LCBuZXNxcCk7CisKIAkJLyogRGVzdHJveSB0aGUgUVAgKi8KIAkJY3FwX3JlcXVlc3QgPSBuZXNfZ2V0X2NxcF9yZXF1ZXN0KG5lc2Rldik7CiAJCWlmIChjcXBfcmVxdWVzdCA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lcy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXMuaAppbmRleCA2ZmU3OTg3Li41NjhiNGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lcy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzLmgKQEAgLTEwMiw2ICsxMDIsNyBAQAogI2RlZmluZSBORVNfRFJWX09QVF9OT19JTkxJTkVfREFUQSAgICAgICAweDAwMDAwMDgwCiAjZGVmaW5lIE5FU19EUlZfT1BUX0RJU0FCTEVfSU5UX01PRCAgICAgIDB4MDAwMDAxMDAKICNkZWZpbmUgTkVTX0RSVl9PUFRfRElTQUJMRV9WSVJUX1dRICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBORVNfRFJWX09QVF9FTkFCTEVfUEFVICAgICAgICAgICAweDAwMDAwNDAwCiAKICNkZWZpbmUgTkVTX0FFUV9FVkVOVF9USU1FT1VUICAgICAgICAgMjUwMAogI2RlZmluZSBORVNfRElTQ09OTkVDVF9FVkVOVF9USU1FT1VUICAyMDAwCkBAIC0xMjgsNiArMTI5LDcgQEAKICNkZWZpbmUgTkVTX0RCR19JV19SWCAgICAgICAweDAwMDIwMDAwCiAjZGVmaW5lIE5FU19EQkdfSVdfVFggICAgICAgMHgwMDA0MDAwMAogI2RlZmluZSBORVNfREJHX1NIVVRET1dOICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgTkVTX0RCR19QQVUgICAgICAgICAweDAwMTAwMDAwCiAjZGVmaW5lIE5FU19EQkdfUlNWRDEgICAgICAgMHgxMDAwMDAwMAogI2RlZmluZSBORVNfREJHX1JTVkQyICAgICAgIDB4MjAwMDAwMDAKICNkZWZpbmUgTkVTX0RCR19SU1ZEMyAgICAgICAweDQwMDAwMDAwCkBAIC0xNjIsNiArMTY0LDcgQEAKICNpbmNsdWRlICJuZXNfY29udGV4dC5oIgogI2luY2x1ZGUgIm5lc191c2VyLmgiCiAjaW5jbHVkZSAibmVzX2NtLmgiCisjaW5jbHVkZSAibmVzX21ndC5oIgogCiBleHRlcm4gaW50IG1heF9tdHU7CiAjZGVmaW5lIG1heF9mcmFtZV9sZW4gKG1heF9tdHUrRVRIX0hMRU4pCkBAIC0yMDIsNiArMjA1LDggQEAKIGV4dGVybiBhdG9taWNfdCBjbV9ub2Rlc19kZXN0cm95ZWQ7CiBleHRlcm4gYXRvbWljX3QgY21fYWNjZWxfZHJvcHBlZF9wa3RzOwogZXh0ZXJuIGF0b21pY190IGNtX3Jlc2V0c19yZWN2ZDsKK2V4dGVybiBhdG9taWNfdCBwYXVfcXBzX2NyZWF0ZWQ7CitleHRlcm4gYXRvbWljX3QgcGF1X3Fwc19kZXN0cm95ZWQ7CiAKIGV4dGVybiB1MzIgaW50X21vZF90aW1lcl9pbml0OwogZXh0ZXJuIHUzMiBpbnRfbW9kX2NxX2RlcHRoXzI1NjsKQEAgLTI3Myw2ICsyNzgsMTQgQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjaGVjazsKIH07CiAKKy8qIFJlY2VpdmUgc2tiIHByaXZhdGUgYXJlYSAtIG11c3QgZml0IGluIHNrYi0+Y2IgYXJlYSAqLworc3RydWN0IG5lc19yc2tiX2NiIHsKKwl1NjQgICAgICAgICAgICAgICAgICAgIGJ1c2FkZHI7CisJdTMyICAgICAgICAgICAgICAgICAgICBtYXBsZW47CisJdTMyICAgICAgICAgICAgICAgICAgICBzZXFudW07CisJdTggICAgICAgICAgICAgICAgICAgICAqZGF0YV9zdGFydDsKKwlzdHJ1Y3QgbmVzX3FwICAgICAgICAgICpuZXNxcDsKK307CiAKIHN0YXRpYyBpbmxpbmUgX19sZTMyIGdldF9jcmNfdmFsdWUoc3RydWN0IG5lc192NF9xdWFkICpuZXNfcXVhZCkKIHsKQEAgLTMwNSw4ICszMTgsOCBAQAogc3RhdGljIGlubGluZSB2b2lkCiBuZXNfZmlsbF9pbml0X2NxcF93cWUoc3RydWN0IG5lc19od19jcXBfd3FlICpjcXBfd3FlLCBzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2KQogewotCXNldF93cWVfNjRiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1dRRV9DT01QX0NUWF9MT1dfSURYLAotCQkJKHU2NCkoKHVuc2lnbmVkIGxvbmcpICZuZXNkZXYtPmNxcCkpOworCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9DT01QX0NUWF9MT1dfSURYXSAgICAgICA9IDA7CisJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX0NPTVBfQ1RYX0hJR0hfSURYXSAgICAgID0gMDsKIAljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfQ09NUF9TQ1JBVENIX0xPV19JRFhdICAgPSAwOwogCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9DT01QX1NDUkFUQ0hfSElHSF9JRFhdICA9IDA7CiAJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfU1RBR19XUUVfUEJMX0JMS19DT1VOVF9JRFhdID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCmluZGV4IGMxMTg2NjMuLmRmY2U5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYwpAQCAtNzcsMjYgKzc3LDE5IEBACiBhdG9taWNfdCBjbV9hY2NlbF9kcm9wcGVkX3BrdHM7CiBhdG9taWNfdCBjbV9yZXNldHNfcmVjdmQ7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1pbmlfY21fYWNjZWxlcmF0ZWQoc3RydWN0IG5lc19jbV9jb3JlICosCi0Jc3RydWN0IG5lc19jbV9ub2RlICopOwotc3RhdGljIHN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKm1pbmlfY21fbGlzdGVuKHN0cnVjdCBuZXNfY21fY29yZSAqLAotCXN0cnVjdCBuZXNfdm5pYyAqLCBzdHJ1Y3QgbmVzX2NtX2luZm8gKik7CitzdGF0aWMgaW5saW5lIGludCBtaW5pX2NtX2FjY2VsZXJhdGVkKHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKik7CitzdGF0aWMgc3RydWN0IG5lc19jbV9saXN0ZW5lciAqbWluaV9jbV9saXN0ZW4oc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBuZXNfdm5pYyAqLCBzdHJ1Y3QgbmVzX2NtX2luZm8gKik7CiBzdGF0aWMgaW50IG1pbmlfY21fZGVsX2xpc3RlbihzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IG5lc19jbV9saXN0ZW5lciAqKTsKLXN0YXRpYyBzdHJ1Y3QgbmVzX2NtX25vZGUgKm1pbmlfY21fY29ubmVjdChzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwKLQlzdHJ1Y3QgbmVzX3ZuaWMgKiwgdTE2LCB2b2lkICosIHN0cnVjdCBuZXNfY21faW5mbyAqKTsKK3N0YXRpYyBzdHJ1Y3QgbmVzX2NtX25vZGUgKm1pbmlfY21fY29ubmVjdChzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IG5lc192bmljICosIHUxNiwgdm9pZCAqLCBzdHJ1Y3QgbmVzX2NtX2luZm8gKik7CiBzdGF0aWMgaW50IG1pbmlfY21fY2xvc2Uoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBuZXNfY21fbm9kZSAqKTsKLXN0YXRpYyBpbnQgbWluaV9jbV9hY2NlcHQoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBpZXRmX21wYV9mcmFtZSAqLAotCXN0cnVjdCBuZXNfY21fbm9kZSAqKTsKLXN0YXRpYyBpbnQgbWluaV9jbV9yZWplY3Qoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBpZXRmX21wYV9mcmFtZSAqLAotCXN0cnVjdCBuZXNfY21fbm9kZSAqKTsKLXN0YXRpYyBpbnQgbWluaV9jbV9yZWN2X3BrdChzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IG5lc192bmljICosCi0Jc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50IG1pbmlfY21fYWNjZXB0KHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKik7CitzdGF0aWMgaW50IG1pbmlfY21fcmVqZWN0KHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKik7CitzdGF0aWMgaW50IG1pbmlfY21fcmVjdl9wa3Qoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBuZXNfdm5pYyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIHN0YXRpYyBpbnQgbWluaV9jbV9kZWFsbG9jX2NvcmUoc3RydWN0IG5lc19jbV9jb3JlICopOwogc3RhdGljIGludCBtaW5pX2NtX2dldChzdHJ1Y3QgbmVzX2NtX2NvcmUgKik7CiBzdGF0aWMgaW50IG1pbmlfY21fc2V0KHN0cnVjdCBuZXNfY21fY29yZSAqLCB1MzIsIHUzMik7CiAKLXN0YXRpYyB2b2lkIGZvcm1fY21fZnJhbWUoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5lc19jbV9ub2RlICosCi0Jdm9pZCAqLCB1MzIsIHZvaWQgKiwgdTMyLCB1OCk7CitzdGF0aWMgdm9pZCBmb3JtX2NtX2ZyYW1lKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXNfY21fbm9kZSAqLCB2b2lkICosIHUzMiwgdm9pZCAqLCB1MzIsIHU4KTsKIHN0YXRpYyBpbnQgYWRkX3JlZl9jbV9ub2RlKHN0cnVjdCBuZXNfY21fbm9kZSAqKTsKIHN0YXRpYyBpbnQgcmVtX3JlZl9jbV9ub2RlKHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKik7CiAKQEAgLTExMSwxNiArMTA0LDE0IEBACiBzdGF0aWMgaW50IHNlbmRfcmVzZXQoc3RydWN0IG5lc19jbV9ub2RlICosIHN0cnVjdCBza19idWZmICopOwogc3RhdGljIGludCBzZW5kX2FjayhzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHN0cnVjdCBza19idWZmICpza2IpOwogc3RhdGljIGludCBzZW5kX2ZpbihzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHN0cnVjdCBza19idWZmICpza2IpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19wYWNrZXQoc3RydWN0IG5lc19jbV9ub2RlICosIHN0cnVjdCBza19idWZmICosCi0Jc3RydWN0IG5lc19jbV9jb3JlICopOworc3RhdGljIHZvaWQgcHJvY2Vzc19wYWNrZXQoc3RydWN0IG5lc19jbV9ub2RlICosIHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXNfY21fY29yZSAqKTsKIAogc3RhdGljIHZvaWQgYWN0aXZlX29wZW5fZXJyKHN0cnVjdCBuZXNfY21fbm9kZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBpbnQpOwogc3RhdGljIHZvaWQgcGFzc2l2ZV9vcGVuX2VycihzdHJ1Y3QgbmVzX2NtX25vZGUgKiwgc3RydWN0IHNrX2J1ZmYgKiwgaW50KTsKIHN0YXRpYyB2b2lkIGNsZWFudXBfcmV0cmFuc19lbnRyeShzdHJ1Y3QgbmVzX2NtX25vZGUgKik7CiBzdGF0aWMgdm9pZCBoYW5kbGVfcmN2X21wYShzdHJ1Y3QgbmVzX2NtX25vZGUgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiBzdGF0aWMgdm9pZCBmcmVlX3JldHJhbnNfZW50cnkoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKTsKLXN0YXRpYyBpbnQgaGFuZGxlX3RjcF9vcHRpb25zKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHRjcGhkciAqdGNwaCwKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb3B0aW9uc2l6ZSwgaW50IHBhc3NpdmUpOworc3RhdGljIGludCBoYW5kbGVfdGNwX29wdGlvbnMoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3QgdGNwaGRyICp0Y3BoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb3B0aW9uc2l6ZSwgaW50IHBhc3NpdmUpOwogCiAvKiBDTSBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIHZvaWQgY21fZXZlbnRfY29ubmVjdGVkKHN0cnVjdCBuZXNfY21fZXZlbnQgKik7CkBAIC0xMzAsNiArMTIxLDEyIEBACiBzdGF0aWMgdm9pZCBjbV9ldmVudF9tcGFfcmVqZWN0KHN0cnVjdCBuZXNfY21fZXZlbnQgKik7CiBzdGF0aWMgdm9pZCBoYW5kbGVfcmVjdl9lbnRyeShzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHUzMiByZW1fbm9kZSk7CiAKKy8qIE1QQSBidWlsZCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgY21fYnVpbGRfbXBhX2ZyYW1lKHN0cnVjdCBuZXNfY21fbm9kZSAqLCB1OCAqKiwgdTE2ICosIHU4ICosIHU4KTsKK3N0YXRpYyB2b2lkIGJ1aWxkX21wYV92MihzdHJ1Y3QgbmVzX2NtX25vZGUgKiwgdm9pZCAqLCB1OCk7CitzdGF0aWMgdm9pZCBidWlsZF9tcGFfdjEoc3RydWN0IG5lc19jbV9ub2RlICosIHZvaWQgKiwgdTgpOworc3RhdGljIHZvaWQgYnVpbGRfcmRtYTBfbXNnKHN0cnVjdCBuZXNfY21fbm9kZSAqLCBzdHJ1Y3QgbmVzX3FwICoqKTsKKwogc3RhdGljIHZvaWQgcHJpbnRfY29yZShzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNvcmUpOwogCiAvKiBFeHRlcm5hbCBDTSBBUEkgSW50ZXJmYWNlICovCkBAIC0xNTksMTIgKzE1NiwyMSBAQAogYXRvbWljX3QgY21fY29ubmVjdF9yZXFzOwogYXRvbWljX3QgY21fcmVqZWN0czsKIAoraW50IG5lc19hZGRfcmVmX2NtX25vZGUoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKQoreworCXJldHVybiBhZGRfcmVmX2NtX25vZGUoY21fbm9kZSk7Cit9CisKK2ludCBuZXNfcmVtX3JlZl9jbV9ub2RlKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSkKK3sKKwlyZXR1cm4gcmVtX3JlZl9jbV9ub2RlKGNtX25vZGUtPmNtX2NvcmUsIGNtX25vZGUpOworfQogCiAvKioKICAqIGNyZWF0ZV9ldmVudAogICovCi1zdGF0aWMgc3RydWN0IG5lc19jbV9ldmVudCAqY3JlYXRlX2V2ZW50KHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwKLQkJZW51bSBuZXNfY21fZXZlbnRfdHlwZSB0eXBlKQorc3RhdGljIHN0cnVjdCBuZXNfY21fZXZlbnQgKmNyZWF0ZV9ldmVudChzdHJ1Y3QgbmVzX2NtX25vZGUgKgljbV9ub2RlLAorCQkJCQkgZW51bSBuZXNfY21fZXZlbnRfdHlwZSB0eXBlKQogewogCXN0cnVjdCBuZXNfY21fZXZlbnQgKmV2ZW50OwogCkBAIC0xODYsMTAgKzE5MiwxMCBAQAogCWV2ZW50LT5jbV9pbmZvLmNtX2lkID0gY21fbm9kZS0+Y21faWQ7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgImNtX25vZGU9JXAgQ3JlYXRlZCBldmVudD0lcCwgdHlwZT0ldSwgIgotCQkiZHN0X2FkZHI9JTA4eFsleF0sIHNyY19hZGRyPSUwOHhbJXhdXG4iLAotCQljbV9ub2RlLCBldmVudCwgdHlwZSwgZXZlbnQtPmNtX2luZm8ubG9jX2FkZHIsCi0JCWV2ZW50LT5jbV9pbmZvLmxvY19wb3J0LCBldmVudC0+Y21faW5mby5yZW1fYWRkciwKLQkJZXZlbnQtPmNtX2luZm8ucmVtX3BvcnQpOworCQkgICJkc3RfYWRkcj0lMDh4WyV4XSwgc3JjX2FkZHI9JTA4eFsleF1cbiIsCisJCSAgY21fbm9kZSwgZXZlbnQsIHR5cGUsIGV2ZW50LT5jbV9pbmZvLmxvY19hZGRyLAorCQkgIGV2ZW50LT5jbV9pbmZvLmxvY19wb3J0LCBldmVudC0+Y21faW5mby5yZW1fYWRkciwKKwkJICBldmVudC0+Y21faW5mby5yZW1fcG9ydCk7CiAKIAluZXNfY21fcG9zdF9ldmVudChldmVudCk7CiAJcmV0dXJuIGV2ZW50OwpAQCAtMjAxLDE0ICsyMDcsMTkgQEAKICAqLwogc3RhdGljIGludCBzZW5kX21wYV9yZXF1ZXN0KHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwl1OCBzdGFydF9hZGRyID0gMDsKKwl1OCAqc3RhcnRfcHRyID0gJnN0YXJ0X2FkZHI7CisJdTggKipzdGFydF9idWZmID0gJnN0YXJ0X3B0cjsKKwl1MTYgYnVmZl9sZW4gPSAwOworCiAJaWYgKCFza2IpIHsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJza2Igc2V0IHRvIE5VTExcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJLyogc2VuZCBhbiBNUEEgUmVxdWVzdCBmcmFtZSAqLwotCWZvcm1fY21fZnJhbWUoc2tiLCBjbV9ub2RlLCBOVUxMLCAwLCAmY21fbm9kZS0+bXBhX2ZyYW1lLAotCQkJY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUsIFNFVF9BQ0spOworCWNtX2J1aWxkX21wYV9mcmFtZShjbV9ub2RlLCBzdGFydF9idWZmLCAmYnVmZl9sZW4sIE5VTEwsIE1QQV9LRVlfUkVRVUVTVCk7CisJZm9ybV9jbV9mcmFtZShza2IsIGNtX25vZGUsIE5VTEwsIDAsICpzdGFydF9idWZmLCBidWZmX2xlbiwgU0VUX0FDSyk7CiAKIAlyZXR1cm4gc2NoZWR1bGVfbmVzX3RpbWVyKGNtX25vZGUsIHNrYiwgTkVTX1RJTUVSX1RZUEVfU0VORCwgMSwgMCk7CiB9CkBAIC0yMTcsNyArMjI4LDExIEBACiAKIHN0YXRpYyBpbnQgc2VuZF9tcGFfcmVqZWN0KHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAgKnNrYiA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTggc3RhcnRfYWRkciA9IDA7CisJdTggKnN0YXJ0X3B0ciA9ICZzdGFydF9hZGRyOworCXU4ICoqc3RhcnRfYnVmZiA9ICZzdGFydF9wdHI7CisJdTE2IGJ1ZmZfbGVuID0gMDsKIAogCXNrYiA9IGRldl9hbGxvY19za2IoTUFYX0NNX0JVRkZFUik7CiAJaWYgKCFza2IpIHsKQEAgLTIyNiw4ICsyNDEsOCBAQAogCX0KIAogCS8qIHNlbmQgYW4gTVBBIHJlamVjdCBmcmFtZSAqLwotCWZvcm1fY21fZnJhbWUoc2tiLCBjbV9ub2RlLCBOVUxMLCAwLCAmY21fbm9kZS0+bXBhX2ZyYW1lLAotCQkJY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUsIFNFVF9BQ0sgfCBTRVRfRklOKTsKKwljbV9idWlsZF9tcGFfZnJhbWUoY21fbm9kZSwgc3RhcnRfYnVmZiwgJmJ1ZmZfbGVuLCBOVUxMLCBNUEFfS0VZX1JFUExZKTsKKwlmb3JtX2NtX2ZyYW1lKHNrYiwgY21fbm9kZSwgTlVMTCwgMCwgKnN0YXJ0X2J1ZmYsIGJ1ZmZfbGVuLCBTRVRfQUNLIHwgU0VUX0ZJTik7CiAKIAljbV9ub2RlLT5zdGF0ZSA9IE5FU19DTV9TVEFURV9GSU5fV0FJVDE7CiAJcmV0dXJuIHNjaGVkdWxlX25lc190aW1lcihjbV9ub2RlLCBza2IsIE5FU19USU1FUl9UWVBFX1NFTkQsIDEsIDApOwpAQCAtMjM5LDI0ICsyNTQsMzEgQEAKICAqIElFVEYgTVBBIGZyYW1lCiAgKi8KIHN0YXRpYyBpbnQgcGFyc2VfbXBhKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgdTggKmJ1ZmZlciwgdTMyICp0eXBlLAotCQl1MzIgbGVuKQorCQkgICAgIHUzMiBsZW4pCiB7Ci0Jc3RydWN0IGlldGZfbXBhX2ZyYW1lICptcGFfZnJhbWU7CisJc3RydWN0IGlldGZfbXBhX3YxICptcGFfZnJhbWU7CisJc3RydWN0IGlldGZfbXBhX3YyICptcGFfdjJfZnJhbWU7CisJc3RydWN0IGlldGZfcnRyX21zZyAqcnRyX21zZzsKKwlpbnQgbXBhX2hkcl9sZW47CisJaW50IHByaXZfZGF0YV9sZW47CiAKIAkqdHlwZSA9IE5FU19NUEFfUkVRVUVTVF9BQ0NFUFQ7CiAKIAkvKiBhc3N1bWUgcmVxIGZyYW1lIGlzIGluIHRjcCBkYXRhIHBheWxvYWQgKi8KLQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSkpIHsKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV92MSkpIHsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJUaGUgcmVjZWl2ZWQgaWV0ZiBidWZmZXIgd2FzIHRvbyBzbWFsbCAoJXgpXG4iLCBsZW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltcGFfZnJhbWUgPSAoc3RydWN0IGlldGZfbXBhX2ZyYW1lICopYnVmZmVyOwotCWNtX25vZGUtPm1wYV9mcmFtZV9zaXplID0gbnRvaHMobXBhX2ZyYW1lLT5wcml2X2RhdGFfbGVuKTsKKwkvKiBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUsIHdoaWNoIGNvdWxkIGJlIE1QQSBWMSBvciBWMiAqLworCW1wYV9mcmFtZSA9IChzdHJ1Y3QgaWV0Zl9tcGFfdjEgKilidWZmZXI7CisJbXBhX2hkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGlldGZfbXBhX3YxKTsKKwlwcml2X2RhdGFfbGVuID0gbnRvaHMobXBhX2ZyYW1lLT5wcml2X2RhdGFfbGVuKTsKKwogCS8qIG1ha2Ugc3VyZSBtcGEgcHJpdmF0ZSBkYXRhIGxlbiBpcyBsZXNzIHRoYW4gNTEyIGJ5dGVzICovCi0JaWYgKGNtX25vZGUtPm1wYV9mcmFtZV9zaXplID4gSUVURl9NQVhfUFJJVl9EQVRBX0xFTikgeworCWlmIChwcml2X2RhdGFfbGVuID4gSUVURl9NQVhfUFJJVl9EQVRBX0xFTikgewogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlRoZSByZWNlaXZlZCBMZW5ndGggb2YgUHJpdmF0ZSIKLQkJCSIgRGF0YSBmaWVsZCBleGNlZWRzIDUxMiBvY3RldHNcbiIpOworCQkJICAiIERhdGEgZmllbGQgZXhjZWVkcyA1MTIgb2N0ZXRzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qCkBAIC0yNjQsMTEgKzI4NiwyMiBAQAogCSAqIHJlY2VpdmVkIE1QQSB2ZXJzaW9uIGFuZCBNUEEga2V5IGluZm9ybWF0aW9uCiAJICoKIAkgKi8KLQlpZiAobXBhX2ZyYW1lLT5yZXYgIT0gbXBhX3ZlcnNpb24pIHsKKwlpZiAobXBhX2ZyYW1lLT5yZXYgIT0gSUVURl9NUEFfVjEgJiYgbXBhX2ZyYW1lLT5yZXYgIT0gSUVURl9NUEFfVjIpIHsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJUaGUgcmVjZWl2ZWQgbXBhIHZlcnNpb24iCi0JCQkJIiBjYW4gbm90IGJlIGludGVyb3BlcmF0ZWRcbiIpOworCQkJICAiIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJLyoKKwkqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkKKwkqLworCWlmIChtcGFfZnJhbWUtPnJldiA+IGNtX25vZGUtPm1wYV9mcmFtZV9yZXYpIHsKKwkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJUaGUgcmVjZWl2ZWQgbXBhIHZlcnNpb24iCisJCQkiIGNhbiBub3QgYmUgaW50ZXJvcGVyYXRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWNtX25vZGUtPm1wYV9mcmFtZV9yZXYgPSBtcGFfZnJhbWUtPnJldjsKKwl9CisKIAlpZiAoY21fbm9kZS0+c3RhdGUgIT0gTkVTX0NNX1NUQVRFX01QQVJFUV9TRU5UKSB7CiAJCWlmIChtZW1jbXAobXBhX2ZyYW1lLT5rZXksIElFRlRfTVBBX0tFWV9SRVEsIElFVEZfTVBBX0tFWV9TSVpFKSkgewogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJVbmV4cGVjdGVkIE1QQSBLZXkgcmVjZWl2ZWQgXG4iKTsKQEAgLTI4MSwyNSArMzE0LDc1IEBACiAJCX0KIAl9CiAKLQlpZiAoY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUgKyBzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSAhPSBsZW4pIHsKKworCWlmIChwcml2X2RhdGFfbGVuICsgbXBhX2hkcl9sZW4gIT0gbGVuKSB7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiVGhlIHJlY2VpdmVkIGlldGYgYnVmZmVyIHdhcyBub3QgcmlnaHQiCi0JCQkJIiBjb21wbGV0ZSAoJXggKyAleCAhPSAleClcbiIsCi0JCQkJY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUsCi0JCQkJKHUzMilzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSwgbGVuKTsKKwkJCSIgY29tcGxldGUgKCV4ICsgJXggIT0gJXgpXG4iLAorCQkJcHJpdl9kYXRhX2xlbiwgbXBhX2hkcl9sZW4sIGxlbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKiBtYWtlIHN1cmUgaXQgZG9lcyBub3QgZXhjZWVkIHRoZSBtYXggc2l6ZSAqLwogCWlmIChsZW4gPiBNQVhfQ01fQlVGRkVSKSB7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiVGhlIHJlY2VpdmVkIGlldGYgYnVmZmVyIHdhcyB0b28gbGFyZ2UiCi0JCQkJIiAoJXggKyAleCAhPSAleClcbiIsCi0JCQkJY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUsCi0JCQkJKHUzMilzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSwgbGVuKTsKKwkJCSIgKCV4ICsgJXggIT0gJXgpXG4iLAorCQkJcHJpdl9kYXRhX2xlbiwgbXBhX2hkcl9sZW4sIGxlbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWNtX25vZGUtPm1wYV9mcmFtZV9zaXplID0gcHJpdl9kYXRhX2xlbjsKKworCXN3aXRjaCAobXBhX2ZyYW1lLT5yZXYpIHsKKwljYXNlIElFVEZfTVBBX1YyOiB7CisJCXUxNiBpcmRfc2l6ZTsKKwkJdTE2IG9yZF9zaXplOworCQltcGFfdjJfZnJhbWUgPSAoc3RydWN0IGlldGZfbXBhX3YyICopYnVmZmVyOworCQltcGFfaGRyX2xlbiArPSBJRVRGX1JUUl9NU0dfU0laRTsKKwkJY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUgLT0gSUVURl9SVFJfTVNHX1NJWkU7CisJCXJ0cl9tc2cgPSAmbXBhX3YyX2ZyYW1lLT5ydHJfbXNnOworCisJCS8qIHBhcnNlIHJ0ciBtZXNzYWdlICovCisJCXJ0cl9tc2ctPmN0cmxfaXJkID0gbnRvaHMocnRyX21zZy0+Y3RybF9pcmQpOworCQlydHJfbXNnLT5jdHJsX29yZCA9IG50b2hzKHJ0cl9tc2ctPmN0cmxfb3JkKTsKKwkJaXJkX3NpemUgPSBydHJfbXNnLT5jdHJsX2lyZCAmIElFVEZfTk9fSVJEX09SRDsKKwkJb3JkX3NpemUgPSBydHJfbXNnLT5jdHJsX29yZCAmIElFVEZfTk9fSVJEX09SRDsKKworCQlpZiAoIShydHJfbXNnLT5jdHJsX2lyZCAmIElFVEZfUEVFUl9UT19QRUVSKSkgeworCQkJLyogc2VuZCByZXNldCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoY21fbm9kZS0+c3RhdGUgIT0gTkVTX0NNX1NUQVRFX01QQVJFUV9TRU5UKSB7CisJCQkvKiByZXNwb25kZXIgKi8KKwkJCWlmIChjbV9ub2RlLT5vcmRfc2l6ZSA+IGlyZF9zaXplKQorCQkJCWNtX25vZGUtPm9yZF9zaXplID0gaXJkX3NpemU7CisJCX0gZWxzZSB7CisJCQkvKiBpbml0aWF0b3IgKi8KKwkJCWlmIChjbV9ub2RlLT5vcmRfc2l6ZSA+IGlyZF9zaXplKQorCQkJCWNtX25vZGUtPm9yZF9zaXplID0gaXJkX3NpemU7CisKKwkJCWlmIChjbV9ub2RlLT5pcmRfc2l6ZSA8IG9yZF9zaXplKSB7CisJCQkJLyogbm8gcmVzb3VyY2VzIGF2YWlsYWJsZSAqLworCQkJCS8qIHNlbmQgdGVybWluYXRlIG1lc3NhZ2UgKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCisJCWlmIChydHJfbXNnLT5jdHJsX29yZCAmIElFVEZfUkRNQTBfUkVBRCkgeworCQkJY21fbm9kZS0+c2VuZF9yZG1hMF9vcCA9IFNFTkRfUkRNQV9SRUFEX1pFUk87CisJCX0gZWxzZSBpZiAocnRyX21zZy0+Y3RybF9vcmQgJiBJRVRGX1JETUEwX1dSSVRFKSB7CisJCQljbV9ub2RlLT5zZW5kX3JkbWEwX29wID0gU0VORF9SRE1BX1dSSVRFX1pFUk87CisJCX0gZWxzZSB7ICAgICAgICAvKiBOb3Qgc3VwcG9ydGVkIFJETUEwIG9wZXJhdGlvbiAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSUVURl9NUEFfVjE6CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCiAJLyogY29weSBlbnRpcmUgTVBBIGZyYW1lIHRvIG91ciBjbV9ub2RlJ3MgZnJhbWUgKi8KLQltZW1jcHkoY21fbm9kZS0+bXBhX2ZyYW1lX2J1ZiwgYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSksCi0JCQljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZSk7CisJbWVtY3B5KGNtX25vZGUtPm1wYV9mcmFtZV9idWYsIGJ1ZmZlciArIG1wYV9oZHJfbGVuLCBjbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZSk7CiAKIAlpZiAobXBhX2ZyYW1lLT5mbGFncyAmIElFVEZfTVBBX0ZMQUdTX1JFSkVDVCkKIAkJKnR5cGUgPSBORVNfTVBBX1JFUVVFU1RfUkVKRUNUOwpAQCAtMzEyLDggKzM5NSw4IEBACiAgKiBub2RlIGluZm8gdG8gYnVpbGQuCiAgKi8KIHN0YXRpYyB2b2lkIGZvcm1fY21fZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQlzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHZvaWQgKm9wdGlvbnMsIHUzMiBvcHRpb25zaXplLAotCXZvaWQgKmRhdGEsIHUzMiBkYXRhc2l6ZSwgdTggZmxhZ3MpCisJCQkgIHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgdm9pZCAqb3B0aW9ucywgdTMyIG9wdGlvbnNpemUsCisJCQkgIHZvaWQgKmRhdGEsIHUzMiBkYXRhc2l6ZSwgdTggZmxhZ3MpCiB7CiAJc3RydWN0IHRjcGhkciAqdGNwaDsKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKQEAgLTMyMiwxNCArNDA1LDE0IEBACiAJdTE2IHBhY2tldHNpemUgPSBzaXplb2YoKmlwaCk7CiAKIAlwYWNrZXRzaXplICs9IHNpemVvZigqdGNwaCk7Ci0JcGFja2V0c2l6ZSArPSAgb3B0aW9uc2l6ZSArIGRhdGFzaXplOworCXBhY2tldHNpemUgKz0gb3B0aW9uc2l6ZSArIGRhdGFzaXplOwogCisJc2tiX3RyaW0oc2tiLCAwKTsKIAltZW1zZXQoc2tiLT5kYXRhLCAweDAwLCBFVEhfSExFTiArIHNpemVvZigqaXBoKSArIHNpemVvZigqdGNwaCkpOwogCi0Jc2tiLT5sZW4gPSAwOwogCWJ1ZiA9IHNrYl9wdXQoc2tiLCBwYWNrZXRzaXplICsgRVRIX0hMRU4pOwogCi0JZXRoaCA9IChzdHJ1Y3QgZXRoaGRyICopIGJ1ZjsKKwlldGhoID0gKHN0cnVjdCBldGhoZHIgKilidWY7CiAJYnVmICs9IEVUSF9ITEVOOwogCiAJaXBoID0gKHN0cnVjdCBpcGhkciAqKWJ1ZjsKQEAgLTMzNyw3ICs0MjAsNyBAQAogCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKWJ1ZjsKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBFVEhfSExFTik7Ci0Jc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgRVRIX0hMRU4rc2l6ZW9mKCppcGgpKTsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBFVEhfSExFTiArIHNpemVvZigqaXBoKSk7CiAJYnVmICs9IHNpemVvZigqdGNwaCk7CiAKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CkBAIC0zNTAsMTQgKzQzMywxNCBAQAogCWV0aGgtPmhfcHJvdG8gPSBodG9ucygweDA4MDApOwogCiAJaXBoLT52ZXJzaW9uID0gSVBWRVJTSU9OOwotCWlwaC0+aWhsID0gNTsJCS8qIDUgKiA0Qnl0ZSB3b3JkcywgSVAgaGVhZHIgbGVuICovCisJaXBoLT5paGwgPSA1OyAgICAgICAgICAgLyogNSAqIDRCeXRlIHdvcmRzLCBJUCBoZWFkciBsZW4gKi8KIAlpcGgtPnRvcyA9IDA7CiAJaXBoLT50b3RfbGVuID0gaHRvbnMocGFja2V0c2l6ZSk7CiAJaXBoLT5pZCA9IGh0b25zKCsrY21fbm9kZS0+dGNwX2NudHh0LmxvY19pZCk7CiAKIAlpcGgtPmZyYWdfb2ZmID0gaHRvbnMoMHg0MDAwKTsKIAlpcGgtPnR0bCA9IDB4NDA7Ci0JaXBoLT5wcm90b2NvbCA9IDB4MDY7CS8qIElQUFJPVE9fVENQICovCisJaXBoLT5wcm90b2NvbCA9IDB4MDY7ICAgLyogSVBQUk9UT19UQ1AgKi8KIAogCWlwaC0+c2FkZHIgPSBodG9ubChjbV9ub2RlLT5sb2NfYWRkcik7CiAJaXBoLT5kYWRkciA9IGh0b25sKGNtX25vZGUtPnJlbV9hZGRyKTsKQEAgLTM3MCwxNCArNDUzLDE2IEBACiAJCWNtX25vZGUtPnRjcF9jbnR4dC5sb2NfYWNrX251bSA9IGNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfbnh0OwogCQl0Y3BoLT5hY2tfc2VxID0gaHRvbmwoY21fbm9kZS0+dGNwX2NudHh0LmxvY19hY2tfbnVtKTsKIAkJdGNwaC0+YWNrID0gMTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQl0Y3BoLT5hY2tfc2VxID0gMDsKKwl9CiAKIAlpZiAoZmxhZ3MgJiBTRVRfU1lOKSB7CiAJCWNtX25vZGUtPnRjcF9jbnR4dC5sb2Nfc2VxX251bSsrOwogCQl0Y3BoLT5zeW4gPSAxOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCWNtX25vZGUtPnRjcF9jbnR4dC5sb2Nfc2VxX251bSArPSBkYXRhc2l6ZTsKKwl9CiAKIAlpZiAoZmxhZ3MgJiBTRVRfRklOKSB7CiAJCWNtX25vZGUtPnRjcF9jbnR4dC5sb2Nfc2VxX251bSsrOwpAQCAtMzk4LDEwICs0ODMsOCBAQAogCiAJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IDA7CiAJY21fcGFja2V0c19jcmVhdGVkKys7Ci0KIH0KIAotCiAvKioKICAqIHByaW50X2NvcmUgLSBkdW1wIGEgY20gY29yZQogICovCkBAIC00MTMsNyArNDk2LDcgQEAKIAkJcmV0dXJuOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAotCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiU3RhdGUgICAgICAgICA6ICV1IFxuIiwgIGNvcmUtPnN0YXRlKTsKKwluZXNfZGVidWcoTkVTX0RCR19DTSwgIlN0YXRlICAgICAgICAgOiAldSBcbiIsIGNvcmUtPnN0YXRlKTsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiTGlzdGVuIE5vZGVzICA6ICV1IFxuIiwgYXRvbWljX3JlYWQoJmNvcmUtPmxpc3Rlbl9ub2RlX2NudCkpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiQWN0aXZlIE5vZGVzICA6ICV1IFxuIiwgYXRvbWljX3JlYWQoJmNvcmUtPm5vZGVfY250KSk7CkBAIC00MjMsNiArNTA2LDE0NyBAQAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiLS0tLS0tLS0tLS0tLS0gZW5kIGNvcmUgLS0tLS0tLS0tLS0tLS0tXG4iKTsKIH0KIAorLyoqCisgKiBjbV9idWlsZF9tcGFfZnJhbWUgLSBidWlsZCBhIE1QQSBWMSBmcmFtZSBvciBNUEEgVjIgZnJhbWUKKyAqLworc3RhdGljIGludCBjbV9idWlsZF9tcGFfZnJhbWUoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCB1OCAqKnN0YXJ0X2J1ZmYsCisJCQkgICAgICB1MTYgKmJ1ZmZfbGVuLCB1OCAqcGNpX21lbSwgdTggbXBhX2tleSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCSpzdGFydF9idWZmID0gKHBjaV9tZW0pID8gcGNpX21lbSA6ICZjbV9ub2RlLT5tcGFfZnJhbWVfYnVmWzBdOworCisJc3dpdGNoIChjbV9ub2RlLT5tcGFfZnJhbWVfcmV2KSB7CisJY2FzZSBJRVRGX01QQV9WMToKKwkJKnN0YXJ0X2J1ZmYgPSAodTggKikqc3RhcnRfYnVmZiArIHNpemVvZihzdHJ1Y3QgaWV0Zl9ydHJfbXNnKTsKKwkJKmJ1ZmZfbGVuID0gc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV92MSkgKyBjbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZTsKKwkJYnVpbGRfbXBhX3YxKGNtX25vZGUsICpzdGFydF9idWZmLCBtcGFfa2V5KTsKKwkJYnJlYWs7CisJY2FzZSBJRVRGX01QQV9WMjoKKwkJKmJ1ZmZfbGVuID0gc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV92MikgKyBjbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZTsKKwkJYnVpbGRfbXBhX3YyKGNtX25vZGUsICpzdGFydF9idWZmLCBtcGFfa2V5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBidWlsZF9tcGFfdjIgLSBidWlsZCBhIE1QQSBWMiBmcmFtZQorICovCitzdGF0aWMgdm9pZCBidWlsZF9tcGFfdjIoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLAorCQkJIHZvaWQgKnN0YXJ0X2FkZHIsIHU4IG1wYV9rZXkpCit7CisJc3RydWN0IGlldGZfbXBhX3YyICptcGFfZnJhbWUgPSAoc3RydWN0IGlldGZfbXBhX3YyICopc3RhcnRfYWRkcjsKKwlzdHJ1Y3QgaWV0Zl9ydHJfbXNnICpydHJfbXNnID0gJm1wYV9mcmFtZS0+cnRyX21zZzsKKworCS8qIGluaXRpYWxpemUgdGhlIHVwcGVyIDUgYnl0ZXMgb2YgdGhlIGZyYW1lICovCisJYnVpbGRfbXBhX3YxKGNtX25vZGUsIHN0YXJ0X2FkZHIsIG1wYV9rZXkpOworCW1wYV9mcmFtZS0+ZmxhZ3MgfD0gSUVURl9NUEFfVjJfRkxBRzsgLyogc2V0IGEgYml0IHRvIGluZGljYXRlIE1QQSBWMiAqLworCW1wYV9mcmFtZS0+cHJpdl9kYXRhX2xlbiArPSBodG9ucyhJRVRGX1JUUl9NU0dfU0laRSk7CisKKwkvKiBpbml0aWFsaXplIFJUUiBtc2cgKi8KKwlydHJfbXNnLT5jdHJsX2lyZCA9IChjbV9ub2RlLT5pcmRfc2l6ZSA+IElFVEZfTk9fSVJEX09SRCkgPworCQkJICAgIElFVEZfTk9fSVJEX09SRCA6IGNtX25vZGUtPmlyZF9zaXplOworCXJ0cl9tc2ctPmN0cmxfb3JkID0gKGNtX25vZGUtPm9yZF9zaXplID4gSUVURl9OT19JUkRfT1JEKSA/CisJCQkgICAgSUVURl9OT19JUkRfT1JEIDogY21fbm9kZS0+b3JkX3NpemU7CisKKwlydHJfbXNnLT5jdHJsX2lyZCB8PSBJRVRGX1BFRVJfVE9fUEVFUjsKKwlydHJfbXNnLT5jdHJsX2lyZCB8PSBJRVRGX0ZMUERVX1pFUk9fTEVOOworCisJc3dpdGNoIChtcGFfa2V5KSB7CisJY2FzZSBNUEFfS0VZX1JFUVVFU1Q6CisJCXJ0cl9tc2ctPmN0cmxfb3JkIHw9IElFVEZfUkRNQTBfV1JJVEU7CisJCXJ0cl9tc2ctPmN0cmxfb3JkIHw9IElFVEZfUkRNQTBfUkVBRDsKKwkJYnJlYWs7CisJY2FzZSBNUEFfS0VZX1JFUExZOgorCQlzd2l0Y2ggKGNtX25vZGUtPnNlbmRfcmRtYTBfb3ApIHsKKwkJY2FzZSBTRU5EX1JETUFfV1JJVEVfWkVSTzoKKwkJCXJ0cl9tc2ctPmN0cmxfb3JkIHw9IElFVEZfUkRNQTBfV1JJVEU7CisJCQlicmVhazsKKwkJY2FzZSBTRU5EX1JETUFfUkVBRF9aRVJPOgorCQkJcnRyX21zZy0+Y3RybF9vcmQgfD0gSUVURl9SRE1BMF9SRUFEOworCQkJYnJlYWs7CisJCX0KKwl9CisJcnRyX21zZy0+Y3RybF9pcmQgPSBodG9ucyhydHJfbXNnLT5jdHJsX2lyZCk7CisJcnRyX21zZy0+Y3RybF9vcmQgPSBodG9ucyhydHJfbXNnLT5jdHJsX29yZCk7Cit9CisKKy8qKgorICogYnVpbGRfbXBhX3YxIC0gYnVpbGQgYSBNUEEgVjEgZnJhbWUKKyAqLworc3RhdGljIHZvaWQgYnVpbGRfbXBhX3YxKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgdm9pZCAqc3RhcnRfYWRkciwgdTggbXBhX2tleSkKK3sKKwlzdHJ1Y3QgaWV0Zl9tcGFfdjEgKm1wYV9mcmFtZSA9IChzdHJ1Y3QgaWV0Zl9tcGFfdjEgKilzdGFydF9hZGRyOworCisJc3dpdGNoIChtcGFfa2V5KSB7CisJY2FzZSBNUEFfS0VZX1JFUVVFU1Q6CisJCW1lbWNweShtcGFfZnJhbWUtPmtleSwgSUVGVF9NUEFfS0VZX1JFUSwgSUVURl9NUEFfS0VZX1NJWkUpOworCQlicmVhazsKKwljYXNlIE1QQV9LRVlfUkVQTFk6CisJCW1lbWNweShtcGFfZnJhbWUtPmtleSwgSUVGVF9NUEFfS0VZX1JFUCwgSUVURl9NUEFfS0VZX1NJWkUpOworCQlicmVhazsKKwl9CisJbXBhX2ZyYW1lLT5mbGFncyA9IElFVEZfTVBBX0ZMQUdTX0NSQzsKKwltcGFfZnJhbWUtPnJldiA9IGNtX25vZGUtPm1wYV9mcmFtZV9yZXY7CisJbXBhX2ZyYW1lLT5wcml2X2RhdGFfbGVuID0gaHRvbnMoY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUpOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9yZG1hMF9tc2coc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3QgbmVzX3FwICoqbmVzcXBfYWRkcikKK3sKKwl1NjQgdTY0dGVtcDsKKwlzdHJ1Y3QgbmVzX3FwICpuZXNxcCA9ICpuZXNxcF9hZGRyOworCXN0cnVjdCBuZXNfaHdfcXBfd3FlICp3cWUgPSAmbmVzcXAtPmh3cXAuc3FfdmJhc2VbMF07CisKKwl1NjR0ZW1wID0gKHVuc2lnbmVkIGxvbmcpbmVzcXA7CisJdTY0dGVtcCB8PSBORVNfU1dfQ09OVEVYVF9BTElHTiA+PiAxOworCXNldF93cWVfNjRiaXRfdmFsdWUod3FlLT53cWVfd29yZHMsIE5FU19JV0FSUF9TUV9XUUVfQ09NUF9DVFhfTE9XX0lEWCwgdTY0dGVtcCk7CisKKwl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX0ZSQUcwX0xPV19JRFhdID0gMDsKKwl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX0ZSQUcwX0hJR0hfSURYXSA9IDA7CisKKwlzd2l0Y2ggKGNtX25vZGUtPnNlbmRfcmRtYTBfb3ApIHsKKwljYXNlIFNFTkRfUkRNQV9XUklURV9aRVJPOgorCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlNlbmRpbmcgZmlyc3Qgd3JpdGUuXG4iKTsKKwkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9NSVNDX0lEWF0gPQorCQkJY3B1X3RvX2xlMzIoTkVTX0lXQVJQX1NRX09QX1JETUFXKTsKKwkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9UT1RBTF9QQVlMT0FEX0lEWF0gPSAwOworCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX0xFTkdUSDBfSURYXSA9IDA7CisJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfU1RBRzBfSURYXSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBTRU5EX1JETUFfUkVBRF9aRVJPOgorCWRlZmF1bHQ6CisJCWlmIChjbV9ub2RlLT5zZW5kX3JkbWEwX29wICE9IFNFTkRfUkRNQV9SRUFEX1pFUk8pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXNbJXVdOiBVbnN1cHBvcnRlZCBSRE1BMCBsZW4gb3BlcmF0aW9uPSV1XG4iLAorCQkJCSBfX2Z1bmNfXywgX19MSU5FX18sIGNtX25vZGUtPnNlbmRfcmRtYTBfb3ApOworCQkJV0FSTl9PTigxKTsKKwkJfQorCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlNlbmRpbmcgZmlyc3QgcmRtYSBvcGVyYXRpb24uXG4iKTsKKwkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9NSVNDX0lEWF0gPQorCQkJY3B1X3RvX2xlMzIoTkVTX0lXQVJQX1NRX09QX1JETUFSKTsKKwkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9SRE1BX1RPX0xPV19JRFhdID0gMTsKKwkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9SRE1BX1RPX0hJR0hfSURYXSA9IDA7CisJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfUkRNQV9MRU5HVEhfSURYXSA9IDA7CisJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfUkRNQV9TVEFHX0lEWF0gPSAxOworCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX1NUQUcwX0lEWF0gPSAxOworCQlicmVhazsKKwl9CisKKwlpZiAobmVzcXAtPnNxX2ttYXBwZWQpIHsKKwkJbmVzcXAtPnNxX2ttYXBwZWQgPSAwOworCQlrdW5tYXAobmVzcXAtPnBhZ2UpOworCX0KKworCS8qdXNlIHRoZSByZXNlcnZlZCBzcG90IG9uIHRoZSBXUSBmb3IgdGhlIGV4dHJhIGZpcnN0IFdRRSovCisJbmVzcXAtPm5lc3FwX2NvbnRleHQtPmlyZF9vcmRfc2l6ZXMgJj0gY3B1X3RvX2xlMzIofihORVNfUVBDT05URVhUX09SRElSRF9MU01NX1BSRVNFTlQgfAorCQkJCQkJCSAgICAgTkVTX1FQQ09OVEVYVF9PUkRJUkRfV1JQRFUgfAorCQkJCQkJCSAgICAgTkVTX1FQQ09OVEVYVF9PUkRJUkRfQUxTTU0pKTsKKwluZXNxcC0+c2tpcF9sc21tID0gMTsKKwluZXNxcC0+aHdxcC5zcV90YWlsID0gMDsKK30KIAogLyoqCiAgKiBzY2hlZHVsZV9uZXNfdGltZXIKQEAgLTQzMCwxMCArNjU0LDEwIEBACiAgKgkJCXJlbV9yZWZfY21fbm9kZShjbV9jb3JlLCBjbV9ub2RlKTthZGRfcmVmX2NtX25vZGUoY21fbm9kZSk7CiAgKi8KIGludCBzY2hlZHVsZV9uZXNfdGltZXIoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQllbnVtIG5lc190aW1lcl90eXBlIHR5cGUsIGludCBzZW5kX3JldHJhbnMsCi0JCWludCBjbG9zZV93aGVuX2NvbXBsZXRlKQorCQkgICAgICAgZW51bSBuZXNfdGltZXJfdHlwZSB0eXBlLCBpbnQgc2VuZF9yZXRyYW5zLAorCQkgICAgICAgaW50IGNsb3NlX3doZW5fY29tcGxldGUpCiB7Ci0JdW5zaWduZWQgbG9uZyAgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUgPSBjbV9ub2RlLT5jbV9jb3JlOwogCXN0cnVjdCBuZXNfdGltZXJfZW50cnkgKm5ld19zZW5kOwogCWludCByZXQgPSAwOwpAQCAtNDU0LDcgKzY3OCw3IEBACiAJbmV3X3NlbmQtPmNsb3NlX3doZW5fY29tcGxldGUgPSBjbG9zZV93aGVuX2NvbXBsZXRlOwogCiAJaWYgKHR5cGUgPT0gTkVTX1RJTUVSX1RZUEVfQ0xPU0UpIHsKLQkJbmV3X3NlbmQtPnRpbWV0b3NlbmQgKz0gKEhaLzEwKTsKKwkJbmV3X3NlbmQtPnRpbWV0b3NlbmQgKz0gKEhaIC8gMTApOwogCQlpZiAoY21fbm9kZS0+cmVjdl9lbnRyeSkgewogCQkJa2ZyZWUobmV3X3NlbmQpOwogCQkJV0FSTl9PTigxKTsKQEAgLTQ3NSw3ICs2OTksNyBAQAogCQlyZXQgPSBuZXNfbmljX2NtX3htaXQobmV3X3NlbmQtPnNrYiwgY21fbm9kZS0+bmV0ZGV2KTsKIAkJaWYgKHJldCAhPSBORVRERVZfVFhfT0spIHsKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiRXJyb3Igc2VuZGluZyBwYWNrZXQgJXAgIgotCQkJCSIoamlmZmllcyA9ICVsdSlcbiIsIG5ld19zZW5kLCBqaWZmaWVzKTsKKwkJCQkgICIoamlmZmllcyA9ICVsdSlcbiIsIG5ld19zZW5kLCBqaWZmaWVzKTsKIAkJCW5ld19zZW5kLT50aW1ldG9zZW5kID0gamlmZmllczsKIAkJCXJldCA9IE5FVERFVl9UWF9PSzsKIAkJfSBlbHNlIHsKQEAgLTUwNCw2ICs3MjgsNyBAQAogCXN0cnVjdCBpd19jbV9pZCAqY21faWQgPSBjbV9ub2RlLT5jbV9pZDsKIAllbnVtIG5lc19jbV9ub2RlX3N0YXRlIHN0YXRlID0gY21fbm9kZS0+c3RhdGU7CiAJY21fbm9kZS0+c3RhdGUgPSBORVNfQ01fU1RBVEVfQ0xPU0VEOworCiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgTkVTX0NNX1NUQVRFX1NZTl9SQ1ZEOgogCWNhc2UgTkVTX0NNX1NUQVRFX0NMT1NJTkc6CkBAIC01MzYsMTAgKzc2MSwxMCBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzcXAtPmxvY2ssIHFwbG9ja2ZsYWdzKTsKIAkJaWYgKG5lc3FwLT5jbV9pZCkgewogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJRUCV1OiBjbV9pZCA9ICVwLCAiCi0JCQkJInJlZmNvdW50ID0gJWQ6IEhJVCBBICIKLQkJCQkiTkVTX1RJTUVSX1RZUEVfQ0xPU0Ugd2l0aCBzb21ldGhpbmcgIgotCQkJCSJ0byBkbyEhIVxuIiwgbmVzcXAtPmh3cXAucXBfaWQsIGNtX2lkLAotCQkJCWF0b21pY19yZWFkKCZuZXNxcC0+cmVmY291bnQpKTsKKwkJCQkgICJyZWZjb3VudCA9ICVkOiBISVQgQSAiCisJCQkJICAiTkVTX1RJTUVSX1RZUEVfQ0xPU0Ugd2l0aCBzb21ldGhpbmcgIgorCQkJCSAgInRvIGRvISEhXG4iLCBuZXNxcC0+aHdxcC5xcF9pZCwgY21faWQsCisJCQkJICBhdG9taWNfcmVhZCgmbmVzcXAtPnJlZmNvdW50KSk7CiAJCQluZXNxcC0+aHdfdGNwX3N0YXRlID0gTkVTX0FFUUVfVENQX1NUQVRFX0NMT1NFRDsKIAkJCW5lc3FwLT5sYXN0X2FlcSA9IE5FU19BRVFFX0FFSURfUkVTRVRfU0VOVDsKIAkJCW5lc3FwLT5pYnFwX3N0YXRlID0gSUJfUVBTX0VSUjsKQEAgLTU0OCwxMCArNzczLDEwIEBACiAJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNxcC0+bG9jaywgcXBsb2NrZmxhZ3MpOwogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJRUCV1OiBjbV9pZCA9ICVwLCAiCi0JCQkJInJlZmNvdW50ID0gJWQ6IEhJVCBBICIKLQkJCQkiTkVTX1RJTUVSX1RZUEVfQ0xPU0Ugd2l0aCBub3RoaW5nICIKLQkJCQkidG8gZG8hISFcbiIsIG5lc3FwLT5od3FwLnFwX2lkLCBjbV9pZCwKLQkJCQlhdG9taWNfcmVhZCgmbmVzcXAtPnJlZmNvdW50KSk7CisJCQkJICAicmVmY291bnQgPSAlZDogSElUIEEgIgorCQkJCSAgIk5FU19USU1FUl9UWVBFX0NMT1NFIHdpdGggbm90aGluZyAiCisJCQkJICAidG8gZG8hISFcbiIsIG5lc3FwLT5od3FwLnFwX2lkLCBjbV9pZCwKKwkJCQkgIGF0b21pY19yZWFkKCZuZXNxcC0+cmVmY291bnQpKTsKIAkJfQogCX0gZWxzZSBpZiAocmVtX25vZGUpIHsKIAkJLyogVElNRV9XQUlUIHN0YXRlICovCkBAIC01ODAsMTEgKzgwNSwxMiBAQAogCWludCByZXQgPSBORVRERVZfVFhfT0s7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHRpbWVyX2xpc3Q7CisKIAlJTklUX0xJU1RfSEVBRCgmdGltZXJfbGlzdCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNtX2NvcmUtPmh0X2xvY2ssIGZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0X25vZGUsIGxpc3RfY29yZV90ZW1wLAotCQkJCSZjbV9jb3JlLT5jb25uZWN0ZWRfbm9kZXMpIHsKKwkJCSAgICZjbV9jb3JlLT5jb25uZWN0ZWRfbm9kZXMpIHsKIAkJY21fbm9kZSA9IGNvbnRhaW5lcl9vZihsaXN0X25vZGUsIHN0cnVjdCBuZXNfY21fbm9kZSwgbGlzdCk7CiAJCWlmICgoY21fbm9kZS0+cmVjdl9lbnRyeSkgfHwgKGNtX25vZGUtPnNlbmRfZW50cnkpKSB7CiAJCQlhZGRfcmVmX2NtX25vZGUoY21fbm9kZSk7CkBAIC01OTUsMTggKzgyMSwxOSBAQAogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3Rfbm9kZSwgbGlzdF9jb3JlX3RlbXAsICZ0aW1lcl9saXN0KSB7CiAJCWNtX25vZGUgPSBjb250YWluZXJfb2YobGlzdF9ub2RlLCBzdHJ1Y3QgbmVzX2NtX25vZGUsCi0JCQkJCXRpbWVyX2VudHJ5KTsKKwkJCQkgICAgICAgdGltZXJfZW50cnkpOwogCQlyZWN2X2VudHJ5ID0gY21fbm9kZS0+cmVjdl9lbnRyeTsKIAogCQlpZiAocmVjdl9lbnRyeSkgewogCQkJaWYgKHRpbWVfYWZ0ZXIocmVjdl9lbnRyeS0+dGltZXRvc2VuZCwgamlmZmllcykpIHsKIAkJCQlpZiAobmV4dHRpbWVvdXQgPiByZWN2X2VudHJ5LT50aW1ldG9zZW5kIHx8Ci0JCQkJCQkhc2V0dGltZXIpIHsKKwkJCQkgICAgIXNldHRpbWVyKSB7CiAJCQkJCW5leHR0aW1lb3V0ID0gcmVjdl9lbnRyeS0+dGltZXRvc2VuZDsKIAkJCQkJc2V0dGltZXIgPSAxOwogCQkJCX0KLQkJCX0gZWxzZQorCQkJfSBlbHNlIHsKIAkJCQloYW5kbGVfcmVjdl9lbnRyeShjbV9ub2RlLCAxKTsKKwkJCX0KIAkJfQogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjbV9ub2RlLT5yZXRyYW5zX2xpc3RfbG9jaywgZmxhZ3MpOwpAQCAtNjE3LDggKzg0NCw4IEBACiAJCQlpZiAodGltZV9hZnRlcihzZW5kX2VudHJ5LT50aW1ldG9zZW5kLCBqaWZmaWVzKSkgewogCQkJCWlmIChjbV9ub2RlLT5zdGF0ZSAhPSBORVNfQ01fU1RBVEVfVFNBKSB7CiAJCQkJCWlmICgobmV4dHRpbWVvdXQgPgotCQkJCQkJc2VuZF9lbnRyeS0+dGltZXRvc2VuZCkgfHwKLQkJCQkJCSFzZXR0aW1lcikgeworCQkJCQkgICAgIHNlbmRfZW50cnktPnRpbWV0b3NlbmQpIHx8CisJCQkJCSAgICAhc2V0dGltZXIpIHsKIAkJCQkJCW5leHR0aW1lb3V0ID0KIAkJCQkJCQlzZW5kX2VudHJ5LT50aW1ldG9zZW5kOwogCQkJCQkJc2V0dGltZXIgPSAxOwpAQCAtNjMwLDEzICs4NTcsMTMgQEAKIAkJCX0KIAogCQkJaWYgKChjbV9ub2RlLT5zdGF0ZSA9PSBORVNfQ01fU1RBVEVfVFNBKSB8fAotCQkJCShjbV9ub2RlLT5zdGF0ZSA9PSBORVNfQ01fU1RBVEVfQ0xPU0VEKSkgeworCQkJICAgIChjbV9ub2RlLT5zdGF0ZSA9PSBORVNfQ01fU1RBVEVfQ0xPU0VEKSkgewogCQkJCWZyZWVfcmV0cmFuc19lbnRyeShjbV9ub2RlKTsKIAkJCQlicmVhazsKIAkJCX0KIAogCQkJaWYgKCFzZW5kX2VudHJ5LT5yZXRyYW5zY291bnQgfHwKLQkJCQkhc2VuZF9lbnRyeS0+cmV0cnljb3VudCkgeworCQkJICAgICFzZW5kX2VudHJ5LT5yZXRyeWNvdW50KSB7CiAJCQkJY21fcGFja2V0c19kcm9wcGVkKys7CiAJCQkJZnJlZV9yZXRyYW5zX2VudHJ5KGNtX25vZGUpOwogCkBAIC02NDUsMjggKzg3MiwyOCBAQAogCQkJCW5lc19yZXRyYW5zX2V4cGlyZWQoY21fbm9kZSk7CiAJCQkJY21fbm9kZS0+c3RhdGUgPSBORVNfQ01fU1RBVEVfQ0xPU0VEOwogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjbV9ub2RlLT5yZXRyYW5zX2xpc3RfbG9jaywKLQkJCQkJZmxhZ3MpOworCQkJCQkJICBmbGFncyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlhdG9taWNfaW5jKCZzZW5kX2VudHJ5LT5za2ItPnVzZXJzKTsKIAkJCWNtX3BhY2tldHNfcmV0cmFucysrOwogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJSZXRyYW5zbWl0dGluZyBzZW5kX2VudHJ5ICVwICIKLQkJCQkiZm9yIG5vZGUgJXAsIGppZmZpZXMgPSAlbHUsIHRpbWUgdG8gc2VuZCA9ICIKLQkJCQkiJWx1LCByZXRyYW5zY291bnQgPSAldSwgc2VuZF9lbnRyeS0+c2VxX251bSA9ICIKLQkJCQkiMHglMDhYLCBjbV9ub2RlLT50Y3BfY250eHQucmVtX2Fja19udW0gPSAiCi0JCQkJIjB4JTA4WFxuIiwgc2VuZF9lbnRyeSwgY21fbm9kZSwgamlmZmllcywKLQkJCQlzZW5kX2VudHJ5LT50aW1ldG9zZW5kLAotCQkJCXNlbmRfZW50cnktPnJldHJhbnNjb3VudCwKLQkJCQlzZW5kX2VudHJ5LT5zZXFfbnVtLAotCQkJCWNtX25vZGUtPnRjcF9jbnR4dC5yZW1fYWNrX251bSk7CisJCQkJICAiZm9yIG5vZGUgJXAsIGppZmZpZXMgPSAlbHUsIHRpbWUgdG8gc2VuZCA9ICIKKwkJCQkgICIlbHUsIHJldHJhbnNjb3VudCA9ICV1LCBzZW5kX2VudHJ5LT5zZXFfbnVtID0gIgorCQkJCSAgIjB4JTA4WCwgY21fbm9kZS0+dGNwX2NudHh0LnJlbV9hY2tfbnVtID0gIgorCQkJCSAgIjB4JTA4WFxuIiwgc2VuZF9lbnRyeSwgY21fbm9kZSwgamlmZmllcywKKwkJCQkgIHNlbmRfZW50cnktPnRpbWV0b3NlbmQsCisJCQkJICBzZW5kX2VudHJ5LT5yZXRyYW5zY291bnQsCisJCQkJICBzZW5kX2VudHJ5LT5zZXFfbnVtLAorCQkJCSAgY21fbm9kZS0+dGNwX2NudHh0LnJlbV9hY2tfbnVtKTsKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21fbm9kZS0+cmV0cmFuc19saXN0X2xvY2ssCi0JCQkJZmxhZ3MpOworCQkJCQkgICAgICAgZmxhZ3MpOwogCQkJcmV0ID0gbmVzX25pY19jbV94bWl0KHNlbmRfZW50cnktPnNrYiwgY21fbm9kZS0+bmV0ZGV2KTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZjbV9ub2RlLT5yZXRyYW5zX2xpc3RfbG9jaywgZmxhZ3MpOwogCQkJaWYgKHJldCAhPSBORVRERVZfVFhfT0spIHsKIAkJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgInJleG1pdCBmYWlsZWQgZm9yICIKLQkJCQkJIm5vZGU9JXBcbiIsIGNtX25vZGUpOworCQkJCQkgICJub2RlPSVwXG4iLCBjbV9ub2RlKTsKIAkJCQljbV9wYWNrZXRzX2JvdW5jZWQrKzsKIAkJCQlzZW5kX2VudHJ5LT5yZXRyeWNvdW50LS07CiAJCQkJbmV4dHRpbWVvdXQgPSBqaWZmaWVzICsgTkVTX1NIT1JUX1RJTUU7CkBAIC02NzYsMTggKzkwMywxOCBAQAogCQkJCWNtX3BhY2tldHNfc2VudCsrOwogCQkJfQogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJQYWNrZXQgU2VudDogcmV0cmFucyBjb3VudCA9ICIKLQkJCQkiJXUsIHJldHJ5IGNvdW50ID0gJXUuXG4iLAotCQkJCXNlbmRfZW50cnktPnJldHJhbnNjb3VudCwKLQkJCQlzZW5kX2VudHJ5LT5yZXRyeWNvdW50KTsKKwkJCQkgICIldSwgcmV0cnkgY291bnQgPSAldS5cbiIsCisJCQkJICBzZW5kX2VudHJ5LT5yZXRyYW5zY291bnQsCisJCQkJICBzZW5kX2VudHJ5LT5yZXRyeWNvdW50KTsKIAkJCWlmIChzZW5kX2VudHJ5LT5zZW5kX3JldHJhbnMpIHsKIAkJCQlzZW5kX2VudHJ5LT5yZXRyYW5zY291bnQtLTsKIAkJCQl0aW1ldG9zZW5kID0gKE5FU19SRVRSWV9USU1FT1VUIDw8Ci0JCQkJCShORVNfREVGQVVMVF9SRVRSQU5TIC0gc2VuZF9lbnRyeS0+cmV0cmFuc2NvdW50KSk7CisJCQkJCSAgICAgIChORVNfREVGQVVMVF9SRVRSQU5TIC0gc2VuZF9lbnRyeS0+cmV0cmFuc2NvdW50KSk7CiAKIAkJCQlzZW5kX2VudHJ5LT50aW1ldG9zZW5kID0gamlmZmllcyArCi0JCQkJCW1pbih0aW1ldG9zZW5kLCBORVNfTUFYX1RJTUVPVVQpOworCQkJCQkJCSBtaW4odGltZXRvc2VuZCwgTkVTX01BWF9USU1FT1VUKTsKIAkJCQlpZiAobmV4dHRpbWVvdXQgPiBzZW5kX2VudHJ5LT50aW1ldG9zZW5kIHx8Ci0JCQkJCSFzZXR0aW1lcikgeworCQkJCSAgICAhc2V0dGltZXIpIHsKIAkJCQkJbmV4dHRpbWVvdXQgPSBzZW5kX2VudHJ5LT50aW1ldG9zZW5kOwogCQkJCQlzZXR0aW1lciA9IDE7CiAJCQkJfQpAQCAtNjk2LDExICs5MjMsMTEgQEAKIAkJCQljbG9zZV93aGVuX2NvbXBsZXRlID0KIAkJCQkJc2VuZF9lbnRyeS0+Y2xvc2Vfd2hlbl9jb21wbGV0ZTsKIAkJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgImNtX25vZGU9JXAgc3RhdGU9JWRcbiIsCi0JCQkJCWNtX25vZGUsIGNtX25vZGUtPnN0YXRlKTsKKwkJCQkJICBjbV9ub2RlLCBjbV9ub2RlLT5zdGF0ZSk7CiAJCQkJZnJlZV9yZXRyYW5zX2VudHJ5KGNtX25vZGUpOwogCQkJCWlmIChjbG9zZV93aGVuX2NvbXBsZXRlKQogCQkJCQlyZW1fcmVmX2NtX25vZGUoY21fbm9kZS0+Y21fY29yZSwKLQkJCQkJCWNtX25vZGUpOworCQkJCQkJCWNtX25vZGUpOwogCQkJfQogCQl9IHdoaWxlICgwKTsKIApAQCAtNzEwLDcgKzkzNyw3IEBACiAKIAlpZiAoc2V0dGltZXIpIHsKIAkJaWYgKCF0aW1lcl9wZW5kaW5nKCZjbV9jb3JlLT50Y3BfdGltZXIpKSB7Ci0JCQljbV9jb3JlLT50Y3BfdGltZXIuZXhwaXJlcyAgPSBuZXh0dGltZW91dDsKKwkJCWNtX2NvcmUtPnRjcF90aW1lci5leHBpcmVzID0gbmV4dHRpbWVvdXQ7CiAJCQlhZGRfdGltZXIoJmNtX2NvcmUtPnRjcF90aW1lcik7CiAJCX0KIAl9CkBAIC03MjEsMTMgKzk0OCwxMyBAQAogICogc2VuZF9zeW4KICAqLwogc3RhdGljIGludCBzZW5kX3N5bihzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHUzMiBzZW5kYWNrLAotCXN0cnVjdCBza19idWZmICpza2IpCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCByZXQ7CiAJaW50IGZsYWdzID0gU0VUX1NZTjsKIAljaGFyIG9wdGlvbnNidWZmZXJbc2l6ZW9mKHN0cnVjdCBvcHRpb25fbXNzKSArCi0JCXNpemVvZihzdHJ1Y3Qgb3B0aW9uX3dpbmRvd3NjYWxlKSArIHNpemVvZihzdHJ1Y3Qgb3B0aW9uX2Jhc2UpICsKLQkJVENQX09QVElPTlNfUEFERElOR107CisJCQkgICBzaXplb2Yoc3RydWN0IG9wdGlvbl93aW5kb3dzY2FsZSkgKyBzaXplb2Yoc3RydWN0IG9wdGlvbl9iYXNlKSArCisJCQkgICBUQ1BfT1BUSU9OU19QQURESU5HXTsKIAogCWludCBvcHRpb25zc2l6ZSA9IDA7CiAJLyogU2VuZGluZyBNU1Mgb3B0aW9uICovCkBAIC04NTQsNyArMTA4MSw3IEBACiAgKiBmaW5kX25vZGUgLSBmaW5kIGEgY20gbm9kZSB0aGF0IG1hdGNoZXMgdGhlIHJlZmVyZW5jZSBjbSBub2RlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbmVzX2NtX25vZGUgKmZpbmRfbm9kZShzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUsCi0JCXUxNiByZW1fcG9ydCwgbmVzX2FkZHJfdCByZW1fYWRkciwgdTE2IGxvY19wb3J0LCBuZXNfYWRkcl90IGxvY19hZGRyKQorCQkJCSAgICAgdTE2IHJlbV9wb3J0LCBuZXNfYWRkcl90IHJlbV9hZGRyLCB1MTYgbG9jX3BvcnQsIG5lc19hZGRyX3QgbG9jX2FkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpodGU7CkBAIC04NjgsMTIgKzEwOTUsMTIgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtX25vZGUsIGh0ZSwgbGlzdCkgewogCQkvKiBjb21wYXJlIHF1YWQsIHJldHVybiBub2RlIGhhbmRsZSBpZiBhIG1hdGNoICovCiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiZmluZGluZyBub2RlICV4OiV4ID0/ICV4OiV4IF4gJXg6JXggPT8gJXg6JXhcbiIsCi0JCQkJY21fbm9kZS0+bG9jX2FkZHIsIGNtX25vZGUtPmxvY19wb3J0LAotCQkJCWxvY19hZGRyLCBsb2NfcG9ydCwKLQkJCQljbV9ub2RlLT5yZW1fYWRkciwgY21fbm9kZS0+cmVtX3BvcnQsCi0JCQkJcmVtX2FkZHIsIHJlbV9wb3J0KTsKKwkJCSAgY21fbm9kZS0+bG9jX2FkZHIsIGNtX25vZGUtPmxvY19wb3J0LAorCQkJICBsb2NfYWRkciwgbG9jX3BvcnQsCisJCQkgIGNtX25vZGUtPnJlbV9hZGRyLCBjbV9ub2RlLT5yZW1fcG9ydCwKKwkJCSAgcmVtX2FkZHIsIHJlbV9wb3J0KTsKIAkJaWYgKChjbV9ub2RlLT5sb2NfYWRkciA9PSBsb2NfYWRkcikgJiYgKGNtX25vZGUtPmxvY19wb3J0ID09IGxvY19wb3J0KSAmJgotCQkJCShjbV9ub2RlLT5yZW1fYWRkciA9PSByZW1fYWRkcikgJiYgKGNtX25vZGUtPnJlbV9wb3J0ID09IHJlbV9wb3J0KSkgeworCQkgICAgKGNtX25vZGUtPnJlbV9hZGRyID09IHJlbV9hZGRyKSAmJiAoY21fbm9kZS0+cmVtX3BvcnQgPT0gcmVtX3BvcnQpKSB7CiAJCQlhZGRfcmVmX2NtX25vZGUoY21fbm9kZSk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbV9jb3JlLT5odF9sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gY21fbm9kZTsKQEAgLTg5MCw3ICsxMTE3LDcgQEAKICAqIGZpbmRfbGlzdGVuZXIgLSBmaW5kIGEgY20gbm9kZSBsaXN0ZW5pbmcgb24gdGhpcyBhZGRyLXBvcnQgcGFpcgogICovCiBzdGF0aWMgc3RydWN0IG5lc19jbV9saXN0ZW5lciAqZmluZF9saXN0ZW5lcihzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUsCi0JCW5lc19hZGRyX3QgZHN0X2FkZHIsIHUxNiBkc3RfcG9ydCwgZW51bSBuZXNfY21fbGlzdGVuZXJfc3RhdGUgbGlzdGVuZXJfc3RhdGUpCisJCQkJCSAgICAgbmVzX2FkZHJfdCBkc3RfYWRkciwgdTE2IGRzdF9wb3J0LCBlbnVtIG5lc19jbV9saXN0ZW5lcl9zdGF0ZSBsaXN0ZW5lcl9zdGF0ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKmxpc3Rlbl9ub2RlOwpAQCAtOTAwLDkgKzExMjcsOSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkobGlzdGVuX25vZGUsICZjbV9jb3JlLT5saXN0ZW5fbGlzdC5saXN0LCBsaXN0KSB7CiAJCS8qIGNvbXBhcmUgbm9kZSBwYWlyLCByZXR1cm4gbm9kZSBoYW5kbGUgaWYgYSBtYXRjaCAqLwogCQlpZiAoKChsaXN0ZW5fbm9kZS0+bG9jX2FkZHIgPT0gZHN0X2FkZHIpIHx8Ci0JCQkJbGlzdGVuX25vZGUtPmxvY19hZGRyID09IDB4MDAwMDAwMDApICYmCi0JCQkJKGxpc3Rlbl9ub2RlLT5sb2NfcG9ydCA9PSBkc3RfcG9ydCkgJiYKLQkJCQkobGlzdGVuZXJfc3RhdGUgJiBsaXN0ZW5fbm9kZS0+bGlzdGVuZXJfc3RhdGUpKSB7CisJCSAgICAgbGlzdGVuX25vZGUtPmxvY19hZGRyID09IDB4MDAwMDAwMDApICYmCisJCSAgICAobGlzdGVuX25vZGUtPmxvY19wb3J0ID09IGRzdF9wb3J0KSAmJgorCQkgICAgKGxpc3RlbmVyX3N0YXRlICYgbGlzdGVuX25vZGUtPmxpc3RlbmVyX3N0YXRlKSkgewogCQkJYXRvbWljX2luYygmbGlzdGVuX25vZGUtPnJlZl9jb3VudCk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbV9jb3JlLT5saXN0ZW5fbGlzdF9sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gbGlzdGVuX25vZGU7CkBAIC05MjcsNyArMTE1NCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJBZGRpbmcgTm9kZSAlcCB0byBBY3RpdmUgQ29ubmVjdGlvbiBIVFxuIiwKLQkJY21fbm9kZSk7CisJCSAgY21fbm9kZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY21fY29yZS0+aHRfbG9jaywgZmxhZ3MpOwogCkBAIC05NDYsNyArMTE3Myw3IEBACiAgKiBtaW5pX2NtX2RlY19yZWZjbnRfbGlzdGVuCiAgKi8KIHN0YXRpYyBpbnQgbWluaV9jbV9kZWNfcmVmY250X2xpc3RlbihzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUsCi0Jc3RydWN0IG5lc19jbV9saXN0ZW5lciAqbGlzdGVuZXIsIGludCBmcmVlX2hhbmdpbmdfbm9kZXMpCisJCQkJICAgICBzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICpsaXN0ZW5lciwgaW50IGZyZWVfaGFuZ2luZ19ub2RlcykKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlpbnQgZXJyID0gMDsKQEAgLTk1Nyw4ICsxMTg0LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJlc2V0X2xpc3Q7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgImF0dGVtcHRpbmcgbGlzdGVuZXI9ICVwIGZyZWVfbm9kZXM9ICVkLCAiCi0JCSJyZWZjbnQ9JWRcbiIsIGxpc3RlbmVyLCBmcmVlX2hhbmdpbmdfbm9kZXMsCi0JCWF0b21pY19yZWFkKCZsaXN0ZW5lci0+cmVmX2NvdW50KSk7CisJCSAgInJlZmNudD0lZFxuIiwgbGlzdGVuZXIsIGZyZWVfaGFuZ2luZ19ub2RlcywKKwkJICBhdG9taWNfcmVhZCgmbGlzdGVuZXItPnJlZl9jb3VudCkpOwogCS8qIGZyZWUgbm9uLWFjY2VsZXJhdGVkIGNoaWxkIG5vZGVzIGZvciB0aGlzIGxpc3RlbmVyICovCiAJSU5JVF9MSVNUX0hFQUQoJnJlc2V0X2xpc3QpOwogCWlmIChmcmVlX2hhbmdpbmdfbm9kZXMpIHsKQEAgLTk2Niw3ICsxMTkzLDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3RfcG9zLCBsaXN0X3RlbXAsCiAJCQkJICAgJmdfY21fY29yZS0+Y29ubmVjdGVkX25vZGVzKSB7CiAJCQljbV9ub2RlID0gY29udGFpbmVyX29mKGxpc3RfcG9zLCBzdHJ1Y3QgbmVzX2NtX25vZGUsCi0JCQkJbGlzdCk7CisJCQkJCSAgICAgICBsaXN0KTsKIAkJCWlmICgoY21fbm9kZS0+bGlzdGVuZXIgPT0gbGlzdGVuZXIpICYmCiAJCQkgICAgKCFjbV9ub2RlLT5hY2NlbGVyYXRlZCkpIHsKIAkJCQlhZGRfcmVmX2NtX25vZGUoY21fbm9kZSk7CkBAIC05NzgsNyArMTIwNSw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfdGVtcCwgJnJlc2V0X2xpc3QpIHsKIAkJY21fbm9kZSA9IGNvbnRhaW5lcl9vZihsaXN0X3Bvcywgc3RydWN0IG5lc19jbV9ub2RlLAotCQkJCXJlc2V0X2VudHJ5KTsKKwkJCQkgICAgICAgcmVzZXRfZW50cnkpOwogCQl7CiAJCQlzdHJ1Y3QgbmVzX2NtX25vZGUgKmxvb3BiYWNrID0gY21fbm9kZS0+bG9vcGJhY2twYXJ0bmVyOwogCQkJZW51bSBuZXNfY21fbm9kZV9zdGF0ZSBvbGRfc3RhdGU7CkBAIC05OTAsNyArMTIxNyw3IEBACiAJCQkJCWVyciA9IHNlbmRfcmVzZXQoY21fbm9kZSwgTlVMTCk7CiAJCQkJCWlmIChlcnIpIHsKIAkJCQkJCWNtX25vZGUtPnN0YXRlID0KLQkJCQkJCQkgTkVTX0NNX1NUQVRFX0NMT1NFRDsKKwkJCQkJCQlORVNfQ01fU1RBVEVfQ0xPU0VEOwogCQkJCQkJV0FSTl9PTigxKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCW9sZF9zdGF0ZSA9IGNtX25vZGUtPnN0YXRlOwpAQCAtMTAzNSwxMCArMTI2Miw5IEBACiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21fY29yZS0+bGlzdGVuX2xpc3RfbG9jaywgZmxhZ3MpOwogCi0JCWlmIChsaXN0ZW5lci0+bmVzdm5pYykgeworCQlpZiAobGlzdGVuZXItPm5lc3ZuaWMpCiAJCQluZXNfbWFuYWdlX2FwYnZ0KGxpc3RlbmVyLT5uZXN2bmljLCBsaXN0ZW5lci0+bG9jX3BvcnQsCi0JCQkJCVBDSV9GVU5DKGxpc3RlbmVyLT5uZXN2bmljLT5uZXNkZXYtPnBjaWRldi0+ZGV2Zm4pLCBORVNfTUFOQUdFX0FQQlZUX0RFTCk7Ci0JCX0KKwkJCQkJIFBDSV9GVU5DKGxpc3RlbmVyLT5uZXN2bmljLT5uZXNkZXYtPnBjaWRldi0+ZGV2Zm4pLCBORVNfTUFOQUdFX0FQQlZUX0RFTCk7CiAKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJkZXN0cm95aW5nIGxpc3RlbmVyICglcClcbiIsIGxpc3RlbmVyKTsKIApAQCAtMTA1Miw4ICsxMjc4LDggQEAKIAlpZiAobGlzdGVuZXIpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZsaXN0ZW5lci0+cGVuZF9hY2NlcHRzX2NudCkgPiAwKQogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJkZXN0cm95aW5nIGxpc3RlbmVyICglcCkiCi0JCQkJCSIgd2l0aCBub24temVybyBwZW5kaW5nIGFjY2VwdHM9JXVcbiIsCi0JCQkJCWxpc3RlbmVyLCBhdG9taWNfcmVhZCgmbGlzdGVuZXItPnBlbmRfYWNjZXB0c19jbnQpKTsKKwkJCQkgICIgd2l0aCBub24temVybyBwZW5kaW5nIGFjY2VwdHM9JXVcbiIsCisJCQkJICBsaXN0ZW5lciwgYXRvbWljX3JlYWQoJmxpc3RlbmVyLT5wZW5kX2FjY2VwdHNfY250KSk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTEwNjQsNyArMTI5MCw3IEBACiAgKiBtaW5pX2NtX2RlbF9saXN0ZW4KICAqLwogc3RhdGljIGludCBtaW5pX2NtX2RlbF9saXN0ZW4oc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCQlzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICpsaXN0ZW5lcikKKwkJCSAgICAgIHN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKmxpc3RlbmVyKQogewogCWxpc3RlbmVyLT5saXN0ZW5lcl9zdGF0ZSA9IE5FU19DTV9MSVNURU5FUl9QQVNTSVZFX1NUQVRFOwogCWxpc3RlbmVyLT5jbV9pZCA9IE5VTEw7IC8qIGdvaW5nIHRvIGJlIGRlc3Ryb3llZCBwcmV0dHkgc29vbiAqLwpAQCAtMTA3Niw5ICsxMzAyLDEwIEBACiAgKiBtaW5pX2NtX2FjY2VsZXJhdGVkCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG1pbmlfY21fYWNjZWxlcmF0ZWQoc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCQlzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCisJCQkJICAgICAgc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKQogewogCXUzMiB3YXNfdGltZXJfc2V0OworCiAJY21fbm9kZS0+YWNjZWxlcmF0ZWQgPSAxOwogCiAJaWYgKGNtX25vZGUtPmFjY2VwdF9wZW5kKSB7CkBAIC0xMTEyLDcgKzEzMzksNyBAQAogCXJ0ID0gaXBfcm91dGVfb3V0cHV0KCZpbml0X25ldCwgaHRvbmwoZHN0X2lwKSwgMCwgMCwgMCk7CiAJaWYgKElTX0VSUihydCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogaXBfcm91dGVfb3V0cHV0X2tleSBmYWlsZWQgZm9yIDB4JTA4WFxuIiwKLQkJCQlfX2Z1bmNfXywgZHN0X2lwKTsKKwkJICAgICAgIF9fZnVuY19fLCBkc3RfaXApOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC0xMTMwLDcgKzEzNTcsNyBAQAogCiAJCQlpZiAoYXJwaW5kZXggPj0gMCkgewogCQkJCWlmICghbWVtY21wKG5lc2FkYXB0ZXItPmFycF90YWJsZVthcnBpbmRleF0ubWFjX2FkZHIsCi0JCQkJCQkJbmVpZ2gtPmhhLCBFVEhfQUxFTikpeworCQkJCQkgICAgbmVpZ2gtPmhhLCBFVEhfQUxFTikpIHsKIAkJCQkJLyogTWFjIGFkZHJlc3Mgc2FtZSBhcyBpbiBuZXNfYXJwX3RhYmxlICovCiAJCQkJCW5laWdoX3JlbGVhc2UobmVpZ2gpOwogCQkJCQlpcF9ydF9wdXQocnQpOwpAQCAtMTEzOCw4ICsxMzY1LDggQEAKIAkJCQl9CiAKIAkJCQluZXNfbWFuYWdlX2FycF9jYWNoZShuZXN2bmljLT5uZXRkZXYsCi0JCQkJCQluZXNhZGFwdGVyLT5hcnBfdGFibGVbYXJwaW5kZXhdLm1hY19hZGRyLAotCQkJCQkJZHN0X2lwLCBORVNfQVJQX0RFTEVURSk7CisJCQkJCQkgICAgIG5lc2FkYXB0ZXItPmFycF90YWJsZVthcnBpbmRleF0ubWFjX2FkZHIsCisJCQkJCQkgICAgIGRzdF9pcCwgTkVTX0FSUF9ERUxFVEUpOwogCQkJfQogCiAJCQluZXNfbWFuYWdlX2FycF9jYWNoZShuZXN2bmljLT5uZXRkZXYsIG5laWdoLT5oYSwKQEAgLTExNjEsOCArMTM4OCw4IEBACiAgKiBtYWtlX2NtX25vZGUgLSBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBjbSBub2RlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbmVzX2NtX25vZGUgKm1ha2VfY21fbm9kZShzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUsCi0JCXN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgc3RydWN0IG5lc19jbV9pbmZvICpjbV9pbmZvLAotCQlzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICpsaXN0ZW5lcikKKwkJCQkJc3RydWN0IG5lc192bmljICpuZXN2bmljLCBzdHJ1Y3QgbmVzX2NtX2luZm8gKmNtX2luZm8sCisJCQkJCXN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKmxpc3RlbmVyKQogewogCXN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZTsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CkBAIC0xMTgxLDcgKzE0MDgsMTIgQEAKIAljbV9ub2RlLT5yZW1fYWRkciA9IGNtX2luZm8tPnJlbV9hZGRyOwogCWNtX25vZGUtPmxvY19wb3J0ID0gY21faW5mby0+bG9jX3BvcnQ7CiAJY21fbm9kZS0+cmVtX3BvcnQgPSBjbV9pbmZvLT5yZW1fcG9ydDsKLQljbV9ub2RlLT5zZW5kX3dyaXRlMCA9IHNlbmRfZmlyc3Q7CisKKwljbV9ub2RlLT5tcGFfZnJhbWVfcmV2ID0gbXBhX3ZlcnNpb247CisJY21fbm9kZS0+c2VuZF9yZG1hMF9vcCA9IFNFTkRfUkRNQV9SRUFEX1pFUk87CisJY21fbm9kZS0+aXJkX3NpemUgPSBJRVRGX05PX0lSRF9PUkQ7CisJY21fbm9kZS0+b3JkX3NpemUgPSBJRVRGX05PX0lSRF9PUkQ7CisKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIk1ha2Ugbm9kZSBhZGRyZXNzZXMgOiBsb2MgPSAlcEk0OiV4LCByZW0gPSAlcEk0OiV4XG4iLAogCQkgICZjbV9ub2RlLT5sb2NfYWRkciwgY21fbm9kZS0+bG9jX3BvcnQsCiAJCSAgJmNtX25vZGUtPnJlbV9hZGRyLCBjbV9ub2RlLT5yZW1fcG9ydCk7CkBAIC0xMTkxLDcgKzE0MjMsNyBAQAogCW1lbWNweShjbV9ub2RlLT5sb2NfbWFjLCBuZXN2bmljLT5uZXRkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgImxpc3RlbmVyPSVwLCBjbV9pZD0lcFxuIiwgY21fbm9kZS0+bGlzdGVuZXIsCi0JCQljbV9ub2RlLT5jbV9pZCk7CisJCSAgY21fbm9kZS0+Y21faWQpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmNtX25vZGUtPnJldHJhbnNfbGlzdF9sb2NrKTsKIApAQCAtMTIwMiwxMSArMTQzNCwxMSBAQAogCWNtX25vZGUtPnRjcF9jbnR4dC5sb2NfaWQgPSBORVNfQ01fREVGX0xPQ0FMX0lEOwogCWNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfd3NjYWxlID0gTkVTX0NNX0RFRkFVTFRfUkNWX1dORF9TQ0FMRTsKIAljbV9ub2RlLT50Y3BfY250eHQucmN2X3duZCA9IE5FU19DTV9ERUZBVUxUX1JDVl9XTkRfU0NBTEVEID4+Ci0JCQlORVNfQ01fREVGQVVMVF9SQ1ZfV05EX1NDQUxFOworCQkJCSAgICAgTkVTX0NNX0RFRkFVTFRfUkNWX1dORF9TQ0FMRTsKIAl0cyA9IGN1cnJlbnRfa2VybmVsX3RpbWUoKTsKIAljbV9ub2RlLT50Y3BfY250eHQubG9jX3NlcV9udW0gPSBodG9ubCh0cy50dl9uc2VjKTsKIAljbV9ub2RlLT50Y3BfY250eHQubXNzID0gbmVzdm5pYy0+bWF4X2ZyYW1lX3NpemUgLSBzaXplb2Yoc3RydWN0IGlwaGRyKSAtCi0JCQlzaXplb2Yoc3RydWN0IHRjcGhkcikgLSBFVEhfSExFTiAtIFZMQU5fSExFTjsKKwkJCQkgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpIC0gRVRIX0hMRU4gLSBWTEFOX0hMRU47CiAJY21fbm9kZS0+dGNwX2NudHh0LnJjdl9ueHQgPSAwOwogCS8qIGdldCBhIHVuaXF1ZSBzZXNzaW9uIElEICwgYWRkIHRocmVhZF9pZCB0byBhbiB1cGNvdW50ZXIgdG8gaGFuZGxlIHJhY2UgKi8KIAlhdG9taWNfaW5jKCZjbV9jb3JlLT5ub2RlX2NudCk7CkBAIC0xMjIyLDEyICsxNDU0LDExIEBACiAJY21fbm9kZS0+bG9vcGJhY2twYXJ0bmVyID0gTlVMTDsKIAogCS8qIGdldCB0aGUgbWFjIGFkZHIgZm9yIHRoZSByZW1vdGUgbm9kZSAqLwotCWlmIChpcHY0X2lzX2xvb3BiYWNrKGh0b25sKGNtX25vZGUtPnJlbV9hZGRyKSkpCisJaWYgKGlwdjRfaXNfbG9vcGJhY2soaHRvbmwoY21fbm9kZS0+cmVtX2FkZHIpKSkgewogCQlhcnBpbmRleCA9IG5lc19hcnBfdGFibGUobmVzZGV2LCBudG9obChuZXN2bmljLT5sb2NhbF9pcGFkZHIpLCBOVUxMLCBORVNfQVJQX1JFU09MVkUpOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCW9sZGFycGluZGV4ID0gbmVzX2FycF90YWJsZShuZXNkZXYsIGNtX25vZGUtPnJlbV9hZGRyLCBOVUxMLCBORVNfQVJQX1JFU09MVkUpOwogCQlhcnBpbmRleCA9IG5lc19hZGRyX3Jlc29sdmVfbmVpZ2gobmVzdm5pYywgY21faW5mby0+cmVtX2FkZHIsIG9sZGFycGluZGV4KTsKLQogCX0KIAlpZiAoYXJwaW5kZXggPCAwKSB7CiAJCWtmcmVlKGNtX25vZGUpOwpAQCAtMTI2MCw3ICsxNDkxLDcgQEAKICAqIHJlbV9yZWZfY21fbm9kZSAtIGRlc3Ryb3kgYW4gaW5zdGFuY2Ugb2YgYSBjbSBub2RlCiAgKi8KIHN0YXRpYyBpbnQgcmVtX3JlZl9jbV9ub2RlKHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwKLQlzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCisJCQkgICBzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbmVzX3FwICpuZXNxcDsKQEAgLTEyOTEsOSArMTUyMiw5IEBACiAJfSBlbHNlIHsKIAkJaWYgKGNtX25vZGUtPmFwYnZ0X3NldCAmJiBjbV9ub2RlLT5uZXN2bmljKSB7CiAJCQluZXNfbWFuYWdlX2FwYnZ0KGNtX25vZGUtPm5lc3ZuaWMsIGNtX25vZGUtPmxvY19wb3J0LAotCQkJCVBDSV9GVU5DKAotCQkJCWNtX25vZGUtPm5lc3ZuaWMtPm5lc2Rldi0+cGNpZGV2LT5kZXZmbiksCi0JCQkJTkVTX01BTkFHRV9BUEJWVF9ERUwpOworCQkJCQkgUENJX0ZVTkMoCisJCQkJCQkgY21fbm9kZS0+bmVzdm5pYy0+bmVzZGV2LT5wY2lkZXYtPmRldmZuKSwKKwkJCQkJIE5FU19NQU5BR0VfQVBCVlRfREVMKTsKIAkJfQogCX0KIApAQCAtMTMxNCw3ICsxNTQ1LDcgQEAKICAqIHByb2Nlc3Nfb3B0aW9ucwogICovCiBzdGF0aWMgaW50IHByb2Nlc3Nfb3B0aW9ucyhzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHU4ICpvcHRpb25zbG9jLAotCXUzMiBvcHRpb25zaXplLCB1MzIgc3luX3BhY2tldCkKKwkJCSAgIHUzMiBvcHRpb25zaXplLCB1MzIgc3luX3BhY2tldCkKIHsKIAl1MzIgdG1wOwogCXUzMiBvZmZzZXQgPSAwOwpAQCAtMTMzMiwxNSArMTU2MywxNSBAQAogCQkJY29udGludWU7CiAJCWNhc2UgT1BUSU9OX05VTUJFUl9NU1M6CiAJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIiVzOiBNU1MgTGVuZ3RoOiAlZCBPZmZzZXQ6ICVkICIKLQkJCQkiU2l6ZTogJWRcbiIsIF9fZnVuY19fLAotCQkJCWFsbF9vcHRpb25zLT5hc19tc3MubGVuZ3RoLCBvZmZzZXQsIG9wdGlvbnNpemUpOworCQkJCSAgIlNpemU6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgIGFsbF9vcHRpb25zLT5hc19tc3MubGVuZ3RoLCBvZmZzZXQsIG9wdGlvbnNpemUpOwogCQkJZ290X21zc19vcHRpb24gPSAxOwogCQkJaWYgKGFsbF9vcHRpb25zLT5hc19tc3MubGVuZ3RoICE9IDQpIHsKIAkJCQlyZXR1cm4gMTsKIAkJCX0gZWxzZSB7CiAJCQkJdG1wID0gbnRvaHMoYWxsX29wdGlvbnMtPmFzX21zcy5tc3MpOwogCQkJCWlmICh0bXAgPiAwICYmIHRtcCA8Ci0JCQkJCWNtX25vZGUtPnRjcF9jbnR4dC5tc3MpCisJCQkJICAgIGNtX25vZGUtPnRjcF9jbnR4dC5tc3MpCiAJCQkJCWNtX25vZGUtPnRjcF9jbnR4dC5tc3MgPSB0bXA7CiAJCQl9CiAJCQlicmVhazsKQEAgLTEzNDgsMTIgKzE1NzksOSBAQAogCQkJY21fbm9kZS0+dGNwX2NudHh0LnNuZF93c2NhbGUgPQogCQkJCWFsbF9vcHRpb25zLT5hc193aW5kb3dzY2FsZS5zaGlmdGNvdW50OwogCQkJYnJlYWs7Ci0JCWNhc2UgT1BUSU9OX05VTUJFUl9XUklURTA6Ci0JCQljbV9ub2RlLT5zZW5kX3dyaXRlMCA9IDE7Ci0JCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiVENQIE9wdGlvbiBub3QgdW5kZXJzdG9vZDogJXhcbiIsCi0JCQkJYWxsX29wdGlvbnMtPmFzX2Jhc2Uub3B0aW9ubnVtKTsKKwkJCQkgIGFsbF9vcHRpb25zLT5hc19iYXNlLm9wdGlvbm51bSk7CiAJCQlicmVhazsKIAkJfQogCQlvZmZzZXQgKz0gYWxsX29wdGlvbnMtPmFzX2Jhc2UubGVuZ3RoOwpAQCAtMTM3Miw4ICsxNjAwLDggQEAKIHN0YXRpYyB2b2lkIGhhbmRsZV9maW5fcGt0KHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSkKIHsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIlJlY2VpdmVkIEZJTiwgY21fbm9kZSA9ICVwLCBzdGF0ZSA9ICV1LiAiCi0JCSJyZWZjbnQ9JWRcbiIsIGNtX25vZGUsIGNtX25vZGUtPnN0YXRlLAotCQlhdG9taWNfcmVhZCgmY21fbm9kZS0+cmVmX2NvdW50KSk7CisJCSAgInJlZmNudD0lZFxuIiwgY21fbm9kZSwgY21fbm9kZS0+c3RhdGUsCisJCSAgYXRvbWljX3JlYWQoJmNtX25vZGUtPnJlZl9jb3VudCkpOwogCXN3aXRjaCAoY21fbm9kZS0+c3RhdGUpIHsKIAljYXNlIE5FU19DTV9TVEFURV9TWU5fUkNWRDoKIAljYXNlIE5FU19DTV9TVEFURV9TWU5fU0VOVDoKQEAgLTE0MzksNyArMTY2NywyMCBAQAogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIiVzWyV1XSBjcmVhdGUgYWJvcnQgZm9yIGNtX25vZGU9JXAgIgogCQkJImxpc3RlbmVyPSVwIHN0YXRlPSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGNtX25vZGUsCiAJCQljbV9ub2RlLT5saXN0ZW5lciwgY21fbm9kZS0+c3RhdGUpOwotCQlhY3RpdmVfb3Blbl9lcnIoY21fbm9kZSwgc2tiLCByZXNldCk7CisJCXN3aXRjaCAoY21fbm9kZS0+bXBhX2ZyYW1lX3JldikgeworCQljYXNlIElFVEZfTVBBX1YyOgorCQkJY21fbm9kZS0+bXBhX2ZyYW1lX3JldiA9IElFVEZfTVBBX1YxOworCQkJLyogc2VuZCBhIHN5biBhbmQgZ290byBzeW4gc2VudCBzdGF0ZSAqLworCQkJY21fbm9kZS0+c3RhdGUgPSBORVNfQ01fU1RBVEVfU1lOX1NFTlQ7CisJCQlpZiAoc2VuZF9zeW4oY21fbm9kZSwgMCwgTlVMTCkpIHsKKwkJCQlhY3RpdmVfb3Blbl9lcnIoY21fbm9kZSwgc2tiLCByZXNldCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJRVRGX01QQV9WMToKKwkJZGVmYXVsdDoKKwkJCWFjdGl2ZV9vcGVuX2VycihjbV9ub2RlLCBza2IsIHJlc2V0KTsKKwkJCWJyZWFrOworCQl9CiAJCWJyZWFrOwogCWNhc2UgTkVTX0NNX1NUQVRFX01QQVJFUV9SQ1ZEOgogCQlhdG9taWNfaW5jKCZjbV9ub2RlLT5wYXNzaXZlX3N0YXRlKTsKQEAgLTE0NzUsMjEgKzE3MTYsMjEgQEAKIAogc3RhdGljIHZvaWQgaGFuZGxlX3Jjdl9tcGEoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCi0JaW50CXJldCA9IDA7CisJaW50IHJldCA9IDA7CiAJaW50IGRhdGFzaXplID0gc2tiLT5sZW47CiAJdTggKmRhdGFsb2MgPSBza2ItPmRhdGE7CiAKIAllbnVtIG5lc19jbV9ldmVudF90eXBlIHR5cGUgPSBORVNfQ01fRVZFTlRfVU5LTk9XTjsKLQl1MzIgICAgIHJlc190eXBlOworCXUzMiByZXNfdHlwZTsKKwogCXJldCA9IHBhcnNlX21wYShjbV9ub2RlLCBkYXRhbG9jLCAmcmVzX3R5cGUsIGRhdGFzaXplKTsKIAlpZiAocmV0KSB7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiZGlkbid0IGxpa2UgTVBBIFJlcXVlc3RcbiIpOwogCQlpZiAoY21fbm9kZS0+c3RhdGUgPT0gTkVTX0NNX1NUQVRFX01QQVJFUV9TRU5UKSB7CiAJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIiVzWyV1XSBjcmVhdGUgYWJvcnQgZm9yICIKLQkJCQkiY21fbm9kZT0lcCBsaXN0ZW5lcj0lcCBzdGF0ZT0lZFxuIiwgX19mdW5jX18sCi0JCQkJX19MSU5FX18sIGNtX25vZGUsIGNtX25vZGUtPmxpc3RlbmVyLAotCQkJCWNtX25vZGUtPnN0YXRlKTsKKwkJCQkgICJjbV9ub2RlPSVwIGxpc3RlbmVyPSVwIHN0YXRlPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgIF9fTElORV9fLCBjbV9ub2RlLCBjbV9ub2RlLT5saXN0ZW5lciwKKwkJCQkgIGNtX25vZGUtPnN0YXRlKTsKIAkJCWFjdGl2ZV9vcGVuX2VycihjbV9ub2RlLCBza2IsIDEpOwogCQl9IGVsc2UgewogCQkJcGFzc2l2ZV9vcGVuX2VycihjbV9ub2RlLCBza2IsIDEpOwpAQCAtMTQ5OSwxNiArMTc0MCwxNSBAQAogCiAJc3dpdGNoIChjbV9ub2RlLT5zdGF0ZSkgewogCWNhc2UgTkVTX0NNX1NUQVRFX0VTVEFCTElTSEVEOgotCQlpZiAocmVzX3R5cGUgPT0gTkVTX01QQV9SRVFVRVNUX1JFSkVDVCkgeworCQlpZiAocmVzX3R5cGUgPT0gTkVTX01QQV9SRVFVRVNUX1JFSkVDVCkKIAkJCS8qQklHIHByb2JsZW0gYXMgd2UgYXJlIHJlY2VpdmluZyB0aGUgTVBBLi4gU28gc2hvdWxkCi0JCQkqIG5vdCBiZSBSRUpFQ1QuLiBUaGlzIGlzIFBhc3NpdmUgT3Blbi4uIFdlIGNhbgotCQkJKiBvbmx5IHJlY2VpdmUgaXQgUmVqZWN0IGZvciBBY3RpdmUgT3Blbi4uLiovCisJCQkgKiBub3QgYmUgUkVKRUNULi4gVGhpcyBpcyBQYXNzaXZlIE9wZW4uLiBXZSBjYW4KKwkJCSAqIG9ubHkgcmVjZWl2ZSBpdCBSZWplY3QgZm9yIEFjdGl2ZSBPcGVuLi4uKi8KIAkJCVdBUk5fT04oMSk7Ci0JCX0KIAkJY21fbm9kZS0+c3RhdGUgPSBORVNfQ01fU1RBVEVfTVBBUkVRX1JDVkQ7CiAJCXR5cGUgPSBORVNfQ01fRVZFTlRfTVBBX1JFUTsKIAkJYXRvbWljX3NldCgmY21fbm9kZS0+cGFzc2l2ZV9zdGF0ZSwKLQkJCQlORVNfUEFTU0lWRV9TVEFURV9JTkRJQ0FURUQpOworCQkJICAgTkVTX1BBU1NJVkVfU1RBVEVfSU5ESUNBVEVEKTsKIAkJYnJlYWs7CiAJY2FzZSBORVNfQ01fU1RBVEVfTVBBUkVRX1NFTlQ6CiAJCWNsZWFudXBfcmV0cmFuc19lbnRyeShjbV9ub2RlKTsKQEAgLTE1MzUsOCArMTc3NSw4IEBACiAJY2FzZSBORVNfQ01fU1RBVEVfU1lOX1NFTlQ6CiAJY2FzZSBORVNfQ01fU1RBVEVfTVBBUkVRX1NFTlQ6CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiJXNbJXVdIGNyZWF0ZSBhYm9ydCBmb3IgY21fbm9kZT0lcCAiCi0JCQkibGlzdGVuZXI9JXAgc3RhdGU9JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY21fbm9kZSwKLQkJCWNtX25vZGUtPmxpc3RlbmVyLCBjbV9ub2RlLT5zdGF0ZSk7CisJCQkgICJsaXN0ZW5lcj0lcCBzdGF0ZT0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjbV9ub2RlLAorCQkJICBjbV9ub2RlLT5saXN0ZW5lciwgY21fbm9kZS0+c3RhdGUpOwogCQlhY3RpdmVfb3Blbl9lcnIoY21fbm9kZSwgc2tiLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBORVNfQ01fU1RBVEVfRVNUQUJMSVNIRUQ6CkBAIC0xNTUwLDExICsxNzkwLDExIEBACiB9CiAKIHN0YXRpYyBpbnQgY2hlY2tfc3luKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHRjcGhkciAqdGNwaCwKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IGVycjsKIAotCWVyciA9ICgobnRvaGwodGNwaC0+YWNrX3NlcSkgPT0gY21fbm9kZS0+dGNwX2NudHh0LmxvY19zZXFfbnVtKSk/IDAgOiAxOworCWVyciA9ICgobnRvaGwodGNwaC0+YWNrX3NlcSkgPT0gY21fbm9kZS0+dGNwX2NudHh0LmxvY19zZXFfbnVtKSkgPyAwIDogMTsKIAlpZiAoZXJyKQogCQlhY3RpdmVfb3Blbl9lcnIoY21fbm9kZSwgc2tiLCAxKTsKIApAQCAtMTU2Miw3ICsxODAyLDcgQEAKIH0KIAogc3RhdGljIGludCBjaGVja19zZXEoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3QgdGNwaGRyICp0Y3BoLAotCXN0cnVjdCBza19idWZmICpza2IpCisJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgZXJyID0gMDsKIAl1MzIgc2VxOwpAQCAtMTU3MCwyMSArMTgxMCwyMiBAQAogCXUzMiBsb2Nfc2VxX251bSA9IGNtX25vZGUtPnRjcF9jbnR4dC5sb2Nfc2VxX251bTsKIAl1MzIgcmN2X254dCA9IGNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfbnh0OwogCXUzMiByY3Zfd25kOworCiAJc2VxID0gbnRvaGwodGNwaC0+c2VxKTsKIAlhY2tfc2VxID0gbnRvaGwodGNwaC0+YWNrX3NlcSk7CiAJcmN2X3duZCA9IGNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfd25kOwogCWlmIChhY2tfc2VxICE9IGxvY19zZXFfbnVtKQogCQllcnIgPSAxOwotCWVsc2UgaWYgKCFiZXR3ZWVuKHNlcSwgcmN2X254dCwgKHJjdl9ueHQrcmN2X3duZCkpKQorCWVsc2UgaWYgKCFiZXR3ZWVuKHNlcSwgcmN2X254dCwgKHJjdl9ueHQgKyByY3Zfd25kKSkpCiAJCWVyciA9IDE7CiAJaWYgKGVycikgewogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIiVzWyV1XSBjcmVhdGUgYWJvcnQgZm9yIGNtX25vZGU9JXAgIgotCQkJImxpc3RlbmVyPSVwIHN0YXRlPSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGNtX25vZGUsCi0JCQljbV9ub2RlLT5saXN0ZW5lciwgY21fbm9kZS0+c3RhdGUpOworCQkJICAibGlzdGVuZXI9JXAgc3RhdGU9JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY21fbm9kZSwKKwkJCSAgY21fbm9kZS0+bGlzdGVuZXIsIGNtX25vZGUtPnN0YXRlKTsKIAkJaW5kaWNhdGVfcGt0X2VycihjbV9ub2RlLCBza2IpOwogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgInNlcSBFUlJPUiBjbV9ub2RlID0lcCBzZXE9MHglMDhYICIKLQkJCSJyY3Zfbnh0PTB4JTA4WCByY3Zfd25kPTB4JXhcbiIsIGNtX25vZGUsIHNlcSwgcmN2X254dCwKLQkJCXJjdl93bmQpOworCQkJICAicmN2X254dD0weCUwOFggcmN2X3duZD0weCV4XG4iLCBjbV9ub2RlLCBzZXEsIHJjdl9ueHQsCisJCQkgIHJjdl93bmQpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMTU5NCw5ICsxODM1LDggQEAKICAqIGlzIGNyZWF0ZWQgd2l0aCBhIGxpc3RlbmVyIG9yIGl0IG1heSBjb21laW4gYXMgcmV4bWl0dGVkIHBhY2tldCB3aGljaCBpbgogICogdGhhdCBjYXNlIHdpbGwgYmUganVzdCBkcm9wcGVkLgogICovCi0KIHN0YXRpYyB2b2lkIGhhbmRsZV9zeW5fcGt0KHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQlzdHJ1Y3QgdGNwaGRyICp0Y3BoKQorCQkJICAgc3RydWN0IHRjcGhkciAqdGNwaCkKIHsKIAlpbnQgcmV0OwogCXUzMiBpbmNfc2VxdWVuY2U7CkBAIC0xNjE1LDE1ICsxODU1LDE1IEBACiAJY2FzZSBORVNfQ01fU1RBVEVfTElTVEVOSU5HOgogCQkvKiBQYXNzaXZlIE9QRU4gKi8KIAkJaWYgKGF0b21pY19yZWFkKCZjbV9ub2RlLT5saXN0ZW5lci0+cGVuZF9hY2NlcHRzX2NudCkgPgotCQkJCWNtX25vZGUtPmxpc3RlbmVyLT5iYWNrbG9nKSB7CisJCSAgICBjbV9ub2RlLT5saXN0ZW5lci0+YmFja2xvZykgewogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJkcm9wIHN5biBkdWUgdG8gYmFja2xvZyAiCi0JCQkJInByZXNzdXJlIFxuIik7CisJCQkJICAicHJlc3N1cmUgXG4iKTsKIAkJCWNtX2JhY2tsb2dfZHJvcHMrKzsKIAkJCXBhc3NpdmVfb3Blbl9lcnIoY21fbm9kZSwgc2tiLCAwKTsKIAkJCWJyZWFrOwogCQl9CiAJCXJldCA9IGhhbmRsZV90Y3Bfb3B0aW9ucyhjbV9ub2RlLCB0Y3BoLCBza2IsIG9wdGlvbnNpemUsCi0JCQkxKTsKKwkJCQkJIDEpOwogCQlpZiAocmV0KSB7CiAJCQlwYXNzaXZlX29wZW5fZXJyKGNtX25vZGUsIHNrYiwgMCk7CiAJCQkvKiBkcm9wIHBrdCAqLwpAQCAtMTY1Nyw5ICsxODk3LDggQEAKIH0KIAogc3RhdGljIHZvaWQgaGFuZGxlX3N5bmFja19wa3Qoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCXN0cnVjdCB0Y3BoZHIgKnRjcGgpCisJCQkgICAgICBzdHJ1Y3QgdGNwaGRyICp0Y3BoKQogewotCiAJaW50IHJldDsKIAl1MzIgaW5jX3NlcXVlbmNlOwogCWludCBvcHRpb25zaXplOwpAQCAtMTY3OCw3ICsxOTE3LDcgQEAKIAkJcmV0ID0gaGFuZGxlX3RjcF9vcHRpb25zKGNtX25vZGUsIHRjcGgsIHNrYiwgb3B0aW9uc2l6ZSwgMCk7CiAJCWlmIChyZXQpIHsKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiY21fbm9kZT0lcCB0Y3Bfb3B0aW9ucyBmYWlsZWRcbiIsCi0JCQkJY21fbm9kZSk7CisJCQkJICBjbV9ub2RlKTsKIAkJCWJyZWFrOwogCQl9CiAJCWNsZWFudXBfcmV0cmFuc19lbnRyeShjbV9ub2RlKTsKQEAgLTE3MTcsMTIgKzE5NTYsMTMgQEAKIH0KIAogc3RhdGljIGludCBoYW5kbGVfYWNrX3BrdChzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHN0cnVjdCBza19idWZmICpza2IsCi0Jc3RydWN0IHRjcGhkciAqdGNwaCkKKwkJCSAgc3RydWN0IHRjcGhkciAqdGNwaCkKIHsKIAlpbnQgZGF0YXNpemUgPSAwOwogCXUzMiBpbmNfc2VxdWVuY2U7CiAJaW50IHJldCA9IDA7CiAJaW50IG9wdGlvbnNpemU7CisKIAlvcHRpb25zaXplID0gKHRjcGgtPmRvZmYgPDwgMikgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CiAKIAlpZiAoY2hlY2tfc2VxKGNtX25vZGUsIHRjcGgsIHNrYikpCkBAIC0xNzQzLDggKzE5ODMsOSBAQAogCQlpZiAoZGF0YXNpemUpIHsKIAkJCWNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfbnh0ID0gaW5jX3NlcXVlbmNlICsgZGF0YXNpemU7CiAJCQloYW5kbGVfcmN2X21wYShjbV9ub2RlLCBza2IpOwotCQl9IGVsc2UgIC8qIHJjdmQgQUNLIG9ubHkgKi8KKwkJfSBlbHNlIHsgLyogcmN2ZCBBQ0sgb25seSAqLwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJfQogCQlicmVhazsKIAljYXNlIE5FU19DTV9TVEFURV9FU1RBQkxJU0hFRDoKIAkJLyogUGFzc2l2ZSBPUEVOICovCkBAIC0xNzUyLDE2ICsxOTkzLDE4IEBACiAJCWlmIChkYXRhc2l6ZSkgewogCQkJY21fbm9kZS0+dGNwX2NudHh0LnJjdl9ueHQgPSBpbmNfc2VxdWVuY2UgKyBkYXRhc2l6ZTsKIAkJCWhhbmRsZV9yY3ZfbXBhKGNtX25vZGUsIHNrYik7Ci0JCX0gZWxzZQorCQl9IGVsc2UgewogCQkJZHJvcF9wYWNrZXQoc2tiKTsKKwkJfQogCQlicmVhazsKIAljYXNlIE5FU19DTV9TVEFURV9NUEFSRVFfU0VOVDoKIAkJY21fbm9kZS0+dGNwX2NudHh0LnJlbV9hY2tfbnVtID0gbnRvaGwodGNwaC0+YWNrX3NlcSk7CiAJCWlmIChkYXRhc2l6ZSkgewogCQkJY21fbm9kZS0+dGNwX2NudHh0LnJjdl9ueHQgPSBpbmNfc2VxdWVuY2UgKyBkYXRhc2l6ZTsKIAkJCWhhbmRsZV9yY3ZfbXBhKGNtX25vZGUsIHNrYik7Ci0JCX0gZWxzZSAgLyogQ291bGQgYmUganVzdCBhbiBhY2sgcGt0Li4gKi8KKwkJfSBlbHNlIHsgLyogQ291bGQgYmUganVzdCBhbiBhY2sgcGt0Li4gKi8KIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBORVNfQ01fU1RBVEVfTElTVEVOSU5HOgogCQljbGVhbnVwX3JldHJhbnNfZW50cnkoY21fbm9kZSk7CkBAIC0xODAyLDE0ICsyMDQ1LDE1IEBACiAKIAogc3RhdGljIGludCBoYW5kbGVfdGNwX29wdGlvbnMoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3QgdGNwaGRyICp0Y3BoLAotCXN0cnVjdCBza19idWZmICpza2IsIGludCBvcHRpb25zaXplLCBpbnQgcGFzc2l2ZSkKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBvcHRpb25zaXplLCBpbnQgcGFzc2l2ZSkKIHsKIAl1OCAqb3B0aW9uc2xvYyA9ICh1OCAqKSZ0Y3BoWzFdOworCiAJaWYgKG9wdGlvbnNpemUpIHsKIAkJaWYgKHByb2Nlc3Nfb3B0aW9ucyhjbV9ub2RlLCBvcHRpb25zbG9jLCBvcHRpb25zaXplLAotCQkJKHUzMil0Y3BoLT5zeW4pKSB7CisJCQkJICAgICh1MzIpdGNwaC0+c3luKSkgewogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICIlczogTm9kZSAlcCwgU2VuZGluZyBSRVNFVFxuIiwKLQkJCQlfX2Z1bmNfXywgY21fbm9kZSk7CisJCQkJICBfX2Z1bmNfXywgY21fbm9kZSk7CiAJCQlpZiAocGFzc2l2ZSkKIAkJCQlwYXNzaXZlX29wZW5fZXJyKGNtX25vZGUsIHNrYiwgMSk7CiAJCQllbHNlCkBAIC0xODE5LDcgKzIwNjMsNyBAQAogCX0KIAogCWNtX25vZGUtPnRjcF9jbnR4dC5zbmRfd25kID0gbnRvaHModGNwaC0+d2luZG93KSA8PAotCQkJY21fbm9kZS0+dGNwX2NudHh0LnNuZF93c2NhbGU7CisJCQkJICAgICBjbV9ub2RlLT50Y3BfY250eHQuc25kX3dzY2FsZTsKIAogCWlmIChjbV9ub2RlLT50Y3BfY250eHQuc25kX3duZCA+IGNtX25vZGUtPnRjcF9jbnR4dC5tYXhfc25kX3duZCkKIAkJY21fbm9kZS0+dGNwX2NudHh0Lm1heF9zbmRfd25kID0gY21fbm9kZS0+dGNwX2NudHh0LnNuZF93bmQ7CkBAIC0xODMwLDE4ICsyMDc0LDE4IEBACiAgKiBhY3RpdmVfb3Blbl9lcnIoKSB3aWxsIHNlbmQgcmVzZXQoKSBpZiBmbGFnIHNldC4uCiAgKiBJdCB3aWxsIGFsc28gc2VuZCBBQk9SVCBldmVudC4KICAqLwotCiBzdGF0aWMgdm9pZCBhY3RpdmVfb3Blbl9lcnIoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCWludCByZXNldCkKKwkJCSAgICBpbnQgcmVzZXQpCiB7CiAJY2xlYW51cF9yZXRyYW5zX2VudHJ5KGNtX25vZGUpOwogCWlmIChyZXNldCkgewogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIkVSUk9SIGFjdGl2ZSBlcnIgY2FsbGVkIGZvciBjbV9ub2RlPSVwLCAiCi0JCQkJInN0YXRlPSVkXG4iLCBjbV9ub2RlLCBjbV9ub2RlLT5zdGF0ZSk7CisJCQkgICJzdGF0ZT0lZFxuIiwgY21fbm9kZSwgY21fbm9kZS0+c3RhdGUpOwogCQlhZGRfcmVmX2NtX25vZGUoY21fbm9kZSk7CiAJCXNlbmRfcmVzZXQoY21fbm9kZSwgc2tiKTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KIAogCWNtX25vZGUtPnN0YXRlID0gTkVTX0NNX1NUQVRFX0NMT1NFRDsKIAljcmVhdGVfZXZlbnQoY21fbm9kZSwgTkVTX0NNX0VWRU5UX0FCT1JURUQpOwpAQCAtMTg1MSwxNSArMjA5NSwxNCBAQAogICogcGFzc2l2ZV9vcGVuX2VycigpIHdpbGwgZWl0aGVyIGRvIGEgcmVzZXQoKSBvciB3aWxsIGZyZWUgdXAgdGhlIHNrYiBhbmQKICAqIHJlbW92ZSB0aGUgY21fbm9kZS4KICAqLwotCiBzdGF0aWMgdm9pZCBwYXNzaXZlX29wZW5fZXJyKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQlpbnQgcmVzZXQpCisJCQkgICAgIGludCByZXNldCkKIHsKIAljbGVhbnVwX3JldHJhbnNfZW50cnkoY21fbm9kZSk7CiAJY21fbm9kZS0+c3RhdGUgPSBORVNfQ01fU1RBVEVfQ0xPU0VEOwogCWlmIChyZXNldCkgewogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgInBhc3NpdmVfb3Blbl9lcnIgc2VuZGluZyBSU1QgZm9yICIKLQkJCSJjbV9ub2RlPSVwIHN0YXRlID0lZFxuIiwgY21fbm9kZSwgY21fbm9kZS0+c3RhdGUpOworCQkJICAiY21fbm9kZT0lcCBzdGF0ZSA9JWRcbiIsIGNtX25vZGUsIGNtX25vZGUtPnN0YXRlKTsKIAkJc2VuZF9yZXNldChjbV9ub2RlLCBza2IpOwogCX0gZWxzZSB7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CkBAIC0xODc0LDYgKzIxMTcsNyBAQAogc3RhdGljIHZvaWQgZnJlZV9yZXRyYW5zX2VudHJ5KHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSkKIHsKIAlzdHJ1Y3QgbmVzX3RpbWVyX2VudHJ5ICpzZW5kX2VudHJ5OworCiAJc2VuZF9lbnRyeSA9IGNtX25vZGUtPnNlbmRfZW50cnk7CiAJaWYgKHNlbmRfZW50cnkpIHsKIAkJY21fbm9kZS0+c2VuZF9lbnRyeSA9IE5VTEw7CkBAIC0xODk3LDI2ICsyMTQxLDI4IEBACiAgKiBSZXR1cm5zIHNrYiBpZiB0byBiZSBmcmVlZCwgZWxzZSBpdCB3aWxsIHJldHVybiBOVUxMIGlmIGFscmVhZHkgdXNlZC4uCiAgKi8KIHN0YXRpYyB2b2lkIHByb2Nlc3NfcGFja2V0KHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQlzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUpCisJCQkgICBzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUpCiB7Ci0JZW51bSBuZXNfdGNwaXBfcGt0X3R5cGUJcGt0X3R5cGUgPSBORVNfUEtUX1RZUEVfVU5LTk9XTjsKKwllbnVtIG5lc190Y3BpcF9wa3RfdHlwZSBwa3RfdHlwZSA9IE5FU19QS1RfVFlQRV9VTktOT1dOOwogCXN0cnVjdCB0Y3BoZHIgKnRjcGggPSB0Y3BfaGRyKHNrYik7Ci0JdTMyICAgICBmaW5fc2V0ID0gMDsKKwl1MzIgZmluX3NldCA9IDA7CiAJaW50IHJldCA9IDA7CisKIAlza2JfcHVsbChza2IsIGlwX2hkcihza2IpLT5paGwgPDwgMik7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgInByb2Nlc3NfcGFja2V0OiBjbV9ub2RlPSVwIHN0YXRlID0lZCBzeW49JWQgIgotCQkiYWNrPSVkIHJzdD0lZCBmaW49JWRcbiIsIGNtX25vZGUsIGNtX25vZGUtPnN0YXRlLCB0Y3BoLT5zeW4sCi0JCXRjcGgtPmFjaywgdGNwaC0+cnN0LCB0Y3BoLT5maW4pOworCQkgICJhY2s9JWQgcnN0PSVkIGZpbj0lZFxuIiwgY21fbm9kZSwgY21fbm9kZS0+c3RhdGUsIHRjcGgtPnN5biwKKwkJICB0Y3BoLT5hY2ssIHRjcGgtPnJzdCwgdGNwaC0+ZmluKTsKIAotCWlmICh0Y3BoLT5yc3QpCisJaWYgKHRjcGgtPnJzdCkgewogCQlwa3RfdHlwZSA9IE5FU19QS1RfVFlQRV9SU1Q7Ci0JZWxzZSBpZiAodGNwaC0+c3luKSB7CisJfSBlbHNlIGlmICh0Y3BoLT5zeW4pIHsKIAkJcGt0X3R5cGUgPSBORVNfUEtUX1RZUEVfU1lOOwogCQlpZiAodGNwaC0+YWNrKQogCQkJcGt0X3R5cGUgPSBORVNfUEtUX1RZUEVfU1lOQUNLOwotCX0gZWxzZSBpZiAodGNwaC0+YWNrKQorCX0gZWxzZSBpZiAodGNwaC0+YWNrKSB7CiAJCXBrdF90eXBlID0gTkVTX1BLVF9UWVBFX0FDSzsKKwl9CiAJaWYgKHRjcGgtPmZpbikKIAkJZmluX3NldCA9IDE7CiAKQEAgLTE5NDcsMTcgKzIxOTMsMTcgQEAKICAqIG1pbmlfY21fbGlzdGVuIC0gY3JlYXRlIGEgbGlzdGVuIG5vZGUgd2l0aCBwYXJhbXMKICAqLwogc3RhdGljIHN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKm1pbmlfY21fbGlzdGVuKHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwKLQlzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBuZXNfY21faW5mbyAqY21faW5mbykKKwkJCQkJICAgICAgc3RydWN0IG5lc192bmljICpuZXN2bmljLCBzdHJ1Y3QgbmVzX2NtX2luZm8gKmNtX2luZm8pCiB7CiAJc3RydWN0IG5lc19jbV9saXN0ZW5lciAqbGlzdGVuZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiU2VhcmNoIGZvciAweCUwOHggOiAweCUwNHhcbiIsCi0JCWNtX2luZm8tPmxvY19hZGRyLCBjbV9pbmZvLT5sb2NfcG9ydCk7CisJCSAgY21faW5mby0+bG9jX2FkZHIsIGNtX2luZm8tPmxvY19wb3J0KTsKIAogCS8qIGNhbm5vdCBoYXZlIG11bHRpcGxlIG1hdGNoaW5nIGxpc3RlbmVycyAqLwogCWxpc3RlbmVyID0gZmluZF9saXN0ZW5lcihjbV9jb3JlLCBodG9ubChjbV9pbmZvLT5sb2NfYWRkciksCi0JCQlodG9ucyhjbV9pbmZvLT5sb2NfcG9ydCksIE5FU19DTV9MSVNURU5FUl9FSVRIRVJfU1RBVEUpOworCQkJCSBodG9ucyhjbV9pbmZvLT5sb2NfcG9ydCksIE5FU19DTV9MSVNURU5FUl9FSVRIRVJfU1RBVEUpOwogCWlmIChsaXN0ZW5lciAmJiBsaXN0ZW5lci0+bGlzdGVuZXJfc3RhdGUgPT0gTkVTX0NNX0xJU1RFTkVSX0FDVElWRV9TVEFURSkgewogCQkvKiBmaW5kIGF1dG9tYXRpY2FsbHkgaW5jcyByZWYgY291bnQgPz8/ICovCiAJCWF0b21pY19kZWMoJmxpc3RlbmVyLT5yZWZfY291bnQpOwpAQCAtMjAwMyw5ICsyMjQ5LDkgQEAKIAl9CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIkFwaSAtIGxpc3RlbigpOiBhZGRyPTB4JTA4WCwgcG9ydD0weCUwNHgsIgotCQkJIiBsaXN0ZW5lciA9ICVwLCBiYWNrbG9nID0gJWQsIGNtX2lkID0gJXAuXG4iLAotCQkJY21faW5mby0+bG9jX2FkZHIsIGNtX2luZm8tPmxvY19wb3J0LAotCQkJbGlzdGVuZXIsIGxpc3RlbmVyLT5iYWNrbG9nLCBsaXN0ZW5lci0+Y21faWQpOworCQkgICIgbGlzdGVuZXIgPSAlcCwgYmFja2xvZyA9ICVkLCBjbV9pZCA9ICVwLlxuIiwKKwkJICBjbV9pbmZvLT5sb2NfYWRkciwgY21faW5mby0+bG9jX3BvcnQsCisJCSAgbGlzdGVuZXIsIGxpc3RlbmVyLT5iYWNrbG9nLCBsaXN0ZW5lci0+Y21faWQpOwogCiAJcmV0dXJuIGxpc3RlbmVyOwogfQpAQCAtMjAxNSwyNiArMjI2MSwyMCBAQAogICogbWluaV9jbV9jb25uZWN0IC0gbWFrZSBhIGNvbm5lY3Rpb24gbm9kZSB3aXRoIHBhcmFtcwogICovCiBzdGF0aWMgc3RydWN0IG5lc19jbV9ub2RlICptaW5pX2NtX2Nvbm5lY3Qoc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCXN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgdTE2IHByaXZhdGVfZGF0YV9sZW4sCi0Jdm9pZCAqcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgbmVzX2NtX2luZm8gKmNtX2luZm8pCisJCQkJCSAgIHN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgdTE2IHByaXZhdGVfZGF0YV9sZW4sCisJCQkJCSAgIHZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IG5lc19jbV9pbmZvICpjbV9pbmZvKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZTsKIAlzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICpsb29wYmFja3JlbW90ZWxpc3RlbmVyOwogCXN0cnVjdCBuZXNfY21fbm9kZSAqbG9vcGJhY2tyZW1vdGVub2RlOwogCXN0cnVjdCBuZXNfY21faW5mbyBsb29wYmFja19jbV9pbmZvOwotCXUxNiBtcGFfZnJhbWVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpICsgcHJpdmF0ZV9kYXRhX2xlbjsKLQlzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUgKm1wYV9mcmFtZSA9IE5VTEw7CisJdTggKnN0YXJ0X2J1ZmY7CiAKIAkvKiBjcmVhdGUgYSBDTSBjb25uZWN0aW9uIG5vZGUgKi8KIAljbV9ub2RlID0gbWFrZV9jbV9ub2RlKGNtX2NvcmUsIG5lc3ZuaWMsIGNtX2luZm8sIE5VTEwpOwogCWlmICghY21fbm9kZSkKIAkJcmV0dXJuIE5VTEw7Ci0JbXBhX2ZyYW1lID0gJmNtX25vZGUtPm1wYV9mcmFtZTsKLQltZW1jcHkobXBhX2ZyYW1lLT5rZXksIElFRlRfTVBBX0tFWV9SRVEsIElFVEZfTVBBX0tFWV9TSVpFKTsKLQltcGFfZnJhbWUtPmZsYWdzID0gSUVURl9NUEFfRkxBR1NfQ1JDOwotCW1wYV9mcmFtZS0+cmV2ID0gIElFVEZfTVBBX1ZFUlNJT047Ci0JbXBhX2ZyYW1lLT5wcml2X2RhdGFfbGVuID0gaHRvbnMocHJpdmF0ZV9kYXRhX2xlbik7CiAKIAkvKiBzZXQgb3VyIG5vZGUgc2lkZSB0byBjbGllbnQgKGFjdGl2ZSkgc2lkZSAqLwogCWNtX25vZGUtPnRjcF9jbnR4dC5jbGllbnQgPSAxOwpAQCAtMjA0Miw4ICsyMjgyLDggQEAKIAogCWlmIChjbV9pbmZvLT5sb2NfYWRkciA9PSBjbV9pbmZvLT5yZW1fYWRkcikgewogCQlsb29wYmFja3JlbW90ZWxpc3RlbmVyID0gZmluZF9saXN0ZW5lcihjbV9jb3JlLAotCQkJCW50b2hsKG5lc3ZuaWMtPmxvY2FsX2lwYWRkciksIGNtX25vZGUtPnJlbV9wb3J0LAotCQkJCU5FU19DTV9MSVNURU5FUl9BQ1RJVkVfU1RBVEUpOworCQkJCQkJICAgICAgIG50b2hsKG5lc3ZuaWMtPmxvY2FsX2lwYWRkciksIGNtX25vZGUtPnJlbV9wb3J0LAorCQkJCQkJICAgICAgIE5FU19DTV9MSVNURU5FUl9BQ1RJVkVfU1RBVEUpOwogCQlpZiAobG9vcGJhY2tyZW1vdGVsaXN0ZW5lciA9PSBOVUxMKSB7CiAJCQljcmVhdGVfZXZlbnQoY21fbm9kZSwgTkVTX0NNX0VWRU5UX0FCT1JURUQpOwogCQl9IGVsc2UgewpAQCAtMjA1Miw3ICsyMjkyLDcgQEAKIAkJCWxvb3BiYWNrX2NtX2luZm8ucmVtX3BvcnQgPSBjbV9pbmZvLT5sb2NfcG9ydDsKIAkJCWxvb3BiYWNrX2NtX2luZm8uY21faWQgPSBsb29wYmFja3JlbW90ZWxpc3RlbmVyLT5jbV9pZDsKIAkJCWxvb3BiYWNrcmVtb3Rlbm9kZSA9IG1ha2VfY21fbm9kZShjbV9jb3JlLCBuZXN2bmljLAotCQkJCSZsb29wYmFja19jbV9pbmZvLCBsb29wYmFja3JlbW90ZWxpc3RlbmVyKTsKKwkJCQkJCQkgICZsb29wYmFja19jbV9pbmZvLCBsb29wYmFja3JlbW90ZWxpc3RlbmVyKTsKIAkJCWlmICghbG9vcGJhY2tyZW1vdGVub2RlKSB7CiAJCQkJcmVtX3JlZl9jbV9ub2RlKGNtX25vZGUtPmNtX2NvcmUsIGNtX25vZGUpOwogCQkJCXJldHVybiBOVUxMOwpAQCAtMjA2Myw3ICsyMzAzLDcgQEAKIAkJCQlORVNfQ01fREVGQVVMVF9SQ1ZfV05EX1NDQUxFOwogCQkJY21fbm9kZS0+bG9vcGJhY2twYXJ0bmVyID0gbG9vcGJhY2tyZW1vdGVub2RlOwogCQkJbWVtY3B5KGxvb3BiYWNrcmVtb3Rlbm9kZS0+bXBhX2ZyYW1lX2J1ZiwgcHJpdmF0ZV9kYXRhLAotCQkJCXByaXZhdGVfZGF0YV9sZW4pOworCQkJICAgICAgIHByaXZhdGVfZGF0YV9sZW4pOwogCQkJbG9vcGJhY2tyZW1vdGVub2RlLT5tcGFfZnJhbWVfc2l6ZSA9IHByaXZhdGVfZGF0YV9sZW47CiAKIAkJCS8qIHdlIGFyZSBkb25lIGhhbmRsaW5nIHRoaXMgc3RhdGUuICovCkBAIC0yMDkxLDEyICsyMzMxLDEwIEBACiAJCXJldHVybiBjbV9ub2RlOwogCX0KIAotCS8qIHNldCBvdXIgbm9kZSBzaWRlIHRvIGNsaWVudCAoYWN0aXZlKSBzaWRlICovCi0JY21fbm9kZS0+dGNwX2NudHh0LmNsaWVudCA9IDE7Ci0JLyogaW5pdCBvdXIgTVBBIGZyYW1lIHB0ciAqLwotCW1lbWNweShtcGFfZnJhbWUtPnByaXZfZGF0YSwgcHJpdmF0ZV9kYXRhLCBwcml2YXRlX2RhdGFfbGVuKTsKKwlzdGFydF9idWZmID0gJmNtX25vZGUtPm1wYV9mcmFtZV9idWZbMF0gKyBzaXplb2Yoc3RydWN0IGlldGZfbXBhX3YyKTsKKwljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZSA9IHByaXZhdGVfZGF0YV9sZW47CiAKLQljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZSA9IG1wYV9mcmFtZV9zaXplOworCW1lbWNweShzdGFydF9idWZmLCBwcml2YXRlX2RhdGEsIHByaXZhdGVfZGF0YV9sZW4pOwogCiAJLyogc2VuZCBhIHN5biBhbmQgZ290byBzeW4gc2VudCBzdGF0ZSAqLwogCWNtX25vZGUtPnN0YXRlID0gTkVTX0NNX1NUQVRFX1NZTl9TRU5UOwpAQCAtMjEwNSwxOCArMjM0MywxOSBAQAogCWlmIChyZXQpIHsKIAkJLyogZXJyb3IgaW4gc2VuZGluZyB0aGUgc3luIGZyZWUgdXAgdGhlIGNtX25vZGUgc3RydWN0ICovCiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiQXBpIC0gY29ubmVjdCgpIEZBSUxFRDogZGVzdCAiCi0JCQkiYWRkcj0weCUwOFgsIHBvcnQ9MHglMDR4LCBjbV9ub2RlPSVwLCBjbV9pZCA9ICVwLlxuIiwKLQkJCWNtX25vZGUtPnJlbV9hZGRyLCBjbV9ub2RlLT5yZW1fcG9ydCwgY21fbm9kZSwKLQkJCWNtX25vZGUtPmNtX2lkKTsKKwkJCSAgImFkZHI9MHglMDhYLCBwb3J0PTB4JTA0eCwgY21fbm9kZT0lcCwgY21faWQgPSAlcC5cbiIsCisJCQkgIGNtX25vZGUtPnJlbV9hZGRyLCBjbV9ub2RlLT5yZW1fcG9ydCwgY21fbm9kZSwKKwkJCSAgY21fbm9kZS0+Y21faWQpOwogCQlyZW1fcmVmX2NtX25vZGUoY21fbm9kZS0+Y21fY29yZSwgY21fbm9kZSk7CiAJCWNtX25vZGUgPSBOVUxMOwogCX0KIAotCWlmIChjbV9ub2RlKQorCWlmIChjbV9ub2RlKSB7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiQXBpIC0gY29ubmVjdCgpOiBkZXN0IGFkZHI9MHglMDhYLCIKLQkJCSJwb3J0PTB4JTA0eCwgY21fbm9kZT0lcCwgY21faWQgPSAlcC5cbiIsCi0JCQljbV9ub2RlLT5yZW1fYWRkciwgY21fbm9kZS0+cmVtX3BvcnQsIGNtX25vZGUsCi0JCQljbV9ub2RlLT5jbV9pZCk7CisJCQkgICJwb3J0PTB4JTA0eCwgY21fbm9kZT0lcCwgY21faWQgPSAlcC5cbiIsCisJCQkgIGNtX25vZGUtPnJlbV9hZGRyLCBjbV9ub2RlLT5yZW1fcG9ydCwgY21fbm9kZSwKKwkJCSAgY21fbm9kZS0+Y21faWQpOworCX0KIAogCXJldHVybiBjbV9ub2RlOwogfQpAQCAtMjEyNiw4ICsyMzY1LDcgQEAKICAqIG1pbmlfY21fYWNjZXB0IC0gYWNjZXB0IGEgY29ubmVjdGlvbgogICogVGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQKICAqLwotc3RhdGljIGludCBtaW5pX2NtX2FjY2VwdChzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUsCi0Jc3RydWN0IGlldGZfbXBhX2ZyYW1lICptcGFfZnJhbWUsIHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSkKK3N0YXRpYyBpbnQgbWluaV9jbV9hY2NlcHQoc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTM2LDggKzIzNzQsNyBAQAogLyoqCiAgKiBtaW5pX2NtX3JlamVjdCAtIHJlamVjdCBhbmQgdGVhcmRvd24gYSBjb25uZWN0aW9uCiAgKi8KLXN0YXRpYyBpbnQgbWluaV9jbV9yZWplY3Qoc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCXN0cnVjdCBpZXRmX21wYV9mcmFtZSAqbXBhX2ZyYW1lLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCitzdGF0aWMgaW50IG1pbmlfY21fcmVqZWN0KHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwgc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKQogewogCWludCByZXQgPSAwOwogCWludCBlcnIgPSAwOwpAQCAtMjE0Nyw3ICsyMzg0LDcgQEAKIAlzdHJ1Y3QgbmVzX2NtX25vZGUgKmxvb3BiYWNrID0gY21fbm9kZS0+bG9vcGJhY2twYXJ0bmVyOwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICIlcyBjbV9ub2RlPSVwIHR5cGU9JWQgc3RhdGU9JWRcbiIsCi0JCV9fZnVuY19fLCBjbV9ub2RlLCBjbV9ub2RlLT50Y3BfY250eHQuY2xpZW50LCBjbV9ub2RlLT5zdGF0ZSk7CisJCSAgX19mdW5jX18sIGNtX25vZGUsIGNtX25vZGUtPnRjcF9jbnR4dC5jbGllbnQsIGNtX25vZGUtPnN0YXRlKTsKIAogCWlmIChjbV9ub2RlLT50Y3BfY250eHQuY2xpZW50KQogCQlyZXR1cm4gcmV0OwpAQCAtMjE2OCw4ICsyNDA1LDkgQEAKIAkJCQkJZXJyID0gc2VuZF9yZXNldChjbV9ub2RlLCBOVUxMKTsKIAkJCQkJaWYgKGVycikKIAkJCQkJCVdBUk5fT04oMSk7Ci0JCQkJfSBlbHNlCisJCQkJfSBlbHNlIHsKIAkJCQkJY21faWQtPmFkZF9yZWYoY21faWQpOworCQkJCX0KIAkJCX0KIAkJfQogCX0gZWxzZSB7CkBAIC0yMjQ0LDcgKzI0ODIsNyBAQAogCWNhc2UgTkVTX0NNX1NUQVRFX1RTQToKIAkJaWYgKGNtX25vZGUtPnNlbmRfZW50cnkpCiAJCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SIENsb3NlIGdvdCBjYWxsZWQgZnJvbSBTVEFURV9UU0EgIgotCQkJCSJzZW5kX2VudHJ5PSVwXG4iLCBjbV9ub2RlLT5zZW5kX2VudHJ5KTsKKwkJCSAgICAgICAic2VuZF9lbnRyeT0lcFxuIiwgY21fbm9kZS0+c2VuZF9lbnRyeSk7CiAJCXJldCA9IHJlbV9yZWZfY21fbm9kZShjbV9jb3JlLCBjbV9ub2RlKTsKIAkJYnJlYWs7CiAJfQpAQCAtMjI1Nyw3ICsyNDk1LDcgQEAKICAqIG5vZGUgc3RhdGUgbWFjaGluZQogICovCiBzdGF0aWMgaW50IG1pbmlfY21fcmVjdl9wa3Qoc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCXN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKKwkJCSAgICBzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlID0gTlVMTDsKIAlzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICpsaXN0ZW5lciA9IE5VTEw7CkBAIC0yMjY5LDkgKzI1MDcsOCBAQAogCiAJaWYgKCFza2IpCiAJCXJldHVybiAwOwotCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSB7CisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpCiAJCXJldHVybiAwOwotCX0KIAogCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7CiAJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKQEAgLTIyODksOCArMjUyNiw4IEBACiAKIAlkbyB7CiAJCWNtX25vZGUgPSBmaW5kX25vZGUoY21fY29yZSwKLQkJCW5mby5yZW1fcG9ydCwgbmZvLnJlbV9hZGRyLAotCQkJbmZvLmxvY19wb3J0LCBuZm8ubG9jX2FkZHIpOworCQkJCSAgICBuZm8ucmVtX3BvcnQsIG5mby5yZW1fYWRkciwKKwkJCQkgICAgbmZvLmxvY19wb3J0LCBuZm8ubG9jX2FkZHIpOwogCiAJCWlmICghY21fbm9kZSkgewogCQkJLyogT25seSB0eXBlIG9mIHBhY2tldCBhY2NlcHRlZCBhcmUgZm9yICovCkBAIC0yMzAwLDggKzI1MzcsOCBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJbGlzdGVuZXIgPSBmaW5kX2xpc3RlbmVyKGNtX2NvcmUsIG5mby5sb2NfYWRkciwKLQkJCQluZm8ubG9jX3BvcnQsCi0JCQkJTkVTX0NNX0xJU1RFTkVSX0FDVElWRV9TVEFURSk7CisJCQkJCQkgbmZvLmxvY19wb3J0LAorCQkJCQkJIE5FU19DTV9MSVNURU5FUl9BQ1RJVkVfU1RBVEUpOwogCQkJaWYgKCFsaXN0ZW5lcikgewogCQkJCW5mby5jbV9pZCA9IE5VTEw7CiAJCQkJbmZvLmNvbm5fdHlwZSA9IDA7CkBAIC0yMzEyLDEwICsyNTQ5LDEwIEBACiAJCQluZm8uY21faWQgPSBsaXN0ZW5lci0+Y21faWQ7CiAJCQluZm8uY29ubl90eXBlID0gbGlzdGVuZXItPmNvbm5fdHlwZTsKIAkJCWNtX25vZGUgPSBtYWtlX2NtX25vZGUoY21fY29yZSwgbmVzdm5pYywgJm5mbywKLQkJCQlsaXN0ZW5lcik7CisJCQkJCSAgICAgICBsaXN0ZW5lcik7CiAJCQlpZiAoIWNtX25vZGUpIHsKIAkJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlVuYWJsZSB0byBhbGxvY2F0ZSAiCi0JCQkJCSJub2RlXG4iKTsKKwkJCQkJICAibm9kZVxuIik7CiAJCQkJY21fcGFja2V0c19kcm9wcGVkKys7CiAJCQkJYXRvbWljX2RlYygmbGlzdGVuZXItPnJlZl9jb3VudCk7CiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKQEAgLTIzMzEsOSArMjU2OCwxMyBAQAogCQkJfQogCQkJYWRkX3JlZl9jbV9ub2RlKGNtX25vZGUpOwogCQl9IGVsc2UgaWYgKGNtX25vZGUtPnN0YXRlID09IE5FU19DTV9TVEFURV9UU0EpIHsKLQkJCXJlbV9yZWZfY21fbm9kZShjbV9jb3JlLCBjbV9ub2RlKTsKLQkJCWF0b21pY19pbmMoJmNtX2FjY2VsX2Ryb3BwZWRfcGt0cyk7Ci0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJaWYgKGNtX25vZGUtPm5lc3FwLT5wYXVfbW9kZSkKKwkJCQluZXNfcXVldWVfbWd0X3NrYnMoc2tiLCBuZXN2bmljLCBjbV9ub2RlLT5uZXNxcCk7CisJCQllbHNlIHsKKwkJCQlyZW1fcmVmX2NtX25vZGUoY21fY29yZSwgY21fbm9kZSk7CisJCQkJYXRvbWljX2luYygmY21fYWNjZWxfZHJvcHBlZF9wa3RzKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJfQogCQkJYnJlYWs7CiAJCX0KIAkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CkBAIC0yMzYzLDcgKzI2MDQsNyBAQAogCWluaXRfdGltZXIoJmNtX2NvcmUtPnRjcF90aW1lcik7CiAJY21fY29yZS0+dGNwX3RpbWVyLmZ1bmN0aW9uID0gbmVzX2NtX3RpbWVyX3RpY2s7CiAKLQljbV9jb3JlLT5tdHUgICA9IE5FU19DTV9ERUZBVUxUX01UVTsKKwljbV9jb3JlLT5tdHUgPSBORVNfQ01fREVGQVVMVF9NVFU7CiAJY21fY29yZS0+c3RhdGUgPSBORVNfQ01fU1RBVEVfSU5JVEVEOwogCWNtX2NvcmUtPmZyZWVfdHhfcGt0X21heCA9IE5FU19DTV9ERUZBVUxUX0ZSRUVfUEtUUzsKIApAQCAtMjQwMSw5ICsyNjQyLDggQEAKIAogCWJhcnJpZXIoKTsKIAotCWlmICh0aW1lcl9wZW5kaW5nKCZjbV9jb3JlLT50Y3BfdGltZXIpKSB7CisJaWYgKHRpbWVyX3BlbmRpbmcoJmNtX2NvcmUtPnRjcF90aW1lcikpCiAJCWRlbF90aW1lcigmY21fY29yZS0+dGNwX3RpbWVyKTsKLQl9CiAKIAlkZXN0cm95X3dvcmtxdWV1ZShjbV9jb3JlLT5ldmVudF93cSk7CiAJZGVzdHJveV93b3JrcXVldWUoY21fY29yZS0+ZGlzY29ubl93cSk7CkBAIC0yNDU4LDggKzI2OTgsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5taXNjIHw9IGNwdV90b19sZTMyKE5FU19RUENPTlRFWFRfTUlTQ19JUFY0IHwKLQkJCU5FU19RUENPTlRFWFRfTUlTQ19OT19OQUdMRSB8IE5FU19RUENPTlRFWFRfTUlTQ19ET19OT1RfRlJBRyB8Ci0JCQlORVNfUVBDT05URVhUX01JU0NfRFJPUyk7CisJCQkJCQkgIE5FU19RUENPTlRFWFRfTUlTQ19OT19OQUdMRSB8IE5FU19RUENPTlRFWFRfTUlTQ19ET19OT1RfRlJBRyB8CisJCQkJCQkgIE5FU19RUENPTlRFWFRfTUlTQ19EUk9TKTsKIAogCWlmIChjbV9ub2RlLT50Y3BfY250eHQuc25kX3dzY2FsZSB8fCBjbV9ub2RlLT50Y3BfY250eHQucmN2X3dzY2FsZSkKIAkJbmVzcXAtPm5lc3FwX2NvbnRleHQtPm1pc2MgfD0gY3B1X3RvX2xlMzIoTkVTX1FQQ09OVEVYVF9NSVNDX1dTQ0FMRSk7CkBAIC0yNDY5LDE1ICsyNzA5LDE1IEBACiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPm1zcyB8PSBjcHVfdG9fbGUzMigoKHUzMiljbV9ub2RlLT50Y3BfY250eHQubXNzKSA8PCAxNik7CiAKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+dGNwX3N0YXRlX2Zsb3dfbGFiZWwgfD0gY3B1X3RvX2xlMzIoCi0JCQkodTMyKU5FU19RUENPTlRFWFRfVENQU1RBVEVfRVNUIDw8IE5FU19RUENPTlRFWFRfVENQRkxPV19UQ1BfU1RBVEVfU0hJRlQpOworCQkodTMyKU5FU19RUENPTlRFWFRfVENQU1RBVEVfRVNUIDw8IE5FU19RUENPTlRFWFRfVENQRkxPV19UQ1BfU1RBVEVfU0hJRlQpOwogCiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnBkX2luZGV4X3dzY2FsZSB8PSBjcHVfdG9fbGUzMigKLQkJCShjbV9ub2RlLT50Y3BfY250eHQuc25kX3dzY2FsZSA8PCBORVNfUVBDT05URVhUX1BEV1NDQUxFX1NORF9XU0NBTEVfU0hJRlQpICYKLQkJCU5FU19RUENPTlRFWFRfUERXU0NBTEVfU05EX1dTQ0FMRV9NQVNLKTsKKwkJKGNtX25vZGUtPnRjcF9jbnR4dC5zbmRfd3NjYWxlIDw8IE5FU19RUENPTlRFWFRfUERXU0NBTEVfU05EX1dTQ0FMRV9TSElGVCkgJgorCQlORVNfUVBDT05URVhUX1BEV1NDQUxFX1NORF9XU0NBTEVfTUFTSyk7CiAKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+cGRfaW5kZXhfd3NjYWxlIHw9IGNwdV90b19sZTMyKAotCQkJKGNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfd3NjYWxlIDw8IE5FU19RUENPTlRFWFRfUERXU0NBTEVfUkNWX1dTQ0FMRV9TSElGVCkgJgotCQkJTkVTX1FQQ09OVEVYVF9QRFdTQ0FMRV9SQ1ZfV1NDQUxFX01BU0spOworCQkoY21fbm9kZS0+dGNwX2NudHh0LnJjdl93c2NhbGUgPDwgTkVTX1FQQ09OVEVYVF9QRFdTQ0FMRV9SQ1ZfV1NDQUxFX1NISUZUKSAmCisJCU5FU19RUENPTlRFWFRfUERXU0NBTEVfUkNWX1dTQ0FMRV9NQVNLKTsKIAogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5rZWVwYWxpdmUgPSBjcHVfdG9fbGUzMigweDgwKTsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+dHNfcmVjZW50ID0gMDsKQEAgLTI0ODYsMjQgKzI3MjYsMjQgQEAKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+c25kX3duZCA9IGNwdV90b19sZTMyKGNtX25vZGUtPnRjcF9jbnR4dC5zbmRfd25kKTsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+cmN2X254dCA9IGNwdV90b19sZTMyKGNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfbnh0KTsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+cmN2X3duZCA9IGNwdV90b19sZTMyKGNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfd25kIDw8Ci0JCQljbV9ub2RlLT50Y3BfY250eHQucmN2X3dzY2FsZSk7CisJCQkJCQkgICAgY21fbm9kZS0+dGNwX2NudHh0LnJjdl93c2NhbGUpOwogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5zbmRfbWF4ID0gY3B1X3RvX2xlMzIoY21fbm9kZS0+dGNwX2NudHh0LmxvY19zZXFfbnVtKTsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+c25kX3VuYSA9IGNwdV90b19sZTMyKGNtX25vZGUtPnRjcF9jbnR4dC5sb2Nfc2VxX251bSk7CiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnNydHQgPSAwOwogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5ydHR2YXIgPSBjcHVfdG9fbGUzMigweDYpOwogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5zc3RocmVzaCA9IGNwdV90b19sZTMyKDB4M0ZGRkMwMDApOwotCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5jd25kID0gY3B1X3RvX2xlMzIoMipjbV9ub2RlLT50Y3BfY250eHQubXNzKTsKKwluZXNxcC0+bmVzcXBfY29udGV4dC0+Y3duZCA9IGNwdV90b19sZTMyKDIgKiBjbV9ub2RlLT50Y3BfY250eHQubXNzKTsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+c25kX3dsMSA9IGNwdV90b19sZTMyKGNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfbnh0KTsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+c25kX3dsMiA9IGNwdV90b19sZTMyKGNtX25vZGUtPnRjcF9jbnR4dC5sb2Nfc2VxX251bSk7CiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPm1heF9zbmRfd25kID0gY3B1X3RvX2xlMzIoY21fbm9kZS0+dGNwX2NudHh0Lm1heF9zbmRfd25kKTsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUVAldTogcmN2X254dCA9IDB4JTA4WCwgc25kX254dCA9IDB4JTA4WCwiCi0JCQkiIFNldHRpbmcgTVNTIHRvICV1LCBQRFdzY2FsZSA9IDB4JTA4WCwgcmN2X3duZCA9ICV1LCBjb250ZXh0IG1pc2MgPSAweCUwOFguXG4iLAotCQkJbmVzcXAtPmh3cXAucXBfaWQsIGxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5yY3Zfbnh0KSwKLQkJCWxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5zbmRfbnh0KSwKLQkJCWNtX25vZGUtPnRjcF9jbnR4dC5tc3MsIGxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5wZF9pbmRleF93c2NhbGUpLAotCQkJbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPnJjdl93bmQpLAotCQkJbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPm1pc2MpKTsKKwkJICAiIFNldHRpbmcgTVNTIHRvICV1LCBQRFdzY2FsZSA9IDB4JTA4WCwgcmN2X3duZCA9ICV1LCBjb250ZXh0IG1pc2MgPSAweCUwOFguXG4iLAorCQkgIG5lc3FwLT5od3FwLnFwX2lkLCBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+cmN2X254dCksCisJCSAgbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPnNuZF9ueHQpLAorCQkgIGNtX25vZGUtPnRjcF9jbnR4dC5tc3MsIGxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5wZF9pbmRleF93c2NhbGUpLAorCQkgIGxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5yY3Zfd25kKSwKKwkJICBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+bWlzYykpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiICBzbmRfd25kICA9IDB4JTA4WC5cbiIsIGxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5zbmRfd25kKSk7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICIgIHNuZF9jd25kID0gMHglMDhYLlxuIiwgbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPmN3bmQpKTsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIiAgbWF4X3N3bmQgPSAweCUwOFguXG4iLCBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+bWF4X3NuZF93bmQpKTsKQEAgLTI1MjQsNyArMjc2NCw3IEBACiAKIAl3b3JrID0ga3phbGxvYyhzaXplb2YgKndvcmssIEdGUF9BVE9NSUMpOwogCWlmICghd29yaykKLQkJcmV0dXJuIC1FTk9NRU07IC8qIFRpbWVyIHdpbGwgY2xlYW4gdXAgKi8KKwkJcmV0dXJuIC1FTk9NRU07ICAvKiBUaW1lciB3aWxsIGNsZWFuIHVwICovCiAKIAluZXNfYWRkX3JlZigmbmVzcXAtPmlicXApOwogCXdvcmstPm5lc3FwID0gbmVzcXA7CkBAIC0yNTQ0LDcgKzI3ODQsNyBAQAogCiAJa2ZyZWUoZHdvcmspOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAicHJvY2Vzc2luZyBBRVFFIGlkIDB4JTA0WCBmb3IgUVAldS5cbiIsCi0JCQluZXNxcC0+bGFzdF9hZXEsIG5lc3FwLT5od3FwLnFwX2lkKTsKKwkJICBuZXNxcC0+bGFzdF9hZXEsIG5lc3FwLT5od3FwLnFwX2lkKTsKIAluZXNfY21fZGlzY29ubl90cnVlKG5lc3FwKTsKIAluZXNfcmVtX3JlZigmbmVzcXAtPmlicXApOwogfQpAQCAtMjU4MCw3ICsyODIwLDcgQEAKIAkvKiBtYWtlIHN1cmUgd2UgaGF2ZW50IGFscmVhZHkgY2xvc2VkIHRoaXMgY29ubmVjdGlvbiAqLwogCWlmICghY21faWQpIHsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJRUCV1IGRpc2Nvbm5lY3Rfd29ya2VyIGNtaWQgaXMgTlVMTFxuIiwKLQkJCQluZXNxcC0+aHdxcC5xcF9pZCk7CisJCQkgIG5lc3FwLT5od3FwLnFwX2lkKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTI1ODksNyArMjgyOSw3IEBACiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJEaXNjb25uZWN0aW5nIFFQJXVcbiIsIG5lc3FwLT5od3FwLnFwX2lkKTsKIAogCW9yaWdpbmFsX2h3X3RjcF9zdGF0ZSA9IG5lc3FwLT5od190Y3Bfc3RhdGU7Ci0Jb3JpZ2luYWxfaWJxcF9zdGF0ZSAgID0gbmVzcXAtPmlicXBfc3RhdGU7CisJb3JpZ2luYWxfaWJxcF9zdGF0ZSA9IG5lc3FwLT5pYnFwX3N0YXRlOwogCWxhc3RfYWUgPSBuZXNxcC0+bGFzdF9hZXE7CiAKIAlpZiAobmVzcXAtPnRlcm1fZmxhZ3MpIHsKQEAgLTI2NDcsMTYgKzI4ODcsMTYgQEAKIAkJCWNtX2V2ZW50LnByaXZhdGVfZGF0YV9sZW4gPSAwOwogCiAJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIkdlbmVyYXRpbmcgYSBDTSBEaXNjb25uZWN0IEV2ZW50IgotCQkJCSIgZm9yICBRUCV1LCBTUSBIZWFkID0gJXUsIFNRIFRhaWwgPSAldS4gIgotCQkJCSJjbV9pZCA9ICVwLCByZWZjb3VudCA9ICV1LlxuIiwKLQkJCQluZXNxcC0+aHdxcC5xcF9pZCwgbmVzcXAtPmh3cXAuc3FfaGVhZCwKLQkJCQluZXNxcC0+aHdxcC5zcV90YWlsLCBjbV9pZCwKLQkJCQlhdG9taWNfcmVhZCgmbmVzcXAtPnJlZmNvdW50KSk7CisJCQkJICAiIGZvciAgUVAldSwgU1EgSGVhZCA9ICV1LCBTUSBUYWlsID0gJXUuICIKKwkJCQkgICJjbV9pZCA9ICVwLCByZWZjb3VudCA9ICV1LlxuIiwKKwkJCQkgIG5lc3FwLT5od3FwLnFwX2lkLCBuZXNxcC0+aHdxcC5zcV9oZWFkLAorCQkJCSAgbmVzcXAtPmh3cXAuc3FfdGFpbCwgY21faWQsCisJCQkJICBhdG9taWNfcmVhZCgmbmVzcXAtPnJlZmNvdW50KSk7CiAKIAkJCXJldCA9IGNtX2lkLT5ldmVudF9oYW5kbGVyKGNtX2lkLCAmY21fZXZlbnQpOwogCQkJaWYgKHJldCkKIAkJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIk9GQSBDTSBldmVudF9oYW5kbGVyICIKLQkJCQkJInJldHVybmVkLCByZXQ9JWRcbiIsIHJldCk7CisJCQkJCSAgInJldHVybmVkLCByZXQ9JWRcbiIsIHJldCk7CiAJCX0KIAogCQlpZiAoaXNzdWVfY2xvc2UpIHsKQEAgLTI2NzQsOSArMjkxNCw4IEBACiAJCQljbV9ldmVudC5wcml2YXRlX2RhdGFfbGVuID0gMDsKIAogCQkJcmV0ID0gY21faWQtPmV2ZW50X2hhbmRsZXIoY21faWQsICZjbV9ldmVudCk7Ci0JCQlpZiAocmV0KSB7CisJCQlpZiAocmV0KQogCQkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiT0ZBIENNIGV2ZW50X2hhbmRsZXIgcmV0dXJuZWQsIHJldD0lZFxuIiwgcmV0KTsKLQkJCX0KIAogCQkJY21faWQtPnJlbV9yZWYoY21faWQpOwogCQl9CkBAIC0yNzE2LDggKzI5NTUsOCBAQAogCQkJaWYgKG5lc3FwLT5sc21tX21yKQogCQkJCW5lc2liZGV2LT5pYmRldi5kZXJlZ19tcihuZXNxcC0+bHNtbV9tcik7CiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5lc2Rldi0+cGNpZGV2LAotCQkJCQluZXNxcC0+cHJpdmF0ZV9kYXRhX2xlbitzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSwKLQkJCQkJbmVzcXAtPmlldGZfZnJhbWUsIG5lc3FwLT5pZXRmX2ZyYW1lX3BiYXNlKTsKKwkJCQkJICAgIG5lc3FwLT5wcml2YXRlX2RhdGFfbGVuICsgbmVzcXAtPmlldGZfZnJhbWVfc2l6ZSwKKwkJCQkJICAgIG5lc3FwLT5pZXRmX2ZyYW1lLCBuZXNxcC0+aWV0Zl9mcmFtZV9wYmFzZSk7CiAJCX0KIAl9CiAKQEAgLTI3NTYsNiArMjk5NSwxMiBAQAogCXN0cnVjdCBpYl9waHlzX2J1ZiBpYnBoeXNidWY7CiAJc3RydWN0IG5lc19wZCAqbmVzcGQ7CiAJdTY0IHRhZ2dlZF9vZmZzZXQ7CisJdTggbXBhX2ZyYW1lX29mZnNldCA9IDA7CisJc3RydWN0IGlldGZfbXBhX3YyICptcGFfdjJfZnJhbWU7CisJdTggc3RhcnRfYWRkciA9IDA7CisJdTggKnN0YXJ0X3B0ciA9ICZzdGFydF9hZGRyOworCXU4ICoqc3RhcnRfYnVmZiA9ICZzdGFydF9wdHI7CisJdTE2IGJ1ZmZfbGVuID0gMDsKIAogCWlicXAgPSBuZXNfZ2V0X3FwKGNtX2lkLT5kZXZpY2UsIGNvbm5fcGFyYW0tPnFwbik7CiAJaWYgKCFpYnFwKQpAQCAtMjc5Niw1MyArMzA0MSw0OSBAQAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAibmV0ZGV2IHJlZmNudCA9ICV1LlxuIiwKIAkJCW5ldGRldl9yZWZjbnRfcmVhZChuZXN2bmljLT5uZXRkZXYpKTsKIAorCW5lc3FwLT5pZXRmX2ZyYW1lX3NpemUgPSBzaXplb2Yoc3RydWN0IGlldGZfbXBhX3YyKTsKIAkvKiBhbGxvY2F0ZSB0aGUgaWV0ZiBmcmFtZSBhbmQgc3BhY2UgZm9yIHByaXZhdGUgZGF0YSAqLwogCW5lc3FwLT5pZXRmX2ZyYW1lID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobmVzZGV2LT5wY2lkZXYsCi0JCXNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpICsgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbiwKLQkJJm5lc3FwLT5pZXRmX2ZyYW1lX3BiYXNlKTsKKwkJCQkJCSBuZXNxcC0+aWV0Zl9mcmFtZV9zaXplICsgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbiwKKwkJCQkJCSAmbmVzcXAtPmlldGZfZnJhbWVfcGJhc2UpOwogCiAJaWYgKCFuZXNxcC0+aWV0Zl9mcmFtZSkgewotCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHByaXZhdGUgIgotCQkJImRhdGFcbiIpOworCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHByaXZhdGUgZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwltcGFfdjJfZnJhbWUgPSAoc3RydWN0IGlldGZfbXBhX3YyICopbmVzcXAtPmlldGZfZnJhbWU7CiAKKwlpZiAoY21fbm9kZS0+bXBhX2ZyYW1lX3JldiA9PSBJRVRGX01QQV9WMSkKKwkJbXBhX2ZyYW1lX29mZnNldCA9IDQ7CiAKLQkvKiBzZXR1cCB0aGUgTVBBIGZyYW1lICovCisJbWVtY3B5KG1wYV92Ml9mcmFtZS0+cHJpdl9kYXRhLCBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGEsCisJICAgICAgIGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4pOworCisJY21fYnVpbGRfbXBhX2ZyYW1lKGNtX25vZGUsIHN0YXJ0X2J1ZmYsICZidWZmX2xlbiwgbmVzcXAtPmlldGZfZnJhbWUsIE1QQV9LRVlfUkVQTFkpOwogCW5lc3FwLT5wcml2YXRlX2RhdGFfbGVuID0gY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbjsKLQltZW1jcHkobmVzcXAtPmlldGZfZnJhbWUtPmtleSwgSUVGVF9NUEFfS0VZX1JFUCwgSUVURl9NUEFfS0VZX1NJWkUpOwotCi0JbWVtY3B5KG5lc3FwLT5pZXRmX2ZyYW1lLT5wcml2X2RhdGEsIGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YSwKLQkJCWNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4pOwotCi0JbmVzcXAtPmlldGZfZnJhbWUtPnByaXZfZGF0YV9sZW4gPQotCQljcHVfdG9fYmUxNihjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKLQluZXNxcC0+aWV0Zl9mcmFtZS0+cmV2ID0gbXBhX3ZlcnNpb247Ci0JbmVzcXAtPmlldGZfZnJhbWUtPmZsYWdzID0gSUVURl9NUEFfRkxBR1NfQ1JDOwogCiAJLyogc2V0dXAgb3VyIGZpcnN0IG91dGdvaW5nIGlXYXJwIHNlbmQgV1FFICh0aGUgSUVURiBmcmFtZSByZXNwb25zZSkgKi8KIAl3cWUgPSAmbmVzcXAtPmh3cXAuc3FfdmJhc2VbMF07CiAKIAlpZiAoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciAhPQotCQkJY21faWQtPmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyKSB7CisJICAgIGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkcikgewogCQl1NjR0ZW1wID0gKHVuc2lnbmVkIGxvbmcpbmVzcXA7CiAJCW5lc2liZGV2ID0gbmVzdm5pYy0+bmVzaWJkZXY7CiAJCW5lc3BkID0gbmVzcXAtPm5lc3BkOwotCQlpYnBoeXNidWYuYWRkciA9IG5lc3FwLT5pZXRmX2ZyYW1lX3BiYXNlOwotCQlpYnBoeXNidWYuc2l6ZSA9IGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4gKwotCQkJCQlzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKTsKLQkJdGFnZ2VkX29mZnNldCA9ICh1NjQpKHVuc2lnbmVkIGxvbmcpbmVzcXAtPmlldGZfZnJhbWU7CisJCWlicGh5c2J1Zi5hZGRyID0gbmVzcXAtPmlldGZfZnJhbWVfcGJhc2UgKyBtcGFfZnJhbWVfb2Zmc2V0OworCQlpYnBoeXNidWYuc2l6ZSA9IGJ1ZmZfbGVuOworCQl0YWdnZWRfb2Zmc2V0ID0gKHU2NCkodW5zaWduZWQgbG9uZykqc3RhcnRfYnVmZjsKIAkJaWJtciA9IG5lc2liZGV2LT5pYmRldi5yZWdfcGh5c19tcigoc3RydWN0IGliX3BkICopbmVzcGQsCi0JCQkJCQkmaWJwaHlzYnVmLCAxLAotCQkJCQkJSUJfQUNDRVNTX0xPQ0FMX1dSSVRFLAotCQkJCQkJJnRhZ2dlZF9vZmZzZXQpOworCQkJCQkJICAgJmlicGh5c2J1ZiwgMSwKKwkJCQkJCSAgIElCX0FDQ0VTU19MT0NBTF9XUklURSwKKwkJCQkJCSAgICZ0YWdnZWRfb2Zmc2V0KTsKIAkJaWYgKCFpYm1yKSB7CiAJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlVuYWJsZSB0byByZWdpc3RlciBtZW1vcnkgcmVnaW9uIgotCQkJCQkiZm9yIGxTTU0gZm9yIGNtX25vZGUgPSAlcCBcbiIsCi0JCQkJCWNtX25vZGUpOworCQkJCSAgImZvciBsU01NIGZvciBjbV9ub2RlID0gJXAgXG4iLAorCQkJCSAgY21fbm9kZSk7CiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5lc2Rldi0+cGNpZGV2LAotCQkJCW5lc3FwLT5wcml2YXRlX2RhdGFfbGVuK3NpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpLAotCQkJCW5lc3FwLT5pZXRmX2ZyYW1lLCBuZXNxcC0+aWV0Zl9mcmFtZV9wYmFzZSk7CisJCQkJCSAgICBuZXNxcC0+cHJpdmF0ZV9kYXRhX2xlbiArIG5lc3FwLT5pZXRmX2ZyYW1lX3NpemUsCisJCQkJCSAgICBuZXNxcC0+aWV0Zl9mcmFtZSwgbmVzcXAtPmlldGZfZnJhbWVfcGJhc2UpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtMjg1MCwyMiArMzA5MSwyMCBAQAogCQlpYm1yLT5kZXZpY2UgPSBuZXNwZC0+aWJwZC5kZXZpY2U7CiAJCW5lc3FwLT5sc21tX21yID0gaWJtcjsKIAotCQl1NjR0ZW1wIHw9IE5FU19TV19DT05URVhUX0FMSUdOPj4xOworCQl1NjR0ZW1wIHw9IE5FU19TV19DT05URVhUX0FMSUdOID4+IDE7CiAJCXNldF93cWVfNjRiaXRfdmFsdWUod3FlLT53cWVfd29yZHMsCi0JCQlORVNfSVdBUlBfU1FfV1FFX0NPTVBfQ1RYX0xPV19JRFgsCi0JCQl1NjR0ZW1wKTsKKwkJCQkgICAgTkVTX0lXQVJQX1NRX1dRRV9DT01QX0NUWF9MT1dfSURYLAorCQkJCSAgICB1NjR0ZW1wKTsKIAkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9NSVNDX0lEWF0gPQogCQkJY3B1X3RvX2xlMzIoTkVTX0lXQVJQX1NRX1dRRV9TVFJFQU1JTkcgfAotCQkJTkVTX0lXQVJQX1NRX1dRRV9XUlBEVSk7CisJCQkJICAgIE5FU19JV0FSUF9TUV9XUUVfV1JQRFUpOwogCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX1RPVEFMX1BBWUxPQURfSURYXSA9Ci0JCQljcHVfdG9fbGUzMihjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuICsKLQkJCXNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpKTsKKwkJCWNwdV90b19sZTMyKGJ1ZmZfbGVuKTsKIAkJc2V0X3dxZV82NGJpdF92YWx1ZSh3cWUtPndxZV93b3JkcywKLQkJCQkJTkVTX0lXQVJQX1NRX1dRRV9GUkFHMF9MT1dfSURYLAotCQkJCQkodTY0KSh1bnNpZ25lZCBsb25nKW5lc3FwLT5pZXRmX2ZyYW1lKTsKKwkJCQkgICAgTkVTX0lXQVJQX1NRX1dRRV9GUkFHMF9MT1dfSURYLAorCQkJCSAgICAodTY0KSh1bnNpZ25lZCBsb25nKSgqc3RhcnRfYnVmZikpOwogCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX0xFTkdUSDBfSURYXSA9Ci0JCQljcHVfdG9fbGUzMihjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuICsKLQkJCXNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpKTsKKwkJCWNwdV90b19sZTMyKGJ1ZmZfbGVuKTsKIAkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9TVEFHMF9JRFhdID0gaWJtci0+bGtleTsKIAkJaWYgKG5lc3FwLT5zcV9rbWFwcGVkKSB7CiAJCQluZXNxcC0+c3Ffa21hcHBlZCA9IDA7CkBAIC0yODc0LDcgKzMxMTMsNyBAQAogCiAJCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5pcmRfb3JkX3NpemVzIHw9CiAJCQljcHVfdG9fbGUzMihORVNfUVBDT05URVhUX09SRElSRF9MU01NX1BSRVNFTlQgfAotCQkJTkVTX1FQQ09OVEVYVF9PUkRJUkRfV1JQRFUpOworCQkJCSAgICBORVNfUVBDT05URVhUX09SRElSRF9XUlBEVSk7CiAJfSBlbHNlIHsKIAkJbmVzcXAtPm5lc3FwX2NvbnRleHQtPmlyZF9vcmRfc2l6ZXMgfD0KIAkJCWNwdV90b19sZTMyKE5FU19RUENPTlRFWFRfT1JESVJEX1dSUERVKTsKQEAgLTI4ODgsMTEgKzMxMjcsMTEgQEAKIAogCS8qICBuZXNxcC0+Y21fbm9kZSA9ICh2b2lkICopY21faWQtPnByb3ZpZGVyX2RhdGE7ICovCiAJY21faWQtPnByb3ZpZGVyX2RhdGEgPSBuZXNxcDsKLQluZXNxcC0+YWN0aXZlX2Nvbm4gICA9IDA7CisJbmVzcXAtPmFjdGl2ZV9jb25uID0gMDsKIAogCWlmIChjbV9ub2RlLT5zdGF0ZSA9PSBORVNfQ01fU1RBVEVfVFNBKQogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIkFscmVhZHkgc3RhdGUgPSBUU0EgZm9yIGNtX25vZGU9JXBcbiIsCi0JCQljbV9ub2RlKTsKKwkJCSAgY21fbm9kZSk7CiAKIAluZXNfY21faW5pdF90c2FfY29ubihuZXNxcCwgY21fbm9kZSk7CiAKQEAgLTI5MDksMTMgKzMxNDgsMTMgQEAKIAkJCWNwdV90b19sZTMyKG50b2hsKGNtX2lkLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpKTsKIAogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5taXNjMiB8PSBjcHVfdG9fbGUzMigKLQkJCSh1MzIpUENJX0ZVTkMobmVzZGV2LT5wY2lkZXYtPmRldmZuKSA8PAotCQkJTkVTX1FQQ09OVEVYVF9NSVNDMl9TUkNfSVBfU0hJRlQpOworCQkodTMyKVBDSV9GVU5DKG5lc2Rldi0+cGNpZGV2LT5kZXZmbikgPDwKKwkJTkVTX1FQQ09OVEVYVF9NSVNDMl9TUkNfSVBfU0hJRlQpOwogCiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPmFycF9pbmRleF92bGFuIHw9CiAJCWNwdV90b19sZTMyKG5lc19hcnBfdGFibGUobmVzZGV2LAotCQkJbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPmlwMCksIE5VTEwsCi0JCQlORVNfQVJQX1JFU09MVkUpIDw8IDE2KTsKKwkJCQkJICBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+aXAwKSwgTlVMTCwKKwkJCQkJICBORVNfQVJQX1JFU09MVkUpIDw8IDE2KTsKIAogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT50c192YWxfZGVsdGEgPSBjcHVfdG9fbGUzMigKIAkJamlmZmllcyAtIG5lc19yZWFkX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX1RDUF9OT1cpKTsKQEAgLTI5NDEsNyArMzE4MCw3IEBACiAJY3JjX3ZhbHVlID0gZ2V0X2NyY192YWx1ZSgmbmVzX3F1YWQpOwogCW5lc3FwLT5odGVfaW5kZXggPSBjcHVfdG9fYmUzMihjcmNfdmFsdWUgXiAweGZmZmZmZmZmKTsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIkhURSBJbmRleCA9IDB4JTA4WCwgQ1JDID0gMHglMDhYXG4iLAotCQluZXNxcC0+aHRlX2luZGV4LCBuZXNxcC0+aHRlX2luZGV4ICYgYWRhcHRlci0+aHRlX2luZGV4X21hc2spOworCQkgIG5lc3FwLT5odGVfaW5kZXgsIG5lc3FwLT5odGVfaW5kZXggJiBhZGFwdGVyLT5odGVfaW5kZXhfbWFzayk7CiAKIAluZXNxcC0+aHRlX2luZGV4ICY9IGFkYXB0ZXItPmh0ZV9pbmRleF9tYXNrOwogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5odGVfaW5kZXggPSBjcHVfdG9fbGUzMihuZXNxcC0+aHRlX2luZGV4KTsKQEAgLTI5NDksMTcgKzMxODgsMTUgQEAKIAljbV9ub2RlLT5jbV9jb3JlLT5hcGktPmFjY2VsZXJhdGVkKGNtX25vZGUtPmNtX2NvcmUsIGNtX25vZGUpOwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJRUCV1LCBEZXN0aW5hdGlvbiBJUCA9IDB4JTA4WDoweCUwNFgsIGxvY2FsID0gIgotCQkJIjB4JTA4WDoweCUwNFgsIHJjdl9ueHQ9MHglMDhYLCBzbmRfbnh0PTB4JTA4WCwgbXBhICsgIgotCQkJInByaXZhdGUgZGF0YSBsZW5ndGg9JXp1LlxuIiwgbmVzcXAtPmh3cXAucXBfaWQsCi0JCQludG9obChjbV9pZC0+cmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKSwKLQkJCW50b2hzKGNtX2lkLT5yZW1vdGVfYWRkci5zaW5fcG9ydCksCi0JCQludG9obChjbV9pZC0+bG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIpLAotCQkJbnRvaHMoY21faWQtPmxvY2FsX2FkZHIuc2luX3BvcnQpLAotCQkJbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPnJjdl9ueHQpLAotCQkJbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPnNuZF9ueHQpLAotCQkJY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbiArCi0JCQlzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSk7Ci0KKwkJICAiMHglMDhYOjB4JTA0WCwgcmN2X254dD0weCUwOFgsIHNuZF9ueHQ9MHglMDhYLCBtcGEgKyAiCisJCSAgInByaXZhdGUgZGF0YSBsZW5ndGg9JXUuXG4iLCBuZXNxcC0+aHdxcC5xcF9pZCwKKwkJICBudG9obChjbV9pZC0+cmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKSwKKwkJICBudG9ocyhjbV9pZC0+cmVtb3RlX2FkZHIuc2luX3BvcnQpLAorCQkgIG50b2hsKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCSAgbnRvaHMoY21faWQtPmxvY2FsX2FkZHIuc2luX3BvcnQpLAorCQkgIGxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5yY3Zfbnh0KSwKKwkJICBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+c25kX254dCksCisJCSAgYnVmZl9sZW4pOwogCiAJLyogbm90aWZ5IE9GIGxheWVyIHRoYXQgYWNjZXB0IGV2ZW50IHdhcyBzdWNjZXNzZnVsICovCiAJY21faWQtPmFkZF9yZWYoY21faWQpOwpAQCAtMjk4MCwxMiArMzIxNywxMiBAQAogCQkJbmVzcXAtPnByaXZhdGVfZGF0YV9sZW47CiAJCS8qIGNvcHkgZW50aXJlIE1QQSBmcmFtZSB0byBvdXIgY21fbm9kZSdzIGZyYW1lICovCiAJCW1lbWNweShjbV9ub2RlLT5sb29wYmFja3BhcnRuZXItPm1wYV9mcmFtZV9idWYsCi0JCQluZXNxcC0+aWV0Zl9mcmFtZS0+cHJpdl9kYXRhLCBuZXNxcC0+cHJpdmF0ZV9kYXRhX2xlbik7CisJCSAgICAgICBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGEsIGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4pOwogCQljcmVhdGVfZXZlbnQoY21fbm9kZS0+bG9vcGJhY2twYXJ0bmVyLCBORVNfQ01fRVZFTlRfQ09OTkVDVEVEKTsKIAl9CiAJaWYgKHJldCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlc1sldV0gT0ZBIENNIGV2ZW50X2hhbmRsZXIgcmV0dXJuZWQsICIKLQkJCSJyZXQ9JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmV0KTsKKwkJICAgICAgICJyZXQ9JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmV0KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjk5OCwzNCArMzIzNSwyOCBAQAogewogCXN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZTsKIAlzdHJ1Y3QgbmVzX2NtX25vZGUgKmxvb3BiYWNrOwotCiAJc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlOworCXU4ICpzdGFydF9idWZmOwogCiAJYXRvbWljX2luYygmY21fcmVqZWN0cyk7Ci0JY21fbm9kZSA9IChzdHJ1Y3QgbmVzX2NtX25vZGUgKikgY21faWQtPnByb3ZpZGVyX2RhdGE7CisJY21fbm9kZSA9IChzdHJ1Y3QgbmVzX2NtX25vZGUgKiljbV9pZC0+cHJvdmlkZXJfZGF0YTsKIAlsb29wYmFjayA9IGNtX25vZGUtPmxvb3BiYWNrcGFydG5lcjsKIAljbV9jb3JlID0gY21fbm9kZS0+Y21fY29yZTsKIAljbV9ub2RlLT5jbV9pZCA9IGNtX2lkOwotCWNtX25vZGUtPm1wYV9mcmFtZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSkgKyBwZGF0YV9sZW47CiAKLQlpZiAoY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUgPiBNQVhfQ01fQlVGRkVSKQorCWlmIChwZGF0YV9sZW4gKyBzaXplb2Yoc3RydWN0IGlldGZfbXBhX3YyKSA+IE1BWF9DTV9CVUZGRVIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtY3B5KCZjbV9ub2RlLT5tcGFfZnJhbWUua2V5WzBdLCBJRUZUX01QQV9LRVlfUkVQLCBJRVRGX01QQV9LRVlfU0laRSk7CiAJaWYgKGxvb3BiYWNrKSB7CiAJCW1lbWNweSgmbG9vcGJhY2stPm1wYV9mcmFtZS5wcml2X2RhdGEsIHBkYXRhLCBwZGF0YV9sZW4pOwogCQlsb29wYmFjay0+bXBhX2ZyYW1lLnByaXZfZGF0YV9sZW4gPSBwZGF0YV9sZW47Ci0JCWxvb3BiYWNrLT5tcGFfZnJhbWVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpICsKLQkJCQlwZGF0YV9sZW47CisJCWxvb3BiYWNrLT5tcGFfZnJhbWVfc2l6ZSA9IHBkYXRhX2xlbjsKIAl9IGVsc2UgewotCQltZW1jcHkoJmNtX25vZGUtPm1wYV9mcmFtZS5wcml2X2RhdGEsIHBkYXRhLCBwZGF0YV9sZW4pOwotCQljbV9ub2RlLT5tcGFfZnJhbWUucHJpdl9kYXRhX2xlbiA9IGNwdV90b19iZTE2KHBkYXRhX2xlbik7CisJCXN0YXJ0X2J1ZmYgPSAmY21fbm9kZS0+bXBhX2ZyYW1lX2J1ZlswXSArIHNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfdjIpOworCQljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZSA9IHBkYXRhX2xlbjsKKwkJbWVtY3B5KHN0YXJ0X2J1ZmYsIHBkYXRhLCBwZGF0YV9sZW4pOwogCX0KLQotCWNtX25vZGUtPm1wYV9mcmFtZS5yZXYgPSBtcGFfdmVyc2lvbjsKLQljbV9ub2RlLT5tcGFfZnJhbWUuZmxhZ3MgPSBJRVRGX01QQV9GTEFHU19DUkMgfCBJRVRGX01QQV9GTEFHU19SRUpFQ1Q7Ci0KLQlyZXR1cm4gY21fY29yZS0+YXBpLT5yZWplY3QoY21fY29yZSwgJmNtX25vZGUtPm1wYV9mcmFtZSwgY21fbm9kZSk7CisJcmV0dXJuIGNtX2NvcmUtPmFwaS0+cmVqZWN0KGNtX2NvcmUsIGNtX25vZGUpOwogfQogCiAKQEAgLTMwNTIsNyArMzI4Myw3IEBACiAJbmVzdm5pYyA9IHRvX25lc3ZuaWMobmVzcXAtPmlicXAuZGV2aWNlKTsKIAlpZiAoIW5lc3ZuaWMpCiAJCXJldHVybiAtRUlOVkFMOwotCW5lc2RldiAgPSBuZXN2bmljLT5uZXNkZXY7CisJbmVzZGV2ID0gbmVzdm5pYy0+bmVzZGV2OwogCWlmICghbmVzZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzA2MCwxMiArMzI5MSwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUVAldSwgY3VycmVudCBJUCA9IDB4JTA4WCwgRGVzdGluYXRpb24gSVAgPSAiCi0JCSIweCUwOFg6MHglMDRYLCBsb2NhbCA9IDB4JTA4WDoweCUwNFguXG4iLCBuZXNxcC0+aHdxcC5xcF9pZCwKLQkJbnRvaGwobmVzdm5pYy0+bG9jYWxfaXBhZGRyKSwKLQkJbnRvaGwoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCi0JCW50b2hzKGNtX2lkLT5yZW1vdGVfYWRkci5zaW5fcG9ydCksCi0JCW50b2hsKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkciksCi0JCW50b2hzKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9wb3J0KSk7CisJCSAgIjB4JTA4WDoweCUwNFgsIGxvY2FsID0gMHglMDhYOjB4JTA0WC5cbiIsIG5lc3FwLT5od3FwLnFwX2lkLAorCQkgIG50b2hsKG5lc3ZuaWMtPmxvY2FsX2lwYWRkciksCisJCSAgbnRvaGwoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCSAgbnRvaHMoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9wb3J0KSwKKwkJICBudG9obChjbV9pZC0+bG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIpLAorCQkgIG50b2hzKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9wb3J0KSk7CiAKIAlhdG9taWNfaW5jKCZjbV9jb25uZWN0cyk7CiAJbmVzcXAtPmFjdGl2ZV9jb25uID0gMTsKQEAgLTMwNzksMTIgKzMzMTAsMTIgQEAKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+aXJkX29yZF9zaXplcyB8PSBjcHVfdG9fbGUzMigodTMyKWNvbm5fcGFyYW0tPm9yZCk7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJyZXF1ZXN0ZWQgb3JkID0gMHglMDhYLlxuIiwgKHUzMiljb25uX3BhcmFtLT5vcmQpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAibXBhIHByaXZhdGUgZGF0YSBsZW4gPSV1XG4iLAotCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKKwkJICBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKIAogCWlmIChjbV9pZC0+bG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIgIT0KLQkJY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkcikgeworCSAgICBjbV9pZC0+cmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKSB7CiAJCW5lc19tYW5hZ2VfYXBidnQobmVzdm5pYywgbnRvaHMoY21faWQtPmxvY2FsX2FkZHIuc2luX3BvcnQpLAotCQkJUENJX0ZVTkMobmVzZGV2LT5wY2lkZXYtPmRldmZuKSwgTkVTX01BTkFHRV9BUEJWVF9BREQpOworCQkJCSBQQ0lfRlVOQyhuZXNkZXYtPnBjaWRldi0+ZGV2Zm4pLCBORVNfTUFOQUdFX0FQQlZUX0FERCk7CiAJCWFwYnZ0X3NldCA9IDE7CiAJfQogCkBAIC0zMTAwLDEzICszMzMxLDEzIEBACiAKIAkvKiBjcmVhdGUgYSBjb25uZWN0IENNIG5vZGUgY29ubmVjdGlvbiAqLwogCWNtX25vZGUgPSBnX2NtX2NvcmUtPmFwaS0+Y29ubmVjdChnX2NtX2NvcmUsIG5lc3ZuaWMsCi0JCWNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4sICh2b2lkICopY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhLAotCQkmY21faW5mbyk7CisJCQkJCSAgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbiwgKHZvaWQgKiljb25uX3BhcmFtLT5wcml2YXRlX2RhdGEsCisJCQkJCSAgJmNtX2luZm8pOwogCWlmICghY21fbm9kZSkgewogCQlpZiAoYXBidnRfc2V0KQogCQkJbmVzX21hbmFnZV9hcGJ2dChuZXN2bmljLCBudG9ocyhjbV9pZC0+bG9jYWxfYWRkci5zaW5fcG9ydCksCi0JCQkJUENJX0ZVTkMobmVzZGV2LT5wY2lkZXYtPmRldmZuKSwKLQkJCQlORVNfTUFOQUdFX0FQQlZUX0RFTCk7CisJCQkJCSBQQ0lfRlVOQyhuZXNkZXYtPnBjaWRldi0+ZGV2Zm4pLAorCQkJCQkgTkVTX01BTkFHRV9BUEJWVF9ERUwpOwogCiAJCWNtX2lkLT5yZW1fcmVmKGNtX2lkKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zMTU2LDcgKzMzODcsNyBAQAogCWNtX25vZGUgPSBnX2NtX2NvcmUtPmFwaS0+bGlzdGVuKGdfY21fY29yZSwgbmVzdm5pYywgJmNtX2luZm8pOwogCWlmICghY21fbm9kZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzWyV1XSBFcnJvciByZXR1cm5lZCBmcm9tIGxpc3RlbiBBUEkgY2FsbFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0zMTY0LDEyICszMzk1LDEyIEBACiAKIAlpZiAoIWNtX25vZGUtPnJldXNlZF9ub2RlKSB7CiAJCWVyciA9IG5lc19tYW5hZ2VfYXBidnQobmVzdm5pYywKLQkJCW50b2hzKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9wb3J0KSwKLQkJCVBDSV9GVU5DKG5lc3ZuaWMtPm5lc2Rldi0+cGNpZGV2LT5kZXZmbiksCi0JCQlORVNfTUFOQUdFX0FQQlZUX0FERCk7CisJCQkJICAgICAgIG50b2hzKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9wb3J0KSwKKwkJCQkgICAgICAgUENJX0ZVTkMobmVzdm5pYy0+bmVzZGV2LT5wY2lkZXYtPmRldmZuKSwKKwkJCQkgICAgICAgTkVTX01BTkFHRV9BUEJWVF9BREQpOwogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIm5lc19tYW5hZ2VfYXBidnQgY2FsbCByZXR1cm5lZCAlZC5cbiIsCi0JCQkJZXJyKTsKKwkJCSAgICAgICBlcnIpOwogCQkJZ19jbV9jb3JlLT5hcGktPnN0b3BfbGlzdGVuZXIoZ19jbV9jb3JlLCAodm9pZCAqKWNtX25vZGUpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMzIwNiwxMyArMzQzNywxMyBAQAogaW50IG5lc19jbV9yZWN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXZpY2UpCiB7CiAJaW50IHJjID0gMDsKKwogCWNtX3BhY2tldHNfcmVjZWl2ZWQrKzsKLQlpZiAoKGdfY21fY29yZSkgJiYgKGdfY21fY29yZS0+YXBpKSkgeworCWlmICgoZ19jbV9jb3JlKSAmJiAoZ19jbV9jb3JlLT5hcGkpKQogCQlyYyA9IGdfY21fY29yZS0+YXBpLT5yZWN2X3BrdChnX2NtX2NvcmUsIG5ldGRldl9wcml2KG5ldGRldmljZSksIHNrYik7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiVW5hYmxlIHRvIHByb2Nlc3MgcGFja2V0IGZvciBDTSwiCi0JCQkJIiBjbSBpcyBub3Qgc2V0dXAgcHJvcGVybHkuXG4iKTsKLQl9CisJCQkgICIgY20gaXMgbm90IHNldHVwIHByb3Blcmx5LlxuIik7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0zMjI3LDExICszNDU4LDEwIEBACiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJcbiIpOwogCS8qIGNyZWF0ZSB0aGUgcHJpbWFyeSBDTSBjb3JlLCBwYXNzIHRoaXMgaGFuZGxlIHRvIHN1YnNlcXVlbnQgY29yZSBpbml0cyAqLwogCWdfY21fY29yZSA9IG5lc19jbV9hbGxvY19jb3JlKCk7Ci0JaWYgKGdfY21fY29yZSkgeworCWlmIChnX2NtX2NvcmUpCiAJCXJldHVybiAwOwotCX0gZWxzZSB7CisJZWxzZQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiB9CiAKIApAQCAtMzI1Miw3ICszNDgyLDYgQEAKICAqLwogc3RhdGljIHZvaWQgY21fZXZlbnRfY29ubmVjdGVkKHN0cnVjdCBuZXNfY21fZXZlbnQgKmV2ZW50KQogewotCXU2NCB1NjR0ZW1wOwogCXN0cnVjdCBuZXNfcXAgKm5lc3FwOwogCXN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYzsKIAlzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2OwpAQCAtMzI2MSw3ICszNDkwLDYgQEAKIAlzdHJ1Y3QgaWJfcXBfYXR0ciBhdHRyOwogCXN0cnVjdCBpd19jbV9pZCAqY21faWQ7CiAJc3RydWN0IGl3X2NtX2V2ZW50IGNtX2V2ZW50OwotCXN0cnVjdCBuZXNfaHdfcXBfd3FlICp3cWU7CiAJc3RydWN0IG5lc192NF9xdWFkIG5lc19xdWFkOwogCXUzMiBjcmNfdmFsdWU7CiAJaW50IHJldDsKQEAgLTMyNzUsMTcgKzM1MDMsMTYgQEAKIAluZXNkZXYgPSBuZXN2bmljLT5uZXNkZXY7CiAJbmVzYWRhcHRlciA9IG5lc2Rldi0+bmVzYWRhcHRlcjsKIAotCWlmIChuZXNxcC0+ZGVzdHJveWVkKSB7CisJaWYgKG5lc3FwLT5kZXN0cm95ZWQpCiAJCXJldHVybjsKLQl9CiAJYXRvbWljX2luYygmY21fY29ubmVjdGVkcyk7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJRUCV1IGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byAgMHglMDhYOjB4JTA0WCBvbiIKLQkJCSIgbG9jYWwgcG9ydCAweCUwNFguIGppZmZpZXMgPSAlbHUuXG4iLAotCQkJbmVzcXAtPmh3cXAucXBfaWQsCi0JCQludG9obChjbV9pZC0+cmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKSwKLQkJCW50b2hzKGNtX2lkLT5yZW1vdGVfYWRkci5zaW5fcG9ydCksCi0JCQludG9ocyhjbV9pZC0+bG9jYWxfYWRkci5zaW5fcG9ydCksCi0JCQlqaWZmaWVzKTsKKwkJICAiIGxvY2FsIHBvcnQgMHglMDRYLiBqaWZmaWVzID0gJWx1LlxuIiwKKwkJICBuZXNxcC0+aHdxcC5xcF9pZCwKKwkJICBudG9obChjbV9pZC0+cmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKSwKKwkJICBudG9ocyhjbV9pZC0+cmVtb3RlX2FkZHIuc2luX3BvcnQpLAorCQkgIG50b2hzKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9wb3J0KSwKKwkJICBqaWZmaWVzKTsKIAogCW5lc19jbV9pbml0X3RzYV9jb25uKG5lc3FwLCBjbV9ub2RlKTsKIApAQCAtMzMxNiw0MCArMzU0MywxMiBAQAogCQkJTkVTX1FQQ09OVEVYVF9PUkRJUkRfSVdBUlBfTU9ERV9TSElGVCk7CiAKIAkvKiBBZGp1c3QgdGFpbCBmb3Igbm90IGhhdmluZyBhIExTTU0gKi8KLQluZXNxcC0+aHdxcC5zcV90YWlsID0gMTsKKwkvKm5lc3FwLT5od3FwLnNxX3RhaWwgPSAxOyovCiAKLSNpZiBkZWZpbmVkKE5FU19TRU5EX0ZJUlNUX1dSSVRFKQotCWlmIChjbV9ub2RlLT5zZW5kX3dyaXRlMCkgewotCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlNlbmRpbmcgZmlyc3Qgd3JpdGUuXG4iKTsKLQkJd3FlID0gJm5lc3FwLT5od3FwLnNxX3ZiYXNlWzBdOwotCQl1NjR0ZW1wID0gKHVuc2lnbmVkIGxvbmcpbmVzcXA7Ci0JCXU2NHRlbXAgfD0gTkVTX1NXX0NPTlRFWFRfQUxJR04+PjE7Ci0JCXNldF93cWVfNjRiaXRfdmFsdWUod3FlLT53cWVfd29yZHMsCi0JCQkJTkVTX0lXQVJQX1NRX1dRRV9DT01QX0NUWF9MT1dfSURYLCB1NjR0ZW1wKTsKLQkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9NSVNDX0lEWF0gPQotCQkJY3B1X3RvX2xlMzIoTkVTX0lXQVJQX1NRX09QX1JETUFXKTsKLQkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9UT1RBTF9QQVlMT0FEX0lEWF0gPSAwOwotCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX0ZSQUcwX0xPV19JRFhdID0gMDsKLQkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9GUkFHMF9ISUdIX0lEWF0gPSAwOwotCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX0xFTkdUSDBfSURYXSA9IDA7Ci0JCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfU1RBRzBfSURYXSA9IDA7CisJYnVpbGRfcmRtYTBfbXNnKGNtX25vZGUsICZuZXNxcCk7CiAKLQkJaWYgKG5lc3FwLT5zcV9rbWFwcGVkKSB7Ci0JCQluZXNxcC0+c3Ffa21hcHBlZCA9IDA7Ci0JCQlrdW5tYXAobmVzcXAtPnBhZ2UpOwotCQl9Ci0KLQkJLyogdXNlIHRoZSByZXNlcnZlZCBzcG90IG9uIHRoZSBXUSBmb3IgdGhlIGV4dHJhIGZpcnN0IFdRRSAqLwotCQluZXNxcC0+bmVzcXBfY29udGV4dC0+aXJkX29yZF9zaXplcyAmPQotCQkJY3B1X3RvX2xlMzIofihORVNfUVBDT05URVhUX09SRElSRF9MU01NX1BSRVNFTlQgfAotCQkJCQkJTkVTX1FQQ09OVEVYVF9PUkRJUkRfV1JQRFUgfAotCQkJCQkJTkVTX1FQQ09OVEVYVF9PUkRJUkRfQUxTTU0pKTsKLQkJbmVzcXAtPnNraXBfbHNtbSA9IDE7Ci0JCW5lc3FwLT5od3FwLnNxX3RhaWwgPSAwOwotCQluZXNfd3JpdGUzMihuZXNkZXYtPnJlZ3MgKyBORVNfV1FFX0FMTE9DLAotCQkJCSgxIDw8IDI0KSB8IDB4MDA4MDAwMDAgfCBuZXNxcC0+aHdxcC5xcF9pZCk7Ci0JfQotI2VuZGlmCisJbmVzX3dyaXRlMzIobmVzZGV2LT5yZWdzICsgTkVTX1dRRV9BTExPQywKKwkJICAgICgxIDw8IDI0KSB8IDB4MDA4MDAwMDAgfCBuZXNxcC0+aHdxcC5xcF9pZCk7CiAKIAltZW1zZXQoJm5lc19xdWFkLCAwLCBzaXplb2YobmVzX3F1YWQpKTsKIApAQCAtMzM2NiwxMyArMzU2NSwxMyBAQAogCWNyY192YWx1ZSA9IGdldF9jcmNfdmFsdWUoJm5lc19xdWFkKTsKIAluZXNxcC0+aHRlX2luZGV4ID0gY3B1X3RvX2JlMzIoY3JjX3ZhbHVlIF4gMHhmZmZmZmZmZik7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJIVEUgSW5kZXggPSAweCUwOFgsIEFmdGVyIENSQyA9IDB4JTA4WFxuIiwKLQkJCW5lc3FwLT5odGVfaW5kZXgsIG5lc3FwLT5odGVfaW5kZXggJiBuZXNhZGFwdGVyLT5odGVfaW5kZXhfbWFzayk7CisJCSAgbmVzcXAtPmh0ZV9pbmRleCwgbmVzcXAtPmh0ZV9pbmRleCAmIG5lc2FkYXB0ZXItPmh0ZV9pbmRleF9tYXNrKTsKIAogCW5lc3FwLT5odGVfaW5kZXggJj0gbmVzYWRhcHRlci0+aHRlX2luZGV4X21hc2s7CiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPmh0ZV9pbmRleCA9IGNwdV90b19sZTMyKG5lc3FwLT5odGVfaW5kZXgpOwogCiAJbmVzcXAtPmlldGZfZnJhbWUgPSAmY21fbm9kZS0+bXBhX2ZyYW1lOwotCW5lc3FwLT5wcml2YXRlX2RhdGFfbGVuID0gKHU4KSBjbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZTsKKwluZXNxcC0+cHJpdmF0ZV9kYXRhX2xlbiA9ICh1OCljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZTsKIAljbV9ub2RlLT5jbV9jb3JlLT5hcGktPmFjY2VsZXJhdGVkKGNtX25vZGUtPmNtX2NvcmUsIGNtX25vZGUpOwogCiAJLyogbm90aWZ5IE9GIGxheWVyIHdlIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHRoZSByZXF1ZXN0ZWQgY29ubmVjdGlvbiAqLwpAQCAtMzM4NCw3ICszNTgzLDkgQEAKIAljbV9ldmVudC5yZW1vdGVfYWRkciA9IGNtX2lkLT5yZW1vdGVfYWRkcjsKIAogCWNtX2V2ZW50LnByaXZhdGVfZGF0YSA9ICh2b2lkICopZXZlbnQtPmNtX25vZGUtPm1wYV9mcmFtZV9idWY7Ci0JY21fZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9ICh1OCkgZXZlbnQtPmNtX25vZGUtPm1wYV9mcmFtZV9zaXplOworCWNtX2V2ZW50LnByaXZhdGVfZGF0YV9sZW4gPSAodTgpZXZlbnQtPmNtX25vZGUtPm1wYV9mcmFtZV9zaXplOworCWNtX2V2ZW50LmlyZCA9IGNtX25vZGUtPmlyZF9zaXplOworCWNtX2V2ZW50Lm9yZCA9IGNtX25vZGUtPm9yZF9zaXplOwogCiAJY21fZXZlbnQubG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBldmVudC0+Y21faW5mby5yZW1fYWRkcjsKIAlyZXQgPSBjbV9pZC0+ZXZlbnRfaGFuZGxlcihjbV9pZCwgJmNtX2V2ZW50KTsKQEAgLTMzOTIsMTIgKzM1OTMsMTIgQEAKIAogCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0VSUiAiJXNbJXVdIE9GQSBDTSBldmVudF9oYW5kbGVyIHJldHVybmVkLCAiCi0JCQkicmV0PSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7CisJCSAgICAgICAicmV0PSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7CiAJYXR0ci5xcF9zdGF0ZSA9IElCX1FQU19SVFM7CiAJbmVzX21vZGlmeV9xcCgmbmVzcXAtPmlicXAsICZhdHRyLCBJQl9RUF9TVEFURSwgTlVMTCk7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIkV4aXRpbmcgY29ubmVjdCB0aHJlYWQgZm9yIFFQJXUuIGppZmZpZXMgPSAiCi0JCSIlbHVcbiIsIG5lc3FwLT5od3FwLnFwX2lkLCBqaWZmaWVzKTsKKwkJICAiJWx1XG4iLCBuZXNxcC0+aHdxcC5xcF9pZCwgamlmZmllcyk7CiAKIAlyZXR1cm47CiB9CkBAIC0zNDE4LDE2ICszNjE5LDE0IEBACiAJCXJldHVybjsKIAogCWNtX2lkID0gZXZlbnQtPmNtX25vZGUtPmNtX2lkOwotCWlmICghY21faWQpIHsKKwlpZiAoIWNtX2lkKQogCQlyZXR1cm47Ci0JfQogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJjbV9ub2RlPSVwLCBjbV9pZD0lcFxuIiwgZXZlbnQtPmNtX25vZGUsIGNtX2lkKTsKIAluZXNxcCA9IGNtX2lkLT5wcm92aWRlcl9kYXRhOwogCi0JaWYgKCFuZXNxcCkgeworCWlmICghbmVzcXApCiAJCXJldHVybjsKLQl9CiAKIAkvKiBub3RpZnkgT0YgbGF5ZXIgYWJvdXQgdGhpcyBjb25uZWN0aW9uIGVycm9yIGV2ZW50ICovCiAJLyogY21faWQtPnJlbV9yZWYoY21faWQpOyAqLwpAQCAtMzQ0MiwxNCArMzY0MSwxNCBAQAogCWNtX2V2ZW50LnByaXZhdGVfZGF0YV9sZW4gPSAwOwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJjYWxsIENNX0VWRU5UIFJFSkVDVEVELCBsb2NhbF9hZGRyPSUwOHgsICIKLQkJInJlbW92ZV9hZGRyPSUwOHhcbiIsIGNtX2V2ZW50LmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyLAotCQljbV9ldmVudC5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpOworCQkgICJyZW1vdmVfYWRkcj0lMDh4XG4iLCBjbV9ldmVudC5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkciwKKwkJICBjbV9ldmVudC5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpOwogCiAJcmV0ID0gY21faWQtPmV2ZW50X2hhbmRsZXIoY21faWQsICZjbV9ldmVudCk7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJPRkEgQ00gZXZlbnRfaGFuZGxlciByZXR1cm5lZCwgcmV0PSVkXG4iLCByZXQpOwogCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0VSUiAiJXNbJXVdIE9GQSBDTSBldmVudF9oYW5kbGVyIHJldHVybmVkLCAiCi0JCQkicmV0PSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7CisJCSAgICAgICAicmV0PSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7CiAJY21faWQtPnJlbV9yZWYoY21faWQpOwogCiAJcmVtX3JlZl9jbV9ub2RlKGV2ZW50LT5jbV9ub2RlLT5jbV9jb3JlLCBldmVudC0+Y21fbm9kZSk7CkBAIC0zNTE5LDcgKzM3MTgsNyBAQAogICovCiBzdGF0aWMgdm9pZCBjbV9ldmVudF9tcGFfcmVxKHN0cnVjdCBuZXNfY21fZXZlbnQgKmV2ZW50KQogewotCXN0cnVjdCBpd19jbV9pZCAgICpjbV9pZDsKKwlzdHJ1Y3QgaXdfY21faWQgKmNtX2lkOwogCXN0cnVjdCBpd19jbV9ldmVudCBjbV9ldmVudDsKIAlpbnQgcmV0OwogCXN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZTsKQEAgLTM1MzEsNyArMzczMCw3IEBACiAKIAlhdG9taWNfaW5jKCZjbV9jb25uZWN0X3JlcXMpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiY21fbm9kZSA9ICVwIC0gY21faWQgPSAlcCwgamlmZmllcyA9ICVsdVxuIiwKLQkJCWNtX25vZGUsIGNtX2lkLCBqaWZmaWVzKTsKKwkJICBjbV9ub2RlLCBjbV9pZCwgamlmZmllcyk7CiAKIAljbV9ldmVudC5ldmVudCA9IElXX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVDsKIAljbV9ldmVudC5zdGF0dXMgPSAwOwpAQCAtMzU0NSwxOSArMzc0NCwyMSBAQAogCWNtX2V2ZW50LnJlbW90ZV9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoZXZlbnQtPmNtX2luZm8ucmVtX3BvcnQpOwogCWNtX2V2ZW50LnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGV2ZW50LT5jbV9pbmZvLnJlbV9hZGRyKTsKIAljbV9ldmVudC5wcml2YXRlX2RhdGEgPSBjbV9ub2RlLT5tcGFfZnJhbWVfYnVmOwotCWNtX2V2ZW50LnByaXZhdGVfZGF0YV9sZW4gID0gKHU4KSBjbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZTsKKwljbV9ldmVudC5wcml2YXRlX2RhdGFfbGVuID0gKHU4KWNtX25vZGUtPm1wYV9mcmFtZV9zaXplOworCWNtX2V2ZW50LmlyZCA9IGNtX25vZGUtPmlyZF9zaXplOworCWNtX2V2ZW50Lm9yZCA9IGNtX25vZGUtPm9yZF9zaXplOwogCiAJcmV0ID0gY21faWQtPmV2ZW50X2hhbmRsZXIoY21faWQsICZjbV9ldmVudCk7CiAJaWYgKHJldCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlc1sldV0gT0ZBIENNIGV2ZW50X2hhbmRsZXIgcmV0dXJuZWQsIHJldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7CisJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7CiAJcmV0dXJuOwogfQogCiAKIHN0YXRpYyB2b2lkIGNtX2V2ZW50X21wYV9yZWplY3Qoc3RydWN0IG5lc19jbV9ldmVudCAqZXZlbnQpCiB7Ci0Jc3RydWN0IGl3X2NtX2lkICAgKmNtX2lkOworCXN0cnVjdCBpd19jbV9pZCAqY21faWQ7CiAJc3RydWN0IGl3X2NtX2V2ZW50IGNtX2V2ZW50OwogCXN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZTsKIAlpbnQgcmV0OwpAQCAtMzU2OSw3ICszNzcwLDcgQEAKIAogCWF0b21pY19pbmMoJmNtX2Nvbm5lY3RfcmVxcyk7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJjbV9ub2RlID0gJXAgLSBjbV9pZCA9ICVwLCBqaWZmaWVzID0gJWx1XG4iLAotCQkJY21fbm9kZSwgY21faWQsIGppZmZpZXMpOworCQkgIGNtX25vZGUsIGNtX2lkLCBqaWZmaWVzKTsKIAogCWNtX2V2ZW50LmV2ZW50ID0gSVdfQ01fRVZFTlRfQ09OTkVDVF9SRVBMWTsKIAljbV9ldmVudC5zdGF0dXMgPSAtRUNPTk5SRUZVU0VEOwpAQCAtMzU4NCwxNyArMzc4NSwxNyBAQAogCWNtX2V2ZW50LnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGV2ZW50LT5jbV9pbmZvLnJlbV9hZGRyKTsKIAogCWNtX2V2ZW50LnByaXZhdGVfZGF0YSA9IGNtX25vZGUtPm1wYV9mcmFtZV9idWY7Ci0JY21fZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9ICh1OCkgY21fbm9kZS0+bXBhX2ZyYW1lX3NpemU7CisJY21fZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9ICh1OCljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZTsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiY2FsbCBDTV9FVkVOVF9NUEFfUkVKRUNURUQsIGxvY2FsX2FkZHI9JTA4eCwgIgotCQkJInJlbW92ZV9hZGRyPSUwOHhcbiIsCi0JCQljbV9ldmVudC5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkciwKLQkJCWNtX2V2ZW50LnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkcik7CisJCSAgInJlbW92ZV9hZGRyPSUwOHhcbiIsCisJCSAgY21fZXZlbnQubG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIsCisJCSAgY21fZXZlbnQucmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKIAogCXJldCA9IGNtX2lkLT5ldmVudF9oYW5kbGVyKGNtX2lkLCAmY21fZXZlbnQpOwogCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0VSUiAiJXNbJXVdIE9GQSBDTSBldmVudF9oYW5kbGVyIHJldHVybmVkLCByZXQ9JWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCByZXQpOworCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByZXQpOwogCiAJcmV0dXJuOwogfQpAQCAtMzYxMyw3ICszODE0LDcgQEAKIAlldmVudC0+Y21faW5mby5jbV9pZC0+YWRkX3JlZihldmVudC0+Y21faW5mby5jbV9pZCk7CiAJSU5JVF9XT1JLKCZldmVudC0+ZXZlbnRfd29yaywgbmVzX2NtX2V2ZW50X2hhbmRsZXIpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiY21fbm9kZT0lcCBxdWV1ZV93b3JrLCBldmVudD0lcFxuIiwKLQkJZXZlbnQtPmNtX25vZGUsIGV2ZW50KTsKKwkJICBldmVudC0+Y21fbm9kZSwgZXZlbnQpOwogCiAJcXVldWVfd29yayhldmVudC0+Y21fbm9kZS0+Y21fY29yZS0+ZXZlbnRfd3EsICZldmVudC0+ZXZlbnRfd29yayk7CiAKQEAgLTM2MzAsNyArMzgzMSw3IEBACiBzdGF0aWMgdm9pZCBuZXNfY21fZXZlbnRfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG5lc19jbV9ldmVudCAqZXZlbnQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5lc19jbV9ldmVudCwKLQkJCWV2ZW50X3dvcmspOworCQkJCQkJICBldmVudF93b3JrKTsKIAlzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmU7CiAKIAlpZiAoKCFldmVudCkgfHwgKCFldmVudC0+Y21fbm9kZSkgfHwgKCFldmVudC0+Y21fbm9kZS0+Y21fY29yZSkpCkBAIC0zNjM4LDI5ICszODM5LDI5IEBACiAKIAljbV9jb3JlID0gZXZlbnQtPmNtX25vZGUtPmNtX2NvcmU7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJldmVudD0lcCwgZXZlbnQtPnR5cGU9JXUsIGV2ZW50cyBwb3N0ZWQ9JXVcbiIsCi0JCWV2ZW50LCBldmVudC0+dHlwZSwgYXRvbWljX3JlYWQoJmNtX2NvcmUtPmV2ZW50c19wb3N0ZWQpKTsKKwkJICBldmVudCwgZXZlbnQtPnR5cGUsIGF0b21pY19yZWFkKCZjbV9jb3JlLT5ldmVudHNfcG9zdGVkKSk7CiAKIAlzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CiAJY2FzZSBORVNfQ01fRVZFTlRfTVBBX1JFUToKIAkJY21fZXZlbnRfbXBhX3JlcShldmVudCk7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiY21fbm9kZT0lcCBDTSBFdmVudDogTVBBIFJFUVVFU1RcbiIsCi0JCQlldmVudC0+Y21fbm9kZSk7CisJCQkgIGV2ZW50LT5jbV9ub2RlKTsKIAkJYnJlYWs7CiAJY2FzZSBORVNfQ01fRVZFTlRfUkVTRVQ6CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiY21fbm9kZSA9ICVwIENNIEV2ZW50OiBSRVNFVFxuIiwKLQkJCWV2ZW50LT5jbV9ub2RlKTsKKwkJCSAgZXZlbnQtPmNtX25vZGUpOwogCQljbV9ldmVudF9yZXNldChldmVudCk7CiAJCWJyZWFrOwogCWNhc2UgTkVTX0NNX0VWRU5UX0NPTk5FQ1RFRDoKIAkJaWYgKCghZXZlbnQtPmNtX25vZGUtPmNtX2lkKSB8fAotCQkJKGV2ZW50LT5jbV9ub2RlLT5zdGF0ZSAhPSBORVNfQ01fU1RBVEVfVFNBKSkKKwkJICAgIChldmVudC0+Y21fbm9kZS0+c3RhdGUgIT0gTkVTX0NNX1NUQVRFX1RTQSkpCiAJCQlicmVhazsKIAkJY21fZXZlbnRfY29ubmVjdGVkKGV2ZW50KTsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJDTSBFdmVudDogQ09OTkVDVEVEXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBORVNfQ01fRVZFTlRfTVBBX1JFSkVDVDoKIAkJaWYgKCghZXZlbnQtPmNtX25vZGUtPmNtX2lkKSB8fAotCQkJCShldmVudC0+Y21fbm9kZS0+c3RhdGUgPT0gTkVTX0NNX1NUQVRFX1RTQSkpCisJCSAgICAoZXZlbnQtPmNtX25vZGUtPnN0YXRlID09IE5FU19DTV9TVEFURV9UU0EpKQogCQkJYnJlYWs7CiAJCWNtX2V2ZW50X21wYV9yZWplY3QoZXZlbnQpOwogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIkNNIEV2ZW50OiBSRUpFQ1RcbiIpOwpAQCAtMzY2OCw3ICszODY5LDcgQEAKIAogCWNhc2UgTkVTX0NNX0VWRU5UX0FCT1JURUQ6CiAJCWlmICgoIWV2ZW50LT5jbV9ub2RlLT5jbV9pZCkgfHwKLQkJCShldmVudC0+Y21fbm9kZS0+c3RhdGUgPT0gTkVTX0NNX1NUQVRFX1RTQSkpCisJCSAgICAoZXZlbnQtPmNtX25vZGUtPnN0YXRlID09IE5FU19DTV9TVEFURV9UU0EpKQogCQkJYnJlYWs7CiAJCWNtX2V2ZW50X2Nvbm5lY3RfZXJyb3IoZXZlbnQpOwogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIkNNIEV2ZW50OiBBQk9SVEVEXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5oCmluZGV4IGQ5ODI1ZmQuLmJkZmExZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uaApAQCAtNDgsNyArNDgsMTYgQEAKICNkZWZpbmUgSUVURl9NUEFfS0VZX1NJWkUgMTYKICNkZWZpbmUgSUVURl9NUEFfVkVSU0lPTiAgMQogI2RlZmluZSBJRVRGX01BWF9QUklWX0RBVEFfTEVOIDUxMgotI2RlZmluZSBJRVRGX01QQV9GUkFNRV9TSVpFICAgICAyMAorI2RlZmluZSBJRVRGX01QQV9GUkFNRV9TSVpFICAgIDIwCisjZGVmaW5lIElFVEZfUlRSX01TR19TSVpFICAgICAgNAorI2RlZmluZSBJRVRGX01QQV9WMl9GTEFHICAgICAgIDB4MTAKKworLyogSUVURiBSVFIgTVNHIEZpZWxkcyAgICAgICAgICAgICAgICovCisjZGVmaW5lIElFVEZfUEVFUl9UT19QRUVSICAgICAgIDB4ODAwMAorI2RlZmluZSBJRVRGX0ZMUERVX1pFUk9fTEVOICAgICAweDQwMDAKKyNkZWZpbmUgSUVURl9SRE1BMF9XUklURSAgICAgICAgMHg4MDAwCisjZGVmaW5lIElFVEZfUkRNQTBfUkVBRCAgICAgICAgIDB4NDAwMAorI2RlZmluZSBJRVRGX05PX0lSRF9PUkQgICAgICAgICAweDNGRkYKIAogZW51bSBpZXRmX21wYV9mbGFncyB7CiAJSUVURl9NUEFfRkxBR1NfTUFSS0VSUyA9IDB4ODAsCS8qIHJlY2VpdmUgTWFya2VycyAqLwpAQCAtNTYsNyArNjUsNyBAQAogCUlFVEZfTVBBX0ZMQUdTX1JFSkVDVCAgPSAweDIwLAkvKiBSZWplY3QgKi8KIH07CiAKLXN0cnVjdCBpZXRmX21wYV9mcmFtZSB7CitzdHJ1Y3QgaWV0Zl9tcGFfdjEgewogCXU4IGtleVtJRVRGX01QQV9LRVlfU0laRV07CiAJdTggZmxhZ3M7CiAJdTggcmV2OwpAQCAtNjYsNiArNzUsMjAgQEAKIAogI2RlZmluZSBpZXRmX21wYV9yZXFfcmVzcF9mcmFtZSBpZXRmX21wYV9mcmFtZQogCitzdHJ1Y3QgaWV0Zl9ydHJfbXNnIHsKKwlfX2JlMTYgY3RybF9pcmQ7CisJX19iZTE2IGN0cmxfb3JkOworfTsKKworc3RydWN0IGlldGZfbXBhX3YyIHsKKwl1OCBrZXlbSUVURl9NUEFfS0VZX1NJWkVdOworCXU4IGZsYWdzOworCXU4IHJldjsKKwkgX19iZTE2IHByaXZfZGF0YV9sZW47CisJc3RydWN0IGlldGZfcnRyX21zZyBydHJfbXNnOworCXU4IHByaXZfZGF0YVswXTsKK307CisKIHN0cnVjdCBuZXNfdjRfcXVhZCB7CiAJdTMyIHJzdmQwOwogCV9fbGUzMiBEc3RJcEFkckluZGV4OwkvKiBPbmx5IG1vc3Qgc2lnbmlmaWNhbnQgNSBiaXRzIGFyZSB2YWxpZCAqLwpAQCAtMTcxLDggKzE5NCw3IEBACiAKICNkZWZpbmUgTkVTX0NNX0RFRl9TRVEyICAgICAgMHgxOGVkNTc0MAogI2RlZmluZSBORVNfQ01fREVGX0xPQ0FMX0lEMiAweGI4MDcKLSNkZWZpbmUJTUFYX0NNX0JVRkZFUgkoSUVURl9NUEFfRlJBTUVfU0laRSArIElFVEZfTUFYX1BSSVZfREFUQV9MRU4pCi0KKyNkZWZpbmUJTUFYX0NNX0JVRkZFUgkoSUVURl9NUEFfRlJBTUVfU0laRSArIElFVEZfUlRSX01TR19TSVpFICsgSUVURl9NQVhfUFJJVl9EQVRBX0xFTikKIAogdHlwZWRlZiB1MzIgbmVzX2FkZHJfdDsKIApAQCAtMjA0LDYgKzIyNiwyMSBAQAogCU5FU19DTV9TVEFURV9DTE9TRUQKIH07CiAKK2VudW0gbXBhX2ZyYW1lX3ZlcnNpb24geworCUlFVEZfTVBBX1YxID0gMSwKKwlJRVRGX01QQV9WMiA9IDIKK307CisKK2VudW0gbXBhX2ZyYW1lX2tleSB7CisJTVBBX0tFWV9SRVFVRVNULAorCU1QQV9LRVlfUkVQTFkKK307CisKK2VudW0gc2VuZF9yZG1hMCB7CisJU0VORF9SRE1BX1JFQURfWkVSTyA9IDEsCisJU0VORF9SRE1BX1dSSVRFX1pFUk8gPSAyCit9OworCiBlbnVtIG5lc190Y3BpcF9wa3RfdHlwZSB7CiAJTkVTX1BLVF9UWVBFX1VOS05PV04sCiAJTkVTX1BLVF9UWVBFX1NZTiwKQEAgLTI0NSw5ICsyODIsOSBAQAogCiAKIGVudW0gbmVzX2NtX2xpc3RlbmVyX3N0YXRlIHsKLQlORVNfQ01fTElTVEVORVJfUEFTU0lWRV9TVEFURT0xLAotCU5FU19DTV9MSVNURU5FUl9BQ1RJVkVfU1RBVEU9MiwKLQlORVNfQ01fTElTVEVORVJfRUlUSEVSX1NUQVRFPTMKKwlORVNfQ01fTElTVEVORVJfUEFTU0lWRV9TVEFURSA9IDEsCisJTkVTX0NNX0xJU1RFTkVSX0FDVElWRV9TVEFURSA9IDIsCisJTkVTX0NNX0xJU1RFTkVSX0VJVEhFUl9TVEFURSA9IDMKIH07CiAKIHN0cnVjdCBuZXNfY21fbGlzdGVuZXIgewpAQCAtMjgzLDE2ICszMjAsMjAgQEAKIAogCXN0cnVjdCBuZXNfY21fbm9kZSAgICAgICAgKmxvb3BiYWNrcGFydG5lcjsKIAotCXN0cnVjdCBuZXNfdGltZXJfZW50cnkJKnNlbmRfZW50cnk7Ci0KKwlzdHJ1Y3QgbmVzX3RpbWVyX2VudHJ5CSAgKnNlbmRfZW50cnk7CisJc3RydWN0IG5lc190aW1lcl9lbnRyeSAgICAqcmVjdl9lbnRyeTsKIAlzcGlubG9ja190ICAgICAgICAgICAgICAgIHJldHJhbnNfbGlzdF9sb2NrOwotCXN0cnVjdCBuZXNfdGltZXJfZW50cnkgICpyZWN2X2VudHJ5OworCWVudW0gc2VuZF9yZG1hMCAgICAgICAgICAgc2VuZF9yZG1hMF9vcDsKIAotCWludCAgICAgICAgICAgICAgICAgICAgICAgc2VuZF93cml0ZTA7CiAJdW5pb24gewotCQlzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUgbXBhX2ZyYW1lOwotCQl1OCAgICAgICAgICAgICAgICAgICAgbXBhX2ZyYW1lX2J1ZltNQVhfQ01fQlVGRkVSXTsKKwkJc3RydWN0IGlldGZfbXBhX3YxIG1wYV9mcmFtZTsKKwkJc3RydWN0IGlldGZfbXBhX3YyIG1wYV92Ml9mcmFtZTsKKwkJdTggICAgICAgICAgICAgICAgIG1wYV9mcmFtZV9idWZbTUFYX0NNX0JVRkZFUl07CiAJfTsKKwllbnVtIG1wYV9mcmFtZV92ZXJzaW9uICAgIG1wYV9mcmFtZV9yZXY7CisJdTE2CQkJICBpcmRfc2l6ZTsKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgIG9yZF9zaXplOworCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICBtcGFfZnJhbWVfc2l6ZTsKIAlzdHJ1Y3QgaXdfY21faWQgICAgICAgICAgICpjbV9pZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgIGxpc3Q7CkBAIC0zOTksMTAgKzQ0MCw4IEBACiAJCQlzdHJ1Y3QgbmVzX3ZuaWMgKiwgdTE2LCB2b2lkICosCiAJCQlzdHJ1Y3QgbmVzX2NtX2luZm8gKik7CiAJaW50ICgqY2xvc2UpKHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKik7Ci0JaW50ICgqYWNjZXB0KShzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IGlldGZfbXBhX2ZyYW1lICosCi0JCQlzdHJ1Y3QgbmVzX2NtX25vZGUgKik7Ci0JaW50ICgqcmVqZWN0KShzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IGlldGZfbXBhX2ZyYW1lICosCi0JCQlzdHJ1Y3QgbmVzX2NtX25vZGUgKik7CisJaW50ICgqYWNjZXB0KShzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IG5lc19jbV9ub2RlICopOworCWludCAoKnJlamVjdCkoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBuZXNfY21fbm9kZSAqKTsKIAlpbnQgKCpyZWN2X3BrdCkoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBuZXNfdm5pYyAqLAogCQkJc3RydWN0IHNrX2J1ZmYgKik7CiAJaW50ICgqZGVzdHJveV9jbV9jb3JlKShzdHJ1Y3QgbmVzX2NtX2NvcmUgKik7CkBAIC00MjIsNSArNDYxLDcgQEAKIGludCBuZXNfY21fcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIGludCBuZXNfY21fc3RhcnQodm9pZCk7CiBpbnQgbmVzX2NtX3N0b3Aodm9pZCk7CitpbnQgbmVzX2FkZF9yZWZfY21fbm9kZShzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpOworaW50IG5lc19yZW1fcmVmX2NtX25vZGUoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKTsKIAogI2VuZGlmCQkJLyogTkVTX0NNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5jCmluZGV4IGJlMzZjYmUuLjdjMGZmMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuYwpAQCAtMTEwLDYgKzExMCwxNCBAQAogfTsKICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfaXAoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKQoreworCXVuc2lnbmVkIGNoYXIgKnJlbV9hZGRyOworCWlmIChjbV9ub2RlKSB7CisJCXJlbV9hZGRyID0gKHVuc2lnbmVkIGNoYXIgKikmY21fbm9kZS0+cmVtX2FkZHI7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlJlbW90ZSBJUCBhZGRyOiAlcEk0XG4iLCByZW1fYWRkcik7CisJfQorfQogCiAvKioKICAqIG5lc19uaWNfaW5pdF90aW1lcl9kZWZhdWx0cwpAQCAtMTU1NSw2ICsxNTYzLDcgQEAKIAlzdHJ1Y3QgbmVzX2h3X25pY19ycV93cWUgKm5pY19ycWU7CiAJc3RydWN0IG5lc19od19uaWMgKm5lc25pYzsKIAlzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2OworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CiAJdTMyIHJ4X3dxZXNfcG9zdGVkID0gMDsKIAogCW5lc25pYyA9ICZuZXN2bmljLT5uaWM7CkBAIC0xNTgwLDYgKzE1ODksOSBAQAogCiAJCQlidXNfYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKG5lc2Rldi0+cGNpZGV2LAogCQkJCQlza2ItPmRhdGEsIG5lc3ZuaWMtPm1heF9mcmFtZV9zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnNrYi0+Y2JbMF07CisJCQljYi0+YnVzYWRkciA9IGJ1c19hZGRyZXNzOworCQkJY2ItPm1hcGxlbiA9IG5lc3ZuaWMtPm1heF9mcmFtZV9zaXplOwogCiAJCQluaWNfcnFlID0gJm5lc25pYy0+cnFfdmJhc2VbbmVzdm5pYy0+bmljLnJxX2hlYWRdOwogCQkJbmljX3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0xFTkdUSF8xXzBfSURYXSA9CkBAIC0xNjY5LDYgKzE2ODEsNyBAQAogCXUzMiBjcXBfaGVhZDsKIAl1MzIgY291bnRlcjsKIAl1MzIgd3FlX2NvdW50OworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CiAJdTgganVtYm9tb2RlPTA7CiAKIAkvKiBBbGxvY2F0ZSBmcmFnbWVudCwgU1EsIFJRLCBhbmQgQ1E7IFJldXNlIENFUSBiYXNlZCBvbiB0aGUgUENJIGZ1bmN0aW9uICovCkBAIC0xODQ1LDYgKzE4NTgsOSBAQAogCiAJCXBtZW0gPSBwY2lfbWFwX3NpbmdsZShuZXNkZXYtPnBjaWRldiwgc2tiLT5kYXRhLAogCQkJCW5lc3ZuaWMtPm1heF9mcmFtZV9zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmc2tiLT5jYlswXTsKKwkJY2ItPmJ1c2FkZHIgPSBwbWVtOworCQljYi0+bWFwbGVuID0gbmVzdm5pYy0+bWF4X2ZyYW1lX3NpemU7CiAKIAkJbmljX3JxZSA9ICZuZXN2bmljLT5uaWMucnFfdmJhc2VbY291bnRlcl07CiAJCW5pY19ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9MRU5HVEhfMV8wX0lEWF0gPSBjcHVfdG9fbGUzMihuZXN2bmljLT5tYXhfZnJhbWVfc2l6ZSk7CkBAIC0xODczLDYgKzE4ODksMTMgQEAKIAkJCWp1bWJvbW9kZSA9IDE7CiAJCW5lc19uaWNfaW5pdF90aW1lcl9kZWZhdWx0cyhuZXNkZXYsIGp1bWJvbW9kZSk7CiAJfQorCWlmICgobmVzZGV2LT5uZXNhZGFwdGVyLT5hbGxvd191bmFsaWduZWRfZnBkdXMpICYmCisJCShuZXNfaW5pdF9tZ3RfcXAobmVzZGV2LCBuZXRkZXYsIG5lc3ZuaWMpKSkgeworCQkJbmVzX2RlYnVnKE5FU19EQkdfSU5JVCwgIiVzOiBPdXQgb2YgbWVtb3J5IGZvciBwYXUgbmljXG4iLCBuZXRkZXYtPm5hbWUpOworCQkJbmVzX2Rlc3Ryb3lfbmljX3FwKG5lc3ZuaWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAluZXN2bmljLT5scm9fbWdyLm1heF9hZ2dyICAgICAgID0gbmVzX2xyb19tYXhfYWdncjsKIAluZXN2bmljLT5scm9fbWdyLm1heF9kZXNjICAgICAgID0gTkVTX01BWF9MUk9fREVTQ1JJUFRPUlM7CiAJbmVzdm5pYy0+bHJvX21nci5scm9fYXJyICAgICAgICA9IG5lc3ZuaWMtPmxyb19kZXNjOwpAQCAtMTg5NSwyOCArMTkxOCwyOSBAQAogCXN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYgPSBuZXN2bmljLT5uZXNkZXY7CiAJc3RydWN0IG5lc19od19jcXBfd3FlICpjcXBfd3FlOwogCXN0cnVjdCBuZXNfaHdfbmljX3NxX3dxZSAqbmljX3NxZTsKLQlzdHJ1Y3QgbmVzX2h3X25pY19ycV93cWUgKm5pY19ycWU7CiAJX19sZTE2ICp3cWVfZnJhZ21lbnRfbGVuZ3RoOwogCXUxNiAgd3FlX2ZyYWdtZW50X2luZGV4OwotCXU2NCB3cWVfZnJhZzsKIAl1MzIgY3FwX2hlYWQ7CiAJdTMyIHdxbV9jZmcwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYjsKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiOwogCWludCByZXQ7CiAKKwlpZiAobmVzZGV2LT5uZXNhZGFwdGVyLT5hbGxvd191bmFsaWduZWRfZnBkdXMpCisJCW5lc19kZXN0cm95X21ndChuZXN2bmljKTsKKwogCS8qIGNsZWFyIHdxZSBzdGFsbCBiZWZvcmUgZGVzdHJveWluZyBOSUMgUVAgKi8KIAl3cW1fY2ZnMCA9IG5lc19yZWFkX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX1dRTV9DT05GSUcwKTsKIAluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfV1FNX0NPTkZJRzAsIHdxbV9jZmcwICYgMHhGRkZGN0ZGRik7CiAKIAkvKiBGcmVlIHJlbWFpbmluZyBOSUMgcmVjZWl2ZSBidWZmZXJzICovCiAJd2hpbGUgKG5lc3ZuaWMtPm5pYy5ycV9oZWFkICE9IG5lc3ZuaWMtPm5pYy5ycV90YWlsKSB7Ci0JCW5pY19ycWUgICA9ICZuZXN2bmljLT5uaWMucnFfdmJhc2VbbmVzdm5pYy0+bmljLnJxX3RhaWxdOwotCQl3cWVfZnJhZyAgPSAodTY0KWxlMzJfdG9fY3B1KAotCQkJbmljX3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0ZSQUcwX0xPV19JRFhdKTsKLQkJd3FlX2ZyYWcgfD0gKCh1NjQpbGUzMl90b19jcHUoCi0JCQluaWNfcnFlLT53cWVfd29yZHNbTkVTX05JQ19SUV9XUUVfRlJBRzBfSElHSF9JRFhdKSk8PDMyOwotCQlwY2lfdW5tYXBfc2luZ2xlKG5lc2Rldi0+cGNpZGV2LCAoZG1hX2FkZHJfdCl3cWVfZnJhZywKLQkJCQluZXN2bmljLT5tYXhfZnJhbWVfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcnhfc2tiID0gbmVzdm5pYy0+bmljLnJ4X3NrYltuZXN2bmljLT5uaWMucnFfdGFpbF07CisJCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZyeF9za2ItPmNiWzBdOworCQlwY2lfdW5tYXBfc2luZ2xlKG5lc2Rldi0+cGNpZGV2LCBjYi0+YnVzYWRkciwgY2ItPm1hcGxlbiwKKwkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisKIAkJZGV2X2tmcmVlX3NrYihuZXN2bmljLT5uaWMucnhfc2tiW25lc3ZuaWMtPm5pYy5ycV90YWlsKytdKTsKIAkJbmVzdm5pYy0+bmljLnJxX3RhaWwgJj0gKG5lc3ZuaWMtPm5pYy5ycV9zaXplIC0gMSk7CiAJfQpAQCAtMjc3NSw2ICsyNzk5LDcgQEAKIAlzdHJ1Y3QgbmVzX2h3X25pY19zcV93cWUgKm5pY19zcWU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CiAJX19sZTE2ICp3cWVfZnJhZ21lbnRfbGVuZ3RoOwogCXUzMiBoZWFkOwogCXUzMiBjcV9zaXplOwpAQCAtMjg1OSw2ICsyODg0LDggQEAKIAkJCQlidXNfYWRkcmVzcyArPSAoKHU2NClsZTMyX3RvX2NwdShuaWNfcnFlLT53cWVfd29yZHNbTkVTX05JQ19SUV9XUUVfRlJBRzBfSElHSF9JRFhdKSkgPDwgMzI7CiAJCQkJcGNpX3VubWFwX3NpbmdsZShuZXNkZXYtPnBjaWRldiwgYnVzX2FkZHJlc3MsCiAJCQkJCQluZXN2bmljLT5tYXhfZnJhbWVfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmcnhfc2tiLT5jYlswXTsKKwkJCQljYi0+YnVzYWRkciA9IDA7CiAJCQkJLyogcnhfc2tiLT50YWlsID0gcnhfc2tiLT5kYXRhICsgcnhfcGt0X3NpemU7ICovCiAJCQkJLyogcnhfc2tiLT5sZW4gPSByeF9wa3Rfc2l6ZTsgKi8KIAkJCQlyeF9za2ItPmxlbiA9IDA7ICAvKiBUT0RPOiBzZWUgaWYgdGhpcyBpcyBuZWNlc3NhcnkgKi8KQEAgLTI5ODMsNiArMzAxMCw3IEBACiB9CiAKIAorCiAvKioKICAqIG5lc19jcXBfY2VfaGFuZGxlcgogICovCkBAIC0yOTk3LDYgKzMwMjUsOCBAQAogCXUzMiBjcV9zaXplOwogCXUzMiBjcWVfY291bnQ9MDsKIAl1MzIgZXJyb3JfY29kZTsKKwl1MzIgb3Bjb2RlOworCXUzMiBjdHhfaW5kZXg7CiAJLyogdTMyIGNvdW50ZXI7ICovCiAKIAloZWFkID0gY3EtPmNxX2hlYWQ7CkBAIC0zMDA3LDEyICszMDM3LDkgQEAKIAkJLyogbmVzX2RlYnVnKE5FU19EQkdfQ1FQLCAiaGVhZD0ldSBjcWVfd29yZHM9JTA4WFxuIiwgaGVhZCwKIAkJCSAgbGUzMl90b19jcHUoY3EtPmNxX3ZiYXNlW2hlYWRdLmNxZV93b3Jkc1tORVNfQ1FFX09QQ09ERV9JRFhdKSk7ICovCiAKLQkJaWYgKGxlMzJfdG9fY3B1KGNxLT5jcV92YmFzZVtoZWFkXS5jcWVfd29yZHNbTkVTX0NRRV9PUENPREVfSURYXSkgJiBORVNfQ1FFX1ZBTElEKSB7Ci0JCQl1NjR0ZW1wID0gKCgodTY0KShsZTMyX3RvX2NwdShjcS0+Y3FfdmJhc2VbaGVhZF0uCi0JCQkJCWNxZV93b3Jkc1tORVNfQ1FFX0NPTVBfQ09NUF9DVFhfSElHSF9JRFhdKSkpIDw8IDMyKSB8Ci0JCQkJCSgodTY0KShsZTMyX3RvX2NwdShjcS0+Y3FfdmJhc2VbaGVhZF0uCi0JCQkJCWNxZV93b3Jkc1tORVNfQ1FFX0NPTVBfQ09NUF9DVFhfTE9XX0lEWF0pKSk7Ci0JCQljcXAgPSAqKChzdHJ1Y3QgbmVzX2h3X2NxcCAqKikmdTY0dGVtcCk7CisJCW9wY29kZSA9IGxlMzJfdG9fY3B1KGNxLT5jcV92YmFzZVtoZWFkXS5jcWVfd29yZHNbTkVTX0NRRV9PUENPREVfSURYXSk7CisJCWlmIChvcGNvZGUgJiBORVNfQ1FFX1ZBTElEKSB7CisJCQljcXAgPSAmbmVzZGV2LT5jcXA7CiAKIAkJCWVycm9yX2NvZGUgPSBsZTMyX3RvX2NwdShjcS0+Y3FfdmJhc2VbaGVhZF0uY3FlX3dvcmRzW05FU19DUUVfRVJST1JfQ09ERV9JRFhdKTsKIAkJCWlmIChlcnJvcl9jb2RlKSB7CkBAIC0zMDIxLDE1ICszMDQ4LDE0IEBACiAJCQkJCQlsZTMyX3RvX2NwdShjcS0+Y3FfdmJhc2VbaGVhZF0uY3FlX3dvcmRzW05FU19DUUVfT1BDT0RFX0lEWF0pJjB4M2YsCiAJCQkJCQkodTE2KShlcnJvcl9jb2RlID4+IDE2KSwKIAkJCQkJCSh1MTYpZXJyb3JfY29kZSk7Ci0JCQkJbmVzX2RlYnVnKE5FU19EQkdfQ1FQLCAiY3FwOiBxcF9pZD0ldSwgc3FfaGVhZD0ldSwgc3FfdGFpbD0ldVxuIiwKLQkJCQkJCWNxcC0+cXBfaWQsIGNxcC0+c3FfaGVhZCwgY3FwLT5zcV90YWlsKTsKIAkJCX0KIAotCQkJdTY0dGVtcCA9ICgoKHU2NCkobGUzMl90b19jcHUobmVzZGV2LT5jcXAuc3FfdmJhc2VbY3FwLT5zcV90YWlsXS4KLQkJCQkJd3FlX3dvcmRzW05FU19DUVBfV1FFX0NPTVBfU0NSQVRDSF9ISUdIX0lEWF0pKSkgPDwgMzIpIHwKLQkJCQkJKCh1NjQpKGxlMzJfdG9fY3B1KG5lc2Rldi0+Y3FwLnNxX3ZiYXNlW2NxcC0+c3FfdGFpbF0uCi0JCQkJCXdxZV93b3Jkc1tORVNfQ1FQX1dRRV9DT01QX1NDUkFUQ0hfTE9XX0lEWF0pKSk7Ci0JCQljcXBfcmVxdWVzdCA9ICooKHN0cnVjdCBuZXNfY3FwX3JlcXVlc3QgKiopJnU2NHRlbXApOworCQkJdTY0dGVtcCA9ICgoKHU2NCkobGUzMl90b19jcHUoY3EtPmNxX3ZiYXNlW2hlYWRdLgorCQkJCQljcWVfd29yZHNbTkVTX0NRRV9DT01QX0NPTVBfQ1RYX0hJR0hfSURYXSkpKSA8PCAzMikgfAorCQkJCQkoKHU2NCkobGUzMl90b19jcHUoY3EtPmNxX3ZiYXNlW2hlYWRdLgorCQkJCQljcWVfd29yZHNbTkVTX0NRRV9DT01QX0NPTVBfQ1RYX0xPV19JRFhdKSkpOworCisJCQljcXBfcmVxdWVzdCA9IChzdHJ1Y3QgbmVzX2NxcF9yZXF1ZXN0ICopKHVuc2lnbmVkIGxvbmcpdTY0dGVtcDsKIAkJCWlmIChjcXBfcmVxdWVzdCkgewogCQkJCWlmIChjcXBfcmVxdWVzdC0+d2FpdGluZykgewogCQkJCQkvKiBuZXNfZGVidWcoTkVTX0RCR19DUVAsICIlczogV2FraW5nIHVwIHJlcXVlc3RvclxuIik7ICovCkBAIC0zMDc1LDkgKzMxMDEsMTUgQEAKIAkJY3FwX3dxZSA9ICZuZXNkZXYtPmNxcC5zcV92YmFzZVtoZWFkXTsKIAkJbWVtY3B5KGNxcF93cWUsICZjcXBfcmVxdWVzdC0+Y3FwX3dxZSwgc2l6ZW9mKCpjcXBfd3FlKSk7CiAJCWJhcnJpZXIoKTsKLQkJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX0NPTVBfU0NSQVRDSF9MT1dfSURYXSA9CisKKwkJb3Bjb2RlID0gY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX09QQ09ERV9JRFhdOworCQlpZiAoKG9wY29kZSAmIE5FU19DUVBfT1BDT0RFX01BU0spID09IE5FU19DUVBfRE9XTkxPQURfU0VHTUVOVCkKKwkJCWN0eF9pbmRleCA9IE5FU19DUVBfV1FFX0RMX0NPTVBfQ1RYX0xPV19JRFg7CisJCWVsc2UKKwkJCWN0eF9pbmRleCA9IE5FU19DUVBfV1FFX0NPTVBfQ1RYX0xPV19JRFg7CisJCWNxcF93cWUtPndxZV93b3Jkc1tjdHhfaW5kZXhdID0KIAkJCWNwdV90b19sZTMyKCh1MzIpKCh1bnNpZ25lZCBsb25nKWNxcF9yZXF1ZXN0KSk7Ci0JCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9DT01QX1NDUkFUQ0hfSElHSF9JRFhdID0KKwkJY3FwX3dxZS0+d3FlX3dvcmRzW2N0eF9pbmRleCArIDFdID0KIAkJCWNwdV90b19sZTMyKCh1MzIpKHVwcGVyXzMyX2JpdHMoKHVuc2lnbmVkIGxvbmcpY3FwX3JlcXVlc3QpKSk7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NRUCwgIkNRUCByZXF1ZXN0ICVwIChvcGNvZGUgMHglMDJYKSBwdXQgb24gQ1FQcyBTUSB3cWUldS5cbiIsCiAJCQkJY3FwX3JlcXVlc3QsIGxlMzJfdG9fY3B1KGNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9PUENPREVfSURYXSkmMHgzZiwgaGVhZCk7CkBAIC0zMDkzLDcgKzMxMjUsNiBAQAogCW5lc19yZWFkMzIobmVzZGV2LT5yZWdzK05FU19DUUVfQUxMT0MpOwogfQogCi0KIHN0YXRpYyB1OCAqbG9jYXRlX21wYSh1OCAqcGt0LCB1MzIgYWVxX2luZm8pCiB7CiAJaWYgKGFlcV9pbmZvICYgTkVTX0FFUUVfUTJfREFUQV9FVEhFUk5FVCkgewpAQCAtMzU1Myw5ICszNTg0LDkgQEAKIAogCWFlcWVfY3FfaWQgPSBsZTMyX3RvX2NwdShhZXFlLT5hZXFlX3dvcmRzW05FU19BRVFFX0NPTVBfUVBfQ1FfSURfSURYXSk7CiAJaWYgKGFlcV9pbmZvICYgTkVTX0FFUUVfUVApIHsKLQkJaWYgKCghbmVzX2lzX3Jlc291cmNlX2FsbG9jYXRlZChuZXNhZGFwdGVyLCBuZXNhZGFwdGVyLT5hbGxvY2F0ZWRfcXBzLAotCQkJCWFlcWVfY3FfaWQpKSB8fAotCQkJCShhdG9taWNfcmVhZCgmbmVzcXAtPmNsb3NlX3RpbWVyX3N0YXJ0ZWQpKSkKKwkJaWYgKCFuZXNfaXNfcmVzb3VyY2VfYWxsb2NhdGVkKG5lc2FkYXB0ZXIsCisJCQkJbmVzYWRhcHRlci0+YWxsb2NhdGVkX3FwcywKKwkJCQlhZXFlX2NxX2lkKSkKIAkJCXJldHVybjsKIAl9CiAKQEAgLTM1NjYsOCArMzU5Nyw3IEBACiAKIAkJCWlmIChhdG9taWNfaW5jX3JldHVybigmbmVzcXAtPmNsb3NlX3RpbWVyX3N0YXJ0ZWQpID09IDEpIHsKIAkJCQlpZiAoKHRjcF9zdGF0ZSA9PSBORVNfQUVRRV9UQ1BfU1RBVEVfQ0xPU0VfV0FJVCkgJiYKLQkJCQkJKG5lc3FwLT5pYnFwX3N0YXRlID09IElCX1FQU19SVFMpICYmCi0JCQkJCSgobmVzYWRhcHRlci0+ZWVwcm9tX3ZlcnNpb24gPj4gMTYpICE9IE5FU19BMCkpIHsKKwkJCQkJKG5lc3FwLT5pYnFwX3N0YXRlID09IElCX1FQU19SVFMpKSB7CiAJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZuZXNxcC0+bG9jaywgZmxhZ3MpOwogCQkJCQluZXNxcC0+aHdfaXdhcnBfc3RhdGUgPSBpd2FycF9zdGF0ZTsKIAkJCQkJbmVzcXAtPmh3X3RjcF9zdGF0ZSA9IHRjcF9zdGF0ZTsKQEAgLTM1OTQsOSArMzYyNCwxMCBAQAogCQkJCXJldHVybjsKIAkJCX0KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZuZXNxcC0+bG9jaywgZmxhZ3MpOwotCQkJbmVzcXAtPmh3X2l3YXJwX3N0YXRlID0gTkVTX0FFUUVfSVdBUlBfU1RBVEVfQ0xPU0lORzsKKwkJCW5lc3FwLT5od19pd2FycF9zdGF0ZSA9IGl3YXJwX3N0YXRlOworCQkJbmVzcXAtPmh3X3RjcF9zdGF0ZSA9IHRjcF9zdGF0ZTsKKwkJCW5lc3FwLT5sYXN0X2FlcSA9IGFzeW5jX2V2ZW50X2lkOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPmxvY2ssIGZsYWdzKTsKLQkJCW5lc19od19tb2RpZnlfcXAobmVzZGV2LCBuZXNxcCwgTkVTX0NRUF9RUF9JV0FSUF9TVEFURV9DTE9TSU5HLCAwLCAwKTsKIAkJCW5lc19jbV9kaXNjb25uKG5lc3FwKTsKIAkJCWJyZWFrOwogCkBAIC0zNjk0LDcgKzM3MjUsOSBAQAogCQljYXNlIE5FU19BRVFFX0FFSURfUk9FX0lOVkFMSURfUkRNQV9XUklURV9PUl9SRUFEX1JFU1A6CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJRUFsldV0gYXN5bmNfZXZlbnRfaWQ9MHglMDRYIElCX0VWRU5UX1FQX0ZBVEFMXG4iLAogCQkJCQluZXNxcC0+aHdxcC5xcF9pZCwgYXN5bmNfZXZlbnRfaWQpOwotCQkJbmVzX3Rlcm1pbmF0ZV9jb25uZWN0aW9uKG5lc2RldiwgbmVzcXAsIGFlcWUsIElCX0VWRU5UX1FQX0ZBVEFMKTsKKwkJCXByaW50X2lwKG5lc3FwLT5jbV9ub2RlKTsKKwkJCWlmICghYXRvbWljX3JlYWQoJm5lc3FwLT5jbG9zZV90aW1lcl9zdGFydGVkKSkKKwkJCQluZXNfdGVybWluYXRlX2Nvbm5lY3Rpb24obmVzZGV2LCBuZXNxcCwgYWVxZSwgSUJfRVZFTlRfUVBfRkFUQUwpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBORVNfQUVRRV9BRUlEX0NRX09QRVJBVElPTl9FUlJPUjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5oCmluZGV4IGMzMjQxNDcuLjBiNTkwZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuaApAQCAtNDcsNiArNDcsMTEgQEAKICNkZWZpbmUgTkVTX01VTFRJQ0FTVF9QRl9NQVggOAogI2RlZmluZSBORVNfQTAgMwogCisjZGVmaW5lIE5FU19FTkFCTEVfUEFVIDB4MDcwMDAwMDEKKyNkZWZpbmUgTkVTX0RJU0FCTEVfUEFVIDB4MDcwMDAwMDAKKyNkZWZpbmUgTkVTX1BBVV9DT1VOVEVSIDEwCisjZGVmaW5lIE5FU19DUVBfT1BDT0RFX01BU0sgMHgzZgorCiBlbnVtIHBjaV9yZWdzIHsKIAlORVNfSU5UX1NUQVQgPSAweDAwMDAsCiAJTkVTX0lOVF9NQVNLID0gMHgwMDA0LApAQCAtNzMsOCArNzgsMTAgQEAKIAlORVNfSURYX1FQX0NPTlRST0wgPSAweDAwNDAsCiAJTkVTX0lEWF9GTE1fQ09OVFJPTCA9IDB4MDA4MCwKIAlORVNfSURYX0lOVF9DUFVfU1RBVFVTID0gMHgwMGEwLAorCU5FU19JRFhfR1BSX1RSSUdHRVIgPSAweDAwYmMsCiAJTkVTX0lEWF9HUElPX0NPTlRST0wgPSAweDAwZjAsCiAJTkVTX0lEWF9HUElPX0RBVEEgPSAweDAwZjQsCisJTkVTX0lEWF9HUFIyID0gMHgwMTBjLAogCU5FU19JRFhfVENQX0NPTkZJRzAgPSAweDAxZTQsCiAJTkVTX0lEWF9UQ1BfVElNRVJfQ09ORklHID0gMHgwMWVjLAogCU5FU19JRFhfVENQX05PVyA9IDB4MDFmMCwKQEAgLTIwMiw2ICsyMDksNyBAQAogCU5FU19DUVBfUkVHSVNURVJfU0hBUkVEX1NUQUcgPSAweDBjLAogCU5FU19DUVBfREVBTExPQ0FURV9TVEFHID0gMHgwZCwKIAlORVNfQ1FQX01BTkFHRV9BUlBfQ0FDSEUgPSAweDBmLAorCU5FU19DUVBfRE9XTkxPQURfU0VHTUVOVCA9IDB4MTAsCiAJTkVTX0NRUF9TVVNQRU5EX1FQUyA9IDB4MTEsCiAJTkVTX0NRUF9VUExPQURfQ09OVEVYVCA9IDB4MTMsCiAJTkVTX0NRUF9DUkVBVEVfQ0VRID0gMHgxNiwKQEAgLTIxMCw3ICsyMTgsOCBAQAogCU5FU19DUVBfREVTVFJPWV9BRVEgPSAweDFiLAogCU5FU19DUVBfTE1JX0FDQ0VTUyA9IDB4MjAsCiAJTkVTX0NRUF9GTFVTSF9XUUVTID0gMHgyMiwKLQlORVNfQ1FQX01BTkFHRV9BUEJWVCA9IDB4MjMKKwlORVNfQ1FQX01BTkFHRV9BUEJWVCA9IDB4MjMsCisJTkVTX0NRUF9NQU5BR0VfUVVBRF9IQVNIID0gMHgyNQogfTsKIAogZW51bSBuZXNfY3FwX3dxZV93b3JkX2lkeCB7CkBAIC0yMjIsNiArMjMxLDE0IEBACiAJTkVTX0NRUF9XUUVfQ09NUF9TQ1JBVENIX0hJR0hfSURYID0gNSwKIH07CiAKK2VudW0gbmVzX2NxcF93cWVfd29yZF9kb3dubG9hZF9pZHggeyAvKiBmb3JtYXQgZGlmZmVycyBmcm9tIG90aGVyIGNxcCBvcHMgKi8KKwlORVNfQ1FQX1dRRV9ETF9PUENPREVfSURYID0gMCwKKwlORVNfQ1FQX1dRRV9ETF9DT01QX0NUWF9MT1dfSURYID0gMSwKKwlORVNfQ1FQX1dRRV9ETF9DT01QX0NUWF9ISUdIX0lEWCA9IDIsCisJTkVTX0NRUF9XUUVfRExfTEVOR1RIXzBfVE9UQUxfSURYID0gMworCS8qIEZvciBpbmRleCB2YWx1ZXMgNC0xNSB1c2UgTkVTX05JQ19TUV9XUUVfIHZhbHVlcyAqLworfTsKKwogZW51bSBuZXNfY3FwX2NxX3dxZXdvcmRfaWR4IHsKIAlORVNfQ1FQX0NRX1dRRV9QQkxfTE9XX0lEWCA9IDYsCiAJTkVTX0NRUF9DUV9XUUVfUEJMX0hJR0hfSURYID0gNywKQEAgLTI0Miw2ICsyNTksNyBAQAogCU5FU19DUVBfU1RBR19XUUVfUEJMX0xFTl9JRFggPSAxNAogfTsKIAorI2RlZmluZSBORVNfQ1FQX09QX0xPR0lDQUxfUE9SVF9TSElGVCAyNgogI2RlZmluZSBORVNfQ1FQX09QX0lXQVJQX1NUQVRFX1NISUZUIDI4CiAjZGVmaW5lIE5FU19DUVBfT1BfVEVSTUxFTl9TSElGVCAgICAgMjgKIApAQCAtNTk5LDYgKzYxNyw3IEBACiAKIGVudW0gbmVzX25pY19jcWVfd29yZF9pZHggewogCU5FU19OSUNfQ1FFX0FDQ1FQX0lEX0lEWCA9IDAsCisJTkVTX05JQ19DUUVfSEFTSF9SQ1ZOWFQgPSAxLAogCU5FU19OSUNfQ1FFX1RBR19QS1RfVFlQRV9JRFggPSAyLAogCU5FU19OSUNfQ1FFX01JU0NfSURYID0gMywKIH07CkBAIC0xMDA1LDYgKzEwMjQsMTEgQEAKICNkZWZpbmUgTkVTX05JQ19DUV9ET1dOV0FSRF9UUkVORCAgIDE2CiAjZGVmaW5lIE5FU19QRlRfU0laRQkJICAgIDQ4CiAKKyNkZWZpbmUgTkVTX01HVF9XUV9DT1VOVCAzMgorI2RlZmluZSBORVNfTUdUX0NUWF9TSVpFICgoTkVTX05JQ19DVFhfUlFfU0laRV8zMikgfCAoTkVTX05JQ19DVFhfU1FfU0laRV8zMikpCisjZGVmaW5lIE5FU19NR1RfUVBfT0ZGU0VUIDM2CisjZGVmaW5lIE5FU19NR1RfUVBfQ09VTlQgNAorCiBzdHJ1Y3QgbmVzX2h3X3R1bmVfdGltZXIgewogICAgIC8qIHUxNiBjcV9jb3VudDsgKi8KICAgICB1MTYgdGhyZXNob2xkX2xvdzsKQEAgLTExMTgsNiArMTE0Miw3IEBACiAJdTMyIGV0X3JhdGVfc2FtcGxlX2ludGVydmFsOwogCXUzMiB0aW1lcl9pbnRfbGltaXQ7CiAJdTMyIHdxbV9xdWFudGE7CisJdTggYWxsb3dfdW5hbGlnbmVkX2ZwZHVzOwogCiAJLyogQWRhcHRlciBiYXNlIE1BQyBhZGRyZXNzICovCiAJdTMyIG1hY19hZGRyX2xvdzsKQEAgLTEyNTEsNiArMTI3NiwxNCBAQAogCWVudW0gaWJfZXZlbnRfdHlwZSBkZWxheWVkX2V2ZW50OwogCWVudW0gaWJfZXZlbnRfdHlwZSBsYXN0X2Rpc3BhdGNoZWRfZXZlbnQ7CiAJc3BpbmxvY2tfdCBwb3J0X2liZXZlbnRfbG9jazsKKwl1MzIgbWd0X21lbV9zaXplOworCXZvaWQgKm1ndF92YmFzZTsKKwlkbWFfYWRkcl90IG1ndF9wYmFzZTsKKwlzdHJ1Y3QgbmVzX3ZuaWNfbWd0ICptZ3R2bmljW05FU19NR1RfUVBfQ09VTlRdOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWd0X3RocmVhZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBtZ3Rfd2FpdF9xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIG1ndF9za2JfbGlzdDsKKwogfTsKIAogc3RydWN0IG5lc19pYl9kZXZpY2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbWd0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19tZ3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2IyYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbWd0LmMKQEAgLTAsMCArMSwxMTYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwOSBJbnRlbC1ORSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSAibmVzLmgiCisjaW5jbHVkZSAibmVzX21ndC5oIgorCithdG9taWNfdCBwYXVfcXBzX2NyZWF0ZWQ7CithdG9taWNfdCBwYXVfcXBzX2Rlc3Ryb3llZDsKKworc3RhdGljIHZvaWQgbmVzX3JlcGxlbmlzaF9tZ3RfcnEoc3RydWN0IG5lc192bmljX21ndCAqbWd0dm5pYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9hZGRyX3QgYnVzX2FkZHJlc3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmVzX2h3X25pY19ycV93cWUgKm5pY19ycWU7CisJc3RydWN0IG5lc19od19tZ3QgKm5lc21ndDsKKwlzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2OworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CisJdTMyIHJ4X3dxZXNfcG9zdGVkID0gMDsKKworCW5lc21ndCA9ICZtZ3R2bmljLT5tZ3Q7CisJbmVzZGV2ID0gbWd0dm5pYy0+bmVzdm5pYy0+bmVzZGV2OworCXNwaW5fbG9ja19pcnFzYXZlKCZuZXNtZ3QtPnJxX2xvY2ssIGZsYWdzKTsKKwlpZiAobmVzbWd0LT5yZXBsZW5pc2hpbmdfcnEgIT0gMCkgeworCQlpZiAoKChuZXNtZ3QtPnJxX3NpemUgLSAxKSA9PSBhdG9taWNfcmVhZCgmbWd0dm5pYy0+cnhfc2tic19uZWVkZWQpKSAmJgorCQkgICAgKGF0b21pY19yZWFkKCZtZ3R2bmljLT5yeF9za2JfdGltZXJfcnVubmluZykgPT0gMCkpIHsKKwkJCWF0b21pY19zZXQoJm1ndHZuaWMtPnJ4X3NrYl90aW1lcl9ydW5uaW5nLCAxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5lc21ndC0+cnFfbG9jaywgZmxhZ3MpOworCQkJbWd0dm5pYy0+cnFfd3Flc190aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOyAgICAgIC8qIDEvMiBzZWNvbmQgKi8KKwkJCWFkZF90aW1lcigmbWd0dm5pYy0+cnFfd3Flc190aW1lcik7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNtZ3QtPnJxX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm47CisJfQorCW5lc21ndC0+cmVwbGVuaXNoaW5nX3JxID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNtZ3QtPnJxX2xvY2ssIGZsYWdzKTsKKwlkbyB7CisJCXNrYiA9IGRldl9hbGxvY19za2IobWd0dm5pYy0+bmVzdm5pYy0+bWF4X2ZyYW1lX3NpemUpOworCQlpZiAoc2tiKSB7CisJCQlza2ItPmRldiA9IG1ndHZuaWMtPm5lc3ZuaWMtPm5ldGRldjsKKworCQkJYnVzX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShuZXNkZXYtPnBjaWRldiwKKwkJCQkJCSAgICAgc2tiLT5kYXRhLCBtZ3R2bmljLT5uZXN2bmljLT5tYXhfZnJhbWVfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCQkJY2ItPmJ1c2FkZHIgPSBidXNfYWRkcmVzczsKKwkJCWNiLT5tYXBsZW4gPSBtZ3R2bmljLT5uZXN2bmljLT5tYXhfZnJhbWVfc2l6ZTsKKworCQkJbmljX3JxZSA9ICZuZXNtZ3QtPnJxX3ZiYXNlW21ndHZuaWMtPm1ndC5ycV9oZWFkXTsKKwkJCW5pY19ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9MRU5HVEhfMV8wX0lEWF0gPQorCQkJCWNwdV90b19sZTMyKG1ndHZuaWMtPm5lc3ZuaWMtPm1heF9mcmFtZV9zaXplKTsKKwkJCW5pY19ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9MRU5HVEhfM18yX0lEWF0gPSAwOworCQkJbmljX3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0ZSQUcwX0xPV19JRFhdID0KKwkJCQljcHVfdG9fbGUzMigodTMyKWJ1c19hZGRyZXNzKTsKKwkJCW5pY19ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9GUkFHMF9ISUdIX0lEWF0gPQorCQkJCWNwdV90b19sZTMyKCh1MzIpKCh1NjQpYnVzX2FkZHJlc3MgPj4gMzIpKTsKKwkJCW5lc21ndC0+cnhfc2tiW25lc21ndC0+cnFfaGVhZF0gPSBza2I7CisJCQluZXNtZ3QtPnJxX2hlYWQrKzsKKwkJCW5lc21ndC0+cnFfaGVhZCAmPSBuZXNtZ3QtPnJxX3NpemUgLSAxOworCQkJYXRvbWljX2RlYygmbWd0dm5pYy0+cnhfc2tic19uZWVkZWQpOworCQkJYmFycmllcigpOworCQkJaWYgKCsrcnhfd3Flc19wb3N0ZWQgPT0gMjU1KSB7CisJCQkJbmVzX3dyaXRlMzIobmVzZGV2LT5yZWdzICsgTkVTX1dRRV9BTExPQywgKHJ4X3dxZXNfcG9zdGVkIDw8IDI0KSB8IG5lc21ndC0+cXBfaWQpOworCQkJCXJ4X3dxZXNfcG9zdGVkID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZuZXNtZ3QtPnJxX2xvY2ssIGZsYWdzKTsKKwkJCWlmICgoKG5lc21ndC0+cnFfc2l6ZSAtIDEpID09IGF0b21pY19yZWFkKCZtZ3R2bmljLT5yeF9za2JzX25lZWRlZCkpICYmCisJCQkgICAgKGF0b21pY19yZWFkKCZtZ3R2bmljLT5yeF9za2JfdGltZXJfcnVubmluZykgPT0gMCkpIHsKKwkJCQlhdG9taWNfc2V0KCZtZ3R2bmljLT5yeF9za2JfdGltZXJfcnVubmluZywgMSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzbWd0LT5ycV9sb2NrLCBmbGFncyk7CisJCQkJbWd0dm5pYy0+cnFfd3Flc190aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOyAgICAgIC8qIDEvMiBzZWNvbmQgKi8KKwkJCQlhZGRfdGltZXIoJm1ndHZuaWMtPnJxX3dxZXNfdGltZXIpOworCQkJfSBlbHNlIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNtZ3QtPnJxX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoYXRvbWljX3JlYWQoJm1ndHZuaWMtPnJ4X3NrYnNfbmVlZGVkKSk7CisJYmFycmllcigpOworCWlmIChyeF93cWVzX3Bvc3RlZCkKKwkJbmVzX3dyaXRlMzIobmVzZGV2LT5yZWdzICsgTkVTX1dRRV9BTExPQywgKHJ4X3dxZXNfcG9zdGVkIDw8IDI0KSB8IG5lc21ndC0+cXBfaWQpOworCW5lc21ndC0+cmVwbGVuaXNoaW5nX3JxID0gMDsKK30KKworLyoqCisgKiBuZXNfbWd0X3JxX3dxZXNfdGltZW91dAorICovCitzdGF0aWMgdm9pZCBuZXNfbWd0X3JxX3dxZXNfdGltZW91dCh1bnNpZ25lZCBsb25nIHBhcm0pCit7CisJc3RydWN0IG5lc192bmljX21ndCAqbWd0dm5pYyA9IChzdHJ1Y3QgbmVzX3ZuaWNfbWd0ICopcGFybTsKKworCWF0b21pY19zZXQoJm1ndHZuaWMtPnJ4X3NrYl90aW1lcl9ydW5uaW5nLCAwKTsKKwlpZiAoYXRvbWljX3JlYWQoJm1ndHZuaWMtPnJ4X3NrYnNfbmVlZGVkKSkKKwkJbmVzX3JlcGxlbmlzaF9tZ3RfcnEobWd0dm5pYyk7Cit9CisKKy8qKgorICogbmVzX21ndF9mcmVlX3NrYiAtIHVubWFwIGFuZCBmcmVlIHNrYgorICovCitzdGF0aWMgdm9pZCBuZXNfbWd0X2ZyZWVfc2tiKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBkaXIpCit7CisJc3RydWN0IG5lc19yc2tiX2NiICpjYjsKKworCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCXBjaV91bm1hcF9zaW5nbGUobmVzZGV2LT5wY2lkZXYsIGNiLT5idXNhZGRyLCBjYi0+bWFwbGVuLCBkaXIpOworCWNiLT5idXNhZGRyID0gMDsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworfQorCisvKioKKyAqIG5lc19kb3dubG9hZF9jYWxsYmFjayAtIGhhbmRsZSBkb3dubG9hZCBjb21wbGV0aW9ucworICovCitzdGF0aWMgdm9pZCBuZXNfZG93bmxvYWRfY2FsbGJhY2soc3RydWN0IG5lc19kZXZpY2UgKm5lc2Rldiwgc3RydWN0IG5lc19jcXBfcmVxdWVzdCAqY3FwX3JlcXVlc3QpCit7CisJc3RydWN0IHBhdV9mcGR1X2luZm8gKmZwZHVfaW5mbyA9IGNxcF9yZXF1ZXN0LT5jcXBfY2FsbGJhY2tfcG9pbnRlcjsKKwlzdHJ1Y3QgbmVzX3FwICpuZXNxcCA9IGZwZHVfaW5mby0+bmVzcXA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmcGR1X2luZm8tPmZyYWdfY250OyBpKyspIHsKKwkJc2tiID0gZnBkdV9pbmZvLT5mcmFnc1tpXS5za2I7CisJCWlmIChmcGR1X2luZm8tPmZyYWdzW2ldLmNtcGx0KSB7CisJCQluZXNfbWd0X2ZyZWVfc2tiKG5lc2Rldiwgc2tiLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCW5lc19yZW1fcmVmX2NtX25vZGUobmVzcXAtPmNtX25vZGUpOworCQl9CisJfQorCisJaWYgKGZwZHVfaW5mby0+aGRyX3ZiYXNlKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5lc2Rldi0+cGNpZGV2LCBmcGR1X2luZm8tPmhkcl9sZW4sCisJCQkJICAgIGZwZHVfaW5mby0+aGRyX3ZiYXNlLCBmcGR1X2luZm8tPmhkcl9wYmFzZSk7CisJa2ZyZWUoZnBkdV9pbmZvKTsKK30KKworLyoqCisgKiBuZXNfZ2V0X3NlcSAtIEdldCB0aGUgc2VxLCBhY2tfc2VxIGFuZCB3aW5kb3cgZnJvbSB0aGUgcGFja2V0CisgKi8KK3N0YXRpYyB1MzIgbmVzX2dldF9zZXEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyICphY2ssIHUxNiAqd25kLCB1MzIgKmZpbl9yY3ZkLCB1MzIgKnJzdF9yY3ZkKQoreworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnNrYi0+Y2JbMF07CisJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopKGNiLT5kYXRhX3N0YXJ0ICsgRVRIX0hMRU4pOworCXN0cnVjdCB0Y3BoZHIgKnRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgoKGNoYXIgKilpcGgpICsgKDQgKiBpcGgtPmlobCkpOworCisJKmFjayA9IGJlMzJfdG9fY3B1KHRjcGgtPmFja19zZXEpOworCSp3bmQgPSBiZTE2X3RvX2NwdSh0Y3BoLT53aW5kb3cpOworCSpmaW5fcmN2ZCA9IHRjcGgtPmZpbjsKKwkqcnN0X3JjdmQgPSB0Y3BoLT5yc3Q7CisJcmV0dXJuIGJlMzJfdG9fY3B1KHRjcGgtPnNlcSk7Cit9CisKKy8qKgorICogbmVzX2dldF9uZXh0X3NrYiAtIEdldCB0aGUgbmV4dCBza2IgYmFzZWQgb24gd2hlcmUgY3VycmVudCBza2IgaXMgaW4gdGhlIHF1ZXVlCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbmVzX2dldF9uZXh0X3NrYihzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCBzdHJ1Y3QgbmVzX3FwICpuZXNxcCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG5leHRzZXEsIHUzMiAqYWNrLAorCQkJCQl1MTYgKnduZCwgdTMyICpmaW5fcmN2ZCwgdTMyICpyc3RfcmN2ZCkKK3sKKwl1MzIgc2VxOworCWJvb2wgcHJvY2Vzc2Fja3M7CisJc3RydWN0IHNrX2J1ZmYgKm9sZF9za2I7CisKKwlpZiAoc2tiKSB7CisJCS8qIENvbnRpbnVlIHByb2Nlc3NpbmcgZnBkdSAqLworCQlpZiAoc2tiLT5uZXh0ID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSZuZXNxcC0+cGF1X2xpc3QpCisJCQlnb3RvIG91dDsKKwkJc2tiID0gc2tiLT5uZXh0OworCQlwcm9jZXNzYWNrcyA9IGZhbHNlOworCX0gZWxzZSB7CisJCS8qIFN0YXJ0aW5nIGEgbmV3IG9uZSAqLworCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZuZXNxcC0+cGF1X2xpc3QpKQorCQkJZ290byBvdXQ7CisJCXNrYiA9IHNrYl9wZWVrKCZuZXNxcC0+cGF1X2xpc3QpOworCQlwcm9jZXNzYWNrcyA9IHRydWU7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJc2VxID0gbmVzX2dldF9zZXEoc2tiLCBhY2ssIHduZCwgZmluX3JjdmQsIHJzdF9yY3ZkKTsKKwkJaWYgKHNlcSA9PSBuZXh0c2VxKSB7CisJCQlpZiAoc2tiLT5sZW4gfHwgcHJvY2Vzc2Fja3MpCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoYWZ0ZXIoc2VxLCBuZXh0c2VxKSkgeworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoc2tiLT5uZXh0ID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSZuZXNxcC0+cGF1X2xpc3QpCisJCQlnb3RvIG91dDsKKworCQlvbGRfc2tiID0gc2tiOworCQlza2IgPSBza2ItPm5leHQ7CisJCXNrYl91bmxpbmsob2xkX3NrYiwgJm5lc3FwLT5wYXVfbGlzdCk7CisJCW5lc19tZ3RfZnJlZV9za2IobmVzZGV2LCBvbGRfc2tiLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJbmVzX3JlbV9yZWZfY21fbm9kZShuZXNxcC0+Y21fbm9kZSk7CisJfQorCXJldHVybiBza2I7CisKK291dDoKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBnZXRfZnBkdV9pbmZvIC0gRmluZCB0aGUgbmV4dCBjb21wbGV0ZSBmcGR1IGFuZCByZXR1cm4gaXRzIGZyYWdtZW50cy4KKyAqLworc3RhdGljIGludCBnZXRfZnBkdV9pbmZvKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHN0cnVjdCBuZXNfcXAgKm5lc3FwLAorCQkJIHN0cnVjdCBwYXVfZnBkdV9pbmZvICoqcGF1X2ZwZHVfaW5mbykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CisJc3RydWN0IG5lc19yc2tiX2NiICpjYjsKKwlzdHJ1Y3QgcGF1X2ZwZHVfaW5mbyAqZnBkdV9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgcGF1X2ZwZHVfZnJhZyBmcmFnc1tNQVhfRlBEVV9GUkFHU107CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZnBkdV9sZW4gPSAwOworCXUzMiB0bXBfbGVuOworCWludCBmcmFnX2NudCA9IDA7CisJdTMyIHRvdF9sZW47CisJdTMyIGZyYWdfdG90OworCXUzMiBhY2s7CisJdTMyIGZpbl9yY3ZkOworCXUzMiByc3RfcmN2ZDsKKwl1MTYgd25kOworCWludCBpOworCWludCByYyA9IDA7CisKKwkqcGF1X2ZwZHVfaW5mbyA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7CisJc2tiID0gbmVzX2dldF9uZXh0X3NrYihuZXNkZXYsIG5lc3FwLCBOVUxMLCBuZXNxcC0+cGF1X3Jjdl9ueHQsICZhY2ssICZ3bmQsICZmaW5fcmN2ZCwgJnJzdF9yY3ZkKTsKKwlpZiAoIXNrYikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNxcC0+cGF1X2xvY2ssIGZsYWdzKTsKKwkJZ290byBvdXQ7CisJfQorCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCWlmIChza2ItPmxlbikgeworCQlmcGR1X2xlbiA9IGJlMTZfdG9fY3B1KCooX19iZTE2ICopIHNrYi0+ZGF0YSkgKyBNUEFfRlJBTUlORzsKKwkJZnBkdV9sZW4gPSAoZnBkdV9sZW4gKyAzKSAmIDB4ZmZmZmZmZmM7CisJCXRtcF9sZW4gPSBmcGR1X2xlbjsKKworCQkvKiBTZWUgaWYgd2UgaGF2ZSBhbGwgb2YgdGhlIGZwZHUgKi8KKwkJZnJhZ190b3QgPSAwOworCQltZW1zZXQoJmZyYWdzLCAwLCBzaXplb2YgZnJhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZQRFVfRlJBR1M7IGkrKykgeworCQkJZnJhZ3NbaV0ucGh5c2FkZHIgPSBjYi0+YnVzYWRkcjsKKwkJCWZyYWdzW2ldLnBoeXNhZGRyICs9IHNrYi0+ZGF0YSAtIGNiLT5kYXRhX3N0YXJ0OworCQkJZnJhZ3NbaV0uZnJhZ19sZW4gPSBtaW4odG1wX2xlbiwgc2tiLT5sZW4pOworCQkJZnJhZ3NbaV0uc2tiID0gc2tiOworCQkJZnJhZ3NbaV0uY21wbHQgPSAoc2tiLT5sZW4gPT0gZnJhZ3NbaV0uZnJhZ19sZW4pOworCQkJZnJhZ190b3QgKz0gZnJhZ3NbaV0uZnJhZ19sZW47CisJCQlmcmFnX2NudCsrOworCisJCQl0bXBfbGVuIC09IGZyYWdzW2ldLmZyYWdfbGVuOworCQkJaWYgKHRtcF9sZW4gPT0gMCkKKwkJCQlicmVhazsKKworCQkJc2tiID0gbmVzX2dldF9uZXh0X3NrYihuZXNkZXYsIG5lc3FwLCBza2IsCisJCQkJCSAgICAgICBuZXNxcC0+cGF1X3Jjdl9ueHQgKyBmcmFnX3RvdCwgJmFjaywgJnduZCwgJmZpbl9yY3ZkLCAmcnN0X3JjdmQpOworCQkJaWYgKCFza2IpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNxcC0+cGF1X2xvY2ssIGZsYWdzKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0gZWxzZSBpZiAocnN0X3JjdmQpIHsKKwkJCQkvKiByc3QgcmVjZWl2ZWQgaW4gdGhlIG1pZGRsZSBvZiBmcGR1ICovCisJCQkJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCQkJCXNrYl91bmxpbmsoZnJhZ3NbaV0uc2tiLCAmbmVzcXAtPnBhdV9saXN0KTsKKwkJCQkJbmVzX21ndF9mcmVlX3NrYihuZXNkZXYsIGZyYWdzW2ldLnNrYiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJfQorCQkJCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCQkJCWZyYWdzWzBdLnBoeXNhZGRyID0gY2ItPmJ1c2FkZHI7CisJCQkJZnJhZ3NbMF0ucGh5c2FkZHIgKz0gc2tiLT5kYXRhIC0gY2ItPmRhdGFfc3RhcnQ7CisJCQkJZnJhZ3NbMF0uZnJhZ19sZW4gPSBza2ItPmxlbjsKKwkJCQlmcmFnc1swXS5za2IgPSBza2I7CisJCQkJZnJhZ3NbMF0uY21wbHQgPSB0cnVlOworCQkJCWZyYWdfY250ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnNrYi0+Y2JbMF07CisJCX0KKwl9IGVsc2UgeworCQkvKiBubyBkYXRhICovCisJCWZyYWdzWzBdLnBoeXNhZGRyID0gY2ItPmJ1c2FkZHI7CisJCWZyYWdzWzBdLmZyYWdfbGVuID0gMDsKKwkJZnJhZ3NbMF0uc2tiID0gc2tiOworCQlmcmFnc1swXS5jbXBsdCA9IHRydWU7CisJCWZyYWdfY250ID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNxcC0+cGF1X2xvY2ssIGZsYWdzKTsKKworCS8qIEZvdW5kIG9uZSAqLworCWZwZHVfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpmcGR1X2luZm8pLCBHRlBfQVRPTUlDKTsKKwlpZiAoZnBkdV9pbmZvID09IE5VTEwpIHsKKwkJbmVzX2RlYnVnKE5FU19EQkdfUEFVLCAiRmFpbGVkIHRvIGFsbG9jIGEgZnBkdV9pbmZvLlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZnBkdV9pbmZvLT5jcXBfcmVxdWVzdCA9IG5lc19nZXRfY3FwX3JlcXVlc3QobmVzZGV2KTsKKwlpZiAoZnBkdV9pbmZvLT5jcXBfcmVxdWVzdCA9PSBOVUxMKSB7CisJCW5lc19kZWJ1ZyhORVNfREJHX1BBVSwgIkZhaWxlZCB0byBnZXQgYSBjcXBfcmVxdWVzdC5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZmcmFnc1swXS5za2ItPmNiWzBdOworCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoY2ItPmRhdGFfc3RhcnQgKyBFVEhfSExFTik7CisJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKCgoY2hhciAqKWlwaCkgKyAoNCAqIGlwaC0+aWhsKSk7CisJZnBkdV9pbmZvLT5oZHJfbGVuID0gKCgodW5zaWduZWQgY2hhciAqKXRjcGgpICsgNCAqICh0Y3BoLT5kb2ZmKSkgLSBjYi0+ZGF0YV9zdGFydDsKKwlmcGR1X2luZm8tPmRhdGFfbGVuID0gZnBkdV9sZW47CisJdG90X2xlbiA9IGZwZHVfaW5mby0+aGRyX2xlbiArIGZwZHVfbGVuIC0gRVRIX0hMRU47CisKKwlpZiAoZnJhZ3NbMF0uY21wbHQpIHsKKwkJZnBkdV9pbmZvLT5oZHJfcGJhc2UgPSBjYi0+YnVzYWRkcjsKKwkJZnBkdV9pbmZvLT5oZHJfdmJhc2UgPSBOVUxMOworCX0gZWxzZSB7CisJCWZwZHVfaW5mby0+aGRyX3ZiYXNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobmVzZGV2LT5wY2lkZXYsCisJCQkJCQkJICAgIGZwZHVfaW5mby0+aGRyX2xlbiwgJmZwZHVfaW5mby0+aGRyX3BiYXNlKTsKKwkJaWYgKCFmcGR1X2luZm8tPmhkcl92YmFzZSkgeworCQkJbmVzX2RlYnVnKE5FU19EQkdfUEFVLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcGF1IGZpcnN0IGZyYWdcbiIpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBDb3B5IGhkcnMsIGFkanVzdGluZyBsZW4gYW5kIHNlcW51bSAqLworCQltZW1jcHkoZnBkdV9pbmZvLT5oZHJfdmJhc2UsIGNiLT5kYXRhX3N0YXJ0LCBmcGR1X2luZm8tPmhkcl9sZW4pOworCQlpcGggPSAoc3RydWN0IGlwaGRyICopKGZwZHVfaW5mby0+aGRyX3ZiYXNlICsgRVRIX0hMRU4pOworCQl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoKChjaGFyICopaXBoKSArICg0ICogaXBoLT5paGwpKTsKKwl9CisKKwlpcGgtPnRvdF9sZW4gPSBjcHVfdG9fYmUxNih0b3RfbGVuKTsKKwlpcGgtPnNhZGRyID0gY3B1X3RvX2JlMzIoMHg3ZjAwMDAwMSk7CisKKwl0Y3BoLT5zZXEgPSBjcHVfdG9fYmUzMihuZXNxcC0+cGF1X3Jjdl9ueHQpOworCXRjcGgtPmFja19zZXEgPSBjcHVfdG9fYmUzMihhY2spOworCXRjcGgtPndpbmRvdyA9IGNwdV90b19iZTE2KHduZCk7CisKKwluZXNxcC0+cGF1X3Jjdl9ueHQgKz0gZnBkdV9sZW4gKyBmaW5fcmN2ZDsKKworCW1lbWNweShmcGR1X2luZm8tPmZyYWdzLCBmcmFncywgc2l6ZW9mKGZwZHVfaW5mby0+ZnJhZ3MpKTsKKwlmcGR1X2luZm8tPmZyYWdfY250ID0gZnJhZ19jbnQ7CisJZnBkdV9pbmZvLT5uZXNxcCA9IG5lc3FwOworCSpwYXVfZnBkdV9pbmZvID0gZnBkdV9pbmZvOworCisJLyogVXBkYXRlIHNrYidzIGZvciBuZXh0IHBhc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZnJhZ19jbnQ7IGkrKykgeworCQljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmZnJhZ3NbaV0uc2tiLT5jYlswXTsKKwkJc2tiX3B1bGwoZnJhZ3NbaV0uc2tiLCBmcmFnc1tpXS5mcmFnX2xlbik7CisKKwkJaWYgKGZyYWdzW2ldLnNrYi0+bGVuID09IDApIHsKKwkJCS8qIFB1bGwgc2tiIG9mZiB0aGUgbGlzdCAtIGl0IHdpbGwgYmUgZnJlZWQgaW4gdGhlIGNhbGxiYWNrICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7CisJCQlza2JfdW5saW5rKGZyYWdzW2ldLnNrYiwgJm5lc3FwLT5wYXVfbGlzdCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNxcC0+cGF1X2xvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIExhc3Qgc2tiIHN0aWxsIGhhcyBkYXRhIHNvIHVwZGF0ZSB0aGUgc2VxICovCisJCQlpcGggPSAoc3RydWN0IGlwaGRyICopKGNiLT5kYXRhX3N0YXJ0ICsgRVRIX0hMRU4pOworCQkJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKCgoY2hhciAqKWlwaCkgKyAoNCAqIGlwaC0+aWhsKSk7CisJCQl0Y3BoLT5zZXEgPSBjcHVfdG9fYmUzMihuZXNxcC0+cGF1X3Jjdl9ueHQpOworCQl9CisJfQorCitvdXQ6CisJaWYgKHJjKSB7CisJCWlmIChmcGR1X2luZm8pIHsKKwkJCWlmIChmcGR1X2luZm8tPmNxcF9yZXF1ZXN0KQorCQkJCW5lc19wdXRfY3FwX3JlcXVlc3QobmVzZGV2LCBmcGR1X2luZm8tPmNxcF9yZXF1ZXN0KTsKKwkJCWtmcmVlKGZwZHVfaW5mbyk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGZvcndhcmRfZnBkdSAtIHNlbmQgY29tcGxldGUgZnBkdXMsIG9uZSBhdCBhIHRpbWUKKyAqLworc3RhdGljIGludCBmb3J3YXJkX2ZwZHVzKHN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgc3RydWN0IG5lc19xcCAqbmVzcXApCit7CisJc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldiA9IG5lc3ZuaWMtPm5lc2RldjsKKwlzdHJ1Y3QgcGF1X2ZwZHVfaW5mbyAqZnBkdV9pbmZvOworCXN0cnVjdCBuZXNfaHdfY3FwX3dxZSAqY3FwX3dxZTsKKwlzdHJ1Y3QgbmVzX2NxcF9yZXF1ZXN0ICpjcXBfcmVxdWVzdDsKKwl1NjQgdTY0dG1wOworCXUzMiB1MzJ0bXA7CisJaW50IHJjOworCisJd2hpbGUgKDEpIHsKKwkJcmMgPSBnZXRfZnBkdV9pbmZvKG5lc2RldiwgbmVzcXAsICZmcGR1X2luZm8pOworCQlpZiAoZnBkdV9pbmZvID09IE5VTEwpCisJCQlyZXR1cm4gcmM7CisKKwkJY3FwX3JlcXVlc3QgPSBmcGR1X2luZm8tPmNxcF9yZXF1ZXN0OworCQljcXBfd3FlID0gJmNxcF9yZXF1ZXN0LT5jcXBfd3FlOworCQluZXNfZmlsbF9pbml0X2NxcF93cWUoY3FwX3dxZSwgbmVzZGV2KTsKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19DUVBfV1FFX0RMX09QQ09ERV9JRFgsCisJCQkJICAgIE5FU19DUVBfRE9XTkxPQURfU0VHTUVOVCB8CisJCQkJICAgICgoKHUzMiluZXN2bmljLT5sb2dpY2FsX3BvcnQpIDw8IE5FU19DUVBfT1BfTE9HSUNBTF9QT1JUX1NISUZUKSk7CisKKwkJdTMydG1wID0gZnBkdV9pbmZvLT5oZHJfbGVuIDw8IDE2OworCQl1MzJ0bXAgfD0gZnBkdV9pbmZvLT5oZHJfbGVuICsgKHUzMilmcGR1X2luZm8tPmRhdGFfbGVuOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9XUUVfRExfTEVOR1RIXzBfVE9UQUxfSURYLAorCQkJCSAgICB1MzJ0bXApOworCisJCXUzMnRtcCA9IChmcGR1X2luZm8tPmZyYWdzWzFdLmZyYWdfbGVuIDw8IDE2KSB8IGZwZHVfaW5mby0+ZnJhZ3NbMF0uZnJhZ19sZW47CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfTklDX1NRX1dRRV9MRU5HVEhfMl8xX0lEWCwKKwkJCQkgICAgdTMydG1wKTsKKworCQl1MzJ0bXAgPSAoZnBkdV9pbmZvLT5mcmFnc1szXS5mcmFnX2xlbiA8PCAxNikgfCBmcGR1X2luZm8tPmZyYWdzWzJdLmZyYWdfbGVuOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX05JQ19TUV9XUUVfTEVOR1RIXzRfM19JRFgsCisJCQkJICAgIHUzMnRtcCk7CisKKwkJdTY0dG1wID0gKHU2NClmcGR1X2luZm8tPmhkcl9wYmFzZTsKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19OSUNfU1FfV1FFX0ZSQUcwX0xPV19JRFgsCisJCQkJICAgIGxvd2VyXzMyX2JpdHModTY0dG1wKSk7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfTklDX1NRX1dRRV9GUkFHMF9ISUdIX0lEWCwKKwkJCQkgICAgdXBwZXJfMzJfYml0cyh1NjR0bXAgPj4gMzIpKTsKKworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX05JQ19TUV9XUUVfRlJBRzFfTE9XX0lEWCwKKwkJCQkgICAgbG93ZXJfMzJfYml0cyhmcGR1X2luZm8tPmZyYWdzWzBdLnBoeXNhZGRyKSk7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfTklDX1NRX1dRRV9GUkFHMV9ISUdIX0lEWCwKKwkJCQkgICAgdXBwZXJfMzJfYml0cyhmcGR1X2luZm8tPmZyYWdzWzBdLnBoeXNhZGRyKSk7CisKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19OSUNfU1FfV1FFX0ZSQUcyX0xPV19JRFgsCisJCQkJICAgIGxvd2VyXzMyX2JpdHMoZnBkdV9pbmZvLT5mcmFnc1sxXS5waHlzYWRkcikpOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX05JQ19TUV9XUUVfRlJBRzJfSElHSF9JRFgsCisJCQkJICAgIHVwcGVyXzMyX2JpdHMoZnBkdV9pbmZvLT5mcmFnc1sxXS5waHlzYWRkcikpOworCisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfTklDX1NRX1dRRV9GUkFHM19MT1dfSURYLAorCQkJCSAgICBsb3dlcl8zMl9iaXRzKGZwZHVfaW5mby0+ZnJhZ3NbMl0ucGh5c2FkZHIpKTsKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19OSUNfU1FfV1FFX0ZSQUczX0hJR0hfSURYLAorCQkJCSAgICB1cHBlcl8zMl9iaXRzKGZwZHVfaW5mby0+ZnJhZ3NbMl0ucGh5c2FkZHIpKTsKKworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX05JQ19TUV9XUUVfRlJBRzRfTE9XX0lEWCwKKwkJCQkgICAgbG93ZXJfMzJfYml0cyhmcGR1X2luZm8tPmZyYWdzWzNdLnBoeXNhZGRyKSk7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfTklDX1NRX1dRRV9GUkFHNF9ISUdIX0lEWCwKKwkJCQkgICAgdXBwZXJfMzJfYml0cyhmcGR1X2luZm8tPmZyYWdzWzNdLnBoeXNhZGRyKSk7CisKKwkJY3FwX3JlcXVlc3QtPmNxcF9jYWxsYmFja19wb2ludGVyID0gZnBkdV9pbmZvOworCQljcXBfcmVxdWVzdC0+Y2FsbGJhY2sgPSAxOworCQljcXBfcmVxdWVzdC0+Y3FwX2NhbGxiYWNrID0gbmVzX2Rvd25sb2FkX2NhbGxiYWNrOworCisJCWF0b21pY19zZXQoJmNxcF9yZXF1ZXN0LT5yZWZjb3VudCwgMSk7CisJCW5lc19wb3N0X2NxcF9yZXF1ZXN0KG5lc2RldiwgY3FwX3JlcXVlc3QpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZwZHVzKHN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgc3RydWN0IG5lc19xcCAqbmVzcXApCit7CisJaW50IGFnYWluID0gMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZG8geworCQkvKiBJZ25vcmUgcmMgLSBpZiBpdCBmYWlsZWQsIHRjcCByZXRyaWVzIHdpbGwgY2F1c2UgaXQgdG8gdHJ5IGFnYWluICovCisJCWZvcndhcmRfZnBkdXMobmVzdm5pYywgbmVzcXApOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuZXNxcC0+cGF1X2xvY2ssIGZsYWdzKTsKKwkJaWYgKG5lc3FwLT5wYXVfcGVuZGluZykgeworCQkJbmVzcXAtPnBhdV9wZW5kaW5nID0gMDsKKwkJfSBlbHNlIHsKKwkJCW5lc3FwLT5wYXVfYnVzeSA9IDA7CisJCQlhZ2FpbiA9IDA7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNxcC0+cGF1X2xvY2ssIGZsYWdzKTsKKwl9IHdoaWxlIChhZ2Fpbik7Cit9CisKKy8qKgorICogcXVldWVfZnBkdXMgLSBIYW5kbGUgZnBkdSdzIHRoYXQgaHcgcGFzc2VkIHVwIHRvIHN3CisgKi8KK3N0YXRpYyB2b2lkIHF1ZXVlX2ZwZHVzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgc3RydWN0IG5lc19xcCAqbmVzcXApCit7CisJc3RydWN0IHNrX2J1ZmYgKnRtcHNrYjsKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiOworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CisJdW5zaWduZWQgY2hhciAqdGNwaF9lbmQ7CisJdTMyIHJjdl9ueHQ7CisJdTMyIHJjdl93bmQ7CisJdTMyIHNlcW51bTsKKwl1MzIgbGVuOworCWJvb2wgcHJvY2Vzc19pdCA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBNb3ZlIGRhdGEgcHRyIHRvIGFmdGVyIHRjcCBoZWFkZXIgKi8KKwlpcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOworCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgoKGNoYXIgKilpcGgpICsgKDQgKiBpcGgtPmlobCkpOworCXNlcW51bSA9IGJlMzJfdG9fY3B1KHRjcGgtPnNlcSk7CisJdGNwaF9lbmQgPSAoKChjaGFyICopdGNwaCkgKyAoNCAqIHRjcGgtPmRvZmYpKTsKKworCWxlbiA9IGJlMTZfdG9fY3B1KGlwaC0+dG90X2xlbik7CisJaWYgKHNrYi0+bGVuID4gbGVuKQorCQlza2JfdHJpbShza2IsIGxlbik7CisJc2tiX3B1bGwoc2tiLCB0Y3BoX2VuZCAtIHNrYi0+ZGF0YSk7CisKKwkvKiBJbml0aWFsaXplIHRyYWNraW5nIHZhbHVlcyAqLworCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCWNiLT5zZXFudW0gPSBzZXFudW07CisKKwkvKiBNYWtlIHN1cmUgZGF0YSBpcyBpbiB0aGUgcmVjZWl2ZSB3aW5kb3cgKi8KKwlyY3Zfbnh0ID0gbmVzcXAtPnBhdV9yY3Zfbnh0OworCXJjdl93bmQgPSBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+cmN2X3duZCk7CisJaWYgKCFiZXR3ZWVuKHNlcW51bSwgcmN2X254dCwgKHJjdl9ueHQgKyByY3Zfd25kKSkpIHsKKwkJbmVzX21ndF9mcmVlX3NrYihuZXN2bmljLT5uZXNkZXYsIHNrYiwgUENJX0RNQV9UT0RFVklDRSk7CisJCW5lc19yZW1fcmVmX2NtX25vZGUobmVzcXAtPmNtX25vZGUpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5lc3FwLT5wYXVfbG9jaywgZmxhZ3MpOworCisJaWYgKG5lc3FwLT5wYXVfYnVzeSkKKwkJbmVzcXAtPnBhdV9wZW5kaW5nID0gMTsKKwllbHNlCisJCW5lc3FwLT5wYXVfYnVzeSA9IDE7CisKKwkvKiBRdWV1ZSBza2IgYnkgc2VxdWVuY2UgbnVtYmVyICovCisJaWYgKHNrYl9xdWV1ZV9sZW4oJm5lc3FwLT5wYXVfbGlzdCkgPT0gMCkgeworCQlza2JfcXVldWVfaGVhZCgmbmVzcXAtPnBhdV9saXN0LCBza2IpOworCX0gZWxzZSB7CisJCXRtcHNrYiA9IG5lc3FwLT5wYXVfbGlzdC5uZXh0OworCQl3aGlsZSAodG1wc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSZuZXNxcC0+cGF1X2xpc3QpIHsKKwkJCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZ0bXBza2ItPmNiWzBdOworCQkJaWYgKGJlZm9yZShzZXFudW0sIGNiLT5zZXFudW0pKQorCQkJCWJyZWFrOworCQkJdG1wc2tiID0gdG1wc2tiLT5uZXh0OworCQl9CisJCXNrYl9pbnNlcnQodG1wc2tiLCBza2IsICZuZXNxcC0+cGF1X2xpc3QpOworCX0KKwlpZiAobmVzcXAtPnBhdV9zdGF0ZSA9PSBQQVVfUkVBRFkpCisJCXByb2Nlc3NfaXQgPSB0cnVlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5lc3FwLT5wYXVfbG9jaywgZmxhZ3MpOworCisJaWYgKHByb2Nlc3NfaXQpCisJCXByb2Nlc3NfZnBkdXMobmVzdm5pYywgbmVzcXApOworCisJcmV0dXJuOworfQorCisvKioKKyAqIG1ndF90aHJlYWQgLSBIYW5kbGUgbWd0IHNrYnMgaW4gYSBzYWZlIGNvbnRleHQKKyAqLworc3RhdGljIGludCBtZ3RfdGhyZWFkKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IG5lc192bmljICpuZXN2bmljID0gY29udGV4dDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobmVzdm5pYy0+bWd0X3dhaXRfcXVldWUsCisJCQkJCSBza2JfcXVldWVfbGVuKCZuZXN2bmljLT5tZ3Rfc2tiX2xpc3QpIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisJCXdoaWxlICgoc2tiX3F1ZXVlX2xlbigmbmVzdm5pYy0+bWd0X3NrYl9saXN0KSkgJiYgIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkJc2tiID0gc2tiX2RlcXVldWUoJm5lc3ZuaWMtPm1ndF9za2JfbGlzdCk7CisJCQljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmc2tiLT5jYlswXTsKKwkJCWNiLT5kYXRhX3N0YXJ0ID0gc2tiLT5kYXRhIC0gRVRIX0hMRU47CisJCQljYi0+YnVzYWRkciA9IHBjaV9tYXBfc2luZ2xlKG5lc3ZuaWMtPm5lc2Rldi0+cGNpZGV2LCBjYi0+ZGF0YV9zdGFydCwKKwkJCQkJCSAgICAgbmVzdm5pYy0+bWF4X2ZyYW1lX3NpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJcXVldWVfZnBkdXMoc2tiLCBuZXN2bmljLCBjYi0+bmVzcXApOworCQl9CisJfQorCisJLyogQ2xvc2luZyBkb3duIHNvIGRlbGV0ZSBhbnkgZW50cmllcyBvbiB0aGUgcXVldWUgKi8KKwl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmbmVzdm5pYy0+bWd0X3NrYl9saXN0KSkgeworCQlza2IgPSBza2JfZGVxdWV1ZSgmbmVzdm5pYy0+bWd0X3NrYl9saXN0KTsKKwkJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnNrYi0+Y2JbMF07CisJCW5lc19yZW1fcmVmX2NtX25vZGUoY2ItPm5lc3FwLT5jbV9ub2RlKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmVzX3F1ZXVlX3NrYnMgLSBRdWV1ZSBza2Igc28gaXQgY2FuIGJlIGhhbmRsZWQgaW4gYSB0aHJlYWQgY29udGV4dAorICovCit2b2lkIG5lc19xdWV1ZV9tZ3Rfc2ticyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBuZXNfcXAgKm5lc3FwKQoreworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CisKKwljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmc2tiLT5jYlswXTsKKwljYi0+bmVzcXAgPSBuZXNxcDsKKwlza2JfcXVldWVfdGFpbCgmbmVzdm5pYy0+bWd0X3NrYl9saXN0LCBza2IpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbmVzdm5pYy0+bWd0X3dhaXRfcXVldWUpOworfQorCit2b2lkIG5lc19kZXN0cm95X3BhdV9xcChzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCBzdHJ1Y3QgbmVzX3FwICpuZXNxcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYXRvbWljX2luYygmcGF1X3Fwc19kZXN0cm95ZWQpOworCisJLyogRnJlZSBwYWNrZXRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gZm9yd2FyZGVkICovCisJLyogTG9jayBpcyBhY3F1aXJlZCBieSBza2JfZGVxdWV1ZSB3aGVuIHJlbW92aW5nIHRoZSBza2IgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7CisJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJm5lc3FwLT5wYXVfbGlzdCkpIHsKKwkJc2tiID0gc2tiX2RlcXVldWUoJm5lc3FwLT5wYXVfbGlzdCk7CisJCW5lc19tZ3RfZnJlZV9za2IobmVzZGV2LCBza2IsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQluZXNfcmVtX3JlZl9jbV9ub2RlKG5lc3FwLT5jbV9ub2RlKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG5lc19jaGdfcWhfaGFuZGxlcihzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCBzdHJ1Y3QgbmVzX2NxcF9yZXF1ZXN0ICpjcXBfcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgcGF1X3FoX2NoZyAqcWhfY2hnID0gY3FwX3JlcXVlc3QtPmNxcF9jYWxsYmFja19wb2ludGVyOworCXN0cnVjdCBuZXNfY3FwX3JlcXVlc3QgKm5ld19yZXF1ZXN0OworCXN0cnVjdCBuZXNfaHdfY3FwX3dxZSAqY3FwX3dxZTsKKwlzdHJ1Y3QgbmVzX2FkYXB0ZXIgKm5lc2FkYXB0ZXI7CisJc3RydWN0IG5lc19xcCAqbmVzcXA7CisJc3RydWN0IG5lc192NF9xdWFkIG5lc19xdWFkOworCXUzMiBjcmNfdmFsdWU7CisJdTY0IHU2NHRlbXA7CisKKwluZXNhZGFwdGVyID0gbmVzZGV2LT5uZXNhZGFwdGVyOworCW5lc3FwID0gcWhfY2hnLT5uZXNxcDsKKworCS8qIFNob3VsZCB3ZSBoYW5kbGUgdGhlIGJhZCBjb21wbGV0aW9uICovCisJaWYgKGNxcF9yZXF1ZXN0LT5tYWpvcl9jb2RlKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkludmFsaWQgY3FwX3JlcXVlc3QgbWFqb3JfY29kZT0weCV4XG4iLAorCQkgICAgICAgY3FwX3JlcXVlc3QtPm1ham9yX2NvZGUpOworCQlXQVJOX09OKDEpOworCX0KKworCXN3aXRjaCAobmVzcXAtPnBhdV9zdGF0ZSkgeworCWNhc2UgUEFVX0RFTF9RSDoKKwkJLyogT2xkIGhhc2ggY29kZSBkZWxldGVkLCBub3cgc2V0IHRoZSBuZXcgb25lICovCisJCW5lc3FwLT5wYXVfc3RhdGUgPSBQQVVfQUREX0xCX1FIOworCQluZXdfcmVxdWVzdCA9IG5lc19nZXRfY3FwX3JlcXVlc3QobmVzZGV2KTsKKwkJaWYgKG5ld19yZXF1ZXN0ID09IE5VTEwpIHsKKwkJCW5lc19kZWJ1ZyhORVNfREJHX1BBVSwgIkZhaWxlZCB0byBnZXQgYSBuZXdfcmVxdWVzdC5cbiIpOworCQkJV0FSTl9PTigxKTsKKwkJCXJldHVybjsKKwkJfQorCisJCW1lbXNldCgmbmVzX3F1YWQsIDAsIHNpemVvZihuZXNfcXVhZCkpOworCQluZXNfcXVhZC5Ec3RJcEFkckluZGV4ID0KKwkJCWNwdV90b19sZTMyKCh1MzIpUENJX0ZVTkMobmVzZGV2LT5wY2lkZXYtPmRldmZuKSA8PCAyNCk7CisJCW5lc19xdWFkLlNyY0lwYWRyID0gY3B1X3RvX2JlMzIoMHg3ZjAwMDAwMSk7CisJCW5lc19xdWFkLlRjcFBvcnRzWzBdID0gc3dhYjE2KG5lc3FwLT5uZXNxcF9jb250ZXh0LT50Y3BQb3J0c1sxXSk7CisJCW5lc19xdWFkLlRjcFBvcnRzWzFdID0gc3dhYjE2KG5lc3FwLT5uZXNxcF9jb250ZXh0LT50Y3BQb3J0c1swXSk7CisKKwkJLyogUHJvZHVjZSBoYXNoIGtleSAqLworCQljcmNfdmFsdWUgPSBnZXRfY3JjX3ZhbHVlKCZuZXNfcXVhZCk7CisJCW5lc3FwLT5odGVfaW5kZXggPSBjcHVfdG9fYmUzMihjcmNfdmFsdWUgXiAweGZmZmZmZmZmKTsKKwkJbmVzX2RlYnVnKE5FU19EQkdfUEFVLCAibmV3IEhURSBJbmRleCA9IDB4JTA4WCwgQ1JDID0gMHglMDhYXG4iLAorCQkJICBuZXNxcC0+aHRlX2luZGV4LCBuZXNxcC0+aHRlX2luZGV4ICYgbmVzYWRhcHRlci0+aHRlX2luZGV4X21hc2spOworCisJCW5lc3FwLT5odGVfaW5kZXggJj0gbmVzYWRhcHRlci0+aHRlX2luZGV4X21hc2s7CisJCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5odGVfaW5kZXggPSBjcHVfdG9fbGUzMihuZXNxcC0+aHRlX2luZGV4KTsKKwkJbmVzcXAtPm5lc3FwX2NvbnRleHQtPmlwMCA9IGNwdV90b19sZTMyKDB4N2YwMDAwMDEpOworCQluZXNxcC0+bmVzcXBfY29udGV4dC0+cmN2X254dCA9IGNwdV90b19sZTMyKG5lc3FwLT5wYXVfcmN2X254dCk7CisKKwkJY3FwX3dxZSA9ICZuZXdfcmVxdWVzdC0+Y3FwX3dxZTsKKwkJbmVzX2ZpbGxfaW5pdF9jcXBfd3FlKGNxcF93cWUsIG5lc2Rldik7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLAorCQkJCSAgICBORVNfQ1FQX1dRRV9PUENPREVfSURYLCBORVNfQ1FQX01BTkFHRV9RVUFEX0hBU0ggfAorCQkJCSAgICBORVNfQ1FQX1FQX1RZUEVfSVdBUlAgfCBORVNfQ1FQX1FQX0NPTlRFWFRfVkFMSUQgfCBORVNfQ1FQX1FQX0lXQVJQX1NUQVRFX1JUUyk7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1dRRV9JRF9JRFgsIG5lc3FwLT5od3FwLnFwX2lkKTsKKwkJdTY0dGVtcCA9ICh1NjQpbmVzcXAtPm5lc3FwX2NvbnRleHRfcGJhc2U7CisJCXNldF93cWVfNjRiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1FQX1dRRV9DT05URVhUX0xPV19JRFgsIHU2NHRlbXApOworCisJCW5lc19kZWJ1ZyhORVNfREJHX1BBVSwgIldhaXRpbmcgZm9yIENRUCBjb21wbGV0aW9uIGZvciBhZGRpbmcgdGhlIHF1YWQgaGFzaC5cbiIpOworCisJCW5ld19yZXF1ZXN0LT5jcXBfY2FsbGJhY2tfcG9pbnRlciA9IHFoX2NoZzsKKwkJbmV3X3JlcXVlc3QtPmNhbGxiYWNrID0gMTsKKwkJbmV3X3JlcXVlc3QtPmNxcF9jYWxsYmFjayA9IG5lc19jaGdfcWhfaGFuZGxlcjsKKwkJYXRvbWljX3NldCgmbmV3X3JlcXVlc3QtPnJlZmNvdW50LCAxKTsKKwkJbmVzX3Bvc3RfY3FwX3JlcXVlc3QobmVzZGV2LCBuZXdfcmVxdWVzdCk7CisJCWJyZWFrOworCisJY2FzZSBQQVVfQUREX0xCX1FIOgorCQkvKiBTdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZWQgZnBkdSdzICovCisJCW5lc3FwLT5wYXVfc3RhdGUgPSBQQVVfUkVBRFk7CisJCXByb2Nlc3NfZnBkdXMocWhfY2hnLT5uZXN2bmljLCBxaF9jaGctPm5lc3FwKTsKKwkJa2ZyZWUocWhfY2hnKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIG5lc19jaGFuZ2VfcXVhZF9oYXNoCisgKi8KK3N0YXRpYyBpbnQgbmVzX2NoYW5nZV9xdWFkX2hhc2goc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldiwKKwkJCQlzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBuZXNfcXAgKm5lc3FwKQoreworCXN0cnVjdCBuZXNfY3FwX3JlcXVlc3QgKmNxcF9yZXF1ZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgcGF1X3FoX2NoZyAqcWhfY2hnID0gTlVMTDsKKwl1NjQgdTY0dGVtcDsKKwlzdHJ1Y3QgbmVzX2h3X2NxcF93cWUgKmNxcF93cWU7CisJaW50IHJldCA9IDA7CisKKwljcXBfcmVxdWVzdCA9IG5lc19nZXRfY3FwX3JlcXVlc3QobmVzZGV2KTsKKwlpZiAoY3FwX3JlcXVlc3QgPT0gTlVMTCkgeworCQluZXNfZGVidWcoTkVTX0RCR19QQVUsICJGYWlsZWQgdG8gZ2V0IGEgY3FwX3JlcXVlc3QuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjaGdfcWhfZXJyOworCX0KKworCXFoX2NoZyA9IGttYWxsb2Moc2l6ZW9mICpxaF9jaGcsIEdGUF9BVE9NSUMpOworCWlmIChxaF9jaGcgPT0gTlVMTCkgeworCQluZXNfZGVidWcoTkVTX0RCR19QQVUsICJGYWlsZWQgdG8gZ2V0IGEgY3FwX3JlcXVlc3QuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjaGdfcWhfZXJyOworCX0KKwlxaF9jaGctPm5lc2RldiA9IG5lc2RldjsKKwlxaF9jaGctPm5lc3ZuaWMgPSBuZXN2bmljOworCXFoX2NoZy0+bmVzcXAgPSBuZXNxcDsKKwluZXNxcC0+cGF1X3N0YXRlID0gUEFVX0RFTF9RSDsKKworCWNxcF93cWUgPSAmY3FwX3JlcXVlc3QtPmNxcF93cWU7CisJbmVzX2ZpbGxfaW5pdF9jcXBfd3FlKGNxcF93cWUsIG5lc2Rldik7CisJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsCisJCQkgICAgTkVTX0NRUF9XUUVfT1BDT0RFX0lEWCwgTkVTX0NRUF9NQU5BR0VfUVVBRF9IQVNIIHwgTkVTX0NRUF9RUF9ERUxfSFRFIHwKKwkJCSAgICBORVNfQ1FQX1FQX1RZUEVfSVdBUlAgfCBORVNfQ1FQX1FQX0NPTlRFWFRfVkFMSUQgfCBORVNfQ1FQX1FQX0lXQVJQX1NUQVRFX1JUUyk7CisJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19DUVBfV1FFX0lEX0lEWCwgbmVzcXAtPmh3cXAucXBfaWQpOworCXU2NHRlbXAgPSAodTY0KW5lc3FwLT5uZXNxcF9jb250ZXh0X3BiYXNlOworCXNldF93cWVfNjRiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1FQX1dRRV9DT05URVhUX0xPV19JRFgsIHU2NHRlbXApOworCisJbmVzX2RlYnVnKE5FU19EQkdfUEFVLCAiV2FpdGluZyBmb3IgQ1FQIGNvbXBsZXRpb24gZm9yIGRlbGV0aW5nIHRoZSBxdWFkIGhhc2guXG4iKTsKKworCWNxcF9yZXF1ZXN0LT5jcXBfY2FsbGJhY2tfcG9pbnRlciA9IHFoX2NoZzsKKwljcXBfcmVxdWVzdC0+Y2FsbGJhY2sgPSAxOworCWNxcF9yZXF1ZXN0LT5jcXBfY2FsbGJhY2sgPSBuZXNfY2hnX3FoX2hhbmRsZXI7CisJYXRvbWljX3NldCgmY3FwX3JlcXVlc3QtPnJlZmNvdW50LCAxKTsKKwluZXNfcG9zdF9jcXBfcmVxdWVzdChuZXNkZXYsIGNxcF9yZXF1ZXN0KTsKKworCXJldHVybiByZXQ7CisKK2NoZ19xaF9lcnI6CisJa2ZyZWUocWhfY2hnKTsKKwlpZiAoY3FwX3JlcXVlc3QpCisJCW5lc19wdXRfY3FwX3JlcXVlc3QobmVzZGV2LCBjcXBfcmVxdWVzdCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBuZXNfbWd0X2NlX2hhbmRsZXIKKyAqIFRoaXMgbWFuYWdlbWVudCBjb2RlIGRlYWxzIHdpdGggYW55IHBhY2tlZCBhbmQgdW5hbGlnbmVkIChwYXUpIGZwZHUncworICogdGhhdCB0aGUgaGFyZHdhcmUgY2Fubm90IGhhbmRsZS4KKyAqLworc3RhdGljIHZvaWQgbmVzX21ndF9jZV9oYW5kbGVyKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHN0cnVjdCBuZXNfaHdfbmljX2NxICpjcSkKK3sKKwlzdHJ1Y3QgbmVzX3ZuaWNfbWd0ICptZ3R2bmljID0gY29udGFpbmVyX29mKGNxLCBzdHJ1Y3QgbmVzX3ZuaWNfbWd0LCBtZ3RfY3EpOworCXN0cnVjdCBuZXNfYWRhcHRlciAqbmVzYWRhcHRlciA9IG5lc2Rldi0+bmVzYWRhcHRlcjsKKwl1MzIgaGVhZDsKKwl1MzIgY3Ffc2l6ZTsKKwl1MzIgY3FlX2NvdW50ID0gMDsKKwl1MzIgY3FlX21pc2M7CisJdTMyIHFwX2lkID0gMDsKKwl1MzIgc2tic19uZWVkZWQ7CisJdW5zaWduZWQgbG9uZyBjb250ZXh0OworCXN0cnVjdCBuZXNfcXAgKm5lc3FwOworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisJc3RydWN0IG5lc19yc2tiX2NiICpjYjsKKworCWhlYWQgPSBjcS0+Y3FfaGVhZDsKKwljcV9zaXplID0gY3EtPmNxX3NpemU7CisKKwl3aGlsZSAoMSkgeworCQljcWVfbWlzYyA9IGxlMzJfdG9fY3B1KGNxLT5jcV92YmFzZVtoZWFkXS5jcWVfd29yZHNbTkVTX05JQ19DUUVfTUlTQ19JRFhdKTsKKwkJaWYgKCEoY3FlX21pc2MgJiBORVNfTklDX0NRRV9WQUxJRCkpCisJCQlicmVhazsKKworCQluZXNxcCA9IE5VTEw7CisJCWlmIChjcWVfbWlzYyAmIE5FU19OSUNfQ1FFX0FDQ1FQX1ZBTElEKSB7CisJCQlxcF9pZCA9IGxlMzJfdG9fY3B1KGNxLT5jcV92YmFzZVtoZWFkXS5jcWVfd29yZHNbTkVTX05JQ19DUUVfQUNDUVBfSURfSURYXSk7CisJCQlxcF9pZCAmPSAweDAwMWZmZmZmOworCQkJaWYgKHFwX2lkIDwgbmVzYWRhcHRlci0+bWF4X3FwKSB7CisJCQkJY29udGV4dCA9ICh1bnNpZ25lZCBsb25nKW5lc2FkYXB0ZXItPnFwX3RhYmxlW3FwX2lkIC0gTkVTX0ZJUlNUX1FQTl07CisJCQkJbmVzcXAgPSAoc3RydWN0IG5lc19xcCAqKWNvbnRleHQ7CisJCQl9CisJCX0KKworCQlpZiAobmVzcXApIHsKKwkJCWlmIChuZXNxcC0+cGF1X21vZGUgPT0gZmFsc2UpIHsKKwkJCQluZXNxcC0+cGF1X21vZGUgPSB0cnVlOyAvKiBGaXJzdCB0aW1lIGZvciB0aGlzIHFwICovCisJCQkJbmVzcXAtPnBhdV9yY3Zfbnh0ID0gbGUzMl90b19jcHUoCisJCQkJCWNxLT5jcV92YmFzZVtoZWFkXS5jcWVfd29yZHNbTkVTX05JQ19DUUVfSEFTSF9SQ1ZOWFRdKTsKKwkJCQlza2JfcXVldWVfaGVhZF9pbml0KCZuZXNxcC0+cGF1X2xpc3QpOworCQkJCXNwaW5fbG9ja19pbml0KCZuZXNxcC0+cGF1X2xvY2spOworCQkJCWF0b21pY19pbmMoJnBhdV9xcHNfY3JlYXRlZCk7CisJCQkJbmVzX2NoYW5nZV9xdWFkX2hhc2gobmVzZGV2LCBtZ3R2bmljLT5uZXN2bmljLCBuZXNxcCk7CisJCQl9CisKKwkJCXJ4X3NrYiA9IG1ndHZuaWMtPm1ndC5yeF9za2JbbWd0dm5pYy0+bWd0LnJxX3RhaWxdOworCQkJcnhfc2tiLT5sZW4gPSAwOworCQkJc2tiX3B1dChyeF9za2IsIGNxZV9taXNjICYgMHgwMDAwZmZmZik7CisJCQlyeF9za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocnhfc2tiLCBtZ3R2bmljLT5uZXN2bmljLT5uZXRkZXYpOworCQkJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnJ4X3NrYi0+Y2JbMF07CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5lc2Rldi0+cGNpZGV2LCBjYi0+YnVzYWRkciwgY2ItPm1hcGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWNiLT5idXNhZGRyID0gMDsKKwkJCW1ndHZuaWMtPm1ndC5ycV90YWlsKys7CisJCQltZ3R2bmljLT5tZ3QucnFfdGFpbCAmPSBtZ3R2bmljLT5tZ3QucnFfc2l6ZSAtIDE7CisKKwkJCW5lc19hZGRfcmVmX2NtX25vZGUobmVzcXAtPmNtX25vZGUpOworCQkJbmVzX3F1ZXVlX21ndF9za2JzKHJ4X3NrYiwgbWd0dm5pYy0+bmVzdm5pYywgbmVzcXApOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW52YWxpZCBRUCAlZCBmb3IgcGFja2VkL3VuYWxpZ25lZCBoYW5kbGluZ1xuIiwgcXBfaWQpOworCQl9CisKKwkJY3EtPmNxX3ZiYXNlW2hlYWRdLmNxZV93b3Jkc1tORVNfTklDX0NRRV9NSVNDX0lEWF0gPSAwOworCQljcWVfY291bnQrKzsKKwkJaWYgKCsraGVhZCA+PSBjcV9zaXplKQorCQkJaGVhZCA9IDA7CisKKwkJaWYgKGNxZV9jb3VudCA9PSAyNTUpIHsKKwkJCS8qIFJlcGxlbmlzaCBtZ3QgQ1EgKi8KKwkJCW5lc193cml0ZTMyKG5lc2Rldi0+cmVncyArIE5FU19DUUVfQUxMT0MsIGNxLT5jcV9udW1iZXIgfCAoY3FlX2NvdW50IDw8IDE2KSk7CisJCQluZXNkZXYtPmN1cnJjcV9jb3VudCArPSBjcWVfY291bnQ7CisJCQljcWVfY291bnQgPSAwOworCQl9CisKKwkJc2tic19uZWVkZWQgPSBhdG9taWNfaW5jX3JldHVybigmbWd0dm5pYy0+cnhfc2tic19uZWVkZWQpOworCQlpZiAoc2tic19uZWVkZWQgPiAobWd0dm5pYy0+bWd0LnJxX3NpemUgPj4gMSkpCisJCQluZXNfcmVwbGVuaXNoX21ndF9ycShtZ3R2bmljKTsKKwl9CisKKwljcS0+Y3FfaGVhZCA9IGhlYWQ7CisJbmVzX3dyaXRlMzIobmVzZGV2LT5yZWdzICsgTkVTX0NRRV9BTExPQywgTkVTX0NRRV9BTExPQ19OT1RJRllfTkVYVCB8CisJCSAgICBjcS0+Y3FfbnVtYmVyIHwgKGNxZV9jb3VudCA8PCAxNikpOworCW5lc19yZWFkMzIobmVzZGV2LT5yZWdzICsgTkVTX0NRRV9BTExPQyk7CisJbmVzZGV2LT5jdXJyY3FfY291bnQgKz0gY3FlX2NvdW50OworfQorCisvKioKKyAqIG5lc19pbml0X21ndF9xcAorICovCitpbnQgbmVzX2luaXRfbWd0X3FwKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYykKK3sKKwlzdHJ1Y3QgbmVzX3ZuaWNfbWd0ICptZ3R2bmljOworCXUzMiBjb3VudGVyOworCXZvaWQgKnZtZW07CisJZG1hX2FkZHJfdCBwbWVtOworCXN0cnVjdCBuZXNfaHdfY3FwX3dxZSAqY3FwX3dxZTsKKwl1MzIgY3FwX2hlYWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbmVzX2h3X25pY19xcF9jb250ZXh0ICptZ3RfY29udGV4dDsKKwl1NjQgdTY0dGVtcDsKKwlzdHJ1Y3QgbmVzX2h3X25pY19ycV93cWUgKm1ndF9ycWU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgd3FlX2NvdW50OworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CisJdTMyIG1ndF9tZW1fc2l6ZTsKKwl2b2lkICptZ3RfdmJhc2U7CisJZG1hX2FkZHJfdCBtZ3RfcGJhc2U7CisJaW50IGk7CisJaW50IHJldDsKKworCS8qIEFsbG9jYXRlIHNwYWNlIHRoZSBhbGwgbWd0IFFQcyBvbmNlICovCisJbWd0dm5pYyA9IGt6YWxsb2MoTkVTX01HVF9RUF9DT1VOVCAqIHNpemVvZihzdHJ1Y3QgbmVzX3ZuaWNfbWd0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG1ndHZuaWMgPT0gTlVMTCkgeworCQluZXNfZGVidWcoTkVTX0RCR19JTklULCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWd0IHN0cnVjdHVyZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEFsbG9jYXRlIGZyYWdtZW50LCBSUSwgYW5kIENROyBSZXVzZSBDRVEgYmFzZWQgb24gdGhlIFBDSSBmdW5jdGlvbiAqLworCS8qIFdlIGFyZSBub3Qgc2VuZGluZyBmcm9tIHRoaXMgTklDIHNvIHNxIGlzIG5vdCBhbGxvY2F0ZWQgKi8KKwltZ3RfbWVtX3NpemUgPSAyNTYgKworCQkgICAgICAgKE5FU19NR1RfV1FfQ09VTlQgKiBzaXplb2Yoc3RydWN0IG5lc19od19uaWNfcnFfd3FlKSkgKworCQkgICAgICAgKE5FU19NR1RfV1FfQ09VTlQgKiBzaXplb2Yoc3RydWN0IG5lc19od19uaWNfY3FlKSkgKworCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBuZXNfaHdfbmljX3FwX2NvbnRleHQpOworCW1ndF9tZW1fc2l6ZSA9IChtZ3RfbWVtX3NpemUgKyBQQUdFX1NJWkUgLSAxKSAmIH4oUEFHRV9TSVpFIC0gMSk7CisJbWd0X3ZiYXNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobmVzZGV2LT5wY2lkZXYsIE5FU19NR1RfUVBfQ09VTlQgKiBtZ3RfbWVtX3NpemUsICZtZ3RfcGJhc2UpOworCWlmICghbWd0X3ZiYXNlKSB7CisJCWtmcmVlKG1ndHZuaWMpOworCQluZXNfZGVidWcoTkVTX0RCR19JTklULCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWd0IGhvc3QgZGVzY3JpcHRvciByaW5nc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW5lc3ZuaWMtPm1ndF9tZW1fc2l6ZSA9IE5FU19NR1RfUVBfQ09VTlQgKiBtZ3RfbWVtX3NpemU7CisJbmVzdm5pYy0+bWd0X3ZiYXNlID0gbWd0X3ZiYXNlOworCW5lc3ZuaWMtPm1ndF9wYmFzZSA9IG1ndF9wYmFzZTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5lc3ZuaWMtPm1ndF9za2JfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbmVzdm5pYy0+bWd0X3dhaXRfcXVldWUpOworCW5lc3ZuaWMtPm1ndF90aHJlYWQgPSBrdGhyZWFkX3J1bihtZ3RfdGhyZWFkLCBuZXN2bmljLCAibmVzX21ndF90aHJlYWQiKTsKKworCWZvciAoaSA9IDA7IGkgPCBORVNfTUdUX1FQX0NPVU5UOyBpKyspIHsKKwkJbWd0dm5pYy0+bmVzdm5pYyA9IG5lc3ZuaWM7CisJCW1ndHZuaWMtPm1ndC5xcF9pZCA9IG5lc2Rldi0+bWFjX2luZGV4ICsgTkVTX01HVF9RUF9PRkZTRVQgKyBpOworCQltZW1zZXQobWd0X3ZiYXNlLCAwLCBtZ3RfbWVtX3NpemUpOworCQluZXNfZGVidWcoTkVTX0RCR19JTklULCAiQWxsb2NhdGVkIG1ndCBRUCBzdHJ1Y3R1cmVzIGF0ICVwIChwaHlzID0gJTAxNmxYKSwgc2l6ZSA9ICV1LlxuIiwKKwkJCSAgbWd0X3ZiYXNlLCAodW5zaWduZWQgbG9uZyltZ3RfcGJhc2UsIG1ndF9tZW1fc2l6ZSk7CisKKwkJdm1lbSA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZyltZ3RfdmJhc2UgKyAoMjU2IC0gMSkpICYKKwkJCQl+KHVuc2lnbmVkIGxvbmcpKDI1NiAtIDEpKTsKKwkJcG1lbSA9IChkbWFfYWRkcl90KSgoKHVuc2lnbmVkIGxvbmcgbG9uZyltZ3RfcGJhc2UgKyAoMjU2IC0gMSkpICYKKwkJCQkgICAgfih1bnNpZ25lZCBsb25nIGxvbmcpKDI1NiAtIDEpKTsKKworCQlzcGluX2xvY2tfaW5pdCgmbWd0dm5pYy0+bWd0LnJxX2xvY2spOworCisJCS8qIHNldHVwIHRoZSBSUSAqLworCQltZ3R2bmljLT5tZ3QucnFfdmJhc2UgPSB2bWVtOworCQltZ3R2bmljLT5tZ3QucnFfcGJhc2UgPSBwbWVtOworCQltZ3R2bmljLT5tZ3QucnFfaGVhZCA9IDA7CisJCW1ndHZuaWMtPm1ndC5ycV90YWlsID0gMDsKKwkJbWd0dm5pYy0+bWd0LnJxX3NpemUgPSBORVNfTUdUX1dRX0NPVU5UOworCisJCS8qIHNldHVwIHRoZSBDUSAqLworCQl2bWVtICs9IChORVNfTUdUX1dRX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBuZXNfaHdfbmljX3JxX3dxZSkpOworCQlwbWVtICs9IChORVNfTUdUX1dRX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBuZXNfaHdfbmljX3JxX3dxZSkpOworCisJCW1ndHZuaWMtPm1ndF9jcS5jcV9udW1iZXIgPSBtZ3R2bmljLT5tZ3QucXBfaWQ7CisJCW1ndHZuaWMtPm1ndF9jcS5jcV92YmFzZSA9IHZtZW07CisJCW1ndHZuaWMtPm1ndF9jcS5jcV9wYmFzZSA9IHBtZW07CisJCW1ndHZuaWMtPm1ndF9jcS5jcV9oZWFkID0gMDsKKwkJbWd0dm5pYy0+bWd0X2NxLmNxX3NpemUgPSBORVNfTUdUX1dRX0NPVU5UOworCisJCW1ndHZuaWMtPm1ndF9jcS5jZV9oYW5kbGVyID0gbmVzX21ndF9jZV9oYW5kbGVyOworCisJCS8qIFNlbmQgQ3JlYXRlQ1EgcmVxdWVzdCB0byBDUVAgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5lc2Rldi0+Y3FwLmxvY2ssIGZsYWdzKTsKKwkJY3FwX2hlYWQgPSBuZXNkZXYtPmNxcC5zcV9oZWFkOworCisJCWNxcF93cWUgPSAmbmVzZGV2LT5jcXAuc3FfdmJhc2VbY3FwX2hlYWRdOworCQluZXNfZmlsbF9pbml0X2NxcF93cWUoY3FwX3dxZSwgbmVzZGV2KTsKKworCQljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfT1BDT0RFX0lEWF0gPSBjcHVfdG9fbGUzMigKKwkJCU5FU19DUVBfQ1JFQVRFX0NRIHwgTkVTX0NRUF9DUV9DRVFfVkFMSUQgfAorCQkJKCh1MzIpbWd0dm5pYy0+bWd0X2NxLmNxX3NpemUgPDwgMTYpKTsKKwkJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX0lEX0lEWF0gPSBjcHVfdG9fbGUzMigKKwkJCW1ndHZuaWMtPm1ndF9jcS5jcV9udW1iZXIgfCAoKHUzMiluZXNkZXYtPmNlcV9pbmRleCA8PCAxNikpOworCQl1NjR0ZW1wID0gKHU2NCltZ3R2bmljLT5tZ3RfY3EuY3FfcGJhc2U7CisJCXNldF93cWVfNjRiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX0NRX1dRRV9QQkxfTE9XX0lEWCwgdTY0dGVtcCk7CisJCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX0NRX1dRRV9DUV9DT05URVhUX0hJR0hfSURYXSA9IDA7CisJCXU2NHRlbXAgPSAodW5zaWduZWQgbG9uZykmbWd0dm5pYy0+bWd0X2NxOworCQljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9DUV9XUUVfQ1FfQ09OVEVYVF9MT1dfSURYXSA9IGNwdV90b19sZTMyKCh1MzIpKHU2NHRlbXAgPj4gMSkpOworCQljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9DUV9XUUVfQ1FfQ09OVEVYVF9ISUdIX0lEWF0gPQorCQkJY3B1X3RvX2xlMzIoKCh1MzIpKCh1NjR0ZW1wKSA+PiAzMykpICYgMHg3RkZGRkZGRik7CisJCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX0NRX1dRRV9ET09SQkVMTF9JTkRFWF9ISUdIX0lEWF0gPSAwOworCisJCWlmICgrK2NxcF9oZWFkID49IG5lc2Rldi0+Y3FwLnNxX3NpemUpCisJCQljcXBfaGVhZCA9IDA7CisJCWNxcF93cWUgPSAmbmVzZGV2LT5jcXAuc3FfdmJhc2VbY3FwX2hlYWRdOworCQluZXNfZmlsbF9pbml0X2NxcF93cWUoY3FwX3dxZSwgbmVzZGV2KTsKKworCQkvKiBTZW5kIENyZWF0ZVFQIHJlcXVlc3QgdG8gQ1FQICovCisJCW1ndF9jb250ZXh0ID0gKHZvaWQgKikoJm1ndHZuaWMtPm1ndF9jcS5jcV92YmFzZVttZ3R2bmljLT5tZ3RfY3EuY3Ffc2l6ZV0pOworCQltZ3RfY29udGV4dC0+Y29udGV4dF93b3Jkc1tORVNfTklDX0NUWF9NSVNDX0lEWF0gPQorCQkJY3B1X3RvX2xlMzIoKHUzMilORVNfTUdUX0NUWF9TSVpFIHwKKwkJCQkgICAgKCh1MzIpUENJX0ZVTkMobmVzZGV2LT5wY2lkZXYtPmRldmZuKSA8PCAxMikpOworCQluZXNfZGVidWcoTkVTX0RCR19JTklULCAiUlhfV0lORE9XX0JVRkZFUl9QQUdFX1RBQkxFX1NJWkUgPSAweCUwOFgsIFJYX1dJTkRPV19CVUZGRVJfU0laRSA9IDB4JTA4WFxuIiwKKwkJCSAgbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfUlhfV0lORE9XX0JVRkZFUl9QQUdFX1RBQkxFX1NJWkUpLAorCQkJICBuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9SWF9XSU5ET1dfQlVGRkVSX1NJWkUpKTsKKwkJaWYgKG5lc19yZWFkX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX1JYX1dJTkRPV19CVUZGRVJfU0laRSkgIT0gMCkKKwkJCW1ndF9jb250ZXh0LT5jb250ZXh0X3dvcmRzW05FU19OSUNfQ1RYX01JU0NfSURYXSB8PSBjcHVfdG9fbGUzMihORVNfTklDX0JBQ0tfU1RPUkUpOworCisJCXU2NHRlbXAgPSAodTY0KW1ndHZuaWMtPm1ndC5ycV9wYmFzZTsKKwkJbWd0X2NvbnRleHQtPmNvbnRleHRfd29yZHNbTkVTX05JQ19DVFhfU1FfTE9XX0lEWF0gPSBjcHVfdG9fbGUzMigodTMyKXU2NHRlbXApOworCQltZ3RfY29udGV4dC0+Y29udGV4dF93b3Jkc1tORVNfTklDX0NUWF9TUV9ISUdIX0lEWF0gPSBjcHVfdG9fbGUzMigodTMyKSh1NjR0ZW1wID4+IDMyKSk7CisJCXU2NHRlbXAgPSAodTY0KW1ndHZuaWMtPm1ndC5ycV9wYmFzZTsKKwkJbWd0X2NvbnRleHQtPmNvbnRleHRfd29yZHNbTkVTX05JQ19DVFhfUlFfTE9XX0lEWF0gPSBjcHVfdG9fbGUzMigodTMyKXU2NHRlbXApOworCQltZ3RfY29udGV4dC0+Y29udGV4dF93b3Jkc1tORVNfTklDX0NUWF9SUV9ISUdIX0lEWF0gPSBjcHVfdG9fbGUzMigodTMyKSh1NjR0ZW1wID4+IDMyKSk7CisKKwkJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX09QQ09ERV9JRFhdID0gY3B1X3RvX2xlMzIoTkVTX0NRUF9DUkVBVEVfUVAgfAorCQkJCQkJCQkJIE5FU19DUVBfUVBfVFlQRV9OSUMpOworCQljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfSURfSURYXSA9IGNwdV90b19sZTMyKG1ndHZuaWMtPm1ndC5xcF9pZCk7CisJCXU2NHRlbXAgPSAodTY0KW1ndHZuaWMtPm1ndF9jcS5jcV9wYmFzZSArCisJCQkgIChtZ3R2bmljLT5tZ3RfY3EuY3Ffc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbmVzX2h3X25pY19jcWUpKTsKKwkJc2V0X3dxZV82NGJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19DUVBfUVBfV1FFX0NPTlRFWFRfTE9XX0lEWCwgdTY0dGVtcCk7CisKKwkJaWYgKCsrY3FwX2hlYWQgPj0gbmVzZGV2LT5jcXAuc3Ffc2l6ZSkKKwkJCWNxcF9oZWFkID0gMDsKKwkJbmVzZGV2LT5jcXAuc3FfaGVhZCA9IGNxcF9oZWFkOworCisJCWJhcnJpZXIoKTsKKworCQkvKiBSaW5nIGRvb3JiZWxsICgyIFdRRXMpICovCisJCW5lc193cml0ZTMyKG5lc2Rldi0+cmVncyArIE5FU19XUUVfQUxMT0MsIDB4MDI4MDAwMDAgfCBuZXNkZXYtPmNxcC5xcF9pZCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzZGV2LT5jcXAubG9jaywgZmxhZ3MpOworCQluZXNfZGVidWcoTkVTX0RCR19JTklULCAiV2FpdGluZyBmb3IgY3JlYXRlIE1HVCBRUCV1IHRvIGNvbXBsZXRlLlxuIiwKKwkJCSAgbWd0dm5pYy0+bWd0LnFwX2lkKTsKKworCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobmVzZGV2LT5jcXAud2FpdHEsIChuZXNkZXYtPmNxcC5zcV90YWlsID09IGNxcF9oZWFkKSwKKwkJCQkJIE5FU19FVkVOVF9USU1FT1VUKTsKKwkJbmVzX2RlYnVnKE5FU19EQkdfSU5JVCwgIkNyZWF0ZSBNR1QgUVAldSBjb21wbGV0ZWQsIHdhaXRfZXZlbnRfdGltZW91dCByZXQgPSAldS5cbiIsCisJCQkgIG1ndHZuaWMtPm1ndC5xcF9pZCwgcmV0KTsKKwkJaWYgKCFyZXQpIHsKKwkJCW5lc19kZWJ1ZyhORVNfREJHX0lOSVQsICJNR1QgUVAldSBjcmVhdGUgdGltZW91dCBleHBpcmVkXG4iLCBtZ3R2bmljLT5tZ3QucXBfaWQpOworCQkJaWYgKGkgPT0gMCkgeworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobmVzZGV2LT5wY2lkZXYsIG5lc3ZuaWMtPm1ndF9tZW1fc2l6ZSwgbmVzdm5pYy0+bWd0X3ZiYXNlLAorCQkJCQkJICAgIG5lc3ZuaWMtPm1ndF9wYmFzZSk7CisJCQkJa2ZyZWUobWd0dm5pYyk7CisJCQl9IGVsc2UgeworCQkJCW5lc19kZXN0cm95X21ndChuZXN2bmljKTsKKwkJCX0KKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogUG9wdWxhdGUgdGhlIFJRICovCisJCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAoTkVTX01HVF9XUV9DT1VOVCAtIDEpOyBjb3VudGVyKyspIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobmVzdm5pYy0+bWF4X2ZyYW1lX3NpemUpOworCQkJaWYgKCFza2IpIHsKKwkJCQluZXNfZGVidWcoTkVTX0RCR19JTklULCAiJXM6IG91dCBvZiBtZW1vcnkgZm9yIHJlY2VpdmUgc2tiXG4iLCBuZXRkZXYtPm5hbWUpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQlza2ItPmRldiA9IG5ldGRldjsKKworCQkJcG1lbSA9IHBjaV9tYXBfc2luZ2xlKG5lc2Rldi0+cGNpZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgICAgIG5lc3ZuaWMtPm1heF9mcmFtZV9zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnNrYi0+Y2JbMF07CisJCQljYi0+YnVzYWRkciA9IHBtZW07CisJCQljYi0+bWFwbGVuID0gbmVzdm5pYy0+bWF4X2ZyYW1lX3NpemU7CisKKwkJCW1ndF9ycWUgPSAmbWd0dm5pYy0+bWd0LnJxX3ZiYXNlW2NvdW50ZXJdOworCQkJbWd0X3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0xFTkdUSF8xXzBfSURYXSA9IGNwdV90b19sZTMyKCh1MzIpbmVzdm5pYy0+bWF4X2ZyYW1lX3NpemUpOworCQkJbWd0X3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0xFTkdUSF8zXzJfSURYXSA9IDA7CisJCQltZ3RfcnFlLT53cWVfd29yZHNbTkVTX05JQ19SUV9XUUVfRlJBRzBfTE9XX0lEWF0gPSBjcHVfdG9fbGUzMigodTMyKXBtZW0pOworCQkJbWd0X3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0ZSQUcwX0hJR0hfSURYXSA9IGNwdV90b19sZTMyKCh1MzIpKCh1NjQpcG1lbSA+PiAzMikpOworCQkJbWd0dm5pYy0+bWd0LnJ4X3NrYltjb3VudGVyXSA9IHNrYjsKKwkJfQorCisJCWluaXRfdGltZXIoJm1ndHZuaWMtPnJxX3dxZXNfdGltZXIpOworCQltZ3R2bmljLT5ycV93cWVzX3RpbWVyLmZ1bmN0aW9uID0gbmVzX21ndF9ycV93cWVzX3RpbWVvdXQ7CisJCW1ndHZuaWMtPnJxX3dxZXNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKW1ndHZuaWM7CisKKwkJd3FlX2NvdW50ID0gTkVTX01HVF9XUV9DT1VOVCAtIDE7CisJCW1ndHZuaWMtPm1ndC5ycV9oZWFkID0gd3FlX2NvdW50OworCQliYXJyaWVyKCk7CisJCWRvIHsKKwkJCWNvdW50ZXIgPSBtaW4od3FlX2NvdW50LCAoKHUzMikyNTUpKTsKKwkJCXdxZV9jb3VudCAtPSBjb3VudGVyOworCQkJbmVzX3dyaXRlMzIobmVzZGV2LT5yZWdzICsgTkVTX1dRRV9BTExPQywgKGNvdW50ZXIgPDwgMjQpIHwgbWd0dm5pYy0+bWd0LnFwX2lkKTsKKwkJfSB3aGlsZSAod3FlX2NvdW50KTsKKworCQluZXNfd3JpdGUzMihuZXNkZXYtPnJlZ3MgKyBORVNfQ1FFX0FMTE9DLCBORVNfQ1FFX0FMTE9DX05PVElGWV9ORVhUIHwKKwkJCSAgICBtZ3R2bmljLT5tZ3RfY3EuY3FfbnVtYmVyKTsKKwkJbmVzX3JlYWQzMihuZXNkZXYtPnJlZ3MgKyBORVNfQ1FFX0FMTE9DKTsKKworCQltZ3RfdmJhc2UgKz0gbWd0X21lbV9zaXplOworCQltZ3RfcGJhc2UgKz0gbWd0X21lbV9zaXplOworCQluZXN2bmljLT5tZ3R2bmljW2ldID0gbWd0dm5pYysrOworCX0KKwlyZXR1cm4gMDsKK30KKworCit2b2lkIG5lc19kZXN0cm95X21ndChzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMpCit7CisJc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldiA9IG5lc3ZuaWMtPm5lc2RldjsKKwlzdHJ1Y3QgbmVzX3ZuaWNfbWd0ICptZ3R2bmljOworCXN0cnVjdCBuZXNfdm5pY19tZ3QgKmZpcnN0X21ndHZuaWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbmVzX2h3X2NxcF93cWUgKmNxcF93cWU7CisJdTMyIGNxcF9oZWFkOworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisJaW50IGk7CisJaW50IHJldDsKKworCWt0aHJlYWRfc3RvcChuZXN2bmljLT5tZ3RfdGhyZWFkKTsKKworCS8qIEZyZWUgcmVtYWluaW5nIE5JQyByZWNlaXZlIGJ1ZmZlcnMgKi8KKwlmaXJzdF9tZ3R2bmljID0gbmVzdm5pYy0+bWd0dm5pY1swXTsKKwlmb3IgKGkgPSAwOyBpIDwgTkVTX01HVF9RUF9DT1VOVDsgaSsrKSB7CisJCW1ndHZuaWMgPSBuZXN2bmljLT5tZ3R2bmljW2ldOworCQlpZiAobWd0dm5pYyA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKG1ndHZuaWMtPm1ndC5ycV9oZWFkICE9IG1ndHZuaWMtPm1ndC5ycV90YWlsKSB7CisJCQlyeF9za2IgPSBtZ3R2bmljLT5tZ3Qucnhfc2tiW21ndHZuaWMtPm1ndC5ycV90YWlsXTsKKwkJCW5lc19tZ3RfZnJlZV9za2IobmVzZGV2LCByeF9za2IsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQltZ3R2bmljLT5tZ3QucnFfdGFpbCsrOworCQkJbWd0dm5pYy0+bWd0LnJxX3RhaWwgJj0gKG1ndHZuaWMtPm1ndC5ycV9zaXplIC0gMSk7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzZGV2LT5jcXAubG9jaywgZmxhZ3MpOworCisJCS8qIERlc3Ryb3kgTklDIFFQICovCisJCWNxcF9oZWFkID0gbmVzZGV2LT5jcXAuc3FfaGVhZDsKKwkJY3FwX3dxZSA9ICZuZXNkZXYtPmNxcC5zcV92YmFzZVtjcXBfaGVhZF07CisJCW5lc19maWxsX2luaXRfY3FwX3dxZShjcXBfd3FlLCBuZXNkZXYpOworCisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1dRRV9PUENPREVfSURYLAorCQkJCSAgICAoTkVTX0NRUF9ERVNUUk9ZX1FQIHwgTkVTX0NRUF9RUF9UWVBFX05JQykpOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9XUUVfSURfSURYLAorCQkJCSAgICBtZ3R2bmljLT5tZ3QucXBfaWQpOworCisJCWlmICgrK2NxcF9oZWFkID49IG5lc2Rldi0+Y3FwLnNxX3NpemUpCisJCQljcXBfaGVhZCA9IDA7CisKKwkJY3FwX3dxZSA9ICZuZXNkZXYtPmNxcC5zcV92YmFzZVtjcXBfaGVhZF07CisKKwkJLyogRGVzdHJveSBOSUMgQ1EgKi8KKwkJbmVzX2ZpbGxfaW5pdF9jcXBfd3FlKGNxcF93cWUsIG5lc2Rldik7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1dRRV9PUENPREVfSURYLAorCQkJCSAgICAoTkVTX0NRUF9ERVNUUk9ZX0NRIHwgKCh1MzIpbWd0dm5pYy0+bWd0X2NxLmNxX3NpemUgPDwgMTYpKSk7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1dRRV9JRF9JRFgsCisJCQkJICAgIChtZ3R2bmljLT5tZ3RfY3EuY3FfbnVtYmVyIHwgKCh1MzIpbmVzZGV2LT5jZXFfaW5kZXggPDwgMTYpKSk7CisKKwkJaWYgKCsrY3FwX2hlYWQgPj0gbmVzZGV2LT5jcXAuc3Ffc2l6ZSkKKwkJCWNxcF9oZWFkID0gMDsKKworCQluZXNkZXYtPmNxcC5zcV9oZWFkID0gY3FwX2hlYWQ7CisJCWJhcnJpZXIoKTsKKworCQkvKiBSaW5nIGRvb3JiZWxsICgyIFdRRXMpICovCisJCW5lc193cml0ZTMyKG5lc2Rldi0+cmVncyArIE5FU19XUUVfQUxMT0MsIDB4MDI4MDAwMDAgfCBuZXNkZXYtPmNxcC5xcF9pZCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzZGV2LT5jcXAubG9jaywgZmxhZ3MpOworCQluZXNfZGVidWcoTkVTX0RCR19TSFVURE9XTiwgIldhaXRpbmcgZm9yIENRUCwgY3FwX2hlYWQ9JXUsIGNxcC5zcV9oZWFkPSV1LCIKKwkJCSAgIiBjcXAuc3FfdGFpbD0ldSwgY3FwLnNxX3NpemU9JXVcbiIsCisJCQkgIGNxcF9oZWFkLCBuZXNkZXYtPmNxcC5zcV9oZWFkLAorCQkJICBuZXNkZXYtPmNxcC5zcV90YWlsLCBuZXNkZXYtPmNxcC5zcV9zaXplKTsKKworCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobmVzZGV2LT5jcXAud2FpdHEsIChuZXNkZXYtPmNxcC5zcV90YWlsID09IGNxcF9oZWFkKSwKKwkJCQkJIE5FU19FVkVOVF9USU1FT1VUKTsKKworCQluZXNfZGVidWcoTkVTX0RCR19TSFVURE9XTiwgIkRlc3Ryb3kgTUdUIFFQIHJldHVybmVkLCB3YWl0X2V2ZW50X3RpbWVvdXQgcmV0ID0gJXUsIGNxcF9oZWFkPSV1LCIKKwkJCSAgIiBjcXAuc3FfaGVhZD0ldSwgY3FwLnNxX3RhaWw9JXVcbiIsCisJCQkgIHJldCwgY3FwX2hlYWQsIG5lc2Rldi0+Y3FwLnNxX2hlYWQsIG5lc2Rldi0+Y3FwLnNxX3RhaWwpOworCQlpZiAoIXJldCkKKwkJCW5lc19kZWJ1ZyhORVNfREJHX1NIVVRET1dOLCAiTUdUIFFQJXUgZGVzdHJveSB0aW1lb3V0IGV4cGlyZWRcbiIsCisJCQkJICBtZ3R2bmljLT5tZ3QucXBfaWQpOworCisJCW5lc3ZuaWMtPm1ndHZuaWNbaV0gPSBOVUxMOworCX0KKworCWlmIChuZXN2bmljLT5tZ3RfdmJhc2UpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChuZXNkZXYtPnBjaWRldiwgbmVzdm5pYy0+bWd0X21lbV9zaXplLCBuZXN2bmljLT5tZ3RfdmJhc2UsCisJCQkJICAgIG5lc3ZuaWMtPm1ndF9wYmFzZSk7CisJCW5lc3ZuaWMtPm1ndF92YmFzZSA9IE5VTEw7CisJCW5lc3ZuaWMtPm1ndF9wYmFzZSA9IDA7CisJfQorCisJa2ZyZWUoZmlyc3RfbWd0dm5pYyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19tZ3QuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX21ndC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOGFmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19tZ3QuaApAQCAtMCwwICsxLDk3IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTAgSW50ZWwtTkUsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorKgorKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICAgZGlzY2xhaW1lci4KKyoKKyogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyoKKyogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisqIFNPRlRXQVJFLgorKi8KKworI2lmbmRlZiBfX05FU19NR1RfSAorI2RlZmluZSBfX05FU19NR1RfSAorCisjZGVmaW5lIE1QQV9GUkFNSU5HIDYJLyogbGVuZ3RoIGlzIDIgYnl0ZXMsIGNyYyBpcyA0IGJ5dGVzICovCisKK2ludCBuZXNfaW5pdF9tZ3RfcXAoc3RydWN0IG5lc19kZXZpY2UgKm5lc2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IG5lc192bmljICpuZXN2bmljKTsKK3ZvaWQgbmVzX3F1ZXVlX21ndF9za2JzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgc3RydWN0IG5lc19xcCAqbmVzcXApOwordm9pZCBuZXNfZGVzdHJveV9tZ3Qoc3RydWN0IG5lc192bmljICpuZXN2bmljKTsKK3ZvaWQgbmVzX2Rlc3Ryb3lfcGF1X3FwKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHN0cnVjdCBuZXNfcXAgKm5lc3FwKTsKKworc3RydWN0IG5lc19od19tZ3QgeworCXN0cnVjdCBuZXNfaHdfbmljX3JxX3dxZSAqcnFfdmJhc2U7CS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBycSAqLworCWRtYV9hZGRyX3QgcnFfcGJhc2U7CQkJLyogUENJIG1lbW9yeSBmb3IgaG9zdCByaW5ncyAqLworCXN0cnVjdCBza19idWZmICpyeF9za2JbTkVTX05JQ19XUV9TSVpFXTsKKwl1MTYgcXBfaWQ7CisJdTE2IHNxX2hlYWQ7CisJdTE2IHJxX2hlYWQ7CisJdTE2IHJxX3RhaWw7CisJdTE2IHJxX3NpemU7CisJdTggcmVwbGVuaXNoaW5nX3JxOworCXU4IHJlc2VydmVkOworCXNwaW5sb2NrX3QgcnFfbG9jazsKK307CisKK3N0cnVjdCBuZXNfdm5pY19tZ3QgeworCXN0cnVjdCBuZXNfdm5pYyAgICAgICAgKm5lc3ZuaWM7CisJc3RydWN0IG5lc19od19tZ3QgICAgICBtZ3Q7CisJc3RydWN0IG5lc19od19uaWNfY3EgICBtZ3RfY3E7CisJYXRvbWljX3QgICAgICAgICAgICAgICByeF9za2JzX25lZWRlZDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgIHJxX3dxZXNfdGltZXI7CisJYXRvbWljX3QgICAgICAgICAgICAgICByeF9za2JfdGltZXJfcnVubmluZzsKK307CisKKyNkZWZpbmUgTUFYX0ZQRFVfRlJBR1MgNAorc3RydWN0IHBhdV9mcGR1X2ZyYWcgeworCXN0cnVjdCBza19idWZmICAgICAgICAgKnNrYjsKKwl1NjQgICAgICAgICAgICAgICAgICAgIHBoeXNhZGRyOworCXUzMiAgICAgICAgICAgICAgICAgICAgZnJhZ19sZW47CisJYm9vbCAgICAgICAgICAgICAgICAgICBjbXBsdDsKK307CisKK3N0cnVjdCBwYXVfZnBkdV9pbmZvIHsKKwlzdHJ1Y3QgbmVzX3FwICAgICAgICAgICpuZXNxcDsKKwlzdHJ1Y3QgbmVzX2NxcF9yZXF1ZXN0ICpjcXBfcmVxdWVzdDsKKwl2b2lkICAgICAgICAgICAgICAgICAgICpoZHJfdmJhc2U7CisJZG1hX2FkZHJfdCAgICAgICAgICAgICBoZHJfcGJhc2U7CisJaW50ICAgICAgICAgICAgICAgICAgICBoZHJfbGVuOworCXUxNiAgICAgICAgICAgICAgICAgICAgZGF0YV9sZW47CisJdTE2ICAgICAgICAgICAgICAgICAgICBmcmFnX2NudDsKKwlzdHJ1Y3QgcGF1X2ZwZHVfZnJhZyAgIGZyYWdzW01BWF9GUERVX0ZSQUdTXTsKK307CisKK2VudW0gcGF1X3FoX3N0YXRlIHsKKwlQQVVfREVMX1FILAorCVBBVV9BRERfTEJfUUgsCisJUEFVX1JFQURZCit9OworCitzdHJ1Y3QgcGF1X3FoX2NoZyB7CisJc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldjsKKwlzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWM7CisJc3RydWN0IG5lc19xcCAqbmVzcXA7Cit9OworCisjZW5kaWYgICAgICAgICAgLyogX19ORVNfTUdUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMKaW5kZXggNDdiMmVlNC4uYzAwZDJmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMKQEAgLTEwOTEsNiArMTA5MSw4IEBACiAJIkxSTyBhZ2dyZWdhdGVkIiwKIAkiTFJPIGZsdXNoZWQiLAogCSJMUk8gbm9fZGVzYyIsCisJIlBBVSBDcmVhdGVRUHMiLAorCSJQQVUgRGVzdHJveVFQcyIsCiB9OwogI2RlZmluZSBORVNfRVRIVE9PTF9TVEFUX0NPVU5UICBBUlJBWV9TSVpFKG5lc19ldGh0b29sX3N0cmluZ3NldCkKIApAQCAtMTMwNiw2ICsxMzA4LDggQEAKIAl0YXJnZXRfc3RhdF92YWx1ZXNbKytpbmRleF0gPSBuZXN2bmljLT5scm9fbWdyLnN0YXRzLmFnZ3JlZ2F0ZWQ7CiAJdGFyZ2V0X3N0YXRfdmFsdWVzWysraW5kZXhdID0gbmVzdm5pYy0+bHJvX21nci5zdGF0cy5mbHVzaGVkOwogCXRhcmdldF9zdGF0X3ZhbHVlc1srK2luZGV4XSA9IG5lc3ZuaWMtPmxyb19tZ3Iuc3RhdHMubm9fZGVzYzsKKwl0YXJnZXRfc3RhdF92YWx1ZXNbKytpbmRleF0gPSBhdG9taWNfcmVhZCgmcGF1X3Fwc19jcmVhdGVkKTsKKwl0YXJnZXRfc3RhdF92YWx1ZXNbKytpbmRleF0gPSBhdG9taWNfcmVhZCgmcGF1X3Fwc19kZXN0cm95ZWQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3V0aWxzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc191dGlscy5jCmluZGV4IGY5YzQxN2MuLmNkMTA5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3V0aWxzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdXRpbHMuYwpAQCAtNTEsMTMgKzUxLDM0IEBACiAKICNpbmNsdWRlICJuZXMuaCIKIAotCi0KIHN0YXRpYyB1MTYgbmVzX3JlYWQxNl9lZXByb20odm9pZCBfX2lvbWVtICphZGRyLCB1MTYgb2Zmc2V0KTsKIAogdTMyIG1oX2RldGVjdGVkOwogdTMyIG1oX3BhdXNlc19zZW50OwogCit1MzIgbmVzX3NldF9wYXUoc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldikKK3sKKwl1MzIgcmV0ID0gMDsKKwl1MzIgY291bnRlcjsKKworCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9HUFIyLCBORVNfRU5BQkxFX1BBVSk7CisJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX0dQUl9UUklHR0VSLCAxKTsKKworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBORVNfUEFVX0NPVU5URVI7IGNvdW50ZXIrKykgeworCQl1ZGVsYXkoMzApOworCQlpZiAoIW5lc19yZWFkX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX0dQUjIpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUEFVIGlzIHN1cHBvcnRlZC5cbiIpOworCQkJYnJlYWs7CisJCX0KKwkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX0dQUl9UUklHR0VSLCAxKTsKKwl9CisJaWYgKGNvdW50ZXIgPT0gTkVTX1BBVV9DT1VOVEVSKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJQQVUgaXMgbm90IHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIG5lc19yZWFkX2VlcHJvbV92YWx1ZXMgLQogICovCkBAIC0xODcsNiArMjA4LDExIEBACiAJCWlmICgoKG1ham9yX3ZlciA9PSAzKSAmJiAobWlub3JfdmVyID49IDE2KSkgfHwgKG1ham9yX3ZlciA+IDMpKQogCQkJbmVzYWRhcHRlci0+c2VuZF90ZXJtX29rID0gMTsKIAorCQlpZiAobmVzX2Rydl9vcHQgJiBORVNfRFJWX09QVF9FTkFCTEVfUEFVKSB7CisJCQlpZiAoIW5lc19zZXRfcGF1KG5lc2RldikpCisJCQkJbmVzYWRhcHRlci0+YWxsb3dfdW5hbGlnbmVkX2ZwZHVzID0gMTsKKwkJfQorCiAJCW5lc2FkYXB0ZXItPmZpcm13YXJlX3ZlcnNpb24gPSAoKCh1MzIpKHU4KShlZXByb21fZGF0YT4+OCkpICA8PCAgMTYpICsKIAkJCQkodTMyKSgodTgpZWVwcm9tX2RhdGEpOwogCkBAIC01OTQsNiArNjIwLDcgQEAKIAkJbmVzX2ZyZWVfY3FwX3JlcXVlc3QobmVzZGV2LCBjcXBfcmVxdWVzdCk7CiB9CiAKKwogLyoqCiAgKiBuZXNfcG9zdF9jcXBfcmVxdWVzdAogICovCkBAIC02MDQsNiArNjMxLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBjcXBfaGVhZDsKIAl1NjQgdTY0dGVtcDsKKwl1MzIgb3Bjb2RlOworCWludCBjdHhfaW5kZXggPSBORVNfQ1FQX1dRRV9DT01QX0NUWF9MT1dfSURYOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5lc2Rldi0+Y3FwLmxvY2ssIGZsYWdzKTsKIApAQCAtNjE0LDE3ICs2NDMsMjAgQEAKIAkJbmVzZGV2LT5jcXAuc3FfaGVhZCAmPSBuZXNkZXYtPmNxcC5zcV9zaXplLTE7CiAJCWNxcF93cWUgPSAmbmVzZGV2LT5jcXAuc3FfdmJhc2VbY3FwX2hlYWRdOwogCQltZW1jcHkoY3FwX3dxZSwgJmNxcF9yZXF1ZXN0LT5jcXBfd3FlLCBzaXplb2YoKmNxcF93cWUpKTsKKwkJb3Bjb2RlID0gbGUzMl90b19jcHUoY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX09QQ09ERV9JRFhdKTsKKwkJaWYgKChvcGNvZGUgJiBORVNfQ1FQX09QQ09ERV9NQVNLKSA9PSBORVNfQ1FQX0RPV05MT0FEX1NFR01FTlQpCisJCQljdHhfaW5kZXggPSBORVNfQ1FQX1dRRV9ETF9DT01QX0NUWF9MT1dfSURYOwogCQliYXJyaWVyKCk7CiAJCXU2NHRlbXAgPSAodW5zaWduZWQgbG9uZyljcXBfcmVxdWVzdDsKLQkJc2V0X3dxZV82NGJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19DUVBfV1FFX0NPTVBfU0NSQVRDSF9MT1dfSURYLAotCQkJCSAgICB1NjR0ZW1wKTsKKwkJc2V0X3dxZV82NGJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIGN0eF9pbmRleCwgdTY0dGVtcCk7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NRUCwgIkNRUCByZXF1ZXN0IChvcGNvZGUgMHglMDJYKSwgbGluZSAxID0gMHglMDhYIHB1dCBvbiBDUVBzIFNRLCIKLQkJCQkiIHJlcXVlc3QgPSAlcCwgY3FwX2hlYWQgPSAldSwgY3FwX3RhaWwgPSAldSwgY3FwX3NpemUgPSAldSwiCi0JCQkJIiB3YWl0aW5nID0gJWQsIHJlZmNvdW50ID0gJWQuXG4iLAotCQkJCWxlMzJfdG9fY3B1KGNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9PUENPREVfSURYXSkmMHgzZiwKLQkJCQlsZTMyX3RvX2NwdShjcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfSURfSURYXSksIGNxcF9yZXF1ZXN0LAotCQkJCW5lc2Rldi0+Y3FwLnNxX2hlYWQsIG5lc2Rldi0+Y3FwLnNxX3RhaWwsIG5lc2Rldi0+Y3FwLnNxX3NpemUsCi0JCQkJY3FwX3JlcXVlc3QtPndhaXRpbmcsIGF0b21pY19yZWFkKCZjcXBfcmVxdWVzdC0+cmVmY291bnQpKTsKKwkJCSIgcmVxdWVzdCA9ICVwLCBjcXBfaGVhZCA9ICV1LCBjcXBfdGFpbCA9ICV1LCBjcXBfc2l6ZSA9ICV1LCIKKwkJCSIgd2FpdGluZyA9ICVkLCByZWZjb3VudCA9ICVkLlxuIiwKKwkJCW9wY29kZSAmIE5FU19DUVBfT1BDT0RFX01BU0ssCisJCQlsZTMyX3RvX2NwdShjcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfSURfSURYXSksIGNxcF9yZXF1ZXN0LAorCQkJbmVzZGV2LT5jcXAuc3FfaGVhZCwgbmVzZGV2LT5jcXAuc3FfdGFpbCwgbmVzZGV2LT5jcXAuc3Ffc2l6ZSwKKwkJCWNxcF9yZXF1ZXN0LT53YWl0aW5nLCBhdG9taWNfcmVhZCgmY3FwX3JlcXVlc3QtPnJlZmNvdW50KSk7CisKIAkJYmFycmllcigpOwogCiAJCS8qIFJpbmcgZG9vcmJlbGwgKDEgV1FFcykgKi8KQEAgLTY0NSw3ICs2NzcsNiBAQAogCXJldHVybjsKIH0KIAotCiAvKioKICAqIG5lc19hcnBfdGFibGUKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmMKaW5kZXggOWYyZjdkNGIuLjUwOTViYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdmVyYnMuYwpAQCAtMTQ1OCw3ICsxNDU4LDcgQEAKIAlzdHJ1Y3QgaWJfcXBfYXR0ciBhdHRyOwogCXN0cnVjdCBpd19jbV9pZCAqY21faWQ7CiAJc3RydWN0IGl3X2NtX2V2ZW50IGNtX2V2ZW50OwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAlhdG9taWNfaW5jKCZzd19xcHNfZGVzdHJveWVkKTsKIAluZXNxcC0+ZGVzdHJveWVkID0gMTsKQEAgLTE1MTEsNyArMTUxMSw2IEBACiAJCWlmICgobmVzcXAtPm5lc3JjcSkgJiYgKG5lc3FwLT5uZXNyY3EgIT0gbmVzcXAtPm5lc3NjcSkpCiAJCQluZXNfY2xlYW5fY3EobmVzcXAsIG5lc3FwLT5uZXNyY3EpOwogCX0KLQogCW5lc19yZW1fcmVmKCZuZXNxcC0+aWJxcCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMzM4LDggKzIzMzcsMTAgQEAKIAogCXNraXBfcGFnZXMgPSAoKHUzMilyZWdpb24tPm9mZnNldCkgPj4gMTI7CiAKLQlpZiAoaWJfY29weV9mcm9tX3VkYXRhKCZyZXEsIHVkYXRhLCBzaXplb2YocmVxKSkpCisJaWYgKGliX2NvcHlfZnJvbV91ZGF0YSgmcmVxLCB1ZGF0YSwgc2l6ZW9mKHJlcSkpKSB7CisJCWliX3VtZW1fcmVsZWFzZShyZWdpb24pOwogCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwl9CiAJbmVzX2RlYnVnKE5FU19EQkdfTVIsICJNZW1vcnkgUmVnaXN0cmF0aW9uIHR5cGUgPSAlMDhYLlxuIiwgcmVxLnJlZ190eXBlKTsKIAogCXN3aXRjaCAocmVxLnJlZ190eXBlKSB7CkBAIC0yNjMxLDYgKzI2MzIsNyBAQAogCQkJcmV0dXJuICZuZXNtci0+aWJtcjsKIAl9CiAKKwlpYl91bWVtX3JlbGVhc2UocmVnaW9uKTsKIAlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmgKaW5kZXggMmRmOTk5M2UuLmZlNmI2ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdmVyYnMuaApAQCAtMTM5LDcgKzEzOSw4IEBACiAJc3RydWN0IG5lc19jcSAgICAgICAgICpuZXNyY3E7CiAJc3RydWN0IG5lc19wZCAgICAgICAgICpuZXNwZDsKIAl2b2lkICpjbV9ub2RlOyAvKiBoYW5kbGUgb2YgdGhlIG5vZGUgdGhpcyBRUCBpcyBhc3NvY2lhdGVkIHdpdGggKi8KLQlzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUgKmlldGZfZnJhbWU7CisJdm9pZCAgICAgICAgICAgICAgICAgICppZXRmX2ZyYW1lOworCXU4ICAgICAgICAgICAgICAgICAgICBpZXRmX2ZyYW1lX3NpemU7CiAJZG1hX2FkZHJfdCAgICAgICAgICAgIGlldGZfZnJhbWVfcGJhc2U7CiAJc3RydWN0IGliX21yICAgICAgICAgICpsc21tX21yOwogCXN0cnVjdCBuZXNfaHdfcXAgICAgICBod3FwOwpAQCAtMTU0LDYgKzE1NSw3IEBACiAJdTMyICAgICAgICAgICAgICAgICAgIG1tYXBfc3FfZGJfaW5kZXg7CiAJdTMyICAgICAgICAgICAgICAgICAgIG1tYXBfcnFfZGJfaW5kZXg7CiAJc3BpbmxvY2tfdCAgICAgICAgICAgIGxvY2s7CisJc3BpbmxvY2tfdCAgICAgICAgICAgIHBhdV9sb2NrOwogCXN0cnVjdCBuZXNfcXBfY29udGV4dCAqbmVzcXBfY29udGV4dDsKIAlkbWFfYWRkcl90ICAgICAgICAgICAgbmVzcXBfY29udGV4dF9wYmFzZTsKIAl2b2lkCSAgICAgICAgICAgICAgKnBibF92YmFzZTsKQEAgLTE2MSw2ICsxNjMsOCBAQAogCXN0cnVjdCBwYWdlICAgICAgICAgICAqcGFnZTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgdGVybWluYXRlX3RpbWVyOwogCWVudW0gaWJfZXZlbnRfdHlwZSAgICB0ZXJtaW5hdGVfZXZlbnR0eXBlOworCXN0cnVjdCBza19idWZmX2hlYWQgICBwYXVfbGlzdDsKKwl1MzIgICAgICAgICAgICAgICAgICAgcGF1X3Jjdl9ueHQ7CiAJdTE2ICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9jb25uOjE7CiAJdTE2ICAgICAgICAgICAgICAgICAgIHNraXBfbHNtbToxOwogCXUxNiAgICAgICAgICAgICAgICAgICB1c2VyX21vZGU6MTsKQEAgLTE2OCw3ICsxNzIsOCBAQAogCXUxNiAgICAgICAgICAgICAgICAgICBmbHVzaF9pc3N1ZWQ6MTsKIAl1MTYgICAgICAgICAgICAgICAgICAgZGVzdHJveWVkOjE7CiAJdTE2ICAgICAgICAgICAgICAgICAgIHNpZ19hbGw6MTsKLQl1MTYgICAgICAgICAgICAgICAgICAgcnN2ZDo5OworCXUxNiAgICAgICAgICAgICAgICAgICBwYXVfbW9kZToxOworCXUxNiAgICAgICAgICAgICAgICAgICByc3ZkOjg7CiAJdTE2ICAgICAgICAgICAgICAgICAgIHByaXZhdGVfZGF0YV9sZW47CiAJdTE2ICAgICAgICAgICAgICAgICAgIHRlcm1fc3FfZmx1c2hfY29kZTsKIAl1MTYgICAgICAgICAgICAgICAgICAgdGVybV9ycV9mbHVzaF9jb2RlOwpAQCAtMTc2LDUgKzE4MSw4IEBACiAJdTggICAgICAgICAgICAgICAgICAgIGh3X3RjcF9zdGF0ZTsKIAl1OCAgICAgICAgICAgICAgICAgICAgdGVybV9mbGFnczsKIAl1OCAgICAgICAgICAgICAgICAgICAgc3Ffa21hcHBlZDsKKwl1OCAgICAgICAgICAgICAgICAgICAgcGF1X2J1c3k7CisJdTggICAgICAgICAgICAgICAgICAgIHBhdV9wZW5kaW5nOworCXU4ICAgICAgICAgICAgICAgICAgICBwYXVfc3RhdGU7CiB9OwogI2VuZGlmCQkJLyogTkVTX1ZFUkJTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oCmluZGV4IGM5NjI0ZWEuLmI4ODFiZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaApAQCAtMTcxLDcgKzE3MSw5IEBACiAJLyogaG93IG1hbnkgYWxsb2NfcGFnZXMoKSBjaHVua3MgaW4gcmN2ZWdyYnVmX3BhZ2VzICovCiAJdTMyIHJjdmVncmJ1Zl9jaHVua3M7CiAJLyogaG93IG1hbnkgZWdyYnVmcyBwZXIgY2h1bmsgKi8KLQl1MzIgcmN2ZWdyYnVmc19wZXJjaHVuazsKKwl1MTYgcmN2ZWdyYnVmc19wZXJjaHVuazsKKwkvKiBpbG9nMiBvZiBhYm92ZSAqLworCXUxNiByY3ZlZ3JidWZzX3BlcmNodW5rX3NoaWZ0OwogCS8qIG9yZGVyIGZvciByY3ZlZ3JidWZfcGFnZXMgKi8KIAlzaXplX3QgcmN2ZWdyYnVmX3NpemU7CiAJLyogcmN2aGRycSBzaXplIChmb3IgZnJlZWluZykgKi8KQEAgLTIyMSw2ICsyMjMsOSBAQAogCS8qIGN0eHQgcmN2aGRycSBoZWFkIG9mZnNldCAqLwogCXUzMiBoZWFkOwogCXUzMiBwa3RfY291bnQ7CisJLyogbG9va2FzaWRlIGZpZWxkcyAqLworCXN0cnVjdCBxaWJfcXAgKmxvb2thc2lkZV9xcDsKKwl1MzIgbG9va2FzaWRlX3FwbjsKIAkvKiBRUHMgd2FpdGluZyBmb3IgY29udGV4dCBwcm9jZXNzaW5nICovCiAJc3RydWN0IGxpc3RfaGVhZCBxcF93YWl0X2xpc3Q7CiB9OwpAQCAtODA3LDYgKzgxMiwxMCBAQAogCSAqIHN1cHBvcnRzLCBsZXNzIGdpdmVzIG1vcmUgcGlvIGJ1ZnMvY3R4dCwgZXRjLgogCSAqLwogCXUzMiBjZmdjdHh0czsKKwkvKgorCSAqIG51bWJlciBvZiBjdHh0cyBhdmFpbGFibGUgZm9yIFBTTSBvcGVuCisJICovCisJdTMyIGZyZWVjdHh0czsKIAogCS8qCiAJICogaGludCB0aGF0IHdlIHNob3VsZCB1cGRhdGUgcGlvYXZhaWxzaGFkb3cgYmVmb3JlCkBAIC05MzYsNyArOTQ1LDkgQEAKIAkvKiBjaGlwIGFkZHJlc3Mgc3BhY2UgdXNlZCBieSA0ayBwaW8gYnVmZmVycyAqLwogCXUzMiBhbGlnbjRrOwogCS8qIHNpemUgb2YgZWFjaCByY3ZlZ3JidWZmZXIgKi8KLQl1MzIgcmN2ZWdyYnVmc2l6ZTsKKwl1MTYgcmN2ZWdyYnVmc2l6ZTsKKwkvKiBsb2cyIG9mIGFib3ZlICovCisJdTE2IHJjdmVncmJ1ZnNpemVfc2hpZnQ7CiAJLyogbG9jYWxidXMgd2lkdGggKDEsIDIsNCw4LDE2LDMyKSBmcm9tIGNvbmZpZyBzcGFjZSAgKi8KIAl1MzIgbGJ1c193aWR0aDsKIAkvKiBsb2NhbGJ1cyBzcGVlZCBpbiBNSHogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2RpYWcuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2RpYWcuYwppbmRleCAyMDRjNGRkLi45ODkyNDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kaWFnLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZGlhZy5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwppbmRleCAyM2U1ODRmLi5jOTBhNTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAicWliLmgiCiAKQEAgLTI3OSwxMCArMjgwLDEwIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqcWliX2dldF9lZ3JidWYoY29uc3Qgc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCB1MzIgZXRhaWwpCiB7Ci0JY29uc3QgdTMyIGNodW5rID0gZXRhaWwgLyByY2QtPnJjdmVncmJ1ZnNfcGVyY2h1bms7Ci0JY29uc3QgdTMyIGlkeCA9ICBldGFpbCAlIHJjZC0+cmN2ZWdyYnVmc19wZXJjaHVuazsKKwljb25zdCB1MzIgY2h1bmsgPSBldGFpbCA+PiByY2QtPnJjdmVncmJ1ZnNfcGVyY2h1bmtfc2hpZnQ7CisJY29uc3QgdTMyIGlkeCA9ICBldGFpbCAmICgodTMyKXJjZC0+cmN2ZWdyYnVmc19wZXJjaHVuayAtIDEpOwogCi0JcmV0dXJuIHJjZC0+cmN2ZWdyYnVmW2NodW5rXSArIGlkeCAqIHJjZC0+ZGQtPnJjdmVncmJ1ZnNpemU7CisJcmV0dXJuIHJjZC0+cmN2ZWdyYnVmW2NodW5rXSArIChpZHggPDwgcmNkLT5kZC0+cmN2ZWdyYnVmc2l6ZV9zaGlmdCk7CiB9CiAKIC8qCkBAIC0zMTAsNyArMzExLDYgQEAKIAkJdTMyIG9wY29kZTsKIAkJdTMyIHBzbjsKIAkJaW50IGRpZmY7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJLyogU2FuaXR5IGNoZWNrIHBhY2tldCAqLwogCQlpZiAodGxlbiA8IDI0KQpAQCAtMzY1LDcgKzM2NSw2IEBACiAKIAkJCXN3aXRjaCAocXAtPmlicXAucXBfdHlwZSkgewogCQkJY2FzZSBJQl9RUFRfUkM6Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAkJCQlydWNfcmVzID0KIAkJCQkJcWliX3J1Y19jaGVja19oZHIoCiAJCQkJCQlpYnAsIGhkciwKQEAgLTM3MywxMSArMzcyLDggQEAKIAkJCQkJCXFwLAogCQkJCQkJYmUzMl90b19jcHUob2hkci0+YnRoWzBdKSk7CiAJCQkJaWYgKHJ1Y19yZXMpIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNfbG9jaywKLQkJCQkJCQkgICAgICAgZmxhZ3MpOwogCQkJCQlnb3RvIHVubG9jazsKIAkJCQl9Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwogCiAJCQkJLyogT25seSBkZWFsIHdpdGggUkRNQSBXcml0ZXMgZm9yIG5vdyAqLwogCQkJCWlmIChvcGNvZGUgPApAQCAtNTQ3LDYgKzU0MywxNSBAQAogCQkJdXBkZWdyID0gMDsKIAkJfQogCX0KKwkvKgorCSAqIE5vdGlmeSBxaWJfZGVzdHJveV9xcCgpIGlmIGl0IGlzIHdhaXRpbmcKKwkgKiBmb3IgbG9va2FzaWRlX3FwIHRvIGZpbmlzaC4KKwkgKi8KKwlpZiAocmNkLT5sb29rYXNpZGVfcXApIHsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJjZC0+bG9va2FzaWRlX3FwLT5yZWZjb3VudCkpCisJCQl3YWtlX3VwKCZyY2QtPmxvb2thc2lkZV9xcC0+d2FpdCk7CisJCXJjZC0+bG9va2FzaWRlX3FwID0gTlVMTDsKKwl9CiAKIAlyY2QtPmhlYWQgPSBsOwogCXJjZC0+cGt0X2NvdW50ICs9IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9maWxlX29wcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYwppbmRleCAyNjI1MzAzLi41NzQ2MDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9maWxlX29wcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZpbGVfb3BzLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAicWliLmgiCiAjaW5jbHVkZSAicWliX2NvbW1vbi5oIgpAQCAtMTI4NCw2ICsxMjg1LDcgQEAKIAlzdHJsY3B5KHJjZC0+Y29tbSwgY3VycmVudC0+Y29tbSwgc2l6ZW9mKHJjZC0+Y29tbSkpOwogCWN0eHRfZnAoZnApID0gcmNkOwogCXFpYl9zdGF0cy5zcHNfY3R4dHMrKzsKKwlkZC0+ZnJlZWN0eHRzKys7CiAJcmV0ID0gMDsKIAlnb3RvIGJhaWw7CiAKQEAgLTE3OTIsNiArMTc5NCw3IEBACiAJCWlmIChkZC0+cGFnZXNoYWRvdykKIAkJCXVubG9ja19leHBlY3RlZF90aWRzKHJjZCk7CiAJCXFpYl9zdGF0cy5zcHNfY3R4dHMtLTsKKwkJZGQtPmZyZWVjdHh0cy0tOwogCX0KIAogCW11dGV4X3VubG9jaygmcWliX211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTYxMjAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTYxMjAuYwppbmRleCBkOGNhMGEwLi43ODFhODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE2MTIwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNjEyMC5jCkBAIC0zMjczLDYgKzMyNzMsOCBAQAogCS8qIHdlIGFsd2F5cyBhbGxvY2F0ZSBhdCBsZWFzdCAyMDQ4IGJ5dGVzIGZvciBlYWdlciBidWZmZXJzICovCiAJcmV0ID0gaWJfbXR1X2VudW1fdG9faW50KHFpYl9pYm10dSk7CiAJZGQtPnJjdmVncmJ1ZnNpemUgPSByZXQgIT0gLTEgPyBtYXgocmV0LCAyMDQ4KSA6IFFJQl9ERUZBVUxUX01UVTsKKwlCVUdfT04oIWlzX3Bvd2VyX29mXzIoZGQtPnJjdmVncmJ1ZnNpemUpKTsKKwlkZC0+cmN2ZWdyYnVmc2l6ZV9zaGlmdCA9IGlsb2cyKGRkLT5yY3ZlZ3JidWZzaXplKTsKIAogCXFpYl82MTIwX3RpZHRlbXBsYXRlKGRkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzIyMC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzIyMC5jCmluZGV4IGUxZjk0NzQuLjQzOWQzYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTcyMjAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MjIwLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8cmRtYS9pYl92ZXJicy5oPgogCkBAIC00MDg1LDYgKzQwODYsOCBAQAogCS8qIHdlIGFsd2F5cyBhbGxvY2F0ZSBhdCBsZWFzdCAyMDQ4IGJ5dGVzIGZvciBlYWdlciBidWZmZXJzICovCiAJcmV0ID0gaWJfbXR1X2VudW1fdG9faW50KHFpYl9pYm10dSk7CiAJZGQtPnJjdmVncmJ1ZnNpemUgPSByZXQgIT0gLTEgPyBtYXgocmV0LCAyMDQ4KSA6IFFJQl9ERUZBVUxUX01UVTsKKwlCVUdfT04oIWlzX3Bvd2VyX29mXzIoZGQtPnJjdmVncmJ1ZnNpemUpKTsKKwlkZC0+cmN2ZWdyYnVmc2l6ZV9zaGlmdCA9IGlsb2cyKGRkLT5yY3ZlZ3JidWZzaXplKTsKIAogCXFpYl83MjIwX3RpZHRlbXBsYXRlKGRkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCmluZGV4IDVlYTllY2UuLjViZDIxNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHJkbWEvaWJfdmVyYnMuaD4KICNpbmNsdWRlIDxyZG1hL2liX3NtaS5oPgogCkBAIC0yMzEwLDEyICsyMzExLDE1IEBACiAJdmFsID0gcHBkLT5jcHNwZWMtPmliY2N0cmxfYSB8IChRTE9HSUNfSUJfSUJDQ19MSU5LSU5JVENNRF9ESVNBQkxFIDw8CiAJCVFMT0dJQ19JQl9JQkNDX0xJTktJTklUQ01EX1NISUZUKTsKIAorCXBwZC0+Y3BzcGVjLT5pYmNjdHJsX2EgPSB2YWw7CiAJLyoKIAkgKiBSZXNldCB0aGUgUENTIGludGVyZmFjZSB0byB0aGUgc2VyZGVzIChhbmQgYWxzbyBpYmMsIHdoaWNoIGlzIHN0aWxsCiAJICogaW4gcmVzZXQgZnJvbSBhYm92ZSkuICBXcml0ZXMgbmV3IHZhbHVlIG9mIGliY2N0cmxfYSBhcyBsYXN0IHN0ZXAuCiAJICovCiAJcWliXzczMjJfbWluaV9wY3NfcmVzZXQocHBkKTsKIAlxaWJfd3JpdGVfa3JlZyhkZCwga3Jfc2NyYXRjaCwgMFVMTCk7CisJLyogY2xlYXIgdGhlIGxpbmtpbml0IGNtZHMgKi8KKwlwcGQtPmNwc3BlYy0+aWJjY3RybF9hICY9IH5TWU1fTUFTSyhJQkNDdHJsQV8wLCBMaW5rSW5pdENtZCk7CiAKIAlpZiAoIXBwZC0+Y3BzcGVjLT5pYmNjdHJsX2IpIHsKIAkJdW5zaWduZWQgbHNlID0gcHBkLT5saW5rX3NwZWVkX2VuYWJsZWQ7CkBAIC0yMzg3LDExICsyMzkxLDYgQEAKIAlxaWJfd3JpdGVfa3JlZ19wb3J0KHBwZCwga3JwX3JjdmN0cmwsIHBwZC0+cF9yY3ZjdHJsKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZC0+Y3NwZWMtPnJjdm1vZF9sb2NrLCBmbGFncyk7CiAKLQkvKiBIb2xkIHRoZSBsaW5rIHN0YXRlIG1hY2hpbmUgZm9yIG1lenogYm9hcmRzICovCi0JaWYgKElTX1FNSChkZCkgfHwgSVNfUU1FKGRkKSkKLQkJcWliX3NldF9pYl83MzIyX2xzdGF0ZShwcGQsIDAsCi0JCQkJICAgICAgIFFMT0dJQ19JQl9JQkNDX0xJTktJTklUQ01EX0RJU0FCTEUpOwotCiAJLyogQWxzbyBlbmFibGUgSUJTVEFUVVNDSEcgaW50ZXJydXB0LiAgKi8KIAl2YWwgPSBxaWJfcmVhZF9rcmVnX3BvcnQocHBkLCBrcnBfZXJybWFzayk7CiAJcWliX3dyaXRlX2tyZWdfcG9ydChwcGQsIGtycF9lcnJtYXNrLApAQCAtMjg1Myw5ICsyODUyLDggQEAKIAkJZm9yIChpID0gMDsgaSA8IGRkLT5maXJzdF91c2VyX2N0eHQ7IGkrKykgewogCQkJaWYgKGN0eHRyYml0cyAmIHJtYXNrKSB7CiAJCQkJY3R4dHJiaXRzICY9IH5ybWFzazsKLQkJCQlpZiAoZGQtPnJjZFtpXSkgeworCQkJCWlmIChkZC0+cmNkW2ldKQogCQkJCQlxaWJfa3JlY2VpdmUoZGQtPnJjZFtpXSwgTlVMTCwgJm5wa3RzKTsKLQkJCQl9CiAJCQl9CiAJCQlybWFzayA8PD0gMTsKIAkJfQpAQCAtNTIzMCw2ICs1MjI4LDggQEAKIAkJCQkgICAgIFFJQkxfSUJfQVVUT05FR19JTlBST0cpKSkKIAkJCXNldF83MzIyX2lic3BlZWRfZmFzdChwcGQsIHBwZC0+bGlua19zcGVlZF9lbmFibGVkKTsKIAkJaWYgKCEocHBkLT5sZmxhZ3MgJiBRSUJMX0lCX0FVVE9ORUdfSU5QUk9HKSkgeworCQkJc3RydWN0IHFpYl9xc2ZwX2RhdGEgKnFkID0KKwkJCQkmcHBkLT5jcHNwZWMtPnFzZnBfZGF0YTsKIAkJCS8qIHVubG9jayB0aGUgVHggc2V0dGluZ3MsIHNwZWVkIG1heSBjaGFuZ2UgKi8KIAkJCXFpYl93cml0ZV9rcmVnX3BvcnQocHBkLCBrcnBfdHhfZGVlbXBoX292ZXJyaWRlLAogCQkJCVNZTV9NQVNLKElCU0RfVFhfREVFTVBIQVNJU19PVkVSUklERV8wLApAQCAtNTIzNyw2ICs1MjM3LDEyIEBACiAJCQlxaWJfY2FuY2VsX3NlbmRzKHBwZCk7CiAJCQkvKiBvbiBsaW5rIGRvd24sIGVuc3VyZSBzYW5lIHBjcyBzdGF0ZSAqLwogCQkJcWliXzczMjJfbWluaV9wY3NfcmVzZXQocHBkKTsKKwkJCS8qIHNjaGVkdWxlIHRoZSBxc2ZwIHJlZnJlc2ggd2hpY2ggc2hvdWxkIHR1cm4gdGhlIGxpbmsKKwkJCSAgIG9mZiAqLworCQkJaWYgKHBwZC0+ZGQtPmZsYWdzICYgUUlCX0hBU19RU0ZQKSB7CisJCQkJcWQtPnRfaW5zZXJ0ID0gZ2V0X2ppZmZpZXNfNjQoKTsKKwkJCQlzY2hlZHVsZV93b3JrKCZxZC0+d29yayk7CisJCQl9CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHBkLT5zZG1hX2xvY2ssIGZsYWdzKTsKIAkJCWlmIChfX3FpYl9zZG1hX3J1bm5pbmcocHBkKSkKIAkJCQlfX3FpYl9zZG1hX3Byb2Nlc3NfZXZlbnQocHBkLApAQCAtNTU4Nyw0MyArNTU5Myw3OSBAQAogCXN0cnVjdCBxaWJfcXNmcF9kYXRhICpxZDsKIAlzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkOwogCXU2NCBwd3J1cDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAJdTMyIGxlMjsKIAogCXFkID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxaWJfcXNmcF9kYXRhLCB3b3JrKTsKIAlwcGQgPSBxZC0+cHBkOwotCXB3cnVwID0gcWQtPnRfaW5zZXJ0ICsgbXNlY3NfdG9famlmZmllcyhRU0ZQX1BXUl9MQUdfTVNFQyk7CisJcHdydXAgPSBxZC0+dF9pbnNlcnQgKworCQltc2Vjc190b19qaWZmaWVzKFFTRlBfUFdSX0xBR19NU0VDIC0gUVNGUF9NT0RQUlNfTEFHX01TRUMpOwogCi0JLyoKLQkgKiBTb21lIFFTRlAncyBub3Qgb25seSBkbyBub3QgcmVzcG9uZCB1bnRpbCB0aGUgZnVsbCBwb3dlci11cAotCSAqIHRpbWUsIGJ1dCBtYXkgYmVoYXZlIGJhZGx5IGlmIHdlIHRyeS4gU28gaG9sZCBvZmYgcmVzcG9uZGluZwotCSAqIHRvIGluc2VydGlvbi4KLQkgKi8KLQl3aGlsZSAoMSkgewotCQl1NjQgbm93ID0gZ2V0X2ppZmZpZXNfNjQoKTsKLQkJaWYgKHRpbWVfYWZ0ZXI2NChub3csIHB3cnVwKSkKLQkJCWJyZWFrOwotCQltc2xlZXAoMjApOwotCX0KLQlyZXQgPSBxaWJfcmVmcmVzaF9xc2ZwX2NhY2hlKHBwZCwgJnFkLT5jYWNoZSk7Ci0JLyoKLQkgKiBOZWVkIHRvIGNoYW5nZSBMRTIgYmFjayB0byBkZWZhdWx0cyBpZiB3ZSBjb3VsZG4ndAotCSAqIHJlYWQgdGhlIGNhYmxlIHR5cGUgKHRvIGhhbmRsZSBjYWJsZSBzd2FwcyksIHNvIGRvIHRoaXMKLQkgKiBldmVuIG9uIGZhaWx1cmUgdG8gcmVhZCBjYWJsZSBpbmZvcm1hdGlvbi4gIFdlIGRvbid0Ci0JICogZ2V0IGhlcmUgZm9yIFFNRSwgc28gSVNfUU1FIGNoZWNrIG5vdCBuZWVkZWQgaGVyZS4KLQkgKi8KLQlpZiAoIXJldCAmJiAhcHBkLT5kZC0+Y3NwZWMtPnIxKSB7Ci0JCWlmIChRU0ZQX0lTX0FDVElWRV9GQVIocWQtPmNhY2hlLnRlY2gpKQotCQkJbGUyID0gTEUyX1FNRTsKLQkJZWxzZSBpZiAocWQtPmNhY2hlLmF0dGVuWzFdID49IHFpYl9sb25nX2F0dGVuICYmCi0JCQkgUVNGUF9JU19DVShxZC0+Y2FjaGUudGVjaCkpCi0JCQlsZTIgPSBMRTJfNW07Ci0JCWVsc2UKKwkvKiBEZWxheSBmb3IgMjAgbXNlY3MgdG8gYWxsb3cgTW9kUHJzIHJlc2lzdG9yIHRvIHNldHVwICovCisJbWRlbGF5KFFTRlBfTU9EUFJTX0xBR19NU0VDKTsKKworCWlmICghcWliX3FzZnBfbW9kX3ByZXNlbnQocHBkKSkgeworCQlwcGQtPmNwc3BlYy0+cXNmcF9kYXRhLm1vZHByZXNlbnQgPSAwOworCQkvKiBTZXQgdGhlIHBoeXNpY2FsIGxpbmsgdG8gZGlzYWJsZWQgKi8KKwkJcWliX3NldF9pYl83MzIyX2xzdGF0ZShwcGQsIDAsCisJCQkJICAgICAgIFFMT0dJQ19JQl9JQkNDX0xJTktJTklUQ01EX0RJU0FCTEUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHBkLT5sZmxhZ3NfbG9jaywgZmxhZ3MpOworCQlwcGQtPmxmbGFncyAmPSB+UUlCTF9MSU5LVjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBkLT5sZmxhZ3NfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFNvbWUgUVNGUCdzIG5vdCBvbmx5IGRvIG5vdCByZXNwb25kIHVudGlsIHRoZSBmdWxsIHBvd2VyLXVwCisJCSAqIHRpbWUsIGJ1dCBtYXkgYmVoYXZlIGJhZGx5IGlmIHdlIHRyeS4gU28gaG9sZCBvZmYgcmVzcG9uZGluZworCQkgKiB0byBpbnNlcnRpb24uCisJCSAqLworCQl3aGlsZSAoMSkgeworCQkJdTY0IG5vdyA9IGdldF9qaWZmaWVzXzY0KCk7CisJCQlpZiAodGltZV9hZnRlcjY0KG5vdywgcHdydXApKQorCQkJCWJyZWFrOworCQkJbXNsZWVwKDIwKTsKKwkJfQorCisJCXJldCA9IHFpYl9yZWZyZXNoX3FzZnBfY2FjaGUocHBkLCAmcWQtPmNhY2hlKTsKKworCQkvKgorCQkgKiBOZWVkIHRvIGNoYW5nZSBMRTIgYmFjayB0byBkZWZhdWx0cyBpZiB3ZSBjb3VsZG4ndAorCQkgKiByZWFkIHRoZSBjYWJsZSB0eXBlICh0byBoYW5kbGUgY2FibGUgc3dhcHMpLCBzbyBkbyB0aGlzCisJCSAqIGV2ZW4gb24gZmFpbHVyZSB0byByZWFkIGNhYmxlIGluZm9ybWF0aW9uLiAgV2UgZG9uJ3QKKwkJICogZ2V0IGhlcmUgZm9yIFFNRSwgc28gSVNfUU1FIGNoZWNrIG5vdCBuZWVkZWQgaGVyZS4KKwkJICovCisJCWlmICghcmV0ICYmICFwcGQtPmRkLT5jc3BlYy0+cjEpIHsKKwkJCWlmIChRU0ZQX0lTX0FDVElWRV9GQVIocWQtPmNhY2hlLnRlY2gpKQorCQkJCWxlMiA9IExFMl9RTUU7CisJCQllbHNlIGlmIChxZC0+Y2FjaGUuYXR0ZW5bMV0gPj0gcWliX2xvbmdfYXR0ZW4gJiYKKwkJCQkgUVNGUF9JU19DVShxZC0+Y2FjaGUudGVjaCkpCisJCQkJbGUyID0gTEUyXzVtOworCQkJZWxzZQorCQkJCWxlMiA9IExFMl9ERUZBVUxUOworCQl9IGVsc2UKIAkJCWxlMiA9IExFMl9ERUZBVUxUOwotCX0gZWxzZQotCQlsZTIgPSBMRTJfREVGQVVMVDsKLQlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTMsIChsZTIgPDwgNyksIEJNQVNLKDksIDcpKTsKLQlpbml0X3R4ZGRzX3RhYmxlKHBwZCwgMCk7CisJCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMywgKGxlMiA8PCA3KSwgQk1BU0soOSwgNykpOworCQkvKgorCQkgKiBXZSBhbHdheXMgY2hhbmdlIHBhcmFtZXRldGVycywgc2luY2Ugd2UgY2FuIGNob29zZQorCQkgKiB2YWx1ZXMgZm9yIGNhYmxlcyB3aXRob3V0IGVlcHJvbXMsIGFuZCB0aGUgY2FibGUgbWF5IGhhdmUKKwkJICogY2hhbmdlZCBmcm9tIGEgY2FibGUgd2l0aCBmdWxsIG9yIHBhcnRpYWwgZWVwcm9tIGNvbnRlbnQKKwkJICogdG8gb25lIHdpdGggcGFydGlhbCBvciBubyBjb250ZW50LgorCQkgKi8KKwkJaW5pdF90eGRkc190YWJsZShwcGQsIDApOworCQkvKiBUaGUgcGh5c2ljYWwgbGluayBpcyBiZWluZyByZS1lbmFibGVkIG9ubHkgd2hlbiB0aGUKKwkJICogcHJldmlvdXMgc3RhdGUgd2FzIERJU0FCTEVEIGFuZCB0aGUgVkFMSUQgYml0IGlzIG5vdAorCQkgKiBzZXQuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gIHRoZSBjYWJsZSBoYXMgYmVlbgorCQkgKiBwaHlzaWNhbGx5IHB1bGxlZC4gKi8KKwkJaWYgKCFwcGQtPmNwc3BlYy0+cXNmcF9kYXRhLm1vZHByZXNlbnQgJiYKKwkJICAgIChwcGQtPmxmbGFncyAmIChRSUJMX0xJTktWIHwgUUlCTF9JQl9MSU5LX0RJU0FCTEVEKSkpIHsKKwkJCXBwZC0+Y3BzcGVjLT5xc2ZwX2RhdGEubW9kcHJlc2VudCA9IDE7CisJCQlxaWJfc2V0X2liXzczMjJfbHN0YXRlKHBwZCwgMCwKKwkJCQlRTE9HSUNfSUJfSUJDQ19MSU5LSU5JVENNRF9TTEVFUCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHBkLT5sZmxhZ3NfbG9jaywgZmxhZ3MpOworCQkJcHBkLT5sZmxhZ3MgfD0gUUlCTF9MSU5LVjsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZC0+bGZsYWdzX2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KIH0KIAogLyoKQEAgLTU3MjcsNyArNTc2OSw4IEBACiAJCQkvKiBub3cgY2hhbmdlIHRoZSBJQkMgYW5kIHNlcmRlcywgb3ZlcnJpZGluZyBnZW5lcmljICovCiAJCQlpbml0X3R4ZGRzX3RhYmxlKHBwZCwgMSk7CiAJCQkvKiBSZS1lbmFibGUgdGhlIHBoeXNpY2FsIHN0YXRlIG1hY2hpbmUgb24gbWV6eiBib2FyZHMKLQkJCSAqIG5vdyB0aGF0IHRoZSBjb3JyZWN0IHNldHRpbmdzIGhhdmUgYmVlbiBzZXQuICovCisJCQkgKiBub3cgdGhhdCB0aGUgY29ycmVjdCBzZXR0aW5ncyBoYXZlIGJlZW4gc2V0LgorCQkJICogUVNGUCBib2FyZHMgYXJlIGhhbmRsZXMgYnkgdGhlIFFTRlAgZXZlbnQgaGFuZGxlciAqLwogCQkJaWYgKElTX1FNSChkZCkgfHwgSVNfUU1FKGRkKSkKIAkJCQlxaWJfc2V0X2liXzczMjJfbHN0YXRlKHBwZCwgMCwKIAkJCQkJICAgIFFMT0dJQ19JQl9JQkNDX0xJTktJTklUQ01EX1NMRUVQKTsKQEAgLTYyMDUsNiArNjI0OCw4IEBACiAKIAkvKiB3ZSBhbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgMjA0OCBieXRlcyBmb3IgZWFnZXIgYnVmZmVycyAqLwogCWRkLT5yY3ZlZ3JidWZzaXplID0gbWF4KG10dSwgMjA0OCk7CisJQlVHX09OKCFpc19wb3dlcl9vZl8yKGRkLT5yY3ZlZ3JidWZzaXplKSk7CisJZGQtPnJjdmVncmJ1ZnNpemVfc2hpZnQgPSBpbG9nMihkZC0+cmN2ZWdyYnVmc2l6ZSk7CiAKIAlxaWJfNzMyMl90aWR0ZW1wbGF0ZShkZCk7CiAKQEAgLTcxNDcsNyArNzE5Miw4IEBACiAJCX0KIAl9CiAKLQkvKiBMb29rdXAgc2VyZGVzIHNldHRpbmcgYnkgY2FibGUgdHlwZSBhbmQgYXR0ZW51YXRpb24gKi8KKwkvKiBBY3RpdmUgY2FibGVzIGRvbid0IGhhdmUgYXR0ZW51YXRpb24gc28gd2Ugb25seSBzZXQgU0VSREVTCisJICogc2V0dGluZ3MgdG8gYWNjb3VudCBmb3IgdGhlIGF0dGVudWF0aW9uIG9mIHRoZSBib2FyZCB0cmFjZXMuICovCiAJaWYgKCFvdmVycmlkZSAmJiBRU0ZQX0lTX0FDVElWRShxZC0+dGVjaCkpIHsKIAkJKnNkcl9kZHMgPSB0eGRkc19zZHIgKyBwcGQtPmRkLT5ib2FyZF9hdHRlbjsKIAkJKmRkcl9kZHMgPSB0eGRkc19kZHIgKyBwcGQtPmRkLT5ib2FyZF9hdHRlbjsKQEAgLTc0NjQsMTIgKzc1MTAsNiBAQAogCXUzMiBsZV92YWwsIHJ4Y2FsZG9uZTsKIAlpbnQgY2hhbiwgY2hhbl9kb25lID0gKDEgPDwgU0VSREVTX0NIQU5TKSAtIDE7CiAKLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIFR4IEREUyB0YWJsZXMuICBBbHNvIGRvbmUgZXZlcnkgUVNGUCBldmVudCwKLQkgKiBmb3IgYWRhcHRlcnMgd2l0aCBRU0ZQCi0JICovCi0JaW5pdF90eGRkc190YWJsZShwcGQsIDApOwotCiAJLyogQ2xlYXIgY21vZGUtb3ZlcnJpZGUsIG1heSBiZSBzZXQgZnJvbSBvbGRlciBkcml2ZXIgKi8KIAlhaGJfbW9kKHBwZC0+ZGQsIElCU0QocHBkLT5od19waWR4KSwgNSwgMTAsIDAgPDwgMTQsIDEgPDwgMTQpOwogCkBAIC03NjU1LDYgKzc2OTUsMTIgQEAKIAkvKiBWR0Egb3V0cHV0IGNvbW1vbiBtb2RlICovCiAJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEyLCAoMyA8PCAyKSwgQk1BU0soMywgMikpOwogCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBUeCBERFMgdGFibGVzLiAgQWxzbyBkb25lIGV2ZXJ5IFFTRlAgZXZlbnQsCisJICogZm9yIGFkYXB0ZXJzIHdpdGggUVNGUAorCSAqLworCWluaXRfdHhkZHNfdGFibGUocHBkLCAwKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbml0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbml0LmMKaW5kZXggYTAxZjNmYy4uNThiMGY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaW5pdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2luaXQuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAicWliLmgiCiAjaW5jbHVkZSAicWliX2NvbW1vbi5oIgpAQCAtMTgzLDYgKzE4NCw5IEBACiAJCXJjZC0+cmN2ZWdyYnVmX2NodW5rcyA9IChyY2QtPnJjdmVncmNudCArCiAJCQlyY2QtPnJjdmVncmJ1ZnNfcGVyY2h1bmsgLSAxKSAvCiAJCQlyY2QtPnJjdmVncmJ1ZnNfcGVyY2h1bms7CisJCUJVR19PTighaXNfcG93ZXJfb2ZfMihyY2QtPnJjdmVncmJ1ZnNfcGVyY2h1bmspKTsKKwkJcmNkLT5yY3ZlZ3JidWZzX3BlcmNodW5rX3NoaWZ0ID0KKwkJCWlsb2cyKHJjZC0+cmN2ZWdyYnVmc19wZXJjaHVuayk7CiAJfQogCXJldHVybiByY2Q7CiB9CkBAIC0zOTgsNiArNDAyLDcgQEAKIAkJaWYgKHJjZCkKIAkJCWRkLT5mX3JjdmN0cmwocmNkLT5wcGQsIHJjdm1hc2ssIGkpOwogCX0KKwlkZC0+ZnJlZWN0eHRzID0gZGQtPmNmZ2N0eHRzIC0gZGQtPmZpcnN0X3VzZXJfY3R4dDsKIH0KIAogc3RhdGljIHZvaWQgdmVyaWZ5X2ludGVycnVwdCh1bnNpZ25lZCBsb25nIG9wYXF1ZSkKQEAgLTU4MSwxMCArNTg2LDYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJLyogbGV0IGxpbmsgY29tZSB1cCwgYW5kIGVuYWJsZSBJQkMgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBwZC0+bGZsYWdzX2xvY2ssIGZsYWdzKTsKLQkJcHBkLT5sZmxhZ3MgJj0gflFJQkxfSUJfTElOS19ESVNBQkxFRDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBkLT5sZmxhZ3NfbG9jaywgZmxhZ3MpOwogCQlwb3J0b2srKzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3BjaWUuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3BjaWUuYwppbmRleCA0NDI2NzgyLi45N2E4YmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9wY2llLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcGNpZS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvYWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJxaWIuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMKaW5kZXggZTE2NzUxZi4uN2U3ZTE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xcC5jCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KIAogI2luY2x1ZGUgInFpYi5oIgogCkBAIC0yMDQsNiArMjA1LDEzIEBACiAJCWNsZWFyX2JpdChxcG4gJiBCSVRTX1BFUl9QQUdFX01BU0ssIG1hcC0+cGFnZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcXBuX2hhc2goc3RydWN0IHFpYl9pYmRldiAqZGV2LCB1MzIgcXBuKQoreworCXJldHVybiBqaGFzaF8xd29yZChxcG4sIGRldi0+cXBfcm5kKSAmCisJCShkZXYtPnFwX3RhYmxlX3NpemUgLSAxKTsKK30KKworCiAvKgogICogUHV0IHRoZSBRUCBpbnRvIHRoZSBoYXNoIHRhYmxlLgogICogVGhlIGhhc2ggdGFibGUgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIFFQLgpAQCAtMjExLDIyICsyMTksMjMgQEAKIHN0YXRpYyB2b2lkIGluc2VydF9xcChzdHJ1Y3QgcWliX2liZGV2ICpkZXYsIHN0cnVjdCBxaWJfcXAgKnFwKQogewogCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSB0b19pcG9ydChxcC0+aWJxcC5kZXZpY2UsIHFwLT5wb3J0X251bSk7Ci0JdW5zaWduZWQgbiA9IHFwLT5pYnFwLnFwX251bSAlIGRldi0+cXBfdGFibGVfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIG4gPSBxcG5faGFzaChkZXYsIHFwLT5pYnFwLnFwX251bSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5xcHRfbG9jaywgZmxhZ3MpOwotCi0JaWYgKHFwLT5pYnFwLnFwX251bSA9PSAwKQotCQlpYnAtPnFwMCA9IHFwOwotCWVsc2UgaWYgKHFwLT5pYnFwLnFwX251bSA9PSAxKQotCQlpYnAtPnFwMSA9IHFwOwotCWVsc2UgewotCQlxcC0+bmV4dCA9IGRldi0+cXBfdGFibGVbbl07Ci0JCWRldi0+cXBfdGFibGVbbl0gPSBxcDsKLQl9CiAJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKIAorCWlmIChxcC0+aWJxcC5xcF9udW0gPT0gMCkKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGlicC0+cXAwLCBxcCk7CisJZWxzZSBpZiAocXAtPmlicXAucXBfbnVtID09IDEpCisJCXJjdV9hc3NpZ25fcG9pbnRlcihpYnAtPnFwMSwgcXApOworCWVsc2UgeworCQlxcC0+bmV4dCA9IGRldi0+cXBfdGFibGVbbl07CisJCXJjdV9hc3NpZ25fcG9pbnRlcihkZXYtPnFwX3RhYmxlW25dLCBxcCk7CisJfQorCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5xcHRfbG9jaywgZmxhZ3MpOworCXN5bmNocm9uaXplX3JjdSgpOwogfQogCiAvKgpAQCAtMjM2LDI5ICsyNDUsMzIgQEAKIHN0YXRpYyB2b2lkIHJlbW92ZV9xcChzdHJ1Y3QgcWliX2liZGV2ICpkZXYsIHN0cnVjdCBxaWJfcXAgKnFwKQogewogCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSB0b19pcG9ydChxcC0+aWJxcC5kZXZpY2UsIHFwLT5wb3J0X251bSk7Ci0Jc3RydWN0IHFpYl9xcCAqcSwgKipxcHA7CisJdW5zaWduZWQgbiA9IHFwbl9oYXNoKGRldiwgcXAtPmlicXAucXBfbnVtKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcXBwID0gJmRldi0+cXBfdGFibGVbcXAtPmlicXAucXBfbnVtICUgZGV2LT5xcF90YWJsZV9zaXplXTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnFwdF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoaWJwLT5xcDAgPT0gcXApIHsKLQkJaWJwLT5xcDAgPSBOVUxMOwogCQlhdG9taWNfZGVjKCZxcC0+cmVmY291bnQpOworCQlyY3VfYXNzaWduX3BvaW50ZXIoaWJwLT5xcDAsIE5VTEwpOwogCX0gZWxzZSBpZiAoaWJwLT5xcDEgPT0gcXApIHsKLQkJaWJwLT5xcDEgPSBOVUxMOwogCQlhdG9taWNfZGVjKCZxcC0+cmVmY291bnQpOwotCX0gZWxzZQorCQlyY3VfYXNzaWduX3BvaW50ZXIoaWJwLT5xcDEsIE5VTEwpOworCX0gZWxzZSB7CisJCXN0cnVjdCBxaWJfcXAgKnEsICoqcXBwOworCisJCXFwcCA9ICZkZXYtPnFwX3RhYmxlW25dOwogCQlmb3IgKDsgKHEgPSAqcXBwKSAhPSBOVUxMOyBxcHAgPSAmcS0+bmV4dCkKIAkJCWlmIChxID09IHFwKSB7Ci0JCQkJKnFwcCA9IHFwLT5uZXh0OwotCQkJCXFwLT5uZXh0ID0gTlVMTDsKIAkJCQlhdG9taWNfZGVjKCZxcC0+cmVmY291bnQpOworCQkJCXJjdV9hc3NpZ25fcG9pbnRlcigqcXBwLCBxcC0+bmV4dCk7CisJCQkJcXAtPm5leHQgPSBOVUxMOwogCQkJCWJyZWFrOwogCQkJfQorCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cXB0X2xvY2ssIGZsYWdzKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIAogLyoqCkBAIC0yODAsMjEgKzI5MiwyNCBAQAogCiAJCWlmICghcWliX21jYXN0X3RyZWVfZW1wdHkoaWJwKSkKIAkJCXFwX2ludXNlKys7Ci0JCWlmIChpYnAtPnFwMCkKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpZiAocmN1X2RlcmVmZXJlbmNlKGlicC0+cXAwKSkKIAkJCXFwX2ludXNlKys7Ci0JCWlmIChpYnAtPnFwMSkKKwkJaWYgKHJjdV9kZXJlZmVyZW5jZShpYnAtPnFwMSkpCiAJCQlxcF9pbnVzZSsrOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5xcHRfbG9jaywgZmxhZ3MpOwogCWZvciAobiA9IDA7IG4gPCBkZXYtPnFwX3RhYmxlX3NpemU7IG4rKykgewogCQlxcCA9IGRldi0+cXBfdGFibGVbbl07Ci0JCWRldi0+cXBfdGFibGVbbl0gPSBOVUxMOworCQlyY3VfYXNzaWduX3BvaW50ZXIoZGV2LT5xcF90YWJsZVtuXSwgTlVMTCk7CiAKIAkJZm9yICg7IHFwOyBxcCA9IHFwLT5uZXh0KQogCQkJcXBfaW51c2UrKzsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5xcHRfbG9jaywgZmxhZ3MpOworCXN5bmNocm9uaXplX3JjdSgpOwogCiAJcmV0dXJuIHFwX2ludXNlOwogfQpAQCAtMzA5LDI1ICszMjQsMjggQEAKICAqLwogc3RydWN0IHFpYl9xcCAqcWliX2xvb2t1cF9xcG4oc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgdTMyIHFwbikKIHsKLQlzdHJ1Y3QgcWliX2liZGV2ICpkZXYgPSAmcHBkX2Zyb21faWJwKGlicCktPmRkLT52ZXJic19kZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgcWliX3FwICpxcDsKKwlzdHJ1Y3QgcWliX3FwICpxcCA9IE5VTEw7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5xcHRfbG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseShxcG4gPD0gMSkpIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpZiAocXBuID09IDApCisJCQlxcCA9IHJjdV9kZXJlZmVyZW5jZShpYnAtPnFwMCk7CisJCWVsc2UKKwkJCXFwID0gcmN1X2RlcmVmZXJlbmNlKGlicC0+cXAxKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcWliX2liZGV2ICpkZXYgPSAmcHBkX2Zyb21faWJwKGlicCktPmRkLT52ZXJic19kZXY7CisJCXVuc2lnbmVkIG4gPSBxcG5faGFzaChkZXYsIHFwbik7CiAKLQlpZiAocXBuID09IDApCi0JCXFwID0gaWJwLT5xcDA7Ci0JZWxzZSBpZiAocXBuID09IDEpCi0JCXFwID0gaWJwLT5xcDE7Ci0JZWxzZQotCQlmb3IgKHFwID0gZGV2LT5xcF90YWJsZVtxcG4gJSBkZXYtPnFwX3RhYmxlX3NpemVdOyBxcDsKLQkJICAgICBxcCA9IHFwLT5uZXh0KQorCQlyY3VfcmVhZF9sb2NrKCk7CisJCWZvciAocXAgPSBkZXYtPnFwX3RhYmxlW25dOyByY3VfZGVyZWZlcmVuY2UocXApOyBxcCA9IHFwLT5uZXh0KQogCQkJaWYgKHFwLT5pYnFwLnFwX251bSA9PSBxcG4pCiAJCQkJYnJlYWs7CisJfQogCWlmIChxcCkKLQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJaWYgKHVubGlrZWx5KCFhdG9taWNfaW5jX25vdF96ZXJvKCZxcC0+cmVmY291bnQpKSkKKwkJCXFwID0gTlVMTDsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cXB0X2xvY2ssIGZsYWdzKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcXA7CiB9CiAKQEAgLTc2NSw4ICs3ODMsMTAgQEAKIAkJfQogCX0KIAotCWlmIChhdHRyX21hc2sgJiBJQl9RUF9QQVRIX01UVSkKKwlpZiAoYXR0cl9tYXNrICYgSUJfUVBfUEFUSF9NVFUpIHsKIAkJcXAtPnBhdGhfbXR1ID0gcG10dTsKKwkJcXAtPnBtdHUgPSBpYl9tdHVfZW51bV90b19pbnQocG10dSk7CisJfQogCiAJaWYgKGF0dHJfbWFzayAmIElCX1FQX1JFVFJZX0NOVCkgewogCQlxcC0+c19yZXRyeV9jbnQgPSBhdHRyLT5yZXRyeV9jbnQ7CkBAIC03ODEsOCArODAxLDEyIEBACiAJaWYgKGF0dHJfbWFzayAmIElCX1FQX01JTl9STlJfVElNRVIpCiAJCXFwLT5yX21pbl9ybnJfdGltZXIgPSBhdHRyLT5taW5fcm5yX3RpbWVyOwogCi0JaWYgKGF0dHJfbWFzayAmIElCX1FQX1RJTUVPVVQpCisJaWYgKGF0dHJfbWFzayAmIElCX1FQX1RJTUVPVVQpIHsKIAkJcXAtPnRpbWVvdXQgPSBhdHRyLT50aW1lb3V0OworCQlxcC0+dGltZW91dF9qaWZmaWVzID0KKwkJCXVzZWNzX3RvX2ppZmZpZXMoKDQwOTZVTCAqICgxVUwgPDwgcXAtPnRpbWVvdXQpKSAvCisJCQkJMTAwMFVMKTsKKwl9CiAKIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfUUtFWSkKIAkJcXAtPnFrZXkgPSBhdHRyLT5xa2V5OwpAQCAtMTAxMyw2ICsxMDM3LDEwIEBACiAJCQlyZXQgPSBFUlJfUFRSKC1FTk9NRU0pOwogCQkJZ290byBiYWlsX3N3cTsKIAkJfQorCQlSQ1VfSU5JVF9QT0lOVEVSKHFwLT5uZXh0LCBOVUxMKTsKKwkJcXAtPnRpbWVvdXRfamlmZmllcyA9CisJCQl1c2Vjc190b19qaWZmaWVzKCg0MDk2VUwgKiAoMVVMIDw8IHFwLT50aW1lb3V0KSkgLworCQkJCTEwMDBVTCk7CiAJCWlmIChpbml0X2F0dHItPnNycSkKIAkJCXN6ID0gMDsKIAkJZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xc2ZwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xc2ZwLmMKaW5kZXggMzM3NGE1Mi4uZTA2YzRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXNmcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FzZnAuYwpAQCAtMjczLDE4ICsyNzMsMTIgQEAKIAlpbnQgcmV0OwogCWludCBpZHg7CiAJdTE2IGNrczsKLQl1MzIgbWFzazsKIAl1OCBwZWVrWzRdOwogCiAJLyogZW5zdXJlIHNhbmUgY29udGVudHMgb24gaW52YWxpZCByZWFkcywgZm9yIGNhYmxlIHN3YXBzICovCiAJbWVtc2V0KGNwLCAwLCBzaXplb2YoKmNwKSk7CiAKLQltYXNrID0gUVNGUF9HUElPX01PRF9QUlNfTjsKLQlpZiAocHBkLT5od19waWR4KQotCQltYXNrIDw8PSBRU0ZQX0dQSU9fUE9SVDJfU0hJRlQ7Ci0KLQlyZXQgPSBwcGQtPmRkLT5mX2dwaW9fbW9kKHBwZC0+ZGQsIDAsIDAsIDApOwotCWlmIChyZXQgJiBtYXNrKSB7CisJaWYgKCFxaWJfcXNmcF9tb2RfcHJlc2VudChwcGQpKSB7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC00NDQsNiArNDM4LDE5IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpwd3JfY29kZXMgPSAiMS41VzIuMFcyLjVXMy41VyI7CiAKK2ludCBxaWJfcXNmcF9tb2RfcHJlc2VudChzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkKQoreworCXUzMiBtYXNrOworCWludCByZXQ7CisKKwltYXNrID0gUVNGUF9HUElPX01PRF9QUlNfTiA8PAorCQkocHBkLT5od19waWR4ICogUVNGUF9HUElPX1BPUlQyX1NISUZUKTsKKwlyZXQgPSBwcGQtPmRkLT5mX2dwaW9fbW9kKHBwZC0+ZGQsIDAsIDAsIDApOworCisJcmV0dXJuICEoKHJldCAmIG1hc2spID4+CisJCSAoKHBwZC0+aHdfcGlkeCAqIFFTRlBfR1BJT19QT1JUMl9TSElGVCkgKyAzKSk7Cit9CisKIC8qCiAgKiBJbml0aWFsaXplIHN0cnVjdHVyZXMgdGhhdCBjb250cm9sIGFjY2VzcyB0byBRU0ZQLiBDYWxsZWQgb25jZSBwZXIgcG9ydAogICogb24gY2FyZHMgdGhhdCBzdXBwb3J0IFFTRlAuCkBAIC00NTIsNyArNDU5LDYgQEAKIAkJICAgdm9pZCAoKmZldmVudCkoc3RydWN0IHdvcmtfc3RydWN0ICopKQogewogCXUzMiBtYXNrLCBoaWdoczsKLQlpbnQgcGluczsKIAogCXN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQgPSBxZC0+cHBkLT5kZDsKIApAQCAtNDgwLDggKzQ4Niw3IEBACiAJCW1hc2sgPDw9IFFTRlBfR1BJT19QT1JUMl9TSElGVDsKIAogCS8qIERvIG5vdCB0cnkgdG8gd2FpdCBoZXJlLiBCZXR0ZXIgdG8gbGV0IGV2ZW50IGhhbmRsZSBpdCAqLwotCXBpbnMgPSBkZC0+Zl9ncGlvX21vZChkZCwgMCwgMCwgMCk7Ci0JaWYgKHBpbnMgJiBtYXNrKQorCWlmICghcWliX3FzZnBfbW9kX3ByZXNlbnQocWQtPnBwZCkpCiAJCWdvdG8gYmFpbDsKIAkvKiBXZSBzZWUgYSBtb2R1bGUsIGJ1dCBpdCBtYXkgYmUgdW53aXNlIHRvIGxvb2sgeWV0LiBKdXN0IHNjaGVkdWxlICovCiAJcWQtPnRfaW5zZXJ0ID0gZ2V0X2ppZmZpZXNfNjQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FzZnAuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FzZnAuaAppbmRleCBjMTA5YmJkLi40NjAwMmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xc2ZwLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXNmcC5oCkBAIC0zNCw2ICszNCw3IEBACiAKICNkZWZpbmUgUVNGUF9ERVYgMHhBMAogI2RlZmluZSBRU0ZQX1BXUl9MQUdfTVNFQyAyMDAwCisjZGVmaW5lIFFTRlBfTU9EUFJTX0xBR19NU0VDIDIwCiAKIC8qCiAgKiBCZWxvdyBhcmUgbWFza3MgZm9yIHZhcmlvdXMgUVNGUCBzaWduYWxzLCBmb3IgUG9ydCAxLgpAQCAtMTc3LDEwICsxNzgsMTIgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgcWliX3FzZnBfY2FjaGUgY2FjaGU7CiAJdTY0IHRfaW5zZXJ0OworCXU4IG1vZHByZXNlbnQ7CiB9OwogCiBleHRlcm4gaW50IHFpYl9yZWZyZXNoX3FzZnBfY2FjaGUoc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCwKIAkJCQkgIHN0cnVjdCBxaWJfcXNmcF9jYWNoZSAqY3ApOworZXh0ZXJuIGludCBxaWJfcXNmcF9tb2RfcHJlc2VudChzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkKTsKIGV4dGVybiB2b2lkIHFpYl9xc2ZwX2luaXQoc3RydWN0IHFpYl9xc2ZwX2RhdGEgKnFkLAogCQkJICB2b2lkICgqZmV2ZW50KShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikpOwogZXh0ZXJuIHZvaWQgcWliX3FzZnBfZGVpbml0KHN0cnVjdCBxaWJfcXNmcF9kYXRhICpxZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9yYy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYwppbmRleCBlY2EwYzQxLi44OTRhZmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9yYy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3JjLmMKQEAgLTU5LDggKzU5LDcgQEAKIAlxcC0+c19mbGFncyB8PSBRSUJfU19USU1FUjsKIAlxcC0+c190aW1lci5mdW5jdGlvbiA9IHJjX3RpbWVvdXQ7CiAJLyogNC4wOTYgdXNlYy4gKiAoMSA8PCBxcC0+dGltZW91dCkgKi8KLQlxcC0+c190aW1lci5leHBpcmVzID0gamlmZmllcyArCi0JCXVzZWNzX3RvX2ppZmZpZXMoKDQwOTZVTCAqICgxVUwgPDwgcXAtPnRpbWVvdXQpKSAvIDEwMDBVTCk7CisJcXAtPnNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBxcC0+dGltZW91dF9qaWZmaWVzOwogCWFkZF90aW1lcigmcXAtPnNfdGltZXIpOwogfQogCkBAIC0yMzksNyArMjM4LDcgQEAKIAl1MzIgbGVuOwogCXUzMiBidGgwOwogCXUzMiBidGgyOwotCXUzMiBwbXR1ID0gaWJfbXR1X2VudW1fdG9faW50KHFwLT5wYXRoX210dSk7CisJdTMyIHBtdHUgPSBxcC0+cG10dTsKIAljaGFyIG5ld3JlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAwOwpAQCAtMjcyLDEzICsyNzEsOSBAQAogCQkJZ290byBiYWlsOwogCQl9CiAJCXdxZSA9IGdldF9zd3FlX3B0cihxcCwgcXAtPnNfbGFzdCk7Ci0JCXdoaWxlIChxcC0+c19sYXN0ICE9IHFwLT5zX2Fja2VkKSB7Ci0JCQlxaWJfc2VuZF9jb21wbGV0ZShxcCwgd3FlLCBJQl9XQ19TVUNDRVNTKTsKLQkJCWlmICgrK3FwLT5zX2xhc3QgPj0gcXAtPnNfc2l6ZSkKLQkJCQlxcC0+c19sYXN0ID0gMDsKLQkJCXdxZSA9IGdldF9zd3FlX3B0cihxcCwgcXAtPnNfbGFzdCk7Ci0JCX0KLQkJcWliX3NlbmRfY29tcGxldGUocXAsIHdxZSwgSUJfV0NfV1JfRkxVU0hfRVJSKTsKKwkJcWliX3NlbmRfY29tcGxldGUocXAsIHdxZSwgcXAtPnNfbGFzdCAhPSBxcC0+c19hY2tlZCA/CisJCQlJQl9XQ19TVUNDRVNTIDogSUJfV0NfV1JfRkxVU0hfRVJSKTsKKwkJLyogd2lsbCBnZXQgY2FsbGVkIGFnYWluICovCiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTE1MTksOSArMTUxNCw3IEBACiAJCSAqIDQuMDk2IHVzZWMuICogKDEgPDwgcXAtPnRpbWVvdXQpCiAJCSAqLwogCQlxcC0+c19mbGFncyB8PSBRSUJfU19USU1FUjsKLQkJbW9kX3RpbWVyKCZxcC0+c190aW1lciwgamlmZmllcyArCi0JCQl1c2Vjc190b19qaWZmaWVzKCg0MDk2VUwgKiAoMVVMIDw8IHFwLT50aW1lb3V0KSkgLwotCQkJCQkgMTAwMFVMKSk7CisJCW1vZF90aW1lcigmcXAtPnNfdGltZXIsIGppZmZpZXMgKyBxcC0+dGltZW91dF9qaWZmaWVzKTsKIAkJaWYgKHFwLT5zX2ZsYWdzICYgUUlCX1NfV0FJVF9BQ0spIHsKIAkJCXFwLT5zX2ZsYWdzICY9IH5RSUJfU19XQUlUX0FDSzsKIAkJCXFpYl9zY2hlZHVsZV9zZW5kKHFwKTsKQEAgLTE3MzIsNyArMTcyNSw3IEBACiAJCSAqIHNhbWUgcmVxdWVzdC4KIAkJICovCiAJCW9mZnNldCA9ICgocHNuIC0gZS0+cHNuKSAmIFFJQl9QU05fTUFTSykgKgotCQkJaWJfbXR1X2VudW1fdG9faW50KHFwLT5wYXRoX210dSk7CisJCQlxcC0+cG10dTsKIAkJbGVuID0gYmUzMl90b19jcHUocmV0aC0+bGVuZ3RoKTsKIAkJaWYgKHVubGlrZWx5KG9mZnNldCArIGxlbiAhPSBlLT5yZG1hX3NnZS5zZ2VfbGVuZ3RoKSkKIAkJCWdvdG8gdW5sb2NrX2RvbmU7CkBAIC0xODc2LDcgKzE4NjksNyBAQAogCXUzMiBwc247CiAJdTMyIHBhZDsKIAlzdHJ1Y3QgaWJfd2Mgd2M7Ci0JdTMyIHBtdHUgPSBpYl9tdHVfZW51bV90b19pbnQocXAtPnBhdGhfbXR1KTsKKwl1MzIgcG10dSA9IHFwLT5wbXR1OwogCWludCBkaWZmOwogCXN0cnVjdCBpYl9yZXRoICpyZXRoOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xODkyLDEwICsxODg1LDggQEAKIAl9CiAKIAlvcGNvZGUgPSBiZTMyX3RvX2NwdShvaGRyLT5idGhbMF0pOwotCXNwaW5fbG9ja19pcnFzYXZlKCZxcC0+c19sb2NrLCBmbGFncyk7CiAJaWYgKHFpYl9ydWNfY2hlY2tfaGRyKGlicCwgaGRyLCBoYXNfZ3JoLCBxcCwgb3Bjb2RlKSkKLQkJZ290byBzdW5sb2NrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOwogCiAJcHNuID0gYmUzMl90b19jcHUob2hkci0+YnRoWzJdKTsKIAlvcGNvZGUgPj49IDI0OwpAQCAtMTk1NSw4ICsxOTQ2LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JbWVtc2V0KCZ3YywgMCwgc2l6ZW9mIHdjKTsKLQogCWlmIChxcC0+c3RhdGUgPT0gSUJfUVBTX1JUUiAmJiAhKHFwLT5yX2ZsYWdzICYgUUlCX1JfQ09NTV9FU1QpKSB7CiAJCXFwLT5yX2ZsYWdzIHw9IFFJQl9SX0NPTU1fRVNUOwogCQlpZiAocXAtPmlicXAuZXZlbnRfaGFuZGxlcikgewpAQCAtMjAwOSwxNiArMTk5OCwxOSBAQAogCQkJZ290byBybnJfbmFrOwogCQlxcC0+cl9yY3ZfbGVuID0gMDsKIAkJaWYgKG9wY29kZSA9PSBPUChTRU5EX09OTFkpKQotCQkJZ290byBzZW5kX2xhc3Q7Ci0JCS8qIEZBTExUSFJPVUdIICovCisJCQlnb3RvIG5vX2ltbWVkaWF0ZV9kYXRhOworCQkvKiBGQUxMVEhST1VHSCBmb3IgU0VORF9PTkxZX1dJVEhfSU1NRURJQVRFICovCiAJY2FzZSBPUChTRU5EX0xBU1RfV0lUSF9JTU1FRElBVEUpOgogc2VuZF9sYXN0X2ltbToKIAkJd2MuZXguaW1tX2RhdGEgPSBvaGRyLT51LmltbV9kYXRhOwogCQloZHJzaXplICs9IDQ7CiAJCXdjLndjX2ZsYWdzID0gSUJfV0NfV0lUSF9JTU07Ci0JCS8qIEZBTExUSFJPVUdIICovCisJCWdvdG8gc2VuZF9sYXN0OwogCWNhc2UgT1AoU0VORF9MQVNUKToKIAljYXNlIE9QKFJETUFfV1JJVEVfTEFTVCk6Citub19pbW1lZGlhdGVfZGF0YToKKwkJd2Mud2NfZmxhZ3MgPSAwOworCQl3Yy5leC5pbW1fZGF0YSA9IDA7CiBzZW5kX2xhc3Q6CiAJCS8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBtZXNzYWdlIHdhcyBwYWRkZWQgYnkuICovCiAJCXBhZCA9IChiZTMyX3RvX2NwdShvaGRyLT5idGhbMF0pID4+IDIwKSAmIDM7CkBAIC0yMDUxLDYgKzIwNDMsMTIgQEAKIAkJd2Muc3JjX3FwID0gcXAtPnJlbW90ZV9xcG47CiAJCXdjLnNsaWQgPSBxcC0+cmVtb3RlX2FoX2F0dHIuZGxpZDsKIAkJd2Muc2wgPSBxcC0+cmVtb3RlX2FoX2F0dHIuc2w7CisJCS8qIHplcm8gZmllbGRzIHRoYXQgYXJlIE4vQSAqLworCQl3Yy52ZW5kb3JfZXJyID0gMDsKKwkJd2MucGtleV9pbmRleCA9IDA7CisJCXdjLmRsaWRfcGF0aF9iaXRzID0gMDsKKwkJd2MucG9ydF9udW0gPSAwOworCQl3Yy5jc3VtX29rID0gMDsKIAkJLyogU2lnbmFsIGNvbXBsZXRpb24gZXZlbnQgaWYgdGhlIHNvbGljaXRlZCBiaXQgaXMgc2V0LiAqLwogCQlxaWJfY3FfZW50ZXIodG9faWNxKHFwLT5pYnFwLnJlY3ZfY3EpLCAmd2MsCiAJCQkgICAgIChvaGRyLT5idGhbMF0gJgpAQCAtMjA4OSw3ICsyMDg3LDcgQEAKIAkJaWYgKG9wY29kZSA9PSBPUChSRE1BX1dSSVRFX0ZJUlNUKSkKIAkJCWdvdG8gc2VuZF9taWRkbGU7CiAJCWVsc2UgaWYgKG9wY29kZSA9PSBPUChSRE1BX1dSSVRFX09OTFkpKQotCQkJZ290byBzZW5kX2xhc3Q7CisJCQlnb3RvIG5vX2ltbWVkaWF0ZV9kYXRhOwogCQlyZXQgPSBxaWJfZ2V0X3J3cWUocXAsIDEpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gbmFja19vcF9lcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9ydWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3J1Yy5jCmluZGV4IGViNzhkOTMuLmI0YjM3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3J1Yy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3J1Yy5jCkBAIC0yNjAsMTIgKzI2MCwxNSBAQAogCiAvKgogICoKLSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBRUCBzX2xvY2sgaGVsZC4KKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBRUCByX2xvY2sgaGVsZC4KKyAqCisgKiBUaGUgc19sb2NrIHdpbGwgYmUgYWNxdWlyZWQgYXJvdW5kIHRoZSBxaWJfbWlncmF0ZV9xcCgpIGNhbGwuCiAgKi8KIGludCBxaWJfcnVjX2NoZWNrX2hkcihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAogCQkgICAgICBpbnQgaGFzX2dyaCwgc3RydWN0IHFpYl9xcCAqcXAsIHUzMiBidGgwKQogewogCV9fYmU2NCBndWlkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAocXAtPnNfbWlnX3N0YXRlID09IElCX01JR19BUk1FRCAmJiAoYnRoMCAmIElCX0JUSF9NSUdfUkVRKSkgewogCQlpZiAoIWhhc19ncmgpIHsKQEAgLTI5NSw3ICsyOTgsOSBAQAogCQlpZiAoYmUxNl90b19jcHUoaGRyLT5scmhbM10pICE9IHFwLT5hbHRfYWhfYXR0ci5kbGlkIHx8CiAJCSAgICBwcGRfZnJvbV9pYnAoaWJwKS0+cG9ydCAhPSBxcC0+YWx0X2FoX2F0dHIucG9ydF9udW0pCiAJCQlnb3RvIGVycjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAkJcWliX21pZ3JhdGVfcXAocXApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcC0+c19sb2NrLCBmbGFncyk7CiAJfSBlbHNlIHsKIAkJaWYgKCFoYXNfZ3JoKSB7CiAJCQlpZiAocXAtPnJlbW90ZV9haF9hdHRyLmFoX2ZsYWdzICYgSUJfQUhfR1JIKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc2Q3MjIwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zZDcyMjAuYwppbmRleCBlOWY5ZjhiLi5kZTFhNGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zZDcyMjAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zZDcyMjAuYwpAQCAtMzgsNiArMzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogCiAjaW5jbHVkZSAicWliLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zZG1hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zZG1hLmMKaW5kZXggY2FkNDQ0OS4uMTJhOTYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc2RtYS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3NkbWEuYwpAQCAtMzIsNiArMzIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAjaW5jbHVkZSAicWliLmgiCiAjaW5jbHVkZSAicWliX2NvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc3JxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zcnEuYwppbmRleCBjM2VjOGVmLi5kNjIzNTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zcnEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zcnEuYwpAQCAtMTA3LDYgKzEwNywxMSBAQAogCXUzMiBzejsKIAlzdHJ1Y3QgaWJfc3JxICpyZXQ7CiAKKwlpZiAoc3JxX2luaXRfYXR0ci0+c3JxX3R5cGUgIT0gSUJfU1JRVF9CQVNJQykgeworCQlyZXQgPSBFUlJfUFRSKC1FTk9TWVMpOworCQlnb3RvIGRvbmU7CisJfQorCiAJaWYgKHNycV9pbml0X2F0dHItPmF0dHIubWF4X3NnZSA9PSAwIHx8CiAJICAgIHNycV9pbml0X2F0dHItPmF0dHIubWF4X3NnZSA+IGliX3FpYl9tYXhfc3JxX3NnZXMgfHwKIAkgICAgc3JxX2luaXRfYXR0ci0+YXR0ci5tYXhfd3IgPT0gMCB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc3lzZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3N5c2ZzLmMKaW5kZXggMTRkMTI5ZC4uNzhmYmQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc3lzZnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zeXNmcy5jCkBAIC01MTUsOCArNTE1LDcgQEAKIAlzdHJ1Y3QgcWliX2RldmRhdGEgKmRkID0gZGRfZnJvbV9kZXYoZGV2KTsKIAogCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgdXNlciBwb3J0cyAoY29udGV4dHMpIGF2YWlsYWJsZS4gKi8KLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIGRkLT5jZmdjdHh0cyAtCi0JCWRkLT5maXJzdF91c2VyX2N0eHQgLSAodTMyKXFpYl9zdGF0cy5zcHNfY3R4dHMpOworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgZGQtPmZyZWVjdHh0cyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfc2VyaWFsKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3R4LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl90eC5jCmluZGV4IDdmMzY0NTQuLjFiZjYyNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3R4LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdHguYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlICJxaWIuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VjLmMKaW5kZXggMzJjY2YzYy4uODQ3ZTdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91Yy5jCkBAIC01MSw3ICs1MSw3IEBACiAJdTMyIGh3b3JkczsKIAl1MzIgYnRoMDsKIAl1MzIgbGVuOwotCXUzMiBwbXR1ID0gaWJfbXR1X2VudW1fdG9faW50KHFwLT5wYXRoX210dSk7CisJdTMyIHBtdHUgPSBxcC0+cG10dTsKIAlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxcC0+c19sb2NrLCBmbGFncyk7CkBAIC0yNDMsMTMgKzI0MywxMiBAQAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBxaWJfcXAgKnFwKQogewogCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBvcGNvZGU7CiAJdTMyIGhkcnNpemU7CiAJdTMyIHBzbjsKIAl1MzIgcGFkOwogCXN0cnVjdCBpYl93YyB3YzsKLQl1MzIgcG10dSA9IGliX210dV9lbnVtX3RvX2ludChxcC0+cGF0aF9tdHUpOworCXUzMiBwbXR1ID0gcXAtPnBtdHU7CiAJc3RydWN0IGliX3JldGggKnJldGg7CiAJaW50IHJldDsKIApAQCAtMjYzLDE0ICsyNjIsMTEgQEAKIAl9CiAKIAlvcGNvZGUgPSBiZTMyX3RvX2NwdShvaGRyLT5idGhbMF0pOwotCXNwaW5fbG9ja19pcnFzYXZlKCZxcC0+c19sb2NrLCBmbGFncyk7CiAJaWYgKHFpYl9ydWNfY2hlY2tfaGRyKGlicCwgaGRyLCBoYXNfZ3JoLCBxcCwgb3Bjb2RlKSkKLQkJZ290byBzdW5sb2NrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOwogCiAJcHNuID0gYmUzMl90b19jcHUob2hkci0+YnRoWzJdKTsKIAlvcGNvZGUgPj49IDI0OwotCW1lbXNldCgmd2MsIDAsIHNpemVvZiB3Yyk7CiAKIAkvKiBDb21wYXJlIHRoZSBQU04gdmVyc2VzIHRoZSBleHBlY3RlZCBQU04uICovCiAJaWYgKHVubGlrZWx5KHFpYl9jbXAyNChwc24sIHFwLT5yX3BzbikgIT0gMCkpIHsKQEAgLTM3MCw3ICszNjYsNyBAQAogCQl9CiAJCXFwLT5yX3Jjdl9sZW4gPSAwOwogCQlpZiAob3Bjb2RlID09IE9QKFNFTkRfT05MWSkpCi0JCQlnb3RvIHNlbmRfbGFzdDsKKwkJCWdvdG8gbm9faW1tZWRpYXRlX2RhdGE7CiAJCWVsc2UgaWYgKG9wY29kZSA9PSBPUChTRU5EX09OTFlfV0lUSF9JTU1FRElBVEUpKQogCQkJZ290byBzZW5kX2xhc3RfaW1tOwogCQkvKiBGQUxMVEhST1VHSCAqLwpAQCAtMzg5LDggKzM4NSwxMSBAQAogCQl3Yy5leC5pbW1fZGF0YSA9IG9oZHItPnUuaW1tX2RhdGE7CiAJCWhkcnNpemUgKz0gNDsKIAkJd2Mud2NfZmxhZ3MgPSBJQl9XQ19XSVRIX0lNTTsKLQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZ290byBzZW5kX2xhc3Q7CiAJY2FzZSBPUChTRU5EX0xBU1QpOgorbm9faW1tZWRpYXRlX2RhdGE6CisJCXdjLmV4LmltbV9kYXRhID0gMDsKKwkJd2Mud2NfZmxhZ3MgPSAwOwogc2VuZF9sYXN0OgogCQkvKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB0aGUgbWVzc2FnZSB3YXMgcGFkZGVkIGJ5LiAqLwogCQlwYWQgPSAoYmUzMl90b19jcHUob2hkci0+YnRoWzBdKSA+PiAyMCkgJiAzOwpAQCAtNDE4LDYgKzQxNywxMiBAQAogCQl3Yy5zcmNfcXAgPSBxcC0+cmVtb3RlX3FwbjsKIAkJd2Muc2xpZCA9IHFwLT5yZW1vdGVfYWhfYXR0ci5kbGlkOwogCQl3Yy5zbCA9IHFwLT5yZW1vdGVfYWhfYXR0ci5zbDsKKwkJLyogemVybyBmaWVsZHMgdGhhdCBhcmUgTi9BICovCisJCXdjLnZlbmRvcl9lcnIgPSAwOworCQl3Yy5wa2V5X2luZGV4ID0gMDsKKwkJd2MuZGxpZF9wYXRoX2JpdHMgPSAwOworCQl3Yy5wb3J0X251bSA9IDA7CisJCXdjLmNzdW1fb2sgPSAwOwogCQkvKiBTaWduYWwgY29tcGxldGlvbiBldmVudCBpZiB0aGUgc29saWNpdGVkIGJpdCBpcyBzZXQuICovCiAJCXFpYl9jcV9lbnRlcih0b19pY3EocXAtPmlicXAucmVjdl9jcSksICZ3YywKIAkJCSAgICAgKG9oZHItPmJ0aFswXSAmCkBAIC01NDYsNiArNTUxLDQgQEAKIAlxaWJfcmNfZXJyb3IocXAsIElCX1dDX0xPQ19RUF9PUF9FUlIpOwogCXJldHVybjsKIAotc3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcC0+c19sb2NrLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91c2VyX3BhZ2VzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91c2VyX3BhZ2VzLmMKaW5kZXggNzY4OWU0OS4uMmJjMWQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdXNlcl9wYWdlcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VzZXJfcGFnZXMuYwpAQCAtNzQsNyArNzQsNyBAQAogCQkJZ290byBiYWlsX3JlbGVhc2U7CiAJfQogCi0JY3VycmVudC0+bW0tPmxvY2tlZF92bSArPSBudW1fcGFnZXM7CisJY3VycmVudC0+bW0tPnBpbm5lZF92bSArPSBudW1fcGFnZXM7CiAKIAlyZXQgPSAwOwogCWdvdG8gYmFpbDsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCV9fcWliX3JlbGVhc2VfdXNlcl9wYWdlcyhwLCBudW1fcGFnZXMsIDEpOwogCiAJaWYgKGN1cnJlbnQtPm1tKSB7Ci0JCWN1cnJlbnQtPm1tLT5sb2NrZWRfdm0gLT0gbnVtX3BhZ2VzOworCQljdXJyZW50LT5tbS0+cGlubmVkX3ZtIC09IG51bV9wYWdlczsKIAkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmMKaW5kZXggOWZhYjQwNC4uYTg5NDc2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5jCkBAIC0zNSwxNCArMzUsMTYgQEAKICNpbmNsdWRlIDxyZG1hL2liX21hZC5oPgogI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl92ZXJicy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogCiAjaW5jbHVkZSAicWliLmgiCiAjaW5jbHVkZSAicWliX2NvbW1vbi5oIgogCi1zdGF0aWMgdW5zaWduZWQgaW50IGliX3FpYl9xcF90YWJsZV9zaXplID0gMjUxOworc3RhdGljIHVuc2lnbmVkIGludCBpYl9xaWJfcXBfdGFibGVfc2l6ZSA9IDI1NjsKIG1vZHVsZV9wYXJhbV9uYW1lZChxcF90YWJsZV9zaXplLCBpYl9xaWJfcXBfdGFibGVfc2l6ZSwgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHFwX3RhYmxlX3NpemUsICJRUCB0YWJsZSBzaXplIik7CiAKQEAgLTY1OSwxNyArNjYxLDI1IEBACiAJCWlmIChhdG9taWNfZGVjX3JldHVybigmbWNhc3QtPnJlZmNvdW50KSA8PSAxKQogCQkJd2FrZV91cCgmbWNhc3QtPndhaXQpOwogCX0gZWxzZSB7Ci0JCXFwID0gcWliX2xvb2t1cF9xcG4oaWJwLCBxcF9udW0pOwotCQlpZiAoIXFwKQotCQkJZ290byBkcm9wOworCQlpZiAocmNkLT5sb29rYXNpZGVfcXApIHsKKwkJCWlmIChyY2QtPmxvb2thc2lkZV9xcG4gIT0gcXBfbnVtKSB7CisJCQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoCisJCQkJCSZyY2QtPmxvb2thc2lkZV9xcC0+cmVmY291bnQpKQorCQkJCQl3YWtlX3VwKAorCQkJCQkgJnJjZC0+bG9va2FzaWRlX3FwLT53YWl0KTsKKwkJCQkJcmNkLT5sb29rYXNpZGVfcXAgPSBOVUxMOworCQkJCX0KKwkJfQorCQlpZiAoIXJjZC0+bG9va2FzaWRlX3FwKSB7CisJCQlxcCA9IHFpYl9sb29rdXBfcXBuKGlicCwgcXBfbnVtKTsKKwkJCWlmICghcXApCisJCQkJZ290byBkcm9wOworCQkJcmNkLT5sb29rYXNpZGVfcXAgPSBxcDsKKwkJCXJjZC0+bG9va2FzaWRlX3FwbiA9IHFwX251bTsKKwkJfSBlbHNlCisJCQlxcCA9IHJjZC0+bG9va2FzaWRlX3FwOwogCQlpYnAtPm5fdW5pY2FzdF9yY3YrKzsKIAkJcWliX3FwX3JjdihyY2QsIGhkciwgbG5oID09IFFJQl9MUkhfR1JILCBkYXRhLCB0bGVuLCBxcCk7Ci0JCS8qCi0JCSAqIE5vdGlmeSBxaWJfZGVzdHJveV9xcCgpIGlmIGl0IGlzIHdhaXRpbmcKLQkJICogZm9yIHVzIHRvIGZpbmlzaC4KLQkJICovCi0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZxcC0+cmVmY291bnQpKQotCQkJd2FrZV91cCgmcXAtPndhaXQpOwogCX0KIAlyZXR1cm47CiAKQEAgLTE5NzQsNiArMTk4NCw4IEBACiAJaWJwLT56X2V4Y2Vzc2l2ZV9idWZmZXJfb3ZlcnJ1bl9lcnJvcnMgPQogCQljbnRycy5leGNlc3NpdmVfYnVmZmVyX292ZXJydW5fZXJyb3JzOwogCWlicC0+el92bDE1X2Ryb3BwZWQgPSBjbnRycy52bDE1X2Ryb3BwZWQ7CisJUkNVX0lOSVRfUE9JTlRFUihpYnAtPnFwMCwgTlVMTCk7CisJUkNVX0lOSVRfUE9JTlRFUihpYnAtPnFwMSwgTlVMTCk7CiB9CiAKIC8qKgpAQCAtMTk5MCwxMiArMjAwMiwxNSBAQAogCWludCByZXQ7CiAKIAlkZXYtPnFwX3RhYmxlX3NpemUgPSBpYl9xaWJfcXBfdGFibGVfc2l6ZTsKLQlkZXYtPnFwX3RhYmxlID0ga3phbGxvYyhkZXYtPnFwX3RhYmxlX3NpemUgKiBzaXplb2YgKmRldi0+cXBfdGFibGUsCisJZ2V0X3JhbmRvbV9ieXRlcygmZGV2LT5xcF9ybmQsIHNpemVvZihkZXYtPnFwX3JuZCkpOworCWRldi0+cXBfdGFibGUgPSBrbWFsbG9jKGRldi0+cXBfdGFibGVfc2l6ZSAqIHNpemVvZiAqZGV2LT5xcF90YWJsZSwKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+cXBfdGFibGUpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfcXB0OwogCX0KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5xcF90YWJsZV9zaXplOyBpKyspCisJCVJDVV9JTklUX1BPSU5URVIoZGV2LT5xcF90YWJsZVtpXSwgTlVMTCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGQtPm51bV9wcG9ydHM7IGkrKykKIAkJaW5pdF9pYnBvcnQocHBkICsgaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuaAppbmRleCA5NWU1YjQ3Li4wYzE5ZWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmgKQEAgLTQ4NSw2ICs0ODUsNyBAQAogCXU4IGFsdF90aW1lb3V0OyAgICAgICAgIC8qIEFsdGVybmF0ZSBwYXRoIHRpbWVvdXQgZm9yIHRoaXMgUVAgKi8KIAl1OCBwb3J0X251bTsKIAllbnVtIGliX210dSBwYXRoX210dTsKKwl1MzIgcG10dTsJCS8qIGRlY29kZWQgZnJvbSBwYXRoX210dSAqLwogCXUzMiByZW1vdGVfcXBuOwogCXUzMiBxa2V5OyAgICAgICAgICAgICAgIC8qIFFLRVkgZm9yIHRoaXMgUVAgKGZvciBVRCBvciBSRCkgKi8KIAl1MzIgc19zaXplOyAgICAgICAgICAgICAvKiBzZW5kIHdvcmsgcXVldWUgc2l6ZSAqLwpAQCAtNDk1LDYgKzQ5Niw3IEBACiAJdTMyIHNfbGFzdDsgICAgICAgICAgICAgLyogbGFzdCBjb21wbGV0ZWQgZW50cnkgKi8KIAl1MzIgc19zc247ICAgICAgICAgICAgICAvKiBTU04gb2YgdGFpbCBlbnRyeSAqLwogCXUzMiBzX2xzbjsgICAgICAgICAgICAgIC8qIGxpbWl0IHNlcXVlbmNlIG51bWJlciAoY3JlZGl0KSAqLworCXVuc2lnbmVkIGxvbmcgdGltZW91dF9qaWZmaWVzOyAgLyogY29tcHV0ZWQgZnJvbSB0aW1lb3V0ICovCiAJc3RydWN0IHFpYl9zd3FlICpzX3dxOyAgLyogc2VuZCB3b3JrIHF1ZXVlICovCiAJc3RydWN0IHFpYl9zd3FlICpzX3dxZTsKIAlzdHJ1Y3QgcWliX3JxIHJfcnE7ICAgICAgICAgICAgIC8qIHJlY2VpdmUgd29yayBxdWV1ZSAqLwpAQCAtNzIzLDcgKzcyNSw4IEBACiAJZG1hX2FkZHJfdCBwaW9faGRyc19waHlzOwogCS8qIGxpc3Qgb2YgUVBzIHdhaXRpbmcgZm9yIFJOUiB0aW1lciAqLwogCXNwaW5sb2NrX3QgcGVuZGluZ19sb2NrOyAvKiBwcm90ZWN0IHdhaXQgbGlzdHMsIFBNQSBjb3VudGVycywgZXRjLiAqLwotCXVuc2lnbmVkIHFwX3RhYmxlX3NpemU7IC8qIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgKi8KKwl1MzIgcXBfdGFibGVfc2l6ZTsgLyogc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSAqLworCXUzMiBxcF9ybmQ7IC8qIHJhbmRvbSBieXRlcyBmb3IgaGFzaCAqLwogCXNwaW5sb2NrX3QgcXB0X2xvY2s7CiAKIAl1MzIgbl9waW93YWl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCmluZGV4IGM3NDU0OGEuLjAxNDUwNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAogI2luY2x1ZGUgImlwb2liLmgiCiAKQEAgLTg0LDcgKzg1LDcgQEAKIAlpYl9kbWFfdW5tYXBfc2luZ2xlKHByaXYtPmNhLCBtYXBwaW5nWzBdLCBJUE9JQl9DTV9IRUFEX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZnJhZ3M7ICsraSkKLQkJaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwgbWFwcGluZ1tpICsgMV0sIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWJfZG1hX3VubWFwX3BhZ2UocHJpdi0+Y2EsIG1hcHBpbmdbaSArIDFdLCBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiB9CiAKIHN0YXRpYyBpbnQgaXBvaWJfY21fcG9zdF9yZWNlaXZlX3NycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaWQpCkBAIC0xODMsNyArMTg0LDcgQEAKIAlpYl9kbWFfdW5tYXBfc2luZ2xlKHByaXYtPmNhLCBtYXBwaW5nWzBdLCBJUE9JQl9DTV9IRUFEX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAKIAlmb3IgKDsgaSA+IDA7IC0taSkKLQkJaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwgbWFwcGluZ1tpXSwgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpYl9kbWFfdW5tYXBfcGFnZShwcml2LT5jYSwgbWFwcGluZ1tpXSwgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAlyZXR1cm4gTlVMTDsKQEAgLTE0OTcsNiArMTQ5OCw3IEBACiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaWJfc3JxX2luaXRfYXR0ciBzcnFfaW5pdF9hdHRyID0geworCQkuc3JxX3R5cGUgPSBJQl9TUlFUX0JBU0lDLAogCQkuYXR0ciA9IHsKIAkJCS5tYXhfd3IgID0gaXBvaWJfcmVjdnFfc2l6ZSwKIAkJCS5tYXhfc2dlID0gbWF4X3NnZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9mcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9mcy5jCmluZGV4IDg2ZWFlMjIuLjUwMDYxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2ZzLmMKQEAgLTM3LDYgKzM3LDcgQEAKIHN0cnVjdCBmaWxlX29wZXJhdGlvbnM7CiAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJpcG9pYi5oIgogCkBAIC0yMTIsMTYgKzIxMywxNSBAQAogCQkgICBnaWRfYnVmLCBwYXRoLnBhdGhyZWMuZGxpZCA/ICJ5ZXMiIDogIm5vIik7CiAKIAlpZiAocGF0aC5wYXRocmVjLmRsaWQpIHsKLQkJcmF0ZSA9IGliX3JhdGVfdG9fbXVsdChwYXRoLnBhdGhyZWMucmF0ZSkgKiAyNTsKKwkJcmF0ZSA9IGliX3JhdGVfdG9fbWJwcyhwYXRoLnBhdGhyZWMucmF0ZSk7CiAKIAkJc2VxX3ByaW50ZihmaWxlLAogCQkJICAgIiAgRExJRDogICAgIDB4JTA0eFxuIgogCQkJICAgIiAgU0w6ICUxMmRcbiIKLQkJCSAgICIgIHJhdGU6ICUqZCVzIEdiL3NlY1xuIiwKKwkJCSAgICIgIHJhdGU6ICU4ZC4lZCBHYi9zZWNcbiIsCiAJCQkgICBiZTE2X3RvX2NwdShwYXRoLnBhdGhyZWMuZGxpZCksCiAJCQkgICBwYXRoLnBhdGhyZWMuc2wsCi0JCQkgICAxMCAtICgocmF0ZSAlIDEwKSA/IDIgOiAwKSwKLQkJCSAgIHJhdGUgLyAxMCwgcmF0ZSAlIDEwID8gIi41IiA6ICIiKTsKKwkJCSAgIHJhdGUgLyAxMDAwLCByYXRlICUgMTAwMCk7CiAJfQogCiAJc2VxX3B1dGMoZmlsZSwgJ1xuJyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKaW5kZXggMmIwNjBmNC4uMGVmOWFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwpAQCAtMzQsNiArMzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCmluZGV4IGVjZWE0ZmUuLjFiN2E5NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwpAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvaWdtcC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMKaW5kZXggOWM2MWI5Yy4uN2U3MzczYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKQEAgLTE1MSw3ICsxNTIsNiBAQAogCXR4X2Rlc2MtPnR4X3NnWzBdLmxlbmd0aCA9IElTRVJfSEVBREVSU19MRU47CiAJdHhfZGVzYy0+dHhfc2dbMF0ubGtleSAgID0gZGV2aWNlLT5tci0+bGtleTsKIAotCWlzZXJfdGFzay0+aGVhZGVyc19pbml0aWFsaXplZAk9IDE7CiAJaXNlcl90YXNrLT5pc2VyX2Nvbm4JCT0gaXNlcl9jb25uOwogCXJldHVybiAwOwogfQpAQCAtMTY2LDggKzE2Niw3IEBACiB7CiAJc3RydWN0IGlzY3NpX2lzZXJfdGFzayAqaXNlcl90YXNrID0gdGFzay0+ZGRfZGF0YTsKIAotCWlmICghaXNlcl90YXNrLT5oZWFkZXJzX2luaXRpYWxpemVkKQotCQlpZiAoaXNlcl9pbml0aWFsaXplX3Rhc2tfaGVhZGVycyh0YXNrLCAmaXNlcl90YXNrLT5kZXNjKSkKKwlpZiAoaXNlcl9pbml0aWFsaXplX3Rhc2tfaGVhZGVycyh0YXNrLCAmaXNlcl90YXNrLT5kZXNjKSkKIAkJCXJldHVybiAtRU5PTUVNOwogCiAJLyogbWdtdCB0YXNrICovCkBAIC0yNzgsNiArMjc3LDEzIEBACiBzdGF0aWMgdm9pZCBpc2NzaV9pc2VyX2NsZWFudXBfdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKIHsKIAlzdHJ1Y3QgaXNjc2lfaXNlcl90YXNrICppc2VyX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCXN0cnVjdCBpc2VyX3R4X2Rlc2MJKnR4X2Rlc2MgPSAmaXNlcl90YXNrLT5kZXNjOworCisJc3RydWN0IGlzY3NpX2lzZXJfY29ubiAqaXNlcl9jb25uID0gdGFzay0+Y29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNlcl9kZXZpY2UgICAgICpkZXZpY2UgICAgPSBpc2VyX2Nvbm4tPmliX2Nvbm4tPmRldmljZTsKKworCWliX2RtYV91bm1hcF9zaW5nbGUoZGV2aWNlLT5pYl9kZXZpY2UsCisJCXR4X2Rlc2MtPmRtYV9hZGRyLCBJU0VSX0hFQURFUlNfTEVOLCBETUFfVE9fREVWSUNFKTsKIAogCS8qIG1nbXQgdGFza3MgZG8gbm90IG5lZWQgc3BlY2lhbCBjbGVhbnVwICovCiAJaWYgKCF0YXNrLT5zYykKQEAgLTYzMiw2ICs2MzgsNTkgQEAKIAlpc2VyX2Nvbm5fdGVybWluYXRlKGliX2Nvbm4pOwogfQogCitzdGF0aWMgbW9kZV90IGlzZXJfYXR0cl9pc192aXNpYmxlKGludCBwYXJhbV90eXBlLCBpbnQgcGFyYW0pCit7CisJc3dpdGNoIChwYXJhbV90eXBlKSB7CisJY2FzZSBJU0NTSV9IT1NUX1BBUkFNOgorCQlzd2l0Y2ggKHBhcmFtKSB7CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9ORVRERVZfTkFNRToKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lOSVRJQVRPUl9OQU1FOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgSVNDU0lfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUkVDVl9ETEVOR1RIOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9YTUlUX0RMRU5HVEg6CisJCWNhc2UgSVNDU0lfUEFSQU1fSERSREdTVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9EQVRBREdTVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9DT05OX0FERFJFU1M6CisJCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX0VYUF9TVEFUU046CisJCWNhc2UgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9BRERSRVNTOgorCQljYXNlIElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfUE9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QSU5HX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9SRUNWX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFMX1IyVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUjJUOgorCQljYXNlIElTQ1NJX1BBUkFNX0lNTV9EQVRBX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0ZJUlNUX0JVUlNUOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9CVVJTVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRFVfSU5PUkRFUl9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9EQVRBU0VRX0lOT1JERVJfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fVEFSR0VUX05BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fVFBHVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9VU0VSTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9QQVNTV09SRDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9VU0VSTkFNRV9JTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QQVNTV09SRF9JTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9GQVNUX0FCT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX0FCT1JUX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9MVV9SRVNFVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fVEdUX1JFU0VUX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JRkFDRV9OQU1FOgorCQljYXNlIElTQ1NJX1BBUkFNX0lOSVRJQVRPUl9OQU1FOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBpc2NzaV9pc2VyX3NodCA9IHsKIAkubW9kdWxlICAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAogCS5uYW1lICAgICAgICAgICAgICAgICAgID0gImlTQ1NJIEluaXRpYXRvciBvdmVyIGlTRVIsIHYuIiBEUlZfVkVSLApAQCAtNjUzLDMyICs3MTIsNiBAQAogCS5vd25lciAgICAgICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCiAJLm5hbWUgICAgICAgICAgICAgICAgICAgPSAiaXNlciIsCiAJLmNhcHMgICAgICAgICAgICAgICAgICAgPSBDQVBfUkVDT1ZFUllfTDAgfCBDQVBfTVVMVElfUjJULAotCS5wYXJhbV9tYXNrCQk9IElTQ1NJX01BWF9SRUNWX0RMRU5HVEggfAotCQkJCSAgSVNDU0lfTUFYX1hNSVRfRExFTkdUSCB8Ci0JCQkJICBJU0NTSV9IRFJER1NUX0VOIHwKLQkJCQkgIElTQ1NJX0RBVEFER1NUX0VOIHwKLQkJCQkgIElTQ1NJX0lOSVRJQUxfUjJUX0VOIHwKLQkJCQkgIElTQ1NJX01BWF9SMlQgfAotCQkJCSAgSVNDU0lfSU1NX0RBVEFfRU4gfAotCQkJCSAgSVNDU0lfRklSU1RfQlVSU1QgfAotCQkJCSAgSVNDU0lfTUFYX0JVUlNUIHwKLQkJCQkgIElTQ1NJX1BEVV9JTk9SREVSX0VOIHwKLQkJCQkgIElTQ1NJX0RBVEFTRVFfSU5PUkRFUl9FTiB8Ci0JCQkJICBJU0NTSV9DT05OX1BPUlQgfAotCQkJCSAgSVNDU0lfQ09OTl9BRERSRVNTIHwKLQkJCQkgIElTQ1NJX0VYUF9TVEFUU04gfAotCQkJCSAgSVNDU0lfUEVSU0lTVEVOVF9QT1JUIHwKLQkJCQkgIElTQ1NJX1BFUlNJU1RFTlRfQUREUkVTUyB8Ci0JCQkJICBJU0NTSV9UQVJHRVRfTkFNRSB8IElTQ1NJX1RQR1QgfAotCQkJCSAgSVNDU0lfVVNFUk5BTUUgfCBJU0NTSV9QQVNTV09SRCB8Ci0JCQkJICBJU0NTSV9VU0VSTkFNRV9JTiB8IElTQ1NJX1BBU1NXT1JEX0lOIHwKLQkJCQkgIElTQ1NJX0ZBU1RfQUJPUlQgfCBJU0NTSV9BQk9SVF9UTU8gfAotCQkJCSAgSVNDU0lfTFVfUkVTRVRfVE1PIHwgSVNDU0lfVEdUX1JFU0VUX1RNTyB8Ci0JCQkJICBJU0NTSV9QSU5HX1RNTyB8IElTQ1NJX1JFQ1ZfVE1PIHwKLQkJCQkgIElTQ1NJX0lGQUNFX05BTUUgfCBJU0NTSV9JTklUSUFUT1JfTkFNRSwKLQkuaG9zdF9wYXJhbV9tYXNrCT0gSVNDU0lfSE9TVF9IV0FERFJFU1MgfAotCQkJCSAgSVNDU0lfSE9TVF9ORVRERVZfTkFNRSB8Ci0JCQkJICBJU0NTSV9IT1NUX0lOSVRJQVRPUl9OQU1FLAogCS8qIHNlc3Npb24gbWFuYWdlbWVudCAqLwogCS5jcmVhdGVfc2Vzc2lvbiAgICAgICAgID0gaXNjc2lfaXNlcl9zZXNzaW9uX2NyZWF0ZSwKIAkuZGVzdHJveV9zZXNzaW9uICAgICAgICA9IGlzY3NpX2lzZXJfc2Vzc2lvbl9kZXN0cm95LApAQCAtNjg2LDYgKzcxOSw3IEBACiAJLmNyZWF0ZV9jb25uICAgICAgICAgICAgPSBpc2NzaV9pc2VyX2Nvbm5fY3JlYXRlLAogCS5iaW5kX2Nvbm4gICAgICAgICAgICAgID0gaXNjc2lfaXNlcl9jb25uX2JpbmQsCiAJLmRlc3Ryb3lfY29ubiAgICAgICAgICAgPSBpc2NzaV9pc2VyX2Nvbm5fZGVzdHJveSwKKwkuYXR0cl9pc192aXNpYmxlCT0gaXNlcl9hdHRyX2lzX3Zpc2libGUsCiAJLnNldF9wYXJhbSAgICAgICAgICAgICAgPSBpc2NzaV9pc2VyX3NldF9wYXJhbSwKIAkuZ2V0X2Nvbm5fcGFyYW0JCT0gaXNjc2lfY29ubl9nZXRfcGFyYW0sCiAJLmdldF9lcF9wYXJhbQkJPSBpc2NzaV9pc2VyX2dldF9lcF9wYXJhbSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5oCmluZGV4IGRiNmYzY2UuLmRiN2VhMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuaApAQCAtMjU3LDcgKzI1Nyw4IEBACiAJc3RydWN0IGxpc3RfaGVhZAkgICAgIGNvbm5fbGlzdDsgICAgICAgLyogZW50cnkgaW4gaWcgY29ubiBsaXN0ICovCiAKIAljaGFyICAJCQkgICAgICpsb2dpbl9idWY7Ci0JdTY0IAkJCSAgICAgbG9naW5fZG1hOworCWNoYXIJCQkgICAgICpsb2dpbl9yZXFfYnVmLCAqbG9naW5fcmVzcF9idWY7CisJdTY0CQkJICAgICBsb2dpbl9yZXFfZG1hLCBsb2dpbl9yZXNwX2RtYTsKIAl1bnNpZ25lZCBpbnQgCQkgICAgIHJ4X2Rlc2NfaGVhZDsKIAlzdHJ1Y3QgaXNlcl9yeF9kZXNjCSAgICAgKnJ4X2Rlc2NzOwogCXN0cnVjdCBpYl9yZWN2X3dyCSAgICAgcnhfd3JbSVNFUl9NSU5fUE9TVEVEX1JYXTsKQEAgLTI3Nyw3ICsyNzgsNiBAQAogCXN0cnVjdCBpc2VyX3JlZ2RfYnVmICAgICAgICAgcmRtYV9yZWdkW0lTRVJfRElSU19OVU1dOy8qIHJlZ2QgcmRtYSBidWYgKi8KIAlzdHJ1Y3QgaXNlcl9kYXRhX2J1ZiAgICAgICAgIGRhdGFbSVNFUl9ESVJTX05VTV07ICAgICAvKiBvcmlnLiBkYXRhIGRlcyovCiAJc3RydWN0IGlzZXJfZGF0YV9idWYgICAgICAgICBkYXRhX2NvcHlbSVNFUl9ESVJTX05VTV07LyogY29udGlnLiBjb3B5ICAqLwotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc19pbml0aWFsaXplZDsKIH07CiAKIHN0cnVjdCBpc2VyX3BhZ2VfdmVjIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfaW5pdGlhdG9yLmMKaW5kZXggZjI5OWRlNi4uYTYwNzU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfaW5pdGlhdG9yLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfaW5pdGlhdG9yLmMKQEAgLTIyMSw4ICsyMjEsMTQgQEAKIAlzdHJ1Y3QgaXNlcl9kZXZpY2UgKmRldmljZSA9IGliX2Nvbm4tPmRldmljZTsKIAogCWlmIChpYl9jb25uLT5sb2dpbl9idWYpIHsKLQkJaWJfZG1hX3VubWFwX3NpbmdsZShkZXZpY2UtPmliX2RldmljZSwgaWJfY29ubi0+bG9naW5fZG1hLAotCQkJSVNFUl9SWF9MT0dJTl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoaWJfY29ubi0+bG9naW5fcmVxX2RtYSkKKwkJCWliX2RtYV91bm1hcF9zaW5nbGUoZGV2aWNlLT5pYl9kZXZpY2UsCisJCQkJaWJfY29ubi0+bG9naW5fcmVxX2RtYSwKKwkJCQlJU0NTSV9ERUZfTUFYX1JFQ1ZfU0VHX0xFTiwgRE1BX1RPX0RFVklDRSk7CisJCWlmIChpYl9jb25uLT5sb2dpbl9yZXNwX2RtYSkKKwkJCWliX2RtYV91bm1hcF9zaW5nbGUoZGV2aWNlLT5pYl9kZXZpY2UsCisJCQkJaWJfY29ubi0+bG9naW5fcmVzcF9kbWEsCisJCQkJSVNFUl9SWF9MT0dJTl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCQlrZnJlZShpYl9jb25uLT5sb2dpbl9idWYpOwogCX0KIApAQCAtMzk0LDYgKzQwMCw3IEBACiAJdW5zaWduZWQgbG9uZyBkYXRhX3NlZ19sZW47CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IGlzZXJfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGlzZXJfY29ubiAqaWJfY29ubiA9IGlzZXJfY29ubi0+aWJfY29ubjsKIAogCS8qIGJ1aWxkIHRoZSB0eCBkZXNjIHJlZ2QgaGVhZGVyIGFuZCBhZGQgaXQgdG8gdGhlIHR4IGRlc2MgZHRvICovCiAJbWRlc2MtPnR5cGUgPSBJU0NTSV9UWF9DT05UUk9MOwpAQCAtNDA5LDkgKzQxNiwxOSBAQAogCQkJaXNlcl9lcnIoImRhdGEgcHJlc2VudCBvbiBub24gbG9naW4gdGFzayEhIVxuIik7CiAJCQlnb3RvIHNlbmRfY29udHJvbF9lcnJvcjsKIAkJfQotCQltZW1jcHkoaXNlcl9jb25uLT5pYl9jb25uLT5sb2dpbl9idWYsIHRhc2stPmRhdGEsCisKKwkJaWJfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2aWNlLT5pYl9kZXZpY2UsCisJCQlpYl9jb25uLT5sb2dpbl9yZXFfZG1hLCB0YXNrLT5kYXRhX2NvdW50LAorCQkJRE1BX1RPX0RFVklDRSk7CisKKwkJbWVtY3B5KGlzZXJfY29ubi0+aWJfY29ubi0+bG9naW5fcmVxX2J1ZiwgdGFzay0+ZGF0YSwKIAkJCQkJCQl0YXNrLT5kYXRhX2NvdW50KTsKLQkJdHhfZHNnLT5hZGRyICAgID0gaXNlcl9jb25uLT5pYl9jb25uLT5sb2dpbl9kbWE7CisKKwkJaWJfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2aWNlLT5pYl9kZXZpY2UsCisJCQlpYl9jb25uLT5sb2dpbl9yZXFfZG1hLCB0YXNrLT5kYXRhX2NvdW50LAorCQkJRE1BX1RPX0RFVklDRSk7CisKKwkJdHhfZHNnLT5hZGRyICAgID0gaXNlcl9jb25uLT5pYl9jb25uLT5sb2dpbl9yZXFfZG1hOwogCQl0eF9kc2ctPmxlbmd0aCAgPSB0YXNrLT5kYXRhX2NvdW50OwogCQl0eF9kc2ctPmxrZXkgICAgPSBkZXZpY2UtPm1yLT5sa2V5OwogCQltZGVzYy0+bnVtX3NnZSA9IDI7CkBAIC00NDUsOCArNDYyLDggQEAKIAlpbnQgcnhfYnVmbGVuLCBvdXRzdGFuZGluZywgY291bnQsIGVycjsKIAogCS8qIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBsb2dpbiB0byBhbGwgb3RoZXIgUERVcyAqLwotCWlmICgoY2hhciAqKXJ4X2Rlc2MgPT0gaWJfY29ubi0+bG9naW5fYnVmKSB7Ci0JCXJ4X2RtYSA9IGliX2Nvbm4tPmxvZ2luX2RtYTsKKwlpZiAoKGNoYXIgKilyeF9kZXNjID09IGliX2Nvbm4tPmxvZ2luX3Jlc3BfYnVmKSB7CisJCXJ4X2RtYSA9IGliX2Nvbm4tPmxvZ2luX3Jlc3BfZG1hOwogCQlyeF9idWZsZW4gPSBJU0VSX1JYX0xPR0lOX1NJWkU7CiAJfSBlbHNlIHsKIAkJcnhfZG1hID0gcnhfZGVzYy0+ZG1hX2FkZHI7CkBAIC00NzMsNyArNDkwLDcgQEAKIAkgKiBmb3IgdGhlIHBvc3RlZCByeCBidWZzIHJlZmNvdW50IHRvIGJlY29tZSB6ZXJvIGhhbmRsZXMgZXZlcnl0aGluZyAgICovCiAJY29ubi0+aWJfY29ubi0+cG9zdF9yZWN2X2J1Zl9jb3VudC0tOwogCi0JaWYgKHJ4X2RtYSA9PSBpYl9jb25uLT5sb2dpbl9kbWEpCisJaWYgKHJ4X2RtYSA9PSBpYl9jb25uLT5sb2dpbl9yZXNwX2RtYSkKIAkJcmV0dXJuOwogCiAJb3V0c3RhbmRpbmcgPSBpYl9jb25uLT5wb3N0X3JlY3ZfYnVmX2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfdmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX3ZlcmJzLmMKaW5kZXggZWRlMTQ3NS4uZTI4ODc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfdmVyYnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl92ZXJicy5jCkBAIC0xNTUsMjAgKzE1NSwzOSBAQAogewogCXN0cnVjdCBpc2VyX2RldmljZQkqZGV2aWNlOwogCXN0cnVjdCBpYl9xcF9pbml0X2F0dHIJaW5pdF9hdHRyOwotCWludAkJCXJldCA9IC1FTk9NRU07CisJaW50CQkJcmVxX2VyciwgcmVzcF9lcnIsIHJldCA9IC1FTk9NRU07CiAJc3RydWN0IGliX2Ztcl9wb29sX3BhcmFtIHBhcmFtczsKIAogCUJVR19PTihpYl9jb25uLT5kZXZpY2UgPT0gTlVMTCk7CiAKIAlkZXZpY2UgPSBpYl9jb25uLT5kZXZpY2U7CiAKLQlpYl9jb25uLT5sb2dpbl9idWYgPSBrbWFsbG9jKElTRVJfUlhfTE9HSU5fU0laRSwgR0ZQX0tFUk5FTCk7CisJaWJfY29ubi0+bG9naW5fYnVmID0ga21hbGxvYyhJU0NTSV9ERUZfTUFYX1JFQ1ZfU0VHX0xFTiArCisJCQkJCUlTRVJfUlhfTE9HSU5fU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpYl9jb25uLT5sb2dpbl9idWYpCiAJCWdvdG8gb3V0X2VycjsKIAotCWliX2Nvbm4tPmxvZ2luX2RtYSA9IGliX2RtYV9tYXBfc2luZ2xlKGliX2Nvbm4tPmRldmljZS0+aWJfZGV2aWNlLAotCQkJCSh2b2lkICopaWJfY29ubi0+bG9naW5fYnVmLCBJU0VSX1JYX0xPR0lOX1NJWkUsCi0JCQkJRE1BX0ZST01fREVWSUNFKTsKKwlpYl9jb25uLT5sb2dpbl9yZXFfYnVmICA9IGliX2Nvbm4tPmxvZ2luX2J1ZjsKKwlpYl9jb25uLT5sb2dpbl9yZXNwX2J1ZiA9IGliX2Nvbm4tPmxvZ2luX2J1ZiArIElTQ1NJX0RFRl9NQVhfUkVDVl9TRUdfTEVOOworCisJaWJfY29ubi0+bG9naW5fcmVxX2RtYSA9IGliX2RtYV9tYXBfc2luZ2xlKGliX2Nvbm4tPmRldmljZS0+aWJfZGV2aWNlLAorCQkJCSh2b2lkICopaWJfY29ubi0+bG9naW5fcmVxX2J1ZiwKKwkJCQlJU0NTSV9ERUZfTUFYX1JFQ1ZfU0VHX0xFTiwgRE1BX1RPX0RFVklDRSk7CisKKwlpYl9jb25uLT5sb2dpbl9yZXNwX2RtYSA9IGliX2RtYV9tYXBfc2luZ2xlKGliX2Nvbm4tPmRldmljZS0+aWJfZGV2aWNlLAorCQkJCSh2b2lkICopaWJfY29ubi0+bG9naW5fcmVzcF9idWYsCisJCQkJSVNFUl9SWF9MT0dJTl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCisJcmVxX2VyciAgPSBpYl9kbWFfbWFwcGluZ19lcnJvcihkZXZpY2UtPmliX2RldmljZSwgaWJfY29ubi0+bG9naW5fcmVxX2RtYSk7CisJcmVzcF9lcnIgPSBpYl9kbWFfbWFwcGluZ19lcnJvcihkZXZpY2UtPmliX2RldmljZSwgaWJfY29ubi0+bG9naW5fcmVzcF9kbWEpOworCisJaWYgKHJlcV9lcnIgfHwgcmVzcF9lcnIpIHsKKwkJaWYgKHJlcV9lcnIpCisJCQlpYl9jb25uLT5sb2dpbl9yZXFfZG1hID0gMDsKKwkJaWYgKHJlc3BfZXJyKQorCQkJaWJfY29ubi0+bG9naW5fcmVzcF9kbWEgPSAwOworCQlnb3RvIG91dF9lcnI7CisJfQogCiAJaWJfY29ubi0+cGFnZV92ZWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXNlcl9wYWdlX3ZlYykgKwogCQkJCSAgICAoc2l6ZW9mKHU2NCkgKiAoSVNDU0lfSVNFUl9TR19UQUJMRVNJWkUgKzEpKSwKQEAgLTY1OCwxMSArNjc3LDExIEBACiAJc3RydWN0IGliX3NnZQkgIHNnZTsKIAlpbnQgaWJfcmV0OwogCi0Jc2dlLmFkZHIgICA9IGliX2Nvbm4tPmxvZ2luX2RtYTsKKwlzZ2UuYWRkciAgID0gaWJfY29ubi0+bG9naW5fcmVzcF9kbWE7CiAJc2dlLmxlbmd0aCA9IElTRVJfUlhfTE9HSU5fU0laRTsKIAlzZ2UubGtleSAgID0gaWJfY29ubi0+ZGV2aWNlLT5tci0+bGtleTsKIAotCXJ4X3dyLndyX2lkICAgPSAodW5zaWduZWQgbG9uZylpYl9jb25uLT5sb2dpbl9idWY7CisJcnhfd3Iud3JfaWQgICA9ICh1bnNpZ25lZCBsb25nKWliX2Nvbm4tPmxvZ2luX3Jlc3BfYnVmOwogCXJ4X3dyLnNnX2xpc3QgPSAmc2dlOwogCXJ4X3dyLm51bV9zZ2UgPSAxOwogCXJ4X3dyLm5leHQgICAgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9LY29uZmlnCmluZGV4IDIzZTgyZTQ2Li4wMDFiMTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9LY29uZmlnCkBAIC0zLDcgKzMsNyBAQAogIwogCiBtZW51ICJJbnB1dCBkZXZpY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFTMzkwCisJZGVwZW5kcyBvbiAhUzM5MCAmJiAhVU1MCiAKIGNvbmZpZyBJTlBVVAogCXRyaXN0YXRlICJHZW5lcmljIGlucHV0IGxheWVyIChuZWVkZWQgZm9yIGtleWJvYXJkLCBtb3VzZSwgLi4uKSIgaWYgRVhQRVJUCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2ZmLWNvcmUuYyBiL2RyaXZlcnMvaW5wdXQvZmYtY29yZS5jCmluZGV4IDMzNjdmNzYuLjQ4MGViOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZmYtY29yZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZmYtY29yZS5jCkBAIC0zMDksOSArMzA5LDEwIEBACiAgKiBPbmNlIGZmIGRldmljZSBpcyBjcmVhdGVkIHlvdSBuZWVkIHRvIHNldHVwIGl0cyB1cGxvYWQsIGVyYXNlLAogICogcGxheWJhY2sgYW5kIG90aGVyIGhhbmRsZXJzIGJlZm9yZSByZWdpc3RlcmluZyBpbnB1dCBkZXZpY2UKICAqLwotaW50IGlucHV0X2ZmX2NyZWF0ZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBtYXhfZWZmZWN0cykKK2ludCBpbnB1dF9mZl9jcmVhdGUoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgbWF4X2VmZmVjdHMpCiB7CiAJc3RydWN0IGZmX2RldmljZSAqZmY7CisJc2l6ZV90IGZmX2Rldl9zaXplOwogCWludCBpOwogCiAJaWYgKCFtYXhfZWZmZWN0cykgewpAQCAtMzE5LDggKzMyMCwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmZl9kZXZpY2UpICsKLQkJICAgICBtYXhfZWZmZWN0cyAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKSwgR0ZQX0tFUk5FTCk7CisJZmZfZGV2X3NpemUgPSBzaXplb2Yoc3RydWN0IGZmX2RldmljZSkgKworCQkJCW1heF9lZmZlY3RzICogc2l6ZW9mKHN0cnVjdCBmaWxlICopOworCWlmIChmZl9kZXZfc2l6ZSA8IG1heF9lZmZlY3RzKSAvKiBvdmVyZmxvdyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWZmID0ga3phbGxvYyhmZl9kZXZfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtY29tcGF0LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5jCmluZGV4IDFhY2NiODkuLmU0NmE4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtY29tcGF0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1jb21wYXQuYwpAQCAtOCw2ICs4LDcgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiaW5wdXQtY29tcGF0LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtbXQuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtbXQuYwppbmRleCBjNDhjODFmLi5mNjU4MDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2lucHV0LW10LmMKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1tdC5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC9tdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2RlZmluZSBUUktJRF9TR04JKChUUktJRF9NQVggKyAxKSA+PiAxKQpAQCAtMTE3LDYgKzExOCw3IEBACiAJaW5wdXRfZXZlbnQoZGV2LCBFVl9LRVksIEJUTl9UT09MX0RPVUJMRVRBUCwgY291bnQgPT0gMik7CiAJaW5wdXRfZXZlbnQoZGV2LCBFVl9LRVksIEJUTl9UT09MX1RSSVBMRVRBUCwgY291bnQgPT0gMyk7CiAJaW5wdXRfZXZlbnQoZGV2LCBFVl9LRVksIEJUTl9UT09MX1FVQURUQVAsIGNvdW50ID09IDQpOworCWlucHV0X2V2ZW50KGRldiwgRVZfS0VZLCBCVE5fVE9PTF9RVUlOVFRBUCwgY291bnQgPT0gNSk7CiB9CiBFWFBPUlRfU1lNQk9MKGlucHV0X210X3JlcG9ydF9maW5nZXJfY291bnQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LXBvbGxkZXYuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCmluZGV4IGIxYWFiZGUuLjdkZmUxMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQtcG9sbGRldi5oPgogCiBNT0RVTEVfQVVUSE9SKCJEbWl0cnkgVG9yb2tob3YgPGR0b3JAbWFpbC5ydT4iKTsKQEAgLTQ5LDggKzUwLDEwIEBACiAJCWRldi0+b3BlbihkZXYpOwogCiAJLyogT25seSBzdGFydCBwb2xsaW5nIGlmIHBvbGxpbmcgaXMgZW5hYmxlZCAqLwotCWlmIChkZXYtPnBvbGxfaW50ZXJ2YWwgPiAwKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX2ZyZWV6YWJsZV93cSwgJmRldi0+d29yaywgMCk7CisJaWYgKGRldi0+cG9sbF9pbnRlcnZhbCA+IDApIHsKKwkJZGV2LT5wb2xsKGRldik7CisJCWlucHV0X3BvbGxkZXZfcXVldWVfd29yayhkZXYpOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hczUwMTEuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYXM1MDExLmMKaW5kZXggZjY3MzJiNS4uNmQ2ZTc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hczUwMTEuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FzNTAxMS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9hczUwMTEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkRyaXZlciBmb3IgQXVzdHJpYSBNaWNyb3N5c3RlbXMgQVM1MDExIGpveXN0aWNrIgogI2RlZmluZSBNT0RVTEVfREVWSUNFX0FMSUFTICJhczUwMTEiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKaW5kZXggYjRkZWU5ZC4uNjE1YzIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwpAQCAtMzMsMTAgKzMzLDEwIEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWRwNTU4OC1rZXlzLgogCiBjb25maWcgS0VZQk9BUkRfQURQNTU4OQotCXRyaXN0YXRlICJBRFA1NTg5IEkyQyBRV0VSVFkgS2V5cGFkIGFuZCBJTyBFeHBhbmRlciIKKwl0cmlzdGF0ZSAiQURQNTU4NS9BRFA1NTg5IEkyQyBRV0VSVFkgS2V5cGFkIGFuZCBJTyBFeHBhbmRlciIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgQURQNTU4OSBhdHRhY2hlZCB0byB5b3VyCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIEFEUDU1ODUvQURQNTU4OSBhdHRhY2hlZCB0byB5b3VyCiAJICBzeXN0ZW0gSTJDIGJ1cy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODgta2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYwppbmRleCBlMzRlZWI4Li40YTdmNTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODgta2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OC1rZXlzLmMKQEAgLTU1MCw3ICs1NTAsNyBAQAogCX0KIAogCWVycm9yID0gcmVxdWVzdF9pcnEoY2xpZW50LT5pcnEsIGFkcDU1ODhfaXJxLAotCQkJICAgIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICBJUlFGX1RSSUdHRVJfRkFMTElORywKIAkJCSAgICBjbGllbnQtPmRldi5kcml2ZXItPm5hbWUsIGtwYWQpOwogCWlmIChlcnJvcikgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImlycSAlZCBidXN5P1xuIiwgY2xpZW50LT5pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg5LWtleXMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OS1rZXlzLmMKaW5kZXggYzc3MDgyNi4uMDJiNWQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg5LWtleXMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODkta2V5cy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIERlc2NyaXB0aW9uOiAga2V5cGFkIGRyaXZlciBmb3IgQURQNTU4OQorICogRGVzY3JpcHRpb246ICBrZXlwYWQgZHJpdmVyIGZvciBBRFA1NTg5LCBBRFA1NTg1CiAgKgkJIEkyQyBRV0VSVFkgS2V5cGFkIGFuZCBJTyBFeHBhbmRlcgogICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCiAgKgpAQCAtMjIsMzUgKzIyLDE2NSBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQvYWRwNTU4OS5oPgogCisvKiBBRFA1NTg5L0FEUDU1ODUgQ29tbW9uIFJlZ2lzdGVycyAqLworI2RlZmluZSBBRFA1NTg5XzVfSUQJCQkweDAwCisjZGVmaW5lIEFEUDU1ODlfNV9JTlRfU1RBVFVTCQkweDAxCisjZGVmaW5lIEFEUDU1ODlfNV9TVEFUVVMJCTB4MDIKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fMQkJMHgwMworI2RlZmluZSBBRFA1NTg5XzVfRklGT18yCQkweDA0CisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzMJCTB4MDUKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fNAkJMHgwNgorI2RlZmluZSBBRFA1NTg5XzVfRklGT181CQkweDA3CisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzYJCTB4MDgKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fNwkJMHgwOQorI2RlZmluZSBBRFA1NTg5XzVfRklGT184CQkweDBBCisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzkJCTB4MEIKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fMTAJCTB4MEMKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fMTEJCTB4MEQKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fMTIJCTB4MEUKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fMTMJCTB4MEYKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fMTQJCTB4MTAKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fMTUJCTB4MTEKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fMTYJCTB4MTIKKyNkZWZpbmUgQURQNTU4OV81X0dQSV9JTlRfU1RBVF9BCTB4MTMKKyNkZWZpbmUgQURQNTU4OV81X0dQSV9JTlRfU1RBVF9CCTB4MTQKKworLyogQURQNTU4OSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQURQNTU4OV9HUElfSU5UX1NUQVRfQwkJMHgxNQorI2RlZmluZSBBRFA1NTg5X0dQSV9TVEFUVVNfQQkJMHgxNgorI2RlZmluZSBBRFA1NTg5X0dQSV9TVEFUVVNfQgkJMHgxNworI2RlZmluZSBBRFA1NTg5X0dQSV9TVEFUVVNfQwkJMHgxOAorI2RlZmluZSBBRFA1NTg5X1JQVUxMX0NPTkZJR19BCQkweDE5CisjZGVmaW5lIEFEUDU1ODlfUlBVTExfQ09ORklHX0IJCTB4MUEKKyNkZWZpbmUgQURQNTU4OV9SUFVMTF9DT05GSUdfQwkJMHgxQgorI2RlZmluZSBBRFA1NTg5X1JQVUxMX0NPTkZJR19ECQkweDFDCisjZGVmaW5lIEFEUDU1ODlfUlBVTExfQ09ORklHX0UJCTB4MUQKKyNkZWZpbmUgQURQNTU4OV9HUElfSU5UX0xFVkVMX0EJCTB4MUUKKyNkZWZpbmUgQURQNTU4OV9HUElfSU5UX0xFVkVMX0IJCTB4MUYKKyNkZWZpbmUgQURQNTU4OV9HUElfSU5UX0xFVkVMX0MJCTB4MjAKKyNkZWZpbmUgQURQNTU4OV9HUElfRVZFTlRfRU5fQQkJMHgyMQorI2RlZmluZSBBRFA1NTg5X0dQSV9FVkVOVF9FTl9CCQkweDIyCisjZGVmaW5lIEFEUDU1ODlfR1BJX0VWRU5UX0VOX0MJCTB4MjMKKyNkZWZpbmUgQURQNTU4OV9HUElfSU5URVJSVVBUX0VOX0EJMHgyNAorI2RlZmluZSBBRFA1NTg5X0dQSV9JTlRFUlJVUFRfRU5fQgkweDI1CisjZGVmaW5lIEFEUDU1ODlfR1BJX0lOVEVSUlVQVF9FTl9DCTB4MjYKKyNkZWZpbmUgQURQNTU4OV9ERUJPVU5DRV9ESVNfQQkJMHgyNworI2RlZmluZSBBRFA1NTg5X0RFQk9VTkNFX0RJU19CCQkweDI4CisjZGVmaW5lIEFEUDU1ODlfREVCT1VOQ0VfRElTX0MJCTB4MjkKKyNkZWZpbmUgQURQNTU4OV9HUE9fREFUQV9PVVRfQQkJMHgyQQorI2RlZmluZSBBRFA1NTg5X0dQT19EQVRBX09VVF9CCQkweDJCCisjZGVmaW5lIEFEUDU1ODlfR1BPX0RBVEFfT1VUX0MJCTB4MkMKKyNkZWZpbmUgQURQNTU4OV9HUE9fT1VUX01PREVfQQkJMHgyRAorI2RlZmluZSBBRFA1NTg5X0dQT19PVVRfTU9ERV9CCQkweDJFCisjZGVmaW5lIEFEUDU1ODlfR1BPX09VVF9NT0RFX0MJCTB4MkYKKyNkZWZpbmUgQURQNTU4OV9HUElPX0RJUkVDVElPTl9BCTB4MzAKKyNkZWZpbmUgQURQNTU4OV9HUElPX0RJUkVDVElPTl9CCTB4MzEKKyNkZWZpbmUgQURQNTU4OV9HUElPX0RJUkVDVElPTl9DCTB4MzIKKyNkZWZpbmUgQURQNTU4OV9VTkxPQ0sxCQkJMHgzMworI2RlZmluZSBBRFA1NTg5X1VOTE9DSzIJCQkweDM0CisjZGVmaW5lIEFEUDU1ODlfRVhUX0xPQ0tfRVZFTlQJCTB4MzUKKyNkZWZpbmUgQURQNTU4OV9VTkxPQ0tfVElNRVJTCQkweDM2CisjZGVmaW5lIEFEUDU1ODlfTE9DS19DRkcJCTB4MzcKKyNkZWZpbmUgQURQNTU4OV9SRVNFVDFfRVZFTlRfQQkJMHgzOAorI2RlZmluZSBBRFA1NTg5X1JFU0VUMV9FVkVOVF9CCQkweDM5CisjZGVmaW5lIEFEUDU1ODlfUkVTRVQxX0VWRU5UX0MJCTB4M0EKKyNkZWZpbmUgQURQNTU4OV9SRVNFVDJfRVZFTlRfQQkJMHgzQgorI2RlZmluZSBBRFA1NTg5X1JFU0VUMl9FVkVOVF9CCQkweDNDCisjZGVmaW5lIEFEUDU1ODlfUkVTRVRfQ0ZHCQkweDNECisjZGVmaW5lIEFEUDU1ODlfUFdNX09GRlRfTE9XCQkweDNFCisjZGVmaW5lIEFEUDU1ODlfUFdNX09GRlRfSElHSAkJMHgzRgorI2RlZmluZSBBRFA1NTg5X1BXTV9PTlRfTE9XCQkweDQwCisjZGVmaW5lIEFEUDU1ODlfUFdNX09OVF9ISUdICQkweDQxCisjZGVmaW5lIEFEUDU1ODlfUFdNX0NGRwkJCTB4NDIKKyNkZWZpbmUgQURQNTU4OV9DTE9DS19ESVZfQ0ZHCQkweDQzCisjZGVmaW5lIEFEUDU1ODlfTE9HSUNfMV9DRkcJCTB4NDQKKyNkZWZpbmUgQURQNTU4OV9MT0dJQ18yX0NGRwkJMHg0NQorI2RlZmluZSBBRFA1NTg5X0xPR0lDX0ZGX0NGRwkJMHg0NgorI2RlZmluZSBBRFA1NTg5X0xPR0lDX0lOVF9FVkVOVF9FTgkweDQ3CisjZGVmaW5lIEFEUDU1ODlfUE9MTF9QVElNRV9DRkcJCTB4NDgKKyNkZWZpbmUgQURQNTU4OV9QSU5fQ09ORklHX0EJCTB4NDkKKyNkZWZpbmUgQURQNTU4OV9QSU5fQ09ORklHX0IJCTB4NEEKKyNkZWZpbmUgQURQNTU4OV9QSU5fQ09ORklHX0MJCTB4NEIKKyNkZWZpbmUgQURQNTU4OV9QSU5fQ09ORklHX0QJCTB4NEMKKyNkZWZpbmUgQURQNTU4OV9HRU5FUkFMX0NGRwkJMHg0RAorI2RlZmluZSBBRFA1NTg5X0lOVF9FTgkJCTB4NEUKKworLyogQURQNTU4NSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQURQNTU4NV9HUElfU1RBVFVTX0EJCTB4MTUKKyNkZWZpbmUgQURQNTU4NV9HUElfU1RBVFVTX0IJCTB4MTYKKyNkZWZpbmUgQURQNTU4NV9SUFVMTF9DT05GSUdfQQkJMHgxNworI2RlZmluZSBBRFA1NTg1X1JQVUxMX0NPTkZJR19CCQkweDE4CisjZGVmaW5lIEFEUDU1ODVfUlBVTExfQ09ORklHX0MJCTB4MTkKKyNkZWZpbmUgQURQNTU4NV9SUFVMTF9DT05GSUdfRAkJMHgxQQorI2RlZmluZSBBRFA1NTg1X0dQSV9JTlRfTEVWRUxfQQkJMHgxQgorI2RlZmluZSBBRFA1NTg1X0dQSV9JTlRfTEVWRUxfQgkJMHgxQworI2RlZmluZSBBRFA1NTg1X0dQSV9FVkVOVF9FTl9BCQkweDFECisjZGVmaW5lIEFEUDU1ODVfR1BJX0VWRU5UX0VOX0IJCTB4MUUKKyNkZWZpbmUgQURQNTU4NV9HUElfSU5URVJSVVBUX0VOX0EJMHgxRgorI2RlZmluZSBBRFA1NTg1X0dQSV9JTlRFUlJVUFRfRU5fQgkweDIwCisjZGVmaW5lIEFEUDU1ODVfREVCT1VOQ0VfRElTX0EJCTB4MjEKKyNkZWZpbmUgQURQNTU4NV9ERUJPVU5DRV9ESVNfQgkJMHgyMgorI2RlZmluZSBBRFA1NTg1X0dQT19EQVRBX09VVF9BCQkweDIzCisjZGVmaW5lIEFEUDU1ODVfR1BPX0RBVEFfT1VUX0IJCTB4MjQKKyNkZWZpbmUgQURQNTU4NV9HUE9fT1VUX01PREVfQQkJMHgyNQorI2RlZmluZSBBRFA1NTg1X0dQT19PVVRfTU9ERV9CCQkweDI2CisjZGVmaW5lIEFEUDU1ODVfR1BJT19ESVJFQ1RJT05fQQkweDI3CisjZGVmaW5lIEFEUDU1ODVfR1BJT19ESVJFQ1RJT05fQgkweDI4CisjZGVmaW5lIEFEUDU1ODVfUkVTRVQxX0VWRU5UX0EJCTB4MjkKKyNkZWZpbmUgQURQNTU4NV9SRVNFVDFfRVZFTlRfQgkJMHgyQQorI2RlZmluZSBBRFA1NTg1X1JFU0VUMV9FVkVOVF9DCQkweDJCCisjZGVmaW5lIEFEUDU1ODVfUkVTRVQyX0VWRU5UX0EJCTB4MkMKKyNkZWZpbmUgQURQNTU4NV9SRVNFVDJfRVZFTlRfQgkJMHgyRAorI2RlZmluZSBBRFA1NTg1X1JFU0VUX0NGRwkJMHgyRQorI2RlZmluZSBBRFA1NTg1X1BXTV9PRkZUX0xPVwkJMHgyRgorI2RlZmluZSBBRFA1NTg1X1BXTV9PRkZUX0hJR0gJCTB4MzAKKyNkZWZpbmUgQURQNTU4NV9QV01fT05UX0xPVwkJMHgzMQorI2RlZmluZSBBRFA1NTg1X1BXTV9PTlRfSElHSAkJMHgzMgorI2RlZmluZSBBRFA1NTg1X1BXTV9DRkcJCQkweDMzCisjZGVmaW5lIEFEUDU1ODVfTE9HSUNfQ0ZHCQkweDM0CisjZGVmaW5lIEFEUDU1ODVfTE9HSUNfRkZfQ0ZHCQkweDM1CisjZGVmaW5lIEFEUDU1ODVfTE9HSUNfSU5UX0VWRU5UX0VOCTB4MzYKKyNkZWZpbmUgQURQNTU4NV9QT0xMX1BUSU1FX0NGRwkJMHgzNworI2RlZmluZSBBRFA1NTg1X1BJTl9DT05GSUdfQQkJMHgzOAorI2RlZmluZSBBRFA1NTg1X1BJTl9DT05GSUdfQgkJMHgzOQorI2RlZmluZSBBRFA1NTg1X1BJTl9DT05GSUdfRAkJMHgzQQorI2RlZmluZSBBRFA1NTg1X0dFTkVSQUxfQ0ZHCQkweDNCCisjZGVmaW5lIEFEUDU1ODVfSU5UX0VOCQkJMHgzQworCisvKiBJRCBSZWdpc3RlciAqLworI2RlZmluZSBBRFA1NTg5XzVfREVWSUNFX0lEX01BU0sJMHhGCisjZGVmaW5lIEFEUDU1ODlfNV9NQU5fSURfTUFTSwkJMHhGCisjZGVmaW5lIEFEUDU1ODlfNV9NQU5fSURfU0hJRlQJCTQKKyNkZWZpbmUgQURQNTU4OV81X01BTl9JRAkJMHgwMgorCiAvKiBHRU5FUkFMX0NGRyBSZWdpc3RlciAqLwogI2RlZmluZSBPU0NfRU4JCSgxIDw8IDcpCiAjZGVmaW5lIENPUkVfQ0xLKHgpCSgoKHgpICYgMHgzKSA8PCA1KQotI2RlZmluZSBMQ0tfVFJLX0xPR0lDCSgxIDw8IDQpCi0jZGVmaW5lIExDS19UUktfR1BJCSgxIDw8IDMpCisjZGVmaW5lIExDS19UUktfTE9HSUMJKDEgPDwgNCkJLyogQURQNTU4OSBvbmx5ICovCisjZGVmaW5lIExDS19UUktfR1BJCSgxIDw8IDMpCS8qIEFEUDU1ODkgb25seSAqLwogI2RlZmluZSBJTlRfQ0ZHCQkoMSA8PCAxKQogI2RlZmluZSBSU1RfQ0ZHCQkoMSA8PCAwKQogCiAvKiBJTlRfRU4gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTE9HSUMyX0lFTgkoMSA8PCA1KQorI2RlZmluZSBMT0dJQzJfSUVOCSgxIDw8IDUpCS8qIEFEUDU1ODkgb25seSAqLwogI2RlZmluZSBMT0dJQzFfSUVOCSgxIDw8IDQpCi0jZGVmaW5lIExPQ0tfSUVOCSgxIDw8IDMpCisjZGVmaW5lIExPQ0tfSUVOCSgxIDw8IDMpCS8qIEFEUDU1ODkgb25seSAqLwogI2RlZmluZSBPVlJGTE9XX0lFTgkoMSA8PCAyKQogI2RlZmluZSBHUElfSUVOCQkoMSA8PCAxKQogI2RlZmluZSBFVkVOVF9JRU4JKDEgPDwgMCkKIAogLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBMT0dJQzJfSU5UCSgxIDw8IDUpCisjZGVmaW5lIExPR0lDMl9JTlQJKDEgPDwgNSkJLyogQURQNTU4OSBvbmx5ICovCiAjZGVmaW5lIExPR0lDMV9JTlQJKDEgPDwgNCkKLSNkZWZpbmUgTE9DS19JTlQJKDEgPDwgMykKKyNkZWZpbmUgTE9DS19JTlQJKDEgPDwgMykJLyogQURQNTU4OSBvbmx5ICovCiAjZGVmaW5lIE9WUkZMT1dfSU5UCSgxIDw8IDIpCiAjZGVmaW5lIEdQSV9JTlQJCSgxIDw8IDEpCiAjZGVmaW5lIEVWRU5UX0lOVAkoMSA8PCAwKQogCiAvKiBTVEFUVVMgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBMT0dJQzJfU1RBVAkoMSA8PCA3KQorI2RlZmluZSBMT0dJQzJfU1RBVAkoMSA8PCA3KQkvKiBBRFA1NTg5IG9ubHkgKi8KICNkZWZpbmUgTE9HSUMxX1NUQVQJKDEgPDwgNikKLSNkZWZpbmUgTE9DS19TVEFUCSgxIDw8IDUpCisjZGVmaW5lIExPQ0tfU1RBVAkoMSA8PCA1KQkvKiBBRFA1NTg5IG9ubHkgKi8KICNkZWZpbmUgS0VDCQkweEYKIAogLyogUElOX0NPTkZJR19EIFJlZ2lzdGVyICovCkBAIC02MSwyNyArMTkxLDU0IEBACiAjZGVmaW5lIExPQ0tfRU4JCSgxIDw8IDApCiAKICNkZWZpbmUgUFRJTUVfTUFTSwkweDMKLSNkZWZpbmUgTFRJTUVfTUFTSwkweDMKKyNkZWZpbmUgTFRJTUVfTUFTSwkweDMJCS8qIEFEUDU1ODkgb25seSAqLwogCiAvKiBLZXkgRXZlbnQgUmVnaXN0ZXIgeHkgKi8KICNkZWZpbmUgS0VZX0VWX1BSRVNTRUQJCSgxIDw8IDcpCiAjZGVmaW5lIEtFWV9FVl9NQVNLCQkoMHg3RikKIAogI2RlZmluZSBLRVlQX01BWF9FVkVOVAkJMTYKKyNkZWZpbmUgQURQNTU4OV9NQVhHUElPCQkxOQorI2RlZmluZSBBRFA1NTg1X01BWEdQSU8JCTExIC8qIDEwIG9uIHRoZSBBRFA1NTg1LTAxLCAxMSBvbiBBRFA1NTg1LTAyICovCiAKLSNkZWZpbmUgTUFYR1BJTwkJCTE5Ci0jZGVmaW5lIEFEUF9CQU5LKG9mZnMpCQkoKG9mZnMpID4+IDMpCi0jZGVmaW5lIEFEUF9CSVQob2ZmcykJCSgxdSA8PCAoKG9mZnMpICYgMHg3KSkKK2VudW0geworCUFEUDU1ODksCisJQURQNTU4NV8wMSwKKwlBRFA1NTg1XzAyCit9OworCitzdHJ1Y3QgYWRwX2NvbnN0YW50cyB7CisJdTggbWF4Z3BpbzsKKwl1OCBrZXltYXBzaXplOworCXU4IGdwaV9waW5fcm93X2Jhc2U7CisJdTggZ3BpX3Bpbl9yb3dfZW5kOworCXU4IGdwaV9waW5fY29sX2Jhc2U7CisJdTggZ3BpX3Bpbl9iYXNlOworCXU4IGdwaV9waW5fZW5kOworCXU4IGdwaW1hcHNpemVfbWF4OworCXU4IG1heF9yb3dfbnVtOworCXU4IG1heF9jb2xfbnVtOworCXU4IHJvd19tYXNrOworCXU4IGNvbF9tYXNrOworCXU4IGNvbF9zaGlmdDsKKwl1OCBjNF9leHRlbmRfY2ZnOworCXU4ICgqYmFuaykgKHU4IG9mZnNldCk7CisJdTggKCpiaXQpICh1OCBvZmZzZXQpOworCXU4ICgqcmVnKSAodTggcmVnKTsKK307CiAKIHN0cnVjdCBhZHA1NTg5X2twYWQgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJY29uc3Qgc3RydWN0IGFkcF9jb25zdGFudHMgKnZhcjsKIAl1bnNpZ25lZCBzaG9ydCBrZXljb2RlW0FEUDU1ODlfS0VZTUFQU0laRV07CiAJY29uc3Qgc3RydWN0IGFkcDU1ODlfZ3BpX21hcCAqZ3BpbWFwOwogCXVuc2lnbmVkIHNob3J0IGdwaW1hcHNpemU7CiAJdW5zaWduZWQgZXh0ZW5kX2NmZzsKKwlib29sIGlzX2FkcDU1ODU7CisJYm9vbCBhZHA1NTg1X3N1cHBvcnRfcm93NTsKICNpZmRlZiBDT05GSUdfR1BJT0xJQgotCXVuc2lnbmVkIGNoYXIgZ3Bpb21hcFtNQVhHUElPXTsKKwl1bnNpZ25lZCBjaGFyIGdwaW9tYXBbQURQNTU4OV9NQVhHUElPXTsKIAlib29sIGV4cG9ydF9ncGlvOwogCXN0cnVjdCBncGlvX2NoaXAgZ2M7CiAJc3RydWN0IG11dGV4IGdwaW9fbG9jazsJLyogUHJvdGVjdCBjYWNoZWQgZGlyLCBkYXRfb3V0ICovCkBAIC05MCw2ICsyNDcsMTI5IEBACiAjZW5kaWYKIH07CiAKKy8qCisgKiAgQURQNTU4OSAvIEFEUDU1ODUgZGVyaXZhdGl2ZSAvIHZhcmlhbnQgaGFuZGxpbmcKKyAqLworCisKKy8qIEFEUDU1ODkgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWRwNTU4OV9iYW5rKHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQoreworCXJldHVybiBvZmZzZXQgPj4gMzsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWRwNTU4OV9iaXQodW5zaWduZWQgY2hhciBvZmZzZXQpCit7CisJcmV0dXJuIDF1IDw8IChvZmZzZXQgJiAweDcpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhZHA1NTg5X3JlZyh1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlyZXR1cm4gcmVnOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkcF9jb25zdGFudHMgY29uc3RfYWRwNTU4OSA9IHsKKwkubWF4Z3BpbwkJPSBBRFA1NTg5X01BWEdQSU8sCisJLmtleW1hcHNpemUJCT0gQURQNTU4OV9LRVlNQVBTSVpFLAorCS5ncGlfcGluX3Jvd19iYXNlCT0gQURQNTU4OV9HUElfUElOX1JPV19CQVNFLAorCS5ncGlfcGluX3Jvd19lbmQJPSBBRFA1NTg5X0dQSV9QSU5fUk9XX0VORCwKKwkuZ3BpX3Bpbl9jb2xfYmFzZQk9IEFEUDU1ODlfR1BJX1BJTl9DT0xfQkFTRSwKKwkuZ3BpX3Bpbl9iYXNlCQk9IEFEUDU1ODlfR1BJX1BJTl9CQVNFLAorCS5ncGlfcGluX2VuZAkJPSBBRFA1NTg5X0dQSV9QSU5fRU5ELAorCS5ncGltYXBzaXplX21heAkJPSBBRFA1NTg5X0dQSU1BUFNJWkVfTUFYLAorCS5jNF9leHRlbmRfY2ZnCQk9IDEyLAorCS5tYXhfcm93X251bQkJPSBBRFA1NTg5X01BWF9ST1dfTlVNLAorCS5tYXhfY29sX251bQkJPSBBRFA1NTg5X01BWF9DT0xfTlVNLAorCS5yb3dfbWFzawkJPSBBRFA1NTg5X1JPV19NQVNLLAorCS5jb2xfbWFzawkJPSBBRFA1NTg5X0NPTF9NQVNLLAorCS5jb2xfc2hpZnQJCT0gQURQNTU4OV9DT0xfU0hJRlQsCisJLmJhbmsJCQk9IGFkcDU1ODlfYmFuaywKKwkuYml0CQkJPSBhZHA1NTg5X2JpdCwKKwkucmVnCQkJPSBhZHA1NTg5X3JlZywKK307CisKKy8qIEFEUDU1ODUgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWRwNTU4NV9iYW5rKHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQoreworCXJldHVybiBvZmZzZXQgPiBBRFA1NTg1X01BWF9ST1dfTlVNOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhZHA1NTg1X2JpdCh1bnNpZ25lZCBjaGFyIG9mZnNldCkKK3sKKwlyZXR1cm4gKG9mZnNldCA+IEFEUDU1ODVfTUFYX1JPV19OVU0pID8KKwkJMXUgPDwgKG9mZnNldCAtIEFEUDU1ODVfQ09MX1NISUZUKSA6IDF1IDw8IG9mZnNldDsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWRwNTU4NV9yZWdfbHV0W10gPSB7CisJW0FEUDU1ODlfR1BJX1NUQVRVU19BXQkJPSBBRFA1NTg1X0dQSV9TVEFUVVNfQSwKKwlbQURQNTU4OV9HUElfU1RBVFVTX0JdCQk9IEFEUDU1ODVfR1BJX1NUQVRVU19CLAorCVtBRFA1NTg5X1JQVUxMX0NPTkZJR19BXQk9IEFEUDU1ODVfUlBVTExfQ09ORklHX0EsCisJW0FEUDU1ODlfUlBVTExfQ09ORklHX0JdCT0gQURQNTU4NV9SUFVMTF9DT05GSUdfQiwKKwlbQURQNTU4OV9SUFVMTF9DT05GSUdfQ10JPSBBRFA1NTg1X1JQVUxMX0NPTkZJR19DLAorCVtBRFA1NTg5X1JQVUxMX0NPTkZJR19EXQk9IEFEUDU1ODVfUlBVTExfQ09ORklHX0QsCisJW0FEUDU1ODlfR1BJX0lOVF9MRVZFTF9BXQk9IEFEUDU1ODVfR1BJX0lOVF9MRVZFTF9BLAorCVtBRFA1NTg5X0dQSV9JTlRfTEVWRUxfQl0JPSBBRFA1NTg1X0dQSV9JTlRfTEVWRUxfQiwKKwlbQURQNTU4OV9HUElfRVZFTlRfRU5fQV0JPSBBRFA1NTg1X0dQSV9FVkVOVF9FTl9BLAorCVtBRFA1NTg5X0dQSV9FVkVOVF9FTl9CXQk9IEFEUDU1ODVfR1BJX0VWRU5UX0VOX0IsCisJW0FEUDU1ODlfR1BJX0lOVEVSUlVQVF9FTl9BXQk9IEFEUDU1ODVfR1BJX0lOVEVSUlVQVF9FTl9BLAorCVtBRFA1NTg5X0dQSV9JTlRFUlJVUFRfRU5fQl0JPSBBRFA1NTg1X0dQSV9JTlRFUlJVUFRfRU5fQiwKKwlbQURQNTU4OV9ERUJPVU5DRV9ESVNfQV0JPSBBRFA1NTg1X0RFQk9VTkNFX0RJU19BLAorCVtBRFA1NTg5X0RFQk9VTkNFX0RJU19CXQk9IEFEUDU1ODVfREVCT1VOQ0VfRElTX0IsCisJW0FEUDU1ODlfR1BPX0RBVEFfT1VUX0FdCT0gQURQNTU4NV9HUE9fREFUQV9PVVRfQSwKKwlbQURQNTU4OV9HUE9fREFUQV9PVVRfQl0JPSBBRFA1NTg1X0dQT19EQVRBX09VVF9CLAorCVtBRFA1NTg5X0dQT19PVVRfTU9ERV9BXQk9IEFEUDU1ODVfR1BPX09VVF9NT0RFX0EsCisJW0FEUDU1ODlfR1BPX09VVF9NT0RFX0JdCT0gQURQNTU4NV9HUE9fT1VUX01PREVfQiwKKwlbQURQNTU4OV9HUElPX0RJUkVDVElPTl9BXQk9IEFEUDU1ODVfR1BJT19ESVJFQ1RJT05fQSwKKwlbQURQNTU4OV9HUElPX0RJUkVDVElPTl9CXQk9IEFEUDU1ODVfR1BJT19ESVJFQ1RJT05fQiwKKwlbQURQNTU4OV9SRVNFVDFfRVZFTlRfQV0JPSBBRFA1NTg1X1JFU0VUMV9FVkVOVF9BLAorCVtBRFA1NTg5X1JFU0VUMV9FVkVOVF9CXQk9IEFEUDU1ODVfUkVTRVQxX0VWRU5UX0IsCisJW0FEUDU1ODlfUkVTRVQxX0VWRU5UX0NdCT0gQURQNTU4NV9SRVNFVDFfRVZFTlRfQywKKwlbQURQNTU4OV9SRVNFVDJfRVZFTlRfQV0JPSBBRFA1NTg1X1JFU0VUMl9FVkVOVF9BLAorCVtBRFA1NTg5X1JFU0VUMl9FVkVOVF9CXQk9IEFEUDU1ODVfUkVTRVQyX0VWRU5UX0IsCisJW0FEUDU1ODlfUkVTRVRfQ0ZHXQkJPSBBRFA1NTg1X1JFU0VUX0NGRywKKwlbQURQNTU4OV9QV01fT0ZGVF9MT1ddCQk9IEFEUDU1ODVfUFdNX09GRlRfTE9XLAorCVtBRFA1NTg5X1BXTV9PRkZUX0hJR0hdCQk9IEFEUDU1ODVfUFdNX09GRlRfSElHSCwKKwlbQURQNTU4OV9QV01fT05UX0xPV10JCT0gQURQNTU4NV9QV01fT05UX0xPVywKKwlbQURQNTU4OV9QV01fT05UX0hJR0hdCQk9IEFEUDU1ODVfUFdNX09OVF9ISUdILAorCVtBRFA1NTg5X1BXTV9DRkddCQk9IEFEUDU1ODVfUFdNX0NGRywKKwlbQURQNTU4OV9MT0dJQ18xX0NGR10JCT0gQURQNTU4NV9MT0dJQ19DRkcsCisJW0FEUDU1ODlfTE9HSUNfRkZfQ0ZHXQkJPSBBRFA1NTg1X0xPR0lDX0ZGX0NGRywKKwlbQURQNTU4OV9MT0dJQ19JTlRfRVZFTlRfRU5dCT0gQURQNTU4NV9MT0dJQ19JTlRfRVZFTlRfRU4sCisJW0FEUDU1ODlfUE9MTF9QVElNRV9DRkddCT0gQURQNTU4NV9QT0xMX1BUSU1FX0NGRywKKwlbQURQNTU4OV9QSU5fQ09ORklHX0FdCQk9IEFEUDU1ODVfUElOX0NPTkZJR19BLAorCVtBRFA1NTg5X1BJTl9DT05GSUdfQl0JCT0gQURQNTU4NV9QSU5fQ09ORklHX0IsCisJW0FEUDU1ODlfUElOX0NPTkZJR19EXQkJPSBBRFA1NTg1X1BJTl9DT05GSUdfRCwKKwlbQURQNTU4OV9HRU5FUkFMX0NGR10JCT0gQURQNTU4NV9HRU5FUkFMX0NGRywKKwlbQURQNTU4OV9JTlRfRU5dCQk9IEFEUDU1ODVfSU5UX0VOLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWRwNTU4NV9yZWcodW5zaWduZWQgY2hhciByZWcpCit7CisJcmV0dXJuIGFkcDU1ODVfcmVnX2x1dFtyZWddOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkcF9jb25zdGFudHMgY29uc3RfYWRwNTU4NSA9IHsKKwkubWF4Z3BpbwkJPSBBRFA1NTg1X01BWEdQSU8sCisJLmtleW1hcHNpemUJCT0gQURQNTU4NV9LRVlNQVBTSVpFLAorCS5ncGlfcGluX3Jvd19iYXNlCT0gQURQNTU4NV9HUElfUElOX1JPV19CQVNFLAorCS5ncGlfcGluX3Jvd19lbmQJPSBBRFA1NTg1X0dQSV9QSU5fUk9XX0VORCwKKwkuZ3BpX3Bpbl9jb2xfYmFzZQk9IEFEUDU1ODVfR1BJX1BJTl9DT0xfQkFTRSwKKwkuZ3BpX3Bpbl9iYXNlCQk9IEFEUDU1ODVfR1BJX1BJTl9CQVNFLAorCS5ncGlfcGluX2VuZAkJPSBBRFA1NTg1X0dQSV9QSU5fRU5ELAorCS5ncGltYXBzaXplX21heAkJPSBBRFA1NTg1X0dQSU1BUFNJWkVfTUFYLAorCS5jNF9leHRlbmRfY2ZnCQk9IDEwLAorCS5tYXhfcm93X251bQkJPSBBRFA1NTg1X01BWF9ST1dfTlVNLAorCS5tYXhfY29sX251bQkJPSBBRFA1NTg1X01BWF9DT0xfTlVNLAorCS5yb3dfbWFzawkJPSBBRFA1NTg1X1JPV19NQVNLLAorCS5jb2xfbWFzawkJPSBBRFA1NTg1X0NPTF9NQVNLLAorCS5jb2xfc2hpZnQJCT0gQURQNTU4NV9DT0xfU0hJRlQsCisJLmJhbmsJCQk9IGFkcDU1ODVfYmFuaywKKwkuYml0CQkJPSBhZHA1NTg1X2JpdCwKKwkucmVnCQkJPSBhZHA1NTg1X3JlZywKK307CisKIHN0YXRpYyBpbnQgYWRwNTU4OV9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKIHsKIAlpbnQgcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKQEAgLTEwOSwxOSArMzg5LDIwIEBACiBzdGF0aWMgaW50IGFkcDU1ODlfZ3Bpb19nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2ZmKQogewogCXN0cnVjdCBhZHA1NTg5X2twYWQgKmtwYWQgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGFkcDU1ODlfa3BhZCwgZ2MpOwotCXVuc2lnbmVkIGludCBiYW5rID0gQURQX0JBTksoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKLQl1bnNpZ25lZCBpbnQgYml0ID0gQURQX0JJVChrcGFkLT5ncGlvbWFwW29mZl0pOworCXVuc2lnbmVkIGludCBiYW5rID0ga3BhZC0+dmFyLT5iYW5rKGtwYWQtPmdwaW9tYXBbb2ZmXSk7CisJdW5zaWduZWQgaW50IGJpdCA9IGtwYWQtPnZhci0+Yml0KGtwYWQtPmdwaW9tYXBbb2ZmXSk7CiAKLQlyZXR1cm4gISEoYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwgQURQNTU4OV9HUElfU1RBVFVTX0EgKyBiYW5rKSAmCi0JCSAgYml0KTsKKwlyZXR1cm4gISEoYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwKKwkJCSAgICAgICBrcGFkLT52YXItPnJlZyhBRFA1NTg5X0dQSV9TVEFUVVNfQSkgKyBiYW5rKSAmCisJCQkgICAgICAgYml0KTsKIH0KIAogc3RhdGljIHZvaWQgYWRwNTU4OV9ncGlvX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAogCQkJCSAgIHVuc2lnbmVkIG9mZiwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgYWRwNTU4OV9rcGFkICprcGFkID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBhZHA1NTg5X2twYWQsIGdjKTsKLQl1bnNpZ25lZCBpbnQgYmFuayA9IEFEUF9CQU5LKGtwYWQtPmdwaW9tYXBbb2ZmXSk7Ci0JdW5zaWduZWQgaW50IGJpdCA9IEFEUF9CSVQoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKwl1bnNpZ25lZCBpbnQgYmFuayA9IGtwYWQtPnZhci0+YmFuayhrcGFkLT5ncGlvbWFwW29mZl0pOworCXVuc2lnbmVkIGludCBiaXQgPSBrcGFkLT52YXItPmJpdChrcGFkLT5ncGlvbWFwW29mZl0pOwogCiAJbXV0ZXhfbG9jaygma3BhZC0+Z3Bpb19sb2NrKTsKIApAQCAtMTMwLDggKzQxMSw4IEBACiAJZWxzZQogCQlrcGFkLT5kYXRfb3V0W2JhbmtdICY9IH5iaXQ7CiAKLQlhZHA1NTg5X3dyaXRlKGtwYWQtPmNsaWVudCwgQURQNTU4OV9HUE9fREFUQV9PVVRfQSArIGJhbmssCi0JCSAgICAgIGtwYWQtPmRhdF9vdXRbYmFua10pOworCWFkcDU1ODlfd3JpdGUoa3BhZC0+Y2xpZW50LCBrcGFkLT52YXItPnJlZyhBRFA1NTg5X0dQT19EQVRBX09VVF9BKSArCisJCSAgICAgIGJhbmssIGtwYWQtPmRhdF9vdXRbYmFua10pOwogCiAJbXV0ZXhfdW5sb2NrKCZrcGFkLT5ncGlvX2xvY2spOwogfQpAQCAtMTM5LDE0ICs0MjAsMTUgQEAKIHN0YXRpYyBpbnQgYWRwNTU4OV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmYpCiB7CiAJc3RydWN0IGFkcDU1ODlfa3BhZCAqa3BhZCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgYWRwNTU4OV9rcGFkLCBnYyk7Ci0JdW5zaWduZWQgaW50IGJhbmsgPSBBRFBfQkFOSyhrcGFkLT5ncGlvbWFwW29mZl0pOwotCXVuc2lnbmVkIGludCBiaXQgPSBBRFBfQklUKGtwYWQtPmdwaW9tYXBbb2ZmXSk7CisJdW5zaWduZWQgaW50IGJhbmsgPSBrcGFkLT52YXItPmJhbmsoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKwl1bnNpZ25lZCBpbnQgYml0ID0ga3BhZC0+dmFyLT5iaXQoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygma3BhZC0+Z3Bpb19sb2NrKTsKIAogCWtwYWQtPmRpcltiYW5rXSAmPSB+Yml0OwotCXJldCA9IGFkcDU1ODlfd3JpdGUoa3BhZC0+Y2xpZW50LCBBRFA1NTg5X0dQSU9fRElSRUNUSU9OX0EgKyBiYW5rLAorCXJldCA9IGFkcDU1ODlfd3JpdGUoa3BhZC0+Y2xpZW50LAorCQkJICAgIGtwYWQtPnZhci0+cmVnKEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQSkgKyBiYW5rLAogCQkJICAgIGtwYWQtPmRpcltiYW5rXSk7CiAKIAltdXRleF91bmxvY2soJmtwYWQtPmdwaW9fbG9jayk7CkBAIC0xNTgsOCArNDQwLDggQEAKIAkJCQkJIHVuc2lnbmVkIG9mZiwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgYWRwNTU4OV9rcGFkICprcGFkID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBhZHA1NTg5X2twYWQsIGdjKTsKLQl1bnNpZ25lZCBpbnQgYmFuayA9IEFEUF9CQU5LKGtwYWQtPmdwaW9tYXBbb2ZmXSk7Ci0JdW5zaWduZWQgaW50IGJpdCA9IEFEUF9CSVQoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKwl1bnNpZ25lZCBpbnQgYmFuayA9IGtwYWQtPnZhci0+YmFuayhrcGFkLT5ncGlvbWFwW29mZl0pOworCXVuc2lnbmVkIGludCBiaXQgPSBrcGFkLT52YXItPmJpdChrcGFkLT5ncGlvbWFwW29mZl0pOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZrcGFkLT5ncGlvX2xvY2spOwpAQCAtMTcxLDkgKzQ1MywxMCBAQAogCWVsc2UKIAkJa3BhZC0+ZGF0X291dFtiYW5rXSAmPSB+Yml0OwogCi0JcmV0ID0gYWRwNTU4OV93cml0ZShrcGFkLT5jbGllbnQsIEFEUDU1ODlfR1BPX0RBVEFfT1VUX0EgKyBiYW5rLAotCQkJICAgIGtwYWQtPmRhdF9vdXRbYmFua10pOwotCXJldCB8PSBhZHA1NTg5X3dyaXRlKGtwYWQtPmNsaWVudCwgQURQNTU4OV9HUElPX0RJUkVDVElPTl9BICsgYmFuaywKKwlyZXQgPSBhZHA1NTg5X3dyaXRlKGtwYWQtPmNsaWVudCwga3BhZC0+dmFyLT5yZWcoQURQNTU4OV9HUE9fREFUQV9PVVRfQSkKKwkJCSAgICArIGJhbmssIGtwYWQtPmRhdF9vdXRbYmFua10pOworCXJldCB8PSBhZHA1NTg5X3dyaXRlKGtwYWQtPmNsaWVudCwKKwkJCSAgICAga3BhZC0+dmFyLT5yZWcoQURQNTU4OV9HUElPX0RJUkVDVElPTl9BKSArIGJhbmssCiAJCQkgICAgIGtwYWQtPmRpcltiYW5rXSk7CiAKIAltdXRleF91bmxvY2soJmtwYWQtPmdwaW9fbG9jayk7CkBAIC0xODQsMjYgKzQ2NywyOSBAQAogc3RhdGljIGludCBfX2RldmluaXQgYWRwNTU4OV9idWlsZF9ncGlvbWFwKHN0cnVjdCBhZHA1NTg5X2twYWQgKmtwYWQsCiAJCQkJY29uc3Qgc3RydWN0IGFkcDU1ODlfa3BhZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKIHsKLQlib29sIHBpbl91c2VkW01BWEdQSU9dOworCWJvb2wgcGluX3VzZWRbQURQNTU4OV9NQVhHUElPXTsKIAlpbnQgbl91bnVzZWQgPSAwOwogCWludCBpOwogCiAJbWVtc2V0KHBpbl91c2VkLCBmYWxzZSwgc2l6ZW9mKHBpbl91c2VkKSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYR1BJTzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBrcGFkLT52YXItPm1heGdwaW87IGkrKykKIAkJaWYgKHBkYXRhLT5rZXlwYWRfZW5fbWFzayAmICgxIDw8IGkpKQogCQkJcGluX3VzZWRbaV0gPSB0cnVlOwogCiAJZm9yIChpID0gMDsgaSA8IGtwYWQtPmdwaW1hcHNpemU7IGkrKykKLQkJcGluX3VzZWRba3BhZC0+Z3BpbWFwW2ldLnBpbiAtIEFEUDU1ODlfR1BJX1BJTl9CQVNFXSA9IHRydWU7CisJCXBpbl91c2VkW2twYWQtPmdwaW1hcFtpXS5waW4gLSBrcGFkLT52YXItPmdwaV9waW5fYmFzZV0gPSB0cnVlOwogCiAJaWYgKGtwYWQtPmV4dGVuZF9jZmcgJiBSNF9FWFRFTkRfQ0ZHKQogCQlwaW5fdXNlZFs0XSA9IHRydWU7CiAKIAlpZiAoa3BhZC0+ZXh0ZW5kX2NmZyAmIEM0X0VYVEVORF9DRkcpCi0JCXBpbl91c2VkWzEyXSA9IHRydWU7CisJCXBpbl91c2VkW2twYWQtPnZhci0+YzRfZXh0ZW5kX2NmZ10gPSB0cnVlOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWEdQSU87IGkrKykKKwlpZiAoIWtwYWQtPmFkcDU1ODVfc3VwcG9ydF9yb3c1KQorCQlwaW5fdXNlZFs1XSA9IHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwga3BhZC0+dmFyLT5tYXhncGlvOyBpKyspCiAJCWlmICghcGluX3VzZWRbaV0pCiAJCQlrcGFkLT5ncGlvbWFwW25fdW51c2VkKytdID0gaTsKIApAQCAtMjQ2LDExICs1MzIsMTEgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPD0gQURQX0JBTksoTUFYR1BJTyk7IGkrKykgewotCQlrcGFkLT5kYXRfb3V0W2ldID0gYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwKLQkJCQkJCUFEUDU1ODlfR1BPX0RBVEFfT1VUX0EgKyBpKTsKLQkJa3BhZC0+ZGlyW2ldID0gYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwKLQkJCQkJICAgIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQSArIGkpOworCWZvciAoaSA9IDA7IGkgPD0ga3BhZC0+dmFyLT5iYW5rKGtwYWQtPnZhci0+bWF4Z3Bpbyk7IGkrKykgeworCQlrcGFkLT5kYXRfb3V0W2ldID0gYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwga3BhZC0+dmFyLT5yZWcoCisJCQkJCQlBRFA1NTg5X0dQT19EQVRBX09VVF9BKSArIGkpOworCQlrcGFkLT5kaXJbaV0gPSBhZHA1NTg5X3JlYWQoa3BhZC0+Y2xpZW50LCBrcGFkLT52YXItPnJlZygKKwkJCQkJICAgIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQSkgKyBpKTsKIAl9CiAKIAlpZiAoZ3Bpb19kYXRhLT5zZXR1cCkgewpAQCAtMzE3LDExICs2MDMsMTEgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBldl9jbnQ7IGkrKykgewotCQlpbnQga2V5ID0gYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwgQURQNTU4OV9GSUZPXzEgKyBpKTsKKwkJaW50IGtleSA9IGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsIEFEUDU1ODlfNV9GSUZPXzEgKyBpKTsKIAkJaW50IGtleV92YWwgPSBrZXkgJiBLRVlfRVZfTUFTSzsKIAotCQlpZiAoa2V5X3ZhbCA+PSBBRFA1NTg5X0dQSV9QSU5fQkFTRSAmJgotCQkgICAga2V5X3ZhbCA8PSBBRFA1NTg5X0dQSV9QSU5fRU5EKSB7CisJCWlmIChrZXlfdmFsID49IGtwYWQtPnZhci0+Z3BpX3Bpbl9iYXNlICYmCisJCSAgICBrZXlfdmFsIDw9IGtwYWQtPnZhci0+Z3BpX3Bpbl9lbmQpIHsKIAkJCWFkcDU1ODlfcmVwb3J0X3N3aXRjaGVzKGtwYWQsIGtleSwga2V5X3ZhbCk7CiAJCX0gZWxzZSB7CiAJCQlpbnB1dF9yZXBvcnRfa2V5KGtwYWQtPmlucHV0LApAQCAtMzM3LDI5ICs2MjMsMzAgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0ga3BhZC0+Y2xpZW50OwogCWludCBzdGF0dXMsIGV2X2NudDsKIAotCXN0YXR1cyA9IGFkcDU1ODlfcmVhZChjbGllbnQsIEFEUDU1ODlfSU5UX1NUQVRVUyk7CisJc3RhdHVzID0gYWRwNTU4OV9yZWFkKGNsaWVudCwgQURQNTU4OV81X0lOVF9TVEFUVVMpOwogCiAJaWYgKHN0YXR1cyAmIE9WUkZMT1dfSU5UKQkvKiBVbmxpa2VseSBhbmQgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkV2ZW50IE92ZXJmbG93IEVycm9yXG4iKTsKIAogCWlmIChzdGF0dXMgJiBFVkVOVF9JTlQpIHsKLQkJZXZfY250ID0gYWRwNTU4OV9yZWFkKGNsaWVudCwgQURQNTU4OV9TVEFUVVMpICYgS0VDOworCQlldl9jbnQgPSBhZHA1NTg5X3JlYWQoY2xpZW50LCBBRFA1NTg5XzVfU1RBVFVTKSAmIEtFQzsKIAkJaWYgKGV2X2NudCkgewogCQkJYWRwNTU4OV9yZXBvcnRfZXZlbnRzKGtwYWQsIGV2X2NudCk7CiAJCQlpbnB1dF9zeW5jKGtwYWQtPmlucHV0KTsKIAkJfQogCX0KIAotCWFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X0lOVF9TVEFUVVMsIHN0YXR1cyk7CS8qIFN0YXR1cyBpcyBXMUMgKi8KKwlhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV81X0lOVF9TVEFUVVMsIHN0YXR1cyk7IC8qIFN0YXR1cyBpcyBXMUMgKi8KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgYWRwNTU4OV9nZXRfZXZjb2RlKHN0cnVjdCBhZHA1NTg5X2twYWQgKmtwYWQsIHVuc2lnbmVkIHNob3J0IGtleSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkcDU1ODlfZ2V0X2V2Y29kZShzdHJ1Y3QgYWRwNTU4OV9rcGFkICprcGFkLAorCQkJCQl1bnNpZ25lZCBzaG9ydCBrZXkpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQURQNTU4OV9LRVlNQVBTSVpFOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGtwYWQtPnZhci0+a2V5bWFwc2l6ZTsgaSsrKQogCQlpZiAoa2V5ID09IGtwYWQtPmtleWNvZGVbaV0pCiAJCQlyZXR1cm4gKGkgKyAxKSB8IEtFWV9FVl9QUkVTU0VEOwogCkBAIC0zNzIsMTkgKzY1OSwyMyBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBrcGFkLT5jbGllbnQ7CiAJY29uc3Qgc3RydWN0IGFkcDU1ODlfa3BhZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9Ci0JICAgIGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IGksIHJldDsKKwkJY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl1OCAoKnJlZykgKHU4KSA9IGtwYWQtPnZhci0+cmVnOwogCXVuc2lnbmVkIGNoYXIgZXZ0X21vZGUxID0gMCwgZXZ0X21vZGUyID0gMCwgZXZ0X21vZGUzID0gMDsKIAl1bnNpZ25lZCBjaGFyIHB1bGxfbWFzayA9IDA7CisJaW50IGksIHJldDsKIAotCXJldCA9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X1BJTl9DT05GSUdfQSwKLQkJCSAgICBwZGF0YS0+a2V5cGFkX2VuX21hc2sgJiAweEZGKTsKLQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfUElOX0NPTkZJR19CLAotCQkJICAgICAocGRhdGEtPmtleXBhZF9lbl9tYXNrID4+IDgpICYgMHhGRik7Ci0JcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X1BJTl9DT05GSUdfQywKLQkJCSAgICAgKHBkYXRhLT5rZXlwYWRfZW5fbWFzayA+PiAxNikgJiAweEZGKTsKKwlyZXQgPSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfUElOX0NPTkZJR19BKSwKKwkJCSAgICBwZGF0YS0+a2V5cGFkX2VuX21hc2sgJiBrcGFkLT52YXItPnJvd19tYXNrKTsKKwlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X1BJTl9DT05GSUdfQiksCisJCQkgICAgIChwZGF0YS0+a2V5cGFkX2VuX21hc2sgPj4ga3BhZC0+dmFyLT5jb2xfc2hpZnQpICYKKwkJCSAgICAga3BhZC0+dmFyLT5jb2xfbWFzayk7CiAKLQlpZiAocGRhdGEtPmVuX2tleWxvY2spIHsKKwlpZiAoIWtwYWQtPmlzX2FkcDU1ODUpCisJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9QSU5fQ09ORklHX0MsCisJCQkJICAgICAocGRhdGEtPmtleXBhZF9lbl9tYXNrID4+IDE2KSAmIDB4RkYpOworCisJaWYgKCFrcGFkLT5pc19hZHA1NTg1ICYmIHBkYXRhLT5lbl9rZXlsb2NrKSB7CiAJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9VTkxPQ0sxLAogCQkJCSAgICAgcGRhdGEtPnVubG9ja19rZXkxKTsKIAkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X1VOTE9DSzIsCkBAIC0zOTUsOTYgKzY4NiwxMzAgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgS0VZUF9NQVhfRVZFTlQ7IGkrKykKLQkJcmV0IHw9IGFkcDU1ODlfcmVhZChjbGllbnQsIEFEUDU1ODlfRklGT18xICsgaSk7CisJCXJldCB8PSBhZHA1NTg5X3JlYWQoY2xpZW50LCBBRFA1NTg5XzVfRklGT18xICsgaSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmdwaW1hcHNpemU7IGkrKykgewogCQl1bnNpZ25lZCBzaG9ydCBwaW4gPSBwZGF0YS0+Z3BpbWFwW2ldLnBpbjsKIAotCQlpZiAocGluIDw9IEFEUDU1ODlfR1BJX1BJTl9ST1dfRU5EKSB7Ci0JCQlldnRfbW9kZTEgfD0gKDEgPDwgKHBpbiAtIEFEUDU1ODlfR1BJX1BJTl9ST1dfQkFTRSkpOworCQlpZiAocGluIDw9IGtwYWQtPnZhci0+Z3BpX3Bpbl9yb3dfZW5kKSB7CisJCQlldnRfbW9kZTEgfD0gKDEgPDwgKHBpbiAtIGtwYWQtPnZhci0+Z3BpX3Bpbl9yb3dfYmFzZSkpOwogCQl9IGVsc2UgewogCQkJZXZ0X21vZGUyIHw9Ci0JCQkgICAgKCgxIDw8IChwaW4gLSBBRFA1NTg5X0dQSV9QSU5fQ09MX0JBU0UpKSAmIDB4RkYpOwotCQkJZXZ0X21vZGUzIHw9Ci0JCQkgICAgKCgxIDw8IChwaW4gLSBBRFA1NTg5X0dQSV9QSU5fQ09MX0JBU0UpKSA+PiA4KTsKKwkJCSAgICAoKDEgPDwgKHBpbiAtIGtwYWQtPnZhci0+Z3BpX3Bpbl9jb2xfYmFzZSkpICYgMHhGRik7CisJCQlpZiAoIWtwYWQtPmlzX2FkcDU1ODUpCisJCQkJZXZ0X21vZGUzIHw9ICgoMSA8PCAocGluIC0KKwkJCQkJa3BhZC0+dmFyLT5ncGlfcGluX2NvbF9iYXNlKSkgPj4gOCk7CiAJCX0KIAl9CiAKIAlpZiAocGRhdGEtPmdwaW1hcHNpemUpIHsKLQkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X0dQSV9FVkVOVF9FTl9BLCBldnRfbW9kZTEpOwotCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfR1BJX0VWRU5UX0VOX0IsIGV2dF9tb2RlMik7Ci0JCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9HUElfRVZFTlRfRU5fQywgZXZ0X21vZGUzKTsKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9HUElfRVZFTlRfRU5fQSksCisJCQkJICAgICBldnRfbW9kZTEpOworCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X0dQSV9FVkVOVF9FTl9CKSwKKwkJCQkgICAgIGV2dF9tb2RlMik7CisJCWlmICgha3BhZC0+aXNfYWRwNTU4NSkKKwkJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwKKwkJCQkJICAgICByZWcoQURQNTU4OV9HUElfRVZFTlRfRU5fQyksCisJCQkJCSAgICAgZXZ0X21vZGUzKTsKIAl9CiAKIAlpZiAocGRhdGEtPnB1bGxfZGlzX21hc2sgJiBwZGF0YS0+cHVsbHVwX2VuXzEwMGsgJgotCSAgICBwZGF0YS0+cHVsbHVwX2VuXzMwMGsgJiBwZGF0YS0+cHVsbGRvd25fZW5fMzAwaykKKwkJcGRhdGEtPnB1bGx1cF9lbl8zMDBrICYgcGRhdGEtPnB1bGxkb3duX2VuXzMwMGspCiAJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkNvbmZsaWN0aW5nIHB1bGwgcmVzaXN0b3IgY29uZmlnXG4iKTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhHUElPOyBpKyspIHsKLQkJdW5zaWduZWQgdmFsID0gMDsKLQotCQlpZiAocGRhdGEtPnB1bGx1cF9lbl8zMDBrICYgKDEgPDwgaSkpCisJZm9yIChpID0gMDsgaSA8PSBrcGFkLT52YXItPm1heF9yb3dfbnVtOyBpKyspIHsKKwkJdW5zaWduZWQgdmFsID0gMCwgYml0ID0gKDEgPDwgaSk7CisJCWlmIChwZGF0YS0+cHVsbHVwX2VuXzMwMGsgJiBiaXQpCiAJCQl2YWwgPSAwOwotCQllbHNlIGlmIChwZGF0YS0+cHVsbGRvd25fZW5fMzAwayAmICgxIDw8IGkpKQorCQllbHNlIGlmIChwZGF0YS0+cHVsbGRvd25fZW5fMzAwayAmIGJpdCkKIAkJCXZhbCA9IDE7Ci0JCWVsc2UgaWYgKHBkYXRhLT5wdWxsdXBfZW5fMTAwayAmICgxIDw8IGkpKQorCQllbHNlIGlmIChwZGF0YS0+cHVsbHVwX2VuXzEwMGsgJiBiaXQpCiAJCQl2YWwgPSAyOwotCQllbHNlIGlmIChwZGF0YS0+cHVsbF9kaXNfbWFzayAmICgxIDw8IGkpKQorCQllbHNlIGlmIChwZGF0YS0+cHVsbF9kaXNfbWFzayAmIGJpdCkKIAkJCXZhbCA9IDM7CiAKIAkJcHVsbF9tYXNrIHw9IHZhbCA8PCAoMiAqIChpICYgMHgzKSk7CiAKLQkJaWYgKChpICYgMHgzKSA9PSAweDMgfHwgaSA9PSBNQVhHUElPIC0gMSkgeworCQlpZiAoaSA9PSAzIHx8IGkgPT0ga3BhZC0+dmFyLT5tYXhfcm93X251bSkgeworCQkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4NV9SUFVMTF9DT05GSUdfQSkKKwkJCQkJICAgICArIChpID4+IDIpLCBwdWxsX21hc2spOworCQkJcHVsbF9tYXNrID0gMDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPD0ga3BhZC0+dmFyLT5tYXhfY29sX251bTsgaSsrKSB7CisJCXVuc2lnbmVkIHZhbCA9IDAsIGJpdCA9IDEgPDwgKGkgKyBrcGFkLT52YXItPmNvbF9zaGlmdCk7CisJCWlmIChwZGF0YS0+cHVsbHVwX2VuXzMwMGsgJiBiaXQpCisJCQl2YWwgPSAwOworCQllbHNlIGlmIChwZGF0YS0+cHVsbGRvd25fZW5fMzAwayAmIGJpdCkKKwkJCXZhbCA9IDE7CisJCWVsc2UgaWYgKHBkYXRhLT5wdWxsdXBfZW5fMTAwayAmIGJpdCkKKwkJCXZhbCA9IDI7CisJCWVsc2UgaWYgKHBkYXRhLT5wdWxsX2Rpc19tYXNrICYgYml0KQorCQkJdmFsID0gMzsKKworCQlwdWxsX21hc2sgfD0gdmFsIDw8ICgyICogKGkgJiAweDMpKTsKKworCQlpZiAoaSA9PSAzIHx8IGkgPT0ga3BhZC0+dmFyLT5tYXhfY29sX251bSkgewogCQkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LAotCQkJCQkgICAgIEFEUDU1ODlfUlBVTExfQ09ORklHX0EgKyAoaSA+PiAyKSwKLQkJCQkJICAgICBwdWxsX21hc2spOworCQkJCQkgICAgIHJlZyhBRFA1NTg1X1JQVUxMX0NPTkZJR19DKSArCisJCQkJCSAgICAgKGkgPj4gMiksIHB1bGxfbWFzayk7CiAJCQlwdWxsX21hc2sgPSAwOwogCQl9CiAJfQogCiAJaWYgKHBkYXRhLT5yZXNldDFfa2V5XzEgJiYgcGRhdGEtPnJlc2V0MV9rZXlfMiAmJiBwZGF0YS0+cmVzZXQxX2tleV8zKSB7Ci0JCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9SRVNFVDFfRVZFTlRfQSwKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9SRVNFVDFfRVZFTlRfQSksCiAJCQkJICAgICBhZHA1NTg5X2dldF9ldmNvZGUoa3BhZCwKIAkJCQkJCQlwZGF0YS0+cmVzZXQxX2tleV8xKSk7Ci0JCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9SRVNFVDFfRVZFTlRfQiwKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9SRVNFVDFfRVZFTlRfQiksCiAJCQkJICAgICBhZHA1NTg5X2dldF9ldmNvZGUoa3BhZCwKIAkJCQkJCQlwZGF0YS0+cmVzZXQxX2tleV8yKSk7Ci0JCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9SRVNFVDFfRVZFTlRfQywKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9SRVNFVDFfRVZFTlRfQyksCiAJCQkJICAgICBhZHA1NTg5X2dldF9ldmNvZGUoa3BhZCwKIAkJCQkJCQlwZGF0YS0+cmVzZXQxX2tleV8zKSk7CiAJCWtwYWQtPmV4dGVuZF9jZmcgfD0gUjRfRVhURU5EX0NGRzsKIAl9CiAKIAlpZiAocGRhdGEtPnJlc2V0Ml9rZXlfMSAmJiBwZGF0YS0+cmVzZXQyX2tleV8yKSB7Ci0JCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9SRVNFVDJfRVZFTlRfQSwKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9SRVNFVDJfRVZFTlRfQSksCiAJCQkJICAgICBhZHA1NTg5X2dldF9ldmNvZGUoa3BhZCwKIAkJCQkJCQlwZGF0YS0+cmVzZXQyX2tleV8xKSk7Ci0JCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9SRVNFVDJfRVZFTlRfQiwKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9SRVNFVDJfRVZFTlRfQiksCiAJCQkJICAgICBhZHA1NTg5X2dldF9ldmNvZGUoa3BhZCwKIAkJCQkJCQlwZGF0YS0+cmVzZXQyX2tleV8yKSk7CiAJCWtwYWQtPmV4dGVuZF9jZmcgfD0gQzRfRVhURU5EX0NGRzsKIAl9CiAKIAlpZiAoa3BhZC0+ZXh0ZW5kX2NmZykgewotCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfUkVTRVRfQ0ZHLAorCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X1JFU0VUX0NGRyksCiAJCQkJICAgICBwZGF0YS0+cmVzZXRfY2ZnKTsKLQkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X1BJTl9DT05GSUdfRCwKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9QSU5fQ09ORklHX0QpLAogCQkJCSAgICAga3BhZC0+ZXh0ZW5kX2NmZyk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8PSBBRFBfQkFOSyhNQVhHUElPKTsgaSsrKQotCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfREVCT1VOQ0VfRElTX0EgKyBpLAotCQkJCSAgICAgcGRhdGEtPmRlYm91bmNlX2Rpc19tYXNrID4+IChpICogOCkpOworCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfREVCT1VOQ0VfRElTX0EpLAorCQkJICAgIHBkYXRhLT5kZWJvdW5jZV9kaXNfbWFzayAmIGtwYWQtPnZhci0+cm93X21hc2spOwogCi0JcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X1BPTExfUFRJTUVfQ0ZHLAorCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfREVCT1VOQ0VfRElTX0IpLAorCQkJICAgICAocGRhdGEtPmRlYm91bmNlX2Rpc19tYXNrID4+IGtwYWQtPnZhci0+Y29sX3NoaWZ0KQorCQkJICAgICAmIGtwYWQtPnZhci0+Y29sX21hc2spOworCisJaWYgKCFrcGFkLT5pc19hZHA1NTg1KQorCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X0RFQk9VTkNFX0RJU19DKSwKKwkJCQkgICAgIChwZGF0YS0+ZGVib3VuY2VfZGlzX21hc2sgPj4gMTYpICYgMHhGRik7CisKKwlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X1BPTExfUFRJTUVfQ0ZHKSwKIAkJCSAgICAgcGRhdGEtPnNjYW5fY3ljbGVfdGltZSAmIFBUSU1FX01BU0spOwotCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9JTlRfU1RBVFVTLCBMT0dJQzJfSU5UIHwKLQkJCSAgICAgTE9HSUMxX0lOVCB8IE9WUkZMT1dfSU5UIHwgTE9DS19JTlQgfAorCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV81X0lOVF9TVEFUVVMsCisJCQkgICAgIChrcGFkLT5pc19hZHA1NTg1ID8gMCA6IExPR0lDMl9JTlQpIHwKKwkJCSAgICAgTE9HSUMxX0lOVCB8IE9WUkZMT1dfSU5UIHwKKwkJCSAgICAgKGtwYWQtPmlzX2FkcDU1ODUgPyAwIDogTE9DS19JTlQpIHwKIAkJCSAgICAgR1BJX0lOVCB8IEVWRU5UX0lOVCk7CS8qIFN0YXR1cyBpcyBXMUMgKi8KIAotCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9HRU5FUkFMX0NGRywKKwlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X0dFTkVSQUxfQ0ZHKSwKIAkJCSAgICAgSU5UX0NGRyB8IE9TQ19FTiB8IENPUkVfQ0xLKDMpKTsKLQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfSU5UX0VOLAorCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfSU5UX0VOKSwKIAkJCSAgICAgT1ZSRkxPV19JRU4gfCBHUElfSUVOIHwgRVZFTlRfSUVOKTsKIAogCWlmIChyZXQgPCAwKSB7CkBAIC00OTcsMzAgKzgyMiwzMyBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgYWRwNTU4OV9yZXBvcnRfc3dpdGNoX3N0YXRlKHN0cnVjdCBhZHA1NTg5X2twYWQgKmtwYWQpCiB7Ci0JaW50IGdwaV9zdGF0MSA9IGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsIEFEUDU1ODlfR1BJX1NUQVRVU19BKTsKLQlpbnQgZ3BpX3N0YXQyID0gYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwgQURQNTU4OV9HUElfU1RBVFVTX0IpOwotCWludCBncGlfc3RhdDMgPSBhZHA1NTg5X3JlYWQoa3BhZC0+Y2xpZW50LCBBRFA1NTg5X0dQSV9TVEFUVVNfQyk7CiAJaW50IGdwaV9zdGF0X3RtcCwgcGluX2xvYzsKIAlpbnQgaTsKKwlpbnQgZ3BpX3N0YXQxID0gYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwKKwkJCQkgICAgIGtwYWQtPnZhci0+cmVnKEFEUDU1ODlfR1BJX1NUQVRVU19BKSk7CisJaW50IGdwaV9zdGF0MiA9IGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsCisJCQkJICAgICBrcGFkLT52YXItPnJlZyhBRFA1NTg5X0dQSV9TVEFUVVNfQikpOworCWludCBncGlfc3RhdDMgPSAha3BhZC0+aXNfYWRwNTU4NSA/CisJCQlhZHA1NTg5X3JlYWQoa3BhZC0+Y2xpZW50LCBBRFA1NTg5X0dQSV9TVEFUVVNfQykgOiAwOwogCiAJZm9yIChpID0gMDsgaSA8IGtwYWQtPmdwaW1hcHNpemU7IGkrKykgewogCQl1bnNpZ25lZCBzaG9ydCBwaW4gPSBrcGFkLT5ncGltYXBbaV0ucGluOwogCi0JCWlmIChwaW4gPD0gQURQNTU4OV9HUElfUElOX1JPV19FTkQpIHsKKwkJaWYgKHBpbiA8PSBrcGFkLT52YXItPmdwaV9waW5fcm93X2VuZCkgewogCQkJZ3BpX3N0YXRfdG1wID0gZ3BpX3N0YXQxOwotCQkJcGluX2xvYyA9IHBpbiAtIEFEUDU1ODlfR1BJX1BJTl9ST1dfQkFTRTsKLQkJfSBlbHNlIGlmICgocGluIC0gQURQNTU4OV9HUElfUElOX0NPTF9CQVNFKSA8IDgpIHsKKwkJCXBpbl9sb2MgPSBwaW4gLSBrcGFkLT52YXItPmdwaV9waW5fcm93X2Jhc2U7CisJCX0gZWxzZSBpZiAoKHBpbiAtIGtwYWQtPnZhci0+Z3BpX3Bpbl9jb2xfYmFzZSkgPCA4KSB7CiAJCQlncGlfc3RhdF90bXAgPSBncGlfc3RhdDI7Ci0JCQlwaW5fbG9jID0gcGluIC0gQURQNTU4OV9HUElfUElOX0NPTF9CQVNFOworCQkJcGluX2xvYyA9IHBpbiAtIGtwYWQtPnZhci0+Z3BpX3Bpbl9jb2xfYmFzZTsKIAkJfSBlbHNlIHsKIAkJCWdwaV9zdGF0X3RtcCA9IGdwaV9zdGF0MzsKLQkJCXBpbl9sb2MgPSBwaW4gLSBBRFA1NTg5X0dQSV9QSU5fQ09MX0JBU0UgLSA4OworCQkJcGluX2xvYyA9IHBpbiAtIGtwYWQtPnZhci0+Z3BpX3Bpbl9jb2xfYmFzZSAtIDg7CiAJCX0KIAogCQlpZiAoZ3BpX3N0YXRfdG1wIDwgMCkgewogCQkJZGV2X2Vycigma3BhZC0+Y2xpZW50LT5kZXYsCi0JCQkJIkNhbid0IHJlYWQgR1BJT19EQVRfU1RBVCBzd2l0Y2giCi0JCQkJIiAlZCBkZWZhdWx0IHRvIE9GRlxuIiwgcGluKTsKKwkJCQkiQ2FuJ3QgcmVhZCBHUElPX0RBVF9TVEFUIHN3aXRjaCAlZCwgZGVmYXVsdCB0byBPRkZcbiIsCisJCQkJcGluKTsKIAkJCWdwaV9zdGF0X3RtcCA9IDA7CiAJCX0KIApAQCAtNTM2LDcgKzg2NCw4IEBACiAJCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBhZHA1NTg5X2twYWQgKmtwYWQ7Ci0JY29uc3Qgc3RydWN0IGFkcDU1ODlfa3BhZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwljb25zdCBzdHJ1Y3QgYWRwNTU4OV9rcGFkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkJY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKIAl1bnNpZ25lZCBpbnQgcmV2aWQ7CiAJaW50IHJldCwgaTsKQEAgLTU0OCw1NiArODc3LDc5IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpZiAoIXBkYXRhKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YT9cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoISgocGRhdGEtPmtleXBhZF9lbl9tYXNrICYgMHhGRikgJiYKLQkJCShwZGF0YS0+a2V5cGFkX2VuX21hc2sgPj4gOCkpIHx8ICFwZGF0YS0+a2V5bWFwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibm8gcm93cywgY29scyBvciBrZXltYXAgZnJvbSBwZGF0YVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCWtwYWQgPSBremFsbG9jKHNpemVvZigqa3BhZCksIEdGUF9LRVJORUwpOworCWlmICgha3BhZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzd2l0Y2ggKGlkLT5kcml2ZXJfZGF0YSkgeworCWNhc2UgQURQNTU4NV8wMjoKKwkJa3BhZC0+YWRwNTU4NV9zdXBwb3J0X3JvdzUgPSB0cnVlOworCWNhc2UgQURQNTU4NV8wMToKKwkJa3BhZC0+aXNfYWRwNTU4NSA9IHRydWU7CisJCWtwYWQtPnZhciA9ICZjb25zdF9hZHA1NTg1OworCQlicmVhazsKKwljYXNlIEFEUDU1ODk6CisJCWtwYWQtPnZhciA9ICZjb25zdF9hZHA1NTg5OworCQlicmVhazsKIAl9CiAKLQlpZiAocGRhdGEtPmtleW1hcHNpemUgIT0gQURQNTU4OV9LRVlNQVBTSVpFKSB7CisJaWYgKCEoKHBkYXRhLT5rZXlwYWRfZW5fbWFzayAmIGtwYWQtPnZhci0+cm93X21hc2spICYmCisJCQkocGRhdGEtPmtleXBhZF9lbl9tYXNrID4+IGtwYWQtPnZhci0+Y29sX3NoaWZ0KSkgfHwKKwkJCSFwZGF0YS0+a2V5bWFwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibm8gcm93cywgY29scyBvciBrZXltYXAgZnJvbSBwZGF0YVxuIik7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJaWYgKHBkYXRhLT5rZXltYXBzaXplICE9IGtwYWQtPnZhci0+a2V5bWFwc2l6ZSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQga2V5bWFwc2l6ZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOwogCX0KIAogCWlmICghcGRhdGEtPmdwaW1hcCAmJiBwZGF0YS0+Z3BpbWFwc2l6ZSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQgZ3BpbWFwIGZyb20gcGRhdGFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9CiAKLQlpZiAocGRhdGEtPmdwaW1hcHNpemUgPiBBRFA1NTg5X0dQSU1BUFNJWkVfTUFYKSB7CisJaWYgKHBkYXRhLT5ncGltYXBzaXplID4ga3BhZC0+dmFyLT5ncGltYXBzaXplX21heCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQgZ3BpbWFwc2l6ZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+Z3BpbWFwc2l6ZTsgaSsrKSB7CiAJCXVuc2lnbmVkIHNob3J0IHBpbiA9IHBkYXRhLT5ncGltYXBbaV0ucGluOwogCi0JCWlmIChwaW4gPCBBRFA1NTg5X0dQSV9QSU5fQkFTRSB8fCBwaW4gPiBBRFA1NTg5X0dQSV9QSU5fRU5EKSB7CisJCWlmIChwaW4gPCBrcGFkLT52YXItPmdwaV9waW5fYmFzZSB8fAorCQkJCXBpbiA+IGtwYWQtPnZhci0+Z3BpX3Bpbl9lbmQpIHsKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaW52YWxpZCBncGkgcGluIGRhdGFcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9mcmVlX21lbTsKIAkJfQogCi0JCWlmICgoMSA8PCAocGluIC0gQURQNTU4OV9HUElfUElOX1JPV19CQVNFKSkgJgorCQlpZiAoKDEgPDwgKHBpbiAtIGtwYWQtPnZhci0+Z3BpX3Bpbl9yb3dfYmFzZSkpICYKIAkJCQlwZGF0YS0+a2V5cGFkX2VuX21hc2spIHsKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaW52YWxpZCBncGkgcm93L2NvbCBkYXRhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBlcnJfZnJlZV9tZW07CiAJCX0KIAl9CiAKIAlpZiAoIWNsaWVudC0+aXJxKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibm8gSVJRP1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOwogCX0KIAotCWtwYWQgPSBremFsbG9jKHNpemVvZigqa3BhZCksIEdGUF9LRVJORUwpOwogCWlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFrcGFkIHx8ICFpbnB1dCkgeworCWlmICghaW5wdXQpIHsKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9CkBAIC02MDUsMTMgKzk1NywxMyBAQAogCWtwYWQtPmNsaWVudCA9IGNsaWVudDsKIAlrcGFkLT5pbnB1dCA9IGlucHV0OwogCi0JcmV0ID0gYWRwNTU4OV9yZWFkKGNsaWVudCwgQURQNTU4OV9JRCk7CisJcmV0ID0gYWRwNTU4OV9yZWFkKGNsaWVudCwgQURQNTU4OV81X0lEKTsKIAlpZiAocmV0IDwgMCkgewogCQllcnJvciA9IHJldDsKLQkJZ290byBlcnJfZnJlZV9tZW07CisJCWdvdG8gZXJyX2ZyZWVfaW5wdXQ7CiAJfQogCi0JcmV2aWQgPSAodTgpIHJldCAmIEFEUDU1ODlfREVWSUNFX0lEX01BU0s7CisJcmV2aWQgPSAodTgpIHJldCAmIEFEUDU1ODlfNV9ERVZJQ0VfSURfTUFTSzsKIAogCWlucHV0LT5uYW1lID0gY2xpZW50LT5uYW1lOwogCWlucHV0LT5waHlzID0gImFkcDU1ODkta2V5cy9pbnB1dDAiOwpAQCAtNjUyLDcgKzEwMDQsNyBAQAogCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKLQkJZ290byBlcnJfZnJlZV9tZW07CisJCWdvdG8gZXJyX2ZyZWVfaW5wdXQ7CiAJfQogCiAJZXJyb3IgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwgTlVMTCwgYWRwNTU4OV9pcnEsCkBAIC02ODUsOCArMTAzNyw5IEBACiBlcnJfdW5yZWdfZGV2OgogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKIAlpbnB1dCA9IE5VTEw7Ci1lcnJfZnJlZV9tZW06CitlcnJfZnJlZV9pbnB1dDoKIAlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7CitlcnJfZnJlZV9tZW06CiAJa2ZyZWUoa3BhZCk7CiAKIAlyZXR1cm4gZXJyb3I7CkBAIC02OTYsNyArMTA0OSw3IEBACiB7CiAJc3RydWN0IGFkcDU1ODlfa3BhZCAqa3BhZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCi0JYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfR0VORVJBTF9DRkcsIDApOworCWFkcDU1ODlfd3JpdGUoY2xpZW50LCBrcGFkLT52YXItPnJlZyhBRFA1NTg5X0dFTkVSQUxfQ0ZHKSwgMCk7CiAJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGtwYWQpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGtwYWQtPmlucHV0KTsKIAlhZHA1NTg5X2dwaW9fcmVtb3ZlKGtwYWQpOwpAQCAtNzM2LDcgKzEwODksOSBAQAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGFkcDU1ODlfZGV2X3BtX29wcywgYWRwNTU4OV9zdXNwZW5kLCBhZHA1NTg5X3Jlc3VtZSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHA1NTg5X2lkW10gPSB7Ci0JeyJhZHA1NTg5LWtleXMiLCAwfSwKKwl7ImFkcDU1ODkta2V5cyIsIEFEUDU1ODl9LAorCXsiYWRwNTU4NS1rZXlzIiwgQURQNTU4NV8wMX0sCisJeyJhZHA1NTg1LTAyLWtleXMiLCBBRFA1NTg1XzAyfSwgLyogQWRkcyBST1c1IHRvIEFEUDU1ODUgKi8KIAl7fQogfTsKIApAQCAtNzY3LDQgKzExMjIsNCBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFA1NTg5IEtleXBhZCBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQURQNTU4OS9BRFA1NTg1IEtleXBhZCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZGF2aW5jaV9rZXlzY2FuLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2RhdmluY2lfa2V5c2Nhbi5jCmluZGV4IGNkODlkMTcxLi45ZDgyYjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2RhdmluY2lfa2V5c2Nhbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZGF2aW5jaV9rZXlzY2FuLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogCX0KIAogCWVycm9yID0gcmVxdWVzdF9pcnEoZGF2aW5jaV9rcy0+aXJxLCBkYXZpbmNpX2tzX2ludGVycnVwdCwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgcGRldi0+bmFtZSwgZGF2aW5jaV9rcyk7CisJCQkgIDAsIHBkZXYtPm5hbWUsIGRhdmluY2lfa3MpOwogCWlmIChlcnJvciA8IDApIHsKIAkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgZGF2aW5jaSBrZXkgc2NhbiBpbnRlcnJ1cHRcbiIpOwogCQlnb3RvIGZhaWw1OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9lcDkzeHhfa2V5cGFkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2VwOTN4eF9rZXlwYWQuYwppbmRleCBhYTE3ZTAyLi40NjYyYzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2VwOTN4eF9rZXlwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2VwOTN4eF9rZXlwYWQuYwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwga2V5cGFkKTsKIAogCWVyciA9IHJlcXVlc3RfaXJxKGtleXBhZC0+aXJxLCBlcDkzeHhfa2V5cGFkX2lycV9oYW5kbGVyLAotCQkJICBJUlFGX0RJU0FCTEVELCBwZGV2LT5uYW1lLCBrZXlwYWQpOworCQkJICAwLCBwZGV2LT5uYW1lLCBrZXlwYWQpOwogCWlmIChlcnIpCiAJCWdvdG8gZmFpbGVkX2ZyZWVfZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYwppbmRleCA2N2RmOTFhLi5lZDFlZDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKQEAgLTQ2MSw4ICs0NjEsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgKnBwOwogCWludCBpOwogCXN0cnVjdCBncGlvX2tleXNfYnV0dG9uICpidXR0b25zOwotCWNvbnN0IHUzMiAqcmVnOwotCWludCBsZW47CisJdTMyIHJlZzsKIAogCW5vZGUgPSBkZXYtPm9mX25vZGU7CiAJaWYgKG5vZGUgPT0gTlVMTCkKQEAgLTQ3MCw3ICs0NjksNyBAQAogCiAJbWVtc2V0KHBkYXRhLCAwLCBzaXplb2YgKnBkYXRhKTsKIAotCXBkYXRhLT5yZXAgPSAhIW9mX2dldF9wcm9wZXJ0eShub2RlLCAiYXV0b3JlcGVhdCIsICZsZW4pOworCXBkYXRhLT5yZXAgPSAhIW9mX2dldF9wcm9wZXJ0eShub2RlLCAiYXV0b3JlcGVhdCIsIE5VTEwpOwogCiAJLyogRmlyc3QgY291bnQgdGhlIHN1Ym5vZGVzICovCiAJcGRhdGEtPm5idXR0b25zID0gMDsKQEAgLTQ5OCwyMiArNDk3LDI1IEBACiAJCWJ1dHRvbnNbaV0uZ3BpbyA9IG9mX2dldF9ncGlvX2ZsYWdzKHBwLCAwLCAmZmxhZ3MpOwogCQlidXR0b25zW2ldLmFjdGl2ZV9sb3cgPSBmbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVzsKIAotCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkocHAsICJsaW51eCxjb2RlIiwgJmxlbik7Ci0JCWlmICghcmVnKSB7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwcCwgImxpbnV4LGNvZGUiLCAmcmVnKSkgewogCQkJZGV2X2VycihkZXYsICJCdXR0b24gd2l0aG91dCBrZXljb2RlOiAweCV4XG4iLCBidXR0b25zW2ldLmdwaW8pOwogCQkJZ290byBvdXRfZmFpbDsKIAkJfQotCQlidXR0b25zW2ldLmNvZGUgPSBiZTMyX3RvX2NwdXAocmVnKTsKKwkJYnV0dG9uc1tpXS5jb2RlID0gcmVnOwogCi0JCWJ1dHRvbnNbaV0uZGVzYyA9IG9mX2dldF9wcm9wZXJ0eShwcCwgImxhYmVsIiwgJmxlbik7CisJCWJ1dHRvbnNbaV0uZGVzYyA9IG9mX2dldF9wcm9wZXJ0eShwcCwgImxhYmVsIiwgTlVMTCk7CiAKLQkJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KHBwLCAibGludXgsaW5wdXQtdHlwZSIsICZsZW4pOwotCQlidXR0b25zW2ldLnR5cGUgPSByZWcgPyBiZTMyX3RvX2NwdXAocmVnKSA6IEVWX0tFWTsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBwLCAibGludXgsaW5wdXQtdHlwZSIsICZyZWcpID09IDApCisJCQlidXR0b25zW2ldLnR5cGUgPSByZWc7CisJCWVsc2UKKwkJCWJ1dHRvbnNbaV0udHlwZSA9IEVWX0tFWTsKIAogCQlidXR0b25zW2ldLndha2V1cCA9ICEhb2ZfZ2V0X3Byb3BlcnR5KHBwLCAiZ3Bpby1rZXksd2FrZXVwIiwgTlVMTCk7CiAKLQkJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KHBwLCAiZGVib3VuY2UtaW50ZXJ2YWwiLCAmbGVuKTsKLQkJYnV0dG9uc1tpXS5kZWJvdW5jZV9pbnRlcnZhbCA9IHJlZyA/IGJlMzJfdG9fY3B1cChyZWcpIDogNTsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBwLCAiZGVib3VuY2UtaW50ZXJ2YWwiLCAmcmVnKSA9PSAwKQorCQkJYnV0dG9uc1tpXS5kZWJvdW5jZV9pbnRlcnZhbCA9IHJlZzsKKwkJZWxzZQorCQkJYnV0dG9uc1tpXS5kZWJvdW5jZV9pbnRlcnZhbCA9IDU7CiAKIAkJaSsrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaW14X2tleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9pbXhfa2V5cGFkLmMKaW5kZXggZDkyYzE1Yy4uY2NlYmQyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9pbXhfa2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9pbXhfa2V5cGFkLmMKQEAgLTUxMCw3ICs1MTAsNyBAQAogCS8qIEVuc3VyZSB0aGF0IHRoZSBrZXlwYWQgd2lsbCBzdGF5IGRvcm1hbnQgdW50aWwgb3BlbmVkICovCiAJaW14X2tleXBhZF9pbmhpYml0KGtleXBhZCk7CiAKLQllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgaW14X2tleXBhZF9pcnFfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgaW14X2tleXBhZF9pcnFfaGFuZGxlciwgMCwKIAkJCSAgICBwZGV2LT5uYW1lLCBrZXlwYWQpOwogCWlmIChlcnJvcikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJUlFcbiIpOwpAQCAtNTY3LDEwICs1NjcsNTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBpbXhfa2JkX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgaW14X2tleXBhZCAqa2JkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0ga2JkLT5pbnB1dF9kZXY7CisKKwkvKiBpbXgga2JkIGNhbiB3YWtlIHVwIHN5c3RlbSBldmVuIGNsb2NrIGlzIGRpc2FibGVkICovCisJbXV0ZXhfbG9jaygmaW5wdXRfZGV2LT5tdXRleCk7CisKKwlpZiAoaW5wdXRfZGV2LT51c2VycykKKwkJY2xrX2Rpc2FibGUoa2JkLT5jbGspOworCisJbXV0ZXhfdW5sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKGtiZC0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlteF9rYmRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGlteF9rZXlwYWQgKmtiZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGtiZC0+aW5wdXRfZGV2OworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKGtiZC0+aXJxKTsKKworCW11dGV4X2xvY2soJmlucHV0X2Rldi0+bXV0ZXgpOworCisJaWYgKGlucHV0X2Rldi0+dXNlcnMpCisJCWNsa19lbmFibGUoa2JkLT5jbGspOworCisJbXV0ZXhfdW5sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhpbXhfa2JkX3BtX29wcywgaW14X2tiZF9zdXNwZW5kLCBpbXhfa2JkX3Jlc3VtZSk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlteF9rZXlwYWRfZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJpbXgta2V5cGFkIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wbQk9ICZpbXhfa2JkX3BtX29wcywKIAl9LAogCS5wcm9iZQkJPSBpbXhfa2V5cGFkX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaW14X2tleXBhZF9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9qb3JuYWRhNzIwX2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9qb3JuYWRhNzIwX2tiZC5jCmluZGV4IDJjZDNlMWQuLjBhYTY3NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvam9ybmFkYTcyMF9rYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2pvcm5hZGE3MjBfa2JkLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAJZXJyID0gcmVxdWVzdF9pcnEoSVJRX0dQSU8wLAogCQkJICBqb3JuYWRhNzIwX2tiZF9pbnRlcnJ1cHQsCi0JCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCSAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCiAJCQkgICJqb3JuYWRha2JkIiwgcGRldik7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9JTkZPICJqb3JuYWRha2JkNzIwX2tiZDogVW5hYmxlIHRvIGdyYWIgSVJRXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG04MzIzLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xtODMyMy5jCmluZGV4IDc1NjM0OGEuLjgyZDFkYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG04MzIzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sbTgzMjMuYwpAQCAtNzg4LDcgKzc4OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIC8qCiAgKiBXZSBkb24ndCBuZWVkIHRvIGV4cGxpY2l0bHkgc3VzcGVuZCB0aGUgY2hpcCwgYXMgaXQgYWxyZWFkeSBzd2l0Y2hlcyBvZmYKICAqIHdoZW4gdGhlcmUncyBubyBhY3Rpdml0eS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXRyaXhfa2V5cGFkLmMKaW5kZXggYjAyZTQyNi4uZTJhZTY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXRyaXhfa2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXRyaXhfa2V5cGFkLmMKQEAgLTM0Myw3ICszNDMsNiBAQAogCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9yb3dfZ3Bpb3M7IGkrKykgewogCQkJZXJyID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEocGRhdGEtPnJvd19ncGlvc1tpXSksCiAJCQkJCW1hdHJpeF9rZXlwYWRfaW50ZXJydXB0LAotCQkJCQlJUlFGX0RJU0FCTEVEIHwKIAkJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8CiAJCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAogCQkJCQkibWF0cml4LWtleXBhZCIsIGtleXBhZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL25vbWFkaWstc2tlLWtleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ub21hZGlrLXNrZS1rZXlwYWQuYwppbmRleCA2ZTBmMjMwLi5mY2RlYzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL25vbWFkaWstc2tlLWtleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbm9tYWRpay1za2Uta2V5cGFkLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHBsYXQvc2tlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYwppbmRleCAzM2QwYmRjLi4zMjNiY2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQva2V5cGFkLmg+CiAjaW5jbHVkZSA8cGxhdC9tZW5lbGF1cy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhMjd4X2tleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5cGFkLmMKaW5kZXggNGIwZWMzNS4uZWNhNmFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5cGFkLmMKQEAgLTUzNSw3ICs1MzUsNyBAQAogCQlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVF9NQVNLKEVWX1JFTCk7CiAJfQogCi0JZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIHB4YTI3eF9rZXlwYWRfaXJxX2hhbmRsZXIsIElSUUZfRElTQUJMRUQsCisJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIHB4YTI3eF9rZXlwYWRfaXJxX2hhbmRsZXIsIDAsCiAJCQkgICAgcGRldi0+bmFtZSwga2V5cGFkKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJRXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhOTMwX3JvdGFyeS5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGE5MzBfcm90YXJ5LmMKaW5kZXggYjcxMjNhNC4uMzU0NTFiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGE5MzBfcm90YXJ5LmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGE5MzBfcm90YXJ5LmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCXItPmlucHV0X2RldiA9IGlucHV0X2RldjsKIAlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIHIpOwogCi0JZXJyID0gcmVxdWVzdF9pcnEoaXJxLCByb3RhcnlfaXJxLCBJUlFGX0RJU0FCTEVELAorCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgcm90YXJ5X2lycSwgMCwKIAkJCSJlbmhhbmNlZCByb3RhcnkiLCByKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IElSUVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RjMzU4OXgta2V5cGFkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RjMzU4OXgta2V5cGFkLmMKaW5kZXggOTkxMjJmNS4uZjYwYzllOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90YzM1ODl4LWtleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGMzNTg5eC1rZXlwYWQuYwpAQCAtOTAsNyArOTAsNyBAQAogCWJvb2wga2V5cGFkX3N0b3BwZWQ7CiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB0YzM1ODl4X2tleXBhZF9pbml0X2tleV9oYXJkd2FyZShzdHJ1Y3QgdGNfa2V5cGFkICprZXlwYWQpCitzdGF0aWMgaW50IHRjMzU4OXhfa2V5cGFkX2luaXRfa2V5X2hhcmR3YXJlKHN0cnVjdCB0Y19rZXlwYWQgKmtleXBhZCkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCB0YzM1ODl4ICp0YzM1ODl4ID0ga2V5cGFkLT50YzM1ODl4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90ZWdyYS1rYmMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMKaW5kZXggYTVhNzc5MTUuLmNmMzIyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90ZWdyYS1rYmMuYwpAQCAtNTUsNiArNTUsNyBAQAogCiAjZGVmaW5lIEtCQ19ST1dfQ0ZHMF8wCTB4OAogI2RlZmluZSBLQkNfQ09MX0NGRzBfMAkweDE4CisjZGVmaW5lIEtCQ19UT19DTlRfMAkweDI0CiAjZGVmaW5lIEtCQ19JTklUX0RMWV8wCTB4MjgKICNkZWZpbmUgS0JDX1JQVF9ETFlfMAkweDJjCiAjZGVmaW5lIEtCQ19LUF9FTlQwXzAJMHgzMApAQCAtNzAsNiArNzEsNyBAQAogCXNwaW5sb2NrX3QgbG9jazsKIAl1bnNpZ25lZCBpbnQgcmVwb2xsX2RseTsKIAl1bnNpZ25lZCBsb25nIGNwX2RseV9qaWZmaWVzOworCXVuc2lnbmVkIGludCBjcF90b193a3VwX2RseTsKIAlib29sIHVzZV9mbl9tYXA7CiAJYm9vbCB1c2VfZ2hvc3RfZmlsdGVyOwogCWNvbnN0IHN0cnVjdCB0ZWdyYV9rYmNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CkBAIC0yNTgsMTIgKzI2MCwxMCBAQAogCXUzMiB2YWwgPSAwOwogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGludCBudW1fZG93biA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIGZuX2tleXByZXNzID0gZmFsc2U7CiAJYm9vbCBrZXlfaW5fc2FtZV9yb3cgPSBmYWxzZTsKIAlib29sIGtleV9pbl9zYW1lX2NvbCA9IGZhbHNlOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmtiYy0+bG9jaywgZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBLQkNfTUFYX0tQRU5UOyBpKyspIHsKIAkJaWYgKChpICUgNCkgPT0gMCkKIAkJCXZhbCA9IHJlYWRsKGtiYy0+bW1pbyArIEtCQ19LUF9FTlQwXzAgKyBpKTsKQEAgLTI5Miw3ICsyOTIsNyBAQAogCSAqIGFueSAyIG9mIHRoZSAzIGtleXMgc2hhcmUgYSByb3csIGFuZCBhbnkgMiBvZiB0aGVtIHNoYXJlIGEgY29sdW1uLgogCSAqIElmIHNvIGlnbm9yZSB0aGUga2V5IHByZXNzZXMgZm9yIHRoaXMgaXRlcmF0aW9uLgogCSAqLwotCWlmICgoa2JjLT51c2VfZ2hvc3RfZmlsdGVyKSAmJiAobnVtX2Rvd24gPj0gMykpIHsKKwlpZiAoa2JjLT51c2VfZ2hvc3RfZmlsdGVyICYmIG51bV9kb3duID49IDMpIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9kb3duOyBpKyspIHsKIAkJCXVuc2lnbmVkIGludCBqOwogCQkJdTggY3Vycl9jb2wgPSBzY2FuY29kZXNbaV0gJiAweDA3OwpAQCAtMzI1LDggKzMyNSw2IEBACiAJCX0KIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrYmMtPmxvY2ssIGZsYWdzKTsKLQogCS8qIElnbm9yZSB0aGUga2V5IHByZXNzZXMgZm9yIHRoaXMgaXRlcmF0aW9uPyAqLwogCWlmIChrZXlfaW5fc2FtZV9jb2wgJiYga2V5X2luX3NhbWVfcm93KQogCQlyZXR1cm47CkBAIC0zNDEsNiArMzM5LDE4IEBACiAJa2JjLT5udW1fcHJlc3NlZF9rZXlzID0gbnVtX2Rvd247CiB9CiAKK3N0YXRpYyB2b2lkIHRlZ3JhX2tiY19zZXRfZmlmb19pbnRlcnJ1cHQoc3RydWN0IHRlZ3JhX2tiYyAqa2JjLCBib29sIGVuYWJsZSkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwoa2JjLT5tbWlvICsgS0JDX0NPTlRST0xfMCk7CisJaWYgKGVuYWJsZSkKKwkJdmFsIHw9IEtCQ19DT05UUk9MX0ZJRk9fQ05UX0lOVF9FTjsKKwllbHNlCisJCXZhbCAmPSB+S0JDX0NPTlRST0xfRklGT19DTlRfSU5UX0VOOworCXdyaXRlbCh2YWwsIGtiYy0+bW1pbyArIEtCQ19DT05UUk9MXzApOworfQorCiBzdGF0aWMgdm9pZCB0ZWdyYV9rYmNfa2V5cHJlc3NfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCB0ZWdyYV9rYmMgKmtiYyA9IChzdHJ1Y3QgdGVncmFfa2JjICopZGF0YTsKQEAgLTM0OCw2ICszNTgsOCBAQAogCXUzMiB2YWw7CiAJdW5zaWduZWQgaW50IGk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2JjLT5sb2NrLCBmbGFncyk7CisKIAl2YWwgPSAocmVhZGwoa2JjLT5tbWlvICsgS0JDX0lOVF8wKSA+PiA0KSAmIDB4ZjsKIAlpZiAodmFsKSB7CiAJCXVuc2lnbmVkIGxvbmcgZGx5OwpAQCAtMzY5LDI2ICszODEsMTkgQEAKIAkJa2JjLT5udW1fcHJlc3NlZF9rZXlzID0gMDsKIAogCQkvKiBBbGwga2V5cyBhcmUgcmVsZWFzZWQgc28gZW5hYmxlIHRoZSBrZXlwcmVzcyBpbnRlcnJ1cHQgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmtiYy0+bG9jaywgZmxhZ3MpOwotCQl2YWwgPSByZWFkbChrYmMtPm1taW8gKyBLQkNfQ09OVFJPTF8wKTsKLQkJdmFsIHw9IEtCQ19DT05UUk9MX0ZJRk9fQ05UX0lOVF9FTjsKLQkJd3JpdGVsKHZhbCwga2JjLT5tbWlvICsgS0JDX0NPTlRST0xfMCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtiYy0+bG9jaywgZmxhZ3MpOworCQl0ZWdyYV9rYmNfc2V0X2ZpZm9faW50ZXJydXB0KGtiYywgdHJ1ZSk7CiAJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2JjLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB0ZWdyYV9rYmNfaXNyKGludCBpcnEsIHZvaWQgKmFyZ3MpCiB7CiAJc3RydWN0IHRlZ3JhX2tiYyAqa2JjID0gYXJnczsKLQl1MzIgdmFsLCBjdGw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOwogCi0JLyoKLQkgKiBVbnRpbCBhbGwga2V5cyBhcmUgcmVsZWFzZWQsIGRlZmVyIGZ1cnRoZXIgcHJvY2Vzc2luZyB0bwotCSAqIHRoZSBwb2xsaW5nIGxvb3AgaW4gdGVncmFfa2JjX2tleXByZXNzX3RpbWVyCi0JICovCi0JY3RsID0gcmVhZGwoa2JjLT5tbWlvICsgS0JDX0NPTlRST0xfMCk7Ci0JY3RsICY9IH5LQkNfQ09OVFJPTF9GSUZPX0NOVF9JTlRfRU47Ci0Jd3JpdGVsKGN0bCwga2JjLT5tbWlvICsgS0JDX0NPTlRST0xfMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmtiYy0+bG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKiBRdWlja2x5IGJhaWwgb3V0ICYgcmVlbmFibGUgaW50ZXJydXB0cyBpZiB0aGUgZmlmbyB0aHJlc2hvbGQKQEAgLTM5OSwxNSArNDA0LDE1IEBACiAKIAlpZiAodmFsICYgS0JDX0lOVF9GSUZPX0NOVF9JTlRfU1RBVFVTKSB7CiAJCS8qCi0JCSAqIFNjaGVkdWxlIHRpbWVyIHRvIHJ1biB3aGVuIGhhcmR3YXJlIGlzIGluIGNvbnRpbnVvdXMKLQkJICogcG9sbGluZyBtb2RlLgorCQkgKiBVbnRpbCBhbGwga2V5cyBhcmUgcmVsZWFzZWQsIGRlZmVyIGZ1cnRoZXIgcHJvY2Vzc2luZyB0bworCQkgKiB0aGUgcG9sbGluZyBsb29wIGluIHRlZ3JhX2tiY19rZXlwcmVzc190aW1lci4KIAkJICovCisJCXRlZ3JhX2tiY19zZXRfZmlmb19pbnRlcnJ1cHQoa2JjLCBmYWxzZSk7CiAJCW1vZF90aW1lcigma2JjLT50aW1lciwgamlmZmllcyArIGtiYy0+Y3BfZGx5X2ppZmZpZXMpOwotCX0gZWxzZSB7Ci0JCWN0bCB8PSBLQkNfQ09OVFJPTF9GSUZPX0NOVF9JTlRfRU47Ci0JCXdyaXRlbChjdGwsIGtiYy0+bW1pbyArIEtCQ19DT05UUk9MXzApOwogCX0KIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtiYy0+bG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC00NTUsNyArNDYwLDYgQEAKIHN0YXRpYyBpbnQgdGVncmFfa2JjX3N0YXJ0KHN0cnVjdCB0ZWdyYV9rYmMgKmtiYykKIHsKIAljb25zdCBzdHJ1Y3QgdGVncmFfa2JjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0ga2JjLT5wZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBkZWJvdW5jZV9jbnQ7CiAJdTMyIHZhbCA9IDA7CiAKQEAgLTQ5Myw3ICs0OTcsNiBAQAogCSAqIEF0b21pY2FsbHkgY2xlYXIgb3V0IGFueSByZW1haW5pbmcgZW50cmllcyBpbiB0aGUga2V5IEZJRk8KIAkgKiBhbmQgZW5hYmxlIGtleWJvYXJkIGludGVycnVwdHMuCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmtiYy0+bG9jaywgZmxhZ3MpOwogCXdoaWxlICgxKSB7CiAJCXZhbCA9IHJlYWRsKGtiYy0+bW1pbyArIEtCQ19JTlRfMCk7CiAJCXZhbCA+Pj0gNDsKQEAgLTUwNCw3ICs1MDcsNiBAQAogCQl2YWwgPSByZWFkbChrYmMtPm1taW8gKyBLQkNfS1BfRU5UMV8wKTsKIAl9CiAJd3JpdGVsKDB4Nywga2JjLT5tbWlvICsgS0JDX0lOVF8wKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrYmMtPmxvY2ssIGZsYWdzKTsKIAogCWVuYWJsZV9pcnEoa2JjLT5pcnEpOwogCkBAIC03MzQsMTggKzczNiwzMCBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgdGVncmFfa2JjICprYmMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCW11dGV4X2xvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkgewotCQl0ZWdyYV9rYmNfc2V0dXBfd2FrZWtleXMoa2JjLCB0cnVlKTsKLQkJZW5hYmxlX2lycV93YWtlKGtiYy0+aXJxKTsKKwkJZGlzYWJsZV9pcnEoa2JjLT5pcnEpOworCQlkZWxfdGltZXJfc3luYygma2JjLT50aW1lcik7CisJCXRlZ3JhX2tiY19zZXRfZmlmb19pbnRlcnJ1cHQoa2JjLCBmYWxzZSk7CisKIAkJLyogRm9yY2VmdWxseSBjbGVhciB0aGUgaW50ZXJydXB0IHN0YXR1cyAqLwogCQl3cml0ZWwoMHg3LCBrYmMtPm1taW8gKyBLQkNfSU5UXzApOworCQkvKgorCQkgKiBTdG9yZSB0aGUgcHJldmlvdXMgcmVzaWRlbnQgdGltZSBvZiBjb250aW51b3VzIHBvbGxpbmcgbW9kZS4KKwkJICogRm9yY2UgdGhlIGtleWJvYXJkIGludG8gaW50ZXJydXB0IG1vZGUuCisJCSAqLworCQlrYmMtPmNwX3RvX3drdXBfZGx5ID0gcmVhZGwoa2JjLT5tbWlvICsgS0JDX1RPX0NOVF8wKTsKKwkJd3JpdGVsKDAsIGtiYy0+bW1pbyArIEtCQ19UT19DTlRfMCk7CisKKwkJdGVncmFfa2JjX3NldHVwX3dha2VrZXlzKGtiYywgdHJ1ZSk7CiAJCW1zbGVlcCgzMCk7CisKKwkJZW5hYmxlX2lycV93YWtlKGtiYy0+aXJxKTsKIAl9IGVsc2UgewotCQltdXRleF9sb2NrKCZrYmMtPmlkZXYtPm11dGV4KTsKIAkJaWYgKGtiYy0+aWRldi0+dXNlcnMpCiAJCQl0ZWdyYV9rYmNfc3RvcChrYmMpOwotCQltdXRleF91bmxvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCX0KKwltdXRleF91bmxvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NTYsMTUgKzc3MCwyMiBAQAogCXN0cnVjdCB0ZWdyYV9rYmMgKmtiYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBlcnIgPSAwOwogCisJbXV0ZXhfbG9jaygma2JjLT5pZGV2LT5tdXRleCk7CiAJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKSB7CiAJCWRpc2FibGVfaXJxX3dha2Uoa2JjLT5pcnEpOwogCQl0ZWdyYV9rYmNfc2V0dXBfd2FrZWtleXMoa2JjLCBmYWxzZSk7CisKKwkJLyogUmVzdG9yZSB0aGUgcmVzaWRlbnQgdGltZSBvZiBjb250aW51b3VzIHBvbGxpbmcgbW9kZS4gKi8KKwkJd3JpdGVsKGtiYy0+Y3BfdG9fd2t1cF9kbHksIGtiYy0+bW1pbyArIEtCQ19UT19DTlRfMCk7CisKKwkJdGVncmFfa2JjX3NldF9maWZvX2ludGVycnVwdChrYmMsIHRydWUpOworCisJCWVuYWJsZV9pcnEoa2JjLT5pcnEpOwogCX0gZWxzZSB7Ci0JCW11dGV4X2xvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCQlpZiAoa2JjLT5pZGV2LT51c2VycykKIAkJCWVyciA9IHRlZ3JhX2tiY19zdGFydChrYmMpOwotCQltdXRleF91bmxvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCX0KKwltdXRleF91bmxvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdG5ldHYxMDd4LWtleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90bmV0djEwN3gta2V5cGFkLmMKaW5kZXggMWM1ODY4MS4uNjZlNTVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90bmV0djEwN3gta2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90bmV0djEwN3gta2V5cGFkLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBCSVRTKHgpCQkJKEJJVCh4KSAtIDEpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdzkwcDkxMF9rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdzkwcDkxMF9rZXlwYWQuYwppbmRleCBlZTJiZjZiLi4zMTg1ODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3c5MHA5MTBfa2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC93OTBwOTEwX2tleXBhZC5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJCQkgICBpbnB1dF9kZXYtPmtleWNvZGUsIGlucHV0X2Rldi0+a2V5Yml0KTsKIAogCWVycm9yID0gcmVxdWVzdF9pcnEoa2V5cGFkLT5pcnEsIHc5MHA5MTBfa2V5cGFkX2lycV9oYW5kbGVyLAotCQkJICAgIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIGtleXBhZCk7CisJCQkgICAgMCwgcGRldi0+bmFtZSwga2V5cGFkKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJRXG4iKTsKIAkJZ290byBmYWlsZWRfcHV0X2NsazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKaW5kZXggYzkxMDRiYi4uMjJkODc1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKQEAgLTYyLDYgKzYyLDE3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDcxNHgtc3BpLgogCitjb25maWcgSU5QVVRfQk1BMTUwCisJdHJpc3RhdGUgIkJNQTE1MC9TTUIzODAgYWNjZWxlcmF0aW9uIHNlbnNvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IElOUFVUX1BPTExERVYKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIEJvc2NoIFNlbnNvcnRlYydzIEJNQTE1MCBvciBTTUIzODAKKwkgIGFjY2VsZXJhdGlvbiBzZW5zb3IgaG9va2VkIHRvIGFuIEkyQyBidXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGJtYTE1MC4KKwogY29uZmlnIElOUFVUX1BDU1BLUgogCXRyaXN0YXRlICJQQyBTcGVha2VyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ1NQS1JfUExBVEZPUk0KQEAgLTc0LDYgKzg1LDI5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwY3Nwa3IuCiAKK2NvbmZpZyBJTlBVVF9QTThYWFhfVklCUkFUT1IKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gUE04WFhYIHZpYnJhdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNRkRfUE04WFhYCisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRldmljZSBkcml2ZXIgc3VwcG9ydCBmb3IgdGhlIHZpYnJhdG9yCisJICBvbiBRdWFsY29tbSBQTTh4eHggY2hpcC4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgZmYtbWVtbGVzcyBpbnRlcmZhY2UKKwkgIGZyb20gaW5wdXQgZnJhbWV3b3JrLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcG04eHh4LXZpYnJhdG9yLgorCitjb25maWcgSU5QVVRfUE1JQzhYWFhfUFdSS0VZCisJdHJpc3RhdGUgIlBNSUM4WFhYIHBvd2VyIGtleSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTUZEX1BNOFhYWAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIFBNSUM4WFhYIHBvd2VyIGtleS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcG1pYzh4eHgtcHdya2V5LgorCiBjb25maWcgSU5QVVRfU1BBUkNTUEtSCiAJdHJpc3RhdGUgIlNQQVJDIFNwZWFrZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBTUEFSQzY0CkBAIC0xMDAsNiArMTM0LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBtYXg4OTI1X29ua2V5LgogCitjb25maWcgSU5QVVRfTUMxMzc4M19QV1JCVVRUT04KKwl0cmlzdGF0ZSAiTUMxMzc4MyBPTiBidXR0b25zIgorCWRlcGVuZHMgb24gTUZEX01DMTM3ODMKKwloZWxwCisJICBTdXBwb3J0IHRoZSBPTiBidXR0b25zIG9mIE1DMTM3ODMgUE1JQyBhcyBhbiBpbnB1dCBkZXZpY2UKKwkgIHJlcG9ydGluZyBwb3dlciBidXR0b24gc3RhdHVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYzEzNzgzLXB3cmJ1dHRvbi4KKwogY29uZmlnIElOUFVUX01NQTg0NTAKIAl0cmlzdGF0ZSAiTU1BODQ1MCAtIEZyZWVzY2FsZSdzIDMtQXhpcywgOC8xMi1iaXQgRGlnaXRhbCBBY2NlbGVyb21ldGVyIgogCWRlcGVuZHMgb24gSTJDCkBAIC0xODMsMjIgKzIyNyw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBhdGxhc19idG5zLgogCi1jb25maWcgSU5QVVRfQVRJX1JFTU9URQotCXRyaXN0YXRlICJBVEkgLyBYMTAgVVNCIFJGIHJlbW90ZSBjb250cm9sIgotCWRlcGVuZHMgb24gVVNCX0FSQ0hfSEFTX0hDRAotCXNlbGVjdCBVU0IKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhbiBBVEkgb3IgWDEwICJMb2xhIiBVU0IgcmVtb3RlIGNvbnRyb2wuCi0JICBUaGVzZSBhcmUgUkYgcmVtb3RlcyB3aXRoIFVTQiByZWNlaXZlcnMuCi0JICBUaGUgQVRJIHJlbW90ZSBjb21lcyB3aXRoIG1hbnkgb2YgQVRJJ3MgQWxsLUluLVdvbmRlciB2aWRlbyBjYXJkcy4KLQkgIFRoZSBYMTAgIkxvbGEiIHJlbW90ZSBpcyBhdmFpbGFibGUgYXQ6Ci0JICAgICA8aHR0cDovL3d3dy54MTAuY29tL3Byb2R1Y3RzL2xvbGFfc2cxLmh0bT4KLQkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIG1vdXNlIHBvaW50ZXIsIGxlZnQgYW5kIHJpZ2h0IG1vdXNlIGJ1dHRvbnMsCi0JICBhbmQgbWFwcyBhbGwgdGhlIG90aGVyIHJlbW90ZSBidXR0b25zIHRvIGtleXByZXNzIGV2ZW50cy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgYXRpX3JlbW90ZS4KLQogY29uZmlnIElOUFVUX0FUSV9SRU1PVEUyCiAJdHJpc3RhdGUgIkFUSSAvIFBoaWxpcHMgVVNCIFJGIHJlbW90ZSBjb250cm9sIgogCWRlcGVuZHMgb24gVVNCX0FSQ0hfSEFTX0hDRApAQCAtMzc5LDE3ICs0MDcsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgcHdtLWJlZXBlci4KIAotY29uZmlnIElOUFVUX1BNSUM4WFhYX1BXUktFWQotCXRyaXN0YXRlICJQTUlDOFhYWCBwb3dlciBrZXkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1GRF9QTThYWFgKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBQTUlDOFhYWCBwb3dlciBrZXkuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBtaWM4eHh4LXB3cmtleS4KLQogY29uZmlnIElOUFVUX0dQSU9fUk9UQVJZX0VOQ09ERVIKIAl0cmlzdGF0ZSAiUm90YXJ5IGVuY29kZXJzIGNvbm5lY3RlZCB0byBHUElPIHBpbnMiCiAJZGVwZW5kcyBvbiBHUElPTElCICYmIEdFTkVSSUNfR1BJTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlCmluZGV4IDI5OWFkNWUuLmEyNDRmYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUKQEAgLTEzLDEwICsxMywxMCBAQAogb2JqLSQoQ09ORklHX0lOUFVUX0FEWEwzNFhfSTJDKQkJKz0gYWR4bDM0eC1pMmMubwogb2JqLSQoQ09ORklHX0lOUFVUX0FEWEwzNFhfU1BJKQkJKz0gYWR4bDM0eC1zcGkubwogb2JqLSQoQ09ORklHX0lOUFVUX0FQQU5FTCkJCSs9IGFwYW5lbC5vCi1vYmotJChDT05GSUdfSU5QVVRfQVRJX1JFTU9URSkJCSs9IGF0aV9yZW1vdGUubwogb2JqLSQoQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUyKQkJKz0gYXRpX3JlbW90ZTIubwogb2JqLSQoQ09ORklHX0lOUFVUX0FUTEFTX0JUTlMpCQkrPSBhdGxhc19idG5zLm8KIG9iai0kKENPTkZJR19JTlBVVF9CRklOX1JPVEFSWSkJCSs9IGJmaW5fcm90YXJ5Lm8KK29iai0kKENPTkZJR19JTlBVVF9CTUExNTApCQkrPSBibWExNTAubwogb2JqLSQoQ09ORklHX0lOUFVUX0NNMTA5KQkJKz0gY20xMDkubwogb2JqLSQoQ09ORklHX0lOUFVUX0NNQTMwMDApCQkrPSBjbWEzMDAwX2QweC5vCiBvYmotJChDT05GSUdfSU5QVVRfQ01BMzAwMF9JMkMpCQkrPSBjbWEzMDAwX2QweF9pMmMubwpAQCAtMjgsMTUgKzI4LDE3IEBACiBvYmotJChDT05GSUdfSU5QVVRfS1hUSjkpCQkrPSBreHRqOS5vCiBvYmotJChDT05GSUdfSU5QVVRfTTY4S19CRUVQKQkJKz0gbTY4a3Nwa3Iubwogb2JqLSQoQ09ORklHX0lOUFVUX01BWDg5MjVfT05LRVkpCSs9IG1heDg5MjVfb25rZXkubworb2JqLSQoQ09ORklHX0lOUFVUX01DMTM3ODNfUFdSQlVUVE9OKQkrPSBtYzEzNzgzLXB3cmJ1dHRvbi5vCiBvYmotJChDT05GSUdfSU5QVVRfTU1BODQ1MCkJCSs9IG1tYTg0NTAubwogb2JqLSQoQ09ORklHX0lOUFVUX01QVTMwNTApCQkrPSBtcHUzMDUwLm8KIG9iai0kKENPTkZJR19JTlBVVF9QQ0FQKQkJKz0gcGNhcF9rZXlzLm8KIG9iai0kKENPTkZJR19JTlBVVF9QQ0Y1MDYzM19QTVUpCSs9IHBjZjUwNjMzLWlucHV0Lm8KIG9iai0kKENPTkZJR19JTlBVVF9QQ0Y4NTc0KQkJKz0gcGNmODU3NF9rZXlwYWQubwogb2JqLSQoQ09ORklHX0lOUFVUX1BDU1BLUikJCSs9IHBjc3Brci5vCitvYmotJChDT05GSUdfSU5QVVRfUE04WFhYX1ZJQlJBVE9SKQkrPSBwbTh4eHgtdmlicmF0b3Iubworb2JqLSQoQ09ORklHX0lOUFVUX1BNSUM4WFhYX1BXUktFWSkJKz0gcG1pYzh4eHgtcHdya2V5Lm8KIG9iai0kKENPTkZJR19JTlBVVF9QT1dFUk1BVEUpCQkrPSBwb3dlcm1hdGUubwogb2JqLSQoQ09ORklHX0lOUFVUX1BXTV9CRUVQRVIpCQkrPSBwd20tYmVlcGVyLm8KLW9iai0kKENPTkZJR19JTlBVVF9QTUlDOFhYWF9QV1JLRVkpCSs9IHBtaWM4eHh4LXB3cmtleS5vCiBvYmotJChDT05GSUdfSU5QVVRfUkI1MzJfQlVUVE9OKQkrPSByYjUzMl9idXR0b24ubwogb2JqLSQoQ09ORklHX0lOUFVUX0dQSU9fUk9UQVJZX0VOQ09ERVIpCSs9IHJvdGFyeV9lbmNvZGVyLm8KIG9iai0kKENPTkZJR19JTlBVVF9TR0lfQlROUykJCSs9IHNnaV9idG5zLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hZDcxNHgtaTJjLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvYWQ3MTR4LWkyYy5jCmluZGV4IDAyNTQxN2QuLjU2ODEwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hZDcxNHgtaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2FkNzE0eC1pMmMuYwpAQCAtMTE2LDEzICsxMTYsMTMgQEAKIAkuaWRfdGFibGUgPSBhZDcxNHhfaWQsCiB9OwogCi1zdGF0aWMgX19pbml0IGludCBhZDcxNHhfaTJjX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFkNzE0eF9pMmNfaW5pdCh2b2lkKQogewogCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ3MTR4X2kyY19kcml2ZXIpOwogfQogbW9kdWxlX2luaXQoYWQ3MTR4X2kyY19pbml0KTsKIAotc3RhdGljIF9fZXhpdCB2b2lkIGFkNzE0eF9pMmNfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFkNzE0eF9pMmNfZXhpdCh2b2lkKQogewogCWkyY19kZWxfZHJpdmVyKCZhZDcxNHhfaTJjX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYWQ3MTR4LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvYWQ3MTR4LmMKaW5kZXggY2E0MmM3ZC4uMGFjNzViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2FkNzE0eC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hZDcxNHguYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9hZDcxNHguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJhZDcxNHguaCIKIAogI2RlZmluZSBBRDcxNFhfUFdSX0NUUkwgICAgICAgICAgIDB4MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHguYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hZHhsMzR4LmMKaW5kZXggMTQ0ZGRiZC4uMDkyNDQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHguYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYWR4bDM0eC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L2FkeGwzNHguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImFkeGwzNHguaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2F0aV9yZW1vdGUuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZTU3MTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2F0aV9yZW1vdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDg2NyArMCwwIEBACi0vKgotICogIFVTQiBBVEkgUmVtb3RlIHN1cHBvcnQKLSAqCi0gKiAgVmVyc2lvbiAyLjIuMCBDb3B5cmlnaHQgKGMpIDIwMDQgVG9ycmV5IEhvZmZtYW4gPHRob2ZmbWFuQGFybm9yLm5ldD4KLSAqICBWZXJzaW9uIDIuMS4xIENvcHlyaWdodCAoYykgMjAwMiBWbGFkaW1pciBEZXJnYWNoZXYKLSAqCi0gKiAgVGhpcyAyLjIuMCB2ZXJzaW9uIGlzIGEgcmV3cml0ZSAvIGNsZWFudXAgb2YgdGhlIDIuMS4xIGRyaXZlciwgaW5jbHVkaW5nCi0gKiAgcG9ydGluZyB0byB0aGUgMi42IGtlcm5lbCBpbnRlcmZhY2VzLCBhbG9uZyB3aXRoIG90aGVyIG1vZGlmaWNhdGlvbgotICogIHRvIGJldHRlciBtYXRjaCB0aGUgc3R5bGUgb2YgdGhlIGV4aXN0aW5nIHVzYi9pbnB1dCBkcml2ZXJzLiAgSG93ZXZlciwgdGhlCi0gKiAgcHJvdG9jb2wgYW5kIGhhcmR3YXJlIGhhbmRsaW5nIGlzIGVzc2VudGlhbGx5IHVuY2hhbmdlZCBmcm9tIDIuMS4xLgotICoKLSAqICBUaGUgMi4xLjEgZHJpdmVyIHdhcyBkZXJpdmVkIGZyb20gdGhlIHVzYmF0aV9yZW1vdGUgYW5kIHVzYmtiZCBkcml2ZXJzIGJ5Ci0gKiAgVm9qdGVjaCBQYXZsaWsuCi0gKgotICogIENoYW5nZXM6Ci0gKgotICogIEZlYiAyMDA0OiBUb3JyZXkgSG9mZm1hbiA8dGhvZmZtYW5AYXJub3IubmV0PgotICogICAgICAgICAgICBWZXJzaW9uIDIuMi4wCi0gKiAgSnVuIDIwMDQ6IFRvcnJleSBIb2ZmbWFuIDx0aG9mZm1hbkBhcm5vci5uZXQ+Ci0gKiAgICAgICAgICAgIFZlcnNpb24gMi4yLjEKLSAqICAgICAgICAgICAgQWRkZWQga2V5IHJlcGVhdCBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5OgotICogICAgICAgICAgICAgICAgVmluY2VudCBWYW5hY2tlcmUgPHZhbmFja2VyZUBsaWYudW5pdi1tcnMuZnI+Ci0gKiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSAiTG9sYSIgcmVtb3RlIGNvbnRyaWJ1dGVkIGJ5OgotICogICAgICAgICAgICAgICAgU2V0aCBDb2huIDxzZXRoY29obkB5YWhvby5jb20+Ci0gKgotICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKgotICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgotICoKLSAqIEhhcmR3YXJlICYgc29mdHdhcmUgbm90ZXMKLSAqCi0gKiBUaGVzZSByZW1vdGUgY29udHJvbHMgYXJlIGRpc3RyaWJ1dGVkIGJ5IEFUSSBhcyBwYXJ0IG9mIHRoZWlyCi0gKiAiQWxsLUluLVdvbmRlciIgdmlkZW8gY2FyZCBwYWNrYWdlcy4gIFRoZSByZWNlaXZlciBzZWxmLWlkZW50aWZpZXMgYXMgYQotICogIlVTQiBSZWNlaXZlciIgd2l0aCBtYW51ZmFjdHVyZXIgIlgxMCBXaXJlbGVzcyBUZWNobm9sb2d5IEluYyIuCi0gKgotICogVGhlICJMb2xhIiByZW1vdGUgaXMgYXZhaWxhYmxlIGZyb20gWDEwLiAgU2VlOgotICogICAgaHR0cDovL3d3dy54MTAuY29tL3Byb2R1Y3RzL2xvbGFfc2cxLmh0bQotICogVGhlIExvbGEgaXMgc2ltaWxhciB0byB0aGUgQVRJIHJlbW90ZSBidXQgaGFzIG5vIG1vdXNlIHN1cHBvcnQsIGFuZCBzbGlnaHRseQotICogZGlmZmVyZW50IGtleXMuCi0gKgotICogSXQgaXMgcG9zc2libGUgdG8gdXNlIG11bHRpcGxlIHJlY2VpdmVycyBhbmQgcmVtb3RlcyBvbiBtdWx0aXBsZSBjb21wdXRlcnMKLSAqIHNpbXVsdGFuZW91c2x5IGJ5IGNvbmZpZ3VyaW5nIHRoZW0gdG8gdXNlIHNwZWNpZmljIGNoYW5uZWxzLgotICoKLSAqIFRoZSBSRiBwcm90b2NvbCB1c2VkIGJ5IHRoZSByZW1vdGUgc3VwcG9ydHMgMTYgZGlzdGluY3QgY2hhbm5lbHMsIDEgdG8gMTYuCi0gKiBBY3R1YWxseSwgaXQgbWF5IGV2ZW4gc3VwcG9ydCBtb3JlLCBhdCBsZWFzdCBpbiBzb21lIHJldmlzaW9ucyBvZiB0aGUKLSAqIGhhcmR3YXJlLgotICoKLSAqIEVhY2ggcmVtb3RlIGNhbiBiZSBjb25maWd1cmVkIHRvIHRyYW5zbWl0IG9uIG9uZSBjaGFubmVsIGFzIGZvbGxvd3M6Ci0gKiAgIC0gUHJlc3MgYW5kIGhvbGQgdGhlICJoYW5kIGljb24iIGJ1dHRvbi4KLSAqICAgLSBXaGVuIHRoZSByZWQgTEVEIHN0YXJ0cyB0byBibGluaywgbGV0IGdvIG9mIHRoZSAiaGFuZCBpY29uIiBidXR0b24uCi0gKiAgIC0gV2hlbiBpdCBzdG9wcyBibGlua2luZywgaW5wdXQgdGhlIGNoYW5uZWwgY29kZSBhcyB0d28gZGlnaXRzLCBmcm9tIDAxCi0gKiAgICAgdG8gMTYsIGFuZCBwcmVzcyB0aGUgaGFuZCBpY29uIGFnYWluLgotICoKLSAqIFRoZSB0aW1pbmcgY2FuIGJlIGEgbGl0dGxlIHRyaWNreS4gIFRyeSBsb2FkaW5nIHRoZSBtb2R1bGUgd2l0aCBkZWJ1Zz0xCi0gKiB0byBoYXZlIHRoZSBrZXJuZWwgcHJpbnQgb3V0IG1lc3NhZ2VzIGFib3V0IHRoZSByZW1vdGUgY29udHJvbCBudW1iZXIKLSAqIGFuZCBtYXNrLiAgTm90ZTogZGVidWdnaW5nIHByaW50cyByZW1vdGUgbnVtYmVycyBhcyB6ZXJvLWJhc2VkIGhleGFkZWNpbWFsLgotICoKLSAqIFRoZSBkcml2ZXIgaGFzIGEgImNoYW5uZWxfbWFzayIgcGFyYW1ldGVyLiBUaGlzIGJpdG1hc2sgc3BlY2lmaWVzIHdoaWNoCi0gKiBjaGFubmVscyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1vZHVsZS4gIFRvIG1hc2sgb3V0IGNoYW5uZWxzLCBqdXN0IGFkZAotICogYWxsIHRoZSAyXmNoYW5uZWxfbnVtYmVyIHZhbHVlcyB0b2dldGhlci4KLSAqCi0gKiBGb3IgaW5zdGFuY2UsIHNldCBjaGFubmVsX21hc2sgPSAyXjQgPSAxNiAoYmluYXJ5IDEwMDAwKSB0byBtYWtlIGF0aV9yZW1vdGUKLSAqIGlnbm9yZSBzaWduYWxzIGNvbWluZyBmcm9tIHJlbW90ZSBjb250cm9scyB0cmFuc21pdHRpbmcgb24gY2hhbm5lbCA0LCBidXQKLSAqIGFjY2VwdCBhbGwgb3RoZXIgY2hhbm5lbHMuCi0gKgotICogT3IsIHNldCBjaGFubmVsX21hc2sgPSA2NTUzMywgKDB4RkZGRCksIGFuZCBhbGwgY2hhbm5lbHMgZXhjZXB0IDEgd2lsbCBiZQotICogaWdub3JlZC4KLSAqCi0gKiBUaGUgZGVmYXVsdCBpcyAwIChyZXNwb25kIHRvIGFsbCBjaGFubmVscykuIEJpdCAwIGFuZCBiaXRzIDE3LTMyIG9mIHRoaXMKLSAqIHBhcmFtZXRlciBhcmUgdW51c2VkLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0KLS8qCi0gKiBNb2R1bGUgYW5kIFZlcnNpb24gSW5mb3JtYXRpb24sIE1vZHVsZSBQYXJhbWV0ZXJzCi0gKi8KLQotI2RlZmluZSBBVElfUkVNT1RFX1ZFTkRPUl9JRAkJMHgwYmM3Ci0jZGVmaW5lIExPTEFfUkVNT1RFX1BST0RVQ1RfSUQJCTB4MDAwMgotI2RlZmluZSBMT0xBMl9SRU1PVEVfUFJPRFVDVF9JRAkJMHgwMDAzCi0jZGVmaW5lIEFUSV9SRU1PVEVfUFJPRFVDVF9JRAkJMHgwMDA0Ci0jZGVmaW5lIE5WSURJQV9SRU1PVEVfUFJPRFVDVF9JRAkweDAwMDUKLSNkZWZpbmUgTUVESU9OX1JFTU9URV9QUk9EVUNUX0lECTB4MDAwNgotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSAgICAgICAgIjIuMi4xIgotI2RlZmluZSBEUklWRVJfQVVUSE9SICAgICAgICAgICAiVG9ycmV5IEhvZmZtYW4gPHRob2ZmbWFuQGFybm9yLm5ldD4iCi0jZGVmaW5lIERSSVZFUl9ERVNDICAgICAgICAgICAgICJBVEkvWDEwIFJGIFVTQiBSZW1vdGUgQ29udHJvbCIKLQotI2RlZmluZSBOQU1FX0JVRlNJWkUgICAgICA4MCAgICAvKiBzaXplIG9mIHByb2R1Y3QgbmFtZSwgcGF0aCBidWZmZXJzICovCi0jZGVmaW5lIERBVEFfQlVGU0laRSAgICAgIDYzICAgIC8qIHNpemUgb2YgVVJCIGRhdGEgYnVmZmVycyAqLwotCi0vKgotICogRHVwbGljYXRlIGV2ZW50IGZpbHRlcmluZyB0aW1lLgotICogU2VxdWVudGlhbCwgaWRlbnRpY2FsIEtJTkRfRklMVEVSRUQgaW5wdXRzIHdpdGggbGVzcyB0aGFuCi0gKiBGSUxURVJfVElNRSBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGVtIGFyZSBjb25zaWRlcmVkIGFzIHJlcGVhdAotICogZXZlbnRzLiBUaGUgaGFyZHdhcmUgZ2VuZXJhdGVzIDUgZXZlbnRzIGZvciB0aGUgZmlyc3Qga2V5cHJlc3MKLSAqIGFuZCB3ZSBoYXZlIHRvIHRha2UgdGhpcyBpbnRvIGFjY291bnQgZm9yIGFuIGFjY3VyYXRlIHJlcGVhdAotICogYmVoYXZpb3VyLgotICovCi0jZGVmaW5lIEZJTFRFUl9USU1FCTYwIC8qIG1zZWMgKi8KLSNkZWZpbmUgUkVQRUFUX0RFTEFZCTUwMCAvKiBtc2VjICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoYW5uZWxfbWFzazsKLW1vZHVsZV9wYXJhbShjaGFubmVsX21hc2ssIHVsb25nLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbF9tYXNrLCAiQml0bWFzayBvZiByZW1vdGUgY29udHJvbCBjaGFubmVscyB0byBpZ25vcmUiKTsKLQotc3RhdGljIGludCBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZXh0cmEgZGVidWcgbWVzc2FnZXMgYW5kIGluZm9ybWF0aW9uIik7Ci0KLXN0YXRpYyBpbnQgcmVwZWF0X2ZpbHRlciA9IEZJTFRFUl9USU1FOwotbW9kdWxlX3BhcmFtKHJlcGVhdF9maWx0ZXIsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJlcGVhdF9maWx0ZXIsICJSZXBlYXQgZmlsdGVyIHRpbWUsIGRlZmF1bHQgPSA2MCBtc2VjIik7Ci0KLXN0YXRpYyBpbnQgcmVwZWF0X2RlbGF5ID0gUkVQRUFUX0RFTEFZOwotbW9kdWxlX3BhcmFtKHJlcGVhdF9kZWxheSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocmVwZWF0X2RlbGF5LCAiRGVsYXkgYmVmb3JlIHNlbmRpbmcgcmVwZWF0cywgZGVmYXVsdCA9IDUwMCBtc2VjIik7Ci0KLSNkZWZpbmUgZGJnaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgZGV2X2luZm8oZGV2ICwgZm9ybWF0ICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLSN1bmRlZiBlcnIKLSNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgZm9ybWF0ICwgIyMgYXJnKQotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXRpX3JlbW90ZV90YWJsZVtdID0gewotCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTE9MQV9SRU1PVEVfUFJPRFVDVF9JRCkgfSwKLQl7IFVTQl9ERVZJQ0UoQVRJX1JFTU9URV9WRU5ET1JfSUQsIExPTEEyX1JFTU9URV9QUk9EVUNUX0lEKSB9LAotCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgQVRJX1JFTU9URV9QUk9EVUNUX0lEKSB9LAotCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTlZJRElBX1JFTU9URV9QUk9EVUNUX0lEKSB9LAotCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTUVESU9OX1JFTU9URV9QUk9EVUNUX0lEKSB9LAotCXt9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYXRpX3JlbW90ZV90YWJsZSk7Ci0KLS8qIEdldCBoaSBhbmQgbG93IGJ5dGVzIG9mIGEgMTYtYml0cyBpbnQgKi8KLSNkZWZpbmUgSEkoYSkJKCh1bnNpZ25lZCBjaGFyKSgoYSkgPj4gOCkpCi0jZGVmaW5lIExPKGEpCSgodW5zaWduZWQgY2hhcikoKGEpICYgMHhmZikpCi0KLSNkZWZpbmUgU0VORF9GTEFHX0lOX1BST0dSRVNTCTEKLSNkZWZpbmUgU0VORF9GTEFHX0NPTVBMRVRFCTIKLQotLyogRGV2aWNlIGluaXRpYWxpemF0aW9uIHN0cmluZ3MgKi8KLXN0YXRpYyBjaGFyIGluaXQxW10gPSB7IDB4MDEsIDB4MDAsIDB4MjAsIDB4MTQgfTsKLXN0YXRpYyBjaGFyIGluaXQyW10gPSB7IDB4MDEsIDB4MDAsIDB4MjAsIDB4MTQsIDB4MjAsIDB4MjAsIDB4MjAgfTsKLQotc3RydWN0IGF0aV9yZW1vdGUgewotCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKLQotCXN0cnVjdCB1cmIgKmlycV91cmI7Ci0Jc3RydWN0IHVyYiAqb3V0X3VyYjsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50X2luOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnRfb3V0OwotCXVuc2lnbmVkIGNoYXIgKmluYnVmOwotCXVuc2lnbmVkIGNoYXIgKm91dGJ1ZjsKLQlkbWFfYWRkcl90IGluYnVmX2RtYTsKLQlkbWFfYWRkcl90IG91dGJ1Zl9kbWE7Ci0KLQl1bnNpZ25lZCBjaGFyIG9sZF9kYXRhWzJdOyAgLyogRGV0ZWN0IGR1cGxpY2F0ZSBldmVudHMgKi8KLQl1bnNpZ25lZCBsb25nIG9sZF9qaWZmaWVzOwotCXVuc2lnbmVkIGxvbmcgYWNjX2ppZmZpZXM7ICAvKiBoYW5kbGUgYWNjZWxlcmF0aW9uICovCi0JdW5zaWduZWQgbG9uZyBmaXJzdF9qaWZmaWVzOwotCi0JdW5zaWduZWQgaW50IHJlcGVhdF9jb3VudDsKLQotCWNoYXIgbmFtZVtOQU1FX0JVRlNJWkVdOwotCWNoYXIgcGh5c1tOQU1FX0JVRlNJWkVdOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlpbnQgc2VuZF9mbGFnczsKLX07Ci0KLS8qICJLaW5kcyIgb2YgbWVzc2FnZXMgc2VudCBmcm9tIHRoZSBoYXJkd2FyZSB0byB0aGUgZHJpdmVyLiAqLwotI2RlZmluZSBLSU5EX0VORCAgICAgICAgMAotI2RlZmluZSBLSU5EX0xJVEVSQUwgICAgMSAgIC8qIFNpbXBseSBwYXNzIHRvIGlucHV0IHN5c3RlbSAqLwotI2RlZmluZSBLSU5EX0ZJTFRFUkVEICAgMiAgIC8qIEFkZCBhcnRpZmljaWFsIGtleS11cCBldmVudHMsIGRyb3Aga2V5cmVwZWF0cyAqLwotI2RlZmluZSBLSU5EX0xVICAgICAgICAgMyAgIC8qIERpcmVjdGlvbmFsIGtleXBhZCBkaWFnb25hbHMgLSBsZWZ0IHVwLCAqLwotI2RlZmluZSBLSU5EX1JVICAgICAgICAgNCAgIC8qICAgcmlnaHQgdXAsICAqLwotI2RlZmluZSBLSU5EX0xEICAgICAgICAgNSAgIC8qICAgbGVmdCBkb3duLCAqLwotI2RlZmluZSBLSU5EX1JEICAgICAgICAgNiAgIC8qICAgcmlnaHQgZG93biAqLwotI2RlZmluZSBLSU5EX0FDQ0VMICAgICAgNyAgIC8qIERpcmVjdGlvbmFsIGtleXBhZCAtIGxlZnQsIHJpZ2h0LCB1cCwgZG93bi4qLwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBmcm9tIGhhcmR3YXJlIG1lc3NhZ2VzIHRvIGlucHV0IGV2ZW50cy4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCXNob3J0IGtpbmQ7Ci0JdW5zaWduZWQgY2hhciBkYXRhMSwgZGF0YTI7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgaW50IGNvZGU7Ci0JaW50IHZhbHVlOwotfSAgYXRpX3JlbW90ZV90YmxbXSA9IHsKLQkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBheGVzICovCi0Je0tJTkRfQUNDRUwsICAgMHgzNSwgMHg3MCwgRVZfUkVMLCBSRUxfWCwgLTF9LAkgLyogbGVmdCAqLwotCXtLSU5EX0FDQ0VMLCAgIDB4MzYsIDB4NzEsIEVWX1JFTCwgUkVMX1gsIDF9LCAgICAvKiByaWdodCAqLwotCXtLSU5EX0FDQ0VMLCAgIDB4MzcsIDB4NzIsIEVWX1JFTCwgUkVMX1ksIC0xfSwJIC8qIHVwICovCi0Je0tJTkRfQUNDRUwsICAgMHgzOCwgMHg3MywgRVZfUkVMLCBSRUxfWSwgMX0sICAgIC8qIGRvd24gKi8KLQkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBkaWFnb25hbHMgKi8KLQl7S0lORF9MVSwgICAgICAweDM5LCAweDc0LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogbGVmdCB1cCAqLwotCXtLSU5EX1JVLCAgICAgIDB4M2EsIDB4NzUsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiByaWdodCB1cCAqLwotCXtLSU5EX0xELCAgICAgIDB4M2MsIDB4NzcsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiBsZWZ0IGRvd24gKi8KLQl7S0lORF9SRCwgICAgICAweDNiLCAweDc2LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogcmlnaHQgZG93biAqLwotCi0JLyogIk1vdXNlIGJ1dHRvbiIgYnV0dG9ucyAqLwotCXtLSU5EX0xJVEVSQUwsIDB4M2QsIDB4NzgsIEVWX0tFWSwgQlROX0xFRlQsIDF9LCAvKiBsZWZ0IGJ0biBkb3duICovCi0Je0tJTkRfTElURVJBTCwgMHgzZSwgMHg3OSwgRVZfS0VZLCBCVE5fTEVGVCwgMH0sIC8qIGxlZnQgYnRuIHVwICovCi0Je0tJTkRfTElURVJBTCwgMHg0MSwgMHg3YywgRVZfS0VZLCBCVE5fUklHSFQsIDF9LC8qIHJpZ2h0IGJ0biBkb3duICovCi0Je0tJTkRfTElURVJBTCwgMHg0MiwgMHg3ZCwgRVZfS0VZLCBCVE5fUklHSFQsIDB9LC8qIHJpZ2h0IGJ0biB1cCAqLwotCi0JLyogQXJ0aWZpY2lhbCAiZG91YmxlY2xpY2siIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBoYXJkd2FyZS4KLQkgKiBUaGV5IGFyZSBtYXBwZWQgdG8gdGhlICJzaWRlIiBhbmQgImV4dHJhIiBtb3VzZSBidXR0b25zIGhlcmUuICovCi0Je0tJTkRfRklMVEVSRUQsIDB4M2YsIDB4N2EsIEVWX0tFWSwgQlROX1NJREUsIDF9LCAvKiBsZWZ0IGRibGNsaWNrICovCi0Je0tJTkRfRklMVEVSRUQsIDB4NDMsIDB4N2UsIEVWX0tFWSwgQlROX0VYVFJBLCAxfSwvKiByaWdodCBkYmxjbGljayAqLwotCi0JLyoga2V5Ym9hcmQuICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZDIsIDB4MGQsIEVWX0tFWSwgS0VZXzEsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGQzLCAweDBlLCBFVl9LRVksIEtFWV8yLCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhkNCwgMHgwZiwgRVZfS0VZLCBLRVlfMywgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZDUsIDB4MTAsIEVWX0tFWSwgS0VZXzQsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGQ2LCAweDExLCBFVl9LRVksIEtFWV81LCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhkNywgMHgxMiwgRVZfS0VZLCBLRVlfNiwgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZDgsIDB4MTMsIEVWX0tFWSwgS0VZXzcsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGQ5LCAweDE0LCBFVl9LRVksIEtFWV84LCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhkYSwgMHgxNSwgRVZfS0VZLCBLRVlfOSwgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZGMsIDB4MTcsIEVWX0tFWSwgS0VZXzAsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGM1LCAweDAwLCBFVl9LRVksIEtFWV9BLCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhjNiwgMHgwMSwgRVZfS0VZLCBLRVlfQiwgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZGUsIDB4MTksIEVWX0tFWSwgS0VZX0MsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGUwLCAweDFiLCBFVl9LRVksIEtFWV9ELCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhlNiwgMHgyMSwgRVZfS0VZLCBLRVlfRSwgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZTgsIDB4MjMsIEVWX0tFWSwgS0VZX0YsIDF9LAotCi0JLyogInNwZWNpYWwiIGtleXMgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhkZCwgMHgxOCwgRVZfS0VZLCBLRVlfS1BFTlRFUiwgMX0sICAgIC8qICJjaGVjayIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhkYiwgMHgxNiwgRVZfS0VZLCBLRVlfTUVOVSwgMX0sICAgICAgIC8qICJtZW51IiAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGM3LCAweDAyLCBFVl9LRVksIEtFWV9QT1dFUiwgMX0sICAgICAgLyogUG93ZXIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhjOCwgMHgwMywgRVZfS0VZLCBLRVlfVFYsIDF9LCAgICAgICAgIC8qIFRWICovCi0Je0tJTkRfRklMVEVSRUQsIDB4YzksIDB4MDQsIEVWX0tFWSwgS0VZX0RWRCwgMX0sICAgICAgICAvKiBEVkQgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhjYSwgMHgwNSwgRVZfS0VZLCBLRVlfV1dXLCAxfSwgICAgICAgIC8qIFdFQiAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGNiLCAweDA2LCBFVl9LRVksIEtFWV9CT09LTUFSS1MsIDF9LCAgLyogImJvb2siICovCi0Je0tJTkRfRklMVEVSRUQsIDB4Y2MsIDB4MDcsIEVWX0tFWSwgS0VZX0VESVQsIDF9LCAgICAgICAvKiAiaGFuZCIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhlMSwgMHgxYywgRVZfS0VZLCBLRVlfQ09GRkVFLCAxfSwgICAgIC8qICJ0aW1lciIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhlNSwgMHgyMCwgRVZfS0VZLCBLRVlfRlJPTlQsIDF9LCAgICAgIC8qICJtYXgiICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZTIsIDB4MWQsIEVWX0tFWSwgS0VZX0xFRlQsIDF9LCAgICAgICAvKiBsZWZ0ICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZTQsIDB4MWYsIEVWX0tFWSwgS0VZX1JJR0hULCAxfSwgICAgICAvKiByaWdodCAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGU3LCAweDIyLCBFVl9LRVksIEtFWV9ET1dOLCAxfSwgICAgICAgLyogZG93biAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGRmLCAweDFhLCBFVl9LRVksIEtFWV9VUCwgMX0sICAgICAgICAgLyogdXAgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhlMywgMHgxZSwgRVZfS0VZLCBLRVlfT0ssIDF9LCAgICAgICAgIC8qICJPSyIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhjZSwgMHgwOSwgRVZfS0VZLCBLRVlfVk9MVU1FRE9XTiwgMX0sIC8qIFZPTCArICovCi0Je0tJTkRfRklMVEVSRUQsIDB4Y2QsIDB4MDgsIEVWX0tFWSwgS0VZX1ZPTFVNRVVQLCAxfSwgICAvKiBWT0wgLSAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGNmLCAweDBhLCBFVl9LRVksIEtFWV9NVVRFLCAxfSwgICAgICAgLyogTVVURSAgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhkMCwgMHgwYiwgRVZfS0VZLCBLRVlfQ0hBTk5FTFVQLCAxfSwgIC8qIENIICsgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhkMSwgMHgwYywgRVZfS0VZLCBLRVlfQ0hBTk5FTERPV04sIDF9LC8qIENIIC0gKi8KLQl7S0lORF9GSUxURVJFRCwgMHhlYywgMHgyNywgRVZfS0VZLCBLRVlfUkVDT1JELCAxfSwgICAgIC8qICggbykgcmVkICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWEsIDB4MjUsIEVWX0tFWSwgS0VZX1BMQVksIDF9LCAgICAgICAvKiAoID4pICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZTksIDB4MjQsIEVWX0tFWSwgS0VZX1JFV0lORCwgMX0sICAgICAvKiAoPDwpICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWIsIDB4MjYsIEVWX0tFWSwgS0VZX0ZPUldBUkQsIDF9LCAgICAvKiAoPj4pICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWQsIDB4MjgsIEVWX0tFWSwgS0VZX1NUT1AsIDF9LCAgICAgICAvKiAoW10pICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWUsIDB4MjksIEVWX0tFWSwgS0VZX1BBVVNFLCAxfSwgICAgICAvKiAoJycpICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZjAsIDB4MmIsIEVWX0tFWSwgS0VZX1BSRVZJT1VTLCAxfSwgICAvKiAoPC0pICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWYsIDB4MmEsIEVWX0tFWSwgS0VZX05FWFQsIDF9LCAgICAgICAvKiAoPispICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZjIsIDB4MkQsIEVWX0tFWSwgS0VZX0lORk8sIDF9LCAgICAgICAvKiBQTEFZSU5HICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZjMsIDB4MkUsIEVWX0tFWSwgS0VZX0hPTUUsIDF9LCAgICAgICAvKiBUT1AgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhmNCwgMHgyRiwgRVZfS0VZLCBLRVlfRU5ELCAxfSwgICAgICAgIC8qIEVORCAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGY1LCAweDMwLCBFVl9LRVksIEtFWV9TRUxFQ1QsIDF9LCAgICAgLyogU0VMRUNUICovCi0KLQl7S0lORF9FTkQsIDB4MDAsIDB4MDAsIEVWX01BWCArIDEsIDAsIDB9Ci19OwotCi0vKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50IGF0aV9yZW1vdGVfb3BlbgkJKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2KTsKLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfY2xvc2UJCShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldik7Ci1zdGF0aWMgaW50IGF0aV9yZW1vdGVfc2VuZHBhY2tldAkoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUsIHUxNiBjbWQsIHVuc2lnbmVkIGNoYXIgKmRhdGEpOwotc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pcnFfb3V0CQkoc3RydWN0IHVyYiAqdXJiKTsKLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaXJxX2luCQkoc3RydWN0IHVyYiAqdXJiKTsKLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaW5wdXRfcmVwb3J0CShzdHJ1Y3QgdXJiICp1cmIpOwotc3RhdGljIGludCBhdGlfcmVtb3RlX2luaXRpYWxpemUJKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKTsKLXN0YXRpYyBpbnQgYXRpX3JlbW90ZV9wcm9iZQkJKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7Ci1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2Rpc2Nvbm5lY3QJKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOwotCi0vKiB1c2Igc3BlY2lmaWMgb2JqZWN0IHRvIHJlZ2lzdGVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhdGlfcmVtb3RlX2RyaXZlciA9IHsKLQkubmFtZSAgICAgICAgID0gImF0aV9yZW1vdGUiLAotCS5wcm9iZSAgICAgICAgPSBhdGlfcmVtb3RlX3Byb2JlLAotCS5kaXNjb25uZWN0ICAgPSBhdGlfcmVtb3RlX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlICAgICA9IGF0aV9yZW1vdGVfdGFibGUsCi19OwotCi0vKgotICoJYXRpX3JlbW90ZV9kdW1wX2lucHV0Ci0gKi8KLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfZHVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JCQkgICAgdW5zaWduZWQgaW50IGxlbikKLXsKLQlpZiAoKGxlbiA9PSAxKSAmJiAoZGF0YVswXSAhPSAodW5zaWduZWQgY2hhcikweGZmKSAmJiAoZGF0YVswXSAhPSAweDAwKSkKLQkJZGV2X3dhcm4oZGV2LCAiV2VpcmQgYnl0ZSAweCUwMnhcbiIsIGRhdGFbMF0pOwotCWVsc2UgaWYgKGxlbiA9PSA0KQotCQlkZXZfd2FybihkZXYsICJXZWlyZCBrZXkgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLQkJICAgICBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKLQllbHNlCi0JCWRldl93YXJuKGRldiwgIldlaXJkIGRhdGEsIGxlbj0lZCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLi5cbiIsCi0JCSAgICAgbGVuLCBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLCBkYXRhWzRdLCBkYXRhWzVdKTsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfb3BlbgotICovCi1zdGF0aWMgaW50IGF0aV9yZW1vdGVfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldikKLXsKLQlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0ZGV2KTsKLQotCS8qIE9uIGZpcnN0IG9wZW4sIHN1Ym1pdCB0aGUgcmVhZCB1cmIgd2hpY2ggd2FzIHNldCB1cCBwcmV2aW91c2x5LiAqLwotCWF0aV9yZW1vdGUtPmlycV91cmItPmRldiA9IGF0aV9yZW1vdGUtPnVkZXY7Ci0JaWYgKHVzYl9zdWJtaXRfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIsIEdGUF9LRVJORUwpKSB7Ci0JCWRldl9lcnIoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAotCQkJIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICoJYXRpX3JlbW90ZV9jbG9zZQotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2KQotewotCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRkZXYpOwotCi0JdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwotfQotCi0vKgotICoJCWF0aV9yZW1vdGVfaXJxX291dAotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lycV9vdXQoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gdXJiLT5jb250ZXh0OwotCi0JaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwKLQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlhdGlfcmVtb3RlLT5zZW5kX2ZsYWdzIHw9IFNFTkRfRkxBR19DT01QTEVURTsKLQl3bWIoKTsKLQl3YWtlX3VwKCZhdGlfcmVtb3RlLT53YWl0KTsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfc2VuZHBhY2tldAotICoKLSAqCVVzZWQgdG8gc2VuZCBkZXZpY2UgaW5pdGlhbGl6YXRpb24gc3RyaW5ncwotICovCi1zdGF0aWMgaW50IGF0aV9yZW1vdGVfc2VuZHBhY2tldChzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSwgdTE2IGNtZCwgdW5zaWduZWQgY2hhciAqZGF0YSkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQotCS8qIFNldCB1cCBvdXRfdXJiICovCi0JbWVtY3B5KGF0aV9yZW1vdGUtPm91dF91cmItPnRyYW5zZmVyX2J1ZmZlciArIDEsIGRhdGEsIExPKGNtZCkpOwotCSgoY2hhciAqKSBhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXIpWzBdID0gSEkoY21kKTsKLQotCWF0aV9yZW1vdGUtPm91dF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBMTyhjbWQpICsgMTsKLQlhdGlfcmVtb3RlLT5vdXRfdXJiLT5kZXYgPSBhdGlfcmVtb3RlLT51ZGV2OwotCWF0aV9yZW1vdGUtPnNlbmRfZmxhZ3MgPSBTRU5EX0ZMQUdfSU5fUFJPR1JFU1M7Ci0KLQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAotCQkJICJzZW5kcGFja2V0OiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQ6ICVkXG4iLCByZXR2YWwpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXdhaXRfZXZlbnRfdGltZW91dChhdGlfcmVtb3RlLT53YWl0LAotCQkoKGF0aV9yZW1vdGUtPm91dF91cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHx8Ci0JCQkoYXRpX3JlbW90ZS0+c2VuZF9mbGFncyAmIFNFTkRfRkxBR19DT01QTEVURSkpLAotCQlIWik7Ci0JdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIpOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfZXZlbnRfbG9va3VwCi0gKi8KLXN0YXRpYyBpbnQgYXRpX3JlbW90ZV9ldmVudF9sb29rdXAoaW50IHJlbSwgdW5zaWduZWQgY2hhciBkMSwgdW5zaWduZWQgY2hhciBkMikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGF0aV9yZW1vdGVfdGJsW2ldLmtpbmQgIT0gS0lORF9FTkQ7IGkrKykgewotCQkvKgotCQkgKiBEZWNpZGUgaWYgdGhlIHRhYmxlIGVudHJ5IG1hdGNoZXMgdGhlIHJlbW90ZSBpbnB1dC4KLQkJICovCi0JCWlmICgoKChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMSAmIDB4MGYpID09IChkMSAmIDB4MGYpKSkgJiYKLQkJICAgICgoKChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMSA+PiA0KSAtCi0JCSAgICAgICAoZDEgPj4gNCkgKyByZW0pICYgMHgwZikgPT0gMHgwZikgJiYKLQkJICAgIChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMiA9PSBkMikpCi0JCQlyZXR1cm4gaTsKLQotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKglhdGlfcmVtb3RlX2NvbXB1dGVfYWNjZWwKLSAqCi0gKiBJbXBsZW1lbnRzIGFjY2VsZXJhdGlvbiBjdXJ2ZSBmb3IgZGlyZWN0aW9uYWwgY29udHJvbCBwYWQKLSAqIElmIGVsYXBzZWQgdGltZSBzaW5jZSBsYXN0IGV2ZW50IGlzID4gMS80IHNlY29uZCwgdXNlciAic3RvcHBlZCIsCi0gKiBzbyByZXNldCBhY2NlbGVyYXRpb24uIE90aGVyd2lzZSwgdXNlciBpcyBwcm9iYWJseSBob2xkaW5nIHRoZSBjb250cm9sCi0gKiBwYWQgZG93biwgc28gd2UgaW5jcmVhc2UgYWNjZWxlcmF0aW9uLCByYW1waW5nIHVwIG92ZXIgdHdvIHNlY29uZHMgdG8KLSAqIGEgbWF4aW11bSBzcGVlZC4KLSAqLwotc3RhdGljIGludCBhdGlfcmVtb3RlX2NvbXB1dGVfYWNjZWwoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgYWNjZWxbXSA9IHsgMSwgMiwgNCwgNiwgOSwgMTMsIDIwIH07Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCWludCBhY2M7Ci0KLQlpZiAodGltZV9hZnRlcihub3csIGF0aV9yZW1vdGUtPm9sZF9qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyNTApKSkgewotCQlhY2MgPSAxOwotCQlhdGlfcmVtb3RlLT5hY2NfamlmZmllcyA9IG5vdzsKLQl9Ci0JZWxzZSBpZiAodGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5hY2NfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTI1KSkpCi0JCWFjYyA9IGFjY2VsWzBdOwotCWVsc2UgaWYgKHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDI1MCkpKQotCQlhY2MgPSBhY2NlbFsxXTsKLQllbHNlIGlmICh0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmFjY19qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApKSkKLQkJYWNjID0gYWNjZWxbMl07Ci0JZWxzZSBpZiAodGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5hY2NfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpKQotCQlhY2MgPSBhY2NlbFszXTsKLQllbHNlIGlmICh0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmFjY19qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxNTAwKSkpCi0JCWFjYyA9IGFjY2VsWzRdOwotCWVsc2UgaWYgKHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApKSkKLQkJYWNjID0gYWNjZWxbNV07Ci0JZWxzZQotCQlhY2MgPSBhY2NlbFs2XTsKLQotCXJldHVybiBhY2M7Ci19Ci0KLS8qCi0gKglhdGlfcmVtb3RlX3JlcG9ydF9pbnB1dAotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lucHV0X3JlcG9ydChzdHJ1Y3QgdXJiICp1cmIpCi17Ci0Jc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSB1cmItPmNvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciAqZGF0YT0gYXRpX3JlbW90ZS0+aW5idWY7Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2ID0gYXRpX3JlbW90ZS0+aWRldjsKLQlpbnQgaW5kZXgsIGFjYzsKLQlpbnQgcmVtb3RlX251bTsKLQotCS8qIERlYWwgd2l0aCBzdHJhbmdlIGxvb2tpbmcgaW5wdXRzICovCi0JaWYgKCAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IDQpIHx8IChkYXRhWzBdICE9IDB4MTQpIHx8Ci0JCSgoZGF0YVszXSAmIDB4MGYpICE9IDB4MDApICkgewotCQlhdGlfcmVtb3RlX2R1bXAoJnVyYi0+ZGV2LT5kZXYsIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBNYXNrIHVud2FudGVkIHJlbW90ZSBjaGFubmVscy4gICovCi0JLyogbm90ZTogcmVtb3RlX251bSBpcyAwLWJhc2VkLCBjaGFubmVsIDEgb24gcmVtb3RlID09IDAgaGVyZSAqLwotCXJlbW90ZV9udW0gPSAoZGF0YVszXSA+PiA0KSAmIDB4MGY7Ci0gICAgICAgIGlmIChjaGFubmVsX21hc2sgJiAoMSA8PCAocmVtb3RlX251bSArIDEpKSkgewotCQlkYmdpbmZvKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKLQkJCSJNYXNrZWQgaW5wdXQgZnJvbSBjaGFubmVsIDB4JTAyeDogZGF0YSAlMDJ4LCUwMngsIG1hc2s9IDB4JTAybHhcbiIsCi0JCQlyZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdLCBjaGFubmVsX21hc2spOwotCQlyZXR1cm47Ci0JfQotCi0JLyogTG9vayB1cCBldmVudCBjb2RlIGluZGV4IGluIHRyYW5zbGF0aW9uIHRhYmxlICovCi0JaW5kZXggPSBhdGlfcmVtb3RlX2V2ZW50X2xvb2t1cChyZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdKTsKLQlpZiAoaW5kZXggPCAwKSB7Ci0JCWRldl93YXJuKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKLQkJCSAiVW5rbm93biBpbnB1dCBmcm9tIGNoYW5uZWwgMHglMDJ4OiBkYXRhICUwMngsJTAyeFxuIiwKLQkJCSByZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdKTsKLQkJcmV0dXJuOwotCX0KLQlkYmdpbmZvKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKLQkJImNoYW5uZWwgMHglMDJ4OyBkYXRhICUwMngsJTAyeDsgaW5kZXggJWQ7IGtleWNvZGUgJWRcbiIsCi0JCXJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0sIGluZGV4LCBhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSk7Ci0KLQlpZiAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQgPT0gS0lORF9MSVRFUkFMKSB7Ci0JCWlucHV0X2V2ZW50KGRldiwgYXRpX3JlbW90ZV90YmxbaW5kZXhdLnR5cGUsCi0JCQlhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSwKLQkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS52YWx1ZSk7Ci0JCWlucHV0X3N5bmMoZGV2KTsKLQotCQlhdGlfcmVtb3RlLT5vbGRfamlmZmllcyA9IGppZmZpZXM7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQgPT0gS0lORF9GSUxURVJFRCkgewotCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0KLQkJLyogRmlsdGVyIGR1cGxpY2F0ZSBldmVudHMgd2hpY2ggaGFwcGVuICJ0b28gY2xvc2UiIHRvZ2V0aGVyLiAqLwotCQlpZiAoYXRpX3JlbW90ZS0+b2xkX2RhdGFbMF0gPT0gZGF0YVsxXSAmJgotCQkgICAgYXRpX3JlbW90ZS0+b2xkX2RhdGFbMV0gPT0gZGF0YVsyXSAmJgotCQkgICAgdGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5vbGRfamlmZmllcyArCi0JCQkJICAgICBtc2Vjc190b19qaWZmaWVzKHJlcGVhdF9maWx0ZXIpKSkgewotCQkJYXRpX3JlbW90ZS0+cmVwZWF0X2NvdW50Kys7Ci0JCX0gZWxzZSB7Ci0JCQlhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQgPSAwOwotCQkJYXRpX3JlbW90ZS0+Zmlyc3RfamlmZmllcyA9IG5vdzsKLQkJfQotCi0JCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzBdID0gZGF0YVsxXTsKLQkJYXRpX3JlbW90ZS0+b2xkX2RhdGFbMV0gPSBkYXRhWzJdOwotCQlhdGlfcmVtb3RlLT5vbGRfamlmZmllcyA9IG5vdzsKLQotCQkvKiBFbnN1cmUgd2Ugc2tpcCBhdCBsZWFzdCB0aGUgNCBmaXJzdCBkdXBsaWNhdGUgZXZlbnRzIChnZW5lcmF0ZWQKLQkJICogYnkgYSBzaW5nbGUga2V5cHJlc3MpLCBhbmQgY29udGludWUgc2tpcHBpbmcgdW50aWwgcmVwZWF0X2RlbGF5Ci0JCSAqIG1zZWNzIGhhdmUgcGFzc2VkCi0JCSAqLwotCQlpZiAoYXRpX3JlbW90ZS0+cmVwZWF0X2NvdW50ID4gMCAmJgotCQkgICAgKGF0aV9yZW1vdGUtPnJlcGVhdF9jb3VudCA8IDUgfHwKLQkJICAgICB0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmZpcnN0X2ppZmZpZXMgKwotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMocmVwZWF0X2RlbGF5KSkpKQotCQkJcmV0dXJuOwotCi0KLQkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKLQkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5jb2RlLCAxKTsKLQkJaW5wdXRfc3luYyhkZXYpOwotCQlpbnB1dF9ldmVudChkZXYsIGF0aV9yZW1vdGVfdGJsW2luZGV4XS50eXBlLAotCQkJYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUsIDApOwotCQlpbnB1dF9zeW5jKGRldik7Ci0KLQl9IGVsc2UgewotCi0JCS8qCi0JCSAqIE90aGVyIGV2ZW50IGtpbmRzIGFyZSBmcm9tIHRoZSBkaXJlY3Rpb25hbCBjb250cm9sIHBhZCwgYW5kIGhhdmUgYW4KLQkJICogYWNjZWxlcmF0aW9uIGZhY3RvciBhcHBsaWVkIHRvIHRoZW0uICBXaXRob3V0IHRoaXMgYWNjZWxlcmF0aW9uLCB0aGUKLQkJICogY29udHJvbCBwYWQgaXMgbW9zdGx5IHVudXNhYmxlLgotCQkgKi8KLQkJYWNjID0gYXRpX3JlbW90ZV9jb21wdXRlX2FjY2VsKGF0aV9yZW1vdGUpOwotCi0JCXN3aXRjaCAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQpIHsKLQkJY2FzZSBLSU5EX0FDQ0VMOgotCQkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKLQkJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSwKLQkJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0udmFsdWUgKiBhY2MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgS0lORF9MVToKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgLWFjYyk7Ci0JCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksIC1hY2MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgS0lORF9SVToKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgYWNjKTsKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWSwgLWFjYyk7Ci0JCQlicmVhazsKLQkJY2FzZSBLSU5EX0xEOgotCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9YLCAtYWNjKTsKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWSwgYWNjKTsKLQkJCWJyZWFrOwotCQljYXNlIEtJTkRfUkQ6Ci0JCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsIGFjYyk7Ci0JCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksIGFjYyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiYXRpX3JlbW90ZSBraW5kPSVkXG4iLAotCQkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5raW5kKTsKLQkJfQotCQlpbnB1dF9zeW5jKGRldik7Ci0KLQkJYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgPSBqaWZmaWVzOwotCQlhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9IGRhdGFbMV07Ci0JCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzFdID0gZGF0YVsyXTsKLQl9Ci19Ci0KLS8qCi0gKglhdGlfcmVtb3RlX2lycV9pbgotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lycV9pbihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0Jc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSB1cmItPmNvbnRleHQ7Ci0JaW50IHJldHZhbDsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6CQkJLyogc3VjY2VzcyAqLwotCQlhdGlfcmVtb3RlX2lucHV0X3JlcG9ydCh1cmIpOwotCQlicmVhazsKLQljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KLQljYXNlIC1FTk9FTlQ6Ci0JY2FzZSAtRVNIVVRET1dOOgotCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiB1cmIgZXJyb3Igc3RhdHVzLCB1bmxpbms/IFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwotCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBOb256ZXJvIHVyYiBzdGF0dXMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwotCX0KLQotCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldHZhbCkKLQkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsICIlczogdXNiX3N1Ym1pdF91cmIoKT0lZFxuIiwKLQkJCV9fZnVuY19fLCByZXR2YWwpOwotfQotCi0vKgotICoJYXRpX3JlbW90ZV9hbGxvY19idWZmZXJzCi0gKi8KLXN0YXRpYyBpbnQgYXRpX3JlbW90ZV9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJCSAgICBzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKLXsKLQlhdGlfcmVtb3RlLT5pbmJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudCh1ZGV2LCBEQVRBX0JVRlNJWkUsIEdGUF9BVE9NSUMsCi0JCQkJCSAgICAgICAmYXRpX3JlbW90ZS0+aW5idWZfZG1hKTsKLQlpZiAoIWF0aV9yZW1vdGUtPmluYnVmKQotCQlyZXR1cm4gLTE7Ci0KLQlhdGlfcmVtb3RlLT5vdXRidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQodWRldiwgREFUQV9CVUZTSVpFLCBHRlBfQVRPTUlDLAotCQkJCQkgICAgICAgICZhdGlfcmVtb3RlLT5vdXRidWZfZG1hKTsKLQlpZiAoIWF0aV9yZW1vdGUtPm91dGJ1ZikKLQkJcmV0dXJuIC0xOwotCi0JYXRpX3JlbW90ZS0+aXJxX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdGlfcmVtb3RlLT5pcnFfdXJiKQotCQlyZXR1cm4gLTE7Ci0KLQlhdGlfcmVtb3RlLT5vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF0aV9yZW1vdGUtPm91dF91cmIpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICoJYXRpX3JlbW90ZV9mcmVlX2J1ZmZlcnMKLSAqLwotc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9mcmVlX2J1ZmZlcnMoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCi17Ci0JdXNiX2ZyZWVfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwotCXVzYl9mcmVlX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKLQotCXVzYl9mcmVlX2NvaGVyZW50KGF0aV9yZW1vdGUtPnVkZXYsIERBVEFfQlVGU0laRSwKLQkJYXRpX3JlbW90ZS0+aW5idWYsIGF0aV9yZW1vdGUtPmluYnVmX2RtYSk7Ci0KLQl1c2JfZnJlZV9jb2hlcmVudChhdGlfcmVtb3RlLT51ZGV2LCBEQVRBX0JVRlNJWkUsCi0JCWF0aV9yZW1vdGUtPm91dGJ1ZiwgYXRpX3JlbW90ZS0+b3V0YnVmX2RtYSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaW5wdXRfaW5pdChzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKLXsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2ID0gYXRpX3JlbW90ZS0+aWRldjsKLQlpbnQgaTsKLQotCWlkZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX1JFTCk7Ci0JaWRldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9NT1VTRSldID0gQklUX01BU0soQlROX0xFRlQpIHwKLQkJQklUX01BU0soQlROX1JJR0hUKSB8IEJJVF9NQVNLKEJUTl9TSURFKSB8IEJJVF9NQVNLKEJUTl9FWFRSQSk7Ci0JaWRldi0+cmVsYml0WzBdID0gQklUX01BU0soUkVMX1gpIHwgQklUX01BU0soUkVMX1kpOwotCWZvciAoaSA9IDA7IGF0aV9yZW1vdGVfdGJsW2ldLmtpbmQgIT0gS0lORF9FTkQ7IGkrKykKLQkJaWYgKGF0aV9yZW1vdGVfdGJsW2ldLnR5cGUgPT0gRVZfS0VZKQotCQkJc2V0X2JpdChhdGlfcmVtb3RlX3RibFtpXS5jb2RlLCBpZGV2LT5rZXliaXQpOwotCi0JaW5wdXRfc2V0X2RydmRhdGEoaWRldiwgYXRpX3JlbW90ZSk7Ci0KLQlpZGV2LT5vcGVuID0gYXRpX3JlbW90ZV9vcGVuOwotCWlkZXYtPmNsb3NlID0gYXRpX3JlbW90ZV9jbG9zZTsKLQotCWlkZXYtPm5hbWUgPSBhdGlfcmVtb3RlLT5uYW1lOwotCWlkZXYtPnBoeXMgPSBhdGlfcmVtb3RlLT5waHlzOwotCi0JdXNiX3RvX2lucHV0X2lkKGF0aV9yZW1vdGUtPnVkZXYsICZpZGV2LT5pZCk7Ci0JaWRldi0+ZGV2LnBhcmVudCA9ICZhdGlfcmVtb3RlLT51ZGV2LT5kZXY7Ci19Ci0KLXN0YXRpYyBpbnQgYXRpX3JlbW90ZV9pbml0aWFsaXplKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gYXRpX3JlbW90ZS0+dWRldjsKLQlpbnQgcGlwZSwgbWF4cDsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF0aV9yZW1vdGUtPndhaXQpOwotCi0JLyogU2V0IHVwIGlycV91cmIgKi8KLQlwaXBlID0gdXNiX3JjdmludHBpcGUodWRldiwgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfaW4tPmJFbmRwb2ludEFkZHJlc3MpOwotCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKLQltYXhwID0gKG1heHAgPiBEQVRBX0JVRlNJWkUpID8gREFUQV9CVUZTSVpFIDogbWF4cDsKLQotCXVzYl9maWxsX2ludF91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYiwgdWRldiwgcGlwZSwgYXRpX3JlbW90ZS0+aW5idWYsCi0JCQkgbWF4cCwgYXRpX3JlbW90ZV9pcnFfaW4sIGF0aV9yZW1vdGUsCi0JCQkgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfaW4tPmJJbnRlcnZhbCk7Ci0JYXRpX3JlbW90ZS0+aXJxX3VyYi0+dHJhbnNmZXJfZG1hID0gYXRpX3JlbW90ZS0+aW5idWZfZG1hOwotCWF0aV9yZW1vdGUtPmlycV91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwotCi0JLyogU2V0IHVwIG91dF91cmIgKi8KLQlwaXBlID0gdXNiX3NuZGludHBpcGUodWRldiwgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0LT5iRW5kcG9pbnRBZGRyZXNzKTsKLQltYXhwID0gdXNiX21heHBhY2tldCh1ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7Ci0JbWF4cCA9IChtYXhwID4gREFUQV9CVUZTSVpFKSA/IERBVEFfQlVGU0laRSA6IG1heHA7Ci0KLQl1c2JfZmlsbF9pbnRfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIsIHVkZXYsIHBpcGUsIGF0aV9yZW1vdGUtPm91dGJ1ZiwKLQkJCSBtYXhwLCBhdGlfcmVtb3RlX2lycV9vdXQsIGF0aV9yZW1vdGUsCi0JCQkgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0LT5iSW50ZXJ2YWwpOwotCWF0aV9yZW1vdGUtPm91dF91cmItPnRyYW5zZmVyX2RtYSA9IGF0aV9yZW1vdGUtPm91dGJ1Zl9kbWE7Ci0JYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7Ci0KLQkvKiBzZW5kIGluaXRpYWxpemF0aW9uIHN0cmluZ3MgKi8KLQlpZiAoKGF0aV9yZW1vdGVfc2VuZHBhY2tldChhdGlfcmVtb3RlLCAweDgwMDQsIGluaXQxKSkgfHwKLQkgICAgKGF0aV9yZW1vdGVfc2VuZHBhY2tldChhdGlfcmVtb3RlLCAweDgwMDcsIGluaXQyKSkpIHsKLQkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCi0JCQkgIkluaXRpYWxpemluZyBhdGlfcmVtb3RlIGhhcmR3YXJlIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfcHJvYmUKLSAqLwotc3RhdGljIGludCBhdGlfcmVtb3RlX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9ob3N0ID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50X2luLCAqZW5kcG9pbnRfb3V0OwotCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlOwotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCWlmIChpZmFjZV9ob3N0LT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMikgewotCQllcnIoIiVzOiBVbmV4cGVjdGVkIGRlc2MuYk51bUVuZHBvaW50c1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQllbmRwb2ludF9pbiA9ICZpZmFjZV9ob3N0LT5lbmRwb2ludFswXS5kZXNjOwotCWVuZHBvaW50X291dCA9ICZpZmFjZV9ob3N0LT5lbmRwb2ludFsxXS5kZXNjOwotCi0JaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50X2luKSkgewotCQllcnIoIiVzOiBVbmV4cGVjdGVkIGVuZHBvaW50X2luXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAobGUxNl90b19jcHUoZW5kcG9pbnRfaW4tPndNYXhQYWNrZXRTaXplKSA9PSAwKSB7Ci0JCWVycigiJXM6IGVuZHBvaW50X2luIG1lc3NhZ2Ugc2l6ZT09MD8gXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWF0aV9yZW1vdGUgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IGF0aV9yZW1vdGUpLCBHRlBfS0VSTkVMKTsKLQlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWF0aV9yZW1vdGUgfHwgIWlucHV0X2RldikKLQkJZ290byBmYWlsMTsKLQotCS8qIEFsbG9jYXRlIFVSQiBidWZmZXJzLCBVUkJzICovCi0JaWYgKGF0aV9yZW1vdGVfYWxsb2NfYnVmZmVycyh1ZGV2LCBhdGlfcmVtb3RlKSkKLQkJZ290byBmYWlsMjsKLQotCWF0aV9yZW1vdGUtPmVuZHBvaW50X2luID0gZW5kcG9pbnRfaW47Ci0JYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0ID0gZW5kcG9pbnRfb3V0OwotCWF0aV9yZW1vdGUtPnVkZXYgPSB1ZGV2OwotCWF0aV9yZW1vdGUtPmlkZXYgPSBpbnB1dF9kZXY7Ci0JYXRpX3JlbW90ZS0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOwotCi0JdXNiX21ha2VfcGF0aCh1ZGV2LCBhdGlfcmVtb3RlLT5waHlzLCBzaXplb2YoYXRpX3JlbW90ZS0+cGh5cykpOwotCXN0cmxjYXQoYXRpX3JlbW90ZS0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YoYXRpX3JlbW90ZS0+cGh5cykpOwotCi0JaWYgKHVkZXYtPm1hbnVmYWN0dXJlcikKLQkJc3RybGNweShhdGlfcmVtb3RlLT5uYW1lLCB1ZGV2LT5tYW51ZmFjdHVyZXIsIHNpemVvZihhdGlfcmVtb3RlLT5uYW1lKSk7Ci0KLQlpZiAodWRldi0+cHJvZHVjdCkKLQkJc25wcmludGYoYXRpX3JlbW90ZS0+bmFtZSwgc2l6ZW9mKGF0aV9yZW1vdGUtPm5hbWUpLAotCQkJICIlcyAlcyIsIGF0aV9yZW1vdGUtPm5hbWUsIHVkZXYtPnByb2R1Y3QpOwotCi0JaWYgKCFzdHJsZW4oYXRpX3JlbW90ZS0+bmFtZSkpCi0JCXNucHJpbnRmKGF0aV9yZW1vdGUtPm5hbWUsIHNpemVvZihhdGlfcmVtb3RlLT5uYW1lKSwKLQkJCURSSVZFUl9ERVNDICIoJTA0eCwlMDR4KSIsCi0JCQlsZTE2X3RvX2NwdShhdGlfcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJCWxlMTZfdG9fY3B1KGF0aV9yZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7Ci0KLQlhdGlfcmVtb3RlX2lucHV0X2luaXQoYXRpX3JlbW90ZSk7Ci0KLQkvKiBEZXZpY2UgSGFyZHdhcmUgSW5pdGlhbGl6YXRpb24gLSBmaWxscyBpbiBhdGlfcmVtb3RlLT5pZGV2IGZyb20gdWRldi4gKi8KLQllcnIgPSBhdGlfcmVtb3RlX2luaXRpYWxpemUoYXRpX3JlbW90ZSk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsMzsKLQotCS8qIFNldCB1cCBhbmQgcmVnaXN0ZXIgaW5wdXQgZGV2aWNlICovCi0JZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGF0aV9yZW1vdGUtPmlkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbDM7Ci0KLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgYXRpX3JlbW90ZSk7Ci0JcmV0dXJuIDA7Ci0KLSBmYWlsMzoJdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwotCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKLSBmYWlsMjoJYXRpX3JlbW90ZV9mcmVlX2J1ZmZlcnMoYXRpX3JlbW90ZSk7Ci0gZmFpbDE6CWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0Ja2ZyZWUoYXRpX3JlbW90ZSk7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfZGlzY29ubmVjdAotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKLXsKLQlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZTsKLQotCWF0aV9yZW1vdGUgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0JdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwotCWlmICghYXRpX3JlbW90ZSkgewotCQlkZXZfd2FybigmaW50ZXJmYWNlLT5kZXYsICIlcyAtIG51bGwgZGV2aWNlP1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwotCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShhdGlfcmVtb3RlLT5pZGV2KTsKLQlhdGlfcmVtb3RlX2ZyZWVfYnVmZmVycyhhdGlfcmVtb3RlKTsKLQlrZnJlZShhdGlfcmVtb3RlKTsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfaW5pdAotICovCi1zdGF0aWMgaW50IF9faW5pdCBhdGlfcmVtb3RlX2luaXQodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCi0JcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZhdGlfcmVtb3RlX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCkKLQkJcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FCi0JCSAgICAgICAiOiB1c2JfcmVnaXN0ZXIgZXJyb3IgIyVkXG4iLCByZXN1bHQpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9WRVJTSU9OICI6IgotCQkgICAgICAgRFJJVkVSX0RFU0MgIlxuIik7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICoJYXRpX3JlbW90ZV9leGl0Ci0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdGlfcmVtb3RlX2V4aXQodm9pZCkKLXsKLQl1c2JfZGVyZWdpc3RlcigmYXRpX3JlbW90ZV9kcml2ZXIpOwotfQotCi0vKgotICoJbW9kdWxlIHNwZWNpZmljYXRpb24KLSAqLwotCi1tb2R1bGVfaW5pdChhdGlfcmVtb3RlX2luaXQpOwotbW9kdWxlX2V4aXQoYXRpX3JlbW90ZV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYXRpX3JlbW90ZTIuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlMi5jCmluZGV4IDFkZTU4ZTguLjhkMzQ1ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlMi5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgICAgIkFUSS9QaGlsaXBzIFVTQiBSRiByZW1vdGUgZHJpdmVyIgogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4zIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2JtYTE1MC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2JtYTE1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNTViNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYm1hMTUwLmMKQEAgLTAsMCArMSw2OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQm9zY2ggU2Vuc29ydGVjIEdtYkgKKyAqIENvcHlyaWdodCAoYykgMjAxMSBVbml4cGhlcmUKKyAqCisgKiBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIEJvc2NoIFNlbnNvcnRlYydzIGRpZ2l0YWwgYWNjZWxlcmF0aW9uCisgKiBzZW5zb3JzIEJNQTE1MCBhbmQgU01CMzgwLgorICogVGhlIFNNQjM4MCBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggQk1BMTUwIGFuZCBvbmx5IGRpZmZlcnMgaW4gcGFja2FnaW5nLgorICoKKyAqIFRoZSBkYXRhc2hlZXQgZm9yIHRoZSBCTUExNTAgY2hpcCBjYW4gYmUgZm91bmQgaGVyZToKKyAqIGh0dHA6Ly93d3cuYm9zY2gtc2Vuc29ydGVjLmNvbS9jb250ZW50L2xhbmd1YWdlMS9kb3dubG9hZHMvQlNULUJNQTE1MC1EUzAwMC0wNy5wZGYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQtcG9sbGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JtYTE1MC5oPgorCisjZGVmaW5lIEFCU01BWF9BQ0NfVkFMCQkweDAxRkYKKyNkZWZpbmUgQUJTTUlOX0FDQ19WQUwJCS0oQUJTTUFYX0FDQ19WQUwpCisKKy8qIEVhY2ggYXhpcyBpcyByZXByZXNlbnRlZCBieSBhIDItYnl0ZSBkYXRhIHdvcmQgKi8KKyNkZWZpbmUgQk1BMTUwX1hZWl9EQVRBX1NJWkUJNgorCisvKiBJbnB1dCBwb2xsIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBCTUExNTBfUE9MTF9JTlRFUlZBTAkxMAorI2RlZmluZSBCTUExNTBfUE9MTF9NQVgJCTIwMAorI2RlZmluZSBCTUExNTBfUE9MTF9NSU4JCTAKKworI2RlZmluZSBCTUExNTBfQldfMjVIWgkJMAorI2RlZmluZSBCTUExNTBfQldfNTBIWgkJMQorI2RlZmluZSBCTUExNTBfQldfMTAwSFoJCTIKKyNkZWZpbmUgQk1BMTUwX0JXXzE5MEhaCQkzCisjZGVmaW5lIEJNQTE1MF9CV18zNzVIWgkJNAorI2RlZmluZSBCTUExNTBfQldfNzUwSFoJCTUKKyNkZWZpbmUgQk1BMTUwX0JXXzE1MDBIWgk2CisKKyNkZWZpbmUgQk1BMTUwX1JBTkdFXzJHCQkwCisjZGVmaW5lIEJNQTE1MF9SQU5HRV80RwkJMQorI2RlZmluZSBCTUExNTBfUkFOR0VfOEcJCTIKKworI2RlZmluZSBCTUExNTBfTU9ERV9OT1JNQUwJMAorI2RlZmluZSBCTUExNTBfTU9ERV9TTEVFUAkyCisjZGVmaW5lIEJNQTE1MF9NT0RFX1dBS0VfVVAJMworCisvKiBEYXRhIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBCTUExNTBfREFUQV8wX1JFRwkweDAwCisjZGVmaW5lIEJNQTE1MF9EQVRBXzFfUkVHCTB4MDEKKyNkZWZpbmUgQk1BMTUwX0RBVEFfMl9SRUcJMHgwMgorCisvKiBDb250cm9sIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBCTUExNTBfQ1RSTF8wX1JFRwkweDBBCisjZGVmaW5lIEJNQTE1MF9DVFJMXzFfUkVHCTB4MEIKKyNkZWZpbmUgQk1BMTUwX0NUUkxfMl9SRUcJMHgxNAorI2RlZmluZSBCTUExNTBfQ1RSTF8zX1JFRwkweDE1CisKKy8qIENvbmZpZ3VyYXRpb24vU2V0dGluZyByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgQk1BMTUwX0NGR18wX1JFRwkweDBDCisjZGVmaW5lIEJNQTE1MF9DRkdfMV9SRUcJMHgwRAorI2RlZmluZSBCTUExNTBfQ0ZHXzJfUkVHCTB4MEUKKyNkZWZpbmUgQk1BMTUwX0NGR18zX1JFRwkweDBGCisjZGVmaW5lIEJNQTE1MF9DRkdfNF9SRUcJMHgxMAorI2RlZmluZSBCTUExNTBfQ0ZHXzVfUkVHCTB4MTEKKworI2RlZmluZSBCTUExNTBfQ0hJUF9JRAkJMgorI2RlZmluZSBCTUExNTBfQ0hJUF9JRF9SRUcJQk1BMTUwX0RBVEFfMF9SRUcKKworI2RlZmluZSBCTUExNTBfQUNDX1hfTFNCX1JFRwlCTUExNTBfREFUQV8yX1JFRworCisjZGVmaW5lIEJNQTE1MF9TTEVFUF9QT1MJMAorI2RlZmluZSBCTUExNTBfU0xFRVBfTVNLCTB4MDEKKyNkZWZpbmUgQk1BMTUwX1NMRUVQX1JFRwlCTUExNTBfQ1RSTF8wX1JFRworCisjZGVmaW5lIEJNQTE1MF9CQU5EV0lEVEhfUE9TCTAKKyNkZWZpbmUgQk1BMTUwX0JBTkRXSURUSF9NU0sJMHgwNworI2RlZmluZSBCTUExNTBfQkFORFdJRFRIX1JFRwlCTUExNTBfQ1RSTF8yX1JFRworCisjZGVmaW5lIEJNQTE1MF9SQU5HRV9QT1MJMworI2RlZmluZSBCTUExNTBfUkFOR0VfTVNLCTB4MTgKKyNkZWZpbmUgQk1BMTUwX1JBTkdFX1JFRwlCTUExNTBfQ1RSTF8yX1JFRworCisjZGVmaW5lIEJNQTE1MF9XQUtFX1VQX1BPUwkwCisjZGVmaW5lIEJNQTE1MF9XQUtFX1VQX01TSwkweDAxCisjZGVmaW5lIEJNQTE1MF9XQUtFX1VQX1JFRwlCTUExNTBfQ1RSTF8zX1JFRworCisjZGVmaW5lIEJNQTE1MF9TV19SRVNfUE9TCTEKKyNkZWZpbmUgQk1BMTUwX1NXX1JFU19NU0sJMHgwMgorI2RlZmluZSBCTUExNTBfU1dfUkVTX1JFRwlCTUExNTBfQ1RSTF8wX1JFRworCisvKiBBbnktbW90aW9uIGludGVycnVwdCByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQk1BMTUwX0FOWV9NT1RJT05fRU5fUE9TCTYKKyNkZWZpbmUgQk1BMTUwX0FOWV9NT1RJT05fRU5fTVNLCTB4NDAKKyNkZWZpbmUgQk1BMTUwX0FOWV9NT1RJT05fRU5fUkVHCUJNQTE1MF9DVFJMXzFfUkVHCisKKyNkZWZpbmUgQk1BMTUwX0FOWV9NT1RJT05fRFVSX1BPUwk2CisjZGVmaW5lIEJNQTE1MF9BTllfTU9USU9OX0RVUl9NU0sJMHhDMAorI2RlZmluZSBCTUExNTBfQU5ZX01PVElPTl9EVVJfUkVHCUJNQTE1MF9DRkdfNV9SRUcKKworI2RlZmluZSBCTUExNTBfQU5ZX01PVElPTl9USFJFU19SRUcJQk1BMTUwX0NGR180X1JFRworCisvKiBBZHZhbmNlZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIEJNQTE1MF9BRFZfSU5UX0VOX1BPUwkJNgorI2RlZmluZSBCTUExNTBfQURWX0lOVF9FTl9NU0sJCTB4NDAKKyNkZWZpbmUgQk1BMTUwX0FEVl9JTlRfRU5fUkVHCQlCTUExNTBfQ1RSTF8zX1JFRworCisvKiBIaWdoLUcgaW50ZXJydXB0IHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBCTUExNTBfSElHSF9HX0VOX1BPUwkJMQorI2RlZmluZSBCTUExNTBfSElHSF9HX0VOX01TSwkJMHgwMgorI2RlZmluZSBCTUExNTBfSElHSF9HX0VOX1JFRwkJQk1BMTUwX0NUUkxfMV9SRUcKKworI2RlZmluZSBCTUExNTBfSElHSF9HX0hZU1RfUE9TCQkzCisjZGVmaW5lIEJNQTE1MF9ISUdIX0dfSFlTVF9NU0sJCTB4MzgKKyNkZWZpbmUgQk1BMTUwX0hJR0hfR19IWVNUX1JFRwkJQk1BMTUwX0NGR181X1JFRworCisjZGVmaW5lIEJNQTE1MF9ISUdIX0dfRFVSX1JFRwkJQk1BMTUwX0NGR18zX1JFRworI2RlZmluZSBCTUExNTBfSElHSF9HX1RIUkVTX1JFRwkJQk1BMTUwX0NGR18yX1JFRworCisvKiBMb3ctRyBpbnRlcnJ1cHQgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIEJNQTE1MF9MT1dfR19FTl9QT1MJCTAKKyNkZWZpbmUgQk1BMTUwX0xPV19HX0VOX01TSwkJMHgwMQorI2RlZmluZSBCTUExNTBfTE9XX0dfRU5fUkVHCQlCTUExNTBfQ1RSTF8xX1JFRworCisjZGVmaW5lIEJNQTE1MF9MT1dfR19IWVNUX1BPUwkJMAorI2RlZmluZSBCTUExNTBfTE9XX0dfSFlTVF9NU0sJCTB4MDcKKyNkZWZpbmUgQk1BMTUwX0xPV19HX0hZU1RfUkVHCQlCTUExNTBfQ0ZHXzVfUkVHCisKKyNkZWZpbmUgQk1BMTUwX0xPV19HX0RVUl9SRUcJCUJNQTE1MF9DRkdfMV9SRUcKKyNkZWZpbmUgQk1BMTUwX0xPV19HX1RIUkVTX1JFRwkJQk1BMTUwX0NGR18wX1JFRworCitzdHJ1Y3QgYm1hMTUwX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlucHV0X3BvbGxlZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwl1OCBtb2RlOworfTsKKworLyoKKyAqIFRoZSBzZXR0aW5ncyBmb3IgdGhlIGdpdmVuIHJhbmdlLCBiYW5kd2lkdGggYW5kIGludGVycnVwdCBmZWF0dXJlcworICogYXJlIHN0YXRlZCBhbmQgdmVyaWZpZWQgYnkgQm9zY2ggU2Vuc29ydGVjIHdoZXJlIHRoZXkgYXJlIGNvbmZpZ3VyZWQKKyAqIHRvIHByb3ZpZGUgYSBnZW5lcmljIHNlbnNpdGl2aXR5IHBlcmZvcm1hbmNlLgorICovCitzdGF0aWMgc3RydWN0IGJtYTE1MF9jZmcgZGVmYXVsdF9jZmcgX19kZXZpbml0ZGF0YSA9IHsKKwkuYW55X21vdGlvbl9pbnQgPSAxLAorCS5oZ19pbnQgPSAxLAorCS5sZ19pbnQgPSAxLAorCS5hbnlfbW90aW9uX2R1ciA9IDAsCisJLmFueV9tb3Rpb25fdGhyZXMgPSAwLAorCS5oZ19oeXN0ID0gMCwKKwkuaGdfZHVyID0gMTUwLAorCS5oZ190aHJlcyA9IDE2MCwKKwkubGdfaHlzdCA9IDAsCisJLmxnX2R1ciA9IDE1MCwKKwkubGdfdGhyZXMgPSAyMCwKKwkucmFuZ2UgPSBCTUExNTBfUkFOR0VfMkcsCisJLmJhbmR3aWR0aCA9IEJNQTE1MF9CV181MEhaCit9OworCitzdGF0aWMgaW50IGJtYTE1MF93cml0ZV9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsKQoreworCXMzMiByZXQ7CisKKwkvKiBBcyBwZXIgc3BlY2lmaWNhdGlvbiwgZGlzYWJsZSBpcnEgaW4gYmV0d2VlbiByZWdpc3RlciB3cml0ZXMgKi8KKwlpZiAoY2xpZW50LT5pcnEpCisJCWRpc2FibGVfaXJxX25vc3luYyhjbGllbnQtPmlycSk7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWwpOworCisJaWYgKGNsaWVudC0+aXJxKQorCQllbmFibGVfaXJxKGNsaWVudC0+aXJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYm1hMTUwX3NldF9yZWdfYml0cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCQlpbnQgdmFsLCBpbnQgc2hpZnQsIHU4IG1hc2ssIHU4IHJlZykKK3sKKwlpbnQgZGF0YTsKKworCWRhdGEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChkYXRhIDwgMCkKKwkJcmV0dXJuIGRhdGE7CisKKwlkYXRhID0gKGRhdGEgJiB+bWFzaykgfCAoKHZhbCA8PCBzaGlmdCkgJiBtYXNrKTsKKwlyZXR1cm4gYm1hMTUwX3dyaXRlX2J5dGUoY2xpZW50LCByZWcsIGRhdGEpOworfQorCitzdGF0aWMgaW50IGJtYTE1MF9zZXRfbW9kZShzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCwgdTggbW9kZSkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGJtYTE1MF9zZXRfcmVnX2JpdHMoYm1hMTUwLT5jbGllbnQsIG1vZGUsIEJNQTE1MF9XQUtFX1VQX1BPUywKKwkJCQlCTUExNTBfV0FLRV9VUF9NU0ssIEJNQTE1MF9XQUtFX1VQX1JFRyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGJtYTE1MF9zZXRfcmVnX2JpdHMoYm1hMTUwLT5jbGllbnQsIG1vZGUsIEJNQTE1MF9TTEVFUF9QT1MsCisJCQkJQk1BMTUwX1NMRUVQX01TSywgQk1BMTUwX1NMRUVQX1JFRyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAobW9kZSA9PSBCTUExNTBfTU9ERV9OT1JNQUwpCisJCW1zbGVlcCgyKTsKKworCWJtYTE1MC0+bW9kZSA9IG1vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJtYTE1MF9zb2Z0X3Jlc2V0KHN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3NldF9yZWdfYml0cyhibWExNTAtPmNsaWVudCwgMSwgQk1BMTUwX1NXX1JFU19QT1MsCisJCQkJQk1BMTUwX1NXX1JFU19NU0ssIEJNQTE1MF9TV19SRVNfUkVHKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCW1zbGVlcCgyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYm1hMTUwX3NldF9yYW5nZShzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCwgdTggcmFuZ2UpCit7CisJcmV0dXJuIGJtYTE1MF9zZXRfcmVnX2JpdHMoYm1hMTUwLT5jbGllbnQsIHJhbmdlLCBCTUExNTBfUkFOR0VfUE9TLAorCQkJCUJNQTE1MF9SQU5HRV9NU0ssIEJNQTE1MF9SQU5HRV9SRUcpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWExNTBfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCwgdTggYncpCit7CisJcmV0dXJuIGJtYTE1MF9zZXRfcmVnX2JpdHMoYm1hMTUwLT5jbGllbnQsIGJ3LCBCTUExNTBfQkFORFdJRFRIX1BPUywKKwkJCQlCTUExNTBfQkFORFdJRFRIX01TSywgQk1BMTUwX0JBTkRXSURUSF9SRUcpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWExNTBfc2V0X2xvd19nX2ludGVycnVwdChzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCwKKwkJCQkJdTggZW5hYmxlLCB1OCBoeXN0LCB1OCBkdXIsIHU4IHRocmVzKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3NldF9yZWdfYml0cyhibWExNTAtPmNsaWVudCwgaHlzdCwKKwkJCQlCTUExNTBfTE9XX0dfSFlTVF9QT1MsIEJNQTE1MF9MT1dfR19IWVNUX01TSywKKwkJCQlCTUExNTBfTE9XX0dfSFlTVF9SRUcpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBibWExNTBfd3JpdGVfYnl0ZShibWExNTAtPmNsaWVudCwgQk1BMTUwX0xPV19HX0RVUl9SRUcsIGR1cik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGJtYTE1MF93cml0ZV9ieXRlKGJtYTE1MC0+Y2xpZW50LCBCTUExNTBfTE9XX0dfVEhSRVNfUkVHLCB0aHJlcyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gYm1hMTUwX3NldF9yZWdfYml0cyhibWExNTAtPmNsaWVudCwgISFlbmFibGUsCisJCQkJQk1BMTUwX0xPV19HX0VOX1BPUywgQk1BMTUwX0xPV19HX0VOX01TSywKKwkJCQlCTUExNTBfTE9XX0dfRU5fUkVHKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYm1hMTUwX3NldF9oaWdoX2dfaW50ZXJydXB0KHN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwLAorCQkJCQl1OCBlbmFibGUsIHU4IGh5c3QsIHU4IGR1ciwgdTggdGhyZXMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBibWExNTBfc2V0X3JlZ19iaXRzKGJtYTE1MC0+Y2xpZW50LCBoeXN0LAorCQkJCUJNQTE1MF9ISUdIX0dfSFlTVF9QT1MsIEJNQTE1MF9ISUdIX0dfSFlTVF9NU0ssCisJCQkJQk1BMTUwX0hJR0hfR19IWVNUX1JFRyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGJtYTE1MF93cml0ZV9ieXRlKGJtYTE1MC0+Y2xpZW50LAorCQkJCUJNQTE1MF9ISUdIX0dfRFVSX1JFRywgZHVyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3dyaXRlX2J5dGUoYm1hMTUwLT5jbGllbnQsCisJCQkJQk1BMTUwX0hJR0hfR19USFJFU19SRUcsIHRocmVzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBibWExNTBfc2V0X3JlZ19iaXRzKGJtYTE1MC0+Y2xpZW50LCAhIWVuYWJsZSwKKwkJCQlCTUExNTBfSElHSF9HX0VOX1BPUywgQk1BMTUwX0hJR0hfR19FTl9NU0ssCisJCQkJQk1BMTUwX0hJR0hfR19FTl9SRUcpOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJtYTE1MF9zZXRfYW55X21vdGlvbl9pbnRlcnJ1cHQoc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAsCisJCQkJCQl1OCBlbmFibGUsIHU4IGR1ciwgdTggdGhyZXMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBibWExNTBfc2V0X3JlZ19iaXRzKGJtYTE1MC0+Y2xpZW50LCBkdXIsCisJCQkJQk1BMTUwX0FOWV9NT1RJT05fRFVSX1BPUywKKwkJCQlCTUExNTBfQU5ZX01PVElPTl9EVVJfTVNLLAorCQkJCUJNQTE1MF9BTllfTU9USU9OX0RVUl9SRUcpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBibWExNTBfd3JpdGVfYnl0ZShibWExNTAtPmNsaWVudCwKKwkJCQlCTUExNTBfQU5ZX01PVElPTl9USFJFU19SRUcsIHRocmVzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3NldF9yZWdfYml0cyhibWExNTAtPmNsaWVudCwgISFlbmFibGUsCisJCQkJQk1BMTUwX0FEVl9JTlRfRU5fUE9TLCBCTUExNTBfQURWX0lOVF9FTl9NU0ssCisJCQkJQk1BMTUwX0FEVl9JTlRfRU5fUkVHKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBibWExNTBfc2V0X3JlZ19iaXRzKGJtYTE1MC0+Y2xpZW50LCAhIWVuYWJsZSwKKwkJCQlCTUExNTBfQU5ZX01PVElPTl9FTl9QT1MsCisJCQkJQk1BMTUwX0FOWV9NT1RJT05fRU5fTVNLLAorCQkJCUJNQTE1MF9BTllfTU9USU9OX0VOX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGJtYTE1MF9yZXBvcnRfeHl6KHN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwKQoreworCXU4IGRhdGFbQk1BMTUwX1hZWl9EQVRBX1NJWkVdOworCXMxNiB4LCB5LCB6OworCXMzMiByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShibWExNTAtPmNsaWVudCwKKwkJCUJNQTE1MF9BQ0NfWF9MU0JfUkVHLCBCTUExNTBfWFlaX0RBVEFfU0laRSwgZGF0YSk7CisJaWYgKHJldCAhPSBCTUExNTBfWFlaX0RBVEFfU0laRSkKKwkJcmV0dXJuOworCisJeCA9ICgoMHhjMCAmIGRhdGFbMF0pID4+IDYpIHwgKGRhdGFbMV0gPDwgMik7CisJeSA9ICgoMHhjMCAmIGRhdGFbMl0pID4+IDYpIHwgKGRhdGFbM10gPDwgMik7CisJeiA9ICgoMHhjMCAmIGRhdGFbNF0pID4+IDYpIHwgKGRhdGFbNV0gPDwgMik7CisKKwkvKiBzaWduIGV4dGVuc2lvbiAqLworCXggPSAoczE2KSAoeCA8PCA2KSA+PiA2OworCXkgPSAoczE2KSAoeSA8PCA2KSA+PiA2OworCXogPSAoczE2KSAoeiA8PCA2KSA+PiA2OworCisJaW5wdXRfcmVwb3J0X2FicyhibWExNTAtPmlucHV0LCBBQlNfWCwgeCk7CisJaW5wdXRfcmVwb3J0X2FicyhibWExNTAtPmlucHV0LCBBQlNfWSwgeSk7CisJaW5wdXRfcmVwb3J0X2FicyhibWExNTAtPmlucHV0LCBBQlNfWiwgeik7CisJaW5wdXRfc3luYyhibWExNTAtPmlucHV0KTsKK30KKworc3RhdGljIGlycXJldHVybl90IGJtYTE1MF9pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlibWExNTBfcmVwb3J0X3h5eihkZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBibWExNTBfcG9sbChzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqZGV2KQoreworCWJtYTE1MF9yZXBvcnRfeHl6KGRldi0+cHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgYm1hMTUwX29wZW4oc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTApCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZibWExNTAtPmNsaWVudC0+ZGV2KTsKKwlpZiAoZXJyb3IgJiYgZXJyb3IgIT0gLUVOT1NZUykKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBTZWUgaWYgcnVudGltZSBQTSB3b2tlIHVwIHRoZSBkZXZpY2UuIElmIHJ1bnRpbWUgUE0KKwkgKiBpcyBkaXNhYmxlZCB3ZSBuZWVkIHRvIGRvIGl0IG91cnNlbHZlcy4KKwkgKi8KKwlpZiAoYm1hMTUwLT5tb2RlICE9IEJNQTE1MF9NT0RFX05PUk1BTCkgeworCQllcnJvciA9IGJtYTE1MF9zZXRfbW9kZShibWExNTAsIEJNQTE1MF9NT0RFX05PUk1BTCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm1hMTUwX2Nsb3NlKHN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwKQoreworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJmJtYTE1MC0+Y2xpZW50LT5kZXYpOworCisJaWYgKGJtYTE1MC0+bW9kZSAhPSBCTUExNTBfTU9ERV9TTEVFUCkKKwkJYm1hMTUwX3NldF9tb2RlKGJtYTE1MCwgQk1BMTUwX01PREVfU0xFRVApOworfQorCitzdGF0aWMgaW50IGJtYTE1MF9pcnFfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0KTsKKworCXJldHVybiBibWExNTBfb3BlbihibWExNTApOworfQorCitzdGF0aWMgdm9pZCBibWExNTBfaXJxX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQoreworCXN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOworCisJYm1hMTUwX2Nsb3NlKGJtYTE1MCk7Cit9CisKK3N0YXRpYyB2b2lkIGJtYTE1MF9wb2xsX29wZW4oc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlwb2xsX2RldikKK3sKKwlzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCA9IGlwb2xsX2Rldi0+cHJpdmF0ZTsKKworCWJtYTE1MF9vcGVuKGJtYTE1MCk7Cit9CisKK3N0YXRpYyB2b2lkIGJtYTE1MF9wb2xsX2Nsb3NlKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICppcG9sbF9kZXYpCit7CisJc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAgPSBpcG9sbF9kZXYtPnByaXZhdGU7CisKKwlibWExNTBfY2xvc2UoYm1hMTUwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYm1hMTUwX2luaXRpYWxpemUoc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBibWExNTBfY2ZnICpjZmcpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBibWExNTBfc29mdF9yZXNldChibWExNTApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBibWExNTBfc2V0X2JhbmR3aWR0aChibWExNTAsIGNmZy0+YmFuZHdpZHRoKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3NldF9yYW5nZShibWExNTAsIGNmZy0+cmFuZ2UpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKGJtYTE1MC0+Y2xpZW50LT5pcnEpIHsKKwkJZXJyb3IgPSBibWExNTBfc2V0X2FueV9tb3Rpb25faW50ZXJydXB0KGJtYTE1MCwKKwkJCQkJY2ZnLT5hbnlfbW90aW9uX2ludCwKKwkJCQkJY2ZnLT5hbnlfbW90aW9uX2R1ciwKKwkJCQkJY2ZnLT5hbnlfbW90aW9uX3RocmVzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCisJCWVycm9yID0gYm1hMTUwX3NldF9oaWdoX2dfaW50ZXJydXB0KGJtYTE1MCwKKwkJCQkJY2ZnLT5oZ19pbnQsIGNmZy0+aGdfaHlzdCwKKwkJCQkJY2ZnLT5oZ19kdXIsIGNmZy0+aGdfdGhyZXMpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJZXJyb3IgPSBibWExNTBfc2V0X2xvd19nX2ludGVycnVwdChibWExNTAsCisJCQkJCWNmZy0+bGdfaW50LCBjZmctPmxnX2h5c3QsCisJCQkJCWNmZy0+bGdfZHVyLCBjZmctPmxnX3RocmVzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiBibWExNTBfc2V0X21vZGUoYm1hMTUwLCBCTUExNTBfTU9ERV9TTEVFUCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBibWExNTBfaW5pdF9pbnB1dF9kZXZpY2Uoc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAsCisJCQkJCQlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCWlkZXYtPm5hbWUgPSBCTUExNTBfRFJJVkVSOworCWlkZXYtPnBoeXMgPSBCTUExNTBfRFJJVkVSICIvaW5wdXQwIjsKKwlpZGV2LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKKwlpZGV2LT5kZXYucGFyZW50ID0gJmJtYTE1MC0+Y2xpZW50LT5kZXY7CisKKwlpZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0FCUyk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaWRldiwgQUJTX1gsIEFCU01JTl9BQ0NfVkFMLCBBQlNNQVhfQUNDX1ZBTCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaWRldiwgQUJTX1ksIEFCU01JTl9BQ0NfVkFMLCBBQlNNQVhfQUNDX1ZBTCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaWRldiwgQUJTX1osIEFCU01JTl9BQ0NfVkFMLCBBQlNNQVhfQUNDX1ZBTCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJtYTE1MF9yZWdpc3Rlcl9pbnB1dF9kZXZpY2Uoc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTApCit7CisJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKwlpbnQgZXJyb3I7CisKKwlpZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJtYTE1MF9pbml0X2lucHV0X2RldmljZShibWExNTAsIGlkZXYpOworCisJaWRldi0+b3BlbiA9IGJtYTE1MF9pcnFfb3BlbjsKKwlpZGV2LT5jbG9zZSA9IGJtYTE1MF9pcnFfY2xvc2U7CisJaW5wdXRfc2V0X2RydmRhdGEoaWRldiwgYm1hMTUwKTsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlkZXYpOworCWlmIChlcnJvcikgeworCQlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWJtYTE1MC0+aW5wdXQgPSBpZGV2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWExNTBfcmVnaXN0ZXJfcG9sbGVkX2RldmljZShzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCkKK3sKKwlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqaXBvbGxfZGV2OworCWludCBlcnJvcjsKKworCWlwb2xsX2RldiA9IGlucHV0X2FsbG9jYXRlX3BvbGxlZF9kZXZpY2UoKTsKKwlpZiAoIWlwb2xsX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpcG9sbF9kZXYtPnByaXZhdGUgPSBibWExNTA7CisJaXBvbGxfZGV2LT5vcGVuID0gYm1hMTUwX3BvbGxfb3BlbjsKKwlpcG9sbF9kZXYtPmNsb3NlID0gYm1hMTUwX3BvbGxfY2xvc2U7CisJaXBvbGxfZGV2LT5wb2xsID0gYm1hMTUwX3BvbGw7CisJaXBvbGxfZGV2LT5wb2xsX2ludGVydmFsID0gQk1BMTUwX1BPTExfSU5URVJWQUw7CisJaXBvbGxfZGV2LT5wb2xsX2ludGVydmFsX21pbiA9IEJNQTE1MF9QT0xMX01JTjsKKwlpcG9sbF9kZXYtPnBvbGxfaW50ZXJ2YWxfbWF4ID0gQk1BMTUwX1BPTExfTUFYOworCisJYm1hMTUwX2luaXRfaW5wdXRfZGV2aWNlKGJtYTE1MCwgaXBvbGxfZGV2LT5pbnB1dCk7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoaXBvbGxfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKGlwb2xsX2Rldik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlibWExNTAtPmlucHV0X3BvbGxlZCA9IGlwb2xsX2RldjsKKwlibWExNTAtPmlucHV0ID0gaXBvbGxfZGV2LT5pbnB1dDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWExNTBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwljb25zdCBzdHJ1Y3QgYm1hMTUwX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwljb25zdCBzdHJ1Y3QgYm1hMTUwX2NmZyAqY2ZnOworCXN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwOworCWludCBjaGlwX2lkOworCWludCBlcnJvcjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQk1BMTUwX0NISVBfSURfUkVHKTsKKwlpZiAoY2hpcF9pZCAhPSBCTUExNTBfQ0hJUF9JRCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkJNQTE1MCBjaGlwIGlkIGVycm9yOiAlZFxuIiwgY2hpcF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJtYTE1MCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibWExNTBfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghYm1hMTUwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJtYTE1MC0+Y2xpZW50ID0gY2xpZW50OworCisJaWYgKHBkYXRhKSB7CisJCWlmIChwZGF0YS0+aXJxX2dwaW9fY2ZnKSB7CisJCQllcnJvciA9IHBkYXRhLT5pcnFfZ3Bpb19jZmcoKTsKKwkJCWlmIChlcnJvcikgeworCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCQkiSVJRIEdQSU8gY29uZi4gZXJyb3IgJWQsIGVycm9yICVkXG4iLAorCQkJCQljbGllbnQtPmlycSwgZXJyb3IpOworCQkJCWdvdG8gZXJyX2ZyZWVfbWVtOworCQkJfQorCQl9CisJCWNmZyA9ICZwZGF0YS0+Y2ZnOworCX0gZWxzZSB7CisJCWNmZyA9ICZkZWZhdWx0X2NmZzsKKwl9CisKKwllcnJvciA9IGJtYTE1MF9pbml0aWFsaXplKGJtYTE1MCwgY2ZnKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCisJaWYgKGNsaWVudC0+aXJxID4gMCkgeworCQllcnJvciA9IGJtYTE1MF9yZWdpc3Rlcl9pbnB1dF9kZXZpY2UoYm1hMTUwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJfZnJlZV9tZW07CisKKwkJZXJyb3IgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKKwkJCQkJTlVMTCwgYm1hMTUwX2lycV90aHJlYWQsCisJCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX09ORVNIT1QsCisJCQkJCUJNQTE1MF9EUklWRVIsIGJtYTE1MCk7CisJCWlmIChlcnJvcikgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJImlycSByZXF1ZXN0IGZhaWxlZCAlZCwgZXJyb3IgJWRcbiIsCisJCQkJY2xpZW50LT5pcnEsIGVycm9yKTsKKwkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGJtYTE1MC0+aW5wdXQpOworCQkJZ290byBlcnJfZnJlZV9tZW07CisJCX0KKwl9IGVsc2UgeworCQllcnJvciA9IGJtYTE1MF9yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGJtYTE1MCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGJtYTE1MCk7CisKKwlwbV9ydW50aW1lX2VuYWJsZSgmY2xpZW50LT5kZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX21lbToKKwlrZnJlZShibWExNTApOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYm1hMTUwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoJmNsaWVudC0+ZGV2KTsKKworCWlmIChjbGllbnQtPmlycSA+IDApIHsKKwkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGJtYTE1MCk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGJtYTE1MC0+aW5wdXQpOworCX0gZWxzZSB7CisJCWlucHV0X3VucmVnaXN0ZXJfcG9sbGVkX2RldmljZShibWExNTAtPmlucHV0X3BvbGxlZCk7CisJCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShibWExNTAtPmlucHV0X3BvbGxlZCk7CisJfQorCisJa2ZyZWUoYm1hMTUwKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGJtYTE1MF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlyZXR1cm4gYm1hMTUwX3NldF9tb2RlKGJtYTE1MCwgQk1BMTUwX01PREVfU0xFRVApOworfQorCitzdGF0aWMgaW50IGJtYTE1MF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJldHVybiBibWExNTBfc2V0X21vZGUoYm1hMTUwLCBCTUExNTBfTU9ERV9OT1JNQUwpOworfQorI2VuZGlmCisKK3N0YXRpYyBVTklWRVJTQUxfREVWX1BNX09QUyhibWExNTBfcG0sIGJtYTE1MF9zdXNwZW5kLCBibWExNTBfcmVzdW1lLCBOVUxMKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGJtYTE1MF9pZFtdID0geworCXsgImJtYTE1MCIsIDAgfSwKKwl7ICJzbWIzODAiLCAwIH0sCisJeyAiYm1hMDIzIiwgMCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGJtYTE1MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBibWExNTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9IEJNQTE1MF9EUklWRVIsCisJCS5wbQk9ICZibWExNTBfcG0sCisJfSwKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5pZF90YWJsZQk9IGJtYTE1MF9pZCwKKwkucHJvYmUJCT0gYm1hMTUwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYm1hMTUwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBCTUExNTBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYm1hMTUwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBCTUExNTBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZibWExNTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxiZXJ0IFpoYW5nIDx4dS56aGFuZ0Bib3NjaC1zZW5zb3J0ZWMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCTUExNTAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KEJNQTE1MF9pbml0KTsKK21vZHVsZV9leGl0KEJNQTE1MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9jbWEzMDAwX2QweC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2NtYTMwMDBfZDB4LmMKaW5kZXggMTYzM2I2My4uODA3OTNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2NtYTMwMDBfZDB4LmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2NtYTMwMDBfZDB4LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9jbWEzMDAwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJjbWEzMDAwX2QweC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvZG0zNTVldm1fa2V5cy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2RtMzU1ZXZtX2tleXMuYwppbmRleCAxOWFmNjgyLi43MjgzZGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvZG0zNTVldm1fa2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9kbTM1NWV2bV9rZXlzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2kyYy9kbTM1NWV2bV9tc3AuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2l4cDR4eC1iZWVwZXIuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9peHA0eHgtYmVlcGVyLmMKaW5kZXggMWYzODMwMi4uMzAyYWI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2l4cDR4eC1iZWVwZXIuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvaXhwNHh4LWJlZXBlci5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlpbnB1dF9kZXYtPmV2ZW50ID0gaXhwNHh4X3Nwa3JfZXZlbnQ7CiAKIAllcnIgPSByZXF1ZXN0X2lycShJUlFfSVhQNFhYX1RJTUVSMiwgJml4cDR4eF9zcGtyX2ludGVycnVwdCwKLQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9fU1VTUEVORCwgIml4cDR4eC1iZWVwZXIiLAorCQkJICBJUlFGX05PX1NVU1BFTkQsICJpeHA0eHgtYmVlcGVyIiwKIAkJCSAgKHZvaWQgKikgZGV2LT5pZCk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfZnJlZV9kZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvbWMxMzc4My1wd3JidXR0b24uYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9tYzEzNzgzLXB3cmJ1dHRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjA1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvbWMxMzc4My1wd3JidXR0b24uYwpAQCAtMCwwICsxLDI4MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUGhpbGlwcGUgUsOpdG9ybmF6CisgKgorICogQmFzZWQgb24gdHdsNDAzMC1wd3JidXR0b24gZHJpdmVyIGJ5OgorICogICAgIFBldGVyIERlIFNjaHJpanZlciA8cGV0ZXIuZGUtc2NocmlqdmVyQG5va2lhLmNvbT4KKyAqICAgICBGZWxpcGUgQmFsYmkgPGZlbGlwZS5iYWxiaUBub2tpYS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKKyAqIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBTdWl0ZSA1MDAsIEJvc3RvbiwgTUEgMDIxMTAtMTMzNSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21jMTM3ODMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RydWN0IG1jMTM3ODNfcHdyYiB7CisJc3RydWN0IGlucHV0X2RldiAqcHdyOworCXN0cnVjdCBtYzEzeHh4ICptYzEzNzgzOworI2RlZmluZSBNQzEzNzgzX1BXUkJfQjFfUE9MX0lOVkVSVAkoMSA8PCAwKQorI2RlZmluZSBNQzEzNzgzX1BXUkJfQjJfUE9MX0lOVkVSVAkoMSA8PCAxKQorI2RlZmluZSBNQzEzNzgzX1BXUkJfQjNfUE9MX0lOVkVSVAkoMSA8PCAyKQorCWludCBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBrZXltYXBbM107Cit9OworCisjZGVmaW5lIE1DMTM3ODNfUkVHX0lOVEVSUlVQVF9TRU5TRV8xCQk1CisjZGVmaW5lIE1DMTM3ODNfSVJRU0VOU0UxX09OT0ZEMVMJCSgxIDw8IDMpCisjZGVmaW5lIE1DMTM3ODNfSVJRU0VOU0UxX09OT0ZEMlMJCSgxIDw8IDQpCisjZGVmaW5lIE1DMTM3ODNfSVJRU0VOU0UxX09OT0ZEM1MJCSgxIDw8IDUpCisKKyNkZWZpbmUgTUMxMzc4M19SRUdfUE9XRVJfQ09OVFJPTF8yCQkxNQorI2RlZmluZSBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjFCREJOQwk0CisjZGVmaW5lIE1DMTM3ODNfUE9XRVJfQ09OVFJPTF8yX09OMkJEQk5DCTYKKyNkZWZpbmUgTUMxMzc4M19QT1dFUl9DT05UUk9MXzJfT04zQkRCTkMJOAorI2RlZmluZSBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjFCUlNURU4JKDEgPDwgMSkKKyNkZWZpbmUgTUMxMzc4M19QT1dFUl9DT05UUk9MXzJfT04yQlJTVEVOCSgxIDw8IDIpCisjZGVmaW5lIE1DMTM3ODNfUE9XRVJfQ09OVFJPTF8yX09OM0JSU1RFTgkoMSA8PCAzKQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYnV0dG9uX2lycShpbnQgaXJxLCB2b2lkICpfcHJpdikKK3sKKwlzdHJ1Y3QgbWMxMzc4M19wd3JiICpwcml2ID0gX3ByaXY7CisJaW50IHZhbDsKKworCW1jMTN4eHhfaXJxX2Fjayhwcml2LT5tYzEzNzgzLCBpcnEpOworCW1jMTN4eHhfcmVnX3JlYWQocHJpdi0+bWMxMzc4MywgTUMxMzc4M19SRUdfSU5URVJSVVBUX1NFTlNFXzEsICZ2YWwpOworCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIE1DMTM3ODNfSVJRX09OT0ZEMToKKwkJdmFsID0gdmFsICYgTUMxMzc4M19JUlFTRU5TRTFfT05PRkQxUyA/IDEgOiAwOworCQlpZiAocHJpdi0+ZmxhZ3MgJiBNQzEzNzgzX1BXUkJfQjFfUE9MX0lOVkVSVCkKKwkJCXZhbCBePSAxOworCQlpbnB1dF9yZXBvcnRfa2V5KHByaXYtPnB3ciwgcHJpdi0+a2V5bWFwWzBdLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgTUMxMzc4M19JUlFfT05PRkQyOgorCQl2YWwgPSB2YWwgJiBNQzEzNzgzX0lSUVNFTlNFMV9PTk9GRDJTID8gMSA6IDA7CisJCWlmIChwcml2LT5mbGFncyAmIE1DMTM3ODNfUFdSQl9CMl9QT0xfSU5WRVJUKQorCQkJdmFsIF49IDE7CisJCWlucHV0X3JlcG9ydF9rZXkocHJpdi0+cHdyLCBwcml2LT5rZXltYXBbMV0sIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBNQzEzNzgzX0lSUV9PTk9GRDM6CisJCXZhbCA9IHZhbCAmIE1DMTM3ODNfSVJRU0VOU0UxX09OT0ZEM1MgPyAxIDogMDsKKwkJaWYgKHByaXYtPmZsYWdzICYgTUMxMzc4M19QV1JCX0IzX1BPTF9JTlZFUlQpCisJCQl2YWwgXj0gMTsKKwkJaW5wdXRfcmVwb3J0X2tleShwcml2LT5wd3IsIHByaXYtPmtleW1hcFsyXSwgdmFsKTsKKwkJYnJlYWs7CisJfQorCisJaW5wdXRfc3luYyhwcml2LT5wd3IpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYzEzNzgzX3B3cmJ1dHRvbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBtYzEzeHh4X2J1dHRvbnNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IG1jMTN4eHggKm1jMTM3ODMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGlucHV0X2RldiAqcHdyOworCXN0cnVjdCBtYzEzNzgzX3B3cmIgKnByaXY7CisJaW50IGVyciA9IDA7CisJaW50IHJlZyA9IDA7CisKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwd3IgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXB3cikgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBwb3dlciBidXR0b25cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgcG93ZXIgYnV0dG9uXG4iKTsKKwkJZ290byBmcmVlX2lucHV0X2RldjsKKwl9CisKKwlyZWcgfD0gKHBkYXRhLT5iMW9uX2ZsYWdzICYgMHgzKSA8PCBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjFCREJOQzsKKwlyZWcgfD0gKHBkYXRhLT5iMm9uX2ZsYWdzICYgMHgzKSA8PCBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjJCREJOQzsKKwlyZWcgfD0gKHBkYXRhLT5iM29uX2ZsYWdzICYgMHgzKSA8PCBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjNCREJOQzsKKworCXByaXYtPnB3ciA9IHB3cjsKKwlwcml2LT5tYzEzNzgzID0gbWMxMzc4MzsKKworCW1jMTN4eHhfbG9jayhtYzEzNzgzKTsKKworCWlmIChwZGF0YS0+YjFvbl9mbGFncyAmIE1DMTM3ODNfQlVUVE9OX0VOQUJMRSkgeworCQlwcml2LT5rZXltYXBbMF0gPSBwZGF0YS0+YjFvbl9rZXk7CisJCWlmIChwZGF0YS0+YjFvbl9rZXkgIT0gS0VZX1JFU0VSVkVEKQorCQkJX19zZXRfYml0KHBkYXRhLT5iMW9uX2tleSwgcHdyLT5rZXliaXQpOworCisJCWlmIChwZGF0YS0+YjFvbl9mbGFncyAmIE1DMTM3ODNfQlVUVE9OX1BPTF9JTlZFUlQpCisJCQlwcml2LT5mbGFncyB8PSBNQzEzNzgzX1BXUkJfQjFfUE9MX0lOVkVSVDsKKworCQlpZiAocGRhdGEtPmIxb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9SRVNFVF9FTikKKwkJCXJlZyB8PSBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjFCUlNURU47CisKKwkJZXJyID0gbWMxM3h4eF9pcnFfcmVxdWVzdChtYzEzNzgzLCBNQzEzNzgzX0lSUV9PTk9GRDEsCisJCQkJCSAgYnV0dG9uX2lycSwgImIxb24iLCBwcml2KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiQ2FuJ3QgcmVxdWVzdCBpcnFcbiIpOworCQkJZ290byBmcmVlX3ByaXY7CisJCX0KKwl9CisKKwlpZiAocGRhdGEtPmIyb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpIHsKKwkJcHJpdi0+a2V5bWFwWzFdID0gcGRhdGEtPmIyb25fa2V5OworCQlpZiAocGRhdGEtPmIyb25fa2V5ICE9IEtFWV9SRVNFUlZFRCkKKwkJCV9fc2V0X2JpdChwZGF0YS0+YjJvbl9rZXksIHB3ci0+a2V5Yml0KTsKKworCQlpZiAocGRhdGEtPmIyb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9QT0xfSU5WRVJUKQorCQkJcHJpdi0+ZmxhZ3MgfD0gTUMxMzc4M19QV1JCX0IyX1BPTF9JTlZFUlQ7CisKKwkJaWYgKHBkYXRhLT5iMm9uX2ZsYWdzICYgTUMxMzc4M19CVVRUT05fUkVTRVRfRU4pCisJCQlyZWcgfD0gTUMxMzc4M19QT1dFUl9DT05UUk9MXzJfT04yQlJTVEVOOworCisJCWVyciA9IG1jMTN4eHhfaXJxX3JlcXVlc3QobWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQyLAorCQkJCQkgIGJ1dHRvbl9pcnEsICJiMm9uIiwgcHJpdik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIkNhbid0IHJlcXVlc3QgaXJxXG4iKTsKKwkJCWdvdG8gZnJlZV9pcnFfYjE7CisJCX0KKwl9CisKKwlpZiAocGRhdGEtPmIzb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpIHsKKwkJcHJpdi0+a2V5bWFwWzJdID0gcGRhdGEtPmIzb25fa2V5OworCQlpZiAocGRhdGEtPmIzb25fa2V5ICE9IEtFWV9SRVNFUlZFRCkKKwkJCV9fc2V0X2JpdChwZGF0YS0+YjNvbl9rZXksIHB3ci0+a2V5Yml0KTsKKworCQlpZiAocGRhdGEtPmIzb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9QT0xfSU5WRVJUKQorCQkJcHJpdi0+ZmxhZ3MgfD0gTUMxMzc4M19QV1JCX0IzX1BPTF9JTlZFUlQ7CisKKwkJaWYgKHBkYXRhLT5iM29uX2ZsYWdzICYgTUMxMzc4M19CVVRUT05fUkVTRVRfRU4pCisJCQlyZWcgfD0gTUMxMzc4M19QT1dFUl9DT05UUk9MXzJfT04zQlJTVEVOOworCisJCWVyciA9IG1jMTN4eHhfaXJxX3JlcXVlc3QobWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQzLAorCQkJCQkgIGJ1dHRvbl9pcnEsICJiM29uIiwgcHJpdik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIkNhbid0IHJlcXVlc3QgaXJxOiAlZFxuIiwgZXJyKTsKKwkJCWdvdG8gZnJlZV9pcnFfYjI7CisJCX0KKwl9CisKKwltYzEzeHh4X3JlZ19ybXcobWMxMzc4MywgTUMxMzc4M19SRUdfUE9XRVJfQ09OVFJPTF8yLCAweDNGRSwgcmVnKTsKKworCW1jMTN4eHhfdW5sb2NrKG1jMTM3ODMpOworCisJcHdyLT5uYW1lID0gIm1jMTM3ODNfcHdyYnV0dG9uIjsKKwlwd3ItPnBoeXMgPSAibWMxMzc4M19wd3JidXR0b24vaW5wdXQwIjsKKwlwd3ItPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJcHdyLT5rZXljb2RlID0gcHJpdi0+a2V5bWFwOworCXB3ci0+a2V5Y29kZW1heCA9IEFSUkFZX1NJWkUocHJpdi0+a2V5bWFwKTsKKwlwd3ItPmtleWNvZGVzaXplID0gc2l6ZW9mKHByaXYtPmtleW1hcFswXSk7CisJX19zZXRfYml0KEVWX0tFWSwgcHdyLT5ldmJpdCk7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocHdyKTsKKwlpZiAoZXJyKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIkNhbid0IHJlZ2lzdGVyIHBvd2VyIGJ1dHRvbjogJWRcbiIsIGVycik7CisJCWdvdG8gZnJlZV9pcnE7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwlyZXR1cm4gMDsKKworZnJlZV9pcnE6CisJbWMxM3h4eF9sb2NrKG1jMTM3ODMpOworCisJaWYgKHBkYXRhLT5iM29uX2ZsYWdzICYgTUMxMzc4M19CVVRUT05fRU5BQkxFKQorCQltYzEzeHh4X2lycV9mcmVlKG1jMTM3ODMsIE1DMTM3ODNfSVJRX09OT0ZEMywgcHJpdik7CisKK2ZyZWVfaXJxX2IyOgorCWlmIChwZGF0YS0+YjJvbl9mbGFncyAmIE1DMTM3ODNfQlVUVE9OX0VOQUJMRSkKKwkJbWMxM3h4eF9pcnFfZnJlZShtYzEzNzgzLCBNQzEzNzgzX0lSUV9PTk9GRDIsIHByaXYpOworCitmcmVlX2lycV9iMToKKwlpZiAocGRhdGEtPmIxb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpCisJCW1jMTN4eHhfaXJxX2ZyZWUobWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQxLCBwcml2KTsKKworZnJlZV9wcml2OgorCW1jMTN4eHhfdW5sb2NrKG1jMTM3ODMpOworCWtmcmVlKHByaXYpOworCitmcmVlX2lucHV0X2RldjoKKwlpbnB1dF9mcmVlX2RldmljZShwd3IpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWMxMzc4M19wd3JidXR0b25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1jMTM3ODNfcHdyYiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWNvbnN0IHN0cnVjdCBtYzEzeHh4X2J1dHRvbnNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxMzc4Myk7CisKKwlpZiAocGRhdGEtPmIzb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpCisJCW1jMTN4eHhfaXJxX2ZyZWUocHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQzLCBwcml2KTsKKwlpZiAocGRhdGEtPmIyb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpCisJCW1jMTN4eHhfaXJxX2ZyZWUocHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQyLCBwcml2KTsKKwlpZiAocGRhdGEtPmIxb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpCisJCW1jMTN4eHhfaXJxX2ZyZWUocHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQxLCBwcml2KTsKKworCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTM3ODMpOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocHJpdi0+cHdyKTsKKwlrZnJlZShwcml2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1jMTM3ODNfcHdyYnV0dG9uX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gbWMxMzc4M19wd3JidXR0b25fcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtYzEzNzgzX3B3cmJ1dHRvbl9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtYzEzNzgzLXB3cmJ1dHRvbiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtYzEzNzgzX3B3cmJ1dHRvbl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbWMxMzc4M19wd3JidXR0b25fZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KG1jMTM3ODNfcHdyYnV0dG9uX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWMxMzc4M19wd3JidXR0b25fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtYzEzNzgzX3B3cmJ1dHRvbl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobWMxMzc4M19wd3JidXR0b25fZXhpdCk7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06bWMxMzc4My1wd3JidXR0b24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUMxMzc4MyBQb3dlciBCdXR0b24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIlBoaWxpcHBlIFJldG9ybmF6Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvbW1hODQ1MC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL21tYTg0NTAuYwppbmRleCAwNzk0Nzc4Li40ZDYwMDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvbW1hODQ1MC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9tbWE4NDUwLmMKQEAgLTg4LDEzICs4OCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1tYTg0NTBfcmVhZF94eXooc3RydWN0IG1tYTg0NTAgKm0sIGludCAqeCwgaW50ICp5LCBpbnQgKnopCitzdGF0aWMgaW50IG1tYTg0NTBfcmVhZF9ibG9jayhzdHJ1Y3QgbW1hODQ1MCAqbSwgdW5zaWduZWQgb2ZmLAorCQkJICAgICAgdTggKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmMgPSBtLT5jbGllbnQ7Ci0JdTggYnVmZls2XTsKIAlpbnQgZXJyOwogCi0JZXJyID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoYywgTU1BODQ1MF9PVVRfWF9MU0IsIDYsIGJ1ZmYpOworCWVyciA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGMsIG9mZiwgc2l6ZSwgYnVmKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZjLT5kZXYsCiAJCQkiZmFpbGVkIHRvIHJlYWQgYmxvY2sgZGF0YSBhdCAweCUwMngsIGVycm9yICVkXG4iLApAQCAtMTAyLDEwICsxMDIsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCSp4ID0gKChidWZmWzFdIDw8IDQpICYgMHhmZjApIHwgKGJ1ZmZbMF0gJiAweGYpOwotCSp5ID0gKChidWZmWzNdIDw8IDQpICYgMHhmZjApIHwgKGJ1ZmZbMl0gJiAweGYpOwotCSp6ID0gKChidWZmWzVdIDw8IDQpICYgMHhmZjApIHwgKGJ1ZmZbNF0gJiAweGYpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNCw3ICsxMTAsNyBAQAogCXN0cnVjdCBtbWE4NDUwICptID0gZGV2LT5wcml2YXRlOwogCWludCB4LCB5LCB6OwogCWludCByZXQ7Ci0JaW50IGVycjsKKwl1OCBidWZbNl07CiAKIAlyZXQgPSBtbWE4NDUwX3JlYWQobSwgTU1BODQ1MF9TVEFUVVMpOwogCWlmIChyZXQgPCAwKQpAQCAtMTIzLDEwICsxMTksMTQgQEAKIAlpZiAoIShyZXQgJiBNTUE4NDUwX1NUQVRVU19aWFlEUikpCiAJCXJldHVybjsKIAotCWVyciA9IG1tYTg0NTBfcmVhZF94eXoobSwgJngsICZ5LCAmeik7Ci0JaWYgKGVycikKKwlyZXQgPSBtbWE4NDUwX3JlYWRfYmxvY2sobSwgTU1BODQ1MF9PVVRfWF9MU0IsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChyZXQgPCAwKQogCQlyZXR1cm47CiAKKwl4ID0gKChidWZbMV0gPDwgNCkgJiAweGZmMCkgfCAoYnVmWzBdICYgMHhmKTsKKwl5ID0gKChidWZbM10gPDwgNCkgJiAweGZmMCkgfCAoYnVmWzJdICYgMHhmKTsKKwl6ID0gKChidWZbNV0gPDwgNCkgJiAweGZmMCkgfCAoYnVmWzRdICYgMHhmKTsKKwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LT5pbnB1dCwgQUJTX1gsIHgpOwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LT5pbnB1dCwgQUJTX1ksIHkpOwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LT5pbnB1dCwgQUJTX1osIHopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3BtOHh4eC12aWJyYXRvci5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3BtOHh4eC12aWJyYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTkyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvcG04eHh4LXZpYnJhdG9yLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvcG04eHh4L2NvcmUuaD4KKworI2RlZmluZSBWSUJfRFJWCQkJMHg0QQorCisjZGVmaW5lIFZJQl9EUlZfU0VMX01BU0sJMHhmOAorI2RlZmluZSBWSUJfRFJWX1NFTF9TSElGVAkweDAzCisjZGVmaW5lIFZJQl9EUlZfRU5fTUFOVUFMX01BU0sJMHhmYworCisjZGVmaW5lIFZJQl9NQVhfTEVWRUxfbVYJKDMxMDApCisjZGVmaW5lIFZJQl9NSU5fTEVWRUxfbVYJKDEyMDApCisjZGVmaW5lIFZJQl9NQVhfTEVWRUxTCQkoVklCX01BWF9MRVZFTF9tViAtIFZJQl9NSU5fTEVWRUxfbVYpCisKKyNkZWZpbmUgTUFYX0ZGX1NQRUVECQkweGZmCisKKy8qKgorICogc3RydWN0IHBtOHh4eF92aWIgLSBzdHJ1Y3R1cmUgdG8gaG9sZCB2aWJyYXRvciBkYXRhCisgKiBAdmliX2lucHV0X2RldjogaW5wdXQgZGV2aWNlIHN1cHBvcnRpbmcgZm9yY2UgZmVlZGJhY2sKKyAqIEB3b3JrOiB3b3JrIHN0cnVjdHVyZSB0byBzZXQgdGhlIHZpYnJhdGlvbiBwYXJhbWV0ZXJzCisgKiBAZGV2OiBkZXZpY2Ugc3VwcG9ydGluZyBmb3JjZSBmZWVkYmFjaworICogQHNwZWVkOiBzcGVlZCBvZiB2aWJyYXRpb24gc2V0IGZyb20gdXNlcmxhbmQKKyAqIEBhY3RpdmU6IHN0YXRlIG9mIHZpYnJhdG9yCisgKiBAbGV2ZWw6IGxldmVsIG9mIHZpYnJhdGlvbiB0byBzZXQgaW4gdGhlIGNoaXAKKyAqIEByZWdfdmliX2RydjogVklCX0RSViByZWdpc3RlciB2YWx1ZQorICovCitzdHJ1Y3QgcG04eHh4X3ZpYiB7CisJc3RydWN0IGlucHV0X2RldiAqdmliX2lucHV0X2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IHNwZWVkOworCWludCBsZXZlbDsKKwlib29sIGFjdGl2ZTsKKwl1OCAgcmVnX3ZpYl9kcnY7Cit9OworCisvKioKKyAqIHBtOHh4eF92aWJfcmVhZF91OCAtIGhlbHBlciB0byByZWFkIGEgYnl0ZSBmcm9tIHBtaWMgY2hpcAorICogQHZpYjogcG9pbnRlciB0byB2aWJyYXRvciBzdHJ1Y3R1cmUKKyAqIEBkYXRhOiBwbGFjZWhvbGRlciBmb3IgZGF0YSB0byBiZSByZWFkCisgKiBAcmVnOiByZWdpc3RlciBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgcG04eHh4X3ZpYl9yZWFkX3U4KHN0cnVjdCBwbTh4eHhfdmliICp2aWIsCisJCQkJIHU4ICpkYXRhLCB1MTYgcmVnKQoreworCWludCByYzsKKworCXJjID0gcG04eHh4X3JlYWRiKHZpYi0+ZGV2LT5wYXJlbnQsIHJlZywgZGF0YSk7CisJaWYgKHJjIDwgMCkKKwkJZGV2X3dhcm4odmliLT5kZXYsICJFcnJvciByZWFkaW5nIHBtOHh4eCByZWcgMHgleCgweCV4KVxuIiwKKwkJCQlyZWcsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogcG04eHh4X3ZpYl93cml0ZV91OCAtIGhlbHBlciB0byB3cml0ZSBhIGJ5dGUgdG8gcG1pYyBjaGlwCisgKiBAdmliOiBwb2ludGVyIHRvIHZpYnJhdG9yIHN0cnVjdHVyZQorICogQGRhdGE6IGRhdGEgdG8gd3JpdGUKKyAqIEByZWc6IHJlZ2lzdGVyIGFkZHJlc3MKKyAqLworc3RhdGljIGludCBwbTh4eHhfdmliX3dyaXRlX3U4KHN0cnVjdCBwbTh4eHhfdmliICp2aWIsCisJCQkJIHU4IGRhdGEsIHUxNiByZWcpCit7CisJaW50IHJjOworCisJcmMgPSBwbTh4eHhfd3JpdGViKHZpYi0+ZGV2LT5wYXJlbnQsIHJlZywgZGF0YSk7CisJaWYgKHJjIDwgMCkKKwkJZGV2X3dhcm4odmliLT5kZXYsICJFcnJvciB3cml0aW5nIHBtOHh4eCByZWcgMHgleCgweCV4KVxuIiwKKwkJCQlyZWcsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogcG04eHh4X3ZpYl9zZXQgLSBoYW5kbGVyIHRvIHN0YXJ0L3N0b3AgdmlicmF0aW9uCisgKiBAdmliOiBwb2ludGVyIHRvIHZpYnJhdG9yIHN0cnVjdHVyZQorICogQG9uOiBzdGF0ZSB0byBzZXQKKyAqLworc3RhdGljIGludCBwbTh4eHhfdmliX3NldChzdHJ1Y3QgcG04eHh4X3ZpYiAqdmliLCBib29sIG9uKQoreworCWludCByYzsKKwl1OCB2YWwgPSB2aWItPnJlZ192aWJfZHJ2OworCisJaWYgKG9uKQorCQl2YWwgfD0gKCh2aWItPmxldmVsIDw8IFZJQl9EUlZfU0VMX1NISUZUKSAmIFZJQl9EUlZfU0VMX01BU0spOworCWVsc2UKKwkJdmFsICY9IH5WSUJfRFJWX1NFTF9NQVNLOworCisJcmMgPSBwbTh4eHhfdmliX3dyaXRlX3U4KHZpYiwgdmFsLCBWSUJfRFJWKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwl2aWItPnJlZ192aWJfZHJ2ID0gdmFsOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBtOHh4eF93b3JrX2hhbmRsZXIgLSB3b3JrZXIgdG8gc2V0IHZpYnJhdGlvbiBsZXZlbAorICogQHdvcms6IHBvaW50ZXIgdG8gd29ya19zdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgcG04eHh4X3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHBtOHh4eF92aWIgKnZpYiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcG04eHh4X3ZpYiwgd29yayk7CisJaW50IHJjOworCXU4IHZhbDsKKworCXJjID0gcG04eHh4X3ZpYl9yZWFkX3U4KHZpYiwgJnZhbCwgVklCX0RSVik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBwbWljIHZpYnJhdG9yIHN1cHBvcnRzIHZvbHRhZ2UgcmFuZ2VzIGZyb20gMS4yIHRvIDMuMVYsIHNvCisJICogc2NhbGUgdGhlIGxldmVsIHRvIGZpdCBpbnRvIHRoZXNlIHJhbmdlcy4KKwkgKi8KKwlpZiAodmliLT5zcGVlZCkgeworCQl2aWItPmFjdGl2ZSA9IHRydWU7CisJCXZpYi0+bGV2ZWwgPSAoKFZJQl9NQVhfTEVWRUxTICogdmliLT5zcGVlZCkgLyBNQVhfRkZfU1BFRUQpICsKKwkJCQkJCVZJQl9NSU5fTEVWRUxfbVY7CisJCXZpYi0+bGV2ZWwgLz0gMTAwOworCX0gZWxzZSB7CisJCXZpYi0+YWN0aXZlID0gZmFsc2U7CisJCXZpYi0+bGV2ZWwgPSBWSUJfTUlOX0xFVkVMX21WIC8gMTAwOworCX0KKworCXBtOHh4eF92aWJfc2V0KHZpYiwgdmliLT5hY3RpdmUpOworfQorCisvKioKKyAqIHBtOHh4eF92aWJfY2xvc2UgLSBjYWxsYmFjayBvZiBpbnB1dCBjbG9zZSBjYWxsYmFjaworICogQGRldjogaW5wdXQgZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBUdXJucyBvZmYgdGhlIHZpYnJhdG9yLgorICovCitzdGF0aWMgdm9pZCBwbTh4eHhfdmliX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcG04eHh4X3ZpYiAqdmliID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNhbmNlbF93b3JrX3N5bmMoJnZpYi0+d29yayk7CisJaWYgKHZpYi0+YWN0aXZlKQorCQlwbTh4eHhfdmliX3NldCh2aWIsIGZhbHNlKTsKK30KKworLyoqCisgKiBwbTh4eHhfdmliX3BsYXlfZWZmZWN0IC0gZnVuY3Rpb24gdG8gaGFuZGxlIHZpYiBlZmZlY3RzLgorICogQGRldjogaW5wdXQgZGV2aWNlIHBvaW50ZXIKKyAqIEBkYXRhOiBkYXRhIG9mIGVmZmVjdAorICogQGVmZmVjdDogZWZmZWN0IHRvIHBsYXkKKyAqCisgKiBDdXJyZW50bHkgdGhpcyBkcml2ZXIgc3VwcG9ydHMgb25seSBydW1ibGUgZWZmZWN0cy4KKyAqLworc3RhdGljIGludCBwbTh4eHhfdmliX3BsYXlfZWZmZWN0KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQkgIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKK3sKKwlzdHJ1Y3QgcG04eHh4X3ZpYiAqdmliID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXZpYi0+c3BlZWQgPSBlZmZlY3QtPnUucnVtYmxlLnN0cm9uZ19tYWduaXR1ZGUgPj4gODsKKwlpZiAoIXZpYi0+c3BlZWQpCisJCXZpYi0+c3BlZWQgPSBlZmZlY3QtPnUucnVtYmxlLndlYWtfbWFnbml0dWRlID4+IDk7CisKKwlzY2hlZHVsZV93b3JrKCZ2aWItPndvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBtOHh4eF92aWJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKKworeworCXN0cnVjdCBwbTh4eHhfdmliICp2aWI7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnJvcjsKKwl1OCB2YWw7CisKKwl2aWIgPSBremFsbG9jKHNpemVvZigqdmliKSwgR0ZQX0tFUk5FTCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCF2aWIgfHwgIWlucHV0X2RldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCUlOSVRfV09SSygmdmliLT53b3JrLCBwbTh4eHhfd29ya19oYW5kbGVyKTsKKwl2aWItPmRldiA9ICZwZGV2LT5kZXY7CisJdmliLT52aWJfaW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCisJLyogb3BlcmF0ZSBpbiBtYW51YWwgbW9kZSAqLworCWVycm9yID0gcG04eHh4X3ZpYl9yZWFkX3U4KHZpYiwgJnZhbCwgVklCX0RSVik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJfZnJlZV9tZW07CisJdmFsICY9IH5WSUJfRFJWX0VOX01BTlVBTF9NQVNLOworCWVycm9yID0gcG04eHh4X3ZpYl93cml0ZV91OCh2aWIsIHZhbCwgVklCX0RSVik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJfZnJlZV9tZW07CisKKwl2aWItPnJlZ192aWJfZHJ2ID0gdmFsOworCisJaW5wdXRfZGV2LT5uYW1lID0gInBtOHh4eF92aWJfZmZtZW1sZXNzIjsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAxOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW5wdXRfZGV2LT5jbG9zZSA9IHBtOHh4eF92aWJfY2xvc2U7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCB2aWIpOworCWlucHV0X3NldF9jYXBhYmlsaXR5KHZpYi0+dmliX2lucHV0X2RldiwgRVZfRkYsIEZGX1JVTUJMRSk7CisKKwllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGlucHV0X2RldiwgTlVMTCwKKwkJCQkJcG04eHh4X3ZpYl9wbGF5X2VmZmVjdCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJjb3VsZG4ndCByZWdpc3RlciB2aWJyYXRvciBhcyBGRiBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9kZXN0cm95X21lbWxlc3M7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdmliKTsKKwlyZXR1cm4gMDsKKworZXJyX2Rlc3Ryb3lfbWVtbGVzczoKKwlpbnB1dF9mZl9kZXN0cm95KGlucHV0X2Rldik7CitlcnJfZnJlZV9tZW06CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwlrZnJlZSh2aWIpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwbTh4eHhfdmliX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbTh4eHhfdmliICp2aWIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHZpYi0+dmliX2lucHV0X2Rldik7CisJa2ZyZWUodmliKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgcG04eHh4X3ZpYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG04eHh4X3ZpYiAqdmliID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwkvKiBUdXJuIG9mZiB0aGUgdmlicmF0b3IgKi8KKwlwbTh4eHhfdmliX3NldCh2aWIsIGZhbHNlKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhwbTh4eHhfdmliX3BtX29wcywgcG04eHh4X3ZpYl9zdXNwZW5kLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcG04eHh4X3ZpYl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBtOHh4eF92aWJfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwbTh4eHhfdmliX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInBtOHh4eC12aWIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJnBtOHh4eF92aWJfcG1fb3BzLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwbTh4eHhfdmliX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwbTh4eHhfdmliX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChwbTh4eHhfdmliX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcG04eHh4X3ZpYl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBtOHh4eF92aWJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBtOHh4eF92aWJfZXhpdCk7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06cG04eHh4X3ZpYiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQTUlDOHh4eCB2aWJyYXRvciBkcml2ZXIgYmFzZWQgb24gZmYtbWVtbGVzcyBmcmFtZXdvcmsiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkFteSBNYWxvY2hlIDxhbWFsb2NoZUBjb2RlYXVyb3JhLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy90d2w2MDQwLXZpYnJhLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvdHdsNjA0MC12aWJyYS5jCmluZGV4IGM0MzAwMmUuLmFkMTUzYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy90d2w2MDQwLXZpYnJhLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3R3bDYwNDAtdmlicmEuYwpAQCAtNzQsMTIgKzc0LDEyIEBACiAJaWYgKHN0YXR1cyAmIFRXTDYwNDBfVklCTE9DREVUKSB7CiAJCWRldl93YXJuKGluZm8tPmRldiwgIkxlZnQgVmlicmF0b3Igb3ZlcmN1cnJlbnQgZGV0ZWN0ZWRcbiIpOwogCQl0d2w2MDQwX2NsZWFyX2JpdHModHdsNjA0MCwgVFdMNjA0MF9SRUdfVklCQ1RMTCwKLQkJCQkgICBUV0w2MDQwX1ZJQkVOQUwpOworCQkJCSAgIFRXTDYwNDBfVklCRU5BKTsKIAl9CiAJaWYgKHN0YXR1cyAmIFRXTDYwNDBfVklCUk9DREVUKSB7CiAJCWRldl93YXJuKGluZm8tPmRldiwgIlJpZ2h0IFZpYnJhdG9yIG92ZXJjdXJyZW50IGRldGVjdGVkXG4iKTsKIAkJdHdsNjA0MF9jbGVhcl9iaXRzKHR3bDYwNDAsIFRXTDYwNDBfUkVHX1ZJQkNUTFIsCi0JCQkJICAgVFdMNjA0MF9WSUJFTkFSKTsKKwkJCQkgICBUV0w2MDQwX1ZJQkVOQSk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtOTcsMjMgKzk3LDIzIEBACiAJfQogCiAJdHdsNjA0MF9wb3dlcihpbmZvLT50d2w2MDQwLCAxKTsKLQlpZiAodHdsNjA0MC0+cmV2IDw9IFRXTDYwNDBfUkVWX0VTMV8xKSB7CisJaWYgKHR3bDYwNDBfZ2V0X3JldmlkKHR3bDYwNDApIDw9IFRXTDYwNDBfUkVWX0VTMV8xKSB7CiAJCS8qCiAJCSAqIEVSUkFUQTogRGlzYWJsZSBvdmVyY3VycmVudCBwcm90ZWN0aW9uIGZvciBhdCBsZWFzdAogCQkgKiAzbXMgd2hlbiBlbmFibGluZyB2aWJyYXRvciBkcml2ZXJzIHRvIGF2b2lkIGZhbHNlCiAJCSAqIG92ZXJjdXJyZW50IGRldGVjdGlvbgogCQkgKi8KIAkJdHdsNjA0MF9yZWdfd3JpdGUodHdsNjA0MCwgVFdMNjA0MF9SRUdfVklCQ1RMTCwKLQkJCQkgIFRXTDYwNDBfVklCRU5BTCB8IFRXTDYwNDBfVklCQ1RSTEwpOworCQkJCSAgVFdMNjA0MF9WSUJFTkEgfCBUV0w2MDQwX1ZJQkNUUkwpOwogCQl0d2w2MDQwX3JlZ193cml0ZSh0d2w2MDQwLCBUV0w2MDQwX1JFR19WSUJDVExSLAotCQkJCSAgVFdMNjA0MF9WSUJFTkFSIHwgVFdMNjA0MF9WSUJDVFJMUik7CisJCQkJICBUV0w2MDQwX1ZJQkVOQSB8IFRXTDYwNDBfVklCQ1RSTCk7CiAJCXVzbGVlcF9yYW5nZSgzMDAwLCAzNTAwKTsKIAl9CiAKIAl0d2w2MDQwX3JlZ193cml0ZSh0d2w2MDQwLCBUV0w2MDQwX1JFR19WSUJDVExMLAotCQkJICBUV0w2MDQwX1ZJQkVOQUwpOworCQkJICBUV0w2MDQwX1ZJQkVOQSk7CiAJdHdsNjA0MF9yZWdfd3JpdGUodHdsNjA0MCwgVFdMNjA0MF9SRUdfVklCQ1RMUiwKLQkJCSAgVFdMNjA0MF9WSUJFTkFSKTsKKwkJCSAgVFdMNjA0MF9WSUJFTkEpOwogCiAJaW5mby0+ZW5hYmxlZCA9IHRydWU7CiB9CkBAIC0yMDEsNiArMjAxLDEzIEBACiAJc3RydWN0IHZpYnJhX2luZm8gKmluZm8gPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dCk7CiAJaW50IHJldDsKIAorCS8qIERvIG5vdCBhbGxvdyBlZmZlY3QsIHdoaWxlIHRoZSByb3V0aW5nIGlzIHNldCB0byB1c2UgYXVkaW8gKi8KKwlyZXQgPSB0d2w2MDQwX2dldF92aWJyYWxyX3N0YXR1cyhpbmZvLT50d2w2MDQwKTsKKwlpZiAocmV0ICYgVFdMNjA0MF9WSUJTRUwpIHsKKwkJZGV2X2luZm8oJmlucHV0LT5kZXYsICJWaWJyYSBpcyBjb25maWd1cmVkIGZvciBhdWRpb1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCiAJaW5mby0+d2Vha19zcGVlZCA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7CiAJaW5mby0+c3Ryb25nX3NwZWVkID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOwogCWluZm8tPmRpcmVjdGlvbiA9IGVmZmVjdC0+ZGlyZWN0aW9uIDwgRUZGRUNUX0RJUl8xODBfREVHID8gMSA6IC0xOwpAQCAtMjI4LDcgKzIzNSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZpbmZvLT5tdXRleCk7CiB9CiAKLSNpZiBDT05GSUdfUE1fU0xFRVAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgdHdsNjA0MF92aWJyYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCmluZGV4IDk5ZDU4NzYuLjAwMzU4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCkBAIC0yMywxMyArMjMsNiBAQAogI2luY2x1ZGUgInBzbW91c2UuaCIKICNpbmNsdWRlICJhbHBzLmgiCiAKLSN1bmRlZiBERUJVRwotI2lmZGVmIERFQlVHCi0jZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAiYWxwcy5jOiAiIGZvcm1hdCAiXG4iLCAjIyBhcmcpCi0jZWxzZQotI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KICNkZWZpbmUgQUxQU19PTERQUk9UTwkJMHgwMQkvKiBvbGQgc3R5bGUgaW5wdXQgKi8KICNkZWZpbmUgQUxQU19EVUFMUE9JTlQJCTB4MDIJLyogdG91Y2hwYWQgaGFzIHRyYWNrc3RpY2sgKi8KICNkZWZpbmUgQUxQU19QQVNTCQkweDA0CS8qIGRldmljZSBoYXMgYSBwYXNzLXRocm91Z2ggcG9ydCAqLwpAQCAtMjk3LDEwICsyOTAsMTAgQEAKIAkJICAgICAgcHNtb3VzZS0+cGFja2V0WzRdIHwKIAkJICAgICAgcHNtb3VzZS0+cGFja2V0WzVdKSAmIDB4ODApIHx8CiAJCSAgICAoIWFscHNfaXNfdmFsaWRfZmlyc3RfYnl0ZShwcml2LT5pLCBwc21vdXNlLT5wYWNrZXRbNl0pKSkgewotCQkJZGJnKCJyZWZ1c2luZyBwYWNrZXQgJXggJXggJXggJXggIgotCQkJICAgICIoc3VzcGVjdGVkIGludGVybGVhdmVkIHBzLzIpXG4iLAotCQkJICAgIHBzbW91c2UtPnBhY2tldFszXSwgcHNtb3VzZS0+cGFja2V0WzRdLAotCQkJICAgIHBzbW91c2UtPnBhY2tldFs1XSwgcHNtb3VzZS0+cGFja2V0WzZdKTsKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkJICAgICJyZWZ1c2luZyBwYWNrZXQgJXggJXggJXggJXggKHN1c3BlY3RlZCBpbnRlcmxlYXZlZCBwcy8yKVxuIiwKKwkJCQkgICAgcHNtb3VzZS0+cGFja2V0WzNdLCBwc21vdXNlLT5wYWNrZXRbNF0sCisJCQkJICAgIHBzbW91c2UtPnBhY2tldFs1XSwgcHNtb3VzZS0+cGFja2V0WzZdKTsKIAkJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOwogCQl9CiAKQEAgLTMxOSwxMyArMzEyLDEzIEBACiAJCSAqIFRoZXJlIGlzIGFsc28gcG9zc2liaWxpdHkgdGhhdCB3ZSBnb3QgNi1ieXRlIEFMUFMKIAkJICogcGFja2V0IGZvbGxvd2VkICBieSAzLWJ5dGUgcGFja2V0IGZyb20gdHJhY2twb2ludC4gV2UKIAkJICogY2FuIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZXNlIDIgc2NlbmFyaW9zIGJ1dAotCQkgKiBiZWNhc2UgdGhlIGxhdHRlciBpcyB1bmxpa2VseSB0byBoYXBwZW4gaW4gY291cnNlIG9mCisJCSAqIGJlY2F1c2UgdGhlIGxhdHRlciBpcyB1bmxpa2VseSB0byBoYXBwZW4gaW4gY291cnNlIG9mCiAJCSAqIG5vcm1hbCBvcGVyYXRpb24gKHVzZXIgd291bGQgbmVlZCB0byBwcmVzcyBhbGwKIAkJICogYnV0dG9ucyBvbiB0aGUgcGFkIGFuZCBzdGFydCBtb3ZpbmcgdHJhY2twb2ludAogCQkgKiB3aXRob3V0IHRvdWNoaW5nIHRoZSBwYWQgc3VyZmFjZSkgd2UgYXNzdW1lIGZvcm1lci4KIAkJICogRXZlbiBpZiB3ZSBhcmUgd3JvbmcgdGhlIHdvc3QgdGhpbmcgdGhhdCB3b3VsZCBoYXBwZW4KIAkJICogdGhlIGN1cnNvciB3b3VsZCBqdW1wIGJ1dCB3ZSBzaG91bGQgbm90IGdldCBwcm90b2NvbAotCQkgKiBkZXN5bmNocm9uaXphdGlvbi4KKwkJICogZGUtc3luY2hyb25pemF0aW9uLgogCQkgKi8KIAogCQlhbHBzX3JlcG9ydF9iYXJlX3BzMl9wYWNrZXQocHNtb3VzZSwgJnBzbW91c2UtPnBhY2tldFszXSwKQEAgLTM2MSwxMCArMzU0LDEwIEBACiAJCWlmICgocHNtb3VzZS0+cGFja2V0WzNdIHwKIAkJICAgICBwc21vdXNlLT5wYWNrZXRbNF0gfAogCQkgICAgIHBzbW91c2UtPnBhY2tldFs1XSkgJiAweDgwKSB7Ci0JCQlkYmcoInJlZnVzaW5nIHBhY2tldCAleCAleCAleCAiCi0JCQkgICAgIihzdXNwZWN0ZWQgaW50ZXJsZWF2ZWQgcHMvMilcbiIsCi0JCQkgICAgcHNtb3VzZS0+cGFja2V0WzNdLCBwc21vdXNlLT5wYWNrZXRbNF0sCi0JCQkgICAgcHNtb3VzZS0+cGFja2V0WzVdKTsKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkJICAgICJyZWZ1c2luZyBwYWNrZXQgJXggJXggJXggKHN1c3BlY3RlZCBpbnRlcmxlYXZlZCBwcy8yKVxuIiwKKwkJCQkgICAgcHNtb3VzZS0+cGFja2V0WzNdLCBwc21vdXNlLT5wYWNrZXRbNF0sCisJCQkJICAgIHBzbW91c2UtPnBhY2tldFs1XSk7CiAJCX0gZWxzZSB7CiAJCQlhbHBzX3Byb2Nlc3NfcGFja2V0KHBzbW91c2UpOwogCQl9CkBAIC0zOTYsMTYgKzM4OSwxOCBAQAogCX0KIAogCWlmICghYWxwc19pc192YWxpZF9maXJzdF9ieXRlKG1vZGVsLCBwc21vdXNlLT5wYWNrZXRbMF0pKSB7Ci0JCWRiZygicmVmdXNpbmcgcGFja2V0WzBdID0gJXggKG1hc2swID0gJXgsIGJ5dGUwID0gJXgpXG4iLAotCQkgICAgcHNtb3VzZS0+cGFja2V0WzBdLCBtb2RlbC0+bWFzazAsIG1vZGVsLT5ieXRlMCk7CisJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkgICAgInJlZnVzaW5nIHBhY2tldFswXSA9ICV4IChtYXNrMCA9ICV4LCBieXRlMCA9ICV4KVxuIiwKKwkJCSAgICBwc21vdXNlLT5wYWNrZXRbMF0sIG1vZGVsLT5tYXNrMCwgbW9kZWwtPmJ5dGUwKTsKIAkJcmV0dXJuIFBTTU9VU0VfQkFEX0RBVEE7CiAJfQogCiAJLyogQnl0ZXMgMiAtIDYgc2hvdWxkIGhhdmUgMCBpbiB0aGUgaGlnaGVzdCBiaXQgKi8KIAlpZiAocHNtb3VzZS0+cGt0Y250ID49IDIgJiYgcHNtb3VzZS0+cGt0Y250IDw9IDYgJiYKIAkgICAgKHBzbW91c2UtPnBhY2tldFtwc21vdXNlLT5wa3RjbnQgLSAxXSAmIDB4ODApKSB7Ci0JCWRiZygicmVmdXNpbmcgcGFja2V0WyVpXSA9ICV4XG4iLAotCQkgICAgcHNtb3VzZS0+cGt0Y250IC0gMSwgcHNtb3VzZS0+cGFja2V0W3BzbW91c2UtPnBrdGNudCAtIDFdKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgInJlZnVzaW5nIHBhY2tldFslaV0gPSAleFxuIiwKKwkJCSAgICBwc21vdXNlLT5wa3RjbnQgLSAxLAorCQkJICAgIHBzbW91c2UtPnBhY2tldFtwc21vdXNlLT5wa3RjbnQgLSAxXSk7CiAJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOwogCX0KIApAQCAtNDM5LDcgKzQzNCw4IEBACiAJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgcGFyYW0sIFBTTU9VU0VfQ01EX0dFVElORk8pKQogCQlyZXR1cm4gTlVMTDsKIAotCWRiZygiRTYgcmVwb3J0OiAlMi4yeCAlMi4yeCAlMi4yeCIsIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOworCXBzbW91c2VfZGJnKHBzbW91c2UsICJFNiByZXBvcnQ6ICUyLjJ4ICUyLjJ4ICUyLjJ4IiwKKwkJICAgIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOwogCiAJaWYgKHBhcmFtWzBdICE9IDAgfHwgcGFyYW1bMV0gIT0gMCB8fCAocGFyYW1bMl0gIT0gMTAgJiYgcGFyYW1bMl0gIT0gMTAwKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC00NTksNyArNDU1LDggQEAKIAlpZiAocHMyX2NvbW1hbmQocHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfR0VUSU5GTykpCiAJCXJldHVybiBOVUxMOwogCi0JZGJnKCJFNyByZXBvcnQ6ICUyLjJ4ICUyLjJ4ICUyLjJ4IiwgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CisJcHNtb3VzZV9kYmcocHNtb3VzZSwgIkU3IHJlcG9ydDogJTIuMnggJTIuMnggJTIuMngiLAorCQkgICAgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CiAKIAlpZiAodmVyc2lvbikgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlcykgJiYgcGFyYW1bMl0gIT0gcmF0ZXNbaV07IGkrKykKQEAgLTUyNyw3ICs1MjQsOCBAQAogCSAgICBwczJfY29tbWFuZChwczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9HRVRJTkZPKSkKIAkJcmV0dXJuIC0xOwogCi0JZGJnKCJTdGF0dXM6ICUyLjJ4ICUyLjJ4ICUyLjJ4IiwgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CisJcHNtb3VzZV9kYmcocHNtb3VzZSwgIlN0YXR1czogJTIuMnggJTIuMnggJTIuMngiLAorCQkgICAgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYwNSwxMiArNjAzLDEyIEBACiAJfQogCiAJaWYgKGFscHNfdGFwX21vZGUocHNtb3VzZSwgdHJ1ZSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxwcy5jOiBGYWlsZWQgdG8gZW5hYmxlIGhhcmR3YXJlIHRhcHBpbmdcbiIpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgIkZhaWxlZCB0byBlbmFibGUgaGFyZHdhcmUgdGFwcGluZ1xuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoYWxwc19hYnNvbHV0ZV9tb2RlKHBzbW91c2UpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWxwcy5jOiBGYWlsZWQgdG8gZW5hYmxlIGFic29sdXRlIG1vZGVcbiIpOworCQlwc21vdXNlX2Vycihwc21vdXNlLCAiRmFpbGVkIHRvIGVuYWJsZSBhYnNvbHV0ZSBtb2RlXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNjIxLDcgKzYxOSw3IEBACiAKIAkvKiBBTFBTIG5lZWRzIHN0cmVhbSBtb2RlLCBvdGhlcndpc2UgaXQgd29uJ3QgcmVwb3J0IGFueSBkYXRhICovCiAJaWYgKHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX1NFVFNUUkVBTSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbHBzLmM6IEZhaWxlZCB0byBlbmFibGUgc3RyZWFtIG1vZGVcbiIpOworCQlwc21vdXNlX2Vycihwc21vdXNlLCAiRmFpbGVkIHRvIGVuYWJsZSBzdHJlYW0gbW9kZVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guYwppbmRleCAzMjUwMzU2Li4wOWI5M2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW50ZWNoLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFudGVjaC5jCkBAIC0xMCw4ICsxMCw2IEBACiAgKiBUcmFkZW1hcmtzIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCiAgKi8KIAotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfQkFTRU5BTUUgIjogIiBmbXQKLQogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjUsMTMgKzIzLDEwIEBACiAjZGVmaW5lIGVsYW50ZWNoX2RlYnVnKGZtdCwgLi4uKQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJaWYgKGV0ZC0+ZGVidWcpCQkJCQkJXAotCQkJcHJpbnRrKEtFUk5fREVCVUcgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pOwlcCisJCQlwc21vdXNlX3ByaW50ayhLRVJOX0RFQlVHLCBwc21vdXNlLAkJXAorCQkJCQlmbXQsICMjX19WQV9BUkdTX18pOwkJXAogCX0gd2hpbGUgKDApCiAKLXN0YXRpYyBib29sIGZvcmNlX2VsYW50ZWNoOwotbW9kdWxlX3BhcmFtX25hbWVkKGZvcmNlX2VsYW50ZWNoLCBmb3JjZV9lbGFudGVjaCwgYm9vbCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2VsYW50ZWNoLCAiRm9yY2UgdGhlIEVsYW50ZWNoIFBTLzIgcHJvdG9jb2wgZXh0ZW5zaW9uIHRvIGJlIHVzZWQsIDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKGRlZmF1bHQpLiIpOwotCiAvKgogICogU2VuZCBhIFN5bmFwdGljcyBzdHlsZSBzbGljZWQgcXVlcnkgY29tbWFuZAogICovCkBAIC00MCw3ICszNSw3IEBACiB7CiAJaWYgKHBzbW91c2Vfc2xpY2VkX2NvbW1hbmQocHNtb3VzZSwgYykgfHwKIAkgICAgcHMyX2NvbW1hbmQoJnBzbW91c2UtPnBzMmRldiwgcGFyYW0sIFBTTU9VU0VfQ01EX0dFVElORk8pKSB7Ci0JCXByX2Vycigic3luYXB0aWNzX3NlbmRfY21kIHF1ZXJ5IDB4JTAyeCBmYWlsZWQuXG4iLCBjKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIiVzIHF1ZXJ5IDB4JTAyeCBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgYyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY5LDcgKzY0LDcgQEAKIAl9IHdoaWxlICh0cmllcyA+IDApOwogCiAJaWYgKHJjKQotCQlwcl9lcnIoInBzMiBjb21tYW5kIDB4JTAyeCBmYWlsZWQuXG4iLCBjb21tYW5kKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgInBzMiBjb21tYW5kIDB4JTAyeCBmYWlsZWQuXG4iLCBjb21tYW5kKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTg0LDcgKzc5LDcgQEAKIAl1bnNpZ25lZCBjaGFyIHBhcmFtWzNdOwogCWludCByYyA9IDA7CiAKLQlpZiAocmVnIDwgMHgxMCB8fCByZWcgPiAweDI2KQorCWlmIChyZWcgPCAweDA3IHx8IHJlZyA+IDB4MjYpCiAJCXJldHVybiAtMTsKIAogCWlmIChyZWcgPiAweDExICYmIHJlZyA8IDB4MjApCkBAIC0xMDgsMTIgKzEwMywyNCBAQAogCQkJcmMgPSAtMTsKIAkJfQogCQlicmVhazsKKworCWNhc2UgMyAuLi4gNDoKKwkJaWYgKGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIEVUUF9QUzJfQ1VTVE9NX0NPTU1BTkQpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUkVHSVNURVJfUkVBRFdSSVRFKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgRVRQX1BTMl9DVVNUT01fQ09NTUFORCkgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIHJlZykgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIHBhcmFtLCBQU01PVVNFX0NNRF9HRVRJTkZPKSkgeworCQkJcmMgPSAtMTsKKwkJfQorCQlicmVhazsKIAl9CiAKIAlpZiAocmMpCi0JCXByX2VycigiZmFpbGVkIHRvIHJlYWQgcmVnaXN0ZXIgMHglMDJ4LlxuIiwgcmVnKTsKLQllbHNlCisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJmYWlsZWQgdG8gcmVhZCByZWdpc3RlciAweCUwMnguXG4iLCByZWcpOworCWVsc2UgaWYgKGV0ZC0+aHdfdmVyc2lvbiAhPSA0KQogCQkqdmFsID0gcGFyYW1bMF07CisJZWxzZQorCQkqdmFsID0gcGFyYW1bMV07CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMjcsNyArMTM0LDcgQEAKIAlzdHJ1Y3QgZWxhbnRlY2hfZGF0YSAqZXRkID0gcHNtb3VzZS0+cHJpdmF0ZTsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKHJlZyA8IDB4MTAgfHwgcmVnID4gMHgyNikKKwlpZiAocmVnIDwgMHgwNyB8fCByZWcgPiAweDI2KQogCQlyZXR1cm4gLTE7CiAKIAlpZiAocmVnID4gMHgxMSAmJiByZWcgPCAweDIwKQpAQCAtMTU0LDExICsxNjEsMzggQEAKIAkJCXJjID0gLTE7CiAJCX0KIAkJYnJlYWs7CisKKwljYXNlIDM6CisJCWlmIChlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUFMyX0NVU1RPTV9DT01NQU5EKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgRVRQX1JFR0lTVEVSX1JFQURXUklURSkgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIEVUUF9QUzJfQ1VTVE9NX0NPTU1BTkQpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCByZWcpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUFMyX0NVU1RPTV9DT01NQU5EKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgdmFsKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgUFNNT1VTRV9DTURfU0VUU0NBTEUxMSkpIHsKKwkJCXJjID0gLTE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCWlmIChlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUFMyX0NVU1RPTV9DT01NQU5EKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgRVRQX1JFR0lTVEVSX1JFQURXUklURSkgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIEVUUF9QUzJfQ1VTVE9NX0NPTU1BTkQpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCByZWcpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUFMyX0NVU1RPTV9DT01NQU5EKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgRVRQX1JFR0lTVEVSX1JFQURXUklURSkgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIEVUUF9QUzJfQ1VTVE9NX0NPTU1BTkQpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCB2YWwpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBQU01PVVNFX0NNRF9TRVRTQ0FMRTExKSkgeworCQkJcmMgPSAtMTsKKwkJfQorCQlicmVhazsKIAl9CiAKIAlpZiAocmMpCi0JCXByX2VycigiZmFpbGVkIHRvIHdyaXRlIHJlZ2lzdGVyIDB4JTAyeCB3aXRoIHZhbHVlIDB4JTAyeC5cbiIsCi0JCQlyZWcsIHZhbCk7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsCisJCQkgICAgImZhaWxlZCB0byB3cml0ZSByZWdpc3RlciAweCUwMnggd2l0aCB2YWx1ZSAweCUwMnguXG4iLAorCQkJICAgIHJlZywgdmFsKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTE2NiwxMyArMjAwLDEzIEBACiAvKgogICogRHVtcCBhIGNvbXBsZXRlIG1vdXNlIG1vdmVtZW50IHBhY2tldCB0byB0aGUgc3lzbG9nCiAgKi8KLXN0YXRpYyB2b2lkIGVsYW50ZWNoX3BhY2tldF9kdW1wKHVuc2lnbmVkIGNoYXIgKnBhY2tldCwgaW50IHNpemUpCitzdGF0aWMgdm9pZCBlbGFudGVjaF9wYWNrZXRfZHVtcChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKIHsKIAlpbnQJaTsKIAotCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdCgiUFMvMiBwYWNrZXQgWyIpKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQlwcmludGsoIiVzMHglMDJ4ICIsIChpKSA/ICIsICIgOiAiICIsIHBhY2tldFtpXSk7CisJcHNtb3VzZV9wcmludGsoS0VSTl9ERUJVRywgcHNtb3VzZSwgIlBTLzIgcGFja2V0IFsiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHNtb3VzZS0+cGt0c2l6ZTsgaSsrKQorCQlwcmludGsoIiVzMHglMDJ4ICIsIGkgPyAiLCAiIDogIiAiLCBwc21vdXNlLT5wYWNrZXRbaV0pOwogCXByaW50aygiXVxuIik7CiB9CiAKQEAgLTIyMyw3ICsyNTcsNyBAQAogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsCiAJCQkoKHBhY2tldFsxXSAmIDB4MGMpIDw8IDYpIHwgcGFja2V0WzJdKTsKIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLAotCQkJRVRQX1lNQVhfVjEgLSAoKChwYWNrZXRbMV0gJiAweDAzKSA8PCA4KSB8IHBhY2tldFszXSkpOworCQkJZXRkLT55X21heCAtICgoKHBhY2tldFsxXSAmIDB4MDMpIDw8IDgpIHwgcGFja2V0WzNdKSk7CiAJfQogCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX0ZJTkdFUiwgZmluZ2VycyA9PSAxKTsKQEAgLTIzMyw3ICsyNjcsNyBAQAogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHBhY2tldFswXSAmIDB4MDIpOwogCiAJaWYgKGV0ZC0+ZndfdmVyc2lvbiA8IDB4MDIwMDAwICYmCi0JICAgIChldGQtPmNhcGFiaWxpdGllcyAmIEVUUF9DQVBfSEFTX1JPQ0tFUikpIHsKKwkgICAgKGV0ZC0+Y2FwYWJpbGl0aWVzWzBdICYgRVRQX0NBUF9IQVNfUk9DS0VSKSkgewogCQkvKiByb2NrZXIgdXAgKi8KIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9GT1JXQVJELCBwYWNrZXRbMF0gJiAweDQwKTsKIAkJLyogcm9ja2VyIGRvd24gKi8KQEAgLTI3MywxMSArMzA3LDExIEBACiAJc3RydWN0IGVsYW50ZWNoX2RhdGEgKmV0ZCA9IHBzbW91c2UtPnByaXZhdGU7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OwogCXVuc2lnbmVkIGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKLQl1bnNpZ25lZCBpbnQgZmluZ2VycywgeDEgPSAwLCB5MSA9IDAsIHgyID0gMCwgeTIgPSAwLCB3aWR0aCA9IDAsIHByZXMgPSAwOworCXVuc2lnbmVkIGludCBmaW5nZXJzLCB4MSA9IDAsIHkxID0gMCwgeDIgPSAwLCB5MiA9IDA7CisJdW5zaWduZWQgaW50IHdpZHRoID0gMCwgcHJlcyA9IDA7CiAKIAkvKiBieXRlIDA6IG4xICBuMCAgIC4gICAuICAgLiAgIC4gICBSICAgTCAqLwogCWZpbmdlcnMgPSAocGFja2V0WzBdICYgMHhjMCkgPj4gNjsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCBmaW5nZXJzICE9IDApOwogCiAJc3dpdGNoIChmaW5nZXJzKSB7CiAJY2FzZSAzOgpAQCAtMjkwLDE4ICszMjQsMTUgQEAKIAkJLyogcGFzcyB0aHJvdWdoLi4uICovCiAJY2FzZSAxOgogCQkvKgotCQkgKiBieXRlIDE6ICAuICAgLiAgIC4gICAuICAgLiAgeDEwIHg5ICB4OAorCQkgKiBieXRlIDE6ICAuICAgLiAgIC4gICAuICB4MTEgeDEwIHg5ICB4OAogCQkgKiBieXRlIDI6IHg3ICB4NiAgeDUgIHg0ICB4NCAgeDIgIHgxICB4MAogCQkgKi8KLQkJeDEgPSAoKHBhY2tldFsxXSAmIDB4MDcpIDw8IDgpIHwgcGFja2V0WzJdOworCQl4MSA9ICgocGFja2V0WzFdICYgMHgwZikgPDwgOCkgfCBwYWNrZXRbMl07CiAJCS8qCi0JCSAqIGJ5dGUgNDogIC4gICAuICAgLiAgIC4gICAuICAgLiAgeTkgIHk4CisJCSAqIGJ5dGUgNDogIC4gICAuICAgLiAgIC4gIHkxMSB5MTAgeTkgIHk4CiAJCSAqIGJ5dGUgNTogeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCiAJCSAqLwotCQl5MSA9IEVUUF9ZTUFYX1YyIC0gKCgocGFja2V0WzRdICYgMHgwMykgPDwgOCkgfCBwYWNrZXRbNV0pOwotCi0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeDEpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHkxKTsKKwkJeTEgPSBldGQtPnlfbWF4IC0gKCgocGFja2V0WzRdICYgMHgwZikgPDwgOCkgfCBwYWNrZXRbNV0pOwogCiAJCXByZXMgPSAocGFja2V0WzFdICYgMHhmMCkgfCAoKHBhY2tldFs0XSAmIDB4ZjApID4+IDQpOwogCQl3aWR0aCA9ICgocGFja2V0WzBdICYgMHgzMCkgPj4gMikgfCAoKHBhY2tldFszXSAmIDB4MzApID4+IDQpOwpAQCAtMzE0LDIyICszNDUsMTggQEAKIAkJICogYnl0ZSAwOiAgLiAgIC4gIGF5OCBheDggIC4gICAuICAgLiAgIC4KIAkJICogYnl0ZSAxOiBheDcgYXg2IGF4NSBheDQgYXgzIGF4MiBheDEgYXgwCiAJCSAqLwotCQl4MSA9ICgocGFja2V0WzBdICYgMHgxMCkgPDwgNCkgfCBwYWNrZXRbMV07CisJCXgxID0gKCgocGFja2V0WzBdICYgMHgxMCkgPDwgNCkgfCBwYWNrZXRbMV0pIDw8IDI7CiAJCS8qIGJ5dGUgMjogYXk3IGF5NiBheTUgYXk0IGF5MyBheTIgYXkxIGF5MCAqLwotCQl5MSA9IEVUUF8yRlRfWU1BWCAtICgoKHBhY2tldFswXSAmIDB4MjApIDw8IDMpIHwgcGFja2V0WzJdKTsKKwkJeTEgPSBldGQtPnlfbWF4IC0KKwkJCSgoKChwYWNrZXRbMF0gJiAweDIwKSA8PCAzKSB8IHBhY2tldFsyXSkgPDwgMik7CiAJCS8qCiAJCSAqIGJ5dGUgMzogIC4gICAuICBieTggYng4ICAuICAgLiAgIC4gICAuCiAJCSAqIGJ5dGUgNDogYng3IGJ4NiBieDUgYng0IGJ4MyBieDIgYngxIGJ4MAogCQkgKi8KLQkJeDIgPSAoKHBhY2tldFszXSAmIDB4MTApIDw8IDQpIHwgcGFja2V0WzRdOworCQl4MiA9ICgoKHBhY2tldFszXSAmIDB4MTApIDw8IDQpIHwgcGFja2V0WzRdKSA8PCAyOwogCQkvKiBieXRlIDU6IGJ5NyBieTggYnk1IGJ5NCBieTMgYnkyIGJ5MSBieTAgKi8KLQkJeTIgPSBFVFBfMkZUX1lNQVggLSAoKChwYWNrZXRbM10gJiAweDIwKSA8PCAzKSB8IHBhY2tldFs1XSk7Ci0JCS8qCi0JCSAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFggU3luYXB0aWNzIGRyaXZlciBzY2FsZSB1cAotCQkgKiBvbmUgY29vcmRpbmF0ZSBhbmQgcmVwb3J0IGFzIG9yZGluYXJ5IG1vdXNlIG1vdmVudAotCQkgKi8KLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCB4MSA8PCAyKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5MSA8PCAyKTsKKwkJeTIgPSBldGQtPnlfbWF4IC0KKwkJCSgoKChwYWNrZXRbM10gJiAweDIwKSA8PCAzKSB8IHBhY2tldFs1XSkgPDwgMik7CiAKIAkJLyogVW5rbm93biBzbyBqdXN0IHJlcG9ydCBzZW5zaWJsZSB2YWx1ZXMgKi8KIAkJcHJlcyA9IDEyNzsKQEAgLTMzNyw2ICszNjQsMTEgQEAKIAkJYnJlYWs7CiAJfQogCisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgZmluZ2VycyAhPSAwKTsKKwlpZiAoZmluZ2VycyAhPSAwKSB7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeDEpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHkxKTsKKwl9CiAJZWxhbnRlY2hfcmVwb3J0X3NlbWlfbXRfZGF0YShkZXYsIGZpbmdlcnMsIHgxLCB5MSwgeDIsIHkyKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCBmaW5nZXJzID09IDEpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9ET1VCTEVUQVAsIGZpbmdlcnMgPT0gMik7CkBAIC0zNTIsNyArMzg0LDIwOCBAQAogCWlucHV0X3N5bmMoZGV2KTsKIH0KIAotc3RhdGljIGludCBlbGFudGVjaF9jaGVja19wYXJpdHlfdjEoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCisvKgorICogSW50ZXJwcmV0IGNvbXBsZXRlIGRhdGEgcGFja2V0cyBhbmQgcmVwb3J0IGFic29sdXRlIG1vZGUgaW5wdXQgZXZlbnRzIGZvcgorICogaGFyZHdhcmUgdmVyc2lvbiAzLiAoMTIgYnl0ZSBwYWNrZXRzIGZvciB0d28gZmluZ2VycykKKyAqLworc3RhdGljIHZvaWQgZWxhbnRlY2hfcmVwb3J0X2Fic29sdXRlX3YzKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLAorCQkJCQlpbnQgcGFja2V0X3R5cGUpCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OworCXN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQgPSBwc21vdXNlLT5wcml2YXRlOworCXVuc2lnbmVkIGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKKwl1bnNpZ25lZCBpbnQgZmluZ2VycyA9IDAsIHgxID0gMCwgeTEgPSAwLCB4MiA9IDAsIHkyID0gMDsKKwl1bnNpZ25lZCBpbnQgd2lkdGggPSAwLCBwcmVzID0gMDsKKworCS8qIGJ5dGUgMDogbjEgIG4wICAgLiAgIC4gICAuICAgLiAgIFIgICBMICovCisJZmluZ2VycyA9IChwYWNrZXRbMF0gJiAweGMwKSA+PiA2OworCisJc3dpdGNoIChmaW5nZXJzKSB7CisJY2FzZSAzOgorCWNhc2UgMToKKwkJLyoKKwkJICogYnl0ZSAxOiAgLiAgIC4gICAuICAgLiAgeDExIHgxMCB4OSAgeDgKKwkJICogYnl0ZSAyOiB4NyAgeDYgIHg1ICB4NCAgeDQgIHgyICB4MSAgeDAKKwkJICovCisJCXgxID0gKChwYWNrZXRbMV0gJiAweDBmKSA8PCA4KSB8IHBhY2tldFsyXTsKKwkJLyoKKwkJICogYnl0ZSA0OiAgLiAgIC4gICAuICAgLiAgeTExIHkxMCB5OSAgeTgKKwkJICogYnl0ZSA1OiB5NyAgeTYgIHk1ICB5NCAgeTMgIHkyICB5MSAgeTAKKwkJICovCisJCXkxID0gZXRkLT55X21heCAtICgoKHBhY2tldFs0XSAmIDB4MGYpIDw8IDgpIHwgcGFja2V0WzVdKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWlmIChwYWNrZXRfdHlwZSA9PSBQQUNLRVRfVjNfSEVBRCkgeworCQkJLyoKKwkJCSAqIGJ5dGUgMTogICAuICAgIC4gICAgLiAgICAuICBheDExIGF4MTAgYXg5ICBheDgKKwkJCSAqIGJ5dGUgMjogYXg3ICBheDYgIGF4NSAgYXg0ICBheDMgIGF4MiAgYXgxICBheDAKKwkJCSAqLworCQkJZXRkLT5tdFswXS54ID0gKChwYWNrZXRbMV0gJiAweDBmKSA8PCA4KSB8IHBhY2tldFsyXTsKKwkJCS8qCisJCQkgKiBieXRlIDQ6ICAgLiAgICAuICAgIC4gICAgLiAgYXkxMSBheTEwIGF5OSAgYXk4CisJCQkgKiBieXRlIDU6IGF5NyAgYXk2ICBheTUgIGF5NCAgYXkzICBheTIgIGF5MSAgYXkwCisJCQkgKi8KKwkJCWV0ZC0+bXRbMF0ueSA9IGV0ZC0+eV9tYXggLQorCQkJCSgoKHBhY2tldFs0XSAmIDB4MGYpIDw8IDgpIHwgcGFja2V0WzVdKTsKKwkJCS8qCisJCQkgKiB3YWl0IGZvciBuZXh0IHBhY2tldAorCQkJICovCisJCQlyZXR1cm47CisJCX0KKworCQkvKiBwYWNrZXRfdHlwZSA9PSBQQUNLRVRfVjNfVEFJTCAqLworCQl4MSA9IGV0ZC0+bXRbMF0ueDsKKwkJeTEgPSBldGQtPm10WzBdLnk7CisJCXgyID0gKChwYWNrZXRbMV0gJiAweDBmKSA8PCA4KSB8IHBhY2tldFsyXTsKKwkJeTIgPSBldGQtPnlfbWF4IC0gKCgocGFja2V0WzRdICYgMHgwZikgPDwgOCkgfCBwYWNrZXRbNV0pOworCQlicmVhazsKKwl9CisKKwlwcmVzID0gKHBhY2tldFsxXSAmIDB4ZjApIHwgKChwYWNrZXRbNF0gJiAweGYwKSA+PiA0KTsKKwl3aWR0aCA9ICgocGFja2V0WzBdICYgMHgzMCkgPj4gMikgfCAoKHBhY2tldFszXSAmIDB4MzApID4+IDQpOworCisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgZmluZ2VycyAhPSAwKTsKKwlpZiAoZmluZ2VycyAhPSAwKSB7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeDEpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHkxKTsKKwl9CisJZWxhbnRlY2hfcmVwb3J0X3NlbWlfbXRfZGF0YShkZXYsIGZpbmdlcnMsIHgxLCB5MSwgeDIsIHkyKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCBmaW5nZXJzID09IDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9ET1VCTEVUQVAsIGZpbmdlcnMgPT0gMik7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX1RSSVBMRVRBUCwgZmluZ2VycyA9PSAzKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIHBhY2tldFswXSAmIDB4MDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHBhY2tldFswXSAmIDB4MDIpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIHByZXMpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfVE9PTF9XSURUSCwgd2lkdGgpOworCisJaW5wdXRfc3luYyhkZXYpOworfQorCitzdGF0aWMgdm9pZCBlbGFudGVjaF9pbnB1dF9zeW5jX3Y0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBzbW91c2UtPmRldjsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CisKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIHBhY2tldFswXSAmIDB4MDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHBhY2tldFswXSAmIDB4MDIpOworCWlucHV0X210X3JlcG9ydF9wb2ludGVyX2VtdWxhdGlvbihkZXYsIHRydWUpOworCWlucHV0X3N5bmMoZGV2KTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19wYWNrZXRfc3RhdHVzX3Y0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBzbW91c2UtPmRldjsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CisJdW5zaWduZWQgZmluZ2VyczsKKwlpbnQgaTsKKworCS8qIG5vdGlmeSBmaW5nZXIgc3RhdGUgY2hhbmdlICovCisJZmluZ2VycyA9IHBhY2tldFsxXSAmIDB4MWY7CisJZm9yIChpID0gMDsgaSA8IEVUUF9NQVhfRklOR0VSUzsgaSsrKSB7CisJCWlmICgoZmluZ2VycyAmICgxIDw8IGkpKSA9PSAwKSB7CisJCQlpbnB1dF9tdF9zbG90KGRldiwgaSk7CisJCQlpbnB1dF9tdF9yZXBvcnRfc2xvdF9zdGF0ZShkZXYsIE1UX1RPT0xfRklOR0VSLCBmYWxzZSk7CisJCX0KKwl9CisKKwllbGFudGVjaF9pbnB1dF9zeW5jX3Y0KHBzbW91c2UpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3BhY2tldF9oZWFkX3Y0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBzbW91c2UtPmRldjsKKwlzdHJ1Y3QgZWxhbnRlY2hfZGF0YSAqZXRkID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CisJaW50IGlkID0gKChwYWNrZXRbM10gJiAweGUwKSA+PiA1KSAtIDE7CisJaW50IHByZXMsIHRyYWNlczsKKworCWlmIChpZCA8IDApCisJCXJldHVybjsKKworCWV0ZC0+bXRbaWRdLnggPSAoKHBhY2tldFsxXSAmIDB4MGYpIDw8IDgpIHwgcGFja2V0WzJdOworCWV0ZC0+bXRbaWRdLnkgPSBldGQtPnlfbWF4IC0gKCgocGFja2V0WzRdICYgMHgwZikgPDwgOCkgfCBwYWNrZXRbNV0pOworCXByZXMgPSAocGFja2V0WzFdICYgMHhmMCkgfCAoKHBhY2tldFs0XSAmIDB4ZjApID4+IDQpOworCXRyYWNlcyA9IChwYWNrZXRbMF0gJiAweGYwKSA+PiA0OworCisJaW5wdXRfbXRfc2xvdChkZXYsIGlkKTsKKwlpbnB1dF9tdF9yZXBvcnRfc2xvdF9zdGF0ZShkZXYsIE1UX1RPT0xfRklOR0VSLCB0cnVlKTsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgZXRkLT5tdFtpZF0ueCk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NVF9QT1NJVElPTl9ZLCBldGQtPm10W2lkXS55KTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01UX1BSRVNTVVJFLCBwcmVzKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01UX1RPVUNIX01BSk9SLCB0cmFjZXMgKiBldGQtPndpZHRoKTsKKwkvKiByZXBvcnQgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RPT0xfV0lEVEgsIHRyYWNlcyk7CisKKwllbGFudGVjaF9pbnB1dF9zeW5jX3Y0KHBzbW91c2UpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3BhY2tldF9tb3Rpb25fdjQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OworCXN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQgPSBwc21vdXNlLT5wcml2YXRlOworCXVuc2lnbmVkIGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKKwlpbnQgd2VpZ2h0LCBkZWx0YV94MSA9IDAsIGRlbHRhX3kxID0gMCwgZGVsdGFfeDIgPSAwLCBkZWx0YV95MiA9IDA7CisJaW50IGlkLCBzaWQ7CisKKwlpZCA9ICgocGFja2V0WzBdICYgMHhlMCkgPj4gNSkgLSAxOworCWlmIChpZCA8IDApCisJCXJldHVybjsKKworCXNpZCA9ICgocGFja2V0WzNdICYgMHhlMCkgPj4gNSkgLSAxOworCXdlaWdodCA9IChwYWNrZXRbMF0gJiAweDEwKSA/IEVUUF9XRUlHSFRfVkFMVUUgOiAxOworCS8qCisJICogTW90aW9uIHBhY2tldHMgZ2l2ZSB1cyB0aGUgZGVsdGEgb2YgeCwgeSB2YWx1ZXMgb2Ygc3BlY2lmaWMgZmluZ2VycywKKwkgKiBidXQgaW4gdHdvJ3MgY29tcGxlbWVudC4gTGV0IHRoZSBjb21waWxlciBkbyB0aGUgY29udmVyc2lvbiBmb3IgdXMuCisJICogQWxzbyBfZW5sYXJnZV8gdGhlIG51bWJlcnMgdG8gaW50LCBpbiBjYXNlIG9mIG92ZXJmbG93LgorCSAqLworCWRlbHRhX3gxID0gKHNpZ25lZCBjaGFyKXBhY2tldFsxXTsKKwlkZWx0YV95MSA9IChzaWduZWQgY2hhcilwYWNrZXRbMl07CisJZGVsdGFfeDIgPSAoc2lnbmVkIGNoYXIpcGFja2V0WzRdOworCWRlbHRhX3kyID0gKHNpZ25lZCBjaGFyKXBhY2tldFs1XTsKKworCWV0ZC0+bXRbaWRdLnggKz0gZGVsdGFfeDEgKiB3ZWlnaHQ7CisJZXRkLT5tdFtpZF0ueSAtPSBkZWx0YV95MSAqIHdlaWdodDsKKwlpbnB1dF9tdF9zbG90KGRldiwgaWQpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgZXRkLT5tdFtpZF0ueCk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NVF9QT1NJVElPTl9ZLCBldGQtPm10W2lkXS55KTsKKworCWlmIChzaWQgPj0gMCkgeworCQlldGQtPm10W3NpZF0ueCArPSBkZWx0YV94MiAqIHdlaWdodDsKKwkJZXRkLT5tdFtzaWRdLnkgLT0gZGVsdGFfeTIgKiB3ZWlnaHQ7CisJCWlucHV0X210X3Nsb3QoZGV2LCBzaWQpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01UX1BPU0lUSU9OX1gsIGV0ZC0+bXRbc2lkXS54KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NVF9QT1NJVElPTl9ZLCBldGQtPm10W3NpZF0ueSk7CisJfQorCisJZWxhbnRlY2hfaW5wdXRfc3luY192NChwc21vdXNlKTsKK30KKworc3RhdGljIHZvaWQgZWxhbnRlY2hfcmVwb3J0X2Fic29sdXRlX3Y0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlLAorCQkJCQlpbnQgcGFja2V0X3R5cGUpCit7CisJc3dpdGNoIChwYWNrZXRfdHlwZSkgeworCWNhc2UgUEFDS0VUX1Y0X1NUQVRVUzoKKwkJcHJvY2Vzc19wYWNrZXRfc3RhdHVzX3Y0KHBzbW91c2UpOworCQlicmVhazsKKworCWNhc2UgUEFDS0VUX1Y0X0hFQUQ6CisJCXByb2Nlc3NfcGFja2V0X2hlYWRfdjQocHNtb3VzZSk7CisJCWJyZWFrOworCisJY2FzZSBQQUNLRVRfVjRfTU9USU9OOgorCQlwcm9jZXNzX3BhY2tldF9tb3Rpb25fdjQocHNtb3VzZSk7CisJCWJyZWFrOworCisJY2FzZSBQQUNLRVRfVU5LTk9XTjoKKwlkZWZhdWx0OgorCQkvKiBpbXBvc3NpYmxlIHRvIGdldCBoZXJlICovCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBlbGFudGVjaF9wYWNrZXRfY2hlY2tfdjEoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJc3RydWN0IGVsYW50ZWNoX2RhdGEgKmV0ZCA9IHBzbW91c2UtPnByaXZhdGU7CiAJdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OwpAQCAtMzc2LDMxICs2MDksMTQyIEBACiAJICAgICAgIGV0ZC0+cGFyaXR5W3BhY2tldFszXV0gPT0gcDM7CiB9CiAKK3N0YXRpYyBpbnQgZWxhbnRlY2hfZGVib3VuY2VfY2hlY2tfdjIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gd2UgZW5jb3VudGVyIHBhY2tldCB0aGF0IG1hdGNoZXMgdGhpcyBleGFjdGx5LCBpdCBtZWFucyB0aGUKKyAgICAgICAgICogaGFyZHdhcmUgaXMgaW4gZGVib3VuY2Ugc3RhdHVzLiBKdXN0IGlnbm9yZSB0aGUgd2hvbGUgcGFja2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgdTggZGVib3VuY2VfcGFja2V0W10gPSB7IDB4ODQsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4ZmYsIDB4ZmYgfTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OworCisgICAgICAgIHJldHVybiAhbWVtY21wKHBhY2tldCwgZGVib3VuY2VfcGFja2V0LCBzaXplb2YoZGVib3VuY2VfcGFja2V0KSk7Cit9CisKK3N0YXRpYyBpbnQgZWxhbnRlY2hfcGFja2V0X2NoZWNrX3YyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQgPSBwc21vdXNlLT5wcml2YXRlOworCXVuc2lnbmVkIGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKKworCS8qCisJICogVjIgaGFyZHdhcmUgaGFzIHR3byBmbGF2b3JzLiBPbGRlciBvbmVzIHRoYXQgZG8gbm90IHJlcG9ydCBwcmVzc3VyZSwKKwkgKiBhbmQgbmV3ZXIgb25lcyB0aGF0IHJlcG9ydHMgcHJlc3N1cmUgYW5kIHdpZHRoLiBXaXRoIG5ld2VyIG9uZXMsIGFsbAorCSAqIHBhY2tldHMgKDEsIDIsIDMgZmluZ2VyIHRvdWNoKSBoYXZlIHRoZSBzYW1lIGNvbnN0YW50IGJpdHMuIFdpdGgKKwkgKiBvbGRlciBvbmVzLCAxLzMgZmluZ2VyIHRvdWNoIHBhY2tldHMgYW5kIDIgZmluZ2VyIHRvdWNoIHBhY2tldHMKKwkgKiBoYXZlIGRpZmZlcmVudCBjb25zdGFudCBiaXRzLgorCSAqIFdpdGggYWxsIHRocmVlIGNhc2VzLCBpZiB0aGUgY29uc3RhbnQgYml0cyBhcmUgbm90IGV4YWN0bHkgd2hhdCBJCisJICogZXhwZWN0ZWQsIEkgY29uc2lkZXIgdGhlbSBpbnZhbGlkLgorCSAqLworCWlmIChldGQtPnJlcG9ydHNfcHJlc3N1cmUpCisJCXJldHVybiAocGFja2V0WzBdICYgMHgwYykgPT0gMHgwNCAmJgorCQkgICAgICAgKHBhY2tldFszXSAmIDB4MGYpID09IDB4MDI7CisKKwlpZiAoKHBhY2tldFswXSAmIDB4YzApID09IDB4ODApCisJCXJldHVybiAocGFja2V0WzBdICYgMHgwYykgPT0gMHgwYyAmJgorCQkgICAgICAgKHBhY2tldFszXSAmIDB4MGUpID09IDB4MDg7CisKKwlyZXR1cm4gKHBhY2tldFswXSAmIDB4M2MpID09IDB4M2MgJiYKKwkgICAgICAgKHBhY2tldFsxXSAmIDB4ZjApID09IDB4MDAgJiYKKwkgICAgICAgKHBhY2tldFszXSAmIDB4M2UpID09IDB4MzggJiYKKwkgICAgICAgKHBhY2tldFs0XSAmIDB4ZjApID09IDB4MDA7Cit9CisKKy8qCisgKiBXZSBjaGVjayB0aGUgY29uc3RhbnQgYml0cyB0byBkZXRlcm1pbmUgd2hhdCBwYWNrZXQgdHlwZSB3ZSBnZXQsCisgKiBzbyBwYWNrZXQgY2hlY2tpbmcgaXMgbWFuZGF0b3J5IGZvciB2MyBhbmQgbGF0ZXIgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyBpbnQgZWxhbnRlY2hfcGFja2V0X2NoZWNrX3YzKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCWNvbnN0IHU4IGRlYm91bmNlX3BhY2tldFtdID0geyAweGM0LCAweGZmLCAweGZmLCAweDAyLCAweGZmLCAweGZmIH07CisJdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OworCisJLyoKKwkgKiBjaGVjayBkZWJvdW5jZSBmaXJzdCwgaXQgaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBpbiBieXRlIDAKKwkgKiBhbmQgYnl0ZSAzIGFzIFBBQ0tFVF9WM19IRUFELgorCSAqLworCWlmICghbWVtY21wKHBhY2tldCwgZGVib3VuY2VfcGFja2V0LCBzaXplb2YoZGVib3VuY2VfcGFja2V0KSkpCisJCXJldHVybiBQQUNLRVRfREVCT1VOQ0U7CisKKwlpZiAoKHBhY2tldFswXSAmIDB4MGMpID09IDB4MDQgJiYgKHBhY2tldFszXSAmIDB4Y2YpID09IDB4MDIpCisJCXJldHVybiBQQUNLRVRfVjNfSEVBRDsKKworCWlmICgocGFja2V0WzBdICYgMHgwYykgPT0gMHgwYyAmJiAocGFja2V0WzNdICYgMHhjZSkgPT0gMHgwYykKKwkJcmV0dXJuIFBBQ0tFVF9WM19UQUlMOworCisJcmV0dXJuIFBBQ0tFVF9VTktOT1dOOworfQorCitzdGF0aWMgaW50IGVsYW50ZWNoX3BhY2tldF9jaGVja192NChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CisKKwlpZiAoKHBhY2tldFswXSAmIDB4MGMpID09IDB4MDQgJiYKKwkgICAgKHBhY2tldFszXSAmIDB4MWYpID09IDB4MTEpCisJCXJldHVybiBQQUNLRVRfVjRfSEVBRDsKKworCWlmICgocGFja2V0WzBdICYgMHgwYykgPT0gMHgwNCAmJgorCSAgICAocGFja2V0WzNdICYgMHgxZikgPT0gMHgxMikKKwkJcmV0dXJuIFBBQ0tFVF9WNF9NT1RJT047CisKKwlpZiAoKHBhY2tldFswXSAmIDB4MGMpID09IDB4MDQgJiYKKwkgICAgKHBhY2tldFszXSAmIDB4MWYpID09IDB4MTApCisJCXJldHVybiBQQUNLRVRfVjRfU1RBVFVTOworCisJcmV0dXJuIFBBQ0tFVF9VTktOT1dOOworfQorCiAvKgogICogUHJvY2VzcyBieXRlIHN0cmVhbSBmcm9tIG1vdXNlIGFuZCBoYW5kbGUgY29tcGxldGUgcGFja2V0cwogICovCiBzdGF0aWMgcHNtb3VzZV9yZXRfdCBlbGFudGVjaF9wcm9jZXNzX2J5dGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJc3RydWN0IGVsYW50ZWNoX2RhdGEgKmV0ZCA9IHBzbW91c2UtPnByaXZhdGU7CisJaW50IHBhY2tldF90eXBlOwogCiAJaWYgKHBzbW91c2UtPnBrdGNudCA8IHBzbW91c2UtPnBrdHNpemUpCiAJCXJldHVybiBQU01PVVNFX0dPT0RfREFUQTsKIAogCWlmIChldGQtPmRlYnVnID4gMSkKLQkJZWxhbnRlY2hfcGFja2V0X2R1bXAocHNtb3VzZS0+cGFja2V0LCBwc21vdXNlLT5wa3RzaXplKTsKKwkJZWxhbnRlY2hfcGFja2V0X2R1bXAocHNtb3VzZSk7CiAKIAlzd2l0Y2ggKGV0ZC0+aHdfdmVyc2lvbikgewogCWNhc2UgMToKLQkJaWYgKGV0ZC0+cGFyaXR5Y2hlY2sgJiYgIWVsYW50ZWNoX2NoZWNrX3Bhcml0eV92MShwc21vdXNlKSkKKwkJaWYgKGV0ZC0+cGFyaXR5Y2hlY2sgJiYgIWVsYW50ZWNoX3BhY2tldF9jaGVja192MShwc21vdXNlKSkKIAkJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOwogCiAJCWVsYW50ZWNoX3JlcG9ydF9hYnNvbHV0ZV92MShwc21vdXNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIDI6Ci0JCS8qIFdlIGRvbid0IGtub3cgaG93IHRvIGNoZWNrIHBhcml0eSBpbiBwcm90b2NvbCB2MiAqLworCQkvKiBpZ25vcmUgZGVib3VuY2UgKi8KKwkJaWYgKGVsYW50ZWNoX2RlYm91bmNlX2NoZWNrX3YyKHBzbW91c2UpKQorCQkJcmV0dXJuIFBTTU9VU0VfRlVMTF9QQUNLRVQ7CisKKwkJaWYgKGV0ZC0+cGFyaXR5Y2hlY2sgJiYgIWVsYW50ZWNoX3BhY2tldF9jaGVja192Mihwc21vdXNlKSkKKwkJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOworCiAJCWVsYW50ZWNoX3JlcG9ydF9hYnNvbHV0ZV92Mihwc21vdXNlKTsKIAkJYnJlYWs7CisKKwljYXNlIDM6CisJCXBhY2tldF90eXBlID0gZWxhbnRlY2hfcGFja2V0X2NoZWNrX3YzKHBzbW91c2UpOworCQkvKiBpZ25vcmUgZGVib3VuY2UgKi8KKwkJaWYgKHBhY2tldF90eXBlID09IFBBQ0tFVF9ERUJPVU5DRSkKKwkJCXJldHVybiBQU01PVVNFX0ZVTExfUEFDS0VUOworCisJCWlmIChwYWNrZXRfdHlwZSA9PSBQQUNLRVRfVU5LTk9XTikKKwkJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOworCisJCWVsYW50ZWNoX3JlcG9ydF9hYnNvbHV0ZV92Myhwc21vdXNlLCBwYWNrZXRfdHlwZSk7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlwYWNrZXRfdHlwZSA9IGVsYW50ZWNoX3BhY2tldF9jaGVja192NChwc21vdXNlKTsKKwkJaWYgKHBhY2tldF90eXBlID09IFBBQ0tFVF9VTktOT1dOKQorCQkJcmV0dXJuIFBTTU9VU0VfQkFEX0RBVEE7CisKKwkJZWxhbnRlY2hfcmVwb3J0X2Fic29sdXRlX3Y0KHBzbW91c2UsIHBhY2tldF90eXBlKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIFBTTU9VU0VfRlVMTF9QQUNLRVQ7CkBAIC00MzUsMTUgKzc3OSwyOSBAQAogCQkgICAgZWxhbnRlY2hfd3JpdGVfcmVnKHBzbW91c2UsIDB4MTEsIGV0ZC0+cmVnXzExKSB8fAogCQkgICAgZWxhbnRlY2hfd3JpdGVfcmVnKHBzbW91c2UsIDB4MjEsIGV0ZC0+cmVnXzIxKSkgewogCQkJcmMgPSAtMTsKLQkJCWJyZWFrOwogCQl9CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlldGQtPnJlZ18xMCA9IDB4MGI7CisJCWlmIChlbGFudGVjaF93cml0ZV9yZWcocHNtb3VzZSwgMHgxMCwgZXRkLT5yZWdfMTApKQorCQkJcmMgPSAtMTsKKworCQlicmVhazsKKworCWNhc2UgNDoKKwkJZXRkLT5yZWdfMDcgPSAweDAxOworCQlpZiAoZWxhbnRlY2hfd3JpdGVfcmVnKHBzbW91c2UsIDB4MDcsIGV0ZC0+cmVnXzA3KSkKKwkJCXJjID0gLTE7CisKKwkJZ290byBza2lwX3JlYWRiYWNrX3JlZ18xMDsgLyogdjQgaGFzIG5vIHJlZyAweDEwIHRvIHJlYWQgKi8KIAl9CiAKIAlpZiAocmMgPT0gMCkgewogCQkvKgogCQkgKiBSZWFkIGJhY2sgcmVnIDB4MTAuIEZvciBoYXJkd2FyZSB2ZXJzaW9uIDEgd2UgbXVzdCBtYWtlCiAJCSAqIHN1cmUgdGhlIGFic29sdXRlIG1vZGUgYml0IGlzIHNldC4gRm9yIGhhcmR3YXJlIHZlcnNpb24gMgotCQkgKiB0aGUgdG91Y2hwYWQgaXMgcHJvYmFibHkgaW5pdGFsaXNpbmcgYW5kIG5vdCByZWFkeSB1bnRpbAorCQkgKiB0aGUgdG91Y2hwYWQgaXMgcHJvYmFibHkgaW5pdGlhbGl6aW5nIGFuZCBub3QgcmVhZHkgdW50aWwKIAkJICogd2UgcmVhZCBiYWNrIHRoZSB2YWx1ZSB3ZSBqdXN0IHdyb3RlLgogCQkgKi8KIAkJZG8gewpAQCAtNDU2LDI3ICs4MTQsMTE1IEBACiAJCX0gd2hpbGUgKHRyaWVzID4gMCk7CiAKIAkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoImZhaWxlZCB0byByZWFkIGJhY2sgcmVnaXN0ZXIgMHgxMC5cbiIpOworCQkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCQkgICAgImZhaWxlZCB0byByZWFkIGJhY2sgcmVnaXN0ZXIgMHgxMC5cbiIpOwogCQl9IGVsc2UgaWYgKGV0ZC0+aHdfdmVyc2lvbiA9PSAxICYmCiAJCQkgICAhKHZhbCAmIEVUUF9SMTBfQUJTT0xVVEVfTU9ERSkpIHsKLQkJCXByX2VycigidG91Y2hwYWQgcmVmdXNlcyB0byBzd2l0Y2ggdG8gYWJzb2x1dGUgbW9kZS5cbiIpOworCQkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCQkgICAgInRvdWNocGFkIHJlZnVzZXMgdG8gc3dpdGNoIHRvIGFic29sdXRlIG1vZGUuXG4iKTsKIAkJCXJjID0gLTE7CiAJCX0KIAl9CiAKKyBza2lwX3JlYWRiYWNrX3JlZ18xMDoKIAlpZiAocmMpCi0JCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpc2UgcmVnaXN0ZXJzLlxuIik7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJmYWlsZWQgdG8gaW5pdGlhbGlzZSByZWdpc3RlcnMuXG4iKTsKIAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBlbGFudGVjaF9zZXRfcmFuZ2Uoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnhfbWluLCB1bnNpZ25lZCBpbnQgKnlfbWluLAorCQkJICAgICAgdW5zaWduZWQgaW50ICp4X21heCwgdW5zaWduZWQgaW50ICp5X21heCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqd2lkdGgpCit7CisJc3RydWN0IGVsYW50ZWNoX2RhdGEgKmV0ZCA9IHBzbW91c2UtPnByaXZhdGU7CisJdW5zaWduZWQgY2hhciBwYXJhbVszXTsKKwl1bnNpZ25lZCBjaGFyIHRyYWNlczsKKworCXN3aXRjaCAoZXRkLT5od192ZXJzaW9uKSB7CisJY2FzZSAxOgorCQkqeF9taW4gPSBFVFBfWE1JTl9WMTsKKwkJKnlfbWluID0gRVRQX1lNSU5fVjE7CisJCSp4X21heCA9IEVUUF9YTUFYX1YxOworCQkqeV9tYXggPSBFVFBfWU1BWF9WMTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWlmIChldGQtPmZ3X3ZlcnNpb24gPT0gMHgwMjA4MDAgfHwKKwkJICAgIGV0ZC0+ZndfdmVyc2lvbiA9PSAweDAyMGIwMCB8fAorCQkgICAgZXRkLT5md192ZXJzaW9uID09IDB4MDIwMDMwKSB7CisJCQkqeF9taW4gPSBFVFBfWE1JTl9WMjsKKwkJCSp5X21pbiA9IEVUUF9ZTUlOX1YyOworCQkJKnhfbWF4ID0gRVRQX1hNQVhfVjI7CisJCQkqeV9tYXggPSBFVFBfWU1BWF9WMjsKKwkJfSBlbHNlIHsKKwkJCWludCBpOworCQkJaW50IGZpeGVkX2RwaTsKKworCQkJaSA9IChldGQtPmZ3X3ZlcnNpb24gPiAweDAyMDgwMCAmJgorCQkJICAgICBldGQtPmZ3X3ZlcnNpb24gPCAweDAyMDkwMCkgPyAxIDogMjsKKworCQkJaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBFVFBfRldfSURfUVVFUlksIHBhcmFtKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWZpeGVkX2RwaSA9IHBhcmFtWzFdICYgMHgxMDsKKworCQkJaWYgKCgoZXRkLT5md192ZXJzaW9uID4+IDE2KSA9PSAweDE0KSAmJiBmaXhlZF9kcGkpIHsKKwkJCQlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIEVUUF9TQU1QTEVfUVVFUlksIHBhcmFtKSkKKwkJCQkJcmV0dXJuIC0xOworCisJCQkJKnhfbWF4ID0gKGV0ZC0+Y2FwYWJpbGl0aWVzWzFdIC0gaSkgKiBwYXJhbVsxXSAvIDI7CisJCQkJKnlfbWF4ID0gKGV0ZC0+Y2FwYWJpbGl0aWVzWzJdIC0gaSkgKiBwYXJhbVsyXSAvIDI7CisJCQl9IGVsc2UgaWYgKGV0ZC0+ZndfdmVyc2lvbiA9PSAweDA0MDIxNikgeworCQkJCSp4X21heCA9IDgxOTsKKwkJCQkqeV9tYXggPSA0MDU7CisJCQl9IGVsc2UgaWYgKGV0ZC0+ZndfdmVyc2lvbiA9PSAweDA0MDIxOSB8fCBldGQtPmZ3X3ZlcnNpb24gPT0gMHgwNDAyMTUpIHsKKwkJCQkqeF9tYXggPSA5MDA7CisJCQkJKnlfbWF4ID0gNTAwOworCQkJfSBlbHNlIHsKKwkJCQkqeF9tYXggPSAoZXRkLT5jYXBhYmlsaXRpZXNbMV0gLSBpKSAqIDY0OworCQkJCSp5X21heCA9IChldGQtPmNhcGFiaWxpdGllc1syXSAtIGkpICogNjQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCWlmIChzeW5hcHRpY3Nfc2VuZF9jbWQocHNtb3VzZSwgRVRQX0ZXX0lEX1FVRVJZLCBwYXJhbSkpCisJCQlyZXR1cm4gLTE7CisKKwkJKnhfbWF4ID0gKDB4MGYgJiBwYXJhbVswXSkgPDwgOCB8IHBhcmFtWzFdOworCQkqeV9tYXggPSAoMHhmMCAmIHBhcmFtWzBdKSA8PCA0IHwgcGFyYW1bMl07CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIEVUUF9GV19JRF9RVUVSWSwgcGFyYW0pKQorCQkJcmV0dXJuIC0xOworCisJCSp4X21heCA9ICgweDBmICYgcGFyYW1bMF0pIDw8IDggfCBwYXJhbVsxXTsKKwkJKnlfbWF4ID0gKDB4ZjAgJiBwYXJhbVswXSkgPDwgNCB8IHBhcmFtWzJdOworCQl0cmFjZXMgPSBldGQtPmNhcGFiaWxpdGllc1sxXTsKKwkJaWYgKCh0cmFjZXMgPCAyKSB8fCAodHJhY2VzID4gKnhfbWF4KSkKKwkJCXJldHVybiAtMTsKKworCQkqd2lkdGggPSAqeF9tYXggLyAodHJhY2VzIC0gMSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogU2V0IHRoZSBhcHByb3ByaWF0ZSBldmVudCBiaXRzIGZvciB0aGUgaW5wdXQgc3Vic3lzdGVtCiAgKi8KLXN0YXRpYyB2b2lkIGVsYW50ZWNoX3NldF9pbnB1dF9wYXJhbXMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCitzdGF0aWMgaW50IGVsYW50ZWNoX3NldF9pbnB1dF9wYXJhbXMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OwogCXN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQgPSBwc21vdXNlLT5wcml2YXRlOworCXVuc2lnbmVkIGludCB4X21pbiA9IDAsIHlfbWluID0gMCwgeF9tYXggPSAwLCB5X21heCA9IDAsIHdpZHRoID0gMDsKKworCWlmIChlbGFudGVjaF9zZXRfcmFuZ2UocHNtb3VzZSwgJnhfbWluLCAmeV9taW4sICZ4X21heCwgJnlfbWF4LCAmd2lkdGgpKQorCQlyZXR1cm4gLTE7CiAKIAlfX3NldF9iaXQoRVZfS0VZLCBkZXYtPmV2Yml0KTsKIAlfX3NldF9iaXQoRVZfQUJTLCBkZXYtPmV2Yml0KTsKQEAgLTQ5NCwzMCArOTQwLDY0IEBACiAJY2FzZSAxOgogCQkvKiBSb2NrZXIgYnV0dG9uICovCiAJCWlmIChldGQtPmZ3X3ZlcnNpb24gPCAweDAyMDAwMCAmJgotCQkgICAgKGV0ZC0+Y2FwYWJpbGl0aWVzICYgRVRQX0NBUF9IQVNfUk9DS0VSKSkgeworCQkgICAgKGV0ZC0+Y2FwYWJpbGl0aWVzWzBdICYgRVRQX0NBUF9IQVNfUk9DS0VSKSkgewogCQkJX19zZXRfYml0KEJUTl9GT1JXQVJELCBkZXYtPmtleWJpdCk7CiAJCQlfX3NldF9iaXQoQlROX0JBQ0ssIGRldi0+a2V5Yml0KTsKIAkJfQotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19YLCBFVFBfWE1JTl9WMSwgRVRQX1hNQVhfVjEsIDAsIDApOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLCBFVFBfWU1JTl9WMSwgRVRQX1lNQVhfVjEsIDAsIDApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19YLCB4X21pbiwgeF9tYXgsIDAsIDApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLCB5X21pbiwgeV9tYXgsIDAsIDApOwogCQlicmVhazsKIAogCWNhc2UgMjoKIAkJX19zZXRfYml0KEJUTl9UT09MX1FVQURUQVAsIGRldi0+a2V5Yml0KTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWCwgRVRQX1hNSU5fVjIsIEVUUF9YTUFYX1YyLCAwLCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWSwgRVRQX1lNSU5fVjIsIEVUUF9ZTUFYX1YyLCAwLCAwKTsKKwkJX19zZXRfYml0KElOUFVUX1BST1BfU0VNSV9NVCwgZGV2LT5wcm9wYml0KTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAzOgorCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19YLCB4X21pbiwgeF9tYXgsIDAsIDApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLCB5X21pbiwgeV9tYXgsIDAsIDApOwogCQlpZiAoZXRkLT5yZXBvcnRzX3ByZXNzdXJlKSB7CiAJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19QUkVTU1VSRSwgRVRQX1BNSU5fVjIsCiAJCQkJCSAgICAgRVRQX1BNQVhfVjIsIDAsIDApOwogCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfVE9PTF9XSURUSCwgRVRQX1dNSU5fVjIsCiAJCQkJCSAgICAgRVRQX1dNQVhfVjIsIDAsIDApOwogCQl9Ci0JCV9fc2V0X2JpdChJTlBVVF9QUk9QX1NFTUlfTVQsIGRldi0+cHJvcGJpdCk7CiAJCWlucHV0X210X2luaXRfc2xvdHMoZGV2LCAyKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgRVRQX1hNSU5fVjIsIEVUUF9YTUFYX1YyLCAwLCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgRVRQX1lNSU5fVjIsIEVUUF9ZTUFYX1YyLCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgeF9taW4sIHhfbWF4LCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgeV9taW4sIHlfbWF4LCAwLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCV9fc2V0X2JpdChCVE5fVE9PTF9RVUFEVEFQLCBkZXYtPmtleWJpdCk7CisJCS8qIEZvciBYIHRvIHJlY29nbml6ZSBtZSBhcyB0b3VjaHBhZC4gKi8KKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWCwgeF9taW4sIHhfbWF4LCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWSwgeV9taW4sIHlfbWF4LCAwLCAwKTsKKwkJLyoKKwkJICogcmFuZ2Ugb2YgcHJlc3N1cmUgYW5kIHdpZHRoIGlzIHRoZSBzYW1lIGFzIHYyLAorCQkgKiByZXBvcnQgQUJTX1BSRVNTVVJFLCBBQlNfVE9PTF9XSURUSCBmb3IgY29tcGF0aWJpbGl0eS4KKwkJICovCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1BSRVNTVVJFLCBFVFBfUE1JTl9WMiwKKwkJCQkgICAgIEVUUF9QTUFYX1YyLCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfVE9PTF9XSURUSCwgRVRQX1dNSU5fVjIsCisJCQkJICAgICBFVFBfV01BWF9WMiwgMCwgMCk7CisJCS8qIE11bHRpdG91Y2ggY2FwYWJsZSBwYWQsIHVwIHRvIDUgZmluZ2Vycy4gKi8KKwkJaW5wdXRfbXRfaW5pdF9zbG90cyhkZXYsIEVUUF9NQVhfRklOR0VSUyk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1BPU0lUSU9OX1gsIHhfbWluLCB4X21heCwgMCwgMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1BPU0lUSU9OX1ksIHlfbWluLCB5X21heCwgMCwgMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1BSRVNTVVJFLCBFVFBfUE1JTl9WMiwKKwkJCQkgICAgIEVUUF9QTUFYX1YyLCAwLCAwKTsKKwkJLyoKKwkJICogVGhlIGZpcm13YXJlIHJlcG9ydHMgaG93IG1hbnkgdHJhY2UgbGluZXMgdGhlIGZpbmdlciBzcGFucywKKwkJICogY29udmVydCB0byBzdXJmYWNlIHVuaXQgYXMgUHJvdG9jb2wtQiByZXF1aXJlcy4KKwkJICovCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1RPVUNIX01BSk9SLCAwLAorCQkJCSAgICAgRVRQX1dNQVhfVjIgKiB3aWR0aCwgMCwgMCk7CiAJCWJyZWFrOwogCX0KKworCWV0ZC0+eV9tYXggPSB5X21heDsKKwlldGQtPndpZHRoID0gd2lkdGg7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGVsYW50ZWNoX2F0dHJfZGF0YSB7CkBAIC01ODcsNiArMTA2Nyw3IEBACiAJCQkgICAgZWxhbnRlY2hfc2hvd19pbnRfYXR0ciwJCQlcCiAJCQkgICAgZWxhbnRlY2hfc2V0X2ludF9hdHRyKQogCitFTEFOVEVDSF9JTlRfQVRUUihyZWdfMDcsIDB4MDcpOwogRUxBTlRFQ0hfSU5UX0FUVFIocmVnXzEwLCAweDEwKTsKIEVMQU5URUNIX0lOVF9BVFRSKHJlZ18xMSwgMHgxMSk7CiBFTEFOVEVDSF9JTlRfQVRUUihyZWdfMjAsIDB4MjApOwpAQCAtNjAwLDYgKzEwODEsNyBAQAogRUxBTlRFQ0hfSU5UX0FUVFIocGFyaXR5Y2hlY2ssIDApOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZWxhbnRlY2hfYXR0cnNbXSA9IHsKKwkmcHNtb3VzZV9hdHRyX3JlZ18wNy5kYXR0ci5hdHRyLAogCSZwc21vdXNlX2F0dHJfcmVnXzEwLmRhdHRyLmF0dHIsCiAJJnBzbW91c2VfYXR0cl9yZWdfMTEuZGF0dHIuYXR0ciwKIAkmcHNtb3VzZV9hdHRyX3JlZ18yMC5kYXR0ci5hdHRyLApAQCAtNjUxLDcgKzExMzMsNyBAQAogCSAgICBwczJfY29tbWFuZChwczJkZXYsICBOVUxMLCBQU01PVVNFX0NNRF9TRVRTQ0FMRTExKSB8fAogCSAgICBwczJfY29tbWFuZChwczJkZXYsICBOVUxMLCBQU01PVVNFX0NNRF9TRVRTQ0FMRTExKSB8fAogCSAgICBwczJfY29tbWFuZChwczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9HRVRJTkZPKSkgewotCQlwcl9kZWJ1Zygic2VuZGluZyBFbGFudGVjaCBtYWdpYyBrbm9jayBmYWlsZWQuXG4iKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgInNlbmRpbmcgRWxhbnRlY2ggbWFnaWMga25vY2sgZmFpbGVkLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY1OSw5ICsxMTQxLDExIEBACiAJICogUmVwb3J0IHRoaXMgaW4gY2FzZSB0aGVyZSBhcmUgRWxhbnRlY2ggbW9kZWxzIHRoYXQgdXNlIGEgZGlmZmVyZW50CiAJICogc2V0IG9mIG1hZ2ljIG51bWJlcnMKIAkgKi8KLQlpZiAocGFyYW1bMF0gIT0gMHgzYyB8fCBwYXJhbVsxXSAhPSAweDAzIHx8IHBhcmFtWzJdICE9IDB4YzgpIHsKLQkJcHJfZGVidWcoInVuZXhwZWN0ZWQgbWFnaWMga25vY2sgcmVzdWx0IDB4JTAyeCwgMHglMDJ4LCAweCUwMnguXG4iLAotCQkJIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOworCWlmIChwYXJhbVswXSAhPSAweDNjIHx8IHBhcmFtWzFdICE9IDB4MDMgfHwKKwkgICAgKHBhcmFtWzJdICE9IDB4YzggJiYgcGFyYW1bMl0gIT0gMHgwMCkpIHsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwKKwkJCSAgICAidW5leHBlY3RlZCBtYWdpYyBrbm9jayByZXN1bHQgMHglMDJ4LCAweCUwMngsIDB4JTAyeC5cbiIsCisJCQkgICAgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY3MSwyMCArMTE1NSwxOCBAQAogCSAqIHRvIEVsYW50ZWNoIG1hZ2ljIGtub2NrIGFuZCB0aGVyZSBtaWdodCBiZSBtb3JlLgogCSAqLwogCWlmIChzeW5hcHRpY3Nfc2VuZF9jbWQocHNtb3VzZSwgRVRQX0ZXX1ZFUlNJT05fUVVFUlksIHBhcmFtKSkgewotCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIHF1ZXJ5IGZpcm13YXJlIHZlcnNpb24uXG4iKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgImZhaWxlZCB0byBxdWVyeSBmaXJtd2FyZSB2ZXJzaW9uLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlwcl9kZWJ1ZygiRWxhbnRlY2ggdmVyc2lvbiBxdWVyeSByZXN1bHQgMHglMDJ4LCAweCUwMngsIDB4JTAyeC5cbiIsCi0JCSBwYXJhbVswXSwgcGFyYW1bMV0sIHBhcmFtWzJdKTsKKwlwc21vdXNlX2RiZyhwc21vdXNlLAorCQkgICAgIkVsYW50ZWNoIHZlcnNpb24gcXVlcnkgcmVzdWx0IDB4JTAyeCwgMHglMDJ4LCAweCUwMnguXG4iLAorCQkgICAgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CiAKIAlpZiAoIWVsYW50ZWNoX2lzX3NpZ25hdHVyZV92YWxpZChwYXJhbSkpIHsKLQkJaWYgKCFmb3JjZV9lbGFudGVjaCkgewotCQkJcHJfZGVidWcoIlByb2JhYmx5IG5vdCBhIHJlYWwgRWxhbnRlY2ggdG91Y2hwYWQuIEFib3J0aW5nLlxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiUHJvYmFibHkgbm90IGEgcmVhbCBFbGFudGVjaCB0b3VjaHBhZC4gRW5hYmxpbmcgYW55d2F5IGR1ZSB0byBmb3JjZV9lbGFudGVjaC5cbiIpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLAorCQkJICAgICJQcm9iYWJseSBub3QgYSByZWFsIEVsYW50ZWNoIHRvdWNocGFkLiBBYm9ydGluZy5cbiIpOworCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKHNldF9wcm9wZXJ0aWVzKSB7CkBAIC03MTUsNyArMTE5Nyw4IEBACiAJCXJldHVybiAtMTsKIAogCWlmIChlbGFudGVjaF9zZXRfYWJzb2x1dGVfbW9kZShwc21vdXNlKSkgewotCQlwcl9lcnIoImZhaWxlZCB0byBwdXQgdG91Y2hwYWQgYmFjayBpbnRvIGFic29sdXRlIG1vZGUuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAiZmFpbGVkIHRvIHB1dCB0b3VjaHBhZCBiYWNrIGludG8gYWJzb2x1dGUgbW9kZS5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC03MjMsNiArMTIwNiw0OCBAQAogfQogCiAvKgorICogZGV0ZXJtaW5lIGhhcmR3YXJlIHZlcnNpb24gYW5kIHNldCBzb21lIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIGl0LgorICovCitzdGF0aWMgaW50IGVsYW50ZWNoX3NldF9wcm9wZXJ0aWVzKHN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQpCit7CisJaW50IHZlciA9IChldGQtPmZ3X3ZlcnNpb24gJiAweDBmMDAwMCkgPj4gMTY7CisKKwlpZiAoZXRkLT5md192ZXJzaW9uIDwgMHgwMjAwMzAgfHwgZXRkLT5md192ZXJzaW9uID09IDB4MDIwNjAwKQorCQlldGQtPmh3X3ZlcnNpb24gPSAxOworCWVsc2UgaWYgKGV0ZC0+ZndfdmVyc2lvbiA8IDB4MTUwNjAwKQorCQlldGQtPmh3X3ZlcnNpb24gPSAyOworCWVsc2UgaWYgKHZlciA9PSA1KQorCQlldGQtPmh3X3ZlcnNpb24gPSAzOworCWVsc2UgaWYgKHZlciA9PSA2KQorCQlldGQtPmh3X3ZlcnNpb24gPSA0OworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBUdXJuIG9uIHBhY2tldCBjaGVja2luZyBieSBkZWZhdWx0LgorCSAqLworCWV0ZC0+cGFyaXR5Y2hlY2sgPSAxOworCisJLyoKKwkgKiBUaGlzIGZpcm13YXJlIHN1ZmZlcnMgZnJvbSBtaXNyZXBvcnRpbmcgY29vcmRpbmF0ZXMgd2hlbgorCSAqIGEgdG91Y2ggYWN0aW9uIHN0YXJ0cyBjYXVzaW5nIHRoZSBtb3VzZSBjdXJzb3Igb3Igc2Nyb2xsZWQgcGFnZQorCSAqIHRvIGp1bXAuIEVuYWJsZSBhIHdvcmthcm91bmQuCisJICovCisJZXRkLT5qdW1weV9jdXJzb3IgPQorCQkoZXRkLT5md192ZXJzaW9uID09IDB4MDIwMDIyIHx8IGV0ZC0+ZndfdmVyc2lvbiA9PSAweDAyMDYwMCk7CisKKwlpZiAoZXRkLT5od192ZXJzaW9uID4gMSkgeworCQkvKiBGb3Igbm93IHNob3cgZXh0cmEgZGVidWcgaW5mb3JtYXRpb24gKi8KKwkJZXRkLT5kZWJ1ZyA9IDE7CisKKwkJaWYgKGV0ZC0+ZndfdmVyc2lvbiA+PSAweDAyMDgwMCkKKwkJCWV0ZC0+cmVwb3J0c19wcmVzc3VyZSA9IHRydWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBJbml0aWFsaXplIHRoZSB0b3VjaHBhZCBhbmQgY3JlYXRlIHN5c2ZzIGVudHJpZXMKICAqLwogaW50IGVsYW50ZWNoX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCkBAIC03NDMsNzAgKzEyNjgsNTMgQEAKIAkgKiBEbyB0aGUgdmVyc2lvbiBxdWVyeSBhZ2FpbiBzbyB3ZSBjYW4gc3RvcmUgdGhlIHJlc3VsdAogCSAqLwogCWlmIChzeW5hcHRpY3Nfc2VuZF9jbWQocHNtb3VzZSwgRVRQX0ZXX1ZFUlNJT05fUVVFUlksIHBhcmFtKSkgewotCQlwcl9lcnIoImZhaWxlZCB0byBxdWVyeSBmaXJtd2FyZSB2ZXJzaW9uLlxuIik7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJmYWlsZWQgdG8gcXVlcnkgZmlybXdhcmUgdmVyc2lvbi5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9Ci0KIAlldGQtPmZ3X3ZlcnNpb24gPSAocGFyYW1bMF0gPDwgMTYpIHwgKHBhcmFtWzFdIDw8IDgpIHwgcGFyYW1bMl07CiAKLQkvKgotCSAqIEFzc3VtZSBldmVyeSB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiB0aGlzIGlzIG5ldyBFZWVQQyBzdHlsZQotCSAqIGhhcmR3YXJlIHdpdGggNiBieXRlIHBhY2tldHMKLQkgKi8KLQlpZiAoZXRkLT5md192ZXJzaW9uID49IDB4MDIwMDMwKSB7Ci0JCWV0ZC0+aHdfdmVyc2lvbiA9IDI7Ci0JCS8qIEZvciBub3cgc2hvdyBleHRyYSBkZWJ1ZyBpbmZvcm1hdGlvbiAqLwotCQlldGQtPmRlYnVnID0gMTsKLQkJLyogRG9uJ3Qga25vdyBob3cgdG8gZG8gcGFyaXR5IGNoZWNraW5nIGZvciB2ZXJzaW9uIDIgKi8KLQkJZXRkLT5wYXJpdHljaGVjayA9IDA7Ci0KLQkJaWYgKGV0ZC0+ZndfdmVyc2lvbiA+PSAweDAyMDgwMCkKLQkJCWV0ZC0+cmVwb3J0c19wcmVzc3VyZSA9IHRydWU7Ci0KLQl9IGVsc2UgewotCQlldGQtPmh3X3ZlcnNpb24gPSAxOwotCQlldGQtPnBhcml0eWNoZWNrID0gMTsKLQl9Ci0KLQlwcl9pbmZvKCJhc3N1bWluZyBoYXJkd2FyZSB2ZXJzaW9uICVkLCBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkLiVkXG4iLAotCQlldGQtPmh3X3ZlcnNpb24sIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOwotCi0JaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBFVFBfQ0FQQUJJTElUSUVTX1FVRVJZLCBwYXJhbSkpIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gcXVlcnkgY2FwYWJpbGl0aWVzLlxuIik7CisJaWYgKGVsYW50ZWNoX3NldF9wcm9wZXJ0aWVzKGV0ZCkpIHsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgInVua25vd24gaGFyZHdhcmUgdmVyc2lvbiwgYWJvcnRpbmcuLi5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9Ci0JcHJfaW5mbygiU3luYXB0aWNzIGNhcGFiaWxpdGllcyBxdWVyeSByZXN1bHQgMHglMDJ4LCAweCUwMngsIDB4JTAyeC5cbiIsCi0JCXBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOwotCWV0ZC0+Y2FwYWJpbGl0aWVzID0gcGFyYW1bMF07CisJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCSAgICAgImFzc3VtaW5nIGhhcmR3YXJlIHZlcnNpb24gJWQgKHdpdGggZmlybXdhcmUgdmVyc2lvbiAweCUwMnglMDJ4JTAyeClcbiIsCisJCSAgICAgZXRkLT5od192ZXJzaW9uLCBwYXJhbVswXSwgcGFyYW1bMV0sIHBhcmFtWzJdKTsKIAotCS8qCi0JICogVGhpcyBmaXJtd2FyZSBzdWZmZXJzIGZyb20gbWlzcmVwb3J0aW5nIGNvb3JkaW5hdGVzIHdoZW4KLQkgKiBhIHRvdWNoIGFjdGlvbiBzdGFydHMgY2F1c2luZyB0aGUgbW91c2UgY3Vyc29yIG9yIHNjcm9sbGVkIHBhZ2UKLQkgKiB0byBqdW1wLiBFbmFibGUgYSB3b3JrYXJvdW5kLgotCSAqLwotCWlmIChldGQtPmZ3X3ZlcnNpb24gPT0gMHgwMjAwMjIgfHwgZXRkLT5md192ZXJzaW9uID09IDB4MDIwNjAwKSB7Ci0JCXByX2luZm8oImZpcm13YXJlIHZlcnNpb24gMi4wLjM0LzIuNi4wIGRldGVjdGVkLCBlbmFibGluZyBqdW1weSBjdXJzb3Igd29ya2Fyb3VuZFxuIik7Ci0JCWV0ZC0+anVtcHlfY3Vyc29yID0gdHJ1ZTsKKwlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIEVUUF9DQVBBQklMSVRJRVNfUVVFUlksCisJICAgIGV0ZC0+Y2FwYWJpbGl0aWVzKSkgeworCQlwc21vdXNlX2Vycihwc21vdXNlLCAiZmFpbGVkIHRvIHF1ZXJ5IGNhcGFiaWxpdGllcy5cbiIpOworCQlnb3RvIGluaXRfZmFpbDsKIAl9CisJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCSAgICAgIlN5bmFwdGljcyBjYXBhYmlsaXRpZXMgcXVlcnkgcmVzdWx0IDB4JTAyeCwgMHglMDJ4LCAweCUwMnguXG4iLAorCQkgICAgIGV0ZC0+Y2FwYWJpbGl0aWVzWzBdLCBldGQtPmNhcGFiaWxpdGllc1sxXSwKKwkJICAgICBldGQtPmNhcGFiaWxpdGllc1syXSk7CiAKIAlpZiAoZWxhbnRlY2hfc2V0X2Fic29sdXRlX21vZGUocHNtb3VzZSkpIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gcHV0IHRvdWNocGFkIGludG8gYWJzb2x1dGUgbW9kZS5cbiIpOworCQlwc21vdXNlX2Vycihwc21vdXNlLAorCQkJICAgICJmYWlsZWQgdG8gcHV0IHRvdWNocGFkIGludG8gYWJzb2x1dGUgbW9kZS5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9CiAKLQllbGFudGVjaF9zZXRfaW5wdXRfcGFyYW1zKHBzbW91c2UpOworCWlmIChlbGFudGVjaF9zZXRfaW5wdXRfcGFyYW1zKHBzbW91c2UpKSB7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJmYWlsZWQgdG8gcXVlcnkgdG91Y2hwYWQgcmFuZ2UuXG4iKTsKKwkJZ290byBpbml0X2ZhaWw7CisJfQogCiAJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LmtvYmosCiAJCQkJICAgJmVsYW50ZWNoX2F0dHJfZ3JvdXApOwogCWlmIChlcnJvcikgewotCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlcywgZXJyb3I6ICVkLlxuIiwgZXJyb3IpOworCQlwc21vdXNlX2Vycihwc21vdXNlLAorCQkJICAgICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXMsIGVycm9yOiAlZC5cbiIsCisJCQkgICAgZXJyb3IpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9CiAKIAlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gZWxhbnRlY2hfcHJvY2Vzc19ieXRlOwogCXBzbW91c2UtPmRpc2Nvbm5lY3QgPSBlbGFudGVjaF9kaXNjb25uZWN0OwogCXBzbW91c2UtPnJlY29ubmVjdCA9IGVsYW50ZWNoX3JlY29ubmVjdDsKLQlwc21vdXNlLT5wa3RzaXplID0gZXRkLT5od192ZXJzaW9uID09IDIgPyA2IDogNDsKKwlwc21vdXNlLT5wa3RzaXplID0gZXRkLT5od192ZXJzaW9uID4gMSA/IDYgOiA0OwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guaCBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guaAppbmRleCBmYWJiMmI5Li45ZTVmMWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW50ZWNoLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFudGVjaC5oCkBAIC0xNiwxNCArMTYsMTcgQEAKIC8qCiAgKiBDb21tYW5kIHZhbHVlcyBmb3IgU3luYXB0aWNzIHN0eWxlIHF1ZXJpZXMKICAqLworI2RlZmluZSBFVFBfRldfSURfUVVFUlkJCQkweDAwCiAjZGVmaW5lIEVUUF9GV19WRVJTSU9OX1FVRVJZCQkweDAxCiAjZGVmaW5lIEVUUF9DQVBBQklMSVRJRVNfUVVFUlkJCTB4MDIKKyNkZWZpbmUgRVRQX1NBTVBMRV9RVUVSWQkJMHgwMwogCiAvKgogICogQ29tbWFuZCB2YWx1ZXMgZm9yIHJlZ2lzdGVyIHJlYWRpbmcgb3Igd3JpdGluZwogICovCiAjZGVmaW5lIEVUUF9SRUdJU1RFUl9SRUFECQkweDEwCiAjZGVmaW5lIEVUUF9SRUdJU1RFUl9XUklURQkJMHgxMQorI2RlZmluZSBFVFBfUkVHSVNURVJfUkVBRFdSSVRFCQkweDAwCiAKIC8qCiAgKiBIYXJkd2FyZSB2ZXJzaW9uIDIgY3VzdG9tIFBTLzIgY29tbWFuZCB2YWx1ZQpAQCAtNjYsMTYgKzY5LDEzIEBACiAjZGVmaW5lIEVUUF9ZTUFYX1YxCQkJKDM4NCAtIEVUUF9FREdFX0ZVWlpfVjEpCiAKIC8qCi0gKiBJdCBzZWVtcyB0aGUgcmVzb2x1dGlvbiBmb3IgaGFyZHdhcmUgdmVyc2lvbiAyIGRvdWJsZWQuCi0gKiBIZW5jZSB0aGUgWCBhbmQgWSByYW5nZXMgYXJlIGRvdWJsZWQgdG9vLgotICogVGhlIGJlemVsIGFyb3VuZCB0aGUgcGFkIGFsc28gYXBwZWFycyB0byBiZSBzbWFsbGVyCisgKiBUaGUgcmVzb2x1dGlvbiBmb3Igb2xkZXIgdjIgaGFyZHdhcmUgZG91YmxlZC4KKyAqIChuZXdlciB2MidzIGZpcm13YXJlIHByb3ZpZGVzIGNvbW1hbmQgc28gd2UgY2FuIHF1ZXJ5KQogICovCi0jZGVmaW5lIEVUUF9FREdFX0ZVWlpfVjIJCTgKLQotI2RlZmluZSBFVFBfWE1JTl9WMgkJCSggICAwICsgRVRQX0VER0VfRlVaWl9WMikKLSNkZWZpbmUgRVRQX1hNQVhfVjIJCQkoMTE1MiAtIEVUUF9FREdFX0ZVWlpfVjIpCi0jZGVmaW5lIEVUUF9ZTUlOX1YyCQkJKCAgIDAgKyBFVFBfRURHRV9GVVpaX1YyKQotI2RlZmluZSBFVFBfWU1BWF9WMgkJCSggNzY4IC0gRVRQX0VER0VfRlVaWl9WMikKKyNkZWZpbmUgRVRQX1hNSU5fVjIJCQkwCisjZGVmaW5lIEVUUF9YTUFYX1YyCQkJMTE1MgorI2RlZmluZSBFVFBfWU1JTl9WMgkJCTAKKyNkZWZpbmUgRVRQX1lNQVhfVjIJCQk3NjgKIAogI2RlZmluZSBFVFBfUE1JTl9WMgkJCTAKICNkZWZpbmUgRVRQX1BNQVhfVjIJCQkyNTUKQEAgLTgzLDE3ICs4MywzNyBAQAogI2RlZmluZSBFVFBfV01BWF9WMgkJCTE1CiAKIC8qCi0gKiBGb3IgdHdvIGZpbmdlciB0b3VjaGVzIHRoZSBjb29yZGluYXRlIG9mIGVhY2ggZmluZ2VyIGdldHMgcmVwb3J0ZWQKLSAqIHNlcGFyYXRlbHkgYnV0IHdpdGggcmVkdWNlZCByZXNvbHV0aW9uLgorICogdjMgaGFyZHdhcmUgaGFzIDIga2luZHMgb2YgcGFja2V0IHR5cGVzLAorICogdjQgaGFyZHdhcmUgaGFzIDMuCiAgKi8KLSNkZWZpbmUgRVRQXzJGVF9GVVpaCQkJNAorI2RlZmluZSBQQUNLRVRfVU5LTk9XTgkJCTB4MDEKKyNkZWZpbmUgUEFDS0VUX0RFQk9VTkNFCQkJMHgwMgorI2RlZmluZSBQQUNLRVRfVjNfSEVBRAkJCTB4MDMKKyNkZWZpbmUgUEFDS0VUX1YzX1RBSUwJCQkweDA0CisjZGVmaW5lIFBBQ0tFVF9WNF9IRUFECQkJMHgwNQorI2RlZmluZSBQQUNLRVRfVjRfTU9USU9OCQkweDA2CisjZGVmaW5lIFBBQ0tFVF9WNF9TVEFUVVMJCTB4MDcKIAotI2RlZmluZSBFVFBfMkZUX1hNSU4JCQkoICAwICsgRVRQXzJGVF9GVVpaKQotI2RlZmluZSBFVFBfMkZUX1hNQVgJCQkoMjg4IC0gRVRQXzJGVF9GVVpaKQotI2RlZmluZSBFVFBfMkZUX1lNSU4JCQkoICAwICsgRVRQXzJGVF9GVVpaKQotI2RlZmluZSBFVFBfMkZUX1lNQVgJCQkoMTkyIC0gRVRQXzJGVF9GVVpaKQorLyoKKyAqIHRyYWNrIHVwIHRvIDUgZmluZ2VycyBmb3IgdjQgaGFyZHdhcmUKKyAqLworI2RlZmluZSBFVFBfTUFYX0ZJTkdFUlMJCQk1CisKKy8qCisgKiB3ZWlnaHQgdmFsdWUgZm9yIHY0IGhhcmR3YXJlCisgKi8KKyNkZWZpbmUgRVRQX1dFSUdIVF9WQUxVRQkJNQorCisvKgorICogVGhlIGJhc2UgcG9zaXRpb24gZm9yIG9uZSBmaW5nZXIsIHY0IGhhcmR3YXJlCisgKi8KK3N0cnVjdCBmaW5nZXJfcG9zIHsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKK307CiAKIHN0cnVjdCBlbGFudGVjaF9kYXRhIHsKKwl1bnNpZ25lZCBjaGFyIHJlZ18wNzsKIAl1bnNpZ25lZCBjaGFyIHJlZ18xMDsKIAl1bnNpZ25lZCBjaGFyIHJlZ18xMTsKIAl1bnNpZ25lZCBjaGFyIHJlZ18yMDsKQEAgLTEwNCwxMyArMTI0LDE2IEBACiAJdW5zaWduZWQgY2hhciByZWdfMjU7CiAJdW5zaWduZWQgY2hhciByZWdfMjY7CiAJdW5zaWduZWQgY2hhciBkZWJ1ZzsKLQl1bnNpZ25lZCBjaGFyIGNhcGFiaWxpdGllczsKKwl1bnNpZ25lZCBjaGFyIGNhcGFiaWxpdGllc1szXTsKIAlib29sIHBhcml0eWNoZWNrOwogCWJvb2wganVtcHlfY3Vyc29yOwogCWJvb2wgcmVwb3J0c19wcmVzc3VyZTsKIAl1bnNpZ25lZCBjaGFyIGh3X3ZlcnNpb247CiAJdW5zaWduZWQgaW50IGZ3X3ZlcnNpb247CiAJdW5zaWduZWQgaW50IHNpbmdsZV9maW5nZXJfcmVwb3J0czsKKwl1bnNpZ25lZCBpbnQgeV9tYXg7CisJdW5zaWduZWQgaW50IHdpZHRoOworCXN0cnVjdCBmaW5nZXJfcG9zIG10W0VUUF9NQVhfRklOR0VSU107CiAJdW5zaWduZWQgY2hhciBwYXJpdHlbMjU2XTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKaW5kZXggNGQxN2Q5Zi4uMDQ3MGRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKQEAgLTEzNiwxMCArMTM2LDEwIEBACiAJLyogZGlzY2FyZCBpZiB0b28gYmlnLCBvciBoYWxmIHRoYXQgYnV0ID4gNCB0aW1lcyB0aGUgcHJldiBkZWx0YSAqLwogCWlmIChhdnggPiByZWNhbGliX2RlbHRhIHx8CiAJCShhdnggPiByZWNhbGliX2RlbHRhIC8gMiAmJiAoKGF2eCAvIDQpID4gcHJpdi0+eGxhc3QpKSkgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZGV0ZWN0ZWQgJWRweCBqdW1wIGluIHhcbiIsIHgpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgImRldGVjdGVkICVkcHgganVtcCBpbiB4XG4iLCB4KTsKIAkJcHJpdi0+eGJpZ2ogPSBhdng7CiAJfSBlbHNlIGlmIChhcHByb3hfaGFsZihhdngsIHByaXYtPnhiaWdqKSkgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZGV0ZWN0ZWQgc2Vjb25kYXJ5ICVkcHgganVtcCBpbiB4XG4iLCB4KTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJkZXRlY3RlZCBzZWNvbmRhcnkgJWRweCBqdW1wIGluIHhcbiIsIHgpOwogCQlwcml2LT54YmlnaiA9IGF2eDsKIAkJcHJpdi0+eHNhd19zZWNvbmRhcnkrKzsKIAl9IGVsc2UgewpAQCAtMTUxLDEwICsxNTEsMTAgQEAKIAogCWlmIChhdnkgPiByZWNhbGliX2RlbHRhIHx8CiAJCShhdnkgPiByZWNhbGliX2RlbHRhIC8gMiAmJiAoKGF2eSAvIDQpID4gcHJpdi0+eWxhc3QpKSkgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZGV0ZWN0ZWQgJWRweCBqdW1wIGluIHlcbiIsIHkpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgImRldGVjdGVkICVkcHgganVtcCBpbiB5XG4iLCB5KTsKIAkJcHJpdi0+eWJpZ2ogPSBhdnk7CiAJfSBlbHNlIGlmIChhcHByb3hfaGFsZihhdnksIHByaXYtPnliaWdqKSkgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZGV0ZWN0ZWQgc2Vjb25kYXJ5ICVkcHgganVtcCBpbiB5XG4iLCB5KTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJkZXRlY3RlZCBzZWNvbmRhcnkgJWRweCBqdW1wIGluIHlcbiIsIHkpOwogCQlwcml2LT55YmlnaiA9IGF2eTsKIAkJcHJpdi0+eXNhd19zZWNvbmRhcnkrKzsKIAl9IGVsc2UgewpAQCAtMTY4LDcgKzE2OCw3IEBACiAJcHJpdi0+eWxhc3QgPSBhdnk7CiAKIAlpZiAoZG9fcmVjYWwgJiYganVtcHlfZGVsYXkpIHsKLQkJaGdwa19lcnIocHNtb3VzZSwgInNjaGVkdWxpbmcgcmVjYWxpYnJhdGlvblxuIik7CisJCXBzbW91c2Vfd2Fybihwc21vdXNlLCAic2NoZWR1bGluZyByZWNhbGlicmF0aW9uXG4iKTsKIAkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwcml2LT5yZWNhbGliX3dxLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoanVtcHlfZGVsYXkpKTsKIAl9CkBAIC0yNjAsOCArMjYwLDggQEAKIAkJICogbW92ZW1lbnQsIGl0IGlzIHByb2JhYmx5IGEgY2FzZSBvZiB0aGUgdXNlciBtb3ZpbmcgdGhlCiAJCSAqIGN1cnNvciB2ZXJ5IHNsb3dseSBhY3Jvc3MgdGhlIHNjcmVlbi4gKi8KIAkJaWYgKGFicyhwcml2LT54X3RhbGx5KSA8IDMgJiYgYWJzKHByaXYtPnlfdGFsbHkpIDwgMykgewotCQkJaGdwa19lcnIocHNtb3VzZSwgInBhY2tldCBzcGV3IGRldGVjdGVkICglZCwlZClcbiIsCi0JCQkJIHByaXYtPnhfdGFsbHksIHByaXYtPnlfdGFsbHkpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJwYWNrZXQgc3BldyBkZXRlY3RlZCAoJWQsJWQpXG4iLAorCQkJCSAgICAgcHJpdi0+eF90YWxseSwgcHJpdi0+eV90YWxseSk7CiAJCQlwcml2LT5zcGV3X2ZsYWcgPSBSRUNBTElCUkFUSU5HOwogCQkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwcml2LT5yZWNhbGliX3dxLAogCQkJCQkgICBtc2Vjc190b19qaWZmaWVzKHNwZXdfZGVsYXkpKTsKQEAgLTMzMywxMiArMzMzLDEyIEBACiAJfQogCiAJaWYgKCF2YWxpZCkKLQkJaGdwa19kYmcocHNtb3VzZSwKLQkJCSAiYmFkIGRhdGEsIG1vZGUgJWQgKCVkKSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLQkJCSBwcml2LT5tb2RlLCBwa3RjbnQsCi0JCQkgcHNtb3VzZS0+cGFja2V0WzBdLCBwc21vdXNlLT5wYWNrZXRbMV0sCi0JCQkgcHNtb3VzZS0+cGFja2V0WzJdLCBwc21vdXNlLT5wYWNrZXRbM10sCi0JCQkgcHNtb3VzZS0+cGFja2V0WzRdLCBwc21vdXNlLT5wYWNrZXRbNV0pOworCQlwc21vdXNlX2RiZyhwc21vdXNlLAorCQkJICAgICJiYWQgZGF0YSwgbW9kZSAlZCAoJWQpICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJICAgIHByaXYtPm1vZGUsIHBrdGNudCwKKwkJCSAgICBwc21vdXNlLT5wYWNrZXRbMF0sIHBzbW91c2UtPnBhY2tldFsxXSwKKwkJCSAgICBwc21vdXNlLT5wYWNrZXRbMl0sIHBzbW91c2UtPnBhY2tldFszXSwKKwkJCSAgICBwc21vdXNlLT5wYWNrZXRbNF0sIHBzbW91c2UtPnBhY2tldFs1XSk7CiAKIAlyZXR1cm4gdmFsaWQ7CiB9CkBAIC0zNjEsMTkgKzM2MSwyMCBAQAogCiAJCWlucHV0X3JlcG9ydF9hYnMoaWRldiwgQUJTX1BSRVNTVVJFLCB6KTsKIAkJaWYgKHRwZGVidWcpCi0JCQloZ3BrX2RiZyhwc21vdXNlLCAicGQ9JWQgZmQ9JWQgej0lZCIsCi0JCQkJIHB0X2Rvd24sIGZpbmdlcl9kb3duLCB6KTsKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsICJwZD0lZCBmZD0lZCB6PSVkIiwKKwkJCQkgICAgcHRfZG93biwgZmluZ2VyX2Rvd24sIHopOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFBlblRhYmxldCBtb2RlIGRvZXMgbm90IHJlcG9ydCBwcmVzc3VyZSwgc28gd2UgZG9uJ3QKIAkJICogcmVwb3J0IGl0IGhlcmUKIAkJICovCiAJCWlmICh0cGRlYnVnKQotCQkJaGdwa19kYmcocHNtb3VzZSwgInBkPSVkICIsIGRvd24pOworCQkJcHNtb3VzZV9kYmcocHNtb3VzZSwgInBkPSVkICIsIGRvd24pOwogCX0KIAogCWlmICh0cGRlYnVnKQotCQloZ3BrX2RiZyhwc21vdXNlLCAibD0lZCByPSVkIHg9JWQgeT0lZFxuIiwgbGVmdCwgcmlnaHQsIHgsIHkpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAibD0lZCByPSVkIHg9JWQgeT0lZFxuIiwKKwkJCSAgICBsZWZ0LCByaWdodCwgeCwgeSk7CiAKIAlpbnB1dF9yZXBvcnRfa2V5KGlkZXYsIEJUTl9UT1VDSCwgZG93bik7CiAJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBCVE5fTEVGVCwgbGVmdCk7CkBAIC0zOTUsNyArMzk2LDcgQEAKIAlpZiAoeCA9PSBwcml2LT5hYnNfeCAmJiB5ID09IHByaXYtPmFic195KSB7CiAJCWlmICgrK3ByaXYtPmR1cGVfY291bnQgPiBTUEVXX1dBVENIX0NPVU5UKSB7CiAJCQlpZiAodHBkZWJ1ZykKLQkJCQloZ3BrX2RiZyhwc21vdXNlLCAiaGFyZCBzcGV3IGRldGVjdGVkXG4iKTsKKwkJCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiaGFyZCBzcGV3IGRldGVjdGVkXG4iKTsKIAkJCXByaXYtPnNwZXdfZmxhZyA9IFJFQ0FMSUJSQVRJTkc7CiAJCQlwc21vdXNlX3F1ZXVlX3dvcmsocHNtb3VzZSwgJnByaXYtPnJlY2FsaWJfd3EsCiAJCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoc3Bld19kZWxheSkpOwpAQCAtNDEyLDcgKzQxMyw3IEBACiAJCWludCB5X2RpZmYgPSBwcml2LT5hYnNfeSAtIHk7CiAJCWlmIChoZ3BrX2Rpc2NhcmRfZGVjYXlfaGFjayhwc21vdXNlLCB4X2RpZmYsIHlfZGlmZikpIHsKIAkJCWlmICh0cGRlYnVnKQotCQkJCWhncGtfZGJnKHBzbW91c2UsICJkaXNjYXJkaW5nXG4iKTsKKwkJCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiZGlzY2FyZGluZ1xuIik7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJaGdwa19zcGV3aW5nX2hhY2socHNtb3VzZSwgbGVmdCwgcmlnaHQsIHhfZGlmZiwgeV9kaWZmKTsKQEAgLTQzNywyMCArNDM4LDIxIEBACiAJaW50IHkgPSAoKHBhY2tldFswXSA8PCAzKSAmIDB4MTAwKSAtIHBhY2tldFsyXTsKIAogCWlmIChwYWNrZXRbMF0gJiAweGMwKQotCQloZ3BrX2RiZyhwc21vdXNlLAotCQkJICJvdmVyZmxvdyAtLSAweCUwMnggMHglMDJ4IDB4JTAyeFxuIiwKLQkJCSBwYWNrZXRbMF0sIHBhY2tldFsxXSwgcGFja2V0WzJdKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwKKwkJCSAgICAib3ZlcmZsb3cgLS0gMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCisJCQkgICAgcGFja2V0WzBdLCBwYWNrZXRbMV0sIHBhY2tldFsyXSk7CiAKIAlpZiAoaGdwa19kaXNjYXJkX2RlY2F5X2hhY2socHNtb3VzZSwgeCwgeSkpIHsKIAkJaWYgKHRwZGVidWcpCi0JCQloZ3BrX2RiZyhwc21vdXNlLCAiZGlzY2FyZGluZ1xuIik7CisJCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiZGlzY2FyZGluZ1xuIik7CiAJCXJldHVybjsKIAl9CiAKIAloZ3BrX3NwZXdpbmdfaGFjayhwc21vdXNlLCBsZWZ0LCByaWdodCwgeCwgeSk7CiAKIAlpZiAodHBkZWJ1ZykKLQkJaGdwa19kYmcocHNtb3VzZSwgImw9JWQgcj0lZCB4PSVkIHk9JWRcbiIsIGxlZnQsIHJpZ2h0LCB4LCB5KTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgImw9JWQgcj0lZCB4PSVkIHk9JWRcbiIsCisJCQkgICAgbGVmdCwgcmlnaHQsIHgsIHkpOwogCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCBsZWZ0KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCByaWdodCk7CkBAIC00ODIsOSArNDg0LDggQEAKIAkJCSAqIHVnaCwgZ290IGEgcGFja2V0IGluc2lkZSBvdXIgcmVjYWxpYnJhdGlvbgogCQkJICogd2luZG93LCBzY2hlZHVsZSBhbm90aGVyIHJlY2FsaWJyYXRpb24uCiAJCQkgKi8KLQkJCWhncGtfZGJnKHBzbW91c2UsCi0JCQkJICJwYWNrZXQgaW5zaWRlIGNhbGlicmF0aW9uIHdpbmRvdywgIgotCQkJCSAicXVldWVpbmcgYW5vdGhlciByZWNhbGlicmF0aW9uXG4iKTsKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkJICAgICJwYWNrZXQgaW5zaWRlIGNhbGlicmF0aW9uIHdpbmRvdywgcXVldWVpbmcgYW5vdGhlciByZWNhbGlicmF0aW9uXG4iKTsKIAkJCXBzbW91c2VfcXVldWVfd29yayhwc21vdXNlLCAmcHJpdi0+cmVjYWxpYl93cSwKIAkJCQkJbXNlY3NfdG9famlmZmllcyhwb3N0X2ludGVycnVwdF9kZWxheSkpOwogCQl9CkBAIC02MjgsNyArNjI5LDcgQEAKIAogCWVyciA9IGhncGtfc2VsZWN0X21vZGUocHNtb3VzZSk7CiAJaWYgKGVycikgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZmFpbGVkIHRvIHNlbGVjdCBtb2RlXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgImZhaWxlZCB0byBzZWxlY3QgbW9kZVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC02NDgsMTEgKzY0OSwxMSBAQAogCQlyZXR1cm4gMDsKIAogCWlmICghYXV0b3JlY2FsKSB7Ci0JCWhncGtfZGJnKHBzbW91c2UsICJyZWNhbGlicmF0aW9ucyBkaXNhYmxlZCwgaWdub3JpbmdcbiIpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAicmVjYWxpYnJhdGlvbiBkaXNhYmxlZCwgaWdub3JpbmdcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQloZ3BrX2RiZyhwc21vdXNlLCAicmVjYWxpYnJhdGluZyB0b3VjaHBhZC4uXG4iKTsKKwlwc21vdXNlX2RiZyhwc21vdXNlLCAicmVjYWxpYnJhdGluZyB0b3VjaHBhZC4uXG4iKTsKIAogCS8qIHdlIGRvbid0IHdhbnQgdG8gcmFjZSB3aXRoIHRoZSBpcnEgaGFuZGxlciwgbm9yIHdpdGggcmVzeW5jcyAqLwogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSU5JVElBTElaSU5HKTsKQEAgLTY3NSw3ICs2NzYsNyBAQAogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQUNUSVZBVEVEKTsKIAogCWlmICh0cGRlYnVnKQotCQloZ3BrX2RiZyhwc21vdXNlLCAidG91Y2hwYWQgcmVhY3RpdmF0ZWRcbiIpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAidG91Y2hwYWQgcmVhY3RpdmF0ZWRcbiIpOwogCiAJLyoKIAkgKiBJZiB3ZSBnZXQgcGFja2V0cyByaWdodCBhd2F5IGFmdGVyIHJlY2FsaWJyYXRpbmcsIGl0J3MgbGlrZWx5CkBAIC03MjcsMTYgKzcyOCwxNiBAQAogCiAJCWVyciA9IGhncGtfcmVzZXRfZGV2aWNlKHBzbW91c2UsIGZhbHNlKTsKIAkJaWYgKGVycikgewotCQkJaGdwa19lcnIocHNtb3VzZSwgIkZhaWxlZCB0byByZXNldCBkZXZpY2UhXG4iKTsKKwkJCXBzbW91c2VfZXJyKHBzbW91c2UsICJGYWlsZWQgdG8gcmVzZXQgZGV2aWNlIVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKIAkJLyogc2hvdWxkIGJlIGFsbCBzZXQsIGVuYWJsZSB0aGUgdG91Y2hwYWQgKi8KIAkJcHMyX2NvbW1hbmQoJnBzbW91c2UtPnBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfRU5BQkxFKTsKIAkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9BQ1RJVkFURUQpOwotCQloZ3BrX2RiZyhwc21vdXNlLCAiVG91Y2hwYWQgcG93ZXJlZCB1cC5cbiIpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiVG91Y2hwYWQgcG93ZXJlZCB1cC5cbiIpOwogCX0gZWxzZSB7Ci0JCWhncGtfZGJnKHBzbW91c2UsICJQb3dlcmluZyBvZmYgdG91Y2hwYWQuXG4iKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgIlBvd2VyaW5nIG9mZiB0b3VjaHBhZC5cbiIpOwogCiAJCWlmIChwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIDB4ZWMpIHx8CiAJCSAgICBwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIDB4ZWMpIHx8CkBAIC05MjMsNyArOTI0LDcgQEAKIAlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSA9IHByaXYtPnBzbW91c2U7CiAKIAlpZiAoaGdwa19mb3JjZV9yZWNhbGlicmF0ZShwc21vdXNlKSkKLQkJaGdwa19lcnIocHNtb3VzZSwgInJlY2FsaWJyYXRpb24gZmFpbGVkIVxuIik7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJyZWNhbGlicmF0aW9uIGZhaWxlZCFcbiIpOwogfQogCiBzdGF0aWMgaW50IGhncGtfcmVnaXN0ZXIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCkBAIC05NDcsMTQgKzk0OCwxNSBAQAogCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXYsCiAJCQkJICZwc21vdXNlX2F0dHJfcG93ZXJlZC5kYXR0cik7CiAJaWYgKGVycikgewotCQloZ3BrX2Vycihwc21vdXNlLCAiRmFpbGVkIGNyZWF0aW5nICdwb3dlcmVkJyBzeXNmcyBub2RlXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIkZhaWxlZCBjcmVhdGluZyAncG93ZXJlZCcgc3lzZnMgbm9kZVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwc21vdXNlLT5wczJkZXYuc2VyaW8tPmRldiwKIAkJCQkgJnBzbW91c2VfYXR0cl9oZ3BrX21vZGUuZGF0dHIpOwogCWlmIChlcnIpIHsKLQkJaGdwa19lcnIocHNtb3VzZSwgIkZhaWxlZCBjcmVhdGluZyAnaGdwa19tb2RlJyBzeXNmcyBub2RlXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAiRmFpbGVkIGNyZWF0aW5nICdoZ3BrX21vZGUnIHN5c2ZzIG5vZGVcbiIpOwogCQlnb3RvIGVycl9yZW1vdmVfcG93ZXJlZDsKIAl9CiAKQEAgLTk2Myw4ICs5NjUsOCBAQAogCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LAogCQkJCQkgJnBzbW91c2VfYXR0cl9yZWNhbGlicmF0ZS5kYXR0cik7CiAJCWlmIChlcnIpIHsKLQkJCWhncGtfZXJyKHBzbW91c2UsCi0JCQkJIkZhaWxlZCBjcmVhdGluZyAncmVjYWxpYnJhdGUnIHN5c2ZzIG5vZGVcbiIpOworCQkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCQkgICAgIkZhaWxlZCBjcmVhdGluZyAncmVjYWxpYnJhdGUnIHN5c2ZzIG5vZGVcbiIpOwogCQkJZ290byBlcnJfcmVtb3ZlX21vZGU7CiAJCX0KIAl9CkBAIC0xMDI3LDEzICsxMDI5LDEzIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCWhncGtfZGJnKHBzbW91c2UsICJJRDogJTAyeCAlMDJ4ICUwMnhcbiIsIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOworCXBzbW91c2VfZGJnKHBzbW91c2UsICJJRDogJTAyeCAlMDJ4ICUwMnhcbiIsIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOwogCiAJLyogSEdQSyBzaWduYXR1cmU6IDB4NjcsIDB4MDAsIDB4PG1vZGVsPiAqLwogCWlmIChwYXJhbVswXSAhPSAweDY3IHx8IHBhcmFtWzFdICE9IDB4MDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JaGdwa19pbmZvKHBzbW91c2UsICJPTFBDIHRvdWNocGFkIHJldmlzaW9uIDB4JXhcbiIsIHBhcmFtWzJdKTsKKwlwc21vdXNlX2luZm8ocHNtb3VzZSwgIk9MUEMgdG91Y2hwYWQgcmV2aXNpb24gMHgleFxuIiwgcGFyYW1bMl0pOwogCiAJcmV0dXJuIHBhcmFtWzJdOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmggYi9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuaAppbmRleCAzMTFjMGU4Li5kZDY4Njc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuaAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuaApAQCAtNDYsMTcgKzQ2LDYgQEAKIAlpbnQgeHNhd19zZWNvbmRhcnksIHlzYXdfc2Vjb25kYXJ5OyAvKiBqdW1waW5lc3MgZGV0ZWN0aW9uICovCiB9OwogCi0jZGVmaW5lIGhncGtfZGJnKHBzbW91c2UsIGZvcm1hdCwgYXJnLi4uKQkJXAotCWRldl9kYmcoJihwc21vdXNlKS0+cHMyZGV2LnNlcmlvLT5kZXYsIGZvcm1hdCwgIyMgYXJnKQotI2RlZmluZSBoZ3BrX2Vycihwc21vdXNlLCBmb3JtYXQsIGFyZy4uLikJCVwKLQlkZXZfZXJyKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LCBmb3JtYXQsICMjIGFyZykKLSNkZWZpbmUgaGdwa19pbmZvKHBzbW91c2UsIGZvcm1hdCwgYXJnLi4uKQkJXAotCWRldl9pbmZvKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LCBmb3JtYXQsICMjIGFyZykKLSNkZWZpbmUgaGdwa193YXJuKHBzbW91c2UsIGZvcm1hdCwgYXJnLi4uKQkJXAotCWRldl93YXJuKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LCBmb3JtYXQsICMjIGFyZykKLSNkZWZpbmUgaGdwa19ub3RpY2UocHNtb3VzZSwgZm9ybWF0LCBhcmcuLi4pCQlcCi0JZGV2X25vdGljZSgmKHBzbW91c2UpLT5wczJkZXYuc2VyaW8tPmRldiwgZm9ybWF0LCAjIyBhcmcpCi0KICNpZmRlZiBDT05GSUdfTU9VU0VfUFMyX09MUEMKIHZvaWQgaGdwa19tb2R1bGVfaW5pdCh2b2lkKTsKIGludCBoZ3BrX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgYm9vbCBzZXRfcHJvcGVydGllcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMKaW5kZXggODNiY2FiYS4uMmM0ZGI2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYwpAQCAtMTY5LDggKzE2OSw4IEBACiAKIAlpZiAocmVsYXRpdmVfcGFja2V0KSB7CiAJCWlmICghZGV2MikKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImxpZmVib29rLmM6IGdvdCByZWxhdGl2ZSBwYWNrZXQgIgotCQkJCSJidXQgbm8gcmVsYXRpdmUgZGV2aWNlIHNldCB1cFxuIik7CisJCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwKKwkJCQkgICAgICJnb3QgcmVsYXRpdmUgcGFja2V0IGJ1dCBubyByZWxhdGl2ZSBkZXZpY2Ugc2V0IHVwXG4iKTsKIAl9IGVsc2UgewogCQlpZiAobGlmZWJvb2tfdXNlXzZieXRlX3Byb3RvKSB7CiAJCQlpbnB1dF9yZXBvcnRfYWJzKGRldjEsIEFCU19YLApAQCAtMjEyLDcgKzIxMiw3IEBACiAKIAkvKgogCSAqIEVuYWJsZSBhYnNvbHV0ZSBvdXRwdXQgLS0gcHMyX2NvbW1hbmQgZmFpbHMgYWx3YXlzIGJ1dCBpZgotCSAqIHlvdSBsZWF2ZSB0aGlzIGNhbGwgb3V0IHRoZSB0b3VjaHNyZWVuIHdpbGwgbmV2ZXIgc2VuZAorCSAqIHlvdSBsZWF2ZSB0aGlzIGNhbGwgb3V0IHRoZSB0b3VjaHNjcmVlbiB3aWxsIG5ldmVyIHNlbmQKIAkgKiBhYnNvbHV0ZSBjb29yZGluYXRlcwogCSAqLwogCXBhcmFtID0gbGlmZWJvb2tfdXNlXzZieXRlX3Byb3RvID8gMHgwOCA6IDB4MDc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYwppbmRleCBjOTk4M2FlLi5mYWFjMmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKQEAgLTgyLDExICs4MiwxMSBAQAogCQkJcGFja2V0WzBdID0gcGFja2V0WzJdIHwgMHgwODsKIAkJCWJyZWFrOwogCi0jaWZkZWYgREVCVUcKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzbW91c2UuYzogUmVjZWl2ZWQgUFMyKysgcGFja2V0ICMleCwgYnV0IGRvbid0IGtub3cgaG93IHRvIGhhbmRsZS5cbiIsCi0JCQkJKHBhY2tldFsxXSA+PiA0KSB8IChwYWNrZXRbMF0gJiAweDMwKSk7Ci0jZW5kaWYKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkJICAgICJSZWNlaXZlZCBQUzIrKyBwYWNrZXQgIyV4LCBidXQgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLlxuIiwKKwkJCQkgICAgKHBhY2tldFsxXSA+PiA0KSB8IChwYWNrZXRbMF0gJiAweDMwKSk7CisJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIFN0YW5kYXJkIFBTLzIgbW90aW9uIGRhdGEgKi8KQEAgLTM4Miw3ICszODIsNyBAQAogCQl9CiAKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2dpcHMycHA6IERldGVjdGVkIHVua25vd24gbG9naXRlY2ggbW91c2UgbW9kZWwgJWRcbiIsIG1vZGVsKTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJEZXRlY3RlZCB1bmtub3duIExvZ2l0ZWNoIG1vdXNlIG1vZGVsICVkXG4iLCBtb2RlbCk7CiAJfQogCiAJaWYgKHNldF9wcm9wZXJ0aWVzKSB7CkBAIC00MDAsOSArNDAwLDkgQEAKIAkJCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXYsCiAJCQkJCQkJICAgJnBzbW91c2VfYXR0cl9zbWFydHNjcm9sbC5kYXR0cik7CiAJCQkJaWYgKGVycm9yKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkJImxvZ2lwczJwcC5jOiBmYWlsZWQgdG8gY3JlYXRlIHNtYXJ0c2Nyb2xsICIKLQkJCQkJCSJzeXNmcyBhdHRyaWJ1dGUsIGVycm9yOiAlZFxuIiwgZXJyb3IpOworCQkJCQlwc21vdXNlX2Vycihwc21vdXNlLAorCQkJCQkJICAgICJmYWlsZWQgdG8gY3JlYXRlIHNtYXJ0c2Nyb2xsIHN5c2ZzIGF0dHJpYnV0ZSwgZXJyb3I6ICVkXG4iLAorCQkJCQkJICAgIGVycm9yKTsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCmluZGV4IDNmNzRiYWUuLjlmMzUyZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwpAQCAtMTEsNiArMTEsOSBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpCQlLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorI2RlZmluZSBwc21vdXNlX2ZtdChmbXQpCWZtdAorCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yNTEsMTEgKzI1NCwxNCBAQAogCXN3aXRjaCAocmMpIHsKIAljYXNlIFBTTU9VU0VfQkFEX0RBVEE6CiAJCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0FDVElWQVRFRCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiAlcyBhdCAlcyBsb3N0IHN5bmMgYXQgYnl0ZSAlZFxuIiwKLQkJCQlwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzLCBwc21vdXNlLT5wa3RjbnQpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiJXMgYXQgJXMgbG9zdCBzeW5jIGF0IGJ5dGUgJWRcbiIsCisJCQkJICAgICBwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzLAorCQkJCSAgICAgcHNtb3VzZS0+cGt0Y250KTsKIAkJCWlmICgrK3BzbW91c2UtPm91dF9vZl9zeW5jX2NudCA9PSBwc21vdXNlLT5yZXNldGFmdGVyKSB7CiAJCQkJX19wc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lHTk9SRSk7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJwc21vdXNlLmM6IGlzc3VpbmcgcmVjb25uZWN0IHJlcXVlc3RcbiIpOworCQkJCXBzbW91c2Vfbm90aWNlKHBzbW91c2UsCisJCQkJCQkiaXNzdWluZyByZWNvbm5lY3QgcmVxdWVzdFxuIik7CiAJCQkJc2VyaW9fcmVjb25uZWN0KHBzbW91c2UtPnBzMmRldi5zZXJpbyk7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQpAQCAtMjY3LDggKzI3Myw5IEBACiAJCXBzbW91c2UtPnBrdGNudCA9IDA7CiAJCWlmIChwc21vdXNlLT5vdXRfb2Zfc3luY19jbnQpIHsKIAkJCXBzbW91c2UtPm91dF9vZl9zeW5jX2NudCA9IDA7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgInBzbW91c2UuYzogJXMgYXQgJXMgLSBkcml2ZXIgcmVzeW5jaGVkLlxuIiwKLQkJCQlwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzKTsKKwkJCXBzbW91c2Vfbm90aWNlKHBzbW91c2UsCisJCQkJCSIlcyBhdCAlcyAtIGRyaXZlciByZXN5bmNlZC5cbiIsCisJCQkJCXBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0yOTUsOSArMzAyLDEwIEBACiAJCSAgICAgKChmbGFncyAmIFNFUklPX1BBUklUWSkgJiYgIXBzbW91c2UtPmlnbm9yZV9wYXJpdHkpKSkgewogCiAJCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0FDVElWQVRFRCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzbW91c2UuYzogYmFkIGRhdGEgZnJvbSBLQkMgLSVzJXNcbiIsCi0JCQkJZmxhZ3MgJiBTRVJJT19USU1FT1VUID8gIiB0aW1lb3V0IiA6ICIiLAotCQkJCWZsYWdzICYgU0VSSU9fUEFSSVRZID8gIiBiYWQgcGFyaXR5IiA6ICIiKTsKKwkJCXBzbW91c2Vfd2Fybihwc21vdXNlLAorCQkJCSAgICAgImJhZCBkYXRhIGZyb20gS0JDIC0lcyVzXG4iLAorCQkJCSAgICAgZmxhZ3MgJiBTRVJJT19USU1FT1VUID8gIiB0aW1lb3V0IiA6ICIiLAorCQkJCSAgICAgZmxhZ3MgJiBTRVJJT19QQVJJVFkgPyAiIGJhZCBwYXJpdHkiIDogIiIpOwogCQlwczJfY21kX2Fib3J0ZWQoJnBzbW91c2UtPnBzMmRldik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMxNSw4ICszMjMsOCBAQAogCiAJaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfQUNUSVZBVEVEICYmCiAJICAgIHBzbW91c2UtPnBrdGNudCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIHBzbW91c2UtPmxhc3QgKyBIWi8yKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJwc21vdXNlLmM6ICVzIGF0ICVzIGxvc3Qgc3luY2hyb25pemF0aW9uLCB0aHJvd2luZyAlZCBieXRlcyBhd2F5LlxuIiwKLQkJICAgICAgIHBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMsIHBzbW91c2UtPnBrdGNudCk7CisJCXBzbW91c2VfaW5mbyhwc21vdXNlLCAiJXMgYXQgJXMgbG9zdCBzeW5jaHJvbml6YXRpb24sIHRocm93aW5nICVkIGJ5dGVzIGF3YXkuXG4iLAorCQkJICAgICBwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzLCBwc21vdXNlLT5wa3RjbnQpOwogCQlwc21vdXNlLT5iYWRieXRlID0gcHNtb3VzZS0+cGFja2V0WzBdOwogCQlfX3BzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfUkVTWU5DSU5HKTsKIAkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwc21vdXNlLT5yZXN5bmNfd29yaywgMCk7CkBAIC05NDMsNyArOTUxLDggQEAKICAqLwogCiAJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfUkVTRVRfRElTKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiBGYWlsZWQgdG8gcmVzZXQgbW91c2Ugb24gJXNcbiIsIHBzMmRldi0+c2VyaW8tPnBoeXMpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgIkZhaWxlZCB0byByZXNldCBtb3VzZSBvbiAlc1xuIiwKKwkJCSAgICAgcHMyZGV2LT5zZXJpby0+cGh5cyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMDUsOCArMTAxNCw4IEBACiBzdGF0aWMgdm9pZCBwc21vdXNlX2FjdGl2YXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQogewogCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBOVUxMLCBQU01PVVNFX0NNRF9FTkFCTEUpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwc21vdXNlLmM6IEZhaWxlZCB0byBlbmFibGUgbW91c2Ugb24gJXNcbiIsCi0JCQlwc21vdXNlLT5wczJkZXYuc2VyaW8tPnBoeXMpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgIkZhaWxlZCB0byBlbmFibGUgbW91c2Ugb24gJXNcbiIsCisJCQkgICAgIHBzbW91c2UtPnBzMmRldi5zZXJpby0+cGh5cyk7CiAKIAlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0FDVElWQVRFRCk7CiB9CkBAIC0xMDIwLDE0ICsxMDI5LDE0IEBACiBzdGF0aWMgdm9pZCBwc21vdXNlX2RlYWN0aXZhdGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJaWYgKHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX0RJU0FCTEUpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwc21vdXNlLmM6IEZhaWxlZCB0byBkZWFjdGl2YXRlIG1vdXNlIG9uICVzXG4iLAotCQkJcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJGYWlsZWQgdG8gZGVhY3RpdmF0ZSBtb3VzZSBvbiAlc1xuIiwKKwkJCSAgICAgcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKIAogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOwogfQogCiAvKgotICogcHNtb3VzZV9wb2xsKCkgLSBkZWZhdWx0IHBvbGwgaGFubGRlci4gRXZlcnlvbmUgZXhjZXB0IGZvciBBTFBTIHVzZXMgaXQuCisgKiBwc21vdXNlX3BvbGwoKSAtIGRlZmF1bHQgcG9sbCBoYW5kbGVyLiBFdmVyeW9uZSBleGNlcHQgZm9yIEFMUFMgdXNlcyBpdC4KICAqLwogCiBzdGF0aWMgaW50IHBzbW91c2VfcG9sbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKQEAgLTExMTUsMTQgKzExMjQsMTUgQEAKIAl9CiAKIAlpZiAoIWVuYWJsZWQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiBmYWlsZWQgdG8gcmUtZW5hYmxlIG1vdXNlIG9uICVzXG4iLAotCQkJcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJmYWlsZWQgdG8gcmUtZW5hYmxlIG1vdXNlIG9uICVzXG4iLAorCQkJICAgICBwc21vdXNlLT5wczJkZXYuc2VyaW8tPnBoeXMpOwogCQlmYWlsZWQgPSB0cnVlOwogCX0KIAogCWlmIChmYWlsZWQpIHsKIAkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JR05PUkUpOwotCQlwcmludGsoS0VSTl9JTkZPICJwc21vdXNlLmM6IHJlc3luYyBmYWlsZWQsIGlzc3VpbmcgcmVjb25uZWN0IHJlcXVlc3RcbiIpOworCQlwc21vdXNlX2luZm8ocHNtb3VzZSwKKwkJCSAgICAgInJlc3luYyBmYWlsZWQsIGlzc3VpbmcgcmVjb25uZWN0IHJlcXVlc3RcbiIpOwogCQlzZXJpb19yZWNvbm5lY3Qoc2VyaW8pOwogCX0gZWxzZQogCQlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0FDVElWQVRFRCk7CkBAIC0xMTU1LDggKzExNjUsOCBAQAogCSAqIERpc2FibGUgc3RyZWFtIG1vZGUgc28gY2xlYW51cCByb3V0aW5lIGNhbiBwcm9jZWVkIHVuZGlzdHVyYmVkLgogCSAqLwogCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBOVUxMLCBQU01PVVNFX0NNRF9ESVNBQkxFKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiBGYWlsZWQgdG8gZGlzYWJsZSBtb3VzZSBvbiAlc1xuIiwKLQkJCXBzbW91c2UtPnBzMmRldi5zZXJpby0+cGh5cyk7CisJCXBzbW91c2Vfd2Fybihwc21vdXNlLCAiRmFpbGVkIHRvIGRpc2FibGUgbW91c2Ugb24gJXNcbiIsCisJCQkgICAgIHBzbW91c2UtPnBzMmRldi5zZXJpby0+cGh5cyk7CiAKIAlpZiAocHNtb3VzZS0+Y2xlYW51cCkKIAkJcHNtb3VzZS0+Y2xlYW51cChwc21vdXNlKTsKQEAgLTE0MDAsNyArMTQxMCw4IEBACiAJaW50IHJjID0gLTE7CiAKIAlpZiAoIWRydiB8fCAhcHNtb3VzZSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAicHNtb3VzZTogcmVjb25uZWN0IHJlcXVlc3QsIGJ1dCBzZXJpbyBpcyBkaXNjb25uZWN0ZWQsIGlnbm9yaW5nLi4uXG4iKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwKKwkJCSAgICAicmVjb25uZWN0IHJlcXVlc3QsIGJ1dCBzZXJpbyBpcyBkaXNjb25uZWN0ZWQsIGlnbm9yaW5nLi4uXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTQyNyw4ICsxNDM4LDkgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAotCS8qIG9rLCB0aGUgZGV2aWNlIHR5cGUgKGFuZCBjYXBhYmlsaXRpZXMpIG1hdGNoIHRoZSBvbGQgb25lLAotCSAqIHdlIGNhbiBjb250aW51ZSB1c2luZyBpdCwgY29tcGxldGUgaW50aWFsaXphdGlvbgorCS8qCisJICogT0ssIHRoZSBkZXZpY2UgdHlwZSAoYW5kIGNhcGFiaWxpdGllcykgbWF0Y2ggdGhlIG9sZCBvbmUsCisJICogd2UgY2FuIGNvbnRpbnVlIHVzaW5nIGl0LCBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgogCSAqLwogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOwogCkBAIC0xNTg2LDkgKzE1OTgsOCBAQAogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZzZXJpby0+Y2hpbGRyZW4pKSB7CiAJCWlmICgrK3JldHJ5ID4gMykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJwc21vdXNlOiBmYWlsZWQgdG8gZGVzdHJveSBjaGlsZHJlbiBwb3J0cywgIgotCQkJCSJwcm90b2NvbCBjaGFuZ2UgYWJvcnRlZC5cbiIpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiZmFpbGVkIHRvIGRlc3Ryb3kgY2hpbGRyZW4gcG9ydHMsIHByb3RvY29sIGNoYW5nZSBhYm9ydGVkLlxuIik7CiAJCQlpbnB1dF9mcmVlX2RldmljZShuZXdfZGV2KTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0xNzE1LDcgKzE3MjYsNyBAQAogCiAJa3BzbW91c2VkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtwc21vdXNlZCIpOwogCWlmICgha3BzbW91c2VkX3dxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicHNtb3VzZTogZmFpbGVkIHRvIGNyZWF0ZSBrcHNtb3VzZWQgd29ya3F1ZXVlXG4iKTsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGtwc21vdXNlZCB3b3JrcXVldWVcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKaW5kZXggNTkzZTkxMC4uOWI4NGIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKQEAgLTE1MCw0ICsxNTAsMjkgQEAKIAlzdGF0aWMgc3NpemVfdCBfc2V0KHN0cnVjdCBwc21vdXNlICosIHZvaWQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwlcCiAJX19QU01PVVNFX0RFRklORV9BVFRSX1ZBUihfbmFtZSwgX21vZGUsIF9kYXRhLCBOVUxMLCBfc2V0LCB0cnVlKQogCisjaWZuZGVmIHBzbW91c2VfZm10CisjZGVmaW5lIHBzbW91c2VfZm10KGZtdCkJS0JVSUxEX0JBU0VOQU1FICI6ICIgZm10CisjZW5kaWYKKworI2RlZmluZSBwc21vdXNlX2RiZyhwc21vdXNlLCBmb3JtYXQsIC4uLikJCVwKKwlkZXZfZGJnKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LAkJXAorCQlwc21vdXNlX2ZtdChmb3JtYXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwc21vdXNlX2luZm8ocHNtb3VzZSwgZm9ybWF0LCAuLi4pCQlcCisJZGV2X2luZm8oJihwc21vdXNlKS0+cHMyZGV2LnNlcmlvLT5kZXYsCQlcCisJCSBwc21vdXNlX2ZtdChmb3JtYXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwc21vdXNlX3dhcm4ocHNtb3VzZSwgZm9ybWF0LCAuLi4pCQlcCisJZGV2X3dhcm4oJihwc21vdXNlKS0+cHMyZGV2LnNlcmlvLT5kZXYsCQlcCisJCSBwc21vdXNlX2ZtdChmb3JtYXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwc21vdXNlX2Vycihwc21vdXNlLCBmb3JtYXQsIC4uLikJCVwKKwlkZXZfZXJyKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LAkJXAorCQlwc21vdXNlX2ZtdChmb3JtYXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwc21vdXNlX25vdGljZShwc21vdXNlLCBmb3JtYXQsIC4uLikJCVwKKwlkZXZfbm90aWNlKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LAlcCisJCSAgIHBzbW91c2VfZm10KGZvcm1hdCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIHBzbW91c2VfcHJpbnRrKGxldmVsLCBwc21vdXNlLCBmb3JtYXQsIC4uLikJXAorCWRldl9wcmludGsobGV2ZWwsCQkJCVwKKwkJICAgJihwc21vdXNlKS0+cHMyZGV2LnNlcmlvLT5kZXYsCVwKKwkJICAgcHNtb3VzZV9mbXQoZm9ybWF0KSwgIyNfX1ZBX0FSR1NfXykKKworCiAjZW5kaWYgLyogX1BTTU9VU0VfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9weGE5MzBfdHJrYmFsbC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9weGE5MzBfdHJrYmFsbC5jCmluZGV4IDZjNWQ4NGYuLmVlM2IwY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHhhOTMwX3Rya2JhbGwuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3B4YTkzMF90cmtiYWxsLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCS8qIGhlbGQgdGhlIG1vZHVsZSBpbiByZXNldCwgd2lsbCBiZSBlbmFibGVkIGluIG9wZW4oKSAqLwogCXB4YTkzMF90cmtiYWxsX2Rpc2FibGUodHJrYmFsbCk7CiAKLQllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgcHhhOTMwX3Rya2JhbGxfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCWVycm9yID0gcmVxdWVzdF9pcnEoaXJxLCBweGE5MzBfdHJrYmFsbF9pbnRlcnJ1cHQsIDAsCiAJCQkgICAgcGRldi0+bmFtZSwgdHJrYmFsbCk7CiAJaWYgKGVycm9yKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycTogJWRcbiIsIGVycm9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VudGVsaWMuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VudGVsaWMuYwppbmRleCAyZmM4ODdhLi5jNWIxMmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3NlbnRlbGljLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zZW50ZWxpYy5jCkBAIC02MDcsMTEgKzYwNywxMiBAQAogCiAJcHMyX3BhY2tldF9jbnQrKzsKIAlqaWZmaWVzX21zZWMgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOwotCXByaW50ayhLRVJOX0RFQlVHICIlMDhkbXMgUFMvMiBwYWNrZXRzOiAlMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4XG4iLAotCQlqaWZmaWVzX21zZWMsIHBhY2tldFswXSwgcGFja2V0WzFdLCBwYWNrZXRbMl0sIHBhY2tldFszXSk7CisJcHNtb3VzZV9kYmcocHNtb3VzZSwKKwkJICAgICIlMDhkbXMgUFMvMiBwYWNrZXRzOiAlMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4XG4iLAorCQkgICAgamlmZmllc19tc2VjLCBwYWNrZXRbMF0sIHBhY2tldFsxXSwgcGFja2V0WzJdLCBwYWNrZXRbM10pOwogCiAJaWYgKGppZmZpZXNfbXNlYyAtIHBzMl9sYXN0X3NlY29uZCA+IDEwMDApIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlBTLzIgcGFja2V0cy9zZWMgPSAlZFxuIiwgcHMyX3BhY2tldF9jbnQpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiUFMvMiBwYWNrZXRzL3NlYyA9ICVkXG4iLCBwczJfcGFja2V0X2NudCk7CiAJCXBzMl9wYWNrZXRfY250ID0gMDsKIAkJcHMyX2xhc3Rfc2Vjb25kID0gamlmZmllc19tc2VjOwogCX0KQEAgLTgyMCw5ICs4MjEsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPCi0JCSJGaW5nZXIgU2Vuc2luZyBQYWQsIGh3OiAlZC4lZC4lZCwgc3c6ICVzLCBidXR0b25zOiAlZFxuIiwKLQkJdmVyID4+IDQsIHZlciAmIDB4MEYsIHJldiwgZnNwX2Rydl92ZXIsIGJ1dHRvbnMgJiA3KTsKKwlwc21vdXNlX2luZm8ocHNtb3VzZSwKKwkJICAgICAiRmluZ2VyIFNlbnNpbmcgUGFkLCBodzogJWQuJWQuJWQsIHN3OiAlcywgYnV0dG9uczogJWRcbiIsCisJCSAgICAgdmVyID4+IDQsIHZlciAmIDB4MEYsIHJldiwgZnNwX2Rydl92ZXIsIGJ1dHRvbnMgJiA3KTsKIAogCXBzbW91c2UtPnByaXZhdGUgPSBwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZzcF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKaW5kZXggNTUzOGZjNi4uYzA4MGI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCkBAIC00NCw2ICs0NCwxNiBAQAogI2RlZmluZSBZTUlOX05PTUlOQUwgMTQwOAogI2RlZmluZSBZTUFYX05PTUlOQUwgNDQ0OAogCisvKgorICogU3luYXB0aWNzIHRvdWNocGFkcyByZXBvcnQgdGhlIHkgY29vcmRpbmF0ZSBmcm9tIGJvdHRvbSB0byB0b3AsIHdoaWNoIGlzCisgKiBvcHBvc2l0ZSBmcm9tIHdoYXQgdXNlcnNwYWNlIGV4cGVjdHMuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW52ZXJ0IHkgYmVmb3JlIHJlcG9ydGluZy4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3NfaW52ZXJ0X3koaW50IHkpCit7CisJcmV0dXJuIFlNQVhfTk9NSU5BTCArIFlNSU5fTk9NSU5BTCAtIHk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglTdHVmZiB3ZSBuZWVkIGV2ZW4gd2hlbiB3ZSBkbyBub3Qgd2FudCBuYXRpdmUgU3luYXB0aWNzIHN1cHBvcnQKQEAgLTE1Nyw4ICsxNjcsOCBAQAogCiAJaWYgKFNZTl9FWFRfQ0FQX1JFUVVFU1RTKHByaXYtPmNhcGFiaWxpdGllcykgPj0gMSkgewogCQlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIFNZTl9RVUVfRVhUX0NBUEFCLCBjYXApKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlN5bmFwdGljcyBjbGFpbXMgdG8gaGF2ZSBleHRlbmRlZCBjYXBhYmlsaXRpZXMsIgotCQkJICAgICAgICIgYnV0IEknbSBub3QgYWJsZSB0byByZWFkIHRoZW0uXG4iKTsKKwkJCXBzbW91c2Vfd2Fybihwc21vdXNlLAorCQkJCSAgICAgImRldmljZSBjbGFpbXMgdG8gaGF2ZSBleHRlbmRlZCBjYXBhYmlsaXRpZXMsIGJ1dCBJJ20gbm90IGFibGUgdG8gcmVhZCB0aGVtLlxuIik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT5leHRfY2FwID0gKGNhcFswXSA8PCAxNikgfCAoY2FwWzFdIDw8IDgpIHwgY2FwWzJdOwogCkBAIC0xNzMsOCArMTgzLDggQEAKIAogCWlmIChTWU5fRVhUX0NBUF9SRVFVRVNUUyhwcml2LT5jYXBhYmlsaXRpZXMpID49IDQpIHsKIAkJaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBTWU5fUVVFX0VYVF9DQVBBQl8wQywgY2FwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTeW5hcHRpY3MgY2xhaW1zIHRvIGhhdmUgZXh0ZW5kZWQgY2FwYWJpbGl0eSAweDBjLCIKLQkJCSAgICAgICAiIGJ1dCBJJ20gbm90IGFibGUgdG8gcmVhZCBpdC5cbiIpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiZGV2aWNlIGNsYWltcyB0byBoYXZlIGV4dGVuZGVkIGNhcGFiaWxpdHkgMHgwYywgYnV0IEknbSBub3QgYWJsZSB0byByZWFkIGl0LlxuIik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT5leHRfY2FwXzBjID0gKGNhcFswXSA8PCAxNikgfCAoY2FwWzFdIDw8IDgpIHwgY2FwWzJdOwogCQl9CkBAIC0yMjIsOCArMjMyLDggQEAKIAlpZiAoU1lOX0VYVF9DQVBfUkVRVUVTVFMocHJpdi0+Y2FwYWJpbGl0aWVzKSA+PSA1ICYmCiAJICAgIFNZTl9DQVBfTUFYX0RJTUVOU0lPTlMocHJpdi0+ZXh0X2NhcF8wYykpIHsKIAkJaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBTWU5fUVVFX0VYVF9NQVhfQ09PUkRTLCByZXNwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTeW5hcHRpY3MgY2xhaW1zIHRvIGhhdmUgbWF4IGNvb3JkaW5hdGVzIgotCQkJICAgICAgICIgcXVlcnksIGJ1dCBJJ20gbm90IGFibGUgdG8gcmVhZCBpdC5cbiIpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiZGV2aWNlIGNsYWltcyB0byBoYXZlIG1heCBjb29yZGluYXRlcyBxdWVyeSwgYnV0IEknbSBub3QgYWJsZSB0byByZWFkIGl0LlxuIik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT54X21heCA9IChyZXNwWzBdIDw8IDUpIHwgKChyZXNwWzFdICYgMHgwZikgPDwgMSk7CiAJCQlwcml2LT55X21heCA9IChyZXNwWzJdIDw8IDUpIHwgKChyZXNwWzFdICYgMHhmMCkgPj4gMyk7CkBAIC0yMzMsOCArMjQzLDggQEAKIAlpZiAoU1lOX0VYVF9DQVBfUkVRVUVTVFMocHJpdi0+Y2FwYWJpbGl0aWVzKSA+PSA3ICYmCiAJICAgIFNZTl9DQVBfTUlOX0RJTUVOU0lPTlMocHJpdi0+ZXh0X2NhcF8wYykpIHsKIAkJaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBTWU5fUVVFX0VYVF9NSU5fQ09PUkRTLCByZXNwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTeW5hcHRpY3MgY2xhaW1zIHRvIGhhdmUgbWluIGNvb3JkaW5hdGVzIgotCQkJICAgICAgICIgcXVlcnksIGJ1dCBJJ20gbm90IGFibGUgdG8gcmVhZCBpdC5cbiIpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiZGV2aWNlIGNsYWltcyB0byBoYXZlIG1pbiBjb29yZGluYXRlcyBxdWVyeSwgYnV0IEknbSBub3QgYWJsZSB0byByZWFkIGl0LlxuIik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT54X21pbiA9IChyZXNwWzBdIDw8IDUpIHwgKChyZXNwWzFdICYgMHgwZikgPDwgMSk7CiAJCQlwcml2LT55X21pbiA9IChyZXNwWzJdIDw8IDUpIHwgKChyZXNwWzFdICYgMHhmMCkgPj4gMyk7CkBAIC0yOTQsNyArMzA0LDggQEAKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBwYXJhbSA9IDB4Yzg7CiAJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKIAotCWlmICghU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSkKKwlpZiAoIShTWU5fQ0FQX0FEVl9HRVNUVVJFKHByaXYtPmV4dF9jYXBfMGMpIHx8CisJCQlTWU5fQ0FQX0lNQUdFX1NFTlNPUihwcml2LT5leHRfY2FwXzBjKSkpCiAJCXJldHVybiAwOwogCiAJaWYgKHBzbW91c2Vfc2xpY2VkX2NvbW1hbmQocHNtb3VzZSwgU1lOX1FVRV9NT0RFTCkpCkBAIC0zNzcsNyArMzg4LDggQEAKIAkJCXByaXYtPm1vZGUgJj0gflNZTl9CSVRfRk9VUl9CWVRFX0NMSUVOVDsKIAogCQlpZiAoc3luYXB0aWNzX21vZGVfY21kKHBzbW91c2UsIHByaXYtPm1vZGUpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAic3luYXB0aWNzOiBmYWlsZWQgdG8gc3dpdGNoIGd1ZXN0IHByb3RvY29sXG4iKTsKKwkJCXBzbW91c2Vfd2Fybihwc21vdXNlLAorCQkJCSAgICAgImZhaWxlZCB0byBzd2l0Y2ggZ3Vlc3QgcHJvdG9jb2xcbiIpOwogCX0KIH0KIApAQCAtMzg3LDcgKzM5OSw4IEBACiAKIAlzZXJpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOwogCWlmICghc2VyaW8pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzeW5hcHRpY3M6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHBhc3MtdGhyb3VnaCBwb3J0XG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIHBhc3MtdGhyb3VnaCBwb3J0XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDAxLDcgKzQxNCw4IEBACiAKIAlwc21vdXNlLT5wdF9hY3RpdmF0ZSA9IHN5bmFwdGljc19wdF9hY3RpdmF0ZTsKIAotCXByaW50ayhLRVJOX0lORk8gInNlcmlvOiAlcyBwb3J0IGF0ICVzXG4iLCBzZXJpby0+bmFtZSwgcHNtb3VzZS0+cGh5cyk7CisJcHNtb3VzZV9pbmZvKHBzbW91c2UsICJzZXJpbzogJXMgcG9ydCBhdCAlc1xuIiwKKwkJICAgICBzZXJpby0+bmFtZSwgcHNtb3VzZS0+cGh5cyk7CiAJc2VyaW9fcmVnaXN0ZXJfcG9ydChzZXJpbyk7CiB9CiAKQEAgLTQwOSw2ICs0MjMsNDQgQEAKICAqCUZ1bmN0aW9ucyB0byBpbnRlcnByZXQgdGhlIGFic29sdXRlIG1vZGUgcGFja2V0cwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyB2b2lkIHN5bmFwdGljc19tdF9zdGF0ZV9zZXQoc3RydWN0IHN5bmFwdGljc19tdF9zdGF0ZSAqc3RhdGUsIGludCBjb3VudCwKKwkJCQkgICBpbnQgc2dtLCBpbnQgYWdtKQoreworCXN0YXRlLT5jb3VudCA9IGNvdW50OworCXN0YXRlLT5zZ20gPSBzZ207CisJc3RhdGUtPmFnbSA9IGFnbTsKK30KKworc3RhdGljIHZvaWQgc3luYXB0aWNzX3BhcnNlX2FnbShjb25zdCB1bnNpZ25lZCBjaGFyIGJ1ZltdLAorCQkJCXN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiwKKwkJCQlzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICpodykKK3sKKwlzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICphZ20gPSAmcHJpdi0+YWdtOworCWludCBhZ21fcGFja2V0X3R5cGU7CisKKwlhZ21fcGFja2V0X3R5cGUgPSAoYnVmWzVdICYgMHgzMCkgPj4gNDsKKwlzd2l0Y2ggKGFnbV9wYWNrZXRfdHlwZSkgeworCWNhc2UgMToKKwkJLyogR2VzdHVyZSBwYWNrZXQ6ICh4LCB5LCB6KSBoYWxmIHJlc29sdXRpb24gKi8KKwkJYWdtLT53ID0gaHctPnc7CisJCWFnbS0+eCA9ICgoKGJ1Zls0XSAmIDB4MGYpIDw8IDgpIHwgYnVmWzFdKSA8PCAxOworCQlhZ20tPnkgPSAoKChidWZbNF0gJiAweGYwKSA8PCA0KSB8IGJ1ZlsyXSkgPDwgMTsKKwkJYWdtLT56ID0gKChidWZbM10gJiAweDMwKSB8IChidWZbNV0gJiAweDBmKSkgPDwgMTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCS8qIEFHTS1DT05UQUNUIHBhY2tldDogKGNvdW50LCBzZ20sIGFnbSkgKi8KKwkJc3luYXB0aWNzX210X3N0YXRlX3NldCgmYWdtLT5tdF9zdGF0ZSwgYnVmWzFdLCBidWZbMl0sIGJ1Zls0XSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogUmVjb3JkIHRoYXQgYXQgbGVhc3Qgb25lIEFHTSBoYXMgYmVlbiByZWNlaXZlZCBzaW5jZSBsYXN0IFNHTSAqLworCXByaXYtPmFnbV9wZW5kaW5nID0gdHJ1ZTsKK30KKwogc3RhdGljIGludCBzeW5hcHRpY3NfcGFyc2VfaHdfc3RhdGUoY29uc3QgdW5zaWduZWQgY2hhciBidWZbXSwKIAkJCQkgICAgc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2LAogCQkJCSAgICBzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICpodykKQEAgLTQ0MiwxMSArNDk0LDEwIEBACiAJCQlody0+ZG93biA9ICgoYnVmWzBdIF4gYnVmWzNdKSAmIDB4MDIpID8gMSA6IDA7CiAJCX0KIAotCQlpZiAoU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSAmJiBody0+dyA9PSAyKSB7Ci0JCQkvKiBHZXN0dXJlIHBhY2tldDogKHgsIHksIHopIGF0IGhhbGYgcmVzb2x1dGlvbiAqLwotCQkJcHJpdi0+bXQueCA9ICgoKGJ1Zls0XSAmIDB4MGYpIDw8IDgpIHwgYnVmWzFdKSA8PCAxOwotCQkJcHJpdi0+bXQueSA9ICgoKGJ1Zls0XSAmIDB4ZjApIDw8IDQpIHwgYnVmWzJdKSA8PCAxOwotCQkJcHJpdi0+bXQueiA9ICgoYnVmWzNdICYgMHgzMCkgfCAoYnVmWzVdICYgMHgwZikpIDw8IDE7CisJCWlmICgoU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSB8fAorCQkJU1lOX0NBUF9JTUFHRV9TRU5TT1IocHJpdi0+ZXh0X2NhcF8wYykpICYmCisJCSAgICBody0+dyA9PSAyKSB7CisJCQlzeW5hcHRpY3NfcGFyc2VfYWdtKGJ1ZiwgcHJpdiwgaHcpOwogCQkJcmV0dXJuIDE7CiAJCX0KIApAQCAtNTAyLDggKzU1Myw3IEBACiAJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoZGV2LCBNVF9UT09MX0ZJTkdFUiwgYWN0aXZlKTsKIAlpZiAoYWN0aXZlKSB7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgeCk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwKLQkJCQkgWU1BWF9OT01JTkFMICsgWU1JTl9OT01JTkFMIC0geSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgc3luYXB0aWNzX2ludmVydF95KHkpKTsKIAl9CiB9CiAKQEAgLTUyNiw2ICs1NzYsMzg4IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfcmVwb3J0X2J1dHRvbnMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCisJCQkJICAgICBjb25zdCBzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICpodykKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwc21vdXNlLT5kZXY7CisJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwlpbnQgaTsKKworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgaHctPmxlZnQpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGh3LT5yaWdodCk7CisKKwlpZiAoU1lOX0NBUF9NSURETEVfQlVUVE9OKHByaXYtPmNhcGFiaWxpdGllcykpCisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBody0+bWlkZGxlKTsKKworCWlmIChTWU5fQ0FQX0ZPVVJfQlVUVE9OKHByaXYtPmNhcGFiaWxpdGllcykpIHsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9GT1JXQVJELCBody0+dXApOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0JBQ0ssIGh3LT5kb3duKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU1lOX0NBUF9NVUxUSV9CVVRUT05fTk8ocHJpdi0+ZXh0X2NhcCk7IGkrKykKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8wICsgaSwgaHctPmV4dF9idXR0b25zICYgKDEgPDwgaSkpOworfQorCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfcmVwb3J0X3Nsb3Qoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgc2xvdCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzeW5hcHRpY3NfaHdfc3RhdGUgKmh3KQoreworCWlucHV0X210X3Nsb3QoZGV2LCBzbG90KTsKKwlpbnB1dF9tdF9yZXBvcnRfc2xvdF9zdGF0ZShkZXYsIE1UX1RPT0xfRklOR0VSLCAoaHcgIT0gTlVMTCkpOworCWlmICghaHcpCisJCXJldHVybjsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgaHctPngpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgc3luYXB0aWNzX2ludmVydF95KGh3LT55KSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NVF9QUkVTU1VSRSwgaHctPnopOworfQorCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfcmVwb3J0X210X2RhdGEoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCisJCQkJICAgICBzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlICptdF9zdGF0ZSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBzeW5hcHRpY3NfaHdfc3RhdGUgKnNnbSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwc21vdXNlLT5kZXY7CisJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICphZ20gPSAmcHJpdi0+YWdtOworCXN0cnVjdCBzeW5hcHRpY3NfbXRfc3RhdGUgKm9sZCA9ICZwcml2LT5tdF9zdGF0ZTsKKworCXN3aXRjaCAobXRfc3RhdGUtPmNvdW50KSB7CisJY2FzZSAwOgorCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBOVUxMKTsKKwkJc3luYXB0aWNzX3JlcG9ydF9zbG90KGRldiwgMSwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKG10X3N0YXRlLT5zZ20gPT0gLTEpIHsKKwkJCXN5bmFwdGljc19yZXBvcnRfc2xvdChkZXYsIDAsIE5VTEwpOworCQkJc3luYXB0aWNzX3JlcG9ydF9zbG90KGRldiwgMSwgTlVMTCk7CisJCX0gZWxzZSBpZiAobXRfc3RhdGUtPnNnbSA9PSAwKSB7CisJCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBzZ20pOworCQkJc3luYXB0aWNzX3JlcG9ydF9zbG90KGRldiwgMSwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBOVUxMKTsKKwkJCXN5bmFwdGljc19yZXBvcnRfc2xvdChkZXYsIDEsIHNnbSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogSWYgdGhlIGZpbmdlciBzbG90IGNvbnRhaW5lZCBpbiBTR00gaXMgdmFsaWQsIGFuZCBlaXRoZXIKKwkJICogaGFzbid0IGNoYW5nZWQsIG9yIGlzIG5ldywgdGhlbiByZXBvcnQgU0dNIGluIE1UQiBzbG90IDAuCisJCSAqIE90aGVyd2lzZSwgZW1wdHkgTVRCIHNsb3QgMC4KKwkJICovCisJCWlmIChtdF9zdGF0ZS0+c2dtICE9IC0xICYmCisJCSAgICAobXRfc3RhdGUtPnNnbSA9PSBvbGQtPnNnbSB8fCBvbGQtPnNnbSA9PSAtMSkpCisJCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBzZ20pOworCQllbHNlCisJCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBOVUxMKTsKKworCQkvKgorCQkgKiBJZiB0aGUgZmluZ2VyIHNsb3QgY29udGFpbmVkIGluIEFHTSBpcyB2YWxpZCwgYW5kIGVpdGhlcgorCQkgKiBoYXNuJ3QgY2hhbmdlZCwgb3IgaXMgbmV3LCB0aGVuIHJlcG9ydCBBR00gaW4gTVRCIHNsb3QgMS4KKwkJICogT3RoZXJ3aXNlLCBlbXB0eSBNVEIgc2xvdCAxLgorCQkgKi8KKwkJaWYgKG10X3N0YXRlLT5hZ20gIT0gLTEgJiYKKwkJICAgIChtdF9zdGF0ZS0+YWdtID09IG9sZC0+YWdtIHx8IG9sZC0+YWdtID09IC0xKSkKKwkJCXN5bmFwdGljc19yZXBvcnRfc2xvdChkZXYsIDEsIGFnbSk7CisJCWVsc2UKKwkJCXN5bmFwdGljc19yZXBvcnRfc2xvdChkZXYsIDEsIE5VTEwpOworCQlicmVhazsKKwl9CisKKwkvKiBEb24ndCB1c2UgYWN0aXZlIHNsb3QgY291bnQgdG8gZ2VuZXJhdGUgQlROX1RPT0wgZXZlbnRzLiAqLworCWlucHV0X210X3JlcG9ydF9wb2ludGVyX2VtdWxhdGlvbihkZXYsIGZhbHNlKTsKKworCS8qIFNlbmQgdGhlIG51bWJlciBvZiBmaW5nZXJzIHJlcG9ydGVkIGJ5IHRvdWNocGFkIGl0c2VsZi4gKi8KKwlpbnB1dF9tdF9yZXBvcnRfZmluZ2VyX2NvdW50KGRldiwgbXRfc3RhdGUtPmNvdW50KTsKKworCXN5bmFwdGljc19yZXBvcnRfYnV0dG9ucyhwc21vdXNlLCBzZ20pOworCisJaW5wdXRfc3luYyhkZXYpOworfQorCisvKiBIYW5kbGUgY2FzZSB3aGVyZSBtdF9zdGF0ZS0+Y291bnQgPSAwICovCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzBmKHN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlICptdF9zdGF0ZSkKK3sKKwlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAwLCAtMSwgLTEpOworCXByaXYtPm10X3N0YXRlX2xvc3QgPSBmYWxzZTsKK30KKworLyogSGFuZGxlIGNhc2Ugd2hlcmUgbXRfc3RhdGUtPmNvdW50ID0gMSAqLworc3RhdGljIHZvaWQgc3luYXB0aWNzX2ltYWdlX3NlbnNvcl8xZihzdHJ1Y3Qgc3luYXB0aWNzX2RhdGEgKnByaXYsCisJCQkJICAgICAgc3RydWN0IHN5bmFwdGljc19tdF9zdGF0ZSAqbXRfc3RhdGUpCit7CisJc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSAqYWdtID0gJnByaXYtPmFnbTsKKwlzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlICpvbGQgPSAmcHJpdi0+bXRfc3RhdGU7CisKKwkvKgorCSAqIElmIHRoZSBsYXN0IEFHTSB3YXMgKDAsMCwwKSwgYW5kIHRoZXJlIGlzIG9ubHkgb25lIGZpbmdlciBsZWZ0LAorCSAqIHRoZW4gd2UgYWJzb2x1dGVseSBrbm93IHRoYXQgU0dNIGNvbnRhaW5zIHNsb3QgMCwgYW5kIGFsbCBvdGhlcgorCSAqIGZpbmdlcnMgaGF2ZSBiZWVuIHJlbW92ZWQuCisJICovCisJaWYgKHByaXYtPmFnbV9wZW5kaW5nICYmIGFnbS0+eiA9PSAwKSB7CisJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDEsIDAsIC0xKTsKKwkJcHJpdi0+bXRfc3RhdGVfbG9zdCA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChvbGQtPmNvdW50KSB7CisJY2FzZSAwOgorCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAxLCAwLCAtMSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyoKKwkJICogSWYgbXRfc3RhdGVfbG9zdCwgdGhlbiB0aGUgcHJldmlvdXMgdHJhbnNpdGlvbiB3YXMgMy0+MSwKKwkJICogYW5kIFNHTSBub3cgY29udGFpbnMgZWl0aGVyIHNsb3QgMCBvciAxLCBidXQgd2UgZG9uJ3Qga25vdworCQkgKiB3aGljaC4gIFNvLCB3ZSBqdXN0IGFzc3VtZSB0aGF0IHRoZSBTR00gbm93IGNvbnRhaW5zIHNsb3QgMS4KKwkJICoKKwkJICogSWYgcGVuZGluZyBBR00gYW5kIGVpdGhlcjoKKwkJICogICAoYSkgdGhlIHByZXZpb3VzIFNHTSBzbG90IGNvbnRhaW5zIHNsb3QgMCwgb3IKKwkJICogICAoYikgdGhlcmUgd2FzIG5vIFNHTSBzbG90CisJCSAqIHRoZW4sIHRoZSBTR00gbm93IGNvbnRhaW5zIHNsb3QgMQorCQkgKgorCQkgKiBDYXNlIChhKSBoYXBwZW5zIHdpdGggdmVyeSByYXBpZCAiZHJ1bSByb2xsIiBnZXN0dXJlcywgd2hlcmUKKwkJICogc2xvdCAwIGZpbmdlciBpcyBsaWZ0ZWQgYW5kIGEgbmV3IHNsb3QgMSBmaW5nZXIgdG91Y2hlcworCQkgKiB3aXRoaW4gb25lIHJlcG9ydGluZyBpbnRlcnZhbC4KKwkJICoKKwkJICogQ2FzZSAoYikgaGFwcGVucyBpZiBpbml0aWFsbHkgdHdvIG9yIG1vcmUgZmluZ2VycyB0YXAKKwkJICogYnJpZWZseSwgYW5kIGFsbCBidXQgb25lIGxpZnQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGZpcnN0CisJCSAqIHJlcG9ydGluZyBpbnRlcnZhbC4KKwkJICoKKwkJICogKEluIGJvdGggdGhlc2UgY2FzZXMsIHNsb3QgMCB3aWxsIGJlY29tZXMgZW1wdHksIHNvIFNHTQorCQkgKiBjb250YWlucyBzbG90IDEgd2l0aCB0aGUgbmV3IGZpbmdlcikKKwkJICoKKwkJICogRWxzZSwgaWYgdGhlcmUgd2FzIG5vIHByZXZpb3VzIFNHTSwgaXQgbm93IGNvbnRhaW5zIHNsb3QgMC4KKwkJICoKKwkJICogT3RoZXJ3aXNlLCBTR00gc3RpbGwgY29udGFpbnMgdGhlIHNhbWUgc2xvdC4KKwkJICovCisJCWlmIChwcml2LT5tdF9zdGF0ZV9sb3N0IHx8CisJCSAgICAocHJpdi0+YWdtX3BlbmRpbmcgJiYgb2xkLT5zZ20gPD0gMCkpCisJCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAxLCAxLCAtMSk7CisJCWVsc2UgaWYgKG9sZC0+c2dtID09IC0xKQorCQkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMSwgMCwgLTEpOworCQlicmVhazsKKwljYXNlIDI6CisJCS8qCisJCSAqIElmIG10X3N0YXRlX2xvc3QsIHdlIGRvbid0IGtub3cgd2hpY2ggZmluZ2VyIFNHTSBjb250YWlucy4KKwkJICoKKwkJICogU28sIHJlcG9ydCAxIGZpbmdlciwgYnV0IHdpdGggYm90aCBzbG90cyBlbXB0eS4KKwkJICogV2Ugd2lsbCB1c2Ugc2xvdCAxIG9uIHN1YnNlcXVlbnQgMS0+MQorCQkgKi8KKwkJaWYgKHByaXYtPm10X3N0YXRlX2xvc3QpIHsKKwkJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDEsIC0xLCAtMSk7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBTaW5jZSB0aGUgbGFzdCBBR00gd2FzIE5PVCAoMCwwLDApLCBpdCB3YXMgdGhlIGZpbmdlciBpbgorCQkgKiBzbG90IDAgdGhhdCBoYXMgYmVlbiByZW1vdmVkLgorCQkgKiBTbywgU0dNIG5vdyBjb250YWlucyBwcmV2aW91cyBBR00ncyBzbG90LCBhbmQgQUdNIGlzIG5vdworCQkgKiBlbXB0eS4KKwkJICovCisJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDEsIG9sZC0+YWdtLCAtMSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyoKKwkJICogU2luY2UgbGFzdCBBR00gd2FzIG5vdCAoMCwwLDApLCB3ZSBkb24ndCBrbm93IHdoaWNoIGZpbmdlcgorCQkgKiBpcyBsZWZ0LgorCQkgKgorCQkgKiBTbywgcmVwb3J0IDEgZmluZ2VyLCBidXQgd2l0aCBib3RoIHNsb3RzIGVtcHR5LgorCQkgKiBXZSB3aWxsIHVzZSBzbG90IDEgb24gc3Vic2VxdWVudCAxLT4xCisJCSAqLworCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAxLCAtMSwgLTEpOworCQlwcml2LT5tdF9zdGF0ZV9sb3N0ID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCWNhc2UgNToKKwkJLyogbXRfc3RhdGUgd2FzIHVwZGF0ZWQgYnkgQUdNLUNPTlRBQ1QgcGFja2V0ICovCisJCWJyZWFrOworCX0KK30KKworLyogSGFuZGxlIGNhc2Ugd2hlcmUgbXRfc3RhdGUtPmNvdW50ID0gMiAqLworc3RhdGljIHZvaWQgc3luYXB0aWNzX2ltYWdlX3NlbnNvcl8yZihzdHJ1Y3Qgc3luYXB0aWNzX2RhdGEgKnByaXYsCisJCQkJICAgICAgc3RydWN0IHN5bmFwdGljc19tdF9zdGF0ZSAqbXRfc3RhdGUpCit7CisJc3RydWN0IHN5bmFwdGljc19tdF9zdGF0ZSAqb2xkID0gJnByaXYtPm10X3N0YXRlOworCisJc3dpdGNoIChvbGQtPmNvdW50KSB7CisJY2FzZSAwOgorCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAyLCAwLCAxKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKgorCQkgKiBJZiBwcmV2aW91cyBTR00gY29udGFpbmVkIHNsb3QgMSBvciBoaWdoZXIsIFNHTSBub3cgY29udGFpbnMKKwkJICogc2xvdCAwICh0aGUgbmV3bHkgdG91Y2hpbmcgZmluZ2VyKSBhbmQgQUdNIGNvbnRhaW5zIFNHTSdzCisJCSAqIHByZXZpb3VzIHNsb3QuCisJCSAqCisJCSAqIE90aGVyd2lzZSwgU0dNIHN0aWxsIGNvbnRhaW5zIHNsb3QgMCBhbmQgQUdNIG5vdyBjb250YWlucworCQkgKiBzbG90IDEuCisJCSAqLworCQlpZiAob2xkLT5zZ20gPj0gMSkKKwkJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDIsIDAsIG9sZC0+c2dtKTsKKwkJZWxzZQorCQkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMiwgMCwgMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyoKKwkJICogSWYgbXRfc3RhdGVfbG9zdCwgU0dNIG5vdyBjb250YWlucyBlaXRoZXIgZmluZ2VyIDEgb3IgMiwgYnV0CisJCSAqIHdlIGRvbid0IGtub3cgd2hpY2guCisJCSAqIFNvLCB3ZSBqdXN0IGFzc3VtZSB0aGF0IHRoZSBTR00gY29udGFpbnMgc2xvdCAwIGFuZCBBR00gMS4KKwkJICovCisJCWlmIChwcml2LT5tdF9zdGF0ZV9sb3N0KQorCQkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMiwgMCwgMSk7CisJCS8qCisJCSAqIE90aGVyd2lzZSwgdXNlIHRoZSBzYW1lIG10X3N0YXRlLCBzaW5jZSBpdCBlaXRoZXIgaGFzbid0CisJCSAqIGNoYW5nZWQsIG9yIHdhcyB1cGRhdGVkIGJ5IGEgcmVjZW50bHkgcmVjZWl2ZWQgQUdNLUNPTlRBQ1QKKwkJICogcGFja2V0LgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKgorCQkgKiAzLT4yIHRyYW5zaXRpb25zIGhhdmUgdHdvIHVuc29sdmFibGUgcHJvYmxlbXM6CisJCSAqICAxKSBubyBpbmRpY2F0aW9uIGlzIGdpdmVuIHdoaWNoIGZpbmdlciB3YXMgcmVtb3ZlZAorCQkgKiAgMikgbm8gd2F5IHRvIHRlbGwgaWYgYWdtIHBhY2tldCB3YXMgZm9yIGZpbmdlciAzCisJCSAqICAgICBiZWZvcmUgMy0+Miwgb3IgZmluZ2VyIDIgYWZ0ZXIgMy0+Mi4KKwkJICoKKwkJICogU28sIHJlcG9ydCAyIGZpbmdlcnMsIGJ1dCBlbXB0eSBhbGwgc2xvdHMuCisJCSAqIFdlIHdpbGwgZ3Vlc3Mgc2xvdHMgWzAsMV0gb24gc3Vic2VxdWVudCAyLT4yLgorCQkgKi8KKwkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMiwgLTEsIC0xKTsKKwkJcHJpdi0+bXRfc3RhdGVfbG9zdCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgNDoKKwljYXNlIDU6CisJCS8qIG10X3N0YXRlIHdhcyB1cGRhdGVkIGJ5IEFHTS1DT05UQUNUIHBhY2tldCAqLworCQlicmVhazsKKwl9Cit9CisKKy8qIEhhbmRsZSBjYXNlIHdoZXJlIG10X3N0YXRlLT5jb3VudCA9IDMgKi8KK3N0YXRpYyB2b2lkIHN5bmFwdGljc19pbWFnZV9zZW5zb3JfM2Yoc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2LAorCQkJCSAgICAgIHN0cnVjdCBzeW5hcHRpY3NfbXRfc3RhdGUgKm10X3N0YXRlKQoreworCXN0cnVjdCBzeW5hcHRpY3NfbXRfc3RhdGUgKm9sZCA9ICZwcml2LT5tdF9zdGF0ZTsKKworCXN3aXRjaCAob2xkLT5jb3VudCkgeworCWNhc2UgMDoKKwkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMywgMCwgMik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyoKKwkJICogSWYgcHJldmlvdXMgU0dNIGNvbnRhaW5lZCBzbG90IDIgb3IgaGlnaGVyLCBTR00gbm93IGNvbnRhaW5zCisJCSAqIHNsb3QgMCAob25lIG9mIHRoZSBuZXdseSB0b3VjaGluZyBmaW5nZXJzKSBhbmQgQUdNIGNvbnRhaW5zCisJCSAqIFNHTSdzIHByZXZpb3VzIHNsb3QuCisJCSAqCisJCSAqIE90aGVyd2lzZSwgU0dNIG5vdyBjb250YWlucyBzbG90IDAgYW5kIEFHTSBjb250YWlucyBzbG90IDIuCisJCSAqLworCQlpZiAob2xkLT5zZ20gPj0gMikKKwkJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDMsIDAsIG9sZC0+c2dtKTsKKwkJZWxzZQorCQkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMywgMCwgMik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyoKKwkJICogSWYgdGhlIEFHTSBwcmV2aW91c2x5IGNvbnRhaW5lZCBzbG90IDMgb3IgaGlnaGVyLCB0aGVuIHRoZQorCQkgKiBuZXdseSB0b3VjaGluZyBmaW5nZXIgaXMgaW4gdGhlIGxvd2VzdCBhdmFpbGFibGUgc2xvdC4KKwkJICoKKwkJICogSWYgU0dNIHdhcyBwcmV2aW91c2x5IDEgb3IgaGlnaGVyLCB0aGVuIHRoZSBuZXcgU0dNIGlzCisJCSAqIG5vdyBzbG90IDAgKHdpdGggYSBuZXcgZmluZ2VyKSwgb3RoZXJ3aXNlLCB0aGUgbmV3IGZpbmdlcgorCQkgKiBpcyBub3cgaW4gYSBoaWRkZW4gc2xvdCBiZXR3ZWVuIDAgYW5kIEFHTSdzIHNsb3QuCisJCSAqCisJCSAqIEluIGFsbCBzdWNoIGNhc2VzLCB0aGUgU0dNIG5vdyBjb250YWlucyBzbG90IDAsIGFuZCB0aGUgQUdNCisJCSAqIGNvbnRpbnVlcyB0byBjb250YWluIHRoZSBzYW1lIHNsb3QgYXMgYmVmb3JlLgorCQkgKi8KKwkJaWYgKG9sZC0+YWdtID49IDMpIHsKKwkJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDMsIDAsIG9sZC0+YWdtKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQWZ0ZXIgc29tZSAzLT4xIGFuZCBhbGwgMy0+MiB0cmFuc2l0aW9ucywgd2UgbG9zZSB0cmFjaworCQkgKiBvZiB3aGljaCBzbG90IGlzIHJlcG9ydGVkIGJ5IFNHTSBhbmQgQUdNLgorCQkgKgorCQkgKiBGb3IgMi0+MyBpbiB0aGlzIHN0YXRlLCByZXBvcnQgMyBmaW5nZXJzLCBidXQgZW1wdHkgYWxsCisJCSAqIHNsb3RzLCBhbmQgd2Ugd2lsbCBndWVzcyAoMCwyKSBvbiBhIHN1YnNlcXVlbnQgMC0+My4KKwkJICoKKwkJICogVG8gdXNlcnNwYWNlLCB0aGUgcmVzdWx0aW5nIHRyYW5zaXRpb24gd2lsbCBsb29rIGxpa2U6CisJCSAqICAgIDI6WzAsMV0gLT4gMzpbLTEsLTFdIC0+IDM6WzAsMl0KKwkJICovCisJCWlmIChwcml2LT5tdF9zdGF0ZV9sb3N0KSB7CisJCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAzLCAtMSwgLTEpOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgKFNHTSxBR00pIHJlYWxseSBwcmV2aW91c2x5IGNvbnRhaW5lZCBzbG90cyAoMCwgMSksCisJCSAqIHRoZW4gd2UgY2Fubm90IGtub3cgd2hhdCBzbG90IHdhcyBqdXN0IHJlcG9ydGVkIGJ5IHRoZSBBR00sCisJCSAqIGJlY2F1c2UgdGhlIDItPjMgdHJhbnNpdGlvbiBjYW4gb2NjdXIgZWl0aGVyIGJlZm9yZSBvciBhZnRlcgorCQkgKiB0aGUgQUdNIHBhY2tldC4gVGh1cywgdGhpcyBtb3N0IHJlY2VudCBBR00gY291bGQgY29udGFpbgorCQkgKiBlaXRoZXIgdGhlIHNhbWUgb2xkIHNsb3QgMSBvciB0aGUgbmV3IHNsb3QgMi4KKwkJICogU3Vic2VxdWVudCBBR01zIHdpbGwgYmUgcmVwb3J0aW5nIHNsb3QgMi4KKwkJICoKKwkJICogVG8gdXNlcnNwYWNlLCB0aGUgcmVzdWx0aW5nIHRyYW5zaXRpb24gd2lsbCBsb29rIGxpa2U6CisJCSAqICAgIDI6WzAsMV0gLT4gMzpbMCwtMV0gLT4gMzpbMCwyXQorCQkgKi8KKwkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMywgMCwgLTEpOworCQlicmVhazsKKwljYXNlIDM6CisJCS8qCisJCSAqIElmLCBmb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGUgcHJldmlvdXMgYWdtIHdhcyBpbnZhbGlkLAorCQkgKiBBc3N1bWUgU0dNIG5vdyBjb250YWlucyBzbG90IDAsIEFHTSBub3cgY29udGFpbnMgc2xvdCAyLgorCQkgKi8KKwkJaWYgKG9sZC0+YWdtIDw9IDIpCisJCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAzLCAwLCAyKTsKKwkJLyoKKwkJICogbXRfc3RhdGUgZWl0aGVyIGhhc24ndCBjaGFuZ2VkLCBvciB3YXMgdXBkYXRlZCBieSBhIHJlY2VudGx5CisJCSAqIHJlY2VpdmVkIEFHTS1DT05UQUNUIHBhY2tldC4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSA0OgorCWNhc2UgNToKKwkJLyogbXRfc3RhdGUgd2FzIHVwZGF0ZWQgYnkgQUdNLUNPTlRBQ1QgcGFja2V0ICovCisJCWJyZWFrOworCX0KK30KKworLyogSGFuZGxlIGNhc2Ugd2hlcmUgbXRfc3RhdGUtPmNvdW50ID0gNCwgb3IgPSA1ICovCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzQ1ZihzdHJ1Y3Qgc3luYXB0aWNzX2RhdGEgKnByaXYsCisJCQkJICAgICAgIHN0cnVjdCBzeW5hcHRpY3NfbXRfc3RhdGUgKm10X3N0YXRlKQoreworCS8qIG10X3N0YXRlIHdhcyB1cGRhdGVkIGNvcnJlY3RseSBieSBBR00tQ09OVEFDVCBwYWNrZXQgKi8KKwlwcml2LT5tdF9zdGF0ZV9sb3N0ID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmFwdGljc19pbWFnZV9zZW5zb3JfcHJvY2VzcyhzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwKKwkJCQkJICAgc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSAqc2dtKQoreworCXN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisJc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSAqYWdtID0gJnByaXYtPmFnbTsKKwlzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlIG10X3N0YXRlOworCisJLyogSW5pdGlhbGl6ZSB1c2luZyBjdXJyZW50IG10X3N0YXRlIChhcyB1cGRhdGVkIGJ5IGxhc3QgYWdtKSAqLworCW10X3N0YXRlID0gYWdtLT5tdF9zdGF0ZTsKKworCS8qCisJICogVXBkYXRlIG10X3N0YXRlIHVzaW5nIHRoZSBuZXcgZmluZ2VyIGNvdW50IGFuZCBjdXJyZW50IG10X3N0YXRlLgorCSAqLworCWlmIChzZ20tPnogPT0gMCkKKwkJc3luYXB0aWNzX2ltYWdlX3NlbnNvcl8wZihwcml2LCAmbXRfc3RhdGUpOworCWVsc2UgaWYgKHNnbS0+dyA+PSA0KQorCQlzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzFmKHByaXYsICZtdF9zdGF0ZSk7CisJZWxzZSBpZiAoc2dtLT53ID09IDApCisJCXN5bmFwdGljc19pbWFnZV9zZW5zb3JfMmYocHJpdiwgJm10X3N0YXRlKTsKKwllbHNlIGlmIChzZ20tPncgPT0gMSAmJiBtdF9zdGF0ZS5jb3VudCA8PSAzKQorCQlzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzNmKHByaXYsICZtdF9zdGF0ZSk7CisJZWxzZQorCQlzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzQ1Zihwcml2LCAmbXRfc3RhdGUpOworCisJLyogU2VuZCByZXN1bHRpbmcgaW5wdXQgZXZlbnRzIHRvIHVzZXIgc3BhY2UgKi8KKwlzeW5hcHRpY3NfcmVwb3J0X210X2RhdGEocHNtb3VzZSwgJm10X3N0YXRlLCBzZ20pOworCisJLyogU3RvcmUgdXBkYXRlZCBtdF9zdGF0ZSAqLworCXByaXYtPm10X3N0YXRlID0gYWdtLT5tdF9zdGF0ZSA9IG10X3N0YXRlOworCXByaXYtPmFnbV9wZW5kaW5nID0gZmFsc2U7Cit9CisKIC8qCiAgKiAgY2FsbGVkIGZvciBlYWNoIGZ1bGwgcmVjZWl2ZWQgcGFja2V0IGZyb20gdGhlIHRvdWNocGFkCiAgKi8KQEAgLTUzNiwxMSArOTY4LDE1IEBACiAJc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSBodzsKIAlpbnQgbnVtX2ZpbmdlcnM7CiAJaW50IGZpbmdlcl93aWR0aDsKLQlpbnQgaTsKIAogCWlmIChzeW5hcHRpY3NfcGFyc2VfaHdfc3RhdGUocHNtb3VzZS0+cGFja2V0LCBwcml2LCAmaHcpKQogCQlyZXR1cm47CiAKKwlpZiAoU1lOX0NBUF9JTUFHRV9TRU5TT1IocHJpdi0+ZXh0X2NhcF8wYykpIHsKKwkJc3luYXB0aWNzX2ltYWdlX3NlbnNvcl9wcm9jZXNzKHBzbW91c2UsICZodyk7CisJCXJldHVybjsKKwl9CisKIAlpZiAoaHcuc2Nyb2xsKSB7CiAJCXByaXYtPnNjcm9sbCArPSBody5zY3JvbGw7CiAKQEAgLTU4Niw3ICsxMDIyLDggQEAKIAl9CiAKIAlpZiAoU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSkKLQkJc3luYXB0aWNzX3JlcG9ydF9zZW1pX210X2RhdGEoZGV2LCAmaHcsICZwcml2LT5tdCwgbnVtX2ZpbmdlcnMpOworCQlzeW5hcHRpY3NfcmVwb3J0X3NlbWlfbXRfZGF0YShkZXYsICZodywgJnByaXYtPmFnbSwKKwkJCQkJICAgICAgbnVtX2ZpbmdlcnMpOwogCiAJLyogUG9zdCBldmVudHMKIAkgKiBCVE5fVE9VQ0ggaGFzIHRvIGJlIGZpcnN0IGFzIG1vdXNlZGV2IHJlbGllcyBvbiBpdCB3aGVuIGRvaW5nCkBAIC01OTcsNyArMTAzNCw3IEBACiAKIAlpZiAobnVtX2ZpbmdlcnMgPiAwKSB7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgaHcueCk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgWU1BWF9OT01JTkFMICsgWU1JTl9OT01JTkFMIC0gaHcueSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgc3luYXB0aWNzX2ludmVydF95KGh3LnkpKTsKIAl9CiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgaHcueik7CiAKQEAgLTYwNSwzNSArMTA0MiwyNSBAQAogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RPT0xfV0lEVEgsIGZpbmdlcl93aWR0aCk7CiAKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCBudW1fZmluZ2VycyA9PSAxKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGh3LmxlZnQpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGh3LnJpZ2h0KTsKLQogCWlmIChTWU5fQ0FQX01VTFRJRklOR0VSKHByaXYtPmNhcGFiaWxpdGllcykpIHsKIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX0RPVUJMRVRBUCwgbnVtX2ZpbmdlcnMgPT0gMik7CiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9UUklQTEVUQVAsIG51bV9maW5nZXJzID09IDMpOwogCX0KIAotCWlmIChTWU5fQ0FQX01JRERMRV9CVVRUT04ocHJpdi0+Y2FwYWJpbGl0aWVzKSkKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGh3Lm1pZGRsZSk7Ci0KLQlpZiAoU1lOX0NBUF9GT1VSX0JVVFRPTihwcml2LT5jYXBhYmlsaXRpZXMpKSB7Ci0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fRk9SV0FSRCwgaHcudXApOwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0JBQ0ssIGh3LmRvd24pOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBTWU5fQ0FQX01VTFRJX0JVVFRPTl9OTyhwcml2LT5leHRfY2FwKTsgaSsrKQotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROXzAgKyBpLCBody5leHRfYnV0dG9ucyAmICgxIDw8IGkpKTsKKwlzeW5hcHRpY3NfcmVwb3J0X2J1dHRvbnMocHNtb3VzZSwgJmh3KTsKIAogCWlucHV0X3N5bmMoZGV2KTsKIH0KIAotc3RhdGljIGludCBzeW5hcHRpY3NfdmFsaWRhdGVfYnl0ZSh1bnNpZ25lZCBjaGFyIHBhY2tldFtdLCBpbnQgaWR4LCB1bnNpZ25lZCBjaGFyIHBrdF90eXBlKQorc3RhdGljIGludCBzeW5hcHRpY3NfdmFsaWRhdGVfYnl0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwKKwkJCQkgICBpbnQgaWR4LCB1bnNpZ25lZCBjaGFyIHBrdF90eXBlKQogewogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ld2Fic19tYXNrW10JPSB7IDB4QzgsIDB4MDAsIDB4MDAsIDB4QzgsIDB4MDAgfTsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBuZXdhYnNfcmVsX21hc2tbXQk9IHsgMHhDMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHgwMCB9OwogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ld2Fic19yc2x0W10JPSB7IDB4ODAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4MDAgfTsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvbGRhYnNfbWFza1tdCT0geyAweEMwLCAweDYwLCAweDAwLCAweEMwLCAweDYwIH07CiAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2xkYWJzX3JzbHRbXQk9IHsgMHhDMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCB9OworCWNvbnN0IGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKIAogCWlmIChpZHggPCAwIHx8IGlkeCA+IDQpCiAJCXJldHVybiAwOwpAQCAtNjUxLDcgKzEwNzgsNyBAQAogCQlyZXR1cm4gKHBhY2tldFtpZHhdICYgb2xkYWJzX21hc2tbaWR4XSkgPT0gb2xkYWJzX3JzbHRbaWR4XTsKIAogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAic3luYXB0aWNzOiB1bmtub3duIHBhY2tldCB0eXBlICVkXG4iLCBwa3RfdHlwZSk7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJ1bmtub3duIHBhY2tldCB0eXBlICVkXG4iLCBwa3RfdHlwZSk7CiAJCXJldHVybiAwOwogCX0KIH0KQEAgLTY2MSw4ICsxMDg4LDggQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCWlmICghc3luYXB0aWNzX3ZhbGlkYXRlX2J5dGUocHNtb3VzZS0+cGFja2V0LCBpLCBTWU5fTkVXQUJTX1NUUklDVCkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gInN5bmFwdGljczogdXNpbmcgcmVsYXhlZCBwYWNrZXQgdmFsaWRhdGlvblxuIik7CisJCWlmICghc3luYXB0aWNzX3ZhbGlkYXRlX2J5dGUocHNtb3VzZSwgaSwgU1lOX05FV0FCU19TVFJJQ1QpKSB7CisJCQlwc21vdXNlX2luZm8ocHNtb3VzZSwgInVzaW5nIHJlbGF4ZWQgcGFja2V0IHZhbGlkYXRpb25cbiIpOwogCQkJcmV0dXJuIFNZTl9ORVdBQlNfUkVMQVhFRDsKIAkJfQogCkBAIC02ODcsNDYgKzExMTQsNTYgQEAKIAkJcmV0dXJuIFBTTU9VU0VfRlVMTF9QQUNLRVQ7CiAJfQogCi0JcmV0dXJuIHN5bmFwdGljc192YWxpZGF0ZV9ieXRlKHBzbW91c2UtPnBhY2tldCwgcHNtb3VzZS0+cGt0Y250IC0gMSwgcHJpdi0+cGt0X3R5cGUpID8KKwlyZXR1cm4gc3luYXB0aWNzX3ZhbGlkYXRlX2J5dGUocHNtb3VzZSwgcHNtb3VzZS0+cGt0Y250IC0gMSwgcHJpdi0+cGt0X3R5cGUpID8KIAkJUFNNT1VTRV9HT09EX0RBVEEgOiBQU01PVVNFX0JBRF9EQVRBOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCURyaXZlciBpbml0aWFsaXphdGlvbi9jbGVhbnVwIGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzZXRfYWJzX3Bvc2l0aW9uX3BhcmFtcyhzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCisJCQkJICAgIHN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiwgaW50IHhfY29kZSwKKwkJCQkgICAgaW50IHlfY29kZSkKK3sKKwlpbnQgeF9taW4gPSBwcml2LT54X21pbiA/OiBYTUlOX05PTUlOQUw7CisJaW50IHhfbWF4ID0gcHJpdi0+eF9tYXggPzogWE1BWF9OT01JTkFMOworCWludCB5X21pbiA9IHByaXYtPnlfbWluID86IFlNSU5fTk9NSU5BTDsKKwlpbnQgeV9tYXggPSBwcml2LT55X21heCA/OiBZTUFYX05PTUlOQUw7CisJaW50IGZ1enogPSBTWU5fQ0FQX1JFRFVDRURfRklMVEVSSU5HKHByaXYtPmV4dF9jYXBfMGMpID8KKwkJCVNZTl9SRURVQ0VEX0ZJTFRFUl9GVVpaIDogMDsKKworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgeF9jb2RlLCB4X21pbiwgeF9tYXgsIGZ1enosIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgeV9jb2RlLCB5X21pbiwgeV9tYXgsIGZ1enosIDApOworCWlucHV0X2Fic19zZXRfcmVzKGRldiwgeF9jb2RlLCBwcml2LT54X3Jlcyk7CisJaW5wdXRfYWJzX3NldF9yZXMoZGV2LCB5X2NvZGUsIHByaXYtPnlfcmVzKTsKK30KKwogc3RhdGljIHZvaWQgc2V0X2lucHV0X3BhcmFtcyhzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdikKIHsKIAlpbnQgaTsKLQlpbnQgZnV6eiA9IFNZTl9DQVBfUkVEVUNFRF9GSUxURVJJTkcocHJpdi0+ZXh0X2NhcF8wYykgPwotCQkJU1lOX1JFRFVDRURfRklMVEVSX0ZVWlogOiAwOwogCiAJX19zZXRfYml0KElOUFVUX1BST1BfUE9JTlRFUiwgZGV2LT5wcm9wYml0KTsKIAogCV9fc2V0X2JpdChFVl9BQlMsIGRldi0+ZXZiaXQpOwotCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1gsCi0JCQkgICAgIHByaXYtPnhfbWluID86IFhNSU5fTk9NSU5BTCwKLQkJCSAgICAgcHJpdi0+eF9tYXggPzogWE1BWF9OT01JTkFMLAotCQkJICAgICBmdXp6LCAwKTsKLQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLAotCQkJICAgICBwcml2LT55X21pbiA/OiBZTUlOX05PTUlOQUwsCi0JCQkgICAgIHByaXYtPnlfbWF4ID86IFlNQVhfTk9NSU5BTCwKLQkJCSAgICAgZnV6eiwgMCk7CisJc2V0X2Fic19wb3NpdGlvbl9wYXJhbXMoZGV2LCBwcml2LCBBQlNfWCwgQUJTX1kpOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1BSRVNTVVJFLCAwLCAyNTUsIDAsIDApOwogCi0JaWYgKFNZTl9DQVBfQURWX0dFU1RVUkUocHJpdi0+ZXh0X2NhcF8wYykpIHsKKwlpZiAoU1lOX0NBUF9JTUFHRV9TRU5TT1IocHJpdi0+ZXh0X2NhcF8wYykpIHsKKwkJaW5wdXRfbXRfaW5pdF9zbG90cyhkZXYsIDIpOworCQlzZXRfYWJzX3Bvc2l0aW9uX3BhcmFtcyhkZXYsIHByaXYsIEFCU19NVF9QT1NJVElPTl9YLAorCQkJCQlBQlNfTVRfUE9TSVRJT05fWSk7CisJCS8qIEltYWdlIHNlbnNvcnMgY2FuIHJlcG9ydCBwZXItY29udGFjdCBwcmVzc3VyZSAqLworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19NVF9QUkVTU1VSRSwgMCwgMjU1LCAwLCAwKTsKKworCQkvKiBJbWFnZSBzZW5zb3JzIGNhbiBzaWduYWwgNCBhbmQgNSBmaW5nZXIgY2xpY2tzICovCisJCV9fc2V0X2JpdChCVE5fVE9PTF9RVUFEVEFQLCBkZXYtPmtleWJpdCk7CisJCV9fc2V0X2JpdChCVE5fVE9PTF9RVUlOVFRBUCwgZGV2LT5rZXliaXQpOworCX0gZWxzZSBpZiAoU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSkgeworCQkvKiBOb24taW1hZ2Ugc2Vuc29ycyB3aXRoIEFHTSB1c2Ugc2VtaS1tdCAqLwogCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9TRU1JX01ULCBkZXYtPnByb3BiaXQpOwogCQlpbnB1dF9tdF9pbml0X3Nsb3RzKGRldiwgMik7Ci0JCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1BPU0lUSU9OX1gsCi0JCQkJICAgICBwcml2LT54X21pbiA/OiBYTUlOX05PTUlOQUwsCi0JCQkJICAgICBwcml2LT54X21heCA/OiBYTUFYX05PTUlOQUwsCi0JCQkJICAgICBmdXp6LCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwKLQkJCQkgICAgIHByaXYtPnlfbWluID86IFlNSU5fTk9NSU5BTCwKLQkJCQkgICAgIHByaXYtPnlfbWF4ID86IFlNQVhfTk9NSU5BTCwKLQkJCQkgICAgIGZ1enosIDApOwotCi0JCWlucHV0X2Fic19zZXRfcmVzKGRldiwgQUJTX01UX1BPU0lUSU9OX1gsIHByaXYtPnhfcmVzKTsKLQkJaW5wdXRfYWJzX3NldF9yZXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgcHJpdi0+eV9yZXMpOworCQlzZXRfYWJzX3Bvc2l0aW9uX3BhcmFtcyhkZXYsIHByaXYsIEFCU19NVF9QT1NJVElPTl9YLAorCQkJCQlBQlNfTVRfUE9TSVRJT05fWSk7CiAJfQogCiAJaWYgKFNZTl9DQVBfUEFMTURFVEVDVChwcml2LT5jYXBhYmlsaXRpZXMpKQpAQCAtNzU5LDkgKzExOTYsNiBAQAogCV9fY2xlYXJfYml0KFJFTF9YLCBkZXYtPnJlbGJpdCk7CiAJX19jbGVhcl9iaXQoUkVMX1ksIGRldi0+cmVsYml0KTsKIAotCWlucHV0X2Fic19zZXRfcmVzKGRldiwgQUJTX1gsIHByaXYtPnhfcmVzKTsKLQlpbnB1dF9hYnNfc2V0X3JlcyhkZXYsIEFCU19ZLCBwcml2LT55X3Jlcyk7Ci0KIAlpZiAoU1lOX0NBUF9DTElDS1BBRChwcml2LT5leHRfY2FwXzBjKSkgewogCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9CVVRUT05QQUQsIGRldi0+cHJvcGJpdCk7CiAJCS8qIENsaWNrcGFkcyByZXBvcnQgb25seSBsZWZ0IGJ1dHRvbiAqLwpAQCAtNzkzLDIxICsxMjI3LDIxIEBACiAJCXJldHVybiAtMTsKIAogCWlmIChyZXRyeSA+IDEpCi0JCXByaW50ayhLRVJOX0RFQlVHICJTeW5hcHRpY3MgcmVjb25uZWN0ZWQgYWZ0ZXIgJWQgdHJpZXNcbiIsCi0JCQlyZXRyeSk7CisJCXBzbW91c2VfZGJnKHBzbW91c2UsICJyZWNvbm5lY3RlZCBhZnRlciAlZCB0cmllc1xuIiwgcmV0cnkpOwogCiAJaWYgKHN5bmFwdGljc19xdWVyeV9oYXJkd2FyZShwc21vdXNlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBxdWVyeSBTeW5hcHRpY3MgaGFyZHdhcmUuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIlVuYWJsZSB0byBxdWVyeSBkZXZpY2UuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChzeW5hcHRpY3Nfc2V0X2Fic29sdXRlX21vZGUocHNtb3VzZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBTeW5hcHRpY3MgaGFyZHdhcmUuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIlVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZS5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKHN5bmFwdGljc19zZXRfYWR2YW5jZWRfZ2VzdHVyZV9tb2RlKHBzbW91c2UpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQWR2YW5jZWQgZ2VzdHVyZSBtb2RlIHJlY29ubmVjdCBmYWlsZWQuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAiQWR2YW5jZWQgZ2VzdHVyZSBtb2RlIHJlY29ubmVjdCBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtODE1LDEyICsxMjQ5LDEyIEBACiAJICAgIG9sZF9wcml2Lm1vZGVsX2lkICE9IHByaXYtPm1vZGVsX2lkIHx8CiAJICAgIG9sZF9wcml2LmNhcGFiaWxpdGllcyAhPSBwcml2LT5jYXBhYmlsaXRpZXMgfHwKIAkgICAgb2xkX3ByaXYuZXh0X2NhcCAhPSBwcml2LT5leHRfY2FwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3luYXB0aWNzIGhhcmR3YXJlIGFwcGVhcnMgdG8gYmUgZGlmZmVyZW50OiAiCi0JCQkiaWQoJWxkLSVsZCksIG1vZGVsKCVsZC0lbGQpLCBjYXBzKCVseC0lbHgpLCBleHQoJWx4LSVseCkuXG4iLAotCQkJb2xkX3ByaXYuaWRlbnRpdHksIHByaXYtPmlkZW50aXR5LAotCQkJb2xkX3ByaXYubW9kZWxfaWQsIHByaXYtPm1vZGVsX2lkLAotCQkJb2xkX3ByaXYuY2FwYWJpbGl0aWVzLCBwcml2LT5jYXBhYmlsaXRpZXMsCi0JCQlvbGRfcHJpdi5leHRfY2FwLCBwcml2LT5leHRfY2FwKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAiaGFyZHdhcmUgYXBwZWFycyB0byBiZSBkaWZmZXJlbnQ6IGlkKCVsZC0lbGQpLCBtb2RlbCglbGQtJWxkKSwgY2FwcyglbHgtJWx4KSwgZXh0KCVseC0lbHgpLlxuIiwKKwkJCSAgICBvbGRfcHJpdi5pZGVudGl0eSwgcHJpdi0+aWRlbnRpdHksCisJCQkgICAgb2xkX3ByaXYubW9kZWxfaWQsIHByaXYtPm1vZGVsX2lkLAorCQkJICAgIG9sZF9wcml2LmNhcGFiaWxpdGllcywgcHJpdi0+Y2FwYWJpbGl0aWVzLAorCQkJICAgIG9sZF9wcml2LmV4dF9jYXAsIHByaXYtPmV4dF9jYXApOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC05MDEsNyArMTMzNSw4IEBACiAJICoganVzdCBmaW5lLgogCSAqLwogCWlmIChicm9rZW5fb2xwY19lYykgewotCQlwcmludGsoS0VSTl9JTkZPICJzeW5hcHRpY3M6IE9MUEMgWE8gZGV0ZWN0ZWQsIG5vdCBlbmFibGluZyBTeW5hcHRpY3MgcHJvdG9jb2wuXG4iKTsKKwkJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCQkgICAgICJPTFBDIFhPIGRldGVjdGVkLCBub3QgZW5hYmxpbmcgU3luYXB0aWNzIHByb3RvY29sLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtOTEyLDI2ICsxMzQ3LDI4IEBACiAJcHNtb3VzZV9yZXNldChwc21vdXNlKTsKIAogCWlmIChzeW5hcHRpY3NfcXVlcnlfaGFyZHdhcmUocHNtb3VzZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcXVlcnkgU3luYXB0aWNzIGhhcmR3YXJlLlxuIik7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJVbmFibGUgdG8gcXVlcnkgZGV2aWNlLlxuIik7CiAJCWdvdG8gaW5pdF9mYWlsOwogCX0KIAogCWlmIChzeW5hcHRpY3Nfc2V0X2Fic29sdXRlX21vZGUocHNtb3VzZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBTeW5hcHRpY3MgaGFyZHdhcmUuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIlVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZS5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9CiAKIAlpZiAoc3luYXB0aWNzX3NldF9hZHZhbmNlZF9nZXN0dXJlX21vZGUocHNtb3VzZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBZHZhbmNlZCBnZXN0dXJlIG1vZGUgaW5pdCBmYWlsZWQuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIkFkdmFuY2VkIGdlc3R1cmUgbW9kZSBpbml0IGZhaWxlZC5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9CiAKIAlwcml2LT5wa3RfdHlwZSA9IFNZTl9NT0RFTF9ORVdBQlMocHJpdi0+bW9kZWxfaWQpID8gU1lOX05FV0FCUyA6IFNZTl9PTERBQlM7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTeW5hcHRpY3MgVG91Y2hwYWQsIG1vZGVsOiAlbGQsIGZ3OiAlbGQuJWxkLCBpZDogJSNseCwgY2FwczogJSNseC8lI2x4LyUjbHhcbiIsCi0JCVNZTl9JRF9NT0RFTChwcml2LT5pZGVudGl0eSksCi0JCVNZTl9JRF9NQUpPUihwcml2LT5pZGVudGl0eSksIFNZTl9JRF9NSU5PUihwcml2LT5pZGVudGl0eSksCi0JCXByaXYtPm1vZGVsX2lkLCBwcml2LT5jYXBhYmlsaXRpZXMsIHByaXYtPmV4dF9jYXAsIHByaXYtPmV4dF9jYXBfMGMpOworCXBzbW91c2VfaW5mbyhwc21vdXNlLAorCQkgICAgICJUb3VjaHBhZCBtb2RlbDogJWxkLCBmdzogJWxkLiVsZCwgaWQ6ICUjbHgsIGNhcHM6ICUjbHgvJSNseC8lI2x4XG4iLAorCQkgICAgIFNZTl9JRF9NT0RFTChwcml2LT5pZGVudGl0eSksCisJCSAgICAgU1lOX0lEX01BSk9SKHByaXYtPmlkZW50aXR5KSwgU1lOX0lEX01JTk9SKHByaXYtPmlkZW50aXR5KSwKKwkJICAgICBwcml2LT5tb2RlbF9pZCwKKwkJICAgICBwcml2LT5jYXBhYmlsaXRpZXMsIHByaXYtPmV4dF9jYXAsIHByaXYtPmV4dF9jYXBfMGMpOwogCiAJc2V0X2lucHV0X3BhcmFtcyhwc21vdXNlLT5kZXYsIHByaXYpOwogCkBAIC05NjMsOCArMTQwMCw5IEBACiAJICogdGhlIHNhbWUgcmF0ZSBhcyBhIHN0YW5kYXJkIFBTLzIgbW91c2UpLgogCSAqLwogCWlmIChwc21vdXNlLT5yYXRlID49IDgwICYmIGltcGFpcmVkX3Rvc2hpYmFfa2JjKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInN5bmFwdGljczogVG9zaGliYSAlcyBkZXRlY3RlZCwgbGltaXRpbmcgcmF0ZSB0byA0MHBwcy5cbiIsCi0JCQlkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX05BTUUpKTsKKwkJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCQkgICAgICJUb3NoaWJhICVzIGRldGVjdGVkLCBsaW1pdGluZyByYXRlIHRvIDQwcHBzLlxuIiwKKwkJCSAgICAgZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9OQU1FKSk7CiAJCXBzbW91c2UtPnJhdGUgPSA0MDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmggYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5oCmluZGV4IGNhMDQwYWEuLjYyMmFlYThkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuaAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5oCkBAIC03NCw2ICs3NCw4IEBACiAgKiAyCTB4MDQJcmVkdWNlZCBmaWx0ZXJpbmcJZmlybXdhcmUgZG9lcyBsZXNzIGZpbHRlcmluZyBvbgogICoJCQkJCXBvc2l0aW9uIGRhdGEsIGRyaXZlciBzaG91bGQgd2F0Y2gKICAqCQkJCQlmb3Igbm9pc2UuCisgKiAyCTB4MDgJaW1hZ2Ugc2Vuc29yCQlpbWFnZSBzZW5zb3IgdHJhY2tzIDUgZmluZ2VycywgYnV0IG9ubHkKKyAqCQkJCQlyZXBvcnRzIDIuCiAgKiAyCTB4MjAJcmVwb3J0IG1pbgkJcXVlcnkgMHgwZiBnaXZlcyBtaW4gY29vcmQgcmVwb3J0ZWQKICAqLwogI2RlZmluZSBTWU5fQ0FQX0NMSUNLUEFEKGV4MGMpCQkoKGV4MGMpICYgMHgxMDAwMDApIC8qIDEtYnV0dG9uIENsaWNrUGFkICovCkBAIC04Miw2ICs4NCw3IEBACiAjZGVmaW5lIFNZTl9DQVBfTUlOX0RJTUVOU0lPTlMoZXgwYykJKChleDBjKSAmIDB4MDAyMDAwKQogI2RlZmluZSBTWU5fQ0FQX0FEVl9HRVNUVVJFKGV4MGMpCSgoZXgwYykgJiAweDA4MDAwMCkKICNkZWZpbmUgU1lOX0NBUF9SRURVQ0VEX0ZJTFRFUklORyhleDBjKQkoKGV4MGMpICYgMHgwMDA0MDApCisjZGVmaW5lIFNZTl9DQVBfSU1BR0VfU0VOU09SKGV4MGMpCSgoZXgwYykgJiAweDAwMDgwMCkKIAogLyogc3luYXB0aWNzIG1vZGVzIHF1ZXJ5IGJpdHMgKi8KICNkZWZpbmUgU1lOX01PREVfQUJTT0xVVEUobSkJCSgobSkgJiAoMSA8PCA3KSkKQEAgLTExMiw5ICsxMTUsMTggQEAKICNkZWZpbmUgU1lOX1JFRFVDRURfRklMVEVSX0ZVWloJCTgKIAogLyoKKyAqIEEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIHdoaWNoIGludGVybmFsIHRvdWNocGFkIGZpbmdlciBzbG90cyBhcmUgYmVpbmcKKyAqIHJlcG9ydGVkIGluIHJhdyBwYWNrZXRzLgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlIHsKKwlpbnQgY291bnQ7CQkJLyogbnVtIGZpbmdlcnMgYmVpbmcgdHJhY2tlZCAqLworCWludCBzZ207CQkJLyogd2hpY2ggc2xvdCBpcyByZXBvcnRlZCBieSBzZ20gcGt0ICovCisJaW50IGFnbTsJCQkvKiB3aGljaCBzbG90IGlzIHJlcG9ydGVkIGJ5IGFnbSBwa3QqLworfTsKKworLyoKICAqIEEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIHRoZSBzdGF0ZSBvZiB0aGUgdG91Y2hwYWQgaGFyZHdhcmUgKGJ1dHRvbnMgYW5kIHBhZCkKICAqLwotCiBzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlIHsKIAlpbnQgeDsKIAlpbnQgeTsKQEAgLTEyNyw2ICsxMzksOSBAQAogCXVuc2lnbmVkIGludCBkb3duOjE7CiAJdW5zaWduZWQgY2hhciBleHRfYnV0dG9uczsKIAlzaWduZWQgY2hhciBzY3JvbGw7CisKKwkvKiBBcyByZXBvcnRlZCBpbiBsYXN0IEFHTS1DT05UQUNUIHBhY2tldHMgKi8KKwlzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlIG10X3N0YXRlOwogfTsKIAogc3RydWN0IHN5bmFwdGljc19kYXRhIHsKQEAgLTE0Niw3ICsxNjEsMTUgQEAKIAogCXN0cnVjdCBzZXJpbyAqcHRfcG9ydDsJCQkvKiBQYXNzLXRocm91Z2ggc2VyaW8gcG9ydCAqLwogCi0Jc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSBtdDsJCS8qIGN1cnJlbnQgZ2VzdHVyZSBwYWNrZXQgKi8KKwlzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlIG10X3N0YXRlOwkvKiBDdXJyZW50IG10IGZpbmdlciBzdGF0ZSAqLworCWJvb2wgbXRfc3RhdGVfbG9zdDsJCQkvKiBtdF9zdGF0ZSBtYXkgYmUgaW5jb3JyZWN0ICovCisKKwkvKgorCSAqIExhc3QgcmVjZWl2ZWQgQWR2YW5jZWQgR2VzdHVyZSBNb2RlIChBR00pIHBhY2tldC4gQW4gQUdNIHBhY2tldAorCSAqIGNvbnRhaW5zIHBvc2l0aW9uIGRhdGEgZm9yIGEgc2Vjb25kIGNvbnRhY3QsIGF0IGhhbGYgcmVzb2x1dGlvbi4KKwkgKi8KKwlzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlIGFnbTsKKwlib29sIGFnbV9wZW5kaW5nOwkJCS8qIG5ldyBBR00gcGFja2V0IHJlY2VpdmVkICovCiB9OwogCiB2b2lkIHN5bmFwdGljc19tb2R1bGVfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzX2kyYy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMKaW5kZXggY2JhM2M4NC4uNGI3NTVjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMKQEAgLTU3MCw3ICs1NzAsNyBAQAogCQkJICJSZXF1ZXN0aW5nIElSUTogJWRcbiIsIHRvdWNoLT5jbGllbnQtPmlycSk7CiAKIAkJcmV0ID0gcmVxdWVzdF9pcnEodG91Y2gtPmNsaWVudC0+aXJxLCBzeW5hcHRpY3NfaTJjX2lycSwKLQkJCQkgIElSUUZfRElTQUJMRUR8SVJRX1RZUEVfRURHRV9GQUxMSU5HLAorCQkJCSAgSVJRX1RZUEVfRURHRV9GQUxMSU5HLAogCQkJCSAgRFJJVkVSX05BTUUsIHRvdWNoKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X3dhcm4oJnRvdWNoLT5jbGllbnQtPmRldiwKQEAgLTYxOSw3ICs2MTksNyBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IHN5bmFwdGljc19pMmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW9fcmF3LmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvX3Jhdy5jCmluZGV4IGI3YmE0NTkuLjRkNGNkMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW9fcmF3LmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpb19yYXcuYwpAQCAtOSw2ICs5LDcgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CkBAIC0zMywxNSArMzQsMTYgQEAKIAl1bnNpZ25lZCBpbnQgdGFpbCwgaGVhZDsKIAogCWNoYXIgbmFtZVsxNl07Ci0JdW5zaWduZWQgaW50IHJlZmNudDsKKwlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVjdCBzZXJpbyAqc2VyaW87CiAJc3RydWN0IG1pc2NkZXZpY2UgZGV2OwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgY2xpZW50X2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWJvb2wgZGVhZDsKIH07CiAKLXN0cnVjdCBzZXJpb19yYXdfbGlzdCB7CitzdHJ1Y3Qgc2VyaW9fcmF3X2NsaWVudCB7CiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZhc3luYzsKIAlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXc7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwpAQCAtNDksNyArNTEsNiBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKHNlcmlvX3Jhd19tdXRleCk7CiBzdGF0aWMgTElTVF9IRUFEKHNlcmlvX3Jhd19saXN0KTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaW9fcmF3X25vOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBJbnRlcmZhY2Ugd2l0aCB1c2Vyc3BhY2UgKGZpbGUgb3BlcmF0aW9ucykgICAgICAgICAgICAqCkBAIC01Nyw5ICs1OCw5IEBACiAKIHN0YXRpYyBpbnQgc2VyaW9fcmF3X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCiB7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKLQlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZsaXN0LT5mYXN5bmMpOworCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmNsaWVudC0+ZmFzeW5jKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3Jhd19sb2NhdGUoaW50IG1pbm9yKQpAQCAtNzcsOCArNzgsOCBAQAogc3RhdGljIGludCBzZXJpb19yYXdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXc7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0OwotCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQ7CisJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2VyaW9fcmF3X211dGV4KTsKIAlpZiAocmV0dmFsKQpAQCAtOTAsNjAgKzkxLDYxIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICghc2VyaW9fcmF3LT5zZXJpbykgeworCWlmIChzZXJpb19yYXctPmRlYWQpIHsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQogCi0JbGlzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpb19yYXdfbGlzdCksIEdGUF9LRVJORUwpOwotCWlmICghbGlzdCkgeworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpb19yYXdfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbGllbnQpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCi0JbGlzdC0+c2VyaW9fcmF3ID0gc2VyaW9fcmF3OwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGxpc3Q7CisJY2xpZW50LT5zZXJpb19yYXcgPSBzZXJpb19yYXc7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2xpZW50OwogCi0Jc2VyaW9fcmF3LT5yZWZjbnQrKzsKLQlsaXN0X2FkZF90YWlsKCZsaXN0LT5ub2RlLCAmc2VyaW9fcmF3LT5saXN0KTsKKwlrcmVmX2dldCgmc2VyaW9fcmF3LT5rcmVmKTsKKworCXNlcmlvX3BhdXNlX3J4KHNlcmlvX3Jhdy0+c2VyaW8pOworCWxpc3RfYWRkX3RhaWwoJmNsaWVudC0+bm9kZSwgJnNlcmlvX3Jhdy0+Y2xpZW50X2xpc3QpOworCXNlcmlvX2NvbnRpbnVlX3J4KHNlcmlvX3Jhdy0+c2VyaW8pOwogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgc2VyaW9fcmF3X2NsZWFudXAoc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3KQorc3RhdGljIHZvaWQgc2VyaW9fcmF3X2ZyZWUoc3RydWN0IGtyZWYgKmtyZWYpCiB7Ci0JaWYgKC0tc2VyaW9fcmF3LT5yZWZjbnQgPT0gMCkgewotCQltaXNjX2RlcmVnaXN0ZXIoJnNlcmlvX3Jhdy0+ZGV2KTsKLQkJbGlzdF9kZWxfaW5pdCgmc2VyaW9fcmF3LT5ub2RlKTsKLQkJa2ZyZWUoc2VyaW9fcmF3KTsKKwlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXcgPQorCQkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBzZXJpb19yYXcsIGtyZWYpOwogCi0JCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOworCXB1dF9kZXZpY2UoJnNlcmlvX3Jhdy0+c2VyaW8tPmRldik7CisJa2ZyZWUoc2VyaW9fcmF3KTsKIH0KIAogc3RhdGljIGludCBzZXJpb19yYXdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3Qgc2VyaW9fcmF3X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3ID0gbGlzdC0+c2VyaW9fcmF3OworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3ID0gY2xpZW50LT5zZXJpb19yYXc7CiAKLQltdXRleF9sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOworCXNlcmlvX3BhdXNlX3J4KHNlcmlvX3Jhdy0+c2VyaW8pOworCWxpc3RfZGVsKCZjbGllbnQtPm5vZGUpOworCXNlcmlvX2NvbnRpbnVlX3J4KHNlcmlvX3Jhdy0+c2VyaW8pOwogCi0Jc2VyaW9fcmF3X2NsZWFudXAoc2VyaW9fcmF3KTsKKwlrZnJlZShjbGllbnQpOwogCi0JbXV0ZXhfdW5sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOworCWtyZWZfcHV0KCZzZXJpb19yYXctPmtyZWYsIHNlcmlvX3Jhd19mcmVlKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNlcmlvX3Jhd19mZXRjaF9ieXRlKHN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdywgY2hhciAqYykKK3N0YXRpYyBib29sIHNlcmlvX3Jhd19mZXRjaF9ieXRlKHN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdywgY2hhciAqYykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKKwlib29sIGVtcHR5OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNlcmlvX3Jhdy0+c2VyaW8tPmxvY2ssIGZsYWdzKTsKKwlzZXJpb19wYXVzZV9yeChzZXJpb19yYXctPnNlcmlvKTsKIAogCWVtcHR5ID0gc2VyaW9fcmF3LT5oZWFkID09IHNlcmlvX3Jhdy0+dGFpbDsKIAlpZiAoIWVtcHR5KSB7CkBAIC0xNTEsMzAgKzE1MywzMSBAQAogCQlzZXJpb19yYXctPnRhaWwgPSAoc2VyaW9fcmF3LT50YWlsICsgMSkgJSBTRVJJT19SQVdfUVVFVUVfTEVOOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcmlvX3Jhdy0+c2VyaW8tPmxvY2ssIGZsYWdzKTsKKwlzZXJpb19jb250aW51ZV9yeChzZXJpb19yYXctPnNlcmlvKTsKIAogCXJldHVybiAhZW1wdHk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNlcmlvX3Jhd19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3N0YXRpYyBzc2l6ZV90IHNlcmlvX3Jhd19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdyA9IGxpc3QtPnNlcmlvX3JhdzsKKwlzdHJ1Y3Qgc2VyaW9fcmF3X2NsaWVudCAqY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdyA9IGNsaWVudC0+c2VyaW9fcmF3OwogCWNoYXIgdW5pbml0aWFsaXplZF92YXIoYyk7CiAJc3NpemVfdCByZXR2YWwgPSAwOwogCi0JaWYgKCFzZXJpb19yYXctPnNlcmlvKQorCWlmIChzZXJpb19yYXctPmRlYWQpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKHNlcmlvX3Jhdy0+aGVhZCA9PSBzZXJpb19yYXctPnRhaWwgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobGlzdC0+c2VyaW9fcmF3LT53YWl0LAotCQkJCQkgIHNlcmlvX3Jhdy0+aGVhZCAhPSBzZXJpb19yYXctPnRhaWwgfHwgIXNlcmlvX3Jhdy0+c2VyaW8pOworCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZXJpb19yYXctPndhaXQsCisJCQlzZXJpb19yYXctPmhlYWQgIT0gc2VyaW9fcmF3LT50YWlsIHx8IHNlcmlvX3Jhdy0+ZGVhZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCWlmICghc2VyaW9fcmF3LT5zZXJpbykKKwlpZiAoc2VyaW9fcmF3LT5kZWFkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXdoaWxlIChyZXR2YWwgPCBjb3VudCAmJiBzZXJpb19yYXdfZmV0Y2hfYnl0ZShzZXJpb19yYXcsICZjKSkgewpAQCAtMTg2LDkgKzE4OSwxMSBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNlcmlvX3Jhd193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCBzZXJpb19yYXdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3ID0gY2xpZW50LT5zZXJpb19yYXc7CiAJc3NpemVfdCB3cml0dGVuID0gMDsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGNoYXIgYzsKQEAgLTE5Nyw3ICsyMDIsNyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlpZiAoIWxpc3QtPnNlcmlvX3Jhdy0+c2VyaW8pIHsKKwlpZiAoc2VyaW9fcmF3LT5kZWFkKSB7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIxMCw3ICsyMTUsNyBAQAogCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWlmIChzZXJpb193cml0ZShsaXN0LT5zZXJpb19yYXctPnNlcmlvLCBjKSkgeworCQlpZiAoc2VyaW9fd3JpdGUoc2VyaW9fcmF3LT5zZXJpbywgYykpIHsKIAkJCXJldHZhbCA9IC1FSU87CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMjI0LDQ2ICsyMjksNDkgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBzZXJpb19yYXdfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKLQlzdHJ1Y3Qgc2VyaW9fcmF3X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNlcmlvX3Jhd19jbGllbnQgKmNsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXcgPSBjbGllbnQtPnNlcmlvX3JhdzsKKwl1bnNpZ25lZCBpbnQgbWFzazsKIAotCXBvbGxfd2FpdChmaWxlLCAmbGlzdC0+c2VyaW9fcmF3LT53YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJnNlcmlvX3Jhdy0+d2FpdCwgd2FpdCk7CiAKLQlpZiAobGlzdC0+c2VyaW9fcmF3LT5oZWFkICE9IGxpc3QtPnNlcmlvX3Jhdy0+dGFpbCkKKwltYXNrID0gc2VyaW9fcmF3LT5kZWFkID8gUE9MTEhVUCB8IFBPTExFUlIgOiBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwlpZiAoc2VyaW9fcmF3LT5oZWFkICE9IHNlcmlvX3Jhdy0+dGFpbCkKIAkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2VyaW9fcmF3X2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLm9wZW4gPQkJc2VyaW9fcmF3X29wZW4sCi0JLnJlbGVhc2UgPQlzZXJpb19yYXdfcmVsZWFzZSwKLQkucmVhZCA9CQlzZXJpb19yYXdfcmVhZCwKLQkud3JpdGUgPQlzZXJpb19yYXdfd3JpdGUsCi0JLnBvbGwgPQkJc2VyaW9fcmF3X3BvbGwsCi0JLmZhc3luYyA9CXNlcmlvX3Jhd19mYXN5bmMsCi0JLmxsc2VlayA9IG5vb3BfbGxzZWVrLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBzZXJpb19yYXdfb3BlbiwKKwkucmVsZWFzZQk9IHNlcmlvX3Jhd19yZWxlYXNlLAorCS5yZWFkCQk9IHNlcmlvX3Jhd19yZWFkLAorCS53cml0ZQkJPSBzZXJpb19yYXdfd3JpdGUsCisJLnBvbGwJCT0gc2VyaW9fcmF3X3BvbGwsCisJLmZhc3luYwkJPSBzZXJpb19yYXdfZmFzeW5jLAorCS5sbHNlZWsJCT0gbm9vcF9sbHNlZWssCiB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSB3aXRoIHNlcmlvIHBvcnQgICAJICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSB3aXRoIHNlcmlvIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzZXJpb19yYXdfaW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSwKIAkJCQkJdW5zaWduZWQgaW50IGRmbCkKIHsKIAlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXcgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0OworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQ7CiAJdW5zaWduZWQgaW50IGhlYWQgPSBzZXJpb19yYXctPmhlYWQ7CiAKLQkvKiB3ZSBhcmUgaG9sZGluZyBzZXJpby0+bG9jayBoZXJlIHNvIHdlIGFyZSBwcm9vdGVjdGVkICovCisJLyogd2UgYXJlIGhvbGRpbmcgc2VyaW8tPmxvY2sgaGVyZSBzbyB3ZSBhcmUgcHJvdGVjdGVkICovCiAJc2VyaW9fcmF3LT5xdWV1ZVtoZWFkXSA9IGRhdGE7CiAJaGVhZCA9IChoZWFkICsgMSkgJSBTRVJJT19SQVdfUVVFVUVfTEVOOwogCWlmIChsaWtlbHkoaGVhZCAhPSBzZXJpb19yYXctPnRhaWwpKSB7CiAJCXNlcmlvX3Jhdy0+aGVhZCA9IGhlYWQ7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkobGlzdCwgJnNlcmlvX3Jhdy0+bGlzdCwgbm9kZSkKLQkJCWtpbGxfZmFzeW5jKCZsaXN0LT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGllbnQsICZzZXJpb19yYXctPmNsaWVudF9saXN0LCBub2RlKQorCQkJa2lsbF9mYXN5bmMoJmNsaWVudC0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VyaW9fcmF3LT53YWl0KTsKIAl9CiAKQEAgLTI3MiwyOSArMjgwLDM3IEBACiAKIHN0YXRpYyBpbnQgc2VyaW9fcmF3X2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQogeworCXN0YXRpYyBhdG9taWNfdCBzZXJpb19yYXdfbm8gPSBBVE9NSUNfSU5JVCgwKTsKIAlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXc7CiAJaW50IGVycjsKIAotCWlmICghKHNlcmlvX3JhdyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpb19yYXcpLCBHRlBfS0VSTkVMKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzZXJpb19yYXcuYzogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIGRldmljZVxuIik7CisJc2VyaW9fcmF3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvX3JhdyksIEdGUF9LRVJORUwpOworCWlmICghc2VyaW9fcmF3KSB7CisJCWRldl9kYmcoJnNlcmlvLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbXV0ZXhfbG9jaygmc2VyaW9fcmF3X211dGV4KTsKLQotCXNucHJpbnRmKHNlcmlvX3Jhdy0+bmFtZSwgc2l6ZW9mKHNlcmlvX3Jhdy0+bmFtZSksICJzZXJpb19yYXclZCIsIHNlcmlvX3Jhd19ubysrKTsKLQlzZXJpb19yYXctPnJlZmNudCA9IDE7Ci0Jc2VyaW9fcmF3LT5zZXJpbyA9IHNlcmlvOwotCUlOSVRfTElTVF9IRUFEKCZzZXJpb19yYXctPmxpc3QpOworCXNucHJpbnRmKHNlcmlvX3Jhdy0+bmFtZSwgc2l6ZW9mKHNlcmlvX3Jhdy0+bmFtZSksCisJCSAic2VyaW9fcmF3JWxkIiwgKGxvbmcpYXRvbWljX2luY19yZXR1cm4oJnNlcmlvX3Jhd19ubykgLSAxKTsKKwlrcmVmX2luaXQoJnNlcmlvX3Jhdy0+a3JlZik7CisJSU5JVF9MSVNUX0hFQUQoJnNlcmlvX3Jhdy0+Y2xpZW50X2xpc3QpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlcmlvX3Jhdy0+d2FpdCk7CiAKKwlzZXJpb19yYXctPnNlcmlvID0gc2VyaW87CisJZ2V0X2RldmljZSgmc2VyaW8tPmRldik7CisKIAlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgc2VyaW9fcmF3KTsKIAogCWVyciA9IHNlcmlvX29wZW4oc2VyaW8sIGRydik7CiAJaWYgKGVycikKLQkJZ290byBvdXRfZnJlZTsKKwkJZ290byBlcnJfZnJlZTsKKworCWVyciA9IG11dGV4X2xvY2tfa2lsbGFibGUoJnNlcmlvX3Jhd19tdXRleCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfY2xvc2U7CiAKIAlsaXN0X2FkZF90YWlsKCZzZXJpb19yYXctPm5vZGUsICZzZXJpb19yYXdfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOwogCiAJc2VyaW9fcmF3LT5kZXYubWlub3IgPSBQU01PVVNFX01JTk9SOwogCXNlcmlvX3Jhdy0+ZGV2Lm5hbWUgPSBzZXJpb19yYXctPm5hbWU7CkBAIC0zMDgsMjMgKzMyNCwyMyBAQAogCX0KIAogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic2VyaW9fcmF3OiBmYWlsZWQgdG8gcmVnaXN0ZXIgcmF3IGFjY2VzcyBkZXZpY2UgZm9yICVzXG4iLAorCQlkZXZfZXJyKCZzZXJpby0+ZGV2LAorCQkJImZhaWxlZCB0byByZWdpc3RlciByYXcgYWNjZXNzIGRldmljZSBmb3IgJXNcbiIsCiAJCQlzZXJpby0+cGh5cyk7Ci0JCWdvdG8gb3V0X2Nsb3NlOworCQlnb3RvIGVycl91bmxpbms7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAic2VyaW9fcmF3OiByYXcgYWNjZXNzIGVuYWJsZWQgb24gJXMgKCVzLCBtaW5vciAlZClcbiIsCi0JCXNlcmlvLT5waHlzLCBzZXJpb19yYXctPm5hbWUsIHNlcmlvX3Jhdy0+ZGV2Lm1pbm9yKTsKLQlnb3RvIG91dDsKKwlkZXZfaW5mbygmc2VyaW8tPmRldiwgInJhdyBhY2Nlc3MgZW5hYmxlZCBvbiAlcyAoJXMsIG1pbm9yICVkKVxuIiwKKwkJIHNlcmlvLT5waHlzLCBzZXJpb19yYXctPm5hbWUsIHNlcmlvX3Jhdy0+ZGV2Lm1pbm9yKTsKKwlyZXR1cm4gMDsKIAotb3V0X2Nsb3NlOgotCXNlcmlvX2Nsb3NlKHNlcmlvKTsKK2Vycl91bmxpbms6CiAJbGlzdF9kZWxfaW5pdCgmc2VyaW9fcmF3LT5ub2RlKTsKLW91dF9mcmVlOgorZXJyX2Nsb3NlOgorCXNlcmlvX2Nsb3NlKHNlcmlvKTsKK2Vycl9mcmVlOgogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlrZnJlZShzZXJpb19yYXcpOwotb3V0OgotCW11dGV4X3VubG9jaygmc2VyaW9fcmF3X211dGV4KTsKKwlrcmVmX3B1dCgmc2VyaW9fcmF3LT5rcmVmLCBzZXJpb19yYXdfZnJlZSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzM0LDcgKzM1MCw4IEBACiAJc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2ID0gc2VyaW8tPmRydjsKIAogCWlmICghZHJ2IHx8ICFzZXJpb19yYXcpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInNlcmlvX3JhdzogcmVjb25uZWN0IHJlcXVlc3QsIGJ1dCBzZXJpbyBpcyBkaXNjb25uZWN0ZWQsIGlnbm9yaW5nLi4uXG4iKTsKKwkJZGV2X2RiZygmc2VyaW8tPmRldiwKKwkJCSJyZWNvbm5lY3QgcmVxdWVzdCwgYnV0IHNlcmlvIGlzIGRpc2Nvbm5lY3RlZCwgaWdub3JpbmcuLi5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0zNDUsMjIgKzM2Miw0MCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogV2FrZSB1cCB1c2VycyB3YWl0aW5nIGZvciBJTyBzbyB0aGV5IGNhbiBkaXNjb25uZWN0IGZyb20KKyAqIGRlYWQgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBzZXJpb19yYXdfaGFuZ3VwKHN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdykKK3sKKwlzdHJ1Y3Qgc2VyaW9fcmF3X2NsaWVudCAqY2xpZW50OworCisJc2VyaW9fcGF1c2Vfcngoc2VyaW9fcmF3LT5zZXJpbyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGllbnQsICZzZXJpb19yYXctPmNsaWVudF9saXN0LCBub2RlKQorCQlraWxsX2Zhc3luYygmY2xpZW50LT5mYXN5bmMsIFNJR0lPLCBQT0xMX0hVUCk7CisJc2VyaW9fY29udGludWVfcngoc2VyaW9fcmF3LT5zZXJpbyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlcmlvX3Jhdy0+d2FpdCk7Cit9CisKKwogc3RhdGljIHZvaWQgc2VyaW9fcmF3X2Rpc2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbykKIHsKLQlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXc7CisJc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3ID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCisJbWlzY19kZXJlZ2lzdGVyKCZzZXJpb19yYXctPmRldik7CiAKIAltdXRleF9sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOworCXNlcmlvX3Jhdy0+ZGVhZCA9IHRydWU7CisJbGlzdF9kZWxfaW5pdCgmc2VyaW9fcmF3LT5ub2RlKTsKKwltdXRleF91bmxvY2soJnNlcmlvX3Jhd19tdXRleCk7CiAKLQlzZXJpb19yYXcgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7CisJc2VyaW9fcmF3X2hhbmd1cChzZXJpb19yYXcpOwogCiAJc2VyaW9fY2xvc2Uoc2VyaW8pOworCWtyZWZfcHV0KCZzZXJpb19yYXctPmtyZWYsIHNlcmlvX3Jhd19mcmVlKTsKKwogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQotCXNlcmlvX3Jhdy0+c2VyaW8gPSBOVUxMOwotCWlmICghc2VyaW9fcmF3X2NsZWFudXAoc2VyaW9fcmF3KSkKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXJpb19yYXctPndhaXQpOwotCi0JbXV0ZXhfdW5sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOwogfQogCiBzdGF0aWMgc3RydWN0IHNlcmlvX2RldmljZV9pZCBzZXJpb19yYXdfc2VyaW9faWRzW10gPSB7CkBAIC0zOTEsNyArNDI2LDcgQEAKIAkuY29ubmVjdAk9IHNlcmlvX3Jhd19jb25uZWN0LAogCS5yZWNvbm5lY3QJPSBzZXJpb19yYXdfcmVjb25uZWN0LAogCS5kaXNjb25uZWN0CT0gc2VyaW9fcmF3X2Rpc2Nvbm5lY3QsCi0JLm1hbnVhbF9iaW5kCT0gMSwKKwkubWFudWFsX2JpbmQJPSB0cnVlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2VyaW9fcmF3X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc3BhcnNlLWtleW1hcC5jIGIvZHJpdmVycy9pbnB1dC9zcGFyc2Uta2V5bWFwLmMKaW5kZXggZmRiNmEzOS4uNzVmYjA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zcGFyc2Uta2V5bWFwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zcGFyc2Uta2V5bWFwLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogTU9EVUxFX0FVVEhPUigiRG1pdHJ5IFRvcm9raG92IDxkdG9yQG1haWwucnU+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbS5oIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb20uaAppbmRleCAyMzMxN2JkLi4wNzgzODY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbS5oCisrKyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tLmgKQEAgLTExLDcgKzExLDcgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMDAgRGFuaWVsIEVnZ2VyCQk8ZWdnZXJAc3VzZS5kZT4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDEgRnJlZGVyaWMgTGVwaWVkCQk8ZmxlcGllZEBtYW5kcmFrZXNvZnQuY29tPgogICogIENvcHlyaWdodCAoYykgMjAwNCBQYW5hZ2lvdGlzIElzc2FyaXMJPHBhbmFnaW90aXMuaXNzYXJpc0BtZWNoLmt1bGV1dmVuLmFjLmJlPgotICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA5IFBpbmcgQ2hlbmcJCTxwaW5nY0B3YWNvbS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEgUGluZyBDaGVuZwkJPHBpbmdjQHdhY29tLmNvbT4KICAqCiAgKiAgQ2hhbmdlTG9nOgogICogICAgICB2MC4xICh2cCkgIC0gSW5pdGlhbCByZWxlYXNlCkBAIC05Myw3ICs5Myw3IEBACiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS41MiIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjUzIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEB1Y3cuY3o+IgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIFdhY29tIHRhYmxldCBkcml2ZXIiCiAjZGVmaW5lIERSSVZFUl9MSUNFTlNFICJHUEwiCkBAIC0xMTQsNiArMTE0LDEyIEBACiAJc3RydWN0IG11dGV4IGxvY2s7CiAJYm9vbCBvcGVuOwogCWNoYXIgcGh5c1szMl07CisJc3RydWN0IHdhY29tX2xlZCB7CisJCXU4IHNlbGVjdFsyXTsgLyogc3RhdHVzIGxlZCBzZWxlY3RvciAoMC4uMykgKi8KKwkJdTggbGx2OyAgICAgICAvKiBzdGF0dXMgbGVkIGJyaWdodG5lc3Mgbm8gYnV0dG9uICgxLi4xMjcpICovCisJCXU4IGhsdjsgICAgICAgLyogc3RhdHVzIGxlZCBicmlnaHRuZXNzIGJ1dHRvbiBwcmVzc2VkICgxLi4xMjcpICovCisJCXU4IGltZ19sdW07ICAgLyogT0xFRCBtYXRyaXggZGlzcGxheSBicmlnaHRuZXNzICovCisJfSBsZWQ7CiB9OwogCiBleHRlcm4gY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgd2Fjb21faWRzW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV9zeXMuYyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3N5cy5jCmluZGV4IDk1OGI0ZWIuLjFjMWI3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3N5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3N5cy5jCkBAIC00OCwyNyArNDgsNDkgQEAKIC8qIGRlZmluZXMgdG8gZ2V0L3NldCBVU0IgbWVzc2FnZSAqLwogI2RlZmluZSBVU0JfUkVRX0dFVF9SRVBPUlQJMHgwMQogI2RlZmluZSBVU0JfUkVRX1NFVF9SRVBPUlQJMHgwOQorCiAjZGVmaW5lIFdBQ19ISURfRkVBVFVSRV9SRVBPUlQJMHgwMwogI2RlZmluZSBXQUNfTVNHX1JFVFJJRVMJCTUKIAotc3RhdGljIGludCB1c2JfZ2V0X3JlcG9ydChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdW5zaWduZWQgY2hhciB0eXBlLAotCQkJCXVuc2lnbmVkIGNoYXIgaWQsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCisjZGVmaW5lIFdBQ19DTURfTEVEX0NPTlRST0wJMHgyMAorI2RlZmluZSBXQUNfQ01EX0lDT05fU1RBUlQJMHgyMQorI2RlZmluZSBXQUNfQ01EX0lDT05fWEZFUgkweDIzCisjZGVmaW5lIFdBQ19DTURfUkVUUklFUwkJMTAKKworc3RhdGljIGludCB3YWNvbV9nZXRfcmVwb3J0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1OCB0eXBlLCB1OCBpZCwKKwkJCSAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgcmV0cmllcykKIHsKLQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCi0JCXVzYl9yY3ZjdHJscGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAwKSwKLQkJVVNCX1JFUV9HRVRfUkVQT1JULCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCi0JCSh0eXBlIDw8IDgpICsgaWQsIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAotCQlidWYsIHNpemUsIDEwMCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50IHJldHZhbDsKKworCWRvIHsKKwkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCisJCQkJVVNCX1JFUV9HRVRfUkVQT1JULAorCQkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkodHlwZSA8PCA4KSArIGlkLAorCQkJCWludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAorCQkJCWJ1Ziwgc2l6ZSwgMTAwKTsKKwl9IHdoaWxlICgocmV0dmFsID09IC1FVElNRURPVVQgfHwgcmV0dmFsID09IC1FUElQRSkgJiYgLS1yZXRyaWVzKTsKKworCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgdXNiX3NldF9yZXBvcnQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHVuc2lnbmVkIGNoYXIgdHlwZSwKLQkJCQl1bnNpZ25lZCBjaGFyIGlkLCB2b2lkICpidWYsIGludCBzaXplKQorc3RhdGljIGludCB3YWNvbV9zZXRfcmVwb3J0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1OCB0eXBlLCB1OCBpZCwKKwkJCSAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgcmV0cmllcykKIHsKLQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCi0JCXVzYl9zbmRjdHJscGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAwKSwKLSAgICAgICAgICAgICAgICBVU0JfUkVRX1NFVF9SRVBPUlQsIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICAodHlwZSA8PCA4KSArIGlkLCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwKLQkJYnVmLCBzaXplLCAxMDAwKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQgcmV0dmFsOworCisJZG8geworCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCQlVU0JfUkVRX1NFVF9SRVBPUlQsCisJCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCSh0eXBlIDw8IDgpICsgaWQsCisJCQkJaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkJYnVmLCBzaXplLCAxMDAwKTsKKwl9IHdoaWxlICgocmV0dmFsID09IC1FVElNRURPVVQgfHwgcmV0dmFsID09IC1FUElQRSkgJiYgLS1yZXRyaWVzKTsKKworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIHdhY29tX3N5c19pcnEoc3RydWN0IHVyYiAqdXJiKQpAQCAtMzE5LDIzICszNDEsMjMgQEAKIAkJCXJlcF9kYXRhWzJdID0gMDsKIAkJCXJlcF9kYXRhWzNdID0gMDsKIAkJCXJlcG9ydF9pZCA9IDM7Ci0JCQllcnJvciA9IHVzYl9zZXRfcmVwb3J0KGludGYsIFdBQ19ISURfRkVBVFVSRV9SRVBPUlQsCi0JCQkJcmVwb3J0X2lkLCByZXBfZGF0YSwgNCk7CisJCQllcnJvciA9IHdhY29tX3NldF9yZXBvcnQoaW50ZiwgV0FDX0hJRF9GRUFUVVJFX1JFUE9SVCwKKwkJCQkJCSByZXBvcnRfaWQsIHJlcF9kYXRhLCA0LCAxKTsKIAkJCWlmIChlcnJvciA+PSAwKQotCQkJCWVycm9yID0gdXNiX2dldF9yZXBvcnQoaW50ZiwKLQkJCQkJV0FDX0hJRF9GRUFUVVJFX1JFUE9SVCwgcmVwb3J0X2lkLAotCQkJCQlyZXBfZGF0YSwgNCk7CisJCQkJZXJyb3IgPSB3YWNvbV9nZXRfcmVwb3J0KGludGYsCisJCQkJCQlXQUNfSElEX0ZFQVRVUkVfUkVQT1JULAorCQkJCQkJcmVwb3J0X2lkLCByZXBfZGF0YSwgNCwgMSk7CiAJCX0gd2hpbGUgKChlcnJvciA8IDAgfHwgcmVwX2RhdGFbMV0gIT0gNCkgJiYgbGltaXQrKyA8IFdBQ19NU0dfUkVUUklFUyk7CiAJfSBlbHNlIGlmIChmZWF0dXJlcy0+dHlwZSAhPSBUQUJMRVRQQykgewogCQlkbyB7CiAJCQlyZXBfZGF0YVswXSA9IDI7CiAJCQlyZXBfZGF0YVsxXSA9IDI7Ci0JCQllcnJvciA9IHVzYl9zZXRfcmVwb3J0KGludGYsIFdBQ19ISURfRkVBVFVSRV9SRVBPUlQsCi0JCQkJcmVwb3J0X2lkLCByZXBfZGF0YSwgMik7CisJCQllcnJvciA9IHdhY29tX3NldF9yZXBvcnQoaW50ZiwgV0FDX0hJRF9GRUFUVVJFX1JFUE9SVCwKKwkJCQkJCSByZXBvcnRfaWQsIHJlcF9kYXRhLCAyLCAxKTsKIAkJCWlmIChlcnJvciA+PSAwKQotCQkJCWVycm9yID0gdXNiX2dldF9yZXBvcnQoaW50ZiwKLQkJCQkJV0FDX0hJRF9GRUFUVVJFX1JFUE9SVCwgcmVwb3J0X2lkLAotCQkJCQlyZXBfZGF0YSwgMik7CisJCQkJZXJyb3IgPSB3YWNvbV9nZXRfcmVwb3J0KGludGYsCisJCQkJCQlXQUNfSElEX0ZFQVRVUkVfUkVQT1JULAorCQkJCQkJcmVwb3J0X2lkLCByZXBfZGF0YSwgMiwgMSk7CiAJCX0gd2hpbGUgKChlcnJvciA8IDAgfHwgcmVwX2RhdGFbMV0gIT0gMikgJiYgbGltaXQrKyA8IFdBQ19NU0dfUkVUUklFUyk7CiAJfQogCkBAIC00NTQsNiArNDc2LDI3NSBAQAogCX0KIH0KIAorc3RhdGljIGludCB3YWNvbV9sZWRfY29udHJvbChzdHJ1Y3Qgd2Fjb20gKndhY29tKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgcmV0dmFsLCBsZWQgPSAwOworCisJYnVmID0ga3phbGxvYyg5LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAod2Fjb20tPndhY29tX3dhYy5mZWF0dXJlcy50eXBlID09IFdBQ09NXzIxVVgyKQorCQlsZWQgPSAod2Fjb20tPmxlZC5zZWxlY3RbMV0gPDwgNCkgfCAweDQwOworCisJbGVkIHw9ICB3YWNvbS0+bGVkLnNlbGVjdFswXSB8IDB4NDsKKworCWJ1ZlswXSA9IFdBQ19DTURfTEVEX0NPTlRST0w7CisJYnVmWzFdID0gbGVkOworCWJ1ZlsyXSA9IHdhY29tLT5sZWQubGx2OworCWJ1ZlszXSA9IHdhY29tLT5sZWQuaGx2OworCWJ1Zls0XSA9IHdhY29tLT5sZWQuaW1nX2x1bTsKKworCXJldHZhbCA9IHdhY29tX3NldF9yZXBvcnQod2Fjb20tPmludGYsIDB4MDMsIFdBQ19DTURfTEVEX0NPTlRST0wsCisJCQkJICBidWYsIDksIFdBQ19DTURfUkVUUklFUyk7CisJa2ZyZWUoYnVmKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fbGVkX3B1dGltYWdlKHN0cnVjdCB3YWNvbSAqd2Fjb20sIGludCBidXR0b25faWQsIGNvbnN0IHZvaWQgKmltZykKK3sKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJaW50IGksIHJldHZhbDsKKworCWJ1ZiA9IGt6YWxsb2MoMjU5LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBTZW5kICdzdGFydCcgY29tbWFuZCAqLworCWJ1ZlswXSA9IFdBQ19DTURfSUNPTl9TVEFSVDsKKwlidWZbMV0gPSAxOworCXJldHZhbCA9IHdhY29tX3NldF9yZXBvcnQod2Fjb20tPmludGYsIDB4MDMsIFdBQ19DTURfSUNPTl9TVEFSVCwKKwkJCQkgIGJ1ZiwgMiwgV0FDX0NNRF9SRVRSSUVTKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXQ7CisKKwlidWZbMF0gPSBXQUNfQ01EX0lDT05fWEZFUjsKKwlidWZbMV0gPSBidXR0b25faWQgJiAweDA3OworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJYnVmWzJdID0gaTsKKwkJbWVtY3B5KGJ1ZiArIDMsIGltZyArIGkgKiAyNTYsIDI1Nik7CisKKwkJcmV0dmFsID0gd2Fjb21fc2V0X3JlcG9ydCh3YWNvbS0+aW50ZiwgMHgwMywgV0FDX0NNRF9JQ09OX1hGRVIsCisJCQkJCSAgYnVmLCAyNTksIFdBQ19DTURfUkVUUklFUyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJYnJlYWs7CisJfQorCisJLyogU2VuZCAnc3RvcCcgKi8KKwlidWZbMF0gPSBXQUNfQ01EX0lDT05fU1RBUlQ7CisJYnVmWzFdID0gMDsKKwl3YWNvbV9zZXRfcmVwb3J0KHdhY29tLT5pbnRmLCAweDAzLCBXQUNfQ01EX0lDT05fU1RBUlQsCisJCQkgYnVmLCAyLCBXQUNfQ01EX1JFVFJJRVMpOworCitvdXQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdCB3YWNvbV9sZWRfc2VsZWN0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNldF9pZCwKKwkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGlkOworCWludCBlcnI7CisKKwllcnIgPSBrc3RydG91aW50KGJ1ZiwgMTAsICZpZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW11dGV4X2xvY2soJndhY29tLT5sb2NrKTsKKworCXdhY29tLT5sZWQuc2VsZWN0W3NldF9pZF0gPSBpZCAmIDB4MzsKKwllcnIgPSB3YWNvbV9sZWRfY29udHJvbCh3YWNvbSk7CisKKwltdXRleF91bmxvY2soJndhY29tLT5sb2NrKTsKKworCXJldHVybiBlcnIgPCAwID8gZXJyIDogY291bnQ7Cit9CisKKyNkZWZpbmUgREVWSUNFX0xFRF9TRUxFQ1RfQVRUUihTRVRfSUQpCQkJCQlcCitzdGF0aWMgc3NpemVfdCB3YWNvbV9sZWQjI1NFVF9JRCMjX3NlbGVjdF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHdhY29tX2xlZF9zZWxlY3Rfc3RvcmUoZGV2LCBTRVRfSUQsIGJ1ZiwgY291bnQpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHdhY29tX2xlZCMjU0VUX0lEIyNfc2VsZWN0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAlcCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMiwgIiVkXG4iLCB3YWNvbS0+bGVkLnNlbGVjdFtTRVRfSURdKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0dXNfbGVkIyNTRVRfSUQjI19zZWxlY3QsIFNfSVdVU1IgfCBTX0lSVVNSLAlcCisJCSAgICB3YWNvbV9sZWQjI1NFVF9JRCMjX3NlbGVjdF9zaG93LAkJCVwKKwkJICAgIHdhY29tX2xlZCMjU0VUX0lEIyNfc2VsZWN0X3N0b3JlKQorCitERVZJQ0VfTEVEX1NFTEVDVF9BVFRSKDApOworREVWSUNFX0xFRF9TRUxFQ1RfQVRUUigxKTsKKworc3RhdGljIHNzaXplX3Qgd2Fjb21fbHVtaW5hbmNlX3N0b3JlKHN0cnVjdCB3YWNvbSAqd2Fjb20sIHU4ICpkZXN0LAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgaW50IHZhbHVlOworCWludCBlcnI7CisKKwllcnIgPSBrc3RydG91aW50KGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW11dGV4X2xvY2soJndhY29tLT5sb2NrKTsKKworCSpkZXN0ID0gdmFsdWUgJiAweDdmOworCWVyciA9IHdhY29tX2xlZF9jb250cm9sKHdhY29tKTsKKworCW11dGV4X3VubG9jaygmd2Fjb20tPmxvY2spOworCisJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBjb3VudDsKK30KKworI2RlZmluZSBERVZJQ0VfTFVNSU5BTkNFX0FUVFIobmFtZSwgZmllbGQpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHdhY29tXyMjbmFtZSMjX2x1bWluYW5jZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHdhY29tICp3YWNvbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gd2Fjb21fbHVtaW5hbmNlX3N0b3JlKHdhY29tLCAmd2Fjb20tPmxlZC5maWVsZCwJCVwKKwkJCQkgICAgIGJ1ZiwgY291bnQpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSMjX2x1bWluYW5jZSwgU19JV1VTUiwJCQkJXAorCQkgICBOVUxMLCB3YWNvbV8jI25hbWUjI19sdW1pbmFuY2Vfc3RvcmUpCisKK0RFVklDRV9MVU1JTkFOQ0VfQVRUUihzdGF0dXMwLCBsbHYpOworREVWSUNFX0xVTUlOQU5DRV9BVFRSKHN0YXR1czEsIGhsdik7CitERVZJQ0VfTFVNSU5BTkNFX0FUVFIoYnV0dG9ucywgaW1nX2x1bSk7CisKK3N0YXRpYyBzc2l6ZV90IHdhY29tX2J1dHRvbl9pbWFnZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBidXR0b25faWQsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKGNvdW50ICE9IDEwMjQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmd2Fjb20tPmxvY2spOworCisJZXJyID0gd2Fjb21fbGVkX3B1dGltYWdlKHdhY29tLCBidXR0b25faWQsIGJ1Zik7CisKKwltdXRleF91bmxvY2soJndhY29tLT5sb2NrKTsKKworCXJldHVybiBlcnIgPCAwID8gZXJyIDogY291bnQ7Cit9CisKKyNkZWZpbmUgREVWSUNFX0JUTklNR19BVFRSKEJVVFRPTl9JRCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHdhY29tX2J0bmltZyMjQlVUVE9OX0lEIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAlcCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXJldHVybiB3YWNvbV9idXR0b25faW1hZ2Vfc3RvcmUoZGV2LCBCVVRUT05fSUQsIGJ1ZiwgY291bnQpOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGJ1dHRvbiMjQlVUVE9OX0lEIyNfcmF3aW1nLCBTX0lXVVNSLAkJCVwKKwkJICAgTlVMTCwgd2Fjb21fYnRuaW1nIyNCVVRUT05fSUQjI19zdG9yZSkKKworREVWSUNFX0JUTklNR19BVFRSKDApOworREVWSUNFX0JUTklNR19BVFRSKDEpOworREVWSUNFX0JUTklNR19BVFRSKDIpOworREVWSUNFX0JUTklNR19BVFRSKDMpOworREVWSUNFX0JUTklNR19BVFRSKDQpOworREVWSUNFX0JUTklNR19BVFRSKDUpOworREVWSUNFX0JUTklNR19BVFRSKDYpOworREVWSUNFX0JUTklNR19BVFRSKDcpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2ludGlxX2xlZF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9zdGF0dXNfbGVkMF9zZWxlY3QuYXR0ciwKKwkmZGV2X2F0dHJfc3RhdHVzX2xlZDFfc2VsZWN0LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY2ludGlxX2xlZF9hdHRyX2dyb3VwID0geworCS5uYW1lID0gIndhY29tX2xlZCIsCisJLmF0dHJzID0gY2ludGlxX2xlZF9hdHRycywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbnR1b3M0X2xlZF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9zdGF0dXMwX2x1bWluYW5jZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXMxX2x1bWluYW5jZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXNfbGVkMF9zZWxlY3QuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uc19sdW1pbmFuY2UuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uMF9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uMV9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uMl9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uM19yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uNF9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uNV9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uNl9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uN19yYXdpbWcuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpbnR1b3M0X2xlZF9hdHRyX2dyb3VwID0geworCS5uYW1lID0gIndhY29tX2xlZCIsCisJLmF0dHJzID0gaW50dW9zNF9sZWRfYXR0cnMsCit9OworCitzdGF0aWMgaW50IHdhY29tX2luaXRpYWxpemVfbGVkcyhzdHJ1Y3Qgd2Fjb20gKndhY29tKQoreworCWludCBlcnJvcjsKKworCS8qIEluaXRpYWxpemUgZGVmYXVsdCB2YWx1ZXMgKi8KKwlzd2l0Y2ggKHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMudHlwZSkgeworCWNhc2UgSU5UVU9TNDoKKwljYXNlIElOVFVPUzRMOgorCQl3YWNvbS0+bGVkLnNlbGVjdFswXSA9IDA7CisJCXdhY29tLT5sZWQuc2VsZWN0WzFdID0gMDsKKwkJd2Fjb20tPmxlZC5sbHYgPSAxMDsKKwkJd2Fjb20tPmxlZC5obHYgPSAyMDsKKwkJd2Fjb20tPmxlZC5pbWdfbHVtID0gMTA7CisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ3YWNvbS0+aW50Zi0+ZGV2LmtvYmosCisJCQkJCSAgICZpbnR1b3M0X2xlZF9hdHRyX2dyb3VwKTsKKwkJYnJlYWs7CisKKwljYXNlIFdBQ09NXzIxVVgyOgorCQl3YWNvbS0+bGVkLnNlbGVjdFswXSA9IDA7CisJCXdhY29tLT5sZWQuc2VsZWN0WzFdID0gMDsKKwkJd2Fjb20tPmxlZC5sbHYgPSAwOworCQl3YWNvbS0+bGVkLmhsdiA9IDA7CisJCXdhY29tLT5sZWQuaW1nX2x1bSA9IDA7CisKKwkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJndhY29tLT5pbnRmLT5kZXYua29iaiwKKwkJCQkJICAgJmNpbnRpcV9sZWRfYXR0cl9ncm91cCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJndhY29tLT5pbnRmLT5kZXYsCisJCQkiY2Fubm90IGNyZWF0ZSBzeXNmcyBncm91cCBlcnI6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJd2Fjb21fbGVkX2NvbnRyb2wod2Fjb20pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdhY29tX2Rlc3Ryb3lfbGVkcyhzdHJ1Y3Qgd2Fjb20gKndhY29tKQoreworCXN3aXRjaCAod2Fjb20tPndhY29tX3dhYy5mZWF0dXJlcy50eXBlKSB7CisJY2FzZSBJTlRVT1M0OgorCWNhc2UgSU5UVU9TNEw6CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmd2Fjb20tPmludGYtPmRldi5rb2JqLAorCQkJCSAgICZpbnR1b3M0X2xlZF9hdHRyX2dyb3VwKTsKKwkJYnJlYWs7CisKKwljYXNlIFdBQ09NXzIxVVgyOgorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJndhY29tLT5pbnRmLT5kZXYua29iaiwKKwkJCQkgICAmY2ludGlxX2xlZF9hdHRyX2dyb3VwKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgaW50IHdhY29tX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CkBAIC01NDIsMTYgKzgzMywyMSBAQAogCXdhY29tLT5pcnEtPnRyYW5zZmVyX2RtYSA9IHdhY29tLT5kYXRhX2RtYTsKIAl3YWNvbS0+aXJxLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAotCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJZXJyb3IgPSB3YWNvbV9pbml0aWFsaXplX2xlZHMod2Fjb20pOwogCWlmIChlcnJvcikKIAkJZ290byBmYWlsNDsKIAorCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw1OworCiAJLyogTm90ZSB0aGF0IGlmIHF1ZXJ5IGZhaWxzIGl0IGlzIG5vdCBhIGhhcmQgZmFpbHVyZSAqLwogCXdhY29tX3F1ZXJ5X3RhYmxldF9kYXRhKGludGYsIGZlYXR1cmVzKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgd2Fjb20pOwogCXJldHVybiAwOwogCisgZmFpbDU6IHdhY29tX2Rlc3Ryb3lfbGVkcyh3YWNvbSk7CiAgZmFpbDQ6CXdhY29tX3JlbW92ZV9zaGFyZWRfZGF0YSh3YWNvbV93YWMpOwogIGZhaWwzOgl1c2JfZnJlZV91cmIod2Fjb20tPmlycSk7CiAgZmFpbDI6CXVzYl9mcmVlX2NvaGVyZW50KGRldiwgV0FDT01fUEtHTEVOX01BWCwgd2Fjb21fd2FjLT5kYXRhLCB3YWNvbS0+ZGF0YV9kbWEpOwpAQCAtNTY4LDYgKzg2NCw3IEBACiAKIAl1c2Jfa2lsbF91cmIod2Fjb20tPmlycSk7CiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uod2Fjb20tPndhY29tX3dhYy5pbnB1dCk7CisJd2Fjb21fZGVzdHJveV9sZWRzKHdhY29tKTsKIAl1c2JfZnJlZV91cmIod2Fjb20tPmlycSk7CiAJdXNiX2ZyZWVfY29oZXJlbnQoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgV0FDT01fUEtHTEVOX01BWCwKIAkJCXdhY29tLT53YWNvbV93YWMuZGF0YSwgd2Fjb20tPmRhdGFfZG1hKTsKQEAgLTU5MCwxNyArODg3LDE2IEBACiB7CiAJc3RydWN0IHdhY29tICp3YWNvbSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IHdhY29tX2ZlYXR1cmVzICpmZWF0dXJlcyA9ICZ3YWNvbS0+d2Fjb21fd2FjLmZlYXR1cmVzOwotCWludCBydjsKKwlpbnQgcnYgPSAwOwogCiAJbXV0ZXhfbG9jaygmd2Fjb20tPmxvY2spOwogCiAJLyogc3dpdGNoIHRvIHdhY29tIG1vZGUgZmlyc3QgKi8KIAl3YWNvbV9xdWVyeV90YWJsZXRfZGF0YShpbnRmLCBmZWF0dXJlcyk7CisJd2Fjb21fbGVkX2NvbnRyb2wod2Fjb20pOwogCi0JaWYgKHdhY29tLT5vcGVuKQotCQlydiA9IHVzYl9zdWJtaXRfdXJiKHdhY29tLT5pcnEsIEdGUF9OT0lPKTsKLQllbHNlCi0JCXJ2ID0gMDsKKwlpZiAod2Fjb20tPm9wZW4gJiYgdXNiX3N1Ym1pdF91cmIod2Fjb20tPmlycSwgR0ZQX05PSU8pIDwgMCkKKwkJcnYgPSAtRUlPOwogCiAJbXV0ZXhfdW5sb2NrKCZ3YWNvbS0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3dhYy5jIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKaW5kZXggOWRlYTcxOC4uZGEwZDg3NjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYworKysgYi9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYwpAQCAtODc0LDcgKzg3NCwxNSBAQAogCQl4ID0gbGUxNl90b19jcHVwKChfX2xlMTYgKikmZGF0YVsyXSk7CiAJCXkgPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZkYXRhWzRdKTsKIAkJcCA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopJmRhdGFbNl0pOwotCQlkID0gZGF0YVs4XTsKKwkJLyoKKwkJICogQ29udmVydCBkaXN0YW5jZSBmcm9tIG91dCBwcm94IHRvIGRpc3RhbmNlIGZyb20gdGFibGV0LgorCQkgKiBkaXN0YW5jZSB3aWxsIGJlIGdyZWF0ZXIgdGhhbiBkaXN0YW5jZV9tYXggb25jZQorCQkgKiB0b3VjaGluZyBhbmQgYXBwbHlpbmcgcHJlc3N1cmU7IGRvIG5vdCByZXBvcnQgbmVnYXRpdmUKKwkJICogZGlzdGFuY2UuCisJCSAqLworCQlpZiAoZGF0YVs4XSA8PSB3YWNvbS0+ZmVhdHVyZXMuZGlzdGFuY2VfbWF4KQorCQkJZCA9IHdhY29tLT5mZWF0dXJlcy5kaXN0YW5jZV9tYXggLSBkYXRhWzhdOworCiAJCXBlbiA9IGRhdGFbMV0gJiAweDAxOwogCQlidG4xID0gZGF0YVsxXSAmIDB4MDI7CiAJCWJ0bjIgPSBkYXRhWzFdICYgMHgwNDsKQEAgLTEwMzAsOCArMTAzOCw2IEBACiAJCWZlYXR1cmVzLT55X21heCA8PD0gNTsKIAkJZmVhdHVyZXMtPnhfZnV6eiA8PD0gNTsKIAkJZmVhdHVyZXMtPnlfZnV6eiA8PD0gNTsKLQkJZmVhdHVyZXMtPnByZXNzdXJlX21heCA9IDI1NjsKLQkJZmVhdHVyZXMtPnByZXNzdXJlX2Z1enogPSAxNjsKIAkJZmVhdHVyZXMtPnF1aXJrcyB8PSBXQUNPTV9RVUlSS19CQlRPVUNIX0xPV1JFUzsKIAl9CiB9CkBAIC0xMjQxLDE0ICsxMjQ3LDE0IEBACiAJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9ZLAogCQkJCQkgICAgIDAsIGZlYXR1cmVzLT55X21heCwKIAkJCQkJICAgICBmZWF0dXJlcy0+eV9mdXp6LCAwKTsKLQkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX01UX1BSRVNTVVJFLAotCQkJCQkgICAgIDAsIGZlYXR1cmVzLT5wcmVzc3VyZV9tYXgsCi0JCQkJCSAgICAgZmVhdHVyZXMtPnByZXNzdXJlX2Z1enosIDApOwogCQl9IGVsc2UgaWYgKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSA9PSBCVE5fVE9PTF9QRU4pIHsKIAkJCV9fc2V0X2JpdChCVE5fVE9PTF9SVUJCRVIsIGlucHV0X2Rldi0+a2V5Yml0KTsKIAkJCV9fc2V0X2JpdChCVE5fVE9PTF9QRU4sIGlucHV0X2Rldi0+a2V5Yml0KTsKIAkJCV9fc2V0X2JpdChCVE5fU1RZTFVTLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJCQlfX3NldF9iaXQoQlROX1NUWUxVUzIsIGlucHV0X2Rldi0+a2V5Yml0KTsKKwkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX0RJU1RBTkNFLCAwLAorCQkJCQkgICAgICBmZWF0dXJlcy0+ZGlzdGFuY2VfbWF4LAorCQkJCQkgICAgICAwLCAwKTsKIAkJfQogCQlicmVhazsKIAl9CkBAIC0xNDY5LDM3ICsxNDc1LDM3IEBACiAJICAzMSwgSU5UVU9TLCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4RDAgPQogCXsgIldhY29tIEJhbWJvbyAyRkciLCAgICAgV0FDT01fUEtHTEVOX0JCRlVOLCAgICAgMTQ3MjAsICA5MjAwLCAxMDIzLAotCSAgNjMsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9OworCSAgMzEsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weEQxID0KIAl7ICJXYWNvbSBCYW1ib28gMkZHIDR4NSIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgICAgIDE0NzIwLCAgOTIwMCwgMTAyMywKLQkgIDYzLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKKwkgIDMxLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHhEMiA9CiAJeyAiV2Fjb20gQmFtYm9vIENyYWZ0IiwgICBXQUNPTV9QS0dMRU5fQkJGVU4sICAgICAxNDcyMCwgIDkyMDAsIDEwMjMsCi0JICA2MywgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CisJICAzMSwgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4RDMgPQotCXsgIldhY29tIEJhbWJvbyAyRkcgNng4IiwgV0FDT01fUEtHTEVOX0JCRlVOLCAgICAgMjE2NDgsIDEzNTMwLCAxMDIzLAotCSAgNjMsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9OworCXsgIldhY29tIEJhbWJvbyAyRkcgNng4IiwgV0FDT01fUEtHTEVOX0JCRlVOLCAgICAgMjE2NDgsIDEzNzAwLCAxMDIzLAorCSAgMzEsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weEQ0ID0KIAl7ICJXYWNvbSBCYW1ib28gUGVuIiwgICAgIFdBQ09NX1BLR0xFTl9CQkZVTiwgICAgIDE0NzIwLCAgOTIwMCwgMTAyMywKLQkgIDYzLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKKwkgIDMxLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHhENSA9Ci0JeyAiV2Fjb20gQmFtYm9vIFBlbiA2eDgiLCAgICAgV0FDT01fUEtHTEVOX0JCRlVOLCAyMTY0OCwgMTM1MzAsIDEwMjMsCi0JICA2MywgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CisJeyAiV2Fjb20gQmFtYm9vIFBlbiA2eDgiLCAgICAgV0FDT01fUEtHTEVOX0JCRlVOLCAyMTY0OCwgMTM3MDAsIDEwMjMsCisJICAzMSwgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4RDYgPQogCXsgIldhY29tIEJhbWJvb1BUIDJGRyA0eDUiLCBXQUNPTV9QS0dMRU5fQkJGVU4sICAgMTQ3MjAsICA5MjAwLCAxMDIzLAotCSAgNjMsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9OworCSAgMzEsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weEQ3ID0KIAl7ICJXYWNvbSBCYW1ib29QVCAyRkcgU21hbGwiLCBXQUNPTV9QS0dMRU5fQkJGVU4sIDE0NzIwLCAgOTIwMCwgMTAyMywKLQkgIDYzLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKKwkgIDMxLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHhEOCA9Ci0JeyAiV2Fjb20gQmFtYm9vIENvbWljIDJGRyIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgICAyMTY0OCwgMTM1MzAsIDEwMjMsCi0JICA2MywgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CisJeyAiV2Fjb20gQmFtYm9vIENvbWljIDJGRyIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgICAyMTY0OCwgMTM3MDAsIDEwMjMsCisJICAzMSwgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4REEgPQogCXsgIldhY29tIEJhbWJvbyAyRkcgNHg1IFNFIiwgV0FDT01fUEtHTEVOX0JCRlVOLCAgMTQ3MjAsICA5MjAwLCAxMDIzLAotCSAgNjMsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9OworCSAgMzEsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9Owogc3RhdGljIHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weERCID0KLQl7ICJXYWNvbSBCYW1ib28gMkZHIDZ4OCBTRSIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgIDIxNjQ4LCAxMzUzMCwgMTAyMywKLQkgIDYzLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKKwl7ICJXYWNvbSBCYW1ib28gMkZHIDZ4OCBTRSIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgIDIxNjQ4LCAxMzcwMCwgMTAyMywKKwkgIDMxLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHg2MDA0ID0KIAl7ICJJU0QtVjQiLCAgICAgICAgICAgICAgIFdBQ09NX1BLR0xFTl9HUkFQSElSRSwgIDEyODAwLCAgODAwMCwgIDI1NSwKIAkgIDAsIFRBQkxFVFBDLCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKaW5kZXggY2FiZDllNS4uMzQ4OGZmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwpAQCAtNjUxLDYgKzY1MSwxOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdG91Y2hpdDIxMy4KIAorY29uZmlnIFRPVUNIU0NSRUVOX1RTQ19TRVJJTworCXRyaXN0YXRlICJUU0MtMTAvMjUvNDAgc2VyaWFsIHRvdWNoc2NyZWVuIHN1cHBvcnQiCisJc2VsZWN0IFNFUklPCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFRTQy0xMCwgMjUgb3IgNDAgc2VyaWFsIHRvdWNoc2NyZWVuIGNvbm5lY3RlZAorCSAgdG8geW91ciBzeXN0ZW0uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRzYzQwLgorCiBjb25maWcgVE9VQ0hTQ1JFRU5fVFNDMjAwNQogICAgICAgICB0cmlzdGF0ZSAiVFNDMjAwNSBiYXNlZCB0b3VjaHNjcmVlbnMiCiAgICAgICAgIGRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBHRU5FUklDX0hBUkRJUlFTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQppbmRleCAyODJkNmY3Li5mOTU3Njc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKQEAgLTQ2LDYgKzQ2LDcgQEAKIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzKQkrPSB0b3VjaGl0MjEzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUKQkrPSB0b3VjaHJpZ2h0Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTikJKz0gdG91Y2h3aW4ubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RTQ19TRVJJTykJKz0gdHNjNDAubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RTQzIwMDUpCSs9IHRzYzIwMDUubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RTQzIwMDcpCSs9IHRzYzIwMDcubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDApCSs9IHVjYjE0MDBfdHMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzcuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc3LmMKaW5kZXggNzE0ZDRlMC4uNDAwMTMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzcuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3Ny5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc3Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjZGVmaW5lCVRTX1BFTl9VUF9USU1FT1VUCW1zZWNzX3RvX2ppZmZpZXMoMTAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzktaTJjLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1pMmMuYwppbmRleCA0ZTRlNThjLi5jNzg5Yjk3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzktaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzktaTJjLmMKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2RlZmluZSBBRDc4NzlfREVWSUQJCTB4NzkJLyogQUQ3ODc5LTEvQUQ3ODg5LTEgKi8KIAotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBhZDc4NzlfaTJjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CkBAIC0zNiw5ICszNiw5IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoYWQ3ODc5X2kyY19wbSwgYWQ3ODc5X2kyY19zdXNwZW5kLCBhZDc4NzlfaTJjX3Jlc3VtZSk7Ci0jZW5kaWYKIAogLyogQWxsIHJlZ2lzdGVycyBhcmUgd29yZC1zaXplZC4KICAqIEFENzg3OSB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24uCkBAIC0xMTksOSArMTE5LDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJhZDc4NzkiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKLSNpZmRlZiBDT05GSUdfUE0KIAkJLnBtCT0gJmFkNzg3OV9pMmNfcG0sCi0jZW5kaWYKIAl9LAogCS5wcm9iZQkJPSBhZDc4NzlfaTJjX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQ3ODc5X2kyY19yZW1vdmUpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4Nzktc3BpLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1zcGkuYwppbmRleCBkZGY3MzJmLi5iMTY0M2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1zcGkuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1zcGkuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgkvKiBCVVNfU1BJICovCiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJhZDc4NzkuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKaW5kZXggMTMxZjlkMWMuLjNiMmU5ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZDc4NzkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJhZDc4NzkuaCIKIAogI2RlZmluZSBBRDc4NzlfUkVHX1pFUk9TCQkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCmluZGV4IGQ1MDdiOWIuLmRlMzFlYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF9teHRfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfbXh0X3RzLmMKaW5kZXggZjVkNjY4NS4uYTU5NmMyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF9teHRfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVsX214dF90cy5jCkBAIC05MTAsMTIgKzkxMCwxNyBAQAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5pbmZvLm9iamVjdF9udW07IGkrKykgewogCQlvYmplY3QgPSBkYXRhLT5vYmplY3RfdGFibGUgKyBpOwogCi0JCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsCi0JCQkJIk9iamVjdCBUYWJsZSBFbGVtZW50ICVkKFR5cGUgJWQpXG4iLAorCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkJIk9iamVjdFslZF0gKFR5cGUgJWQpXG4iLAogCQkJCWkgKyAxLCBvYmplY3QtPnR5cGUpOworCQlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQorCQkJcmV0dXJuIFBBR0VfU0laRSAtIDE7CiAKIAkJaWYgKCFteHRfb2JqZWN0X3JlYWRhYmxlKG9iamVjdC0+dHlwZSkpIHsKLQkJCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICJcbiIpOworCQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJCQkiXG4iKTsKKwkJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCisJCQkJcmV0dXJuIFBBR0VfU0laRSAtIDE7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC05MjUsMTEgKzkzMCwxNSBAQAogCQkJaWYgKGVycm9yKQogCQkJCXJldHVybiBlcnJvcjsKIAotCQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwKLQkJCQkJIiAgQnl0ZSAlZDogMHgleCAoJWQpXG4iLCBqLCB2YWwsIHZhbCk7CisJCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkJCSJcdFslMmRdOiAlMDJ4ICglZClcbiIsIGosIHZhbCwgdmFsKTsKKwkJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCisJCQkJcmV0dXJuIFBBR0VfU0laRSAtIDE7CiAJCX0KIAotCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiXG4iKTsKKwkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiXG4iKTsKKwkJaWYgKGNvdW50ID49IFBBR0VfU0laRSkKKwkJCXJldHVybiBQQUdFX1NJWkUgLSAxOwogCX0KIAogCXJldHVybiBjb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfdHNhZGNjLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVsX3RzYWRjYy5jCmluZGV4IDQzMmM2OWIuLjEyMmE4NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfdHNhZGNjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF90c2FkY2MuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCWdvdG8gZXJyX3JlbGVhc2VfbWVtOwogCX0KIAotCWVyciA9IHJlcXVlc3RfaXJxKHRzX2Rldi0+aXJxLCBhdG1lbF90c2FkY2NfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCWVyciA9IHJlcXVlc3RfaXJxKHRzX2Rldi0+aXJxLCBhdG1lbF90c2FkY2NfaW50ZXJydXB0LCAwLAogCQkJcGRldi0+ZGV2LmRyaXZlci0+bmFtZSwgdHNfZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpcnEuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYnUyMTAxM190cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9idTIxMDEzX3RzLmMKaW5kZXggMTUwN2NlMS4uOTAyYzcyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9idTIxMDEzX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9idTIxMDEzX3RzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC9idTIxMDEzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIFBFTl9ET1dOX0lOVFIJMAogI2RlZmluZSBNQVhfRklOR0VSUwkyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMKaW5kZXggMjExODExYS4uNjEwN2U1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaDM2MDBfdHNfaW5wdXQuYwpAQCAtMzk2LDE0ICszOTYsMTQgQEAKIAlzZXRfR1BJT19JUlFfZWRnZShHUElPX0JJVFNZX05QT1dFUl9CVVRUT04sIEdQSU9fUklTSU5HX0VER0UpOwogCiAJaWYgKHJlcXVlc3RfaXJxKElSUV9HUElPX0JJVFNZX0FDVElPTl9CVVRUT04sIGFjdGlvbl9idXR0b25faGFuZGxlciwKLQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgImgzNjAwX2FjdGlvbiIsIHRzLT5kZXYpKSB7CisJCQlJUlFGX1NIQVJFRCwgImgzNjAwX2FjdGlvbiIsIHRzLT5kZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaDM2MDB0cy5jOiBDb3VsZCBub3QgYWxsb2NhdGUgQWN0aW9uIEJ1dHRvbiBJUlEhXG4iKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGZhaWwxOwogCX0KIAogCWlmIChyZXF1ZXN0X2lycShJUlFfR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OLCBucG93ZXJfYnV0dG9uX2hhbmRsZXIsCi0JCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsICJoMzYwMF9zdXNwZW5kIiwgdHMtPmRldikpIHsKKwkJCUlSUUZfU0hBUkVELCAiaDM2MDBfc3VzcGVuZCIsIHRzLT5kZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaDM2MDB0cy5jOiBDb3VsZCBub3QgYWxsb2NhdGUgUG93ZXIgQnV0dG9uIElSUSFcbiIpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gZmFpbDI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2hwNjgwX3RzX2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2hwNjgwX3RzX2lucHV0LmMKaW5kZXggZGQ0ZThmMC4uNjM5YTYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ocDY4MF90c19pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaHA2ODBfdHNfaW5wdXQuYwpAQCAtOTMsNyArOTMsNyBAQAogCWhwNjgwX3RzX2Rldi0+cGh5cyA9ICJocDY4MF90cy9pbnB1dDAiOwogCiAJaWYgKHJlcXVlc3RfaXJxKEhQNjgwX1RTX0lSUSwgaHA2ODBfdHNfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCwgTU9ETkFNRSwgMCkgPCAwKSB7CisJCQkwLCBNT0ROQU1FLCAwKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJocDY4MF90b3VjaHNjcmVlbi5jOiBDYW4ndCBhbGxvY2F0ZSBpcnEgJWRcbiIsCiAJCSAgICAgICBIUDY4MF9UU19JUlEpOwogCQllcnIgPSAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2pvcm5hZGE3MjBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vam9ybmFkYTcyMF90cy5jCmluZGV4IDRiMGEwNjEuLjUwMDc2YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vam9ybmFkYTcyMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vam9ybmFkYTcyMF90cy5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogCWVycm9yID0gcmVxdWVzdF9pcnEoSVJRX0dQSU85LAogCQkJam9ybmFkYTcyMF90c19pbnRlcnJ1cHQsCi0JCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsCiAJCQkiSFA3WFggVG91Y2hzY3JlZW4gZHJpdmVyIiwgcGRldik7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkhQN1hYIFRTIDogVW5hYmxlIHRvIGFjcXVpcmUgaXJxIVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2xwYzMyeHhfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbHBjMzJ4eF90cy5jCmluZGV4IGRjZjgwM2YuLjBhNDg0ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbHBjMzJ4eF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbHBjMzJ4eF90cy5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dCwgdHNjKTsKIAogCWVycm9yID0gcmVxdWVzdF9pcnEodHNjLT5pcnEsIGxwYzMyeHhfdHNfaW50ZXJydXB0LAotCQkJICAgIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIHRzYyk7CisJCQkgICAgMCwgcGRldi0+bmFtZSwgdHNjKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHJlcXVlc3RpbmcgaW50ZXJydXB0XG4iKTsKIAkJZ290byBlcnJfcHV0X2Nsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tYzEzNzgzX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21jMTM3ODNfdHMuYwppbmRleCBjNWJjNjJkLi5lZGUwMjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21jMTM3ODNfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21jMTM3ODNfdHMuYwpAQCAtMzUsNyArMzUsNyBAQAogCiBzdHJ1Y3QgbWMxMzc4M190c19wcml2IHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OwotCXN0cnVjdCBtYzEzNzgzICptYzEzNzgzOworCXN0cnVjdCBtYzEzeHh4ICptYzEzeHh4OwogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3E7CiAJdW5zaWduZWQgaW50IHNhbXBsZVs0XTsKQEAgLTQ1LDcgKzQ1LDcgQEAKIHsKIAlzdHJ1Y3QgbWMxMzc4M190c19wcml2ICpwcml2ID0gZGF0YTsKIAotCW1jMTM3ODNfaXJxX2Fjayhwcml2LT5tYzEzNzgzLCBpcnEpOworCW1jMTN4eHhfaXJxX2Fjayhwcml2LT5tYzEzeHh4LCBpcnEpOwogCiAJLyoKIAkgKiBLaWNrIG9mZiByZWFkaW5nIGNvb3JkaW5hdGVzLiBOb3RlIHRoYXQgaWYgd29yayBoYXBwZW5zIGFscmVhZHkKQEAgLTEyMSwxMCArMTIxLDEwIEBACiB7CiAJc3RydWN0IG1jMTM3ODNfdHNfcHJpdiAqcHJpdiA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWMxMzc4M190c19wcml2LCB3b3JrLndvcmspOwotCXVuc2lnbmVkIGludCBtb2RlID0gTUMxMzc4M19BRENfTU9ERV9UUzsKKwl1bnNpZ25lZCBpbnQgbW9kZSA9IE1DMTNYWFhfQURDX01PREVfVFM7CiAJdW5zaWduZWQgaW50IGNoYW5uZWwgPSAxMjsKIAotCWlmIChtYzEzNzgzX2FkY19kb19jb252ZXJzaW9uKHByaXYtPm1jMTM3ODMsCisJaWYgKG1jMTN4eHhfYWRjX2RvX2NvbnZlcnNpb24ocHJpdi0+bWMxM3h4eCwKIAkJCQltb2RlLCBjaGFubmVsLCBwcml2LT5zYW1wbGUpID09IDApCiAJCW1jMTM3ODNfdHNfcmVwb3J0X3NhbXBsZShwcml2KTsKIH0KQEAgLTEzNCwyMSArMTM0LDIxIEBACiAJc3RydWN0IG1jMTM3ODNfdHNfcHJpdiAqcHJpdiA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CiAJaW50IHJldDsKIAotCW1jMTM3ODNfbG9jayhwcml2LT5tYzEzNzgzKTsKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CiAKLQltYzEzNzgzX2lycV9hY2socHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfVFMpOworCW1jMTN4eHhfaXJxX2Fjayhwcml2LT5tYzEzeHh4LCBNQzEzWFhYX0lSUV9UUyk7CiAKLQlyZXQgPSBtYzEzNzgzX2lycV9yZXF1ZXN0KHByaXYtPm1jMTM3ODMsIE1DMTM3ODNfSVJRX1RTLAorCXJldCA9IG1jMTN4eHhfaXJxX3JlcXVlc3QocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9JUlFfVFMsCiAJCW1jMTM3ODNfdHNfaGFuZGxlciwgTUMxMzc4M19UU19OQU1FLCBwcml2KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXJldCA9IG1jMTM3ODNfcmVnX3Jtdyhwcml2LT5tYzEzNzgzLCBNQzEzNzgzX0FEQzAsCi0JCQlNQzEzNzgzX0FEQzBfVFNNT0RfTUFTSywgTUMxMzc4M19BREMwX1RTTU9EMCk7CisJcmV0ID0gbWMxM3h4eF9yZWdfcm13KHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfQURDMCwKKwkJCU1DMTNYWFhfQURDMF9UU01PRF9NQVNLLCBNQzEzWFhYX0FEQzBfVFNNT0QwKTsKIAlpZiAocmV0KQotCQltYzEzNzgzX2lycV9mcmVlKHByaXYtPm1jMTM3ODMsIE1DMTM3ODNfSVJRX1RTLCBwcml2KTsKKwkJbWMxM3h4eF9pcnFfZnJlZShwcml2LT5tYzEzeHh4LCBNQzEzWFhYX0lSUV9UUywgcHJpdik7CiBvdXQ6Ci0JbWMxMzc4M191bmxvY2socHJpdi0+bWMxMzc4Myk7CisJbWMxM3h4eF91bmxvY2socHJpdi0+bWMxM3h4eCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTU2LDExICsxNTYsMTEgQEAKIHsKIAlzdHJ1Y3QgbWMxMzc4M190c19wcml2ICpwcml2ID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCW1jMTM3ODNfbG9jayhwcml2LT5tYzEzNzgzKTsKLQltYzEzNzgzX3JlZ19ybXcocHJpdi0+bWMxMzc4MywgTUMxMzc4M19BREMwLAotCQkJTUMxMzc4M19BREMwX1RTTU9EX01BU0ssIDApOwotCW1jMTM3ODNfaXJxX2ZyZWUocHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfVFMsIHByaXYpOwotCW1jMTM3ODNfdW5sb2NrKHByaXYtPm1jMTM3ODMpOworCW1jMTN4eHhfbG9jayhwcml2LT5tYzEzeHh4KTsKKwltYzEzeHh4X3JlZ19ybXcocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9BREMwLAorCQkJTUMxM1hYWF9BREMwX1RTTU9EX01BU0ssIDApOworCW1jMTN4eHhfaXJxX2ZyZWUocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9JUlFfVFMsIHByaXYpOworCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT53b3JrKTsKIH0KQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQlnb3RvIGVycl9mcmVlX21lbTsKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT53b3JrLCBtYzEzNzgzX3RzX3dvcmspOwotCXByaXYtPm1jMTM3ODMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJcHJpdi0+bWMxM3h4eCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlwcml2LT5pZGV2ID0gaWRldjsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3Blbm1vdW50LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3Blbm1vdW50LmMKaW5kZXggYzdmOWNlYi4uNGMwMTJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9wZW5tb3VudC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vcGVubW91bnQuYwpAQCAtMiw2ICsyLDcgQEAKICAqIFBlbm1vdW50IHNlcmlhbCB0b3VjaHNjcmVlbiBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUmljayBLb2NoIDxuMWdwQGhvdG1haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDExIEpvaG4gU3VuZyA8cGVubW91bnQudG91Y2hAZ21haWwuY29tPgogICoKICAqIEJhc2VkIG9uIEVMTyBkcml2ZXIgKGRyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWxvLmMpCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVm9qdGVjaCBQYXZsaWsKQEAgLTE4LDEyICsxOSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L210Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKLSNkZWZpbmUgRFJJVkVSX0RFU0MJIlBlbm1vdW50IHNlcmlhbCB0b3VjaHNjcmVlbiBkcml2ZXIiCisjZGVmaW5lIERSSVZFUl9ERVNDCSJQZW5Nb3VudCBzZXJpYWwgdG91Y2hzY3JlZW4gZHJpdmVyIgogCiBNT0RVTEVfQVVUSE9SKCJSaWNrIEtvY2ggPG4xZ3BAaG90bWFpbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJKb2huIFN1bmcgPHBlbm1vdW50LnRvdWNoQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTMxLDcgKzM0LDE5IEBACiAgKiBEZWZpbml0aW9ucyAmIGdsb2JhbCBhcnJheXMuCiAgKi8KIAotI2RlZmluZQlQTV9NQVhfTEVOR1RICTUKKyNkZWZpbmUJUE1fTUFYX0xFTkdUSAk2CisjZGVmaW5lCVBNX01BWF9NVFNMT1QJMTYKKyNkZWZpbmUJUE1fMzAwMF9NVFNMT1QJMgorI2RlZmluZQlQTV82MjUwX01UU0xPVAkxMgorCisvKgorICogTXVsdGktdG91Y2ggc2xvdAorICovCisKK3N0cnVjdCBtdF9zbG90IHsKKwl1bnNpZ25lZCBzaG9ydCB4LCB5OworCWJvb2wgYWN0aXZlOyAvKiBpcyB0aGUgdG91Y2ggdmFsaWQ/ICovCit9OwogCiAvKgogICogUGVyLXRvdWNoc2NyZWVuIGRhdGEuCkBAIC00MywyNSArNTgsMTE5IEBACiAJaW50IGlkeDsKIAl1bnNpZ25lZCBjaGFyIGRhdGFbUE1fTUFYX0xFTkdUSF07CiAJY2hhciBwaHlzWzMyXTsKKwl1bnNpZ25lZCBjaGFyIHBhY2tldHNpemU7CisJdW5zaWduZWQgY2hhciBtYXhjb250YWN0czsKKwlzdHJ1Y3QgbXRfc2xvdCBzbG90c1tQTV9NQVhfTVRTTE9UXTsKKwl2b2lkICgqcGFyc2VfcGFja2V0KShzdHJ1Y3QgcG0gKik7CiB9OwogCisvKgorICogcG1fbXRldmVudCgpIHNlbmRzIG10IGV2ZW50cyBhbmQgYWxzbyBlbXVsYXRlcyBwb2ludGVyIG1vdmVtZW50CisgKi8KKworc3RhdGljIHZvaWQgcG1fbXRldmVudChzdHJ1Y3QgcG0gKnBtLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwbS0+bWF4Y29udGFjdHM7ICsraSkgeworCQlpbnB1dF9tdF9zbG90KGlucHV0LCBpKTsKKwkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoaW5wdXQsIE1UX1RPT0xfRklOR0VSLAorCQkJCXBtLT5zbG90c1tpXS5hY3RpdmUpOworCQlpZiAocG0tPnNsb3RzW2ldLmFjdGl2ZSkgeworCQkJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX0FCUywgQUJTX01UX1BPU0lUSU9OX1gsIHBtLT5zbG90c1tpXS54KTsKKwkJCWlucHV0X2V2ZW50KGlucHV0LCBFVl9BQlMsIEFCU19NVF9QT1NJVElPTl9ZLCBwbS0+c2xvdHNbaV0ueSk7CisJCX0KKwl9CisKKwlpbnB1dF9tdF9yZXBvcnRfcG9pbnRlcl9lbXVsYXRpb24oaW5wdXQsIHRydWUpOworCWlucHV0X3N5bmMoaW5wdXQpOworfQorCisvKgorICogcG1fY2hlY2twYWNrZXQoKSBjaGVja3MgaWYgZGF0YSBwYWNrZXQgaXMgdmFsaWQKKyAqLworCitzdGF0aWMgYm9vbCBwbV9jaGVja3BhY2tldCh1bnNpZ25lZCBjaGFyICpwYWNrZXQpCit7CisJaW50IHRvdGFsID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXRvdGFsICs9IHBhY2tldFtpXTsKKworCXJldHVybiBwYWNrZXRbNV0gPT0gKHVuc2lnbmVkIGNoYXIpfih0b3RhbCAmIDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBwbV9wYXJzZV85MDAwKHN0cnVjdCBwbSAqcG0pCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcG0tPmRldjsKKworCWlmICgocG0tPmRhdGFbMF0gJiAweDgwKSAmJiBwbS0+cGFja2V0c2l6ZSA9PSArK3BtLT5pZHgpIHsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCBwbS0+ZGF0YVsxXSAqIDEyOCArIHBtLT5kYXRhWzJdKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCBwbS0+ZGF0YVszXSAqIDEyOCArIHBtLT5kYXRhWzRdKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgISEocG0tPmRhdGFbMF0gJiAweDQwKSk7CisJCWlucHV0X3N5bmMoZGV2KTsKKwkJcG0tPmlkeCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbV9wYXJzZV82MDAwKHN0cnVjdCBwbSAqcG0pCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcG0tPmRldjsKKworCWlmICgocG0tPmRhdGFbMF0gJiAweGJmKSA9PSAweDMwICYmIHBtLT5wYWNrZXRzaXplID09ICsrcG0tPmlkeCkgeworCQlpZiAocG1fY2hlY2twYWNrZXQocG0tPmRhdGEpKSB7CisJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsCisJCQkJCXBtLT5kYXRhWzJdICogMjU2ICsgcG0tPmRhdGFbMV0pOworCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLAorCQkJCQlwbS0+ZGF0YVs0XSAqIDI1NiArIHBtLT5kYXRhWzNdKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIHBtLT5kYXRhWzBdICYgMHg0MCk7CisJCQlpbnB1dF9zeW5jKGRldik7CisJCX0KKwkJcG0tPmlkeCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbV9wYXJzZV8zMDAwKHN0cnVjdCBwbSAqcG0pCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcG0tPmRldjsKKworCWlmICgocG0tPmRhdGFbMF0gJiAweGNlKSA9PSAweDQwICYmIHBtLT5wYWNrZXRzaXplID09ICsrcG0tPmlkeCkgeworCQlpZiAocG1fY2hlY2twYWNrZXQocG0tPmRhdGEpKSB7CisJCQlpbnQgc2xvdG51bSA9IHBtLT5kYXRhWzBdICYgMHgwZjsKKwkJCXBtLT5zbG90c1tzbG90bnVtXS5hY3RpdmUgPSBwbS0+ZGF0YVswXSAmIDB4MzA7CisJCQlwbS0+c2xvdHNbc2xvdG51bV0ueCA9IHBtLT5kYXRhWzJdICogMjU2ICsgcG0tPmRhdGFbMV07CisJCQlwbS0+c2xvdHNbc2xvdG51bV0ueSA9IHBtLT5kYXRhWzRdICogMjU2ICsgcG0tPmRhdGFbM107CisJCQlwbV9tdGV2ZW50KHBtLCBkZXYpOworCQl9CisJCXBtLT5pZHggPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgcG1fcGFyc2VfNjI1MChzdHJ1Y3QgcG0gKnBtKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBtLT5kZXY7CisKKwlpZiAoKHBtLT5kYXRhWzBdICYgMHhiMCkgPT0gMHgzMCAmJiBwbS0+cGFja2V0c2l6ZSA9PSArK3BtLT5pZHgpIHsKKwkJaWYgKHBtX2NoZWNrcGFja2V0KHBtLT5kYXRhKSkgeworCQkJaW50IHNsb3RudW0gPSBwbS0+ZGF0YVswXSAmIDB4MGY7CisJCQlwbS0+c2xvdHNbc2xvdG51bV0uYWN0aXZlID0gcG0tPmRhdGFbMF0gJiAweDQwOworCQkJcG0tPnNsb3RzW3Nsb3RudW1dLnggPSBwbS0+ZGF0YVsyXSAqIDI1NiArIHBtLT5kYXRhWzFdOworCQkJcG0tPnNsb3RzW3Nsb3RudW1dLnkgPSBwbS0+ZGF0YVs0XSAqIDI1NiArIHBtLT5kYXRhWzNdOworCQkJcG1fbXRldmVudChwbSwgZGV2KTsKKwkJfQorCQlwbS0+aWR4ID0gMDsKKwl9Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBwbV9pbnRlcnJ1cHQoc3RydWN0IHNlcmlvICpzZXJpbywKIAkJdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHBtICpwbSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwbS0+ZGV2OwogCiAJcG0tPmRhdGFbcG0tPmlkeF0gPSBkYXRhOwogCi0JaWYgKHBtLT5kYXRhWzBdICYgMHg4MCkgewotCQlpZiAoUE1fTUFYX0xFTkdUSCA9PSArK3BtLT5pZHgpIHsKLQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgcG0tPmRhdGFbMl0gKiAxMjggKyBwbS0+ZGF0YVsxXSk7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHBtLT5kYXRhWzRdICogMTI4ICsgcG0tPmRhdGFbM10pOwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgISEocG0tPmRhdGFbMF0gJiAweDQwKSk7Ci0JCQlpbnB1dF9zeW5jKGRldik7Ci0JCQlwbS0+aWR4ID0gMDsKLQkJfQotCX0KKwlwbS0+cGFyc2VfcGFja2V0KHBtKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTc0LDE3ICsxODMsMTcgQEAKIHsKIAlzdHJ1Y3QgcG0gKnBtID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOwogCi0JaW5wdXRfZ2V0X2RldmljZShwbS0+ZGV2KTsKLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShwbS0+ZGV2KTsKIAlzZXJpb19jbG9zZShzZXJpbyk7Ci0Jc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwotCWlucHV0X3B1dF9kZXZpY2UocG0tPmRldik7CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShwbS0+ZGV2KTsKIAlrZnJlZShwbSk7CisKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CiB9CiAKIC8qCiAgKiBwbV9jb25uZWN0KCkgaXMgdGhlIHJvdXRpbmUgdGhhdCBpcyBjYWxsZWQgd2hlbiBzb21lb25lIGFkZHMgYQotICogbmV3IHNlcmlvIGRldmljZSB0aGF0IHN1cHBvcnRzIEd1bnplIHByb3RvY29sIGFuZCByZWdpc3RlcnMgaXQgYXMKKyAqIG5ldyBzZXJpbyBkZXZpY2UgdGhhdCBzdXBwb3J0cyBQZW5Nb3VudCBwcm90b2NvbCBhbmQgcmVnaXN0ZXJzIGl0IGFzCiAgKiBhbiBpbnB1dCBkZXZpY2UuCiAgKi8KIApAQCAtOTIsNiArMjAxLDcgQEAKIHsKIAlzdHJ1Y3QgcG0gKnBtOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgbWF4X3gsIG1heF95OwogCWludCBlcnI7CiAKIAlwbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbSksIEdGUF9LRVJORUwpOwpAQCAtMTA0LDggKzIxNCw5IEBACiAJcG0tPnNlcmlvID0gc2VyaW87CiAJcG0tPmRldiA9IGlucHV0X2RldjsKIAlzbnByaW50ZihwbS0+cGh5cywgc2l6ZW9mKHBtLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKwlwbS0+bWF4Y29udGFjdHMgPSAxOwogCi0JaW5wdXRfZGV2LT5uYW1lID0gIlBlbm1vdW50IFNlcmlhbCBUb3VjaFNjcmVlbiI7CisJaW5wdXRfZGV2LT5uYW1lID0gIlBlbk1vdW50IFNlcmlhbCBUb3VjaFNjcmVlbiI7CiAJaW5wdXRfZGV2LT5waHlzID0gcG0tPnBoeXM7CiAJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1JTMjMyOwogCWlucHV0X2Rldi0+aWQudmVuZG9yID0gU0VSSU9fUEVOTU9VTlQ7CkBAIC0xMTMsMTAgKzIyNCw1MiBAQAogCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKIAlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKIAotICAgICAgICBpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7Ci0gICAgICAgIGlucHV0X2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKTsKLSAgICAgICAgaW5wdXRfc2V0X2Fic19wYXJhbXMocG0tPmRldiwgQUJTX1gsIDAsIDB4M2ZmLCAwLCAwKTsKLSAgICAgICAgaW5wdXRfc2V0X2Fic19wYXJhbXMocG0tPmRldiwgQUJTX1ksIDAsIDB4M2ZmLCAwLCAwKTsKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpOworCisJc3dpdGNoIChzZXJpby0+aWQuaWQpIHsKKwlkZWZhdWx0OgorCWNhc2UgMDoKKwkJcG0tPnBhY2tldHNpemUgPSA1OworCQlwbS0+cGFyc2VfcGFja2V0ID0gcG1fcGFyc2VfOTAwMDsKKwkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gMHg5MDAwOworCQltYXhfeCA9IG1heF95ID0gMHgzZmY7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQlwbS0+cGFja2V0c2l6ZSA9IDY7CisJCXBtLT5wYXJzZV9wYWNrZXQgPSBwbV9wYXJzZV82MDAwOworCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSAweDYwMDA7CisJCW1heF94ID0gbWF4X3kgPSAweDNmZjsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXBtLT5wYWNrZXRzaXplID0gNjsKKwkJcG0tPnBhcnNlX3BhY2tldCA9IHBtX3BhcnNlXzMwMDA7CisJCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IDB4MzAwMDsKKwkJbWF4X3ggPSBtYXhfeSA9IDB4N2ZmOworCQlwbS0+bWF4Y29udGFjdHMgPSBQTV8zMDAwX01UU0xPVDsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCXBtLT5wYWNrZXRzaXplID0gNjsKKwkJcG0tPnBhcnNlX3BhY2tldCA9IHBtX3BhcnNlXzYyNTA7CisJCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IDB4NjI1MDsKKwkJbWF4X3ggPSBtYXhfeSA9IDB4M2ZmOworCQlwbS0+bWF4Y29udGFjdHMgPSBQTV82MjUwX01UU0xPVDsKKwkJYnJlYWs7CisJfQorCisJaW5wdXRfc2V0X2Fic19wYXJhbXMocG0tPmRldiwgQUJTX1gsIDAsIG1heF94LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhwbS0+ZGV2LCBBQlNfWSwgMCwgbWF4X3ksIDAsIDApOworCisJaWYgKHBtLT5tYXhjb250YWN0cyA+IDEpIHsKKwkJaW5wdXRfbXRfaW5pdF9zbG90cyhwbS0+ZGV2LCBwbS0+bWF4Y29udGFjdHMpOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhwbS0+ZGV2LAorCQkJCSAgICAgQUJTX01UX1BPU0lUSU9OX1gsIDAsIG1heF94LCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMocG0tPmRldiwKKwkJCQkgICAgIEFCU19NVF9QT1NJVElPTl9ZLCAwLCBtYXhfeSwgMCwgMCk7CisJfQogCiAJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIHBtKTsKIApAQCAtMTU1LDcgKzMwOCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2VyaW9fZHJpdmVyIHBtX2RydiA9IHsKIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAicGVubW91bnRscGMiLAorCQkubmFtZQk9ICJzZXJpby1wZW5tb3VudCIsCiAJfSwKIAkuZGVzY3JpcHRpb24JPSBEUklWRVJfREVTQywKIAkuaWRfdGFibGUJPSBwbV9zZXJpb19pZHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3MzYzI0MTBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vczNjMjQxMF90cy5jCmluZGV4IDhmZWI3ZjMuLjY0Y2U2OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vczNjMjQxMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vczNjMjQxMF90cy5jCkBAIC0zMjgsNyArMzI4LDcgQEAKIAl0cy5zaGlmdCA9IGluZm8tPm92ZXJzYW1wbGluZ19zaGlmdDsKIAl0cy5mZWF0dXJlcyA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEodHMuaXJxX3RjLCBzdHlsdXNfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKHRzLmlycV90Yywgc3R5bHVzX2lycSwgMCwKIAkJCSAgInMzYzI0MTBfdHNfcGVuIiwgdHMuaW5wdXQpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJjYW5ub3QgZ2V0IFRDIGludGVycnVwdFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RzYzIwMDcuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jCmluZGV4IGZhZGMxMTUuLjFmNjc0Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jCkBAIC02Niw3ICs2Niw2IEBACiBzdHJ1Y3QgdHNjMjAwNyB7CiAJc3RydWN0IGlucHV0X2RldgkqaW5wdXQ7CiAJY2hhcgkJCXBoeXNbMzJdOwotCXN0cnVjdCBkZWxheWVkX3dvcmsJd29yazsKIAogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAKQEAgLTc2LDkgKzc1LDExIEBACiAJdW5zaWduZWQgbG9uZwkJcG9sbF9kZWxheTsKIAl1bnNpZ25lZCBsb25nCQlwb2xsX3BlcmlvZDsKIAotCWJvb2wJCQlwZW5kb3duOwogCWludAkJCWlycTsKIAorCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CisJYm9vbAkJCXN0b3BwZWQ7CisKIAlpbnQJCQkoKmdldF9wZW5kb3duX3N0YXRlKSh2b2lkKTsKIAl2b2lkCQkJKCpjbGVhcl9wZW5pcnEpKHZvaWQpOwogfTsKQEAgLTE0MSwyNSArMTQyLDggQEAKIAlyZXR1cm4gcnQ7CiB9CiAKLXN0YXRpYyB2b2lkIHRzYzIwMDdfc2VuZF91cF9ldmVudChzdHJ1Y3QgdHNjMjAwNyAqdHNjKQorc3RhdGljIGJvb2wgdHNjMjAwN19pc19wZW5fZG93bihzdHJ1Y3QgdHNjMjAwNyAqdHMpCiB7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB0c2MtPmlucHV0OwotCi0JZGV2X2RiZygmdHNjLT5jbGllbnQtPmRldiwgIlVQXG4iKTsKLQotCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9UT1VDSCwgMCk7Ci0JaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1BSRVNTVVJFLCAwKTsKLQlpbnB1dF9zeW5jKGlucHV0KTsKLX0KLQotc3RhdGljIHZvaWQgdHNjMjAwN193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdHNjMjAwNyAqdHMgPQotCQljb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLCBzdHJ1Y3QgdHNjMjAwNywgd29yayk7Ci0JYm9vbCBkZWJvdW5jZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgdHNfZXZlbnQgdGM7Ci0JdTMyIHJ0OwotCiAJLyoKIAkgKiBOT1RFOiBXZSBjYW4ndCByZWx5IG9uIHRoZSBwcmVzc3VyZSB0byBkZXRlcm1pbmUgdGhlIHBlbiBkb3duCiAJICogc3RhdGUsIGV2ZW4gdGhvdWdoIHRoaXMgY29udHJvbGxlciBoYXMgYSBwcmVzc3VyZSBzZW5zb3IuCkBAIC0xNzAsOTcgKzE1NCwxMjMgQEAKIAkgKiBUaGUgb25seSBzYWZlIHdheSB0byBjaGVjayBmb3IgdGhlIHBlbiB1cCBjb25kaXRpb24gaXMgaW4gdGhlCiAJICogd29yayBmdW5jdGlvbiBieSByZWFkaW5nIHRoZSBwZW4gc2lnbmFsIHN0YXRlIChpdCdzIGEgR1BJTwogCSAqIGFuZCBJUlEpLiBVbmZvcnR1bmF0ZWx5IHN1Y2ggY2FsbGJhY2sgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUsCi0JICogaW4gdGhhdCBjYXNlIHdlIGhhdmUgcmVseSBvbiB0aGUgcHJlc3N1cmUgYW55d2F5LgorCSAqIGluIHRoYXQgY2FzZSB3ZSBhc3N1bWUgdGhhdCB0aGUgcGVuIGlzIGRvd24gYW5kIGV4cGVjdCBjYWxsZXIKKwkgKiB0byBmYWxsIGJhY2sgb24gdGhlIHByZXNzdXJlIHJlYWRpbmcuCiAJICovCi0JaWYgKHRzLT5nZXRfcGVuZG93bl9zdGF0ZSkgewotCQlpZiAodW5saWtlbHkoIXRzLT5nZXRfcGVuZG93bl9zdGF0ZSgpKSkgewotCQkJdHNjMjAwN19zZW5kX3VwX2V2ZW50KHRzKTsKLQkJCXRzLT5wZW5kb3duID0gZmFsc2U7Ci0JCQlnb3RvIG91dDsKLQkJfQogCi0JCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgInBlbiBpcyBzdGlsbCBkb3duXG4iKTsKLQl9CisJaWYgKCF0cy0+Z2V0X3BlbmRvd25fc3RhdGUpCisJCXJldHVybiB0cnVlOwogCi0JdHNjMjAwN19yZWFkX3ZhbHVlcyh0cywgJnRjKTsKLQotCXJ0ID0gdHNjMjAwN19jYWxjdWxhdGVfcHJlc3N1cmUodHMsICZ0Yyk7Ci0JaWYgKHJ0ID4gdHMtPm1heF9ydCkgewotCQkvKgotCQkgKiBTYW1wbGUgZm91bmQgaW5jb25zaXN0ZW50IGJ5IGRlYm91bmNpbmcgb3IgcHJlc3N1cmUgaXMKLQkJICogYmV5b25kIHRoZSBtYXhpbXVtLiBEb24ndCByZXBvcnQgaXQgdG8gdXNlciBzcGFjZSwKLQkJICogcmVwZWF0IGF0IGxlYXN0IG9uY2UgbW9yZSB0aGUgbWVhc3VyZW1lbnQuCi0JCSAqLwotCQlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJpZ25vcmVkIHByZXNzdXJlICVkXG4iLCBydCk7Ci0JCWRlYm91bmNlZCA9IHRydWU7Ci0JCWdvdG8gb3V0OwotCi0JfQotCi0JaWYgKHJ0KSB7Ci0JCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gdHMtPmlucHV0OwotCi0JCWlmICghdHMtPnBlbmRvd24pIHsKLQkJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgIkRPV05cbiIpOwotCi0JCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDEpOwotCQkJdHMtPnBlbmRvd24gPSB0cnVlOwotCQl9Ci0KLQkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1gsIHRjLngpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfWSwgdGMueSk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19QUkVTU1VSRSwgcnQpOwotCi0JCWlucHV0X3N5bmMoaW5wdXQpOwotCi0JCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgInBvaW50KCU0ZCwlNGQpLCBwcmVzc3VyZSAoJTR1KVxuIiwKLQkJCXRjLngsIHRjLnksIHJ0KTsKLQotCX0gZWxzZSBpZiAoIXRzLT5nZXRfcGVuZG93bl9zdGF0ZSAmJiB0cy0+cGVuZG93bikgewotCQkvKgotCQkgKiBXZSBkb24ndCBoYXZlIGNhbGxiYWNrIHRvIGNoZWNrIHBlbmRvd24gc3RhdGUsIHNvIHdlCi0JCSAqIGhhdmUgdG8gYXNzdW1lIHRoYXQgc2luY2UgcHJlc3N1cmUgcmVwb3J0ZWQgaXMgMCB0aGUKLQkJICogcGVuIHdhcyBsaWZ0ZWQgdXAuCi0JCSAqLwotCQl0c2MyMDA3X3NlbmRfdXBfZXZlbnQodHMpOwotCQl0cy0+cGVuZG93biA9IGZhbHNlOwotCX0KLQotIG91dDoKLQlpZiAodHMtPnBlbmRvd24gfHwgZGVib3VuY2VkKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRzLT53b3JrLAotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXModHMtPnBvbGxfcGVyaW9kKSk7Ci0JZWxzZQotCQllbmFibGVfaXJxKHRzLT5pcnEpOworCXJldHVybiB0cy0+Z2V0X3BlbmRvd25fc3RhdGUoKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHRzYzIwMDdfaXJxKGludCBpcnEsIHZvaWQgKmhhbmRsZSkKK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2MyMDA3X3NvZnRfaXJxKGludCBpcnEsIHZvaWQgKmhhbmRsZSkKIHsKIAlzdHJ1Y3QgdHNjMjAwNyAqdHMgPSBoYW5kbGU7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB0cy0+aW5wdXQ7CisJc3RydWN0IHRzX2V2ZW50IHRjOworCXUzMiBydDsKIAotCWlmICghdHMtPmdldF9wZW5kb3duX3N0YXRlIHx8IGxpa2VseSh0cy0+Z2V0X3BlbmRvd25fc3RhdGUoKSkpIHsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKHRzLT5pcnEpOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRzLT53b3JrLAotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXModHMtPnBvbGxfZGVsYXkpKTsKKwl3aGlsZSAoIXRzLT5zdG9wcGVkICYmIHRzYzIwMDdfaXNfcGVuX2Rvd24odHMpKSB7CisKKwkJLyogcGVuIGlzIGRvd24sIGNvbnRpbnVlIHdpdGggdGhlIG1lYXN1cmVtZW50ICovCisJCXRzYzIwMDdfcmVhZF92YWx1ZXModHMsICZ0Yyk7CisKKwkJcnQgPSB0c2MyMDA3X2NhbGN1bGF0ZV9wcmVzc3VyZSh0cywgJnRjKTsKKworCQlpZiAocnQgPT0gMCAmJiAhdHMtPmdldF9wZW5kb3duX3N0YXRlKSB7CisJCQkvKgorCQkJICogSWYgcHJlc3N1cmUgcmVwb3J0ZWQgaXMgMCBhbmQgd2UgZG9uJ3QgaGF2ZQorCQkJICogY2FsbGJhY2sgdG8gY2hlY2sgcGVuZG93biBzdGF0ZSwgd2UgaGF2ZSB0bworCQkJICogYXNzdW1lIHRoYXQgcGVuIHdhcyBsaWZ0ZWQgdXAuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJ0IDw9IHRzLT5tYXhfcnQpIHsKKwkJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwKKwkJCQkiRE9XTiBwb2ludCglNGQsJTRkKSwgcHJlc3N1cmUgKCU0dSlcbiIsCisJCQkJdGMueCwgdGMueSwgcnQpOworCisJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDEpOworCQkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1gsIHRjLngpOworCQkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1ksIHRjLnkpOworCQkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1BSRVNTVVJFLCBydCk7CisKKwkJCWlucHV0X3N5bmMoaW5wdXQpOworCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogU2FtcGxlIGZvdW5kIGluY29uc2lzdGVudCBieSBkZWJvdW5jaW5nIG9yIHByZXNzdXJlIGlzCisJCQkgKiBiZXlvbmQgdGhlIG1heGltdW0uIERvbid0IHJlcG9ydCBpdCB0byB1c2VyIHNwYWNlLAorCQkJICogcmVwZWF0IGF0IGxlYXN0IG9uY2UgbW9yZSB0aGUgbWVhc3VyZW1lbnQuCisJCQkgKi8KKwkJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgImlnbm9yZWQgcHJlc3N1cmUgJWRcbiIsIHJ0KTsKKwkJfQorCisJCXdhaXRfZXZlbnRfdGltZW91dCh0cy0+d2FpdCwgdHMtPnN0b3BwZWQsCisJCQkJICAgbXNlY3NfdG9famlmZmllcyh0cy0+cG9sbF9wZXJpb2QpKTsKIAl9CiAKKwlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJVUFxuIik7CisKKwlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDApOworCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19QUkVTU1VSRSwgMCk7CisJaW5wdXRfc3luYyhpbnB1dCk7CisKIAlpZiAodHMtPmNsZWFyX3BlbmlycSkKIAkJdHMtPmNsZWFyX3BlbmlycSgpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCB0c2MyMDA3X2ZyZWVfaXJxKHN0cnVjdCB0c2MyMDA3ICp0cykKK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2MyMDA3X2hhcmRfaXJxKGludCBpcnEsIHZvaWQgKmhhbmRsZSkKIHsKLQlmcmVlX2lycSh0cy0+aXJxLCB0cyk7Ci0JaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdHMtPndvcmspKSB7Ci0JCS8qCi0JCSAqIFdvcmsgd2FzIHBlbmRpbmcsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGVuYWJsZQotCQkgKiBJUlEgaGVyZSB0byBiYWxhbmNlIHRoZSBkaXNhYmxlX2lycSgpIGRvbmUgaW4gdGhlCi0JCSAqIGludGVycnVwdCBoYW5kbGVyLgotCQkgKi8KLQkJZW5hYmxlX2lycSh0cy0+aXJxKTsKKwlzdHJ1Y3QgdHNjMjAwNyAqdHMgPSBoYW5kbGU7CisKKwlpZiAoIXRzLT5nZXRfcGVuZG93bl9zdGF0ZSB8fCBsaWtlbHkodHMtPmdldF9wZW5kb3duX3N0YXRlKCkpKQorCQlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworCisJaWYgKHRzLT5jbGVhcl9wZW5pcnEpCisJCXRzLT5jbGVhcl9wZW5pcnEoKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgdHNjMjAwN19zdG9wKHN0cnVjdCB0c2MyMDA3ICp0cykKK3sKKwl0cy0+c3RvcHBlZCA9IHRydWU7CisJbWIoKTsKKwl3YWtlX3VwKCZ0cy0+d2FpdCk7CisKKwlkaXNhYmxlX2lycSh0cy0+aXJxKTsKK30KKworc3RhdGljIGludCB0c2MyMDA3X29wZW4oc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2KQoreworCXN0cnVjdCB0c2MyMDA3ICp0cyA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0X2Rldik7CisJaW50IGVycjsKKworCXRzLT5zdG9wcGVkID0gZmFsc2U7CisJbWIoKTsKKworCWVuYWJsZV9pcnEodHMtPmlycSk7CisKKwkvKiBQcmVwYXJlIGZvciB0b3VjaCByZWFkaW5ncyAtIHBvd2VyIGRvd24gQURDIGFuZCBlbmFibGUgUEVOSVJRICovCisJZXJyID0gdHNjMjAwN194ZmVyKHRzLCBQV1JET1dOKTsKKwlpZiAoZXJyIDwgMCkgeworCQl0c2MyMDA3X3N0b3AodHMpOworCQlyZXR1cm4gZXJyOwogCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0c2MyMDA3X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldikKK3sKKwlzdHJ1Y3QgdHNjMjAwNyAqdHMgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCisJdHNjMjAwN19zdG9wKHRzKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgdHNjMjAwN19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApAQCAtMjkwLDcgKzMwMCw3IEBACiAJdHMtPmNsaWVudCA9IGNsaWVudDsKIAl0cy0+aXJxID0gY2xpZW50LT5pcnE7CiAJdHMtPmlucHV0ID0gaW5wdXRfZGV2OwotCUlOSVRfREVMQVlFRF9XT1JLKCZ0cy0+d29yaywgdHNjMjAwN193b3JrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0cy0+d2FpdCk7CiAKIAl0cy0+bW9kZWwgICAgICAgICAgICAgPSBwZGF0YS0+bW9kZWw7CiAJdHMtPnhfcGxhdGVfb2htcyAgICAgID0gcGRhdGEtPnhfcGxhdGVfb2htczsKQEAgLTMwMCw2ICszMTAsMTIgQEAKIAl0cy0+Z2V0X3BlbmRvd25fc3RhdGUgPSBwZGF0YS0+Z2V0X3BlbmRvd25fc3RhdGU7CiAJdHMtPmNsZWFyX3BlbmlycSAgICAgID0gcGRhdGEtPmNsZWFyX3BlbmlycTsKIAorCWlmIChwZGF0YS0+eF9wbGF0ZV9vaG1zID09IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ4X3BsYXRlX29obXMgaXMgbm90IHNldCB1cCBpbiBwbGF0Zm9ybSBkYXRhIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKwogCXNucHJpbnRmKHRzLT5waHlzLCBzaXplb2YodHMtPnBoeXMpLAogCQkgIiVzL2lucHV0MCIsIGRldl9uYW1lKCZjbGllbnQtPmRldikpOwogCkBAIC0zMDcsNiArMzIzLDExIEBACiAJaW5wdXRfZGV2LT5waHlzID0gdHMtPnBoeXM7CiAJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKIAorCWlucHV0X2Rldi0+b3BlbiA9IHRzYzIwMDdfb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gdHNjMjAwN19jbG9zZTsKKworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgdHMpOworCiAJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9BQlMpOwogCWlucHV0X2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKTsKIApAQCAtMzE4LDE3ICszMzksMTQgQEAKIAlpZiAocGRhdGEtPmluaXRfcGxhdGZvcm1faHcpCiAJCXBkYXRhLT5pbml0X3BsYXRmb3JtX2h3KCk7CiAKLQllcnIgPSByZXF1ZXN0X2lycSh0cy0+aXJxLCB0c2MyMDA3X2lycSwgMCwKLQkJCWNsaWVudC0+ZGV2LmRyaXZlci0+bmFtZSwgdHMpOworCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHRzLT5pcnEsIHRzYzIwMDdfaGFyZF9pcnEsIHRzYzIwMDdfc29mdF9pcnEsCisJCQkJICAgSVJRRl9PTkVTSE9ULCBjbGllbnQtPmRldi5kcml2ZXItPm5hbWUsIHRzKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImlycSAlZCBidXN5P1xuIiwgdHMtPmlycSk7CiAJCWdvdG8gZXJyX2ZyZWVfbWVtOwogCX0KIAotCS8qIFByZXBhcmUgZm9yIHRvdWNoIHJlYWRpbmdzIC0gcG93ZXIgZG93biBBREMgYW5kIGVuYWJsZSBQRU5JUlEgKi8KLQllcnIgPSB0c2MyMDA3X3hmZXIodHMsIFBXUkRPV04pOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycl9mcmVlX2lycTsKKwl0c2MyMDA3X3N0b3AodHMpOwogCiAJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CiAJaWYgKGVycikKQEAgLTMzOSw3ICszNTcsNyBAQAogCXJldHVybiAwOwogCiAgZXJyX2ZyZWVfaXJxOgotCXRzYzIwMDdfZnJlZV9pcnEodHMpOworCWZyZWVfaXJxKHRzLT5pcnEsIHRzKTsKIAlpZiAocGRhdGEtPmV4aXRfcGxhdGZvcm1faHcpCiAJCXBkYXRhLT5leGl0X3BsYXRmb3JtX2h3KCk7CiAgZXJyX2ZyZWVfbWVtOgpAQCAtMzUzLDcgKzM3MSw3IEBACiAJc3RydWN0IHRzYzIwMDcJKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHRzYzIwMDdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JdHNjMjAwN19mcmVlX2lycSh0cyk7CisJZnJlZV9pcnEodHMtPmlycSwgdHMpOwogCiAJaWYgKHBkYXRhLT5leGl0X3BsYXRmb3JtX2h3KQogCQlwZGF0YS0+ZXhpdF9wbGF0Zm9ybV9odygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2M0MC5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2M0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDVlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RzYzQwLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBUU0MtNDAgc2VyaWFsIHRvdWNoc2NyZWVuIGRyaXZlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aAorICogVFNDLTEwIGFuZCAyNS4KKyAqCisgKiBBdXRob3I6IFNlYmFzdGlhbiBBbmRyemVqIFNpZXdpb3IgPGJpZ2Vhc3lAbGludXRyb25peC5kZT4KKyAqIExpY2Vuc2U6IEdQTHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRlNGLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBQQUNLRVRfTEVOR1RIICA1CitzdHJ1Y3QgdHNjX3NlciB7CisJc3RydWN0IGlucHV0X2RldiAqZGV2OworCXN0cnVjdCBzZXJpbyAqc2VyaW87CisJdTMyIGlkeDsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbUEFDS0VUX0xFTkdUSF07CisJY2hhciBwaHlzWzMyXTsKK307CisKK3N0YXRpYyB2b2lkIHRzY19wcm9jZXNzX2RhdGEoc3RydWN0IHRzY19zZXIgKnB0c2MpCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHRzYy0+ZGV2OworCXU4ICpkYXRhID0gcHRzYy0+ZGF0YTsKKwl1MzIgeDsKKwl1MzIgeTsKKworCXggPSAoKGRhdGFbMV0gJiAweDAzKSA8PCA4KSB8IGRhdGFbMl07CisJeSA9ICgoZGF0YVszXSAmIDB4MDMpIDw8IDgpIHwgZGF0YVs0XTsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeCk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCAxKTsKKworCWlucHV0X3N5bmMoZGV2KTsKK30KKworc3RhdGljIGlycXJldHVybl90IHRzY19pbnRlcnJ1cHQoc3RydWN0IHNlcmlvICpzZXJpbywKKwkJdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHRzY19zZXIgKnB0c2MgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHRzYy0+ZGV2OworCisJcHRzYy0+ZGF0YVtwdHNjLT5pZHhdID0gZGF0YTsKKwlzd2l0Y2ggKHB0c2MtPmlkeCsrKSB7CisJY2FzZSAwOgorCQlpZiAodW5saWtlbHkoKGRhdGEgJiAweDNlKSAhPSAweDEwKSkgeworCQkJZGV2X2RiZygmc2VyaW8tPmRldiwKKwkJCQkidW5zeW5jaHJvbml6ZWQgcGFja2V0IHN0YXJ0ICgweCUwMngpXG4iLCBkYXRhKTsKKwkJCXB0c2MtPmlkeCA9IDA7CisJCX0gZWxzZSBpZiAoIShkYXRhICYgMHgwMSkpIHsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIDApOworCQkJaW5wdXRfc3luYyhkZXYpOworCQkJcHRzYy0+aWR4ID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMToKKwljYXNlIDM6CisJCWlmICh1bmxpa2VseShkYXRhICYgMHhmYykpIHsKKwkJCWRldl9kYmcoJnNlcmlvLT5kZXYsCisJCQkJInVuc3luY2hyb25pemVkIGRhdGEgMHglMDJ4IGF0IG9mZnNldCAlZFxuIiwKKwkJCQlkYXRhLCBwdHNjLT5pZHggLSAxKTsKKwkJCXB0c2MtPmlkeCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCXRzY19wcm9jZXNzX2RhdGEocHRzYyk7CisJCXB0c2MtPmlkeCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0c2NfY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHRzY19zZXIgKnB0c2M7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnJvcjsKKworCXB0c2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHNjX3NlciksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghcHRzYyB8fCAhaW5wdXRfZGV2KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlwdHNjLT5zZXJpbyA9IHNlcmlvOworCXB0c2MtPmRldiA9IGlucHV0X2RldjsKKwlzbnByaW50ZihwdHNjLT5waHlzLCBzaXplb2YocHRzYy0+cGh5cyksICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CisKKwlpbnB1dF9kZXYtPm5hbWUgPSAiVFNDLTEwLzI1LzQwIFNlcmlhbCBUb3VjaFNjcmVlbiI7CisJaW5wdXRfZGV2LT5waHlzID0gcHRzYy0+cGh5czsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUlMyMzI7CisJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSBTRVJJT19UU0M0MDsKKwlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSA0MDsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAweDAwMDE7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJnNlcmlvLT5kZXY7CisKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJX19zZXRfYml0KEJUTl9UT1VDSCwgaW5wdXRfZGV2LT5rZXliaXQpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHB0c2MtPmRldiwgQUJTX1gsIDAsIDB4M2ZmLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhwdHNjLT5kZXYsIEFCU19ZLCAwLCAweDNmZiwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocHRzYy0+ZGV2LCBBQlNfUFJFU1NVUkUsIDAsIDAsIDAsIDApOworCisJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIHB0c2MpOworCisJZXJyb3IgPSBzZXJpb19vcGVuKHNlcmlvLCBkcnYpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsMjsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHB0c2MtPmRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWwzOworCisJcmV0dXJuIDA7CisKK2ZhaWwzOgorCXNlcmlvX2Nsb3NlKHNlcmlvKTsKK2ZhaWwyOgorCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKK2ZhaWwxOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUocHRzYyk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCB0c2NfZGlzY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQoreworCXN0cnVjdCB0c2Nfc2VyICpwdHNjID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCisJc2VyaW9fY2xvc2Uoc2VyaW8pOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocHRzYy0+ZGV2KTsKKwlrZnJlZShwdHNjKTsKKworCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBzZXJpb19kZXZpY2VfaWQgdHNjX3NlcmlvX2lkc1tdID0geworCXsKKwkJLnR5cGUgICA9IFNFUklPX1JTMjMyLAorCQkucHJvdG8gID0gU0VSSU9fVFNDNDAsCisJCS5pZCAgICAgPSBTRVJJT19BTlksCisJCS5leHRyYSAgPSBTRVJJT19BTlksCisJfSwKKwl7IDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc2VyaW8sIHRzY19zZXJpb19pZHMpOworCisjZGVmaW5lIERSSVZFUl9ERVNDICAgICJUU0MtMTAvMjUvNDAgc2VyaWFsIHRvdWNoc2NyZWVuIGRyaXZlciIKKworc3RhdGljIHN0cnVjdCBzZXJpb19kcml2ZXIgdHNjX2RydiA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZSAgID0gInRzYzQwIiwKKwl9LAorCS5kZXNjcmlwdGlvbiAgICA9IERSSVZFUl9ERVNDLAorCS5pZF90YWJsZQk9IHRzY19zZXJpb19pZHMsCisJLmludGVycnVwdCAgICAgID0gdHNjX2ludGVycnVwdCwKKwkuY29ubmVjdAk9IHRzY19jb25uZWN0LAorCS5kaXNjb25uZWN0ICAgICA9IHRzY19kaXNjb25uZWN0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHNjX3Nlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmdHNjX2Rydik7Cit9Cittb2R1bGVfaW5pdCh0c2Nfc2VyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHNjX2V4aXQodm9pZCkKK3sKKwlzZXJpb191bnJlZ2lzdGVyX2RyaXZlcigmdHNjX2Rydik7Cit9Cittb2R1bGVfZXhpdCh0c2NfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlNlYmFzdGlhbiBBbmRyemVqIFNpZXdpb3IgPGJpZ2Vhc3lAbGludXRyb25peC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3c5MHA5MTBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdzkwcDkxMF90cy5jCmluZGV4IDdhNDVkNjguLjIxN2FhNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdzkwcDkxMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdzkwcDkxMF90cy5jCkBAIC0yNzksNyArMjc5LDcgQEAKIAogCXc5MHA5MTBfdHMtPmlycV9udW0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChyZXF1ZXN0X2lycSh3OTBwOTEwX3RzLT5pcnFfbnVtLCB3OTBwOTEwX3RzX2ludGVycnVwdCwKLQkJCUlSUUZfRElTQUJMRUQsICJ3OTBwOTEwdHMiLCB3OTBwOTEwX3RzKSkgeworCQkJMCwgInc5MHA5MTB0cyIsIHc5MHA5MTBfdHMpKSB7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBmYWlsNDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dhY29tX3c4MDAxLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dhY29tX3c4MDAxLmMKaW5kZXggOTk0MWQzOS4uMTU2OWEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93YWNvbV93ODAwMS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd2Fjb21fdzgwMDEuYwpAQCAtMzY3LDYgKzM2NywyMCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCB3ODAwMV9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdzgwMDEgKnc4MDAxID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiB3ODAwMV9jb21tYW5kKHc4MDAxLCBXODAwMV9DTURfU1RBUlQsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgdzgwMDFfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB3ODAwMSAqdzgwMDEgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJdzgwMDFfY29tbWFuZCh3ODAwMSwgVzgwMDFfQ01EX1NUT1AsIGZhbHNlKTsKK30KKwogc3RhdGljIGludCB3ODAwMV9zZXR1cChzdHJ1Y3QgdzgwMDEgKnc4MDAxKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHc4MDAxLT5kZXY7CkBAIC00NzYsNyArNDkwLDcgQEAKIAogCXN0cmxjYXQodzgwMDEtPm5hbWUsICIgVG91Y2hzY3JlZW4iLCBzaXplb2YodzgwMDEtPm5hbWUpKTsKIAotCXJldHVybiB3ODAwMV9jb21tYW5kKHc4MDAxLCBXODAwMV9DTURfU1RBUlQsIGZhbHNlKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQ4NywxMiArNTAxLDEyIEBACiB7CiAJc3RydWN0IHc4MDAxICp3ODAwMSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKIAotCWlucHV0X2dldF9kZXZpY2UodzgwMDEtPmRldik7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodzgwMDEtPmRldik7CiAJc2VyaW9fY2xvc2Uoc2VyaW8pOwotCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9wdXRfZGV2aWNlKHc4MDAxLT5kZXYpOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodzgwMDEtPmRldik7CiAJa2ZyZWUodzgwMDEpOworCisJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwogfQogCiAvKgpAQCAtNTM2LDYgKzU1MCwxMSBAQAogCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKIAlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKIAorCWlucHV0X2Rldi0+b3BlbiA9IHc4MDAxX29wZW47CisJaW5wdXRfZGV2LT5jbG9zZSA9IHc4MDAxX2Nsb3NlOworCisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCB3ODAwMSk7CisKIAllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodzgwMDEtPmRldik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvS2NvbmZpZyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwppbmRleCA3ZDdlYWExLi41NDE0MjUzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwpAQCAtMTEyLDQgKzExMiwyMyBAQAogCSAgVG8gdXNlIHgyYXBpYyBtb2RlIGluIHRoZSBDUFUncyB3aGljaCBzdXBwb3J0IHgyQVBJQyBlbmhhbmNlbWVudHMgb3IKIAkgIHRvIHN1cHBvcnQgcGxhdGZvcm1zIHdpdGggQ1BVJ3MgaGF2aW5nID4gOCBiaXQgQVBJQyBJRCwgc2F5IFkuCiAKKyMgT01BUCBJT01NVSBzdXBwb3J0Citjb25maWcgT01BUF9JT01NVQorCWJvb2wgIk9NQVAgSU9NTVUgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUAorCXNlbGVjdCBJT01NVV9BUEkKKworY29uZmlnIE9NQVBfSU9WTU0KKwl0cmlzdGF0ZSAiT01BUCBJTyBWaXJ0dWFsIE1lbW9yeSBNYW5hZ2VyIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBPTUFQX0lPTU1VCisKK2NvbmZpZyBPTUFQX0lPTU1VX0RFQlVHCisgICAgICAgdHJpc3RhdGUgIkV4cG9ydCBPTUFQIElPTU1VL0lPVk1NIGludGVybmFscyBpbiBEZWJ1Z0ZTIgorICAgICAgIGRlcGVuZHMgb24gT01BUF9JT1ZNTSAmJiBERUJVR19GUworICAgICAgIGhlbHAKKyAgICAgICAgIFNlbGVjdCB0aGlzIHRvIHNlZSBleHRlbnNpdmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBPTUFQIElPTU1VL0lPVk1NIGluIGRlYnVnZnMuCisKKyAgICAgICAgIFNheSBOIHVubGVzcyB5b3Uga25vdyB5b3UgbmVlZCB0aGlzLgorCiBlbmRpZiAjIElPTU1VX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUgYi9kcml2ZXJzL2lvbW11L01ha2VmaWxlCmluZGV4IDYzOTQ5OTRhLi4yZjQ0NDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUKQEAgLTQsMyArNCw2IEBACiBvYmotJChDT05GSUdfRE1BUl9UQUJMRSkgKz0gZG1hci5vCiBvYmotJChDT05GSUdfSU5URUxfSU9NTVUpICs9IGlvdmEubyBpbnRlbC1pb21tdS5vCiBvYmotJChDT05GSUdfSVJRX1JFTUFQKSArPSBpbnRyX3JlbWFwcGluZy5vCitvYmotJChDT05GSUdfT01BUF9JT01NVSkgKz0gb21hcC1pb21tdS5vCitvYmotJChDT05GSUdfT01BUF9JT1ZNTSkgKz0gb21hcC1pb3ZtbS5vCitvYmotJChDT05GSUdfT01BUF9JT01NVV9ERUJVRykgKz0gb21hcC1pb21tdS1kZWJ1Zy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYwppbmRleCAwZTQyMjdmLi40ZWUyNzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11LmMKQEAgLTEyODMsNyArMTI4Myw3IEBACiAJCWlmICghcHRlIHx8ICFJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkKIAkJCWNvbnRpbnVlOwogCi0JCWRtYV9vcHNfcmVzZXJ2ZV9hZGRyZXNzZXMoZG1hX2RvbSwgaSA8PCBQQUdFX1NISUZULCAxKTsKKwkJZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhkbWFfZG9tLCBpID4+IFBBR0VfU0hJRlQsIDEpOwogCX0KIAogCXVwZGF0ZV9kb21haW4oJmRtYV9kb20tPmRvbWFpbik7CkBAIC0yNDk1LDcgKzI0OTUsNyBAQAogCiB2b2lkIF9faW5pdCBhbWRfaW9tbXVfaW5pdF9hcGkodm9pZCkKIHsKLQlyZWdpc3Rlcl9pb21tdSgmYW1kX2lvbW11X29wcyk7CisJYnVzX3NldF9pb21tdSgmcGNpX2J1c190eXBlLCAmYW1kX2lvbW11X29wcyk7CiB9CiAKIGludCBfX2luaXQgYW1kX2lvbW11X2luaXRfZG1hX29wcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jCmluZGV4IGJlMTk1M2MuLmMwYzc4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvaW50ZWwtaW9tbXUuYworKysgYi9kcml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM2NDIsNyArMzY0Myw3IEBACiAKIAlpbml0X2lvbW11X3BtX29wcygpOwogCi0JcmVnaXN0ZXJfaW9tbXUoJmludGVsX2lvbW11X29wcyk7CisJYnVzX3NldF9pb21tdSgmcGNpX2J1c190eXBlLCAmaW50ZWxfaW9tbXVfb3BzKTsKIAogCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmcGNpX2J1c190eXBlLCAmZGV2aWNlX25iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9pb21tdS5jCmluZGV4IDZlNmI2YTEuLjJmYjI5NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvaW9tbXUuYworKysgYi9kcml2ZXJzL2lvbW11L2lvbW11LmMKQEAgLTE2LDYgKzE2LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjMsMzIgKzI1LDc4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgogCi1zdGF0aWMgc3RydWN0IGlvbW11X29wcyAqaW9tbXVfb3BzOwotCi12b2lkIHJlZ2lzdGVyX2lvbW11KHN0cnVjdCBpb21tdV9vcHMgKm9wcykKK3N0YXRpYyB2b2lkIGlvbW11X2J1c19pbml0KHN0cnVjdCBidXNfdHlwZSAqYnVzLCBzdHJ1Y3QgaW9tbXVfb3BzICpvcHMpCiB7Ci0JaWYgKGlvbW11X29wcykKLQkJQlVHKCk7Ci0KLQlpb21tdV9vcHMgPSBvcHM7CiB9CiAKLWJvb2wgaW9tbXVfZm91bmQodm9pZCkKKy8qKgorICogYnVzX3NldF9pb21tdSAtIHNldCBpb21tdS1jYWxsYmFja3MgZm9yIHRoZSBidXMKKyAqIEBidXM6IGJ1cy4KKyAqIEBvcHM6IHRoZSBjYWxsYmFja3MgcHJvdmlkZWQgYnkgdGhlIGlvbW11LWRyaXZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFuIGlvbW11IGRyaXZlciB0byBzZXQgdGhlIGlvbW11IG1ldGhvZHMKKyAqIHVzZWQgZm9yIGEgcGFydGljdWxhciBidXMuIERyaXZlcnMgZm9yIGRldmljZXMgb24gdGhhdCBidXMgY2FuIHVzZQorICogdGhlIGlvbW11LWFwaSBhZnRlciB0aGVzZSBvcHMgYXJlIHJlZ2lzdGVyZWQuCisgKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgbmVlZGVkIGJlY2F1c2UgSU9NTVVzIGFyZSB1c3VhbGx5IGRldmljZXMgb24KKyAqIHRoZSBidXMgaXRzZWxmLCBzbyB0aGUgaW9tbXUgZHJpdmVycyBhcmUgbm90IGluaXRpYWxpemVkIHdoZW4gdGhlIGJ1cworICogaXMgc2V0IHVwLiBXaXRoIHRoaXMgZnVuY3Rpb24gdGhlIGlvbW11LWRyaXZlciBjYW4gc2V0IHRoZSBpb21tdS1vcHMKKyAqIGFmdGVyd2FyZHMuCisgKi8KK2ludCBidXNfc2V0X2lvbW11KHN0cnVjdCBidXNfdHlwZSAqYnVzLCBzdHJ1Y3QgaW9tbXVfb3BzICpvcHMpCiB7Ci0JcmV0dXJuIGlvbW11X29wcyAhPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfZm91bmQpOworCWlmIChidXMtPmlvbW11X29wcyAhPSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOwogCi1zdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW5fYWxsb2Modm9pZCkKKwlidXMtPmlvbW11X29wcyA9IG9wczsKKworCS8qIERvIElPTU1VIHNwZWNpZmljIHNldHVwIGZvciB0aGlzIGJ1cy10eXBlICovCisJaW9tbXVfYnVzX2luaXQoYnVzLCBvcHMpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChidXNfc2V0X2lvbW11KTsKKworYm9vbCBpb21tdV9wcmVzZW50KHN0cnVjdCBidXNfdHlwZSAqYnVzKQoreworCXJldHVybiBidXMtPmlvbW11X29wcyAhPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfcHJlc2VudCk7CisKKy8qKgorICogaW9tbXVfc2V0X2ZhdWx0X2hhbmRsZXIoKSAtIHNldCBhIGZhdWx0IGhhbmRsZXIgZm9yIGFuIGlvbW11IGRvbWFpbgorICogQGRvbWFpbjogaW9tbXUgZG9tYWluCisgKiBAaGFuZGxlcjogZmF1bHQgaGFuZGxlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgYnkgSU9NTVUgdXNlcnMgd2hpY2ggd2FudCB0byBiZSBub3RpZmllZAorICogd2hlbmV2ZXIgYW4gSU9NTVUgZmF1bHQgaGFwcGVucy4KKyAqCisgKiBUaGUgZmF1bHQgaGFuZGxlciBpdHNlbGYgc2hvdWxkIHJldHVybiAwIG9uIHN1Y2Nlc3MsIGFuZCBhbiBhcHByb3ByaWF0ZQorICogZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3ZvaWQgaW9tbXVfc2V0X2ZhdWx0X2hhbmRsZXIoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCQlpb21tdV9mYXVsdF9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlCVUdfT04oIWRvbWFpbik7CisKKwlkb21haW4tPmhhbmRsZXIgPSBoYW5kbGVyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfc2V0X2ZhdWx0X2hhbmRsZXIpOworCitzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW5fYWxsb2Moc3RydWN0IGJ1c190eXBlICpidXMpCiB7CiAJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluOwogCWludCByZXQ7CiAKKwlpZiAoYnVzID09IE5VTEwgfHwgYnVzLT5pb21tdV9vcHMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKIAlkb21haW4gPSBrbWFsbG9jKHNpemVvZigqZG9tYWluKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkb21haW4pCiAJCXJldHVybiBOVUxMOwogCi0JcmV0ID0gaW9tbXVfb3BzLT5kb21haW5faW5pdChkb21haW4pOworCWRvbWFpbi0+b3BzID0gYnVzLT5pb21tdV9vcHM7CisKKwlyZXQgPSBkb21haW4tPm9wcy0+ZG9tYWluX2luaXQoZG9tYWluKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9mcmVlOwogCkBAIC02Myw2MiArMTExLDc4IEBACiAKIHZvaWQgaW9tbXVfZG9tYWluX2ZyZWUoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQogewotCWlvbW11X29wcy0+ZG9tYWluX2Rlc3Ryb3koZG9tYWluKTsKKwlpZiAobGlrZWx5KGRvbWFpbi0+b3BzLT5kb21haW5fZGVzdHJveSAhPSBOVUxMKSkKKwkJZG9tYWluLT5vcHMtPmRvbWFpbl9kZXN0cm95KGRvbWFpbik7CisKIAlrZnJlZShkb21haW4pOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfZG9tYWluX2ZyZWUpOwogCiBpbnQgaW9tbXVfYXR0YWNoX2RldmljZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gaW9tbXVfb3BzLT5hdHRhY2hfZGV2KGRvbWFpbiwgZGV2KTsKKwlpZiAodW5saWtlbHkoZG9tYWluLT5vcHMtPmF0dGFjaF9kZXYgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGRvbWFpbi0+b3BzLT5hdHRhY2hfZGV2KGRvbWFpbiwgZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2F0dGFjaF9kZXZpY2UpOwogCiB2b2lkIGlvbW11X2RldGFjaF9kZXZpY2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaW9tbXVfb3BzLT5kZXRhY2hfZGV2KGRvbWFpbiwgZGV2KTsKKwlpZiAodW5saWtlbHkoZG9tYWluLT5vcHMtPmRldGFjaF9kZXYgPT0gTlVMTCkpCisJCXJldHVybjsKKworCWRvbWFpbi0+b3BzLT5kZXRhY2hfZGV2KGRvbWFpbiwgZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2RldGFjaF9kZXZpY2UpOwogCiBwaHlzX2FkZHJfdCBpb21tdV9pb3ZhX3RvX3BoeXMoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW92YSkKIHsKLQlyZXR1cm4gaW9tbXVfb3BzLT5pb3ZhX3RvX3BoeXMoZG9tYWluLCBpb3ZhKTsKKwlpZiAodW5saWtlbHkoZG9tYWluLT5vcHMtPmlvdmFfdG9fcGh5cyA9PSBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZG9tYWluLT5vcHMtPmlvdmFfdG9fcGh5cyhkb21haW4sIGlvdmEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfaW92YV90b19waHlzKTsKIAogaW50IGlvbW11X2RvbWFpbl9oYXNfY2FwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKIAkJCSB1bnNpZ25lZCBsb25nIGNhcCkKIHsKLQlyZXR1cm4gaW9tbXVfb3BzLT5kb21haW5faGFzX2NhcChkb21haW4sIGNhcCk7CisJaWYgKHVubGlrZWx5KGRvbWFpbi0+b3BzLT5kb21haW5faGFzX2NhcCA9PSBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZG9tYWluLT5vcHMtPmRvbWFpbl9oYXNfY2FwKGRvbWFpbiwgY2FwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2RvbWFpbl9oYXNfY2FwKTsKIAogaW50IGlvbW11X21hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92YSwKIAkgICAgICBwaHlzX2FkZHJfdCBwYWRkciwgaW50IGdmcF9vcmRlciwgaW50IHByb3QpCiB7Ci0JdW5zaWduZWQgbG9uZyBpbnZhbGlkX21hc2s7CiAJc2l6ZV90IHNpemU7CiAKLQlzaXplICAgICAgICAgPSAweDEwMDBVTCA8PCBnZnBfb3JkZXI7Ci0JaW52YWxpZF9tYXNrID0gc2l6ZSAtIDE7CisJaWYgKHVubGlrZWx5KGRvbWFpbi0+b3BzLT5tYXAgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PREVWOwogCi0JQlVHX09OKChpb3ZhIHwgcGFkZHIpICYgaW52YWxpZF9tYXNrKTsKKwlzaXplICAgICAgICAgPSBQQUdFX1NJWkUgPDwgZ2ZwX29yZGVyOwogCi0JcmV0dXJuIGlvbW11X29wcy0+bWFwKGRvbWFpbiwgaW92YSwgcGFkZHIsIGdmcF9vcmRlciwgcHJvdCk7CisJQlVHX09OKCFJU19BTElHTkVEKGlvdmEgfCBwYWRkciwgc2l6ZSkpOworCisJcmV0dXJuIGRvbWFpbi0+b3BzLT5tYXAoZG9tYWluLCBpb3ZhLCBwYWRkciwgZ2ZwX29yZGVyLCBwcm90KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X21hcCk7CiAKIGludCBpb21tdV91bm1hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92YSwgaW50IGdmcF9vcmRlcikKIHsKLQl1bnNpZ25lZCBsb25nIGludmFsaWRfbWFzazsKIAlzaXplX3Qgc2l6ZTsKIAotCXNpemUgICAgICAgICA9IDB4MTAwMFVMIDw8IGdmcF9vcmRlcjsKLQlpbnZhbGlkX21hc2sgPSBzaXplIC0gMTsKKwlpZiAodW5saWtlbHkoZG9tYWluLT5vcHMtPnVubWFwID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCUJVR19PTihpb3ZhICYgaW52YWxpZF9tYXNrKTsKKwlzaXplICAgICAgICAgPSBQQUdFX1NJWkUgPDwgZ2ZwX29yZGVyOwogCi0JcmV0dXJuIGlvbW11X29wcy0+dW5tYXAoZG9tYWluLCBpb3ZhLCBnZnBfb3JkZXIpOworCUJVR19PTighSVNfQUxJR05FRChpb3ZhLCBzaXplKSk7CisKKwlyZXR1cm4gZG9tYWluLT5vcHMtPnVubWFwKGRvbWFpbiwgaW92YSwgZ2ZwX29yZGVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X3VubWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvbXNtX2lvbW11LmMgYi9kcml2ZXJzL2lvbW11L21zbV9pb21tdS5jCmluZGV4IDFhNTg0ZTAuLjU4NjVkZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvbXNtX2lvbW11LmMKKysrIGIvZHJpdmVycy9pb21tdS9tc21faW9tbXUuYwpAQCAtNTQzLDYgKzU0MywxMyBAQAogCX0KIAogCXJldCA9IF9fZmx1c2hfaW90bGIoZG9tYWluKTsKKworCS8qCisJICogdGhlIElPTU1VIEFQSSByZXF1aXJlcyB1cyB0byByZXR1cm4gdGhlIG9yZGVyIG9mIHRoZSB1bm1hcHBlZAorCSAqIHBhZ2UgKG9uIHN1Y2Nlc3MpLgorCSAqLworCWlmICghcmV0KQorCQlyZXQgPSBvcmRlcjsKIGZhaWw6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2lvbW11X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwpAQCAtNzIxLDcgKzcyOCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBtc21faW9tbXVfaW5pdCh2b2lkKQogewogCXNldHVwX2lvbW11X3RleF9jbGFzc2VzKCk7Ci0JcmVnaXN0ZXJfaW9tbXUoJm1zbV9pb21tdV9vcHMpOworCWJ1c19zZXRfaW9tbXUoJnBsYXRmb3JtX2J1c190eXBlLCAmbXNtX2lvbW11X29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvb21hcC1pb21tdS1kZWJ1Zy5jIGIvZHJpdmVycy9pb21tdS9vbWFwLWlvbW11LWRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4ZGE1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW9tbXUvb21hcC1pb21tdS1kZWJ1Zy5jCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogb21hcCBpb21tdTogZGVidWdmcyBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFdyaXR0ZW4gYnkgSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKKyNpbmNsdWRlIDxwbGF0L2lvbW11Lmg+CisjaW5jbHVkZSA8cGxhdC9pb3ZtbS5oPgorCisjaW5jbHVkZSA8cGxhdC9pb3BndGFibGUuaD4KKworI2RlZmluZSBNQVhDT0xVTU4gMTAwIC8qIGZvciBzaG9ydCBtZXNzYWdlcyAqLworCitzdGF0aWMgREVGSU5FX01VVEVYKGlvbW11X2RlYnVnX2xvY2spOworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqaW9tbXVfZGVidWdfcm9vdDsKKworc3RhdGljIHNzaXplX3QgZGVidWdfcmVhZF92ZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdTMyIHZlciA9IG9tYXBfaW9tbXVfYXJjaF92ZXJzaW9uKCk7CisJY2hhciBidWZbTUFYQ09MVU1OXSwgKnAgPSBidWY7CisKKwlwICs9IHNwcmludGYocCwgIkgvVyB2ZXJzaW9uOiAlZC4lZFxuIiwgKHZlciA+PiA0KSAmIDB4ZiAsIHZlciAmIDB4Zik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcCAtIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfcmVncyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpwLCAqYnVmOworCXNzaXplX3QgYnl0ZXM7CisKKwlidWYgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcCA9IGJ1ZjsKKworCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOworCisJYnl0ZXMgPSBvbWFwX2lvbW11X2R1bXBfY3R4KG9iaiwgcCwgY291bnQpOworCWJ5dGVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgYnl0ZXMpOworCisJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwlrZnJlZShidWYpOworCisJcmV0dXJuIGJ5dGVzOworfQorCitzdGF0aWMgc3NpemVfdCBkZWJ1Z19yZWFkX3RsYihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKnAsICpidWY7CisJc3NpemVfdCBieXRlcywgcmVzdDsKKworCWJ1ZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwID0gYnVmOworCisJbXV0ZXhfbG9jaygmaW9tbXVfZGVidWdfbG9jayk7CisKKwlwICs9IHNwcmludGYocCwgIiU4cyAlOHNcbiIsICJjYW06IiwgInJhbToiKTsKKwlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlyZXN0ID0gY291bnQgLSAocCAtIGJ1Zik7CisJcCArPSBvbWFwX2R1bXBfdGxiX2VudHJpZXMob2JqLCBwLCByZXN0KTsKKworCWJ5dGVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcCAtIGJ1Zik7CisKKwltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3dyaXRlX3BhZ2V0YWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlvdGxiX2VudHJ5IGU7CisJc3RydWN0IGNyX3JlZ3MgY3I7CisJaW50IGVycjsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmW01BWENPTFVNTl0sICpwID0gYnVmOworCisJY291bnQgPSBtaW4oY291bnQsIHNpemVvZihidWYpKTsKKworCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOworCWlmIChjb3B5X2Zyb21fdXNlcihwLCB1c2VyYnVmLCBjb3VudCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3NjYW5mKHAsICIleCAleCIsICZjci5jYW0sICZjci5yYW0pOworCWlmICghY3IuY2FtIHx8ICFjci5yYW0pIHsKKwkJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb21hcF9pb3RsYl9jcl90b19lKCZjciwgJmUpOworCWVyciA9IG9tYXBfaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KG9iaiwgJmUpOworCWlmIChlcnIpCisJCWRldl9lcnIob2JqLT5kZXYsICIlczogZmFpbCB0byBzdG9yZSBjclxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgZHVtcF9pb3B0YWJsZV9lbnRyeV9vbmUobHYsIGRhLCB2YWwpCQkJXAorCSh7CQkJCQkJCVwKKwkJaW50IF9fZXJyID0gMDsJCQkJCVwKKwkJc3NpemVfdCBieXRlczsJCQkJCVwKKwkJY29uc3QgaW50IG1heGNvbCA9IDIyOwkJCQlcCisJCWNvbnN0IGNoYXIgKnN0ciA9ICIlZDogJTA4eCAlMDh4XG4iOwkJXAorCQlieXRlcyA9IHNucHJpbnRmKHAsIG1heGNvbCwgc3RyLCBsdiwgZGEsIHZhbCk7CVwKKwkJcCArPSBieXRlczsJCQkJCVwKKwkJbGVuIC09IGJ5dGVzOwkJCQkJXAorCQlpZiAobGVuIDwgbWF4Y29sKQkJCQlcCisJCQlfX2VyciA9IC1FTk9NRU07CQkJXAorCQlfX2VycjsJCQkJCQlcCisJfSkKKworc3RhdGljIHNzaXplX3QgZHVtcF9pb3B0YWJsZShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBjaGFyICpidWYsIHNzaXplX3QgbGVuKQoreworCWludCBpOworCXUzMiAqaW9wZ2Q7CisJY2hhciAqcCA9IGJ1ZjsKKworCXNwaW5fbG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCisJaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfSU9QR0Q7IGkrKywgaW9wZ2QrKykgeworCQlpbnQgaiwgZXJyOworCQl1MzIgKmlvcHRlOworCQl1MzIgZGE7CisKKwkJaWYgKCEqaW9wZ2QpCisJCQljb250aW51ZTsKKworCQlpZiAoISgqaW9wZ2QgJiBJT1BHRF9UQUJMRSkpIHsKKwkJCWRhID0gaSA8PCBJT1BHRF9TSElGVDsKKworCQkJZXJyID0gZHVtcF9pb3B0YWJsZV9lbnRyeV9vbmUoMSwgZGEsICppb3BnZCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQkJY29udGludWU7CisJCX0KKworCQlpb3B0ZSA9IGlvcHRlX29mZnNldChpb3BnZCwgMCk7CisKKwkJZm9yIChqID0gMDsgaiA8IFBUUlNfUEVSX0lPUFRFOyBqKyssIGlvcHRlKyspIHsKKwkJCWlmICghKmlvcHRlKQorCQkJCWNvbnRpbnVlOworCisJCQlkYSA9IChpIDw8IElPUEdEX1NISUZUKSArIChqIDw8IElPUFRFX1NISUZUKTsKKwkJCWVyciA9IGR1bXBfaW9wdGFibGVfZW50cnlfb25lKDIsIGRhLCAqaW9wZ2QpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlzcGluX3VubG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfcGFnZXRhYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpwLCAqYnVmOworCXNpemVfdCBieXRlczsKKworCWJ1ZiA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwID0gYnVmOworCisJcCArPSBzcHJpbnRmKHAsICJMOiAlOHMgJThzXG4iLCAiZGE6IiwgInBhOiIpOworCXAgKz0gc3ByaW50ZihwLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJbXV0ZXhfbG9jaygmaW9tbXVfZGVidWdfbG9jayk7CisKKwlieXRlcyA9IFBBR0VfU0laRSAtIChwIC0gYnVmKTsKKwlwICs9IGR1bXBfaW9wdGFibGUob2JqLCBwLCBieXRlcyk7CisKKwlieXRlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHAgLSBidWYpOworCisJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKKworCXJldHVybiBieXRlczsKK30KKworc3RhdGljIHNzaXplX3QgZGVidWdfcmVhZF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKnAsICpidWY7CisJc3RydWN0IGlvdm1fc3RydWN0ICp0bXA7CisJaW50IHVuaW5pdGlhbGl6ZWRfdmFyKGkpOworCXNzaXplX3QgYnl0ZXM7CisKKwlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcCA9IGJ1ZjsKKworCXAgKz0gc3ByaW50ZihwLCAiJS0zcyAlLThzICUtOHMgJTZzICU4c1xuIiwKKwkJICAgICAiTm8iLCAic3RhcnQiLCAiZW5kIiwgInNpemUiLCAiZmxhZ3MiKTsKKwlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJbXV0ZXhfbG9jaygmaW9tbXVfZGVidWdfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJm9iai0+bW1hcCwgbGlzdCkgeworCQlzaXplX3QgbGVuOworCQljb25zdCBjaGFyICpzdHIgPSAiJTNkICUwOHgtJTA4eCAlNnggJTh4XG4iOworCQljb25zdCBpbnQgbWF4Y29sID0gMzk7CisKKwkJbGVuID0gdG1wLT5kYV9lbmQgLSB0bXAtPmRhX3N0YXJ0OworCQlwICs9IHNucHJpbnRmKHAsIG1heGNvbCwgc3RyLAorCQkJICAgICAgaSwgdG1wLT5kYV9zdGFydCwgdG1wLT5kYV9lbmQsIGxlbiwgdG1wLT5mbGFncyk7CisKKwkJaWYgKFBBR0VfU0laRSAtIChwIC0gYnVmKSA8IG1heGNvbCkKKwkJCWJyZWFrOworCQlpKys7CisJfQorCisJYnl0ZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwIC0gYnVmKTsKKworCW11dGV4X3VubG9jaygmaW9tbXVfZGVidWdfbG9jayk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1Zik7CisKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfbWVtKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBvbWFwX2lvbW11ICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciAqcCwgKmJ1ZjsKKwlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFyZWE7CisJc3NpemVfdCBieXRlczsKKworCWNvdW50ID0gbWluX3Qoc3NpemVfdCwgY291bnQsIFBBR0VfU0laRSk7CisKKwlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcCA9IGJ1ZjsKKworCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOworCisJYXJlYSA9IG9tYXBfZmluZF9pb3ZtX2FyZWEob2JqLCAodTMyKXBwb3MpOworCWlmIChJU19FUlIoYXJlYSkpIHsKKwkJYnl0ZXMgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW1lbWNweShwLCBhcmVhLT52YSwgY291bnQpOworCXAgKz0gY291bnQ7CisKKwlieXRlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHAgLSBidWYpOworZXJyX291dDoKKwltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOworCisJcmV0dXJuIGJ5dGVzOworfQorCitzdGF0aWMgc3NpemVfdCBkZWJ1Z193cml0ZV9tZW0oc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBvbWFwX2lvbW11ICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOworCWNoYXIgKnAsICpidWY7CisKKwljb3VudCA9IG1pbl90KHNpemVfdCwgY291bnQsIFBBR0VfU0laRSk7CisKKwlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcCA9IGJ1ZjsKKworCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOworCisJaWYgKGNvcHlfZnJvbV91c2VyKHAsIHVzZXJidWYsIGNvdW50KSkgeworCQljb3VudCA9ICAtRUZBVUxUOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJYXJlYSA9IG9tYXBfZmluZF9pb3ZtX2FyZWEob2JqLCAodTMyKXBwb3MpOworCWlmIChJU19FUlIoYXJlYSkpIHsKKwkJY291bnQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW1lbWNweShhcmVhLT52YSwgcCwgY291bnQpOworZXJyX291dDoKKwltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGRlYnVnX29wZW5fZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCisjZGVmaW5lIERFQlVHX0ZPUFMobmFtZSkJCQkJCQlcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfIyNuYW1lIyNfZm9wcyA9IHsJXAorCQkub3BlbiA9IGRlYnVnX29wZW5fZ2VuZXJpYywJCQkJXAorCQkucmVhZCA9IGRlYnVnX3JlYWRfIyNuYW1lLAkJCQlcCisJCS53cml0ZSA9IGRlYnVnX3dyaXRlXyMjbmFtZSwJCQkJXAorCQkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywJCQkJXAorCX07CisKKyNkZWZpbmUgREVCVUdfRk9QU19STyhuYW1lKQkJCQkJCVwKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z18jI25hbWUjI19mb3BzID0gewlcCisJCS5vcGVuID0gZGVidWdfb3Blbl9nZW5lcmljLAkJCQlcCisJCS5yZWFkID0gZGVidWdfcmVhZF8jI25hbWUsCQkJCVwKKwkJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKKwl9OworCitERUJVR19GT1BTX1JPKHZlcik7CitERUJVR19GT1BTX1JPKHJlZ3MpOworREVCVUdfRk9QU19STyh0bGIpOworREVCVUdfRk9QUyhwYWdldGFibGUpOworREVCVUdfRk9QU19STyhtbWFwKTsKK0RFQlVHX0ZPUFMobWVtKTsKKworI2RlZmluZSBfX0RFQlVHX0FERF9GSUxFKGF0dHIsIG1vZGUpCQkJCQlcCisJewkJCQkJCQkJXAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50OwkJCQkJXAorCQlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZSgjYXR0ciwgbW9kZSwgcGFyZW50LAkJXAorCQkJCQkgICBvYmosICZkZWJ1Z18jI2F0dHIjI19mb3BzKTsJXAorCQlpZiAoIWRlbnQpCQkJCQkJXAorCQkJcmV0dXJuIC1FTk9NRU07CQkJCQlcCisJfQorCisjZGVmaW5lIERFQlVHX0FERF9GSUxFKG5hbWUpIF9fREVCVUdfQUREX0ZJTEUobmFtZSwgNjAwKQorI2RlZmluZSBERUJVR19BRERfRklMRV9STyhuYW1lKSBfX0RFQlVHX0FERF9GSUxFKG5hbWUsIDQwMCkKKworc3RhdGljIGludCBpb21tdV9kZWJ1Z19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBvbWFwX2lvbW11ICpvYmogPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZGVudHJ5ICpkLCAqcGFyZW50OworCisJaWYgKCFvYmogfHwgIW9iai0+ZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIob2JqLT5uYW1lLCBpb21tdV9kZWJ1Z19yb290KTsKKwlpZiAoIWQpCisJCXJldHVybiAtRU5PTUVNOworCXBhcmVudCA9IGQ7CisKKwlkID0gZGVidWdmc19jcmVhdGVfdTgoIm5yX3RsYl9lbnRyaWVzIiwgNDAwLCBwYXJlbnQsCisJCQkgICAgICAodTggKikmb2JqLT5ucl90bGJfZW50cmllcyk7CisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCURFQlVHX0FERF9GSUxFX1JPKHZlcik7CisJREVCVUdfQUREX0ZJTEVfUk8ocmVncyk7CisJREVCVUdfQUREX0ZJTEVfUk8odGxiKTsKKwlERUJVR19BRERfRklMRShwYWdldGFibGUpOworCURFQlVHX0FERF9GSUxFX1JPKG1tYXApOworCURFQlVHX0FERF9GSUxFKG1lbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW9tbXVfZGVidWdfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZW50cnkgKmQ7CisJaW50IGVycjsKKworCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImlvbW11IiwgTlVMTCk7CisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpb21tdV9kZWJ1Z19yb290ID0gZDsKKworCWVyciA9IG9tYXBfZm9yZWFjaF9pb21tdV9kZXZpY2UoZCwgaW9tbXVfZGVidWdfcmVnaXN0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDsKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaW9tbXVfZGVidWdfcm9vdCk7CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KGlvbW11X2RlYnVnX2luaXQpCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpb21tdV9kZWJ1Z2ZzX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaW9tbXVfZGVidWdfcm9vdCk7Cit9Cittb2R1bGVfZXhpdChpb21tdV9kZWJ1Z2ZzX2V4aXQpCisKK01PRFVMRV9ERVNDUklQVElPTigib21hcCBpb21tdTogZGVidWdmcyBpbnRlcmZhY2UiKTsKK01PRFVMRV9BVVRIT1IoIkhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvb21hcC1pb21tdS5jIGIvZHJpdmVycy9pb21tdS9vbWFwLWlvbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzMmIyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW9tbXUvb21hcC1pb21tdS5jCkBAIC0wLDAgKzEsMTI0NSBAQAorLyoKKyAqIG9tYXAgaW9tbXU6IHRsYiBhbmQgcGFnZXRhYmxlIHByaW1pdGl2ZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFdyaXR0ZW4gYnkgSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPiwKKyAqCQlQYXVsIE11bmR0IGFuZCBUb3NoaWhpcm8gS29iYXlhc2hpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2luY2x1ZGUgPHBsYXQvaW9tbXUuaD4KKworI2luY2x1ZGUgPHBsYXQvaW9wZ3RhYmxlLmg+CisKKyNkZWZpbmUgZm9yX2VhY2hfaW90bGJfY3Iob2JqLCBuLCBfX2ksIGNyKQkJCQlcCisJZm9yIChfX2kgPSAwOwkJCQkJCQlcCisJICAgICAoX19pIDwgKG4pKSAmJiAoY3IgPSBfX2lvdGxiX3JlYWRfY3IoKG9iaiksIF9faSksIHRydWUpOwlcCisJICAgICBfX2krKykKKworLyoqCisgKiBzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4gLSBvbWFwIGlvbW11IGRvbWFpbgorICogQHBndGFibGU6CXRoZSBwYWdlIHRhYmxlCisgKiBAaW9tbXVfZGV2OglhbiBvbWFwIGlvbW11IGRldmljZSBhdHRhY2hlZCB0byB0aGlzIGRvbWFpbi4gb25seSBhIHNpbmdsZQorICoJCWlvbW11IGRldmljZSBjYW4gYmUgYXR0YWNoZWQgZm9yIG5vdy4KKyAqIEBsb2NrOglkb21haW4gbG9jaywgc2hvdWxkIGJlIHRha2VuIHdoZW4gYXR0YWNoaW5nL2RldGFjaGluZworICovCitzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4geworCXUzMiAqcGd0YWJsZTsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqaW9tbXVfZGV2OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qIGFjY29tbW9kYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb21hcDEgYW5kIG9tYXAyLzMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW9tbXVfZnVuY3Rpb25zICphcmNoX2lvbW11OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2lvbW11X2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW9wdGVfY2FjaGVwOworCisvKioKKyAqIG9tYXBfaW5zdGFsbF9pb21tdV9hcmNoIC0gSW5zdGFsbCBhcmNodGVjdXJlIHNwZWNpZmljIGlvbW11IGZ1bmN0aW9ucworICogQG9wczoJYSBwb2ludGVyIHRvIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpb21tdSBmdW5jdGlvbnMKKyAqCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCBraW5kIG9mIGlvbW11IGFsZ29yaXRobSh0bGIsIHBhZ2V0YWJsZSkgYW1vbmcKKyAqIG9tYXAgc2VyaWVzLiBUaGlzIGludGVyZmFjZSBpbnN0YWxscyBzdWNoIGFuIGlvbW11IGFsZ29yaWdobS4KKyAqKi8KK2ludCBvbWFwX2luc3RhbGxfaW9tbXVfYXJjaChjb25zdCBzdHJ1Y3QgaW9tbXVfZnVuY3Rpb25zICpvcHMpCit7CisJaWYgKGFyY2hfaW9tbXUpCisJCXJldHVybiAtRUJVU1k7CisKKwlhcmNoX2lvbW11ID0gb3BzOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF9pbnN0YWxsX2lvbW11X2FyY2gpOworCisvKioKKyAqIG9tYXBfdW5pbnN0YWxsX2lvbW11X2FyY2ggLSBVbmluc3RhbGwgYXJjaHRlY3VyZSBzcGVjaWZpYyBpb21tdSBmdW5jdGlvbnMKKyAqIEBvcHM6CWEgcG9pbnRlciB0byBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW9tbXUgZnVuY3Rpb25zCisgKgorICogVGhpcyBpbnRlcmZhY2UgdW5pbnN0YWxscyB0aGUgaW9tbXUgYWxnb3JpZ2htIGluc3RhbGxlZCBwcmV2aW91c2x5LgorICoqLwordm9pZCBvbWFwX3VuaW5zdGFsbF9pb21tdV9hcmNoKGNvbnN0IHN0cnVjdCBpb21tdV9mdW5jdGlvbnMgKm9wcykKK3sKKwlpZiAoYXJjaF9pb21tdSAhPSBvcHMpCisJCXByX2VycigiJXM6IG5vdCB5b3VyIGFyY2hcbiIsIF9fZnVuY19fKTsKKworCWFyY2hfaW9tbXUgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF91bmluc3RhbGxfaW9tbXVfYXJjaCk7CisKKy8qKgorICogb21hcF9pb21tdV9zYXZlX2N0eCAtIFNhdmUgcmVnaXN0ZXJzIGZvciBwbSBvZmYtbW9kZSBzdXBwb3J0CisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqKi8KK3ZvaWQgb21hcF9pb21tdV9zYXZlX2N0eChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKQoreworCWFyY2hfaW9tbXUtPnNhdmVfY3R4KG9iaik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2lvbW11X3NhdmVfY3R4KTsKKworLyoqCisgKiBvbWFwX2lvbW11X3Jlc3RvcmVfY3R4IC0gUmVzdG9yZSByZWdpc3RlcnMgZm9yIHBtIG9mZi1tb2RlIHN1cHBvcnQKKyAqIEBvYmo6CXRhcmdldCBpb21tdQorICoqLwordm9pZCBvbWFwX2lvbW11X3Jlc3RvcmVfY3R4KHN0cnVjdCBvbWFwX2lvbW11ICpvYmopCit7CisJYXJjaF9pb21tdS0+cmVzdG9yZV9jdHgob2JqKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9tbXVfcmVzdG9yZV9jdHgpOworCisvKioKKyAqIG9tYXBfaW9tbXVfYXJjaF92ZXJzaW9uIC0gUmV0dXJuIHJ1bm5pbmcgaW9tbXUgYXJjaCB2ZXJzaW9uCisgKiovCit1MzIgb21hcF9pb21tdV9hcmNoX3ZlcnNpb24odm9pZCkKK3sKKwlyZXR1cm4gYXJjaF9pb21tdS0+dmVyc2lvbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9tbXVfYXJjaF92ZXJzaW9uKTsKKworc3RhdGljIGludCBpb21tdV9lbmFibGUoc3RydWN0IG9tYXBfaW9tbXUgKm9iaikKK3sKKwlpbnQgZXJyOworCisJaWYgKCFvYmopCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFhcmNoX2lvbW11KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNsa19lbmFibGUob2JqLT5jbGspOworCisJZXJyID0gYXJjaF9pb21tdS0+ZW5hYmxlKG9iaik7CisKKwljbGtfZGlzYWJsZShvYmotPmNsayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfZGlzYWJsZShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKQoreworCWlmICghb2JqKQorCQlyZXR1cm47CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWFyY2hfaW9tbXUtPmRpc2FibGUob2JqKTsKKworCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKK30KKworLyoKKyAqCVRMQiBvcGVyYXRpb25zCisgKi8KK3ZvaWQgb21hcF9pb3RsYl9jcl90b19lKHN0cnVjdCBjcl9yZWdzICpjciwgc3RydWN0IGlvdGxiX2VudHJ5ICplKQoreworCUJVR19PTighY3IgfHwgIWUpOworCisJYXJjaF9pb21tdS0+Y3JfdG9fZShjciwgZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2lvdGxiX2NyX3RvX2UpOworCitzdGF0aWMgaW5saW5lIGludCBpb3RsYl9jcl92YWxpZChzdHJ1Y3QgY3JfcmVncyAqY3IpCit7CisJaWYgKCFjcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYXJjaF9pb21tdS0+Y3JfdmFsaWQoY3IpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcl9yZWdzICppb3RsYl9hbGxvY19jcihzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCQkgICAgIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGFyY2hfaW9tbXUtPmFsbG9jX2NyKG9iaiwgZSk7Cit9CisKK3N0YXRpYyB1MzIgaW90bGJfY3JfdG9fdmlydChzdHJ1Y3QgY3JfcmVncyAqY3IpCit7CisJcmV0dXJuIGFyY2hfaW9tbXUtPmNyX3RvX3ZpcnQoY3IpOworfQorCitzdGF0aWMgdTMyIGdldF9pb3B0ZV9hdHRyKHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKK3sKKwlyZXR1cm4gYXJjaF9pb21tdS0+Z2V0X3B0ZV9hdHRyKGUpOworfQorCitzdGF0aWMgdTMyIGlvbW11X3JlcG9ydF9mYXVsdChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgKmRhKQoreworCXJldHVybiBhcmNoX2lvbW11LT5mYXVsdF9pc3Iob2JqLCBkYSk7Cit9CisKK3N0YXRpYyB2b2lkIGlvdGxiX2xvY2tfZ2V0KHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9sb2NrICpsKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBpb21tdV9yZWFkX3JlZyhvYmosIE1NVV9MT0NLKTsKKworCWwtPmJhc2UgPSBNTVVfTE9DS19CQVNFKHZhbCk7CisJbC0+dmljdCA9IE1NVV9MT0NLX1ZJQ1QodmFsKTsKKworfQorCitzdGF0aWMgdm9pZCBpb3RsYl9sb2NrX3NldChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfbG9jayAqbCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKGwtPmJhc2UgPDwgTU1VX0xPQ0tfQkFTRV9TSElGVCk7CisJdmFsIHw9IChsLT52aWN0IDw8IE1NVV9MT0NLX1ZJQ1RfU0hJRlQpOworCisJaW9tbXVfd3JpdGVfcmVnKG9iaiwgdmFsLCBNTVVfTE9DSyk7Cit9CisKK3N0YXRpYyB2b2lkIGlvdGxiX3JlYWRfY3Ioc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyKQoreworCWFyY2hfaW9tbXUtPnRsYl9yZWFkX2NyKG9iaiwgY3IpOworfQorCitzdGF0aWMgdm9pZCBpb3RsYl9sb2FkX2NyKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcikKK3sKKwlhcmNoX2lvbW11LT50bGJfbG9hZF9jcihvYmosIGNyKTsKKworCWlvbW11X3dyaXRlX3JlZyhvYmosIDEsIE1NVV9GTFVTSF9FTlRSWSk7CisJaW9tbXVfd3JpdGVfcmVnKG9iaiwgMSwgTU1VX0xEX1RMQik7Cit9CisKKy8qKgorICogaW90bGJfZHVtcF9jciAtIER1bXAgYW4gaW9tbXUgdGxiIGVudHJ5IGludG8gYnVmCisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqIEBjcjoJCWNvbnRlbnRzIG9mIGNhbSBhbmQgcmFtIHJlZ2lzdGVyCisgKiBAYnVmOglvdXRwdXQgYnVmZmVyCisgKiovCitzdGF0aWMgaW5saW5lIHNzaXplX3QgaW90bGJfZHVtcF9jcihzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IsCisJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlCVUdfT04oIWNyIHx8ICFidWYpOworCisJcmV0dXJuIGFyY2hfaW9tbXUtPmR1bXBfY3Iob2JqLCBjciwgYnVmKTsKK30KKworLyogb25seSB1c2VkIGluIGlvdGxiIGl0ZXJhdGlvbiBmb3ItbG9vcCAqLworc3RhdGljIHN0cnVjdCBjcl9yZWdzIF9faW90bGJfcmVhZF9jcihzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBpbnQgbikKK3sKKwlzdHJ1Y3QgY3JfcmVncyBjcjsKKwlzdHJ1Y3QgaW90bGJfbG9jayBsOworCisJaW90bGJfbG9ja19nZXQob2JqLCAmbCk7CisJbC52aWN0ID0gbjsKKwlpb3RsYl9sb2NrX3NldChvYmosICZsKTsKKwlpb3RsYl9yZWFkX2NyKG9iaiwgJmNyKTsKKworCXJldHVybiBjcjsKK30KKworLyoqCisgKiBsb2FkX2lvdGxiX2VudHJ5IC0gU2V0IGFuIGlvbW11IHRsYiBlbnRyeQorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAZToJCWFuIGlvbW11IHRsYiBlbnRyeSBpbmZvCisgKiovCisjaWZkZWYgUFJFRkVUQ0hfSU9UTEIKK3N0YXRpYyBpbnQgbG9hZF9pb3RsYl9lbnRyeShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGlvdGxiX2xvY2sgbDsKKwlzdHJ1Y3QgY3JfcmVncyAqY3I7CisKKwlpZiAoIW9iaiB8fCAhb2JqLT5ucl90bGJfZW50cmllcyB8fCAhZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWlvdGxiX2xvY2tfZ2V0KG9iaiwgJmwpOworCWlmIChsLmJhc2UgPT0gb2JqLT5ucl90bGJfZW50cmllcykgeworCQlkZXZfd2FybihvYmotPmRldiwgIiVzOiBwcmVzZXJ2ZSBlbnRyaWVzIGZ1bGxcbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFlLT5wcnN2ZCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGNyX3JlZ3MgdG1wOworCisJCWZvcl9lYWNoX2lvdGxiX2NyKG9iaiwgb2JqLT5ucl90bGJfZW50cmllcywgaSwgdG1wKQorCQkJaWYgKCFpb3RsYl9jcl92YWxpZCgmdG1wKSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBvYmotPm5yX3RsYl9lbnRyaWVzKSB7CisJCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IGZ1bGw6IG5vIGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisJCQllcnIgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlvdGxiX2xvY2tfZ2V0KG9iaiwgJmwpOworCX0gZWxzZSB7CisJCWwudmljdCA9IGwuYmFzZTsKKwkJaW90bGJfbG9ja19zZXQob2JqLCAmbCk7CisJfQorCisJY3IgPSBpb3RsYl9hbGxvY19jcihvYmosIGUpOworCWlmIChJU19FUlIoY3IpKSB7CisJCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKKwkJcmV0dXJuIFBUUl9FUlIoY3IpOworCX0KKworCWlvdGxiX2xvYWRfY3Iob2JqLCBjcik7CisJa2ZyZWUoY3IpOworCisJaWYgKGUtPnByc3ZkKQorCQlsLmJhc2UrKzsKKwkvKiBpbmNyZW1lbnQgdmljdGltIGZvciBuZXh0IHRsYiBsb2FkICovCisJaWYgKCsrbC52aWN0ID09IG9iai0+bnJfdGxiX2VudHJpZXMpCisJCWwudmljdCA9IGwuYmFzZTsKKwlpb3RsYl9sb2NrX3NldChvYmosICZsKTsKK291dDoKKwljbGtfZGlzYWJsZShvYmotPmNsayk7CisJcmV0dXJuIGVycjsKK30KKworI2Vsc2UgLyogIVBSRUZFVENIX0lPVExCICovCisKK3N0YXRpYyBpbnQgbG9hZF9pb3RsYl9lbnRyeShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAhUFJFRkVUQ0hfSU9UTEIgKi8KKworc3RhdGljIGludCBwcmVmZXRjaF9pb3RsYl9lbnRyeShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCit7CisJcmV0dXJuIGxvYWRfaW90bGJfZW50cnkob2JqLCBlKTsKK30KKworLyoqCisgKiBmbHVzaF9pb3RsYl9wYWdlIC0gQ2xlYXIgYW4gaW9tbXUgdGxiIGVudHJ5CisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBDbGVhciBhbiBpb21tdSB0bGIgZW50cnkgd2hpY2ggaW5jbHVkZXMgJ2RhJyBhZGRyZXNzLgorICoqLworc3RhdGljIHZvaWQgZmx1c2hfaW90bGJfcGFnZShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEpCit7CisJaW50IGk7CisJc3RydWN0IGNyX3JlZ3MgY3I7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWZvcl9lYWNoX2lvdGxiX2NyKG9iaiwgb2JqLT5ucl90bGJfZW50cmllcywgaSwgY3IpIHsKKwkJdTMyIHN0YXJ0OworCQlzaXplX3QgYnl0ZXM7CisKKwkJaWYgKCFpb3RsYl9jcl92YWxpZCgmY3IpKQorCQkJY29udGludWU7CisKKwkJc3RhcnQgPSBpb3RsYl9jcl90b192aXJ0KCZjcik7CisJCWJ5dGVzID0gaW9wZ3N6X3RvX2J5dGVzKGNyLmNhbSAmIDMpOworCisJCWlmICgoc3RhcnQgPD0gZGEpICYmIChkYSA8IHN0YXJ0ICsgYnl0ZXMpKSB7CisJCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICUwOHg8PSUwOHgoJXgpXG4iLAorCQkJCV9fZnVuY19fLCBzdGFydCwgZGEsIGJ5dGVzKTsKKwkJCWlvdGxiX2xvYWRfY3Iob2JqLCAmY3IpOworCQkJaW9tbXVfd3JpdGVfcmVnKG9iaiwgMSwgTU1VX0ZMVVNIX0VOVFJZKTsKKwkJfQorCX0KKwljbGtfZGlzYWJsZShvYmotPmNsayk7CisKKwlpZiAoaSA9PSBvYmotPm5yX3RsYl9lbnRyaWVzKQorCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IG5vIHBhZ2UgZm9yICUwOHhcbiIsIF9fZnVuY19fLCBkYSk7Cit9CisKKy8qKgorICogZmx1c2hfaW90bGJfYWxsIC0gQ2xlYXIgYWxsIGlvbW11IHRsYiBlbnRyaWVzCisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2lvdGxiX2FsbChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKQoreworCXN0cnVjdCBpb3RsYl9sb2NrIGw7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWwuYmFzZSA9IDA7CisJbC52aWN0ID0gMDsKKwlpb3RsYl9sb2NrX3NldChvYmosICZsKTsKKworCWlvbW11X3dyaXRlX3JlZyhvYmosIDEsIE1NVV9HRkxVU0gpOworCisJY2xrX2Rpc2FibGUob2JqLT5jbGspOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9JT01NVV9ERUJVRykgfHwgZGVmaW5lZChDT05GSUdfT01BUF9JT01NVV9ERUJVR19NT0RVTEUpCisKK3NzaXplX3Qgb21hcF9pb21tdV9kdW1wX2N0eChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBjaGFyICpidWYsIHNzaXplX3QgYnl0ZXMpCit7CisJaWYgKCFvYmogfHwgIWJ1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWJ5dGVzID0gYXJjaF9pb21tdS0+ZHVtcF9jdHgob2JqLCBidWYsIGJ5dGVzKTsKKworCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKKworCXJldHVybiBieXRlczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9tbXVfZHVtcF9jdHgpOworCitzdGF0aWMgaW50CitfX2R1bXBfdGxiX2VudHJpZXMoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNycywgaW50IG51bSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaW90bGJfbG9jayBzYXZlZDsKKwlzdHJ1Y3QgY3JfcmVncyB0bXA7CisJc3RydWN0IGNyX3JlZ3MgKnAgPSBjcnM7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKwlpb3RsYl9sb2NrX2dldChvYmosICZzYXZlZCk7CisKKwlmb3JfZWFjaF9pb3RsYl9jcihvYmosIG51bSwgaSwgdG1wKSB7CisJCWlmICghaW90bGJfY3JfdmFsaWQoJnRtcCkpCisJCQljb250aW51ZTsKKwkJKnArKyA9IHRtcDsKKwl9CisKKwlpb3RsYl9sb2NrX3NldChvYmosICZzYXZlZCk7CisJY2xrX2Rpc2FibGUob2JqLT5jbGspOworCisJcmV0dXJuICBwIC0gY3JzOworfQorCisvKioKKyAqIG9tYXBfZHVtcF90bGJfZW50cmllcyAtIGR1bXAgY3IgYXJyYXlzIHRvIGdpdmVuIGJ1ZmZlcgorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAYnVmOglvdXRwdXQgYnVmZmVyCisgKiovCitzaXplX3Qgb21hcF9kdW1wX3RsYl9lbnRyaWVzKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIGNoYXIgKmJ1Ziwgc3NpemVfdCBieXRlcykKK3sKKwlpbnQgaSwgbnVtOworCXN0cnVjdCBjcl9yZWdzICpjcjsKKwljaGFyICpwID0gYnVmOworCisJbnVtID0gYnl0ZXMgLyBzaXplb2YoKmNyKTsKKwludW0gPSBtaW4ob2JqLT5ucl90bGJfZW50cmllcywgbnVtKTsKKworCWNyID0ga2NhbGxvYyhudW0sIHNpemVvZigqY3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNyKQorCQlyZXR1cm4gMDsKKworCW51bSA9IF9fZHVtcF90bGJfZW50cmllcyhvYmosIGNyLCBudW0pOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJcCArPSBpb3RsYl9kdW1wX2NyKG9iaiwgY3IgKyBpLCBwKTsKKwlrZnJlZShjcik7CisKKwlyZXR1cm4gcCAtIGJ1ZjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZHVtcF90bGJfZW50cmllcyk7CisKK2ludCBvbWFwX2ZvcmVhY2hfaW9tbXVfZGV2aWNlKHZvaWQgKmRhdGEsIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpCit7CisJcmV0dXJuIGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoJm9tYXBfaW9tbXVfZHJpdmVyLmRyaXZlciwKKwkJCQkgICAgICBOVUxMLCBkYXRhLCBmbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2ZvcmVhY2hfaW9tbXVfZGV2aWNlKTsKKworI2VuZGlmIC8qIENPTkZJR19PTUFQX0lPTU1VX0RFQlVHX01PRFVMRSAqLworCisvKgorICoJSC9XIHBhZ2V0YWJsZSBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2lvcGdkX3JhbmdlKHUzMiAqZmlyc3QsIHUzMiAqbGFzdCkKK3sKKwkvKiBGSVhNRTogTDIgY2FjaGUgc2hvdWxkIGJlIHRha2VuIGNhcmUgb2YgaWYgaXQgZXhpc3RzICovCisJZG8geworCQlhc20oIm1jcglwMTUsIDAsICUwLCBjNywgYzEwLCAxIEAgZmx1c2hfcGdkIgorCQkgICAgOiA6ICJyIiAoZmlyc3QpKTsKKwkJZmlyc3QgKz0gTDFfQ0FDSEVfQllURVMgLyBzaXplb2YoKmZpcnN0KTsKKwl9IHdoaWxlIChmaXJzdCA8PSBsYXN0KTsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfaW9wdGVfcmFuZ2UodTMyICpmaXJzdCwgdTMyICpsYXN0KQoreworCS8qIEZJWE1FOiBMMiBjYWNoZSBzaG91bGQgYmUgdGFrZW4gY2FyZSBvZiBpZiBpdCBleGlzdHMgKi8KKwlkbyB7CisJCWFzbSgibWNyCXAxNSwgMCwgJTAsIGM3LCBjMTAsIDEgQCBmbHVzaF9wdGUiCisJCSAgICA6IDogInIiIChmaXJzdCkpOworCQlmaXJzdCArPSBMMV9DQUNIRV9CWVRFUyAvIHNpemVvZigqZmlyc3QpOworCX0gd2hpbGUgKGZpcnN0IDw9IGxhc3QpOworfQorCitzdGF0aWMgdm9pZCBpb3B0ZV9mcmVlKHUzMiAqaW9wdGUpCit7CisJLyogTm90ZTogZnJlZWQgaW9wdGUncyBtdXN0IGJlIGNsZWFuIHJlYWR5IGZvciByZS11c2UgKi8KKwlrbWVtX2NhY2hlX2ZyZWUoaW9wdGVfY2FjaGVwLCBpb3B0ZSk7Cit9CisKK3N0YXRpYyB1MzIgKmlvcHRlX2FsbG9jKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiAqaW9wZ2QsIHUzMiBkYSkKK3sKKwl1MzIgKmlvcHRlOworCisJLyogYSB0YWJsZSBoYXMgYWxyZWFkeSBleGlzdGVkICovCisJaWYgKCppb3BnZCkKKwkJZ290byBwdGVfcmVhZHk7CisKKwkvKgorCSAqIGRvIHRoZSBhbGxvY2F0aW9uIG91dHNpZGUgdGhlIHBhZ2UgdGFibGUgbG9jaworCSAqLworCXNwaW5fdW5sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7CisJaW9wdGUgPSBrbWVtX2NhY2hlX3phbGxvYyhpb3B0ZV9jYWNoZXAsIEdGUF9LRVJORUwpOworCXNwaW5fbG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCisJaWYgKCEqaW9wZ2QpIHsKKwkJaWYgKCFpb3B0ZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJCSppb3BnZCA9IHZpcnRfdG9fcGh5cyhpb3B0ZSkgfCBJT1BHRF9UQUJMRTsKKwkJZmx1c2hfaW9wZ2RfcmFuZ2UoaW9wZ2QsIGlvcGdkKTsKKworCQlkZXZfdmRiZyhvYmotPmRldiwgIiVzOiBhIG5ldyBwdGU6JXBcbiIsIF9fZnVuY19fLCBpb3B0ZSk7CisJfSBlbHNlIHsKKwkJLyogV2UgcmFjZWQsIGZyZWUgdGhlIHJlZHVuaW92YW50IHRhYmxlICovCisJCWlvcHRlX2ZyZWUoaW9wdGUpOworCX0KKworcHRlX3JlYWR5OgorCWlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSk7CisKKwlkZXZfdmRiZyhvYmotPmRldiwKKwkJICIlczogZGE6JTA4eCBwZ2Q6JXAgKnBnZDolMDh4IHB0ZTolcCAqcHRlOiUwOHhcbiIsCisJCSBfX2Z1bmNfXywgZGEsIGlvcGdkLCAqaW9wZ2QsIGlvcHRlLCAqaW9wdGUpOworCisJcmV0dXJuIGlvcHRlOworfQorCitzdGF0aWMgaW50IGlvcGdkX2FsbG9jX3NlY3Rpb24oc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgcGEsIHUzMiBwcm90KQoreworCXUzMiAqaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCBkYSk7CisKKwlpZiAoKGRhIHwgcGEpICYgfklPU0VDVElPTl9NQVNLKSB7CisJCWRldl9lcnIob2JqLT5kZXYsICIlczogJTA4eDolMDh4IHNob3VsZCBhbGlnbmVkIG9uICUwOGx4XG4iLAorCQkJX19mdW5jX18sIGRhLCBwYSwgSU9TRUNUSU9OX1NJWkUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqaW9wZ2QgPSAocGEgJiBJT1NFQ1RJT05fTUFTSykgfCBwcm90IHwgSU9QR0RfU0VDVElPTjsKKwlmbHVzaF9pb3BnZF9yYW5nZShpb3BnZCwgaW9wZ2QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvcGdkX2FsbG9jX3N1cGVyKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCB1MzIgcHJvdCkKK3sKKwl1MzIgKmlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOworCWludCBpOworCisJaWYgKChkYSB8IHBhKSAmIH5JT1NVUEVSX01BU0spIHsKKwkJZGV2X2VycihvYmotPmRldiwgIiVzOiAlMDh4OiUwOHggc2hvdWxkIGFsaWduZWQgb24gJTA4bHhcbiIsCisJCQlfX2Z1bmNfXywgZGEsIHBhLCBJT1NVUEVSX1NJWkUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJKihpb3BnZCArIGkpID0gKHBhICYgSU9TVVBFUl9NQVNLKSB8IHByb3QgfCBJT1BHRF9TVVBFUjsKKwlmbHVzaF9pb3BnZF9yYW5nZShpb3BnZCwgaW9wZ2QgKyAxNSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9wdGVfYWxsb2NfcGFnZShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEsIHUzMiBwYSwgdTMyIHByb3QpCit7CisJdTMyICppb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKKwl1MzIgKmlvcHRlID0gaW9wdGVfYWxsb2Mob2JqLCBpb3BnZCwgZGEpOworCisJaWYgKElTX0VSUihpb3B0ZSkpCisJCXJldHVybiBQVFJfRVJSKGlvcHRlKTsKKworCSppb3B0ZSA9IChwYSAmIElPUEFHRV9NQVNLKSB8IHByb3QgfCBJT1BURV9TTUFMTDsKKwlmbHVzaF9pb3B0ZV9yYW5nZShpb3B0ZSwgaW9wdGUpOworCisJZGV2X3ZkYmcob2JqLT5kZXYsICIlczogZGE6JTA4eCBwYTolMDh4IHB0ZTolcCAqcHRlOiUwOHhcbiIsCisJCSBfX2Z1bmNfXywgZGEsIHBhLCBpb3B0ZSwgKmlvcHRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvcHRlX2FsbG9jX2xhcmdlKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCB1MzIgcHJvdCkKK3sKKwl1MzIgKmlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOworCXUzMiAqaW9wdGUgPSBpb3B0ZV9hbGxvYyhvYmosIGlvcGdkLCBkYSk7CisJaW50IGk7CisKKwlpZiAoKGRhIHwgcGEpICYgfklPTEFSR0VfTUFTSykgeworCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6ICUwOHg6JTA4eCBzaG91bGQgYWxpZ25lZCBvbiAlMDhseFxuIiwKKwkJCV9fZnVuY19fLCBkYSwgcGEsIElPTEFSR0VfU0laRSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChJU19FUlIoaW9wdGUpKQorCQlyZXR1cm4gUFRSX0VSUihpb3B0ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJKihpb3B0ZSArIGkpID0gKHBhICYgSU9MQVJHRV9NQVNLKSB8IHByb3QgfCBJT1BURV9MQVJHRTsKKwlmbHVzaF9pb3B0ZV9yYW5nZShpb3B0ZSwgaW9wdGUgKyAxNSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lvcGd0YWJsZV9zdG9yZV9lbnRyeV9jb3JlKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKK3sKKwlpbnQgKCpmbikoc3RydWN0IG9tYXBfaW9tbXUgKiwgdTMyLCB1MzIsIHUzMik7CisJdTMyIHByb3Q7CisJaW50IGVycjsKKworCWlmICghb2JqIHx8ICFlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZS0+cGdzeikgeworCWNhc2UgTU1VX0NBTV9QR1NaXzE2TToKKwkJZm4gPSBpb3BnZF9hbGxvY19zdXBlcjsKKwkJYnJlYWs7CisJY2FzZSBNTVVfQ0FNX1BHU1pfMU06CisJCWZuID0gaW9wZ2RfYWxsb2Nfc2VjdGlvbjsKKwkJYnJlYWs7CisJY2FzZSBNTVVfQ0FNX1BHU1pfNjRLOgorCQlmbiA9IGlvcHRlX2FsbG9jX2xhcmdlOworCQlicmVhazsKKwljYXNlIE1NVV9DQU1fUEdTWl80SzoKKwkJZm4gPSBpb3B0ZV9hbGxvY19wYWdlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmbiA9IE5VTEw7CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwlwcm90ID0gZ2V0X2lvcHRlX2F0dHIoZSk7CisKKwlzcGluX2xvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKKwllcnIgPSBmbihvYmosIGUtPmRhLCBlLT5wYSwgcHJvdCk7CisJc3Bpbl91bmxvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogb21hcF9pb3BndGFibGVfc3RvcmVfZW50cnkgLSBNYWtlIGFuIGlvbW11IHB0ZSBlbnRyeQorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAZToJCWFuIGlvbW11IHRsYiBlbnRyeSBpbmZvCisgKiovCitpbnQgb21hcF9pb3BndGFibGVfc3RvcmVfZW50cnkoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGlvdGxiX2VudHJ5ICplKQoreworCWludCBlcnI7CisKKwlmbHVzaF9pb3RsYl9wYWdlKG9iaiwgZS0+ZGEpOworCWVyciA9IGlvcGd0YWJsZV9zdG9yZV9lbnRyeV9jb3JlKG9iaiwgZSk7CisJaWYgKCFlcnIpCisJCXByZWZldGNoX2lvdGxiX2VudHJ5KG9iaiwgZSk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KTsKKworLyoqCisgKiBpb3BndGFibGVfbG9va3VwX2VudHJ5IC0gTG9va3VwIGFuIGlvbW11IHB0ZSBlbnRyeQorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCisgKiBAcHBnZDoJaW9tbXUgcGdkIGVudHJ5IHBvaW50ZXIgdG8gYmUgcmV0dXJuZWQKKyAqIEBwcHRlOglpb21tdSBwdGUgZW50cnkgcG9pbnRlciB0byBiZSByZXR1cm5lZAorICoqLworc3RhdGljIHZvaWQKK2lvcGd0YWJsZV9sb29rdXBfZW50cnkoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgKipwcGdkLCB1MzIgKipwcHRlKQoreworCXUzMiAqaW9wZ2QsICppb3B0ZSA9IE5VTEw7CisKKwlpb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKKwlpZiAoISppb3BnZCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW9wZ2RfaXNfdGFibGUoKmlvcGdkKSkKKwkJaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIGRhKTsKK291dDoKKwkqcHBnZCA9IGlvcGdkOworCSpwcHRlID0gaW9wdGU7Cit9CisKK3N0YXRpYyBzaXplX3QgaW9wZ3RhYmxlX2NsZWFyX2VudHJ5X2NvcmUoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhKQoreworCXNpemVfdCBieXRlczsKKwl1MzIgKmlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOworCWludCBuZW50ID0gMTsKKworCWlmICghKmlvcGdkKQorCQlyZXR1cm4gMDsKKworCWlmIChpb3BnZF9pc190YWJsZSgqaW9wZ2QpKSB7CisJCWludCBpOworCQl1MzIgKmlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSk7CisKKwkJYnl0ZXMgPSBJT1BURV9TSVpFOworCQlpZiAoKmlvcHRlICYgSU9QVEVfTEFSR0UpIHsKKwkJCW5lbnQgKj0gMTY7CisJCQkvKiByZXdpbmQgdG8gdGhlIDFzdCBlbnRyeSAqLworCQkJaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIChkYSAmIElPTEFSR0VfTUFTSykpOworCQl9CisJCWJ5dGVzICo9IG5lbnQ7CisJCW1lbXNldChpb3B0ZSwgMCwgbmVudCAqIHNpemVvZigqaW9wdGUpKTsKKwkJZmx1c2hfaW9wdGVfcmFuZ2UoaW9wdGUsIGlvcHRlICsgKG5lbnQgLSAxKSAqIHNpemVvZigqaW9wdGUpKTsKKworCQkvKgorCQkgKiBkbyB0YWJsZSB3YWxrIHRvIGNoZWNrIGlmIHRoaXMgdGFibGUgaXMgbmVjZXNzYXJ5IG9yIG5vdAorCQkgKi8KKwkJaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIDApOworCQlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfSU9QVEU7IGkrKykKKwkJCWlmIChpb3B0ZVtpXSkKKwkJCQlnb3RvIG91dDsKKworCQlpb3B0ZV9mcmVlKGlvcHRlKTsKKwkJbmVudCA9IDE7IC8qIGZvciB0aGUgbmV4dCBMMSBlbnRyeSAqLworCX0gZWxzZSB7CisJCWJ5dGVzID0gSU9QR0RfU0laRTsKKwkJaWYgKCgqaW9wZ2QgJiBJT1BHRF9TVVBFUikgPT0gSU9QR0RfU1VQRVIpIHsKKwkJCW5lbnQgKj0gMTY7CisJCQkvKiByZXdpbmQgdG8gdGhlIDFzdCBlbnRyeSAqLworCQkJaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCAoZGEgJiBJT1NVUEVSX01BU0spKTsKKwkJfQorCQlieXRlcyAqPSBuZW50OworCX0KKwltZW1zZXQoaW9wZ2QsIDAsIG5lbnQgKiBzaXplb2YoKmlvcGdkKSk7CisJZmx1c2hfaW9wZ2RfcmFuZ2UoaW9wZ2QsIGlvcGdkICsgKG5lbnQgLSAxKSAqIHNpemVvZigqaW9wZ2QpKTsKK291dDoKKwlyZXR1cm4gYnl0ZXM7Cit9CisKKy8qKgorICogaW9wZ3RhYmxlX2NsZWFyX2VudHJ5IC0gUmVtb3ZlIGFuIGlvbW11IHB0ZSBlbnRyeQorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCisgKiovCitzdGF0aWMgc2l6ZV90IGlvcGd0YWJsZV9jbGVhcl9lbnRyeShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEpCit7CisJc2l6ZV90IGJ5dGVzOworCisJc3Bpbl9sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7CisKKwlieXRlcyA9IGlvcGd0YWJsZV9jbGVhcl9lbnRyeV9jb3JlKG9iaiwgZGEpOworCWZsdXNoX2lvdGxiX3BhZ2Uob2JqLCBkYSk7CisKKwlzcGluX3VubG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCisJcmV0dXJuIGJ5dGVzOworfQorCitzdGF0aWMgdm9pZCBpb3BndGFibGVfY2xlYXJfZW50cnlfYWxsKHN0cnVjdCBvbWFwX2lvbW11ICpvYmopCit7CisJaW50IGk7CisKKwlzcGluX2xvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9JT1BHRDsgaSsrKSB7CisJCXUzMiBkYTsKKwkJdTMyICppb3BnZDsKKworCQlkYSA9IGkgPDwgSU9QR0RfU0hJRlQ7CisJCWlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOworCisJCWlmICghKmlvcGdkKQorCQkJY29udGludWU7CisKKwkJaWYgKGlvcGdkX2lzX3RhYmxlKCppb3BnZCkpCisJCQlpb3B0ZV9mcmVlKGlvcHRlX29mZnNldChpb3BnZCwgMCkpOworCisJCSppb3BnZCA9IDA7CisJCWZsdXNoX2lvcGdkX3JhbmdlKGlvcGdkLCBpb3BnZCk7CisJfQorCisJZmx1c2hfaW90bGJfYWxsKG9iaik7CisKKwlzcGluX3VubG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworfQorCisvKgorICoJRGV2aWNlIElPTU1VIGdlbmVyaWMgb3BlcmF0aW9ucworICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW9tbXVfZmF1bHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXUzMiBkYSwgZXJyczsKKwl1MzIgKmlvcGdkLCAqaW9wdGU7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9iaiA9IGRhdGE7CisJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluID0gb2JqLT5kb21haW47CisKKwlpZiAoIW9iai0+cmVmY291bnQpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWNsa19lbmFibGUob2JqLT5jbGspOworCWVycnMgPSBpb21tdV9yZXBvcnRfZmF1bHQob2JqLCAmZGEpOworCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKKwlpZiAoZXJycyA9PSAwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkvKiBGYXVsdCBjYWxsYmFjayBvciBUTEIvUFRFIER5bmFtaWMgbG9hZGluZyAqLworCWlmICghcmVwb3J0X2lvbW11X2ZhdWx0KGRvbWFpbiwgb2JqLT5kZXYsIGRhLCAwKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaW9tbXVfZGlzYWJsZShvYmopOworCisJaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCBkYSk7CisKKwlpZiAoIWlvcGdkX2lzX3RhYmxlKCppb3BnZCkpIHsKKwkJZGV2X2VycihvYmotPmRldiwgIiVzOiBlcnJzOjB4JTA4eCBkYToweCUwOHggcGdkOjB4JXAgIgorCQkJIipwZ2Q6cHglMDh4XG4iLCBvYmotPm5hbWUsIGVycnMsIGRhLCBpb3BnZCwgKmlvcGdkKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSk7CisKKwlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6IGVycnM6MHglMDh4IGRhOjB4JTA4eCBwZ2Q6MHglcCAqcGdkOjB4JTA4eCAiCisJCSJwdGU6MHglcCAqcHRlOjB4JTA4eFxuIiwgb2JqLT5uYW1lLCBlcnJzLCBkYSwgaW9wZ2QsICppb3BnZCwKKwkJaW9wdGUsICppb3B0ZSk7CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgZGV2aWNlX21hdGNoX2J5X2FsaWFzKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gdG9faW9tbXUoZGV2KTsKKwljb25zdCBjaGFyICpuYW1lID0gZGF0YTsKKworCXByX2RlYnVnKCIlczogJXMgJXNcbiIsIF9fZnVuY19fLCBvYmotPm5hbWUsIG5hbWUpOworCisJcmV0dXJuIHN0cmNtcChvYmotPm5hbWUsIG5hbWUpID09IDA7Cit9CisKKy8qKgorICogb21hcF9maW5kX2lvbW11X2RldmljZSgpIC0gZmluZCBhbiBvbWFwIGlvbW11IGRldmljZSBieSBuYW1lCisgKiBAbmFtZToJbmFtZSBvZiB0aGUgaW9tbXUgZGV2aWNlCisgKgorICogVGhlIGdlbmVyaWMgaW9tbXUgQVBJIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gcHJvdmlkZSB0aGUgZGV2aWNlCisgKiBoZSB3aXNoZXMgdG8gYXR0YWNoIHRvIGEgY2VydGFpbiBpb21tdSBkb21haW4uCisgKgorICogRHJpdmVycyBnZW5lcmFsbHkgc2hvdWxkIG5vdCBib3RoZXIgd2l0aCB0aGlzIGFzIGl0IHNob3VsZCBqdXN0CisgKiBiZSB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBETUEtQVBJIHVzaW5nIGRldl9hcmNoZGF0YS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGFzIGFuIGludGVyaW0gc29sdXRpb24gdW50aWwgdGhlIGxhdHRlcgorICogbWF0ZXJpYWxpemVzLCBhbmQgb21hcDNpc3AgaXMgZnVsbHkgbWlncmF0ZWQgdG8gdGhlIERNQS1BUEkuCisgKi8KK3N0cnVjdCBkZXZpY2UgKm9tYXBfZmluZF9pb21tdV9kZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gZHJpdmVyX2ZpbmRfZGV2aWNlKCZvbWFwX2lvbW11X2RyaXZlci5kcml2ZXIsIE5VTEwsCisJCQkJKHZvaWQgKiluYW1lLAorCQkJCWRldmljZV9tYXRjaF9ieV9hbGlhcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2ZpbmRfaW9tbXVfZGV2aWNlKTsKKworLyoqCisgKiBvbWFwX2lvbW11X2F0dGFjaCgpIC0gYXR0YWNoIGlvbW11IGRldmljZSB0byBhbiBpb21tdSBkb21haW4KKyAqIEBkZXY6CXRhcmdldCBvbWFwIGlvbW11IGRldmljZQorICogQGlvcGdkOglwYWdlIHRhYmxlCisgKiovCitzdGF0aWMgc3RydWN0IG9tYXBfaW9tbXUgKm9tYXBfaW9tbXVfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyICppb3BnZCkKK3sKKwlpbnQgZXJyID0gLUVOT01FTTsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gdG9faW9tbXUoZGV2KTsKKworCXNwaW5fbG9jaygmb2JqLT5pb21tdV9sb2NrKTsKKworCS8qIGFuIGlvbW11IGRldmljZSBjYW4gb25seSBiZSBhdHRhY2hlZCBvbmNlICovCisJaWYgKCsrb2JqLT5yZWZjb3VudCA+IDEpIHsKKwkJZGV2X2VycihkZXYsICIlczogYWxyZWFkeSBhdHRhY2hlZCFcbiIsIG9iai0+bmFtZSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBlcnJfZW5hYmxlOworCX0KKworCW9iai0+aW9wZ2QgPSBpb3BnZDsKKwllcnIgPSBpb21tdV9lbmFibGUob2JqKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9lbmFibGU7CisJZmx1c2hfaW90bGJfYWxsKG9iaik7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KG9iai0+b3duZXIpKQorCQlnb3RvIGVycl9tb2R1bGU7CisKKwlzcGluX3VubG9jaygmb2JqLT5pb21tdV9sb2NrKTsKKworCWRldl9kYmcob2JqLT5kZXYsICIlczogJXNcbiIsIF9fZnVuY19fLCBvYmotPm5hbWUpOworCXJldHVybiBvYmo7CisKK2Vycl9tb2R1bGU6CisJaWYgKG9iai0+cmVmY291bnQgPT0gMSkKKwkJaW9tbXVfZGlzYWJsZShvYmopOworZXJyX2VuYWJsZToKKwlvYmotPnJlZmNvdW50LS07CisJc3Bpbl91bmxvY2soJm9iai0+aW9tbXVfbG9jayk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKiBvbWFwX2lvbW11X2RldGFjaCAtIHJlbGVhc2UgaW9tbXUgZGV2aWNlCisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqKi8KK3N0YXRpYyB2b2lkIG9tYXBfaW9tbXVfZGV0YWNoKHN0cnVjdCBvbWFwX2lvbW11ICpvYmopCit7CisJaWYgKCFvYmogfHwgSVNfRVJSKG9iaikpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmb2JqLT5pb21tdV9sb2NrKTsKKworCWlmICgtLW9iai0+cmVmY291bnQgPT0gMCkKKwkJaW9tbXVfZGlzYWJsZShvYmopOworCisJbW9kdWxlX3B1dChvYmotPm93bmVyKTsKKworCW9iai0+aW9wZ2QgPSBOVUxMOworCisJc3Bpbl91bmxvY2soJm9iai0+aW9tbXVfbG9jayk7CisKKwlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICVzXG4iLCBfX2Z1bmNfXywgb2JqLT5uYW1lKTsKK30KKworLyoKKyAqCU9NQVAgRGV2aWNlIE1NVShJT01NVSkgZGV0ZWN0aW9uCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IG9tYXBfaW9tbXVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlpbnQgaXJxOworCXN0cnVjdCBvbWFwX2lvbW11ICpvYmo7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGlvbW11X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9iaiA9IGt6YWxsb2Moc2l6ZW9mKCpvYmopICsgTU1VX1JFR19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvYmotPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgcGRhdGEtPmNsa19uYW1lKTsKKwlpZiAoSVNfRVJSKG9iai0+Y2xrKSkKKwkJZ290byBlcnJfY2xrOworCisJb2JqLT5ucl90bGJfZW50cmllcyA9IHBkYXRhLT5ucl90bGJfZW50cmllczsKKwlvYmotPm5hbWUgPSBwZGF0YS0+bmFtZTsKKwlvYmotPmRldiA9ICZwZGV2LT5kZXY7CisJb2JqLT5jdHggPSAodm9pZCAqKW9iaiArIHNpemVvZigqb2JqKTsKKwlvYmotPmRhX3N0YXJ0ID0gcGRhdGEtPmRhX3N0YXJ0OworCW9iai0+ZGFfZW5kID0gcGRhdGEtPmRhX2VuZDsKKworCXNwaW5fbG9ja19pbml0KCZvYmotPmlvbW11X2xvY2spOworCW11dGV4X2luaXQoJm9iai0+bW1hcF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZvYmotPm1tYXApOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9tZW07CisJfQorCisJcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQkgZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmICghcmVzKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX21lbTsKKwl9CisKKwlvYmotPnJlZ2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFvYmotPnJlZ2Jhc2UpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJZXJyID0gcmVxdWVzdF9pcnEoaXJxLCBpb21tdV9mYXVsdF9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIG9iaik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX2lycTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBvYmopOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHJlZ2lzdGVyZWRcbiIsIG9iai0+bmFtZSk7CisJcmV0dXJuIDA7CisKK2Vycl9pcnE6CisJaW91bm1hcChvYmotPnJlZ2Jhc2UpOworZXJyX2lvcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CitlcnJfbWVtOgorCWNsa19wdXQob2JqLT5jbGspOworZXJyX2NsazoKKwlrZnJlZShvYmopOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG9tYXBfaW9tbXVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGlycTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWlvcGd0YWJsZV9jbGVhcl9lbnRyeV9hbGwob2JqKTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJZnJlZV9pcnEoaXJxLCBvYmopOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaW91bm1hcChvYmotPnJlZ2Jhc2UpOworCisJY2xrX3B1dChvYmotPmNsayk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHJlbW92ZWRcbiIsIG9iai0+bmFtZSk7CisJa2ZyZWUob2JqKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9pb21tdV9kcml2ZXIgPSB7CisJLnByb2JlCT0gb21hcF9pb21tdV9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3Aob21hcF9pb21tdV9yZW1vdmUpLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gIm9tYXAtaW9tbXUiLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBpb3B0ZV9jYWNoZXBfY3Rvcih2b2lkICppb3B0ZSkKK3sKKwljbGVhbl9kY2FjaGVfYXJlYShpb3B0ZSwgSU9QVEVfVEFCTEVfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9pb21tdV9tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBsb25nIGRhLAorCQkJIHBoeXNfYWRkcl90IHBhLCBpbnQgb3JkZXIsIGludCBwcm90KQoreworCXN0cnVjdCBvbWFwX2lvbW11X2RvbWFpbiAqb21hcF9kb21haW4gPSBkb21haW4tPnByaXY7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9pb21tdSA9IG9tYXBfZG9tYWluLT5pb21tdV9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gb2lvbW11LT5kZXY7CisJc2l6ZV90IGJ5dGVzID0gUEFHRV9TSVpFIDw8IG9yZGVyOworCXN0cnVjdCBpb3RsYl9lbnRyeSBlOworCWludCBvbWFwX3Bnc3o7CisJdTMyIHJldCwgZmxhZ3M7CisKKwkvKiB3ZSBvbmx5IHN1cHBvcnQgbWFwcGluZyBhIHNpbmdsZSBpb21tdSBwYWdlIGZvciBub3cgKi8KKwlvbWFwX3Bnc3ogPSBieXRlc190b19pb3Bnc3ooYnl0ZXMpOworCWlmIChvbWFwX3Bnc3ogPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBzaXplIHRvIG1hcDogJWRcbiIsIGJ5dGVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhkZXYsICJtYXBwaW5nIGRhIDB4JWx4IHRvIHBhIDB4JXggc2l6ZSAweCV4XG4iLCBkYSwgcGEsIGJ5dGVzKTsKKworCWZsYWdzID0gb21hcF9wZ3N6IHwgcHJvdDsKKworCWlvdGxiX2luaXRfZW50cnkoJmUsIGRhLCBwYSwgZmxhZ3MpOworCisJcmV0ID0gb21hcF9pb3BndGFibGVfc3RvcmVfZW50cnkob2lvbW11LCAmZSk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJvbWFwX2lvcGd0YWJsZV9zdG9yZV9lbnRyeSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvbWFwX2lvbW11X3VubWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBkYSwKKwkJCSAgICBpbnQgb3JkZXIpCit7CisJc3RydWN0IG9tYXBfaW9tbXVfZG9tYWluICpvbWFwX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2lvbW11ID0gb21hcF9kb21haW4tPmlvbW11X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBvaW9tbXUtPmRldjsKKwlzaXplX3QgdW5tYXBfc2l6ZTsKKworCWRldl9kYmcoZGV2LCAidW5tYXBwaW5nIGRhIDB4JWx4IG9yZGVyICVkXG4iLCBkYSwgb3JkZXIpOworCisJdW5tYXBfc2l6ZSA9IGlvcGd0YWJsZV9jbGVhcl9lbnRyeShvaW9tbXUsIGRhKTsKKworCXJldHVybiB1bm1hcF9zaXplID8gZ2V0X29yZGVyKHVubWFwX3NpemUpIDogLUVJTlZBTDsKK30KKworc3RhdGljIGludAorb21hcF9pb21tdV9hdHRhY2hfZGV2KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBvbWFwX2lvbW11X2RvbWFpbiAqb21hcF9kb21haW4gPSBkb21haW4tPnByaXY7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9pb21tdTsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmb21hcF9kb21haW4tPmxvY2spOworCisJLyogb25seSBhIHNpbmdsZSBkZXZpY2UgaXMgc3VwcG9ydGVkIHBlciBkb21haW4gZm9yIG5vdyAqLworCWlmIChvbWFwX2RvbWFpbi0+aW9tbXVfZGV2KSB7CisJCWRldl9lcnIoZGV2LCAiaW9tbXUgZG9tYWluIGlzIGFscmVhZHkgYXR0YWNoZWRcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGdldCBhIGhhbmRsZSB0byBhbmQgZW5hYmxlIHRoZSBvbWFwIGlvbW11ICovCisJb2lvbW11ID0gb21hcF9pb21tdV9hdHRhY2goZGV2LCBvbWFwX2RvbWFpbi0+cGd0YWJsZSk7CisJaWYgKElTX0VSUihvaW9tbXUpKSB7CisJCXJldCA9IFBUUl9FUlIob2lvbW11KTsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgb21hcCBpb21tdTogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCW9tYXBfZG9tYWluLT5pb21tdV9kZXYgPSBvaW9tbXU7CisJb2lvbW11LT5kb21haW4gPSBkb21haW47CisKK291dDoKKwlzcGluX3VubG9jaygmb21hcF9kb21haW4tPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfaW9tbXVfZGV0YWNoX2RldihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4gKm9tYXBfZG9tYWluID0gZG9tYWluLT5wcml2OworCXN0cnVjdCBvbWFwX2lvbW11ICpvaW9tbXUgPSB0b19pb21tdShkZXYpOworCisJc3Bpbl9sb2NrKCZvbWFwX2RvbWFpbi0+bG9jayk7CisKKwkvKiBvbmx5IGEgc2luZ2xlIGRldmljZSBpcyBzdXBwb3J0ZWQgcGVyIGRvbWFpbiBmb3Igbm93ICovCisJaWYgKG9tYXBfZG9tYWluLT5pb21tdV9kZXYgIT0gb2lvbW11KSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBpb21tdSBkZXZpY2VcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpb3BndGFibGVfY2xlYXJfZW50cnlfYWxsKG9pb21tdSk7CisKKwlvbWFwX2lvbW11X2RldGFjaChvaW9tbXUpOworCisJb21hcF9kb21haW4tPmlvbW11X2RldiA9IE5VTEw7CisKK291dDoKKwlzcGluX3VubG9jaygmb21hcF9kb21haW4tPmxvY2spOworfQorCitzdGF0aWMgaW50IG9tYXBfaW9tbXVfZG9tYWluX2luaXQoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQoreworCXN0cnVjdCBvbWFwX2lvbW11X2RvbWFpbiAqb21hcF9kb21haW47CisKKwlvbWFwX2RvbWFpbiA9IGt6YWxsb2Moc2l6ZW9mKCpvbWFwX2RvbWFpbiksIEdGUF9LRVJORUwpOworCWlmICghb21hcF9kb21haW4pIHsKKwkJcHJfZXJyKCJremFsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCW9tYXBfZG9tYWluLT5wZ3RhYmxlID0ga3phbGxvYyhJT1BHRF9UQUJMRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9tYXBfZG9tYWluLT5wZ3RhYmxlKSB7CisJCXByX2Vycigia3phbGxvYyBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxfbm9tZW07CisJfQorCisJLyoKKwkgKiBzaG91bGQgbmV2ZXIgZmFpbCwgYnV0IHBsZWFzZSBrZWVwIHRoaXMgYXJvdW5kIHRvIGVuc3VyZQorCSAqIHdlIGtlZXAgdGhlIGhhcmR3YXJlIGhhcHB5CisJICovCisJQlVHX09OKCFJU19BTElHTkVEKChsb25nKW9tYXBfZG9tYWluLT5wZ3RhYmxlLCBJT1BHRF9UQUJMRV9TSVpFKSk7CisKKwljbGVhbl9kY2FjaGVfYXJlYShvbWFwX2RvbWFpbi0+cGd0YWJsZSwgSU9QR0RfVEFCTEVfU0laRSk7CisJc3Bpbl9sb2NrX2luaXQoJm9tYXBfZG9tYWluLT5sb2NrKTsKKworCWRvbWFpbi0+cHJpdiA9IG9tYXBfZG9tYWluOworCisJcmV0dXJuIDA7CisKK2ZhaWxfbm9tZW06CisJa2ZyZWUob21hcF9kb21haW4pOworb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCisvKiBhc3N1bWUgZGV2aWNlIHdhcyBhbHJlYWR5IGRldGFjaGVkICovCitzdGF0aWMgdm9pZCBvbWFwX2lvbW11X2RvbWFpbl9kZXN0cm95KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4gKm9tYXBfZG9tYWluID0gZG9tYWluLT5wcml2OworCisJZG9tYWluLT5wcml2ID0gTlVMTDsKKworCWtmcmVlKG9tYXBfZG9tYWluLT5wZ3RhYmxlKTsKKwlrZnJlZShvbWFwX2RvbWFpbik7Cit9CisKK3N0YXRpYyBwaHlzX2FkZHJfdCBvbWFwX2lvbW11X2lvdmFfdG9fcGh5cyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJCSAgdW5zaWduZWQgbG9uZyBkYSkKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4gKm9tYXBfZG9tYWluID0gZG9tYWluLT5wcml2OworCXN0cnVjdCBvbWFwX2lvbW11ICpvaW9tbXUgPSBvbWFwX2RvbWFpbi0+aW9tbXVfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG9pb21tdS0+ZGV2OworCXUzMiAqcGdkLCAqcHRlOworCXBoeXNfYWRkcl90IHJldCA9IDA7CisKKwlpb3BndGFibGVfbG9va3VwX2VudHJ5KG9pb21tdSwgZGEsICZwZ2QsICZwdGUpOworCisJaWYgKHB0ZSkgeworCQlpZiAoaW9wdGVfaXNfc21hbGwoKnB0ZSkpCisJCQlyZXQgPSBvbWFwX2lvbW11X3RyYW5zbGF0ZSgqcHRlLCBkYSwgSU9QVEVfTUFTSyk7CisJCWVsc2UgaWYgKGlvcHRlX2lzX2xhcmdlKCpwdGUpKQorCQkJcmV0ID0gb21hcF9pb21tdV90cmFuc2xhdGUoKnB0ZSwgZGEsIElPTEFSR0VfTUFTSyk7CisJCWVsc2UKKwkJCWRldl9lcnIoZGV2LCAiYm9ndXMgcHRlIDB4JXgiLCAqcHRlKTsKKwl9IGVsc2UgeworCQlpZiAoaW9wZ2RfaXNfc2VjdGlvbigqcGdkKSkKKwkJCXJldCA9IG9tYXBfaW9tbXVfdHJhbnNsYXRlKCpwZ2QsIGRhLCBJT1NFQ1RJT05fTUFTSyk7CisJCWVsc2UgaWYgKGlvcGdkX2lzX3N1cGVyKCpwZ2QpKQorCQkJcmV0ID0gb21hcF9pb21tdV90cmFuc2xhdGUoKnBnZCwgZGEsIElPU1VQRVJfTUFTSyk7CisJCWVsc2UKKwkJCWRldl9lcnIoZGV2LCAiYm9ndXMgcGdkIDB4JXgiLCAqcGdkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9tYXBfaW9tbXVfZG9tYWluX2hhc19jYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGNhcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgb21hcF9pb21tdV9vcHMgPSB7CisJLmRvbWFpbl9pbml0CT0gb21hcF9pb21tdV9kb21haW5faW5pdCwKKwkuZG9tYWluX2Rlc3Ryb3kJPSBvbWFwX2lvbW11X2RvbWFpbl9kZXN0cm95LAorCS5hdHRhY2hfZGV2CT0gb21hcF9pb21tdV9hdHRhY2hfZGV2LAorCS5kZXRhY2hfZGV2CT0gb21hcF9pb21tdV9kZXRhY2hfZGV2LAorCS5tYXAJCT0gb21hcF9pb21tdV9tYXAsCisJLnVubWFwCQk9IG9tYXBfaW9tbXVfdW5tYXAsCisJLmlvdmFfdG9fcGh5cwk9IG9tYXBfaW9tbXVfaW92YV90b19waHlzLAorCS5kb21haW5faGFzX2NhcAk9IG9tYXBfaW9tbXVfZG9tYWluX2hhc19jYXAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2lvbW11X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqcDsKKwljb25zdCB1bnNpZ25lZCBsb25nIGZsYWdzID0gU0xBQl9IV0NBQ0hFX0FMSUdOOworCXNpemVfdCBhbGlnbiA9IDEgPDwgMTA7IC8qIEwyIHBhZ2V0YWJsZSBhbGlnbmVtZW50ICovCisKKwlwID0ga21lbV9jYWNoZV9jcmVhdGUoImlvcHRlX2NhY2hlIiwgSU9QVEVfVEFCTEVfU0laRSwgYWxpZ24sIGZsYWdzLAorCQkJICAgICAgaW9wdGVfY2FjaGVwX2N0b3IpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW9wdGVfY2FjaGVwID0gcDsKKworCWJ1c19zZXRfaW9tbXUoJnBsYXRmb3JtX2J1c190eXBlLCAmb21hcF9pb21tdV9vcHMpOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcF9pb21tdV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQob21hcF9pb21tdV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG9tYXBfaW9tbXVfZXhpdCh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShpb3B0ZV9jYWNoZXApOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfaW9tbXVfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG9tYXBfaW9tbXVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigib21hcCBpb21tdTogdGxiIGFuZCBwYWdldGFibGUgcHJpbWl0aXZlcyIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpvbWFwLWlvbW11Iik7CitNT0RVTEVfQVVUSE9SKCJIaXJvc2hpIERPWVUsIFBhdWwgTXVuZHQgYW5kIFRvc2hpaGlybyBLb2JheWFzaGkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvb21hcC1pb3ZtbS5jIGIvZHJpdmVycy9pb21tdS9vbWFwLWlvdm1tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiZTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW9tbXUvb21hcC1pb3ZtbS5jCkBAIC0wLDAgKzEsNzQzIEBACisvKgorICogb21hcCBpb21tdTogc2ltcGxlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IEhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxwbGF0L2lvbW11Lmg+CisjaW5jbHVkZSA8cGxhdC9pb3ZtbS5oPgorCisjaW5jbHVkZSA8cGxhdC9pb3BndGFibGUuaD4KKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppb3ZtX2FyZWFfY2FjaGVwOworCisvKiByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2NhdHRlcmxpc3QgZW50cnkgaW4gYSBzZyB0YWJsZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBzZ3RhYmxlX29mZnNldChjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCkKK3sKKwlpZiAoIXNndCB8fCAhc2d0LT5uZW50cykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2d0LT5zZ2wtPm9mZnNldDsKK30KKworLyogcmV0dXJuIHRvdGFsIGJ5dGVzIG9mIHNnIGJ1ZmZlcnMgKi8KK3N0YXRpYyBzaXplX3Qgc2d0YWJsZV9sZW4oY29uc3Qgc3RydWN0IHNnX3RhYmxlICpzZ3QpCit7CisJdW5zaWduZWQgaW50IGksIHRvdGFsID0gMDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJaWYgKCFzZ3QpCisJCXJldHVybiAwOworCisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXNpemVfdCBieXRlczsKKworCQlieXRlcyA9IHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0OworCisJCWlmICghaW9wZ3N6X29rKGJ5dGVzKSkgeworCQkJcHJfZXJyKCIlczogc2dbJWRdIG5vdCBpb21tdSBwYWdlc2l6ZSgldSAldSlcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGksIGJ5dGVzLCBzZy0+b2Zmc2V0KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGkgJiYgc2ctPm9mZnNldCkgeworCQkJcHJfZXJyKCIlczogc2dbJWRdIG9mZnNldCBub3QgYWxsb3dlZCBpbiBpbnRlcm5hbCAiCisJCQkJCSJlbnRyaWVzXG4iLCBfX2Z1bmNfXywgaSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXRvdGFsICs9IGJ5dGVzOworCX0KKworCXJldHVybiB0b3RhbDsKK30KKyNkZWZpbmUgc2d0YWJsZV9vayh4KQkoISFzZ3RhYmxlX2xlbih4KSkKKworc3RhdGljIHVuc2lnbmVkIG1heF9hbGlnbm1lbnQodTMyIGFkZHIpCit7CisJaW50IGk7CisJdW5zaWduZWQgcGFnZXNpemVbXSA9IHsgU1pfMTZNLCBTWl8xTSwgU1pfNjRLLCBTWl80SywgfTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYWdlc2l6ZSkgJiYgYWRkciAmIChwYWdlc2l6ZVtpXSAtIDEpOyBpKyspCisJCTsKKwlyZXR1cm4gKGkgPCBBUlJBWV9TSVpFKHBhZ2VzaXplKSkgPyBwYWdlc2l6ZVtpXSA6IDA7Cit9CisKKy8qCisgKiBjYWxjdWxhdGUgdGhlIG9wdGltYWwgbnVtYmVyIHNnIGVsZW1lbnRzIGZyb20gdG90YWwgYnl0ZXMgYmFzZWQgb24KKyAqIGlvbW11IHN1cGVycGFnZXMKKyAqLworc3RhdGljIHVuc2lnbmVkIHNndGFibGVfbmVudHMoc2l6ZV90IGJ5dGVzLCB1MzIgZGEsIHUzMiBwYSkKK3sKKwl1bnNpZ25lZCBucl9lbnRyaWVzID0gMCwgZW50X3N6OworCisJaWYgKCFJU19BTElHTkVEKGJ5dGVzLCBQQUdFX1NJWkUpKSB7CisJCXByX2VycigiJXM6IHdyb25nIHNpemUgJTA4eFxuIiwgX19mdW5jX18sIGJ5dGVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGJ5dGVzKSB7CisJCWVudF9zeiA9IG1heF9hbGlnbm1lbnQoZGEgfCBwYSk7CisJCWVudF9zeiA9IG1pbl90KHVuc2lnbmVkLCBlbnRfc3osIGlvcGdzel9tYXgoYnl0ZXMpKTsKKwkJbnJfZW50cmllcysrOworCQlkYSArPSBlbnRfc3o7CisJCXBhICs9IGVudF9zejsKKwkJYnl0ZXMgLT0gZW50X3N6OworCX0KKworCXJldHVybiBucl9lbnRyaWVzOworfQorCisvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzZ190YWJsZSBoZWFkZXIoYSBraW5kIG9mICdzdXBlcmJsb2NrJykgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKnNndGFibGVfYWxsb2MoY29uc3Qgc2l6ZV90IGJ5dGVzLCB1MzIgZmxhZ3MsCisJCQkJCQkJdTMyIGRhLCB1MzIgcGEpCit7CisJdW5zaWduZWQgaW50IG5yX2VudHJpZXM7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKKworCWlmICghYnl0ZXMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJaWYgKCFJU19BTElHTkVEKGJ5dGVzLCBQQUdFX1NJWkUpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWlmIChmbGFncyAmIElPVk1GX0xJTkVBUikgeworCQlucl9lbnRyaWVzID0gc2d0YWJsZV9uZW50cyhieXRlcywgZGEsIHBhKTsKKwkJaWYgKCFucl9lbnRyaWVzKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfSBlbHNlCisJCW5yX2VudHJpZXMgPSAgYnl0ZXMgLyBQQUdFX1NJWkU7CisKKwlzZ3QgPSBremFsbG9jKHNpemVvZigqc2d0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZ3QpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gc2dfYWxsb2NfdGFibGUoc2d0LCBucl9lbnRyaWVzLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKHNndCk7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisJcHJfZGVidWcoIiVzOiBzZ3Q6JXAoJWQgZW50cmllcylcbiIsIF9fZnVuY19fLCBzZ3QsIG5yX2VudHJpZXMpOworCisJcmV0dXJuIHNndDsKK30KKworLyogZnJlZSBzZ190YWJsZSBoZWFkZXIoYSBraW5kIG9mIHN1cGVyYmxvY2spICovCitzdGF0aWMgdm9pZCBzZ3RhYmxlX2ZyZWUoc3RydWN0IHNnX3RhYmxlICpzZ3QpCit7CisJaWYgKCFzZ3QpCisJCXJldHVybjsKKworCXNnX2ZyZWVfdGFibGUoc2d0KTsKKwlrZnJlZShzZ3QpOworCisJcHJfZGVidWcoIiVzOiBzZ3Q6JXBcbiIsIF9fZnVuY19fLCBzZ3QpOworfQorCisvKiBtYXAgJ3NnbGlzdCcgdG8gYSBjb250aWd1b3VzIG1wdSB2aXJ0dWFsIGFyZWEgYW5kIHJldHVybiAndmEnICovCitzdGF0aWMgdm9pZCAqdm1hcF9zZyhjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCkKK3sKKwl1MzIgdmE7CisJc2l6ZV90IHRvdGFsOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IHZtX3N0cnVjdCAqbmV3OworCWNvbnN0IHN0cnVjdCBtZW1fdHlwZSAqbXR5cGU7CisKKwltdHlwZSA9IGdldF9tZW1fdHlwZShNVF9ERVZJQ0UpOworCWlmICghbXR5cGUpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJdG90YWwgPSBzZ3RhYmxlX2xlbihzZ3QpOworCWlmICghdG90YWwpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJbmV3ID0gX19nZXRfdm1fYXJlYSh0b3RhbCwgVk1fSU9SRU1BUCwgVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQpOworCWlmICghbmV3KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl2YSA9ICh1MzIpbmV3LT5hZGRyOworCisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXNpemVfdCBieXRlczsKKwkJdTMyIHBhOworCQlpbnQgZXJyOworCisJCXBhID0gc2dfcGh5cyhzZykgLSBzZy0+b2Zmc2V0OworCQlieXRlcyA9IHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0OworCisJCUJVR19PTihieXRlcyAhPSBQQUdFX1NJWkUpOworCisJCWVyciA9IGlvcmVtYXBfcGFnZSh2YSwgIHBhLCBtdHlwZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXQ7CisKKwkJdmEgKz0gYnl0ZXM7CisJfQorCisJZmx1c2hfY2FjaGVfdm1hcCgodW5zaWduZWQgbG9uZyluZXctPmFkZHIsCisJCQkJKHVuc2lnbmVkIGxvbmcpKG5ldy0+YWRkciArIHRvdGFsKSk7CisJcmV0dXJuIG5ldy0+YWRkcjsKKworZXJyX291dDoKKwlXQVJOX09OKDEpOyAvKiBGSVhNRTogY2xlYW51cCBzb21lIG1wdSBtYXBwaW5ncyAqLworCXZ1bm1hcChuZXctPmFkZHIpOworCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdnVubWFwX3NnKGNvbnN0IHZvaWQgKnZhKQoreworCXZ1bm1hcCh2YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW92bV9zdHJ1Y3QgKl9fZmluZF9pb3ZtX2FyZWEoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwKKwkJCQkJCQljb25zdCB1MzIgZGEpCit7CisJc3RydWN0IGlvdm1fc3RydWN0ICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJm9iai0+bW1hcCwgbGlzdCkgeworCQlpZiAoKGRhID49IHRtcC0+ZGFfc3RhcnQpICYmIChkYSA8IHRtcC0+ZGFfZW5kKSkgeworCQkJc2l6ZV90IGxlbjsKKworCQkJbGVuID0gdG1wLT5kYV9lbmQgLSB0bXAtPmRhX3N0YXJ0OworCisJCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICUwOHgtJTA4eC0lMDh4KCV4KSAlMDh4XG4iLAorCQkJCV9fZnVuY19fLCB0bXAtPmRhX3N0YXJ0LCBkYSwgdG1wLT5kYV9lbmQsIGxlbiwKKwkJCQl0bXAtPmZsYWdzKTsKKworCQkJcmV0dXJuIHRtcDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG9tYXBfZmluZF9pb3ZtX2FyZWEgIC0gIGZpbmQgaW92bWEgd2hpY2ggaW5jbHVkZXMgQGRhCisgKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCisgKgorICogRmluZCB0aGUgZXhpc3RpbmcgaW92bWEgc3RhcnRpbmcgYXQgQGRhCisgKi8KK3N0cnVjdCBpb3ZtX3N0cnVjdCAqb21hcF9maW5kX2lvdm1fYXJlYShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEpCit7CisJc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOworCisJbXV0ZXhfbG9jaygmb2JqLT5tbWFwX2xvY2spOworCWFyZWEgPSBfX2ZpbmRfaW92bV9hcmVhKG9iaiwgZGEpOworCW11dGV4X3VubG9jaygmb2JqLT5tbWFwX2xvY2spOworCisJcmV0dXJuIGFyZWE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2ZpbmRfaW92bV9hcmVhKTsKKworLyoKKyAqIFRoaXMgZmluZHMgdGhlIGhvbGUoYXJlYSkgd2hpY2ggZml0cyB0aGUgcmVxdWVzdGVkIGFkZHJlc3MgYW5kIGxlbgorICogaW4gaW92bWFzIG1tYXAsIGFuZCByZXR1cm5zIHRoZSBuZXcgYWxsb2NhdGVkIGlvdm1hLgorICovCitzdGF0aWMgc3RydWN0IGlvdm1fc3RydWN0ICphbGxvY19pb3ZtX2FyZWEoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhLAorCQkJCQkgICBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKm5ldywgKnRtcDsKKwl1MzIgc3RhcnQsIHByZXZfZW5kLCBhbGlnbm1lbnQ7CisKKwlpZiAoIW9iaiB8fCAhYnl0ZXMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJc3RhcnQgPSBkYTsKKwlhbGlnbm1lbnQgPSBQQUdFX1NJWkU7CisKKwlpZiAofmZsYWdzICYgSU9WTUZfREFfRklYRUQpIHsKKwkJLyogRG9uJ3QgbWFwIGFkZHJlc3MgMCAqLworCQlzdGFydCA9IG9iai0+ZGFfc3RhcnQgPyBvYmotPmRhX3N0YXJ0IDogYWxpZ25tZW50OworCisJCWlmIChmbGFncyAmIElPVk1GX0xJTkVBUikKKwkJCWFsaWdubWVudCA9IGlvcGdzel9tYXgoYnl0ZXMpOworCQlzdGFydCA9IHJvdW5kdXAoc3RhcnQsIGFsaWdubWVudCk7CisJfSBlbHNlIGlmIChzdGFydCA8IG9iai0+ZGFfc3RhcnQgfHwgc3RhcnQgPiBvYmotPmRhX2VuZCB8fAorCQkJCQlvYmotPmRhX2VuZCAtIHN0YXJ0IDwgYnl0ZXMpIHsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJdG1wID0gTlVMTDsKKwlpZiAobGlzdF9lbXB0eSgmb2JqLT5tbWFwKSkKKwkJZ290byBmb3VuZDsKKworCXByZXZfZW5kID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJm9iai0+bW1hcCwgbGlzdCkgeworCisJCWlmIChwcmV2X2VuZCA+IHN0YXJ0KQorCQkJYnJlYWs7CisKKwkJaWYgKHRtcC0+ZGFfc3RhcnQgPiBzdGFydCAmJiAodG1wLT5kYV9zdGFydCAtIHN0YXJ0KSA+PSBieXRlcykKKwkJCWdvdG8gZm91bmQ7CisKKwkJaWYgKHRtcC0+ZGFfZW5kID49IHN0YXJ0ICYmIH5mbGFncyAmIElPVk1GX0RBX0ZJWEVEKQorCQkJc3RhcnQgPSByb3VuZHVwKHRtcC0+ZGFfZW5kICsgMSwgYWxpZ25tZW50KTsKKworCQlwcmV2X2VuZCA9IHRtcC0+ZGFfZW5kOworCX0KKworCWlmICgoc3RhcnQgPj0gcHJldl9lbmQpICYmIChvYmotPmRhX2VuZCAtIHN0YXJ0ID49IGJ5dGVzKSkKKwkJZ290byBmb3VuZDsKKworCWRldl9kYmcob2JqLT5kZXYsICIlczogbm8gc3BhY2UgdG8gZml0ICUwOHgoJXgpIGZsYWdzOiAlMDh4XG4iLAorCQlfX2Z1bmNfXywgZGEsIGJ5dGVzLCBmbGFncyk7CisKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworZm91bmQ6CisJbmV3ID0ga21lbV9jYWNoZV96YWxsb2MoaW92bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXcpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbmV3LT5pb21tdSA9IG9iajsKKwluZXctPmRhX3N0YXJ0ID0gc3RhcnQ7CisJbmV3LT5kYV9lbmQgPSBzdGFydCArIGJ5dGVzOworCW5ldy0+ZmxhZ3MgPSBmbGFnczsKKworCS8qCisJICoga2VlcCBhc2NlbmRpbmcgb3JkZXIgb2YgaW92bWFzCisJICovCisJaWYgKHRtcCkKKwkJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCAmdG1wLT5saXN0KTsKKwllbHNlCisJCWxpc3RfYWRkKCZuZXctPmxpc3QsICZvYmotPm1tYXApOworCisJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBmb3VuZCAlMDh4LSUwOHgtJTA4eCgleCkgJTA4eFxuIiwKKwkJX19mdW5jX18sIG5ldy0+ZGFfc3RhcnQsIHN0YXJ0LCBuZXctPmRhX2VuZCwgYnl0ZXMsIGZsYWdzKTsKKworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaW92bV9hcmVhKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBpb3ZtX3N0cnVjdCAqYXJlYSkKK3sKKwlzaXplX3QgYnl0ZXM7CisKKwlCVUdfT04oIW9iaiB8fCAhYXJlYSk7CisKKwlieXRlcyA9IGFyZWEtPmRhX2VuZCAtIGFyZWEtPmRhX3N0YXJ0OworCisJZGV2X2RiZyhvYmotPmRldiwgIiVzOiAlMDh4LSUwOHgoJXgpICUwOHhcbiIsCisJCV9fZnVuY19fLCBhcmVhLT5kYV9zdGFydCwgYXJlYS0+ZGFfZW5kLCBieXRlcywgYXJlYS0+ZmxhZ3MpOworCisJbGlzdF9kZWwoJmFyZWEtPmxpc3QpOworCWttZW1fY2FjaGVfZnJlZShpb3ZtX2FyZWFfY2FjaGVwLCBhcmVhKTsKK30KKworLyoqCisgKiBvbWFwX2RhX3RvX3ZhIC0gY29udmVydCAoZCkgdG8gKHYpCisgKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKKyAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKKyAqIEB2YToJCW1wdSB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIG1wdSB2aXJ0dWFsIGFkZHIgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBkZXZpY2UgdmlydHVhbCBhZGRyCisgKi8KK3ZvaWQgKm9tYXBfZGFfdG9fdmEoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhKQoreworCXZvaWQgKnZhID0gTlVMTDsKKwlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFyZWE7CisKKwltdXRleF9sb2NrKCZvYmotPm1tYXBfbG9jayk7CisKKwlhcmVhID0gX19maW5kX2lvdm1fYXJlYShvYmosIGRhKTsKKwlpZiAoIWFyZWEpIHsKKwkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBubyBkYSBhcmVhKCUwOHgpXG4iLCBfX2Z1bmNfXywgZGEpOworCQlnb3RvIG91dDsKKwl9CisJdmEgPSBhcmVhLT52YTsKK291dDoKKwltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKKworCXJldHVybiB2YTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZGFfdG9fdmEpOworCitzdGF0aWMgdm9pZCBzZ3RhYmxlX2ZpbGxfdm1hbGxvYyhzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdm9pZCAqX3ZhKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdm9pZCAqdmEgPSBfdmE7CisJdm9pZCAqdmFfZW5kOworCisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXN0cnVjdCBwYWdlICpwZzsKKwkJY29uc3Qgc2l6ZV90IGJ5dGVzID0gUEFHRV9TSVpFOworCisJCS8qCisJCSAqIGlvbW11ICdzdXBlcnBhZ2UnIGlzbid0IHN1cHBvcnRlZCB3aXRoICdvbWFwX2lvbW11X3ZtYWxsb2MoKScKKwkJICovCisJCXBnID0gdm1hbGxvY190b19wYWdlKHZhKTsKKwkJQlVHX09OKCFwZyk7CisJCXNnX3NldF9wYWdlKHNnLCBwZywgYnl0ZXMsIDApOworCisJCXZhICs9IGJ5dGVzOworCX0KKworCXZhX2VuZCA9IF92YSArIFBBR0VfU0laRSAqIGk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZ3RhYmxlX2RyYWluX3ZtYWxsb2Moc3RydWN0IHNnX3RhYmxlICpzZ3QpCit7CisJLyoKKwkgKiBBY3R1YWxseSB0aGlzIGlzIG5vdCBuZWNlc3NhcnkgYXQgYWxsLCBqdXN0IGV4aXN0cyBmb3IKKwkgKiBjb25zaXN0ZW5jeSBvZiB0aGUgY29kZSByZWFkYWJpbGl0eS4KKwkgKi8KKwlCVUdfT04oIXNndCk7Cit9CisKKy8qIGNyZWF0ZSAnZGEnIDwtPiAncGEnIG1hcHBpbmcgZnJvbSAnc2d0JyAqLworc3RhdGljIGludCBtYXBfaW92bV9hcmVhKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc3RydWN0IGlvdm1fc3RydWN0ICpuZXcsCisJCQljb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdTMyIGZsYWdzKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGksIGo7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1MzIgZGEgPSBuZXctPmRhX3N0YXJ0OworCWludCBvcmRlcjsKKworCWlmICghZG9tYWluIHx8ICFzZ3QpCisJCXJldHVybiAtRUlOVkFMOworCisJQlVHX09OKCFzZ3RhYmxlX29rKHNndCkpOworCisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXUzMiBwYTsKKwkJc2l6ZV90IGJ5dGVzOworCisJCXBhID0gc2dfcGh5cyhzZykgLSBzZy0+b2Zmc2V0OworCQlieXRlcyA9IHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0OworCisJCWZsYWdzICY9IH5JT1ZNRl9QR1NaX01BU0s7CisKKwkJaWYgKGJ5dGVzX3RvX2lvcGdzeihieXRlcykgPCAwKQorCQkJZ290byBlcnJfb3V0OworCisJCW9yZGVyID0gZ2V0X29yZGVyKGJ5dGVzKTsKKworCQlwcl9kZWJ1ZygiJXM6IFslZF0gJTA4eCAlMDh4KCV4KVxuIiwgX19mdW5jX18sCisJCQkgaSwgZGEsIHBhLCBieXRlcyk7CisKKwkJZXJyID0gaW9tbXVfbWFwKGRvbWFpbiwgZGEsIHBhLCBvcmRlciwgZmxhZ3MpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWRhICs9IGJ5dGVzOworCX0KKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlkYSA9IG5ldy0+ZGFfc3RhcnQ7CisKKwlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgc2csIGksIGopIHsKKwkJc2l6ZV90IGJ5dGVzOworCisJCWJ5dGVzID0gc2ctPmxlbmd0aCArIHNnLT5vZmZzZXQ7CisJCW9yZGVyID0gZ2V0X29yZGVyKGJ5dGVzKTsKKworCQkvKiBpZ25vcmUgZmFpbHVyZXMuLiB3ZSdyZSBhbHJlYWR5IGhhbmRsaW5nIG9uZSAqLworCQlpb21tdV91bm1hcChkb21haW4sIGRhLCBvcmRlcik7CisKKwkJZGEgKz0gYnl0ZXM7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qIHJlbGVhc2UgJ2RhJyA8LT4gJ3BhJyBtYXBwaW5nICovCitzdGF0aWMgdm9pZCB1bm1hcF9pb3ZtX2FyZWEoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCQkJc3RydWN0IGlvdm1fc3RydWN0ICphcmVhKQoreworCXUzMiBzdGFydDsKKwlzaXplX3QgdG90YWwgPSBhcmVhLT5kYV9lbmQgLSBhcmVhLT5kYV9zdGFydDsKKwljb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCA9IGFyZWEtPnNndDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpLCBlcnI7CisKKwlCVUdfT04oIXNndGFibGVfb2soc2d0KSk7CisJQlVHX09OKCghdG90YWwpIHx8ICFJU19BTElHTkVEKHRvdGFsLCBQQUdFX1NJWkUpKTsKKworCXN0YXJ0ID0gYXJlYS0+ZGFfc3RhcnQ7CisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXNpemVfdCBieXRlczsKKwkJaW50IG9yZGVyOworCisJCWJ5dGVzID0gc2ctPmxlbmd0aCArIHNnLT5vZmZzZXQ7CisJCW9yZGVyID0gZ2V0X29yZGVyKGJ5dGVzKTsKKworCQllcnIgPSBpb21tdV91bm1hcChkb21haW4sIHN0YXJ0LCBvcmRlcik7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiB1bm1hcCAlMDh4KCV4KSAlMDh4XG4iLAorCQkJCV9fZnVuY19fLCBzdGFydCwgYnl0ZXMsIGFyZWEtPmZsYWdzKTsKKworCQlCVUdfT04oIUlTX0FMSUdORUQoYnl0ZXMsIFBBR0VfU0laRSkpOworCisJCXRvdGFsIC09IGJ5dGVzOworCQlzdGFydCArPSBieXRlczsKKwl9CisJQlVHX09OKHRvdGFsKTsKK30KKworLyogdGVtcGxhdGUgZnVuY3Rpb24gZm9yIGFsbCB1bm1hcHBpbmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKnVubWFwX3ZtX2FyZWEoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICAgIHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIGNvbnN0IHUzMiBkYSwKKwkJCQkgICAgICB2b2lkICgqZm4pKGNvbnN0IHZvaWQgKiksIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNndCA9IE5VTEw7CisJc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOworCisJaWYgKCFJU19BTElHTkVEKGRhLCBQQUdFX1NJWkUpKSB7CisJCWRldl9lcnIob2JqLT5kZXYsICIlczogYWxpZ25tZW50IGVyciglMDh4KVxuIiwgX19mdW5jX18sIGRhKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbXV0ZXhfbG9jaygmb2JqLT5tbWFwX2xvY2spOworCisJYXJlYSA9IF9fZmluZF9pb3ZtX2FyZWEob2JqLCBkYSk7CisJaWYgKCFhcmVhKSB7CisJCWRldl9kYmcob2JqLT5kZXYsICIlczogbm8gZGEgYXJlYSglMDh4KVxuIiwgX19mdW5jX18sIGRhKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChhcmVhLT5mbGFncyAmIGZsYWdzKSAhPSBmbGFncykgeworCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6IHdyb25nIGZsYWdzKCUwOHgpXG4iLCBfX2Z1bmNfXywKKwkJCWFyZWEtPmZsYWdzKTsKKwkJZ290byBvdXQ7CisJfQorCXNndCA9IChzdHJ1Y3Qgc2dfdGFibGUgKilhcmVhLT5zZ3Q7CisKKwl1bm1hcF9pb3ZtX2FyZWEoZG9tYWluLCBvYmosIGFyZWEpOworCisJZm4oYXJlYS0+dmEpOworCisJZGV2X2RiZyhvYmotPmRldiwgIiVzOiAlMDh4LSUwOHgtJTA4eCgleCkgJTA4eFxuIiwgX19mdW5jX18sCisJCWFyZWEtPmRhX3N0YXJ0LCBkYSwgYXJlYS0+ZGFfZW5kLAorCQlhcmVhLT5kYV9lbmQgLSBhcmVhLT5kYV9zdGFydCwgYXJlYS0+ZmxhZ3MpOworCisJZnJlZV9pb3ZtX2FyZWEob2JqLCBhcmVhKTsKK291dDoKKwltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKKworCXJldHVybiBzZ3Q7Cit9CisKK3N0YXRpYyB1MzIgbWFwX2lvbW11X3JlZ2lvbihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBvbWFwX2lvbW11ICpvYmosCisJCQkJdTMyIGRhLCBjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdm9pZCAqdmEsCisJCQkJc2l6ZV90IGJ5dGVzLCB1MzIgZmxhZ3MpCit7CisJaW50IGVyciA9IC1FTk9NRU07CisJc3RydWN0IGlvdm1fc3RydWN0ICpuZXc7CisKKwltdXRleF9sb2NrKCZvYmotPm1tYXBfbG9jayk7CisKKwluZXcgPSBhbGxvY19pb3ZtX2FyZWEob2JqLCBkYSwgYnl0ZXMsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKG5ldykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXcpOworCQlnb3RvIGVycl9hbGxvY19pb3ZtYTsKKwl9CisJbmV3LT52YSA9IHZhOworCW5ldy0+c2d0ID0gc2d0OworCisJaWYgKG1hcF9pb3ZtX2FyZWEoZG9tYWluLCBuZXcsIHNndCwgbmV3LT5mbGFncykpCisJCWdvdG8gZXJyX21hcDsKKworCW11dGV4X3VubG9jaygmb2JqLT5tbWFwX2xvY2spOworCisJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBkYTolMDh4KCV4KSBmbGFnczolMDh4IHZhOiVwXG4iLAorCQlfX2Z1bmNfXywgbmV3LT5kYV9zdGFydCwgYnl0ZXMsIG5ldy0+ZmxhZ3MsIHZhKTsKKworCXJldHVybiBuZXctPmRhX3N0YXJ0OworCitlcnJfbWFwOgorCWZyZWVfaW92bV9hcmVhKG9iaiwgbmV3KTsKK2Vycl9hbGxvY19pb3ZtYToKKwltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorX19pb21tdV92bWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwKKwkJCQl1MzIgZGEsIGNvbnN0IHN0cnVjdCBzZ190YWJsZSAqc2d0LAorCQkJCXZvaWQgKnZhLCBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncykKK3sKKwlyZXR1cm4gbWFwX2lvbW11X3JlZ2lvbihkb21haW4sIG9iaiwgZGEsIHNndCwgdmEsIGJ5dGVzLCBmbGFncyk7Cit9CisKKy8qKgorICogb21hcF9pb21tdV92bWFwICAtICAoZCktKHApLSh2KSBhZGRyZXNzIG1hcHBlcgorICogQG9iajoJb2JqZWN0aXZlIGlvbW11CisgKiBAc2d0OglhZGRyZXNzIG9mIHNjYXR0ZXIgZ2F0aGVyIHRhYmxlCisgKiBAZmxhZ3M6CWlvdm1hIGFuZCBwYWdlIHByb3BlcnR5CisgKgorICogQ3JlYXRlcyAxLW4tMSBtYXBwaW5nIHdpdGggZ2l2ZW4gQHNndCBhbmQgcmV0dXJucyBAZGEuCisgKiBBbGwgQHNndCBlbGVtZW50IG11c3QgYmUgaW8gcGFnZSBzaXplIGFsaWduZWQuCisgKi8KK3UzMiBvbWFwX2lvbW11X3ZtYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEsCisJCWNvbnN0IHN0cnVjdCBzZ190YWJsZSAqc2d0LCB1MzIgZmxhZ3MpCit7CisJc2l6ZV90IGJ5dGVzOworCXZvaWQgKnZhID0gTlVMTDsKKworCWlmICghb2JqIHx8ICFvYmotPmRldiB8fCAhc2d0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ5dGVzID0gc2d0YWJsZV9sZW4oc2d0KTsKKwlpZiAoIWJ5dGVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlieXRlcyA9IFBBR0VfQUxJR04oYnl0ZXMpOworCisJaWYgKGZsYWdzICYgSU9WTUZfTU1JTykgeworCQl2YSA9IHZtYXBfc2coc2d0KTsKKwkJaWYgKElTX0VSUih2YSkpCisJCQlyZXR1cm4gUFRSX0VSUih2YSk7CisJfQorCisJZmxhZ3MgfD0gSU9WTUZfRElTQ09OVDsKKwlmbGFncyB8PSBJT1ZNRl9NTUlPOworCisJZGEgPSBfX2lvbW11X3ZtYXAoZG9tYWluLCBvYmosIGRhLCBzZ3QsIHZhLCBieXRlcywgZmxhZ3MpOworCWlmIChJU19FUlJfVkFMVUUoZGEpKQorCQl2dW5tYXBfc2codmEpOworCisJcmV0dXJuIGRhICsgc2d0YWJsZV9vZmZzZXQoc2d0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9tbXVfdm1hcCk7CisKKy8qKgorICogb21hcF9pb21tdV92dW5tYXAgIC0gIHJlbGVhc2UgdmlydHVhbCBtYXBwaW5nIG9idGFpbmVkIGJ5ICdvbWFwX2lvbW11X3ZtYXAoKScKKyAqIEBvYmo6CW9iamVjdGl2ZSBpb21tdQorICogQGRhOgkJaW9tbXUgZGV2aWNlIHZpcnR1YWwgYWRkcmVzcworICoKKyAqIEZyZWUgdGhlIGlvbW11IHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIHN0YXJ0aW5nIGF0CisgKiBAZGEsIHdoaWNoIHdhcyByZXR1cm5lZCBieSAnb21hcF9pb21tdV92bWFwKCknLgorICovCitzdHJ1Y3Qgc2dfdGFibGUgKgorb21hcF9pb21tdV92dW5tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEpCit7CisJc3RydWN0IHNnX3RhYmxlICpzZ3Q7CisJLyoKKwkgKiAnc2d0JyBpcyBhbGxvY2F0ZWQgYmVmb3JlICdvbWFwX2lvbW11X3ZtYWxsb2MoKScgaXMgY2FsbGVkLgorCSAqIEp1c3QgcmV0dXJucyAnc2d0JyB0byB0aGUgY2FsbGVyIHRvIGZyZWUKKwkgKi8KKwlkYSAmPSBQQUdFX01BU0s7CisJc2d0ID0gdW5tYXBfdm1fYXJlYShkb21haW4sIG9iaiwgZGEsIHZ1bm1hcF9zZywKKwkJCQkJSU9WTUZfRElTQ09OVCB8IElPVk1GX01NSU8pOworCWlmICghc2d0KQorCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IE5vIHNndFxuIiwgX19mdW5jX18pOworCXJldHVybiBzZ3Q7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2lvbW11X3Z1bm1hcCk7CisKKy8qKgorICogb21hcF9pb21tdV92bWFsbG9jICAtICAoZCktKHApLSh2KSBhZGRyZXNzIGFsbG9jYXRvciBhbmQgbWFwcGVyCisgKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKKyAqIEBkYToJCWNvbnRpZ3VvdXMgaW9tbXUgdmlydHVhbCBtZW1vcnkKKyAqIEBieXRlczoJYWxsb2NhdGlvbiBzaXplCisgKiBAZmxhZ3M6CWlvdm1hIGFuZCBwYWdlIHByb3BlcnR5CisgKgorICogQWxsb2NhdGUgQGJ5dGVzIGxpbmVhcmx5IGFuZCBjcmVhdGVzIDEtbi0xIG1hcHBpbmcgYW5kIHJldHVybnMKKyAqIEBkYSBhZ2Fpbiwgd2hpY2ggbWlnaHQgYmUgYWRqdXN0ZWQgaWYgJ0lPVk1GX0RBX0ZJWEVEJyBpcyBub3Qgc2V0LgorICovCit1MzIKK29tYXBfaW9tbXVfdm1hbGxvYyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSwKKwkJCQkJCXNpemVfdCBieXRlcywgdTMyIGZsYWdzKQoreworCXZvaWQgKnZhOworCXN0cnVjdCBzZ190YWJsZSAqc2d0OworCisJaWYgKCFvYmogfHwgIW9iai0+ZGV2IHx8ICFieXRlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlieXRlcyA9IFBBR0VfQUxJR04oYnl0ZXMpOworCisJdmEgPSB2bWFsbG9jKGJ5dGVzKTsKKwlpZiAoIXZhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZsYWdzIHw9IElPVk1GX0RJU0NPTlQ7CisJZmxhZ3MgfD0gSU9WTUZfQUxMT0M7CisKKwlzZ3QgPSBzZ3RhYmxlX2FsbG9jKGJ5dGVzLCBmbGFncywgZGEsIDApOworCWlmIChJU19FUlIoc2d0KSkgeworCQlkYSA9IFBUUl9FUlIoc2d0KTsKKwkJZ290byBlcnJfc2d0X2FsbG9jOworCX0KKwlzZ3RhYmxlX2ZpbGxfdm1hbGxvYyhzZ3QsIHZhKTsKKworCWRhID0gX19pb21tdV92bWFwKGRvbWFpbiwgb2JqLCBkYSwgc2d0LCB2YSwgYnl0ZXMsIGZsYWdzKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKGRhKSkKKwkJZ290byBlcnJfaW9tbXVfdm1hcDsKKworCXJldHVybiBkYTsKKworZXJyX2lvbW11X3ZtYXA6CisJc2d0YWJsZV9kcmFpbl92bWFsbG9jKHNndCk7CisJc2d0YWJsZV9mcmVlKHNndCk7CitlcnJfc2d0X2FsbG9jOgorCXZmcmVlKHZhKTsKKwlyZXR1cm4gZGE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2lvbW11X3ZtYWxsb2MpOworCisvKioKKyAqIG9tYXBfaW9tbXVfdmZyZWUgIC0gIHJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCBieSAnb21hcF9pb21tdV92bWFsbG9jKCknCisgKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKKyAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBGcmVlcyB0aGUgaW9tbXUgdmlydHVhbGx5IGNvbnRpbnVvdXMgbWVtb3J5IGFyZWEgc3RhcnRpbmcgYXQKKyAqIEBkYSwgYXMgb2J0YWluZWQgZnJvbSAnb21hcF9pb21tdV92bWFsbG9jKCknLgorICovCit2b2lkIG9tYXBfaW9tbXVfdmZyZWUoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCQkJCQljb25zdCB1MzIgZGEpCit7CisJc3RydWN0IHNnX3RhYmxlICpzZ3Q7CisKKwlzZ3QgPSB1bm1hcF92bV9hcmVhKGRvbWFpbiwgb2JqLCBkYSwgdmZyZWUsCisJCQkJCQlJT1ZNRl9ESVNDT05UIHwgSU9WTUZfQUxMT0MpOworCWlmICghc2d0KQorCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IE5vIHNndFxuIiwgX19mdW5jX18pOworCXNndGFibGVfZnJlZShzZ3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF9pb21tdV92ZnJlZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGlvdm1tX2luaXQodm9pZCkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nIGZsYWdzID0gU0xBQl9IV0NBQ0hFX0FMSUdOOworCXN0cnVjdCBrbWVtX2NhY2hlICpwOworCisJcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpb3ZtX2FyZWFfY2FjaGUiLCBzaXplb2Yoc3RydWN0IGlvdm1fc3RydWN0KSwgMCwKKwkJCSAgICAgIGZsYWdzLCBOVUxMKTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCWlvdm1fYXJlYV9jYWNoZXAgPSBwOworCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChpb3ZtbV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGlvdm1tX2V4aXQodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaW92bV9hcmVhX2NhY2hlcCk7Cit9Cittb2R1bGVfZXhpdChpb3ZtbV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJvbWFwIGlvbW11OiBzaW1wbGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIG1hbmFnZW1lbnQiKTsKK01PRFVMRV9BVVRIT1IoIkhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9LY29uZmlnIGIvZHJpdmVycy9pc2RuL0tjb25maWcKaW5kZXggNGZiNjAxNi4uYTIzM2VkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL0tjb25maWcKQEAgLTUsNyArNSw3IEBACiBtZW51Y29uZmlnIElTRE4KIAlib29sICJJU0ROIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVQKLQlkZXBlbmRzIG9uICFTMzkwCisJZGVwZW5kcyBvbiAhUzM5MCAmJiAhVU1MCiAJLS0taGVscC0tLQogCSAgSVNETiAoIkludGVncmF0ZWQgU2VydmljZXMgRGlnaXRhbCBOZXR3b3JrIiwgY2FsbGVkIFJOSVMgaW4gRnJhbmNlKQogCSAgaXMgYSBmdWxseSBkaWdpdGFsIHRlbGVwaG9uZSBzZXJ2aWNlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZvaWNlIGFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jIGIvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jCmluZGV4IGVhMmRmZjYuLjhkNTFjZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpX3Byb2MuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaV9wcm9jLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBjaGFyICpzdGF0ZTJzdHIodW5zaWduZWQgc2hvcnQgc3RhdGUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9hc3luY2RhdGEuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jCmluZGV4IGMzYjFkYzMuLmZkZGFlNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAiZ2lnYXNldC5oIgogI2luY2x1ZGUgPGxpbnV4L2NyYy1jY2l0dC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKiBjaGVjayBpZiBieXRlIG11c3QgYmUgc3R1ZmZlZC9lc2NhcGVkCiAgKiBJJ20gbm90IHN1cmUgd2hpY2ggZGF0YSBzaG91bGQgYmUgZW5jb2RlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NhcGkuYwppbmRleCA2NThlNzVmLi42ZDVjZWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9jYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY2FwaS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpbGxpLmg+CiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpY21kLmg+CiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpdXRpbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKiBtaXNzaW5nIGZyb20ga2VybmVsY2FwaS5oICovCiAjZGVmaW5lIENhcGlOY3BpTm90U3VwcG9ydGVkQnlQcm90b2NvbAkweDAwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2R1bW15bGwuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2R1bW15bGwuYwppbmRleCBiZDBiMWVhLi4xOWIxYzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9kdW1teWxsLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZHVtbXlsbC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZ2lnYXNldC5oIgogCiB2b2lkIGdpZ2FzZXRfc2tiX3NlbnQoc3RydWN0IGJjX3N0YXRlICpiY3MsIHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZXYtbGF5ZXIuYwppbmRleCBiYTc0NjQ2Li42ZDEyNjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2V2LWxheWVyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJnaWdhc2V0LmgiCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2k0bC5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMKaW5kZXggOWJlYzhiOS4uMDQyMzFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgImdpZ2FzZXQuaCIKICNpbmNsdWRlIDxsaW51eC9pc2RuaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2RlZmluZSBTQlVGU0laRQk0MDk2CS8qIHNrX2J1ZmYgcGF5bG9hZCBzaXplICovCiAjZGVmaW5lIFRSQU5TQlVGU0laRQk3NjgJLyogYnl0ZXMgcGVyIHNrYiBmb3IgdHJhbnNwYXJlbnQgcmVjZWl2ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYwppbmRleCBlMzUwNThiLi5lZTBhNTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImdpZ2FzZXQuaCIKICNpbmNsdWRlIDxsaW51eC9naWdhc2V0X2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qKiogb3VyIGlvY3RscyAqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlzYXIuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlzYXIuYwppbmRleCBkMTNmYTViLi43MDM0YWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pc2FyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaXNhci5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbUlTRE5ody5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImlzYXIuaCIKIAogI2RlZmluZSBJU0FSX1JFVgkiMi4xIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2NhbGxjLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY2FsbGMuYwppbmRleCAzN2U2ODVlLi5jNDg5N2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvY2FsbGMuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY2FsbGMuYwpAQCAtNjUsNyArNjUsNyBAQAogCXJldHVybiAoc3RydWN0IElzZG5DYXJkU3RhdGUgKikgMDsKIH0KIAotc3RhdGljIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDMsIDQpKSkgdm9pZAorc3RhdGljIF9fcHJpbnRmKDMsIDQpIHZvaWQKIGxpbmtfZGVidWcoc3RydWN0IENoYW5uZWwgKmNoYW5wLCBpbnQgZGlyZWN0aW9uLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CkBAIC0xMDY4LDcgKzEwNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKSB2b2lkCitzdGF0aWMgX19wcmludGYoMiwgMykgdm9pZAogY2FsbGNfZGVidWcoc3RydWN0IEZzbUluc3QgKmZpLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaCBiL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oCmluZGV4IDBhNWM0MmEuLmFmZjQ1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oCkBAIC0xMjg3LDkgKzEyODcsOSBAQAogCiBpbnQgSGlTYXhfY29tbWFuZChpc2RuX2N0cmwgKiBpYyk7CiBpbnQgSGlTYXhfd3JpdGVidWZfc2tiKGludCBpZCwgaW50IGNoYW4sIGludCBhY2ssIHN0cnVjdCBza19idWZmICpza2IpOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKQorX19wcmludGYoMywgNCkKIHZvaWQgSGlTYXhfcHV0c3RhdHVzKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgY2hhciAqaGVhZCwgY2hhciAqZm10LCAuLi4pOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgMCkpKQorX19wcmludGYoMywgMCkKIHZvaWQgVkhpU2F4X3B1dHN0YXR1cyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGNoYXIgKmhlYWQsIGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKIHZvaWQgSGlTYXhfcmVwb3J0Y2FyZChpbnQgY2FyZG5yLCBpbnQgc2VsKTsKIGludCBRdWlja0hleChjaGFyICp0eHQsIHVfY2hhciAqIHAsIGludCBjbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMS5oIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMS5oCmluZGV4IDQyNWQ4NjEuLjY2ZGRjYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDEuaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwxLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNkZWZpbmUgQl9YTVRCVUZSRUFEWQkxCiAjZGVmaW5lIEJfQUNLUEVORElORwkyCiAKLV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK19fcHJpbnRmKDIsIDMpCiB2b2lkIGRlYnVnbDEoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBjaGFyICpmbXQsIC4uLik7CiB2b2lkIERDaGFubmVsX3Byb2NfeG10KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyk7CiB2b2lkIERDaGFubmVsX3Byb2NfcmN2KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwzLmMKaW5kZXggYWQyOTFmMi4uMWMyNGU0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDMuYwpAQCAtNjYsNyArNjYsNyBAQAogCSJFVl9USU1FT1VUIiwKIH07CiAKLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpIHZvaWQKK3N0YXRpYyBfX3ByaW50ZigyLCAzKSB2b2lkCiBsM21fZGVidWcoc3RydWN0IEZzbUluc3QgKmZpLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvbDNkc3MxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvbDNkc3MxLmMKaW5kZXggYjBkOWFiMS4uNmE4YWNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2wzZHNzMS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9sM2RzczEuYwpAQCAtMzUzLDcgKzM1Myw3IEBACiAJCQkgICAgICAgICB7IGwzZHNzMV9kdW1teV9pbnZva2Uoc3QsIGNyLCBpZCwgaWRlbnQsIHAsIG5sZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAotI2lmZGVmIEhJU0FYX0RFX0FPQworI2lmZGVmIENPTkZJR19ERV9BT0MKIAkJCXsKIAogI2RlZmluZSBGT08xKHMsYSxiKSBcCkBAIC00MjIsOSArNDIyLDkgQEAKICN1bmRlZiBGT08xCiAKIAkJCX0KLSNlbHNlICAvKiBub3QgSElTQVhfREVfQU9DICovCisjZWxzZSAgLyogbm90IENPTkZJR19ERV9BT0MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGwzX2RlYnVnKHN0LCAiaW52b2tlIGJyZWFrIik7Ci0jZW5kaWYgLyogbm90IEhJU0FYX0RFX0FPQyAqLworI2VuZGlmIC8qIG5vdCBDT05GSUdfREVfQU9DICovCiAJCQlicmVhazsKIAkJY2FzZSAyOgkvKiByZXR1cm4gcmVzdWx0ICovCiAJCQkgLyogaWYgbm8gcHJvY2VzcyBhdmFpbGFibGUgaGFuZGxlIHNlcGFyYXRlbHkgKi8gCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX2QuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfZC5jCmluZGV4IDQ0MDgyNjMuLmRiMjQ3YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfZC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfZC5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAl7U1RfTDFfRjgsIEVWX0lORF9SU1ksICAgICAgICAgICBsMV9pZ25vcmV9LAogfTsKIAotc3RhdGljIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK3N0YXRpYyBfX3ByaW50ZigyLCAzKQogdm9pZCBsMW1fZGVidWcoc3RydWN0IEZzbUluc3QgKmZpLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CkBAIC0yNzAsNyArMjcwLDcgQEAKIAkiRVZfRE9VVF9VTkRFUlJVTiIsCiB9OwogCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQorc3RhdGljIF9fcHJpbnRmKDIsIDMpCiB2b2lkIGRvdXRfZGVidWcoc3RydWN0IEZzbUluc3QgKmZpLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMKaW5kZXggZTU1NDZjYi4uMmMyNmI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYwpAQCAtNzUwLDYgKzc1MCw3IEBACiAgKiBzdXBwbGVtZW50YXJ5IHNlcnZpY2UgKENBUEkgMi4wIHBhcnQgSUlJKQogICovCiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpY21kLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIGludAogaXNkbl90dHlfY2FwaV9mYWNpbGl0eShjYXBpX21zZyAqY20pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi9jbG9jay5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2Nsb2NrLmMKaW5kZXggMWZhNjI5Yi4uNzQxOGYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2Nsb2NrLmMKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL2Nsb2NrLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21JU0ROaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJjb3JlLmgiCiAKIHN0YXRpYyB1X2ludCAqZGVidWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2F1ZGlvLmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2F1ZGlvLmMKaW5kZXggOWM3YzY0NS4uYjhmMThiZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfYXVkaW8uYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2F1ZGlvLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21JU0ROaWYuaD4KICNpbmNsdWRlIDxsaW51eC9tSVNETmRzcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJkc3AuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jCmluZGV4IDYyMWYzMTAuLmI2YzlhNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfcGlwZWxpbmUuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX3BpcGVsaW5lLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tSVNETmlmLmg+CiAjaW5jbHVkZSA8bGludXgvbUlTRE5kc3AuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkc3AuaCIKICNpbmNsdWRlICJkc3BfaHdlYy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vc29ja2V0LmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vc29ja2V0LmMKaW5kZXggOGUzMjUyMi4uNzM4ZWE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL3NvY2tldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9zb2NrZXQuYwpAQCAtMTcsNiArMTcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbUlTRE5pZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJjb3JlLmgiCiAKIHN0YXRpYyB1X2ludAkqZGVidWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvS2NvbmZpZyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCmluZGV4IDgwN2M4NzUuLmZmMjAzYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCkBAIC0xMTMsMTQgKzExMyw2IEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUENFbmdpbmVzIFdSQVAgcHJvZ3JhbW1hYmxlIExFRHMuCiAKLWNvbmZpZyBMRURTX0FMSVgyCi0JdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciBBTElYLjIgYW5kIEFMSVguMyBzZXJpZXMiCi0JZGVwZW5kcyBvbiBMRURTX0NMQVNTCi0JZGVwZW5kcyBvbiBYODYgJiYgIUdQSU9fQ1M1NTM1ICYmICFDUzU1MzVfR1BJTwotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFBDRW5naW5lcyBBTElYLjIgYW5kIEFMSVguMyBMRURzLgotCSAgWW91IGhhdmUgdG8gc2V0IGxlZHMtYWxpeDIuZm9yY2U9MSBmb3IgYm9hcmRzIHdpdGggQXdhcmQgQklPUy4KLQogY29uZmlnIExFRFNfQ09CQUxUX1FVQkUKIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIHRoZSBDb2JhbHQgUXViZSBzZXJpZXMgZnJvbnQgTEVEIgogCWRlcGVuZHMgb24gTEVEU19DTEFTUwpAQCAtMzgzLDYgKzM3NSwxOCBAQAogCSAgY2Fubm90IGJlIHVzZWQuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGhhcmR3YXJlIGJsaW5raW5nIHdpdGggYW4gb24rb2ZmCiAJICBwZXJpb2QgZnJvbSA2Mm1zIHRvIDEyNXMuIFNheSBZIHRvIGVuYWJsZSBMRURzIG9uIHRoZSBIUCBpUEFRIGh4NDcwMC4KIAorY29uZmlnIExFRFNfUkVORVNBU19UUFUKKwlib29sICJMRUQgc3VwcG9ydCBmb3IgUmVuZXNhcyBUUFUiCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIEhBVkVfQ0xLICYmIEdFTkVSSUNfR1BJTworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYnVpbGQgb2YgdGhlIExFRCBUUFUgcGxhdGZvcm0gZHJpdmVyLAorCSAgc3VpdGFibGUgdG8gZHJpdmUgYW55IFRQVSBjaGFubmVsIG9uIG5ld2VyIFJlbmVzYXMgU29Dcy4KKwkgIFRoZSBkcml2ZXIgY29udHJvbHMgdGhlIEdQSU8gcGluIGNvbm5lY3RlZCB0byB0aGUgTEVEIHZpYQorCSAgdGhlIEdQSU8gZnJhbWV3b3JrIGFuZCBleHBlY3RzIHRoZSBMRUQgdG8gYmUgY29ubmVjdGVkIHRvCisJICBhIHBpbiB0aGF0IGNhbiBiZSBkcml2ZW4gaW4gYm90aCBHUElPIG1vZGUgYW5kIHVzaW5nIFRQVQorCSAgcGluIGZ1bmN0aW9uLiBUaGUgbGF0dGVyIHRvIHN1cHBvcnQgYnJpZ2h0bmVzcyBjb250cm9sLgorCSAgQnJpZ2h0bmVzcyBjb250cm9sIGlzIHN1cHBvcnRlZCBidXQgaGFyZHdhcmUgYmxpbmtpbmcgaXMgbm90LgorCiBjb25maWcgTEVEU19UUklHR0VSUwogCWJvb2wgIkxFRCBUcmlnZ2VyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBMRURTX0NMQVNTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKaW5kZXggYmJmZDJlMy4uZTRmNmJmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQpAQCAtMTYsNyArMTYsNiBAQAogb2JqLSQoQ09ORklHX0xFRFNfTkVUNDhYWCkJCSs9IGxlZHMtbmV0NDh4eC5vCiBvYmotJChDT05GSUdfTEVEU19ORVQ1NTAxKQkJKz0gbGVkcy1uZXQ1NTAxLm8KIG9iai0kKENPTkZJR19MRURTX1dSQVApCQkJKz0gbGVkcy13cmFwLm8KLW9iai0kKENPTkZJR19MRURTX0FMSVgyKQkJKz0gbGVkcy1hbGl4Mi5vCiBvYmotJChDT05GSUdfTEVEU19DT0JBTFRfUVVCRSkJCSs9IGxlZHMtY29iYWx0LXF1YmUubwogb2JqLSQoQ09ORklHX0xFRFNfQ09CQUxUX1JBUSkJCSs9IGxlZHMtY29iYWx0LXJhcS5vCiBvYmotJChDT05GSUdfTEVEU19TVU5GSVJFKQkJKz0gbGVkcy1zdW5maXJlLm8KQEAgLTQzLDYgKzQyLDcgQEAKIG9iai0kKENPTkZJR19MRURTX05TMikJCQkrPSBsZWRzLW5zMi5vCiBvYmotJChDT05GSUdfTEVEU19ORVRYQklHKQkJKz0gbGVkcy1uZXR4YmlnLm8KIG9iai0kKENPTkZJR19MRURTX0FTSUMzKQkJKz0gbGVkcy1hc2ljMy5vCitvYmotJChDT05GSUdfTEVEU19SRU5FU0FTX1RQVSkJCSs9IGxlZHMtcmVuZXNhcy10cHUubwogCiAjIExFRCBTUEkgRHJpdmVycwogb2JqLSQoQ09ORklHX0xFRFNfREFDMTI0UzA4NSkJCSs9IGxlZHMtZGFjMTI0czA4NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvZGVsbC1sZWQuYyBiL2RyaXZlcnMvbGVkcy9kZWxsLWxlZC5jCmluZGV4IDUyNTkwMjkuLmU1YzU3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9kZWxsLWxlZC5jCisrKyBiL2RyaXZlcnMvbGVkcy9kZWxsLWxlZC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkxvdWlzIERhdmlzL0ppbSBEYWlsZXkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRGVsbCBMRUQgQ29udHJvbCBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYyBiL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYwppbmRleCBkYzNkM2Q4Li42NjFiNjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkLWNsYXNzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy5jCkBAIC0yNjcsOSArMjY3LDE0IEBACiAJCSAgIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLAogCQkgICB1bnNpZ25lZCBsb25nICpkZWxheV9vZmYpCiB7CisJZGVsX3RpbWVyX3N5bmMoJmxlZF9jZGV2LT5ibGlua190aW1lcik7CisKIAlpZiAobGVkX2NkZXYtPmJsaW5rX3NldCAmJgotCSAgICAhbGVkX2NkZXYtPmJsaW5rX3NldChsZWRfY2RldiwgZGVsYXlfb24sIGRlbGF5X29mZikpCisJICAgICFsZWRfY2Rldi0+Ymxpbmtfc2V0KGxlZF9jZGV2LCBkZWxheV9vbiwgZGVsYXlfb2ZmKSkgeworCQlsZWRfY2Rldi0+YmxpbmtfZGVsYXlfb24gPSAqZGVsYXlfb247CisJCWxlZF9jZGV2LT5ibGlua19kZWxheV9vZmYgPSAqZGVsYXlfb2ZmOwogCQlyZXR1cm47CisJfQogCiAJLyogYmxpbmsgd2l0aCAxIEh6IGFzIGRlZmF1bHQgaWYgbm90aGluZyBzcGVjaWZpZWQgKi8KIAlpZiAoISpkZWxheV9vbiAmJiAhKmRlbGF5X29mZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWQtdHJpZ2dlcnMuYyBiL2RyaXZlcnMvbGVkcy9sZWQtdHJpZ2dlcnMuYwppbmRleCA0YmViYWU3Li42ZjFmZjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkLXRyaWdnZXJzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZC10cmlnZ2Vycy5jCkBAIC0yNjEsOSArMjYxLDEyIEBACiAJaWYgKHRyaWdnZXIpIHsKIAkJdHJpZ2dlci0+bmFtZSA9IG5hbWU7CiAJCWVyciA9IGxlZF90cmlnZ2VyX3JlZ2lzdGVyKHRyaWdnZXIpOwotCQlpZiAoZXJyIDwgMCkKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKHRyaWdnZXIpOworCQkJdHJpZ2dlciA9IE5VTEw7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJMRUQgdHJpZ2dlciAlcyBmYWlsZWQgdG8gcmVnaXN0ZXIiCiAJCQkJIiAoJWQpXG4iLCBuYW1lLCBlcnIpOworCQl9CiAJfSBlbHNlCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkxFRCB0cmlnZ2VyICVzIGZhaWxlZCB0byByZWdpc3RlciIKIAkJCSIgKG5vIG1lbW9yeSlcbiIsIG5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtODhwbTg2MHguYyBiL2RyaXZlcnMvbGVkcy9sZWRzLTg4cG04NjB4LmMKaW5kZXggMGQ0YzE2Ni4uMDgxMDYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtODhwbTg2MHguYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy04OHBtODYweC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC84OHBtODYweC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIExFRF9QV01fU0hJRlQJCSgzKQogI2RlZmluZSBMRURfUFdNX01BU0sJCSgweDFGKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtYWxpeDIuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFsaXgyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OWZmYWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtYWxpeDIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogTEVEcyBkcml2ZXIgZm9yIFBDRW5naW5lcyBBTElYLjIgYW5kIEFMSVguMwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBDb25zdGFudGluIEJhcmFub3YgPGNvbnN0QG1pbWFzLnJ1PgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotc3RhdGljIGludCBmb3JjZSA9IDA7Ci1tb2R1bGVfcGFyYW0oZm9yY2UsIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhmb3JjZSwgIkFzc3VtZSBzeXN0ZW0gaGFzIEFMSVguMi9BTElYLjMgc3R5bGUgTEVEcyIpOwotCi0jZGVmaW5lIE1TUl9MQkFSX0dQSU8JCTB4NTE0MDAwMEMKLSNkZWZpbmUgQ1M1NTM1X0dQSU9fU0laRQkyNTYKLQotc3RhdGljIHUzMiBncGlvX2Jhc2U7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkaXZpbF9wY2lbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgIFBDSV9ERVZJQ0VfSURfTlNfQ1M1NTM1X0lTQSkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JU0EpIH0sCi0JeyB9IC8qIE5VTEwgZW50cnkgKi8KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZGl2aWxfcGNpKTsKLQotc3RydWN0IGFsaXhfbGVkIHsKLQlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNkZXY7Ci0JdW5zaWduZWQgc2hvcnQgcG9ydDsKLQl1bnNpZ25lZCBpbnQgb25fdmFsdWU7Ci0JdW5zaWduZWQgaW50IG9mZl92YWx1ZTsKLX07Ci0KLXN0YXRpYyB2b2lkIGFsaXhfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKLQkJCSBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCi17Ci0Jc3RydWN0IGFsaXhfbGVkICpsZWRfZGV2ID0KLQkJY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgYWxpeF9sZWQsIGNkZXYpOwotCi0JaWYgKGJyaWdodG5lc3MpCi0JCW91dGwobGVkX2Rldi0+b25fdmFsdWUsIGdwaW9fYmFzZSArIGxlZF9kZXYtPnBvcnQpOwotCWVsc2UKLQkJb3V0bChsZWRfZGV2LT5vZmZfdmFsdWUsIGdwaW9fYmFzZSArIGxlZF9kZXYtPnBvcnQpOwotfQotCi1zdGF0aWMgc3RydWN0IGFsaXhfbGVkIGFsaXhfbGVkc1tdID0gewotCXsKLQkJLmNkZXYgPSB7Ci0JCQkubmFtZSA9ICJhbGl4OjEiLAotCQkJLmJyaWdodG5lc3Nfc2V0ID0gYWxpeF9sZWRfc2V0LAotCQl9LAotCQkucG9ydCA9IDB4MDAsCi0JCS5vbl92YWx1ZSA9IDEgPDwgMjIsCi0JCS5vZmZfdmFsdWUgPSAxIDw8IDYsCi0JfSwKLQl7Ci0JCS5jZGV2ID0gewotCQkJLm5hbWUgPSAiYWxpeDoyIiwKLQkJCS5icmlnaHRuZXNzX3NldCA9IGFsaXhfbGVkX3NldCwKLQkJfSwKLQkJLnBvcnQgPSAweDgwLAotCQkub25fdmFsdWUgPSAxIDw8IDI1LAotCQkub2ZmX3ZhbHVlID0gMSA8PCA5LAotCX0sCi0JewotCQkuY2RldiA9IHsKLQkJCS5uYW1lID0gImFsaXg6MyIsCi0JCQkuYnJpZ2h0bmVzc19zZXQgPSBhbGl4X2xlZF9zZXQsCi0JCX0sCi0JCS5wb3J0ID0gMHg4MCwKLQkJLm9uX3ZhbHVlID0gMSA8PCAyNywKLQkJLm9mZl92YWx1ZSA9IDEgPDwgMTEsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFsaXhfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IGk7Ci0JaW50IHJldDsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFsaXhfbGVkcyk7IGkrKykgewotCQlhbGl4X2xlZHNbaV0uY2Rldi5mbGFncyB8PSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOwotCQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmFsaXhfbGVkc1tpXS5jZGV2KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGZhaWw7Ci0JfQotCXJldHVybiAwOwotCi1mYWlsOgotCXdoaWxlICgtLWkgPj0gMCkKLQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFsaXhfbGVkc1tpXS5jZGV2KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFsaXhfbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWxpeF9sZWRzKTsgaSsrKQotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYWxpeF9sZWRzW2ldLmNkZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbGl4X2xlZF9kcml2ZXIgPSB7Ci0JLnJlbW92ZSA9IGFsaXhfbGVkX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYWxpeF9wcmVzZW50KHVuc2lnbmVkIGxvbmcgYmlvc19waHlzLAotCQkJCWNvbnN0IGNoYXIgKmFsaXhfc2lnLAotCQkJCXNpemVfdCBhbGl4X3NpZ19sZW4pCi17Ci0JY29uc3Qgc2l6ZV90IGJpb3NfbGVuID0gMHgwMDAxMDAwMDsKLQljb25zdCBjaGFyICpiaW9zX3ZpcnQ7Ci0JY29uc3QgY2hhciAqc2Nhbl9lbmQ7Ci0JY29uc3QgY2hhciAqcDsKLQljaGFyIG5hbWVbNjRdOwotCi0JaWYgKGZvcmNlKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGZvcmNlZCB0byBza2lwIEJJT1MgdGVzdCwgIgotCQkgICAgICAgImFzc3VtZSBzeXN0ZW0gaGFzIEFMSVguMiBzdHlsZSBMRURzXG4iLAotCQkgICAgICAgS0JVSUxEX01PRE5BTUUpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQliaW9zX3ZpcnQgPSBwaHlzX3RvX3ZpcnQoYmlvc19waHlzKTsKLQlzY2FuX2VuZCA9IGJpb3NfdmlydCArIGJpb3NfbGVuIC0gKGFsaXhfc2lnX2xlbiArIDIpOwotCWZvciAocCA9IGJpb3NfdmlydDsgcCA8IHNjYW5fZW5kOyBwKyspIHsKLQkJY29uc3QgY2hhciAqdGFpbDsKLQkJY2hhciAqYTsKLQotCQlpZiAobWVtY21wKHAsIGFsaXhfc2lnLCBhbGl4X3NpZ19sZW4pICE9IDApCi0JCQljb250aW51ZTsKLQotCQltZW1jcHkobmFtZSwgcCwgc2l6ZW9mKG5hbWUpKTsKLQotCQkvKiByZW1vdmUgdGhlIGZpcnN0IFwwIGNoYXJhY3RlciBmcm9tIHN0cmluZyAqLwotCQlhID0gc3RyY2hyKG5hbWUsICdcMCcpOwotCQlpZiAoYSkKLQkJCSphID0gJyAnOwotCi0JCS8qIGN1dCB0aGUgc3RyaW5nIGF0IGEgbmV3bGluZSAqLwotCQlhID0gc3RyY2hyKG5hbWUsICdccicpOwotCQlpZiAoYSkKLQkJCSphID0gJ1wwJzsKLQotCQl0YWlsID0gcCArIGFsaXhfc2lnX2xlbjsKLQkJaWYgKCh0YWlsWzBdID09ICcyJyB8fCB0YWlsWzBdID09ICczJykpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiJXM6IHN5c3RlbSBpcyByZWNvZ25pemVkIGFzIFwiJXNcIlxuIiwKLQkJCSAgICAgICBLQlVJTERfTU9ETkFNRSwgbmFtZSk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQotc3RhdGljIGludCBfX2luaXQgYWxpeF9wY2lfbGVkX2luaXQodm9pZCkKLXsKLQl1MzIgbG93LCBoaTsKLQotCWlmIChwY2lfZGV2X3ByZXNlbnQoZGl2aWxfcGNpKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgS0JVSUxEX01PRE5BTUUiOiBESVZJTCBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBHcmFiIHRoZSBHUElPIEkvTyByYW5nZSAqLwotCXJkbXNyKE1TUl9MQkFSX0dQSU8sIGxvdywgaGkpOwotCi0JLyogQ2hlY2sgdGhlIG1hc2sgYW5kIHdoZXRoZXIgR1BJTyBpcyBlbmFibGVkIChzYW5pdHkgY2hlY2spICovCi0JaWYgKGhpICE9IDB4MDAwMGYwMDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBLQlVJTERfTU9ETkFNRSI6IEdQSU8gbm90IGVuYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBNYXNrIG9mZiB0aGUgSU8gYmFzZSBhZGRyZXNzICovCi0JZ3Bpb19iYXNlID0gbG93ICYgMHgwMDAwZmYwMDsKLQotCWlmICghcmVxdWVzdF9yZWdpb24oZ3Bpb19iYXNlLCBDUzU1MzVfR1BJT19TSVpFLCBLQlVJTERfTU9ETkFNRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FIjogY2FuJ3QgYWxsb2NhdGUgSS9PIGZvciBHUElPXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogU2V0IEdQSU8gZnVuY3Rpb24gdG8gb3V0cHV0ICovCi0Jb3V0bCgxIDw8IDYsIGdwaW9fYmFzZSArIDB4MDQpOwotCW91dGwoMSA8PCA5LCBncGlvX2Jhc2UgKyAweDg0KTsKLQlvdXRsKDEgPDwgMTEsIGdwaW9fYmFzZSArIDB4ODQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFsaXhfbGVkX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLQljb25zdCBjaGFyIHRpbnliaW9zX3NpZ1tdID0gIlBDIEVuZ2luZXMgQUxJWC4iOwotCWNvbnN0IGNoYXIgY29yZWJvb3Rfc2lnW10gPSAiUEMgRW5naW5lc1wwQUxJWC4iOwotCi0JaWYgKGFsaXhfcHJlc2VudCgweGYwMDAwLCB0aW55Ymlvc19zaWcsIHNpemVvZih0aW55Ymlvc19zaWcpIC0gMSkgfHwKLQkgICAgYWxpeF9wcmVzZW50KDB4NTAwLCBjb3JlYm9vdF9zaWcsIHNpemVvZihjb3JlYm9vdF9zaWcpIC0gMSkpCi0JCXJldCA9IGFsaXhfcGNpX2xlZF9pbml0KCk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKEtCVUlMRF9NT0ROQU1FLCAtMSwgTlVMTCwgMCk7Ci0JaWYgKCFJU19FUlIocGRldikpIHsKLQkJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhbGl4X2xlZF9kcml2ZXIsIGFsaXhfbGVkX3Byb2JlKTsKLQkJaWYgKHJldCkKLQkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwotCX0gZWxzZQotCQlyZXQgPSBQVFJfRVJSKHBkZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFsaXhfbGVkX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWxpeF9sZWRfZHJpdmVyKTsKLQlyZWxlYXNlX3JlZ2lvbihncGlvX2Jhc2UsIENTNTUzNV9HUElPX1NJWkUpOwotfQotCi1tb2R1bGVfaW5pdChhbGl4X2xlZF9pbml0KTsKLW1vZHVsZV9leGl0KGFsaXhfbGVkX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJDb25zdGFudGluIEJhcmFub3YgPGNvbnN0QG1pbWFzLnJ1PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0VuZ2luZXMgQUxJWC4yIGFuZCBBTElYLjMgTEVEIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtYXNpYzMuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFzaWMzLmMKaW5kZXggMjJmODQ3Yy4uNDhkOWZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtYXNpYzMuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1hc2ljMy5jCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tZmQvYXNpYzMuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKgogICoJVGhlIEhUQyBBU0lDMyBMRUQgR1BJT3MgYXJlIGlucHV0cywgbm90IG91dHB1dHMuCkBAIC0xMDcsOSArMTA4LDEwIEBACiAJfQogCiAJbGVkLT5jZGV2LT5uYW1lID0gbGVkLT5uYW1lOwotCWxlZC0+Y2Rldi0+ZGVmYXVsdF90cmlnZ2VyID0gbGVkLT5kZWZhdWx0X3RyaWdnZXI7CisJbGVkLT5jZGV2LT5mbGFncyA9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUU7CiAJbGVkLT5jZGV2LT5icmlnaHRuZXNzX3NldCA9IGJyaWdodG5lc3Nfc2V0OwogCWxlZC0+Y2Rldi0+Ymxpbmtfc2V0ID0gYmxpbmtfc2V0OworCWxlZC0+Y2Rldi0+ZGVmYXVsdF90cmlnZ2VyID0gbGVkLT5kZWZhdWx0X3RyaWdnZXI7CiAKIAlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgbGVkLT5jZGV2KTsKIAlpZiAocmV0IDwgMCkKQEAgLTEzNiwxMiArMTM4LDQ0IEBACiAJcmV0dXJuIG1mZF9jZWxsX2Rpc2FibGUocGRldik7CiB9CiAKK3N0YXRpYyBpbnQgYXNpYzNfbGVkX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwljb25zdCBzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSBtZmRfZ2V0X2NlbGwocGRldik7CisJaW50IHJldDsKKworCXJldCA9IDA7CisJaWYgKGNlbGwtPnN1c3BlbmQpCisJCXJldCA9ICgqY2VsbC0+c3VzcGVuZCkocGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFzaWMzX2xlZF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwljb25zdCBzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSBtZmRfZ2V0X2NlbGwocGRldik7CisJaW50IHJldDsKKworCXJldCA9IDA7CisJaWYgKGNlbGwtPnJlc3VtZSkKKwkJcmV0ID0gKCpjZWxsLT5yZXN1bWUpKHBkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGFzaWMzX2xlZF9wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBhc2ljM19sZWRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFzaWMzX2xlZF9yZXN1bWUsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhc2ljM19sZWRfZHJpdmVyID0gewogCS5wcm9iZQkJPSBhc2ljM19sZWRfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhc2ljM19sZWRfcmVtb3ZlKSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAibGVkcy1hc2ljMyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmYXNpYzNfbGVkX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtYXRtZWwtcHdtLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1hdG1lbC1wd20uYwppbmRleCBjOTQxZDkwNi4uMTA5Yzg3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtYXRtZWwtcHdtLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtYXRtZWwtcHdtLmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9hdG1lbF9wd20uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogc3RydWN0IHB3bWxlZCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1jb2JhbHQtcmFxLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1jb2JhbHQtcmFxLmMKaW5kZXggNDM4ZDQ4My4uYWFjMWMwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtY29iYWx0LXJhcS5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWNvYmFsdC1yYXEuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2RlZmluZSBMRURfV0VCCQkweDA0CiAjZGVmaW5lIExFRF9QT1dFUl9PRkYJMHgwOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtZnNnLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1mc2cuYwppbmRleCBkMTFkMDViLi40OWFjZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1mc2cuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1mc2cuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMKaW5kZXggM2Q4YmMzMi4uMzk5YTg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCkBAIC0xMjEsNyArMTIyLDcgQEAKIAl9CiAJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IGdwaW9fbGVkX3NldDsKIAlpZiAodGVtcGxhdGUtPmRlZmF1bHRfc3RhdGUgPT0gTEVEU19HUElPX0RFRlNUQVRFX0tFRVApCi0JCXN0YXRlID0gISFncGlvX2dldF92YWx1ZShsZWRfZGF0LT5ncGlvKSBeIGxlZF9kYXQtPmFjdGl2ZV9sb3c7CisJCXN0YXRlID0gISFncGlvX2dldF92YWx1ZV9jYW5zbGVlcChsZWRfZGF0LT5ncGlvKSBeIGxlZF9kYXQtPmFjdGl2ZV9sb3c7CiAJZWxzZQogCQlzdGF0ZSA9ICh0ZW1wbGF0ZS0+ZGVmYXVsdF9zdGF0ZSA9PSBMRURTX0dQSU9fREVGU1RBVEVfT04pOwogCWxlZF9kYXQtPmNkZXYuYnJpZ2h0bmVzcyA9IHN0YXRlID8gTEVEX0ZVTEwgOiBMRURfT0ZGOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbG0zNTMwLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1sbTM1MzAuYwppbmRleCAzZGQ3MDkwLi4wNjMwZTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1sbTM1MzAuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1sbTM1MzAuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xlZC1sbTM1MzAuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIExNMzUzMF9MRURfREVWICJsY2QtYmFja2xpZ2h0IgogI2RlZmluZSBMTTM1MzBfTkFNRSAibG0zNTMwLWxlZCIKQEAgLTQyMSw3ICs0MjIsNiBAQAogZXJyX3JlZ19pbml0OgogCXJlZ3VsYXRvcl9wdXQoZHJ2ZGF0YS0+cmVndWxhdG9yKTsKIGVycl9yZWd1bGF0b3JfZ2V0OgotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOwogCWtmcmVlKGRydmRhdGEpOwogZXJyX291dDoKIAlyZXR1cm4gZXJyOwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTM1MzBfaTJjX2RyaXZlciA9IHsKIAkucHJvYmUgPSBsbTM1MzBfcHJvYmUsCi0JLnJlbW92ZSA9IGxtMzUzMF9yZW1vdmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGxtMzUzMF9yZW1vdmUpLAogCS5pZF90YWJsZSA9IGxtMzUzMF9pZCwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IExNMzUzMF9OQU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbG9jb21vLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1sb2NvbW8uYwppbmRleCAxZjdjMTBmLi44MGJhMDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1sb2NvbW8uYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1sb2NvbW8uYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIxLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYwppbmRleCA5ZmMxMjJjLi5jYjY0MWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYwpAQCAtOTcsNiArOTcsOSBAQAogLyogU3RhdHVzICovCiAjZGVmaW5lIExQNTUyMV9FWFRfQ0xLX1VTRUQJCTB4MDgKIAorLyogZGVmYXVsdCBSIGNoYW5uZWwgY3VycmVudCByZWdpc3RlciB2YWx1ZSAqLworI2RlZmluZSBMUDU1MjFfUkVHX1JfQ1VSUl9ERUZBVUxUCTB4QUYKKwogc3RydWN0IGxwNTUyMV9lbmdpbmUgewogCWludAkJaWQ7CiAJdTgJCW1vZGU7CkBAIC0xNzUsMTQgKzE3OCwxNCBAQAogCQltb2RlID0gTFA1NTIxX0NNRF9ESVJFQ1Q7CiAKIAlyZXQgPSBscDU1MjFfcmVhZChjbGllbnQsIExQNTUyMV9SRUdfT1BfTU9ERSwgJmVuZ2luZV9zdGF0ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiBzZXQgbW9kZSBvbmx5IGZvciB0aGlzIGVuZ2luZSAqLwogCWVuZ2luZV9zdGF0ZSAmPSB+KGVuZ2luZS0+ZW5naW5lX21hc2spOwogCW1vZGUgJj0gZW5naW5lLT5lbmdpbmVfbWFzazsKIAllbmdpbmVfc3RhdGUgfD0gbW9kZTsKLQlyZXQgfD0gbHA1NTIxX3dyaXRlKGNsaWVudCwgTFA1NTIxX1JFR19PUF9NT0RFLCBlbmdpbmVfc3RhdGUpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gbHA1NTIxX3dyaXRlKGNsaWVudCwgTFA1NTIxX1JFR19PUF9NT0RFLCBlbmdpbmVfc3RhdGUpOwogfQogCiBzdGF0aWMgaW50IGxwNTUyMV9sb2FkX3Byb2dyYW0oc3RydWN0IGxwNTUyMV9lbmdpbmUgKmVuZywgY29uc3QgdTggKnBhdHRlcm4pCkBAIC02NDMsNiArNjQ2LDcgQEAKIAlzdHJ1Y3QgbHA1NTIxX2NoaXAJCSpjaGlwOwogCXN0cnVjdCBscDU1MjFfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CiAJaW50IHJldCwgaSwgbGVkOworCXU4IGJ1ZjsKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghY2hpcCkKQEAgLTY4MSw2ICs2ODUsMjAgQEAKIAkJCQkgICAgICogRXhhY3QgdmFsdWUgaXMgbm90IGF2YWlsYWJsZS4gMTAgLSAyMG1zCiAJCQkJICAgICAqIGFwcGVhcnMgdG8gYmUgZW5vdWdoIGZvciByZXNldC4KIAkJCQkgICAgICovCisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBjaGlwIGlzIHJlc2V0IGJ5IHJlYWRpbmcgYmFjayB0aGUgciBjaGFubmVsCisJICogY3VycmVudCByZWcuIFRoaXMgaXMgZHVtbXkgcmVhZCBpcyByZXF1aXJlZCBvbiBzb21lIHBsYXRmb3JtcyAtCisJICogb3RoZXJ3aXNlIGZ1cnRoZXIgYWNjZXNzIHRvIHRoZSBSIEcgQiBjaGFubmVscyBpbiB0aGUKKwkgKiBMUDU1MjFfUkVHX0VOQUJMRSByZWdpc3RlciB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QgLSBzdHJhbmdlIQorCSAqLworCWxwNTUyMV9yZWFkKGNsaWVudCwgTFA1NTIxX1JFR19SX0NVUlJFTlQsICZidWYpOworCWlmIChidWYgIT0gTFA1NTIxX1JFR19SX0NVUlJfREVGQVVMVCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImVycm9yIGluIHJlc2V0aW5nIGNoaXBcbiIpOworCQlnb3RvIGZhaWwyOworCX0KKwl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKKwogCXJldCA9IGxwNTUyMV9kZXRlY3QoY2xpZW50KTsKIAogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWx0MzU5My5jIGIvZHJpdmVycy9sZWRzL2xlZHMtbHQzNTkzLmMKaW5kZXggMjU3OTY3OC4uNTNmNjdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtbHQzNTkzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbHQzNTkzLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCBsdDM1OTNfbGVkX2RhdGEgewogCXN0cnVjdCBsZWRfY2xhc3NkZXYgY2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLW1jMTM3ODMuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLW1jMTM3ODMuYwppbmRleCBmMzY5ZTU2Li5iMzM5M2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1tYzEzNzgzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbWMxMzc4My5jCkBAIC0yMSwxMyArMjEsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21jMTM3ODMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWMxM3h4eC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogc3RydWN0IG1jMTM3ODNfbGVkIHsKIAlzdHJ1Y3QgbGVkX2NsYXNzZGV2CWNkZXY7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7Ci0Jc3RydWN0IG1jMTM3ODMJCSptYXN0ZXI7CisJc3RydWN0IG1jMTN4eHgJCSptYXN0ZXI7CiAJZW51bSBsZWRfYnJpZ2h0bmVzcwluZXdfYnJpZ2h0bmVzczsKIAlpbnQJCQlpZDsKIH07CkBAIC0xMTEsMTEgKzExMSwxMSBAQAogCQlicmVhazsKIAl9CiAKLQltYzEzNzgzX2xvY2sobGVkLT5tYXN0ZXIpOworCW1jMTN4eHhfbG9jayhsZWQtPm1hc3Rlcik7CiAKLQltYzEzNzgzX3JlZ19ybXcobGVkLT5tYXN0ZXIsIHJlZywgbWFzaywgdmFsdWUpOworCW1jMTN4eHhfcmVnX3JtdyhsZWQtPm1hc3RlciwgcmVnLCBtYXNrLCB2YWx1ZSk7CiAKLQltYzEzNzgzX3VubG9jayhsZWQtPm1hc3Rlcik7CisJbWMxM3h4eF91bmxvY2sobGVkLT5tYXN0ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBtYzEzNzgzX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCkBAIC0xNzIsMjMgKzE3MiwyMyBAQAogCQlicmVhazsKIAl9CiAKLQltYzEzNzgzX2xvY2sobGVkLT5tYXN0ZXIpOworCW1jMTN4eHhfbG9jayhsZWQtPm1hc3Rlcik7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ19ybXcobGVkLT5tYXN0ZXIsIHJlZywgbWFzayA8PCBzaGlmdCwKKwlyZXQgPSBtYzEzeHh4X3JlZ19ybXcobGVkLT5tYXN0ZXIsIHJlZywgbWFzayA8PCBzaGlmdCwKIAkJCQkJCXZhbHVlIDw8IHNoaWZ0KTsKIAotCW1jMTM3ODNfdW5sb2NrKGxlZC0+bWFzdGVyKTsKKwltYzEzeHh4X3VubG9jayhsZWQtPm1hc3Rlcik7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgbWMxMzc4M19sZWRzX3ByZXBhcmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgbWMxMzc4M19sZWRzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgbWMxMzc4MyAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBtYzEzeHh4X2xlZHNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBtYzEzeHh4ICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJaW50IHJldCA9IDA7CiAJaW50IHJlZyA9IDA7CiAKLQltYzEzNzgzX2xvY2soZGV2KTsKKwltYzEzeHh4X2xvY2soZGV2KTsKIAogCWlmIChwZGF0YS0+ZmxhZ3MgJiBNQzEzNzgzX0xFRF9UQzFIQUxGKQogCQlyZWcgfD0gTUMxMzc4M19MRURfQzFfVEMxSEFMRl9CSVQ7CkBAIC0xOTYsNyArMTk2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfU0xFV0xJTVRDKQogCQlyZWcgfD0gTUMxMzc4M19MRURfQ3hfU0xFV0xJTV9CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzEsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8xLCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yMDYsNyArMjA2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfU0xFV0xJTUJMKQogCQlyZWcgfD0gTUMxMzc4M19MRURfQ3hfU0xFV0xJTV9CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzIsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8yLCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yMTYsNyArMjE2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfVFJJT0RFX1RDMSkKIAkJcmVnIHw9IE1DMTM3ODNfTEVEX0N4X1RSSU9ERV9UQ19CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzMsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8zLCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yMjYsNyArMjI2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfVFJJT0RFX1RDMikKIAkJcmVnIHw9IE1DMTM3ODNfTEVEX0N4X1RSSU9ERV9UQ19CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzQsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF80LCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yMzYsNyArMjM2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfVFJJT0RFX1RDMykKIAkJcmVnIHw9IE1DMTM3ODNfTEVEX0N4X1RSSU9ERV9UQ19CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzUsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF81LCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yNTUsMTcgKzI1NSwxNyBAQAogCXJlZyB8PSAocGRhdGEtPmFicmVmICYgTUMxMzc4M19MRURfQzBfQUJSRUZfTUFTSykgPDwKIAkJCQkJCQlNQzEzNzgzX0xFRF9DMF9BQlJFRjsKIAotCXJldCA9IG1jMTM3ODNfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfMCwgcmVnKTsKKwlyZXQgPSBtYzEzeHh4X3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzAsIHJlZyk7CiAKIG91dDoKLQltYzEzNzgzX3VubG9jayhkZXYpOworCW1jMTN4eHhfdW5sb2NrKGRldik7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgbWMxMzc4M19sZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgbWMxMzc4M19sZWRzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgbWMxMzc4M19sZWRfcGxhdGZvcm1fZGF0YSAqbGVkX2N1cjsKKwlzdHJ1Y3QgbWMxM3h4eF9sZWRzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9sZWRfcGxhdGZvcm1fZGF0YSAqbGVkX2N1cjsKIAlzdHJ1Y3QgbWMxMzc4M19sZWQgKmxlZCwgKmxlZF9kYXQ7CiAJaW50IHJldCwgaTsKIAlpbnQgaW5pdF9sZWQgPSAwOwpAQCAtMzUxLDkgKzM1MSw5IEBACiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG1jMTM3ODNfbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBtYzEzNzgzX2xlZHNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBtYzEzeHh4X2xlZHNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXN0cnVjdCBtYzEzNzgzX2xlZCAqbGVkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG1jMTM3ODMgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbWMxM3h4eCAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbGVkczsgaSsrKSB7CkBAIC0zNjEsMTYgKzM2MSwxNiBAQAogCQljYW5jZWxfd29ya19zeW5jKCZsZWRbaV0ud29yayk7CiAJfQogCi0JbWMxMzc4M19sb2NrKGRldik7CisJbWMxM3h4eF9sb2NrKGRldik7CiAKLQltYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzAsIDApOwotCW1jMTM3ODNfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfMSwgMCk7Ci0JbWMxMzc4M19yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8yLCAwKTsKLQltYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzMsIDApOwotCW1jMTM3ODNfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfNCwgMCk7Ci0JbWMxMzc4M19yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF81LCAwKTsKKwltYzEzeHh4X3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzAsIDApOworCW1jMTN4eHhfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfMSwgMCk7CisJbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8yLCAwKTsKKwltYzEzeHh4X3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzMsIDApOworCW1jMTN4eHhfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfNCwgMCk7CisJbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF81LCAwKTsKIAotCW1jMTM3ODNfdW5sb2NrKGRldik7CisJbWMxM3h4eF91bmxvY2soZGV2KTsKIAogCWtmcmVlKGxlZCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1uZXQ0OHh4LmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1uZXQ0OHh4LmMKaW5kZXggOTM5ODdhMS4uZjExN2Y3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtbmV0NDh4eC5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLW5ldDQ4eHguYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L25zY19ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2N4MjAwX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZOQU1FICJuZXQ0OHh4LWxlZCIKICNkZWZpbmUgTkVUNDhYWF9FUlJPUl9MRURfR1BJTwkyMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbmV0NTUwMS5jIGIvZHJpdmVycy9sZWRzL2xlZHMtbmV0NTUwMS5jCmluZGV4IDdlNzY0YjguLjA1NTVkNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLW5ldDU1MDEuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1uZXQ1NTAxLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2dlb2RlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLW5zMi5jIGIvZHJpdmVycy9sZWRzL2xlZHMtbnMyLmMKaW5kZXggZjc3ZDQ4ZC4uMzdiN2QwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtbnMyLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbnMyLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtYWNoL2xlZHMtbnMyLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1yZW5lc2FzLXRwdS5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcmVuZXNhcy10cHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWU1NDBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtcmVuZXNhcy10cHUuYwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIExFRCBjb250cm9sIHVzaW5nIFJlbmVzYXMgVFBVCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBNYWdudXMgRGFtbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvbGVkcy1yZW5lc2FzLXRwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCitlbnVtIHJfdHB1X3BpbiB7IFJfVFBVX1BJTl9VTlVTRUQsIFJfVFBVX1BJTl9HUElPLCBSX1RQVV9QSU5fR1BJT19GTiB9OworZW51bSByX3RwdV90aW1lciB7IFJfVFBVX1RJTUVSX1VOVVNFRCwgUl9UUFVfVElNRVJfT04gfTsKKworc3RydWN0IHJfdHB1X3ByaXYgeworCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGRldjsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2U7CisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJZW51bSByX3RwdV9waW4gcGluX3N0YXRlOworCWVudW0gcl90cHVfdGltZXIgdGltZXJfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBtaW5fcmF0ZTsKKwl1bnNpZ25lZCBpbnQgcmVmcmVzaF9yYXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCWVudW0gbGVkX2JyaWdodG5lc3MgbmV3X2JyaWdodG5lc3M7Cit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJfdHB1X2xvY2spOworCisjZGVmaW5lIFRTVFIgLTEgLyogVGltZXIgc3RhcnQgcmVnaXN0ZXIgKHNoYXJlZCByZWdpc3RlcikgKi8KKyNkZWZpbmUgVENSICAwIC8qIFRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIgKCsweDAwKSAqLworI2RlZmluZSBUTURSIDEgLyogVGltZXIgbW9kZSByZWdpc3RlciAoKzB4MDQpICovCisjZGVmaW5lIFRJT1IgMiAvKiBUaW1lciBJL08gY29udHJvbCByZWdpc3RlciAoKzB4MDgpICovCisjZGVmaW5lIFRJRVIgMyAvKiBUaW1lciBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICgrMHgwYykgKi8KKyNkZWZpbmUgVFNSICA0IC8qIFRpbWVyIHN0YXR1cyByZWdpc3RlciAoKzB4MTApICovCisjZGVmaW5lIFRDTlQgNSAvKiBUaW1lciBjb3VudGVyICgrMHgxNCkgKi8KKyNkZWZpbmUgVEdSQSA2IC8qIFRpbWVyIGdlbmVyYWwgcmVnaXN0ZXIgQSAoKzB4MTgpICovCisjZGVmaW5lIFRHUkIgNyAvKiBUaW1lciBnZW5lcmFsIHJlZ2lzdGVyIEIgKCsweDFjKSAqLworI2RlZmluZSBUR1JDIDggLyogVGltZXIgZ2VuZXJhbCByZWdpc3RlciBDICgrMHgyMCkgKi8KKyNkZWZpbmUgVEdSRCA5IC8qIFRpbWVyIGdlbmVyYWwgcmVnaXN0ZXIgRCAoKzB4MjQpICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcl90cHVfcmVhZChzdHJ1Y3Qgcl90cHVfcHJpdiAqcCwgaW50IHJlZ19ucikKK3sKKwlzdHJ1Y3QgbGVkX3JlbmVzYXNfdHB1X2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gcC0+bWFwYmFzZTsKKwl1bnNpZ25lZCBsb25nIG9mZnMgPSByZWdfbnIgPDwgMjsKKworCWlmIChyZWdfbnIgPT0gVFNUUikKKwkJcmV0dXJuIGlvcmVhZDE2KGJhc2UgLSBjZmctPmNoYW5uZWxfb2Zmc2V0KTsKKworCXJldHVybiBpb3JlYWQxNihiYXNlICsgb2Zmcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByX3RwdV93cml0ZShzdHJ1Y3Qgcl90cHVfcHJpdiAqcCwgaW50IHJlZ19uciwKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbGVkX3JlbmVzYXNfdHB1X2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gcC0+bWFwYmFzZTsKKwl1bnNpZ25lZCBsb25nIG9mZnMgPSByZWdfbnIgPDwgMjsKKworCWlmIChyZWdfbnIgPT0gVFNUUikgeworCQlpb3dyaXRlMTYodmFsdWUsIGJhc2UgLSBjZmctPmNoYW5uZWxfb2Zmc2V0KTsKKwkJcmV0dXJuOworCX0KKworCWlvd3JpdGUxNih2YWx1ZSwgYmFzZSArIG9mZnMpOworfQorCitzdGF0aWMgdm9pZCByX3RwdV9zdGFydF9zdG9wX2NoKHN0cnVjdCByX3RwdV9wcml2ICpwLCBpbnQgc3RhcnQpCit7CisJc3RydWN0IGxlZF9yZW5lc2FzX3RwdV9jb25maWcgKmNmZyA9IHAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZhbHVlOworCisJLyogc3RhcnQgc3RvcCByZWdpc3RlciBzaGFyZWQgYnkgbXVsdGlwbGUgdGltZXIgY2hhbm5lbHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcl90cHVfbG9jaywgZmxhZ3MpOworCXZhbHVlID0gcl90cHVfcmVhZChwLCBUU1RSKTsKKworCWlmIChzdGFydCkKKwkJdmFsdWUgfD0gMSA8PCBjZmctPnRpbWVyX2JpdDsKKwllbHNlCisJCXZhbHVlICY9IH4oMSA8PCBjZmctPnRpbWVyX2JpdCk7CisKKwlyX3RwdV93cml0ZShwLCBUU1RSLCB2YWx1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcl90cHVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHJfdHB1X2VuYWJsZShzdHJ1Y3Qgcl90cHVfcHJpdiAqcCwgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCBsZWRfcmVuZXNhc190cHVfY29uZmlnICpjZmcgPSBwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcHJlc2NhbGVyW10gPSB7IDEsIDQsIDE2LCA2NCB9OworCWludCBrLCByZXQ7CisJdW5zaWduZWQgbG9uZyByYXRlLCB0bXA7CisKKwlpZiAocC0+dGltZXJfc3RhdGUgPT0gUl9UUFVfVElNRVJfT04pCisJCXJldHVybiAwOworCisJLyogd2FrZSB1cCBkZXZpY2UgYW5kIGVuYWJsZSBjbG9jayAqLworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnAtPnBkZXYtPmRldik7CisJcmV0ID0gY2xrX2VuYWJsZShwLT5jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcC0+cGRldi0+ZGV2LCAiY2Fubm90IGVuYWJsZSBjbG9ja1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbWFrZSBzdXJlIGNoYW5uZWwgaXMgZGlzYWJsZWQgKi8KKwlyX3RwdV9zdGFydF9zdG9wX2NoKHAsIDApOworCisJLyogZ2V0IGNsb2NrIHJhdGUgYWZ0ZXIgZW5hYmxpbmcgaXQgKi8KKwlyYXRlID0gY2xrX2dldF9yYXRlKHAtPmNsayk7CisKKwkvKiBwaWNrIHRoZSBsb3dlc3QgYWNjZXB0YWJsZSByYXRlICovCisJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocHJlc2NhbGVyKTsgaysrKQorCQlpZiAoKHJhdGUgLyBwcmVzY2FsZXJba10pIDwgcC0+bWluX3JhdGUpCisJCQlicmVhazsKKworCWlmICghaykgeworCQlkZXZfZXJyKCZwLT5wZGV2LT5kZXYsICJjbG9jayByYXRlIG1pc21hdGNoXG4iKTsKKwkJZ290byBlcnIwOworCX0KKwlkZXZfZGJnKCZwLT5wZGV2LT5kZXYsICJyYXRlID0gJWx1LCBwcmVzY2FsZXIgJXVcbiIsCisJCXJhdGUsIHByZXNjYWxlcltrIC0gMV0pOworCisJLyogY2xlYXIgVENOVCBvbiBUR1JCIG1hdGNoLCBjb3VudCBvbiByaXNpbmcgZWRnZSwgc2V0IHByZXNjYWxlciAqLworCXJfdHB1X3dyaXRlKHAsIFRDUiwgMHgwMDQwIHwgKGsgLSAxKSk7CisKKwkvKiBvdXRwdXQgMCB1bnRpbCBUR1JBLCBvdXRwdXQgMSB1bnRpbCBUR1JCICovCisJcl90cHVfd3JpdGUocCwgVElPUiwgMHgwMDAyKTsKKworCXJhdGUgLz0gcHJlc2NhbGVyW2sgLSAxXSAqIHAtPnJlZnJlc2hfcmF0ZTsKKwlyX3RwdV93cml0ZShwLCBUR1JCLCByYXRlKTsKKwlkZXZfZGJnKCZwLT5wZGV2LT5kZXYsICJUUkdCID0gMHglMDRseFxuIiwgcmF0ZSk7CisKKwl0bXAgPSAoY2ZnLT5tYXhfYnJpZ2h0bmVzcyAtIGJyaWdodG5lc3MpICogcmF0ZTsKKwlyX3RwdV93cml0ZShwLCBUR1JBLCB0bXAgLyBjZmctPm1heF9icmlnaHRuZXNzKTsKKwlkZXZfZGJnKCZwLT5wZGV2LT5kZXYsICJUUkdBID0gMHglMDRseFxuIiwgdG1wIC8gY2ZnLT5tYXhfYnJpZ2h0bmVzcyk7CisKKwkvKiBQV00gbW9kZSAqLworCXJfdHB1X3dyaXRlKHAsIFRNRFIsIDB4MDAwMik7CisKKwkvKiBlbmFibGUgY2hhbm5lbCAqLworCXJfdHB1X3N0YXJ0X3N0b3BfY2gocCwgMSk7CisKKwlwLT50aW1lcl9zdGF0ZSA9IFJfVFBVX1RJTUVSX09OOworCXJldHVybiAwOworIGVycjA6CisJY2xrX2Rpc2FibGUocC0+Y2xrKTsKKwlwbV9ydW50aW1lX3B1dF9zeW5jKCZwLT5wZGV2LT5kZXYpOworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKK3N0YXRpYyB2b2lkIHJfdHB1X2Rpc2FibGUoc3RydWN0IHJfdHB1X3ByaXYgKnApCit7CisJaWYgKHAtPnRpbWVyX3N0YXRlID09IFJfVFBVX1RJTUVSX1VOVVNFRCkKKwkJcmV0dXJuOworCisJLyogZGlzYWJsZSBjaGFubmVsICovCisJcl90cHVfc3RhcnRfc3RvcF9jaChwLCAwKTsKKworCS8qIHN0b3AgY2xvY2sgYW5kIG1hcmsgZGV2aWNlIGFzIGlkbGUgKi8KKwljbGtfZGlzYWJsZShwLT5jbGspOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnAtPnBkZXYtPmRldik7CisKKwlwLT50aW1lcl9zdGF0ZSA9IFJfVFBVX1RJTUVSX1VOVVNFRDsKK30KKworc3RhdGljIHZvaWQgcl90cHVfc2V0X3BpbihzdHJ1Y3Qgcl90cHVfcHJpdiAqcCwgZW51bSByX3RwdV9waW4gbmV3X3N0YXRlLAorCQkJICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJc3RydWN0IGxlZF9yZW5lc2FzX3RwdV9jb25maWcgKmNmZyA9IHAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKHAtPnBpbl9zdGF0ZSA9PSBuZXdfc3RhdGUpIHsKKwkJaWYgKHAtPnBpbl9zdGF0ZSA9PSBSX1RQVV9QSU5fR1BJTykKKwkJCWdwaW9fc2V0X3ZhbHVlKGNmZy0+cGluX2dwaW8sIGJyaWdodG5lc3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKHAtPnBpbl9zdGF0ZSA9PSBSX1RQVV9QSU5fR1BJTykKKwkJZ3Bpb19mcmVlKGNmZy0+cGluX2dwaW8pOworCisJaWYgKHAtPnBpbl9zdGF0ZSA9PSBSX1RQVV9QSU5fR1BJT19GTikKKwkJZ3Bpb19mcmVlKGNmZy0+cGluX2dwaW9fZm4pOworCisJaWYgKG5ld19zdGF0ZSA9PSBSX1RQVV9QSU5fR1BJTykgeworCQlncGlvX3JlcXVlc3QoY2ZnLT5waW5fZ3BpbywgY2ZnLT5uYW1lKTsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGNmZy0+cGluX2dwaW8sICEhYnJpZ2h0bmVzcyk7CisJfQorCWlmIChuZXdfc3RhdGUgPT0gUl9UUFVfUElOX0dQSU9fRk4pCisJCWdwaW9fcmVxdWVzdChjZmctPnBpbl9ncGlvX2ZuLCBjZmctPm5hbWUpOworCisJcC0+cGluX3N0YXRlID0gbmV3X3N0YXRlOworfQorCitzdGF0aWMgdm9pZCByX3RwdV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgcl90cHVfcHJpdiAqcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgcl90cHVfcHJpdiwgd29yayk7CisJZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzID0gcC0+bmV3X2JyaWdodG5lc3M7CisKKwlyX3RwdV9kaXNhYmxlKHApOworCisJLyogb2ZmIGFuZCBtYXhpbXVtIGFyZSBoYW5kbGVkIGFzIEdQSU8gcGlucywgaW4gYmV0d2VlbiBQV00gKi8KKwlpZiAoKGJyaWdodG5lc3MgPT0gMCkgfHwgKGJyaWdodG5lc3MgPT0gcC0+bGRldi5tYXhfYnJpZ2h0bmVzcykpCisJCXJfdHB1X3NldF9waW4ocCwgUl9UUFVfUElOX0dQSU8sIGJyaWdodG5lc3MpOworCWVsc2UgeworCQlyX3RwdV9zZXRfcGluKHAsIFJfVFBVX1BJTl9HUElPX0ZOLCAwKTsKKwkJcl90cHVfZW5hYmxlKHAsIGJyaWdodG5lc3MpOworCX0KK30KKworc3RhdGljIHZvaWQgcl90cHVfc2V0X2JyaWdodG5lc3Moc3RydWN0IGxlZF9jbGFzc2RldiAqbGRldiwKKwkJCQkgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCByX3RwdV9wcml2ICpwID0gY29udGFpbmVyX29mKGxkZXYsIHN0cnVjdCByX3RwdV9wcml2LCBsZGV2KTsKKwlwLT5uZXdfYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisJc2NoZWR1bGVfd29yaygmcC0+d29yayk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJfdHB1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGxlZF9yZW5lc2FzX3RwdV9jb25maWcgKmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCByX3RwdV9wcml2ICpwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQgPSAtRU5YSU87CisKKwlpZiAoIWNmZykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlnb3RvIGVycjA7CisJfQorCisJcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZHJpdmVyIGRhdGFcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IEkvTyBtZW1vcnlcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJLyogbWFwIG1lbW9yeSwgbGV0IG1hcGJhc2UgcG9pbnQgdG8gb3VyIGNoYW5uZWwgKi8KKwlwLT5tYXBiYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKHAtPm1hcGJhc2UgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVtYXAgSS9PIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyMTsKKwl9CisKKwkvKiBnZXQgaG9sZCBvZiBjbG9jayAqLworCXAtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwLT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKHAtPmNsayk7CisJCWdvdG8gZXJyMjsKKwl9CisKKwlwLT5wZGV2ID0gcGRldjsKKwlwLT5waW5fc3RhdGUgPSBSX1RQVV9QSU5fVU5VU0VEOworCXAtPnRpbWVyX3N0YXRlID0gUl9UUFVfVElNRVJfVU5VU0VEOworCXAtPnJlZnJlc2hfcmF0ZSA9IGNmZy0+cmVmcmVzaF9yYXRlID8gY2ZnLT5yZWZyZXNoX3JhdGUgOiAxMDA7CisJcl90cHVfc2V0X3BpbihwLCBSX1RQVV9QSU5fR1BJTywgTEVEX09GRik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcCk7CisKKwlJTklUX1dPUksoJnAtPndvcmssIHJfdHB1X3dvcmspOworCisJcC0+bGRldi5uYW1lID0gY2ZnLT5uYW1lOworCXAtPmxkZXYuYnJpZ2h0bmVzcyA9IExFRF9PRkY7CisJcC0+bGRldi5tYXhfYnJpZ2h0bmVzcyA9IGNmZy0+bWF4X2JyaWdodG5lc3M7CisJcC0+bGRldi5icmlnaHRuZXNzX3NldCA9IHJfdHB1X3NldF9icmlnaHRuZXNzOworCXAtPmxkZXYuZmxhZ3MgfD0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRTsKKwlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnAtPmxkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjM7CisKKwkvKiBtYXhfYnJpZ2h0bmVzcyBtYXkgYmUgdXBkYXRlZCBieSB0aGUgTEVEIGNvcmUgY29kZSAqLworCXAtPm1pbl9yYXRlID0gcC0+bGRldi5tYXhfYnJpZ2h0bmVzcyAqIHAtPnJlZnJlc2hfcmF0ZTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworCisgZXJyMzoKKwlyX3RwdV9zZXRfcGluKHAsIFJfVFBVX1BJTl9VTlVTRUQsIExFRF9PRkYpOworCWNsa19wdXQocC0+Y2xrKTsKKyBlcnIyOgorCWlvdW5tYXAocC0+bWFwYmFzZSk7CisgZXJyMToKKwlrZnJlZShwKTsKKyBlcnIwOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHJfdHB1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByX3RwdV9wcml2ICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyX3RwdV9zZXRfYnJpZ2h0bmVzcygmcC0+bGRldiwgTEVEX09GRik7CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJnAtPmxkZXYpOworCWNhbmNlbF93b3JrX3N5bmMoJnAtPndvcmspOworCXJfdHB1X2Rpc2FibGUocCk7CisJcl90cHVfc2V0X3BpbihwLCBSX1RQVV9QSU5fVU5VU0VELCBMRURfT0ZGKTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwljbGtfcHV0KHAtPmNsayk7CisKKwlpb3VubWFwKHAtPm1hcGJhc2UpOworCWtmcmVlKHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByX3RwdV9kZXZpY2VfZHJpdmVyID0geworCS5wcm9iZQkJPSByX3RwdV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJfdHB1X3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxlZHMtcmVuZXNhcy10cHUiLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJfdHB1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyX3RwdV9kZXZpY2VfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJfdHB1X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmcl90cHVfZGV2aWNlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJfdHB1X2luaXQpOworbW9kdWxlX2V4aXQocl90cHVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hZ251cyBEYW1tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlbmVzYXMgVFBVIExFRCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXMzYzI0eHguYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXMzYzI0eHguYwppbmRleCBhNzc3NzFkLi4yOWY4YjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1zM2MyNHh4LmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtczNjMjR4eC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXdtODMxeC1zdGF0dXMuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXdtODMxeC1zdGF0dXMuYwppbmRleCBlZjVjMjQxLi5iMWViMzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy13bTgzMXgtc3RhdHVzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtd204MzF4LXN0YXR1cy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9wZGF0YS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvc3RhdHVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogc3RydWN0IHdtODMxeF9zdGF0dXMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtd204MzUwLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy13bTgzNTAuYwppbmRleCBmMTRlZGQ4Li40YTEyNzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy13bTgzNTAuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy13bTgzNTAuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvcG1pYy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTWljcm9hbXBzICovCiBzdGF0aWMgY29uc3QgaW50IGlzaW5rX2N1cltdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtd3JhcC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtd3JhcC5jCmluZGV4IDI5ODJjODYuLjZlMjFlNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXdyYXAuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy13cmFwLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zY3gyMDBfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVk5BTUUgIndyYXAtbGVkIgogI2RlZmluZSBXUkFQX1BPV0VSX0xFRF9HUElPCTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2NvcmUuYyBiL2RyaXZlcnMvbGd1ZXN0L2NvcmUuYwppbmRleCAyNTM1OTMzLi5iNWZkY2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9jb3JlLmMKKysrIGIvZHJpdmVycy9sZ3Vlc3QvY29yZS5jCkBAIC0yMzIsNiArMjMyLDEzIEBACiAJCQl9CiAJCX0KIAorCQkvKgorCQkgKiBBbGwgbG9uZy1saXZlZCBrZXJuZWwgbG9vcHMgbmVlZCB0byBjaGVjayB3aXRoIHRoaXMgaG9ycmlibGUKKwkJICogdGhpbmcgY2FsbGVkIHRoZSBmcmVlemVyLiAgSWYgdGhlIEhvc3QgaXMgdHJ5aW5nIHRvIHN1c3BlbmQsCisJCSAqIGl0IHN0b3BzIHVzLgorCQkgKi8KKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCiAJCS8qIENoZWNrIGZvciBzaWduYWxzICovCiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC0yNDYsMTMgKzI1Myw2IEBACiAJCQl0cnlfZGVsaXZlcl9pbnRlcnJ1cHQoY3B1LCBpcnEsIG1vcmUpOwogCiAJCS8qCi0JCSAqIEFsbCBsb25nLWxpdmVkIGtlcm5lbCBsb29wcyBuZWVkIHRvIGNoZWNrIHdpdGggdGhpcyBob3JyaWJsZQotCQkgKiB0aGluZyBjYWxsZWQgdGhlIGZyZWV6ZXIuICBJZiB0aGUgSG9zdCBpcyB0cnlpbmcgdG8gc3VzcGVuZCwKLQkJICogaXQgc3RvcHMgdXMuCi0JCSAqLwotCQl0cnlfdG9fZnJlZXplKCk7Ci0KLQkJLyoKIAkJICogSnVzdCBtYWtlIGFic29sdXRlbHkgc3VyZSB0aGUgR3Vlc3QgaXMgc3RpbGwgYWxpdmUuICBPbmUgb2YKIAkJICogdGhvc2UgaHlwZXJjYWxscyBjb3VsZCBoYXZlIGJlZW4gZmF0YWwsIGZvciBleGFtcGxlLgogCQkgKi8KQEAgLTMxMyw3ICszMTMsNyBAQAogCWludCBlcnI7CiAKIAkvKiBMZ3Vlc3QgY2FuJ3QgcnVuIHVuZGVyIFhlbiwgVk1JIG9yIGl0c2VsZi4gIEl0IGRvZXMgVHJpY2t5IFN0dWZmLiAqLwotCWlmIChwYXJhdmlydF9lbmFibGVkKCkpIHsKKwlpZiAoZ2V0X2tlcm5lbF9ycGwoKSAhPSAwKSB7CiAJCXByaW50aygibGd1ZXN0IGlzIGFmcmFpZCBvZiBiZWluZyBhIGd1ZXN0XG4iKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKaW5kZXggNTI4OWZmYS4uMGRjMzBmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19yaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X3VzZXIuYyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF91c2VyLmMKaW5kZXggZjk3ZTYyNS4uZmY0YTBiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X3VzZXIuYworKysgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfdXNlci5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXZlbnRmZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAibGcuaCIKIAogLypMOjA1NgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLW1hY2lpLmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWkuYwppbmRleCA4MTdmMzdhLi5jOTU3MGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWkuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWkuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAJZXJyID0gbWFjaWlfaW5pdF92aWEoKTsKIAlpZiAoZXJyKSBnb3RvIG91dDsKIAotCWVyciA9IHJlcXVlc3RfaXJxKElSUV9NQUNfQURCLCBtYWNpaV9pbnRlcnJ1cHQsIElSUV9GTEdfTE9DSywgIkFEQiIsCisJZXJyID0gcmVxdWVzdF9pcnEoSVJRX01BQ19BREIsIG1hY2lpX2ludGVycnVwdCwgMCwgIkFEQiIsCiAJCQkgIG1hY2lpX2ludGVycnVwdCk7CiAJaWYgKGVycikgZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaXNpLmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWlzaS5jCmluZGV4IDlhYjViMGMuLjM0ZDAyYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaXNpLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLW1hY2lpc2kuYwpAQCAtMTIyLDggKzEyMiw4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKElSUV9NQUNfQURCLCBtYWNpaXNpX2ludGVycnVwdCwgSVJRX0ZMR19MT0NLIHwgSVJRX0ZMR19GQVNULCAKLQkJCSJBREIiLCBtYWNpaXNpX2ludGVycnVwdCkpIHsKKwlpZiAocmVxdWVzdF9pcnEoSVJRX01BQ19BREIsIG1hY2lpc2lfaW50ZXJydXB0LCAwLCAiQURCIiwKKwkJCW1hY2lpc2lfaW50ZXJydXB0KSkgewogCQlwcmludGsoS0VSTl9FUlIgIm1hY2lpc2lfaW5pdDogY2FuJ3QgZ2V0IGlycSAlZFxuIiwgSVJRX01BQ19BREIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL0tjb25maWcgYi9kcml2ZXJzL21kL0tjb25maWcKaW5kZXggZjc1YTY2ZS4uZmFhNDc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWQvS2NvbmZpZwpAQCAtMjA4LDYgKzIwOCwxNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgRE1fQlVGSU8KKyAgICAgICB0cmlzdGF0ZQorICAgICAgIGRlcGVuZHMgb24gQkxLX0RFVl9ETSAmJiBFWFBFUklNRU5UQUwKKyAgICAgICAtLS1oZWxwLS0tCisJIFRoaXMgaW50ZXJmYWNlIGFsbG93cyB5b3UgdG8gZG8gYnVmZmVyZWQgSS9PIG9uIGEgZGV2aWNlIGFuZCBhY3RzCisJIGFzIGEgY2FjaGUsIGhvbGRpbmcgcmVjZW50bHktcmVhZCBibG9ja3MgaW4gbWVtb3J5IGFuZCBwZXJmb3JtaW5nCisJIGRlbGF5ZWQgd3JpdGVzLgorCitzb3VyY2UgImRyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL0tjb25maWciCisKIGNvbmZpZyBETV9DUllQVAogCXRyaXN0YXRlICJDcnlwdCB0YXJnZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEJMS19ERVZfRE0KQEAgLTIzMyw2ICsyNDMsMzIgQEAKICAgICAgICAtLS1oZWxwLS0tCiAgICAgICAgICBBbGxvdyB2b2x1bWUgbWFuYWdlcnMgdG8gdGFrZSB3cml0YWJsZSBzbmFwc2hvdHMgb2YgYSBkZXZpY2UuCiAKK2NvbmZpZyBETV9USElOX1BST1ZJU0lPTklORworICAgICAgIHRyaXN0YXRlICJUaGluIHByb3Zpc2lvbmluZyB0YXJnZXQgKEVYUEVSSU1FTlRBTCkiCisgICAgICAgZGVwZW5kcyBvbiBCTEtfREVWX0RNICYmIEVYUEVSSU1FTlRBTAorICAgICAgIHNlbGVjdCBETV9QRVJTSVNURU5UX0RBVEEKKyAgICAgICAtLS1oZWxwLS0tCisgICAgICAgICBQcm92aWRlcyB0aGluIHByb3Zpc2lvbmluZyBhbmQgc25hcHNob3RzIHRoYXQgc2hhcmUgYSBkYXRhIHN0b3JlLgorCitjb25maWcgRE1fREVCVUdfQkxPQ0tfU1RBQ0tfVFJBQ0lORworCWJvb2xlYW4gIktlZXAgc3RhY2sgdHJhY2Ugb2YgdGhpbiBwcm92aXNpb25pbmcgYmxvY2sgbG9jayBob2xkZXJzIgorCWRlcGVuZHMgb24gU1RBQ0tUUkFDRV9TVVBQT1JUICYmIERNX1RISU5fUFJPVklTSU9OSU5HCisJc2VsZWN0IFNUQUNLVFJBQ0UKKwktLS1oZWxwLS0tCisJICBFbmFibGUgdGhpcyBmb3IgbWVzc2FnZXMgdGhhdCBtYXkgaGVscCBkZWJ1ZyBwcm9ibGVtcyB3aXRoIHRoZQorCSAgYmxvY2sgbWFuYWdlciBsb2NraW5nIHVzZWQgYnkgdGhpbiBwcm92aXNpb25pbmcuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBETV9ERUJVR19TUEFDRV9NQVBTCisJYm9vbGVhbiAiRXh0cmEgdmFsaWRhdGlvbiBmb3IgdGhpbiBwcm92aXNpb25pbmcgc3BhY2UgbWFwcyIKKwlkZXBlbmRzIG9uIERNX1RISU5fUFJPVklTSU9OSU5HCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHRoaXMgZm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGhlbHAgZGVidWcgcHJvYmxlbXMgd2l0aCB0aGUKKwkgIHNwYWNlIG1hcHMgdXNlZCBieSB0aGluIHByb3Zpc2lvbmluZy4KKworICAgICAgICAgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBETV9NSVJST1IKICAgICAgICB0cmlzdGF0ZSAiTWlycm9yIHRhcmdldCIKICAgICAgICBkZXBlbmRzIG9uIEJMS19ERVZfRE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvTWFrZWZpbGUgYi9kcml2ZXJzL21kL01ha2VmaWxlCmluZGV4IDQ0ODgzOGIuLjA0Njg2MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZC9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogZG0tbWlycm9yLXkJKz0gZG0tcmFpZDEubwogZG0tbG9nLXVzZXJzcGFjZS15IFwKIAkJKz0gZG0tbG9nLXVzZXJzcGFjZS1iYXNlLm8gZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5vCitkbS10aGluLXBvb2wteQkrPSBkbS10aGluLm8gZG0tdGhpbi1tZXRhZGF0YS5vCiBtZC1tb2QteQkrPSBtZC5vIGJpdG1hcC5vCiByYWlkNDU2LXkJKz0gcmFpZDUubwogCkBAIC0yNyw2ICsyOCw3IEBACiBvYmotJChDT05GSUdfTURfRkFVTFRZKQkJKz0gZmF1bHR5Lm8KIG9iai0kKENPTkZJR19CTEtfREVWX01EKQkrPSBtZC1tb2Qubwogb2JqLSQoQ09ORklHX0JMS19ERVZfRE0pCSs9IGRtLW1vZC5vCitvYmotJChDT05GSUdfRE1fQlVGSU8pCQkrPSBkbS1idWZpby5vCiBvYmotJChDT05GSUdfRE1fQ1JZUFQpCQkrPSBkbS1jcnlwdC5vCiBvYmotJChDT05GSUdfRE1fREVMQVkpCQkrPSBkbS1kZWxheS5vCiBvYmotJChDT05GSUdfRE1fRkxBS0VZKQkJKz0gZG0tZmxha2V5Lm8KQEAgLTM0LDEwICszNiwxMiBAQAogb2JqLSQoQ09ORklHX0RNX01VTFRJUEFUSF9RTCkJKz0gZG0tcXVldWUtbGVuZ3RoLm8KIG9iai0kKENPTkZJR19ETV9NVUxUSVBBVEhfU1QpCSs9IGRtLXNlcnZpY2UtdGltZS5vCiBvYmotJChDT05GSUdfRE1fU05BUFNIT1QpCSs9IGRtLXNuYXBzaG90Lm8KK29iai0kKENPTkZJR19ETV9QRVJTSVNURU5UX0RBVEEpCSs9IHBlcnNpc3RlbnQtZGF0YS8KIG9iai0kKENPTkZJR19ETV9NSVJST1IpCQkrPSBkbS1taXJyb3IubyBkbS1sb2cubyBkbS1yZWdpb24taGFzaC5vCiBvYmotJChDT05GSUdfRE1fTE9HX1VTRVJTUEFDRSkJKz0gZG0tbG9nLXVzZXJzcGFjZS5vCiBvYmotJChDT05GSUdfRE1fWkVSTykJCSs9IGRtLXplcm8ubwogb2JqLSQoQ09ORklHX0RNX1JBSUQpCSs9IGRtLXJhaWQubworb2JqLSQoQ09ORklHX0RNX1RISU5fUFJPVklTSU9OSU5HKQkrPSBkbS10aGluLXBvb2wubwogCiBpZmVxICgkKENPTkZJR19ETV9VRVZFTlQpLHkpCiBkbS1tb2Qtb2JqcwkJCSs9IGRtLXVldmVudC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMgYi9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2ODA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvZG0tYnVmaW8uYwpAQCAtMCwwICsxLDE3MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogQXV0aG9yOiBNaWt1bGFzIFBhdG9ja2EgPG1wYXRvY2thQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLWJ1ZmlvLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zaHJpbmtlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIERNX01TR19QUkVGSVggImJ1ZmlvIgorCisvKgorICogTWVtb3J5IG1hbmFnZW1lbnQgcG9saWN5OgorICoJTGltaXQgdGhlIG51bWJlciBvZiBidWZmZXJzIHRvIERNX0JVRklPX01FTU9SWV9QRVJDRU5UIG9mIG1haW4gbWVtb3J5CisgKglvciBETV9CVUZJT19WTUFMTE9DX1BFUkNFTlQgb2Ygdm1hbGxvYyBtZW1vcnkgKHdoaWNoZXZlciBpcyBsb3dlcikuCisgKglBbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgRE1fQlVGSU9fTUlOX0JVRkZFUlMgYnVmZmVycy4KKyAqCVN0YXJ0IGJhY2tncm91bmQgd3JpdGViYWNrIHdoZW4gdGhlcmUgYXJlIERNX0JVRklPX1dSSVRFQkFDS19QRVJDRU5UCisgKglkaXJ0eSBidWZmZXJzLgorICovCisjZGVmaW5lIERNX0JVRklPX01JTl9CVUZGRVJTCQk4CisKKyNkZWZpbmUgRE1fQlVGSU9fTUVNT1JZX1BFUkNFTlQJCTIKKyNkZWZpbmUgRE1fQlVGSU9fVk1BTExPQ19QRVJDRU5UCTI1CisjZGVmaW5lIERNX0JVRklPX1dSSVRFQkFDS19QRVJDRU5UCTc1CisKKy8qCisgKiBDaGVjayBidWZmZXIgYWdlcyBpbiB0aGlzIGludGVydmFsIChzZWNvbmRzKQorICovCisjZGVmaW5lIERNX0JVRklPX1dPUktfVElNRVJfU0VDUwkxMAorCisvKgorICogRnJlZSBidWZmZXJzIHdoZW4gdGhleSBhcmUgb2xkZXIgdGhhbiB0aGlzIChzZWNvbmRzKQorICovCisjZGVmaW5lIERNX0JVRklPX0RFRkFVTFRfQUdFX1NFQ1MJNjAKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgYnZlYyBlbnRyaWVzIHRoYXQgYXJlIGVtYmVkZGVkIGRpcmVjdGx5IGluIHRoZSBidWZmZXIuCisgKiBJZiB0aGUgY2h1bmsgc2l6ZSBpcyBsYXJnZXIsIGRtLWlvIGlzIHVzZWQgdG8gZG8gdGhlIGlvLgorICovCisjZGVmaW5lIERNX0JVRklPX0lOTElORV9WRUNTCQkxNgorCisvKgorICogQnVmZmVyIGhhc2gKKyAqLworI2RlZmluZSBETV9CVUZJT19IQVNIX0JJVFMJMjAKKyNkZWZpbmUgRE1fQlVGSU9fSEFTSChibG9jaykgXAorCSgoKChibG9jaykgPj4gRE1fQlVGSU9fSEFTSF9CSVRTKSBeIChibG9jaykpICYgXAorCSAoKDEgPDwgRE1fQlVGSU9fSEFTSF9CSVRTKSAtIDEpKQorCisvKgorICogRG9uJ3QgdHJ5IHRvIHVzZSBrbWVtX2NhY2hlX2FsbG9jIGZvciBibG9ja3MgbGFyZ2VyIHRoYW4gdGhpcy4KKyAqIEZvciBleHBsYW5hdGlvbiwgc2VlIGFsbG9jX2J1ZmZlcl9kYXRhIGJlbG93LgorICovCisjZGVmaW5lIERNX0JVRklPX0JMT0NLX1NJWkVfU0xBQl9MSU1JVAkoUEFHRV9TSVpFID4+IDEpCisjZGVmaW5lIERNX0JVRklPX0JMT0NLX1NJWkVfR0ZQX0xJTUlUCShQQUdFX1NJWkUgPDwgKE1BWF9PUkRFUiAtIDEpKQorCisvKgorICogZG1fYnVmZmVyLT5saXN0X21vZGUKKyAqLworI2RlZmluZSBMSVNUX0NMRUFOCTAKKyNkZWZpbmUgTElTVF9ESVJUWQkxCisjZGVmaW5lIExJU1RfU0laRQkyCisKKy8qCisgKiBMaW5raW5nIG9mIGJ1ZmZlcnM6CisgKglBbGwgYnVmZmVycyBhcmUgbGlua2VkIHRvIGNhY2hlX2hhc2ggd2l0aCB0aGVpciBoYXNoX2xpc3QgZmllbGQuCisgKgorICoJQ2xlYW4gYnVmZmVycyB0aGF0IGFyZSBub3QgYmVpbmcgd3JpdHRlbiAoQl9XUklUSU5HIG5vdCBzZXQpCisgKglhcmUgbGlua2VkIHRvIGxydVtMSVNUX0NMRUFOXSB3aXRoIHRoZWlyIGxydV9saXN0IGZpZWxkLgorICoKKyAqCURpcnR5IGFuZCBjbGVhbiBidWZmZXJzIHRoYXQgYXJlIGJlaW5nIHdyaXR0ZW4gYXJlIGxpbmtlZCB0bworICoJbHJ1W0xJU1RfRElSVFldIHdpdGggdGhlaXIgbHJ1X2xpc3QgZmllbGQuIFdoZW4gdGhlIHdyaXRlCisgKglmaW5pc2hlcywgdGhlIGJ1ZmZlciBjYW5ub3QgYmUgcmVsaW5rZWQgaW1tZWRpYXRlbHkgKGJlY2F1c2Ugd2UKKyAqCWFyZSBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dCBhbmQgcmVsaW5raW5nIHJlcXVpcmVzIHByb2Nlc3MKKyAqCWNvbnRleHQpLCBzbyBzb21lIGNsZWFuLW5vdC13cml0aW5nIGJ1ZmZlcnMgY2FuIGJlIGhlbGQgb24KKyAqCWRpcnR5X2xydSB0b28uICBUaGV5IGFyZSBsYXRlciBhZGRlZCB0byBscnUgaW4gdGhlIHByb2Nlc3MKKyAqCWNvbnRleHQuCisgKi8KK3N0cnVjdCBkbV9idWZpb19jbGllbnQgeworCXN0cnVjdCBtdXRleCBsb2NrOworCisJc3RydWN0IGxpc3RfaGVhZCBscnVbTElTVF9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIG5fYnVmZmVyc1tMSVNUX1NJWkVdOworCisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwl1bnNpZ25lZCBibG9ja19zaXplOworCXVuc2lnbmVkIGNoYXIgc2VjdG9yc19wZXJfYmxvY2tfYml0czsKKwl1bnNpZ25lZCBjaGFyIHBhZ2VzX3Blcl9ibG9ja19iaXRzOworCXVuc2lnbmVkIGNoYXIgYmxvY2tzX3Blcl9wYWdlX2JpdHM7CisJdW5zaWduZWQgYXV4X3NpemU7CisJdm9pZCAoKmFsbG9jX2NhbGxiYWNrKShzdHJ1Y3QgZG1fYnVmZmVyICopOworCXZvaWQgKCp3cml0ZV9jYWxsYmFjaykoc3RydWN0IGRtX2J1ZmZlciAqKTsKKworCXN0cnVjdCBkbV9pb19jbGllbnQgKmRtX2lvOworCisJc3RydWN0IGxpc3RfaGVhZCByZXNlcnZlZF9idWZmZXJzOworCXVuc2lnbmVkIG5lZWRfcmVzZXJ2ZWRfYnVmZmVyczsKKworCXN0cnVjdCBobGlzdF9oZWFkICpjYWNoZV9oYXNoOworCXdhaXRfcXVldWVfaGVhZF90IGZyZWVfYnVmZmVyX3dhaXQ7CisKKwlpbnQgYXN5bmNfd3JpdGVfZXJyb3I7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNsaWVudF9saXN0OworCXN0cnVjdCBzaHJpbmtlciBzaHJpbmtlcjsKK307CisKKy8qCisgKiBCdWZmZXIgc3RhdGUgYml0cy4KKyAqLworI2RlZmluZSBCX1JFQURJTkcJMAorI2RlZmluZSBCX1dSSVRJTkcJMQorI2RlZmluZSBCX0RJUlRZCQkyCisKKy8qCisgKiBEZXNjcmliZXMgaG93IHRoZSBibG9jayB3YXMgYWxsb2NhdGVkOgorICoga21lbV9jYWNoZV9hbGxvYygpLCBfX2dldF9mcmVlX3BhZ2VzKCkgb3Igdm1hbGxvYygpLgorICogU2VlIHRoZSBjb21tZW50IGF0IGFsbG9jX2J1ZmZlcl9kYXRhLgorICovCitlbnVtIGRhdGFfbW9kZSB7CisJREFUQV9NT0RFX1NMQUIgPSAwLAorCURBVEFfTU9ERV9HRVRfRlJFRV9QQUdFUyA9IDEsCisJREFUQV9NT0RFX1ZNQUxMT0MgPSAyLAorCURBVEFfTU9ERV9MSU1JVCA9IDMKK307CisKK3N0cnVjdCBkbV9idWZmZXIgeworCXN0cnVjdCBobGlzdF9ub2RlIGhhc2hfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxydV9saXN0OworCXNlY3Rvcl90IGJsb2NrOworCXZvaWQgKmRhdGE7CisJZW51bSBkYXRhX21vZGUgZGF0YV9tb2RlOworCXVuc2lnbmVkIGNoYXIgbGlzdF9tb2RlOwkJLyogTElTVF8qICovCisJdW5zaWduZWQgaG9sZF9jb3VudDsKKwlpbnQgcmVhZF9lcnJvcjsKKwlpbnQgd3JpdGVfZXJyb3I7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfYWNjZXNzZWQ7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYzsKKwlzdHJ1Y3QgYmlvIGJpbzsKKwlzdHJ1Y3QgYmlvX3ZlYyBiaW9fdmVjW0RNX0JVRklPX0lOTElORV9WRUNTXTsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZG1fYnVmaW9fY2FjaGVzW1BBR0VfU0hJRlQgLSBTRUNUT1JfU0hJRlRdOworc3RhdGljIGNoYXIgKmRtX2J1ZmlvX2NhY2hlX25hbWVzW1BBR0VfU0hJRlQgLSBTRUNUT1JfU0hJRlRdOworCitzdGF0aWMgaW5saW5lIGludCBkbV9idWZpb19jYWNoZV9pbmRleChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXVuc2lnbmVkIHJldCA9IGMtPmJsb2Nrc19wZXJfcGFnZV9iaXRzIC0gMTsKKworCUJVR19PTihyZXQgPj0gQVJSQVlfU0laRShkbV9idWZpb19jYWNoZXMpKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgRE1fQlVGSU9fQ0FDSEUoYykJKGRtX2J1ZmlvX2NhY2hlc1tkbV9idWZpb19jYWNoZV9pbmRleChjKV0pCisjZGVmaW5lIERNX0JVRklPX0NBQ0hFX05BTUUoYykJKGRtX2J1ZmlvX2NhY2hlX25hbWVzW2RtX2J1ZmlvX2NhY2hlX2luZGV4KGMpXSkKKworI2RlZmluZSBkbV9idWZpb19pbl9yZXF1ZXN0KCkJKCEhY3VycmVudC0+YmlvX2xpc3QpCisKK3N0YXRpYyB2b2lkIGRtX2J1ZmlvX2xvY2soc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwltdXRleF9sb2NrX25lc3RlZCgmYy0+bG9jaywgZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKK30KKworc3RhdGljIGludCBkbV9idWZpb190cnlsb2NrKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpCit7CisJcmV0dXJuIG11dGV4X3RyeWxvY2soJmMtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBkbV9idWZpb191bmxvY2soc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwltdXRleF91bmxvY2soJmMtPmxvY2spOworfQorCisvKgorICogRklYTUUgTW92ZSB0byBzY2hlZC5oPworICovCisjaWZkZWYgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZCisjICBkZWZpbmUgZG1fYnVmaW9fY29uZF9yZXNjaGVkKCkJCVwKK2RvIHsJCQkJCQlcCisJaWYgKHVubGlrZWx5KG5lZWRfcmVzY2hlZCgpKSkJCVwKKwkJX2NvbmRfcmVzY2hlZCgpOwkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjICBkZWZpbmUgZG1fYnVmaW9fY29uZF9yZXNjaGVkKCkgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBEZWZhdWx0IGNhY2hlIHNpemU6IGF2YWlsYWJsZSBtZW1vcnkgZGl2aWRlZCBieSB0aGUgcmF0aW8uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtX2J1ZmlvX2RlZmF1bHRfY2FjaGVfc2l6ZTsKKworLyoKKyAqIFRvdGFsIGNhY2hlIHNpemUgc2V0IGJ5IHRoZSB1c2VyLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19jYWNoZV9zaXplOworCisvKgorICogQSBjb3B5IG9mIGRtX2J1ZmlvX2NhY2hlX3NpemUgYmVjYXVzZSBkbV9idWZpb19jYWNoZV9zaXplIGNhbiBjaGFuZ2UKKyAqIGF0IGFueSB0aW1lLiAgSWYgaXQgZGlzYWdyZWVzLCB0aGUgdXNlciBoYXMgY2hhbmdlZCBjYWNoZSBzaXplLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19jYWNoZV9zaXplX2xhdGNoOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhcmFtX3NwaW5sb2NrKTsKKworLyoKKyAqIEJ1ZmZlcnMgYXJlIGZyZWVkIGFmdGVyIHRoaXMgdGltZW91dAorICovCitzdGF0aWMgdW5zaWduZWQgZG1fYnVmaW9fbWF4X2FnZSA9IERNX0JVRklPX0RFRkFVTFRfQUdFX1NFQ1M7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtX2J1ZmlvX3BlYWtfYWxsb2NhdGVkOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1fYnVmaW9fYWxsb2NhdGVkX2ttZW1fY2FjaGU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19hbGxvY2F0ZWRfZ2V0X2ZyZWVfcGFnZXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19hbGxvY2F0ZWRfdm1hbGxvYzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtX2J1ZmlvX2N1cnJlbnRfYWxsb2NhdGVkOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogUGVyLWNsaWVudCBjYWNoZTogZG1fYnVmaW9fY2FjaGVfc2l6ZSAvIGRtX2J1ZmlvX2NsaWVudF9jb3VudAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19jYWNoZV9zaXplX3Blcl9jbGllbnQ7CisKKy8qCisgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgY2xpZW50cy4KKyAqLworc3RhdGljIGludCBkbV9idWZpb19jbGllbnRfY291bnQ7CisKKy8qCisgKiBUaGUgbGlzdCBvZiBhbGwgY2xpZW50cy4KKyAqLworc3RhdGljIExJU1RfSEVBRChkbV9idWZpb19hbGxfY2xpZW50cyk7CisKKy8qCisgKiBUaGlzIG11dGV4IHByb3RlY3RzIGRtX2J1ZmlvX2NhY2hlX3NpemVfbGF0Y2gsCisgKiBkbV9idWZpb19jYWNoZV9zaXplX3Blcl9jbGllbnQgYW5kIGRtX2J1ZmlvX2NsaWVudF9jb3VudAorICovCitzdGF0aWMgREVGSU5FX01VVEVYKGRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIGFkanVzdF90b3RhbF9hbGxvY2F0ZWQoZW51bSBkYXRhX21vZGUgZGF0YV9tb2RlLCBsb25nIGRpZmYpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgKiBjb25zdCBjbGFzc19wdHJbREFUQV9NT0RFX0xJTUlUXSA9IHsKKwkJJmRtX2J1ZmlvX2FsbG9jYXRlZF9rbWVtX2NhY2hlLAorCQkmZG1fYnVmaW9fYWxsb2NhdGVkX2dldF9mcmVlX3BhZ2VzLAorCQkmZG1fYnVmaW9fYWxsb2NhdGVkX3ZtYWxsb2MsCisJfTsKKworCXNwaW5fbG9jaygmcGFyYW1fc3BpbmxvY2spOworCisJKmNsYXNzX3B0cltkYXRhX21vZGVdICs9IGRpZmY7CisKKwlkbV9idWZpb19jdXJyZW50X2FsbG9jYXRlZCArPSBkaWZmOworCisJaWYgKGRtX2J1ZmlvX2N1cnJlbnRfYWxsb2NhdGVkID4gZG1fYnVmaW9fcGVha19hbGxvY2F0ZWQpCisJCWRtX2J1ZmlvX3BlYWtfYWxsb2NhdGVkID0gZG1fYnVmaW9fY3VycmVudF9hbGxvY2F0ZWQ7CisKKwlzcGluX3VubG9jaygmcGFyYW1fc3BpbmxvY2spOworfQorCisvKgorICogQ2hhbmdlIHRoZSBudW1iZXIgb2YgY2xpZW50cyBhbmQgcmVjYWxjdWxhdGUgcGVyLWNsaWVudCBsaW1pdC4KKyAqLworc3RhdGljIHZvaWQgX19jYWNoZV9zaXplX3JlZnJlc2godm9pZCkKK3sKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZG1fYnVmaW9fY2xpZW50c19sb2NrKSk7CisJQlVHX09OKGRtX2J1ZmlvX2NsaWVudF9jb3VudCA8IDApOworCisJZG1fYnVmaW9fY2FjaGVfc2l6ZV9sYXRjaCA9IGRtX2J1ZmlvX2NhY2hlX3NpemU7CisKKwliYXJyaWVyKCk7CisKKwkvKgorCSAqIFVzZSBkZWZhdWx0IGlmIHNldCB0byAwIGFuZCByZXBvcnQgdGhlIGFjdHVhbCBjYWNoZSBzaXplIHVzZWQuCisJICovCisJaWYgKCFkbV9idWZpb19jYWNoZV9zaXplX2xhdGNoKSB7CisJCSh2b2lkKWNtcHhjaGcoJmRtX2J1ZmlvX2NhY2hlX3NpemUsIDAsCisJCQkgICAgICBkbV9idWZpb19kZWZhdWx0X2NhY2hlX3NpemUpOworCQlkbV9idWZpb19jYWNoZV9zaXplX2xhdGNoID0gZG1fYnVmaW9fZGVmYXVsdF9jYWNoZV9zaXplOworCX0KKworCWRtX2J1ZmlvX2NhY2hlX3NpemVfcGVyX2NsaWVudCA9IGRtX2J1ZmlvX2NhY2hlX3NpemVfbGF0Y2ggLworCQkJCQkgKGRtX2J1ZmlvX2NsaWVudF9jb3VudCA/IDogMSk7Cit9CisKKy8qCisgKiBBbGxvY2F0aW5nIGJ1ZmZlciBkYXRhLgorICoKKyAqIFNtYWxsIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCB3aXRoIGttZW1fY2FjaGUsIHRvIHVzZSBzcGFjZSBvcHRpbWFsbHkuCisgKgorICogRm9yIGxhcmdlIGJ1ZmZlcnMsIHdlIGNob29zZSBiZXR3ZWVuIGdldF9mcmVlX3BhZ2VzIGFuZCB2bWFsbG9jLgorICogRWFjaCBoYXMgYWR2YW50YWdlcyBhbmQgZGlzYWR2YW50YWdlcy4KKyAqCisgKiBfX2dldF9mcmVlX3BhZ2VzIGNhbiByYW5kb21seSBmYWlsIGlmIHRoZSBtZW1vcnkgaXMgZnJhZ21lbnRlZC4KKyAqIF9fdm1hbGxvYyB3b24ndCByYW5kb21seSBmYWlsLCBidXQgdm1hbGxvYyBzcGFjZSBpcyBsaW1pdGVkIChpdCBtYXkgYmUKKyAqIGFzIGxvdyBhcyAxMjhNKSBzbyB1c2luZyBpdCBmb3IgY2FjaGluZyBpcyBub3QgYXBwcm9wcmlhdGUuCisgKgorICogSWYgdGhlIGFsbG9jYXRpb24gbWF5IGZhaWwgd2UgdXNlIF9fZ2V0X2ZyZWVfcGFnZXMuIE1lbW9yeSBmcmFnbWVudGF0aW9uCisgKiB3b24ndCBoYXZlIGEgZmF0YWwgZWZmZWN0IGhlcmUsIGJ1dCBpdCBqdXN0IGNhdXNlcyBmbHVzaGVzIG9mIHNvbWUgb3RoZXIKKyAqIGJ1ZmZlcnMgYW5kIG1vcmUgSS9PIHdpbGwgYmUgcGVyZm9ybWVkLiBEb24ndCB1c2UgX19nZXRfZnJlZV9wYWdlcyBpZiBpdAorICogYWx3YXlzIGZhaWxzIChpLmUuIG9yZGVyID49IE1BWF9PUkRFUikuCisgKgorICogSWYgdGhlIGFsbG9jYXRpb24gc2hvdWxkbid0IGZhaWwgd2UgdXNlIF9fdm1hbGxvYy4gVGhpcyBpcyBvbmx5IGZvciB0aGUKKyAqIGluaXRpYWwgcmVzZXJ2ZSBhbGxvY2F0aW9uLCBzbyB0aGVyZSdzIG5vIHJpc2sgb2Ygd2FzdGluZyBhbGwgdm1hbGxvYworICogc3BhY2UuCisgKi8KK3N0YXRpYyB2b2lkICphbGxvY19idWZmZXJfZGF0YShzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBnZnBfdCBnZnBfbWFzaywKKwkJCSAgICAgICBlbnVtIGRhdGFfbW9kZSAqZGF0YV9tb2RlKQoreworCWlmIChjLT5ibG9ja19zaXplIDw9IERNX0JVRklPX0JMT0NLX1NJWkVfU0xBQl9MSU1JVCkgeworCQkqZGF0YV9tb2RlID0gREFUQV9NT0RFX1NMQUI7CisJCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKERNX0JVRklPX0NBQ0hFKGMpLCBnZnBfbWFzayk7CisJfQorCisJaWYgKGMtPmJsb2NrX3NpemUgPD0gRE1fQlVGSU9fQkxPQ0tfU0laRV9HRlBfTElNSVQgJiYKKwkgICAgZ2ZwX21hc2sgJiBfX0dGUF9OT1JFVFJZKSB7CisJCSpkYXRhX21vZGUgPSBEQVRBX01PREVfR0VUX0ZSRUVfUEFHRVM7CisJCXJldHVybiAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwX21hc2ssCisJCQkJCQljLT5wYWdlc19wZXJfYmxvY2tfYml0cyk7CisJfQorCisJKmRhdGFfbW9kZSA9IERBVEFfTU9ERV9WTUFMTE9DOworCXJldHVybiBfX3ZtYWxsb2MoYy0+YmxvY2tfc2l6ZSwgZ2ZwX21hc2ssIFBBR0VfS0VSTkVMKTsKK30KKworLyoKKyAqIEZyZWUgYnVmZmVyJ3MgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgZnJlZV9idWZmZXJfZGF0YShzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLAorCQkJICAgICB2b2lkICpkYXRhLCBlbnVtIGRhdGFfbW9kZSBkYXRhX21vZGUpCit7CisJc3dpdGNoIChkYXRhX21vZGUpIHsKKwljYXNlIERBVEFfTU9ERV9TTEFCOgorCQlrbWVtX2NhY2hlX2ZyZWUoRE1fQlVGSU9fQ0FDSEUoYyksIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgREFUQV9NT0RFX0dFVF9GUkVFX1BBR0VTOgorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWRhdGEsIGMtPnBhZ2VzX3Blcl9ibG9ja19iaXRzKTsKKwkJYnJlYWs7CisKKwljYXNlIERBVEFfTU9ERV9WTUFMTE9DOgorCQl2ZnJlZShkYXRhKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlETUNSSVQoImRtX2J1ZmlvX2ZyZWVfYnVmZmVyX2RhdGE6IGJhZCBkYXRhIG1vZGU6ICVkIiwKKwkJICAgICAgIGRhdGFfbW9kZSk7CisJCUJVRygpOworCX0KK30KKworLyoKKyAqIEFsbG9jYXRlIGJ1ZmZlciBhbmQgaXRzIGRhdGEuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1fYnVmZmVyICphbGxvY19idWZmZXIoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgZ2ZwX3QgZ2ZwX21hc2spCit7CisJc3RydWN0IGRtX2J1ZmZlciAqYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbV9idWZmZXIpICsgYy0+YXV4X3NpemUsCisJCQkJICAgICAgZ2ZwX21hc2spOworCisJaWYgKCFiKQorCQlyZXR1cm4gTlVMTDsKKworCWItPmMgPSBjOworCisJYi0+ZGF0YSA9IGFsbG9jX2J1ZmZlcl9kYXRhKGMsIGdmcF9tYXNrLCAmYi0+ZGF0YV9tb2RlKTsKKwlpZiAoIWItPmRhdGEpIHsKKwkJa2ZyZWUoYik7CisJCXJldHVybiBOVUxMOworCX0KKworCWFkanVzdF90b3RhbF9hbGxvY2F0ZWQoYi0+ZGF0YV9tb2RlLCAobG9uZyljLT5ibG9ja19zaXplKTsKKworCXJldHVybiBiOworfQorCisvKgorICogRnJlZSBidWZmZXIgYW5kIGl0cyBkYXRhLgorICovCitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcihzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCisJYWRqdXN0X3RvdGFsX2FsbG9jYXRlZChiLT5kYXRhX21vZGUsIC0obG9uZyljLT5ibG9ja19zaXplKTsKKworCWZyZWVfYnVmZmVyX2RhdGEoYywgYi0+ZGF0YSwgYi0+ZGF0YV9tb2RlKTsKKwlrZnJlZShiKTsKK30KKworLyoKKyAqIExpbmsgYnVmZmVyIHRvIHRoZSBoYXNoIGxpc3QgYW5kIGNsZWFuIG9yIGRpcnR5IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBfX2xpbmtfYnVmZmVyKHN0cnVjdCBkbV9idWZmZXIgKmIsIHNlY3Rvcl90IGJsb2NrLCBpbnQgZGlydHkpCit7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYyA9IGItPmM7CisKKwljLT5uX2J1ZmZlcnNbZGlydHldKys7CisJYi0+YmxvY2sgPSBibG9jazsKKwliLT5saXN0X21vZGUgPSBkaXJ0eTsKKwlsaXN0X2FkZCgmYi0+bHJ1X2xpc3QsICZjLT5scnVbZGlydHldKTsKKwlobGlzdF9hZGRfaGVhZCgmYi0+aGFzaF9saXN0LCAmYy0+Y2FjaGVfaGFzaFtETV9CVUZJT19IQVNIKGJsb2NrKV0pOworCWItPmxhc3RfYWNjZXNzZWQgPSBqaWZmaWVzOworfQorCisvKgorICogVW5saW5rIGJ1ZmZlciBmcm9tIHRoZSBoYXNoIGxpc3QgYW5kIGRpcnR5IG9yIGNsZWFuIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBfX3VubGlua19idWZmZXIoc3RydWN0IGRtX2J1ZmZlciAqYikKK3sKKwlzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjID0gYi0+YzsKKworCUJVR19PTighYy0+bl9idWZmZXJzW2ItPmxpc3RfbW9kZV0pOworCisJYy0+bl9idWZmZXJzW2ItPmxpc3RfbW9kZV0tLTsKKwlobGlzdF9kZWwoJmItPmhhc2hfbGlzdCk7CisJbGlzdF9kZWwoJmItPmxydV9saXN0KTsKK30KKworLyoKKyAqIFBsYWNlIHRoZSBidWZmZXIgdG8gdGhlIGhlYWQgb2YgZGlydHkgb3IgY2xlYW4gTFJVIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBfX3JlbGlua19scnUoc3RydWN0IGRtX2J1ZmZlciAqYiwgaW50IGRpcnR5KQoreworCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCisJQlVHX09OKCFjLT5uX2J1ZmZlcnNbYi0+bGlzdF9tb2RlXSk7CisKKwljLT5uX2J1ZmZlcnNbYi0+bGlzdF9tb2RlXS0tOworCWMtPm5fYnVmZmVyc1tkaXJ0eV0rKzsKKwliLT5saXN0X21vZGUgPSBkaXJ0eTsKKwlsaXN0X2RlbCgmYi0+bHJ1X2xpc3QpOworCWxpc3RfYWRkKCZiLT5scnVfbGlzdCwgJmMtPmxydVtkaXJ0eV0pOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1Ym1pdCBJL08gb24gdGhlIGJ1ZmZlci4KKyAqCisgKiBCaW8gaW50ZXJmYWNlIGlzIGZhc3RlciBidXQgaXQgaGFzIHNvbWUgcHJvYmxlbXM6CisgKgl0aGUgdmVjdG9yIGxpc3QgaXMgbGltaXRlZCAoaW5jcmVhc2luZyB0aGlzIGxpbWl0IGluY3JlYXNlcworICoJbWVtb3J5LWNvbnN1bXB0aW9uIHBlciBidWZmZXIsIHNvIGl0IGlzIG5vdCB2aWFibGUpOworICoKKyAqCXRoZSBtZW1vcnkgbXVzdCBiZSBkaXJlY3QtbWFwcGVkLCBub3Qgdm1hbGxvY2VkOworICoKKyAqCXRoZSBJL08gZHJpdmVyIGNhbiByZWplY3QgcmVxdWVzdHMgc3B1cmlvdXNseSBpZiBpdCB0aGlua3MgdGhhdAorICoJdGhlIHJlcXVlc3RzIGFyZSB0b28gYmlnIGZvciB0aGUgZGV2aWNlIG9yIGlmIHRoZXkgY3Jvc3MgYQorICoJY29udHJvbGxlci1kZWZpbmVkIG1lbW9yeSBib3VuZGFyeS4KKyAqCisgKiBJZiB0aGUgYnVmZmVyIGlzIHNtYWxsIGVub3VnaCAodXAgdG8gRE1fQlVGSU9fSU5MSU5FX1ZFQ1MgcGFnZXMpIGFuZAorICogaXQgaXMgbm90IHZtYWxsb2NlZCwgdHJ5IHVzaW5nIHRoZSBiaW8gaW50ZXJmYWNlLgorICoKKyAqIElmIHRoZSBidWZmZXIgaXMgYmlnLCBpZiBpdCBpcyB2bWFsbG9jZWQgb3IgaWYgdGhlIHVuZGVybHlpbmcgZGV2aWNlCisgKiByZWplY3RzIHRoZSBiaW8gYmVjYXVzZSBpdCBpcyB0b28gbGFyZ2UsIHVzZSBkbS1pbyBsYXllciB0byBkbyB0aGUgSS9PLgorICogVGhlIGRtLWlvIGxheWVyIHNwbGl0cyB0aGUgSS9PIGludG8gbXVsdGlwbGUgcmVxdWVzdHMsIGF2b2lkaW5nIHRoZSBhYm92ZQorICogc2hvcnRjb21pbmdzLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBkbS1pbyBjb21wbGV0aW9uIHJvdXRpbmUuIEl0IGp1c3QgY2FsbHMgYi0+YmlvLmJpX2VuZF9pbywgcHJldGVuZGluZworICogdGhhdCB0aGUgcmVxdWVzdCB3YXMgaGFuZGxlZCBkaXJlY3RseSB3aXRoIGJpbyBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGRtaW9fY29tcGxldGUodW5zaWduZWQgbG9uZyBlcnJvciwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiID0gY29udGV4dDsKKworCWItPmJpby5iaV9lbmRfaW8oJmItPmJpbywgZXJyb3IgPyAtRUlPIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHVzZV9kbWlvKHN0cnVjdCBkbV9idWZmZXIgKmIsIGludCBydywgc2VjdG9yX3QgYmxvY2ssCisJCSAgICAgYmlvX2VuZF9pb190ICplbmRfaW8pCit7CisJaW50IHI7CisJc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0geworCQkuYmlfcncgPSBydywKKwkJLm5vdGlmeS5mbiA9IGRtaW9fY29tcGxldGUsCisJCS5ub3RpZnkuY29udGV4dCA9IGIsCisJCS5jbGllbnQgPSBiLT5jLT5kbV9pbywKKwl9OworCXN0cnVjdCBkbV9pb19yZWdpb24gcmVnaW9uID0geworCQkuYmRldiA9IGItPmMtPmJkZXYsCisJCS5zZWN0b3IgPSBibG9jayA8PCBiLT5jLT5zZWN0b3JzX3Blcl9ibG9ja19iaXRzLAorCQkuY291bnQgPSBiLT5jLT5ibG9ja19zaXplID4+IFNFQ1RPUl9TSElGVCwKKwl9OworCisJaWYgKGItPmRhdGFfbW9kZSAhPSBEQVRBX01PREVfVk1BTExPQykgeworCQlpb19yZXEubWVtLnR5cGUgPSBETV9JT19LTUVNOworCQlpb19yZXEubWVtLnB0ci5hZGRyID0gYi0+ZGF0YTsKKwl9IGVsc2UgeworCQlpb19yZXEubWVtLnR5cGUgPSBETV9JT19WTUE7CisJCWlvX3JlcS5tZW0ucHRyLnZtYSA9IGItPmRhdGE7CisJfQorCisJYi0+YmlvLmJpX2VuZF9pbyA9IGVuZF9pbzsKKworCXIgPSBkbV9pbygmaW9fcmVxLCAxLCAmcmVnaW9uLCBOVUxMKTsKKwlpZiAocikKKwkJZW5kX2lvKCZiLT5iaW8sIHIpOworfQorCitzdGF0aWMgdm9pZCB1c2VfaW5saW5lX2JpbyhzdHJ1Y3QgZG1fYnVmZmVyICpiLCBpbnQgcncsIHNlY3Rvcl90IGJsb2NrLAorCQkJICAgYmlvX2VuZF9pb190ICplbmRfaW8pCit7CisJY2hhciAqcHRyOworCWludCBsZW47CisKKwliaW9faW5pdCgmYi0+YmlvKTsKKwliLT5iaW8uYmlfaW9fdmVjID0gYi0+YmlvX3ZlYzsKKwliLT5iaW8uYmlfbWF4X3ZlY3MgPSBETV9CVUZJT19JTkxJTkVfVkVDUzsKKwliLT5iaW8uYmlfc2VjdG9yID0gYmxvY2sgPDwgYi0+Yy0+c2VjdG9yc19wZXJfYmxvY2tfYml0czsKKwliLT5iaW8uYmlfYmRldiA9IGItPmMtPmJkZXY7CisJYi0+YmlvLmJpX2VuZF9pbyA9IGVuZF9pbzsKKworCS8qCisJICogV2UgYXNzdW1lIHRoYXQgaWYgbGVuID49IFBBR0VfU0laRSBwdHIgaXMgcGFnZS1hbGlnbmVkLgorCSAqIElmIGxlbiA8IFBBR0VfU0laRSB0aGUgYnVmZmVyIGRvZXNuJ3QgY3Jvc3MgcGFnZSBib3VuZGFyeS4KKwkgKi8KKwlwdHIgPSBiLT5kYXRhOworCWxlbiA9IGItPmMtPmJsb2NrX3NpemU7CisKKwlpZiAobGVuID49IFBBR0VfU0laRSkKKwkJQlVHX09OKCh1bnNpZ25lZCBsb25nKXB0ciAmIChQQUdFX1NJWkUgLSAxKSk7CisJZWxzZQorCQlCVUdfT04oKHVuc2lnbmVkIGxvbmcpcHRyICYgKGxlbiAtIDEpKTsKKworCWRvIHsKKwkJaWYgKCFiaW9fYWRkX3BhZ2UoJmItPmJpbywgdmlydF90b19wYWdlKHB0ciksCisJCQkJICBsZW4gPCBQQUdFX1NJWkUgPyBsZW4gOiBQQUdFX1NJWkUsCisJCQkJICB2aXJ0X3RvX3BoeXMocHRyKSAmIChQQUdFX1NJWkUgLSAxKSkpIHsKKwkJCUJVR19PTihiLT5jLT5ibG9ja19zaXplIDw9IFBBR0VfU0laRSk7CisJCQl1c2VfZG1pbyhiLCBydywgYmxvY2ssIGVuZF9pbyk7CisJCQlyZXR1cm47CisJCX0KKworCQlsZW4gLT0gUEFHRV9TSVpFOworCQlwdHIgKz0gUEFHRV9TSVpFOworCX0gd2hpbGUgKGxlbiA+IDApOworCisJc3VibWl0X2JpbyhydywgJmItPmJpbyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1Ym1pdF9pbyhzdHJ1Y3QgZG1fYnVmZmVyICpiLCBpbnQgcncsIHNlY3Rvcl90IGJsb2NrLAorCQkgICAgICBiaW9fZW5kX2lvX3QgKmVuZF9pbykKK3sKKwlpZiAocncgPT0gV1JJVEUgJiYgYi0+Yy0+d3JpdGVfY2FsbGJhY2spCisJCWItPmMtPndyaXRlX2NhbGxiYWNrKGIpOworCisJaWYgKGItPmMtPmJsb2NrX3NpemUgPD0gRE1fQlVGSU9fSU5MSU5FX1ZFQ1MgKiBQQUdFX1NJWkUgJiYKKwkgICAgYi0+ZGF0YV9tb2RlICE9IERBVEFfTU9ERV9WTUFMTE9DKQorCQl1c2VfaW5saW5lX2JpbyhiLCBydywgYmxvY2ssIGVuZF9pbyk7CisJZWxzZQorCQl1c2VfZG1pbyhiLCBydywgYmxvY2ssIGVuZF9pbyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV3JpdGluZyBkaXJ0eSBidWZmZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFRoZSBlbmRpbyByb3V0aW5lIGZvciB3cml0ZS4KKyAqCisgKiBTZXQgdGhlIGVycm9yLCBjbGVhciBCX1dSSVRJTkcgYml0IGFuZCB3YWtlIGFueW9uZSB3aG8gd2FzIHdhaXRpbmcgb24KKyAqIGl0LgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiID0gY29udGFpbmVyX29mKGJpbywgc3RydWN0IGRtX2J1ZmZlciwgYmlvKTsKKworCWItPndyaXRlX2Vycm9yID0gZXJyb3I7CisJaWYgKGVycm9yKSB7CisJCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCQkodm9pZCljbXB4Y2hnKCZjLT5hc3luY193cml0ZV9lcnJvciwgMCwgZXJyb3IpOworCX0KKworCUJVR19PTighdGVzdF9iaXQoQl9XUklUSU5HLCAmYi0+c3RhdGUpKTsKKworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKworCXdha2VfdXBfYml0KCZiLT5zdGF0ZSwgQl9XUklUSU5HKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2FpdF9vbl9iaXQgaXMgYWN0dWFsbHkgd2FpdGluZy4KKyAqLworc3RhdGljIGludCBkb19pb19zY2hlZHVsZSh2b2lkICp3b3JkKQoreworCWlvX3NjaGVkdWxlKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYXRlIGEgd3JpdGUgb24gYSBkaXJ0eSBidWZmZXIsIGJ1dCBkb24ndCB3YWl0IGZvciBpdC4KKyAqCisgKiAtIElmIHRoZSBidWZmZXIgaXMgbm90IGRpcnR5LCBleGl0LgorICogLSBJZiB0aGVyZSBzb21lIHByZXZpb3VzIHdyaXRlIGdvaW5nIG9uLCB3YWl0IGZvciBpdCB0byBmaW5pc2ggKHdlIGNhbid0CisgKiAgIGhhdmUgdHdvIHdyaXRlcyBvbiB0aGUgc2FtZSBidWZmZXIgc2ltdWx0YW5lb3VzbHkpLgorICogLSBTdWJtaXQgb3VyIHdyaXRlIGFuZCBkb24ndCB3YWl0IG9uIGl0LiBXZSBzZXQgQl9XUklUSU5HIGluZGljYXRpbmcKKyAqICAgdGhhdCB0aGVyZSBpcyBhIHdyaXRlIGluIHByb2dyZXNzLgorICovCitzdGF0aWMgdm9pZCBfX3dyaXRlX2RpcnR5X2J1ZmZlcihzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCWlmICghdGVzdF9iaXQoQl9ESVJUWSwgJmItPnN0YXRlKSkKKwkJcmV0dXJuOworCisJY2xlYXJfYml0KEJfRElSVFksICZiLT5zdGF0ZSk7CisJd2FpdF9vbl9iaXRfbG9jaygmYi0+c3RhdGUsIEJfV1JJVElORywKKwkJCSBkb19pb19zY2hlZHVsZSwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJc3VibWl0X2lvKGIsIFdSSVRFLCBiLT5ibG9jaywgd3JpdGVfZW5kaW8pOworfQorCisvKgorICogV2FpdCB1bnRpbCBhbnkgYWN0aXZpdHkgb24gdGhlIGJ1ZmZlciBmaW5pc2hlcy4gIFBvc3NpYmx5IHdyaXRlIHRoZQorICogYnVmZmVyIGlmIGl0IGlzIGRpcnR5LiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGZpbmlzaGVzLCB0aGVyZSBpcyBubyBJL08KKyAqIHJ1bm5pbmcgb24gdGhlIGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBpcyBub3QgZGlydHkuCisgKi8KK3N0YXRpYyB2b2lkIF9fbWFrZV9idWZmZXJfY2xlYW4oc3RydWN0IGRtX2J1ZmZlciAqYikKK3sKKwlCVUdfT04oYi0+aG9sZF9jb3VudCk7CisKKwlpZiAoIWItPnN0YXRlKQkvKiBmYXN0IGNhc2UgKi8KKwkJcmV0dXJuOworCisJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1JFQURJTkcsIGRvX2lvX3NjaGVkdWxlLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJX193cml0ZV9kaXJ0eV9idWZmZXIoYik7CisJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1dSSVRJTkcsIGRvX2lvX3NjaGVkdWxlLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Cit9CisKKy8qCisgKiBGaW5kIHNvbWUgYnVmZmVyIHRoYXQgaXMgbm90IGhlbGQgYnkgYW55Ym9keSwgY2xlYW4gaXQsIHVubGluayBpdCBhbmQKKyAqIHJldHVybiBpdC4KKyAqLworc3RhdGljIHN0cnVjdCBkbV9idWZmZXIgKl9fZ2V0X3VuY2xhaW1lZF9idWZmZXIoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGIsICZjLT5scnVbTElTVF9DTEVBTl0sIGxydV9saXN0KSB7CisJCUJVR19PTih0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkpOworCQlCVUdfT04odGVzdF9iaXQoQl9ESVJUWSwgJmItPnN0YXRlKSk7CisKKwkJaWYgKCFiLT5ob2xkX2NvdW50KSB7CisJCQlfX21ha2VfYnVmZmVyX2NsZWFuKGIpOworCQkJX191bmxpbmtfYnVmZmVyKGIpOworCQkJcmV0dXJuIGI7CisJCX0KKwkJZG1fYnVmaW9fY29uZF9yZXNjaGVkKCk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGIsICZjLT5scnVbTElTVF9ESVJUWV0sIGxydV9saXN0KSB7CisJCUJVR19PTih0ZXN0X2JpdChCX1JFQURJTkcsICZiLT5zdGF0ZSkpOworCisJCWlmICghYi0+aG9sZF9jb3VudCkgeworCQkJX19tYWtlX2J1ZmZlcl9jbGVhbihiKTsKKwkJCV9fdW5saW5rX2J1ZmZlcihiKTsKKwkJCXJldHVybiBiOworCQl9CisJCWRtX2J1ZmlvX2NvbmRfcmVzY2hlZCgpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogV2FpdCB1bnRpbCBzb21lIG90aGVyIHRocmVhZHMgZnJlZSBzb21lIGJ1ZmZlciBvciByZWxlYXNlIGhvbGQgY291bnQgb24KKyAqIHNvbWUgYnVmZmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZW50ZXJlZCB3aXRoIGMtPmxvY2sgaGVsZCwgZHJvcHMgaXQgYW5kIHJlZ2FpbnMgaXQKKyAqIGJlZm9yZSBleGl0aW5nLgorICovCitzdGF0aWMgdm9pZCBfX3dhaXRfZm9yX2ZyZWVfYnVmZmVyKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmYy0+ZnJlZV9idWZmZXJfd2FpdCwgJndhaXQpOworCXNldF90YXNrX3N0YXRlKGN1cnJlbnQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlkbV9idWZpb191bmxvY2soYyk7CisKKwlpb19zY2hlZHVsZSgpOworCisJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmYy0+ZnJlZV9idWZmZXJfd2FpdCwgJndhaXQpOworCisJZG1fYnVmaW9fbG9jayhjKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4gSWYgdGhlIGFsbG9jYXRpb24gaXMgbm90IHBvc3NpYmxlLCB3YWl0IHVudGlsCisgKiBzb21lIG90aGVyIHRocmVhZCBmcmVlcyBhIGJ1ZmZlci4KKyAqCisgKiBNYXkgZHJvcCB0aGUgbG9jayBhbmQgcmVnYWluIGl0LgorICovCitzdGF0aWMgc3RydWN0IGRtX2J1ZmZlciAqX19hbGxvY19idWZmZXJfd2FpdF9ub19jYWxsYmFjayhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXN0cnVjdCBkbV9idWZmZXIgKmI7CisKKwkvKgorCSAqIGRtLWJ1ZmlvIGlzIHJlc2lzdGFudCB0byBhbGxvY2F0aW9uIGZhaWx1cmVzIChpdCBqdXN0IGtlZXBzCisJICogb25lIGJ1ZmZlciByZXNlcnZlZCBpbiBjYXNlcyBhbGwgdGhlIGFsbG9jYXRpb25zIGZhaWwpLgorCSAqIFNvIHNldCBmbGFncyB0byBub3QgdHJ5IHRvbyBoYXJkOgorCSAqCUdGUF9OT0lPOiBkb24ndCByZWN1cnNlIGludG8gdGhlIEkvTyBsYXllcgorCSAqCV9fR0ZQX05PUkVUUlk6IGRvbid0IHJldHJ5IGFuZCByYXRoZXIgcmV0dXJuIGZhaWx1cmUKKwkgKglfX0dGUF9OT01FTUFMTE9DOiBkb24ndCB1c2UgZW1lcmdlbmN5IHJlc2VydmVzCisJICoJX19HRlBfTk9XQVJOOiBkb24ndCBwcmludCBhIHdhcm5pbmcgaW4gY2FzZSBvZiBmYWlsdXJlCisJICoKKwkgKiBGb3IgZGVidWdnaW5nLCBpZiB3ZSBzZXQgdGhlIGNhY2hlIHNpemUgdG8gMSwgbm8gbmV3IGJ1ZmZlcnMgd2lsbAorCSAqIGJlIGFsbG9jYXRlZC4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoZG1fYnVmaW9fY2FjaGVfc2l6ZV9sYXRjaCAhPSAxKSB7CisJCQliID0gYWxsb2NfYnVmZmVyKGMsIEdGUF9OT0lPIHwgX19HRlBfTk9SRVRSWSB8IF9fR0ZQX05PTUVNQUxMT0MgfCBfX0dGUF9OT1dBUk4pOworCQkJaWYgKGIpCisJCQkJcmV0dXJuIGI7CisJCX0KKworCQlpZiAoIWxpc3RfZW1wdHkoJmMtPnJlc2VydmVkX2J1ZmZlcnMpKSB7CisJCQliID0gbGlzdF9lbnRyeShjLT5yZXNlcnZlZF9idWZmZXJzLm5leHQsCisJCQkJICAgICAgIHN0cnVjdCBkbV9idWZmZXIsIGxydV9saXN0KTsKKwkJCWxpc3RfZGVsKCZiLT5scnVfbGlzdCk7CisJCQljLT5uZWVkX3Jlc2VydmVkX2J1ZmZlcnMrKzsKKworCQkJcmV0dXJuIGI7CisJCX0KKworCQliID0gX19nZXRfdW5jbGFpbWVkX2J1ZmZlcihjKTsKKwkJaWYgKGIpCisJCQlyZXR1cm4gYjsKKworCQlfX3dhaXRfZm9yX2ZyZWVfYnVmZmVyKGMpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBkbV9idWZmZXIgKl9fYWxsb2NfYnVmZmVyX3dhaXQoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiID0gX19hbGxvY19idWZmZXJfd2FpdF9ub19jYWxsYmFjayhjKTsKKworCWlmIChjLT5hbGxvY19jYWxsYmFjaykKKwkJYy0+YWxsb2NfY2FsbGJhY2soYik7CisKKwlyZXR1cm4gYjsKK30KKworLyoKKyAqIEZyZWUgYSBidWZmZXIgYW5kIHdha2Ugb3RoZXIgdGhyZWFkcyB3YWl0aW5nIGZvciBmcmVlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIF9fZnJlZV9idWZmZXJfd2FrZShzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCisJaWYgKCFjLT5uZWVkX3Jlc2VydmVkX2J1ZmZlcnMpCisJCWZyZWVfYnVmZmVyKGIpOworCWVsc2UgeworCQlsaXN0X2FkZCgmYi0+bHJ1X2xpc3QsICZjLT5yZXNlcnZlZF9idWZmZXJzKTsKKwkJYy0+bmVlZF9yZXNlcnZlZF9idWZmZXJzLS07CisJfQorCisJd2FrZV91cCgmYy0+ZnJlZV9idWZmZXJfd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fd3JpdGVfZGlydHlfYnVmZmVyc19hc3luYyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBpbnQgbm9fd2FpdCkKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoYiwgdG1wLCAmYy0+bHJ1W0xJU1RfRElSVFldLCBscnVfbGlzdCkgeworCQlCVUdfT04odGVzdF9iaXQoQl9SRUFESU5HLCAmYi0+c3RhdGUpKTsKKworCQlpZiAoIXRlc3RfYml0KEJfRElSVFksICZiLT5zdGF0ZSkgJiYKKwkJICAgICF0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkpIHsKKwkJCV9fcmVsaW5rX2xydShiLCBMSVNUX0NMRUFOKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG5vX3dhaXQgJiYgdGVzdF9iaXQoQl9XUklUSU5HLCAmYi0+c3RhdGUpKQorCQkJcmV0dXJuOworCisJCV9fd3JpdGVfZGlydHlfYnVmZmVyKGIpOworCQlkbV9idWZpb19jb25kX3Jlc2NoZWQoKTsKKwl9Cit9CisKKy8qCisgKiBHZXQgd3JpdGViYWNrIHRocmVzaG9sZCBhbmQgYnVmZmVyIGxpbWl0IGZvciBhIGdpdmVuIGNsaWVudC4KKyAqLworc3RhdGljIHZvaWQgX19nZXRfbWVtb3J5X2xpbWl0KHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqdGhyZXNob2xkX2J1ZmZlcnMsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbGltaXRfYnVmZmVycykKK3sKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnM7CisKKwlpZiAoZG1fYnVmaW9fY2FjaGVfc2l6ZSAhPSBkbV9idWZpb19jYWNoZV9zaXplX2xhdGNoKSB7CisJCW11dGV4X2xvY2soJmRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisJCV9fY2FjaGVfc2l6ZV9yZWZyZXNoKCk7CisJCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKwl9CisKKwlidWZmZXJzID0gZG1fYnVmaW9fY2FjaGVfc2l6ZV9wZXJfY2xpZW50ID4+CisJCSAgKGMtPnNlY3RvcnNfcGVyX2Jsb2NrX2JpdHMgKyBTRUNUT1JfU0hJRlQpOworCisJaWYgKGJ1ZmZlcnMgPCBETV9CVUZJT19NSU5fQlVGRkVSUykKKwkJYnVmZmVycyA9IERNX0JVRklPX01JTl9CVUZGRVJTOworCisJKmxpbWl0X2J1ZmZlcnMgPSBidWZmZXJzOworCSp0aHJlc2hvbGRfYnVmZmVycyA9IGJ1ZmZlcnMgKiBETV9CVUZJT19XUklURUJBQ0tfUEVSQ0VOVCAvIDEwMDsKK30KKworLyoKKyAqIENoZWNrIGlmIHdlJ3JlIG92ZXIgd2F0ZXJtYXJrLgorICogSWYgd2UgYXJlIG92ZXIgdGhyZXNob2xkX2J1ZmZlcnMsIHN0YXJ0IGZyZWVpbmcgYnVmZmVycy4KKyAqIElmIHdlJ3JlIG92ZXIgImxpbWl0X2J1ZmZlcnMiLCBibG9jayB1bnRpbCB3ZSBnZXQgdW5kZXIgdGhlIGxpbWl0LgorICovCitzdGF0aWMgdm9pZCBfX2NoZWNrX3dhdGVybWFyayhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXVuc2lnbmVkIGxvbmcgdGhyZXNob2xkX2J1ZmZlcnMsIGxpbWl0X2J1ZmZlcnM7CisKKwlfX2dldF9tZW1vcnlfbGltaXQoYywgJnRocmVzaG9sZF9idWZmZXJzLCAmbGltaXRfYnVmZmVycyk7CisKKwl3aGlsZSAoYy0+bl9idWZmZXJzW0xJU1RfQ0xFQU5dICsgYy0+bl9idWZmZXJzW0xJU1RfRElSVFldID4KKwkgICAgICAgbGltaXRfYnVmZmVycykgeworCisJCXN0cnVjdCBkbV9idWZmZXIgKmIgPSBfX2dldF91bmNsYWltZWRfYnVmZmVyKGMpOworCisJCWlmICghYikKKwkJCXJldHVybjsKKworCQlfX2ZyZWVfYnVmZmVyX3dha2UoYik7CisJCWRtX2J1ZmlvX2NvbmRfcmVzY2hlZCgpOworCX0KKworCWlmIChjLT5uX2J1ZmZlcnNbTElTVF9ESVJUWV0gPiB0aHJlc2hvbGRfYnVmZmVycykKKwkJX193cml0ZV9kaXJ0eV9idWZmZXJzX2FzeW5jKGMsIDEpOworfQorCisvKgorICogRmluZCBhIGJ1ZmZlciBpbiB0aGUgaGFzaC4KKyAqLworc3RhdGljIHN0cnVjdCBkbV9idWZmZXIgKl9fZmluZChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaykKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiOworCXN0cnVjdCBobGlzdF9ub2RlICpobjsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsIGhuLCAmYy0+Y2FjaGVfaGFzaFtETV9CVUZJT19IQVNIKGJsb2NrKV0sCisJCQkgICAgIGhhc2hfbGlzdCkgeworCQlkbV9idWZpb19jb25kX3Jlc2NoZWQoKTsKKwkJaWYgKGItPmJsb2NrID09IGJsb2NrKQorCQkJcmV0dXJuIGI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2V0dGluZyBhIGJ1ZmZlcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VudW0gbmV3X2ZsYWcgeworCU5GX0ZSRVNIID0gMCwKKwlORl9SRUFEID0gMSwKKwlORl9HRVQgPSAyCit9OworCitzdGF0aWMgc3RydWN0IGRtX2J1ZmZlciAqX19idWZpb19uZXcoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgc2VjdG9yX3QgYmxvY2ssCisJCQkJICAgICBlbnVtIG5ld19mbGFnIG5mLCBzdHJ1Y3QgZG1fYnVmZmVyICoqYnAsCisJCQkJICAgICBpbnQgKm5lZWRfc3VibWl0KQoreworCXN0cnVjdCBkbV9idWZmZXIgKmIsICpuZXdfYiA9IE5VTEw7CisKKwkqbmVlZF9zdWJtaXQgPSAwOworCisJYiA9IF9fZmluZChjLCBibG9jayk7CisJaWYgKGIpIHsKKwkJYi0+aG9sZF9jb3VudCsrOworCQlfX3JlbGlua19scnUoYiwgdGVzdF9iaXQoQl9ESVJUWSwgJmItPnN0YXRlKSB8fAorCQkJICAgICB0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkpOworCQlyZXR1cm4gYjsKKwl9CisKKwlpZiAobmYgPT0gTkZfR0VUKQorCQlyZXR1cm4gTlVMTDsKKworCW5ld19iID0gX19hbGxvY19idWZmZXJfd2FpdChjKTsKKworCS8qCisJICogV2UndmUgaGFkIGEgcGVyaW9kIHdoZXJlIHRoZSBtdXRleCB3YXMgdW5sb2NrZWQsIHNvIG5lZWQgdG8KKwkgKiByZWNoZWNrIHRoZSBoYXNoIHRhYmxlLgorCSAqLworCWIgPSBfX2ZpbmQoYywgYmxvY2spOworCWlmIChiKSB7CisJCV9fZnJlZV9idWZmZXJfd2FrZShuZXdfYik7CisJCWItPmhvbGRfY291bnQrKzsKKwkJX19yZWxpbmtfbHJ1KGIsIHRlc3RfYml0KEJfRElSVFksICZiLT5zdGF0ZSkgfHwKKwkJCSAgICAgdGVzdF9iaXQoQl9XUklUSU5HLCAmYi0+c3RhdGUpKTsKKwkJcmV0dXJuIGI7CisJfQorCisJX19jaGVja193YXRlcm1hcmsoYyk7CisKKwliID0gbmV3X2I7CisJYi0+aG9sZF9jb3VudCA9IDE7CisJYi0+cmVhZF9lcnJvciA9IDA7CisJYi0+d3JpdGVfZXJyb3IgPSAwOworCV9fbGlua19idWZmZXIoYiwgYmxvY2ssIExJU1RfQ0xFQU4pOworCisJaWYgKG5mID09IE5GX0ZSRVNIKSB7CisJCWItPnN0YXRlID0gMDsKKwkJcmV0dXJuIGI7CisJfQorCisJYi0+c3RhdGUgPSAxIDw8IEJfUkVBRElORzsKKwkqbmVlZF9zdWJtaXQgPSAxOworCisJcmV0dXJuIGI7Cit9CisKKy8qCisgKiBUaGUgZW5kaW8gcm91dGluZSBmb3IgcmVhZGluZzogc2V0IHRoZSBlcnJvciwgY2xlYXIgdGhlIGJpdCBhbmQgd2FrZSB1cAorICogYW55b25lIHdhaXRpbmcgb24gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgcmVhZF9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiID0gY29udGFpbmVyX29mKGJpbywgc3RydWN0IGRtX2J1ZmZlciwgYmlvKTsKKworCWItPnJlYWRfZXJyb3IgPSBlcnJvcjsKKworCUJVR19PTighdGVzdF9iaXQoQl9SRUFESU5HLCAmYi0+c3RhdGUpKTsKKworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChCX1JFQURJTkcsICZiLT5zdGF0ZSk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKworCXdha2VfdXBfYml0KCZiLT5zdGF0ZSwgQl9SRUFESU5HKTsKK30KKworLyoKKyAqIEEgY29tbW9uIHJvdXRpbmUgZm9yIGRtX2J1ZmlvX25ldyBhbmQgZG1fYnVmaW9fcmVhZC4gIE9wZXJhdGlvbiBvZiB0aGVzZQorICogZnVuY3Rpb25zIGlzIHNpbWlsYXIgZXhjZXB0IHRoYXQgZG1fYnVmaW9fbmV3IGRvZXNuJ3QgcmVhZCB0aGUKKyAqIGJ1ZmZlciBmcm9tIHRoZSBkaXNrIChhc3N1bWluZyB0aGF0IHRoZSBjYWxsZXIgb3ZlcndyaXRlcyBhbGwgdGhlIGRhdGEKKyAqIGFuZCB1c2VzIGRtX2J1ZmlvX21hcmtfYnVmZmVyX2RpcnR5IHRvIHdyaXRlIG5ldyBkYXRhIGJhY2spLgorICovCitzdGF0aWMgdm9pZCAqbmV3X3JlYWQoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgc2VjdG9yX3QgYmxvY2ssCisJCSAgICAgIGVudW0gbmV3X2ZsYWcgbmYsIHN0cnVjdCBkbV9idWZmZXIgKipicCkKK3sKKwlpbnQgbmVlZF9zdWJtaXQ7CisJc3RydWN0IGRtX2J1ZmZlciAqYjsKKworCWRtX2J1ZmlvX2xvY2soYyk7CisJYiA9IF9fYnVmaW9fbmV3KGMsIGJsb2NrLCBuZiwgYnAsICZuZWVkX3N1Ym1pdCk7CisJZG1fYnVmaW9fdW5sb2NrKGMpOworCisJaWYgKCFiIHx8IElTX0VSUihiKSkKKwkJcmV0dXJuIGI7CisKKwlpZiAobmVlZF9zdWJtaXQpCisJCXN1Ym1pdF9pbyhiLCBSRUFELCBiLT5ibG9jaywgcmVhZF9lbmRpbyk7CisKKwl3YWl0X29uX2JpdCgmYi0+c3RhdGUsIEJfUkVBRElORywgZG9faW9fc2NoZWR1bGUsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKworCWlmIChiLT5yZWFkX2Vycm9yKSB7CisJCWludCBlcnJvciA9IGItPnJlYWRfZXJyb3I7CisKKwkJZG1fYnVmaW9fcmVsZWFzZShiKTsKKworCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJfQorCisJKmJwID0gYjsKKworCXJldHVybiBiLT5kYXRhOworfQorCit2b2lkICpkbV9idWZpb19nZXQoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgc2VjdG9yX3QgYmxvY2ssCisJCSAgIHN0cnVjdCBkbV9idWZmZXIgKipicCkKK3sKKwlyZXR1cm4gbmV3X3JlYWQoYywgYmxvY2ssIE5GX0dFVCwgYnApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fZ2V0KTsKKwordm9pZCAqZG1fYnVmaW9fcmVhZChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaywKKwkJICAgIHN0cnVjdCBkbV9idWZmZXIgKipicCkKK3sKKwlCVUdfT04oZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKKworCXJldHVybiBuZXdfcmVhZChjLCBibG9jaywgTkZfUkVBRCwgYnApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fcmVhZCk7CisKK3ZvaWQgKmRtX2J1ZmlvX25ldyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaywKKwkJICAgc3RydWN0IGRtX2J1ZmZlciAqKmJwKQoreworCUJVR19PTihkbV9idWZpb19pbl9yZXF1ZXN0KCkpOworCisJcmV0dXJuIG5ld19yZWFkKGMsIGJsb2NrLCBORl9GUkVTSCwgYnApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fbmV3KTsKKwordm9pZCBkbV9idWZpb19yZWxlYXNlKHN0cnVjdCBkbV9idWZmZXIgKmIpCit7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYyA9IGItPmM7CisKKwlkbV9idWZpb19sb2NrKGMpOworCisJQlVHX09OKHRlc3RfYml0KEJfUkVBRElORywgJmItPnN0YXRlKSk7CisJQlVHX09OKCFiLT5ob2xkX2NvdW50KTsKKworCWItPmhvbGRfY291bnQtLTsKKwlpZiAoIWItPmhvbGRfY291bnQpIHsKKwkJd2FrZV91cCgmYy0+ZnJlZV9idWZmZXJfd2FpdCk7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgd2VyZSBlcnJvcnMgb24gdGhlIGJ1ZmZlciwgYW5kIHRoZSBidWZmZXIgaXMgbm90CisJCSAqIHRvIGJlIHdyaXR0ZW4sIGZyZWUgdGhlIGJ1ZmZlci4gVGhlcmUgaXMgbm8gcG9pbnQgaW4gY2FjaGluZworCQkgKiBpbnZhbGlkIGJ1ZmZlci4KKwkJICovCisJCWlmICgoYi0+cmVhZF9lcnJvciB8fCBiLT53cml0ZV9lcnJvcikgJiYKKwkJICAgICF0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkgJiYKKwkJICAgICF0ZXN0X2JpdChCX0RJUlRZLCAmYi0+c3RhdGUpKSB7CisJCQlfX3VubGlua19idWZmZXIoYik7CisJCQlfX2ZyZWVfYnVmZmVyX3dha2UoYik7CisJCX0KKwl9CisKKwlkbV9idWZpb191bmxvY2soYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19yZWxlYXNlKTsKKwordm9pZCBkbV9idWZpb19tYXJrX2J1ZmZlcl9kaXJ0eShzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCisJZG1fYnVmaW9fbG9jayhjKTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChCX0RJUlRZLCAmYi0+c3RhdGUpKQorCQlfX3JlbGlua19scnUoYiwgTElTVF9ESVJUWSk7CisKKwlkbV9idWZpb191bmxvY2soYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19tYXJrX2J1ZmZlcl9kaXJ0eSk7CisKK3ZvaWQgZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVyc19hc3luYyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCUJVR19PTihkbV9idWZpb19pbl9yZXF1ZXN0KCkpOworCisJZG1fYnVmaW9fbG9jayhjKTsKKwlfX3dyaXRlX2RpcnR5X2J1ZmZlcnNfYXN5bmMoYywgMCk7CisJZG1fYnVmaW9fdW5sb2NrKGMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVyc19hc3luYyk7CisKKy8qCisgKiBGb3IgcGVyZm9ybWFuY2UsIGl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZSBidWZmZXJzIGFyZSB3cml0dGVuIGFzeW5jaHJvbm91c2x5CisgKiBhbmQgc2ltdWx0YW5lb3VzbHkgKHNvIHRoYXQgdGhlIGJsb2NrIGxheWVyIGNhbiBtZXJnZSB0aGUgd3JpdGVzKSBhbmQgdGhlbgorICogd2FpdGVkIHVwb24uCisgKgorICogRmluYWxseSwgd2UgZmx1c2ggaGFyZHdhcmUgZGlzayBjYWNoZS4KKyAqLworaW50IGRtX2J1ZmlvX3dyaXRlX2RpcnR5X2J1ZmZlcnMoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwlpbnQgYSwgZjsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfcHJvY2Vzc2VkID0gMDsKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiLCAqdG1wOworCisJZG1fYnVmaW9fbG9jayhjKTsKKwlfX3dyaXRlX2RpcnR5X2J1ZmZlcnNfYXN5bmMoYywgMCk7CisKK2FnYWluOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGIsIHRtcCwgJmMtPmxydVtMSVNUX0RJUlRZXSwgbHJ1X2xpc3QpIHsKKwkJaW50IGRyb3BwZWRfbG9jayA9IDA7CisKKwkJaWYgKGJ1ZmZlcnNfcHJvY2Vzc2VkIDwgYy0+bl9idWZmZXJzW0xJU1RfRElSVFldKQorCQkJYnVmZmVyc19wcm9jZXNzZWQrKzsKKworCQlCVUdfT04odGVzdF9iaXQoQl9SRUFESU5HLCAmYi0+c3RhdGUpKTsKKworCQlpZiAodGVzdF9iaXQoQl9XUklUSU5HLCAmYi0+c3RhdGUpKSB7CisJCQlpZiAoYnVmZmVyc19wcm9jZXNzZWQgPCBjLT5uX2J1ZmZlcnNbTElTVF9ESVJUWV0pIHsKKwkJCQlkcm9wcGVkX2xvY2sgPSAxOworCQkJCWItPmhvbGRfY291bnQrKzsKKwkJCQlkbV9idWZpb191bmxvY2soYyk7CisJCQkJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1dSSVRJTkcsCisJCQkJCSAgICBkb19pb19zY2hlZHVsZSwKKwkJCQkJICAgIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlkbV9idWZpb19sb2NrKGMpOworCQkJCWItPmhvbGRfY291bnQtLTsKKwkJCX0gZWxzZQorCQkJCXdhaXRfb25fYml0KCZiLT5zdGF0ZSwgQl9XUklUSU5HLAorCQkJCQkgICAgZG9faW9fc2NoZWR1bGUsCisJCQkJCSAgICBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCX0KKworCQlpZiAoIXRlc3RfYml0KEJfRElSVFksICZiLT5zdGF0ZSkgJiYKKwkJICAgICF0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkpCisJCQlfX3JlbGlua19scnUoYiwgTElTVF9DTEVBTik7CisKKwkJZG1fYnVmaW9fY29uZF9yZXNjaGVkKCk7CisKKwkJLyoKKwkJICogSWYgd2UgZHJvcHBlZCB0aGUgbG9jaywgdGhlIGxpc3QgaXMgbm8gbG9uZ2VyIGNvbnNpc3RlbnQsCisJCSAqIHNvIHdlIG11c3QgcmVzdGFydCB0aGUgc2VhcmNoLgorCQkgKgorCQkgKiBJbiB0aGUgbW9zdCBjb21tb24gY2FzZSwgdGhlIGJ1ZmZlciBqdXN0IHByb2Nlc3NlZCBpcworCQkgKiByZWxpbmtlZCB0byB0aGUgY2xlYW4gbGlzdCwgc28gd2Ugd29uJ3QgbG9vcCBzY2FubmluZyB0aGUKKwkJICogc2FtZSBidWZmZXIgYWdhaW4gYW5kIGFnYWluLgorCQkgKgorCQkgKiBUaGlzIG1heSBsaXZlbG9jayBpZiB0aGVyZSBpcyBhbm90aGVyIHRocmVhZCBzaW11bHRhbmVvdXNseQorCQkgKiBkaXJ0eWluZyBidWZmZXJzLCBzbyB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgd2Fsa2VkCisJCSAqIGFuZCBpZiBpdCBleGNlZWRzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnVmZmVycywgaXQgbWVhbnMgdGhhdAorCQkgKiBzb21lb25lIGlzIGRvaW5nIHNvbWUgd3JpdGVzIHNpbXVsdGFuZW91c2x5IHdpdGggdXMuICBJbgorCQkgKiB0aGlzIGNhc2UsIHN0b3AsIGRyb3BwaW5nIHRoZSBsb2NrLgorCQkgKi8KKwkJaWYgKGRyb3BwZWRfbG9jaykKKwkJCWdvdG8gYWdhaW47CisJfQorCXdha2VfdXAoJmMtPmZyZWVfYnVmZmVyX3dhaXQpOworCWRtX2J1ZmlvX3VubG9jayhjKTsKKworCWEgPSB4Y2hnKCZjLT5hc3luY193cml0ZV9lcnJvciwgMCk7CisJZiA9IGRtX2J1ZmlvX2lzc3VlX2ZsdXNoKGMpOworCWlmIChhKQorCQlyZXR1cm4gYTsKKworCXJldHVybiBmOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVycyk7CisKKy8qCisgKiBVc2UgZG0taW8gdG8gc2VuZCBhbmQgZW1wdHkgYmFycmllciBmbHVzaCB0aGUgZGV2aWNlLgorICovCitpbnQgZG1fYnVmaW9faXNzdWVfZmx1c2goc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgZG1faW9fcmVxdWVzdCBpb19yZXEgPSB7CisJCS5iaV9ydyA9IFJFUV9GTFVTSCwKKwkJLm1lbS50eXBlID0gRE1fSU9fS01FTSwKKwkJLm1lbS5wdHIuYWRkciA9IE5VTEwsCisJCS5jbGllbnQgPSBjLT5kbV9pbywKKwl9OworCXN0cnVjdCBkbV9pb19yZWdpb24gaW9fcmVnID0geworCQkuYmRldiA9IGMtPmJkZXYsCisJCS5zZWN0b3IgPSAwLAorCQkuY291bnQgPSAwLAorCX07CisKKwlCVUdfT04oZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKKworCXJldHVybiBkbV9pbygmaW9fcmVxLCAxLCAmaW9fcmVnLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX2lzc3VlX2ZsdXNoKTsKKworLyoKKyAqIFdlIGZpcnN0IGRlbGV0ZSBhbnkgb3RoZXIgYnVmZmVyIHRoYXQgbWF5IGJlIGF0IHRoYXQgbmV3IGxvY2F0aW9uLgorICoKKyAqIFRoZW4sIHdlIHdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG9yaWdpbmFsIGxvY2F0aW9uIGlmIGl0IHdhcyBkaXJ0eS4KKyAqCisgKiBUaGVuLCBpZiB3ZSBhcmUgdGhlIG9ubHkgb25lIHdobyBpcyBob2xkaW5nIHRoZSBidWZmZXIsIHJlbGluayB0aGUgYnVmZmVyCisgKiBpbiB0aGUgaGFzaCBxdWV1ZSBmb3IgdGhlIG5ldyBsb2NhdGlvbi4KKyAqCisgKiBJZiB0aGVyZSB3YXMgc29tZW9uZSBlbHNlIGhvbGRpbmcgdGhlIGJ1ZmZlciwgd2Ugd3JpdGUgaXQgdG8gdGhlIG5ldworICogbG9jYXRpb24gYnV0IG5vdCByZWxpbmsgaXQsIGJlY2F1c2UgdGhhdCBvdGhlciB1c2VyIG5lZWRzIHRvIGhhdmUgdGhlIGJ1ZmZlcgorICogYXQgdGhlIHNhbWUgcGxhY2UuCisgKi8KK3ZvaWQgZG1fYnVmaW9fcmVsZWFzZV9tb3ZlKHN0cnVjdCBkbV9idWZmZXIgKmIsIHNlY3Rvcl90IG5ld19ibG9jaykKK3sKKwlzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjID0gYi0+YzsKKwlzdHJ1Y3QgZG1fYnVmZmVyICpuZXc7CisKKwlCVUdfT04oZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKKworCWRtX2J1ZmlvX2xvY2soYyk7CisKK3JldHJ5OgorCW5ldyA9IF9fZmluZChjLCBuZXdfYmxvY2spOworCWlmIChuZXcpIHsKKwkJaWYgKG5ldy0+aG9sZF9jb3VudCkgeworCQkJX193YWl0X2Zvcl9mcmVlX2J1ZmZlcihjKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKworCQkvKgorCQkgKiBGSVhNRTogSXMgdGhlcmUgYW55IHBvaW50IHdhaXRpbmcgZm9yIGEgd3JpdGUgdGhhdCdzIGdvaW5nCisJCSAqIHRvIGJlIG92ZXJ3cml0dGVuIGluIGEgYml0PworCQkgKi8KKwkJX19tYWtlX2J1ZmZlcl9jbGVhbihuZXcpOworCQlfX3VubGlua19idWZmZXIobmV3KTsKKwkJX19mcmVlX2J1ZmZlcl93YWtlKG5ldyk7CisJfQorCisJQlVHX09OKCFiLT5ob2xkX2NvdW50KTsKKwlCVUdfT04odGVzdF9iaXQoQl9SRUFESU5HLCAmYi0+c3RhdGUpKTsKKworCV9fd3JpdGVfZGlydHlfYnVmZmVyKGIpOworCWlmIChiLT5ob2xkX2NvdW50ID09IDEpIHsKKwkJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1dSSVRJTkcsCisJCQkgICAgZG9faW9fc2NoZWR1bGUsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2V0X2JpdChCX0RJUlRZLCAmYi0+c3RhdGUpOworCQlfX3VubGlua19idWZmZXIoYik7CisJCV9fbGlua19idWZmZXIoYiwgbmV3X2Jsb2NrLCBMSVNUX0RJUlRZKTsKKwl9IGVsc2UgeworCQlzZWN0b3JfdCBvbGRfYmxvY2s7CisJCXdhaXRfb25fYml0X2xvY2soJmItPnN0YXRlLCBCX1dSSVRJTkcsCisJCQkJIGRvX2lvX3NjaGVkdWxlLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCS8qCisJCSAqIFJlbGluayBidWZmZXIgdG8gIm5ld19ibG9jayIgc28gdGhhdCB3cml0ZV9jYWxsYmFjaworCQkgKiBzZWVzICJuZXdfYmxvY2siIGFzIGEgYmxvY2sgbnVtYmVyLgorCQkgKiBBZnRlciB0aGUgd3JpdGUsIGxpbmsgdGhlIGJ1ZmZlciBiYWNrIHRvIG9sZF9ibG9jay4KKwkJICogQWxsIHRoaXMgbXVzdCBiZSBkb25lIGluIGJ1ZmlvIGxvY2ssIHNvIHRoYXQgYmxvY2sgbnVtYmVyCisJCSAqIGNoYW5nZSBpc24ndCB2aXNpYmxlIHRvIG90aGVyIHRocmVhZHMuCisJCSAqLworCQlvbGRfYmxvY2sgPSBiLT5ibG9jazsKKwkJX191bmxpbmtfYnVmZmVyKGIpOworCQlfX2xpbmtfYnVmZmVyKGIsIG5ld19ibG9jaywgYi0+bGlzdF9tb2RlKTsKKwkJc3VibWl0X2lvKGIsIFdSSVRFLCBuZXdfYmxvY2ssIHdyaXRlX2VuZGlvKTsKKwkJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1dSSVRJTkcsCisJCQkgICAgZG9faW9fc2NoZWR1bGUsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJX191bmxpbmtfYnVmZmVyKGIpOworCQlfX2xpbmtfYnVmZmVyKGIsIG9sZF9ibG9jaywgYi0+bGlzdF9tb2RlKTsKKwl9CisKKwlkbV9idWZpb191bmxvY2soYyk7CisJZG1fYnVmaW9fcmVsZWFzZShiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX3JlbGVhc2VfbW92ZSk7CisKK3Vuc2lnbmVkIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpCit7CisJcmV0dXJuIGMtPmJsb2NrX3NpemU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19nZXRfYmxvY2tfc2l6ZSk7CisKK3NlY3Rvcl90IGRtX2J1ZmlvX2dldF9kZXZpY2Vfc2l6ZShzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXJldHVybiBpX3NpemVfcmVhZChjLT5iZGV2LT5iZF9pbm9kZSkgPj4KKwkJCSAgIChTRUNUT1JfU0hJRlQgKyBjLT5zZWN0b3JzX3Blcl9ibG9ja19iaXRzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX2dldF9kZXZpY2Vfc2l6ZSk7CisKK3NlY3Rvcl90IGRtX2J1ZmlvX2dldF9ibG9ja19udW1iZXIoc3RydWN0IGRtX2J1ZmZlciAqYikKK3sKKwlyZXR1cm4gYi0+YmxvY2s7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19nZXRfYmxvY2tfbnVtYmVyKTsKKwordm9pZCAqZG1fYnVmaW9fZ2V0X2Jsb2NrX2RhdGEoc3RydWN0IGRtX2J1ZmZlciAqYikKK3sKKwlyZXR1cm4gYi0+ZGF0YTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX2dldF9ibG9ja19kYXRhKTsKKwordm9pZCAqZG1fYnVmaW9fZ2V0X2F1eF9kYXRhKHN0cnVjdCBkbV9idWZmZXIgKmIpCit7CisJcmV0dXJuIGIgKyAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fZ2V0X2F1eF9kYXRhKTsKKworc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqZG1fYnVmaW9fZ2V0X2NsaWVudChzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCXJldHVybiBiLT5jOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fZ2V0X2NsaWVudCk7CisKK3N0YXRpYyB2b2lkIGRyb3BfYnVmZmVycyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXN0cnVjdCBkbV9idWZmZXIgKmI7CisJaW50IGk7CisKKwlCVUdfT04oZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKKworCS8qCisJICogQW4gb3B0aW1pemF0aW9uIHNvIHRoYXQgdGhlIGJ1ZmZlcnMgYXJlIG5vdCB3cml0dGVuIG9uZS1ieS1vbmUuCisJICovCisJZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVyc19hc3luYyhjKTsKKworCWRtX2J1ZmlvX2xvY2soYyk7CisKKwl3aGlsZSAoKGIgPSBfX2dldF91bmNsYWltZWRfYnVmZmVyKGMpKSkKKwkJX19mcmVlX2J1ZmZlcl93YWtlKGIpOworCisJZm9yIChpID0gMDsgaSA8IExJU1RfU0laRTsgaSsrKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZjLT5scnVbaV0sIGxydV9saXN0KQorCQkJRE1FUlIoImxlYWtlZCBidWZmZXIgJWxseCwgaG9sZCBjb3VudCAldSwgbGlzdCAlZCIsCisJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWItPmJsb2NrLCBiLT5ob2xkX2NvdW50LCBpKTsKKworCWZvciAoaSA9IDA7IGkgPCBMSVNUX1NJWkU7IGkrKykKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZjLT5scnVbaV0pKTsKKworCWRtX2J1ZmlvX3VubG9jayhjKTsKK30KKworLyoKKyAqIFRlc3QgaWYgdGhlIGJ1ZmZlciBpcyB1bnVzZWQgYW5kIHRvbyBvbGQsIGFuZCBjb21taXQgaXQuCisgKiBBdCBpZiBub2lvIGlzIHNldCwgd2UgbXVzdCBub3QgZG8gYW55IEkvTyBiZWNhdXNlIHdlIGhvbGQKKyAqIGRtX2J1ZmlvX2NsaWVudHNfbG9jayBhbmQgd2Ugd291bGQgcmlzayBkZWFkbG9jayBpZiB0aGUgSS9PIGdldHMgcmVyb3V0ZWQgdG8KKyAqIGRpZmZlcmVudCBidWZpbyBjbGllbnQuCisgKi8KK3N0YXRpYyBpbnQgX19jbGVhbnVwX29sZF9idWZmZXIoc3RydWN0IGRtX2J1ZmZlciAqYiwgZ2ZwX3QgZ2ZwLAorCQkJCXVuc2lnbmVkIGxvbmcgbWF4X2ppZmZpZXMpCit7CisJaWYgKGppZmZpZXMgLSBiLT5sYXN0X2FjY2Vzc2VkIDwgbWF4X2ppZmZpZXMpCisJCXJldHVybiAxOworCisJaWYgKCEoZ2ZwICYgX19HRlBfSU8pKSB7CisJCWlmICh0ZXN0X2JpdChCX1JFQURJTkcsICZiLT5zdGF0ZSkgfHwKKwkJICAgIHRlc3RfYml0KEJfV1JJVElORywgJmItPnN0YXRlKSB8fAorCQkgICAgdGVzdF9iaXQoQl9ESVJUWSwgJmItPnN0YXRlKSkKKwkJCXJldHVybiAxOworCX0KKworCWlmIChiLT5ob2xkX2NvdW50KQorCQlyZXR1cm4gMTsKKworCV9fbWFrZV9idWZmZXJfY2xlYW4oYik7CisJX191bmxpbmtfYnVmZmVyKGIpOworCV9fZnJlZV9idWZmZXJfd2FrZShiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX3NjYW4oc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgdW5zaWduZWQgbG9uZyBucl90b19zY2FuLAorCQkgICBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQoreworCWludCBsOworCXN0cnVjdCBkbV9idWZmZXIgKmIsICp0bXA7CisKKwlmb3IgKGwgPSAwOyBsIDwgTElTVF9TSVpFOyBsKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoYiwgdG1wLCAmYy0+bHJ1W2xdLCBscnVfbGlzdCkKKwkJCWlmICghX19jbGVhbnVwX29sZF9idWZmZXIoYiwgc2MtPmdmcF9tYXNrLCAwKSAmJgorCQkJICAgICEtLW5yX3RvX3NjYW4pCisJCQkJcmV0dXJuOworCQlkbV9idWZpb19jb25kX3Jlc2NoZWQoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2hyaW5rKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCit7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYyA9CisJICAgIGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGRtX2J1ZmlvX2NsaWVudCwgc2hyaW5rZXIpOworCXVuc2lnbmVkIGxvbmcgcjsKKwl1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4gPSBzYy0+bnJfdG9fc2NhbjsKKworCWlmIChzYy0+Z2ZwX21hc2sgJiBfX0dGUF9JTykKKwkJZG1fYnVmaW9fbG9jayhjKTsKKwllbHNlIGlmICghZG1fYnVmaW9fdHJ5bG9jayhjKSkKKwkJcmV0dXJuICFucl90b19zY2FuID8gMCA6IC0xOworCisJaWYgKG5yX3RvX3NjYW4pCisJCV9fc2NhbihjLCBucl90b19zY2FuLCBzYyk7CisKKwlyID0gYy0+bl9idWZmZXJzW0xJU1RfQ0xFQU5dICsgYy0+bl9idWZmZXJzW0xJU1RfRElSVFldOworCWlmIChyID4gSU5UX01BWCkKKwkJciA9IElOVF9NQVg7CisKKwlkbV9idWZpb191bmxvY2soYyk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIENyZWF0ZSB0aGUgYnVmZmVyaW5nIGludGVyZmFjZQorICovCitzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpkbV9idWZpb19jbGllbnRfY3JlYXRlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGJsb2NrX3NpemUsCisJCQkJCSAgICAgICB1bnNpZ25lZCByZXNlcnZlZF9idWZmZXJzLCB1bnNpZ25lZCBhdXhfc2l6ZSwKKwkJCQkJICAgICAgIHZvaWQgKCphbGxvY19jYWxsYmFjaykoc3RydWN0IGRtX2J1ZmZlciAqKSwKKwkJCQkJICAgICAgIHZvaWQgKCp3cml0ZV9jYWxsYmFjaykoc3RydWN0IGRtX2J1ZmZlciAqKSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjOworCXVuc2lnbmVkIGk7CisKKwlCVUdfT04oYmxvY2tfc2l6ZSA8IDEgPDwgU0VDVE9SX1NISUZUIHx8CisJICAgICAgIChibG9ja19zaXplICYgKGJsb2NrX3NpemUgLSAxKSkpOworCisJYyA9IGttYWxsb2Moc2l6ZW9mKCpjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjKSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGJhZF9jbGllbnQ7CisJfQorCWMtPmNhY2hlX2hhc2ggPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkgPDwgRE1fQlVGSU9fSEFTSF9CSVRTKTsKKwlpZiAoIWMtPmNhY2hlX2hhc2gpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gYmFkX2hhc2g7CisJfQorCisJYy0+YmRldiA9IGJkZXY7CisJYy0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7CisJYy0+c2VjdG9yc19wZXJfYmxvY2tfYml0cyA9IGZmcyhibG9ja19zaXplKSAtIDEgLSBTRUNUT1JfU0hJRlQ7CisJYy0+cGFnZXNfcGVyX2Jsb2NrX2JpdHMgPSAoZmZzKGJsb2NrX3NpemUpIC0gMSA+PSBQQUdFX1NISUZUKSA/CisJCQkJICBmZnMoYmxvY2tfc2l6ZSkgLSAxIC0gUEFHRV9TSElGVCA6IDA7CisJYy0+YmxvY2tzX3Blcl9wYWdlX2JpdHMgPSAoZmZzKGJsb2NrX3NpemUpIC0gMSA8IFBBR0VfU0hJRlQgPworCQkJCSAgUEFHRV9TSElGVCAtIChmZnMoYmxvY2tfc2l6ZSkgLSAxKSA6IDApOworCisJYy0+YXV4X3NpemUgPSBhdXhfc2l6ZTsKKwljLT5hbGxvY19jYWxsYmFjayA9IGFsbG9jX2NhbGxiYWNrOworCWMtPndyaXRlX2NhbGxiYWNrID0gd3JpdGVfY2FsbGJhY2s7CisKKwlmb3IgKGkgPSAwOyBpIDwgTElTVF9TSVpFOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPmxydVtpXSk7CisJCWMtPm5fYnVmZmVyc1tpXSA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDEgPDwgRE1fQlVGSU9fSEFTSF9CSVRTOyBpKyspCisJCUlOSVRfSExJU1RfSEVBRCgmYy0+Y2FjaGVfaGFzaFtpXSk7CisKKwltdXRleF9pbml0KCZjLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+cmVzZXJ2ZWRfYnVmZmVycyk7CisJYy0+bmVlZF9yZXNlcnZlZF9idWZmZXJzID0gcmVzZXJ2ZWRfYnVmZmVyczsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPmZyZWVfYnVmZmVyX3dhaXQpOworCWMtPmFzeW5jX3dyaXRlX2Vycm9yID0gMDsKKworCWMtPmRtX2lvID0gZG1faW9fY2xpZW50X2NyZWF0ZSgpOworCWlmIChJU19FUlIoYy0+ZG1faW8pKSB7CisJCXIgPSBQVFJfRVJSKGMtPmRtX2lvKTsKKwkJZ290byBiYWRfZG1faW87CisJfQorCisJbXV0ZXhfbG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKwlpZiAoYy0+YmxvY2tzX3Blcl9wYWdlX2JpdHMpIHsKKwkJaWYgKCFETV9CVUZJT19DQUNIRV9OQU1FKGMpKSB7CisJCQlETV9CVUZJT19DQUNIRV9OQU1FKGMpID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJkbV9idWZpb19jYWNoZS0ldSIsIGMtPmJsb2NrX3NpemUpOworCQkJaWYgKCFETV9CVUZJT19DQUNIRV9OQU1FKGMpKSB7CisJCQkJciA9IC1FTk9NRU07CisJCQkJbXV0ZXhfdW5sb2NrKCZkbV9idWZpb19jbGllbnRzX2xvY2spOworCQkJCWdvdG8gYmFkX2NhY2hlOworCQkJfQorCQl9CisKKwkJaWYgKCFETV9CVUZJT19DQUNIRShjKSkgeworCQkJRE1fQlVGSU9fQ0FDSEUoYykgPSBrbWVtX2NhY2hlX2NyZWF0ZShETV9CVUZJT19DQUNIRV9OQU1FKGMpLAorCQkJCQkJCSAgICAgIGMtPmJsb2NrX3NpemUsCisJCQkJCQkJICAgICAgYy0+YmxvY2tfc2l6ZSwgMCwgTlVMTCk7CisJCQlpZiAoIURNX0JVRklPX0NBQ0hFKGMpKSB7CisJCQkJciA9IC1FTk9NRU07CisJCQkJbXV0ZXhfdW5sb2NrKCZkbV9idWZpb19jbGllbnRzX2xvY2spOworCQkJCWdvdG8gYmFkX2NhY2hlOworCQkJfQorCQl9CisJfQorCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKworCXdoaWxlIChjLT5uZWVkX3Jlc2VydmVkX2J1ZmZlcnMpIHsKKwkJc3RydWN0IGRtX2J1ZmZlciAqYiA9IGFsbG9jX2J1ZmZlcihjLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoIWIpIHsKKwkJCXIgPSAtRU5PTUVNOworCQkJZ290byBiYWRfYnVmZmVyOworCQl9CisJCV9fZnJlZV9idWZmZXJfd2FrZShiKTsKKwl9CisKKwltdXRleF9sb2NrKCZkbV9idWZpb19jbGllbnRzX2xvY2spOworCWRtX2J1ZmlvX2NsaWVudF9jb3VudCsrOworCWxpc3RfYWRkKCZjLT5jbGllbnRfbGlzdCwgJmRtX2J1ZmlvX2FsbF9jbGllbnRzKTsKKwlfX2NhY2hlX3NpemVfcmVmcmVzaCgpOworCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKworCWMtPnNocmlua2VyLnNocmluayA9IHNocmluazsKKwljLT5zaHJpbmtlci5zZWVrcyA9IDE7CisJYy0+c2hyaW5rZXIuYmF0Y2ggPSAwOworCXJlZ2lzdGVyX3Nocmlua2VyKCZjLT5zaHJpbmtlcik7CisKKwlyZXR1cm4gYzsKKworYmFkX2J1ZmZlcjoKK2JhZF9jYWNoZToKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmMtPnJlc2VydmVkX2J1ZmZlcnMpKSB7CisJCXN0cnVjdCBkbV9idWZmZXIgKmIgPSBsaXN0X2VudHJ5KGMtPnJlc2VydmVkX2J1ZmZlcnMubmV4dCwKKwkJCQkJCSBzdHJ1Y3QgZG1fYnVmZmVyLCBscnVfbGlzdCk7CisJCWxpc3RfZGVsKCZiLT5scnVfbGlzdCk7CisJCWZyZWVfYnVmZmVyKGIpOworCX0KKwlkbV9pb19jbGllbnRfZGVzdHJveShjLT5kbV9pbyk7CitiYWRfZG1faW86CisJdmZyZWUoYy0+Y2FjaGVfaGFzaCk7CitiYWRfaGFzaDoKKwlrZnJlZShjKTsKK2JhZF9jbGllbnQ6CisJcmV0dXJuIEVSUl9QVFIocik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19jbGllbnRfY3JlYXRlKTsKKworLyoKKyAqIEZyZWUgdGhlIGJ1ZmZlcmluZyBpbnRlcmZhY2UuCisgKiBJdCBpcyByZXF1aXJlZCB0aGF0IHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIG9uIGFueSBidWZmZXJzLgorICovCit2b2lkIGRtX2J1ZmlvX2NsaWVudF9kZXN0cm95KHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpCit7CisJdW5zaWduZWQgaTsKKworCWRyb3BfYnVmZmVycyhjKTsKKworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmMtPnNocmlua2VyKTsKKworCW11dGV4X2xvY2soJmRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisKKwlsaXN0X2RlbCgmYy0+Y2xpZW50X2xpc3QpOworCWRtX2J1ZmlvX2NsaWVudF9jb3VudC0tOworCV9fY2FjaGVfc2l6ZV9yZWZyZXNoKCk7CisKKwltdXRleF91bmxvY2soJmRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMSA8PCBETV9CVUZJT19IQVNIX0JJVFM7IGkrKykKKwkJQlVHX09OKCFobGlzdF9lbXB0eSgmYy0+Y2FjaGVfaGFzaFtpXSkpOworCisJQlVHX09OKGMtPm5lZWRfcmVzZXJ2ZWRfYnVmZmVycyk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmMtPnJlc2VydmVkX2J1ZmZlcnMpKSB7CisJCXN0cnVjdCBkbV9idWZmZXIgKmIgPSBsaXN0X2VudHJ5KGMtPnJlc2VydmVkX2J1ZmZlcnMubmV4dCwKKwkJCQkJCSBzdHJ1Y3QgZG1fYnVmZmVyLCBscnVfbGlzdCk7CisJCWxpc3RfZGVsKCZiLT5scnVfbGlzdCk7CisJCWZyZWVfYnVmZmVyKGIpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBMSVNUX1NJWkU7IGkrKykKKwkJaWYgKGMtPm5fYnVmZmVyc1tpXSkKKwkJCURNRVJSKCJsZWFrZWQgYnVmZmVyIGNvdW50ICVkOiAlbGQiLCBpLCBjLT5uX2J1ZmZlcnNbaV0pOworCisJZm9yIChpID0gMDsgaSA8IExJU1RfU0laRTsgaSsrKQorCQlCVUdfT04oYy0+bl9idWZmZXJzW2ldKTsKKworCWRtX2lvX2NsaWVudF9kZXN0cm95KGMtPmRtX2lvKTsKKwl2ZnJlZShjLT5jYWNoZV9oYXNoKTsKKwlrZnJlZShjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX2NsaWVudF9kZXN0cm95KTsKKworc3RhdGljIHZvaWQgY2xlYW51cF9vbGRfYnVmZmVycyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbWF4X2FnZSA9IGRtX2J1ZmlvX21heF9hZ2U7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYzsKKworCWJhcnJpZXIoKTsKKworCWlmIChtYXhfYWdlID4gVUxPTkdfTUFYIC8gSFopCisJCW1heF9hZ2UgPSBVTE9OR19NQVggLyBIWjsKKworCW11dGV4X2xvY2soJmRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmZG1fYnVmaW9fYWxsX2NsaWVudHMsIGNsaWVudF9saXN0KSB7CisJCWlmICghZG1fYnVmaW9fdHJ5bG9jayhjKSkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlICghbGlzdF9lbXB0eSgmYy0+bHJ1W0xJU1RfQ0xFQU5dKSkgeworCQkJc3RydWN0IGRtX2J1ZmZlciAqYjsKKwkJCWIgPSBsaXN0X2VudHJ5KGMtPmxydVtMSVNUX0NMRUFOXS5wcmV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZG1fYnVmZmVyLCBscnVfbGlzdCk7CisJCQlpZiAoX19jbGVhbnVwX29sZF9idWZmZXIoYiwgMCwgbWF4X2FnZSAqIEhaKSkKKwkJCQlicmVhazsKKwkJCWRtX2J1ZmlvX2NvbmRfcmVzY2hlZCgpOworCQl9CisKKwkJZG1fYnVmaW9fdW5sb2NrKGMpOworCQlkbV9idWZpb19jb25kX3Jlc2NoZWQoKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkbV9idWZpb19jbGllbnRzX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmRtX2J1ZmlvX3dxOworc3RhdGljIHN0cnVjdCBkZWxheWVkX3dvcmsgZG1fYnVmaW9fd29yazsKKworc3RhdGljIHZvaWQgd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCit7CisJY2xlYW51cF9vbGRfYnVmZmVycygpOworCisJcXVldWVfZGVsYXllZF93b3JrKGRtX2J1ZmlvX3dxLCAmZG1fYnVmaW9fd29yaywKKwkJCSAgIERNX0JVRklPX1dPUktfVElNRVJfU0VDUyAqIEhaKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNb2R1bGUgc2V0dXAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhpcyBpcyBjYWxsZWQgb25seSBvbmNlIGZvciB0aGUgd2hvbGUgZG1fYnVmaW8gbW9kdWxlLgorICogSXQgaW5pdGlhbGl6ZXMgbWVtb3J5IGxpbWl0LgorICovCitzdGF0aWMgaW50IF9faW5pdCBkbV9idWZpb19pbml0KHZvaWQpCit7CisJX191NjQgbWVtOworCisJbWVtc2V0KCZkbV9idWZpb19jYWNoZXMsIDAsIHNpemVvZiBkbV9idWZpb19jYWNoZXMpOworCW1lbXNldCgmZG1fYnVmaW9fY2FjaGVfbmFtZXMsIDAsIHNpemVvZiBkbV9idWZpb19jYWNoZV9uYW1lcyk7CisKKwltZW0gPSAoX191NjQpKCh0b3RhbHJhbV9wYWdlcyAtIHRvdGFsaGlnaF9wYWdlcykgKgorCQkgICAgICBETV9CVUZJT19NRU1PUllfUEVSQ0VOVCAvIDEwMCkgPDwgUEFHRV9TSElGVDsKKworCWlmIChtZW0gPiBVTE9OR19NQVgpCisJCW1lbSA9IFVMT05HX01BWDsKKworI2lmZGVmIENPTkZJR19NTVUKKwkvKgorCSAqIEdldCB0aGUgc2l6ZSBvZiB2bWFsbG9jIHNwYWNlIHRoZSBzYW1lIHdheSBhcyBWTUFMTE9DX1RPVEFMCisJICogaW4gZnMvcHJvYy9pbnRlcm5hbC5oCisJICovCisJaWYgKG1lbSA+IChWTUFMTE9DX0VORCAtIFZNQUxMT0NfU1RBUlQpICogRE1fQlVGSU9fVk1BTExPQ19QRVJDRU5UIC8gMTAwKQorCQltZW0gPSAoVk1BTExPQ19FTkQgLSBWTUFMTE9DX1NUQVJUKSAqIERNX0JVRklPX1ZNQUxMT0NfUEVSQ0VOVCAvIDEwMDsKKyNlbmRpZgorCisJZG1fYnVmaW9fZGVmYXVsdF9jYWNoZV9zaXplID0gbWVtOworCisJbXV0ZXhfbG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKwlfX2NhY2hlX3NpemVfcmVmcmVzaCgpOworCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKworCWRtX2J1ZmlvX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImRtX2J1ZmlvX2NhY2hlIik7CisJaWYgKCFkbV9idWZpb193cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0RFTEFZRURfV09SSygmZG1fYnVmaW9fd29yaywgd29ya19mbik7CisJcXVldWVfZGVsYXllZF93b3JrKGRtX2J1ZmlvX3dxLCAmZG1fYnVmaW9fd29yaywKKwkJCSAgIERNX0JVRklPX1dPUktfVElNRVJfU0VDUyAqIEhaKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgb25jZSB3aGVuIHVubG9hZGluZyB0aGUgZG1fYnVmaW8gbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1fYnVmaW9fZXhpdCh2b2lkKQoreworCWludCBidWcgPSAwOworCWludCBpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkbV9idWZpb193b3JrKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShkbV9idWZpb193cSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkbV9idWZpb19jYWNoZXMpOyBpKyspIHsKKwkJc3RydWN0IGttZW1fY2FjaGUgKmtjID0gZG1fYnVmaW9fY2FjaGVzW2ldOworCisJCWlmIChrYykKKwkJCWttZW1fY2FjaGVfZGVzdHJveShrYyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZG1fYnVmaW9fY2FjaGVfbmFtZXMpOyBpKyspCisJCWtmcmVlKGRtX2J1ZmlvX2NhY2hlX25hbWVzW2ldKTsKKworCWlmIChkbV9idWZpb19jbGllbnRfY291bnQpIHsKKwkJRE1DUklUKCIlczogZG1fYnVmaW9fY2xpZW50X2NvdW50IGxlYWtlZDogJWQiLAorCQkJX19mdW5jX18sIGRtX2J1ZmlvX2NsaWVudF9jb3VudCk7CisJCWJ1ZyA9IDE7CisJfQorCisJaWYgKGRtX2J1ZmlvX2N1cnJlbnRfYWxsb2NhdGVkKSB7CisJCURNQ1JJVCgiJXM6IGRtX2J1ZmlvX2N1cnJlbnRfYWxsb2NhdGVkIGxlYWtlZDogJWx1IiwKKwkJCV9fZnVuY19fLCBkbV9idWZpb19jdXJyZW50X2FsbG9jYXRlZCk7CisJCWJ1ZyA9IDE7CisJfQorCisJaWYgKGRtX2J1ZmlvX2FsbG9jYXRlZF9nZXRfZnJlZV9wYWdlcykgeworCQlETUNSSVQoIiVzOiBkbV9idWZpb19hbGxvY2F0ZWRfZ2V0X2ZyZWVfcGFnZXMgbGVha2VkOiAlbHUiLAorCQkgICAgICAgX19mdW5jX18sIGRtX2J1ZmlvX2FsbG9jYXRlZF9nZXRfZnJlZV9wYWdlcyk7CisJCWJ1ZyA9IDE7CisJfQorCisJaWYgKGRtX2J1ZmlvX2FsbG9jYXRlZF92bWFsbG9jKSB7CisJCURNQ1JJVCgiJXM6IGRtX2J1ZmlvX3ZtYWxsb2MgbGVha2VkOiAlbHUiLAorCQkgICAgICAgX19mdW5jX18sIGRtX2J1ZmlvX2FsbG9jYXRlZF92bWFsbG9jKTsKKwkJYnVnID0gMTsKKwl9CisKKwlpZiAoYnVnKQorCQlCVUcoKTsKK30KKworbW9kdWxlX2luaXQoZG1fYnVmaW9faW5pdCkKK21vZHVsZV9leGl0KGRtX2J1ZmlvX2V4aXQpCisKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfY2FjaGVfc2l6ZV9ieXRlcywgZG1fYnVmaW9fY2FjaGVfc2l6ZSwgdWxvbmcsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2NhY2hlX3NpemVfYnl0ZXMsICJTaXplIG9mIG1ldGFkYXRhIGNhY2hlIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfYWdlX3NlY29uZHMsIGRtX2J1ZmlvX21heF9hZ2UsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2FnZV9zZWNvbmRzLCAiTWF4IGFnZSBvZiBhIGJ1ZmZlciBpbiBzZWNvbmRzIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChwZWFrX2FsbG9jYXRlZF9ieXRlcywgZG1fYnVmaW9fcGVha19hbGxvY2F0ZWQsIHVsb25nLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHBlYWtfYWxsb2NhdGVkX2J5dGVzLCAiVHJhY2tzIHRoZSBtYXhpbXVtIGFsbG9jYXRlZCBtZW1vcnkiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGFsbG9jYXRlZF9rbWVtX2NhY2hlX2J5dGVzLCBkbV9idWZpb19hbGxvY2F0ZWRfa21lbV9jYWNoZSwgdWxvbmcsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbGxvY2F0ZWRfa21lbV9jYWNoZV9ieXRlcywgIk1lbW9yeSBhbGxvY2F0ZWQgd2l0aCBrbWVtX2NhY2hlX2FsbG9jIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChhbGxvY2F0ZWRfZ2V0X2ZyZWVfcGFnZXNfYnl0ZXMsIGRtX2J1ZmlvX2FsbG9jYXRlZF9nZXRfZnJlZV9wYWdlcywgdWxvbmcsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbGxvY2F0ZWRfZ2V0X2ZyZWVfcGFnZXNfYnl0ZXMsICJNZW1vcnkgYWxsb2NhdGVkIHdpdGggZ2V0X2ZyZWVfcGFnZXMiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGFsbG9jYXRlZF92bWFsbG9jX2J5dGVzLCBkbV9idWZpb19hbGxvY2F0ZWRfdm1hbGxvYywgdWxvbmcsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbGxvY2F0ZWRfdm1hbGxvY19ieXRlcywgIk1lbW9yeSBhbGxvY2F0ZWQgd2l0aCB2bWFsbG9jIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChjdXJyZW50X2FsbG9jYXRlZF9ieXRlcywgZG1fYnVmaW9fY3VycmVudF9hbGxvY2F0ZWQsIHVsb25nLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoY3VycmVudF9hbGxvY2F0ZWRfYnl0ZXMsICJNZW1vcnkgY3VycmVudGx5IHVzZWQgYnkgdGhlIGNhY2hlIik7CisKK01PRFVMRV9BVVRIT1IoIk1pa3VsYXMgUGF0b2NrYSA8ZG0tZGV2ZWxAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTihETV9OQU1FICIgYnVmZmVyZWQgSS9PIGxpYnJhcnkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tYnVmaW8uaCBiL2RyaXZlcnMvbWQvZG0tYnVmaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRjM2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9kbS1idWZpby5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIEF1dGhvcjogTWlrdWxhcyBQYXRvY2thIDxtcGF0b2NrYUByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgRE1fQlVGSU9fSAorI2RlZmluZSBETV9CVUZJT19ICisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50Oworc3RydWN0IGRtX2J1ZmZlcjsKKworLyoKKyAqIENyZWF0ZSBhIGJ1ZmZlcmVkIElPIGNhY2hlIG9uIGEgZ2l2ZW4gZGV2aWNlCisgKi8KK3N0cnVjdCBkbV9idWZpb19jbGllbnQgKgorZG1fYnVmaW9fY2xpZW50X2NyZWF0ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBibG9ja19zaXplLAorCQkgICAgICAgdW5zaWduZWQgcmVzZXJ2ZWRfYnVmZmVycywgdW5zaWduZWQgYXV4X3NpemUsCisJCSAgICAgICB2b2lkICgqYWxsb2NfY2FsbGJhY2spKHN0cnVjdCBkbV9idWZmZXIgKiksCisJCSAgICAgICB2b2lkICgqd3JpdGVfY2FsbGJhY2spKHN0cnVjdCBkbV9idWZmZXIgKikpOworCisvKgorICogUmVsZWFzZSBhIGJ1ZmZlcmVkIElPIGNhY2hlLgorICovCit2b2lkIGRtX2J1ZmlvX2NsaWVudF9kZXN0cm95KHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworCisvKgorICogV0FSTklORzogdG8gYXZvaWQgZGVhZGxvY2tzLCB0aGVzZSBjb25kaXRpb25zIGFyZSBvYnNlcnZlZDoKKyAqCisgKiAtIEF0IG1vc3Qgb25lIHRocmVhZCBjYW4gaG9sZCBhdCBtb3N0ICJyZXNlcnZlZF9idWZmZXJzIiBzaW11bHRhbmVvdXNseS4KKyAqIC0gRWFjaCBvdGhlciB0aHJlYWRzIGNhbiBob2xkIGF0IG1vc3Qgb25lIGJ1ZmZlci4KKyAqIC0gVGhyZWFkcyB3aGljaCBjYWxsIG9ubHkgZG1fYnVmaW9fZ2V0IGNhbiBob2xkIHVubGltaXRlZCBudW1iZXIgb2YKKyAqICAgYnVmZmVycy4KKyAqLworCisvKgorICogUmVhZCBhIGdpdmVuIGJsb2NrIGZyb20gZGlzay4gUmV0dXJucyBwb2ludGVyIHRvIGRhdGEuICBSZXR1cm5zIGEKKyAqIHBvaW50ZXIgdG8gZG1fYnVmZmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVsZWFzZSB0aGUgYnVmZmVyIG9yIHRvIG1ha2UKKyAqIGl0IGRpcnR5LgorICovCit2b2lkICpkbV9idWZpb19yZWFkKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMsIHNlY3Rvcl90IGJsb2NrLAorCQkgICAgc3RydWN0IGRtX2J1ZmZlciAqKmJwKTsKKworLyoKKyAqIExpa2UgZG1fYnVmaW9fcmVhZCwgYnV0IHJldHVybiBidWZmZXIgZnJvbSBjYWNoZSwgZG9uJ3QgcmVhZAorICogaXQuIElmIHRoZSBidWZmZXIgaXMgbm90IGluIHRoZSBjYWNoZSwgcmV0dXJuIE5VTEwuCisgKi8KK3ZvaWQgKmRtX2J1ZmlvX2dldChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaywKKwkJICAgc3RydWN0IGRtX2J1ZmZlciAqKmJwKTsKKworLyoKKyAqIExpa2UgZG1fYnVmaW9fcmVhZCwgYnV0IGRvbid0IHJlYWQgYW55dGhpbmcgZnJvbSB0aGUgZGlzay4gIEl0IGlzCisgKiBleHBlY3RlZCB0aGF0IHRoZSBjYWxsZXIgaW5pdGlhbGl6ZXMgdGhlIGJ1ZmZlciBhbmQgbWFya3MgaXQgZGlydHkuCisgKi8KK3ZvaWQgKmRtX2J1ZmlvX25ldyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaywKKwkJICAgc3RydWN0IGRtX2J1ZmZlciAqKmJwKTsKKworLyoKKyAqIFJlbGVhc2UgYSByZWZlcmVuY2Ugb2J0YWluZWQgd2l0aCBkbV9idWZpb197cmVhZCxnZXQsbmV3fS4gVGhlIGRhdGEKKyAqIHBvaW50ZXIgYW5kIGRtX2J1ZmZlciBwb2ludGVyIGlzIG5vIGxvbmdlciB2YWxpZCBhZnRlciB0aGlzIGNhbGwuCisgKi8KK3ZvaWQgZG1fYnVmaW9fcmVsZWFzZShzdHJ1Y3QgZG1fYnVmZmVyICpiKTsKKworLyoKKyAqIE1hcmsgYSBidWZmZXIgZGlydHkuIEl0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyBtb2RpZmllZC4KKyAqCisgKiBJbiBjYXNlIG9mIG1lbW9yeSBwcmVzc3VyZSwgdGhlIGJ1ZmZlciBtYXkgYmUgd3JpdHRlbiBhZnRlcgorICogZG1fYnVmaW9fbWFya19idWZmZXJfZGlydHksIGJ1dCBiZWZvcmUgZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVycy4gIFNvCisgKiBkbV9idWZpb193cml0ZV9kaXJ0eV9idWZmZXJzIGd1YXJhbnRlZXMgdGhhdCB0aGUgYnVmZmVyIGlzIG9uLWRpc2sgYnV0CisgKiB0aGUgYWN0dWFsIHdyaXRpbmcgbWF5IG9jY3VyIGVhcmxpZXIuCisgKi8KK3ZvaWQgZG1fYnVmaW9fbWFya19idWZmZXJfZGlydHkoc3RydWN0IGRtX2J1ZmZlciAqYik7CisKKy8qCisgKiBJbml0aWF0ZSB3cml0aW5nIG9mIGRpcnR5IGJ1ZmZlcnMsIHdpdGhvdXQgd2FpdGluZyBmb3IgY29tcGxldGlvbi4KKyAqLwordm9pZCBkbV9idWZpb193cml0ZV9kaXJ0eV9idWZmZXJzX2FzeW5jKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworCisvKgorICogV3JpdGUgYWxsIGRpcnR5IGJ1ZmZlcnMuIEd1YXJhbnRlZXMgdGhhdCBhbGwgZGlydHkgYnVmZmVycyBjcmVhdGVkIHByaW9yCisgKiB0byB0aGlzIGNhbGwgYXJlIG9uIGRpc2sgd2hlbiB0aGlzIGNhbGwgZXhpdHMuCisgKi8KK2ludCBkbV9idWZpb193cml0ZV9kaXJ0eV9idWZmZXJzKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworCisvKgorICogU2VuZCBhbiBlbXB0eSB3cml0ZSBiYXJyaWVyIHRvIHRoZSBkZXZpY2UgdG8gZmx1c2ggaGFyZHdhcmUgZGlzayBjYWNoZS4KKyAqLworaW50IGRtX2J1ZmlvX2lzc3VlX2ZsdXNoKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworCisvKgorICogTGlrZSBkbV9idWZpb19yZWxlYXNlIGJ1dCBhbHNvIG1vdmUgdGhlIGJ1ZmZlciB0byB0aGUgbmV3CisgKiBibG9jay4gZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVycyBpcyBuZWVkZWQgdG8gY29tbWl0IHRoZSBuZXcgYmxvY2suCisgKi8KK3ZvaWQgZG1fYnVmaW9fcmVsZWFzZV9tb3ZlKHN0cnVjdCBkbV9idWZmZXIgKmIsIHNlY3Rvcl90IG5ld19ibG9jayk7CisKK3Vuc2lnbmVkIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworc2VjdG9yX3QgZG1fYnVmaW9fZ2V0X2RldmljZV9zaXplKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworc2VjdG9yX3QgZG1fYnVmaW9fZ2V0X2Jsb2NrX251bWJlcihzdHJ1Y3QgZG1fYnVmZmVyICpiKTsKK3ZvaWQgKmRtX2J1ZmlvX2dldF9ibG9ja19kYXRhKHN0cnVjdCBkbV9idWZmZXIgKmIpOwordm9pZCAqZG1fYnVmaW9fZ2V0X2F1eF9kYXRhKHN0cnVjdCBkbV9idWZmZXIgKmIpOworc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqZG1fYnVmaW9fZ2V0X2NsaWVudChzdHJ1Y3QgZG1fYnVmZmVyICpiKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwppbmRleCAwYmRiMjAxLi4wNDJlNzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjZGVmaW5lIERNX01TR19QUkVGSVggInNuYXBzaG90IGV4Y2VwdGlvbiBzdG9yZXMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKaW5kZXggMmU5YTNjYS4uMzFjMmRjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwpAQCAtMTIxNSw2ICsxMjE1LDcgQEAKIAlzdHJ1Y3QgaGFzaF9jZWxsICpoYzsKIAlzdHJ1Y3QgZG1fdGFibGUgKnQ7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXN0cnVjdCB0YXJnZXRfdHlwZSAqaW1tdXRhYmxlX3RhcmdldF90eXBlOwogCiAJbWQgPSBmaW5kX2RldmljZShwYXJhbSk7CiAJaWYgKCFtZCkKQEAgLTEyMzAsNiArMTIzMSwxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpbW11dGFibGVfdGFyZ2V0X3R5cGUgPSBkbV9nZXRfaW1tdXRhYmxlX3RhcmdldF90eXBlKG1kKTsKKwlpZiAoaW1tdXRhYmxlX3RhcmdldF90eXBlICYmCisJICAgIChpbW11dGFibGVfdGFyZ2V0X3R5cGUgIT0gZG1fdGFibGVfZ2V0X2ltbXV0YWJsZV90YXJnZXRfdHlwZSh0KSkpIHsKKwkJRE1XQVJOKCJjYW4ndCByZXBsYWNlIGltbXV0YWJsZSB0YXJnZXQgdHlwZSAlcyIsCisJCSAgICAgICBpbW11dGFibGVfdGFyZ2V0X3R5cGUtPm5hbWUpOworCQlkbV90YWJsZV9kZXN0cm95KHQpOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCiAJLyogUHJvdGVjdCBtZC0+dHlwZSBhbmQgbWQtPnF1ZXVlIGFnYWluc3QgY29uY3VycmVudCB0YWJsZSBsb2Fkcy4gKi8KIAlkbV9sb2NrX21kX3R5cGUobWQpOwogCWlmIChkbV9nZXRfbWRfdHlwZShtZCkgPT0gRE1fVFlQRV9OT05FKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1rY29weWQuYyBiL2RyaXZlcnMvbWQvZG0ta2NvcHlkLmMKaW5kZXggMzJhYzcwOC4uYmVkNDQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1rY29weWQuYworKysgYi9kcml2ZXJzL21kL2RtLWtjb3B5ZC5jCkBAIC02Niw2ICs2Niw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBwYWdlc19qb2JzOwogfTsKIAorc3RhdGljIHN0cnVjdCBwYWdlX2xpc3QgemVyb19wYWdlX2xpc3Q7CisKIHN0YXRpYyB2b2lkIHdha2Uoc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjKQogewogCXF1ZXVlX3dvcmsoa2MtPmtjb3B5ZF93cSwgJmtjLT5rY29weWRfd29yayk7CkBAIC0yNTQsNiArMjU2LDkgQEAKIAlpZiAoIV9qb2JfY2FjaGUpCiAJCXJldHVybiAtRU5PTUVNOwogCisJemVyb19wYWdlX2xpc3QubmV4dCA9ICZ6ZXJvX3BhZ2VfbGlzdDsKKwl6ZXJvX3BhZ2VfbGlzdC5wYWdlID0gWkVST19QQUdFKDApOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMyMiw3ICszMjcsNyBAQAogCWRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4gPSBqb2ItPmZuOwogCXN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYyA9IGpvYi0+a2M7CiAKLQlpZiAoam9iLT5wYWdlcykKKwlpZiAoam9iLT5wYWdlcyAmJiBqb2ItPnBhZ2VzICE9ICZ6ZXJvX3BhZ2VfbGlzdCkKIAkJa2NvcHlkX3B1dF9wYWdlcyhrYywgam9iLT5wYWdlcyk7CiAJLyoKIAkgKiBJZiB0aGlzIGlzIHRoZSBtYXN0ZXIgam9iLCB0aGUgc3ViIGpvYnMgaGF2ZSBhbHJlYWR5CkBAIC00ODQsNiArNDg5LDggQEAKIAlhdG9taWNfaW5jKCZrYy0+bnJfam9icyk7CiAJaWYgKHVubGlrZWx5KCFqb2ItPnNvdXJjZS5jb3VudCkpCiAJCXB1c2goJmtjLT5jb21wbGV0ZV9qb2JzLCBqb2IpOworCWVsc2UgaWYgKGpvYi0+cGFnZXMgPT0gJnplcm9fcGFnZV9saXN0KQorCQlwdXNoKCZrYy0+aW9fam9icywgam9iKTsKIAllbHNlCiAJCXB1c2goJmtjLT5wYWdlc19qb2JzLCBqb2IpOwogCXdha2Uoa2MpOwpAQCAtNTkyLDE0ICs1OTksMjAgQEAKIAlqb2ItPmZsYWdzID0gZmxhZ3M7CiAJam9iLT5yZWFkX2VyciA9IDA7CiAJam9iLT53cml0ZV9lcnIgPSAwOwotCWpvYi0+cncgPSBSRUFEOwotCi0Jam9iLT5zb3VyY2UgPSAqZnJvbTsKIAogCWpvYi0+bnVtX2Rlc3RzID0gbnVtX2Rlc3RzOwogCW1lbWNweSgmam9iLT5kZXN0cywgZGVzdHMsIHNpemVvZigqZGVzdHMpICogbnVtX2Rlc3RzKTsKIAotCWpvYi0+cGFnZXMgPSBOVUxMOworCWlmIChmcm9tKSB7CisJCWpvYi0+c291cmNlID0gKmZyb207CisJCWpvYi0+cGFnZXMgPSBOVUxMOworCQlqb2ItPnJ3ID0gUkVBRDsKKwl9IGVsc2UgeworCQltZW1zZXQoJmpvYi0+c291cmNlLCAwLCBzaXplb2Ygam9iLT5zb3VyY2UpOworCQlqb2ItPnNvdXJjZS5jb3VudCA9IGpvYi0+ZGVzdHNbMF0uY291bnQ7CisJCWpvYi0+cGFnZXMgPSAmemVyb19wYWdlX2xpc3Q7CisJCWpvYi0+cncgPSBXUklURTsKKwl9CiAKIAlqb2ItPmZuID0gZm47CiAJam9iLT5jb250ZXh0ID0gY29udGV4dDsKQEAgLTYxNyw2ICs2MzAsMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0woZG1fa2NvcHlkX2NvcHkpOwogCitpbnQgZG1fa2NvcHlkX3plcm8oc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjLAorCQkgICB1bnNpZ25lZCBudW1fZGVzdHMsIHN0cnVjdCBkbV9pb19yZWdpb24gKmRlc3RzLAorCQkgICB1bnNpZ25lZCBmbGFncywgZG1fa2NvcHlkX25vdGlmeV9mbiBmbiwgdm9pZCAqY29udGV4dCkKK3sKKwlyZXR1cm4gZG1fa2NvcHlkX2NvcHkoa2MsIE5VTEwsIG51bV9kZXN0cywgZGVzdHMsIGZsYWdzLCBmbiwgY29udGV4dCk7Cit9CitFWFBPUlRfU1lNQk9MKGRtX2tjb3B5ZF96ZXJvKTsKKwogdm9pZCAqZG1fa2NvcHlkX3ByZXBhcmVfY2FsbGJhY2soc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjLAogCQkJCSBkbV9rY29weWRfbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS1iYXNlLmMKaW5kZXggMTAyMWM4OS4uOTQyOTE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYworKysgYi9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtYmFzZS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtLWRpcnR5LWxvZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kbS1sb2ctdXNlcnNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJkbS1sb2ctdXNlcnNwYWNlLXRyYW5zZmVyLmgiCiAKQEAgLTMwLDYgKzMxLDcgQEAKIAogc3RydWN0IGxvZ19jIHsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKKwlzdHJ1Y3QgZG1fZGV2ICpsb2dfZGV2OwogCXVpbnQzMl90IHJlZ2lvbl9zaXplOwogCXJlZ2lvbl90IHJlZ2lvbl9jb3VudDsKIAl1aW50NjRfdCBsdWlkOwpAQCAtMTQ2LDcgKzE0OCw3IEBACiAgKgk8VVVJRD4gPG90aGVyIGFyZ3M+CiAgKiBXaGVyZSAnb3RoZXIgYXJncycgaXMgdGhlIHVzZXJzcGFjZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBsb2cKICAqIGFyZ3VtZW50cy4gIEFuIGV4YW1wbGUgbWlnaHQgYmU6Ci0gKgk8VVVJRD4gY2x1c3RlcmVkX2Rpc2sgPGFyZyBjb3VudD4gPGxvZyBkZXY+IDxyZWdpb25fc2l6ZT4gW1tub11zeW5jXQorICoJPFVVSUQ+IGNsdXN0ZXJlZC1kaXNrIDxhcmcgY291bnQ+IDxsb2cgZGV2PiA8cmVnaW9uX3NpemU+IFtbbm9dc3luY10KICAqCiAgKiBTbywgdGhpcyBtb2R1bGUgd2lsbCBzdHJpcCBvZmYgdGhlIDxVVUlEPiBmb3IgaWRlbnRpZmljYXRpb24gcHVycG9zZXMKICAqIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHVzZXJzcGFjZSBhYm91dCBhIGxvZzsgYnV0IHdpbGwgcGFzcyBvbiBldmVyeXRoaW5nCkBAIC0xNjEsMTMgKzE2MywxNSBAQAogCXN0cnVjdCBsb2dfYyAqbGMgPSBOVUxMOwogCXVpbnQ2NF90IHJkYXRhOwogCXNpemVfdCByZGF0YV9zaXplID0gc2l6ZW9mKHJkYXRhKTsKKwljaGFyICpkZXZpY2VzX3JkYXRhID0gTlVMTDsKKwlzaXplX3QgZGV2aWNlc19yZGF0YV9zaXplID0gRE1fTkFNRV9MRU47CiAKIAlpZiAoYXJnYyA8IDMpIHsKIAkJRE1XQVJOKCJUb28gZmV3IGFyZ3VtZW50cyB0byB1c2Vyc3BhY2UgZGlydHkgbG9nIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxjID0ga21hbGxvYyhzaXplb2YoKmxjKSwgR0ZQX0tFUk5FTCk7CisJbGMgPSBremFsbG9jKHNpemVvZigqbGMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxjKSB7CiAJCURNV0FSTigiVW5hYmxlIHRvIGFsbG9jYXRlIHVzZXJzcGFjZSBsb2cgY29udGV4dC4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xOTUsOSArMTk5LDE5IEBACiAJCXJldHVybiBzdHJfc2l6ZTsKIAl9CiAKLQkvKiBTZW5kIHRhYmxlIHN0cmluZyAqLworCWRldmljZXNfcmRhdGEgPSBremFsbG9jKGRldmljZXNfcmRhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2VzX3JkYXRhKSB7CisJCURNRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgaW5mb3JtYXRpb24iKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogU2VuZCB0YWJsZSBzdHJpbmcgYW5kIGdldCBiYWNrIGFueSBvcGVuZWQgZGV2aWNlLgorCSAqLwogCXIgPSBkbV9jb25zdWx0X3VzZXJzcGFjZShsYy0+dXVpZCwgbGMtPmx1aWQsIERNX1VMT0dfQ1RSLAotCQkJCSBjdHJfc3RyLCBzdHJfc2l6ZSwgTlVMTCwgTlVMTCk7CisJCQkJIGN0cl9zdHIsIHN0cl9zaXplLAorCQkJCSBkZXZpY2VzX3JkYXRhLCAmZGV2aWNlc19yZGF0YV9zaXplKTsKIAogCWlmIChyIDwgMCkgewogCQlpZiAociA9PSAtRVNSQ0gpCkBAIC0yMjAsNyArMjM0LDIwIEBACiAJbGMtPnJlZ2lvbl9zaXplID0gKHVpbnQzMl90KXJkYXRhOwogCWxjLT5yZWdpb25fY291bnQgPSBkbV9zZWN0b3JfZGl2X3VwKHRpLT5sZW4sIGxjLT5yZWdpb25fc2l6ZSk7CiAKKwlpZiAoZGV2aWNlc19yZGF0YV9zaXplKSB7CisJCWlmIChkZXZpY2VzX3JkYXRhW2RldmljZXNfcmRhdGFfc2l6ZSAtIDFdICE9ICdcMCcpIHsKKwkJCURNRVJSKCJETV9VTE9HX0NUUiBkZXZpY2UgcmV0dXJuIHN0cmluZyBub3QgcHJvcGVybHkgdGVybWluYXRlZCIpOworCQkJciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyID0gZG1fZ2V0X2RldmljZSh0aSwgZGV2aWNlc19yZGF0YSwKKwkJCQkgIGRtX3RhYmxlX2dldF9tb2RlKHRpLT50YWJsZSksICZsYy0+bG9nX2Rldik7CisJCWlmIChyKQorCQkJRE1FUlIoIkZhaWxlZCB0byByZWdpc3RlciAlcyB3aXRoIGRldmljZS1tYXBwZXIiLAorCQkJICAgICAgZGV2aWNlc19yZGF0YSk7CisJfQogb3V0OgorCWtmcmVlKGRldmljZXNfcmRhdGEpOwogCWlmIChyKSB7CiAJCWtmcmVlKGxjKTsKIAkJa2ZyZWUoY3RyX3N0cik7CkBAIC0yNDEsNiArMjY4LDkgQEAKIAkJCQkgTlVMTCwgMCwKIAkJCQkgTlVMTCwgTlVMTCk7CiAKKwlpZiAobGMtPmxvZ19kZXYpCisJCWRtX3B1dF9kZXZpY2UobGMtPnRpLCBsYy0+bG9nX2Rldik7CisKIAlrZnJlZShsYy0+dXNyX2FyZ3Zfc3RyKTsKIAlrZnJlZShsYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcGF0aC1zZWxlY3Rvci5jIGIvZHJpdmVycy9tZC9kbS1wYXRoLXNlbGVjdG9yLmMKaW5kZXggNDJjMDRmMC4uZmEwY2NjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1wYXRoLXNlbGVjdG9yLmMKKysrIGIvZHJpdmVycy9tZC9kbS1wYXRoLXNlbGVjdG9yLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiZG0tcGF0aC1zZWxlY3Rvci5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJhaWQuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZC5jCmluZGV4IDM3YTM3MjYuLmMyOTA3ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcmFpZC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcmFpZC5jCkBAIC02LDYgKzYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJtZC5oIgogI2luY2x1ZGUgInJhaWQxLmgiCkBAIC0xMDE3LDMwICsxMDE4LDU2IEBACiAJc3RydWN0IHJhaWRfc2V0ICpycyA9IHRpLT5wcml2YXRlOwogCXVuc2lnbmVkIHJhaWRfcGFyYW1fY250ID0gMTsgLyogYXQgbGVhc3QgMSBmb3IgY2h1bmtzaXplICovCiAJdW5zaWduZWQgc3ogPSAwOwotCWludCBpOworCWludCBpLCBhcnJheV9pbl9zeW5jID0gMDsKIAlzZWN0b3JfdCBzeW5jOwogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBTVEFUVVNUWVBFX0lORk86CiAJCURNRU1JVCgiJXMgJWQgIiwgcnMtPnJhaWRfdHlwZS0+bmFtZSwgcnMtPm1kLnJhaWRfZGlza3MpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKSB7Ci0JCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKLQkJCQlETUVNSVQoIkQiKTsKLQkJCWVsc2UgaWYgKHRlc3RfYml0KEluX3N5bmMsICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpKQotCQkJCURNRU1JVCgiQSIpOwotCQkJZWxzZQotCQkJCURNRU1JVCgiYSIpOwotCQl9Ci0KIAkJaWYgKHRlc3RfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZycy0+bWQucmVjb3ZlcnkpKQogCQkJc3luYyA9IHJzLT5tZC5jdXJyX3Jlc3luY19jb21wbGV0ZWQ7CiAJCWVsc2UKIAkJCXN5bmMgPSBycy0+bWQucmVjb3ZlcnlfY3A7CiAKLQkJaWYgKHN5bmMgPiBycy0+bWQucmVzeW5jX21heF9zZWN0b3JzKQorCQlpZiAoc3luYyA+PSBycy0+bWQucmVzeW5jX21heF9zZWN0b3JzKSB7CisJCQlhcnJheV9pbl9zeW5jID0gMTsKIAkJCXN5bmMgPSBycy0+bWQucmVzeW5jX21heF9zZWN0b3JzOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBhcnJheSBtYXkgYmUgZG9pbmcgYW4gaW5pdGlhbCBzeW5jLCBvciBpdCBtYXkKKwkJCSAqIGJlIHJlYnVpbGRpbmcgaW5kaXZpZHVhbCBjb21wb25lbnRzLiAgSWYgYWxsIHRoZQorCQkJICogZGV2aWNlcyBhcmUgSW5fc3luYywgdGhlbiBpdCBpcyB0aGUgYXJyYXkgdGhhdCBpcworCQkJICogYmVpbmcgaW5pdGlhbGl6ZWQuCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKQorCQkJCWlmICghdGVzdF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQkJCWFycmF5X2luX3N5bmMgPSAxOworCQl9CisJCS8qCisJCSAqIFN0YXR1cyBjaGFyYWN0ZXJzOgorCQkgKiAgJ0QnID0gRGVhZC9GYWlsZWQgZGV2aWNlCisJCSAqICAnYScgPSBBbGl2ZSBidXQgbm90IGluLXN5bmMKKwkJICogICdBJyA9IEFsaXZlIGFuZCBpbi1zeW5jCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykgeworCQkJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQkJRE1FTUlUKCJEIik7CisJCQllbHNlIGlmICghYXJyYXlfaW5fc3luYyB8fAorCQkJCSAhdGVzdF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQkJRE1FTUlUKCJhIik7CisJCQllbHNlCisJCQkJRE1FTUlUKCJBIik7CisJCX0KIAorCQkvKgorCQkgKiBJbi1zeW5jIHJhdGlvOgorCQkgKiAgVGhlIGluLXN5bmMgcmF0aW8gc2hvd3MgdGhlIHByb2dyZXNzIG9mOgorCQkgKiAgIC0gSW5pdGlhbGl6aW5nIHRoZSBhcnJheQorCQkgKiAgIC0gUmVidWlsZGluZyBhIHN1YnNldCBvZiBkZXZpY2VzIG9mIHRoZSBhcnJheQorCQkgKiAgVGhlIHVzZXIgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3byBieSByZWZlcnJpbmcKKwkJICogIHRvIHRoZSBzdGF0dXMgY2hhcmFjdGVycy4KKwkJICovCiAJCURNRU1JVCgiICVsbHUvJWxsdSIsCiAJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzeW5jLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnMtPm1kLnJlc3luY19tYXhfc2VjdG9ycyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMgYi9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMKaW5kZXggMjQ3NTJmNC4uMjdmMWQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yb3VuZC1yb2Jpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcm91bmQtcm9iaW4uYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImRtLXBhdGgtc2VsZWN0b3IuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBETV9NU0dfUFJFRklYICJtdWx0aXBhdGggcm91bmQtcm9iaW4iCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc2VydmljZS10aW1lLmMgYi9kcml2ZXJzL21kL2RtLXNlcnZpY2UtdGltZS5jCmluZGV4IDljNmMyZTQuLjU5ODgzYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc2VydmljZS10aW1lLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zZXJ2aWNlLXRpbWUuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImRtLXBhdGgtc2VsZWN0b3IuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBETV9NU0dfUFJFRklYCSJtdWx0aXBhdGggc2VydmljZS10aW1lIgogI2RlZmluZSBTVF9NSU5fSU8JMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMKaW5kZXggZDFmMWQ3MC4uM2FjNDE1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kbS1pby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAtdHJhbnNpZW50LmMgYi9kcml2ZXJzL21kL2RtLXNuYXAtdHJhbnNpZW50LmMKaW5kZXggYTA4OThhNi4uMWNlOWEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLXRyYW5zaWVudC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC10cmFuc2llbnQuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS10YWJsZS5jIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCmluZGV4IGJjMDQ1MTguLjhlOTEzMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYworKysgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKQEAgLTU0LDcgKzU0LDkgQEAKIAlzZWN0b3JfdCAqaGlnaHM7CiAJc3RydWN0IGRtX3RhcmdldCAqdGFyZ2V0czsKIAorCXN0cnVjdCB0YXJnZXRfdHlwZSAqaW1tdXRhYmxlX3RhcmdldF90eXBlOwogCXVuc2lnbmVkIGludGVncml0eV9zdXBwb3J0ZWQ6MTsKKwl1bnNpZ25lZCBzaW5nbGV0b246MTsKIAogCS8qCiAJICogSW5kaWNhdGVzIHRoZSBydyBwZXJtaXNzaW9ucyBmb3IgdGhlIG5ldyBsb2dpY2FsCkBAIC03NDAsNiArNzQyLDEyIEBACiAJY2hhciAqKmFyZ3Y7CiAJc3RydWN0IGRtX3RhcmdldCAqdGd0OwogCisJaWYgKHQtPnNpbmdsZXRvbikgeworCQlETUVSUigiJXM6IHRhcmdldCB0eXBlICVzIG11c3QgYXBwZWFyIGFsb25lIGluIHRhYmxlIiwKKwkJICAgICAgZG1fZGV2aWNlX25hbWUodC0+bWQpLCB0LT50YXJnZXRzLT50eXBlLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKChyID0gY2hlY2tfc3BhY2UodCkpKQogCQlyZXR1cm4gcjsKIApAQCAtNzU4LDYgKzc2NiwzNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoZG1fdGFyZ2V0X25lZWRzX3NpbmdsZXRvbih0Z3QtPnR5cGUpKSB7CisJCWlmICh0LT5udW1fdGFyZ2V0cykgeworCQkJRE1FUlIoIiVzOiB0YXJnZXQgdHlwZSAlcyBtdXN0IGFwcGVhciBhbG9uZSBpbiB0YWJsZSIsCisJCQkgICAgICBkbV9kZXZpY2VfbmFtZSh0LT5tZCksIHR5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJdC0+c2luZ2xldG9uID0gMTsKKwl9CisKKwlpZiAoZG1fdGFyZ2V0X2Fsd2F5c193cml0ZWFibGUodGd0LT50eXBlKSAmJiAhKHQtPm1vZGUgJiBGTU9ERV9XUklURSkpIHsKKwkJRE1FUlIoIiVzOiB0YXJnZXQgdHlwZSAlcyBtYXkgbm90IGJlIGluY2x1ZGVkIGluIHJlYWQtb25seSB0YWJsZXMiLAorCQkgICAgICBkbV9kZXZpY2VfbmFtZSh0LT5tZCksIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodC0+aW1tdXRhYmxlX3RhcmdldF90eXBlKSB7CisJCWlmICh0LT5pbW11dGFibGVfdGFyZ2V0X3R5cGUgIT0gdGd0LT50eXBlKSB7CisJCQlETUVSUigiJXM6IGltbXV0YWJsZSB0YXJnZXQgdHlwZSAlcyBjYW5ub3QgYmUgbWl4ZWQgd2l0aCBvdGhlciB0YXJnZXQgdHlwZXMiLAorCQkJICAgICAgZG1fZGV2aWNlX25hbWUodC0+bWQpLCB0LT5pbW11dGFibGVfdGFyZ2V0X3R5cGUtPm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKGRtX3RhcmdldF9pc19pbW11dGFibGUodGd0LT50eXBlKSkgeworCQlpZiAodC0+bnVtX3RhcmdldHMpIHsKKwkJCURNRVJSKCIlczogaW1tdXRhYmxlIHRhcmdldCB0eXBlICVzIGNhbm5vdCBiZSBtaXhlZCB3aXRoIG90aGVyIHRhcmdldCB0eXBlcyIsCisJCQkgICAgICBkbV9kZXZpY2VfbmFtZSh0LT5tZCksIHRndC0+dHlwZS0+bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl0LT5pbW11dGFibGVfdGFyZ2V0X3R5cGUgPSB0Z3QtPnR5cGU7CisJfQorCiAJdGd0LT50YWJsZSA9IHQ7CiAJdGd0LT5iZWdpbiA9IHN0YXJ0OwogCXRndC0+bGVuID0gbGVuOwpAQCAtOTE1LDYgKzk1MywxMSBAQAogCXJldHVybiB0LT50eXBlOwogfQogCitzdHJ1Y3QgdGFyZ2V0X3R5cGUgKmRtX3RhYmxlX2dldF9pbW11dGFibGVfdGFyZ2V0X3R5cGUoc3RydWN0IGRtX3RhYmxlICp0KQoreworCXJldHVybiB0LT5pbW11dGFibGVfdGFyZ2V0X3R5cGU7Cit9CisKIGJvb2wgZG1fdGFibGVfcmVxdWVzdF9iYXNlZChzdHJ1Y3QgZG1fdGFibGUgKnQpCiB7CiAJcmV0dXJuIGRtX3RhYmxlX2dldF90eXBlKHQpID09IERNX1RZUEVfUkVRVUVTVF9CQVNFRDsKQEAgLTEyOTksNiArMTM0MiwzMSBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW50IGRldmljZV9pc19ub25yb3Qoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmRldiwKKwkJCSAgICBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGV2LT5iZGV2KTsKKworCXJldHVybiBxICYmIGJsa19xdWV1ZV9ub25yb3QocSk7Cit9CisKK3N0YXRpYyBib29sIGRtX3RhYmxlX2lzX25vbnJvdChzdHJ1Y3QgZG1fdGFibGUgKnQpCit7CisJc3RydWN0IGRtX3RhcmdldCAqdGk7CisJdW5zaWduZWQgaSA9IDA7CisKKwkvKiBFbnN1cmUgdGhhdCBhbGwgdW5kZXJseWluZyBkZXZpY2UgYXJlIG5vbi1yb3RhdGlvbmFsLiAqLworCXdoaWxlIChpIDwgZG1fdGFibGVfZ2V0X251bV90YXJnZXRzKHQpKSB7CisJCXRpID0gZG1fdGFibGVfZ2V0X3RhcmdldCh0LCBpKyspOworCisJCWlmICghdGktPnR5cGUtPml0ZXJhdGVfZGV2aWNlcyB8fAorCQkgICAgIXRpLT50eXBlLT5pdGVyYXRlX2RldmljZXModGksIGRldmljZV9pc19ub25yb3QsIE5VTEwpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKIHZvaWQgZG1fdGFibGVfc2V0X3Jlc3RyaWN0aW9ucyhzdHJ1Y3QgZG1fdGFibGUgKnQsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCQkJICAgICAgIHN0cnVjdCBxdWV1ZV9saW1pdHMgKmxpbWl0cykKIHsKQEAgLTEzMjQsNiArMTM5MiwxMSBAQAogCWlmICghZG1fdGFibGVfZGlzY2FyZF96ZXJvZXNfZGF0YSh0KSkKIAkJcS0+bGltaXRzLmRpc2NhcmRfemVyb2VzX2RhdGEgPSAwOwogCisJaWYgKGRtX3RhYmxlX2lzX25vbnJvdCh0KSkKKwkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19OT05ST1QsIHEpOworCWVsc2UKKwkJcXVldWVfZmxhZ19jbGVhcl91bmxvY2tlZChRVUVVRV9GTEFHX05PTlJPVCwgcSk7CisKIAlkbV90YWJsZV9zZXRfaW50ZWdyaXR5KHQpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGhpbi1tZXRhZGF0YS5jIGIvZHJpdmVycy9tZC9kbS10aGluLW1ldGFkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljNGYwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi1tZXRhZGF0YS5jCkBAIC0wLDAgKzEsMTM5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLXRoaW4tbWV0YWRhdGEuaCIKKyNpbmNsdWRlICJwZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUuaCIKKyNpbmNsdWRlICJwZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLmgiCisjaW5jbHVkZSAicGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1kaXNrLmgiCisjaW5jbHVkZSAicGVyc2lzdGVudC1kYXRhL2RtLXRyYW5zYWN0aW9uLW1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFzIGZhciBhcyB0aGUgbWV0YWRhdGEgZ29lcywgdGhlcmUgaXM6CisgKgorICogLSBBIHN1cGVyYmxvY2sgaW4gYmxvY2sgemVybywgdGFraW5nIHVwIGZld2VyIHRoYW4gNTEyIGJ5dGVzIGZvcgorICogICBhdG9taWMgd3JpdGVzLgorICoKKyAqIC0gQSBzcGFjZSBtYXAgbWFuYWdpbmcgdGhlIG1ldGFkYXRhIGJsb2Nrcy4KKyAqCisgKiAtIEEgc3BhY2UgbWFwIG1hbmFnaW5nIHRoZSBkYXRhIGJsb2Nrcy4KKyAqCisgKiAtIEEgYnRyZWUgbWFwcGluZyBvdXIgaW50ZXJuYWwgdGhpbiBkZXYgaWRzIG9udG8gc3RydWN0IGRpc2tfZGV2aWNlX2RldGFpbHMuCisgKgorICogLSBBIGhpZXJhcmNoaWNhbCBidHJlZSwgd2l0aCAyIGxldmVscyB3aGljaCBlZmZlY3RpdmVseSBtYXBzICh0aGluCisgKiAgIGRldiBpZCwgdmlydHVhbCBibG9jaykgLT4gYmxvY2tfdGltZS4gIEJsb2NrIHRpbWUgaXMgYSA2NC1iaXQKKyAqICAgZmllbGQgaG9sZGluZyB0aGUgdGltZSBpbiB0aGUgbG93IDI0IGJpdHMsIGFuZCBibG9jayBpbiB0aGUgdG9wIDQ4CisgKiAgIGJpdHMuCisgKgorICogQlRyZWVzIGNvbnNpc3Qgc29sZWx5IG9mIGJ0cmVlX25vZGVzLCB0aGF0IGZpbGwgYSBibG9jay4gIFNvbWUgYXJlCisgKiBpbnRlcm5hbCBub2RlcywgYXMgc3VjaCB0aGVpciB2YWx1ZXMgYXJlIGEgX19sZTY0IHBvaW50aW5nIHRvIG90aGVyCisgKiBub2Rlcy4gIExlYWYgbm9kZXMgY2FuIHN0b3JlIGRhdGEgb2YgYW55IHJlYXNvbmFibGUgc2l6ZSAoaWUuIG11Y2gKKyAqIHNtYWxsZXIgdGhhbiB0aGUgYmxvY2sgc2l6ZSkuICBUaGUgbm9kZXMgY29uc2lzdCBvZiB0aGUgaGVhZGVyLAorICogZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2Yga2V5cywgZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2YgdmFsdWVzLiAgV2UgaGF2ZQorICogdG8gYmluYXJ5IHNlYXJjaCBvbiB0aGUga2V5cyBzbyB0aGV5J3JlIGFsbCBoZWxkIHRvZ2V0aGVyIHRvIGhlbHAgdGhlCisgKiBjcHUgY2FjaGUuCisgKgorICogU3BhY2UgbWFwcyBoYXZlIDIgYnRyZWVzOgorICoKKyAqIC0gT25lIG1hcHMgYSB1aW50NjRfdCBvbnRvIGEgc3RydWN0IGluZGV4X2VudHJ5LiAgV2hpY2ggcG9pbnRzIHRvIGEKKyAqICAgYml0bWFwIGJsb2NrLCBhbmQgaGFzIHNvbWUgZGV0YWlscyBhYm91dCBob3cgbWFueSBmcmVlIGVudHJpZXMgdGhlcmUKKyAqICAgYXJlIGV0Yy4KKyAqCisgKiAtIFRoZSBiaXRtYXAgYmxvY2tzIGhhdmUgYSBoZWFkZXIgKGZvciB0aGUgY2hlY2tzdW0pLiAgVGhlbiB0aGUgcmVzdAorICogICBvZiB0aGUgYmxvY2sgaXMgcGFpcnMgb2YgYml0cy4gIFdpdGggdGhlIG1lYW5pbmcgYmVpbmc6CisgKgorICogICAwIC0gcmVmIGNvdW50IGlzIDAKKyAqICAgMSAtIHJlZiBjb3VudCBpcyAxCisgKiAgIDIgLSByZWYgY291bnQgaXMgMgorICogICAzIC0gcmVmIGNvdW50IGlzIGhpZ2hlciB0aGFuIDIKKyAqCisgKiAtIElmIHRoZSBjb3VudCBpcyBoaWdoZXIgdGhhbiAyIHRoZW4gdGhlIHJlZiBjb3VudCBpcyBlbnRlcmVkIGluIGEKKyAqICAgc2Vjb25kIGJ0cmVlIHRoYXQgZGlyZWN0bHkgbWFwcyB0aGUgYmxvY2tfYWRkcmVzcyB0byBhIHVpbnQzMl90IHJlZgorICogICBjb3VudC4KKyAqCisgKiBUaGUgc3BhY2UgbWFwIG1ldGFkYXRhIHZhcmlhbnQgZG9lc24ndCBoYXZlIGEgYml0bWFwcyBidHJlZS4gIEluc3RlYWQKKyAqIGl0IGhhcyBvbmUgc2luZ2xlIGJsb2NrcyB3b3J0aCBvZiBpbmRleF9lbnRyaWVzLiAgVGhpcyBhdm9pZHMKKyAqIHJlY3Vyc2l2ZSBpc3N1ZXMgd2l0aCB0aGUgYml0bWFwIGJ0cmVlIG5lZWRpbmcgdG8gYWxsb2NhdGUgc3BhY2UgaW4KKyAqIG9yZGVyIHRvIGluc2VydC4gIFdpdGggYSBzbWFsbCBkYXRhIGJsb2NrIHNpemUgc3VjaCBhcyA2NGsgdGhlCisgKiBtZXRhZGF0YSBzdXBwb3J0IGRhdGEgZGV2aWNlcyB0aGF0IGFyZSBodW5kcmVkcyBvZiB0ZXJyYWJ5dGVzLgorICoKKyAqIFRoZSBzcGFjZSBtYXBzIGFsbG9jYXRlIHNwYWNlIGxpbmVhcmx5IGZyb20gZnJvbnQgdG8gYmFjay4gIFNwYWNlIHRoYXQKKyAqIGlzIGZyZWVkIGluIGEgdHJhbnNhY3Rpb24gaXMgbmV2ZXIgcmVjeWNsZWQgd2l0aGluIHRoYXQgdHJhbnNhY3Rpb24uCisgKiBUbyB0cnkgYW5kIGF2b2lkIGZyYWdtZW50aW5nIF9mcmVlXyBzcGFjZSB0aGUgYWxsb2NhdG9yIGFsd2F5cyBnb2VzCisgKiBiYWNrIGFuZCBmaWxscyBpbiBnYXBzLgorICoKKyAqIEFsbCBtZXRhZGF0YSBpbyBpcyBpbiBUSElOX01FVEFEQVRBX0JMT0NLX1NJWkUgc2l6ZWQvYWxpZ25lZCBjaHVua3MKKyAqIGZyb20gdGhlIGJsb2NrIG1hbmFnZXIuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBETV9NU0dfUFJFRklYICAgInRoaW4gbWV0YWRhdGEiCisKKyNkZWZpbmUgVEhJTl9TVVBFUkJMT0NLX01BR0lDIDI3MDIyMDEwCisjZGVmaW5lIFRISU5fU1VQRVJCTE9DS19MT0NBVElPTiAwCisjZGVmaW5lIFRISU5fVkVSU0lPTiAxCisjZGVmaW5lIFRISU5fTUVUQURBVEFfQ0FDSEVfU0laRSA2NAorI2RlZmluZSBTRUNUT1JfVE9fQkxPQ0tfU0hJRlQgMworCisvKiBUaGlzIHNob3VsZCBiZSBwbGVudHkgKi8KKyNkZWZpbmUgU1BBQ0VfTUFQX1JPT1RfU0laRSAxMjgKKworLyoKKyAqIExpdHRsZSBlbmRpYW4gb24tZGlzayBzdXBlcmJsb2NrIGFuZCBkZXZpY2UgZGV0YWlscy4KKyAqLworc3RydWN0IHRoaW5fZGlza19zdXBlcmJsb2NrIHsKKwlfX2xlMzIgY3N1bTsJLyogQ2hlY2tzdW0gb2Ygc3VwZXJibG9jayBleGNlcHQgZm9yIHRoaXMgZmllbGQuICovCisJX19sZTMyIGZsYWdzOworCV9fbGU2NCBibG9ja25yOwkvKiBUaGlzIGJsb2NrIG51bWJlciwgZG1fYmxvY2tfdC4gKi8KKworCV9fdTggdXVpZFsxNl07CisJX19sZTY0IG1hZ2ljOworCV9fbGUzMiB2ZXJzaW9uOworCV9fbGUzMiB0aW1lOworCisJX19sZTY0IHRyYW5zX2lkOworCisJLyoKKwkgKiBSb290IGhlbGQgYnkgdXNlcnNwYWNlIHRyYW5zYWN0aW9ucy4KKwkgKi8KKwlfX2xlNjQgaGVsZF9yb290OworCisJX191OCBkYXRhX3NwYWNlX21hcF9yb290W1NQQUNFX01BUF9ST09UX1NJWkVdOworCV9fdTggbWV0YWRhdGFfc3BhY2VfbWFwX3Jvb3RbU1BBQ0VfTUFQX1JPT1RfU0laRV07CisKKwkvKgorCSAqIDItbGV2ZWwgYnRyZWUgbWFwcGluZyAoZGV2X2lkLCAoZGV2IGJsb2NrLCB0aW1lKSkgLT4gZGF0YSBibG9jaworCSAqLworCV9fbGU2NCBkYXRhX21hcHBpbmdfcm9vdDsKKworCS8qCisJICogRGV2aWNlIGRldGFpbCByb290IG1hcHBpbmcgZGV2X2lkIC0+IGRldmljZV9kZXRhaWxzCisJICovCisJX19sZTY0IGRldmljZV9kZXRhaWxzX3Jvb3Q7CisKKwlfX2xlMzIgZGF0YV9ibG9ja19zaXplOwkJLyogSW4gNTEyLWJ5dGUgc2VjdG9ycy4gKi8KKworCV9fbGUzMiBtZXRhZGF0YV9ibG9ja19zaXplOwkvKiBJbiA1MTItYnl0ZSBzZWN0b3JzLiAqLworCV9fbGU2NCBtZXRhZGF0YV9ucl9ibG9ja3M7CisKKwlfX2xlMzIgY29tcGF0X2ZsYWdzOworCV9fbGUzMiBjb21wYXRfcm9fZmxhZ3M7CisJX19sZTMyIGluY29tcGF0X2ZsYWdzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGRpc2tfZGV2aWNlX2RldGFpbHMgeworCV9fbGU2NCBtYXBwZWRfYmxvY2tzOworCV9fbGU2NCB0cmFuc2FjdGlvbl9pZDsJCS8qIFdoZW4gY3JlYXRlZC4gKi8KKwlfX2xlMzIgY3JlYXRpb25fdGltZTsKKwlfX2xlMzIgc25hcHNob3R0ZWRfdGltZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBkbV9wb29sX21ldGFkYXRhIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBoYXNoOworCisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm07CisJc3RydWN0IGRtX3NwYWNlX21hcCAqbWV0YWRhdGFfc207CisJc3RydWN0IGRtX3NwYWNlX21hcCAqZGF0YV9zbTsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG07CisJc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKm5iX3RtOworCisJLyoKKwkgKiBUd28tbGV2ZWwgYnRyZWUuCisJICogRmlyc3QgbGV2ZWwgaG9sZHMgdGhpbl9kZXZfdC4KKwkgKiBTZWNvbmQgbGV2ZWwgaG9sZHMgbWFwcGluZ3MuCisJICovCisJc3RydWN0IGRtX2J0cmVlX2luZm8gaW5mbzsKKworCS8qCisJICogTm9uLWJsb2NraW5nIHZlcnNpb24gb2YgdGhlIGFib3ZlLgorCSAqLworCXN0cnVjdCBkbV9idHJlZV9pbmZvIG5iX2luZm87CisKKwkvKgorCSAqIEp1c3QgdGhlIHRvcCBsZXZlbCBmb3IgZGVsZXRpbmcgd2hvbGUgZGV2aWNlcy4KKwkgKi8KKwlzdHJ1Y3QgZG1fYnRyZWVfaW5mbyB0bF9pbmZvOworCisJLyoKKwkgKiBKdXN0IHRoZSBib3R0b20gbGV2ZWwgZm9yIGNyZWF0aW5nIG5ldyBkZXZpY2VzLgorCSAqLworCXN0cnVjdCBkbV9idHJlZV9pbmZvIGJsX2luZm87CisKKwkvKgorCSAqIERlc2NyaWJlcyB0aGUgZGV2aWNlIGRldGFpbHMgYnRyZWUuCisJICovCisJc3RydWN0IGRtX2J0cmVlX2luZm8gZGV0YWlsc19pbmZvOworCisJc3RydWN0IHJ3X3NlbWFwaG9yZSByb290X2xvY2s7CisJdWludDMyX3QgdGltZTsKKwlpbnQgbmVlZF9jb21taXQ7CisJZG1fYmxvY2tfdCByb290OworCWRtX2Jsb2NrX3QgZGV0YWlsc19yb290OworCXN0cnVjdCBsaXN0X2hlYWQgdGhpbl9kZXZpY2VzOworCXVpbnQ2NF90IHRyYW5zX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2VjdG9yX3QgZGF0YV9ibG9ja19zaXplOworfTsKKworc3RydWN0IGRtX3RoaW5fZGV2aWNlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZDsKKwlkbV90aGluX2lkIGlkOworCisJaW50IG9wZW5fY291bnQ7CisJaW50IGNoYW5nZWQ7CisJdWludDY0X3QgbWFwcGVkX2Jsb2NrczsKKwl1aW50NjRfdCB0cmFuc2FjdGlvbl9pZDsKKwl1aW50MzJfdCBjcmVhdGlvbl90aW1lOworCXVpbnQzMl90IHNuYXBzaG90dGVkX3RpbWU7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHN1cGVyYmxvY2sgdmFsaWRhdG9yCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBTVVBFUkJMT0NLX0NTVU1fWE9SIDE2MDc3NAorCitzdGF0aWMgdm9pZCBzYl9wcmVwYXJlX2Zvcl93cml0ZShzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkJCSBzdHJ1Y3QgZG1fYmxvY2sgKmIsCisJCQkJIHNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlciA9IGRtX2Jsb2NrX2RhdGEoYik7CisKKwlkaXNrX3N1cGVyLT5ibG9ja25yID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24oYikpOworCWRpc2tfc3VwZXItPmNzdW0gPSBjcHVfdG9fbGUzMihkbV9ibV9jaGVja3N1bSgmZGlza19zdXBlci0+ZmxhZ3MsCisJCQkJCQkgICAgICBibG9ja19zaXplIC0gc2l6ZW9mKF9fbGUzMiksCisJCQkJCQkgICAgICBTVVBFUkJMT0NLX0NTVU1fWE9SKSk7Cit9CisKK3N0YXRpYyBpbnQgc2JfY2hlY2soc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJICAgIHN0cnVjdCBkbV9ibG9jayAqYiwKKwkJICAgIHNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlciA9IGRtX2Jsb2NrX2RhdGEoYik7CisJX19sZTMyIGNzdW1fbGU7CisKKwlpZiAoZG1fYmxvY2tfbG9jYXRpb24oYikgIT0gbGU2NF90b19jcHUoZGlza19zdXBlci0+YmxvY2tucikpIHsKKwkJRE1FUlIoInNiX2NoZWNrIGZhaWxlZDogYmxvY2tuciAlbGx1OiAiCisJCSAgICAgICJ3YW50ZWQgJWxsdSIsIGxlNjRfdG9fY3B1KGRpc2tfc3VwZXItPmJsb2NrbnIpLAorCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRtX2Jsb2NrX2xvY2F0aW9uKGIpKTsKKwkJcmV0dXJuIC1FTk9UQkxLOworCX0KKworCWlmIChsZTY0X3RvX2NwdShkaXNrX3N1cGVyLT5tYWdpYykgIT0gVEhJTl9TVVBFUkJMT0NLX01BR0lDKSB7CisJCURNRVJSKCJzYl9jaGVjayBmYWlsZWQ6IG1hZ2ljICVsbHU6ICIKKwkJICAgICAgIndhbnRlZCAlbGx1IiwgbGU2NF90b19jcHUoZGlza19zdXBlci0+bWFnaWMpLAorCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKVRISU5fU1VQRVJCTE9DS19NQUdJQyk7CisJCXJldHVybiAtRUlMU0VROworCX0KKworCWNzdW1fbGUgPSBjcHVfdG9fbGUzMihkbV9ibV9jaGVja3N1bSgmZGlza19zdXBlci0+ZmxhZ3MsCisJCQkJCSAgICAgYmxvY2tfc2l6ZSAtIHNpemVvZihfX2xlMzIpLAorCQkJCQkgICAgIFNVUEVSQkxPQ0tfQ1NVTV9YT1IpKTsKKwlpZiAoY3N1bV9sZSAhPSBkaXNrX3N1cGVyLT5jc3VtKSB7CisJCURNRVJSKCJzYl9jaGVjayBmYWlsZWQ6IGNzdW0gJXU6IHdhbnRlZCAldSIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNzdW1fbGUpLCBsZTMyX3RvX2NwdShkaXNrX3N1cGVyLT5jc3VtKSk7CisJCXJldHVybiAtRUlMU0VROworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciBzYl92YWxpZGF0b3IgPSB7CisJLm5hbWUgPSAic3VwZXJibG9jayIsCisJLnByZXBhcmVfZm9yX3dyaXRlID0gc2JfcHJlcGFyZV9mb3Jfd3JpdGUsCisJLmNoZWNrID0gc2JfY2hlY2sKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWV0aG9kcyBmb3IgdGhlIGJ0cmVlIHZhbHVlIHR5cGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVpbnQ2NF90IHBhY2tfYmxvY2tfdGltZShkbV9ibG9ja190IGIsIHVpbnQzMl90IHQpCit7CisJcmV0dXJuIChiIDw8IDI0KSB8IHQ7Cit9CisKK3N0YXRpYyB2b2lkIHVucGFja19ibG9ja190aW1lKHVpbnQ2NF90IHYsIGRtX2Jsb2NrX3QgKmIsIHVpbnQzMl90ICp0KQoreworCSpiID0gdiA+PiAyNDsKKwkqdCA9IHYgJiAoKDEgPDwgMjQpIC0gMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGFfYmxvY2tfaW5jKHZvaWQgKmNvbnRleHQsIHZvaWQgKnZhbHVlX2xlKQoreworCXN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtID0gY29udGV4dDsKKwlfX2xlNjQgdl9sZTsKKwl1aW50NjRfdCBiOworCXVpbnQzMl90IHQ7CisKKwltZW1jcHkoJnZfbGUsIHZhbHVlX2xlLCBzaXplb2Yodl9sZSkpOworCXVucGFja19ibG9ja190aW1lKGxlNjRfdG9fY3B1KHZfbGUpLCAmYiwgJnQpOworCWRtX3NtX2luY19ibG9jayhzbSwgYik7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGFfYmxvY2tfZGVjKHZvaWQgKmNvbnRleHQsIHZvaWQgKnZhbHVlX2xlKQoreworCXN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtID0gY29udGV4dDsKKwlfX2xlNjQgdl9sZTsKKwl1aW50NjRfdCBiOworCXVpbnQzMl90IHQ7CisKKwltZW1jcHkoJnZfbGUsIHZhbHVlX2xlLCBzaXplb2Yodl9sZSkpOworCXVucGFja19ibG9ja190aW1lKGxlNjRfdG9fY3B1KHZfbGUpLCAmYiwgJnQpOworCWRtX3NtX2RlY19ibG9jayhzbSwgYik7Cit9CisKK3N0YXRpYyBpbnQgZGF0YV9ibG9ja19lcXVhbCh2b2lkICpjb250ZXh0LCB2b2lkICp2YWx1ZTFfbGUsIHZvaWQgKnZhbHVlMl9sZSkKK3sKKwlfX2xlNjQgdjFfbGUsIHYyX2xlOworCXVpbnQ2NF90IGIxLCBiMjsKKwl1aW50MzJfdCB0OworCisJbWVtY3B5KCZ2MV9sZSwgdmFsdWUxX2xlLCBzaXplb2YodjFfbGUpKTsKKwltZW1jcHkoJnYyX2xlLCB2YWx1ZTJfbGUsIHNpemVvZih2Ml9sZSkpOworCXVucGFja19ibG9ja190aW1lKGxlNjRfdG9fY3B1KHYxX2xlKSwgJmIxLCAmdCk7CisJdW5wYWNrX2Jsb2NrX3RpbWUobGU2NF90b19jcHUodjJfbGUpLCAmYjIsICZ0KTsKKworCXJldHVybiBiMSA9PSBiMjsKK30KKworc3RhdGljIHZvaWQgc3VidHJlZV9pbmModm9pZCAqY29udGV4dCwgdm9pZCAqdmFsdWUpCit7CisJc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8gPSBjb250ZXh0OworCV9fbGU2NCByb290X2xlOworCXVpbnQ2NF90IHJvb3Q7CisKKwltZW1jcHkoJnJvb3RfbGUsIHZhbHVlLCBzaXplb2Yocm9vdF9sZSkpOworCXJvb3QgPSBsZTY0X3RvX2NwdShyb290X2xlKTsKKwlkbV90bV9pbmMoaW5mby0+dG0sIHJvb3QpOworfQorCitzdGF0aWMgdm9pZCBzdWJ0cmVlX2RlYyh2b2lkICpjb250ZXh0LCB2b2lkICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbyA9IGNvbnRleHQ7CisJX19sZTY0IHJvb3RfbGU7CisJdWludDY0X3Qgcm9vdDsKKworCW1lbWNweSgmcm9vdF9sZSwgdmFsdWUsIHNpemVvZihyb290X2xlKSk7CisJcm9vdCA9IGxlNjRfdG9fY3B1KHJvb3RfbGUpOworCWlmIChkbV9idHJlZV9kZWwoaW5mbywgcm9vdCkpCisJCURNRVJSKCJidHJlZSBkZWxldGUgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIGludCBzdWJ0cmVlX2VxdWFsKHZvaWQgKmNvbnRleHQsIHZvaWQgKnZhbHVlMV9sZSwgdm9pZCAqdmFsdWUyX2xlKQoreworCV9fbGU2NCB2MV9sZSwgdjJfbGU7CisJbWVtY3B5KCZ2MV9sZSwgdmFsdWUxX2xlLCBzaXplb2YodjFfbGUpKTsKKwltZW1jcHkoJnYyX2xlLCB2YWx1ZTJfbGUsIHNpemVvZih2Ml9sZSkpOworCisJcmV0dXJuIHYxX2xlID09IHYyX2xlOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHN1cGVyYmxvY2tfYWxsX3plcm9lcyhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGludCAqcmVzdWx0KQoreworCWludCByOworCXVuc2lnbmVkIGk7CisJc3RydWN0IGRtX2Jsb2NrICpiOworCV9fbGU2NCAqZGF0YV9sZSwgemVybyA9IGNwdV90b19sZTY0KDApOworCXVuc2lnbmVkIGJsb2NrX3NpemUgPSBkbV9ibV9ibG9ja19zaXplKGJtKSAvIHNpemVvZihfX2xlNjQpOworCisJLyoKKwkgKiBXZSBjYW4ndCB1c2UgYSB2YWxpZGF0b3IgaGVyZSAtIGl0IG1heSBiZSBhbGwgemVyb2VzLgorCSAqLworCXIgPSBkbV9ibV9yZWFkX2xvY2soYm0sIFRISU5fU1VQRVJCTE9DS19MT0NBVElPTiwgTlVMTCwgJmIpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRhdGFfbGUgPSBkbV9ibG9ja19kYXRhKGIpOworCSpyZXN1bHQgPSAxOworCWZvciAoaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIHsKKwkJaWYgKGRhdGFfbGVbaV0gIT0gemVybykgeworCQkJKnJlc3VsdCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBkbV9ibV91bmxvY2soYik7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9wbWQoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJICAgIHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJICAgIGRtX2Jsb2NrX3QgbnJfYmxvY2tzLCBpbnQgY3JlYXRlKQoreworCWludCByOworCXN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCAqZGF0YV9zbTsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG07CisJc3RydWN0IGRtX2Jsb2NrICpzYmxvY2s7CisKKwlpZiAoY3JlYXRlKSB7CisJCXIgPSBkbV90bV9jcmVhdGVfd2l0aF9zbShibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJCQkgJnNiX3ZhbGlkYXRvciwgJnRtLCAmc20sICZzYmxvY2spOworCQlpZiAociA8IDApIHsKKwkJCURNRVJSKCJ0bV9jcmVhdGVfd2l0aF9zbSBmYWlsZWQiKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJZGF0YV9zbSA9IGRtX3NtX2Rpc2tfY3JlYXRlKHRtLCBucl9ibG9ja3MpOworCQlpZiAoSVNfRVJSKGRhdGFfc20pKSB7CisJCQlETUVSUigic21fZGlza19jcmVhdGUgZmFpbGVkIik7CisJCQlyID0gUFRSX0VSUihkYXRhX3NtKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHRoaW5fZGlza19zdXBlcmJsb2NrICpkaXNrX3N1cGVyID0gTlVMTDsKKwkJc2l6ZV90IHNwYWNlX21hcF9yb290X29mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3QgdGhpbl9kaXNrX3N1cGVyYmxvY2ssIG1ldGFkYXRhX3NwYWNlX21hcF9yb290KTsKKworCQlyID0gZG1fdG1fb3Blbl93aXRoX3NtKGJtLCBUSElOX1NVUEVSQkxPQ0tfTE9DQVRJT04sCisJCQkJICAgICAgICZzYl92YWxpZGF0b3IsIHNwYWNlX21hcF9yb290X29mZnNldCwKKwkJCQkgICAgICAgU1BBQ0VfTUFQX1JPT1RfU0laRSwgJnRtLCAmc20sICZzYmxvY2spOworCQlpZiAociA8IDApIHsKKwkJCURNRVJSKCJ0bV9vcGVuX3dpdGhfc20gZmFpbGVkIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCisJCWRpc2tfc3VwZXIgPSBkbV9ibG9ja19kYXRhKHNibG9jayk7CisJCWRhdGFfc20gPSBkbV9zbV9kaXNrX29wZW4odG0sIGRpc2tfc3VwZXItPmRhdGFfc3BhY2VfbWFwX3Jvb3QsCisJCQkJCSAgc2l6ZW9mKGRpc2tfc3VwZXItPmRhdGFfc3BhY2VfbWFwX3Jvb3QpKTsKKwkJaWYgKElTX0VSUihkYXRhX3NtKSkgeworCQkJRE1FUlIoInNtX2Rpc2tfb3BlbiBmYWlsZWQiKTsKKwkJCXIgPSBQVFJfRVJSKGRhdGFfc20pOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKworCXIgPSBkbV90bV91bmxvY2sodG0sIHNibG9jayk7CisJaWYgKHIgPCAwKSB7CisJCURNRVJSKCJjb3VsZG4ndCB1bmxvY2sgc3VwZXJibG9jayIpOworCQlnb3RvIGJhZF9kYXRhX3NtOworCX0KKworCXBtZC0+Ym0gPSBibTsKKwlwbWQtPm1ldGFkYXRhX3NtID0gc207CisJcG1kLT5kYXRhX3NtID0gZGF0YV9zbTsKKwlwbWQtPnRtID0gdG07CisJcG1kLT5uYl90bSA9IGRtX3RtX2NyZWF0ZV9ub25fYmxvY2tpbmdfY2xvbmUodG0pOworCWlmICghcG1kLT5uYl90bSkgeworCQlETUVSUigiY291bGQgbm90IGNyZWF0ZSBjbG9uZSB0bSIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBiYWRfZGF0YV9zbTsKKwl9CisKKwlwbWQtPmluZm8udG0gPSB0bTsKKwlwbWQtPmluZm8ubGV2ZWxzID0gMjsKKwlwbWQtPmluZm8udmFsdWVfdHlwZS5jb250ZXh0ID0gcG1kLT5kYXRhX3NtOworCXBtZC0+aW5mby52YWx1ZV90eXBlLnNpemUgPSBzaXplb2YoX19sZTY0KTsKKwlwbWQtPmluZm8udmFsdWVfdHlwZS5pbmMgPSBkYXRhX2Jsb2NrX2luYzsKKwlwbWQtPmluZm8udmFsdWVfdHlwZS5kZWMgPSBkYXRhX2Jsb2NrX2RlYzsKKwlwbWQtPmluZm8udmFsdWVfdHlwZS5lcXVhbCA9IGRhdGFfYmxvY2tfZXF1YWw7CisKKwltZW1jcHkoJnBtZC0+bmJfaW5mbywgJnBtZC0+aW5mbywgc2l6ZW9mKHBtZC0+bmJfaW5mbykpOworCXBtZC0+bmJfaW5mby50bSA9IHBtZC0+bmJfdG07CisKKwlwbWQtPnRsX2luZm8udG0gPSB0bTsKKwlwbWQtPnRsX2luZm8ubGV2ZWxzID0gMTsKKwlwbWQtPnRsX2luZm8udmFsdWVfdHlwZS5jb250ZXh0ID0gJnBtZC0+aW5mbzsKKwlwbWQtPnRsX2luZm8udmFsdWVfdHlwZS5zaXplID0gc2l6ZW9mKF9fbGU2NCk7CisJcG1kLT50bF9pbmZvLnZhbHVlX3R5cGUuaW5jID0gc3VidHJlZV9pbmM7CisJcG1kLT50bF9pbmZvLnZhbHVlX3R5cGUuZGVjID0gc3VidHJlZV9kZWM7CisJcG1kLT50bF9pbmZvLnZhbHVlX3R5cGUuZXF1YWwgPSBzdWJ0cmVlX2VxdWFsOworCisJcG1kLT5ibF9pbmZvLnRtID0gdG07CisJcG1kLT5ibF9pbmZvLmxldmVscyA9IDE7CisJcG1kLT5ibF9pbmZvLnZhbHVlX3R5cGUuY29udGV4dCA9IHBtZC0+ZGF0YV9zbTsKKwlwbWQtPmJsX2luZm8udmFsdWVfdHlwZS5zaXplID0gc2l6ZW9mKF9fbGU2NCk7CisJcG1kLT5ibF9pbmZvLnZhbHVlX3R5cGUuaW5jID0gZGF0YV9ibG9ja19pbmM7CisJcG1kLT5ibF9pbmZvLnZhbHVlX3R5cGUuZGVjID0gZGF0YV9ibG9ja19kZWM7CisJcG1kLT5ibF9pbmZvLnZhbHVlX3R5cGUuZXF1YWwgPSBkYXRhX2Jsb2NrX2VxdWFsOworCisJcG1kLT5kZXRhaWxzX2luZm8udG0gPSB0bTsKKwlwbWQtPmRldGFpbHNfaW5mby5sZXZlbHMgPSAxOworCXBtZC0+ZGV0YWlsc19pbmZvLnZhbHVlX3R5cGUuY29udGV4dCA9IE5VTEw7CisJcG1kLT5kZXRhaWxzX2luZm8udmFsdWVfdHlwZS5zaXplID0gc2l6ZW9mKHN0cnVjdCBkaXNrX2RldmljZV9kZXRhaWxzKTsKKwlwbWQtPmRldGFpbHNfaW5mby52YWx1ZV90eXBlLmluYyA9IE5VTEw7CisJcG1kLT5kZXRhaWxzX2luZm8udmFsdWVfdHlwZS5kZWMgPSBOVUxMOworCXBtZC0+ZGV0YWlsc19pbmZvLnZhbHVlX3R5cGUuZXF1YWwgPSBOVUxMOworCisJcG1kLT5yb290ID0gMDsKKworCWluaXRfcndzZW0oJnBtZC0+cm9vdF9sb2NrKTsKKwlwbWQtPnRpbWUgPSAwOworCXBtZC0+bmVlZF9jb21taXQgPSAwOworCXBtZC0+ZGV0YWlsc19yb290ID0gMDsKKwlwbWQtPnRyYW5zX2lkID0gMDsKKwlwbWQtPmZsYWdzID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmcG1kLT50aGluX2RldmljZXMpOworCisJcmV0dXJuIDA7CisKK2JhZF9kYXRhX3NtOgorCWRtX3NtX2Rlc3Ryb3koZGF0YV9zbSk7CitiYWQ6CisJZG1fdG1fZGVzdHJveSh0bSk7CisJZG1fc21fZGVzdHJveShzbSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfX2JlZ2luX3RyYW5zYWN0aW9uKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpCit7CisJaW50IHI7CisJdTMyIGZlYXR1cmVzOworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlcjsKKwlzdHJ1Y3QgZG1fYmxvY2sgKnNibG9jazsKKworCS8qCisJICogX19tYXliZV9jb21taXRfdHJhbnNhY3Rpb24oKSByZXNldHMgdGhlc2UKKwkgKi8KKwlXQVJOX09OKHBtZC0+bmVlZF9jb21taXQpOworCisJLyoKKwkgKiBXZSByZS1yZWFkIHRoZSBzdXBlcmJsb2NrIGV2ZXJ5IHRpbWUuICBTaG91bGRuJ3QgbmVlZCB0byBkbyB0aGlzCisJICogcmVhbGx5LgorCSAqLworCXIgPSBkbV9ibV9yZWFkX2xvY2socG1kLT5ibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJICAgICZzYl92YWxpZGF0b3IsICZzYmxvY2spOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRpc2tfc3VwZXIgPSBkbV9ibG9ja19kYXRhKHNibG9jayk7CisJcG1kLT50aW1lID0gbGUzMl90b19jcHUoZGlza19zdXBlci0+dGltZSk7CisJcG1kLT5yb290ID0gbGU2NF90b19jcHUoZGlza19zdXBlci0+ZGF0YV9tYXBwaW5nX3Jvb3QpOworCXBtZC0+ZGV0YWlsc19yb290ID0gbGU2NF90b19jcHUoZGlza19zdXBlci0+ZGV2aWNlX2RldGFpbHNfcm9vdCk7CisJcG1kLT50cmFuc19pZCA9IGxlNjRfdG9fY3B1KGRpc2tfc3VwZXItPnRyYW5zX2lkKTsKKwlwbWQtPmZsYWdzID0gbGUzMl90b19jcHUoZGlza19zdXBlci0+ZmxhZ3MpOworCXBtZC0+ZGF0YV9ibG9ja19zaXplID0gbGUzMl90b19jcHUoZGlza19zdXBlci0+ZGF0YV9ibG9ja19zaXplKTsKKworCWZlYXR1cmVzID0gbGUzMl90b19jcHUoZGlza19zdXBlci0+aW5jb21wYXRfZmxhZ3MpICYgflRISU5fRkVBVFVSRV9JTkNPTVBBVF9TVVBQOworCWlmIChmZWF0dXJlcykgeworCQlETUVSUigiY291bGQgbm90IGFjY2VzcyBtZXRhZGF0YSBkdWUgdG8gIgorCQkgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCVseCkuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpZmVhdHVyZXMpOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgcmVhZC1vbmx5IG1ldGFkYXRhIHRvIHNraXAgdGhlIGZvbGxvd2luZyBSRFdSIGNoZWNrcy4KKwkgKi8KKwlpZiAoZ2V0X2Rpc2tfcm8ocG1kLT5iZGV2LT5iZF9kaXNrKSkKKwkJZ290byBvdXQ7CisKKwlmZWF0dXJlcyA9IGxlMzJfdG9fY3B1KGRpc2tfc3VwZXItPmNvbXBhdF9yb19mbGFncykgJiB+VEhJTl9GRUFUVVJFX0NPTVBBVF9ST19TVVBQOworCWlmIChmZWF0dXJlcykgeworCQlETUVSUigiY291bGQgbm90IGFjY2VzcyBtZXRhZGF0YSBSRFdSIGR1ZSB0byAiCisJCSAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJWx4KS4iLAorCQkgICAgICAodW5zaWduZWQgbG9uZylmZWF0dXJlcyk7CisJCXIgPSAtRUlOVkFMOworCX0KKworb3V0OgorCWRtX2JtX3VubG9jayhzYmxvY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fd3JpdGVfY2hhbmdlZF9kZXRhaWxzKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpCit7CisJaW50IHI7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgKnRtcDsKKwlzdHJ1Y3QgZGlza19kZXZpY2VfZGV0YWlscyBkZXRhaWxzOworCXVpbnQ2NF90IGtleTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0ZCwgdG1wLCAmcG1kLT50aGluX2RldmljZXMsIGxpc3QpIHsKKwkJaWYgKCF0ZC0+Y2hhbmdlZCkKKwkJCWNvbnRpbnVlOworCisJCWtleSA9IHRkLT5pZDsKKworCQlkZXRhaWxzLm1hcHBlZF9ibG9ja3MgPSBjcHVfdG9fbGU2NCh0ZC0+bWFwcGVkX2Jsb2Nrcyk7CisJCWRldGFpbHMudHJhbnNhY3Rpb25faWQgPSBjcHVfdG9fbGU2NCh0ZC0+dHJhbnNhY3Rpb25faWQpOworCQlkZXRhaWxzLmNyZWF0aW9uX3RpbWUgPSBjcHVfdG9fbGUzMih0ZC0+Y3JlYXRpb25fdGltZSk7CisJCWRldGFpbHMuc25hcHNob3R0ZWRfdGltZSA9IGNwdV90b19sZTMyKHRkLT5zbmFwc2hvdHRlZF90aW1lKTsKKwkJX19kbV9ibGVzc19mb3JfZGlzaygmZGV0YWlscyk7CisKKwkJciA9IGRtX2J0cmVlX2luc2VydCgmcG1kLT5kZXRhaWxzX2luZm8sIHBtZC0+ZGV0YWlsc19yb290LAorCQkJCSAgICAma2V5LCAmZGV0YWlscywgJnBtZC0+ZGV0YWlsc19yb290KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlpZiAodGQtPm9wZW5fY291bnQpCisJCQl0ZC0+Y2hhbmdlZCA9IDA7CisJCWVsc2UgeworCQkJbGlzdF9kZWwoJnRkLT5saXN0KTsKKwkJCWtmcmVlKHRkKTsKKwkJfQorCisJCXBtZC0+bmVlZF9jb21taXQgPSAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fY29tbWl0X3RyYW5zYWN0aW9uKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpCit7CisJLyoKKwkgKiBGSVhNRTogQXNzb2NpYXRlZCBwb29sIHNob3VsZCBiZSBtYWRlIHJlYWQtb25seSBvbiBmYWlsdXJlLgorCSAqLworCWludCByOworCXNpemVfdCBtZXRhZGF0YV9sZW4sIGRhdGFfbGVuOworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlcjsKKwlzdHJ1Y3QgZG1fYmxvY2sgKnNibG9jazsKKworCS8qCisJICogV2UgbmVlZCB0byBrbm93IGlmIHRoZSB0aGluX2Rpc2tfc3VwZXJibG9jayBleGNlZWRzIGEgNTEyLWJ5dGUgc2VjdG9yLgorCSAqLworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHRoaW5fZGlza19zdXBlcmJsb2NrKSA+IDUxMik7CisKKwlyID0gX193cml0ZV9jaGFuZ2VkX2RldGFpbHMocG1kKTsKKwlpZiAociA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKCFwbWQtPm5lZWRfY29tbWl0KQorCQlnb3RvIG91dDsKKworCXIgPSBkbV9zbV9jb21taXQocG1kLT5kYXRhX3NtKTsKKwlpZiAociA8IDApCisJCWdvdG8gb3V0OworCisJciA9IGRtX3RtX3ByZV9jb21taXQocG1kLT50bSk7CisJaWYgKHIgPCAwKQorCQlnb3RvIG91dDsKKworCXIgPSBkbV9zbV9yb290X3NpemUocG1kLT5tZXRhZGF0YV9zbSwgJm1ldGFkYXRhX2xlbik7CisJaWYgKHIgPCAwKQorCQlnb3RvIG91dDsKKworCXIgPSBkbV9zbV9yb290X3NpemUocG1kLT5tZXRhZGF0YV9zbSwgJmRhdGFfbGVuKTsKKwlpZiAociA8IDApCisJCWdvdG8gb3V0OworCisJciA9IGRtX2JtX3dyaXRlX2xvY2socG1kLT5ibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJICAgICAmc2JfdmFsaWRhdG9yLCAmc2Jsb2NrKTsKKwlpZiAocikKKwkJZ290byBvdXQ7CisKKwlkaXNrX3N1cGVyID0gZG1fYmxvY2tfZGF0YShzYmxvY2spOworCWRpc2tfc3VwZXItPnRpbWUgPSBjcHVfdG9fbGUzMihwbWQtPnRpbWUpOworCWRpc2tfc3VwZXItPmRhdGFfbWFwcGluZ19yb290ID0gY3B1X3RvX2xlNjQocG1kLT5yb290KTsKKwlkaXNrX3N1cGVyLT5kZXZpY2VfZGV0YWlsc19yb290ID0gY3B1X3RvX2xlNjQocG1kLT5kZXRhaWxzX3Jvb3QpOworCWRpc2tfc3VwZXItPnRyYW5zX2lkID0gY3B1X3RvX2xlNjQocG1kLT50cmFuc19pZCk7CisJZGlza19zdXBlci0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihwbWQtPmZsYWdzKTsKKworCXIgPSBkbV9zbV9jb3B5X3Jvb3QocG1kLT5tZXRhZGF0YV9zbSwgJmRpc2tfc3VwZXItPm1ldGFkYXRhX3NwYWNlX21hcF9yb290LAorCQkJICAgIG1ldGFkYXRhX2xlbik7CisJaWYgKHIgPCAwKQorCQlnb3RvIG91dF9sb2NrZWQ7CisKKwlyID0gZG1fc21fY29weV9yb290KHBtZC0+ZGF0YV9zbSwgJmRpc2tfc3VwZXItPmRhdGFfc3BhY2VfbWFwX3Jvb3QsCisJCQkgICAgZGF0YV9sZW4pOworCWlmIChyIDwgMCkKKwkJZ290byBvdXRfbG9ja2VkOworCisJciA9IGRtX3RtX2NvbW1pdChwbWQtPnRtLCBzYmxvY2spOworCWlmICghcikKKwkJcG1kLT5uZWVkX2NvbW1pdCA9IDA7CisKK291dDoKKwlyZXR1cm4gcjsKKworb3V0X2xvY2tlZDoKKwlkbV9ibV91bmxvY2soc2Jsb2NrKTsKKwlyZXR1cm4gcjsKK30KKworc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKmRtX3Bvb2xfbWV0YWRhdGFfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJCQkgICAgICAgc2VjdG9yX3QgZGF0YV9ibG9ja19zaXplKQoreworCWludCByOworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlcjsKKwlzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kOworCXNlY3Rvcl90IGJkZXZfc2l6ZSA9IGlfc2l6ZV9yZWFkKGJkZXYtPmJkX2lub2RlKSA+PiBTRUNUT1JfU0hJRlQ7CisJc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtOworCWludCBjcmVhdGU7CisJc3RydWN0IGRtX2Jsb2NrICpzYmxvY2s7CisKKwlwbWQgPSBrbWFsbG9jKHNpemVvZigqcG1kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbWQpIHsKKwkJRE1FUlIoImNvdWxkIG5vdCBhbGxvY2F0ZSBtZXRhZGF0YSBzdHJ1Y3QiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJLyoKKwkgKiBNYXggaGV4IGxvY2tzOgorCSAqICAzIGZvciBidHJlZSBpbnNlcnQgKworCSAqICAyIGZvciBidHJlZSBsb29rdXAgdXNlZCB3aXRoaW4gc3BhY2UgbWFwCisJICovCisJYm0gPSBkbV9ibG9ja19tYW5hZ2VyX2NyZWF0ZShiZGV2LCBUSElOX01FVEFEQVRBX0JMT0NLX1NJWkUsCisJCQkJICAgICBUSElOX01FVEFEQVRBX0NBQ0hFX1NJWkUsIDUpOworCWlmICghYm0pIHsKKwkJRE1FUlIoImNvdWxkIG5vdCBjcmVhdGUgYmxvY2sgbWFuYWdlciIpOworCQlrZnJlZShwbWQpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyID0gc3VwZXJibG9ja19hbGxfemVyb2VzKGJtLCAmY3JlYXRlKTsKKwlpZiAocikgeworCQlkbV9ibG9ja19tYW5hZ2VyX2Rlc3Ryb3koYm0pOworCQlrZnJlZShwbWQpOworCQlyZXR1cm4gRVJSX1BUUihyKTsKKwl9CisKKworCXIgPSBpbml0X3BtZChwbWQsIGJtLCAwLCBjcmVhdGUpOworCWlmIChyKSB7CisJCWRtX2Jsb2NrX21hbmFnZXJfZGVzdHJveShibSk7CisJCWtmcmVlKHBtZCk7CisJCXJldHVybiBFUlJfUFRSKHIpOworCX0KKwlwbWQtPmJkZXYgPSBiZGV2OworCisJaWYgKCFjcmVhdGUpIHsKKwkJciA9IF9fYmVnaW5fdHJhbnNhY3Rpb24ocG1kKTsKKwkJaWYgKHIgPCAwKQorCQkJZ290byBiYWQ7CisJCXJldHVybiBwbWQ7CisJfQorCisJLyoKKwkgKiBDcmVhdGUuCisJICovCisJciA9IGRtX2JtX3dyaXRlX2xvY2socG1kLT5ibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJICAgICAmc2JfdmFsaWRhdG9yLCAmc2Jsb2NrKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CisKKwlkaXNrX3N1cGVyID0gZG1fYmxvY2tfZGF0YShzYmxvY2spOworCWRpc2tfc3VwZXItPm1hZ2ljID0gY3B1X3RvX2xlNjQoVEhJTl9TVVBFUkJMT0NLX01BR0lDKTsKKwlkaXNrX3N1cGVyLT52ZXJzaW9uID0gY3B1X3RvX2xlMzIoVEhJTl9WRVJTSU9OKTsKKwlkaXNrX3N1cGVyLT50aW1lID0gMDsKKwlkaXNrX3N1cGVyLT5tZXRhZGF0YV9ibG9ja19zaXplID0gY3B1X3RvX2xlMzIoVEhJTl9NRVRBREFUQV9CTE9DS19TSVpFID4+IFNFQ1RPUl9TSElGVCk7CisJZGlza19zdXBlci0+bWV0YWRhdGFfbnJfYmxvY2tzID0gY3B1X3RvX2xlNjQoYmRldl9zaXplID4+IFNFQ1RPUl9UT19CTE9DS19TSElGVCk7CisJZGlza19zdXBlci0+ZGF0YV9ibG9ja19zaXplID0gY3B1X3RvX2xlMzIoZGF0YV9ibG9ja19zaXplKTsKKworCXIgPSBkbV9ibV91bmxvY2soc2Jsb2NrKTsKKwlpZiAociA8IDApCisJCWdvdG8gYmFkOworCisJciA9IGRtX2J0cmVlX2VtcHR5KCZwbWQtPmluZm8sICZwbWQtPnJvb3QpOworCWlmIChyIDwgMCkKKwkJZ290byBiYWQ7CisKKwlyID0gZG1fYnRyZWVfZW1wdHkoJnBtZC0+ZGV0YWlsc19pbmZvLCAmcG1kLT5kZXRhaWxzX3Jvb3QpOworCWlmIChyIDwgMCkgeworCQlETUVSUigiY291bGRuJ3QgY3JlYXRlIGRldmljZXMgcm9vdCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlwbWQtPmZsYWdzID0gMDsKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKwlyID0gZG1fcG9vbF9jb21taXRfbWV0YWRhdGEocG1kKTsKKwlpZiAociA8IDApIHsKKwkJRE1FUlIoIiVzOiBkbV9wb29sX2NvbW1pdF9tZXRhZGF0YSgpIGZhaWxlZCwgZXJyb3IgPSAlZCIsCisJCSAgICAgIF9fZnVuY19fLCByKTsKKwkJZ290byBiYWQ7CisJfQorCisJcmV0dXJuIHBtZDsKKworYmFkOgorCWlmIChkbV9wb29sX21ldGFkYXRhX2Nsb3NlKHBtZCkgPCAwKQorCQlETVdBUk4oIiVzOiBkbV9wb29sX21ldGFkYXRhX2Nsb3NlKCkgZmFpbGVkLiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gRVJSX1BUUihyKTsKK30KKworaW50IGRtX3Bvb2xfbWV0YWRhdGFfY2xvc2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBvcGVuX2RldmljZXMgPSAwOworCXN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsICp0bXA7CisKKwlkb3duX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGQsIHRtcCwgJnBtZC0+dGhpbl9kZXZpY2VzLCBsaXN0KSB7CisJCWlmICh0ZC0+b3Blbl9jb3VudCkKKwkJCW9wZW5fZGV2aWNlcysrOworCQllbHNlIHsKKwkJCWxpc3RfZGVsKCZ0ZC0+bGlzdCk7CisJCQlrZnJlZSh0ZCk7CisJCX0KKwl9CisJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJaWYgKG9wZW5fZGV2aWNlcykgeworCQlETUVSUigiYXR0ZW1wdCB0byBjbG9zZSBwbWQgd2hlbiAldSBkZXZpY2UocykgYXJlIHN0aWxsIG9wZW4iLAorCQkgICAgICAgb3Blbl9kZXZpY2VzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyID0gX19jb21taXRfdHJhbnNhY3Rpb24ocG1kKTsKKwlpZiAociA8IDApCisJCURNV0FSTigiJXM6IF9fY29tbWl0X3RyYW5zYWN0aW9uKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwKKwkJICAgICAgIF9fZnVuY19fLCByKTsKKworCWRtX3RtX2Rlc3Ryb3kocG1kLT50bSk7CisJZG1fdG1fZGVzdHJveShwbWQtPm5iX3RtKTsKKwlkbV9ibG9ja19tYW5hZ2VyX2Rlc3Ryb3kocG1kLT5ibSk7CisJZG1fc21fZGVzdHJveShwbWQtPm1ldGFkYXRhX3NtKTsKKwlkbV9zbV9kZXN0cm95KHBtZC0+ZGF0YV9zbSk7CisJa2ZyZWUocG1kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fb3Blbl9kZXZpY2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJCSBkbV90aGluX2lkIGRldiwgaW50IGNyZWF0ZSwKKwkJCSBzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKip0ZCkKK3sKKwlpbnQgciwgY2hhbmdlZCA9IDA7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZDI7CisJdWludDY0X3Qga2V5ID0gZGV2OworCXN0cnVjdCBkaXNrX2RldmljZV9kZXRhaWxzIGRldGFpbHNfbGU7CisKKwkvKgorCSAqIENoZWNrIHRoZSBkZXZpY2UgaXNuJ3QgYWxyZWFkeSBvcGVuLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodGQyLCAmcG1kLT50aGluX2RldmljZXMsIGxpc3QpCisJCWlmICh0ZDItPmlkID09IGRldikgeworCQkJdGQyLT5vcGVuX2NvdW50Kys7CisJCQkqdGQgPSB0ZDI7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJLyoKKwkgKiBDaGVjayB0aGUgZGV2aWNlIGV4aXN0cy4KKwkgKi8KKwlyID0gZG1fYnRyZWVfbG9va3VwKCZwbWQtPmRldGFpbHNfaW5mbywgcG1kLT5kZXRhaWxzX3Jvb3QsCisJCQkgICAgJmtleSwgJmRldGFpbHNfbGUpOworCWlmIChyKSB7CisJCWlmIChyICE9IC1FTk9EQVRBIHx8ICFjcmVhdGUpCisJCQlyZXR1cm4gcjsKKworCQljaGFuZ2VkID0gMTsKKwkJZGV0YWlsc19sZS5tYXBwZWRfYmxvY2tzID0gMDsKKwkJZGV0YWlsc19sZS50cmFuc2FjdGlvbl9pZCA9IGNwdV90b19sZTY0KHBtZC0+dHJhbnNfaWQpOworCQlkZXRhaWxzX2xlLmNyZWF0aW9uX3RpbWUgPSBjcHVfdG9fbGUzMihwbWQtPnRpbWUpOworCQlkZXRhaWxzX2xlLnNuYXBzaG90dGVkX3RpbWUgPSBjcHVfdG9fbGUzMihwbWQtPnRpbWUpOworCX0KKworCSp0ZCA9IGttYWxsb2Moc2l6ZW9mKCoqdGQpLCBHRlBfTk9JTyk7CisJaWYgKCEqdGQpCisJCXJldHVybiAtRU5PTUVNOworCisJKCp0ZCktPnBtZCA9IHBtZDsKKwkoKnRkKS0+aWQgPSBkZXY7CisJKCp0ZCktPm9wZW5fY291bnQgPSAxOworCSgqdGQpLT5jaGFuZ2VkID0gY2hhbmdlZDsKKwkoKnRkKS0+bWFwcGVkX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KGRldGFpbHNfbGUubWFwcGVkX2Jsb2Nrcyk7CisJKCp0ZCktPnRyYW5zYWN0aW9uX2lkID0gbGU2NF90b19jcHUoZGV0YWlsc19sZS50cmFuc2FjdGlvbl9pZCk7CisJKCp0ZCktPmNyZWF0aW9uX3RpbWUgPSBsZTMyX3RvX2NwdShkZXRhaWxzX2xlLmNyZWF0aW9uX3RpbWUpOworCSgqdGQpLT5zbmFwc2hvdHRlZF90aW1lID0gbGUzMl90b19jcHUoZGV0YWlsc19sZS5zbmFwc2hvdHRlZF90aW1lKTsKKworCWxpc3RfYWRkKCYoKnRkKS0+bGlzdCwgJnBtZC0+dGhpbl9kZXZpY2VzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2Nsb3NlX2RldmljZShzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkKQoreworCS0tdGQtPm9wZW5fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgX19jcmVhdGVfdGhpbihzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJIGRtX3RoaW5faWQgZGV2KQoreworCWludCByOworCWRtX2Jsb2NrX3QgZGV2X3Jvb3Q7CisJdWludDY0X3Qga2V5ID0gZGV2OworCXN0cnVjdCBkaXNrX2RldmljZV9kZXRhaWxzIGRldGFpbHNfbGU7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZDsKKwlfX2xlNjQgdmFsdWU7CisKKwlyID0gZG1fYnRyZWVfbG9va3VwKCZwbWQtPmRldGFpbHNfaW5mbywgcG1kLT5kZXRhaWxzX3Jvb3QsCisJCQkgICAgJmtleSwgJmRldGFpbHNfbGUpOworCWlmICghcikKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKgorCSAqIENyZWF0ZSBhbiBlbXB0eSBidHJlZSBmb3IgdGhlIG1hcHBpbmdzLgorCSAqLworCXIgPSBkbV9idHJlZV9lbXB0eSgmcG1kLT5ibF9pbmZvLCAmZGV2X3Jvb3QpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCS8qCisJICogSW5zZXJ0IGl0IGludG8gdGhlIG1haW4gbWFwcGluZyB0cmVlLgorCSAqLworCXZhbHVlID0gY3B1X3RvX2xlNjQoZGV2X3Jvb3QpOworCV9fZG1fYmxlc3NfZm9yX2Rpc2soJnZhbHVlKTsKKwlyID0gZG1fYnRyZWVfaW5zZXJ0KCZwbWQtPnRsX2luZm8sIHBtZC0+cm9vdCwgJmtleSwgJnZhbHVlLCAmcG1kLT5yb290KTsKKwlpZiAocikgeworCQlkbV9idHJlZV9kZWwoJnBtZC0+YmxfaW5mbywgZGV2X3Jvb3QpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gX19vcGVuX2RldmljZShwbWQsIGRldiwgMSwgJnRkKTsKKwlpZiAocikgeworCQlfX2Nsb3NlX2RldmljZSh0ZCk7CisJCWRtX2J0cmVlX3JlbW92ZSgmcG1kLT50bF9pbmZvLCBwbWQtPnJvb3QsICZrZXksICZwbWQtPnJvb3QpOworCQlkbV9idHJlZV9kZWwoJnBtZC0+YmxfaW5mbywgZGV2X3Jvb3QpOworCQlyZXR1cm4gcjsKKwl9CisJdGQtPmNoYW5nZWQgPSAxOworCV9fY2xvc2VfZGV2aWNlKHRkKTsKKworCXJldHVybiByOworfQorCitpbnQgZG1fcG9vbF9jcmVhdGVfdGhpbihzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBkbV90aGluX2lkIGRldikKK3sKKwlpbnQgcjsKKworCWRvd25fd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKwlyID0gX19jcmVhdGVfdGhpbihwbWQsIGRldik7CisJdXBfd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fc2V0X3NuYXBzaG90X2RldGFpbHMoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJCQkgIHN0cnVjdCBkbV90aGluX2RldmljZSAqc25hcCwKKwkJCQkgIGRtX3RoaW5faWQgb3JpZ2luLCB1aW50MzJfdCB0aW1lKQoreworCWludCByOworCXN0cnVjdCBkbV90aGluX2RldmljZSAqdGQ7CisKKwlyID0gX19vcGVuX2RldmljZShwbWQsIG9yaWdpbiwgMCwgJnRkKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwl0ZC0+Y2hhbmdlZCA9IDE7CisJdGQtPnNuYXBzaG90dGVkX3RpbWUgPSB0aW1lOworCisJc25hcC0+bWFwcGVkX2Jsb2NrcyA9IHRkLT5tYXBwZWRfYmxvY2tzOworCXNuYXAtPnNuYXBzaG90dGVkX3RpbWUgPSB0aW1lOworCV9fY2xvc2VfZGV2aWNlKHRkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fY3JlYXRlX3NuYXAoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJCSBkbV90aGluX2lkIGRldiwgZG1fdGhpbl9pZCBvcmlnaW4pCit7CisJaW50IHI7CisJZG1fYmxvY2tfdCBvcmlnaW5fcm9vdDsKKwl1aW50NjRfdCBrZXkgPSBvcmlnaW4sIGRldl9rZXkgPSBkZXY7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZDsKKwlzdHJ1Y3QgZGlza19kZXZpY2VfZGV0YWlscyBkZXRhaWxzX2xlOworCV9fbGU2NCB2YWx1ZTsKKworCS8qIGNoZWNrIHRoaXMgZGV2aWNlIGlzIHVudXNlZCAqLworCXIgPSBkbV9idHJlZV9sb29rdXAoJnBtZC0+ZGV0YWlsc19pbmZvLCBwbWQtPmRldGFpbHNfcm9vdCwKKwkJCSAgICAmZGV2X2tleSwgJmRldGFpbHNfbGUpOworCWlmICghcikKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKiBmaW5kIHRoZSBtYXBwaW5nIHRyZWUgZm9yIHRoZSBvcmlnaW4gKi8KKwlyID0gZG1fYnRyZWVfbG9va3VwKCZwbWQtPnRsX2luZm8sIHBtZC0+cm9vdCwgJmtleSwgJnZhbHVlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJb3JpZ2luX3Jvb3QgPSBsZTY0X3RvX2NwdSh2YWx1ZSk7CisKKwkvKiBjbG9uZSB0aGUgb3JpZ2luLCBhbiBpbmMgd2lsbCBkbyAqLworCWRtX3RtX2luYyhwbWQtPnRtLCBvcmlnaW5fcm9vdCk7CisKKwkvKiBpbnNlcnQgaW50byB0aGUgbWFpbiBtYXBwaW5nIHRyZWUgKi8KKwl2YWx1ZSA9IGNwdV90b19sZTY0KG9yaWdpbl9yb290KTsKKwlfX2RtX2JsZXNzX2Zvcl9kaXNrKCZ2YWx1ZSk7CisJa2V5ID0gZGV2OworCXIgPSBkbV9idHJlZV9pbnNlcnQoJnBtZC0+dGxfaW5mbywgcG1kLT5yb290LCAma2V5LCAmdmFsdWUsICZwbWQtPnJvb3QpOworCWlmIChyKSB7CisJCWRtX3RtX2RlYyhwbWQtPnRtLCBvcmlnaW5fcm9vdCk7CisJCXJldHVybiByOworCX0KKworCXBtZC0+dGltZSsrOworCisJciA9IF9fb3Blbl9kZXZpY2UocG1kLCBkZXYsIDEsICZ0ZCk7CisJaWYgKHIpCisJCWdvdG8gYmFkOworCisJciA9IF9fc2V0X3NuYXBzaG90X2RldGFpbHMocG1kLCB0ZCwgb3JpZ2luLCBwbWQtPnRpbWUpOworCWlmIChyKQorCQlnb3RvIGJhZDsKKworCV9fY2xvc2VfZGV2aWNlKHRkKTsKKwlyZXR1cm4gMDsKKworYmFkOgorCV9fY2xvc2VfZGV2aWNlKHRkKTsKKwlkbV9idHJlZV9yZW1vdmUoJnBtZC0+dGxfaW5mbywgcG1kLT5yb290LCAma2V5LCAmcG1kLT5yb290KTsKKwlkbV9idHJlZV9yZW1vdmUoJnBtZC0+ZGV0YWlsc19pbmZvLCBwbWQtPmRldGFpbHNfcm9vdCwKKwkJCSZrZXksICZwbWQtPmRldGFpbHNfcm9vdCk7CisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX2NyZWF0ZV9zbmFwKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJIGRtX3RoaW5faWQgZGV2LAorCQkJCSBkbV90aGluX2lkIG9yaWdpbikKK3sKKwlpbnQgcjsKKworCWRvd25fd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKwlyID0gX19jcmVhdGVfc25hcChwbWQsIGRldiwgb3JpZ2luKTsKKwl1cF93cml0ZSgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX19kZWxldGVfZGV2aWNlKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX3RoaW5faWQgZGV2KQoreworCWludCByOworCXVpbnQ2NF90IGtleSA9IGRldjsKKwlzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkOworCisJLyogVE9ETzogZmFpbHVyZSBzaG91bGQgbWFyayB0aGUgdHJhbnNhY3Rpb24gaW52YWxpZCAqLworCXIgPSBfX29wZW5fZGV2aWNlKHBtZCwgZGV2LCAwLCAmdGQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmICh0ZC0+b3Blbl9jb3VudCA+IDEpIHsKKwkJX19jbG9zZV9kZXZpY2UodGQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWxpc3RfZGVsKCZ0ZC0+bGlzdCk7CisJa2ZyZWUodGQpOworCXIgPSBkbV9idHJlZV9yZW1vdmUoJnBtZC0+ZGV0YWlsc19pbmZvLCBwbWQtPmRldGFpbHNfcm9vdCwKKwkJCSAgICAma2V5LCAmcG1kLT5kZXRhaWxzX3Jvb3QpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkbV9idHJlZV9yZW1vdmUoJnBtZC0+dGxfaW5mbywgcG1kLT5yb290LCAma2V5LCAmcG1kLT5yb290KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgZG1fcG9vbF9kZWxldGVfdGhpbl9kZXZpY2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJCSAgICAgICBkbV90aGluX2lkIGRldikKK3sKKwlpbnQgcjsKKworCWRvd25fd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKwlyID0gX19kZWxldGVfZGV2aWNlKHBtZCwgZGV2KTsKKwl1cF93cml0ZSgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX3NldF9tZXRhZGF0YV90cmFuc2FjdGlvbl9pZChzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCQl1aW50NjRfdCBjdXJyZW50X2lkLAorCQkJCQl1aW50NjRfdCBuZXdfaWQpCit7CisJZG93bl93cml0ZSgmcG1kLT5yb290X2xvY2spOworCWlmIChwbWQtPnRyYW5zX2lkICE9IGN1cnJlbnRfaWQpIHsKKwkJdXBfd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKwkJRE1FUlIoIm1pc21hdGNoZWQgdHJhbnNhY3Rpb24gaWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcG1kLT50cmFuc19pZCA9IG5ld19pZDsKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKwl1cF93cml0ZSgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbV9wb29sX2dldF9tZXRhZGF0YV90cmFuc2FjdGlvbl9pZChzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCQl1aW50NjRfdCAqcmVzdWx0KQoreworCWRvd25fcmVhZCgmcG1kLT5yb290X2xvY2spOworCSpyZXN1bHQgPSBwbWQtPnRyYW5zX2lkOworCXVwX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZ2V0X2hlbGRfbWV0YWRhdGFfcm9vdChzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCSAgICBkbV9ibG9ja190ICpyZXN1bHQpCit7CisJaW50IHI7CisJc3RydWN0IHRoaW5fZGlza19zdXBlcmJsb2NrICpkaXNrX3N1cGVyOworCXN0cnVjdCBkbV9ibG9jayAqc2Jsb2NrOworCisJciA9IGRtX2JtX3dyaXRlX2xvY2socG1kLT5ibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJICAgICAmc2JfdmFsaWRhdG9yLCAmc2Jsb2NrKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlkaXNrX3N1cGVyID0gZG1fYmxvY2tfZGF0YShzYmxvY2spOworCSpyZXN1bHQgPSBsZTY0X3RvX2NwdShkaXNrX3N1cGVyLT5oZWxkX3Jvb3QpOworCisJcmV0dXJuIGRtX2JtX3VubG9jayhzYmxvY2spOworfQorCitpbnQgZG1fcG9vbF9nZXRfaGVsZF9tZXRhZGF0YV9yb290KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJICAgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCisJZG93bl9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IF9fZ2V0X2hlbGRfbWV0YWRhdGFfcm9vdChwbWQsIHJlc3VsdCk7CisJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX29wZW5fdGhpbl9kZXZpY2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fdGhpbl9pZCBkZXYsCisJCQkgICAgIHN0cnVjdCBkbV90aGluX2RldmljZSAqKnRkKQoreworCWludCByOworCisJZG93bl93cml0ZSgmcG1kLT5yb290X2xvY2spOworCXIgPSBfX29wZW5fZGV2aWNlKHBtZCwgZGV2LCAwLCB0ZCk7CisJdXBfd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiByOworfQorCitpbnQgZG1fcG9vbF9jbG9zZV90aGluX2RldmljZShzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkKQoreworCWRvd25fd3JpdGUoJnRkLT5wbWQtPnJvb3RfbG9jayk7CisJX19jbG9zZV9kZXZpY2UodGQpOworCXVwX3dyaXRlKCZ0ZC0+cG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2RtX3RoaW5faWQgZG1fdGhpbl9kZXZfaWQoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCkKK3sKKwlyZXR1cm4gdGQtPmlkOworfQorCitzdGF0aWMgaW50IF9fc25hcHNob3R0ZWRfc2luY2Uoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgdWludDMyX3QgdGltZSkKK3sKKwlyZXR1cm4gdGQtPnNuYXBzaG90dGVkX3RpbWUgPiB0aW1lOworfQorCitpbnQgZG1fdGhpbl9maW5kX2Jsb2NrKHN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsIGRtX2Jsb2NrX3QgYmxvY2ssCisJCSAgICAgICBpbnQgY2FuX2Jsb2NrLCBzdHJ1Y3QgZG1fdGhpbl9sb29rdXBfcmVzdWx0ICpyZXN1bHQpCit7CisJaW50IHI7CisJdWludDY0X3QgYmxvY2tfdGltZSA9IDA7CisJX19sZTY0IHZhbHVlOworCXN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQgPSB0ZC0+cG1kOworCWRtX2Jsb2NrX3Qga2V5c1syXSA9IHsgdGQtPmlkLCBibG9jayB9OworCisJaWYgKGNhbl9ibG9jaykgeworCQlkb3duX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKwkJciA9IGRtX2J0cmVlX2xvb2t1cCgmcG1kLT5pbmZvLCBwbWQtPnJvb3QsIGtleXMsICZ2YWx1ZSk7CisJCWlmICghcikKKwkJCWJsb2NrX3RpbWUgPSBsZTY0X3RvX2NwdSh2YWx1ZSk7CisJCXVwX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKworCX0gZWxzZSBpZiAoZG93bl9yZWFkX3RyeWxvY2soJnBtZC0+cm9vdF9sb2NrKSkgeworCQlyID0gZG1fYnRyZWVfbG9va3VwKCZwbWQtPm5iX2luZm8sIHBtZC0+cm9vdCwga2V5cywgJnZhbHVlKTsKKwkJaWYgKCFyKQorCQkJYmxvY2tfdGltZSA9IGxlNjRfdG9fY3B1KHZhbHVlKTsKKwkJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJfSBlbHNlCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwlpZiAoIXIpIHsKKwkJZG1fYmxvY2tfdCBleGNlcHRpb25fYmxvY2s7CisJCXVpbnQzMl90IGV4Y2VwdGlvbl90aW1lOworCQl1bnBhY2tfYmxvY2tfdGltZShibG9ja190aW1lLCAmZXhjZXB0aW9uX2Jsb2NrLAorCQkJCSAgJmV4Y2VwdGlvbl90aW1lKTsKKwkJcmVzdWx0LT5ibG9jayA9IGV4Y2VwdGlvbl9ibG9jazsKKwkJcmVzdWx0LT5zaGFyZWQgPSBfX3NuYXBzaG90dGVkX3NpbmNlKHRkLCBleGNlcHRpb25fdGltZSk7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX19pbnNlcnQoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBibG9jaywKKwkJICAgIGRtX2Jsb2NrX3QgZGF0YV9ibG9jaykKK3sKKwlpbnQgciwgaW5zZXJ0ZWQ7CisJX19sZTY0IHZhbHVlOworCXN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQgPSB0ZC0+cG1kOworCWRtX2Jsb2NrX3Qga2V5c1syXSA9IHsgdGQtPmlkLCBibG9jayB9OworCisJcG1kLT5uZWVkX2NvbW1pdCA9IDE7CisJdmFsdWUgPSBjcHVfdG9fbGU2NChwYWNrX2Jsb2NrX3RpbWUoZGF0YV9ibG9jaywgcG1kLT50aW1lKSk7CisJX19kbV9ibGVzc19mb3JfZGlzaygmdmFsdWUpOworCisJciA9IGRtX2J0cmVlX2luc2VydF9ub3RpZnkoJnBtZC0+aW5mbywgcG1kLT5yb290LCBrZXlzLCAmdmFsdWUsCisJCQkJICAgJnBtZC0+cm9vdCwgJmluc2VydGVkKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoaW5zZXJ0ZWQpIHsKKwkJdGQtPm1hcHBlZF9ibG9ja3MrKzsKKwkJdGQtPmNoYW5nZWQgPSAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZG1fdGhpbl9pbnNlcnRfYmxvY2soc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBibG9jaywKKwkJCSBkbV9ibG9ja190IGRhdGFfYmxvY2spCit7CisJaW50IHI7CisKKwlkb3duX3dyaXRlKCZ0ZC0+cG1kLT5yb290X2xvY2spOworCXIgPSBfX2luc2VydCh0ZCwgYmxvY2ssIGRhdGFfYmxvY2spOworCXVwX3dyaXRlKCZ0ZC0+cG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX19yZW1vdmUoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBibG9jaykKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kID0gdGQtPnBtZDsKKwlkbV9ibG9ja190IGtleXNbMl0gPSB7IHRkLT5pZCwgYmxvY2sgfTsKKworCXIgPSBkbV9idHJlZV9yZW1vdmUoJnBtZC0+aW5mbywgcG1kLT5yb290LCBrZXlzLCAmcG1kLT5yb290KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgZG1fdGhpbl9yZW1vdmVfYmxvY2soc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBibG9jaykKK3sKKwlpbnQgcjsKKworCWRvd25fd3JpdGUoJnRkLT5wbWQtPnJvb3RfbG9jayk7CisJciA9IF9fcmVtb3ZlKHRkLCBibG9jayk7CisJdXBfd3JpdGUoJnRkLT5wbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX3Bvb2xfYWxsb2NfZGF0YV9ibG9jayhzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBkbV9ibG9ja190ICpyZXN1bHQpCit7CisJaW50IHI7CisKKwlkb3duX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyID0gZG1fc21fbmV3X2Jsb2NrKHBtZC0+ZGF0YV9zbSwgcmVzdWx0KTsKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKworCXVwX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpCit7CisJaW50IHI7CisKKwlkb3duX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyID0gX19jb21taXRfdHJhbnNhY3Rpb24ocG1kKTsKKwlpZiAociA8PSAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogT3BlbiB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KKwkgKi8KKwlyID0gX19iZWdpbl90cmFuc2FjdGlvbihwbWQpOworb3V0OgorCXVwX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX2dldF9mcmVlX2Jsb2NrX2NvdW50KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX2Jsb2NrX3QgKnJlc3VsdCkKK3sKKwlpbnQgcjsKKworCWRvd25fcmVhZCgmcG1kLT5yb290X2xvY2spOworCXIgPSBkbV9zbV9nZXRfbnJfZnJlZShwbWQtPmRhdGFfc20sIHJlc3VsdCk7CisJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX2dldF9mcmVlX21ldGFkYXRhX2Jsb2NrX2NvdW50KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJCSAgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCisJZG93bl9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IGRtX3NtX2dldF9ucl9mcmVlKHBtZC0+bWV0YWRhdGFfc20sIHJlc3VsdCk7CisJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX2dldF9tZXRhZGF0YV9kZXZfc2l6ZShzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCSAgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCisJZG93bl9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IGRtX3NtX2dldF9ucl9ibG9ja3MocG1kLT5tZXRhZGF0YV9zbSwgcmVzdWx0KTsKKwl1cF9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX3Bvb2xfZ2V0X2RhdGFfYmxvY2tfc2l6ZShzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBzZWN0b3JfdCAqcmVzdWx0KQoreworCWRvd25fcmVhZCgmcG1kLT5yb290X2xvY2spOworCSpyZXN1bHQgPSBwbWQtPmRhdGFfYmxvY2tfc2l6ZTsKKwl1cF9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX3Bvb2xfZ2V0X2RhdGFfZGV2X3NpemUoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCisJZG93bl9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IGRtX3NtX2dldF9ucl9ibG9ja3MocG1kLT5kYXRhX3NtLCByZXN1bHQpOworCXVwX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiByOworfQorCitpbnQgZG1fdGhpbl9nZXRfbWFwcGVkX2NvdW50KHN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsIGRtX2Jsb2NrX3QgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kID0gdGQtPnBtZDsKKworCWRvd25fcmVhZCgmcG1kLT5yb290X2xvY2spOworCSpyZXN1bHQgPSB0ZC0+bWFwcGVkX2Jsb2NrczsKKwl1cF9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2hpZ2hlc3RfYmxvY2soc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCV9fbGU2NCB2YWx1ZV9sZTsKKwlkbV9ibG9ja190IHRoaW5fcm9vdDsKKwlzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kID0gdGQtPnBtZDsKKworCXIgPSBkbV9idHJlZV9sb29rdXAoJnBtZC0+dGxfaW5mbywgcG1kLT5yb290LCAmdGQtPmlkLCAmdmFsdWVfbGUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXRoaW5fcm9vdCA9IGxlNjRfdG9fY3B1KHZhbHVlX2xlKTsKKworCXJldHVybiBkbV9idHJlZV9maW5kX2hpZ2hlc3Rfa2V5KCZwbWQtPmJsX2luZm8sIHRoaW5fcm9vdCwgcmVzdWx0KTsKK30KKworaW50IGRtX3RoaW5fZ2V0X2hpZ2hlc3RfbWFwcGVkX2Jsb2NrKHN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsCisJCQkJICAgICBkbV9ibG9ja190ICpyZXN1bHQpCit7CisJaW50IHI7CisJc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCA9IHRkLT5wbWQ7CisKKwlkb3duX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKwlyID0gX19oaWdoZXN0X2Jsb2NrKHRkLCByZXN1bHQpOworCXVwX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fcmVzaXplX2RhdGFfZGV2KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX2Jsb2NrX3QgbmV3X2NvdW50KQoreworCWludCByOworCWRtX2Jsb2NrX3Qgb2xkX2NvdW50OworCisJciA9IGRtX3NtX2dldF9ucl9ibG9ja3MocG1kLT5kYXRhX3NtLCAmb2xkX2NvdW50KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAobmV3X2NvdW50ID09IG9sZF9jb3VudCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobmV3X2NvdW50IDwgb2xkX2NvdW50KSB7CisJCURNRVJSKCJjYW5ub3QgcmVkdWNlIHNpemUgb2YgZGF0YSBkZXZpY2UiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJciA9IGRtX3NtX2V4dGVuZChwbWQtPmRhdGFfc20sIG5ld19jb3VudCAtIG9sZF9jb3VudCk7CisJaWYgKCFyKQorCQlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKworCXJldHVybiByOworfQorCitpbnQgZG1fcG9vbF9yZXNpemVfZGF0YV9kZXYoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fYmxvY2tfdCBuZXdfY291bnQpCit7CisJaW50IHI7CisKKwlkb3duX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IF9fcmVzaXplX2RhdGFfZGV2KHBtZCwgbmV3X2NvdW50KTsKKwl1cF93cml0ZSgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRoaW4tbWV0YWRhdGEuaCBiL2RyaXZlcnMvbWQvZG0tdGhpbi1tZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWMxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL2RtLXRoaW4tbWV0YWRhdGEuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIERNX1RISU5fTUVUQURBVEFfSAorI2RlZmluZSBETV9USElOX01FVEFEQVRBX0gKKworI2luY2x1ZGUgInBlcnNpc3RlbnQtZGF0YS9kbS1ibG9jay1tYW5hZ2VyLmgiCisKKyNkZWZpbmUgVEhJTl9NRVRBREFUQV9CTE9DS19TSVpFIDQwOTYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGE7CitzdHJ1Y3QgZG1fdGhpbl9kZXZpY2U7CisKKy8qCisgKiBEZXZpY2UgaWRlbnRpZmllcgorICovCit0eXBlZGVmIHVpbnQ2NF90IGRtX3RoaW5faWQ7CisKKy8qCisgKiBSZW9wZW5zIG9yIGNyZWF0ZXMgYSBuZXcsIGVtcHR5IG1ldGFkYXRhIHZvbHVtZS4KKyAqLworc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKmRtX3Bvb2xfbWV0YWRhdGFfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJCQkgICAgICAgc2VjdG9yX3QgZGF0YV9ibG9ja19zaXplKTsKKworaW50IGRtX3Bvb2xfbWV0YWRhdGFfY2xvc2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCk7CisKKy8qCisgKiBDb21wYXQgZmVhdHVyZSBmbGFncy4gIEFueSBpbmNvbXBhdCBmbGFncyBiZXlvbmQgdGhlIG9uZXMKKyAqIHNwZWNpZmllZCBiZWxvdyB3aWxsIHByZXZlbnQgdXNlIG9mIHRoZSB0aGluIG1ldGFkYXRhLgorICovCisjZGVmaW5lIFRISU5fRkVBVFVSRV9DT01QQVRfU1VQUAkgIDBVTAorI2RlZmluZSBUSElOX0ZFQVRVUkVfQ09NUEFUX1JPX1NVUFAJICAwVUwKKyNkZWZpbmUgVEhJTl9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJICAwVUwKKworLyoKKyAqIERldmljZSBjcmVhdGlvbi9kZWxldGlvbi4KKyAqLworaW50IGRtX3Bvb2xfY3JlYXRlX3RoaW4oc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fdGhpbl9pZCBkZXYpOworCisvKgorICogQW4gaW50ZXJuYWwgc25hcHNob3QuCisgKgorICogWW91IGNhbiBvbmx5IHNuYXBzaG90IGEgcXVpZXNjZWQgb3JpZ2luIGkuZS4gb25lIHRoYXQgaXMgZWl0aGVyCisgKiBzdXNwZW5kZWQgb3Igbm90IGluc3RhbmNlZCBhdCBhbGwuCisgKi8KK2ludCBkbV9wb29sX2NyZWF0ZV9zbmFwKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX3RoaW5faWQgZGV2LAorCQkJZG1fdGhpbl9pZCBvcmlnaW4pOworCisvKgorICogRGVsZXRlcyBhIHZpcnR1YWwgZGV2aWNlIGZyb20gdGhlIG1ldGFkYXRhLiAgSXQgX2lzXyBzYWZlIHRvIGNhbGwgdGhpcworICogd2hlbiB0aGF0IGRldmljZSBpcyBvcGVuLiAgT3BlcmF0aW9ucyBvbiB0aGF0IGRldmljZSB3aWxsIGp1c3Qgc3RhcnQKKyAqIGZhaWxpbmcuICBZb3Ugc3RpbGwgbmVlZCB0byBjYWxsIGNsb3NlKCkgb24gdGhlIGRldmljZS4KKyAqLworaW50IGRtX3Bvb2xfZGVsZXRlX3RoaW5fZGV2aWNlKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkgICAgICAgZG1fdGhpbl9pZCBkZXYpOworCisvKgorICogQ29tbWl0cyBfYWxsXyBtZXRhZGF0YSBjaGFuZ2VzOiBkZXZpY2UgY3JlYXRpb24sIGRlbGV0aW9uLCBtYXBwaW5nCisgKiB1cGRhdGVzLgorICovCitpbnQgZG1fcG9vbF9jb21taXRfbWV0YWRhdGEoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCk7CisKKy8qCisgKiBTZXQvZ2V0IHVzZXJzcGFjZSB0cmFuc2FjdGlvbiBpZC4KKyAqLworaW50IGRtX3Bvb2xfc2V0X21ldGFkYXRhX3RyYW5zYWN0aW9uX2lkKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJCXVpbnQ2NF90IGN1cnJlbnRfaWQsCisJCQkJCXVpbnQ2NF90IG5ld19pZCk7CisKK2ludCBkbV9wb29sX2dldF9tZXRhZGF0YV90cmFuc2FjdGlvbl9pZChzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCQl1aW50NjRfdCAqcmVzdWx0KTsKKworLyoKKyAqIEhvbGQvZ2V0IHJvb3QgZm9yIHVzZXJzcGFjZSB0cmFuc2FjdGlvbi4KKyAqLworaW50IGRtX3Bvb2xfaG9sZF9tZXRhZGF0YV9yb290KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpOworCitpbnQgZG1fcG9vbF9nZXRfaGVsZF9tZXRhZGF0YV9yb290KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJICAgZG1fYmxvY2tfdCAqcmVzdWx0KTsKKworLyoKKyAqIEFjdGlvbnMgb24gYSBzaW5nbGUgdmlydHVhbCBkZXZpY2UuCisgKi8KKworLyoKKyAqIE9wZW5pbmcgdGhlIHNhbWUgZGV2aWNlIG1vcmUgdGhhbiBvbmNlIHdpbGwgZmFpbCB3aXRoIC1FQlVTWS4KKyAqLworaW50IGRtX3Bvb2xfb3Blbl90aGluX2RldmljZShzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBkbV90aGluX2lkIGRldiwKKwkJCSAgICAgc3RydWN0IGRtX3RoaW5fZGV2aWNlICoqdGQpOworCitpbnQgZG1fcG9vbF9jbG9zZV90aGluX2RldmljZShzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkKTsKKworZG1fdGhpbl9pZCBkbV90aGluX2Rldl9pZChzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkKTsKKworc3RydWN0IGRtX3RoaW5fbG9va3VwX3Jlc3VsdCB7CisJZG1fYmxvY2tfdCBibG9jazsKKwlpbnQgc2hhcmVkOworfTsKKworLyoKKyAqIFJldHVybnM6CisgKiAgIC1FV09VTERCTE9DSyBpZmYgQGNhbl9ibG9jayBpcyBzZXQgYW5kIHdvdWxkIGJsb2NrLgorICogICAtRU5PREFUQSBpZmYgdGhhdCBtYXBwaW5nIGlzIG5vdCBwcmVzZW50LgorICogICAwIHN1Y2Nlc3MKKyAqLworaW50IGRtX3RoaW5fZmluZF9ibG9jayhzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkLCBkbV9ibG9ja190IGJsb2NrLAorCQkgICAgICAgaW50IGNhbl9ibG9jaywgc3RydWN0IGRtX3RoaW5fbG9va3VwX3Jlc3VsdCAqcmVzdWx0KTsKKworLyoKKyAqIE9idGFpbiBhbiB1bnVzZWQgYmxvY2suCisgKi8KK2ludCBkbV9wb29sX2FsbG9jX2RhdGFfYmxvY2soc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fYmxvY2tfdCAqcmVzdWx0KTsKKworLyoKKyAqIEluc2VydCBvciByZW1vdmUgYmxvY2suCisgKi8KK2ludCBkbV90aGluX2luc2VydF9ibG9jayhzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkLCBkbV9ibG9ja190IGJsb2NrLAorCQkJIGRtX2Jsb2NrX3QgZGF0YV9ibG9jayk7CisKK2ludCBkbV90aGluX3JlbW92ZV9ibG9jayhzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkLCBkbV9ibG9ja190IGJsb2NrKTsKKworLyoKKyAqIFF1ZXJpZXMuCisgKi8KK2ludCBkbV90aGluX2dldF9oaWdoZXN0X21hcHBlZF9ibG9jayhzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkLAorCQkJCSAgICAgZG1fYmxvY2tfdCAqaGlnaGVzdF9tYXBwZWQpOworCitpbnQgZG1fdGhpbl9nZXRfbWFwcGVkX2NvdW50KHN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsIGRtX2Jsb2NrX3QgKnJlc3VsdCk7CisKK2ludCBkbV9wb29sX2dldF9mcmVlX2Jsb2NrX2NvdW50KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJIGRtX2Jsb2NrX3QgKnJlc3VsdCk7CisKK2ludCBkbV9wb29sX2dldF9mcmVlX21ldGFkYXRhX2Jsb2NrX2NvdW50KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJCSAgZG1fYmxvY2tfdCAqcmVzdWx0KTsKKworaW50IGRtX3Bvb2xfZ2V0X21ldGFkYXRhX2Rldl9zaXplKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJICBkbV9ibG9ja190ICpyZXN1bHQpOworCitpbnQgZG1fcG9vbF9nZXRfZGF0YV9ibG9ja19zaXplKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIHNlY3Rvcl90ICpyZXN1bHQpOworCitpbnQgZG1fcG9vbF9nZXRfZGF0YV9kZXZfc2l6ZShzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBkbV9ibG9ja190ICpyZXN1bHQpOworCisvKgorICogUmV0dXJucyAtRU5PU1BDIGlmIHRoZSBuZXcgc2l6ZSBpcyB0b28gc21hbGwgYW5kIGFscmVhZHkgYWxsb2NhdGVkCisgKiBibG9ja3Mgd291bGQgYmUgbG9zdC4KKyAqLworaW50IGRtX3Bvb2xfcmVzaXplX2RhdGFfZGV2KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX2Jsb2NrX3QgbmV3X3NpemUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jIGIvZHJpdmVycy9tZC9kbS10aGluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwODc1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCkBAIC0wLDAgKzEsMjQyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0IFVLLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS10aGluLW1ldGFkYXRhLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kbS1rY29weWQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZQlETV9NU0dfUFJFRklYCSJ0aGluIgorCisvKgorICogVHVuYWJsZSBjb25zdGFudHMKKyAqLworI2RlZmluZSBFTkRJT19IT09LX1BPT0xfU0laRSAxMDI0MAorI2RlZmluZSBERUZFUlJFRF9TRVRfU0laRSA2NAorI2RlZmluZSBNQVBQSU5HX1BPT0xfU0laRSAxMDI0CisjZGVmaW5lIFBSSVNPTl9DRUxMUyAxMDI0CisKKy8qCisgKiBUaGUgYmxvY2sgc2l6ZSBvZiB0aGUgZGV2aWNlIGhvbGRpbmcgcG9vbCBkYXRhIG11c3QgYmUKKyAqIGJldHdlZW4gNjRLQiBhbmQgMUdCLgorICovCisjZGVmaW5lIERBVEFfREVWX0JMT0NLX1NJWkVfTUlOX1NFQ1RPUlMgKDY0ICogMTAyNCA+PiBTRUNUT1JfU0hJRlQpCisjZGVmaW5lIERBVEFfREVWX0JMT0NLX1NJWkVfTUFYX1NFQ1RPUlMgKDEwMjQgKiAxMDI0ICogMTAyNCA+PiBTRUNUT1JfU0hJRlQpCisKKy8qCisgKiBUaGUgbWV0YWRhdGEgZGV2aWNlIGlzIGN1cnJlbnRseSBsaW1pdGVkIGluIHNpemUuICBUaGUgbGltaXRhdGlvbiBpcworICogY2hlY2tlZCBsb3dlciBkb3duIGluIGRtLXNwYWNlLW1hcC1tZXRhZGF0YSwgYnV0IHdlIGFsc28gY2hlY2sgaXQgaGVyZQorICogc28gd2UgY2FuIGZhaWwgZWFybHkuCisgKgorICogV2UgaGF2ZSBvbmUgYmxvY2sgb2YgaW5kZXgsIHdoaWNoIGNhbiBob2xkIDI1NSBpbmRleCBlbnRyaWVzLiAgRWFjaAorICogaW5kZXggZW50cnkgY29udGFpbnMgYWxsb2NhdGlvbiBpbmZvIGFib3V0IDE2ayBtZXRhZGF0YSBibG9ja3MuCisgKi8KKyNkZWZpbmUgTUVUQURBVEFfREVWX01BWF9TRUNUT1JTICgyNTUgKiAoMSA8PCAxNCkgKiAoVEhJTl9NRVRBREFUQV9CTE9DS19TSVpFIC8gKDEgPDwgU0VDVE9SX1NISUZUKSkpCisKKy8qCisgKiBEZXZpY2UgaWQgaXMgcmVzdHJpY3RlZCB0byAyNCBiaXRzLgorICovCisjZGVmaW5lIE1BWF9ERVZfSUQgKCgxIDw8IDI0KSAtIDEpCisKKy8qCisgKiBIb3cgZG8gd2UgaGFuZGxlIGJyZWFraW5nIHNoYXJpbmcgb2YgZGF0YSBibG9ja3M/CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogV2UgdXNlIGEgc3RhbmRhcmQgY29weS1vbi13cml0ZSBidHJlZSB0byBzdG9yZSB0aGUgbWFwcGluZ3MgZm9yIHRoZQorICogZGV2aWNlcyAobm90ZSBJJ20gdGFsa2luZyBhYm91dCBjb3B5LW9uLXdyaXRlIG9mIHRoZSBtZXRhZGF0YSBoZXJlLCBub3QKKyAqIHRoZSBkYXRhKS4gIFdoZW4geW91IHRha2UgYW4gaW50ZXJuYWwgc25hcHNob3QgeW91IGNsb25lIHRoZSByb290IG5vZGUKKyAqIG9mIHRoZSBvcmlnaW4gYnRyZWUuICBBZnRlciB0aGlzIHRoZXJlIGlzIG5vIGNvbmNlcHQgb2YgYW4gb3JpZ2luIG9yIGEKKyAqIHNuYXBzaG90LiAgVGhleSBhcmUganVzdCB0d28gZGV2aWNlIHRyZWVzIHRoYXQgaGFwcGVuIHRvIHBvaW50IHRvIHRoZQorICogc2FtZSBkYXRhIGJsb2Nrcy4KKyAqCisgKiBXaGVuIHdlIGdldCBhIHdyaXRlIGluIHdlIGRlY2lkZSBpZiBpdCdzIHRvIGEgc2hhcmVkIGRhdGEgYmxvY2sgdXNpbmcKKyAqIHNvbWUgdGltZXN0YW1wIG1hZ2ljLiAgSWYgaXQgaXMsIHdlIGhhdmUgdG8gYnJlYWsgc2hhcmluZy4KKyAqCisgKiBMZXQncyBzYXkgd2Ugd3JpdGUgdG8gYSBzaGFyZWQgYmxvY2sgaW4gd2hhdCB3YXMgdGhlIG9yaWdpbi4gIFRoZQorICogc3RlcHMgYXJlOgorICoKKyAqIGkpIHBsdWcgaW8gZnVydGhlciB0byB0aGlzIHBoeXNpY2FsIGJsb2NrLiAoc2VlIGJpb19wcmlzb24gY29kZSkuCisgKgorICogaWkpIHF1aWVzY2UgYW55IHJlYWQgaW8gdG8gdGhhdCBzaGFyZWQgZGF0YSBibG9jay4gIE9idmlvdXNseQorICogaW5jbHVkaW5nIGFsbCBkZXZpY2VzIHRoYXQgc2hhcmUgdGhpcyBibG9jay4gIChzZWUgZGVmZXJyZWRfc2V0IGNvZGUpCisgKgorICogaWlpKSBjb3B5IHRoZSBkYXRhIGJsb2NrIHRvIGEgbmV3bHkgYWxsb2NhdGUgYmxvY2suICBUaGlzIHN0ZXAgY2FuIGJlCisgKiBtaXNzZWQgb3V0IGlmIHRoZSBpbyBjb3ZlcnMgdGhlIGJsb2NrLiAoc2NoZWR1bGVfY29weSkuCisgKgorICogaXYpIGluc2VydCB0aGUgbmV3IG1hcHBpbmcgaW50byB0aGUgb3JpZ2luJ3MgYnRyZWUKKyAqIChwcm9jZXNzX3ByZXBhcmVkX21hcHBpbmdzKS4gIFRoaXMgYWN0IG9mIGluc2VydGluZyBicmVha3Mgc29tZQorICogc2hhcmluZyBvZiBidHJlZSBub2RlcyBiZXR3ZWVuIHRoZSB0d28gZGV2aWNlcy4gIEJyZWFraW5nIHNoYXJpbmcgb25seQorICogZWZmZWN0cyB0aGUgYnRyZWUgb2YgdGhhdCBzcGVjaWZpYyBkZXZpY2UuICBCdHJlZXMgZm9yIHRoZSBvdGhlcgorICogZGV2aWNlcyB0aGF0IHNoYXJlIHRoZSBibG9jayBuZXZlciBjaGFuZ2UuICBUaGUgYnRyZWUgZm9yIHRoZSBvcmlnaW4KKyAqIGRldmljZSBhcyBpdCB3YXMgYWZ0ZXIgdGhlIGxhc3QgY29tbWl0IGlzIHVudG91Y2hlZCwgaWUuIHdlJ3JlIHVzaW5nCisgKiBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlcyBpbiB0aGUgZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBzZW5zZS4KKyAqCisgKiB2KSB1bnBsdWcgaW8gdG8gdGhpcyBwaHlzaWNhbCBibG9jaywgaW5jbHVkaW5nIHRoZSBpbyB0aGF0IHRyaWdnZXJlZAorICogdGhlIGJyZWFraW5nIG9mIHNoYXJpbmcuCisgKgorICogU3RlcHMgKGlpKSBhbmQgKGlpaSkgb2NjdXIgaW4gcGFyYWxsZWwuCisgKgorICogVGhlIG1ldGFkYXRhIF9kb2Vzbid0XyBuZWVkIHRvIGJlIGNvbW1pdHRlZCBiZWZvcmUgdGhlIGlvIGNvbnRpbnVlcy4gIFdlCisgKiBnZXQgYXdheSB3aXRoIHRoaXMgYmVjYXVzZSB0aGUgaW8gaXMgYWx3YXlzIHdyaXR0ZW4gdG8gYSBfbmV3XyBibG9jay4KKyAqIElmIHRoZXJlJ3MgYSBjcmFzaCwgdGhlbjoKKyAqCisgKiAtIFRoZSBvcmlnaW4gbWFwcGluZyB3aWxsIHBvaW50IHRvIHRoZSBvbGQgb3JpZ2luIGJsb2NrICh0aGUgc2hhcmVkCisgKiBvbmUpLiAgVGhpcyB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgYXMgaXQgd2FzIGJlZm9yZSB0aGUgaW8gdGhhdCB0cmlnZ2VyZWQKKyAqIHRoZSBicmVha2luZyBvZiBzaGFyaW5nIGNhbWUgaW4uCisgKgorICogLSBUaGUgc25hcCBtYXBwaW5nIHN0aWxsIHBvaW50cyB0byB0aGUgb2xkIGJsb2NrLiAgQXMgaXQgd291bGQgYWZ0ZXIKKyAqIHRoZSBjb21taXQuCisgKgorICogVGhlIGRvd25zaWRlIG9mIHRoaXMgc2NoZW1lIGlzIHRoZSB0aW1lc3RhbXAgbWFnaWMgaXNuJ3QgcGVyZmVjdCwgYW5kCisgKiB3aWxsIGNvbnRpbnVlIHRvIHRoaW5rIHRoYXQgZGF0YSBibG9jayBpbiB0aGUgc25hcHNob3QgZGV2aWNlIGlzIHNoYXJlZAorICogZXZlbiBhZnRlciB0aGUgd3JpdGUgdG8gdGhlIG9yaWdpbiBoYXMgYnJva2VuIHNoYXJpbmcuICBJIHN1c3BlY3QgZGF0YQorICogYmxvY2tzIHdpbGwgdHlwaWNhbGx5IGJlIHNoYXJlZCBieSBtYW55IGRpZmZlcmVudCBkZXZpY2VzLCBzbyB3ZSdyZQorICogYnJlYWtpbmcgc2hhcmluZyBuICsgMSB0aW1lcywgcmF0aGVyIHRoYW4gbiwgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mCisgKiBkZXZpY2VzIHRoYXQgcmVmZXJlbmNlIHRoaXMgZGF0YSBibG9jay4gIEF0IHRoZSBtb21lbnQgSSB0aGluayB0aGUKKyAqIGJlbmVmaXRzIGZhciwgZmFyIG91dHdlaWdoIHRoZSBkaXNhZHZhbnRhZ2VzLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTb21ldGltZXMgd2UgY2FuJ3QgZGVhbCB3aXRoIGEgYmlvIHN0cmFpZ2h0IGF3YXkuICBXZSBwdXQgdGhlbSBpbiBwcmlzb24KKyAqIHdoZXJlIHRoZXkgY2FuJ3QgY2F1c2UgYW55IG1pc2NoaWVmLiAgQmlvcyBhcmUgcHV0IGluIGEgY2VsbCBpZGVudGlmaWVkCisgKiBieSBhIGtleSwgbXVsdGlwbGUgYmlvcyBjYW4gYmUgaW4gdGhlIHNhbWUgY2VsbC4gIFdoZW4gdGhlIGNlbGwgaXMKKyAqIHN1YnNlcXVlbnRseSB1bmxvY2tlZCB0aGUgYmlvcyBiZWNvbWUgYXZhaWxhYmxlLgorICovCitzdHJ1Y3QgYmlvX3ByaXNvbjsKKworc3RydWN0IGNlbGxfa2V5IHsKKwlpbnQgdmlydHVhbDsKKwlkbV90aGluX2lkIGRldjsKKwlkbV9ibG9ja190IGJsb2NrOworfTsKKworc3RydWN0IGNlbGwgeworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7CisJc3RydWN0IGJpb19wcmlzb24gKnByaXNvbjsKKwlzdHJ1Y3QgY2VsbF9rZXkga2V5OworCXVuc2lnbmVkIGNvdW50OworCXN0cnVjdCBiaW9fbGlzdCBiaW9zOworfTsKKworc3RydWN0IGJpb19wcmlzb24geworCXNwaW5sb2NrX3QgbG9jazsKKwltZW1wb29sX3QgKmNlbGxfcG9vbDsKKworCXVuc2lnbmVkIG5yX2J1Y2tldHM7CisJdW5zaWduZWQgaGFzaF9tYXNrOworCXN0cnVjdCBobGlzdF9oZWFkICpjZWxsczsKK307CisKK3N0YXRpYyB1aW50MzJfdCBjYWxjX25yX2J1Y2tldHModW5zaWduZWQgbnJfY2VsbHMpCit7CisJdWludDMyX3QgbiA9IDEyODsKKworCW5yX2NlbGxzIC89IDQ7CisJbnJfY2VsbHMgPSBtaW4obnJfY2VsbHMsIDgxOTJ1KTsKKworCXdoaWxlIChuIDwgbnJfY2VsbHMpCisJCW4gPDw9IDE7CisKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIEBucl9jZWxscyBzaG91bGQgYmUgdGhlIG51bWJlciBvZiBjZWxscyB5b3Ugd2FudCBpbiB1c2UgX2NvbmN1cnJlbnRseV8uCisgKiBEb24ndCBjb25mdXNlIGl0IHdpdGggdGhlIG51bWJlciBvZiBkaXN0aW5jdCBrZXlzLgorICovCitzdGF0aWMgc3RydWN0IGJpb19wcmlzb24gKnByaXNvbl9jcmVhdGUodW5zaWduZWQgbnJfY2VsbHMpCit7CisJdW5zaWduZWQgaTsKKwl1aW50MzJfdCBucl9idWNrZXRzID0gY2FsY19ucl9idWNrZXRzKG5yX2NlbGxzKTsKKwlzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBiaW9fcHJpc29uKSArCisJCShzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpICogbnJfYnVja2V0cyk7CisJc3RydWN0IGJpb19wcmlzb24gKnByaXNvbiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKworCWlmICghcHJpc29uKQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pbml0KCZwcmlzb24tPmxvY2spOworCXByaXNvbi0+Y2VsbF9wb29sID0gbWVtcG9vbF9jcmVhdGVfa21hbGxvY19wb29sKG5yX2NlbGxzLAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgY2VsbCkpOworCWlmICghcHJpc29uLT5jZWxsX3Bvb2wpIHsKKwkJa2ZyZWUocHJpc29uKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHJpc29uLT5ucl9idWNrZXRzID0gbnJfYnVja2V0czsKKwlwcmlzb24tPmhhc2hfbWFzayA9IG5yX2J1Y2tldHMgLSAxOworCXByaXNvbi0+Y2VsbHMgPSAoc3RydWN0IGhsaXN0X2hlYWQgKikgKHByaXNvbiArIDEpOworCWZvciAoaSA9IDA7IGkgPCBucl9idWNrZXRzOyBpKyspCisJCUlOSVRfSExJU1RfSEVBRChwcmlzb24tPmNlbGxzICsgaSk7CisKKwlyZXR1cm4gcHJpc29uOworfQorCitzdGF0aWMgdm9pZCBwcmlzb25fZGVzdHJveShzdHJ1Y3QgYmlvX3ByaXNvbiAqcHJpc29uKQoreworCW1lbXBvb2xfZGVzdHJveShwcmlzb24tPmNlbGxfcG9vbCk7CisJa2ZyZWUocHJpc29uKTsKK30KKworc3RhdGljIHVpbnQzMl90IGhhc2hfa2V5KHN0cnVjdCBiaW9fcHJpc29uICpwcmlzb24sIHN0cnVjdCBjZWxsX2tleSAqa2V5KQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgQklHX1BSSU1FID0gNDI5NDk2NzI5MVVMOworCXVpbnQ2NF90IGhhc2ggPSBrZXktPmJsb2NrICogQklHX1BSSU1FOworCisJcmV0dXJuICh1aW50MzJfdCkgKGhhc2ggJiBwcmlzb24tPmhhc2hfbWFzayk7Cit9CisKK3N0YXRpYyBpbnQga2V5c19lcXVhbChzdHJ1Y3QgY2VsbF9rZXkgKmxocywgc3RydWN0IGNlbGxfa2V5ICpyaHMpCit7CisJICAgICAgIHJldHVybiAobGhzLT52aXJ0dWFsID09IHJocy0+dmlydHVhbCkgJiYKKwkJICAgICAgIChsaHMtPmRldiA9PSByaHMtPmRldikgJiYKKwkJICAgICAgIChsaHMtPmJsb2NrID09IHJocy0+YmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IGNlbGwgKl9fc2VhcmNoX2J1Y2tldChzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0LAorCQkJCSAgICBzdHJ1Y3QgY2VsbF9rZXkgKmtleSkKK3sKKwlzdHJ1Y3QgY2VsbCAqY2VsbDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoY2VsbCwgdG1wLCBidWNrZXQsIGxpc3QpCisJCWlmIChrZXlzX2VxdWFsKCZjZWxsLT5rZXksIGtleSkpCisJCQlyZXR1cm4gY2VsbDsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICogVGhpcyBtYXkgYmxvY2sgaWYgYSBuZXcgY2VsbCBuZWVkcyBhbGxvY2F0aW5nLiAgWW91IG11c3QgZW5zdXJlIHRoYXQKKyAqIGNlbGxzIHdpbGwgYmUgdW5sb2NrZWQgZXZlbiBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYmxvY2tlZC4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VsbCBwcmlvciB0byB0aGUgbmV3IGFkZGl0aW9uCisgKiBvciA8IDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBiaW9fZGV0YWluKHN0cnVjdCBiaW9fcHJpc29uICpwcmlzb24sIHN0cnVjdCBjZWxsX2tleSAqa2V5LAorCQkgICAgICBzdHJ1Y3QgYmlvICppbm1hdGUsIHN0cnVjdCBjZWxsICoqcmVmKQoreworCWludCByOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDMyX3QgaGFzaCA9IGhhc2hfa2V5KHByaXNvbiwga2V5KTsKKwlzdHJ1Y3QgY2VsbCAqdW5pbml0aWFsaXplZF92YXIoY2VsbCksICpjZWxsMiA9IE5VTEw7CisKKwlCVUdfT04oaGFzaCA+IHByaXNvbi0+bnJfYnVja2V0cyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7CisJY2VsbCA9IF9fc2VhcmNoX2J1Y2tldChwcmlzb24tPmNlbGxzICsgaGFzaCwga2V5KTsKKworCWlmICghY2VsbCkgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBhIG5ldyBjZWxsCisJCSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcmlzb24tPmxvY2ssIGZsYWdzKTsKKwkJY2VsbDIgPSBtZW1wb29sX2FsbG9jKHByaXNvbi0+Y2VsbF9wb29sLCBHRlBfTk9JTyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcmlzb24tPmxvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBXZSd2ZSBiZWVuIHVubG9ja2VkLCBzbyB3ZSBoYXZlIHRvIGRvdWJsZSBjaGVjayB0aGF0CisJCSAqIG5vYm9keSBlbHNlIGhhcyBpbnNlcnRlZCB0aGlzIGNlbGwgaW4gdGhlIG1lYW50aW1lLgorCQkgKi8KKwkJY2VsbCA9IF9fc2VhcmNoX2J1Y2tldChwcmlzb24tPmNlbGxzICsgaGFzaCwga2V5KTsKKworCQlpZiAoIWNlbGwpIHsKKwkJCWNlbGwgPSBjZWxsMjsKKwkJCWNlbGwyID0gTlVMTDsKKworCQkJY2VsbC0+cHJpc29uID0gcHJpc29uOworCQkJbWVtY3B5KCZjZWxsLT5rZXksIGtleSwgc2l6ZW9mKGNlbGwtPmtleSkpOworCQkJY2VsbC0+Y291bnQgPSAwOworCQkJYmlvX2xpc3RfaW5pdCgmY2VsbC0+Ymlvcyk7CisJCQlobGlzdF9hZGRfaGVhZCgmY2VsbC0+bGlzdCwgcHJpc29uLT5jZWxscyArIGhhc2gpOworCQl9CisJfQorCisJciA9IGNlbGwtPmNvdW50Kys7CisJYmlvX2xpc3RfYWRkKCZjZWxsLT5iaW9zLCBpbm1hdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNlbGwyKQorCQltZW1wb29sX2ZyZWUoY2VsbDIsIHByaXNvbi0+Y2VsbF9wb29sKTsKKworCSpyZWYgPSBjZWxsOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBAaW5tYXRlcyBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXNlZCBwcmlvciB0byB0aGlzIGNhbGwKKyAqLworc3RhdGljIHZvaWQgX19jZWxsX3JlbGVhc2Uoc3RydWN0IGNlbGwgKmNlbGwsIHN0cnVjdCBiaW9fbGlzdCAqaW5tYXRlcykKK3sKKwlzdHJ1Y3QgYmlvX3ByaXNvbiAqcHJpc29uID0gY2VsbC0+cHJpc29uOworCisJaGxpc3RfZGVsKCZjZWxsLT5saXN0KTsKKworCWlmIChpbm1hdGVzKQorCQliaW9fbGlzdF9tZXJnZShpbm1hdGVzLCAmY2VsbC0+Ymlvcyk7CisKKwltZW1wb29sX2ZyZWUoY2VsbCwgcHJpc29uLT5jZWxsX3Bvb2wpOworfQorCitzdGF0aWMgdm9pZCBjZWxsX3JlbGVhc2Uoc3RydWN0IGNlbGwgKmNlbGwsIHN0cnVjdCBiaW9fbGlzdCAqYmlvcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaW9fcHJpc29uICpwcmlzb24gPSBjZWxsLT5wcmlzb247CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7CisJX19jZWxsX3JlbGVhc2UoY2VsbCwgYmlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgcGxhY2VzIHdoZXJlIHdlIHB1dCBhIGJpbyBpbnRvIGEgY2VsbCBicmllZmx5CisgKiBiZWZvcmUgdGFraW5nIGl0IG91dCBhZ2Fpbi4gIEluIHRoZXNlIHNpdHVhdGlvbnMgd2Uga25vdyB0aGF0IG5vIG90aGVyCisgKiBiaW8gbWF5IGJlIGluIHRoZSBjZWxsLiAgVGhpcyBmdW5jdGlvbiByZWxlYXNlcyB0aGUgY2VsbCwgYW5kIGFsc28gZG9lcworICogYSBzYW5pdHkgY2hlY2suCisgKi8KK3N0YXRpYyB2b2lkIGNlbGxfcmVsZWFzZV9zaW5nbGV0b24oc3RydWN0IGNlbGwgKmNlbGwsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgYmlvX3ByaXNvbiAqcHJpc29uID0gY2VsbC0+cHJpc29uOworCXN0cnVjdCBiaW9fbGlzdCBiaW9zOworCXN0cnVjdCBiaW8gKmI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJpb19saXN0X2luaXQoJmJpb3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOworCV9fY2VsbF9yZWxlYXNlKGNlbGwsICZiaW9zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcmlzb24tPmxvY2ssIGZsYWdzKTsKKworCWIgPSBiaW9fbGlzdF9wb3AoJmJpb3MpOworCUJVR19PTihiICE9IGJpbyk7CisJQlVHX09OKCFiaW9fbGlzdF9lbXB0eSgmYmlvcykpOworfQorCitzdGF0aWMgdm9pZCBjZWxsX2Vycm9yKHN0cnVjdCBjZWxsICpjZWxsKQoreworCXN0cnVjdCBiaW9fcHJpc29uICpwcmlzb24gPSBjZWxsLT5wcmlzb247CisJc3RydWN0IGJpb19saXN0IGJpb3M7CisJc3RydWN0IGJpbyAqYmlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwliaW9fbGlzdF9pbml0KCZiaW9zKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcmlzb24tPmxvY2ssIGZsYWdzKTsKKwlfX2NlbGxfcmVsZWFzZShjZWxsLCAmYmlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKQorCQliaW9faW9fZXJyb3IoYmlvKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFdlIHVzZSB0aGUgZGVmZXJyZWQgc2V0IHRvIGtlZXAgdHJhY2sgb2YgcGVuZGluZyByZWFkcyB0byBzaGFyZWQgYmxvY2tzLgorICogV2UgZG8gdGhpcyB0byBlbnN1cmUgdGhlIG5ldyBtYXBwaW5nIGNhdXNlZCBieSBhIHdyaXRlIGlzbid0IHBlcmZvcm1lZAorICogdW50aWwgdGhlc2UgcHJpb3IgcmVhZHMgaGF2ZSBjb21wbGV0ZWQuICBPdGhlcndpc2UgdGhlIGluc2VydGlvbiBvZiB0aGUKKyAqIG5ldyBtYXBwaW5nIGNvdWxkIGZyZWUgdGhlIG9sZCBibG9jayB0aGF0IHRoZSByZWFkIGJpb3MgYXJlIG1hcHBlZCB0by4KKyAqLworCitzdHJ1Y3QgZGVmZXJyZWRfc2V0Oworc3RydWN0IGRlZmVycmVkX2VudHJ5IHsKKwlzdHJ1Y3QgZGVmZXJyZWRfc2V0ICpkczsKKwl1bnNpZ25lZCBjb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdvcmtfaXRlbXM7Cit9OworCitzdHJ1Y3QgZGVmZXJyZWRfc2V0IHsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgY3VycmVudF9lbnRyeTsKKwl1bnNpZ25lZCBzd2VlcGVyOworCXN0cnVjdCBkZWZlcnJlZF9lbnRyeSBlbnRyaWVzW0RFRkVSUkVEX1NFVF9TSVpFXTsKK307CisKK3N0YXRpYyB2b2lkIGRzX2luaXQoc3RydWN0IGRlZmVycmVkX3NldCAqZHMpCit7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaW5pdCgmZHMtPmxvY2spOworCWRzLT5jdXJyZW50X2VudHJ5ID0gMDsKKwlkcy0+c3dlZXBlciA9IDA7CisJZm9yIChpID0gMDsgaSA8IERFRkVSUkVEX1NFVF9TSVpFOyBpKyspIHsKKwkJZHMtPmVudHJpZXNbaV0uZHMgPSBkczsKKwkJZHMtPmVudHJpZXNbaV0uY291bnQgPSAwOworCQlJTklUX0xJU1RfSEVBRCgmZHMtPmVudHJpZXNbaV0ud29ya19pdGVtcyk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGRlZmVycmVkX2VudHJ5ICpkc19pbmMoc3RydWN0IGRlZmVycmVkX3NldCAqZHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZGVmZXJyZWRfZW50cnkgKmVudHJ5OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzLT5sb2NrLCBmbGFncyk7CisJZW50cnkgPSBkcy0+ZW50cmllcyArIGRzLT5jdXJyZW50X2VudHJ5OworCWVudHJ5LT5jb3VudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkc19uZXh0KHVuc2lnbmVkIGluZGV4KQoreworCXJldHVybiAoaW5kZXggKyAxKSAlIERFRkVSUkVEX1NFVF9TSVpFOworfQorCitzdGF0aWMgdm9pZCBfX3N3ZWVwKHN0cnVjdCBkZWZlcnJlZF9zZXQgKmRzLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXdoaWxlICgoZHMtPnN3ZWVwZXIgIT0gZHMtPmN1cnJlbnRfZW50cnkpICYmCisJICAgICAgICFkcy0+ZW50cmllc1tkcy0+c3dlZXBlcl0uY291bnQpIHsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmZHMtPmVudHJpZXNbZHMtPnN3ZWVwZXJdLndvcmtfaXRlbXMsIGhlYWQpOworCQlkcy0+c3dlZXBlciA9IGRzX25leHQoZHMtPnN3ZWVwZXIpOworCX0KKworCWlmICgoZHMtPnN3ZWVwZXIgPT0gZHMtPmN1cnJlbnRfZW50cnkpICYmICFkcy0+ZW50cmllc1tkcy0+c3dlZXBlcl0uY291bnQpCisJCWxpc3Rfc3BsaWNlX2luaXQoJmRzLT5lbnRyaWVzW2RzLT5zd2VlcGVyXS53b3JrX2l0ZW1zLCBoZWFkKTsKK30KKworc3RhdGljIHZvaWQgZHNfZGVjKHN0cnVjdCBkZWZlcnJlZF9lbnRyeSAqZW50cnksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbnRyeS0+ZHMtPmxvY2ssIGZsYWdzKTsKKwlCVUdfT04oIWVudHJ5LT5jb3VudCk7CisJLS1lbnRyeS0+Y291bnQ7CisJX19zd2VlcChlbnRyeS0+ZHMsIGhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVudHJ5LT5kcy0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogUmV0dXJucyAxIGlmIGRlZmVycmVkIG9yIDAgaWYgbm8gcGVuZGluZyBpdGVtcyB0byBkZWxheSBqb2IuCisgKi8KK3N0YXRpYyBpbnQgZHNfYWRkX3dvcmsoc3RydWN0IGRlZmVycmVkX3NldCAqZHMsIHN0cnVjdCBsaXN0X2hlYWQgKndvcmspCit7CisJaW50IHIgPSAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbmV4dF9lbnRyeTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkcy0+bG9jaywgZmxhZ3MpOworCWlmICgoZHMtPnN3ZWVwZXIgPT0gZHMtPmN1cnJlbnRfZW50cnkpICYmCisJICAgICFkcy0+ZW50cmllc1tkcy0+Y3VycmVudF9lbnRyeV0uY291bnQpCisJCXIgPSAwOworCWVsc2UgeworCQlsaXN0X2FkZCh3b3JrLCAmZHMtPmVudHJpZXNbZHMtPmN1cnJlbnRfZW50cnldLndvcmtfaXRlbXMpOworCQluZXh0X2VudHJ5ID0gZHNfbmV4dChkcy0+Y3VycmVudF9lbnRyeSk7CisJCWlmICghZHMtPmVudHJpZXNbbmV4dF9lbnRyeV0uY291bnQpCisJCQlkcy0+Y3VycmVudF9lbnRyeSA9IG5leHRfZW50cnk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEtleSBidWlsZGluZy4KKyAqLworc3RhdGljIHZvaWQgYnVpbGRfZGF0YV9rZXkoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwKKwkJCSAgIGRtX2Jsb2NrX3QgYiwgc3RydWN0IGNlbGxfa2V5ICprZXkpCit7CisJa2V5LT52aXJ0dWFsID0gMDsKKwlrZXktPmRldiA9IGRtX3RoaW5fZGV2X2lkKHRkKTsKKwlrZXktPmJsb2NrID0gYjsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfdmlydHVhbF9rZXkoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBiLAorCQkJICAgICAgc3RydWN0IGNlbGxfa2V5ICprZXkpCit7CisJa2V5LT52aXJ0dWFsID0gMTsKKwlrZXktPmRldiA9IGRtX3RoaW5fZGV2X2lkKHRkKTsKKwlrZXktPmJsb2NrID0gYjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEEgcG9vbCBkZXZpY2UgdGllcyB0b2dldGhlciBhIG1ldGFkYXRhIGRldmljZSBhbmQgYSBkYXRhIGRldmljZS4gIEl0CisgKiBhbHNvIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGludGVybmFsCisgKiBkZXZpY2VzLgorICovCitzdHJ1Y3QgbmV3X21hcHBpbmc7CitzdHJ1Y3QgcG9vbCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBkbV90YXJnZXQgKnRpOwkvKiBPbmx5IHNldCBpZiBhIHBvb2wgdGFyZ2V0IGlzIGJvdW5kICovCisKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqcG9vbF9tZDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICptZF9kZXY7CisJc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZDsKKworCXVpbnQzMl90IHNlY3RvcnNfcGVyX2Jsb2NrOworCXVuc2lnbmVkIGJsb2NrX3NoaWZ0OworCWRtX2Jsb2NrX3Qgb2Zmc2V0X21hc2s7CisJZG1fYmxvY2tfdCBsb3dfd2F0ZXJfYmxvY2tzOworCisJdW5zaWduZWQgemVyb19uZXdfYmxvY2tzOjE7CisJdW5zaWduZWQgbG93X3dhdGVyX3RyaWdnZXJlZDoxOwkvKiBBIGRtIGV2ZW50IGhhcyBiZWVuIHNlbnQgKi8KKwl1bnNpZ25lZCBub19mcmVlX3NwYWNlOjE7CS8qIEEgLUVOT1NQQyB3YXJuaW5nIGhhcyBiZWVuIGlzc3VlZCAqLworCisJc3RydWN0IGJpb19wcmlzb24gKnByaXNvbjsKKwlzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqY29waWVyOworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrZXI7CisKKwl1bnNpZ25lZCByZWZfY291bnQ7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGJpb19saXN0IGRlZmVycmVkX2Jpb3M7CisJc3RydWN0IGJpb19saXN0IGRlZmVycmVkX2ZsdXNoX2Jpb3M7CisJc3RydWN0IGxpc3RfaGVhZCBwcmVwYXJlZF9tYXBwaW5nczsKKworCXN0cnVjdCBiaW9fbGlzdCByZXRyeV9vbl9yZXN1bWVfbGlzdDsKKworCXN0cnVjdCBkZWZlcnJlZF9zZXQgZHM7CS8qIEZJWE1FOiBtb3ZlIHRvIHRoaW5fYyAqLworCisJc3RydWN0IG5ld19tYXBwaW5nICpuZXh0X21hcHBpbmc7CisJbWVtcG9vbF90ICptYXBwaW5nX3Bvb2w7CisJbWVtcG9vbF90ICplbmRpb19ob29rX3Bvb2w7Cit9OworCisvKgorICogVGFyZ2V0IGNvbnRleHQgZm9yIGEgcG9vbC4KKyAqLworc3RydWN0IHBvb2xfYyB7CisJc3RydWN0IGRtX3RhcmdldCAqdGk7CisJc3RydWN0IHBvb2wgKnBvb2w7CisJc3RydWN0IGRtX2RldiAqZGF0YV9kZXY7CisJc3RydWN0IGRtX2RldiAqbWV0YWRhdGFfZGV2OworCXN0cnVjdCBkbV90YXJnZXRfY2FsbGJhY2tzIGNhbGxiYWNrczsKKworCWRtX2Jsb2NrX3QgbG93X3dhdGVyX2Jsb2NrczsKKwl1bnNpZ25lZCB6ZXJvX25ld19ibG9ja3M6MTsKK307CisKKy8qCisgKiBUYXJnZXQgY29udGV4dCBmb3IgYSB0aGluLgorICovCitzdHJ1Y3QgdGhpbl9jIHsKKwlzdHJ1Y3QgZG1fZGV2ICpwb29sX2RldjsKKwlkbV90aGluX2lkIGRldl9pZDsKKworCXN0cnVjdCBwb29sICpwb29sOworCXN0cnVjdCBkbV90aGluX2RldmljZSAqdGQ7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQSBnbG9iYWwgbGlzdCBvZiBwb29scyB0aGF0IHVzZXMgYSBzdHJ1Y3QgbWFwcGVkX2RldmljZSBhcyBhIGtleS4KKyAqLworc3RhdGljIHN0cnVjdCBkbV90aGluX3Bvb2xfdGFibGUgeworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvb2xzOworfSBkbV90aGluX3Bvb2xfdGFibGU7CisKK3N0YXRpYyB2b2lkIHBvb2xfdGFibGVfaW5pdCh2b2lkKQoreworCW11dGV4X2luaXQoJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmRtX3RoaW5fcG9vbF90YWJsZS5wb29scyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcG9vbF90YWJsZV9pbnNlcnQoc3RydWN0IHBvb2wgKnBvb2wpCit7CisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCkpOworCWxpc3RfYWRkKCZwb29sLT5saXN0LCAmZG1fdGhpbl9wb29sX3RhYmxlLnBvb2xzKTsKK30KKworc3RhdGljIHZvaWQgX19wb29sX3RhYmxlX3JlbW92ZShzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KSk7CisJbGlzdF9kZWwoJnBvb2wtPmxpc3QpOworfQorCitzdGF0aWMgc3RydWN0IHBvb2wgKl9fcG9vbF90YWJsZV9sb29rdXAoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXN0cnVjdCBwb29sICpwb29sID0gTlVMTCwgKnRtcDsKKworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZkbV90aGluX3Bvb2xfdGFibGUubXV0ZXgpKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmZG1fdGhpbl9wb29sX3RhYmxlLnBvb2xzLCBsaXN0KSB7CisJCWlmICh0bXAtPnBvb2xfbWQgPT0gbWQpIHsKKwkJCXBvb2wgPSB0bXA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBwb29sOworfQorCitzdGF0aWMgc3RydWN0IHBvb2wgKl9fcG9vbF90YWJsZV9sb29rdXBfbWV0YWRhdGFfZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKm1kX2RldikKK3sKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IE5VTEwsICp0bXA7CisKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmRtX3RoaW5fcG9vbF90YWJsZS5wb29scywgbGlzdCkgeworCQlpZiAodG1wLT5tZF9kZXYgPT0gbWRfZGV2KSB7CisJCQlwb29sID0gdG1wOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcG9vbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgX19yZXF1ZXVlX2Jpb19saXN0KHN0cnVjdCB0aGluX2MgKnRjLCBzdHJ1Y3QgYmlvX2xpc3QgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGJpb19saXN0IGJpb3M7CisKKwliaW9fbGlzdF9pbml0KCZiaW9zKTsKKwliaW9fbGlzdF9tZXJnZSgmYmlvcywgbWFzdGVyKTsKKwliaW9fbGlzdF9pbml0KG1hc3Rlcik7CisKKwl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKSB7CisJCWlmIChkbV9nZXRfbWFwaW5mbyhiaW8pLT5wdHIgPT0gdGMpCisJCQliaW9fZW5kaW8oYmlvLCBETV9FTkRJT19SRVFVRVVFKTsKKwkJZWxzZQorCQkJYmlvX2xpc3RfYWRkKG1hc3RlciwgYmlvKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVldWVfaW8oc3RydWN0IHRoaW5fYyAqdGMpCit7CisJc3RydWN0IHBvb2wgKnBvb2wgPSB0Yy0+cG9vbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwlfX3JlcXVldWVfYmlvX2xpc3QodGMsICZwb29sLT5kZWZlcnJlZF9iaW9zKTsKKwlfX3JlcXVldWVfYmlvX2xpc3QodGMsICZwb29sLT5yZXRyeV9vbl9yZXN1bWVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhpcyBzZWN0aW9uIG9mIGNvZGUgY29udGFpbnMgdGhlIGxvZ2ljIGZvciBwcm9jZXNzaW5nIGEgdGhpbiBkZXZpY2UncyBJTy4KKyAqIE11Y2ggb2YgdGhlIGNvZGUgZGVwZW5kcyBvbiBwb29sIG9iamVjdCByZXNvdXJjZXMgKGxpc3RzLCB3b3JrcXVldWVzLCBldGMpCisgKiBidXQgbW9zdCBpcyBleGNsdXNpdmVseSBjYWxsZWQgZnJvbSB0aGUgdGhpbiB0YXJnZXQgcmF0aGVyIHRoYW4gdGhlIHRoaW4tcG9vbAorICogdGFyZ2V0LgorICovCisKK3N0YXRpYyBkbV9ibG9ja190IGdldF9iaW9fYmxvY2soc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlyZXR1cm4gYmlvLT5iaV9zZWN0b3IgPj4gdGMtPnBvb2wtPmJsb2NrX3NoaWZ0OworfQorCitzdGF0aWMgdm9pZCByZW1hcChzdHJ1Y3QgdGhpbl9jICp0Yywgc3RydWN0IGJpbyAqYmlvLCBkbV9ibG9ja190IGJsb2NrKQoreworCXN0cnVjdCBwb29sICpwb29sID0gdGMtPnBvb2w7CisKKwliaW8tPmJpX2JkZXYgPSB0Yy0+cG9vbF9kZXYtPmJkZXY7CisJYmlvLT5iaV9zZWN0b3IgPSAoYmxvY2sgPDwgcG9vbC0+YmxvY2tfc2hpZnQpICsKKwkJKGJpby0+Ymlfc2VjdG9yICYgcG9vbC0+b2Zmc2V0X21hc2spOworfQorCitzdGF0aWMgdm9pZCByZW1hcF9hbmRfaXNzdWUoc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbywKKwkJCSAgICBkbV9ibG9ja190IGJsb2NrKQoreworCXN0cnVjdCBwb29sICpwb29sID0gdGMtPnBvb2w7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJlbWFwKHRjLCBiaW8sIGJsb2NrKTsKKworCS8qCisJICogQmF0Y2ggdG9nZXRoZXIgYW55IEZVQS9GTFVTSCBiaW9zIHdlIGZpbmQgYW5kIHRoZW4gaXNzdWUKKwkgKiBhIHNpbmdsZSBjb21taXQgZm9yIHRoZW0gaW4gcHJvY2Vzc19kZWZlcnJlZF9iaW9zKCkuCisJICovCisJaWYgKGJpby0+YmlfcncgJiAoUkVRX0ZMVVNIIHwgUkVRX0ZVQSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJYmlvX2xpc3RfYWRkKCZwb29sLT5kZWZlcnJlZF9mbHVzaF9iaW9zLCBiaW8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlCisJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7Cit9CisKKy8qCisgKiB3YWtlX3dvcmtlcigpIGlzIHVzZWQgd2hlbiBuZXcgd29yayBpcyBxdWV1ZWQgYW5kIHdoZW4gcG9vbF9yZXN1bWUgaXMKKyAqIHJlYWR5IHRvIGNvbnRpbnVlIGRlZmVycmVkIElPIHByb2Nlc3NpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHdha2Vfd29ya2VyKHN0cnVjdCBwb29sICpwb29sKQoreworCXF1ZXVlX3dvcmsocG9vbC0+d3EsICZwb29sLT53b3JrZXIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQmlvIGVuZGlvIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IGVuZGlvX2hvb2sgeworCXN0cnVjdCB0aGluX2MgKnRjOworCWJpb19lbmRfaW9fdCAqc2F2ZWRfYmlfZW5kX2lvOworCXN0cnVjdCBkZWZlcnJlZF9lbnRyeSAqZW50cnk7Cit9OworCitzdHJ1Y3QgbmV3X21hcHBpbmcgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCWludCBwcmVwYXJlZDsKKworCXN0cnVjdCB0aGluX2MgKnRjOworCWRtX2Jsb2NrX3QgdmlydF9ibG9jazsKKwlkbV9ibG9ja190IGRhdGFfYmxvY2s7CisJc3RydWN0IGNlbGwgKmNlbGw7CisJaW50IGVycjsKKworCS8qCisJICogSWYgdGhlIGJpbyBjb3ZlcnMgdGhlIHdob2xlIGFyZWEgb2YgYSBibG9jayB0aGVuIHdlIGNhbiBhdm9pZAorCSAqIHplcm9pbmcgb3IgY29weWluZy4gIEluc3RlYWQgdGhpcyBiaW8gaXMgaG9va2VkLiAgVGhlIGJpbyB3aWxsCisJICogc3RpbGwgYmUgaW4gdGhlIGNlbGwsIHNvIGNhcmUgaGFzIHRvIGJlIHRha2VuIHRvIGF2b2lkIGlzc3VpbmcKKwkgKiB0aGUgYmlvIHR3aWNlLgorCSAqLworCXN0cnVjdCBiaW8gKmJpbzsKKwliaW9fZW5kX2lvX3QgKnNhdmVkX2JpX2VuZF9pbzsKK307CisKK3N0YXRpYyB2b2lkIF9fbWF5YmVfYWRkX21hcHBpbmcoc3RydWN0IG5ld19tYXBwaW5nICptKQoreworCXN0cnVjdCBwb29sICpwb29sID0gbS0+dGMtPnBvb2w7CisKKwlpZiAobGlzdF9lbXB0eSgmbS0+bGlzdCkgJiYgbS0+cHJlcGFyZWQpIHsKKwkJbGlzdF9hZGQoJm0tPmxpc3QsICZwb29sLT5wcmVwYXJlZF9tYXBwaW5ncyk7CisJCXdha2Vfd29ya2VyKHBvb2wpOworCX0KK30KKworc3RhdGljIHZvaWQgY29weV9jb21wbGV0ZShpbnQgcmVhZF9lcnIsIHVuc2lnbmVkIGxvbmcgd3JpdGVfZXJyLCB2b2lkICpjb250ZXh0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ld19tYXBwaW5nICptID0gY29udGV4dDsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IG0tPnRjLT5wb29sOworCisJbS0+ZXJyID0gcmVhZF9lcnIgfHwgd3JpdGVfZXJyID8gLUVJTyA6IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCW0tPnByZXBhcmVkID0gMTsKKwlfX21heWJlX2FkZF9tYXBwaW5nKG0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgb3ZlcndyaXRlX2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXdfbWFwcGluZyAqbSA9IGRtX2dldF9tYXBpbmZvKGJpbyktPnB0cjsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IG0tPnRjLT5wb29sOworCisJbS0+ZXJyID0gZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwltLT5wcmVwYXJlZCA9IDE7CisJX19tYXliZV9hZGRfbWFwcGluZyhtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNoYXJlZF9yZWFkX2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hcHBpbmdzOworCXN0cnVjdCBuZXdfbWFwcGluZyAqbSwgKnRtcDsKKwlzdHJ1Y3QgZW5kaW9faG9vayAqaCA9IGRtX2dldF9tYXBpbmZvKGJpbyktPnB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwb29sICpwb29sID0gaC0+dGMtPnBvb2w7CisKKwliaW8tPmJpX2VuZF9pbyA9IGgtPnNhdmVkX2JpX2VuZF9pbzsKKwliaW9fZW5kaW8oYmlvLCBlcnIpOworCisJSU5JVF9MSVNUX0hFQUQoJm1hcHBpbmdzKTsKKwlkc19kZWMoaC0+ZW50cnksICZtYXBwaW5ncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtLCB0bXAsICZtYXBwaW5ncywgbGlzdCkgeworCQlsaXN0X2RlbCgmbS0+bGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZtLT5saXN0KTsKKwkJX19tYXliZV9hZGRfbWFwcGluZyhtKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJbWVtcG9vbF9mcmVlKGgsIHBvb2wtPmVuZGlvX2hvb2tfcG9vbCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBXb3JrcXVldWUuCisgKi8KKworLyoKKyAqIFByZXBhcmVkIG1hcHBpbmcgam9icy4KKyAqLworCisvKgorICogVGhpcyBzZW5kcyB0aGUgYmlvcyBpbiB0aGUgY2VsbCBiYWNrIHRvIHRoZSBkZWZlcnJlZF9iaW9zIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIGNlbGxfZGVmZXIoc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBjZWxsICpjZWxsLAorCQkgICAgICAgZG1fYmxvY2tfdCBkYXRhX2Jsb2NrKQoreworCXN0cnVjdCBwb29sICpwb29sID0gdGMtPnBvb2w7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJY2VsbF9yZWxlYXNlKGNlbGwsICZwb29sLT5kZWZlcnJlZF9iaW9zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0Yy0+cG9vbC0+bG9jaywgZmxhZ3MpOworCisJd2FrZV93b3JrZXIocG9vbCk7Cit9CisKKy8qCisgKiBTYW1lIGFzIGNlbGxfZGVmZXIgYWJvdmUsIGV4Y2VwdCBpdCBvbWl0cyBvbmUgcGFydGljdWxhciBkZXRhaW5lZSwKKyAqIGEgd3JpdGUgYmlvIHRoYXQgY292ZXJzIHRoZSBibG9jayBhbmQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNlbGxfZGVmZXJfZXhjZXB0KHN0cnVjdCB0aGluX2MgKnRjLCBzdHJ1Y3QgY2VsbCAqY2VsbCwKKwkJCSAgICAgIHN0cnVjdCBiaW8gKmV4Y2VwdGlvbikKK3sKKwlzdHJ1Y3QgYmlvX2xpc3QgYmlvczsKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IHBvb2wgKnBvb2wgPSB0Yy0+cG9vbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYmlvX2xpc3RfaW5pdCgmYmlvcyk7CisJY2VsbF9yZWxlYXNlKGNlbGwsICZiaW9zKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AoJmJpb3MpKSkKKwkJaWYgKGJpbyAhPSBleGNlcHRpb24pCisJCQliaW9fbGlzdF9hZGQoJnBvb2wtPmRlZmVycmVkX2Jpb3MsIGJpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJd2FrZV93b3JrZXIocG9vbCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcHJlcGFyZWRfbWFwcGluZyhzdHJ1Y3QgbmV3X21hcHBpbmcgKm0pCit7CisJc3RydWN0IHRoaW5fYyAqdGMgPSBtLT50YzsKKwlzdHJ1Y3QgYmlvICpiaW87CisJaW50IHI7CisKKwliaW8gPSBtLT5iaW87CisJaWYgKGJpbykKKwkJYmlvLT5iaV9lbmRfaW8gPSBtLT5zYXZlZF9iaV9lbmRfaW87CisKKwlpZiAobS0+ZXJyKSB7CisJCWNlbGxfZXJyb3IobS0+Y2VsbCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIENvbW1pdCB0aGUgcHJlcGFyZWQgYmxvY2sgaW50byB0aGUgbWFwcGluZyBidHJlZS4KKwkgKiBBbnkgSS9PIGZvciB0aGlzIGJsb2NrIGFycml2aW5nIGFmdGVyIHRoaXMgcG9pbnQgd2lsbCBnZXQKKwkgKiByZW1hcHBlZCB0byBpdCBkaXJlY3RseS4KKwkgKi8KKwlyID0gZG1fdGhpbl9pbnNlcnRfYmxvY2sodGMtPnRkLCBtLT52aXJ0X2Jsb2NrLCBtLT5kYXRhX2Jsb2NrKTsKKwlpZiAocikgeworCQlETUVSUigiZG1fdGhpbl9pbnNlcnRfYmxvY2soKSBmYWlsZWQiKTsKKwkJY2VsbF9lcnJvcihtLT5jZWxsKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUmVsZWFzZSBhbnkgYmlvcyBoZWxkIHdoaWxlIHRoZSBibG9jayB3YXMgYmVpbmcgcHJvdmlzaW9uZWQuCisJICogSWYgd2UgYXJlIHByb2Nlc3NpbmcgYSB3cml0ZSBiaW8gdGhhdCBjb21wbGV0ZWx5IGNvdmVycyB0aGUgYmxvY2ssCisJICogd2UgYWxyZWFkeSBwcm9jZXNzZWQgaXQgc28gY2FuIGlnbm9yZSBpdCBub3cgd2hlbiBwcm9jZXNzaW5nCisJICogdGhlIGJpb3MgaW4gdGhlIGNlbGwuCisJICovCisJaWYgKGJpbykgeworCQljZWxsX2RlZmVyX2V4Y2VwdCh0YywgbS0+Y2VsbCwgYmlvKTsKKwkJYmlvX2VuZGlvKGJpbywgMCk7CisJfSBlbHNlCisJCWNlbGxfZGVmZXIodGMsIG0tPmNlbGwsIG0tPmRhdGFfYmxvY2spOworCisJbGlzdF9kZWwoJm0tPmxpc3QpOworCW1lbXBvb2xfZnJlZShtLCB0Yy0+cG9vbC0+bWFwcGluZ19wb29sKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19wcmVwYXJlZF9tYXBwaW5ncyhzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgbWFwczsKKwlzdHJ1Y3QgbmV3X21hcHBpbmcgKm0sICp0bXA7CisKKwlJTklUX0xJU1RfSEVBRCgmbWFwcyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZV9pbml0KCZwb29sLT5wcmVwYXJlZF9tYXBwaW5ncywgJm1hcHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtLCB0bXAsICZtYXBzLCBsaXN0KQorCQlwcm9jZXNzX3ByZXBhcmVkX21hcHBpbmcobSk7Cit9CisKKy8qCisgKiBEZWZlcnJlZCBiaW8gam9icy4KKyAqLworc3RhdGljIGludCBpb19vdmVyd3JpdGVzX2Jsb2NrKHN0cnVjdCBwb29sICpwb29sLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJcmV0dXJuICgoYmlvX2RhdGFfZGlyKGJpbykgPT0gV1JJVEUpICYmCisJCSEoYmlvLT5iaV9zZWN0b3IgJiBwb29sLT5vZmZzZXRfbWFzaykpICYmCisJCShiaW8tPmJpX3NpemUgPT0gKHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrIDw8IFNFQ1RPUl9TSElGVCkpOworfQorCitzdGF0aWMgdm9pZCBzYXZlX2FuZF9zZXRfZW5kaW8oc3RydWN0IGJpbyAqYmlvLCBiaW9fZW5kX2lvX3QgKipzYXZlLAorCQkJICAgICAgIGJpb19lbmRfaW9fdCAqZm4pCit7CisJKnNhdmUgPSBiaW8tPmJpX2VuZF9pbzsKKwliaW8tPmJpX2VuZF9pbyA9IGZuOworfQorCitzdGF0aWMgaW50IGVuc3VyZV9uZXh0X21hcHBpbmcoc3RydWN0IHBvb2wgKnBvb2wpCit7CisJaWYgKHBvb2wtPm5leHRfbWFwcGluZykKKwkJcmV0dXJuIDA7CisKKwlwb29sLT5uZXh0X21hcHBpbmcgPSBtZW1wb29sX2FsbG9jKHBvb2wtPm1hcHBpbmdfcG9vbCwgR0ZQX0FUT01JQyk7CisKKwlyZXR1cm4gcG9vbC0+bmV4dF9tYXBwaW5nID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV3X21hcHBpbmcgKmdldF9uZXh0X21hcHBpbmcoc3RydWN0IHBvb2wgKnBvb2wpCit7CisJc3RydWN0IG5ld19tYXBwaW5nICpyID0gcG9vbC0+bmV4dF9tYXBwaW5nOworCisJQlVHX09OKCFwb29sLT5uZXh0X21hcHBpbmcpOworCisJcG9vbC0+bmV4dF9tYXBwaW5nID0gTlVMTDsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV9jb3B5KHN0cnVjdCB0aGluX2MgKnRjLCBkbV9ibG9ja190IHZpcnRfYmxvY2ssCisJCQkgIGRtX2Jsb2NrX3QgZGF0YV9vcmlnaW4sIGRtX2Jsb2NrX3QgZGF0YV9kZXN0LAorCQkJICBzdHJ1Y3QgY2VsbCAqY2VsbCwgc3RydWN0IGJpbyAqYmlvKQoreworCWludCByOworCXN0cnVjdCBwb29sICpwb29sID0gdGMtPnBvb2w7CisJc3RydWN0IG5ld19tYXBwaW5nICptID0gZ2V0X25leHRfbWFwcGluZyhwb29sKTsKKworCUlOSVRfTElTVF9IRUFEKCZtLT5saXN0KTsKKwltLT5wcmVwYXJlZCA9IDA7CisJbS0+dGMgPSB0YzsKKwltLT52aXJ0X2Jsb2NrID0gdmlydF9ibG9jazsKKwltLT5kYXRhX2Jsb2NrID0gZGF0YV9kZXN0OworCW0tPmNlbGwgPSBjZWxsOworCW0tPmVyciA9IDA7CisJbS0+YmlvID0gTlVMTDsKKworCWRzX2FkZF93b3JrKCZwb29sLT5kcywgJm0tPmxpc3QpOworCisJLyoKKwkgKiBJTyB0byBwb29sX2RldiByZW1hcHMgdG8gdGhlIHBvb2wgdGFyZ2V0J3MgZGF0YV9kZXYuCisJICoKKwkgKiBJZiB0aGUgd2hvbGUgYmxvY2sgb2YgZGF0YSBpcyBiZWluZyBvdmVyd3JpdHRlbiwgd2UgY2FuIGlzc3VlIHRoZQorCSAqIGJpbyBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlIHdlIHVzZSBrY29weWQgdG8gY2xvbmUgdGhlIGRhdGEgZmlyc3QuCisJICovCisJaWYgKGlvX292ZXJ3cml0ZXNfYmxvY2socG9vbCwgYmlvKSkgeworCQltLT5iaW8gPSBiaW87CisJCXNhdmVfYW5kX3NldF9lbmRpbyhiaW8sICZtLT5zYXZlZF9iaV9lbmRfaW8sIG92ZXJ3cml0ZV9lbmRpbyk7CisJCWRtX2dldF9tYXBpbmZvKGJpbyktPnB0ciA9IG07CisJCXJlbWFwX2FuZF9pc3N1ZSh0YywgYmlvLCBkYXRhX2Rlc3QpOworCX0gZWxzZSB7CisJCXN0cnVjdCBkbV9pb19yZWdpb24gZnJvbSwgdG87CisKKwkJZnJvbS5iZGV2ID0gdGMtPnBvb2xfZGV2LT5iZGV2OworCQlmcm9tLnNlY3RvciA9IGRhdGFfb3JpZ2luICogcG9vbC0+c2VjdG9yc19wZXJfYmxvY2s7CisJCWZyb20uY291bnQgPSBwb29sLT5zZWN0b3JzX3Blcl9ibG9jazsKKworCQl0by5iZGV2ID0gdGMtPnBvb2xfZGV2LT5iZGV2OworCQl0by5zZWN0b3IgPSBkYXRhX2Rlc3QgKiBwb29sLT5zZWN0b3JzX3Blcl9ibG9jazsKKwkJdG8uY291bnQgPSBwb29sLT5zZWN0b3JzX3Blcl9ibG9jazsKKworCQlyID0gZG1fa2NvcHlkX2NvcHkocG9vbC0+Y29waWVyLCAmZnJvbSwgMSwgJnRvLAorCQkJCSAgIDAsIGNvcHlfY29tcGxldGUsIG0pOworCQlpZiAociA8IDApIHsKKwkJCW1lbXBvb2xfZnJlZShtLCBwb29sLT5tYXBwaW5nX3Bvb2wpOworCQkJRE1FUlIoImRtX2tjb3B5ZF9jb3B5KCkgZmFpbGVkIik7CisJCQljZWxsX2Vycm9yKGNlbGwpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV96ZXJvKHN0cnVjdCB0aGluX2MgKnRjLCBkbV9ibG9ja190IHZpcnRfYmxvY2ssCisJCQkgIGRtX2Jsb2NrX3QgZGF0YV9ibG9jaywgc3RydWN0IGNlbGwgKmNlbGwsCisJCQkgIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCXN0cnVjdCBuZXdfbWFwcGluZyAqbSA9IGdldF9uZXh0X21hcHBpbmcocG9vbCk7CisKKwlJTklUX0xJU1RfSEVBRCgmbS0+bGlzdCk7CisJbS0+cHJlcGFyZWQgPSAwOworCW0tPnRjID0gdGM7CisJbS0+dmlydF9ibG9jayA9IHZpcnRfYmxvY2s7CisJbS0+ZGF0YV9ibG9jayA9IGRhdGFfYmxvY2s7CisJbS0+Y2VsbCA9IGNlbGw7CisJbS0+ZXJyID0gMDsKKwltLT5iaW8gPSBOVUxMOworCisJLyoKKwkgKiBJZiB0aGUgd2hvbGUgYmxvY2sgb2YgZGF0YSBpcyBiZWluZyBvdmVyd3JpdHRlbiBvciB3ZSBhcmUgbm90CisJICogemVyb2luZyBwcmUtZXhpc3RpbmcgZGF0YSwgd2UgY2FuIGlzc3VlIHRoZSBiaW8gaW1tZWRpYXRlbHkuCisJICogT3RoZXJ3aXNlIHdlIHVzZSBrY29weWQgdG8gemVybyB0aGUgZGF0YSBmaXJzdC4KKwkgKi8KKwlpZiAoIXBvb2wtPnplcm9fbmV3X2Jsb2NrcykKKwkJcHJvY2Vzc19wcmVwYXJlZF9tYXBwaW5nKG0pOworCisJZWxzZSBpZiAoaW9fb3ZlcndyaXRlc19ibG9jayhwb29sLCBiaW8pKSB7CisJCW0tPmJpbyA9IGJpbzsKKwkJc2F2ZV9hbmRfc2V0X2VuZGlvKGJpbywgJm0tPnNhdmVkX2JpX2VuZF9pbywgb3ZlcndyaXRlX2VuZGlvKTsKKwkJZG1fZ2V0X21hcGluZm8oYmlvKS0+cHRyID0gbTsKKwkJcmVtYXBfYW5kX2lzc3VlKHRjLCBiaW8sIGRhdGFfYmxvY2spOworCisJfSBlbHNlIHsKKwkJaW50IHI7CisJCXN0cnVjdCBkbV9pb19yZWdpb24gdG87CisKKwkJdG8uYmRldiA9IHRjLT5wb29sX2Rldi0+YmRldjsKKwkJdG8uc2VjdG9yID0gZGF0YV9ibG9jayAqIHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrOworCQl0by5jb3VudCA9IHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrOworCisJCXIgPSBkbV9rY29weWRfemVybyhwb29sLT5jb3BpZXIsIDEsICZ0bywgMCwgY29weV9jb21wbGV0ZSwgbSk7CisJCWlmIChyIDwgMCkgeworCQkJbWVtcG9vbF9mcmVlKG0sIHBvb2wtPm1hcHBpbmdfcG9vbCk7CisJCQlETUVSUigiZG1fa2NvcHlkX3plcm8oKSBmYWlsZWQiKTsKKwkJCWNlbGxfZXJyb3IoY2VsbCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfZGF0YV9ibG9jayhzdHJ1Y3QgdGhpbl9jICp0YywgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCWRtX2Jsb2NrX3QgZnJlZV9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCisJciA9IGRtX3Bvb2xfZ2V0X2ZyZWVfYmxvY2tfY291bnQocG9vbC0+cG1kLCAmZnJlZV9ibG9ja3MpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChmcmVlX2Jsb2NrcyA8PSBwb29sLT5sb3dfd2F0ZXJfYmxvY2tzICYmICFwb29sLT5sb3dfd2F0ZXJfdHJpZ2dlcmVkKSB7CisJCURNV0FSTigiJXM6IHJlYWNoZWQgbG93IHdhdGVyIG1hcmssIHNlbmRpbmcgZXZlbnQuIiwKKwkJICAgICAgIGRtX2RldmljZV9uYW1lKHBvb2wtPnBvb2xfbWQpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJcG9vbC0+bG93X3dhdGVyX3RyaWdnZXJlZCA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJZG1fdGFibGVfZXZlbnQocG9vbC0+dGktPnRhYmxlKTsKKwl9CisKKwlpZiAoIWZyZWVfYmxvY2tzKSB7CisJCWlmIChwb29sLT5ub19mcmVlX3NwYWNlKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIFRyeSB0byBjb21taXQgdG8gc2VlIGlmIHRoYXQgd2lsbCBmcmVlIHVwIHNvbWUKKwkJCSAqIG1vcmUgc3BhY2UuCisJCQkgKi8KKwkJCXIgPSBkbV9wb29sX2NvbW1pdF9tZXRhZGF0YShwb29sLT5wbWQpOworCQkJaWYgKHIpIHsKKwkJCQlETUVSUigiJXM6IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwKKwkJCQkgICAgICBfX2Z1bmNfXywgcik7CisJCQkJcmV0dXJuIHI7CisJCQl9CisKKwkJCXIgPSBkbV9wb29sX2dldF9mcmVlX2Jsb2NrX2NvdW50KHBvb2wtPnBtZCwgJmZyZWVfYmxvY2tzKTsKKwkJCWlmIChyKQorCQkJCXJldHVybiByOworCisJCQkvKgorCQkJICogSWYgd2Ugc3RpbGwgaGF2ZSBubyBzcGFjZSB3ZSBzZXQgYSBmbGFnIHRvIGF2b2lkCisJCQkgKiBkb2luZyBhbGwgdGhpcyBjaGVja2luZyBhbmQgcmV0dXJuIC1FTk9TUEMuCisJCQkgKi8KKwkJCWlmICghZnJlZV9ibG9ja3MpIHsKKwkJCQlETVdBUk4oIiVzOiBubyBmcmVlIHNwYWNlIGF2YWlsYWJsZS4iLAorCQkJCSAgICAgICBkbV9kZXZpY2VfbmFtZShwb29sLT5wb29sX21kKSk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJCQlwb29sLT5ub19mcmVlX3NwYWNlID0gMTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQl9CisJCX0KKwl9CisKKwlyID0gZG1fcG9vbF9hbGxvY19kYXRhX2Jsb2NrKHBvb2wtPnBtZCwgcmVzdWx0KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElmIHdlIGhhdmUgcnVuIG91dCBvZiBzcGFjZSwgcXVldWUgYmlvcyB1bnRpbCB0aGUgZGV2aWNlIGlzCisgKiByZXN1bWVkLCBwcmVzdW1hYmx5IGFmdGVyIGhhdmluZyBiZWVuIHJlbG9hZGVkIHdpdGggbW9yZSBzcGFjZS4KKyAqLworc3RhdGljIHZvaWQgcmV0cnlfb25fcmVzdW1lKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgdGhpbl9jICp0YyA9IGRtX2dldF9tYXBpbmZvKGJpbyktPnB0cjsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCWJpb19saXN0X2FkZCgmcG9vbC0+cmV0cnlfb25fcmVzdW1lX2xpc3QsIGJpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBub19zcGFjZShzdHJ1Y3QgY2VsbCAqY2VsbCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGJpb19saXN0IGJpb3M7CisKKwliaW9fbGlzdF9pbml0KCZiaW9zKTsKKwljZWxsX3JlbGVhc2UoY2VsbCwgJmJpb3MpOworCisJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AoJmJpb3MpKSkKKwkJcmV0cnlfb25fcmVzdW1lKGJpbyk7Cit9CisKK3N0YXRpYyB2b2lkIGJyZWFrX3NoYXJpbmcoc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbywgZG1fYmxvY2tfdCBibG9jaywKKwkJCSAgc3RydWN0IGNlbGxfa2V5ICprZXksCisJCQkgIHN0cnVjdCBkbV90aGluX2xvb2t1cF9yZXN1bHQgKmxvb2t1cF9yZXN1bHQsCisJCQkgIHN0cnVjdCBjZWxsICpjZWxsKQoreworCWludCByOworCWRtX2Jsb2NrX3QgZGF0YV9ibG9jazsKKworCXIgPSBhbGxvY19kYXRhX2Jsb2NrKHRjLCAmZGF0YV9ibG9jayk7CisJc3dpdGNoIChyKSB7CisJY2FzZSAwOgorCQlzY2hlZHVsZV9jb3B5KHRjLCBibG9jaywgbG9va3VwX3Jlc3VsdC0+YmxvY2ssCisJCQkgICAgICBkYXRhX2Jsb2NrLCBjZWxsLCBiaW8pOworCQlicmVhazsKKworCWNhc2UgLUVOT1NQQzoKKwkJbm9fc3BhY2UoY2VsbCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRE1FUlIoIiVzOiBhbGxvY19kYXRhX2Jsb2NrKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwgX19mdW5jX18sIHIpOworCQljZWxsX2Vycm9yKGNlbGwpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc2hhcmVkX2JpbyhzdHJ1Y3QgdGhpbl9jICp0Yywgc3RydWN0IGJpbyAqYmlvLAorCQkJICAgICAgIGRtX2Jsb2NrX3QgYmxvY2ssCisJCQkgICAgICAgc3RydWN0IGRtX3RoaW5fbG9va3VwX3Jlc3VsdCAqbG9va3VwX3Jlc3VsdCkKK3sKKwlzdHJ1Y3QgY2VsbCAqY2VsbDsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCXN0cnVjdCBjZWxsX2tleSBrZXk7CisKKwkvKgorCSAqIElmIGNlbGwgaXMgYWxyZWFkeSBvY2N1cGllZCwgdGhlbiBzaGFyaW5nIGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3MKKwkgKiBvZiBiZWluZyBicm9rZW4gc28gd2UgaGF2ZSBub3RoaW5nIGZ1cnRoZXIgdG8gZG8gaGVyZS4KKwkgKi8KKwlidWlsZF9kYXRhX2tleSh0Yy0+dGQsIGxvb2t1cF9yZXN1bHQtPmJsb2NrLCAma2V5KTsKKwlpZiAoYmlvX2RldGFpbihwb29sLT5wcmlzb24sICZrZXksIGJpbywgJmNlbGwpKQorCQlyZXR1cm47CisKKwlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gV1JJVEUpCisJCWJyZWFrX3NoYXJpbmcodGMsIGJpbywgYmxvY2ssICZrZXksIGxvb2t1cF9yZXN1bHQsIGNlbGwpOworCWVsc2UgeworCQlzdHJ1Y3QgZW5kaW9faG9vayAqaDsKKwkJaCA9IG1lbXBvb2xfYWxsb2MocG9vbC0+ZW5kaW9faG9va19wb29sLCBHRlBfTk9JTyk7CisKKwkJaC0+dGMgPSB0YzsKKwkJaC0+ZW50cnkgPSBkc19pbmMoJnBvb2wtPmRzKTsKKwkJc2F2ZV9hbmRfc2V0X2VuZGlvKGJpbywgJmgtPnNhdmVkX2JpX2VuZF9pbywgc2hhcmVkX3JlYWRfZW5kaW8pOworCQlkbV9nZXRfbWFwaW5mbyhiaW8pLT5wdHIgPSBoOworCisJCWNlbGxfcmVsZWFzZV9zaW5nbGV0b24oY2VsbCwgYmlvKTsKKwkJcmVtYXBfYW5kX2lzc3VlKHRjLCBiaW8sIGxvb2t1cF9yZXN1bHQtPmJsb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByb3Zpc2lvbl9ibG9jayhzdHJ1Y3QgdGhpbl9jICp0Yywgc3RydWN0IGJpbyAqYmlvLCBkbV9ibG9ja190IGJsb2NrLAorCQkJICAgIHN0cnVjdCBjZWxsICpjZWxsKQoreworCWludCByOworCWRtX2Jsb2NrX3QgZGF0YV9ibG9jazsKKworCS8qCisJICogUmVtYXAgZW1wdHkgYmlvcyAoZmx1c2hlcykgaW1tZWRpYXRlbHksIHdpdGhvdXQgcHJvdmlzaW9uaW5nLgorCSAqLworCWlmICghYmlvLT5iaV9zaXplKSB7CisJCWNlbGxfcmVsZWFzZV9zaW5nbGV0b24oY2VsbCwgYmlvKTsKKwkJcmVtYXBfYW5kX2lzc3VlKHRjLCBiaW8sIDApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBGaWxsIHJlYWQgYmlvcyB3aXRoIHplcm9lcyBhbmQgY29tcGxldGUgdGhlbSBpbW1lZGlhdGVseS4KKwkgKi8KKwlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkgeworCQl6ZXJvX2ZpbGxfYmlvKGJpbyk7CisJCWNlbGxfcmVsZWFzZV9zaW5nbGV0b24oY2VsbCwgYmlvKTsKKwkJYmlvX2VuZGlvKGJpbywgMCk7CisJCXJldHVybjsKKwl9CisKKwlyID0gYWxsb2NfZGF0YV9ibG9jayh0YywgJmRhdGFfYmxvY2spOworCXN3aXRjaCAocikgeworCWNhc2UgMDoKKwkJc2NoZWR1bGVfemVybyh0YywgYmxvY2ssIGRhdGFfYmxvY2ssIGNlbGwsIGJpbyk7CisJCWJyZWFrOworCisJY2FzZSAtRU5PU1BDOgorCQlub19zcGFjZShjZWxsKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlETUVSUigiJXM6IGFsbG9jX2RhdGFfYmxvY2soKSBmYWlsZWQsIGVycm9yID0gJWQiLCBfX2Z1bmNfXywgcik7CisJCWNlbGxfZXJyb3IoY2VsbCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19iaW8oc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgcjsKKwlkbV9ibG9ja190IGJsb2NrID0gZ2V0X2Jpb19ibG9jayh0YywgYmlvKTsKKwlzdHJ1Y3QgY2VsbCAqY2VsbDsKKwlzdHJ1Y3QgY2VsbF9rZXkga2V5OworCXN0cnVjdCBkbV90aGluX2xvb2t1cF9yZXN1bHQgbG9va3VwX3Jlc3VsdDsKKworCS8qCisJICogSWYgY2VsbCBpcyBhbHJlYWR5IG9jY3VwaWVkLCB0aGVuIHRoZSBibG9jayBpcyBhbHJlYWR5CisJICogYmVpbmcgcHJvdmlzaW9uZWQgc28gd2UgaGF2ZSBub3RoaW5nIGZ1cnRoZXIgdG8gZG8gaGVyZS4KKwkgKi8KKwlidWlsZF92aXJ0dWFsX2tleSh0Yy0+dGQsIGJsb2NrLCAma2V5KTsKKwlpZiAoYmlvX2RldGFpbih0Yy0+cG9vbC0+cHJpc29uLCAma2V5LCBiaW8sICZjZWxsKSkKKwkJcmV0dXJuOworCisJciA9IGRtX3RoaW5fZmluZF9ibG9jayh0Yy0+dGQsIGJsb2NrLCAxLCAmbG9va3VwX3Jlc3VsdCk7CisJc3dpdGNoIChyKSB7CisJY2FzZSAwOgorCQkvKgorCQkgKiBXZSBjYW4gcmVsZWFzZSB0aGlzIGNlbGwgbm93LiAgVGhpcyB0aHJlYWQgaXMgdGhlIG9ubHkKKwkJICogb25lIHRoYXQgcHV0cyBiaW9zIGludG8gYSBjZWxsLCBhbmQgd2Uga25vdyB0aGVyZSB3ZXJlCisJCSAqIG5vIHByZWNlZGluZyBiaW9zLgorCQkgKi8KKwkJLyoKKwkJICogVE9ETzogdGhpcyB3aWxsIHByb2JhYmx5IGhhdmUgdG8gY2hhbmdlIHdoZW4gZGlzY2FyZCBnb2VzCisJCSAqIGJhY2sgaW4uCisJCSAqLworCQljZWxsX3JlbGVhc2Vfc2luZ2xldG9uKGNlbGwsIGJpbyk7CisKKwkJaWYgKGxvb2t1cF9yZXN1bHQuc2hhcmVkKQorCQkJcHJvY2Vzc19zaGFyZWRfYmlvKHRjLCBiaW8sIGJsb2NrLCAmbG9va3VwX3Jlc3VsdCk7CisJCWVsc2UKKwkJCXJlbWFwX2FuZF9pc3N1ZSh0YywgYmlvLCBsb29rdXBfcmVzdWx0LmJsb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIC1FTk9EQVRBOgorCQlwcm92aXNpb25fYmxvY2sodGMsIGJpbywgYmxvY2ssIGNlbGwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURNRVJSKCJkbV90aGluX2ZpbmRfYmxvY2soKSBmYWlsZWQsIGVycm9yID0gJWQiLCByKTsKKwkJYmlvX2lvX2Vycm9yKGJpbyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19kZWZlcnJlZF9iaW9zKHN0cnVjdCBwb29sICpwb29sKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGJpbyAqYmlvOworCXN0cnVjdCBiaW9fbGlzdCBiaW9zOworCWludCByOworCisJYmlvX2xpc3RfaW5pdCgmYmlvcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCWJpb19saXN0X21lcmdlKCZiaW9zLCAmcG9vbC0+ZGVmZXJyZWRfYmlvcyk7CisJYmlvX2xpc3RfaW5pdCgmcG9vbC0+ZGVmZXJyZWRfYmlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AoJmJpb3MpKSkgeworCQlzdHJ1Y3QgdGhpbl9jICp0YyA9IGRtX2dldF9tYXBpbmZvKGJpbyktPnB0cjsKKwkJLyoKKwkJICogSWYgd2UndmUgZ290IG5vIGZyZWUgbmV3X21hcHBpbmcgc3RydWN0cywgYW5kIHByb2Nlc3NpbmcKKwkJICogdGhpcyBiaW8gbWlnaHQgcmVxdWlyZSBvbmUsIHdlIHBhdXNlIHVudGlsIHRoZXJlIGFyZSBzb21lCisJCSAqIHByZXBhcmVkIG1hcHBpbmdzIHRvIHByb2Nlc3MuCisJCSAqLworCQlpZiAoZW5zdXJlX25leHRfbWFwcGluZyhwb29sKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJCWJpb19saXN0X21lcmdlKCZwb29sLT5kZWZlcnJlZF9iaW9zLCAmYmlvcyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwkJCWJyZWFrOworCQl9CisJCXByb2Nlc3NfYmlvKHRjLCBiaW8pOworCX0KKworCS8qCisJICogSWYgdGhlcmUgYXJlIGFueSBkZWZlcnJlZCBmbHVzaCBiaW9zLCB3ZSBtdXN0IGNvbW1pdAorCSAqIHRoZSBtZXRhZGF0YSBiZWZvcmUgaXNzdWluZyB0aGVtLgorCSAqLworCWJpb19saXN0X2luaXQoJmJpb3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJYmlvX2xpc3RfbWVyZ2UoJmJpb3MsICZwb29sLT5kZWZlcnJlZF9mbHVzaF9iaW9zKTsKKwliaW9fbGlzdF9pbml0KCZwb29sLT5kZWZlcnJlZF9mbHVzaF9iaW9zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoYmlvX2xpc3RfZW1wdHkoJmJpb3MpKQorCQlyZXR1cm47CisKKwlyID0gZG1fcG9vbF9jb21taXRfbWV0YWRhdGEocG9vbC0+cG1kKTsKKwlpZiAocikgeworCQlETUVSUigiJXM6IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwKKwkJICAgICAgX19mdW5jX18sIHIpOworCQl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKQorCQkJYmlvX2lvX2Vycm9yKGJpbyk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKQorCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOworfQorCitzdGF0aWMgdm9pZCBkb193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IGNvbnRhaW5lcl9vZih3cywgc3RydWN0IHBvb2wsIHdvcmtlcik7CisKKwlwcm9jZXNzX3ByZXBhcmVkX21hcHBpbmdzKHBvb2wpOworCXByb2Nlc3NfZGVmZXJyZWRfYmlvcyhwb29sKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIE1hcHBpbmcgZnVuY3Rpb25zLgorICovCisKKy8qCisgKiBDYWxsZWQgb25seSB3aGlsZSBtYXBwaW5nIGEgdGhpbiBiaW8gdG8gaGFuZCBpdCBvdmVyIHRvIHRoZSB3b3JrcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHRoaW5fZGVmZXJfYmlvKHN0cnVjdCB0aGluX2MgKnRjLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwliaW9fbGlzdF9hZGQoJnBvb2wtPmRlZmVycmVkX2Jpb3MsIGJpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJd2FrZV93b3JrZXIocG9vbCk7Cit9CisKKy8qCisgKiBOb24tYmxvY2tpbmcgZnVuY3Rpb24gY2FsbGVkIGZyb20gdGhlIHRoaW4gdGFyZ2V0J3MgbWFwIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IHRoaW5fYmlvX21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLAorCQkJdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KQoreworCWludCByOworCXN0cnVjdCB0aGluX2MgKnRjID0gdGktPnByaXZhdGU7CisJZG1fYmxvY2tfdCBibG9jayA9IGdldF9iaW9fYmxvY2sodGMsIGJpbyk7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCA9IHRjLT50ZDsKKwlzdHJ1Y3QgZG1fdGhpbl9sb29rdXBfcmVzdWx0IHJlc3VsdDsKKworCS8qCisJICogU2F2ZSB0aGUgdGhpbiBjb250ZXh0IGZvciBlYXN5IGFjY2VzcyBmcm9tIHRoZSBkZWZlcnJlZCBiaW8gbGF0ZXIuCisJICovCisJbWFwX2NvbnRleHQtPnB0ciA9IHRjOworCisJaWYgKGJpby0+YmlfcncgJiAoUkVRX0ZMVVNIIHwgUkVRX0ZVQSkpIHsKKwkJdGhpbl9kZWZlcl9iaW8odGMsIGJpbyk7CisJCXJldHVybiBETV9NQVBJT19TVUJNSVRURUQ7CisJfQorCisJciA9IGRtX3RoaW5fZmluZF9ibG9jayh0ZCwgYmxvY2ssIDAsICZyZXN1bHQpOworCisJLyoKKwkgKiBOb3RlIHRoYXQgd2UgZGVmZXIgcmVhZGFoZWFkIHRvby4KKwkgKi8KKwlzd2l0Y2ggKHIpIHsKKwljYXNlIDA6CisJCWlmICh1bmxpa2VseShyZXN1bHQuc2hhcmVkKSkgeworCQkJLyoKKwkJCSAqIFdlIGhhdmUgYSByYWNlIGNvbmRpdGlvbiBoZXJlIGJldHdlZW4gdGhlCisJCQkgKiByZXN1bHQuc2hhcmVkIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBsb29rdXAgYW5kCisJCQkgKiBzbmFwc2hvdCBjcmVhdGlvbiwgd2hpY2ggbWF5IGNhdXNlIG5ldworCQkJICogc2hhcmluZy4KKwkJCSAqCisJCQkgKiBUbyBhdm9pZCB0aGlzIGFsd2F5cyBxdWllc2NlIHRoZSBvcmlnaW4gYmVmb3JlCisJCQkgKiB0YWtpbmcgdGhlIHNuYXAuICBZb3Ugd2FudCB0byBkbyB0aGlzIGFueXdheSB0bworCQkJICogZW5zdXJlIGEgY29uc2lzdGVudCBhcHBsaWNhdGlvbiB2aWV3CisJCQkgKiAoaS5lLiBsb2NrZnMpLgorCQkJICoKKwkJCSAqIE1vcmUgZGlzdGFudCBhbmNlc3RvcnMgYXJlIGlycmVsZXZhbnQuIFRoZQorCQkJICogc2hhcmVkIGZsYWcgd2lsbCBiZSBzZXQgaW4gdGhlaXIgY2FzZS4KKwkJCSAqLworCQkJdGhpbl9kZWZlcl9iaW8odGMsIGJpbyk7CisJCQlyID0gRE1fTUFQSU9fU1VCTUlUVEVEOworCQl9IGVsc2UgeworCQkJcmVtYXAodGMsIGJpbywgcmVzdWx0LmJsb2NrKTsKKwkJCXIgPSBETV9NQVBJT19SRU1BUFBFRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgLUVOT0RBVEE6CisJCS8qCisJCSAqIEluIGZ1dHVyZSwgdGhlIGZhaWxlZCBkbV90aGluX2ZpbmRfYmxvY2sgYWJvdmUgY291bGQKKwkJICogcHJvdmlkZSB0aGUgaGludCB0byBsb2FkIHRoZSBtZXRhZGF0YSBpbnRvIGNhY2hlLgorCQkgKi8KKwljYXNlIC1FV09VTERCTE9DSzoKKwkJdGhpbl9kZWZlcl9iaW8odGMsIGJpbyk7CisJCXIgPSBETV9NQVBJT19TVUJNSVRURUQ7CisJCWJyZWFrOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHBvb2xfaXNfY29uZ2VzdGVkKHN0cnVjdCBkbV90YXJnZXRfY2FsbGJhY2tzICpjYiwgaW50IGJkaV9iaXRzKQoreworCWludCByOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBvb2xfYyAqcHQgPSBjb250YWluZXJfb2YoY2IsIHN0cnVjdCBwb29sX2MsIGNhbGxiYWNrcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHQtPnBvb2wtPmxvY2ssIGZsYWdzKTsKKwlyID0gIWJpb19saXN0X2VtcHR5KCZwdC0+cG9vbC0+cmV0cnlfb25fcmVzdW1lX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnB0LT5wb29sLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXIpIHsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShwdC0+ZGF0YV9kZXYtPmJkZXYpOworCQlyID0gYmRpX2Nvbmdlc3RlZCgmcS0+YmFja2luZ19kZXZfaW5mbywgYmRpX2JpdHMpOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBfX3JlcXVldWVfYmlvcyhzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwliaW9fbGlzdF9tZXJnZSgmcG9vbC0+ZGVmZXJyZWRfYmlvcywgJnBvb2wtPnJldHJ5X29uX3Jlc3VtZV9saXN0KTsKKwliaW9fbGlzdF9pbml0KCZwb29sLT5yZXRyeV9vbl9yZXN1bWVfbGlzdCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmluZGluZyBvZiBjb250cm9sIHRhcmdldHMgdG8gYSBwb29sIG9iamVjdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGJpbmRfY29udHJvbF90YXJnZXQoc3RydWN0IHBvb2wgKnBvb2wsIHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisKKwlwb29sLT50aSA9IHRpOworCXBvb2wtPmxvd193YXRlcl9ibG9ja3MgPSBwdC0+bG93X3dhdGVyX2Jsb2NrczsKKwlwb29sLT56ZXJvX25ld19ibG9ja3MgPSBwdC0+emVyb19uZXdfYmxvY2tzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVuYmluZF9jb250cm9sX3RhcmdldChzdHJ1Y3QgcG9vbCAqcG9vbCwgc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJaWYgKHBvb2wtPnRpID09IHRpKQorCQlwb29sLT50aSA9IE5VTEw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9vbCBjcmVhdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBfX3Bvb2xfZGVzdHJveShzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwlfX3Bvb2xfdGFibGVfcmVtb3ZlKHBvb2wpOworCisJaWYgKGRtX3Bvb2xfbWV0YWRhdGFfY2xvc2UocG9vbC0+cG1kKSA8IDApCisJCURNV0FSTigiJXM6IGRtX3Bvb2xfbWV0YWRhdGFfY2xvc2UoKSBmYWlsZWQuIiwgX19mdW5jX18pOworCisJcHJpc29uX2Rlc3Ryb3kocG9vbC0+cHJpc29uKTsKKwlkbV9rY29weWRfY2xpZW50X2Rlc3Ryb3kocG9vbC0+Y29waWVyKTsKKworCWlmIChwb29sLT53cSkKKwkJZGVzdHJveV93b3JrcXVldWUocG9vbC0+d3EpOworCisJaWYgKHBvb2wtPm5leHRfbWFwcGluZykKKwkJbWVtcG9vbF9mcmVlKHBvb2wtPm5leHRfbWFwcGluZywgcG9vbC0+bWFwcGluZ19wb29sKTsKKwltZW1wb29sX2Rlc3Ryb3kocG9vbC0+bWFwcGluZ19wb29sKTsKKwltZW1wb29sX2Rlc3Ryb3kocG9vbC0+ZW5kaW9faG9va19wb29sKTsKKwlrZnJlZShwb29sKTsKK30KKworc3RhdGljIHN0cnVjdCBwb29sICpwb29sX2NyZWF0ZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqcG9vbF9tZCwKKwkJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICptZXRhZGF0YV9kZXYsCisJCQkJdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCBjaGFyICoqZXJyb3IpCit7CisJaW50IHI7CisJdm9pZCAqZXJyX3A7CisJc3RydWN0IHBvb2wgKnBvb2w7CisJc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZDsKKworCXBtZCA9IGRtX3Bvb2xfbWV0YWRhdGFfb3BlbihtZXRhZGF0YV9kZXYsIGJsb2NrX3NpemUpOworCWlmIChJU19FUlIocG1kKSkgeworCQkqZXJyb3IgPSAiRXJyb3IgY3JlYXRpbmcgbWV0YWRhdGEgb2JqZWN0IjsKKwkJcmV0dXJuIChzdHJ1Y3QgcG9vbCAqKXBtZDsKKwl9CisKKwlwb29sID0ga21hbGxvYyhzaXplb2YoKnBvb2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvb2wpIHsKKwkJKmVycm9yID0gIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGZvciBwb29sIjsKKwkJZXJyX3AgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIGJhZF9wb29sOworCX0KKworCXBvb2wtPnBtZCA9IHBtZDsKKwlwb29sLT5zZWN0b3JzX3Blcl9ibG9jayA9IGJsb2NrX3NpemU7CisJcG9vbC0+YmxvY2tfc2hpZnQgPSBmZnMoYmxvY2tfc2l6ZSkgLSAxOworCXBvb2wtPm9mZnNldF9tYXNrID0gYmxvY2tfc2l6ZSAtIDE7CisJcG9vbC0+bG93X3dhdGVyX2Jsb2NrcyA9IDA7CisJcG9vbC0+emVyb19uZXdfYmxvY2tzID0gMTsKKwlwb29sLT5wcmlzb24gPSBwcmlzb25fY3JlYXRlKFBSSVNPTl9DRUxMUyk7CisJaWYgKCFwb29sLT5wcmlzb24pIHsKKwkJKmVycm9yID0gIkVycm9yIGNyZWF0aW5nIHBvb2wncyBiaW8gcHJpc29uIjsKKwkJZXJyX3AgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIGJhZF9wcmlzb247CisJfQorCisJcG9vbC0+Y29waWVyID0gZG1fa2NvcHlkX2NsaWVudF9jcmVhdGUoKTsKKwlpZiAoSVNfRVJSKHBvb2wtPmNvcGllcikpIHsKKwkJciA9IFBUUl9FUlIocG9vbC0+Y29waWVyKTsKKwkJKmVycm9yID0gIkVycm9yIGNyZWF0aW5nIHBvb2wncyBrY29weWQgY2xpZW50IjsKKwkJZXJyX3AgPSBFUlJfUFRSKHIpOworCQlnb3RvIGJhZF9rY29weWRfY2xpZW50OworCX0KKworCS8qCisJICogQ3JlYXRlIHNpbmdsZXRocmVhZGVkIHdvcmtxdWV1ZSB0aGF0IHdpbGwgc2VydmljZSBhbGwgZGV2aWNlcworCSAqIHRoYXQgdXNlIHRoaXMgbWV0YWRhdGEuCisJICovCisJcG9vbC0+d3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgiZG0tIiBETV9NU0dfUFJFRklYLCBXUV9NRU1fUkVDTEFJTSk7CisJaWYgKCFwb29sLT53cSkgeworCQkqZXJyb3IgPSAiRXJyb3IgY3JlYXRpbmcgcG9vbCdzIHdvcmtxdWV1ZSI7CisJCWVycl9wID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBiYWRfd3E7CisJfQorCisJSU5JVF9XT1JLKCZwb29sLT53b3JrZXIsIGRvX3dvcmtlcik7CisJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOworCWJpb19saXN0X2luaXQoJnBvb2wtPmRlZmVycmVkX2Jpb3MpOworCWJpb19saXN0X2luaXQoJnBvb2wtPmRlZmVycmVkX2ZsdXNoX2Jpb3MpOworCUlOSVRfTElTVF9IRUFEKCZwb29sLT5wcmVwYXJlZF9tYXBwaW5ncyk7CisJcG9vbC0+bG93X3dhdGVyX3RyaWdnZXJlZCA9IDA7CisJcG9vbC0+bm9fZnJlZV9zcGFjZSA9IDA7CisJYmlvX2xpc3RfaW5pdCgmcG9vbC0+cmV0cnlfb25fcmVzdW1lX2xpc3QpOworCWRzX2luaXQoJnBvb2wtPmRzKTsKKworCXBvb2wtPm5leHRfbWFwcGluZyA9IE5VTEw7CisJcG9vbC0+bWFwcGluZ19wb29sID0KKwkJbWVtcG9vbF9jcmVhdGVfa21hbGxvY19wb29sKE1BUFBJTkdfUE9PTF9TSVpFLCBzaXplb2Yoc3RydWN0IG5ld19tYXBwaW5nKSk7CisJaWYgKCFwb29sLT5tYXBwaW5nX3Bvb2wpIHsKKwkJKmVycm9yID0gIkVycm9yIGNyZWF0aW5nIHBvb2wncyBtYXBwaW5nIG1lbXBvb2wiOworCQllcnJfcCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gYmFkX21hcHBpbmdfcG9vbDsKKwl9CisKKwlwb29sLT5lbmRpb19ob29rX3Bvb2wgPQorCQltZW1wb29sX2NyZWF0ZV9rbWFsbG9jX3Bvb2woRU5ESU9fSE9PS19QT09MX1NJWkUsIHNpemVvZihzdHJ1Y3QgZW5kaW9faG9vaykpOworCWlmICghcG9vbC0+ZW5kaW9faG9va19wb29sKSB7CisJCSplcnJvciA9ICJFcnJvciBjcmVhdGluZyBwb29sJ3MgZW5kaW9faG9vayBtZW1wb29sIjsKKwkJZXJyX3AgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIGJhZF9lbmRpb19ob29rX3Bvb2w7CisJfQorCXBvb2wtPnJlZl9jb3VudCA9IDE7CisJcG9vbC0+cG9vbF9tZCA9IHBvb2xfbWQ7CisJcG9vbC0+bWRfZGV2ID0gbWV0YWRhdGFfZGV2OworCV9fcG9vbF90YWJsZV9pbnNlcnQocG9vbCk7CisKKwlyZXR1cm4gcG9vbDsKKworYmFkX2VuZGlvX2hvb2tfcG9vbDoKKwltZW1wb29sX2Rlc3Ryb3kocG9vbC0+bWFwcGluZ19wb29sKTsKK2JhZF9tYXBwaW5nX3Bvb2w6CisJZGVzdHJveV93b3JrcXVldWUocG9vbC0+d3EpOworYmFkX3dxOgorCWRtX2tjb3B5ZF9jbGllbnRfZGVzdHJveShwb29sLT5jb3BpZXIpOworYmFkX2tjb3B5ZF9jbGllbnQ6CisJcHJpc29uX2Rlc3Ryb3kocG9vbC0+cHJpc29uKTsKK2JhZF9wcmlzb246CisJa2ZyZWUocG9vbCk7CitiYWRfcG9vbDoKKwlpZiAoZG1fcG9vbF9tZXRhZGF0YV9jbG9zZShwbWQpKQorCQlETVdBUk4oIiVzOiBkbV9wb29sX21ldGFkYXRhX2Nsb3NlKCkgZmFpbGVkLiIsIF9fZnVuY19fKTsKKworCXJldHVybiBlcnJfcDsKK30KKworc3RhdGljIHZvaWQgX19wb29sX2luYyhzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KSk7CisJcG9vbC0+cmVmX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkIF9fcG9vbF9kZWMoc3RydWN0IHBvb2wgKnBvb2wpCit7CisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCkpOworCUJVR19PTighcG9vbC0+cmVmX2NvdW50KTsKKwlpZiAoIS0tcG9vbC0+cmVmX2NvdW50KQorCQlfX3Bvb2xfZGVzdHJveShwb29sKTsKK30KKworc3RhdGljIHN0cnVjdCBwb29sICpfX3Bvb2xfZmluZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqcG9vbF9tZCwKKwkJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICptZXRhZGF0YV9kZXYsCisJCQkJdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCBjaGFyICoqZXJyb3IpCit7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBfX3Bvb2xfdGFibGVfbG9va3VwX21ldGFkYXRhX2RldihtZXRhZGF0YV9kZXYpOworCisJaWYgKHBvb2wpIHsKKwkJaWYgKHBvb2wtPnBvb2xfbWQgIT0gcG9vbF9tZCkKKwkJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisJCV9fcG9vbF9pbmMocG9vbCk7CisKKwl9IGVsc2UgeworCQlwb29sID0gX19wb29sX3RhYmxlX2xvb2t1cChwb29sX21kKTsKKwkJaWYgKHBvb2wpIHsKKwkJCWlmIChwb29sLT5tZF9kZXYgIT0gbWV0YWRhdGFfZGV2KQorCQkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQkJX19wb29sX2luYyhwb29sKTsKKworCQl9IGVsc2UKKwkJCXBvb2wgPSBwb29sX2NyZWF0ZShwb29sX21kLCBtZXRhZGF0YV9kZXYsIGJsb2NrX3NpemUsIGVycm9yKTsKKwl9CisKKwlyZXR1cm4gcG9vbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb29sIHRhcmdldCBtZXRob2RzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHBvb2xfZHRyKHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisKKwltdXRleF9sb2NrKCZkbV90aGluX3Bvb2xfdGFibGUubXV0ZXgpOworCisJdW5iaW5kX2NvbnRyb2xfdGFyZ2V0KHB0LT5wb29sLCB0aSk7CisJX19wb29sX2RlYyhwdC0+cG9vbCk7CisJZG1fcHV0X2RldmljZSh0aSwgcHQtPm1ldGFkYXRhX2Rldik7CisJZG1fcHV0X2RldmljZSh0aSwgcHQtPmRhdGFfZGV2KTsKKwlrZnJlZShwdCk7CisKKwltdXRleF91bmxvY2soJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7Cit9CisKK3N0cnVjdCBwb29sX2ZlYXR1cmVzIHsKKwl1bnNpZ25lZCB6ZXJvX25ld19ibG9ja3M6MTsKK307CisKK3N0YXRpYyBpbnQgcGFyc2VfcG9vbF9mZWF0dXJlcyhzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsIHN0cnVjdCBwb29sX2ZlYXR1cmVzICpwZiwKKwkJCSAgICAgICBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ19uYW1lOworCisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKKwkJezAsIDEsICJJbnZhbGlkIG51bWJlciBvZiBwb29sIGZlYXR1cmUgYXJndW1lbnRzIn0sCisJfTsKKworCS8qCisJICogTm8gZmVhdHVyZSBhcmd1bWVudHMgc3VwcGxpZWQuCisJICovCisJaWYgKCFhcy0+YXJnYykKKwkJcmV0dXJuIDA7CisKKwlyID0gZG1fcmVhZF9hcmdfZ3JvdXAoX2FyZ3MsIGFzLCAmYXJnYywgJnRpLT5lcnJvcik7CisJaWYgKHIpCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKGFyZ2MgJiYgIXIpIHsKKwkJYXJnX25hbWUgPSBkbV9zaGlmdF9hcmcoYXMpOworCQlhcmdjLS07CisKKwkJaWYgKCFzdHJjYXNlY21wKGFyZ19uYW1lLCAic2tpcF9ibG9ja196ZXJvaW5nIikpIHsKKwkJCXBmLT56ZXJvX25ld19ibG9ja3MgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQl0aS0+ZXJyb3IgPSAiVW5yZWNvZ25pc2VkIHBvb2wgZmVhdHVyZSByZXF1ZXN0ZWQiOworCQlyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIHRoaW4tcG9vbCA8bWV0YWRhdGEgZGV2PiA8ZGF0YSBkZXY+CisgKgkgICAgIDxkYXRhIGJsb2NrIHNpemUgKHNlY3RvcnMpPgorICoJICAgICA8bG93IHdhdGVyIG1hcmsgKGJsb2Nrcyk+CisgKgkgICAgIFs8I2ZlYXR1cmUgYXJncz4gWzxhcmc+XSpdCisgKgorICogT3B0aW9uYWwgZmVhdHVyZSBhcmd1bWVudHMgYXJlOgorICoJICAgICBza2lwX2Jsb2NrX3plcm9pbmc6IHNraXBzIHRoZSB6ZXJvaW5nIG9mIG5ld2x5LXByb3Zpc2lvbmVkIGJsb2Nrcy4KKyAqLworc3RhdGljIGludCBwb29sX2N0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHI7CisJc3RydWN0IHBvb2xfYyAqcHQ7CisJc3RydWN0IHBvb2wgKnBvb2w7CisJc3RydWN0IHBvb2xfZmVhdHVyZXMgcGY7CisJc3RydWN0IGRtX2FyZ19zZXQgYXM7CisJc3RydWN0IGRtX2RldiAqZGF0YV9kZXY7CisJdW5zaWduZWQgbG9uZyBibG9ja19zaXplOworCWRtX2Jsb2NrX3QgbG93X3dhdGVyX2Jsb2NrczsKKwlzdHJ1Y3QgZG1fZGV2ICptZXRhZGF0YV9kZXY7CisJc2VjdG9yX3QgbWV0YWRhdGFfZGV2X3NpemU7CisKKwkvKgorCSAqIEZJWE1FIFJlbW92ZSB2YWxpZGF0aW9uIGZyb20gc2NvcGUgb2YgbG9jay4KKwkgKi8KKwltdXRleF9sb2NrKCZkbV90aGluX3Bvb2xfdGFibGUubXV0ZXgpOworCisJaWYgKGFyZ2MgPCA0KSB7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGFyZ3VtZW50IGNvdW50IjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJYXMuYXJnYyA9IGFyZ2M7CisJYXMuYXJndiA9IGFyZ3Y7CisKKwlyID0gZG1fZ2V0X2RldmljZSh0aSwgYXJndlswXSwgRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFLCAmbWV0YWRhdGFfZGV2KTsKKwlpZiAocikgeworCQl0aS0+ZXJyb3IgPSAiRXJyb3Igb3BlbmluZyBtZXRhZGF0YSBibG9jayBkZXZpY2UiOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJbWV0YWRhdGFfZGV2X3NpemUgPSBpX3NpemVfcmVhZChtZXRhZGF0YV9kZXYtPmJkZXYtPmJkX2lub2RlKSA+PiBTRUNUT1JfU0hJRlQ7CisJaWYgKG1ldGFkYXRhX2Rldl9zaXplID4gTUVUQURBVEFfREVWX01BWF9TRUNUT1JTKSB7CisJCXRpLT5lcnJvciA9ICJNZXRhZGF0YSBkZXZpY2UgaXMgdG9vIGxhcmdlIjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X21ldGFkYXRhOworCX0KKworCXIgPSBkbV9nZXRfZGV2aWNlKHRpLCBhcmd2WzFdLCBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUsICZkYXRhX2Rldik7CisJaWYgKHIpIHsKKwkJdGktPmVycm9yID0gIkVycm9yIGdldHRpbmcgZGF0YSBkZXZpY2UiOworCQlnb3RvIG91dF9tZXRhZGF0YTsKKwl9CisKKwlpZiAoa3N0cnRvdWwoYXJndlsyXSwgMTAsICZibG9ja19zaXplKSB8fCAhYmxvY2tfc2l6ZSB8fAorCSAgICBibG9ja19zaXplIDwgREFUQV9ERVZfQkxPQ0tfU0laRV9NSU5fU0VDVE9SUyB8fAorCSAgICBibG9ja19zaXplID4gREFUQV9ERVZfQkxPQ0tfU0laRV9NQVhfU0VDVE9SUyB8fAorCSAgICAhaXNfcG93ZXJfb2ZfMihibG9ja19zaXplKSkgeworCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBibG9jayBzaXplIjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChrc3RydG91bGwoYXJndlszXSwgMTAsICh1bnNpZ25lZCBsb25nIGxvbmcgKikmbG93X3dhdGVyX2Jsb2NrcykpIHsKKwkJdGktPmVycm9yID0gIkludmFsaWQgbG93IHdhdGVyIG1hcmsiOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBTZXQgZGVmYXVsdCBwb29sIGZlYXR1cmVzLgorCSAqLworCW1lbXNldCgmcGYsIDAsIHNpemVvZihwZikpOworCXBmLnplcm9fbmV3X2Jsb2NrcyA9IDE7CisKKwlkbV9jb25zdW1lX2FyZ3MoJmFzLCA0KTsKKwlyID0gcGFyc2VfcG9vbF9mZWF0dXJlcygmYXMsICZwZiwgdGkpOworCWlmIChyKQorCQlnb3RvIG91dDsKKworCXB0ID0ga3phbGxvYyhzaXplb2YoKnB0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdCkgeworCQlyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcG9vbCA9IF9fcG9vbF9maW5kKGRtX3RhYmxlX2dldF9tZCh0aS0+dGFibGUpLCBtZXRhZGF0YV9kZXYtPmJkZXYsCisJCQkgICBibG9ja19zaXplLCAmdGktPmVycm9yKTsKKwlpZiAoSVNfRVJSKHBvb2wpKSB7CisJCXIgPSBQVFJfRVJSKHBvb2wpOworCQlnb3RvIG91dF9mcmVlX3B0OworCX0KKworCXB0LT5wb29sID0gcG9vbDsKKwlwdC0+dGkgPSB0aTsKKwlwdC0+bWV0YWRhdGFfZGV2ID0gbWV0YWRhdGFfZGV2OworCXB0LT5kYXRhX2RldiA9IGRhdGFfZGV2OworCXB0LT5sb3dfd2F0ZXJfYmxvY2tzID0gbG93X3dhdGVyX2Jsb2NrczsKKwlwdC0+emVyb19uZXdfYmxvY2tzID0gcGYuemVyb19uZXdfYmxvY2tzOworCXRpLT5udW1fZmx1c2hfcmVxdWVzdHMgPSAxOworCXRpLT5udW1fZGlzY2FyZF9yZXF1ZXN0cyA9IDA7CisJdGktPnByaXZhdGUgPSBwdDsKKworCXB0LT5jYWxsYmFja3MuY29uZ2VzdGVkX2ZuID0gcG9vbF9pc19jb25nZXN0ZWQ7CisJZG1fdGFibGVfYWRkX3RhcmdldF9jYWxsYmFja3ModGktPnRhYmxlLCAmcHQtPmNhbGxiYWNrcyk7CisKKwltdXRleF91bmxvY2soJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfcHQ6CisJa2ZyZWUocHQpOworb3V0OgorCWRtX3B1dF9kZXZpY2UodGksIGRhdGFfZGV2KTsKK291dF9tZXRhZGF0YToKKwlkbV9wdXRfZGV2aWNlKHRpLCBtZXRhZGF0YV9kZXYpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBwb29sX21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLAorCQkgICAgdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KQoreworCWludCByOworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBwdC0+cG9vbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBBcyB0aGlzIGlzIGEgc2luZ2xldG9uIHRhcmdldCwgdGktPmJlZ2luIGlzIGFsd2F5cyB6ZXJvLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJYmlvLT5iaV9iZGV2ID0gcHQtPmRhdGFfZGV2LT5iZGV2OworCXIgPSBETV9NQVBJT19SRU1BUFBFRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyBvZiB0aGUgZGF0YSBkZXZpY2UgZnJvbQorICogdGhlIHN1cGVyYmxvY2sgYW5kIGNvbXBhcmVzIGl0IHRvIHRoZSBhY3R1YWwgZGV2aWNlIHNpemUsCisgKiB0aHVzIHJlc2l6aW5nIHRoZSBkYXRhIGRldmljZSBpbiBjYXNlIGl0IGhhcyBncm93bi4KKyAqCisgKiBUaGlzIGJvdGggY29wZXMgd2l0aCBvcGVuaW5nIHByZWFsbG9jYXRlZCBkYXRhIGRldmljZXMgaW4gdGhlIGN0cgorICogYmVpbmcgZm9sbG93ZWQgYnkgYSByZXN1bWUKKyAqIC1hbmQtCisgKiBjYWxsaW5nIHRoZSByZXN1bWUgbWV0aG9kIGluZGl2aWR1YWxseSBhZnRlciB1c2Vyc3BhY2UgaGFzCisgKiBncm93biB0aGUgZGF0YSBkZXZpY2UgaW4gcmVhY3Rpb24gdG8gYSB0YWJsZSBldmVudC4KKyAqLworc3RhdGljIGludCBwb29sX3ByZXJlc3VtZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgcG9vbF9jICpwdCA9IHRpLT5wcml2YXRlOworCXN0cnVjdCBwb29sICpwb29sID0gcHQtPnBvb2w7CisJZG1fYmxvY2tfdCBkYXRhX3NpemUsIHNiX2RhdGFfc2l6ZTsKKworCS8qCisJICogVGFrZSBjb250cm9sIG9mIHRoZSBwb29sIG9iamVjdC4KKwkgKi8KKwlyID0gYmluZF9jb250cm9sX3RhcmdldChwb29sLCB0aSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJZGF0YV9zaXplID0gdGktPmxlbiA+PiBwb29sLT5ibG9ja19zaGlmdDsKKwlyID0gZG1fcG9vbF9nZXRfZGF0YV9kZXZfc2l6ZShwb29sLT5wbWQsICZzYl9kYXRhX3NpemUpOworCWlmIChyKSB7CisJCURNRVJSKCJmYWlsZWQgdG8gcmV0cmlldmUgZGF0YSBkZXZpY2Ugc2l6ZSIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAoZGF0YV9zaXplIDwgc2JfZGF0YV9zaXplKSB7CisJCURNRVJSKCJwb29sIHRhcmdldCB0b28gc21hbGwsIGlzICVsbHUgYmxvY2tzIChleHBlY3RlZCAlbGx1KSIsCisJCSAgICAgIGRhdGFfc2l6ZSwgc2JfZGF0YV9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9IGVsc2UgaWYgKGRhdGFfc2l6ZSA+IHNiX2RhdGFfc2l6ZSkgeworCQlyID0gZG1fcG9vbF9yZXNpemVfZGF0YV9kZXYocG9vbC0+cG1kLCBkYXRhX3NpemUpOworCQlpZiAocikgeworCQkJRE1FUlIoImZhaWxlZCB0byByZXNpemUgZGF0YSBkZXZpY2UiKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJciA9IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKHBvb2wtPnBtZCk7CisJCWlmIChyKSB7CisJCQlETUVSUigiJXM6IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwKKwkJCSAgICAgIF9fZnVuY19fLCByKTsKKwkJCXJldHVybiByOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBvb2xfcmVzdW1lKHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBwdC0+cG9vbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwlwb29sLT5sb3dfd2F0ZXJfdHJpZ2dlcmVkID0gMDsKKwlwb29sLT5ub19mcmVlX3NwYWNlID0gMDsKKwlfX3JlcXVldWVfYmlvcyhwb29sKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3dvcmtlcihwb29sKTsKK30KKworc3RhdGljIHZvaWQgcG9vbF9wb3N0c3VzcGVuZChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgcG9vbF9jICpwdCA9IHRpLT5wcml2YXRlOworCXN0cnVjdCBwb29sICpwb29sID0gcHQtPnBvb2w7CisKKwlmbHVzaF93b3JrcXVldWUocG9vbC0+d3EpOworCisJciA9IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKHBvb2wtPnBtZCk7CisJaWYgKHIgPCAwKSB7CisJCURNRVJSKCIlczogZG1fcG9vbF9jb21taXRfbWV0YWRhdGEoKSBmYWlsZWQsIGVycm9yID0gJWQiLAorCQkgICAgICBfX2Z1bmNfXywgcik7CisJCS8qIEZJWE1FOiBpbnZhbGlkYXRlIGRldmljZT8gZXJyb3IgdGhlIG5leHQgRlVBIG9yIEZMVVNIIGJpbyA/Ki8KKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYXJnX2NvdW50KHVuc2lnbmVkIGFyZ2MsIHVuc2lnbmVkIGFyZ3NfcmVxdWlyZWQpCit7CisJaWYgKGFyZ2MgIT0gYXJnc19yZXF1aXJlZCkgeworCQlETVdBUk4oIk1lc3NhZ2UgcmVjZWl2ZWQgd2l0aCAldSBhcmd1bWVudHMgaW5zdGVhZCBvZiAldS4iLAorCQkgICAgICAgYXJnYywgYXJnc19yZXF1aXJlZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfZGV2X2lkKGNoYXIgKmFyZywgZG1fdGhpbl9pZCAqZGV2X2lkLCBpbnQgd2FybmluZykKK3sKKwlpZiAoIWtzdHJ0b3VsbChhcmcsIDEwLCAodW5zaWduZWQgbG9uZyBsb25nICopZGV2X2lkKSAmJgorCSAgICAqZGV2X2lkIDw9IE1BWF9ERVZfSUQpCisJCXJldHVybiAwOworCisJaWYgKHdhcm5pbmcpCisJCURNV0FSTigiTWVzc2FnZSByZWNlaXZlZCB3aXRoIGludmFsaWQgZGV2aWNlIGlkOiAlcyIsIGFyZyk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NyZWF0ZV90aGluX21lc2codW5zaWduZWQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBwb29sICpwb29sKQoreworCWRtX3RoaW5faWQgZGV2X2lkOworCWludCByOworCisJciA9IGNoZWNrX2FyZ19jb3VudChhcmdjLCAyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gcmVhZF9kZXZfaWQoYXJndlsxXSwgJmRldl9pZCwgMSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGRtX3Bvb2xfY3JlYXRlX3RoaW4ocG9vbC0+cG1kLCBkZXZfaWQpOworCWlmIChyKSB7CisJCURNV0FSTigiQ3JlYXRpb24gb2YgbmV3IHRoaW5seS1wcm92aXNpb25lZCBkZXZpY2Ugd2l0aCBpZCAlcyBmYWlsZWQuIiwKKwkJICAgICAgIGFyZ3ZbMV0pOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NyZWF0ZV9zbmFwX21lc2codW5zaWduZWQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBwb29sICpwb29sKQoreworCWRtX3RoaW5faWQgZGV2X2lkOworCWRtX3RoaW5faWQgb3JpZ2luX2Rldl9pZDsKKwlpbnQgcjsKKworCXIgPSBjaGVja19hcmdfY291bnQoYXJnYywgMyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHJlYWRfZGV2X2lkKGFyZ3ZbMV0sICZkZXZfaWQsIDEpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSByZWFkX2Rldl9pZChhcmd2WzJdLCAmb3JpZ2luX2Rldl9pZCwgMSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGRtX3Bvb2xfY3JlYXRlX3NuYXAocG9vbC0+cG1kLCBkZXZfaWQsIG9yaWdpbl9kZXZfaWQpOworCWlmIChyKSB7CisJCURNV0FSTigiQ3JlYXRpb24gb2YgbmV3IHNuYXBzaG90ICVzIG9mIGRldmljZSAlcyBmYWlsZWQuIiwKKwkJICAgICAgIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RlbGV0ZV9tZXNnKHVuc2lnbmVkIGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwlkbV90aGluX2lkIGRldl9pZDsKKwlpbnQgcjsKKworCXIgPSBjaGVja19hcmdfY291bnQoYXJnYywgMik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHJlYWRfZGV2X2lkKGFyZ3ZbMV0sICZkZXZfaWQsIDEpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkbV9wb29sX2RlbGV0ZV90aGluX2RldmljZShwb29sLT5wbWQsIGRldl9pZCk7CisJaWYgKHIpCisJCURNV0FSTigiRGVsZXRpb24gb2YgdGhpbiBkZXZpY2UgJXMgZmFpbGVkLiIsIGFyZ3ZbMV0pOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19zZXRfdHJhbnNhY3Rpb25faWRfbWVzZyh1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHBvb2wgKnBvb2wpCit7CisJZG1fdGhpbl9pZCBvbGRfaWQsIG5ld19pZDsKKwlpbnQgcjsKKworCXIgPSBjaGVja19hcmdfY291bnQoYXJnYywgMyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKGtzdHJ0b3VsbChhcmd2WzFdLCAxMCwgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSZvbGRfaWQpKSB7CisJCURNV0FSTigic2V0X3RyYW5zYWN0aW9uX2lkIG1lc3NhZ2U6IFVucmVjb2duaXNlZCBpZCAlcy4iLCBhcmd2WzFdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGtzdHJ0b3VsbChhcmd2WzJdLCAxMCwgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSZuZXdfaWQpKSB7CisJCURNV0FSTigic2V0X3RyYW5zYWN0aW9uX2lkIG1lc3NhZ2U6IFVucmVjb2duaXNlZCBuZXcgaWQgJXMuIiwgYXJndlsyXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXIgPSBkbV9wb29sX3NldF9tZXRhZGF0YV90cmFuc2FjdGlvbl9pZChwb29sLT5wbWQsIG9sZF9pZCwgbmV3X2lkKTsKKwlpZiAocikgeworCQlETVdBUk4oIkZhaWxlZCB0byBjaGFuZ2UgdHJhbnNhY3Rpb24gaWQgZnJvbSAlcyB0byAlcy4iLAorCQkgICAgICAgYXJndlsxXSwgYXJndlsyXSk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogTWVzc2FnZXMgc3VwcG9ydGVkOgorICogICBjcmVhdGVfdGhpbgk8ZGV2X2lkPgorICogICBjcmVhdGVfc25hcAk8ZGV2X2lkPiA8b3JpZ2luX2lkPgorICogICBkZWxldGUJCTxkZXZfaWQ+CisgKiAgIHRyaW0JCTxkZXZfaWQ+IDxuZXdfc2l6ZV9pbl9zZWN0b3JzPgorICogICBzZXRfdHJhbnNhY3Rpb25faWQgPGN1cnJlbnRfdHJhbnNfaWQ+IDxuZXdfdHJhbnNfaWQ+CisgKi8KK3N0YXRpYyBpbnQgcG9vbF9tZXNzYWdlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgciA9IC1FSU5WQUw7CisJc3RydWN0IHBvb2xfYyAqcHQgPSB0aS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHB0LT5wb29sOworCisJaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJjcmVhdGVfdGhpbiIpKQorCQlyID0gcHJvY2Vzc19jcmVhdGVfdGhpbl9tZXNnKGFyZ2MsIGFyZ3YsIHBvb2wpOworCisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgImNyZWF0ZV9zbmFwIikpCisJCXIgPSBwcm9jZXNzX2NyZWF0ZV9zbmFwX21lc2coYXJnYywgYXJndiwgcG9vbCk7CisKKwllbHNlIGlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAiZGVsZXRlIikpCisJCXIgPSBwcm9jZXNzX2RlbGV0ZV9tZXNnKGFyZ2MsIGFyZ3YsIHBvb2wpOworCisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgInNldF90cmFuc2FjdGlvbl9pZCIpKQorCQlyID0gcHJvY2Vzc19zZXRfdHJhbnNhY3Rpb25faWRfbWVzZyhhcmdjLCBhcmd2LCBwb29sKTsKKworCWVsc2UKKwkJRE1XQVJOKCJVbnJlY29nbmlzZWQgdGhpbiBwb29sIHRhcmdldCBtZXNzYWdlIHJlY2VpdmVkOiAlcyIsIGFyZ3ZbMF0pOworCisJaWYgKCFyKSB7CisJCXIgPSBkbV9wb29sX2NvbW1pdF9tZXRhZGF0YShwb29sLT5wbWQpOworCQlpZiAocikKKwkJCURNRVJSKCIlcyBtZXNzYWdlOiBkbV9wb29sX2NvbW1pdF9tZXRhZGF0YSgpIGZhaWxlZCwgZXJyb3IgPSAlZCIsCisJCQkgICAgICBhcmd2WzBdLCByKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFN0YXR1cyBsaW5lIGlzOgorICogICAgPHRyYW5zYWN0aW9uIGlkPiA8dXNlZCBtZXRhZGF0YSBzZWN0b3JzPi88dG90YWwgbWV0YWRhdGEgc2VjdG9ycz4KKyAqICAgIDx1c2VkIGRhdGEgc2VjdG9ycz4vPHRvdGFsIGRhdGEgc2VjdG9ycz4gPGhlbGQgbWV0YWRhdGEgcm9vdD4KKyAqLworc3RhdGljIGludCBwb29sX3N0YXR1cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RhdHVzX3R5cGVfdCB0eXBlLAorCQkgICAgICAgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBtYXhsZW4pCit7CisJaW50IHI7CisJdW5zaWduZWQgc3ogPSAwOworCXVpbnQ2NF90IHRyYW5zYWN0aW9uX2lkOworCWRtX2Jsb2NrX3QgbnJfZnJlZV9ibG9ja3NfZGF0YTsKKwlkbV9ibG9ja190IG5yX2ZyZWVfYmxvY2tzX21ldGFkYXRhOworCWRtX2Jsb2NrX3QgbnJfYmxvY2tzX2RhdGE7CisJZG1fYmxvY2tfdCBucl9ibG9ja3NfbWV0YWRhdGE7CisJZG1fYmxvY2tfdCBoZWxkX3Jvb3Q7CisJY2hhciBidWZbQkRFVk5BTUVfU0laRV07CisJY2hhciBidWYyW0JERVZOQU1FX1NJWkVdOworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBwdC0+cG9vbDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1RBVFVTVFlQRV9JTkZPOgorCQlyID0gZG1fcG9vbF9nZXRfbWV0YWRhdGFfdHJhbnNhY3Rpb25faWQocG9vbC0+cG1kLAorCQkJCQkJCSZ0cmFuc2FjdGlvbl9pZCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJciA9IGRtX3Bvb2xfZ2V0X2ZyZWVfbWV0YWRhdGFfYmxvY2tfY291bnQocG9vbC0+cG1kLAorCQkJCQkJCSAgJm5yX2ZyZWVfYmxvY2tzX21ldGFkYXRhKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlyID0gZG1fcG9vbF9nZXRfbWV0YWRhdGFfZGV2X3NpemUocG9vbC0+cG1kLCAmbnJfYmxvY2tzX21ldGFkYXRhKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlyID0gZG1fcG9vbF9nZXRfZnJlZV9ibG9ja19jb3VudChwb29sLT5wbWQsCisJCQkJCQkgJm5yX2ZyZWVfYmxvY2tzX2RhdGEpOworCQlpZiAocikKKwkJCXJldHVybiByOworCisJCXIgPSBkbV9wb29sX2dldF9kYXRhX2Rldl9zaXplKHBvb2wtPnBtZCwgJm5yX2Jsb2Nrc19kYXRhKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlyID0gZG1fcG9vbF9nZXRfaGVsZF9tZXRhZGF0YV9yb290KHBvb2wtPnBtZCwgJmhlbGRfcm9vdCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJRE1FTUlUKCIlbGx1ICVsbHUvJWxsdSAlbGx1LyVsbHUgIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdHJhbnNhY3Rpb25faWQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShucl9ibG9ja3NfbWV0YWRhdGEgLSBucl9mcmVlX2Jsb2Nrc19tZXRhZGF0YSksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5yX2Jsb2Nrc19tZXRhZGF0YSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKG5yX2Jsb2Nrc19kYXRhIC0gbnJfZnJlZV9ibG9ja3NfZGF0YSksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5yX2Jsb2Nrc19kYXRhKTsKKworCQlpZiAoaGVsZF9yb290KQorCQkJRE1FTUlUKCIlbGx1IiwgaGVsZF9yb290KTsKKwkJZWxzZQorCQkJRE1FTUlUKCItIik7CisKKwkJYnJlYWs7CisKKwljYXNlIFNUQVRVU1RZUEVfVEFCTEU6CisJCURNRU1JVCgiJXMgJXMgJWx1ICVsbHUgIiwKKwkJICAgICAgIGZvcm1hdF9kZXZfdChidWYsIHB0LT5tZXRhZGF0YV9kZXYtPmJkZXYtPmJkX2RldiksCisJCSAgICAgICBmb3JtYXRfZGV2X3QoYnVmMiwgcHQtPmRhdGFfZGV2LT5iZGV2LT5iZF9kZXYpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcG9vbC0+c2VjdG9yc19wZXJfYmxvY2ssCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXB0LT5sb3dfd2F0ZXJfYmxvY2tzKTsKKworCQlETUVNSVQoIiV1ICIsICFwb29sLT56ZXJvX25ld19ibG9ja3MpOworCisJCWlmICghcG9vbC0+emVyb19uZXdfYmxvY2tzKQorCQkJRE1FTUlUKCJza2lwX2Jsb2NrX3plcm9pbmcgIik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvb2xfaXRlcmF0ZV9kZXZpY2VzKHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJCWl0ZXJhdGVfZGV2aWNlc19jYWxsb3V0X2ZuIGZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisKKwlyZXR1cm4gZm4odGksIHB0LT5kYXRhX2RldiwgMCwgdGktPmxlbiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcG9vbF9tZXJnZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJ2ZWNfbWVyZ2VfZGF0YSAqYnZtLAorCQkgICAgICBzdHJ1Y3QgYmlvX3ZlYyAqYmlvdmVjLCBpbnQgbWF4X3NpemUpCit7CisJc3RydWN0IHBvb2xfYyAqcHQgPSB0aS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKHB0LT5kYXRhX2Rldi0+YmRldik7CisKKwlpZiAoIXEtPm1lcmdlX2J2ZWNfZm4pCisJCXJldHVybiBtYXhfc2l6ZTsKKworCWJ2bS0+YmlfYmRldiA9IHB0LT5kYXRhX2Rldi0+YmRldjsKKworCXJldHVybiBtaW4obWF4X3NpemUsIHEtPm1lcmdlX2J2ZWNfZm4ocSwgYnZtLCBiaW92ZWMpKTsKK30KKworc3RhdGljIHZvaWQgcG9vbF9pb19oaW50cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IHF1ZXVlX2xpbWl0cyAqbGltaXRzKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBwdC0+cG9vbDsKKworCWJsa19saW1pdHNfaW9fbWluKGxpbWl0cywgMCk7CisJYmxrX2xpbWl0c19pb19vcHQobGltaXRzLCBwb29sLT5zZWN0b3JzX3Blcl9ibG9jayA8PCBTRUNUT1JfU0hJRlQpOworfQorCitzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHBvb2xfdGFyZ2V0ID0geworCS5uYW1lID0gInRoaW4tcG9vbCIsCisJLmZlYXR1cmVzID0gRE1fVEFSR0VUX1NJTkdMRVRPTiB8IERNX1RBUkdFVF9BTFdBWVNfV1JJVEVBQkxFIHwKKwkJICAgIERNX1RBUkdFVF9JTU1VVEFCTEUsCisJLnZlcnNpb24gPSB7MSwgMCwgMH0sCisJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5jdHIgPSBwb29sX2N0ciwKKwkuZHRyID0gcG9vbF9kdHIsCisJLm1hcCA9IHBvb2xfbWFwLAorCS5wb3N0c3VzcGVuZCA9IHBvb2xfcG9zdHN1c3BlbmQsCisJLnByZXJlc3VtZSA9IHBvb2xfcHJlcmVzdW1lLAorCS5yZXN1bWUgPSBwb29sX3Jlc3VtZSwKKwkubWVzc2FnZSA9IHBvb2xfbWVzc2FnZSwKKwkuc3RhdHVzID0gcG9vbF9zdGF0dXMsCisJLm1lcmdlID0gcG9vbF9tZXJnZSwKKwkuaXRlcmF0ZV9kZXZpY2VzID0gcG9vbF9pdGVyYXRlX2RldmljZXMsCisJLmlvX2hpbnRzID0gcG9vbF9pb19oaW50cywKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpbiB0YXJnZXQgbWV0aG9kcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCB0aGluX2R0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlzdHJ1Y3QgdGhpbl9jICp0YyA9IHRpLT5wcml2YXRlOworCisJbXV0ZXhfbG9jaygmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KTsKKworCV9fcG9vbF9kZWModGMtPnBvb2wpOworCWRtX3Bvb2xfY2xvc2VfdGhpbl9kZXZpY2UodGMtPnRkKTsKKwlkbV9wdXRfZGV2aWNlKHRpLCB0Yy0+cG9vbF9kZXYpOworCWtmcmVlKHRjKTsKKworCW11dGV4X3VubG9jaygmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KTsKK30KKworLyoKKyAqIFRoaW4gdGFyZ2V0IHBhcmFtZXRlcnM6CisgKgorICogPHBvb2xfZGV2PiA8ZGV2X2lkPgorICoKKyAqIHBvb2xfZGV2OiB0aGUgcGF0aCB0byB0aGUgcG9vbCAoZWcsIC9kZXYvbWFwcGVyL215X3Bvb2wpCisgKiBkZXZfaWQ6IHRoZSBpbnRlcm5hbCBkZXZpY2UgaWRlbnRpZmllcgorICovCitzdGF0aWMgaW50IHRoaW5fY3RyKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgdGhpbl9jICp0YzsKKwlzdHJ1Y3QgZG1fZGV2ICpwb29sX2RldjsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqcG9vbF9tZDsKKworCW11dGV4X2xvY2soJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGFyZ3VtZW50IGNvdW50IjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl0YyA9IHRpLT5wcml2YXRlID0ga3phbGxvYyhzaXplb2YoKnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YykgeworCQl0aS0+ZXJyb3IgPSAiT3V0IG9mIG1lbW9yeSI7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJciA9IGRtX2dldF9kZXZpY2UodGksIGFyZ3ZbMF0sIGRtX3RhYmxlX2dldF9tb2RlKHRpLT50YWJsZSksICZwb29sX2Rldik7CisJaWYgKHIpIHsKKwkJdGktPmVycm9yID0gIkVycm9yIG9wZW5pbmcgcG9vbCBkZXZpY2UiOworCQlnb3RvIGJhZF9wb29sX2RldjsKKwl9CisJdGMtPnBvb2xfZGV2ID0gcG9vbF9kZXY7CisKKwlpZiAocmVhZF9kZXZfaWQoYXJndlsxXSwgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSZ0Yy0+ZGV2X2lkLCAwKSkgeworCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBkZXZpY2UgaWQiOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBiYWRfY29tbW9uOworCX0KKworCXBvb2xfbWQgPSBkbV9nZXRfbWQodGMtPnBvb2xfZGV2LT5iZGV2LT5iZF9kZXYpOworCWlmICghcG9vbF9tZCkgeworCQl0aS0+ZXJyb3IgPSAiQ291bGRuJ3QgZ2V0IHBvb2wgbWFwcGVkIGRldmljZSI7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGJhZF9jb21tb247CisJfQorCisJdGMtPnBvb2wgPSBfX3Bvb2xfdGFibGVfbG9va3VwKHBvb2xfbWQpOworCWlmICghdGMtPnBvb2wpIHsKKwkJdGktPmVycm9yID0gIkNvdWxkbid0IGZpbmQgcG9vbCBvYmplY3QiOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBiYWRfcG9vbF9sb29rdXA7CisJfQorCV9fcG9vbF9pbmModGMtPnBvb2wpOworCisJciA9IGRtX3Bvb2xfb3Blbl90aGluX2RldmljZSh0Yy0+cG9vbC0+cG1kLCB0Yy0+ZGV2X2lkLCAmdGMtPnRkKTsKKwlpZiAocikgeworCQl0aS0+ZXJyb3IgPSAiQ291bGRuJ3Qgb3BlbiB0aGluIGludGVybmFsIGRldmljZSI7CisJCWdvdG8gYmFkX3RoaW5fb3BlbjsKKwl9CisKKwl0aS0+c3BsaXRfaW8gPSB0Yy0+cG9vbC0+c2VjdG9yc19wZXJfYmxvY2s7CisJdGktPm51bV9mbHVzaF9yZXF1ZXN0cyA9IDE7CisJdGktPm51bV9kaXNjYXJkX3JlcXVlc3RzID0gMDsKKwl0aS0+ZGlzY2FyZHNfc3VwcG9ydGVkID0gMDsKKworCWRtX3B1dChwb29sX21kKTsKKworCW11dGV4X3VubG9jaygmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KTsKKworCXJldHVybiAwOworCitiYWRfdGhpbl9vcGVuOgorCV9fcG9vbF9kZWModGMtPnBvb2wpOworYmFkX3Bvb2xfbG9va3VwOgorCWRtX3B1dChwb29sX21kKTsKK2JhZF9jb21tb246CisJZG1fcHV0X2RldmljZSh0aSwgdGMtPnBvb2xfZGV2KTsKK2JhZF9wb29sX2RldjoKKwlrZnJlZSh0Yyk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHRoaW5fbWFwKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmlvICpiaW8sCisJCSAgICB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpCit7CisJYmlvLT5iaV9zZWN0b3IgLT0gdGktPmJlZ2luOworCisJcmV0dXJuIHRoaW5fYmlvX21hcCh0aSwgYmlvLCBtYXBfY29udGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkIHRoaW5fcG9zdHN1c3BlbmQoc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJaWYgKGRtX25vZmx1c2hfc3VzcGVuZGluZyh0aSkpCisJCXJlcXVldWVfaW8oKHN0cnVjdCB0aGluX2MgKil0aS0+cHJpdmF0ZSk7Cit9CisKKy8qCisgKiA8bnIgbWFwcGVkIHNlY3RvcnM+IDxoaWdoZXN0IG1hcHBlZCBzZWN0b3I+CisgKi8KK3N0YXRpYyBpbnQgdGhpbl9zdGF0dXMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0YXR1c190eXBlX3QgdHlwZSwKKwkJICAgICAgIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgbWF4bGVuKQoreworCWludCByOworCXNzaXplX3Qgc3ogPSAwOworCWRtX2Jsb2NrX3QgbWFwcGVkLCBoaWdoZXN0OworCWNoYXIgYnVmW0JERVZOQU1FX1NJWkVdOworCXN0cnVjdCB0aGluX2MgKnRjID0gdGktPnByaXZhdGU7CisKKwlpZiAoIXRjLT50ZCkKKwkJRE1FTUlUKCItIik7CisJZWxzZSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFNUQVRVU1RZUEVfSU5GTzoKKwkJCXIgPSBkbV90aGluX2dldF9tYXBwZWRfY291bnQodGMtPnRkLCAmbWFwcGVkKTsKKwkJCWlmIChyKQorCQkJCXJldHVybiByOworCisJCQlyID0gZG1fdGhpbl9nZXRfaGlnaGVzdF9tYXBwZWRfYmxvY2sodGMtPnRkLCAmaGlnaGVzdCk7CisJCQlpZiAociA8IDApCisJCQkJcmV0dXJuIHI7CisKKwkJCURNRU1JVCgiJWxsdSAiLCBtYXBwZWQgKiB0Yy0+cG9vbC0+c2VjdG9yc19wZXJfYmxvY2spOworCQkJaWYgKHIpCisJCQkJRE1FTUlUKCIlbGx1IiwgKChoaWdoZXN0ICsgMSkgKgorCQkJCQkJdGMtPnBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrKSAtIDEpOworCQkJZWxzZQorCQkJCURNRU1JVCgiLSIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVEFUVVNUWVBFX1RBQkxFOgorCQkJRE1FTUlUKCIlcyAlbHUiLAorCQkJICAgICAgIGZvcm1hdF9kZXZfdChidWYsIHRjLT5wb29sX2Rldi0+YmRldi0+YmRfZGV2KSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykgdGMtPmRldl9pZCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRoaW5faXRlcmF0ZV9kZXZpY2VzKHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJCWl0ZXJhdGVfZGV2aWNlc19jYWxsb3V0X2ZuIGZuLCB2b2lkICpkYXRhKQoreworCWRtX2Jsb2NrX3QgYmxvY2tzOworCXN0cnVjdCB0aGluX2MgKnRjID0gdGktPnByaXZhdGU7CisKKwkvKgorCSAqIFdlIGNhbid0IGNhbGwgZG1fcG9vbF9nZXRfZGF0YV9kZXZfc2l6ZSgpIHNpbmNlIHRoYXQgYmxvY2tzLiAgU28KKwkgKiB3ZSBmb2xsb3cgYSBtb3JlIGNvbnZvbHV0ZWQgcGF0aCB0aHJvdWdoIHRvIHRoZSBwb29sJ3MgdGFyZ2V0LgorCSAqLworCWlmICghdGMtPnBvb2wtPnRpKQorCQlyZXR1cm4gMDsJLyogbm90aGluZyBpcyBib3VuZCAqLworCisJYmxvY2tzID0gdGMtPnBvb2wtPnRpLT5sZW4gPj4gdGMtPnBvb2wtPmJsb2NrX3NoaWZ0OworCWlmIChibG9ja3MpCisJCXJldHVybiBmbih0aSwgdGMtPnBvb2xfZGV2LCAwLCB0Yy0+cG9vbC0+c2VjdG9yc19wZXJfYmxvY2sgKiBibG9ja3MsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRoaW5faW9faGludHMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBxdWV1ZV9saW1pdHMgKmxpbWl0cykKK3sKKwlzdHJ1Y3QgdGhpbl9jICp0YyA9IHRpLT5wcml2YXRlOworCisJYmxrX2xpbWl0c19pb19taW4obGltaXRzLCAwKTsKKwlibGtfbGltaXRzX2lvX29wdChsaW1pdHMsIHRjLT5wb29sLT5zZWN0b3JzX3Blcl9ibG9jayA8PCBTRUNUT1JfU0hJRlQpOworfQorCitzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHRoaW5fdGFyZ2V0ID0geworCS5uYW1lID0gInRoaW4iLAorCS52ZXJzaW9uID0gezEsIDAsIDB9LAorCS5tb2R1bGUJPSBUSElTX01PRFVMRSwKKwkuY3RyID0gdGhpbl9jdHIsCisJLmR0ciA9IHRoaW5fZHRyLAorCS5tYXAgPSB0aGluX21hcCwKKwkucG9zdHN1c3BlbmQgPSB0aGluX3Bvc3RzdXNwZW5kLAorCS5zdGF0dXMgPSB0aGluX3N0YXR1cywKKwkuaXRlcmF0ZV9kZXZpY2VzID0gdGhpbl9pdGVyYXRlX2RldmljZXMsCisJLmlvX2hpbnRzID0gdGhpbl9pb19oaW50cywKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19pbml0IGRtX3RoaW5faW5pdCh2b2lkKQoreworCWludCByOworCisJcG9vbF90YWJsZV9pbml0KCk7CisKKwlyID0gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZ0aGluX3RhcmdldCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGRtX3JlZ2lzdGVyX3RhcmdldCgmcG9vbF90YXJnZXQpOworCWlmIChyKQorCQlkbV91bnJlZ2lzdGVyX3RhcmdldCgmdGhpbl90YXJnZXQpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGRtX3RoaW5fZXhpdCh2b2lkKQoreworCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZ0aGluX3RhcmdldCk7CisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnBvb2xfdGFyZ2V0KTsKK30KKworbW9kdWxlX2luaXQoZG1fdGhpbl9pbml0KTsKK21vZHVsZV9leGl0KGRtX3RoaW5fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTihETV9OQU1FICJkZXZpY2UtbWFwcGVyIHRoaW4gcHJvdmlzaW9uaW5nIHRhcmdldCIpOworTU9EVUxFX0FVVEhPUigiSm9lIFRob3JuYmVyIDxkbS1kZXZlbEByZWRoYXQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS11ZXZlbnQuYyBiL2RyaXZlcnMvbWQvZG0tdWV2ZW50LmMKaW5kZXggNmIxZTNiNi4uOGVmZTAzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS11ZXZlbnQuYworKysgYi9kcml2ZXJzL21kL2RtLXVldmVudC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiZG0uaCIKICNpbmNsdWRlICJkbS11ZXZlbnQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uYyBiL2RyaXZlcnMvbWQvZG0uYwppbmRleCA1MmIzOWYzLi40NzIwZjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmMKKysrIGIvZHJpdmVycy9tZC9kbS5jCkBAIC0yNSw2ICsyNSwxNiBAQAogCiAjZGVmaW5lIERNX01TR19QUkVGSVggImNvcmUiCiAKKyNpZmRlZiBDT05GSUdfUFJJTlRLCisvKgorICogcmF0ZWxpbWl0IHN0YXRlIHRvIGJlIHVzZWQgaW4gRE1YWFhfTElNSVQoKS4KKyAqLworREVGSU5FX1JBVEVMSU1JVF9TVEFURShkbV9yYXRlbGltaXRfc3RhdGUsCisJCSAgICAgICBERUZBVUxUX1JBVEVMSU1JVF9JTlRFUlZBTCwKKwkJICAgICAgIERFRkFVTFRfUkFURUxJTUlUX0JVUlNUKTsKK0VYUE9SVF9TWU1CT0woZG1fcmF0ZWxpbWl0X3N0YXRlKTsKKyNlbmRpZgorCiAvKgogICogQ29va2llcyBhcmUgbnVtZXJpYyB2YWx1ZXMgc2VudCB3aXRoIENIQU5HRSBhbmQgUkVNT1ZFCiAgKiB1ZXZlbnRzIHdoaWxlIHJlc3VtaW5nLCByZW1vdmluZyBvciByZW5hbWluZyB0aGUgZGV2aWNlLgpAQCAtMTMwLDYgKzE0MCw4IEBACiAJLyogUHJvdGVjdCBxdWV1ZSBhbmQgdHlwZSBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzLiAqLwogCXN0cnVjdCBtdXRleCB0eXBlX2xvY2s7CiAKKwlzdHJ1Y3QgdGFyZ2V0X3R5cGUgKmltbXV0YWJsZV90YXJnZXRfdHlwZTsKKwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOwogCWNoYXIgbmFtZVsxNl07CiAKQEAgLTE4MCw5ICsxOTIsNiBAQAogCS8qIGZvcmNlZCBnZW9tZXRyeSBzZXR0aW5ncyAqLwogCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tZXRyeTsKIAotCS8qIEZvciBzYXZpbmcgdGhlIGFkZHJlc3Mgb2YgX19tYWtlX3JlcXVlc3QgZm9yIHJlcXVlc3QgYmFzZWQgZG0gKi8KLQltYWtlX3JlcXVlc3RfZm4gKnNhdmVkX21ha2VfcmVxdWVzdF9mbjsKLQogCS8qIHN5c2ZzIGhhbmRsZSAqLwogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiAKQEAgLTEzOTEsNyArMTQwMCw3IEBACiAgKiBUaGUgcmVxdWVzdCBmdW5jdGlvbiB0aGF0IGp1c3QgcmVtYXBzIHRoZSBiaW8gYnVpbHQgdXAgYnkKICAqIGRtX21lcmdlX2J2ZWMuCiAgKi8KLXN0YXRpYyBpbnQgX2RtX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyB2b2lkIF9kbV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJaW50IHJ3ID0gYmlvX2RhdGFfZGlyKGJpbyk7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0gcS0+cXVldWVkYXRhOwpAQCAtMTQxMiwxOSArMTQyMSwxMiBAQAogCQkJcXVldWVfaW8obWQsIGJpbyk7CiAJCWVsc2UKIAkJCWJpb19pb19lcnJvcihiaW8pOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCX0KIAogCV9fc3BsaXRfYW5kX3Byb2Nlc3NfYmlvKG1kLCBiaW8pOwogCXVwX3JlYWQoJm1kLT5pb19sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkbV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKLXsKLQlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBxLT5xdWV1ZWRhdGE7Ci0KLQlyZXR1cm4gbWQtPnNhdmVkX21ha2VfcmVxdWVzdF9mbihxLCBiaW8pOyAvKiBjYWxsIF9fbWFrZV9yZXF1ZXN0KCkgKi8KKwlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQgZG1fcmVxdWVzdF9iYXNlZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCkBAIC0xNDMyLDE0ICsxNDM0LDE0IEBACiAJcmV0dXJuIGJsa19xdWV1ZV9zdGFja2FibGUobWQtPnF1ZXVlKTsKIH0KIAotc3RhdGljIGludCBkbV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBkbV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0gcS0+cXVldWVkYXRhOwogCiAJaWYgKGRtX3JlcXVlc3RfYmFzZWQobWQpKQotCQlyZXR1cm4gZG1fbWFrZV9yZXF1ZXN0KHEsIGJpbyk7Ci0KLQlyZXR1cm4gX2RtX3JlcXVlc3QocSwgYmlvKTsKKwkJYmxrX3F1ZXVlX2JpbyhxLCBiaW8pOworCWVsc2UKKwkJX2RtX3JlcXVlc3QocSwgYmlvKTsKIH0KIAogdm9pZCBkbV9kaXNwYXRjaF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSkKQEAgLTIwODYsNiArMjA4OCw4IEBACiAJd3JpdGVfbG9ja19pcnFzYXZlKCZtZC0+bWFwX2xvY2ssIGZsYWdzKTsKIAlvbGRfbWFwID0gbWQtPm1hcDsKIAltZC0+bWFwID0gdDsKKwltZC0+aW1tdXRhYmxlX3RhcmdldF90eXBlID0gZG1fdGFibGVfZ2V0X2ltbXV0YWJsZV90YXJnZXRfdHlwZSh0KTsKKwogCWRtX3RhYmxlX3NldF9yZXN0cmljdGlvbnModCwgcSwgbGltaXRzKTsKIAlpZiAobWVyZ2VfaXNfb3B0aW9uYWwpCiAJCXNldF9iaXQoRE1GX01FUkdFX0lTX09QVElPTkFMLCAmbWQtPmZsYWdzKTsKQEAgLTIxNTYsNiArMjE2MCwxMSBAQAogCXJldHVybiBtZC0+dHlwZTsKIH0KIAorc3RydWN0IHRhcmdldF90eXBlICpkbV9nZXRfaW1tdXRhYmxlX3RhcmdldF90eXBlKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlyZXR1cm4gbWQtPmltbXV0YWJsZV90YXJnZXRfdHlwZTsKK30KKwogLyoKICAqIEZ1bGx5IGluaXRpYWxpemUgYSByZXF1ZXN0LWJhc2VkIHF1ZXVlICgtPmVsZXZhdG9yLCAtPnJlcXVlc3RfZm4sIGV0YykuCiAgKi8KQEAgLTIxNzIsNyArMjE4MSw2IEBACiAJCXJldHVybiAwOwogCiAJbWQtPnF1ZXVlID0gcTsKLQltZC0+c2F2ZWRfbWFrZV9yZXF1ZXN0X2ZuID0gbWQtPnF1ZXVlLT5tYWtlX3JlcXVlc3RfZm47CiAJZG1faW5pdF9tZF9xdWV1ZShtZCk7CiAJYmxrX3F1ZXVlX3NvZnRpcnFfZG9uZShtZC0+cXVldWUsIGRtX3NvZnRpcnFfZG9uZSk7CiAJYmxrX3F1ZXVlX3ByZXBfcnEobWQtPnF1ZXVlLCBkbV9wcmVwX2ZuKTsKQEAgLTIyMzEsNiArMjIzOSw3IEBACiAKIAlyZXR1cm4gbWQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9nZXRfbWQpOwogCiB2b2lkICpkbV9nZXRfbWRwdHIoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQogewpAQCAtMjMxNiw3ICsyMzI1LDYgQEAKIAl3aGlsZSAoMSkgewogCQlzZXRfY3VycmVudF9zdGF0ZShpbnRlcnJ1cHRpYmxlKTsKIAotCQlzbXBfbWIoKTsKIAkJaWYgKCFtZF9pbl9mbGlnaHQobWQpKQogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uaCBiL2RyaXZlcnMvbWQvZG0uaAppbmRleCA2NzQ1ZGJkLi5iN2RhY2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmgKKysrIGIvZHJpdmVycy9tZC9kbS5oCkBAIC02MCw2ICs2MCw3IEBACiBpbnQgZG1fdGFibGVfYW55X2Nvbmdlc3RlZChzdHJ1Y3QgZG1fdGFibGUgKnQsIGludCBiZGlfYml0cyk7CiBpbnQgZG1fdGFibGVfYW55X2J1c3lfdGFyZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCk7CiB1bnNpZ25lZCBkbV90YWJsZV9nZXRfdHlwZShzdHJ1Y3QgZG1fdGFibGUgKnQpOworc3RydWN0IHRhcmdldF90eXBlICpkbV90YWJsZV9nZXRfaW1tdXRhYmxlX3RhcmdldF90eXBlKHN0cnVjdCBkbV90YWJsZSAqdCk7CiBib29sIGRtX3RhYmxlX3JlcXVlc3RfYmFzZWQoc3RydWN0IGRtX3RhYmxlICp0KTsKIGJvb2wgZG1fdGFibGVfc3VwcG9ydHNfZGlzY2FyZHMoc3RydWN0IGRtX3RhYmxlICp0KTsKIGludCBkbV90YWJsZV9hbGxvY19tZF9tZW1wb29scyhzdHJ1Y3QgZG1fdGFibGUgKnQpOwpAQCAtNzIsNiArNzMsNyBAQAogdm9pZCBkbV91bmxvY2tfbWRfdHlwZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwogdm9pZCBkbV9zZXRfbWRfdHlwZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHVuc2lnbmVkIHR5cGUpOwogdW5zaWduZWQgZG1fZ2V0X21kX3R5cGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKK3N0cnVjdCB0YXJnZXRfdHlwZSAqZG1fZ2V0X2ltbXV0YWJsZV90YXJnZXRfdHlwZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwogCiBpbnQgZG1fc2V0dXBfbWRfcXVldWUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9mYXVsdHkuYyBiL2RyaXZlcnMvbWQvZmF1bHR5LmMKaW5kZXggNjA4MTZiMS4uZmViMmMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9mYXVsdHkuYworKysgYi9kcml2ZXJzL21kL2ZhdWx0eS5jCkBAIC02Myw2ICs2Myw3IEBACiAKICNkZWZpbmUgTWF4RmF1bHQJNTAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL21kX3UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAibWQuaCIKQEAgLTE2OSw3ICsxNzAsNyBAQAogCQljb25mLT5uZmF1bHRzID0gbisxOwogfQogCi1zdGF0aWMgaW50IG1ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBtYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBmYXVsdHlfY29uZiAqY29uZiA9IG1kZGV2LT5wcml2YXRlOwogCWludCBmYWlsaXQgPSAwOwpAQCAtMTgxLDcgKzE4Miw3IEBACiAJCQkgKiBqdXN0IGZhaWwgaW1tZWRpYXRlbHkKIAkJCSAqLwogCQkJYmlvX2VuZGlvKGJpbywgLUVJTyk7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybjsKIAkJfQogCiAJCWlmIChjaGVja19zZWN0b3IoY29uZiwgYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2VjdG9yKyhiaW8tPmJpX3NpemU+PjkpLApAQCAtMjExLDE1ICsyMTIsMTUgQEAKIAl9CiAJaWYgKGZhaWxpdCkgewogCQlzdHJ1Y3QgYmlvICpiID0gYmlvX2Nsb25lX21kZGV2KGJpbywgR0ZQX05PSU8sIG1kZGV2KTsKKwogCQliLT5iaV9iZGV2ID0gY29uZi0+cmRldi0+YmRldjsKIAkJYi0+YmlfcHJpdmF0ZSA9IGJpbzsKIAkJYi0+YmlfZW5kX2lvID0gZmF1bHR5X2ZhaWw7Ci0JCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGIpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgeworCQliaW8gPSBiOworCX0gZWxzZQogCQliaW8tPmJpX2JkZXYgPSBjb25mLT5yZGV2LT5iZGV2OwotCQlyZXR1cm4gMTsKLQl9CisKKwlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOwogfQogCiBzdGF0aWMgdm9pZCBzdGF0dXMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBtZGRldiAqbWRkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2xpbmVhci5jIGIvZHJpdmVycy9tZC9saW5lYXIuYwppbmRleCAxMGM1ODQ0Li5jMzI3M2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2xpbmVhci5jCisrKyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL21kX3UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlICJtZC5oIgogI2luY2x1ZGUgImxpbmVhci5oIgpAQCAtMjY0LDE0ICsyNjUsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsaW5lYXJfbWFrZV9yZXF1ZXN0IChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBsaW5lYXJfbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgZGV2X2luZm8gKnRtcF9kZXY7CiAJc2VjdG9yX3Qgc3RhcnRfc2VjdG9yOwogCiAJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMjkzLDcgKzI5NCw3IEBACiAJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X3NlY3Rvcik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQliaW9faW9fZXJyb3IoYmlvKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAJaWYgKHVubGlrZWx5KGJpby0+Ymlfc2VjdG9yICsgKGJpby0+Ymlfc2l6ZSA+PiA5KSA+CiAJCSAgICAgdG1wX2Rldi0+ZW5kX3NlY3RvcikpIHsKQEAgLTMwNywyMCArMzA4LDE3IEBACiAKIAkJYnAgPSBiaW9fc3BsaXQoYmlvLCBlbmRfc2VjdG9yIC0gYmlvLT5iaV9zZWN0b3IpOwogCi0JCWlmIChsaW5lYXJfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpKQotCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoJmJwLT5iaW8xKTsKLQkJaWYgKGxpbmVhcl9tYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMikpCi0JCQlnZW5lcmljX21ha2VfcmVxdWVzdCgmYnAtPmJpbzIpOworCQlsaW5lYXJfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpOworCQlsaW5lYXJfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzIpOwogCQliaW9fcGFpcl9yZWxlYXNlKGJwKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAJCSAgICAKIAliaW8tPmJpX2JkZXYgPSB0bXBfZGV2LT5yZGV2LT5iZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gYmlvLT5iaV9zZWN0b3IgLSBzdGFydF9zZWN0b3IKIAkJKyB0bXBfZGV2LT5yZGV2LT5kYXRhX29mZnNldDsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiAxOworCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7CiB9CiAKIHN0YXRpYyB2b2lkIGxpbmVhcl9zdGF0dXMgKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWRkZXYgKm1kZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDI2NmU4MmUuLjg0YWNmZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CkBAIC0zMzIsMTggKzMzMywxNyBAQAogICogY2FsbCBoYXMgZmluaXNoZWQsIHRoZSBiaW8gaGFzIGJlZW4gbGlua2VkIGludG8gc29tZSBpbnRlcm5hbCBzdHJ1Y3R1cmUKICAqIGFuZCBzbyBpcyB2aXNpYmxlIHRvIC0+cXVpZXNjZSgpLCBzbyB3ZSBkb24ndCBuZWVkIHRoZSByZWZjb3VudCBhbnkgbW9yZS4KICAqLwotc3RhdGljIGludCBtZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyB2b2lkIG1kX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCXN0cnVjdCBtZGRldiAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7Ci0JaW50IHJ2OwogCWludCBjcHU7CiAJdW5zaWduZWQgaW50IHNlY3RvcnM7CiAKIAlpZiAobWRkZXYgPT0gTlVMTCB8fCBtZGRldi0+cGVycyA9PSBOVUxMCiAJICAgIHx8ICFtZGRldi0+cmVhZHkpIHsKIAkJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCXNtcF9ybWIoKTsgLyogRW5zdXJlIGltcGxpY2F0aW9ucyBvZiAgJ2FjdGl2ZScgYXJlIHZpc2libGUgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0zNjgsNyArMzY4LDcgQEAKIAkgKiBnbyBhd2F5IGluc2lkZSBtYWtlX3JlcXVlc3QKIAkgKi8KIAlzZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKLQlydiA9IG1kZGV2LT5wZXJzLT5tYWtlX3JlcXVlc3QobWRkZXYsIGJpbyk7CisJbWRkZXYtPnBlcnMtPm1ha2VfcmVxdWVzdChtZGRldiwgYmlvKTsKIAogCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7CiAJcGFydF9zdGF0X2luYyhjcHUsICZtZGRldi0+Z2VuZGlzay0+cGFydDAsIGlvc1tyd10pOwpAQCAtMzc3LDggKzM3Nyw2IEBACiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWRkZXYtPmFjdGl2ZV9pbykgJiYgbWRkZXYtPnN1c3BlbmRlZCkKIAkJd2FrZV91cCgmbWRkZXYtPnNiX3dhaXQpOwotCi0JcmV0dXJuIHJ2OwogfQogCiAvKiBtZGRldl9zdXNwZW5kIG1ha2VzIHN1cmUgbm8gbmV3IHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQKQEAgLTQ3Nyw4ICs0NzUsNyBAQAogCQliaW9fZW5kaW8oYmlvLCAwKTsKIAllbHNlIHsKIAkJYmlvLT5iaV9ydyAmPSB+UkVRX0ZMVVNIOwotCQlpZiAobWRkZXYtPnBlcnMtPm1ha2VfcmVxdWVzdChtZGRldiwgYmlvKSkKLQkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7CisJCW1kZGV2LT5wZXJzLT5tYWtlX3JlcXVlc3QobWRkZXYsIGJpbyk7CiAJfQogCiAJbWRkZXYtPmZsdXNoX2JpbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmggYi9kcml2ZXJzL21kL21kLmgKaW5kZXggNTFjMWQ5MS4uY2Y3NDJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5oCisrKyBiL2RyaXZlcnMvbWQvbWQuaApAQCAtNDE5LDcgKzQxOSw3IEBACiAJaW50IGxldmVsOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKLQlpbnQgKCptYWtlX3JlcXVlc3QpKHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbyk7CisJdm9pZCAoKm1ha2VfcmVxdWVzdCkoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqYmlvKTsKIAlpbnQgKCpydW4pKHN0cnVjdCBtZGRldiAqbWRkZXYpOwogCWludCAoKnN0b3ApKHN0cnVjdCBtZGRldiAqbWRkZXYpOwogCXZvaWQgKCpzdGF0dXMpKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWRkZXYgKm1kZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCmluZGV4IGQzMmM3ODUuLjU4OTkyNDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL211bHRpcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9tZF91Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMDYsNyArMTA3LDcgQEAKIAlyZGV2X2RlY19wZW5kaW5nKHJkZXYsIGNvbmYtPm1kZGV2KTsKIH0KIAotc3RhdGljIGludCBtdWx0aXBhdGhfbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKiBiaW8pCitzdGF0aWMgdm9pZCBtdWx0aXBhdGhfbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKiBiaW8pCiB7CiAJc3RydWN0IG1wY29uZiAqY29uZiA9IG1kZGV2LT5wcml2YXRlOwogCXN0cnVjdCBtdWx0aXBhdGhfYmggKiBtcF9iaDsKQEAgLTExNCw3ICsxMTUsNyBAQAogCiAJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJbXBfYmggPSBtZW1wb29sX2FsbG9jKGNvbmYtPnBvb2wsIEdGUF9OT0lPKTsKQEAgLTEyNiw3ICsxMjcsNyBAQAogCWlmIChtcF9iaC0+cGF0aCA8IDApIHsKIAkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJCW1lbXBvb2xfZnJlZShtcF9iaCwgY29uZi0+cG9vbCk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCW11bHRpcGF0aCA9IGNvbmYtPm11bHRpcGF0aHMgKyBtcF9iaC0+cGF0aDsKIApAQCAtMTM3LDcgKzEzOCw3IEBACiAJbXBfYmgtPmJpby5iaV9lbmRfaW8gPSBtdWx0aXBhdGhfZW5kX3JlcXVlc3Q7CiAJbXBfYmgtPmJpby5iaV9wcml2YXRlID0gbXBfYmg7CiAJZ2VuZXJpY19tYWtlX3JlcXVlc3QoJm1wX2JoLT5iaW8pOwotCXJldHVybiAwOworCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgbXVsdGlwYXRoX3N0YXR1cyAoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBtZGRldiAqbWRkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9LY29uZmlnIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWIzNTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvS2NvbmZpZwpAQCAtMCwwICsxLDggQEAKK2NvbmZpZyBETV9QRVJTSVNURU5UX0RBVEEKKyAgICAgICB0cmlzdGF0ZQorICAgICAgIGRlcGVuZHMgb24gQkxLX0RFVl9ETSAmJiBFWFBFUklNRU5UQUwKKyAgICAgICBzZWxlY3QgTElCQ1JDMzJDCisgICAgICAgc2VsZWN0IERNX0JVRklPCisgICAgICAgLS0taGVscC0tLQorCSBMaWJyYXJ5IHByb3ZpZGluZyBpbW11dGFibGUgb24tZGlzayBkYXRhIHN0cnVjdHVyZSBzdXBwb3J0IGZvcgorCSBkZXZpY2UtbWFwcGVyIHRhcmdldHMgc3VjaCBhcyB0aGUgdGhpbiBwcm92aXNpb25pbmcgdGFyZ2V0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvTWFrZWZpbGUgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE5NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorb2JqLSQoQ09ORklHX0RNX1BFUlNJU1RFTlRfREFUQSkgKz0gZG0tcGVyc2lzdGVudC1kYXRhLm8KK2RtLXBlcnNpc3RlbnQtZGF0YS1vYmpzIDo9IFwKKwlkbS1ibG9jay1tYW5hZ2VyLm8gXAorCWRtLXNwYWNlLW1hcC1jaGVja2VyLm8gXAorCWRtLXNwYWNlLW1hcC1jb21tb24ubyBcCisJZG0tc3BhY2UtbWFwLWRpc2subyBcCisJZG0tc3BhY2UtbWFwLW1ldGFkYXRhLm8gXAorCWRtLXRyYW5zYWN0aW9uLW1hbmFnZXIubyBcCisJZG0tYnRyZWUubyBcCisJZG0tYnRyZWUtcmVtb3ZlLm8gXAorCWRtLWJ0cmVlLXNwaW5lLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJsb2NrLW1hbmFnZXIuYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJsb2NrLW1hbmFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE3ZWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYmxvY2stbWFuYWdlci5jCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworI2luY2x1ZGUgImRtLWJsb2NrLW1hbmFnZXIuaCIKKyNpbmNsdWRlICJkbS1wZXJzaXN0ZW50LWRhdGEtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICIuLi9kbS1idWZpby5oIgorCisjaW5jbHVkZSA8bGludXgvY3JjMzJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJibG9jayBtYW5hZ2VyIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhpcyBpcyBhIHJlYWQvd3JpdGUgc2VtYXBob3JlIHdpdGggYSBjb3VwbGUgb2YgZGlmZmVyZW5jZXMuCisgKgorICogaSkgVGhlcmUgaXMgYSByZXN0cmljdGlvbiBvbiB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVhZCBsb2NrcyB0aGF0CisgKiBtYXkgYmUgaGVsZCBhdCBvbmNlLiAgVGhpcyBpcyBqdXN0IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKyAqCisgKiBpaSkgUmVjdXJzaXZlIGxvY2tpbmcgYXR0ZW1wdHMgYXJlIGRldGVjdGVkIGFuZCByZXR1cm4gRUlOVkFMLiAgQSBzdGFjaworICogdHJhY2UgaXMgYWxzbyBlbWl0dGVkIGZvciB0aGUgcHJldmlvdXMgbG9jayBhcXVpc2l0aW9uLgorICoKKyAqIGlpaSkgUHJpb3JpdHkgaXMgZ2l2ZW4gdG8gd3JpdGUgbG9ja3MuCisgKi8KKyNkZWZpbmUgTUFYX0hPTERFUlMgNAorI2RlZmluZSBNQVhfU1RBQ0sgMTAKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHN0YWNrX2VudHJpZXNbTUFYX1NUQUNLXTsKKworc3RydWN0IGJsb2NrX2xvY2sgeworCXNwaW5sb2NrX3QgbG9jazsKKwlfX3MzMiBjb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRlcnM7CisJc3RydWN0IHRhc2tfc3RydWN0ICpob2xkZXJzW01BWF9IT0xERVJTXTsKKworI2lmZGVmIENPTkZJR19ETV9ERUJVR19CTE9DS19TVEFDS19UUkFDSU5HCisJc3RydWN0IHN0YWNrX3RyYWNlIHRyYWNlc1tNQVhfSE9MREVSU107CisJc3RhY2tfZW50cmllcyBlbnRyaWVzW01BWF9IT0xERVJTXTsKKyNlbmRpZgorfTsKKworc3RydWN0IHdhaXRlciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlpbnQgd2FudHNfd3JpdGU7Cit9OworCitzdGF0aWMgdW5zaWduZWQgX19maW5kX2hvbGRlcihzdHJ1Y3QgYmxvY2tfbG9jayAqbG9jaywKKwkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9IT0xERVJTOyBpKyspCisJCWlmIChsb2NrLT5ob2xkZXJzW2ldID09IHRhc2spCisJCQlicmVhazsKKworCUJVR19PTihpID09IE1BWF9IT0xERVJTKTsKKwlyZXR1cm4gaTsKK30KKworLyogY2FsbCB0aGlzICphZnRlciogeW91IGluY3JlbWVudCBsb2NrLT5jb3VudCAqLworc3RhdGljIHZvaWQgX19hZGRfaG9sZGVyKHN0cnVjdCBibG9ja19sb2NrICpsb2NrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJdW5zaWduZWQgaCA9IF9fZmluZF9ob2xkZXIobG9jaywgTlVMTCk7CisjaWZkZWYgQ09ORklHX0RNX0RFQlVHX0JMT0NLX1NUQUNLX1RSQUNJTkcKKwlzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnQ7CisjZW5kaWYKKworCWdldF90YXNrX3N0cnVjdCh0YXNrKTsKKwlsb2NrLT5ob2xkZXJzW2hdID0gdGFzazsKKworI2lmZGVmIENPTkZJR19ETV9ERUJVR19CTE9DS19TVEFDS19UUkFDSU5HCisJdCA9IGxvY2stPnRyYWNlcyArIGg7CisJdC0+bnJfZW50cmllcyA9IDA7CisJdC0+bWF4X2VudHJpZXMgPSBNQVhfU1RBQ0s7CisJdC0+ZW50cmllcyA9IGxvY2stPmVudHJpZXNbaF07CisJdC0+c2tpcCA9IDI7CisJc2F2ZV9zdGFja190cmFjZSh0KTsKKyNlbmRpZgorfQorCisvKiBjYWxsIHRoaXMgKmJlZm9yZSogeW91IGRlY3JlbWVudCBsb2NrLT5jb3VudCAqLworc3RhdGljIHZvaWQgX19kZWxfaG9sZGVyKHN0cnVjdCBibG9ja19sb2NrICpsb2NrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJdW5zaWduZWQgaCA9IF9fZmluZF9ob2xkZXIobG9jaywgdGFzayk7CisJbG9jay0+aG9sZGVyc1toXSA9IE5VTEw7CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworfQorCitzdGF0aWMgaW50IF9fY2hlY2tfaG9sZGVyKHN0cnVjdCBibG9ja19sb2NrICpsb2NrKQoreworCXVuc2lnbmVkIGk7CisjaWZkZWYgQ09ORklHX0RNX0RFQlVHX0JMT0NLX1NUQUNLX1RSQUNJTkcKKwlzdGF0aWMgc3RydWN0IHN0YWNrX3RyYWNlIHQ7CisJc3RhdGljIHN0YWNrX2VudHJpZXMgZW50cmllczsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IE1BWF9IT0xERVJTOyBpKyspIHsKKwkJaWYgKGxvY2stPmhvbGRlcnNbaV0gPT0gY3VycmVudCkgeworCQkJRE1FUlIoInJlY3Vyc2l2ZSBsb2NrIGRldGVjdGVkIGluIHBvb2wgbWV0YWRhdGEiKTsKKyNpZmRlZiBDT05GSUdfRE1fREVCVUdfQkxPQ0tfU1RBQ0tfVFJBQ0lORworCQkJRE1FUlIoInByZXZpb3VzbHkgaGVsZCBoZXJlOiIpOworCQkJcHJpbnRfc3RhY2tfdHJhY2UobG9jay0+dHJhY2VzICsgaSwgNCk7CisKKwkJCURNRVJSKCJzdWJzZXF1ZW50IGFxdWlzaXRpb24gYXR0ZW1wdGVkIGhlcmU6Iik7CisJCQl0Lm5yX2VudHJpZXMgPSAwOworCQkJdC5tYXhfZW50cmllcyA9IE1BWF9TVEFDSzsKKwkJCXQuZW50cmllcyA9IGVudHJpZXM7CisJCQl0LnNraXAgPSAzOworCQkJc2F2ZV9zdGFja190cmFjZSgmdCk7CisJCQlwcmludF9zdGFja190cmFjZSgmdCwgNCk7CisjZW5kaWYKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fd2FpdChzdHJ1Y3Qgd2FpdGVyICp3KQoreworCWZvciAoOzspIHsKKwkJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJCWlmICghdy0+dGFzaykKKwkJCWJyZWFrOworCisJCXNjaGVkdWxlKCk7CisJfQorCisJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19SVU5OSU5HKTsKK30KKworc3RhdGljIHZvaWQgX193YWtlX3dhaXRlcihzdHJ1Y3Qgd2FpdGVyICp3KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKworCWxpc3RfZGVsKCZ3LT5saXN0KTsKKwl0YXNrID0gdy0+dGFzazsKKwlzbXBfbWIoKTsKKwl3LT50YXNrID0gTlVMTDsKKwl3YWtlX3VwX3Byb2Nlc3ModGFzayk7Cit9CisKKy8qCisgKiBXZSBlaXRoZXIgd2FrZSBhIGZldyByZWFkZXJzIG9yIGEgc2luZ2xlIHdyaXRlci4KKyAqLworc3RhdGljIHZvaWQgX193YWtlX21hbnkoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJc3RydWN0IHdhaXRlciAqdywgKnRtcDsKKworCUJVR19PTihsb2NrLT5jb3VudCA8IDApOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3LCB0bXAsICZsb2NrLT53YWl0ZXJzLCBsaXN0KSB7CisJCWlmIChsb2NrLT5jb3VudCA+PSBNQVhfSE9MREVSUykKKwkJCXJldHVybjsKKworCQlpZiAody0+d2FudHNfd3JpdGUpIHsKKwkJCWlmIChsb2NrLT5jb3VudCA+IDApCisJCQkJcmV0dXJuOyAvKiBzdGlsbCByZWFkIGxvY2tlZCAqLworCisJCQlsb2NrLT5jb3VudCA9IC0xOworCQkJX19hZGRfaG9sZGVyKGxvY2ssIHctPnRhc2spOworCQkJX193YWtlX3dhaXRlcih3KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWxvY2stPmNvdW50Kys7CisJCV9fYWRkX2hvbGRlcihsb2NrLCB3LT50YXNrKTsKKwkJX193YWtlX3dhaXRlcih3KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJsX2luaXQoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaW5pdCgmbG9jay0+bG9jayk7CisJbG9jay0+Y291bnQgPSAwOworCUlOSVRfTElTVF9IRUFEKCZsb2NrLT53YWl0ZXJzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPTERFUlM7IGkrKykKKwkJbG9jay0+aG9sZGVyc1tpXSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19hdmFpbGFibGVfZm9yX3JlYWQoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJcmV0dXJuIGxvY2stPmNvdW50ID49IDAgJiYKKwkJbG9jay0+Y291bnQgPCBNQVhfSE9MREVSUyAmJgorCQlsaXN0X2VtcHR5KCZsb2NrLT53YWl0ZXJzKTsKK30KKworc3RhdGljIGludCBibF9kb3duX3JlYWQoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJaW50IHI7CisJc3RydWN0IHdhaXRlciB3OworCisJc3Bpbl9sb2NrKCZsb2NrLT5sb2NrKTsKKwlyID0gX19jaGVja19ob2xkZXIobG9jayk7CisJaWYgKHIpIHsKKwkJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAoX19hdmFpbGFibGVfZm9yX3JlYWQobG9jaykpIHsKKwkJbG9jay0+Y291bnQrKzsKKwkJX19hZGRfaG9sZGVyKGxvY2ssIGN1cnJlbnQpOworCQlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCWdldF90YXNrX3N0cnVjdChjdXJyZW50KTsKKworCXcudGFzayA9IGN1cnJlbnQ7CisJdy53YW50c193cml0ZSA9IDA7CisJbGlzdF9hZGRfdGFpbCgmdy5saXN0LCAmbG9jay0+d2FpdGVycyk7CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworCisJX193YWl0KCZ3KTsKKwlwdXRfdGFza19zdHJ1Y3QoY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmxfZG93bl9yZWFkX25vbmJsb2NrKHN0cnVjdCBibG9ja19sb2NrICpsb2NrKQoreworCWludCByOworCisJc3Bpbl9sb2NrKCZsb2NrLT5sb2NrKTsKKwlyID0gX19jaGVja19ob2xkZXIobG9jayk7CisJaWYgKHIpCisJCWdvdG8gb3V0OworCisJaWYgKF9fYXZhaWxhYmxlX2Zvcl9yZWFkKGxvY2spKSB7CisJCWxvY2stPmNvdW50Kys7CisJCV9fYWRkX2hvbGRlcihsb2NrLCBjdXJyZW50KTsKKwkJciA9IDA7CisJfSBlbHNlCisJCXIgPSAtRVdPVUxEQkxPQ0s7CisKK291dDoKKwlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGJsX3VwX3JlYWQoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJc3Bpbl9sb2NrKCZsb2NrLT5sb2NrKTsKKwlCVUdfT04obG9jay0+Y291bnQgPD0gMCk7CisJX19kZWxfaG9sZGVyKGxvY2ssIGN1cnJlbnQpOworCS0tbG9jay0+Y291bnQ7CisJaWYgKCFsaXN0X2VtcHR5KCZsb2NrLT53YWl0ZXJzKSkKKwkJX193YWtlX21hbnkobG9jayk7CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworfQorCitzdGF0aWMgaW50IGJsX2Rvd25fd3JpdGUoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJaW50IHI7CisJc3RydWN0IHdhaXRlciB3OworCisJc3Bpbl9sb2NrKCZsb2NrLT5sb2NrKTsKKwlyID0gX19jaGVja19ob2xkZXIobG9jayk7CisJaWYgKHIpIHsKKwkJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAobG9jay0+Y291bnQgPT0gMCAmJiBsaXN0X2VtcHR5KCZsb2NrLT53YWl0ZXJzKSkgeworCQlsb2NrLT5jb3VudCA9IC0xOworCQlfX2FkZF9ob2xkZXIobG9jaywgY3VycmVudCk7CisJCXNwaW5fdW5sb2NrKCZsb2NrLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZ2V0X3Rhc2tfc3RydWN0KGN1cnJlbnQpOworCXcudGFzayA9IGN1cnJlbnQ7CisJdy53YW50c193cml0ZSA9IDE7CisKKwkvKgorCSAqIFdyaXRlcnMgZ2l2ZW4gcHJpb3JpdHkuIFdlIGtub3cgdGhlcmUncyBvbmx5IG9uZSBtdXRhdG9yIGluIHRoZQorCSAqIHN5c3RlbSwgc28gaWdub3JpbmcgdGhlIG9yZGVyaW5nIHJldmVyc2FsLgorCSAqLworCWxpc3RfYWRkKCZ3Lmxpc3QsICZsb2NrLT53YWl0ZXJzKTsKKwlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisKKwlfX3dhaXQoJncpOworCXB1dF90YXNrX3N0cnVjdChjdXJyZW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibF91cF93cml0ZShzdHJ1Y3QgYmxvY2tfbG9jayAqbG9jaykKK3sKKwlzcGluX2xvY2soJmxvY2stPmxvY2spOworCV9fZGVsX2hvbGRlcihsb2NrLCBjdXJyZW50KTsKKwlsb2NrLT5jb3VudCA9IDA7CisJaWYgKCFsaXN0X2VtcHR5KCZsb2NrLT53YWl0ZXJzKSkKKwkJX193YWtlX21hbnkobG9jayk7CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRfcmVjdXJzaXZlX2J1ZyhkbV9ibG9ja190IGIsIGludCByKQoreworCWlmIChyID09IC1FSU5WQUwpCisJCURNRVJSKCJyZWN1cnNpdmUgYWNxdWlzaXRpb24gb2YgYmxvY2sgJWxsdSByZXF1ZXN0ZWQuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBCbG9jayBtYW5hZ2VyIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCB1c2luZyBkbS1idWZpby4gIHN0cnVjdAorICogZG1fYmxvY2tfbWFuYWdlciBhbmQgc3RydWN0IGRtX2Jsb2NrIG1hcCBkaXJlY3RseSBvbnRvIGEgY291cGxlIG9mCisgKiBzdHJ1Y3RzIGluIHRoZSBidWZpbyBpbnRlcmZhY2UuICBJIHdhbnQgdG8gcmV0YWluIHRoZSBmcmVlZG9tIHRvIG1vdmUKKyAqIGF3YXkgZnJvbSBidWZpbyBpbiB0aGUgZnV0dXJlLiAgU28gdGhlc2Ugc3RydWN0cyBhcmUganVzdCBjYXN0IHdpdGhpbgorICogdGhpcyAuYyBmaWxlLCByYXRoZXIgdGhhbiBtYWtpbmcgaXQgdGhyb3VnaCB0byB0aGUgcHVibGljIGludGVyZmFjZS4KKyAqLworc3RhdGljIHN0cnVjdCBkbV9idWZmZXIgKnRvX2J1ZmZlcihzdHJ1Y3QgZG1fYmxvY2sgKmIpCit7CisJcmV0dXJuIChzdHJ1Y3QgZG1fYnVmZmVyICopIGI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICp0b19idWZpbyhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0pCit7CisJcmV0dXJuIChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICopIGJtOworfQorCitkbV9ibG9ja190IGRtX2Jsb2NrX2xvY2F0aW9uKHN0cnVjdCBkbV9ibG9jayAqYikKK3sKKwlyZXR1cm4gZG1fYnVmaW9fZ2V0X2Jsb2NrX251bWJlcih0b19idWZmZXIoYikpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYmxvY2tfbG9jYXRpb24pOworCit2b2lkICpkbV9ibG9ja19kYXRhKHN0cnVjdCBkbV9ibG9jayAqYikKK3sKKwlyZXR1cm4gZG1fYnVmaW9fZ2V0X2Jsb2NrX2RhdGEodG9fYnVmZmVyKGIpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2Jsb2NrX2RhdGEpOworCitzdHJ1Y3QgYnVmZmVyX2F1eCB7CisJc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdmFsaWRhdG9yOworCXN0cnVjdCBibG9ja19sb2NrIGxvY2s7CisJaW50IHdyaXRlX2xvY2tlZDsKK307CisKK3N0YXRpYyB2b2lkIGRtX2Jsb2NrX21hbmFnZXJfYWxsb2NfY2FsbGJhY2soc3RydWN0IGRtX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBidWZmZXJfYXV4ICphdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEoYnVmKTsKKwlhdXgtPnZhbGlkYXRvciA9IE5VTEw7CisJYmxfaW5pdCgmYXV4LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZG1fYmxvY2tfbWFuYWdlcl93cml0ZV9jYWxsYmFjayhzdHJ1Y3QgZG1fYnVmZmVyICpidWYpCit7CisJc3RydWN0IGJ1ZmZlcl9hdXggKmF1eCA9IGRtX2J1ZmlvX2dldF9hdXhfZGF0YShidWYpOworCWlmIChhdXgtPnZhbGlkYXRvcikgeworCQlhdXgtPnZhbGlkYXRvci0+cHJlcGFyZV9mb3Jfd3JpdGUoYXV4LT52YWxpZGF0b3IsIChzdHJ1Y3QgZG1fYmxvY2sgKikgYnVmLAorCQkJIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKGRtX2J1ZmlvX2dldF9jbGllbnQoYnVmKSkpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdWJsaWMgaW50ZXJmYWNlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpkbV9ibG9ja19tYW5hZ2VyX2NyZWF0ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJCQkJIHVuc2lnbmVkIGJsb2NrX3NpemUsCisJCQkJCQkgdW5zaWduZWQgY2FjaGVfc2l6ZSwKKwkJCQkJCSB1bnNpZ25lZCBtYXhfaGVsZF9wZXJfdGhyZWFkKQoreworCXJldHVybiAoc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKikKKwkJZG1fYnVmaW9fY2xpZW50X2NyZWF0ZShiZGV2LCBibG9ja19zaXplLCBtYXhfaGVsZF9wZXJfdGhyZWFkLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9hdXgpLAorCQkJCSAgICAgICBkbV9ibG9ja19tYW5hZ2VyX2FsbG9jX2NhbGxiYWNrLAorCQkJCSAgICAgICBkbV9ibG9ja19tYW5hZ2VyX3dyaXRlX2NhbGxiYWNrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2Jsb2NrX21hbmFnZXJfY3JlYXRlKTsKKwordm9pZCBkbV9ibG9ja19tYW5hZ2VyX2Rlc3Ryb3koc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtKQoreworCXJldHVybiBkbV9idWZpb19jbGllbnRfZGVzdHJveSh0b19idWZpbyhibSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYmxvY2tfbWFuYWdlcl9kZXN0cm95KTsKKwordW5zaWduZWQgZG1fYm1fYmxvY2tfc2l6ZShzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0pCit7CisJcmV0dXJuIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKHRvX2J1ZmlvKGJtKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9ibV9ibG9ja19zaXplKTsKKworZG1fYmxvY2tfdCBkbV9ibV9ucl9ibG9ja3Moc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtKQoreworCXJldHVybiBkbV9idWZpb19nZXRfZGV2aWNlX3NpemUodG9fYnVmaW8oYm0pKTsKK30KKworc3RhdGljIGludCBkbV9ibV92YWxpZGF0ZV9idWZmZXIoc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLAorCQkJCSBzdHJ1Y3QgZG1fYnVmZmVyICpidWYsCisJCQkJIHN0cnVjdCBidWZmZXJfYXV4ICphdXgsCisJCQkJIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYpCit7CisJaWYgKHVubGlrZWx5KCFhdXgtPnZhbGlkYXRvcikpIHsKKwkJaW50IHI7CisJCWlmICghdikKKwkJCXJldHVybiAwOworCQlyID0gdi0+Y2hlY2sodiwgKHN0cnVjdCBkbV9ibG9jayAqKSBidWYsIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKHRvX2J1ZmlvKGJtKSkpOworCQlpZiAodW5saWtlbHkocikpCisJCQlyZXR1cm4gcjsKKwkJYXV4LT52YWxpZGF0b3IgPSB2OworCX0gZWxzZSB7CisJCWlmICh1bmxpa2VseShhdXgtPnZhbGlkYXRvciAhPSB2KSkgeworCQkJRE1FUlIoInZhbGlkYXRvciBtaXNtYXRjaCAob2xkPSVzIHZzIG5ldz0lcykgZm9yIGJsb2NrICVsbHUiLAorCQkJCWF1eC0+dmFsaWRhdG9yLT5uYW1lLCB2ID8gdi0+bmFtZSA6ICJOVUxMIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQlkbV9idWZpb19nZXRfYmxvY2tfbnVtYmVyKGJ1ZikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KK2ludCBkbV9ibV9yZWFkX2xvY2soc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLCBkbV9ibG9ja190IGIsCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0KQoreworCXN0cnVjdCBidWZmZXJfYXV4ICphdXg7CisJdm9pZCAqcDsKKwlpbnQgcjsKKworCXAgPSBkbV9idWZpb19yZWFkKHRvX2J1ZmlvKGJtKSwgYiwgKHN0cnVjdCBkbV9idWZmZXIgKiopIHJlc3VsdCk7CisJaWYgKHVubGlrZWx5KElTX0VSUihwKSkpCisJCXJldHVybiBQVFJfRVJSKHApOworCisJYXV4ID0gZG1fYnVmaW9fZ2V0X2F1eF9kYXRhKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJciA9IGJsX2Rvd25fcmVhZCgmYXV4LT5sb2NrKTsKKwlpZiAodW5saWtlbHkocikpIHsKKwkJZG1fYnVmaW9fcmVsZWFzZSh0b19idWZmZXIoKnJlc3VsdCkpOworCQlyZXBvcnRfcmVjdXJzaXZlX2J1ZyhiLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCisJYXV4LT53cml0ZV9sb2NrZWQgPSAwOworCisJciA9IGRtX2JtX3ZhbGlkYXRlX2J1ZmZlcihibSwgdG9fYnVmZmVyKCpyZXN1bHQpLCBhdXgsIHYpOworCWlmICh1bmxpa2VseShyKSkgeworCQlibF91cF9yZWFkKCZhdXgtPmxvY2spOworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYm1fcmVhZF9sb2NrKTsKKworaW50IGRtX2JtX3dyaXRlX2xvY2soc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLAorCQkgICAgIGRtX2Jsb2NrX3QgYiwgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJICAgICBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpCit7CisJc3RydWN0IGJ1ZmZlcl9hdXggKmF1eDsKKwl2b2lkICpwOworCWludCByOworCisJcCA9IGRtX2J1ZmlvX3JlYWQodG9fYnVmaW8oYm0pLCBiLCAoc3RydWN0IGRtX2J1ZmZlciAqKikgcmVzdWx0KTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHApKSkKKwkJcmV0dXJuIFBUUl9FUlIocCk7CisKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKCpyZXN1bHQpKTsKKwlyID0gYmxfZG93bl93cml0ZSgmYXV4LT5sb2NrKTsKKwlpZiAocikgeworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJlcG9ydF9yZWN1cnNpdmVfYnVnKGIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlhdXgtPndyaXRlX2xvY2tlZCA9IDE7CisKKwlyID0gZG1fYm1fdmFsaWRhdGVfYnVmZmVyKGJtLCB0b19idWZmZXIoKnJlc3VsdCksIGF1eCwgdik7CisJaWYgKHVubGlrZWx5KHIpKSB7CisJCWJsX3VwX3dyaXRlKCZhdXgtPmxvY2spOworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYm1fd3JpdGVfbG9jayk7CisKK2ludCBkbV9ibV9yZWFkX3RyeV9sb2NrKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJCWRtX2Jsb2NrX3QgYiwgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJCXN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2F1eCAqYXV4OworCXZvaWQgKnA7CisJaW50IHI7CisKKwlwID0gZG1fYnVmaW9fZ2V0KHRvX2J1ZmlvKGJtKSwgYiwgKHN0cnVjdCBkbV9idWZmZXIgKiopIHJlc3VsdCk7CisJaWYgKHVubGlrZWx5KElTX0VSUihwKSkpCisJCXJldHVybiBQVFJfRVJSKHApOworCWlmICh1bmxpa2VseSghcCkpCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKCpyZXN1bHQpKTsKKwlyID0gYmxfZG93bl9yZWFkX25vbmJsb2NrKCZhdXgtPmxvY2spOworCWlmIChyIDwgMCkgeworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJlcG9ydF9yZWN1cnNpdmVfYnVnKGIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisJYXV4LT53cml0ZV9sb2NrZWQgPSAwOworCisJciA9IGRtX2JtX3ZhbGlkYXRlX2J1ZmZlcihibSwgdG9fYnVmZmVyKCpyZXN1bHQpLCBhdXgsIHYpOworCWlmICh1bmxpa2VseShyKSkgeworCQlibF91cF9yZWFkKCZhdXgtPmxvY2spOworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZG1fYm1fd3JpdGVfbG9ja196ZXJvKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJCSAgZG1fYmxvY2tfdCBiLCBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkJICBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpCit7CisJaW50IHI7CisJc3RydWN0IGJ1ZmZlcl9hdXggKmF1eDsKKwl2b2lkICpwOworCisJcCA9IGRtX2J1ZmlvX25ldyh0b19idWZpbyhibSksIGIsIChzdHJ1Y3QgZG1fYnVmZmVyICoqKSByZXN1bHQpOworCWlmICh1bmxpa2VseShJU19FUlIocCkpKQorCQlyZXR1cm4gUFRSX0VSUihwKTsKKworCW1lbXNldChwLCAwLCBkbV9ibV9ibG9ja19zaXplKGJtKSk7CisKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKCpyZXN1bHQpKTsKKwlyID0gYmxfZG93bl93cml0ZSgmYXV4LT5sb2NrKTsKKwlpZiAocikgeworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJldHVybiByOworCX0KKworCWF1eC0+d3JpdGVfbG9ja2VkID0gMTsKKwlhdXgtPnZhbGlkYXRvciA9IHY7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX2JtX3VubG9jayhzdHJ1Y3QgZG1fYmxvY2sgKmIpCit7CisJc3RydWN0IGJ1ZmZlcl9hdXggKmF1eDsKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKGIpKTsKKworCWlmIChhdXgtPndyaXRlX2xvY2tlZCkgeworCQlkbV9idWZpb19tYXJrX2J1ZmZlcl9kaXJ0eSh0b19idWZmZXIoYikpOworCQlibF91cF93cml0ZSgmYXV4LT5sb2NrKTsKKwl9IGVsc2UKKwkJYmxfdXBfcmVhZCgmYXV4LT5sb2NrKTsKKworCWRtX2J1ZmlvX3JlbGVhc2UodG9fYnVmZmVyKGIpKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYm1fdW5sb2NrKTsKKworaW50IGRtX2JtX3VubG9ja19tb3ZlKHN0cnVjdCBkbV9ibG9jayAqYiwgZG1fYmxvY2tfdCBuKQoreworCXN0cnVjdCBidWZmZXJfYXV4ICphdXg7CisKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKGIpKTsKKworCWlmIChhdXgtPndyaXRlX2xvY2tlZCkgeworCQlkbV9idWZpb19tYXJrX2J1ZmZlcl9kaXJ0eSh0b19idWZmZXIoYikpOworCQlibF91cF93cml0ZSgmYXV4LT5sb2NrKTsKKwl9IGVsc2UKKwkJYmxfdXBfcmVhZCgmYXV4LT5sb2NrKTsKKworCWRtX2J1ZmlvX3JlbGVhc2VfbW92ZSh0b19idWZmZXIoYiksIG4pOworCXJldHVybiAwOworfQorCitpbnQgZG1fYm1fZmx1c2hfYW5kX3VubG9jayhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sCisJCQkgICBzdHJ1Y3QgZG1fYmxvY2sgKnN1cGVyYmxvY2spCit7CisJaW50IHI7CisKKwlyID0gZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVycyh0b19idWZpbyhibSkpOworCWlmICh1bmxpa2VseShyKSkKKwkJcmV0dXJuIHI7CisJciA9IGRtX2J1ZmlvX2lzc3VlX2ZsdXNoKHRvX2J1ZmlvKGJtKSk7CisJaWYgKHVubGlrZWx5KHIpKQorCQlyZXR1cm4gcjsKKworCWRtX2JtX3VubG9jayhzdXBlcmJsb2NrKTsKKworCXIgPSBkbV9idWZpb193cml0ZV9kaXJ0eV9idWZmZXJzKHRvX2J1ZmlvKGJtKSk7CisJaWYgKHVubGlrZWx5KHIpKQorCQlyZXR1cm4gcjsKKwlyID0gZG1fYnVmaW9faXNzdWVfZmx1c2godG9fYnVmaW8oYm0pKTsKKwlpZiAodW5saWtlbHkocikpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3UzMiBkbV9ibV9jaGVja3N1bShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB1MzIgaW5pdF94b3IpCit7CisJcmV0dXJuIGNyYzMyYyh+KHUzMikgMCwgZGF0YSwgbGVuKSBeIGluaXRfeG9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYm1fY2hlY2tzdW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKb2UgVGhvcm5iZXIgPGRtLWRldmVsQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkltbXV0YWJsZSBtZXRhZGF0YSBsaWJyYXJ5IGZvciBkbSIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYmxvY2stbWFuYWdlci5oIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYmxvY2stbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDgzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1ibG9jay1tYW5hZ2VyLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0RNX0JMT0NLX01BTkFHRVJfSAorI2RlZmluZSBfTElOVVhfRE1fQkxPQ0tfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQmxvY2sgbnVtYmVyLgorICovCit0eXBlZGVmIHVpbnQ2NF90IGRtX2Jsb2NrX3Q7CitzdHJ1Y3QgZG1fYmxvY2s7CisKK2RtX2Jsb2NrX3QgZG1fYmxvY2tfbG9jYXRpb24oc3RydWN0IGRtX2Jsb2NrICpiKTsKK3ZvaWQgKmRtX2Jsb2NrX2RhdGEoc3RydWN0IGRtX2Jsb2NrICpiKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEBuYW1lIHNob3VsZCBiZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYmxvY2sgbWFuYWdlciwgbm8gbG9uZ2VyCisgKiB0aGFuIDMyIGNoYXJzLgorICoKKyAqIEBtYXhfaGVsZF9wZXJfdGhyZWFkIHNob3VsZCBiZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9ja3MsIHJlYWQgb3IKKyAqIHdyaXRlLCB0aGF0IGFuIGluZGl2aWR1YWwgdGhyZWFkIGhvbGRzIGF0IGFueSBvbmUgdGltZS4KKyAqLworc3RydWN0IGRtX2Jsb2NrX21hbmFnZXI7CitzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqZG1fYmxvY2tfbWFuYWdlcl9jcmVhdGUoCisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgYmxvY2tfc2l6ZSwKKwl1bnNpZ25lZCBjYWNoZV9zaXplLCB1bnNpZ25lZCBtYXhfaGVsZF9wZXJfdGhyZWFkKTsKK3ZvaWQgZG1fYmxvY2tfbWFuYWdlcl9kZXN0cm95KHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSk7CisKK3Vuc2lnbmVkIGRtX2JtX2Jsb2NrX3NpemUoc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtKTsKK2RtX2Jsb2NrX3QgZG1fYm1fbnJfYmxvY2tzKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUaGUgdmFsaWRhdG9yIGFsbG93cyB0aGUgY2FsbGVyIHRvIHZlcmlmeSBuZXdseS1yZWFkIGRhdGEgYW5kIG1vZGlmeQorICogdGhlIGRhdGEganVzdCBiZWZvcmUgd3JpdGluZywgZS5nLiB0byBjYWxjdWxhdGUgY2hlY2tzdW1zLiAgSXQncworICogaW1wb3J0YW50IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB5b3VyIHVzZSBvZiB2YWxpZGF0b3JzLiAgVGhlIG9ubHkgdGltZQorICogeW91IGNhbiBjaGFuZ2UgdmFsaWRhdG9ycyBpcyBpZiB5b3UgY2FsbCBkbV9ibV93cml0ZV9sb2NrX3plcm8uCisgKi8KK3N0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAoKnByZXBhcmVfZm9yX3dyaXRlKShzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LCBzdHJ1Y3QgZG1fYmxvY2sgKmIsIHNpemVfdCBibG9ja19zaXplKTsKKworCS8qCisJICogUmV0dXJuIDAgaWYgdGhlIGNoZWNrc3VtIGlzIHZhbGlkIG9yIDwgMCBvbiBlcnJvci4KKwkgKi8KKwlpbnQgKCpjaGVjaykoc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwgc3RydWN0IGRtX2Jsb2NrICpiLCBzaXplX3QgYmxvY2tfc2l6ZSk7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogWW91IGNhbiBoYXZlIG11bHRpcGxlIGNvbmN1cnJlbnQgcmVhZGVycyBvciBhIHNpbmdsZSB3cml0ZXIgaG9sZGluZyBhCisgKiBibG9jayBsb2NrLgorICovCisKKy8qCisgKiBkbV9ibV9sb2NrKCkgbG9ja3MgYSBibG9jayBhbmQgcmV0dXJucyB0aHJvdWdoIEByZXN1bHQgYSBwb2ludGVyIHRvCisgKiBtZW1vcnkgdGhhdCBob2xkcyBhIGNvcHkgb2YgdGhhdCBibG9jay4gIElmIHlvdSBoYXZlIHdyaXRlLWxvY2tlZCB0aGUKKyAqIGJsb2NrIHRoZW4gYW55IGNoYW5nZXMgeW91IG1ha2UgdG8gbWVtb3J5IHBvaW50ZWQgdG8gYnkgQHJlc3VsdCB3aWxsIGJlCisgKiB3cml0dGVuIGJhY2sgdG8gdGhlIGRpc2sgc29tZXRpbWUgYWZ0ZXIgZG1fYm1fdW5sb2NrIGlzIGNhbGxlZC4KKyAqLworaW50IGRtX2JtX3JlYWRfbG9jayhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3QgYiwKKwkJICAgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpOworCitpbnQgZG1fYm1fd3JpdGVfbG9jayhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3QgYiwKKwkJICAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCk7CisKKy8qCisgKiBUaGUgKl90cnlfbG9jayB2YXJpYW50cyByZXR1cm4gLUVXT1VMREJMT0NLIGlmIHRoZSBibG9jayBpc24ndAorICogYXZhaWxhYmxlIGltbWVkaWF0ZWx5LgorICovCitpbnQgZG1fYm1fcmVhZF90cnlfbG9jayhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3QgYiwKKwkJCXN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCQlzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpOworCisvKgorICogVXNlIGRtX2JtX3dyaXRlX2xvY2tfemVybygpIHdoZW4geW91IGtub3cgeW91J3JlIGdvaW5nIHRvCisgKiBvdmVyd3JpdGUgdGhlIGJsb2NrIGNvbXBsZXRlbHkuICBJdCBzYXZlcyBhIGRpc2sgcmVhZC4KKyAqLworaW50IGRtX2JtX3dyaXRlX2xvY2tfemVybyhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3QgYiwKKwkJCSAgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJCSAgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0KTsKKworaW50IGRtX2JtX3VubG9jayhzdHJ1Y3QgZG1fYmxvY2sgKmIpOworCisvKgorICogQW4gb3B0aW1pc2F0aW9uOyB3ZSBvZnRlbiB3YW50IHRvIGNvcHkgYSBibG9jaydzIGNvbnRlbnRzIHRvIGEgbmV3CisgKiBibG9jay4gIGVnLCBhcyBwYXJ0IG9mIHRoZSBzaGFkb3dpbmcgb3BlcmF0aW9uLiAgSXQncyBmYXIgYmV0dGVyIGZvcgorICogYnVmaW8gdG8gZG8gdGhpcyBtb3ZlIGJlaGluZCB0aGUgc2NlbmVzIHRoYW4gaG9sZCAyIGxvY2tzIGFuZCBtZW1jcHkgdGhlCisgKiBkYXRhLgorICovCitpbnQgZG1fYm1fdW5sb2NrX21vdmUoc3RydWN0IGRtX2Jsb2NrICpiLCBkbV9ibG9ja190IG4pOworCisvKgorICogSXQncyBhIGNvbW1vbiBpZGlvbSB0byBoYXZlIGEgc3VwZXJibG9jayB0aGF0IHNob3VsZCBiZSBjb21taXR0ZWQgbGFzdC4KKyAqCisgKiBAc3VwZXJibG9jayBzaG91bGQgYmUgd3JpdGUtbG9ja2VkIG9uIGVudHJ5LiBJdCB3aWxsIGJlIHVubG9ja2VkIGR1cmluZworICogdGhpcyBmdW5jdGlvbi4gIEFsbCBkaXJ0eSBibG9ja3MgYXJlIGd1YXJhbnRlZWQgdG8gYmUgd3JpdHRlbiBhbmQgZmx1c2hlZAorICogYmVmb3JlIHRoZSBzdXBlcmJsb2NrLgorICoKKyAqIFRoaXMgbWV0aG9kIGFsd2F5cyBibG9ja3MuCisgKi8KK2ludCBkbV9ibV9mbHVzaF9hbmRfdW5sb2NrKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJCSAgIHN0cnVjdCBkbV9ibG9jayAqc3VwZXJibG9jayk7CisKK3UzMiBkbV9ibV9jaGVja3N1bShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB1MzIgaW5pdF94b3IpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYJLyogX0xJTlVYX0RNX0JMT0NLX01BTkFHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUtaW50ZXJuYWwuaCBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3OWM3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLWludGVybmFsLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgRE1fQlRSRUVfSU5URVJOQUxfSAorI2RlZmluZSBETV9CVFJFRV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJkbS1idHJlZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogV2UnbGwgbmVlZCAyIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3Igbi0+Y3N1bSBhbmQgbi0+YmxvY2tucgorICogdG8gc3VwcG9ydCBkbS1idHJlZS1zcGluZS5jIGluIHRoYXQgY2FzZS4KKyAqLworCitlbnVtIG5vZGVfZmxhZ3MgeworCUlOVEVSTkFMX05PREUgPSAxLAorCUxFQUZfTk9ERSA9IDEgPDwgMQorfTsKKworLyoKKyAqIEV2ZXJ5IGJ0cmVlIG5vZGUgYmVnaW5zIHdpdGggdGhpcyBzdHJ1Y3R1cmUuICBNYWtlIHN1cmUgaXQncyBhIG11bHRpcGxlCisgKiBvZiA4LWJ5dGVzIGluIHNpemUsIG90aGVyd2lzZSB0aGUgNjRiaXQga2V5cyB3aWxsIGJlIG1pcy1hbGlnbmVkLgorICovCitzdHJ1Y3Qgbm9kZV9oZWFkZXIgeworCV9fbGUzMiBjc3VtOworCV9fbGUzMiBmbGFnczsKKwlfX2xlNjQgYmxvY2tucjsgLyogQmxvY2sgdGhpcyBub2RlIGlzIHN1cHBvc2VkIHRvIGxpdmUgaW4uICovCisKKwlfX2xlMzIgbnJfZW50cmllczsKKwlfX2xlMzIgbWF4X2VudHJpZXM7CisJX19sZTMyIHZhbHVlX3NpemU7CisJX19sZTMyIHBhZGRpbmc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgbm9kZSB7CisJc3RydWN0IG5vZGVfaGVhZGVyIGhlYWRlcjsKKwlfX2xlNjQga2V5c1swXTsKK30gX19wYWNrZWQ7CisKKwordm9pZCBpbmNfY2hpbGRyZW4oc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBzdHJ1Y3Qgbm9kZSAqbiwKKwkJICBzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSAqdnQpOworCitpbnQgbmV3X2Jsb2NrKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpOworaW50IHVubG9ja19ibG9jayhzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgc3RydWN0IGRtX2Jsb2NrICpiKTsKKworLyoKKyAqIFNwaW5lcyBrZWVwIHRyYWNrIG9mIHRoZSByb2xsaW5nIGxvY2tzLiAgVGhlcmUgYXJlIDIgdmFyaWFudHMsIHJlYWQtb25seQorICogYW5kIG9uZSB0aGF0IHVzZXMgc2hhZG93aW5nLiAgVGhlc2UgYXJlIHNlcGFyYXRlIHN0cnVjdHMgdG8gYWxsb3cgdGhlCisgKiB0eXBlIGNoZWNrZXIgdG8gc3BvdCBtaXN1c2UsIGZvciBleGFtcGxlIGFjY2lkZW50YWxseSBjYWxsaW5nIHJlYWRfbG9jaworICogb24gYSBzaGFkb3cgc3BpbmUuCisgKi8KK3N0cnVjdCByb19zcGluZSB7CisJc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm87CisKKwlpbnQgY291bnQ7CisJc3RydWN0IGRtX2Jsb2NrICpub2Rlc1syXTsKK307CisKK3ZvaWQgaW5pdF9yb19zcGluZShzdHJ1Y3Qgcm9fc3BpbmUgKnMsIHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvKTsKK2ludCBleGl0X3JvX3NwaW5lKHN0cnVjdCByb19zcGluZSAqcyk7CitpbnQgcm9fc3RlcChzdHJ1Y3Qgcm9fc3BpbmUgKnMsIGRtX2Jsb2NrX3QgbmV3X2NoaWxkKTsKK3N0cnVjdCBub2RlICpyb19ub2RlKHN0cnVjdCByb19zcGluZSAqcyk7CisKK3N0cnVjdCBzaGFkb3dfc3BpbmUgeworCXN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvOworCisJaW50IGNvdW50OworCXN0cnVjdCBkbV9ibG9jayAqbm9kZXNbMl07CisKKwlkbV9ibG9ja190IHJvb3Q7Cit9OworCit2b2lkIGluaXRfc2hhZG93X3NwaW5lKHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvKTsKK2ludCBleGl0X3NoYWRvd19zcGluZShzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKTsKKworaW50IHNoYWRvd19zdGVwKHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIGRtX2Jsb2NrX3QgYiwKKwkJc3RydWN0IGRtX2J0cmVlX3ZhbHVlX3R5cGUgKnZ0KTsKKworLyoKKyAqIFRoZSBzcGluZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5IGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKi8KK3N0cnVjdCBkbV9ibG9jayAqc2hhZG93X2N1cnJlbnQoc3RydWN0IHNoYWRvd19zcGluZSAqcyk7CisKKy8qCisgKiBUaGUgc3BpbmUgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBlbnRyaWVzIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKi8KK3N0cnVjdCBkbV9ibG9jayAqc2hhZG93X3BhcmVudChzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKTsKKworaW50IHNoYWRvd19oYXNfcGFyZW50KHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMpOworCitpbnQgc2hhZG93X3Jvb3Qoc3RydWN0IHNoYWRvd19zcGluZSAqcyk7CisKKy8qCisgKiBTb21lIGlubGluZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgX19sZTY0ICprZXlfcHRyKHN0cnVjdCBub2RlICpuLCB1aW50MzJfdCBpbmRleCkKK3sKKwlyZXR1cm4gbi0+a2V5cyArIGluZGV4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnZhbHVlX2Jhc2Uoc3RydWN0IG5vZGUgKm4pCit7CisJcmV0dXJuICZuLT5rZXlzW2xlMzJfdG9fY3B1KG4tPmhlYWRlci5tYXhfZW50cmllcyldOworfQorCisvKgorICogRklYTUU6IE5vdyB0aGF0IHZhbHVlIHNpemUgaXMgc3RvcmVkIGluIG5vZGUgd2UgZG9uJ3QgbmVlZCB0aGUgdGhpcmQgcGFybS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICp2YWx1ZV9wdHIoc3RydWN0IG5vZGUgKm4sIHVpbnQzMl90IGluZGV4LCBzaXplX3QgdmFsdWVfc2l6ZSkKK3sKKwlCVUdfT04odmFsdWVfc2l6ZSAhPSBsZTMyX3RvX2NwdShuLT5oZWFkZXIudmFsdWVfc2l6ZSkpOworCXJldHVybiB2YWx1ZV9iYXNlKG4pICsgKHZhbHVlX3NpemUgKiBpbmRleCk7Cit9CisKKy8qCisgKiBBc3N1bWVzIHRoZSB2YWx1ZXMgYXJlIHN1aXRhYmx5LWFsaWduZWQgYW5kIGNvbnZlcnRzIHRvIGNvcmUgZm9ybWF0LgorICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHZhbHVlNjQoc3RydWN0IG5vZGUgKm4sIHVpbnQzMl90IGluZGV4KQoreworCV9fbGU2NCAqdmFsdWVzX2xlID0gdmFsdWVfYmFzZShuKTsKKworCXJldHVybiBsZTY0X3RvX2NwdSh2YWx1ZXNfbGVbaW5kZXhdKTsKK30KKworLyoKKyAqIFNlYXJjaGluZyBmb3IgYSBrZXkgd2l0aGluIGEgc2luZ2xlIG5vZGUuCisgKi8KK2ludCBsb3dlcl9ib3VuZChzdHJ1Y3Qgbm9kZSAqbiwgdWludDY0X3Qga2V5KTsKKworZXh0ZXJuIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgYnRyZWVfbm9kZV92YWxpZGF0b3I7CisKKyNlbmRpZgkvKiBETV9CVFJFRV9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS1yZW1vdmUuYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLXJlbW92ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyM2ZiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS1yZW1vdmUuYwpAQCAtMCwwICsxLDU2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLWJ0cmVlLmgiCisjaW5jbHVkZSAiZG0tYnRyZWUtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmgiCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworLyoKKyAqIFJlbW92aW5nIGFuIGVudHJ5IGZyb20gYSBidHJlZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogQSB2ZXJ5IGltcG9ydGFudCBjb25zdHJhaW50IGZvciBvdXIgYnRyZWUgaXMgdGhhdCBubyBub2RlLCBleGNlcHQgdGhlCisgKiByb290LCBtYXkgaGF2ZSBmZXdlciB0aGFuIGEgY2VydGFpbiBudW1iZXIgb2YgZW50cmllcy4KKyAqIChNSU5fRU5UUklFUyA8PSBucl9lbnRyaWVzIDw9IE1BWF9FTlRSSUVTKS4KKyAqCisgKiBFbnN1cmluZyB0aGlzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSB3YXkgd2Ugd2FudCB0byBvbmx5IGV2ZXIgaG9sZCB0aGUKKyAqIGxvY2tzIG9uIDIgbm9kZXMgY29uY3VycmVudGx5LCBhbmQgb25seSBjaGFuZ2Ugbm9kZXMgaW4gYSB0b3AgdG8gYm90dG9tCisgKiBmYXNoaW9uLgorICoKKyAqIEVhY2ggbm9kZSBtYXkgaGF2ZSBhIGxlZnQgb3IgcmlnaHQgc2libGluZy4gIFdoZW4gZGVjZW5kaW5nIHRoZSBzcGluZSwKKyAqIGlmIGEgbm9kZSBjb250YWlucyBvbmx5IE1JTl9FTlRSSUVTIHRoZW4gd2UgdHJ5IGFuZCBpbmNyZWFzZSB0aGlzIHRvIGF0CisgKiBsZWFzdCBNSU5fRU5UUklFUyArIDEuICBXZSBkbyB0aGlzIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKKyAqCisgKiBbQV0gTm8gc2libGluZ3MgPT4gdGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIG5vZGUgaXMgdGhlIHJvb3QsIGluIHdoaWNoCisgKiAgICAgY2FzZSB3ZSBjb3B5IHRoZSBjaGlsZHMgY29udGVudHMgb3ZlciB0aGUgcm9vdC4KKyAqCisgKiBbQl0gTm8gbGVmdCBzaWJsaW5nCisgKiAgICAgPT0+IHJlYmFsYW5jZShub2RlLCByaWdodCBzaWJsaW5nKQorICoKKyAqIFtDXSBObyByaWdodCBzaWJsaW5nCisgKiAgICAgPT0+IHJlYmFsYW5jZShsZWZ0IHNpYmxpbmcsIG5vZGUpCisgKgorICogW0RdIEJvdGggc2libGluZ3MsIHRvdGFsX2VudHJpZXMobGVmdCwgbm9kZSwgcmlnaHQpIDw9IERFTF9USFJFU0hPTEQKKyAqICAgICA9PT4gZGVsZXRlIG5vZGUgYWRkaW5nIGl0J3MgY29udGVudHMgdG8gbGVmdCBhbmQgcmlnaHQKKyAqCisgKiBbRV0gQm90aCBzaWJsaW5ncywgdG90YWxfZW50cmllcyhsZWZ0LCBub2RlLCByaWdodCkgPiBERUxfVEhSRVNIT0xECisgKiAgICAgPT0+IHJlYmFsYW5jZShsZWZ0LCBub2RlLCByaWdodCkKKyAqCisgKiBBZnRlciB0aGVzZSBvcGVyYXRpb25zIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgb3VyIG9yaWdpbmFsIG5vZGUgbm8KKyAqIGxvbmdlciBjb250YWlucyB0aGUgZGVzaXJlZCBzdWIgdHJlZS4gIEZvciB0aGlzIHJlYXNvbiB0aGlzIHJlYmFsYW5jaW5nCisgKiBpcyBwZXJmb3JtZWQgb24gdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUuICBUaGlzIGFsc28gYXZvaWRzCisgKiBoYXZpbmcgYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSByb290LgorICoKKyAqIE9uY2UgdGhpcyByZWJhbGFuY2luZyBoYXMgb2NjdXJyZWQgd2UgY2FuIHRoZW4gc3RlcCBpbnRvIHRoZSBjaGlsZCBub2RlCisgKiBmb3IgaW50ZXJuYWwgbm9kZXMuICBPciBkZWxldGUgdGhlIGVudHJ5IGZvciBsZWFmIG5vZGVzLgorICovCisKKy8qCisgKiBTb21lIGxpdHRsZSB1dGlsaXRpZXMgZm9yIG1vdmluZyBub2RlIGRhdGEgYXJvdW5kLgorICovCitzdGF0aWMgdm9pZCBub2RlX3NoaWZ0KHN0cnVjdCBub2RlICpuLCBpbnQgc2hpZnQpCit7CisJdWludDMyX3QgbnJfZW50cmllcyA9IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKTsKKwl1aW50MzJfdCB2YWx1ZV9zaXplID0gbGUzMl90b19jcHUobi0+aGVhZGVyLnZhbHVlX3NpemUpOworCisJaWYgKHNoaWZ0IDwgMCkgeworCQlzaGlmdCA9IC1zaGlmdDsKKwkJQlVHX09OKHNoaWZ0ID4gbnJfZW50cmllcyk7CisJCUJVR19PTigodm9pZCAqKSBrZXlfcHRyKG4sIHNoaWZ0KSA+PSB2YWx1ZV9wdHIobiwgc2hpZnQsIHZhbHVlX3NpemUpKTsKKwkJbWVtbW92ZShrZXlfcHRyKG4sIDApLAorCQkJa2V5X3B0cihuLCBzaGlmdCksCisJCQkobnJfZW50cmllcyAtIHNoaWZ0KSAqIHNpemVvZihfX2xlNjQpKTsKKwkJbWVtbW92ZSh2YWx1ZV9wdHIobiwgMCwgdmFsdWVfc2l6ZSksCisJCQl2YWx1ZV9wdHIobiwgc2hpZnQsIHZhbHVlX3NpemUpLAorCQkJKG5yX2VudHJpZXMgLSBzaGlmdCkgKiB2YWx1ZV9zaXplKTsKKwl9IGVsc2UgeworCQlCVUdfT04obnJfZW50cmllcyArIHNoaWZ0ID4gbGUzMl90b19jcHUobi0+aGVhZGVyLm1heF9lbnRyaWVzKSk7CisJCW1lbW1vdmUoa2V5X3B0cihuLCBzaGlmdCksCisJCQlrZXlfcHRyKG4sIDApLAorCQkJbnJfZW50cmllcyAqIHNpemVvZihfX2xlNjQpKTsKKwkJbWVtbW92ZSh2YWx1ZV9wdHIobiwgc2hpZnQsIHZhbHVlX3NpemUpLAorCQkJdmFsdWVfcHRyKG4sIDAsIHZhbHVlX3NpemUpLAorCQkJbnJfZW50cmllcyAqIHZhbHVlX3NpemUpOworCX0KK30KKworc3RhdGljIHZvaWQgbm9kZV9jb3B5KHN0cnVjdCBub2RlICpsZWZ0LCBzdHJ1Y3Qgbm9kZSAqcmlnaHQsIGludCBzaGlmdCkKK3sKKwl1aW50MzJfdCBucl9sZWZ0ID0gbGUzMl90b19jcHUobGVmdC0+aGVhZGVyLm5yX2VudHJpZXMpOworCXVpbnQzMl90IHZhbHVlX3NpemUgPSBsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIudmFsdWVfc2l6ZSk7CisJQlVHX09OKHZhbHVlX3NpemUgIT0gbGUzMl90b19jcHUocmlnaHQtPmhlYWRlci52YWx1ZV9zaXplKSk7CisKKwlpZiAoc2hpZnQgPCAwKSB7CisJCXNoaWZ0ID0gLXNoaWZ0OworCQlCVUdfT04obnJfbGVmdCArIHNoaWZ0ID4gbGUzMl90b19jcHUobGVmdC0+aGVhZGVyLm1heF9lbnRyaWVzKSk7CisJCW1lbWNweShrZXlfcHRyKGxlZnQsIG5yX2xlZnQpLAorCQkgICAgICAga2V5X3B0cihyaWdodCwgMCksCisJCSAgICAgICBzaGlmdCAqIHNpemVvZihfX2xlNjQpKTsKKwkJbWVtY3B5KHZhbHVlX3B0cihsZWZ0LCBucl9sZWZ0LCB2YWx1ZV9zaXplKSwKKwkJICAgICAgIHZhbHVlX3B0cihyaWdodCwgMCwgdmFsdWVfc2l6ZSksCisJCSAgICAgICBzaGlmdCAqIHZhbHVlX3NpemUpOworCX0gZWxzZSB7CisJCUJVR19PTihzaGlmdCA+IGxlMzJfdG9fY3B1KHJpZ2h0LT5oZWFkZXIubWF4X2VudHJpZXMpKTsKKwkJbWVtY3B5KGtleV9wdHIocmlnaHQsIDApLAorCQkgICAgICAga2V5X3B0cihsZWZ0LCBucl9sZWZ0IC0gc2hpZnQpLAorCQkgICAgICAgc2hpZnQgKiBzaXplb2YoX19sZTY0KSk7CisJCW1lbWNweSh2YWx1ZV9wdHIocmlnaHQsIDAsIHZhbHVlX3NpemUpLAorCQkgICAgICAgdmFsdWVfcHRyKGxlZnQsIG5yX2xlZnQgLSBzaGlmdCwgdmFsdWVfc2l6ZSksCisJCSAgICAgICBzaGlmdCAqIHZhbHVlX3NpemUpOworCX0KK30KKworLyoKKyAqIERlbGV0ZSBhIHNwZWNpZmljIGVudHJ5IGZyb20gYSBsZWFmIG5vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGRlbGV0ZV9hdChzdHJ1Y3Qgbm9kZSAqbiwgdW5zaWduZWQgaW5kZXgpCit7CisJdW5zaWduZWQgbnJfZW50cmllcyA9IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKTsKKwl1bnNpZ25lZCBucl90b19jb3B5ID0gbnJfZW50cmllcyAtIChpbmRleCArIDEpOworCXVpbnQzMl90IHZhbHVlX3NpemUgPSBsZTMyX3RvX2NwdShuLT5oZWFkZXIudmFsdWVfc2l6ZSk7CisJQlVHX09OKGluZGV4ID49IG5yX2VudHJpZXMpOworCisJaWYgKG5yX3RvX2NvcHkpIHsKKwkJbWVtbW92ZShrZXlfcHRyKG4sIGluZGV4KSwKKwkJCWtleV9wdHIobiwgaW5kZXggKyAxKSwKKwkJCW5yX3RvX2NvcHkgKiBzaXplb2YoX19sZTY0KSk7CisKKwkJbWVtbW92ZSh2YWx1ZV9wdHIobiwgaW5kZXgsIHZhbHVlX3NpemUpLAorCQkJdmFsdWVfcHRyKG4sIGluZGV4ICsgMSwgdmFsdWVfc2l6ZSksCisJCQlucl90b19jb3B5ICogdmFsdWVfc2l6ZSk7CisJfQorCisJbi0+aGVhZGVyLm5yX2VudHJpZXMgPSBjcHVfdG9fbGUzMihucl9lbnRyaWVzIC0gMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkZWxfdGhyZXNob2xkKHN0cnVjdCBub2RlICpuKQoreworCXJldHVybiBsZTMyX3RvX2NwdShuLT5oZWFkZXIubWF4X2VudHJpZXMpIC8gMzsKK30KKworc3RhdGljIHVuc2lnbmVkIG1lcmdlX3RocmVzaG9sZChzdHJ1Y3Qgbm9kZSAqbikKK3sKKwkvKgorCSAqIFRoZSBleHRyYSBvbmUgaXMgYmVjYXVzZSB3ZSBrbm93IHdlJ3JlIHBvdGVudGlhbGx5IGdvaW5nIHRvCisJICogZGVsZXRlIGFuIGVudHJ5LgorCSAqLworCXJldHVybiAyICogKGxlMzJfdG9fY3B1KG4tPmhlYWRlci5tYXhfZW50cmllcykgLyAzKSArIDE7Cit9CisKK3N0cnVjdCBjaGlsZCB7CisJdW5zaWduZWQgaW5kZXg7CisJc3RydWN0IGRtX2Jsb2NrICpibG9jazsKKwlzdHJ1Y3Qgbm9kZSAqbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSBsZTY0X3R5cGUgPSB7CisJLmNvbnRleHQgPSBOVUxMLAorCS5zaXplID0gc2l6ZW9mKF9fbGU2NCksCisJLmluYyA9IE5VTEwsCisJLmRlYyA9IE5VTEwsCisJLmVxdWFsID0gTlVMTAorfTsKKworc3RhdGljIGludCBpbml0X2NoaWxkKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBzdHJ1Y3Qgbm9kZSAqcGFyZW50LAorCQkgICAgICB1bnNpZ25lZCBpbmRleCwgc3RydWN0IGNoaWxkICpyZXN1bHQpCit7CisJaW50IHIsIGluYzsKKwlkbV9ibG9ja190IHJvb3Q7CisKKwlyZXN1bHQtPmluZGV4ID0gaW5kZXg7CisJcm9vdCA9IHZhbHVlNjQocGFyZW50LCBpbmRleCk7CisKKwlyID0gZG1fdG1fc2hhZG93X2Jsb2NrKGluZm8tPnRtLCByb290LCAmYnRyZWVfbm9kZV92YWxpZGF0b3IsCisJCQkgICAgICAgJnJlc3VsdC0+YmxvY2ssICZpbmMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJlc3VsdC0+biA9IGRtX2Jsb2NrX2RhdGEocmVzdWx0LT5ibG9jayk7CisKKwlpZiAoaW5jKQorCQlpbmNfY2hpbGRyZW4oaW5mby0+dG0sIHJlc3VsdC0+biwgJmxlNjRfdHlwZSk7CisKKwkqKChfX2xlNjQgKikgdmFsdWVfcHRyKHBhcmVudCwgaW5kZXgsIHNpemVvZihfX2xlNjQpKSkgPQorCQljcHVfdG9fbGU2NChkbV9ibG9ja19sb2NhdGlvbihyZXN1bHQtPmJsb2NrKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleGl0X2NoaWxkKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBzdHJ1Y3QgY2hpbGQgKmMpCit7CisJcmV0dXJuIGRtX3RtX3VubG9jayhpbmZvLT50bSwgYy0+YmxvY2spOworfQorCitzdGF0aWMgdm9pZCBzaGlmdChzdHJ1Y3Qgbm9kZSAqbGVmdCwgc3RydWN0IG5vZGUgKnJpZ2h0LCBpbnQgY291bnQpCit7CisJaWYgKCFjb3VudCkKKwkJcmV0dXJuOworCisJaWYgKGNvdW50ID4gMCkgeworCQlub2RlX3NoaWZ0KHJpZ2h0LCBjb3VudCk7CisJCW5vZGVfY29weShsZWZ0LCByaWdodCwgY291bnQpOworCX0gZWxzZSB7CisJCW5vZGVfY29weShsZWZ0LCByaWdodCwgY291bnQpOworCQlub2RlX3NoaWZ0KHJpZ2h0LCBjb3VudCk7CisJfQorCisJbGVmdC0+aGVhZGVyLm5yX2VudHJpZXMgPQorCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIubnJfZW50cmllcykgLSBjb3VudCk7CisJQlVHX09OKGxlMzJfdG9fY3B1KGxlZnQtPmhlYWRlci5ucl9lbnRyaWVzKSA+IGxlMzJfdG9fY3B1KGxlZnQtPmhlYWRlci5tYXhfZW50cmllcykpOworCisJcmlnaHQtPmhlYWRlci5ucl9lbnRyaWVzID0KKwkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUocmlnaHQtPmhlYWRlci5ucl9lbnRyaWVzKSArIGNvdW50KTsKKwlCVUdfT04obGUzMl90b19jcHUocmlnaHQtPmhlYWRlci5ucl9lbnRyaWVzKSA+IGxlMzJfdG9fY3B1KHJpZ2h0LT5oZWFkZXIubWF4X2VudHJpZXMpKTsKK30KKworc3RhdGljIHZvaWQgX19yZWJhbGFuY2UyKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBzdHJ1Y3Qgbm9kZSAqcGFyZW50LAorCQkJIHN0cnVjdCBjaGlsZCAqbCwgc3RydWN0IGNoaWxkICpyKQoreworCXN0cnVjdCBub2RlICpsZWZ0ID0gbC0+bjsKKwlzdHJ1Y3Qgbm9kZSAqcmlnaHQgPSByLT5uOworCXVpbnQzMl90IG5yX2xlZnQgPSBsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIubnJfZW50cmllcyk7CisJdWludDMyX3QgbnJfcmlnaHQgPSBsZTMyX3RvX2NwdShyaWdodC0+aGVhZGVyLm5yX2VudHJpZXMpOworCisJaWYgKG5yX2xlZnQgKyBucl9yaWdodCA8PSBtZXJnZV90aHJlc2hvbGQobGVmdCkpIHsKKwkJLyoKKwkJICogTWVyZ2UKKwkJICovCisJCW5vZGVfY29weShsZWZ0LCByaWdodCwgLW5yX3JpZ2h0KTsKKwkJbGVmdC0+aGVhZGVyLm5yX2VudHJpZXMgPSBjcHVfdG9fbGUzMihucl9sZWZ0ICsgbnJfcmlnaHQpOworCQlkZWxldGVfYXQocGFyZW50LCByLT5pbmRleCk7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byBkZWNyZW1lbnQgdGhlIHJpZ2h0IGJsb2NrLCBidXQgbm90IGl0J3MKKwkJICogY2hpbGRyZW4sIHNpbmNlIHRoZXkncmUgc3RpbGwgcmVmZXJlbmNlZCBieSBsZWZ0LgorCQkgKi8KKwkJZG1fdG1fZGVjKGluZm8tPnRtLCBkbV9ibG9ja19sb2NhdGlvbihyLT5ibG9jaykpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlYmFsYW5jZS4KKwkJICovCisJCXVuc2lnbmVkIHRhcmdldF9sZWZ0ID0gKG5yX2xlZnQgKyBucl9yaWdodCkgLyAyOworCQl1bnNpZ25lZCBzaGlmdF8gPSBucl9sZWZ0IC0gdGFyZ2V0X2xlZnQ7CisJCUJVR19PTihsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIubWF4X2VudHJpZXMpIDw9IG5yX2xlZnQgLSBzaGlmdF8pOworCQlCVUdfT04obGUzMl90b19jcHUocmlnaHQtPmhlYWRlci5tYXhfZW50cmllcykgPD0gbnJfcmlnaHQgKyBzaGlmdF8pOworCQlzaGlmdChsZWZ0LCByaWdodCwgbnJfbGVmdCAtIHRhcmdldF9sZWZ0KTsKKwkJKmtleV9wdHIocGFyZW50LCByLT5pbmRleCkgPSByaWdodC0+a2V5c1swXTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmViYWxhbmNlMihzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzLCBzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywKKwkJICAgICAgdW5zaWduZWQgbGVmdF9pbmRleCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgbm9kZSAqcGFyZW50OworCXN0cnVjdCBjaGlsZCBsZWZ0LCByaWdodDsKKworCXBhcmVudCA9IGRtX2Jsb2NrX2RhdGEoc2hhZG93X2N1cnJlbnQocykpOworCisJciA9IGluaXRfY2hpbGQoaW5mbywgcGFyZW50LCBsZWZ0X2luZGV4LCAmbGVmdCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGluaXRfY2hpbGQoaW5mbywgcGFyZW50LCBsZWZ0X2luZGV4ICsgMSwgJnJpZ2h0KTsKKwlpZiAocikgeworCQlleGl0X2NoaWxkKGluZm8sICZsZWZ0KTsKKwkJcmV0dXJuIHI7CisJfQorCisJX19yZWJhbGFuY2UyKGluZm8sIHBhcmVudCwgJmxlZnQsICZyaWdodCk7CisKKwlyID0gZXhpdF9jaGlsZChpbmZvLCAmbGVmdCk7CisJaWYgKHIpIHsKKwkJZXhpdF9jaGlsZChpbmZvLCAmcmlnaHQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gZXhpdF9jaGlsZChpbmZvLCAmcmlnaHQpOworfQorCitzdGF0aWMgdm9pZCBfX3JlYmFsYW5jZTMoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIHN0cnVjdCBub2RlICpwYXJlbnQsCisJCQkgc3RydWN0IGNoaWxkICpsLCBzdHJ1Y3QgY2hpbGQgKmMsIHN0cnVjdCBjaGlsZCAqcikKK3sKKwlzdHJ1Y3Qgbm9kZSAqbGVmdCA9IGwtPm47CisJc3RydWN0IG5vZGUgKmNlbnRlciA9IGMtPm47CisJc3RydWN0IG5vZGUgKnJpZ2h0ID0gci0+bjsKKworCXVpbnQzMl90IG5yX2xlZnQgPSBsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIubnJfZW50cmllcyk7CisJdWludDMyX3QgbnJfY2VudGVyID0gbGUzMl90b19jcHUoY2VudGVyLT5oZWFkZXIubnJfZW50cmllcyk7CisJdWludDMyX3QgbnJfcmlnaHQgPSBsZTMyX3RvX2NwdShyaWdodC0+aGVhZGVyLm5yX2VudHJpZXMpOworCXVpbnQzMl90IG1heF9lbnRyaWVzID0gbGUzMl90b19jcHUobGVmdC0+aGVhZGVyLm1heF9lbnRyaWVzKTsKKworCXVuc2lnbmVkIHRhcmdldDsKKworCUJVR19PTihsZWZ0LT5oZWFkZXIubWF4X2VudHJpZXMgIT0gY2VudGVyLT5oZWFkZXIubWF4X2VudHJpZXMpOworCUJVR19PTihjZW50ZXItPmhlYWRlci5tYXhfZW50cmllcyAhPSByaWdodC0+aGVhZGVyLm1heF9lbnRyaWVzKTsKKworCWlmICgoKG5yX2xlZnQgKyBucl9jZW50ZXIgKyBucl9yaWdodCkgLyAyKSA8IG1lcmdlX3RocmVzaG9sZChjZW50ZXIpKSB7CisJCS8qCisJCSAqIERlbGV0ZSBjZW50ZXIgbm9kZToKKwkJICoKKwkJICogV2UgZHVtcCBhcyBtYW55IGVudHJpZXMgZnJvbSBjZW50ZXIgYXMgcG9zc2libGUgaW50bworCQkgKiBsZWZ0LCB0aGVuIHRoZSByZXN0IGluIHJpZ2h0LCB0aGVuIHJlYmFsYW5jZTIuICBUaGlzCisJCSAqIHdhc3RlcyBzb21lIGNwdSwgYnV0IEkgd2FudCBzb21ldGhpbmcgc2ltcGxlIGF0bS4KKwkJICovCisJCXVuc2lnbmVkIHNoaWZ0ID0gbWluKG1heF9lbnRyaWVzIC0gbnJfbGVmdCwgbnJfY2VudGVyKTsKKworCQlCVUdfT04obnJfbGVmdCArIHNoaWZ0ID4gbWF4X2VudHJpZXMpOworCQlub2RlX2NvcHkobGVmdCwgY2VudGVyLCAtc2hpZnQpOworCQlsZWZ0LT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKG5yX2xlZnQgKyBzaGlmdCk7CisKKwkJaWYgKHNoaWZ0ICE9IG5yX2NlbnRlcikgeworCQkJc2hpZnQgPSBucl9jZW50ZXIgLSBzaGlmdDsKKwkJCUJVR19PTigobnJfcmlnaHQgKyBzaGlmdCkgPj0gbWF4X2VudHJpZXMpOworCQkJbm9kZV9zaGlmdChyaWdodCwgc2hpZnQpOworCQkJbm9kZV9jb3B5KGNlbnRlciwgcmlnaHQsIHNoaWZ0KTsKKwkJCXJpZ2h0LT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKG5yX3JpZ2h0ICsgc2hpZnQpOworCQl9CisJCSprZXlfcHRyKHBhcmVudCwgci0+aW5kZXgpID0gcmlnaHQtPmtleXNbMF07CisKKwkJZGVsZXRlX2F0KHBhcmVudCwgYy0+aW5kZXgpOworCQlyLT5pbmRleC0tOworCisJCWRtX3RtX2RlYyhpbmZvLT50bSwgZG1fYmxvY2tfbG9jYXRpb24oYy0+YmxvY2spKTsKKwkJX19yZWJhbGFuY2UyKGluZm8sIHBhcmVudCwgbCwgcik7CisKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUmViYWxhbmNlCisJICovCisJdGFyZ2V0ID0gKG5yX2xlZnQgKyBucl9jZW50ZXIgKyBucl9yaWdodCkgLyAzOworCUJVR19PTih0YXJnZXQgPiBtYXhfZW50cmllcyk7CisKKwkvKgorCSAqIEFkanVzdCB0aGUgbGVmdCBub2RlCisJICovCisJc2hpZnQobGVmdCwgY2VudGVyLCBucl9sZWZ0IC0gdGFyZ2V0KTsKKworCS8qCisJICogQWRqdXN0IHRoZSByaWdodCBub2RlCisJICovCisJc2hpZnQoY2VudGVyLCByaWdodCwgdGFyZ2V0IC0gbnJfcmlnaHQpOworCSprZXlfcHRyKHBhcmVudCwgYy0+aW5kZXgpID0gY2VudGVyLT5rZXlzWzBdOworCSprZXlfcHRyKHBhcmVudCwgci0+aW5kZXgpID0gcmlnaHQtPmtleXNbMF07Cit9CisKK3N0YXRpYyBpbnQgcmViYWxhbmNlMyhzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzLCBzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywKKwkJICAgICAgdW5zaWduZWQgbGVmdF9pbmRleCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgbm9kZSAqcGFyZW50ID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudChzKSk7CisJc3RydWN0IGNoaWxkIGxlZnQsIGNlbnRlciwgcmlnaHQ7CisKKwkvKgorCSAqIEZJWE1FOiBmaWxsIG91dCBhbiBhcnJheT8KKwkgKi8KKwlyID0gaW5pdF9jaGlsZChpbmZvLCBwYXJlbnQsIGxlZnRfaW5kZXgsICZsZWZ0KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gaW5pdF9jaGlsZChpbmZvLCBwYXJlbnQsIGxlZnRfaW5kZXggKyAxLCAmY2VudGVyKTsKKwlpZiAocikgeworCQlleGl0X2NoaWxkKGluZm8sICZsZWZ0KTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IGluaXRfY2hpbGQoaW5mbywgcGFyZW50LCBsZWZ0X2luZGV4ICsgMiwgJnJpZ2h0KTsKKwlpZiAocikgeworCQlleGl0X2NoaWxkKGluZm8sICZsZWZ0KTsKKwkJZXhpdF9jaGlsZChpbmZvLCAmY2VudGVyKTsKKwkJcmV0dXJuIHI7CisJfQorCisJX19yZWJhbGFuY2UzKGluZm8sIHBhcmVudCwgJmxlZnQsICZjZW50ZXIsICZyaWdodCk7CisKKwlyID0gZXhpdF9jaGlsZChpbmZvLCAmbGVmdCk7CisJaWYgKHIpIHsKKwkJZXhpdF9jaGlsZChpbmZvLCAmY2VudGVyKTsKKwkJZXhpdF9jaGlsZChpbmZvLCAmcmlnaHQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gZXhpdF9jaGlsZChpbmZvLCAmY2VudGVyKTsKKwlpZiAocikgeworCQlleGl0X2NoaWxkKGluZm8sICZyaWdodCk7CisJCXJldHVybiByOworCX0KKworCXIgPSBleGl0X2NoaWxkKGluZm8sICZyaWdodCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X25yX2VudHJpZXMoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkJICBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpCit7CisJaW50IHI7CisJc3RydWN0IGRtX2Jsb2NrICpibG9jazsKKwlzdHJ1Y3Qgbm9kZSAqbjsKKworCXIgPSBkbV90bV9yZWFkX2xvY2sodG0sIGIsICZidHJlZV9ub2RlX3ZhbGlkYXRvciwgJmJsb2NrKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwluID0gZG1fYmxvY2tfZGF0YShibG9jayk7CisJKnJlc3VsdCA9IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKTsKKworCXJldHVybiBkbV90bV91bmxvY2sodG0sIGJsb2NrKTsKK30KKworc3RhdGljIGludCByZWJhbGFuY2VfY2hpbGRyZW4oc3RydWN0IHNoYWRvd19zcGluZSAqcywKKwkJCSAgICAgIHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCB1aW50NjRfdCBrZXkpCit7CisJaW50IGksIHIsIGhhc19sZWZ0X3NpYmxpbmcsIGhhc19yaWdodF9zaWJsaW5nOworCXVpbnQzMl90IGNoaWxkX2VudHJpZXM7CisJc3RydWN0IG5vZGUgKm47CisKKwluID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudChzKSk7CisKKwlpZiAobGUzMl90b19jcHUobi0+aGVhZGVyLm5yX2VudHJpZXMpID09IDEpIHsKKwkJc3RydWN0IGRtX2Jsb2NrICpjaGlsZDsKKwkJZG1fYmxvY2tfdCBiID0gdmFsdWU2NChuLCAwKTsKKworCQlyID0gZG1fdG1fcmVhZF9sb2NrKGluZm8tPnRtLCBiLCAmYnRyZWVfbm9kZV92YWxpZGF0b3IsICZjaGlsZCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJbWVtY3B5KG4sIGRtX2Jsb2NrX2RhdGEoY2hpbGQpLAorCQkgICAgICAgZG1fYm1fYmxvY2tfc2l6ZShkbV90bV9nZXRfYm0oaW5mby0+dG0pKSk7CisJCXIgPSBkbV90bV91bmxvY2soaW5mby0+dG0sIGNoaWxkKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlkbV90bV9kZWMoaW5mby0+dG0sIGRtX2Jsb2NrX2xvY2F0aW9uKGNoaWxkKSk7CisJCXJldHVybiAwOworCX0KKworCWkgPSBsb3dlcl9ib3VuZChuLCBrZXkpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJciA9IGdldF9ucl9lbnRyaWVzKGluZm8tPnRtLCB2YWx1ZTY0KG4sIGkpLCAmY2hpbGRfZW50cmllcyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKGNoaWxkX2VudHJpZXMgPiBkZWxfdGhyZXNob2xkKG4pKQorCQlyZXR1cm4gMDsKKworCWhhc19sZWZ0X3NpYmxpbmcgPSBpID4gMDsKKwloYXNfcmlnaHRfc2libGluZyA9IGkgPCAobGUzMl90b19jcHUobi0+aGVhZGVyLm5yX2VudHJpZXMpIC0gMSk7CisKKwlpZiAoIWhhc19sZWZ0X3NpYmxpbmcpCisJCXIgPSByZWJhbGFuY2UyKHMsIGluZm8sIGkpOworCisJZWxzZSBpZiAoIWhhc19yaWdodF9zaWJsaW5nKQorCQlyID0gcmViYWxhbmNlMihzLCBpbmZvLCBpIC0gMSk7CisKKwllbHNlCisJCXIgPSByZWJhbGFuY2UzKHMsIGluZm8sIGkgLSAxKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGRvX2xlYWYoc3RydWN0IG5vZGUgKm4sIHVpbnQ2NF90IGtleSwgdW5zaWduZWQgKmluZGV4KQoreworCWludCBpID0gbG93ZXJfYm91bmQobiwga2V5KTsKKworCWlmICgoaSA8IDApIHx8CisJICAgIChpID49IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKSkgfHwKKwkgICAgKGxlNjRfdG9fY3B1KG4tPmtleXNbaV0pICE9IGtleSkpCisJCXJldHVybiAtRU5PREFUQTsKKworCSppbmRleCA9IGk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByZXBhcmVzIGZvciByZW1vdmFsIGZyb20gb25lIGxldmVsIG9mIHRoZSBoaWVyYXJjaHkuICBUaGUgY2FsbGVyIG11c3QKKyAqIGNhbGwgZGVsZXRlX2F0KCkgdG8gcmVtb3ZlIHRoZSBlbnRyeSBhdCBpbmRleC4KKyAqLworc3RhdGljIGludCByZW1vdmVfcmF3KHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSAqdnQsIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJICAgICAgdWludDY0X3Qga2V5LCB1bnNpZ25lZCAqaW5kZXgpCit7CisJaW50IGkgPSAqaW5kZXgsIHI7CisJc3RydWN0IG5vZGUgKm47CisKKwlmb3IgKDs7KSB7CisJCXIgPSBzaGFkb3dfc3RlcChzLCByb290LCB2dCk7CisJCWlmIChyIDwgMCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdlIGhhdmUgdG8gcGF0Y2ggdXAgdGhlIHBhcmVudCBub2RlLCB1Z2x5LCBidXQgSSBkb24ndAorCQkgKiBzZWUgYSB3YXkgdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5IGFzIHBhcnQgb2YgdGhlIHNwaW5lCisJCSAqIG9wLgorCQkgKi8KKwkJaWYgKHNoYWRvd19oYXNfcGFyZW50KHMpKSB7CisJCQlfX2xlNjQgbG9jYXRpb24gPSBjcHVfdG9fbGU2NChkbV9ibG9ja19sb2NhdGlvbihzaGFkb3dfY3VycmVudChzKSkpOworCQkJbWVtY3B5KHZhbHVlX3B0cihkbV9ibG9ja19kYXRhKHNoYWRvd19wYXJlbnQocykpLCBpLCBzaXplb2YoX19sZTY0KSksCisJCQkgICAgICAgJmxvY2F0aW9uLCBzaXplb2YoX19sZTY0KSk7CisJCX0KKworCQluID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudChzKSk7CisKKwkJaWYgKGxlMzJfdG9fY3B1KG4tPmhlYWRlci5mbGFncykgJiBMRUFGX05PREUpCisJCQlyZXR1cm4gZG9fbGVhZihuLCBrZXksIGluZGV4KTsKKworCQlyID0gcmViYWxhbmNlX2NoaWxkcmVuKHMsIGluZm8sIGtleSk7CisJCWlmIChyKQorCQkJYnJlYWs7CisKKwkJbiA9IGRtX2Jsb2NrX2RhdGEoc2hhZG93X2N1cnJlbnQocykpOworCQlpZiAobGUzMl90b19jcHUobi0+aGVhZGVyLmZsYWdzKSAmIExFQUZfTk9ERSkKKwkJCXJldHVybiBkb19sZWFmKG4sIGtleSwgaW5kZXgpOworCisJCWkgPSBsb3dlcl9ib3VuZChuLCBrZXkpOworCisJCS8qCisJCSAqIFdlIGtub3cgdGhlIGtleSBpcyBwcmVzZW50LCBvciBlbHNlCisJCSAqIHJlYmFsYW5jZV9jaGlsZHJlbiB3b3VsZCBoYXZlIHJldHVybmVkCisJCSAqIC1FTk9EQVRBCisJCSAqLworCQlyb290ID0gdmFsdWU2NChuLCBpKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX2J0cmVlX3JlbW92ZShzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCByb290LAorCQkgICAgdWludDY0X3QgKmtleXMsIGRtX2Jsb2NrX3QgKm5ld19yb290KQoreworCXVuc2lnbmVkIGxldmVsLCBsYXN0X2xldmVsID0gaW5mby0+bGV2ZWxzIC0gMTsKKwlpbnQgaW5kZXggPSAwLCByID0gMDsKKwlzdHJ1Y3Qgc2hhZG93X3NwaW5lIHNwaW5lOworCXN0cnVjdCBub2RlICpuOworCisJaW5pdF9zaGFkb3dfc3BpbmUoJnNwaW5lLCBpbmZvKTsKKwlmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBpbmZvLT5sZXZlbHM7IGxldmVsKyspIHsKKwkJciA9IHJlbW92ZV9yYXcoJnNwaW5lLCBpbmZvLAorCQkJICAgICAgIChsZXZlbCA9PSBsYXN0X2xldmVsID8KKwkJCQkmaW5mby0+dmFsdWVfdHlwZSA6ICZsZTY0X3R5cGUpLAorCQkJICAgICAgIHJvb3QsIGtleXNbbGV2ZWxdLCAodW5zaWduZWQgKikmaW5kZXgpOworCQlpZiAociA8IDApCisJCQlicmVhazsKKworCQluID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudCgmc3BpbmUpKTsKKwkJaWYgKGxldmVsICE9IGxhc3RfbGV2ZWwpIHsKKwkJCXJvb3QgPSB2YWx1ZTY0KG4sIGluZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJQlVHX09OKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZTMyX3RvX2NwdShuLT5oZWFkZXIubnJfZW50cmllcykpOworCisJCWlmIChpbmZvLT52YWx1ZV90eXBlLmRlYykKKwkJCWluZm8tPnZhbHVlX3R5cGUuZGVjKGluZm8tPnZhbHVlX3R5cGUuY29udGV4dCwKKwkJCQkJICAgICB2YWx1ZV9wdHIobiwgaW5kZXgsIGluZm8tPnZhbHVlX3R5cGUuc2l6ZSkpOworCisJCWRlbGV0ZV9hdChuLCBpbmRleCk7CisJfQorCisJKm5ld19yb290ID0gc2hhZG93X3Jvb3QoJnNwaW5lKTsKKwlleGl0X3NoYWRvd19zcGluZSgmc3BpbmUpOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idHJlZV9yZW1vdmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUtc3BpbmUuYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLXNwaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhNzkxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLXNwaW5lLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS1idHJlZS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRtLXRyYW5zYWN0aW9uLW1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJidHJlZSBzcGluZSIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBCVFJFRV9DU1VNX1hPUiAxMjExMDcKKworc3RhdGljIGludCBub2RlX2NoZWNrKHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCSAgICAgIHN0cnVjdCBkbV9ibG9jayAqYiwKKwkJICAgICAgc2l6ZV90IGJsb2NrX3NpemUpOworCitzdGF0aWMgdm9pZCBub2RlX3ByZXBhcmVfZm9yX3dyaXRlKHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCQkJICAgc3RydWN0IGRtX2Jsb2NrICpiLAorCQkJCSAgIHNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCBub2RlICpuID0gZG1fYmxvY2tfZGF0YShiKTsKKwlzdHJ1Y3Qgbm9kZV9oZWFkZXIgKmggPSAmbi0+aGVhZGVyOworCisJaC0+YmxvY2tuciA9IGNwdV90b19sZTY0KGRtX2Jsb2NrX2xvY2F0aW9uKGIpKTsKKwloLT5jc3VtID0gY3B1X3RvX2xlMzIoZG1fYm1fY2hlY2tzdW0oJmgtPmZsYWdzLAorCQkJCQkgICAgIGJsb2NrX3NpemUgLSBzaXplb2YoX19sZTMyKSwKKwkJCQkJICAgICBCVFJFRV9DU1VNX1hPUikpOworCisJQlVHX09OKG5vZGVfY2hlY2sodiwgYiwgNDA5NikpOworfQorCitzdGF0aWMgaW50IG5vZGVfY2hlY2soc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJICAgICAgc3RydWN0IGRtX2Jsb2NrICpiLAorCQkgICAgICBzaXplX3QgYmxvY2tfc2l6ZSkKK3sKKwlzdHJ1Y3Qgbm9kZSAqbiA9IGRtX2Jsb2NrX2RhdGEoYik7CisJc3RydWN0IG5vZGVfaGVhZGVyICpoID0gJm4tPmhlYWRlcjsKKwlzaXplX3QgdmFsdWVfc2l6ZTsKKwlfX2xlMzIgY3N1bV9kaXNrOworCXVpbnQzMl90IGZsYWdzOworCisJaWYgKGRtX2Jsb2NrX2xvY2F0aW9uKGIpICE9IGxlNjRfdG9fY3B1KGgtPmJsb2NrbnIpKSB7CisJCURNRVJSKCJub2RlX2NoZWNrIGZhaWxlZCBibG9ja25yICVsbHUgd2FudGVkICVsbHUiLAorCQkgICAgICBsZTY0X3RvX2NwdShoLT5ibG9ja25yKSwgZG1fYmxvY2tfbG9jYXRpb24oYikpOworCQlyZXR1cm4gLUVOT1RCTEs7CisJfQorCisJY3N1bV9kaXNrID0gY3B1X3RvX2xlMzIoZG1fYm1fY2hlY2tzdW0oJmgtPmZsYWdzLAorCQkJCQkgICAgICAgYmxvY2tfc2l6ZSAtIHNpemVvZihfX2xlMzIpLAorCQkJCQkgICAgICAgQlRSRUVfQ1NVTV9YT1IpKTsKKwlpZiAoY3N1bV9kaXNrICE9IGgtPmNzdW0pIHsKKwkJRE1FUlIoIm5vZGVfY2hlY2sgZmFpbGVkIGNzdW0gJXUgd2FudGVkICV1IiwKKwkJICAgICAgbGUzMl90b19jcHUoY3N1bV9kaXNrKSwgbGUzMl90b19jcHUoaC0+Y3N1bSkpOworCQlyZXR1cm4gLUVJTFNFUTsKKwl9CisKKwl2YWx1ZV9zaXplID0gbGUzMl90b19jcHUoaC0+dmFsdWVfc2l6ZSk7CisKKwlpZiAoc2l6ZW9mKHN0cnVjdCBub2RlX2hlYWRlcikgKworCSAgICAoc2l6ZW9mKF9fbGU2NCkgKyB2YWx1ZV9zaXplKSAqIGxlMzJfdG9fY3B1KGgtPm1heF9lbnRyaWVzKSA+IGJsb2NrX3NpemUpIHsKKwkJRE1FUlIoIm5vZGVfY2hlY2sgZmFpbGVkOiBtYXhfZW50cmllcyB0b28gbGFyZ2UiKTsKKwkJcmV0dXJuIC1FSUxTRVE7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KGgtPm5yX2VudHJpZXMpID4gbGUzMl90b19jcHUoaC0+bWF4X2VudHJpZXMpKSB7CisJCURNRVJSKCJub2RlX2NoZWNrIGZhaWxlZCwgdG9vIG1hbnkgZW50cmllcyIpOworCQlyZXR1cm4gLUVJTFNFUTsKKwl9CisKKwkvKgorCSAqIFRoZSBub2RlIG11c3QgYmUgZWl0aGVyIElOVEVSTkFMIG9yIExFQUYuCisJICovCisJZmxhZ3MgPSBsZTMyX3RvX2NwdShoLT5mbGFncyk7CisJaWYgKCEoZmxhZ3MgJiBJTlRFUk5BTF9OT0RFKSAmJiAhKGZsYWdzICYgTEVBRl9OT0RFKSkgeworCQlETUVSUigibm9kZV9jaGVjayBmYWlsZWQsIG5vZGUgaXMgbmVpdGhlciBJTlRFUk5BTCBvciBMRUFGIik7CisJCXJldHVybiAtRUlMU0VROworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yIGJ0cmVlX25vZGVfdmFsaWRhdG9yID0geworCS5uYW1lID0gImJ0cmVlX25vZGUiLAorCS5wcmVwYXJlX2Zvcl93cml0ZSA9IG5vZGVfcHJlcGFyZV9mb3Jfd3JpdGUsCisJLmNoZWNrID0gbm9kZV9jaGVjaworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBibl9yZWFkX2xvY2soc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3QgYiwKKwkJIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCkKK3sKKwlyZXR1cm4gZG1fdG1fcmVhZF9sb2NrKGluZm8tPnRtLCBiLCAmYnRyZWVfbm9kZV92YWxpZGF0b3IsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgYm5fc2hhZG93KHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IG9yaWcsCisJICAgICAgc3RydWN0IGRtX2J0cmVlX3ZhbHVlX3R5cGUgKnZ0LAorCSAgICAgIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCkKK3sKKwlpbnQgciwgaW5jOworCisJciA9IGRtX3RtX3NoYWRvd19ibG9jayhpbmZvLT50bSwgb3JpZywgJmJ0cmVlX25vZGVfdmFsaWRhdG9yLAorCQkJICAgICAgIHJlc3VsdCwgJmluYyk7CisJaWYgKCFyICYmIGluYykKKwkJaW5jX2NoaWxkcmVuKGluZm8tPnRtLCBkbV9ibG9ja19kYXRhKCpyZXN1bHQpLCB2dCk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IG5ld19ibG9jayhzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0KQoreworCXJldHVybiBkbV90bV9uZXdfYmxvY2soaW5mby0+dG0sICZidHJlZV9ub2RlX3ZhbGlkYXRvciwgcmVzdWx0KTsKK30KKworaW50IHVubG9ja19ibG9jayhzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgc3RydWN0IGRtX2Jsb2NrICpiKQoreworCXJldHVybiBkbV90bV91bmxvY2soaW5mby0+dG0sIGIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGluaXRfcm9fc3BpbmUoc3RydWN0IHJvX3NwaW5lICpzLCBzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbykKK3sKKwlzLT5pbmZvID0gaW5mbzsKKwlzLT5jb3VudCA9IDA7CisJcy0+bm9kZXNbMF0gPSBOVUxMOworCXMtPm5vZGVzWzFdID0gTlVMTDsKK30KKworaW50IGV4aXRfcm9fc3BpbmUoc3RydWN0IHJvX3NwaW5lICpzKQoreworCWludCByID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5jb3VudDsgaSsrKSB7CisJCWludCByMiA9IHVubG9ja19ibG9jayhzLT5pbmZvLCBzLT5ub2Rlc1tpXSk7CisJCWlmIChyMiA8IDApCisJCQlyID0gcjI7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCByb19zdGVwKHN0cnVjdCByb19zcGluZSAqcywgZG1fYmxvY2tfdCBuZXdfY2hpbGQpCit7CisJaW50IHI7CisKKwlpZiAocy0+Y291bnQgPT0gMikgeworCQlyID0gdW5sb2NrX2Jsb2NrKHMtPmluZm8sIHMtPm5vZGVzWzBdKTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJCXMtPm5vZGVzWzBdID0gcy0+bm9kZXNbMV07CisJCXMtPmNvdW50LS07CisJfQorCisJciA9IGJuX3JlYWRfbG9jayhzLT5pbmZvLCBuZXdfY2hpbGQsIHMtPm5vZGVzICsgcy0+Y291bnQpOworCWlmICghcikKKwkJcy0+Y291bnQrKzsKKworCXJldHVybiByOworfQorCitzdHJ1Y3Qgbm9kZSAqcm9fbm9kZShzdHJ1Y3Qgcm9fc3BpbmUgKnMpCit7CisJc3RydWN0IGRtX2Jsb2NrICpibG9jazsKKworCUJVR19PTighcy0+Y291bnQpOworCWJsb2NrID0gcy0+bm9kZXNbcy0+Y291bnQgLSAxXTsKKworCXJldHVybiBkbV9ibG9ja19kYXRhKGJsb2NrKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBpbml0X3NoYWRvd19zcGluZShzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzLCBzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbykKK3sKKwlzLT5pbmZvID0gaW5mbzsKKwlzLT5jb3VudCA9IDA7Cit9CisKK2ludCBleGl0X3NoYWRvd19zcGluZShzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKQoreworCWludCByID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5jb3VudDsgaSsrKSB7CisJCWludCByMiA9IHVubG9ja19ibG9jayhzLT5pbmZvLCBzLT5ub2Rlc1tpXSk7CisJCWlmIChyMiA8IDApCisJCQlyID0gcjI7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCBzaGFkb3dfc3RlcChzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzLCBkbV9ibG9ja190IGIsCisJCXN0cnVjdCBkbV9idHJlZV92YWx1ZV90eXBlICp2dCkKK3sKKwlpbnQgcjsKKworCWlmIChzLT5jb3VudCA9PSAyKSB7CisJCXIgPSB1bmxvY2tfYmxvY2socy0+aW5mbywgcy0+bm9kZXNbMF0pOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKwkJcy0+bm9kZXNbMF0gPSBzLT5ub2Rlc1sxXTsKKwkJcy0+Y291bnQtLTsKKwl9CisKKwlyID0gYm5fc2hhZG93KHMtPmluZm8sIGIsIHZ0LCBzLT5ub2RlcyArIHMtPmNvdW50KTsKKwlpZiAoIXIpIHsKKwkJaWYgKCFzLT5jb3VudCkKKwkJCXMtPnJvb3QgPSBkbV9ibG9ja19sb2NhdGlvbihzLT5ub2Rlc1swXSk7CisKKwkJcy0+Y291bnQrKzsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RydWN0IGRtX2Jsb2NrICpzaGFkb3dfY3VycmVudChzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKQoreworCUJVR19PTighcy0+Y291bnQpOworCisJcmV0dXJuIHMtPm5vZGVzW3MtPmNvdW50IC0gMV07Cit9CisKK3N0cnVjdCBkbV9ibG9jayAqc2hhZG93X3BhcmVudChzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKQoreworCUJVR19PTihzLT5jb3VudCAhPSAyKTsKKworCXJldHVybiBzLT5jb3VudCA9PSAyID8gcy0+bm9kZXNbMF0gOiBOVUxMOworfQorCitpbnQgc2hhZG93X2hhc19wYXJlbnQoc3RydWN0IHNoYWRvd19zcGluZSAqcykKK3sKKwlyZXR1cm4gcy0+Y291bnQgPj0gMjsKK30KKworaW50IHNoYWRvd19yb290KHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMpCit7CisJcmV0dXJuIHMtPnJvb3Q7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS5jIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDFlN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUuYwpAQCAtMCwwICsxLDgwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLWJ0cmVlLWludGVybmFsLmgiCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLmgiCisjaW5jbHVkZSAiZG0tdHJhbnNhY3Rpb24tbWFuYWdlci5oIgorCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorCisjZGVmaW5lIERNX01TR19QUkVGSVggImJ0cmVlIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFycmF5IG1hbmlwdWxhdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBtZW1jcHlfZGlzayh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCisJX19kbV93cml0dGVuX3RvX2Rpc2soc3JjKQoreworCW1lbWNweShkZXN0LCBzcmMsIGxlbik7CisJX19kbV91bmJsZXNzX2Zvcl9kaXNrKHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFycmF5X2luc2VydCh2b2lkICpiYXNlLCBzaXplX3QgZWx0X3NpemUsIHVuc2lnbmVkIG5yX2VsdHMsCisJCQkgdW5zaWduZWQgaW5kZXgsIHZvaWQgKmVsdCkKKwlfX2RtX3dyaXR0ZW5fdG9fZGlzayhlbHQpCit7CisJaWYgKGluZGV4IDwgbnJfZWx0cykKKwkJbWVtbW92ZShiYXNlICsgKGVsdF9zaXplICogKGluZGV4ICsgMSkpLAorCQkJYmFzZSArIChlbHRfc2l6ZSAqIGluZGV4KSwKKwkJCShucl9lbHRzIC0gaW5kZXgpICogZWx0X3NpemUpOworCisJbWVtY3B5X2Rpc2soYmFzZSArIChlbHRfc2l6ZSAqIGluZGV4KSwgZWx0LCBlbHRfc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgbm8gdHdvIGtleXMgYXJlIHRoZSBzYW1lLiAqLworc3RhdGljIGludCBic2VhcmNoKHN0cnVjdCBub2RlICpuLCB1aW50NjRfdCBrZXksIGludCB3YW50X2hpKQoreworCWludCBsbyA9IC0xLCBoaSA9IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKTsKKworCXdoaWxlIChoaSAtIGxvID4gMSkgeworCQlpbnQgbWlkID0gbG8gKyAoKGhpIC0gbG8pIC8gMik7CisJCXVpbnQ2NF90IG1pZF9rZXkgPSBsZTY0X3RvX2NwdShuLT5rZXlzW21pZF0pOworCisJCWlmIChtaWRfa2V5ID09IGtleSkKKwkJCXJldHVybiBtaWQ7CisKKwkJaWYgKG1pZF9rZXkgPCBrZXkpCisJCQlsbyA9IG1pZDsKKwkJZWxzZQorCQkJaGkgPSBtaWQ7CisJfQorCisJcmV0dXJuIHdhbnRfaGkgPyBoaSA6IGxvOworfQorCitpbnQgbG93ZXJfYm91bmQoc3RydWN0IG5vZGUgKm4sIHVpbnQ2NF90IGtleSkKK3sKKwlyZXR1cm4gYnNlYXJjaChuLCBrZXksIDApOworfQorCit2b2lkIGluY19jaGlsZHJlbihzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIHN0cnVjdCBub2RlICpuLAorCQkgIHN0cnVjdCBkbV9idHJlZV92YWx1ZV90eXBlICp2dCkKK3sKKwl1bnNpZ25lZCBpOworCXVpbnQzMl90IG5yX2VudHJpZXMgPSBsZTMyX3RvX2NwdShuLT5oZWFkZXIubnJfZW50cmllcyk7CisKKwlpZiAobGUzMl90b19jcHUobi0+aGVhZGVyLmZsYWdzKSAmIElOVEVSTkFMX05PREUpCisJCWZvciAoaSA9IDA7IGkgPCBucl9lbnRyaWVzOyBpKyspCisJCQlkbV90bV9pbmModG0sIHZhbHVlNjQobiwgaSkpOworCWVsc2UgaWYgKHZ0LT5pbmMpCisJCWZvciAoaSA9IDA7IGkgPCBucl9lbnRyaWVzOyBpKyspCisJCQl2dC0+aW5jKHZ0LT5jb250ZXh0LAorCQkJCXZhbHVlX3B0cihuLCBpLCB2dC0+c2l6ZSkpOworfQorCitzdGF0aWMgaW50IGluc2VydF9hdChzaXplX3QgdmFsdWVfc2l6ZSwgc3RydWN0IG5vZGUgKm5vZGUsIHVuc2lnbmVkIGluZGV4LAorCQkgICAgICB1aW50NjRfdCBrZXksIHZvaWQgKnZhbHVlKQorCQkgICAgICBfX2RtX3dyaXR0ZW5fdG9fZGlzayh2YWx1ZSkKK3sKKwl1aW50MzJfdCBucl9lbnRyaWVzID0gbGUzMl90b19jcHUobm9kZS0+aGVhZGVyLm5yX2VudHJpZXMpOworCV9fbGU2NCBrZXlfbGUgPSBjcHVfdG9fbGU2NChrZXkpOworCisJaWYgKGluZGV4ID4gbnJfZW50cmllcyB8fAorCSAgICBpbmRleCA+PSBsZTMyX3RvX2NwdShub2RlLT5oZWFkZXIubWF4X2VudHJpZXMpKSB7CisJCURNRVJSKCJ0b28gbWFueSBlbnRyaWVzIGluIGJ0cmVlIG5vZGUgZm9yIGluc2VydCIpOworCQlfX2RtX3VuYmxlc3NfZm9yX2Rpc2sodmFsdWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlfX2RtX2JsZXNzX2Zvcl9kaXNrKCZrZXlfbGUpOworCisJYXJyYXlfaW5zZXJ0KG5vZGUtPmtleXMsIHNpemVvZigqbm9kZS0+a2V5cyksIG5yX2VudHJpZXMsIGluZGV4LCAma2V5X2xlKTsKKwlhcnJheV9pbnNlcnQodmFsdWVfYmFzZShub2RlKSwgdmFsdWVfc2l6ZSwgbnJfZW50cmllcywgaW5kZXgsIHZhbHVlKTsKKwlub2RlLT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKG5yX2VudHJpZXMgKyAxKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogV2Ugd2FudCAzbiBlbnRyaWVzIChmb3Igc29tZSBuKS4gIFRoaXMgd29ya3MgbW9yZSBuaWNlbHkgZm9yIHJlcGVhdGVkCisgKiBpbnNlcnQgcmVtb3ZlIGxvb3BzIHRoYW4gKDJuICsgMSkuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBjYWxjX21heF9lbnRyaWVzKHNpemVfdCB2YWx1ZV9zaXplLCBzaXplX3QgYmxvY2tfc2l6ZSkKK3sKKwl1aW50MzJfdCB0b3RhbCwgbjsKKwlzaXplX3QgZWx0X3NpemUgPSBzaXplb2YodWludDY0X3QpICsgdmFsdWVfc2l6ZTsgLyoga2V5ICsgdmFsdWUgKi8KKworCWJsb2NrX3NpemUgLT0gc2l6ZW9mKHN0cnVjdCBub2RlX2hlYWRlcik7CisJdG90YWwgPSBibG9ja19zaXplIC8gZWx0X3NpemU7CisJbiA9IHRvdGFsIC8gMzsJCS8qIHJvdW5kcyBkb3duICovCisKKwlyZXR1cm4gMyAqIG47Cit9CisKK2ludCBkbV9idHJlZV9lbXB0eShzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCAqcm9vdCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmI7CisJc3RydWN0IG5vZGUgKm47CisJc2l6ZV90IGJsb2NrX3NpemU7CisJdWludDMyX3QgbWF4X2VudHJpZXM7CisKKwlyID0gbmV3X2Jsb2NrKGluZm8sICZiKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJYmxvY2tfc2l6ZSA9IGRtX2JtX2Jsb2NrX3NpemUoZG1fdG1fZ2V0X2JtKGluZm8tPnRtKSk7CisJbWF4X2VudHJpZXMgPSBjYWxjX21heF9lbnRyaWVzKGluZm8tPnZhbHVlX3R5cGUuc2l6ZSwgYmxvY2tfc2l6ZSk7CisKKwluID0gZG1fYmxvY2tfZGF0YShiKTsKKwltZW1zZXQobiwgMCwgYmxvY2tfc2l6ZSk7CisJbi0+aGVhZGVyLmZsYWdzID0gY3B1X3RvX2xlMzIoTEVBRl9OT0RFKTsKKwluLT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKDApOworCW4tPmhlYWRlci5tYXhfZW50cmllcyA9IGNwdV90b19sZTMyKG1heF9lbnRyaWVzKTsKKwluLT5oZWFkZXIudmFsdWVfc2l6ZSA9IGNwdV90b19sZTMyKGluZm8tPnZhbHVlX3R5cGUuc2l6ZSk7CisKKwkqcm9vdCA9IGRtX2Jsb2NrX2xvY2F0aW9uKGIpOworCXJldHVybiB1bmxvY2tfYmxvY2soaW5mbywgYik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idHJlZV9lbXB0eSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBEZWxldGlvbiB1c2VzIGEgcmVjdXJzaXZlIGFsZ29yaXRobSwgc2luY2Ugd2UgaGF2ZSBsaW1pdGVkIHN0YWNrIHNwYWNlCisgKiB3ZSBleHBsaWNpdGx5IG1hbmFnZSBvdXIgb3duIHN0YWNrIG9uIHRoZSBoZWFwLgorICovCisjZGVmaW5lIE1BWF9TUElORV9ERVBUSCA2NAorc3RydWN0IGZyYW1lIHsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmI7CisJc3RydWN0IG5vZGUgKm47CisJdW5zaWduZWQgbGV2ZWw7CisJdW5zaWduZWQgbnJfY2hpbGRyZW47CisJdW5zaWduZWQgY3VycmVudF9jaGlsZDsKK307CisKK3N0cnVjdCBkZWxfc3RhY2sgeworCXN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bTsKKwlpbnQgdG9wOworCXN0cnVjdCBmcmFtZSBzcGluZVtNQVhfU1BJTkVfREVQVEhdOworfTsKKworc3RhdGljIGludCB0b3BfZnJhbWUoc3RydWN0IGRlbF9zdGFjayAqcywgc3RydWN0IGZyYW1lICoqZikKK3sKKwlpZiAocy0+dG9wIDwgMCkgeworCQlETUVSUigiYnRyZWUgZGVsZXRpb24gc3RhY2sgZW1wdHkiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKmYgPSBzLT5zcGluZSArIHMtPnRvcDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVucHJvY2Vzc2VkX2ZyYW1lcyhzdHJ1Y3QgZGVsX3N0YWNrICpzKQoreworCXJldHVybiBzLT50b3AgPj0gMDsKK30KKworc3RhdGljIGludCBwdXNoX2ZyYW1lKHN0cnVjdCBkZWxfc3RhY2sgKnMsIGRtX2Jsb2NrX3QgYiwgdW5zaWduZWQgbGV2ZWwpCit7CisJaW50IHI7CisJdWludDMyX3QgcmVmX2NvdW50OworCisJaWYgKHMtPnRvcCA+PSBNQVhfU1BJTkVfREVQVEggLSAxKSB7CisJCURNRVJSKCJidHJlZSBkZWxldGlvbiBzdGFjayBvdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXIgPSBkbV90bV9yZWYocy0+dG0sIGIsICZyZWZfY291bnQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChyZWZfY291bnQgPiAxKQorCQkvKgorCQkgKiBUaGlzIGlzIGEgc2hhcmVkIG5vZGUsIHNvIHdlIGNhbiBqdXN0IGRlY3JlbWVudCBpdCdzCisJCSAqIHJlZmVyZW5jZSBjb3VudGVyIGFuZCBsZWF2ZSB0aGUgY2hpbGRyZW4uCisJCSAqLworCQlkbV90bV9kZWMocy0+dG0sIGIpOworCisJZWxzZSB7CisJCXN0cnVjdCBmcmFtZSAqZiA9IHMtPnNwaW5lICsgKytzLT50b3A7CisKKwkJciA9IGRtX3RtX3JlYWRfbG9jayhzLT50bSwgYiwgJmJ0cmVlX25vZGVfdmFsaWRhdG9yLCAmZi0+Yik7CisJCWlmIChyKSB7CisJCQlzLT50b3AtLTsKKwkJCXJldHVybiByOworCQl9CisKKwkJZi0+biA9IGRtX2Jsb2NrX2RhdGEoZi0+Yik7CisJCWYtPmxldmVsID0gbGV2ZWw7CisJCWYtPm5yX2NoaWxkcmVuID0gbGUzMl90b19jcHUoZi0+bi0+aGVhZGVyLm5yX2VudHJpZXMpOworCQlmLT5jdXJyZW50X2NoaWxkID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG9wX2ZyYW1lKHN0cnVjdCBkZWxfc3RhY2sgKnMpCit7CisJc3RydWN0IGZyYW1lICpmID0gcy0+c3BpbmUgKyBzLT50b3AtLTsKKworCWRtX3RtX2RlYyhzLT50bSwgZG1fYmxvY2tfbG9jYXRpb24oZi0+YikpOworCWRtX3RtX3VubG9jayhzLT50bSwgZi0+Yik7Cit9CisKK2ludCBkbV9idHJlZV9kZWwoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZGVsX3N0YWNrICpzOworCisJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzLT50bSA9IGluZm8tPnRtOworCXMtPnRvcCA9IC0xOworCisJciA9IHB1c2hfZnJhbWUocywgcm9vdCwgMSk7CisJaWYgKHIpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKHVucHJvY2Vzc2VkX2ZyYW1lcyhzKSkgeworCQl1aW50MzJfdCBmbGFnczsKKwkJc3RydWN0IGZyYW1lICpmOworCQlkbV9ibG9ja190IGI7CisKKwkJciA9IHRvcF9mcmFtZShzLCAmZik7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKGYtPmN1cnJlbnRfY2hpbGQgPj0gZi0+bnJfY2hpbGRyZW4pIHsKKwkJCXBvcF9mcmFtZShzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZmxhZ3MgPSBsZTMyX3RvX2NwdShmLT5uLT5oZWFkZXIuZmxhZ3MpOworCQlpZiAoZmxhZ3MgJiBJTlRFUk5BTF9OT0RFKSB7CisJCQliID0gdmFsdWU2NChmLT5uLCBmLT5jdXJyZW50X2NoaWxkKTsKKwkJCWYtPmN1cnJlbnRfY2hpbGQrKzsKKwkJCXIgPSBwdXNoX2ZyYW1lKHMsIGIsIGYtPmxldmVsKTsKKwkJCWlmIChyKQorCQkJCWdvdG8gb3V0OworCisJCX0gZWxzZSBpZiAoZi0+bGV2ZWwgIT0gKGluZm8tPmxldmVscyAtIDEpKSB7CisJCQliID0gdmFsdWU2NChmLT5uLCBmLT5jdXJyZW50X2NoaWxkKTsKKwkJCWYtPmN1cnJlbnRfY2hpbGQrKzsKKwkJCXIgPSBwdXNoX2ZyYW1lKHMsIGIsIGYtPmxldmVsICsgMSk7CisJCQlpZiAocikKKwkJCQlnb3RvIG91dDsKKworCQl9IGVsc2UgeworCQkJaWYgKGluZm8tPnZhbHVlX3R5cGUuZGVjKSB7CisJCQkJdW5zaWduZWQgaTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBmLT5ucl9jaGlsZHJlbjsgaSsrKQorCQkJCQlpbmZvLT52YWx1ZV90eXBlLmRlYyhpbmZvLT52YWx1ZV90eXBlLmNvbnRleHQsCisJCQkJCQkJICAgICB2YWx1ZV9wdHIoZi0+biwgaSwgaW5mby0+dmFsdWVfdHlwZS5zaXplKSk7CisJCQl9CisJCQlmLT5jdXJyZW50X2NoaWxkID0gZi0+bnJfY2hpbGRyZW47CisJCX0KKwl9CisKK291dDoKKwlrZnJlZShzKTsKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J0cmVlX2RlbCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgYnRyZWVfbG9va3VwX3JhdyhzdHJ1Y3Qgcm9fc3BpbmUgKnMsIGRtX2Jsb2NrX3QgYmxvY2ssIHVpbnQ2NF90IGtleSwKKwkJCSAgICBpbnQgKCpzZWFyY2hfZm4pKHN0cnVjdCBub2RlICosIHVpbnQ2NF90KSwKKwkJCSAgICB1aW50NjRfdCAqcmVzdWx0X2tleSwgdm9pZCAqdiwgc2l6ZV90IHZhbHVlX3NpemUpCit7CisJaW50IGksIHI7CisJdWludDMyX3QgZmxhZ3MsIG5yX2VudHJpZXM7CisKKwlkbyB7CisJCXIgPSByb19zdGVwKHMsIGJsb2NrKTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisKKwkJaSA9IHNlYXJjaF9mbihyb19ub2RlKHMpLCBrZXkpOworCisJCWZsYWdzID0gbGUzMl90b19jcHUocm9fbm9kZShzKS0+aGVhZGVyLmZsYWdzKTsKKwkJbnJfZW50cmllcyA9IGxlMzJfdG9fY3B1KHJvX25vZGUocyktPmhlYWRlci5ucl9lbnRyaWVzKTsKKwkJaWYgKGkgPCAwIHx8IGkgPj0gbnJfZW50cmllcykKKwkJCXJldHVybiAtRU5PREFUQTsKKworCQlpZiAoZmxhZ3MgJiBJTlRFUk5BTF9OT0RFKQorCQkJYmxvY2sgPSB2YWx1ZTY0KHJvX25vZGUocyksIGkpOworCisJfSB3aGlsZSAoIShmbGFncyAmIExFQUZfTk9ERSkpOworCisJKnJlc3VsdF9rZXkgPSBsZTY0X3RvX2NwdShyb19ub2RlKHMpLT5rZXlzW2ldKTsKKwltZW1jcHkodiwgdmFsdWVfcHRyKHJvX25vZGUocyksIGksIHZhbHVlX3NpemUpLCB2YWx1ZV9zaXplKTsKKworCXJldHVybiAwOworfQorCitpbnQgZG1fYnRyZWVfbG9va3VwKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QsCisJCSAgICB1aW50NjRfdCAqa2V5cywgdm9pZCAqdmFsdWVfbGUpCit7CisJdW5zaWduZWQgbGV2ZWwsIGxhc3RfbGV2ZWwgPSBpbmZvLT5sZXZlbHMgLSAxOworCWludCByID0gLUVOT0RBVEE7CisJdWludDY0X3QgcmtleTsKKwlfX2xlNjQgaW50ZXJuYWxfdmFsdWVfbGU7CisJc3RydWN0IHJvX3NwaW5lIHNwaW5lOworCisJaW5pdF9yb19zcGluZSgmc3BpbmUsIGluZm8pOworCWZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGluZm8tPmxldmVsczsgbGV2ZWwrKykgeworCQlzaXplX3Qgc2l6ZTsKKwkJdm9pZCAqdmFsdWVfcDsKKworCQlpZiAobGV2ZWwgPT0gbGFzdF9sZXZlbCkgeworCQkJdmFsdWVfcCA9IHZhbHVlX2xlOworCQkJc2l6ZSA9IGluZm8tPnZhbHVlX3R5cGUuc2l6ZTsKKworCQl9IGVsc2UgeworCQkJdmFsdWVfcCA9ICZpbnRlcm5hbF92YWx1ZV9sZTsKKwkJCXNpemUgPSBzaXplb2YodWludDY0X3QpOworCQl9CisKKwkJciA9IGJ0cmVlX2xvb2t1cF9yYXcoJnNwaW5lLCByb290LCBrZXlzW2xldmVsXSwKKwkJCQkgICAgIGxvd2VyX2JvdW5kLCAmcmtleSwKKwkJCQkgICAgIHZhbHVlX3AsIHNpemUpOworCisJCWlmICghcikgeworCQkJaWYgKHJrZXkgIT0ga2V5c1tsZXZlbF0pIHsKKwkJCQlleGl0X3JvX3NwaW5lKCZzcGluZSk7CisJCQkJcmV0dXJuIC1FTk9EQVRBOworCQkJfQorCQl9IGVsc2UgeworCQkJZXhpdF9yb19zcGluZSgmc3BpbmUpOworCQkJcmV0dXJuIHI7CisJCX0KKworCQlyb290ID0gbGU2NF90b19jcHUoaW50ZXJuYWxfdmFsdWVfbGUpOworCX0KKwlleGl0X3JvX3NwaW5lKCZzcGluZSk7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J0cmVlX2xvb2t1cCk7CisKKy8qCisgKiBTcGxpdHMgYSBub2RlIGJ5IGNyZWF0aW5nIGEgc2libGluZyBub2RlIGFuZCBzaGlmdGluZyBoYWxmIHRoZSBub2RlcworICogY29udGVudHMgYWNyb3NzLiAgQXNzdW1lcyB0aGVyZSBpcyBhIHBhcmVudCBub2RlLCBhbmQgaXQgaGFzIHJvb20gZm9yCisgKiBhbm90aGVyIGNoaWxkLgorICoKKyAqIEJlZm9yZToKKyAqCSAgKy0tLS0tLS0tKworICoJICB8IFBhcmVudCB8CisgKgkgICstLS0tLS0tLSsKKyAqCSAgICAgfAorICoJICAgICB2CisgKgkrLS0tLS0tLS0tLSsKKyAqCXwgQSArKysrKysgfAorICoJKy0tLS0tLS0tLS0rCisgKgorICoKKyAqIEFmdGVyOgorICoJCSstLS0tLS0tLSsKKyAqCQl8IFBhcmVudCB8CisgKgkJKy0tLS0tLS0tKworICoJCSAgfAl8CisgKgkJICB2CSstLS0tLS0rCisgKgkgICAgKy0tLS0tLS0tLSsJICAgICAgIHwKKyAqCSAgICB8IEEqICsrKyAgfAkgICAgICAgdgorICoJICAgICstLS0tLS0tLS0rCSAgKy0tLS0tLS0rCisgKgkJCSAgfCBCICsrKyB8CisgKgkJCSAgKy0tLS0tLS0rCisgKgorICogV2hlcmUgQSogaXMgYSBzaGFkb3cgb2YgQS4KKyAqLworc3RhdGljIGludCBidHJlZV9zcGxpdF9zaWJsaW5nKHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJCSAgICAgICB1bnNpZ25lZCBwYXJlbnRfaW5kZXgsIHVpbnQ2NF90IGtleSkKK3sKKwlpbnQgcjsKKwlzaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBucl9sZWZ0LCBucl9yaWdodDsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmxlZnQsICpyaWdodCwgKnBhcmVudDsKKwlzdHJ1Y3Qgbm9kZSAqbG4sICpybiwgKnBuOworCV9fbGU2NCBsb2NhdGlvbjsKKworCWxlZnQgPSBzaGFkb3dfY3VycmVudChzKTsKKworCXIgPSBuZXdfYmxvY2socy0+aW5mbywgJnJpZ2h0KTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJbG4gPSBkbV9ibG9ja19kYXRhKGxlZnQpOworCXJuID0gZG1fYmxvY2tfZGF0YShyaWdodCk7CisKKwlucl9sZWZ0ID0gbGUzMl90b19jcHUobG4tPmhlYWRlci5ucl9lbnRyaWVzKSAvIDI7CisJbnJfcmlnaHQgPSBsZTMyX3RvX2NwdShsbi0+aGVhZGVyLm5yX2VudHJpZXMpIC0gbnJfbGVmdDsKKworCWxuLT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKG5yX2xlZnQpOworCisJcm4tPmhlYWRlci5mbGFncyA9IGxuLT5oZWFkZXIuZmxhZ3M7CisJcm4tPmhlYWRlci5ucl9lbnRyaWVzID0gY3B1X3RvX2xlMzIobnJfcmlnaHQpOworCXJuLT5oZWFkZXIubWF4X2VudHJpZXMgPSBsbi0+aGVhZGVyLm1heF9lbnRyaWVzOworCXJuLT5oZWFkZXIudmFsdWVfc2l6ZSA9IGxuLT5oZWFkZXIudmFsdWVfc2l6ZTsKKwltZW1jcHkocm4tPmtleXMsIGxuLT5rZXlzICsgbnJfbGVmdCwgbnJfcmlnaHQgKiBzaXplb2Yocm4tPmtleXNbMF0pKTsKKworCXNpemUgPSBsZTMyX3RvX2NwdShsbi0+aGVhZGVyLmZsYWdzKSAmIElOVEVSTkFMX05PREUgPworCQlzaXplb2YodWludDY0X3QpIDogcy0+aW5mby0+dmFsdWVfdHlwZS5zaXplOworCW1lbWNweSh2YWx1ZV9wdHIocm4sIDAsIHNpemUpLCB2YWx1ZV9wdHIobG4sIG5yX2xlZnQsIHNpemUpLAorCSAgICAgICBzaXplICogbnJfcmlnaHQpOworCisJLyoKKwkgKiBQYXRjaCB1cCB0aGUgcGFyZW50CisJICovCisJcGFyZW50ID0gc2hhZG93X3BhcmVudChzKTsKKworCXBuID0gZG1fYmxvY2tfZGF0YShwYXJlbnQpOworCWxvY2F0aW9uID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24obGVmdCkpOworCV9fZG1fYmxlc3NfZm9yX2Rpc2soJmxvY2F0aW9uKTsKKwltZW1jcHlfZGlzayh2YWx1ZV9wdHIocG4sIHBhcmVudF9pbmRleCwgc2l6ZW9mKF9fbGU2NCkpLAorCQkgICAgJmxvY2F0aW9uLCBzaXplb2YoX19sZTY0KSk7CisKKwlsb2NhdGlvbiA9IGNwdV90b19sZTY0KGRtX2Jsb2NrX2xvY2F0aW9uKHJpZ2h0KSk7CisJX19kbV9ibGVzc19mb3JfZGlzaygmbG9jYXRpb24pOworCisJciA9IGluc2VydF9hdChzaXplb2YoX19sZTY0KSwgcG4sIHBhcmVudF9pbmRleCArIDEsCisJCSAgICAgIGxlNjRfdG9fY3B1KHJuLT5rZXlzWzBdKSwgJmxvY2F0aW9uKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoa2V5IDwgbGU2NF90b19jcHUocm4tPmtleXNbMF0pKSB7CisJCXVubG9ja19ibG9jayhzLT5pbmZvLCByaWdodCk7CisJCXMtPm5vZGVzWzFdID0gbGVmdDsKKwl9IGVsc2UgeworCQl1bmxvY2tfYmxvY2socy0+aW5mbywgbGVmdCk7CisJCXMtPm5vZGVzWzFdID0gcmlnaHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTcGxpdHMgYSBub2RlIGJ5IGNyZWF0aW5nIHR3byBuZXcgY2hpbGRyZW4gYmVuZWF0aCB0aGUgZ2l2ZW4gbm9kZS4KKyAqCisgKiBCZWZvcmU6CisgKgkgICstLS0tLS0tLS0tKworICoJICB8IEEgKysrKysrIHwKKyAqCSAgKy0tLS0tLS0tLS0rCisgKgorICoKKyAqIEFmdGVyOgorICoJKy0tLS0tLS0tLS0tLSsKKyAqCXwgQSAoc2hhZG93KSB8CisgKgkrLS0tLS0tLS0tLS0tKworICoJICAgIHwJfAorICogICArLS0tLS0tKwkrLS0tLSsKKyAqICAgfAkJICAgICB8CisgKiAgIHYJCSAgICAgdgorICogKy0tLS0tLS0rCSArLS0tLS0tLSsKKyAqIHwgQiArKysgfAkgfCBDICsrKyB8CisgKiArLS0tLS0tLSsJICstLS0tLS0tKworICovCitzdGF0aWMgaW50IGJ0cmVlX3NwbGl0X2JlbmVhdGgoc3RydWN0IHNoYWRvd19zcGluZSAqcywgdWludDY0X3Qga2V5KQoreworCWludCByOworCXNpemVfdCBzaXplOworCXVuc2lnbmVkIG5yX2xlZnQsIG5yX3JpZ2h0OworCXN0cnVjdCBkbV9ibG9jayAqbGVmdCwgKnJpZ2h0LCAqbmV3X3BhcmVudDsKKwlzdHJ1Y3Qgbm9kZSAqcG4sICpsbiwgKnJuOworCV9fbGU2NCB2YWw7CisKKwluZXdfcGFyZW50ID0gc2hhZG93X2N1cnJlbnQocyk7CisKKwlyID0gbmV3X2Jsb2NrKHMtPmluZm8sICZsZWZ0KTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IG5ld19ibG9jayhzLT5pbmZvLCAmcmlnaHQpOworCWlmIChyIDwgMCkgeworCQkvKiBGSVhNRTogcHV0IGxlZnQgKi8KKwkJcmV0dXJuIHI7CisJfQorCisJcG4gPSBkbV9ibG9ja19kYXRhKG5ld19wYXJlbnQpOworCWxuID0gZG1fYmxvY2tfZGF0YShsZWZ0KTsKKwlybiA9IGRtX2Jsb2NrX2RhdGEocmlnaHQpOworCisJbnJfbGVmdCA9IGxlMzJfdG9fY3B1KHBuLT5oZWFkZXIubnJfZW50cmllcykgLyAyOworCW5yX3JpZ2h0ID0gbGUzMl90b19jcHUocG4tPmhlYWRlci5ucl9lbnRyaWVzKSAtIG5yX2xlZnQ7CisKKwlsbi0+aGVhZGVyLmZsYWdzID0gcG4tPmhlYWRlci5mbGFnczsKKwlsbi0+aGVhZGVyLm5yX2VudHJpZXMgPSBjcHVfdG9fbGUzMihucl9sZWZ0KTsKKwlsbi0+aGVhZGVyLm1heF9lbnRyaWVzID0gcG4tPmhlYWRlci5tYXhfZW50cmllczsKKwlsbi0+aGVhZGVyLnZhbHVlX3NpemUgPSBwbi0+aGVhZGVyLnZhbHVlX3NpemU7CisKKwlybi0+aGVhZGVyLmZsYWdzID0gcG4tPmhlYWRlci5mbGFnczsKKwlybi0+aGVhZGVyLm5yX2VudHJpZXMgPSBjcHVfdG9fbGUzMihucl9yaWdodCk7CisJcm4tPmhlYWRlci5tYXhfZW50cmllcyA9IHBuLT5oZWFkZXIubWF4X2VudHJpZXM7CisJcm4tPmhlYWRlci52YWx1ZV9zaXplID0gcG4tPmhlYWRlci52YWx1ZV9zaXplOworCisJbWVtY3B5KGxuLT5rZXlzLCBwbi0+a2V5cywgbnJfbGVmdCAqIHNpemVvZihwbi0+a2V5c1swXSkpOworCW1lbWNweShybi0+a2V5cywgcG4tPmtleXMgKyBucl9sZWZ0LCBucl9yaWdodCAqIHNpemVvZihwbi0+a2V5c1swXSkpOworCisJc2l6ZSA9IGxlMzJfdG9fY3B1KHBuLT5oZWFkZXIuZmxhZ3MpICYgSU5URVJOQUxfTk9ERSA/CisJCXNpemVvZihfX2xlNjQpIDogcy0+aW5mby0+dmFsdWVfdHlwZS5zaXplOworCW1lbWNweSh2YWx1ZV9wdHIobG4sIDAsIHNpemUpLCB2YWx1ZV9wdHIocG4sIDAsIHNpemUpLCBucl9sZWZ0ICogc2l6ZSk7CisJbWVtY3B5KHZhbHVlX3B0cihybiwgMCwgc2l6ZSksIHZhbHVlX3B0cihwbiwgbnJfbGVmdCwgc2l6ZSksCisJICAgICAgIG5yX3JpZ2h0ICogc2l6ZSk7CisKKwkvKiBuZXdfcGFyZW50IHNob3VsZCBqdXN0IHBvaW50IHRvIGwgYW5kIHIgbm93ICovCisJcG4tPmhlYWRlci5mbGFncyA9IGNwdV90b19sZTMyKElOVEVSTkFMX05PREUpOworCXBuLT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKDIpOworCXBuLT5oZWFkZXIubWF4X2VudHJpZXMgPSBjcHVfdG9fbGUzMigKKwkJY2FsY19tYXhfZW50cmllcyhzaXplb2YoX19sZTY0KSwKKwkJCQkgZG1fYm1fYmxvY2tfc2l6ZSgKKwkJCQkJIGRtX3RtX2dldF9ibShzLT5pbmZvLT50bSkpKSk7CisJcG4tPmhlYWRlci52YWx1ZV9zaXplID0gY3B1X3RvX2xlMzIoc2l6ZW9mKF9fbGU2NCkpOworCisJdmFsID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24obGVmdCkpOworCV9fZG1fYmxlc3NfZm9yX2Rpc2soJnZhbCk7CisJcG4tPmtleXNbMF0gPSBsbi0+a2V5c1swXTsKKwltZW1jcHlfZGlzayh2YWx1ZV9wdHIocG4sIDAsIHNpemVvZihfX2xlNjQpKSwgJnZhbCwgc2l6ZW9mKF9fbGU2NCkpOworCisJdmFsID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24ocmlnaHQpKTsKKwlfX2RtX2JsZXNzX2Zvcl9kaXNrKCZ2YWwpOworCXBuLT5rZXlzWzFdID0gcm4tPmtleXNbMF07CisJbWVtY3B5X2Rpc2sodmFsdWVfcHRyKHBuLCAxLCBzaXplb2YoX19sZTY0KSksICZ2YWwsIHNpemVvZihfX2xlNjQpKTsKKworCS8qCisJICogcmVqaWcgdGhlIHNwaW5lLiAgVGhpcyBpcyB1Z2x5LCBzaW5jZSBpdCBrbm93cyB0b28KKwkgKiBtdWNoIGFib3V0IHRoZSBzcGluZQorCSAqLworCWlmIChzLT5ub2Rlc1swXSAhPSBuZXdfcGFyZW50KSB7CisJCXVubG9ja19ibG9jayhzLT5pbmZvLCBzLT5ub2Rlc1swXSk7CisJCXMtPm5vZGVzWzBdID0gbmV3X3BhcmVudDsKKwl9CisJaWYgKGtleSA8IGxlNjRfdG9fY3B1KHJuLT5rZXlzWzBdKSkgeworCQl1bmxvY2tfYmxvY2socy0+aW5mbywgcmlnaHQpOworCQlzLT5ub2Rlc1sxXSA9IGxlZnQ7CisJfSBlbHNlIHsKKwkJdW5sb2NrX2Jsb2NrKHMtPmluZm8sIGxlZnQpOworCQlzLT5ub2Rlc1sxXSA9IHJpZ2h0OworCX0KKwlzLT5jb3VudCA9IDI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHJlZV9pbnNlcnRfcmF3KHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJCSAgICBzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSAqdnQsCisJCQkgICAgdWludDY0X3Qga2V5LCB1bnNpZ25lZCAqaW5kZXgpCit7CisJaW50IHIsIGkgPSAqaW5kZXgsIHRvcCA9IDE7CisJc3RydWN0IG5vZGUgKm5vZGU7CisKKwlmb3IgKDs7KSB7CisJCXIgPSBzaGFkb3dfc3RlcChzLCByb290LCB2dCk7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCisJCW5vZGUgPSBkbV9ibG9ja19kYXRhKHNoYWRvd19jdXJyZW50KHMpKTsKKworCQkvKgorCQkgKiBXZSBoYXZlIHRvIHBhdGNoIHVwIHRoZSBwYXJlbnQgbm9kZSwgdWdseSwgYnV0IEkgZG9uJ3QKKwkJICogc2VlIGEgd2F5IHRvIGRvIHRoaXMgYXV0b21hdGljYWxseSBhcyBwYXJ0IG9mIHRoZSBzcGluZQorCQkgKiBvcC4KKwkJICovCisJCWlmIChzaGFkb3dfaGFzX3BhcmVudChzKSAmJiBpID49IDApIHsgLyogRklYTUU6IHNlY29uZCBjbGF1c2UgdW5uZXNzLiAqLworCQkJX19sZTY0IGxvY2F0aW9uID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24oc2hhZG93X2N1cnJlbnQocykpKTsKKworCQkJX19kbV9ibGVzc19mb3JfZGlzaygmbG9jYXRpb24pOworCQkJbWVtY3B5X2Rpc2sodmFsdWVfcHRyKGRtX2Jsb2NrX2RhdGEoc2hhZG93X3BhcmVudChzKSksIGksIHNpemVvZih1aW50NjRfdCkpLAorCQkJCSAgICAmbG9jYXRpb24sIHNpemVvZihfX2xlNjQpKTsKKwkJfQorCisJCW5vZGUgPSBkbV9ibG9ja19kYXRhKHNoYWRvd19jdXJyZW50KHMpKTsKKworCQlpZiAobm9kZS0+aGVhZGVyLm5yX2VudHJpZXMgPT0gbm9kZS0+aGVhZGVyLm1heF9lbnRyaWVzKSB7CisJCQlpZiAodG9wKQorCQkJCXIgPSBidHJlZV9zcGxpdF9iZW5lYXRoKHMsIGtleSk7CisJCQllbHNlCisJCQkJciA9IGJ0cmVlX3NwbGl0X3NpYmxpbmcocywgcm9vdCwgaSwga2V5KTsKKworCQkJaWYgKHIgPCAwKQorCQkJCXJldHVybiByOworCQl9CisKKwkJbm9kZSA9IGRtX2Jsb2NrX2RhdGEoc2hhZG93X2N1cnJlbnQocykpOworCisJCWkgPSBsb3dlcl9ib3VuZChub2RlLCBrZXkpOworCisJCWlmIChsZTMyX3RvX2NwdShub2RlLT5oZWFkZXIuZmxhZ3MpICYgTEVBRl9OT0RFKQorCQkJYnJlYWs7CisKKwkJaWYgKGkgPCAwKSB7CisJCQkvKiBjaGFuZ2UgdGhlIGJvdW5kcyBvbiB0aGUgbG93ZXN0IGtleSAqLworCQkJbm9kZS0+a2V5c1swXSA9IGNwdV90b19sZTY0KGtleSk7CisJCQlpID0gMDsKKwkJfQorCisJCXJvb3QgPSB2YWx1ZTY0KG5vZGUsIGkpOworCQl0b3AgPSAwOworCX0KKworCWlmIChpIDwgMCB8fCBsZTY0X3RvX2NwdShub2RlLT5rZXlzW2ldKSAhPSBrZXkpCisJCWkrKzsKKworCSppbmRleCA9IGk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5zZXJ0KHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QsCisJCSAgdWludDY0X3QgKmtleXMsIHZvaWQgKnZhbHVlLCBkbV9ibG9ja190ICpuZXdfcm9vdCwKKwkJICBpbnQgKmluc2VydGVkKQorCQkgIF9fZG1fd3JpdHRlbl90b19kaXNrKHZhbHVlKQoreworCWludCByLCBuZWVkX2luc2VydDsKKwl1bnNpZ25lZCBsZXZlbCwgaW5kZXggPSAtMSwgbGFzdF9sZXZlbCA9IGluZm8tPmxldmVscyAtIDE7CisJZG1fYmxvY2tfdCBibG9jayA9IHJvb3Q7CisJc3RydWN0IHNoYWRvd19zcGluZSBzcGluZTsKKwlzdHJ1Y3Qgbm9kZSAqbjsKKwlzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSBsZTY0X3R5cGU7CisKKwlsZTY0X3R5cGUuY29udGV4dCA9IE5VTEw7CisJbGU2NF90eXBlLnNpemUgPSBzaXplb2YoX19sZTY0KTsKKwlsZTY0X3R5cGUuaW5jID0gTlVMTDsKKwlsZTY0X3R5cGUuZGVjID0gTlVMTDsKKwlsZTY0X3R5cGUuZXF1YWwgPSBOVUxMOworCisJaW5pdF9zaGFkb3dfc3BpbmUoJnNwaW5lLCBpbmZvKTsKKworCWZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IChpbmZvLT5sZXZlbHMgLSAxKTsgbGV2ZWwrKykgeworCQlyID0gYnRyZWVfaW5zZXJ0X3Jhdygmc3BpbmUsIGJsb2NrLCAmbGU2NF90eXBlLCBrZXlzW2xldmVsXSwgJmluZGV4KTsKKwkJaWYgKHIgPCAwKQorCQkJZ290byBiYWQ7CisKKwkJbiA9IGRtX2Jsb2NrX2RhdGEoc2hhZG93X2N1cnJlbnQoJnNwaW5lKSk7CisJCW5lZWRfaW5zZXJ0ID0gKChpbmRleCA+PSBsZTMyX3RvX2NwdShuLT5oZWFkZXIubnJfZW50cmllcykpIHx8CisJCQkgICAgICAgKGxlNjRfdG9fY3B1KG4tPmtleXNbaW5kZXhdKSAhPSBrZXlzW2xldmVsXSkpOworCisJCWlmIChuZWVkX2luc2VydCkgeworCQkJZG1fYmxvY2tfdCBuZXdfdHJlZTsKKwkJCV9fbGU2NCBuZXdfbGU7CisKKwkJCXIgPSBkbV9idHJlZV9lbXB0eShpbmZvLCAmbmV3X3RyZWUpOworCQkJaWYgKHIgPCAwKQorCQkJCWdvdG8gYmFkOworCisJCQluZXdfbGUgPSBjcHVfdG9fbGU2NChuZXdfdHJlZSk7CisJCQlfX2RtX2JsZXNzX2Zvcl9kaXNrKCZuZXdfbGUpOworCisJCQlyID0gaW5zZXJ0X2F0KHNpemVvZih1aW50NjRfdCksIG4sIGluZGV4LAorCQkJCSAgICAgIGtleXNbbGV2ZWxdLCAmbmV3X2xlKTsKKwkJCWlmIChyKQorCQkJCWdvdG8gYmFkOworCQl9CisKKwkJaWYgKGxldmVsIDwgbGFzdF9sZXZlbCkKKwkJCWJsb2NrID0gdmFsdWU2NChuLCBpbmRleCk7CisJfQorCisJciA9IGJ0cmVlX2luc2VydF9yYXcoJnNwaW5lLCBibG9jaywgJmluZm8tPnZhbHVlX3R5cGUsCisJCQkgICAgIGtleXNbbGV2ZWxdLCAmaW5kZXgpOworCWlmIChyIDwgMCkKKwkJZ290byBiYWQ7CisKKwluID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudCgmc3BpbmUpKTsKKwluZWVkX2luc2VydCA9ICgoaW5kZXggPj0gbGUzMl90b19jcHUobi0+aGVhZGVyLm5yX2VudHJpZXMpKSB8fAorCQkgICAgICAgKGxlNjRfdG9fY3B1KG4tPmtleXNbaW5kZXhdKSAhPSBrZXlzW2xldmVsXSkpOworCisJaWYgKG5lZWRfaW5zZXJ0KSB7CisJCWlmIChpbnNlcnRlZCkKKwkJCSppbnNlcnRlZCA9IDE7CisKKwkJciA9IGluc2VydF9hdChpbmZvLT52YWx1ZV90eXBlLnNpemUsIG4sIGluZGV4LAorCQkJICAgICAga2V5c1tsZXZlbF0sIHZhbHVlKTsKKwkJaWYgKHIpCisJCQlnb3RvIGJhZF91bmJsZXNzZWQ7CisJfSBlbHNlIHsKKwkJaWYgKGluc2VydGVkKQorCQkJKmluc2VydGVkID0gMDsKKworCQlpZiAoaW5mby0+dmFsdWVfdHlwZS5kZWMgJiYKKwkJICAgICghaW5mby0+dmFsdWVfdHlwZS5lcXVhbCB8fAorCQkgICAgICFpbmZvLT52YWx1ZV90eXBlLmVxdWFsKAorCQkJICAgICBpbmZvLT52YWx1ZV90eXBlLmNvbnRleHQsCisJCQkgICAgIHZhbHVlX3B0cihuLCBpbmRleCwgaW5mby0+dmFsdWVfdHlwZS5zaXplKSwKKwkJCSAgICAgdmFsdWUpKSkgeworCQkJaW5mby0+dmFsdWVfdHlwZS5kZWMoaW5mby0+dmFsdWVfdHlwZS5jb250ZXh0LAorCQkJCQkgICAgIHZhbHVlX3B0cihuLCBpbmRleCwgaW5mby0+dmFsdWVfdHlwZS5zaXplKSk7CisJCX0KKwkJbWVtY3B5X2Rpc2sodmFsdWVfcHRyKG4sIGluZGV4LCBpbmZvLT52YWx1ZV90eXBlLnNpemUpLAorCQkJICAgIHZhbHVlLCBpbmZvLT52YWx1ZV90eXBlLnNpemUpOworCX0KKworCSpuZXdfcm9vdCA9IHNoYWRvd19yb290KCZzcGluZSk7CisJZXhpdF9zaGFkb3dfc3BpbmUoJnNwaW5lKTsKKworCXJldHVybiAwOworCitiYWQ6CisJX19kbV91bmJsZXNzX2Zvcl9kaXNrKHZhbHVlKTsKK2JhZF91bmJsZXNzZWQ6CisJZXhpdF9zaGFkb3dfc3BpbmUoJnNwaW5lKTsKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX2J0cmVlX2luc2VydChzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCByb290LAorCQkgICAgdWludDY0X3QgKmtleXMsIHZvaWQgKnZhbHVlLCBkbV9ibG9ja190ICpuZXdfcm9vdCkKKwkJICAgIF9fZG1fd3JpdHRlbl90b19kaXNrKHZhbHVlKQoreworCXJldHVybiBpbnNlcnQoaW5mbywgcm9vdCwga2V5cywgdmFsdWUsIG5ld19yb290LCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J0cmVlX2luc2VydCk7CisKK2ludCBkbV9idHJlZV9pbnNlcnRfbm90aWZ5KHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QsCisJCQkgICB1aW50NjRfdCAqa2V5cywgdm9pZCAqdmFsdWUsIGRtX2Jsb2NrX3QgKm5ld19yb290LAorCQkJICAgaW50ICppbnNlcnRlZCkKKwkJCSAgIF9fZG1fd3JpdHRlbl90b19kaXNrKHZhbHVlKQoreworCXJldHVybiBpbnNlcnQoaW5mbywgcm9vdCwga2V5cywgdmFsdWUsIG5ld19yb290LCBpbnNlcnRlZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idHJlZV9pbnNlcnRfbm90aWZ5KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBmaW5kX2hpZ2hlc3Rfa2V5KHN0cnVjdCByb19zcGluZSAqcywgZG1fYmxvY2tfdCBibG9jaywKKwkJCSAgICB1aW50NjRfdCAqcmVzdWx0X2tleSwgZG1fYmxvY2tfdCAqbmV4dF9ibG9jaykKK3sKKwlpbnQgaSwgcjsKKwl1aW50MzJfdCBmbGFnczsKKworCWRvIHsKKwkJciA9IHJvX3N0ZXAocywgYmxvY2spOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKworCQlmbGFncyA9IGxlMzJfdG9fY3B1KHJvX25vZGUocyktPmhlYWRlci5mbGFncyk7CisJCWkgPSBsZTMyX3RvX2NwdShyb19ub2RlKHMpLT5oZWFkZXIubnJfZW50cmllcyk7CisJCWlmICghaSkKKwkJCXJldHVybiAtRU5PREFUQTsKKwkJZWxzZQorCQkJaS0tOworCisJCSpyZXN1bHRfa2V5ID0gbGU2NF90b19jcHUocm9fbm9kZShzKS0+a2V5c1tpXSk7CisJCWlmIChuZXh0X2Jsb2NrIHx8IGZsYWdzICYgSU5URVJOQUxfTk9ERSkKKwkJCWJsb2NrID0gdmFsdWU2NChyb19ub2RlKHMpLCBpKTsKKworCX0gd2hpbGUgKGZsYWdzICYgSU5URVJOQUxfTk9ERSk7CisKKwlpZiAobmV4dF9ibG9jaykKKwkJKm5leHRfYmxvY2sgPSBibG9jazsKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX2J0cmVlX2ZpbmRfaGlnaGVzdF9rZXkoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJCSAgICAgIHVpbnQ2NF90ICpyZXN1bHRfa2V5cykKK3sKKwlpbnQgciA9IDAsIGNvdW50ID0gMCwgbGV2ZWw7CisJc3RydWN0IHJvX3NwaW5lIHNwaW5lOworCisJaW5pdF9yb19zcGluZSgmc3BpbmUsIGluZm8pOworCWZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGluZm8tPmxldmVsczsgbGV2ZWwrKykgeworCQlyID0gZmluZF9oaWdoZXN0X2tleSgmc3BpbmUsIHJvb3QsIHJlc3VsdF9rZXlzICsgbGV2ZWwsCisJCQkJICAgICBsZXZlbCA9PSBpbmZvLT5sZXZlbHMgLSAxID8gTlVMTCA6ICZyb290KTsKKwkJaWYgKHIgPT0gLUVOT0RBVEEpIHsKKwkJCXIgPSAwOworCQkJYnJlYWs7CisKKwkJfSBlbHNlIGlmIChyKQorCQkJYnJlYWs7CisKKwkJY291bnQrKzsKKwl9CisJZXhpdF9yb19zcGluZSgmc3BpbmUpOworCisJcmV0dXJuIHIgPyByIDogY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idHJlZV9maW5kX2hpZ2hlc3Rfa2V5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLmggYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDJjODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworI2lmbmRlZiBfTElOVVhfRE1fQlRSRUVfSAorI2RlZmluZSBfTElOVVhfRE1fQlRSRUVfSAorCisjaW5jbHVkZSAiZG0tYmxvY2stbWFuYWdlci5oIgorCitzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlcjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEFubm90YXRpb25zIHVzZWQgdG8gY2hlY2sgb24tZGlzayBtZXRhZGF0YSBpcyBoYW5kbGVkIGFzIGxpdHRsZS1lbmRpYW4uCisgKi8KKyNpZmRlZiBfX0NIRUNLRVJfXworIyAgZGVmaW5lIF9fZG1fd3JpdHRlbl90b19kaXNrKHgpIF9fcmVsZWFzZXMoeCkKKyMgIGRlZmluZSBfX2RtX3JlYWRzX2Zyb21fZGlzayh4KSBfX2FjcXVpcmVzKHgpCisjICBkZWZpbmUgX19kbV9ibGVzc19mb3JfZGlzayh4KSBfX2FjcXVpcmUoeCkKKyMgIGRlZmluZSBfX2RtX3VuYmxlc3NfZm9yX2Rpc2soeCkgX19yZWxlYXNlKHgpCisjZWxzZQorIyAgZGVmaW5lIF9fZG1fd3JpdHRlbl90b19kaXNrKHgpCisjICBkZWZpbmUgX19kbV9yZWFkc19mcm9tX2Rpc2soeCkKKyMgIGRlZmluZSBfX2RtX2JsZXNzX2Zvcl9kaXNrKHgpCisjICBkZWZpbmUgX19kbV91bmJsZXNzX2Zvcl9kaXNrKHgpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIE1hbmlwdWxhdGVzIGhpZXJhcmNoaWNhbCBCKyB0cmVlcyB3aXRoIDY0LWJpdCBrZXlzIGFuZCBhcmJpdHJhcnktc2l6ZWQKKyAqIHZhbHVlcy4KKyAqLworCisvKgorICogSW5mb21hdGlvbiBhYm91dCB0aGUgdmFsdWVzIHN0b3JlZCB3aXRoaW4gdGhlIGJ0cmVlLgorICovCitzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSB7CisJdm9pZCAqY29udGV4dDsKKworCS8qCisJICogVGhlIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCB2YWx1ZS4KKwkgKi8KKwl1aW50MzJfdCBzaXplOworCisJLyoKKwkgKiBBbnkgb2YgdGhlc2UgbWV0aG9kcyBjYW4gYmUgc2FmZWx5IHNldCB0byBOVUxMIGlmIHlvdSBkbyBub3QKKwkgKiBuZWVkIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUuCisJICovCisKKwkvKgorCSAqIFRoZSBidHJlZSBpcyBtYWtpbmcgYSBkdXBsaWNhdGUgb2YgdGhlIHZhbHVlLCBmb3IgaW5zdGFuY2UKKwkgKiBiZWNhdXNlIHByZXZpb3VzbHktc2hhcmVkIGJ0cmVlIG5vZGVzIGhhdmUgbm93IGRpdmVyZ2VkLgorCSAqIEB2YWx1ZSBhcmd1bWVudCBpcyB0aGUgbmV3IGNvcHkgdGhhdCB0aGUgY29weSBmdW5jdGlvbiBtYXkgbW9kaWZ5LgorCSAqIChQcm9iYWJseSBpdCBqdXN0IHdhbnRzIHRvIGluY3JlbWVudCBhIHJlZmVyZW5jZSBjb3VudAorCSAqIHNvbWV3aGVyZS4pIFRoaXMgbWV0aG9kIGlzIF9ub3RfIGNhbGxlZCBmb3IgaW5zZXJ0aW9uIG9mIGEgbmV3CisJICogdmFsdWU6IEl0IGlzIGFzc3VtZWQgdGhlIHJlZiBjb3VudCBpcyBhbHJlYWR5IDEuCisJICovCisJdm9pZCAoKmluYykodm9pZCAqY29udGV4dCwgdm9pZCAqdmFsdWUpOworCisJLyoKKwkgKiBUaGlzIHZhbHVlIGlzIGJlaW5nIGRlbGV0ZWQuICBUaGUgYnRyZWUgdGFrZXMgY2FyZSBvZiBmcmVlaW5nCisJICogdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IEB2YWx1ZS4gIE9mdGVuIHRoZSBkZWwgZnVuY3Rpb24ganVzdAorCSAqIG5lZWRzIHRvIGRlY3JlbWVudCBhIHJlZmVyZW5jZSBjb3VudCBzb21ld2hlcmUuCisJICovCisJdm9pZCAoKmRlYykodm9pZCAqY29udGV4dCwgdm9pZCAqdmFsdWUpOworCisJLyoKKwkgKiBBIHRlc3QgZm9yIGVxdWFsaXR5IGJldHdlZW4gdHdvIHZhbHVlcy4gIFdoZW4gYSB2YWx1ZSBpcworCSAqIG92ZXJ3cml0dGVuIHdpdGggYSBuZXcgb25lLCB0aGUgb2xkIG9uZSBoYXMgdGhlIGRlYyBtZXRob2QKKwkgKiBjYWxsZWQgX3VubGVzc18gdGhlIG5ldyBhbmQgb2xkIHZhbHVlIGFyZSBkZWVtZWQgZXF1YWwuCisJICovCisJaW50ICgqZXF1YWwpKHZvaWQgKmNvbnRleHQsIHZvaWQgKnZhbHVlMSwgdm9pZCAqdmFsdWUyKTsKK307CisKKy8qCisgKiBUaGUgc2hhcGUgYW5kIGNvbnRlbnRzIG9mIGEgYnRyZWUuCisgKi8KK3N0cnVjdCBkbV9idHJlZV9pbmZvIHsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG07CisKKwkvKgorCSAqIE51bWJlciBvZiBuZXN0ZWQgYnRyZWVzLiAoTm90IHRoZSBkZXB0aCBvZiBhIHNpbmdsZSB0cmVlLikKKwkgKi8KKwl1bnNpZ25lZCBsZXZlbHM7CisJc3RydWN0IGRtX2J0cmVlX3ZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKK307CisKKy8qCisgKiBTZXQgdXAgYW4gZW1wdHkgdHJlZS4gIE8oMSkuCisgKi8KK2ludCBkbV9idHJlZV9lbXB0eShzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCAqcm9vdCk7CisKKy8qCisgKiBEZWxldGUgYSB0cmVlLiAgTyhuKSAtIHRoaXMgaXMgdGhlIHNsb3cgb25lISAgSXQgY2FuIGFsc28gYmxvY2ssIHNvCisgKiBwbGVhc2UgZG9uJ3QgY2FsbCBpdCBvbiBhbiBJTyBwYXRoLgorICovCitpbnQgZG1fYnRyZWVfZGVsKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QpOworCisvKgorICogQWxsIHRoZSBsb29rdXAgZnVuY3Rpb25zIHJldHVybiAtRU5PREFUQSBpZiB0aGUga2V5IGNhbm5vdCBiZSBmb3VuZC4KKyAqLworCisvKgorICogVHJpZXMgdG8gZmluZCBhIGtleSB0aGF0IG1hdGNoZXMgZXhhY3RseS4gIE8obG4obikpCisgKi8KK2ludCBkbV9idHJlZV9sb29rdXAoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJICAgIHVpbnQ2NF90ICprZXlzLCB2b2lkICp2YWx1ZV9sZSk7CisKKy8qCisgKiBJbnNlcnRpb24gKG9yIG92ZXJ3cml0ZSBhbiBleGlzdGluZyB2YWx1ZSkuICBPKGxuKG4pKQorICovCitpbnQgZG1fYnRyZWVfaW5zZXJ0KHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QsCisJCSAgICB1aW50NjRfdCAqa2V5cywgdm9pZCAqdmFsdWUsIGRtX2Jsb2NrX3QgKm5ld19yb290KQorCQkgICAgX19kbV93cml0dGVuX3RvX2Rpc2sodmFsdWUpOworCisvKgorICogQSB2YXJpYW50IG9mIGluc2VydCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGl0IGFjdHVhbGx5IGluc2VydGVkIG9yIGp1c3QKKyAqIG92ZXJ3cm90ZS4gIFVzZWZ1bCBpZiB5b3UncmUga2VlcGluZyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYQorICogdHJlZS4KKyAqLworaW50IGRtX2J0cmVlX2luc2VydF9ub3RpZnkoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJCSAgIHVpbnQ2NF90ICprZXlzLCB2b2lkICp2YWx1ZSwgZG1fYmxvY2tfdCAqbmV3X3Jvb3QsCisJCQkgICBpbnQgKmluc2VydGVkKQorCQkJICAgX19kbV93cml0dGVuX3RvX2Rpc2sodmFsdWUpOworCisvKgorICogUmVtb3ZlIGEga2V5IGlmIHByZXNlbnQuICBUaGlzIGRvZXNuJ3QgcmVtb3ZlIGVtcHR5IHN1YiB0cmVlcy4gIE5vcm1hbGx5CisgKiBzdWJ0cmVlcyByZXByZXNlbnQgYSBzZXBhcmF0ZSBlbnRpdHksIGxpa2UgYSBzbmFwc2hvdCBtYXAsIHNvIHRoaXMgaXMKKyAqIGNvcnJlY3QgYmVoYXZpb3VyLiAgTyhsbihuKSkuCisgKi8KK2ludCBkbV9idHJlZV9yZW1vdmUoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJICAgIHVpbnQ2NF90ICprZXlzLCBkbV9ibG9ja190ICpuZXdfcm9vdCk7CisKKy8qCisgKiBSZXR1cm5zIDwgMCBvbiBmYWlsdXJlLiAgT3RoZXJ3aXNlIHRoZSBudW1iZXIgb2Yga2V5IGVudHJpZXMgdGhhdCBoYXZlCisgKiBiZWVuIGZpbGxlZCBvdXQuICBSZW1lbWJlciB0cmVlcyBjYW4gaGF2ZSB6ZXJvIGVudHJpZXMsIGFuZCBhcyBzdWNoIGhhdmUKKyAqIG5vIGhpZ2hlc3Qga2V5LgorICovCitpbnQgZG1fYnRyZWVfZmluZF9oaWdoZXN0X2tleShzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCByb290LAorCQkJICAgICAgdWludDY0X3QgKnJlc3VsdF9rZXlzKTsKKworI2VuZGlmCS8qIF9MSU5VWF9ETV9CVFJFRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1wZXJzaXN0ZW50LWRhdGEtaW50ZXJuYWwuaCBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXBlcnNpc3RlbnQtZGF0YS1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWUyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1wZXJzaXN0ZW50LWRhdGEtaW50ZXJuYWwuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIF9ETV9QRVJTSVNURU5UX0RBVEFfSU5URVJOQUxfSAorI2RlZmluZSBfRE1fUEVSU0lTVEVOVF9EQVRBX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgImRtLWJsb2NrLW1hbmFnZXIuaCIKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkbV9oYXNoX2Jsb2NrKGRtX2Jsb2NrX3QgYiwgdW5zaWduZWQgaGFzaF9tYXNrKQoreworCWNvbnN0IHVuc2lnbmVkIEJJR19QUklNRSA9IDQyOTQ5NjcyOTFVTDsKKworCXJldHVybiAoKCh1bnNpZ25lZCkgYikgKiBCSUdfUFJJTUUpICYgaGFzaF9tYXNrOworfQorCisjZW5kaWYJLyogX1BFUlNJU1RFTlRfREFUQV9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtY2hlY2tlci5jIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWNoZWNrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGVkNTNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWNoZWNrZXIuYwpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLXNwYWNlLW1hcC1jaGVja2VyLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKKyNpZmRlZiBDT05GSUdfRE1fREVCVUdfU1BBQ0VfTUFQUworCisjZGVmaW5lIERNX01TR19QUkVGSVggInNwYWNlIG1hcCBjaGVja2VyIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3QgY291bnRfYXJyYXkgeworCWRtX2Jsb2NrX3QgbnI7CisJZG1fYmxvY2tfdCBucl9mcmVlOworCisJdWludDMyX3QgKmNvdW50czsKK307CisKK3N0YXRpYyBpbnQgY2FfZ2V0X2NvdW50KHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgYiwgdWludDMyX3QgKmNvdW50KQoreworCWlmIChiID49IGNhLT5ucikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqY291bnQgPSBjYS0+Y291bnRzW2JdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhX2NvdW50X21vcmVfdGhhbl9vbmUoc3RydWN0IGNvdW50X2FycmF5ICpjYSwgZG1fYmxvY2tfdCBiLCBpbnQgKnIpCit7CisJaWYgKGIgPj0gY2EtPm5yKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpyID0gY2EtPmNvdW50c1tiXSA+IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2Ffc2V0X2NvdW50KHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgYiwgdWludDMyX3QgY291bnQpCit7CisJdWludDMyX3Qgb2xkX2NvdW50OworCisJaWYgKGIgPj0gY2EtPm5yKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9sZF9jb3VudCA9IGNhLT5jb3VudHNbYl07CisKKwlpZiAoIWNvdW50ICYmIG9sZF9jb3VudCkKKwkJY2EtPm5yX2ZyZWUrKzsKKworCWVsc2UgaWYgKGNvdW50ICYmICFvbGRfY291bnQpCisJCWNhLT5ucl9mcmVlLS07CisKKwljYS0+Y291bnRzW2JdID0gY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfaW5jX2Jsb2NrKHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgYikKK3sKKwlpZiAoYiA+PSBjYS0+bnIpCisJCXJldHVybiAtRUlOVkFMOworCisJY2Ffc2V0X2NvdW50KGNhLCBiLCBjYS0+Y291bnRzW2JdICsgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfZGVjX2Jsb2NrKHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgYikKK3sKKwlpZiAoYiA+PSBjYS0+bnIpCisJCXJldHVybiAtRUlOVkFMOworCisJQlVHX09OKGNhLT5jb3VudHNbYl0gPT0gMCk7CisJY2Ffc2V0X2NvdW50KGNhLCBiLCBjYS0+Y291bnRzW2JdIC0gMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfY3JlYXRlKHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCWludCByOworCWRtX2Jsb2NrX3QgbnJfYmxvY2tzOworCisJciA9IGRtX3NtX2dldF9ucl9ibG9ja3Moc20sICZucl9ibG9ja3MpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWNhLT5uciA9IG5yX2Jsb2NrczsKKwljYS0+bnJfZnJlZSA9IG5yX2Jsb2NrczsKKwljYS0+Y291bnRzID0ga3phbGxvYyhzaXplb2YoKmNhLT5jb3VudHMpICogbnJfYmxvY2tzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhLT5jb3VudHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfbG9hZChzdHJ1Y3QgY291bnRfYXJyYXkgKmNhLCBzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSkKK3sKKwlpbnQgcjsKKwl1aW50MzJfdCBjb3VudDsKKwlkbV9ibG9ja190IG5yX2Jsb2NrcywgaTsKKworCXIgPSBkbV9zbV9nZXRfbnJfYmxvY2tzKHNtLCAmbnJfYmxvY2tzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlCVUdfT04oY2EtPm5yICE9IG5yX2Jsb2Nrcyk7CisKKwlETVdBUk4oIkxvYWRpbmcgZGVidWcgc3BhY2UgbWFwIGZyb20gZGlzay4gIFRoaXMgbWF5IHRha2Ugc29tZSB0aW1lIik7CisJZm9yIChpID0gMDsgaSA8IG5yX2Jsb2NrczsgaSsrKSB7CisJCXIgPSBkbV9zbV9nZXRfY291bnQoc20sIGksICZjb3VudCk7CisJCWlmIChyKSB7CisJCQlETUVSUigibG9hZCBmYWlsZWQiKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJY2Ffc2V0X2NvdW50KGNhLCBpLCBjb3VudCk7CisJfQorCURNV0FSTigiTG9hZCBjb21wbGV0ZSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfZXh0ZW5kKHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCWRtX2Jsb2NrX3QgbnJfYmxvY2tzID0gY2EtPm5yICsgZXh0cmFfYmxvY2tzOworCXVpbnQzMl90ICpjb3VudHMgPSBremFsbG9jKHNpemVvZigqY291bnRzKSAqIG5yX2Jsb2NrcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb3VudHMpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KGNvdW50cywgY2EtPmNvdW50cywgc2l6ZW9mKCpjb3VudHMpICogY2EtPm5yKTsKKwlrZnJlZShjYS0+Y291bnRzKTsKKwljYS0+bnIgPSBucl9ibG9ja3M7CisJY2EtPm5yX2ZyZWUgKz0gZXh0cmFfYmxvY2tzOworCWNhLT5jb3VudHMgPSBjb3VudHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfY29tbWl0KHN0cnVjdCBjb3VudF9hcnJheSAqb2xkLCBzdHJ1Y3QgY291bnRfYXJyYXkgKm5ldykKK3sKKwlpZiAob2xkLT5uciAhPSBuZXctPm5yKSB7CisJCUJVR19PTihvbGQtPm5yID4gbmV3LT5ucik7CisJCWNhX2V4dGVuZChvbGQsIG5ldy0+bnIgLSBvbGQtPm5yKTsKKwl9CisKKwlCVUdfT04ob2xkLT5uciAhPSBuZXctPm5yKTsKKwlvbGQtPm5yX2ZyZWUgPSBuZXctPm5yX2ZyZWU7CisJbWVtY3B5KG9sZC0+Y291bnRzLCBuZXctPmNvdW50cywgc2l6ZW9mKCpvbGQtPmNvdW50cykgKiBvbGQtPm5yKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2FfZGVzdHJveShzdHJ1Y3QgY291bnRfYXJyYXkgKmNhKQoreworCWtmcmVlKGNhLT5jb3VudHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3Qgc21fY2hlY2tlciB7CisJc3RydWN0IGRtX3NwYWNlX21hcCBzbTsKKworCXN0cnVjdCBjb3VudF9hcnJheSBvbGRfY291bnRzOworCXN0cnVjdCBjb3VudF9hcnJheSBjb3VudHM7CisKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwICpyZWFsX3NtOworfTsKKworc3RhdGljIHZvaWQgc21fY2hlY2tlcl9kZXN0cm95KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisKKwlkbV9zbV9kZXN0cm95KHNtYy0+cmVhbF9zbSk7CisJY2FfZGVzdHJveSgmc21jLT5vbGRfY291bnRzKTsKKwljYV9kZXN0cm95KCZzbWMtPmNvdW50cyk7CisJa2ZyZWUoc21jKTsKK30KKworc3RhdGljIGludCBzbV9jaGVja2VyX2dldF9ucl9ibG9ja3Moc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmNvdW50KQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHIgPSBkbV9zbV9nZXRfbnJfYmxvY2tzKHNtYy0+cmVhbF9zbSwgY291bnQpOworCWlmICghcikKKwkJQlVHX09OKHNtYy0+b2xkX2NvdW50cy5uciAhPSAqY291bnQpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfZ2V0X25yX2ZyZWUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmNvdW50KQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHIgPSBkbV9zbV9nZXRfbnJfZnJlZShzbWMtPnJlYWxfc20sIGNvdW50KTsKKwlpZiAoIXIpIHsKKwkJLyoKKwkJICogU2xvdywgYnV0IHdlIGtub3cgaXQncyBjb3JyZWN0LgorCQkgKi8KKwkJZG1fYmxvY2tfdCBiLCBuID0gMDsKKwkJZm9yIChiID0gMDsgYiA8IHNtYy0+b2xkX2NvdW50cy5ucjsgYisrKQorCQkJaWYgKHNtYy0+b2xkX2NvdW50cy5jb3VudHNbYl0gPT0gMCAmJgorCQkJICAgIHNtYy0+Y291bnRzLmNvdW50c1tiXSA9PSAwKQorCQkJCW4rKzsKKworCQlpZiAobiAhPSAqY291bnQpCisJCQlETUVSUigiZnJlZSBibG9jayBjb3VudHMgZGlmZmVyLCBjaGVja2VyICV1LCBzbS1kaXNrOiV1IiwKKwkJCSAgICAgICh1bnNpZ25lZCkgbiwgKHVuc2lnbmVkKSAqY291bnQpOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBzbV9jaGVja2VyX25ld19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqYikKK3sKKwlzdHJ1Y3Qgc21fY2hlY2tlciAqc21jID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fY2hlY2tlciwgc20pOworCWludCByID0gZG1fc21fbmV3X2Jsb2NrKHNtYy0+cmVhbF9zbSwgYik7CisKKwlpZiAoIXIpIHsKKwkJQlVHX09OKCpiID49IHNtYy0+b2xkX2NvdW50cy5ucik7CisJCUJVR19PTihzbWMtPm9sZF9jb3VudHMuY291bnRzWypiXSAhPSAwKTsKKwkJQlVHX09OKCpiID49IHNtYy0+Y291bnRzLm5yKTsKKwkJQlVHX09OKHNtYy0+Y291bnRzLmNvdW50c1sqYl0gIT0gMCk7CisJCWNhX3NldF9jb3VudCgmc21jLT5jb3VudHMsICpiLCAxKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBzbV9jaGVja2VyX2luY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHIgPSBkbV9zbV9pbmNfYmxvY2soc21jLT5yZWFsX3NtLCBiKTsKKwlpbnQgcjIgPSBjYV9pbmNfYmxvY2soJnNtYy0+Y291bnRzLCBiKTsKKwlCVUdfT04ociAhPSByMik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fY2hlY2tlcl9kZWNfYmxvY2soc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYikKK3sKKwlzdHJ1Y3Qgc21fY2hlY2tlciAqc21jID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fY2hlY2tlciwgc20pOworCWludCByID0gZG1fc21fZGVjX2Jsb2NrKHNtYy0+cmVhbF9zbSwgYik7CisJaW50IHIyID0gY2FfZGVjX2Jsb2NrKCZzbWMtPmNvdW50cywgYik7CisJQlVHX09OKHIgIT0gcjIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfZ2V0X2NvdW50KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpCit7CisJc3RydWN0IHNtX2NoZWNrZXIgKnNtYyA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2NoZWNrZXIsIHNtKTsKKwl1aW50MzJfdCByZXN1bHQyID0gMDsKKwlpbnQgciA9IGRtX3NtX2dldF9jb3VudChzbWMtPnJlYWxfc20sIGIsIHJlc3VsdCk7CisJaW50IHIyID0gY2FfZ2V0X2NvdW50KCZzbWMtPmNvdW50cywgYiwgJnJlc3VsdDIpOworCisJQlVHX09OKHIgIT0gcjIpOworCWlmICghcikKKwkJQlVHX09OKCpyZXN1bHQgIT0gcmVzdWx0Mik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fY2hlY2tlcl9jb3VudF9tb3JlX3RoYW5fb25lKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsIGludCAqcmVzdWx0KQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHJlc3VsdDIgPSAwOworCWludCByID0gZG1fc21fY291bnRfaXNfbW9yZV90aGFuX29uZShzbWMtPnJlYWxfc20sIGIsIHJlc3VsdCk7CisJaW50IHIyID0gY2FfY291bnRfbW9yZV90aGFuX29uZSgmc21jLT5jb3VudHMsIGIsICZyZXN1bHQyKTsKKworCUJVR19PTihyICE9IHIyKTsKKwlpZiAoIXIpCisJCUJVR19PTighKCpyZXN1bHQpICYmIHJlc3VsdDIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfc2V0X2NvdW50KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsIHVpbnQzMl90IGNvdW50KQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJdWludDMyX3Qgb2xkX3JjOworCWludCByID0gZG1fc21fc2V0X2NvdW50KHNtYy0+cmVhbF9zbSwgYiwgY291bnQpOworCWludCByMjsKKworCUJVR19PTihiID49IHNtYy0+Y291bnRzLm5yKTsKKwlvbGRfcmMgPSBzbWMtPmNvdW50cy5jb3VudHNbYl07CisJcjIgPSBjYV9zZXRfY291bnQoJnNtYy0+Y291bnRzLCBiLCBjb3VudCk7CisJQlVHX09OKHIgIT0gcjIpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fY2hlY2tlcl9jb21taXQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJc3RydWN0IHNtX2NoZWNrZXIgKnNtYyA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2NoZWNrZXIsIHNtKTsKKwlpbnQgcjsKKworCXIgPSBkbV9zbV9jb21taXQoc21jLT5yZWFsX3NtKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gY2FfY29tbWl0KCZzbWMtPm9sZF9jb3VudHMsICZzbWMtPmNvdW50cyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fY2hlY2tlcl9leHRlbmQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHIgPSBkbV9zbV9leHRlbmQoc21jLT5yZWFsX3NtLCBleHRyYV9ibG9ja3MpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBjYV9leHRlbmQoJnNtYy0+Y291bnRzLCBleHRyYV9ibG9ja3MpOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfcm9vdF9zaXplKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBzaXplX3QgKnJlc3VsdCkKK3sKKwlzdHJ1Y3Qgc21fY2hlY2tlciAqc21jID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fY2hlY2tlciwgc20pOworCXJldHVybiBkbV9zbV9yb290X3NpemUoc21jLT5yZWFsX3NtLCByZXN1bHQpOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfY29weV9yb290KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCB2b2lkICpjb3B5X3RvX2hlcmVfbGUsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNtX2NoZWNrZXIgKnNtYyA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2NoZWNrZXIsIHNtKTsKKwlyZXR1cm4gZG1fc21fY29weV9yb290KHNtYy0+cmVhbF9zbSwgY29weV90b19oZXJlX2xlLCBsZW4pOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGRtX3NwYWNlX21hcCBvcHNfID0geworCS5kZXN0cm95ID0gc21fY2hlY2tlcl9kZXN0cm95LAorCS5nZXRfbnJfYmxvY2tzID0gc21fY2hlY2tlcl9nZXRfbnJfYmxvY2tzLAorCS5nZXRfbnJfZnJlZSA9IHNtX2NoZWNrZXJfZ2V0X25yX2ZyZWUsCisJLmluY19ibG9jayA9IHNtX2NoZWNrZXJfaW5jX2Jsb2NrLAorCS5kZWNfYmxvY2sgPSBzbV9jaGVja2VyX2RlY19ibG9jaywKKwkubmV3X2Jsb2NrID0gc21fY2hlY2tlcl9uZXdfYmxvY2ssCisJLmdldF9jb3VudCA9IHNtX2NoZWNrZXJfZ2V0X2NvdW50LAorCS5jb3VudF9pc19tb3JlX3RoYW5fb25lID0gc21fY2hlY2tlcl9jb3VudF9tb3JlX3RoYW5fb25lLAorCS5zZXRfY291bnQgPSBzbV9jaGVja2VyX3NldF9jb3VudCwKKwkuY29tbWl0ID0gc21fY2hlY2tlcl9jb21taXQsCisJLmV4dGVuZCA9IHNtX2NoZWNrZXJfZXh0ZW5kLAorCS5yb290X3NpemUgPSBzbV9jaGVja2VyX3Jvb3Rfc2l6ZSwKKwkuY29weV9yb290ID0gc21fY2hlY2tlcl9jb3B5X3Jvb3QKK307CisKK3N0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX2NoZWNrZXJfY3JlYXRlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCWludCByOworCXN0cnVjdCBzbV9jaGVja2VyICpzbWM7CisKKwlpZiAoIXNtKQorCQlyZXR1cm4gTlVMTDsKKworCXNtYyA9IGttYWxsb2Moc2l6ZW9mKCpzbWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtYykKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkoJnNtYy0+c20sICZvcHNfLCBzaXplb2Yoc21jLT5zbSkpOworCXIgPSBjYV9jcmVhdGUoJnNtYy0+b2xkX2NvdW50cywgc20pOworCWlmIChyKSB7CisJCWtmcmVlKHNtYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXIgPSBjYV9jcmVhdGUoJnNtYy0+Y291bnRzLCBzbSk7CisJaWYgKHIpIHsKKwkJY2FfZGVzdHJveSgmc21jLT5vbGRfY291bnRzKTsKKwkJa2ZyZWUoc21jKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21jLT5yZWFsX3NtID0gc207CisKKwlyID0gY2FfbG9hZCgmc21jLT5jb3VudHMsIHNtKTsKKwlpZiAocikgeworCQljYV9kZXN0cm95KCZzbWMtPmNvdW50cyk7CisJCWNhX2Rlc3Ryb3koJnNtYy0+b2xkX2NvdW50cyk7CisJCWtmcmVlKHNtYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXIgPSBjYV9jb21taXQoJnNtYy0+b2xkX2NvdW50cywgJnNtYy0+Y291bnRzKTsKKwlpZiAocikgeworCQljYV9kZXN0cm95KCZzbWMtPmNvdW50cyk7CisJCWNhX2Rlc3Ryb3koJnNtYy0+b2xkX2NvdW50cyk7CisJCWtmcmVlKHNtYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAmc21jLT5zbTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3NtX2NoZWNrZXJfY3JlYXRlKTsKKworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fY2hlY2tlcl9jcmVhdGVfZnJlc2goc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJaW50IHI7CisJc3RydWN0IHNtX2NoZWNrZXIgKnNtYzsKKworCWlmICghc20pCisJCXJldHVybiBOVUxMOworCisJc21jID0ga21hbGxvYyhzaXplb2YoKnNtYyksIEdGUF9LRVJORUwpOworCWlmICghc21jKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweSgmc21jLT5zbSwgJm9wc18sIHNpemVvZihzbWMtPnNtKSk7CisJciA9IGNhX2NyZWF0ZSgmc21jLT5vbGRfY291bnRzLCBzbSk7CisJaWYgKHIpIHsKKwkJa2ZyZWUoc21jKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJciA9IGNhX2NyZWF0ZSgmc21jLT5jb3VudHMsIHNtKTsKKwlpZiAocikgeworCQljYV9kZXN0cm95KCZzbWMtPm9sZF9jb3VudHMpOworCQlrZnJlZShzbWMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbWMtPnJlYWxfc20gPSBzbTsKKwlyZXR1cm4gJnNtYy0+c207Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9zbV9jaGVja2VyX2NyZWF0ZV9mcmVzaCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNlbHNlCisKK3N0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX2NoZWNrZXJfY3JlYXRlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCXJldHVybiBzbTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3NtX2NoZWNrZXJfY3JlYXRlKTsKKworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fY2hlY2tlcl9jcmVhdGVfZnJlc2goc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJcmV0dXJuIHNtOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fc21fY2hlY2tlcl9jcmVhdGVfZnJlc2gpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jaGVja2VyLmggYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtY2hlY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGRjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtY2hlY2tlci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgU05BUFNIT1RTX1NQQUNFX01BUF9DSEVDS0VSX0gKKyNkZWZpbmUgU05BUFNIT1RTX1NQQUNFX01BUF9DSEVDS0VSX0gKKworI2luY2x1ZGUgImRtLXNwYWNlLW1hcC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhpcyBzcGFjZSBtYXAgd3JhcHMgYSByZWFsIG9uLWRpc2sgc3BhY2UgbWFwLCBhbmQgdmVyaWZpZXMgYWxsIG9mIGl0cworICogb3BlcmF0aW9ucy4gIEl0IHVzZXMgYSBsb3Qgb2YgbWVtb3J5LCBzbyBvbmx5IHVzZSBpZiB5b3UgaGF2ZSBhIHNwZWNpZmljCisgKiBwcm9ibGVtIHRoYXQgeW91J3JlIGRlYnVnZ2luZy4KKyAqCisgKiBPd25lcnNoaXAgb2YgQHNtIHBhc3Nlcy4KKyAqLworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fY2hlY2tlcl9jcmVhdGUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20pOworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fY2hlY2tlcl9jcmVhdGVfZnJlc2goc3RydWN0IGRtX3NwYWNlX21hcCAqc20pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jb21tb24uYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjI0OTRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWNvbW1vbi5jCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLWNvbW1vbi5oIgorI2luY2x1ZGUgImRtLXRyYW5zYWN0aW9uLW1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJzcGFjZSBtYXAgY29tbW9uIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogSW5kZXggdmFsaWRhdG9yLgorICovCisjZGVmaW5lIElOREVYX0NTVU1fWE9SIDE2MDQ3OAorCitzdGF0aWMgdm9pZCBpbmRleF9wcmVwYXJlX2Zvcl93cml0ZShzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkJCSAgICBzdHJ1Y3QgZG1fYmxvY2sgKmIsCisJCQkJICAgIHNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCBkaXNrX21ldGFkYXRhX2luZGV4ICptaV9sZSA9IGRtX2Jsb2NrX2RhdGEoYik7CisKKwltaV9sZS0+YmxvY2tuciA9IGNwdV90b19sZTY0KGRtX2Jsb2NrX2xvY2F0aW9uKGIpKTsKKwltaV9sZS0+Y3N1bSA9IGNwdV90b19sZTMyKGRtX2JtX2NoZWNrc3VtKCZtaV9sZS0+cGFkZGluZywKKwkJCQkJCSBibG9ja19zaXplIC0gc2l6ZW9mKF9fbGUzMiksCisJCQkJCQkgSU5ERVhfQ1NVTV9YT1IpKTsKK30KKworc3RhdGljIGludCBpbmRleF9jaGVjayhzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgICAgc3RydWN0IGRtX2Jsb2NrICpiLAorCQkgICAgICAgc2l6ZV90IGJsb2NrX3NpemUpCit7CisJc3RydWN0IGRpc2tfbWV0YWRhdGFfaW5kZXggKm1pX2xlID0gZG1fYmxvY2tfZGF0YShiKTsKKwlfX2xlMzIgY3N1bV9kaXNrOworCisJaWYgKGRtX2Jsb2NrX2xvY2F0aW9uKGIpICE9IGxlNjRfdG9fY3B1KG1pX2xlLT5ibG9ja25yKSkgeworCQlETUVSUigiaW5kZXhfY2hlY2sgZmFpbGVkIGJsb2NrbnIgJWxsdSB3YW50ZWQgJWxsdSIsCisJCSAgICAgIGxlNjRfdG9fY3B1KG1pX2xlLT5ibG9ja25yKSwgZG1fYmxvY2tfbG9jYXRpb24oYikpOworCQlyZXR1cm4gLUVOT1RCTEs7CisJfQorCisJY3N1bV9kaXNrID0gY3B1X3RvX2xlMzIoZG1fYm1fY2hlY2tzdW0oJm1pX2xlLT5wYWRkaW5nLAorCQkJCQkgICAgICAgYmxvY2tfc2l6ZSAtIHNpemVvZihfX2xlMzIpLAorCQkJCQkgICAgICAgSU5ERVhfQ1NVTV9YT1IpKTsKKwlpZiAoY3N1bV9kaXNrICE9IG1pX2xlLT5jc3VtKSB7CisJCURNRVJSKCJpbmRleF9jaGVjayBmYWlsZWQgY3N1bSAldSB3YW50ZWQgJXUiLAorCQkgICAgICBsZTMyX3RvX2NwdShjc3VtX2Rpc2spLCBsZTMyX3RvX2NwdShtaV9sZS0+Y3N1bSkpOworCQlyZXR1cm4gLUVJTFNFUTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgaW5kZXhfdmFsaWRhdG9yID0geworCS5uYW1lID0gImluZGV4IiwKKwkucHJlcGFyZV9mb3Jfd3JpdGUgPSBpbmRleF9wcmVwYXJlX2Zvcl93cml0ZSwKKwkuY2hlY2sgPSBpbmRleF9jaGVjaworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEJpdG1hcCB2YWxpZGF0b3IKKyAqLworI2RlZmluZSBCSVRNQVBfQ1NVTV9YT1IgMjQwNzc5CisKK3N0YXRpYyB2b2lkIGJpdG1hcF9wcmVwYXJlX2Zvcl93cml0ZShzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkJCSAgICAgc3RydWN0IGRtX2Jsb2NrICpiLAorCQkJCSAgICAgc2l6ZV90IGJsb2NrX3NpemUpCit7CisJc3RydWN0IGRpc2tfYml0bWFwX2hlYWRlciAqZGlza19oZWFkZXIgPSBkbV9ibG9ja19kYXRhKGIpOworCisJZGlza19oZWFkZXItPmJsb2NrbnIgPSBjcHVfdG9fbGU2NChkbV9ibG9ja19sb2NhdGlvbihiKSk7CisJZGlza19oZWFkZXItPmNzdW0gPSBjcHVfdG9fbGUzMihkbV9ibV9jaGVja3N1bSgmZGlza19oZWFkZXItPm5vdF91c2VkLAorCQkJCQkJICAgICAgIGJsb2NrX3NpemUgLSBzaXplb2YoX19sZTMyKSwKKwkJCQkJCSAgICAgICBCSVRNQVBfQ1NVTV9YT1IpKTsKK30KKworc3RhdGljIGludCBiaXRtYXBfY2hlY2soc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJCXN0cnVjdCBkbV9ibG9jayAqYiwKKwkJCXNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCBkaXNrX2JpdG1hcF9oZWFkZXIgKmRpc2tfaGVhZGVyID0gZG1fYmxvY2tfZGF0YShiKTsKKwlfX2xlMzIgY3N1bV9kaXNrOworCisJaWYgKGRtX2Jsb2NrX2xvY2F0aW9uKGIpICE9IGxlNjRfdG9fY3B1KGRpc2tfaGVhZGVyLT5ibG9ja25yKSkgeworCQlETUVSUigiYml0bWFwIGNoZWNrIGZhaWxlZCBibG9ja25yICVsbHUgd2FudGVkICVsbHUiLAorCQkgICAgICBsZTY0X3RvX2NwdShkaXNrX2hlYWRlci0+YmxvY2tuciksIGRtX2Jsb2NrX2xvY2F0aW9uKGIpKTsKKwkJcmV0dXJuIC1FTk9UQkxLOworCX0KKworCWNzdW1fZGlzayA9IGNwdV90b19sZTMyKGRtX2JtX2NoZWNrc3VtKCZkaXNrX2hlYWRlci0+bm90X3VzZWQsCisJCQkJCSAgICAgICBibG9ja19zaXplIC0gc2l6ZW9mKF9fbGUzMiksCisJCQkJCSAgICAgICBCSVRNQVBfQ1NVTV9YT1IpKTsKKwlpZiAoY3N1bV9kaXNrICE9IGRpc2tfaGVhZGVyLT5jc3VtKSB7CisJCURNRVJSKCJiaXRtYXAgY2hlY2sgZmFpbGVkIGNzdW0gJXUgd2FudGVkICV1IiwKKwkJICAgICAgbGUzMl90b19jcHUoY3N1bV9kaXNrKSwgbGUzMl90b19jcHUoZGlza19oZWFkZXItPmNzdW0pKTsKKwkJcmV0dXJuIC1FSUxTRVE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yIGRtX3NtX2JpdG1hcF92YWxpZGF0b3IgPSB7CisJLm5hbWUgPSAic21fYml0bWFwIiwKKwkucHJlcGFyZV9mb3Jfd3JpdGUgPSBiaXRtYXBfcHJlcGFyZV9mb3Jfd3JpdGUsCisJLmNoZWNrID0gYml0bWFwX2NoZWNrCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEVOVFJJRVNfUEVSX1dPUkQgMzIKKyNkZWZpbmUgRU5UUklFU19TSElGVAk1CisKK3N0YXRpYyB2b2lkICpkbV9iaXRtYXBfZGF0YShzdHJ1Y3QgZG1fYmxvY2sgKmIpCit7CisJcmV0dXJuIGRtX2Jsb2NrX2RhdGEoYikgKyBzaXplb2Yoc3RydWN0IGRpc2tfYml0bWFwX2hlYWRlcik7Cit9CisKKyNkZWZpbmUgV09SRF9NQVNLX0hJR0ggMHhBQUFBQUFBQUFBQUFBQUFBVUxMCisKK3N0YXRpYyB1bnNpZ25lZCBiaXRtYXBfd29yZF91c2VkKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGIpCit7CisJX19sZTY0ICp3b3Jkc19sZSA9IGFkZHI7CisJX19sZTY0ICp3X2xlID0gd29yZHNfbGUgKyAoYiA+PiBFTlRSSUVTX1NISUZUKTsKKworCXVpbnQ2NF90IGJpdHMgPSBsZTY0X3RvX2NwdSgqd19sZSk7CisJdWludDY0X3QgbWFzayA9IChiaXRzICsgV09SRF9NQVNLX0hJR0ggKyAxKSAmIFdPUkRfTUFTS19ISUdIOworCisJcmV0dXJuICEofmJpdHMgJiBtYXNrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNtX2xvb2t1cF9iaXRtYXAodm9pZCAqYWRkciwgdW5zaWduZWQgYikKK3sKKwlfX2xlNjQgKndvcmRzX2xlID0gYWRkcjsKKwlfX2xlNjQgKndfbGUgPSB3b3Jkc19sZSArIChiID4+IEVOVFJJRVNfU0hJRlQpOworCXVuc2lnbmVkIGhpLCBsbzsKKworCWIgPSAoYiAmIChFTlRSSUVTX1BFUl9XT1JEIC0gMSkpIDw8IDE7CisJaGkgPSAhIXRlc3RfYml0X2xlKGIsICh2b2lkICopIHdfbGUpOworCWxvID0gISF0ZXN0X2JpdF9sZShiICsgMSwgKHZvaWQgKikgd19sZSk7CisJcmV0dXJuIChoaSA8PCAxKSB8IGxvOworfQorCitzdGF0aWMgdm9pZCBzbV9zZXRfYml0bWFwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGIsIHVuc2lnbmVkIHZhbCkKK3sKKwlfX2xlNjQgKndvcmRzX2xlID0gYWRkcjsKKwlfX2xlNjQgKndfbGUgPSB3b3Jkc19sZSArIChiID4+IEVOVFJJRVNfU0hJRlQpOworCisJYiA9IChiICYgKEVOVFJJRVNfUEVSX1dPUkQgLSAxKSkgPDwgMTsKKworCWlmICh2YWwgJiAyKQorCQlfX3NldF9iaXRfbGUoYiwgKHZvaWQgKikgd19sZSk7CisJZWxzZQorCQlfX2NsZWFyX2JpdF9sZShiLCAodm9pZCAqKSB3X2xlKTsKKworCWlmICh2YWwgJiAxKQorCQlfX3NldF9iaXRfbGUoYiArIDEsICh2b2lkICopIHdfbGUpOworCWVsc2UKKwkJX19jbGVhcl9iaXRfbGUoYiArIDEsICh2b2lkICopIHdfbGUpOworfQorCitzdGF0aWMgaW50IHNtX2ZpbmRfZnJlZSh2b2lkICphZGRyLCB1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQgZW5kLAorCQkJdW5zaWduZWQgKnJlc3VsdCkKK3sKKwl3aGlsZSAoYmVnaW4gPCBlbmQpIHsKKwkJaWYgKCEoYmVnaW4gJiAoRU5UUklFU19QRVJfV09SRCAtIDEpKSAmJgorCQkgICAgYml0bWFwX3dvcmRfdXNlZChhZGRyLCBiZWdpbikpIHsKKwkJCWJlZ2luICs9IEVOVFJJRVNfUEVSX1dPUkQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc21fbG9va3VwX2JpdG1hcChhZGRyLCBiZWdpbikpIHsKKwkJCSpyZXN1bHQgPSBiZWdpbjsKKwkJCXJldHVybiAwOworCQl9CisKKwkJYmVnaW4rKzsKKwl9CisKKwlyZXR1cm4gLUVOT1NQQzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbV9sbF9pbml0KHN0cnVjdCBsbF9kaXNrICpsbCwgc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtKQoreworCWxsLT50bSA9IHRtOworCisJbGwtPmJpdG1hcF9pbmZvLnRtID0gdG07CisJbGwtPmJpdG1hcF9pbmZvLmxldmVscyA9IDE7CisKKwkvKgorCSAqIEJlY2F1c2UgdGhlIG5ldyBiaXRtYXAgYmxvY2tzIGFyZSBjcmVhdGVkIHZpYSBhIHNoYWRvdworCSAqIG9wZXJhdGlvbiwgdGhlIG9sZCBlbnRyeSBoYXMgYWxyZWFkeSBoYWQgaXRzIHJlZmVyZW5jZSBjb3VudAorCSAqIGRlY3JlbWVudGVkIGFuZCB3ZSBkb24ndCBuZWVkIHRoZSBidHJlZSB0byBkbyBhbnkgYm9va2tlZXBpbmcuCisJICovCisJbGwtPmJpdG1hcF9pbmZvLnZhbHVlX3R5cGUuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGlza19pbmRleF9lbnRyeSk7CisJbGwtPmJpdG1hcF9pbmZvLnZhbHVlX3R5cGUuaW5jID0gTlVMTDsKKwlsbC0+Yml0bWFwX2luZm8udmFsdWVfdHlwZS5kZWMgPSBOVUxMOworCWxsLT5iaXRtYXBfaW5mby52YWx1ZV90eXBlLmVxdWFsID0gTlVMTDsKKworCWxsLT5yZWZfY291bnRfaW5mby50bSA9IHRtOworCWxsLT5yZWZfY291bnRfaW5mby5sZXZlbHMgPSAxOworCWxsLT5yZWZfY291bnRfaW5mby52YWx1ZV90eXBlLnNpemUgPSBzaXplb2YodWludDMyX3QpOworCWxsLT5yZWZfY291bnRfaW5mby52YWx1ZV90eXBlLmluYyA9IE5VTEw7CisJbGwtPnJlZl9jb3VudF9pbmZvLnZhbHVlX3R5cGUuZGVjID0gTlVMTDsKKwlsbC0+cmVmX2NvdW50X2luZm8udmFsdWVfdHlwZS5lcXVhbCA9IE5VTEw7CisKKwlsbC0+YmxvY2tfc2l6ZSA9IGRtX2JtX2Jsb2NrX3NpemUoZG1fdG1fZ2V0X2JtKHRtKSk7CisKKwlpZiAobGwtPmJsb2NrX3NpemUgPiAoMSA8PCAzMCkpIHsKKwkJRE1FUlIoImJsb2NrIHNpemUgdG9vIGJpZyB0byBob2xkIGJpdG1hcHMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGwtPmVudHJpZXNfcGVyX2Jsb2NrID0gKGxsLT5ibG9ja19zaXplIC0gc2l6ZW9mKHN0cnVjdCBkaXNrX2JpdG1hcF9oZWFkZXIpKSAqCisJCUVOVFJJRVNfUEVSX0JZVEU7CisJbGwtPm5yX2Jsb2NrcyA9IDA7CisJbGwtPmJpdG1hcF9yb290ID0gMDsKKwlsbC0+cmVmX2NvdW50X3Jvb3QgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzbV9sbF9leHRlbmQoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGV4dHJhX2Jsb2NrcykKK3sKKwlpbnQgcjsKKwlkbV9ibG9ja190IGksIG5yX2Jsb2NrcywgbnJfaW5kZXhlczsKKwl1bnNpZ25lZCBvbGRfYmxvY2tzLCBibG9ja3M7CisKKwlucl9ibG9ja3MgPSBsbC0+bnJfYmxvY2tzICsgZXh0cmFfYmxvY2tzOworCW9sZF9ibG9ja3MgPSBkbV9zZWN0b3JfZGl2X3VwKGxsLT5ucl9ibG9ja3MsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJYmxvY2tzID0gZG1fc2VjdG9yX2Rpdl91cChucl9ibG9ja3MsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisKKwlucl9pbmRleGVzID0gZG1fc2VjdG9yX2Rpdl91cChucl9ibG9ja3MsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJaWYgKG5yX2luZGV4ZXMgPiBsbC0+bWF4X2VudHJpZXMobGwpKSB7CisJCURNRVJSKCJzcGFjZSBtYXAgdG9vIGxhcmdlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IG9sZF9ibG9ja3M7IGkgPCBibG9ja3M7IGkrKykgeworCQlzdHJ1Y3QgZG1fYmxvY2sgKmI7CisJCXN0cnVjdCBkaXNrX2luZGV4X2VudHJ5IGlkeDsKKworCQlyID0gZG1fdG1fbmV3X2Jsb2NrKGxsLT50bSwgJmRtX3NtX2JpdG1hcF92YWxpZGF0b3IsICZiKTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJCWlkeC5ibG9ja25yID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24oYikpOworCisJCXIgPSBkbV90bV91bmxvY2sobGwtPnRtLCBiKTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisKKwkJaWR4Lm5yX2ZyZWUgPSBjcHVfdG9fbGUzMihsbC0+ZW50cmllc19wZXJfYmxvY2spOworCQlpZHgubm9uZV9mcmVlX2JlZm9yZSA9IDA7CisKKwkJciA9IGxsLT5zYXZlX2llKGxsLCBpLCAmaWR4KTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJfQorCisJbGwtPm5yX2Jsb2NrcyA9IG5yX2Jsb2NrczsKKwlyZXR1cm4gMDsKK30KKworaW50IHNtX2xsX2xvb2t1cF9iaXRtYXAoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpCit7CisJaW50IHI7CisJZG1fYmxvY2tfdCBpbmRleCA9IGI7CisJc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgaWVfZGlzazsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmJsazsKKworCWIgPSBkb19kaXYoaW5kZXgsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJciA9IGxsLT5sb2FkX2llKGxsLCBpbmRleCwgJmllX2Rpc2spOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gZG1fdG1fcmVhZF9sb2NrKGxsLT50bSwgbGU2NF90b19jcHUoaWVfZGlzay5ibG9ja25yKSwKKwkJCSAgICAmZG1fc21fYml0bWFwX3ZhbGlkYXRvciwgJmJsayk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCSpyZXN1bHQgPSBzbV9sb29rdXBfYml0bWFwKGRtX2JpdG1hcF9kYXRhKGJsayksIGIpOworCisJcmV0dXJuIGRtX3RtX3VubG9jayhsbC0+dG0sIGJsayk7Cit9CisKK2ludCBzbV9sbF9sb29rdXAoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpCit7CisJX19sZTMyIGxlX3JjOworCWludCByID0gc21fbGxfbG9va3VwX2JpdG1hcChsbCwgYiwgcmVzdWx0KTsKKworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmICgqcmVzdWx0ICE9IDMpCisJCXJldHVybiByOworCisJciA9IGRtX2J0cmVlX2xvb2t1cCgmbGwtPnJlZl9jb3VudF9pbmZvLCBsbC0+cmVmX2NvdW50X3Jvb3QsICZiLCAmbGVfcmMpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwkqcmVzdWx0ID0gbGUzMl90b19jcHUobGVfcmMpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBzbV9sbF9maW5kX2ZyZWVfYmxvY2soc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGJlZ2luLAorCQkJICBkbV9ibG9ja190IGVuZCwgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCXN0cnVjdCBkaXNrX2luZGV4X2VudHJ5IGllX2Rpc2s7CisJZG1fYmxvY2tfdCBpLCBpbmRleF9iZWdpbiA9IGJlZ2luOworCWRtX2Jsb2NrX3QgaW5kZXhfZW5kID0gZG1fc2VjdG9yX2Rpdl91cChlbmQsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisKKwkvKgorCSAqIEZJWE1FOiBVc2Ugc2hpZnRzCisJICovCisJYmVnaW4gPSBkb19kaXYoaW5kZXhfYmVnaW4sIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJZW5kID0gZG9fZGl2KGVuZCwgbGwtPmVudHJpZXNfcGVyX2Jsb2NrKTsKKworCWZvciAoaSA9IGluZGV4X2JlZ2luOyBpIDwgaW5kZXhfZW5kOyBpKyssIGJlZ2luID0gMCkgeworCQlzdHJ1Y3QgZG1fYmxvY2sgKmJsazsKKwkJdW5zaWduZWQgcG9zaXRpb247CisJCXVpbnQzMl90IGJpdF9lbmQ7CisKKwkJciA9IGxsLT5sb2FkX2llKGxsLCBpLCAmaWVfZGlzayk7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCisJCWlmIChsZTMyX3RvX2NwdShpZV9kaXNrLm5yX2ZyZWUpID09IDApCisJCQljb250aW51ZTsKKworCQlyID0gZG1fdG1fcmVhZF9sb2NrKGxsLT50bSwgbGU2NF90b19jcHUoaWVfZGlzay5ibG9ja25yKSwKKwkJCQkgICAgJmRtX3NtX2JpdG1hcF92YWxpZGF0b3IsICZibGspOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKworCQliaXRfZW5kID0gKGkgPT0gaW5kZXhfZW5kIC0gMSkgPyAgZW5kIDogbGwtPmVudHJpZXNfcGVyX2Jsb2NrOworCisJCXIgPSBzbV9maW5kX2ZyZWUoZG1fYml0bWFwX2RhdGEoYmxrKSwKKwkJCQkgbWF4X3QodW5zaWduZWQsIGJlZ2luLCBsZTMyX3RvX2NwdShpZV9kaXNrLm5vbmVfZnJlZV9iZWZvcmUpKSwKKwkJCQkgYml0X2VuZCwgJnBvc2l0aW9uKTsKKwkJaWYgKHIgPT0gLUVOT1NQQykgeworCQkJLyoKKwkJCSAqIFRoaXMgbWlnaHQgaGFwcGVuIGJlY2F1c2Ugd2Ugc3RhcnRlZCBzZWFyY2hpbmcKKwkJCSAqIHBhcnQgd2F5IHRocm91Z2ggdGhlIGJpdG1hcC4KKwkJCSAqLworCQkJZG1fdG1fdW5sb2NrKGxsLT50bSwgYmxrKTsKKwkJCWNvbnRpbnVlOworCisJCX0gZWxzZSBpZiAociA8IDApIHsKKwkJCWRtX3RtX3VubG9jayhsbC0+dG0sIGJsayk7CisJCQlyZXR1cm4gcjsKKwkJfQorCisJCXIgPSBkbV90bV91bmxvY2sobGwtPnRtLCBibGspOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKworCQkqcmVzdWx0ID0gaSAqIGxsLT5lbnRyaWVzX3Blcl9ibG9jayArIChkbV9ibG9ja190KSBwb3NpdGlvbjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK2ludCBzbV9sbF9pbnNlcnQoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsCisJCSB1aW50MzJfdCByZWZfY291bnQsIGVudW0gYWxsb2NhdGlvbl9ldmVudCAqZXYpCit7CisJaW50IHI7CisJdWludDMyX3QgYml0LCBvbGQ7CisJc3RydWN0IGRtX2Jsb2NrICpuYjsKKwlkbV9ibG9ja190IGluZGV4ID0gYjsKKwlzdHJ1Y3QgZGlza19pbmRleF9lbnRyeSBpZV9kaXNrOworCXZvaWQgKmJtX2xlOworCWludCBpbmM7CisKKwliaXQgPSBkb19kaXYoaW5kZXgsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJciA9IGxsLT5sb2FkX2llKGxsLCBpbmRleCwgJmllX2Rpc2spOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gZG1fdG1fc2hhZG93X2Jsb2NrKGxsLT50bSwgbGU2NF90b19jcHUoaWVfZGlzay5ibG9ja25yKSwKKwkJCSAgICAgICAmZG1fc21fYml0bWFwX3ZhbGlkYXRvciwgJm5iLCAmaW5jKTsKKwlpZiAociA8IDApIHsKKwkJRE1FUlIoImRtX3RtX3NoYWRvd19ibG9jaygpIGZhaWxlZCIpOworCQlyZXR1cm4gcjsKKwl9CisJaWVfZGlzay5ibG9ja25yID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24obmIpKTsKKworCWJtX2xlID0gZG1fYml0bWFwX2RhdGEobmIpOworCW9sZCA9IHNtX2xvb2t1cF9iaXRtYXAoYm1fbGUsIGJpdCk7CisKKwlpZiAocmVmX2NvdW50IDw9IDIpIHsKKwkJc21fc2V0X2JpdG1hcChibV9sZSwgYml0LCByZWZfY291bnQpOworCisJCXIgPSBkbV90bV91bmxvY2sobGwtPnRtLCBuYik7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCisjaWYgMAorCQkvKiBGSVhNRTogZG1fYnRyZWVfcmVtb3ZlIGRvZXNuJ3QgaGFuZGxlIHRoaXMgeWV0ICovCisJCWlmIChvbGQgPiAyKSB7CisJCQlyID0gZG1fYnRyZWVfcmVtb3ZlKCZsbC0+cmVmX2NvdW50X2luZm8sCisJCQkJCSAgICBsbC0+cmVmX2NvdW50X3Jvb3QsCisJCQkJCSAgICAmYiwgJmxsLT5yZWZfY291bnRfcm9vdCk7CisJCQlpZiAocikKKwkJCQlyZXR1cm4gcjsKKwkJfQorI2VuZGlmCisKKwl9IGVsc2UgeworCQlfX2xlMzIgbGVfcmMgPSBjcHVfdG9fbGUzMihyZWZfY291bnQpOworCisJCXNtX3NldF9iaXRtYXAoYm1fbGUsIGJpdCwgMyk7CisJCXIgPSBkbV90bV91bmxvY2sobGwtPnRtLCBuYik7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCisJCV9fZG1fYmxlc3NfZm9yX2Rpc2soJmxlX3JjKTsKKwkJciA9IGRtX2J0cmVlX2luc2VydCgmbGwtPnJlZl9jb3VudF9pbmZvLCBsbC0+cmVmX2NvdW50X3Jvb3QsCisJCQkJICAgICZiLCAmbGVfcmMsICZsbC0+cmVmX2NvdW50X3Jvb3QpOworCQlpZiAociA8IDApIHsKKwkJCURNRVJSKCJyZWYgY291bnQgaW5zZXJ0IGZhaWxlZCIpOworCQkJcmV0dXJuIHI7CisJCX0KKwl9CisKKwlpZiAocmVmX2NvdW50ICYmICFvbGQpIHsKKwkJKmV2ID0gU01fQUxMT0M7CisJCWxsLT5ucl9hbGxvY2F0ZWQrKzsKKwkJaWVfZGlzay5ucl9mcmVlID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWVfZGlzay5ucl9mcmVlKSAtIDEpOworCQlpZiAobGUzMl90b19jcHUoaWVfZGlzay5ub25lX2ZyZWVfYmVmb3JlKSA9PSBiaXQpCisJCQlpZV9kaXNrLm5vbmVfZnJlZV9iZWZvcmUgPSBjcHVfdG9fbGUzMihiaXQgKyAxKTsKKworCX0gZWxzZSBpZiAob2xkICYmICFyZWZfY291bnQpIHsKKwkJKmV2ID0gU01fRlJFRTsKKwkJbGwtPm5yX2FsbG9jYXRlZC0tOworCQlpZV9kaXNrLm5yX2ZyZWUgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShpZV9kaXNrLm5yX2ZyZWUpICsgMSk7CisJCWllX2Rpc2subm9uZV9mcmVlX2JlZm9yZSA9IGNwdV90b19sZTMyKG1pbihsZTMyX3RvX2NwdShpZV9kaXNrLm5vbmVfZnJlZV9iZWZvcmUpLCBiaXQpKTsKKwl9CisKKwlyZXR1cm4gbGwtPnNhdmVfaWUobGwsIGluZGV4LCAmaWVfZGlzayk7Cit9CisKK2ludCBzbV9sbF9pbmMoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIGVudW0gYWxsb2NhdGlvbl9ldmVudCAqZXYpCit7CisJaW50IHI7CisJdWludDMyX3QgcmM7CisKKwlyID0gc21fbGxfbG9va3VwKGxsLCBiLCAmcmMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzbV9sbF9pbnNlcnQobGwsIGIsIHJjICsgMSwgZXYpOworfQorCitpbnQgc21fbGxfZGVjKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBiLCBlbnVtIGFsbG9jYXRpb25fZXZlbnQgKmV2KQoreworCWludCByOworCXVpbnQzMl90IHJjOworCisJciA9IHNtX2xsX2xvb2t1cChsbCwgYiwgJnJjKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoIXJjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzbV9sbF9pbnNlcnQobGwsIGIsIHJjIC0gMSwgZXYpOworfQorCitpbnQgc21fbGxfY29tbWl0KHN0cnVjdCBsbF9kaXNrICpsbCkKK3sKKwlyZXR1cm4gbGwtPmNvbW1pdChsbCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgbWV0YWRhdGFfbGxfbG9hZF9pZShzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgaW5kZXgsCisJCQkgICAgICAgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKmllKQoreworCW1lbWNweShpZSwgbGwtPm1pX2xlLmluZGV4ICsgaW5kZXgsIHNpemVvZigqaWUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZXRhZGF0YV9sbF9zYXZlX2llKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBpbmRleCwKKwkJCSAgICAgICBzdHJ1Y3QgZGlza19pbmRleF9lbnRyeSAqaWUpCit7CisJbWVtY3B5KGxsLT5taV9sZS5pbmRleCArIGluZGV4LCBpZSwgc2l6ZW9mKCppZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ldGFkYXRhX2xsX2luaXRfaW5kZXgoc3RydWN0IGxsX2Rpc2sgKmxsKQoreworCWludCByOworCXN0cnVjdCBkbV9ibG9jayAqYjsKKworCXIgPSBkbV90bV9uZXdfYmxvY2sobGwtPnRtLCAmaW5kZXhfdmFsaWRhdG9yLCAmYik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCW1lbWNweShkbV9ibG9ja19kYXRhKGIpLCAmbGwtPm1pX2xlLCBzaXplb2YobGwtPm1pX2xlKSk7CisJbGwtPmJpdG1hcF9yb290ID0gZG1fYmxvY2tfbG9jYXRpb24oYik7CisKKwlyZXR1cm4gZG1fdG1fdW5sb2NrKGxsLT50bSwgYik7Cit9CisKK3N0YXRpYyBpbnQgbWV0YWRhdGFfbGxfb3BlbihzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJaW50IHI7CisJc3RydWN0IGRtX2Jsb2NrICpibG9jazsKKworCXIgPSBkbV90bV9yZWFkX2xvY2sobGwtPnRtLCBsbC0+Yml0bWFwX3Jvb3QsCisJCQkgICAgJmluZGV4X3ZhbGlkYXRvciwgJmJsb2NrKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwltZW1jcHkoJmxsLT5taV9sZSwgZG1fYmxvY2tfZGF0YShibG9jayksIHNpemVvZihsbC0+bWlfbGUpKTsKKwlyZXR1cm4gZG1fdG1fdW5sb2NrKGxsLT50bSwgYmxvY2spOworfQorCitzdGF0aWMgZG1fYmxvY2tfdCBtZXRhZGF0YV9sbF9tYXhfZW50cmllcyhzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJcmV0dXJuIE1BWF9NRVRBREFUQV9CSVRNQVBTOworfQorCitzdGF0aWMgaW50IG1ldGFkYXRhX2xsX2NvbW1pdChzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJaW50IHIsIGluYzsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmI7CisKKwlyID0gZG1fdG1fc2hhZG93X2Jsb2NrKGxsLT50bSwgbGwtPmJpdG1hcF9yb290LCAmaW5kZXhfdmFsaWRhdG9yLCAmYiwgJmluYyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJbWVtY3B5KGRtX2Jsb2NrX2RhdGEoYiksICZsbC0+bWlfbGUsIHNpemVvZihsbC0+bWlfbGUpKTsKKwlsbC0+Yml0bWFwX3Jvb3QgPSBkbV9ibG9ja19sb2NhdGlvbihiKTsKKworCXJldHVybiBkbV90bV91bmxvY2sobGwtPnRtLCBiKTsKK30KKworaW50IHNtX2xsX25ld19tZXRhZGF0YShzdHJ1Y3QgbGxfZGlzayAqbGwsIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSkKK3sKKwlpbnQgcjsKKworCXIgPSBzbV9sbF9pbml0KGxsLCB0bSk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWxsLT5sb2FkX2llID0gbWV0YWRhdGFfbGxfbG9hZF9pZTsKKwlsbC0+c2F2ZV9pZSA9IG1ldGFkYXRhX2xsX3NhdmVfaWU7CisJbGwtPmluaXRfaW5kZXggPSBtZXRhZGF0YV9sbF9pbml0X2luZGV4OworCWxsLT5vcGVuX2luZGV4ID0gbWV0YWRhdGFfbGxfb3BlbjsKKwlsbC0+bWF4X2VudHJpZXMgPSBtZXRhZGF0YV9sbF9tYXhfZW50cmllczsKKwlsbC0+Y29tbWl0ID0gbWV0YWRhdGFfbGxfY29tbWl0OworCisJbGwtPm5yX2Jsb2NrcyA9IDA7CisJbGwtPm5yX2FsbG9jYXRlZCA9IDA7CisKKwlyID0gbGwtPmluaXRfaW5kZXgobGwpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gZG1fYnRyZWVfZW1wdHkoJmxsLT5yZWZfY291bnRfaW5mbywgJmxsLT5yZWZfY291bnRfcm9vdCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXJldHVybiAwOworfQorCitpbnQgc21fbGxfb3Blbl9tZXRhZGF0YShzdHJ1Y3QgbGxfZGlzayAqbGwsIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJCXZvaWQgKnJvb3RfbGUsIHNpemVfdCBsZW4pCit7CisJaW50IHI7CisJc3RydWN0IGRpc2tfc21fcm9vdCAqc21yID0gcm9vdF9sZTsKKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGRpc2tfc21fcm9vdCkpIHsKKwkJRE1FUlIoInNtX21ldGFkYXRhIHJvb3QgdG9vIHNtYWxsIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXIgPSBzbV9sbF9pbml0KGxsLCB0bSk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWxsLT5sb2FkX2llID0gbWV0YWRhdGFfbGxfbG9hZF9pZTsKKwlsbC0+c2F2ZV9pZSA9IG1ldGFkYXRhX2xsX3NhdmVfaWU7CisJbGwtPmluaXRfaW5kZXggPSBtZXRhZGF0YV9sbF9pbml0X2luZGV4OworCWxsLT5vcGVuX2luZGV4ID0gbWV0YWRhdGFfbGxfb3BlbjsKKwlsbC0+bWF4X2VudHJpZXMgPSBtZXRhZGF0YV9sbF9tYXhfZW50cmllczsKKwlsbC0+Y29tbWl0ID0gbWV0YWRhdGFfbGxfY29tbWl0OworCisJbGwtPm5yX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KHNtci0+bnJfYmxvY2tzKTsKKwlsbC0+bnJfYWxsb2NhdGVkID0gbGU2NF90b19jcHUoc21yLT5ucl9hbGxvY2F0ZWQpOworCWxsLT5iaXRtYXBfcm9vdCA9IGxlNjRfdG9fY3B1KHNtci0+Yml0bWFwX3Jvb3QpOworCWxsLT5yZWZfY291bnRfcm9vdCA9IGxlNjRfdG9fY3B1KHNtci0+cmVmX2NvdW50X3Jvb3QpOworCisJcmV0dXJuIGxsLT5vcGVuX2luZGV4KGxsKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBkaXNrX2xsX2xvYWRfaWUoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGluZGV4LAorCQkJICAgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKmllKQoreworCXJldHVybiBkbV9idHJlZV9sb29rdXAoJmxsLT5iaXRtYXBfaW5mbywgbGwtPmJpdG1hcF9yb290LCAmaW5kZXgsIGllKTsKK30KKworc3RhdGljIGludCBkaXNrX2xsX3NhdmVfaWUoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGluZGV4LAorCQkJICAgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKmllKQoreworCV9fZG1fYmxlc3NfZm9yX2Rpc2soaWUpOworCXJldHVybiBkbV9idHJlZV9pbnNlcnQoJmxsLT5iaXRtYXBfaW5mbywgbGwtPmJpdG1hcF9yb290LAorCQkJICAgICAgICZpbmRleCwgaWUsICZsbC0+Yml0bWFwX3Jvb3QpOworfQorCitzdGF0aWMgaW50IGRpc2tfbGxfaW5pdF9pbmRleChzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJcmV0dXJuIGRtX2J0cmVlX2VtcHR5KCZsbC0+Yml0bWFwX2luZm8sICZsbC0+Yml0bWFwX3Jvb3QpOworfQorCitzdGF0aWMgaW50IGRpc2tfbGxfb3BlbihzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJLyogbm90aGluZyB0byBkbyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgZG1fYmxvY2tfdCBkaXNrX2xsX21heF9lbnRyaWVzKHN0cnVjdCBsbF9kaXNrICpsbCkKK3sKKwlyZXR1cm4gLTFVTEw7Cit9CisKK3N0YXRpYyBpbnQgZGlza19sbF9jb21taXQoc3RydWN0IGxsX2Rpc2sgKmxsKQoreworCXJldHVybiAwOworfQorCitpbnQgc21fbGxfbmV3X2Rpc2soc3RydWN0IGxsX2Rpc2sgKmxsLCBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pCit7CisJaW50IHI7CisKKwlyID0gc21fbGxfaW5pdChsbCwgdG0pOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlsbC0+bG9hZF9pZSA9IGRpc2tfbGxfbG9hZF9pZTsKKwlsbC0+c2F2ZV9pZSA9IGRpc2tfbGxfc2F2ZV9pZTsKKwlsbC0+aW5pdF9pbmRleCA9IGRpc2tfbGxfaW5pdF9pbmRleDsKKwlsbC0+b3Blbl9pbmRleCA9IGRpc2tfbGxfb3BlbjsKKwlsbC0+bWF4X2VudHJpZXMgPSBkaXNrX2xsX21heF9lbnRyaWVzOworCWxsLT5jb21taXQgPSBkaXNrX2xsX2NvbW1pdDsKKworCWxsLT5ucl9ibG9ja3MgPSAwOworCWxsLT5ucl9hbGxvY2F0ZWQgPSAwOworCisJciA9IGxsLT5pbml0X2luZGV4KGxsKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGRtX2J0cmVlX2VtcHR5KCZsbC0+cmVmX2NvdW50X2luZm8sICZsbC0+cmVmX2NvdW50X3Jvb3QpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNtX2xsX29wZW5fZGlzayhzdHJ1Y3QgbGxfZGlzayAqbGwsIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJICAgIHZvaWQgKnJvb3RfbGUsIHNpemVfdCBsZW4pCit7CisJaW50IHI7CisJc3RydWN0IGRpc2tfc21fcm9vdCAqc21yID0gcm9vdF9sZTsKKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGRpc2tfc21fcm9vdCkpIHsKKwkJRE1FUlIoInNtX21ldGFkYXRhIHJvb3QgdG9vIHNtYWxsIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXIgPSBzbV9sbF9pbml0KGxsLCB0bSk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWxsLT5sb2FkX2llID0gZGlza19sbF9sb2FkX2llOworCWxsLT5zYXZlX2llID0gZGlza19sbF9zYXZlX2llOworCWxsLT5pbml0X2luZGV4ID0gZGlza19sbF9pbml0X2luZGV4OworCWxsLT5vcGVuX2luZGV4ID0gZGlza19sbF9vcGVuOworCWxsLT5tYXhfZW50cmllcyA9IGRpc2tfbGxfbWF4X2VudHJpZXM7CisJbGwtPmNvbW1pdCA9IGRpc2tfbGxfY29tbWl0OworCisJbGwtPm5yX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KHNtci0+bnJfYmxvY2tzKTsKKwlsbC0+bnJfYWxsb2NhdGVkID0gbGU2NF90b19jcHUoc21yLT5ucl9hbGxvY2F0ZWQpOworCWxsLT5iaXRtYXBfcm9vdCA9IGxlNjRfdG9fY3B1KHNtci0+Yml0bWFwX3Jvb3QpOworCWxsLT5yZWZfY291bnRfcm9vdCA9IGxlNjRfdG9fY3B1KHNtci0+cmVmX2NvdW50X3Jvb3QpOworCisJcmV0dXJuIGxsLT5vcGVuX2luZGV4KGxsKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jb21tb24uaCBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjIyMDgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWNvbW1vbi5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIERNX1NQQUNFX01BUF9DT01NT05fSAorI2RlZmluZSBETV9TUEFDRV9NQVBfQ09NTU9OX0gKKworI2luY2x1ZGUgImRtLWJ0cmVlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBMb3cgbGV2ZWwgZGlzayBmb3JtYXQKKyAqCisgKiBCaXRtYXAgYnRyZWUKKyAqIC0tLS0tLS0tLS0tLQorICoKKyAqIEVhY2ggdmFsdWUgc3RvcmVkIGluIHRoZSBidHJlZSBpcyBhbiBpbmRleF9lbnRyeS4gIFRoaXMgcG9pbnRzIHRvIGEKKyAqIGJsb2NrIHRoYXQgaXMgdXNlZCBhcyBhIGJpdG1hcC4gIFdpdGhpbiB0aGUgYml0bWFwIGhvbGQgMiBiaXRzIHBlcgorICogZW50cnksIHdoaWNoIHJlcHJlc2VudCBVTlVTRUQgPSAwLCBSRUZfQ09VTlQgPSAxLCBSRUZfQ09VTlQgPSAyIGFuZAorICogUkVGX0NPVU5UID0gbWFueS4KKyAqCisgKiBSZWZjb3VudCBidHJlZQorICogLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBbnkgZW50cnkgdGhhdCBoYXMgYSByZWYgY291bnQgaGlnaGVyIHRoYW4gMiBnZXRzIGVudGVyZWQgaW4gdGhlIHJlZgorICogY291bnQgdHJlZS4gIFRoZSBsZWFmIHZhbHVlcyBmb3IgdGhpcyB0cmVlIGlzIHRoZSAzMi1iaXQgcmVmIGNvdW50LgorICovCisKK3N0cnVjdCBkaXNrX2luZGV4X2VudHJ5IHsKKwlfX2xlNjQgYmxvY2tucjsKKwlfX2xlMzIgbnJfZnJlZTsKKwlfX2xlMzIgbm9uZV9mcmVlX2JlZm9yZTsKK30gX19wYWNrZWQ7CisKKworI2RlZmluZSBNQVhfTUVUQURBVEFfQklUTUFQUyAyNTUKK3N0cnVjdCBkaXNrX21ldGFkYXRhX2luZGV4IHsKKwlfX2xlMzIgY3N1bTsKKwlfX2xlMzIgcGFkZGluZzsKKwlfX2xlNjQgYmxvY2tucjsKKworCXN0cnVjdCBkaXNrX2luZGV4X2VudHJ5IGluZGV4W01BWF9NRVRBREFUQV9CSVRNQVBTXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsbF9kaXNrOworCit0eXBlZGVmIGludCAoKmxvYWRfaWVfZm4pKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBpbmRleCwgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKnJlc3VsdCk7Cit0eXBlZGVmIGludCAoKnNhdmVfaWVfZm4pKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBpbmRleCwgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKmllKTsKK3R5cGVkZWYgaW50ICgqaW5pdF9pbmRleF9mbikoc3RydWN0IGxsX2Rpc2sgKmxsKTsKK3R5cGVkZWYgaW50ICgqb3Blbl9pbmRleF9mbikoc3RydWN0IGxsX2Rpc2sgKmxsKTsKK3R5cGVkZWYgZG1fYmxvY2tfdCAoKm1heF9pbmRleF9lbnRyaWVzX2ZuKShzdHJ1Y3QgbGxfZGlzayAqbGwpOwordHlwZWRlZiBpbnQgKCpjb21taXRfZm4pKHN0cnVjdCBsbF9kaXNrICpsbCk7CisKK3N0cnVjdCBsbF9kaXNrIHsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG07CisJc3RydWN0IGRtX2J0cmVlX2luZm8gYml0bWFwX2luZm87CisJc3RydWN0IGRtX2J0cmVlX2luZm8gcmVmX2NvdW50X2luZm87CisKKwl1aW50MzJfdCBibG9ja19zaXplOworCXVpbnQzMl90IGVudHJpZXNfcGVyX2Jsb2NrOworCWRtX2Jsb2NrX3QgbnJfYmxvY2tzOworCWRtX2Jsb2NrX3QgbnJfYWxsb2NhdGVkOworCisJLyoKKwkgKiBiaXRtYXBfcm9vdCBtYXkgYmUgYSBidHJlZSByb290IG9yIGEgc2ltcGxlIGluZGV4LgorCSAqLworCWRtX2Jsb2NrX3QgYml0bWFwX3Jvb3Q7CisKKwlkbV9ibG9ja190IHJlZl9jb3VudF9yb290OworCisJc3RydWN0IGRpc2tfbWV0YWRhdGFfaW5kZXggbWlfbGU7CisJbG9hZF9pZV9mbiBsb2FkX2llOworCXNhdmVfaWVfZm4gc2F2ZV9pZTsKKwlpbml0X2luZGV4X2ZuIGluaXRfaW5kZXg7CisJb3Blbl9pbmRleF9mbiBvcGVuX2luZGV4OworCW1heF9pbmRleF9lbnRyaWVzX2ZuIG1heF9lbnRyaWVzOworCWNvbW1pdF9mbiBjb21taXQ7Cit9OworCitzdHJ1Y3QgZGlza19zbV9yb290IHsKKwlfX2xlNjQgbnJfYmxvY2tzOworCV9fbGU2NCBucl9hbGxvY2F0ZWQ7CisJX19sZTY0IGJpdG1hcF9yb290OworCV9fbGU2NCByZWZfY291bnRfcm9vdDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgRU5UUklFU19QRVJfQllURSA0CisKK3N0cnVjdCBkaXNrX2JpdG1hcF9oZWFkZXIgeworCV9fbGUzMiBjc3VtOworCV9fbGUzMiBub3RfdXNlZDsKKwlfX2xlNjQgYmxvY2tucjsKK30gX19wYWNrZWQ7CisKK2VudW0gYWxsb2NhdGlvbl9ldmVudCB7CisJU01fTk9ORSwKKwlTTV9BTExPQywKKwlTTV9GUkVFLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IHNtX2xsX2V4dGVuZChzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKTsKK2ludCBzbV9sbF9sb29rdXBfYml0bWFwKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBiLCB1aW50MzJfdCAqcmVzdWx0KTsKK2ludCBzbV9sbF9sb29rdXAoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpOworaW50IHNtX2xsX2ZpbmRfZnJlZV9ibG9jayhzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgYmVnaW4sCisJCQkgIGRtX2Jsb2NrX3QgZW5kLCBkbV9ibG9ja190ICpyZXN1bHQpOworaW50IHNtX2xsX2luc2VydChzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgYiwgdWludDMyX3QgcmVmX2NvdW50LCBlbnVtIGFsbG9jYXRpb25fZXZlbnQgKmV2KTsKK2ludCBzbV9sbF9pbmMoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIGVudW0gYWxsb2NhdGlvbl9ldmVudCAqZXYpOworaW50IHNtX2xsX2RlYyhzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgYiwgZW51bSBhbGxvY2F0aW9uX2V2ZW50ICpldik7CitpbnQgc21fbGxfY29tbWl0KHN0cnVjdCBsbF9kaXNrICpsbCk7CisKK2ludCBzbV9sbF9uZXdfbWV0YWRhdGEoc3RydWN0IGxsX2Rpc2sgKmxsLCBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pOworaW50IHNtX2xsX29wZW5fbWV0YWRhdGEoc3RydWN0IGxsX2Rpc2sgKmxsLCBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCQl2b2lkICpyb290X2xlLCBzaXplX3QgbGVuKTsKKworaW50IHNtX2xsX25ld19kaXNrKHN0cnVjdCBsbF9kaXNrICpsbCwgc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtKTsKK2ludCBzbV9sbF9vcGVuX2Rpc2soc3RydWN0IGxsX2Rpc2sgKmxsLCBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCSAgICB2b2lkICpyb290X2xlLCBzaXplX3QgbGVuKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2VuZGlmCS8qIERNX1NQQUNFX01BUF9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWRpc2suYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1kaXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0NjliYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1kaXNrLmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAtY2hlY2tlci5oIgorI2luY2x1ZGUgImRtLXNwYWNlLW1hcC1jb21tb24uaCIKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAtZGlzay5oIgorI2luY2x1ZGUgImRtLXNwYWNlLW1hcC5oIgorI2luY2x1ZGUgImRtLXRyYW5zYWN0aW9uLW1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorCisjZGVmaW5lIERNX01TR19QUkVGSVggInNwYWNlIG1hcCBkaXNrIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU3BhY2UgbWFwIGludGVyZmFjZS4KKyAqLworc3RydWN0IHNtX2Rpc2sgeworCXN0cnVjdCBkbV9zcGFjZV9tYXAgc207CisKKwlzdHJ1Y3QgbGxfZGlzayBsbDsKKwlzdHJ1Y3QgbGxfZGlzayBvbGRfbGw7CisKKwlkbV9ibG9ja190IGJlZ2luOworCWRtX2Jsb2NrX3QgbnJfYWxsb2NhdGVkX3RoaXNfdHJhbnNhY3Rpb247Cit9OworCitzdGF0aWMgdm9pZCBzbV9kaXNrX2Rlc3Ryb3koc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJc3RydWN0IHNtX2Rpc2sgKnNtZCA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2Rpc2ssIHNtKTsKKworCWtmcmVlKHNtZCk7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19leHRlbmQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCXN0cnVjdCBzbV9kaXNrICpzbWQgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9kaXNrLCBzbSk7CisKKwlyZXR1cm4gc21fbGxfZXh0ZW5kKCZzbWQtPmxsLCBleHRyYV9ibG9ja3MpOworfQorCitzdGF0aWMgaW50IHNtX2Rpc2tfZ2V0X25yX2Jsb2NrcyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX2Rpc2sgKnNtZCA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2Rpc2ssIHNtKTsKKwkqY291bnQgPSBzbWQtPm9sZF9sbC5ucl9ibG9ja3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9kaXNrX2dldF9ucl9mcmVlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190ICpjb3VudCkKK3sKKwlzdHJ1Y3Qgc21fZGlzayAqc21kID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fZGlzaywgc20pOworCSpjb3VudCA9IChzbWQtPm9sZF9sbC5ucl9ibG9ja3MgLSBzbWQtPm9sZF9sbC5ucl9hbGxvY2F0ZWQpIC0gc21kLT5ucl9hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtX2Rpc2tfZ2V0X2NvdW50KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsCisJCQkgICAgIHVpbnQzMl90ICpyZXN1bHQpCit7CisJc3RydWN0IHNtX2Rpc2sgKnNtZCA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2Rpc2ssIHNtKTsKKwlyZXR1cm4gc21fbGxfbG9va3VwKCZzbWQtPmxsLCBiLCByZXN1bHQpOworfQorCitzdGF0aWMgaW50IHNtX2Rpc2tfY291bnRfaXNfbW9yZV90aGFuX29uZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLAorCQkJCQkgIGludCAqcmVzdWx0KQoreworCWludCByOworCXVpbnQzMl90IGNvdW50OworCisJciA9IHNtX2Rpc2tfZ2V0X2NvdW50KHNtLCBiLCAmY291bnQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBjb3VudCA+IDE7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19zZXRfY291bnQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYiwKKwkJCSAgICAgdWludDMyX3QgY291bnQpCit7CisJaW50IHI7CisJdWludDMyX3Qgb2xkX2NvdW50OworCWVudW0gYWxsb2NhdGlvbl9ldmVudCBldjsKKwlzdHJ1Y3Qgc21fZGlzayAqc21kID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fZGlzaywgc20pOworCisJciA9IHNtX2xsX2luc2VydCgmc21kLT5sbCwgYiwgY291bnQsICZldik7CisJaWYgKCFyKSB7CisJCXN3aXRjaCAoZXYpIHsKKwkJY2FzZSBTTV9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBTTV9BTExPQzoKKwkJCS8qCisJCQkgKiBUaGlzIF9tdXN0XyBiZSBmcmVlIGluIHRoZSBwcmlvciB0cmFuc2FjdGlvbgorCQkJICogb3RoZXJ3aXNlIHdlJ3ZlIGxvc3QgYXRvbWljaXR5LgorCQkJICovCisJCQlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uKys7CisJCQlicmVhazsKKworCQljYXNlIFNNX0ZSRUU6CisJCQkvKgorCQkJICogSXQncyBvbmx5IGZyZWUgaWYgaXQncyBhbHNvIGZyZWUgaW4gdGhlIGxhc3QKKwkJCSAqIHRyYW5zYWN0aW9uLgorCQkJICovCisJCQlyID0gc21fbGxfbG9va3VwKCZzbWQtPm9sZF9sbCwgYiwgJm9sZF9jb3VudCk7CisJCQlpZiAocikKKwkJCQlyZXR1cm4gcjsKKworCQkJaWYgKCFvbGRfY291bnQpCisJCQkJc21kLT5ucl9hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbi0tOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBzbV9kaXNrX2luY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCWludCByOworCWVudW0gYWxsb2NhdGlvbl9ldmVudCBldjsKKwlzdHJ1Y3Qgc21fZGlzayAqc21kID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fZGlzaywgc20pOworCisJciA9IHNtX2xsX2luYygmc21kLT5sbCwgYiwgJmV2KTsKKwlpZiAoIXIgJiYgKGV2ID09IFNNX0FMTE9DKSkKKwkJLyoKKwkJICogVGhpcyBfbXVzdF8gYmUgZnJlZSBpbiB0aGUgcHJpb3IgdHJhbnNhY3Rpb24KKwkJICogb3RoZXJ3aXNlIHdlJ3ZlIGxvc3QgYXRvbWljaXR5LgorCQkgKi8KKwkJc21kLT5ucl9hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbisrOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19kZWNfYmxvY2soc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYikKK3sKKwlpbnQgcjsKKwl1aW50MzJfdCBvbGRfY291bnQ7CisJZW51bSBhbGxvY2F0aW9uX2V2ZW50IGV2OworCXN0cnVjdCBzbV9kaXNrICpzbWQgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9kaXNrLCBzbSk7CisKKwlyID0gc21fbGxfZGVjKCZzbWQtPmxsLCBiLCAmZXYpOworCWlmICghciAmJiAoZXYgPT0gU01fRlJFRSkpIHsKKwkJLyoKKwkJICogSXQncyBvbmx5IGZyZWUgaWYgaXQncyBhbHNvIGZyZWUgaW4gdGhlIGxhc3QKKwkJICogdHJhbnNhY3Rpb24uCisJCSAqLworCQlyID0gc21fbGxfbG9va3VwKCZzbWQtPm9sZF9sbCwgYiwgJm9sZF9jb3VudCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJaWYgKCFvbGRfY291bnQpCisJCQlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uLS07CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19uZXdfYmxvY2soc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmIpCit7CisJaW50IHI7CisJZW51bSBhbGxvY2F0aW9uX2V2ZW50IGV2OworCXN0cnVjdCBzbV9kaXNrICpzbWQgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9kaXNrLCBzbSk7CisKKwkvKiBGSVhNRTogd2Ugc2hvdWxkIGxvb3Agcm91bmQgYSBjb3VwbGUgb2YgdGltZXMgKi8KKwlyID0gc21fbGxfZmluZF9mcmVlX2Jsb2NrKCZzbWQtPm9sZF9sbCwgc21kLT5iZWdpbiwgc21kLT5vbGRfbGwubnJfYmxvY2tzLCBiKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlzbWQtPmJlZ2luID0gKmIgKyAxOworCXIgPSBzbV9sbF9pbmMoJnNtZC0+bGwsICpiLCAmZXYpOworCWlmICghcikgeworCQlCVUdfT04oZXYgIT0gU01fQUxMT0MpOworCQlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uKys7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19jb21taXQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJaW50IHI7CisJZG1fYmxvY2tfdCBucl9mcmVlOworCXN0cnVjdCBzbV9kaXNrICpzbWQgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9kaXNrLCBzbSk7CisKKwlyID0gc21fZGlza19nZXRfbnJfZnJlZShzbSwgJm5yX2ZyZWUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBzbV9sbF9jb21taXQoJnNtZC0+bGwpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCW1lbWNweSgmc21kLT5vbGRfbGwsICZzbWQtPmxsLCBzaXplb2Yoc21kLT5vbGRfbGwpKTsKKwlzbWQtPmJlZ2luID0gMDsKKwlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uID0gMDsKKworCXIgPSBzbV9kaXNrX2dldF9ucl9mcmVlKHNtLCAmbnJfZnJlZSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19yb290X3NpemUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIHNpemVfdCAqcmVzdWx0KQoreworCSpyZXN1bHQgPSBzaXplb2Yoc3RydWN0IGRpc2tfc21fcm9vdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9kaXNrX2NvcHlfcm9vdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgdm9pZCAqd2hlcmVfbGUsIHNpemVfdCBtYXgpCit7CisJc3RydWN0IHNtX2Rpc2sgKnNtZCA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2Rpc2ssIHNtKTsKKwlzdHJ1Y3QgZGlza19zbV9yb290IHJvb3RfbGU7CisKKwlyb290X2xlLm5yX2Jsb2NrcyA9IGNwdV90b19sZTY0KHNtZC0+bGwubnJfYmxvY2tzKTsKKwlyb290X2xlLm5yX2FsbG9jYXRlZCA9IGNwdV90b19sZTY0KHNtZC0+bGwubnJfYWxsb2NhdGVkKTsKKwlyb290X2xlLmJpdG1hcF9yb290ID0gY3B1X3RvX2xlNjQoc21kLT5sbC5iaXRtYXBfcm9vdCk7CisJcm9vdF9sZS5yZWZfY291bnRfcm9vdCA9IGNwdV90b19sZTY0KHNtZC0+bGwucmVmX2NvdW50X3Jvb3QpOworCisJaWYgKG1heCA8IHNpemVvZihyb290X2xlKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwltZW1jcHkod2hlcmVfbGUsICZyb290X2xlLCBzaXplb2Yocm9vdF9sZSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgZG1fc3BhY2VfbWFwIG9wcyA9IHsKKwkuZGVzdHJveSA9IHNtX2Rpc2tfZGVzdHJveSwKKwkuZXh0ZW5kID0gc21fZGlza19leHRlbmQsCisJLmdldF9ucl9ibG9ja3MgPSBzbV9kaXNrX2dldF9ucl9ibG9ja3MsCisJLmdldF9ucl9mcmVlID0gc21fZGlza19nZXRfbnJfZnJlZSwKKwkuZ2V0X2NvdW50ID0gc21fZGlza19nZXRfY291bnQsCisJLmNvdW50X2lzX21vcmVfdGhhbl9vbmUgPSBzbV9kaXNrX2NvdW50X2lzX21vcmVfdGhhbl9vbmUsCisJLnNldF9jb3VudCA9IHNtX2Rpc2tfc2V0X2NvdW50LAorCS5pbmNfYmxvY2sgPSBzbV9kaXNrX2luY19ibG9jaywKKwkuZGVjX2Jsb2NrID0gc21fZGlza19kZWNfYmxvY2ssCisJLm5ld19ibG9jayA9IHNtX2Rpc2tfbmV3X2Jsb2NrLAorCS5jb21taXQgPSBzbV9kaXNrX2NvbW1pdCwKKwkucm9vdF9zaXplID0gc21fZGlza19yb290X3NpemUsCisJLmNvcHlfcm9vdCA9IHNtX2Rpc2tfY29weV9yb290Cit9OworCitzdGF0aWMgc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fZGlza19jcmVhdGVfcmVhbCgKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJZG1fYmxvY2tfdCBucl9ibG9ja3MpCit7CisJaW50IHI7CisJc3RydWN0IHNtX2Rpc2sgKnNtZDsKKworCXNtZCA9IGttYWxsb2Moc2l6ZW9mKCpzbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzbWQtPmJlZ2luID0gMDsKKwlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uID0gMDsKKwltZW1jcHkoJnNtZC0+c20sICZvcHMsIHNpemVvZihzbWQtPnNtKSk7CisKKwlyID0gc21fbGxfbmV3X2Rpc2soJnNtZC0+bGwsIHRtKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CisKKwlyID0gc21fbGxfZXh0ZW5kKCZzbWQtPmxsLCBucl9ibG9ja3MpOworCWlmIChyKQorCQlnb3RvIGJhZDsKKworCXIgPSBzbV9kaXNrX2NvbW1pdCgmc21kLT5zbSk7CisJaWYgKHIpCisJCWdvdG8gYmFkOworCisJcmV0dXJuICZzbWQtPnNtOworCitiYWQ6CisJa2ZyZWUoc21kKTsKKwlyZXR1cm4gRVJSX1BUUihyKTsKK30KKworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fZGlza19jcmVhdGUoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkJCSAgICAgICBkbV9ibG9ja190IG5yX2Jsb2NrcykKK3sKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSA9IGRtX3NtX2Rpc2tfY3JlYXRlX3JlYWwodG0sIG5yX2Jsb2Nrcyk7CisJcmV0dXJuIGRtX3NtX2NoZWNrZXJfY3JlYXRlX2ZyZXNoKHNtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3NtX2Rpc2tfY3JlYXRlKTsKKworc3RhdGljIHN0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX2Rpc2tfb3Blbl9yZWFsKAorCXN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwl2b2lkICpyb290X2xlLCBzaXplX3QgbGVuKQoreworCWludCByOworCXN0cnVjdCBzbV9kaXNrICpzbWQ7CisKKwlzbWQgPSBrbWFsbG9jKHNpemVvZigqc21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbWQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc21kLT5iZWdpbiA9IDA7CisJc21kLT5ucl9hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbiA9IDA7CisJbWVtY3B5KCZzbWQtPnNtLCAmb3BzLCBzaXplb2Yoc21kLT5zbSkpOworCisJciA9IHNtX2xsX29wZW5fZGlzaygmc21kLT5sbCwgdG0sIHJvb3RfbGUsIGxlbik7CisJaWYgKHIpCisJCWdvdG8gYmFkOworCisJciA9IHNtX2Rpc2tfY29tbWl0KCZzbWQtPnNtKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CisKKwlyZXR1cm4gJnNtZC0+c207CisKK2JhZDoKKwlrZnJlZShzbWQpOworCXJldHVybiBFUlJfUFRSKHIpOworfQorCitzdHJ1Y3QgZG1fc3BhY2VfbWFwICpkbV9zbV9kaXNrX29wZW4oc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkJCSAgICAgdm9pZCAqcm9vdF9sZSwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gZG1fc21fY2hlY2tlcl9jcmVhdGUoCisJCWRtX3NtX2Rpc2tfb3Blbl9yZWFsKHRtLCByb290X2xlLCBsZW4pKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3NtX2Rpc2tfb3Blbik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtZGlzay5oIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWRpc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDdhMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWRpc2suaApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ETV9TUEFDRV9NQVBfRElTS19ICisjZGVmaW5lIF9MSU5VWF9ETV9TUEFDRV9NQVBfRElTS19ICisKKyNpbmNsdWRlICJkbS1ibG9jay1tYW5hZ2VyLmgiCisKK3N0cnVjdCBkbV9zcGFjZV9tYXA7CitzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlcjsKKworLyoKKyAqIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byB1c2UgdHdvLXBoYXNlIGNvbnN0cnVjdGlvbiBkdWUgdG8gdGhlIGN5Y2xlCisgKiBiZXR3ZWVuIHRoZSB0bSBhbmQgc20uCisgKi8KK3N0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX2Rpc2tfY3JlYXRlKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJCQkgICAgICAgZG1fYmxvY2tfdCBucl9ibG9ja3MpOworCitzdHJ1Y3QgZG1fc3BhY2VfbWFwICpkbV9zbV9kaXNrX29wZW4oc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkJCSAgICAgdm9pZCAqcm9vdCwgc2l6ZV90IGxlbik7CisKKyNlbmRpZiAvKiBfTElOVVhfRE1fU1BBQ0VfTUFQX0RJU0tfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLW1ldGFkYXRhLmMgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtbWV0YWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODlhZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLW1ldGFkYXRhLmMKQEAgLTAsMCArMSw1OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAuaCIKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAtY29tbW9uLmgiCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLW1ldGFkYXRhLmgiCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJzcGFjZSBtYXAgbWV0YWRhdGEiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTcGFjZSBtYXAgaW50ZXJmYWNlLgorICoKKyAqIFRoZSBsb3cgbGV2ZWwgZGlzayBmb3JtYXQgaXMgd3JpdHRlbiB1c2luZyB0aGUgc3RhbmRhcmQgYnRyZWUgYW5kCisgKiB0cmFuc2FjdGlvbiBtYW5hZ2VyLiAgVGhpcyBtZWFucyB0aGF0IHBlcmZvcm1pbmcgZGlzayBvcGVyYXRpb25zIG1heQorICogY2F1c2UgdXMgdG8gcmVjdXJzZSBpbnRvIHRoZSBzcGFjZSBtYXAgaW4gb3JkZXIgdG8gYWxsb2NhdGUgbmV3IGJsb2Nrcy4KKyAqIEZvciB0aGlzIHJlYXNvbiB3ZSBoYXZlIGEgcG9vbCBvZiBwcmUtYWxsb2NhdGVkIGJsb2NrcyBsYXJnZSBlbm91Z2ggdG8KKyAqIHNlcnZpY2UgYW55IG1ldGFkYXRhX2xsX2Rpc2sgb3BlcmF0aW9uLgorICovCisKKy8qCisgKiBGSVhNRTogd2Ugc2hvdWxkIGNhbGN1bGF0ZSB0aGlzIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBkZXZpY2UuCisgKiBPbmx5IHRoZSBtZXRhZGF0YSBzcGFjZSBtYXAgbmVlZHMgdGhpcyBmdW5jdGlvbmFsaXR5LgorICovCisjZGVmaW5lIE1BWF9SRUNVUlNJVkVfQUxMT0NBVElPTlMgMTAyNAorCitlbnVtIGJsb2NrX29wX3R5cGUgeworCUJPUF9JTkMsCisJQk9QX0RFQworfTsKKworc3RydWN0IGJsb2NrX29wIHsKKwllbnVtIGJsb2NrX29wX3R5cGUgdHlwZTsKKwlkbV9ibG9ja190IGJsb2NrOworfTsKKworc3RydWN0IHNtX21ldGFkYXRhIHsKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwIHNtOworCisJc3RydWN0IGxsX2Rpc2sgbGw7CisJc3RydWN0IGxsX2Rpc2sgb2xkX2xsOworCisJZG1fYmxvY2tfdCBiZWdpbjsKKworCXVuc2lnbmVkIHJlY3Vyc2lvbl9jb3VudDsKKwl1bnNpZ25lZCBhbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbjsKKwl1bnNpZ25lZCBucl91bmNvbW1pdHRlZDsKKwlzdHJ1Y3QgYmxvY2tfb3AgdW5jb21taXR0ZWRbTUFYX1JFQ1VSU0lWRV9BTExPQ0FUSU9OU107Cit9OworCitzdGF0aWMgaW50IGFkZF9ib3Aoc3RydWN0IHNtX21ldGFkYXRhICpzbW0sIGVudW0gYmxvY2tfb3BfdHlwZSB0eXBlLCBkbV9ibG9ja190IGIpCit7CisJc3RydWN0IGJsb2NrX29wICpvcDsKKworCWlmIChzbW0tPm5yX3VuY29tbWl0dGVkID09IE1BWF9SRUNVUlNJVkVfQUxMT0NBVElPTlMpIHsKKwkJRE1FUlIoInRvbyBtYW55IHJlY3Vyc2l2ZSBhbGxvY2F0aW9ucyIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvcCA9IHNtbS0+dW5jb21taXR0ZWQgKyBzbW0tPm5yX3VuY29tbWl0dGVkKys7CisJb3AtPnR5cGUgPSB0eXBlOworCW9wLT5ibG9jayA9IGI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21taXRfYm9wKHN0cnVjdCBzbV9tZXRhZGF0YSAqc21tLCBzdHJ1Y3QgYmxvY2tfb3AgKm9wKQoreworCWludCByID0gMDsKKwllbnVtIGFsbG9jYXRpb25fZXZlbnQgZXY7CisKKwlzd2l0Y2ggKG9wLT50eXBlKSB7CisJY2FzZSBCT1BfSU5DOgorCQlyID0gc21fbGxfaW5jKCZzbW0tPmxsLCBvcC0+YmxvY2ssICZldik7CisJCWJyZWFrOworCisJY2FzZSBCT1BfREVDOgorCQlyID0gc21fbGxfZGVjKCZzbW0tPmxsLCBvcC0+YmxvY2ssICZldik7CisJCWJyZWFrOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBpbihzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSkKK3sKKwlzbW0tPnJlY3Vyc2lvbl9jb3VudCsrOworfQorCitzdGF0aWMgaW50IG91dChzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSkKK3sKKwlpbnQgciA9IDA7CisKKwkvKgorCSAqIElmIHdlJ3JlIG5vdCByZWN1cnNpbmcgdGhlbiB2ZXJ5IGJhZCB0aGluZ3MgYXJlIGhhcHBlbmluZy4KKwkgKi8KKwlpZiAoIXNtbS0+cmVjdXJzaW9uX2NvdW50KSB7CisJCURNRVJSKCJsb3N0IHRyYWNrIG9mIHJlY3Vyc2lvbiBkZXB0aCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoc21tLT5yZWN1cnNpb25fY291bnQgPT0gMSAmJiBzbW0tPm5yX3VuY29tbWl0dGVkKSB7CisJCXdoaWxlIChzbW0tPm5yX3VuY29tbWl0dGVkICYmICFyKSB7CisJCQlzbW0tPm5yX3VuY29tbWl0dGVkLS07CisJCQlyID0gY29tbWl0X2JvcChzbW0sIHNtbS0+dW5jb21taXR0ZWQgKworCQkJCSAgICAgICBzbW0tPm5yX3VuY29tbWl0dGVkKTsKKwkJCWlmIChyKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJc21tLT5yZWN1cnNpb25fY291bnQtLTsKKworCXJldHVybiByOworfQorCisvKgorICogV2hlbiB1c2luZyB0aGUgb3V0KCkgZnVuY3Rpb24gYWJvdmUsIHdlIG9mdGVuIHdhbnQgdG8gY29tYmluZSBhbiBlcnJvcgorICogY29kZSBmb3IgdGhlIG9wZXJhdGlvbiBydW4gaW4gdGhlIHJlY3Vyc2l2ZSBjb250ZXh0IHdpdGggdGhhdCBmcm9tCisgKiBvdXQoKS4KKyAqLworc3RhdGljIGludCBjb21iaW5lX2Vycm9ycyhpbnQgcjEsIGludCByMikKK3sKKwlyZXR1cm4gcjEgPyByMSA6IHIyOworfQorCitzdGF0aWMgaW50IHJlY3Vyc2luZyhzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSkKK3sKKwlyZXR1cm4gc21tLT5yZWN1cnNpb25fY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHNtX21ldGFkYXRhX2Rlc3Ryb3koc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJa2ZyZWUoc21tKTsKK30KKworc3RhdGljIGludCBzbV9tZXRhZGF0YV9leHRlbmQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCURNRVJSKCJkb2Vzbid0IHN1cHBvcnQgZXh0ZW5kIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfZ2V0X25yX2Jsb2NrcyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJKmNvdW50ID0gc21tLT5sbC5ucl9ibG9ja3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9tZXRhZGF0YV9nZXRfbnJfZnJlZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJKmNvdW50ID0gc21tLT5vbGRfbGwubnJfYmxvY2tzIC0gc21tLT5vbGRfbGwubnJfYWxsb2NhdGVkIC0KKwkJIHNtbS0+YWxsb2NhdGVkX3RoaXNfdHJhbnNhY3Rpb247CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9tZXRhZGF0YV9nZXRfY291bnQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYiwKKwkJCQkgdWludDMyX3QgKnJlc3VsdCkKK3sKKwlpbnQgciwgaTsKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisJdW5zaWduZWQgYWRqdXN0bWVudCA9IDA7CisKKwkvKgorCSAqIFdlIG1heSBoYXZlIHNvbWUgdW5jb21taXR0ZWQgYWRqdXN0bWVudHMgdG8gYWRkLiAgVGhpcyBsaXN0CisJICogc2hvdWxkIGFsd2F5cyBiZSByZWFsbHkgc2hvcnQuCisJICovCisJZm9yIChpID0gMDsgaSA8IHNtbS0+bnJfdW5jb21taXR0ZWQ7IGkrKykgeworCQlzdHJ1Y3QgYmxvY2tfb3AgKm9wID0gc21tLT51bmNvbW1pdHRlZCArIGk7CisKKwkJaWYgKG9wLT5ibG9jayAhPSBiKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChvcC0+dHlwZSkgeworCQljYXNlIEJPUF9JTkM6CisJCQlhZGp1c3RtZW50Kys7CisJCQlicmVhazsKKworCQljYXNlIEJPUF9ERUM6CisJCQlhZGp1c3RtZW50LS07CisJCQlicmVhazsKKwkJfQorCX0KKworCXIgPSBzbV9sbF9sb29rdXAoJnNtbS0+bGwsIGIsIHJlc3VsdCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJKnJlc3VsdCArPSBhZGp1c3RtZW50OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfY291bnRfaXNfbW9yZV90aGFuX29uZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwKKwkJCQkJICAgICAgZG1fYmxvY2tfdCBiLCBpbnQgKnJlc3VsdCkKK3sKKwlpbnQgciwgaSwgYWRqdXN0bWVudCA9IDA7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCXVpbnQzMl90IHJjOworCisJLyoKKwkgKiBXZSBtYXkgaGF2ZSBzb21lIHVuY29tbWl0dGVkIGFkanVzdG1lbnRzIHRvIGFkZC4gIFRoaXMgbGlzdAorCSAqIHNob3VsZCBhbHdheXMgYmUgcmVhbGx5IHNob3J0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBzbW0tPm5yX3VuY29tbWl0dGVkOyBpKyspIHsKKwkJc3RydWN0IGJsb2NrX29wICpvcCA9IHNtbS0+dW5jb21taXR0ZWQgKyBpOworCisJCWlmIChvcC0+YmxvY2sgIT0gYikKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAob3AtPnR5cGUpIHsKKwkJY2FzZSBCT1BfSU5DOgorCQkJYWRqdXN0bWVudCsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBCT1BfREVDOgorCQkJYWRqdXN0bWVudC0tOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYWRqdXN0bWVudCA+IDEpIHsKKwkJKnJlc3VsdCA9IDE7CisJCXJldHVybiAwOworCX0KKworCXIgPSBzbV9sbF9sb29rdXBfYml0bWFwKCZzbW0tPmxsLCBiLCAmcmMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChyYyA9PSAzKQorCQkvKgorCQkgKiBXZSBlcnIgb24gdGhlIHNpZGUgb2YgY2F1dGlvbiwgYW5kIGFsd2F5cyByZXR1cm4gdHJ1ZS4KKwkJICovCisJCSpyZXN1bHQgPSAxOworCWVsc2UKKwkJKnJlc3VsdCA9IHJjICsgYWRqdXN0bWVudCA+IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9tZXRhZGF0YV9zZXRfY291bnQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYiwKKwkJCQkgdWludDMyX3QgY291bnQpCit7CisJaW50IHIsIHIyOworCWVudW0gYWxsb2NhdGlvbl9ldmVudCBldjsKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisKKwlpZiAoc21tLT5yZWN1cnNpb25fY291bnQpIHsKKwkJRE1FUlIoImNhbm5vdCByZWN1cnNlIHNldF9jb3VudCgpIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWluKHNtbSk7CisJciA9IHNtX2xsX2luc2VydCgmc21tLT5sbCwgYiwgY291bnQsICZldik7CisJcjIgPSBvdXQoc21tKTsKKworCXJldHVybiBjb21iaW5lX2Vycm9ycyhyLCByMik7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfaW5jX2Jsb2NrKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIpCit7CisJaW50IHIsIHIyID0gMDsKKwllbnVtIGFsbG9jYXRpb25fZXZlbnQgZXY7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJaWYgKHJlY3Vyc2luZyhzbW0pKQorCQlyID0gYWRkX2JvcChzbW0sIEJPUF9JTkMsIGIpOworCWVsc2UgeworCQlpbihzbW0pOworCQlyID0gc21fbGxfaW5jKCZzbW0tPmxsLCBiLCAmZXYpOworCQlyMiA9IG91dChzbW0pOworCX0KKworCXJldHVybiBjb21iaW5lX2Vycm9ycyhyLCByMik7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfZGVjX2Jsb2NrKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIpCit7CisJaW50IHIsIHIyID0gMDsKKwllbnVtIGFsbG9jYXRpb25fZXZlbnQgZXY7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJaWYgKHJlY3Vyc2luZyhzbW0pKQorCQlyID0gYWRkX2JvcChzbW0sIEJPUF9ERUMsIGIpOworCWVsc2UgeworCQlpbihzbW0pOworCQlyID0gc21fbGxfZGVjKCZzbW0tPmxsLCBiLCAmZXYpOworCQlyMiA9IG91dChzbW0pOworCX0KKworCXJldHVybiBjb21iaW5lX2Vycm9ycyhyLCByMik7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfbmV3X2Jsb2NrXyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqYikKK3sKKwlpbnQgciwgcjIgPSAwOworCWVudW0gYWxsb2NhdGlvbl9ldmVudCBldjsKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisKKwlyID0gc21fbGxfZmluZF9mcmVlX2Jsb2NrKCZzbW0tPm9sZF9sbCwgc21tLT5iZWdpbiwgc21tLT5vbGRfbGwubnJfYmxvY2tzLCBiKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlzbW0tPmJlZ2luID0gKmIgKyAxOworCisJaWYgKHJlY3Vyc2luZyhzbW0pKQorCQlyID0gYWRkX2JvcChzbW0sIEJPUF9JTkMsICpiKTsKKwllbHNlIHsKKwkJaW4oc21tKTsKKwkJciA9IHNtX2xsX2luYygmc21tLT5sbCwgKmIsICZldik7CisJCXIyID0gb3V0KHNtbSk7CisJfQorCisJaWYgKCFyKQorCQlzbW0tPmFsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uKys7CisKKwlyZXR1cm4gY29tYmluZV9lcnJvcnMociwgcjIpOworfQorCitzdGF0aWMgaW50IHNtX21ldGFkYXRhX25ld19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqYikKK3sKKwlpbnQgciA9IHNtX21ldGFkYXRhX25ld19ibG9ja18oc20sIGIpOworCWlmIChyKQorCQlETUVSUigib3V0IG9mIG1ldGFkYXRhIHNwYWNlIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfY29tbWl0KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCWludCByOworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXIgPSBzbV9sbF9jb21taXQoJnNtbS0+bGwpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCW1lbWNweSgmc21tLT5vbGRfbGwsICZzbW0tPmxsLCBzaXplb2Yoc21tLT5vbGRfbGwpKTsKKwlzbW0tPmJlZ2luID0gMDsKKwlzbW0tPmFsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtX21ldGFkYXRhX3Jvb3Rfc2l6ZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgc2l6ZV90ICpyZXN1bHQpCit7CisJKnJlc3VsdCA9IHNpemVvZihzdHJ1Y3QgZGlza19zbV9yb290KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtX21ldGFkYXRhX2NvcHlfcm9vdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgdm9pZCAqd2hlcmVfbGUsIHNpemVfdCBtYXgpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCXN0cnVjdCBkaXNrX3NtX3Jvb3Qgcm9vdF9sZTsKKworCXJvb3RfbGUubnJfYmxvY2tzID0gY3B1X3RvX2xlNjQoc21tLT5sbC5ucl9ibG9ja3MpOworCXJvb3RfbGUubnJfYWxsb2NhdGVkID0gY3B1X3RvX2xlNjQoc21tLT5sbC5ucl9hbGxvY2F0ZWQpOworCXJvb3RfbGUuYml0bWFwX3Jvb3QgPSBjcHVfdG9fbGU2NChzbW0tPmxsLmJpdG1hcF9yb290KTsKKwlyb290X2xlLnJlZl9jb3VudF9yb290ID0gY3B1X3RvX2xlNjQoc21tLT5sbC5yZWZfY291bnRfcm9vdCk7CisKKwlpZiAobWF4IDwgc2l6ZW9mKHJvb3RfbGUpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCW1lbWNweSh3aGVyZV9sZSwgJnJvb3RfbGUsIHNpemVvZihyb290X2xlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9zcGFjZV9tYXAgb3BzID0geworCS5kZXN0cm95ID0gc21fbWV0YWRhdGFfZGVzdHJveSwKKwkuZXh0ZW5kID0gc21fbWV0YWRhdGFfZXh0ZW5kLAorCS5nZXRfbnJfYmxvY2tzID0gc21fbWV0YWRhdGFfZ2V0X25yX2Jsb2NrcywKKwkuZ2V0X25yX2ZyZWUgPSBzbV9tZXRhZGF0YV9nZXRfbnJfZnJlZSwKKwkuZ2V0X2NvdW50ID0gc21fbWV0YWRhdGFfZ2V0X2NvdW50LAorCS5jb3VudF9pc19tb3JlX3RoYW5fb25lID0gc21fbWV0YWRhdGFfY291bnRfaXNfbW9yZV90aGFuX29uZSwKKwkuc2V0X2NvdW50ID0gc21fbWV0YWRhdGFfc2V0X2NvdW50LAorCS5pbmNfYmxvY2sgPSBzbV9tZXRhZGF0YV9pbmNfYmxvY2ssCisJLmRlY19ibG9jayA9IHNtX21ldGFkYXRhX2RlY19ibG9jaywKKwkubmV3X2Jsb2NrID0gc21fbWV0YWRhdGFfbmV3X2Jsb2NrLAorCS5jb21taXQgPSBzbV9tZXRhZGF0YV9jb21taXQsCisJLnJvb3Rfc2l6ZSA9IHNtX21ldGFkYXRhX3Jvb3Rfc2l6ZSwKKwkuY29weV9yb290ID0gc21fbWV0YWRhdGFfY29weV9yb290Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogV2hlbiBhIG5ldyBzcGFjZSBtYXAgaXMgY3JlYXRlZCB0aGF0IG1hbmFnZXMgaXRzIG93biBzcGFjZS4gIFdlIHVzZQorICogdGhpcyB0aW55IGJvb3RzdHJhcCBhbGxvY2F0b3IuCisgKi8KK3N0YXRpYyB2b2lkIHNtX2Jvb3RzdHJhcF9kZXN0cm95KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworfQorCitzdGF0aWMgaW50IHNtX2Jvb3RzdHJhcF9leHRlbmQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCURNRVJSKCJib29zdHJhcCBkb2Vzbid0IHN1cHBvcnQgZXh0ZW5kIik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBzbV9ib290c3RyYXBfZ2V0X25yX2Jsb2NrcyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJcmV0dXJuIHNtbS0+bGwubnJfYmxvY2tzOworfQorCitzdGF0aWMgaW50IHNtX2Jvb3RzdHJhcF9nZXRfbnJfZnJlZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJKmNvdW50ID0gc21tLT5sbC5ucl9ibG9ja3MgLSBzbW0tPmJlZ2luOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2dldF9jb3VudChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLAorCQkJCSAgdWludDMyX3QgKnJlc3VsdCkKK3sKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisKKwlyZXR1cm4gYiA8IHNtbS0+YmVnaW4gPyAxIDogMDsKK30KKworc3RhdGljIGludCBzbV9ib290c3RyYXBfY291bnRfaXNfbW9yZV90aGFuX29uZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwKKwkJCQkJICAgICAgIGRtX2Jsb2NrX3QgYiwgaW50ICpyZXN1bHQpCit7CisJKnJlc3VsdCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9ib290c3RyYXBfc2V0X2NvdW50KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsCisJCQkJICB1aW50MzJfdCBjb3VudCkKK3sKKwlETUVSUigiYm9vc3RyYXAgZG9lc24ndCBzdXBwb3J0IHNldF9jb3VudCIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX25ld19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqYikKK3sKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisKKwkvKgorCSAqIFdlIGtub3cgdGhlIGVudGlyZSBkZXZpY2UgaXMgdW51c2VkLgorCSAqLworCWlmIChzbW0tPmJlZ2luID09IHNtbS0+bGwubnJfYmxvY2tzKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCSpiID0gc21tLT5iZWdpbisrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2luY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXJldHVybiBhZGRfYm9wKHNtbSwgQk9QX0lOQywgYik7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2RlY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXJldHVybiBhZGRfYm9wKHNtbSwgQk9QX0RFQywgYik7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2NvbW1pdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9ib290c3RyYXBfcm9vdF9zaXplKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBzaXplX3QgKnJlc3VsdCkKK3sKKwlETUVSUigiYm9vc3RyYXAgZG9lc24ndCBzdXBwb3J0IHJvb3Rfc2l6ZSIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2NvcHlfcm9vdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgdm9pZCAqd2hlcmUsCisJCQkJICBzaXplX3QgbWF4KQoreworCURNRVJSKCJib29zdHJhcCBkb2Vzbid0IHN1cHBvcnQgY29weV9yb290Iik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9zcGFjZV9tYXAgYm9vdHN0cmFwX29wcyA9IHsKKwkuZGVzdHJveSA9IHNtX2Jvb3RzdHJhcF9kZXN0cm95LAorCS5leHRlbmQgPSBzbV9ib290c3RyYXBfZXh0ZW5kLAorCS5nZXRfbnJfYmxvY2tzID0gc21fYm9vdHN0cmFwX2dldF9ucl9ibG9ja3MsCisJLmdldF9ucl9mcmVlID0gc21fYm9vdHN0cmFwX2dldF9ucl9mcmVlLAorCS5nZXRfY291bnQgPSBzbV9ib290c3RyYXBfZ2V0X2NvdW50LAorCS5jb3VudF9pc19tb3JlX3RoYW5fb25lID0gc21fYm9vdHN0cmFwX2NvdW50X2lzX21vcmVfdGhhbl9vbmUsCisJLnNldF9jb3VudCA9IHNtX2Jvb3RzdHJhcF9zZXRfY291bnQsCisJLmluY19ibG9jayA9IHNtX2Jvb3RzdHJhcF9pbmNfYmxvY2ssCisJLmRlY19ibG9jayA9IHNtX2Jvb3RzdHJhcF9kZWNfYmxvY2ssCisJLm5ld19ibG9jayA9IHNtX2Jvb3RzdHJhcF9uZXdfYmxvY2ssCisJLmNvbW1pdCA9IHNtX2Jvb3RzdHJhcF9jb21taXQsCisJLnJvb3Rfc2l6ZSA9IHNtX2Jvb3RzdHJhcF9yb290X3NpemUsCisJLmNvcHlfcm9vdCA9IHNtX2Jvb3RzdHJhcF9jb3B5X3Jvb3QKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX21ldGFkYXRhX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbTsKKworCXNtbSA9IGttYWxsb2Moc2l6ZW9mKCpzbW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtbSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1jcHkoJnNtbS0+c20sICZvcHMsIHNpemVvZihzbW0tPnNtKSk7CisKKwlyZXR1cm4gJnNtbS0+c207Cit9CisKK2ludCBkbV9zbV9tZXRhZGF0YV9jcmVhdGUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sCisJCQkgIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJCSAgZG1fYmxvY2tfdCBucl9ibG9ja3MsCisJCQkgIGRtX2Jsb2NrX3Qgc3VwZXJibG9jaykKK3sKKwlpbnQgcjsKKwlkbV9ibG9ja190IGk7CisJZW51bSBhbGxvY2F0aW9uX2V2ZW50IGV2OworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXNtbS0+YmVnaW4gPSBzdXBlcmJsb2NrICsgMTsKKwlzbW0tPnJlY3Vyc2lvbl9jb3VudCA9IDA7CisJc21tLT5hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbiA9IDA7CisJc21tLT5ucl91bmNvbW1pdHRlZCA9IDA7CisKKwltZW1jcHkoJnNtbS0+c20sICZib290c3RyYXBfb3BzLCBzaXplb2Yoc21tLT5zbSkpOworCisJciA9IHNtX2xsX25ld19tZXRhZGF0YSgmc21tLT5sbCwgdG0pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBzbV9sbF9leHRlbmQoJnNtbS0+bGwsIG5yX2Jsb2Nrcyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJbWVtY3B5KCZzbW0tPnNtLCAmb3BzLCBzaXplb2Yoc21tLT5zbSkpOworCisJLyoKKwkgKiBOb3cgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG5ld2x5IGNyZWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdGhlCisJICogYWxsb2NhdGVkIGJsb2NrcyB0aGF0IHRoZXkgd2VyZSBidWlsdCBmcm9tLgorCSAqLworCWZvciAoaSA9IHN1cGVyYmxvY2s7ICFyICYmIGkgPCBzbW0tPmJlZ2luOyBpKyspCisJCXIgPSBzbV9sbF9pbmMoJnNtbS0+bGwsIGksICZldik7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gc21fbWV0YWRhdGFfY29tbWl0KHNtKTsKK30KKworaW50IGRtX3NtX21ldGFkYXRhX29wZW4oc3RydWN0IGRtX3NwYWNlX21hcCAqc20sCisJCQlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCQl2b2lkICpyb290X2xlLCBzaXplX3QgbGVuKQoreworCWludCByOworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXIgPSBzbV9sbF9vcGVuX21ldGFkYXRhKCZzbW0tPmxsLCB0bSwgcm9vdF9sZSwgbGVuKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlzbW0tPmJlZ2luID0gMDsKKwlzbW0tPnJlY3Vyc2lvbl9jb3VudCA9IDA7CisJc21tLT5hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbiA9IDA7CisJc21tLT5ucl91bmNvbW1pdHRlZCA9IDA7CisKKwltZW1jcHkoJnNtbS0+b2xkX2xsLCAmc21tLT5sbCwgc2l6ZW9mKHNtbS0+b2xkX2xsKSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtbWV0YWRhdGEuaCBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1tZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YmJhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtbWV0YWRhdGEuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIERNX1NQQUNFX01BUF9NRVRBREFUQV9ICisjZGVmaW5lIERNX1NQQUNFX01BUF9NRVRBREFUQV9ICisKKyNpbmNsdWRlICJkbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmgiCisKKy8qCisgKiBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gdXNlIHR3by1waGFzZSBjb25zdHJ1Y3Rpb24gZHVlIHRvIHRoZSBjeWNsZQorICogYmV0d2VlbiB0aGUgdG0gYW5kIHNtLgorICovCitzdHJ1Y3QgZG1fc3BhY2VfbWFwICpkbV9zbV9tZXRhZGF0YV9pbml0KHZvaWQpOworCisvKgorICogQ3JlYXRlIGEgZnJlc2ggc3BhY2UgbWFwLgorICovCitpbnQgZG1fc21fbWV0YWRhdGFfY3JlYXRlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLAorCQkJICBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCQkgIGRtX2Jsb2NrX3QgbnJfYmxvY2tzLAorCQkJICBkbV9ibG9ja190IHN1cGVyYmxvY2spOworCisvKgorICogT3BlbiBmcm9tIGEgcHJldmlvdXNseS1yZWNvcmRlZCByb290LgorICovCitpbnQgZG1fc21fbWV0YWRhdGFfb3BlbihzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwKKwkJCXN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJCXZvaWQgKnJvb3RfbGUsIHNpemVfdCBsZW4pOworCisjZW5kaWYJLyogRE1fU1BBQ0VfTUFQX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC5oIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiZmM2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ETV9TUEFDRV9NQVBfSAorI2RlZmluZSBfTElOVVhfRE1fU1BBQ0VfTUFQX0gKKworI2luY2x1ZGUgImRtLWJsb2NrLW1hbmFnZXIuaCIKKworLyoKKyAqIHN0cnVjdCBkbV9zcGFjZV9tYXAga2VlcHMgYSByZWNvcmQgb2YgaG93IG1hbnkgdGltZXMgZWFjaCBibG9jayBpbiBhIGRldmljZQorICogaXMgcmVmZXJlbmNlZC4gIEl0IG5lZWRzIHRvIGJlIGZpeGVkIG9uIGRpc2sgYXMgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCisgKi8KK3N0cnVjdCBkbV9zcGFjZV9tYXAgeworCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSk7CisKKwkvKgorCSAqIFlvdSBtdXN0IGNvbW1pdCBiZWZvcmUgYWxsb2NhdGluZyB0aGUgbmV3bHkgYWRkZWQgc3BhY2UuCisJICovCisJaW50ICgqZXh0ZW5kKShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBleHRyYV9ibG9ja3MpOworCisJLyoKKwkgKiBFeHRlbnNpb25zIGRvIG5vdCBhcHBlYXIgaW4gdGhpcyBjb3VudCB1bnRpbCBhZnRlciBjb21taXQgaGFzCisJICogYmVlbiBjYWxsZWQuCisJICovCisJaW50ICgqZ2V0X25yX2Jsb2Nrcykoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmNvdW50KTsKKworCS8qCisJICogU3BhY2UgbWFwcyBtdXN0IG5ldmVyIGFsbG9jYXRlIGEgYmxvY2sgZnJvbSB0aGUgcHJldmlvdXMKKwkgKiB0cmFuc2FjdGlvbiwgaW4gY2FzZSB3ZSBuZWVkIHRvIHJvbGxiYWNrLiAgVGhpcyBjb21wbGljYXRlcyB0aGUKKwkgKiBzZW1hbnRpY3Mgb2YgZ2V0X25yX2ZyZWUoKSwgaXQgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJsb2NrcworCSAqIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiBfbm93Xy4gIEZvciBpbnN0YW5jZSB5b3UgbWF5CisJICogaGF2ZSBibG9ja3Mgd2l0aCBhIHplcm8gcmVmZXJlbmNlIGNvdW50IHRoYXQgd2lsbCBub3QgYmUKKwkgKiBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gdW50aWwgYWZ0ZXIgdGhlIG5leHQgY29tbWl0LgorCSAqLworCWludCAoKmdldF9ucl9mcmVlKShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpOworCisJaW50ICgqZ2V0X2NvdW50KShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLCB1aW50MzJfdCAqcmVzdWx0KTsKKwlpbnQgKCpjb3VudF9pc19tb3JlX3RoYW5fb25lKShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLAorCQkJCSAgICAgIGludCAqcmVzdWx0KTsKKwlpbnQgKCpzZXRfY291bnQpKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsIHVpbnQzMl90IGNvdW50KTsKKworCWludCAoKmNvbW1pdCkoc3RydWN0IGRtX3NwYWNlX21hcCAqc20pOworCisJaW50ICgqaW5jX2Jsb2NrKShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKTsKKwlpbnQgKCpkZWNfYmxvY2spKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIpOworCisJLyoKKwkgKiBuZXdfYmxvY2sgd2lsbCBpbmNyZW1lbnQgdGhlIHJldHVybmVkIGJsb2NrLgorCSAqLworCWludCAoKm5ld19ibG9jaykoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmIpOworCisJLyoKKwkgKiBUaGUgcm9vdCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBmaXggdGhlIHNwYWNlIG1hcC4KKwkgKiBHZW5lcmFsbHkgdGhpcyBpbmZvIGlzIHNtYWxsLCBzbyBzcXVpcnJlbCBpdCBhd2F5IGluIGEgZGlzayBibG9jaworCSAqIGFsb25nIHdpdGggb3RoZXIgaW5mby4KKwkgKi8KKwlpbnQgKCpyb290X3NpemUpKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBzaXplX3QgKnJlc3VsdCk7CisJaW50ICgqY29weV9yb290KShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgdm9pZCAqY29weV90b19oZXJlX2xlLCBzaXplX3QgbGVuKTsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbV9zbV9kZXN0cm95KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCXNtLT5kZXN0cm95KHNtKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1fc21fZXh0ZW5kKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGV4dHJhX2Jsb2NrcykKK3sKKwlyZXR1cm4gc20tPmV4dGVuZChzbSwgZXh0cmFfYmxvY2tzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1fc21fZ2V0X25yX2Jsb2NrcyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJcmV0dXJuIHNtLT5nZXRfbnJfYmxvY2tzKHNtLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtX3NtX2dldF9ucl9mcmVlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190ICpjb3VudCkKK3sKKwlyZXR1cm4gc20tPmdldF9ucl9mcmVlKHNtLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtX3NtX2dldF9jb3VudChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLAorCQkJCSAgdWludDMyX3QgKnJlc3VsdCkKK3sKKwlyZXR1cm4gc20tPmdldF9jb3VudChzbSwgYiwgcmVzdWx0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1fc21fY291bnRfaXNfbW9yZV90aGFuX29uZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwKKwkJCQkJICAgICAgIGRtX2Jsb2NrX3QgYiwgaW50ICpyZXN1bHQpCit7CisJcmV0dXJuIHNtLT5jb3VudF9pc19tb3JlX3RoYW5fb25lKHNtLCBiLCByZXN1bHQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbV9zbV9zZXRfY291bnQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYiwKKwkJCQkgIHVpbnQzMl90IGNvdW50KQoreworCXJldHVybiBzbS0+c2V0X2NvdW50KHNtLCBiLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtX3NtX2NvbW1pdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSkKK3sKKwlyZXR1cm4gc20tPmNvbW1pdChzbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtX3NtX2luY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCXJldHVybiBzbS0+aW5jX2Jsb2NrKHNtLCBiKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1fc21fZGVjX2Jsb2NrKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIpCit7CisJcmV0dXJuIHNtLT5kZWNfYmxvY2soc20sIGIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbV9zbV9uZXdfYmxvY2soc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmIpCit7CisJcmV0dXJuIHNtLT5uZXdfYmxvY2soc20sIGIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbV9zbV9yb290X3NpemUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIHNpemVfdCAqcmVzdWx0KQoreworCXJldHVybiBzbS0+cm9vdF9zaXplKHNtLCByZXN1bHQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbV9zbV9jb3B5X3Jvb3Qoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIHZvaWQgKmNvcHlfdG9faGVyZV9sZSwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gc20tPmNvcHlfcm9vdChzbSwgY29weV90b19oZXJlX2xlLCBsZW4pOworfQorCisjZW5kaWYJLyogX0xJTlVYX0RNX1NQQUNFX01BUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmMgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4ZDM4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXRyYW5zYWN0aW9uLW1hbmFnZXIuYwpAQCAtMCwwICsxLDQwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKyNpbmNsdWRlICJkbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmgiCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLmgiCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLWNoZWNrZXIuaCIKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAtZGlzay5oIgorI2luY2x1ZGUgImRtLXNwYWNlLW1hcC1tZXRhZGF0YS5oIgorI2luY2x1ZGUgImRtLXBlcnNpc3RlbnQtZGF0YS1pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJ0cmFuc2FjdGlvbiBtYW5hZ2VyIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3Qgc2hhZG93X2luZm8geworCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OworCWRtX2Jsb2NrX3Qgd2hlcmU7Cit9OworCisvKgorICogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBzY2FsZWQgd2l0aCB0aGUgc2l6ZSBvZiB0cmFuc2FjdGlvbi4KKyAqLworI2RlZmluZSBIQVNIX1NJWkUgMjU2CisjZGVmaW5lIEhBU0hfTUFTSyAoSEFTSF9TSVpFIC0gMSkKKworc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgeworCWludCBpc19jbG9uZTsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqcmVhbDsKKworCXN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibTsKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbTsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCBidWNrZXRzW0hBU0hfU0laRV07Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGlzX3NoYWRvdyhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYikKK3sKKwlpbnQgciA9IDA7CisJdW5zaWduZWQgYnVja2V0ID0gZG1faGFzaF9ibG9jayhiLCBIQVNIX01BU0spOworCXN0cnVjdCBzaGFkb3dfaW5mbyAqc2k7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisKKwlzcGluX2xvY2soJnRtLT5sb2NrKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShzaSwgbiwgdG0tPmJ1Y2tldHMgKyBidWNrZXQsIGhsaXN0KQorCQlpZiAoc2ktPndoZXJlID09IGIpIHsKKwkJCXIgPSAxOworCQkJYnJlYWs7CisJCX0KKwlzcGluX3VubG9jaygmdG0tPmxvY2spOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBUaGlzIGNhbiBzaWxlbnRseSBmYWlsIGlmIHRoZXJlJ3Mgbm8gbWVtb3J5LiAgV2UncmUgb2sgd2l0aCB0aGlzIHNpbmNlCisgKiBjcmVhdGluZyByZWR1bmRhbnQgc2hhZG93cyBjYXVzZXMgbm8gaGFybS4KKyAqLworc3RhdGljIHZvaWQgaW5zZXJ0X3NoYWRvdyhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYikKK3sKKwl1bnNpZ25lZCBidWNrZXQ7CisJc3RydWN0IHNoYWRvd19pbmZvICpzaTsKKworCXNpID0ga21hbGxvYyhzaXplb2YoKnNpKSwgR0ZQX05PSU8pOworCWlmIChzaSkgeworCQlzaS0+d2hlcmUgPSBiOworCQlidWNrZXQgPSBkbV9oYXNoX2Jsb2NrKGIsIEhBU0hfTUFTSyk7CisJCXNwaW5fbG9jaygmdG0tPmxvY2spOworCQlobGlzdF9hZGRfaGVhZCgmc2ktPmhsaXN0LCB0bS0+YnVja2V0cyArIGJ1Y2tldCk7CisJCXNwaW5fdW5sb2NrKCZ0bS0+bG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3aXBlX3NoYWRvd190YWJsZShzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pCit7CisJc3RydWN0IHNoYWRvd19pbmZvICpzaTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwgKnRtcDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0OworCWludCBpOworCisJc3Bpbl9sb2NrKCZ0bS0+bG9jayk7CisJZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgaSsrKSB7CisJCWJ1Y2tldCA9IHRtLT5idWNrZXRzICsgaTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzaSwgbiwgdG1wLCBidWNrZXQsIGhsaXN0KQorCQkJa2ZyZWUoc2kpOworCisJCUlOSVRfSExJU1RfSEVBRChidWNrZXQpOworCX0KKworCXNwaW5fdW5sb2NrKCZ0bS0+bG9jayk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqZG1fdG1fY3JlYXRlKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJCQkJCSAgIHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCWludCBpOworCXN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bTsKKworCXRtID0ga21hbGxvYyhzaXplb2YoKnRtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0bSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwl0bS0+aXNfY2xvbmUgPSAwOworCXRtLT5yZWFsID0gTlVMTDsKKwl0bS0+Ym0gPSBibTsKKwl0bS0+c20gPSBzbTsKKworCXNwaW5fbG9ja19pbml0KCZ0bS0+bG9jayk7CisJZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQodG0tPmJ1Y2tldHMgKyBpKTsKKworCXJldHVybiB0bTsKK30KKworc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKmRtX3RtX2NyZWF0ZV9ub25fYmxvY2tpbmdfY2xvbmUoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnJlYWwpCit7CisJc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtOworCisJdG0gPSBrbWFsbG9jKHNpemVvZigqdG0pLCBHRlBfS0VSTkVMKTsKKwlpZiAodG0pIHsKKwkJdG0tPmlzX2Nsb25lID0gMTsKKwkJdG0tPnJlYWwgPSByZWFsOworCX0KKworCXJldHVybiB0bTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3RtX2NyZWF0ZV9ub25fYmxvY2tpbmdfY2xvbmUpOworCit2b2lkIGRtX3RtX2Rlc3Ryb3koc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtKQoreworCWtmcmVlKHRtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3RtX2Rlc3Ryb3kpOworCitpbnQgZG1fdG1fcHJlX2NvbW1pdChzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pCit7CisJaW50IHI7CisKKwlpZiAodG0tPmlzX2Nsb25lKQorCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCisJciA9IGRtX3NtX2NvbW1pdCh0bS0+c20pOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3RtX3ByZV9jb21taXQpOworCitpbnQgZG1fdG1fY29tbWl0KHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgc3RydWN0IGRtX2Jsb2NrICpyb290KQoreworCWlmICh0bS0+aXNfY2xvbmUpCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwl3aXBlX3NoYWRvd190YWJsZSh0bSk7CisKKwlyZXR1cm4gZG1fYm1fZmx1c2hfYW5kX3VubG9jayh0bS0+Ym0sIHJvb3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fdG1fY29tbWl0KTsKKworaW50IGRtX3RtX25ld19ibG9jayhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0KQoreworCWludCByOworCWRtX2Jsb2NrX3QgbmV3X2Jsb2NrOworCisJaWYgKHRtLT5pc19jbG9uZSkKKwkJcmV0dXJuIC1FV09VTERCTE9DSzsKKworCXIgPSBkbV9zbV9uZXdfYmxvY2sodG0tPnNtLCAmbmV3X2Jsb2NrKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGRtX2JtX3dyaXRlX2xvY2tfemVybyh0bS0+Ym0sIG5ld19ibG9jaywgdiwgcmVzdWx0KTsKKwlpZiAociA8IDApIHsKKwkJZG1fc21fZGVjX2Jsb2NrKHRtLT5zbSwgbmV3X2Jsb2NrKTsKKwkJcmV0dXJuIHI7CisJfQorCisJLyoKKwkgKiBOZXcgYmxvY2tzIGNvdW50IGFzIHNoYWRvd3MgaW4gdGhhdCB0aGV5IGRvbid0IG5lZWQgdG8gYmUKKwkgKiBzaGFkb3dlZCBhZ2Fpbi4KKwkgKi8KKwlpbnNlcnRfc2hhZG93KHRtLCBuZXdfYmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19zaGFkb3dfYmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBkbV9ibG9ja190IG9yaWcsCisJCQkgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCQkgIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCkKK3sKKwlpbnQgcjsKKwlkbV9ibG9ja190IG5ldzsKKwlzdHJ1Y3QgZG1fYmxvY2sgKm9yaWdfYmxvY2s7CisKKwlyID0gZG1fc21fbmV3X2Jsb2NrKHRtLT5zbSwgJm5ldyk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXIgPSBkbV9zbV9kZWNfYmxvY2sodG0tPnNtLCBvcmlnKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGRtX2JtX3JlYWRfbG9jayh0bS0+Ym0sIG9yaWcsIHYsICZvcmlnX2Jsb2NrKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGRtX2JtX3VubG9ja19tb3ZlKG9yaWdfYmxvY2ssIG5ldyk7CisJaWYgKHIgPCAwKSB7CisJCWRtX2JtX3VubG9jayhvcmlnX2Jsb2NrKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIGRtX2JtX3dyaXRlX2xvY2sodG0tPmJtLCBuZXcsIHYsIHJlc3VsdCk7Cit9CisKK2ludCBkbV90bV9zaGFkb3dfYmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBkbV9ibG9ja190IG9yaWcsCisJCSAgICAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LCBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQsCisJCSAgICAgICBpbnQgKmluY19jaGlsZHJlbikKK3sKKwlpbnQgcjsKKworCWlmICh0bS0+aXNfY2xvbmUpCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwlyID0gZG1fc21fY291bnRfaXNfbW9yZV90aGFuX29uZSh0bS0+c20sIG9yaWcsIGluY19jaGlsZHJlbik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWlmIChpc19zaGFkb3codG0sIG9yaWcpICYmICEqaW5jX2NoaWxkcmVuKQorCQlyZXR1cm4gZG1fYm1fd3JpdGVfbG9jayh0bS0+Ym0sIG9yaWcsIHYsIHJlc3VsdCk7CisKKwlyID0gX19zaGFkb3dfYmxvY2sodG0sIG9yaWcsIHYsIHJlc3VsdCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKwlpbnNlcnRfc2hhZG93KHRtLCBkbV9ibG9ja19sb2NhdGlvbigqcmVzdWx0KSk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX3RtX3JlYWRfbG9jayhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYiwKKwkJICAgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2sgKipibGspCit7CisJaWYgKHRtLT5pc19jbG9uZSkKKwkJcmV0dXJuIGRtX2JtX3JlYWRfdHJ5X2xvY2sodG0tPnJlYWwtPmJtLCBiLCB2LCBibGspOworCisJcmV0dXJuIGRtX2JtX3JlYWRfbG9jayh0bS0+Ym0sIGIsIHYsIGJsayk7Cit9CisKK2ludCBkbV90bV91bmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBzdHJ1Y3QgZG1fYmxvY2sgKmIpCit7CisJcmV0dXJuIGRtX2JtX3VubG9jayhiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3RtX3VubG9jayk7CisKK3ZvaWQgZG1fdG1faW5jKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgZG1fYmxvY2tfdCBiKQoreworCS8qCisJICogVGhlIG5vbi1ibG9ja2luZyBjbG9uZSBkb2Vzbid0IHN1cHBvcnQgdGhpcy4KKwkgKi8KKwlCVUdfT04odG0tPmlzX2Nsb25lKTsKKworCWRtX3NtX2luY19ibG9jayh0bS0+c20sIGIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fdG1faW5jKTsKKwordm9pZCBkbV90bV9kZWMoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBkbV9ibG9ja190IGIpCit7CisJLyoKKwkgKiBUaGUgbm9uLWJsb2NraW5nIGNsb25lIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLgorCSAqLworCUJVR19PTih0bS0+aXNfY2xvbmUpOworCisJZG1fc21fZGVjX2Jsb2NrKHRtLT5zbSwgYik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV90bV9kZWMpOworCitpbnQgZG1fdG1fcmVmKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgZG1fYmxvY2tfdCBiLAorCSAgICAgIHVpbnQzMl90ICpyZXN1bHQpCit7CisJaWYgKHRtLT5pc19jbG9uZSkKKwkJcmV0dXJuIC1FV09VTERCTE9DSzsKKworCXJldHVybiBkbV9zbV9nZXRfY291bnQodG0tPnNtLCBiLCByZXN1bHQpOworfQorCitzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqZG1fdG1fZ2V0X2JtKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSkKK3sKKwlyZXR1cm4gdG0tPmJtOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGRtX3RtX2NyZWF0ZV9pbnRlcm5hbChzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sCisJCQkJIGRtX2Jsb2NrX3Qgc2JfbG9jYXRpb24sCisJCQkJIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnNiX3ZhbGlkYXRvciwKKwkJCQkgc2l6ZV90IHJvb3Rfb2Zmc2V0LCBzaXplX3Qgcm9vdF9tYXhfbGVuLAorCQkJCSBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqKnRtLAorCQkJCSBzdHJ1Y3QgZG1fc3BhY2VfbWFwICoqc20sCisJCQkJIHN0cnVjdCBkbV9ibG9jayAqKnNibG9jaywKKwkJCQkgaW50IGNyZWF0ZSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwICppbm5lcjsKKworCWlubmVyID0gZG1fc21fbWV0YWRhdGFfaW5pdCgpOworCWlmIChJU19FUlIoaW5uZXIpKQorCQlyZXR1cm4gUFRSX0VSUihpbm5lcik7CisKKwkqdG0gPSBkbV90bV9jcmVhdGUoYm0sIGlubmVyKTsKKwlpZiAoSVNfRVJSKCp0bSkpIHsKKwkJZG1fc21fZGVzdHJveShpbm5lcik7CisJCXJldHVybiBQVFJfRVJSKCp0bSk7CisJfQorCisJaWYgKGNyZWF0ZSkgeworCQlyID0gZG1fYm1fd3JpdGVfbG9ja196ZXJvKGRtX3RtX2dldF9ibSgqdG0pLCBzYl9sb2NhdGlvbiwKKwkJCQkJICBzYl92YWxpZGF0b3IsIHNibG9jayk7CisJCWlmIChyIDwgMCkgeworCQkJRE1FUlIoImNvdWxkbid0IGxvY2sgc3VwZXJibG9jayIpOworCQkJZ290byBiYWQxOworCQl9CisKKwkJciA9IGRtX3NtX21ldGFkYXRhX2NyZWF0ZShpbm5lciwgKnRtLCBkbV9ibV9ucl9ibG9ja3MoYm0pLAorCQkJCQkgIHNiX2xvY2F0aW9uKTsKKwkJaWYgKHIpIHsKKwkJCURNRVJSKCJjb3VsZG4ndCBjcmVhdGUgbWV0YWRhdGEgc3BhY2UgbWFwIik7CisJCQlnb3RvIGJhZDI7CisJCX0KKworCQkqc20gPSBkbV9zbV9jaGVja2VyX2NyZWF0ZShpbm5lcik7CisJCWlmICghKnNtKQorCQkJZ290byBiYWQyOworCisJfSBlbHNlIHsKKwkJciA9IGRtX2JtX3dyaXRlX2xvY2soZG1fdG1fZ2V0X2JtKCp0bSksIHNiX2xvY2F0aW9uLAorCQkJCSAgICAgc2JfdmFsaWRhdG9yLCBzYmxvY2spOworCQlpZiAociA8IDApIHsKKwkJCURNRVJSKCJjb3VsZG4ndCBsb2NrIHN1cGVyYmxvY2siKTsKKwkJCWdvdG8gYmFkMTsKKwkJfQorCisJCXIgPSBkbV9zbV9tZXRhZGF0YV9vcGVuKGlubmVyLCAqdG0sCisJCQkJCWRtX2Jsb2NrX2RhdGEoKnNibG9jaykgKyByb290X29mZnNldCwKKwkJCQkJcm9vdF9tYXhfbGVuKTsKKwkJaWYgKHIpIHsKKwkJCURNRVJSKCJjb3VsZG4ndCBvcGVuIG1ldGFkYXRhIHNwYWNlIG1hcCIpOworCQkJZ290byBiYWQyOworCQl9CisKKwkJKnNtID0gZG1fc21fY2hlY2tlcl9jcmVhdGUoaW5uZXIpOworCQlpZiAoISpzbSkKKwkJCWdvdG8gYmFkMjsKKwl9CisKKwlyZXR1cm4gMDsKKworYmFkMjoKKwlkbV90bV91bmxvY2soKnRtLCAqc2Jsb2NrKTsKK2JhZDE6CisJZG1fdG1fZGVzdHJveSgqdG0pOworCWRtX3NtX2Rlc3Ryb3koaW5uZXIpOworCXJldHVybiByOworfQorCitpbnQgZG1fdG1fY3JlYXRlX3dpdGhfc20oc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLCBkbV9ibG9ja190IHNiX2xvY2F0aW9uLAorCQkJIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnNiX3ZhbGlkYXRvciwKKwkJCSBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqKnRtLAorCQkJIHN0cnVjdCBkbV9zcGFjZV9tYXAgKipzbSwgc3RydWN0IGRtX2Jsb2NrICoqc2Jsb2NrKQoreworCXJldHVybiBkbV90bV9jcmVhdGVfaW50ZXJuYWwoYm0sIHNiX2xvY2F0aW9uLCBzYl92YWxpZGF0b3IsCisJCQkJICAgICAwLCAwLCB0bSwgc20sIHNibG9jaywgMSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV90bV9jcmVhdGVfd2l0aF9zbSk7CisKK2ludCBkbV90bV9vcGVuX3dpdGhfc20oc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLCBkbV9ibG9ja190IHNiX2xvY2F0aW9uLAorCQkgICAgICAgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqc2JfdmFsaWRhdG9yLAorCQkgICAgICAgc2l6ZV90IHJvb3Rfb2Zmc2V0LCBzaXplX3Qgcm9vdF9tYXhfbGVuLAorCQkgICAgICAgc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKip0bSwKKwkJICAgICAgIHN0cnVjdCBkbV9zcGFjZV9tYXAgKipzbSwgc3RydWN0IGRtX2Jsb2NrICoqc2Jsb2NrKQoreworCXJldHVybiBkbV90bV9jcmVhdGVfaW50ZXJuYWwoYm0sIHNiX2xvY2F0aW9uLCBzYl92YWxpZGF0b3IsIHJvb3Rfb2Zmc2V0LAorCQkJCSAgICAgcm9vdF9tYXhfbGVuLCB0bSwgc20sIHNibG9jaywgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV90bV9vcGVuX3dpdGhfc20pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tdHJhbnNhY3Rpb24tbWFuYWdlci5oIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tdHJhbnNhY3Rpb24tbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTc4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0RNX1RSQU5TQUNUSU9OX01BTkFHRVJfSAorI2RlZmluZSBfTElOVVhfRE1fVFJBTlNBQ1RJT05fTUFOQUdFUl9ICisKKyNpbmNsdWRlICJkbS1ibG9jay1tYW5hZ2VyLmgiCisKK3N0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyOworc3RydWN0IGRtX3NwYWNlX21hcDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFRoaXMgbWFuYWdlcyB0aGUgc2NvcGUgb2YgYSB0cmFuc2FjdGlvbi4gIEl0IGFsc28gZW5mb3JjZXMgaW1tdXRhYmlsaXR5CisgKiBvZiB0aGUgb24tZGlzayBkYXRhIHN0cnVjdHVyZXMgYnkgbGltaXRpbmcgYWNjZXNzIHRvIHdyaXRlYWJsZSBibG9ja3MuCisgKgorICogQ2xpZW50cyBzaG91bGQgbm90IGZpZGRsZSB3aXRoIHRoZSBibG9jayBtYW5hZ2VyIGRpcmVjdGx5LgorICovCisKK3ZvaWQgZG1fdG1fZGVzdHJveShzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pOworCisvKgorICogVGhlIG5vbi1ibG9ja2luZyB2ZXJzaW9uIG9mIGEgdHJhbnNhY3Rpb24gbWFuYWdlciBpcyBpbnRlbmRlZCBmb3IgdXNlIGluCisgKiBmYXN0IHBhdGggY29kZSB0aGF0IG5lZWRzIHRvIGRvIGxvb2t1cHMgZS5nLiBhIGRtIG1hcHBpbmcgZnVuY3Rpb24uCisgKiBZb3UgY3JlYXRlIHRoZSBub24tYmxvY2tpbmcgdmFyaWFudCBmcm9tIGEgbm9ybWFsIHRtLiAgVGhlIGludGVyZmFjZSBpcworICogdGhlIHNhbWUsIGV4Y2VwdCB0aGF0IG1vc3QgZnVuY3Rpb25zIHdpbGwganVzdCByZXR1cm4gLUVXT1VMREJMT0NLLgorICogTWV0aG9kcyB0aGF0IHJldHVybiB2b2lkIHlldCBtYXkgYmxvY2sgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYSBjbG9uZQorICogdml6LiBkbV90bV9pbmMsIGRtX3RtX2RlYy4gIENhbGwgZG1fdG1fZGVzdHJveSgpIGFzIHlvdSB3b3VsZCB3aXRoIGEgbm9ybWFsCisgKiB0bSB3aGVuIHlvdSd2ZSBmaW5pc2hlZCB3aXRoIGl0LiAgWW91IG1heSBub3QgZGVzdHJveSB0aGUgb3JpZ2luYWwgcHJpb3IKKyAqIHRvIGNsb25lcy4KKyAqLworc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKmRtX3RtX2NyZWF0ZV9ub25fYmxvY2tpbmdfY2xvbmUoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnJlYWwpOworCisvKgorICogV2UgdXNlIGEgMi1waGFzZSBjb21taXQgaGVyZS4KKyAqCisgKiBpKSBJbiB0aGUgZmlyc3QgcGhhc2UgdGhlIGJsb2NrIG1hbmFnZXIgaXMgdG9sZCB0byBzdGFydCBmbHVzaGluZywgYW5kCisgKiB0aGUgY2hhbmdlcyB0byB0aGUgc3BhY2UgbWFwIGFyZSB3cml0dGVuIHRvIGRpc2suICBZb3Ugc2hvdWxkIGludGVycm9nYXRlCisgKiB5b3VyIHBhcnRpY3VsYXIgc3BhY2UgbWFwIHRvIGdldCBkZXRhaWwgb2YgaXRzIHJvb3Qgbm9kZSBldGMuIHRvIGJlCisgKiBpbmNsdWRlZCBpbiB5b3VyIHN1cGVyYmxvY2suCisgKgorICogaWkpIEByb290IHdpbGwgYmUgY29tbWl0dGVkIGxhc3QuICBZb3Ugc2hvdWxkbid0IHVzZSBtb3JlIHRoYW4gdGhlCisgKiBmaXJzdCA1MTIgYnl0ZXMgb2YgQHJvb3QgaWYgeW91IHdpc2ggdGhlIHRyYW5zYWN0aW9uIHRvIHN1cnZpdmUgYSBwb3dlcgorICogZmFpbHVyZS4gIFlvdSAqbXVzdCogaGF2ZSBhIHdyaXRlIGxvY2sgaGVsZCBvbiBAcm9vdCBmb3IgYm90aCBzdGFnZSAoaSkKKyAqIGFuZCAoaWkpLiAgVGhlIGNvbW1pdCB3aWxsIGRyb3AgdGhlIHdyaXRlIGxvY2suCisgKi8KK2ludCBkbV90bV9wcmVfY29tbWl0KHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSk7CitpbnQgZG1fdG1fY29tbWl0KHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgc3RydWN0IGRtX2Jsb2NrICpyb290KTsKKworLyoKKyAqIFRoZXNlIG1ldGhvZHMgYXJlIHRoZSBvbmx5IHdheSB0byBnZXQgaG9sZCBvZiBhIHdyaXRlYWJsZSBibG9jay4KKyAqLworCisvKgorICogZG1fdG1fbmV3X2Jsb2NrKCkgaXMgcHJldHR5IHNlbGYtZXhwbGFuYXRvcnkuICBNYWtlIHN1cmUgeW91IGRvIGFjdHVhbGx5CisgKiB3cml0ZSB0byB0aGUgd2hvbGUgb2YgQGRhdGEgYmVmb3JlIHlvdSB1bmxvY2ssIG90aGVyd2lzZSB5b3UgY291bGQgZ2V0CisgKiBhIGRhdGEgbGVhay4gIChUaGUgb3RoZXIgb3B0aW9uIGlzIGZvciB0bV9uZXdfYmxvY2soKSB0byB6ZXJvIG5ldyBibG9ja3MKKyAqIGJlZm9yZSBoYW5kaW5nIHRoZW0gb3V0LCB3aGljaCB3aWxsIGJlIHJlZHVuZGFudCBpbiBtb3N0LCBpZiBub3QgYWxsLAorICogY2FzZXMpLgorICogWmVyb2VzIHRoZSBuZXcgYmxvY2sgYW5kIHJldHVybnMgd2l0aCB3cml0ZSBsb2NrIGhlbGQuCisgKi8KK2ludCBkbV90bV9uZXdfYmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkgICAgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJICAgIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCk7CisKKy8qCisgKiBkbV90bV9zaGFkb3dfYmxvY2soKSBhbGxvY2F0ZXMgYSBuZXcgYmxvY2sgYW5kIGNvcGllcyB0aGUgZGF0YSBmcm9tIEBvcmlnCisgKiB0byBpdC4gIEl0IHRoZW4gZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIG9yaWdpbmFsIGJsb2NrLiAgVXNlCisgKiB0aGlzIHRvIHVwZGF0ZSB0aGUgY29udGVudHMgb2YgYSBibG9jayBpbiBhIGRhdGEgc3RydWN0dXJlLCBkb24ndAorICogY29uZnVzZSB0aGlzIHdpdGggYSBjbG9uZSAtIHlvdSBzaG91bGRuJ3QgYWNjZXNzIHRoZSBvcmlnIGJsb2NrIGFmdGVyCisgKiB0aGlzIG9wZXJhdGlvbi4gIEJlY2F1c2UgdGhlIHRtIGtub3dzIHRoZSBzY29wZSBvZiB0aGUgdHJhbnNhY3Rpb24gaXQKKyAqIGNhbiBvcHRpbWlzZSByZXF1ZXN0cyBmb3IgYSBzaGFkb3cgb2YgYSBzaGFkb3cgdG8gYSBuby1vcC4gIERvbid0IGZvcmdldAorICogdG8gdW5sb2NrIHdoZW4geW91J3ZlIGZpbmlzaGVkIHdpdGggdGhlIHNoYWRvdy4KKyAqCisgKiBUaGUgQGluY19jaGlsZHJlbiBmbGFnIGlzIHVzZWQgdG8gdGVsbCB0aGUgY2FsbGVyIHdoZXRoZXIgaXQgbmVlZHMgdG8KKyAqIGFkanVzdCByZWZlcmVuY2UgY291bnRzIGZvciBjaGlsZHJlbi4gIChEYXRhIGluIHRoZSBibG9jayBtYXkgcmVmZXIgdG8KKyAqIG90aGVyIGJsb2Nrcy4pCisgKgorICogU2hhZG93aW5nIGltcGxpY2l0bHkgZHJvcHMgYSByZWZlcmVuY2Ugb24gQG9yaWcgc28geW91IG11c3Qgbm90IGhhdmUKKyAqIGl0IGxvY2tlZCB3aGVuIHlvdSBjYWxsIHRoaXMuCisgKi8KK2ludCBkbV90bV9zaGFkb3dfYmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBkbV9ibG9ja190IG9yaWcsCisJCSAgICAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgICAgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0LCBpbnQgKmluY19jaGlsZHJlbik7CisKKy8qCisgKiBSZWFkIGFjY2Vzcy4gIFlvdSBjYW4gbG9jayBhbnkgYmxvY2sgeW91IHdhbnQuICBJZiB0aGVyZSdzIGEgd3JpdGUgbG9jaworICogb24gaXQgb3V0c3RhbmRpbmcgdGhlbiBpdCdsbCBibG9jay4KKyAqLworaW50IGRtX3RtX3JlYWRfbG9jayhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYiwKKwkJICAgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpOworCitpbnQgZG1fdG1fdW5sb2NrKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgc3RydWN0IGRtX2Jsb2NrICpiKTsKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgYWx0ZXJpbmcgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIGJsb2NrIGRpcmVjdGx5LgorICovCit2b2lkIGRtX3RtX2luYyhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYik7CisKK3ZvaWQgZG1fdG1fZGVjKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgZG1fYmxvY2tfdCBiKTsKKworaW50IGRtX3RtX3JlZihzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYiwKKwkgICAgICB1aW50MzJfdCAqcmVzdWx0KTsKKworc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmRtX3RtX2dldF9ibShzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pOworCisvKgorICogQSBsaXR0bGUgdXRpbGl0eSB0aGF0IHRpZXMgdGhlIGtub3QgYnkgcHJvZHVjaW5nIGEgdHJhbnNhY3Rpb24gbWFuYWdlcgorICogdGhhdCBoYXMgYSBzcGFjZSBtYXAgbWFuYWdlZCBieSB0aGUgdHJhbnNhY3Rpb24gbWFuYWdlci4uLgorICoKKyAqIFJldHVybnMgYSB0bSB0aGF0IGhhcyBhbiBvcGVuIHRyYW5zYWN0aW9uIHRvIHdyaXRlIHRoZSBuZXcgZGlzayBzbS4KKyAqIENhbGxlciBzaG91bGQgc3RvcmUgdGhlIG5ldyBzbSByb290IGFuZCBjb21taXQuCisgKi8KK2ludCBkbV90bV9jcmVhdGVfd2l0aF9zbShzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3Qgc2JfbG9jYXRpb24sCisJCQkgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqc2JfdmFsaWRhdG9yLAorCQkJIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICoqdG0sCisJCQkgc3RydWN0IGRtX3NwYWNlX21hcCAqKnNtLCBzdHJ1Y3QgZG1fYmxvY2sgKipzYmxvY2spOworCitpbnQgZG1fdG1fb3Blbl93aXRoX3NtKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwgZG1fYmxvY2tfdCBzYl9sb2NhdGlvbiwKKwkJICAgICAgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnNiX3ZhbGlkYXRvciwKKwkJICAgICAgIHNpemVfdCByb290X29mZnNldCwgc2l6ZV90IHJvb3RfbWF4X2xlbiwKKwkJICAgICAgIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICoqdG0sCisJCSAgICAgICBzdHJ1Y3QgZG1fc3BhY2VfbWFwICoqc20sIHN0cnVjdCBkbV9ibG9jayAqKnNibG9jayk7CisKKyNlbmRpZgkvKiBfTElOVVhfRE1fVFJBTlNBQ1RJT05fTUFOQUdFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQwLmMgYi9kcml2ZXJzL21kL3JhaWQwLmMKaW5kZXggMGViMDhhNC4uNzI5NGJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDAuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAibWQuaCIKICNpbmNsdWRlICJyYWlkMC5oIgpAQCAtNDY4LDcgKzQ2OSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHJhaWQwX21ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCByYWlkMF9tYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqYmlvKQogewogCXVuc2lnbmVkIGludCBjaHVua19zZWN0czsKIAlzZWN0b3JfdCBzZWN0b3Jfb2Zmc2V0OwpAQCAtNDc3LDcgKzQ3OCw3IEBACiAKIAlpZiAodW5saWtlbHkoYmlvLT5iaV9ydyAmIFJFUV9GTFVTSCkpIHsKIAkJbWRfZmx1c2hfcmVxdWVzdChtZGRldiwgYmlvKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAljaHVua19zZWN0cyA9IG1kZGV2LT5jaHVua19zZWN0b3JzOwpAQCAtNDk3LDEzICs0OTgsMTAgQEAKIAkJZWxzZQogCQkJYnAgPSBiaW9fc3BsaXQoYmlvLCBjaHVua19zZWN0cyAtCiAJCQkJICAgICAgIHNlY3Rvcl9kaXYoc2VjdG9yLCBjaHVua19zZWN0cykpOwotCQlpZiAocmFpZDBfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpKQotCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoJmJwLT5iaW8xKTsKLQkJaWYgKHJhaWQwX21ha2VfcmVxdWVzdChtZGRldiwgJmJwLT5iaW8yKSkKLQkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KCZicC0+YmlvMik7Ci0KKwkJcmFpZDBfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpOworCQlyYWlkMF9tYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMik7CiAJCWJpb19wYWlyX3JlbGVhc2UoYnApOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCX0KIAogCXNlY3Rvcl9vZmZzZXQgPSBiaW8tPmJpX3NlY3RvcjsKQEAgLTUxMywxMCArNTExLDkgQEAKIAliaW8tPmJpX2JkZXYgPSB0bXBfZGV2LT5iZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yX29mZnNldCArIHpvbmUtPmRldl9zdGFydCArCiAJCXRtcF9kZXYtPmRhdGFfb2Zmc2V0OwotCS8qCi0JICogTGV0IHRoZSBtYWluIGJsb2NrIGxheWVyIHN1Ym1pdCB0aGUgSU8gYW5kIHJlc29sdmUgcmVjdXJzaW9uOgotCSAqLwotCXJldHVybiAxOworCisJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKKwlyZXR1cm47CiAKIGJhZF9tYXA6CiAJcHJpbnRrKCJtZC9yYWlkMDolczogbWFrZV9yZXF1ZXN0IGJ1ZzogY2FuJ3QgY29udmVydCBibG9jayBhY3Jvc3MgY2h1bmtzIgpAQCAtNTI1LDcgKzUyMiw3IEBACiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSA+PiAxMCk7CiAKIAliaW9faW9fZXJyb3IoYmlvKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHJhaWQwX3N0YXR1cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IG1kZGV2ICptZGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEuYyBiL2RyaXZlcnMvbWQvcmFpZDEuYwppbmRleCA0NjAyZmM1Li5lZGUyNDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlICJtZC5oIgpAQCAtODA3LDcgKzgwOCw3IEBACiAJcHJfZGVidWcoIiVkQiBiZWhpbmQgYWxsb2MgZmFpbGVkLCBkb2luZyBzeW5jIEkvT1xuIiwgYmlvLT5iaV9zaXplKTsKIH0KIAotc3RhdGljIGludCBtYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqIGJpbykKK3N0YXRpYyB2b2lkIG1ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICogYmlvKQogewogCXN0cnVjdCByMWNvbmYgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbWlycm9yX2luZm8gKm1pcnJvcjsKQEAgLTg5Miw3ICs4OTMsNyBAQAogCQlpZiAocmRpc2sgPCAwKSB7CiAJCQkvKiBjb3VsZG4ndCBmaW5kIGFueXdoZXJlIHRvIHJlYWQgZnJvbSAqLwogCQkJcmFpZF9lbmRfYmlvX2lvKHIxX2Jpbyk7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybjsKIAkJfQogCQltaXJyb3IgPSBjb25mLT5taXJyb3JzICsgcmRpc2s7CiAKQEAgLTk1MCw3ICs5NTEsNyBAQAogCQkJZ290byByZWFkX2FnYWluOwogCQl9IGVsc2UKIAkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KHJlYWRfYmlvKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAkvKgpAQCAtMTE1MSw4ICsxMTUyLDYgQEAKIAogCWlmIChkb19zeW5jIHx8ICFiaXRtYXAgfHwgIXBsdWdnZWQpCiAJCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWRkZXYgKm1kZGV2KQpAQCAtMjE5Myw3ICsyMTkyLDYgQEAKIAkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKIAkJYmlvLT5iaV9mbGFncyAmPSB+KEJJT19QT09MX01BU0stMSk7CiAJCWJpby0+YmlfZmxhZ3MgfD0gMSA8PCBCSU9fVVBUT0RBVEU7Ci0JCWJpby0+YmlfY29tcF9jcHUgPSAtMTsKIAkJYmlvLT5iaV9ydyA9IFJFQUQ7CiAJCWJpby0+YmlfdmNudCA9IDA7CiAJCWJpby0+YmlfaWR4ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IDEzMmMxOGUuLjY4NWRkZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSAibWQuaCIKQEAgLTg0Miw3ICs4NDMsNyBAQAogCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+cmVzeW5jX2xvY2spOwogfQogCi1zdGF0aWMgaW50IG1ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICogYmlvKQorc3RhdGljIHZvaWQgbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKiBiaW8pCiB7CiAJc3RydWN0IHIxMGNvbmYgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbWlycm9yX2luZm8gKm1pcnJvcjsKQEAgLTg2MSw3ICs4NjIsNyBAQAogCiAJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJLyogSWYgdGhpcyByZXF1ZXN0IGNyb3NzZXMgYSBjaHVuayBib3VuZGFyeSwgd2UgbmVlZCB0bwpAQCAtODkzLDEwICs4OTQsOCBAQAogCQljb25mLT5ucl93YWl0aW5nKys7CiAJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+cmVzeW5jX2xvY2spOwogCi0JCWlmIChtYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMSkpCi0JCQlnZW5lcmljX21ha2VfcmVxdWVzdCgmYnAtPmJpbzEpOwotCQlpZiAobWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzIpKQotCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoJmJwLT5iaW8yKTsKKwkJbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpOworCQltYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMik7CiAKIAkJc3Bpbl9sb2NrX2lycSgmY29uZi0+cmVzeW5jX2xvY2spOwogCQljb25mLT5ucl93YWl0aW5nLS07CkBAIC05MDQsMTQgKzkwMywxNCBAQAogCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPnJlc3luY19sb2NrKTsKIAogCQliaW9fcGFpcl9yZWxlYXNlKGJwKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAliYWRfbWFwOgogCQlwcmludGsoIm1kL3JhaWQxMDolczogbWFrZV9yZXF1ZXN0IGJ1ZzogY2FuJ3QgY29udmVydCBibG9jayBhY3Jvc3MgY2h1bmtzIgogCQkgICAgICAgIiBvciBiaWdnZXIgdGhhbiAlZGsgJWxsdSAlZFxuIiwgbWRuYW1lKG1kZGV2KSwgY2h1bmtfc2VjdHMvMiwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSA+PiAxMCk7CiAKIAkJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJbWRfd3JpdGVfc3RhcnQobWRkZXYsIGJpbyk7CkBAIC05NTQsNyArOTUzLDcgQEAKIAkJc2xvdCA9IHIxMF9iaW8tPnJlYWRfc2xvdDsKIAkJaWYgKGRpc2sgPCAwKSB7CiAJCQlyYWlkX2VuZF9iaW9faW8ocjEwX2Jpbyk7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybjsKIAkJfQogCQltaXJyb3IgPSBjb25mLT5taXJyb3JzICsgZGlzazsKIApAQCAtMTAwMiw3ICsxMDAxLDcgQEAKIAkJCWdvdG8gcmVhZF9hZ2FpbjsKIAkJfSBlbHNlCiAJCQlnZW5lcmljX21ha2VfcmVxdWVzdChyZWFkX2Jpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJLyoKQEAgLTExNzYsNyArMTE3NSw2IEBACiAKIAlpZiAoZG9fc3luYyB8fCAhbWRkZXYtPmJpdG1hcCB8fCAhcGx1Z2dlZCkKIAkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWRkZXYgKm1kZGV2KQpAQCAtMTM1NSw3ICsxMzUzLDcgQEAKIAkJc3RydWN0IG1pcnJvcl9pbmZvICpwID0gJmNvbmYtPm1pcnJvcnNbbWlycm9yXTsKIAkJaWYgKHAtPnJlY292ZXJ5X2Rpc2FibGVkID09IG1kZGV2LT5yZWNvdmVyeV9kaXNhYmxlZCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIXAtPnJkZXYpCisJCWlmIChwLT5yZGV2KQogCQkJY29udGludWU7CiAKIAkJZGlza19zdGFja19saW1pdHMobWRkZXYtPmdlbmRpc2ssIHJkZXYtPmJkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggZjZmZTA1My4uMjk3ZTI2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CiAjaW5jbHVkZSA8bGludXgvYXN5bmNfdHguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CkBAIC0zMTA5LDcgKzMxMTAsNyBAQAogCXN0cnVjdCByNWRldiAqcGRldiwgKnFkZXY7CiAKIAljbGVhcl9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoU1RSSVBFX0FDVElWRSwgJnNoLT5zdGF0ZSkpIHsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdF9sb2NrKFNUUklQRV9BQ1RJVkUsICZzaC0+c3RhdGUpKSB7CiAJCS8qIGFscmVhZHkgYmVpbmcgaGFuZGxlZCwgZW5zdXJlIGl0IGdldHMgaGFuZGxlZAogCQkgKiBhZ2FpbiB3aGVuIGN1cnJlbnQgYWN0aW9uIGZpbmlzaGVzICovCiAJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CkBAIC0zMTU4LDEwICszMTU5LDE0IEBACiAJLyogY2hlY2sgaWYgdGhlIGFycmF5IGhhcyBsb3N0IG1vcmUgdGhhbiBtYXhfZGVncmFkZWQgZGV2aWNlcyBhbmQsCiAJICogaWYgc28sIHNvbWUgcmVxdWVzdHMgbWlnaHQgbmVlZCB0byBiZSBmYWlsZWQuCiAJICovCi0JaWYgKHMuZmFpbGVkID4gY29uZi0+bWF4X2RlZ3JhZGVkICYmIHMudG9fcmVhZCtzLnRvX3dyaXRlK3Mud3JpdHRlbikKLQkJaGFuZGxlX2ZhaWxlZF9zdHJpcGUoY29uZiwgc2gsICZzLCBkaXNrcywgJnMucmV0dXJuX2JpKTsKLQlpZiAocy5mYWlsZWQgPiBjb25mLT5tYXhfZGVncmFkZWQgJiYgcy5zeW5jaW5nKQotCQloYW5kbGVfZmFpbGVkX3N5bmMoY29uZiwgc2gsICZzKTsKKwlpZiAocy5mYWlsZWQgPiBjb25mLT5tYXhfZGVncmFkZWQpIHsKKwkJc2gtPmNoZWNrX3N0YXRlID0gMDsKKwkJc2gtPnJlY29uc3RydWN0X3N0YXRlID0gMDsKKwkJaWYgKHMudG9fcmVhZCtzLnRvX3dyaXRlK3Mud3JpdHRlbikKKwkJCWhhbmRsZV9mYWlsZWRfc3RyaXBlKGNvbmYsIHNoLCAmcywgZGlza3MsICZzLnJldHVybl9iaSk7CisJCWlmIChzLnN5bmNpbmcpCisJCQloYW5kbGVfZmFpbGVkX3N5bmMoY29uZiwgc2gsICZzKTsKKwl9CiAKIAkvKgogCSAqIG1pZ2h0IGJlIGFibGUgdG8gcmV0dXJuIHNvbWUgd3JpdGUgcmVxdWVzdHMgaWYgdGhlIHBhcml0eSBibG9ja3MKQEAgLTMzNzAsNyArMzM3NSw3IEBACiAKIAlyZXR1cm5faW8ocy5yZXR1cm5fYmkpOwogCi0JY2xlYXJfYml0KFNUUklQRV9BQ1RJVkUsICZzaC0+c3RhdGUpOworCWNsZWFyX2JpdF91bmxvY2soU1RSSVBFX0FDVElWRSwgJnNoLT5zdGF0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJhaWQ1X2FjdGl2YXRlX2RlbGF5ZWQoc3RydWN0IHI1Y29uZiAqY29uZikKQEAgLTM2ODgsNyArMzY5Myw3IEBACiAJcmV0dXJuIHNoOwogfQogCi1zdGF0aWMgaW50IG1ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICogYmkpCitzdGF0aWMgdm9pZCBtYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqIGJpKQogewogCXN0cnVjdCByNWNvbmYgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlpbnQgZGRfaWR4OwpAQCAtMzcwMSw3ICszNzA2LDcgQEAKIAogCWlmICh1bmxpa2VseShiaS0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAltZF93cml0ZV9zdGFydChtZGRldiwgYmkpOwpAQCAtMzcwOSw3ICszNzE0LDcgQEAKIAlpZiAocncgPT0gUkVBRCAmJgogCSAgICAgbWRkZXYtPnJlc2hhcGVfcG9zaXRpb24gPT0gTWF4U2VjdG9yICYmCiAJICAgICBjaHVua19hbGlnbmVkX3JlYWQobWRkZXYsYmkpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJbG9naWNhbF9zZWN0b3IgPSBiaS0+Ymlfc2VjdG9yICYgfigoc2VjdG9yX3QpU1RSSVBFX1NFQ1RPUlMtMSk7CiAJbGFzdF9zZWN0b3IgPSBiaS0+Ymlfc2VjdG9yICsgKGJpLT5iaV9zaXplPj45KTsKQEAgLTM4NDQsOCArMzg0OSw2IEBACiAKIAkJYmlvX2VuZGlvKGJpLCAwKTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNlY3Rvcl90IHJhaWQ1X3NpemUoc3RydWN0IG1kZGV2ICptZGRldiwgc2VjdG9yX3Qgc2VjdG9ycywgaW50IHJhaWRfZGlza3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYwppbmRleCA5YWYyMTQwLi5kNmIxY2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYwpAQCAtMTgsNyArMTgsMTAgQEAKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogTElTVF9IRUFEKHNhYTcxNDZfZGV2aWNlcyk7CiBERUZJTkVfTVVURVgoc2FhNzE0Nl9kZXZpY2VzX2xvY2spOwpAQCAtMzUsMTAgKzM4LDkgQEAKIHsKIAlpbnQgaSA9IDA7CiAKLQlJTkZPKCgiIEAgJWxpIGppZmZpZXM6XG4iLGppZmZpZXMpKTsKLQlmb3IoaSA9IDA7IGkgPD0gMHgxNDg7IGkrPTQpIHsKLQkJcHJpbnRrKCIweCUwM3g6IDB4JTA4eFxuIixpLHNhYTcxNDZfcmVhZChkZXYsaSkpOwotCX0KKwlwcl9pbmZvKCIgQCAlbGkgamlmZmllczpcbiIsIGppZmZpZXMpOworCWZvciAoaSA9IDA7IGkgPD0gMHgxNDg7IGkgKz0gNCkKKwkJcHJfaW5mbygiMHglMDN4OiAweCUwOHhcbiIsIGksIHNhYTcxNDZfcmVhZChkZXYsIGkpKTsKIH0KICNlbmRpZgogCkBAIC03Miw5ICs3NCw4IEBACiAJCWlmIChzYWE3MTQ2X3JlYWQoZGV2LCBNQzIpICYgMikKIAkJCWJyZWFrOwogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyB0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3IgIgotCQkJCQkicmVnaXN0ZXJzIGdldHRpbmcgcHJvZ3JhbW1lZFxuIiwKLQkJCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CisJCQlwcl9lcnIoIiVzOiAlcyB0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3IgcmVnaXN0ZXJzIGdldHRpbmcgcHJvZ3JhbW1lZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CiAJCW1zbGVlcCgxKTsKQEAgLTg4LDggKzg5LDggQEAKIAkJCWJyZWFrOwogCQlzYWE3MTQ2X3JlYWQoZGV2LCBNQzIpOwogCQlpZiAoZXJyKSB7Ci0JCQlERUJfUygoIiVzOiAlcyB0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3IgdHJhbnNmZXIgIgotCQkJCSJjb21wbGV0aW9uXG4iLAlkZXYtPm5hbWUsIF9fZnVuY19fKSk7CisJCQlERUJfUygiJXM6ICVzIHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0cmFuc2ZlciBjb21wbGV0aW9uXG4iLAorCQkJICAgICAgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQltc2xlZXAoMSk7CkBAIC0xMDksOSArMTEwLDggQEAKIAkJaWYgKHNhYTcxNDZfcmVhZChkZXYsIE1DMikgJiAyKQogCQkJYnJlYWs7CiAJCWlmICghbG9vcHMtLSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yICIKLQkJCQkJInJlZ2lzdGVycyBnZXR0aW5nIHByb2dyYW1tZWRcbiIsCi0JCQkJCWRldi0+bmFtZSwgX19mdW5jX18pOworCQkJcHJfZXJyKCIlczogJXMgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHJlZ2lzdGVycyBnZXR0aW5nIHByb2dyYW1tZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQl1ZGVsYXkoMSk7CkBAIC0xMjQsOCArMTI0LDggQEAKIAkJCWJyZWFrOwogCQlzYWE3MTQ2X3JlYWQoZGV2LCBNQzIpOwogCQlpZiAoIWxvb3BzLS0pIHsKLQkJCURFQl9TKCgiJXM6ICVzIHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0cmFuc2ZlciAiCi0JCQkJImNvbXBsZXRpb25cbiIsIGRldi0+bmFtZSwgX19mdW5jX18pKTsKKwkJCURFQl9TKCIlczogJXMgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHRyYW5zZmVyIGNvbXBsZXRpb25cbiIsCisJCQkgICAgICBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CiAJCXVkZWxheSg1KTsKQEAgLTI2NCw3ICsyNjQsOSBAQAogCXB0ciA9IHB0LT5jcHU7CiAJZm9yIChpID0gMDsgaSA8IHNnbGVuOyBpKyssIGxpc3QrKykgewogLyoKLQkJcHJpbnRrKCJpOiVkLCBhZHI6MHglMDh4LCBsZW46JWQsIG9mZnNldDolZFxuIiwgaSxzZ19kbWFfYWRkcmVzcyhsaXN0KSwgc2dfZG1hX2xlbihsaXN0KSwgbGlzdC0+b2Zmc2V0KTsKKwkJcHJfZGVidWcoImk6JWQsIGFkcjoweCUwOHgsIGxlbjolZCwgb2Zmc2V0OiVkXG4iLAorCQkJIGksIHNnX2RtYV9hZGRyZXNzKGxpc3QpLCBzZ19kbWFfbGVuKGxpc3QpLAorCQkJIGxpc3QtPm9mZnNldCk7CiAqLwogCQlmb3IgKHAgPSAwOyBwICogNDA5NiA8IGxpc3QtPmxlbmd0aDsgcCsrLCBwdHIrKykgewogCQkJKnB0ciA9IGNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKGxpc3QpICsgcCAqIDQwOTYpOwpAQCAtMjgxLDkgKzI4Myw5IEBACiAKIC8qCiAJcHRyID0gcHQtPmNwdTsKLQlwcmludGsoIm9mZnNldDogJWRcbiIscHQtPm9mZnNldCk7CisJcHJfZGVidWcoIm9mZnNldDogJWRcbiIsIHB0LT5vZmZzZXQpOwogCWZvcihpPTA7aTw1O2krKykgewotCQlwcmludGsoInB0cjEgJWQ6IDB4JTA4eFxuIixpLHB0cltpXSk7CisJCXByX2RlYnVnKCJwdHIxICVkOiAweCUwOHhcbiIsIGksIHB0cltpXSk7CiAJfQogKi8KIAlyZXR1cm4gMDsKQEAgLTMxNCw3ICszMTYsNyBAQAogCQl9CiAJfQogCWlmICgwICE9IChpc3IgJiAoTUFTS18yNykpKSB7Ci0JCURFQl9JTlQoKCJpcnE6IFJQUzAgKDB4JTA4eCkuXG4iLGlzcikpOworCQlERUJfSU5UKCJpcnE6IFJQUzAgKDB4JTA4eClcbiIsIGlzcik7CiAJCWlmIChkZXYtPnZ2X2RhdGEgJiYgZGV2LT52dl9jYWxsYmFjaykKIAkJCWRldi0+dnZfY2FsbGJhY2soZGV2LGlzcik7CiAJCWlzciAmPSB+TUFTS18yNzsKQEAgLTMzMywxNCArMzM1LDE1IEBACiAJCX0gZWxzZSB7CiAJCQl1MzIgcHNyID0gc2FhNzE0Nl9yZWFkKGRldiwgUFNSKTsKIAkJCXUzMiBzc3IgPSBzYWE3MTQ2X3JlYWQoZGV2LCBTU1IpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuZXhwZWN0ZWQgaTJjIGlycTogaXNyICUwOHggcHNyICUwOHggc3NyICUwOHhcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBpc3IsIHBzciwgc3NyKTsKKwkJCXByX3dhcm4oIiVzOiB1bmV4cGVjdGVkIGkyYyBpcnE6IGlzciAlMDh4IHBzciAlMDh4IHNzciAlMDh4XG4iLAorCQkJCWRldi0+bmFtZSwgaXNyLCBwc3IsIHNzcik7CiAJCX0KIAkJaXNyICY9IH4oTUFTS18xNnxNQVNLXzE3KTsKIAl9CiAJaWYoIDAgIT0gaXNyICkgewotCQlFUlIoKCJ3YXJuaW5nOiBpbnRlcnJ1cHQgZW5hYmxlZCwgYnV0IG5vdCBoYW5kbGVkIHByb3Blcmx5LigweCUwOHgpXG4iLGlzcikpOwotCQlFUlIoKCJkaXNhYmxpbmcgaW50ZXJydXB0IHNvdXJjZShzKSFcbiIpKTsKKwkJRVJSKCJ3YXJuaW5nOiBpbnRlcnJ1cHQgZW5hYmxlZCwgYnV0IG5vdCBoYW5kbGVkIHByb3Blcmx5LigweCUwOHgpXG4iLAorCQkgICAgaXNyKTsKKwkJRVJSKCJkaXNhYmxpbmcgaW50ZXJydXB0IHNvdXJjZShzKSFcbiIpOwogCQlTQUE3MTQ2X0lFUl9ESVNBQkxFKGRldixpc3IpOwogCX0KIAlzYWE3MTQ2X3dyaXRlKGRldiwgSVNSLCBhY2tfaXNyKTsKQEAgLTM2MCwxNSArMzYzLDE1IEBACiAJLyogY2xlYXIgb3V0IG1lbSBmb3Igc3VyZSAqLwogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTQ2X2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KSB7Ci0JCUVSUigoIm91dCBvZiBtZW1vcnkuXG4iKSk7CisJCUVSUigib3V0IG9mIG1lbW9yeVxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAotCURFQl9FRSgoInBjaTolcFxuIixwY2kpKTsKKwlERUJfRUUoInBjaTolcFxuIiwgcGNpKTsKIAogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CiAJaWYgKGVyciA8IDApIHsKLQkJRVJSKCgicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWQuXG4iKSk7CisJCUVSUigicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApAQCAtMzg5LDcgKzM5Miw3IEBACiAJZGV2LT5tZW0gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApLAogCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2ksIDApKTsKIAlpZiAoIWRldi0+bWVtKSB7Ci0JCUVSUigoImlvcmVtYXAoKSBmYWlsZWQuXG4iKSk7CisJCUVSUigiaW9yZW1hcCgpIGZhaWxlZFxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX3JlbGVhc2U7CiAJfQpAQCAtNDE0LDcgKzQxNyw3IEBACiAJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIGludGVycnVwdF9odywgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELAogCQkJICBkZXYtPm5hbWUsIGRldik7CiAJaWYgKGVyciA8IDApIHsKLQkJRVJSKCgicmVxdWVzdF9pcnEoKSBmYWlsZWQuXG4iKSk7CisJCUVSUigicmVxdWVzdF9pcnEoKSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl91bm1hcDsKIAl9CiAKQEAgLTQ0NCw3ICs0NDcsOSBAQAogCS8qIGNyZWF0ZSBhIG5pY2UgZGV2aWNlIG5hbWUgKi8KIAlzcHJpbnRmKGRldi0+bmFtZSwgInNhYTcxNDYgKCVkKSIsIHNhYTcxNDZfbnVtKTsKIAotCUlORk8oKCJmb3VuZCBzYWE3MTQ2IEAgbWVtICVwIChyZXZpc2lvbiAlZCwgaXJxICVkKSAoMHglMDR4LDB4JTA0eCkuXG4iLCBkZXYtPm1lbSwgZGV2LT5yZXZpc2lvbiwgcGNpLT5pcnEsIHBjaS0+c3Vic3lzdGVtX3ZlbmRvciwgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlKSk7CisJcHJfaW5mbygiZm91bmQgc2FhNzE0NiBAIG1lbSAlcCAocmV2aXNpb24gJWQsIGlycSAlZCkgKDB4JTA0eCwweCUwNHgpXG4iLAorCQlkZXYtPm1lbSwgZGV2LT5yZXZpc2lvbiwgcGNpLT5pcnEsCisJCXBjaS0+c3Vic3lzdGVtX3ZlbmRvciwgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAlkZXYtPmV4dCA9IGV4dDsKIAogCW11dGV4X2luaXQoJmRldi0+djRsMl9sb2NrKTsKQEAgLTQ2NCwxMiArNDY5LDEyIEBACiAJZXJyID0gLUVOT0RFVjsKIAogCWlmIChleHQtPnByb2JlICYmIGV4dC0+cHJvYmUoZGV2KSkgewotCQlERUJfRCgoImV4dC0+cHJvYmUoKSBmYWlsZWQgZm9yICVwLiBza2lwcGluZyBkZXZpY2UuXG4iLGRldikpOworCQlERUJfRCgiZXh0LT5wcm9iZSgpIGZhaWxlZCBmb3IgJXAuIHNraXBwaW5nIGRldmljZS5cbiIsIGRldik7CiAJCWdvdG8gZXJyX2ZyZWVfaTJjOwogCX0KIAogCWlmIChleHQtPmF0dGFjaChkZXYsIHBjaV9leHQpKSB7Ci0JCURFQl9EKCgiZXh0LT5hdHRhY2goKSBmYWlsZWQgZm9yICVwLiBza2lwcGluZyBkZXZpY2UuXG4iLGRldikpOworCQlERUJfRCgiZXh0LT5hdHRhY2goKSBmYWlsZWQgZm9yICVwLiBza2lwcGluZyBkZXZpY2UuXG4iLCBkZXYpOwogCQlnb3RvIGVycl9mcmVlX2kyYzsKIAl9CiAJLyogVjRMIGV4dGVuc2lvbnMgd2lsbCBzZXQgdGhlIHBjaSBkcnZkYXRhIHRvIHRoZSB2NGwyX2RldmljZSBpbiB0aGUKQEAgLTUyMSw3ICs1MjYsNyBAQAogCQl7IE5VTEwsIDAgfQogCX0sICpwOwogCi0JREVCX0VFKCgiZGV2OiVwXG4iLGRldikpOworCURFQl9FRSgiZGV2OiVwXG4iLCBkZXYpOwogCiAJZGV2LT5leHQtPmRldGFjaChkZXYpOwogCS8qIFplcm8gdGhlIFBDSSBkcnZkYXRhIGFmdGVyIHVzZS4gKi8KQEAgLTU1MiwyMSArNTU3LDIxIEBACiAKIGludCBzYWE3MTQ2X3JlZ2lzdGVyX2V4dGVuc2lvbihzdHJ1Y3Qgc2FhNzE0Nl9leHRlbnNpb24qIGV4dCkKIHsKLQlERUJfRUUoKCJleHQ6JXBcbiIsZXh0KSk7CisJREVCX0VFKCJleHQ6JXBcbiIsIGV4dCk7CiAKIAlleHQtPmRyaXZlci5uYW1lID0gZXh0LT5uYW1lOwogCWV4dC0+ZHJpdmVyLmlkX3RhYmxlID0gZXh0LT5wY2lfdGJsOwogCWV4dC0+ZHJpdmVyLnByb2JlID0gc2FhNzE0Nl9pbml0X29uZTsKIAlleHQtPmRyaXZlci5yZW1vdmUgPSBzYWE3MTQ2X3JlbW92ZV9vbmU7CiAKLQlwcmludGsoInNhYTcxNDY6IHJlZ2lzdGVyIGV4dGVuc2lvbiAnJXMnLlxuIixleHQtPm5hbWUpOworCXByX2luZm8oInJlZ2lzdGVyIGV4dGVuc2lvbiAnJXMnXG4iLCBleHQtPm5hbWUpOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZleHQtPmRyaXZlcik7CiB9CiAKIGludCBzYWE3MTQ2X3VucmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiogZXh0KQogewotCURFQl9FRSgoImV4dDolcFxuIixleHQpKTsKLQlwcmludGsoInNhYTcxNDY6IHVucmVnaXN0ZXIgZXh0ZW5zaW9uICclcycuXG4iLGV4dC0+bmFtZSk7CisJREVCX0VFKCJleHQ6JXBcbiIsIGV4dCk7CisJcHJfaW5mbygidW5yZWdpc3RlciBleHRlbnNpb24gJyVzJ1xuIiwgZXh0LT5uYW1lKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmV4dC0+ZHJpdmVyKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKaW5kZXggMWJkM2RkNy4uNzFmOGUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKQEAgLTEsNCArMSw3IEBACisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogcmVzb3VyY2UgbWFuYWdlbWVudCBmdW5jdGlvbnMsIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHNhYTcxMzQgZHJpdmVyICovCkBAIC05LDIxICsxMiwyMyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAogCWlmIChmaC0+cmVzb3VyY2VzICYgYml0KSB7Ci0JCURFQl9EKCgiYWxyZWFkeSBhbGxvY2F0ZWQhIHdhbnQ6IDB4JTAyeCwgY3VyOjB4JTAyeFxuIixiaXQsdnYtPnJlc291cmNlcykpOworCQlERUJfRCgiYWxyZWFkeSBhbGxvY2F0ZWQhIHdhbnQ6IDB4JTAyeCwgY3VyOjB4JTAyeFxuIiwKKwkJICAgICAgYml0LCB2di0+cmVzb3VyY2VzKTsKIAkJLyogaGF2ZSBpdCBhbHJlYWR5IGFsbG9jYXRlZCAqLwogCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBpcyBpdCBmcmVlPyAqLwogCWlmICh2di0+cmVzb3VyY2VzICYgYml0KSB7Ci0JCURFQl9EKCgibG9ja2VkISB2di0+cmVzb3VyY2VzOjB4JTAyeCwgd2Ugd2FudDoweCUwMnhcbiIsdnYtPnJlc291cmNlcyxiaXQpKTsKKwkJREVCX0QoImxvY2tlZCEgdnYtPnJlc291cmNlczoweCUwMngsIHdlIHdhbnQ6MHglMDJ4XG4iLAorCQkgICAgICB2di0+cmVzb3VyY2VzLCBiaXQpOwogCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KIAkJcmV0dXJuIDA7CiAJfQogCS8qIGl0J3MgZnJlZSwgZ3JhYiBpdCAqLwotCWZoLT5yZXNvdXJjZXMgIHw9IGJpdDsKKwlmaC0+cmVzb3VyY2VzIHw9IGJpdDsKIAl2di0+cmVzb3VyY2VzIHw9IGJpdDsKLQlERUJfRCgoInJlczogZ2V0IDB4JTAyeCwgY3VyOjB4JTAyeFxuIixiaXQsdnYtPnJlc291cmNlcykpOworCURFQl9EKCJyZXM6IGdldCAweCUwMngsIGN1cjoweCUwMnhcbiIsIGJpdCwgdnYtPnJlc291cmNlcyk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTM0LDkgKzM5LDkgQEAKIAogCUJVR19PTigoZmgtPnJlc291cmNlcyAmIGJpdHMpICE9IGJpdHMpOwogCi0JZmgtPnJlc291cmNlcyAgJj0gfmJpdHM7CisJZmgtPnJlc291cmNlcyAmPSB+Yml0czsKIAl2di0+cmVzb3VyY2VzICY9IH5iaXRzOwotCURFQl9EKCgicmVzOiBwdXQgMHglMDJ4LCBjdXI6MHglMDJ4XG4iLGJpdHMsdnYtPnJlc291cmNlcykpOworCURFQl9EKCJyZXM6IHB1dCAweCUwMngsIGN1cjoweCUwMnhcbiIsIGJpdHMsIHZ2LT5yZXNvdXJjZXMpOwogfQogCiAKQEAgLTQ3LDcgKzUyLDcgQEAKIAkJCQkJCXN0cnVjdCBzYWE3MTQ2X2J1ZiAqYnVmKQogewogCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYT12aWRlb2J1Zl90b19kbWEoJmJ1Zi0+dmIpOwotCURFQl9FRSgoImRldjolcCwgYnVmOiVwXG4iLGRldixidWYpKTsKKwlERUJfRUUoImRldjolcCwgYnVmOiVwXG4iLCBkZXYsIGJ1Zik7CiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCkBAIC02NiwxOCArNzEsMTkgQEAKIAkJCSBzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1ZikKIHsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+c2xvY2spOwotCURFQl9FRSgoImRldjolcCwgZG1hcTolcCwgYnVmOiVwXG4iLCBkZXYsIHEsIGJ1ZikpOworCURFQl9FRSgiZGV2OiVwLCBkbWFxOiVwLCBidWY6JXBcbiIsIGRldiwgcSwgYnVmKTsKIAogCUJVR19PTighcSk7CiAKIAlpZiAoTlVMTCA9PSBxLT5jdXJyKSB7CiAJCXEtPmN1cnIgPSBidWY7Ci0JCURFQl9EKCgiaW1tZWRpYXRlbHkgYWN0aXZhdGluZyBidWZmZXIgJXBcbiIsIGJ1ZikpOworCQlERUJfRCgiaW1tZWRpYXRlbHkgYWN0aXZhdGluZyBidWZmZXIgJXBcbiIsIGJ1Zik7CiAJCWJ1Zi0+YWN0aXZhdGUoZGV2LGJ1ZixOVUxMKTsKIAl9IGVsc2UgewogCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5xdWV1ZSk7CiAJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCURFQl9EKCgiYWRkaW5nIGJ1ZmZlciAlcCB0byBxdWV1ZS4gKGFjdGl2ZSBidWZmZXIgcHJlc2VudClcbiIsIGJ1ZikpOworCQlERUJfRCgiYWRkaW5nIGJ1ZmZlciAlcCB0byBxdWV1ZS4gKGFjdGl2ZSBidWZmZXIgcHJlc2VudClcbiIsCisJCSAgICAgIGJ1Zik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtODcsMTQgKzkzLDE0IEBACiAJCQkgICBpbnQgc3RhdGUpCiB7CiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkZXYtPnNsb2NrKTsKLQlERUJfRUUoKCJkZXY6JXAsIGRtYXE6JXAsIHN0YXRlOiVkXG4iLCBkZXYsIHEsIHN0YXRlKSk7Ci0JREVCX0VFKCgicS0+Y3VycjolcFxuIixxLT5jdXJyKSk7CisJREVCX0VFKCJkZXY6JXAsIGRtYXE6JXAsIHN0YXRlOiVkXG4iLCBkZXYsIHEsIHN0YXRlKTsKKwlERUJfRUUoInEtPmN1cnI6JXBcbiIsIHEtPmN1cnIpOwogCiAJQlVHX09OKCFxLT5jdXJyKTsKIAogCS8qIGZpbmlzaCBjdXJyZW50IGJ1ZmZlciAqLwogCWlmIChOVUxMID09IHEtPmN1cnIpIHsKLQkJREVCX0QoKCJhaWlpLiBubyBjdXJyZW50IGJ1ZmZlclxuIikpOworCQlERUJfRCgiYWlpaS4gbm8gY3VycmVudCBidWZmZXJcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTIsNyArMTE4LDcgQEAKIAogCUJVR19PTighcSk7CiAKLQlERUJfSU5UKCgiZGV2OiVwLCBkbWFxOiVwLCB2Ymk6JWRcbiIsIGRldiwgcSwgdmJpKSk7CisJREVCX0lOVCgiZGV2OiVwLCBkbWFxOiVwLCB2Ymk6JWRcbiIsIGRldiwgcSwgdmJpKTsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGV2LT5zbG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZSkpIHsKQEAgLTEyMiwxMCArMTI4LDExIEBACiAJCWlmICghbGlzdF9lbXB0eSgmcS0+cXVldWUpKQogCQkJbmV4dCA9IGxpc3RfZW50cnkocS0+cXVldWUubmV4dCxzdHJ1Y3Qgc2FhNzE0Nl9idWYsIHZiLnF1ZXVlKTsKIAkJcS0+Y3VyciA9IGJ1ZjsKLQkJREVCX0lOVCgoIm5leHQgYnVmZmVyOiBidWY6JXAsIHByZXY6JXAsIG5leHQ6JXBcbiIsIGJ1ZiwgcS0+cXVldWUucHJldixxLT5xdWV1ZS5uZXh0KSk7CisJCURFQl9JTlQoIm5leHQgYnVmZmVyOiBidWY6JXAsIHByZXY6JXAsIG5leHQ6JXBcbiIsCisJCQlidWYsIHEtPnF1ZXVlLnByZXYsIHEtPnF1ZXVlLm5leHQpOwogCQlidWYtPmFjdGl2YXRlKGRldixidWYsbmV4dCk7CiAJfSBlbHNlIHsKLQkJREVCX0lOVCgoIm5vIG5leHQgYnVmZmVyLiBzdG9wcGluZy5cbiIpKTsKKwkJREVCX0lOVCgibm8gbmV4dCBidWZmZXIuIHN0b3BwaW5nLlxuIik7CiAJCWlmKCAwICE9IHZiaSApIHsKIAkJCS8qIHR1cm4gb2ZmIHZpZGVvLWRtYTMgKi8KIAkJCXNhYTcxNDZfd3JpdGUoZGV2LE1DMSwgTUFTS18yMCk7CkBAIC0xNjIsMTEgKzE2OSwxMSBAQAogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gcS0+ZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlERUJfRUUoKCJkZXY6JXAsIGRtYXE6JXBcbiIsIGRldiwgcSkpOworCURFQl9FRSgiZGV2OiVwLCBkbWFxOiVwXG4iLCBkZXYsIHEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssZmxhZ3MpOwogCWlmIChxLT5jdXJyKSB7Ci0JCURFQl9EKCgidGltZW91dCBvbiAlcFxuIiwgcS0+Y3VycikpOworCQlERUJfRCgidGltZW91dCBvbiAlcFxuIiwgcS0+Y3Vycik7CiAJCXNhYTcxNDZfYnVmZmVyX2ZpbmlzaChkZXYscSxWSURFT0JVRl9FUlJPUik7CiAJfQogCkBAIC0xOTQsMTIgKzIwMSwxMiBAQAogCiAJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CiAKLQlERUJfRUUoKCJmaWxlOiVwLCBkZXY6JXNcbiIsIGZpbGUsIHZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpKTsKKwlERUJfRUUoImZpbGU6JXAsIGRldjolc1xuIiwgZmlsZSwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSk7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzYWE3MTQ2X2RldmljZXNfbG9jaykpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQlERUJfRCgoInVzaW5nOiAlcFxuIixkZXYpKTsKKwlERUJfRCgidXNpbmc6ICVwXG4iLCBkZXYpOwogCiAJdHlwZSA9IHZkZXYtPnZmbF90eXBlID09IFZGTF9UWVBFX0dSQUJCRVIKIAkgICAgID8gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFCkBAIC0yMDcsNyArMjE0LDcgQEAKIAogCS8qIGNoZWNrIGlmIGFuIGV4dGVuc2lvbiBpcyByZWdpc3RlcmVkICovCiAJaWYoIE5VTEwgPT0gZGV2LT5leHQgKSB7Ci0JCURFQl9TKCgibm8gZXh0ZW5zaW9uIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZGV2aWNlLlxuIikpOworCQlERUJfUygibm8gZXh0ZW5zaW9uIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZGV2aWNlXG4iKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjE1LDcgKzIyMiw3IEBACiAJLyogYWxsb2NhdGUgcGVyIG9wZW4gZGF0YSAqLwogCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBmaCkgewotCQlERUJfUygoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBlciBvcGVuIGRhdGEuXG4iKSk7CisJCURFQl9TKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwZXIgb3BlbiBkYXRhXG4iKTsKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjI1LDEzICsyMzIsMTMgQEAKIAlmaC0+dHlwZSA9IHR5cGU7CiAKIAlpZiggZmgtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkgewotCQlERUJfUygoImluaXRpYWxpemluZyB2YmkuLi5cbiIpKTsKKwkJREVCX1MoImluaXRpYWxpemluZyB2YmkuLi5cbiIpOwogCQlpZiAoZGV2LT5leHRfdnZfZGF0YS0+Y2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVkJJX0NBUFRVUkUpCiAJCQlyZXN1bHQgPSBzYWE3MTQ2X3ZiaV91b3BzLm9wZW4oZGV2LGZpbGUpOwogCQlpZiAoZGV2LT5leHRfdnZfZGF0YS0+dmJpX2ZvcHMub3BlbikKIAkJCWRldi0+ZXh0X3Z2X2RhdGEtPnZiaV9mb3BzLm9wZW4oZmlsZSk7CiAJfSBlbHNlIHsKLQkJREVCX1MoKCJpbml0aWFsaXppbmcgdmlkZW8uLi5cbiIpKTsKKwkJREVCX1MoImluaXRpYWxpemluZyB2aWRlby4uLlxuIik7CiAJCXJlc3VsdCA9IHNhYTcxNDZfdmlkZW9fdW9wcy5vcGVuKGRldixmaWxlKTsKIAl9CiAKQEAgLTI1OSw3ICsyNjYsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2ZoICAqZmggID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gZmgtPmRldjsKIAotCURFQl9FRSgoImZpbGU6JXBcbiIsIGZpbGUpKTsKKwlERUJfRUUoImZpbGU6JXBcbiIsIGZpbGUpOwogCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2FhNzE0Nl9kZXZpY2VzX2xvY2spKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwpAQCAtMjg5LDEyICsyOTYsMTQgQEAKIAogCXN3aXRjaCAoZmgtPnR5cGUpIHsKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogewotCQlERUJfRUUoKCJWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IGZpbGU6JXAsIHZtYTolcFxuIixmaWxlLCB2bWEpKTsKKwkJREVCX0VFKCJWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IGZpbGU6JXAsIHZtYTolcFxuIiwKKwkJICAgICAgIGZpbGUsIHZtYSk7CiAJCXEgPSAmZmgtPnZpZGVvX3E7CiAJCWJyZWFrOwogCQl9CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOiB7Ci0JCURFQl9FRSgoIlY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6IGZpbGU6JXAsIHZtYTolcFxuIixmaWxlLCB2bWEpKTsKKwkJREVCX0VFKCJWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOiBmaWxlOiVwLCB2bWE6JXBcbiIsCisJCSAgICAgICBmaWxlLCB2bWEpOwogCQlxID0gJmZoLT52YmlfcTsKIAkJYnJlYWs7CiAJCX0KQEAgLTMxMiwxNCArMzIxLDE0IEBACiAJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqYnVmID0gTlVMTDsKIAlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnE7CiAKLQlERUJfRUUoKCJmaWxlOiVwLCBwb2xsOiVwXG4iLGZpbGUsIHdhaXQpKTsKKwlERUJfRUUoImZpbGU6JXAsIHBvbGw6JXBcbiIsIGZpbGUsIHdhaXQpOwogCiAJaWYgKFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUgPT0gZmgtPnR5cGUpIHsKIAkJaWYoIDAgPT0gZmgtPnZiaV9xLnN0cmVhbWluZyApCiAJCQlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmZoLT52YmlfcSwgd2FpdCk7CiAJCXEgPSAmZmgtPnZiaV9xOwogCX0gZWxzZSB7Ci0JCURFQl9EKCgidXNpbmcgdmlkZW8gcXVldWUuXG4iKSk7CisJCURFQl9EKCJ1c2luZyB2aWRlbyBxdWV1ZVxuIik7CiAJCXEgPSAmZmgtPnZpZGVvX3E7CiAJfQogCkBAIC0zMjcsMTcgKzMzNiwxNyBAQAogCQlidWYgPSBsaXN0X2VudHJ5KHEtPnN0cmVhbS5uZXh0LCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyLCBzdHJlYW0pOwogCiAJaWYgKCFidWYpIHsKLQkJREVCX0QoKCJidWYgPT0gTlVMTCFcbiIpKTsKKwkJREVCX0QoImJ1ZiA9PSBOVUxMIVxuIik7CiAJCXJldHVybiBQT0xMRVJSOwogCX0KIAogCXBvbGxfd2FpdChmaWxlLCAmYnVmLT5kb25lLCB3YWl0KTsKIAlpZiAoYnVmLT5zdGF0ZSA9PSBWSURFT0JVRl9ET05FIHx8IGJ1Zi0+c3RhdGUgPT0gVklERU9CVUZfRVJST1IpIHsKLQkJREVCX0QoKCJwb2xsIHN1Y2NlZWRlZCFcbiIpKTsKKwkJREVCX0QoInBvbGwgc3VjY2VlZGVkIVxuIik7CiAJCXJldHVybiBQT0xMSU58UE9MTFJETk9STTsKIAl9CiAKLQlERUJfRCgoIm5vdGhpbmcgdG8gcG9sbCBmb3IsIGJ1Zi0+c3RhdGU6JWRcbiIsYnVmLT5zdGF0ZSkpOworCURFQl9EKCJub3RoaW5nIHRvIHBvbGwgZm9yLCBidWYtPnN0YXRlOiVkXG4iLCBidWYtPnN0YXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ2LDE4ICszNTUsMjAgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IHsKLS8vCQlERUJfRUUoKCJWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IGZpbGU6JXAsIGRhdGE6JXAsIGNvdW50OiVsdW4iLCBmaWxlLCBkYXRhLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorLyoKKwkJREVCX0VFKCJWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IGZpbGU6JXAsIGRhdGE6JXAsIGNvdW50OiVsdW4iLAorCQkgICAgICAgZmlsZSwgZGF0YSwgKHVuc2lnbmVkIGxvbmcpY291bnQpOworKi8KIAkJcmV0dXJuIHNhYTcxNDZfdmlkZW9fdW9wcy5yZWFkKGZpbGUsZGF0YSxjb3VudCxwcG9zKTsKLQkJfQotCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRTogewotLy8JCURFQl9FRSgoIlY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6IGZpbGU6JXAsIGRhdGE6JXAsIGNvdW50OiVsdVxuIiwgZmlsZSwgZGF0YSwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisvKgorCQlERUJfRUUoIlY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6IGZpbGU6JXAsIGRhdGE6JXAsIGNvdW50OiVsdVxuIiwKKwkJICAgICAgIGZpbGUsIGRhdGEsICh1bnNpZ25lZCBsb25nKWNvdW50KTsKKyovCiAJCWlmIChmaC0+ZGV2LT5leHRfdnZfZGF0YS0+Y2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVkJJX0NBUFRVUkUpCiAJCQlyZXR1cm4gc2FhNzE0Nl92YmlfdW9wcy5yZWFkKGZpbGUsZGF0YSxjb3VudCxwcG9zKTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7CisJCXJldHVybiAtRUlOVkFMOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlyZXR1cm4gMDsKQEAgLTM5OCwyMiArNDA5LDIyIEBACiB7CiAJdTMyIGlzciA9IHN0YXR1czsKIAotCURFQl9JTlQoKCJkZXY6JXAsIGlzcjoweCUwOHhcbiIsZGV2LCh1MzIpc3RhdHVzKSk7CisJREVCX0lOVCgiZGV2OiVwLCBpc3I6MHglMDh4XG4iLCBkZXYsICh1MzIpc3RhdHVzKTsKIAogCWlmICgwICE9IChpc3IgJiAoTUFTS18yNykpKSB7Ci0JCURFQl9JTlQoKCJpcnE6IFJQUzAgKDB4JTA4eCkuXG4iLGlzcikpOworCQlERUJfSU5UKCJpcnE6IFJQUzAgKDB4JTA4eClcbiIsIGlzcik7CiAJCXNhYTcxNDZfdmlkZW9fdW9wcy5pcnFfZG9uZShkZXYsaXNyKTsKIAl9CiAKIAlpZiAoMCAhPSAoaXNyICYgKE1BU0tfMjgpKSkgewogCQl1MzIgbWMyID0gc2FhNzE0Nl9yZWFkKGRldiwgTUMyKTsKIAkJaWYoIDAgIT0gKG1jMiAmIE1BU0tfMTUpKSB7Ci0JCQlERUJfSU5UKCgiaXJxOiBSUFMxIHZiaSB3b3JrYXJvdW5kICgweCUwOHgpLlxuIixpc3IpKTsKKwkJCURFQl9JTlQoImlycTogUlBTMSB2Ymkgd29ya2Fyb3VuZCAoMHglMDh4KVxuIiwgaXNyKTsKIAkJCXdha2VfdXAoJmRldi0+dnZfZGF0YS0+dmJpX3dxKTsKIAkJCXNhYTcxNDZfd3JpdGUoZGV2LE1DMiwgTUFTS18zMSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJREVCX0lOVCgoImlycTogUlBTMSAoMHglMDh4KS5cbiIsaXNyKSk7CisJCURFQl9JTlQoImlycTogUlBTMSAoMHglMDh4KVxuIiwgaXNyKTsKIAkJc2FhNzE0Nl92YmlfdW9wcy5pcnFfZG9uZShkZXYsaXNyKTsKIAl9CiB9CkBAIC00MjksMTMgKzQ0MCwxMyBAQAogCiAJdnYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FhNzE0Nl92diksIEdGUF9LRVJORUwpOwogCWlmICh2diA9PSBOVUxMKSB7Ci0JCUVSUigoIm91dCBvZiBtZW1vcnkuIGFib3J0aW5nLlxuIikpOworCQlFUlIoIm91dCBvZiBtZW1vcnkuIGFib3J0aW5nLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlleHRfdnYtPm9wcyA9IHNhYTcxNDZfdmlkZW9faW9jdGxfb3BzOwogCWV4dF92di0+Y29yZV9vcHMgPSAmc2FhNzE0Nl92aWRlb19pb2N0bF9vcHM7CiAKLQlERUJfRUUoKCJkZXY6JXBcbiIsZGV2KSk7CisJREVCX0VFKCJkZXY6JXBcbiIsIGRldik7CiAKIAkvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIHZpZGVvIHBhcnRzIG9mIHRoZSBzYWE3MTQ2ICovCiAJc2FhNzE0Nl93cml0ZShkZXYsIEJDU19DVFJMLCAweDgwNDAwMDQwKTsKQEAgLTQ1MCw3ICs0NjEsNyBAQAogCiAJdnYtPmRfY2xpcHBpbmcuY3B1X2FkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBjaSwgU0FBNzE0Nl9DTElQUElOR19NRU0sICZ2di0+ZF9jbGlwcGluZy5kbWFfaGFuZGxlKTsKIAlpZiggTlVMTCA9PSB2di0+ZF9jbGlwcGluZy5jcHVfYWRkciApIHsKLQkJRVJSKCgib3V0IG9mIG1lbW9yeS4gYWJvcnRpbmcuXG4iKSk7CisJCUVSUigib3V0IG9mIG1lbW9yeS4gYWJvcnRpbmcuXG4iKTsKIAkJa2ZyZWUodnYpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNDcxLDcgKzQ4Miw3IEBACiB7CiAJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwogCi0JREVCX0VFKCgiZGV2OiVwXG4iLGRldikpOworCURFQl9FRSgiZGV2OiVwXG4iLCBkZXYpOwogCiAJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBjaSwgU0FBNzE0Nl9DTElQUElOR19NRU0sIHZ2LT5kX2NsaXBwaW5nLmNwdV9hZGRyLCB2di0+ZF9jbGlwcGluZy5kbWFfaGFuZGxlKTsKQEAgLTQ5MCw3ICs1MDEsNyBAQAogCWludCBlcnI7CiAJaW50IGk7CiAKLQlERUJfRUUoKCJkZXY6JXAsIG5hbWU6JyVzJywgdHlwZTolZFxuIixkZXYsbmFtZSx0eXBlKSk7CisJREVCX0VFKCJkZXY6JXAsIG5hbWU6JyVzJywgdHlwZTolZFxuIiwgZGV2LCBuYW1lLCB0eXBlKTsKIAogCS8vIHJlbGVhc2VkIGJ5IHZmZC0+cmVsZWFzZQogCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOwpAQCAtNTA5LDEzICs1MjAsMTMgQEAKIAogCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZmQsIHR5cGUsIC0xKTsKIAlpZiAoZXJyIDwgMCkgewotCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIikpOworCQlFUlIoImNhbm5vdCByZWdpc3RlciB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKTsKIAkJdmlkZW9fZGV2aWNlX3JlbGVhc2UodmZkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlJTkZPKCgiJXM6IHJlZ2lzdGVyZWQgZGV2aWNlICVzIFt2NGwyXVxuIiwKLQkJZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZmZCkpKTsKKwlwcl9pbmZvKCIlczogcmVnaXN0ZXJlZCBkZXZpY2UgJXMgW3Y0bDJdXG4iLAorCQlkZXYtPm5hbWUsIHZpZGVvX2RldmljZV9ub2RlX25hbWUodmZkKSk7CiAKIAkqdmlkID0gdmZkOwogCXJldHVybiAwOwpAQCAtNTI0LDcgKzUzNSw3IEBACiAKIGludCBzYWE3MTQ2X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKip2aWQsIHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2KQogewotCURFQl9FRSgoImRldjolcFxuIixkZXYpKTsKKwlERUJfRUUoImRldjolcFxuIiwgZGV2KTsKIAogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCp2aWQpOwogCSp2aWQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9obHAuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaGxwLmMKaW5kZXggMWQxZDhkMi4uYmMxZjU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9obHAuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2hscC5jCkBAIC0xLDQgKzEsNyBAQAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc2FhNzE0Nl92di5oPgogCiBzdGF0aWMgdm9pZCBjYWxjdWxhdGVfb3V0cHV0X2Zvcm1hdF9yZWdpc3RlcihzdHJ1Y3Qgc2FhNzE0Nl9kZXYqIHNhYSwgdTMyIHBhbGV0dGUsIHUzMiogY2xpcF9mb3JtYXQpCkBAIC03MTEsOCArNzE0LDggQEAKIAogCWludCBkZXB0aCA9IHNmbXQtPmRlcHRoOwogCi0JREVCX0NBUCgoIltzaXplPSVkeCVkLGZpZWxkcz0lc11cbiIsCi0JCXdpZHRoLGhlaWdodCx2NGwyX2ZpZWxkX25hbWVzW2ZpZWxkXSkpOworCURFQl9DQVAoIltzaXplPSVkeCVkLGZpZWxkcz0lc11cbiIsCisJCXdpZHRoLCBoZWlnaHQsIHY0bDJfZmllbGRfbmFtZXNbZmllbGRdKTsKIAogCWlmKCBieXRlc3BlcmxpbmUgIT0gMCkgewogCQl2ZG1hMS5waXRjaCA9IGJ5dGVzcGVybGluZSoyOwpAQCAtODM3LDggKzg0MCw4IEBACiAJQlVHX09OKDAgPT0gYnVmLT5wdFsxXS5kbWEpOwogCUJVR19PTigwID09IGJ1Zi0+cHRbMl0uZG1hKTsKIAotCURFQl9DQVAoKCJbc2l6ZT0lZHglZCxmaWVsZHM9JXNdXG4iLAotCQl3aWR0aCxoZWlnaHQsdjRsMl9maWVsZF9uYW1lc1tmaWVsZF0pKTsKKwlERUJfQ0FQKCJbc2l6ZT0lZHglZCxmaWVsZHM9JXNdXG4iLAorCQl3aWR0aCwgaGVpZ2h0LCB2NGwyX2ZpZWxkX25hbWVzW2ZpZWxkXSk7CiAKIAkvKiBmaXhtZTogbG9vayBhdCBieXRlc3BlcmxpbmUhICovCiAKQEAgLTk5OCwxMiArMTAwMSwxMiBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAl1MzIgdmRtYTFfcHJvdF9hZGRyOwogCi0JREVCX0NBUCgoImJ1ZjolcCwgbmV4dDolcFxuIixidWYsbmV4dCkpOworCURFQl9DQVAoImJ1ZjolcCwgbmV4dDolcFxuIiwgYnVmLCBuZXh0KTsKIAogCXZkbWExX3Byb3RfYWRkciA9IHNhYTcxNDZfcmVhZChkZXYsIFBST1RfQUREUjEpOwogCWlmKCAwID09IHZkbWExX3Byb3RfYWRkciApIHsKIAkJLyogY2xlYXIgb3V0IGJlZ2lubmluZyBvZiBzdHJlYW1pbmcgYml0IChycHMgcmVnaXN0ZXIgMCkqLwotCQlERUJfQ0FQKCgiZm9yY2luZyBzeW5jIHRvIG5ldyBmcmFtZVxuIikpOworCQlERUJfQ0FQKCJmb3JjaW5nIHN5bmMgdG8gbmV3IGZyYW1lXG4iKTsKIAkJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgTUFTS18yNyApOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaTJjLmMKaW5kZXggYjJiYTlkYy4uMjIwMjcxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2kyYy5jCkBAIC0xLDggKzEsMTAgQEAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KIAogc3RhdGljIHUzMiBzYWE3MTQ2X2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKLS8vZm0JREVCX0kyQygoIiclcycuXG4iLCBhZGFwdGVyLT5uYW1lKSk7CisJLyogREVCX0kyQygiJyVzJ1xuIiwgYWRhcHRlci0+bmFtZSk7ICovCiAKIAlyZXR1cm4JICBJMkNfRlVOQ19JMkMKIAkJfCBJMkNfRlVOQ19TTUJVU19RVUlDSwpAQCAtMTQsOSArMTYsNyBAQAogc3RhdGljIGlubGluZSB1MzIgc2FhNzE0Nl9pMmNfc3RhdHVzKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2KQogewogCXUzMiBpaWNzdGEgPSBzYWE3MTQ2X3JlYWQoZGV2LCBJMkNfU1RBVFVTKTsKLS8qCi0JREVCX0kyQygoInN0YXR1czogMHglMDh4XG4iLGlpY3N0YSkpOwotKi8KKwkvKiBERUJfSTJDKCJzdGF0dXM6IDB4JTA4eFxuIiwgaWljc3RhKTsgKi8KIAlyZXR1cm4gaWljc3RhOwogfQogCkBAIC0zOSwxMCArMzksMTEgQEAKIAkgICBwbHVzIG9uZSBleHRyYSBieXRlIHRvIGFkZHJlc3MgdGhlIGRldmljZSAqLwogCW1lbSA9IDEgKyAoKG1lbS0xKSAvIDMpOwogCi0JLyogd2UgYXNzdW1lIHRoYXQgb3AgcG9pbnRzIHRvIGEgbWVtb3J5IG9mIGF0IGxlYXN0IFNBQTcxNDZfSTJDX01FTSBieXRlcwotCSAgIHNpemUuIGlmIHdlIGV4Y2VlZCB0aGlzIGxpbWl0Li4uICovCi0JaWYgKCAoNCptZW0pID4gU0FBNzE0Nl9JMkNfTUVNICkgewotLy9mbQkJREVCX0kyQygoImNhbm5vdCBwcmVwYXJlIGkyYy1tZXNzYWdlLlxuIikpOworCS8qIHdlIGFzc3VtZSB0aGF0IG9wIHBvaW50cyB0byBhIG1lbW9yeSBvZiBhdCBsZWFzdAorCSAqIFNBQTcxNDZfSTJDX01FTSBieXRlcyBzaXplLiBpZiB3ZSBleGNlZWQgdGhpcyBsaW1pdC4uLgorCSAqLworCWlmICgoNCAqIG1lbSkgPiBTQUE3MTQ2X0kyQ19NRU0pIHsKKwkJLyogREVCX0kyQygiY2Fubm90IHByZXBhcmUgaTJjLW1lc3NhZ2VcbiIpOyAqLwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEyMyw3ICsxMjQsNyBAQAogCWlmICggMCAhPSAoIHN0YXR1cyAmIFNBQTcxNDZfSTJDX0JVU1kpICkgewogCiAJCS8qIHllcywga2lsbCBvbmdvaW5nIG9wZXJhdGlvbiAqLwotCQlERUJfSTJDKCgiYnVzeV9zdGF0ZSBkZXRlY3RlZC5cbiIpKTsKKwkJREVCX0kyQygiYnVzeV9zdGF0ZSBkZXRlY3RlZFxuIik7CiAKIAkJLyogc2V0ICJBQk9SVC1PUEVSQVRJT04iLWJpdCAoYml0IDcpKi8KIAkJc2FhNzE0Nl93cml0ZShkZXYsIEkyQ19TVEFUVVMsIChkZXYtPmkyY19iaXRyYXRlIHwgTUFTS18wNykpOwpAQCAtMTQxLDcgKzE0Miw3IEBACiAKIAlpZiAoIGRldi0+aTJjX2JpdHJhdGUgIT0gc3RhdHVzICkgewogCi0JCURFQl9JMkMoKCJlcnJvcl9zdGF0ZSBkZXRlY3RlZC4gc3RhdHVzOjB4JTA4eFxuIixzdGF0dXMpKTsKKwkJREVCX0kyQygiZXJyb3Jfc3RhdGUgZGV0ZWN0ZWQuIHN0YXR1czoweCUwOHhcbiIsIHN0YXR1cyk7CiAKIAkJLyogUmVwZWF0IHRoZSBhYm9ydCBvcGVyYXRpb24uIFRoaXMgc2VlbXMgdG8gYmUgbmVjZXNzYXJ5CiAJCSAgIGFmdGVyIHNlcmlvdXMgcHJvdG9jb2wgZXJyb3JzIGNhdXNlZCBieSBlLmcuIHRoZSBTQUE3NzQwICovCkBAIC0xNjQsNyArMTY1LDcgQEAKIAkvKiBpZiBhbnkgZXJyb3IgaXMgc3RpbGwgcHJlc2VudCwgYSBmYXRhbCBlcnJvciBoYXMgb2NjdXJyZWQgLi4uICovCiAJc3RhdHVzID0gc2FhNzE0Nl9pMmNfc3RhdHVzKGRldik7CiAJaWYgKCBkZXYtPmkyY19iaXRyYXRlICE9IHN0YXR1cyApIHsKLQkJREVCX0kyQygoImZhdGFsIGVycm9yLiBzdGF0dXM6MHglMDh4XG4iLHN0YXR1cykpOworCQlERUJfSTJDKCJmYXRhbCBlcnJvci4gc3RhdHVzOjB4JTA4eFxuIiwgc3RhdHVzKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTgxLDcgKzE4Miw4IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCiAJLyogd3JpdGUgb3V0IGkyYy1jb21tYW5kICovCi0JREVCX0kyQygoImJlZm9yZTogMHglMDh4IChzdGF0dXM6IDB4JTA4eCksICVkXG4iLCpkd29yZCxzYWE3MTQ2X3JlYWQoZGV2LCBJMkNfU1RBVFVTKSwgZGV2LT5pMmNfb3ApKTsKKwlERUJfSTJDKCJiZWZvcmU6IDB4JTA4eCAoc3RhdHVzOiAweCUwOHgpLCAlZFxuIiwKKwkJKmR3b3JkLCBzYWE3MTQ2X3JlYWQoZGV2LCBJMkNfU1RBVFVTKSwgZGV2LT5pMmNfb3ApOwogCiAJaWYoIDAgIT0gKFNBQTcxNDZfVVNFX0kyQ19JUlEgJiBkZXYtPmV4dC0+ZmxhZ3MpKSB7CiAKQEAgLTIwMiw3ICsyMDQsNyBAQAogCQkJCS8qIGEgc2lnbmFsIGFycml2ZWQgKi8KIAkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlcyBbaXJxXTogdGltZWQgb3V0IHdhaXRpbmcgZm9yIGVuZCBvZiB4ZmVyXG4iLAorCQkJcHJfd2FybigiJXMgJXMgW2lycV06IHRpbWVkIG91dCB3YWl0aW5nIGZvciBlbmQgb2YgeGZlclxuIiwKIAkJCQlkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0yMjAsNyArMjIyLDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsdGltZW91dCkpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlczogdGltZWQgb3V0IHdhaXRpbmcgZm9yIE1DMlxuIiwKKwkJCQlwcl93YXJuKCIlcyAlczogdGltZWQgb3V0IHdhaXRpbmcgZm9yIE1DMlxuIiwKIAkJCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CkBAIC0yMzcsNyArMjM5LDcgQEAKIAkJCQkvKiB0aGlzIGlzIG5vcm1hbCB3aGVuIHByb2JpbmcgdGhlIGJ1cwogCQkJCSAqIChubyBhbnN3ZXIgZnJvbSBub25leGlzaXN0YW50IGRldmljZS4uLikKIAkJCQkgKi8KLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlcyBbcG9sbF06IHRpbWVkIG91dCB3YWl0aW5nIGZvciBlbmQgb2YgeGZlclxuIiwKKwkJCQlwcl93YXJuKCIlcyAlcyBbcG9sbF06IHRpbWVkIG91dCB3YWl0aW5nIGZvciBlbmQgb2YgeGZlclxuIiwKIAkJCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CkBAIC0yNTcsMjQgKzI1OSwyNCBAQAogCQlpZiAoIDAgPT0gKHN0YXR1cyAmIFNBQTcxNDZfSTJDX0VSUikgfHwKIAkJICAgICAwID09IChzdGF0dXMgJiBTQUE3MTQ2X0kyQ19CVVNZKSApIHsKIAkJCS8qIGl0IG1heSB0YWtlIHNvbWUgdGltZSB1bnRpbCBFUlIgZ29lcyBoaWdoIC0gaWdub3JlICovCi0JCQlERUJfSTJDKCgidW5leHBlY3RlZCBpMmMgc3RhdHVzICUwNHhcbiIsIHN0YXR1cykpOworCQkJREVCX0kyQygidW5leHBlY3RlZCBpMmMgc3RhdHVzICUwNHhcbiIsIHN0YXR1cyk7CiAJCX0KIAkJaWYoIDAgIT0gKHN0YXR1cyAmIFNBQTcxNDZfSTJDX1NQRVJSKSApIHsKLQkJCURFQl9JMkMoKCJlcnJvciBkdWUgdG8gaW52YWxpZCBzdGFydC9zdG9wIGNvbmRpdGlvbi5cbiIpKTsKKwkJCURFQl9JMkMoImVycm9yIGR1ZSB0byBpbnZhbGlkIHN0YXJ0L3N0b3AgY29uZGl0aW9uXG4iKTsKIAkJfQogCQlpZiggMCAhPSAoc3RhdHVzICYgU0FBNzE0Nl9JMkNfRFRFUlIpICkgewotCQkJREVCX0kyQygoImVycm9yIGluIGRhdGEgdHJhbnNtaXNzaW9uLlxuIikpOworCQkJREVCX0kyQygiZXJyb3IgaW4gZGF0YSB0cmFuc21pc3Npb25cbiIpOwogCQl9CiAJCWlmKCAwICE9IChzdGF0dXMgJiBTQUE3MTQ2X0kyQ19EUkVSUikgKSB7Ci0JCQlERUJfSTJDKCgiZXJyb3Igd2hlbiByZWNlaXZpbmcgZGF0YS5cbiIpKTsKKwkJCURFQl9JMkMoImVycm9yIHdoZW4gcmVjZWl2aW5nIGRhdGFcbiIpOwogCQl9CiAJCWlmKCAwICE9IChzdGF0dXMgJiBTQUE3MTQ2X0kyQ19BTCkgKSB7Ci0JCQlERUJfSTJDKCgiZXJyb3IgYmVjYXVzZSBhcmJpdHJhdGlvbiBsb3N0LlxuIikpOworCQkJREVCX0kyQygiZXJyb3IgYmVjYXVzZSBhcmJpdHJhdGlvbiBsb3N0XG4iKTsKIAkJfQogCiAJCS8qIHdlIGhhbmRsZSBhZGRyZXNzLWVycm9ycyBoZXJlICovCiAJCWlmKCAwICE9IChzdGF0dXMgJiBTQUE3MTQ2X0kyQ19BUEVSUikgKSB7Ci0JCQlERUJfSTJDKCgiZXJyb3IgaW4gYWRkcmVzcyBwaGFzZS5cbiIpKTsKKwkJCURFQl9JMkMoImVycm9yIGluIGFkZHJlc3MgcGhhc2VcbiIpOwogCQkJcmV0dXJuIC1FUkVNT1RFSU87CiAJCX0KIApAQCAtMjg0LDcgKzI4Niw3IEBACiAJLyogcmVhZCBiYWNrIGRhdGEsIGp1c3QgaW4gY2FzZSB3ZSB3ZXJlIHJlYWRpbmcgLi4uICovCiAJKmR3b3JkID0gY3B1X3RvX2xlMzIoc2FhNzE0Nl9yZWFkKGRldiwgSTJDX1RSQU5TRkVSKSk7CiAKLQlERUJfSTJDKCgiYWZ0ZXI6IDB4JTA4eFxuIiwqZHdvcmQpKTsKKwlERUJfSTJDKCJhZnRlcjogMHglMDh4XG4iLCAqZHdvcmQpOwogCXJldHVybiAwOwogfQogCkBAIC0yOTksNyArMzAxLDcgQEAKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWZvcihpPTA7aTxudW07aSsrKSB7Ci0JCURFQl9JMkMoKCJtc2c6JWQvJWRcbiIsaSsxLG51bSkpOworCQlERUJfSTJDKCJtc2c6JWQvJWRcbiIsIGkrMSwgbnVtKTsKIAl9CiAKIAkvKiBwcmVwYXJlIHRoZSBtZXNzYWdlKHMpLCBnZXQgbnVtYmVyIG9mIHUzMnMgdG8gdHJhbnNmZXIgKi8KQEAgLTMxNiw3ICszMTgsNyBAQAogCQkvKiByZXNldCB0aGUgaTJjLWRldmljZSBpZiBuZWNlc3NhcnkgKi8KIAkJZXJyID0gc2FhNzE0Nl9pMmNfcmVzZXQoZGV2KTsKIAkJaWYgKCAwID4gZXJyICkgewotCQkJREVCX0kyQygoImNvdWxkIG5vdCByZXNldCBpMmMtZGV2aWNlLlxuIikpOworCQkJREVCX0kyQygiY291bGQgbm90IHJlc2V0IGkyYy1kZXZpY2VcbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtMzM2LDcgKzMzOCw3IEBACiAJCQkJICAgYWRkcmVzcyBlcnJvciBhbmQgdHJ1c3QgdGhlIHNhYTcxNDYgYWRkcmVzcyBlcnJvciBkZXRlY3Rpb24uICovCiAJCQkJaWYgKC1FUkVNT1RFSU8gPT0gZXJyICYmIDAgIT0gKFNBQTcxNDZfVVNFX0kyQ19JUlEgJiBkZXYtPmV4dC0+ZmxhZ3MpKQogCQkJCQlnb3RvIG91dDsKLQkJCQlERUJfSTJDKCgiZXJyb3Igd2hpbGUgc2VuZGluZyBtZXNzYWdlKHMpLiBzdGFydGluZyBhZ2Fpbi5cbiIpKTsKKwkJCQlERUJfSTJDKCJlcnJvciB3aGlsZSBzZW5kaW5nIG1lc3NhZ2UocykuIHN0YXJ0aW5nIGFnYWluXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMzU2LDEzICszNTgsMTMgQEAKIAogCS8qIGlmIGFueSB0aGluZ3MgaGFkIHRvIGJlIHJlYWQsIGdldCB0aGUgcmVzdWx0cyAqLwogCWlmICggMCAhPSBzYWE3MTQ2X2kyY19tc2dfY2xlYW51cChtc2dzLCBudW0sIGJ1ZmZlcikpIHsKLQkJREVCX0kyQygoImNvdWxkIG5vdCBjbGVhbnVwIGkyYy1tZXNzYWdlLlxuIikpOworCQlERUJfSTJDKCJjb3VsZCBub3QgY2xlYW51cCBpMmMtbWVzc2FnZVxuIik7CiAJCWVyciA9IC0xOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBkZWxpdmVyZWQgbWVzc2FnZXMgKi8KLQlERUJfSTJDKCgidHJhbnNtaXNzaW9uIHN1Y2Nlc3NmdWwuIChtc2c6JWQpLlxuIixlcnIpKTsKKwlERUJfSTJDKCJ0cmFuc21pc3Npb24gc3VjY2Vzc2Z1bC4gKG1zZzolZClcbiIsIGVycik7CiBvdXQ6CiAJLyogYW5vdGhlciBidWcgaW4gcmV2aXNpb24gMDogdGhlIGkyYy1yZWdpc3RlcnMgZ2V0IHVwbG9hZGVkIHJhbmRvbWx5IGJ5IG90aGVyCiAJICAgdXBsb2Fkcywgc28gd2UgYmV0dGVyIGNsZWFyIHRoZW0gb3V0IGJlZm9yZSBjb250aW51aW5nICovCkBAIC0zNzAsNyArMzcyLDcgQEAKIAkJX19sZTMyIHplcm8gPSAwOwogCQlzYWE3MTQ2X2kyY19yZXNldChkZXYpOwogCQlpZiggMCAhPSBzYWE3MTQ2X2kyY193cml0ZW91dChkZXYsICZ6ZXJvLCBzaG9ydF9kZWxheSkpIHsKLQkJCUlORk8oKCJyZXZpc2lvbiAwIGVycm9yLiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uXG4iKSk7CisJCQlwcl9pbmZvKCJyZXZpc2lvbiAwIGVycm9yLiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW5cbiIpOwogCQl9CiAJfQogCkBAIC00MDAsNyArNDAyLDcgQEAKIAogaW50IHNhYTcxNDZfaTJjX2FkYXB0ZXJfcHJlcGFyZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcHRlciwgdTMyIGJpdHJhdGUpCiB7Ci0JREVCX0VFKCgiYml0cmF0ZTogMHglMDh4XG4iLGJpdHJhdGUpKTsKKwlERUJfRUUoImJpdHJhdGU6IDB4JTA4eFxuIiwgYml0cmF0ZSk7CiAKIAkvKiBlbmFibGUgaTJjLXBvcnQgcGlucyAqLwogCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzEsIChNQVNLXzA4IHwgTUFTS18yNCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92YmkuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmJpLmMKaW5kZXggYWZlODU4MC4uYjJlNzE4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92YmkuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZiaS5jCkBAIC0xNCw3ICsxNCw3IEBACiAKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAotCURFQl9WQkkoKCJkZXY6JXBcbiIsZGV2KSk7CisJREVCX1ZCSSgiZGV2OiVwXG4iLCBkZXYpOwogCiAJLyogb25jZSBhZ2FpbiwgYSBidWcgaW4gdGhlIHNhYTcxNDY6IHRoZSBicnMgYWNxdWlzaXRpb24KIAkgICBpcyBidWdneSBhbmQgZXNwZWNpYWxseSB0aGUgQlhPLWNvdW50ZXIgZG9lcyBub3Qgd29yawpAQCAtNDAsMTQgKzQwLDE0IEBACiAJV1JJVEVfUlBTMSgweGMwMDAwMDhjKTsKIAkvKiB3YWl0IGZvciB2YmlfYSBvciB2YmlfYiovCiAJaWYgKCAwICE9IChTQUE3MTQ2X1VTRV9QT1JUX0JfRk9SX1ZCSSAmIGRldi0+ZXh0X3Z2X2RhdGEtPmZsYWdzKSkgewotCQlERUJfRCgoIi4uLnVzaW5nIHBvcnQgYlxuIikpOworCQlERUJfRCgiLi4udXNpbmcgcG9ydCBiXG4iKTsKIAkJV1JJVEVfUlBTMShDTURfUEFVU0UgfCBDTURfT0FOIHwgQ01EX1NJRzEgfCBDTURfRV9GSURfQik7CiAJCVdSSVRFX1JQUzEoQ01EX1BBVVNFIHwgQ01EX09BTiB8IENNRF9TSUcxIHwgQ01EX09fRklEX0IpOwogLyoKIAkJV1JJVEVfUlBTMShDTURfUEFVU0UgfCBNQVNLXzA5KTsKICovCiAJfSBlbHNlIHsKLQkJREVCX0QoKCIuLi51c2luZyBwb3J0IGFcbiIpKTsKKwkJREVCX0QoIi4uLnVzaW5nIHBvcnQgYVxuIik7CiAJCVdSSVRFX1JQUzEoQ01EX1BBVVNFIHwgTUFTS18xMCk7CiAJfQogCS8qIHVwbG9hZCBicnMgKi8KQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAJCXNjaGVkdWxlKCk7CiAKLQkJREVCX1ZCSSgoImJycyBidWcgd29ya2Fyb3VuZCAlZC8xLlxuIixpKSk7CisJCURFQl9WQkkoImJycyBidWcgd29ya2Fyb3VuZCAlZC8xXG4iLCBpKTsKIAogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmdnYtPnZiaV93cSwgJndhaXQpOwogCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKQEAgLTExNiw3ICsxMTYsOCBAQAogCiAJCWlmKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAKLQkJCURFQl9WQkkoKCJhYm9ydGVkIChycHM6MHglMDh4KS5cbiIsc2FhNzE0Nl9yZWFkKGRldixSUFNfQUREUjEpKSk7CisJCQlERUJfVkJJKCJhYm9ydGVkIChycHM6MHglMDh4KVxuIiwKKwkJCQlzYWE3MTQ2X3JlYWQoZGV2LCBSUFNfQUREUjEpKTsKIAogCQkJLyogc3RvcCBycHMxIGZvciBzdXJlICovCiAJCQlzYWE3MTQ2X3dyaXRlKGRldiwgTUMxLCBNQVNLXzI5KTsKQEAgLTIwNyw3ICsyMDgsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwogCi0JREVCX1ZCSSgoImRldjolcCwgYnVmOiVwLCBuZXh0OiVwXG4iLGRldixidWYsbmV4dCkpOworCURFQl9WQkkoImRldjolcCwgYnVmOiVwLCBuZXh0OiVwXG4iLCBkZXYsIGJ1ZiwgbmV4dCk7CiAJc2FhNzE0Nl9zZXRfdmJpX2NhcHR1cmUoZGV2LGJ1ZixuZXh0KTsKIAogCW1vZF90aW1lcigmdnYtPnZiaV9xLnRpbWVvdXQsIGppZmZpZXMrQlVGRkVSX1RJTUVPVVQpOwpAQCAtMjI4LDEwICsyMjksMTAgQEAKIAlsbGVuZ3RoID0gdmJpX3BpeGVsX3RvX2NhcHR1cmU7CiAJc2l6ZSA9IGxpbmVzICogbGxlbmd0aDsKIAotCURFQl9WQkkoKCJ2YjolcFxuIix2YikpOworCURFQl9WQkkoInZiOiVwXG4iLCB2Yik7CiAKIAlpZiAoMCAhPSBidWYtPnZiLmJhZGRyICAmJiAgYnVmLT52Yi5ic2l6ZSA8IHNpemUpIHsKLQkJREVCX1ZCSSgoInNpemUgbWlzbWF0Y2guXG4iKSk7CisJCURFQl9WQkkoInNpemUgbWlzbWF0Y2hcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI2Myw3ICsyNjQsNyBAQAogCXJldHVybiAwOwogCiAgb29wczoKLQlERUJfVkJJKCgiZXJyb3Igb3V0LlxuIikpOworCURFQl9WQkkoImVycm9yIG91dFxuIik7CiAJc2FhNzE0Nl9kbWFfZnJlZShkZXYscSxidWYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTI3OSw3ICsyODAsNyBAQAogCSpzaXplID0gbGluZXMgKiBsbGVuZ3RoOwogCSpjb3VudCA9IDI7CiAKLQlERUJfVkJJKCgiY291bnQ6JWQsIHNpemU6JWRcbiIsKmNvdW50LCpzaXplKSk7CisJREVCX1ZCSSgiY291bnQ6JWQsIHNpemU6JWRcbiIsICpjb3VudCwgKnNpemUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTIsNyArMjkzLDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAJc3RydWN0IHNhYTcxNDZfYnVmICpidWYgPSAoc3RydWN0IHNhYTcxNDZfYnVmICopdmI7CiAKLQlERUJfVkJJKCgidmI6JXBcbiIsdmIpKTsKKwlERUJfVkJJKCJ2YjolcFxuIiwgdmIpOwogCXNhYTcxNDZfYnVmZmVyX3F1ZXVlKGRldiwmdnYtPnZiaV9xLGJ1Zik7CiB9CiAKQEAgLTMwMyw3ICszMDQsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gZmgtPmRldjsKIAlzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1ZiA9IChzdHJ1Y3Qgc2FhNzE0Nl9idWYgKil2YjsKIAotCURFQl9WQkkoKCJ2YjolcFxuIix2YikpOworCURFQl9WQkkoInZiOiVwXG4iLCB2Yik7CiAJc2FhNzE0Nl9kbWFfZnJlZShkZXYscSxidWYpOwogfQogCkBAIC0zMjEsNyArMzIyLDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7CiAJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JREVCX1ZCSSgoImRldjolcCwgZmg6JXBcbiIsZGV2LCBmaCkpOworCURFQl9WQkkoImRldjolcCwgZmg6JXBcbiIsIGRldiwgZmgpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssZmxhZ3MpOwogCkBAIC0zNTQsMTQgKzM1NSwxNCBAQAogCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7CiAKLQlERUJfVkJJKCgiZGV2OiVwLCBmaDolcFxuIixkZXYsIGZoKSk7CisJREVCX1ZCSSgiZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCk7CiAKIAl2Ymlfc3RvcChmaCwgZmlsZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHZiaV9pbml0KHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYpCiB7Ci0JREVCX1ZCSSgoImRldjolcFxuIixkZXYpKTsKKwlERUJfVkJJKCJkZXY6JXBcbiIsIGRldik7CiAKIAlJTklUX0xJU1RfSEVBRCgmdnYtPnZiaV9xLnF1ZXVlKTsKIApAQCAtMzgwLDExICszODEsMTEgQEAKIAl1MzIgYXJidHJfY3RybAk9IHNhYTcxNDZfcmVhZChkZXYsIFBDSV9CVF9WMSk7CiAJaW50IHJldCA9IDA7CiAKLQlERUJfVkJJKCgiZGV2OiVwLCBmaDolcFxuIixkZXYsZmgpKTsKKwlERUJfVkJJKCJkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAogCXJldCA9IHNhYTcxNDZfcmVzX2dldChmaCwgUkVTT1VSQ0VfRE1BM19CUlMpOwogCWlmICgwID09IHJldCkgewotCQlERUJfUygoImNhbm5vdCBnZXQgdmJpIFJFU09VUkNFX0RNQTNfQlJTIHJlc291cmNlXG4iKSk7CisJCURFQl9TKCJjYW5ub3QgZ2V0IHZiaSBSRVNPVVJDRV9ETUEzX0JSUyByZXNvdXJjZVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC00MjUsNyArNDI2LDcgQEAKIAkJc2FhNzE0Nl93cml0ZShkZXYsIEJSU19DVFJMLCAweDAwMDAwMDAxKTsKIAogCQlpZiAoMCAhPSAocmV0ID0gdmJpX3dvcmthcm91bmQoZGV2KSkpIHsKLQkJCURFQl9WQkkoKCJ2Ymkgd29ya2Fyb3VuZCBmYWlsZWQhXG4iKSk7CisJCQlERUJfVkJJKCJ2Ymkgd29ya2Fyb3VuZCBmYWlsZWQhXG4iKTsKIAkJCS8qIHJldHVybiByZXQ7Ki8KIAkJfQogCX0KQEAgLTQzOSw3ICs0NDAsNyBAQAogewogCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7Ci0JREVCX1ZCSSgoImRldjolcCwgZmg6JXBcbiIsZGV2LGZoKSk7CisJREVCX1ZCSSgiZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCk7CiAKIAlpZiggZmggPT0gdnYtPnZiaV9zdHJlYW1pbmcgKSB7CiAJCXZiaV9zdG9wKGZoLCBmaWxlKTsKQEAgLTQ1MywxMyArNDU0LDEzIEBACiAJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKIAogCWlmICh2di0+dmJpX3EuY3VycikgewotCQlERUJfVkJJKCgiZGV2OiVwLCBjdXJyOiVwXG4iLGRldix2di0+dmJpX3EuY3VycikpOworCQlERUJfVkJJKCJkZXY6JXAsIGN1cnI6JXBcbiIsIGRldiwgdnYtPnZiaV9xLmN1cnIpOwogCQkvKiB0aGlzIG11c3QgYmUgKz0gMiwgb25lIGNvdW50IGZvciBlYWNoIGZpZWxkICovCiAJCXZ2LT52YmlfZmllbGRjb3VudCs9MjsKIAkJdnYtPnZiaV9xLmN1cnItPnZiLmZpZWxkX2NvdW50ID0gdnYtPnZiaV9maWVsZGNvdW50OwogCQlzYWE3MTQ2X2J1ZmZlcl9maW5pc2goZGV2LCZ2di0+dmJpX3EsVklERU9CVUZfRE9ORSk7CiAJfSBlbHNlIHsKLQkJREVCX1ZCSSgoImRldjolcFxuIixkZXYpKTsKKwkJREVCX1ZCSSgiZGV2OiVwXG4iLCBkZXYpOwogCX0KIAlzYWE3MTQ2X2J1ZmZlcl9uZXh0KGRldiwmdnYtPnZiaV9xLDEpOwogCkBAIC00NzMsNyArNDc0LDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAJc3NpemVfdCByZXQgPSAwOwogCi0JREVCX1ZCSSgoImRldjolcCwgZmg6JXBcbiIsZGV2LGZoKSk7CisJREVCX1ZCSSgiZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCk7CiAKIAlpZiggTlVMTCA9PSB2di0+dmJpX3N0cmVhbWluZyApIHsKIAkJLy8gZml4bWU6IGNoZWNrIGlmIGRtYTMgaXMgYXZhaWxhYmxlCkBAIC00ODIsNyArNDgzLDggQEAKIAl9CiAKIAlpZiggZmggIT0gdnYtPnZiaV9zdHJlYW1pbmcgKSB7Ci0JCURFQl9WQkkoKCJvcGVuICVwIGlzIGFscmVhZHkgdXNpbmcgdmJpIGNhcHR1cmUuIix2di0+dmJpX3N0cmVhbWluZykpOworCQlERUJfVkJJKCJvcGVuICVwIGlzIGFscmVhZHkgdXNpbmcgdmJpIGNhcHR1cmVcbiIsCisJCQl2di0+dmJpX3N0cmVhbWluZyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMKaW5kZXggOWFhZmE0ZS4uY2UzMDUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmlkZW8uYwpAQCAtMSw1ICsxLDggQEAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIGludCBtYXhfbWVtb3J5ID0gMzI7CiAKQEAgLTk0LDcgKzk3LDcgQEAKIAkJfQogCX0KIAotCURFQl9EKCgidW5rbm93biBwaXhlbGZvcm1hdDonJTQuNHMnXG4iLChjaGFyICopJmZvdXJjYykpOworCURFQl9EKCJ1bmtub3duIHBpeGVsZm9ybWF0OiclNC40cydcbiIsIChjaGFyICopJmZvdXJjYyk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTEwNywzMiArMTEwLDMyIEBACiAJc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKIAlpbnQgcmV0ID0gMCwgZXJyID0gMDsKIAotCURFQl9FRSgoImRldjolcCwgZmg6JXBcbiIsZGV2LGZoKSk7CisJREVCX0VFKCJkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAogCS8qIGNoZWNrIGlmIHdlIGhhdmUgb3ZlcmxheSBpbmZvcm1hdGlvbnMgKi8KIAlpZiggTlVMTCA9PSBmaC0+b3YuZmggKSB7Ci0JCURFQl9EKCgibm8gb3ZlcmxheSBkYXRhIGF2YWlsYWJsZS4gdHJ5IFNfRk1UIGZpcnN0LlxuIikpOworCQlERUJfRCgibm8gb3ZlcmxheSBkYXRhIGF2YWlsYWJsZS4gdHJ5IFNfRk1UIGZpcnN0LlxuIik7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAogCS8qIGNoZWNrIGlmIHN0cmVhbWluZyBjYXB0dXJlIGlzIHJ1bm5pbmcgKi8KIAlpZiAoSVNfQ0FQVFVSRV9BQ1RJVkUoZmgpICE9IDApIHsKLQkJREVCX0QoKCJzdHJlYW1pbmcgY2FwdHVyZSBpcyBhY3RpdmUuXG4iKSk7CisJCURFQl9EKCJzdHJlYW1pbmcgY2FwdHVyZSBpcyBhY3RpdmVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCS8qIGNoZWNrIGlmIG92ZXJsYXkgaXMgcnVubmluZyAqLwogCWlmIChJU19PVkVSTEFZX0FDVElWRShmaCkgIT0gMCkgewogCQlpZiAodnYtPnZpZGVvX2ZoID09IGZoKSB7Ci0JCQlERUJfRCgoIm92ZXJsYXkgaXMgYWxyZWFkeSBhY3RpdmUuXG4iKSk7CisJCQlERUJfRCgib3ZlcmxheSBpcyBhbHJlYWR5IGFjdGl2ZVxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlERUJfRCgoIm92ZXJsYXkgaXMgYWxyZWFkeSBhY3RpdmUgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfRCgib3ZlcmxheSBpcyBhbHJlYWR5IGFjdGl2ZSBpbiBhbm90aGVyIG9wZW5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmICgwID09IHNhYTcxNDZfcmVzX2dldChmaCwgUkVTT1VSQ0VfRE1BMV9IUFN8UkVTT1VSQ0VfRE1BMl9DTFApKSB7Ci0JCURFQl9EKCgiY2Fubm90IGdldCBuZWNlc3Nhcnkgb3ZlcmxheSByZXNvdXJjZXNcbiIpKTsKKwkJREVCX0QoImNhbm5vdCBnZXQgbmVjZXNzYXJ5IG92ZXJsYXkgcmVzb3VyY2VzXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTE0NSwxMyArMTQ4LDEzIEBACiAJZmgtPm92LndpbiA9IGZtdC5mbXQud2luOwogCXZ2LT5vdl9kYXRhID0gJmZoLT5vdjsKIAotCURFQl9EKCgiJWR4JWQrJWQrJWQgJXMgZmllbGQ9JXNcbiIsCi0JCWZoLT5vdi53aW4udy53aWR0aCxmaC0+b3Yud2luLncuaGVpZ2h0LAotCQlmaC0+b3Yud2luLncubGVmdCxmaC0+b3Yud2luLncudG9wLAotCQl2di0+b3ZfZm10LT5uYW1lLHY0bDJfZmllbGRfbmFtZXNbZmgtPm92Lndpbi5maWVsZF0pKTsKKwlERUJfRCgiJWR4JWQrJWQrJWQgJXMgZmllbGQ9JXNcbiIsCisJICAgICAgZmgtPm92Lndpbi53LndpZHRoLCBmaC0+b3Yud2luLncuaGVpZ2h0LAorCSAgICAgIGZoLT5vdi53aW4udy5sZWZ0LCBmaC0+b3Yud2luLncudG9wLAorCSAgICAgIHZ2LT5vdl9mbXQtPm5hbWUsIHY0bDJfZmllbGRfbmFtZXNbZmgtPm92Lndpbi5maWVsZF0pOwogCiAJaWYgKDAgIT0gKHJldCA9IHNhYTcxNDZfZW5hYmxlX292ZXJsYXkoZmgpKSkgewotCQlERUJfRCgoImVuYWJsaW5nIG92ZXJsYXkgZmFpbGVkOiAlZFxuIixyZXQpKTsKKwkJREVCX0QoImVuYWJsaW5nIG92ZXJsYXkgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJc2FhNzE0Nl9yZXNfZnJlZSh2di0+dmlkZW9fZmgsIFJFU09VUkNFX0RNQTFfSFBTfFJFU09VUkNFX0RNQTJfQ0xQKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xNjgsMjIgKzE3MSwyMiBAQAogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gZmgtPmRldjsKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAKLQlERUJfRUUoKCJkZXY6JXAsIGZoOiVwXG4iLGRldixmaCkpOworCURFQl9FRSgiZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCk7CiAKIAkvKiBjaGVjayBpZiBzdHJlYW1pbmcgY2FwdHVyZSBpcyBydW5uaW5nICovCiAJaWYgKElTX0NBUFRVUkVfQUNUSVZFKGZoKSAhPSAwKSB7Ci0JCURFQl9EKCgic3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlLlxuIikpOworCQlERUJfRCgic3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAkvKiBjaGVjayBpZiBvdmVybGF5IGlzIHJ1bm5pbmcgYXQgYWxsICovCiAJaWYgKCh2di0+dmlkZW9fc3RhdHVzICYgU1RBVFVTX09WRVJMQVkpID09IDApIHsKLQkJREVCX0QoKCJubyBhY3RpdmUgb3ZlcmxheS5cbiIpKTsKKwkJREVCX0QoIm5vIGFjdGl2ZSBvdmVybGF5XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHZ2LT52aWRlb19maCAhPSBmaCkgewotCQlERUJfRCgoIm92ZXJsYXkgaXMgYWN0aXZlLCBidXQgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfRCgib3ZlcmxheSBpcyBhY3RpdmUsIGJ1dCBpbiBhbm90aGVyIG9wZW5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjY4LDcgKzI3MSw3IEBACiAJaW50IGxlbmd0aCA9IGRtYS0+c2dsZW47CiAJc3RydWN0IHNhYTcxNDZfZm9ybWF0ICpzZm10ID0gc2FhNzE0Nl9mb3JtYXRfYnlfZm91cmNjKGRldixidWYtPmZtdC0+cGl4ZWxmb3JtYXQpOwogCi0JREVCX0VFKCgiZGV2OiVwLCBidWY6JXAsIHNnX2xlbjolZFxuIixkZXYsYnVmLGxlbmd0aCkpOworCURFQl9FRSgiZGV2OiVwLCBidWY6JXAsIHNnX2xlbjolZFxuIiwgZGV2LCBidWYsIGxlbmd0aCk7CiAKIAlpZiggMCAhPSBJU19QTEFOQVIoc2ZtdC0+dHJhbnMpKSB7CiAJCXN0cnVjdCBzYWE3MTQ2X3BndGFibGUgKnB0MSA9ICZidWYtPnB0WzBdOwpAQCAtMjg4LDcgKzI5MSw4IEBACiAJCQkJbTMgPSAoKHNpemUrKHNpemUvMikrUEFHRV9TSVpFKS9QQUdFX1NJWkUpLTE7CiAJCQkJbzEgPSBzaXplJVBBR0VfU0laRTsKIAkJCQlvMiA9IChzaXplKyhzaXplLzQpKSVQQUdFX1NJWkU7Ci0JCQkJREVCX0NBUCgoInNpemU6JWQsIG0xOiVkLCBtMjolZCwgbTM6JWQsIG8xOiVkLCBvMjolZFxuIixzaXplLG0xLG0yLG0zLG8xLG8yKSk7CisJCQkJREVCX0NBUCgic2l6ZTolZCwgbTE6JWQsIG0yOiVkLCBtMzolZCwgbzE6JWQsIG8yOiVkXG4iLAorCQkJCQlzaXplLCBtMSwgbTIsIG0zLCBvMSwgbzIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAxNjogewpAQCAtMjk4LDcgKzMwMiw4IEBACiAJCQkJbTMgPSAoKDIqc2l6ZStQQUdFX1NJWkUpL1BBR0VfU0laRSktMTsKIAkJCQlvMSA9IHNpemUlUEFHRV9TSVpFOwogCQkJCW8yID0gKHNpemUrKHNpemUvMikpJVBBR0VfU0laRTsKLQkJCQlERUJfQ0FQKCgic2l6ZTolZCwgbTE6JWQsIG0yOiVkLCBtMzolZCwgbzE6JWQsIG8yOiVkXG4iLHNpemUsbTEsbTIsbTMsbzEsbzIpKTsKKwkJCQlERUJfQ0FQKCJzaXplOiVkLCBtMTolZCwgbTI6JWQsIG0zOiVkLCBvMTolZCwgbzI6JWRcbiIsCisJCQkJCXNpemUsIG0xLCBtMiwgbTMsIG8xLCBvMik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlkZWZhdWx0OiB7CkBAIC0zODcsMjMgKzM5MiwyMyBAQAogCXVuc2lnbmVkIGludCByZXNvdXJjZTsKIAlpbnQgcmV0ID0gMCwgZXJyID0gMDsKIAotCURFQl9FRSgoImRldjolcCwgZmg6JXBcbiIsZGV2LGZoKSk7CisJREVCX0VFKCJkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAogCWlmICgodnYtPnZpZGVvX3N0YXR1cyAmIFNUQVRVU19DQVBUVVJFKSAhPSAwKSB7CiAJCWlmICh2di0+dmlkZW9fZmggPT0gZmgpIHsKLQkJCURFQl9TKCgiYWxyZWFkeSBjYXB0dXJpbmcuXG4iKSk7CisJCQlERUJfUygiYWxyZWFkeSBjYXB0dXJpbmdcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJREVCX1MoKCJhbHJlYWR5IGNhcHR1cmluZyBpbiBhbm90aGVyIG9wZW4uXG4iKSk7CisJCURFQl9TKCJhbHJlYWR5IGNhcHR1cmluZyBpbiBhbm90aGVyIG9wZW5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmICgodnYtPnZpZGVvX3N0YXR1cyAmIFNUQVRVU19PVkVSTEFZKSAhPSAwKSB7Ci0JCURFQl9TKCgid2FybmluZzogc3VzcGVuZGluZyBvdmVybGF5IHZpZGVvIGZvciBzdHJlYW1pbmcgY2FwdHVyZS5cbiIpKTsKKwkJREVCX1MoIndhcm5pbmc6IHN1c3BlbmRpbmcgb3ZlcmxheSB2aWRlbyBmb3Igc3RyZWFtaW5nIGNhcHR1cmVcbiIpOwogCQl2di0+b3Zfc3VzcGVuZCA9IHZ2LT52aWRlb19maDsKIAkJZXJyID0gc2FhNzE0Nl9zdG9wX3ByZXZpZXcodnYtPnZpZGVvX2ZoKTsgLyogc2lkZSBlZmZlY3Q6IHZpZGVvX3N0YXR1cyBpcyBub3cgMCwgdmlkZW9fZmggaXMgTlVMTCAqLwogCQlpZiAoMCAhPSBlcnIpIHsKLQkJCURFQl9EKCgic3VzcGVuZGluZyB2aWRlbyBmYWlsZWQuIGFib3J0aW5nXG4iKSk7CisJCQlERUJfRCgic3VzcGVuZGluZyB2aWRlbyBmYWlsZWQuIGFib3J0aW5nXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC00MjAsNyArNDI1LDcgQEAKIAogCXJldCA9IHNhYTcxNDZfcmVzX2dldChmaCwgcmVzb3VyY2UpOwogCWlmICgwID09IHJldCkgewotCQlERUJfUygoImNhbm5vdCBnZXQgY2FwdHVyZSByZXNvdXJjZSAlZFxuIixyZXNvdXJjZSkpOworCQlERUJfUygiY2Fubm90IGdldCBjYXB0dXJlIHJlc291cmNlICVkXG4iLCByZXNvdXJjZSk7CiAJCWlmICh2di0+b3Zfc3VzcGVuZCAhPSBOVUxMKSB7CiAJCQlzYWE3MTQ2X3N0YXJ0X3ByZXZpZXcodnYtPm92X3N1c3BlbmQpOwogCQkJdnYtPm92X3N1c3BlbmQgPSBOVUxMOwpAQCAtNDQ4LDE1ICs0NTMsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCByZXNvdXJjZTsKIAl1MzIgZG1hcyA9IDA7Ci0JREVCX0VFKCgiZGV2OiVwLCBmaDolcFxuIixkZXYsZmgpKTsKKwlERUJfRUUoImRldjolcCwgZmg6JXBcbiIsIGRldiwgZmgpOwogCiAJaWYgKCh2di0+dmlkZW9fc3RhdHVzICYgU1RBVFVTX0NBUFRVUkUpICE9IFNUQVRVU19DQVBUVVJFKSB7Ci0JCURFQl9TKCgibm90IGNhcHR1cmluZy5cbiIpKTsKKwkJREVCX1MoIm5vdCBjYXB0dXJpbmdcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodnYtPnZpZGVvX2ZoICE9IGZoKSB7Ci0JCURFQl9TKCgiY2FwdHVyaW5nLCBidXQgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfUygiY2FwdHVyaW5nLCBidXQgaW4gYW5vdGhlciBvcGVuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTUzMCw3ICs1MzUsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9mb3JtYXQgKmZtdDsKIAotCURFQl9FRSgoIlZJRElPQ19TX0ZCVUZcbiIpKTsKKwlERUJfRUUoIlZJRElPQ19TX0ZCVUZcbiIpOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtNTQyLDEzICs1NDcsMTMgQEAKIAogCS8qIHBsYW5hciBmb3JtYXRzIGFyZSBub3QgYWxsb3dlZCBmb3Igb3ZlcmxheSB2aWRlbywgY2xpcHBpbmcgYW5kIHZpZGVvIGRtYSB3b3VsZCBjbGFzaCAqLwogCWlmIChmbXQtPmZsYWdzICYgRk9STUFUX0lTX1BMQU5BUikKLQkJREVCX1MoKCJwbGFuYXIgcGl4ZWxmb3JtYXQgJyU0LjRzJyBub3QgYWxsb3dlZCBmb3Igb3ZlcmxheVxuIiwKLQkJCQkJKGNoYXIgKikmZm10LT5waXhlbGZvcm1hdCkpOworCQlERUJfUygicGxhbmFyIHBpeGVsZm9ybWF0ICclNC40cycgbm90IGFsbG93ZWQgZm9yIG92ZXJsYXlcbiIsCisJCSAgICAgIChjaGFyICopJmZtdC0+cGl4ZWxmb3JtYXQpOwogCiAJLyogY2hlY2sgaWYgb3ZlcmxheSBpcyBydW5uaW5nICovCiAJaWYgKElTX09WRVJMQVlfQUNUSVZFKGZoKSAhPSAwKSB7CiAJCWlmICh2di0+dmlkZW9fZmggIT0gZmgpIHsKLQkJCURFQl9EKCgicmVmdXNpbmcgdG8gY2hhbmdlIGZyYW1lYnVmZmVyIGluZm9ybWF0aW9ucyB3aGlsZSBvdmVybGF5IGlzIGFjdGl2ZSBpbiBhbm90aGVyIG9wZW4uXG4iKSk7CisJCQlERUJfRCgicmVmdXNpbmcgdG8gY2hhbmdlIGZyYW1lYnVmZmVyIGluZm9ybWF0aW9ucyB3aGlsZSBvdmVybGF5IGlzIGFjdGl2ZSBpbiBhbm90aGVyIG9wZW5cbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KQEAgLTU1OSw3ICs1NjQsNyBAQAogCiAJaWYgKHZ2LT5vdl9mYi5mbXQuYnl0ZXNwZXJsaW5lIDwgdnYtPm92X2ZiLmZtdC53aWR0aCkgewogCQl2di0+b3ZfZmIuZm10LmJ5dGVzcGVybGluZSA9IHZ2LT5vdl9mYi5mbXQud2lkdGggKiBmbXQtPmRlcHRoIC8gODsKLQkJREVCX0QoKCJzZXR0aW5nIGJ5dGVzcGVybGluZSB0byAlZFxuIiwgdnYtPm92X2ZiLmZtdC5ieXRlc3BlcmxpbmUpKTsKKwkJREVCX0QoInNldHRpbmcgYnl0ZXNwZXJsaW5lIHRvICVkXG4iLCB2di0+b3ZfZmIuZm10LmJ5dGVzcGVybGluZSk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNTg4LDcgKzU5Myw3IEBACiAJaWYgKGN0cmwgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlERUJfRUUoKCJWSURJT0NfUVVFUllDVFJMOiBpZDolZFxuIiwgYy0+aWQpKTsKKwlERUJfRUUoIlZJRElPQ19RVUVSWUNUUkw6IGlkOiVkXG4iLCBjLT5pZCk7CiAJKmMgPSAqY3RybDsKIAlyZXR1cm4gMDsKIH0KQEAgLTYwNywyNSArNjEyLDI1IEBACiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgogCQl2YWx1ZSA9IHNhYTcxNDZfcmVhZChkZXYsIEJDU19DVFJMKTsKIAkJYy0+dmFsdWUgPSAweGZmICYgKHZhbHVlID4+IDI0KTsKLQkJREVCX0QoKCJWNEwyX0NJRF9CUklHSFRORVNTOiAlZFxuIiwgYy0+dmFsdWUpKTsKKwkJREVCX0QoIlY0TDJfQ0lEX0JSSUdIVE5FU1M6ICVkXG4iLCBjLT52YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CiAJCXZhbHVlID0gc2FhNzE0Nl9yZWFkKGRldiwgQkNTX0NUUkwpOwogCQljLT52YWx1ZSA9IDB4N2YgJiAodmFsdWUgPj4gMTYpOwotCQlERUJfRCgoIlY0TDJfQ0lEX0NPTlRSQVNUOiAlZFxuIiwgYy0+dmFsdWUpKTsKKwkJREVCX0QoIlY0TDJfQ0lEX0NPTlRSQVNUOiAlZFxuIiwgYy0+dmFsdWUpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CiAJCXZhbHVlID0gc2FhNzE0Nl9yZWFkKGRldiwgQkNTX0NUUkwpOwogCQljLT52YWx1ZSA9IDB4N2YgJiAodmFsdWUgPj4gMCk7Ci0JCURFQl9EKCgiVjRMMl9DSURfU0FUVVJBVElPTjogJWRcbiIsIGMtPnZhbHVlKSk7CisJCURFQl9EKCJWNEwyX0NJRF9TQVRVUkFUSU9OOiAlZFxuIiwgYy0+dmFsdWUpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgogCQljLT52YWx1ZSA9IHZ2LT52ZmxpcDsKLQkJREVCX0QoKCJWNEwyX0NJRF9WRkxJUDogJWRcbiIsIGMtPnZhbHVlKSk7CisJCURFQl9EKCJWNEwyX0NJRF9WRkxJUDogJWRcbiIsIGMtPnZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKIAkJYy0+dmFsdWUgPSB2di0+aGZsaXA7Ci0JCURFQl9EKCgiVjRMMl9DSURfSEZMSVA6ICVkXG4iLCBjLT52YWx1ZSkpOworCQlERUJfRCgiVjRMMl9DSURfSEZMSVA6ICVkXG4iLCBjLT52YWx1ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjQxLDcgKzY0Niw3IEBACiAKIAljdHJsID0gY3RybF9ieV9pZChjLT5pZCk7CiAJaWYgKE5VTEwgPT0gY3RybCkgewotCQlERUJfRCgoInVua25vd24gY29udHJvbCAlZFxuIiwgYy0+aWQpKTsKKwkJREVCX0QoInVua25vd24gY29udHJvbCAlZFxuIiwgYy0+aWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTY4NiwxNCArNjkxLDE0IEBACiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKIAkJLyogZml4bWU6IHdlIGNhbiBzdXBwb3J0IGNoYW5naW5nIFZGTElQIGFuZCBIRkxJUCBoZXJlLi4uICovCiAJCWlmIChJU19DQVBUVVJFX0FDVElWRShmaCkgIT0gMCkgewotCQkJREVCX0QoKCJWNEwyX0NJRF9IRkxJUCB3aGlsZSBhY3RpdmUgY2FwdHVyZS5cbiIpKTsKKwkJCURFQl9EKCJWNEwyX0NJRF9IRkxJUCB3aGlsZSBhY3RpdmUgY2FwdHVyZVxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJCXZ2LT5oZmxpcCA9IGMtPnZhbHVlOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgogCQlpZiAoSVNfQ0FQVFVSRV9BQ1RJVkUoZmgpICE9IDApIHsKLQkJCURFQl9EKCgiVjRMMl9DSURfVkZMSVAgd2hpbGUgYWN0aXZlIGNhcHR1cmUuXG4iKSk7CisJCQlERUJfRCgiVjRMMl9DSURfVkZMSVAgd2hpbGUgYWN0aXZlIGNhcHR1cmVcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQl2di0+dmZsaXAgPSBjLT52YWx1ZTsKQEAgLTc0OCw3ICs3NTMsNyBAQAogCWludCBtYXh3LCBtYXhoOwogCWludCBjYWxjX2JwbDsKIAotCURFQl9FRSgoIlY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCkpOworCURFQl9FRSgiVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiBkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAogCWZtdCA9IHNhYTcxNDZfZm9ybWF0X2J5X2ZvdXJjYyhkZXYsIGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwogCWlmIChOVUxMID09IGZtdCkKQEAgLTc3Nyw3ICs3ODIsNyBAQAogCQl2di0+bGFzdF9maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJREVCX0QoKCJubyBrbm93biBmaWVsZCBtb2RlICclZCcuXG4iLCBmaWVsZCkpOworCQlERUJfRCgibm8ga25vd24gZmllbGQgbW9kZSAnJWQnXG4iLCBmaWVsZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNzk2LDggKzgwMSw5IEBACiAJCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gY2FsY19icGw7CiAKIAlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lICogZi0+Zm10LnBpeC5oZWlnaHQ7Ci0JREVCX0QoKCJ3OiVkLCBoOiVkLCBieXRlc3BlcmxpbmU6JWQsIHNpemVpbWFnZTolZFxuIiwgZi0+Zm10LnBpeC53aWR0aCwKLQkJCWYtPmZtdC5waXguaGVpZ2h0LCBmLT5mbXQucGl4LmJ5dGVzcGVybGluZSwgZi0+Zm10LnBpeC5zaXplaW1hZ2UpKTsKKwlERUJfRCgidzolZCwgaDolZCwgYnl0ZXNwZXJsaW5lOiVkLCBzaXplaW1hZ2U6JWRcbiIsCisJICAgICAgZi0+Zm10LnBpeC53aWR0aCwgZi0+Zm10LnBpeC5oZWlnaHQsCisJICAgICAgZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUsIGYtPmZtdC5waXguc2l6ZWltYWdlKTsKIAogCXJldHVybiAwOwogfQpAQCAtODExLDIyICs4MTcsMjMgQEAKIAllbnVtIHY0bDJfZmllbGQgZmllbGQ7CiAJaW50IG1heHcsIG1heGg7CiAKLQlERUJfRUUoKCJkZXY6JXBcbiIsIGRldikpOworCURFQl9FRSgiZGV2OiVwXG4iLCBkZXYpOwogCiAJaWYgKE5VTEwgPT0gdnYtPm92X2ZiLmJhc2UpIHsKLQkJREVCX0QoKCJubyBmYiBiYXNlIHNldC5cbiIpKTsKKwkJREVCX0QoIm5vIGZiIGJhc2Ugc2V0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChOVUxMID09IHZ2LT5vdl9mbXQpIHsKLQkJREVCX0QoKCJubyBmYiBmbXQgc2V0LlxuIikpOworCQlERUJfRCgibm8gZmIgZm10IHNldFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAod2luLT53LndpZHRoIDwgNDggfHwgd2luLT53LmhlaWdodCA8IDMyKSB7Ci0JCURFQl9EKCgibWluIHdpZHRoL2hlaWdodC4gKCVkLCVkKVxuIiwgd2luLT53LndpZHRoLCB3aW4tPncuaGVpZ2h0KSk7CisJCURFQl9EKCJtaW4gd2lkdGgvaGVpZ2h0LiAoJWQsJWQpXG4iLAorCQkgICAgICB3aW4tPncud2lkdGgsIHdpbi0+dy5oZWlnaHQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHdpbi0+Y2xpcGNvdW50ID4gMTYpIHsKLQkJREVCX0QoKCJjbGlwY291bnQgdG9vIGJpZy5cbiIpKTsKKwkJREVCX0QoImNsaXBjb3VudCB0b28gYmlnXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04NDgsNyArODU1LDcgQEAKIAljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJREVCX0QoKCJubyBrbm93biBmaWVsZCBtb2RlICclZCcuXG4iLCBmaWVsZCkpOworCQlERUJfRCgibm8ga25vd24gZmllbGQgbW9kZSAnJWQnXG4iLCBmaWVsZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtODY4LDE2ICs4NzUsMTcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAJaW50IGVycjsKIAotCURFQl9FRSgoIlY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCkpOworCURFQl9FRSgiVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiBkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAlpZiAoSVNfQ0FQVFVSRV9BQ1RJVkUoZmgpICE9IDApIHsKLQkJREVCX0VFKCgic3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlXG4iKSk7CisJCURFQl9FRSgic3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJZXJyID0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBmaCwgZik7CiAJaWYgKDAgIT0gZXJyKQogCQlyZXR1cm4gZXJyOwogCWZoLT52aWRlb19mbXQgPSBmLT5mbXQucGl4OwotCURFQl9FRSgoInNldCB0byBwaXhlbGZvcm1hdCAnJTQuNHMnXG4iLCAoY2hhciAqKSZmaC0+dmlkZW9fZm10LnBpeGVsZm9ybWF0KSk7CisJREVCX0VFKCJzZXQgdG8gcGl4ZWxmb3JtYXQgJyU0LjRzJ1xuIiwKKwkgICAgICAgKGNoYXIgKikmZmgtPnZpZGVvX2ZtdC5waXhlbGZvcm1hdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg4OCw3ICs4OTYsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAlpbnQgZXJyOwogCi0JREVCX0VFKCgiVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOiBkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKSk7CisJREVCX0VFKCJWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6IGRldjolcCwgZmg6JXBcbiIsIGRldiwgZmgpOwogCWVyciA9IHZpZGlvY190cnlfZm10X3ZpZF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKIAlpZiAoMCAhPSBlcnIpCiAJCXJldHVybiBlcnI7CkBAIC05MzEsNyArOTM5LDcgQEAKIAkJaWYgKGUtPmluZGV4IDwgMCApCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYoIGUtPmluZGV4IDwgZGV2LT5leHRfdnZfZGF0YS0+bnVtX3N0ZHMgKSB7Ci0JCQlERUJfRUUoKCJWSURJT0NfRU5VTVNURDogaW5kZXg6JWRcbiIsZS0+aW5kZXgpKTsKKwkJCURFQl9FRSgiVklESU9DX0VOVU1TVEQ6IGluZGV4OiVkXG4iLCBlLT5pbmRleCk7CiAJCQl2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3QoZSwgZGV2LT5leHRfdnZfZGF0YS0+c3Rkc1tlLT5pbmRleF0uaWQsIGRldi0+ZXh0X3Z2X2RhdGEtPnN0ZHNbZS0+aW5kZXhdLm5hbWUpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTk0NiwxMCArOTU0LDEwIEBACiAJaW50IGZvdW5kID0gMDsKIAlpbnQgZXJyLCBpOwogCi0JREVCX0VFKCgiVklESU9DX1NfU1REXG4iKSk7CisJREVCX0VFKCJWSURJT0NfU19TVERcbiIpOwogCiAJaWYgKCh2di0+dmlkZW9fc3RhdHVzICYgU1RBVFVTX0NBUFRVUkUpID09IFNUQVRVU19DQVBUVVJFKSB7Ci0JCURFQl9EKCgiY2Fubm90IGNoYW5nZSB2aWRlbyBzdGFuZGFyZCB3aGlsZSBzdHJlYW1pbmcgY2FwdHVyZSBpcyBhY3RpdmVcbiIpKTsKKwkJREVCX0QoImNhbm5vdCBjaGFuZ2UgdmlkZW8gc3RhbmRhcmQgd2hpbGUgc3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTk1Nyw3ICs5NjUsNyBAQAogCQl2di0+b3Zfc3VzcGVuZCA9IHZ2LT52aWRlb19maDsKIAkJZXJyID0gc2FhNzE0Nl9zdG9wX3ByZXZpZXcodnYtPnZpZGVvX2ZoKTsgLyogc2lkZSBlZmZlY3Q6IHZpZGVvX3N0YXR1cyBpcyBub3cgMCwgdmlkZW9fZmggaXMgTlVMTCAqLwogCQlpZiAoMCAhPSBlcnIpIHsKLQkJCURFQl9EKCgic3VzcGVuZGluZyB2aWRlbyBmYWlsZWQuIGFib3J0aW5nXG4iKSk7CisJCQlERUJfRCgic3VzcGVuZGluZyB2aWRlbyBmYWlsZWQuIGFib3J0aW5nXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC05NzgsMTEgKzk4NiwxMSBAQAogCX0KIAogCWlmICghZm91bmQpIHsKLQkJREVCX0VFKCgiVklESU9DX1NfU1REOiBzdGFuZGFyZCBub3QgZm91bmQuXG4iKSk7CisJCURFQl9FRSgiVklESU9DX1NfU1REOiBzdGFuZGFyZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlERUJfRUUoKCJWSURJT0NfU19TVEQ6IHNldCB0byBzdGFuZGFyZCB0byAnJXMnXG4iLCB2di0+c3RhbmRhcmQtPm5hbWUpKTsKKwlERUJfRUUoIlZJRElPQ19TX1NURDogc2V0IHRvIHN0YW5kYXJkIHRvICclcydcbiIsIHZ2LT5zdGFuZGFyZC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5MCw3ICs5OTgsNyBAQAogewogCWludCBlcnI7CiAKLQlERUJfRCgoIlZJRElPQ19PVkVSTEFZIG9uOiVkXG4iLCBvbikpOworCURFQl9EKCJWSURJT0NfT1ZFUkxBWSBvbjolZFxuIiwgb24pOwogCWlmIChvbikKIAkJZXJyID0gc2FhNzE0Nl9zdGFydF9wcmV2aWV3KGZoKTsKIAllbHNlCkBAIC0xMDQ3LDcgKzEwNTUsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IF9fZmg7CiAJaW50IGVycjsKIAotCURFQl9EKCgiVklESU9DX1NUUkVBTU9OLCB0eXBlOiVkXG4iLCB0eXBlKSk7CisJREVCX0QoIlZJRElPQ19TVFJFQU1PTiwgdHlwZTolZFxuIiwgdHlwZSk7CiAKIAllcnIgPSB2aWRlb19iZWdpbihmaCk7CiAJaWYgKGVycikKQEAgLTEwNjYsMTggKzEwNzQsMTggQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAJaW50IGVycjsKIAotCURFQl9EKCgiVklESU9DX1NUUkVBTU9GRiwgdHlwZTolZFxuIiwgdHlwZSkpOworCURFQl9EKCJWSURJT0NfU1RSRUFNT0ZGLCB0eXBlOiVkXG4iLCB0eXBlKTsKIAogCS8qIHVnbHk6IHdlIG5lZWQgdG8gY29weSBzb21lIGNoZWNrcyBmcm9tIHZpZGVvX2VuZCgpLAogCSAgIGJlY2F1c2UgdmlkZW9idWZfc3RyZWFtb2ZmKCkgcmVsaWVzIG9uIHRoZSBjYXB0dXJlIHJ1bm5pbmcuCiAJICAgY2hlY2sgYW5kIGZpeCB0aGlzICovCiAJaWYgKCh2di0+dmlkZW9fc3RhdHVzICYgU1RBVFVTX0NBUFRVUkUpICE9IFNUQVRVU19DQVBUVVJFKSB7Ci0JCURFQl9TKCgibm90IGNhcHR1cmluZy5cbiIpKTsKKwkJREVCX1MoIm5vdCBjYXB0dXJpbmdcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodnYtPnZpZGVvX2ZoICE9IGZoKSB7Ci0JCURFQl9TKCgiY2FwdHVyaW5nLCBidXQgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfUygiY2FwdHVyaW5nLCBidXQgaW4gYW5vdGhlciBvcGVuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTEwODcsNyArMTA5NSw3IEBACiAJZWxzZSBpZiAodHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFKQogCQllcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoJmZoLT52YmlfcSk7CiAJaWYgKDAgIT0gZXJyKSB7Ci0JCURFQl9EKCgid2FybmluZzogdmlkZW9idWZfc3RyZWFtb2ZmKCkgZmFpbGVkLlxuIikpOworCQlERUJfRCgid2FybmluZzogdmlkZW9idWZfc3RyZWFtb2ZmKCkgZmFpbGVkXG4iKTsKIAkJdmlkZW9fZW5kKGZoLCBmaWxlKTsKIAl9IGVsc2UgewogCQllcnIgPSB2aWRlb19lbmQoZmgsIGZpbGUpOwpAQCAtMTE3NCwyNSArMTE4MiwyNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2J1ZiAqYnVmID0gKHN0cnVjdCBzYWE3MTQ2X2J1ZiAqKXZiOwogCWludCBzaXplLGVyciA9IDA7CiAKLQlERUJfQ0FQKCgidmJ1ZjolcFxuIix2YikpOworCURFQl9DQVAoInZidWY6JXBcbiIsIHZiKTsKIAogCS8qIHNhbml0eSBjaGVja3MgKi8KIAlpZiAoZmgtPnZpZGVvX2ZtdC53aWR0aCAgPCA0OCB8fAogCSAgICBmaC0+dmlkZW9fZm10LmhlaWdodCA8IDMyIHx8CiAJICAgIGZoLT52aWRlb19mbXQud2lkdGggID4gdnYtPnN0YW5kYXJkLT5oX21heF9vdXQgfHwKIAkgICAgZmgtPnZpZGVvX2ZtdC5oZWlnaHQgPiB2di0+c3RhbmRhcmQtPnZfbWF4X291dCkgewotCQlERUJfRCgoIncgKCVkKSAvIGggKCVkKSBvdXQgb2YgYm91bmRzLlxuIixmaC0+dmlkZW9fZm10LndpZHRoLGZoLT52aWRlb19mbXQuaGVpZ2h0KSk7CisJCURFQl9EKCJ3ICglZCkgLyBoICglZCkgb3V0IG9mIGJvdW5kc1xuIiwKKwkJICAgICAgZmgtPnZpZGVvX2ZtdC53aWR0aCwgZmgtPnZpZGVvX2ZtdC5oZWlnaHQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzaXplID0gZmgtPnZpZGVvX2ZtdC5zaXplaW1hZ2U7CiAJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAmJiBidWYtPnZiLmJzaXplIDwgc2l6ZSkgewotCQlERUJfRCgoInNpemUgbWlzbWF0Y2guXG4iKSk7CisJCURFQl9EKCJzaXplIG1pc21hdGNoXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JREVCX0NBUCgoImJ1ZmZlcl9wcmVwYXJlIFtzaXplPSVkeCVkLGJ5dGVzPSVkLGZpZWxkcz0lc11cbiIsCi0JCWZoLT52aWRlb19mbXQud2lkdGgsZmgtPnZpZGVvX2ZtdC5oZWlnaHQsc2l6ZSx2NGwyX2ZpZWxkX25hbWVzW2ZoLT52aWRlb19mbXQuZmllbGRdKSk7CisJREVCX0NBUCgiYnVmZmVyX3ByZXBhcmUgW3NpemU9JWR4JWQsYnl0ZXM9JWQsZmllbGRzPSVzXVxuIiwKKwkJZmgtPnZpZGVvX2ZtdC53aWR0aCwgZmgtPnZpZGVvX2ZtdC5oZWlnaHQsCisJCXNpemUsIHY0bDJfZmllbGRfbmFtZXNbZmgtPnZpZGVvX2ZtdC5maWVsZF0pOwogCWlmIChidWYtPnZiLndpZHRoICAhPSBmaC0+dmlkZW9fZm10LndpZHRoICB8fAogCSAgICBidWYtPnZiLmJ5dGVzcGVybGluZSAhPSBmaC0+dmlkZW9fZm10LmJ5dGVzcGVybGluZSB8fAogCSAgICBidWYtPnZiLmhlaWdodCAhPSBmaC0+dmlkZW9fZm10LmhlaWdodCB8fApAQCAtMTIzOCw3ICsxMjQ4LDcgQEAKIAlyZXR1cm4gMDsKIAogIG9vcHM6Ci0JREVCX0QoKCJlcnJvciBvdXQuXG4iKSk7CisJREVCX0QoImVycm9yIG91dFxuIik7CiAJc2FhNzE0Nl9kbWFfZnJlZShkZXYscSxidWYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTEyNTksNyArMTI2OSw3IEBACiAJCSpjb3VudCA9IChtYXhfbWVtb3J5KjEwNDg1NzYpIC8gKnNpemU7CiAJfQogCi0JREVCX0NBUCgoIiVkIGJ1ZmZlcnMsICVkIGJ5dGVzIGVhY2guXG4iLCpjb3VudCwqc2l6ZSkpOworCURFQl9DQVAoIiVkIGJ1ZmZlcnMsICVkIGJ5dGVzIGVhY2hcbiIsICpjb3VudCwgKnNpemUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjcyLDcgKzEyODIsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1ZiA9IChzdHJ1Y3Qgc2FhNzE0Nl9idWYgKil2YjsKIAotCURFQl9DQVAoKCJ2YnVmOiVwXG4iLHZiKSk7CisJREVCX0NBUCgidmJ1ZjolcFxuIiwgdmIpOwogCXNhYTcxNDZfYnVmZmVyX3F1ZXVlKGZoLT5kZXYsJnZ2LT52aWRlb19xLGJ1Zik7CiB9CiAKQEAgLTEyODMsNyArMTI5Myw3IEBACiAJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCXN0cnVjdCBzYWE3MTQ2X2J1ZiAqYnVmID0gKHN0cnVjdCBzYWE3MTQ2X2J1ZiAqKXZiOwogCi0JREVCX0NBUCgoInZidWY6JXBcbiIsdmIpKTsKKwlERUJfQ0FQKCJ2YnVmOiVwXG4iLCB2Yik7CiAKIAlzYWE3MTQ2X2RtYV9mcmVlKGRldixxLGJ1Zik7CiAKQEAgLTEzNDcsMTggKzEzNTcsMTQgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwogCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSA9ICZmaC0+dmlkZW9fcTsKLQlpbnQgZXJyOwogCi0JaWYgKElTX0NBUFRVUkVfQUNUSVZFKGZoKSAhPSAwKSB7Ci0JCWVyciA9IHZpZGVvX2VuZChmaCwgZmlsZSk7Ci0JfSBlbHNlIGlmIChJU19PVkVSTEFZX0FDVElWRShmaCkgIT0gMCkgewotCQllcnIgPSBzYWE3MTQ2X3N0b3BfcHJldmlldyhmaCk7Ci0JfQorCWlmIChJU19DQVBUVVJFX0FDVElWRShmaCkgIT0gMCkKKwkJdmlkZW9fZW5kKGZoLCBmaWxlKTsKKwllbHNlIGlmIChJU19PVkVSTEFZX0FDVElWRShmaCkgIT0gMCkKKwkJc2FhNzE0Nl9zdG9wX3ByZXZpZXcoZmgpOwogCiAJdmlkZW9idWZfc3RvcChxKTsKLQogCS8qIGhtbSwgd2h5IGlzIHRoaXMgZnVuY3Rpb24gZGVjbGFyZWQgdm9pZD8gKi8KLQkvKiByZXR1cm4gZXJyICovCiB9CiAKIApAQCAtMTM2OCw3ICsxMzc0LDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9kbWFxdWV1ZSAqcSA9ICZ2di0+dmlkZW9fcTsKIAogCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7Ci0JREVCX0NBUCgoImNhbGxlZC5cbiIpKTsKKwlERUJfQ0FQKCJjYWxsZWRcbiIpOwogCiAJLyogb25seSBmaW5pc2ggdGhlIGJ1ZmZlciBpZiB3ZSBoYXZlIG9uZS4uLiAqLwogCWlmKCBOVUxMICE9IHEtPmN1cnIgKSB7CkBAIC0xMzg2LDE1ICsxMzkyLDE1IEBACiAJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwogCXNzaXplX3QgcmV0ID0gMDsKIAotCURFQl9FRSgoImNhbGxlZC5cbiIpKTsKKwlERUJfRUUoImNhbGxlZFxuIik7CiAKIAlpZiAoKHZ2LT52aWRlb19zdGF0dXMgJiBTVEFUVVNfQ0FQVFVSRSkgIT0gMCkgewogCQkvKiBmaXhtZTogc2hvdWxkIHdlIGFsbG93IHJlYWQoKSBjYXB0dXJlcyB3aGlsZSBzdHJlYW1pbmcgY2FwdHVyZT8gKi8KIAkJaWYgKHZ2LT52aWRlb19maCA9PSBmaCkgewotCQkJREVCX1MoKCJhbHJlYWR5IGNhcHR1cmluZy5cbiIpKTsKKwkJCURFQl9TKCJhbHJlYWR5IGNhcHR1cmluZ1xuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9Ci0JCURFQl9TKCgiYWxyZWFkeSBjYXB0dXJpbmcgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfUygiYWxyZWFkeSBjYXB0dXJpbmcgaW4gYW5vdGhlciBvcGVuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9NYWtlZmlsZQppbmRleCAyMGQyNGZjLi4xOTZjMTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL01ha2VmaWxlCkBAIC0yOCw1ICsyOCw1IEBACiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfVERBMTgyMTgpICs9IHRkYTE4MjE4Lm8KIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9UREExODIxMikgKz0gdGRhMTgyMTIubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvbXQyMHh4LmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvbXQyMHh4LmMKaW5kZXggZDBlNzBlMS4uMGU3NGU5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL210MjB4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9tdDIweHguYwpAQCAtNDMwLDExICs0MzAsMTAgQEAKIHsKIAlzdHJ1Y3QgbWljcm90dW5lX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQlpbnQgcmV0OwogCiAJYnVmWzBdID0gNjsKIAlidWZbMV0gPSBhbnRlbm5hID8gMHgxMSA6IDB4MTA7Ci0JcmV0PXR1bmVyX2kyY194ZmVyX3NlbmQoJnByaXYtPmkyY19wcm9wcyxidWYsMik7CisJdHVuZXJfaTJjX3hmZXJfc2VuZCgmcHJpdi0+aTJjX3Byb3BzLCBidWYsIDIpOwogCXR1bmVyX2RiZygibXQyMDUwOiBlbmFibGVkIGFudGVubmEgY29ubmVjdG9yICVkXG4iLCBhbnRlbm5hKTsKIH0KIApAQCAtNTc0LDIxICs1NzMsMjAgQEAKIHsKIAlzdHJ1Y3QgbWljcm90dW5lX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQlpbnQgcmV0OwogCi0JYnVmWzBdPTY7Ci0JYnVmWzFdPTB4MTA7Ci0JcmV0PXR1bmVyX2kyY194ZmVyX3NlbmQoJnByaXYtPmkyY19wcm9wcyxidWYsMik7IC8vICBwb3dlcgorCWJ1ZlswXSA9IDY7CisJYnVmWzFdID0gMHgxMDsKKwl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGJ1ZiwgMik7IC8qIHBvd2VyICovCiAKLQlidWZbMF09MHgwZjsKLQlidWZbMV09MHgwZjsKLQlyZXQ9dHVuZXJfaTJjX3hmZXJfc2VuZCgmcHJpdi0+aTJjX3Byb3BzLGJ1ZiwyKTsgLy8gbTFsbworCWJ1ZlswXSA9IDB4MGY7CisJYnVmWzFdID0gMHgwZjsKKwl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGJ1ZiwgMik7IC8qIG0xbG8gKi8KIAotCWJ1ZlswXT0weDBkOwotCXJldD10dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsYnVmLDEpOwotCXR1bmVyX2kyY194ZmVyX3JlY3YoJnByaXYtPmkyY19wcm9wcyxidWYsMSk7CisJYnVmWzBdID0gMHgwZDsKKwl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGJ1ZiwgMSk7CisJdHVuZXJfaTJjX3hmZXJfcmVjdigmcHJpdi0+aTJjX3Byb3BzLCBidWYsIDEpOwogCi0JdHVuZXJfZGJnKCJtdDIwNTA6IHNybyBpcyAleFxuIixidWZbMF0pOworCXR1bmVyX2RiZygibXQyMDUwOiBzcm8gaXMgJXhcbiIsIGJ1ZlswXSk7CiAKIAltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmbXQyMDUwX3R1bmVyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9teGw1MDA1cy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKaW5kZXggNTZmZTc1Yy4uNTRiZTllNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKQEAgLTMwOSw3ICszMDksNiBAQAogc3RhdGljIHUxNiBNWExfU2V0R1BJTyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggR1BJT19OdW0sIHU4IEdQSU9fVmFsKTsKIHN0YXRpYyB1MTYgTVhMX0dldEluaXRSZWdpc3RlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggKlJlZ051bSwKIAl1OCAqUmVnVmFsLCBpbnQgKmNvdW50KTsKLXN0YXRpYyB1MzIgTVhMX0dldFh0YWxJbnQodTMyIFh0YWxfRnJlcSk7CiBzdGF0aWMgdTE2IE1YTF9UdW5lUkYoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBSRl9GcmVxKTsKIHN0YXRpYyB2b2lkIE1YTF9TeW50aElGTE9fQ2FsYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CiBzdGF0aWMgdm9pZCBNWExfU3ludGhSRlRHTE9fQ2FsYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CkBAIC0yMzA3LDE0ICsyMzA2LDYgQEAKIAlyZXR1cm4gc3RhdHVzIDsKIH0KIAotc3RhdGljIHUzMiBNWExfR2V0WHRhbEludCh1MzIgWHRhbF9GcmVxKQotewotCWlmICgoWHRhbF9GcmVxICUgMTAwMDAwMCkgPT0gMCkKLQkJcmV0dXJuIChYdGFsX0ZyZXEgLyAxMDAwMCk7Ci0JZWxzZQotCQlyZXR1cm4gKCgoWHRhbF9GcmVxIC8gMTAwMDAwMCkgKyAxKSoxMDApOwotfQotCiBzdGF0aWMgdTE2IE1YTF9UdW5lUkYoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBSRl9GcmVxKQogewogCXN0cnVjdCBteGw1MDA1c19zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKQEAgLTIzMjQsMTMgKzIzMTUsMTAgQEAKIAl1MzIgS2RibF9SRiA9IDI7CiAJdTMyIHRnX2RpdnZhbDsKIAl1MzIgdGdfbG87Ci0JdTMyIFh0YWxfSW50OwogCiAJdTMyIEZyZWZfVEc7CiAJdTMyIEZ2Y287CiAKLQlYdGFsX0ludCA9IE1YTF9HZXRYdGFsSW50KHN0YXRlLT5GeHRhbCk7Ci0KIAlzdGF0ZS0+UkZfSU4gPSBSRl9GcmVxOwogCiAJTVhMX1N5bnRoUkZUR0xPX0NhbGMoZmUpOwpAQCAtMjc3OSw2ICsyNzY3LDE2IEBACiAJdGdfbG8gPSAoKChGbWF4LzEwIC0gRnZjbykvMTAwKSozMikgLyAoKEZtYXgtRm1pbikvMTAwMCkrODsKIAogCS8qIGJlbG93IGVxdWF0aW9uIGlzIHNhbWUgYXMgYWJvdmUgYnV0IG11Y2ggaGFyZGVyIHRvIGRlYnVnLgorCSAqCisJICogc3RhdGljIHUzMiBNWExfR2V0WHRhbEludCh1MzIgWHRhbF9GcmVxKQorCSAqIHsKKwkgKglpZiAoKFh0YWxfRnJlcSAlIDEwMDAwMDApID09IDApCisJICoJCXJldHVybiAoWHRhbF9GcmVxIC8gMTAwMDApOworCSAqCWVsc2UKKwkgKgkJcmV0dXJuICgoKFh0YWxfRnJlcSAvIDEwMDAwMDApICsgMSkqMTAwKTsKKwkgKiB9CisJICoKKwkgKiB1MzIgWHRhbF9JbnQgPSBNWExfR2V0WHRhbEludChzdGF0ZS0+Rnh0YWwpOwogCSAqIHRnX2xvID0gKCAoKEZtYXgvMTAwMDAgKiBYdGFsX0ludCkvMTAwKSAtCiAJICogKChzdGF0ZS0+VEdfTE8vMTAwMDApKmRpdmlkZXJfdmFsICoKIAkgKiAoc3RhdGUtPkZ4dGFsLzEwMDAwKS8xMDApICkqMzIvKChGbWF4LUZtaW4pLzEwMDAwICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODIxMi5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjEyLmMKaW5kZXggMWYxZGIyMC4uZTI5Y2MyYmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyMTIuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyMTIuYwpAQCAtMTgsNyArMTgsMjAgQEAKICAqICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCiAgKi8KIAotI2luY2x1ZGUgInRkYTE4MjEyX3ByaXYuaCIKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgInRkYTE4MjEyLmgiCisKK3N0cnVjdCB0ZGExODIxMl9wcml2IHsKKwlzdHJ1Y3QgdGRhMTgyMTJfY29uZmlnICpjZmc7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7Cit9OworCisjZGVmaW5lIGRiZyhmbXQsIGFyZy4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoZGVidWcpCQkJCQkJXAorCQlwcl9pbmZvKCIlczogIiBmbXQsIF9fZnVuY19fLCAjI2FyZyk7CQlcCit9IHdoaWxlICgwKQogCiBzdGF0aWMgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpAQCAtNDYsNyArNTksOCBAQAogCWlmIChyZXQgPT0gMSkgewogCQlyZXQgPSAwOwogCX0gZWxzZSB7Ci0JCXdhcm4oImkyYyB3ciBmYWlsZWQgcmV0OiVkIHJlZzolMDJ4IGxlbjolZCIsIHJldCwgcmVnLCBsZW4pOworCQlwcl93YXJuKCJpMmMgd3IgZmFpbGVkIHJldDolZCByZWc6JTAyeCBsZW46JWRcbiIsCisJCQlyZXQsIHJlZywgbGVuKTsKIAkJcmV0ID0gLUVSRU1PVEVJTzsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTc3LDcgKzkxLDggQEAKIAkJbWVtY3B5KHZhbCwgYnVmLCBsZW4pOwogCQlyZXQgPSAwOwogCX0gZWxzZSB7Ci0JCXdhcm4oImkyYyByZCBmYWlsZWQgcmV0OiVkIHJlZzolMDJ4IGxlbjolZCIsIHJldCwgcmVnLCBsZW4pOworCQlwcl93YXJuKCJpMmMgcmQgZmFpbGVkIHJldDolZCByZWc6JTAyeCBsZW46JWRcbiIsCisJCQlyZXQsIHJlZywgbGVuKTsKIAkJcmV0ID0gLUVSRU1PVEVJTzsKIAl9CiAKQEAgLTEyOSw4ICsxNDQsOCBAQAogCQl7IDB4OTIsIDB4NTMsIDB4MDMgfSwgLyogRFZCLUMgKi8KIAl9OwogCi0JZGJnKCIlczogZGVsc3lzPSVkIFJGPSVkIEJXPSVkIiwgX19mdW5jX18sCi0JCWMtPmRlbGl2ZXJ5X3N5c3RlbSwgYy0+ZnJlcXVlbmN5LCBjLT5iYW5kd2lkdGhfaHopOworCWRiZygiZGVsc3lzPSVkIFJGPSVkIEJXPSVkXG4iLAorCSAgICBjLT5kZWxpdmVyeV9zeXN0ZW0sIGMtPmZyZXF1ZW5jeSwgYy0+YmFuZHdpZHRoX2h6KTsKIAogCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCiAJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7IC8qIG9wZW4gSTJDLWdhdGUgKi8KQEAgLTE5Niw3ICsyMTEsNyBAQAogCXJldHVybiByZXQ7CiAKIGVycm9yOgotCWRiZygiJXM6IGZhaWxlZDolZCIsIF9fZnVuY19fLCByZXQpOworCWRiZygiZmFpbGVkOiVkXG4iLCByZXQpOwogCWdvdG8gZXhpdDsKIH0KIApAQCAtMjQ1LDEzICsyNjAsMTMgQEAKIAlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQogCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOyAvKiBjbG9zZSBJMkMtZ2F0ZSAqLwogCi0JZGJnKCIlczogcmV0OiVkIGNoaXAgSUQ6JTAyeCIsIF9fZnVuY19fLCByZXQsIHZhbCk7CisJZGJnKCJyZXQ6JWQgY2hpcCBJRDolMDJ4XG4iLCByZXQsIHZhbCk7CiAJaWYgKHJldCB8fCB2YWwgIT0gMHhjNykgewogCQlrZnJlZShwcml2KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaW5mbygiTlhQIFREQTE4MjEySE4gc3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWQuIik7CisJcHJfaW5mbygiTlhQIFREQTE4MjEySE4gc3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWRcbiIpOwogCiAJbWVtY3B5KCZmZS0+b3BzLnR1bmVyX29wcywgJnRkYTE4MjEyX3R1bmVyX29wcywKIAkJc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyMTJfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjEyX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkZmY5My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyMTJfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIE5YUCBUREExODIxMkhOIHNpbGljb24gdHVuZXIgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExIEFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgotICoKLSAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKi8KLQotI2lmbmRlZiBUREExODIxMl9QUklWX0gKLSNkZWZpbmUgVERBMTgyMTJfUFJJVl9ICi0KLSNpbmNsdWRlICJ0ZGExODIxMi5oIgotCi0jZGVmaW5lIExPR19QUkVGSVggInRkYTE4MjEyIgotCi0jdW5kZWYgZGJnCi0jZGVmaW5lIGRiZyhmLCBhcmcuLi4pIFwKLQlpZiAoZGVidWcpIFwKLQkJcHJpbnRrKEtFUk5fSU5GTyAgIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKLSN1bmRlZiBlcnIKLSNkZWZpbmUgZXJyKGYsIGFyZy4uLikgIHByaW50ayhLRVJOX0VSUiAgICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQotI3VuZGVmIGluZm8KLSNkZWZpbmUgaW5mbyhmLCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQotI3VuZGVmIHdhcm4KLSNkZWZpbmUgd2FybihmLCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQotCi1zdHJ1Y3QgdGRhMTgyMTJfcHJpdiB7Ci0Jc3RydWN0IHRkYTE4MjEyX2NvbmZpZyAqY2ZnOwotCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtY29tbW9uLmMKaW5kZXggYWFlNDBlNS4uMzljNjQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1jb21tb24uYwpAQCAtNjc2LDEwICs2NzYsMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KK2ludCBfdGRhX3ByaW50ayhzdHJ1Y3QgdGRhMTgyNzFfcHJpdiAqc3RhdGUsIGNvbnN0IGNoYXIgKmxldmVsLAorCQljb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJ0bjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJaWYgKHN0YXRlKQorCQlydG4gPSBwcmludGsoIiVzJXM6IFslZC0lMDR4fCVjXSAlcFYiLAorCQkJICAgICBsZXZlbCwgZnVuYywgaTJjX2FkYXB0ZXJfaWQoc3RhdGUtPmkyY19wcm9wcy5hZGFwKSwKKwkJCSAgICAgc3RhdGUtPmkyY19wcm9wcy5hZGRyLAorCQkJICAgICAoc3RhdGUtPnJvbGUgPT0gVERBMTgyNzFfTUFTVEVSKSA/ICdNJyA6ICdTJywKKwkJCSAgICAgJnZhZik7CisJZWxzZQorCQlydG4gPSBwcmludGsoIiVzJXM6ICVwViIsIGxldmVsLCBmdW5jLCAmdmFmKTsKKworCXZhX2VuZChhcmdzKTsKKworCXJldHVybiBydG47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtZmUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jCmluZGV4IDU3MDIyZTguLjYzY2M0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jCkBAIC0xMjMwLDcgKzEyMzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGR2Yl90dW5lcl9vcHMgdGRhMTgyNzFfdHVuZXJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBkdmJfdHVuZXJfb3BzIHRkYTE4MjcxX3R1bmVyX29wcyA9IHsKIAkuaW5mbyA9IHsKIAkJLm5hbWUgPSAiTlhQIFREQTE4MjcxSEQiLAogCQkuZnJlcXVlbmN5X21pbiAgPSAgNDUwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLXByaXYuaAppbmRleCA5NTg5YWIwLi45NDM0MGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1wcml2LmgKQEAgLTEzNiwyOSArMTM2LDI2IEBACiAjZGVmaW5lIERCR19BRFYgIDgKICNkZWZpbmUgREJHX0NBTCAgMTYKIAotI2RlZmluZSB0ZGFfcHJpbnRrKHN0LCBrZXJuLCBmbXQsIGFyZy4uLikgZG8ge1wKLQlpZiAoc3QpIHsgXAotCQlzdHJ1Y3QgdGRhMTgyNzFfcHJpdiAqc3RhdGUgPSBzdDsgXAotCQlwcmludGsoa2VybiAiJXM6IFslZC0lMDR4fCVzXSAiIGZtdCwgX19mdW5jX18sIFwKLQkJCWkyY19hZGFwdGVyX2lkKHN0YXRlLT5pMmNfcHJvcHMuYWRhcCksIFwKLQkJCXN0YXRlLT5pMmNfcHJvcHMuYWRkciwgXAotCQkJKHN0YXRlLT5yb2xlID09IFREQTE4MjcxX01BU1RFUikgXAotCQkJPyAiTSIgOiAiUyIsICMjYXJnKTsgXAotCX0gZWxzZSBcCi0JCXByaW50ayhrZXJuICIlczogIiBmbXQsIF9fZnVuY19fLCAjI2FyZyk7IFwKK19fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDQsIDUpKSkKK2ludCBfdGRhX3ByaW50ayhzdHJ1Y3QgdGRhMTgyNzFfcHJpdiAqc3RhdGUsIGNvbnN0IGNoYXIgKmxldmVsLAorCQljb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKyNkZWZpbmUgdGRhX3ByaW50ayhzdCwgbHZsLCBmbXQsIGFyZy4uLikJCQlcCisJX3RkYV9wcmludGsoc3QsIGx2bCwgX19mdW5jX18sIGZtdCwgIyNhcmcpCisKKyNkZWZpbmUgdGRhX2RwcmludGsoc3QsIGx2bCwgZm10LCBhcmcuLi4pCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh0ZGExODI3MV9kZWJ1ZyAmIGx2bCkJCQkJXAorCQl0ZGFfcHJpbnRrKHN0LCBLRVJOX0RFQlVHLCBmbXQsICMjYXJnKTsJCVwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgdGRhX2RwcmludGsoc3QsIGx2bCwgZm10LCBhcmcuLi4pIGRvIHtcCi0JaWYgKHRkYTE4MjcxX2RlYnVnICYgbHZsKSBcCi0JCXRkYV9wcmludGsoc3QsIEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIHRkYV9pbmZvKGZtdCwgYXJnLi4uKSAgICAgcHJpbnRrKEtFUk5fSU5GTyAgICAgZm10LCAjI2FyZykKLSNkZWZpbmUgdGRhX3dhcm4oZm10LCBhcmcuLi4pIHRkYV9wcmludGsocHJpdiwgS0VSTl9XQVJOSU5HLCBmbXQsICMjYXJnKQotI2RlZmluZSB0ZGFfZXJyKGZtdCwgYXJnLi4uKSAgdGRhX3ByaW50ayhwcml2LCBLRVJOX0VSUiwgICAgIGZtdCwgIyNhcmcpCi0jZGVmaW5lIHRkYV9kYmcoZm10LCBhcmcuLi4pICB0ZGFfZHByaW50ayhwcml2LCBEQkdfSU5GTywgICAgZm10LCAjI2FyZykKLSNkZWZpbmUgdGRhX21hcChmbXQsIGFyZy4uLikgIHRkYV9kcHJpbnRrKHByaXYsIERCR19NQVAsICAgICBmbXQsICMjYXJnKQotI2RlZmluZSB0ZGFfcmVnKGZtdCwgYXJnLi4uKSAgdGRhX2RwcmludGsocHJpdiwgREJHX1JFRywgICAgIGZtdCwgIyNhcmcpCi0jZGVmaW5lIHRkYV9jYWwoZm10LCBhcmcuLi4pICB0ZGFfZHByaW50ayhwcml2LCBEQkdfQ0FMLCAgICAgZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX2luZm8oZm10LCBhcmcuLi4pCXByX2luZm8oZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX3dhcm4oZm10LCBhcmcuLi4pCXRkYV9wcmludGsocHJpdiwgS0VSTl9XQVJOSU5HLCBmbXQsICMjYXJnKQorI2RlZmluZSB0ZGFfZXJyKGZtdCwgYXJnLi4uKQl0ZGFfcHJpbnRrKHByaXYsIEtFUk5fRVJSLCAgICAgZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX2RiZyhmbXQsIGFyZy4uLikJdGRhX2RwcmludGsocHJpdiwgREJHX0lORk8sICAgIGZtdCwgIyNhcmcpCisjZGVmaW5lIHRkYV9tYXAoZm10LCBhcmcuLi4pCXRkYV9kcHJpbnRrKHByaXYsIERCR19NQVAsICAgICBmbXQsICMjYXJnKQorI2RlZmluZSB0ZGFfcmVnKGZtdCwgYXJnLi4uKQl0ZGFfZHByaW50ayhwcml2LCBEQkdfUkVHLCAgICAgZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX2NhbChmbXQsIGFyZy4uLikJdGRhX2RwcmludGsocHJpdiwgREJHX0NBTCwgICAgIGZtdCwgIyNhcmcpCiAKICNkZWZpbmUgdGRhX2ZhaWwocmV0KQkJCQkJCQkgICAgIFwKICh7CQkJCQkJCQkJICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI3eC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyN3guYwppbmRleCBiMjFiNmVhLi5lMGQ1YjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI3eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4Mjd4LmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQlpZl9mcmVxID0gNTAwMDAwMDsKIAkJYnJlYWs7CiAJfQotCXR1bmVyX2ZyZXEgPSBwYXJhbXMtPmZyZXF1ZW5jeSArIGlmX2ZyZXE7CisJdHVuZXJfZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5OwogCiAJaSA9IDA7CiAJd2hpbGUgKHRkYTgyN3hfdGFibGVbaV0ubG9tYXggPCB0dW5lcl9mcmVxKSB7CkBAIC0xODUsNiArMTg1LDggQEAKIAkJaSsrOwogCX0KIAorCXR1bmVyX2ZyZXEgKz0gaWZfZnJlcTsKKwogCU4gPSAoKHR1bmVyX2ZyZXEgKyAxMjUwMDApIC8gMjUwMDAwKSA8PCAodGRhODI3eF90YWJsZVtpXS5zcGQgKyAyKTsKIAlidWZbMF0gPSAwOwogCWJ1ZlsxXSA9IChOPj44KSB8IDB4NDA7CkBAIC01NDAsNyArNTQyLDcgQEAKIAkJaWZfZnJlcSA9IDUwMDAwMDA7CiAJCWJyZWFrOwogCX0KLQl0dW5lcl9mcmVxID0gcGFyYW1zLT5mcmVxdWVuY3kgKyBpZl9mcmVxOworCXR1bmVyX2ZyZXEgPSBwYXJhbXMtPmZyZXF1ZW5jeTsKIAogCWlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9RQU0pIHsKIAkJZHByaW50aygiJXMgc2VsZWN0IHRkYTgyN3hhX2R2YmNcbiIsIF9fZnVuY19fKTsKQEAgLTU1NCw2ICs1NTYsOCBAQAogCQlpKys7CiAJfQogCisJdHVuZXJfZnJlcSArPSBpZl9mcmVxOworCiAJTiA9ICgodHVuZXJfZnJlcSArIDMxMjUwKSAvIDYyNTAwKSA8PCBmcmVxdWVuY3lfbWFwW2ldLnNwZDsKIAlidWZbMF0gPSAwOyAgICAgICAgICAgIC8vIHN1YmFkZHJlc3MKIAlidWZbMV0gPSBOID4+IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXItdHlwZXMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCmluZGV4IDk0YTYwM2EuLmUxMzY4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCkBAIC01LDYgKzUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLXR5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguYwppbmRleCAxNmZiYTZiLi4zYWNiYWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXIteGMyMDI4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXhjMjAyOC5jCkBAIC02MTQsNiArNjE0LDEzIEBACiAJCQlwICs9IGxlbjsKIAkJCXNpemUgLT0gbGVuOwogCQl9CisKKwkJLyogc2lsZW50bHkgZmFpbCBpZiB0aGUgZnJvbnRlbmQgZG9lc24ndCBzdXBwb3J0IEkyQyBmbHVzaCAqLworCQlyYyA9IGRvX3R1bmVyX2NhbGxiYWNrKGZlLCBYQzIwMjhfSTJDX0ZMVVNILCAwKTsKKwkJaWYgKChyYyA8IDApICYmIChyYyAhPSAtRUlOVkFMKSkgeworCQkJdHVuZXJfZXJyKCJlcnJvciBleGVjdXRpbmcgZmx1c2g6ICVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC05MzMsMTEgKzk0MCwxNiBAQAogCSAqIHRoYXQgeGMyMDI4IHdpbGwgYmUgaW4gYSBzYWZlIHN0YXRlLgogCSAqIE1heWJlIHRoaXMgbWlnaHQgYWxzbyBiZSBuZWVkZWQgZm9yIERUVi4KIAkgKi8KLQlpZiAobmV3X3R5cGUgPT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpIHsKKwlzd2l0Y2ggKG5ld190eXBlKSB7CisJY2FzZSBWNEwyX1RVTkVSX0FOQUxPR19UVjoKIAkJcmMgPSBzZW5kX3NlcShwcml2LCB7MHgwMCwgMHgwMH0pOwogCi0JCS8qIEFuYWxvZyBtb2RlcyByZXF1aXJlIG9mZnNldCA9IDAgKi8KLQl9IGVsc2UgeworCQkvKiBBbmFsb2cgbW9kZSByZXF1aXJlcyBvZmZzZXQgPSAwICovCisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9SQURJTzoKKwkJLyogUmFkaW8gbW9kZSByZXF1aXJlcyBvZmZzZXQgPSAwICovCisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgogCQkvKgogCQkgKiBEaWdpdGFsIG1vZGVzIHJlcXVpcmUgYW4gb2Zmc2V0IHRvIGFkanVzdCB0byB0aGUKIAkJICogcHJvcGVyIGZyZXF1ZW5jeS4gVGhlIG9mZnNldCBkZXBlbmRzIG9uIHdoYXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguaCBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguaAppbmRleCA5Nzc4Yzk2Li45ZWJmYjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXIteGMyMDI4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXhjMjAyOC5oCkBAIC01NCw2ICs1NCw3IEBACiAvKiB4YzIwMjggY29tbWFuZHMgZm9yIGNhbGxiYWNrICovCiAjZGVmaW5lIFhDMjAyOF9UVU5FUl9SRVNFVAkwCiAjZGVmaW5lIFhDMjAyOF9SRVNFVF9DTEsJMQorI2RlZmluZSBYQzIwMjhfSTJDX0ZMVVNICTIKIAogI2lmIGRlZmluZWQoQ09ORklHX01FRElBX1RVTkVSX1hDMjAyOCkgfHwgKGRlZmluZWQoQ09ORklHX01FRElBX1RVTkVSX1hDMjAyOF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICp4YzIwMjhfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvTWFrZWZpbGUKaW5kZXggYjk3Y2Y3Mi4uM2QwNGE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlCkBAIC0xMiw1ICsxMiw1IEBACiBiMmMyLWZsZXhjb3AtdXNiLW9ianMgPSBmbGV4Y29wLXVzYi5vCiBvYmotJChDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9VU0IpICs9IGIyYzItZmxleGNvcC11c2IubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L01ha2VmaWxlCmluZGV4IGQ5OGYxZDQuLjA3MTNiM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogb2JqLSQoQ09ORklHX0RWQl9CVDhYWCkgKz0gYnQ4NzgubyBkdmItYnQ4eHgubyBkc3QubyBkc3RfY2EubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4Ci1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9NYWtlZmlsZQppbmRleCBkZTRmZTE5Li4zODAxOWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9NYWtlZmlsZQpAQCAtNiw5ICs2LDkgQEAKIAogb2JqLSQoQ09ORklHX0RWQl9EREJSSURHRSkgKz0gZGRicmlkZ2UubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzLwogCiAjIEZvciB0aGUgc3RhZ2luZyBDSSBkcml2ZXIgY3hkMjA5OQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLWNvcmUuYwppbmRleCA1NzNkNTQwLi5iYTlhNjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UtY29yZS5jCkBAIC01MDcsMTUgKzUwNywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc2l6ZV90IGRkYl9pbnB1dF9yZWFkKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0LCB1OCAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBkZGJfaW5wdXRfcmVhZChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCwgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBkZGIgKmRldiA9IGlucHV0LT5wb3J0LT5kZXY7CiAJdTMyIGxlZnQgPSBjb3VudDsKLQl1MzIgaWR4LCBvZmYsIGZyZWUsIHN0YXQgPSBpbnB1dC0+c3RhdDsKKwl1MzIgaWR4LCBmcmVlLCBzdGF0ID0gaW5wdXQtPnN0YXQ7CiAJaW50IHJldDsKIAogCWlkeCA9IChzdGF0ID4+IDExKSAmIDB4MWY7Ci0Jb2ZmID0gKHN0YXQgJiAweDdmZikgPDwgNzsKIAogCXdoaWxlIChsZWZ0KSB7CiAJCWlmIChpbnB1dC0+Y2J1ZiA9PSBpZHgpCkBAIC01MjUsNiArNTI0LDggQEAKIAkJCWZyZWUgPSBsZWZ0OwogCQlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmLCBpbnB1dC0+dmJ1ZltpbnB1dC0+Y2J1Zl0gKwogCQkJCSAgIGlucHV0LT5jb2ZmLCBmcmVlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUZBVUxUOwogCQlpbnB1dC0+Y29mZiArPSBmcmVlOwogCQlpZiAoaW5wdXQtPmNvZmYgPT0gaW5wdXQtPmRtYV9idWZfc2l6ZSkgewogCQkJaW5wdXQtPmNvZmYgPSAwOwpAQCAtOTM5LDYgKzk0MCw4IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJcmVhZCA9IGRkYl9pbnB1dF9yZWFkKGlucHV0LCBidWYsIGxlZnQpOworCQlpZiAocmVhZCA8IDApCisJCQlyZXR1cm4gcmVhZDsKIAkJbGVmdCAtPSByZWFkOwogCQlidWYgKz0gcmVhZDsKIAl9CkBAIC0xNDM4LDcgKzE0NDEsNyBAQAogewogCXN0cnVjdCBkZGIgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAl2b2lkICpwYXJnID0gKHZvaWQgKilhcmc7Ci0JaW50IHJlcyA9IC1FRkFVTFQ7CisJaW50IHJlczsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJT0NUTF9EREJfRkxBU0hJTzoKQEAgLTE0NDcsMjkgKzE0NTAsMjkgQEAKIAkJdTggKnJidWYsICp3YnVmOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmZmlvLCBwYXJnLCBzaXplb2YoZmlvKSkpCi0JCQlicmVhazsKLQkJaWYgKGZpby53cml0ZV9sZW4gKyBmaW8ucmVhZF9sZW4gPiAxMDI4KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIklPQlVGIHRvbyBzbWFsbFxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGZpby53cml0ZV9sZW4gPiAxMDI4IHx8IGZpby5yZWFkX2xlbiA+IDEwMjgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpby53cml0ZV9sZW4gKyBmaW8ucmVhZF9sZW4gPiAxMDI4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJd2J1ZiA9ICZkZXYtPmlvYnVmWzBdOwotCQlpZiAoIXdidWYpCi0JCQlyZXR1cm4gLUVOT01FTTsKIAkJcmJ1ZiA9IHdidWYgKyBmaW8ud3JpdGVfbGVuOwotCQlpZiAoY29weV9mcm9tX3VzZXIod2J1ZiwgZmlvLndyaXRlX2J1ZiwgZmlvLndyaXRlX2xlbikpIHsKLQkJCXZmcmVlKHdidWYpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmVzID0gZmxhc2hpbyhkZXYsIHdidWYsIGZpby53cml0ZV9sZW4sCi0JCQkgICAgICByYnVmLCBmaW8ucmVhZF9sZW4pOworCisJCWlmIChjb3B5X2Zyb21fdXNlcih3YnVmLCBmaW8ud3JpdGVfYnVmLCBmaW8ud3JpdGVfbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXMgPSBmbGFzaGlvKGRldiwgd2J1ZiwgZmlvLndyaXRlX2xlbiwgcmJ1ZiwgZmlvLnJlYWRfbGVuKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CiAJCWlmIChjb3B5X3RvX3VzZXIoZmlvLnJlYWRfYnVmLCByYnVmLCBmaW8ucmVhZF9sZW4pKQotCQkJcmVzID0gLUVGQVVMVDsKKwkJCXJldHVybiAtRUZBVUxUOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKLQkJYnJlYWs7CisJCXJldHVybiAtRU5PVFRZOwogCX0KLQlyZXR1cm4gcmVzOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZGJfZm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9NYWtlZmlsZQppbmRleCA4YWMyOGIwLi45NWEwMDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAogb2JqLSQoQ09ORklHX0RWQl9ETTExMDUpICs9IGRtMTEwNS5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IGVmZTljMzAuLjJjMGFjZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC0xNDksMzAgKzE0OSwyNSBAQAogCiAJZHByaW50ayAoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlICgmZXZlbnRzLT5tdHgpKQotCQlyZXR1cm47CisJaWYgKChzdGF0dXMgJiBGRV9IQVNfTE9DSykgJiYgZmUtPm9wcy5nZXRfZnJvbnRlbmQpCisJCWZlLT5vcHMuZ2V0X2Zyb250ZW5kKGZlLCAmZmVwcml2LT5wYXJhbWV0ZXJzX291dCk7CisKKwltdXRleF9sb2NrKCZldmVudHMtPm10eCk7CiAKIAl3cCA9IChldmVudHMtPmV2ZW50dyArIDEpICUgTUFYX0VWRU5UOwotCiAJaWYgKHdwID09IGV2ZW50cy0+ZXZlbnRyKSB7CiAJCWV2ZW50cy0+b3ZlcmZsb3cgPSAxOwogCQlldmVudHMtPmV2ZW50ciA9IChldmVudHMtPmV2ZW50ciArIDEpICUgTUFYX0VWRU5UOwogCX0KIAogCWUgPSAmZXZlbnRzLT5ldmVudHNbZXZlbnRzLT5ldmVudHddOwotCi0JaWYgKHN0YXR1cyAmIEZFX0hBU19MT0NLKQotCQlpZiAoZmUtPm9wcy5nZXRfZnJvbnRlbmQpCi0JCQlmZS0+b3BzLmdldF9mcm9udGVuZChmZSwgJmZlcHJpdi0+cGFyYW1ldGVyc19vdXQpOwotCisJZS0+c3RhdHVzID0gc3RhdHVzOwogCWUtPnBhcmFtZXRlcnMgPSBmZXByaXYtPnBhcmFtZXRlcnNfb3V0OwogCiAJZXZlbnRzLT5ldmVudHcgPSB3cDsKIAogCW11dGV4X3VubG9jaygmZXZlbnRzLT5tdHgpOwogCi0JZS0+c3RhdHVzID0gc3RhdHVzOwotCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmZXZlbnRzLT53YWl0X3F1ZXVlKTsKIH0KIApAQCAtMjA3LDE5ICsyMDIsMjQgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSAoJmV2ZW50cy0+bXR4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCW1lbWNweSAoZXZlbnQsICZldmVudHMtPmV2ZW50c1tldmVudHMtPmV2ZW50cl0sCi0JCXNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50KSk7Ci0KKwltdXRleF9sb2NrKCZldmVudHMtPm10eCk7CisJKmV2ZW50ID0gZXZlbnRzLT5ldmVudHNbZXZlbnRzLT5ldmVudHJdOwogCWV2ZW50cy0+ZXZlbnRyID0gKGV2ZW50cy0+ZXZlbnRyICsgMSkgJSBNQVhfRVZFTlQ7Ci0KIAltdXRleF91bmxvY2soJmV2ZW50cy0+bXR4KTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBkdmJfZnJvbnRlbmRfY2xlYXJfZXZlbnRzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CisJc3RydWN0IGR2Yl9mZV9ldmVudHMgKmV2ZW50cyA9ICZmZXByaXYtPmV2ZW50czsKKworCW11dGV4X2xvY2soJmV2ZW50cy0+bXR4KTsKKwlldmVudHMtPmV2ZW50ciA9IGV2ZW50cy0+ZXZlbnR3OworCW11dGV4X3VubG9jaygmZXZlbnRzLT5tdHgpOworfQorCiBzdGF0aWMgdm9pZCBkdmJfZnJvbnRlbmRfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlkcHJpbnRrICgiRFZCOiBpbml0aWFsaXNpbmcgYWRhcHRlciAlaSBmcm9udGVuZCAlaSAoJXMpLi4uXG4iLApAQCAtNTM3LDcgKzUzNyw2IEBACiB7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUgPSBkYXRhOwogCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWZlX3N0YXR1c190IHM7CiAJZW51bSBkdmJmZV9hbGdvIGFsZ287CiAKQEAgLTU1OCw3ICs1NTcsNyBAQAogCXdoaWxlICgxKSB7CiAJCXVwKCZmZXByaXYtPnNlbSk7CSAgICAvKiBpcyBsb2NrZWQgd2hlbiB3ZSBlbnRlciB0aGUgdGhyZWFkLi4uICovCiByZXN0YXJ0OgotCQl0aW1lb3V0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZmVwcml2LT53YWl0X3F1ZXVlLAorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChmZXByaXYtPndhaXRfcXVldWUsCiAJCQlkdmJfZnJvbnRlbmRfc2hvdWxkX3dha2V1cChmZSkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpCiAJCQkJfHwgZnJlZXppbmcoY3VycmVudCksCiAJCQlmZXByaXYtPmRlbGF5KTsKQEAgLTU3NywxMiArNTc2LDEwIEBACiAKIAkJaWYgKGZlcHJpdi0+cmVpbml0aWFsaXNlKSB7CiAJCQlkdmJfZnJvbnRlbmRfaW5pdChmZSk7Ci0JCQlpZiAoZmVwcml2LT50b25lICE9IC0xKSB7CisJCQlpZiAoZmUtPm9wcy5zZXRfdG9uZSAmJiBmZXByaXYtPnRvbmUgIT0gLTEpCiAJCQkJZmUtPm9wcy5zZXRfdG9uZShmZSwgZmVwcml2LT50b25lKTsKLQkJCX0KLQkJCWlmIChmZXByaXYtPnZvbHRhZ2UgIT0gLTEpIHsKKwkJCWlmIChmZS0+b3BzLnNldF92b2x0YWdlICYmIGZlcHJpdi0+dm9sdGFnZSAhPSAtMSkKIAkJCQlmZS0+b3BzLnNldF92b2x0YWdlKGZlLCBmZXByaXYtPnZvbHRhZ2UpOwotCQkJfQogCQkJZmVwcml2LT5yZWluaXRpYWxpc2UgPSAwOwogCQl9CiAKQEAgLTEwMTksNiArMTAxNiwyOSBAQAogCXJldHVybiAwOwogfQogCisvKiBJbml0aWFsaXplIHRoZSBjYWNoZSB3aXRoIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZGVyaXZlZCBmcm9tIHRoZQorICogbGVnYWN5IGZyb250ZW5kX2luZm8gc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBkdHZfcHJvcGVydHlfY2FjaGVfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjKQoreworCXN3aXRjaCAoZmUtPm9wcy5pbmZvLnR5cGUpIHsKKwljYXNlIEZFX1FQU0s6CisJCWMtPm1vZHVsYXRpb24gPSBRUFNLOyAgIC8qIGltcGxpZWQgZm9yIERWQi1TIGluIGxlZ2FjeSBBUEkgKi8KKwkJYy0+cm9sbG9mZiA9IFJPTExPRkZfMzU7LyogaW1wbGllZCBmb3IgRFZCLVMgKi8KKwkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gU1lTX0RWQlM7CisJCWJyZWFrOworCWNhc2UgRkVfUUFNOgorCQljLT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfRFZCQ19BTk5FWF9BQzsKKwkJYnJlYWs7CisJY2FzZSBGRV9PRkRNOgorCQljLT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfRFZCVDsKKwkJYnJlYWs7CisJY2FzZSBGRV9BVFNDOgorCQlicmVhazsKKwl9Cit9CisKIC8qIFN5bmNocm9uaXNlIHRoZSBsZWdhY3kgdHVuaW5nIHBhcmFtZXRlcnMgaW50byB0aGUgY2FjaGUsIHNvIHRoYXQgZGVtb2R1bGF0b3IKICAqIGRyaXZlcnMgY2FuIHVzZSBhIHNpbmdsZSBzZXRfZnJvbnRlbmQgdHVuaW5nIGZ1bmN0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKICAqIGl0J3MgYmVpbmcgdXNlZCBmb3IgdGhlIGxlZ2FjeSBvciBuZXcgQVBJLCByZWR1Y2luZyBjb2RlIGFuZCBjb21wbGV4aXR5LgpAQCAtMTAzMiwxNyArMTA1MiwxMyBAQAogCiAJc3dpdGNoIChmZS0+b3BzLmluZm8udHlwZSkgewogCWNhc2UgRkVfUVBTSzoKLQkJYy0+bW9kdWxhdGlvbiA9IFFQU0s7ICAgLyogaW1wbGllZCBmb3IgRFZCLVMgaW4gbGVnYWN5IEFQSSAqLwotCQljLT5yb2xsb2ZmID0gUk9MTE9GRl8zNTsvKiBpbXBsaWVkIGZvciBEVkItUyAqLwogCQljLT5zeW1ib2xfcmF0ZSA9IHAtPnUucXBzay5zeW1ib2xfcmF0ZTsKIAkJYy0+ZmVjX2lubmVyID0gcC0+dS5xcHNrLmZlY19pbm5lcjsKLQkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gU1lTX0RWQlM7CiAJCWJyZWFrOwogCWNhc2UgRkVfUUFNOgogCQljLT5zeW1ib2xfcmF0ZSA9IHAtPnUucWFtLnN5bWJvbF9yYXRlOwogCQljLT5mZWNfaW5uZXIgPSBwLT51LnFhbS5mZWNfaW5uZXI7CiAJCWMtPm1vZHVsYXRpb24gPSBwLT51LnFhbS5tb2R1bGF0aW9uOwotCQljLT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfRFZCQ19BTk5FWF9BQzsKIAkJYnJlYWs7CiAJY2FzZSBGRV9PRkRNOgogCQlpZiAocC0+dS5vZmRtLmJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfNl9NSFopCkBAIC0xMDYwLDcgKzEwNzYsNiBAQAogCQljLT50cmFuc21pc3Npb25fbW9kZSA9IHAtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZTsKIAkJYy0+Z3VhcmRfaW50ZXJ2YWwgPSBwLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWw7CiAJCWMtPmhpZXJhcmNoeSA9IHAtPnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb247Ci0JCWMtPmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19EVkJUOwogCQlicmVhazsKIAljYXNlIEZFX0FUU0M6CiAJCWMtPm1vZHVsYXRpb24gPSBwLT51LnZzYi5tb2R1bGF0aW9uOwpAQCAtMTEzMiwxNiArMTE0NywxMyBAQAogCXAtPmZyZXF1ZW5jeSA9IGMtPmZyZXF1ZW5jeTsKIAlwLT5pbnZlcnNpb24gPSBjLT5pbnZlcnNpb247CiAKLQlzd2l0Y2goYy0+bW9kdWxhdGlvbikgewotCWNhc2UgUFNLXzg6Ci0JY2FzZSBBUFNLXzE2OgotCWNhc2UgQVBTS18zMjoKLQljYXNlIFFQU0s6CisJaWYgKGMtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfRFNTIHx8CisJICAgIGMtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfRFZCUyB8fAorCSAgICBjLT5kZWxpdmVyeV9zeXN0ZW0gPT0gU1lTX0RWQlMyIHx8CisJICAgIGMtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfSVNEQlMgfHwKKwkgICAgYy0+ZGVsaXZlcnlfc3lzdGVtID09IFNZU19UVVJCTykgewogCQlwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBjLT5zeW1ib2xfcmF0ZTsKIAkJcC0+dS5xcHNrLmZlY19pbm5lciA9IGMtPmZlY19pbm5lcjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CiAJfQogCiAJLyogRmFrZSBvdXQgYSBnZW5lcmljIERWQi1UIHJlcXVlc3Qgc28gd2UgcGFzcyB2YWxpZGF0aW9uIGluIHRoZSBpb2N0bCAqLwpAQCAtMTgyNCw5ICsxODM2LDE3IEBACiAKIAkJCW1lbWNweSAoJmZlcHJpdi0+cGFyYW1ldGVyc19pbiwgcGFyZywKIAkJCQlzaXplb2YgKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykpOworCQkJZHR2X3Byb3BlcnR5X2NhY2hlX2luaXQoZmUsIGMpOwogCQkJZHR2X3Byb3BlcnR5X2NhY2hlX3N5bmMoZmUsIGMsICZmZXByaXYtPnBhcmFtZXRlcnNfaW4pOwogCQl9CiAKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSBvdXRwdXQgcGFyYW1ldGVycyB0byBtYXRjaCB0aGUgdmFsdWVzIGdpdmVuIGJ5CisJCSAqIHRoZSB1c2VyLiBGRV9TRVRfRlJPTlRFTkQgdHJpZ2dlcnMgYW4gaW5pdGlhbCBmcm9udGVuZCBldmVudAorCQkgKiB3aXRoIHN0YXR1cyA9IDAsIHdoaWNoIGNvcGllcyBvdXRwdXQgcGFyYW1ldGVycyB0byB1c2Vyc3BhY2UuCisJCSAqLworCQlmZXByaXYtPnBhcmFtZXRlcnNfb3V0ID0gZmVwcml2LT5wYXJhbWV0ZXJzX2luOworCiAJCW1lbXNldCgmZmV0dW5lc2V0dGluZ3MsIDAsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MpKTsKIAkJbWVtY3B5KCZmZXR1bmVzZXR0aW5ncy5wYXJhbWV0ZXJzLCBwYXJnLAogCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpKTsKQEAgLTE4ODQsOCArMTkwNCw5IEBACiAJCS8qIFJlcXVlc3QgdGhlIHNlYXJjaCBhbGdvcml0aG0gdG8gc2VhcmNoICovCiAJCWZlcHJpdi0+YWxnb19zdGF0dXMgfD0gRFZCRkVfQUxHT19TRUFSQ0hfQUdBSU47CiAKLQkJZHZiX2Zyb250ZW5kX3dha2V1cChmZSk7CisJCWR2Yl9mcm9udGVuZF9jbGVhcl9ldmVudHMoZmUpOwogCQlkdmJfZnJvbnRlbmRfYWRkX2V2ZW50KGZlLCAwKTsKKwkJZHZiX2Zyb250ZW5kX3dha2V1cChmZSk7CiAJCWZlcHJpdi0+c3RhdHVzID0gMDsKIAkJZXJyID0gMDsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCmluZGV4IDU1OTBlYjYuLjY3YmJmYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCkBAIC0yMDksNiArMjA5LDcgQEAKIAogCWludCAoKmdldF9mcmVxdWVuY3kpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSk7CiAJaW50ICgqZ2V0X2JhbmR3aWR0aCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmFuZHdpZHRoKTsKKwlpbnQgKCpnZXRfaWZfZnJlcXVlbmN5KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpOwogCiAjZGVmaW5lIFRVTkVSX1NUQVRVU19MT0NLRUQgMQogI2RlZmluZSBUVU5FUl9TVEFUVVNfU1RFUkVPIDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwppbmRleCA1ZDczZGVjLi41ODI1NzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCkBAIC0yNTgsNiArMjU4LDE5IEBACiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIGRlZmF1bHQgcmVtb3RlIGNvbnRyb2wgZGVjb2RpbmcgZm9yIHRoZQogCSAgQWZhdGVjaCBBRjkwMDUgYmFzZWQgcmVjZWl2ZXIuCiAKK2NvbmZpZyBEVkJfVVNCX1BDVFY0NTJFCisJdHJpc3RhdGUgIlBpbm5hY2xlIFBDVFYgSERUViBQcm8gVVNCIGRldmljZS9UVCBDb25uZWN0IFMyLTM2MDAiCisJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IFRUUENJX0VFUFJPTQorCXNlbGVjdCBEVkJfTE5CUDIyIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVEIwODk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVEI2MTAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgU3VwcG9ydCBmb3IgZXh0ZXJuYWwgVVNCIGFkYXB0ZXIgZGVzaWduZWQgYnkgUGlubmFjbGUsCisJICBzaGlwcGVkIHVuZGVyIHRoZSBicmFuZCBuYW1lICdQQ1RWIEhEVFYgUHJvIFVTQicuCisJICBBbHNvIHN1cHBvcnRzIFRUIENvbm5lY3QgUzItMzYwMC8zNjUwIGNhcmRzLgorCSAgU2F5IFkgaWYgeW91IG93biBzdWNoIGEgZGV2aWNlIGFuZCB3YW50IHRvIHVzZSBpdC4KKwogY29uZmlnIERWQl9VU0JfRFcyMTAyCiAJdHJpc3RhdGUgIkR2YldvcmxkICYgVGVWaWkgRFZCLVMvUzIgVVNCMi4wIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCkBAIC0zNzQsMyArMzg3LDE4IEBACiAJc2VsZWN0IERWQl9TVFY2MTEweCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgVGVjaG5pc2F0IFVTQjIgRFZCLVMvUzIgZGV2aWNlCisKK2NvbmZpZyBEVkJfVVNCX0lUOTEzWAorCXRyaXN0YXRlICJpdDkxM3ggZHJpdmVyIgorCWRlcGVuZHMgb24gRFZCX1VTQgorCXNlbGVjdCBEVkJfSVQ5MTNYX0ZFCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBpdDkxM3ggZGV2aWNlCisKK2NvbmZpZyBEVkJfVVNCX01YTDExMVNGCisJdHJpc3RhdGUgIk14TDExMVNGIERUViBVU0IyLjAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX0xHRFQzMzA1IGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IFZJREVPX1RWRUVQUk9NCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBNeEwxMTFTRiBVU0IyLjAgRFRWIHJlY2VpdmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKaW5kZXggNGJhYzEzZC4uMjZjOGI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCkBAIC02NCw2ICs2NCw5IEBACiBkdmItdXNiLWFueXNlZS1vYmpzID0gYW55c2VlLm8KIG9iai0kKENPTkZJR19EVkJfVVNCX0FOWVNFRSkgKz0gZHZiLXVzYi1hbnlzZWUubwogCitkdmItdXNiLXBjdHY0NTJlLW9ianMgPSBwY3R2NDUyZS5vCitvYmotJChDT05GSUdfRFZCX1VTQl9QQ1RWNDUyRSkgKz0gZHZiLXVzYi1wY3R2NDUyZS5vCisKIGR2Yi11c2ItZHcyMTAyLW9ianMgPSBkdzIxMDIubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfRFcyMTAyKSArPSBkdmItdXNiLWR3MjEwMi5vCiAKQEAgLTk0LDcgKzk3LDE2IEBACiBkdmItdXNiLXRlY2huaXNhdC11c2IyLW9ianMgPSB0ZWNobmlzYXQtdXNiMi5vCiBvYmotJChDT05GSUdfRFZCX1VTQl9URUNITklTQVRfVVNCMikgKz0gZHZiLXVzYi10ZWNobmlzYXQtdXNiMi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KK2R2Yi11c2ItaXQ5MTN4LW9ianMgOj0gaXQ5MTN4Lm8KK29iai0kKENPTkZJR19EVkJfVVNCX0lUOTEzWCkgKz0gZHZiLXVzYi1pdDkxM3gubworCitkdmItdXNiLW14bDExMXNmLW9ianMgPSBteGwxMTFzZi5vIG14bDExMXNmLXBoeS5vIG14bDExMXNmLWkyYy5vIG14bDExMXNmLWdwaW8ubworb2JqLSQoQ09ORklHX0RWQl9VU0JfTVhMMTExU0YpICs9IGR2Yi11c2ItbXhsMTExc2Yubworb2JqLSQoQ09ORklHX0RWQl9VU0JfTVhMMTExU0YpICs9IG14bDExMXNmLWRlbW9kLm8KK29iai0kKENPTkZJR19EVkJfVVNCX01YTDExMVNGKSArPSBteGwxMTFzZi10dW5lci5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KICMgZHVlIHRvIHR1bmVyLXhjMzAyOAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL3R0cGNpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKaW5kZXggYjk1YTk1ZS4uMmFlZjNjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKQEAgLTEyNyw2ICsxMjcsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBkaWJ1c2IyXzBfc3RyZWFtaW5nX2N0cmwsCkBAIC0xNDcsNyArMTQ5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCi0KKwkJfX0sCiAJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKIAkJfSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LWZlLmMKaW5kZXggNmFkOTQ3NDUuLjMyNjNlOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUtZmUuYwpAQCAtNjMsMTEgKzYzLDkgQEAKIAkJCQkgdTE2IHJlZ2xvLCB1OCBwb3MsIHU4IGxlbiwgdTE2IHZhbHVlKQogewogCWludCByZXQ7Ci0JdTggdGVtcDsKIAogCWlmICgocmV0ID0gYWY5MDA1X3dyaXRlX29mZG1fcmVnaXN0ZXIoZCwgcmVnbG8sICh1OCkgKHZhbHVlICYgMHhmZikpKSkKIAkJcmV0dXJuIHJldDsKLQl0ZW1wID0gKHU4KSAoKHZhbHVlICYgMHgwMzAwKSA+PiA4KTsKIAlyZXR1cm4gYWY5MDA1X3dyaXRlX3JlZ2lzdGVyX2JpdHMoZCwgcmVnaGksIHBvcywgbGVuLAogCQkJCQkgICh1OCkgKCh2YWx1ZSAmIDB4MzAwKSA+PiA4KSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUuYwppbmRleCAwMzUxYzBlLi5iZDUxYTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LmMKQEAgLTgxNSw3ICs4MTUsNyBAQAogCQkJZGVidWdfZHVtcChidWYsIDgsIHByaW50ayk7CiAJCX0KIAl9Ci0JYWRhcC0+ZmUgPSBhZjkwMDVfZmVfYXR0YWNoKGFkYXAtPmRldik7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGFmOTAwNV9mZV9hdHRhY2goYWRhcC0+ZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTk5LDYgKzk5OSw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCSAgICB7CisJCSAgICAubnVtX2Zyb250ZW5kcyA9IDEsCisJCSAgICAuZmUgPSB7ewogCQkgICAgIC5jYXBzID0KIAkJICAgICBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkgICAgIERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLApAQCAtMTAxOCw2ICsxMDIwLDcgQEAKIAkJCQkJICAgICAgIH0KIAkJCQkgICAgICB9CiAJCQkJfSwKKwkJICAgICB9fSwKIAkJICAgICB9CiAJCSAgICB9LAogCS5wb3dlcl9jdHJsID0gYWY5MDA1X3Bvd2VyX2N0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYwppbmRleCBkN2FkMDVmLi5jNmMyNzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKQEAgLTc0NCwyOSArNzQ0LDMxIEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFmOTAxNV9yY19zZXR1cCBhZjkwMTVfcmNfc2V0dXBfdXNiaWRzW10gPSB7Ci0JeyAoVVNCX1ZJRF9URVJSQVRFQyA8PCAxNikgKyBVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfVF9TVElDS19SQywKKwl7IChVU0JfVklEX1RFUlJBVEVDIDw8IDE2KSB8IFVTQl9QSURfVEVSUkFURUNfQ0lORVJHWV9UX1NUSUNLX1JDLAogCQlSQ19NQVBfVEVSUkFURUNfU0xJTV8yIH0sCi0JeyAoVVNCX1ZJRF9URVJSQVRFQyA8PCAxNikgKyBVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfVF9TVElDS19EVUFMX1JDLAorCXsgKFVTQl9WSURfVEVSUkFURUMgPDwgMTYpIHwgVVNCX1BJRF9URVJSQVRFQ19DSU5FUkdZX1RfU1RJQ0tfRFVBTF9SQywKIAkJUkNfTUFQX1RFUlJBVEVDX1NMSU0gfSwKLQl7IChVU0JfVklEX1ZJU0lPTlBMVVMgPDwgMTYpICsgVVNCX1BJRF9BWlVSRVdBVkVfQURfVFU3MDAsCisJeyAoVVNCX1ZJRF9WSVNJT05QTFVTIDw8IDE2KSB8IFVTQl9QSURfQVpVUkVXQVZFX0FEX1RVNzAwLAogCQlSQ19NQVBfQVpVUkVXQVZFX0FEX1RVNzAwIH0sCi0JeyAoVVNCX1ZJRF9WSVNJT05QTFVTIDw8IDE2KSArIFVTQl9QSURfVElOWVRXSU4sCisJeyAoVVNCX1ZJRF9WSVNJT05QTFVTIDw8IDE2KSB8IFVTQl9QSURfVElOWVRXSU4sCiAJCVJDX01BUF9BWlVSRVdBVkVfQURfVFU3MDAgfSwKLQl7IChVU0JfVklEX01TSV8yIDw8IDE2KSArIFVTQl9QSURfTVNJX0RJR0lfVk9YX01JTklfSUlJLAorCXsgKFVTQl9WSURfTVNJXzIgPDwgMTYpIHwgVVNCX1BJRF9NU0lfRElHSV9WT1hfTUlOSV9JSUksCiAJCVJDX01BUF9NU0lfRElHSVZPWF9JSUkgfSwKLQl7IChVU0JfVklEX01TSV8yIDw8IDE2KSArIFVTQl9QSURfTVNJX0RJR0lWT1hfRFVPLAorCXsgKFVTQl9WSURfTVNJXzIgPDwgMTYpIHwgVVNCX1BJRF9NU0lfRElHSVZPWF9EVU8sCiAJCVJDX01BUF9NU0lfRElHSVZPWF9JSUkgfSwKLQl7IChVU0JfVklEX0xFQURURUsgPDwgMTYpICsgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfR09MRCwKKwl7IChVU0JfVklEX0xFQURURUsgPDwgMTYpIHwgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfR09MRCwKIAkJUkNfTUFQX0xFQURURUtfWTA0RzAwNTEgfSwKLQl7IChVU0JfVklEX0FWRVJNRURJQSA8PCAxNikgKyBVU0JfUElEX0FWRVJNRURJQV9WT0xBUl9YLAorCXsgKFVTQl9WSURfTEVBRFRFSyA8PCAxNikgfCBVU0JfUElEX1dJTkZBU1RfRFRWMjAwMERTLAorCQlSQ19NQVBfTEVBRFRFS19ZMDRHMDA1MSB9LAorCXsgKFVTQl9WSURfQVZFUk1FRElBIDw8IDE2KSB8IFVTQl9QSURfQVZFUk1FRElBX1ZPTEFSX1gsCiAJCVJDX01BUF9BVkVSTUVESUFfTTEzNUEgfSwKLQl7IChVU0JfVklEX0FGQVRFQ0ggPDwgMTYpICsgVVNCX1BJRF9UUkVLU1RPUl9EVkJULAorCXsgKFVTQl9WSURfQUZBVEVDSCA8PCAxNikgfCBVU0JfUElEX1RSRUtTVE9SX0RWQlQsCiAJCVJDX01BUF9UUkVLU1RPUiB9LAotCXsgKFVTQl9WSURfS1dPUkxEXzIgPDwgMTYpICsgVVNCX1BJRF9USU5ZVFdJTl8yLAorCXsgKFVTQl9WSURfS1dPUkxEXzIgPDwgMTYpIHwgVVNCX1BJRF9USU5ZVFdJTl8yLAogCQlSQ19NQVBfRElHSVRBTE5PV19USU5ZVFdJTiB9LAotCXsgKFVTQl9WSURfR1RFSyA8PCAxNikgKyBVU0JfUElEX1RJTllUV0lOXzMsCisJeyAoVVNCX1ZJRF9HVEVLIDw8IDE2KSB8IFVTQl9QSURfVElOWVRXSU5fMywKIAkJUkNfTUFQX0RJR0lUQUxOT1dfVElOWVRXSU4gfSwKLQl7IChVU0JfVklEX0tXT1JMRF8yIDw8IDE2KSArIFVTQl9QSURfU1ZFT05fU1RWMjIsCisJeyAoVVNCX1ZJRF9LV09STERfMiA8PCAxNikgfCBVU0JfUElEX1NWRU9OX1NUVjIyLAogCQlSQ19NQVBfTVNJX0RJR0lWT1hfSUlJIH0sCiAJeyB9CiB9OwpAQCAtODU5LDEzICs4NjEsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgYWY5MDE1X3Byb3BlcnRpZXNfY291bnQ7IGkrKykgewogCQkvKiBVU0IxLjEgc2V0IHNtYWxsZXIgYnVmZmVyc2l6ZSBhbmQgZGlzYWJsZSAybmQgYWRhcHRlciAqLwogCQlpZiAodWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwpIHsKLQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLmFkYXB0ZXJbMF0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplCisJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5hZGFwdGVyWzBdLmZlWzBdLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZQogCQkJCT0gVFNfVVNCMTFfRlJBTUVfU0laRTsKIAkJCS8qIGRpc2FibGUgMm5kIGFkYXB0ZXIgYmVjYXVzZSB3ZSBkb24ndCBoYXZlCiAJCQkgICBQSUQtZmlsdGVycyAqLwogCQkJYWY5MDE1X2NvbmZpZy5kdWFsX21vZGUgPSAwOwogCQl9IGVsc2UgewotCQkJYWY5MDE1X3Byb3BlcnRpZXNbaV0uYWRhcHRlclswXS5zdHJlYW0udS5idWxrLmJ1ZmZlcnNpemUKKwkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLmFkYXB0ZXJbMF0uZmVbMF0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplCiAJCQkJPSBUU19VU0IyMF9GUkFNRV9TSVpFOwogCQl9CiAJfQpAQCAtMTExMSwxMCArMTExMywxMCBAQAogCX0KIAogCS8qIGF0dGFjaCBkZW1vZHVsYXRvciAqLwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChhZjkwMTNfYXR0YWNoLCAmYWY5MDE1X2FmOTAxM19jb25maWdbYWRhcC0+aWRdLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGFmOTAxM19hdHRhY2gsICZhZjkwMTVfYWY5MDEzX2NvbmZpZ1thZGFwLT5pZF0sCiAJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCiBzdGF0aWMgc3RydWN0IG10MjA2MF9jb25maWcgYWY5MDE1X210MjA2MF9jb25maWcgPSB7CkBAIC0xMTg4LDQ5ICsxMTkwLDQ5IEBACiAJc3dpdGNoIChhZjkwMTVfYWY5MDEzX2NvbmZpZ1thZGFwLT5pZF0udHVuZXIpIHsKIAljYXNlIEFGOTAxM19UVU5FUl9NVDIwNjA6CiAJY2FzZSBBRjkwMTNfVFVORVJfTVQyMDYwXzI6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXQyMDYwX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKG10MjA2MF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9tdDIwNjBfY29uZmlnLAogCQkJYWY5MDE1X2NvbmZpZy5tdDIwNjBfaWYxW2FkYXAtPmlkXSkKIAkJCT09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfUVQxMDEwOgogCWNhc2UgQUY5MDEzX1RVTkVSX1FUMTAxMEE6Ci0JCXJldCA9IGR2Yl9hdHRhY2gocXQxMDEwX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9xdDEwMTBfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX1REQTE4MjcxOgotCQlyZXQgPSBkdmJfYXR0YWNoKHRkYTE4MjcxX2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsCisJCXJldCA9IGR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweGMwLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkmYWY5MDE1X3RkYTE4MjcxX2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9UREExODIxODoKLQkJcmV0ID0gZHZiX2F0dGFjaCh0ZGExODIxOF9hdHRhY2gsIGFkYXAtPmZlLAorCQlyZXQgPSBkdmJfYXR0YWNoKHRkYTE4MjE4X2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV90ZGExODIxOF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwM0Q6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA1c19hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfbXhsNTAwM19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwNUQ6CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwNVI6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA1c19hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfbXhsNTAwNV9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfRU5WNzdIMTFENToKLQkJcmV0ID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsCisJCXJldCA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIDB4YzAsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCURWQl9QTExfVERBNjY1WCkgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9NQzQ0UzgwMzoKLQkJcmV0ID0gZHZiX2F0dGFjaChtYzQ0czgwM19hdHRhY2gsIGFkYXAtPmZlLAorCQlyZXQgPSBkdmJfYXR0YWNoKG1jNDRzODAzX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9tYzQ0czgwM19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwN1Q6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwN3RfYXR0YWNoLCBhZGFwLT5mZSwKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA3dF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCTB4YzAsICZhZjkwMTVfbXhsNTAwN3RfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwpAQCAtMTMwNCw2ICsxMzA2LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAKQEAgLTEzMTksOCArMTMyMywxMSBAQAogCQkJCQkuY291bnQgPSA2LAogCQkJCQkuZW5kcG9pbnQgPSAweDg0LAogCQkJCX0sCisJCQl9fSwKIAkJCX0sCiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5mcm9udGVuZF9hdHRhY2ggPQogCQkJCQlhZjkwMTVfYWY5MDEzX2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgID0gYWY5MDE1X3R1bmVyX2F0dGFjaCwKQEAgLTEzMzUsNiArMTM0Miw3IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9LAorCQkJfX0sCiAJCQl9CiAJCX0sCiAKQEAgLTE0MzIsNiArMTQ0MCw4IEBACiAJCS5udW1fYWRhcHRlcnMgPSAyLAogCQkuYWRhcHRlciA9IHsKIAkJCXsKKwkJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJCS5mZSA9IHt7CiAJCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCkBAIC0xNDQ3LDggKzE0NTcsMTEgQEAKIAkJCQkJLmNvdW50ID0gNiwKIAkJCQkJLmVuZHBvaW50ID0gMHg4NCwKIAkJCQl9LAorCQkJfX0sCiAJCQl9LAogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoID0KIAkJCQkJYWY5MDE1X2FmOTAxM19mcm9udGVuZF9hdHRhY2gsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICA9IGFmOTAxNV90dW5lcl9hdHRhY2gsCkBAIC0xNDYzLDYgKzE0NzYsNyBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfSwKKwkJCX19LAogCQkJfQogCQl9LAogCkBAIC0xNTQ5LDYgKzE1NjMsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMiwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwKIAkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtMTU2NCw4ICsxNTgwLDExIEBACiAJCQkJCS5jb3VudCA9IDYsCiAJCQkJCS5lbmRwb2ludCA9IDB4ODQsCiAJCQkJfSwKKwkJCX19LAogCQkJfSwKIAkJCXsKKwkJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJCS5mZSA9IHt7CiAJCQkJLmZyb250ZW5kX2F0dGFjaCA9CiAJCQkJCWFmOTAxNV9hZjkwMTNfZnJvbnRlbmRfYXR0YWNoLAogCQkJCS50dW5lcl9hdHRhY2ggICAgPSBhZjkwMTVfdHVuZXJfYXR0YWNoLApAQCAtMTU4MCw2ICsxNTk5LDcgQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0sCisJCQl9fSwKIAkJCX0KIAkJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKaW5kZXggMmNiZjE5YS4uNWYyMjc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCkBAIC00NDYsNiArNDQ2LDExNCBAQAogICogSU9FWzVdIFNUVjA5MDMgMT1lbmFibGVkCiAgKi8KIAorc3RhdGljIGludCBhbnlzZWVfZnJvbnRlbmRfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IG9ub2ZmKQoreworCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAgPSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCBhbnlzZWVfc3RhdGUgKnN0YXRlID0gYWRhcC0+ZGV2LT5wcml2OworCWludCByZXQ7CisKKwlkZWJfaW5mbygiJXM6IGZlPSVkIG9ub2ZmPSVkXG4iLCBfX2Z1bmNfXywgZmUtPmlkLCBvbm9mZik7CisKKwkvKiBubyBmcm9udGVuZCBzbGVlcCBjb250cm9sICovCisJaWYgKG9ub2ZmID09IDApCisJCXJldHVybiAwOworCisJc3dpdGNoIChzdGF0ZS0+aHcpIHsKKwljYXNlIEFOWVNFRV9IV181MDdGQTogLyogMTUgKi8KKwkJLyogRTMwIENvbWJvIFBsdXMgKi8KKwkJLyogRTMwIEMgUGx1cyAqLworCisJCWlmICgoZmUtPmlkIF4gZHZiX3VzYl9hbnlzZWVfZGVsc3lzKSA9PSAwKSAgeworCQkJLyogZGlzYWJsZSBEVkItVCBkZW1vZCBvbiBJT0RbMF0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgwIDw8IDApLAorCQkJCTB4MDEpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBlbmFibGUgRFZCLUMgZGVtb2Qgb24gSU9EWzVdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMSA8PCA1KSwKKwkJCQkweDIwKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKworCQkJLyogZW5hYmxlIERWQi1DIHR1bmVyIG9uIElPRVswXSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRSwgKDEgPDwgMCksCisJCQkJMHgwMSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisJCX0gZWxzZSB7CisJCQkvKiBkaXNhYmxlIERWQi1DIGRlbW9kIG9uIElPRFs1XSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDAgPDwgNSksCisJCQkJMHgyMCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIGVuYWJsZSBEVkItVCBkZW1vZCBvbiBJT0RbMF0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgxIDw8IDApLAorCQkJCTB4MDEpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBlbmFibGUgRFZCLVQgdHVuZXIgb24gSU9FWzBdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9FLCAoMCA8PCAwKSwKKwkJCQkweDAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgQU5ZU0VFX0hXXzUwOFRDOiAvKiAxOCAqLworCWNhc2UgQU5ZU0VFX0hXXzUwOFBUQzogLyogMjEgKi8KKwkJLyogRTcgVEMgKi8KKwkJLyogRTcgUFRDICovCisKKwkJaWYgKChmZS0+aWQgXiBkdmJfdXNiX2FueXNlZV9kZWxzeXMpID09IDApICB7CisJCQkvKiBkaXNhYmxlIERWQi1UIGRlbW9kIG9uIElPRFs2XSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDAgPDwgNiksCisJCQkJMHg0MCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIGVuYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbNV0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgxIDw8IDUpLAorCQkJCTB4MjApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBlbmFibGUgSUYgcm91dGUgb24gSU9FWzBdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9FLCAoMSA8PCAwKSwKKwkJCQkweDAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlIHsKKwkJCS8qIGRpc2FibGUgRFZCLUMgZGVtb2Qgb24gSU9EWzVdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMCA8PCA1KSwKKwkJCQkweDIwKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKworCQkJLyogZW5hYmxlIERWQi1UIGRlbW9kIG9uIElPRFs2XSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDEgPDwgNiksCisJCQkJMHg0MCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIGVuYWJsZSBJRiByb3V0ZSBvbiBJT0VbMF0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0UsICgwIDw8IDApLAorCQkJCTB4MDEpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gMDsKKwl9CisKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgYW55c2VlX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCWludCByZXQ7CkBAIC00NjYsNDEgKzU3NCw1NCBAQAogCQl9CiAJfTsKIAotCS8qIENoZWNrIHdoaWNoIGhhcmR3YXJlIHdlIGhhdmUuCi0JICogV2UgbXVzdCBkbyB0aGlzIGNhbGwgdHdvIHRpbWVzIHRvIGdldCByZWxpYWJsZSB2YWx1ZXMgKGh3IGJ1ZykuCi0JICovCi0JcmV0ID0gYW55c2VlX2dldF9od19pbmZvKGFkYXAtPmRldiwgaHdfaW5mbyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKKwkvKiBkZXRlY3QgaGFyZHdhcmUgb25seSBvbmNlICovCisJaWYgKGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkgeworCQkvKiBDaGVjayB3aGljaCBoYXJkd2FyZSB3ZSBoYXZlLgorCQkgKiBXZSBtdXN0IGRvIHRoaXMgY2FsbCB0d28gdGltZXMgdG8gZ2V0IHJlbGlhYmxlIHZhbHVlcyAoaHcgYnVnKS4KKwkJICovCisJCXJldCA9IGFueXNlZV9nZXRfaHdfaW5mbyhhZGFwLT5kZXYsIGh3X2luZm8pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKIAotCXJldCA9IGFueXNlZV9nZXRfaHdfaW5mbyhhZGFwLT5kZXYsIGh3X2luZm8pOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7CisJCXJldCA9IGFueXNlZV9nZXRfaHdfaW5mbyhhZGFwLT5kZXYsIGh3X2luZm8pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKIAotCS8qIE1lYW5pbmcgb2YgdGhlc2UgaW5mbyBieXRlcyBhcmUgZ3Vlc3NlZC4gKi8KLQlpbmZvKCJmaXJtd2FyZSB2ZXJzaW9uOiVkLiVkIGhhcmR3YXJlIGlkOiVkIiwKLQkJaHdfaW5mb1sxXSwgaHdfaW5mb1syXSwgaHdfaW5mb1swXSk7CisJCS8qIE1lYW5pbmcgb2YgdGhlc2UgaW5mbyBieXRlcyBhcmUgZ3Vlc3NlZC4gKi8KKwkJaW5mbygiZmlybXdhcmUgdmVyc2lvbjolZC4lZCBoYXJkd2FyZSBpZDolZCIsCisJCQlod19pbmZvWzFdLCBod19pbmZvWzJdLCBod19pbmZvWzBdKTsKIAotCXN0YXRlLT5odyA9IGh3X2luZm9bMF07CisJCXN0YXRlLT5odyA9IGh3X2luZm9bMF07CisJfQorCisJLyogc2V0IGN1cnJlbnQgZnJvbmRlbmQgSUQgZm9yIGRldmljZXMgaGF2aW5nIHR3byBmcm9uZGVuZHMgKi8KKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkKKwkJc3RhdGUtPmZlX2lkKys7CiAKIAlzd2l0Y2ggKHN0YXRlLT5odykgewogCWNhc2UgQU5ZU0VFX0hXXzUwN1Q6IC8qIDIgKi8KIAkJLyogRTMwICovCiAKLQkJLyogYXR0YWNoIGRlbW9kICovCi0JCWFkYXAtPmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZhbnlzZWVfbXQzNTJfY29uZmlnLAotCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCQlpZiAoYWRhcC0+ZmUpCisJCWlmIChzdGF0ZS0+ZmVfaWQpCiAJCQlicmVhazsKIAogCQkvKiBhdHRhY2ggZGVtb2QgKi8KLQkJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmYW55c2VlX3psMTAzNTNfY29uZmlnLAorCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZhbnlzZWVfbXQzNTJfY29uZmlnLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApOworCQlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkKKwkJCWJyZWFrOworCisJCS8qIGF0dGFjaCBkZW1vZCAqLworCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmFueXNlZV96bDEwMzUzX2NvbmZpZywKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKIAogCQlicmVhazsKIAljYXNlIEFOWVNFRV9IV181MDdDRDogLyogNiAqLwogCQkvKiBFMzAgUGx1cyAqLwogCisJCWlmIChzdGF0ZS0+ZmVfaWQpCisJCQlicmVhazsKKwogCQkvKiBlbmFibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzBdICovCiAJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgxIDw8IDApLCAweDAxKTsKIAkJaWYgKHJldCkKQEAgLTUxMiwzMyArNjMzLDM5IEBACiAJCQlnb3RvIGVycm9yOwogCiAJCS8qIGF0dGFjaCBkZW1vZCAqLwotCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsICZhbnlzZWVfemwxMDM1M19jb25maWcsCi0JCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAorCQkJJmFueXNlZV96bDEwMzUzX2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApOwogCiAJCWJyZWFrOwogCWNhc2UgQU5ZU0VFX0hXXzUwN0RDOiAvKiAxMCAqLwogCQkvKiBFMzAgQyBQbHVzICovCiAKKwkJaWYgKHN0YXRlLT5mZV9pZCkKKwkJCWJyZWFrOworCiAJCS8qIGVuYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbMF0gKi8KIAkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDEgPDwgMCksIDB4MDEpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcjsKIAogCQkvKiBhdHRhY2ggZGVtb2QgKi8KLQkJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIzX2F0dGFjaCwgJmFueXNlZV90ZGExMDAyM19jb25maWcsCi0JCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCk7CisJCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIzX2F0dGFjaCwKKwkJCSZhbnlzZWVfdGRhMTAwMjNfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCk7CiAKIAkJYnJlYWs7CiAJY2FzZSBBTllTRUVfSFdfNTA3U0k6IC8qIDExICovCiAJCS8qIEUzMCBTMiBQbHVzICovCiAKKwkJaWYgKHN0YXRlLT5mZV9pZCkKKwkJCWJyZWFrOworCiAJCS8qIGVuYWJsZSBEVkItUy9TMiBkZW1vZCBvbiBJT0RbMF0gKi8KIAkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDEgPDwgMCksIDB4MDEpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcjsKIAogCQkvKiBhdHRhY2ggZGVtb2QgKi8KLQkJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGN4MjQxMTZfYXR0YWNoLCAmYW55c2VlX2N4MjQxMTZfY29uZmlnLAorCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChjeDI0MTE2X2F0dGFjaCwgJmFueXNlZV9jeDI0MTE2X2NvbmZpZywKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKIAogCQlicmVhazsKQEAgLTU2NCwzMiArNjkxLDcgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7CiAKLQkJaWYgKGR2Yl91c2JfYW55c2VlX2RlbHN5cykgewotCQkJLyogZGlzYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbNV0gKi8KLQkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgwIDw8IDUpLAotCQkJCTB4MjApOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yOwotCi0JCQkvKiBlbmFibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzBdICovCi0JCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMSA8PCAwKSwKLQkJCQkweDAxKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcjsKLQotCQkJLyogYXR0YWNoIGRlbW9kICovCi0JCQlpZiAodG1wID09IDB4YzcpIHsKLQkJCQkvKiBUREExODIxMiBjb25maWcgKi8KLQkJCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCi0JCQkJCSZhbnlzZWVfemwxMDM1M190ZGExODIxMl9jb25maWcyLAotCQkJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIFBMTCBjb25maWcgKi8KLQkJCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCi0JCQkJCSZhbnlzZWVfemwxMDM1M19jb25maWcsCi0JCQkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKLQkJCX0KLQkJfSBlbHNlIHsKKwkJaWYgKChzdGF0ZS0+ZmVfaWQgXiBkdmJfdXNiX2FueXNlZV9kZWxzeXMpID09IDApICB7CiAJCQkvKiBkaXNhYmxlIERWQi1UIGRlbW9kIG9uIElPRFswXSAqLwogCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDAgPDwgMCksCiAJCQkJMHgwMSk7CkBAIC02MDUsMTUgKzcwNyw0NCBAQAogCQkJLyogYXR0YWNoIGRlbW9kICovCiAJCQlpZiAodG1wID09IDB4YzcpIHsKIAkJCQkvKiBUREExODIxMiBjb25maWcgKi8KLQkJCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2godGRhMTAwMjNfYXR0YWNoLAorCQkJCWFkYXAtPmZlX2FkYXBbc3RhdGUtPmZlX2lkXS5mZSA9IGR2Yl9hdHRhY2goCisJCQkJCXRkYTEwMDIzX2F0dGFjaCwKIAkJCQkJJmFueXNlZV90ZGExMDAyM190ZGExODIxMl9jb25maWcsCiAJCQkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDQ4KTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogUExMIGNvbmZpZyAqLwotCQkJCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDAyM19hdHRhY2gsCisJCQkJYWRhcC0+ZmVfYWRhcFtzdGF0ZS0+ZmVfaWRdLmZlID0gZHZiX2F0dGFjaCgKKwkJCQkJdGRhMTAwMjNfYXR0YWNoLAogCQkJCQkmYW55c2VlX3RkYTEwMDIzX2NvbmZpZywKIAkJCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4NDgpOwogCQkJfQorCQl9IGVsc2UgeworCQkJLyogZGlzYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbNV0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgwIDw8IDUpLAorCQkJCTB4MjApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBlbmFibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzBdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMSA8PCAwKSwKKwkJCQkweDAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKworCQkJLyogYXR0YWNoIGRlbW9kICovCisJCQlpZiAodG1wID09IDB4YzcpIHsKKwkJCQkvKiBUREExODIxMiBjb25maWcgKi8KKwkJCQlhZGFwLT5mZV9hZGFwW3N0YXRlLT5mZV9pZF0uZmUgPSBkdmJfYXR0YWNoKAorCQkJCQl6bDEwMzUzX2F0dGFjaCwKKwkJCQkJJmFueXNlZV96bDEwMzUzX3RkYTE4MjEyX2NvbmZpZzIsCisJCQkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogUExMIGNvbmZpZyAqLworCQkJCWFkYXAtPmZlX2FkYXBbc3RhdGUtPmZlX2lkXS5mZSA9IGR2Yl9hdHRhY2goCisJCQkJCXpsMTAzNTNfYXR0YWNoLAorCQkJCQkmYW55c2VlX3psMTAzNTNfY29uZmlnLAorCQkJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJCQl9CiAJCX0KIAogCQlicmVhazsKQEAgLTYyNywzMCArNzU4LDcgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7CiAKLQkJaWYgKGR2Yl91c2JfYW55c2VlX2RlbHN5cykgewotCQkJLyogZGlzYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbNV0gKi8KLQkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgwIDw8IDUpLAotCQkJCTB4MjApOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yOwotCi0JCQkvKiBlbmFibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzZdICovCi0JCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMSA8PCA2KSwKLQkJCQkweDQwKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcjsKLQotCQkJLyogZW5hYmxlIElGIHJvdXRlIG9uIElPRVswXSAqLwotCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRSwgKDAgPDwgMCksCi0JCQkJMHgwMSk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3I7Ci0KLQkJCS8qIGF0dGFjaCBkZW1vZCAqLwotCQkJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAotCQkJCSZhbnlzZWVfemwxMDM1M190ZGExODIxMl9jb25maWcsCi0JCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCQl9IGVsc2UgeworCQlpZiAoKHN0YXRlLT5mZV9pZCBeIGR2Yl91c2JfYW55c2VlX2RlbHN5cykgPT0gMCkgIHsKIAkJCS8qIGRpc2FibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzZdICovCiAJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMCA8PCA2KSwKIAkJCQkweDQwKTsKQEAgLTY2MywxNiArNzcxLDI3IEBACiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZXJyb3I7CiAKLQkJCS8qIGVuYWJsZSBJRiByb3V0ZSBvbiBJT0VbMF0gKi8KLQkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0UsICgxIDw8IDApLAotCQkJCTB4MDEpOworCQkJLyogYXR0YWNoIGRlbW9kICovCisJCQlhZGFwLT5mZV9hZGFwW3N0YXRlLT5mZV9pZF0uZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIzX2F0dGFjaCwKKwkJCQkmYW55c2VlX3RkYTEwMDIzX3RkYTE4MjEyX2NvbmZpZywKKwkJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCk7CisJCX0gZWxzZSB7CisJCQkvKiBkaXNhYmxlIERWQi1DIGRlbW9kIG9uIElPRFs1XSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDAgPDwgNSksCisJCQkJMHgyMCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIGVuYWJsZSBEVkItVCBkZW1vZCBvbiBJT0RbNl0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgxIDw8IDYpLAorCQkJCTB4NDApOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIGVycm9yOwogCiAJCQkvKiBhdHRhY2ggZGVtb2QgKi8KLQkJCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDAyM19hdHRhY2gsCi0JCQkJJmFueXNlZV90ZGExMDAyM190ZGExODIxMl9jb25maWcsCi0JCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4NDgpOworCQkJYWRhcC0+ZmVfYWRhcFtzdGF0ZS0+ZmVfaWRdLmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKKwkJCQkmYW55c2VlX3psMTAzNTNfdGRhMTgyMTJfY29uZmlnLAorCQkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKIAkJfQogCiAJCWJyZWFrOwpAQCAtNjgxLDYgKzgwMCw5IEBACiAJCS8qIEU3IFMyICovCiAJCS8qIEU3IFBTMiAqLwogCisJCWlmIChzdGF0ZS0+ZmVfaWQpCisJCQlicmVhazsKKwogCQkvKiBlbmFibGUgdHJhbnNwb3J0IHN0cmVhbSBvbiBJT0FbN10gKi8KIAkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPQSwgKDEgPDwgNyksIDB4ODApOwogCQlpZiAocmV0KQpAQCAtNjkyLDEzICs4MTQsMTMgQEAKIAkJCWdvdG8gZXJyb3I7CiAKIAkJLyogYXR0YWNoIGRlbW9kICovCi0JCWFkYXAtPmZlID0gZHZiX2F0dGFjaChzdHYwOTAwX2F0dGFjaCwgJmFueXNlZV9zdHYwOTAwX2NvbmZpZywKKwkJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3R2MDkwMF9hdHRhY2gsICZhbnlzZWVfc3R2MDkwMF9jb25maWcsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMCk7CiAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCFhZGFwLT5mZSkgeworCWlmICghYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQkvKiB3ZSBoYXZlIG5vIGZyb250ZW5kIDotKCAqLwogCQlyZXQgPSAtRU5PREVWOwogCQllcnIoIlVuc3VwcG9ydGVkIEFueXNlZSB2ZXJzaW9uLiAiIFwKQEAgLTcxMywxNCArODM1LDE0IEBACiAJc3RydWN0IGFueXNlZV9zdGF0ZSAqc3RhdGUgPSBhZGFwLT5kZXYtPnByaXY7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CiAJaW50IHJldDsKLQlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJZGViX2luZm8oIiVzOiBmZT0lZFxuIiwgX19mdW5jX18sIHN0YXRlLT5mZV9pZCk7CiAKIAlzd2l0Y2ggKHN0YXRlLT5odykgewogCWNhc2UgQU5ZU0VFX0hXXzUwN1Q6IC8qIDIgKi8KIAkJLyogRTMwICovCiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsICgweGMyID4+IDEpLAorCQlmZSA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICgweGMyID4+IDEpLAogCQkJTlVMTCwgRFZCX1BMTF9USE9NU09OX0RUVDc1NzkpOwogCiAJCWJyZWFrOwpAQCAtNzI4LDcgKzg1MCw3IEBACiAJCS8qIEUzMCBQbHVzICovCiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsICgweGMyID4+IDEpLAorCQlmZSA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICgweGMyID4+IDEpLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfVEhPTVNPTl9EVFQ3NTc5KTsKIAogCQlicmVhazsKQEAgLTczNiw3ICs4NTgsNyBAQAogCQkvKiBFMzAgQyBQbHVzICovCiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsICgweGMwID4+IDEpLAorCQlmZSA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICgweGMwID4+IDEpLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfU0FNU1VOR19EVE9TNDAzSUgxMDJBKTsKIAogCQlicmVhazsKQEAgLTc0NCwyOCArODY2LDE0IEBACiAJCS8qIEUzMCBTMiBQbHVzICovCiAKIAkJLyogYXR0YWNoIExOQiBjb250cm9sbGVyICovCi0JCWZlID0gZHZiX2F0dGFjaChpc2w2NDIzX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAotCQkJJmFueXNlZV9pc2w2NDIzX2NvbmZpZyk7CisJCWZlID0gZHZiX2F0dGFjaChpc2w2NDIzX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCAmYW55c2VlX2lzbDY0MjNfY29uZmlnKTsKIAogCQlicmVhazsKIAljYXNlIEFOWVNFRV9IV181MDdGQTogLyogMTUgKi8KIAkJLyogRTMwIENvbWJvIFBsdXMgKi8KIAkJLyogRTMwIEMgUGx1cyAqLwogCi0JCWlmIChkdmJfdXNiX2FueXNlZV9kZWxzeXMpIHsKLQkJCS8qIGVuYWJsZSBEVkItVCB0dW5lciBvbiBJT0VbMF0gKi8KLQkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0UsICgwIDw8IDApLAotCQkJCTB4MDEpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yOwotCQl9IGVsc2UgewotCQkJLyogZW5hYmxlIERWQi1DIHR1bmVyIG9uIElPRVswXSAqLwotCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRSwgKDEgPDwgMCksCi0JCQkJMHgwMSk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQogCQkvKiBUcnkgZmlyc3QgYXR0YWNoIFREQTE4MjEyIHNpbGljb24gdHVuZXIgb24gSU9FWzRdLCBpZiB0aGF0CiAJCSAqIGZhaWxzIGF0dGFjaCBvbGQgc2ltcGxlIFBMTC4gKi8KIApAQCAtNzc1LDggKzg4Myw4IEBACiAJCQlnb3RvIGVycm9yOwogCiAJCS8qIGF0dGFjaCB0dW5lciAqLwotCQlmZSA9IGR2Yl9hdHRhY2godGRhMTgyMTJfYXR0YWNoLCBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCi0JCQkmYW55c2VlX3RkYTE4MjEyX2NvbmZpZyk7CisJCWZlID0gZHZiX2F0dGFjaCh0ZGExODIxMl9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbc3RhdGUtPmZlX2lkXS5mZSwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCAmYW55c2VlX3RkYTE4MjEyX2NvbmZpZyk7CiAJCWlmIChmZSkKIAkJCWJyZWFrOwogCkBAIC03ODYsOCArODk0LDkgQEAKIAkJCWdvdG8gZXJyb3I7CiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsICgweGMwID4+IDEpLAotCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfU0FNU1VOR19EVE9TNDAzSUgxMDJBKTsKKwkJZmUgPSBkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwW3N0YXRlLT5mZV9pZF0uZmUsCisJCQkoMHhjMCA+PiAxKSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJCQlEVkJfUExMX1NBTVNVTkdfRFRPUzQwM0lIMTAyQSk7CiAKIAkJYnJlYWs7CiAJY2FzZSBBTllTRUVfSFdfNTA4VEM6IC8qIDE4ICovCkBAIC04MDEsOCArOTEwLDggQEAKIAkJCWdvdG8gZXJyb3I7CiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaCh0ZGExODIxMl9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKLQkJCSZhbnlzZWVfdGRhMTgyMTJfY29uZmlnKTsKKwkJZmUgPSBkdmJfYXR0YWNoKHRkYTE4MjEyX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFtzdGF0ZS0+ZmVfaWRdLmZlLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZhbnlzZWVfdGRhMTgyMTJfY29uZmlnKTsKIAogCQlicmVhazsKIAljYXNlIEFOWVNFRV9IV181MDhTMjogLyogMTkgKi8KQEAgLTgxMSwxMiArOTIwLDEyIEBACiAJCS8qIEU3IFBTMiAqLwogCiAJCS8qIGF0dGFjaCB0dW5lciAqLwotCQlmZSA9IGR2Yl9hdHRhY2goc3R2NjExMF9hdHRhY2gsIGFkYXAtPmZlLAorCQlmZSA9IGR2Yl9hdHRhY2goc3R2NjExMF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkmYW55c2VlX3N0djYxMTBfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKIAkJaWYgKGZlKSB7CiAJCQkvKiBhdHRhY2ggTE5CIGNvbnRyb2xsZXIgKi8KLQkJCWZlID0gZHZiX2F0dGFjaChpc2w2NDIzX2F0dGFjaCwgYWRhcC0+ZmUsCisJCQlmZSA9IGR2Yl9hdHRhY2goaXNsNjQyM19hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZhbnlzZWVfaXNsNjQyM19jb25maWcpOwogCQl9CiAKQEAgLTkxOCw2ICsxMDI3LDkgQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyAgICA9IDIsCisJCS5mcm9udGVuZF9jdHJsICAgID0gYW55c2VlX2Zyb250ZW5kX2N0cmwsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGFueXNlZV9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gYW55c2VlX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gYW55c2VlX3R1bmVyX2F0dGFjaCwKQEAgLTkzMSw2ICsxMDQzLDIxIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9LCB7CisJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGFueXNlZV9zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gYW55c2VlX2Zyb250ZW5kX2F0dGFjaCwKKwkJCS50dW5lcl9hdHRhY2ggICAgID0gYW55c2VlX3R1bmVyX2F0dGFjaCwKKwkJCS5zdHJlYW0gPSB7CisJCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCQkuY291bnQgPSA4LAorCQkJCS5lbmRwb2ludCA9IDB4ODIsCisJCQkJLnUgPSB7CisJCQkJCS5idWxrID0geworCQkJCQkJLmJ1ZmZlcnNpemUgPSAoMTYqNTEyKSwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCisJCX19LAogCQl9CiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmgKaW5kZXggYWQ2Y2NkMS4uNTdlZTUwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5oCkBAIC01OSw2ICs1OSw3IEBACiBzdHJ1Y3QgYW55c2VlX3N0YXRlIHsKIAl1OCBodzsgLyogUENCIElEICovCiAJdTggc2VxOworCXU4IGZlX2lkOjE7IC8qIGZyb25kZW5kIElEICovCiB9OwogCiAjZGVmaW5lIEFOWVNFRV9IV181MDdUICAgIDIgLyogRTMwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2F1NjYxMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hdTY2MTAuYwppbmRleCAyMzUxMDc3Li5iNzc5OTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2F1NjYxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYXU2NjEwLmMKQEAgLTE0MCw5ICsxNDAsOSBAQAogCiBzdGF0aWMgaW50IGF1NjYxMF96bDEwMzUzX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmF1NjYxMF96bDEwMzUzX2NvbmZpZywKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmF1NjYxMF96bDEwMzUzX2NvbmZpZywKIAkJJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIDA7CkBAIC0xNTUsNyArMTU1LDcgQEAKIHN0YXRpYyBpbnQgYXU2NjEwX3F0MTAxMF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlyZXR1cm4gZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLAotCQkJICBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJCQkgIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJICAmYXU2NjEwX3F0MTAxMF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIApAQCAtMjA0LDYgKzIwNCw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBhdTY2MTBfemwxMDM1M19mcm9udGVuZF9hdHRhY2gsCiAJCQkudHVuZXJfYXR0YWNoICAgICA9IGF1NjYxMF9xdDEwMTBfdHVuZXJfYXR0YWNoLAogCkBAIC0yMTksNiArMjIxLDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hejYwMjcuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYXo2MDI3LmMKaW5kZXggNTdlMjQ0NC4uYmY2N2I0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hejYwMjcuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2F6NjAyNy5jCkBAIC00MCw3ICs0MCw2IEBACiAJeyBTVEIwODk5X0RJU1JYX1NUMCAgICAgCSwgMHgwNCB9LAogCXsgU1RCMDg5OV9ESVNSWF9TVDEgICAgIAksIDB4MDAgfSwKIAl7IFNUQjA4OTlfRElTUEFSSVRZICAgICAJLCAweDAwIH0sCi0JeyBTVEIwODk5X0RJU0ZJRk8gICAgICAgCSwgMHgwMCB9LAogCXsgU1RCMDg5OV9ESVNTVEFUVVMJCSwgMHgyMCB9LAogCXsgU1RCMDg5OV9ESVNGMjIgICAgICAgIAksIDB4OTkgfSwKIAl7IFNUQjA4OTlfRElTRjIyUlggICAgICAJLCAweGE4IH0sCkBAIC03ODIsNyArNzgxLDYgQEAKIHsKIAogCXU4IGJ1ZjsKLQlpbnQgcmV0OwogCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAgPSBmZS0+ZHZiLT5wcml2OwogCiAJc3RydWN0IGkyY19tc2cgaTJjX21zZyA9IHsKQEAgLTgwMCwxNyArNzk4LDE3IEBACiAJc3dpdGNoICh2b2x0YWdlKSB7CiAJY2FzZSBTRUNfVk9MVEFHRV8xMzoKIAkJYnVmID0gMTsKLQkJcmV0ID0gaTJjX3RyYW5zZmVyKCZhZGFwLT5kZXYtPmkyY19hZGFwLCAmaTJjX21zZywgMSk7CisJCWkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJmkyY19tc2csIDEpOwogCQlicmVhazsKIAogCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CiAJCWJ1ZiA9IDI7Ci0JCXJldCA9IGkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJmkyY19tc2csIDEpOworCQlpMmNfdHJhbnNmZXIoJmFkYXAtPmRldi0+aTJjX2FkYXAsICZpMmNfbXNnLCAxKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNFQ19WT0xUQUdFX09GRjoKIAkJYnVmID0gMDsKLQkJcmV0ID0gaTJjX3RyYW5zZmVyKCZhZGFwLT5kZXYtPmkyY19hZGFwLCAmaTJjX21zZywgMSk7CisJCWkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJmkyY19tc2csIDEpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC05MTAsMTYgKzkwOCwxNiBAQAogCWF6NjAyN19mcm9udGVuZF9yZXNldChhZGFwKTsKIAogCWRlYl9pbmZvKCJhZGFwID0gJXAsIGRldiA9ICVwXG4iLCBhZGFwLCBhZGFwLT5kZXYpOwotCWFkYXAtPmZlID0gc3RiMDg5OV9hdHRhY2goJmF6NjAyN19zdGIwODk5X2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBzdGIwODk5X2F0dGFjaCgmYXo2MDI3X3N0YjA4OTlfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlpZiAoYWRhcC0+ZmUpIHsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQlkZWJfaW5mbygiZm91bmQgU1RCMDg5OSBEVkItUy9EVkItUzIgZnJvbnRlbmQgQDB4JTAyeCIsIGF6NjAyN19zdGIwODk5X2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKLQkJaWYgKHN0YjYxMDBfYXR0YWNoKGFkYXAtPmZlLCAmYXo2MDI3X3N0YjYxMDBfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpIHsKKwkJaWYgKHN0YjYxMDBfYXR0YWNoKGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhejYwMjdfc3RiNjEwMF9jb25maWcsICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgewogCQkJZGViX2luZm8oImZvdW5kIFNUQjYxMDAgRFZCLVMvRFZCLVMyIGZyb250ZW5kIEAweCUwMngiLCBhejYwMjdfc3RiNjEwMF9jb25maWcudHVuZXJfYWRkcmVzcyk7Ci0JCQlhZGFwLT5mZS0+b3BzLnNldF92b2x0YWdlID0gYXo2MDI3X3NldF92b2x0YWdlOworCQkJYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gYXo2MDI3X3NldF92b2x0YWdlOwogCQkJYXo2MDI3X2NpX2luaXQoYWRhcCk7CiAJCX0gZWxzZSB7Ci0JCQlhZGFwLT5mZSA9IE5VTEw7CisJCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gTlVMTDsKIAkJfQogCX0gZWxzZQogCQl3YXJuKCJubyBmcm9udC1lbmQgYXR0YWNoZWRcbiIpOwpAQCAtOTU0LDcgKzk1Miw2IEBACiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKIAlpbnQgaSA9IDAsIGogPSAwLCBsZW4gPSAwOwotCWludCByZXQ7CiAJdTE2IGluZGV4OwogCXUxNiB2YWx1ZTsKIAlpbnQgbGVuZ3RoOwpAQCAtOTkwLDcgKzk4Nyw3IEBACiAJCQkJaW5kZXggPSAoKChtc2dbaV0uYnVmWzBdIDw8IDgpICYgMHhmZjAwKSB8IChtc2dbaV0uYnVmWzFdICYgMHgwMGZmKSk7CiAJCQkJdmFsdWUgPSBtc2dbaV0uYWRkciArIChtc2dbaV0ubGVuIDw8IDgpOwogCQkJCWxlbmd0aCA9IG1zZ1tpICsgMV0ubGVuICsgNjsKLQkJCQlyZXQgPSBhejYwMjdfdXNiX2luX29wKGQsIHJlcSwgdmFsdWUsIGluZGV4LCBkYXRhLCBsZW5ndGgpOworCQkJCWF6NjAyN191c2JfaW5fb3AoZCwgcmVxLCB2YWx1ZSwgaW5kZXgsIGRhdGEsIGxlbmd0aCk7CiAJCQkJbGVuID0gbXNnW2kgKyAxXS5sZW47CiAJCQkJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQogCQkJCQltc2dbaSArIDFdLmJ1ZltqXSA9IGRhdGFbaiArIDVdOwpAQCAtMTAxNyw3ICsxMDE0LDcgQEAKIAkJCQlpbmRleCA9IDB4MDsKIAkJCQl2YWx1ZSA9IG1zZ1tpXS5hZGRyOwogCQkJCWxlbmd0aCA9IG1zZ1tpXS5sZW4gKyA2OwotCQkJCXJldCA9IGF6NjAyN191c2JfaW5fb3AoZCwgcmVxLCB2YWx1ZSwgaW5kZXgsIGRhdGEsIGxlbmd0aCk7CisJCQkJYXo2MDI3X3VzYl9pbl9vcChkLCByZXEsIHZhbHVlLCBpbmRleCwgZGF0YSwgbGVuZ3RoKTsKIAkJCQlsZW4gPSBtc2dbaV0ubGVuOwogCQkJCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykKIAkJCQkJbXNnW2ldLmJ1ZltqXSA9IGRhdGFbaiArIDVdOwpAQCAtMTEwNiw2ICsxMTAzLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGF6NjAyN19zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gYXo2MDI3X2Zyb250ZW5kX2F0dGFjaCwKIApAQCAtMTEyMCw2ICsxMTE5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NlNjIzMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jZTYyMzAuYwppbmRleCA2ZDFhMzA0Li41N2FmYjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NlNjIzMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2U2MjMwLmMKQEAgLTE4Niw5ICsxODYsOSBAQAogc3RhdGljIGludCBjZTYyMzBfemwxMDM1M19mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmY2U2MjMwX3psMTAzNTNfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmY2U2MjMwX3psMTAzNTNfY29uZmlnLAogCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7Ci0JaWYgKGFkYXAtPmZlID09IE5VTEwpCisJaWYgKGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTQsNyArMjE0LDcgQEAKIHsKIAlpbnQgcmV0OwogCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQlyZXQgPSBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZjZTYyMzBfbXhsNTAwM3NfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTI3Myw2ICsyNzMsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gY2U2MjMwX3psMTAzNTNfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjZTYyMzBfbXhsNTAwM3NfdHVuZXJfYXR0YWNoLAogCQkJLnN0cmVhbSA9IHsKQEAgLTI4NSw2ICsyODcsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NpbmVyZ3lUMi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NpbmVyZ3lUMi1jb3JlLmMKaW5kZXggMTZmMmNlMi4uZjlkOTA1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jaW5lcmd5VDItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLWNvcmUuYwpAQCAtNjksNyArNjksNyBAQAogCWNoYXIgc3RhdGVbM107CiAJaW50IHJldDsKIAotCWFkYXAtPmZlID0gY2luZXJneXQyX2ZlX2F0dGFjaChhZGFwLT5kZXYpOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBjaW5lcmd5dDJfZmVfYXR0YWNoKGFkYXAtPmRldik7CiAKIAlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoYWRhcC0+ZGV2LCBxdWVyeSwgc2l6ZW9mKHF1ZXJ5KSwgc3RhdGUsCiAJCQkJc2l6ZW9mKHN0YXRlKSwgMCk7CkBAIC0xOTgsNiArMTk4LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGNpbmVyZ3l0Ml9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gY2luZXJneXQyX2Zyb250ZW5kX2F0dGFjaCwKIApAQCAtMjEyLDYgKzIxNCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfQogCX0sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwppbmRleCBhY2I1ZmIyLi45ZjJhMDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCkBAIC0zNDcsNyArMzQ3LDcgQEAKIAogc3RhdGljIHZvaWQgY3h1c2JfZDY4MF9kbWJfZHJhaW5fdmlkZW8oc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQogewotCXN0cnVjdCB1c2JfZGF0YV9zdHJlYW1fcHJvcGVydGllcyAqcCA9ICZkLT5wcm9wcy5hZGFwdGVyWzBdLnN0cmVhbTsKKwlzdHJ1Y3QgdXNiX2RhdGFfc3RyZWFtX3Byb3BlcnRpZXMgKnAgPSAmZC0+cHJvcHMuYWRhcHRlclswXS5mZVswXS5zdHJlYW07CiAJY29uc3QgaW50IHRpbWVvdXQgPSAxMDA7CiAJY29uc3QgaW50IGp1bmtfbGVuID0gcC0+dS5idWxrLmJ1ZmZlcnNpemU7CiAJdTggICAgICAgICpqdW5rOwpAQCAtNzI1LDcgKzcyNSw3IEBACiAvKiBDYWxsYmFja3MgZm9yIERWQiBVU0IgKi8KIHN0YXRpYyBpbnQgY3h1c2JfZm1kMTIxNm1lX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWR2Yl9hdHRhY2goc2ltcGxlX3R1bmVyX2F0dGFjaCwgYWRhcC0+ZmUsCisJZHZiX2F0dGFjaChzaW1wbGVfdHVuZXJfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg2MSwKIAkJICAgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszKTsKIAlyZXR1cm4gMDsKQEAgLTczMywyNyArNzMzLDI3IEBACiAKIHN0YXRpYyBpbnQgY3h1c2JfZGVlMTYwMV90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MSwKKwlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYxLAogCQkgICBOVUxMLCBEVkJfUExMX1RIT01TT05fRFRUNzU3OSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY3h1c2JfbGd6MjAxX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCBOVUxMLCBEVkJfUExMX0xHX1oyMDEpOworCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIDB4NjEsIE5VTEwsIERWQl9QTExfTEdfWjIwMSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY3h1c2JfZHR0NzU3OV90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwKKwlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLAogCQkgICBOVUxMLCBEVkJfUExMX1RIT01TT05fRFRUNzU3OSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY3h1c2JfbGdoMDY0Zl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlkdmJfYXR0YWNoKHNpbXBsZV90dW5lcl9hdHRhY2gsIGFkYXAtPmZlLAorCWR2Yl9hdHRhY2goc2ltcGxlX3R1bmVyX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJICAgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4NjEsIFRVTkVSX0xHX1REVlNfSDA2WEYpOwogCXJldHVybiAwOwogfQpAQCAtNzk1LDkgKzc5NSw5IEBACiAJfTsKIAogCS8qIEZJWE1FOiBnZW5lcmFsaXplICYgbW92ZSB0byBjb21tb24gYXJlYSAqLwotCWFkYXAtPmZlLT5jYWxsYmFjayA9IGR2aWNvX2JsdWViaXJkX3hjMjAyOF9jYWxsYmFjazsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5jYWxsYmFjayA9IGR2aWNvX2JsdWViaXJkX3hjMjAyOF9jYWxsYmFjazsKIAotCWZlID0gZHZiX2F0dGFjaCh4YzIwMjhfYXR0YWNoLCBhZGFwLT5mZSwgJmNmZyk7CisJZmUgPSBkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZjZmcpOwogCWlmIChmZSA9PSBOVUxMIHx8IGZlLT5vcHMudHVuZXJfb3BzLnNldF9jb25maWcgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTgwOCw3ICs4MDgsNyBAQAogCiBzdGF0aWMgaW50IGN4dXNiX214bDUwMDNzX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwlkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJICAgJmFkYXAtPmRldi0+aTJjX2FkYXAsICZhdmVyX2E4NjhyX3R1bmVyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTgxNiw3ICs4MTYsNyBAQAogc3RhdGljIGludCBjeHVzYl9kNjgwX2RtYl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKLQlmZSA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwlmZSA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZkNjgwX2RtYl90dW5lcik7CiAJcmV0dXJuIChmZSA9PSBOVUxMKSA/IC1FSU8gOiAwOwogfQpAQCAtODI0LDcgKzgyNCw3IEBACiBzdGF0aWMgaW50IGN4dXNiX215Z2ljYV9kNjg5X3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOwotCWZlID0gZHZiX2F0dGFjaChtYXgyMTY1X2F0dGFjaCwgYWRhcC0+ZmUsCisJZmUgPSBkdmJfYXR0YWNoKG1heDIxNjVfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZteWdpY2FfZDY4OV9tYXgyMTY1X2NmZyk7CiAJcmV0dXJuIChmZSA9PSBOVUxMKSA/IC1FSU8gOiAwOwogfQpAQCAtODM3LDggKzgzNyw5IEBACiAKIAljeHVzYl9jdHJsX21zZyhhZGFwLT5kZXYsIENNRF9ESUdJVEFMLCBOVUxMLCAwLCAmYiwgMSk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwgJmN4dXNiX2N4MjI3MDJfY29uZmlnLAotCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwgJmN4dXNiX2N4MjI3MDJfY29uZmlnLAorCQkJCQkgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSkgIT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVJTzsKQEAgLTg1MSw4ICs4NTIsMTAgQEAKIAogCWN4dXNiX2N0cmxfbXNnKGFkYXAtPmRldiwgQ01EX0RJR0lUQUwsIE5VTEwsIDAsIE5VTEwsIDApOwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobGdkdDMzMHhfYXR0YWNoLCAmY3h1c2JfbGdkdDMzMDNfY29uZmlnLAotCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChsZ2R0MzMweF9hdHRhY2gsCisJCQkJCSAmY3h1c2JfbGdkdDMzMDNfY29uZmlnLAorCQkJCQkgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSkgIT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVJTzsKQEAgLTg2MCw5ICs4NjMsOSBAQAogCiBzdGF0aWMgaW50IGN4dXNiX2F2ZXJfbGdkdDMzMDNfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGxnZHQzMzB4X2F0dGFjaCwgJmN4dXNiX2F2ZXJfbGdkdDMzMDNfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGxnZHQzMzB4X2F0dGFjaCwgJmN4dXNiX2F2ZXJfbGdkdDMzMDNfY29uZmlnLAogCQkJICAgICAgJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSAhPSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlICE9IE5VTEwpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU87CkBAIC04NzYsOCArODc5LDkgQEAKIAogCWN4dXNiX2N0cmxfbXNnKGFkYXAtPmRldiwgQ01EX0RJR0lUQUwsIE5VTEwsIDAsIE5VTEwsIDApOwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmY3h1c2JfbXQzNTJfY29uZmlnLAotCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZjeHVzYl9tdDM1Ml9jb25maWcsCisJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJaWYgKChhZGFwLT5mZV9hZGFwWzBdLmZlKSAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAtRUlPOwpAQCAtODkwLDExICs4OTQsMTUgQEAKIAogCWN4dXNiX2N0cmxfbXNnKGFkYXAtPmRldiwgQ01EX0RJR0lUQUwsIE5VTEwsIDAsIE5VTEwsIDApOwogCi0JaWYgKCgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwgJmN4dXNiX2RlZTE2MDFfY29uZmlnLAotCQkJCSAgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpIHx8Ci0JCSgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAotCQkJCQkmY3h1c2JfemwxMDM1M19kZWUxNjAxX2NvbmZpZywKLQkJCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApKSAhPSBOVUxMKSkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZjeHVzYl9kZWUxNjAxX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpCisJCXJldHVybiAwOworCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCisJCQkJCSAmY3h1c2JfemwxMDM1M19kZWUxNjAxX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU87CkBAIC05MTcsOSArOTI1LDExIEBACiAJY3h1c2JfYmx1ZWJpcmRfZ3Bpb19wdWxzZShhZGFwLT5kZXYsIDB4MDEsIDEpOwogCWN4dXNiX2JsdWViaXJkX2dwaW9fcHVsc2UoYWRhcC0+ZGV2LCAweDAyLCAxKTsKIAotCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAotCQkJCSAgICZjeHVzYl96bDEwMzUzX3hjMzAyOF9jb25maWdfbm9faTJjX2dhdGUsCi0JCQkJICAgJmFkYXAtPmRldi0+aTJjX2FkYXApKSA9PSBOVUxMKQorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPQorCQlkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAorCQkJICAgJmN4dXNiX3psMTAzNTNfeGMzMDI4X2NvbmZpZ19ub19pMmNfZ2F0ZSwKKwkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJLyogdHJ5IHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBubyBJUiBkZWNvZGVyIG9uIHRoZSBJMkMgYnVzICovCkBAIC0xMDMxLDkgKzEwNDEsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkJICAgICAgJmN4dXNiX2R1YWxkaWc0X3JldjJfY29uZmlnKTsKLQlpZiAoYWRhcC0+ZmUgPT0gTlVMTCkKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtMTA4NCwxNSArMTA5NCwxNSBAQAogewogCXN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUgKnN0ID0gYWRhcC0+cHJpdjsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmMgPQotCQlkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwKKwkJZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCQkJRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKIAotCWlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKKwlpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywKIAkgICAgJmRpYjcwNzBwX2RpYjAwNzBfY29uZmlnKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwNzBfc2V0X3BhcmFtX292ZXJyaWRlOworCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3MDcwX3NldF9wYXJhbV9vdmVycmlkZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEwOCwxNCArMTExOCwxNiBAQAogCWN4dXNiX2JsdWViaXJkX2dwaW9fcHVsc2UoYWRhcC0+ZGV2LCAweDAxLCAxKTsKIAljeHVzYl9ibHVlYmlyZF9ncGlvX3B1bHNlKGFkYXAtPmRldiwgMHgwMiwgMSk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKLQkJCQkgICAmY3h1c2JfemwxMDM1M194YzMwMjhfY29uZmlnLAotCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKKwkJCQkJICZjeHVzYl96bDEwMzUzX3hjMzAyOF9jb25maWcsCisJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJaWYgKChhZGFwLT5mZV9hZGFwWzBdLmZlKSAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwKLQkJCQkgICAmY3h1c2JfbXQzNTJfeGMzMDI4X2NvbmZpZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLAorCQkJCQkgJmN4dXNiX210MzUyX3hjMzAyOF9jb25maWcsCisJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJaWYgKChhZGFwLT5mZV9hZGFwWzBdLmZlKSAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAtRUlPOwpAQCAtMTE1MCw3ICsxMTYyLDcgQEAKIAl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LAogCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQpKTsKIAl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LAotCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgZC0+cHJvcHMuYWRhcHRlclswXS5zdHJlYW0uZW5kcG9pbnQpKTsKKwkJdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsIGQtPnByb3BzLmFkYXB0ZXJbMF0uZmVbMF0uc3RyZWFtLmVuZHBvaW50KSk7CiAKIAkvKiBEcmFpbiBVU0IgcGlwZXMgdG8gYXZvaWQgaGFuZyBhZnRlciByZWJvb3QgKi8KIAlmb3IgKG4gPSAwOyAgbiA8IDU7ICBuKyspIHsKQEAgLTExNzIsOCArMTE4NCw4IEBACiAJbXNsZWVwKDEwMCk7CiAKIAkvKiBBdHRhY2ggZnJvbnRlbmQgKi8KLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobGdzOGd4eF9hdHRhY2gsICZkNjgwX2xnczhnbDVfY2ZnLCAmZC0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGxnczhneHhfYXR0YWNoLCAmZDY4MF9sZ3M4Z2w1X2NmZywgJmQtPmkyY19hZGFwKTsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtMTIwNyw3ICsxMjE5LDcgQEAKIAl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LAogCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQpKTsKIAl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LAotCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgZC0+cHJvcHMuYWRhcHRlclswXS5zdHJlYW0uZW5kcG9pbnQpKTsKKwkJdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsIGQtPnByb3BzLmFkYXB0ZXJbMF0uZmVbMF0uc3RyZWFtLmVuZHBvaW50KSk7CiAKIAogCS8qIFJlc2V0IHRoZSB0dW5lciAqLwpAQCAtMTIyMyw5ICsxMjM1LDkgQEAKIAltc2xlZXAoMTAwKTsKIAogCS8qIEF0dGFjaCBmcm9udGVuZCAqLwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChhdGJtODgzMF9hdHRhY2gsICZteWdpY2FfZDY4OV9hdGJtODgzMF9jZmcsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goYXRibTg4MzBfYXR0YWNoLCAmbXlnaWNhX2Q2ODlfYXRibTg4MzBfY2ZnLAogCQkmZC0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CkBAIC0xMzgzLDYgKzEzOTUsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2N4MjI3MDJfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9mbWQxMjE2bWVfdHVuZXJfYXR0YWNoLApAQCAtMTM5Nyw3ICsxNDExLDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCi0KKwkJfX0sCiAJCX0sCiAJfSwKIAkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX3Bvd2VyX2N0cmwsCkBAIC0xNDI5LDYgKzE0NDMsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2xnZHQzMzAzX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfbGdoMDY0Zl90dW5lcl9hdHRhY2gsCkBAIC0xNDQ0LDYgKzE0NjAsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIApAQCAtMTQ4Myw2ICsxNTAwLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9kZWUxNjAxX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZGVlMTYwMV90dW5lcl9hdHRhY2gsCkBAIC0xNDk3LDYgKzE1MTYsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIApAQCAtMTU0NCw2ICsxNTY0LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMiwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9tdDM1Ml9mcm9udGVuZF9hdHRhY2gsCiAJCQkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX2xnejIwMV90dW5lcl9hdHRhY2gsCkBAIC0xNTU5LDYgKzE1ODEsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIAkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX2JsdWViaXJkX3Bvd2VyX2N0cmwsCkBAIC0xNTk2LDYgKzE2MTksOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX210MzUyX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZHR0NzU3OV90dW5lcl9hdHRhY2gsCkBAIC0xNjExLDYgKzE2MzYsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIAkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX2JsdWViaXJkX3Bvd2VyX2N0cmwsCkBAIC0xNjQ1LDYgKzE2NzEsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2R1YWxkaWc0X2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZHZpY29feGMzMDI4X3R1bmVyX2F0dGFjaCwKQEAgLTE2NTksNiArMTY4Nyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC0xNjk1LDYgKzE3MjQsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX25hbm8yX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZHZpY29feGMzMDI4X3R1bmVyX2F0dGFjaCwKQEAgLTE3MDksNiArMTc0MCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC0xNzQ3LDYgKzE3NzksOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX25hbm8yX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZHZpY29feGMzMDI4X3R1bmVyX2F0dGFjaCwKQEAgLTE3NjEsNiArMTc5NSw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC0xNzk2LDYgKzE4MzEsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2JfYXZlcl9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfYXZlcl9sZ2R0MzMwM19mcm9udGVuZF9hdHRhY2gsCiAJCQkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX214bDUwMDNzX3R1bmVyX2F0dGFjaCwKQEAgLTE4MTAsNyArMTg0Nyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAotCisJCX19LAogCQl9LAogCX0sCiAJLnBvd2VyX2N0cmwgICAgICAgPSBjeHVzYl9hdmVyX3Bvd2VyX2N0cmwsCkBAIC0xODM5LDEwICsxODc2LDEyIEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLnNpemVfb2ZfcHJpdiAgICA9IHNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAogCQkJLmZyb250ZW5kX2F0dGFjaCA9IGN4dXNiX2R1YWxkaWc0X3JldjJfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICA9IGN4dXNiX2R1YWxkaWc0X3JldjJfdHVuZXJfYXR0YWNoLAotCQkJLnNpemVfb2ZfcHJpdiAgICA9IHNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKQEAgLTE4NTQsNiArMTg5Myw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC0xODg5LDYgKzE5MjksOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2JfZDY4MF9kbWJfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2Q2ODBfZG1iX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZDY4MF9kbWJfdHVuZXJfYXR0YWNoLApAQCAtMTkwNCw2ICsxOTQ2LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9LAogCX0sCiAKQEAgLTE5NDAsNiArMTk4Myw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9kNjgwX2RtYl9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfbXlnaWNhX2Q2ODlfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9teWdpY2FfZDY4OV90dW5lcl9hdHRhY2gsCkBAIC0xOTU1LDYgKzIwMDAsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMKaW5kZXggNWViOTFiNC4uMTU2Y2JmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfY29yZS5jCkBAIC0zMCw2ICszMCwxMSBAQAogCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGQtPnByaXY7CiAJaW50IHJldDsKIAorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPnVzYl9tdXRleCkgPCAwKSB7CisJCWVycigiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coZC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKGQtPnVkZXYsIDApLAogCQkJCSAgUkVRVUVTVF9HRVRfVkVSU0lPTiwKIAkJCQkgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4sIDAsIDAsCkBAIC00Niw2ICs1MSw3IEBACiAJaWYgKGZ3dHlwZSAhPSBOVUxMKQogCQkqZnd0eXBlICAgICA9IChzdC0+YnVmWzEyXSA8PCAyNCkgfCAoc3QtPmJ1ZlsxM10gPDwgMTYpIHwKIAkJCShzdC0+YnVmWzE0XSA8PCA4KSB8IHN0LT5idWZbMTVdOworCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDgsNyArMTE0LDEyIEBACiBpbnQgZGliMDcwMF9zZXRfZ3BpbyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGVudW0gZGliMDd4MF9ncGlvcyBncGlvLCB1OCBncGlvX2RpciwgdTggZ3Bpb192YWwpCiB7CiAJc3RydWN0IGRpYjA3MDBfc3RhdGUgKnN0ID0gZC0+cHJpdjsKLQlzMTYgcmV0OworCWludCByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT51c2JfbXV0ZXgpIDwgMCkgeworCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJc3QtPmJ1ZlswXSA9IFJFUVVFU1RfU0VUX0dQSU87CiAJc3QtPmJ1ZlsxXSA9IGdwaW87CkBAIC0xMTYsNiArMTI3LDcgQEAKIAogCXJldCA9IGRpYjA3MDBfY3RybF93cihkLCBzdC0+YnVmLCAzKTsKIAorCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjUsNiArMTM3LDExIEBACiAJaW50IHJldDsKIAogCWlmIChzdC0+ZndfdmVyc2lvbiA+PSAweDEwMjAxKSB7CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPnVzYl9tdXRleCkgPCAwKSB7CisJCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJCXJldHVybiAwOworCQl9CisKIAkJc3QtPmJ1ZlswXSA9IFJFUVVFU1RfU0VUX1VTQl9YRkVSX0xFTjsKIAkJc3QtPmJ1ZlsxXSA9IChuYl90c19wYWNrZXRzID4+IDgpICYgMHhmZjsKIAkJc3QtPmJ1ZlsyXSA9IG5iX3RzX3BhY2tldHMgJiAweGZmOwpAQCAtMTMyLDYgKzE0OSw3IEBACiAJCWRlYl9pbmZvKCJzZXQgdGhlIFVTQiB4ZmVyIGxlbiB0byAlaSBUcyBwYWNrZXRcbiIsIG5iX3RzX3BhY2tldHMpOwogCiAJCXJldCA9IGRpYjA3MDBfY3RybF93cihkLCBzdC0+YnVmLCAzKTsKKwkJbXV0ZXhfdW5sb2NrKCZkLT51c2JfbXV0ZXgpOwogCX0gZWxzZSB7CiAJCWRlYl9pbmZvKCJ0aGlzIGZpcm13YXJlIGRvZXMgbm90IGFsbG93IHRvIGNoYW5nZSB0aGUgVVNCIHhmZXIgbGVuXG4iKTsKIAkJcmV0ID0gLUVJTzsKQEAgLTIwOCw2ICsyMjYsMTAgQEAKIAogCQl9IGVsc2UgewogCQkJLyogV3JpdGUgcmVxdWVzdCAqLworCQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+dXNiX211dGV4KSA8IDApIHsKKwkJCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJCXN0LT5idWZbMF0gPSBSRVFVRVNUX05FV19JMkNfV1JJVEU7CiAJCQlzdC0+YnVmWzFdID0gbXNnW2ldLmFkZHIgPDwgMTsKIAkJCXN0LT5idWZbMl0gPSAoZW5fc3RhcnQgPDwgNykgfCAoZW5fc3RvcCA8PCA2KSB8CkBAIC0yMjcsNiArMjQ5LDcgQEAKIAkJCQkJCSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCwKIAkJCQkJCSAwLCAwLCBzdC0+YnVmLCBtc2dbaV0ubGVuICsgNCwKIAkJCQkJCSBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisJCQltdXRleF91bmxvY2soJmQtPnVzYl9tdXRleCk7CiAJCQlpZiAocmVzdWx0IDwgMCkgewogCQkJCWRlYl9pbmZvKCJpMmMgd3JpdGUgZXJyb3IgKHN0YXR1cyA9ICVkKVxuIiwgcmVzdWx0KTsKIAkJCQlicmVhazsKQEAgLTI0OSw2ICsyNzIsMTAgQEAKIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQogCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT51c2JfbXV0ZXgpIDwgMCkgeworCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAJCS8qIGZpbGwgaW4gdGhlIGFkZHJlc3MgKi8KQEAgLTI3OSw2ICszMDYsNyBAQAogCQkJCWJyZWFrOwogCQl9CiAJfQorCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKIAltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7CiAKIAlyZXR1cm4gaTsKQEAgLTMzNyw3ICszNjUsMTIgQEAKIAl1MTYgcGxsX2xvb3BkaXYsIHUxNiBmcmVlX2RpdiwgdTE2IGRzdVNjYWxlcikKIHsKIAlzdHJ1Y3QgZGliMDcwMF9zdGF0ZSAqc3QgPSBkLT5wcml2OwotCXMxNiByZXQ7CisJaW50IHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPnVzYl9tdXRleCkgPCAwKSB7CisJCWVycigiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CiAKIAlzdC0+YnVmWzBdID0gUkVRVUVTVF9TRVRfQ0xPQ0s7CiAJc3QtPmJ1ZlsxXSA9IChlbl9wbGwgPDwgNykgfCAocGxsX3NyYyA8PCA2KSB8CkBAIC0zNTIsNiArMzg1LDcgQEAKIAlzdC0+YnVmWzldID0gIGRzdVNjYWxlciAgICAgICAgICYgMHhmZjsgLyogTFNCICovCiAKIAlyZXQgPSBkaWIwNzAwX2N0cmxfd3IoZCwgc3QtPmJ1ZiwgMTApOworCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0zNjAsMTAgKzM5NCwxNiBAQAogewogCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGQtPnByaXY7CiAJdTE2IGRpdmlkZXI7CisJaW50IHJldDsKIAogCWlmIChzY2xfa0h6ID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+dXNiX211dGV4KSA8IDApIHsKKwkJZXJyKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAwOworCX0KKwogCXN0LT5idWZbMF0gPSBSRVFVRVNUX1NFVF9JMkNfUEFSQU07CiAJZGl2aWRlciA9ICh1MTYpICgzMDAwMCAvIHNjbF9rSHopOwogCXN0LT5idWZbMV0gPSAwOwpAQCAtMzc5LDcgKzQxOSwxMSBAQAogCWRlYl9pbmZvKCJzZXR0aW5nIEkyQyBzcGVlZDogJTA0eCAlMDR4ICUwNHggKCVkIGtIeikuIiwKIAkJKHN0LT5idWZbMl0gPDwgOCkgfCAoc3QtPmJ1ZlszXSksIChzdC0+YnVmWzRdIDw8IDgpIHwKIAkJc3QtPmJ1Zls1XSwgKHN0LT5idWZbNl0gPDwgOCkgfCBzdC0+YnVmWzddLCBzY2xfa0h6KTsKLQlyZXR1cm4gZGliMDcwMF9jdHJsX3dyKGQsIHN0LT5idWYsIDgpOworCisJcmV0ID0gZGliMDcwMF9jdHJsX3dyKGQsIHN0LT5idWYsIDgpOworCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtNDg0LDEzICs1MjgsMTMgQEAKIAkJZm9yIChhZGFwX251bSA9IDA7IGFkYXBfbnVtIDwgZGliMDcwMF9kZXZpY2VzW2ldLm51bV9hZGFwdGVyczsKIAkJCQlhZGFwX251bSsrKSB7CiAJCQlpZiAoZndfdmVyc2lvbiA+PSAweDEwMjAxKSB7Ci0JCQkJZGliMDcwMF9kZXZpY2VzW2ldLmFkYXB0ZXJbYWRhcF9udW1dLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZSA9IDE4OCpuYl9wYWNrZXRfYnVmZmVyX3NpemU7CisJCQkJZGliMDcwMF9kZXZpY2VzW2ldLmFkYXB0ZXJbYWRhcF9udW1dLmZlWzBdLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZSA9IDE4OCpuYl9wYWNrZXRfYnVmZmVyX3NpemU7CiAJCQl9IGVsc2UgewogCQkJCS8qIGZvciBmdyB2ZXJzaW9uIG9sZGVyIHRoYW4gMS4yMC4xLAogCQkJCSAqIHRoZSBidWZmZXJzaXplIGhhcyB0byBiZSBuIHRpbWVzIDUxMiAqLwotCQkJCWRpYjA3MDBfZGV2aWNlc1tpXS5hZGFwdGVyW2FkYXBfbnVtXS5zdHJlYW0udS5idWxrLmJ1ZmZlcnNpemUgPSAoKDE4OCpuYl9wYWNrZXRfYnVmZmVyX3NpemUrMTg4LzIpLzUxMikqNTEyOwotCQkJCWlmIChkaWIwNzAwX2RldmljZXNbaV0uYWRhcHRlclthZGFwX251bV0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplIDwgNTEyKQotCQkJCQlkaWIwNzAwX2RldmljZXNbaV0uYWRhcHRlclthZGFwX251bV0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplID0gNTEyOworCQkJCWRpYjA3MDBfZGV2aWNlc1tpXS5hZGFwdGVyW2FkYXBfbnVtXS5mZVswXS5zdHJlYW0udS5idWxrLmJ1ZmZlcnNpemUgPSAoKDE4OCpuYl9wYWNrZXRfYnVmZmVyX3NpemUrMTg4LzIpLzUxMikqNTEyOworCQkJCWlmIChkaWIwNzAwX2RldmljZXNbaV0uYWRhcHRlclthZGFwX251bV0uZmVbMF0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplIDwgNTEyKQorCQkJCQlkaWIwNzAwX2RldmljZXNbaV0uYWRhcHRlclthZGFwX251bV0uZmVbMF0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplID0gNTEyOwogCQkJfQogCQl9CiAJfQpAQCAtNTE1LDYgKzU1OSwxMSBAQAogCQl9CiAJfQogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWRhcC0+ZGV2LT51c2JfbXV0ZXgpIDwgMCkgeworCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3QtPmJ1ZlswXSA9IFJFUVVFU1RfRU5BQkxFX1ZJREVPOwogCS8qIHRoaXMgYml0IGdpdmVzIGEga2luZCBvZiBjb21tYW5kLAogCSAqIHJhdGhlciB0aGFuIGVuYWJsaW5nIHNvbWV0aGluZyBvciBub3QgKi8KQEAgLTUzMCwyNSArNTc5LDI4IEBACiAJZGViX2luZm8oIm1vZGlmeWluZyAoJWQpIHN0cmVhbWluZyBzdGF0ZSBmb3IgJWRcbiIsIG9ub2ZmLCBhZGFwLT5pZCk7CiAKIAlzdC0+Y2hhbm5lbF9zdGF0ZSAmPSB+MHgzOwotCWlmICgoYWRhcC0+c3RyZWFtLnByb3BzLmVuZHBvaW50ICE9IDIpCi0JCQkmJiAoYWRhcC0+c3RyZWFtLnByb3BzLmVuZHBvaW50ICE9IDMpKSB7Ci0JCWRlYl9pbmZvKCJ0aGUgZW5kcG9pbnQgbnVtYmVyICglaSkgaXMgbm90IGNvcnJlY3QsIHVzZSB0aGUgYWRhcHRlciBpZCBpbnN0ZWFkIiwgYWRhcC0+c3RyZWFtLnByb3BzLmVuZHBvaW50KTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uc3RyZWFtLnByb3BzLmVuZHBvaW50ICE9IDIpCisJCQkmJiAoYWRhcC0+ZmVfYWRhcFswXS5zdHJlYW0ucHJvcHMuZW5kcG9pbnQgIT0gMykpIHsKKwkJZGViX2luZm8oInRoZSBlbmRwb2ludCBudW1iZXIgKCVpKSBpcyBub3QgY29ycmVjdCwgdXNlIHRoZSBhZGFwdGVyIGlkIGluc3RlYWQiLCBhZGFwLT5mZV9hZGFwWzBdLnN0cmVhbS5wcm9wcy5lbmRwb2ludCk7CiAJCWlmIChvbm9mZikKIAkJCXN0LT5jaGFubmVsX3N0YXRlIHw9CTEgPDwgKGFkYXAtPmlkKTsKIAkJZWxzZQogCQkJc3QtPmNoYW5uZWxfc3RhdGUgfD0JMSA8PCB+KGFkYXAtPmlkKTsKIAl9IGVsc2UgewogCQlpZiAob25vZmYpCi0JCQlzdC0+Y2hhbm5lbF9zdGF0ZSB8PQkxIDw8IChhZGFwLT5zdHJlYW0ucHJvcHMuZW5kcG9pbnQtMik7CisJCQlzdC0+Y2hhbm5lbF9zdGF0ZSB8PQkxIDw8IChhZGFwLT5mZV9hZGFwWzBdLnN0cmVhbS5wcm9wcy5lbmRwb2ludC0yKTsKIAkJZWxzZQotCQkJc3QtPmNoYW5uZWxfc3RhdGUgfD0JMSA8PCAoMy1hZGFwLT5zdHJlYW0ucHJvcHMuZW5kcG9pbnQpOworCQkJc3QtPmNoYW5uZWxfc3RhdGUgfD0JMSA8PCAoMy1hZGFwLT5mZV9hZGFwWzBdLnN0cmVhbS5wcm9wcy5lbmRwb2ludCk7CiAJfQogCiAJc3QtPmJ1ZlsyXSB8PSBzdC0+Y2hhbm5lbF9zdGF0ZTsKIAogCWRlYl9pbmZvKCJkYXRhIGZvciBzdHJlYW1pbmc6ICV4ICV4XG4iLCBzdC0+YnVmWzFdLCBzdC0+YnVmWzJdKTsKIAotCXJldHVybiBkaWIwNzAwX2N0cmxfd3IoYWRhcC0+ZGV2LCBzdC0+YnVmLCA0KTsKKwlyZXQgPSBkaWIwNzAwX2N0cmxfd3IoYWRhcC0+ZGV2LCBzdC0+YnVmLCA0KTsKKwltdXRleF91bmxvY2soJmFkYXAtPmRldi0+dXNiX211dGV4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIGludCBkaWIwNzAwX2NoYW5nZV9wcm90b2NvbChzdHJ1Y3QgcmNfZGV2ICpyYywgdTY0IHJjX3R5cGUpCkBAIC01NTcsNiArNjA5LDExIEBACiAJc3RydWN0IGRpYjA3MDBfc3RhdGUgKnN0ID0gZC0+cHJpdjsKIAlpbnQgbmV3X3Byb3RvLCByZXQ7CiAKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT51c2JfbXV0ZXgpIDwgMCkgeworCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3QtPmJ1ZlswXSA9IFJFUVVFU1RfU0VUX1JDOwogCXN0LT5idWZbMV0gPSAwOwogCXN0LT5idWZbMl0gPSAwOwpAQCAtNTY3LDIzICs2MjQsMjkgQEAKIAllbHNlIGlmIChyY190eXBlID09IFJDX1RZUEVfTkVDKQogCQluZXdfcHJvdG8gPSAwOwogCWVsc2UgaWYgKHJjX3R5cGUgPT0gUkNfVFlQRV9SQzYpIHsKLQkJaWYgKHN0LT5md192ZXJzaW9uIDwgMHgxMDIwMCkKLQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoc3QtPmZ3X3ZlcnNpb24gPCAweDEwMjAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KIAogCQluZXdfcHJvdG8gPSAyOwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAKIAlzdC0+YnVmWzFdID0gbmV3X3Byb3RvOwogCiAJcmV0ID0gZGliMDcwMF9jdHJsX3dyKGQsIHN0LT5idWYsIDMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWVycigiaXIgcHJvdG9jb2wgc2V0dXAgZmFpbGVkIik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCWQtPnByb3BzLnJjLmNvcmUucHJvdG9jb2wgPSByY190eXBlOwogCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkLT51c2JfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jCmluZGV4IGQwZWE1YjYuLmYzMTMxODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCX0KIAl9CiAJc3QtPm10MjA2MF9pZjFbYWRhcC0+aWRdID0gMTIyMDsKLQlyZXR1cm4gKGFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWIzMDAwbWNfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwlyZXR1cm4gKGFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRpYjMwMDBtY19hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkoMTAgKyBhZGFwLT5pZCkgPDwgMSwgJmJyaXN0b2xfZGliMzAwMG1jX2NvbmZpZ1thZGFwLT5pZF0pKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKQEAgLTExOCwxNSArMTE4LDE2IEBACiBzdGF0aWMgaW50IGJyaXN0b2xfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICpwcmltX2kyYyA9ICZhZGFwLT5kZXYtPmkyY19hZGFwOwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjMwMDBtY19nZXRfdHVuZXJfaTJjX21hc3RlcihhZGFwLT5mZSwgMSk7CisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliMzAwMG1jX2dldF90dW5lcl9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIDEpOwogCXM4IGE7CiAJaW50IGlmMT0xMjIwOwogCWlmIChhZGFwLT5kZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgID09IGNwdV90b19sZTE2KFVTQl9WSURfSEFVUFBBVUdFKSAmJgogCQlhZGFwLT5kZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IGNwdV90b19sZTE2KFVTQl9QSURfSEFVUFBBVUdFX05PVkFfVF81MDBfMikpIHsKIAkJaWYgKCFlZXByb21fcmVhZChwcmltX2kyYywweDU5ICsgYWRhcC0+aWQsJmEpKSBpZjE9MTIyMCthOwogCX0KLQlyZXR1cm4gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLGFkYXAtPmZlLCB0dW5faTJjLCZicmlzdG9sX210MjA2MF9jb25maWdbYWRhcC0+aWRdLAotCQlpZjEpID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLAorCQkJICAmYnJpc3RvbF9tdDIwNjBfY29uZmlnW2FkYXAtPmlkXSwgaWYxKSA9PSBOVUxMID8KKwkJCSAgLUVOT0RFViA6IDA7CiB9CiAKIC8qIFNUSzc3MDBEOiBQaW5uYWNsZS9UZXJyYXRlYy9IYXVwcGF1Z2UgRHVhbCBEVkItVCBEaXZlcnNpdHkgKi8KQEAgLTI3OSwxMCArMjgwLDEyIEBACiAJCX0KIAl9CiAKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwweDgwKyhhZGFwLT5pZCA8PCAxKSwKLQkJCQkmc3RrNzcwMGRfZGliNzAwMHBfbXQyMjY2X2NvbmZpZ1thZGFwLT5pZF0pOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPQorCQlkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJCQkgICAweDgwICsgKGFkYXAtPmlkIDw8IDEpLAorCQkJICAgJnN0azc3MDBkX2RpYjcwMDBwX210MjI2Nl9jb25maWdbYWRhcC0+aWRdKTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCiBzdGF0aWMgaW50IHN0azc3MDBkX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQpAQCAtMzA2LDE3ICszMDksMTkgQEAKIAkJfQogCX0KIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLDB4ODArKGFkYXAtPmlkIDw8IDEpLAotCQkJCSZzdGs3NzAwZF9kaWI3MDAwcF9tdDIyNjZfY29uZmlnW2FkYXAtPmlkXSk7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9CisJCWR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCSAgIDB4ODAgKyAoYWRhcC0+aWQgPDwgMSksCisJCQkgICAmc3RrNzcwMGRfZGliNzAwMHBfbXQyMjY2X2NvbmZpZ1thZGFwLT5pZF0pOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3RrNzcwMGRfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjOwotCXR1bl9pMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKLQlyZXR1cm4gZHZiX2F0dGFjaChtdDIyNjZfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKKwl0dW5faTJjID0gZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmVfYWRhcFswXS5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKKwlyZXR1cm4gZHZiX2F0dGFjaChtdDIyNjZfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLAogCQkmc3RrNzcwMGRfbXQyMjY2X2NvbmZpZ1thZGFwLT5pZF0pID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIApAQCAtMzk2LDggKzQwMSw4IEBACiAJc3dpdGNoIChjb21tYW5kKSB7CiAJY2FzZSBYQzIwMjhfVFVORVJfUkVTRVQ6CiAJCS8qIFNlbmQgdGhlIHR1bmVyIGluIHRoZW4gb3V0IG9mIHJlc2V0ICovCi0JCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAwKTsgbXNsZWVwKDEwKTsKLQkJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmUsIDgsIDAsIDEpOworCQlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZV9hZGFwWzBdLmZlLCA4LCAwLCAwKTsgbXNsZWVwKDEwKTsKKwkJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmVfYWRhcFswXS5mZSwgOCwgMCwgMSk7CiAJCWJyZWFrOwogCWNhc2UgWEMyMDI4X1JFU0VUX0NMSzoKIAkJYnJlYWs7CkBAIC00NDcsMjUgKzQ1MiwyNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkmc3RrNzcwMHBoX2RpYjc3MDBfeGMzMDI4X2NvbmZpZyk7CiAKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogc3RhdGljIGludCBzdGs3NzAwcGhfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjOwogCi0JdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLAorCXR1bl9pMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQlESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOwogCiAJc3RrNzcwMHBoX3hjMzAyOF9jb25maWcuaTJjX2FkYXAgPSB0dW5faTJjOwogCiAJLyogRklYTUU6IGdlbmVyYWxpemUgJiBtb3ZlIHRvIGNvbW1vbiBhcmVhICovCi0JYWRhcC0+ZmUtPmNhbGxiYWNrID0gc3RrNzcwMHBoX3hjMzAyOF9jYWxsYmFjazsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5jYWxsYmFjayA9IHN0azc3MDBwaF94YzMwMjhfY2FsbGJhY2s7CiAKLQlyZXR1cm4gZHZiX2F0dGFjaCh4YzIwMjhfYXR0YWNoLCBhZGFwLT5mZSwgJnN0azc3MDBwaF94YzMwMjhfY29uZmlnKQorCXJldHVybiBkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZzdGs3NzAwcGhfeGMzMDI4X2NvbmZpZykKIAkJPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCkBAIC02ODUsMTIgKzY5MCwxMiBAQAogCXN0LT5tdDIwNjBfaWYxWzBdID0gMTIyMDsKIAogCWlmIChkaWI3MDAwcGNfZGV0ZWN0aW9uKCZhZGFwLT5kZXYtPmkyY19hZGFwKSkgewotCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMTgsICZzdGs3NzAwcF9kaWI3MDAwcF9jb25maWcpOworCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAxOCwgJnN0azc3MDBwX2RpYjcwMDBwX2NvbmZpZyk7CiAJCXN0LT5pc19kaWI3MDAwcGMgPSAxOwogCX0gZWxzZQotCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMG1fYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMTgsICZzdGs3NzAwcF9kaWI3MDAwbV9jb25maWcpOworCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwbV9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAxOCwgJnN0azc3MDBwX2RpYjcwMDBtX2NvbmZpZyk7CiAKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogc3RhdGljIHN0cnVjdCBtdDIwNjBfY29uZmlnIHN0azc3MDBwX210MjA2MF9jb25maWcgPSB7CkBAIC03MDksMTEgKzcxNCwxMSBAQAogCQlpZiAoIWVlcHJvbV9yZWFkKHByaW1faTJjLDB4NTgsJmEpKSBpZjE9MTIyMCthOwogCX0KIAlpZiAoc3QtPmlzX2RpYjcwMDBwYykKLQkJdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOworCQl0dW5faTJjID0gZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmVfYWRhcFswXS5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKIAllbHNlCi0JCXR1bl9pMmMgPSBkaWI3MDAwbV9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKKwkJdHVuX2kyYyA9IGRpYjcwMDBtX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CiAKLQlyZXR1cm4gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywgJnN0azc3MDBwX210MjA2MF9jb25maWcsCisJcmV0dXJuIGR2Yl9hdHRhY2gobXQyMDYwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywgJnN0azc3MDBwX210MjA2MF9jb25maWcsCiAJCWlmMSkgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCkBAIC04NDMsMzMgKzg0OCwzMyBAQAogc3RhdGljIGludCBkaWI3NzcwcF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAkgc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCSBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwKKwkgc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCSBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOwogCi0JIGlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKLQkJCQkgJmRpYjc3NzBwX2RpYjAwNzBfY29uZmlnKSA9PSBOVUxMKQorCSBpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywKKwkJCSZkaWI3NzcwcF9kaWIwMDcwX2NvbmZpZykgPT0gTlVMTCkKIAkJIHJldHVybiAtRU5PREVWOwogCi0JIHN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JIGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3NzcwX3NldF9wYXJhbV9vdmVycmlkZTsKKwkgc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCSBhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3NzcwX3NldF9wYXJhbV9vdmVycmlkZTsKIAkgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZGliNzA3MHBfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CiAKIAlpZiAoYWRhcC0+aWQgPT0gMCkgewotCQlpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmUsIHR1bl9pMmMsICZkaWI3MDcwcF9kaWIwMDcwX2NvbmZpZ1swXSkgPT0gTlVMTCkKKwkJaWYgKGR2Yl9hdHRhY2goZGliMDA3MF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsICZkaWI3MDcwcF9kaWIwMDcwX2NvbmZpZ1swXSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSB7Ci0JCWlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywgJmRpYjcwNzBwX2RpYjAwNzBfY29uZmlnWzFdKSA9PSBOVUxMKQorCQlpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywgJmRpYjcwNzBwX2RpYjAwNzBfY29uZmlnWzFdKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKLQlhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZGliNzA3MF9zZXRfcGFyYW1fb3ZlcnJpZGU7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwNzBfc2V0X3BhcmFtX292ZXJyaWRlOwogCXJldHVybiAwOwogfQogCkBAIC04NzgsMjYgKzg4MywyNiBAQAogewogCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGFkYXB0ZXItPmRldi0+cHJpdjsKIAlpZiAoc3QtPmlzX2RpYjcwMDBwYykKLQkJcmV0dXJuIGRpYjcwMDBwX3BpZF9maWx0ZXIoYWRhcHRlci0+ZmUsIGluZGV4LCBwaWQsIG9ub2ZmKTsKLQlyZXR1cm4gZGliNzAwMG1fcGlkX2ZpbHRlcihhZGFwdGVyLT5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOworCQlyZXR1cm4gZGliNzAwMHBfcGlkX2ZpbHRlcihhZGFwdGVyLT5mZV9hZGFwWzBdLmZlLCBpbmRleCwgcGlkLCBvbm9mZik7CisJcmV0dXJuIGRpYjcwMDBtX3BpZF9maWx0ZXIoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOwogfQogCiBzdGF0aWMgaW50IHN0azc3MDBwX3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgb25vZmYpCiB7CiAJc3RydWN0IGRpYjA3MDBfc3RhdGUgKnN0ID0gYWRhcHRlci0+ZGV2LT5wcml2OwogCWlmIChzdC0+aXNfZGliNzAwMHBjKQotCQlyZXR1cm4gZGliNzAwMHBfcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlLCBvbm9mZik7Ci0JcmV0dXJuIGRpYjcwMDBtX3BpZF9maWx0ZXJfY3RybChhZGFwdGVyLT5mZSwgb25vZmYpOworCQlyZXR1cm4gZGliNzAwMHBfcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlX2FkYXBbMF0uZmUsIG9ub2ZmKTsKKwlyZXR1cm4gZGliNzAwMG1fcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlX2FkYXBbMF0uZmUsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGludCBzdGs3MHgwcF9waWRfZmlsdGVyKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBpbmRleCwgdTE2IHBpZCwgaW50IG9ub2ZmKQogewotICAgIHJldHVybiBkaWI3MDAwcF9waWRfZmlsdGVyKGFkYXB0ZXItPmZlLCBpbmRleCwgcGlkLCBvbm9mZik7CisJcmV0dXJuIGRpYjcwMDBwX3BpZF9maWx0ZXIoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOwogfQogCiBzdGF0aWMgaW50IHN0azcweDBwX3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgb25vZmYpCiB7Ci0gICAgcmV0dXJuIGRpYjcwMDBwX3BpZF9maWx0ZXJfY3RybChhZGFwdGVyLT5mZSwgb25vZmYpOworCXJldHVybiBkaWI3MDAwcF9waWRfZmlsdGVyX2N0cmwoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgb25vZmYpOwogfQogCiBzdGF0aWMgc3RydWN0IGRpYngwMDBfYmFuZHdpZHRoX2NvbmZpZyBkaWI3MDcwX2J3X2NvbmZpZ18xMl9taHogPSB7CkBAIC05NTUsOSArOTYwLDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwKIAkJJmRpYjcwNzBwX2RpYjcwMDBwX2NvbmZpZyk7Ci0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIC8qIFNUSzc3NzBQICovCkBAIC0xMDA3LDkgKzEwMTIsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkmZGliNzc3MHBfZGliNzAwMHBfY29uZmlnKTsKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogLyogRElCODA3eCBnZW5lcmljICovCkBAIC0xMjI1LDM0ICsxMjMwLDM0IEBACiBzdGF0aWMgaW50IGRpYjgwN3hfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjgwMDBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsCisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliODAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkJRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKIAogCWlmIChhZGFwLT5pZCA9PSAwKSB7Ci0JCWlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKKwkJaWYgKGR2Yl9hdHRhY2goZGliMDA3MF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsCiAJCQkJJmRpYjgwN3hfZGliMDA3MF9jb25maWdbMF0pID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9IGVsc2UgewotCQlpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmUsIHR1bl9pMmMsCisJCWlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLAogCQkJCSZkaWI4MDd4X2RpYjAwNzBfY29uZmlnWzFdKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKLQlhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZGliODA3eF9zZXRfcGFyYW1fb3ZlcnJpZGU7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjgwN3hfc2V0X3BhcmFtX292ZXJyaWRlOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHN0azgweHhfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgaW5kZXgsCiAJdTE2IHBpZCwgaW50IG9ub2ZmKQogewotCXJldHVybiBkaWI4MDAwX3BpZF9maWx0ZXIoYWRhcHRlci0+ZmUsIGluZGV4LCBwaWQsIG9ub2ZmKTsKKwlyZXR1cm4gZGliODAwMF9waWRfZmlsdGVyKGFkYXB0ZXItPmZlX2FkYXBbMF0uZmUsIGluZGV4LCBwaWQsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGludCBzdGs4MHh4X3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLAogCQlpbnQgb25vZmYpCiB7Ci0JcmV0dXJuIGRpYjgwMDBfcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlLCBvbm9mZik7CisJcmV0dXJuIGRpYjgwMDBfcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlX2FkYXBbMF0uZmUsIG9ub2ZmKTsKIH0KIAogLyogU1RLODA3eCAqLwpAQCAtMTI3NiwxMCArMTI4MSwxMCBAQAogCWRpYjgwMDBfaTJjX2VudW1lcmF0aW9uKCZhZGFwLT5kZXYtPmkyY19hZGFwLCAxLCAxOCwKIAkJCQkweDgwKTsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliODAwMF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkJICAgICAgJmRpYjgwN3hfZGliODAwMF9jb25maWdbMF0pOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/ICAtRU5PREVWIDogMDsKIH0KIAogLyogU1RLODA3eFBWUiAqLwpAQCAtMTMwNSwxMCArMTMxMCwxMCBAQAogCS8qIGluaXRpYWxpemUgSUMgMCAqLwogCWRpYjgwMDBfaTJjX2VudW1lcmF0aW9uKCZhZGFwLT5kZXYtPmkyY19hZGFwLCAxLCAweDIyLCAweDgwKTsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliODAwMF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkJICAgICAgJmRpYjgwN3hfZGliODAwMF9jb25maWdbMF0pOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3RrODA3eHB2cl9mcm9udGVuZF9hdHRhY2gxKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCkBAIC0xMzE2LDEwICsxMzIxLDEwIEBACiAJLyogaW5pdGlhbGl6ZSBJQyAxICovCiAJZGliODAwMF9pMmNfZW51bWVyYXRpb24oJmFkYXAtPmRldi0+aTJjX2FkYXAsIDEsIDB4MTIsIDB4ODIpOwogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjgwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MiwKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODIsCiAJCQkgICAgICAmZGliODA3eF9kaWI4MDAwX2NvbmZpZ1sxXSk7CiAKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogLyogU1RLODA5NkdQICovCkBAIC0xNTQ2LDEzICsxNTUxLDEzIEBACiBzdGF0aWMgaW50IGRpYjgwOXhfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjgwMDBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliODAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOwogCi0JaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmUsIHR1bl9pMmMsICZkaWI4MDl4X2RpYjAwOTBfY29uZmlnKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsICZkaWI4MDl4X2RpYjAwOTBfY29uZmlnKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjgwOTZfc2V0X3BhcmFtX292ZXJyaWRlOworCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI4MDk2X3NldF9wYXJhbV9vdmVycmlkZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU3NSwzMCArMTU4MCwzMCBAQAogCiAJZGliODAwMF9pMmNfZW51bWVyYXRpb24oJmFkYXAtPmRldi0+aTJjX2FkYXAsIDEsIDE4LCAweDgwKTsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZkaWI4MDl4X2RpYjgwMDBfY29uZmlnWzBdKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZkaWI4MDl4X2RpYjgwMDBfY29uZmlnWzBdKTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gIC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgbmltODA5Nm1kX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUgKnN0ID0gYWRhcC0+cHJpdjsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmM7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZCAqZmVfc2xhdmUgID0gZGliODAwMF9nZXRfc2xhdmVfZnJvbnRlbmQoYWRhcC0+ZmUsIDEpOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlX3NsYXZlICA9IGRpYjgwMDBfZ2V0X3NsYXZlX2Zyb250ZW5kKGFkYXAtPmZlX2FkYXBbMF0uZmUsIDEpOwogCiAJaWYgKGZlX3NsYXZlKSB7CiAJCXR1bl9pMmMgPSBkaWI4MDAwX2dldF9pMmNfbWFzdGVyKGZlX3NsYXZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOwogCQlpZiAoZHZiX2F0dGFjaChkaWIwMDkwX3JlZ2lzdGVyLCBmZV9zbGF2ZSwgdHVuX2kyYywgJmRpYjgwOXhfZGliMDA5MF9jb25maWcpID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJZmVfc2xhdmUtPmR2YiA9IGFkYXAtPmZlLT5kdmI7CisJCWZlX3NsYXZlLT5kdmIgPSBhZGFwLT5mZV9hZGFwWzBdLmZlLT5kdmI7CiAJCWZlX3NsYXZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI4MDk2X3NldF9wYXJhbV9vdmVycmlkZTsKIAl9Ci0JdHVuX2kyYyA9IGRpYjgwMDBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7Ci0JaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmUsIHR1bl9pMmMsICZkaWI4MDl4X2RpYjAwOTBfY29uZmlnKSA9PSBOVUxMKQorCXR1bl9pMmMgPSBkaWI4MDAwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CisJaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywgJmRpYjgwOXhfZGliMDA5MF9jb25maWcpID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKLQlhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZGliODA5Nl9zZXRfcGFyYW1fb3ZlcnJpZGU7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjgwOTZfc2V0X3BhcmFtX292ZXJyaWRlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjI2LDEyICsxNjMxLDEyIEBACiAKIAlkaWI4MDAwX2kyY19lbnVtZXJhdGlvbigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMiwgMTgsIDB4ODApOwogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjgwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwgJmRpYjgwOXhfZGliODAwMF9jb25maWdbMF0pOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRpYjgwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwgJmRpYjgwOXhfZGliODAwMF9jb25maWdbMF0pOworCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJZmVfc2xhdmUgPSBkdmJfYXR0YWNoKGRpYjgwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MiwgJmRpYjgwOXhfZGliODAwMF9jb25maWdbMV0pOwotCWRpYjgwMDBfc2V0X3NsYXZlX2Zyb250ZW5kKGFkYXAtPmZlLCBmZV9zbGF2ZSk7CisJZGliODAwMF9zZXRfc2xhdmVfZnJvbnRlbmQoYWRhcC0+ZmVfYWRhcFswXS5mZSwgZmVfc2xhdmUpOwogCiAJcmV0dXJuIGZlX3NsYXZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CiB9CkBAIC0xNjM5LDEyICsxNjQ0LDEyIEBACiAvKiBTVEs5MDkwTSAqLwogc3RhdGljIGludCBkaWI5MHgwX3BpZF9maWx0ZXIoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcHRlciwgaW50IGluZGV4LCB1MTYgcGlkLCBpbnQgb25vZmYpCiB7Ci0JcmV0dXJuIGRpYjkwMDBfZndfcGlkX2ZpbHRlcihhZGFwdGVyLT5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOworCXJldHVybiBkaWI5MDAwX2Z3X3BpZF9maWx0ZXIoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOwogfQogCiBzdGF0aWMgaW50IGRpYjkweDBfcGlkX2ZpbHRlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBvbm9mZikKIHsKLQlyZXR1cm4gZGliOTAwMF9md19waWRfZmlsdGVyX2N0cmwoYWRhcHRlci0+ZmUsIG9ub2ZmKTsKKwlyZXR1cm4gZGliOTAwMF9md19waWRfZmlsdGVyX2N0cmwoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgb25vZmYpOwogfQogCiBzdGF0aWMgaW50IGRpYjkweDBfdHVuZXJfcmVzZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBvbm9mZikKQEAgLTE4NTYsMTUgKzE4NjEsMTUgQEAKIAlzdGs5MDkwbV9jb25maWcubWljcm9jb2RlX0JfZmVfc2l6ZSA9IHN0YXRlLT5mcm9udGVuZF9maXJtd2FyZS0+c2l6ZTsKIAlzdGs5MDkwbV9jb25maWcubWljcm9jb2RlX0JfZmVfYnVmZmVyID0gc3RhdGUtPmZyb250ZW5kX2Zpcm13YXJlLT5kYXRhOwogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjkwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwgJnN0azkwOTBtX2NvbmZpZyk7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliOTAwMF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLCAmc3RrOTA5MG1fY29uZmlnKTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gIC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgZGliOTA5MF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlICpzdGF0ZSA9IGFkYXAtPnByaXY7Ci0Jc3RydWN0IGkyY19hZGFwdGVyICppMmMgPSBkaWI5MDAwX2dldF90dW5lcl9pbnRlcmZhY2UoYWRhcC0+ZmUpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjID0gZGliOTAwMF9nZXRfdHVuZXJfaW50ZXJmYWNlKGFkYXAtPmZlX2FkYXBbMF0uZmUpOwogCXUxNiBkYXRhX2RpYjE5MFsxMF0gPSB7CiAJCTEsIDB4MTM3NCwKIAkJMiwgMHgwMWEyLApAQCAtMTg3MywxMyArMTg3OCwxMyBAQAogCQk4LCAweDA0ODYsCiAJfTsKIAotCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfZndfcmVnaXN0ZXIsIGFkYXAtPmZlLCBpMmMsICZkaWI5MDkwX2RpYjAwOTBfY29uZmlnKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfZndfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIGkyYywgJmRpYjkwOTBfZGliMDA5MF9jb25maWcpID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwotCWkyYyA9IGRpYjkwMDBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzFfMiwgMCk7CisJaTJjID0gZGliOTAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfR1BJT18xXzIsIDApOwogCWlmIChkaWIwMXgwX3BtdV91cGRhdGUoaTJjLCBkYXRhX2RpYjE5MCwgMTApICE9IDApCiAJCXJldHVybiAtRU5PREVWOwogCWRpYjA3MDBfc2V0X2kyY19zcGVlZChhZGFwLT5kZXYsIDIwMDApOwotCWlmIChkaWI5MDAwX2Zpcm13YXJlX3Bvc3RfcGxsX2luaXQoYWRhcC0+ZmUpIDwgMCkKKwlpZiAoZGliOTAwMF9maXJtd2FyZV9wb3N0X3BsbF9pbml0KGFkYXAtPmZlX2FkYXBbMF0uZmUpIDwgMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcmVsZWFzZV9maXJtd2FyZShzdGF0ZS0+ZnJvbnRlbmRfZmlybXdhcmUpOwogCXJldHVybiAwOwpAQCAtMTkyNSwxNiArMTkzMCwxNiBAQAogCW5pbTkwOTBtZF9jb25maWdbMV0ubWljcm9jb2RlX0JfZmVfYnVmZmVyID0gc3RhdGUtPmZyb250ZW5kX2Zpcm13YXJlLT5kYXRhOwogCiAJZGliOTAwMF9pMmNfZW51bWVyYXRpb24oJmFkYXAtPmRldi0+aTJjX2FkYXAsIDEsIDB4MjAsIDB4ODApOwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI5MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZuaW05MDkwbWRfY29uZmlnWzBdKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI5MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZuaW05MDkwbWRfY29uZmlnWzBdKTsKIAotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaTJjID0gZGliOTAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX0dQSU9fM180LCAwKTsKKwlpMmMgPSBkaWI5MDAwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzNfNCwgMCk7CiAJZGliOTAwMF9pMmNfZW51bWVyYXRpb24oaTJjLCAxLCAweDEyLCAweDgyKTsKIAogCWZlX3NsYXZlID0gZHZiX2F0dGFjaChkaWI5MDAwX2F0dGFjaCwgaTJjLCAweDgyLCAmbmltOTA5MG1kX2NvbmZpZ1sxXSk7Ci0JZGliOTAwMF9zZXRfc2xhdmVfZnJvbnRlbmQoYWRhcC0+ZmUsIGZlX3NsYXZlKTsKKwlkaWI5MDAwX3NldF9zbGF2ZV9mcm9udGVuZChhZGFwLT5mZV9hZGFwWzBdLmZlLCBmZV9zbGF2ZSk7CiAKIAlyZXR1cm4gZmVfc2xhdmUgPT0gTlVMTCA/ICAtRU5PREVWIDogMDsKIH0KQEAgLTE5NTEsMjYgKzE5NTYsMjYgQEAKIAkJMCwgMHgwMGVmLAogCQk4LCAweDA0MDYsCiAJfTsKLQlpMmMgPSBkaWI5MDAwX2dldF90dW5lcl9pbnRlcmZhY2UoYWRhcC0+ZmUpOwotCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfZndfcmVnaXN0ZXIsIGFkYXAtPmZlLCBpMmMsICZuaW05MDkwbWRfZGliMDA5MF9jb25maWdbMF0pID09IE5VTEwpCisJaTJjID0gZGliOTAwMF9nZXRfdHVuZXJfaW50ZXJmYWNlKGFkYXAtPmZlX2FkYXBbMF0uZmUpOworCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfZndfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIGkyYywgJm5pbTkwOTBtZF9kaWIwMDkwX2NvbmZpZ1swXSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaTJjID0gZGliOTAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX0dQSU9fMV8yLCAwKTsKKwlpMmMgPSBkaWI5MDAwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzFfMiwgMCk7CiAJaWYgKGRpYjAxeDBfcG11X3VwZGF0ZShpMmMsIGRhdGFfZGliMTkwLCAxMCkgPCAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlkaWIwNzAwX3NldF9pMmNfc3BlZWQoYWRhcC0+ZGV2LCAyMDAwKTsKLQlpZiAoZGliOTAwMF9maXJtd2FyZV9wb3N0X3BsbF9pbml0KGFkYXAtPmZlKSA8IDApCisJaWYgKGRpYjkwMDBfZmlybXdhcmVfcG9zdF9wbGxfaW5pdChhZGFwLT5mZV9hZGFwWzBdLmZlKSA8IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JZmVfc2xhdmUgPSBkaWI5MDAwX2dldF9zbGF2ZV9mcm9udGVuZChhZGFwLT5mZSwgMSk7CisJZmVfc2xhdmUgPSBkaWI5MDAwX2dldF9zbGF2ZV9mcm9udGVuZChhZGFwLT5mZV9hZGFwWzBdLmZlLCAxKTsKIAlpZiAoZmVfc2xhdmUgIT0gTlVMTCkgewotCQlpMmMgPSBkaWI5MDAwX2dldF9jb21wb25lbnRfYnVzX2ludGVyZmFjZShhZGFwLT5mZSk7CisJCWkyYyA9IGRpYjkwMDBfZ2V0X2NvbXBvbmVudF9idXNfaW50ZXJmYWNlKGFkYXAtPmZlX2FkYXBbMF0uZmUpOwogCQlkaWI5MDAwX3NldF9pMmNfYWRhcHRlcihmZV9zbGF2ZSwgaTJjKTsKIAogCQlpMmMgPSBkaWI5MDAwX2dldF90dW5lcl9pbnRlcmZhY2UoZmVfc2xhdmUpOwogCQlpZiAoZHZiX2F0dGFjaChkaWIwMDkwX2Z3X3JlZ2lzdGVyLCBmZV9zbGF2ZSwgaTJjLCAmbmltOTA5MG1kX2RpYjAwOTBfY29uZmlnWzFdKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWZlX3NsYXZlLT5kdmIgPSBhZGFwLT5mZS0+ZHZiOwotCQlkaWI5MDAwX2Z3X3NldF9jb21wb25lbnRfYnVzX3NwZWVkKGFkYXAtPmZlLCAyMDAwKTsKKwkJZmVfc2xhdmUtPmR2YiA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPmR2YjsKKwkJZGliOTAwMF9md19zZXRfY29tcG9uZW50X2J1c19zcGVlZChhZGFwLT5mZV9hZGFwWzBdLmZlLCAyMDAwKTsKIAkJaWYgKGRpYjkwMDBfZmlybXdhcmVfcG9zdF9wbGxfaW5pdChmZV9zbGF2ZSkgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMjM5MywyMyArMjM5OCwyMyBAQAogCQllcnIoIiVzOiBkaWI3MDAwcF9pMmNfZW51bWVyYXRpb24gZmFpbGVkLiAgQ2Fubm90IGNvbnRpbnVlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwgJm5pbTcwOTBfZGliNzAwMHBfY29uZmlnKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLCAmbmltNzA5MF9kaWI3MDAwcF9jb25maWcpOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/ICAtRU5PREVWIDogMDsKIH0KIAogc3RhdGljIGludCBuaW03MDkwX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUgKnN0ID0gYWRhcC0+cHJpdjsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmMgPSBkaWI3MDkwX2dldF9pMmNfdHVuZXIoYWRhcC0+ZmUpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwOTBfZ2V0X2kyY190dW5lcihhZGFwLT5mZV9hZGFwWzBdLmZlKTsKIAotCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfcmVnaXN0ZXIsIGFkYXAtPmZlLCB0dW5faTJjLCAmbmltNzA5MF9kaWIwMDkwX2NvbmZpZykgPT0gTlVMTCkKKwlpZiAoZHZiX2F0dGFjaChkaWIwMDkwX3JlZ2lzdGVyLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLCAmbmltNzA5MF9kaWIwMDkwX2NvbmZpZykgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZSwgOCwgMCwgMSk7CisJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmVfYWRhcFswXS5mZSwgOCwgMCwgMSk7CiAKLQlzdC0+c2V0X3BhcmFtX3NhdmUgPSBhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOwotCWFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3MDkwX2FnY19zdGFydHVwOworCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3MDkwX2FnY19zdGFydHVwOwogCXJldHVybiAwOwogfQogCkBAIC0yNDM5LDExICsyNDQ0LDExIEBACiAJfQogCiAJZGliMDcwMF9zZXRfaTJjX3NwZWVkKGFkYXAtPmRldiwgMzQwKTsKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg5MCwgJnRmZTcwOTBwdnJfZGliNzAwMHBfY29uZmlnWzBdKTsKLQlpZiAoYWRhcC0+ZmUgPT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDkwLCAmdGZlNzA5MHB2cl9kaWI3MDAwcF9jb25maWdbMF0pOworCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGliNzA5MF9zbGF2ZV9yZXNldChhZGFwLT5mZSk7CisJZGliNzA5MF9zbGF2ZV9yZXNldChhZGFwLT5mZV9hZGFwWzBdLmZlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQ1Miw1MCArMjQ1Nyw1MCBAQAogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwogCi0JaWYgKGFkYXAtPmRldi0+YWRhcHRlclswXS5mZSA9PSBOVUxMKSB7CisJaWYgKGFkYXAtPmRldi0+YWRhcHRlclswXS5mZV9hZGFwWzBdLmZlID09IE5VTEwpIHsKIAkJZXJyKCJ0aGUgbWFzdGVyIGRpYjcwOTAgaGFzIHRvIGJlIGluaXRpYWxpemVkIGZpcnN0Iik7CiAJCXJldHVybiAtRU5PREVWOyAvKiB0aGUgbWFzdGVyIGRldmljZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KIAl9CiAKLQlpMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5kZXYtPmFkYXB0ZXJbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzZfNywgMSk7CisJaTJjID0gZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZGV2LT5hZGFwdGVyWzBdLmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzZfNywgMSk7CiAJaWYgKGRpYjcwMDBwX2kyY19lbnVtZXJhdGlvbihpMmMsIDEsIDB4MTAsICZ0ZmU3MDkwcHZyX2RpYjcwMDBwX2NvbmZpZ1sxXSkgIT0gMCkgewogCQllcnIoIiVzOiBkaWI3MDAwcF9pMmNfZW51bWVyYXRpb24gZmFpbGVkLiAgQ2Fubm90IGNvbnRpbnVlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsIGkyYywgMHg5MiwgJnRmZTcwOTBwdnJfZGliNzAwMHBfY29uZmlnWzFdKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsIGkyYywgMHg5MiwgJnRmZTcwOTBwdnJfZGliNzAwMHBfY29uZmlnWzFdKTsKIAlkaWIwNzAwX3NldF9pMmNfc3BlZWQoYWRhcC0+ZGV2LCAyMDApOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgdGZlNzA5MHB2cl90dW5lcjBfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwOTBfZ2V0X2kyY190dW5lcihhZGFwLT5mZSk7CisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliNzA5MF9nZXRfaTJjX3R1bmVyKGFkYXAtPmZlX2FkYXBbMF0uZmUpOwogCi0JaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmUsIHR1bl9pMmMsICZ0ZmU3MDkwcHZyX2RpYjAwOTBfY29uZmlnWzBdKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsICZ0ZmU3MDkwcHZyX2RpYjAwOTBfY29uZmlnWzBdKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAxKTsKKwlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZV9hZGFwWzBdLmZlLCA4LCAwLCAxKTsKIAotCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwOTBfYWdjX3N0YXJ0dXA7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwOTBfYWdjX3N0YXJ0dXA7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdGZlNzA5MHB2cl90dW5lcjFfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwOTBfZ2V0X2kyY190dW5lcihhZGFwLT5mZSk7CisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliNzA5MF9nZXRfaTJjX3R1bmVyKGFkYXAtPmZlX2FkYXBbMF0uZmUpOwogCi0JaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmUsIHR1bl9pMmMsICZ0ZmU3MDkwcHZyX2RpYjAwOTBfY29uZmlnWzFdKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsICZ0ZmU3MDkwcHZyX2RpYjAwOTBfY29uZmlnWzFdKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAxKTsKKwlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZV9hZGFwWzBdLmZlLCA4LCAwLCAxKTsKIAotCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwOTBfYWdjX3N0YXJ0dXA7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwOTBfYWdjX3N0YXJ0dXA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1NTUsMTQgKzI1NjAsMTQgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZzdGs3MDcwcGRfZGliNzAwMHBfY29uZmlnWzBdKTsKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZzdGs3MDcwcGRfZGliNzAwMHBfY29uZmlnWzBdKTsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3RrNzA3MHBkX2Zyb250ZW5kX2F0dGFjaDEoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MiwgJnN0azcwNzBwZF9kaWI3MDAwcF9jb25maWdbMV0pOwotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MiwgJnN0azcwNzBwZF9kaWI3MDAwcF9jb25maWdbMV0pOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogLyogUzVIMTQxMSAqLwpAQCAtMjYxNyw5ICsyNjIyLDkgQEAKIAlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzIsIEdQSU9fT1VULCAxKTsKIAogCS8qIEdQSU9zIGFyZSBpbml0aWFsaXplZCwgZG8gdGhlIGF0dGFjaCAqLwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChzNWgxNDExX2F0dGFjaCwgJnBpbm5hY2xlXzgwMWVfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHM1aDE0MTFfYXR0YWNoLCAmcGlubmFjbGVfODAxZV9jb25maWcsCiAJCQkgICAgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7Ci0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgZGliMDcwMF94YzUwMDBfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHJpdiwgaW50IGNvbXBvbmVudCwKQEAgLTI2NDksOSArMjY1NCw5IEBACiBzdGF0aWMgaW50IHhjNTAwMF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAkvKiBGSVhNRTogZ2VuZXJhbGl6ZSAmIG1vdmUgdG8gY29tbW9uIGFyZWEgKi8KLQlhZGFwLT5mZS0+Y2FsbGJhY2sgPSBkaWIwNzAwX3hjNTAwMF90dW5lcl9jYWxsYmFjazsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5jYWxsYmFjayA9IGRpYjA3MDBfeGM1MDAwX3R1bmVyX2NhbGxiYWNrOwogCi0JcmV0dXJuIGR2Yl9hdHRhY2goeGM1MDAwX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCXJldHVybiBkdmJfYXR0YWNoKHhjNTAwMF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJICAmczVoMTQxMV94YzUwMDBfdHVuZXJjb25maWcpCiAJCT09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KQEAgLTI2NjMsOSArMjY2OCw5IEBACiAKIAlpZiAoY29tbWFuZCA9PSBYQzQwMDBfVFVORVJfUkVTRVQpIHsKIAkJLyogUmVzZXQgdGhlIHR1bmVyICovCi0JCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAwKTsKKwkJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmVfYWRhcFswXS5mZSwgOCwgMCwgMCk7CiAJCW1zbGVlcCgxMCk7Ci0JCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAxKTsKKwkJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmVfYWRhcFswXS5mZSwgOCwgMCwgMSk7CiAJfSBlbHNlIHsKIAkJZXJyKCJ4YzQwMDA6IHVua25vd24gdHVuZXIgY2FsbGJhY2sgY29tbWFuZDogJWRcbiIsIGNvbW1hbmQpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI3NzEsMTEgKzI3NzYsMTEgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4MTIsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHgxMiwKIAkJCSAgICAgICZwY3R2XzM0MGVfY29uZmlnKTsKIAlzdC0+aXNfZGliNzAwMHBjID0gMTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHhjNDAwMF9jb25maWcgZGliNzAwMHBfeGM0MDAwX3R1bmVyY29uZmlnID0gewpAQCAtMjc5MSw3ICsyNzk2LDcgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmM7CiAKIAkvKiBUaGUgeGM0MDAwIGlzIG5vdCBvbiB0aGUgbWFpbiBpMmMgYnVzICovCi0JdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLAorCXR1bl9pMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkJCQkgIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CiAJaWYgKHR1bl9pMmMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWFjaCB0dW5lciBpMmMgYnVzXG4iKTsKQEAgLTI3OTksOSArMjgwNCw5IEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHJlc2V0IGNhbGxiYWNrICovCi0JYWRhcC0+ZmUtPmNhbGxiYWNrID0gZGliMDcwMF94YzQwMDBfdHVuZXJfY2FsbGJhY2s7CisJYWRhcC0+ZmVfYWRhcFswXS5mZS0+Y2FsbGJhY2sgPSBkaWIwNzAwX3hjNDAwMF90dW5lcl9jYWxsYmFjazsKIAotCXJldHVybiBkdmJfYXR0YWNoKHhjNDAwMF9hdHRhY2gsIGFkYXAtPmZlLCB0dW5faTJjLAorCXJldHVybiBkdmJfYXR0YWNoKHhjNDAwMF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsCiAJCQkgICZkaWI3MDAwcF94YzQwMDBfdHVuZXJjb25maWcpCiAJCT09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KQEAgLTI4NTcsMTYgKzI4NjIsMTYgQEAKIAlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzEwLCBHUElPX09VVCwgMSk7CiAJbXNsZWVwKDMwKTsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChsZ2R0MzMwNV9hdHRhY2gsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2gobGdkdDMzMDVfYXR0YWNoLAogCQkJICAgICAgJmhjd19sZ2R0MzMwNV9jb25maWcsCiAJCQkgICAgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogc3RhdGljIGludCBteGw1MDA3dF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlyZXR1cm4gZHZiX2F0dGFjaChteGw1MDA3dF9hdHRhY2gsIGFkYXAtPmZlLAorCXJldHVybiBkdmJfYXR0YWNoKG14bDUwMDd0X2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCSAgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4NjAsCiAJCQkgICZoY3dfbXhsNTAwN3RfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CkBAIC0yOTg5LDYgKzI5OTQsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azc3MDBwX3BpZF9maWx0ZXIsCkBAIC0yOTk3LDYgKzMwMDQsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gc3RrNzcwMHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCisJCQl9fSwKIAkJCX0sCiAJCX0sCiAKQEAgLTMwNTAsMTUgKzMwNTgsMjEgQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGJyaXN0b2xfZnJvbnRlbmRfYXR0YWNoLAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gYnJpc3RvbF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKKwkJCX19LAogCQkJfSwgeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGJyaXN0b2xfZnJvbnRlbmRfYXR0YWNoLAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gYnJpc3RvbF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAzKSwKKwkJCX19LAogCQkJfQogCQl9LAogCkBAIC0zMDg0LDYgKzMwOTgsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMiwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMDkyLDcgKzMxMDgsMTAgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHN0azc3MDBkX3R1bmVyX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAorCQkJfX0sCiAJCQl9LCB7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMTAxLDYgKzMxMjAsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gc3RrNzcwMGRfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMyksCisJCQl9fSwKIAkJCX0KIAkJfSwKIApAQCAtMzE0Myw2ICszMTYzLDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLApAQCAtMzE1MSw2ICszMTczLDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHN0azc3MDBkX3R1bmVyX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAorCQkJfX0sCiAJCQl9LAogCQl9LAogCkBAIC0zMTg1LDYgKzMyMDgsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMTkzLDcgKzMyMTgsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliNzA3MHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfSwKIAkJfSwKQEAgLTMyNjEsNiArMzI4Niw4IEBACiAJCS5udW1fYWRhcHRlcnMgPSAxLAogCQkuYWRhcHRlciA9IHsKIAkJCXsKKwkJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJCS5mZSA9IHt7CiAJCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAogCQkJCS5waWRfZmlsdGVyICAgICAgID0gc3RrNzB4MHBfcGlkX2ZpbHRlciwKQEAgLTMyNjksNyArMzI5Niw3IEBACiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI3MDcwcF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LAogCQl9LApAQCAtMzMwNSw2ICszMzMyLDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLApAQCAtMzMxMyw5ICszMzQyLDExIEBACiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI3MDcwcF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LCB7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMzI0LDcgKzMzNTUsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliNzA3MHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMyksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfQogCQl9LApAQCAtMzM3Myw2ICszNDA0LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLApAQCAtMzM4MSw5ICszNDE0LDExIEBACiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI3MDcwcF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LCB7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMzkyLDcgKzM0MjcsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliNzA3MHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMyksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfQogCQl9LApAQCAtMzQyMCw2ICszNDU1LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLApAQCAtMzQyOCw3ICszNDY1LDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHN0azc3MDBwaF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QKIAkJCQkJCWRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzQ4OCwxMSArMzUyNSwxMyBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5mcm9udGVuZF9hdHRhY2ggID0gczVoMTQxMV9mcm9udGVuZF9hdHRhY2gsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSB4YzUwMDBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPSBzaXplb2Yoc3RydWN0CiAJCQkJCQlkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfSwKQEAgLTM1MjQsMTEgKzM1NjMsMTMgQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGxnZHQzMzA1X2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IG14bDUwMDd0X3R1bmVyX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAotCisJCQl9fSwKIAkJCQkuc2l6ZV9vZl9wcml2ID0gc2l6ZW9mKHN0cnVjdAogCQkJCQkJZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCkBAIC0zNTUwLDYgKzM1OTEsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zNTU4LDcgKzM2MDEsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliNzc3MHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzYwMCw2ICszNjQzLDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAogCQkJCS5waWRfZmlsdGVyID0gc3RrODB4eF9waWRfZmlsdGVyLApAQCAtMzYwOCw3ICszNjUzLDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYjgwN3hfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzY0NCw2ICszNjg5LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAogCQkJCS5waWRfZmlsdGVyID0gc3RrODB4eF9waWRfZmlsdGVyLApAQCAtMzY1MiwxMSArMzY5OSwxMyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliODA3eF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9CiAJCQkJCXNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzICA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgPSBzdGs4MHh4X3BpZF9maWx0ZXIsCkBAIC0zNjY1LDcgKzM3MTQsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliODA3eF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAzKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9CiAJCQkJCXNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCkBAIC0zNjkzLDYgKzM3NDIsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzICA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCkBAIC0zNzAyLDcgKzM3NTMsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliODA5eF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9CiAJCQkJCXNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCkBAIC0zNzMwLDYgKzM3ODEsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzICA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCkBAIC0zNzM5LDcgKzM3OTIsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliOTA5MF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9CiAJCQkJCXNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCkBAIC0zNzY3LDYgKzM4MjAsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzICA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCkBAIC0zNzc2LDcgKzM4MzEsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gbmltODA5Nm1kX3R1bmVyX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAotCisJCQl9fSwKIAkJCQkuc2l6ZV9vZl9wcml2ID0KIAkJCQkJc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfSwKQEAgLTM4MDQsNiArMzg1OSw4IEBACiAJCS5udW1fYWRhcHRlcnMgPSAxLAogCQkuYWRhcHRlciA9IHsKIAkJCXsKKwkJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJCS5mZSA9IHt7CiAJCQkJLmNhcHMgID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwKIAkJCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKQEAgLTM4MTMsNyArMzg3MCw3IEBACiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBuaW05MDkwbWRfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzg0MSw2ICszODk4LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLApAQCAtMzg1MCw3ICszOTA5LDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IG5pbTcwOTBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzg3OCw2ICszOTM3LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLApAQCAtMzg4NywxMSArMzk0OCwxMyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gdGZlNzA5MHB2cl90dW5lcjBfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMyksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LAogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLApAQCAtMzkwMSw3ICszOTY0LDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHRmZTcwOTBwdnJfdHVuZXIxX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAotCisJCQl9fSwKIAkJCQkuc2l6ZV9vZl9wcml2ID0KIAkJCQkJc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfSwKQEAgLTM5MjksMTEgKzM5OTIsMTMgQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHBjdHYzNDBlX2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHhjNDAwMF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QKIAkJCQkJCWRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYwppbmRleCA0YzJhNjg5Li5hNzZiYmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYwpAQCAtMjMsNyArMjMsNyBAQAogCWlmIChhZGFwLT5wcml2ICE9IE5VTEwpIHsKIAkJc3RydWN0IGRpYnVzYl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwogCQlpZiAoc3QtPm9wcy5maWZvX2N0cmwgIT0gTlVMTCkKLQkJCWlmIChzdC0+b3BzLmZpZm9fY3RybChhZGFwLT5mZSxvbm9mZikpIHsKKwkJCWlmIChzdC0+b3BzLmZpZm9fY3RybChhZGFwLT5mZV9hZGFwWzBdLmZlLCBvbm9mZikpIHsKIAkJCQllcnIoImVycm9yIHdoaWxlIGNvbnRyb2xsaW5nIHRoZSBmaWZvIG9mIHRoZSBkZW1vZC4iKTsKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCX0KQEAgLTM3LDcgKzM3LDggQEAKIAlpZiAoYWRhcC0+cHJpdiAhPSBOVUxMKSB7CiAJCXN0cnVjdCBkaWJ1c2Jfc3RhdGUgKnN0ID0gYWRhcC0+cHJpdjsKIAkJaWYgKHN0LT5vcHMucGlkX2N0cmwgIT0gTlVMTCkKLQkJCXN0LT5vcHMucGlkX2N0cmwoYWRhcC0+ZmUsaW5kZXgscGlkLG9ub2ZmKTsKKwkJCXN0LT5vcHMucGlkX2N0cmwoYWRhcC0+ZmVfYWRhcFswXS5mZSwKKwkJCQkJIGluZGV4LCBwaWQsIG9ub2ZmKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00OCw3ICs0OSw3IEBACiAJaWYgKGFkYXAtPnByaXYgIT0gTlVMTCkgewogCQlzdHJ1Y3QgZGlidXNiX3N0YXRlICpzdCA9IGFkYXAtPnByaXY7CiAJCWlmIChzdC0+b3BzLnBpZF9wYXJzZSAhPSBOVUxMKQotCQkJaWYgKHN0LT5vcHMucGlkX3BhcnNlKGFkYXAtPmZlLG9ub2ZmKSA8IDApCisJCQlpZiAoc3QtPm9wcy5waWRfcGFyc2UoYWRhcC0+ZmVfYWRhcFswXS5mZSwgb25vZmYpIDwgMCkKIAkJCQllcnIoImNvdWxkIG5vdCBoYW5kbGUgcGlkX3BhcnNlciIpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTI1NCw4ICsyNTUsMTYgQEAKIAkJbXNsZWVwKDEwMDApOwogCX0KIAotCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjMwMDBtY19hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCBERUZBVUxUX0RJQjMwMDBQX0kyQ19BRERSRVNTLCAgJm1vZDMwMDBwX2RpYjMwMDBwX2NvbmZpZykpICE9IE5VTEwgfHwKLQkJKGFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWIzMDAwbWNfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgREVGQVVMVF9ESUIzMDAwTUNfSTJDX0FERFJFU1MsICZtb2QzMDAwcF9kaWIzMDAwcF9jb25maWcpKSAhPSBOVUxMKSB7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliMzAwMG1jX2F0dGFjaCwKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCQkJCQkgREVGQVVMVF9ESUIzMDAwUF9JMkNfQUREUkVTUywKKwkJCQkJICZtb2QzMDAwcF9kaWIzMDAwcF9jb25maWcpOworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSkgPT0gTlVMTCkKKwkJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliMzAwMG1jX2F0dGFjaCwKKwkJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCQkJCSBERUZBVUxUX0RJQjMwMDBNQ19JMkNfQUREUkVTUywKKwkJCQkJCSAmbW9kMzAwMHBfZGliMzAwMHBfY29uZmlnKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpIHsKIAkJaWYgKGFkYXAtPnByaXYgIT0gTlVMTCkgewogCQkJc3RydWN0IGRpYnVzYl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwogCQkJc3QtPm9wcy5waWRfcGFyc2UgPSBkaWIzMDAwbWNfcGlkX3BhcnNlOwpAQCAtMzA5LDE1ICszMTgsMTUgQEAKIAkJfQogCX0KIAotCXR1bl9pMmMgPSBkaWIzMDAwbWNfZ2V0X3R1bmVyX2kyY19tYXN0ZXIoYWRhcC0+ZmUsIDEpOwotCWlmIChkdmJfYXR0YWNoKG10MjA2MF9hdHRhY2gsIGFkYXAtPmZlLCB0dW5faTJjLCAmc3RrMzAwMHBfbXQyMDYwX2NvbmZpZywgaWYxKSA9PSBOVUxMKSB7CisJdHVuX2kyYyA9IGRpYjMwMDBtY19nZXRfdHVuZXJfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLCAxKTsKKwlpZiAoZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLCAmc3RrMzAwMHBfbXQyMDYwX2NvbmZpZywgaWYxKSA9PSBOVUxMKSB7CiAJCS8qIG5vdCBmb3VuZCAtIHVzZSBwYW5hc29uaWMgcGxsIHBhcmFtZXRlcnMgKi8KLQkJaWYgKGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYwLCB0dW5faTJjLCBEVkJfUExMX0VOVjU3SDFYRDUpID09IE5VTEwpCisJCWlmIChkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLCB0dW5faTJjLCBEVkJfUExMX0VOVjU3SDFYRDUpID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9IGVsc2UgewogCQlzdC0+bXQyMDYwX3ByZXNlbnQgPSAxOwogCQkvKiBzZXQgdGhlIGNvcnJlY3QgcGFyYW1ldGVycyBmb3IgdGhlIGRpYjMwMDBwICovCi0JCWRpYjMwMDBtY19zZXRfY29uZmlnKGFkYXAtPmZlLCAmc3RrMzAwMHBfZGliMzAwMHBfY29uZmlnKTsKKwkJZGliMzAwMG1jX3NldF9jb25maWcoYWRhcC0+ZmVfYWRhcFswXS5mZSwgJnN0azMwMDBwX2RpYjMwMDBwX2NvbmZpZyk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKaW5kZXggMDRkOTFiZC4uNzI3MDc5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCkBAIC0zMSwxMSArMzEsMTIgQEAKIAogCWRlbW9kX2NmZy5kZW1vZF9hZGRyZXNzID0gMHg4OwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliMzAwMG1iX2F0dGFjaCwgJmRlbW9kX2NmZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJnN0LT5vcHMpKSA9PSBOVUxMKQorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRpYjMwMDBtYl9hdHRhY2gsICZkZW1vZF9jZmcsCisJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJnN0LT5vcHMpOworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlhZGFwLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwgPSBkaWIzMDAwbWJfaTJjX2dhdGVfY3RybDsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMuaTJjX2dhdGVfY3RybCA9IGRpYjMwMDBtYl9pMmNfZ2F0ZV9jdHJsOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00Niw3ICs0Nyw3IEBACiAKIAlzdC0+dHVuZXJfYWRkciA9IDB4NjE7CiAKLQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCSAgIERWQl9QTExfVFVBNjAxMFhTKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU3LDcgKzU4LDcgQEAKIAogCXN0LT50dW5lcl9hZGRyID0gMHg2MDsKIAotCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYwLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJICAgRFZCX1BMTF9UREE2NjVYKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTc4LDE2ICs3OSwxNiBAQAogCS8qIHRoZSBQYW5hc29uaWMgc2l0cyBvbiBJMkMgYWRkcmFzcyAweDYwLCB0aGUgVGhvbXNvbiBvbiAweDYxICovCiAJbXNnWzBdLmFkZHIgPSBtc2dbMV0uYWRkciA9IHN0LT50dW5lcl9hZGRyID0gMHg2MDsKIAotCWlmIChhZGFwLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWFkYXAtPmZlLT5vcHMuaTJjX2dhdGVfY3RybChhZGFwLT5mZSwxKTsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGFkYXAtPmZlX2FkYXBbMF0uZmUsIDEpOwogCiAJaWYgKGkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgbXNnLCAyKSAhPSAyKSB7CiAJCWVycigidHVuZXIgaTJjIHdyaXRlIGZhaWxlZC4iKTsKIAkJcmV0ID0gLUVSRU1PVEVJTzsKIAl9CiAKLQlpZiAoYWRhcC0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQotCQlhZGFwLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwoYWRhcC0+ZmUsMCk7CisJaWYgKGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMuaTJjX2dhdGVfY3RybChhZGFwLT5mZV9hZGFwWzBdLmZlLCAwKTsKIAogCWlmIChiMlswXSA9PSAweGZlKSB7CiAJCWluZm8oIlRoaXMgZGV2aWNlIGhhcyB0aGUgVGhvbXNvbiBDYWJsZSBvbmJvYXJkLiBXaGljaCBpcyBkZWZhdWx0LiIpOwpAQCAtMTg1LDYgKzE4Niw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCS5waWRfZmlsdGVyX2NvdW50ID0gMTYsCiAKQEAgLTIwNSw2ICsyMDgsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKIAkJfQogCX0sCkBAIC0yNzIsNiArMjc2LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGIHwgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAxNiwKIApAQCAtMjkyLDYgKzI5OCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWJ1c2Jfc3RhdGUpLAogCQl9LAogCX0sCkBAIC0zMzgsNiArMzQ1LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAxNiwKIApAQCAtMzU4LDYgKzM2Nyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWJ1c2Jfc3RhdGUpLAogCQl9CiAJfSwKQEAgLTM5OCw2ICs0MDgsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDE2LAogCkBAIC00MTcsNiArNDI5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAJCX0KIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKaW5kZXggYzFkOTA5NC4uOWMxNjVlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jCkBAIC01Nyw2ICs1Nyw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGRpYnVzYjJfMF9zdHJlYW1pbmdfY3RybCwKQEAgLTc2LDYgKzc4LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAJCX0KIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKaW5kZXggZjYzNDRjZC4uZjcxODQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCkBAIC0xMzcsMTEgKzEzNywxNiBAQAogewogCXN0cnVjdCBkaWdpdHZfc3RhdGUgKnN0ID0gYWRhcC0+ZGV2LT5wcml2OwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmZGlnaXR2X210MzUyX2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmZGlnaXR2X210MzUyX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpIHsKIAkJc3QtPmlzX254dDYwMDAgPSAwOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobnh0NjAwMF9hdHRhY2gsICZkaWdpdHZfbnh0NjAwMF9jb25maWcsICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkgeworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKG54dDYwMDBfYXR0YWNoLAorCQkJCQkgJmRpZ2l0dl9ueHQ2MDAwX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpIHsKIAkJc3QtPmlzX254dDYwMDAgPSAxOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNTIsMTEgKzE1NywxMSBAQAogewogCXN0cnVjdCBkaWdpdHZfc3RhdGUgKnN0ID0gYWRhcC0+ZGV2LT5wcml2OwogCi0JaWYgKCFkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwgTlVMTCwgRFZCX1BMTF9UREVENCkpCisJaWYgKCFkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLCBOVUxMLCBEVkJfUExMX1RERUQ0KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoc3QtPmlzX254dDYwMDApCi0JCWFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWdpdHZfbnh0NjAwMF90dW5lcl9zZXRfcGFyYW1zOworCQlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWdpdHZfbnh0NjAwMF90dW5lcl9zZXRfcGFyYW1zOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTIsNiArMjk3LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGRpZ2l0dl9mcm9udGVuZF9hdHRhY2gsCiAJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpZ2l0dl90dW5lcl9hdHRhY2gsCiAKQEAgLTMwNiw2ICszMTMsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5pZGVudGlmeV9zdGF0ZSAgID0gZGlnaXR2X2lkZW50aWZ5X3N0YXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYwppbmRleCBlY2Q4NmVjLi4xMDZkZmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYwpAQCAtOTAsNyArOTAsNyBAQAogCiBzdGF0aWMgaW50IGR0dDIwMHVfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JYWRhcC0+ZmUgPSBkdHQyMDB1X2ZlX2F0dGFjaChhZGFwLT5kZXYpOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdHQyMDB1X2ZlX2F0dGFjaChhZGFwLT5kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDAsNiArMTQwLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkcsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDE1LAogCkBAIC0xNTcsNiArMTU5LDcgQEAKIAkJCX0KIAkJfQogCX0sCisJCX19LAogCQl9CiAJfSwKIAkucG93ZXJfY3RybCAgICAgID0gZHR0MjAwdV9wb3dlcl9jdHJsLApAQCAtMTg3LDYgKzE5MCw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfTkVFRF9QSURfRklMVEVSSU5HLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAxNSwKIApAQCAtMjA0LDYgKzIwOSw3IEBACiAJCQl9CiAJCX0KIAl9LAorCQl9fSwKIAkJfQogCX0sCiAJLnBvd2VyX2N0cmwgICAgICA9IGR0dDIwMHVfcG93ZXJfY3RybCwKQEAgLTIzNCw2ICsyNDAsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX05FRURfUElEX0ZJTFRFUklORywKIAkJCS5waWRfZmlsdGVyX2NvdW50ID0gMTUsCiAKQEAgLTI1MSw2ICsyNTksNyBAQAogCQkJfQogCQl9CiAJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5wb3dlcl9jdHJsICAgICAgPSBkdHQyMDB1X3Bvd2VyX2N0cmwsCkBAIC0yODEsNiArMjkwLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkcsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDE1LAogCkBAIC0yOTgsNiArMzA5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIAkucG93ZXJfY3RybCAgICAgID0gZHR0MjAwdV9wb3dlcl9jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHY1MTAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0djUxMDAuYwppbmRleCAwNzhjZTkyLi43MzczMTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0djUxMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0djUxMDAuYwpAQCAtMTE1LDEzICsxMTUsMTMgQEAKIAogc3RhdGljIGludCBkdHY1MTAwX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmR0djUxMDBfemwxMDM1M19jb25maWcsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsICZkdHY1MTAwX3psMTAzNTNfY29uZmlnLAogCQkJICAgICAgJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJLyogZGlzYWJsZSBpMmMgZ2F0ZSwgb3IgaXQgd29uJ3Qgd29yay4uLiBpcyB0aGlzIHNhZmU/ICovCi0JYWRhcC0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gTlVMTDsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMuaTJjX2dhdGVfY3RybCA9IE5VTEw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMyw3ICsxMzMsNyBAQAogc3RhdGljIGludCBkdHY1MTAwX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXJldHVybiBkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsCi0JCQkgIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCSAgYWRhcC0+ZmVfYWRhcFswXS5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkgICZkdHY1MTAwX3F0MTAxMF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIApAQCAtMTgwLDYgKzE4MCw4IEBACiAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJLmZyb250ZW5kX2F0dGFjaCA9IGR0djUxMDBfZnJvbnRlbmRfYXR0YWNoLAogCQkudHVuZXJfYXR0YWNoICAgID0gZHR2NTEwMF90dW5lcl9hdHRhY2gsCiAKQEAgLTE5Myw2ICsxOTUsNyBAQAogCQkJCX0KIAkJCX0KIAkJfSwKKwkJfX0sCiAJfSB9LAogCiAJLmkyY19hbGdvID0gJmR0djUxMDBfaTJjX2FsZ28sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMKaW5kZXggYjNjYjYyNi4uYmE0YTc1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1kdmIuYwpAQCAtMTcsMTUgKzE3LDIwIEBACiAJaWYgKGFkYXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoKGFkYXAtPmFjdGl2ZV9mZSA8IDApIHx8CisJICAgIChhZGFwLT5hY3RpdmVfZmUgPj0gYWRhcC0+bnVtX2Zyb250ZW5kc19pbml0aWFsaXplZCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJbmV3ZmVlZGNvdW50ID0gYWRhcC0+ZmVlZGNvdW50ICsgKG9ub2ZmID8gMSA6IC0xKTsKIAogCS8qIHN0b3AgZmVlZCBiZWZvcmUgc2V0dGluZyBhIG5ldyBwaWQgaWYgdGhlcmUgd2lsbCBiZSBubyBwaWQgYW55bW9yZSAqLwogCWlmIChuZXdmZWVkY291bnQgPT0gMCkgewogCQlkZWJfdHMoInN0b3AgZmVlZGluZ1xuIik7Ci0JCXVzYl91cmJfa2lsbCgmYWRhcC0+c3RyZWFtKTsKKwkJdXNiX3VyYl9raWxsKCZhZGFwLT5mZV9hZGFwW2FkYXAtPmFjdGl2ZV9mZV0uc3RyZWFtKTsKIAotCQlpZiAoYWRhcC0+cHJvcHMuc3RyZWFtaW5nX2N0cmwgIT0gTlVMTCkgewotCQkJcmV0ID0gYWRhcC0+cHJvcHMuc3RyZWFtaW5nX2N0cmwoYWRhcCwgMCk7CisJCWlmIChhZGFwLT5wcm9wcy5mZVthZGFwLT5hY3RpdmVfZmVdLnN0cmVhbWluZ19jdHJsICE9IE5VTEwpIHsKKwkJCXJldCA9IGFkYXAtPnByb3BzLmZlW2FkYXAtPmFjdGl2ZV9mZV0uc3RyZWFtaW5nX2N0cmwoYWRhcCwgMCk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCWVycigiZXJyb3Igd2hpbGUgc3RvcHBpbmcgc3RyZWFtLiIpOwogCQkJCXJldHVybiByZXQ7CkBAIC0zNiwzNiArNDEsMzcgQEAKIAlhZGFwLT5mZWVkY291bnQgPSBuZXdmZWVkY291bnQ7CiAKIAkvKiBhY3RpdmF0ZSB0aGUgcGlkIG9uIHRoZSBkZXZpY2Ugc3BlY2lmaWMgcGlkX2ZpbHRlciAqLwotCWRlYl90cygic2V0dGluZyBwaWQgKCVzKTogJTVkICUwNHggYXQgaW5kZXggJWQgJyVzJ1xuIixhZGFwLT5waWRfZmlsdGVyaW5nID8KLQkJInllcyIgOiAibm8iLCBkdmJkbXhmZWVkLT5waWQsZHZiZG14ZmVlZC0+cGlkLGR2YmRteGZlZWQtPmluZGV4LG9ub2ZmID8KLQkJIm9uIiA6ICJvZmYiKTsKLQlpZiAoYWRhcC0+cHJvcHMuY2FwcyAmIERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiAmJgotCQlhZGFwLT5waWRfZmlsdGVyaW5nICYmCi0JCWFkYXAtPnByb3BzLnBpZF9maWx0ZXIgIT0gTlVMTCkKLQkJYWRhcC0+cHJvcHMucGlkX2ZpbHRlcihhZGFwLCBkdmJkbXhmZWVkLT5pbmRleCwgZHZiZG14ZmVlZC0+cGlkLG9ub2ZmKTsKKwlkZWJfdHMoInNldHRpbmcgcGlkICglcyk6ICU1ZCAlMDR4IGF0IGluZGV4ICVkICclcydcbiIsCisJCWFkYXAtPmZlX2FkYXBbYWRhcC0+YWN0aXZlX2ZlXS5waWRfZmlsdGVyaW5nID8KKwkJInllcyIgOiAibm8iLCBkdmJkbXhmZWVkLT5waWQsIGR2YmRteGZlZWQtPnBpZCwKKwkJZHZiZG14ZmVlZC0+aW5kZXgsIG9ub2ZmID8gIm9uIiA6ICJvZmYiKTsKKwlpZiAoYWRhcC0+cHJvcHMuZmVbYWRhcC0+YWN0aXZlX2ZlXS5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSICYmCisJCWFkYXAtPmZlX2FkYXBbYWRhcC0+YWN0aXZlX2ZlXS5waWRfZmlsdGVyaW5nICYmCisJCWFkYXAtPnByb3BzLmZlW2FkYXAtPmFjdGl2ZV9mZV0ucGlkX2ZpbHRlciAhPSBOVUxMKQorCQlhZGFwLT5wcm9wcy5mZVthZGFwLT5hY3RpdmVfZmVdLnBpZF9maWx0ZXIoYWRhcCwgZHZiZG14ZmVlZC0+aW5kZXgsIGR2YmRteGZlZWQtPnBpZCwgb25vZmYpOwogCiAJLyogc3RhcnQgdGhlIGZlZWQgaWYgdGhpcyB3YXMgdGhlIGZpcnN0IGZlZWQgYW5kIHRoZXJlIGlzIHN0aWxsIGEgZmVlZAogCSAqIGZvciByZWNlcHRpb24uCiAJICovCiAJaWYgKGFkYXAtPmZlZWRjb3VudCA9PSBvbm9mZiAmJiBhZGFwLT5mZWVkY291bnQgPiAwKSB7CiAJCWRlYl90cygic3VibWl0dGluZyBhbGwgVVJCc1xuIik7Ci0JCXVzYl91cmJfc3VibWl0KCZhZGFwLT5zdHJlYW0pOworCQl1c2JfdXJiX3N1Ym1pdCgmYWRhcC0+ZmVfYWRhcFthZGFwLT5hY3RpdmVfZmVdLnN0cmVhbSk7CiAKIAkJZGViX3RzKCJjb250cm9sbGluZyBwaWQgcGFyc2VyXG4iKTsKLQkJaWYgKGFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgJiYKLQkJCWFkYXAtPnByb3BzLmNhcHMgJgorCQlpZiAoYWRhcC0+cHJvcHMuZmVbYWRhcC0+YWN0aXZlX2ZlXS5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSICYmCisJCQlhZGFwLT5wcm9wcy5mZVthZGFwLT5hY3RpdmVfZmVdLmNhcHMgJgogCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYgJiYKLQkJCWFkYXAtPnByb3BzLnBpZF9maWx0ZXJfY3RybCAhPSBOVUxMKSB7Ci0JCQlyZXQgPSBhZGFwLT5wcm9wcy5waWRfZmlsdGVyX2N0cmwoYWRhcCwKLQkJCQlhZGFwLT5waWRfZmlsdGVyaW5nKTsKKwkJCWFkYXAtPnByb3BzLmZlW2FkYXAtPmFjdGl2ZV9mZV0ucGlkX2ZpbHRlcl9jdHJsICE9IE5VTEwpIHsKKwkJCXJldCA9IGFkYXAtPnByb3BzLmZlW2FkYXAtPmFjdGl2ZV9mZV0ucGlkX2ZpbHRlcl9jdHJsKGFkYXAsCisJCQkJYWRhcC0+ZmVfYWRhcFthZGFwLT5hY3RpdmVfZmVdLnBpZF9maWx0ZXJpbmcpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQllcnIoImNvdWxkIG5vdCBoYW5kbGUgcGlkX3BhcnNlciIpOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KIAkJZGViX3RzKCJzdGFydCBmZWVkaW5nXG4iKTsKLQkJaWYgKGFkYXAtPnByb3BzLnN0cmVhbWluZ19jdHJsICE9IE5VTEwpIHsKLQkJCXJldCA9IGFkYXAtPnByb3BzLnN0cmVhbWluZ19jdHJsKGFkYXAsIDEpOworCQlpZiAoYWRhcC0+cHJvcHMuZmVbYWRhcC0+YWN0aXZlX2ZlXS5zdHJlYW1pbmdfY3RybCAhPSBOVUxMKSB7CisJCQlyZXQgPSBhZGFwLT5wcm9wcy5mZVthZGFwLT5hY3RpdmVfZmVdLnN0cmVhbWluZ19jdHJsKGFkYXAsIDEpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQllcnIoImVycm9yIHdoaWxlIGVuYWJsaW5nIGZpZm8uIik7CiAJCQkJcmV0dXJuIHJldDsKQEAgLTkwLDYgKzk2LDcgQEAKIAogaW50IGR2Yl91c2JfYWRhcHRlcl9kdmJfaW5pdChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBzaG9ydCAqYWRhcHRlcl9udW1zKQogeworCWludCBpOwogCWludCByZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmYWRhcC0+ZHZiX2FkYXAsIGFkYXAtPmRldi0+ZGVzYy0+bmFtZSwKIAkJCQkgICAgICAgYWRhcC0+ZGV2LT5vd25lciwgJmFkYXAtPmRldi0+dWRldi0+ZGV2LAogCQkJCSAgICAgICBhZGFwdGVyX251bXMpOwpAQCAtMTEyLDcgKzExOSwxMiBAQAogCWFkYXAtPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPSBETVhfVFNfRklMVEVSSU5HIHwgRE1YX1NFQ1RJT05fRklMVEVSSU5HOwogCWFkYXAtPmRlbXV4LnByaXYgICAgICAgICAgICAgPSBhZGFwOwogCi0JYWRhcC0+ZGVtdXguZmVlZG51bSAgICAgICAgICA9IGFkYXAtPmRlbXV4LmZpbHRlcm51bSA9IGFkYXAtPm1heF9mZWVkX2NvdW50OworCWFkYXAtPmRlbXV4LmZpbHRlcm51bSAgICAgICAgPSAwOworCWZvciAoaSA9IDA7IGkgPCBhZGFwLT5wcm9wcy5udW1fZnJvbnRlbmRzOyBpKyspIHsKKwkJaWYgKGFkYXAtPmRlbXV4LmZpbHRlcm51bSA8IGFkYXAtPmZlX2FkYXBbaV0ubWF4X2ZlZWRfY291bnQpCisJCQlhZGFwLT5kZW11eC5maWx0ZXJudW0gPSBhZGFwLT5mZV9hZGFwW2ldLm1heF9mZWVkX2NvdW50OworCX0KKwlhZGFwLT5kZW11eC5mZWVkbnVtICAgICAgICAgID0gYWRhcC0+ZGVtdXguZmlsdGVybnVtOwogCWFkYXAtPmRlbXV4LnN0YXJ0X2ZlZWQgICAgICAgPSBkdmJfdXNiX3N0YXJ0X2ZlZWQ7CiAJYWRhcC0+ZGVtdXguc3RvcF9mZWVkICAgICAgICA9IGR2Yl91c2Jfc3RvcF9mZWVkOwogCWFkYXAtPmRlbXV4LndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOwpAQCAtMTU2LDE0ICsxNjgsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkdmJfdXNiX3NldF9hY3RpdmVfZmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBvbm9mZikKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKworCWludCByZXQgPSAoYWRhcC0+cHJvcHMuZnJvbnRlbmRfY3RybCkgPworCQlhZGFwLT5wcm9wcy5mcm9udGVuZF9jdHJsKGZlLCBvbm9mZikgOiAwOworCisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJmcm9udGVuZF9jdHJsIHJlcXVlc3QgZmFpbGVkIik7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChvbm9mZikKKwkJYWRhcC0+YWN0aXZlX2ZlID0gZmUtPmlkOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZHZiX3VzYl9mZV93YWtldXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCA9IGZlLT5kdmItPnByaXY7CiAKIAlkdmJfdXNiX2RldmljZV9wb3dlcl9jdHJsKGFkYXAtPmRldiwgMSk7CiAKLQlpZiAoYWRhcC0+ZmVfaW5pdCkKLQkJYWRhcC0+ZmVfaW5pdChmZSk7CisJZHZiX3VzYl9zZXRfYWN0aXZlX2ZlKGZlLCAxKTsKKworCWlmIChhZGFwLT5mZV9hZGFwW2ZlLT5pZF0uZmVfaW5pdCkKKwkJYWRhcC0+ZmVfYWRhcFtmZS0+aWRdLmZlX2luaXQoZmUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzIsNDUgKzIwMyw4MSBAQAogewogCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAgPSBmZS0+ZHZiLT5wcml2OwogCi0JaWYgKGFkYXAtPmZlX3NsZWVwKQotCQlhZGFwLT5mZV9zbGVlcChmZSk7CisJaWYgKGFkYXAtPmZlX2FkYXBbZmUtPmlkXS5mZV9zbGVlcCkKKwkJYWRhcC0+ZmVfYWRhcFtmZS0+aWRdLmZlX3NsZWVwKGZlKTsKKworCWR2Yl91c2Jfc2V0X2FjdGl2ZV9mZShmZSwgMCk7CiAKIAlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfcG93ZXJfY3RybChhZGFwLT5kZXYsIDApOwogfQogCiBpbnQgZHZiX3VzYl9hZGFwdGVyX2Zyb250ZW5kX2luaXQoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlpZiAoYWRhcC0+cHJvcHMuZnJvbnRlbmRfYXR0YWNoID09IE5VTEwpIHsKLQkJZXJyKCJzdHJhbmdlOiAnJXMnICMlZCBkb2Vzbid0IHdhbnQgdG8gYXR0YWNoIGEgZnJvbnRlbmQuIixhZGFwLT5kZXYtPmRlc2MtPm5hbWUsIGFkYXAtPmlkKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWludCByZXQsIGk7CiAKLQkvKiByZS1hc3NpZ24gc2xlZXAgYW5kIHdha2V1cCBmdW5jdGlvbnMgKi8KLQlpZiAoYWRhcC0+cHJvcHMuZnJvbnRlbmRfYXR0YWNoKGFkYXApID09IDAgJiYgYWRhcC0+ZmUgIT0gTlVMTCkgewotCQlhZGFwLT5mZV9pbml0ICA9IGFkYXAtPmZlLT5vcHMuaW5pdDsgIGFkYXAtPmZlLT5vcHMuaW5pdCAgPSBkdmJfdXNiX2ZlX3dha2V1cDsKLQkJYWRhcC0+ZmVfc2xlZXAgPSBhZGFwLT5mZS0+b3BzLnNsZWVwOyBhZGFwLT5mZS0+b3BzLnNsZWVwID0gZHZiX3VzYl9mZV9zbGVlcDsKKwkvKiByZWdpc3RlciBhbGwgZ2l2ZW4gYWRhcHRlciBmcm9udGVuZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+cHJvcHMubnVtX2Zyb250ZW5kczsgaSsrKSB7CiAKLQkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmYWRhcC0+ZHZiX2FkYXAsIGFkYXAtPmZlKSkgewotCQkJZXJyKCJGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkLiIpOwotCQkJZHZiX2Zyb250ZW5kX2RldGFjaChhZGFwLT5mZSk7Ci0JCQlhZGFwLT5mZSA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKGFkYXAtPnByb3BzLmZlW2ldLmZyb250ZW5kX2F0dGFjaCA9PSBOVUxMKSB7CisJCQllcnIoInN0cmFuZ2U6ICclcycgIyVkLCVkICIKKwkJCSAgICAiZG9lc24ndCB3YW50IHRvIGF0dGFjaCBhIGZyb250ZW5kLiIsCisJCQkgICAgYWRhcC0+ZGV2LT5kZXNjLT5uYW1lLCBhZGFwLT5pZCwgaSk7CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0ID0gYWRhcC0+cHJvcHMuZmVbaV0uZnJvbnRlbmRfYXR0YWNoKGFkYXApOworCQlpZiAocmV0IHx8IGFkYXAtPmZlX2FkYXBbaV0uZmUgPT0gTlVMTCkgeworCQkJLyogb25seSBwcmludCBlcnJvciB3aGVuIHRoZXJlIGlzIG5vIEZFIGF0IGFsbCAqLworCQkJaWYgKGkgPT0gMCkKKwkJCQllcnIoIm5vIGZyb250ZW5kIHdhcyBhdHRhY2hlZCBieSAnJXMnIiwKKwkJCQkJYWRhcC0+ZGV2LT5kZXNjLT5uYW1lKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKworCQlhZGFwLT5mZV9hZGFwW2ldLmZlLT5pZCA9IGk7CisKKwkJLyogcmUtYXNzaWduIHNsZWVwIGFuZCB3YWtldXAgZnVuY3Rpb25zICovCisJCWFkYXAtPmZlX2FkYXBbaV0uZmVfaW5pdCA9IGFkYXAtPmZlX2FkYXBbaV0uZmUtPm9wcy5pbml0OworCQlhZGFwLT5mZV9hZGFwW2ldLmZlLT5vcHMuaW5pdCAgPSBkdmJfdXNiX2ZlX3dha2V1cDsKKwkJYWRhcC0+ZmVfYWRhcFtpXS5mZV9zbGVlcCA9IGFkYXAtPmZlX2FkYXBbaV0uZmUtPm9wcy5zbGVlcDsKKwkJYWRhcC0+ZmVfYWRhcFtpXS5mZS0+b3BzLnNsZWVwID0gZHZiX3VzYl9mZV9zbGVlcDsKKworCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZhZGFwLT5kdmJfYWRhcCwgYWRhcC0+ZmVfYWRhcFtpXS5mZSkpIHsKKwkJCWVycigiRnJvbnRlbmQgJWQgcmVnaXN0cmF0aW9uIGZhaWxlZC4iLCBpKTsKKwkJCWR2Yl9mcm9udGVuZF9kZXRhY2goYWRhcC0+ZmVfYWRhcFtpXS5mZSk7CisJCQlhZGFwLT5mZV9hZGFwW2ldLmZlID0gTlVMTDsKKwkJCS8qIEluIGVycm9yIGNhc2UsIGRvIG5vdCB0cnkgcmVnaXN0ZXIgbW9yZSBGRXMsCisJCQkgKiBzdGlsbCBsZWF2aW5nIGFscmVhZHkgcmVnaXN0ZXJlZCBGRXMgYWxpdmUuICovCisJCQlpZiAoaSA9PSAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJZWxzZQorCQkJCXJldHVybiAwOwogCQl9CiAKIAkJLyogb25seSBhdHRhY2ggdGhlIHR1bmVyIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwotCQlpZiAoYWRhcC0+cHJvcHMudHVuZXJfYXR0YWNoICE9IE5VTEwpCi0JCQlhZGFwLT5wcm9wcy50dW5lcl9hdHRhY2goYWRhcCk7Ci0JfSBlbHNlCi0JCWVycigibm8gZnJvbnRlbmQgd2FzIGF0dGFjaGVkIGJ5ICclcyciLGFkYXAtPmRldi0+ZGVzYy0+bmFtZSk7CisJCWlmIChhZGFwLT5wcm9wcy5mZVtpXS50dW5lcl9hdHRhY2ggIT0gTlVMTCkKKwkJCWFkYXAtPnByb3BzLmZlW2ldLnR1bmVyX2F0dGFjaChhZGFwKTsKKworCQlhZGFwLT5udW1fZnJvbnRlbmRzX2luaXRpYWxpemVkKys7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBkdmJfdXNiX2FkYXB0ZXJfZnJvbnRlbmRfZXhpdChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWlmIChhZGFwLT5mZSAhPSBOVUxMKSB7Ci0JCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGFkYXAtPmZlKTsKLQkJZHZiX2Zyb250ZW5kX2RldGFjaChhZGFwLT5mZSk7CisJaW50IGkgPSBhZGFwLT5udW1fZnJvbnRlbmRzX2luaXRpYWxpemVkIC0gMTsKKworCS8qIHVucmVnaXN0ZXIgYWxsIGdpdmVuIGFkYXB0ZXIgZnJvbnRlbmRzICovCisJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChhZGFwLT5mZV9hZGFwW2ldLmZlICE9IE5VTEwpIHsKKwkJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGFkYXAtPmZlX2FkYXBbaV0uZmUpOworCQkJZHZiX2Zyb250ZW5kX2RldGFjaChhZGFwLT5mZV9hZGFwW2ldLmZlKTsKKwkJfQogCX0KKwlhZGFwLT5udW1fZnJvbnRlbmRzX2luaXRpYWxpemVkID0gMDsKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCmluZGV4IDJhNzliOGYuLjJkMDhjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKQEAgLTM3LDYgKzM3LDcgQEAKICNkZWZpbmUgVVNCX1ZJRF9IQVVQUEFVR0UJCQkweDIwNDAKICNkZWZpbmUgVVNCX1ZJRF9IWVBFUl9QQUxURUsJCQkweDEwMjUKICNkZWZpbmUgVVNCX1ZJRF9JTlRFTAkJCQkweDgwODYKKyNkZWZpbmUgVVNCX1ZJRF9JVEVURUNICQkJCTB4MDQ4ZAogI2RlZmluZSBVU0JfVklEX0tXT1JMRAkJCQkweGViMmEKICNkZWZpbmUgVVNCX1ZJRF9LV09STERfMgkJCTB4MWI4MAogI2RlZmluZSBVU0JfVklEX0tZRQkJCQkweDA0NTgKQEAgLTEyNiw2ICsxMjcsNyBAQAogI2RlZmluZSBVU0JfUElEX0dSQU5EVEVDX0RWQlRfVVNCX0NPTEQJCQkweDBmYTAKICNkZWZpbmUgVVNCX1BJRF9HUkFORFRFQ19EVkJUX1VTQl9XQVJNCQkJMHgwZmExCiAjZGVmaW5lIFVTQl9QSURfSU5URUxfQ0U5NTAwCQkJCTB4OTUwMAorI2RlZmluZSBVU0JfUElEX0lURVRFQ0hfSVQ5MTM1CQkJCTB4OTEzNQogI2RlZmluZSBVU0JfUElEX0tXT1JMRF8zOTlVCQkJCTB4ZTM5OQogI2RlZmluZSBVU0JfUElEX0tXT1JMRF8zOTlVXzIJCQkJMHhlNDAwCiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEXzM5NVUJCQkJMHhlMzk2CkBAIC0xMzYsNiArMTM4LDcgQEAKICNkZWZpbmUgVVNCX1BJRF9LV09STERfUEMxNjBfMlQJCQkJMHhjMTYwCiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1BDMTYwX1QJCQkJMHhjMTYxCiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1VCMzgzX1QJCQkJMHhlMzgzCisjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1VCNDk5XzJUX1QwOQkJCTB4ZTQwOQogI2RlZmluZSBVU0JfUElEX0tXT1JMRF9WU1RSRUFNX0NPTEQJCQkweDE3ZGUKICNkZWZpbmUgVVNCX1BJRF9LV09STERfVlNUUkVBTV9XQVJNCQkJMHgxN2RmCiAjZGVmaW5lIFVTQl9QSURfVEVSUkFURUNfQ0lORVJHWV9UX1VTQl9YRQkJMHgwMDU1CkBAIC0yNDAsNiArMjQzLDkgQEAKICNkZWZpbmUgVVNCX1BJRF9QQ1RWXzIwMEUJCQkJMHgwMjBlCiAjZGVmaW5lIFVTQl9QSURfUENUVl80MDBFCQkJCTB4MDIwZgogI2RlZmluZSBVU0JfUElEX1BDVFZfNDUwRQkJCQkweDAyMjIKKyNkZWZpbmUgVVNCX1BJRF9QQ1RWXzQ1MkUJCQkJMHgwMjFmCisjZGVmaW5lIFVTQl9QSURfVEVDSE5PVFJFTkRfQ09OTkVDVF9TMl8zNjAwCQkweDMwMDcKKyNkZWZpbmUgVVNCX1BJRF9URUNITk9UUkVORF9DT05ORUNUX1MyXzM2NTBfQ0kJCTB4MzAwYQogI2RlZmluZSBVU0JfUElEX05FQlVMQV9ESUdJVFYJCQkJMHgwMjAxCiAjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEdEVAkJCTB4ZDgyMAogI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHMDY0Rl9DT0xECQkweGQ1MDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaW5pdC5jCmluZGV4IDJlM2VhMGYuLjE2OTE5NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYwpAQCAtMjksNyArMjksNyBAQAogc3RhdGljIGludCBkdmJfdXNiX2FkYXB0ZXJfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHNob3J0ICphZGFwdGVyX25ycykKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwOwotCWludCByZXQsIG47CisJaW50IHJldCwgbiwgbzsKIAogCWZvciAobiA9IDA7IG4gPCBkLT5wcm9wcy5udW1fYWRhcHRlcnM7IG4rKykgewogCQlhZGFwID0gJmQtPmFkYXB0ZXJbbl07CkBAIC0zOCwzMSArMzgsNDIgQEAKIAogCQltZW1jcHkoJmFkYXAtPnByb3BzLCAmZC0+cHJvcHMuYWRhcHRlcltuXSwgc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXJfcHJvcGVydGllcykpOwogCisJZm9yIChvID0gMDsgbyA8IGFkYXAtPnByb3BzLm51bV9mcm9udGVuZHM7IG8rKykgeworCQlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyX2ZlX3Byb3BlcnRpZXMgKnByb3BzID0gJmFkYXAtPnByb3BzLmZlW29dOwogCQkvKiBzcGVlZCAtIHdoZW4gcnVubmluZyBhdCBGVUxMIHNwZWVkIHdlIG5lZWQgYSBIVyBQSUQgZmlsdGVyICovCi0JCWlmIChkLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiAhKGFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIpKSB7CisJCWlmIChkLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiAhKHByb3BzLT5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSKSkgewogCQkJZXJyKCJUaGlzIFVTQjIuMCBkZXZpY2UgY2Fubm90IGJlIHJ1biBvbiBhIFVTQjEuMSBwb3J0LiAoaXQgbGFja3MgYSBoYXJkd2FyZSBQSUQgZmlsdGVyKSIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAotCQlpZiAoKGQtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMICYmIGFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIpIHx8Ci0JCQkoYWRhcC0+cHJvcHMuY2FwcyAmIERWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkcpKSB7Ci0JCQlpbmZvKCJ3aWxsIHVzZSB0aGUgZGV2aWNlJ3MgaGFyZHdhcmUgUElEIGZpbHRlciAodGFibGUgY291bnQ6ICVkKS4iLCBhZGFwLT5wcm9wcy5waWRfZmlsdGVyX2NvdW50KTsKLQkJCWFkYXAtPnBpZF9maWx0ZXJpbmcgID0gMTsKLQkJCWFkYXAtPm1heF9mZWVkX2NvdW50ID0gYWRhcC0+cHJvcHMucGlkX2ZpbHRlcl9jb3VudDsKKwkJaWYgKChkLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiBwcm9wcy0+Y2FwcyAmIERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUikgfHwKKwkJCShwcm9wcy0+Y2FwcyAmIERWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkcpKSB7CisJCQlpbmZvKCJ3aWxsIHVzZSB0aGUgZGV2aWNlJ3MgaGFyZHdhcmUgUElEIGZpbHRlciAodGFibGUgY291bnQ6ICVkKS4iLCBwcm9wcy0+cGlkX2ZpbHRlcl9jb3VudCk7CisJCQlhZGFwLT5mZV9hZGFwW29dLnBpZF9maWx0ZXJpbmcgID0gMTsKKwkJCWFkYXAtPmZlX2FkYXBbb10ubWF4X2ZlZWRfY291bnQgPSBwcm9wcy0+cGlkX2ZpbHRlcl9jb3VudDsKIAkJfSBlbHNlIHsKIAkJCWluZm8oIndpbGwgcGFzcyB0aGUgY29tcGxldGUgTVBFRzIgdHJhbnNwb3J0IHN0cmVhbSB0byB0aGUgc29mdHdhcmUgZGVtdXhlci4iKTsKLQkJCWFkYXAtPnBpZF9maWx0ZXJpbmcgID0gMDsKLQkJCWFkYXAtPm1heF9mZWVkX2NvdW50ID0gMjU1OworCQkJYWRhcC0+ZmVfYWRhcFtvXS5waWRfZmlsdGVyaW5nICA9IDA7CisJCQlhZGFwLT5mZV9hZGFwW29dLm1heF9mZWVkX2NvdW50ID0gMjU1OwogCQl9CiAKLQkJaWYgKCFhZGFwLT5waWRfZmlsdGVyaW5nICYmCisJCWlmICghYWRhcC0+ZmVfYWRhcFtvXS5waWRfZmlsdGVyaW5nICYmCiAJCQlkdmJfdXNiX2ZvcmNlX3BpZF9maWx0ZXJfdXNhZ2UgJiYKLQkJCWFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIpIHsKKwkJCXByb3BzLT5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSKSB7CiAJCQlpbmZvKCJwaWQgZmlsdGVyIGVuYWJsZWQgYnkgbW9kdWxlIG9wdGlvbi4iKTsKLQkJCWFkYXAtPnBpZF9maWx0ZXJpbmcgID0gMTsKLQkJCWFkYXAtPm1heF9mZWVkX2NvdW50ID0gYWRhcC0+cHJvcHMucGlkX2ZpbHRlcl9jb3VudDsKKwkJCWFkYXAtPmZlX2FkYXBbb10ucGlkX2ZpbHRlcmluZyAgPSAxOworCQkJYWRhcC0+ZmVfYWRhcFtvXS5tYXhfZmVlZF9jb3VudCA9IHByb3BzLT5waWRfZmlsdGVyX2NvdW50OwogCQl9CiAKKwkJaWYgKHByb3BzLT5zaXplX29mX3ByaXYgPiAwKSB7CisJCQlhZGFwLT5mZV9hZGFwW29dLnByaXYgPSBremFsbG9jKHByb3BzLT5zaXplX29mX3ByaXYsIEdGUF9LRVJORUwpOworCQkJaWYgKGFkYXAtPmZlX2FkYXBbb10ucHJpdiA9PSBOVUxMKSB7CisJCQkJZXJyKCJubyBtZW1vcnkgZm9yIHByaXYgZm9yIGFkYXB0ZXIgJWQgZmUgJWQuIiwgbiwgbyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKwl9CisKIAkJaWYgKGFkYXAtPnByb3BzLnNpemVfb2ZfcHJpdiA+IDApIHsKIAkJCWFkYXAtPnByaXYgPSBremFsbG9jKGFkYXAtPnByb3BzLnNpemVfb2ZfcHJpdiwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoYWRhcC0+cHJpdiA9PSBOVUxMKSB7CkBAIC03Nyw2ICs4OCwxMCBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCisJCS8qIHVzZSBleGNsdXNpdmUgRkUgbG9jayBpZiB0aGVyZSBpcyBtdWx0aXBsZSBzaGFyZWQgRkVzICovCisJCWlmIChhZGFwLT5mZV9hZGFwWzFdLmZlKQorCQkJYWRhcC0+ZHZiX2FkYXAubWZlX3NoYXJlZCA9IDE7CisKIAkJZC0+bnVtX2FkYXB0ZXJzX2luaXRpYWxpemVkKys7CiAJCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfRFZCOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYwppbmRleCBiYjQ2YmE2Li41M2E1YzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItdXJiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXVyYi5jCkBAIC04MiwxNiArODIsMjggQEAKIAogaW50IGR2Yl91c2JfYWRhcHRlcl9zdHJlYW1faW5pdChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWFkYXAtPnN0cmVhbS51ZGV2ICAgICAgPSBhZGFwLT5kZXYtPnVkZXY7Ci0JaWYgKGFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfUkVDRUlWRVNfMjA0X0JZVEVfVFMpCi0JCWFkYXAtPnN0cmVhbS5jb21wbGV0ZSA9IGR2Yl91c2JfZGF0YV9jb21wbGV0ZV8yMDQ7Ci0JZWxzZQotCWFkYXAtPnN0cmVhbS5jb21wbGV0ZSAgPSBkdmJfdXNiX2RhdGFfY29tcGxldGU7Ci0JYWRhcC0+c3RyZWFtLnVzZXJfcHJpdiA9IGFkYXA7Ci0JcmV0dXJuIHVzYl91cmJfaW5pdCgmYWRhcC0+c3RyZWFtLCAmYWRhcC0+cHJvcHMuc3RyZWFtKTsKKwlpbnQgaSwgcmV0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+cHJvcHMubnVtX2Zyb250ZW5kczsgaSsrKSB7CisKKwkJYWRhcC0+ZmVfYWRhcFtpXS5zdHJlYW0udWRldiAgICAgID0gYWRhcC0+ZGV2LT51ZGV2OworCQlpZiAoYWRhcC0+cHJvcHMuZmVbaV0uY2FwcyAmIERWQl9VU0JfQURBUF9SRUNFSVZFU18yMDRfQllURV9UUykKKwkJCWFkYXAtPmZlX2FkYXBbaV0uc3RyZWFtLmNvbXBsZXRlID0KKwkJCQlkdmJfdXNiX2RhdGFfY29tcGxldGVfMjA0OworCQllbHNlCisJCWFkYXAtPmZlX2FkYXBbaV0uc3RyZWFtLmNvbXBsZXRlICA9IGR2Yl91c2JfZGF0YV9jb21wbGV0ZTsKKwkJYWRhcC0+ZmVfYWRhcFtpXS5zdHJlYW0udXNlcl9wcml2ID0gYWRhcDsKKwkJcmV0ID0gdXNiX3VyYl9pbml0KCZhZGFwLT5mZV9hZGFwW2ldLnN0cmVhbSwKKwkJCQkgICAmYWRhcC0+cHJvcHMuZmVbaV0uc3RyZWFtKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGR2Yl91c2JfYWRhcHRlcl9zdHJlYW1fZXhpdChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCXJldHVybiB1c2JfdXJiX2V4aXQoJmFkYXAtPnN0cmVhbSk7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGFkYXAtPnByb3BzLm51bV9mcm9udGVuZHM7IGkrKykKKwkJdXNiX3VyYl9leGl0KCZhZGFwLT5mZV9hZGFwW2ldLnN0cmVhbSk7CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IDdkMzVkMDcuLjZkN2QxM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCkBAIC0xMjQsNiArMTI0LDggQEAKICAqIEBjYXBzOiBjYXBhYmlsaXRpZXMgb2YgdGhlIERWQiBVU0IgZGV2aWNlLgogICogQHBpZF9maWx0ZXJfY291bnQ6IG51bWJlciBvZiBQSUQgZmlsdGVyIHBvc2l0aW9uIGluIHRoZSBvcHRpb25hbCBoYXJkd2FyZQogICogIFBJRC1maWx0ZXIuCisgKiBAbnVtX2Zyb250ZW5kczogbnVtYmVyIG9mIGZyb250ZW5kcyBvZiB0aGUgRFZCIFVTQiBhZGFwdGVyLgorICogQGZyb250ZW5kX2N0cmw6IGNhbGxlZCB0byBwb3dlciBvbi9vZmYgYWN0aXZlIGZyb250ZW5kLgogICogQHN0cmVhbWluZ19jdHJsOiBjYWxsZWQgdG8gc3RhcnQgYW5kIHN0b3AgdGhlIE1QRUcyLVRTIHN0cmVhbWluZyBvZiB0aGUKICAqICBkZXZpY2UgKG5vdCBVUkIgc3VibWl0dGluZy9raWxsaW5nKS4KICAqIEBwaWRfZmlsdGVyX2N0cmw6IGNhbGxlZCB0byBlbi9kaXNhYmxlIHRoZSBQSUQgZmlsdGVyLCBpZiBhbnkuCkBAIC0xMzQsNyArMTM2LDcgQEAKICAqICBwbGxfZGVzYyBhbmQgcGxsX2luaXRfYnVmIG9mIHN0cnVjdCBkdmJfdXNiX2RldmljZSkuCiAgKiBAc3RyZWFtOiBjb25maWd1cmF0aW9uIG9mIHRoZSBVU0Igc3RyZWFtaW5nCiAgKi8KLXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXJfcHJvcGVydGllcyB7CitzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyX2ZlX3Byb3BlcnRpZXMgewogI2RlZmluZSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgICAgICAgICAgICAgICAweDAxCiAjZGVmaW5lIERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGIDB4MDIKICNkZWZpbmUgRFZCX1VTQl9BREFQX05FRURfUElEX0ZJTFRFUklORyAgICAgICAgICAgMHgwNApAQCAtMTUyLDkgKzE1NCwxOCBAQAogCXN0cnVjdCB1c2JfZGF0YV9zdHJlYW1fcHJvcGVydGllcyBzdHJlYW07CiAKIAlpbnQgc2l6ZV9vZl9wcml2OworfTsKIAorI2RlZmluZSBNQVhfTk9fT0ZfRkVfUEVSX0FEQVAgMgorc3RydWN0IGR2Yl91c2JfYWRhcHRlcl9wcm9wZXJ0aWVzIHsKKwlpbnQgc2l6ZV9vZl9wcml2OworCisJaW50ICgqZnJvbnRlbmRfY3RybCkgICAoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBpbnQpOwogCWludCAoKmZlX2lvY3RsX292ZXJyaWRlKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqLAogCQkJCSAgdW5zaWduZWQgaW50LCB2b2lkICosIHVuc2lnbmVkIGludCk7CisKKwlpbnQgbnVtX2Zyb250ZW5kczsKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyX2ZlX3Byb3BlcnRpZXMgZmVbTUFYX05PX09GX0ZFX1BFUl9BREFQXTsKIH07CiAKIC8qKgpAQCAtMzQ1LDYgKzM1NiwyMCBAQAogICoKICAqIEBzdHJlYW06IHRoZSB1c2IgZGF0YSBzdHJlYW0uCiAgKi8KK3N0cnVjdCBkdmJfdXNiX2ZlX2FkYXB0ZXIgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCisJaW50ICgqZmVfaW5pdCkgIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOworCWludCAoKmZlX3NsZWVwKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqKTsKKworCXN0cnVjdCB1c2JfZGF0YV9zdHJlYW0gc3RyZWFtOworCisJaW50IHBpZF9maWx0ZXJpbmc7CisJaW50IG1heF9mZWVkX2NvdW50OworCisJdm9pZCAqcHJpdjsKK307CisKIHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZGV2OwogCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXJfcHJvcGVydGllcyBwcm9wczsKQEAgLTM1NiwyMCArMzgxLDE2IEBACiAJdTggIGlkOwogCiAJaW50IGZlZWRjb3VudDsKLQlpbnQgcGlkX2ZpbHRlcmluZzsKIAogCS8qIGR2YiAqLwogCXN0cnVjdCBkdmJfYWRhcHRlciAgIGR2Yl9hZGFwOwogCXN0cnVjdCBkbXhkZXYgICAgICAgIGRteGRldjsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICAgICBkZW11eDsKIAlzdHJ1Y3QgZHZiX25ldCAgICAgICBkdmJfbmV0OwotCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOwotCWludCAgICAgICAgICAgICAgICAgIG1heF9mZWVkX2NvdW50OwogCi0JaW50ICgqZmVfaW5pdCkgIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOwotCWludCAoKmZlX3NsZWVwKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqKTsKLQotCXN0cnVjdCB1c2JfZGF0YV9zdHJlYW0gc3RyZWFtOworCXN0cnVjdCBkdmJfdXNiX2ZlX2FkYXB0ZXIgZmVfYWRhcFtNQVhfTk9fT0ZfRkVfUEVSX0FEQVBdOworCWludCBhY3RpdmVfZmU7CisJaW50IG51bV9mcm9udGVuZHNfaW5pdGlhbGl6ZWQ7CiAKIAl2b2lkICpwcml2OwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHcyMTAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R3MjEwMi5jCmluZGV4IDA1OGIyMzEuLmYxMDNlYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHcyMTAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdzIxMDIuYwpAQCAtOTkyLDE4ICs5OTIsMTggQEAKIAlzdHJ1Y3QgZHZiX3R1bmVyX29wcyAqdHVuZXJfb3BzID0gTlVMTDsKIAogCWlmIChkZW1vZF9wcm9iZSAmIDQpIHsKLQkJZC0+ZmUgPSBkdmJfYXR0YWNoKHN0djA5MDBfYXR0YWNoLCAmZHcyMTA0YV9zdHYwOTAwX2NvbmZpZywKKwkJZC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3R2MDkwMF9hdHRhY2gsICZkdzIxMDRhX3N0djA5MDBfY29uZmlnLAogCQkJCSZkLT5kZXYtPmkyY19hZGFwLCAwKTsKLQkJaWYgKGQtPmZlICE9IE5VTEwpIHsKLQkJCWlmIChkdmJfYXR0YWNoKHN0YjYxMDBfYXR0YWNoLCBkLT5mZSwKKwkJaWYgKGQtPmZlX2FkYXBbMF0uZmUgIT0gTlVMTCkgeworCQkJaWYgKGR2Yl9hdHRhY2goc3RiNjEwMF9hdHRhY2gsIGQtPmZlX2FkYXBbMF0uZmUsCiAJCQkJCSZkdzIxMDRhX3N0YjYxMDBfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCkpIHsKLQkJCQl0dW5lcl9vcHMgPSAmZC0+ZmUtPm9wcy50dW5lcl9vcHM7CisJCQkJdHVuZXJfb3BzID0gJmQtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHM7CiAJCQkJdHVuZXJfb3BzLT5zZXRfZnJlcXVlbmN5ID0gc3RiNjEwMF9zZXRfZnJlcTsKIAkJCQl0dW5lcl9vcHMtPmdldF9mcmVxdWVuY3kgPSBzdGI2MTAwX2dldF9mcmVxOwogCQkJCXR1bmVyX29wcy0+c2V0X2JhbmR3aWR0aCA9IHN0YjYxMDBfc2V0X2JhbmR3OwogCQkJCXR1bmVyX29wcy0+Z2V0X2JhbmR3aWR0aCA9IHN0YjYxMDBfZ2V0X2JhbmR3OwotCQkJCWQtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMHhfc2V0X3ZvbHRhZ2U7CisJCQkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQkJCWluZm8oIkF0dGFjaGVkIFNUVjA5MDArU1RCNjEwMCFcbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQpAQCAtMTAxMSwxMyArMTAxMSwxMyBAQAogCX0KIAogCWlmIChkZW1vZF9wcm9iZSAmIDIpIHsKLQkJZC0+ZmUgPSBkdmJfYXR0YWNoKHN0djA5MDBfYXR0YWNoLCAmZHcyMTA0X3N0djA5MDBfY29uZmlnLAorCQlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChzdHYwOTAwX2F0dGFjaCwgJmR3MjEwNF9zdHYwOTAwX2NvbmZpZywKIAkJCQkmZC0+ZGV2LT5pMmNfYWRhcCwgMCk7Ci0JCWlmIChkLT5mZSAhPSBOVUxMKSB7Ci0JCQlpZiAoZHZiX2F0dGFjaChzdHY2MTEwX2F0dGFjaCwgZC0+ZmUsCisJCWlmIChkLT5mZV9hZGFwWzBdLmZlICE9IE5VTEwpIHsKKwkJCWlmIChkdmJfYXR0YWNoKHN0djYxMTBfYXR0YWNoLCBkLT5mZV9hZGFwWzBdLmZlLAogCQkJCQkmZHcyMTA0X3N0djYxMTBfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCkpIHsKLQkJCQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCQkJCWQtPmZlX2FkYXBbMF0uZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKIAkJCQlpbmZvKCJBdHRhY2hlZCBTVFYwOTAwK1NUVjYxMTBBIVxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CkBAIC0xMDI1LDE5ICsxMDI1LDE5IEBACiAJfQogCiAJaWYgKGRlbW9kX3Byb2JlICYgMSkgewotCQlkLT5mZSA9IGR2Yl9hdHRhY2goY3gyNDExNl9hdHRhY2gsICZkdzIxMDRfY29uZmlnLAorCQlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChjeDI0MTE2X2F0dGFjaCwgJmR3MjEwNF9jb25maWcsCiAJCQkJJmQtPmRldi0+aTJjX2FkYXApOwotCQlpZiAoZC0+ZmUgIT0gTlVMTCkgewotCQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKKwkJaWYgKGQtPmZlX2FkYXBbMF0uZmUgIT0gTlVMTCkgeworCQkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQkJaW5mbygiQXR0YWNoZWQgY3gyNDExNiFcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKLQlkLT5mZSA9IGR2Yl9hdHRhY2goZHMzMDAwX2F0dGFjaCwgJmR3MjEwNF9kczMwMDBfY29uZmlnLAorCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRzMzAwMF9hdHRhY2gsICZkdzIxMDRfZHMzMDAwX2NvbmZpZywKIAkJCSZkLT5kZXYtPmkyY19hZGFwKTsKLQlpZiAoZC0+ZmUgIT0gTlVMTCkgewotCQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCWlmIChkLT5mZV9hZGFwWzBdLmZlICE9IE5VTEwpIHsKKwkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQlpbmZvKCJBdHRhY2hlZCBEUzMwMDAhXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTA1MywyMiArMTA1MywyMiBAQAogewogCWlmIChkdzIxMDJfcHJvcGVydGllcy5pMmNfYWxnbyA9PSAmZHcyMTAyX3Nlcml0X2kyY19hbGdvKSB7CiAJCS8qZHcyMTAyX3Byb3BlcnRpZXMuYWRhcHRlci0+dHVuZXJfYXR0YWNoID0gTlVMTDsqLwotCQlkLT5mZSA9IGR2Yl9hdHRhY2goc2kyMXh4X2F0dGFjaCwgJnNlcml0X3NwMTUxMWxoYl9jb25maWcsCisJCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHNpMjF4eF9hdHRhY2gsICZzZXJpdF9zcDE1MTFsaGJfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkLT5mZSAhPSBOVUxMKSB7Ci0JCQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCQlpZiAoZC0+ZmVfYWRhcFswXS5mZSAhPSBOVUxMKSB7CisJCQlkLT5mZV9hZGFwWzBdLmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMHhfc2V0X3ZvbHRhZ2U7CiAJCQlpbmZvKCJBdHRhY2hlZCBzaTIxeHghXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCiAJaWYgKGR3MjEwMl9wcm9wZXJ0aWVzLmkyY19hbGdvID09ICZkdzIxMDJfZWFyZGFfaTJjX2FsZ28pIHsKLQkJZC0+ZmUgPSBkdmJfYXR0YWNoKHN0djAyODhfYXR0YWNoLCAmZWFyZGFfY29uZmlnLAorCQlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChzdHYwMjg4X2F0dGFjaCwgJmVhcmRhX2NvbmZpZywKIAkJCQkJJmQtPmRldi0+aTJjX2FkYXApOwotCQlpZiAoZC0+ZmUgIT0gTlVMTCkgewotCQkJaWYgKGR2Yl9hdHRhY2goc3RiNjAwMF9hdHRhY2gsIGQtPmZlLCAweDYxLAorCQlpZiAoZC0+ZmVfYWRhcFswXS5mZSAhPSBOVUxMKSB7CisJCQlpZiAoZHZiX2F0dGFjaChzdGI2MDAwX2F0dGFjaCwgZC0+ZmVfYWRhcFswXS5mZSwgMHg2MSwKIAkJCQkJJmQtPmRldi0+aTJjX2FkYXApKSB7Ci0JCQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKKwkJCQlkLT5mZV9hZGFwWzBdLmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMHhfc2V0X3ZvbHRhZ2U7CiAJCQkJaW5mbygiQXR0YWNoZWQgc3R2MDI4OCFcbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQpAQCAtMTA3NywxMCArMTA3NywxMCBAQAogCiAJaWYgKGR3MjEwMl9wcm9wZXJ0aWVzLmkyY19hbGdvID09ICZkdzIxMDJfaTJjX2FsZ28pIHsKIAkJLypkdzIxMDJfcHJvcGVydGllcy5hZGFwdGVyLT50dW5lcl9hdHRhY2ggPSBkdzIxMDJfdHVuZXJfYXR0YWNoOyovCi0JCWQtPmZlID0gZHZiX2F0dGFjaChzdHYwMjk5X2F0dGFjaCwgJnNoYXJwX3owMTk0YV9jb25maWcsCisJCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHN0djAyOTlfYXR0YWNoLCAmc2hhcnBfejAxOTRhX2NvbmZpZywKIAkJCQkJJmQtPmRldi0+aTJjX2FkYXApOwotCQlpZiAoZC0+ZmUgIT0gTlVMTCkgewotCQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKKwkJaWYgKGQtPmZlX2FkYXBbMF0uZmUgIT0gTlVMTCkgeworCQkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQkJaW5mbygiQXR0YWNoZWQgc3R2MDI5OSFcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEwOTAsOSArMTA5MCw5IEBACiAKIHN0YXRpYyBpbnQgZHczMTAxX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICpkKQogewotCWQtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDAyM19hdHRhY2gsICZkdzMxMDFfdGRhMTAwMjNfY29uZmlnLAorCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIzX2F0dGFjaCwgJmR3MzEwMV90ZGExMDAyM19jb25maWcsCiAJCQkJJmQtPmRldi0+aTJjX2FkYXAsIDB4NDgpOwotCWlmIChkLT5mZSAhPSBOVUxMKSB7CisJaWYgKGQtPmZlX2FkYXBbMF0uZmUgIT0gTlVMTCkgewogCQlpbmZvKCJBdHRhY2hlZCB0ZGExMDAyMyFcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMTAxLDEyICsxMTAxLDEyIEBACiAKIHN0YXRpYyBpbnQgemwxMDAzMTNfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmQpCiB7Ci0JZC0+ZmUgPSBkdmJfYXR0YWNoKG10MzEyX2F0dGFjaCwgJnpsMzEzX2NvbmZpZywKKwlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDMxMl9hdHRhY2gsICZ6bDMxM19jb25maWcsCiAJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7Ci0JaWYgKGQtPmZlICE9IE5VTEwpIHsKLQkJaWYgKGR2Yl9hdHRhY2goemwxMDAzOV9hdHRhY2gsIGQtPmZlLCAweDYwLAorCWlmIChkLT5mZV9hZGFwWzBdLmZlICE9IE5VTEwpIHsKKwkJaWYgKGR2Yl9hdHRhY2goemwxMDAzOV9hdHRhY2gsIGQtPmZlX2FkYXBbMF0uZmUsIDB4NjAsCiAJCQkJJmQtPmRldi0+aTJjX2FkYXApKSB7Ci0JCQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCQkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQkJaW5mbygiQXR0YWNoZWQgemwxMDAzMTMremwxMDAzOSFcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTExMTksMTYgKzExMTksMTYgQEAKIHsKIAl1OCBvYnVmW10gPSB7NywgMX07CiAKLQlkLT5mZSA9IGR2Yl9hdHRhY2goc3R2MDI4OF9hdHRhY2gsICZlYXJkYV9jb25maWcsCisJZC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3R2MDI4OF9hdHRhY2gsICZlYXJkYV9jb25maWcsCiAJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlpZiAoZC0+ZmUgPT0gTlVMTCkKKwlpZiAoZC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAotCWlmIChOVUxMID09IGR2Yl9hdHRhY2goc3RiNjAwMF9hdHRhY2gsIGQtPmZlLCAweDYxLCAmZC0+ZGV2LT5pMmNfYWRhcCkpCisJaWYgKE5VTEwgPT0gZHZiX2F0dGFjaChzdGI2MDAwX2F0dGFjaCwgZC0+ZmVfYWRhcFswXS5mZSwgMHg2MSwgJmQtPmRldi0+aTJjX2FkYXApKQogCQlyZXR1cm4gLUVJTzsKIAotCWQtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMHhfc2V0X3ZvbHRhZ2U7CisJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCiAJZHcyMTB4X29wX3J3KGQtPmRldi0+dWRldiwgMHg4YSwgMCwgMCwgb2J1ZiwgMiwgRFcyMTBYX1dSSVRFX01TRyk7CiAKQEAgLTExNDMsMTQgKzExNDMsMTQgQEAKIAlzdHJ1Y3QgczZ4MF9zdGF0ZSAqc3QgPSAoc3RydWN0IHM2eDBfc3RhdGUgKilkLT5kZXYtPnByaXY7CiAJdTggb2J1ZltdID0gezcsIDF9OwogCi0JZC0+ZmUgPSBkdmJfYXR0YWNoKGRzMzAwMF9hdHRhY2gsICZkdzIxMDRfZHMzMDAwX2NvbmZpZywKKwlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkczMwMDBfYXR0YWNoLCAmZHcyMTA0X2RzMzAwMF9jb25maWcsCiAJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlpZiAoZC0+ZmUgPT0gTlVMTCkKKwlpZiAoZC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAotCXN0LT5vbGRfc2V0X3ZvbHRhZ2UgPSBkLT5mZS0+b3BzLnNldF92b2x0YWdlOwotCWQtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBzNjYwX3NldF92b2x0YWdlOworCXN0LT5vbGRfc2V0X3ZvbHRhZ2UgPSBkLT5mZV9hZGFwWzBdLmZlLT5vcHMuc2V0X3ZvbHRhZ2U7CisJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gczY2MF9zZXRfdm9sdGFnZTsKIAogCWR3MjEweF9vcF9ydyhkLT5kZXYtPnVkZXYsIDB4OGEsIDAsIDAsIG9idWYsIDIsIERXMjEwWF9XUklURV9NU0cpOwogCkBAIC0xMTYzLDEyICsxMTYzLDEyIEBACiB7CiAJdTggb2J1ZltdID0gezcsIDF9OwogCi0JZC0+ZmUgPSBkdmJfYXR0YWNoKHN0djA5MDBfYXR0YWNoLCAmcHJvZl83NTAwX3N0djA5MDBfY29uZmlnLAorCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHN0djA5MDBfYXR0YWNoLCAmcHJvZl83NTAwX3N0djA5MDBfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCwgMCk7Ci0JaWYgKGQtPmZlID09IE5VTEwpCisJaWYgKGQtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CiAKLQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCWQtPmZlX2FkYXBbMF0uZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKIAogCWR3MjEweF9vcF9ydyhkLT5kZXYtPnVkZXYsIDB4OGEsIDAsIDAsIG9idWYsIDIsIERXMjEwWF9XUklURV9NU0cpOwogCkBAIC0xMjA0LDkgKzEyMDQsOSBAQAogCWlmIChkdmJfdXNiX2dlbmVyaWNfcncoZC0+ZGV2LCBvYnVmLCAxLCBpYnVmLCAxLCAwKSA8IDApCiAJCWVycigiY29tbWFuZCAweDUxIHRyYW5zZmVyIGZhaWxlZC4iKTsKIAotCWQtPmZlID0gZHZiX2F0dGFjaChkczMwMDBfYXR0YWNoLCAmc3UzMDAwX2RzMzAwMF9jb25maWcsCisJZC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZHMzMDAwX2F0dGFjaCwgJnN1MzAwMF9kczMwMDBfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7Ci0JaWYgKGQtPmZlID09IE5VTEwpCisJaWYgKGQtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CiAKIAlpbmZvKCJBdHRhY2hlZCBEUzMwMDAhXG4iKTsKQEAgLTEyMTYsMTQgKzEyMTYsMTQgQEAKIAogc3RhdGljIGludCBkdzIxMDJfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsIDB4NjAsCisJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MCwKIAkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfT1BFUkExKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkdzMxMDFfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsIDB4NjAsCisJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MCwKIAkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfVFVBNjAzNCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE1MzUsNyArMTUzNSw3IEBACiAJCQkJCURXMjEwWF9SRUFEX01TRyk7CiAJCQlpZiAoKHJlc2V0MTZbMF0gPT0gMHhhMSkgfHwgKHJlc2V0MTZbMF0gPT0gMHg4MCkpIHsKIAkJCQlkdzIxMDJfcHJvcGVydGllcy5pMmNfYWxnbyA9ICZkdzIxMDJfaTJjX2FsZ287Ci0JCQkJZHcyMTAyX3Byb3BlcnRpZXMuYWRhcHRlci0+dHVuZXJfYXR0YWNoID0gJmR3MjEwMl90dW5lcl9hdHRhY2g7CisJCQkJZHcyMTAyX3Byb3BlcnRpZXMuYWRhcHRlci0+ZmVbMF0udHVuZXJfYXR0YWNoID0gJmR3MjEwMl90dW5lcl9hdHRhY2g7CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgewogCQkJCS8qIGNoZWNrIFNUVjAyODggZnJvbnRlbmQgICovCkBAIC0xNTkxLDYgKzE1OTEsOCBAQAogCS5yZWFkX21hY19hZGRyZXNzID0gZHcyMTB4X3JlYWRfbWFjX2FkZHJlc3MsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmZyb250ZW5kX2F0dGFjaCA9IGR3MjEwMl9mcm9udGVuZF9hdHRhY2gsCiAJCQkuc3RyZWFtID0gewogCQkJCS50eXBlID0gVVNCX0JVTEssCkBAIC0xNjAyLDYgKzE2MDQsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMywKQEAgLTE2NDIsNiArMTY0NSw4IEBACiAJLnJlYWRfbWFjX2FkZHJlc3MgPSBkdzIxMHhfcmVhZF9tYWNfYWRkcmVzcywKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuZnJvbnRlbmRfYXR0YWNoID0gZHcyMTA0X2Zyb250ZW5kX2F0dGFjaCwKIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKQEAgLTE2NTMsNiArMTY1OCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfQogCX0sCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAyLApAQCAtMTY4OSw2ICsxNjk1LDggQEAKIAkucmVhZF9tYWNfYWRkcmVzcyA9IGR3MjEweF9yZWFkX21hY19hZGRyZXNzLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5mcm9udGVuZF9hdHRhY2ggPSBkdzMxMDFfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCA9IGR3MzEwMV90dW5lcl9hdHRhY2gsCiAJCQkuc3RyZWFtID0gewpAQCAtMTcwMSw2ICsxNzA5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIAkubnVtX2RldmljZV9kZXNjcyA9IDEsCkBAIC0xNzMzLDYgKzE3NDIsOCBAQAogCS5yZWFkX21hY19hZGRyZXNzID0gczZ4MF9yZWFkX21hY19hZGRyZXNzLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5mcm9udGVuZF9hdHRhY2ggPSB6bDEwMDMxM19mcm9udGVuZF9hdHRhY2gsCiAJCQkuc3RyZWFtID0gewogCQkJCS50eXBlID0gVVNCX0JVTEssCkBAIC0xNzQ0LDYgKzE3NTUsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKQEAgLTE4MTAsNiArMTgyMiw4IEBACiAKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IHN1MzAwMF9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gc3UzMDAwX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS5zdHJlYW0gPSB7CkBAIC0xODIyLDYgKzE4MzYsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQorCQl9fSwKIAkJfQogCX0sCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAzLApAQCAtMTg1NSw3ICsxODcwLDcgQEAKIAlwMTEwMC0+ZGV2aWNlc1swXSA9IGQxMTAwOwogCXAxMTAwLT5yYy5sZWdhY3kucmNfbWFwX3RhYmxlID0gcmNfbWFwX3Ric190YWJsZTsKIAlwMTEwMC0+cmMubGVnYWN5LnJjX21hcF9zaXplID0gQVJSQVlfU0laRShyY19tYXBfdGJzX3RhYmxlKTsKLQlwMTEwMC0+YWRhcHRlci0+ZnJvbnRlbmRfYXR0YWNoID0gc3R2MDI4OF9mcm9udGVuZF9hdHRhY2g7CisJcDExMDAtPmFkYXB0ZXItPmZlWzBdLmZyb250ZW5kX2F0dGFjaCA9IHN0djAyODhfZnJvbnRlbmRfYXR0YWNoOwogCiAJczY2MCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzNjYwKSB7CkBAIC0xODY5LDcgKzE4ODQsNyBAQAogCXM2NjAtPmRldmljZXNbMF0gPSBkNjYwOwogCXM2NjAtPmRldmljZXNbMV0gPSBkNDgwXzE7CiAJczY2MC0+ZGV2aWNlc1syXSA9IGQ0ODBfMjsKLQlzNjYwLT5hZGFwdGVyLT5mcm9udGVuZF9hdHRhY2ggPSBkczMwMDBfZnJvbnRlbmRfYXR0YWNoOworCXM2NjAtPmFkYXB0ZXItPmZlWzBdLmZyb250ZW5kX2F0dGFjaCA9IGRzMzAwMF9mcm9udGVuZF9hdHRhY2g7CiAKIAlwNzUwMCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwNzUwMCkgewpAQCAtMTg4Myw3ICsxODk4LDcgQEAKIAlwNzUwMC0+ZGV2aWNlc1swXSA9IGQ3NTAwOwogCXA3NTAwLT5yYy5sZWdhY3kucmNfbWFwX3RhYmxlID0gcmNfbWFwX3Ric190YWJsZTsKIAlwNzUwMC0+cmMubGVnYWN5LnJjX21hcF9zaXplID0gQVJSQVlfU0laRShyY19tYXBfdGJzX3RhYmxlKTsKLQlwNzUwMC0+YWRhcHRlci0+ZnJvbnRlbmRfYXR0YWNoID0gcHJvZl83NTAwX2Zyb250ZW5kX2F0dGFjaDsKKwlwNzUwMC0+YWRhcHRlci0+ZmVbMF0uZnJvbnRlbmRfYXR0YWNoID0gcHJvZl83NTAwX2Zyb250ZW5kX2F0dGFjaDsKIAogCWlmICgwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJmR3MjEwMl9wcm9wZXJ0aWVzLAogCQkJVEhJU19NT0RVTEUsIE5VTEwsIGFkYXB0ZXJfbnIpIHx8CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2VjMTY4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2VjMTY4LmMKaW5kZXggMWJhM2U1ZC4uNzg0NDJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9lYzE2OC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZWMxNjguYwpAQCAtMjAwLDkgKzIwMCw5IEBACiBzdGF0aWMgaW50IGVjMTY4X2VjMTAwX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZWMxMDBfYXR0YWNoLCAmZWMxNjhfZWMxMDBfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGVjMTAwX2F0dGFjaCwgJmVjMTY4X2VjMTAwX2NvbmZpZywKIAkJJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIDA7CkBAIC0yMjgsNyArMjI4LDcgQEAKIHN0YXRpYyBpbnQgZWMxNjhfbXhsNTAwM3NfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOwotCXJldHVybiBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCXJldHVybiBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCSZlYzE2OF9teGw1MDAzc19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIApAQCAtMzgyLDYgKzM4Miw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBlYzE2OF9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gZWMxNjhfZWMxMDBfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBlYzE2OF9teGw1MDAzc190dW5lcl9hdHRhY2gsCkBAIC0zOTUsNiArMzk3LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9mcmlpby5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9mcmlpby5jCmluZGV4IDc2MTU5YWUuLmIwOTJkYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZnJpaW8uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2ZyaWlvLmMKQEAgLTQwMyw4ICs0MDMsOCBAQAogCWlmIChmcmlpb19pbml0aWFsaXplKGFkYXAtPmRldikgPCAwKQogCQlyZXR1cm4gLUVJTzsKIAotCWFkYXAtPmZlID0gamR2YnQ5MDUwMl9hdHRhY2goYWRhcC0+ZGV2KTsKLQlpZiAoYWRhcC0+ZmUgPT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gamR2YnQ5MDUwMl9hdHRhY2goYWRhcC0+ZGV2KTsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtNDczLDYgKzQ3Myw4IEBACiAJCS8qIGNhcHM6MCA9PiAgbm8gcGlkIGZpbHRlciwgMTg4QiBUUyBwYWNrZXQgKi8KIAkJLyogR0w4NjEgaGFzIGEgSFcgcGlkIGZpbHRlciwgYnV0IG5vIGluZm8gYXZhaWxhYmxlLiAqLwogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5jYXBzICA9IDAsCiAKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gZnJpaW9fZnJvbnRlbmRfYXR0YWNoLApAQCAtNDkwLDYgKzQ5Miw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfQogCX0sCiAJLmkyY19hbGdvID0gJmdsODYxX2kyY19hbGdvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9nbDg2MS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9nbDg2MS5jCmluZGV4IDZmNTk2ZWQuLjYzNjgxZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ2w4NjEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dsODYxLmMKQEAgLTEwMyw5ICsxMDMsOSBAQAogc3RhdGljIGludCBnbDg2MV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmdsODYxX3psMTAzNTNfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmZ2w4NjFfemwxMDM1M19jb25maWcsCiAJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKLQlpZiAoYWRhcC0+ZmUgPT0gTlVMTCkKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtMTE4LDcgKzExOCw3IEBACiBzdGF0aWMgaW50IGdsODYxX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXJldHVybiBkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsCi0JCQkgIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCSAgYWRhcC0+ZmVfYWRhcFswXS5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkgICZnbDg2MV9xdDEwMTBfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKQEAgLTE2Nyw2ICsxNjcsOCBAQAogCiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7eworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAKIAkJLmZyb250ZW5kX2F0dGFjaCAgPSBnbDg2MV9mcm9udGVuZF9hdHRhY2gsCiAJCS50dW5lcl9hdHRhY2ggICAgID0gZ2w4NjFfdHVuZXJfYXR0YWNoLApAQCAtMTgxLDYgKzE4Myw3IEBACiAJCQkJfQogCQkJfQogCQl9LAorCQl9fSwKIAl9IH0sCiAJLmkyY19hbGdvICAgICAgICAgPSAmZ2w4NjFfaTJjX2FsZ28sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLWZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay1mZS5jCmluZGV4IDYwZDExZTUuLjU0MjYyNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2stZmUuYwpAQCAtMTQ0LDE5ICsxNDQsMjUgQEAKIAljbWRbNl0gPSAoZnJlcSA+PiAxNikgJiAweGZmOwogCWNtZFs3XSA9IChmcmVxID4+IDI0KSAmIDB4ZmY7CiAKKwkvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogRFZCLVMgKyA4LVBTSyB3ZXJlIHVzZWQgZm9yIFR1cmJvLUZFQyAqLworCWlmIChjLT5kZWxpdmVyeV9zeXN0ZW0gPT0gU1lTX0RWQlMgJiYgYy0+bW9kdWxhdGlvbiA9PSBQU0tfOCkKKwkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gU1lTX1RVUkJPOworCiAJc3dpdGNoIChjLT5kZWxpdmVyeV9zeXN0ZW0pIHsKIAljYXNlIFNZU19EVkJTOgotCQkvKiBBbGxvdyBRUFNLIGFuZCA4UFNLIChldmVuIGZvciBEVkItUykgKi8KLQkJaWYgKGMtPm1vZHVsYXRpb24gIT0gUVBTSyAmJiBjLT5tb2R1bGF0aW9uICE9IFBTS184KSB7CisJCWlmIChjLT5tb2R1bGF0aW9uICE9IFFQU0spIHsKIAkJCWRlYl9mZSgiJXM6IHVuc3VwcG9ydGVkIG1vZHVsYXRpb24gc2VsZWN0ZWQgKCVkKVxuIiwKIAkJCQlfX2Z1bmNfXywgYy0+bW9kdWxhdGlvbik7CiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCX0KIAkJYy0+ZmVjX2lubmVyID0gRkVDX0FVVE87CiAJCWJyZWFrOwotCWNhc2UgU1lTX0RWQlMyOgorCWNhc2UgU1lTX0RWQlMyOiAvKiBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogCQlkZWJfZmUoIiVzOiBEVkItUzIgZGVsaXZlcnkgc3lzdGVtIHNlbGVjdGVkXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOworCWNhc2UgU1lTX1RVUkJPOgorCQlkZWJfZmUoIiVzOiBUdXJiby1GRUMgZGVsaXZlcnkgc3lzdGVtIHNlbGVjdGVkXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJZGViX2ZlKCIlczogdW5zdXBwb3J0ZWQgZGVsaXZlcnkgc3lzdGVtIHNlbGVjdGVkICglZClcbiIsCkBAIC0xODksNyArMTk1LDEwIEBACiAJCWRlZmF1bHQ6CiAJCQljbWRbOV0gPSA1OyBicmVhazsKIAkJfQotCQljbWRbOF0gPSBBRFZfTU9EX0RWQl9RUFNLOworCQlpZiAoYy0+ZGVsaXZlcnlfc3lzdGVtID09IFNZU19UVVJCTykKKwkJCWNtZFs4XSA9IEFEVl9NT0RfVFVSQk9fUVBTSzsKKwkJZWxzZQorCQkJY21kWzhdID0gQURWX01PRF9EVkJfUVBTSzsKIAkJYnJlYWs7CiAJY2FzZSBQU0tfODogLyogUFNLXzggaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBETiAqLwogCQljbWRbOF0gPSBBRFZfTU9EX1RVUkJPXzhQU0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suYwppbmRleCAxY2IzZDlhLi41ZjcxMjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmMKQEAgLTIzMCw3ICsyMzAsNyBAQAogCiBzdGF0aWMgaW50IGdwOHBza19mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlhZGFwLT5mZSA9IGdwOHBza19mZV9hdHRhY2goYWRhcC0+ZGV2KTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZ3A4cHNrX2ZlX2F0dGFjaChhZGFwLT5kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yNjgsNiArMjY4LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGdwOHBza19zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gZ3A4cHNrX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KQEAgLTI4MSw2ICsyODMsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5wb3dlcl9jdHJsICAgICAgID0gZ3A4cHNrX3Bvd2VyX2N0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2l0OTEzeC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9pdDkxM3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYyMjYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9pdDkxM3guYwpAQCAtMCwwICsxLDcwMiBAQAorLyogRFZCIFVTQiBjb21wbGlhbnQgbGludXggZHJpdmVyIGZvciBJVDkxMzcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTWFsY29sbSBQcmllc3RsZXkgKHR2Ym94c3B5QGdtYWlsLmNvbSkKKyAqIElUOTEzNyAoQykgSVRFIFRlY2ggSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvaXQ5MTM3LnR4dCBmb3IgZmlybXdhcmUgaW5mb3JtYXRpb24KKyAqCisgKi8KKyNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJpdDkxM3giCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+CisKKyNpbmNsdWRlICJkdmItdXNiLmgiCisjaW5jbHVkZSAiaXQ5MTN4LWZlLmgiCisKKy8qIGRlYnVnICovCitzdGF0aWMgaW50IGR2Yl91c2JfaXQ5MTN4X2RlYnVnOworI2RlZmluZSBsX2RwcmludGsodmFyLCBsZXZlbCwgYXJncy4uLikgZG8geyBcCisJaWYgKCh2YXIgPj0gbGV2ZWwpKSBcCisJCXByaW50ayhLRVJOX0RFQlVHIERWQl9VU0JfTE9HX1BSRUZJWCAiOiAiIGFyZ3MpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGRlYl9pbmZvKGxldmVsLCBhcmdzLi4uKSBsX2RwcmludGsoZHZiX3VzYl9pdDkxM3hfZGVidWcsIGxldmVsLCBhcmdzKQorI2RlZmluZSBkZWJ1Z19kYXRhX3NuaXBldChsZXZlbCwgbmFtZSwgcCkgXAorCSBkZWJfaW5mbyhsZXZlbCwgbmFtZSIgKCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4KSIsIFwKKwkJKnAsICoocCsxKSwgKihwKzIpLCAqKHArMyksICoocCs0KSwgXAorCQkJKihwKzUpLCAqKHArNiksICoocCs3KSk7CisKKworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkdmJfdXNiX2l0OTEzeF9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8gKG9yLWFibGUpKS4iCisJCQlEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CisKK3N0YXRpYyBpbnQgcGlkX2ZpbHRlcjsKK21vZHVsZV9wYXJhbV9uYW1lZChwaWQsIHBpZF9maWx0ZXIsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBpZCwgInNldCBkZWZhdWx0IDA9b24gMT1vZmYiKTsKKworaW50IGNtZF9jb3VudGVyOworCitEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKKworc3RydWN0IGl0OTEzeF9zdGF0ZSB7CisJdTggaWQ7Cit9OworCitzdHJ1Y3QgaXRlX2NvbmZpZyB7CisJdTggY2hpcF92ZXI7CisJdTE2IGNoaXBfdHlwZTsKKwl1MzIgZmlybXdhcmU7CisJdTggdHVuZXJfaWRfMDsKKwl1OCB0dW5lcl9pZF8xOworCXU4IGR1YWxfbW9kZTsKK307CisKK3N0cnVjdCBpdGVfY29uZmlnIGl0OTEzeF9jb25maWc7CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2J1bGtfd3JpdGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJCQl1OCAqc25kLCBpbnQgbGVuLCB1OCBwaXBlKQoreworCWludCByZXQsIGFjdHVhbF9sOworCisJcmV0ID0gdXNiX2J1bGtfbXNnKGRldiwgdXNiX3NuZGJ1bGtwaXBlKGRldiwgcGlwZSksCisJCQkJc25kLCBsZW4gLCAmYWN0dWFsX2wsIDEwMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpdDkxM3hfYnVsa19yZWFkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisJCQkJdTggKnJldiwgaW50IGxlbiwgdTggcGlwZSkKK3sKKwlpbnQgcmV0LCBhY3R1YWxfbDsKKworCXJldCA9IHVzYl9idWxrX21zZyhkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYsIHBpcGUpLAorCQkJCSByZXYsIGxlbiAsICZhY3R1YWxfbCwgMjAwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTE2IGNoZWNrX3N1bSh1OCAqcCwgdTggbGVuKQoreworCXUxNiBzdW0gPSAwOworCXU4IGkgPSAxOworCXdoaWxlIChpIDwgbGVuKQorCQlzdW0gKz0gKGkrKyAmIDEpID8gKCpwKyspIDw8IDggOiAqcCsrOworCXJldHVybiB+c3VtOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9pbyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggbW9kZSwgdTggcHJvLAorCQkJdTggY21kLCB1MzIgcmVnLCB1OCBhZGRyLCB1OCAqZGF0YSwgdTggbGVuKQoreworCWludCByZXQgPSAwLCBpLCBidWZfc2l6ZSA9IDE7CisJdTggKmJ1ZmY7CisJdTggcmxlbjsKKwl1MTYgY2hrX3N1bTsKKworCWJ1ZmYgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmKSB7CisJCWluZm8oIlVTQiBCdWZmZXIgRmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJ1ZmZbYnVmX3NpemUrK10gPSBwcm87CisJYnVmZltidWZfc2l6ZSsrXSA9IGNtZDsKKwlidWZmW2J1Zl9zaXplKytdID0gY21kX2NvdW50ZXI7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFJFQURfTE9ORzoKKwljYXNlIFdSSVRFX0xPTkc6CisJCWJ1ZmZbYnVmX3NpemUrK10gPSBsZW47CisJCWJ1ZmZbYnVmX3NpemUrK10gPSAyOworCQlidWZmW2J1Zl9zaXplKytdID0gKHJlZyA+PiAyNCk7CisJCWJ1ZmZbYnVmX3NpemUrK10gPSAocmVnID4+IDE2KSAmIDB4ZmY7CisJCWJ1ZmZbYnVmX3NpemUrK10gPSAocmVnID4+IDgpICYgMHhmZjsKKwkJYnVmZltidWZfc2l6ZSsrXSA9IHJlZyAmIDB4ZmY7CisJYnJlYWs7CisJY2FzZSBSRUFEX1NIT1JUOgorCQlidWZmW2J1Zl9zaXplKytdID0gYWRkcjsKKwkJYnJlYWs7CisJY2FzZSBXUklURV9TSE9SVDoKKwkJYnVmZltidWZfc2l6ZSsrXSA9IGxlbjsKKwkJYnVmZltidWZfc2l6ZSsrXSA9IGFkZHI7CisJCWJ1ZmZbYnVmX3NpemUrK10gPSAocmVnID4+IDgpICYgMHhmZjsKKwkJYnVmZltidWZfc2l6ZSsrXSA9IHJlZyAmIDB4ZmY7CisJYnJlYWs7CisJY2FzZSBSRUFEX0RBVEE6CisJY2FzZSBXUklURV9EQVRBOgorCQlicmVhazsKKwljYXNlIFdSSVRFX0NNRDoKKwkJbW9kZSA9IDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWtmcmVlKGJ1ZmYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobW9kZSAmIDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IGxlbiA7IGkrKykKKwkJCWJ1ZmZbYnVmX3NpemUrK10gPSBkYXRhW2ldOworCX0KKwljaGtfc3VtID0gY2hlY2tfc3VtKCZidWZmWzFdLCBidWZfc2l6ZSk7CisKKwlidWZmW2J1Zl9zaXplKytdID0gY2hrX3N1bSA+PiA4OworCWJ1ZmZbMF0gPSBidWZfc2l6ZTsKKwlidWZmW2J1Zl9zaXplKytdID0gKGNoa19zdW0gJiAweGZmKTsKKworCXJldCA9IGl0OTEzeF9idWxrX3dyaXRlKHVkZXYsIGJ1ZmYsIGJ1Zl9zaXplICwgMHgwMik7CisKKwlyZXQgfD0gaXQ5MTN4X2J1bGtfcmVhZCh1ZGV2LCBidWZmLCAobW9kZSAmIDEpID8KKwkJCTUgOiBsZW4gKyA1ICwgMHgwMSk7CisKKwlybGVuID0gKG1vZGUgJiAweDEpID8gMHgxIDogbGVuOworCisJaWYgKG1vZGUgJiAxKQorCQlyZXQgfD0gYnVmZlsyXTsKKwllbHNlCisJCW1lbWNweShkYXRhLCAmYnVmZlszXSwgcmxlbik7CisKKwljbWRfY291bnRlcisrOworCisJa2ZyZWUoYnVmZik7CisKKwlyZXR1cm4gKHJldCA8IDApID8gLUVOT0RFViA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X3dyX3JlZyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggcHJvLCB1MzIgcmVnICwgdTggZGF0YSkKK3sKKwlpbnQgcmV0OworCXU4IGJbMV07CisJYlswXSA9IGRhdGE7CisJcmV0ID0gaXQ5MTN4X2lvKHVkZXYsIFdSSVRFX0xPTkcsIHBybywKKwkJCUNNRF9ERU1PRF9XUklURSwgcmVnLCAwLCBiLCBzaXplb2YoYikpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpdDkxM3hfcmVhZF9yZWcoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHUzMiByZWcpCit7CisJaW50IHJldDsKKwl1OCBkYXRhWzFdOworCisJcmV0ID0gaXQ5MTN4X2lvKHVkZXYsIFJFQURfTE9ORywgREVWXzAsCisJCQlDTURfREVNT0RfUkVBRCwgcmVnLCAwLCAmZGF0YVswXSwgMSk7CisKKwlyZXR1cm4gKHJldCA8IDApID8gcmV0IDogZGF0YVswXTsKK30KKworc3RhdGljIHUzMiBpdDkxM3hfcXVlcnkoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHU4IHBybykKK3sKKwlpbnQgcmV0OworCXU4IGRhdGFbNF07CisJcmV0ID0gaXQ5MTN4X2lvKHVkZXYsIFJFQURfTE9ORywgcHJvLCBDTURfREVNT0RfUkVBRCwKKwkJMHgxMjIyLCAwLCAmZGF0YVswXSwgMyk7CisKKwlpdDkxM3hfY29uZmlnLmNoaXBfdmVyID0gZGF0YVswXTsKKwlpdDkxM3hfY29uZmlnLmNoaXBfdHlwZSA9ICh1MTYpKGRhdGFbMl0gPDwgOCkgKyBkYXRhWzFdOworCisJaW5mbygiQ2hpcCBWZXJzaW9uPSUwMnggQ2hpcCBUeXBlPSUwNHgiLCBpdDkxM3hfY29uZmlnLmNoaXBfdmVyLAorCQlpdDkxM3hfY29uZmlnLmNoaXBfdHlwZSk7CisKKwlyZXQgfD0gaXQ5MTN4X2lvKHVkZXYsIFJFQURfU0hPUlQsIHBybywKKwkJCUNNRF9RVUVSWUlORk8sIDAsIDB4MSwgJmRhdGFbMF0sIDQpOworCisJaXQ5MTN4X2NvbmZpZy5maXJtd2FyZSA9IChkYXRhWzBdIDw8IDI0KSArIChkYXRhWzFdIDw8IDE2KSArCisJCQkoZGF0YVsyXSA8PCA4KSArIGRhdGFbM107CisKKwlyZXR1cm4gKHJldCA8IDApID8gMCA6IGl0OTEzeF9jb25maWcuZmlybXdhcmU7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJaW50IHJldCA9IDA7CisJdTggcHJvID0gKGFkYXAtPmlkID09IDApID8gREVWXzBfRE1PRCA6IERFVl8xX0RNT0Q7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwLT5kZXYtPmkyY19tdXRleCkgPCAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisJZGViX2luZm8oMSwgIlBJRF9DICAoJTAyeCkiLCBvbm9mZik7CisKKwlpZiAoIW9ub2ZmKQorCQlyZXQgPSBpdDkxM3hfd3JfcmVnKGFkYXAtPmRldi0+dWRldiwgcHJvLCBQSURfUlNULCAweDEpOworCisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXYtPmkyY19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpdDkxM3hfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLAorCQlpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGFkYXAtPmRldi0+dWRldjsKKwlpbnQgcmV0ID0gMDsKKwl1OCBwcm8gPSAoYWRhcC0+aWQgPT0gMCkgPyBERVZfMF9ETU9EIDogREVWXzFfRE1PRDsKKworCWlmIChwaWRfZmlsdGVyID4gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwLT5kZXYtPmkyY19tdXRleCkgPCAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisJZGViX2luZm8oMSwgIlBJRF9GICAoJTAyeCkiLCBvbm9mZik7CisJaWYgKG9ub2ZmKSB7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgcHJvLCBQSURfRU4sIDB4MSk7CisKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgcHJvLCBQSURfTFNCLCAodTgpKHBpZCAmIDB4ZmYpKTsKKworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBwcm8sIFBJRF9NU0IsICh1OCkocGlkID4+IDgpKTsKKworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBwcm8sIFBJRF9JTlhfRU4sICh1OClvbm9mZik7CisKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgcHJvLCBQSURfSU5YLCAodTgpKGluZGV4ICYgMHgxZikpOworCisJfQorCisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXYtPmkyY19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpdDkxM3hfcmV0dXJuX3N0YXR1cyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwl1MzIgZmlybSA9IDA7CisKKwlmaXJtID0gaXQ5MTN4X3F1ZXJ5KHVkZXYsIERFVl8wKTsKKwlpZiAoZmlybSA+IDApCisJCWluZm8oIkZpcm13YXJlIFZlcnNpb24gJWQiLCBmaXJtKTsKKworCXJldHVybiAoZmlybSA+IDApID8gZmlybSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnW10sCisJCQkJIGludCBudW0pCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwlzdGF0aWMgdTggZGF0YVsyNTZdOworCWludCByZXQ7CisJdTMyIHJlZzsKKwl1OCBwcm87CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+aTJjX211dGV4KSA8IDApCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCWRlYnVnX2RhdGFfc25pcGV0KDEsICJNZXNzYWdlIG91dCIsIG1zZ1swXS5idWYpOworCWRlYl9pbmZvKDIsICJudW0gb2YgbWVzc2FnZXMgJWQgYWRkcmVzcyAlMDJ4IiwgbnVtLCBtc2dbMF0uYWRkcik7CisKKwlwcm8gPSAobXNnWzBdLmFkZHIgJiAweDIpID8gIERFVl8wX0RNT0QgOiAweDA7CisJcHJvIHw9IChtc2dbMF0uYWRkciAmIDB4MjApID8gREVWXzEgOiBERVZfMDsKKwltZW1jcHkoZGF0YSwgbXNnWzBdLmJ1ZiwgbXNnWzBdLmxlbik7CisJcmVnID0gKGRhdGFbMF0gPDwgMjQpICsgKGRhdGFbMV0gPDwgMTYpICsKKwkJCShkYXRhWzJdIDw8IDgpICsgZGF0YVszXTsKKwlpZiAobnVtID09IDIpIHsKKwkJcmV0ID0gaXQ5MTN4X2lvKGQtPnVkZXYsIFJFQURfTE9ORywgcHJvLAorCQkJQ01EX0RFTU9EX1JFQUQsIHJlZywgMCwgZGF0YSwgbXNnWzFdLmxlbik7CisJCW1lbWNweShtc2dbMV0uYnVmLCBkYXRhLCBtc2dbMV0ubGVuKTsKKwl9IGVsc2UKKwkJcmV0ID0gaXQ5MTN4X2lvKGQtPnVkZXYsIFdSSVRFX0xPTkcsIHBybywgQ01EX0RFTU9EX1dSSVRFLAorCQkJcmVnLCAwLCAmZGF0YVs0XSwgbXNnWzBdLmxlbiAtIDQpOworCisJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBpdDkxM3hfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19JMkM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpdDkxM3hfaTJjX2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyICAgPSBpdDkxM3hfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBpdDkxM3hfaTJjX2Z1bmMsCit9OworCisvKiBDYWxsYmFja3MgZm9yIERWQiBVU0IgKi8KKyNkZWZpbmUgSVQ5MTNYX1BPTEwgMjUwCitzdGF0aWMgaW50IGl0OTEzeF9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJdTggaWJ1Zls0XTsKKwlpbnQgcmV0OworCXUzMiBrZXk7CisJLyogQXZvaWQgY29uZmxpY3Qgd2l0aCBmcm9udGVuZHMqLworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXQgPSBpdDkxM3hfaW8oZC0+dWRldiwgUkVBRF9MT05HLCBQUk9fTElOSywgQ01EX0lSX0dFVCwKKwkJMCwgMCwgJmlidWZbMF0sIHNpemVvZihpYnVmKSk7CisKKwlpZiAoKGlidWZbMl0gKyBpYnVmWzNdKSA9PSAweGZmKSB7CisJCWtleSA9IGlidWZbMl07CisJCWtleSArPSBpYnVmWzBdIDw8IDg7CisJCWRlYl9pbmZvKDEsICJJTlQgS2V5ID0lMDh4Iiwga2V5KTsKKwkJaWYgKGQtPnJjX2RldiAhPSBOVUxMKQorCQkJcmNfa2V5ZG93bihkLT5yY19kZXYsIGtleSwgMCk7CisJfQorCW11dGV4X3VubG9jaygmZC0+aTJjX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IGl0OTEzeF9pZGVudGlmeV9zdGF0ZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwkJc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgKnByb3BzLAorCQlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gKipkZXNjLAorCQlpbnQgKmNvbGQpCit7CisJaW50IHJldCA9IDAsIGZpcm1fbm87CisJdTggcmVnLCByZW1vdGU7CisKKwlmaXJtX25vID0gaXQ5MTN4X3JldHVybl9zdGF0dXModWRldik7CisKKwkvKiBjaGVjbmsgZm9yIGR1YWwgbW9kZSAqLworCWl0OTEzeF9jb25maWcuZHVhbF9tb2RlID0gIGl0OTEzeF9yZWFkX3JlZyh1ZGV2LCAweDQ5YzUpOworCisJLyogVE9ETyBkaWZmZXJlbnQgcmVtb3RlcyAqLworCXJlbW90ZSA9IGl0OTEzeF9yZWFkX3JlZyh1ZGV2LCAweDQ5YWMpOyAvKiBSZW1vdGUgKi8KKwlpZiAocmVtb3RlID09IDApCisJCXByb3BzLT5yYy5jb3JlLnJjX2NvZGVzID0gTlVMTDsKKworCS8qIFRPRE8gYXQgdGhlIG1vbWVudCB0dW5lcl9pZCBpcyBhbHdheXMgYXNzaWduZWQgdG8gMHgzOCAqLworCWl0OTEzeF9jb25maWcudHVuZXJfaWRfMCA9IGl0OTEzeF9yZWFkX3JlZyh1ZGV2LCAweDQ5ZDApOworCisJaW5mbygiRHVhbCBtb2RlPSV4IFJlbW90ZT0leCBUdW5lciBUeXBlPSV4IiwgaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUKKwkJLCByZW1vdGUsIGl0OTEzeF9jb25maWcudHVuZXJfaWRfMCk7CisKKwlpZiAoZmlybV9ubyA+IDApIHsKKwkJKmNvbGQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUpIHsKKwkJaXQ5MTN4X2NvbmZpZy50dW5lcl9pZF8xID0gaXQ5MTN4X3JlYWRfcmVnKHVkZXYsIDB4NDllMCk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIEdQSU9IMV9FTiwgMHgxKTsKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIEdQSU9IMV9PTiwgMHgxKTsKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIEdQSU9IMV9PLCAweDEpOworCQltc2xlZXAoNTApOworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgR1BJT0gxX08sIDB4MCk7CisJCW1zbGVlcCg1MCk7CisJCXJlZyA9IGl0OTEzeF9yZWFkX3JlZyh1ZGV2LCBHUElPSDFfTyk7CisJCWlmIChyZWcgPT0gMCkgeworCQkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsICBHUElPSDFfTywgMHgxKTsKKwkJCXJldCB8PSBpdDkxM3hfcmV0dXJuX3N0YXR1cyh1ZGV2KTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLAorCQkJCQlHUElPSDFfTywgMHgwKTsKKwkJfQorCQlwcm9wcy0+bnVtX2FkYXB0ZXJzID0gMjsKKwl9IGVsc2UKKwkJcHJvcHMtPm51bV9hZGFwdGVycyA9IDE7CisKKwlyZWcgPSBpdDkxM3hfcmVhZF9yZWcodWRldiwgSU9fTVVYX1BPV0VSX0NMSyk7CisKKwlpZiAoaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUpIHsKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIDB4NGJmYiwgQ0hJUDJfSTJDX0FERFIpOworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgIENMS19PX0VOLCAweDEpOworCX0gZWxzZSB7CisJCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCAweDRiZmIsIDB4MCk7CisJCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCAgQ0xLX09fRU4sIDB4MCk7CisJfQorCisJKmNvbGQgPSAxOworCisJcmV0dXJuIChyZXQgPCAwKSA/IC1FTk9ERVYgOiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJaW50IHJldCA9IDA7CisJdTggcHJvID0gKGFkYXAtPmlkID09IDApID8gREVWXzBfRE1PRCA6IERFVl8xX0RNT0Q7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwLT5kZXYtPmkyY19tdXRleCkgPCAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisJZGViX2luZm8oMSwgIlNUTSAgKCUwMngpIiwgb25vZmYpOworCisJaWYgKCFvbm9mZikKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyhhZGFwLT5kZXYtPnVkZXYsIHBybywgUElEX1JTVCwgMHgxKTsKKworCisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXYtPmkyY19tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgaXQ5MTN4X2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQoreworCWludCByZXQgPSAwLCBpOworCXU4IHBhY2tldF9zaXplLCBkbGVuOworCXU4ICpmd19kYXRhOworCisJcGFja2V0X3NpemUgPSAweDI5OworCisJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgIEkyQ19DTEssIEkyQ19DTEtfMTAwKTsKKworCWluZm8oIkZSTSBTdGFydGluZyBGaXJtd2FyZSBEb3dubG9hZCIpOworCS8qIFRoaXMgdXNlcyBzY2F0dGVyIHdyaXRlIGZpcm13YXJlIGhlYWRlcnMgZm9sbG93ICovCisJLyogMDMgWFggMDAgICAgIFhYID0gY2hpcCBudW1iZXI/ICovIAorCisJZm9yIChpID0gMDsgaSA8IGZ3LT5zaXplOyBpICs9IHBhY2tldF9zaXplKSB7CisJCQlpZiAoaSA+IDApCisJCQkJcGFja2V0X3NpemUgPSAweDM5OworCQkJZndfZGF0YSA9ICh1OCAqKShmdy0+ZGF0YSArIGkpOworCQkJZGxlbiA9ICgoaSArIHBhY2tldF9zaXplKSA+IGZ3LT5zaXplKQorCQkJCT8gKGZ3LT5zaXplIC0gaSkgOiBwYWNrZXRfc2l6ZTsKKwkJCXJldCB8PSBpdDkxM3hfaW8odWRldiwgV1JJVEVfREFUQSwgREVWXzAsCisJCQkJQ01EX1NDQVRURVJfV1JJVEUsIDAsIDAsIGZ3X2RhdGEsIGRsZW4pOworCQkJdWRlbGF5KDEwMDApOworCX0KKworCXJldCB8PSBpdDkxM3hfaW8odWRldiwgV1JJVEVfQ01ELCBERVZfMCwKKwkJCUNNRF9CT09ULCAwLCAwLCBOVUxMLCAwKTsKKworCW1zbGVlcCgxMDApOworCisJaWYgKHJldCA8IDApCisJCWluZm8oIkZSTSBGaXJtd2FyZSBEb3dubG9hZCBGYWlsZWQgKCUwNHgpIiAsIHJldCk7CisJZWxzZQorCQlpbmZvKCJGUk0gRmlybXdhcmUgRG93bmxvYWQgQ29tcGxldGVkIC0gUmVzZXR0aW5nIERldmljZSIpOworCisJcmV0IHw9IGl0OTEzeF9yZXR1cm5fc3RhdHVzKHVkZXYpOworCisJbXNsZWVwKDMwKTsKKworCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCAgSTJDX0NMSywgSTJDX0NMS180MDApOworCisJLyogVHVuZXIgZnVuY3Rpb24gKi8KKwlpZiAoaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUpCisJCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wX0RNT0QgLCAweGVjNGMsIDB4YTApOworCisJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsICBQQURPRFBVLCAweDApOworCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCAgQUdDX09fRCwgMHgwKTsKKwlpZiAoaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUpIHsKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzEsICBQQURPRFBVLCAweDApOworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMSwgIEFHQ19PX0QsIDB4MCk7CisJfQorCisJcmV0dXJuIChyZXQgPCAwKSA/IC1FTk9ERVYgOiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9uYW1lKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJY29uc3QgY2hhciAqZGVzYyA9IGFkYXAtPmRldi0+ZGVzYy0+bmFtZTsKKwljaGFyICpmZV9uYW1lW10gPSB7Il8xIiwgIl8yIiwgIl8zIiwgIl80In07CisJY2hhciAqbmFtZSA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbmZvLm5hbWU7CisKKwlzdHJsY3B5KG5hbWUsIGRlc2MsIDEyOCk7CisJc3RybGNhdChuYW1lLCBmZV9uYW1lW2FkYXAtPmlkXSwgMTI4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGFkYXAtPmRldi0+dWRldjsKKwlpbnQgcmV0ID0gMDsKKwl1OCBhZGYgPSBpdDkxM3hfcmVhZF9yZWcodWRldiwgSU9fTVVYX1BPV0VSX0NMSyk7CisJdTggYWRhcF9hZGRyID0gSTJDX0JBU0VfQUREUiArIChhZGFwLT5pZCA8PCA1KTsKKwl1MTYgZXBfc2l6ZSA9IGFkYXAtPnByb3BzLmZlWzBdLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZTsKKwl1OCB0dW5lcl9pZCwgdHVuZXJfdHlwZTsKKworCWlmIChhZGFwLT5pZCA9PSAwKQorCQl0dW5lcl9pZCA9IGl0OTEzeF9jb25maWcudHVuZXJfaWRfMDsKKwllbHNlCisJCXR1bmVyX2lkID0gaXQ5MTN4X2NvbmZpZy50dW5lcl9pZF8xOworCisJLyogVE9ETyB3ZSBhbHdheXMgdXNlIElUOTEzNyBwb3NzaWJsZSByZWZlcmVuY2VzIGhlcmUqLworCS8qIERvY3VtZW50YXRpb24gc3VnZ2VzdHMgZG9uJ3QgY2FyZSAqLworCXN3aXRjaCAodHVuZXJfaWQpIHsKKwljYXNlIDB4NTE6CisJY2FzZSAweDUyOgorCWNhc2UgMHg2MDoKKwljYXNlIDB4NjE6CisJY2FzZSAweDYyOgorCWRlZmF1bHQ6CisJY2FzZSAweDM4OgorCQl0dW5lcl90eXBlID0gSVQ5MTM3OworCX0KKworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGl0OTEzeF9mZV9hdHRhY2gsCisJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCBhZGFwX2FkZHIsIGFkZiwgdHVuZXJfdHlwZSk7CisKKwlpZiAoYWRhcC0+aWQgPT0gMCAmJiBhZGFwLT5mZV9hZGFwWzBdLmZlKSB7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzBfRE1PRCwgTVAyX1NXX1JTVCwgMHgxKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMF9ETU9ELCBNUDJJRjJfU1dfUlNULCAweDEpOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDBfVFhfRU4sIDB4MGYpOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDBfVFhfTkFLLCAweDFiKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgRVAwX1RYX0VOLCAweDJmKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgRVA0X1RYX0xFTl9MU0IsCisJCQkJCWVwX3NpemUgJiAweGZmKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgRVA0X1RYX0xFTl9NU0IsIGVwX3NpemUgPj4gOCk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIEVQNF9NQVhfUEtULCAweDgwKTsKKwl9IGVsc2UgaWYgKGFkYXAtPmlkID09IDEgJiYgYWRhcC0+ZmVfYWRhcFswXS5mZSkgeworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDBfVFhfRU4sIDB4NmYpOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDVfVFhfTEVOX0xTQiwKKwkJCQkJZXBfc2l6ZSAmIDB4ZmYpOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDVfVFhfTEVOX01TQiwgZXBfc2l6ZSA+PiA4KTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgRVA1X01BWF9QS1QsIDB4ODApOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wX0RNT0QsIE1QMklGMl9FTiwgMHgxKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMV9ETU9ELCBNUDJJRl9TRVJJQUwsIDB4MSk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzEsIFRPUF9IT1NUQl9TRVJfTU9ERSwgMHgxKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMF9ETU9ELCBUU0lTX0VOQUJMRSwgMHgxKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMF9ETU9ELCBNUDJfU1dfUlNULCAweDApOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wX0RNT0QsIE1QMklGMl9TV19SU1QsIDB4MCk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzBfRE1PRCwgTVAySUYyX0hBTEZfUFNCLCAweDApOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wX0RNT0QsIE1QMklGX1NUT1BfRU4sIDB4MSk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzFfRE1PRCwgTVBFR19GVUxMX1NQRUVELCAweDApOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8xX0RNT0QsIE1QMklGX1NUT1BfRU4sIDB4MCk7CisJfSBlbHNlCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gaXQ5MTN4X25hbWUoYWRhcCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBEVkIgVVNCIERyaXZlciAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGl0OTEzeF9wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IGl0OTEzeF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWNtZF9jb3VudGVyID0gMDsKKwlpZiAoMCA9PSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsICZpdDkxM3hfcHJvcGVydGllcywKKwkJCQkgICAgIFRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKSkgeworCQlpbmZvKCJERVYgcmVnaXN0ZXJpbmcgZGV2aWNlIGRyaXZlciIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbmZvKCJERVYgaXQ5MTN4IEVycm9yIik7CisJcmV0dXJuIC1FTk9ERVY7CisKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGl0OTEzeF90YWJsZVtdID0geworCXsgVVNCX0RFVklDRShVU0JfVklEX0tXT1JMRF8yLCBVU0JfUElEX0tXT1JMRF9VQjQ5OV8yVF9UMDkpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSVRFVEVDSCwgVVNCX1BJRF9JVEVURUNIX0lUOTEzNSkgfSwKKwl7fQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpdDkxM3hfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgaXQ5MTN4X3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKKwkuZG93bmxvYWRfZmlybXdhcmUgPSBpdDkxM3hfZG93bmxvYWRfZmlybXdhcmUsCisJLmZpcm13YXJlID0gImR2Yi11c2ItaXQ5MTM3LTAxLmZ3IiwKKwkubm9fcmVjb25uZWN0ID0gMSwKKwkuc2l6ZV9vZl9wcml2ID0gc2l6ZW9mKHN0cnVjdCBpdDkxM3hfc3RhdGUpLAorCS5udW1fYWRhcHRlcnMgPSAyLAorCS5hZGFwdGVyID0geworCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSfAorCQkJCURWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkd8CisJCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGl0OTEzeF9zdHJlYW1pbmdfY3RybCwKKwkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzEsCisJCQkucGlkX2ZpbHRlciA9IGl0OTEzeF9waWRfZmlsdGVyLAorCQkJLnBpZF9maWx0ZXJfY3RybCAgPSBpdDkxM3hfcGlkX2ZpbHRlcl9jdHJsLAorCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBpdDkxM3hfZnJvbnRlbmRfYXR0YWNoLAorCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSA9IFVTQl9CVUxLLAorCQkJCS5jb3VudCA9IDEwLAorCQkJCS5lbmRwb2ludCA9IDB4MDQsCisJCQkJLnUgPSB7LyogS2VlcCBMb3cgaWYgUElEIGZpbHRlciBvbiAqLworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gMzU4NCwKKworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9fSwKKwkJfSwKKwkJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7eworCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVJ8CisJCQkJRFZCX1VTQl9BREFQX05FRURfUElEX0ZJTFRFUklOR3wKKwkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gaXQ5MTN4X3N0cmVhbWluZ19jdHJsLAorCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMSwKKwkJCS5waWRfZmlsdGVyID0gaXQ5MTN4X3BpZF9maWx0ZXIsCisJCQkucGlkX2ZpbHRlcl9jdHJsICA9IGl0OTEzeF9waWRfZmlsdGVyX2N0cmwsCisJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGl0OTEzeF9mcm9udGVuZF9hdHRhY2gsCisJCQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJCQkuc3RyZWFtID0geworCQkJCS50eXBlID0gVVNCX0JVTEssCisJCQkJLmNvdW50ID0gNSwKKwkJCQkuZW5kcG9pbnQgPSAweDA1LAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gMzU4NCwKKworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9fSwKKwkJfQorCX0sCisJLmlkZW50aWZ5X3N0YXRlICAgPSBpdDkxM3hfaWRlbnRpZnlfc3RhdGUsCisJLnJjLmNvcmUgPSB7CisJCS5wcm90b2NvbAk9IFJDX1RZUEVfTkVDLAorCQkubW9kdWxlX25hbWUJPSAiaXQ5MTN4IiwKKwkJLnJjX3F1ZXJ5CT0gaXQ5MTN4X3JjX3F1ZXJ5LAorCQkucmNfaW50ZXJ2YWwJPSBJVDkxM1hfUE9MTCwKKwkJLmFsbG93ZWRfcHJvdG9zCT0gUkNfVFlQRV9ORUMsCisJCS5yY19jb2Rlcwk9IFJDX01BUF9LV09STERfMzE1VSwKKwl9LAorCS5pMmNfYWxnbyAgICAgICAgID0gJml0OTEzeF9pMmNfYWxnbywKKwkubnVtX2RldmljZV9kZXNjcyA9IDIsCisJLmRldmljZXMgPSB7CisJCXsgICAiS3dvcmxkIFVCNDk5LTJUIFQwOShJVDkxMzcpIiwKKwkJCXsgJml0OTEzeF90YWJsZVswXSwgTlVMTCB9LAorCQkJfSwKKwkJeyAgICJJVEUgOTEzNSBHZW5lcmljIiwKKwkJCXsgJml0OTEzeF90YWJsZVsxXSwgTlVMTCB9LAorCQkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgaXQ5MTN4X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaXQ5MTN4IiwKKwkucHJvYmUJCT0gaXQ5MTN4X3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKKwkuaWRfdGFibGUJPSBpdDkxM3hfdGFibGUsCit9OworCisvKiBtb2R1bGUgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgX19pbml0IGl0OTEzeF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJml0OTEzeF9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXQ5MTN4X21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJml0OTEzeF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpdDkxM3hfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoaXQ5MTN4X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFsY29sbSBQcmllc3RsZXkgPHR2Ym94c3B5QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXQ5MTN4IFVTQiAyIERyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oIjEuMDciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbG1lZG0wNC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9sbWVkbTA0LmMKaW5kZXggMzdiMTQ2OS4uYjkyMjgyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9sbWVkbTA0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9sbWVkbTA0LmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKHN0LT51c2JfYnVmZmVyID09IE5VTEwpIHsKLQkJc3QtPnVzYl9idWZmZXIgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCk7CisJCXN0LT51c2JfYnVmZmVyID0ga21hbGxvYyg2NCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChzdC0+dXNiX2J1ZmZlciA9PSBOVUxMKSB7CiAJCQlpbmZvKCJNRU0gRXJyb3Igbm8gbWVtb3J5Iik7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE3NSw4ICsxNzUsOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCS8qIHRoZSByZWFkL3dyaXRlIGNhcHBlZCBhdCA1MTIgKi8KLQltZW1jcHkoYnVmZiwgd2J1ZiwgKHdsZW4gPiA1MTIpID8gNTEyIDogd2xlbik7CisJLyogdGhlIHJlYWQvd3JpdGUgY2FwcGVkIGF0IDY0ICovCisJbWVtY3B5KGJ1ZmYsIHdidWYsICh3bGVuIDwgNjQpID8gd2xlbiA6IDY0KTsKIAogCXJldCB8PSB1c2JfY2xlYXJfaGFsdChkLT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZC0+dWRldiwgMHgwMSkpOwogCkBAIC0xODYsOCArMTg2LDggQEAKIAogCXJldCB8PSB1c2JfY2xlYXJfaGFsdChkLT51ZGV2LCB1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgMHgwMSkpOwogCi0JcmV0IHw9IGxtZTI1MTBfYnVsa19yZWFkKGQtPnVkZXYsIGJ1ZmYsIChybGVuID4gNTEyKSA/Ci0JCQk1MTIgOiBybGVuICwgMHgwMSk7CisJcmV0IHw9IGxtZTI1MTBfYnVsa19yZWFkKGQtPnVkZXYsIGJ1ZmYsIChybGVuIDwgNjQpID8KKwkJCXJsZW4gOiA2NCAsIDB4MDEpOwogCiAJaWYgKHJsZW4gPiAwKQogCQltZW1jcHkocmJ1ZiwgYnVmZiwgcmxlbik7CkBAIC0zMzMsNyArMzMzLDcgQEAKIAlpZiAobG1lX2ludC0+bG1lX3VyYiA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQlsbWVfaW50LT5idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoYWRhcC0+ZGV2LT51ZGV2LCA1MDAwLCBHRlBfQVRPTUlDLAorCWxtZV9pbnQtPmJ1ZmZlciA9IHVzYl9hbGxvY19jb2hlcmVudChhZGFwLT5kZXYtPnVkZXYsIDEyOCwgR0ZQX0FUT01JQywKIAkJCQkJJmxtZV9pbnQtPmxtZV91cmItPnRyYW5zZmVyX2RtYSk7CiAKIAlpZiAobG1lX2ludC0+YnVmZmVyID09IE5VTEwpCkBAIC0zNDMsMTAgKzM0MywxMCBAQAogCQkJCWFkYXAtPmRldi0+dWRldiwKIAkJCQl1c2JfcmN2aW50cGlwZShhZGFwLT5kZXYtPnVkZXYsIDB4YSksCiAJCQkJbG1lX2ludC0+YnVmZmVyLAotCQkJCTQwOTYsCisJCQkJMTI4LAogCQkJCWxtZTI1MTBfaW50X3Jlc3BvbnNlLAogCQkJCWFkYXAsCi0JCQkJMTEpOworCQkJCTgpOwogCiAJbG1lX2ludC0+bG1lX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKQEAgLTU4MCw3ICs1ODAsNyBAQAogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CiAJc3RydWN0IGxtZTI1MTBfc3RhdGUgKnN0ID0gZC0+cHJpdjsKLQlzdGF0aWMgdTggb2J1Zls2NF0sIGlidWZbNTEyXTsKKwlzdGF0aWMgdTggb2J1Zls2NF0sIGlidWZbNjRdOwogCWludCBpLCByZWFkLCByZWFkX287CiAJdTE2IGxlbjsKIAl1OCBnYXRlID0gc3QtPmkyY19nYXRlOwpAQCAtNjIxLDcgKzYyMSw3IEBACiAJCQlsZW4gPSBtc2dbaV0ubGVuKzM7CiAJCX0KIAotCQlpZiAobG1lMjUxMF9tc2coZCwgb2J1ZiwgbGVuLCBpYnVmLCA1MTIpIDwgMCkgeworCQlpZiAobG1lMjUxMF9tc2coZCwgb2J1ZiwgbGVuLCBpYnVmLCA2NCkgPCAwKSB7CiAJCQlkZWJfaW5mbygxLCAiaTJjIHRyYW5zZmVyIGZhaWxlZC4iKTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CkBAIC05NDEsNyArOTQxLDcgQEAKIAljb25zdCBjaGFyICpkZXNjID0gYWRhcC0+ZGV2LT5kZXNjLT5uYW1lOwogCWNoYXIgKmZlX25hbWVbXSA9IHsiIiwgIiBMRyBURFFZLVAwMDFGIiwgIiBTSEFSUDpCUzJGN0haNzM5NSIsCiAJCQkJIiBTSEFSUDpCUzJGN0haMDE5NCJ9OwotCWNoYXIgKm5hbWUgPSBhZGFwLT5mZS0+b3BzLmluZm8ubmFtZTsKKwljaGFyICpuYW1lID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLmluZm8ubmFtZTsKIAogCXN0cmxjcHkobmFtZSwgZGVzYywgMTI4KTsKIAlzdHJsY2F0KG5hbWUsIGZlX25hbWVbc3QtPnR1bmVyX2NvbmZpZ10sIDEyOCk7CkBAIC05NTgsMTAgKzk1OCwxMCBAQAogCXN0LT5pMmNfdGFsa19vbm9mZiA9IDE7CiAKIAlzdC0+aTJjX2dhdGUgPSA0OwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA4Nl9hdHRhY2gsICZ0ZGExMDA4Nl9jb25maWcsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwODZfYXR0YWNoLCAmdGRhMTAwODZfY29uZmlnLAogCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlpZiAoYWRhcC0+ZmUpIHsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQlpbmZvKCJUVU4gRm91bmQgRnJvbnRlbmQgVERBMTAwODYiKTsKIAkJc3QtPmkyY190dW5lcl9nYXRlX3cgPSA0OwogCQlzdC0+aTJjX3R1bmVyX2dhdGVfciA9IDQ7CkBAIC05NzUsOSArOTc1LDkgQEAKIAl9CiAKIAlzdC0+aTJjX2dhdGUgPSA0OwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChzdHYwMjk5X2F0dGFjaCwgJnNoYXJwX3owMTk0X2NvbmZpZywKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChzdHYwMjk5X2F0dGFjaCwgJnNoYXJwX3owMTk0X2NvbmZpZywKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKLQlpZiAoYWRhcC0+ZmUpIHsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQlpbmZvKCJGRSBGb3VuZCBTdHYwMjk5Iik7CiAJCXN0LT5pMmNfdHVuZXJfZ2F0ZV93ID0gNDsKIAkJc3QtPmkyY190dW5lcl9nYXRlX3IgPSA1OwpAQCAtOTkxLDkgKzk5MSw5IEBACiAJfQogCiAJc3QtPmkyY19nYXRlID0gNTsKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goc3R2MDI4OF9hdHRhY2gsICZsbWVfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHN0djAyODhfYXR0YWNoLCAmbG1lX2NvbmZpZywKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKLQlpZiAoYWRhcC0+ZmUpIHsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQlpbmZvKCJGRSBGb3VuZCBTdHYwMjg4Iik7CiAJCXN0LT5pMmNfdHVuZXJfZ2F0ZV93ID0gNDsKIAkJc3QtPmkyY190dW5lcl9nYXRlX3IgPSA1OwpAQCAtMTAxMCwxNSArMTAxMCwxNSBAQAogCiAKIGVuZDoJaWYgKHJldCkgewotCQlpZiAoYWRhcC0+ZmUpIHsKLQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goYWRhcC0+ZmUpOwotCQkJYWRhcC0+ZmUgPSBOVUxMOworCQlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgeworCQkJZHZiX2Zyb250ZW5kX2RldGFjaChhZGFwLT5mZV9hZGFwWzBdLmZlKTsKKwkJCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBOVUxMOwogCQl9CiAJCWFkYXAtPmRldi0+cHJvcHMucmMuY29yZS5yY19jb2RlcyA9IE5VTEw7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWFkYXAtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkbTA0X2xtZTI1MTBfc2V0X3ZvbHRhZ2U7CisJYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZG0wNF9sbWUyNTEwX3NldF92b2x0YWdlOwogCXJldCA9IGxtZV9uYW1lKGFkYXApOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMDMxLDE3ICsxMDMxLDE3IEBACiAKIAlzd2l0Y2ggKHN0LT50dW5lcl9jb25maWcpIHsKIAljYXNlIFRVTkVSX0xHOgotCQlpZiAoZHZiX2F0dGFjaCh0ZGE4MjZ4X2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsCisJCWlmIChkdmJfYXR0YWNoKHRkYTgyNnhfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweGMwLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIDEpKQogCQkJcmV0ID0gc3QtPnR1bmVyX2NvbmZpZzsKIAkJYnJlYWs7CiAJY2FzZSBUVU5FUl9TNzM5NToKLQkJaWYgKGR2Yl9hdHRhY2goaXgyNTA1dl9hdHRhY2ggLCBhZGFwLT5mZSwgJmxtZV90dW5lciwKKwkJaWYgKGR2Yl9hdHRhY2goaXgyNTA1dl9hdHRhY2ggLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAmbG1lX3R1bmVyLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApKQogCQkJcmV0ID0gc3QtPnR1bmVyX2NvbmZpZzsKIAkJYnJlYWs7CiAJY2FzZSBUVU5FUl9TMDE5NDoKLQkJaWYgKGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2ggLCBhZGFwLT5mZSwgMHhjMCwKKwkJaWYgKGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2ggLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweGMwLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfT1BFUkExKSkKIAkJCXJldCA9IHN0LT50dW5lcl9jb25maWc7CiAJCWJyZWFrOwpAQCAtMTE0NSw2ICsxMTQ1LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUnwKIAkJCQlEVkJfVVNCX0FEQVBfTkVFRF9QSURfRklMVEVSSU5HfAogCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLApAQCAtMTE2Niw2ICsxMTY4LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KKwkJfX0sCiAJCX0KIAl9LAogCS5yYy5jb3JlID0gewpAQCAtMTE5Myw2ICsxMTk2LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUnwKIAkJCQlEVkJfVVNCX0FEQVBfTkVFRF9QSURfRklMVEVSSU5HfAogCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLApAQCAtMTIxNCw2ICsxMjE5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KKwkJfX0sCiAJCX0KIAl9LAogCS5yYy5jb3JlID0gewpAQCAtMTI0MSw3ICsxMjQ3LDcgQEAKIAl2b2lkICpidWZmZXIgPSBOVUxMOwogCiAJaWYgKGFkYXAgIT0gTlVMTCkgewotCQlsbWUyNTEwX2tpbGxfdXJiKCZhZGFwLT5zdHJlYW0pOworCQlsbWUyNTEwX2tpbGxfdXJiKCZhZGFwLT5mZV9hZGFwWzBdLnN0cmVhbSk7CiAJCWFkYXAtPmZlZWRjb3VudCA9IDA7CiAJfQogCkBAIC0xMjU1LDcgKzEyNjEsNyBAQAogCiAJaWYgKHN0LT5sbWVfdXJiICE9IE5VTEwpIHsKIAkJdXNiX2tpbGxfdXJiKHN0LT5sbWVfdXJiKTsKLQkJdXNiX2ZyZWVfY29oZXJlbnQoZC0+dWRldiwgNTAwMCwgc3QtPmJ1ZmZlciwKKwkJdXNiX2ZyZWVfY29oZXJlbnQoZC0+dWRldiwgMTI4LCBzdC0+YnVmZmVyLAogCQkJCSAgc3QtPmxtZV91cmItPnRyYW5zZmVyX2RtYSk7CiAJCWluZm8oIkludGVycnVwdCBTZXJ2aWNlIFN0b3BwZWQiKTsKIAl9CkBAIC0xMzA2LDUgKzEzMTIsNSBAQAogCiBNT0RVTEVfQVVUSE9SKCJNYWxjb2xtIFByaWVzdGxleSA8dHZib3hzcHlAZ21haWwuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJMTUUyNTEwKEMpIERWQi1TIFVTQjIuMCIpOwotTU9EVUxFX1ZFUlNJT04oIjEuODgiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjkwIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmMKaW5kZXggOTQ1Njc5Mi4uYTFlMTI4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9tOTIweC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguYwpAQCAtODYsMTIgKzg2LDEyIEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLm51bV9hZGFwdGVyczsgaSsrKQotCQlmbGFncyB8PSBkLT5hZGFwdGVyW2ldLnByb3BzLmNhcHM7CisJCWZsYWdzIHw9IGQtPmFkYXB0ZXJbaV0ucHJvcHMuZmVbMF0uY2FwczsKIAogCS8qIFNvbWUgZGV2aWNlcyhEcG9zaCkgbWlnaHQgY3Jhc2ggaWYgd2UgYXR0ZW1wdCB0b3VjaCBhdCBhbGwuICovCiAJaWYgKGZsYWdzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5udW1fYWRhcHRlcnM7IGkrKykgewotCQkJZXBpID0gZC0+YWRhcHRlcltpXS5wcm9wcy5zdHJlYW0uZW5kcG9pbnQgLSAweDgxOworCQkJZXBpID0gZC0+YWRhcHRlcltpXS5wcm9wcy5mZVswXS5zdHJlYW0uZW5kcG9pbnQgLSAweDgxOwogCiAJCQlpZiAoZXBpIDwgMCB8fCBlcGkgPj0gTTkyMDZfTUFYX0FEQVBURVJTKSB7CiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAibTkyMHg6IFVuZXhwZWN0ZWQgYWRhcHRlciBlbmRwb2ludCFcbiIpOwpAQCAtMjkyLDcgKzI5Miw3IEBACiAJc3RydWN0IG05MjB4X3N0YXRlICptID0gYWRhcC0+ZGV2LT5wcml2OwogCWludCBlbmFibGVkID0gbS0+ZmlsdGVyaW5nX2VuYWJsZWRbYWRhcC0+aWRdOwogCWludCBpLCByZXQgPSAwLCBmaWx0ZXIgPSAwOwotCWludCBlcCA9IGFkYXAtPnByb3BzLnN0cmVhbS5lbmRwb2ludDsKKwlpbnQgZXAgPSBhZGFwLT5wcm9wcy5mZVswXS5zdHJlYW0uZW5kcG9pbnQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTTkyMDZfTUFYX0ZJTFRFUlM7IGkrKykKIAkJaWYgKG0tPmZpbHRlcnNbYWRhcC0+aWRdW2ldID09IDgxOTIpCkBAIC01MDEsOSArNTAxLDEwIEBACiB7CiAJZGViKCIlc1xuIixfX2Z1bmNfXyk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsCi0JCQkJICAgJm05MjB4X210MzUyX2NvbmZpZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLAorCQkJCQkgJm05MjB4X210MzUyX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CkBAIC01MTMsOSArNTE0LDEwIEBACiB7CiAJZGViKCIlc1xuIixfX2Z1bmNfXyk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJICAgJm05MjB4X3RkYTEwMDQ2XzA4X2NvbmZpZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAorCQkJCQkgJm05MjB4X3RkYTEwMDQ2XzA4X2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CkBAIC01MjUsOSArNTI3LDEwIEBACiB7CiAJZGViKCIlc1xuIixfX2Z1bmNfXyk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJICAgJm05MjB4X3RkYTEwMDQ2XzBiX2NvbmZpZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAorCQkJCQkgJm05MjB4X3RkYTEwMDQ2XzBiX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CkBAIC01MzcsNyArNTQwLDcgQEAKIHsKIAlkZWIoIiVzXG4iLF9fZnVuY19fKTsKIAotCWlmIChkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJm05MjB4X3F0MTAxMF9jb25maWcpID09IE5VTEwpCisJaWYgKGR2Yl9hdHRhY2gocXQxMDEwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsICZtOTIweF9xdDEwMTBfY29uZmlnKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiAwOwpAQCAtNTQ3LDcgKzU1MCw3IEBACiB7CiAJZGViKCIlc1xuIixfX2Z1bmNfXyk7CiAKLQlpZiAoZHZiX2F0dGFjaCh0ZGE4Mjd4X2F0dGFjaCwgYWRhcC0+ZmUsIDB4NjAsICZhZGFwLT5kZXYtPmkyY19hZGFwLCBOVUxMKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKHRkYTgyN3hfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgTlVMTCkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXR1cm4gMDsKQEAgLTU1Nyw3ICs1NjAsNyBAQAogewogCWRlYigiJXNcbiIsX19mdW5jX18pOwogCi0JaWYgKGR2Yl9hdHRhY2godGRhODI3eF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgTlVMTCkgPT0gTlVMTCkKKwlpZiAoZHZiX2F0dGFjaCh0ZGE4Mjd4X2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIE5VTEwpID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIDA7CkBAIC01NjUsNyArNTY4LDcgQEAKIAogc3RhdGljIGludCBtOTIweF9mbWQxMjE2bWVfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JZHZiX2F0dGFjaChzaW1wbGVfdHVuZXJfYXR0YWNoLCBhZGFwLT5mZSwKKwlkdmJfYXR0YWNoKHNpbXBsZV90dW5lcl9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDYxLAogCQkgICBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMpOwogCXJldHVybiAwOwpAQCAtODA3LDYgKzgxMCw5IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtODI3LDYgKzgzMyw3IEBACiAJCQkJfQogCQkJfQogCQl9LAorCQl9fSwKIAl9fSwKIAkuaTJjX2FsZ28gICAgICAgICA9ICZtOTIweF9pMmNfYWxnbywKIApAQCAtODUxLDYgKzg1OCw5IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtODcxLDYgKzg4MSw3IEBACiAJCQkJfQogCQkJfQogCQl9LAorCQl9fSwKIAl9fSwKIAkuaTJjX2FsZ28gICAgICAgICA9ICZtOTIweF9pMmNfYWxnbywKIApAQCAtOTEwLDYgKzkyMSw5IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMiwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtOTI5LDcgKzk0MywxMSBAQAogCQkJCQkgLmJ1ZmZlcnNpemUgPSA1MTIsCiAJCQkJIH0KIAkJCX0KKwkJfX0sCiAJCX19LHsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7eworCiAJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwKIAkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCkBAIC05NDksNiArOTY3LDcgQEAKIAkJCQkJIC5idWZmZXJzaXplID0gNTEyLAogCQkJCSB9CiAJCQl9CisJCX19LAogCQl9LAogCX19LAogCS5pMmNfYWxnbyAgICAgICAgID0gJm05MjB4X2kyY19hbGdvLApAQCAtOTc0LDYgKzk5Myw4IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJLyogSGFyZHdhcmUgcGlkIGZpbHRlcnMgZG9uJ3Qgd29yayB3aXRoIHRoaXMgZGV2aWNlL2Zpcm13YXJlICovCiAKIAkJLmZyb250ZW5kX2F0dGFjaCAgPSBtOTIweF9tdDM1Ml9mcm9udGVuZF9hdHRhY2gsCkBAIC05ODksNiArMTAxMCw3IEBACiAJCQkJIH0KIAkJCX0KIAkJfSwKKwkJfX0sCiAJfX0sCiAJLmkyY19hbGdvICAgICAgICAgPSAmbTkyMHhfaTJjX2FsZ28sCiAKQEAgLTEwMTksNiArMTA0MSw5IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtMTA0MSw2ICsxMDY2LDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0sCisJCX19LAogCX0gfSwKIAkuaTJjX2FsZ28gICAgICAgICA9ICZtOTIweF9pMmNfYWxnbywKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1kZW1vZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1kZW1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjU4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWRlbW9kLmMKQEAgLTAsMCArMSw2MTQgQEAKKy8qCisgKiAgbXhsMTExc2YtZGVtb2QuYyAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRiBEVkItVCBkZW1vZHVsYXRvcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAibXhsMTExc2YtZGVtb2QuaCIKKyNpbmNsdWRlICJteGwxMTFzZi1yZWcuaCIKKworLyogZGVidWcgKi8KK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2RfZGVidWc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIG14bDExMXNmX2RlbW9kX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9aW5mbyAob3ItYWJsZSkpLiIpOworCisjZGVmaW5lIG14bF9kYmcoZm10LCBhcmcuLi4pIFwKKwlpZiAobXhsMTExc2ZfZGVtb2RfZGVidWcpIFwKKwkJbXhsX3ByaW50ayhLRVJOX0RFQlVHLCBmbXQsICMjYXJnKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlIHsKKwlzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKm14bF9zdGF0ZTsKKworCXN0cnVjdCBteGwxMTFzZl9kZW1vZF9jb25maWcgKmNmZzsKKworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZmU7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCSAgIHU4IGFkZHIsIHU4ICpkYXRhKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+cmVhZF9yZWcpID8KKwkJc3RhdGUtPmNmZy0+cmVhZF9yZWcoc3RhdGUtPm14bF9zdGF0ZSwgYWRkciwgZGF0YSkgOgorCQktRUlOVkFMOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX3dyaXRlX3JlZyhzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCSAgICB1OCBhZGRyLCB1OCBkYXRhKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+d3JpdGVfcmVnKSA/CisJCXN0YXRlLT5jZmctPndyaXRlX3JlZyhzdGF0ZS0+bXhsX3N0YXRlLCBhZGRyLCBkYXRhKSA6CisJCS1FSU5WQUw7Cit9CisKK3N0YXRpYworaW50IG14bDExMXNmX2RlbW9kX3Byb2dyYW1fcmVncyhzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCXN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvICpjdHJsX3JlZ19pbmZvKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+cHJvZ3JhbV9yZWdzKSA/CisJCXN0YXRlLT5jZmctPnByb2dyYW1fcmVncyhzdGF0ZS0+bXhsX3N0YXRlLCBjdHJsX3JlZ19pbmZvKSA6CisJCS1FSU5WQUw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVFBTICovCisKK3N0YXRpYworaW50IG14bDF4MXNmX2RlbW9kX2dldF90cHNfY29kZV9yYXRlKHN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUsCisJCQkJICAgICBmZV9jb2RlX3JhdGVfdCAqY29kZV9yYXRlKQoreworCXU4IHZhbDsKKwlpbnQgcmV0ID0gbXhsMTExc2ZfZGVtb2RfcmVhZF9yZWcoc3RhdGUsIFY2X0NPREVfUkFURV9UUFNfUkVHLCAmdmFsKTsKKwkvKiBiaXQ8MjowPiAtIDAwMDoxLzIsIDAwMToyLzMsIDAxMDozLzQsIDAxMTo1LzYsIDEwMDo3LzggKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoICh2YWwgJiBWNl9DT0RFX1JBVEVfVFBTX01BU0spIHsKKwljYXNlIDA6CisJCSpjb2RlX3JhdGUgPSBGRUNfMV8yOworCQlicmVhazsKKwljYXNlIDE6CisJCSpjb2RlX3JhdGUgPSBGRUNfMl8zOworCQlicmVhazsKKwljYXNlIDI6CisJCSpjb2RlX3JhdGUgPSBGRUNfM180OworCQlicmVhazsKKwljYXNlIDM6CisJCSpjb2RlX3JhdGUgPSBGRUNfNV82OworCQlicmVhazsKKwljYXNlIDQ6CisJCSpjb2RlX3JhdGUgPSBGRUNfN184OworCQlicmVhazsKKwl9CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYworaW50IG14bDF4MXNmX2RlbW9kX2dldF90cHNfY29uc3RlbGxhdGlvbihzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCQkgZmVfbW9kdWxhdGlvbl90ICpjb25zdGVsbGF0aW9uKQoreworCXU4IHZhbDsKKwlpbnQgcmV0ID0gbXhsMTExc2ZfZGVtb2RfcmVhZF9yZWcoc3RhdGUsIFY2X01PRE9SREVSX1RQU19SRUcsICZ2YWwpOworCS8qIENvbnN0ZWxsYXRpb24sIDAwIDogUVBTSywgMDEgOiAxNlFBTSwgMTA6NjRRQU0gKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoICgodmFsICYgVjZfUEFSQU1fQ09OU1RFTExBVElPTl9NQVNLKSA+PiA0KSB7CisJY2FzZSAwOgorCQkqY29uc3RlbGxhdGlvbiA9IFFQU0s7CisJCWJyZWFrOworCWNhc2UgMToKKwkJKmNvbnN0ZWxsYXRpb24gPSBRQU1fMTY7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKmNvbnN0ZWxsYXRpb24gPSBRQU1fNjQ7CisJCWJyZWFrOworCX0KK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19ndWFyZF9mZnRfbW9kZShzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCQkgIGZlX3RyYW5zbWl0X21vZGVfdCAqZmZ0X21vZGUpCit7CisJdTggdmFsOworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfTU9ERV9UUFNfUkVHLCAmdmFsKTsKKwkvKiBGRlQgTW9kZSwgMDA6MkssIDAxOjhLLCAxMDo0SyAqLworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlzd2l0Y2ggKCh2YWwgJiBWNl9QQVJBTV9GRlRfTU9ERV9NQVNLKSA+PiAyKSB7CisJY2FzZSAwOgorCQkqZmZ0X21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV8ySzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkqZmZ0X21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV84SzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqZmZ0X21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV80SzsKKwkJYnJlYWs7CisJfQorZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMKK2ludCBteGwxeDFzZl9kZW1vZF9nZXRfdHBzX2d1YXJkX2ludGVydmFsKHN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUsCisJCQkJCSAgZmVfZ3VhcmRfaW50ZXJ2YWxfdCAqZ3VhcmQpCit7CisJdTggdmFsOworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfQ1BfVFBTX1JFRywgJnZhbCk7CisJLyogMDA6MS8zMiwgMDE6MS8xNiwgMTA6MS84LCAxMToxLzQgKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoICgodmFsICYgVjZfUEFSQU1fR0lfTUFTSykgPj4gNCkgeworCWNhc2UgMDoKKwkJKmd1YXJkID0gR1VBUkRfSU5URVJWQUxfMV8zMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkqZ3VhcmQgPSBHVUFSRF9JTlRFUlZBTF8xXzE2OworCQlicmVhazsKKwljYXNlIDI6CisJCSpndWFyZCA9IEdVQVJEX0lOVEVSVkFMXzFfODsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkqZ3VhcmQgPSBHVUFSRF9JTlRFUlZBTF8xXzQ7CisJCWJyZWFrOworCX0KK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19oaWVyYXJjaHkoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgIGZlX2hpZXJhcmNoeV90ICpoaWVyYXJjaHkpCit7CisJdTggdmFsOworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfVFBTX0hJRVJBQ0hZX1JFRywgJnZhbCk7CisJLyogYml0PDY6ND4gLSAwMDA6Tm9uIGhpZXJhcmNoeSwgMDAxOjEsIDAxMDoyLCAwMTE6NCAqLworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlzd2l0Y2ggKCh2YWwgJiBWNl9UUFNfSElFUkFSQ0hZX0lORk9fTUFTSykgPj4gNikgeworCWNhc2UgMDoKKwkJKmhpZXJhcmNoeSA9IEhJRVJBUkNIWV9OT05FOworCQlicmVhazsKKwljYXNlIDE6CisJCSpoaWVyYXJjaHkgPSBISUVSQVJDSFlfMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqaGllcmFyY2h5ID0gSElFUkFSQ0hZXzI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJKmhpZXJhcmNoeSA9IEhJRVJBUkNIWV80OworCQlicmVhazsKKwl9CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogTE9DS1MgKi8KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3N5bmNfbG9ja19zdGF0dXMoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSwKKwkJCQkJaW50ICpzeW5jX2xvY2spCit7CisJdTggdmFsID0gMDsKKwlpbnQgcmV0ID0gbXhsMTExc2ZfZGVtb2RfcmVhZF9yZWcoc3RhdGUsIFY2X1NZTkNfTE9DS19SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKnN5bmNfbG9jayA9ICh2YWwgJiBTWU5DX0xPQ0tfTUFTSykgPj4gNDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3JzX2xvY2tfc3RhdHVzKHN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUsCisJCQkJICAgICAgaW50ICpyc19sb2NrKQoreworCXU4IHZhbCA9IDA7CisJaW50IHJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9SU19MT0NLX0RFVF9SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKnJzX2xvY2sgPSAodmFsICYgUlNfTE9DS19ERVRfTUFTSykgPj4gMzsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19sb2NrX3N0YXR1cyhzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCSAgICAgICBpbnQgKnRwc19sb2NrKQoreworCXU4IHZhbCA9IDA7CisJaW50IHJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9UUFNfTE9DS19SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKnRwc19sb2NrID0gKHZhbCAmIFY2X1BBUkFNX1RQU19MT0NLX01BU0spID4+IDY7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYworaW50IG14bDF4MXNmX2RlbW9kX2dldF9mZWNfbG9ja19zdGF0dXMoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgICAgaW50ICpmZWNfbG9jaykKK3sKKwl1OCB2YWwgPSAwOworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfSVJRX1NUQVRVU19SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKmZlY19sb2NrID0gKHZhbCAmIElSUV9NQVNLX0ZFQ19MT0NLKSA+PiA0OworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCisjaWYgMAorc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X2NwX2xvY2tfc3RhdHVzKHN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUsCisJCQkJICAgICAgaW50ICpjcF9sb2NrKQoreworCXU4IHZhbCA9IDA7CisJaW50IHJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9DUF9MT0NLX0RFVF9SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKmNwX2xvY2sgPSAodmFsICYgVjZfQ1BfTE9DS19ERVRfTUFTSykgPj4gMjsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG14bDF4MXNmX2RlbW9kX3Jlc2V0X2lycV9zdGF0dXMoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gbXhsMTExc2ZfZGVtb2Rfd3JpdGVfcmVnKHN0YXRlLCAweDBlLCAweGZmKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2Rfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtKQoreworCXN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCXN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvIHBoeV9wbGxfcGF0Y2hbXSA9IHsKKwkJezB4MDAsIDB4ZmYsIDB4MDF9LCAvKiBjaGFuZ2UgcGFnZSB0byAxICovCisJCXsweDQwLCAweGZmLCAweDA1fSwKKwkJezB4NDAsIDB4ZmYsIDB4MDF9LAorCQl7MHg0MSwgMHhmZiwgMHhjYX0sCisJCXsweDQxLCAweGZmLCAweGMwfSwKKwkJezB4MDAsIDB4ZmYsIDB4MDB9LCAvKiBjaGFuZ2UgcGFnZSB0byAwICovCisJCXswLCAgICAwLCAgICAwfQorCX07CisKKwlteGxfZGJnKCIoKSIpOworCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJcmV0ID0gZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcGFyYW0pOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJbXNsZWVwKDUwKTsKKwl9CisJcmV0ID0gbXhsMTExc2ZfZGVtb2RfcHJvZ3JhbV9yZWdzKHN0YXRlLCBwaHlfcGxsX3BhdGNoKTsKKwlteGxfZmFpbChyZXQpOworCW1zbGVlcCg1MCk7CisJcmV0ID0gbXhsMXgxc2ZfZGVtb2RfcmVzZXRfaXJxX3N0YXR1cyhzdGF0ZSk7CisJbXhsX2ZhaWwocmV0KTsKKwltc2xlZXAoMTAwKTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAwCisvKiByZXNldHMgVFMgUGFja2V0IGVycm9yIGNvdW50ICovCisvKiBBZnRlciBzZXR0aW5nIDd0aCBiaXQgb2YgVjVfUEVSX0NPVU5UX1JFU0VUX1JFRywgaXQgc2hvdWxkIGJlIHJlc2V0IHRvIDAuICovCitzdGF0aWMKK2ludCBteGwxeDFzZl9kZW1vZF9yZXNldF9wYWNrZXRfZXJyb3JfY291bnQoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfcmVnX2N0cmxfaW5mbyByZXNldF9wZXJfY291bnRbXSA9IHsKKwkJezB4MjAsIDB4MDEsIDB4MDF9LAorCQl7MHgyMCwgMHgwMSwgMHgwMH0sCisJCXswLCAgICAwLCAgICAwfQorCX07CisJcmV0dXJuIG14bDExMXNmX2RlbW9kX3Byb2dyYW1fcmVncyhzdGF0ZSwgcmVzZXRfcGVyX2NvdW50KTsKK30KKyNlbmRpZgorCisvKiByZXR1cm5zIFRTIFBhY2tldCBlcnJvciBjb3VudCAqLworLyogUEVSIENvdW50ID0gRkVDX1BFUl9DT1VOVCAqICgyICoqIChGRUNfUEVSX1NDQUxFICogNCkpICovCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqdWNibG9ja3MpCit7CisJc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiBmZWNfcGVyX2NvdW50LCBmZWNfcGVyX3NjYWxlOworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJKnVjYmxvY2tzID0gMDsKKworCS8qIEZFQ19QRVJfQ09VTlQgUmVnaXN0ZXIgKi8KKwlyZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfRkVDX1BFUl9DT1VOVF9SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlmZWNfcGVyX2NvdW50ID0gdmFsOworCisJLyogRkVDX1BFUl9TQ0FMRSBSZWdpc3RlciAqLworCXJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9GRUNfUEVSX1NDQUxFX1JFRywgJnZhbCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXZhbCAmPSBWNl9GRUNfUEVSX1NDQUxFX01BU0s7CisJdmFsICo9IDQ7CisKKwlmZWNfcGVyX3NjYWxlID0gMSA8PCB2YWw7CisKKwlmZWNfcGVyX2NvdW50ICo9IGZlY19wZXJfc2NhbGU7CisKKwkqdWNibG9ja3MgPSBmZWNfcGVyX2NvdW50OworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgTVhMMTExU0ZfREVNT0RfRU5BQkxFX0NBTENVTEFUSU9OUworLyogRklYTUU6IGxlYXZpbmcgdGhpcyBlbmFibGVkIGJyZWFrcyB0aGUgYnVpbGQgb24gc29tZSBhcmNoaXRlY3R1cmVzLAorICogYW5kIHdlIHNob3VsZG4ndCBoYXZlIGFueSBmbG9hdGluZyBwb2ludCBtYXRoIGluIHRoZSBrZXJuZWwsIGFueXdheS4KKyAqCisgKiBUaGVzZSBtYWNyb3MgbmVlZCB0byBiZSByZS13cml0dGVuLCBidXQgaXQncyBoYXJtbGVzcyB0byBzaW1wbHkKKyAqIHJldHVybiB6ZXJvIGZvciBub3cuICovCisjZGVmaW5lIENBTENVTEFURV9CRVIoYXZnX2Vycm9ycywgY291bnQpIFwKKwkoKHUzMikoYXZnX2Vycm9ycyAqIDQpLyhjb3VudCo2NCoxODgqOCkpCisjZGVmaW5lIENBTENVTEFURV9TTlIoZGF0YSkgXAorCSgodTMyKSgoMTAgKiAodTMyKWRhdGEgLyA2NCkgLSAyLjUpKQorI2Vsc2UKKyNkZWZpbmUgQ0FMQ1VMQVRFX0JFUihhdmdfZXJyb3JzLCBjb3VudCkgMAorI2RlZmluZSBDQUxDVUxBVEVfU05SKGRhdGEpIDAKKyNlbmRpZgorCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJlcikKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggdmFsMSwgdmFsMiwgdmFsMzsKKwlpbnQgcmV0OworCisJKmJlciA9IDA7CisKKwlyZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfUlNfQVZHX0VSUk9SU19MU0JfUkVHLCAmdmFsMSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfUlNfQVZHX0VSUk9SU19NU0JfUkVHLCAmdmFsMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfTl9BQ0NVTVVMQVRFX1JFRywgJnZhbDMpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwkqYmVyID0gQ0FMQ1VMQVRFX0JFUigodmFsMSB8ICh2YWwyIDw8IDgpKSwgdmFsMyk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2RfY2FsY19zbnIoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSwKKwkJCQkgICB1MTYgKnNucikKK3sKKwl1OCB2YWwxLCB2YWwyOworCWludCByZXQ7CisKKwkqc25yID0gMDsKKworCXJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9TTlJfUkJfTFNCX1JFRywgJnZhbDEpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMTExc2ZfZGVtb2RfcmVhZF9yZWcoc3RhdGUsIFY2X1NOUl9SQl9NU0JfUkVHLCAmdmFsMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCSpzbnIgPSBDQUxDVUxBVEVfU05SKHZhbDEgfCAoKHZhbDIgJiAweDAzKSA8PCA4KSk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2RfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc25yKQoreworCXN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9jYWxjX3NucihzdGF0ZSwgc25yKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJKnNuciAvPSAxMDsgLyogMC4xIGRCICovCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2RfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICAgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldCwgbG9ja2VkLCBjcl9sb2NrLCBzeW5jX2xvY2ssIGZlY19sb2NrOworCisJKnN0YXR1cyA9IDA7CisKKwlyZXQgPSBteGwxeDFzZl9kZW1vZF9nZXRfcnNfbG9ja19zdGF0dXMoc3RhdGUsICZsb2NrZWQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19sb2NrX3N0YXR1cyhzdGF0ZSwgJmNyX2xvY2spOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMXgxc2ZfZGVtb2RfZ2V0X3N5bmNfbG9ja19zdGF0dXMoc3RhdGUsICZzeW5jX2xvY2spOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMXgxc2ZfZGVtb2RfZ2V0X2ZlY19sb2NrX3N0YXR1cyhzdGF0ZSwgJmZlY19sb2NrKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJaWYgKGxvY2tlZCkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCWlmIChjcl9sb2NrKQorCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOworCWlmIChzeW5jX2xvY2spCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NZTkM7CisJaWYgKGZlY19sb2NrKSAvKiBmYWxzZSBwb3NpdGl2ZXM/ICovCisJCSpzdGF0dXMgfD0gRkVfSEFTX1ZJVEVSQkk7CisKKwlpZiAoKGxvY2tlZCkgJiYgKGNyX2xvY2spICYmIChzeW5jX2xvY2spKQorCQkqc3RhdHVzIHw9IEZFX0hBU19MT0NLOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkgICAgICAgdTE2ICpzaWduYWxfc3RyZW5ndGgpCit7CisJc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWZlX21vZHVsYXRpb25fdCBjb25zdGVsbGF0aW9uOworCXUxNiBzbnI7CisKKwlteGwxMTFzZl9kZW1vZF9jYWxjX3NucihzdGF0ZSwgJnNucik7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19jb25zdGVsbGF0aW9uKHN0YXRlLCAmY29uc3RlbGxhdGlvbik7CisKKwlzd2l0Y2ggKGNvbnN0ZWxsYXRpb24pIHsKKwljYXNlIFFQU0s6CisJCSpzaWduYWxfc3RyZW5ndGggPSAoc25yID49IDEzMDApID8KKwkJCW1pbig2NTUzNSwgc25yICogNDQpIDogc25yICogMzg7CisJCWJyZWFrOworCWNhc2UgUUFNXzE2OgorCQkqc2lnbmFsX3N0cmVuZ3RoID0gKHNuciA+PSAxNTAwKSA/CisJCQltaW4oNjU1MzUsIHNuciAqIDM4KSA6IHNuciAqIDMzOworCQlicmVhazsKKwljYXNlIFFBTV82NDoKKwkJKnNpZ25hbF9zdHJlbmd0aCA9IChzbnIgPj0gMjAwMCkgPworCQkJbWluKDY1NTM1LCBzbnIgKiAyOSkgOiBzbnIgKiAyNTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKnNpZ25hbF9zdHJlbmd0aCA9IDA7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCW14bF9kYmcoIigpIik7CisjaWYgMAorCXAtPmludmVyc2lvbiA9IC8qIEZJWE1FICovID8gSU5WRVJTSU9OX09OIDogSU5WRVJTSU9OX09GRjsKKyNlbmRpZgorCWlmIChmZS0+b3BzLnR1bmVyX29wcy5nZXRfYmFuZHdpZHRoKQorCQlmZS0+b3BzLnR1bmVyX29wcy5nZXRfYmFuZHdpZHRoKGZlLCAmcC0+dS5vZmRtLmJhbmR3aWR0aCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLmdldF9mcmVxdWVuY3kpCisJCWZlLT5vcHMudHVuZXJfb3BzLmdldF9mcmVxdWVuY3koZmUsICZwLT5mcmVxdWVuY3kpOworCW14bDF4MXNmX2RlbW9kX2dldF90cHNfY29kZV9yYXRlKHN0YXRlLCAmcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCk7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19jb2RlX3JhdGUoc3RhdGUsICZwLT51Lm9mZG0uY29kZV9yYXRlX0xQKTsKKwlteGwxeDFzZl9kZW1vZF9nZXRfdHBzX2NvbnN0ZWxsYXRpb24oc3RhdGUsICZwLT51Lm9mZG0uY29uc3RlbGxhdGlvbik7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19ndWFyZF9mZnRfbW9kZShzdGF0ZSwKKwkJCQkJICAgICAgJnAtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSk7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19ndWFyZF9pbnRlcnZhbChzdGF0ZSwKKwkJCQkJICAgICAgJnAtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCk7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19oaWVyYXJjaHkoc3RhdGUsCisJCQkJCSAmcC0+dS5vZmRtLmhpZXJhcmNoeV9pbmZvcm1hdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljCitpbnQgbXhsMTExc2ZfZGVtb2RfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCit7CisJdHVuZS0+bWluX2RlbGF5X21zID0gMTAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXhsMTExc2ZfZGVtb2RfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJbXhsX2RiZygiKCkiKTsKKwlrZnJlZShzdGF0ZSk7CisJZmUtPmRlbW9kdWxhdG9yX3ByaXYgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbXhsMTExc2ZfZGVtb2Rfb3BzID0geworCisJLmluZm8gPSB7CisJCS5uYW1lICAgICAgICAgICAgICAgPSAiTWF4TGluZWFyIE14TDExMVNGIERWQi1UIGRlbW9kdWxhdG9yIiwKKwkJLnR5cGUgICAgICAgICAgICAgICA9IEZFX09GRE0sCisJCS5mcmVxdWVuY3lfbWluICAgICAgPSAxNzcwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ICAgICAgPSA4NTgwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUgPSAxNjY2NjYsCisJCS5jYXBzID0gRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8CisJCQlGRV9DQU5fUUFNX0FVVE8gfAorCQkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPIHwgRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAorCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfCBGRV9DQU5fUkVDT1ZFUgorCX0sCisJLnJlbGVhc2UgICAgICAgICAgICAgID0gbXhsMTExc2ZfZGVtb2RfcmVsZWFzZSwKKyNpZiAwCisJLmluaXQgICAgICAgICAgICAgICAgID0gbXhsMTExc2ZfaW5pdCwKKwkuaTJjX2dhdGVfY3RybCAgICAgICAgPSBteGwxMTFzZl9pMmNfZ2F0ZV9jdHJsLAorI2VuZGlmCisJLnNldF9mcm9udGVuZCAgICAgICAgID0gbXhsMTExc2ZfZGVtb2Rfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgICAgICAgICA9IG14bDExMXNmX2RlbW9kX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgICAgPSBteGwxMTFzZl9kZW1vZF9nZXRfdHVuZV9zZXR0aW5ncywKKwkucmVhZF9zdGF0dXMgICAgICAgICAgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3N0YXR1cywKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBteGwxMTFzZl9kZW1vZF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9iZXIgICAgICAgICAgICAgPSBteGwxMTFzZl9kZW1vZF9yZWFkX2JlciwKKwkucmVhZF9zbnIgICAgICAgICAgICAgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyAgICAgICAgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3VjYmxvY2tzLAorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqbXhsMTExc2ZfZGVtb2RfYXR0YWNoKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqbXhsX3N0YXRlLAorCQkJCQkgICBzdHJ1Y3QgbXhsMTExc2ZfZGVtb2RfY29uZmlnICpjZmcpCit7CisJc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSA9IE5VTEw7CisKKwlteGxfZGJnKCIoKSIpOworCisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGF0ZS0+bXhsX3N0YXRlID0gbXhsX3N0YXRlOworCXN0YXRlLT5jZmcgPSBjZmc7CisKKwltZW1jcHkoJnN0YXRlLT5mZS5vcHMsICZteGwxMTFzZl9kZW1vZF9vcHMsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCisJc3RhdGUtPmZlLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKwlyZXR1cm4gJnN0YXRlLT5mZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG14bDExMXNmX2RlbW9kX2F0dGFjaCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTWF4TGluZWFyIE14TDExMVNGIERWQi1UIGRlbW9kdWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4xIik7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWRlbW9kLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWRlbW9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyNzA2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtZGVtb2QuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogIG14bDExMXNmLWRlbW9kLmggLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YgRFZCLVQgZGVtb2R1bGF0b3IKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX01YTDExMVNGX0RFTU9EX0hfXworI2RlZmluZSBfX01YTDExMVNGX0RFTU9EX0hfXworCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAibXhsMTExc2YuaCIKKworc3RydWN0IG14bDExMXNmX2RlbW9kX2NvbmZpZyB7CisJaW50ICgqcmVhZF9yZWcpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IGFkZHIsIHU4ICpkYXRhKTsKKwlpbnQgKCp3cml0ZV9yZWcpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IGFkZHIsIHU4IGRhdGEpOworCWludCAoKnByb2dyYW1fcmVncykoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCSAgICBzdHJ1Y3QgbXhsMTExc2ZfcmVnX2N0cmxfaW5mbyAqY3RybF9yZWdfaW5mbyk7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1VTQl9NWEwxMTFTRikgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfVVNCX01YTDExMVNGX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpteGwxMTFzZl9kZW1vZF9hdHRhY2goc3RydWN0IG14bDExMXNmX3N0YXRlICpteGxfc3RhdGUsCisJCQkJCSAgIHN0cnVjdCBteGwxMTFzZl9kZW1vZF9jb25maWcgKmNmZyk7CisjZWxzZQorc3RhdGljIGlubGluZQorc3RydWN0IGR2Yl9mcm9udGVuZCAqbXhsMTExc2ZfZGVtb2RfYXR0YWNoKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqbXhsX3N0YXRlLAorCQkJCQkgICBzdHJ1Y3QgbXhsMTExc2ZfZGVtb2RfY29uZmlnICpjZmcpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX0RWQl9VU0JfTVhMMTExU0YgKi8KKworI2VuZGlmIC8qIF9fTVhMMTExU0ZfREVNT0RfSF9fICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTIxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWdwaW8uYwpAQCAtMCwwICsxLDc2MyBAQAorLyoKKyAqICBteGwxMTFzZi1ncGlvLmMgLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm14bDExMXNmLWdwaW8uaCIKKyNpbmNsdWRlICJteGwxMTFzZi1pMmMuaCIKKyNpbmNsdWRlICJteGwxMTFzZi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTVhMX0dQSU9fTVVYX1JFR18wIDB4ODQKKyNkZWZpbmUgTVhMX0dQSU9fTVVYX1JFR18xIDB4ODkKKyNkZWZpbmUgTVhMX0dQSU9fTVVYX1JFR18yIDB4ODIKKworI2RlZmluZSBNWExfR1BJT19ESVJfSU5QVVQgIDAKKyNkZWZpbmUgTVhMX0dQSU9fRElSX09VVFBVVCAxCisKKworc3RhdGljIGludCBteGwxMTFzZl9zZXRfZ3BvX3N0YXRlKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IHBpbiwgdTggdmFsKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJbXhsX2RlYnVnX2FkdigiKCVkLCAlZCkiLCBwaW4sIHZhbCk7CisKKwlpZiAoKHBpbiA+IDApICYmIChwaW4gPCA4KSkgeworCQlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgMHgxOSwgJnRtcCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCQl0bXAgJj0gfigxIDw8IChwaW4gLSAxKSk7CisJCXRtcCB8PSAodmFsIDw8IChwaW4gLSAxKSk7CisJCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxOSwgdG1wKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJfSBlbHNlIGlmIChwaW4gPD0gMTApIHsKKwkJaWYgKHBpbiA9PSAwKQorCQkJcGluICs9IDc7CisJCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDMwLCAmdG1wKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJCXRtcCAmPSB+KDEgPDwgKHBpbiAtIDMpKTsKKwkJdG1wIHw9ICh2YWwgPDwgKHBpbiAtIDMpKTsKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCAweDMwLCB0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwl9IGVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9nZXRfZ3BpX3N0YXRlKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IHBpbiwgdTggKnZhbCkKK3sKKwlpbnQgcmV0OworCXU4IHRtcDsKKworCW14bF9kZWJ1ZygiKDB4JTAyeCkiLCBwaW4pOworCisJKnZhbCA9IDA7CisKKwlzd2l0Y2ggKHBpbikgeworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIDB4MjMsICZ0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJKnZhbCA9ICh0bXAgPj4gKHBpbiArIDQpKSAmIDB4MDE7CisJCWJyZWFrOworCWNhc2UgNDoKKwljYXNlIDU6CisJY2FzZSA2OgorCWNhc2UgNzoKKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIDB4MmYsICZ0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJKnZhbCA9ICh0bXAgPj4gcGluKSAmIDB4MDE7CisJCWJyZWFrOworCWNhc2UgODoKKwljYXNlIDk6CisJY2FzZSAxMDoKKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIDB4MjIsICZ0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJKnZhbCA9ICh0bXAgPj4gKHBpbiAtIDMpKSAmIDB4MDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOyAvKiBpbnZhbGlkIHBpbiAqLworCX0KK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IG14bF9ncGlvX2NmZyB7CisJdTggcGluOworCXU4IGRpcjsKKwl1OCB2YWw7Cit9OworCitzdGF0aWMgaW50IG14bDExMXNmX2NvbmZpZ19ncGlvX3BpbnMoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgIHN0cnVjdCBteGxfZ3Bpb19jZmcgKmdwaW9fY2ZnKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJbXhsX2RlYnVnX2FkdigiKCVkLCAlZCkiLCBncGlvX2NmZy0+cGluLCBncGlvX2NmZy0+ZGlyKTsKKworCXN3aXRjaCAoZ3Bpb19jZmctPnBpbikgeworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIE1YTF9HUElPX01VWF9SRUdfMCwgJnRtcCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCQl0bXAgJj0gfigxIDw8IChncGlvX2NmZy0+cGluICsgNCkpOworCQl0bXAgfD0gKGdwaW9fY2ZnLT5kaXIgPDwgKGdwaW9fY2ZnLT5waW4gKyA0KSk7CisJCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgTVhMX0dQSU9fTVVYX1JFR18wLCB0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJY2FzZSA3OgorCQlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgTVhMX0dQSU9fTVVYX1JFR18xLCAmdG1wKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJCXRtcCAmPSB+KDEgPDwgZ3Bpb19jZmctPnBpbik7CisJCXRtcCB8PSAoZ3Bpb19jZmctPmRpciA8PCBncGlvX2NmZy0+cGluKTsKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBNWExfR1BJT19NVVhfUkVHXzEsIHRtcCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCQlicmVhazsKKwljYXNlIDg6CisJY2FzZSA5OgorCWNhc2UgMTA6CisJCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBNWExfR1BJT19NVVhfUkVHXzIsICZ0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJdG1wICY9IH4oMSA8PCAoZ3Bpb19jZmctPnBpbiAtIDMpKTsKKwkJdG1wIHw9IChncGlvX2NmZy0+ZGlyIDw8IChncGlvX2NmZy0+cGluIC0gMykpOworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIE1YTF9HUElPX01VWF9SRUdfMiwgdG1wKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOyAvKiBpbnZhbGlkIHBpbiAqLworCX0KKworCXJldCA9IChNWExfR1BJT19ESVJfT1VUUFVUID09IGdwaW9fY2ZnLT5kaXIpID8KKwkJbXhsMTExc2Zfc2V0X2dwb19zdGF0ZShzdGF0ZSwKKwkJCQkgICAgICAgZ3Bpb19jZmctPnBpbiwgZ3Bpb19jZmctPnZhbCkgOgorCQlteGwxMTFzZl9nZXRfZ3BpX3N0YXRlKHN0YXRlLAorCQkJCSAgICAgICBncGlvX2NmZy0+cGluLCAmZ3Bpb19jZmctPnZhbCk7CisJbXhsX2ZhaWwocmV0KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9od19kb19zZXRfZ3BpbyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJCSAgIGludCBncGlvLCBpbnQgZGlyZWN0aW9uLCBpbnQgdmFsKQoreworCXN0cnVjdCBteGxfZ3Bpb19jZmcgZ3Bpb19jb25maWcgPSB7CisJCS5waW4gPSBncGlvLAorCQkuZGlyID0gZGlyZWN0aW9uLAorCQkudmFsID0gdmFsLAorCX07CisKKwlteGxfZGVidWcoIiglZCwgJWQsICVkKSIsIGdwaW8sIGRpcmVjdGlvbiwgdmFsKTsKKworCXJldHVybiBteGwxMTFzZl9jb25maWdfZ3Bpb19waW5zKHN0YXRlLCAmZ3Bpb19jb25maWcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUElOX01VWF9NUEVHX01PREVfTUFTSyAgICAgICAgICAweDQwICAgLyogMHgxNyA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9NUEVHX1BBUl9FTl9NQVNLICAgICAgICAweDAxICAgLyogMHgxOCA8MD4gKi8KKyNkZWZpbmUgUElOX01VWF9NUEVHX1NFUl9FTl9NQVNLICAgICAgICAweDAyICAgLyogMHgxOCA8MT4gKi8KKyNkZWZpbmUgUElOX01VWF9NUEdfSU5fTVVYX01BU0sgICAgICAgICAweDgwICAgLyogMHgzRCA8Nz4gKi8KKyNkZWZpbmUgUElOX01VWF9CVDY1Nl9FTkFCTEVfTUFTSyAgICAgICAweDA0ICAgLyogMHgxMiA8Mj4gKi8KKyNkZWZpbmUgUElOX01VWF9JMlNfRU5BQkxFX01BU0sgICAgICAgICAweDQwICAgLyogMHgxNSA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9TUElfTU9ERV9NQVNLICAgICAgICAgICAweDEwICAgLyogMHgzRCA8ND4gKi8KKyNkZWZpbmUgUElOX01VWF9NQ0xLX0VOX0NUUkxfTUFTSyAgICAgICAweDEwICAgLyogMHg4MiA8ND4gKi8KKyNkZWZpbmUgUElOX01VWF9NUFNZTl9FTl9DVFJMX01BU0sgICAgICAweDIwICAgLyogMHg4MiA8NT4gKi8KKyNkZWZpbmUgUElOX01VWF9NRFZBTF9FTl9DVFJMX01BU0sgICAgICAweDQwICAgLyogMHg4MiA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9NUEVSUl9FTl9DVFJMX01BU0sgICAgICAweDgwICAgLyogMHg4MiA8Nz4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzBfTUFTSyAgICAgICAgICAweDEwICAgLyogMHg4NCA8ND4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzFfTUFTSyAgICAgICAgICAweDIwICAgLyogMHg4NCA8NT4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzJfTUFTSyAgICAgICAgICAweDQwICAgLyogMHg4NCA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzNfTUFTSyAgICAgICAgICAweDgwICAgLyogMHg4NCA8Nz4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzRfTUFTSyAgICAgICAgICAweDEwICAgLyogMHg4OSA8ND4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzVfTUFTSyAgICAgICAgICAweDIwICAgLyogMHg4OSA8NT4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzZfTUFTSyAgICAgICAgICAweDQwICAgLyogMHg4OSA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzdfTUFTSyAgICAgICAgICAweDgwICAgLyogMHg4OSA8Nz4gKi8KKworaW50IG14bDExMXNmX2NvbmZpZ19waW5fbXV4X21vZGVzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJICBlbnVtIG14bDExMXNmX211eF9jb25maWcgcGluX211eF9jb25maWcpCit7CisJdTggcjEyLCByMTUsIHIxNywgcjE4LCByM0QsIHI4Miwgcjg0LCByODk7CisJaW50IHJldDsKKworCW14bF9kZWJ1ZygiKCVkKSIsIHBpbl9tdXhfY29uZmlnKTsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDE3LCAmcjE3KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDE4LCAmcjE4KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDEyLCAmcjEyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDE1LCAmcjE1KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDgyLCAmcjgyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDg0LCAmcjg0KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDg5LCAmcjg5KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDNELCAmcjNEKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoIChwaW5fbXV4X2NvbmZpZykgeworCWNhc2UgUElOX01VWF9UU19PVVRfUEFSQUxMRUw6CisJCS8qIG1wZWdfbW9kZSA9IDEgKi8KKwkJcjE3IHw9IFBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMSAqLworCQlyMTggfD0gUElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDAgKi8KKwkJcjE4ICY9IH5QSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDEgKi8KKwkJcjgyIHw9IFBJTl9NVVhfTUNMS19FTl9DVFJMX01BU0s7CisJCS8qIG1wZXJyX2VuX2N0cmwgPSAxICovCisJCXI4MiB8PSBQSU5fTVVYX01QRVJSX0VOX0NUUkxfTUFTSzsKKwkJLyogbWR2YWxfZW5fY3RybCA9IDEgKi8KKwkJcjgyIHw9IFBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMSAqLworCQlyODIgfD0gUElOX01VWF9NUFNZTl9FTl9DVFJMX01BU0s7CisJCS8qIG1kYXRfZW5fY3RybFszOjBdID0gMHhGICovCisJCXI4NCB8PSAweEYwOworCQkvKiBtZGF0X2VuX2N0cmxbNzo0XSA9IDB4RiAqLworCQlyODkgfD0gMHhGMDsKKwkJYnJlYWs7CisJY2FzZSBQSU5fTVVYX1RTX09VVF9TRVJJQUw6CisJCS8qIG1wZWdfbW9kZSA9IDEgKi8KKwkJcjE3IHw9IFBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAxICovCisJCXIxOCB8PSBQSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDEgKi8KKwkJcjgyIHw9IFBJTl9NVVhfTUNMS19FTl9DVFJMX01BU0s7CisJCS8qIG1wZXJyX2VuX2N0cmwgPSAxICovCisJCXI4MiB8PSBQSU5fTVVYX01QRVJSX0VOX0NUUkxfTUFTSzsKKwkJLyogbWR2YWxfZW5fY3RybCA9IDEgKi8KKwkJcjgyIHw9IFBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMSAqLworCQlyODIgfD0gUElOX01VWF9NUFNZTl9FTl9DVFJMX01BU0s7CisJCS8qIG1kYXRfZW5fY3RybFszOjBdID0gMHhGICovCisJCXI4NCB8PSAweEYwOworCQkvKiBtZGF0X2VuX2N0cmxbNzo0XSA9IDB4RiAqLworCQlyODkgfD0gMHhGMDsKKwkJYnJlYWs7CisJY2FzZSBQSU5fTVVYX0dQSU9fTU9ERToKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1NFUl9FTl9NQVNLOworCQkvKiBtcGdfaW5fbXV4ID0gMCAqLworCQlyM0QgJj0gflBJTl9NVVhfTVBHX0lOX01VWF9NQVNLOworCQkvKiBidDY1Nl9lbmFibGUgPSAwICovCisJCXIxMiAmPSB+UElOX01VWF9CVDY1Nl9FTkFCTEVfTUFTSzsKKwkJLyogaTJzX2VuYWJsZSA9IDAgKi8KKwkJcjE1ICY9IH5QSU5fTVVYX0kyU19FTkFCTEVfTUFTSzsKKwkJLyogc3BpX21vZGUgPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9TUElfTU9ERV9NQVNLOworCQkvKiBtY2xrX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NQ0xLX0VOX0NUUkxfTUFTSzsKKwkJLyogbXBlcnJfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01QRVJSX0VOX0NUUkxfTUFTSzsKKwkJLyogbWR2YWxfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01EVkFMX0VOX0NUUkxfTUFTSzsKKwkJLyogbXBzeW5fZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01QU1lOX0VOX0NUUkxfTUFTSzsKKwkJLyogbWRhdF9lbl9jdHJsWzM6MF0gPSAweDAgKi8KKwkJcjg0ICY9IDB4MEY7CisJCS8qIG1kYXRfZW5fY3RybFs3OjRdID0gMHgwICovCisJCXI4OSAmPSAweDBGOworCQlicmVhazsKKwljYXNlIFBJTl9NVVhfVFNfU0VSSUFMX0lOX01PREVfMDoKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAxICovCisJCXIxOCB8PSBQSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCWNhc2UgUElOX01VWF9UU19TRVJJQUxfSU5fTU9ERV8xOgorCQkvKiBtcGVnX21vZGUgPSAwICovCisJCXIxNyAmPSB+UElOX01VWF9NUEVHX01PREVfTUFTSzsKKwkJLyogbXBlZ19wYXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDEgKi8KKwkJcjE4IHw9IFBJTl9NVVhfTVBFR19TRVJfRU5fTUFTSzsKKwkJLyogbXBnX2luX211eCA9IDEgKi8KKwkJcjNEIHw9IFBJTl9NVVhfTVBHX0lOX01VWF9NQVNLOworCQkvKiBidDY1Nl9lbmFibGUgPSAwICovCisJCXIxMiAmPSB+UElOX01VWF9CVDY1Nl9FTkFCTEVfTUFTSzsKKwkJLyogaTJzX2VuYWJsZSA9IDAgKi8KKwkJcjE1ICY9IH5QSU5fTVVYX0kyU19FTkFCTEVfTUFTSzsKKwkJLyogc3BpX21vZGUgPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9TUElfTU9ERV9NQVNLOworCQkvKiBtY2xrX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NQ0xLX0VOX0NUUkxfTUFTSzsKKwkJLyogbXBlcnJfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01QRVJSX0VOX0NUUkxfTUFTSzsKKwkJLyogbWR2YWxfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01EVkFMX0VOX0NUUkxfTUFTSzsKKwkJLyogbXBzeW5fZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01QU1lOX0VOX0NUUkxfTUFTSzsKKwkJLyogbWRhdF9lbl9jdHJsWzM6MF0gPSAweDAgKi8KKwkJcjg0ICY9IDB4MEY7CisJCS8qIG1kYXRfZW5fY3RybFs3OjRdID0gMHgwICovCisJCXI4OSAmPSAweDBGOworCQlicmVhazsKKwljYXNlIFBJTl9NVVhfVFNfU1BJX0lOX01PREVfMToKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAxICovCisJCXIxOCB8PSBQSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAxICovCisJCXIzRCB8PSBQSU5fTVVYX01QR19JTl9NVVhfTUFTSzsKKwkJLyogYnQ2NTZfZW5hYmxlID0gMCAqLworCQlyMTIgJj0gflBJTl9NVVhfQlQ2NTZfRU5BQkxFX01BU0s7CisJCS8qIGkyc19lbmFibGUgPSAxICovCisJCXIxNSB8PSBQSU5fTVVYX0kyU19FTkFCTEVfTUFTSzsKKwkJLyogc3BpX21vZGUgPSAxICovCisJCXIzRCB8PSBQSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCWNhc2UgUElOX01VWF9UU19TUElfSU5fTU9ERV8wOgorCQkvKiBtcGVnX21vZGUgPSAwICovCisJCXIxNyAmPSB+UElOX01VWF9NUEVHX01PREVfTUFTSzsKKwkJLyogbXBlZ19wYXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDEgKi8KKwkJcjE4IHw9IFBJTl9NVVhfTVBFR19TRVJfRU5fTUFTSzsKKwkJLyogbXBnX2luX211eCA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX01QR19JTl9NVVhfTUFTSzsKKwkJLyogYnQ2NTZfZW5hYmxlID0gMCAqLworCQlyMTIgJj0gflBJTl9NVVhfQlQ2NTZfRU5BQkxFX01BU0s7CisJCS8qIGkyc19lbmFibGUgPSAxICovCisJCXIxNSB8PSBQSU5fTVVYX0kyU19FTkFCTEVfTUFTSzsKKwkJLyogc3BpX21vZGUgPSAxICovCisJCXIzRCB8PSBQSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCWNhc2UgUElOX01VWF9UU19QQVJBTExFTF9JTjoKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMSAqLworCQlyMTggfD0gUElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDAgKi8KKwkJcjE4ICY9IH5QSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCWNhc2UgUElOX01VWF9CVDY1Nl9JMlNfTU9ERToKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1NFUl9FTl9NQVNLOworCQkvKiBtcGdfaW5fbXV4ID0gMCAqLworCQlyM0QgJj0gflBJTl9NVVhfTVBHX0lOX01VWF9NQVNLOworCQkvKiBidDY1Nl9lbmFibGUgPSAxICovCisJCXIxMiB8PSBQSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMSAqLworCQlyMTUgfD0gUElOX01VWF9JMlNfRU5BQkxFX01BU0s7CisJCS8qIHNwaV9tb2RlID0gMCAqLworCQlyM0QgJj0gflBJTl9NVVhfU1BJX01PREVfTUFTSzsKKwkJLyogbWNsa19lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTUNMS19FTl9DVFJMX01BU0s7CisJCS8qIG1wZXJyX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NUEVSUl9FTl9DVFJMX01BU0s7CisJCS8qIG1kdmFsX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NRFZBTF9FTl9DVFJMX01BU0s7CisJCS8qIG1wc3luX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NUFNZTl9FTl9DVFJMX01BU0s7CisJCS8qIG1kYXRfZW5fY3RybFszOjBdID0gMHgwICovCisJCXI4NCAmPSAweDBGOworCQkvKiBtZGF0X2VuX2N0cmxbNzo0XSA9IDB4MCAqLworCQlyODkgJj0gMHgwRjsKKwkJYnJlYWs7CisJY2FzZSBQSU5fTVVYX0RFRkFVTFQ6CisJZGVmYXVsdDoKKwkJLyogbXBlZ19tb2RlID0gMSAqLworCQlyMTcgfD0gUElOX01VWF9NUEVHX01PREVfTUFTSzsKKwkJLyogbXBlZ19wYXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDAgKi8KKwkJcjE4ICY9IH5QSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCX0KKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxNywgcjE3KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxOCwgcjE4KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxMiwgcjEyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxNSwgcjE1KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHg4MiwgcjgyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHg4NCwgcjg0KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHg4OSwgcjg5KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgzRCwgcjNEKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaHdfc2V0X2dwaW8oc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgaW50IGdwaW8sIGludCB2YWwpCit7CisJcmV0dXJuIG14bDExMXNmX2h3X2RvX3NldF9ncGlvKHN0YXRlLCBncGlvLCBNWExfR1BJT19ESVJfT1VUUFVULCB2YWwpOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2h3X2dwaW9faW5pdGlhbGl6ZShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCXU4IGdwaW92YWwgPSAweDA3OyAvKiB3cml0ZSBwcm90ZWN0IGVuYWJsZWQsIHNpZ25hbCBMRURzIG9mZiAqLworCWludCBpLCByZXQ7CisKKwlteGxfZGVidWcoIigpIik7CisKKwlmb3IgKGkgPSAzOyBpIDwgODsgaSsrKSB7CisJCXJldCA9IG14bDExMXNmX2h3X3NldF9ncGlvKHN0YXRlLCBpLCAoZ3Bpb3ZhbCA+PiBpKSAmIDB4MDEpOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUENBOTUzNF9JMkNfQUREUiAoMHg0MCA+PiAxKQorc3RhdGljIGludCBwY2E5NTM0X3NldF9ncGlvKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBncGlvLCBpbnQgdmFsKQoreworCXU4IHdbMl0gPSB7IDEsIDAgfTsKKwl1OCByID0gMDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKKwkJeyAuYWRkciA9IFBDQTk1MzRfSTJDX0FERFIsCisJCSAgLmZsYWdzID0gMCwgLmJ1ZiA9IHcsIC5sZW4gPSAxIH0sCisJCXsgLmFkZHIgPSBQQ0E5NTM0X0kyQ19BRERSLAorCQkgIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gJnIsIC5sZW4gPSAxIH0sCisJfTsKKworCW14bF9kZWJ1ZygiKCVkLCAlZCkiLCBncGlvLCB2YWwpOworCisJLyogcmVhZCBjdXJyZW50IEdQSU8gbGV2ZWxzIGZyb20gZmxpcC1mbG9wICovCisJaTJjX3RyYW5zZmVyKCZzdGF0ZS0+ZC0+aTJjX2FkYXAsIG1zZywgMik7CisKKwkvKiBwcmVwYXJlIHdyaXRlIGJ1ZmZlciB3aXRoIGN1cnJlbnQgR1BJTyBsZXZlbHMgKi8KKwltc2dbMF0ubGVuID0gMjsKKyNpZiAwCisJd1swXSA9IDE7CisjZW5kaWYKKwl3WzFdID0gcjsKKworCS8qIGNsZWFyIHRoZSBkZXNpcmVkIEdQSU8gKi8KKwl3WzFdICY9IH4oMSA8PCBncGlvKTsKKworCS8qIHNldCB0aGUgZGVzaXJlZCBHUElPIHZhbHVlICovCisJd1sxXSB8PSAoKHZhbCA/IDEgOiAwKSA8PCBncGlvKTsKKworCS8qIHdyaXRlIG5ldyBHUElPIGxldmVscyB0byBmbGlwLWZsb3AgKi8KKwlpMmNfdHJhbnNmZXIoJnN0YXRlLT5kLT5pMmNfYWRhcCwgJm1zZ1swXSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2E5NTM0X2luaXRfcG9ydF9leHBhbmRlcihzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCXU4IHdbMl0gPSB7IDEsIDB4MDcgfTsgLyogd3JpdGUgcHJvdGVjdCBlbmFibGVkLCBzaWduYWwgTEVEcyBvZmYgKi8KKworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSBQQ0E5NTM0X0kyQ19BRERSLAorCQkuZmxhZ3MgPSAwLCAuYnVmID0gdywgLmxlbiA9IDIKKwl9OworCisJbXhsX2RlYnVnKCIoKSIpOworCisJaTJjX3RyYW5zZmVyKCZzdGF0ZS0+ZC0+aTJjX2FkYXAsICZtc2csIDEpOworCisJLyogY29uZmlndXJlIGFsbCBwaW5zIGFzIG91dHB1dHMgKi8KKwl3WzBdID0gMzsKKwl3WzFdID0gMDsKKworCWkyY190cmFuc2Zlcigmc3RhdGUtPmQtPmkyY19hZGFwLCAmbXNnLCAxKTsKKworCXJldHVybiAwOworfQorCitpbnQgbXhsMTExc2Zfc2V0X2dwaW8oc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgaW50IGdwaW8sIGludCB2YWwpCit7CisJbXhsX2RlYnVnKCIoJWQsICVkKSIsIGdwaW8sIHZhbCk7CisKKwlzd2l0Y2ggKHN0YXRlLT5ncGlvX3BvcnRfZXhwYW5kZXIpIHsKKwlkZWZhdWx0OgorCQlteGxfcHJpbnRrKEtFUk5fRVJSLAorCQkJICAgImdwaW9fcG9ydF9leHBhbmRlciB1bmRlZmluZWQsIGFzc3VtaW5nIFBDQTk1MzQiKTsKKwkJLyogZmFsbC10aHJ1ICovCisJY2FzZSBteGwxMTFzZl9QQ0E5NTM0OgorCQlyZXR1cm4gcGNhOTUzNF9zZXRfZ3BpbyhzdGF0ZSwgZ3BpbywgdmFsKTsKKwljYXNlIG14bDExMXNmX2dwaW9faHc6CisJCXJldHVybiBteGwxMTFzZl9od19zZXRfZ3BpbyhzdGF0ZSwgZ3BpbywgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfcHJvYmVfcG9ydF9leHBhbmRlcihzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCWludCByZXQ7CisJdTggdyA9IDE7CisJdTggciA9IDA7CisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsgLmZsYWdzID0gMCwgICAgICAgIC5idWYgPSAmdywgLmxlbiA9IDEgfSwKKwkJeyAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9ICZyLCAubGVuID0gMSB9LAorCX07CisKKwlteGxfZGVidWcoIigpIik7CisKKwltc2dbMF0uYWRkciA9IDB4NzAgPj4gMTsKKwltc2dbMV0uYWRkciA9IDB4NzAgPj4gMTsKKworCS8qIHJlYWQgY3VycmVudCBHUElPIGxldmVscyBmcm9tIGZsaXAtZmxvcCAqLworCXJldCA9IGkyY190cmFuc2Zlcigmc3RhdGUtPmQtPmkyY19hZGFwLCBtc2csIDIpOworCWlmIChyZXQgPT0gMikgeworCQlzdGF0ZS0+cG9ydF9leHBhbmRlcl9hZGRyID0gbXNnWzBdLmFkZHI7CisJCXN0YXRlLT5ncGlvX3BvcnRfZXhwYW5kZXIgPSBteGwxMTFzZl9QQ0E5NTM0OworCQlteGxfZGVidWcoImZvdW5kIHBvcnQgZXhwYW5kZXIgYXQgMHglMDJ4IiwKKwkJCSAgc3RhdGUtPnBvcnRfZXhwYW5kZXJfYWRkcik7CisJCXJldHVybiAwOworCX0KKworCW1zZ1swXS5hZGRyID0gMHg0MCA+PiAxOworCW1zZ1sxXS5hZGRyID0gMHg0MCA+PiAxOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKCZzdGF0ZS0+ZC0+aTJjX2FkYXAsIG1zZywgMik7CisJaWYgKHJldCA9PSAyKSB7CisJCXN0YXRlLT5wb3J0X2V4cGFuZGVyX2FkZHIgPSBtc2dbMF0uYWRkcjsKKwkJc3RhdGUtPmdwaW9fcG9ydF9leHBhbmRlciA9IG14bDExMXNmX1BDQTk1MzQ7CisJCW14bF9kZWJ1ZygiZm91bmQgcG9ydCBleHBhbmRlciBhdCAweCUwMngiLAorCQkJICBzdGF0ZS0+cG9ydF9leHBhbmRlcl9hZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCXN0YXRlLT5wb3J0X2V4cGFuZGVyX2FkZHIgPSAweGZmOworCXN0YXRlLT5ncGlvX3BvcnRfZXhwYW5kZXIgPSBteGwxMTFzZl9ncGlvX2h3OworCW14bF9kZWJ1ZygidXNpbmcgaGFyZHdhcmUgZ3BpbyIpOworCXJldHVybiAwOworfQorCitpbnQgbXhsMTExc2ZfaW5pdF9wb3J0X2V4cGFuZGVyKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJbXhsX2RlYnVnKCIoKSIpOworCisJaWYgKDB4MDAgPT0gc3RhdGUtPnBvcnRfZXhwYW5kZXJfYWRkcikKKwkJbXhsMTExc2ZfcHJvYmVfcG9ydF9leHBhbmRlcihzdGF0ZSk7CisKKwlzd2l0Y2ggKHN0YXRlLT5ncGlvX3BvcnRfZXhwYW5kZXIpIHsKKwlkZWZhdWx0OgorCQlteGxfcHJpbnRrKEtFUk5fRVJSLAorCQkJICAgImdwaW9fcG9ydF9leHBhbmRlciB1bmRlZmluZWQsIGFzc3VtaW5nIFBDQTk1MzQiKTsKKwkJLyogZmFsbC10aHJ1ICovCisJY2FzZSBteGwxMTFzZl9QQ0E5NTM0OgorCQlyZXR1cm4gcGNhOTUzNF9pbml0X3BvcnRfZXhwYW5kZXIoc3RhdGUpOworCWNhc2UgbXhsMTExc2ZfZ3Bpb19odzoKKwkJcmV0dXJuIG14bDExMXNmX2h3X2dwaW9faW5pdGlhbGl6ZShzdGF0ZSk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IG14bDExMXNmX2dwaW9fbW9kZV9zd2l0Y2goc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IG1vZGUpCit7CisvKglHUE86CisgKgkzIC0gQVRTQy9NSCMgICB8IDEgPSBBVFNDIHRyYW5zcG9ydCwgMCA9IE1IIHRyYW5zcG9ydCAgICAgIHwgZGVmYXVsdCAwCisgKgk0IC0gQVRTQ19SU1QjIyB8IDEgPSBBVFNDIGVuYWJsZSwgMCA9IEFUU0MgUmVzZXQgICAgICAgICAgIHwgZGVmYXVsdCAwCisgKgk1IC0gQVRTQ19FTiAgICB8IDEgPSBBVFNDIHBvd2VyIGVuYWJsZSwgMCA9IEFUU0MgcG93ZXIgb2ZmIHwgZGVmYXVsdCAwCisgKgk2IC0gTUhfUkVTRVQjICB8IDEgPSBNSCBlbmFibGUsIDAgPSBNSCBSZXNldCAgICAgICAgICAgICAgIHwgZGVmYXVsdCAwCisgKgk3IC0gTUhfRU4gICAgICB8IDEgPSBNSCBwb3dlciBlbmFibGUsIDAgPSBNSCBwb3dlciBvZmYgICAgIHwgZGVmYXVsdCAwCisgKi8KKwlteGxfZGVidWcoIiglZCkiLCBtb2RlKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTVhMMTExU0ZfR1BJT19NT0RfTUg6CisJCW14bDExMXNmX3NldF9ncGlvKHN0YXRlLCA0LCAwKTsKKwkJbXhsMTExc2Zfc2V0X2dwaW8oc3RhdGUsIDUsIDApOworCQltc2xlZXAoNTApOworCQlteGwxMTFzZl9zZXRfZ3BpbyhzdGF0ZSwgNywgMSk7CisJCW1zbGVlcCg1MCk7CisJCW14bDExMXNmX3NldF9ncGlvKHN0YXRlLCA2LCAxKTsKKwkJbXNsZWVwKDUwKTsKKworCQlteGwxMTFzZl9zZXRfZ3BpbyhzdGF0ZSwgMywgMCk7CisJCWJyZWFrOworCWNhc2UgTVhMMTExU0ZfR1BJT19NT0RfQVRTQzoKKwkJbXhsMTExc2Zfc2V0X2dwaW8oc3RhdGUsIDYsIDApOworCQlteGwxMTFzZl9zZXRfZ3BpbyhzdGF0ZSwgNywgMCk7CisJCW1zbGVlcCg1MCk7CisJCW14bDExMXNmX3NldF9ncGlvKHN0YXRlLCA1LCAxKTsKKwkJbXNsZWVwKDUwKTsKKwkJbXhsMTExc2Zfc2V0X2dwaW8oc3RhdGUsIDQsIDEpOworCQltc2xlZXAoNTApOworCQlteGwxMTFzZl9zZXRfZ3BpbyhzdGF0ZSwgMywgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIERWQlQgLyBTVEFOREJZICovCisJCW14bDExMXNmX2luaXRfcG9ydF9leHBhbmRlcihzdGF0ZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtZ3Bpby5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyMGY1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtZ3Bpby5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAgbXhsMTExc2YtZ3Bpby5oIC0gZHJpdmVyIGZvciB0aGUgTWF4TGluZWFyIE1YTDExMVNGCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX0RWQl9VU0JfTVhMMTExU0ZfR1BJT19IXworI2RlZmluZSBfRFZCX1VTQl9NWEwxMTFTRl9HUElPX0hfCisKKyNpbmNsdWRlICJteGwxMTFzZi5oIgorCitpbnQgbXhsMTExc2Zfc2V0X2dwaW8oc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgaW50IGdwaW8sIGludCB2YWwpOworaW50IG14bDExMXNmX2luaXRfcG9ydF9leHBhbmRlcihzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKTsKKworI2RlZmluZSBNWEwxMTFTRl9HUElPX01PRF9EVkJUCTAKKyNkZWZpbmUgTVhMMTExU0ZfR1BJT19NT0RfTUgJMQorI2RlZmluZSBNWEwxMTFTRl9HUElPX01PRF9BVFNDCTIKK2ludCBteGwxMTFzZl9ncGlvX21vZGVfc3dpdGNoKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCBtb2RlKTsKKworZW51bSBteGwxMTFzZl9tdXhfY29uZmlnIHsKKwlQSU5fTVVYX0RFRkFVTFQgPSAwLAorCVBJTl9NVVhfVFNfT1VUX1BBUkFMTEVMLAorCVBJTl9NVVhfVFNfT1VUX1NFUklBTCwKKwlQSU5fTVVYX0dQSU9fTU9ERSwKKwlQSU5fTVVYX1RTX1NFUklBTF9JTl9NT0RFXzAsCisJUElOX01VWF9UU19TRVJJQUxfSU5fTU9ERV8xLAorCVBJTl9NVVhfVFNfU1BJX0lOX01PREVfMCwKKwlQSU5fTVVYX1RTX1NQSV9JTl9NT0RFXzEsCisJUElOX01VWF9UU19QQVJBTExFTF9JTiwKKwlQSU5fTVVYX0JUNjU2X0kyU19NT0RFLAorfTsKKworaW50IG14bDExMXNmX2NvbmZpZ19waW5fbXV4X21vZGVzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJICBlbnVtIG14bDExMXNmX211eF9jb25maWcgcGluX211eF9jb25maWcpOworCisjZW5kaWYgLyogX0RWQl9VU0JfTVhMMTExU0ZfR1BJT19IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MzQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtaTJjLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qCisgKiAgbXhsMTExc2YtaTJjLmMgLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm14bDExMXNmLWkyYy5oIgorI2luY2x1ZGUgIm14bDExMXNmLmgiCisKKy8qIFNXLUkyQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNXX0kyQ19BRERSCQkweDFhCisjZGVmaW5lIFNXX0kyQ19FTgkJMHgwMgorI2RlZmluZSBTV19TQ0xfT1VUCQkweDA0CisjZGVmaW5lIFNXX1NEQV9PVVQJCTB4MDgKKyNkZWZpbmUgU1dfU0RBX0lOCQkweDA0CisKKyNkZWZpbmUgU1dfSTJDX0JVU1lfQUREUgkweDJmCisjZGVmaW5lIFNXX0kyQ19CVVNZCQkweDAyCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX2JpdGJhbmdfc2VuZGJ5dGUoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCQkJIHU4IGJ5dGUpCit7CisJaW50IGksIHJldDsKKwl1OCBkYXRhID0gMDsKKworCW14bF9pMmMoIigweCUwMngpIiwgYnl0ZSk7CisKKwlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgU1dfSTJDX0JVU1lfQUREUiwgJmRhdGEpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisKKwkJZGF0YSA9IChieXRlICYgKDB4ODAgPj4gaSkpID8gU1dfU0RBX09VVCA6IDA7CisKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBkYXRhKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBkYXRhIHwgU1dfU0NMX09VVCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCisJCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJCSAweDEwIHwgU1dfSTJDX0VOIHwgZGF0YSk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCX0KKworCS8qIGxhc3QgYml0IHdhcyAwIHNvIHdlIG5lZWQgdG8gcmVsZWFzZSBTREEgKi8KKwlpZiAoIShieXRlICYgMSkpIHsKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TREFfT1VUKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJfQorCisJLyogQ0xLIGhpZ2ggZm9yIEFDSyByZWFkYmFjayAqLworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TQ0xfT1VUIHwgU1dfU0RBX09VVCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBTV19JMkNfQlVTWV9BRERSLCAmZGF0YSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCS8qIGRyb3AgdGhlIENMSyBhZnRlciBnZXR0aW5nIEFDSywgU0RBIHdpbGwgZ28gaGlnaCByaWdodCBhd2F5ICovCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NEQV9PVVQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoZGF0YSAmIFNXX1NEQV9JTikKKwkJcmV0ID0gLUVJTzsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfYml0YmFuZ19yZWN2Ynl0ZShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJCQkgdTggKnBieXRlKQoreworCWludCBpLCByZXQ7CisJdTggYnl0ZSA9IDA7CisJdTggZGF0YSA9IDA7CisKKwlteGxfaTJjKCIoKSIpOworCisJKnBieXRlID0gMDsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TREFfT1VUKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFNXX0kyQ19BRERSLAorCQkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8CisJCQkJCSBTV19TQ0xfT1VUIHwgU1dfU0RBX09VVCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCisJCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBTV19JMkNfQlVTWV9BRERSLCAmZGF0YSk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCisJCWlmIChkYXRhICYgU1dfU0RBX0lOKQorCQkJYnl0ZSB8PSAoMHg4MCA+PiBpKTsKKworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFNXX0kyQ19BRERSLAorCQkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NEQV9PVVQpOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJKnBieXRlID0gYnl0ZTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfc3RhcnQoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJbXhsX2kyYygiKCkiKTsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TQ0xfT1VUIHwgU1dfU0RBX09VVCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TQ0xfT1VUKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTik7IC8qIHN0YXJ0ICovCisJbXhsX2ZhaWwocmV0KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfc3RvcChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCWludCByZXQ7CisKKwlteGxfaTJjKCIoKSIpOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTik7IC8qIHN0b3AgKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NDTF9PVVQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFNXX0kyQ19BRERSLAorCQkJCSAweDEwIHwgU1dfSTJDX0VOIHwgU1dfU0NMX09VVCB8IFNXX1NEQV9PVVQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFNXX0kyQ19BRERSLAorCQkJCSAweDEwIHwgU1dfU0NMX09VVCB8IFNXX1NEQV9PVVQpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX2FjayhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCWludCByZXQ7CisJdTggYiA9IDA7CisKKwlteGxfaTJjKCIoKSIpOworCisJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIFNXX0kyQ19CVVNZX0FERFIsICZiKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCS8qIHB1bGwgU0RBIGxvdyAqLworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TQ0xfT1VUKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NEQV9PVVQpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX25hY2soc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJbXhsX2kyYygiKCkiKTsKKworCS8qIFNEQSBoaWdoIHRvIHNpZ25hbCBsYXN0IGJ5dGUgcmVhZCBmcm9tIHNsYXZlICovCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NDTF9PVVQgfCBTV19TREFfT1VUKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NEQV9PVVQpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG14bDExMXNmX2kyY19zd194ZmVyX21zZyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJCSAgICBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCWludCBpLCByZXQ7CisKKwlteGxfaTJjKCIoKSIpOworCisJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgeworCisJCXJldCA9IG14bDExMXNmX2kyY19zdGFydChzdGF0ZSk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCisJCXJldCA9IG14bDExMXNmX2kyY19iaXRiYW5nX3NlbmRieXRlKHN0YXRlLAorCQkJCQkJICAgIChtc2ctPmFkZHIgPDwgMSkgfCAweDAxKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpIHsKKwkJCW14bDExMXNmX2kyY19zdG9wKHN0YXRlKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBtc2ctPmxlbjsgaSsrKSB7CisJCQlyZXQgPSBteGwxMTFzZl9pMmNfYml0YmFuZ19yZWN2Ynl0ZShzdGF0ZSwKKwkJCQkJCQkgICAgJm1zZy0+YnVmW2ldKTsKKwkJCWlmIChteGxfZmFpbChyZXQpKSB7CisJCQkJbXhsMTExc2ZfaTJjX3N0b3Aoc3RhdGUpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKworCQkJaWYgKGkgPCBtc2ctPmxlbiAtIDEpCisJCQkJbXhsMTExc2ZfaTJjX2FjayhzdGF0ZSk7CisJCX0KKworCQlteGwxMTFzZl9pMmNfbmFjayhzdGF0ZSk7CisKKwkJcmV0ID0gbXhsMTExc2ZfaTJjX3N0b3Aoc3RhdGUpOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKworCX0gZWxzZSB7CisKKwkJcmV0ID0gbXhsMTExc2ZfaTJjX3N0YXJ0KHN0YXRlKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisKKwkJcmV0ID0gbXhsMTExc2ZfaTJjX2JpdGJhbmdfc2VuZGJ5dGUoc3RhdGUsCisJCQkJCQkgICAgKG1zZy0+YWRkciA8PCAxKSAmIDB4ZmUpOworCQlpZiAobXhsX2ZhaWwocmV0KSkgeworCQkJbXhsMTExc2ZfaTJjX3N0b3Aoc3RhdGUpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG1zZy0+bGVuOyBpKyspIHsKKwkJCXJldCA9IG14bDExMXNmX2kyY19iaXRiYW5nX3NlbmRieXRlKHN0YXRlLAorCQkJCQkJCSAgICBtc2ctPmJ1ZltpXSk7CisJCQlpZiAobXhsX2ZhaWwocmV0KSkgeworCQkJCW14bDExMXNmX2kyY19zdG9wKHN0YXRlKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKworCQkvKiBGSVhNRTogd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gdGhlIGxhc3QgdHJhbnNhY3Rpb24gKi8KKwkJbXhsMTExc2ZfaTJjX3N0b3Aoc3RhdGUpOworCX0KK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworLyogSFctSTJDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVVNCX1dSSVRFX0kyQ19DTUQgICAgIDB4OTkKKyNkZWZpbmUgVVNCX1JFQURfSTJDX0NNRCAgICAgIDB4ZGQKKyNkZWZpbmUgVVNCX0VORF9JMkNfQ01EICAgICAgIDB4ZmUKKworI2RlZmluZSBVU0JfV1JJVEVfSTJDX0NNRF9MRU4gICAyNgorI2RlZmluZSBVU0JfUkVBRF9JMkNfQ01EX0xFTiAgICAyNAorCisjZGVmaW5lIEkyQ19NVVhfUkVHICAgICAgICAgICAweDMwCisjZGVmaW5lIEkyQ19DT05UUk9MX1JFRyAgICAgICAweDAwCisjZGVmaW5lIEkyQ19TTEFWRV9BRERSX1JFRyAgICAweDA4CisjZGVmaW5lIEkyQ19EQVRBX1JFRyAgICAgICAgICAweDBjCisjZGVmaW5lIEkyQ19JTlRfU1RBVFVTX1JFRyAgICAweDEwCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX3NlbmRfZGF0YShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJCSAgdTggaW5kZXgsIHU4ICp3ZGF0YSkKK3sKKwlpbnQgcmV0ID0gbXhsMTExc2ZfY3RybF9tc2coc3RhdGUtPmQsIHdkYXRhWzBdLAorCQkJCSAgICAmd2RhdGFbMV0sIDI1LCBOVUxMLCAwKTsKKwlteGxfZmFpbChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfZ2V0X2RhdGEoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCQkgdTggaW5kZXgsIHU4ICp3ZGF0YSwgdTggKnJkYXRhKQoreworCWludCByZXQgPSBteGwxMTFzZl9jdHJsX21zZyhzdGF0ZS0+ZCwgd2RhdGFbMF0sCisJCQkJICAgICZ3ZGF0YVsxXSwgMjUsIHJkYXRhLCAyNCk7CisJbXhsX2ZhaWwocmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1OCBteGwxMTFzZl9pMmNfY2hlY2tfc3RhdHVzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJdTggc3RhdHVzID0gMDsKKwl1OCBidWZbMjZdOworCisJbXhsX2kyY19hZHYoIigpIik7CisKKwlidWZbMF0gPSBVU0JfUkVBRF9JMkNfQ01EOworCWJ1ZlsxXSA9IDB4MDA7CisKKwlidWZbMl0gPSBJMkNfSU5UX1NUQVRVU19SRUc7CisJYnVmWzNdID0gMHgwMDsKKwlidWZbNF0gPSAweDAwOworCisJYnVmWzVdID0gVVNCX0VORF9JMkNfQ01EOworCisJbXhsMTExc2ZfaTJjX2dldF9kYXRhKHN0YXRlLCAwLCBidWYsIGJ1Zik7CisKKwlpZiAoYnVmWzFdICYgMHgwNCkKKwkJc3RhdHVzID0gMTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1OCBteGwxMTFzZl9pMmNfY2hlY2tfZmlmbyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCXU4IHN0YXR1cyA9IDA7CisJdTggYnVmWzI2XTsKKworCW14bF9pMmMoIigpIik7CisKKwlidWZbMF0gPSBVU0JfUkVBRF9JMkNfQ01EOworCWJ1ZlsxXSA9IDB4MDA7CisKKwlidWZbMl0gPSBJMkNfTVVYX1JFRzsKKwlidWZbM10gPSAweDAwOworCWJ1Zls0XSA9IDB4MDA7CisKKwlidWZbNV0gPSBJMkNfSU5UX1NUQVRVU19SRUc7CisJYnVmWzZdID0gMHgwMDsKKwlidWZbN10gPSAweDAwOworCWJ1Zls4XSA9IFVTQl9FTkRfSTJDX0NNRDsKKworCW14bDExMXNmX2kyY19nZXRfZGF0YShzdGF0ZSwgMCwgYnVmLCBidWYpOworCisJaWYgKDB4MDggPT0gKGJ1ZlsxXSAmIDB4MDgpKQorCQlzdGF0dXMgPSAxOworCisJaWYgKChidWZbNV0gJiAweDAyKSA9PSAweDAyKQorCQlteGxfaTJjKCIoYnVmWzVdICYgMHgwMikgPT0gMHgwMiIpOyAvKiBGSVhNRSAqLworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfcmVhZGFnYWluKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJICB1OCBjb3VudCwgdTggKnJidWYpCit7CisJdTggaTJjX3dfZGF0YVsyNl07CisJdTggaTJjX3JfZGF0YVsyNF07CisJdTggaSA9IDA7CisJdTggZmlmb19zdGF0dXMgPSAwOworCWludCBzdGF0dXMgPSAwOworCisJbXhsX2kyYygicmVhZCAlZCBieXRlcyIsIGNvdW50KTsKKworCXdoaWxlICgoZmlmb19zdGF0dXMgPT0gMCkgJiYgKGkrKyA8IDUpKQorCQlmaWZvX3N0YXR1cyA9IG14bDExMXNmX2kyY19jaGVja19maWZvKHN0YXRlKTsKKworCWkyY193X2RhdGFbMF0gPSAweEREOworCWkyY193X2RhdGFbMV0gPSAweDAwOworCisJZm9yIChpID0gMjsgaSA8IDI2OyBpKyspCisJCWkyY193X2RhdGFbaV0gPSAweEZFOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaTJjX3dfZGF0YVsyKyhpKjMpXSA9IDB4MEM7CisJCWkyY193X2RhdGFbMysoaSozKV0gPSAweDAwOworCQlpMmNfd19kYXRhWzQrKGkqMyldID0gMHgwMDsKKwl9CisKKwlteGwxMTFzZl9pMmNfZ2V0X2RhdGEoc3RhdGUsIDAsIGkyY193X2RhdGEsIGkyY19yX2RhdGEpOworCisJLyogQ2hlY2sgZm9yIEkyQyBOQUNLIHN0YXR1cyAqLworCWlmIChteGwxMTFzZl9pMmNfY2hlY2tfc3RhdHVzKHN0YXRlKSA9PSAxKSB7CisJCW14bF9pMmMoImVycm9yISIpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlyYnVmW2ldID0gaTJjX3JfZGF0YVsoaSozKSsxXTsKKwkJCW14bF9pMmMoIiUwMnhcdCAlMDJ4IiwKKwkJCQlpMmNfcl9kYXRhWyhpKjMpKzFdLAorCQkJCWkyY19yX2RhdGFbKGkqMykrMl0pOworCQl9CisKKwkJc3RhdHVzID0gMTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZGVmaW5lIEhXSTJDNDAwIDEKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX2h3X3hmZXJfbXNnKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJICAgIHN0cnVjdCBpMmNfbXNnICptc2cpCit7CisJaW50IGksIGssIHJldCA9IDA7CisJdTE2IGluZGV4ID0gMDsKKwl1OCBidWZbMjZdOworCXU4IGkyY19yX2RhdGFbMjRdOworCXUxNiBibG9ja19sZW47CisJdTE2IGxlZnRfb3Zlcl9sZW47CisJdTggcmRfc3RhdHVzWzhdOworCXU4IHJldF9zdGF0dXM7CisJdTggcmVhZGJ1ZmZbMjZdOworCisJbXhsX2kyYygiYWRkcjogMHglMDJ4LCByZWFkIGJ1ZmYgbGVuOiAlZCwgd3JpdGUgYnVmZiBsZW46ICVkIiwKKwkJbXNnLT5hZGRyLCAobXNnLT5mbGFncyAmIEkyQ19NX1JEKSA/IG1zZy0+bGVuIDogMCwKKwkJKCEobXNnLT5mbGFncyAmIEkyQ19NX1JEKSkgPyBtc2ctPmxlbiA6IDApOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMjY7IGluZGV4KyspCisJCWJ1ZltpbmRleF0gPSBVU0JfRU5EX0kyQ19DTUQ7CisKKwkvKiBjb21tYW5kIHRvIGluZGljYXRlIGRhdGEgcGF5bG9hZCBpcyBkZXN0aW5lZCBmb3IgSTJDIGludGVyZmFjZSAqLworCWJ1ZlswXSA9IFVTQl9XUklURV9JMkNfQ01EOworCWJ1ZlsxXSA9IDB4MDA7CisKKwkvKiBlbmFibGUgSTJDIGludGVyZmFjZSAqLworCWJ1ZlsyXSA9IEkyQ19NVVhfUkVHOworCWJ1ZlszXSA9IDB4ODA7CisJYnVmWzRdID0gMHgwMDsKKworCS8qIGVuYWJsZSBJMkMgaW50ZXJmYWNlICovCisJYnVmWzVdID0gSTJDX01VWF9SRUc7CisJYnVmWzZdID0gMHg4MTsKKwlidWZbN10gPSAweDAwOworCisJLyogc2V0IFRpbWVvdXQgcmVnaXN0ZXIgb24gSTJDIGludGVyZmFjZSAqLworCWJ1Zls4XSA9IDB4MTQ7CisJYnVmWzldID0gMHhmZjsKKwlidWZbMTBdID0gMHgwMDsKKyNpZiAwCisJLyogZW5hYmxlIEludGVycnVwdHMgb24gSTJDIGludGVyZmFjZSAqLworCWJ1Zls4XSA9IDB4MjQ7CisJYnVmWzldID0gMHhGNzsKKwlidWZbMTBdID0gMHgwMDsKKyNlbmRpZgorCWJ1ZlsxMV0gPSAweDI0OworCWJ1ZlsxMl0gPSAweEY3OworCWJ1ZlsxM10gPSAweDAwOworCisJcmV0ID0gbXhsMTExc2ZfaTJjX3NlbmRfZGF0YShzdGF0ZSwgMCwgYnVmKTsKKworCS8qIHdyaXRlIGRhdGEgb24gSTJDIGJ1cyAqLworCWlmICghKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgJiYgKG1zZy0+bGVuID4gMCkpIHsKKwkJbXhsX2kyYygiJWRcdCUwMngiLCBtc2ctPmxlbiwgbXNnLT5idWZbMF0pOworCisJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgb24gSTJDIGludGVyZmFjZSB0byBpbml0aWFsaXplIEkyQyBidXMgKi8KKwkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQlidWZbM10gPSAweDVFOworCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisKKwkJLyogSTJDIFNsYXZlIGRldmljZSBBZGRyZXNzICovCisJCWJ1Zls1XSA9IEkyQ19TTEFWRV9BRERSX1JFRzsKKwkJYnVmWzZdID0gKG1zZy0+YWRkcik7CisJCWJ1Zls3XSA9IDB4MDA7CisJCWJ1Zls4XSA9IFVTQl9FTkRfSTJDX0NNRDsKKwkJcmV0ID0gbXhsMTExc2ZfaTJjX3NlbmRfZGF0YShzdGF0ZSwgMCwgYnVmKTsKKworCQkvKiBjaGVjayBmb3Igc2xhdmUgZGV2aWNlIHN0YXR1cyAqLworCQlpZiAobXhsMTExc2ZfaTJjX2NoZWNrX3N0YXR1cyhzdGF0ZSkgPT0gMSkgeworCQkJbXhsX2kyYygiTkFDSyB3cml0aW5nIHNsYXZlIGFkZHJlc3MgJTAyeCIsCisJCQkJbXNnLT5hZGRyKTsKKwkJCS8qIGlmIE5BQ0ssIHN0b3AgSTJDIGJ1cyBhbmQgZXhpdCAqLworCQkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQkJYnVmWzNdID0gMHg0RTsKKwkJCWJ1Zls0XSA9IChIV0kyQzQwMCkgPyAweDAzIDogMHgwRDsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQkvKiBJMkMgaW50ZXJmYWNlIGNhbiBkbyBJMkMgb3BlcmF0aW9ucyBpbiBibG9jayBvZiA4IGJ5dGVzIG9mCisJCSAgIEkyQyBkYXRhLiBjYWxjdWxhdGlvbiB0byBmaWd1cmUgb3V0IG51bWJlciBvZiBibG9ja3Mgb2YgaTJjCisJCSAgIGRhdGEgcmVxdWlyZWQgdG8gcHJvZ3JhbSAqLworCQlibG9ja19sZW4gPSAobXNnLT5sZW4gLyA4KTsKKwkJbGVmdF9vdmVyX2xlbiA9IChtc2ctPmxlbiAlIDgpOworCQlpbmRleCA9IDA7CisKKwkJbXhsX2kyYygiYmxvY2tfbGVuICVkLCBsZWZ0X292ZXJfbGVuICVkIiwKKwkJCWJsb2NrX2xlbiwgbGVmdF9vdmVyX2xlbik7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYmxvY2tfbGVuOyBpbmRleCsrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJLyogd3JpdGUgZGF0YSBvbiBJMkMgaW50ZXJmYWNlICovCisJCQkJYnVmWzIrKGkqMyldID0gSTJDX0RBVEFfUkVHOworCQkJCWJ1ZlszKyhpKjMpXSA9IG1zZy0+YnVmWyhpbmRleCo4KStpXTsKKwkJCQlidWZbNCsoaSozKV0gPSAweDAwOworCQkJfQorCisJCQlyZXQgPSBteGwxMTFzZl9pMmNfc2VuZF9kYXRhKHN0YXRlLCAwLCBidWYpOworCisJCQkvKiBjaGVjayBmb3IgSTJDIE5BQ0sgc3RhdHVzICovCisJCQlpZiAobXhsMTExc2ZfaTJjX2NoZWNrX3N0YXR1cyhzdGF0ZSkgPT0gMSkgeworCQkJCW14bF9pMmMoIk5BQ0sgd3JpdGluZyBzbGF2ZSBhZGRyZXNzICUwMngiLAorCQkJCQltc2ctPmFkZHIpOworCisJCQkJLyogaWYgTkFDSywgc3RvcCBJMkMgYnVzIGFuZCBleGl0ICovCisJCQkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQkJCWJ1ZlszXSA9IDB4NEU7CisJCQkJYnVmWzRdID0gKEhXSTJDNDAwKSA/IDB4MDMgOiAweDBEOworCQkJCXJldCA9IC1FSU87CisJCQkJZ290byBleGl0OworCQkJfQorCisJCX0KKworCQlpZiAobGVmdF9vdmVyX2xlbikgeworCQkJZm9yIChrID0gMDsgayA8IDI2OyBrKyspCisJCQkJYnVmW2tdID0gVVNCX0VORF9JMkNfQ01EOworCisJCQlidWZbMF0gPSAweDk5OworCQkJYnVmWzFdID0gMHgwMDsKKworCQkJZm9yIChpID0gMDsgaSA8IGxlZnRfb3Zlcl9sZW47IGkrKykgeworCQkJCWJ1ZlsyKyhpKjMpXSA9IEkyQ19EQVRBX1JFRzsKKwkJCQlidWZbMysoaSozKV0gPSBtc2ctPmJ1ZlsoaW5kZXgqOCkraV07CisJCQkJbXhsX2kyYygiaW5kZXggPSAlZCAlZCBkYXRhICVkIiwKKwkJCQkJaW5kZXgsIGksIG1zZy0+YnVmWyhpbmRleCo4KStpXSk7CisJCQkJYnVmWzQrKGkqMyldID0gMHgwMDsKKwkJCX0KKwkJCXJldCA9IG14bDExMXNmX2kyY19zZW5kX2RhdGEoc3RhdGUsIDAsIGJ1Zik7CisKKwkJCS8qIGNoZWNrIGZvciBJMkMgTkFDSyBzdGF0dXMgKi8KKwkJCWlmIChteGwxMTFzZl9pMmNfY2hlY2tfc3RhdHVzKHN0YXRlKSA9PSAxKSB7CisJCQkJbXhsX2kyYygiTkFDSyB3cml0aW5nIHNsYXZlIGFkZHJlc3MgJTAyeCIsCisJCQkJCW1zZy0+YWRkcik7CisKKwkJCQkvKiBpZiBOQUNLLCBzdG9wIEkyQyBidXMgYW5kIGV4aXQgKi8KKwkJCQlidWZbMl0gPSBJMkNfQ09OVFJPTF9SRUc7CisJCQkJYnVmWzNdID0gMHg0RTsKKwkJCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisKKwkJfQorCisJCS8qIGlzc3VlIEkyQyBTVE9QIGFmdGVyIHdyaXRlICovCisJCWJ1ZlsyXSA9IEkyQ19DT05UUk9MX1JFRzsKKwkJYnVmWzNdID0gMHg0RTsKKwkJYnVmWzRdID0gKEhXSTJDNDAwKSA/IDB4MDMgOiAweDBEOworCisJfQorCisJLyogcmVhZCBkYXRhIGZyb20gSTJDIGJ1cyAqLworCWlmICgobXNnLT5mbGFncyAmIEkyQ19NX1JEKSAmJiAobXNnLT5sZW4gPiAwKSkgeworCQlteGxfaTJjKCJyZWFkIGJ1ZiBsZW4gJWQiLCBtc2ctPmxlbik7CisKKwkJLyogY29tbWFuZCB0byBpbmRpY2F0ZSBkYXRhIHBheWxvYWQgaXMKKwkJICAgZGVzdGluZWQgZm9yIEkyQyBpbnRlcmZhY2UgKi8KKwkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQlidWZbM10gPSAweERGOworCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisKKwkJLyogSTJDIHhmZXIgbGVuZ3RoICovCisJCWJ1Zls1XSA9IDB4MTQ7CisJCWJ1Zls2XSA9IChtc2ctPmxlbiAmIDB4RkYpOworCQlidWZbN10gPSAwOworCisJCS8qIEkyQyBzbGF2ZSBkZXZpY2UgQWRkcmVzcyAqLworCQlidWZbOF0gPSBJMkNfU0xBVkVfQUREUl9SRUc7CisJCWJ1Zls5XSA9IG1zZy0+YWRkcjsKKwkJYnVmWzEwXSA9IDB4MDA7CisJCWJ1ZlsxMV0gPSBVU0JfRU5EX0kyQ19DTUQ7CisJCXJldCA9IG14bDExMXNmX2kyY19zZW5kX2RhdGEoc3RhdGUsIDAsIGJ1Zik7CisKKwkJLyogY2hlY2sgZm9yIEkyQyBOQUNLIHN0YXR1cyAqLworCQlpZiAobXhsMTExc2ZfaTJjX2NoZWNrX3N0YXR1cyhzdGF0ZSkgPT0gMSkgeworCQkJbXhsX2kyYygiTkFDSyByZWFkaW5nIHNsYXZlIGFkZHJlc3MgJTAyeCIsCisJCQkJbXNnLT5hZGRyKTsKKworCQkJLyogaWYgTkFDSywgc3RvcCBJMkMgYnVzIGFuZCBleGl0ICovCisJCQlidWZbMl0gPSBJMkNfQ09OVFJPTF9SRUc7CisJCQlidWZbM10gPSAweEM3OworCQkJYnVmWzRdID0gKEhXSTJDNDAwKSA/IDB4MDMgOiAweDBEOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCS8qIEkyQyBpbnRlcmZhY2UgY2FuIGRvIEkyQyBvcGVyYXRpb25zIGluIGJsb2NrIG9mIDggYnl0ZXMgb2YKKwkJICAgSTJDIGRhdGEuIGNhbGN1bGF0aW9uIHRvIGZpZ3VyZSBvdXQgbnVtYmVyIG9mIGJsb2NrcyBvZgorCQkgICBpMmMgZGF0YSByZXF1aXJlZCB0byBwcm9ncmFtICovCisJCWJsb2NrX2xlbiA9ICgobXNnLT5sZW4pIC8gOCk7CisJCWxlZnRfb3Zlcl9sZW4gPSAoKG1zZy0+bGVuKSAlIDgpOworCQlpbmRleCA9IDA7CisKKwkJbXhsX2kyYygiYmxvY2tfbGVuICVkLCBsZWZ0X292ZXJfbGVuICVkIiwKKwkJCWJsb2NrX2xlbiwgbGVmdF9vdmVyX2xlbik7CisKKwkJLyogY29tbWFuZCB0byByZWFkIGRhdGEgZnJvbSBJMkMgaW50ZXJmYWNlICovCisJCWJ1ZlswXSA9IFVTQl9SRUFEX0kyQ19DTUQ7CisJCWJ1ZlsxXSA9IDB4MDA7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYmxvY2tfbGVuOyBpbmRleCsrKSB7CisJCQkvKiBzZXR1cCBJMkMgcmVhZCByZXF1ZXN0IHBhY2tldCBvbiBJMkMgaW50ZXJmYWNlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJYnVmWzIrKGkqMyldID0gSTJDX0RBVEFfUkVHOworCQkJCWJ1ZlszKyhpKjMpXSA9IDB4MDA7CisJCQkJYnVmWzQrKGkqMyldID0gMHgwMDsKKwkJCX0KKworCQkJcmV0ID0gbXhsMTExc2ZfaTJjX2dldF9kYXRhKHN0YXRlLCAwLCBidWYsIGkyY19yX2RhdGEpOworCisJCQkvKiBjaGVjayBmb3IgSTJDIE5BQ0sgc3RhdHVzICovCisJCQlpZiAobXhsMTExc2ZfaTJjX2NoZWNrX3N0YXR1cyhzdGF0ZSkgPT0gMSkgeworCQkJCW14bF9pMmMoIk5BQ0sgcmVhZGluZyBzbGF2ZSBhZGRyZXNzICUwMngiLAorCQkJCQltc2ctPmFkZHIpOworCisJCQkJLyogaWYgTkFDSywgc3RvcCBJMkMgYnVzIGFuZCBleGl0ICovCisJCQkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQkJCWJ1ZlszXSA9IDB4Qzc7CisJCQkJYnVmWzRdID0gKEhXSTJDNDAwKSA/IDB4MDMgOiAweDBEOworCQkJCXJldCA9IC1FSU87CisJCQkJZ290byBleGl0OworCQkJfQorCisJCQkvKiBjb3B5IGRhdGEgZnJvbSBpMmMgZGF0YSBwYXlsb2FkIHRvIHJlYWQgYnVmZmVyICovCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJcmRfc3RhdHVzW2ldID0gaTJjX3JfZGF0YVsoaSozKSsyXTsKKworCQkJCWlmIChyZF9zdGF0dXNbaV0gPT0gMHgwNCkgeworCQkJCQlpZiAoaSA8IDcpIHsKKwkJCQkJCW14bF9pMmMoImkyYyBmaWZvIGVtcHR5ISIKKwkJCQkJCQkiIEAgJWQiLCBpKTsKKwkJCQkJCW1zZy0+YnVmWyhpbmRleCo4KStpXSA9CisJCQkJCQkJaTJjX3JfZGF0YVsoaSozKSsxXTsKKwkJCQkJCS8qIHJlYWQgYWdhaW4gKi8KKwkJCQkJCXJldF9zdGF0dXMgPQorCQkJCQkJCW14bDExMXNmX2kyY19yZWFkYWdhaW4oCisJCQkJCQkJCXN0YXRlLCA4LShpKzEpLAorCQkJCQkJCQlyZWFkYnVmZik7CisJCQkJCQlpZiAocmV0X3N0YXR1cyA9PSAxKSB7CisJCQkJCQkJZm9yIChrID0gMDsKKwkJCQkJCQkgICAgIGsgPCA4LShpKzEpOworCQkJCQkJCSAgICAgaysrKSB7CisKKwkJCQkJbXNnLT5idWZbKGluZGV4KjgpKyhrK2krMSldID0KKwkJCQkJCXJlYWRidWZmW2tdOworCQkJCQlteGxfaTJjKCJyZWFkIGRhdGE6ICUwMnhcdCAlMDJ4IiwKKwkJCQkJCW1zZy0+YnVmWyhpbmRleCo4KSsoaytpKV0sCisJCQkJCQkoaW5kZXgqOCkrKGsraSkpOworCQkJCQlteGxfaTJjKCJyZWFkIGRhdGE6ICUwMnhcdCAlMDJ4IiwKKwkJCQkJCW1zZy0+YnVmWyhpbmRleCo4KSsoaytpKzEpXSwKKwkJCQkJCXJlYWRidWZmW2tdKTsKKworCQkJCQkJCX0KKwkJCQkJCQlnb3RvIHN0b3BfY29weTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJbXhsX2kyYygicmVhZGFnYWluICIKKwkJCQkJCQkJIkVSUk9SISIpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJbXNnLT5idWZbKGluZGV4KjgpK2ldID0KKwkJCQkJCQlpMmNfcl9kYXRhWyhpKjMpKzFdOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbXNnLT5idWZbKGluZGV4KjgpK2ldID0KKwkJCQkJCWkyY19yX2RhdGFbKGkqMykrMV07CisJCQkJfQorCQkJfQorc3RvcF9jb3B5OgorCQkJOworCisJCX0KKworCQlpZiAobGVmdF9vdmVyX2xlbikgeworCQkJZm9yIChrID0gMDsgayA8IDI2OyBrKyspCisJCQkJYnVmW2tdID0gVVNCX0VORF9JMkNfQ01EOworCisJCQlidWZbMF0gPSAweEREOworCQkJYnVmWzFdID0gMHgwMDsKKworCQkJZm9yIChpID0gMDsgaSA8IGxlZnRfb3Zlcl9sZW47IGkrKykgeworCQkJCWJ1ZlsyKyhpKjMpXSA9IEkyQ19EQVRBX1JFRzsKKwkJCQlidWZbMysoaSozKV0gPSAweDAwOworCQkJCWJ1Zls0KyhpKjMpXSA9IDB4MDA7CisJCQl9CisJCQlyZXQgPSBteGwxMTFzZl9pMmNfZ2V0X2RhdGEoc3RhdGUsIDAsIGJ1ZiwKKwkJCQkJCSAgICBpMmNfcl9kYXRhKTsKKworCQkJLyogY2hlY2sgZm9yIEkyQyBOQUNLIHN0YXR1cyAqLworCQkJaWYgKG14bDExMXNmX2kyY19jaGVja19zdGF0dXMoc3RhdGUpID09IDEpIHsKKwkJCQlteGxfaTJjKCJOQUNLIHJlYWRpbmcgc2xhdmUgYWRkcmVzcyAlMDJ4IiwKKwkJCQkJbXNnLT5hZGRyKTsKKworCQkJCS8qIGlmIE5BQ0ssIHN0b3AgSTJDIGJ1cyBhbmQgZXhpdCAqLworCQkJCWJ1ZlsyXSA9IEkyQ19DT05UUk9MX1JFRzsKKwkJCQlidWZbM10gPSAweEM3OworCQkJCWJ1Zls0XSA9IChIV0kyQzQwMCkgPyAweDAzIDogMHgwRDsKKwkJCQlyZXQgPSAtRUlPOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IGxlZnRfb3Zlcl9sZW47IGkrKykgeworCQkJCW1zZy0+YnVmWyhibG9ja19sZW4qOCkraV0gPQorCQkJCQlpMmNfcl9kYXRhWyhpKjMpKzFdOworCQkJCW14bF9pMmMoInJlYWQgZGF0YTogJTAyeFx0ICUwMngiLAorCQkJCQlpMmNfcl9kYXRhWyhpKjMpKzFdLAorCQkJCQlpMmNfcl9kYXRhWyhpKjMpKzJdKTsKKwkJCX0KKwkJfQorCisJCS8qIGluZGljYXRlIEkyQyBpbnRlcmZhY2UgdG8gaXNzdWUgTkFDSworCQkgICBhZnRlciBuZXh0IEkyQyByZWFkIG9wICovCisJCWJ1ZlswXSA9IFVTQl9XUklURV9JMkNfQ01EOworCQlidWZbMV0gPSAweDAwOworCisJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQlidWZbM10gPSAweDE3OworCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisKKwkJYnVmWzVdID0gVVNCX0VORF9JMkNfQ01EOworCQlyZXQgPSBteGwxMTFzZl9pMmNfc2VuZF9kYXRhKHN0YXRlLCAwLCBidWYpOworCisJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQlidWZbM10gPSAweEM3OworCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisKKwl9CitleGl0OgorCS8qIFNUT1AgYW5kIGRpc2FibGUgSTJDIE1VWCAqLworCWJ1ZlswXSA9IFVTQl9XUklURV9JMkNfQ01EOworCWJ1ZlsxXSA9IDB4MDA7CisKKwkvKiBkZS1pbml0aWxpemUgSTJDIEJVUyAqLworCWJ1Zls1XSA9IFVTQl9FTkRfSTJDX0NNRDsKKwlteGwxMTFzZl9pMmNfc2VuZF9kYXRhKHN0YXRlLCAwLCBidWYpOworCisJLyogQ29udHJvbCBSZWdpc3RlciAqLworCWJ1ZlsyXSA9IEkyQ19DT05UUk9MX1JFRzsKKwlidWZbM10gPSAweERGOworCWJ1Zls0XSA9IDB4MDM7CisKKwkvKiBkaXNhYmxlIEkyQyBpbnRlcmZhY2UgKi8KKwlidWZbNV0gPSBJMkNfTVVYX1JFRzsKKwlidWZbNl0gPSAweDAwOworCWJ1Zls3XSA9IDB4MDA7CisKKwkvKiBkZS1pbml0aWxpemUgSTJDIEJVUyAqLworCWJ1Zls4XSA9IFVTQl9FTkRfSTJDX0NNRDsKKwlteGwxMTFzZl9pMmNfc2VuZF9kYXRhKHN0YXRlLCAwLCBidWYpOworCisJLyogZGlzYWJsZSBJMkMgaW50ZXJmYWNlICovCisJYnVmWzJdID0gSTJDX01VWF9SRUc7CisJYnVmWzNdID0gMHg4MTsKKwlidWZbNF0gPSAweDAwOworCisJLyogZGlzYWJsZSBJMkMgaW50ZXJmYWNlICovCisJYnVmWzVdID0gSTJDX01VWF9SRUc7CisJYnVmWzZdID0gMHgwMDsKKwlidWZbN10gPSAweDAwOworCisJLyogZGlzYWJsZSBJMkMgaW50ZXJmYWNlICovCisJYnVmWzhdID0gSTJDX01VWF9SRUc7CisJYnVmWzldID0gMHgwMDsKKwlidWZbMTBdID0gMHgwMDsKKworCWJ1ZlsxMV0gPSBVU0JfRU5EX0kyQ19DTUQ7CisJbXhsMTExc2ZfaTJjX3NlbmRfZGF0YShzdGF0ZSwgMCwgYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgbXhsMTExc2ZfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLAorCQkgICAgICBzdHJ1Y3QgaTJjX21zZyBtc2dbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCWludCBod2kyYyA9IChzdGF0ZS0+Y2hpcF9yZXYgPiBNWEwxMTFTRl9WNik7CisJaW50IGksIHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlyZXQgPSAoaHdpMmMpID8KKwkJCW14bDExMXNmX2kyY19od194ZmVyX21zZyhzdGF0ZSwgJm1zZ1tpXSkgOgorCQkJbXhsMTExc2ZfaTJjX3N3X3hmZXJfbXNnKHN0YXRlLCAmbXNnW2ldKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpIHsKKwkJCW14bF9kZWJ1Z19hZHYoImZhaWxlZCB3aXRoIGVycm9yICVkIG9uIGkyYyAiCisJCQkJICAgICAgInRyYW5zYWN0aW9uICVkIG9mICVkLCAlc2luZyAlZCBieXRlcyAiCisJCQkJICAgICAgInRvL2Zyb20gMHglMDJ4IiwgcmV0LCBpKzEsIG51bSwKKwkJCQkgICAgICAobXNnW2ldLmZsYWdzICYgSTJDX01fUkQpID8KKwkJCQkgICAgICAicmVhZCIgOiAid3JpdCIsCisJCQkJICAgICAgbXNnW2ldLmxlbiwgbXNnW2ldLmFkZHIpOworCisJCQlicmVhazsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmZC0+aTJjX211dGV4KTsKKworCXJldHVybiBpID09IG51bSA/IG51bSA6IC1FUkVNT1RFSU87Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWkyYy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTdhNDVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1pMmMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogIG14bDExMXNmLWkyYy5oIC0gZHJpdmVyIGZvciB0aGUgTWF4TGluZWFyIE1YTDExMVNGCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX0RWQl9VU0JfTVhMMTExU0ZfSTJDX0hfCisjZGVmaW5lIF9EVkJfVVNCX01YTDExMVNGX0kyQ19IXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKK2ludCBteGwxMTFzZl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCisJCSAgICAgIHN0cnVjdCBpMmNfbXNnIG1zZ1tdLCBpbnQgbnVtKTsKKworI2VuZGlmIC8qIF9EVkJfVVNCX01YTDExMVNGX0kyQ19IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1waHkuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0MWIzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcGh5LmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiAgbXhsMTExc2YtcGh5LmMgLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm14bDExMXNmLXBoeS5oIgorI2luY2x1ZGUgIm14bDExMXNmLXJlZy5oIgorCitpbnQgbXhsMTExc2ZfaW5pdF90dW5lcl9kZW1vZChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvIG14bF8xMTFfb3ZlcndyaXRlX2RlZmF1bHRbXSA9IHsKKwkJezB4MDcsIDB4ZmYsIDB4MGN9LAorCQl7MHg1OCwgMHhmZiwgMHg5ZH0sCisJCXsweDA5LCAweGZmLCAweDAwfSwKKwkJezB4MDYsIDB4ZmYsIDB4MDZ9LAorCQl7MHhjOCwgMHhmZiwgMHg0MH0sIC8qIEVEX0xFX1dJTl9PTEQgPSAwICovCisJCXsweDhkLCAweDAxLCAweDAxfSwgLyogTkVHQVRFX1EgKi8KKwkJezB4MzIsIDB4ZmYsIDB4YWN9LCAvKiBESUdfUkZSRUZTRUxFQ1QgPSAxMiAqLworCQl7MHg0MiwgMHhmZiwgMHg0M30sIC8qIERJR19SRUdfQU1QID0gNCAqLworCQl7MHg3NCwgMHhmZiwgMHhjNH0sIC8qIFNTUFVSX0ZTX1BSSU8gPSA0ICovCisJCXsweDcxLCAweGZmLCAweGU2fSwgLyogU1BVUl9ST1RfUFJJT19WQUwgPSAxICovCisJCXsweDgzLCAweGZmLCAweDY0fSwgLyogSU5GX0ZJTFQxX1RIRF9TQyA9IDEwMCAqLworCQl7MHg4NSwgMHhmZiwgMHg2NH0sIC8qIElORl9GSUxUMl9USERfU0MgPSAxMDAgKi8KKwkJezB4ODgsIDB4ZmYsIDB4ZjB9LCAvKiBJTkZfVEhEID0gMjQwICovCisJCXsweDZmLCAweGYwLCAweGIwfSwgLyogREZFX0RMWSA9IDExICovCisJCXsweDAwLCAweGZmLCAweDAxfSwgLyogQ2hhbmdlIHRvIHBhZ2UgMSAqLworCQl7MHg4MSwgMHhmZiwgMHgxMX0sIC8qIERTTV9GRVJSX0JZUEFTUyA9IDEgKi8KKwkJezB4ZjQsIDB4ZmYsIDB4MDd9LCAvKiBESUdfRlJFUV9DT1JSID0gMSAqLworCQl7MHhkNCwgMHgxZiwgMHgwZn0sIC8qIFNQVVJfVEVTVF9OT0lTRV9USCA9IDE1ICovCisJCXsweGQ2LCAweGZmLCAweDBjfSwgLyogU1BVUl9URVNUX05PSVNFX1BBUFIgPSAxMiAqLworCQl7MHgwMCwgMHhmZiwgMHgwMH0sIC8qIENoYW5nZSB0byBwYWdlIDAgKi8KKwkJezAsICAgIDAsICAgIDB9CisJfTsKKworCW14bF9kZWJ1ZygiKCkiKTsKKworCXJldHVybiBteGwxMTFzZl9jdHJsX3Byb2dyYW1fcmVncyhzdGF0ZSwgbXhsXzExMV9vdmVyd3JpdGVfZGVmYXVsdCk7Cit9CisKK2ludCBteGwxeDFzZl9zb2Z0X3Jlc2V0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHJldDsKKwlteGxfZGVidWcoIigpIik7CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIDB4ZmYsIDB4MDApOyAvKiBBSUMgKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMiwgMHgwMSk7IC8qIGdldCBvdXQgb2YgcmVzZXQgKi8KKwlteGxfZmFpbChyZXQpOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbXhsMXgxc2Zfc2V0X2RldmljZV9tb2RlKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBtb2RlKQoreworCWludCByZXQ7CisKKwlteGxfZGVidWcoIiglcykiLCBNWExfU09DX01PREUgPT0gbW9kZSA/CisJCSJNWExfU09DX01PREUiIDogIk1YTF9UVU5FUl9NT0RFIik7CisKKwkvKiBzZXQgZGV2aWNlIG1vZGUgKi8KKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIDB4MDMsCisJCQkJIE1YTF9TT0NfTU9ERSA9PSBtb2RlID8gMHgwMSA6IDB4MDApOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWdfbWFzayhzdGF0ZSwKKwkJCQkgICAgICAweDdkLCAweDQwLCBNWExfU09DX01PREUgPT0gbW9kZSA/CisJCQkJICAgICAgMHgwMCA6IC8qIGVuYWJsZSBpbXB1bHNlIG5vaXNlIGZpbHRlciwKKwkJCQkJCUlORl9CWVAgPSAwICovCisJCQkJICAgICAgMHg0MCk7IC8qIGRpc2FibGUgaW1wdWxzZSBub2lzZSBmaWx0ZXIsCisJCQkJCQlJTkZfQllQID0gMSAqLworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0ZS0+ZGV2aWNlX21vZGUgPSBtb2RlOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBwb3dlciB1cCB0dW5lciAqLworaW50IG14bDF4MXNmX3RvcF9tYXN0ZXJfY3RybChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLCBpbnQgb25vZmYpCit7CisJbXhsX2RlYnVnKCIoJWQpIiwgb25vZmYpOworCisJcmV0dXJuIG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMSwgb25vZmYgPyAweDAxIDogMHgwMCk7Cit9CisKK2ludCBteGwxMTFzZl9kaXNhYmxlXzY1Nl9wb3J0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJbXhsX2RlYnVnKCIoKSIpOworCisJcmV0dXJuIG14bDExMXNmX3dyaXRlX3JlZ19tYXNrKHN0YXRlLCAweDEyLCAweDA0LCAweDAwKTsKK30KKworaW50IG14bDExMXNmX2VuYWJsZV91c2Jfb3V0cHV0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJbXhsX2RlYnVnKCIoKSIpOworCisJcmV0dXJuIG14bDExMXNmX3dyaXRlX3JlZ19tYXNrKHN0YXRlLCAweDE3LCAweDQwLCAweDAwKTsKK30KKworLyogaW5pdGlhbGl6ZSBUU0lGIGFzIGlucHV0IHBvcnQgb2YgTXhMMVgxU0YgZm9yIE1QRUcyIGRhdGEgdHJhbnNmZXIgKi8KK2ludCBteGwxMTFzZl9jb25maWdfbXBlZ19pbihzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJICAgIHVuc2lnbmVkIGludCBwYXJhbGxlbF9zZXJpYWwsCisJCQkgICAgdW5zaWduZWQgaW50IG1zYl9sc2JfMXN0LAorCQkJICAgIHVuc2lnbmVkIGludCBjbG9ja19waGFzZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbXBlZ192YWxpZF9wb2wsCisJCQkgICAgdW5zaWduZWQgaW50IG1wZWdfc3luY19wb2wpCit7CisJaW50IHJldDsKKwl1OCBtb2RlLCB0bXA7CisKKwlteGxfZGVidWcoIigldSwldSwldSwldSwldSkiLCBwYXJhbGxlbF9zZXJpYWwsIG1zYl9sc2JfMXN0LAorCQkgIGNsb2NrX3BoYXNlLCBtcGVnX3ZhbGlkX3BvbCwgbXBlZ19zeW5jX3BvbCk7CisKKwkvKiBFbmFibGUgUElOIE1VWCAqLworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgVjZfUElOX01VWF9NT0RFX1JFRywgVjZfRU5BQkxFX1BJTl9NVVgpOworCW14bF9mYWlsKHJldCk7CisKKwkvKiBDb25maWd1cmUgTVBFRyBDbG9jayBwaGFzZSAqLworCW14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBWNl9NUEVHX0lOX0NMS19JTlZfUkVHLCAmbW9kZSk7CisKKwlpZiAoY2xvY2tfcGhhc2UgPT0gVFNJRl9OT1JNQUwpCisJCW1vZGUgJj0gflY2X0lOVkVSVEVEX0NMS19QSEFTRTsKKwllbHNlCisJCW1vZGUgfD0gVjZfSU5WRVJURURfQ0xLX1BIQVNFOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9NUEVHX0lOX0NMS19JTlZfUkVHLCBtb2RlKTsKKwlteGxfZmFpbChyZXQpOworCisJLyogQ29uZmlndXJlIGRhdGEgaW5wdXQgbW9kZSwgTVBFRyBWYWxpZCBwb2xhcml0eSwgTVBFRyBTeW5jIHBvbGFyaXR5CisJICogR2V0IGN1cnJlbnQgY29uZmlndXJhdGlvbiAqLworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBWNl9NUEVHX0lOX0NUUkxfUkVHLCAmbW9kZSk7CisJbXhsX2ZhaWwocmV0KTsKKworCS8qIERhdGEgSW5wdXQgbW9kZSAqLworCWlmIChwYXJhbGxlbF9zZXJpYWwgPT0gVFNJRl9JTlBVVF9QQVJBTExFTCkgeworCQkvKiBEaXNhYmxlIHNlcmlhbCBtb2RlICovCisJCW1vZGUgJj0gflY2X01QRUdfSU5fREFUQV9TRVJJQUw7CisKKwkJLyogRW5hYmxlIFBhcmFsbGVsIG1vZGUgKi8KKwkJbW9kZSB8PSBWNl9NUEVHX0lOX0RBVEFfUEFSQUxMRUw7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBQYXJhbGxlbCBtb2RlICovCisJCW1vZGUgJj0gflY2X01QRUdfSU5fREFUQV9QQVJBTExFTDsKKworCQkvKiBFbmFibGUgU2VyaWFsIE1vZGUgKi8KKwkJbW9kZSB8PSBWNl9NUEVHX0lOX0RBVEFfU0VSSUFMOworCisJCS8qIElmIHNlcmlhbCBpbnRlcmZhY2UgaXMgY2hvc2VuLCBjb25maWd1cmUKKwkJICAgTVNCIG9yIExTQiBvcmRlciBpbiB0cmFuc21pc3Npb24gKi8KKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsCisJCQkJCVY2X01QRUdfSU5PVVRfQklUX09SREVSX0NUUkxfUkVHLAorCQkJCQkmdG1wKTsKKwkJbXhsX2ZhaWwocmV0KTsKKworCQlpZiAobXNiX2xzYl8xc3QgPT0gTVBFR19TRVJfTVNCX0ZJUlNUX0VOQUJMRUQpCisJCQl0bXAgfD0gVjZfTVBFR19TRVJfTVNCX0ZJUlNUOworCQllbHNlCisJCQl0bXAgJj0gflY2X01QRUdfU0VSX01TQl9GSVJTVDsKKworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsCisJCQkJCSBWNl9NUEVHX0lOT1VUX0JJVF9PUkRFUl9DVFJMX1JFRywKKwkJCQkJIHRtcCk7CisJCW14bF9mYWlsKHJldCk7CisJfQorCisJLyogTVBFRyBTeW5jIHBvbGFyaXR5ICovCisJaWYgKG1wZWdfc3luY19wb2wgPT0gVFNJRl9OT1JNQUwpCisJCW1vZGUgJj0gflY2X0lOVkVSVEVEX01QRUdfU1lOQzsKKwllbHNlCisJCW1vZGUgfD0gVjZfSU5WRVJURURfTVBFR19TWU5DOworCisJLyogTVBFRyBWYWxpZCBwb2xhcml0eSAqLworCWlmIChtcGVnX3ZhbGlkX3BvbCA9PSAwKQorCQltb2RlICY9IH5WNl9JTlZFUlRFRF9NUEVHX1ZBTElEOworCWVsc2UKKwkJbW9kZSB8PSBWNl9JTlZFUlRFRF9NUEVHX1ZBTElEOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9NUEVHX0lOX0NUUkxfUkVHLCBtb2RlKTsKKwlteGxfZmFpbChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG14bDExMXNmX2luaXRfaTJzX3BvcnQoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggc2FtcGxlX3NpemUpCit7CisJc3RhdGljIHN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvIGluaXRfaTJzW10gPSB7CisJCXsweDFiLCAweGZmLCAweDFlfSwgLyogcGluIG11eCBtb2RlLCBDaG9vc2UgNjU2L0kyUyBpbnB1dCAqLworCQl7MHgxNSwgMHg2MCwgMHg2MH0sIC8qIEVuYWJsZSBJMlMgKi8KKwkJezB4MTcsIDB4ZTAsIDB4MjB9LCAvKiBJbnB1dCwgTVBFRyBNT0RFIFVTQiwKKwkJCQkgICAgICAgSW52ZXJ0ZWQgNjU2IENsb2NrLCBJMlNfU09GVF9SRVNFVCwKKwkJCQkgICAgICAgMCA6IE5vcm1hbCBvcGVyYXRpb24sIDEgOiBSZXNldCBTdGF0ZSAqLworI2lmIDAKKwkJezB4MTIsIDB4MDEsIDB4MDB9LCAvKiBBVURJT19JUlFfQ0xSIChPdmVyZmxvdyBJbmRpY2F0b3IpICovCisjZW5kaWYKKwkJezB4MDAsIDB4ZmYsIDB4MDJ9LCAvKiBDaGFuZ2UgdG8gQ29udHJvbCBQYWdlICovCisJCXsweDI2LCAweDBkLCAweDBkfSwgLyogSTJTX01PREUgJiBCVDY1Nl9TUkNfU0VMIGZvciBGUEdBIG9ubHkgKi8KKwkJezB4MDAsIDB4ZmYsIDB4MDB9LAorCQl7MCwgICAgMCwgICAgMH0KKwl9OworCWludCByZXQ7CisKKwlteGxfZGVidWcoIigweCUwMngpIiwgc2FtcGxlX3NpemUpOworCisJcmV0ID0gbXhsMTExc2ZfY3RybF9wcm9ncmFtX3JlZ3Moc3RhdGUsIGluaXRfaTJzKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9JMlNfTlVNX1NBTVBMRVNfUkVHLCBzYW1wbGVfc2l6ZSk7CisJbXhsX2ZhaWwocmV0KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworaW50IG14bDExMXNmX2Rpc2FibGVfaTJzX3BvcnQoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSkKK3sKKwlzdGF0aWMgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gZGlzYWJsZV9pMnNbXSA9IHsKKwkJezB4MTUsIDB4NDAsIDB4MDB9LAorCQl7MCwgICAgMCwgICAgMH0KKwl9OworCisJbXhsX2RlYnVnKCIoKSIpOworCisJcmV0dXJuIG14bDExMXNmX2N0cmxfcHJvZ3JhbV9yZWdzKHN0YXRlLCBkaXNhYmxlX2kycyk7Cit9CisKK2ludCBteGwxMTFzZl9jb25maWdfaTJzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQl1OCBtc2Jfc3RhcnRfcG9zLCB1OCBkYXRhX3dpZHRoKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJbXhsX2RlYnVnKCIoMHglMDJ4LCAweCUwMngpIiwgbXNiX3N0YXJ0X3BvcywgZGF0YV93aWR0aCk7CisKKwlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgVjZfSTJTX1NUUkVBTV9TVEFSVF9CSVRfUkVHLCAmdG1wKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJdG1wICY9IDB4ZTA7CisJdG1wIHw9IG1zYl9zdGFydF9wb3M7CisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9JMlNfU1RSRUFNX1NUQVJUX0JJVF9SRUcsIHRtcCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBWNl9JMlNfU1RSRUFNX0VORF9CSVRfUkVHLCAmdG1wKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJdG1wICY9IDB4ZTA7CisJdG1wIHw9IGRhdGFfd2lkdGg7CisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9JMlNfU1RSRUFNX0VORF9CSVRfUkVHLCB0bXApOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBteGwxMTFzZl9jb25maWdfc3BpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBvbm9mZikKK3sKKwl1OCB2YWw7CisJaW50IHJldDsKKworCW14bF9kZWJ1ZygiKCVkKSIsIG9ub2ZmKTsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMCwgMHgwMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBWOF9TUElfTU9ERV9SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAob25vZmYpCisJCXZhbCB8PSAweDA0OworCWVsc2UKKwkJdmFsICY9IH4weDA0OworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWOF9TUElfTU9ERV9SRUcsIHZhbCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMCwgMHgwMCk7CisJbXhsX2ZhaWwocmV0KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworaW50IG14bDExMXNmX2lkYWNfY29uZmlnKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkgdTggY29udHJvbF9tb2RlLCB1OCBjdXJyZW50X3NldHRpbmcsCisJCQkgdTggY3VycmVudF92YWx1ZSwgdTggaHlzdGVyZXNpc192YWx1ZSkKK3sKKwlpbnQgcmV0OworCXU4IHZhbDsKKwkvKiBjdXJyZW50IHZhbHVlIHdpbGwgYmUgc2V0IGZvciBib3RoIGF1dG9tYXRpYyAmIG1hbnVhbCBJREFDIGNvbnRyb2wgKi8KKwl2YWwgPSBjdXJyZW50X3ZhbHVlOworCisJaWYgKGNvbnRyb2xfbW9kZSA9PSBJREFDX01BTlVBTF9DT05UUk9MKSB7CisJCS8qIGVuYWJsZSBtYW51YWwgY29udHJvbCBvZiBJREFDICovCisJCXZhbCB8PSBJREFDX01BTlVBTF9DT05UUk9MX0JJVF9NQVNLOworCisJCWlmIChjdXJyZW50X3NldHRpbmcgPT0gSURBQ19DVVJSRU5UX1NJTktJTkdfRU5BQkxFKQorCQkJLyogZW5hYmxlIGN1cnJlbnQgc2lua2luZyBpbiBtYW51YWwgbW9kZSAqLworCQkJdmFsIHw9IElEQUNfQ1VSUkVOVF9TSU5LSU5HX0JJVF9NQVNLOworCQllbHNlCisJCQkvKiBkaXNhYmxlIGN1cnJlbnQgc2lua2luZyBpbiBtYW51YWwgbW9kZSAqLworCQkJdmFsICY9IH5JREFDX0NVUlJFTlRfU0lOS0lOR19CSVRfTUFTSzsKKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIG1hbnVhbCBjb250cm9sIG9mIElEQUMgKi8KKwkJdmFsICY9IH5JREFDX01BTlVBTF9DT05UUk9MX0JJVF9NQVNLOworCisJCS8qIHNldCBoeXN0ZXJlc2lzIHZhbHVlICByZWc6IDB4MEI8NTowPiAqLworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFY2X0lEQUNfSFlTVEVSRVNJU19SRUcsCisJCQkJCSAoaHlzdGVyZXNpc192YWx1ZSAmIDB4M0YpKTsKKwkJbXhsX2ZhaWwocmV0KTsKKwl9CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFY2X0lEQUNfU0VUVElOR1NfUkVHLCB2YWwpOworCW14bF9mYWlsKHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1waHkuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3NTYwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcGh5LmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqICBteGwxMTFzZi1waHkuaCAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9EVkJfVVNCX01YTDExMVNGX1BIWV9IXworI2RlZmluZSBfRFZCX1VTQl9NWEwxMTFTRl9QSFlfSF8KKworI2luY2x1ZGUgIm14bDExMXNmLmgiCisKK2ludCBteGwxeDFzZl9zb2Z0X3Jlc2V0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpOworaW50IG14bDF4MXNmX3NldF9kZXZpY2VfbW9kZShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLCBpbnQgbW9kZSk7CitpbnQgbXhsMXgxc2ZfdG9wX21hc3Rlcl9jdHJsKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBvbm9mZik7CitpbnQgbXhsMTExc2ZfZGlzYWJsZV82NTZfcG9ydChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKTsKK2ludCBteGwxMTFzZl9pbml0X3R1bmVyX2RlbW9kKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpOworaW50IG14bDExMXNmX2VuYWJsZV91c2Jfb3V0cHV0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpOworaW50IG14bDExMXNmX2NvbmZpZ19tcGVnX2luKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkgICAgdW5zaWduZWQgaW50IHBhcmFsbGVsX3NlcmlhbCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbXNiX2xzYl8xc3QsCisJCQkgICAgdW5zaWduZWQgaW50IGNsb2NrX3BoYXNlLAorCQkJICAgIHVuc2lnbmVkIGludCBtcGVnX3ZhbGlkX3BvbCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbXBlZ19zeW5jX3BvbCk7CitpbnQgbXhsMTExc2ZfY29uZmlnX2kycyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJdTggbXNiX3N0YXJ0X3BvcywgdTggZGF0YV93aWR0aCk7CitpbnQgbXhsMTExc2ZfaW5pdF9pMnNfcG9ydChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLCB1OCBzYW1wbGVfc2l6ZSk7CitpbnQgbXhsMTExc2ZfZGlzYWJsZV9pMnNfcG9ydChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKTsKK2ludCBteGwxMTFzZl9jb25maWdfc3BpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBvbm9mZik7CitpbnQgbXhsMTExc2ZfaWRhY19jb25maWcoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCSB1OCBjb250cm9sX21vZGUsIHU4IGN1cnJlbnRfc2V0dGluZywKKwkJCSB1OCBjdXJyZW50X3ZhbHVlLCB1OCBoeXN0ZXJlc2lzX3ZhbHVlKTsKKworI2VuZGlmIC8qIF9EVkJfVVNCX01YTDExMVNGX1BIWV9IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1yZWcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4MzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcmVnLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiAgbXhsMTExc2YtcmVnLmggLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfRFZCX1VTQl9NWEwxMTFTRl9SRUdfSF8KKyNkZWZpbmUgX0RWQl9VU0JfTVhMMTExU0ZfUkVHX0hfCisKKyNkZWZpbmUgQ0hJUF9JRF9SRUcgICAgICAgICAgICAgICAgICAweEZDCisjZGVmaW5lIFRPUF9DSElQX1JFVl9JRF9SRUcgICAgICAgICAgMHhGQQorCisjZGVmaW5lIFY2X1NOUl9SQl9MU0JfUkVHICAgICAgICAgICAgMHgyNworI2RlZmluZSBWNl9TTlJfUkJfTVNCX1JFRyAgICAgICAgICAgIDB4MjgKKworI2RlZmluZSBWNl9OX0FDQ1VNVUxBVEVfUkVHICAgICAgICAgIDB4MTEKKyNkZWZpbmUgVjZfUlNfQVZHX0VSUk9SU19MU0JfUkVHICAgICAweDJDCisjZGVmaW5lIFY2X1JTX0FWR19FUlJPUlNfTVNCX1JFRyAgICAgMHgyRAorCisjZGVmaW5lIFY2X0lSUV9TVEFUVVNfUkVHICAgICAgICAgICAgMHgyNAorI2RlZmluZSAgSVJRX01BU0tfRkVDX0xPQ0sgICAgICAgMHgxMAorCisjZGVmaW5lIFY2X1NZTkNfTE9DS19SRUcgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBTWU5DX0xPQ0tfTUFTSyAgICAgICAgICAgMHgxMAorCisjZGVmaW5lIFY2X1JTX0xPQ0tfREVUX1JFRyAgICAgICAgICAgMHgyOAorI2RlZmluZSAgUlNfTE9DS19ERVRfTUFTSyAgICAgICAgMHgwOAorCisjZGVmaW5lIFY2X0lOSVRBQ1FfTk9ERVRFQ1RfUkVHICAgIDB4MjAKKyNkZWZpbmUgVjZfRk9SQ0VfTkZGVF9DUFNJWkVfUkVHICAgMHgyMAorCisjZGVmaW5lIFY2X0NPREVfUkFURV9UUFNfUkVHICAgICAgIDB4MjkKKyNkZWZpbmUgVjZfQ09ERV9SQVRFX1RQU19NQVNLICAgICAgMHgwNworCisKKyNkZWZpbmUgVjZfQ1BfTE9DS19ERVRfUkVHICAgICAgICAweDI4CisjZGVmaW5lIFY2X0NQX0xPQ0tfREVUX01BU0sgICAgICAgMHgwNAorCisjZGVmaW5lIFY2X1RQU19ISUVSQUNIWV9SRUcgICAgICAgIDB4MjkKKyNkZWZpbmUgVjZfVFBTX0hJRVJBUkNIWV9JTkZPX01BU0sgIDB4NDAKKworI2RlZmluZSBWNl9NT0RPUkRFUl9UUFNfUkVHICAgICAgICAweDJBCisjZGVmaW5lIFY2X1BBUkFNX0NPTlNURUxMQVRJT05fTUFTSyAgIDB4MzAKKworI2RlZmluZSBWNl9NT0RFX1RQU19SRUcgICAgICAgICAgICAweDJBCisjZGVmaW5lIFY2X1BBUkFNX0ZGVF9NT0RFX01BU0sgICAgICAgIDB4MEMKKworCisjZGVmaW5lIFY2X0NQX1RQU19SRUcgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBWNl9QQVJBTV9HSV9NQVNLICAgICAgICAgICAgICAweDMwCisKKyNkZWZpbmUgVjZfVFBTX0xPQ0tfUkVHICAgICAgICAgICAweDJBCisjZGVmaW5lIFY2X1BBUkFNX1RQU19MT0NLX01BU0sgICAgICAgIDB4NDAKKworI2RlZmluZSBWNl9GRUNfUEVSX0NPVU5UX1JFRyAgICAgIDB4MkUKKyNkZWZpbmUgVjZfRkVDX1BFUl9TQ0FMRV9SRUcgICAgICAweDJCCisjZGVmaW5lIFY2X0ZFQ19QRVJfU0NBTEVfTUFTSyAgICAgICAgMHgwMworI2RlZmluZSBWNl9GRUNfUEVSX0NMUl9SRUcgICAgICAgIDB4MjAKKyNkZWZpbmUgVjZfRkVDX1BFUl9DTFJfTUFTSyAgICAgICAgICAweDAxCisKKyNkZWZpbmUgVjZfUElOX01VWF9NT0RFX1JFRyAgICAgICAweDFCCisjZGVmaW5lIFY2X0VOQUJMRV9QSU5fTVVYICAgICAgICAgICAgMHgxRQorCisjZGVmaW5lIFY2X0kyU19OVU1fU0FNUExFU19SRUcgICAgMHgxNgorCisjZGVmaW5lIFY2X01QRUdfSU5fQ0xLX0lOVl9SRUcgICAgMHgxNworI2RlZmluZSBWNl9NUEVHX0lOX0NUUkxfUkVHICAgICAgIDB4MTgKKworI2RlZmluZSBWNl9JTlZFUlRFRF9DTEtfUEhBU0UgICAgICAgMHgyMAorI2RlZmluZSBWNl9NUEVHX0lOX0RBVEFfUEFSQUxMRUwgICAgMHgwMQorI2RlZmluZSBWNl9NUEVHX0lOX0RBVEFfU0VSSUFMICAgICAgMHgwMgorCisjZGVmaW5lIFY2X0lOVkVSVEVEX01QRUdfU1lOQyAgICAgICAweDA0CisjZGVmaW5lIFY2X0lOVkVSVEVEX01QRUdfVkFMSUQgICAgICAweDA4CisKKyNkZWZpbmUgVFNJRl9JTlBVVF9QQVJBTExFTCAgICAgICAgIDAKKyNkZWZpbmUgVFNJRl9JTlBVVF9TRVJJQUwgICAgICAgICAgIDEKKyNkZWZpbmUgVFNJRl9OT1JNQUwgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBWNl9NUEVHX0lOT1VUX0JJVF9PUkRFUl9DVFJMX1JFRyAgMHgxOQorI2RlZmluZSBWNl9NUEVHX1NFUl9NU0JfRklSU1QgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBNUEVHX1NFUl9NU0JfRklSU1RfRU5BQkxFRCAgICAgICAgMHgwMQorCisjZGVmaW5lIFY2XzY1Nl9JMlNfQlVGRl9TVEFUVVNfUkVHICAgMHgyRgorI2RlZmluZSBWNl82NTZfT1ZFUkZMT1dfTUFTS19CSVQgICAgICAgICAweDA4CisjZGVmaW5lIFY2X0kyU19PVkVSRkxPV19NQVNLX0JJVCAgICAgICAgIDB4MDEKKworI2RlZmluZSBWNl9JMlNfU1RSRUFNX1NUQVJUX0JJVF9SRUcgIDB4MTQKKyNkZWZpbmUgVjZfSTJTX1NUUkVBTV9FTkRfQklUX1JFRyAgICAweDE1CisjZGVmaW5lIEkyU19SSUdIVF9KVVNUSUZJRUQgICAgIDAKKyNkZWZpbmUgSTJTX0xFRlRfSlVTVElGSUVEICAgICAgMQorI2RlZmluZSBJMlNfREFUQV9GT1JNQVQgICAgICAgICAyCisKKyNkZWZpbmUgVjZfVFVORVJfTE9PUF9USFJVX0NPTlRST0xfUkVHICAweDA5CisjZGVmaW5lIFY2X0VOQUJMRV9MT09QX1RIUlUgICAgICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgVE9UQUxfTlVNX0lGX09VVFBVVF9GUkVRICAgICAgIDE2CisKKyNkZWZpbmUgVFVORVJfTk9STUFMX0lGX1NQRUNUUlVNICAgICAgIDB4MAorI2RlZmluZSBUVU5FUl9JTlZFUlRfSUZfU1BFQ1RSVU0gICAgICAgMHgxMAorCisjZGVmaW5lIFY2X1RVTkVSX0lGX1NFTF9SRUcgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgVjZfVFVORVJfSUZfRkNXX1JFRyAgICAgICAgICAgICAgMHgzQworI2RlZmluZSBWNl9UVU5FUl9JRl9GQ1dfQllQX1JFRyAgICAgICAgICAweDNECisjZGVmaW5lIFY2X1JGX0xPQ0tfU1RBVFVTX1JFRyAgICAgICAgICAgIDB4MjMKKworI2RlZmluZSBOVU1fRElHX1RWX0NIQU5ORUwgICAgIDEwMDAKKworI2RlZmluZSBWNl9ESUdfQ0xLX0ZSRVFfU0VMX1JFRyAgMHgwNworI2RlZmluZSBWNl9SRUZfU1lOVEhfSU5UX1JFRyAgICAgMHg1QworI2RlZmluZSBWNl9SRUZfU1lOVEhfUkVNQUlOX1JFRyAgMHg1OAorI2RlZmluZSBWNl9ESUdfUkZSRUZTRUxFQ1RfUkVHICAgMHgzMgorI2RlZmluZSBWNl9YVEFMX0NMS19PVVRfR0FJTl9SRUcgICAweDMxCisjZGVmaW5lIFY2X1RVTkVSX0xPT1BfVEhSVV9DVFJMX1JFRyAgICAgIDB4MDkKKyNkZWZpbmUgVjZfRElHX1hUQUxfRU5BQkxFX1JFRyAgMHgwNgorI2RlZmluZSBWNl9ESUdfWFRBTF9CSUFTX1JFRyAgMHg2NgorI2RlZmluZSBWNl9YVEFMX0NBUF9SRUcgICAgMHgwOAorCisjZGVmaW5lIFY2X0dQT19DVFJMX1JFRyAgICAgMHgxOAorI2RlZmluZSBNWExfR1BPXzAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTVhMX0dQT18xICAgICAgICAgICAweDAxCisjZGVmaW5lIFY2X0dQT18wX01BU0sgICAgICAgMHgxMAorI2RlZmluZSBWNl9HUE9fMV9NQVNLICAgICAgIDB4MjAKKworI2RlZmluZSBWNl8xMTFTRl9HUE9fQ1RSTF9SRUcgICAgIDB4MTkKKyNkZWZpbmUgTVhMXzExMVNGX0dQT18xICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNWExfMTExU0ZfR1BPXzIgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fMyAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTVhMXzExMVNGX0dQT180ICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBNWExfMTExU0ZfR1BPXzUgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fNiAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgTVhMXzExMVNGX0dQT183ICAgICAgICAgICAgICAgMHgwNgorCisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fMF9NQVNLICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTVhMXzExMVNGX0dQT18xX01BU0sgICAgICAgICAgMHgwMgorI2RlZmluZSBNWExfMTExU0ZfR1BPXzJfTUFTSyAgICAgICAgICAweDA0CisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fM19NQVNLICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTVhMXzExMVNGX0dQT180X01BU0sgICAgICAgICAgMHgxMAorI2RlZmluZSBNWExfMTExU0ZfR1BPXzVfTUFTSyAgICAgICAgICAweDIwCisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fNl9NQVNLICAgICAgICAgIDB4NDAKKworI2RlZmluZSBWNl9BVFNDX0NPTkZJR19SRUcgIDB4MEEKKworI2RlZmluZSBNWExfTU9ERV9SRUcgICAgMHgwMworI2RlZmluZSBTVEFSVF9UVU5FX1JFRyAgMHgxQworCisjZGVmaW5lIFY2X0lEQUNfSFlTVEVSRVNJU19SRUcgICAgMHgwQgorI2RlZmluZSBWNl9JREFDX1NFVFRJTkdTX1JFRyAgICAgIDB4MEMKKyNkZWZpbmUgSURBQ19NQU5VQUxfQ09OVFJPTCAgICAgICAgICAgICAxCisjZGVmaW5lIElEQUNfQ1VSUkVOVF9TSU5LSU5HX0VOQUJMRSAgICAgMQorI2RlZmluZSBJREFDX01BTlVBTF9DT05UUk9MX0JJVF9NQVNLICAgICAgMHg4MAorI2RlZmluZSBJREFDX0NVUlJFTlRfU0lOS0lOR19CSVRfTUFTSyAgICAgMHg0MAorCisjZGVmaW5lIFY4X1NQSV9NT0RFX1JFRyAgMHhFOQorCisjZGVmaW5lIFY2X0RJR19SRl9QV1JfTFNCX1JFRyAgMHg0NgorI2RlZmluZSBWNl9ESUdfUkZfUFdSX01TQl9SRUcgIDB4NDcKKworI2VuZGlmIC8qIF9EVkJfVVNCX01YTDExMVNGX1JFR19IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi10dW5lci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi10dW5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MzQxMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLXR1bmVyLmMKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiAgbXhsMTExc2YtdHVuZXIuYyAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRiBDTU9TIHR1bmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJteGwxMTFzZi10dW5lci5oIgorI2luY2x1ZGUgIm14bDExMXNmLXBoeS5oIgorI2luY2x1ZGUgIm14bDExMXNmLXJlZy5oIgorCisvKiBkZWJ1ZyAqLworc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgbXhsMTExc2ZfdHVuZXJfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvIChvci1hYmxlKSkuIik7CisKKyNkZWZpbmUgbXhsX2RiZyhmbXQsIGFyZy4uLikgXAorCWlmIChteGwxMTFzZl90dW5lcl9kZWJ1ZykgXAorCQlteGxfcHJpbnRrKEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgeworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqbXhsX3N0YXRlOworCisJc3RydWN0IG14bDExMXNmX3R1bmVyX2NvbmZpZyAqY2ZnOworCisJdTMyIGZyZXF1ZW5jeTsKKwl1MzIgYmFuZHdpZHRoOworfTsKKworc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9yZWFkX3JlZyhzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlLAorCQkJCSAgIHU4IGFkZHIsIHU4ICpkYXRhKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+cmVhZF9yZWcpID8KKwkJc3RhdGUtPmNmZy0+cmVhZF9yZWcoc3RhdGUtPm14bF9zdGF0ZSwgYWRkciwgZGF0YSkgOgorCQktRUlOVkFMOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX3R1bmVyX3dyaXRlX3JlZyhzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlLAorCQkJCSAgICB1OCBhZGRyLCB1OCBkYXRhKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+d3JpdGVfcmVnKSA/CisJCXN0YXRlLT5jZmctPndyaXRlX3JlZyhzdGF0ZS0+bXhsX3N0YXRlLCBhZGRyLCBkYXRhKSA6CisJCS1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfdHVuZXJfcHJvZ3JhbV9yZWdzKHN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gKmN0cmxfcmVnX2luZm8pCit7CisJcmV0dXJuIChzdGF0ZS0+Y2ZnLT5wcm9ncmFtX3JlZ3MpID8KKwkJc3RhdGUtPmNmZy0+cHJvZ3JhbV9yZWdzKHN0YXRlLT5teGxfc3RhdGUsIGN0cmxfcmVnX2luZm8pIDoKKwkJLUVJTlZBTDsKK30KKworc3RhdGljIGludCBteGwxeDFzZl90dW5lcl90b3BfbWFzdGVyX2N0cmwoc3RydWN0IG14bDExMXNmX3R1bmVyX3N0YXRlICpzdGF0ZSwKKwkJCQkJICBpbnQgb25vZmYpCit7CisJcmV0dXJuIChzdGF0ZS0+Y2ZnLT50b3BfbWFzdGVyX2N0cmwpID8KKwkJc3RhdGUtPmNmZy0+dG9wX21hc3Rlcl9jdHJsKHN0YXRlLT5teGxfc3RhdGUsIG9ub2ZmKSA6CisJCS1FSU5WQUw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gbXhsX3BoeV90dW5lX3JmW10gPSB7CisJezB4MWQsIDB4N2YsIDB4MDB9LCAvKiBjaGFubmVsIGJhbmR3aWR0aCBzZWN0aW9uIDEvMi8zLAorCQkJICAgICAgIERJR19NT0RFSU5ERVgsIF9BLCBfQ1NGLCAqLworCXsweDFlLCAweGZmLCAweDAwfSwgLyogY2hhbm5lbCBmcmVxdWVuY3kgKGxvIGFuZCBmcmFjdGlvbmFsKSAqLworCXsweDFmLCAweGZmLCAweDAwfSwgLyogY2hhbm5lbCBmcmVxdWVuY3kgKGhpIGZvciBpbnRlZ2VyIHBvcnRpb24pICovCisJezAsICAgIDAsICAgIDB9Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvICpteGwxMTFzZl9jYWxjX3BoeV90dW5lX3JlZ3ModTMyIGZyZXEsCisJCQkJCQkJCSAgdTggYncpCit7CisJdTggZmlsdF9idzsKKworCS8qIHNldCBjaGFubmVsIGJhbmR3aWR0aCAqLworCXN3aXRjaCAoYncpIHsKKwljYXNlIDA6IC8qIEFUU0MgKi8KKwkJZmlsdF9idyA9IDI1OworCQlicmVhazsKKwljYXNlIDE6IC8qIFFBTSAqLworCQlmaWx0X2J3ID0gNjk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJZmlsdF9idyA9IDIxOworCQlicmVhazsKKwljYXNlIDc6CisJCWZpbHRfYncgPSA0MjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlmaWx0X2J3ID0gNjM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigiJXM6IGludmFsaWQgYmFuZHdpZHRoIHNldHRpbmchIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBjYWxjdWxhdGUgUkYgY2hhbm5lbCAqLworCWZyZXEgLz0gMTAwMDAwMDsKKworCWZyZXEgKj0gNjQ7CisjaWYgMAorCS8qIGRvIHJvdW5kICovCisJZnJlcSArPSAwLjU7CisjZW5kaWYKKwkvKiBzZXQgYmFuZHdpZHRoICovCisJbXhsX3BoeV90dW5lX3JmWzBdLmRhdGEgPSBmaWx0X2J3OworCisJLyogc2V0IFJGICovCisJbXhsX3BoeV90dW5lX3JmWzFdLmRhdGEgPSAoZnJlcSAmIDB4ZmYpOworCW14bF9waHlfdHVuZV9yZlsyXS5kYXRhID0gKGZyZXEgPj4gOCkgJiAweGZmOworCisJLyogc3RhcnQgdHVuZSAqLworCXJldHVybiBteGxfcGh5X3R1bmVfcmY7Cit9CisKK3N0YXRpYyBpbnQgbXhsMXgxc2ZfdHVuZXJfc2V0X2lmX291dHB1dF9mcmVxKHN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHJldDsKKwl1OCBjdHJsOworI2lmIDAKKwl1MTYgaWZmY3c7CisJdTMyIGlmX2ZyZXE7CisjZW5kaWYKKwlteGxfZGJnKCIoSUYgcG9sYXJpdHkgPSAlZCwgSUYgZnJlcSA9IDB4JTAyeCkiLAorCQlzdGF0ZS0+Y2ZnLT5pbnZlcnRfc3BlY3RydW0sIHN0YXRlLT5jZmctPmlmX2ZyZXEpOworCisJLyogc2V0IElGIHBvbGFyaXR5ICovCisJY3RybCA9IHN0YXRlLT5jZmctPmludmVydF9zcGVjdHJ1bTsKKworCWN0cmwgfD0gc3RhdGUtPmNmZy0+aWZfZnJlcTsKKworCXJldCA9IG14bDExMXNmX3R1bmVyX3dyaXRlX3JlZyhzdGF0ZSwgVjZfVFVORVJfSUZfU0VMX1JFRywgY3RybCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworI2lmIDAKKwlpZl9mcmVxIC89IDEwMDAwMDA7CisKKwkvKiBkbyByb3VuZCAqLworCWlmX2ZyZXEgKz0gMC41OworCisJaWYgKE1YTF9JRl9MTyA9PSBzdGF0ZS0+Y2ZnLT5pZl9mcmVxKSB7CisJCWN0cmwgPSAweDA4OworCQlpZmZjdyA9ICh1MTYpKGlmX2ZyZXEgLyAoMTA4ICogNDA5NikpOworCX0gZWxzZSBpZiAoTVhMX0lGX0hJID09IHN0YXRlLT5jZmctPmlmX2ZyZXEpIHsKKwkJY3RybCA9IDB4MDg7CisJCWlmZmN3ID0gKHUxNikoaWZfZnJlcSAvICgyMTYgKiA0MDk2KSk7CisJfSBlbHNlIHsKKwkJY3RybCA9IDA7CisJCWlmZmN3ID0gMDsKKwl9CisKKwljdHJsIHw9IChpZmZjdyA+PiA4KTsKKyNlbmRpZgorCXJldCA9IG14bDExMXNmX3R1bmVyX3JlYWRfcmVnKHN0YXRlLCBWNl9UVU5FUl9JRl9GQ1dfQllQX1JFRywgJmN0cmwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwljdHJsICY9IDB4ZjA7CisJY3RybCB8PSAweDkwOworCisJcmV0ID0gbXhsMTExc2ZfdHVuZXJfd3JpdGVfcmVnKHN0YXRlLCBWNl9UVU5FUl9JRl9GQ1dfQllQX1JFRywgY3RybCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworI2lmIDAKKwljdHJsID0gaWZmY3cgJiAweDAwZmY7CisjZW5kaWYKKwlyZXQgPSBteGwxMTFzZl90dW5lcl93cml0ZV9yZWcoc3RhdGUsIFY2X1RVTkVSX0lGX0ZDV19SRUcsIGN0cmwpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMXgxc2ZfdHVuZV9yZihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIGZyZXEsIHU4IGJ3KQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlzdGF0aWMgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gKnJlZ19jdHJsX2FycmF5OworCWludCByZXQ7CisJdTggbXhsX21vZGU7CisKKwlteGxfZGJnKCIoZnJlcSA9ICVkLCBidyA9IDB4JXgpIiwgZnJlcSwgYncpOworCisJLyogc3RvcCB0dW5lICovCisJcmV0ID0gbXhsMTExc2ZfdHVuZXJfd3JpdGVfcmVnKHN0YXRlLCBTVEFSVF9UVU5FX1JFRywgMCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCS8qIGNoZWNrIGRldmljZSBtb2RlICovCisJcmV0ID0gbXhsMTExc2ZfdHVuZXJfcmVhZF9yZWcoc3RhdGUsIE1YTF9NT0RFX1JFRywgJm14bF9tb2RlKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJLyogRmlsbCBvdXQgcmVnaXN0ZXJzIGZvciBjaGFubmVsIHR1bmUgKi8KKwlyZWdfY3RybF9hcnJheSA9IG14bDExMXNmX2NhbGNfcGh5X3R1bmVfcmVncyhmcmVxLCBidyk7CisJaWYgKCFyZWdfY3RybF9hcnJheSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBteGwxMTFzZl90dW5lcl9wcm9ncmFtX3JlZ3Moc3RhdGUsIHJlZ19jdHJsX2FycmF5KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJaWYgKChteGxfbW9kZSAmIE1YTF9ERVZfTU9ERV9NQVNLKSA9PSBNWExfVFVORVJfTU9ERSkgeworCQkvKiBJRiB0dW5lciBtb2RlIG9ubHkgKi8KKwkJbXhsMXgxc2ZfdHVuZXJfdG9wX21hc3Rlcl9jdHJsKHN0YXRlLCAwKTsKKwkJbXhsMXgxc2ZfdHVuZXJfdG9wX21hc3Rlcl9jdHJsKHN0YXRlLCAxKTsKKwkJbXhsMXgxc2ZfdHVuZXJfc2V0X2lmX291dHB1dF9mcmVxKHN0YXRlKTsKKwl9CisKKwlyZXQgPSBteGwxMTFzZl90dW5lcl93cml0ZV9yZWcoc3RhdGUsIFNUQVJUX1RVTkVfUkVHLCAxKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJaWYgKHN0YXRlLT5jZmctPmFudF9odW50KQorCQlzdGF0ZS0+Y2ZnLT5hbnRfaHVudChmZSk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMXgxc2ZfdHVuZXJfZ2V0X2xvY2tfc3RhdHVzKHN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUsCisJCQkJCSAgaW50ICpyZl9zeW50aF9sb2NrLAorCQkJCQkgIGludCAqcmVmX3N5bnRoX2xvY2spCit7CisJaW50IHJldDsKKwl1OCBkYXRhOworCisJKnJmX3N5bnRoX2xvY2sgPSAwOworCSpyZWZfc3ludGhfbG9jayA9IDA7CisKKwlyZXQgPSBteGwxMTFzZl90dW5lcl9yZWFkX3JlZyhzdGF0ZSwgVjZfUkZfTE9DS19TVEFUVVNfUkVHLCAmZGF0YSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCSpyZWZfc3ludGhfbG9jayA9ICgoZGF0YSAmIDB4MDMpID09IDB4MDMpID8gMSA6IDA7CisJKnJmX3N5bnRoX2xvY2sgID0gKChkYXRhICYgMHgwYykgPT0gMHgwYykgPyAxIDogMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgbXhsMXgxc2ZfdHVuZXJfbG9vcF90aHJ1X2N0cmwoc3RydWN0IG14bDExMXNmX3R1bmVyX3N0YXRlICpzdGF0ZSwKKwkJCQkJIGludCBvbm9mZikKK3sKKwlyZXR1cm4gbXhsMTExc2ZfdHVuZXJfd3JpdGVfcmVnKHN0YXRlLCBWNl9UVU5FUl9MT09QX1RIUlVfQ1RSTF9SRUcsCisJCQkJCW9ub2ZmID8gMSA6IDApOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG14bDExMXNmX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJldDsKKwl1OCBidzsKKworCW14bF9kYmcoIigpIik7CisKKwlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfQVRTQykgeworCQlzd2l0Y2ggKHBhcmFtcy0+dS52c2IubW9kdWxhdGlvbikgeworCQljYXNlIFZTQl84OgorCQljYXNlIFZTQl8xNjoKKwkJCWJ3ID0gMDsgLyogQVRTQyAqLworCQkJYnJlYWs7CisJCWNhc2UgUUFNXzY0OgorCQljYXNlIFFBTV8yNTY6CisJCQlidyA9IDE7IC8qIFVTIENBQkxFICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigiJXM6IG1vZHVsYXRpb24gbm90IHNldCEiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgeworCQlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgeworCQljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJCWJ3ID0gNjsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJCWJ3ID0gNzsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJCWJ3ID0gODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyKCIlczogYmFuZHdpZHRoIG5vdCBzZXQhIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQllcnIoIiVzOiBtb2R1bGF0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBteGwxeDFzZl90dW5lX3JmKGZlLCBwYXJhbXMtPmZyZXF1ZW5jeSwgYncpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0ZS0+ZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3k7CisJc3RhdGUtPmJhbmR3aWR0aCA9IChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9PRkRNKSA/CisJCXBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCA6IDA7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgMAorc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgcmV0OworCisJLyogd2FrZSBmcm9tIHN0YW5kYnkgaGFuZGxlZCBieSB1c2IgZHJpdmVyICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14bDExMXNmX3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgcmV0OworCisJLyogZW50ZXIgc3RhbmRieSBtb2RlIGhhbmRsZWQgYnkgdXNiIGRyaXZlciAqLworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9nZXRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJmX2xvY2tlZCwgcmVmX2xvY2tlZCwgcmV0OworCisJKnN0YXR1cyA9IDA7CisKKwlyZXQgPSBteGwxeDFzZl90dW5lcl9nZXRfbG9ja19zdGF0dXMoc3RhdGUsICZyZl9sb2NrZWQsICZyZWZfbG9ja2VkKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCW14bF9pbmZvKCIlcyVzIiwgcmZfbG9ja2VkID8gInJmIGxvY2tlZCAiIDogIiIsCisJCSByZWZfbG9ja2VkID8gInJlZiBsb2NrZWQiIDogIiIpOworCisJaWYgKChyZl9sb2NrZWQpIHx8IChyZWZfbG9ja2VkKSkKKwkJKnN0YXR1cyB8PSBUVU5FUl9TVEFUVVNfTE9DS0VEOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2dldF9yZl9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJdTggdmFsMSwgdmFsMjsKKwlpbnQgcmV0OworCisJKnN0cmVuZ3RoID0gMDsKKworCXJldCA9IG14bDExMXNmX3R1bmVyX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMCwgMHgwMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxMTFzZl90dW5lcl9yZWFkX3JlZyhzdGF0ZSwgVjZfRElHX1JGX1BXUl9MU0JfUkVHLCAmdmFsMSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxMTFzZl90dW5lcl9yZWFkX3JlZyhzdGF0ZSwgVjZfRElHX1JGX1BXUl9NU0JfUkVHLCAmdmFsMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCSpzdHJlbmd0aCA9IHZhbDEgfCAoKHZhbDIgJiAweDA3KSA8PCA4KTsKK2ZhaWw6CisJcmV0ID0gbXhsMTExc2ZfdHVuZXJfd3JpdGVfcmVnKHN0YXRlLCAweDAwLCAweDAwKTsKKwlteGxfZmFpbChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfdHVuZXJfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpCit7CisJc3RydWN0IG14bDExMXNmX3R1bmVyX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCSpmcmVxdWVuY3kgPSBzdGF0ZS0+ZnJlcXVlbmN5OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX3R1bmVyX2dldF9iYW5kd2lkdGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmFuZHdpZHRoKQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwkqYmFuZHdpZHRoID0gc3RhdGUtPmJhbmR3aWR0aDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlteGxfZGJnKCIoKSIpOworCWtmcmVlKHN0YXRlKTsKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBkdmJfdHVuZXJfb3BzIG14bDExMXNmX3R1bmVyX3R1bmVyX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiTWF4TGluZWFyIE14TDExMVNGIiwKKyNpZiAwCisJCS5mcmVxdWVuY3lfbWluICA9ICwKKwkJLmZyZXF1ZW5jeV9tYXggID0gLAorCQkuZnJlcXVlbmN5X3N0ZXAgPSAsCisjZW5kaWYKKwl9LAorI2lmIDAKKwkuaW5pdCAgICAgICAgICAgICAgPSBteGwxMTFzZl90dW5lcl9pbml0LAorCS5zbGVlcCAgICAgICAgICAgICA9IG14bDExMXNmX3R1bmVyX3NsZWVwLAorI2VuZGlmCisJLnNldF9wYXJhbXMgICAgICAgID0gbXhsMTExc2ZfdHVuZXJfc2V0X3BhcmFtcywKKwkuZ2V0X3N0YXR1cyAgICAgICAgPSBteGwxMTFzZl90dW5lcl9nZXRfc3RhdHVzLAorCS5nZXRfcmZfc3RyZW5ndGggICA9IG14bDExMXNmX2dldF9yZl9zdHJlbmd0aCwKKwkuZ2V0X2ZyZXF1ZW5jeSAgICAgPSBteGwxMTFzZl90dW5lcl9nZXRfZnJlcXVlbmN5LAorCS5nZXRfYmFuZHdpZHRoICAgICA9IG14bDExMXNmX3R1bmVyX2dldF9iYW5kd2lkdGgsCisJLnJlbGVhc2UgICAgICAgICAgID0gbXhsMTExc2ZfdHVuZXJfcmVsZWFzZSwKK307CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKm14bDExMXNmX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJICAgc3RydWN0IG14bDExMXNmX3N0YXRlICpteGxfc3RhdGUsCisJCQkJCSAgIHN0cnVjdCBteGwxMTFzZl90dW5lcl9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlID0gTlVMTDsKKworCW14bF9kYmcoIigpIik7CisKKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXRlLT5teGxfc3RhdGUgPSBteGxfc3RhdGU7CisJc3RhdGUtPmNmZyA9IGNmZzsKKworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZteGwxMTFzZl90dW5lcl90dW5lcl9vcHMsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCisJZmUtPnR1bmVyX3ByaXYgPSBzdGF0ZTsKKwlyZXR1cm4gZmU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChteGwxMTFzZl90dW5lcl9hdHRhY2gpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1heExpbmVhciBNeEwxMTFTRiBDTU9TIHR1bmVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4xIik7CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi10dW5lci5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi10dW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzMzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLXR1bmVyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqICBteGwxMTFzZi10dW5lci5oIC0gZHJpdmVyIGZvciB0aGUgTWF4TGluZWFyIE1YTDExMVNGIENNT1MgdHVuZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX01YTDExMVNGX1RVTkVSX0hfXworI2RlZmluZSBfX01YTDExMVNGX1RVTkVSX0hfXworCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNpbmNsdWRlICJteGwxMTFzZi5oIgorCitlbnVtIG14bF9pZl9mcmVxIHsKKyNpZiAwCisJTVhMX0lGX0xPICAgID0gMHgwMCwgLyogb3RoZXIgSUYgPCA5TUh6ICovCisjZW5kaWYKKwlNWExfSUZfNF8wICAgPSAweDAxLCAvKiA0LjAgICBNSHogKi8KKwlNWExfSUZfNF81ICAgPSAweDAyLCAvKiA0LjUgICBNSHogKi8KKwlNWExfSUZfNF81NyAgPSAweDAzLCAvKiA0LjU3ICBNSHogKi8KKwlNWExfSUZfNV8wICAgPSAweDA0LCAvKiA1LjAgICBNSHogKi8KKwlNWExfSUZfNV8zOCAgPSAweDA1LCAvKiA1LjM4ICBNSHogKi8KKwlNWExfSUZfNl8wICAgPSAweDA2LCAvKiA2LjAgICBNSHogKi8KKwlNWExfSUZfNl8yOCAgPSAweDA3LCAvKiA2LjI4ICBNSHogKi8KKwlNWExfSUZfN18yICAgPSAweDA4LCAvKiA3LjIgICBNSHogKi8KKwlNWExfSUZfMzVfMjUgPSAweDA5LCAvKiAzNS4yNSBNSHogKi8KKwlNWExfSUZfMzYgICAgPSAweDBhLCAvKiAzNiAgICBNSHogKi8KKwlNWExfSUZfMzZfMTUgPSAweDBiLCAvKiAzNi4xNSBNSHogKi8KKwlNWExfSUZfNDQgICAgPSAweDBjLCAvKiA0NCAgICBNSHogKi8KKyNpZiAwCisJTVhMX0lGX0hJICAgID0gMHgwZiwgLyogb3RoZXIgSUYgPiAzNSBNSHogYW5kIDwgNDUgTUh6ICovCisjZW5kaWYKK307CisKK3N0cnVjdCBteGwxMTFzZl90dW5lcl9jb25maWcgeworCWVudW0gbXhsX2lmX2ZyZXEgaWZfZnJlcTsKKwl1bnNpZ25lZCBpbnQgaW52ZXJ0X3NwZWN0cnVtOjE7CisKKwlpbnQgKCpyZWFkX3JlZykoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggYWRkciwgdTggKmRhdGEpOworCWludCAoKndyaXRlX3JlZykoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggYWRkciwgdTggZGF0YSk7CisJaW50ICgqcHJvZ3JhbV9yZWdzKShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJICAgIHN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvICpjdHJsX3JlZ19pbmZvKTsKKwlpbnQgKCp0b3BfbWFzdGVyX2N0cmwpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBvbm9mZik7CisJaW50ICgqYW50X2h1bnQpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1VTQl9NWEwxMTFTRikgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfVVNCX01YTDExMVNGX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpteGwxMTFzZl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSAgIHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqbXhsX3N0YXRlLAorCQkJCQkgICBzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfY29uZmlnICpjZmcpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKm14bDExMXNmX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJICAgc3RydWN0IG14bDExMXNmX3N0YXRlICpteGxfc3RhdGUKKwkJCQkJICAgc3RydWN0IG14bDExMXNmX3R1bmVyX2NvbmZpZyAqY2ZnKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX01YTDExMVNGX1RVTkVSX0hfXyAqLworCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Yzk4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLmMKQEAgLTAsMCArMSwxMDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IChta3J1Zmt5QGtlcm5lbGxhYnMuY29tKQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlICJteGwxMTFzZi5oIgorI2luY2x1ZGUgIm14bDExMXNmLXJlZy5oIgorI2luY2x1ZGUgIm14bDExMXNmLXBoeS5oIgorI2luY2x1ZGUgIm14bDExMXNmLWkyYy5oIgorI2luY2x1ZGUgIm14bDExMXNmLWdwaW8uaCIKKworI2luY2x1ZGUgIm14bDExMXNmLWRlbW9kLmgiCisjaW5jbHVkZSAibXhsMTExc2YtdHVuZXIuaCIKKworI2luY2x1ZGUgImxnZHQzMzA1LmgiCisKK2ludCBkdmJfdXNiX214bDExMXNmX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkdmJfdXNiX214bDExMXNmX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgIgorCQkgIigxPWluZm8sIDI9eGZlciwgND1pMmMsIDg9cmVnLCAxNj1hZHYgKG9yLWFibGUpKS4iKTsKKworaW50IGR2Yl91c2JfbXhsMTExc2ZfaXNvYzsKK21vZHVsZV9wYXJhbV9uYW1lZChpc29jLCBkdmJfdXNiX214bDExMXNmX2lzb2MsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlzb2MsICJlbmFibGUgdXNiIGlzb2MgeGZlciAoMD1idWxrLCAxPWlzb2MpLiIpOworCisjZGVmaW5lIEFOVF9QQVRIX0FVVE8gMAorI2RlZmluZSBBTlRfUEFUSF9FWFRFUk5BTCAxCisjZGVmaW5lIEFOVF9QQVRIX0lOVEVSTkFMIDIKKworaW50IGR2Yl91c2JfbXhsMTExc2ZfcmZzd2l0Y2ggPQorI2lmIDAKKwkJQU5UX1BBVEhfQVVUTzsKKyNlbHNlCisJCUFOVF9QQVRIX0VYVEVSTkFMOworI2VuZGlmCisKK21vZHVsZV9wYXJhbV9uYW1lZChyZnN3aXRjaCwgZHZiX3VzYl9teGwxMTFzZl9yZnN3aXRjaCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmZzd2l0Y2gsICJmb3JjZSByZiBzd2l0Y2ggcG9zaXRpb24gKDA9YXV0bywgMT1leHQsIDI9aW50KS4iKTsKKworRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfbXhsMTExc2ZfZGVidWcsIDB4MTMsIGFyZ3MpCisjZGVmaW5lIGRlYl9yZWcoYXJncy4uLikgICAgZHByaW50ayhkdmJfdXNiX214bDExMXNmX2RlYnVnLCAweDA4LCBhcmdzKQorI2RlZmluZSBkZWJfYWR2KGFyZ3MuLi4pICAgIGRwcmludGsoZHZiX3VzYl9teGwxMTFzZl9kZWJ1ZywgTVhMX0FEVl9EQkcsIGFyZ3MpCisKK2ludCBteGwxMTFzZl9jdHJsX21zZyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsCisJCSAgICAgIHU4IGNtZCwgdTggKndidWYsIGludCB3bGVuLCB1OCAqcmJ1ZiwgaW50IHJsZW4pCit7CisJaW50IHdvID0gKHJidWYgPT0gTlVMTCB8fCBybGVuID09IDApOyAvKiB3cml0ZS1vbmx5ICovCisJaW50IHJldDsKKwl1OCBzbmRidWZbMSt3bGVuXTsKKworCWRlYl9hZHYoIiVzKHdsZW4gPSAlZCwgcmxlbiA9ICVkKVxuIiwgX19mdW5jX18sIHdsZW4sIHJsZW4pOworCisJbWVtc2V0KHNuZGJ1ZiwgMCwgMSt3bGVuKTsKKworCXNuZGJ1ZlswXSA9IGNtZDsKKwltZW1jcHkoJnNuZGJ1ZlsxXSwgd2J1Ziwgd2xlbik7CisKKwlyZXQgPSAod28pID8gZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsIHNuZGJ1ZiwgMSt3bGVuKSA6CisJCWR2Yl91c2JfZ2VuZXJpY19ydyhkLCBzbmRidWYsIDErd2xlbiwgcmJ1ZiwgcmxlbiwgMCk7CisJbXhsX2ZhaWwocmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1YTF9DTURfUkVHX1JFQUQJMHhhYQorI2RlZmluZSBNWExfQ01EX1JFR19XUklURQkweDU1CisKK2ludCBteGwxMTFzZl9yZWFkX3JlZyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLCB1OCBhZGRyLCB1OCAqZGF0YSkKK3sKKwl1OCBidWZbMl07CisJaW50IHJldDsKKworCXJldCA9IG14bDExMXNmX2N0cmxfbXNnKHN0YXRlLT5kLCBNWExfQ01EX1JFR19SRUFELCAmYWRkciwgMSwgYnVmLCAyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkgeworCQlteGxfZGVidWcoImVycm9yIHJlYWRpbmcgcmVnOiAweCUwMngiLCBhZGRyKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChidWZbMF0gPT0gYWRkcikKKwkJKmRhdGEgPSBidWZbMV07CisJZWxzZSB7CisJCWVycigiaW52YWxpZCByZXNwb25zZSByZWFkaW5nIHJlZzogMHglMDJ4ICE9IDB4JTAyeCwgMHglMDJ4IiwKKwkJICAgIGFkZHIsIGJ1ZlswXSwgYnVmWzFdKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlkZWJfcmVnKCJSOiAoMHglMDJ4LCAweCUwMngpXG4iLCBhZGRyLCAqZGF0YSk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBteGwxMTFzZl93cml0ZV9yZWcoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggYWRkciwgdTggZGF0YSkKK3sKKwl1OCBidWZbXSA9IHsgYWRkciwgZGF0YSB9OworCWludCByZXQ7CisKKwlkZWJfcmVnKCJXOiAoMHglMDJ4LCAweCUwMngpXG4iLCBhZGRyLCBkYXRhKTsKKworCXJldCA9IG14bDExMXNmX2N0cmxfbXNnKHN0YXRlLT5kLCBNWExfQ01EX1JFR19XUklURSwgYnVmLCAyLCBOVUxMLCAwKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZXJyKCJlcnJvciB3cml0aW5nIHJlZzogMHglMDJ4LCB2YWw6IDB4JTAyeCIsIGFkZHIsIGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgbXhsMTExc2Zfd3JpdGVfcmVnX21hc2soc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCQkgICB1OCBhZGRyLCB1OCBtYXNrLCB1OCBkYXRhKQoreworCWludCByZXQ7CisJdTggdmFsOworCisJaWYgKG1hc2sgIT0gMHhmZikgeworCQlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgYWRkciwgJnZhbCk7CisjaWYgMQorCQkvKiBkb250IGtub3cgd2h5IHRoaXMgdXN1YWxseSBlcnJvcnMgb3V0IG9uIHRoZSBmaXJzdCB0cnkgKi8KKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQllcnIoImVycm9yIHdyaXRpbmcgYWRkcjogMHglMDJ4LCBtYXNrOiAweCUwMngsICIKKwkJCSAgICAiZGF0YTogMHglMDJ4LCByZXRyeWluZy4uLiIsIGFkZHIsIG1hc2ssIGRhdGEpOworCisJCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBhZGRyLCAmdmFsKTsKKyNlbmRpZgorCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJdmFsICY9IH5tYXNrOworCXZhbCB8PSBkYXRhOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBhZGRyLCB2YWwpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgbXhsMTExc2ZfY3RybF9wcm9ncmFtX3JlZ3Moc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICBzdHJ1Y3QgbXhsMTExc2ZfcmVnX2N0cmxfaW5mbyAqY3RybF9yZWdfaW5mbykKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7ICBjdHJsX3JlZ19pbmZvW2ldLmFkZHIgfAorCQkgICAgIGN0cmxfcmVnX2luZm9baV0ubWFzayB8CisJCSAgICAgY3RybF9yZWdfaW5mb1tpXS5kYXRhOyAgaSsrKSB7CisKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnX21hc2soc3RhdGUsCisJCQkJCSAgICAgIGN0cmxfcmVnX2luZm9baV0uYWRkciwKKwkJCQkJICAgICAgY3RybF9yZWdfaW5mb1tpXS5tYXNrLAorCQkJCQkgICAgICBjdHJsX3JlZ19pbmZvW2ldLmRhdGEpOworCQlpZiAobXhsX2ZhaWwocmV0KSkgeworCQkJZXJyKCJmYWlsZWQgb24gcmVnICMlZCAoMHglMDJ4KSIsIGksCisJCQkgICAgY3RybF9yZWdfaW5mb1tpXS5hZGRyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG14bDF4MXNmX2dldF9jaGlwX2luZm8oc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCXU4IGlkLCB2ZXI7CisJY2hhciAqbXhsX2NoaXAsICpteGxfcmV2OworCisJaWYgKChzdGF0ZS0+Y2hpcF9pZCkgJiYgKHN0YXRlLT5jaGlwX3ZlcikpCisJCXJldHVybiAwOworCisJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIENISVBfSURfUkVHLCAmaWQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJc3RhdGUtPmNoaXBfaWQgPSBpZDsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBUT1BfQ0hJUF9SRVZfSURfUkVHLCAmdmVyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXN0YXRlLT5jaGlwX3ZlciA9IHZlcjsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIDB4NjE6CisJCW14bF9jaGlwID0gIk14TDEwMVNGIjsKKwkJYnJlYWs7CisJY2FzZSAweDYzOgorCQlteGxfY2hpcCA9ICJNeEwxMTFTRiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW14bF9jaGlwID0gIlVOS05PV04gTXhMMVgxIjsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAodmVyKSB7CisJY2FzZSAweDM2OgorCQlzdGF0ZS0+Y2hpcF9yZXYgPSBNWEwxMTFTRl9WNjsKKwkJbXhsX3JldiA9ICJ2NiI7CisJCWJyZWFrOworCWNhc2UgMHgwODoKKwkJc3RhdGUtPmNoaXBfcmV2ID0gTVhMMTExU0ZfVjhfMTAwOworCQlteGxfcmV2ID0gInY4XzEwMCI7CisJCWJyZWFrOworCWNhc2UgMHgxODoKKwkJc3RhdGUtPmNoaXBfcmV2ID0gTVhMMTExU0ZfVjhfMjAwOworCQlteGxfcmV2ID0gInY4XzIwMCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXRlLT5jaGlwX3JldiA9IDA7CisJCW14bF9yZXYgPSAiVU5LTk9XTiBSRVZJU0lPTiI7CisJCWJyZWFrOworCX0KKwlpbmZvKCIlcyBkZXRlY3RlZCwgJXMgKDB4JXgpIiwgbXhsX2NoaXAsIG14bF9yZXYsIHZlcik7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgZ2V0X2NoaXBfaW5mbyhzdGF0ZSkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19fcmV0OwkJCQkJCQlcCisJX19fcmV0ID0gbXhsMXgxc2ZfZ2V0X2NoaXBfaW5mbyhzdGF0ZSk7CQkJCVwKKwlpZiAobXhsX2ZhaWwoX19fcmV0KSkgewkJCQkJCVwKKwkJbXhsX2RlYnVnKCJmYWlsZWQgdG8gZ2V0IGNoaXAgaW5mbyIJCQlcCisJCQkgICIgb24gZmlyc3QgcHJvYmUgYXR0ZW1wdCIpOwkJCVwKKwkJX19fcmV0ID0gbXhsMXgxc2ZfZ2V0X2NoaXBfaW5mbyhzdGF0ZSk7CQkJXAorCQlpZiAobXhsX2ZhaWwoX19fcmV0KSkJCQkJCVwKKwkJCWVycigiZmFpbGVkIHRvIGdldCBjaGlwIGluZm8gZHVyaW5nIHByb2JlIik7CVwKKwkJZWxzZQkJCQkJCQlcCisJCQlteGxfZGVidWcoInByb2JlIG5lZWRlZCBhIHJldHJ5ICIJCVwKKwkJCQkgICJpbiBvcmRlciB0byBzdWNjZWVkLiIpOwkJXAorCX0JCQkJCQkJCVwKKwlfX19yZXQ7CQkJCQkJCQlcCit9KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBteGwxMTFzZl9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQoreworCS8qIHBvd2VyIGNvbnRyb2wgZGVwZW5kcyBvbiB3aGljaCBhZGFwdGVyIGlzIGJlaW5nIHdva2VuOgorCSAqIHNhdmUgdGhpcyBmb3IgaW5pdCwgaW5zdGVhZCwgdmlhIG14bDExMXNmX2FkYXBfZmVfaW5pdCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2FkYXBfZmVfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhZGFwLT5kZXY7CisJc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisJc3RydWN0IG14bDExMXNmX2FkYXBfc3RhdGUgKmFkYXBfc3RhdGUgPSBhZGFwLT5mZV9hZGFwW2ZlLT5pZF0ucHJpdjsKKworCWludCBlcnI7CisKKwkvKiBleGl0IGlmIHdlIGRpZG50IGluaXRpYWxpemUgdGhlIGRyaXZlciB5ZXQgKi8KKwlpZiAoIXN0YXRlLT5jaGlwX2lkKSB7CisJCW14bF9kZWJ1ZygiZHJpdmVyIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIGV4aXQuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZWJfaW5mbygiJXMoKVxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmc3RhdGUtPmZlX2xvY2spOworCisJc3RhdGUtPmFsdF9tb2RlID0gYWRhcF9zdGF0ZS0+YWx0X21vZGU7CisKKwlpZiAodXNiX3NldF9pbnRlcmZhY2UoYWRhcC0+ZGV2LT51ZGV2LCAwLCBzdGF0ZS0+YWx0X21vZGUpIDwgMCkKKwkJZXJyKCJzZXQgaW50ZXJmYWNlIGZhaWxlZCIpOworCisJZXJyID0gbXhsMXgxc2Zfc29mdF9yZXNldChzdGF0ZSk7CisJbXhsX2ZhaWwoZXJyKTsKKwllcnIgPSBteGwxMTFzZl9pbml0X3R1bmVyX2RlbW9kKHN0YXRlKTsKKwlteGxfZmFpbChlcnIpOworCWVyciA9IG14bDF4MXNmX3NldF9kZXZpY2VfbW9kZShzdGF0ZSwgYWRhcF9zdGF0ZS0+ZGV2aWNlX21vZGUpOworCisJbXhsX2ZhaWwoZXJyKTsKKwlteGwxMTFzZl9lbmFibGVfdXNiX291dHB1dChzdGF0ZSk7CisJbXhsX2ZhaWwoZXJyKTsKKwlteGwxeDFzZl90b3BfbWFzdGVyX2N0cmwoc3RhdGUsIDEpOworCW14bF9mYWlsKGVycik7CisKKwlpZiAoKE1YTDExMVNGX0dQSU9fTU9EX0RWQlQgIT0gYWRhcF9zdGF0ZS0+Z3Bpb19tb2RlKSAmJgorCSAgICAoc3RhdGUtPmNoaXBfcmV2ID4gTVhMMTExU0ZfVjYpKSB7CisJCW14bDExMXNmX2NvbmZpZ19waW5fbXV4X21vZGVzKHN0YXRlLAorCQkJCQkgICAgICBQSU5fTVVYX1RTX1NQSV9JTl9NT0RFXzEpOworCQlteGxfZmFpbChlcnIpOworCX0KKwllcnIgPSBteGwxMTFzZl9pbml0X3BvcnRfZXhwYW5kZXIoc3RhdGUpOworCWlmICghbXhsX2ZhaWwoZXJyKSkgeworCQlzdGF0ZS0+Z3Bpb19tb2RlID0gYWRhcF9zdGF0ZS0+Z3Bpb19tb2RlOworCQllcnIgPSBteGwxMTFzZl9ncGlvX21vZGVfc3dpdGNoKHN0YXRlLCBzdGF0ZS0+Z3Bpb19tb2RlKTsKKwkJbXhsX2ZhaWwoZXJyKTsKKyNpZiAwCisJCWVyciA9IGZlLT5vcHMuaW5pdChmZSk7CisjZW5kaWYKKwkJbXNsZWVwKDEwMCk7IC8qIGFkZCBzaG9ydCBkZWxheSBhZnRlciBlbmFibGluZworCQkJICAgICAgKiB0aGUgZGVtb2QgYmVmb3JlIHRvdWNoaW5nIGl0ICovCisJfQorCisJcmV0dXJuIChhZGFwX3N0YXRlLT5mZV9pbml0KSA/IGFkYXBfc3RhdGUtPmZlX2luaXQoZmUpIDogMDsKK2ZhaWw6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfYWRhcF9mZV9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhZGFwLT5kZXY7CisJc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisJc3RydWN0IG14bDExMXNmX2FkYXBfc3RhdGUgKmFkYXBfc3RhdGUgPSBhZGFwLT5mZV9hZGFwW2ZlLT5pZF0ucHJpdjsKKwlpbnQgZXJyOworCisJLyogZXhpdCBpZiB3ZSBkaWRudCBpbml0aWFsaXplIHRoZSBkcml2ZXIgeWV0ICovCisJaWYgKCFzdGF0ZS0+Y2hpcF9pZCkgeworCQlteGxfZGVidWcoImRyaXZlciBub3QgeWV0IGluaXRpYWxpemVkLCBleGl0LiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJZGViX2luZm8oIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWVyciA9IChhZGFwX3N0YXRlLT5mZV9zbGVlcCkgPyBhZGFwX3N0YXRlLT5mZV9zbGVlcChmZSkgOiAwOworCisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+ZmVfbG9jayk7CisKKwlyZXR1cm4gZXJyOworZmFpbDoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCitzdGF0aWMgaW50IG14bDExMXNmX2VwNl9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gYWRhcC0+ZGV2OworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCXN0cnVjdCBteGwxMTFzZl9hZGFwX3N0YXRlICphZGFwX3N0YXRlID0gYWRhcC0+ZmVfYWRhcFthZGFwLT5hY3RpdmVfZmVdLnByaXY7CisJaW50IHJldCA9IDA7CisJdTggdG1wOworCisJZGViX2luZm8oIiVzKCVkKVxuIiwgX19mdW5jX18sIG9ub2ZmKTsKKworCWlmIChvbm9mZikgeworCQlyZXQgPSBteGwxMTFzZl9lbmFibGVfdXNiX291dHB1dChzdGF0ZSk7CisJCW14bF9mYWlsKHJldCk7CisJCXJldCA9IG14bDExMXNmX2NvbmZpZ19tcGVnX2luKHN0YXRlLCAxLCAxLAorCQkJCQkgICAgICBhZGFwX3N0YXRlLT5lcDZfY2xvY2twaGFzZSwKKwkJCQkJICAgICAgMCwgMCk7CisJCW14bF9mYWlsKHJldCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gbXhsMTExc2ZfZGlzYWJsZV82NTZfcG9ydChzdGF0ZSk7CisJCW14bF9mYWlsKHJldCk7CisJfQorCisJbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIDB4MTIsICZ0bXApOworCXRtcCAmPSB+MHgwNDsKKwlteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIDB4MTIsIHRtcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2VwNF9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gYWRhcC0+ZGV2OworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCWludCByZXQgPSAwOworCisJZGViX2luZm8oIiVzKCVkKVxuIiwgX19mdW5jX18sIG9ub2ZmKTsKKworCWlmIChvbm9mZikgeworCQlyZXQgPSBteGwxMTFzZl9lbmFibGVfdXNiX291dHB1dChzdGF0ZSk7CisJCW14bF9mYWlsKHJldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgbGdkdDMzMDVfY29uZmlnIGhhdXBwYXVnZV9sZ2R0MzMwNV9jb25maWcgPSB7CisJLmkyY19hZGRyICAgICAgICAgICA9IDB4YjIgPj4gMSwKKwkubXBlZ19tb2RlICAgICAgICAgID0gTEdEVDMzMDVfTVBFR19TRVJJQUwsCisJLnRwY2xrX2VkZ2UgICAgICAgICA9IExHRFQzMzA1X1RQQ0xLX1JJU0lOR19FREdFLAorCS50cHZhbGlkX3BvbGFyaXR5ICAgPSBMR0RUMzMwNV9UUF9WQUxJRF9ISUdILAorCS5kZW55X2kyY19ycHRyICAgICAgPSAxLAorCS5zcGVjdHJhbF9pbnZlcnNpb24gPSAwLAorCS5xYW1faWZfa2h6ICAgICAgICAgPSA2MDAwLAorCS52c2JfaWZfa2h6ICAgICAgICAgPSA2MDAwLAorfTsKKworc3RhdGljIGludCBteGwxMTFzZl9sZ2R0MzMwNV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhZGFwLT5kZXY7CisJc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisJaW50IGZlX2lkID0gYWRhcC0+bnVtX2Zyb250ZW5kc19pbml0aWFsaXplZDsKKwlzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSAqYWRhcF9zdGF0ZSA9IGFkYXAtPmZlX2FkYXBbZmVfaWRdLnByaXY7CisJaW50IHJldDsKKworCWRlYl9hZHYoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIHNhdmUgYSBwb2ludGVyIHRvIHRoZSBkdmJfdXNiX2RldmljZSBpbiBkZXZpY2Ugc3RhdGUgKi8KKwlzdGF0ZS0+ZCA9IGQ7CisJYWRhcF9zdGF0ZS0+YWx0X21vZGUgPSAoZHZiX3VzYl9teGwxMTFzZl9pc29jKSA/IDIgOiAxOworCXN0YXRlLT5hbHRfbW9kZSA9IGFkYXBfc3RhdGUtPmFsdF9tb2RlOworCisJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGFkYXAtPmRldi0+dWRldiwgMCwgc3RhdGUtPmFsdF9tb2RlKSA8IDApCisJCWVycigic2V0IGludGVyZmFjZSBmYWlsZWQiKTsKKworCXN0YXRlLT5ncGlvX21vZGUgPSBNWEwxMTFTRl9HUElPX01PRF9BVFNDOworCWFkYXBfc3RhdGUtPmdwaW9fbW9kZSA9IHN0YXRlLT5ncGlvX21vZGU7CisJYWRhcF9zdGF0ZS0+ZGV2aWNlX21vZGUgPSBNWExfVFVORVJfTU9ERTsKKwlhZGFwX3N0YXRlLT5lcDZfY2xvY2twaGFzZSA9IDE7CisKKwlyZXQgPSBteGwxeDFzZl9zb2Z0X3Jlc2V0KHN0YXRlKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX2luaXRfdHVuZXJfZGVtb2Qoc3RhdGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxeDFzZl9zZXRfZGV2aWNlX21vZGUoc3RhdGUsIGFkYXBfc3RhdGUtPmRldmljZV9tb2RlKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2ZfZW5hYmxlX3VzYl9vdXRwdXQoc3RhdGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMXgxc2ZfdG9wX21hc3Rlcl9jdHJsKHN0YXRlLCAxKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2ZfaW5pdF9wb3J0X2V4cGFuZGVyKHN0YXRlKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX2dwaW9fbW9kZV9zd2l0Y2goc3RhdGUsIHN0YXRlLT5ncGlvX21vZGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlhZGFwLT5mZV9hZGFwW2ZlX2lkXS5mZSA9IGR2Yl9hdHRhY2gobGdkdDMzMDVfYXR0YWNoLAorCQkJCSAmaGF1cHBhdWdlX2xnZHQzMzA1X2NvbmZpZywKKwkJCQkgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWlmIChhZGFwLT5mZV9hZGFwW2ZlX2lkXS5mZSkgeworCQlhZGFwX3N0YXRlLT5mZV9pbml0ID0gYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUtPm9wcy5pbml0OworCQlhZGFwLT5mZV9hZGFwW2ZlX2lkXS5mZS0+b3BzLmluaXQgPSBteGwxMTFzZl9hZGFwX2ZlX2luaXQ7CisJCWFkYXBfc3RhdGUtPmZlX3NsZWVwID0gYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUtPm9wcy5zbGVlcDsKKwkJYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUtPm9wcy5zbGVlcCA9IG14bDExMXNmX2FkYXBfZmVfc2xlZXA7CisJCXJldHVybiAwOworCX0KKwlyZXQgPSAtRUlPOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG14bDExMXNmX2RlbW9kX2NvbmZpZyBteGxfZGVtb2RfY29uZmlnID0geworCS5yZWFkX3JlZyAgICAgICAgPSBteGwxMTFzZl9yZWFkX3JlZywKKwkud3JpdGVfcmVnICAgICAgID0gbXhsMTExc2Zfd3JpdGVfcmVnLAorCS5wcm9ncmFtX3JlZ3MgICAgPSBteGwxMTFzZl9jdHJsX3Byb2dyYW1fcmVncywKK307CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfYXR0YWNoX2RlbW9kKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gYWRhcC0+ZGV2OworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCWludCBmZV9pZCA9IGFkYXAtPm51bV9mcm9udGVuZHNfaW5pdGlhbGl6ZWQ7CisJc3RydWN0IG14bDExMXNmX2FkYXBfc3RhdGUgKmFkYXBfc3RhdGUgPSBhZGFwLT5mZV9hZGFwW2ZlX2lkXS5wcml2OworCWludCByZXQ7CisKKwlkZWJfYWR2KCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBzYXZlIGEgcG9pbnRlciB0byB0aGUgZHZiX3VzYl9kZXZpY2UgaW4gZGV2aWNlIHN0YXRlICovCisJc3RhdGUtPmQgPSBkOworCWFkYXBfc3RhdGUtPmFsdF9tb2RlID0gKGR2Yl91c2JfbXhsMTExc2ZfaXNvYykgPyAxIDogMjsKKwlzdGF0ZS0+YWx0X21vZGUgPSBhZGFwX3N0YXRlLT5hbHRfbW9kZTsKKworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShhZGFwLT5kZXYtPnVkZXYsIDAsIHN0YXRlLT5hbHRfbW9kZSkgPCAwKQorCQllcnIoInNldCBpbnRlcmZhY2UgZmFpbGVkIik7CisKKwlzdGF0ZS0+Z3Bpb19tb2RlID0gTVhMMTExU0ZfR1BJT19NT0RfRFZCVDsKKwlhZGFwX3N0YXRlLT5ncGlvX21vZGUgPSBzdGF0ZS0+Z3Bpb19tb2RlOworCWFkYXBfc3RhdGUtPmRldmljZV9tb2RlID0gTVhMX1NPQ19NT0RFOworCWFkYXBfc3RhdGUtPmVwNl9jbG9ja3BoYXNlID0gMTsKKworCXJldCA9IG14bDF4MXNmX3NvZnRfcmVzZXQoc3RhdGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMTExc2ZfaW5pdF90dW5lcl9kZW1vZChzdGF0ZSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDF4MXNmX3NldF9kZXZpY2VfbW9kZShzdGF0ZSwgYWRhcF9zdGF0ZS0+ZGV2aWNlX21vZGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxMTFzZl9lbmFibGVfdXNiX291dHB1dChzdGF0ZSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxeDFzZl90b3BfbWFzdGVyX2N0cmwoc3RhdGUsIDEpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwkvKiBkb250IGNhcmUgaWYgdGhpcyBmYWlscyAqLworCW14bDExMXNmX2luaXRfcG9ydF9leHBhbmRlcihzdGF0ZSk7CisKKwlhZGFwLT5mZV9hZGFwW2ZlX2lkXS5mZSA9IGR2Yl9hdHRhY2gobXhsMTExc2ZfZGVtb2RfYXR0YWNoLCBzdGF0ZSwKKwkJCSAgICAgICZteGxfZGVtb2RfY29uZmlnKTsKKwlpZiAoYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUpIHsKKwkJYWRhcF9zdGF0ZS0+ZmVfaW5pdCA9IGFkYXAtPmZlX2FkYXBbZmVfaWRdLmZlLT5vcHMuaW5pdDsKKwkJYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUtPm9wcy5pbml0ID0gbXhsMTExc2ZfYWRhcF9mZV9pbml0OworCQlhZGFwX3N0YXRlLT5mZV9zbGVlcCA9IGFkYXAtPmZlX2FkYXBbZmVfaWRdLmZlLT5vcHMuc2xlZXA7CisJCWFkYXAtPmZlX2FkYXBbZmVfaWRdLmZlLT5vcHMuc2xlZXAgPSBteGwxMTFzZl9hZGFwX2ZlX3NsZWVwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0ID0gLUVJTzsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXhsMTExc2Zfc2V0X2FudF9wYXRoKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJCWludCBhbnRwYXRoKQoreworCXJldHVybiBteGwxMTFzZl9pZGFjX2NvbmZpZyhzdGF0ZSwgMSwgMSwKKwkJCQkgICAgKGFudHBhdGggPT0gQU5UX1BBVEhfSU5URVJOQUwpID8KKwkJCQkgICAgMHgzZiA6IDB4MDAsIDApOworfQorCisjZGVmaW5lIERiZ0FudEh1bnQoeCwgcHdyMCwgcHdyMSwgcHdyMiwgcHdyMykgXAorCWVycigiJXMoJWQpIEZJTkFMIGlucHV0IHNldCB0byAlcyByeFB3cjolZHwlZHwlZHwlZFxuIiwgXAorCSAgICBfX2Z1bmNfXywgX19MSU5FX18sIFwKKwkgICAgKEFOVF9QQVRIX0VYVEVSTkFMID09IHgpID8gIkVYVEVSTkFMIiA6ICJJTlRFUk5BTCIsIFwKKwkgICAgcHdyMCwgcHdyMSwgcHdyMiwgcHdyMykKKworI2RlZmluZSBBTlRfSFVOVF9TTEVFUCA5MAorI2RlZmluZSBBTlRfRVhUX1RXRUFLIDAKKworc3RhdGljIGludCBteGwxMTFzZl9hbnRfaHVudChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhZGFwLT5kZXY7CisJc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisKKwlpbnQgYW50Y3RybCA9IGR2Yl91c2JfbXhsMTExc2ZfcmZzd2l0Y2g7CisKKwl1MTYgcnhQd3JBLCByeFB3cjAsIHJ4UHdyMSwgcnhQd3IyOworCisJLyogRklYTUU6IG11c3QgZm9yY2UgRVhURVJOQUwgZm9yIFFBTSAtIGRvbmUgZWxzZXdoZXJlICovCisJbXhsMTExc2Zfc2V0X2FudF9wYXRoKHN0YXRlLCBhbnRjdHJsID09IEFOVF9QQVRIX0FVVE8gPworCQkJICAgICAgQU5UX1BBVEhfRVhURVJOQUwgOiBhbnRjdHJsKTsKKworCWlmIChhbnRjdHJsID09IEFOVF9QQVRIX0FVVE8pIHsKKyNpZiAwCisJCW1zbGVlcChBTlRfSFVOVF9TTEVFUCk7CisjZW5kaWYKKwkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X3JmX3N0cmVuZ3RoKGZlLCAmcnhQd3JBKTsKKworCQlteGwxMTFzZl9zZXRfYW50X3BhdGgoc3RhdGUsIEFOVF9QQVRIX0VYVEVSTkFMKTsKKwkJbXNsZWVwKEFOVF9IVU5UX1NMRUVQKTsKKwkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X3JmX3N0cmVuZ3RoKGZlLCAmcnhQd3IwKTsKKworCQlteGwxMTFzZl9zZXRfYW50X3BhdGgoc3RhdGUsIEFOVF9QQVRIX0VYVEVSTkFMKTsKKwkJbXNsZWVwKEFOVF9IVU5UX1NMRUVQKTsKKwkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X3JmX3N0cmVuZ3RoKGZlLCAmcnhQd3IxKTsKKworCQlteGwxMTFzZl9zZXRfYW50X3BhdGgoc3RhdGUsIEFOVF9QQVRIX0lOVEVSTkFMKTsKKwkJbXNsZWVwKEFOVF9IVU5UX1NMRUVQKTsKKwkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X3JmX3N0cmVuZ3RoKGZlLCAmcnhQd3IyKTsKKworCQlpZiAocnhQd3IxK0FOVF9FWFRfVFdFQUsgPj0gcnhQd3IyKSB7CisJCQkvKiByZXR1cm4gd2l0aCBFWFRFUk5BTCBlbmFibGVkICovCisJCQlteGwxMTFzZl9zZXRfYW50X3BhdGgoc3RhdGUsIEFOVF9QQVRIX0VYVEVSTkFMKTsKKwkJCURiZ0FudEh1bnQoQU5UX1BBVEhfRVhURVJOQUwsIHJ4UHdyQSwKKwkJCQkgICByeFB3cjAsIHJ4UHdyMSwgcnhQd3IyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJldHVybiB3aXRoIElOVEVSTkFMIGVuYWJsZWQgKi8KKwkJCURiZ0FudEh1bnQoQU5UX1BBVEhfSU5URVJOQUwsIHJ4UHdyQSwKKwkJCQkgICByeFB3cjAsIHJ4UHdyMSwgcnhQd3IyKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBteGwxMTFzZl90dW5lcl9jb25maWcgbXhsX3R1bmVyX2NvbmZpZyA9IHsKKwkuaWZfZnJlcSAgICAgICAgID0gTVhMX0lGXzZfMCwgLyogYXBwbGllcyB0byBleHRlcm5hbCBJRiBvdXRwdXQsIG9ubHkgKi8KKwkuaW52ZXJ0X3NwZWN0cnVtID0gMCwKKwkucmVhZF9yZWcgICAgICAgID0gbXhsMTExc2ZfcmVhZF9yZWcsCisJLndyaXRlX3JlZyAgICAgICA9IG14bDExMXNmX3dyaXRlX3JlZywKKwkucHJvZ3JhbV9yZWdzICAgID0gbXhsMTExc2ZfY3RybF9wcm9ncmFtX3JlZ3MsCisJLnRvcF9tYXN0ZXJfY3RybCA9IG14bDF4MXNmX3RvcF9tYXN0ZXJfY3RybCwKKwkuYW50X2h1bnQgICAgICAgID0gbXhsMTExc2ZfYW50X2h1bnQsCit9OworCitzdGF0aWMgaW50IG14bDExMXNmX2F0dGFjaF90dW5lcihzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGFkYXAtPmRldjsKKwlzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlID0gZC0+cHJpdjsKKwlpbnQgZmVfaWQgPSBhZGFwLT5udW1fZnJvbnRlbmRzX2luaXRpYWxpemVkOworCisJZGViX2FkdigiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKE5VTEwgIT0gZHZiX2F0dGFjaChteGwxMTFzZl90dW5lcl9hdHRhY2gsCisJCQkgICAgICAgYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUsIHN0YXRlLAorCQkJICAgICAgICZteGxfdHVuZXJfY29uZmlnKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9mZV9pb2N0bF9vdmVycmlkZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwYXJnLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzdGFnZSkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoc3RhZ2UpIHsKKwljYXNlIERWQl9GRV9JT0NUTF9QUkU6CisKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBGRV9SRUFEX1NJR05BTF9TVFJFTkdUSDoKKwkJCWVyciA9IGZlLT5vcHMudHVuZXJfb3BzLmdldF9yZl9zdHJlbmd0aChmZSwgcGFyZyk7CisJCQkvKiBJZiBubyBlcnJvciBvY2N1cnMsIHByZXZlbnQgZHZiLWNvcmUgZnJvbSBoYW5kbGluZworCQkJICogdGhpcyBJT0NUTCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZXJyb3IgKi8KKwkJCWlmICgwID09IGVycikKKwkJCQllcnIgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIERWQl9GRV9JT0NUTF9QT1NUOgorCQkvKiBubyBwb3N0LWlvY3RsIGhhbmRsaW5nIHJlcXVpcmVkICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfTsKKworc3RhdGljIHUzMiBteGwxMTFzZl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQzsKK30KKworc3RydWN0IGkyY19hbGdvcml0aG0gbXhsMTExc2ZfaTJjX2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyICAgPSBteGwxMTFzZl9pMmNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IG14bDExMXNmX2kyY19mdW5jLAorI2lmZGVmIE5FRURfQUxHT19DT05UUk9MCisJLmFsZ29fY29udHJvbCA9IGR1bW15X2FsZ29fY29udHJvbCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIG14bDExMXNmX2R2YnRfYnVsa19wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIG14bDExMXNmX2R2YnRfaXNvY19wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIG14bDExMXNmX2F0c2NfYnVsa19wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIG14bDExMXNmX2F0c2NfaXNvY19wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IG14bDExMXNmX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gTlVMTDsKKworCWRlYl9hZHYoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmICgoKGR2Yl91c2JfbXhsMTExc2ZfaXNvYykgJiYKKwkgICAgICgwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwKKwkJCQkgICAgICAgJm14bDExMXNmX2R2YnRfaXNvY19wcm9wZXJ0aWVzLAorCQkJCSAgICAgICBUSElTX01PRFVMRSwgJmQsIGFkYXB0ZXJfbnIpIHx8CisJICAgICAgMCA9PSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsCisJCQkJICAgICAgICZteGwxMTFzZl9hdHNjX2lzb2NfcHJvcGVydGllcywKKwkJCQkgICAgICAgVEhJU19NT0RVTEUsICZkLCBhZGFwdGVyX25yKSkpIHx8CisJICAgIDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLAorCQkJCSAgICAgJm14bDExMXNmX2R2YnRfYnVsa19wcm9wZXJ0aWVzLAorCQkJCSAgICAgVEhJU19NT0RVTEUsICZkLCBhZGFwdGVyX25yKSB8fAorCSAgICAwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwKKwkJCQkgICAgICZteGwxMTFzZl9hdHNjX2J1bGtfcHJvcGVydGllcywKKwkJCQkgICAgIFRISVNfTU9EVUxFLCAmZCwgYWRhcHRlcl9ucikgfHwgMCkgeworCisJCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCQlzdGF0aWMgdTggZWVwcm9tWzI1Nl07CisJCXN0cnVjdCBpMmNfY2xpZW50IGM7CisJCWludCByZXQ7CisKKwkJcmV0ID0gZ2V0X2NoaXBfaW5mbyhzdGF0ZSk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZXJyKCJmYWlsZWQgdG8gZ2V0IGNoaXAgaW5mbyBkdXJpbmcgcHJvYmUiKTsKKworCQltdXRleF9pbml0KCZzdGF0ZS0+ZmVfbG9jayk7CisKKwkJaWYgKHN0YXRlLT5jaGlwX3JldiA+IE1YTDExMVNGX1Y2KQorCQkJbXhsMTExc2ZfY29uZmlnX3Bpbl9tdXhfbW9kZXMoc3RhdGUsCisJCQkJCQkgICAgICBQSU5fTVVYX1RTX1NQSV9JTl9NT0RFXzEpOworCisJCWMuYWRhcHRlciA9ICZkLT5pMmNfYWRhcDsKKwkJYy5hZGRyID0gMHhhMCA+PiAxOworCisJCXJldCA9IHR2ZWVwcm9tX3JlYWQoJmMsIGVlcHJvbSwgc2l6ZW9mKGVlcHJvbSkpOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCXJldHVybiAwOworCQl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZjLCAmc3RhdGUtPnR2LAorCQkJCQkgICgweDg0ID09IGVlcHJvbVsweGEwXSkgPworCQkJCQkgIGVlcHJvbSArIDB4YTAgOiBlZXByb20gKyAweDgwKTsKKyNpZiAwCisJCXN3aXRjaCAoc3RhdGUtPnR2Lm1vZGVsKSB7CisJCWNhc2UgMTE3MDAxOgorCQljYXNlIDEyNjAwMToKKwkJY2FzZSAxMzgwMDE6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXJuaW5nOiAiCisJCQkgICAgICAgInVua25vd24gaGF1cHBhdWdlIG1vZGVsICMlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgc3RhdGUtPnR2Lm1vZGVsKTsKKwkJfQorI2VuZGlmCisJCXJldHVybiAwOworCX0KKwllcnIoIllvdXIgZGV2aWNlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiAiCisJICAgICJTZWUga2VybmVsbGFicy5jb20gZm9yIG1vcmUgaW5mbyIpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbXhsMTExc2ZfdGFibGVbXSA9IHsKKy8qIDAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MDApIH0sIC8qIEFUU0MrIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjAxKSB9LCAvKiBBVFNDICAgICAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4YzYwMikgfSwgLyogICAgICsgICAgICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MDMpIH0sIC8qIEFUU0MrICAgICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjA0KSB9LCAvKiBEVkJUICAgICAgICAgKi8KKy8qIDUgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MDkpIH0sIC8qIEFUU0MgIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjBhKSB9LCAvKiAgICAgKyBJUiAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4YzYwYikgfSwgLyogQVRTQysgSVIgICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MGMpIH0sIC8qIERWQlQgIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjUzKSB9LCAvKiBBVFNDKyAgICAgICAgKi8KKy8qMTAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2NWIpIH0sIC8qIEFUU0MrIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhiNzAwKSB9LCAvKiBBVFNDKyBzdyAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4YjcwMSkgfSwgLyogQVRTQyAgc3cgICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGI3MDIpIH0sIC8qICAgICArIHN3ICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhiNzAzKSB9LCAvKiBBVFNDKyBzdyAgICAgKi8KKy8qMTUgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGI3MDQpIH0sIC8qIERWQlQgIHN3ICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhiNzUzKSB9LCAvKiBBVFNDKyBzdyAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4Yjc2MykgfSwgLyogQVRTQysgbm8gICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGI3NjQpIH0sIC8qIERWQlQgIG5vICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhkODUzKSB9LCAvKiBBVFNDKyBzdyAgICAgKi8KKy8qMjAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGQ4NTQpIH0sIC8qIERWQlQgIHN3ICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhkODYzKSB9LCAvKiBBVFNDKyBubyAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4ZDg2NCkgfSwgLyogRFZCVCAgbm8gICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGQ4ZDMpIH0sIC8qIEFUU0MrIHN3ICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhkOGQ0KSB9LCAvKiBEVkJUICBzdyAgICAgKi8KKy8qMjUgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGQ4ZTMpIH0sIC8qIEFUU0MrIG5vICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhkOGU0KSB9LCAvKiBEVkJUICBubyAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4ZDhmZikgfSwgLyogQVRTQysgICAgICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MTIpIH0sIC8qICAgICArICAgICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjEzKSB9LCAvKiBBVFNDKyAgICAgICAgKi8KKy8qMzAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MWEpIH0sIC8qICAgICArIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjFiKSB9LCAvKiBBVFNDKyBJUiAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4Yjc1NykgfSwgLyogQVRTQytEVkJUIHN3ICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGI3NjcpIH0sIC8qIEFUU0MrRFZCVCBubyAqLworCXt9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBteGwxMTFzZl90YWJsZSk7CisKKworI2RlZmluZSBNWEwxMTFTRl9FUDRfQlVMS19TVFJFQU1JTkdfQ09ORklHCQlcCisJLnN0cmVhbWluZ19jdHJsID0gbXhsMTExc2ZfZXA0X3N0cmVhbWluZ19jdHJsLAlcCisJLnN0cmVhbSA9IHsJCQkJCVwKKwkJLnR5cGUgPSBVU0JfQlVMSywJCQlcCisJCS5jb3VudCA9IDUsCQkJCVwKKwkJLmVuZHBvaW50ID0gMHgwNCwJCQlcCisJCS51ID0gewkJCQkJXAorCQkJLmJ1bGsgPSB7CQkJXAorCQkJCS5idWZmZXJzaXplID0gODE5MiwJXAorCQkJfQkJCQlcCisJCX0JCQkJCVwKKwl9CisKKy8qIEZJWE1FOiB3b3JrcyBmb3IgdjYgYnV0IG5vdCB2OCBzaWxpY29uICovCisjZGVmaW5lIE1YTDExMVNGX0VQNF9JU09DX1NUUkVBTUlOR19DT05GSUcJCVwKKwkuc3RyZWFtaW5nX2N0cmwgPSBteGwxMTFzZl9lcDRfc3RyZWFtaW5nX2N0cmwsCVwKKwkuc3RyZWFtID0gewkJCQkJXAorCQkudHlwZSA9IFVTQl9JU09DLAkJCVwKKwkJLmNvdW50ID0gNSwJCQkJXAorCQkuZW5kcG9pbnQgPSAweDA0LAkJCVwKKwkJLnUgPSB7CQkJCQlcCisJCQkuaXNvYyA9IHsJCQlcCisJCQkJLmZyYW1lc3BlcnVyYiA9IDk2LAlcCisJCQkJLyogRklYTUU6IHY2IFNJTElDT046ICovCVwKKwkJCQkuZnJhbWVzaXplID0gNTY0LAlcCisJCQkJLmludGVydmFsID0gMSwJCVwKKwkJCX0JCQkJXAorCQl9CQkJCQlcCisJfQorCisjZGVmaW5lIE1YTDExMVNGX0VQNl9CVUxLX1NUUkVBTUlOR19DT05GSUcJCVwKKwkuc3RyZWFtaW5nX2N0cmwgPSBteGwxMTFzZl9lcDZfc3RyZWFtaW5nX2N0cmwsCVwKKwkuc3RyZWFtID0gewkJCQkJXAorCQkudHlwZSA9IFVTQl9CVUxLLAkJCVwKKwkJLmNvdW50ID0gNSwJCQkJXAorCQkuZW5kcG9pbnQgPSAweDA2LAkJCVwKKwkJLnUgPSB7CQkJCQlcCisJCQkuYnVsayA9IHsJCQlcCisJCQkJLmJ1ZmZlcnNpemUgPSA4MTkyLAlcCisJCQl9CQkJCVwKKwkJfQkJCQkJXAorCX0KKworLyogRklYTUUgKi8KKyNkZWZpbmUgTVhMMTExU0ZfRVA2X0lTT0NfU1RSRUFNSU5HX0NPTkZJRwkJXAorCS5zdHJlYW1pbmdfY3RybCA9IG14bDExMXNmX2VwNl9zdHJlYW1pbmdfY3RybCwJXAorCS5zdHJlYW0gPSB7CQkJCQlcCisJCS50eXBlID0gVVNCX0lTT0MsCQkJXAorCQkuY291bnQgPSA1LAkJCQlcCisJCS5lbmRwb2ludCA9IDB4MDYsCQkJXAorCQkudSA9IHsJCQkJCVwKKwkJCS5pc29jID0gewkJCVwKKwkJCQkuZnJhbWVzcGVydXJiID0gMjQsCVwKKwkJCQkuZnJhbWVzaXplID0gMzA3MiwJXAorCQkJCS5pbnRlcnZhbCA9IDEsCQlcCisJCQl9CQkJCVwKKwkJfQkJCQkJXAorCX0KKworI2RlZmluZSBNWEwxMTFTRl9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTCQkJXAorCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwJCQlcCisJLnVzYl9jdHJsID0gREVWSUNFX1NQRUNJRklDLAkJCQlcCisJLyogdXNlIHVzYiBhbHQgc2V0dGluZyAxIGZvciBFUDQgSVNPQyB0cmFuc2ZlciAoZHZiLXQpLAlcCisJCQkJICAgICBFUDYgQlVMSyB0cmFuc2ZlciAoYXRzYy9xYW0pLCBcCisJICAgdXNlIHVzYiBhbHQgc2V0dGluZyAyIGZvciBFUDQgQlVMSyB0cmFuc2ZlciAoZHZiLXQpLAlcCisJCQkJICAgICBFUDYgSVNPQyB0cmFuc2ZlciAoYXRzYy9xYW0pLCBcCisJKi8JCQkJCQkJXAorCS5wb3dlcl9jdHJsICAgICAgID0gbXhsMTExc2ZfcG93ZXJfY3RybCwJCVwKKwkuaTJjX2FsZ28gICAgICAgICA9ICZteGwxMTFzZl9pMmNfYWxnbywJCQlcCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ICAgICAgICAgID0gTVhMX0VQMl9SRUdfV1JJVEUsIFwKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnRfcmVzcG9uc2UgPSBNWExfRVAxX1JFR19SRUFELCBcCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IG14bDExMXNmX3N0YXRlKQorCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgbXhsMTExc2ZfZHZidF9idWxrX3Byb3BlcnRpZXMgPSB7CisJTVhMMTExU0ZfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKKworCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0geworCQl7CisJCS5mZV9pb2N0bF9vdmVycmlkZSA9IG14bDExMXNmX2ZlX2lvY3RsX292ZXJyaWRlLAorCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CisJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSksCisKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gbXhsMTExc2ZfYXR0YWNoX2RlbW9kLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBteGwxMTFzZl9hdHRhY2hfdHVuZXIsCisKKwkJCU1YTDExMVNGX0VQNF9CVUxLX1NUUkVBTUlOR19DT05GSUcsCisJCX0gfSwKKwkJfSwKKwl9LAorCS5udW1fZGV2aWNlX2Rlc2NzID0gNCwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJIYXVwcGF1Z2UgMTI2eHh4IERWQlQgKGJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbNF0sICZteGwxMTFzZl90YWJsZVs4XSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCQl7ICAgIkhhdXBwYXVnZSAxMTd4eHggRFZCVCAoYnVsaykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxNV0sICZteGwxMTFzZl90YWJsZVsxOF0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgMTM4eHh4IERWQlQgKGJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMjBdLCAmbXhsMTExc2ZfdGFibGVbMjJdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMjRdLCAmbXhsMTExc2ZfdGFibGVbMjZdLAorCQkJICBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIDEyNnh4eCAodHAtYnVsaykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsyOF0sICZteGwxMTFzZl90YWJsZVszMF0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgbXhsMTExc2ZfZHZidF9pc29jX3Byb3BlcnRpZXMgPSB7CisJTVhMMTExU0ZfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKKworCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0geworCQl7CisJCS5mZV9pb2N0bF9vdmVycmlkZSA9IG14bDExMXNmX2ZlX2lvY3RsX292ZXJyaWRlLAorCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CisJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSksCisKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gbXhsMTExc2ZfYXR0YWNoX2RlbW9kLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBteGwxMTFzZl9hdHRhY2hfdHVuZXIsCisKKwkJCU1YTDExMVNGX0VQNF9JU09DX1NUUkVBTUlOR19DT05GSUcsCisJCX0gfSwKKwkJfSwKKwl9LAorCS5udW1fZGV2aWNlX2Rlc2NzID0gNCwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJIYXVwcGF1Z2UgMTI2eHh4IERWQlQgKGlzb2MpIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbNF0sICZteGwxMTFzZl90YWJsZVs4XSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCQl7ICAgIkhhdXBwYXVnZSAxMTd4eHggRFZCVCAoaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxNV0sICZteGwxMTFzZl90YWJsZVsxOF0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgMTM4eHh4IERWQlQgKGlzb2MpIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMjBdLCAmbXhsMTExc2ZfdGFibGVbMjJdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMjRdLCAmbXhsMTExc2ZfdGFibGVbMjZdLAorCQkJICBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIDEyNnh4eCAodHAtaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsyOF0sICZteGwxMTFzZl90YWJsZVszMF0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgbXhsMTExc2ZfYXRzY19idWxrX3Byb3BlcnRpZXMgPSB7CisJTVhMMTExU0ZfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKKworCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0geworCQl7CisJCS5mZV9pb2N0bF9vdmVycmlkZSA9IG14bDExMXNmX2ZlX2lvY3RsX292ZXJyaWRlLAorCQkubnVtX2Zyb250ZW5kcyA9IDIsCisJCS5mZSA9IHt7CisJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSksCisKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gbXhsMTExc2ZfbGdkdDMzMDVfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBteGwxMTFzZl9hdHRhY2hfdHVuZXIsCisKKwkJCU1YTDExMVNGX0VQNl9CVUxLX1NUUkVBTUlOR19DT05GSUcsCisJCX0sCisJCXsKKwkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBteGwxMTFzZl9hZGFwX3N0YXRlKSwKKworCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBteGwxMTFzZl9hdHRhY2hfZGVtb2QsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IG14bDExMXNmX2F0dGFjaF90dW5lciwKKworCQkJTVhMMTExU0ZfRVA0X0JVTEtfU1RSRUFNSU5HX0NPTkZJRywKKwkJfX0sCisJCX0sCisJfSwKKwkubnVtX2RldmljZV9kZXNjcyA9IDYsCisJLmRldmljZXMgPSB7CisJCXsgICAiSGF1cHBhdWdlIDEyNnh4eCBBVFNDIChidWxrKSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJm14bDExMXNmX3RhYmxlWzFdLCAmbXhsMTExc2ZfdGFibGVbNV0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgMTE3eHh4IEFUU0MgKGJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMTJdLAorCQkJICBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIDEyNnh4eCBBVFNDKyAoYnVsaykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVswXSwgJm14bDExMXNmX3RhYmxlWzNdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbN10sICZteGwxMTFzZl90YWJsZVs5XSwKKwkJCSAgJm14bDExMXNmX3RhYmxlWzEwXSwgTlVMTCB9LAorCQl9LAorCQl7ICAgIkhhdXBwYXVnZSAxMTd4eHggQVRTQysgKGJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMTFdLCAmbXhsMTExc2ZfdGFibGVbMTRdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMTZdLCAmbXhsMTExc2ZfdGFibGVbMTddLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMzJdLCAmbXhsMTExc2ZfdGFibGVbMzNdLAorCQkJICBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIE1lcmN1cnkgKHRwLWJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMTldLCAmbXhsMTExc2ZfdGFibGVbMjFdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMjNdLCAmbXhsMTExc2ZfdGFibGVbMjVdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMjddLCBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIFdpblRWLUFlcm8tTSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJm14bDExMXNmX3RhYmxlWzI5XSwgJm14bDExMXNmX3RhYmxlWzMxXSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBteGwxMTFzZl9hdHNjX2lzb2NfcHJvcGVydGllcyA9IHsKKwlNWEwxMTFTRl9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAorCisJLm51bV9hZGFwdGVycyA9IDEsCisJLmFkYXB0ZXIgPSB7CisJCXsKKwkJLmZlX2lvY3RsX292ZXJyaWRlID0gbXhsMTExc2ZfZmVfaW9jdGxfb3ZlcnJpZGUsCisJCS5udW1fZnJvbnRlbmRzID0gMiwKKwkJLmZlID0ge3sKKwkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBteGwxMTFzZl9hZGFwX3N0YXRlKSwKKworCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBteGwxMTFzZl9sZ2R0MzMwNV9mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IG14bDExMXNmX2F0dGFjaF90dW5lciwKKworCQkJTVhMMTExU0ZfRVA2X0lTT0NfU1RSRUFNSU5HX0NPTkZJRywKKwkJfSwKKwkJeworCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IG14bDExMXNmX2FkYXBfc3RhdGUpLAorCisJCQkuZnJvbnRlbmRfYXR0YWNoICA9IG14bDExMXNmX2F0dGFjaF9kZW1vZCwKKwkJCS50dW5lcl9hdHRhY2ggICAgID0gbXhsMTExc2ZfYXR0YWNoX3R1bmVyLAorCisJCQlNWEwxMTFTRl9FUDRfSVNPQ19TVFJFQU1JTkdfQ09ORklHLAorCQl9fSwKKwkJfSwKKwl9LAorCS5udW1fZGV2aWNlX2Rlc2NzID0gNiwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJIYXVwcGF1Z2UgMTI2eHh4IEFUU0MgKGlzb2MpIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMV0sICZteGwxMTFzZl90YWJsZVs1XSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCQl7ICAgIkhhdXBwYXVnZSAxMTd4eHggQVRTQyAoaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxMl0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgMTI2eHh4IEFUU0MrIChpc29jKSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJm14bDExMXNmX3RhYmxlWzBdLCAmbXhsMTExc2ZfdGFibGVbM10sCisJCQkgICZteGwxMTFzZl90YWJsZVs3XSwgJm14bDExMXNmX3RhYmxlWzldLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMTBdLCBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIDExN3h4eCBBVFNDKyAoaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxMV0sICZteGwxMTFzZl90YWJsZVsxNF0sCisJCQkgICZteGwxMTFzZl90YWJsZVsxNl0sICZteGwxMTFzZl90YWJsZVsxN10sCisJCQkgICZteGwxMTFzZl90YWJsZVszMl0sICZteGwxMTFzZl90YWJsZVszM10sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgTWVyY3VyeSAodHAtaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxOV0sICZteGwxMTFzZl90YWJsZVsyMV0sCisJCQkgICZteGwxMTFzZl90YWJsZVsyM10sICZteGwxMTFzZl90YWJsZVsyNV0sCisJCQkgICZteGwxMTFzZl90YWJsZVsyN10sIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgV2luVFYtQWVyby1NICh0cC1pc29jKSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJm14bDExMXNmX3RhYmxlWzI5XSwgJm14bDExMXNmX3RhYmxlWzMxXSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBteGwxMTFzZl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImR2Yl91c2JfbXhsMTExc2YiLAorCS5wcm9iZQkJPSBteGwxMTFzZl9wcm9iZSwKKwkuZGlzY29ubmVjdCAgICAgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5pZF90YWJsZQk9IG14bDExMXNmX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXhsMTExc2ZfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZteGwxMTFzZl9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXhsMTExc2ZfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmbXhsMTExc2ZfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXhsMTExc2ZfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobXhsMTExc2ZfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBNYXhMaW5lYXIgTXhMMTExU0YiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjRkODlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi5oCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IChta3J1Zmt5QGtlcm5lbGxhYnMuY29tKQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisKKyNpZm5kZWYgX0RWQl9VU0JfTVhMMTExU0ZfSF8KKyNkZWZpbmUgX0RWQl9VU0JfTVhMMTExU0ZfSF8KKworI2lmZGVmIERWQl9VU0JfTE9HX1BSRUZJWAorI3VuZGVmIERWQl9VU0JfTE9HX1BSRUZJWAorI2VuZGlmCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAibXhsMTExc2YiCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorI2luY2x1ZGUgPG1lZGlhL3R2ZWVwcm9tLmg+CisKKyNkZWZpbmUgTVhMX0VQMV9SRUdfUkVBRCAgICAgMQorI2RlZmluZSBNWExfRVAyX1JFR19XUklURSAgICAyCisjZGVmaW5lIE1YTF9FUDNfSU5URVJSVVBUICAgIDMKKyNkZWZpbmUgTVhMX0VQNF9NUEVHMiAgICAgICAgNAorI2RlZmluZSBNWExfRVA1X0kyUyAgICAgICAgICA1CisjZGVmaW5lIE1YTF9FUDZfNjU2ICAgICAgICAgIDYKKyNkZWZpbmUgTVhMX0VQNl9NUEVHMiAgICAgICAgNgorCisjaWZkZWYgVVNJTkdfRU5VTV9teGwxMTFzZl9jdXJyZW50X21vZGUKK2VudW0gbXhsMTExc2ZfY3VycmVudF9tb2RlIHsKKwlteGxfbW9kZV9kdmJ0ID0gTVhMX0VQNF9NUEVHMiwKKwlteGxfbW9kZV9taCAgID0gTVhMX0VQNV9JMlMsCisJbXhsX21vZGVfYXRzYyA9IE1YTF9FUDZfTVBFRzIsCit9OworI2VuZGlmCisKK2VudW0gbXhsMTExc2ZfZ3Bpb19wb3J0X2V4cGFuZGVyIHsKKwlteGwxMTFzZl9ncGlvX2h3LAorCW14bDExMXNmX1BDQTk1MzQsCit9OworCitzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgeworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZDsKKworCWVudW0gbXhsMTExc2ZfZ3Bpb19wb3J0X2V4cGFuZGVyIGdwaW9fcG9ydF9leHBhbmRlcjsKKwl1OCBwb3J0X2V4cGFuZGVyX2FkZHI7CisKKwl1OCBjaGlwX2lkOworCXU4IGNoaXBfdmVyOworI2RlZmluZSBNWEwxMTFTRl9WNiAgICAgMQorI2RlZmluZSBNWEwxMTFTRl9WOF8xMDAgMgorI2RlZmluZSBNWEwxMTFTRl9WOF8yMDAgMworCXU4IGNoaXBfcmV2OworCisjaWZkZWYgVVNJTkdfRU5VTV9teGwxMTFzZl9jdXJyZW50X21vZGUKKwllbnVtIG14bDExMXNmX2N1cnJlbnRfbW9kZSBjdXJyZW50X21vZGU7CisjZW5kaWYKKworI2RlZmluZSBNWExfVFVORVJfTU9ERSAgICAgICAgIDAKKyNkZWZpbmUgTVhMX1NPQ19NT0RFICAgICAgICAgICAxCisjZGVmaW5lIE1YTF9ERVZfTU9ERV9NQVNLICAgICAgMHgwMQorI2lmIDEKKwlpbnQgZGV2aWNlX21vZGU7CisjZW5kaWYKKwkvKiB1c2UgdXNiIGFsdCBzZXR0aW5nIDEgZm9yIEVQNCBJU09DIHRyYW5zZmVyIChkdmItdCksCisJCQkJICAgICBFUDUgQlVMSyB0cmFuc2ZlciAoYXRzYy1taCksCisJCQkJICAgICBFUDYgQlVMSyB0cmFuc2ZlciAoYXRzYy9xYW0pLAorCSAgIHVzZSB1c2IgYWx0IHNldHRpbmcgMiBmb3IgRVA0IEJVTEsgdHJhbnNmZXIgKGR2Yi10KSwKKwkJCQkgICAgIEVQNSBJU09DIHRyYW5zZmVyIChhdHNjLW1oKSwKKwkJCQkgICAgIEVQNiBJU09DIHRyYW5zZmVyIChhdHNjL3FhbSksCisJICovCisJaW50IGFsdF9tb2RlOworCWludCBncGlvX21vZGU7CisJc3RydWN0IHR2ZWVwcm9tIHR2OworCisJc3RydWN0IG11dGV4IGZlX2xvY2s7Cit9OworCitzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSB7CisJaW50IGFsdF9tb2RlOworCWludCBncGlvX21vZGU7CisJaW50IGRldmljZV9tb2RlOworCWludCBlcDZfY2xvY2twaGFzZTsKKwlpbnQgKCpmZV9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOworCWludCAoKmZlX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOworfTsKKworaW50IG14bDExMXNmX3JlYWRfcmVnKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IGFkZHIsIHU4ICpkYXRhKTsKK2ludCBteGwxMTFzZl93cml0ZV9yZWcoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggYWRkciwgdTggZGF0YSk7CisKK3N0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvIHsKKwl1OCBhZGRyOworCXU4IG1hc2s7CisJdTggZGF0YTsKK307CisKK2ludCBteGwxMTFzZl93cml0ZV9yZWdfbWFzayhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJICAgIHU4IGFkZHIsIHU4IG1hc2ssIHU4IGRhdGEpOworaW50IG14bDExMXNmX2N0cmxfcHJvZ3JhbV9yZWdzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gKmN0cmxfcmVnX2luZm8pOworCisvKiBuZWVkZWQgZm9yIGhhcmR3YXJlIGkyYyBmdW5jdGlvbnMgaW4gbXhsMTExc2YtaTJjLmM6CisgKiBteGwxMTFzZl9pMmNfc2VuZF9kYXRhIC8gbXhsMTExc2ZfaTJjX2dldF9kYXRhICovCitpbnQgbXhsMTExc2ZfY3RybF9tc2coc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLAorCQkgICAgICB1OCBjbWQsIHU4ICp3YnVmLCBpbnQgd2xlbiwgdTggKnJidWYsIGludCBybGVuKTsKKworI2RlZmluZSBteGxfcHJpbnRrKGtlcm4sIGZtdCwgYXJnLi4uKSBcCisJcHJpbnRrKGtlcm4gIiVzOiAiIGZtdCAiXG4iLCBfX2Z1bmNfXywgIyNhcmcpCisKKyNkZWZpbmUgbXhsX2luZm8oZm10LCBhcmcuLi4pIFwKKwlteGxfcHJpbnRrKEtFUk5fSU5GTywgZm10LCAjI2FyZykKKworZXh0ZXJuIGludCBkdmJfdXNiX214bDExMXNmX2RlYnVnOworI2RlZmluZSBteGxfZGVidWcoZm10LCBhcmcuLi4pIFwKKwlpZiAoZHZiX3VzYl9teGwxMTFzZl9kZWJ1ZykgXAorCQlteGxfcHJpbnRrKEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpCisKKyNkZWZpbmUgTVhMX0kyQ19EQkcgMHgwNAorI2RlZmluZSBNWExfQURWX0RCRyAweDEwCisjZGVmaW5lIG14bF9kZWJ1Z19hZHYoZm10LCBhcmcuLi4pIFwKKwlpZiAoZHZiX3VzYl9teGwxMTFzZl9kZWJ1ZyAmIE1YTF9BRFZfREJHKSBcCisJCW14bF9wcmludGsoS0VSTl9ERUJVRywgZm10LCAjI2FyZykKKworI2RlZmluZSBteGxfaTJjKGZtdCwgYXJnLi4uKSBcCisJaWYgKGR2Yl91c2JfbXhsMTExc2ZfZGVidWcgJiBNWExfSTJDX0RCRykgXAorCQlteGxfcHJpbnRrKEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpCisKKyNkZWZpbmUgbXhsX2kyY19hZHYoZm10LCBhcmcuLi4pIFwKKwlpZiAoKGR2Yl91c2JfbXhsMTExc2ZfZGVidWcgJiAoTVhMX0kyQ19EQkcgfCBNWExfQURWX0RCRykpID09IFwKKwkJKE1YTF9JMkNfREJHIHwgTVhMX0FEVl9EQkcpKSBcCisJCQlteGxfcHJpbnRrKEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpCisKKy8qIFRoZSBmb2xsb3dpbmcgYWxsb3dzIHRoZSBteGxfZmFpbCgpIG1hY3JvIGRlZmluZWQgYmVsb3cgdG8gd29yaworICogaW4gZXh0ZXJuZWwgbW9kdWxlcywgc3VjaCBhcyBteGwxMTFzZi10dW5lci5rbywgZXZlbiB0aG91Z2gKKyAqIGR2Yl91c2JfbXhsMTExc2ZfZGVidWcgaXMgbm90IGRlZmluZWQgd2l0aGluIHRob3NlIG1vZHVsZXMgKi8KKyNpZiAoZGVmaW5lZChfX01YTDExMVNGX1RVTkVSX0hfXykpIHx8IChkZWZpbmVkKF9fTVhMMTExU0ZfREVNT0RfSF9fKSkKKyNkZWZpbmUgTVhMX0FEVl9ERUJVR19FTkFCTEVEIE1YTF9BRFZfREJHCisjZWxzZQorI2RlZmluZSBNWExfQURWX0RFQlVHX0VOQUJMRUQgZHZiX3VzYl9teGwxMTFzZl9kZWJ1ZworI2VuZGlmCisKKyNkZWZpbmUgbXhsX2ZhaWwocmV0KQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19yZXQ7CQkJCQkJCVwKKwlfX3JldCA9IChyZXQgPCAwKTsJCQkJCQlcCisJaWYgKChfX3JldCkgJiYgKE1YTF9BRFZfREVCVUdfRU5BQkxFRCAmIE1YTF9BRFZfREJHKSkJCVwKKwkJbXhsX3ByaW50ayhLRVJOX0VSUiwgImVycm9yICVkIG9uIGxpbmUgJWQiLAkJXAorCQkJICAgcmV0LCBfX0xJTkVfXyk7CQkJCVwKKwlfX3JldDsJCQkJCQkJCVwKK30pCisKKyNlbmRpZiAvKiBfRFZCX1VTQl9NWEwxMTFTRl9IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCmluZGV4IGJjMzUwZTkuLjIxMzg0ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKQEAgLTE2Niw2ICsxNjYsOCBAQAogCS5udW1fYWRhcHRlcnMgICAgID0gMSwKIAkuYWRhcHRlciAgICAgICAgICA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIApAQCAtMTg2LDcgKzE4OCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAotCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAJCX0KIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9vcGVyYTEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivb3BlcmExLmMKaW5kZXggMmU0ZmFiNy4uOThmZDlhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9vcGVyYTEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL29wZXJhMS5jCkBAIC0yNjMsMTAgKzI2MywxMCBAQAogCiBzdGF0aWMgaW50IG9wZXJhMV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqZCkKIHsKLQlpZiAoKGQtPmZlID0KLQkgICAgIGR2Yl9hdHRhY2goc3R2MDI5OV9hdHRhY2gsICZvcGVyYTFfc3R2MDI5OV9jb25maWcsCi0JCQkmZC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKLQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IG9wZXJhMV9zZXRfdm9sdGFnZTsKKwlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChzdHYwMjk5X2F0dGFjaCwgJm9wZXJhMV9zdHYwMjk5X2NvbmZpZywKKwkJCQkgICAgICAmZC0+ZGV2LT5pMmNfYWRhcCk7CisJaWYgKChkLT5mZV9hZGFwWzBdLmZlKSAhPSBOVUxMKSB7CisJCWQtPmZlX2FkYXBbMF0uZmUtPm9wcy5zZXRfdm9sdGFnZSA9IG9wZXJhMV9zZXRfdm9sdGFnZTsKIAkJcmV0dXJuIDA7CiAJfQogCWluZm8oIm5vdCBhdHRhY2hlZCBzdHYwMjk5Iik7CkBAIC0yNzYsNyArMjc2LDcgQEAKIHN0YXRpYyBpbnQgb3BlcmExX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCWR2Yl9hdHRhY2goCi0JCWR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHhjMD4+MSwKKwkJZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIDB4YzA+PjEsCiAJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCBEVkJfUExMX09QRVJBMQogCSk7CiAJcmV0dXJuIDA7CkBAIC01MTYsNiArNTE2LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuZnJvbnRlbmRfYXR0YWNoID0gb3BlcmExX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS5zdHJlYW1pbmdfY3RybCA9IG9wZXJhMV9zdHJlYW1pbmdfY3RybCwKIAkJCS50dW5lcl9hdHRhY2ggPSBvcGVyYTFfdHVuZXJfYXR0YWNoLApAQCAtNTM1LDYgKzUzNyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfQogCX0sCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9wY3R2NDUyZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9wY3R2NDUyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YWVjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3BjdHY0NTJlLmMKQEAgLTAsMCArMSwxMDc5IEBACisvKgorICogUENUViA0NTJlIERWQiBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBEb21pbmlrIEt1aGxlbiA8ZGt1aGxlbkBnbXgubmV0PgorICoKKyAqIFRUIGNvbm5lY3QgUzItMzY1MC1DSSBDb21tb24gSW50ZXJmYWNlIHN1cHBvcnQsIE1BQyByZWFkb3V0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBILiBTY2hpbWVrIDxtc2NoaW1la0BnbXguYXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKiBkdmIgdXNiIGZyYW1ld29yayAqLworI2RlZmluZSBEVkJfVVNCX0xPR19QUkVGSVggInBjdHY0NTJlIgorI2luY2x1ZGUgImR2Yi11c2IuaCIKKworLyogRGVtb2R1bGF0b3IgKi8KKyNpbmNsdWRlICJzdGIwODk5X2Rydi5oIgorI2luY2x1ZGUgInN0YjA4OTlfcmVnLmgiCisjaW5jbHVkZSAic3RiMDg5OV9jZmcuaCIKKy8qIFR1bmVyICovCisjaW5jbHVkZSAic3RiNjEwMC5oIgorI2luY2x1ZGUgInN0YjYxMDBfY2ZnLmgiCisvKiBGRSBQb3dlciAqLworI2luY2x1ZGUgImxuYnAyMi5oIgorCisjaW5jbHVkZSAiZHZiX2NhX2VuNTAyMjEuaCIKKyNpbmNsdWRlICJ0dHBjaS1lZXByb20uaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisKKyNkZWZpbmUgSVNPQ19JTlRFUkZBQ0VfQUxURVJOQVRJVkUgMworCisjZGVmaW5lIFNZTkNfQllURV9PVVQgMHhhYQorI2RlZmluZSBTWU5DX0JZVEVfSU4gIDB4NTUKKworLyogZ3Vlc3NlZDogKGNvcGllZCBmcm9tIHR0dXNiLWJ1ZGdldCkgKi8KKyNkZWZpbmUgUENUVl9DTURfUkVTRVQgMHgxNQorLyogY29tbWFuZCB0byBwb2xsIElSIHJlY2VpdmVyICovCisjZGVmaW5lIFBDVFZfQ01EX0lSICAgIDB4MWIKKy8qIGNvbW1hbmQgdG8gc2VuZCBJMkMgICovCisjZGVmaW5lIFBDVFZfQ01EX0kyQyAgIDB4MzEKKworI2RlZmluZSBJMkNfQUREUl9TVEIwODk5ICgweGQwID4+IDEpCisjZGVmaW5lIEkyQ19BRERSX1NUQjYxMDAgKDB4YzAgPj4gMSkKKyNkZWZpbmUgSTJDX0FERFJfTE5CUDIyICAoMHgxMCA+PiAxKQorI2RlZmluZSBJMkNfQUREUl8yNEMxNiAgICgweGEwID4+IDEpCisjZGVmaW5lIEkyQ19BRERSXzI0QzY0ICAgKDB4YTIgPj4gMSkKKworCisvKiBwY3R2NDUyZSBzZW5kcyB1cyB0aGlzIGFtb3VudCBvZiBkYXRhIGZvciBlYWNoIGlzc3VlZCB1c2ItY29tbWFuZCAqLworI2RlZmluZSBQQ1RWX0FOU1dFUl9MRU4gNjQKKy8qIFdhaXQgdXAgdG8gMTAwMG1zIGZvciBkZXZpY2UgICovCisjZGVmaW5lIFBDVFZfVElNRU9VVCAxMDAwCisKKworI2RlZmluZSBQQ1RWX0xFRF9HUElPICAgU1RCMDg5OV9HUElPMDEKKyNkZWZpbmUgUENUVl9MRURfR1JFRU4gIDB4ODIKKyNkZWZpbmUgUENUVl9MRURfT1JBTkdFIDB4MDIKKworI2RlZmluZSBjaV9kYmcoZm9ybWF0LCBhcmcuLi4pCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICgwKQkJCQkJCVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFZCX1VTQl9MT0dfUFJFRklYCVwKKwkJCSI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpOwlcCit9IHdoaWxlICgwKQorCitlbnVtIHsKKwlUVDM2NTBfQ01EX0NJX1RFU1QgPSAweDQwLAorCVRUMzY1MF9DTURfQ0lfUkRfQ1RSTCwKKwlUVDM2NTBfQ01EX0NJX1dSX0NUUkwsCisJVFQzNjUwX0NNRF9DSV9SRF9BVFRSLAorCVRUMzY1MF9DTURfQ0lfV1JfQVRUUiwKKwlUVDM2NTBfQ01EX0NJX1JFU0VULAorCVRUMzY1MF9DTURfQ0lfU0VUX1ZJREVPX1BPUlQKK307CisKKworc3RhdGljIHN0cnVjdCBzdGIwODk5X3Bvc3Rwcm9jIHBjdHY0NWVfcG9zdHByb2NbXSA9IHsKKwl7IFBDVFZfTEVEX0dQSU8sIFNUQjA4OTlfR1BJT1BVTExVUCB9LAorCXsgMCwgMCB9Cit9OworCisvKgorICogc3RvcmVzIGFsbCBwcml2YXRlIHZhcmlhYmxlcyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBQQ1RWNDUyZSBEVkItUzIKKyAqLworc3RydWN0IHBjdHY0NTJlX3N0YXRlIHsKKwlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgY2E7CisJc3RydWN0IG11dGV4IGNhX211dGV4OworCisJdTggYzsJICAgLyogdHJhbnNhY3Rpb24gY291bnRlciwgd3JhcHMgYXJvdW5kLi4uICAqLworCXU4IGluaXRpYWxpemVkOyAvKiBzZXQgdG8gMSBpZiAweDE1IGhhcyBiZWVuIHNlbnQgKi8KKwl1MTYgbGFzdF9yY19rZXk7Cit9OworCitzdGF0aWMgaW50IHR0MzY1MF9jaV9tc2coc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBjbWQsIHU4ICpkYXRhLAorCQkJIHVuc2lnbmVkIGludCB3cml0ZV9sZW4sIHVuc2lnbmVkIGludCByZWFkX2xlbikKK3sKKwlzdHJ1Y3QgcGN0djQ1MmVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqKWQtPnByaXY7CisJdTggYnVmWzY0XTsKKwl1OCBpZDsKKwl1bnNpZ25lZCBpbnQgcmxlbjsKKwlpbnQgcmV0OworCisJQlVHX09OKE5VTEwgPT0gZGF0YSAmJiAwICE9ICh3cml0ZV9sZW4gfCByZWFkX2xlbikpOworCUJVR19PTih3cml0ZV9sZW4gPiA2NCAtIDQpOworCUJVR19PTihyZWFkX2xlbiA+IDY0IC0gNCk7CisKKwlpZCA9IHN0YXRlLT5jKys7CisKKwlidWZbMF0gPSBTWU5DX0JZVEVfT1VUOworCWJ1ZlsxXSA9IGlkOworCWJ1ZlsyXSA9IGNtZDsKKwlidWZbM10gPSB3cml0ZV9sZW47CisKKwltZW1jcHkoYnVmICsgNCwgZGF0YSwgd3JpdGVfbGVuKTsKKworCXJsZW4gPSAocmVhZF9sZW4gPiAwKSA/IDY0IDogMDsKKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoZCwgYnVmLCA0ICsgd3JpdGVfbGVuLAorCQkJCSAgYnVmLCBybGVuLCAvKiBkZWxheV9tcyAqLyAwKTsKKwlpZiAoMCAhPSByZXQpCisJCWdvdG8gZmFpbGVkOworCisJcmV0ID0gLUVJTzsKKwlpZiAoU1lOQ19CWVRFX0lOICE9IGJ1ZlswXSB8fCBpZCAhPSBidWZbMV0pCisJCWdvdG8gZmFpbGVkOworCisJbWVtY3B5KGRhdGEsIGJ1ZiArIDQsIHJlYWRfbGVuKTsKKworCXJldHVybiAwOworCitmYWlsZWQ6CisJZXJyKCJDSSBlcnJvciAlZDsgJTAyWCAlMDJYICUwMlggLT4gJTAyWCAlMDJYICUwMlguIiwKKwkgICAgIHJldCwgU1lOQ19CWVRFX09VVCwgaWQsIGNtZCwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9tc2dfbG9ja2VkKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsCisJCQkJdTggY21kLCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IHdyaXRlX2xlbiwKKwkJCQl1bnNpZ25lZCBpbnQgcmVhZF9sZW4pCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKWNhLT5kYXRhOworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3RhdGUtPmNhX211dGV4KTsKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIGNtZCwgZGF0YSwgd3JpdGVfbGVuLCByZWFkX2xlbik7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+Y2FfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfcmVhZF9hdHRyaWJ1dGVfbWVtKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsCisJCQkJIGludCBzbG90LCBpbnQgYWRkcmVzcykKK3sKKwl1OCBidWZbM107CisJaW50IHJldDsKKworCWlmICgwICE9IHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gKGFkZHJlc3MgPj4gOCkgJiAweDBGOworCWJ1ZlsxXSA9IGFkZHJlc3M7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9SRF9BVFRSLCBidWYsIDIsIDMpOworCisJY2lfZGJnKCIlcyAlMDR4IC0+ICVkIDB4JTAyeCIsCisJCV9fZnVuY19fLCBhZGRyZXNzLCByZXQsIGJ1ZlsyXSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBidWZbMl07Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3dyaXRlX2F0dHJpYnV0ZV9tZW0oc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwKKwkJCQkgaW50IHNsb3QsIGludCBhZGRyZXNzLCB1OCB2YWx1ZSkKK3sKKwl1OCBidWZbM107CisKKwljaV9kYmcoIiVzICVkIDB4JTA0eCAweCUwMngiLAorCQlfX2Z1bmNfXywgc2xvdCwgYWRkcmVzcywgdmFsdWUpOworCisJaWYgKDAgIT0gc2xvdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWZbMF0gPSAoYWRkcmVzcyA+PiA4KSAmIDB4MEY7CisJYnVmWzFdID0gYWRkcmVzczsKKwlidWZbMl0gPSB2YWx1ZTsKKworCXJldHVybiB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9XUl9BVFRSLCBidWYsIDMsIDMpOworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9yZWFkX2NhbV9jb250cm9sKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsCisJCQkJIGludAkJCXNsb3QsCisJCQkJIHU4CQkJYWRkcmVzcykKK3sKKwl1OCBidWZbMl07CisJaW50IHJldDsKKworCWlmICgwICE9IHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gYWRkcmVzcyAmIDM7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9SRF9DVFJMLCBidWYsIDEsIDIpOworCisJY2lfZGJnKCIlcyAweCUwMnggLT4gJWQgMHglMDJ4IiwKKwkJX19mdW5jX18sIGFkZHJlc3MsIHJldCwgYnVmWzFdKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGJ1ZlsxXTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfd3JpdGVfY2FtX2NvbnRyb2woc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwKKwkJCQkgaW50CQkJc2xvdCwKKwkJCQkgdTgJCQlhZGRyZXNzLAorCQkJCSB1OAkJCXZhbHVlKQoreworCXU4IGJ1ZlsyXTsKKworCWNpX2RiZygiJXMgJWQgMHglMDJ4IDB4JTAyeCIsCisJCV9fZnVuY19fLCBzbG90LCBhZGRyZXNzLCB2YWx1ZSk7CisKKwlpZiAoMCAhPSBzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IGFkZHJlc3M7CisJYnVmWzFdID0gdmFsdWU7CisKKwlyZXR1cm4gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfV1JfQ1RSTCwgYnVmLCAyLCAyKTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfc2V0X3ZpZGVvX3BvcnQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwKKwkJCQkgaW50CQkJc2xvdCwKKwkJCQkgaW50CQkJZW5hYmxlKQoreworCXU4IGJ1ZlsxXTsKKwlpbnQgcmV0OworCisJY2lfZGJnKCIlcyAlZCAlZCIsIF9fZnVuY19fLCBzbG90LCBlbmFibGUpOworCisJaWYgKDAgIT0gc2xvdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbmFibGUgPSAhIWVuYWJsZTsKKwlidWZbMF0gPSBlbmFibGU7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9TRVRfVklERU9fUE9SVCwgYnVmLCAxLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChlbmFibGUgIT0gYnVmWzBdKSB7CisJCWVycigiQ0kgbm90ICVzYWJsZWQuIiwgZW5hYmxlID8gImVuIiA6ICJkaXMiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3Nsb3Rfc2h1dGRvd24oc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QpCit7CisJcmV0dXJuIHR0MzY1MF9jaV9zZXRfdmlkZW9fcG9ydChjYSwgc2xvdCwgLyogZW5hYmxlICovIDApOworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9zbG90X3RzX2VuYWJsZShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCkKK3sKKwlyZXR1cm4gdHQzNjUwX2NpX3NldF92aWRlb19wb3J0KGNhLCBzbG90LCAvKiBlbmFibGUgKi8gMSk7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3Nsb3RfcmVzZXQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKWNhLT5kYXRhOworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwl1OCBidWZbMV07CisJaW50IHJldDsKKworCWNpX2RiZygiJXMgJWQiLCBfX2Z1bmNfXywgc2xvdCk7CisKKwlpZiAoMCAhPSBzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IDA7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+Y2FfbXV0ZXgpOworCisJcmV0ID0gdHQzNjUwX2NpX21zZyhkLCBUVDM2NTBfQ01EX0NJX1JFU0VULCBidWYsIDEsIDEpOworCWlmICgwICE9IHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwltc2xlZXAoNTAwKTsKKworCWJ1ZlswXSA9IDE7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIFRUMzY1MF9DTURfQ0lfUkVTRVQsIGJ1ZiwgMSwgMSk7CisJaWYgKDAgIT0gcmV0KQorCQlnb3RvIGZhaWxlZDsKKworCW1zbGVlcCg1MDApOworCisJYnVmWzBdID0gMDsgLyogRlRBICovCisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIFRUMzY1MF9DTURfQ0lfU0VUX1ZJREVPX1BPUlQsIGJ1ZiwgMSwgMSk7CisKKyBmYWlsZWQ6CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+Y2FfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfcG9sbF9zbG90X3N0YXR1cyhzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLAorCQkJCSBpbnQJCQlzbG90LAorCQkJCSBpbnQJCQlvcGVuKQoreworCXU4IGJ1ZlsxXTsKKwlpbnQgcmV0OworCisJaWYgKDAgIT0gc2xvdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9URVNULCBidWYsIDAsIDEpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICgxID09IGJ1ZlswXSkKKwkJcmV0dXJuIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQgfAorCQkJRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCB0dDM2NTBfY2lfdW5pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgcGN0djQ1MmVfc3RhdGUgKnN0YXRlOworCisJY2lfZGJnKCIlcyIsIF9fZnVuY19fKTsKKworCWlmIChOVUxMID09IGQpCisJCXJldHVybjsKKworCXN0YXRlID0gKHN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqKWQtPnByaXY7CisJaWYgKE5VTEwgPT0gc3RhdGUpCisJCXJldHVybjsKKworCWlmIChOVUxMID09IHN0YXRlLT5jYS5kYXRhKQorCQlyZXR1cm47CisKKwkvKiBFcnJvciBpZ25vcmVkLiAqLworCXR0MzY1MF9jaV9zZXRfdmlkZW9fcG9ydCgmc3RhdGUtPmNhLCAvKiBzbG90ICovIDAsIC8qIGVuYWJsZSAqLyAwKTsKKworCWR2Yl9jYV9lbjUwMjIxX3JlbGVhc2UoJnN0YXRlLT5jYSk7CisKKwltZW1zZXQoJnN0YXRlLT5jYSwgMCwgc2l6ZW9mKHN0YXRlLT5jYSkpOworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9pbml0KHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmEpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gYS0+ZGV2OworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwlpbnQgcmV0OworCisJY2lfZGJnKCIlcyIsIF9fZnVuY19fKTsKKworCW11dGV4X2luaXQoJnN0YXRlLT5jYV9tdXRleCk7CisKKwlzdGF0ZS0+Y2Eub3duZXIgPSBUSElTX01PRFVMRTsKKwlzdGF0ZS0+Y2EucmVhZF9hdHRyaWJ1dGVfbWVtID0gdHQzNjUwX2NpX3JlYWRfYXR0cmlidXRlX21lbTsKKwlzdGF0ZS0+Y2Eud3JpdGVfYXR0cmlidXRlX21lbSA9IHR0MzY1MF9jaV93cml0ZV9hdHRyaWJ1dGVfbWVtOworCXN0YXRlLT5jYS5yZWFkX2NhbV9jb250cm9sID0gdHQzNjUwX2NpX3JlYWRfY2FtX2NvbnRyb2w7CisJc3RhdGUtPmNhLndyaXRlX2NhbV9jb250cm9sID0gdHQzNjUwX2NpX3dyaXRlX2NhbV9jb250cm9sOworCXN0YXRlLT5jYS5zbG90X3Jlc2V0ID0gdHQzNjUwX2NpX3Nsb3RfcmVzZXQ7CisJc3RhdGUtPmNhLnNsb3Rfc2h1dGRvd24gPSB0dDM2NTBfY2lfc2xvdF9zaHV0ZG93bjsKKwlzdGF0ZS0+Y2Euc2xvdF90c19lbmFibGUgPSB0dDM2NTBfY2lfc2xvdF90c19lbmFibGU7CisJc3RhdGUtPmNhLnBvbGxfc2xvdF9zdGF0dXMgPSB0dDM2NTBfY2lfcG9sbF9zbG90X3N0YXR1czsKKwlzdGF0ZS0+Y2EuZGF0YSA9IGQ7CisKKwlyZXQgPSBkdmJfY2FfZW41MDIyMV9pbml0KCZhLT5kdmJfYWRhcCwKKwkJCQkgICAmc3RhdGUtPmNhLAorCQkJCSAgIC8qIGZsYWdzICovIDAsCisJCQkJICAgLyogbl9zbG90cyAqLyAxKTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJZXJyKCJDYW5ub3QgaW5pdGlhbGl6ZSBDSTogRXJyb3IgJWQuIiwgcmV0KTsKKwkJbWVtc2V0KCZzdGF0ZS0+Y2EsIDAsIHNpemVvZihzdGF0ZS0+Y2EpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvKCJDSSBpbml0aWFsaXplZC4iKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIENNRF9CVUZGRVJfU0laRSAweDI4CitzdGF0aWMgaW50IHBjdHY0NTJlX2kyY19tc2coc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBhZGRyLAorCQkJCWNvbnN0IHU4ICpzbmRfYnVmLCB1OCBzbmRfbGVuLAorCQkJCXU4ICpyY3ZfYnVmLCB1OCByY3ZfbGVuKQoreworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwl1OCBidWZbNjRdOworCXU4IGlkOworCWludCByZXQ7CisKKwlpZCA9IHN0YXRlLT5jKys7CisKKwlyZXQgPSAtRUlOVkFMOworCWlmIChzbmRfbGVuID4gNjQgLSA3IHx8IHJjdl9sZW4gPiA2NCAtIDcpCisJCWdvdG8gZmFpbGVkOworCisJYnVmWzBdID0gU1lOQ19CWVRFX09VVDsKKwlidWZbMV0gPSBpZDsKKwlidWZbMl0gPSBQQ1RWX0NNRF9JMkM7CisJYnVmWzNdID0gc25kX2xlbiArIDM7CisJYnVmWzRdID0gYWRkciA8PCAxOworCWJ1Zls1XSA9IHNuZF9sZW47CisJYnVmWzZdID0gcmN2X2xlbjsKKworCW1lbWNweShidWYgKyA3LCBzbmRfYnVmLCBzbmRfbGVuKTsKKworCXJldCA9IGR2Yl91c2JfZ2VuZXJpY19ydyhkLCBidWYsIDcgKyBzbmRfbGVuLAorCQkJCSAgYnVmLCAvKiByY3ZfbGVuICovIDY0LAorCQkJCSAgLyogZGVsYXlfbXMgKi8gMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbGVkOworCisJLyogVFQgVVNCIHByb3RvY29sIGVycm9yLiAqLworCXJldCA9IC1FSU87CisJaWYgKFNZTkNfQllURV9JTiAhPSBidWZbMF0gfHwgaWQgIT0gYnVmWzFdKQorCQlnb3RvIGZhaWxlZDsKKworCS8qIEkyQyBkZXZpY2UgZGlkbid0IHJlc3BvbmQgYXMgZXhwZWN0ZWQuICovCisJcmV0ID0gLUVSRU1PVEVJTzsKKwlpZiAoYnVmWzVdIDwgc25kX2xlbiB8fCBidWZbNl0gPCByY3ZfbGVuKQorCQlnb3RvIGZhaWxlZDsKKworCW1lbWNweShyY3ZfYnVmLCBidWYgKyA3LCByY3ZfbGVuKTsKKworCXJldHVybiByY3ZfbGVuOworCitmYWlsZWQ6CisJZXJyKCJJMkMgZXJyb3IgJWQ7ICUwMlggJTAyWCAgJTAyWCAlMDJYICUwMlggLT4gIgorCSAgICAgIiUwMlggJTAyWCAgJTAyWCAlMDJYICUwMlguIiwKKwkgICAgIHJldCwgU1lOQ19CWVRFX09VVCwgaWQsIGFkZHIgPDwgMSwgc25kX2xlbiwgcmN2X2xlbiwKKwkgICAgIGJ1ZlswXSwgYnVmWzFdLCBidWZbNF0sIGJ1Zls1XSwgYnVmWzZdKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGN0djQ1MmVfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgaTJjX21zZyAqbXNnLAorCQkJCWludCBudW0pCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwlpbnQgaTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQl1OCBhZGRyLCBzbmRfbGVuLCByY3ZfbGVuLCAqc25kX2J1ZiwgKnJjdl9idWY7CisJCWludCByZXQ7CisKKwkJaWYgKG1zZ1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7CisJCQlhZGRyID0gbXNnW2ldLmFkZHI7CisJCQlzbmRfYnVmID0gTlVMTDsKKwkJCXNuZF9sZW4gPSAwOworCQkJcmN2X2J1ZiA9IG1zZ1tpXS5idWY7CisJCQlyY3ZfbGVuID0gbXNnW2ldLmxlbjsKKwkJfSBlbHNlIHsKKwkJCWFkZHIgPSBtc2dbaV0uYWRkcjsKKwkJCXNuZF9idWYgPSBtc2dbaV0uYnVmOworCQkJc25kX2xlbiA9IG1zZ1tpXS5sZW47CisJCQlyY3ZfYnVmID0gTlVMTDsKKwkJCXJjdl9sZW4gPSAwOworCQl9CisKKwkJcmV0ID0gcGN0djQ1MmVfaTJjX21zZyhkLCBhZGRyLCBzbmRfYnVmLCBzbmRfbGVuLCByY3ZfYnVmLAorCQkJCQlyY3ZfbGVuKTsKKwkJaWYgKHJldCA8IHJjdl9sZW4pCisJCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1MzIgcGN0djQ1MmVfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19JMkM7Cit9CisKK3N0YXRpYyBpbnQgcGN0djQ1MmVfcG93ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBpKQoreworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwl1OCBiMFtdID0geyAweGFhLCAwLCBQQ1RWX0NNRF9SRVNFVCwgMSwgMCB9OworCXU4IHJ4W1BDVFZfQU5TV0VSX0xFTl07CisJaW50IHJldDsKKworCWluZm8oIiVzOiAlZFxuIiwgX19mdW5jX18sIGkpOworCisJaWYgKCFpKQorCQlyZXR1cm4gMDsKKworCWlmIChzdGF0ZS0+aW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCisJLyogaG1tIHdoZXJlIHNob3VkIHRoaXMgc2hvdWxkIGdvPyAqLworCXJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKGQtPnVkZXYsIDAsIElTT0NfSU5URVJGQUNFX0FMVEVSTkFUSVZFKTsKKwlpZiAocmV0ICE9IDApCisJCWluZm8oIiVzOiBXYXJuaW5nIHNldCBpbnRlcmZhY2UgcmV0dXJuZWQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwkvKiB0aGlzIGlzIGEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIGRvbnQga25vdyB3aGVyZSB0byBwdXQgKi8KKwliMFsxXSA9IHN0YXRlLT5jKys7CisJLyogcmVzZXQgYm9hcmQgKi8KKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoZCwgYjAsIHNpemVvZihiMCksIHJ4LCBQQ1RWX0FOU1dFUl9MRU4sIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwliMFsxXSA9IHN0YXRlLT5jKys7CisJYjBbNF0gPSAxOworCS8qIHJlc2V0IGJvYXJkIChhZ2Fpbj8pICovCisJcmV0ID0gZHZiX3VzYl9nZW5lcmljX3J3KGQsIGIwLCBzaXplb2YoYjApLCByeCwgUENUVl9BTlNXRVJfTEVOLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3RhdGUtPmluaXRpYWxpemVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjdHY0NTJlX3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgcGN0djQ1MmVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqKWQtPnByaXY7CisJdTggYltDTURfQlVGRkVSX1NJWkVdOworCXU4IHJ4W1BDVFZfQU5TV0VSX0xFTl07CisJaW50IHJldCwgaTsKKwl1OCBpZCA9IHN0YXRlLT5jKys7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgaGVhZGVyICAqLworCWJbMF0gPSBTWU5DX0JZVEVfT1VUOworCWJbMV0gPSBpZDsKKwliWzJdID0gUENUVl9DTURfSVI7CisJYlszXSA9IDA7CisKKwkvKiBzZW5kIGlyIHJlcXVlc3QgKi8KKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoZCwgYiwgNCwgcngsIFBDVFZfQU5TV0VSX0xFTiwgMCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGRlYnVnID4gMykgeworCQlpbmZvKCIlczogcmVhZDogJTJkOiAlMDJ4ICUwMnggJTAyeDogIiwgX19mdW5jX18sCisJCQkJcmV0LCByeFswXSwgcnhbMV0sIHJ4WzJdKTsKKwkJZm9yIChpID0gMDsgKGkgPCByeFszXSkgJiYgKChpKzMpIDwgUENUVl9BTlNXRVJfTEVOKTsgaSsrKQorCQkJaW5mbygiICUwMngiLCByeFtpKzNdKTsKKworCQlpbmZvKCJcbiIpOworCX0KKworCWlmICgocnhbM10gPT0gOSkgJiYgIChyeFsxMl0gJiAweDAxKSkgeworCQkvKiBnb3QgYSAicHJlc3MiIGV2ZW50ICovCisJCXN0YXRlLT5sYXN0X3JjX2tleSA9IChyeFs3XSA8PCA4KSB8IHJ4WzZdOworCQlpZiAoZGVidWcgPiAyKQorCQkJaW5mbygiJXM6IGNtZD0weCUwMnggc3lzPTB4JTAyeFxuIiwKKwkJCQlfX2Z1bmNfXywgcnhbNl0sIHJ4WzddKTsKKworCQlyY19rZXlkb3duKGQtPnJjX2Rldiwgc3RhdGUtPmxhc3RfcmNfa2V5LCAwKTsKKwl9IGVsc2UgaWYgKHN0YXRlLT5sYXN0X3JjX2tleSkgeworCQlyY19rZXl1cChkLT5yY19kZXYpOworCQlzdGF0ZS0+bGFzdF9yY19rZXkgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjdHY0NTJlX3JlYWRfbWFjX2FkZHJlc3Moc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBtYWNbNl0pCit7CisJY29uc3QgdTggbWVtX2FkZHJbXSA9IHsgMHgxZiwgMHhjYyB9OworCXU4IGVuY29kZWRfbWFjWzIwXTsKKwlpbnQgcmV0OworCisJcmV0ID0gLUVBR0FJTjsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT5pMmNfbXV0ZXgpIDwgMCkKKwkJZ290byBmYWlsZWQ7CisKKwlyZXQgPSBwY3R2NDUyZV9pMmNfbXNnKGQsIEkyQ19BRERSXzI0QzE2LAorCQkJCW1lbV9hZGRyICsgMSwgLyogc25kX2xlbiAqLyAxLAorCQkJCWVuY29kZWRfbWFjLCAvKiByY3ZfbGVuICovIDIwKTsKKwlpZiAoLUVSRU1PVEVJTyA9PSByZXQpCisJCS8qIENhdXRpb24hIEEgMjRDMTYgaW50ZXJwcmV0cyAweEEyIDB4MUYgMHhDQyBhcyBhCisJCSAgIGJ5dGUgd3JpdGUgaWYgL1dDIGlzIGxvdy4gKi8KKwkJcmV0ID0gcGN0djQ1MmVfaTJjX21zZyhkLCBJMkNfQUREUl8yNEM2NCwKKwkJCQkJbWVtX2FkZHIsIDIsCisJCQkJCWVuY29kZWRfbWFjLCAyMCk7CisKKwltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7CisKKwlpZiAoMjAgIT0gcmV0KQorCQlnb3RvIGZhaWxlZDsKKworCXJldCA9IHR0cGNpX2VlcHJvbV9kZWNvZGVfbWFjKG1hYywgZW5jb2RlZF9tYWMpOworCWlmICgwICE9IHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwlyZXR1cm4gMDsKKworZmFpbGVkOgorCW1lbXNldChtYWMsIDAsIDYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGIwODk5X3MxX3JlZyBwY3R2NDUyZV9pbml0X2RldltdID0geworCXsgU1RCMDg5OV9ESVNDTlRSTDEsCTB4MjYgfSwKKwl7IFNUQjA4OTlfRElTQ05UUkwyLAkweDgwIH0sCisJeyBTVEIwODk5X0RJU1JYX1NUMCwJMHgwNCB9LAorCXsgU1RCMDg5OV9ESVNSWF9TVDEsCTB4MjAgfSwKKwl7IFNUQjA4OTlfRElTUEFSSVRZLAkweDAwIH0sCisJeyBTVEIwODk5X0RJU0ZJRk8sCTB4MDAgfSwKKwl7IFNUQjA4OTlfRElTRjIyLAkweDk5IH0sCisJeyBTVEIwODk5X0RJU0YyMlJYLAkweDg1IH0sIC8qIDB4YTggKi8KKwl7IFNUQjA4OTlfQUNSUFJFU0MsCTB4MTEgfSwKKwl7IFNUQjA4OTlfQUNSRElWMSwJMHgwYSB9LAorCXsgU1RCMDg5OV9BQ1JESVYyLAkweDA1IH0sCisJeyBTVEIwODk5X0RBQ1IxCSwJMHgwMCB9LAorCXsgU1RCMDg5OV9EQUNSMgksCTB4MDAgfSwKKwl7IFNUQjA4OTlfT1VUQ0ZHLAkweDAwIH0sCisJeyBTVEIwODk5X01PREVDRkcsCTB4MDAgfSwgLyogSW52ZXJzaW9uICovCisJeyBTVEIwODk5X0lSUU1TS18zLAkweGYzIH0sCisJeyBTVEIwODk5X0lSUU1TS18yLAkweGZjIH0sCisJeyBTVEIwODk5X0lSUU1TS18xLAkweGZmIH0sCisJeyBTVEIwODk5X0lSUU1TS18wLAkweGZmIH0sCisJeyBTVEIwODk5X0kyQ0NGRywJMHg4OCB9LAorCXsgU1RCMDg5OV9JMkNSUFQsCTB4NTggfSwKKwl7IFNUQjA4OTlfR1BJTzAwQ0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8wMUNGRywJMHg4MiB9LCAvKiBMRUQ6IDB4MDIgZ3JlZW4sIDB4ODIgb3JhbmdlICovCisJeyBTVEIwODk5X0dQSU8wMkNGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMDNDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA0Q0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8wNUNGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMDZDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA3Q0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8wOENGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMDlDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzEwQ0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xMUNGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMTJDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzEzQ0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xNENGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMTVDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE2Q0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xN0NGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMThDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE5Q0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8yMENGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9TREFUQ0ZHLAkweGI4IH0sCisJeyBTVEIwODk5X1NDTFRDRkcsCTB4YmEgfSwKKwl7IFNUQjA4OTlfQUdDUkZDRkcsCTB4MWMgfSwgLyogMHgxMSBEVkItUzsgMHgxYyBEVkItUzIgKDFjLCByamttKSAqLworCXsgU1RCMDg5OV9HUElPMjIsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzIxLAkweDkxIH0sCisJeyBTVEIwODk5X0RJUkNMS0NGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9DTEtPVVQyN0NGRywJMHg3ZSB9LAorCXsgU1RCMDg5OV9TVERCWUNGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9DUzBDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfQ1MxQ0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0RJU0VRQ09DRkcsCTB4MjAgfSwKKwl7IFNUQjA4OTlfTkNPQVJTRSwJMHgxNSB9LCAvKiAweDE1IDI3TWh6LCBGLzMgMTk4TUh6LCBGLzYgMTA4TUh6ICovCisJeyBTVEIwODk5X1NZTlRDVFJMLAkweDAwIH0sIC8qIDB4MDAgQ0xLSSwgMHgwMiBYVEFMSSAqLworCXsgU1RCMDg5OV9GSUxUQ1RSTCwJMHgwMCB9LAorCXsgU1RCMDg5OV9TWVNDVFJMLAkweDAwIH0sCisJeyBTVEIwODk5X1NUT1BDTEsxLAkweDIwIH0sIC8qIG9yaWc6IDB4MDAgYnVkZ2V0LWNpOiAweDIwICovCisJeyBTVEIwODk5X1NUT1BDTEsyLAkweDAwIH0sCisJeyBTVEIwODk5X0lOVEJVRkNUUkwsCTB4MGEgfSwKKwl7IFNUQjA4OTlfQUdDMkkxLAkweDAwIH0sCisJeyBTVEIwODk5X0FHQzJJMiwJMHgwMCB9LAorCXsgU1RCMDg5OV9BR0NJUUlOLAkweDAwIH0sCisJeyBTVEIwODk5X1RTVFJFUywJMHg0MCB9LCAvKiByamttICovCisJeyAweGZmZmYsCQkweGZmIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YjA4OTlfczFfcmVnIHBjdHY0NTJlX2luaXRfczFfZGVtb2RbXSA9IHsKKwl7IFNUQjA4OTlfREVNT0QsCTB4MDAgfSwKKwl7IFNUQjA4OTlfUkNPTVBDLAkweGM5IH0sCisJeyBTVEIwODk5X0FHQzFDTiwJMHgwMSB9LAorCXsgU1RCMDg5OV9BR0MxUkVGLAkweDEwIH0sCisJeyBTVEIwODk5X1JUQywJCTB4MjMgfSwKKwl7IFNUQjA4OTlfVE1HQ0ZHLAkweDRlIH0sCisJeyBTVEIwODk5X0FHQzJSRUYsCTB4MzQgfSwKKwl7IFNUQjA4OTlfVExTUiwJCTB4ODQgfSwKKwl7IFNUQjA4OTlfQ0ZELAkJMHhmNyB9LAorCXsgU1RCMDg5OV9BQ0xDLAkJMHg4NyB9LAorCXsgU1RCMDg5OV9CQ0xDLAkJMHg5NCB9LAorCXsgU1RCMDg5OV9FUU9OLAkJMHg0MSB9LAorCXsgU1RCMDg5OV9MRFQsCQkweGYxIH0sCisJeyBTVEIwODk5X0xEVDIsCQkweGUzIH0sCisJeyBTVEIwODk5X0VRVUFMUkVGLAkweGI0IH0sCisJeyBTVEIwODk5X1RNR1JBTVAsCTB4MTAgfSwKKwl7IFNUQjA4OTlfVE1HVEhELAkweDMwIH0sCisJeyBTVEIwODk5X0lEQ0NPTVAsCTB4ZmQgfSwKKwl7IFNUQjA4OTlfUURDQ09NUCwJMHhmZiB9LAorCXsgU1RCMDg5OV9QT1dFUkksCTB4MGMgfSwKKwl7IFNUQjA4OTlfUE9XRVJRLAkweDBmIH0sCisJeyBTVEIwODk5X1JDT01QLAkweDZjIH0sCisJeyBTVEIwODk5X0FHQ0lRSU4sCTB4ODAgfSwKKwl7IFNUQjA4OTlfQUdDMkkxLAkweDA2IH0sCisJeyBTVEIwODk5X0FHQzJJMiwJMHgwMCB9LAorCXsgU1RCMDg5OV9UTElSLAkJMHgzMCB9LAorCXsgU1RCMDg5OV9SVEYsCQkweDdmIH0sCisJeyBTVEIwODk5X0RTVEFUVVMsCTB4MDAgfSwKKwl7IFNUQjA4OTlfTERJLAkJMHhiYyB9LAorCXsgU1RCMDg5OV9DRlJNLAkJMHhlYSB9LAorCXsgU1RCMDg5OV9DRlJMLAkJMHgzMSB9LAorCXsgU1RCMDg5OV9OSVJNLAkJMHgyYiB9LAorCXsgU1RCMDg5OV9OSVJMLAkJMHg4MCB9LAorCXsgU1RCMDg5OV9JU1lNQiwJMHgxZCB9LAorCXsgU1RCMDg5OV9RU1lNQiwJMHhhNiB9LAorCXsgU1RCMDg5OV9TRlJILAkJMHgyZiB9LAorCXsgU1RCMDg5OV9TRlJNLAkJMHg2OCB9LAorCXsgU1RCMDg5OV9TRlJMLAkJMHg0MCB9LAorCXsgU1RCMDg5OV9TRlJVUEgsCTB4MmYgfSwKKwl7IFNUQjA4OTlfU0ZSVVBNLAkweDY4IH0sCisJeyBTVEIwODk5X1NGUlVQTCwJMHg0MCB9LAorCXsgU1RCMDg5OV9FUVVBSTEsCTB4MDIgfSwKKwl7IFNUQjA4OTlfRVFVQVExLAkweGZmIH0sCisJeyBTVEIwODk5X0VRVUFJMiwJMHgwNCB9LAorCXsgU1RCMDg5OV9FUVVBUTIsCTB4MDUgfSwKKwl7IFNUQjA4OTlfRVFVQUkzLAkweDAyIH0sCisJeyBTVEIwODk5X0VRVUFRMywJMHhmZCB9LAorCXsgU1RCMDg5OV9FUVVBSTQsCTB4MDMgfSwKKwl7IFNUQjA4OTlfRVFVQVE0LAkweDA3IH0sCisJeyBTVEIwODk5X0VRVUFJNSwJMHgwOCB9LAorCXsgU1RCMDg5OV9FUVVBUTUsCTB4ZjUgfSwKKwl7IFNUQjA4OTlfRFNUQVRVUzIsCTB4MDAgfSwKKwl7IFNUQjA4OTlfVlNUQVRVUywJMHgwMCB9LAorCXsgU1RCMDg5OV9WRVJST1IsCTB4ODYgfSwKKwl7IFNUQjA4OTlfSVFTV0FQLAkweDJhIH0sCisJeyBTVEIwODk5X0VDTlQxTSwJMHgwMCB9LAorCXsgU1RCMDg5OV9FQ05UMUwsCTB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDJNLAkweDAwIH0sCisJeyBTVEIwODk5X0VDTlQyTCwJMHgwMCB9LAorCXsgU1RCMDg5OV9FQ05UM00sCTB4MGEgfSwKKwl7IFNUQjA4OTlfRUNOVDNMLAkweGFkIH0sCisJeyBTVEIwODk5X0ZFQ0FVVE8xLAkweDA2IH0sCisJeyBTVEIwODk5X0ZFQ00sCQkweDAxIH0sCisJeyBTVEIwODk5X1ZUSDEyLAkweGIwIH0sCisJeyBTVEIwODk5X1ZUSDIzLAkweDdhIH0sCisJeyBTVEIwODk5X1ZUSDM0LAkweDU4IH0sCisJeyBTVEIwODk5X1ZUSDU2LAkweDM4IH0sCisJeyBTVEIwODk5X1ZUSDY3LAkweDM0IH0sCisJeyBTVEIwODk5X1ZUSDc4LAkweDI0IH0sCisJeyBTVEIwODk5X1BSVklULAkweGZmIH0sCisJeyBTVEIwODk5X1ZJVFNZTkMsCTB4MTkgfSwKKwl7IFNUQjA4OTlfUlNVTEMsCTB4YjEgfSwgLyogRFZCID0gMHhiMSwgRFNTID0gMHhhMSAqLworCXsgU1RCMDg5OV9UU1VMQywJMHg0MiB9LAorCXsgU1RCMDg5OV9SU0xMQywJMHg0MSB9LAorCXsgU1RCMDg5OV9UU0xQTCwJMHgxMiB9LAorCXsgU1RCMDg5OV9UU0NGR0gsCTB4MGMgfSwKKwl7IFNUQjA4OTlfVFNDRkdNLAkweDAwIH0sCisJeyBTVEIwODk5X1RTQ0ZHTCwJMHgwMCB9LAorCXsgU1RCMDg5OV9UU09VVCwJMHg2OSB9LCAvKiAweDBkIGZvciBDQU0gKi8KKwl7IFNUQjA4OTlfUlNTWU5DREVMLAkweDAwIH0sCisJeyBTVEIwODk5X1RTSU5IREVMSCwJMHgwMiB9LAorCXsgU1RCMDg5OV9UU0lOSERFTE0sCTB4MDAgfSwKKwl7IFNUQjA4OTlfVFNJTkhERUxMLAkweDAwIH0sCisJeyBTVEIwODk5X1RTTExTVEtNLAkweDFiIH0sCisJeyBTVEIwODk5X1RTTExTVEtMLAkweGIzIH0sCisJeyBTVEIwODk5X1RTVUxTVEtNLAkweDAwIH0sCisJeyBTVEIwODk5X1RTVUxTVEtMLAkweDAwIH0sCisJeyBTVEIwODk5X1BDS0xFTlVMLAkweGJjIH0sCisJeyBTVEIwODk5X1BDS0xFTkxMLAkweGNjIH0sCisJeyBTVEIwODk5X1JTUENLTEVOLAkweGJkIH0sCisJeyBTVEIwODk5X1RTU1RBVFVTLAkweDkwIH0sCisJeyBTVEIwODk5X0VSUkNUUkwxLAkweGI2IH0sCisJeyBTVEIwODk5X0VSUkNUUkwyLAkweDk1IH0sCisJeyBTVEIwODk5X0VSUkNUUkwzLAkweDhkIH0sCisJeyBTVEIwODk5X0RNT05NU0sxLAkweDI3IH0sCisJeyBTVEIwODk5X0RNT05NU0swLAkweDAzIH0sCisJeyBTVEIwODk5X0RFTUFQVklULAkweDVjIH0sCisJeyBTVEIwODk5X1BMUEFSTSwJMHgxOSB9LAorCXsgU1RCMDg5OV9QREVMQ1RSTCwJMHg0OCB9LAorCXsgU1RCMDg5OV9QREVMQ1RSTDIsCTB4MDAgfSwKKwl7IFNUQjA4OTlfQkJIQ1RSTDEsCTB4MDAgfSwKKwl7IFNUQjA4OTlfQkJIQ1RSTDIsCTB4MDAgfSwKKwl7IFNUQjA4OTlfSFlTVFRIUkVTSCwJMHg3NyB9LAorCXsgU1RCMDg5OV9NQVRDU1RNLAkweDAwIH0sCisJeyBTVEIwODk5X01BVENTVEwsCTB4MDAgfSwKKwl7IFNUQjA4OTlfVVBMQ1NUTSwJMHgwMCB9LAorCXsgU1RCMDg5OV9VUExDU1RMLAkweDAwIH0sCisJeyBTVEIwODk5X0RGTENTVE0sCTB4MDAgfSwKKwl7IFNUQjA4OTlfREZMQ1NUTCwJMHgwMCB9LAorCXsgU1RCMDg5OV9TWU5DQ1NULAkweDAwIH0sCisJeyBTVEIwODk5X1NZTkNEQ1NUTSwJMHgwMCB9LAorCXsgU1RCMDg5OV9TWU5DRENTVEwsCTB4MDAgfSwKKwl7IFNUQjA4OTlfSVNJX0VOVFJZLAkweDAwIH0sCisJeyBTVEIwODk5X0lTSV9CSVRfRU4sCTB4MDAgfSwKKwl7IFNUQjA4OTlfTUFUU1RSTSwJMHhmMCB9LAorCXsgU1RCMDg5OV9NQVRTVFJMLAkweDAyIH0sCisJeyBTVEIwODk5X1VQTFNUUk0sCTB4NDUgfSwKKwl7IFNUQjA4OTlfVVBMU1RSTCwJMHg2MCB9LAorCXsgU1RCMDg5OV9ERkxTVFJNLAkweGUzIH0sCisJeyBTVEIwODk5X0RGTFNUUkwsCTB4MDAgfSwKKwl7IFNUQjA4OTlfU1lOQ1NUUiwJMHg0NyB9LAorCXsgU1RCMDg5OV9TWU5DRFNUUk0sCTB4MDUgfSwKKwl7IFNUQjA4OTlfU1lOQ0RTVFJMLAkweDE4IH0sCisJeyBTVEIwODk5X0NGR1BERUxTVEFUVVMxLCAweDE5IH0sCisJeyBTVEIwODk5X0NGR1BERUxTVEFUVVMyLCAweDJiIH0sCisJeyBTVEIwODk5X0JCRkVSUk9STSwJMHgwMCB9LAorCXsgU1RCMDg5OV9CQkZFUlJPUkwsCTB4MDEgfSwKKwl7IFNUQjA4OTlfVVBLVEVSUk9STSwJMHgwMCB9LAorCXsgU1RCMDg5OV9VUEtURVJST1JMLAkweDAwIH0sCisJeyAweGZmZmYsCQkweGZmIH0sCit9OworCitzdGF0aWMgc3RydWN0IHN0YjA4OTlfY29uZmlnIHN0YjA4OTlfY29uZmlnID0geworCS5pbml0X2Rldgk9IHBjdHY0NTJlX2luaXRfZGV2LAorCS5pbml0X3MyX2RlbW9kCT0gc3RiMDg5OV9zMl9pbml0XzIsCisJLmluaXRfczFfZGVtb2QJPSBwY3R2NDUyZV9pbml0X3MxX2RlbW9kLAorCS5pbml0X3MyX2ZlYwk9IHN0YjA4OTlfczJfaW5pdF80LAorCS5pbml0X3RzdAk9IHN0YjA4OTlfczFfaW5pdF81LAorCisJLmRlbW9kX2FkZHJlc3MgICA9IEkyQ19BRERSX1NUQjA4OTksIC8qIEkyQyBBZGRyZXNzICovCisJLmJsb2NrX3N5bmNfbW9kZSA9IFNUQjA4OTlfU1lOQ19GT1JDRUQsIC8qID8gKi8KKworCS54dGFsX2ZyZXEgICAgICAgPSAyNzAwMDAwMCwJIC8qIEFzc3VtZSBIeiA/ICovCisJLmludmVyc2lvbiAgICAgICA9IElRX1NXQVBfT04sICAgICAgIC8qID8gKi8KKworCS5sb19jbGsJICA9IDc2NTAwMDAwLAorCS5oaV9jbGsJICA9IDk5MDAwMDAwLAorCisJLnRzX291dHB1dF9tb2RlICA9IDAsCS8qIFVzZSBwYXJhbGxlbCBtb2RlICovCisJLmNsb2NrX3BvbGFyaXR5ICA9IDAsCisJLmRhdGFfY2xrX3Bhcml0eSA9IDAsCisJLmZlY19tb2RlCT0gMCwKKworCS5lc25vX2F2ZQkgICAgPSBTVEIwODk5X0RWQlMyX0VTTk9fQVZFLAorCS5lc25vX3F1YW50CSAgPSBTVEIwODk5X0RWQlMyX0VTTk9fUVVBTlQsCisJLmF2ZnJhbWVzX2NvYXJzZSAgICAgPSBTVEIwODk5X0RWQlMyX0FWRlJBTUVTX0NPQVJTRSwKKwkuYXZmcmFtZXNfZmluZSAgICAgICA9IFNUQjA4OTlfRFZCUzJfQVZGUkFNRVNfRklORSwKKwkubWlzc190aHJlc2hvbGQgICAgICA9IFNUQjA4OTlfRFZCUzJfTUlTU19USFJFU0hPTEQsCisJLnV3cF90aHJlc2hvbGRfYWNxICAgPSBTVEIwODk5X0RWQlMyX1VXUF9USFJFU0hPTERfQUNRLAorCS51d3BfdGhyZXNob2xkX3RyYWNrID0gU1RCMDg5OV9EVkJTMl9VV1BfVEhSRVNIT0xEX1RSQUNLLAorCS51d3BfdGhyZXNob2xkX3NvZiAgID0gU1RCMDg5OV9EVkJTMl9VV1BfVEhSRVNIT0xEX1NPRiwKKwkuc29mX3NlYXJjaF90aW1lb3V0ICA9IFNUQjA4OTlfRFZCUzJfU09GX1NFQVJDSF9USU1FT1VULAorCisJLmJ0cl9uY29fYml0cwkgID0gU1RCMDg5OV9EVkJTMl9CVFJfTkNPX0JJVFMsCisJLmJ0cl9nYWluX3NoaWZ0X29mZnNldCA9IFNUQjA4OTlfRFZCUzJfQlRSX0dBSU5fU0hJRlRfT0ZGU0VULAorCS5jcmxfbmNvX2JpdHMJICA9IFNUQjA4OTlfRFZCUzJfQ1JMX05DT19CSVRTLAorCS5sZHBjX21heF9pdGVyCSA9IFNUQjA4OTlfRFZCUzJfTERQQ19NQVhfSVRFUiwKKworCS50dW5lcl9nZXRfZnJlcXVlbmN5CT0gc3RiNjEwMF9nZXRfZnJlcXVlbmN5LAorCS50dW5lcl9zZXRfZnJlcXVlbmN5CT0gc3RiNjEwMF9zZXRfZnJlcXVlbmN5LAorCS50dW5lcl9zZXRfYmFuZHdpZHRoCT0gc3RiNjEwMF9zZXRfYmFuZHdpZHRoLAorCS50dW5lcl9nZXRfYmFuZHdpZHRoCT0gc3RiNjEwMF9nZXRfYmFuZHdpZHRoLAorCS50dW5lcl9zZXRfcmZzaWdnYWluCT0gTlVMTCwKKworCS8qIGhlbHBlciBmb3Igc3dpdGNoaW5nIExFRCBncmVlbi9vcmFuZ2UgKi8KKwkucG9zdHByb2MgPSBwY3R2NDVlX3Bvc3Rwcm9jCit9OworCitzdGF0aWMgc3RydWN0IHN0YjYxMDBfY29uZmlnIHN0YjYxMDBfY29uZmlnID0geworCS50dW5lcl9hZGRyZXNzID0gSTJDX0FERFJfU1RCNjEwMCwKKwkucmVmY2xvY2sgICAgICA9IDI3MDAwMDAwCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY3R2NDUyZV9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgICA9IHBjdHY0NTJlX2kyY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gcGN0djQ1MmVfaTJjX2Z1bmMKK307CisKK3N0YXRpYyBpbnQgcGN0djQ1MmVfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmEpCit7CisJc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkOworCisJYS0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3RiMDg5OV9hdHRhY2gsICZzdGIwODk5X2NvbmZpZywKKwkJCQkJCSZhLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoIWEtPmZlX2FkYXBbMF0uZmUpCisJCXJldHVybiAtRU5PREVWOworCWlmICgoZHZiX2F0dGFjaChsbmJwMjJfYXR0YWNoLCBhLT5mZV9hZGFwWzBdLmZlLAorCQkJCQkmYS0+ZGV2LT5pMmNfYWRhcCkpID09IDApCisJCWVycigiQ2Fubm90IGF0dGFjaCBsbmJwMjJcbiIpOworCisJaWQgPSBhLT5kZXYtPmRlc2MtPndhcm1faWRzWzBdOworCWlmIChVU0JfVklEX1RFQ0hOT1RSRU5EID09IGlkLT5pZFZlbmRvcgorCSAgICAmJiBVU0JfUElEX1RFQ0hOT1RSRU5EX0NPTk5FQ1RfUzJfMzY1MF9DSSA9PSBpZC0+aWRQcm9kdWN0KQorCQkvKiBFcnJvciBpZ25vcmVkLiAqLworCQl0dDM2NTBfY2lfaW5pdChhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjdHY0NTJlX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphKQoreworCWlmICghYS0+ZmVfYWRhcFswXS5mZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGR2Yl9hdHRhY2goc3RiNjEwMF9hdHRhY2gsIGEtPmZlX2FkYXBbMF0uZmUsICZzdGI2MTAwX2NvbmZpZywKKwkJCQkJJmEtPmRldi0+aTJjX2FkYXApID09IDApIHsKKwkJZXJyKCIlcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwY3R2NDUyZV91c2JfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRShVU0JfVklEX1BJTk5BQ0xFLCBVU0JfUElEX1BDVFZfNDUyRSl9LAorCXtVU0JfREVWSUNFKFVTQl9WSURfVEVDSE5PVFJFTkQsIFVTQl9QSURfVEVDSE5PVFJFTkRfQ09OTkVDVF9TMl8zNjAwKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9URUNITk9UUkVORCwKKwkJCQlVU0JfUElEX1RFQ0hOT1RSRU5EX0NPTk5FQ1RfUzJfMzY1MF9DSSl9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHBjdHY0NTJlX3VzYl90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBwY3R2NDUyZV9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwgLyogbW9yZSA/ICovCisJLnVzYl9jdHJsID0gREVWSUNFX1NQRUNJRklDLAorCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IHBjdHY0NTJlX3N0YXRlKSwKKworCS5wb3dlcl9jdHJsICAgICAgID0gcGN0djQ1MmVfcG93ZXJfY3RybCwKKworCS5yYy5jb3JlID0geworCQkucmNfY29kZXMJPSBSQ19NQVBfRElCMDcwMF9SQzVfVEFCTEUsCisJCS5hbGxvd2VkX3Byb3Rvcwk9IFJDX1RZUEVfVU5LTk9XTiwKKwkJLnJjX3F1ZXJ5CT0gcGN0djQ1MmVfcmNfcXVlcnksCisJCS5yY19pbnRlcnZhbAk9IDEwMCwKKwl9LAorCisJLm51bV9hZGFwdGVycyAgICAgPSAxLAorCS5hZGFwdGVyID0ge3sKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7eworCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBwY3R2NDUyZV9mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IHBjdHY0NTJlX3R1bmVyX2F0dGFjaCwKKworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSAgICAgPSBVU0JfSVNPQywKKwkJCQkuY291bnQgICAgPSA0LAorCQkJCS5lbmRwb2ludCA9IDB4MDIsCisJCQkJLnUgPSB7CisJCQkJCS5pc29jID0geworCQkJCQkJLmZyYW1lc3BlcnVyYiA9IDQsCisJCQkJCQkuZnJhbWVzaXplICAgID0gOTQwLAorCQkJCQkJLmludGVydmFsICAgICA9IDEKKwkJCQkJfQorCQkJCX0KKwkJCX0sCisJCX0gfSwKKwl9IH0sCisKKwkuaTJjX2FsZ28gPSAmcGN0djQ1MmVfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAxLCAvKiBhbGxvdyBnZW5lcmljZSBydyBmdW5jdGlvbiAqLworCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQl7IC5uYW1lID0gIlBDVFYgSERUViBVU0IiLAorCQkgIC5jb2xkX2lkcyA9IHsgTlVMTCwgTlVMTCB9LCAvKiB0aGlzIGlzIGEgd2FybSBvbmx5IGRldmljZSAqLworCQkgIC53YXJtX2lkcyA9IHsgJnBjdHY0NTJlX3VzYl90YWJsZVswXSwgTlVMTCB9CisJCX0sCisJCXsgMCB9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyB0dF9jb25uZWN0X3MyXzM2MDBfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsIC8qIG1vcmUgPyAqLworCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKKworCS5zaXplX29mX3ByaXYJCT0gc2l6ZW9mKHN0cnVjdCBwY3R2NDUyZV9zdGF0ZSksCisKKwkucG93ZXJfY3RybAkJPSBwY3R2NDUyZV9wb3dlcl9jdHJsLAorCS5yZWFkX21hY19hZGRyZXNzCT0gcGN0djQ1MmVfcmVhZF9tYWNfYWRkcmVzcywKKworCS5yYy5jb3JlID0geworCQkucmNfY29kZXMJPSBSQ19NQVBfVFRfMTUwMCwKKwkJLmFsbG93ZWRfcHJvdG9zCT0gUkNfVFlQRV9VTktOT1dOLAorCQkucmNfcXVlcnkJPSBwY3R2NDUyZV9yY19xdWVyeSwKKwkJLnJjX2ludGVydmFsCT0gMTAwLAorCX0sCisKKwkubnVtX2FkYXB0ZXJzCQk9IDEsCisJLmFkYXB0ZXIgPSB7eworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CisJCQkuZnJvbnRlbmRfYXR0YWNoID0gcGN0djQ1MmVfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCA9IHBjdHY0NTJlX3R1bmVyX2F0dGFjaCwKKworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSA9IFVTQl9JU09DLAorCQkJCS5jb3VudCA9IDcsCisJCQkJLmVuZHBvaW50ID0gMHgwMiwKKwkJCQkudSA9IHsKKwkJCQkJLmlzb2MgPSB7CisJCQkJCQkuZnJhbWVzcGVydXJiID0gNCwKKwkJCQkJCS5mcmFtZXNpemUgPSA5NDAsCisJCQkJCQkuaW50ZXJ2YWwgPSAxCisJCQkJCX0KKwkJCQl9CisJCQl9LAorCisJCX0gfSwKKwl9IH0sCisKKwkuaTJjX2FsZ28gPSAmcGN0djQ1MmVfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAxLCAvKiBhbGxvdyBnZW5lcmljIHJ3IGZ1bmN0aW9uKi8KKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKKwkuZGV2aWNlcyA9IHsKKwkJeyAubmFtZSA9ICJUZWNobm90cmVuZCBUVCBDb25uZWN0IFMyLTM2MDAiLAorCQkgIC5jb2xkX2lkcyA9IHsgTlVMTCwgTlVMTCB9LCAvKiB0aGlzIGlzIGEgd2FybSBvbmx5IGRldmljZSAqLworCQkgIC53YXJtX2lkcyA9IHsgJnBjdHY0NTJlX3VzYl90YWJsZVsxXSwgTlVMTCB9CisJCX0sCisJCXsgLm5hbWUgPSAiVGVjaG5vdHJlbmQgVFQgQ29ubmVjdCBTMi0zNjUwLUNJIiwKKwkJICAuY29sZF9pZHMgPSB7IE5VTEwsIE5VTEwgfSwKKwkJICAud2FybV9pZHMgPSB7ICZwY3R2NDUyZV91c2JfdGFibGVbMl0sIE5VTEwgfQorCQl9LAorCQl7IDAgfSwKKwl9Cit9OworCitzdGF0aWMgdm9pZCBwY3R2NDUyZV91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJdHQzNjUwX2NpX3VuaW5pdChkKTsKKwlkdmJfdXNiX2RldmljZV9leGl0KGludGYpOworfQorCitzdGF0aWMgaW50IHBjdHY0NTJlX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJaWYgKDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmcGN0djQ1MmVfcHJvcGVydGllcywKKwkJCQkJVEhJU19NT0RVTEUsIE5VTEwsIGFkYXB0ZXJfbnIpIHx8CisJICAgIDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmdHRfY29ubmVjdF9zMl8zNjAwX3Byb3BlcnRpZXMsCisJCQkJCVRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHBjdHY0NTJlX3VzYl9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgPSAicGN0djQ1MmUiLAorCS5wcm9iZSAgICAgID0gcGN0djQ1MmVfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gcGN0djQ1MmVfdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlICAgPSBwY3R2NDUyZV91c2JfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY3R2NDUyZV91c2JfaW5pdCh2b2lkKQoreworCWludCByZXQgPSB1c2JfcmVnaXN0ZXIoJnBjdHY0NTJlX3VzYl9kcml2ZXIpOworCWlmIChyZXQpCisJCWVycigiJXM6IHVzYl9yZWdpc3RlciBmYWlsZWQhIEVycm9yICVkIiwgX19GSUxFX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGN0djQ1MmVfdXNiX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmcGN0djQ1MmVfdXNiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBjdHY0NTJlX3VzYl9pbml0KTsKK21vZHVsZV9leGl0KHBjdHY0NTJlX3VzYl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRG9taW5payBLdWhsZW4gPGRrdWhsZW5AZ214Lm5ldD4iKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJlIFdlaWRlbWFubiA8QW5kcmUuV2VpZGVtYW5uQHdlYi5kZT4iKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSC4gU2NoaW1layA8bXNjaGltZWtAZ214LmF0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQaW5uYWNsZSBQQ1RWIEhEVFYgVVNCIERWQiAvIFRUIGNvbm5lY3QgUzItMzYwMCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdGVjaG5pc2F0LXVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdGVjaG5pc2F0LXVzYjIuYwppbmRleCA0NzNiOTVlLi4wOTk4ZmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3RlY2huaXNhdC11c2IyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90ZWNobmlzYXQtdXNiMi5jCkBAIC0yOTIsNyArMjkyLDcgQEAKIHsKIAlzdHJ1Y3QgdGVjaG5pc2F0X3VzYjJfc3RhdGUgKnN0YXRlID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0ZWNobmlzYXRfdXNiMl9zdGF0ZSwgZ3JlZW5fbGVkX3dvcmsud29yayk7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUgPSBzdGF0ZS0+ZGV2LT5hZGFwdGVyWzBdLmZlOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlID0gc3RhdGUtPmRldi0+YWRhcHRlclswXS5mZV9hZGFwWzBdLmZlOwogCiAJaWYgKHN0YXRlLT5wb3dlcl9zdGF0ZSA9PSAwKQogCQlnb3RvIHNjaGVkdWxlOwpAQCAtNTA1LDE0ICs1MDUsMTQgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGEtPmRldi0+dWRldjsKIAlpbnQgcmV0OwogCi0JYS0+ZmUgPSBkdmJfYXR0YWNoKHN0djA5MHhfYXR0YWNoLCAmdGVjaG5pc2F0X3VzYjJfc3R2MDkweF9jb25maWcsCisJYS0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3R2MDkweF9hdHRhY2gsICZ0ZWNobmlzYXRfdXNiMl9zdHYwOTB4X2NvbmZpZywKIAkJCSZhLT5kZXYtPmkyY19hZGFwLCBTVFYwOTB4X0RFTU9EVUxBVE9SXzApOwogCi0JaWYgKGEtPmZlKSB7CisJaWYgKGEtPmZlX2FkYXBbMF0uZmUpIHsKIAkJc3RydWN0IHN0djYxMTB4X2RldmN0bCAqY3RsOwogCiAJCWN0bCA9IGR2Yl9hdHRhY2goc3R2NjExMHhfYXR0YWNoLAotCQkJCWEtPmZlLAorCQkJCWEtPmZlX2FkYXBbMF0uZmUsCiAJCQkJJnRlY2huaXNhdF91c2IyX3N0djYxMTB4X2NvbmZpZywKIAkJCQkmYS0+ZGV2LT5pMmNfYWRhcCk7CiAKQEAgLTUzMiw4ICs1MzIsOCBAQAogCQkJLyogY2FsbCB0aGUgaW5pdCBmdW5jdGlvbiBvbmNlIHRvIGluaXRpYWxpemUKIAkJCSAgIHR1bmVyJ3MgY2xvY2sgb3V0cHV0IGRpdmlkZXIgYW5kIGRlbW9kJ3MKIAkJCSAgIG1hc3RlciBjbG9jayAqLwotCQkJaWYgKGEtPmZlLT5vcHMuaW5pdCkKLQkJCQlhLT5mZS0+b3BzLmluaXQoYS0+ZmUpOworCQkJaWYgKGEtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbml0KQorCQkJCWEtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbml0KGEtPmZlX2FkYXBbMF0uZmUpOwogCiAJCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhLT5kZXYtPmkyY19tdXRleCkgPCAwKQogCQkJCXJldHVybiAtRUFHQUlOOwpAQCAtNTQ4LDIwICs1NDgsMjAgQEAKIAkJCWlmIChyZXQgIT0gMCkKIAkJCQllcnIoImNvdWxkIG5vdCBzZXQgSUZfQ0xLIHRvIGV4dGVybmFsIik7CiAKLQkJCWEtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSB0ZWNobmlzYXRfdXNiMl9zZXRfdm9sdGFnZTsKKwkJCWEtPmZlX2FkYXBbMF0uZmUtPm9wcy5zZXRfdm9sdGFnZSA9IHRlY2huaXNhdF91c2IyX3NldF92b2x0YWdlOwogCiAJCQkvKiBpZiBldmVyeXRoaW5nIHdhcyBzdWNjZXNzZnVsIGFzc2lnbiBhIG5pY2UgbmFtZSB0byB0aGUgZnJvbnRlbmQgKi8KLQkJCXN0cmxjcHkoYS0+ZmUtPm9wcy5pbmZvLm5hbWUsIGEtPmRldi0+ZGVzYy0+bmFtZSwKLQkJCQkJc2l6ZW9mKGEtPmZlLT5vcHMuaW5mby5uYW1lKSk7CisJCQlzdHJsY3B5KGEtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbmZvLm5hbWUsIGEtPmRldi0+ZGVzYy0+bmFtZSwKKwkJCQkJc2l6ZW9mKGEtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbmZvLm5hbWUpKTsKIAkJfSBlbHNlIHsKLQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goYS0+ZmUpOwotCQkJYS0+ZmUgPSBOVUxMOworCQkJZHZiX2Zyb250ZW5kX2RldGFjaChhLT5mZV9hZGFwWzBdLmZlKTsKKwkJCWEtPmZlX2FkYXBbMF0uZmUgPSBOVUxMOwogCQl9CiAJfQogCiAJdGVjaG5pc2F0X3VzYjJfc2V0X2xlZF90aW1lcihhLT5kZXYsIDEsIDEpOwogCi0JcmV0dXJuIGEtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYS0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIC8qIFJlbW90ZSBjb250cm9sICovCkBAIC02OTcsNiArNjk3LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHRlY2huaXNhdF91c2IyX2Zyb250ZW5kX2F0dGFjaCwKIAogCQkJLnN0cmVhbSA9IHsKQEAgLTcxMSw3ICs3MTMsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKLQorCQl9fSwKIAkJCS5zaXplX29mX3ByaXYgPSAwLAogCQl9LAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3R0dXNiMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90dHVzYjIuYwppbmRleCAwZDQ3MDlmLi5lYTRlYWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3R0dXNiMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdHR1c2IyLmMKQEAgLTMwLDE4ICszMCw0MyBAQAogI2luY2x1ZGUgInRkYTgyNnguaCIKICNpbmNsdWRlICJ0ZGExMDA4Ni5oIgogI2luY2x1ZGUgInRkYTEwMDJ4LmgiCisjaW5jbHVkZSAidGRhMTAwNDguaCIKICNpbmNsdWRlICJ0ZGE4Mjd4LmgiCiAjaW5jbHVkZSAibG5icDIxLmgiCisvKiBDQSAqLworI2luY2x1ZGUgImR2Yl9jYV9lbjUwMjIxLmgiCiAKIC8qIGRlYnVnICovCiBzdGF0aWMgaW50IGR2Yl91c2JfdHR1c2IyX2RlYnVnOwogI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSAgIGRwcmludGsoZHZiX3VzYl90dHVzYjJfZGVidWcsMHgwMSxhcmdzKQogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGR2Yl91c2JfdHR1c2IyX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9aW5mbyAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOworc3RhdGljIGludCBkdmJfdXNiX3R0dXNiMl9kZWJ1Z19jaTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19jaSxkdmJfdXNiX3R0dXNiMl9kZWJ1Z19jaSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfY2ksICJzZXQgZGVidWdnaW5nIGNpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOwogCiBEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKIAorI2RlZmluZSBjaV9kYmcoZm9ybWF0LCBhcmcuLi4pICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKGR2Yl91c2JfdHR1c2IyX2RlYnVnX2NpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFZCX1VTQl9MT0dfUFJFRklYIFwKKwkJCSI6ICVzICIgZm9ybWF0ICJcbiIgLCBfX2Z1bmNfXywgIyMgYXJnKTsgICAgICAgXAorfSB3aGlsZSAoMCkKKworZW51bSB7CisJVFQzNjUwX0NNRF9DSV9URVNUID0gMHg0MCwKKwlUVDM2NTBfQ01EX0NJX1JEX0NUUkwsCisJVFQzNjUwX0NNRF9DSV9XUl9DVFJMLAorCVRUMzY1MF9DTURfQ0lfUkRfQVRUUiwKKwlUVDM2NTBfQ01EX0NJX1dSX0FUVFIsCisJVFQzNjUwX0NNRF9DSV9SRVNFVCwKKwlUVDM2NTBfQ01EX0NJX1NFVF9WSURFT19QT1JUCit9OworCiBzdHJ1Y3QgdHR1c2IyX3N0YXRlIHsKKwlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgY2E7CisJc3RydWN0IG11dGV4IGNhX211dGV4OwogCXU4IGlkOwogCXUxNiBsYXN0X3JjX2tleTsKIH07CkBAIC03OCwxMSArMTAzLDI2MCBAQAogCXJldHVybiAwOwogfQogCisvKiBjaSAqLworc3RhdGljIGludCB0dDM2NTBfY2lfbXNnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggY21kLCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IHdyaXRlX2xlbiwgdW5zaWduZWQgaW50IHJlYWRfbGVuKQoreworCWludCByZXQ7CisJdTggcnhbNjBdOy8qICg2NCAtNCkgKi8KKwlyZXQgPSB0dHVzYjJfbXNnKGQsIGNtZCwgZGF0YSwgd3JpdGVfbGVuLCByeCwgcmVhZF9sZW4pOworCWlmICghcmV0KQorCQltZW1jcHkoZGF0YSwgcngsIHJlYWRfbGVuKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9tc2dfbG9ja2VkKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsIHU4IGNtZCwgdTggKmRhdGEsIHVuc2lnbmVkIGludCB3cml0ZV9sZW4sIHVuc2lnbmVkIGludCByZWFkX2xlbikKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBjYS0+ZGF0YTsKKwlzdHJ1Y3QgdHR1c2IyX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnN0YXRlLT5jYV9tdXRleCk7CisJcmV0ID0gdHQzNjUwX2NpX21zZyhkLCBjbWQsIGRhdGEsIHdyaXRlX2xlbiwgcmVhZF9sZW4pOworCW11dGV4X3VubG9jaygmc3RhdGUtPmNhX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3JlYWRfYXR0cmlidXRlX21lbShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCwgaW50IGFkZHJlc3MpCit7CisJdTggYnVmWzNdOworCWludCByZXQgPSAwOworCisJaWYgKHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gKGFkZHJlc3MgPj4gOCkgJiAweDBGOworCWJ1ZlsxXSA9IGFkZHJlc3M7CisKKworCXJldCA9IHR0MzY1MF9jaV9tc2dfbG9ja2VkKGNhLCBUVDM2NTBfQ01EX0NJX1JEX0FUVFIsIGJ1ZiwgMiwgMyk7CisKKwljaV9kYmcoIiUwNHggLT4gJWQgMHglMDJ4IiwgYWRkcmVzcywgcmV0LCBidWZbMl0pOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYnVmWzJdOworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV93cml0ZV9hdHRyaWJ1dGVfbWVtKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsIGludCBzbG90LCBpbnQgYWRkcmVzcywgdTggdmFsdWUpCit7CisJdTggYnVmWzNdOworCisJY2lfZGJnKCIlZCAweCUwNHggMHglMDJ4Iiwgc2xvdCwgYWRkcmVzcywgdmFsdWUpOworCisJaWYgKHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gKGFkZHJlc3MgPj4gOCkgJiAweDBGOworCWJ1ZlsxXSA9IGFkZHJlc3M7CisJYnVmWzJdID0gdmFsdWU7CisKKwlyZXR1cm4gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfV1JfQVRUUiwgYnVmLCAzLCAzKTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfcmVhZF9jYW1fY29udHJvbChzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCwgdTggYWRkcmVzcykKK3sKKwl1OCBidWZbMl07CisJaW50IHJldDsKKworCWlmIChzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IGFkZHJlc3MgJiAzOworCisJcmV0ID0gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfUkRfQ1RSTCwgYnVmLCAxLCAyKTsKKworCWNpX2RiZygiMHglMDJ4IC0+ICVkIDB4JTAyeCIsIGFkZHJlc3MsIHJldCwgYnVmWzFdKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGJ1ZlsxXTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfd3JpdGVfY2FtX2NvbnRyb2woc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QsIHU4IGFkZHJlc3MsIHU4IHZhbHVlKQoreworCXU4IGJ1ZlsyXTsKKworCWNpX2RiZygiJWQgMHglMDJ4IDB4JTAyeCIsIHNsb3QsIGFkZHJlc3MsIHZhbHVlKTsKKworCWlmIChzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IGFkZHJlc3M7CisJYnVmWzFdID0gdmFsdWU7CisKKwlyZXR1cm4gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfV1JfQ1RSTCwgYnVmLCAyLCAyKTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfc2V0X3ZpZGVvX3BvcnQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QsIGludCBlbmFibGUpCit7CisJdTggYnVmWzFdOworCWludCByZXQ7CisKKwljaV9kYmcoIiVkICVkIiwgc2xvdCwgZW5hYmxlKTsKKworCWlmIChzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IGVuYWJsZTsKKworCXJldCA9IHR0MzY1MF9jaV9tc2dfbG9ja2VkKGNhLCBUVDM2NTBfQ01EX0NJX1NFVF9WSURFT19QT1JULCBidWYsIDEsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGVuYWJsZSAhPSBidWZbMF0pIHsKKwkJZXJyKCJDSSBub3QgJXNhYmxlZC4iLCBlbmFibGUgPyAiZW4iIDogImRpcyIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfc2xvdF9zaHV0ZG93bihzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCkKK3sKKwlyZXR1cm4gdHQzNjUwX2NpX3NldF92aWRlb19wb3J0KGNhLCBzbG90LCAwKTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfc2xvdF90c19lbmFibGUoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QpCit7CisJcmV0dXJuIHR0MzY1MF9jaV9zZXRfdmlkZW9fcG9ydChjYSwgc2xvdCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3Nsb3RfcmVzZXQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gY2EtPmRhdGE7CisJc3RydWN0IHR0dXNiMl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCXU4IGJ1ZlsxXTsKKwlpbnQgcmV0OworCisJY2lfZGJnKCIlZCIsIHNsb3QpOworCisJaWYgKHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gMDsKKworCW11dGV4X2xvY2soJnN0YXRlLT5jYV9tdXRleCk7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIFRUMzY1MF9DTURfQ0lfUkVTRVQsIGJ1ZiwgMSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwltc2xlZXAoNTAwKTsKKworCWJ1ZlswXSA9IDE7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIFRUMzY1MF9DTURfQ0lfUkVTRVQsIGJ1ZiwgMSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwltc2xlZXAoNTAwKTsKKworCWJ1ZlswXSA9IDA7IC8qIEZUQSAqLworCisJcmV0ID0gdHQzNjUwX2NpX21zZyhkLCBUVDM2NTBfQ01EX0NJX1NFVF9WSURFT19QT1JULCBidWYsIDEsIDEpOworCisJbXNsZWVwKDExMDApOworCisgZmFpbGVkOgorCW11dGV4X3VubG9jaygmc3RhdGUtPmNhX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3BvbGxfc2xvdF9zdGF0dXMoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QsIGludCBvcGVuKQoreworCXU4IGJ1ZlsxXTsKKwlpbnQgcmV0OworCisJaWYgKHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfVEVTVCwgYnVmLCAwLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKDEgPT0gYnVmWzBdKSB7CisJCXJldHVybiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UIHwKKwkJCURWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1JFQURZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHQzNjUwX2NpX3VuaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJc3RydWN0IHR0dXNiMl9zdGF0ZSAqc3RhdGU7CisKKwljaV9kYmcoIiIpOworCisJaWYgKE5VTEwgPT0gZCkKKwkJcmV0dXJuOworCisJc3RhdGUgPSBkLT5wcml2OworCWlmIChOVUxMID09IHN0YXRlKQorCQlyZXR1cm47CisKKwlpZiAoTlVMTCA9PSBzdGF0ZS0+Y2EuZGF0YSkKKwkJcmV0dXJuOworCisJZHZiX2NhX2VuNTAyMjFfcmVsZWFzZSgmc3RhdGUtPmNhKTsKKworCW1lbXNldCgmc3RhdGUtPmNhLCAwLCBzaXplb2Yoc3RhdGUtPmNhKSk7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX2luaXQoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhLT5kZXY7CisJc3RydWN0IHR0dXNiMl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCWludCByZXQ7CisKKwljaV9kYmcoIiIpOworCisJbXV0ZXhfaW5pdCgmc3RhdGUtPmNhX211dGV4KTsKKworCXN0YXRlLT5jYS5vd25lciA9IFRISVNfTU9EVUxFOworCXN0YXRlLT5jYS5yZWFkX2F0dHJpYnV0ZV9tZW0gPSB0dDM2NTBfY2lfcmVhZF9hdHRyaWJ1dGVfbWVtOworCXN0YXRlLT5jYS53cml0ZV9hdHRyaWJ1dGVfbWVtID0gdHQzNjUwX2NpX3dyaXRlX2F0dHJpYnV0ZV9tZW07CisJc3RhdGUtPmNhLnJlYWRfY2FtX2NvbnRyb2wgPSB0dDM2NTBfY2lfcmVhZF9jYW1fY29udHJvbDsKKwlzdGF0ZS0+Y2Eud3JpdGVfY2FtX2NvbnRyb2wgPSB0dDM2NTBfY2lfd3JpdGVfY2FtX2NvbnRyb2w7CisJc3RhdGUtPmNhLnNsb3RfcmVzZXQgPSB0dDM2NTBfY2lfc2xvdF9yZXNldDsKKwlzdGF0ZS0+Y2Euc2xvdF9zaHV0ZG93biA9IHR0MzY1MF9jaV9zbG90X3NodXRkb3duOworCXN0YXRlLT5jYS5zbG90X3RzX2VuYWJsZSA9IHR0MzY1MF9jaV9zbG90X3RzX2VuYWJsZTsKKwlzdGF0ZS0+Y2EucG9sbF9zbG90X3N0YXR1cyA9IHR0MzY1MF9jaV9wb2xsX3Nsb3Rfc3RhdHVzOworCXN0YXRlLT5jYS5kYXRhID0gZDsKKworCXJldCA9IGR2Yl9jYV9lbjUwMjIxX2luaXQoJmEtPmR2Yl9hZGFwLAorCQkJCSAgJnN0YXRlLT5jYSwKKwkJCQkgIC8qIGZsYWdzICovIDAsCisJCQkJICAvKiBuX3Nsb3RzICovIDEpOworCWlmIChyZXQpIHsKKwkJZXJyKCJDYW5ub3QgaW5pdGlhbGl6ZSBDSTogRXJyb3IgJWQuIiwgcmV0KTsKKwkJbWVtc2V0KCZzdGF0ZS0+Y2EsIDAsIHNpemVvZihzdGF0ZS0+Y2EpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvKCJDSSBpbml0aWFsaXplZC4iKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHR0dXNiMl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgbXNnW10saW50IG51bSkKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOwogCXN0YXRpYyB1OCBvYnVmWzYwXSwgaWJ1Zls2MF07Ci0JaW50IGkscmVhZDsKKwlpbnQgaSwgd3JpdGVfcmVhZCwgcmVhZDsKIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQogCQlyZXR1cm4gLUVBR0FJTjsKQEAgLTkxLDI4ICszNjUsMzUgQEAKIAkJd2FybigibW9yZSB0aGFuIDIgaTJjIG1lc3NhZ2VzIGF0IGEgdGltZSBpcyBub3QgaGFuZGxlZCB5ZXQuIFRPRE8uIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJcmVhZCA9IGkrMSA8IG51bSAmJiAobXNnW2krMV0uZmxhZ3MgJiBJMkNfTV9SRCk7CisJCXdyaXRlX3JlYWQgPSBpKzEgPCBudW0gJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpOworCQlyZWFkID0gbXNnW2ldLmZsYWdzICYgSTJDX01fUkQ7CiAKLQkJb2J1ZlswXSA9IChtc2dbaV0uYWRkciA8PCAxKSB8IHJlYWQ7Ci0JCW9idWZbMV0gPSBtc2dbaV0ubGVuOworCQlvYnVmWzBdID0gKG1zZ1tpXS5hZGRyIDw8IDEpIHwgKHdyaXRlX3JlYWQgfCByZWFkKTsKKwkJaWYgKHJlYWQpCisJCQlvYnVmWzFdID0gMDsKKwkJZWxzZQorCQkJb2J1ZlsxXSA9IG1zZ1tpXS5sZW47CiAKIAkJLyogcmVhZCByZXF1ZXN0ICovCi0JCWlmIChyZWFkKQorCQlpZiAod3JpdGVfcmVhZCkKIAkJCW9idWZbMl0gPSBtc2dbaSsxXS5sZW47CisJCWVsc2UgaWYgKHJlYWQpCisJCQlvYnVmWzJdID0gbXNnW2ldLmxlbjsKIAkJZWxzZQogCQkJb2J1ZlsyXSA9IDA7CiAKLQkJbWVtY3B5KCZvYnVmWzNdLG1zZ1tpXS5idWYsbXNnW2ldLmxlbik7CisJCW1lbWNweSgmb2J1ZlszXSwgbXNnW2ldLmJ1ZiwgbXNnW2ldLmxlbik7CiAKIAkJaWYgKHR0dXNiMl9tc2coZCwgQ01EX0kyQ19YRkVSLCBvYnVmLCBtc2dbaV0ubGVuKzMsIGlidWYsIG9idWZbMl0gKyAzKSA8IDApIHsKIAkJCWVycigiaTJjIHRyYW5zZmVyIGZhaWxlZC4iKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHJlYWQpIHsKLQkJCW1lbWNweShtc2dbaSsxXS5idWYsJmlidWZbM10sbXNnW2krMV0ubGVuKTsKKwkJaWYgKHdyaXRlX3JlYWQpIHsKKwkJCW1lbWNweShtc2dbaSsxXS5idWYsICZpYnVmWzNdLCBtc2dbaSsxXS5sZW4pOwogCQkJaSsrOwotCQl9CisJCX0gZWxzZSBpZiAocmVhZCkKKwkJCW1lbWNweShtc2dbaV0uYnVmLCAmaWJ1ZlszXSwgbXNnW2ldLmxlbik7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOwpAQCAtMTkwLDEyICs0NzEsMzEgQEAKIAkuZGVsdGFmID0gMHhhNTExLAogfTsKIAorc3RhdGljIHN0cnVjdCB0ZGExMDA0OF9jb25maWcgdGRhMTAwNDhfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzICAgID0gMHgxMCA+PiAxLAorCS5vdXRwdXRfbW9kZSAgICAgID0gVERBMTAwNDhfUEFSQUxMRUxfT1VUUFVULAorCS5pbnZlcnNpb24gICAgICAgID0gVERBMTAwNDhfSU5WRVJTSU9OX09OLAorCS5kdHY2X2lmX2ZyZXFfa2h6ID0gVERBMTAwNDhfSUZfNDAwMCwKKwkuZHR2N19pZl9mcmVxX2toeiA9IFREQTEwMDQ4X0lGXzQ1MDAsCisJLmR0djhfaWZfZnJlcV9raHogPSBUREExMDA0OF9JRl81MDAwLAorCS5jbGtfZnJlcV9raHogICAgID0gVERBMTAwNDhfQ0xLXzE2MDAwLAorCS5ub19maXJtd2FyZSAgICAgID0gMSwKKwkuc2V0X3BsbCAgICAgICAgICA9IHRydWUgLAorCS5wbGxfbSAgICAgICAgICAgID0gNSwKKwkucGxsX24gICAgICAgICAgICA9IDMsCisJLnBsbF9wICAgICAgICAgICAgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCB0ZGE4Mjd4X2NvbmZpZyB0ZGE4Mjd4X2NvbmZpZyA9IHsKKwkuY29uZmlnID0gMCwKK307CisKIHN0YXRpYyBpbnQgdHR1c2IyX2Zyb250ZW5kX3RkYTEwMDg2X2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCWlmICh1c2Jfc2V0X2ludGVyZmFjZShhZGFwLT5kZXYtPnVkZXYsMCwzKSA8IDApCiAJCWVycigic2V0IGludGVyZmFjZSB0byBhbHRzPTMgZmFpbGVkIik7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA4Nl9hdHRhY2gsICZ0ZGExMDA4Nl9jb25maWcsICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgPT0gTlVMTCkgeworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwODZfYXR0YWNoLCAmdGRhMTAwODZfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpIHsKIAkJZGViX2luZm8oIlREQTEwMDg2IGF0dGFjaCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yMDMsMjAgKzUwMyw1NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHR0dXNiMl9jdDM2NTBfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMuaTJjX2dhdGVfY3RybChhZGFwLT5mZV9hZGFwWzBdLmZlLCBlbmFibGUpOworfQorCiBzdGF0aWMgaW50IHR0dXNiMl9mcm9udGVuZF90ZGExMDAyM19hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlpZiAodXNiX3NldF9pbnRlcmZhY2UoYWRhcC0+ZGV2LT51ZGV2LCAwLCAzKSA8IDApCiAJCWVycigic2V0IGludGVyZmFjZSB0byBhbHRzPTMgZmFpbGVkIik7Ci0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2godGRhMTAwMjNfYXR0YWNoLCAmdGRhMTAwMjNfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCkpID09IE5VTEwpIHsKLQkJZGViX2luZm8oIlREQTEwMDIzIGF0dGFjaCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpIHsKKwkJLyogRkUgMCBEVkItQyAqLworCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaCh0ZGExMDAyM19hdHRhY2gsCisJCQkmdGRhMTAwMjNfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCk7CisKKwkJaWYgKGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkgeworCQkJZGViX2luZm8oIlREQTEwMDIzIGF0dGFjaCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJdHQzNjUwX2NpX2luaXQoYWRhcCk7CisJfSBlbHNlIHsKKwkJYWRhcC0+ZmVfYWRhcFsxXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwNDhfYXR0YWNoLAorCQkJJnRkYTEwMDQ4X2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCisJCWlmIChhZGFwLT5mZV9hZGFwWzFdLmZlID09IE5VTEwpIHsKKwkJCWRlYl9pbmZvKCJUREExMDA0OCBhdHRhY2ggZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJLyogdHVuZXIgaXMgYmVoaW5kIFREQTEwMDIzIEkyQy1nYXRlICovCisJCWFkYXAtPmZlX2FkYXBbMV0uZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gdHR1c2IyX2N0MzY1MF9pMmNfZ2F0ZV9jdHJsOworCiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdHR1c2IyX3R1bmVyX3RkYTgyN3hfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JaWYgKGR2Yl9hdHRhY2godGRhODI3eF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgTlVMTCkgPT0gTlVMTCkgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCisJLyogTUZFOiBzZWxlY3QgY29ycmVjdCBGRSB0byBhdHRhY2ggdHVuZXIgc2luY2UgdGhhdCdzIGNhbGxlZCB0d2ljZSAqLworCWlmIChhZGFwLT5mZV9hZGFwWzFdLmZlID09IE5VTEwpCisJCWZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZTsKKwllbHNlCisJCWZlID0gYWRhcC0+ZmVfYWRhcFsxXS5mZTsKKworCS8qIGF0dGFjaCB0dW5lciAqLworCWlmIChkdmJfYXR0YWNoKHRkYTgyN3hfYXR0YWNoLCBmZSwgMHg2MSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsICZ0ZGE4Mjd4X2NvbmZpZykgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyB0ZGE4Mjd4IGZvdW5kIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yMjUsMTIgKzU2MiwxMiBAQAogCiBzdGF0aWMgaW50IHR0dXNiMl90dW5lcl90ZGE4MjZ4X2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWlmIChkdmJfYXR0YWNoKHRkYTgyNnhfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDApID09IE5VTEwpIHsKKwlpZiAoZHZiX2F0dGFjaCh0ZGE4MjZ4X2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDApID09IE5VTEwpIHsKIAkJZGViX2luZm8oIlREQTgyNjMgYXR0YWNoIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChkdmJfYXR0YWNoKGxuYnAyMV9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMCwgMCkgPT0gTlVMTCkgeworCWlmIChkdmJfYXR0YWNoKGxuYnAyMV9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAwLCAwKSA9PSBOVUxMKSB7CiAJCWRlYl9pbmZvKCJMTkJQMjEgYXR0YWNoIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTI0Miw2ICs1NzksMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyB0dHVzYjJfcHJvcGVydGllc19zMjQwMDsKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyB0dHVzYjJfcHJvcGVydGllc19jdDM2NTA7CiAKK3N0YXRpYyB2b2lkIHR0dXNiMl91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJdHQzNjUwX2NpX3VuaW5pdChkKTsKKwlkdmJfdXNiX2RldmljZV9leGl0KGludGYpOworfQorCiBzdGF0aWMgaW50IHR0dXNiMl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewpAQCAtMjc3LDYgKzYyMiw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBOVUxMLCAvLyB0dHVzYjJfc3RyZWFtaW5nX2N0cmwsCiAKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gdHR1c2IyX2Zyb250ZW5kX3RkYTEwMDg2X2F0dGFjaCwKQEAgLTI5NSw2ICs2NDIsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQorCQl9fSwKIAkJfQogCX0sCiAKQEAgLTMyOSw2ICs2NzcsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gTlVMTCwKIAogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB0dHVzYjJfZnJvbnRlbmRfdGRhMTAwODZfYXR0YWNoLApAQCAtMzQ3LDYgKzY5Nyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9CisJCX19LAogCQl9CiAJfSwKIApAQCAtMzgzLDYgKzczNCw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAyLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBOVUxMLAogCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHR0dXNiMl9mcm9udGVuZF90ZGExMDAyM19hdHRhY2gsCkBAIC00MDEsNiArNzU0LDI2IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9CisJCX0sIHsKKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gTlVMTCwKKworCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB0dHVzYjJfZnJvbnRlbmRfdGRhMTAwMjNfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCA9IHR0dXNiMl90dW5lcl90ZGE4Mjd4X2F0dGFjaCwKKworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSA9IFVTQl9JU09DLAorCQkJCS5jb3VudCA9IDUsCisJCQkJLmVuZHBvaW50ID0gMHgwMiwKKwkJCQkudSA9IHsKKwkJCQkJLmlzb2MgPSB7CisJCQkJCQkuZnJhbWVzcGVydXJiID0gNCwKKwkJCQkJCS5mcmFtZXNpemUgPSA5NDAsCisJCQkJCQkuaW50ZXJ2YWwgPSAxLAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC00MjIsNyArNzk1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB0dHVzYjJfZHJpdmVyID0gewogCS5uYW1lCQk9ICJkdmJfdXNiX3R0dXNiMiIsCiAJLnByb2JlCQk9IHR0dXNiMl9wcm9iZSwKLQkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCisJLmRpc2Nvbm5lY3QJPSB0dHVzYjJfdXNiX2Rpc2Nvbm5lY3QsCiAJLmlkX3RhYmxlCT0gdHR1c2IyX3RhYmxlLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYwppbmRleCAxMThhYWIxLi40NjM2NzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYwpAQCAtNjAsMTQgKzYwLDE0IEBACiAJdW10X2NvbmZpZy5kZW1vZF9pbml0ID0gdW10X210MzUyX2RlbW9kX2luaXQ7CiAJdW10X2NvbmZpZy5kZW1vZF9hZGRyZXNzID0gMHhmOwogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwgJnVtdF9jb25maWcsICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZ1bXRfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1bXRfdHVuZXJfYXR0YWNoIChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCBOVUxMLCBEVkJfUExMX1RVQTYwMzQpOworCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIDB4NjEsIE5VTEwsIERWQl9QTExfVFVBNjAzNCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMCw2ICsxMDAsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB1bXRfbXQzNTJfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSB1bXRfdHVuZXJfYXR0YWNoLApAQCAtMTE1LDcgKzExNyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAotCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAJCX0KIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91c2ItdXJiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VzYi11cmIuYwppbmRleCA4NmQ2ODkzLi5kNjJlZTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VzYi11cmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VzYi11cmIuYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCWlmICghc3RyZWFtLT51cmJfbGlzdFtpXSkgewogCQkJZGViX21lbSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHVyYl9hbGxvY191cmIhLlxuIik7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCXVzYl9mcmVlX3VyYihzdHJlYW0tPnVyYl9saXN0W2ldKTsKKwkJCQl1c2JfZnJlZV91cmIoc3RyZWFtLT51cmJfbGlzdFtqXSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQl1c2JfZmlsbF9idWxrX3VyYiggc3RyZWFtLT51cmJfbGlzdFtpXSwgc3RyZWFtLT51ZGV2LApAQCAtMTgxLDcgKzE4MSw3IEBACiAJCWlmICghc3RyZWFtLT51cmJfbGlzdFtpXSkgewogCQkJZGViX21lbSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHVyYl9hbGxvY191cmIhXG4iKTsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJdXNiX2ZyZWVfdXJiKHN0cmVhbS0+dXJiX2xpc3RbaV0pOworCQkJCXVzYl9mcmVlX3VyYihzdHJlYW0tPnVyYl9saXN0W2pdKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5jCmluZGV4IDU0MzU1ZjguLjQ1ZTMxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguYwpAQCAtMzIwLDcgKzMyMCw3IEBACiAKIAl2cDcwMnhfaW5pdF9waWRfZmlsdGVyKGFkYXApOwogCi0JYWRhcC0+ZmUgPSB2cDcwMnhfZmVfYXR0YWNoKGFkYXAtPmRldik7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IHZwNzAyeF9mZV9hdHRhY2goYWRhcC0+ZGV2KTsKIAl2cDcwMnhfdXNiX291dF9vcChhZGFwLT5kZXYsIFNFVF9UVU5FUl9QT1dFUl9SRVEsIDEsIDcsIE5VTEwsIDApOwogCiAJcmV0dXJuIDA7CkBAIC0zODMsNiArMzgzLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyAgICAgICAgICAgICA9IERWQl9VU0JfQURBUF9SRUNFSVZFU18yMDRfQllURV9UUywKIAogCQkJLnN0cmVhbWluZ19jdHJsICAgPSB2cDcwMnhfc3RyZWFtaW5nX2N0cmwsCkBAIC0zOTksNiArNDAxLDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IHZwNzAyeF9hZGFwdGVyX3N0YXRlKSwKIAkJfQogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYwppbmRleCA1MzZjMTZjLi45MDg3M2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogLyoJRHVtcCB0aGUgRUVQUk9NICovCiAvKgl2cDcwNDVfcmVhZF9lZXByb20oZCxidWYsIDI1NSwgRlgyX0lEX0FERFIpOyAqLwogCi0JYWRhcC0+ZmUgPSB2cDcwNDVfZmVfYXR0YWNoKGFkYXAtPmRldik7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IHZwNzA0NV9mZV9hdHRhY2goYWRhcC0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQ1LDYgKzI0NSw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB2cDcwNDVfZnJvbnRlbmRfYXR0YWNoLAogCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCQkJLnN0cmVhbSA9IHsKQEAgLTI1Nyw2ICsyNTksNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5wb3dlcl9jdHJsICAgICAgID0gdnA3MDQ1X3Bvd2VyX2N0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCmluZGV4IDMyZTA4ZTMuLjRhMmQyZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCkBAIC0yMzYsNiArMjM2LDEzIEBACiAJICBBIERWQi1TL0RTUyBEaXJlY3QgQ29udmVyc2lvbiByZXZlaXZlci4KIAkgIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX1REQTEwMDcxCisJdHJpc3RhdGUgIk5YUCBUREExMDA3MSIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGNvbW1lbnQgIkRWQi1UICh0ZXJyZXN0cmlhbCkgZnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIApAQCAtNjAwLDYgKzYwNywxNiBAQAogCWhlbHAKIAkgIEFuIFNFQyBjb250cm9sIGNoaXBzLgogCitjb25maWcgRFZCX0xOQlAyMgorCXRyaXN0YXRlICJMTkJQMjIgU0VDIGNvbnRyb2xsZXJzIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBMTkIgcG93ZXIgc3VwcGx5IGFuZCBjb250cm9sIHZvbHRhZ2UKKwkgIHJlZ3VsYXRvciBjaGlwIHdpdGggc3RlcC11cCBjb252ZXJ0ZXIKKwkgIGFuZCBJMkMgaW50ZXJmYWNlLgorCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgY2hpcC4KKwogY29uZmlnIERWQl9JU0w2NDA1CiAJdHJpc3RhdGUgIklTTDY0MDUgU0VDIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKQEAgLTYyMSw2ICs2MzgsMTEgQEAKIAloZWxwCiAJICBBIFNFQyBjb250cm9sbGVyIGNoaXAgZnJvbSBJbnRlcnNpbAogCitjb25maWcgRFZCX0E4MjkzCisJdHJpc3RhdGUgIkFsbGVncm8gQTgyOTMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCiBjb25maWcgRFZCX0xHUzhHTDUKIAl0cmlzdGF0ZSAiU2lsaWNvbiBMZWdlbmQgTEdTLThHTDUgZGVtb2R1bGF0b3IgKE9GRE0pIgogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCkBAIC02NjEsNiArNjgzLDE0IEBACiAJaGVscAogCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX0lUOTEzWF9GRQorCXRyaXN0YXRlICJpdDkxM3ggZnJvbnRlbmQgYW5kIGl0OTEzNyB0dW5lciIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgQSBEVkItVCB0dW5lciBtb2R1bGUuCisJICBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KKwogY29tbWVudCAiVG9vbHMgdG8gZGV2ZWxvcCBuZXcgZnJvbnRlbmRzIgogCiBjb25maWcgRFZCX0RVTU1ZX0ZFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKaW5kZXggNmE2YmEwNS4uZjYzOWY2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQpAQCAtMiw4ICsyLDggQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBrZXJuZWwgRFZCIGZyb250ZW5kIGRldmljZSBkcml2ZXJzLgogIwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzLwogCiBzdGIwODk5LW9ianMgPSBzdGIwODk5X2Rydi5vIHN0YjA4OTlfYWxnby5vCiBzdHYwOTAwLW9ianMgPSBzdHYwOTAwX2NvcmUubyBzdHYwOTAwX3N3Lm8KQEAgLTUyLDYgKzUyLDcgQEAKIG9iai0kKENPTkZJR19EVkJfTEdEVDMzMDUpICs9IGxnZHQzMzA1Lm8KIG9iai0kKENPTkZJR19EVkJfQ1gyNDEyMykgKz0gY3gyNDEyMy5vCiBvYmotJChDT05GSUdfRFZCX0xOQlAyMSkgKz0gbG5icDIxLm8KK29iai0kKENPTkZJR19EVkJfTE5CUDIyKSArPSBsbmJwMjIubwogb2JqLSQoQ09ORklHX0RWQl9JU0w2NDA1KSArPSBpc2w2NDA1Lm8KIG9iai0kKENPTkZJR19EVkJfSVNMNjQyMSkgKz0gaXNsNjQyMS5vCiBvYmotJChDT05GSUdfRFZCX1REQTEwMDg2KSArPSB0ZGExMDA4Ni5vCkBAIC05MSw0ICs5Miw3IEBACiBvYmotJChDT05GSUdfRFZCX0NYRDI4MjBSKSArPSBjeGQyODIwci5vCiBvYmotJChDT05GSUdfRFZCX0RSWEspICs9IGRyeGsubwogb2JqLSQoQ09ORklHX0RWQl9UREExODI3MUMyREQpICs9IHRkYTE4MjcxYzJkZC5vCitvYmotJChDT05GSUdfRFZCX0lUOTEzWF9GRSkgKz0gaXQ5MTN4LWZlLm8KK29iai0kKENPTkZJR19EVkJfQTgyOTMpICs9IGE4MjkzLm8KK29iai0kKENPTkZJR19EVkJfVERBMTAwNzEpICs9IHRkYTEwMDcxLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2E4MjkzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYTgyOTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjU2NDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2E4MjkzLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBBbGxlZ3JvIEE4MjkzIFNFQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiYTgyOTMuaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworI2RlZmluZSBMT0dfUFJFRklYICJhODI5MyIKKworI3VuZGVmIGRiZworI2RlZmluZSBkYmcoZiwgYXJnLi4uKSBcCisJaWYgKGRlYnVnKSBcCisJCXByaW50ayhLRVJOX0lORk8gICBMT0dfUFJFRklYIjogIiBmICJcbiIgLCAjIyBhcmcpCisjdW5kZWYgZXJyCisjZGVmaW5lIGVycihmLCBhcmcuLi4pICBwcmludGsoS0VSTl9FUlIgICAgIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKKyN1bmRlZiBpbmZvCisjZGVmaW5lIGluZm8oZiwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICAgIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKKyN1bmRlZiB3YXJuCisjZGVmaW5lIHdhcm4oZiwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKKworCitzdHJ1Y3QgYTgyOTNfcHJpdiB7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJY29uc3Qgc3RydWN0IGE4MjkzX2NvbmZpZyAqY2ZnOworCXU4IHJlZ1syXTsKK307CisKK3N0YXRpYyBpbnQgYTgyOTNfaTJjKHN0cnVjdCBhODI5M19wcml2ICpwcml2LCB1OCAqdmFsLCBpbnQgbGVuLCBib29sIHJkKQoreworCWludCByZXQ7CisJc3RydWN0IGkyY19tc2cgbXNnWzFdID0geworCQl7CisJCQkuYWRkciA9IHByaXYtPmNmZy0+aTJjX2FkZHIsCisJCQkubGVuID0gbGVuLAorCQkJLmJ1ZiA9IHZhbCwKKwkJfQorCX07CisKKwlpZiAocmQpCisJCW1zZ1swXS5mbGFncyA9IEkyQ19NX1JEOworCWVsc2UKKwkJbXNnWzBdLmZsYWdzID0gMDsKKworCXJldCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsIG1zZywgMSk7CisJaWYgKHJldCA9PSAxKSB7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJd2FybigiaTJjIGZhaWxlZD0lZCByZD0lZCIsIHJldCwgcmQpOworCQlyZXQgPSAtRVJFTU9URUlPOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYTgyOTNfd3Ioc3RydWN0IGE4MjkzX3ByaXYgKnByaXYsIHU4ICp2YWwsIGludCBsZW4pCit7CisJcmV0dXJuIGE4MjkzX2kyYyhwcml2LCB2YWwsIGxlbiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYTgyOTNfcmQoc3RydWN0IGE4MjkzX3ByaXYgKnByaXYsIHU4ICp2YWwsIGludCBsZW4pCit7CisJcmV0dXJuIGE4MjkzX2kyYyhwcml2LCB2YWwsIGxlbiwgMSk7Cit9CisKK3N0YXRpYyBpbnQgYTgyOTNfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJZmVfc2VjX3ZvbHRhZ2VfdCBmZV9zZWNfdm9sdGFnZSkKK3sKKwlzdHJ1Y3QgYTgyOTNfcHJpdiAqcHJpdiA9IGZlLT5zZWNfcHJpdjsKKwlpbnQgcmV0OworCisJZGJnKCIlczogZmVfc2VjX3ZvbHRhZ2U9JWQiLCBfX2Z1bmNfXywgZmVfc2VjX3ZvbHRhZ2UpOworCisJc3dpdGNoIChmZV9zZWNfdm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQkvKiBFTkI9MCAqLworCQlwcml2LT5yZWdbMF0gPSAweDEwOworCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFXzEzOgorCQkvKiBWU0VMMD0xLCBWU0VMMT0wLCBWU0VMMj0wLCBWU0VMMz0wLCBFTkI9MSovCisJCXByaXYtPnJlZ1swXSA9IDB4MzE7CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCS8qIFZTRUwwPTAsIFZTRUwxPTAsIFZTRUwyPTAsIFZTRUwzPTEsIEVOQj0xKi8KKwkJcHJpdi0+cmVnWzBdID0gMHgzODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfTsKKworCXJldCA9IGE4MjkzX3dyKHByaXYsICZwcml2LT5yZWdbMF0sIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIHJldDsKK2VycjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhODI5M19yZWxlYXNlX3NlYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlkYmcoIiVzOiIsIF9fZnVuY19fKTsKKworCWE4MjkzX3NldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV9PRkYpOworCisJa2ZyZWUoZmUtPnNlY19wcml2KTsKKwlmZS0+c2VjX3ByaXYgPSBOVUxMOworfQorCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICphODI5M19hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGkyY19hZGFwdGVyICppMmMsIGNvbnN0IHN0cnVjdCBhODI5M19jb25maWcgKmNmZykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhODI5M19wcml2ICpwcml2ID0gTlVMTDsKKwl1OCBidWZbMl07CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBwcml2ICovCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhODI5M19wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBzZXR1cCB0aGUgcHJpdiAqLworCXByaXYtPmkyYyA9IGkyYzsKKwlwcml2LT5jZmcgPSBjZmc7CisJZmUtPnNlY19wcml2ID0gcHJpdjsKKworCS8qIGNoZWNrIGlmIHRoZSBTRUMgaXMgdGhlcmUgKi8KKwlyZXQgPSBhODI5M19yZChwcml2LCBidWYsIDIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJLyogRU5CPTAgKi8KKwlwcml2LT5yZWdbMF0gPSAweDEwOworCXJldCA9IGE4MjkzX3dyKHByaXYsICZwcml2LT5yZWdbMV0sIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJLyogVE1PREU9MCwgVEdBVEU9MSAqLworCXByaXYtPnJlZ1sxXSA9IDB4ODI7CisJcmV0ID0gYTgyOTNfd3IocHJpdiwgJnByaXYtPnJlZ1sxXSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlpbmZvKCJBbGxlZ3JvIEE4MjkzIFNFQyBhdHRhY2hlZC4iKTsKKworCWZlLT5vcHMucmVsZWFzZV9zZWMgPSBhODI5M19yZWxlYXNlX3NlYzsKKworCS8qIG92ZXJyaWRlIGZyb250ZW5kIG9wcyAqLworCWZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBhODI5M19zZXRfdm9sdGFnZTsKKworCXJldHVybiBmZTsKK2VycjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woYTgyOTNfYXR0YWNoKTsKKworTU9EVUxFX0FVVEhPUigiQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFsbGVncm8gQTgyOTMgU0VDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2E4MjkzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYTgyOTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI5ZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2E4MjkzLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIEFsbGVncm8gQTgyOTMgU0VDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgQTgyOTNfSAorI2RlZmluZSBBODI5M19ICisKK3N0cnVjdCBhODI5M19jb25maWcgeworCXU4IGkyY19hZGRyOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9BODI5MykgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfQTgyOTNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqYTgyOTNfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBjb25zdCBzdHJ1Y3QgYTgyOTNfY29uZmlnICpjZmcpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqYTgyOTNfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBjb25zdCBzdHJ1Y3QgYTgyOTNfY29uZmlnICpjZmcpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEE4MjkzX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwci5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKaW5kZXggMjkwNjU4Mi4uMDNjYWI3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKQEAgLTkzLDkgKzkzLDYgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZQogKTsKLWV4dGVybiBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmN4ZDI4MjByX2dldF90dW5lcl9pMmNfYWRhcHRlcigKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZQotKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmN4ZDI4MjByX2F0dGFjaCgKIAljb25zdCBzdHJ1Y3QgY3hkMjgyMHJfY29uZmlnICpjb25maWcsCkBAIC0xMDYsMTIgKzEwMyw2IEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIE5VTEw7CiB9Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBpMmNfYWRhcHRlciAqY3hkMjgyMHJfZ2V0X3R1bmVyX2kyY19hZGFwdGVyKAotCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlCi0pCi17Ci0JcmV0dXJuIE5VTEw7Ci19CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX2MuYwppbmRleCAzYzA3ZDQwLi5iODVmNTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9jLmMKQEAgLTMzNSw0ICszMzUsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfY29yZS5jCmluZGV4IGQ0MTZlODUuLjAzNjQ4MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX2NvcmUuYwpAQCAtNzI3LDcyICs3MjcsMjIgQEAKIAlzdHJ1Y3QgY3hkMjgyMHJfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKLQlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgewotCQlpMmNfZGVsX2FkYXB0ZXIoJnByaXYtPnR1bmVyX2kyY19hZGFwdGVyKTsKKwlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkKIAkJa2ZyZWUocHJpdik7Ci0JfQogCiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdTMyIGN4ZDI4MjByX3R1bmVyX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlyZXR1cm4gSTJDX0ZVTkNfSTJDOwotfQotCi1zdGF0aWMgaW50IGN4ZDI4MjByX3R1bmVyX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCi0Jc3RydWN0IGkyY19tc2cgbXNnW10sIGludCBudW0pCi17Ci0Jc3RydWN0IGN4ZDI4MjByX3ByaXYgKnByaXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKLQlpbnQgcmV0OwotCXU4ICpvYnVmID0ga21hbGxvYyhtc2dbMF0ubGVuICsgMiwgR0ZQX0tFUk5FTCk7Ci0Jc3RydWN0IGkyY19tc2cgbXNnMlsyXSA9IHsKLQkJewotCQkJLmFkZHIgPSBwcml2LT5jZmcuaTJjX2FkZHJlc3MsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiA9IG1zZ1swXS5sZW4gKyAyLAotCQkJLmJ1ZiA9IG9idWYsCi0JCX0sIHsKLQkJCS5hZGRyID0gcHJpdi0+Y2ZnLmkyY19hZGRyZXNzLAotCQkJLmZsYWdzID0gSTJDX01fUkQsCi0JCQkubGVuID0gbXNnWzFdLmxlbiwKLQkJCS5idWYgPSBtc2dbMV0uYnVmLAotCQl9Ci0JfTsKLQotCWlmICghb2J1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlvYnVmWzBdID0gMHgwOTsKLQlvYnVmWzFdID0gKG1zZ1swXS5hZGRyIDw8IDEpOwotCWlmIChudW0gPT0gMikgeyAvKiBJMkMgcmVhZCAqLwotCQlvYnVmWzFdID0gKG1zZ1swXS5hZGRyIDw8IDEpIHwgSTJDX01fUkQ7IC8qIEkyQyBSRCBmbGFnICovCi0JCW1zZzJbMF0ubGVuID0gbXNnWzBdLmxlbiArIDIgLSAxOyAvKiAnLTEnIG1heWJlIEhXIGJ1ZyA/ICovCi0JfQotCW1lbWNweSgmb2J1ZlsyXSwgbXNnWzBdLmJ1ZiwgbXNnWzBdLmxlbik7Ci0KLQlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCBtc2cyLCBudW0pOwotCWlmIChyZXQgPCAwKQotCQl3YXJuKCJ0dW5lciBpMmMgZmFpbGVkIHJldDolZCIsIHJldCk7Ci0KLQlrZnJlZShvYnVmKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBjeGQyODIwcl90dW5lcl9pMmNfYWxnbyA9IHsKLQkubWFzdGVyX3hmZXIgICA9IGN4ZDI4MjByX3R1bmVyX2kyY194ZmVyLAotCS5mdW5jdGlvbmFsaXR5ID0gY3hkMjgyMHJfdHVuZXJfaTJjX2Z1bmMsCi19OwotCi1zdHJ1Y3QgaTJjX2FkYXB0ZXIgKmN4ZDI4MjByX2dldF90dW5lcl9pMmNfYWRhcHRlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgY3hkMjgyMHJfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGVuYWJsZSkKIHsKIAlzdHJ1Y3QgY3hkMjgyMHJfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXJldHVybiAmcHJpdi0+dHVuZXJfaTJjX2FkYXB0ZXI7Ci19Ci1FWFBPUlRfU1lNQk9MKGN4ZDI4MjByX2dldF90dW5lcl9pMmNfYWRhcHRlcik7CisJZGJnKCIlczogJWQiLCBfX2Z1bmNfXywgZW5hYmxlKTsKIAotc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGN4ZDI4MjByX29wc1syXTsKKwkvKiBCaXQgMCBvZiByZWcgMHhkYiBpbiBiYW5rIDB4MDAgY29udHJvbHMgSTJDIHJlcGVhdGVyICovCisJcmV0dXJuIGN4ZDI4MjByX3dyX3JlZ19tYXNrKHByaXYsIDB4ZGIsIGVuYWJsZSA/IDEgOiAwLCAweDEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgY3hkMjgyMHJfb3BzWzJdOwogCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpjeGQyODIwcl9hdHRhY2goY29uc3Qgc3RydWN0IGN4ZDI4MjByX2NvbmZpZyAqY2ZnLAogCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKQEAgLTgzMSwxOCArNzgxLDYgQEAKIAkJcHJpdi0+ZmVbMF0uZGVtb2R1bGF0b3JfcHJpdiA9IHByaXY7CiAJCXByaXYtPmZlWzFdLmRlbW9kdWxhdG9yX3ByaXYgPSBwcml2OwogCi0JCS8qIGNyZWF0ZSB0dW5lciBpMmMgYWRhcHRlciAqLwotCQlzdHJsY3B5KHByaXYtPnR1bmVyX2kyY19hZGFwdGVyLm5hbWUsCi0JCQkiQ1hEMjgyMFIgdHVuZXIgSTJDIGFkYXB0ZXIiLAotCQkJc2l6ZW9mKHByaXYtPnR1bmVyX2kyY19hZGFwdGVyLm5hbWUpKTsKLQkJcHJpdi0+dHVuZXJfaTJjX2FkYXB0ZXIuYWxnbyA9ICZjeGQyODIwcl90dW5lcl9pMmNfYWxnbzsKLQkJcHJpdi0+dHVuZXJfaTJjX2FkYXB0ZXIuYWxnb19kYXRhID0gTlVMTDsKLQkJaTJjX3NldF9hZGFwZGF0YSgmcHJpdi0+dHVuZXJfaTJjX2FkYXB0ZXIsIHByaXYpOwotCQlpZiAoaTJjX2FkZF9hZGFwdGVyKCZwcml2LT50dW5lcl9pMmNfYWRhcHRlcikgPCAwKSB7Ci0JCQllcnIoInR1bmVyIEkyQyBidXMgY291bGQgbm90IGJlIGluaXRpYWxpemVkIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0KIAkJcmV0dXJuICZwcml2LT5mZVswXTsKIAogCX0gZWxzZSB7CkBAIC04NTgsNyArNzk2LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woY3hkMjgyMHJfYXR0YWNoKTsKIAotc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGN4ZDI4MjByX29wc1syXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBjeGQyODIwcl9vcHNbMl0gPSB7CiAJewogCQkvKiBEVkItVC9UMiAqLwogCQkuaW5mbyA9IHsKQEAgLTg4Myw2ICs4MjEsNyBAQAogCQkuc2xlZXAgPSBjeGQyODIwcl9zbGVlcCwKIAogCQkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBjeGQyODIwcl9nZXRfdHVuZV9zZXR0aW5ncywKKwkJLmkyY19nYXRlX2N0cmwgPSBjeGQyODIwcl9pMmNfZ2F0ZV9jdHJsLAogCiAJCS5nZXRfZnJvbnRlbmQgPSBjeGQyODIwcl9nZXRfZnJvbnRlbmQsCiAKQEAgLTkxMSw2ICs4NTAsNyBAQAogCQkuc2xlZXAgPSBjeGQyODIwcl9zbGVlcCwKIAogCQkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBjeGQyODIwcl9nZXRfdHVuZV9zZXR0aW5ncywKKwkJLmkyY19nYXRlX2N0cmwgPSBjeGQyODIwcl9pMmNfZ2F0ZV9jdHJsLAogCiAJCS5zZXRfZnJvbnRlbmQgPSBjeGQyODIwcl9zZXRfZnJvbnRlbmQsCiAJCS5nZXRfZnJvbnRlbmQgPSBjeGQyODIwcl9nZXRfZnJvbnRlbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3ByaXYuaAppbmRleCAwYzBlYmM5Li45NTUzOTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9wcml2LmgKQEAgLTUwLDcgKzUwLDYgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZlWzJdOwogCXN0cnVjdCBjeGQyODIwcl9jb25maWcgY2ZnOwotCXN0cnVjdCBpMmNfYWRhcHRlciB0dW5lcl9pMmNfYWRhcHRlcjsKIAogCXN0cnVjdCBtdXRleCBmZV9sb2NrOyAvKsKgRkUgbG9jayAqLwogCWludCBhY3RpdmVfZmU6MjsgLyogRkUgbG9jaywgLTE9Tk9ORSwgMD1EVkItVC9UMiwgMT1EVkItQyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3QuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl90LmMKaW5kZXggNjU4MjU2NC4uYTA0ZjljOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3QuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfdC5jCkBAIC00NDYsNCArNDQ2LDMgQEAKIAogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfdDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl90Mi5jCmluZGV4IGM0N2IzNWMuLjY1NDg1ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl90Mi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl90Mi5jCkBAIC00MjAsNCArNDIwLDMgQEAKIAogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMDA3MC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjAwNzAuYwppbmRleCAxZDQ3ZDRkLi5kYzFjYjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMDA3MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIwMDcwLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogCkBAIC03OCwxMCArNzksMTggQEAKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMl07CiAJdTggaTJjX3dyaXRlX2J1ZmZlclszXTsKIAl1OCBpMmNfcmVhZF9idWZmZXJbMl07CisJc3RydWN0IG11dGV4IGkyY19idWZmZXJfbG9jazsKIH07CiAKLXN0YXRpYyB1aW50MTZfdCBkaWIwMDcwX3JlYWRfcmVnKHN0cnVjdCBkaWIwMDcwX3N0YXRlICpzdGF0ZSwgdTggcmVnKQorc3RhdGljIHUxNiBkaWIwMDcwX3JlYWRfcmVnKHN0cnVjdCBkaWIwMDcwX3N0YXRlICpzdGF0ZSwgdTggcmVnKQogeworCXUxNiByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZzsKIAogCW1lbXNldChzdGF0ZS0+bXNnLCAwLCAyICogc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CkBAIC05NiwxMyArMTA1LDIzIEBACiAKIAlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIHN0YXRlLT5tc2csIDIpICE9IDIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGlCMDA3MCBJMkMgcmVhZCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UKKwkJcmV0ID0gKHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMF0gPDwgOCkKKwkJCXwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkaWIwMDcwX3dyaXRlX3JlZyhzdHJ1Y3QgZGliMDA3MF9zdGF0ZSAqc3RhdGUsIHU4IHJlZywgdTE2IHZhbCkKIHsKKwlpbnQgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzBdID0gcmVnOwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzFdID0gdmFsID4+IDg7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMl0gPSB2YWwgJiAweGZmOwpAQCAtMTE1LDkgKzEzNCwxMiBAQAogCiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBzdGF0ZS0+bXNnLCAxKSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpQjAwNzAgSTJDIHdyaXRlIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQlyZXR1cm4gMDsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9IGVsc2UKKwkJcmV0ID0gMDsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogI2RlZmluZSBIQVJEX1JFU0VUKHN0YXRlKSBkbyB7IFwKQEAgLTczNCw2ICs3NTYsNyBAQAogCXN0YXRlLT5jZmcgPSBjZmc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKIAlzdGF0ZS0+ZmUgID0gZmU7CisJbXV0ZXhfaW5pdCgmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CiAJZmUtPnR1bmVyX3ByaXYgPSBzdGF0ZTsKIAogCWlmIChkaWIwMDcwX3Jlc2V0KGZlKSAhPSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjAwOTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIwMDkwLmMKaW5kZXggYzljOTM1YS4uYjE3NGQxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjAwOTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMDA5MC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKIApAQCAtMTk2LDYgKzE5Nyw3IEBACiAJc3RydWN0IGkyY19tc2cgbXNnWzJdOwogCXU4IGkyY193cml0ZV9idWZmZXJbM107CiAJdTggaTJjX3JlYWRfYnVmZmVyWzJdOworCXN0cnVjdCBtdXRleCBpMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBzdHJ1Y3QgZGliMDA5MF9md19zdGF0ZSB7CkBAIC0yMDgsMTAgKzIxMCwxOCBAQAogCXN0cnVjdCBpMmNfbXNnIG1zZzsKIAl1OCBpMmNfd3JpdGVfYnVmZmVyWzJdOwogCXU4IGkyY19yZWFkX2J1ZmZlclsyXTsKKwlzdHJ1Y3QgbXV0ZXggaTJjX2J1ZmZlcl9sb2NrOwogfTsKIAogc3RhdGljIHUxNiBkaWIwMDkwX3JlYWRfcmVnKHN0cnVjdCBkaWIwMDkwX3N0YXRlICpzdGF0ZSwgdTggcmVnKQogeworCXUxNiByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZzsKIAogCW1lbXNldChzdGF0ZS0+bXNnLCAwLCAyICogc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CkBAIC0yMjYsMTQgKzIzNiwyNCBAQAogCiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBzdGF0ZS0+bXNnLCAyKSAhPSAyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpQjAwOTAgSTJDIHJlYWQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQorCQlyZXQgPSAwOworCX0gZWxzZQorCQlyZXQgPSAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KQorCQkJfCBzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzFdOwogCi0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGliMDA5MF93cml0ZV9yZWcoc3RydWN0IGRpYjAwOTBfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgdmFsKQogeworCWludCByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZyAmIDB4ZmY7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMV0gPSB2YWwgPj4gODsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsyXSA9IHZhbCAmIDB4ZmY7CkBAIC0yNDYsMTMgKzI2NiwyMyBAQAogCiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBzdGF0ZS0+bXNnLCAxKSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpQjAwOTAgSTJDIHdyaXRlIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQlyZXR1cm4gMDsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9IGVsc2UKKwkJcmV0ID0gMDsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHUxNiBkaWIwMDkwX2Z3X3JlYWRfcmVnKHN0cnVjdCBkaWIwMDkwX2Z3X3N0YXRlICpzdGF0ZSwgdTggcmVnKQogeworCXUxNiByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZzsKIAogCW1lbXNldCgmc3RhdGUtPm1zZywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CkBAIC0yNjIsMTMgKzI5MiwyNCBAQAogCXN0YXRlLT5tc2cubGVuID0gMjsKIAlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZzdGF0ZS0+bXNnLCAxKSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpQjAwOTAgSTJDIHJlYWQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisJCXJldCA9IDA7CisJfSBlbHNlCisJCXJldCA9IChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpCisJCQl8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisKKwltdXRleF91bmxvY2soJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGliMDA5MF9md193cml0ZV9yZWcoc3RydWN0IGRpYjAwOTBfZndfc3RhdGUgKnN0YXRlLCB1OCByZWcsIHUxNiB2YWwpCiB7CisJaW50IHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spIDwgMCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzBdID0gdmFsID4+IDg7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMV0gPSB2YWwgJiAweGZmOwogCkBAIC0yNzksOSArMzIwLDEyIEBACiAJc3RhdGUtPm1zZy5sZW4gPSAyOwogCWlmIChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJnN0YXRlLT5tc2csIDEpICE9IDEpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGlCMDA5MCBJMkMgd3JpdGUgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FUkVNT1RFSU87Ci0JfQotCXJldHVybiAwOworCQlyZXQgPSAtRVJFTU9URUlPOworCX0gZWxzZQorCQlyZXQgPSAwOworCisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiAjZGVmaW5lIEhBUkRfUkVTRVQoc3RhdGUpIGRvIHsgIGlmIChjZmctPnJlc2V0KSB7ICBpZiAoY2ZnLT5zbGVlcCkgY2ZnLT5zbGVlcChmZSwgMCk7IG1zbGVlcCgxMCk7ICBjZmctPnJlc2V0KGZlLCAxKTsgbXNsZWVwKDEwKTsgIGNmZy0+cmVzZXQoZmUsIDApOyBtc2xlZXAoMTApOyAgfSAgfSB3aGlsZSAoMCkKQEAgLTI0NDAsNiArMjQ4NCw3IEBACiAJc3QtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdC0+aTJjID0gaTJjOwogCXN0LT5mZSA9IGZlOworCW11dGV4X2luaXQoJnN0LT5pMmNfYnVmZmVyX2xvY2spOwogCWZlLT50dW5lcl9wcml2ID0gc3Q7CiAKIAlpZiAoY29uZmlnLT53YmQgPT0gTlVMTCkKQEAgLTI0NzEsNiArMjUxNiw3IEBACiAJc3QtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdC0+aTJjID0gaTJjOwogCXN0LT5mZSA9IGZlOworCW11dGV4X2luaXQoJnN0LT5pMmNfYnVmZmVyX2xvY2spOwogCWZlLT50dW5lcl9wcml2ID0gc3Q7CiAKIAlpZiAoZGliMDA5MF9md19yZXNldF9kaWdpdGFsKGZlLCBzdC0+Y29uZmlnKSAhPSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBtLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMG0uYwppbmRleCA3OWNiMWMyLi5kYmI3NmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMG0uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMG0uYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCiAKQEAgLTU1LDYgKzU2LDcgQEAKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMl07CiAJdTggaTJjX3dyaXRlX2J1ZmZlcls0XTsKIAl1OCBpMmNfcmVhZF9idWZmZXJbMl07CisJc3RydWN0IG11dGV4IGkyY19idWZmZXJfbG9jazsKIH07CiAKIGVudW0gZGliNzAwMG1fcG93ZXJfbW9kZSB7CkBAIC02OSw2ICs3MSwxMyBAQAogCiBzdGF0aWMgdTE2IGRpYjcwMDBtX3JlYWRfd29yZChzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlLCB1MTYgcmVnKQogeworCXUxNiByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IChyZWcgPj4gOCkgfCAweDgwOwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzFdID0gcmVnICYgMHhmZjsKIApAQCAtODUsMTEgKzk0LDIxIEBACiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjX2FkYXAsIHN0YXRlLT5tc2csIDIpICE9IDIpCiAJCWRwcmludGsoImkyYyByZWFkIGVycm9yIG9uICVkIixyZWcpOwogCi0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwlyZXQgPSAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGliNzAwMG1fd3JpdGVfd29yZChzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlLCB1MTYgcmVnLCB1MTYgdmFsKQogeworCWludCByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IChyZWcgPj4gOCkgJiAweGZmOwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzFdID0gcmVnICYgMHhmZjsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsyXSA9ICh2YWwgPj4gOCkgJiAweGZmOwpAQCAtMTAxLDcgKzEyMCwxMCBAQAogCXN0YXRlLT5tc2dbMF0uYnVmID0gc3RhdGUtPmkyY193cml0ZV9idWZmZXI7CiAJc3RhdGUtPm1zZ1swXS5sZW4gPSA0OwogCi0JcmV0dXJuIGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjX2FkYXAsIHN0YXRlLT5tc2csIDEpICE9IDEgPyAtRVJFTU9URUlPIDogMDsKKwlyZXQgPSAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmNfYWRhcCwgc3RhdGUtPm1zZywgMSkgIT0gMSA/CisJCQktRVJFTU9URUlPIDogMCk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogc3RhdGljIHZvaWQgZGliNzAwMG1fd3JpdGVfdGFiKHN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3RhdGUsIHUxNiAqYnVmKQogewpAQCAtMTM4NSw2ICsxNDA3LDcgQEAKIAlkZW1vZCAgICAgICAgICAgICAgICAgICA9ICZzdC0+ZGVtb2Q7CiAJZGVtb2QtPmRlbW9kdWxhdG9yX3ByaXYgPSBzdDsKIAltZW1jcHkoJnN0LT5kZW1vZC5vcHMsICZkaWI3MDAwbV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCW11dGV4X2luaXQoJnN0LT5pMmNfYnVmZmVyX2xvY2spOwogCiAJc3QtPnRpbWZfZGVmYXVsdCA9IGNmZy0+YnctPnRpbWY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKaW5kZXggYTY0YTUzOC4uY2U4NTM0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgImR2Yl9tYXRoLmgiCiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCkBAIC02OCw2ICs2OSw3IEBACiAJc3RydWN0IGkyY19tc2cgbXNnWzJdOwogCXU4IGkyY193cml0ZV9idWZmZXJbNF07CiAJdTggaTJjX3JlYWRfYnVmZmVyWzJdOworCXN0cnVjdCBtdXRleCBpMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBlbnVtIGRpYjcwMDBwX3Bvd2VyX21vZGUgewpAQCAtODEsNiArODMsMTMgQEAKIAogc3RhdGljIHUxNiBkaWI3MDAwcF9yZWFkX3dvcmQoc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSwgdTE2IHJlZykKIHsKKwl1MTYgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMF0gPSByZWcgPj4gODsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsxXSA9IHJlZyAmIDB4ZmY7CiAKQEAgLTk3LDExICsxMDYsMjAgQEAKIAlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmNfYWRhcCwgc3RhdGUtPm1zZywgMikgIT0gMikKIAkJZHByaW50aygiaTJjIHJlYWQgZXJyb3Igb24gJWQiLCByZWcpOwogCi0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwlyZXQgPSAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSwgdTE2IHJlZywgdTE2IHZhbCkKIHsKKwlpbnQgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMF0gPSAocmVnID4+IDgpICYgMHhmZjsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsxXSA9IHJlZyAmIDB4ZmY7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKQEAgLTExMyw3ICsxMzEsMTAgQEAKIAlzdGF0ZS0+bXNnWzBdLmJ1ZiA9IHN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyOwogCXN0YXRlLT5tc2dbMF0ubGVuID0gNDsKIAotCXJldHVybiBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyY19hZGFwLCBzdGF0ZS0+bXNnLCAxKSAhPSAxID8gLUVSRU1PVEVJTyA6IDA7CisJcmV0ID0gKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjX2FkYXAsIHN0YXRlLT5tc2csIDEpICE9IDEgPworCQkJLUVSRU1PVEVJTyA6IDApOworCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgZGliNzAwMHBfd3JpdGVfdGFiKHN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUsIHUxNiAqIGJ1ZikKQEAgLTE1NzcsOCArMTU5OCw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCXJ4ID0ga3phbGxvYygyKnNpemVvZih1OCksIEdGUF9LRVJORUwpOwogCWlmICghcngpIHsKLQkJZ290byByeF9tZW1vcnlfZXJyb3I7CiAJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcnhfbWVtb3J5X2Vycm9yOwogCX0KIAogCW1zZ1swXS5idWYgPSB0eDsKQEAgLTE2NDYsNiArMTY2Nyw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZHBzdC0+aTJjX2FkYXAgPSBpMmM7CisJbXV0ZXhfaW5pdCgmZHBzdC0+aTJjX2J1ZmZlcl9sb2NrKTsKIAogCWZvciAoayA9IG5vX29mX2RlbW9kcyAtIDE7IGsgPj0gMDsgay0tKSB7CiAJCWRwc3QtPmNmZyA9IGNmZ1trXTsKQEAgLTIzMjQsNiArMjM0Niw3IEBACiAJZGVtb2QgPSAmc3QtPmRlbW9kOwogCWRlbW9kLT5kZW1vZHVsYXRvcl9wcml2ID0gc3Q7CiAJbWVtY3B5KCZzdC0+ZGVtb2Qub3BzLCAmZGliNzAwMHBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwltdXRleF9pbml0KCZzdC0+aTJjX2J1ZmZlcl9sb2NrKTsKIAogCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3QsIDEyODcsIDB4MDAwMyk7CS8qIHNyYW0gbGVhZCBpbiwgcmR5ICovCiAKQEAgLTIzMzMsOCArMjM1Niw5IEBACiAJc3QtPnZlcnNpb24gPSBkaWI3MDAwcF9yZWFkX3dvcmQoc3QsIDg5Nyk7CiAKIAkvKiBGSVhNRTogbWFrZSBzdXJlIHRoZSBkZXYucGFyZW50IGZpZWxkIGlzIGluaXRpYWxpemVkLCBvciBlbHNlCi0JCXJlcXVlc3RfZmlybXdhcmUoKSB3aWxsIGhpdCBhbiBPT1BTICh0aGlzIHNob3VsZCBiZSBtb3ZlZCBzb21ld2hlcmUKLQkJbW9yZSBjb21tb24pICovCisJICAgcmVxdWVzdF9maXJtd2FyZSgpIHdpbGwgaGl0IGFuIE9PUFMgKHRoaXMgc2hvdWxkIGJlIG1vdmVkIHNvbWV3aGVyZQorCSAgIG1vcmUgY29tbW9uKSAqLworCXN0LT5pMmNfbWFzdGVyLmdhdGVkX3R1bmVyX2kyY19hZGFwLmRldi5wYXJlbnQgPSBpMmNfYWRhcC0+ZGV2LnBhcmVudDsKIAogCS8qIEZJWE1FOiBtYWtlIHN1cmUgdGhlIGRldi5wYXJlbnQgZmllbGQgaXMgaW5pdGlhbGl6ZWQsIG9yIGVsc2UKIAkgICByZXF1ZXN0X2Zpcm13YXJlKCkgd2lsbCBoaXQgYW4gT09QUyAodGhpcyBzaG91bGQgYmUgbW92ZWQgc29tZXdoZXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliODAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjgwMDAuYwppbmRleCA3ZDJlYTExLi5mZTI4NGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliODAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI4MDAwLmMKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKwogI2luY2x1ZGUgImR2Yl9tYXRoLmgiCiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKQEAgLTM3LDYgKzM5LDcgQEAKIAl1OCBhZGRyOwogCXU4ICppMmNfd3JpdGVfYnVmZmVyOwogCXU4ICppMmNfcmVhZF9idWZmZXI7CisJc3RydWN0IG11dGV4ICppMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBzdHJ1Y3QgZGliODAwMF9zdGF0ZSB7CkBAIC03Nyw2ICs4MCw3IEBACiAJc3RydWN0IGkyY19tc2cgbXNnWzJdOwogCXU4IGkyY193cml0ZV9idWZmZXJbNF07CiAJdTggaTJjX3JlYWRfYnVmZmVyWzJdOworCXN0cnVjdCBtdXRleCBpMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBlbnVtIGRpYjgwMDBfcG93ZXJfbW9kZSB7CkBAIC04NiwyNCArOTAsMzkgQEAKIAogc3RhdGljIHUxNiBkaWI4MDAwX2kyY19yZWFkMTYoc3RydWN0IGkyY19kZXZpY2UgKmkyYywgdTE2IHJlZykKIHsKKwl1MTYgcmV0OwogCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKLQkJey5hZGRyID0gaTJjLT5hZGRyID4+IDEsIC5mbGFncyA9IDAsCi0JCQkuYnVmID0gaTJjLT5pMmNfd3JpdGVfYnVmZmVyLCAubGVuID0gMn0sCi0JCXsuYWRkciA9IGkyYy0+YWRkciA+PiAxLCAuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCS5idWYgPSBpMmMtPmkyY19yZWFkX2J1ZmZlciwgLmxlbiA9IDJ9LAorCQl7LmFkZHIgPSBpMmMtPmFkZHIgPj4gMSwgLmZsYWdzID0gMCwgLmxlbiA9IDJ9LAorCQl7LmFkZHIgPSBpMmMtPmFkZHIgPj4gMSwgLmZsYWdzID0gSTJDX01fUkQsIC5sZW4gPSAyfSwKIAl9OwogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShpMmMtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbXNnWzBdLmJ1ZiAgICA9IGkyYy0+aTJjX3dyaXRlX2J1ZmZlcjsKIAltc2dbMF0uYnVmWzBdID0gcmVnID4+IDg7CiAJbXNnWzBdLmJ1ZlsxXSA9IHJlZyAmIDB4ZmY7CisJbXNnWzFdLmJ1ZiAgICA9IGkyYy0+aTJjX3JlYWRfYnVmZmVyOwogCiAJaWYgKGkyY190cmFuc2ZlcihpMmMtPmFkYXAsIG1zZywgMikgIT0gMikKIAkJZHByaW50aygiaTJjIHJlYWQgZXJyb3Igb24gJWQiLCByZWcpOwogCi0JcmV0dXJuIChtc2dbMV0uYnVmWzBdIDw8IDgpIHwgbXNnWzFdLmJ1ZlsxXTsKKwlyZXQgPSAobXNnWzFdLmJ1ZlswXSA8PCA4KSB8IG1zZ1sxXS5idWZbMV07CisJbXV0ZXhfdW5sb2NrKGkyYy0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTE2IGRpYjgwMDBfcmVhZF93b3JkKHN0cnVjdCBkaWI4MDAwX3N0YXRlICpzdGF0ZSwgdTE2IHJlZykKIHsKKwl1MTYgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMF0gPSByZWcgPj4gODsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsxXSA9IHJlZyAmIDB4ZmY7CiAKQEAgLTEyMCw3ICsxMzksMTAgQEAKIAlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMuYWRhcCwgc3RhdGUtPm1zZywgMikgIT0gMikKIAkJZHByaW50aygiaTJjIHJlYWQgZXJyb3Igb24gJWQiLCByZWcpOwogCi0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwlyZXQgPSAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB1MzIgZGliODAwMF9yZWFkMzIoc3RydWN0IGRpYjgwMDBfc3RhdGUgKnN0YXRlLCB1MTYgcmVnKQpAQCAtMTM1LDIyICsxNTcsMzUgQEAKIAogc3RhdGljIGludCBkaWI4MDAwX2kyY193cml0ZTE2KHN0cnVjdCBpMmNfZGV2aWNlICppMmMsIHUxNiByZWcsIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gaTJjLT5hZGRyID4+IDEsIC5mbGFncyA9IDAsCi0JCS5idWYgPSBpMmMtPmkyY193cml0ZV9idWZmZXIsIC5sZW4gPSA0fTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSBpMmMtPmFkZHIgPj4gMSwgLmZsYWdzID0gMCwgLmxlbiA9IDR9OwogCWludCByZXQgPSAwOwogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShpMmMtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnLmJ1ZiAgICA9IGkyYy0+aTJjX3dyaXRlX2J1ZmZlcjsKIAltc2cuYnVmWzBdID0gKHJlZyA+PiA4KSAmIDB4ZmY7CiAJbXNnLmJ1ZlsxXSA9IHJlZyAmIDB4ZmY7CiAJbXNnLmJ1ZlsyXSA9ICh2YWwgPj4gOCkgJiAweGZmOwogCW1zZy5idWZbM10gPSB2YWwgJiAweGZmOwogCiAJcmV0ID0gaTJjX3RyYW5zZmVyKGkyYy0+YWRhcCwgJm1zZywgMSkgIT0gMSA/IC1FUkVNT1RFSU8gOiAwOworCW11dGV4X3VubG9jayhpMmMtPmkyY19idWZmZXJfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGRpYjgwMDBfd3JpdGVfd29yZChzdHJ1Y3QgZGliODAwMF9zdGF0ZSAqc3RhdGUsIHUxNiByZWcsIHUxNiB2YWwpCiB7CisJaW50IHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spIDwgMCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzBdID0gKHJlZyA+PiA4KSAmIDB4ZmY7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMV0gPSByZWcgJiAweGZmOwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzJdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CkBAIC0xNjIsNyArMTk3LDExIEBACiAJc3RhdGUtPm1zZ1swXS5idWYgPSBzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlcjsKIAlzdGF0ZS0+bXNnWzBdLmxlbiA9IDQ7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMuYWRhcCwgc3RhdGUtPm1zZywgMSkgIT0gMSA/IC1FUkVNT1RFSU8gOiAwOworCXJldCA9IChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYy5hZGFwLCBzdGF0ZS0+bXNnLCAxKSAhPSAxID8KKwkJCS1FUkVNT1RFSU8gOiAwKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHMxNiBjb2VmZl8ya19zYl8xc2VnX2RxcHNrWzhdID0gewpAQCAtMjQzNCw4ICsyNDczLDE1IEBACiAJaWYgKCFjbGllbnQuaTJjX3JlYWRfYnVmZmVyKSB7CiAJCWRwcmludGsoIiVzOiBub3QgZW5vdWdoIG1lbW9yeSIsIF9fZnVuY19fKTsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9tZW1vcnk7CisJCWdvdG8gZXJyb3JfbWVtb3J5X3JlYWQ7CiAJfQorCWNsaWVudC5pMmNfYnVmZmVyX2xvY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXV0ZXgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaWVudC5pMmNfYnVmZmVyX2xvY2spIHsKKwkJZHByaW50aygiJXM6IG5vdCBlbm91Z2ggbWVtb3J5IiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX21lbW9yeV9sb2NrOworCX0KKwltdXRleF9pbml0KGNsaWVudC5pMmNfYnVmZmVyX2xvY2spOwogCiAJZm9yIChrID0gbm9fb2ZfZGVtb2RzIC0gMTsgayA+PSAwOyBrLS0pIHsKIAkJLyogZGVzaWduYXRlZCBpMmMgYWRkcmVzcyAqLwpAQCAtMjQ3Niw4ICsyNTIyLDEwIEBACiAJfQogCiBlcnJvcjoKKwlrZnJlZShjbGllbnQuaTJjX2J1ZmZlcl9sb2NrKTsKK2Vycm9yX21lbW9yeV9sb2NrOgogCWtmcmVlKGNsaWVudC5pMmNfcmVhZF9idWZmZXIpOwotZXJyb3JfbWVtb3J5OgorZXJyb3JfbWVtb3J5X3JlYWQ6CiAJa2ZyZWUoY2xpZW50LmkyY193cml0ZV9idWZmZXIpOwogCiAJcmV0dXJuIHJldDsKQEAgLTI1ODEsNiArMjYyOSw4IEBACiAJc3RhdGUtPmkyYy5hZGRyID0gaTJjX2FkZHI7CiAJc3RhdGUtPmkyYy5pMmNfd3JpdGVfYnVmZmVyID0gc3RhdGUtPmkyY193cml0ZV9idWZmZXI7CiAJc3RhdGUtPmkyYy5pMmNfcmVhZF9idWZmZXIgPSBzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyOworCW11dGV4X2luaXQoJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spOworCXN0YXRlLT5pMmMuaTJjX2J1ZmZlcl9sb2NrID0gJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2s7CiAJc3RhdGUtPmdwaW9fdmFsID0gY2ZnLT5ncGlvX3ZhbDsKIAlzdGF0ZS0+Z3Bpb19kaXIgPSBjZmctPmdwaW9fZGlyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliOTAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjkwMDAuYwppbmRleCBhMDg1NTg4Li42NjBmODA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliOTAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI5MDAwLmMKQEAgLTM4LDYgKzM4LDE1IEBACiAjZGVmaW5lIERpYkluaXRMb2NrKGxvY2spIG11dGV4X2luaXQobG9jaykKICNkZWZpbmUgRGliRnJlZUxvY2sobG9jaykKIAorc3RydWN0IGRpYjkwMDBfcGlkX2N0cmwgeworI2RlZmluZSBESUI5MDAwX1BJRF9GSUxURVJfQ1RSTCAwCisjZGVmaW5lIERJQjkwMDBfUElEX0ZJTFRFUiAgICAgIDEKKwl1OCBjbWQ7CisJdTggaWQ7CisJdTE2IHBpZDsKKwl1OCBvbm9mZjsKK307CisKIHN0cnVjdCBkaWI5MDAwX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2RldmljZSBpMmM7CiAKQEAgLTk5LDYgKzEwOCwxMCBAQAogCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKIAl1OCBpMmNfd3JpdGVfYnVmZmVyWzI1NV07CiAJdTggaTJjX3JlYWRfYnVmZmVyWzI1NV07CisJRElCX0xPQ0sgZGVtb2RfbG9jazsKKwl1OCBnZXRfZnJvbnRlbmRfaW50ZXJuYWw7CisJc3RydWN0IGRpYjkwMDBfcGlkX2N0cmwgcGlkX2N0cmxbMTBdOworCXM4IHBpZF9jdHJsX2luZGV4OyAvKiAtMTogZW1wdHkgbGlzdDsgLTI6IGRvIG5vdCB1c2UgdGhlIGxpc3QgKi8KIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgZmVfaW5mb1s0NF0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCkBAIC0xMTY3LDggKzExODAsOCBAQAogCiAJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5wbGF0Zm9ybS5yaXNjLm1lbV9tYnhfbG9jayk7CiAJaWYgKGRpYjkwMDBfZndfbWVtbWJ4X3N5bmMoc3RhdGUsIEZFX1NZTkNfQ0hBTk5FTCkgPCAwKSB7Ci0JCWdvdG8gZXJyb3I7CiAJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJZGliOTAwMF9yaXNjX21lbV9yZWFkKHN0YXRlLCBGRV9NTV9SX0NIQU5ORUxfVU5JT04sCkBAIC0xNzQzLDE5ICsxNzU2LDU2IEBACiBpbnQgZGliOTAwMF9md19waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4IG9ub2ZmKQogewogCXN0cnVjdCBkaWI5MDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXUxNiB2YWwgPSBkaWI5MDAwX3JlYWRfd29yZChzdGF0ZSwgMjk0ICsgMSkgJiAweGZmZWY7CisJdTE2IHZhbDsKKwlpbnQgcmV0OworCisJaWYgKChzdGF0ZS0+cGlkX2N0cmxfaW5kZXggIT0gLTIpICYmIChzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPCA5KSkgeworCQkvKiBwb3N0cG9uZSB0aGUgcGlkIGZpbHRlcmluZyBjbWQgKi8KKwkJZHByaW50aygicGlkIGZpbHRlciBjbWQgcG9zdHBvbmUiKTsKKwkJc3RhdGUtPnBpZF9jdHJsX2luZGV4Kys7CisJCXN0YXRlLT5waWRfY3RybFtzdGF0ZS0+cGlkX2N0cmxfaW5kZXhdLmNtZCA9IERJQjkwMDBfUElEX0ZJTFRFUl9DVFJMOworCQlzdGF0ZS0+cGlkX2N0cmxbc3RhdGUtPnBpZF9jdHJsX2luZGV4XS5vbm9mZiA9IG9ub2ZmOworCQlyZXR1cm4gMDsKKwl9CisKKwlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCisJdmFsID0gZGliOTAwMF9yZWFkX3dvcmQoc3RhdGUsIDI5NCArIDEpICYgMHhmZmVmOwogCXZhbCB8PSAob25vZmYgJiAweDEpIDw8IDQ7CiAKIAlkcHJpbnRrKCJQSUQgZmlsdGVyIGVuYWJsZWQgJWQiLCBvbm9mZik7Ci0JcmV0dXJuIGRpYjkwMDBfd3JpdGVfd29yZChzdGF0ZSwgMjk0ICsgMSwgdmFsKTsKKwlyZXQgPSBkaWI5MDAwX3dyaXRlX3dvcmQoc3RhdGUsIDI5NCArIDEsIHZhbCk7CisJRGliUmVsZWFzZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwlyZXR1cm4gcmV0OworCiB9CiBFWFBPUlRfU1lNQk9MKGRpYjkwMDBfZndfcGlkX2ZpbHRlcl9jdHJsKTsKIAogaW50IGRpYjkwMDBfZndfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggaWQsIHUxNiBwaWQsIHU4IG9ub2ZmKQogewogCXN0cnVjdCBkaWI5MDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisKKwlpZiAoc3RhdGUtPnBpZF9jdHJsX2luZGV4ICE9IC0yKSB7CisJCS8qIHBvc3Rwb25lIHRoZSBwaWQgZmlsdGVyaW5nIGNtZCAqLworCQlkcHJpbnRrKCJwaWQgZmlsdGVyIHBvc3Rwb25lIik7CisJCWlmIChzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPCA5KSB7CisJCQlzdGF0ZS0+cGlkX2N0cmxfaW5kZXgrKzsKKwkJCXN0YXRlLT5waWRfY3RybFtzdGF0ZS0+cGlkX2N0cmxfaW5kZXhdLmNtZCA9IERJQjkwMDBfUElEX0ZJTFRFUjsKKwkJCXN0YXRlLT5waWRfY3RybFtzdGF0ZS0+cGlkX2N0cmxfaW5kZXhdLmlkID0gaWQ7CisJCQlzdGF0ZS0+cGlkX2N0cmxbc3RhdGUtPnBpZF9jdHJsX2luZGV4XS5waWQgPSBwaWQ7CisJCQlzdGF0ZS0+cGlkX2N0cmxbc3RhdGUtPnBpZF9jdHJsX2luZGV4XS5vbm9mZiA9IG9ub2ZmOworCQl9IGVsc2UKKwkJCWRwcmludGsoImNhbiBub3QgYWRkIGFueSBtb3JlIHBpZCBjdHJsIGNtZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCWRwcmludGsoIkluZGV4ICV4LCBQSUQgJWQsIE9uT2ZmICVkIiwgaWQsIHBpZCwgb25vZmYpOwotCXJldHVybiBkaWI5MDAwX3dyaXRlX3dvcmQoc3RhdGUsIDMwMCArIDEgKyBpZCwgb25vZmYgPyAoMSA8PCAxMykgfCBwaWQgOiAwKTsKKwlyZXQgPSBkaWI5MDAwX3dyaXRlX3dvcmQoc3RhdGUsIDMwMCArIDEgKyBpZCwKKwkJCW9ub2ZmID8gKDEgPDwgMTMpIHwgcGlkIDogMCk7CisJRGliUmVsZWFzZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChkaWI5MDAwX2Z3X3BpZF9maWx0ZXIpOwogCkBAIC0xNzc4LDYgKzE4MjgsNyBAQAogCURpYkZyZWVMb2NrKCZzdGF0ZS0+cGxhdGZvcm0ucmlzYy5tYnhfbG9jayk7CiAJRGliRnJlZUxvY2soJnN0YXRlLT5wbGF0Zm9ybS5yaXNjLm1lbV9sb2NrKTsKIAlEaWJGcmVlTG9jaygmc3RhdGUtPnBsYXRmb3JtLnJpc2MubWVtX21ieF9sb2NrKTsKKwlEaWJGcmVlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCWRpYngwMDBfZXhpdF9pMmNfbWFzdGVyKCZzdC0+aTJjX21hc3Rlcik7CiAKIAlpMmNfZGVsX2FkYXB0ZXIoJnN0LT50dW5lcl9hZGFwKTsKQEAgLTE3OTUsMTQgKzE4NDYsMTkgQEAKIHsKIAlzdHJ1Y3QgZGliOTAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1OCBpbmRleF9mcm9udGVuZDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCisJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKIAlmb3IgKGluZGV4X2Zyb250ZW5kID0gMTsgKGluZGV4X2Zyb250ZW5kIDwgTUFYX05VTUJFUl9PRl9GUk9OVEVORFMpICYmIChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdICE9IE5VTEwpOyBpbmRleF9mcm9udGVuZCsrKSB7CiAJCXJldCA9IHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0tPm9wcy5zbGVlcChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdKTsKIAkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBlcnJvcjsKIAl9Ci0JcmV0dXJuIGRpYjkwMDBfbWJ4X3NlbmQoc3RhdGUsIE9VVF9NU0dfRkVfU0xFRVAsIE5VTEwsIDApOworCXJldCA9IGRpYjkwMDBfbWJ4X3NlbmQoc3RhdGUsIE9VVF9NU0dfRkVfU0xFRVAsIE5VTEwsIDApOworCitlcnJvcjoKKwlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGliOTAwMF9mZV9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICp0dW5lKQpAQCAtMTgxNiw3ICsxODcyLDEwIEBACiAJc3RydWN0IGRpYjkwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggaW5kZXhfZnJvbnRlbmQsIHN1Yl9pbmRleF9mcm9udGVuZDsKIAlmZV9zdGF0dXNfdCBzdGF0OwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc3RhdGUtPmdldF9mcm9udGVuZF9pbnRlcm5hbCA9PSAwKQorCQlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCiAJZm9yIChpbmRleF9mcm9udGVuZCA9IDE7IChpbmRleF9mcm9udGVuZCA8IE1BWF9OVU1CRVJfT0ZfRlJPTlRFTkRTKSAmJiAoc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXSAhPSBOVUxMKTsgaW5kZXhfZnJvbnRlbmQrKykgewogCQlzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdLT5vcHMucmVhZF9zdGF0dXMoc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXSwgJnN0YXQpOwpAQCAtMTg0NiwxNCArMTkwNSwxNSBAQAogCQkJCQkgICAgc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXS0+ZHR2X3Byb3BlcnR5X2NhY2hlLnJvbGxvZmY7CiAJCQkJfQogCQkJfQotCQkJcmV0dXJuIDA7CisJCQlyZXQgPSAwOworCQkJZ290byByZXR1cm5fdmFsdWU7CiAJCX0KIAl9CiAKIAkvKiBnZXQgdGhlIGNoYW5uZWwgZnJvbSBtYXN0ZXIgY2hpcCAqLwogCXJldCA9IGRpYjkwMDBfZndfZ2V0X2NoYW5uZWwoZmUsIGZlcCk7CiAJaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIHJldHVybl92YWx1ZTsKIAogCS8qIHN5bmNocm9uaXplIHRoZSBjYWNoZSB3aXRoIHRoZSBvdGhlciBmcm9udGVuZHMgKi8KIAlmb3IgKGluZGV4X2Zyb250ZW5kID0gMTsgKGluZGV4X2Zyb250ZW5kIDwgTUFYX05VTUJFUl9PRl9GUk9OVEVORFMpICYmIChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdICE9IE5VTEwpOyBpbmRleF9mcm9udGVuZCsrKSB7CkBAIC0xODY2LDggKzE5MjYsMTIgQEAKIAkJc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmNvZGVfcmF0ZV9MUCA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUuY29kZV9yYXRlX0xQOwogCQlzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdLT5kdHZfcHJvcGVydHlfY2FjaGUucm9sbG9mZiA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUucm9sbG9mZjsKIAl9CisJcmV0ID0gMDsKIAotCXJldHVybiAwOworcmV0dXJuX3ZhbHVlOgorCWlmIChzdGF0ZS0+Z2V0X2Zyb250ZW5kX2ludGVybmFsID09IDApCisJCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkaWI5MDAwX3NldF90dW5lX3N0YXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBlbnVtIGZyb250ZW5kX3R1bmVfc3RhdGUgdHVuZV9zdGF0ZSkKQEAgLTE5MTIsNiArMTk3NiwxMCBAQAogCQlkcHJpbnRrKCJkaWI5MDAwOiBtdXN0IHNwZWNpZnkgYmFuZHdpZHRoICIpOwogCQlyZXR1cm4gMDsKIAl9CisKKwlzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPSAtMTsgLyogcG9zdHBvbmUgdGhlIHBpZCBmaWx0ZXJpbmcgY21kICovCisJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwogCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuZGVsaXZlcnlfc3lzdGVtID0gU1lTX0RWQlQ7CiAKIAkvKiBzZXQgdGhlIG1hc3RlciBzdGF0dXMgKi8KQEAgLTE5NzQsMTMgKzIwNDIsMTggQEAKIAkvKiBjaGVjayB0aGUgdHVuZSByZXN1bHQgKi8KIAlpZiAoZXhpdF9jb25kaXRpb24gPT0gMSkgewkvKiB0dW5lIGZhaWxlZCAqLwogCQlkcHJpbnRrKCJ0dW5lIGZhaWxlZCIpOworCQlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCQkvKiB0dW5lIGZhaWxlZDsgcHV0IGFsbCB0aGUgcGlkIGZpbHRlcmluZyBjbWQgdG8ganVuayAqLworCQlzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPSAtMTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJZHByaW50aygidHVuZSBzdWNjZXNzIG9uIGZyb250ZW5kJWkiLCBpbmRleF9mcm9udGVuZF9zdWNjZXNzKTsKIAogCS8qIHN5bmNocm9uaXplIGFsbCB0aGUgY2hhbm5lbCBjYWNoZSAqLworCXN0YXRlLT5nZXRfZnJvbnRlbmRfaW50ZXJuYWwgPSAxOwogCWRpYjkwMDBfZ2V0X2Zyb250ZW5kKHN0YXRlLT5mZVswXSwgZmVwKTsKKwlzdGF0ZS0+Z2V0X2Zyb250ZW5kX2ludGVybmFsID0gMDsKIAogCS8qIHJldHVuZSB0aGUgb3RoZXIgZnJvbnRlbmRzIHdpdGggdGhlIGZvdW5kIGNoYW5uZWwgKi8KIAljaGFubmVsX3N0YXR1cy5zdGF0dXMgPSBDSEFOTkVMX1NUQVRVU19QQVJBTUVURVJTX1NFVDsKQEAgLTIwMjUsNiArMjA5OCwyOCBAQAogCS8qIHR1cm4gb2ZmIHRoZSBkaXZlcnNpdHkgZm9yIHRoZSBsYXN0IGZyb250ZW5kICovCiAJZGliOTAwMF9md19zZXRfZGl2ZXJzaXR5X2luKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZCAtIDFdLCAwKTsKIAorCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CisJaWYgKHN0YXRlLT5waWRfY3RybF9pbmRleCA+PSAwKSB7CisJCXU4IGluZGV4X3BpZF9maWx0ZXJfY21kOworCQl1OCBwaWRfY3RybF9pbmRleCA9IHN0YXRlLT5waWRfY3RybF9pbmRleDsKKworCQlzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPSAtMjsKKwkJZm9yIChpbmRleF9waWRfZmlsdGVyX2NtZCA9IDA7CisJCQkJaW5kZXhfcGlkX2ZpbHRlcl9jbWQgPD0gcGlkX2N0cmxfaW5kZXg7CisJCQkJaW5kZXhfcGlkX2ZpbHRlcl9jbWQrKykgeworCQkJaWYgKHN0YXRlLT5waWRfY3RybFtpbmRleF9waWRfZmlsdGVyX2NtZF0uY21kID09IERJQjkwMDBfUElEX0ZJTFRFUl9DVFJMKQorCQkJCWRpYjkwMDBfZndfcGlkX2ZpbHRlcl9jdHJsKHN0YXRlLT5mZVswXSwKKwkJCQkJCXN0YXRlLT5waWRfY3RybFtpbmRleF9waWRfZmlsdGVyX2NtZF0ub25vZmYpOworCQkJZWxzZSBpZiAoc3RhdGUtPnBpZF9jdHJsW2luZGV4X3BpZF9maWx0ZXJfY21kXS5jbWQgPT0gRElCOTAwMF9QSURfRklMVEVSKQorCQkJCWRpYjkwMDBfZndfcGlkX2ZpbHRlcihzdGF0ZS0+ZmVbMF0sCisJCQkJCQlzdGF0ZS0+cGlkX2N0cmxbaW5kZXhfcGlkX2ZpbHRlcl9jbWRdLmlkLAorCQkJCQkJc3RhdGUtPnBpZF9jdHJsW2luZGV4X3BpZF9maWx0ZXJfY21kXS5waWQsCisJCQkJCQlzdGF0ZS0+cGlkX2N0cmxbaW5kZXhfcGlkX2ZpbHRlcl9jbWRdLm9ub2ZmKTsKKwkJfQorCX0KKwkvKiBkbyBub3QgcG9zdHBvbmUgYW55IG1vcmUgdGhlIHBpZCBmaWx0ZXJpbmcgKi8KKwlzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPSAtMjsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMDQxLDYgKzIxMzYsNyBAQAogCXU4IGluZGV4X2Zyb250ZW5kOwogCXUxNiBsb2NrID0gMCwgbG9ja19zbGF2ZSA9IDA7CiAKKwlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCWZvciAoaW5kZXhfZnJvbnRlbmQgPSAxOyAoaW5kZXhfZnJvbnRlbmQgPCBNQVhfTlVNQkVSX09GX0ZST05URU5EUykgJiYgKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0gIT0gTlVMTCk7IGluZGV4X2Zyb250ZW5kKyspCiAJCWxvY2tfc2xhdmUgfD0gZGliOTAwMF9yZWFkX2xvY2soc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXSk7CiAKQEAgLTIwNTksNiArMjE1NSw4IEBACiAJaWYgKChsb2NrICYgMHgwMDA4KSB8fCAobG9ja19zbGF2ZSAmIDB4MDAwOCkpCiAJCSpzdGF0IHw9IEZFX0hBU19MT0NLOwogCisJRGliUmVsZWFzZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMDY2LDEwICsyMTY0LDE1IEBACiB7CiAJc3RydWN0IGRpYjkwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTE2ICpjOworCWludCByZXQgPSAwOwogCisJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKIAlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPnBsYXRmb3JtLnJpc2MubWVtX21ieF9sb2NrKTsKLQlpZiAoZGliOTAwMF9md19tZW1tYnhfc3luYyhzdGF0ZSwgRkVfU1lOQ19DSEFOTkVMKSA8IDApCi0JCXJldHVybiAtRUlPOworCWlmIChkaWI5MDAwX2Z3X21lbW1ieF9zeW5jKHN0YXRlLCBGRV9TWU5DX0NIQU5ORUwpIDwgMCkgeworCQlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPnBsYXRmb3JtLnJpc2MubWVtX21ieF9sb2NrKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CiAJZGliOTAwMF9yaXNjX21lbV9yZWFkKHN0YXRlLCBGRV9NTV9SX0ZFX01PTklUT1IsCiAJCQlzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyLCAxNiAqIDIpOwogCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+cGxhdGZvcm0ucmlzYy5tZW1fbWJ4X2xvY2spOwpAQCAtMjA3Nyw3ICsyMTgwLDEwIEBACiAJYyA9ICh1MTYgKilzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyOwogCiAJKmJlciA9IGNbMTBdIDw8IDE2IHwgY1sxMV07Ci0JcmV0dXJuIDA7CisKK2Vycm9yOgorCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkaWI5MDAwX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKiBzdHJlbmd0aCkKQEAgLTIwODYsNyArMjE5Miw5IEBACiAJdTggaW5kZXhfZnJvbnRlbmQ7CiAJdTE2ICpjID0gKHUxNiAqKXN0YXRlLT5pMmNfcmVhZF9idWZmZXI7CiAJdTE2IHZhbDsKKwlpbnQgcmV0ID0gMDsKIAorCURpYkFjcXVpcmVMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CiAJKnN0cmVuZ3RoID0gMDsKIAlmb3IgKGluZGV4X2Zyb250ZW5kID0gMTsgKGluZGV4X2Zyb250ZW5kIDwgTUFYX05VTUJFUl9PRl9GUk9OVEVORFMpICYmIChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdICE9IE5VTEwpOyBpbmRleF9mcm9udGVuZCsrKSB7CiAJCXN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0tPm9wcy5yZWFkX3NpZ25hbF9zdHJlbmd0aChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdLCAmdmFsKTsKQEAgLTIwOTcsOCArMjIwNSwxMCBAQAogCX0KIAogCURpYkFjcXVpcmVMb2NrKCZzdGF0ZS0+cGxhdGZvcm0ucmlzYy5tZW1fbWJ4X2xvY2spOwotCWlmIChkaWI5MDAwX2Z3X21lbW1ieF9zeW5jKHN0YXRlLCBGRV9TWU5DX0NIQU5ORUwpIDwgMCkKLQkJcmV0dXJuIC1FSU87CisJaWYgKGRpYjkwMDBfZndfbWVtbWJ4X3N5bmMoc3RhdGUsIEZFX1NZTkNfQ0hBTk5FTCkgPCAwKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQogCWRpYjkwMDBfcmlzY19tZW1fcmVhZChzdGF0ZSwgRkVfTU1fUl9GRV9NT05JVE9SLCAodTggKikgYywgMTYgKiAyKTsKIAlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPnBsYXRmb3JtLnJpc2MubWVtX21ieF9sb2NrKTsKIApAQCAtMjEwNyw3ICsyMjE3LDEwIEBACiAJCSpzdHJlbmd0aCA9IDY1NTM1OwogCWVsc2UKIAkJKnN0cmVuZ3RoICs9IHZhbDsKLQlyZXR1cm4gMDsKKworZXJyb3I6CisJRGliUmVsZWFzZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTMyIGRpYjkwMDBfZ2V0X3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKQEAgLTIxNTEsNiArMjI2NCw3IEBACiAJdTggaW5kZXhfZnJvbnRlbmQ7CiAJdTMyIHNucl9tYXN0ZXI7CiAKKwlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCXNucl9tYXN0ZXIgPSBkaWI5MDAwX2dldF9zbnIoZmUpOwogCWZvciAoaW5kZXhfZnJvbnRlbmQgPSAxOyAoaW5kZXhfZnJvbnRlbmQgPCBNQVhfTlVNQkVSX09GX0ZST05URU5EUykgJiYgKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0gIT0gTlVMTCk7IGluZGV4X2Zyb250ZW5kKyspCiAJCXNucl9tYXN0ZXIgKz0gZGliOTAwMF9nZXRfc25yKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0pOwpAQCAtMjE2MSw2ICsyMjc1LDggQEAKIAl9IGVsc2UKIAkJKnNuciA9IDA7CiAKKwlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNjgsMTUgKzIyODQsMjIgQEAKIHsKIAlzdHJ1Y3QgZGliOTAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1MTYgKmMgPSAodTE2ICopc3RhdGUtPmkyY19yZWFkX2J1ZmZlcjsKKwlpbnQgcmV0ID0gMDsKIAorCURpYkFjcXVpcmVMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CiAJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5wbGF0Zm9ybS5yaXNjLm1lbV9tYnhfbG9jayk7Ci0JaWYgKGRpYjkwMDBfZndfbWVtbWJ4X3N5bmMoc3RhdGUsIEZFX1NZTkNfQ0hBTk5FTCkgPCAwKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoZGliOTAwMF9md19tZW1tYnhfc3luYyhzdGF0ZSwgRkVfU1lOQ19DSEFOTkVMKSA8IDApIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CiAJZGliOTAwMF9yaXNjX21lbV9yZWFkKHN0YXRlLCBGRV9NTV9SX0ZFX01PTklUT1IsICh1OCAqKSBjLCAxNiAqIDIpOwogCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+cGxhdGZvcm0ucmlzYy5tZW1fbWJ4X2xvY2spOwogCiAJKnVuYyA9IGNbMTJdOwotCXJldHVybiAwOworCitlcnJvcjoKKwlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIGludCBkaWI5MDAwX2kyY19lbnVtZXJhdGlvbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgaW50IG5vX29mX2RlbW9kcywgdTggZGVmYXVsdF9hZGRyLCB1OCBmaXJzdF9hZGRyKQpAQCAtMjMyMiw2ICsyNDQ1LDEwIEBACiAJRGliSW5pdExvY2soJnN0LT5wbGF0Zm9ybS5yaXNjLm1ieF9sb2NrKTsKIAlEaWJJbml0TG9jaygmc3QtPnBsYXRmb3JtLnJpc2MubWVtX2xvY2spOwogCURpYkluaXRMb2NrKCZzdC0+cGxhdGZvcm0ucmlzYy5tZW1fbWJ4X2xvY2spOworCURpYkluaXRMb2NrKCZzdC0+ZGVtb2RfbG9jayk7CisJc3QtPmdldF9mcm9udGVuZF9pbnRlcm5hbCA9IDA7CisKKwlzdC0+cGlkX2N0cmxfaW5kZXggPSAtMjsKIAogCXN0LT5mZVswXSA9IGZlOwogCWZlLT5kZW1vZHVsYXRvcl9wcml2ID0gc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGlieDAwMF9jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWJ4MDAwX2NvbW1vbi5jCmluZGV4IGRjNWQxN2EuLjQzYmU3MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWJ4MDAwX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWJ4MDAwX2NvbW1vbi5jCkBAIC0xLDQgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJkaWJ4MDAwX2NvbW1vbi5oIgogCkBAIC0xMCw2ICsxMiwxMyBAQAogCiBzdGF0aWMgaW50IGRpYngwMDBfd3JpdGVfd29yZChzdHJ1Y3QgZGlieDAwMF9pMmNfbWFzdGVyICptc3QsIHUxNiByZWcsIHUxNiB2YWwpCiB7CisJaW50IHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1zdC0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAltc3QtPmkyY193cml0ZV9idWZmZXJbMF0gPSAocmVnID4+IDgpICYgMHhmZjsKIAltc3QtPmkyY193cml0ZV9idWZmZXJbMV0gPSByZWcgJiAweGZmOwogCW1zdC0+aTJjX3dyaXRlX2J1ZmZlclsyXSA9ICh2YWwgPj4gOCkgJiAweGZmOwpAQCAtMjEsMTEgKzMwLDIxIEBACiAJbXN0LT5tc2dbMF0uYnVmID0gbXN0LT5pMmNfd3JpdGVfYnVmZmVyOwogCW1zdC0+bXNnWzBdLmxlbiA9IDQ7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAxKSAhPSAxID8gLUVSRU1PVEVJTyA6IDA7CisJcmV0ID0gaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAxKSAhPSAxID8gLUVSRU1PVEVJTyA6IDA7CisJbXV0ZXhfdW5sb2NrKCZtc3QtPmkyY19idWZmZXJfbG9jayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTE2IGRpYngwMDBfcmVhZF93b3JkKHN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCwgdTE2IHJlZykKIHsKKwl1MTYgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbXN0LT5pMmNfYnVmZmVyX2xvY2spIDwgMCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAwOworCX0KKwogCW1zdC0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZyA+PiA4OwogCW1zdC0+aTJjX3dyaXRlX2J1ZmZlclsxXSA9IHJlZyAmIDB4ZmY7CiAKQEAgLTQyLDcgKzYxLDEwIEBACiAJaWYgKGkyY190cmFuc2Zlcihtc3QtPmkyY19hZGFwLCBtc3QtPm1zZywgMikgIT0gMikKIAkJZHByaW50aygiaTJjIHJlYWQgZXJyb3Igb24gJWQiLCByZWcpOwogCi0JcmV0dXJuIChtc3QtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IG1zdC0+aTJjX3JlYWRfYnVmZmVyWzFdOworCXJldCA9IChtc3QtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IG1zdC0+aTJjX3JlYWRfYnVmZmVyWzFdOworCW11dGV4X3VubG9jaygmbXN0LT5pMmNfYnVmZmVyX2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkaWJ4MDAwX2lzX2kyY19kb25lKHN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCkKQEAgLTI1Nyw2ICsyNzksNyBAQAogCQkJCQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSwgaW50IG51bSkKIHsKIAlzdHJ1Y3QgZGlieDAwMF9pMmNfbWFzdGVyICptc3QgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKKwlpbnQgcmV0OwogCiAJaWYgKG51bSA+IDMyKSB7CiAJCWRwcmludGsoIiVzOiB0b28gbXVjaCBJMkMgbWVzc2FnZSB0byBiZSB0cmFuc21pdHRlZCAoJWkpLlwKQEAgLTI2NCwxMCArMjg3LDE1IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCW1lbXNldChtc3QtPm1zZywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSAqICgyICsgbnVtKSk7Ci0KIAlkaWJ4MDAwX2kyY19zZWxlY3RfaW50ZXJmYWNlKG1zdCwgRElCWDAwMF9JMkNfSU5URVJGQUNFX0dQSU9fNl83KTsKIAorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1zdC0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQobXN0LT5tc2csIDAsIHNpemVvZihzdHJ1Y3QgaTJjX21zZykgKiAoMiArIG51bSkpOworCiAJLyogb3BlbiB0aGUgZ2F0ZSAqLwogCWRpYngwMDBfaTJjX2dhdGVfY3RybChtc3QsICZtc3QtPmkyY193cml0ZV9idWZmZXJbMF0sIG1zZ1swXS5hZGRyLCAxKTsKIAltc3QtPm1zZ1swXS5hZGRyID0gbXN0LT5pMmNfYWRkcjsKQEAgLTI4Miw3ICszMTAsMTEgQEAKIAltc3QtPm1zZ1tudW0gKyAxXS5idWYgPSAmbXN0LT5pMmNfd3JpdGVfYnVmZmVyWzRdOwogCW1zdC0+bXNnW251bSArIDFdLmxlbiA9IDQ7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAyICsgbnVtKSA9PSAyICsgbnVtID8gbnVtIDogLUVJTzsKKwlyZXQgPSAoaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAyICsgbnVtKSA9PSAyICsgbnVtID8KKwkJCW51bSA6IC1FSU8pOworCisJbXV0ZXhfdW5sb2NrKCZtc3QtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGRpYngwMDBfaTJjX2dhdGVkX2dwaW82N19hbGdvID0gewpAQCAtMjk0LDYgKzMyNiw3IEBACiAJCQkJCXN0cnVjdCBpMmNfbXNnIG1zZ1tdLCBpbnQgbnVtKQogewogCXN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCA9IGkyY19nZXRfYWRhcGRhdGEoaTJjX2FkYXApOworCWludCByZXQ7CiAKIAlpZiAobnVtID4gMzIpIHsKIAkJZHByaW50aygiJXM6IHRvbyBtdWNoIEkyQyBtZXNzYWdlIHRvIGJlIHRyYW5zbWl0dGVkICglaSkuXApAQCAtMzAxLDEwICszMzQsMTQgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KG1zdC0+bXNnLCAwLCBzaXplb2Yoc3RydWN0IGkyY19tc2cpICogKDIgKyBudW0pKTsKLQogCWRpYngwMDBfaTJjX3NlbGVjdF9pbnRlcmZhY2UobXN0LCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIpOwogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbXN0LT5pMmNfYnVmZmVyX2xvY2spIDwgMCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZW1zZXQobXN0LT5tc2csIDAsIHNpemVvZihzdHJ1Y3QgaTJjX21zZykgKiAoMiArIG51bSkpOworCiAJLyogb3BlbiB0aGUgZ2F0ZSAqLwogCWRpYngwMDBfaTJjX2dhdGVfY3RybChtc3QsICZtc3QtPmkyY193cml0ZV9idWZmZXJbMF0sIG1zZ1swXS5hZGRyLCAxKTsKIAltc3QtPm1zZ1swXS5hZGRyID0gbXN0LT5pMmNfYWRkcjsKQEAgLTMxOSw3ICszNTYsMTAgQEAKIAltc3QtPm1zZ1tudW0gKyAxXS5idWYgPSAmbXN0LT5pMmNfd3JpdGVfYnVmZmVyWzRdOwogCW1zdC0+bXNnW251bSArIDFdLmxlbiA9IDQ7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAyICsgbnVtKSA9PSAyICsgbnVtID8gbnVtIDogLUVJTzsKKwlyZXQgPSAoaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAyICsgbnVtKSA9PSAyICsgbnVtID8KKwkJCW51bSA6IC1FSU8pOworCW11dGV4X3VubG9jaygmbXN0LT5pMmNfYnVmZmVyX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBkaWJ4MDAwX2kyY19nYXRlZF90dW5lcl9hbGdvID0gewpAQCAtMzkwLDggKzQzMCwxOCBAQAogaW50IGRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKHN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCwgdTE2IGRldmljZV9yZXYsCiAJCQkJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgdTggaTJjX2FkZHIpCiB7Ci0JdTggdHhbNF07Ci0Jc3RydWN0IGkyY19tc2cgbSA9IHsuYWRkciA9IGkyY19hZGRyID4+IDEsLmJ1ZiA9IHR4LC5sZW4gPSA0IH07CisJaW50IHJldDsKKworCW11dGV4X2luaXQoJm1zdC0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZtc3QtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbXNldChtc3QtPm1zZywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CisJbXN0LT5tc2dbMF0uYWRkciA9IGkyY19hZGRyID4+IDE7CisJbXN0LT5tc2dbMF0uZmxhZ3MgPSAwOworCW1zdC0+bXNnWzBdLmJ1ZiA9IG1zdC0+aTJjX3dyaXRlX2J1ZmZlcjsKKwltc3QtPm1zZ1swXS5sZW4gPSA0OwogCiAJbXN0LT5kZXZpY2VfcmV2ID0gZGV2aWNlX3JldjsKIAltc3QtPmkyY19hZGFwID0gaTJjX2FkYXA7CkBAIC00MzEsOSArNDgxLDEyIEBACiAJCQkJIkRpQlgwMDA6IGNvdWxkIG5vdCBpbml0aWFsaXplIHRoZSBtYXN0ZXIgaTJjX2FkYXB0ZXJcbiIpOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgaTJjLW1hc3RlciBieSBjbG9zaW5nIHRoZSBnYXRlICovCi0JZGlieDAwMF9pMmNfZ2F0ZV9jdHJsKG1zdCwgdHgsIDAsIDApOworCWRpYngwMDBfaTJjX2dhdGVfY3RybChtc3QsIG1zdC0+aTJjX3dyaXRlX2J1ZmZlciwgMCwgMCk7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKGkyY19hZGFwLCAmbSwgMSkgPT0gMTsKKwlyZXQgPSAoaTJjX3RyYW5zZmVyKGkyY19hZGFwLCBtc3QtPm1zZywgMSkgPT0gMSk7CisJbXV0ZXhfdW5sb2NrKCZtc3QtPmkyY19idWZmZXJfbG9jayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBFWFBPUlRfU1lNQk9MKGRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWJ4MDAwX2NvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYngwMDBfY29tbW9uLmgKaW5kZXggZjAzMTE2NS4uNWUwMTE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYngwMDBfY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYngwMDBfY29tbW9uLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMzRdOwogCXU4IGkyY193cml0ZV9idWZmZXJbOF07CiAJdTggaTJjX3JlYWRfYnVmZmVyWzJdOworCXN0cnVjdCBtdXRleCBpMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBleHRlcm4gaW50IGRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKHN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhkX2hhcmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhkX2hhcmQuYwppbmRleCAyMjM4YmYwLi44OGU0NmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4ZF9oYXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGRfaGFyZC5jCkBAIC04ODksMTAgKzg4OSwxNSBAQAogCQkJdTMyIFIyID0gc3RhdGUtPmlmX2FnY19jZmcuUjI7CiAJCQl1MzIgUjMgPSBzdGF0ZS0+aWZfYWdjX2NmZy5SMzsKIAotCQkJdTMyIFZtYXggPSAoMzMwMCAqIFIyKSAvIChSMSArIFIyKTsKLQkJCXUzMiBScGFyID0gKFIyICogUjMpIC8gKFIzICsgUjIpOwotCQkJdTMyIFZtaW4gPSAoMzMwMCAqIFJwYXIpIC8gKFIxICsgUnBhcik7Ci0JCQl1MzIgVm91dCA9IFZtaW4gKyAoKFZtYXggLSBWbWluKSAqIFZhbHVlKSAvIDEwMjQ7CisJCQl1MzIgVm1heCwgUnBhciwgVm1pbiwgVm91dDsKKworCQkJaWYgKFIyID09IDAgJiYgKFIxID09IDAgfHwgUjMgPT0gMCkpCisJCQkJcmV0dXJuIDA7CisKKwkJCVZtYXggPSAoMzMwMCAqIFIyKSAvIChSMSArIFIyKTsKKwkJCVJwYXIgPSAoUjIgKiBSMykgLyAoUjMgKyBSMik7CisJCQlWbWluID0gKDMzMDAgKiBScGFyKSAvIChSMSArIFJwYXIpOworCQkJVm91dCA9IFZtaW4gKyAoKFZtYXggLSBWbWluKSAqIFZhbHVlKSAvIDEwMjQ7CiAKIAkJCSpwVmFsdWUgPSBWb3V0OwogCQl9CkBAIC05MjYsMTYgKzkzMSwxNSBAQAogCQkJICAgICBjb25zdCB1OCAqcE1DSW1hZ2UsIHUzMiBMZW5ndGgpCiB7CiAJdTggKnBTcmM7Ci0JdTE2IEZsYWdzOwogCXUzMiBBZGRyZXNzOwogCXUxNiBuQmxvY2tzOwogCXUxNiBCbG9ja1NpemU7Ci0JdTE2IEJsb2NrQ1JDOwogCXUzMiBvZmZzZXQgPSAwOwogCWludCBpLCBzdGF0dXMgPSAwOwogCiAJcFNyYyA9ICh1OCAqKSBwTUNJbWFnZTsKLQlGbGFncyA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsKKwkvKiBXZSdyZSBub3QgdXNpbmcgRmxhZ3MgKi8KKwkvKiBGbGFncyA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsgKi8KIAlwU3JjICs9IHNpemVvZih1MTYpOwogCW9mZnNldCArPSBzaXplb2YodTE2KTsKIAluQmxvY2tzID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOwpAQCAtOTUyLDExICs5NTYsMTMgQEAKIAkJcFNyYyArPSBzaXplb2YodTE2KTsKIAkJb2Zmc2V0ICs9IHNpemVvZih1MTYpOwogCi0JCUZsYWdzID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOworCQkvKiBXZSdyZSBub3QgdXNpbmcgRmxhZ3MgKi8KKwkJLyogdTE2IEZsYWdzID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOyAqLwogCQlwU3JjICs9IHNpemVvZih1MTYpOwogCQlvZmZzZXQgKz0gc2l6ZW9mKHUxNik7CiAKLQkJQmxvY2tDUkMgPSAocFNyY1swXSA8PCA4KSB8IHBTcmNbMV07CisJCS8qIFdlJ3JlIG5vdCB1c2luZyBCbG9ja0NSQyAqLworCQkvKiB1MTYgQmxvY2tDUkMgPSAocFNyY1swXSA8PCA4KSB8IHBTcmNbMV07ICovCiAJCXBTcmMgKz0gc2l6ZW9mKHUxNik7CiAJCW9mZnNldCArPSBzaXplb2YodTE2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfaGFyZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfaGFyZC5jCmluZGV4IDQxYjA4MzguLmY2NDMxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX2hhcmQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19oYXJkLmMKQEAgLTYyMTEsNiArNjIxMSwxNCBAQAogCXUzMiBJRjsKIAogCWRwcmludGsoMSwgIlxuIik7CisKKwlpZiAoIWZlLT5vcHMudHVuZXJfb3BzLmdldF9pZl9mcmVxdWVuY3kpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiZHJ4azogRXJyb3I6IGdldF9pZl9mcmVxdWVuY3koKSBub3QgZGVmaW5lZCBhdCB0dW5lci4gQ2FuJ3Qgd29yayB3aXRob3V0IGl0IVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCiAJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKIAkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykKQEAgLTYyMTgsNyArNjIyNiw3IEBACiAJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKIAkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKIAlzdGF0ZS0+cGFyYW0gPSAqcDsKLQlmZS0+b3BzLnR1bmVyX29wcy5nZXRfZnJlcXVlbmN5KGZlLCAmSUYpOworCWZlLT5vcHMudHVuZXJfb3BzLmdldF9pZl9mcmVxdWVuY3koZmUsICZJRik7CiAJU3RhcnQoc3RhdGUsIDAsIElGKTsKIAogCS8qIHByaW50ayhLRVJOX0RFQlVHICJkcnhrOiAlcyBJRj0lZCBkb25lXG4iLCBfX2Z1bmNfXywgSUYpOyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0OTEzeC1mZS1wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXQ5MTN4LWZlLXByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZmYjRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0OTEzeC1mZS1wcml2LmgKQEAgLTAsMCArMSwzMzYgQEAKKworc3RydWN0IGl0OTEzeHNldCB7CXUzMiBwcm87CisJCQl1MzIgYWRkcmVzczsKKwkJCXU4IHJlZ1sxNV07CisJCQl1OCBjb3VudDsKK307CisKK3N0cnVjdCBhZGN0YWJsZSB7CXUzMiBhZGNGcmVxdWVuY3k7CisJCQl1MzIgYmFuZHdpZHRoOworCQkJdTMyIGNvZWZmXzFfMjA0ODsKKwkJCXUzMiBjb2VmZl8xXzQwOTY7CisJCQl1MzIgY29lZmZfMV84MTkxOworCQkJdTMyIGNvZWZmXzFfODE5MjsKKwkJCXUzMiBjb2VmZl8xXzgxOTM7CisJCQl1MzIgY29lZmZfMl8yazsKKwkJCXUzMiBjb2VmZl8yXzRrOworCQkJdTMyIGNvZWZmXzJfOGs7CisJCQl1MTYgYmZzZmN3X2ZmdGlueF9yYXRpbzsKKwkJCXUxNiBmZnRpbnhfYmZzZmN3X3JhdGlvOworfTsKKworLyogY2xvY2sgYW5kIGNvZWZmIHRhYmxlcyBvbmx5IHRhYmxlIDMgaXMgdXNlZCB3aXRoIElUOTEzNyovCisvKiBUT0RPIG90aGVyIHRhYmxlcyByZWxhdGUgQUY5MDM1IG1heSBiZSByZW1vdmVkICovCitzdGF0aWMgc3RydWN0IGFkY3RhYmxlIHRhYjFbXSA9IHsKKwl7CTIwMTU2MjUwLCBCQU5EV0lEVEhfNl9NSFosCisJCTB4MDJiOGJhNmUsIDB4MDE1YzVkMzcsIDB4MDBhZTM0MGQsIDB4MDBhZTJlOWIsIDB4MDBhZTI5MmEsCisJCTB4MDE1YzVkMzcsIDB4MDBhZTJlOWIsIDB4MDA1NzE3NGUsIDB4MDJmMSwgMHgwMTVjCX0sCisJewkyMDE1NjI1MCwgQkFORFdJRFRIXzdfTUhaLAorCQkweDAzMmNkOTgwLCAweDAxOTY2Y2MwLCAweDAwY2IzY2JhLCAweDAwY2IzNjYwLCAweDAwY2IzMDA3LAorCQkweDAxOTY2Y2MwLCAweDAwY2IzNjYwLCAweDAwNjU5YjMwLCAweDAyODUsIDB4MDE5Ngl9LAorCXsJMjAxNTYyNTAsIEJBTkRXSURUSF84X01IWiwKKwkJMHgwM2EwZjg5MywgMHgwMWQwN2M0OSwgMHgwMGU4NDU2NywgMHgwMGU4M2UyNSwgMHgwMGU4MzZlMywKKwkJMHgwMWQwN2M0OSwgMHgwMGU4M2UyNSwgMHgwMDc0MWYxMiwgMHgwMjM0LCAweDAxZDAJfSwKKwl7CTIwMTU2MjUwLCBCQU5EV0lEVEhfNV9NSFosCisJCTB4MDI0NDliNWMsIDB4MDEyMjRkYWUsIDB4MDA5MTJiNjAsIDB4MDA5MTI2ZDcsIDB4MDA5MTIyNGUsCisJCTB4MDEyMjRkYWUsIDB4MDA5MTI2ZDcsIDB4MDA0ODkzNmIsIDB4MDM4NywgMHgwMTIyCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWRjdGFibGUgdGFiMltdID0geworCXsJMjAxODc1MDAsIEJBTkRXSURUSF82X01IWiwKKwkJMHgwMmI3YTY1NCwgMHgwMTViZDMyYSwgMHgwMGFkZWYwNCwgMHgwMGFkZTk5NSwgMHgwMGFkZTQyNiwKKwkJMHgwMTViZDMyYSwgMHgwMGFkZTk5NSwgMHgwMDU2ZjRjYSwgMHgwMmYyLCAweDAxNWMJfSwKKwl7CTIwMTg3NTAwLCBCQU5EV0lEVEhfN19NSFosCisJCTB4MDMyYjk3NjEsIDB4MDE5NWNiYjEsIDB4MDBjYWVjMzAsIDB4MDBjYWU1ZDgsIDB4MDBjYWRmODEsCisJCTB4MDE5NWNiYjEsIDB4MDBjYWU1ZDgsIDB4MDA2NTcyZWMsIDB4MDI4NiwgMHgwMTk2CX0sCisJewkyMDE4NzUwMCwgQkFORFdJRFRIXzhfTUhaLAorCQkweDAzOWY4ODZmLCAweDAxY2ZjNDM4LCAweDAwZTdlOTViLCAweDAwZTdlMjFjLCAweDAwZTdkYWRkLAorCQkweDAxY2ZjNDM4LCAweDAwZTdlMjFjLCAweDAwNzNmMTBlLCAweDAyMzUsIDB4MDFkMAl9LAorCXsJMjAxODc1MDAsIEJBTkRXSURUSF81X01IWiwKKwkJMHgwMjQzYjU0NiwgMHgwMTIxZGFhMywgMHgwMDkwZjFkOSwgMHgwMDkwZWQ1MSwgMHgwMDkwZThjYSwKKwkJMHgwMTIxZGFhMywgMHgwMDkwZWQ1MSwgMHgwMDQ4NzZhOSwgMHgwMzg4LCAweDAxMjIJfQorCit9OworCitzdGF0aWMgc3RydWN0IGFkY3RhYmxlIHRhYjNbXSA9IHsKKwl7CTIwMjUwMDAwLCBCQU5EV0lEVEhfNl9NSFosCisJCTB4MDJiNTgwYWQsIDB4MDE1YWMwNTcsIDB4MDBhZDY1OTcsIDB4MDBhZDYwMmIsIDB4MDBhZDVhYzEsCisJCTB4MDE1YWMwNTcsIDB4MDBhZDYwMmIsIDB4MDA1NmIwMTYsIDB4MDJmNCwgMHgwMTViCX0sCisJewkyMDI1MDAwMCwgQkFORFdJRFRIXzdfTUhaLAorCQkweDAzMjkxNjIwLCAweDAxOTQ4YjEwLCAweDAwY2E0YmRhLCAweDAwY2E0NTg4LCAweDAwY2EzZjM2LAorCQkweDAxOTQ4YjEwLCAweDAwY2E0NTg4LCAweDAwNjUyMmM0LCAweDAyODgsIDB4MDE5NQl9LAorCXsJMjAyNTAwMDAsIEJBTkRXSURUSF84X01IWiwKKwkJMHgwMzljYWI5MiwgMHgwMWNlNTVjOSwgMHgwMGU3MzIxZSwgMHgwMGU3MmFlNCwgMHgwMGU3MjNhYiwKKwkJMHgwMWNlNTVjOSwgMHgwMGU3MmFlNCwgMHgwMDczOTU3MiwgMHgwMjM3LCAweDAxY2UJfSwKKwl7CTIwMjUwMDAwLCBCQU5EV0lEVEhfNV9NSFosCisJCTB4MDI0MWViM2IsIDB4MDEyMGY1OWUsIDB4MDA5MDdmNTMsIDB4MDA5MDdhY2YsIDB4MDA5MDc2NGIsCisJCTB4MDEyMGY1OWUsIDB4MDA5MDdhY2YsIDB4MDA0ODNkNjcsIDB4MDM4YiwgMHgwMTIxCX0KKworfTsKKworc3RhdGljIHN0cnVjdCBhZGN0YWJsZSB0YWI0W10gPSB7CisJewkyMDU4MzMzMywgQkFORFdJRFRIXzZfTUhaLAorCQkweDAyYWE0NTk4LCAweDAxNTUyMmNjLCAweDAwYWE5NmJiLCAweDAwYWE5MTY2LCAweDAwYWE4YzEyLAorCQkweDAxNTUyMmNjLCAweDAwYWE5MTY2LCAweDAwNTU0OGIzLCAweDAzMDAsIDB4MDE1NQl9LAorCXsJMjA1ODMzMzMsIEJBTkRXSURUSF83X01IWiwKKwkJMHgwMzFiZmJkYywgMHgwMThkZmRlZSwgMHgwMGM3MDUyZiwgMHgwMGM2ZmVmNywgMHgwMGM2ZjhiZiwKKwkJMHgwMThkZmRlZSwgMHgwMGM2ZmVmNywgMHgwMDYzN2Y3YiwgMHgwMjkzLCAweDAxOGUJfSwKKwl7CTIwNTgzMzMzLCBCQU5EV0lEVEhfOF9NSFosCisJCTB4MDM4ZGIyMWYsIDB4MDFjNmQ5MTAsIDB4MDBlMzczYTMsIDB4MDBlMzZjODgsIDB4MDBlMzY1NmQsCisJCTB4MDFjNmQ5MTAsIDB4MDBlMzZjODgsIDB4MDA3MWI2NDQsIDB4MDI0MCwgMHgwMWM3CX0sCisJewkyMDU4MzMzMywgQkFORFdJRFRIXzVfTUhaLAorCQkweDAyMzg4ZjU0LCAweDAxMWM0N2FhLCAweDAwOGUyODQ2LCAweDAwOGUyM2Q1LCAweDAwOGUxZjY0LAorCQkweDAxMWM0N2FhLCAweDAwOGUyM2Q1LCAweDAwNDcxMWVhLCAweDAzOWEsIDB4MDExYwl9CisKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWRjdGFibGUgdGFiNVtdID0geworCXsJMjA0MTY2NjcsIEJBTkRXSURUSF82X01IWiwKKwkJMHgwMmFmZDc2NSwgMHgwMTU3ZWJiMywgMHgwMGFiZmIzOSwgMHgwMGFiZjVkOSwgMHgwMGFiZjA3YSwKKwkJMHgwMTU3ZWJiMywgMHgwMGFiZjVkOSwgMHgwMDU1ZmFlZCwgMHgwMmZhLCAweDAxNTgJfSwKKwl7CTIwNDE2NjY3LCBCQU5EV0lEVEhfN19NSFosCisJCTB4MDMyMjdiNGIsIDB4MDE5MTNkYTYsIDB4MDBjOGE1MTgsIDB4MDBjODllZDMsIDB4MDBjODk4OGUsCisJCTB4MDE5MTNkYTYsIDB4MDBjODllZDMsIDB4MDA2NDRmNjksIDB4MDI4ZCwgMHgwMTkxCX0sCisJewkyMDQxNjY2NywgQkFORFdJRFRIXzhfTUhaLAorCQkweDAzOTUxZjMyLCAweDAxY2E4Zjk5LCAweDAwZTU0ZWY3LCAweDAwZTU0N2NjLCAweDAwZTU0MGEyLAorCQkweDAxY2E4Zjk5LCAweDAwZTU0N2NjLCAweDAwNzJhM2U2LCAweDAyM2MsIDB4MDFjYgl9LAorCXsJMjA0MTY2NjcsIEJBTkRXSURUSF81X01IWiwKKwkJMHgwMjNkMzM3ZiwgMHgwMTFlOTljMCwgMHgwMDhmNTE1YSwgMHgwMDhmNGNlMCwgMHgwMDhmNDg2NSwKKwkJMHgwMTFlOTljMCwgMHgwMDhmNGNlMCwgMHgwMDQ3YTY3MCwgMHgwMzkzLCAweDAxMWYJfQorCit9OworCitzdGF0aWMgc3RydWN0IGFkY3RhYmxlIHRhYjZbXSA9IHsKKwl7CTIwNDgwMDAwLCBCQU5EV0lEVEhfNl9NSFosCisJCTB4MDJhZGI2ZGIsIDB4MDE1NmRiNmUsIDB4MDBhYjczMTIsIDB4MDBhYjZkYjcsIDB4MDBhYjY4NWMsCisJCTB4MDE1NmRiNmUsIDB4MDBhYjZkYjcsIDB4MDA1NWI2ZGIsIDB4MDJmZCwgMHgwMTU3CX0sCisJewkyMDQ4MDAwMCwgQkFORFdJRFRIXzdfTUhaLAorCQkweDAzMjAwMDAwLCAweDAxOTAwMDAwLCAweDAwYzgwNjQwLCAweDAwYzgwMDAwLCAweDAwYzdmOWMwLAorCQkweDAxOTAwMDAwLCAweDAwYzgwMDAwLCAweDAwNjQwMDAwLCAweDAyOGYsIDB4MDE5MAl9LAorCXsJMjA0ODAwMDAsIEJBTkRXSURUSF84X01IWiwKKwkJMHgwMzkyNDkyNSwgMHgwMWM5MjQ5MiwgMHgwMGU0OTk2ZSwgMHgwMGU0OTI0OSwgMHgwMGU0OGIyNSwKKwkJMHgwMWM5MjQ5MiwgMHgwMGU0OTI0OSwgMHgwMDcyNDkyNSwgMHgwMjNkLCAweDAxYzkJfSwKKwl7CTIwNDgwMDAwLCBCQU5EV0lEVEhfNV9NSFosCisJCTB4MDIzYjZkYjcsIDB4MDExZGI2ZGIsIDB4MDA4ZWRmZTUsIDB4MDA4ZWRiNmUsIDB4MDA4ZWQ2ZjcsCisJCTB4MDExZGI2ZGIsIDB4MDA4ZWRiNmUsIDB4MDA0NzZkYjcsIDB4MDM5NiwgMHgwMTFlCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWRjdGFibGUgdGFiN1tdID0geworCXsJMjA1MDAwMDAsIEJBTkRXSURUSF82X01IWiwKKwkJMHgwMmFkMGI5OSwgMHgwMTU2ODVjYywgMHgwMGFiNDg0MCwgMHgwMGFiNDJlNiwgMHgwMGFiM2Q4YywKKwkJMHgwMTU2ODVjYywgMHgwMGFiNDJlNiwgMHgwMDU1YTE3MywgMHgwMmZkLCAweDAxNTcJfSwKKwl7CTIwNTAwMDAwLCBCQU5EV0lEVEhfN19NSFosCisJCTB4MDMxZjM4MzIsIDB4MDE4ZjljMTksIDB4MDBjN2Q0NGIsIDB4MDBjN2NlMGMsIDB4MDBjN2M3Y2UsCisJCTB4MDE4ZjljMTksIDB4MDBjN2NlMGMsIDB4MDA2M2U3MDYsIDB4MDI5MCwgMHgwMTkwCX0sCisJewkyMDUwMDAwMCwgQkFORFdJRFRIXzhfTUhaLAorCQkweDAzOTE2NGNiLCAweDAxYzhiMjY2LCAweDAwZTQ2MDU2LCAweDAwZTQ1OTMzLCAweDAwZTQ1MjEwLAorCQkweDAxYzhiMjY2LCAweDAwZTQ1OTMzLCAweDAwNzIyYzk5LCAweDAyM2UsIDB4MDFjOQl9LAorCXsJMjA1MDAwMDAsIEJBTkRXSURUSF81X01IWiwKKwkJMHgwMjNhZGVmZiwgMHgwMTFkNmY4MCwgMHgwMDhlYmMzNiwgMHgwMDhlYjdjMCwgMHgwMDhlYjM0YSwKKwkJMHgwMTFkNmY4MCwgMHgwMDhlYjdjMCwgMHgwMDQ3NWJlMCwgMHgwMzk2LCAweDAxMWQJfQorCit9OworCitzdGF0aWMgc3RydWN0IGFkY3RhYmxlIHRhYjhbXSA9IHsKKwl7CTIwNjI1MDAwLCBCQU5EV0lEVEhfNl9NSFosCisJCTB4MDJhOGU0YmQsIDB4MDE1NDcyNWUsIDB4MDBhYTNlODEsIDB4MDBhYTM5MmYsIDB4MDBhYTMzZGUsCisJCTB4MDE1NDcyNWUsIDB4MDBhYTM5MmYsIDB4MDA1NTFjOTgsIDB4MDMwMiwgMHgwMTU0CX0sCisJewkyMDYyNTAwMCwgQkFORFdJRFRIXzdfTUhaLAorCQkweDAzMWE2MDMyLCAweDAxOGQzMDE5LCAweDAwYzY5ZTQxLCAweDAwYzY5ODBjLCAweDAwYzY5MWQ4LAorCQkweDAxOGQzMDE5LCAweDAwYzY5ODBjLCAweDAwNjM0YzA2LCAweDAyOTQsIDB4MDE4ZAl9LAorCXsJMjA2MjUwMDAsIEJBTkRXSURUSF84X01IWiwKKwkJMHgwMzhiZGJhNiwgMHgwMWM1ZWRkMywgMHgwMGUyZmUwMiwgMHgwMGUyZjZlYSwgMHgwMGUyZWZkMiwKKwkJMHgwMWM1ZWRkMywgMHgwMGUyZjZlYSwgMHgwMDcxN2I3NSwgMHgwMjQyLCAweDAxYzYJfSwKKwl7CTIwNjI1MDAwLCBCQU5EV0lEVEhfNV9NSFosCisJCTB4MDIzNzY5NDgsIDB4MDExYmI0YTQsIDB4MDA4ZGRlYzEsIDB4MDA4ZGRhNTIsIDB4MDA4ZGQ1ZTMsCisJCTB4MDExYmI0YTQsIDB4MDA4ZGRhNTIsIDB4MDA0NmVkMjksIDB4MDM5YywgMHgwMTFjCX0KKworfTsKKworc3RydWN0IHRhYmxlIHsKKwkJdTMyIHh0YWw7CisJCXN0cnVjdCBhZGN0YWJsZSAqdGFibGU7Cit9OworCitzdGF0aWMgc3RydWN0IHRhYmxlIGZlX2Nsb2NrVGFibGVbXSA9IHsKKwkJezEyMDAwMDAwLCB0YWIzfSwJLyogRlBHQSAgICAgKi8KKwkJezE2Mzg0MDAwLCB0YWI2fSwJLyogMTYuMzhNSHogKi8KKwkJezIwNDgwMDAwLCB0YWI2fSwJLyogMjAuNDhNSHogKi8KKwkJezM2MDAwMDAwLCB0YWIzfSwJLyogMzYuMDBNSHogKi8KKwkJezMwMDAwMDAwLCB0YWIxfSwJLyogMzAuMDBNSHogKi8KKwkJezI2MDAwMDAwLCB0YWI0fSwJLyogMjYuMDBNSHogKi8KKwkJezI4MDAwMDAwLCB0YWI1fSwJLyogMjguMDBNSHogKi8KKwkJezMyMDAwMDAwLCB0YWI3fSwJLyogMzIuMDBNSHogKi8KKwkJezM0MDAwMDAwLCB0YWIyfSwJLyogMzQuMDBNSHogKi8KKwkJezI0MDAwMDAwLCB0YWIxfSwJLyogMjQuMDBNSHogKi8KKwkJezIyMDAwMDAwLCB0YWI4fSwJLyogMjIuMDBNSHogKi8KKwkJezEyMDAwMDAwLCB0YWIzfQkvKiAxMi4wME1IeiAqLworfTsKKworLyogZmUgZ2V0ICovCitmZV9jb2RlX3JhdGVfdCBmZV9jb2RlW10gPSB7CisJRkVDXzFfMiwKKwlGRUNfMl8zLAorCUZFQ18zXzQsCisJRkVDXzVfNiwKKwlGRUNfN184LAorCUZFQ19OT05FLAorfTsKKworZmVfZ3VhcmRfaW50ZXJ2YWxfdCBmZV9naVtdID0geworCUdVQVJEX0lOVEVSVkFMXzFfMzIsCisJR1VBUkRfSU5URVJWQUxfMV8xNiwKKwlHVUFSRF9JTlRFUlZBTF8xXzgsCisJR1VBUkRfSU5URVJWQUxfMV80LAorfTsKKworZmVfaGllcmFyY2h5X3QgZmVfaGlbXSA9IHsKKwlISUVSQVJDSFlfTk9ORSwKKwlISUVSQVJDSFlfMSwKKwlISUVSQVJDSFlfMiwKKwlISUVSQVJDSFlfNCwKK307CisKK2ZlX3RyYW5zbWl0X21vZGVfdCBmZV9tb2RlW10gPSB7CisJVFJBTlNNSVNTSU9OX01PREVfMkssCisJVFJBTlNNSVNTSU9OX01PREVfOEssCisJVFJBTlNNSVNTSU9OX01PREVfNEssCit9OworCitmZV9tb2R1bGF0aW9uX3QgZmVfY29uW10gPSB7CisJUVBTSywKKwlRQU1fMTYsCisJUUFNXzY0LAorfTsKKworLyogU3RhbmRhcmQgZGVtb2R1bGF0b3IgZnVuY3Rpb25zICovCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBzZXRfc29sb19mZVtdID0geworCXtQUk9fTElOSywgRFZCVF9JTlRFTiwgezB4MDR9LCAweDAxfSwKKwl7UFJPX0xJTkssIERWQlRfRU5BQkxFLCB7MHgwNX0sIDB4MDF9LAorCXtQUk9fRE1PRCwgTVAySUZfTVBFR19QQVJfTU9ERSwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0xJTkssIEhPU1RCX01QRUdfU0VSX01PREUsIHsweDAwfSwgMHgwMX0sCisJe1BST19MSU5LLCBIT1NUQl9NUEVHX1BBUl9NT0RFLCB7MHgwMH0sIDB4MDF9LAorCXtQUk9fRE1PRCwgRENBX1VQUEVSX0NISVAsIHsweDAwfSwgMHgwMX0sCisJe1BST19MSU5LLCBIT1NUQl9EQ0FfVVBQRVIsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCBEQ0FfTE9XRVJfQ0hJUCwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0xJTkssIEhPU1RCX0RDQV9MT1dFUiwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIERDQV9QTEFUQ0gsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCBEQ0FfRlBHQV9MQVRDSCwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIERDQV9TVEFORF9BTE9ORSwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIERDQV9FTkFCTEUsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCBNUDJJRl9NUEVHX1BBUl9NT0RFLCB7MHgwMH0sIDB4MDF9LAorCXtQUk9fRE1PRCwgQkZTX0ZDVywgezB4MDAsIDB4MDAsIDB4MDB9LCAweDAzfSwKKwl7MHhmZiwgMHgwMDAwLCB7MHgwMH0sIDB4MDB9LCAvKiBUZXJtaW5hdGluZyBFbnRyeSAqLworfTsKKworCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBpbml0XzFbXSA9IHsKKwl7UFJPX0xJTkssIExPQ0szX09VVCwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0xJTkssIFBBRE1JU0NEUlNSLCB7MHgwMX0sIDB4MDF9LAorCXtQUk9fTElOSywgUEFETUlTQ0RSMiwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0xJTkssIFBBRE1JU0NEUjQsIHsweDAwfSwgMHgwMX0sIC8qIFBvd2VyIHVwICovCisJe1BST19MSU5LLCBQQURNSVNDRFI4LCB7MHgwMH0sIDB4MDF9LAorCXsweGZmLCAweDAwMDAsIHsweDAwfSwgMHgwMH0gLyogVGVybWluYXRpbmcgRW50cnkgKi8KK307CisKKy8qIC0tLS0tLS0tLUlUOTEzNyAweDM4IHR1bmVyIGluaXQtLS0tLS0tLS0tICovCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBpdDkxMzdfc2V0W10gPSB7CisJe1BST19ETU9ELCAweDAwNDMsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweDAwNDYsIHsweDM4fSwgMHgwMX0sCisJe1BST19ETU9ELCAweDAwNTEsIHsweDAxfSwgMHgwMX0sCisJe1BST19ETU9ELCAweDAwNWYsIHsweDAwLCAweDAwfSwgMHgwMn0sCisJe1BST19ETU9ELCAweDAwNjgsIHsweDBhfSwgMHgwMX0sCisJe1BST19ETU9ELCAweDAwNzAsIHsweDBhLCAweDA1LCAweDAyfSwgMHgwM30sCisJe1BST19ETU9ELCAweDAwNzUsIHsweDhjLCAweDhjLCAweDhjLCAweGM4LCAweDAxfSwgMHgwNX0sCisJe1BST19ETU9ELCAweDAwN2UsIHsweDA0LCAweDAwfSwgMHgwMn0sCisJe1BST19ETU9ELCAweDAwODEsIHsJMHgwYSwgMHgxMiwgMHgwMiwgMHgwYSwgMHgwMywgMHhjOCwgMHhiOCwKKwkJCQkweGQwLCAweGMzLCAweDAxCX0sIDB4MGF9LAorCXtQUk9fRE1PRCwgMHgwMDhlLCB7MHgwMX0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMDkyLCB7MHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIDB4MDV9LAorCXtQUk9fRE1PRCwgMHgwMDk5LCB7MHgwMX0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMDliLCB7MHgzYywgMHgyOH0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMDlmLCB7MHhlMSwgMHhjZn0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMGEzLCB7MHgwMSwgMHg1YSwgMHgwMSwgMHgwMX0sIDB4MDR9LAorCXtQUk9fRE1PRCwgMHgwMGE5LCB7MHgwMCwgMHgwMX0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMGIwLCB7MHgwMX0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMGIzLCB7MHgwMiwgMHgzMn0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMGI2LCB7MHgxNH0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMGMwLCB7MHgxMSwgMHgwMCwgMHgwNX0sIDB4MDN9LAorCXtQUk9fRE1PRCwgMHgwMGM0LCB7MHgwMH0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMGM2LCB7MHgxOSwgMHgwMH0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMGNjLCB7MHgyZSwgMHg1MSwgMHgzM30sIDB4MDN9LAorCXtQUk9fRE1PRCwgMHgwMGYzLCB7MHgwNSwgMHg4YywgMHg4Y30sIDB4MDN9LAorCXtQUk9fRE1PRCwgMHgwMGY4LCB7MHgwMywgMHgwNiwgMHgwNn0sIDB4MDN9LAorCXtQUk9fRE1PRCwgMHgwMGZjLCB7CTB4MDIsIDB4MDIsIDB4MDIsIDB4MDksIDB4NTAsIDB4N2IsIDB4NzcsCisJCQkJMHgwMCwgMHgwMiwgMHhjOCwgMHgwNSwgMHg3Ygl9LCAweDBjfSwKKwl7UFJPX0RNT0QsIDB4MDEwOSwgezB4MDJ9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4MDExNSwgezB4MGEsIDB4MDN9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4MDExYSwgezB4YzgsIDB4N2IsIDB4YmMsIDB4YTB9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4MDEyMiwgezB4MDIsIDB4MTgsIDB4YzN9LCAweDAzfSwKKwl7UFJPX0RNT0QsIDB4MDEyNywgezB4MDAsIDB4MDd9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4MDEyYSwgezB4NTMsIDB4NTEsIDB4NGUsIDB4NDN9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4MDEzNywgezB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDZ9LCAweDA1fSwKKwl7UFJPX0RNT0QsIDB4MDEzZCwgezB4MDAsIDB4MDEsIDB4NWIsIDB4Yzh9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4ZjEzMCwgezB4MDR9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjEzMiwgezB4MDR9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE0NCwgezB4MWF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE0NiwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE0YSwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE0YywgezB4MDAsIDB4MDB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjE0ZiwgezB4MDR9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE1OCwgezB4N2Z9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE1YSwgezB4MDAsIDB4MDh9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjE1ZCwgezB4MDMsIDB4MDV9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjE2MywgezB4MDV9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE2NiwgezB4MDEsIDB4NDAsIDB4MGZ9LCAweDAzfSwKKwl7UFJPX0RNT0QsIDB4ZjE3YSwgezB4MDAsIDB4MDB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjE4MywgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE5ZCwgezB4NDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjFiYywgezB4MzYsIDB4MDB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjFjYiwgezB4YTAsIDB4MDF9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjIwNCwgezB4MTB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjIxNCwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjI0YywgezB4ODgsIDB4OTUsIDB4OWEsIDB4OTB9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4ZjI1YSwgezB4MDcsIDB4ZTgsIDB4MDMsIDB4YjAsIDB4MDR9LCAweDA1fSwKKwl7UFJPX0RNT0QsIDB4ZjI3MCwgezB4MDEsIDB4MDIsIDB4MDEsIDB4MDJ9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4ZjQwZSwgezB4MGEsIDB4NDAsIDB4MDh9LCAweDAzfSwKKwl7UFJPX0RNT0QsIDB4ZjU1ZiwgezB4MGF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjU2MSwgezB4MTUsIDB4MjB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjVkZiwgezB4ZmIsIDB4MDB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjVlMywgezB4MDksIDB4MDEsIDB4MDF9LCAweDAzfSwKKwl7UFJPX0RNT0QsIDB4ZjVmOCwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjVmZCwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjYwMCwgewkweDA1LCAweDA4LCAweDBiLCAweDBlLCAweDExLCAweDE0LCAweDE3LAorCQkJCTB4MWYJfSwgMHgwOH0sCisJe1BST19ETU9ELCAweGY2MGUsIHsweDAwLCAweDA0LCAweDMyLCAweDEwfSwgMHgwNH0sCisJe1BST19ETU9ELCAweGY3MDcsIHsweGZjLCAweDAwLCAweDM3LCAweDAwfSwgMHgwNH0sCisJe1BST19ETU9ELCAweGY3OGIsIHsweDAxfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGY4MGYsIHsweDQwLCAweDU0LCAweDVhfSwgMHgwM30sCisJe1BST19ETU9ELCAweGY5MDUsIHsweDAxfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGZiMDYsIHsweDAzfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGZkOGIsIHsweDAwfSwgMHgwMX0sCisJe1BST19MSU5LLCBHUElPSDVfRU4sIHsweDAxfSwgMHgwMX0sCisJe1BST19MSU5LLCBHUElPSDVfT04sIHsweDAxfSwgMHgwMX0sCisJe1BST19MSU5LLCBHUElPSDVfTywgezB4MDB9LCAweDAxfSwKKwl7UFJPX0xJTkssIEdQSU9INV9PLCB7MHgwMX0sIDB4MDF9LAorCXsweGZmLCAweDAwMDAsIHsweDAwfSwgMHgwMH0sIC8qIFRlcm1pbmF0aW5nIEVudHJ5ICovCit9OworCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBpdDkxMzdfdHVuZXJfb2ZmW10gPSB7CisJe1BST19ETU9ELCAweGZiYTgsIHsweDAxfSwgMHgwMX0sIC8qIFR1bmVyIENsb2NrIE9mZiAgKi8KKwl7UFJPX0RNT0QsIDB4ZWM0MCwgezB4MDB9LCAweDAxfSwgLyogUG93ZXIgRG93biBUdW5lciAqLworCXtQUk9fRE1PRCwgMHhlYzAyLCB7MHgzZiwgMHgxZiwgMHgzZiwgMHgzZn0sIDB4MDR9LAorCXtQUk9fRE1PRCwgMHhlYzNmLCB7MHgwMX0sIDB4MDF9LAorCXsweGZmLCAweDAwMDAsIHsweDAwfSwgMHgwMH0sIC8qIFRlcm1pbmF0aW5nIEVudHJ5ICovCit9OworCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBzZXRfaXQ5MTM3X3RlbXBsYXRlW10gPSB7CisJe1BST19ETU9ELCAweGVlMDYsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNTYsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNGMsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNGQsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNGUsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNGYsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNTAsIHsweDAwfSwgMHgwMX0sCisJezB4ZmYsIDB4MDAwMCwgezB4MDB9LCAweDAwfSwgLyogVGVybWluYXRpbmcgRW50cnkgKi8KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXQ5MTN4LWZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXQ5MTN4LWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiZDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pdDkxM3gtZmUuYwpAQCAtMCwwICsxLDgzOSBAQAorLyoKKyAqICBEcml2ZXIgZm9yIGl0OTEzeC1mZSBGcm9udGVuZAorICoKKyAqICB3aXRoIHN1cHBvcnQgZm9yIG9uIGNoaXAgaXQ5MTM3IGludGVncmFsIHR1bmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBNYWxjb2xtIFByaWVzdGxleSAodHZib3hzcHlAZ21haWwuY29tKQorICogIElUOTEzNyBDb3B5cmlnaHQgKEMpIElURSBUZWNoIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS49CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgIml0OTEzeC1mZS5oIgorI2luY2x1ZGUgIml0OTEzeC1mZS1wcml2LmgiCisKK3N0YXRpYyBpbnQgaXQ5MTN4X2RlYnVnOworCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGl0OTEzeF9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8gKG9yLWFibGUpKS4iKTsKKworI2RlZmluZSBkcHJpbnRrKGxldmVsLCBhcmdzLi4uKSBkbyB7IFwKKwlpZiAobGV2ZWwgJiBpdDkxM3hfZGVidWcpIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIml0OTEzeC1mZTogIiBhcmdzKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSAgZHByaW50aygweDAxLCBhcmdzKQorI2RlZmluZSBkZWJ1Z19kYXRhX3NuaXBldChsZXZlbCwgbmFtZSwgcCkgXAorCSAgZHByaW50ayhsZXZlbCwgbmFtZSIgKCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4KSIsIFwKKwkJKnAsICoocCsxKSwgKihwKzIpLCAqKHArMyksICoocCs0KSwgXAorCQkJKihwKzUpLCAqKHArNiksICoocCs3KSk7CisKK3N0cnVjdCBpdDkxM3hfZmVfc3RhdGUgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcDsKKwl1OCBpMmNfYWRkcjsKKwl1MzIgZnJlcXVlbmN5OworCXU4IGFkZjsKKwl1MzIgY3J5c3RhbEZyZXF1ZW5jeTsKKwl1MzIgYWRjRnJlcXVlbmN5OworCXU4IHR1bmVyX3R5cGU7CisJc3RydWN0IGFkY3RhYmxlICp0YWJsZTsKKwlmZV9zdGF0dXNfdCBpdDkxM3hfc3RhdHVzOworCXUxNiB0dW5feHRhbDsKKwl1OCB0dW5fZmRpdjsKKwl1OCB0dW5fY2xrX21vZGU7CisJdTMyIHR1bl9mbl9taW47Cit9OworCitzdGF0aWMgaW50IGl0OTEzeF9yZWFkX3JlZyhzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSwKKwkJdTMyIHJlZywgdTggKmRhdGEsIHU4IGNvdW50KQoreworCWludCByZXQ7CisJdTggcHJvID0gUFJPX0RNT0Q7IC8qIEFsbCByZWFkcyBmcm9tIGRlbW9kdWxhdG9yICovCisJdTggYls0XTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7CisJCXsgLmFkZHIgPSBzdGF0ZS0+aTJjX2FkZHIgKyAocHJvIDw8IDEpLCAuZmxhZ3MgPSAwLAorCQkJLmJ1ZiA9IGIsIC5sZW4gPSBzaXplb2YoYikgfSwKKwkJeyAuYWRkciA9IHN0YXRlLT5pMmNfYWRkciArIChwcm8gPDwgMSksIC5mbGFncyA9IEkyQ19NX1JELAorCQkJLmJ1ZiA9IGRhdGEsIC5sZW4gPSBjb3VudCB9CisJfTsKKwliWzBdID0gKHU4KSByZWcgPj4gMjQ7CisJYlsxXSA9ICh1OCkocmVnID4+IDE2KSAmIDB4ZmY7CisJYlsyXSA9ICh1OCkocmVnID4+IDgpICYgMHhmZjsKKwliWzNdID0gKHU4KSByZWcgJiAweGZmOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmNfYWRhcCwgbXNnLCAyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X3JlYWRfcmVnX3U4KHN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlLCB1MzIgcmVnKQoreworCWludCByZXQ7CisJdTggYlsxXTsKKwlyZXQgPSBpdDkxM3hfcmVhZF9yZWcoc3RhdGUsIHJlZywgJmJbMF0sIHNpemVvZihiKSk7CisJcmV0dXJuIChyZXQgPCAwKSA/IC1FTk9ERVYgOiBiWzBdOworfQorCitzdGF0aWMgaW50IGl0OTEzeF93cml0ZShzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSwKKwkJdTggcHJvLCB1MzIgcmVnLCB1OCBidWZbXSwgdTggY291bnQpCit7CisJdTggYlsyNTZdOworCXN0cnVjdCBpMmNfbXNnIG1zZ1sxXSA9IHsKKwkJeyAuYWRkciA9IHN0YXRlLT5pMmNfYWRkciArIChwcm8gPDwgMSksIC5mbGFncyA9IDAsCisJCSAgLmJ1ZiA9IGIsIC5sZW4gPSBjb3VudCArIDQgfQorCX07CisJaW50IHJldDsKKworCWJbMF0gPSAodTgpIHJlZyA+PiAyNDsKKwliWzFdID0gKHU4KShyZWcgPj4gMTYpICYgMHhmZjsKKwliWzJdID0gKHU4KShyZWcgPj4gOCkgJiAweGZmOworCWJbM10gPSAodTgpIHJlZyAmIDB4ZmY7CisJbWVtY3B5KCZiWzRdLCBidWYsIGNvdW50KTsKKworCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjX2FkYXAsIG1zZywgMSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdDkxM3hfd3JpdGVfcmVnKHN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlLAorCQl1OCBwcm8sIHUzMiByZWcsIHUzMiBkYXRhKQoreworCWludCByZXQ7CisJdTggYls0XTsKKwl1OCBzOworCisJYlswXSA9IGRhdGEgPj4gMjQ7CisJYlsxXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisJYlsyXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKwliWzNdID0gZGF0YSAmIDB4ZmY7CisJLyogZXhwYW5kIHdyaXRlIGFzIG5lZWRlZCAqLworCWlmIChkYXRhIDwgMHgxMDApCisJCXMgPSAzOworCWVsc2UgaWYgKGRhdGEgPCAweDEwMDApCisJCXMgPSAyOworCWVsc2UgaWYgKGRhdGEgPCAweDEwMDAwMCkKKwkJcyA9IDE7CisJZWxzZQorCQlzID0gMDsKKworCXJldCA9IGl0OTEzeF93cml0ZShzdGF0ZSwgcHJvLCByZWcsICZiW3NdLCBzaXplb2YoYikgLSBzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2ZlX3NjcmlwdF9sb2FkZXIoc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUsCisJCXN0cnVjdCBpdDkxM3hzZXQgKmxvYWRzY3JpcHQpCit7CisJaW50IHJldCwgaTsKKwlpZiAobG9hZHNjcmlwdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKKwkJaWYgKGxvYWRzY3JpcHRbaV0ucHJvID09IDB4ZmYpCisJCQlicmVhazsKKwkJcmV0ID0gaXQ5MTN4X3dyaXRlKHN0YXRlLCBsb2Fkc2NyaXB0W2ldLnBybywKKwkJCWxvYWRzY3JpcHRbaV0uYWRkcmVzcywKKwkJCWxvYWRzY3JpcHRbaV0ucmVnLCBsb2Fkc2NyaXB0W2ldLmNvdW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2luaXRfdHVuZXIoc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHJldCwgaSwgcmVnOworCXU4IHZhbCwgbnZfdmFsOworCXU4IG52W10gPSB7NDgsIDMyLCAyNCwgMTYsIDEyLCA4LCA2LCA0LCAyfTsKKwl1OCBiWzJdOworCisJcmVnID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCAweGVjODYpOworCXN3aXRjaCAocmVnKSB7CisJY2FzZSAwOgorCQlzdGF0ZS0+dHVuX2Nsa19tb2RlID0gcmVnOworCQlzdGF0ZS0+dHVuX3h0YWwgPSAyMDAwOworCQlzdGF0ZS0+dHVuX2ZkaXYgPSAzOworCQl2YWwgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAtRU5PREVWOgorCQlyZXR1cm4gLUVOT0RFVjsKKwljYXNlIDE6CisJZGVmYXVsdDoKKwkJc3RhdGUtPnR1bl9jbGtfbW9kZSA9IHJlZzsKKwkJc3RhdGUtPnR1bl94dGFsID0gNjQwOworCQlzdGF0ZS0+dHVuX2ZkaXYgPSAxOworCQl2YWwgPSA2OworCQlicmVhazsKKwl9CisKKwlyZWcgPSBpdDkxM3hfcmVhZF9yZWdfdTgoc3RhdGUsIDB4ZWQwMyk7CisKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZSBpZiAocmVnIDwgc2l6ZW9mKG52KSkKKwkJbnZfdmFsID0gbnZbcmVnXTsKKwllbHNlCisJCW52X3ZhbCA9IDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworCQlyZXQgPSBpdDkxM3hfcmVhZF9yZWcoc3RhdGUsIDB4ZWQyMywgJmJbMF0sIHNpemVvZihiKSk7CisJCXJlZyA9IChiWzFdIDw8IDgpICsgYlswXTsKKwkJaWYgKHJlZyA+IDApCisJCQlicmVhazsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJdWRlbGF5KDIwMDApOworCX0KKwlzdGF0ZS0+dHVuX2ZuX21pbiA9IHN0YXRlLT50dW5feHRhbCAqIHJlZzsKKwlzdGF0ZS0+dHVuX2ZuX21pbiAvPSAoc3RhdGUtPnR1bl9mZGl2ICogbnZfdmFsKTsKKwlkZWJfaW5mbygiVHVuZXIgZm5fbWluICVkIiwgc3RhdGUtPnR1bl9mbl9taW4pOworCisJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsKKwkJcmVnID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCAweGVjODIpOworCQlpZiAocmVnID4gMCkKKwkJCWJyZWFrOworCQlpZiAocmVnIDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQl1ZGVsYXkoMjAwMCk7CisJfQorCisJcmV0dXJuIGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19ETU9ELCAweGVkODEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTM3X3NldF90dW5lcihzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSwKKwkJZW51bSBmZV9iYW5kd2lkdGggYmFuZHdpZHRoLCB1MzIgZnJlcXVlbmN5X20pCit7CisJc3RydWN0IGl0OTEzeHNldCAqc2V0X3R1bmVyID0gc2V0X2l0OTEzN190ZW1wbGF0ZTsKKwlpbnQgcmV0LCByZWc7CisJdTMyIGZyZXF1ZW5jeSA9IGZyZXF1ZW5jeV9tIC8gMTAwMDsKKwl1MzIgZnJlcSwgdGVtcF9mLCB0bXA7CisJdTE2IGlxaWtfbV9jYWw7CisJdTE2IG5fZGl2OworCXU4IG47CisJdTggbF9iYW5kOworCXU4IGxuYV9iYW5kOworCXU4IGJ3OworCisJZGViX2luZm8oIlR1bmVyIEZyZXF1ZW5jeSAlZCBCYW5kd2lkdGggJWQiLCBmcmVxdWVuY3ksIGJhbmR3aWR0aCk7CisKKwlpZiAoZnJlcXVlbmN5ID49IDUxMDAwICYmIGZyZXF1ZW5jeSA8PSA0NDAwMDApIHsKKwkJbF9iYW5kID0gMDsKKwkJbG5hX2JhbmQgPSAwOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNDQwMDAwICYmIGZyZXF1ZW5jeSA8PSA0ODQwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSAxOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNDg0MDAwICYmIGZyZXF1ZW5jeSA8PSA1MzMwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSAyOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNTMzMDAwICYmIGZyZXF1ZW5jeSA8PSA1ODcwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSAzOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNTg3MDAwICYmIGZyZXF1ZW5jeSA8PSA2NDUwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSA0OworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNjQ1MDAwICYmIGZyZXF1ZW5jeSA8PSA3MTAwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSA1OworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNzEwMDAwICYmIGZyZXF1ZW5jeSA8PSA3ODIwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSA2OworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNzgyMDAwICYmIGZyZXF1ZW5jeSA8PSA4NjAwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSA3OworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gMTQ1MDAwMCAmJiBmcmVxdWVuY3kgPD0gMTQ5MjAwMCkgeworCQlsX2JhbmQgPSAxOworCQlsbmFfYmFuZCA9IDA7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiAxNjYwMDAwICYmIGZyZXF1ZW5jeSA8PSAxNjg1MDAwKSB7CisJCWxfYmFuZCA9IDE7CisJCWxuYV9iYW5kID0gMTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2V0X3R1bmVyWzBdLnJlZ1swXSA9IGxuYV9iYW5kOworCisJaWYgKGJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfNV9NSFopCisJCWJ3ID0gMDsKKwllbHNlIGlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzZfTUhaKQorCQlidyA9IDI7CisJZWxzZSBpZiAoYmFuZHdpZHRoID09IEJBTkRXSURUSF83X01IWikKKwkJYncgPSA0OworCWVsc2UgaWYgKGJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFopCisJCWJ3ID0gNjsKKwllbHNlCisJCWJ3ID0gNjsKKworCXNldF90dW5lclsxXS5yZWdbMF0gPSBidzsKKwlzZXRfdHVuZXJbMl0ucmVnWzBdID0gMHhhMCB8IChsX2JhbmQgPDwgMyk7CisKKwlpZiAoZnJlcXVlbmN5ID4gNTMwMDAgJiYgZnJlcXVlbmN5IDw9IDc0MDAwKSB7CisJCW5fZGl2ID0gNDg7CisJCW4gPSAwOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNzQwMDAgJiYgZnJlcXVlbmN5IDw9IDExMTAwMCkgeworCQluX2RpdiA9IDMyOworCQluID0gMTsKKwl9IGVsc2UgaWYgKGZyZXF1ZW5jeSA+IDExMTAwMCAmJiBmcmVxdWVuY3kgPD0gMTQ4MDAwKSB7CisJCW5fZGl2ID0gMjQ7CisJCW4gPSAyOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gMTQ4MDAwICYmIGZyZXF1ZW5jeSA8PSAyMjIwMDApIHsKKwkJbl9kaXYgPSAxNjsKKwkJbiA9IDM7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiAyMjIwMDAgJiYgZnJlcXVlbmN5IDw9IDI5NjAwMCkgeworCQluX2RpdiA9IDEyOworCQluID0gNDsKKwl9IGVsc2UgaWYgKGZyZXF1ZW5jeSA+IDI5NjAwMCAmJiBmcmVxdWVuY3kgPD0gNDQ1MDAwKSB7CisJCW5fZGl2ID0gODsKKwkJbiA9IDU7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiA0NDUwMDAgJiYgZnJlcXVlbmN5IDw9IHN0YXRlLT50dW5fZm5fbWluKSB7CisJCW5fZGl2ID0gNjsKKwkJbiA9IDY7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiBzdGF0ZS0+dHVuX2ZuX21pbiAmJiBmcmVxdWVuY3kgPD0gOTUwMDAwKSB7CisJCW5fZGl2ID0gNDsKKwkJbiA9IDc7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiAxNDUwMDAwICYmIGZyZXF1ZW5jeSA8PSAxNjgwMDAwKSB7CisJCW5fZGl2ID0gMjsKKwkJbiA9IDA7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCAweGVkODEpOworCWlxaWtfbV9jYWwgPSAodTE2KXJlZyAqIG5fZGl2OworCisJaWYgKHJlZyA8IDB4MjApIHsKKwkJaWYgKHN0YXRlLT50dW5fY2xrX21vZGUgPT0gMCkKKwkJCWlxaWtfbV9jYWwgPSAoaXFpa19tX2NhbCAqIDkpID4+IDU7CisJCWVsc2UKKwkJCWlxaWtfbV9jYWwgPj49IDE7CisJfSBlbHNlIHsKKwkJaXFpa19tX2NhbCA9IDB4NDAgLSBpcWlrX21fY2FsOworCQlpZiAoc3RhdGUtPnR1bl9jbGtfbW9kZSA9PSAwKQorCQkJaXFpa19tX2NhbCA9IH4oKGlxaWtfbV9jYWwgKiA5KSA+PiA1KTsKKwkJZWxzZQorCQkJaXFpa19tX2NhbCA9IH4oaXFpa19tX2NhbCA+PiAxKTsKKwl9CisKKwl0ZW1wX2YgPSBmcmVxdWVuY3kgKiAodTMyKW5fZGl2ICogKHUzMilzdGF0ZS0+dHVuX2ZkaXY7CisJZnJlcSA9IHRlbXBfZiAvIHN0YXRlLT50dW5feHRhbDsKKwl0bXAgPSBmcmVxICogc3RhdGUtPnR1bl94dGFsOworCisJaWYgKCh0ZW1wX2YgLSB0bXApID49IChzdGF0ZS0+dHVuX3h0YWwgPj4gMSkpCisJCWZyZXErKzsKKworCWZyZXEgKz0gKHUzMikgbiA8PCAxMzsKKwkvKiBGcmVxdWVuY3kgT01FR0FfSVFJS19NX0NBTF9NSUQqLworCXRlbXBfZiA9IGZyZXEgKyAodTMyKWlxaWtfbV9jYWw7CisKKwlzZXRfdHVuZXJbM10ucmVnWzBdID0gIHRlbXBfZiAmIDB4ZmY7CisJc2V0X3R1bmVyWzRdLnJlZ1swXSA9ICAodGVtcF9mID4+IDgpICYgMHhmZjsKKworCWRlYl9pbmZvKCJIaWdoIEZyZXF1ZW5jeSA9ICUwNHgiLCB0ZW1wX2YpOworCisJLyogTG93ZXIgZnJlcXVlbmN5ICovCisJc2V0X3R1bmVyWzVdLnJlZ1swXSA9ICBmcmVxICYgMHhmZjsKKwlzZXRfdHVuZXJbNl0ucmVnWzBdID0gIChmcmVxID4+IDgpICYgMHhmZjsKKworCWRlYl9pbmZvKCJsb3cgRnJlcXVlbmN5ID0gJTA0eCIsIGZyZXEpOworCisJcmV0ID0gaXQ5MTN4X2ZlX3NjcmlwdF9sb2FkZXIoc3RhdGUsIHNldF90dW5lcik7CisKKwlyZXR1cm4gKHJldCA8IDApID8gLUVOT0RFViA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2ZlX3NlbGVjdF9idyhzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSwKKwkJCWVudW0gZmVfYmFuZHdpZHRoIGJhbmR3aWR0aCwgdTMyIGFkY0ZyZXF1ZW5jeSkKK3sKKwlpbnQgcmV0LCBpOworCXU4IGJ1ZmZlclsyNTZdOworCXUzMiBjb2VmZls4XTsKKwl1MTYgYmZzZmN3X2ZmdGlueF9yYXRpbzsKKwl1MTYgZmZ0aW54X2Jmc2Zjd19yYXRpbzsKKwl1OCBjb3VudDsKKwl1OCBidzsKKwl1OCBhZGNtdWx0aXBsaWVyOworCisJZGViX2luZm8oIkJhbmR3aWR0aCAlZCBBZGMgJWQiLCBiYW5kd2lkdGgsIGFkY0ZyZXF1ZW5jeSk7CisKKwlpZiAoYmFuZHdpZHRoID09IEJBTkRXSURUSF81X01IWikKKwkJYncgPSAzOworCWVsc2UgaWYgKGJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfNl9NSFopCisJCWJ3ID0gMDsKKwllbHNlIGlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzdfTUhaKQorCQlidyA9IDE7CisJZWxzZSBpZiAoYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikKKwkJYncgPSAyOworCWVsc2UKKwkJYncgPSAyOworCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIFJFR19CVywgYncpOworCisJaWYgKHN0YXRlLT50YWJsZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEluIHdyaXRlIG9yZGVyICovCisJY29lZmZbMF0gPSBzdGF0ZS0+dGFibGVbYnddLmNvZWZmXzFfMjA0ODsKKwljb2VmZlsxXSA9IHN0YXRlLT50YWJsZVtid10uY29lZmZfMl8yazsKKwljb2VmZlsyXSA9IHN0YXRlLT50YWJsZVtid10uY29lZmZfMV84MTkxOworCWNvZWZmWzNdID0gc3RhdGUtPnRhYmxlW2J3XS5jb2VmZl8xXzgxOTI7CisJY29lZmZbNF0gPSBzdGF0ZS0+dGFibGVbYnddLmNvZWZmXzFfODE5MzsKKwljb2VmZls1XSA9IHN0YXRlLT50YWJsZVtid10uY29lZmZfMl84azsKKwljb2VmZls2XSA9IHN0YXRlLT50YWJsZVtid10uY29lZmZfMV80MDk2OworCWNvZWZmWzddID0gc3RhdGUtPnRhYmxlW2J3XS5jb2VmZl8yXzRrOworCWJmc2Zjd19mZnRpbnhfcmF0aW8gPSBzdGF0ZS0+dGFibGVbYnddLmJmc2Zjd19mZnRpbnhfcmF0aW87CisJZmZ0aW54X2Jmc2Zjd19yYXRpbyA9IHN0YXRlLT50YWJsZVtid10uZmZ0aW54X2Jmc2Zjd19yYXRpbzsKKworCS8qIEFEQyBtdWx0aXBsaWVyICovCisJcmV0ID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCBBRENfWF8yKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGNtdWx0aXBsaWVyID0gcmV0OworCisJY291bnQgPSAwOworCisJLyogIEJ1aWxkIEJ1ZmZlciBmb3IgQ09FRkYgUmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoYWRjbXVsdGlwbGllciA9PSAxKQorCQkJY29lZmZbaV0gLz0gMjsKKwkJYnVmZmVyW2NvdW50KytdID0gKGNvZWZmW2ldID4+IDI0KSAmIDB4MzsKKwkJYnVmZmVyW2NvdW50KytdID0gKGNvZWZmW2ldID4+IDE2KSAmIDB4ZmY7CisJCWJ1ZmZlcltjb3VudCsrXSA9IChjb2VmZltpXSA+PiA4KSAmIDB4ZmY7CisJCWJ1ZmZlcltjb3VudCsrXSA9IGNvZWZmW2ldICYgMHhmZjsKKwl9CisKKwkvKiBiZnNmY3dfZmZ0aW54X3JhdGlvIHJlZ2lzdGVyIDB4MjEtMHgyMiAqLworCWJ1ZmZlcltjb3VudCsrXSA9IGJmc2Zjd19mZnRpbnhfcmF0aW8gJiAweGZmOworCWJ1ZmZlcltjb3VudCsrXSA9IChiZnNmY3dfZmZ0aW54X3JhdGlvID4+IDgpICYgMHhmZjsKKwkvKiBmZnRpbnhfYmZzZmN3X3JhdGlvIHJlZ2lzdGVyIDB4MjMtMHgyNCAqLworCWJ1ZmZlcltjb3VudCsrXSA9IGZmdGlueF9iZnNmY3dfcmF0aW8gJiAweGZmOworCWJ1ZmZlcltjb3VudCsrXSA9IChmZnRpbnhfYmZzZmN3X3JhdGlvID4+IDgpICYgMHhmZjsKKwkvKiBzdGFydCBhdCBDT0VGRl8xXzIwNDggYW5kIHdyaXRlIHRocm91Z2ggdG8gZmZ0aW54X2Jmc2Zjd19yYXRpbyovCisJcmV0ID0gaXQ5MTN4X3dyaXRlKHN0YXRlLCBQUk9fRE1PRCwgQ09FRkZfMV8yMDQ4LCBidWZmZXIsIGNvdW50KTsKKworCWZvciAoaSA9IDA7IGkgPCA0MjsgaSArPSA4KQorCQlkZWJ1Z19kYXRhX3NuaXBldCgweDEsICJCdWZmZXIiLCAmYnVmZmVyW2ldKTsKKworCXJldHVybiByZXQ7Cit9CisKKworCitzdGF0aWMgaW50IGl0OTEzeF9mZV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQsIGk7CisJZmVfc3RhdHVzX3Qgb2xkX3N0YXR1cyA9IHN0YXRlLT5pdDkxM3hfc3RhdHVzOworCSpzdGF0dXMgPSAwOworCisJaWYgKHN0YXRlLT5pdDkxM3hfc3RhdHVzID09IDApIHsKKwkJcmV0ID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCBFTVBUWV9DSEFOTkVMX1NUQVRVUyk7CisJCWlmIChyZXQgPT0gMHgxKSB7CisJCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7CisJCQlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykgeworCQkJCXJldCA9IGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgTVAySUZfU1lOQ19MSyk7CisJCQkJaWYgKHJldCA9PSAweDEpCisJCQkJCWJyZWFrOworCQkJCW1zbGVlcCgyNSk7CisJCQl9CisJCQlpZiAocmV0ID09IDB4MSkKKwkJCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSCisJCQkJCXwgRkVfSEFTX1ZJVEVSQkkKKwkJCQkJfCBGRV9IQVNfU1lOQzsKKwkJCXN0YXRlLT5pdDkxM3hfc3RhdHVzID0gKnN0YXR1czsKKwkJfQorCX0KKworCWlmIChzdGF0ZS0+aXQ5MTN4X3N0YXR1cyAmIEZFX0hBU19TWU5DKSB7CisJCXJldCA9IGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgVFBTRF9MT0NLKTsKKwkJaWYgKHJldCA9PSAweDEpCisJCQkqc3RhdHVzIHw9IEZFX0hBU19MT0NLCisJCQkJfCBzdGF0ZS0+aXQ5MTN4X3N0YXR1czsKKwkJZWxzZQorCQkJc3RhdGUtPml0OTEzeF9zdGF0dXMgPSAwOworCQlpZiAob2xkX3N0YXR1cyAhPSBzdGF0ZS0+aXQ5MTN4X3N0YXR1cykKKwkJCXJldCA9IGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19MSU5LLCBHUElPSDNfTywgcmV0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdDkxM3hfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCXUxNiAqc3RyZW5ndGgpCit7CisJc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0ID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCBTSUdOQUxfTEVWRUwpOworCS8qU0lHTkFMX0xFVkVMIGFsd2F5cyByZXR1cm5zIDEwMCUhIHNvIHVzaW5nIEZFX0hBU19TSUdOQUwgYXMgc3dpdGNoKi8KKwlpZiAoc3RhdGUtPml0OTEzeF9zdGF0dXMgJiBGRV9IQVNfU0lHTkFMKQorCQlyZXQgPSAocmV0ICogMHhmZikgLyAweDY0OworCWVsc2UKKwkJcmV0ID0gMHgwOworCXJldCB8PSByZXQgPDwgMHg4OworCSpzdHJlbmd0aCA9IHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdDkxM3hfZmVfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiogc25yKQoreworCXN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldCA9IGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgU0lHTkFMX1FVQUxJVFkpOworCXJldCA9IChyZXQgKiAweGZmKSAvIDB4NjQ7CisJcmV0IHw9IChyZXQgPDwgMHg4KTsKKwkqc25yID0gfnJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdDkxM3hfZmVfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCSpiZXIgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnVjYmxvY2tzKQoreworCSp1Y2Jsb2NrcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2ZlX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisJdTggcmVnWzhdOworCisJcmV0ID0gaXQ5MTN4X3JlYWRfcmVnKHN0YXRlLCBSRUdfVFBTRF9UWF9NT0RFLCByZWcsIHNpemVvZihyZWcpKTsKKworCWlmIChyZWdbM10gPCAzKQorCQlwLT51Lm9mZG0uY29uc3RlbGxhdGlvbiA9IGZlX2NvbltyZWdbM11dOworCisJaWYgKHJlZ1swXSA8IDMpCisJCXAtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSA9IGZlX21vZGVbcmVnWzBdXTsKKworCWlmIChyZWdbMV0gPCA0KQorCQlwLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWwgPSBmZV9naVtyZWdbMV1dOworCisJaWYgKHJlZ1syXSA8IDQpCisJCXAtPnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPSBmZV9oaVtyZWdbMl1dOworCisJcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCA9IChyZWdbNl0gPCA2KSA/IGZlX2NvZGVbcmVnWzZdXSA6IEZFQ19OT05FOworCXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSAocmVnWzddIDwgNikgPyBmZV9jb2RlW3JlZ1s3XV0gOiBGRUNfTk9ORTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0LCBpOworCXU4IGVtcHR5X2NoLCBsYXN0X2NoOworCisJc3RhdGUtPml0OTEzeF9zdGF0dXMgPSAwOworCisJLyogU2V0IGJ3Ki8KKwlyZXQgPSBpdDkxM3hfZmVfc2VsZWN0X2J3KHN0YXRlLCBwLT51Lm9mZG0uYmFuZHdpZHRoLAorCQlzdGF0ZS0+YWRjRnJlcXVlbmN5KTsKKworCS8qIFRyYWluaW5nIE1vZGUgT2ZmICovCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0xJTkssIFRSQUlOSU5HX01PREUsIDB4MCk7CisKKwkvKiBDbGVhciBFbXB0eSBDaGFubmVsICovCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIEVNUFRZX0NIQU5ORUxfU1RBVFVTLCAweDApOworCisJLyogQ2xlYXIgYml0cyAqLworCXJldCA9IGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19ETU9ELCBNUDJJRl9TWU5DX0xLLCAweDApOworCS8qIExFRCBvbiAqLworCXJldCA9IGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19MSU5LLCBHUElPSDNfTywgMHgxKTsKKwkvKiBTZWxlY3QgQmFuZCovCisJaWYgKChwLT5mcmVxdWVuY3kgPj0gNTEwMDAwMDApICYmIChwLT5mcmVxdWVuY3kgPD0gMjMwMDAwMDAwKSkKKwkJaSA9IDA7CisJZWxzZSBpZiAoKHAtPmZyZXF1ZW5jeSA+PSAzNTAwMDAwMDApICYmIChwLT5mcmVxdWVuY3kgPD0gOTAwMDAwMDAwKSkKKwkJCWkgPSAxOworCWVsc2UgaWYgKChwLT5mcmVxdWVuY3kgPj0gMTQ1MDAwMDAwMCkgJiYgKHAtPmZyZXF1ZW5jeSA8PSAxNjgwMDAwMDAwKSkKKwkJCWkgPSAyOworCQllbHNlCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXQgPSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fRE1PRCwgRlJFRV9CQU5ELCBpKTsKKworCWRlYl9pbmZvKCJGcm9udGVuZCBTZXQgVHVuZXIgVHlwZSAlMDJ4Iiwgc3RhdGUtPnR1bmVyX3R5cGUpOworCXN3aXRjaCAoc3RhdGUtPnR1bmVyX3R5cGUpIHsKKwljYXNlIElUOTEzNzogLyogVHVuZXIgdHlwZSAweDM4ICovCisJCXJldCA9IGl0OTEzN19zZXRfdHVuZXIoc3RhdGUsCisJCQlwLT51Lm9mZG0uYmFuZHdpZHRoLCBwLT5mcmVxdWVuY3kpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJCX0KKwkJYnJlYWs7CisJfQorCS8qIExFRCBvZmYgKi8KKwlyZXQgPSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX08sIDB4MCk7CisJLyogVHJpZ2dlciBvZnNtICovCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIFRSSUdHRVJfT0ZTTSwgMHgwKTsKKwlsYXN0X2NoID0gMjsKKwlmb3IgKGkgPSAwOyBpIDwgNDA7ICsraSkgeworCQllbXB0eV9jaCA9IGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgRU1QVFlfQ0hBTk5FTF9TVEFUVVMpOworCQlpZiAobGFzdF9jaCA9PSAxICYmIGVtcHR5X2NoID09IDEpCisJCQlicmVhazsKKwkJaWYgKGxhc3RfY2ggPT0gMiAmJiBlbXB0eV9jaCA9PSAyKQorCQkJcmV0dXJuIDA7CisJCWxhc3RfY2ggPSBlbXB0eV9jaDsKKwkJbXNsZWVwKDI1KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDQwOyArK2kpIHsKKwkJaWYgKGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgRF9UUFNEX0xPQ0spID09IDEpCisJCQlicmVhazsKKwkJbXNsZWVwKDI1KTsKKwl9CisKKwlzdGF0ZS0+ZnJlcXVlbmN5ID0gcC0+ZnJlcXVlbmN5OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9zdXNwZW5kKHN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlKQoreworCWludCByZXQsIGk7CisJdTggYjsKKworCXJldCA9IGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19ETU9ELCBTVVNQRU5EX0ZMQUcsIDB4MSk7CisKKwlyZXQgfD0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIFRSSUdHRVJfT0ZTTSwgMHgwKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQlyZXQgPSBpdDkxM3hfcmVhZF9yZWcoc3RhdGUsIFNVU1BFTkRfRkxBRywgJmIsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoYiA9PSAwKQorCQkJYnJlYWs7CisKKwl9CisKKwlyZXQgfD0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIEFGRV9NRU0wLCAweDgpOworCS8qIFR1cm4gTEVEIG9mZiAqLworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX08sIDB4MCk7CisKKwlyZXQgfD0gaXQ5MTN4X2ZlX3NjcmlwdF9sb2FkZXIoc3RhdGUsIGl0OTEzN190dW5lcl9vZmYpOworCisJcmV0dXJuIChyZXQgPCAwKSA/IC1FTk9ERVYgOiAwOworfQorCisvKiBQb3dlciBzZXF1ZW5jZSAqLworLyogUG93ZXIgVXAJVHVuZXIgb24gLT4gRnJvbnRlbmQgc3VzcGVuZCBvZmYgLT4gVHVuZXIgY2xrIG9uICovCisvKiBQb3dlciBEb3duCUZyb250ZW5kIHN1c3BlbmQgb24gLT4gVHVuZXIgY2xrIG9mZiAtPiBUdW5lciBvZmYgKi8KKworc3RhdGljIGludCBpdDkxM3hfZmVfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlyZXR1cm4gaXQ5MTN4X2ZlX3N1c3BlbmQoc3RhdGUpOworfQorCitzdGF0aWMgdTMyIGNvbXB1dGVfZGl2KHUzMiBhLCB1MzIgYiwgdTMyIHgpCit7CisJdTMyIHJlcyA9IDA7CisJdTMyIGMgPSAwOworCXUzMiBpID0gMDsKKworCWlmIChhID4gYikgeworCQljID0gYSAvIGI7CisJCWEgPSBhIC0gYyAqIGI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHg7IGkrKykgeworCQlpZiAoYSA+PSBiKSB7CisJCQlyZXMgKz0gMTsKKwkJCWEgLT0gYjsKKwkJfQorCQlhIDw8PSAxOworCQlyZXMgPDw9IDE7CisJfQorCisJcmVzID0gKGMgPDwgeCkgKyByZXM7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9zdGFydChzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgaXQ5MTN4c2V0ICpzZXRfZmU7CisJc3RydWN0IGl0OTEzeHNldCAqc2V0X21vZGU7CisJaW50IHJldDsKKwl1OCBhZGYgPSAoc3RhdGUtPmFkZiAmIDB4Zik7CisJdTMyIGFkYywgeHRhbDsKKwl1OCBiWzRdOworCisJcmV0ID0gaXQ5MTN4X2luaXRfdHVuZXIoc3RhdGUpOworCisJaWYgKGFkZiA8IDEyKSB7CisJCXN0YXRlLT5jcnlzdGFsRnJlcXVlbmN5ID0gZmVfY2xvY2tUYWJsZVthZGZdLnh0YWwgOworCQlzdGF0ZS0+dGFibGUgPSBmZV9jbG9ja1RhYmxlW2FkZl0udGFibGU7CisJCXN0YXRlLT5hZGNGcmVxdWVuY3kgPSBzdGF0ZS0+dGFibGUtPmFkY0ZyZXF1ZW5jeTsKKworCQlhZGMgPSBjb21wdXRlX2RpdihzdGF0ZS0+YWRjRnJlcXVlbmN5LCAxMDAwMDAwdWwsIDE5dWwpOworCQl4dGFsID0gY29tcHV0ZV9kaXYoc3RhdGUtPmNyeXN0YWxGcmVxdWVuY3ksIDEwMDAwMDB1bCwgMTl1bCk7CisKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZWJfaW5mbygiWHRhbCBGcmVxIDolZCBBZGMgRnJlcSA6JWQgQWRjICUwOHggWHRhbCAlMDh4IiwKKwkJc3RhdGUtPmNyeXN0YWxGcmVxdWVuY3ksIHN0YXRlLT5hZGNGcmVxdWVuY3ksIGFkYywgeHRhbCk7CisKKwkvKiBTZXQgTEVEIGluZGljYXRvciBvbiBHUElPSDMgKi8KKwlyZXQgPSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX0VOLCAweDEpOworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX09OLCAweDEpOworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX08sIDB4MSk7CisKKwlyZXQgfD0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0xJTkssIDB4ZjY0MSwgc3RhdGUtPnR1bmVyX3R5cGUpOworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fRE1PRCwgMHhmNWNhLCAweDAxKTsKKwlyZXQgfD0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIDB4ZjcxNSwgMHgwMSk7CisKKwliWzBdID0geHRhbCAmIDB4ZmY7CisJYlsxXSA9ICh4dGFsID4+IDgpICYgMHhmZjsKKwliWzJdID0gKHh0YWwgPj4gMTYpICYgMHhmZjsKKwliWzNdID0gKHh0YWwgPj4gMjQpOworCXJldCB8PSBpdDkxM3hfd3JpdGUoc3RhdGUsIFBST19ETU9ELCBYVEFMX0NMSywgYiAsIDQpOworCisJYlswXSA9IGFkYyAmIDB4ZmY7CisJYlsxXSA9IChhZGMgPj4gOCkgJiAweGZmOworCWJbMl0gPSAoYWRjID4+IDE2KSAmIDB4ZmY7CisJcmV0IHw9IGl0OTEzeF93cml0ZShzdGF0ZSwgUFJPX0RNT0QsIEFEQ19GUkVRLCBiLCAzKTsKKworCXN3aXRjaCAoc3RhdGUtPnR1bmVyX3R5cGUpIHsKKwljYXNlIElUOTEzNzogLyogVHVuZXIgdHlwZSAweDM4ICovCisJCXNldF9mZSA9IGl0OTEzN19zZXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNldCB0aGUgZGVtb2QgKi8KKwlyZXQgPSBpdDkxM3hfZmVfc2NyaXB0X2xvYWRlcihzdGF0ZSwgc2V0X2ZlKTsKKwkvKiBBbHdheXMgc29sbyBmcm9udGVuZCAqLworCXNldF9tb2RlID0gc2V0X3NvbG9fZmU7CisJcmV0IHw9IGl0OTEzeF9mZV9zY3JpcHRfbG9hZGVyKHN0YXRlLCBzZXRfbW9kZSk7CisKKwlyZXQgfD0gaXQ5MTN4X2ZlX3N1c3BlbmQoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldCA9IDA7CisJLyogUG93ZXIgVXAgVHVuZXIgLSBjb21tb24gYWxsIHZlcnNpb25zICovCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIDB4ZWM0MCwgMHgxKTsKKworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fRE1PRCwgQUZFX01FTTAsIDB4MCk7CisKKwlyZXQgfD0gaXQ5MTN4X2ZlX3NjcmlwdF9sb2FkZXIoc3RhdGUsIGluaXRfMSk7CisKKwlzd2l0Y2ggKHN0YXRlLT50dW5lcl90eXBlKSB7CisJY2FzZSBJVDkxMzc6CisJCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fRE1PRCwgMHhmYmE4LCAweDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gKHJldCA8IDApID8gLUVOT0RFViA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGl0OTEzeF9mZV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgaXQ5MTN4X2ZlX29mZG1fb3BzOworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICppdDkxM3hfZmVfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCisJCXU4IGkyY19hZGRyLCB1OCBhZGYsIHU4IHR5cGUpCit7CisJc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUgPSBOVUxMOworCWludCByZXQ7CisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpdDkxM3hfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCXN0YXRlLT5pMmNfYWRhcCA9IGkyY19hZGFwOworCXN0YXRlLT5pMmNfYWRkciA9IGkyY19hZGRyOworCXN0YXRlLT5hZGYgPSBhZGY7CisJc3RhdGUtPnR1bmVyX3R5cGUgPSB0eXBlOworCisJcmV0ID0gaXQ5MTN4X2ZlX3N0YXJ0KHN0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJml0OTEzeF9mZV9vZmRtX29wcywKKwkJCXNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisKKwlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKK2Vycm9yOgorCWtmcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaXQ5MTN4X2ZlX2F0dGFjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBpdDkxM3hfZmVfb2ZkbV9vcHMgPSB7CisKKwkuaW5mbyA9IHsKKwkJLm5hbWUJCQk9ICJpdDkxM3gtZmUgRFZCLVQiLAorCQkudHlwZQkJCT0gRkVfT0ZETSwKKwkJLmZyZXF1ZW5jeV9taW4JCT0gNTEwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4CQk9IDE2ODAwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUJPSA2MjUwMCwKKwkJLmNhcHMgPSBGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQkJRkVfQ0FOX0ZFQ180XzUgfCBGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfNl83IHwKKwkJCUZFX0NBTl9GRUNfN184IHwgRkVfQ0FOX0ZFQ184XzkgfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAorCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfAorCQkJRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAorCQkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPLAorCX0sCisKKwkucmVsZWFzZSA9IGl0OTEzeF9mZV9yZWxlYXNlLAorCisJLmluaXQgPSBpdDkxM3hfZmVfaW5pdCwKKwkuc2xlZXAgPSBpdDkxM3hfZmVfc2xlZXAsCisKKwkuc2V0X2Zyb250ZW5kID0gaXQ5MTN4X2ZlX3NldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kID0gaXQ5MTN4X2ZlX2dldF9mcm9udGVuZCwKKworCS5yZWFkX3N0YXR1cyA9IGl0OTEzeF9mZV9yZWFkX3N0YXR1cywKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBpdDkxM3hfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gaXQ5MTN4X2ZlX3JlYWRfc25yLAorCS5yZWFkX2JlciA9IGl0OTEzeF9mZV9yZWFkX2JlciwKKwkucmVhZF91Y2Jsb2NrcyA9IGl0OTEzeF9mZV9yZWFkX3VjYmxvY2tzLAorfTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJpdDkxM3ggRnJvbnRlbmQgYW5kIGl0OTEzNyB0dW5lciIpOworTU9EVUxFX0FVVEhPUigiTWFsY29sbSBQcmllc3RsZXkgdHZib3hzcHlAZ21haWwuY29tIik7CitNT0RVTEVfVkVSU0lPTigiMS4wNyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0OTEzeC1mZS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0OTEzeC1mZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTdmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXQ5MTN4LWZlLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBpdDkxM3ggRnJvbnRlbmQKKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuPQorICovCisKKyNpZm5kZWYgSVQ5MTNYX0ZFX0gKKyNkZWZpbmUgSVQ5MTNYX0ZFX0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9JVDkxM1hfRkUpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfSVQ5MTNYX0ZFX01PRFVMRSkgJiYgXAorZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKml0OTEzeF9mZV9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKKwkJCXU4IGkyY19hZGRyLCB1OCBhZGYsIHU4IHR5cGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqaXQ5MTN4X2ZlX2F0dGFjaCgKKwkJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwJdTggaTJjX2FkZHIsIHU4IGFkZiwgdTggdHlwZSkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfSVQ5MTNYX0ZFICovCisjZGVmaW5lIEkyQ19CQVNFX0FERFIJCTB4MTAKKyNkZWZpbmUgREVWXzAJCQkweDAKKyNkZWZpbmUgREVWXzEJCQkweDEwCisjZGVmaW5lIFBST19MSU5LCQkweDAKKyNkZWZpbmUgUFJPX0RNT0QJCTB4MQorI2RlZmluZSBERVZfMF9ETU9ECQkoUFJPX0RNT0QgPDwgMHg3KQorI2RlZmluZSBERVZfMV9ETU9ECQkoREVWXzBfRE1PRCB8IERFVl8xKQorI2RlZmluZSBDSElQMl9JMkNfQUREUgkJMHgzYQorCisjZGVmaW5lIEFGRV9NRU0wCQkweGZiMjQKKworI2RlZmluZSBNUDJfU1dfUlNUCQkweGY5OWQKKyNkZWZpbmUgTVAySUYyX1NXX1JTVAkJMHhmOWE0CisKKyNkZWZpbmUJUEFET0RQVQkJCTB4ZDgyNworI2RlZmluZSBUSElSRE9EUFUJCTB4ZDgyOAorI2RlZmluZSBBR0NfT19ECQkJMHhkODI5CisKKyNkZWZpbmUgRVAwX1RYX0VOCQkweGRkMTEKKyNkZWZpbmUgRVAwX1RYX05BSwkJMHhkZDEzCisjZGVmaW5lIEVQNF9UWF9MRU5fTFNCCQkweGRkODgKKyNkZWZpbmUgRVA0X1RYX0xFTl9NU0IJCTB4ZGQ4OQorI2RlZmluZSBFUDRfTUFYX1BLVAkJMHhkZDBjCisjZGVmaW5lIEVQNV9UWF9MRU5fTFNCCQkweGRkOGEKKyNkZWZpbmUgRVA1X1RYX0xFTl9NU0IJCTB4ZGQ4YgorI2RlZmluZSBFUDVfTUFYX1BLVAkJMHhkZDBkCisKKyNkZWZpbmUgSU9fTVVYX1BPV0VSX0NMSwkweGQ4MDAKKyNkZWZpbmUgQ0xLX09fRU4JCTB4ZDgxYQorI2RlZmluZSBJMkNfQ0xLCQkJMHhmMTAzCisjZGVmaW5lIEkyQ19DTEtfMTAwCQkweDcKKyNkZWZpbmUgSTJDX0NMS180MDAJCTB4MWEKKworI2RlZmluZSBEX1RQU0RfTE9DSwkJMHhmNWE5CisjZGVmaW5lIE1QMklGMl9FTgkJMHhmOWEzCisjZGVmaW5lIE1QMklGX1NFUklBTAkJMHhmOTg1CisjZGVmaW5lIFRTSVNfRU5BQkxFCQkweGY5Y2QKKyNkZWZpbmUgTVAySUYyX0hBTEZfUFNCCQkweGY5YTUKKyNkZWZpbmUgTVAySUZfU1RPUF9FTgkJMHhmOWI1CisjZGVmaW5lIE1QRUdfRlVMTF9TUEVFRAkJMHhmOTkwCisjZGVmaW5lIFRPUF9IT1NUQl9TRVJfTU9ERQkweGQ5MWMKKworI2RlZmluZSBQSURfUlNUCQkJMHhmOTkyCisjZGVmaW5lIFBJRF9FTgkJCTB4Zjk5MworI2RlZmluZSBQSURfSU5YX0VOCQkweGY5OTQKKyNkZWZpbmUgUElEX0lOWAkJCTB4Zjk5NQorI2RlZmluZSBQSURfTFNCCQkJMHhmOTk2CisjZGVmaW5lIFBJRF9NU0IJCQkweGY5OTcKKworI2RlZmluZSBNUDJJRl9NUEVHX1BBUl9NT0RFCTB4Zjk4NgorI2RlZmluZSBEQ0FfVVBQRVJfQ0hJUAkJMHhmNzMxCisjZGVmaW5lIERDQV9MT1dFUl9DSElQCQkweGY3MzIKKyNkZWZpbmUgRENBX1BMQVRDSAkJMHhmNzMwCisjZGVmaW5lIERDQV9GUEdBX0xBVENICQkweGY3NzgKKyNkZWZpbmUgRENBX1NUQU5EX0FMT05FCQkweGY3M2MKKyNkZWZpbmUgRENBX0VOQUJMRQkJMHhmNzc2CisKKyNkZWZpbmUgRFZCVF9JTlRFTgkJMHhmNDFmCisjZGVmaW5lIERWQlRfRU5BQkxFCQkweGY0MWEKKyNkZWZpbmUgSE9TVEJfRENBX0xPV0VSCQkweGQ5MWYKKyNkZWZpbmUgSE9TVEJfTVBFR19QQVJfTU9ERQkweGQ5MWIKKyNkZWZpbmUgSE9TVEJfTVBFR19TRVJfTU9ERQkweGQ5MWMKKyNkZWZpbmUgSE9TVEJfTVBFR19TRVJfRE83CTB4ZDkxZAorI2RlZmluZSBIT1NUQl9EQ0FfVVBQRVIJCTB4ZDkxZQorI2RlZmluZSBQQURNSVNDRFIyCQkweGQ4MzAKKyNkZWZpbmUgUEFETUlTQ0RSNAkJMHhkODMxCisjZGVmaW5lIFBBRE1JU0NEUjgJCTB4ZDgzMgorI2RlZmluZSBQQURNSVNDRFJTUgkJMHhkODMzCisjZGVmaW5lIExPQ0szX09VVAkJMHhkOGZkCisKKyNkZWZpbmUgR1BJT0gxX08JCTB4ZDhhZgorI2RlZmluZSBHUElPSDFfRU4JCTB4ZDhiMAorI2RlZmluZSBHUElPSDFfT04JCTB4ZDhiMQorI2RlZmluZSBHUElPSDNfTwkJMHhkOGIzCisjZGVmaW5lIEdQSU9IM19FTgkJMHhkOGI0CisjZGVmaW5lIEdQSU9IM19PTgkJMHhkOGI1CisjZGVmaW5lIEdQSU9INV9PCQkweGQ4YmIKKyNkZWZpbmUgR1BJT0g1X0VOCQkweGQ4YmMKKyNkZWZpbmUgR1BJT0g1X09OCQkweGQ4YmQKKworI2RlZmluZSBBRkVfTUVNMAkJMHhmYjI0CisKKyNkZWZpbmUgUkVHX1RQU0RfVFhfTU9ERQkweGY5MDAKKyNkZWZpbmUgUkVHX1RQU0RfR0kJCTB4ZjkwMQorI2RlZmluZSBSRUdfVFBTRF9ISUVSCQkweGY5MDIKKyNkZWZpbmUgUkVHX1RQU0RfQ09OU1QJCTB4ZjkwMworI2RlZmluZSBSRUdfQlcJCQkweGY5MDQKKyNkZWZpbmUgUkVHX1BSSVYJCTB4ZjkwNQorI2RlZmluZSBSRUdfVFBTRF9IUF9DT0RFCTB4ZjkwNgorI2RlZmluZSBSRUdfVFBTRF9MUF9DT0RFCTB4ZjkwNworCisjZGVmaW5lIE1QMklGX1NZTkNfTEsJCTB4Zjk5OQorI2RlZmluZSBBRENfRlJFUQkJMHhmMWNkCisKKyNkZWZpbmUgVFJJR0dFUl9PRlNNCQkweDAwMDAKKy8qIENPRUZGIFJlZ2lzdGVycyBzdGFydCBhdCAweDAwMDEgdG8gMHgwMDIwICovCisjZGVmaW5lIENPRUZGXzFfMjA0OAkJMHgwMDAxCisjZGVmaW5lIFhUQUxfQ0xLCQkweDAwMjUKKyNkZWZpbmUgQkZTX0ZDVwkJCTB4MDAyOQorI2RlZmluZSBUUFNEX0xPQ0sJCTB4MDAzYworI2RlZmluZSBUUkFJTklOR19NT0RFCQkweDAwNDAKKyNkZWZpbmUgQURDX1hfMgkJCTB4MDA0NQorI2RlZmluZSBUVU5FUl9JRAkJMHgwMDQ2CisjZGVmaW5lIEVNUFRZX0NIQU5ORUxfU1RBVFVTCTB4MDA0NworI2RlZmluZSBTSUdOQUxfTEVWRUwJCTB4MDA0OAorI2RlZmluZSBTSUdOQUxfUVVBTElUWQkJMHgwMDQ5CisjZGVmaW5lIEVTVF9TSUdOQUxfTEVWRUwJMHgwMDRhCisjZGVmaW5lIEZSRUVfQkFORAkJMHgwMDRiCisjZGVmaW5lIFNVU1BFTkRfRkxBRwkJMHgwMDRjCisvKiBCdWlsZCBpbiB0dW5lcnMgKi8KKyNkZWZpbmUgSVQ5MTM3IDB4MzgKKworZW51bSB7CisJQ01EX0RFTU9EX1JFQUQgPSAwLAorCUNNRF9ERU1PRF9XUklURSwKKwlDTURfVFVORVJfUkVBRCwKKwlDTURfVFVORVJfV1JJVEUsCisJQ01EX1JFR19FRVBST01fUkVBRCwKKwlDTURfUkVHX0VFUFJPTV9XUklURSwKKwlDTURfREFUQV9SRUFELAorCUNNRF9WQVJfUkVBRCA9IDgsCisJQ01EX1ZBUl9XUklURSwKKwlDTURfUExBVEZPUk1fR0VULAorCUNNRF9QTEFURk9STV9TRVQsCisJQ01EX0lQX0NBQ0hFLAorCUNNRF9JUF9BREQsCisJQ01EX0lQX1JFTU9WRSwKKwlDTURfUElEX0FERCwKKwlDTURfUElEX1JFTU9WRSwKKwlDTURfU0lQU0lfR0VULAorCUNNRF9TSVBTSV9NUEVfUkVTRVQsCisJQ01EX0hfUElEX0FERCA9IDB4MTUsCisJQ01EX0hfUElEX1JFTU9WRSwKKwlDTURfQUJPUlQsCisJQ01EX0lSX0dFVCwKKwlDTURfSVJfU0VULAorCUNNRF9GV19ET1dOTE9BRCA9IDB4MjEsCisJQ01EX1FVRVJZSU5GTywKKwlDTURfQk9PVCwKKwlDTURfRldfRE9XTkxPQURfQkVHSU4sCisJQ01EX0ZXX0RPV05MT0FEX0VORCwKKwlDTURfUlVOX0NPREUsCisJQ01EX1NDQVRURVJfUkVBRCA9IDB4MjgsCisJQ01EX1NDQVRURVJfV1JJVEUsCisJQ01EX0dFTkVSSUNfUkVBRCwKKwlDTURfR0VORVJJQ19XUklURQorfTsKKworZW51bSB7CisJUkVBRF9MT05HLAorCVdSSVRFX0xPTkcsCisJUkVBRF9TSE9SVCwKKwlXUklURV9TSE9SVCwKKwlSRUFEX0RBVEEsCisJV1JJVEVfREFUQSwKKwlXUklURV9DTUQsCit9OworCisjZW5kaWYgLyogSVQ5MTNYX0ZFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFkMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMi5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogbG5icDIyLmggLSBkcml2ZXIgZm9yIGxuYiBzdXBwbHkgYW5kIGNvbnRyb2wgaWMgbG5icDIyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IERvbWluaWsgS3VobGVuCisgKiBCYXNlZCBvbiBsbmJwMjEgZHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqCisgKgorICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJsbmJwMjIuaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworCisjZGVmaW5lIGRwcmludGsobHZsLCBhcmcuLi4pIGlmIChkZWJ1ZyA+PSAobHZsKSkgcHJpbnRrKGFyZykKKworc3RydWN0IGxuYnAyMiB7CisJdTgJCSAgICBjb25maWdbNF07CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7Cit9OworCitzdGF0aWMgaW50IGxuYnAyMl9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCXN0cnVjdCBsbmJwMjIgKmxuYnAyMiA9IChzdHJ1Y3QgbG5icDIyICopZmUtPnNlY19wcml2OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSAweDA4LAorCQkuZmxhZ3MgPSAwLAorCQkuYnVmID0gKGNoYXIgKikmbG5icDIyLT5jb25maWcsCisJCS5sZW4gPSBzaXplb2YobG5icDIyLT5jb25maWcpLAorCX07CisKKwlkcHJpbnRrKDEsICIlczogJWQgKDE4Vj0lZCAxM1Y9JWQpXG4iLCBfX2Z1bmNfXywgdm9sdGFnZSwKKwkgICAgICAgU0VDX1ZPTFRBR0VfMTgsIFNFQ19WT0xUQUdFXzEzKTsKKworCWxuYnAyMi0+Y29uZmlnWzNdID0gMHg2MDsgLyogUG93ZXIgZG93biAqLworCXN3aXRjaCAodm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFXzEzOgorCQlsbmJwMjItPmNvbmZpZ1szXSB8PSBMTkJQMjJfRU47CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCWxuYnAyMi0+Y29uZmlnWzNdIHw9IChMTkJQMjJfRU4gfCBMTkJQMjJfVlNFTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlkcHJpbnRrKDEsICIlczogMHglMDJ4KVxuIiwgX19mdW5jX18sIGxuYnAyMi0+Y29uZmlnWzNdKTsKKwlyZXR1cm4gKGkyY190cmFuc2ZlcihsbmJwMjItPmkyYywgJm1zZywgMSkgPT0gMSkgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBsbmJwMjJfZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGxvbmcgYXJnKQoreworCXN0cnVjdCBsbmJwMjIgKmxuYnAyMiA9IChzdHJ1Y3QgbG5icDIyICopIGZlLT5zZWNfcHJpdjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gMHgwOCwKKwkJLmZsYWdzID0gMCwKKwkJLmJ1ZiA9IChjaGFyICopJmxuYnAyMi0+Y29uZmlnLAorCQkubGVuID0gc2l6ZW9mKGxuYnAyMi0+Y29uZmlnKSwKKwl9OworCisJZHByaW50aygxLCAiJXM6ICVkXG4iLCBfX2Z1bmNfXywgKGludClhcmcpOworCWlmIChhcmcpCisJCWxuYnAyMi0+Y29uZmlnWzNdIHw9IExOQlAyMl9MTEM7CisJZWxzZQorCQlsbmJwMjItPmNvbmZpZ1szXSAmPSB+TE5CUDIyX0xMQzsKKworCXJldHVybiAoaTJjX3RyYW5zZmVyKGxuYnAyMi0+aTJjLCAmbXNnLCAxKSA9PSAxKSA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBsbmJwMjJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlkcHJpbnRrKDEsICIlc1xuIiwgX19mdW5jX18pOworCS8qIExOQlAgcG93ZXIgb2ZmICovCisJbG5icDIyX3NldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV9PRkYpOworCisJLyogZnJlZSBkYXRhICovCisJa2ZyZWUoZmUtPnNlY19wcml2KTsKKwlmZS0+c2VjX3ByaXYgPSBOVUxMOworfQorCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpsbmJwMjJfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlzdHJ1Y3QgbG5icDIyICpsbmJwMjIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG5icDIyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsbmJwMjIpCisJCXJldHVybiBOVUxMOworCisJLyogZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisJbG5icDIyLT5jb25maWdbMF0gPSAweDAwOyAvKiA/ICovCisJbG5icDIyLT5jb25maWdbMV0gPSAweDI4OyAvKiA/ICovCisJbG5icDIyLT5jb25maWdbMl0gPSAweDQ4OyAvKiA/ICovCisJbG5icDIyLT5jb25maWdbM10gPSAweDYwOyAvKiBQb3dlciBkb3duICovCisJbG5icDIyLT5pMmMgPSBpMmM7CisJZmUtPnNlY19wcml2ID0gbG5icDIyOworCisJLyogZGV0ZWN0IGlmIGl0IGlzIHByZXNlbnQgb3Igbm90ICovCisJaWYgKGxuYnAyMl9zZXRfdm9sdGFnZShmZSwgU0VDX1ZPTFRBR0VfT0ZGKSkgeworCQlkcHJpbnRrKDAsICIlcyBMTkJQMjIgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCWtmcmVlKGxuYnAyMik7CisJCWZlLT5zZWNfcHJpdiA9IE5VTEw7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGluc3RhbGwgcmVsZWFzZSBjYWxsYmFjayAqLworCWZlLT5vcHMucmVsZWFzZV9zZWMgPSBsbmJwMjJfcmVsZWFzZTsKKworCS8qIG92ZXJyaWRlIGZyb250ZW5kIG9wcyAqLworCWZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBsbmJwMjJfc2V0X3ZvbHRhZ2U7CisJZmUtPm9wcy5lbmFibGVfaGlnaF9sbmJfdm9sdGFnZSA9IGxuYnAyMl9lbmFibGVfaGlnaF9sbmJfdm9sdGFnZTsKKworCXJldHVybiBmZTsKK30KK0VYUE9SVF9TWU1CT0wobG5icDIyX2F0dGFjaCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBsbmIgc3VwcGx5IGFuZCBjb250cm9sIGljIGxuYnAyMiIpOworTU9EVUxFX0FVVEhPUigiRG9taW5payBLdWhsZW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2UyZGVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBsbmJwMjIuaCAtIGRyaXZlciBmb3IgbG5iIHN1cHBseSBhbmQgY29udHJvbCBpYyBsbmJwMjIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRG9taW5payBLdWhsZW4KKyAqIEJhc2VkIG9uIGxuYnAyMS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqCisgKgorICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcKKyAqLworCisjaWZuZGVmIF9MTkJQMjJfSAorI2RlZmluZSBfTE5CUDIyX0gKKworLyogRW5hYmxlICovCisjZGVmaW5lIExOQlAyMl9FTgkgIDB4MTAKKy8qIFZvbHRhZ2Ugc2VsZWN0aW9uICovCisjZGVmaW5lIExOQlAyMl9WU0VMCTB4MDIKKy8qIFBsdXMgMSBWb2x0IEJpdCAqLworI2RlZmluZSBMTkJQMjJfTExDCTB4MDEKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0xOQlAyMikgfHwgXAorCQkoZGVmaW5lZChDT05GSUdfRFZCX0xOQlAyMl9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKKy8qCisgKiBvdmVycmlkZV9zZXQgYW5kIG92ZXJyaWRlX2NsZWFyIGNvbnRyb2wgd2hpY2ggc3lzdGVtIHJlZ2lzdGVyIGJpdHMgKGFib3ZlKQorICogdG8gYWx3YXlzIHNldCAmIGNsZWFyCisgKi8KK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpsbmJwMjJfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkJc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqbG5icDIyX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIENPTkZJR19EVkJfTE5CUDIyICovCisKKyNlbmRpZiAvKiBfTE5CUDIyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2FsZ28uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2FsZ28uYwppbmRleCBkNzBlZWUwLi4xMTdhNTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9hbGdvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfYWxnby5jCkBAIC0zNTgsNiArMzU4LDkgQEAKIAllbHNlCiAJCWRhdGFUaW1lID0gNTAwOwogCisJLyogY2xlYXIgcHJldmlvdXMgZmFpbGVkIEVORF9MT09QVklUICovCisJc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9WU1RBVFVTKTsKKwogCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RTVEFUVVMyLCAweDAwKTsgLyogZm9yY2Ugc2VhcmNoIGxvb3AJKi8KIAl3aGlsZSAoMSkgewogCQkvKiBXQVJOSU5HISBWSVQgTE9DS0VEIGhhcyB0byBiZSB0ZXN0ZWQgYmVmb3JlIFZJVF9FTkRfTE9PT1AJKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKaW5kZXggMzdhMjIyZC4uODQwOGVmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKQEAgLTcwNiw3ICs3MDYsNyBAQAogCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0NOVFJMMSwgcmVnKTsKIAlmb3IgKGkgPSAwOyBpIDwgY21kLT5tc2dfbGVuOyBpKyspIHsKIAkJLyogd2FpdCBmb3IgRklGTyBlbXB0eQkqLwotCQlpZiAoc3RiMDg5OV93YWl0X2Rpc2VxY19maWZvX2VtcHR5KHN0YXRlLCAxMCkgPCAwKQorCQlpZiAoc3RiMDg5OV93YWl0X2Rpc2VxY19maWZvX2VtcHR5KHN0YXRlLCAxMDApIDwgMCkKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCiAJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0ZJRk8sIGNtZC0+bXNnW2ldKTsKQEAgLTE0MjYsOSArMTQyNiw5IEBACiAJaWYgKGl0ZXJfc2NhbGUgPiBjb25maWctPmxkcGNfbWF4X2l0ZXIpCiAJCWl0ZXJfc2NhbGUgPSBjb25maWctPmxkcGNfbWF4X2l0ZXI7CiAKLQlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBNQVhfSVRFUik7CisJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJGRUMsIE1BWF9JVEVSKTsKIAlTVEIwODk5X1NFVEZJRUxEX1ZBTChNQVhfSVRFUkFUSU9OUywgcmVnLCBpdGVyX3NjYWxlKTsKLQlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9NQVhfSVRFUiwgU1RCMDg5OV9PRkYwX01BWF9JVEVSLCByZWcpOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJGRUMsIFNUQjA4OTlfQkFTRV9NQVhfSVRFUiwgU1RCMDg5OV9PRkYwX01BWF9JVEVSLCByZWcpOwogfQogCiBzdGF0aWMgZW51bSBkdmJmZV9zZWFyY2ggc3RiMDg5OV9zZWFyY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjg4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI4OC5jCmluZGV4IDhlMGNmYWQuLjBhYTM5NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjg4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyODguYwpAQCAtMTI3LDYgKzEyNywxMSBAQAogCWlmICgoc3JhdGUgPCAxMDAwMDAwKSB8fCAoc3JhdGUgPiA0NTAwMDAwMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MjIsIDApOworCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDIzLCAwKTsKKwlzdHYwMjg4X3dyaXRlcmVnSShzdGF0ZSwgMHgyYiwgMHhmZik7CisJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MmMsIDB4ZjcpOworCiAJdGVtcCA9ICh1bnNpZ25lZCBpbnQpc3JhdGUgLyAxMDAwOwogCiAJCXRlbXAgPSB0ZW1wICogMzI3Njg7CkBAIC00NjEsNiArNDY2LDcgQEAKIAogCWNoYXIgdG07CiAJdW5zaWduZWQgY2hhciB0ZGFbM107CisJdTggcmVnLCB0aW1lX291dCA9IDA7CiAKIAlkcHJpbnRrKCIlcyA6IEZFX1NFVF9GUk9OVEVORFxuIiwgX19mdW5jX18pOwogCkBAIC00ODgsMjIgKzQ5NCwyOSBAQAogCS8qIENhcnJpZXIgbG9jayBjb250cm9sIHJlZ2lzdGVyICovCiAJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MTUsIDB4YzUpOwogCi0JdGRhWzBdID0gMHgyYjsgLyogQ0ZSTSAqLwogCXRkYVsyXSA9IDB4MDsgLyogQ0ZSTCAqLwotCWZvciAodG0gPSAtNjsgdG0gPCA3OykgeworCWZvciAodG0gPSAtOTsgdG0gPCA3OykgewogCQkvKiBWaXRlcmJpIHN0YXR1cyAqLwotCQlpZiAoc3R2MDI4OF9yZWFkcmVnKHN0YXRlLCAweDI0KSAmIDB4OCkKLQkJCWJyZWFrOwotCi0JCXRkYVsyXSArPSA0MDsKLQkJaWYgKHRkYVsyXSA8IDQwKQorCQlyZWcgPSBzdHYwMjg4X3JlYWRyZWcoc3RhdGUsIDB4MjQpOworCQlpZiAocmVnICYgMHg4KQorCQkJCWJyZWFrOworCQlpZiAocmVnICYgMHg4MCkgeworCQkJdGltZV9vdXQrKzsKKwkJCWlmICh0aW1lX291dCA+IDEwKQorCQkJCWJyZWFrOworCQkJdGRhWzJdICs9IDQwOworCQkJaWYgKHRkYVsyXSA8IDQwKQorCQkJCXRtKys7CisJCX0gZWxzZSB7CiAJCQl0bSsrOworCQkJdGRhWzJdID0gMDsKKwkJCXRpbWVfb3V0ID0gMDsKKwkJfQogCQl0ZGFbMV0gPSAodW5zaWduZWQgY2hhcil0bTsKIAkJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MmIsIHRkYVsxXSk7CiAJCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDJjLCB0ZGFbMl0pOwogCQl1ZGVsYXkoMzApOwogCX0KLQogCXN0YXRlLT50dW5lcl9mcmVxdWVuY3kgPSBjLT5mcmVxdWVuY3k7CiAJc3RhdGUtPmZlY19pbm5lciA9IEZFQ19BVVRPOwogCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IGMtPnN5bWJvbF9yYXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTB4LmMKaW5kZXggNTJkODcxMi4uZWJkYTQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkweC5jCkBAIC0zNDYzLDkgKzM0NjMsMTUgQEAKIHN0YXRpYyBpbnQgc3R2MDkweF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZW51bSBmZV9zdGF0dXMgKnN0YXR1cykKIHsKIAlzdHJ1Y3Qgc3R2MDkweF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1MzIgcmVnOworCXUzMiByZWcsIGRzdGF0dXM7CiAJdTggc2VhcmNoX3N0YXRlOwogCisJKnN0YXR1cyA9IDA7CisKKwlkc3RhdHVzID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBEU1RBVFVTKTsKKwlpZiAoU1RWMDkweF9HRVRGSUVMRF9QeChkc3RhdHVzLCBDQVJfTE9DS19GSUVMRCkpCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSOworCiAJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBETURTVEFURSk7CiAJc2VhcmNoX3N0YXRlID0gU1RWMDkweF9HRVRGSUVMRF9QeChyZWcsIEhFQURFUl9NT0RFX0ZJRUxEKTsKIApAQCAtMzQ3NCw0MSArMzQ4MCwzMCBAQAogCWNhc2UgMTogLyogZmlyc3QgUExIIGRldGVjdGVkICovCiAJZGVmYXVsdDoKIAkJZHByaW50ayhGRV9ERUJVRywgMSwgIlN0YXR1czogVW5sb2NrZWQgKFNlYXJjaGluZyAuLikiKTsKLQkJKnN0YXR1cyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSAyOiAvKiBEVkItUzIgbW9kZSAqLwogCQlkcHJpbnRrKEZFX0RFQlVHLCAxLCAiRGVsaXZlcnkgc3lzdGVtOiBEVkItUzIiKTsKLQkJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBEU1RBVFVTKTsKLQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBMT0NLX0RFRklOSVRJRl9GSUVMRCkpIHsKKwkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgoZHN0YXR1cywgTE9DS19ERUZJTklUSUZfRklFTEQpKSB7CiAJCQlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIFBERUxTVEFUVVMxKTsKIAkJCWlmIChTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZywgUEtUREVMSU5fTE9DS19GSUVMRCkpIHsKKwkJCQkqc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJOwogCQkJCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgVFNTVEFUVVMpOwotCQkJCWlmIChTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZywgVFNGSUZPX0xJTkVPS19GSUVMRCkpIHsKLQkJCQkJKnN0YXR1cyA9IEZFX0hBU19TSUdOQUwgfAotCQkJCQkJICBGRV9IQVNfQ0FSUklFUiB8Ci0JCQkJCQkgIEZFX0hBU19WSVRFUkJJIHwKLQkJCQkJCSAgRkVfSEFTX1NZTkMgfAotCQkJCQkJICBGRV9IQVNfTE9DSzsKLQkJCQl9CisJCQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBUU0ZJRk9fTElORU9LX0ZJRUxEKSkKKwkJCQkJKnN0YXR1cyB8PSBGRV9IQVNfU1lOQyB8IEZFX0hBU19MT0NLOwogCQkJfQogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSAzOiAvKiBEVkItUzEvbGVnYWN5IG1vZGUgKi8KIAkJZHByaW50ayhGRV9ERUJVRywgMSwgIkRlbGl2ZXJ5IHN5c3RlbTogRFZCLVMiKTsKLQkJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBEU1RBVFVTKTsKLQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBMT0NLX0RFRklOSVRJRl9GSUVMRCkpIHsKKwkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgoZHN0YXR1cywgTE9DS19ERUZJTklUSUZfRklFTEQpKSB7CiAJCQlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIFZTVEFUVVNWSVQpOwogCQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBMT0NLRURWSVRfRklFTEQpKSB7CisJCQkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKIAkJCQlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIFRTU1RBVFVTKTsKLQkJCQlpZiAoU1RWMDkweF9HRVRGSUVMRF9QeChyZWcsIFRTRklGT19MSU5FT0tfRklFTEQpKSB7Ci0JCQkJCSpzdGF0dXMgPSBGRV9IQVNfU0lHTkFMIHwKLQkJCQkJCSAgRkVfSEFTX0NBUlJJRVIgfAotCQkJCQkJICBGRV9IQVNfVklURVJCSSB8Ci0JCQkJCQkgIEZFX0hBU19TWU5DIHwKLQkJCQkJCSAgRkVfSEFTX0xPQ0s7Ci0JCQkJfQorCQkJCWlmIChTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZywgVFNGSUZPX0xJTkVPS19GSUVMRCkpCisJCQkJCSpzdGF0dXMgfD0gRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKIAkJCX0KIAkJfQogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0OC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDQ4LmMKaW5kZXggOTNmNmE3NS4uN2YxMDU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDQ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDQ4LmMKQEAgLTIwNiwxNSArMjA2LDE2IEBACiBzdGF0aWMgc3RydWN0IHBsbF90YWIgewogCXUzMgljbGtfZnJlcV9raHo7CiAJdTMyCWlmX2ZyZXFfa2h6OwotCXU4CW0sIG4sIHA7CiB9IHBsbF90YWJbXSA9IHsKLQl7IFREQTEwMDQ4X0NMS180MDAwLCAgVERBMTAwNDhfSUZfMzYxMzAsIDEwLCAwLCAwIH0sCi0JeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzMzMDAsICAxMCwgMywgMCB9LAotCXsgVERBMTAwNDhfQ0xLXzE2MDAwLCBUREExMDA0OF9JRl8zNTAwLCAgMTAsIDMsIDAgfSwKLQl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfMzgwMCwgIDEwLCAzLCAwIH0sCi0JeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzQwMDAsICAxMCwgMywgMCB9LAotCXsgVERBMTAwNDhfQ0xLXzE2MDAwLCBUREExMDA0OF9JRl80MzAwLCAgMTAsIDMsIDAgfSwKLQl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfMzYxMzAsIDEwLCAzLCAwIH0sCisJeyBUREExMDA0OF9DTEtfNDAwMCwgIFREQTEwMDQ4X0lGXzM2MTMwIH0sCisJeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzMzMDAgfSwKKwl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfMzUwMCB9LAorCXsgVERBMTAwNDhfQ0xLXzE2MDAwLCBUREExMDA0OF9JRl8zODAwIH0sCisJeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzQwMDAgfSwKKwl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfNDMwMCB9LAorCXsgVERBMTAwNDhfQ0xLXzE2MDAwLCBUREExMDA0OF9JRl80NTAwIH0sCisJeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzUwMDAgfSwKKwl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfMzYxMzAgfSwKIH07CiAKIHN0YXRpYyBpbnQgdGRhMTAwNDhfd3JpdGVyZWcoc3RydWN0IHRkYTEwMDQ4X3N0YXRlICpzdGF0ZSwgdTggcmVnLCB1OCBkYXRhKQpAQCAtNDYwLDkgKzQ2MSw2IEBACiAKIAkJCXN0YXRlLT5mcmVxX2lmX2h6ID0gcGxsX3RhYltpXS5pZl9mcmVxX2toeiAqIDEwMDA7CiAJCQlzdGF0ZS0+eHRhbF9oeiA9IHBsbF90YWJbaV0uY2xrX2ZyZXFfa2h6ICogMTAwMDsKLQkJCXN0YXRlLT5wbGxfbWZhY3RvciA9IHBsbF90YWJbaV0ubTsKLQkJCXN0YXRlLT5wbGxfbmZhY3RvciA9IHBsbF90YWJbaV0ubjsKLQkJCXN0YXRlLT5wbGxfcGZhY3RvciA9IHBsbF90YWJbaV0ucDsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNzgxLDYgKzc3OSwxMCBAQAogCiAJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCisJLyogUExMICovCisJaW5pdF90YWJbNF0uZGF0YSA9ICh1OCkoc3RhdGUtPnBsbF9tZmFjdG9yKTsKKwlpbml0X3RhYls1XS5kYXRhID0gKHU4KShzdGF0ZS0+cGxsX25mYWN0b3IpIHwgMHg0MDsKKwogCS8qIEFwcGx5IHJlZ2lzdGVyIGRlZmF1bHRzICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF90YWIpOyBpKyspCiAJCXRkYTEwMDQ4X3dyaXRlcmVnKHN0YXRlLCBpbml0X3RhYltpXS5yZWcsIGluaXRfdGFiW2ldLmRhdGEpOwpAQCAtMTEyMyw3ICsxMTI1LDcgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgYW5kIGNsb25lIHRoZSBjb25maWcgKi8KIAltZW1jcHkoJnN0YXRlLT5jb25maWcsIGNvbmZpZywgc2l6ZW9mKCpjb25maWcpKTsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCXN0YXRlLT5md2xvYWRlZCA9IDA7CisJc3RhdGUtPmZ3bG9hZGVkID0gY29uZmlnLT5ub19maXJtd2FyZTsKIAlzdGF0ZS0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzhfTUhaOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHByZXNlbnQgKi8KQEAgLTExMzUsNiArMTEzNywxNyBAQAogCQlzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCisJLyogc2V0IHBsbCAqLworCWlmIChjb25maWctPnNldF9wbGwpIHsKKwkJc3RhdGUtPnBsbF9tZmFjdG9yID0gY29uZmlnLT5wbGxfbTsKKwkJc3RhdGUtPnBsbF9uZmFjdG9yID0gY29uZmlnLT5wbGxfbjsKKwkJc3RhdGUtPnBsbF9wZmFjdG9yID0gY29uZmlnLT5wbGxfcDsKKwl9IGVsc2UgeworCQlzdGF0ZS0+cGxsX21mYWN0b3IgPSAxMDsKKwkJc3RhdGUtPnBsbF9uZmFjdG9yID0gMzsKKwkJc3RhdGUtPnBsbF9wZmFjdG9yID0gMDsKKwl9CisKIAkvKiBFc3RhYmxpc2ggYW55IGRlZmF1bHRzIHRoZSB0aGUgdXNlciBkaWRuJ3QgcGFzcyAqLwogCXRkYTEwMDQ4X2VzdGFibGlzaF9kZWZhdWx0cygmc3RhdGUtPmZyb250ZW5kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDQ4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNDguaAppbmRleCA4ODI4Y2VhLi5mYjJlZjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNDguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNDguaApAQCAtNTEsNiArNTEsNyBAQAogI2RlZmluZSBUREExMDA0OF9JRl80MzAwICA0MzAwCiAjZGVmaW5lIFREQTEwMDQ4X0lGXzQ1MDAgIDQ1MDAKICNkZWZpbmUgVERBMTAwNDhfSUZfNDc1MCAgNDc1MAorI2RlZmluZSBUREExMDA0OF9JRl81MDAwICA1MDAwCiAjZGVmaW5lIFREQTEwMDQ4X0lGXzM2MTMwIDM2MTMwCiAJdTE2IGR0djZfaWZfZnJlcV9raHo7CiAJdTE2IGR0djdfaWZfZnJlcV9raHo7CkBAIC02Miw2ICs2MywxMyBAQAogCiAJLyogRGlzYWJsZSBJMkMgZ2F0ZSBhY2Nlc3MgKi8KIAl1OCBkaXNhYmxlX2dhdGVfYWNjZXNzOworCisJYm9vbCBub19maXJtd2FyZTsKKworCWJvb2wgc2V0X3BsbDsKKwl1OCBwbGxfbTsKKwl1OCBwbGxfcDsKKwl1OCBwbGxfbjsKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwNDgpIHx8IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA3MS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDcxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzNzQzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA3MS5jCkBAIC0wLDAgKzEsMTI2OSBAQAorLyoKKyAqIE5YUCBUREExMDA3MSArIENvbmV4YW50IENYMjQxMThBIERWQi1TL1MyIGRlbW9kdWxhdG9yICsgdHVuZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgInRkYTEwMDcxX3ByaXYuaCIKKworaW50IHRkYTEwMDcxX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCB0ZGExMDA3MV9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBmcm9udGVuZCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHRkYTEwMDcxX29wczsKKworLyogd3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHRkYTEwMDcxX3dyX3JlZ3Moc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYsIHU4IHJlZywgdTggKnZhbCwKKwlpbnQgbGVuKQoreworCWludCByZXQ7CisJdTggYnVmW2xlbisxXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMV0gPSB7CisJCXsKKwkJCS5hZGRyID0gcHJpdi0+Y2ZnLmkyY19hZGRyZXNzLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSBzaXplb2YoYnVmKSwKKwkJCS5idWYgPSBidWYsCisJCX0KKwl9OworCisJYnVmWzBdID0gcmVnOworCW1lbWNweSgmYnVmWzFdLCB2YWwsIGxlbik7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCBtc2csIDEpOworCWlmIChyZXQgPT0gMSkgeworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXdhcm4oImkyYyB3ciBmYWlsZWQ9JWQgcmVnPSUwMnggbGVuPSVkIiwgcmV0LCByZWcsIGxlbik7CisJCXJldCA9IC1FUkVNT1RFSU87CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIHJlYWQgbXVsdGlwbGUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHRkYTEwMDcxX3JkX3JlZ3Moc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYsIHU4IHJlZywgdTggKnZhbCwKKwlpbnQgbGVuKQoreworCWludCByZXQ7CisJdTggYnVmW2xlbl07CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQl7CisJCQkuYWRkciA9IHByaXYtPmNmZy5pMmNfYWRkcmVzcywKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSAmcmVnLAorCQl9LCB7CisJCQkuYWRkciA9IHByaXYtPmNmZy5pMmNfYWRkcmVzcywKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IHNpemVvZihidWYpLAorCQkJLmJ1ZiA9IGJ1ZiwKKwkJfQorCX07CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCBtc2csIDIpOworCWlmIChyZXQgPT0gMikgeworCQltZW1jcHkodmFsLCBidWYsIGxlbik7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJd2FybigiaTJjIHJkIGZhaWxlZD0lZCByZWc9JTAyeCBsZW49JWQiLCByZXQsIHJlZywgbGVuKTsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogd3JpdGUgc2luZ2xlIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IHRkYTEwMDcxX3dyX3JlZyhzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiwgdTggcmVnLCB1OCB2YWwpCit7CisJcmV0dXJuIHRkYTEwMDcxX3dyX3JlZ3MocHJpdiwgcmVnLCAmdmFsLCAxKTsKK30KKworLyogcmVhZCBzaW5nbGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbnQgdGRhMTAwNzFfcmRfcmVnKHN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2LCB1OCByZWcsIHU4ICp2YWwpCit7CisJcmV0dXJuIHRkYTEwMDcxX3JkX3JlZ3MocHJpdiwgcmVnLCB2YWwsIDEpOworfQorCisvKiB3cml0ZSBzaW5nbGUgcmVnaXN0ZXIgd2l0aCBtYXNrICovCitpbnQgdGRhMTAwNzFfd3JfcmVnX21hc2soc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYsIHU4IHJlZywgdTggdmFsLCB1OCBtYXNrKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJLyogbm8gbmVlZCBmb3IgcmVhZCBpZiB3aG9sZSByZWcgaXMgd3JpdHRlbiAqLworCWlmIChtYXNrICE9IDB4ZmYpIHsKKwkJcmV0ID0gdGRhMTAwNzFfcmRfcmVncyhwcml2LCByZWcsICZ0bXAsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQl2YWwgJj0gbWFzazsKKwkJdG1wICY9IH5tYXNrOworCQl2YWwgfD0gdG1wOworCX0KKworCXJldHVybiB0ZGExMDA3MV93cl9yZWdzKHByaXYsIHJlZywgJnZhbCwgMSk7Cit9CisKKy8qIHJlYWQgc2luZ2xlIHJlZ2lzdGVyIHdpdGggbWFzayAqLworaW50IHRkYTEwMDcxX3JkX3JlZ19tYXNrKHN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2LCB1OCByZWcsIHU4ICp2YWwsIHU4IG1hc2spCit7CisJaW50IHJldCwgaTsKKwl1OCB0bXA7CisKKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWdzKHByaXYsIHJlZywgJnRtcCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXRtcCAmPSBtYXNrOworCisJLyogZmluZCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYml0ICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoKG1hc2sgPj4gaSkgJiAweDAxKQorCQkJYnJlYWs7CisJfQorCSp2YWwgPSB0bXAgPj4gaTsKKworCXJldHVybiAwOworfQorCisvKiBleGVjdXRlIGZpcm13YXJlIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgdGRhMTAwNzFfY21kX2V4ZWN1dGUoc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYsCisJc3RydWN0IHRkYTEwMDcxX2NtZCAqY21kKQoreworCWludCByZXQsIGk7CisJdTggdG1wOworCisJaWYgKCFwcml2LT53YXJtKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogd3JpdGUgY21kIGFuZCBhcmdzIGZvciBmaXJtd2FyZSAqLworCXJldCA9IHRkYTEwMDcxX3dyX3JlZ3MocHJpdiwgMHgwMCwgY21kLT5hcmdzLCBjbWQtPmxlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHN0YXJ0IGNtZCBleGVjdXRpb24gKi8KKwlyZXQgPSB0ZGExMDA3MV93cl9yZWcocHJpdiwgMHgxZiwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHdhaXQgY21kIGV4ZWN1dGlvbiB0ZXJtaW5hdGUgKi8KKwlmb3IgKGkgPSAxMDAwLCB0bXAgPSAxOyBpICYmIHRtcDsgaS0tKSB7CisJCXJldCA9IHRkYTEwMDcxX3JkX3JlZyhwcml2LCAweDFmLCAmdG1wKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJdXNsZWVwX3JhbmdlKDIwMCwgNTAwMCk7CisJfQorCisJZGJnKCIlczogbG9vcD0lZCIsIF9fZnVuY19fLCBpKTsKKworCWlmIChpID09IDApIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9zZXRfdG9uZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlmZV9zZWNfdG9uZV9tb2RlX3QgZmVfc2VjX3RvbmVfbW9kZSkKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDA3MV9jbWQgY21kOworCWludCByZXQ7CisJdTggdG9uZTsKKworCWlmICghcHJpdi0+d2FybSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCWRiZygiJXM6IHRvbmVfbW9kZT0lZCIsIF9fZnVuY19fLCBmZV9zZWNfdG9uZV9tb2RlKTsKKworCXN3aXRjaCAoZmVfc2VjX3RvbmVfbW9kZSkgeworCWNhc2UgU0VDX1RPTkVfT046CisJCXRvbmUgPSAxOworCQlicmVhazsKKwljYXNlIFNFQ19UT05FX09GRjoKKwkJdG9uZSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRiZygiJXM6IGludmFsaWQgZmVfc2VjX3RvbmVfbW9kZSIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwljbWQuYXJnc1sweDAwXSA9IENNRF9MTkJfUENCX0NPTkZJRzsKKwljbWQuYXJnc1sweDAxXSA9IDA7CisJY21kLmFyZ3NbMHgwMl0gPSAweDAwOworCWNtZC5hcmdzWzB4MDNdID0gMHgwMDsKKwljbWQuYXJnc1sweDA0XSA9IHRvbmU7CisJY21kLmxlbiA9IDB4MDU7CisJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCWZlX3NlY192b2x0YWdlX3QgZmVfc2VjX3ZvbHRhZ2UpCit7CisJc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwNzFfY21kIGNtZDsKKwlpbnQgcmV0OworCXU4IHZvbHRhZ2U7CisKKwlpZiAoIXByaXYtPndhcm0pIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkYmcoIiVzOiB2b2x0YWdlPSVkIiwgX19mdW5jX18sIGZlX3NlY192b2x0YWdlKTsKKworCXN3aXRjaCAoZmVfc2VjX3ZvbHRhZ2UpIHsKKwljYXNlIFNFQ19WT0xUQUdFXzEzOgorCQl2b2x0YWdlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV8xODoKKwkJdm9sdGFnZSA9IDE7CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQl2b2x0YWdlID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGJnKCIlczogaW52YWxpZCBmZV9zZWNfdm9sdGFnZSIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9OworCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfTE5CX1NFVF9EQ19MRVZFTDsKKwljbWQuYXJnc1sweDAxXSA9IDA7CisJY21kLmFyZ3NbMHgwMl0gPSB2b2x0YWdlOworCWNtZC5sZW4gPSAweDAzOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKmRpc2VxY19jbWQpCit7CisJc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwNzFfY21kIGNtZDsKKwlpbnQgcmV0LCBpOworCXU4IHRtcDsKKworCWlmICghcHJpdi0+d2FybSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCWRiZygiJXM6IG1zZ19sZW49JWQiLCBfX2Z1bmNfXywgZGlzZXFjX2NtZC0+bXNnX2xlbik7CisKKwlpZiAoZGlzZXFjX2NtZC0+bXNnX2xlbiA8IDMgfHwgZGlzZXFjX2NtZC0+bXNnX2xlbiA+IDE2KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogd2FpdCBMTkIgVFggKi8KKwlmb3IgKGkgPSA1MDAsIHRtcCA9IDA7IGkgJiYgIXRtcDsgaS0tKSB7CisJCXJldCA9IHRkYTEwMDcxX3JkX3JlZ19tYXNrKHByaXYsIDB4NDcsICZ0bXAsIDB4MDEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKKwl9CisKKwlkYmcoIiVzOiBsb29wPSVkIiwgX19mdW5jX18sIGkpOworCisJaWYgKGkgPT0gMCkgeworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIDB4NDcsIDB4MDAsIDB4MDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwljbWQuYXJnc1sweDAwXSA9IENNRF9MTkJfU0VORF9ESVNFUUM7CisJY21kLmFyZ3NbMHgwMV0gPSAwOworCWNtZC5hcmdzWzB4MDJdID0gMDsKKwljbWQuYXJnc1sweDAzXSA9IDA7CisJY21kLmFyZ3NbMHgwNF0gPSAyOworCWNtZC5hcmdzWzB4MDVdID0gMDsKKwljbWQuYXJnc1sweDA2XSA9IGRpc2VxY19jbWQtPm1zZ19sZW47CisJbWVtY3B5KCZjbWQuYXJnc1sweDA3XSwgZGlzZXFjX2NtZC0+bXNnLCBkaXNlcWNfY21kLT5tc2dfbGVuKTsKKwljbWQubGVuID0gMHgwNyArIGRpc2VxY19jbWQtPm1zZ19sZW47CisJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX2Rpc2VxY19yZWN2X3NsYXZlX3JlcGx5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdmJfZGlzZXFjX3NsYXZlX3JlcGx5ICpyZXBseSkKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDA3MV9jbWQgY21kOworCWludCByZXQsIGk7CisJdTggdG1wOworCisJaWYgKCFwcml2LT53YXJtKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGJnKCIlczoiLCBfX2Z1bmNfXyk7CisKKwkvKiB3YWl0IExOQiBSWCAqLworCWZvciAoaSA9IDUwMCwgdG1wID0gMDsgaSAmJiAhdG1wOyBpLS0pIHsKKwkJcmV0ID0gdGRhMTAwNzFfcmRfcmVnX21hc2socHJpdiwgMHg0NywgJnRtcCwgMHgwMik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOworCX0KKworCWRiZygiJXM6IGxvb3A9JWQiLCBfX2Z1bmNfXywgaSk7CisKKwlpZiAoaSA9PSAwKSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogcmVwbHkgbGVuICovCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVnKHByaXYsIDB4NDYsICZ0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXBseS0+bXNnX2xlbiA9IHRtcCAmIDB4MWY7IC8qIFs0OjBdICovOworCWlmIChyZXBseS0+bXNnX2xlbiA+IHNpemVvZihyZXBseS0+bXNnKSkKKwkJcmVwbHktPm1zZ19sZW4gPSBzaXplb2YocmVwbHktPm1zZyk7IC8qIHRydW5jYXRlIEFQSSBtYXggKi8KKworCS8qIHJlYWQgcmVwbHkgKi8KKwljbWQuYXJnc1sweDAwXSA9IENNRF9MTkJfVVBEQVRFX1JFUExZOworCWNtZC5hcmdzWzB4MDFdID0gMDsKKwljbWQubGVuID0gMHgwMjsKKwlyZXQgPSB0ZGExMDA3MV9jbWRfZXhlY3V0ZShwcml2LCAmY21kKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVncyhwcml2LCBjbWQubGVuLCByZXBseS0+bXNnLCByZXBseS0+bXNnX2xlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX2Rpc2VxY19zZW5kX2J1cnN0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCWZlX3NlY19taW5pX2NtZF90IGZlX3NlY19taW5pX2NtZCkKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDA3MV9jbWQgY21kOworCWludCByZXQsIGk7CisJdTggdG1wLCBidXJzdDsKKworCWlmICghcHJpdi0+d2FybSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCWRiZygiJXM6IGZlX3NlY19taW5pX2NtZD0lZCIsIF9fZnVuY19fLCBmZV9zZWNfbWluaV9jbWQpOworCisJc3dpdGNoIChmZV9zZWNfbWluaV9jbWQpIHsKKwljYXNlIFNFQ19NSU5JX0E6CisJCWJ1cnN0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTRUNfTUlOSV9COgorCQlidXJzdCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRiZygiJXM6IGludmFsaWQgZmVfc2VjX21pbmlfY21kIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIHdhaXQgTE5CIFRYICovCisJZm9yIChpID0gNTAwLCB0bXAgPSAwOyBpICYmICF0bXA7IGktLSkgeworCQlyZXQgPSB0ZGExMDA3MV9yZF9yZWdfbWFzayhwcml2LCAweDQ3LCAmdG1wLCAweDAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CisJfQorCisJZGJnKCIlczogbG9vcD0lZCIsIF9fZnVuY19fLCBpKTsKKworCWlmIChpID09IDApIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSB0ZGExMDA3MV93cl9yZWdfbWFzayhwcml2LCAweDQ3LCAweDAwLCAweDAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfTE5CX1NFTkRfVE9ORUJVUlNUOworCWNtZC5hcmdzWzB4MDFdID0gMDsKKwljbWQuYXJnc1sweDAyXSA9IGJ1cnN0OworCWNtZC5sZW4gPSAweDAzOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisJdTggdG1wOworCisJKnN0YXR1cyA9IDA7CisKKwlpZiAoIXByaXYtPndhcm0pIHsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWcocHJpdiwgMHgzOSwgJnRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWlmICh0bXAgJiAweDAxKSAvKiB0dW5lciBQTEwgKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCWlmICh0bXAgJiAweDAyKSAvKiBkZW1vZCBQTEwgKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfQ0FSUklFUjsKKwlpZiAodG1wICYgMHgwNCkgLyogdml0ZXJiaSBvciBMRFBDKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKKwlpZiAodG1wICYgMHgwOCkgLyogUlMgb3IgQkNIICovCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKKworCXByaXYtPmZlX3N0YXR1cyA9ICpzdGF0dXM7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXU4IGJ1ZlsyXTsKKworCWlmICghcHJpdi0+d2FybSB8fCAhKHByaXYtPmZlX3N0YXR1cyAmIEZFX0hBU19MT0NLKSkgeworCQkqc25yID0gMDsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWdzKHByaXYsIDB4M2EsIGJ1ZiwgMik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIEVzL05vIGRCeDEwICovCisJKnNuciA9IGJ1ZlswXSA8PCA4IHwgYnVmWzFdOworCisJcmV0dXJuIHJldDsKK2Vycm9yOgorCWRiZygiJXM6IGZhaWxlZD0lZCIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwNzFfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc3RyZW5ndGgpCit7CisJc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwNzFfY21kIGNtZDsKKwlpbnQgcmV0OworCXU4IHRtcDsKKworCWlmICghcHJpdi0+d2FybSB8fCAhKHByaXYtPmZlX3N0YXR1cyAmIEZFX0hBU19MT0NLKSkgeworCQkqc3RyZW5ndGggPSAwOworCQlyZXQgPSAwOworCQlnb3RvIGVycm9yOworCX0KKworCWNtZC5hcmdzWzB4MDBdID0gQ01EX0dFVF9BR0NBQ0M7CisJY21kLmFyZ3NbMHgwMV0gPSAwOworCWNtZC5sZW4gPSAweDAyOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpbnB1dCBwb3dlciBlc3RpbWF0ZSBkQm0gKi8KKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWcocHJpdiwgMHg1MCwgJnRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWlmICh0bXAgPCAxODEpCisJCXRtcCA9IDE4MTsgLyogLTc1IGRCbSAqLworCWVsc2UgaWYgKHRtcCA+IDIzNikKKwkJdG1wID0gMjM2OyAvKiAtMjAgZEJtICovCisKKwkvKiBzY2FsZSB2YWx1ZSB0byAweDAwMDAtMHhmZmZmICovCisJKnN0cmVuZ3RoID0gKHRtcC0xODEpICogMHhmZmZmIC8gKDIzNi0xODEpOworCisJcmV0dXJuIHJldDsKK2Vycm9yOgorCWRiZygiJXM6IGZhaWxlZD0lZCIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwNzFfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDcxX2NtZCBjbWQ7CisJaW50IHJldCwgaSwgbGVuOworCXU4IHRtcCwgcmVnLCBidWZbOF07CisKKwlpZiAoIXByaXYtPndhcm0gfHwgIShwcml2LT5mZV9zdGF0dXMgJiBGRV9IQVNfTE9DSykpIHsKKwkJKmJlciA9IHByaXYtPmJlciA9IDA7CisJCXJldCA9IDA7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3dpdGNoIChwcml2LT5kZWxpdmVyeV9zeXN0ZW0pIHsKKwljYXNlIFNZU19EVkJTOgorCQlyZWcgPSAweDRjOworCQlsZW4gPSA4OworCQlpID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfRFZCUzI6CisJCXJlZyA9IDB4NGQ7CisJCWxlbiA9IDQ7CisJCWkgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqYmVyID0gcHJpdi0+YmVyID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVnKHByaXYsIHJlZywgJnRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWlmIChwcml2LT5tZWFzX2NvdW50W2ldID09IHRtcCkgeworCQlkYmcoIiVzOiBtZWFzIG5vdCByZWFkeT0lMDJ4IiwgX19mdW5jX18sIHRtcCk7CisJCSpiZXIgPSBwcml2LT5iZXI7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXByaXYtPm1lYXNfY291bnRbaV0gPSB0bXA7CisJfQorCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfQkVSX1VQREFURV9DT1VOVEVSUzsKKwljbWQuYXJnc1sweDAxXSA9IDA7CisJY21kLmFyZ3NbMHgwMl0gPSBpOworCWNtZC5sZW4gPSAweDAzOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWdzKHByaXYsIGNtZC5sZW4sIGJ1ZiwgbGVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJaWYgKHByaXYtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfRFZCUykgeworCQkqYmVyID0gKGJ1ZlswXSA8PCAyNCkgfCAoYnVmWzFdIDw8IDE2KSB8IChidWZbMl0gPDwgOCkgfCBidWZbM107CisJCXByaXYtPnVjYiArPSAoYnVmWzRdIDw8IDgpIHwgYnVmWzVdOworCX0gZWxzZSB7CisJCSpiZXIgPSAoYnVmWzBdIDw8IDgpIHwgYnVmWzFdOworCX0KKwlwcml2LT5iZXIgPSAqYmVyOworCisJcmV0dXJuIHJldDsKK2Vycm9yOgorCWRiZygiJXM6IGZhaWxlZD0lZCIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwNzFfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQgPSAwOworCisJaWYgKCFwcml2LT53YXJtIHx8ICEocHJpdi0+ZmVfc3RhdHVzICYgRkVfSEFTX0xPQ0spKSB7CisJCSp1Y2Jsb2NrcyA9IDA7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogVUNCIGlzIHVwZGF0ZWQgd2hlbiBCRVIgaXMgcmVhZC4gQXNzdW1lIEJFUiBpcyByZWFkIGFueXdheS4gKi8KKworCSp1Y2Jsb2NrcyA9IHByaXYtPnVjYjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDA3MV9jbWQgY21kOworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOworCWludCByZXQsIGk7CisJdTggbW9kZSwgcm9sbG9mZiwgcGlsb3QsIGludmVyc2lvbiwgZGl2OworCisJZGJnKCIlczogZGVsaXZlcnlfc3lzdGVtPSVkIG1vZHVsYXRpb249JWQgZnJlcXVlbmN5PSVkICIgXAorCQkic3ltYm9sX3JhdGU9JWQgaW52ZXJzaW9uPSVkIHBpbG90PSVkIHJvbGxvZmY9JWQiLCBfX2Z1bmNfXywKKwkJYy0+ZGVsaXZlcnlfc3lzdGVtLCBjLT5tb2R1bGF0aW9uLCBjLT5mcmVxdWVuY3ksCisJCWMtPnN5bWJvbF9yYXRlLCBjLT5pbnZlcnNpb24sIGMtPnBpbG90LCBjLT5yb2xsb2ZmKTsKKworCXByaXYtPmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19VTkRFRklORUQ7CisKKwlpZiAoIXByaXYtPndhcm0pIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzd2l0Y2ggKGMtPmludmVyc2lvbikgeworCWNhc2UgSU5WRVJTSU9OX09GRjoKKwkJaW52ZXJzaW9uID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJTlZFUlNJT05fT046CisJCWludmVyc2lvbiA9IDA7CisJCWJyZWFrOworCWNhc2UgSU5WRVJTSU9OX0FVVE86CisJCS8qIDIgPSBhdXRvOyB0cnkgZmlyc3Qgb24gdGhlbiBvZmYKKwkJICogMyA9IGF1dG87IHRyeSBmaXJzdCBvZmYgdGhlbiBvbiAqLworCQlpbnZlcnNpb24gPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkYmcoIiVzOiBpbnZhbGlkIGludmVyc2lvbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzd2l0Y2ggKGMtPmRlbGl2ZXJ5X3N5c3RlbSkgeworCWNhc2UgU1lTX0RWQlM6CisJCXJvbGxvZmYgPSAwOworCQlwaWxvdCA9IDI7CisJCWJyZWFrOworCWNhc2UgU1lTX0RWQlMyOgorCQlzd2l0Y2ggKGMtPnJvbGxvZmYpIHsKKwkJY2FzZSBST0xMT0ZGXzIwOgorCQkJcm9sbG9mZiA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBST0xMT0ZGXzI1OgorCQkJcm9sbG9mZiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBST0xMT0ZGXzM1OgorCQkJcm9sbG9mZiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBST0xMT0ZGX0FVVE86CisJCWRlZmF1bHQ6CisJCQlkYmcoIiVzOiBpbnZhbGlkIHJvbGxvZmYiLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXN3aXRjaCAoYy0+cGlsb3QpIHsKKwkJY2FzZSBQSUxPVF9PRkY6CisJCQlwaWxvdCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBQSUxPVF9PTjoKKwkJCXBpbG90ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFBJTE9UX0FVVE86CisJCQlwaWxvdCA9IDI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRiZygiJXM6IGludmFsaWQgcGlsb3QiLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkYmcoIiVzOiBpbnZhbGlkIGRlbGl2ZXJ5X3N5c3RlbSIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwLCBtb2RlID0gMHhmZjsgaSA8IEFSUkFZX1NJWkUoVERBMTAwNzFfTU9EQ09EKTsgaSsrKSB7CisJCWlmIChjLT5kZWxpdmVyeV9zeXN0ZW0gPT0gVERBMTAwNzFfTU9EQ09EW2ldLmRlbGl2ZXJ5X3N5c3RlbSAmJgorCQkJYy0+bW9kdWxhdGlvbiA9PSBUREExMDA3MV9NT0RDT0RbaV0ubW9kdWxhdGlvbiAmJgorCQkJYy0+ZmVjX2lubmVyID09IFREQTEwMDcxX01PRENPRFtpXS5mZWMpIHsKKwkJCW1vZGUgPSBUREExMDA3MV9NT0RDT0RbaV0udmFsOworCQkJZGJnKCIlczogbW9kZSBmb3VuZD0lMDJ4IiwgX19mdW5jX18sIG1vZGUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobW9kZSA9PSAweGZmKSB7CisJCWRiZygiJXM6IGludmFsaWQgcGFyYW1ldGVyIGNvbWJpbmF0aW9uIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChjLT5zeW1ib2xfcmF0ZSA8PSA1MDAwMDAwKQorCQlkaXYgPSAxNDsKKwllbHNlCisJCWRpdiA9IDQ7CisKKwlyZXQgPSB0ZGExMDA3MV93cl9yZWcocHJpdiwgMHg4MSwgZGl2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gdGRhMTAwNzFfd3JfcmVnKHByaXYsIDB4ZTMsIGRpdik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWNtZC5hcmdzWzB4MDBdID0gQ01EX0NIQU5HRV9DSEFOTkVMOworCWNtZC5hcmdzWzB4MDFdID0gMDsKKwljbWQuYXJnc1sweDAyXSA9IG1vZGU7CisJY21kLmFyZ3NbMHgwM10gPSAoYy0+ZnJlcXVlbmN5ID4+IDE2KSAmIDB4ZmY7CisJY21kLmFyZ3NbMHgwNF0gPSAoYy0+ZnJlcXVlbmN5ID4+ICA4KSAmIDB4ZmY7CisJY21kLmFyZ3NbMHgwNV0gPSAoYy0+ZnJlcXVlbmN5ID4+ICAwKSAmIDB4ZmY7CisJY21kLmFyZ3NbMHgwNl0gPSAoKGMtPnN5bWJvbF9yYXRlIC8gMTAwMCkgPj4gOCkgJiAweGZmOworCWNtZC5hcmdzWzB4MDddID0gKChjLT5zeW1ib2xfcmF0ZSAvIDEwMDApID4+IDApICYgMHhmZjsKKwljbWQuYXJnc1sweDA4XSA9ICh0ZGExMDA3MV9vcHMuaW5mby5mcmVxdWVuY3lfdG9sZXJhbmNlID4+IDgpICYgMHhmZjsKKwljbWQuYXJnc1sweDA5XSA9ICh0ZGExMDA3MV9vcHMuaW5mby5mcmVxdWVuY3lfdG9sZXJhbmNlID4+IDApICYgMHhmZjsKKwljbWQuYXJnc1sweDBhXSA9IHJvbGxvZmY7CisJY21kLmFyZ3NbMHgwYl0gPSBpbnZlcnNpb247CisJY21kLmFyZ3NbMHgwY10gPSBwaWxvdDsKKwljbWQuYXJnc1sweDBkXSA9IDB4MDA7CisJY21kLmFyZ3NbMHgwZV0gPSAweDAwOworCWNtZC5sZW4gPSAweDBmOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlwcml2LT5kZWxpdmVyeV9zeXN0ZW0gPSBjLT5kZWxpdmVyeV9zeXN0ZW07CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CisJaW50IHJldCwgaTsKKwl1OCBidWZbNV0sIHRtcDsKKworCWlmICghcHJpdi0+d2FybSB8fCAhKHByaXYtPmZlX3N0YXR1cyAmIEZFX0hBU19MT0NLKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IHRkYTEwMDcxX3JkX3JlZ3MocHJpdiwgMHgzMCwgYnVmLCA1KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJdG1wID0gYnVmWzBdICYgMHgzZjsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShUREExMDA3MV9NT0RDT0QpOyBpKyspIHsKKwkJaWYgKHRtcCA9PSBUREExMDA3MV9NT0RDT0RbaV0udmFsKSB7CisJCQljLT5tb2R1bGF0aW9uID0gVERBMTAwNzFfTU9EQ09EW2ldLm1vZHVsYXRpb247CisJCQljLT5mZWNfaW5uZXIgPSBUREExMDA3MV9NT0RDT0RbaV0uZmVjOworCQkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gVERBMTAwNzFfTU9EQ09EW2ldLmRlbGl2ZXJ5X3N5c3RlbTsKKwkJfQorCX0KKworCXN3aXRjaCAoKGJ1ZlsxXSA+PiAwKSAmIDB4MDEpIHsKKwljYXNlIDA6CisJCWMtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PRkY7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYy0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09OOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKChidWZbMV0gPj4gNykgJiAweDAxKSB7CisJY2FzZSAwOgorCQljLT5waWxvdCA9IFBJTE9UX09GRjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQljLT5waWxvdCA9IFBJTE9UX09OOworCQlicmVhazsKKwl9CisKKwljLT5mcmVxdWVuY3kgPSAoYnVmWzJdIDw8IDE2KSB8IChidWZbM10gPDwgOCkgfCAoYnVmWzRdIDw8IDApOworCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVncyhwcml2LCAweDUyLCBidWYsIDMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwljLT5zeW1ib2xfcmF0ZSA9IChidWZbMF0gPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IChidWZbMl0gPDwgMCk7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDcxX2NtZCBjbWQ7CisJaW50IHJldCwgaSwgbGVuLCByZW1haW5pbmcsIGZ3X3NpemU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwl1OCAqZndfZmlsZSA9IFREQTEwMDcxX0RFRkFVTFRfRklSTVdBUkU7CisJdTggdG1wLCBidWZbNF07CisJc3RydWN0IHRkYTEwMDcxX3JlZ192YWxfbWFzayB0YWJbXSA9IHsKKwkJeyAweGNkLCAweDAwLCAweDA3IH0sCisJCXsgMHg4MCwgMHgwMCwgMHgwMiB9LAorCQl7IDB4Y2QsIDB4MDAsIDB4YzAgfSwKKwkJeyAweGNlLCAweDAwLCAweDFiIH0sCisJCXsgMHg5ZCwgMHgwMCwgMHgwMSB9LAorCQl7IDB4OWQsIDB4MDAsIDB4MDIgfSwKKwkJeyAweDllLCAweDAwLCAweDAxIH0sCisJCXsgMHg4NywgMHgwMCwgMHg4MCB9LAorCQl7IDB4Y2UsIDB4MDAsIDB4MDggfSwKKwkJeyAweGNlLCAweDAwLCAweDEwIH0sCisJfTsKKwlzdHJ1Y3QgdGRhMTAwNzFfcmVnX3ZhbF9tYXNrIHRhYjJbXSA9IHsKKwkJeyAweGYxLCAweDcwLCAweGZmIH0sCisJCXsgMHg4OCwgcHJpdi0+Y2ZnLnBsbF9tdWx0aXBsaWVyLCAweDNmIH0sCisJCXsgMHg4OSwgMHgwMCwgMHgxMCB9LAorCQl7IDB4ODksIDB4MTAsIDB4MTAgfSwKKwkJeyAweGMwLCAweDAxLCAweDAxIH0sCisJCXsgMHhjMCwgMHgwMCwgMHgwMSB9LAorCQl7IDB4ZTAsIDB4ZmYsIDB4ZmYgfSwKKwkJeyAweGUwLCAweDAwLCAweGZmIH0sCisJCXsgMHg5NiwgMHgxZSwgMHg3ZSB9LAorCQl7IDB4OGIsIDB4MDgsIDB4MDggfSwKKwkJeyAweDhiLCAweDAwLCAweDA4IH0sCisJCXsgMHg4ZiwgMHgxYSwgMHg3ZSB9LAorCQl7IDB4OGMsIDB4NjgsIDB4ZmYgfSwKKwkJeyAweDhkLCAweDA4LCAweGZmIH0sCisJCXsgMHg4ZSwgMHg0YywgMHhmZiB9LAorCQl7IDB4OGYsIDB4MDEsIDB4MDEgfSwKKwkJeyAweDhiLCAweDA0LCAweDA0IH0sCisJCXsgMHg4YiwgMHgwMCwgMHgwNCB9LAorCQl7IDB4ODcsIDB4MDUsIDB4MDcgfSwKKwkJeyAweDgwLCAweDAwLCAweDIwIH0sCisJCXsgMHhjOCwgMHgwMSwgMHhmZiB9LAorCQl7IDB4YjQsIDB4NDcsIDB4ZmYgfSwKKwkJeyAweGI1LCAweDljLCAweGZmIH0sCisJCXsgMHhiNiwgMHg3ZCwgMHhmZiB9LAorCQl7IDB4YmEsIDB4MDAsIDB4MDMgfSwKKwkJeyAweGI3LCAweDQ3LCAweGZmIH0sCisJCXsgMHhiOCwgMHg5YywgMHhmZiB9LAorCQl7IDB4YjksIDB4N2QsIDB4ZmYgfSwKKwkJeyAweGJhLCAweDAwLCAweDBjIH0sCisJCXsgMHhjOCwgMHgwMCwgMHhmZiB9LAorCQl7IDB4Y2QsIDB4MDAsIDB4MDQgfSwKKwkJeyAweGNkLCAweDAwLCAweDIwIH0sCisJCXsgMHhlOCwgMHgwMiwgMHhmZiB9LAorCQl7IDB4Y2YsIDB4MjAsIDB4ZmYgfSwKKwkJeyAweDliLCAweGQ3LCAweGZmIH0sCisJCXsgMHg5YSwgMHgwMSwgMHgwMyB9LAorCQl7IDB4YTgsIDB4MDUsIDB4MGYgfSwKKwkJeyAweGE4LCAweDY1LCAweGYwIH0sCisJCXsgMHhhNiwgMHhhMCwgMHhmMCB9LAorCQl7IDB4OWQsIDB4NTAsIDB4ZmMgfSwKKwkJeyAweDllLCAweDIwLCAweGUwIH0sCisJCXsgMHhhMywgMHgxYywgMHg3YyB9LAorCQl7IDB4ZDUsIDB4MDMsIDB4MDMgfSwKKwl9OworCisJLyogZmlybXdhcmUgc3RhdHVzICovCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVnKHByaXYsIDB4NTEsICZ0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoIXRtcCkgeworCQkvKiB3YXJtIHN0YXRlIC0gd2FrZSB1cCBkZXZpY2UgZnJvbSBzbGVlcCAqLworCQlwcml2LT53YXJtID0gMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YWIpOyBpKyspIHsKKwkJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIHRhYltpXS5yZWcsCisJCQkJdGFiW2ldLnZhbCwgdGFiW2ldLm1hc2spOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisKKwkJY21kLmFyZ3NbMHgwMF0gPSBDTURfU0VUX1NMRUVQX01PREU7CisJCWNtZC5hcmdzWzB4MDFdID0gMDsKKwkJY21kLmFyZ3NbMHgwMl0gPSAwOworCQljbWQubGVuID0gMHgwMzsKKwkJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCS8qIGNvbGQgc3RhdGUgLSB0cnkgdG8gZG93bmxvYWQgZmlybXdhcmUgKi8KKwkJcHJpdi0+d2FybSA9IDA7CisKKwkJLyogcmVxdWVzdCB0aGUgZmlybXdhcmUsIHRoaXMgd2lsbCBibG9jayBhbmQgdGltZW91dCAqLworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfZmlsZSwgcHJpdi0+aTJjLT5kZXYucGFyZW50KTsKKwkJaWYgKHJldCkgeworCQkJZXJyKCJkaWQgbm90IGZpbmQgdGhlIGZpcm13YXJlIGZpbGUuICglcykgIgorCQkJCSJQbGVhc2Ugc2VlIGxpbnV4L0RvY3VtZW50YXRpb24vZHZiLyBmb3IgbW9yZSIgXAorCQkJCSIgZGV0YWlscyBvbiBmaXJtd2FyZS1wcm9ibGVtcy4gKCVkKSIsCisJCQkJZndfZmlsZSwgcmV0KTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBpbml0ICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhYjIpOyBpKyspIHsKKwkJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIHRhYjJbaV0ucmVnLAorCQkJCXRhYjJbaV0udmFsLCB0YWIyW2ldLm1hc2spOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yX3JlbGVhc2VfZmlybXdhcmU7CisJCX0KKworCQkvKiAgZG93bmxvYWQgZmlybXdhcmUgKi8KKwkJcmV0ID0gdGRhMTAwNzFfd3JfcmVnKHByaXYsIDB4ZTAsIDB4N2YpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9yZWxlYXNlX2Zpcm13YXJlOworCisJCXJldCA9IHRkYTEwMDcxX3dyX3JlZyhwcml2LCAweGY3LCAweDgxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfcmVsZWFzZV9maXJtd2FyZTsKKworCQlyZXQgPSB0ZGExMDA3MV93cl9yZWcocHJpdiwgMHhmOCwgMHgwMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3JlbGVhc2VfZmlybXdhcmU7CisKKwkJcmV0ID0gdGRhMTAwNzFfd3JfcmVnKHByaXYsIDB4ZjksIDB4MDApOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9yZWxlYXNlX2Zpcm13YXJlOworCisJCWluZm8oImZvdW5kIGEgJyVzJyBpbiBjb2xkIHN0YXRlLCB3aWxsIHRyeSB0byBsb2FkIGEgZmlybXdhcmUiLAorCQkJdGRhMTAwNzFfb3BzLmluZm8ubmFtZSk7CisKKwkJaW5mbygiZG93bmxvYWRpbmcgZmlybXdhcmUgZnJvbSBmaWxlICclcyciLCBmd19maWxlKTsKKworCQkvKiBkbyBub3QgZG93bmxvYWQgbGFzdCBieXRlICovCisJCWZ3X3NpemUgPSBmdy0+c2l6ZSAtIDE7CisKKwkJZm9yIChyZW1haW5pbmcgPSBmd19zaXplOyByZW1haW5pbmcgPiAwOworCQkJcmVtYWluaW5nIC09IChwcml2LT5jZmcuaTJjX3dyX21heCAtIDEpKSB7CisJCQlsZW4gPSByZW1haW5pbmc7CisJCQlpZiAobGVuID4gKHByaXYtPmNmZy5pMmNfd3JfbWF4IC0gMSkpCisJCQkJbGVuID0gKHByaXYtPmNmZy5pMmNfd3JfbWF4IC0gMSk7CisKKwkJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ3MocHJpdiwgMHhmYSwKKwkJCQkodTggKikgJmZ3LT5kYXRhW2Z3X3NpemUgLSByZW1haW5pbmddLCBsZW4pOworCQkJaWYgKHJldCkgeworCQkJCWVycigiZmlybXdhcmUgZG93bmxvYWQgZmFpbGVkPSVkIiwgcmV0KTsKKwkJCQlpZiAocmV0KQorCQkJCQlnb3RvIGVycm9yX3JlbGVhc2VfZmlybXdhcmU7CisJCQl9CisJCX0KKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwkJcmV0ID0gdGRhMTAwNzFfd3JfcmVnKHByaXYsIDB4ZjcsIDB4MGMpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQlyZXQgPSB0ZGExMDA3MV93cl9yZWcocHJpdiwgMHhlMCwgMHgwMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCS8qIHdhaXQgZmlybXdhcmUgc3RhcnQgKi8KKwkJbXNsZWVwKDI1MCk7CisKKwkJLyogZmlybXdhcmUgc3RhdHVzICovCisJCXJldCA9IHRkYTEwMDcxX3JkX3JlZyhwcml2LCAweDUxLCAmdG1wKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJaWYgKHRtcCkgeworCQkJaW5mbygiZmlybXdhcmUgZGlkIG5vdCBydW4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycm9yOworCQl9IGVsc2UgeworCQkJcHJpdi0+d2FybSA9IDE7CisJCX0KKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9HRVRfRldfVkVSU0lPTjsKKwkJY21kLmxlbiA9IDB4MDE7CisJCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQlyZXQgPSB0ZGExMDA3MV9yZF9yZWdzKHByaXYsIGNtZC5sZW4sIGJ1ZiwgNCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCWluZm8oImZpcm13YXJlIHZlcnNpb24gJWQuJWQuJWQuJWQiLAorCQkJYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdKTsKKwkJaW5mbygiZm91bmQgYSAnJXMnIGluIHdhcm0gc3RhdGUuIiwgdGRhMTAwNzFfb3BzLmluZm8ubmFtZSk7CisKKwkJcmV0ID0gdGRhMTAwNzFfcmRfcmVncyhwcml2LCAweDgxLCBidWYsIDIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9ERU1PRF9JTklUOworCQljbWQuYXJnc1sweDAxXSA9ICgocHJpdi0+Y2ZnLnh0YWwgLyAxMDAwKSA+PiA4KSAmIDB4ZmY7CisJCWNtZC5hcmdzWzB4MDJdID0gKChwcml2LT5jZmcueHRhbCAvIDEwMDApID4+IDApICYgMHhmZjsKKwkJY21kLmFyZ3NbMHgwM10gPSBidWZbMF07CisJCWNtZC5hcmdzWzB4MDRdID0gYnVmWzFdOworCQljbWQuYXJnc1sweDA1XSA9IHByaXYtPmNmZy5wbGxfbXVsdGlwbGllcjsKKwkJY21kLmFyZ3NbMHgwNl0gPSBwcml2LT5jZmcuc3BlY19pbnY7CisJCWNtZC5hcmdzWzB4MDddID0gMHgwMDsKKwkJY21kLmxlbiA9IDB4MDg7CisJCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9UVU5FUl9JTklUOworCQljbWQuYXJnc1sweDAxXSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MDJdID0gMHgwMDsKKwkJY21kLmFyZ3NbMHgwM10gPSAweDAwOworCQljbWQuYXJnc1sweDA0XSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MDVdID0gMHgxNDsKKwkJY21kLmFyZ3NbMHgwNl0gPSAweDAwOworCQljbWQuYXJnc1sweDA3XSA9IDB4MDM7CisJCWNtZC5hcmdzWzB4MDhdID0gMHgwMjsKKwkJY21kLmFyZ3NbMHgwOV0gPSAweDAyOworCQljbWQuYXJnc1sweDBhXSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MGJdID0gMHgwMDsKKwkJY21kLmFyZ3NbMHgwY10gPSAweDAwOworCQljbWQuYXJnc1sweDBkXSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MGVdID0gMHgwMDsKKwkJY21kLmxlbiA9IDB4MGY7CisJCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9NUEVHX0NPTkZJRzsKKwkJY21kLmFyZ3NbMHgwMV0gPSAwOworCQljbWQuYXJnc1sweDAyXSA9IHByaXYtPmNmZy50c19tb2RlOworCQljbWQuYXJnc1sweDAzXSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MDRdID0gMHgwNDsKKwkJY21kLmFyZ3NbMHgwNV0gPSAweDAwOworCQljbWQubGVuID0gMHgwNjsKKwkJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIDB4ZjAsIDB4MDEsIDB4MDEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9MTkJfQ09ORklHOworCQljbWQuYXJnc1sweDAxXSA9IDA7CisJCWNtZC5hcmdzWzB4MDJdID0gMTUwOworCQljbWQuYXJnc1sweDAzXSA9IDM7CisJCWNtZC5hcmdzWzB4MDRdID0gMjI7CisJCWNtZC5hcmdzWzB4MDVdID0gMTsKKwkJY21kLmFyZ3NbMHgwNl0gPSAxOworCQljbWQuYXJnc1sweDA3XSA9IDMwOworCQljbWQuYXJnc1sweDA4XSA9IDMwOworCQljbWQuYXJnc1sweDA5XSA9IDMwOworCQljbWQuYXJnc1sweDBhXSA9IDMwOworCQljbWQubGVuID0gMHgwYjsKKwkJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCWNtZC5hcmdzWzB4MDBdID0gQ01EX0JFUl9DT05UUk9MOworCQljbWQuYXJnc1sweDAxXSA9IDA7CisJCWNtZC5hcmdzWzB4MDJdID0gMTQ7CisJCWNtZC5hcmdzWzB4MDNdID0gMTQ7CisJCWNtZC5sZW4gPSAweDA0OworCQlyZXQgPSB0ZGExMDA3MV9jbWRfZXhlY3V0ZShwcml2LCAmY21kKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHJldDsKK2Vycm9yX3JlbGVhc2VfZmlybXdhcmU6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDcxX2NtZCBjbWQ7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgdGRhMTAwNzFfcmVnX3ZhbF9tYXNrIHRhYltdID0geworCQl7IDB4Y2QsIDB4MDcsIDB4MDcgfSwKKwkJeyAweDgwLCAweDAyLCAweDAyIH0sCisJCXsgMHhjZCwgMHhjMCwgMHhjMCB9LAorCQl7IDB4Y2UsIDB4MWIsIDB4MWIgfSwKKwkJeyAweDlkLCAweDAxLCAweDAxIH0sCisJCXsgMHg5ZCwgMHgwMiwgMHgwMiB9LAorCQl7IDB4OWUsIDB4MDEsIDB4MDEgfSwKKwkJeyAweDg3LCAweDgwLCAweDgwIH0sCisJCXsgMHhjZSwgMHgwOCwgMHgwOCB9LAorCQl7IDB4Y2UsIDB4MTAsIDB4MTAgfSwKKwl9OworCisJaWYgKCFwcml2LT53YXJtKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfU0VUX1NMRUVQX01PREU7CisJY21kLmFyZ3NbMHgwMV0gPSAwOworCWNtZC5hcmdzWzB4MDJdID0gMTsKKwljbWQubGVuID0gMHgwMzsKKwlyZXQgPSB0ZGExMDA3MV9jbWRfZXhlY3V0ZShwcml2LCAmY21kKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFiKTsgaSsrKSB7CisJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIHRhYltpXS5yZWcsIHRhYltpXS52YWwsCisJCQl0YWJbaV0ubWFzayk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqcykKK3sKKwlzLT5taW5fZGVsYXlfbXMgPSA4MDAwOworCXMtPnN0ZXBfc2l6ZSA9IDA7CisJcy0+bWF4X2RyaWZ0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZGExMDA3MV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUocHJpdik7Cit9CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKnRkYTEwMDcxX2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwNzFfY29uZmlnICpjb25maWcsCisJc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IE5VTEw7CisJdTggdG1wOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgcHJpdiAqLworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGRhMTAwNzFfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChwcml2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBzZXR1cCB0aGUgcHJpdiAqLworCXByaXYtPmkyYyA9IGkyYzsKKwltZW1jcHkoJnByaXYtPmNmZywgY29uZmlnLCBzaXplb2Yoc3RydWN0IHRkYTEwMDcxX2NvbmZpZykpOworCisJLyogY2hpcCBJRCAqLworCXJldCA9IHRkYTEwMDcxX3JkX3JlZyhwcml2LCAweGZmLCAmdG1wKTsKKwlpZiAocmV0IHx8IHRtcCAhPSAweDBmKQorCQlnb3RvIGVycm9yOworCisJLyogY2hpcCB0eXBlICovCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVnKHByaXYsIDB4ZGQsICZ0bXApOworCWlmIChyZXQgfHwgdG1wICE9IDB4MDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjaGlwIHZlcnNpb24gKi8KKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWcocHJpdiwgMHhmZSwgJnRtcCk7CisJaWYgKHJldCB8fCB0bXAgIT0gMHgwMSkKKwkJZ290byBlcnJvcjsKKworCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KKwltZW1jcHkoJnByaXYtPmZlLm9wcywgJnRkYTEwMDcxX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJcHJpdi0+ZmUuZGVtb2R1bGF0b3JfcHJpdiA9IHByaXY7CisKKwlyZXR1cm4gJnByaXYtPmZlOworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHRkYTEwMDcxX2F0dGFjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyB0ZGExMDA3MV9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lID0gIk5YUCBUREExMDA3MSIsCisJCS50eXBlID0gRkVfUVBTSywKKwkJLmZyZXF1ZW5jeV9taW4gPSA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gMjE1MDAwMCwKKwkJLmZyZXF1ZW5jeV90b2xlcmFuY2UgPSA1MDAwLAorCQkuc3ltYm9sX3JhdGVfbWluID0gMTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCA9IDQ1MDAwMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9JTlZFUlNJT05fQVVUTyB8CisJCQlGRV9DQU5fRkVDXzFfMiB8CisJCQlGRV9DQU5fRkVDXzJfMyB8CisJCQlGRV9DQU5fRkVDXzNfNCB8CisJCQlGRV9DQU5fRkVDXzRfNSB8CisJCQlGRV9DQU5fRkVDXzVfNiB8CisJCQlGRV9DQU5fRkVDXzZfNyB8CisJCQlGRV9DQU5fRkVDXzdfOCB8CisJCQlGRV9DQU5fRkVDXzhfOSB8CisJCQlGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FQU0sgfAorCQkJRkVfQ0FOX1JFQ09WRVIgfAorCQkJRkVfQ0FOXzJHX01PRFVMQVRJT04KKwl9LAorCisJLnJlbGVhc2UgPSB0ZGExMDA3MV9yZWxlYXNlLAorCisJLmdldF90dW5lX3NldHRpbmdzID0gdGRhMTAwNzFfZ2V0X3R1bmVfc2V0dGluZ3MsCisKKwkuaW5pdCA9IHRkYTEwMDcxX2luaXQsCisJLnNsZWVwID0gdGRhMTAwNzFfc2xlZXAsCisKKwkuc2V0X2Zyb250ZW5kID0gdGRhMTAwNzFfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSB0ZGExMDA3MV9nZXRfZnJvbnRlbmQsCisKKwkucmVhZF9zdGF0dXMgPSB0ZGExMDA3MV9yZWFkX3N0YXR1cywKKwkucmVhZF9zbnIgPSB0ZGExMDA3MV9yZWFkX3NuciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSB0ZGExMDA3MV9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9iZXIgPSB0ZGExMDA3MV9yZWFkX2JlciwKKwkucmVhZF91Y2Jsb2NrcyA9IHRkYTEwMDcxX3JlYWRfdWNibG9ja3MsCisKKwkuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IHRkYTEwMDcxX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQsCisJLmRpc2VxY19yZWN2X3NsYXZlX3JlcGx5ID0gdGRhMTAwNzFfZGlzZXFjX3JlY3Zfc2xhdmVfcmVwbHksCisJLmRpc2VxY19zZW5kX2J1cnN0ID0gdGRhMTAwNzFfZGlzZXFjX3NlbmRfYnVyc3QsCisKKwkuc2V0X3RvbmUgPSB0ZGExMDA3MV9zZXRfdG9uZSwKKwkuc2V0X3ZvbHRhZ2UgPSB0ZGExMDA3MV9zZXRfdm9sdGFnZSwKK307CisKK01PRFVMRV9BVVRIT1IoIkFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOWFAgVERBMTAwNzEgRFZCLVMvUzIgZGVtb2R1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNzEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA3MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTYzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNzEuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogTlhQIFREQTEwMDcxICsgQ29uZXhhbnQgQ1gyNDExOEEgRFZCLVMvUzIgZGVtb2R1bGF0b3IgKyB0dW5lciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIFREQTEwMDcxX0gKKyNkZWZpbmUgVERBMTAwNzFfSAorCisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisKK3N0cnVjdCB0ZGExMDA3MV9jb25maWcgeworCS8qIERlbW9kdWxhdG9yIEkyQyBhZGRyZXNzLgorCSAqIERlZmF1bHQ6IG5vbmUsIG11c3Qgc2V0CisJICogVmFsdWVzOiAweDU1LAorCSAqLworCXU4IGkyY19hZGRyZXNzOworCisJLyogTWF4IGJ5dGVzIEkyQyBwcm92aWRlciBjYW4gd3JpdGUgYXQgb25jZS4KKwkgKiBOb3RlOiBCdWZmZXIgaXMgdGFrZW4gZnJvbSB0aGUgc3RhY2sgY3VycmVudGx5IQorCSAqIERlZmF1bHQ6IG5vbmUsIG11c3Qgc2V0CisJICogVmFsdWVzOgorCSAqLworCXUxNiBpMmNfd3JfbWF4OworCisJLyogVFMgb3V0cHV0IG1vZGUuCisJICogRGVmYXVsdDogVERBMTAwNzFfVFNfU0VSSUFMCisJICogVmFsdWVzOgorCSAqLworI2RlZmluZSBUREExMDA3MV9UU19TRVJJQUwgICAgICAgIDAKKyNkZWZpbmUgVERBMTAwNzFfVFNfUEFSQUxMRUwgICAgICAxCisJdTggdHNfbW9kZTsKKworCS8qIElucHV0IHNwZWN0cnVtIGludmVyc2lvbi4KKwkgKiBEZWZhdWx0OiAwCisJICogVmFsdWVzOiAwLCAxCisJICovCisJYm9vbCBzcGVjX2ludjsKKworCS8qIFh0YWwgZnJlcXVlbmN5IEh6CisJICogRGVmYXVsdDogbm9uZSwgbXVzdCBzZXQKKwkgKiBWYWx1ZXM6CisJICovCisJdTMyIHh0YWw7CisKKwkvKiBQTEwgbXVsdGlwbGllci4KKwkgKiBEZWZhdWx0OiBub25lLCBtdXN0IHNldAorCSAqIFZhbHVlczoKKwkgKi8KKwl1OCBwbGxfbXVsdGlwbGllcjsKK307CisKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9UREExMDA3MSkgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwNzFfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTAwNzFfYXR0YWNoKAorCWNvbnN0IHN0cnVjdCB0ZGExMDA3MV9jb25maWcgKmNvbmZpZywgc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTAwNzFfYXR0YWNoKAorCWNvbnN0IHN0cnVjdCB0ZGExMDA3MV9jb25maWcgKmNvbmZpZywgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIFREQTEwMDcxX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA3MV9wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNzFfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzVlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNzFfcHJpdi5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTlhQIFREQTEwMDcxICsgQ29uZXhhbnQgQ1gyNDExOEEgRFZCLVMvUzIgZGVtb2R1bGF0b3IgKyB0dW5lciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIFREQTEwMDcxX1BSSVYKKyNkZWZpbmUgVERBMTAwNzFfUFJJVgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAidGRhMTAwNzEuaCIKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjZGVmaW5lIExPR19QUkVGSVggInRkYTEwMDcxIgorCisjdW5kZWYgZGJnCisjZGVmaW5lIGRiZyhmLCBhcmcuLi4pIFwKKwlpZiAodGRhMTAwNzFfZGVidWcpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyAgIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKKyN1bmRlZiBlcnIKKyNkZWZpbmUgZXJyKGYsIGFyZy4uLikgIHByaW50ayhLRVJOX0VSUiAgICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorI3VuZGVmIGluZm8KKyNkZWZpbmUgaW5mbyhmLCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorI3VuZGVmIHdhcm4KKyNkZWZpbmUgd2FybihmLCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorCitzdHJ1Y3QgdGRhMTAwNzFfcHJpdiB7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmZTsKKwlzdHJ1Y3QgdGRhMTAwNzFfY29uZmlnIGNmZzsKKworCXU4IG1lYXNfY291bnRbMl07CisJdTMyIGJlcjsKKwl1MzIgdWNiOworCWZlX3N0YXR1c190IGZlX3N0YXR1czsKKwlmZV9kZWxpdmVyeV9zeXN0ZW1fdCBkZWxpdmVyeV9zeXN0ZW07CisJYm9vbCB3YXJtOyAvKiBGVyBydW5uaW5nICovCit9OworCitzdGF0aWMgc3RydWN0IHRkYTEwMDcxX21vZGNvZCB7CisJZmVfZGVsaXZlcnlfc3lzdGVtX3QgZGVsaXZlcnlfc3lzdGVtOworCWZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uOworCWZlX2NvZGVfcmF0ZV90IGZlYzsKKwl1OCB2YWw7Cit9IFREQTEwMDcxX01PRENPRFtdID0geworCS8qIE5CQy1RUFNLICovCisJeyBTWVNfRFZCUzIsIFFQU0ssICBGRUNfQVVUTywgMHgwMCB9LAorCXsgU1lTX0RWQlMyLCBRUFNLLCAgRkVDXzFfMiwgIDB4MDQgfSwKKwl7IFNZU19EVkJTMiwgUVBTSywgIEZFQ18zXzUsICAweDA1IH0sCisJeyBTWVNfRFZCUzIsIFFQU0ssICBGRUNfMl8zLCAgMHgwNiB9LAorCXsgU1lTX0RWQlMyLCBRUFNLLCAgRkVDXzNfNCwgIDB4MDcgfSwKKwl7IFNZU19EVkJTMiwgUVBTSywgIEZFQ180XzUsICAweDA4IH0sCisJeyBTWVNfRFZCUzIsIFFQU0ssICBGRUNfNV82LCAgMHgwOSB9LAorCXsgU1lTX0RWQlMyLCBRUFNLLCAgRkVDXzhfOSwgIDB4MGEgfSwKKwl7IFNZU19EVkJTMiwgUVBTSywgIEZFQ185XzEwLCAweDBiIH0sCisJLyogOFBTSyAqLworCXsgU1lTX0RWQlMyLCBQU0tfOCwgRkVDXzNfNSwgIDB4MGMgfSwKKwl7IFNZU19EVkJTMiwgUFNLXzgsIEZFQ18yXzMsICAweDBkIH0sCisJeyBTWVNfRFZCUzIsIFBTS184LCBGRUNfM180LCAgMHgwZSB9LAorCXsgU1lTX0RWQlMyLCBQU0tfOCwgRkVDXzVfNiwgIDB4MGYgfSwKKwl7IFNZU19EVkJTMiwgUFNLXzgsIEZFQ184XzksICAweDEwIH0sCisJeyBTWVNfRFZCUzIsIFBTS184LCBGRUNfOV8xMCwgMHgxMSB9LAorCS8qIFFQU0sgKi8KKwl7IFNZU19EVkJTLCAgUVBTSywgIEZFQ19BVVRPLCAweDJkIH0sCisJeyBTWVNfRFZCUywgIFFQU0ssICBGRUNfMV8yLCAgMHgyZSB9LAorCXsgU1lTX0RWQlMsICBRUFNLLCAgRkVDXzJfMywgIDB4MmYgfSwKKwl7IFNZU19EVkJTLCAgUVBTSywgIEZFQ18zXzQsICAweDMwIH0sCisJeyBTWVNfRFZCUywgIFFQU0ssICBGRUNfNV82LCAgMHgzMSB9LAorCXsgU1lTX0RWQlMsICBRUFNLLCAgRkVDXzdfOCwgIDB4MzIgfSwKK307CisKK3N0cnVjdCB0ZGExMDA3MV9yZWdfdmFsX21hc2sgeworCXU4IHJlZzsKKwl1OCB2YWw7CisJdTggbWFzazsKK307CisKKy8qIGZpcm13YXJlIGZpbGVuYW1lICovCisjZGVmaW5lIFREQTEwMDcxX0RFRkFVTFRfRklSTVdBUkUgICAgICAiZHZiLWZlLXRkYTEwMDcxLmZ3IgorCisvKiBmaXJtd2FyZSBjb21tYW5kcyAqLworI2RlZmluZSBDTURfREVNT0RfSU5JVCAgICAgICAgICAweDEwCisjZGVmaW5lIENNRF9DSEFOR0VfQ0hBTk5FTCAgICAgIDB4MTEKKyNkZWZpbmUgQ01EX01QRUdfQ09ORklHICAgICAgICAgMHgxMworI2RlZmluZSBDTURfVFVORVJfSU5JVCAgICAgICAgICAweDE1CisjZGVmaW5lIENNRF9HRVRfQUdDQUNDICAgICAgICAgIDB4MWEKKworI2RlZmluZSBDTURfTE5CX0NPTkZJRyAgICAgICAgICAweDIwCisjZGVmaW5lIENNRF9MTkJfU0VORF9ESVNFUUMgICAgIDB4MjEKKyNkZWZpbmUgQ01EX0xOQl9TRVRfRENfTEVWRUwgICAgMHgyMgorI2RlZmluZSBDTURfTE5CX1BDQl9DT05GSUcgICAgICAweDIzCisjZGVmaW5lIENNRF9MTkJfU0VORF9UT05FQlVSU1QgIDB4MjQKKyNkZWZpbmUgQ01EX0xOQl9VUERBVEVfUkVQTFkgICAgMHgyNQorCisjZGVmaW5lIENNRF9HRVRfRldfVkVSU0lPTiAgICAgIDB4MzUKKyNkZWZpbmUgQ01EX1NFVF9TTEVFUF9NT0RFICAgICAgMHgzNgorI2RlZmluZSBDTURfQkVSX0NPTlRST0wgICAgICAgICAweDNlCisjZGVmaW5lIENNRF9CRVJfVVBEQVRFX0NPVU5URVJTIDB4M2YKKworLyogZmlybWFyZSBjb21tYW5kIHN0cnVjdCAqLworI2RlZmluZSBUREExMDA3MV9BUkdMRU4gICAgICAweDFlCitzdHJ1Y3QgdGRhMTAwNzFfY21kIHsKKwl1OCBhcmdzW1REQTEwMDcxX0FSR0xFTl07CisJdTggbGVuOworfTsKKworCisjZW5kaWYgLyogVERBMTAwNzFfUFJJViAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5jCmluZGV4IDAzODRlOGQuLjFiMWJmMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTgyNzFjMmRkLmMKQEAgLTExOTUsNyArMTE5NSw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBnZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3N0YXRpYyBpbnQgZ2V0X2lmX2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpCiB7CiAJc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKIApAQCAtMTIyMiw3ICsxMjIyLDcgQEAKIAkuc2xlZXAgICAgICAgICAgICAgPSBzbGVlcCwKIAkuc2V0X3BhcmFtcyAgICAgICAgPSBzZXRfcGFyYW1zLAogCS5yZWxlYXNlICAgICAgICAgICA9IHJlbGVhc2UsCi0JLmdldF9mcmVxdWVuY3kgICAgID0gZ2V0X2ZyZXF1ZW5jeSwKKwkuZ2V0X2lmX2ZyZXF1ZW5jeSAgPSBnZXRfaWZfZnJlcXVlbmN5LAogCS5nZXRfYmFuZHdpZHRoICAgICA9IGdldF9iYW5kd2lkdGgsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvTWFrZWZpbGUKaW5kZXggOThkYzVjZC4uZWM4MTE2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9NYWtlZmlsZQpAQCAtMjUsNCArMjUsNCBAQAogb2JqLSQoQ09ORklHX0RWQl9NQU5USVMpCSs9IG1hbnRpcy5vCiBvYmotJChDT05GSUdfRFZCX0hPUFBFUikJKz0gaG9wcGVyLm8KIAotRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvaG9wcGVyX2NhcmRzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvaG9wcGVyX2NhcmRzLmMKaW5kZXggMTQwMjA2Mi4uNzE2MjJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL2hvcHBlcl9jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9ob3BwZXJfY2FyZHMuYwpAQCAtNjUsNyArNjUsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaG9wcGVyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQl1MzIgc3RhdCA9IDAsIG1hc2sgPSAwLCBsc3RhdCA9IDAsIG1zdGF0ID0gMDsKKwl1MzIgc3RhdCA9IDAsIG1hc2sgPSAwLCBsc3RhdCA9IDA7CiAJdTMyIHJzdF9zdGF0ID0gMCwgcnN0X21hc2sgPSAwOwogCiAJc3RydWN0IG1hbnRpc19wY2kgKm1hbnRpczsKQEAgLTgwLDcgKzgwLDcgQEAKIAogCXN0YXQgPSBtbXJlYWQoTUFOVElTX0lOVF9TVEFUKTsKIAltYXNrID0gbW1yZWFkKE1BTlRJU19JTlRfTUFTSyk7Ci0JbXN0YXQgPSBsc3RhdCA9IHN0YXQgJiB+TUFOVElTX0lOVF9SSVNDU1RBVDsKKwlsc3RhdCA9IHN0YXQgJiB+TUFOVElTX0lOVF9SSVNDU1RBVDsKIAlpZiAoIShzdGF0ICYgbWFzaykpCiAJCXJldHVybiBJUlFfTk9ORTsKIApAQCAtMTI2LDcgKzEyNiw3IEBACiAJfQogCWlmIChzdGF0ICYgTUFOVElTX0lOVF9SSVNDSSkgewogCQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMCwgIjwlcz4iLCBsYWJlbFs4XSk7Ci0JCW1hbnRpcy0+ZmluaXNoZWRfYmxvY2sgPSAoc3RhdCAmIE1BTlRJU19JTlRfUklTQ1NUQVQpID4+IDI4OworCQltYW50aXMtPmJ1c3lfYmxvY2sgPSAoc3RhdCAmIE1BTlRJU19JTlRfUklTQ1NUQVQpID4+IDI4OwogCQl0YXNrbGV0X3NjaGVkdWxlKCZtYW50aXMtPnRhc2tsZXQpOwogCX0KIAlpZiAoc3RhdCAmIE1BTlRJU19JTlRfSTJDRE9ORSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jYXJkcy5jCmluZGV4IDA1Y2JiOWQuLmMyYmI5MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2NhcmRzLmMKQEAgLTczLDcgKzczLDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IG1hbnRpc19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JdTMyIHN0YXQgPSAwLCBtYXNrID0gMCwgbHN0YXQgPSAwLCBtc3RhdCA9IDA7CisJdTMyIHN0YXQgPSAwLCBtYXNrID0gMCwgbHN0YXQgPSAwOwogCXUzMiByc3Rfc3RhdCA9IDAsIHJzdF9tYXNrID0gMDsKIAogCXN0cnVjdCBtYW50aXNfcGNpICptYW50aXM7CkBAIC04OCw3ICs4OCw3IEBACiAKIAlzdGF0ID0gbW1yZWFkKE1BTlRJU19JTlRfU1RBVCk7CiAJbWFzayA9IG1tcmVhZChNQU5USVNfSU5UX01BU0spOwotCW1zdGF0ID0gbHN0YXQgPSBzdGF0ICYgfk1BTlRJU19JTlRfUklTQ1NUQVQ7CisJbHN0YXQgPSBzdGF0ICYgfk1BTlRJU19JTlRfUklTQ1NUQVQ7CiAJaWYgKCEoc3RhdCAmIG1hc2spKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogCX0KIAlpZiAoc3RhdCAmIE1BTlRJU19JTlRfUklTQ0kpIHsKIAkJZHByaW50ayhNQU5USVNfREVCVUcsIDAsICI8JXM+IiwgbGFiZWxbOF0pOwotCQltYW50aXMtPmZpbmlzaGVkX2Jsb2NrID0gKHN0YXQgJiBNQU5USVNfSU5UX1JJU0NTVEFUKSA+PiAyODsKKwkJbWFudGlzLT5idXN5X2Jsb2NrID0gKHN0YXQgJiBNQU5USVNfSU5UX1JJU0NTVEFUKSA+PiAyODsKIAkJdGFza2xldF9zY2hlZHVsZSgmbWFudGlzLT50YXNrbGV0KTsKIAl9CiAJaWYgKHN0YXQgJiBNQU5USVNfSU5UX0kyQ0RPTkUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2NvbW1vbi5oCmluZGV4IDQ5ZGJjYTEuLmYyNDEwY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jb21tb24uaApAQCAtMTIzLDExICsxMjMsOCBAQAogCXVuc2lnbmVkIGludAkJbnVtOwogCiAJLyoJUklTQyBDb3JlCQkqLwotCXUzMgkJCWZpbmlzaGVkX2Jsb2NrOworCXUzMgkJCWJ1c3lfYmxvY2s7CiAJdTMyCQkJbGFzdF9ibG9jazsKLQl1MzIJCQlsaW5lX2J5dGVzOwotCXUzMgkJCWxpbmVfY291bnQ7Ci0JdTMyCQkJcmlzY19wb3M7CiAJdTgJCQkqYnVmX2NwdTsKIAlkbWFfYWRkcl90CQlidWZfZG1hOwogCXUzMgkJCSpyaXNjX2NwdTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfZG1hLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2RtYS5jCmluZGV4IDQ2MjAyYTQuLmM2MWNhN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfZG1hLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19kbWEuYwpAQCAtNDMsMTMgKzQzLDE3IEBACiAjZGVmaW5lIFJJU0NfSVJRCQkoMHgwMSA8PCAyNCkKIAogI2RlZmluZSBSSVNDX1NUQVRVUyhzdGF0dXMpCSgoKCh+c3RhdHVzKSAmIDB4MGYpIDw8IDIwKSB8ICgoc3RhdHVzICYgMHgwZikgPDwgMTYpKQotI2RlZmluZSBSSVNDX0ZMVVNIKCkJCShtYW50aXMtPnJpc2NfcG9zID0gMCkKLSNkZWZpbmUgUklTQ19JTlNUUihvcGNvZGUpCShtYW50aXMtPnJpc2NfY3B1W21hbnRpcy0+cmlzY19wb3MrK10gPSBjcHVfdG9fbGUzMihvcGNvZGUpKQorI2RlZmluZSBSSVNDX0ZMVVNIKHJpc2NfcG9zKQkJKHJpc2NfcG9zID0gMCkKKyNkZWZpbmUgUklTQ19JTlNUUihyaXNjX3Bvcywgb3Bjb2RlKQkobWFudGlzLT5yaXNjX2NwdVtyaXNjX3BvcysrXSA9IGNwdV90b19sZTMyKG9wY29kZSkpCiAKICNkZWZpbmUgTUFOVElTX0JVRl9TSVpFCQkoNjQgKiAxMDI0KQotI2RlZmluZSBNQU5USVNfQkxPQ0tfQllURVMJKE1BTlRJU19CVUZfU0laRSA+PiA0KQotI2RlZmluZSBNQU5USVNfQkxPQ0tfQ09VTlQJKDEgPDwgNCkKLSNkZWZpbmUgTUFOVElTX1JJU0NfU0laRQlQQUdFX1NJWkUKKyNkZWZpbmUgTUFOVElTX0JMT0NLX0JZVEVTICAgICAgKE1BTlRJU19CVUZfU0laRSAvIDQpCisjZGVmaW5lIE1BTlRJU19ETUFfVFJfQllURVMgICAgICgyICogMTAyNCkgLyogdXBwZXIgbGltaXQ6IDQwOTUgYnl0ZXMuICovCisjZGVmaW5lIE1BTlRJU19CTE9DS19DT1VOVAkoTUFOVElTX0JVRl9TSVpFIC8gTUFOVElTX0JMT0NLX0JZVEVTKQorCisjZGVmaW5lIE1BTlRJU19ETUFfVFJfVU5JVFMgICAgIChNQU5USVNfQkxPQ0tfQllURVMgLyBNQU5USVNfRE1BX1RSX0JZVEVTKQorLyogTUFOVElTX0JVRl9TSVpFIC8gTUFOVElTX0RNQV9UUl9VTklUUyBtdXN0IG5vdCBleGNlZWQgTUFOVElTX1JJU0NfU0laRSAoNGsgUklTQyBjbWQgYnVmZmVyKSAqLworI2RlZmluZSBNQU5USVNfUklTQ19TSVpFCVBBR0VfU0laRSAvKiBSSVNDIHByb2dyYW0gbXVzdCBmaXQgaGVyZS4gKi8KIAogaW50IG1hbnRpc19kbWFfZXhpdChzdHJ1Y3QgbWFudGlzX3BjaSAqbWFudGlzKQogewpAQCAtMTI0LDI3ICsxMjgsNiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtYW50aXNfY2FsY19saW5lcyhzdHJ1Y3QgbWFudGlzX3BjaSAqbWFudGlzKQotewotCW1hbnRpcy0+bGluZV9ieXRlcyA9IE1BTlRJU19CTE9DS19CWVRFUzsKLQltYW50aXMtPmxpbmVfY291bnQgPSBNQU5USVNfQkxPQ0tfQ09VTlQ7Ci0KLQl3aGlsZSAobWFudGlzLT5saW5lX2J5dGVzID4gNDA5NSkgewotCQltYW50aXMtPmxpbmVfYnl0ZXMgPj49IDE7Ci0JCW1hbnRpcy0+bGluZV9jb3VudCA8PD0gMTsKLQl9Ci0KLQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMSwgIk1hbnRpcyBSSVNDIGJsb2NrIGJ5dGVzPVslZF0sIGxpbmUgYnl0ZXM9WyVkXSwgbGluZSBjb3VudD1bJWRdIiwKLQkJTUFOVElTX0JMT0NLX0JZVEVTLCBtYW50aXMtPmxpbmVfYnl0ZXMsIG1hbnRpcy0+bGluZV9jb3VudCk7Ci0KLQlpZiAobWFudGlzLT5saW5lX2NvdW50ID4gMjU1KSB7Ci0JCWRwcmludGsoTUFOVElTX0VSUk9SLCAxLCAiQnVmZmVyIHNpemUgZXJyb3IiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCBtYW50aXNfZG1hX2luaXQoc3RydWN0IG1hbnRpc19wY2kgKm1hbnRpcykKIHsKIAlpbnQgZXJyID0gMDsKQEAgLTE1OCwxMiArMTQxLDYgQEAKIAogCQlnb3RvIGVycjsKIAl9Ci0JZXJyID0gbWFudGlzX2NhbGNfbGluZXMobWFudGlzKTsKLQlpZiAoZXJyIDwgMCkgewotCQlkcHJpbnRrKE1BTlRJU19FUlJPUiwgMSwgIk1hbnRpcyBjYWxjIGxpbmVzIGZhaWxlZCIpOwotCi0JCWdvdG8gZXJyOwotCX0KIAogCXJldHVybiAwOwogZXJyOgpAQCAtMTc0LDMxICsxNTEsMzIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYW50aXNfcmlzY19wcm9ncmFtKHN0cnVjdCBtYW50aXNfcGNpICptYW50aXMpCiB7CiAJdTMyIGJ1Zl9wb3MgPSAwOwotCXUzMiBsaW5lOworCXUzMiBsaW5lLCBzdGVwOworCXUzMiByaXNjX3BvczsKIAogCWRwcmludGsoTUFOVElTX0RFQlVHLCAxLCAiTWFudGlzIGNyZWF0ZSBSSVNDIHByb2dyYW0iKTsKLQlSSVNDX0ZMVVNIKCk7CisJUklTQ19GTFVTSChyaXNjX3Bvcyk7CiAKLQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMSwgInJpc2MgbGVuIGxpbmVzICV1LCBieXRlcyBwZXIgbGluZSAldSIsCi0JCW1hbnRpcy0+bGluZV9jb3VudCwgbWFudGlzLT5saW5lX2J5dGVzKTsKKwlkcHJpbnRrKE1BTlRJU19ERUJVRywgMSwgInJpc2MgbGVuIGxpbmVzICV1LCBieXRlcyBwZXIgbGluZSAldSwgYnl0ZXMgcGVyIERNQSB0ciAldSIsCisJCU1BTlRJU19CTE9DS19DT1VOVCwgTUFOVElTX0JMT0NLX0JZVEVTLCBNQU5USVNfRE1BX1RSX0JZVEVTKTsKIAotCWZvciAobGluZSA9IDA7IGxpbmUgPCBtYW50aXMtPmxpbmVfY291bnQ7IGxpbmUrKykgewotCQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMSwgIlJJU0MgUFJPRyBsaW5lPVslZF0iLCBsaW5lKTsKLQkJaWYgKCEoYnVmX3BvcyAlIE1BTlRJU19CTE9DS19CWVRFUykpIHsKLQkJCVJJU0NfSU5TVFIoUklTQ19XUklURQl8Ci0JCQkJICAgUklTQ19JUlEJfAotCQkJCSAgIFJJU0NfU1RBVFVTKCgoYnVmX3BvcyAvIE1BTlRJU19CTE9DS19CWVRFUykgKwotCQkJCSAgIChNQU5USVNfQkxPQ0tfQ09VTlQgLSAxKSkgJQotCQkJCSAgICBNQU5USVNfQkxPQ0tfQ09VTlQpIHwKLQkJCQkgICAgbWFudGlzLT5saW5lX2J5dGVzKTsKLQkJfSBlbHNlIHsKLQkJCVJJU0NfSU5TVFIoUklTQ19XUklURQl8IG1hbnRpcy0+bGluZV9ieXRlcyk7Ci0JCX0KLQkJUklTQ19JTlNUUihtYW50aXMtPmJ1Zl9kbWEgKyBidWZfcG9zKTsKLQkJYnVmX3BvcyArPSBtYW50aXMtPmxpbmVfYnl0ZXM7CisJZm9yIChsaW5lID0gMDsgbGluZSA8IE1BTlRJU19CTE9DS19DT1VOVDsgbGluZSsrKSB7CisJCWZvciAoc3RlcCA9IDA7IHN0ZXAgPCBNQU5USVNfRE1BX1RSX1VOSVRTOyBzdGVwKyspIHsKKwkJCWRwcmludGsoTUFOVElTX0RFQlVHLCAxLCAiUklTQyBQUk9HIGxpbmU9WyVkXSwgc3RlcD1bJWRdIiwgbGluZSwgc3RlcCk7CisJCQlpZiAoc3RlcCA9PSAwKSB7CisJCQkJUklTQ19JTlNUUihyaXNjX3BvcywgUklTQ19XUklURQl8CisJCQkJCSAgIFJJU0NfSVJRCXwKKwkJCQkJICAgUklTQ19TVEFUVVMobGluZSkgfAorCQkJCQkgICBNQU5USVNfRE1BX1RSX0JZVEVTKTsKKwkJCX0gZWxzZSB7CisJCQkJUklTQ19JTlNUUihyaXNjX3BvcywgUklTQ19XUklURSB8IE1BTlRJU19ETUFfVFJfQllURVMpOworCQkJfQorCQkJUklTQ19JTlNUUihyaXNjX3BvcywgbWFudGlzLT5idWZfZG1hICsgYnVmX3Bvcyk7CisJCQlidWZfcG9zICs9IE1BTlRJU19ETUFfVFJfQllURVM7CisJCSAgfQogCX0KLQlSSVNDX0lOU1RSKFJJU0NfSlVNUCk7Ci0JUklTQ19JTlNUUihtYW50aXMtPnJpc2NfZG1hKTsKKwlSSVNDX0lOU1RSKHJpc2NfcG9zLCBSSVNDX0pVTVApOworCVJJU0NfSU5TVFIocmlzY19wb3MsIG1hbnRpcy0+cmlzY19kbWEpOwogfQogCiB2b2lkIG1hbnRpc19kbWFfc3RhcnQoc3RydWN0IG1hbnRpc19wY2kgKm1hbnRpcykKQEAgLTIxMCw3ICsxODgsNyBAQAogCW1td3JpdGUobW1yZWFkKE1BTlRJU19HUElGX0FERFIpIHwgTUFOVElTX0dQSUZfSElGUkRXUk4sIE1BTlRJU19HUElGX0FERFIpOwogCiAJbW13cml0ZSgwLCBNQU5USVNfRE1BX0NUTCk7Ci0JbWFudGlzLT5sYXN0X2Jsb2NrID0gbWFudGlzLT5maW5pc2hlZF9ibG9jayA9IDA7CisJbWFudGlzLT5sYXN0X2Jsb2NrID0gbWFudGlzLT5idXN5X2Jsb2NrID0gMDsKIAogCW1td3JpdGUobW1yZWFkKE1BTlRJU19JTlRfTUFTSykgfCBNQU5USVNfSU5UX1JJU0NJLCBNQU5USVNfSU5UX01BU0spOwogCkBAIC0yNDUsOSArMjIzLDkgQEAKIAlzdHJ1Y3QgbWFudGlzX3BjaSAqbWFudGlzID0gKHN0cnVjdCBtYW50aXNfcGNpICopIGRhdGE7CiAJc3RydWN0IG1hbnRpc19od2NvbmZpZyAqY29uZmlnID0gbWFudGlzLT5od2NvbmZpZzsKIAotCXdoaWxlIChtYW50aXMtPmxhc3RfYmxvY2sgIT0gbWFudGlzLT5maW5pc2hlZF9ibG9jaykgeworCXdoaWxlIChtYW50aXMtPmxhc3RfYmxvY2sgIT0gbWFudGlzLT5idXN5X2Jsb2NrKSB7CiAJCWRwcmludGsoTUFOVElTX0RFQlVHLCAxLCAibGFzdCBibG9jaz1bJWRdIGZpbmlzaGVkIGJsb2NrPVslZF0iLAotCQkJbWFudGlzLT5sYXN0X2Jsb2NrLCBtYW50aXMtPmZpbmlzaGVkX2Jsb2NrKTsKKwkJCW1hbnRpcy0+bGFzdF9ibG9jaywgbWFudGlzLT5idXN5X2Jsb2NrKTsKIAogCQkoY29uZmlnLT50c19zaXplID8gZHZiX2RteF9zd2ZpbHRlcl8yMDQgOiBkdmJfZG14X3N3ZmlsdGVyKQogCQkoJm1hbnRpcy0+ZGVtdXgsICZtYW50aXMtPmJ1Zl9jcHVbbWFudGlzLT5sYXN0X2Jsb2NrICogTUFOVElTX0JMT0NLX0JZVEVTXSwgTUFOVElTX0JMT0NLX0JZVEVTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfdnAxMDQxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX3ZwMTA0MS5jCmluZGV4IDM4YTQzNmMuLjA3YWE4ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfdnAxMDQxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc192cDEwNDEuYwpAQCAtNTEsNyArNTEsNiBAQAogCXsgU1RCMDg5OV9ESVNSWF9TVDAgICAgIAksIDB4MDQgfSwKIAl7IFNUQjA4OTlfRElTUlhfU1QxICAgICAJLCAweDAwIH0sCiAJeyBTVEIwODk5X0RJU1BBUklUWSAgICAgCSwgMHgwMCB9LAotCXsgU1RCMDg5OV9ESVNGSUZPICAgICAgIAksIDB4MDAgfSwKIAl7IFNUQjA4OTlfRElTU1RBVFVTCQksIDB4MjAgfSwKIAl7IFNUQjA4OTlfRElTRjIyICAgICAgICAJLCAweDk5IH0sCiAJeyBTVEIwODk5X0RJU0YyMlJYICAgICAgCSwgMHhhOCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9NYWtlZmlsZQppbmRleCAyYmM5Njg3Li4xM2ViZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9NYWtlZmlsZQpAQCAtNiw5ICs2LDkgQEAKIAogb2JqLSQoQ09ORklHX0RWQl9OR0VORSkgKz0gbmdlbmUubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzLwogCiAjIEZvciB0aGUgc3RhZ2luZyBDSSBkcml2ZXIgY3hkMjA5OQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZQppbmRleCA3YWMxMjg3Li43MDA4MjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAogb2JqLSQoQ09ORklHX0RWQl9QTFVUTzIpICs9IHBsdXRvMi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3B0MS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3B0MS9NYWtlZmlsZQppbmRleCBhNjZkYTE3Li5kODBkOGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9wdDEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvcHQxL01ha2VmaWxlCkBAIC0yLDQgKzIsNCBAQAogCiBvYmotJChDT05GSUdfRFZCX1BUMSkgKz0gZWFydGgtcHQxLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUgLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL01ha2VmaWxlCmluZGV4IGM1NDE0MGIuLmYyMzNiNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogb2JqLSQoQ09ORklHX1NNU19VU0JfRFJWKSArPSBzbXN1c2Iubwogb2JqLSQoQ09ORklHX1NNU19TRElPX0RSVikgKz0gc21zc2Rpby5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQogCi1FWFRSQV9DRkxBR1MgKz0gJChleHRyYS1jZmxhZ3MteSkgJChleHRyYS1jZmxhZ3MtbSkKK2NjZmxhZ3MteSArPSAkKGV4dHJhLWNmbGFncy15KSAkKGV4dHJhLWNmbGFncy1tKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jCmluZGV4IGFmMTIxZGIuLjY4MGM3ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlICJzbXMtY2FyZHMuaCIKICNpbmNsdWRlICJzbXNpci5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgaW50IHNtc19kYmc7CiBtb2R1bGVfcGFyYW1fbmFtZWQoY2FyZHNfZGJnLCBzbXNfZGJnLCBpbnQsIDA2NDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zZW5kaWFuLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNlbmRpYW4uYwppbmRleCA0NTdiNmQwLi5lMjY1N2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNlbmRpYW4uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNlbmRpYW4uYwpAQCAtMTksNiArMTksNyBAQAogCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2luY2x1ZGUgInNtc2VuZGlhbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zc2Rpby5jIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zc2Rpby5jCmluZGV4IGU1N2QzOGIuLjkxZjhjODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc3NkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNzZGlvLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInNtc2NvcmVhcGkuaCIKICNpbmNsdWRlICJzbXMtY2FyZHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc3VzYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zdXNiLmMKaW5kZXggMGM4MTY0YS4uNTFjNzEyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zdXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zdXNiLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInNtc2NvcmVhcGkuaCIKICNpbmNsdWRlICJzbXMtY2FyZHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUKaW5kZXggOGE0ZDViYi4uZjZlODY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUKQEAgLTE3LDUgKzE3LDUgQEAKIG9iai0kKENPTkZJR19EVkJfQlVER0VUX1BBVENIKSArPSBidWRnZXQtcGF0Y2gubwogb2JqLSQoQ09ORklHX0RWQl9BVjcxMTApICs9IGR2Yi10dHBjaS5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMKaW5kZXggY2RkMzFjYS4uZWU4ZWUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF92NGwuYwpAQCAtMjUsNiArMjUsOCBAQAogICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcvIAogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTI1Myw3ICsyNTUsNyBAQAogCiAJCXN3aXRjaCAoYXY3MTEwLT5jdXJyZW50X2lucHV0KSB7CiAJCWNhc2UgMToKLQkJCWRwcmludGsoMSwgInN3aXRjaGluZyBTQUE3MTEzIHRvIEFuYWxvZyBUdW5lciBJbnB1dC5cbiIpOworCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gQW5hbG9nIFR1bmVyIElucHV0XG4iKTsKIAkJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwOCwgMHgwMDAwKTsgLy8gbG91ZHNwZWFrZXIgc291cmNlCiAJCQltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMDksIDB4MDAwMCk7IC8vIGhlYWRwaG9uZSBzb3VyY2UKIAkJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwYSwgMHgwMDAwKTsgLy8gU0NBUlQgMSBzb3VyY2UKQEAgLTI2Myw3ICsyNjUsNyBAQAogCiAJCQlpZiAoYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MgJiBBTkFMT0dfVFVORVJfVkVTMTgyMCkgewogCQkJCWlmICh2ZXMxODIwX3dyaXRlcmVnKGRldiwgMHgwOSwgMHgwZiwgMHg2MCkpCi0JCQkJCWRwcmludGsoMSwgInNldHRpbmcgYmFuZCBpbiBkZW1vZHVsYXRvciBmYWlsZWQuXG4iKTsKKwkJCQkJZHByaW50aygxLCAic2V0dGluZyBiYW5kIGluIGRlbW9kdWxhdG9yIGZhaWxlZFxuIik7CiAJCQl9IGVsc2UgaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzICYgQU5BTE9HX1RVTkVSX1NUVjAyOTcpIHsKIAkJCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvLyBUREE5ODE5IHBpbjkoU1REKQogCQkJCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDMsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8vIFREQTk4MTkgcGluMzAoVklGKQpAQCAtMjcyLDE3ICsyNzQsMTcgQEAKIAkJCQlkcHJpbnRrKDEsICJzYWE3MTEzIHdyaXRlIGZhaWxlZCBAIGNhcmQgJWQiLCBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gVmlkZW8gQVYgQ1ZCUyBJbnB1dC5cbiIpOworCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gVmlkZW8gQVYgQ1ZCUyBJbnB1dFxuIik7CiAJCQlpZiAoaTJjX3dyaXRlcmVnKGF2NzExMCwgMHg0OCwgMHgwMiwgMHhkMikgIT0gMSkKIAkJCQlkcHJpbnRrKDEsICJzYWE3MTEzIHdyaXRlIGZhaWxlZCBAIGNhcmQgJWQiLCBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCQlicmVhazsKIAkJY2FzZSAzOgotCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gVmlkZW8gQVYgWS9DIElucHV0LlxuIik7CisJCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgU0FBNzExMyB0byBWaWRlbyBBViBZL0MgSW5wdXRcbiIpOwogCQkJaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4NDgsIDB4MDIsIDB4ZDkpICE9IDEpCiAJCQkJZHByaW50aygxLCAic2FhNzExMyB3cml0ZSBmYWlsZWQgQCBjYXJkICVkIiwgYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgU0FBNzExMyB0byBJbnB1dDogQVY3MTEwOiBTQUE3MTEzOiBpbnZhbGlkIGlucHV0LlxuIik7CisJCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgU0FBNzExMyB0byBJbnB1dDogQVY3MTEwOiBTQUE3MTEzOiBpbnZhbGlkIGlucHV0XG4iKTsKIAkJfQogCX0gZWxzZSB7CiAJCWFkc3dpdGNoID0gMDsKQEAgLTI5OSw3ICszMDEsNyBAQAogCiAJCWlmIChhdjcxMTAtPmFuYWxvZ190dW5lcl9mbGFncyAmIEFOQUxPR19UVU5FUl9WRVMxODIwKSB7CiAJCQlpZiAodmVzMTgyMF93cml0ZXJlZyhkZXYsIDB4MDksIDB4MGYsIDB4MjApKQotCQkJCWRwcmludGsoMSwgInNldHRpbmcgYmFuZCBpbiBkZW1vZHVsYXRvciBmYWlsZWQuXG4iKTsKKwkJCQlkcHJpbnRrKDEsICJzZXR0aW5nIGJhbmQgaW4gZGVtb2R1bGF0b3IgZmFpbGVkXG4iKTsKIAkJfSBlbHNlIGlmIChhdjcxMTAtPmFuYWxvZ190dW5lcl9mbGFncyAmIEFOQUxPR19UVU5FUl9TVFYwMjk3KSB7CiAJCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvLyBUREE5ODE5IHBpbjkoU1REKQogCQkJc2FhNzE0Nl9zZXRncGlvKGRldiwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsgLy8gVERBOTgxOSBwaW4zMChWSUYpCkBAIC00MTMsNyArNDE1LDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9ICgoc3RydWN0IHNhYTcxNDZfZmggKilmaCktPmRldjsKIAlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSAoc3RydWN0IGF2NzExMCAqKWRldi0+ZXh0X3ByaXY7CiAKLQlkcHJpbnRrKDIsICJWSURJT0NfR19GUkVROiBmcmVxOjB4JTA4eC5cbiIsIGYtPmZyZXF1ZW5jeSk7CisJZHByaW50aygyLCAiVklESU9DX0dfRlJFUTogZnJlcToweCUwOHhcbiIsIGYtPmZyZXF1ZW5jeSk7CiAKIAlpZiAoIWF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzIHx8IGF2NzExMC0+Y3VycmVudF9pbnB1dCAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQyOSw3ICs0MzEsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gKChzdHJ1Y3Qgc2FhNzE0Nl9maCAqKWZoKS0+ZGV2OwogCXN0cnVjdCBhdjcxMTAgKmF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwICopZGV2LT5leHRfcHJpdjsKIAotCWRwcmludGsoMiwgIlZJRElPQ19TX0ZSRVFVRU5DWTogZnJlcToweCUwOHguXG4iLCBmLT5mcmVxdWVuY3kpOworCWRwcmludGsoMiwgIlZJRElPQ19TX0ZSRVFVRU5DWTogZnJlcToweCUwOHhcbiIsIGYtPmZyZXF1ZW5jeSk7CiAKIAlpZiAoIWF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzIHx8IGF2NzExMC0+Y3VycmVudF9pbnB1dCAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY4OSwxMiArNjkxLDEyIEBACiAKIAlpZiAoaTJjX3dyaXRlcmVnKGF2NzExMCwgMHg4MCwgMHgwLCAweDgwKSA9PSAxICYmCiAJICAgIGkyY193cml0ZXJlZyhhdjcxMTAsIDB4ODAsIDB4MCwgMCkgPT0gMSkgewotCQlwcmludGsoImR2Yi10dHBjaTogRFZCLUMgYW5hbG9nIG1vZHVsZSBAIGNhcmQgJWQgZGV0ZWN0ZWQsIGluaXRpYWxpemluZyBNU1AzNDAwXG4iLAorCQlwcl9pbmZvKCJEVkItQyBhbmFsb2cgbW9kdWxlIEAgY2FyZCAlZCBkZXRlY3RlZCwgaW5pdGlhbGl6aW5nIE1TUDM0MDBcbiIsCiAJCQlhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCWF2NzExMC0+YWRhY190eXBlID0gRFZCX0FEQUNfTVNQMzR4MDsKIAl9IGVsc2UgaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4ODQsIDB4MCwgMHg4MCkgPT0gMSAmJgogCQkgICBpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDg0LCAweDAsIDApID09IDEpIHsKLQkJcHJpbnRrKCJkdmItdHRwY2k6IERWQi1DIGFuYWxvZyBtb2R1bGUgQCBjYXJkICVkIGRldGVjdGVkLCBpbml0aWFsaXppbmcgTVNQMzQxNVxuIiwKKwkJcHJfaW5mbygiRFZCLUMgYW5hbG9nIG1vZHVsZSBAIGNhcmQgJWQgZGV0ZWN0ZWQsIGluaXRpYWxpemluZyBNU1AzNDE1XG4iLAogCQkJYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOwogCQlhdjcxMTAtPmFkYWNfdHlwZSA9IERWQl9BREFDX01TUDM0eDU7CiAJfSBlbHNlCkBAIC03MTUsNyArNzE3LDcgQEAKIAltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMGQsIDB4MTkwMCk7IC8vIHByZXNjYWxlIFNDQVJUCiAKIAlpZiAoaTJjX3dyaXRlcmVnKGF2NzExMCwgMHg0OCwgMHgwMSwgMHgwMCkhPTEpIHsKLQkJSU5GTygoInNhYTcxMTMgbm90IGFjY2Vzc2libGUuXG4iKSk7CisJCXByX2luZm8oInNhYTcxMTMgbm90IGFjY2Vzc2libGVcbiIpOwogCX0gZWxzZSB7CiAJCXU4ICppID0gc2FhNzExM19pbml0X3JlZ3M7CiAKQEAgLTczMyw3ICs3MzUsNyBAQAogCQkvKiBzZXR1cCBmb3IgRFZCIGJ5IGRlZmF1bHQgKi8KIAkJaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzICYgQU5BTE9HX1RVTkVSX1ZFUzE4MjApIHsKIAkJCWlmICh2ZXMxODIwX3dyaXRlcmVnKGF2NzExMC0+ZGV2LCAweDA5LCAweDBmLCAweDIwKSkKLQkJCQlkcHJpbnRrKDEsICJzZXR0aW5nIGJhbmQgaW4gZGVtb2R1bGF0b3IgZmFpbGVkLlxuIik7CisJCQkJZHByaW50aygxLCAic2V0dGluZyBiYW5kIGluIGRlbW9kdWxhdG9yIGZhaWxlZFxuIik7CiAJCX0gZWxzZSBpZiAoYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MgJiBBTkFMT0dfVFVORVJfU1RWMDI5NykgewogCQkJc2FhNzE0Nl9zZXRncGlvKGF2NzExMC0+ZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvLyBUREE5ODE5IHBpbjkoU1REKQogCQkJc2FhNzE0Nl9zZXRncGlvKGF2NzExMC0+ZGV2LCAzLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvLyBUREE5ODE5IHBpbjMwKFZJRikKQEAgLTc5Nyw3ICs3OTksNyBAQAogCXJldCA9IHNhYTcxNDZfdnZfaW5pdChkZXYsIHZ2X2RhdGEpOwogCiAJaWYgKHJldCkgewotCQlFUlIoKCJjYW5ub3QgaW5pdCBjYXB0dXJlIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCUVSUigiY2Fubm90IGluaXQgY2FwdHVyZSBkZXZpY2UuIHNraXBwaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXZ2X2RhdGEtPm9wcy52aWRpb2NfZW51bV9pbnB1dCA9IHZpZGlvY19lbnVtX2lucHV0OwpAQCAtODE0LDEyICs4MTYsMTIgQEAKIAl2dl9kYXRhLT5vcHMudmlkaW9jX3NfZm10X3NsaWNlZF92Ymlfb3V0ID0gdmlkaW9jX3NfZm10X3NsaWNlZF92Ymlfb3V0OwogCiAJaWYgKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZhdjcxMTAtPnY0bF9kZXYsIGRldiwgImF2NzExMCIsIFZGTF9UWVBFX0dSQUJCRVIpKSB7Ci0JCUVSUigoImNhbm5vdCByZWdpc3RlciBjYXB0dXJlIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCUVSUigiY2Fubm90IHJlZ2lzdGVyIGNhcHR1cmUgZGV2aWNlLiBza2lwcGluZ1xuIik7CiAJCXNhYTcxNDZfdnZfcmVsZWFzZShkZXYpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZhdjcxMTAtPnZiaV9kZXYsIGRldiwgImF2NzExMCIsIFZGTF9UWVBFX1ZCSSkpCi0JCUVSUigoImNhbm5vdCByZWdpc3RlciB2YmkgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIikpOworCQlFUlIoImNhbm5vdCByZWdpc3RlciB2YmkgdjRsMiBkZXZpY2UuIHNraXBwaW5nXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYwppbmRleCBlOTU3ZDc2Li43OGQzMmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYwpAQCAtMzMsNiArMzMsOCBAQAogICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcvIAogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgImJ1ZGdldC5oIgogI2luY2x1ZGUgInN0djAyOTkuaCIKICNpbmNsdWRlICJzdGIwODk5X2Rydi5oIgpAQCAtMTQ5LDcgKzE1MSw3IEBACiAJcmVzdWx0ID0gdHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCBhZGRyZXNzICYgMHhmZmYsIDEsIDAsIDEpOwogCWlmIChyZXN1bHQgPT0gLUVUSU1FRE9VVCkgewogCQljaWludGZfc2xvdF9zaHV0ZG93bihjYSwgc2xvdCk7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2FtIGVqZWN0ZWQgMVxuIik7CisJCXByX2luZm8oImNhbSBlamVjdGVkIDFcbiIpOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTY4LDcgKzE3MCw3IEBACiAJcmVzdWx0ID0gdHRwY2lfYnVkZ2V0X2RlYml3cml0ZSgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgYWRkcmVzcyAmIDB4ZmZmLCAxLCB2YWx1ZSwgMCwgMSk7CiAJaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUKSB7CiAJCWNpaW50Zl9zbG90X3NodXRkb3duKGNhLCBzbG90KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCAyXG4iKTsKKwkJcHJfaW5mbygiY2FtIGVqZWN0ZWQgMlxuIik7CiAJfQogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xODcsNyArMTg5LDcgQEAKIAlyZXN1bHQgPSB0dHBjaV9idWRnZXRfZGViaXJlYWQoJmJ1ZGdldF9hdi0+YnVkZ2V0LCBERUJJQ0lDQU0sIGFkZHJlc3MgJiAzLCAxLCAwLCAwKTsKIAlpZiAocmVzdWx0ID09IC1FVElNRURPVVQpIHsKIAkJY2lpbnRmX3Nsb3Rfc2h1dGRvd24oY2EsIHNsb3QpOwotCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkIDNcbiIpOworCQlwcl9pbmZvKCJjYW0gZWplY3RlZCAzXG4iKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCXJldHVybiByZXN1bHQ7CkBAIC0yMDcsNyArMjA5LDcgQEAKIAlyZXN1bHQgPSB0dHBjaV9idWRnZXRfZGViaXdyaXRlKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCBhZGRyZXNzICYgMywgMSwgdmFsdWUsIDAsIDApOwogCWlmIChyZXN1bHQgPT0gLUVUSU1FRE9VVCkgewogCQljaWludGZfc2xvdF9zaHV0ZG93bihjYSwgc2xvdCk7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2FtIGVqZWN0ZWQgNVxuIik7CisJCXByX2luZm8oImNhbSBlamVjdGVkIDVcbiIpOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMjg5LDcgKzI5MSw3IEBACiAJCWlmIChzYWE3MTQ2X3JlYWQoc2FhLCBQU1IpICYgTUFTS18wNikgewogCQkJaWYgKGJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPT0gU0xPVFNUQVRVU19OT05FKSB7CiAJCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IFNMT1RTVEFUVVNfUFJFU0VOVDsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBpbnNlcnRlZCBBXG4iKTsKKwkJCQlwcl9pbmZvKCJjYW0gaW5zZXJ0ZWQgQVxuIik7CiAJCQl9CiAJCX0KIAkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsKQEAgLTMwNiwxMSArMzA4LDExIEBACiAJCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgMCwgMSwgMCwgMSk7CiAJCWlmICgocmVzdWx0ID49IDApICYmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IFNMT1RTVEFUVVNfTk9ORSkpIHsKIAkJCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSBTTE9UU1RBVFVTX1BSRVNFTlQ7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBpbnNlcnRlZCBCXG4iKTsKKwkJCXByX2luZm8oImNhbSBpbnNlcnRlZCBCXG4iKTsKIAkJfSBlbHNlIGlmIChyZXN1bHQgPCAwKSB7CiAJCQlpZiAoYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyAhPSBTTE9UU1RBVFVTX05PTkUpIHsKIAkJCQljaWludGZfc2xvdF9zaHV0ZG93bihjYSwgc2xvdCk7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCA1XG4iKTsKKwkJCQlwcl9pbmZvKCJjYW0gZWplY3RlZCA1XG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMzY1LDExICszNjcsMTEgQEAKIAogCWlmICgocmVzdWx0ID0gZHZiX2NhX2VuNTAyMjFfaW5pdCgmYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXIsCiAJCQkJCSAgJmJ1ZGdldF9hdi0+Y2EsIDAsIDEpKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnVkZ2V0LWF2OiBjaSBpbml0aWFsaXNhdGlvbiBmYWlsZWQuXG4iKTsKKwkJcHJfZXJyKCJjaSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2kgaW50ZXJmYWNlIGluaXRpYWxpc2VkLlxuIik7CisJcHJfaW5mbygiY2kgaW50ZXJmYWNlIGluaXRpYWxpc2VkXG4iKTsKIAlyZXR1cm4gMDsKIAogZXJyb3I6CkBAIC04OTYsNyArODk4LDYgQEAKIAl7IFNUQjA4OTlfRElTUlhfU1QwCQksIDB4MDQgfSwKIAl7IFNUQjA4OTlfRElTUlhfU1QxCQksIDB4MDAgfSwKIAl7IFNUQjA4OTlfRElTUEFSSVRZCQksIDB4MDAgfSwKLQl7IFNUQjA4OTlfRElTRklGTwkJLCAweDAwIH0sCiAJeyBTVEIwODk5X0RJU1NUQVRVUwkJLCAweDIwIH0sCiAJeyBTVEIwODk5X0RJU0YyMgkJLCAweDhjIH0sCiAJeyBTVEIwODk5X0RJU0YyMlJYCQksIDB4OWEgfSwKQEAgLTExOTcsNiArMTE5OCw3IEBACiAjZGVmaW5lIFNVQklEX0RWQkNfS05DMQkJCTB4MDAyMAogI2RlZmluZSBTVUJJRF9EVkJDX0tOQzFfUExVUwkJMHgwMDIxCiAjZGVmaW5lIFNVQklEX0RWQkNfS05DMV9NSzMJCTB4MDAyMgorI2RlZmluZSBTVUJJRF9EVkJDX0tOQzFfVERBMTAwMjQJMHgwMDI4CiAjZGVmaW5lIFNVQklEX0RWQkNfS05DMV9QTFVTX01LMwkweDAwMjMKICNkZWZpbmUgU1VCSURfRFZCQ19DSU5FUkdZMTIwMAkJMHgxMTU2CiAjZGVmaW5lIFNVQklEX0RWQkNfQ0lORVJHWTEyMDBfTUszCTB4MTE3NgpAQCAtMTMxNiw2ICsxMzE4LDcgQEAKIAljYXNlIFNVQklEX0RWQkNfRUFTWVdBVENIX01LMzoKIAljYXNlIFNVQklEX0RWQkNfQ0lORVJHWTEyMDBfTUszOgogCWNhc2UgU1VCSURfRFZCQ19LTkMxX01LMzoKKwljYXNlIFNVQklEX0RWQkNfS05DMV9UREExMDAyNDoKIAljYXNlIFNVQklEX0RWQkNfS05DMV9QTFVTX01LMzoKIAkJYnVkZ2V0X2F2LT5yZWluaXRpYWxpc2VfZGVtb2QgPSAxOwogCQlidWRnZXRfYXYtPmJ1ZGdldC5kZXYtPmkyY19iaXRyYXRlID0gU0FBNzE0Nl9JMkNfQlVTX0JJVF9SQVRFXzI0MDsKQEAgLTEzNDMsOCArMTM0Niw3IEBACiAJfQogCiAJaWYgKGZlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgIgotCQkJCSJmb3IgZGV2aWNlIFslMDR4OiUwNHhdIHN1YnN5c3RlbSBbJTA0eDolMDR4XVxuIiwKKwkJcHJfZXJyKCJBIGZyb250ZW5kIGRyaXZlciB3YXMgbm90IGZvdW5kIGZvciBkZXZpY2UgWyUwNHg6JTA0eF0gc3Vic3lzdGVtIFslMDR4OiUwNHhdXG4iLAogCQkgICAgICAgc2FhLT5wY2ktPnZlbmRvciwKIAkJICAgICAgIHNhYS0+cGNpLT5kZXZpY2UsCiAJCSAgICAgICBzYWEtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKQEAgLTEzNTYsNyArMTM1OCw3IEBACiAKIAlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlciwKIAkJCQkgIGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKKwkJcHJfZXJyKCJGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7CiAJCWR2Yl9mcm9udGVuZF9kZXRhY2goYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKIAkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kID0gTlVMTDsKIAl9CkBAIC0xNDE0LDcgKzE0MTYsNyBAQAogCiBzdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfaW5wdXQgKmkpCiB7Ci0JZHByaW50aygxLCAiVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsIGktPmluZGV4KTsKKwlkcHJpbnRrKDEsICJWSURJT0NfRU5VTUlOUFVUICVkXG4iLCBpLT5pbmRleCk7CiAJaWYgKGktPmluZGV4ID49IEtOQzFfSU5QVVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltZW1jcHkoaSwgJmtuYzFfaW5wdXRzW2ktPmluZGV4XSwgc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSk7CkBAIC0xNDI4LDcgKzE0MzAsNyBAQAogCiAJKmkgPSBidWRnZXRfYXYtPmN1cl9pbnB1dDsKIAotCWRwcmludGsoMSwgIlZJRElPQ19HX0lOUFVUICVkLlxuIiwgKmkpOworCWRwcmludGsoMSwgIlZJRElPQ19HX0lOUFVUICVkXG4iLCAqaSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MzcsNyArMTQzOSw3IEBACiAJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSAoKHN0cnVjdCBzYWE3MTQ2X2ZoICopZmgpLT5kZXY7CiAJc3RydWN0IGJ1ZGdldF9hdiAqYnVkZ2V0X2F2ID0gKHN0cnVjdCBidWRnZXRfYXYgKilkZXYtPmV4dF9wcml2OwogCi0JZHByaW50aygxLCAiVklESU9DX1NfSU5QVVQgJWQuXG4iLCBpbnB1dCk7CisJZHByaW50aygxLCAiVklESU9DX1NfSU5QVVQgJWRcbiIsIGlucHV0KTsKIAlyZXR1cm4gc2FhNzExM19zZXRpbnB1dChidWRnZXRfYXYsIGlucHV0KTsKIH0KIApAQCAtMTQ3Niw3ICsxNDc4LDcgQEAKIAogCQlpZiAoMCAhPSBzYWE3MTQ2X3Z2X2luaXQoZGV2LCAmdnZfZGF0YSkpIHsKIAkJCS8qIGZpeG1lOiBwcm9wZXIgY2xlYW51cCBoZXJlICovCi0JCQlFUlIoKCJjYW5ub3QgaW5pdCB2diBzdWJzeXN0ZW0uXG4iKSk7CisJCQlFUlIoImNhbm5vdCBpbml0IHZ2IHN1YnN5c3RlbVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXZ2X2RhdGEub3BzLnZpZGlvY19lbnVtX2lucHV0ID0gdmlkaW9jX2VudW1faW5wdXQ7CkBAIC0xNDg1LDcgKzE0ODcsNyBAQAogCiAJCWlmICgoZXJyID0gc2FhNzE0Nl9yZWdpc3Rlcl9kZXZpY2UoJmJ1ZGdldF9hdi0+dmQsIGRldiwgImtuYzEiLCBWRkxfVFlQRV9HUkFCQkVSKSkpIHsKIAkJCS8qIGZpeG1lOiBwcm9wZXIgY2xlYW51cCBoZXJlICovCi0JCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgY2FwdHVyZSB2NGwyIGRldmljZS5cbiIpKTsKKwkJCUVSUigiY2Fubm90IHJlZ2lzdGVyIGNhcHR1cmUgdjRsMiBkZXZpY2VcbiIpOwogCQkJc2FhNzE0Nl92dl9yZWxlYXNlKGRldik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CkBAIC0xNTAyLDEzICsxNTA0LDEyIEBACiAKIAltYWMgPSBidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlci5wcm9wb3NlZF9tYWM7CiAJaWYgKGkyY19yZWFkcmVncygmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXAsIDB4YTAsIDB4MzAsIG1hYywgNikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJLTkMxLSVkOiBDb3VsZCBub3QgcmVhZCBNQUMgZnJvbSBLTkMxIGNhcmRcbiIsCisJCXByX2VycigiS05DMS0lZDogQ291bGQgbm90IHJlYWQgTUFDIGZyb20gS05DMSBjYXJkXG4iLAogCQkgICAgICAgYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXIubnVtKTsKIAkJbWVtc2V0KG1hYywgMCwgNik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiS05DMS0lZDogTUFDIGFkZHIgPSAlLjJ4OiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeFxuIiwKLQkJICAgICAgIGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9hZGFwdGVyLm51bSwKLQkJICAgICAgIG1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworCQlwcl9pbmZvKCJLTkMxLSVkOiBNQUMgYWRkciA9ICVwTVxuIiwKKwkJCWJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9hZGFwdGVyLm51bSwgbWFjKTsKIAl9CiAKIAlidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlci5wcml2ID0gYnVkZ2V0X2F2OwpAQCAtMTU1OCw2ICsxNTU5LDcgQEAKIE1BS0VfQlVER0VUX0lORk8oa25jMXNweDQsICJLTkMxIERWQi1TIFBsdXMgWDQiLCBCVURHRVRfS05DMVNQKTsKIE1BS0VfQlVER0VUX0lORk8oa25jMWNwLCAiS05DMSBEVkItQyBQbHVzIiwgQlVER0VUX0tOQzFDUCk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzFjbWszLCAiS05DMSBEVkItQyBNSzMiLCBCVURHRVRfS05DMUNfTUszKTsKK01BS0VfQlVER0VUX0lORk8oa25jMWN0ZGExMDAyNCwgIktOQzEgRFZCLUMgVERBMTAwMjQiLCBCVURHRVRfS05DMUNfVERBMTAwMjQpOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxY3BtazMsICJLTkMxIERWQi1DIFBsdXMgTUszIiwgQlVER0VUX0tOQzFDUF9NSzMpOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxdHAsICJLTkMxIERWQi1UIFBsdXMiLCBCVURHRVRfS05DMVRQKTsKIE1BS0VfQlVER0VUX0lORk8oY2luMTIwMHMsICJUZXJyYVRlYyBDaW5lcmd5IDEyMDAgRFZCLVMiLCBCVURHRVRfQ0lOMTIwMFMpOwpAQCAtMTU4Nyw2ICsxNTg5LDcgQEAKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWMsIDB4MTg5NCwgMHgwMDIwKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWNwLCAweDE4OTQsIDB4MDAyMSksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzFjbWszLCAweDE4OTQsIDB4MDAyMiksCisJTUFLRV9FWFRFTlNJT05fUENJKGtuYzFjdGRhMTAwMjQsIDB4MTg5NCwgMHgwMDI4KSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWNwbWszLCAweDE4OTQsIDB4MDAyMyksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzF0LCAweDE4OTQsIDB4MDAzMCksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzF0cCwgMHgxODk0LCAweDAwMzEpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwppbmRleCA5MjZmMjk5Li5jYTAyZTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwpAQCAtMTA1Myw3ICsxMDUzLDYgQEAKIAl7IFNUQjA4OTlfRElTUlhfU1QwICAgICAJLCAweDA0IH0sCiAJeyBTVEIwODk5X0RJU1JYX1NUMSAgICAgCSwgMHgwMCB9LAogCXsgU1RCMDg5OV9ESVNQQVJJVFkgICAgIAksIDB4MDAgfSwKLQl7IFNUQjA4OTlfRElTRklGTyAgICAgICAJLCAweDAwIH0sCiAJeyBTVEIwODk5X0RJU1NUQVRVUwkJLCAweDIwIH0sCiAJeyBTVEIwODk5X0RJU0YyMiAgICAgICAgCSwgMHg4YyB9LAogCXsgU1RCMDg5OV9ESVNGMjJSWCAgICAgIAksIDB4OWEgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jCmluZGV4IDM3NjY2ZDQuLjM3ZDAyZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYwpAQCAtMTEwLDYgKzExMCw3IEBACiAJCWJyZWFrOwogCWNhc2UgQlVER0VUX0NJTjEyMDBDX01LMzoKIAljYXNlIEJVREdFVF9LTkMxQ19NSzM6CisJY2FzZSBCVURHRVRfS05DMUNfVERBMTAwMjQ6CiAJY2FzZSBCVURHRVRfS05DMUNQX01LMzoKIAkJaWYgKGJ1ZGdldC0+dmlkZW9fcG9ydCA9PSBCVURHRVRfVklERU9fUE9SVEEpIHsKIAkJCXNhYTcxNDZfd3JpdGUoZGV2LCBERDFfSU5JVCwgMHgwNjAwMDIwMCk7CkBAIC00MzQsNiArNDM1LDcgQEAKIAljYXNlIEJVREdFVF9LTkMxQ1A6CiAJY2FzZSBCVURHRVRfQ0lOMTIwMEM6CiAJY2FzZSBCVURHRVRfS05DMUNfTUszOgorCWNhc2UgQlVER0VUX0tOQzFDX1REQTEwMDI0OgogCWNhc2UgQlVER0VUX0tOQzFDUF9NSzM6CiAJY2FzZSBCVURHRVRfQ0lOMTIwMENfTUszOgogCQlidWRnZXQtPmJ1ZmZlcl93aWR0aCA9IFRTX1dJRFRIX0RWQkM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5oCmluZGV4IDNhZDBjNjcuLjNkOGE4MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5oCkBAIC0xMDQsNiArMTA0LDcgQEAKICNkZWZpbmUgQlVER0VUX0tOQzFDX01LMwkgICAxNgogI2RlZmluZSBCVURHRVRfS05DMUNQX01LMwkgICAxNwogI2RlZmluZSBCVURHRVRfS05DMVMyICAgICAgICAgICAgICAxOAorI2RlZmluZSBCVURHRVRfS05DMUNfVERBMTAwMjQJICAgMTkKIAogI2RlZmluZSBCVURHRVRfVklERU9fUE9SVEEgICAgICAgICAwCiAjZGVmaW5lIEJVREdFVF9WSURFT19QT1JUQiAgICAgICAgIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL3R0cGNpLWVlcHJvbS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvdHRwY2ktZWVwcm9tLmMKaW5kZXggN2RkNTRiMy4uMzJkNDMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvdHRwY2ktZWVwcm9tLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvdHRwY2ktZWVwcm9tLmMKQEAgLTg1LDYgKzg1LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCB0dHBjaV9lZXByb21fZGVjb2RlX21hYyh1OCAqZGVjb2RlZE1BQywgdTggKmVuY29kZWRNQUMpCit7CisJdTggeG9yWzIwXSA9IHsgMHg3MiwgMHgyMywgMHg2OCwgMHgxOSwgMHg1YywgMHhhOCwgMHg3MSwgMHgyYywKKwkJICAgICAgIDB4NTQsIDB4ZDMsIDB4N2IsIDB4ZjEsIDB4OUUsIDB4MjMsIDB4MTYsIDB4ZjYsCisJCSAgICAgICAweDFkLCAweDM2LCAweDY0LCAweDc4fTsKKwl1OCBkYXRhWzIwXTsKKwlpbnQgaTsKKworCW1lbWNweShkYXRhLCBlbmNvZGVkTUFDLCAyMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKwkJZGF0YVtpXSBePSB4b3JbaV07CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCWRhdGFbaV0gPSAoKGRhdGFbMiAqIGkgKyAxXSA8PCA4KSB8IGRhdGFbMiAqIGldKQorCQkJPj4gKChkYXRhWzIgKiBpICsgMV0gPj4gNikgJiAzKTsKKworCWlmIChjaGVja19tYWNfdHQoZGF0YSkpCisJCXJldHVybiAtRU5PREVWOworCisJZGVjb2RlZE1BQ1swXSA9IGRhdGFbMl07CisJZGVjb2RlZE1BQ1sxXSA9IGRhdGFbMV07CisJZGVjb2RlZE1BQ1syXSA9IGRhdGFbMF07CisJZGVjb2RlZE1BQ1szXSA9IGRhdGFbNl07CisJZGVjb2RlZE1BQ1s0XSA9IGRhdGFbNV07CisJZGVjb2RlZE1BQ1s1XSA9IGRhdGFbNF07CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHR0cGNpX2VlcHJvbV9kZWNvZGVfbWFjKTsKKwogc3RhdGljIGludCB0dHBjaV9lZXByb21fcmVhZF9lbmNvZGVkTUFDKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggKiBlbmNvZGVkTUFDKQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS90dHBjaS1lZXByb20uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL3R0cGNpLWVlcHJvbS5oCmluZGV4IGUyZGM2Y2YuLmRjYzMzZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL3R0cGNpLWVlcHJvbS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL3R0cGNpLWVlcHJvbS5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAorZXh0ZXJuIGludCB0dHBjaV9lZXByb21fZGVjb2RlX21hYyh1OCAqZGVjb2RlZE1BQywgdTggKmVuY29kZWRNQUMpOwogZXh0ZXJuIGludCB0dHBjaV9lZXByb21fcGFyc2VfbWFjKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggKnByb3BzZWRfbWFjKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvTWFrZWZpbGUKaW5kZXggZmJlMmI5NS4uOGQ2YzRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9NYWtlZmlsZQpAQCAtMSwzICsxLDMgQEAKIG9iai0kKENPTkZJR19EVkJfVFRVU0JfQlVER0VUKSArPSBkdmItdHR1c2ItYnVkZ2V0Lm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy9NYWtlZmlsZQppbmRleCAyZDcwYTgyLi5lZDI4YjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAogb2JqLSQoQ09ORklHX0RWQl9UVFVTQl9ERUMpICs9IHR0dXNiX2RlYy5vIHR0dXNiZGVjZmUubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9tZWRpYS1kZXZpY2UuYyBiL2RyaXZlcnMvbWVkaWEvbWVkaWEtZGV2aWNlLmMKaW5kZXggMTZiNzBiNC4uNmVkYzliYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9tZWRpYS1kZXZpY2UuYworKysgYi9kcml2ZXJzL21lZGlhL21lZGlhLWRldmljZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L21lZGlhLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYS1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYS1kZXZub2RlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKaW5kZXggNTI3OThhMS4uY2NkNWYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZwpAQCAtNDI2LDcgKzQyNiw2IEBACiBjb25maWcgUkFESU9fV0wxMjczCiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFdMMTI3MyBJMkMgRk0gUmFkaW8iCiAJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMgotCXNlbGVjdCBNRkRfQ09SRQogCXNlbGVjdCBNRkRfV0wxMjczX0NPUkUKIAlzZWxlY3QgRldfTE9BREVSCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vTWFrZWZpbGUKaW5kZXggZjQ4NGE2ZS4uMzkwZGFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL01ha2VmaWxlCkBAIC0yNyw0ICsyNyw0IEBACiBvYmotJChDT05GSUdfUkFESU9fV0wxMjczKSArPSByYWRpby13bDEyNzMubwogb2JqLSQoQ09ORklHX1JBRElPX1dMMTI4WCkgKz0gd2wxMjh4LwogCi1FWFRSQV9DRkxBR1MgKz0gLUlzb3VuZAorY2NmbGFncy15ICs9IC1Jc291bmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2k0NzEzLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNpNDcxMy5jCmluZGV4IDQ0NGI0Y2YuLmQxZmFiNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2k0NzEzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zaTQ3MTMuYwpAQCAtOTIsMTAgKzkyLDYgQEAKIHN0YXRpYyBpbnQgcmFkaW9fc2k0NzEzX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXBhYmlsaXR5KQogewotCXN0cnVjdCByYWRpb19zaTQ3MTNfZGV2aWNlICpyc2RldjsKLQotCXJzZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7Ci0KIAlzdHJsY3B5KGNhcGFiaWxpdHktPmRyaXZlciwgInJhZGlvLXNpNDcxMyIsIHNpemVvZihjYXBhYmlsaXR5LT5kcml2ZXIpKTsKIAlzdHJsY3B5KGNhcGFiaWxpdHktPmNhcmQsICJTaWxpY29uIExhYnMgU2k0NzEzIE1vZHVsYXRvciIsCiAJCQkJc2l6ZW9mKGNhcGFiaWxpdHktPmNhcmQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVhNTc2NC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMKaW5kZXggOTVkZGNjNC4uZGIyMDkwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMKQEAgLTEyOCw4ICsxMjgsMTAgQEAKIAl1MTYgcmRzYmJsOwkJCQkvKiBQQVVTRURFVCAmIFJEU0JCTCAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLSNpZm5kZWYgUkFESU9fVEVBNTc2NF9YVEFMCisjaWZkZWYgQ09ORklHX1JBRElPX1RFQTU3NjRfWFRBTAogI2RlZmluZSBSQURJT19URUE1NzY0X1hUQUwgMQorI2Vsc2UKKyNkZWZpbmUgUkFESU9fVEVBNTc2NF9YVEFMIDAKICNlbmRpZgogCiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRpbWIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCmluZGV4IGYxN2I1NDAuLjNlOTIwOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3RpbWJfcmFkaW8uaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAidGltYi1yYWRpbyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8td2wxMjczLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXdsMTI3My5jCmluZGV4IDQ2Y2FjZjguLjhhYTQ5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8td2wxMjczLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby13bDEyNzMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC93bDEyNzMtY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgpAQCAtMjEwOSw3ICsyMTEwLDcgQEAKIAkJCQkgVjRMMl9DSURfVFVORV9BTlRFTk5BX0NBUEFDSVRPUiwKIAkJCQkgMCwgMjU1LCAxLCAyNTUpOwogCWlmIChjdHJsKQotCQljdHJsLT5pc192b2xhdGlsZSA9IDE7CisJCWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFOwogCiAJaWYgKHJhZGlvLT5jdHJsX2hhbmRsZXIuZXJyb3IpIHsKIAkJciA9IHJhZGlvLT5jdHJsX2hhbmRsZXIuZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMKaW5kZXggNGNmNTM3MC4uYTZhZDcwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYwpAQCAtMzk1LDcgKzM5NSw2IEBACiBzdGF0aWMgdm9pZCBzaTQ3MHhfaW50X2luX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB1cmItPmNvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciBidWZbUkRTX1JFUE9SVF9TSVpFXTsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGNoYXIgcmVnbnI7CiAJdW5zaWduZWQgY2hhciBibG9ja251bTsKQEAgLTQyMyw3ICs0MjIsNiBAQAogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKIAkJLyogVXBkYXRlIFJEUyByZWdpc3RlcnMgd2l0aCBVUkIgZGF0YSAqLwotCQlidWZbMF0gPSBSRFNfUkVQT1JUOwogCQlmb3IgKHJlZ25yID0gMDsgcmVnbnIgPCBSRFNfUkVHSVNURVJfTlVNOyByZWducisrKQogCQkJcmFkaW8tPnJlZ2lzdGVyc1tTVEFUVVNSU1NJICsgcmVnbnJdID0KIAkJCSAgICBnZXRfdW5hbGlnbmVkX2JlMTYoJnJhZGlvLT5pbnRfaW5fYnVmZmVyWwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYwppbmRleCBjOWY0YThlNi4uMjdhYmE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydl92NGwyLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydl92NGwyLmMKaW5kZXggZWMxZDUyZi4uNGY1YzQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnZfdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2X3Y0bDIuYwpAQCAtMjgsNiArMjgsOCBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKICNpbmNsdWRlICJmbWRydi5oIgogI2luY2x1ZGUgImZtZHJ2X3Y0bDIuaCIKICNpbmNsdWRlICJmbWRydl9jb21tb24uaCIKQEAgLTg0LDEyICs4NiwxNCBAQAogCXJldCA9IGNvcHlfZnJvbV91c2VyKCZyZHMsIGJ1Ziwgc2l6ZW9mKHJkcykpOwogCWZtZGJnKCIoJWQpdHlwZTogJWQsIHRleHQgJXMsIGFmICVkXG4iLAogCQkgICByZXQsIHJkcy50ZXh0X3R5cGUsIHJkcy50ZXh0LCByZHMuYWZfZnJlcSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlmbWRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJZm1fdHhfc2V0X3JhZGlvX3RleHQoZm1kZXYsIHJkcy50ZXh0LCByZHMudGV4dF90eXBlKTsKIAlmbV90eF9zZXRfYWYoZm1kZXYsIHJkcy5hZl9mcmVxKTsKIAotCXJldHVybiAwOworCXJldHVybiBzaXplb2YocmRzKTsKIH0KIAogc3RhdGljIHUzMiBmbV92NGwyX2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwdHMpCkBAIC01NTcsNyArNTYxLDcgQEAKIAkJCTI1NSwgMSwgMjU1KTsKIAogCWlmIChjdHJsKQotCQljdHJsLT5pc192b2xhdGlsZSA9IDE7CisJCWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3JjL0tjb25maWcKaW5kZXggODk5Zjc4My4uYWViN2Y0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvS2NvbmZpZwpAQCAtNCw4ICs0LDggQEAKIAlkZWZhdWx0IElOUFVUCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFJlbW90ZSBDb250cm9sbGVycyBvbiBMaW51eC4gVGhpcyBpcwotCSAgbmVlZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgc2V2ZXJhbCB2aWRlbyBjYXB0dXJlIGFkYXB0ZXJzLgotCSAgQ3VycmVudGx5LCBhbGwgc3VwcG9ydGVkIGRldmljZXMgdXNlIEluZnJhUmVkLgorCSAgbmVlZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgc2V2ZXJhbCB2aWRlbyBjYXB0dXJlIGFkYXB0ZXJzLAorCSAgc3RhbmRhbG9uZSBJUiByZWNlaXZlcnMvdHJhbnNtaXR0ZXJzLCBhbmQgUkYgcmVjZWl2ZXJzLgogCiAJICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSB2aWRlbyBjYXB0dXJlIGJvYXJkIGV2ZW4KIAkgIGlmIHlvdSBkb24ndCBuZWVkIElSLCBhcyBvdGhlcndpc2UsIHlvdSBtYXkgbm90IGJlIGFibGUgdG8KQEAgLTEwOCw2ICsxMDgsMjUgQEAKIAkgICBFbmFibGUgdGhpcyBvcHRpb24gdG8gcGFzcyByYXcgSVIgdG8gYW5kIGZyb20gdXNlcnNwYWNlIHZpYQogCSAgIHRoZSBMSVJDIGludGVyZmFjZS4KIAorY29uZmlnIFJDX0FUSV9SRU1PVEUKKwl0cmlzdGF0ZSAiQVRJIC8gWDEwIGJhc2VkIFVTQiBSRiByZW1vdGUgY29udHJvbHMiCisJZGVwZW5kcyBvbiBVU0JfQVJDSF9IQVNfSENECisJZGVwZW5kcyBvbiBSQ19DT1JFCisJc2VsZWN0IFVTQgorCWhlbHAKKwkgICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhbiBYMTAgYmFzZWQgVVNCIHJlbW90ZSBjb250cm9sLgorCSAgIFRoZXNlIGFyZSBSRiByZW1vdGVzIHdpdGggVVNCIHJlY2VpdmVycy4KKworCSAgIFN1Y2ggZGV2aWNlcyBpbmNsdWRlIHRoZSBBVEkgcmVtb3RlIHRoYXQgY29tZXMgd2l0aCBtYW55IG9mIEFUSSdzCisJICAgQWxsLUluLVdvbmRlciB2aWRlbyBjYXJkcywgdGhlIFgxMCAiTG9sYSIgcmVtb3RlLCBOVklESUEgUkYgcmVtb3RlLAorCSAgIE1lZGlvbiBSRiByZW1vdGUsIGFuZCBTbmFwU3RyZWFtIEZpcmVGbHkgcmVtb3RlLgorCisJICAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgbW91c2UgcG9pbnRlciwgbGVmdCBhbmQgcmlnaHQgbW91c2UgYnV0dG9ucywKKwkgICBhbmQgbWFwcyBhbGwgdGhlIG90aGVyIHJlbW90ZSBidXR0b25zIHRvIGtleXByZXNzIGV2ZW50cy4KKworCSAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgIGNhbGxlZCBhdGlfcmVtb3RlLgorCiBjb25maWcgSVJfRU5FCiAJdHJpc3RhdGUgIkVORSBlSG9tZSBSZWNlaXZlci9UcmFuc2NlaXZlciAocG5wIGlkOiBFTkUwMTAwL0VORTAyeHh4KSIKIAlkZXBlbmRzIG9uIFBOUApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcmMvTWFrZWZpbGUKaW5kZXggZjIyNGRiMC4uMjE1NmU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3JjL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw3IEBACiBvYmotJChDT05GSUdfSVJfTElSQ19DT0RFQykgKz0gaXItbGlyYy1jb2RlYy5vCiAKICMgc3RhbmQtYWxvbmUgSVIgcmVjZWl2ZXJzL3RyYW5zbWl0dGVycworb2JqLSQoQ09ORklHX1JDX0FUSV9SRU1PVEUpICs9IGF0aV9yZW1vdGUubwogb2JqLSQoQ09ORklHX0lSX0lNT04pICs9IGltb24ubwogb2JqLSQoQ09ORklHX0lSX0lURV9DSVIpICs9IGl0ZS1jaXIubwogb2JqLSQoQ09ORklHX0lSX01DRVVTQikgKz0gbWNldXNiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvYXRpX3JlbW90ZS5jIGIvZHJpdmVycy9tZWRpYS9yYy9hdGlfcmVtb3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZjIyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvYXRpX3JlbW90ZS5jCkBAIC0wLDAgKzEsOTQ2IEBACisvKgorICogIFVTQiBBVEkgUmVtb3RlIHN1cHBvcnQKKyAqCisgKiAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTEgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBpa2kuZmk+CisgKiAgVmVyc2lvbiAyLjIuMCBDb3B5cmlnaHQgKGMpIDIwMDQgVG9ycmV5IEhvZmZtYW4gPHRob2ZmbWFuQGFybm9yLm5ldD4KKyAqICBWZXJzaW9uIDIuMS4xIENvcHlyaWdodCAoYykgMjAwMiBWbGFkaW1pciBEZXJnYWNoZXYKKyAqCisgKiAgVGhpcyAyLjIuMCB2ZXJzaW9uIGlzIGEgcmV3cml0ZSAvIGNsZWFudXAgb2YgdGhlIDIuMS4xIGRyaXZlciwgaW5jbHVkaW5nCisgKiAgcG9ydGluZyB0byB0aGUgMi42IGtlcm5lbCBpbnRlcmZhY2VzLCBhbG9uZyB3aXRoIG90aGVyIG1vZGlmaWNhdGlvbgorICogIHRvIGJldHRlciBtYXRjaCB0aGUgc3R5bGUgb2YgdGhlIGV4aXN0aW5nIHVzYi9pbnB1dCBkcml2ZXJzLiAgSG93ZXZlciwgdGhlCisgKiAgcHJvdG9jb2wgYW5kIGhhcmR3YXJlIGhhbmRsaW5nIGlzIGVzc2VudGlhbGx5IHVuY2hhbmdlZCBmcm9tIDIuMS4xLgorICoKKyAqICBUaGUgMi4xLjEgZHJpdmVyIHdhcyBkZXJpdmVkIGZyb20gdGhlIHVzYmF0aV9yZW1vdGUgYW5kIHVzYmtiZCBkcml2ZXJzIGJ5CisgKiAgVm9qdGVjaCBQYXZsaWsuCisgKgorICogIENoYW5nZXM6CisgKgorICogIEZlYiAyMDA0OiBUb3JyZXkgSG9mZm1hbiA8dGhvZmZtYW5AYXJub3IubmV0PgorICogICAgICAgICAgICBWZXJzaW9uIDIuMi4wCisgKiAgSnVuIDIwMDQ6IFRvcnJleSBIb2ZmbWFuIDx0aG9mZm1hbkBhcm5vci5uZXQ+CisgKiAgICAgICAgICAgIFZlcnNpb24gMi4yLjEKKyAqICAgICAgICAgICAgQWRkZWQga2V5IHJlcGVhdCBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5OgorICogICAgICAgICAgICAgICAgVmluY2VudCBWYW5hY2tlcmUgPHZhbmFja2VyZUBsaWYudW5pdi1tcnMuZnI+CisgKiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSAiTG9sYSIgcmVtb3RlIGNvbnRyaWJ1dGVkIGJ5OgorICogICAgICAgICAgICAgICAgU2V0aCBDb2huIDxzZXRoY29obkB5YWhvby5jb20+CisgKgorICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgorICoKKyAqIEhhcmR3YXJlICYgc29mdHdhcmUgbm90ZXMKKyAqCisgKiBUaGVzZSByZW1vdGUgY29udHJvbHMgYXJlIGRpc3RyaWJ1dGVkIGJ5IEFUSSBhcyBwYXJ0IG9mIHRoZWlyCisgKiAiQWxsLUluLVdvbmRlciIgdmlkZW8gY2FyZCBwYWNrYWdlcy4gIFRoZSByZWNlaXZlciBzZWxmLWlkZW50aWZpZXMgYXMgYQorICogIlVTQiBSZWNlaXZlciIgd2l0aCBtYW51ZmFjdHVyZXIgIlgxMCBXaXJlbGVzcyBUZWNobm9sb2d5IEluYyIuCisgKgorICogVGhlICJMb2xhIiByZW1vdGUgaXMgYXZhaWxhYmxlIGZyb20gWDEwLiAgU2VlOgorICogICAgaHR0cDovL3d3dy54MTAuY29tL3Byb2R1Y3RzL2xvbGFfc2cxLmh0bQorICogVGhlIExvbGEgaXMgc2ltaWxhciB0byB0aGUgQVRJIHJlbW90ZSBidXQgaGFzIG5vIG1vdXNlIHN1cHBvcnQsIGFuZCBzbGlnaHRseQorICogZGlmZmVyZW50IGtleXMuCisgKgorICogSXQgaXMgcG9zc2libGUgdG8gdXNlIG11bHRpcGxlIHJlY2VpdmVycyBhbmQgcmVtb3RlcyBvbiBtdWx0aXBsZSBjb21wdXRlcnMKKyAqIHNpbXVsdGFuZW91c2x5IGJ5IGNvbmZpZ3VyaW5nIHRoZW0gdG8gdXNlIHNwZWNpZmljIGNoYW5uZWxzLgorICoKKyAqIFRoZSBSRiBwcm90b2NvbCB1c2VkIGJ5IHRoZSByZW1vdGUgc3VwcG9ydHMgMTYgZGlzdGluY3QgY2hhbm5lbHMsIDEgdG8gMTYuCisgKiBBY3R1YWxseSwgaXQgbWF5IGV2ZW4gc3VwcG9ydCBtb3JlLCBhdCBsZWFzdCBpbiBzb21lIHJldmlzaW9ucyBvZiB0aGUKKyAqIGhhcmR3YXJlLgorICoKKyAqIEVhY2ggcmVtb3RlIGNhbiBiZSBjb25maWd1cmVkIHRvIHRyYW5zbWl0IG9uIG9uZSBjaGFubmVsIGFzIGZvbGxvd3M6CisgKiAgIC0gUHJlc3MgYW5kIGhvbGQgdGhlICJoYW5kIGljb24iIGJ1dHRvbi4KKyAqICAgLSBXaGVuIHRoZSByZWQgTEVEIHN0YXJ0cyB0byBibGluaywgbGV0IGdvIG9mIHRoZSAiaGFuZCBpY29uIiBidXR0b24uCisgKiAgIC0gV2hlbiBpdCBzdG9wcyBibGlua2luZywgaW5wdXQgdGhlIGNoYW5uZWwgY29kZSBhcyB0d28gZGlnaXRzLCBmcm9tIDAxCisgKiAgICAgdG8gMTYsIGFuZCBwcmVzcyB0aGUgaGFuZCBpY29uIGFnYWluLgorICoKKyAqIFRoZSB0aW1pbmcgY2FuIGJlIGEgbGl0dGxlIHRyaWNreS4gIFRyeSBsb2FkaW5nIHRoZSBtb2R1bGUgd2l0aCBkZWJ1Zz0xCisgKiB0byBoYXZlIHRoZSBrZXJuZWwgcHJpbnQgb3V0IG1lc3NhZ2VzIGFib3V0IHRoZSByZW1vdGUgY29udHJvbCBudW1iZXIKKyAqIGFuZCBtYXNrLiAgTm90ZTogZGVidWdnaW5nIHByaW50cyByZW1vdGUgbnVtYmVycyBhcyB6ZXJvLWJhc2VkIGhleGFkZWNpbWFsLgorICoKKyAqIFRoZSBkcml2ZXIgaGFzIGEgImNoYW5uZWxfbWFzayIgcGFyYW1ldGVyLiBUaGlzIGJpdG1hc2sgc3BlY2lmaWVzIHdoaWNoCisgKiBjaGFubmVscyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1vZHVsZS4gIFRvIG1hc2sgb3V0IGNoYW5uZWxzLCBqdXN0IGFkZAorICogYWxsIHRoZSAyXmNoYW5uZWxfbnVtYmVyIHZhbHVlcyB0b2dldGhlci4KKyAqCisgKiBGb3IgaW5zdGFuY2UsIHNldCBjaGFubmVsX21hc2sgPSAyXjQgPSAxNiAoYmluYXJ5IDEwMDAwKSB0byBtYWtlIGF0aV9yZW1vdGUKKyAqIGlnbm9yZSBzaWduYWxzIGNvbWluZyBmcm9tIHJlbW90ZSBjb250cm9scyB0cmFuc21pdHRpbmcgb24gY2hhbm5lbCA0LCBidXQKKyAqIGFjY2VwdCBhbGwgb3RoZXIgY2hhbm5lbHMuCisgKgorICogT3IsIHNldCBjaGFubmVsX21hc2sgPSA2NTUzMywgKDB4RkZGRCksIGFuZCBhbGwgY2hhbm5lbHMgZXhjZXB0IDEgd2lsbCBiZQorICogaWdub3JlZC4KKyAqCisgKiBUaGUgZGVmYXVsdCBpcyAwIChyZXNwb25kIHRvIGFsbCBjaGFubmVscykuIEJpdCAwIGFuZCBiaXRzIDE3LTMyIG9mIHRoaXMKKyAqIHBhcmFtZXRlciBhcmUgdW51c2VkLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+CisKKy8qCisgKiBNb2R1bGUgYW5kIFZlcnNpb24gSW5mb3JtYXRpb24sIE1vZHVsZSBQYXJhbWV0ZXJzCisgKi8KKworI2RlZmluZSBBVElfUkVNT1RFX1ZFTkRPUl9JRAkJMHgwYmM3CisjZGVmaW5lIExPTEFfUkVNT1RFX1BST0RVQ1RfSUQJCTB4MDAwMgorI2RlZmluZSBMT0xBMl9SRU1PVEVfUFJPRFVDVF9JRAkJMHgwMDAzCisjZGVmaW5lIEFUSV9SRU1PVEVfUFJPRFVDVF9JRAkJMHgwMDA0CisjZGVmaW5lIE5WSURJQV9SRU1PVEVfUFJPRFVDVF9JRAkweDAwMDUKKyNkZWZpbmUgTUVESU9OX1JFTU9URV9QUk9EVUNUX0lECTB4MDAwNgorI2RlZmluZSBGSVJFRkxZX1JFTU9URV9QUk9EVUNUX0lECTB4MDAwOAorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMi4yLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgICAgICAgICAgICJUb3JyZXkgSG9mZm1hbiA8dGhvZmZtYW5AYXJub3IubmV0PiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgICAgICAgICAgICAgIkFUSS9YMTAgUkYgVVNCIFJlbW90ZSBDb250cm9sIgorCisjZGVmaW5lIE5BTUVfQlVGU0laRSAgICAgIDgwICAgIC8qIHNpemUgb2YgcHJvZHVjdCBuYW1lLCBwYXRoIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgREFUQV9CVUZTSVpFICAgICAgNjMgICAgLyogc2l6ZSBvZiBVUkIgZGF0YSBidWZmZXJzICovCisKKy8qCisgKiBEdXBsaWNhdGUgZXZlbnQgZmlsdGVyaW5nIHRpbWUuCisgKiBTZXF1ZW50aWFsLCBpZGVudGljYWwgS0lORF9GSUxURVJFRCBpbnB1dHMgd2l0aCBsZXNzIHRoYW4KKyAqIEZJTFRFUl9USU1FIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZW0gYXJlIGNvbnNpZGVyZWQgYXMgcmVwZWF0CisgKiBldmVudHMuIFRoZSBoYXJkd2FyZSBnZW5lcmF0ZXMgNSBldmVudHMgZm9yIHRoZSBmaXJzdCBrZXlwcmVzcworICogYW5kIHdlIGhhdmUgdG8gdGFrZSB0aGlzIGludG8gYWNjb3VudCBmb3IgYW4gYWNjdXJhdGUgcmVwZWF0CisgKiBiZWhhdmlvdXIuCisgKi8KKyNkZWZpbmUgRklMVEVSX1RJTUUJNjAgLyogbXNlYyAqLworI2RlZmluZSBSRVBFQVRfREVMQVkJNTAwIC8qIG1zZWMgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9tYXNrOworbW9kdWxlX3BhcmFtKGNoYW5uZWxfbWFzaywgdWxvbmcsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjaGFubmVsX21hc2ssICJCaXRtYXNrIG9mIHJlbW90ZSBjb250cm9sIGNoYW5uZWxzIHRvIGlnbm9yZSIpOworCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBleHRyYSBkZWJ1ZyBtZXNzYWdlcyBhbmQgaW5mb3JtYXRpb24iKTsKKworc3RhdGljIGludCByZXBlYXRfZmlsdGVyID0gRklMVEVSX1RJTUU7Cittb2R1bGVfcGFyYW0ocmVwZWF0X2ZpbHRlciwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVwZWF0X2ZpbHRlciwgIlJlcGVhdCBmaWx0ZXIgdGltZSwgZGVmYXVsdCA9IDYwIG1zZWMiKTsKKworc3RhdGljIGludCByZXBlYXRfZGVsYXkgPSBSRVBFQVRfREVMQVk7Cittb2R1bGVfcGFyYW0ocmVwZWF0X2RlbGF5LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhyZXBlYXRfZGVsYXksICJEZWxheSBiZWZvcmUgc2VuZGluZyByZXBlYXRzLCBkZWZhdWx0ID0gNTAwIG1zZWMiKTsKKworc3RhdGljIGJvb2wgbW91c2UgPSB0cnVlOworbW9kdWxlX3BhcmFtKG1vdXNlLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobW91c2UsICJFbmFibGUgbW91c2UgZGV2aWNlLCBkZWZhdWx0ID0geWVzIik7CisKKyNkZWZpbmUgZGJnaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgZGV2X2luZm8oZGV2ICwgZm9ybWF0ICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKKyN1bmRlZiBlcnIKKyNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgZm9ybWF0ICwgIyMgYXJnKQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXRpX3JlbW90ZV90YWJsZVtdID0geworCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTE9MQV9SRU1PVEVfUFJPRFVDVF9JRCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKVJDX01BUF9BVElfWDEwIH0sCisJeyBVU0JfREVWSUNFKEFUSV9SRU1PVEVfVkVORE9SX0lELCBMT0xBMl9SRU1PVEVfUFJPRFVDVF9JRCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKVJDX01BUF9BVElfWDEwIH0sCisJeyBVU0JfREVWSUNFKEFUSV9SRU1PVEVfVkVORE9SX0lELCBBVElfUkVNT1RFX1BST0RVQ1RfSUQpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZylSQ19NQVBfQVRJX1gxMCB9LAorCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTlZJRElBX1JFTU9URV9QUk9EVUNUX0lEKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpUkNfTUFQX0FUSV9YMTAgfSwKKwl7IFVTQl9ERVZJQ0UoQVRJX1JFTU9URV9WRU5ET1JfSUQsIE1FRElPTl9SRU1PVEVfUFJPRFVDVF9JRCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKVJDX01BUF9NRURJT05fWDEwIH0sCisJeyBVU0JfREVWSUNFKEFUSV9SRU1PVEVfVkVORE9SX0lELCBGSVJFRkxZX1JFTU9URV9QUk9EVUNUX0lEKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpUkNfTUFQX1NOQVBTVFJFQU1fRklSRUZMWSB9LAorCXt9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYXRpX3JlbW90ZV90YWJsZSk7CisKKy8qIEdldCBoaSBhbmQgbG93IGJ5dGVzIG9mIGEgMTYtYml0cyBpbnQgKi8KKyNkZWZpbmUgSEkoYSkJKCh1bnNpZ25lZCBjaGFyKSgoYSkgPj4gOCkpCisjZGVmaW5lIExPKGEpCSgodW5zaWduZWQgY2hhcikoKGEpICYgMHhmZikpCisKKyNkZWZpbmUgU0VORF9GTEFHX0lOX1BST0dSRVNTCTEKKyNkZWZpbmUgU0VORF9GTEFHX0NPTVBMRVRFCTIKKworLyogRGV2aWNlIGluaXRpYWxpemF0aW9uIHN0cmluZ3MgKi8KK3N0YXRpYyBjaGFyIGluaXQxW10gPSB7IDB4MDEsIDB4MDAsIDB4MjAsIDB4MTQgfTsKK3N0YXRpYyBjaGFyIGluaXQyW10gPSB7IDB4MDEsIDB4MDAsIDB4MjAsIDB4MTQsIDB4MjAsIDB4MjAsIDB4MjAgfTsKKworc3RydWN0IGF0aV9yZW1vdGUgeworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CisJc3RydWN0IHJjX2RldiAqcmRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCisJc3RydWN0IHVyYiAqaXJxX3VyYjsKKwlzdHJ1Y3QgdXJiICpvdXRfdXJiOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnRfaW47CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludF9vdXQ7CisJdW5zaWduZWQgY2hhciAqaW5idWY7CisJdW5zaWduZWQgY2hhciAqb3V0YnVmOworCWRtYV9hZGRyX3QgaW5idWZfZG1hOworCWRtYV9hZGRyX3Qgb3V0YnVmX2RtYTsKKworCXVuc2lnbmVkIGNoYXIgb2xkX2RhdGFbMl07ICAvKiBEZXRlY3QgZHVwbGljYXRlIGV2ZW50cyAqLworCXVuc2lnbmVkIGxvbmcgb2xkX2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBhY2NfamlmZmllczsgIC8qIGhhbmRsZSBhY2NlbGVyYXRpb24gKi8KKwl1bnNpZ25lZCBsb25nIGZpcnN0X2ppZmZpZXM7CisKKwl1bnNpZ25lZCBpbnQgcmVwZWF0X2NvdW50OworCisJY2hhciByY19uYW1lW05BTUVfQlVGU0laRV07CisJY2hhciByY19waHlzW05BTUVfQlVGU0laRV07CisJY2hhciBtb3VzZV9uYW1lW05BTUVfQlVGU0laRV07CisJY2hhciBtb3VzZV9waHlzW05BTUVfQlVGU0laRV07CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCWludCBzZW5kX2ZsYWdzOworCisJaW50IHVzZXJzOyAvKiAwLTIsIHVzZXJzIGFyZSByYyBhbmQgaW5wdXQgKi8KKwlzdHJ1Y3QgbXV0ZXggb3Blbl9tdXRleDsKK307CisKKy8qICJLaW5kcyIgb2YgbWVzc2FnZXMgc2VudCBmcm9tIHRoZSBoYXJkd2FyZSB0byB0aGUgZHJpdmVyLiAqLworI2RlZmluZSBLSU5EX0VORCAgICAgICAgMAorI2RlZmluZSBLSU5EX0xJVEVSQUwgICAgMSAgIC8qIFNpbXBseSBwYXNzIHRvIGlucHV0IHN5c3RlbSAqLworI2RlZmluZSBLSU5EX0ZJTFRFUkVEICAgMiAgIC8qIEFkZCBhcnRpZmljaWFsIGtleS11cCBldmVudHMsIGRyb3Aga2V5cmVwZWF0cyAqLworI2RlZmluZSBLSU5EX0xVICAgICAgICAgMyAgIC8qIERpcmVjdGlvbmFsIGtleXBhZCBkaWFnb25hbHMgLSBsZWZ0IHVwLCAqLworI2RlZmluZSBLSU5EX1JVICAgICAgICAgNCAgIC8qICAgcmlnaHQgdXAsICAqLworI2RlZmluZSBLSU5EX0xEICAgICAgICAgNSAgIC8qICAgbGVmdCBkb3duLCAqLworI2RlZmluZSBLSU5EX1JEICAgICAgICAgNiAgIC8qICAgcmlnaHQgZG93biAqLworI2RlZmluZSBLSU5EX0FDQ0VMICAgICAgNyAgIC8qIERpcmVjdGlvbmFsIGtleXBhZCAtIGxlZnQsIHJpZ2h0LCB1cCwgZG93bi4qLworCisvKiBUcmFuc2xhdGlvbiB0YWJsZSBmcm9tIGhhcmR3YXJlIG1lc3NhZ2VzIHRvIGlucHV0IGV2ZW50cy4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXNob3J0IGtpbmQ7CisJdW5zaWduZWQgY2hhciBkYXRhMSwgZGF0YTI7CisJaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGNvZGU7CisJaW50IHZhbHVlOworfSAgYXRpX3JlbW90ZV90YmxbXSA9IHsKKwkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBheGVzICovCisJe0tJTkRfQUNDRUwsICAgMHgzNSwgMHg3MCwgRVZfUkVMLCBSRUxfWCwgLTF9LAkgLyogbGVmdCAqLworCXtLSU5EX0FDQ0VMLCAgIDB4MzYsIDB4NzEsIEVWX1JFTCwgUkVMX1gsIDF9LCAgICAvKiByaWdodCAqLworCXtLSU5EX0FDQ0VMLCAgIDB4MzcsIDB4NzIsIEVWX1JFTCwgUkVMX1ksIC0xfSwJIC8qIHVwICovCisJe0tJTkRfQUNDRUwsICAgMHgzOCwgMHg3MywgRVZfUkVMLCBSRUxfWSwgMX0sICAgIC8qIGRvd24gKi8KKwkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBkaWFnb25hbHMgKi8KKwl7S0lORF9MVSwgICAgICAweDM5LCAweDc0LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogbGVmdCB1cCAqLworCXtLSU5EX1JVLCAgICAgIDB4M2EsIDB4NzUsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiByaWdodCB1cCAqLworCXtLSU5EX0xELCAgICAgIDB4M2MsIDB4NzcsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiBsZWZ0IGRvd24gKi8KKwl7S0lORF9SRCwgICAgICAweDNiLCAweDc2LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogcmlnaHQgZG93biAqLworCisJLyogIk1vdXNlIGJ1dHRvbiIgYnV0dG9ucyAqLworCXtLSU5EX0xJVEVSQUwsIDB4M2QsIDB4NzgsIEVWX0tFWSwgQlROX0xFRlQsIDF9LCAvKiBsZWZ0IGJ0biBkb3duICovCisJe0tJTkRfTElURVJBTCwgMHgzZSwgMHg3OSwgRVZfS0VZLCBCVE5fTEVGVCwgMH0sIC8qIGxlZnQgYnRuIHVwICovCisJe0tJTkRfTElURVJBTCwgMHg0MSwgMHg3YywgRVZfS0VZLCBCVE5fUklHSFQsIDF9LC8qIHJpZ2h0IGJ0biBkb3duICovCisJe0tJTkRfTElURVJBTCwgMHg0MiwgMHg3ZCwgRVZfS0VZLCBCVE5fUklHSFQsIDB9LC8qIHJpZ2h0IGJ0biB1cCAqLworCisJLyogQXJ0aWZpY2lhbCAiZG91YmxlY2xpY2siIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKiBUaGV5IGFyZSBtYXBwZWQgdG8gdGhlICJzaWRlIiBhbmQgImV4dHJhIiBtb3VzZSBidXR0b25zIGhlcmUuICovCisJe0tJTkRfRklMVEVSRUQsIDB4M2YsIDB4N2EsIEVWX0tFWSwgQlROX1NJREUsIDF9LCAvKiBsZWZ0IGRibGNsaWNrICovCisJe0tJTkRfRklMVEVSRUQsIDB4NDMsIDB4N2UsIEVWX0tFWSwgQlROX0VYVFJBLCAxfSwvKiByaWdodCBkYmxjbGljayAqLworCisJLyogTm9uLW1vdXNlIGV2ZW50cyBhcmUgaGFuZGxlZCBieSByYy1jb3JlICovCisJe0tJTkRfRU5ELCAweDAwLCAweDAwLCBFVl9NQVggKyAxLCAwLCAwfQorfTsKKworLyogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCBhdGlfcmVtb3RlX3NlbmRwYWNrZXQJKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlLCB1MTYgY21kLCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKK3N0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaXJxX291dAkJKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lycV9pbgkJKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lucHV0X3JlcG9ydAkoc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9pbml0aWFsaXplCShzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSk7CitzdGF0aWMgaW50IGF0aV9yZW1vdGVfcHJvYmUJCShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9kaXNjb25uZWN0CShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKKworLyogdXNiIHNwZWNpZmljIG9iamVjdCB0byByZWdpc3RlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgYXRpX3JlbW90ZV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICA9ICJhdGlfcmVtb3RlIiwKKwkucHJvYmUgICAgICAgID0gYXRpX3JlbW90ZV9wcm9iZSwKKwkuZGlzY29ubmVjdCAgID0gYXRpX3JlbW90ZV9kaXNjb25uZWN0LAorCS5pZF90YWJsZSAgICAgPSBhdGlfcmVtb3RlX3RhYmxlLAorfTsKKworLyoKKyAqCWF0aV9yZW1vdGVfZHVtcF9pbnB1dAorICovCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2R1bXAoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJaWYgKGxlbiA9PSAxKSB7CisJCWlmIChkYXRhWzBdICE9ICh1bnNpZ25lZCBjaGFyKTB4ZmYgJiYgZGF0YVswXSAhPSAweDAwKQorCQkJZGV2X3dhcm4oZGV2LCAiV2VpcmQgYnl0ZSAweCUwMnhcbiIsIGRhdGFbMF0pOworCX0gZWxzZSBpZiAobGVuID09IDQpCisJCWRldl93YXJuKGRldiwgIldlaXJkIGtleSAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgICAgIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOworCWVsc2UKKwkJZGV2X3dhcm4oZGV2LCAiV2VpcmQgZGF0YSwgbGVuPSVkICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC4uLlxuIiwKKwkJICAgICBsZW4sIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10sIGRhdGFbNF0sIGRhdGFbNV0pOworfQorCisvKgorICoJYXRpX3JlbW90ZV9vcGVuCisgKi8KK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9vcGVuKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQoreworCWludCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmYXRpX3JlbW90ZS0+b3Blbl9tdXRleCk7CisKKwlpZiAoYXRpX3JlbW90ZS0+dXNlcnMrKyAhPSAwKQorCQlnb3RvIG91dDsgLyogb25lIHdhcyBhbHJlYWR5IGFjdGl2ZSAqLworCisJLyogT24gZmlyc3Qgb3Blbiwgc3VibWl0IHRoZSByZWFkIHVyYiB3aGljaCB3YXMgc2V0IHVwIHByZXZpb3VzbHkuICovCisJYXRpX3JlbW90ZS0+aXJxX3VyYi0+ZGV2ID0gYXRpX3JlbW90ZS0+dWRldjsKKwlpZiAodXNiX3N1Ym1pdF91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYiwgR0ZQX0tFUk5FTCkpIHsKKwkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCisJCQkiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVJTzsKKwl9CisKK291dDoJbXV0ZXhfdW5sb2NrKCZhdGlfcmVtb3RlLT5vcGVuX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJYXRpX3JlbW90ZV9jbG9zZQorICovCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2Nsb3NlKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQoreworCW11dGV4X2xvY2soJmF0aV9yZW1vdGUtPm9wZW5fbXV0ZXgpOworCWlmICgtLWF0aV9yZW1vdGUtPnVzZXJzID09IDApCisJCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiKTsKKwltdXRleF91bmxvY2soJmF0aV9yZW1vdGUtPm9wZW5fbXV0ZXgpOworfQorCitzdGF0aWMgaW50IGF0aV9yZW1vdGVfaW5wdXRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldikKK3sKKwlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0ZGV2KTsKKwlyZXR1cm4gYXRpX3JlbW90ZV9vcGVuKGF0aV9yZW1vdGUpOworfQorCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2KQoreworCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRkZXYpOworCWF0aV9yZW1vdGVfY2xvc2UoYXRpX3JlbW90ZSk7Cit9CisKK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9yY19vcGVuKHN0cnVjdCByY19kZXYgKnJkZXYpCit7CisJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSByZGV2LT5wcml2OworCXJldHVybiBhdGlfcmVtb3RlX29wZW4oYXRpX3JlbW90ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aV9yZW1vdGVfcmNfY2xvc2Uoc3RydWN0IHJjX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IHJkZXYtPnByaXY7CisJYXRpX3JlbW90ZV9jbG9zZShhdGlfcmVtb3RlKTsKK30KKworLyoKKyAqCQlhdGlfcmVtb3RlX2lycV9vdXQKKyAqLworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pcnFfb3V0KHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IHVyYi0+Y29udGV4dDsKKworCWlmICh1cmItPnN0YXR1cykgeworCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsCisJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJYXRpX3JlbW90ZS0+c2VuZF9mbGFncyB8PSBTRU5EX0ZMQUdfQ09NUExFVEU7CisJd21iKCk7CisJd2FrZV91cCgmYXRpX3JlbW90ZS0+d2FpdCk7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX3NlbmRwYWNrZXQKKyAqCisgKglVc2VkIHRvIHNlbmQgZGV2aWNlIGluaXRpYWxpemF0aW9uIHN0cmluZ3MKKyAqLworc3RhdGljIGludCBhdGlfcmVtb3RlX3NlbmRwYWNrZXQoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUsIHUxNiBjbWQsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwkvKiBTZXQgdXAgb3V0X3VyYiAqLworCW1lbWNweShhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXIgKyAxLCBkYXRhLCBMTyhjbWQpKTsKKwkoKGNoYXIgKikgYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyKVswXSA9IEhJKGNtZCk7CisKKwlhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gTE8oY21kKSArIDE7CisJYXRpX3JlbW90ZS0+b3V0X3VyYi0+ZGV2ID0gYXRpX3JlbW90ZS0+dWRldjsKKwlhdGlfcmVtb3RlLT5zZW5kX2ZsYWdzID0gU0VORF9GTEFHX0lOX1BST0dSRVNTOworCisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKKwkJCSAic2VuZHBhY2tldDogdXNiX3N1Ym1pdF91cmIgZmFpbGVkOiAlZFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwl3YWl0X2V2ZW50X3RpbWVvdXQoYXRpX3JlbW90ZS0+d2FpdCwKKwkJKChhdGlfcmVtb3RlLT5vdXRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB8fAorCQkJKGF0aV9yZW1vdGUtPnNlbmRfZmxhZ3MgJiBTRU5EX0ZMQUdfQ09NUExFVEUpKSwKKwkJSFopOworCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2V2ZW50X2xvb2t1cAorICovCitzdGF0aWMgaW50IGF0aV9yZW1vdGVfZXZlbnRfbG9va3VwKGludCByZW0sIHVuc2lnbmVkIGNoYXIgZDEsIHVuc2lnbmVkIGNoYXIgZDIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBhdGlfcmVtb3RlX3RibFtpXS5raW5kICE9IEtJTkRfRU5EOyBpKyspIHsKKwkJLyoKKwkJICogRGVjaWRlIGlmIHRoZSB0YWJsZSBlbnRyeSBtYXRjaGVzIHRoZSByZW1vdGUgaW5wdXQuCisJCSAqLworCQlpZiAoYXRpX3JlbW90ZV90YmxbaV0uZGF0YTEgPT0gZDEgJiYKKwkJICAgIGF0aV9yZW1vdGVfdGJsW2ldLmRhdGEyID09IGQyKQorCQkJcmV0dXJuIGk7CisKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICoJYXRpX3JlbW90ZV9jb21wdXRlX2FjY2VsCisgKgorICogSW1wbGVtZW50cyBhY2NlbGVyYXRpb24gY3VydmUgZm9yIGRpcmVjdGlvbmFsIGNvbnRyb2wgcGFkCisgKiBJZiBlbGFwc2VkIHRpbWUgc2luY2UgbGFzdCBldmVudCBpcyA+IDEvNCBzZWNvbmQsIHVzZXIgInN0b3BwZWQiLAorICogc28gcmVzZXQgYWNjZWxlcmF0aW9uLiBPdGhlcndpc2UsIHVzZXIgaXMgcHJvYmFibHkgaG9sZGluZyB0aGUgY29udHJvbAorICogcGFkIGRvd24sIHNvIHdlIGluY3JlYXNlIGFjY2VsZXJhdGlvbiwgcmFtcGluZyB1cCBvdmVyIHR3byBzZWNvbmRzIHRvCisgKiBhIG1heGltdW0gc3BlZWQuCisgKi8KK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9jb21wdXRlX2FjY2VsKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGFjY2VsW10gPSB7IDEsIDIsIDQsIDYsIDksIDEzLCAyMCB9OworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgYWNjOworCisJaWYgKHRpbWVfYWZ0ZXIobm93LCBhdGlfcmVtb3RlLT5vbGRfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSkpIHsKKwkJYWNjID0gMTsKKwkJYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgPSBub3c7CisJfQorCWVsc2UgaWYgKHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyNSkpKQorCQlhY2MgPSBhY2NlbFswXTsKKwllbHNlIGlmICh0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmFjY19qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyNTApKSkKKwkJYWNjID0gYWNjZWxbMV07CisJZWxzZSBpZiAodGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5hY2NfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSkpCisJCWFjYyA9IGFjY2VsWzJdOworCWVsc2UgaWYgKHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApKSkKKwkJYWNjID0gYWNjZWxbM107CisJZWxzZSBpZiAodGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5hY2NfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTUwMCkpKQorCQlhY2MgPSBhY2NlbFs0XTsKKwllbHNlIGlmICh0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmFjY19qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKSkpCisJCWFjYyA9IGFjY2VsWzVdOworCWVsc2UKKwkJYWNjID0gYWNjZWxbNl07CisKKwlyZXR1cm4gYWNjOworfQorCisvKgorICoJYXRpX3JlbW90ZV9yZXBvcnRfaW5wdXQKKyAqLworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pbnB1dF9yZXBvcnQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmRhdGE9IGF0aV9yZW1vdGUtPmluYnVmOworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGF0aV9yZW1vdGUtPmlkZXY7CisJaW50IGluZGV4ID0gLTE7CisJaW50IGFjYzsKKwlpbnQgcmVtb3RlX251bTsKKwl1bnNpZ25lZCBjaGFyIHNjYW5jb2RlWzJdOworCisJLyogRGVhbCB3aXRoIHN0cmFuZ2UgbG9va2luZyBpbnB1dHMgKi8KKwlpZiAoICh1cmItPmFjdHVhbF9sZW5ndGggIT0gNCkgfHwgKGRhdGFbMF0gIT0gMHgxNCkgfHwKKwkJKChkYXRhWzNdICYgMHgwZikgIT0gMHgwMCkgKSB7CisJCWF0aV9yZW1vdGVfZHVtcCgmdXJiLT5kZXYtPmRldiwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1hc2sgdW53YW50ZWQgcmVtb3RlIGNoYW5uZWxzLiAgKi8KKwkvKiBub3RlOiByZW1vdGVfbnVtIGlzIDAtYmFzZWQsIGNoYW5uZWwgMSBvbiByZW1vdGUgPT0gMCBoZXJlICovCisJcmVtb3RlX251bSA9IChkYXRhWzNdID4+IDQpICYgMHgwZjsKKwlpZiAoY2hhbm5lbF9tYXNrICYgKDEgPDwgKHJlbW90ZV9udW0gKyAxKSkpIHsKKwkJZGJnaW5mbygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCisJCQkiTWFza2VkIGlucHV0IGZyb20gY2hhbm5lbCAweCUwMng6IGRhdGEgJTAyeCwlMDJ4LCBtYXNrPSAweCUwMmx4XG4iLAorCQkJcmVtb3RlX251bSwgZGF0YVsxXSwgZGF0YVsyXSwgY2hhbm5lbF9tYXNrKTsKKwkJcmV0dXJuOworCX0KKworCXNjYW5jb2RlWzBdID0gKCgoZGF0YVsxXSAtICgocmVtb3RlX251bSArIDEpIDw8IDQpKSAmIDB4ZjApIHwgKGRhdGFbMV0gJiAweDBmKSk7CisKKwkvKgorCSAqIFNvbWUgZGV2aWNlcyAoZS5nLiBTbmFwU3RyZWFtIEZpcmVmbHkpIHVzZSA4MDgwIGFzIHRvZ2dsZSBjb2RlLAorCSAqIHNvIHdlIGhhdmUgdG8gY2xlYXIgdGhlbS4gVGhlIGZpcnN0IGJpdCBpcyBhIGJpdCB0cmlja3kgYXMgdGhlCisJICogIm5vbi10b2dnbGVkIiBzdGF0ZSBkZXBlbmRzIG9uIHJlbW90ZV9udW0sIHNvIHdlIHhvciBpdCB3aXRoIHRoZQorCSAqIHNlY29uZCBiaXQgd2hpY2ggaXMgb25seSB1c2VkIGZvciB0b2dnbGUuCisJICovCisJc2NhbmNvZGVbMF0gXj0gKGRhdGFbMl0gJiAweDgwKTsKKworCXNjYW5jb2RlWzFdID0gZGF0YVsyXSAmIH4weDgwOworCisJLyogTG9vayB1cCBldmVudCBjb2RlIGluZGV4IGluIG1vdXNlIHRyYW5zbGF0aW9uIHRhYmxlLiAqLworCWluZGV4ID0gYXRpX3JlbW90ZV9ldmVudF9sb29rdXAocmVtb3RlX251bSwgc2NhbmNvZGVbMF0sIHNjYW5jb2RlWzFdKTsKKworCWlmIChpbmRleCA+PSAwKSB7CisJCWRiZ2luZm8oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAorCQkJImNoYW5uZWwgMHglMDJ4OyBtb3VzZSBkYXRhICUwMngsJTAyeDsgaW5kZXggJWQ7IGtleWNvZGUgJWRcbiIsCisJCQlyZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdLCBpbmRleCwgYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUpOworCQlpZiAoIWRldikKKwkJCXJldHVybjsgLyogbm8gbW91c2UgZGV2aWNlICovCisJfSBlbHNlCisJCWRiZ2luZm8oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAorCQkJImNoYW5uZWwgMHglMDJ4OyBrZXkgZGF0YSAlMDJ4LCUwMngsIHNjYW5jb2RlICUwMngsJTAyeFxuIiwKKwkJCXJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0sIHNjYW5jb2RlWzBdLCBzY2FuY29kZVsxXSk7CisKKworCWlmIChpbmRleCA+PSAwICYmIGF0aV9yZW1vdGVfdGJsW2luZGV4XS5raW5kID09IEtJTkRfTElURVJBTCkgeworCQlpbnB1dF9ldmVudChkZXYsIGF0aV9yZW1vdGVfdGJsW2luZGV4XS50eXBlLAorCQkJYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUsCisJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0udmFsdWUpOworCQlpbnB1dF9zeW5jKGRldik7CisKKwkJYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgPSBqaWZmaWVzOworCQlyZXR1cm47CisJfQorCisJaWYgKGluZGV4IDwgMCB8fCBhdGlfcmVtb3RlX3RibFtpbmRleF0ua2luZCA9PSBLSU5EX0ZJTFRFUkVEKSB7CisJCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKworCQkvKiBGaWx0ZXIgZHVwbGljYXRlIGV2ZW50cyB3aGljaCBoYXBwZW4gInRvbyBjbG9zZSIgdG9nZXRoZXIuICovCisJCWlmIChhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9PSBkYXRhWzFdICYmCisJCSAgICBhdGlfcmVtb3RlLT5vbGRfZGF0YVsxXSA9PSBkYXRhWzJdICYmCisJCSAgICB0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPm9sZF9qaWZmaWVzICsKKwkJCQkgICAgIG1zZWNzX3RvX2ppZmZpZXMocmVwZWF0X2ZpbHRlcikpKSB7CisJCQlhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCWF0aV9yZW1vdGUtPnJlcGVhdF9jb3VudCA9IDA7CisJCQlhdGlfcmVtb3RlLT5maXJzdF9qaWZmaWVzID0gbm93OworCQl9CisKKwkJYXRpX3JlbW90ZS0+b2xkX2RhdGFbMF0gPSBkYXRhWzFdOworCQlhdGlfcmVtb3RlLT5vbGRfZGF0YVsxXSA9IGRhdGFbMl07CisJCWF0aV9yZW1vdGUtPm9sZF9qaWZmaWVzID0gbm93OworCisJCS8qIEVuc3VyZSB3ZSBza2lwIGF0IGxlYXN0IHRoZSA0IGZpcnN0IGR1cGxpY2F0ZSBldmVudHMgKGdlbmVyYXRlZAorCQkgKiBieSBhIHNpbmdsZSBrZXlwcmVzcyksIGFuZCBjb250aW51ZSBza2lwcGluZyB1bnRpbCByZXBlYXRfZGVsYXkKKwkJICogbXNlY3MgaGF2ZSBwYXNzZWQKKwkJICovCisJCWlmIChhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQgPiAwICYmCisJCSAgICAoYXRpX3JlbW90ZS0+cmVwZWF0X2NvdW50IDwgNSB8fAorCQkgICAgIHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+Zmlyc3RfamlmZmllcyArCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhyZXBlYXRfZGVsYXkpKSkpCisJCQlyZXR1cm47CisKKwkJaWYgKGluZGV4IDwgMCkgeworCQkJLyogTm90IGEgbW91c2UgZXZlbnQsIGhhbmQgaXQgdG8gcmMtY29yZS4gKi8KKwkJCXUzMiByY19jb2RlID0gKHNjYW5jb2RlWzBdIDw8IDgpIHwgc2NhbmNvZGVbMV07CisKKwkJCS8qCisJCQkgKiBXZSBkb24ndCB1c2UgdGhlIHJjLWNvcmUgcmVwZWF0IGhhbmRsaW5nIHlldCBhcworCQkJICogaXQgd291bGQgY2F1c2UgZ2hvc3QgcmVwZWF0cyB3aGljaCB3b3VsZCBiZSBhCisJCQkgKiByZWdyZXNzaW9uIGZvciB0aGlzIGRyaXZlci4KKwkJCSAqLworCQkJcmNfa2V5ZG93bl9ub3RpbWVvdXQoYXRpX3JlbW90ZS0+cmRldiwgcmNfY29kZSwKKwkJCQkJICAgICBkYXRhWzJdKTsKKwkJCXJjX2tleXVwKGF0aV9yZW1vdGUtPnJkZXYpOworCQkJcmV0dXJuOworCQl9CisKKwkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKKwkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5jb2RlLCAxKTsKKwkJaW5wdXRfc3luYyhkZXYpOworCQlpbnB1dF9ldmVudChkZXYsIGF0aV9yZW1vdGVfdGJsW2luZGV4XS50eXBlLAorCQkJYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUsIDApOworCQlpbnB1dF9zeW5jKGRldik7CisKKwl9IGVsc2UgeworCisJCS8qCisJCSAqIE90aGVyIGV2ZW50IGtpbmRzIGFyZSBmcm9tIHRoZSBkaXJlY3Rpb25hbCBjb250cm9sIHBhZCwgYW5kIGhhdmUgYW4KKwkJICogYWNjZWxlcmF0aW9uIGZhY3RvciBhcHBsaWVkIHRvIHRoZW0uICBXaXRob3V0IHRoaXMgYWNjZWxlcmF0aW9uLCB0aGUKKwkJICogY29udHJvbCBwYWQgaXMgbW9zdGx5IHVudXNhYmxlLgorCQkgKi8KKwkJYWNjID0gYXRpX3JlbW90ZV9jb21wdXRlX2FjY2VsKGF0aV9yZW1vdGUpOworCisJCXN3aXRjaCAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQpIHsKKwkJY2FzZSBLSU5EX0FDQ0VMOgorCQkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKKwkJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSwKKwkJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0udmFsdWUgKiBhY2MpOworCQkJYnJlYWs7CisJCWNhc2UgS0lORF9MVToKKwkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgLWFjYyk7CisJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksIC1hY2MpOworCQkJYnJlYWs7CisJCWNhc2UgS0lORF9SVToKKwkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgYWNjKTsKKwkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWSwgLWFjYyk7CisJCQlicmVhazsKKwkJY2FzZSBLSU5EX0xEOgorCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9YLCAtYWNjKTsKKwkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWSwgYWNjKTsKKwkJCWJyZWFrOworCQljYXNlIEtJTkRfUkQ6CisJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsIGFjYyk7CisJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksIGFjYyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiYXRpX3JlbW90ZSBraW5kPSVkXG4iLAorCQkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5raW5kKTsKKwkJfQorCQlpbnB1dF9zeW5jKGRldik7CisKKwkJYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgPSBqaWZmaWVzOworCQlhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9IGRhdGFbMV07CisJCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzFdID0gZGF0YVsyXTsKKwl9Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2lycV9pbgorICovCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lycV9pbihzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSB1cmItPmNvbnRleHQ7CisJaW50IHJldHZhbDsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CQkJLyogc3VjY2VzcyAqLworCQlhdGlfcmVtb3RlX2lucHV0X3JlcG9ydCh1cmIpOworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiB1cmIgZXJyb3Igc3RhdHVzLCB1bmxpbms/IFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CQkvKiBlcnJvciAqLworCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBOb256ZXJvIHVyYiBzdGF0dXMgJWRcbiIsCisJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCX0KKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCkKKwkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsICIlczogdXNiX3N1Ym1pdF91cmIoKT0lZFxuIiwKKwkJCV9fZnVuY19fLCByZXR2YWwpOworfQorCisvKgorICoJYXRpX3JlbW90ZV9hbGxvY19idWZmZXJzCisgKi8KK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQkJCSAgICBzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKK3sKKwlhdGlfcmVtb3RlLT5pbmJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudCh1ZGV2LCBEQVRBX0JVRlNJWkUsIEdGUF9BVE9NSUMsCisJCQkJCSAgICAgICAmYXRpX3JlbW90ZS0+aW5idWZfZG1hKTsKKwlpZiAoIWF0aV9yZW1vdGUtPmluYnVmKQorCQlyZXR1cm4gLTE7CisKKwlhdGlfcmVtb3RlLT5vdXRidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQodWRldiwgREFUQV9CVUZTSVpFLCBHRlBfQVRPTUlDLAorCQkJCQkJJmF0aV9yZW1vdGUtPm91dGJ1Zl9kbWEpOworCWlmICghYXRpX3JlbW90ZS0+b3V0YnVmKQorCQlyZXR1cm4gLTE7CisKKwlhdGlfcmVtb3RlLT5pcnFfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF0aV9yZW1vdGUtPmlycV91cmIpCisJCXJldHVybiAtMTsKKworCWF0aV9yZW1vdGUtPm91dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghYXRpX3JlbW90ZS0+b3V0X3VyYikKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2ZyZWVfYnVmZmVycworICovCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKK3sKKwl1c2JfZnJlZV91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYik7CisJdXNiX2ZyZWVfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIpOworCisJdXNiX2ZyZWVfY29oZXJlbnQoYXRpX3JlbW90ZS0+dWRldiwgREFUQV9CVUZTSVpFLAorCQlhdGlfcmVtb3RlLT5pbmJ1ZiwgYXRpX3JlbW90ZS0+aW5idWZfZG1hKTsKKworCXVzYl9mcmVlX2NvaGVyZW50KGF0aV9yZW1vdGUtPnVkZXYsIERBVEFfQlVGU0laRSwKKwkJYXRpX3JlbW90ZS0+b3V0YnVmLCBhdGlfcmVtb3RlLT5vdXRidWZfZG1hKTsKK30KKworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pbnB1dF9pbml0KHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXYgPSBhdGlfcmVtb3RlLT5pZGV2OworCWludCBpOworCisJaWRldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfUkVMKTsKKwlpZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01PVVNFKV0gPSBCSVRfTUFTSyhCVE5fTEVGVCkgfAorCQlCSVRfTUFTSyhCVE5fUklHSFQpIHwgQklUX01BU0soQlROX1NJREUpIHwgQklUX01BU0soQlROX0VYVFJBKTsKKwlpZGV2LT5yZWxiaXRbMF0gPSBCSVRfTUFTSyhSRUxfWCkgfCBCSVRfTUFTSyhSRUxfWSk7CisJZm9yIChpID0gMDsgYXRpX3JlbW90ZV90YmxbaV0ua2luZCAhPSBLSU5EX0VORDsgaSsrKQorCQlpZiAoYXRpX3JlbW90ZV90YmxbaV0udHlwZSA9PSBFVl9LRVkpCisJCQlzZXRfYml0KGF0aV9yZW1vdGVfdGJsW2ldLmNvZGUsIGlkZXYtPmtleWJpdCk7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpZGV2LCBhdGlfcmVtb3RlKTsKKworCWlkZXYtPm9wZW4gPSBhdGlfcmVtb3RlX2lucHV0X29wZW47CisJaWRldi0+Y2xvc2UgPSBhdGlfcmVtb3RlX2lucHV0X2Nsb3NlOworCisJaWRldi0+bmFtZSA9IGF0aV9yZW1vdGUtPm1vdXNlX25hbWU7CisJaWRldi0+cGh5cyA9IGF0aV9yZW1vdGUtPm1vdXNlX3BoeXM7CisKKwl1c2JfdG9faW5wdXRfaWQoYXRpX3JlbW90ZS0+dWRldiwgJmlkZXYtPmlkKTsKKwlpZGV2LT5kZXYucGFyZW50ID0gJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2OworfQorCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX3JjX2luaXQoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCit7CisJc3RydWN0IHJjX2RldiAqcmRldiA9IGF0aV9yZW1vdGUtPnJkZXY7CisKKwlyZGV2LT5wcml2ID0gYXRpX3JlbW90ZTsKKwlyZGV2LT5kcml2ZXJfdHlwZSA9IFJDX0RSSVZFUl9TQ0FOQ09ERTsKKwlyZGV2LT5hbGxvd2VkX3Byb3RvcyA9IFJDX1RZUEVfT1RIRVI7CisJcmRldi0+ZHJpdmVyX25hbWUgPSAiYXRpX3JlbW90ZSI7CisKKwlyZGV2LT5vcGVuID0gYXRpX3JlbW90ZV9yY19vcGVuOworCXJkZXYtPmNsb3NlID0gYXRpX3JlbW90ZV9yY19jbG9zZTsKKworCXJkZXYtPmlucHV0X25hbWUgPSBhdGlfcmVtb3RlLT5yY19uYW1lOworCXJkZXYtPmlucHV0X3BoeXMgPSBhdGlfcmVtb3RlLT5yY19waHlzOworCisJdXNiX3RvX2lucHV0X2lkKGF0aV9yZW1vdGUtPnVkZXYsICZyZGV2LT5pbnB1dF9pZCk7CisJcmRldi0+ZGV2LnBhcmVudCA9ICZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldjsKK30KKworc3RhdGljIGludCBhdGlfcmVtb3RlX2luaXRpYWxpemUoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBhdGlfcmVtb3RlLT51ZGV2OworCWludCBwaXBlLCBtYXhwOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXRpX3JlbW90ZS0+d2FpdCk7CisKKwkvKiBTZXQgdXAgaXJxX3VyYiAqLworCXBpcGUgPSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBhdGlfcmVtb3RlLT5lbmRwb2ludF9pbi0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCW1heHAgPSAobWF4cCA+IERBVEFfQlVGU0laRSkgPyBEQVRBX0JVRlNJWkUgOiBtYXhwOworCisJdXNiX2ZpbGxfaW50X3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiLCB1ZGV2LCBwaXBlLCBhdGlfcmVtb3RlLT5pbmJ1ZiwKKwkJCSBtYXhwLCBhdGlfcmVtb3RlX2lycV9pbiwgYXRpX3JlbW90ZSwKKwkJCSBhdGlfcmVtb3RlLT5lbmRwb2ludF9pbi0+YkludGVydmFsKTsKKwlhdGlfcmVtb3RlLT5pcnFfdXJiLT50cmFuc2Zlcl9kbWEgPSBhdGlfcmVtb3RlLT5pbmJ1Zl9kbWE7CisJYXRpX3JlbW90ZS0+aXJxX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwkvKiBTZXQgdXAgb3V0X3VyYiAqLworCXBpcGUgPSB1c2Jfc25kaW50cGlwZSh1ZGV2LCBhdGlfcmVtb3RlLT5lbmRwb2ludF9vdXQtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKwltYXhwID0gKG1heHAgPiBEQVRBX0JVRlNJWkUpID8gREFUQV9CVUZTSVpFIDogbWF4cDsKKworCXVzYl9maWxsX2ludF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYiwgdWRldiwgcGlwZSwgYXRpX3JlbW90ZS0+b3V0YnVmLAorCQkJIG1heHAsIGF0aV9yZW1vdGVfaXJxX291dCwgYXRpX3JlbW90ZSwKKwkJCSBhdGlfcmVtb3RlLT5lbmRwb2ludF9vdXQtPmJJbnRlcnZhbCk7CisJYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfZG1hID0gYXRpX3JlbW90ZS0+b3V0YnVmX2RtYTsKKwlhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCS8qIHNlbmQgaW5pdGlhbGl6YXRpb24gc3RyaW5ncyAqLworCWlmICgoYXRpX3JlbW90ZV9zZW5kcGFja2V0KGF0aV9yZW1vdGUsIDB4ODAwNCwgaW5pdDEpKSB8fAorCSAgICAoYXRpX3JlbW90ZV9zZW5kcGFja2V0KGF0aV9yZW1vdGUsIDB4ODAwNywgaW5pdDIpKSkgeworCQlkZXZfZXJyKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKKwkJCSAiSW5pdGlhbGl6aW5nIGF0aV9yZW1vdGUgaGFyZHdhcmUgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICoJYXRpX3JlbW90ZV9wcm9iZQorICovCitzdGF0aWMgaW50IGF0aV9yZW1vdGVfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2hvc3QgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnRfaW4sICplbmRwb2ludF9vdXQ7CisJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGU7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXN0cnVjdCByY19kZXYgKnJjX2RldjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCWlmIChpZmFjZV9ob3N0LT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMikgeworCQllcnIoIiVzOiBVbmV4cGVjdGVkIGRlc2MuYk51bUVuZHBvaW50c1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllbmRwb2ludF9pbiA9ICZpZmFjZV9ob3N0LT5lbmRwb2ludFswXS5kZXNjOworCWVuZHBvaW50X291dCA9ICZpZmFjZV9ob3N0LT5lbmRwb2ludFsxXS5kZXNjOworCisJaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50X2luKSkgeworCQllcnIoIiVzOiBVbmV4cGVjdGVkIGVuZHBvaW50X2luXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAobGUxNl90b19jcHUoZW5kcG9pbnRfaW4tPndNYXhQYWNrZXRTaXplKSA9PSAwKSB7CisJCWVycigiJXM6IGVuZHBvaW50X2luIG1lc3NhZ2Ugc2l6ZT09MD8gXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWF0aV9yZW1vdGUgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IGF0aV9yZW1vdGUpLCBHRlBfS0VSTkVMKTsKKwlyY19kZXYgPSByY19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWF0aV9yZW1vdGUgfHwgIXJjX2RldikKKwkJZ290byBmYWlsMTsKKworCS8qIEFsbG9jYXRlIFVSQiBidWZmZXJzLCBVUkJzICovCisJaWYgKGF0aV9yZW1vdGVfYWxsb2NfYnVmZmVycyh1ZGV2LCBhdGlfcmVtb3RlKSkKKwkJZ290byBmYWlsMjsKKworCWF0aV9yZW1vdGUtPmVuZHBvaW50X2luID0gZW5kcG9pbnRfaW47CisJYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0ID0gZW5kcG9pbnRfb3V0OworCWF0aV9yZW1vdGUtPnVkZXYgPSB1ZGV2OworCWF0aV9yZW1vdGUtPnJkZXYgPSByY19kZXY7CisJYXRpX3JlbW90ZS0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCisJdXNiX21ha2VfcGF0aCh1ZGV2LCBhdGlfcmVtb3RlLT5yY19waHlzLCBzaXplb2YoYXRpX3JlbW90ZS0+cmNfcGh5cykpOworCXN0cmxjcHkoYXRpX3JlbW90ZS0+bW91c2VfcGh5cywgYXRpX3JlbW90ZS0+cmNfcGh5cywKKwkJc2l6ZW9mKGF0aV9yZW1vdGUtPm1vdXNlX3BoeXMpKTsKKworCXN0cmxjYXQoYXRpX3JlbW90ZS0+cmNfcGh5cywgIi9pbnB1dDAiLCBzaXplb2YoYXRpX3JlbW90ZS0+cmNfcGh5cykpOworCXN0cmxjYXQoYXRpX3JlbW90ZS0+bW91c2VfcGh5cywgIi9pbnB1dDEiLCBzaXplb2YoYXRpX3JlbW90ZS0+bW91c2VfcGh5cykpOworCisJaWYgKHVkZXYtPm1hbnVmYWN0dXJlcikKKwkJc3RybGNweShhdGlfcmVtb3RlLT5yY19uYW1lLCB1ZGV2LT5tYW51ZmFjdHVyZXIsCisJCQlzaXplb2YoYXRpX3JlbW90ZS0+cmNfbmFtZSkpOworCisJaWYgKHVkZXYtPnByb2R1Y3QpCisJCXNucHJpbnRmKGF0aV9yZW1vdGUtPnJjX25hbWUsIHNpemVvZihhdGlfcmVtb3RlLT5yY19uYW1lKSwKKwkJCSAiJXMgJXMiLCBhdGlfcmVtb3RlLT5yY19uYW1lLCB1ZGV2LT5wcm9kdWN0KTsKKworCWlmICghc3RybGVuKGF0aV9yZW1vdGUtPnJjX25hbWUpKQorCQlzbnByaW50ZihhdGlfcmVtb3RlLT5yY19uYW1lLCBzaXplb2YoYXRpX3JlbW90ZS0+cmNfbmFtZSksCisJCQlEUklWRVJfREVTQyAiKCUwNHgsJTA0eCkiLAorCQkJbGUxNl90b19jcHUoYXRpX3JlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCQlsZTE2X3RvX2NwdShhdGlfcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOworCisJc25wcmludGYoYXRpX3JlbW90ZS0+bW91c2VfbmFtZSwgc2l6ZW9mKGF0aV9yZW1vdGUtPm1vdXNlX25hbWUpLAorCQkgIiVzIG1vdXNlIiwgYXRpX3JlbW90ZS0+cmNfbmFtZSk7CisKKwlpZiAoaWQtPmRyaXZlcl9pbmZvKQorCQlyY19kZXYtPm1hcF9uYW1lID0gKGNvbnN0IGNoYXIgKilpZC0+ZHJpdmVyX2luZm87CisJZWxzZQorCQlyY19kZXYtPm1hcF9uYW1lID0gUkNfTUFQX0FUSV9YMTA7CisKKwlhdGlfcmVtb3RlX3JjX2luaXQoYXRpX3JlbW90ZSk7CisJbXV0ZXhfaW5pdCgmYXRpX3JlbW90ZS0+b3Blbl9tdXRleCk7CisKKwkvKiBEZXZpY2UgSGFyZHdhcmUgSW5pdGlhbGl6YXRpb24gLSBmaWxscyBpbiBhdGlfcmVtb3RlLT5pZGV2IGZyb20gdWRldi4gKi8KKwllcnIgPSBhdGlfcmVtb3RlX2luaXRpYWxpemUoYXRpX3JlbW90ZSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsMzsKKworCS8qIFNldCB1cCBhbmQgcmVnaXN0ZXIgcmMgZGV2aWNlICovCisJZXJyID0gcmNfcmVnaXN0ZXJfZGV2aWNlKGF0aV9yZW1vdGUtPnJkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKKwkvKiB1c2Ugb3VyIGRlbGF5IGZvciByY19kZXYgKi8KKwlhdGlfcmVtb3RlLT5yZGV2LT5pbnB1dF9kZXYtPnJlcFtSRVBfREVMQVldID0gcmVwZWF0X2RlbGF5OworCisJLyogU2V0IHVwIGFuZCByZWdpc3RlciBtb3VzZSBpbnB1dCBkZXZpY2UgKi8KKwlpZiAobW91c2UpIHsKKwkJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJCWlmICghaW5wdXRfZGV2KQorCQkJZ290byBmYWlsNDsKKworCQlhdGlfcmVtb3RlLT5pZGV2ID0gaW5wdXRfZGV2OworCQlhdGlfcmVtb3RlX2lucHV0X2luaXQoYXRpX3JlbW90ZSk7CisJCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWw1OworCX0KKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBhdGlfcmVtb3RlKTsKKwlyZXR1cm4gMDsKKworIGZhaWw1OglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworIGZhaWw0OglyY191bnJlZ2lzdGVyX2RldmljZShyY19kZXYpOworCXJjX2RldiA9IE5VTEw7CisgZmFpbDM6CXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiKTsKKwl1c2Jfa2lsbF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYik7CisgZmFpbDI6CWF0aV9yZW1vdGVfZnJlZV9idWZmZXJzKGF0aV9yZW1vdGUpOworIGZhaWwxOglyY19mcmVlX2RldmljZShyY19kZXYpOworCWtmcmVlKGF0aV9yZW1vdGUpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2Rpc2Nvbm5lY3QKKyAqLworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGU7CisKKwlhdGlfcmVtb3RlID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwlpZiAoIWF0aV9yZW1vdGUpIHsKKwkJZGV2X3dhcm4oJmludGVyZmFjZS0+ZGV2LCAiJXMgLSBudWxsIGRldmljZT9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiKTsKKwl1c2Jfa2lsbF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYik7CisJaWYgKGF0aV9yZW1vdGUtPmlkZXYpCisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGF0aV9yZW1vdGUtPmlkZXYpOworCXJjX3VucmVnaXN0ZXJfZGV2aWNlKGF0aV9yZW1vdGUtPnJkZXYpOworCWF0aV9yZW1vdGVfZnJlZV9idWZmZXJzKGF0aV9yZW1vdGUpOworCWtmcmVlKGF0aV9yZW1vdGUpOworfQorCisvKgorICoJYXRpX3JlbW90ZV9pbml0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGF0aV9yZW1vdGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmF0aV9yZW1vdGVfZHJpdmVyKTsKKwlpZiAocmVzdWx0KQorCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUKKwkJICAgICAgICI6IHVzYl9yZWdpc3RlciBlcnJvciAjJWRcbiIsIHJlc3VsdCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiCisJCSAgICAgICBEUklWRVJfREVTQyAiXG4iKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGF0aV9yZW1vdGVfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZhdGlfcmVtb3RlX2RyaXZlcik7Cit9CisKKy8qCisgKgltb2R1bGUgc3BlY2lmaWNhdGlvbgorICovCisKK21vZHVsZV9pbml0KGF0aV9yZW1vdGVfaW5pdCk7Cittb2R1bGVfZXhpdChhdGlfcmVtb3RlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5jCmluZGV4IDJiOWMyNTY5Li5jZjEwZWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMKQEAgLTMwLDYgKzMwLDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CkBAIC0xMTgsMzEgKzEyMCwzMSBAQAogCQkJZGV2LT5wbGxfZnJlcSA9PSBFTkVfREVGQVVMVF9QTExfRlJFUSA/IDIgOiA0OwogCiAJaWYgKGh3X3JldmlzaW9uID09IDB4RkYpIHsKLQkJZW5lX3dhcm4oImRldmljZSBzZWVtcyB0byBiZSBkaXNhYmxlZCIpOwotCQllbmVfd2Fybigic2VuZCBhIG1haWwgdG8gbGlyYy1saXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCIpOwotCQllbmVfd2FybigicGxlYXNlIGF0dGFjaCBvdXRwdXQgb2YgYWNwaWR1bXAgYW5kIGRtaWRlY29kZSIpOworCQlwcl93YXJuKCJkZXZpY2Ugc2VlbXMgdG8gYmUgZGlzYWJsZWRcbiIpOworCQlwcl93YXJuKCJzZW5kIGEgbWFpbCB0byBsaXJjLWxpc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0XG4iKTsKKwkJcHJfd2FybigicGxlYXNlIGF0dGFjaCBvdXRwdXQgb2YgYWNwaWR1bXAgYW5kIGRtaWRlY29kZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVuZV9ub3RpY2UoImNoaXAgaXMgMHglMDJ4JTAyeCAtIGtidmVyID0gMHglMDJ4LCByZXYgPSAweCUwMngiLAotCQljaGlwX21ham9yLCBjaGlwX21pbm9yLCBvbGRfdmVyLCBod19yZXZpc2lvbik7CisJcHJfbm90aWNlKCJjaGlwIGlzIDB4JTAyeCUwMnggLSBrYnZlciA9IDB4JTAyeCwgcmV2ID0gMHglMDJ4XG4iLAorCQkgIGNoaXBfbWFqb3IsIGNoaXBfbWlub3IsIG9sZF92ZXIsIGh3X3JldmlzaW9uKTsKIAotCWVuZV9ub3RpY2UoIlBMTCBmcmVxID0gJWQiLCBkZXYtPnBsbF9mcmVxKTsKKwlwcl9ub3RpY2UoIlBMTCBmcmVxID0gJWRcbiIsIGRldi0+cGxsX2ZyZXEpOwogCiAJaWYgKGNoaXBfbWFqb3IgPT0gMHgzMykgewotCQllbmVfd2FybigiY2hpcHMgMHgzM3h4IGFyZW4ndCBzdXBwb3J0ZWQiKTsKKwkJcHJfd2FybigiY2hpcHMgMHgzM3h4IGFyZW4ndCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoY2hpcF9tYWpvciA9PSAweDM5ICYmIGNoaXBfbWlub3IgPT0gMHgyNiAmJiBod19yZXZpc2lvbiA9PSAweEMwKSB7CiAJCWRldi0+aHdfcmV2aXNpb24gPSBFTkVfSFdfQzsKLQkJZW5lX25vdGljZSgiS0IzOTI2QyBkZXRlY3RlZCIpOworCQlwcl9ub3RpY2UoIktCMzkyNkMgZGV0ZWN0ZWRcbiIpOwogCX0gZWxzZSBpZiAob2xkX3ZlciA9PSAweDI0ICYmIGh3X3JldmlzaW9uID09IDB4QzApIHsKIAkJZGV2LT5od19yZXZpc2lvbiA9IEVORV9IV19COwotCQllbmVfbm90aWNlKCJLQjM5MjZCIGRldGVjdGVkIik7CisJCXByX25vdGljZSgiS0IzOTI2QiBkZXRlY3RlZFxuIik7CiAJfSBlbHNlIHsKIAkJZGV2LT5od19yZXZpc2lvbiA9IEVORV9IV19EOwotCQllbmVfbm90aWNlKCJLQjM5MjZEIG9yIGhpZ2hlciBkZXRlY3RlZCIpOworCQlwcl9ub3RpY2UoIktCMzkyNkQgb3IgaGlnaGVyIGRldGVjdGVkXG4iKTsKIAl9CiAKIAkvKiBkZXRlY3QgZmVhdHVyZXMgaGFyZHdhcmUgc3VwcG9ydHMgKi8KQEAgLTE1Miw3ICsxNTQsNyBAQAogCWZ3X3JlZzEgPSBlbmVfcmVhZF9yZWcoZGV2LCBFTkVfRlcxKTsKIAlmd19yZWcyID0gZW5lX3JlYWRfcmVnKGRldiwgRU5FX0ZXMik7CiAKLQllbmVfbm90aWNlKCJGaXJtd2FyZSByZWdzOiAlMDJ4ICUwMngiLCBmd19yZWcxLCBmd19yZWcyKTsKKwlwcl9ub3RpY2UoIkZpcm13YXJlIHJlZ3M6ICUwMnggJTAyeFxuIiwgZndfcmVnMSwgZndfcmVnMik7CiAKIAlkZXYtPmh3X3VzZV9ncGlvXzBhID0gISEoZndfcmVnMiAmIEVORV9GVzJfR1AwQSk7CiAJZGV2LT5od19sZWFybmluZ19hbmRfdHhfY2FwYWJsZSA9ICEhKGZ3X3JlZzIgJiBFTkVfRlcyX0xFQVJOSU5HKTsKQEAgLTE2MSwzMCArMTYzLDI5IEBACiAJaWYgKGRldi0+aHdfbGVhcm5pbmdfYW5kX3R4X2NhcGFibGUpCiAJCWRldi0+aHdfZmFuX2lucHV0ID0gISEoZndfcmVnMiAmIEVORV9GVzJfRkFOX0lOUFVUKTsKIAotCWVuZV9ub3RpY2UoIkhhcmR3YXJlIGZlYXR1cmVzOiIpOworCXByX25vdGljZSgiSGFyZHdhcmUgZmVhdHVyZXM6XG4iKTsKIAogCWlmIChkZXYtPmh3X2xlYXJuaW5nX2FuZF90eF9jYXBhYmxlKSB7Ci0JCWVuZV9ub3RpY2UoIiogU3VwcG9ydHMgdHJhbnNtaXR0aW5nICYgbGVhcm5pbmcgbW9kZSIpOwotCQllbmVfbm90aWNlKCIgICBUaGlzIGZlYXR1cmUgaXMgcmFyZSBhbmQgdGhlcmVmb3JlLCIpOwotCQllbmVfbm90aWNlKCIgICB5b3UgYXJlIHdlbGNvbWUgdG8gdGVzdCBpdCwiKTsKLQkJZW5lX25vdGljZSgiICAgYW5kL29yIGNvbnRhY3QgdGhlIGF1dGhvciB2aWE6Iik7Ci0JCWVuZV9ub3RpY2UoIiAgIGxpcmMtbGlzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiKTsKLQkJZW5lX25vdGljZSgiICAgb3IgbWF4aW1sZXZpdHNreUBnbWFpbC5jb20iKTsKKwkJcHJfbm90aWNlKCIqIFN1cHBvcnRzIHRyYW5zbWl0dGluZyAmIGxlYXJuaW5nIG1vZGVcbiIpOworCQlwcl9ub3RpY2UoIiAgIFRoaXMgZmVhdHVyZSBpcyByYXJlIGFuZCB0aGVyZWZvcmUsXG4iKTsKKwkJcHJfbm90aWNlKCIgICB5b3UgYXJlIHdlbGNvbWUgdG8gdGVzdCBpdCxcbiIpOworCQlwcl9ub3RpY2UoIiAgIGFuZC9vciBjb250YWN0IHRoZSBhdXRob3IgdmlhOlxuIik7CisJCXByX25vdGljZSgiICAgbGlyYy1saXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldFxuIik7CisJCXByX25vdGljZSgiICAgb3IgbWF4aW1sZXZpdHNreUBnbWFpbC5jb21cbiIpOwogCi0JCWVuZV9ub3RpY2UoIiogVXNlcyBHUElPICVzIGZvciBJUiByYXcgaW5wdXQiLAotCQkJZGV2LT5od191c2VfZ3Bpb18wYSA/ICI0MCIgOiAiMEEiKTsKKwkJcHJfbm90aWNlKCIqIFVzZXMgR1BJTyAlcyBmb3IgSVIgcmF3IGlucHV0XG4iLAorCQkJICBkZXYtPmh3X3VzZV9ncGlvXzBhID8gIjQwIiA6ICIwQSIpOwogCiAJCWlmIChkZXYtPmh3X2Zhbl9pbnB1dCkKLQkJCWVuZV9ub3RpY2UoIiogVXNlcyB1bnVzZWQgZmFuIGZlZWRiYWNrIGlucHV0IGFzIHNvdXJjZSIKLQkJCQkJIiBvZiBkZW1vZHVsYXRlZCBJUiBkYXRhIik7CisJCQlwcl9ub3RpY2UoIiogVXNlcyB1bnVzZWQgZmFuIGZlZWRiYWNrIGlucHV0IGFzIHNvdXJjZSBvZiBkZW1vZHVsYXRlZCBJUiBkYXRhXG4iKTsKIAl9CiAKIAlpZiAoIWRldi0+aHdfZmFuX2lucHV0KQotCQllbmVfbm90aWNlKCIqIFVzZXMgR1BJTyAlcyBmb3IgSVIgZGVtb2R1bGF0ZWQgaW5wdXQiLAotCQkJZGV2LT5od191c2VfZ3Bpb18wYSA/ICIwQSIgOiAiNDAiKTsKKwkJcHJfbm90aWNlKCIqIFVzZXMgR1BJTyAlcyBmb3IgSVIgZGVtb2R1bGF0ZWQgaW5wdXRcbiIsCisJCQkgIGRldi0+aHdfdXNlX2dwaW9fMGEgPyAiMEEiIDogIjQwIik7CiAKIAlpZiAoZGV2LT5od19leHRyYV9idWZmZXIpCi0JCWVuZV9ub3RpY2UoIiogVXNlcyBuZXcgc3R5bGUgaW5wdXQgYnVmZmVyIik7CisJCXByX25vdGljZSgiKiBVc2VzIG5ldyBzdHlsZSBpbnB1dCBidWZmZXJcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTUsMTMgKzIxNiwxMyBAQAogCiAJZGV2LT5idWZmZXJfbGVuID0gZGV2LT5leHRyYV9idWYxX2xlbiArIGRldi0+ZXh0cmFfYnVmMl9sZW4gKyA4OwogCi0JZW5lX25vdGljZSgiSGFyZHdhcmUgdXNlcyAyIGV4dGVuZGVkIGJ1ZmZlcnM6Iik7Ci0JZW5lX25vdGljZSgiICAweCUwNHggLSBsZW4gOiAlZCIsIGRldi0+ZXh0cmFfYnVmMV9hZGRyZXNzLAotCQkJCQkJZGV2LT5leHRyYV9idWYxX2xlbik7Ci0JZW5lX25vdGljZSgiICAweCUwNHggLSBsZW4gOiAlZCIsIGRldi0+ZXh0cmFfYnVmMl9hZGRyZXNzLAotCQkJCQkJZGV2LT5leHRyYV9idWYyX2xlbik7CisJcHJfbm90aWNlKCJIYXJkd2FyZSB1c2VzIDIgZXh0ZW5kZWQgYnVmZmVyczpcbiIpOworCXByX25vdGljZSgiICAweCUwNHggLSBsZW4gOiAlZFxuIiwKKwkJICBkZXYtPmV4dHJhX2J1ZjFfYWRkcmVzcywgZGV2LT5leHRyYV9idWYxX2xlbik7CisJcHJfbm90aWNlKCIgIDB4JTA0eCAtIGxlbiA6ICVkXG4iLAorCQkgIGRldi0+ZXh0cmFfYnVmMl9hZGRyZXNzLCBkZXYtPmV4dHJhX2J1ZjJfbGVuKTsKIAotCWVuZV9ub3RpY2UoIlRvdGFsIGJ1ZmZlciBsZW4gPSAlZCIsIGRldi0+YnVmZmVyX2xlbik7CisJcHJfbm90aWNlKCJUb3RhbCBidWZmZXIgbGVuID0gJWRcbiIsIGRldi0+YnVmZmVyX2xlbik7CiAKIAlpZiAoZGV2LT5idWZmZXJfbGVuID4gNjQgfHwgZGV2LT5idWZmZXJfbGVuIDwgMTYpCiAJCWdvdG8gZXJyb3I7CkBAIC0yNDAsNyArMjQxLDcgQEAKIAllbmVfc2V0X3JlZ19tYXNrKGRldiwgRU5FX0ZXMSwgRU5FX0ZXMV9FWFRSQV9CVUZfSE5EKTsKIAlyZXR1cm47CiBlcnJvcjoKLQllbmVfd2FybigiRXJyb3IgdmFsaWRhdGluZyBleHRyYSBidWZmZXJzLCBkZXZpY2UgcHJvYmFibHkgd29uJ3Qgd29yayIpOworCXByX3dhcm4oIkVycm9yIHZhbGlkYXRpbmcgZXh0cmEgYnVmZmVycywgZGV2aWNlIHByb2JhYmx5IHdvbid0IHdvcmtcbiIpOwogCWRldi0+aHdfZXh0cmFfYnVmZmVyID0gZmFsc2U7CiAJZW5lX2NsZWFyX3JlZ19tYXNrKGRldiwgRU5FX0ZXMSwgRU5FX0ZXMV9FWFRSQV9CVUZfSE5EKTsKIH0KQEAgLTU4OCw3ICs1ODksNyBAQAogCQlkYmcoIlRYOiBUcmFuc21pdHRlciAjMiBpcyBjb25uZWN0ZWQiKTsKIAogCWlmICghKGZ3cmVnMiAmIChFTkVfRlcyX0VNTUlURVIxX0NPTk4gfCBFTkVfRlcyX0VNTUlURVIyX0NPTk4pKSkKLQkJZW5lX3dhcm4oIlRYOiB0cmFuc21pdHRlciBjYWJsZSBpc24ndCBjb25uZWN0ZWQhIik7CisJCXByX3dhcm4oIlRYOiB0cmFuc21pdHRlciBjYWJsZSBpc24ndCBjb25uZWN0ZWQhXG4iKTsKIAogCS8qIGRpc2FibGUgcmVjZWl2ZSBvbiByZXZjICovCiAJaWYgKGRldi0+aHdfcmV2aXNpb24gPT0gRU5FX0hXX0MpCkBAIC02MTUsNyArNjE2LDcgQEAKIAlib29sIHB1bHNlID0gZGV2LT50eF9zYW1wbGVfcHVsc2U7CiAKIAlpZiAoIWRldi0+dHhfYnVmZmVyKSB7Ci0JCWVuZV93YXJuKCJUWDogQlVHOiBhdHRlbXB0IHRvIHRyYW5zbWl0IE5VTEwgYnVmZmVyIik7CisJCXByX3dhcm4oIlRYOiBCVUc6IGF0dGVtcHQgdG8gdHJhbnNtaXQgTlVMTCBidWZmZXJcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDQ5LDcgKzEwNTAsNyBAQAogCQlkZXYtPmh3X2xlYXJuaW5nX2FuZF90eF9jYXBhYmxlID0gdHJ1ZTsKIAkJc2V0dXBfdGltZXIoJmRldi0+dHhfc2ltX3RpbWVyLCBlbmVfdHhfaXJxc2ltLAogCQkJCQkJKGxvbmcgdW5zaWduZWQgaW50KWRldik7Ci0JCWVuZV93YXJuKCJTaW11bGF0aW9uIG9mIFRYIGFjdGl2YXRlZCIpOworCQlwcl93YXJuKCJTaW11bGF0aW9uIG9mIFRYIGFjdGl2YXRlZFxuIik7CiAJfQogCiAJaWYgKCFkZXYtPmh3X2xlYXJuaW5nX2FuZF90eF9jYXBhYmxlKQpAQCAtMTA4OSw3ICsxMDkwLDcgQEAKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIGVycm9yOwogCi0JZW5lX25vdGljZSgiZHJpdmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQiKTsKKwlwcl9ub3RpY2UoImRyaXZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkXG4iKTsKIAlyZXR1cm4gMDsKIGVycm9yOgogCWlmIChkZXYgJiYgZGV2LT5pcnEgPj0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmggYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5oCmluZGV4IDAxN2MyMDkuLmZkMTA4ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuaApAQCAtMTgyLDIwICsxODIsMTEgQEAKICNkZWZpbmUgIEVORV9IV19DCQkyCS8qIDM5MjZDICovCiAjZGVmaW5lICBFTkVfSFdfRAkJMwkvKiAzOTI2RCBvciBsYXRlciAqLwogCi0jZGVmaW5lIGVuZV9wcmludGsobGV2ZWwsIHRleHQsIC4uLikgXAotCXByaW50ayhsZXZlbCBFTkVfRFJJVkVSX05BTUUgIjogIiB0ZXh0ICJcbiIsICMjIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIGVuZV9ub3RpY2UodGV4dCwgLi4uKSBlbmVfcHJpbnRrKEtFUk5fTk9USUNFLCB0ZXh0LCAjIyBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgZW5lX3dhcm4odGV4dCwgLi4uKSBlbmVfcHJpbnRrKEtFUk5fV0FSTklORywgdGV4dCwgIyMgX19WQV9BUkdTX18pCi0KLQotI2RlZmluZSBfX2RiZyhsZXZlbCwgZm9ybWF0LCAuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGRlYnVnID49IGxldmVsKSBcCi0JCQlwcmludGsoS0VSTl9ERUJVRyBFTkVfRFJJVkVSX05BTUUgXAotCQkJCSI6ICIgZm9ybWF0ICJcbiIsICMjIF9fVkFfQVJHU19fKTsgXAotCX0gd2hpbGUgKDApCi0KKyNkZWZpbmUgX19kYmcobGV2ZWwsIGZvcm1hdCwgLi4uKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKGRlYnVnID49IGxldmVsKQkJCQkJXAorCQlwcl9kZWJ1Zyhmb3JtYXQgIlxuIiwgIyMgX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKIAogI2RlZmluZSBkYmcoZm9ybWF0LCAuLi4pCQlfX2RiZygxLCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQogI2RlZmluZSBkYmdfdmVyYm9zZShmb3JtYXQsIC4uLikJX19kYmcoMiwgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaW1vbi5jIGIvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMKaW5kZXggNmJjMzVlZS4uNmVkOTY0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KQEAgLTUxNiwxOSArNTE3LDE5IEBACiAJaWYgKHJldHZhbCkgewogCQlpY3R4LT50eC5idXN5ID0gZmFsc2U7CiAJCXNtcF9ybWIoKTsgLyogZW5zdXJlIGxhdGVyIHJlYWRlcnMga25vdyB3ZSdyZSBub3QgYnVzeSAqLwotCQlwcl9lcnIoImVycm9yIHN1Ym1pdHRpbmcgdXJiKCVkKVxuIiwgcmV0dmFsKTsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJlcnJvciBzdWJtaXR0aW5nIHVyYiglZClcbiIsIHJldHZhbCk7CiAJfSBlbHNlIHsKIAkJLyogV2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlIChvciBhYm9ydCkgKi8KIAkJbXV0ZXhfdW5sb2NrKCZpY3R4LT5sb2NrKTsKIAkJcmV0dmFsID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAogCQkJCSZpY3R4LT50eC5maW5pc2hlZCk7CiAJCWlmIChyZXR2YWwpCi0JCQlwcl9lcnIoInRhc2sgaW50ZXJydXB0ZWRcbiIpOworCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJ0YXNrIGludGVycnVwdGVkXG4iKTsKIAkJbXV0ZXhfbG9jaygmaWN0eC0+bG9jayk7CiAKIAkJcmV0dmFsID0gaWN0eC0+dHguc3RhdHVzOwogCQlpZiAocmV0dmFsKQotCQkJcHJfZXJyKCJwYWNrZXQgdHggZmFpbGVkICglZClcbiIsIHJldHZhbCk7CisJCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoInBhY2tldCB0eCBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKIAl9CiAKIAlrZnJlZShjb250cm9sX3JlcSk7CkBAIC04MzAsMjAgKzgzMSwyMCBAQAogCiAJaWN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAoIWljdHgpIHsKLQkJcHJfZXJyKCJubyBjb250ZXh0IGZvciBkZXZpY2VcbiIpOworCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIm5vIGNvbnRleHQgZm9yIGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCW11dGV4X2xvY2soJmljdHgtPmxvY2spOwogCiAJaWYgKCFpY3R4LT5kZXZfcHJlc2VudF9pbnRmMCkgewotCQlwcl9lcnIoIm5vIGlNT04gZGV2aWNlIHByZXNlbnRcbiIpOworCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIm5vIGlNT04gZGV2aWNlIHByZXNlbnRcbiIpOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJaWYgKG5fYnl0ZXMgPD0gMCB8fCBuX2J5dGVzID4gMzIpIHsKLQkJcHJfZXJyKCJpbnZhbGlkIHBheWxvYWQgc2l6ZVxuIik7CisJCXByX2Vycl9yYXRlbGltaXRlZCgiaW52YWxpZCBwYXlsb2FkIHNpemVcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtODY5LDcgKzg3MCw3IEBACiAKIAkJcmV0dmFsID0gc2VuZF9wYWNrZXQoaWN0eCk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCXByX2Vycigic2VuZCBwYWNrZXQgZmFpbGVkIGZvciBwYWNrZXQgIyVkXG4iLCBzZXEgLyAyKTsKKwkJCXByX2Vycl9yYXRlbGltaXRlZCgic2VuZCBwYWNrZXQgIyVkIGZhaWxlZFxuIiwgc2VxIC8gMik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0gZWxzZSB7CiAJCQlzZXEgKz0gMjsKQEAgLTg4Myw3ICs4ODQsNyBAQAogCWljdHgtPnVzYl90eF9idWZbN10gPSAodW5zaWduZWQgY2hhcikgc2VxOwogCXJldHZhbCA9IHNlbmRfcGFja2V0KGljdHgpOwogCWlmIChyZXR2YWwpCi0JCXByX2Vycigic2VuZCBwYWNrZXQgZmFpbGVkIGZvciBwYWNrZXQgIyVkXG4iLCBzZXEgLyAyKTsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJzZW5kIHBhY2tldCAjJWQgZmFpbGVkXG4iLCBzZXEgLyAyKTsKIAogZXhpdDoKIAltdXRleF91bmxvY2soJmljdHgtPmxvY2spOwpAQCAtOTEyLDIwICs5MTMsMjEgQEAKIAogCWljdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKCFpY3R4KSB7Ci0JCXByX2Vycigibm8gY29udGV4dCBmb3IgZGV2aWNlXG4iKTsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJubyBjb250ZXh0IGZvciBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAltdXRleF9sb2NrKCZpY3R4LT5sb2NrKTsKIAogCWlmICghaWN0eC0+ZGlzcGxheV9zdXBwb3J0ZWQpIHsKLQkJcHJfZXJyKCJubyBpTU9OIGRpc3BsYXkgcHJlc2VudFxuIik7CisJCXByX2Vycl9yYXRlbGltaXRlZCgibm8gaU1PTiBkaXNwbGF5IHByZXNlbnRcbiIpOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJaWYgKG5fYnl0ZXMgIT0gOCkgewotCQlwcl9lcnIoImludmFsaWQgcGF5bG9hZCBzaXplOiAlZCAoZXhwZWN0ZWQgOClcbiIsIChpbnQpbl9ieXRlcyk7CisJCXByX2Vycl9yYXRlbGltaXRlZCgiaW52YWxpZCBwYXlsb2FkIHNpemU6ICVkIChleHBlY3RlZCA4KVxuIiwKKwkJCQkgICAoaW50KW5fYnl0ZXMpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtOTM3LDcgKzkzOSw3IEBACiAKIAlyZXR2YWwgPSBzZW5kX3BhY2tldChpY3R4KTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByX2Vycigic2VuZCBwYWNrZXQgZmFpbGVkIVxuIik7CisJCXByX2Vycl9yYXRlbGltaXRlZCgic2VuZCBwYWNrZXQgZmFpbGVkIVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9IGVsc2UgewogCQlkZXZfZGJnKGljdHgtPmRldiwgIiVzOiB3cml0ZSAlZCBieXRlcyB0byBMQ0RcbiIsCkBAIC0xNjU2LDcgKzE2NTgsNyBAQAogCQlyZXR1cm47CiAKIAlpY3R4ID0gKHN0cnVjdCBpbW9uX2NvbnRleHQgKil1cmItPmNvbnRleHQ7Ci0JaWYgKCFpY3R4KQorCWlmICghaWN0eCB8fCAhaWN0eC0+ZGV2X3ByZXNlbnRfaW50ZjApCiAJCXJldHVybjsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKQEAgLTE2ODgsNyArMTY5MCw3IEBACiAJCXJldHVybjsKIAogCWljdHggPSAoc3RydWN0IGltb25fY29udGV4dCAqKXVyYi0+Y29udGV4dDsKLQlpZiAoIWljdHgpCisJaWYgKCFpY3R4IHx8ICFpY3R4LT5kZXZfcHJlc2VudF9pbnRmMSkKIAkJcmV0dXJuOwogCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewpAQCAtMjExNiw3ICsyMTE4LDYgQEAKIAogCWljdHgtPmRldiA9IGRldjsKIAlpY3R4LT51c2JkZXZfaW50ZjAgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKLQlpY3R4LT5kZXZfcHJlc2VudF9pbnRmMCA9IHRydWU7CiAJaWN0eC0+cnhfdXJiX2ludGYwID0gcnhfdXJiOwogCWljdHgtPnR4X3VyYiA9IHR4X3VyYjsKIAlpY3R4LT5yZl9kZXZpY2UgPSBmYWxzZTsKQEAgLTIxNTUsNiArMjE1Niw4IEBACiAJCWdvdG8gcmRldl9zZXR1cF9mYWlsZWQ7CiAJfQogCisJaWN0eC0+ZGV2X3ByZXNlbnRfaW50ZjAgPSB0cnVlOworCiAJbXV0ZXhfdW5sb2NrKCZpY3R4LT5sb2NrKTsKIAlyZXR1cm4gaWN0eDsKIApAQCAtMjE5OCw3ICsyMjAxLDYgQEAKIAl9CiAKIAlpY3R4LT51c2JkZXZfaW50ZjEgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKLQlpY3R4LT5kZXZfcHJlc2VudF9pbnRmMSA9IHRydWU7CiAJaWN0eC0+cnhfdXJiX2ludGYxID0gcnhfdXJiOwogCiAJcmV0ID0gLUVOT0RFVjsKQEAgLTIyMjcsNiArMjIyOSw4IEBACiAJCWdvdG8gdXJiX3N1Ym1pdF9mYWlsZWQ7CiAJfQogCisJaWN0eC0+ZGV2X3ByZXNlbnRfaW50ZjEgPSB0cnVlOworCiAJbXV0ZXhfdW5sb2NrKCZpY3R4LT5sb2NrKTsKIAlyZXR1cm4gaWN0eDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1qdmMtZGVjb2Rlci5jIGIvZHJpdmVycy9tZWRpYS9yYy9pci1qdmMtZGVjb2Rlci5jCmluZGV4IDYyNDQ0OWEuLjAzNTY2OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItanZjLWRlY29kZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWp2Yy1kZWNvZGVyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAicmMtY29yZS1wcml2LmgiCiAKICNkZWZpbmUgSlZDX05CSVRTCQkxNgkJLyogZGV2KDgpICsgZnVuYyg4KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1saXJjLWNvZGVjLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYwppbmRleCBlNWVlZWM0Li41ZmFiYTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgogI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvcmMtY29yZS5oPgpAQCAtOTgsNyArOTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBpcl9saXJjX3RyYW5zbWl0X2lyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCitzdGF0aWMgc3NpemVfdCBpcl9saXJjX3RyYW5zbWl0X2lyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCSAgIHNpemVfdCBuLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGxpcmNfY29kZWMgKmxpcmM7CkBAIC0xNDAsMTAgKzE0MSwxMSBAQAogfQogCiBzdGF0aWMgbG9uZyBpcl9saXJjX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCXVuc2lnbmVkIGxvbmcgX191c2VyIGFyZykKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBsaXJjX2NvZGVjICpsaXJjOwogCXN0cnVjdCByY19kZXYgKmRldjsKKwl1MzIgX191c2VyICphcmdwID0gKHUzMiBfX3VzZXIgKikoYXJnKTsKIAlpbnQgcmV0ID0gMDsKIAlfX3UzMiB2YWwgPSAwLCB0bXA7CiAKQEAgLTE1Niw3ICsxNTgsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkgewotCQlyZXQgPSBnZXRfdXNlcih2YWwsIChfX3UzMiAqKWFyZyk7CisJCXJldCA9IGdldF91c2VyKHZhbCwgYXJncCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTI2NSw3ICsyNjcsNyBAQAogCX0KIAogCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQotCQlyZXQgPSBwdXRfdXNlcih2YWwsIChfX3UzMiAqKWFyZyk7CisJCXJldCA9IHB1dF91c2VyKHZhbCwgYXJncCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1uZWMtZGVjb2Rlci5jIGIvZHJpdmVycy9tZWRpYS9yYy9pci1uZWMtZGVjb2Rlci5jCmluZGV4IDYzZWU3MjIuLjE3ZjhkYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItbmVjLWRlY29kZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLW5lYy1kZWNvZGVyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAicmMtY29yZS1wcml2LmgiCiAKICNkZWZpbmUgTkVDX05CSVRTCQkzMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKaW5kZXggMjc4MDhiYjUuLjJlNWNkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYwpAQCAtMTIsOCArMTIsMTAgQEAKICAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSAicmMtY29yZS1wcml2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNS1kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNS1kZWNvZGVyLmMKaW5kZXggZWJkYmE1NS4uOWFiNjYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pci1yYzUtZGVjb2Rlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmM1LWRlY29kZXIuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlICJyYy1jb3JlLXByaXYuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBSQzVfTkJJVFMJCTE0CiAjZGVmaW5lIFJDNVhfTkJJVFMJCTIwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNS1zei1kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNS1zei1kZWNvZGVyLmMKaW5kZXggOTBhYTg4Ni4uZWM4ZDRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pci1yYzUtc3otZGVjb2Rlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmM1LXN6LWRlY29kZXIuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlICJyYy1jb3JlLXByaXYuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBSQzVfU1pfTkJJVFMJCTE1CiAjZGVmaW5lIFJDNV9VTklUCQk4ODg4ODggLyogbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmM2LWRlY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmM2LWRlY29kZXIuYwppbmRleCA3NTVkYWZhLi4xNDBmYjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNi1kZWNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pci1yYzYtZGVjb2Rlci5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgInJjLWNvcmUtcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKgogICogVGhpcyBkZWNvZGVyIGN1cnJlbnRseSBzdXBwb3J0czoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItc29ueS1kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXNvbnktZGVjb2Rlci5jCmluZGV4IGE5MmRlODAuLmQ1ZTJiNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItc29ueS1kZWNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pci1zb255LWRlY29kZXIuYwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJyYy1jb3JlLXByaXYuaCIKIAogI2RlZmluZSBTT05ZX1VOSVQJCTYwMDAwMCAvKiBucyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL01ha2VmaWxlCmluZGV4IGI1N2ZjODMuLjM2ZTRkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiAJCQlyYy1hcGFjLXZpZXdjb21wLm8gXAogCQkJcmMtYXN1cy1wYzM5Lm8gXAogCQkJcmMtYXRpLXR2LXdvbmRlci1oZC02MDAubyBcCisJCQlyYy1hdGkteDEwLm8gXAogCQkJcmMtYXZlcm1lZGlhLWExNmQubyBcCiAJCQlyYy1hdmVybWVkaWEubyBcCiAJCQlyYy1hdmVybWVkaWEtY2FyZGJ1cy5vIFwKQEAgLTQ3LDYgKzQ4LDcgQEAKIAkJCXJjLWxpcmMubyBcCiAJCQlyYy1sbWUyNTEwLm8gXAogCQkJcmMtbWFubGkubyBcCisJCQlyYy1tZWRpb24teDEwLm8gXAogCQkJcmMtbXNpLWRpZ2l2b3gtaWkubyBcCiAJCQlyYy1tc2ktZGlnaXZveC1paWkubyBcCiAJCQlyYy1tc2ktdHZhbnl3aGVyZS5vIFwKQEAgLTcwLDYgKzcyLDcgQEAKIAkJCXJjLWhhdXBwYXVnZS5vIFwKIAkJCXJjLXJjNi1tY2UubyBcCiAJCQlyYy1yZWFsLWF1ZGlvLTIyMC0zMi1rZXlzLm8gXAorCQkJcmMtc25hcHN0cmVhbS1maXJlZmx5Lm8gXAogCQkJcmMtc3RyZWFtemFwLm8gXAogCQkJcmMtdGJzLW5lYy5vIFwKIAkJCXJjLXRlY2huaXNhdC11c2IyLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFkc3RlY2gtZHZiLXQtcGNpLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYWRzdGVjaC1kdmItdC1wY2kuYwppbmRleCA5YTg3NTJmLi5iMGU0MmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYWRzdGVjaC1kdmItdC1wY2kuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYWRzdGVjaC1kdmItdC1wY2kuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogQURTIFRlY2ggSW5zdGFudCBUViBEVkItVCBQQ0kgUmVtb3RlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hbGluay1kdHUtbS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFsaW5rLWR0dS1tLmMKaW5kZXggZmU2NTJlOS4uNGU2YWRlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFsaW5rLWR0dS1tLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFsaW5rLWR0dS1tLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEEtTGluayBEVFUobSkgc2xpbSByZW1vdGUsIDYgcm93cywgMyBjb2x1bW5zLiAqLwogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgYWxpbmtfZHR1X21bXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hbnlzZWUuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hbnlzZWUuYwppbmRleCA4ODRmMWI1Li5jNzM1ZmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYW55c2VlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFueXNlZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBhbnlzZWVbXSA9IHsKIAl7IDB4MDgwMCwgS0VZXzAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hcGFjLXZpZXdjb21wLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXBhYy12aWV3Y29tcC5jCmluZGV4IDdhZjE4ODIuLjhjOTJmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hcGFjLXZpZXdjb21wLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFwYWMtdmlld2NvbXAuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXN1cy1wYzM5LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXN1cy1wYzM5LmMKaW5kZXggYjI0ODExNS4uMmNhZjIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFzdXMtcGMzOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hc3VzLXBjMzkuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIE1hcmMgRmFyZ2FzIDx0ZWxlbmlla29AdGVsZW5pZWtvLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdGktdHYtd29uZGVyLWhkLTYwMC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF0aS10di13b25kZXItaGQtNjAwLmMKaW5kZXggZjc2NmIyNC4uMjAzMTIyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF0aS10di13b25kZXItaGQtNjAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF0aS10di13b25kZXItaGQtNjAwLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEFUSSBUViBXb25kZXIgSEQgNjAwIFVTQgogICAgRGV2aW4gSGVpdG11ZWxsZXIgPGRldmluLmhlaXRtdWVsbGVyQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdGkteDEwLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXRpLXgxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYjhiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXRpLXgxMC5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQVRJIFgxMCBSRiByZW1vdGUga2V5dGFibGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUA/a2kuZmk+CisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBzdGF0aWMgZ2VuZXJpYyBrZXl0YWJsZSBwcmV2aW91c2x5IGZvdW5kIGluCisgKiBhdGlfcmVtb3RlLmMsIHdoaWNoIGlzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9ycmV5IEhvZmZtYW4gPHRob2ZmbWFuQGFybm9yLm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBWbGFkaW1pciBEZXJnYWNoZXYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKworc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgYXRpX3gxMFtdID0geworCXsgMHhkMjBkLCBLRVlfMSB9LAorCXsgMHhkMzBlLCBLRVlfMiB9LAorCXsgMHhkNDBmLCBLRVlfMyB9LAorCXsgMHhkNTEwLCBLRVlfNCB9LAorCXsgMHhkNjExLCBLRVlfNSB9LAorCXsgMHhkNzEyLCBLRVlfNiB9LAorCXsgMHhkODEzLCBLRVlfNyB9LAorCXsgMHhkOTE0LCBLRVlfOCB9LAorCXsgMHhkYTE1LCBLRVlfOSB9LAorCXsgMHhkYzE3LCBLRVlfMCB9LAorCXsgMHhjNTAwLCBLRVlfQSB9LAorCXsgMHhjNjAxLCBLRVlfQiB9LAorCXsgMHhkZTE5LCBLRVlfQyB9LAorCXsgMHhlMDFiLCBLRVlfRCB9LAorCXsgMHhlNjIxLCBLRVlfRSB9LAorCXsgMHhlODIzLCBLRVlfRiB9LAorCisJeyAweGRkMTgsIEtFWV9LUEVOVEVSIH0sICAgIC8qICJjaGVjayIgKi8KKwl7IDB4ZGIxNiwgS0VZX01FTlUgfSwgICAgICAgLyogIm1lbnUiICovCisJeyAweGM3MDIsIEtFWV9QT1dFUiB9LCAgICAgIC8qIFBvd2VyICovCisJeyAweGM4MDMsIEtFWV9UViB9LCAgICAgICAgIC8qIFRWICovCisJeyAweGM5MDQsIEtFWV9EVkQgfSwgICAgICAgIC8qIERWRCAqLworCXsgMHhjYTA1LCBLRVlfV1dXIH0sICAgICAgICAvKiBXRUIgKi8KKwl7IDB4Y2IwNiwgS0VZX0JPT0tNQVJLUyB9LCAgLyogImJvb2siICovCisJeyAweGNjMDcsIEtFWV9FRElUIH0sICAgICAgIC8qICJoYW5kIiAqLworCXsgMHhlMTFjLCBLRVlfQ09GRkVFIH0sICAgICAvKiAidGltZXIiICovCisJeyAweGU1MjAsIEtFWV9GUk9OVCB9LCAgICAgIC8qICJtYXgiICovCisJeyAweGUyMWQsIEtFWV9MRUZUIH0sICAgICAgIC8qIGxlZnQgKi8KKwl7IDB4ZTQxZiwgS0VZX1JJR0hUIH0sICAgICAgLyogcmlnaHQgKi8KKwl7IDB4ZTcyMiwgS0VZX0RPV04gfSwgICAgICAgLyogZG93biAqLworCXsgMHhkZjFhLCBLRVlfVVAgfSwgICAgICAgICAvKiB1cCAqLworCXsgMHhlMzFlLCBLRVlfT0sgfSwgICAgICAgICAvKiAiT0siICovCisJeyAweGNlMDksIEtFWV9WT0xVTUVET1dOIH0sIC8qIFZPTCArICovCisJeyAweGNkMDgsIEtFWV9WT0xVTUVVUCB9LCAgIC8qIFZPTCAtICovCisJeyAweGNmMGEsIEtFWV9NVVRFIH0sICAgICAgIC8qIE1VVEUgICovCisJeyAweGQwMGIsIEtFWV9DSEFOTkVMVVAgfSwgIC8qIENIICsgKi8KKwl7IDB4ZDEwYywgS0VZX0NIQU5ORUxET1dOIH0sLyogQ0ggLSAqLworCXsgMHhlYzI3LCBLRVlfUkVDT1JEIH0sICAgICAvKiAoIG8pIHJlZCAqLworCXsgMHhlYTI1LCBLRVlfUExBWSB9LCAgICAgICAvKiAoID4pICovCisJeyAweGU5MjQsIEtFWV9SRVdJTkQgfSwgICAgIC8qICg8PCkgKi8KKwl7IDB4ZWIyNiwgS0VZX0ZPUldBUkQgfSwgICAgLyogKD4+KSAqLworCXsgMHhlZDI4LCBLRVlfU1RPUCB9LCAgICAgICAvKiAoW10pICovCisJeyAweGVlMjksIEtFWV9QQVVTRSB9LCAgICAgIC8qICgnJykgKi8KKwl7IDB4ZjAyYiwgS0VZX1BSRVZJT1VTIH0sICAgLyogKDwtKSAqLworCXsgMHhlZjJhLCBLRVlfTkVYVCB9LCAgICAgICAvKiAoPispICovCisJeyAweGYyMmQsIEtFWV9JTkZPIH0sICAgICAgIC8qIFBMQVlJTkcgKi8KKwl7IDB4ZjMyZSwgS0VZX0hPTUUgfSwgICAgICAgLyogVE9QICovCisJeyAweGY0MmYsIEtFWV9FTkQgfSwgICAgICAgIC8qIEVORCAqLworCXsgMHhmNTMwLCBLRVlfU0VMRUNUIH0sICAgICAvKiBTRUxFQ1QgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmNfbWFwX2xpc3QgYXRpX3gxMF9tYXAgPSB7CisJLm1hcCA9IHsKKwkJLnNjYW4gICAgPSBhdGlfeDEwLAorCQkuc2l6ZSAgICA9IEFSUkFZX1NJWkUoYXRpX3gxMCksCisJCS5yY190eXBlID0gUkNfVFlQRV9PVEhFUiwKKwkJLm5hbWUgICAgPSBSQ19NQVBfQVRJX1gxMCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JjX21hcF9hdGlfeDEwKHZvaWQpCit7CisJcmV0dXJuIHJjX21hcF9yZWdpc3RlcigmYXRpX3gxMF9tYXApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9yY19tYXBfYXRpX3gxMCh2b2lkKQoreworCXJjX21hcF91bnJlZ2lzdGVyKCZhdGlfeDEwX21hcCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcmNfbWFwX2F0aV94MTApCittb2R1bGVfZXhpdChleGl0X3JjX21hcF9hdGlfeDEwKQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGlraS5maT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtYTE2ZC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1hMTZkLmMKaW5kZXggZWM5YmVlZS4uODk0OTM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1hMTZkLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1hMTZkLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIGF2ZXJtZWRpYV9hMTZkW10gPSB7CiAJeyAweDIwLCBLRVlfTElTVH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLWNhcmRidXMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtY2FyZGJ1cy5jCmluZGV4IDIyZjU0ZDQuLmQyYWFmNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtY2FyZGJ1cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtY2FyZGJ1cy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBPbGRyaWNoIEplZGxpY2thIDxvbGRpdW0ucHJvQHNlem5hbS5jej4gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1kdmJ0LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLWR2YnQuYwppbmRleCBjMjU4MDlkLi5kYzJiYWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLWR2YnQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLWR2YnQuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51ayAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLW0xMzVhLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLW0xMzVhLmMKaW5kZXggM2QyY2JlNC4uMDQyNjlkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1tMTM1YS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtbTEzNWEuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIEF2ZXJtZWRpYSBNMTM1QSB3aXRoIFJNLUpYIGFuZCBSTS1LNiByZW1vdGUgY29udHJvbHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtbTczM2Etcm0tazYuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtbTczM2Etcm0tazYuYwppbmRleCA4Y2Q3ZjI4Li5lODNiMWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLW03MzNhLXJtLWs2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1tNzMzYS1ybS1rNi5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIEF2ZXJtZWRpYSBNNzMzQSB3aXRoIElSIG1vZGVsIFJNLUs2CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLXJtLWtzLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLXJtLWtzLmMKaW5kZXggOWQ2OGFmMi4uODM0NGJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1ybS1rcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtcm0ta3MuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogSW5pdGlhbCBrZXl0YWJsZSBpcyBmcm9tIEpvc2UgQWxiZXJ0byBSZWd1ZXJvIDxqYXJlZ3Vlcm9AdGVsZWZvbmljYS5uZXQ+CiAgICBhbmQgRmVsaXBlIE1vcmFsZXMgTW9yZW5vIDxmZWxpcGUubW9yYWxlcy5tb3Jlbm9AZ21haWwuY29tPiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS5jCmluZGV4IGVkZmE3MTUuLmM2MDYzZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEFsZXggSGVybWFubiA8Z2FhZkBnbXgubmV0PiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcnR2LTMwMy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJ0di0zMDMuYwppbmRleCAzMmU5NDk4Li4xNGY3ODQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcnR2LTMwMy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVydHYtMzAzLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEFWRVJUViBTVFVESU8gMzAzIFJlbW90ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXp1cmV3YXZlLWFkLXR1NzAwLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXp1cmV3YXZlLWFkLXR1NzAwLmMKaW5kZXggYzNmNmQ2Mi4uZWE3ZjJkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF6dXJld2F2ZS1hZC10dTcwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1henVyZXdhdmUtYWQtdHU3MDAuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgYXp1cmV3YXZlX2FkX3R1NzAwW10gPSB7CiAJeyAweDAwMDAsIEtFWV9UQUIgfSwgICAgICAgICAgICAgLyogVGFiICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYmVob2xkLWNvbHVtYnVzLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYmVob2xkLWNvbHVtYnVzLmMKaW5kZXggOGJmMDU4Zi4uMDg2YjRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWJlaG9sZC1jb2x1bWJ1cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1iZWhvbGQtY29sdW1idXMuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogQmVob2xkZXIgSW50bC4gTHRkLiAyMDA4CiAgKiBEbWl0cnkgQmVsaW1vdiBkLmJlbGltb3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWJlaG9sZC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWJlaG9sZC5jCmluZGV4IGM5MDlhMjMuLjA4NzdlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1iZWhvbGQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYmVob2xkLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBJZ29yIEt1em5ldHNvdiA8aWdrNzJAeWEucnU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYnVkZ2V0LWNpLW9sZC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWJ1ZGdldC1jaS1vbGQuYwppbmRleCAyZjY2ZTQzLi44MzExZTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYnVkZ2V0LWNpLW9sZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1idWRnZXQtY2ktb2xkLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBGcm9tIHJlYWRpbmcgdGhlIGZvbGxvd2luZyByZW1vdGVzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWNpbmVyZ3ktMTQwMC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWNpbmVyZ3ktMTQwMC5jCmluZGV4IDI4NDUzNGIuLjBjODdmYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1jaW5lcmd5LTE0MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtY2luZXJneS0xNDAwLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIENpbmVyZ3kgMTQwMCBEVkItVCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtY2luZXJneS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWNpbmVyZ3kuYwppbmRleCBjZjNhNmJmLi4zMDllOWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtY2luZXJneS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1jaW5lcmd5LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIGNpbmVyZ3lbXSA9IHsKIAl7IDB4MDAsIEtFWV8wIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZGliMDcwMC1uZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWIwNzAwLW5lYy5jCmluZGV4IDdhNWY1MzAuLjRkMTNhN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWIwNzAwLW5lYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWIwNzAwLW5lYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBkaWIwNzAwX25lY190YWJsZVtdID0gewogCS8qIEtleSBjb2RlcyBmb3IgdGhlIFBpeGVsdmlldyBTQlRWRCByZW1vdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWIwNzAwLXJjNS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpYjA3MDAtcmM1LmMKaW5kZXggNGFmMTJlNC4uYmE4MWQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpYjA3MDAtcmM1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpYjA3MDAtcmM1LmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIGRpYjA3MDBfcmM1X3RhYmxlW10gPSB7CiAJLyogS2V5IGNvZGVzIGZvciB0aGUgdGlueSBQaW5uYWNsZSByZW1vdGUqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpZ2l0YWxub3ctdGlueXR3aW4uYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWdpdGFsbm93LXRpbnl0d2luLmMKaW5kZXggZjY4YjQ1MC4uYmVkNzhhY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWdpdGFsbm93LXRpbnl0d2luLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpZ2l0YWxub3ctdGlueXR3aW4uYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgZGlnaXRhbG5vd190aW55dHdpbltdID0gewogCXsgMHgwMDAwLCBLRVlfTVVURSB9LCAgICAgICAgICAgIC8qIFtzeW1ib2wgc3BlYWtlcl0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWdpdHRyYWRlLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZGlnaXR0cmFkZS5jCmluZGV4IDIxZDQ5ODcuLmEzYjk3YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWdpdHRyYWRlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpZ2l0dHJhZGUuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogRGlnaXR0cmFkZSBEVkItVCBVU0IgU3RpY2sgcmVtb3RlIGNvbnRyb2xsZXIuICovCiAvKiBJbXBvcnRlZCBmcm9tIGFmOTAxNS5oLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRtMTEwNS1uZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kbTExMDUtbmVjLmMKaW5kZXggZDAyNGZiZi4uNjdmYzlmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRtMTEwNS1uZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZG0xMTA1LW5lYy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBEVkJXb3JsZCByZW1vdGVzCiAgICBJZ29yIE0uIExpcGxpYW5pbiA8bGlwbGlhbmluQG1lLmJ5PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRudHYtbGl2ZS1kdmItdC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRudHYtbGl2ZS1kdmItdC5jCmluZGV4IDgyYzAyMDAuLjkxZWE5MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kbnR2LWxpdmUtZHZiLXQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZG50di1saXZlLWR2Yi10LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIERpZ2l0YWxOb3cgRE5UViBMaXZlIERWQi1UIFJlbW90ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZG50di1saXZlLWR2YnQtcHJvLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZG50di1saXZlLWR2YnQtcHJvLmMKaW5kZXggMDE1ZTk5ZC4uZmQ2ODBkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRudHYtbGl2ZS1kdmJ0LXByby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kbnR2LWxpdmUtZHZidC1wcm8uYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogRGlnaXRhbE5vdyBETlRWIExpdmUhIERWQi1UIFBybyBSZW1vdGUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWVtLXRlcnJhdGVjLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW0tdGVycmF0ZWMuYwppbmRleCAyNjlkNDI5Li5kMWZjZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW0tdGVycmF0ZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW0tdGVycmF0ZWMuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgZW1fdGVycmF0ZWNbXSA9IHsKIAl7IDB4MDEsIEtFWV9DSEFOTkVMIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW5jb3JlLWVubHR2LWZtNTMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYtZm01My5jCmluZGV4IGUzODg2OTguLjJmZTQ1ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYtZm01My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYtZm01My5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBFbmNvcmUgRU5MVFYtRk0gdjUuMwogICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW5jb3JlLWVubHR2LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW5jb3JlLWVubHR2LmMKaW5kZXggZTU2YWM2ZS4uMjIzZGU3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWVuY29yZS1lbmx0di5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogRW5jb3JlIEVOTFRWLUZNICAtIGJsYWNrIHBsYXN0aWMsIHdoaXRlIGZyb250IGNvdmVyIHdpdGggd2hpdGUgZ2xvd2luZyBidXR0b25zCiAgICAgSnVhbiBQYWJsbyBTb3JtYW5pIDxzb3JtYW5AZ21haWwuY29tPiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWVuY29yZS1lbmx0djIuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYyLmMKaW5kZXggYjYyNjRmMS4uNjY5Y2JmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWVuY29yZS1lbmx0djIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW5jb3JlLWVubHR2Mi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBFbmNvcmUgRU5MVFYyLUZNICAtIHNpbHZlciBwbGFzdGljIC0gIldhbmQgTWVkaWEiIHdyaXR0ZW4gYXQgdGhlIGJvdHRvbgogICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWV2Z2EtaW5kdHViZS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWV2Z2EtaW5kdHViZS5jCmluZGV4IGEyYmYyNGYuLjJjNjQ3ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ldmdhLWluZHR1YmUuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZXZnYS1pbmR0dWJlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEVWR0EgaW5EdHViZQogICAgRGV2aW4gSGVpdG11ZWxsZXIgPGRldmluLmhlaXRtdWVsbGVyQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lenR2LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZXp0di5jCmluZGV4IDFlOGU1YjIuLjc2OTIxNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lenR2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWV6dHYuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogQWxmb25zIEdlc2VyIDxhLmdlc2VyQGNveC5uZXQ+CiAgKiB1cGRhdGVzIGZyb20gSm9iIEQuIFIuIEJvcmdlcyA8am9iZHJiQGlnLmNvbS5icj4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mbHlkdmIuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mbHlkdmIuYwppbmRleCBhOGIwZjY2Li4zYTZiYmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZmx5ZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWZseWR2Yi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBmbHlkdmJbXSA9IHsKIAl7IDB4MDEsIEtFWV9aT09NIH0sCQkvKiBGdWxsIFNjcmVlbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWZseXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZmx5dmlkZW8uYwppbmRleCA1YmJlNjgzLi5iZjlkYTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZmx5dmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZmx5dmlkZW8uYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgZmx5dmlkZW9bXSA9IHsKIAl7IDB4MGYsIEtFWV8wIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZnVzaW9uaGR0di1tY2UuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mdXNpb25oZHR2LW1jZS5jCmluZGV4IGM4MGIyNWMuLjJmMDk3MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mdXNpb25oZHR2LW1jZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mdXNpb25oZHR2LW1jZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBEVmlDTyBGVVNJT04gSERUViBNQ0UgcmVtb3RlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nYWRtZWktcm0wMDh6LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZ2FkbWVpLXJtMDA4ei5jCmluZGV4IDA2OGM5ZWEuLjBlOThlYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nYWRtZWktcm0wMDh6LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWdhZG1laS1ybTAwOHouYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogR0FETUVJIFVUVjMzMCsgUk0wMDhaIHJlbW90ZQogICAgU2hpbmUgTGl1IDxzaGluZWxAZm94bWFpbC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZ2VuaXVzLXR2Z28tYTExbWNlLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZ2VuaXVzLXR2Z28tYTExbWNlLmMKaW5kZXggY2RiYmVkNC4uYTJlMmZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWdlbml1cy10dmdvLWExMW1jZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nZW5pdXMtdHZnby1hMTFtY2UuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIFJlbW90ZSBjb250cm9sIGZvciB0aGUgR2VuaXVzIFRWR08gQTExTUNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZ290dmlldzcxMzUuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nb3R2aWV3NzEzNS5jCmluZGV4IGEzOGJkZGUuLjg2NDYxNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nb3R2aWV3NzEzNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nb3R2aWV3NzEzNS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBNaWtlIEJhaWtvdiA8bWlrZUBiYWlrb3YuY29tPiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaGF1cHBhdWdlLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaGF1cHBhdWdlLmMKaW5kZXggY2QzZGI3Ny4uZTUxYzYxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWhhdXBwYXVnZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1oYXVwcGF1Z2UuYwpAQCAtMTcsNiArMTcsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIEhhdXBwYXVnZTp0aGUgbmV3ZXIsIGdyYXkgcmVtb3RlcyAoc2VlbXMgdGhlcmUgYXJlIG11bHRpcGxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW1vbi1tY2UuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1pbW9uLW1jZS5jCmluZGV4IDBlYTJhYTEuLjEyNGM3MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1pbW9uLW1jZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1pbW9uLW1jZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBtY2UtbW9kZSBpbW9uIG1jZSByZW1vdGUga2V5IHRhYmxlICovCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBpbW9uX21jZVtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWltb24tcGFkLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW1vbi1wYWQuYwppbmRleCA3NWQzODQzLi45OTljNjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW1vbi1wYWQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW1vbi1wYWQuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIHN0YW5kYXJkIGltb24gcmVtb3RlIGtleSB0YWJsZSwgd2hpY2ggaXNuJ3QgcmVhbGx5IGVudGlyZWx5CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW9kYXRhLWJjdHY3ZS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWlvZGF0YS1iY3R2N2UuYwppbmRleCAxZjU5ZTE2Li4zNDU0MGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW9kYXRhLWJjdHY3ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1pb2RhdGEtYmN0djdlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIElPLURBVEEgQkNUVjdFIFJlbW90ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMta2Fpb215LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMta2Fpb215LmMKaW5kZXggZjMxZGM1Yy4uNDI2NGE3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWthaW9teS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1rYWlvbXkuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogS2Fpb215IFRWblBDIFUyCiAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1rd29ybGQtMzE1dS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWt3b3JsZC0zMTV1LmMKaW5kZXggN2YzM2VkYi4uZTQ4Y2QyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWt3b3JsZC0zMTV1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWt3b3JsZC0zMTV1LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEt3b3JsZCAzMTVVCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1rd29ybGQtcGx1cy10di1hbmFsb2cuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1rd29ybGQtcGx1cy10di1hbmFsb2cuYwppbmRleCA3ZmExN2EzLi4zMjk5OGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMta3dvcmxkLXBsdXMtdHYtYW5hbG9nLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWt3b3JsZC1wbHVzLXR2LWFuYWxvZy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBLd29ybGQgUGx1cyBUViBBbmFsb2cgTGl0ZSBQQ0kgSVIKICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWxlYWR0ZWsteTA0ZzAwNTEuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1sZWFkdGVrLXkwNGcwMDUxLmMKaW5kZXggOGZhYTU0Zi4uMDNkNzYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWxlYWR0ZWsteTA0ZzAwNTEuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbGVhZHRlay15MDRnMDA1MS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBsZWFkdGVrX3kwNGcwMDUxW10gPSB7CiAJeyAweDAzMDAsIEtFWV9QT1dFUjIgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1saXJjLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbGlyYy5jCmluZGV4IGU4ZTIzZTIuLmZiZjA4ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1saXJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWxpcmMuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIGxpcmNbXSA9IHsKIAl7IH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbG1lMjUxMC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWxtZTI1MTAuYwppbmRleCAxMjlkM2Y5Li41MWYxOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbG1lMjUxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1sbWUyNTEwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgbG1lMjUxMF9yY1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1hbmxpLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbWFubGkuYwppbmRleCAyM2IyZDA0Li5lNzAzOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbWFubGkuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbWFubGkuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTWljaGFlbCBUb2thcmV2IDxtanRAdGxzLm1zay5ydT4KICAgIGtleXRhYmxlIGlzIHVzZWQgYnkgTUFOTEkgTVRWMDBbMHgwY10gYW5kIEJlaG9sZFRWIDQwWzEzXSBhdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1lZGlvbi14MTAuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tZWRpb24teDEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllMmNjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tZWRpb24teDEwLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBNZWRpb24gWDEwIFJGIHJlbW90ZSBrZXl0YWJsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQD9raS5maT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gYSBrZXl0YWJsZSBwcm92aWRlZCBieQorICogSmFuIExvc2luc2tpIDxsb3NpbnNraUB3aDIudHUtZHJlc2Rlbi5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKworc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgbWVkaW9uX3gxMFtdID0geworCXsgMHhmMTJjLCBLRVlfVFYgfSwgICAgLyogVFYgKi8KKwl7IDB4ZjIyZCwgS0VZX1ZDUiB9LCAgIC8qIFZDUiAqLworCXsgMHhjOTA0LCBLRVlfRFZEIH0sICAgLyogRFZEICovCisJeyAweGNiMDYsIEtFWV9BVURJTyB9LCAvKiBNVVNJQyAqLworCisJeyAweGYzMmUsIEtFWV9SQURJTyB9LCAgICAgLyogUkFESU8gKi8KKwl7IDB4Y2EwNSwgS0VZX0RJUkVDVE9SWSB9LCAvKiBQSE9UTyAqLworCXsgMHhmNDJmLCBLRVlfSU5GTyB9LCAgICAgIC8qIFRWLVBSRVZJRVcgKi8KKwl7IDB4ZjUzMCwgS0VZX0xJU1QgfSwgICAgICAvKiBDSEFOTkVMLUxTVCAqLworCisJeyAweGUwMWIsIEtFWV9TRVRVUCB9LCAvKiBTRVRVUCAqLworCXsgMHhmNjMxLCBLRVlfVklERU8gfSwgLyogVklERU8gREVTS1RPUCAqLworCisJeyAweGNkMDgsIEtFWV9WT0xVTUVET1dOIH0sICAvKiBWT0wgLSAqLworCXsgMHhjZTA5LCBLRVlfVk9MVU1FVVAgfSwgICAgLyogVk9MICsgKi8KKwl7IDB4ZDAwYiwgS0VZX0NIQU5ORUxVUCB9LCAgIC8qIENIQU4gKyAqLworCXsgMHhkMTBjLCBLRVlfQ0hBTk5FTERPV04gfSwgLyogQ0hBTiAtICovCisJeyAweGM1MDAsIEtFWV9NVVRFIH0sICAgICAgICAvKiBNVVRFICovCisKKwl7IDB4ZjczMiwgS0VZX1JFRCB9LCAvKiByZWQgKi8KKwl7IDB4ZjgzMywgS0VZX0dSRUVOIH0sIC8qIGdyZWVuICovCisJeyAweGY5MzQsIEtFWV9ZRUxMT1cgfSwgLyogeWVsbG93ICovCisJeyAweGZhMzUsIEtFWV9CTFVFIH0sIC8qIGJsdWUgKi8KKwl7IDB4ZGIxNiwgS0VZX1RFWFQgfSwgLyogVFhUICovCisKKwl7IDB4ZDIwZCwgS0VZXzEgfSwKKwl7IDB4ZDMwZSwgS0VZXzIgfSwKKwl7IDB4ZDQwZiwgS0VZXzMgfSwKKwl7IDB4ZDUxMCwgS0VZXzQgfSwKKwl7IDB4ZDYxMSwgS0VZXzUgfSwKKwl7IDB4ZDcxMiwgS0VZXzYgfSwKKwl7IDB4ZDgxMywgS0VZXzcgfSwKKwl7IDB4ZDkxNCwgS0VZXzggfSwKKwl7IDB4ZGExNSwgS0VZXzkgfSwKKwl7IDB4ZGMxNywgS0VZXzAgfSwKKwl7IDB4ZTExYywgS0VZX1NFQVJDSCB9LCAvKiBUVi9SQUQsIENIIFNSQyAqLworCXsgMHhlNTIwLCBLRVlfREVMRVRFIH0sIC8qIERFTEVURSAqLworCisJeyAweGZiMzYsIEtFWV9LRVlCT0FSRCB9LCAvKiBSRU5BTUUgKi8KKwl7IDB4ZGQxOCwgS0VZX1NDUkVFTiB9LCAgIC8qIFNOQVBTSE9UICovCisKKwl7IDB4ZGYxYSwgS0VZX1VQIH0sICAgIC8qIHVwICovCisJeyAweGU3MjIsIEtFWV9ET1dOIH0sICAvKiBkb3duICovCisJeyAweGUyMWQsIEtFWV9MRUZUIH0sICAvKiBsZWZ0ICovCisJeyAweGU0MWYsIEtFWV9SSUdIVCB9LCAvKiByaWdodCAqLworCXsgMHhlMzFlLCBLRVlfT0sgfSwgICAgLyogT0sgKi8KKworCXsgMHhmYzM3LCBLRVlfU0VMRUNUIH0sIC8qIEFDUVVJUkUgSU1BR0UgKi8KKwl7IDB4ZmQzOCwgS0VZX0VESVQgfSwgICAvKiBFRElUIElNQUdFICovCisKKwl7IDB4ZTkyNCwgS0VZX1JFV0lORCB9LCAgIC8qIHJld2luZCAgKDw8KSAqLworCXsgMHhlYTI1LCBLRVlfUExBWSB9LCAgICAgLyogcGxheSAgICAoID4pICovCisJeyAweGViMjYsIEtFWV9GT1JXQVJEIH0sICAvKiBmb3J3YXJkICg+PikgKi8KKwl7IDB4ZWMyNywgS0VZX1JFQ09SRCB9LCAgIC8qIHJlY29yZCAgKCBvKSAqLworCXsgMHhlZDI4LCBLRVlfU1RPUCB9LCAgICAgLyogc3RvcCAgICAoW10pICovCisJeyAweGVlMjksIEtFWV9QQVVTRSB9LCAgICAvKiBwYXVzZSAgICgnJykgKi8KKworCXsgMHhlNjIxLCBLRVlfUFJFVklPVVMgfSwgICAgICAgIC8qIHByZXYgKi8KKwl7IDB4ZmUzOSwgS0VZX1NXSVRDSFZJREVPTU9ERSB9LCAvKiBGIFNDUiAqLworCXsgMHhlODIzLCBLRVlfTkVYVCB9LCAgICAgICAgICAgIC8qIG5leHQgKi8KKwl7IDB4ZGUxOSwgS0VZX01FTlUgfSwgICAgICAgICAgICAvKiBNRU5VICovCisJeyAweGZmM2EsIEtFWV9MQU5HVUFHRSB9LCAgICAgICAgLyogQVVESU8gKi8KKworCXsgMHhjNzAyLCBLRVlfUE9XRVIgfSwgLyogUE9XRVIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmNfbWFwX2xpc3QgbWVkaW9uX3gxMF9tYXAgPSB7CisJLm1hcCA9IHsKKwkJLnNjYW4gICAgPSBtZWRpb25feDEwLAorCQkuc2l6ZSAgICA9IEFSUkFZX1NJWkUobWVkaW9uX3gxMCksCisJCS5yY190eXBlID0gUkNfVFlQRV9PVEhFUiwKKwkJLm5hbWUgICAgPSBSQ19NQVBfTUVESU9OX1gxMCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JjX21hcF9tZWRpb25feDEwKHZvaWQpCit7CisJcmV0dXJuIHJjX21hcF9yZWdpc3RlcigmbWVkaW9uX3gxMF9tYXApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9yY19tYXBfbWVkaW9uX3gxMCh2b2lkKQoreworCXJjX21hcF91bnJlZ2lzdGVyKCZtZWRpb25feDEwX21hcCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcmNfbWFwX21lZGlvbl94MTApCittb2R1bGVfZXhpdChleGl0X3JjX21hcF9tZWRpb25feDEwKQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGlraS5maT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktZGlnaXZveC1paS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS1kaWdpdm94LWlpLmMKaW5kZXggN2I5YTAxYi4uYzY0ZTllMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS1kaWdpdm94LWlpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS1kaWdpdm94LWlpLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIG1zaV9kaWdpdm94X2lpW10gPSB7CiAJeyAweDAwMDIsIEtFWV8yIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbXNpLWRpZ2l2b3gtaWlpLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbXNpLWRpZ2l2b3gtaWlpLmMKaW5kZXggYWU5ZDA2Yi4uMzAzYTBiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS1kaWdpdm94LWlpaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktZGlnaXZveC1paWkuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTVNJIERJR0lWT1ggbWluaSBJSUkgKi8KIC8qIFVzZXMgTkVDIGV4dGVuZGVkIDB4NjFkNi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktdHZhbnl3aGVyZS1wbHVzLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbXNpLXR2YW55d2hlcmUtcGx1cy5jCmluZGV4IDhlOTk2OWQuLmMzOTNkOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktdHZhbnl3aGVyZS1wbHVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS10dmFueXdoZXJlLXBsdXMuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAgS2V5Y29kZXMgZm9yIHJlbW90ZSBvbiB0aGUgTVNJIFRWQG55d2hlcmUgUGx1cy4gVGhlIGNvbnRyb2xsZXIgSUMgb24gdGhlIGNhcmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktdHZhbnl3aGVyZS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS10dmFueXdoZXJlLmMKaW5kZXggZmRkMjEzZi4uYTcwMDNkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS10dmFueXdoZXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS10dmFueXdoZXJlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIE1TSSBUVkBueXdoZXJlIE1BU1RFUiByZW1vdGUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYnVsYS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYnVsYS5jCmluZGV4IGRkYWUyMGUuLjNmMGRkZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1uZWJ1bGEuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbmVidWxhLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIG5lYnVsYVtdID0gewogCXsgMHgwMCwgS0VZXzAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1uZWMtdGVycmF0ZWMtY2luZXJneS14cy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYy10ZXJyYXRlYy1jaW5lcmd5LXhzLmMKaW5kZXggMjZmMTE0Yy4uZjNiODZjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYy10ZXJyYXRlYy1jaW5lcmd5LXhzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYy10ZXJyYXRlYy1jaW5lcmd5LXhzLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIFRlcnJhdGVjIENpbmVyZ3kgSHlicmlkIFQgVVNCIFhTIEZNCiAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ub3J3b29kLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbm9yd29vZC5jCmluZGV4IGY5ZjJmYTIuLjllNjVmMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ub3J3b29kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5vcndvb2QuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTm9yd29vZCBNaWNybyAobm9uLVBybykgVFYgVHVuZXIKICAgIEJ5IFBldGVyIE5hdWxscyA8cGV0ZXJAY2hvY2t5Lm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ucGd0ZWNoLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbnBndGVjaC5jCmluZGV4IDRhYTU4OGIuLjY1ZDBjZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ucGd0ZWNoLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5wZ3RlY2guYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgbnBndGVjaFtdID0gewogCXsgMHgxZCwgS0VZX1NXSVRDSFZJREVPTU9ERSB9LAkvKiBzd2l0Y2ggaW5wdXRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGN0di1zZWRuYS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBjdHYtc2VkbmEuYwppbmRleCA3Y2RlZjZlLi5iZjJjYmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGN0di1zZWRuYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wY3R2LXNlZG5hLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIE1hcHBpbmcgZm9yIHRoZSAyOCBrZXkgcmVtb3RlIGNvbnRyb2wgYXMgc2VlbiBhdAogICAgaHR0cDovL3d3dy5zZWRuYWNvbXB1dGVyLmNvbS9waG90by9jYXJkYnVzLXR2LmpwZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLWNvbG9yLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtY29sb3IuYwppbmRleCAyM2I4YzUwLi5iNDZjZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtY29sb3IuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtY29sb3IuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgcGlubmFjbGVfY29sb3JbXSA9IHsKIAl7IDB4NTksIEtFWV9NVVRFIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtZ3JleS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLWdyZXkuYwppbmRleCA2YmE4YzM2Li5kNTI1ZGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtZ3JleS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waW5uYWNsZS1ncmV5LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHBpbm5hY2xlX2dyZXlbXSA9IHsKIAl7IDB4M2EsIEtFWV8wIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtcGN0di1oZC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLXBjdHYtaGQuYwppbmRleCA4ZDU1OGFlLi5hNDYwM2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtcGN0di1oZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waW5uYWNsZS1wY3R2LWhkLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIFBpbm5hY2xlIFBDVFYgSEQgODAwaSBtaW5pIHJlbW90ZSAqLwogCkBAIC0yMCw2ICsyMSw3IEBACiAJeyAweDA3MDEsIEtFWV9NRU5VIH0sIC8qIFBpbm5hY2xlIGxvZ28gKi8KIAl7IDB4MDczOSwgS0VZX1BPV0VSIH0sCiAJeyAweDA3MDMsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwNzA1LCBLRVlfT0sgfSwKIAl7IDB4MDcwOSwgS0VZX1ZPTFVNRURPV04gfSwKIAl7IDB4MDcwNiwgS0VZX0NIQU5ORUxVUCB9LAogCXsgMHgwNzBjLCBLRVlfQ0hBTk5FTERPV04gfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctMDAydC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy0wMDJ0LmMKaW5kZXggZTVhYjA3MS4uMzNlYjY0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy0wMDJ0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy0wMDJ0LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBLZXl0YWJsZSBmb3IgMDAyLVQgSVIgcmVtb3RlIHByb3ZpZGVkIHRvZ2V0aGVyIHdpdGggUGl4ZWx2aWV3CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGl4ZWx2aWV3LW1rMTIuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbWsxMi5jCmluZGV4IDEyNWZjMzkuLjIxZjRkZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbWsxMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbWsxMi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKgogICogS2V5dGFibGUgZm9yIE1LLUYxMiBJUiByZW1vdGUgcHJvdmlkZWQgdG9nZXRoZXIgd2l0aCBQaXhlbHZpZXcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbmV3LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGl4ZWx2aWV3LW5ldy5jCmluZGV4IGJkNzhkNmEuLmY5NDRhZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbmV3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy1uZXcuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy5jCmluZGV4IDA2MTg3ZTcuLmE2MDIwZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXcuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGl4ZWx2aWV3LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHBpeGVsdmlld1tdID0gewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcG93ZXJjb2xvci1yZWFsLWFuZ2VsLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcG93ZXJjb2xvci1yZWFsLWFuZ2VsLmMKaW5kZXggNWY5ZDU0Ni4uZTc0YzU3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBvd2VyY29sb3ItcmVhbC1hbmdlbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wb3dlcmNvbG9yLXJlYWwtYW5nZWwuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIFJlbW90ZSBjb250cm9sIGZvciBQb3dlcmNvbG9yIFJlYWwgQW5nZWwgMzMwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcHJvdGV1cy0yMzA5LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcHJvdGV1cy0yMzA5LmMKaW5kZXggOGEzYTY0My4uYWRlZTgwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXByb3RldXMtMjMwOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wcm90ZXVzLTIzMDkuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTWljaGFsIE1hamNocm93aWN6IDxtbWFqY2hyb3dpY3pAZ21haWwuY29tPiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcHVycGxldHYuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdXJwbGV0di5jCmluZGV4IGVmOTAyOTYuLjcyMjU5N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdXJwbGV0di5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdXJwbGV0di5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBwdXJwbGV0dltdID0gewogCXsgMHgwMywgS0VZX1BPV0VSIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcHY5NTEuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdjk1MS5jCmluZGV4IDVlOGJlZWUuLjAxMDVkNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdjk1MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdjk1MS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBNYXJrIFBoYWxhbiA8cGhhbGFubUBvMi5pZT4gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJjNi1tY2UuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yYzYtbWNlLmMKaW5kZXggYzM5MDdlMi4uNzUzZTQzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJjNi1tY2UuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcmM2LW1jZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSByYzZfbWNlW10gPSB7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yZWFsLWF1ZGlvLTIyMC0zMi1rZXlzLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcmVhbC1hdWRpby0yMjAtMzIta2V5cy5jCmluZGV4IDY4MTNkMTEuLjA3MzY5NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yZWFsLWF1ZGlvLTIyMC0zMi1rZXlzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJlYWwtYXVkaW8tMjIwLTMyLWtleXMuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogWm9naXMgUmVhbCBBdWRpbyAyMjAgLSAzMiBrZXlzIElSICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1zbmFwc3RyZWFtLWZpcmVmbHkuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1zbmFwc3RyZWFtLWZpcmVmbHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjE0NjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXNuYXBzdHJlYW0tZmlyZWZseS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogU25hcFN0cmVhbSBGaXJlZmx5IFgxMCBSRiByZW1vdGUga2V5dGFibGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUA/a2kuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHNuYXBzdHJlYW1fZmlyZWZseVtdID0geworCXsgMHhmMTJjLCBLRVlfWk9PTSB9LCAgICAgICAvKiBNYXhpbWl6ZSAqLworCXsgMHhjNzAyLCBLRVlfQ0xPU0UgfSwKKworCXsgMHhkMjBkLCBLRVlfMSB9LAorCXsgMHhkMzBlLCBLRVlfMiB9LAorCXsgMHhkNDBmLCBLRVlfMyB9LAorCXsgMHhkNTEwLCBLRVlfNCB9LAorCXsgMHhkNjExLCBLRVlfNSB9LAorCXsgMHhkNzEyLCBLRVlfNiB9LAorCXsgMHhkODEzLCBLRVlfNyB9LAorCXsgMHhkOTE0LCBLRVlfOCB9LAorCXsgMHhkYTE1LCBLRVlfOSB9LAorCXsgMHhkYzE3LCBLRVlfMCB9LAorCXsgMHhkYjE2LCBLRVlfQkFDSyB9LAorCXsgMHhkZDE4LCBLRVlfS1BFTlRFUiB9LCAgICAvKiBlbnQgKi8KKworCXsgMHhjZTA5LCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4Y2QwOCwgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4Y2YwYSwgS0VZX01VVEUgfSwKKwl7IDB4ZDAwYiwgS0VZX0NIQU5ORUxVUCB9LAorCXsgMHhkMTBjLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4YzUwMCwgS0VZX1ZFTkRPUiB9LCAgICAgLyogZmlyZWZseSAqLworCisJeyAweGYzMmUsIEtFWV9JTkZPIH0sCisJeyAweGY0MmYsIEtFWV9PUFRJT04gfSwKKworCXsgMHhlMjFkLCBLRVlfTEVGVCB9LAorCXsgMHhlNDFmLCBLRVlfUklHSFQgfSwKKwl7IDB4ZTcyMiwgS0VZX0RPV04gfSwKKwl7IDB4ZGYxYSwgS0VZX1VQIH0sCisJeyAweGUzMWUsIEtFWV9PSyB9LAorCisJeyAweGUxMWMsIEtFWV9NRU5VIH0sCisJeyAweGU1MjAsIEtFWV9FWElUIH0sCisKKwl7IDB4ZWMyNywgS0VZX1JFQ09SRCB9LAorCXsgMHhlYTI1LCBLRVlfUExBWSB9LAorCXsgMHhlZDI4LCBLRVlfU1RPUCB9LAorCXsgMHhlOTI0LCBLRVlfUkVXSU5EIH0sCisJeyAweGViMjYsIEtFWV9GT1JXQVJEIH0sCisJeyAweGVlMjksIEtFWV9QQVVTRSB9LAorCXsgMHhmMDJiLCBLRVlfUFJFVklPVVMgfSwKKwl7IDB4ZWYyYSwgS0VZX05FWFQgfSwKKworCXsgMHhjYjA2LCBLRVlfQVVESU8gfSwgICAgICAvKiBNdXNpYyAqLworCXsgMHhjYTA1LCBLRVlfSU1BR0VTIH0sICAgICAvKiBQaG90b3MgKi8KKwl7IDB4YzkwNCwgS0VZX0RWRCB9LAorCXsgMHhjODAzLCBLRVlfVFYgfSwKKwl7IDB4Y2MwNywgS0VZX1ZJREVPIH0sCisKKwl7IDB4YzYwMSwgS0VZX0hFTFAgfSwKKwl7IDB4ZjIyZCwgS0VZX01PREUgfSwgICAgICAgLyogTW91c2UgKi8KKworCXsgMHhkZTE5LCBLRVlfQSB9LAorCXsgMHhlMDFiLCBLRVlfQiB9LAorCXsgMHhlNjIxLCBLRVlfQyB9LAorCXsgMHhlODIzLCBLRVlfRCB9LAorfTsKKworc3RhdGljIHN0cnVjdCByY19tYXBfbGlzdCBzbmFwc3RyZWFtX2ZpcmVmbHlfbWFwID0geworCS5tYXAgPSB7CisJCS5zY2FuICAgID0gc25hcHN0cmVhbV9maXJlZmx5LAorCQkuc2l6ZSAgICA9IEFSUkFZX1NJWkUoc25hcHN0cmVhbV9maXJlZmx5KSwKKwkJLnJjX3R5cGUgPSBSQ19UWVBFX09USEVSLAorCQkubmFtZSAgICA9IFJDX01BUF9TTkFQU1RSRUFNX0ZJUkVGTFksCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9yY19tYXBfc25hcHN0cmVhbV9maXJlZmx5KHZvaWQpCit7CisJcmV0dXJuIHJjX21hcF9yZWdpc3Rlcigmc25hcHN0cmVhbV9maXJlZmx5X21hcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JjX21hcF9zbmFwc3RyZWFtX2ZpcmVmbHkodm9pZCkKK3sKKwlyY19tYXBfdW5yZWdpc3Rlcigmc25hcHN0cmVhbV9maXJlZmx5X21hcCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcmNfbWFwX3NuYXBzdHJlYW1fZmlyZWZseSkKK21vZHVsZV9leGl0KGV4aXRfcmNfbWFwX3NuYXBzdHJlYW1fZmlyZWZseSkKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBpa2kuZmk+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtc3RyZWFtemFwLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtc3RyZWFtemFwLmMKaW5kZXggOTJjYzEwZC4uZjlhMDc1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXN0cmVhbXphcC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1zdHJlYW16YXAuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgc3RyZWFtemFwW10gPSB7CiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRicy1uZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10YnMtbmVjLmMKaW5kZXggNzI0MmVlNi4uNTAzOWJlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRicy1uZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGJzLW5lYy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSB0YnNfbmVjW10gPSB7CiAJeyAweDg0LCBLRVlfUE9XRVIyfSwJCS8qIHBvd2VyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVjaG5pc2F0LXVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZWNobmlzYXQtdXNiMi5jCmluZGV4IDRhZmU1NzcuLmY5NzMzYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZWNobmlzYXQtdXNiMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZWNobmlzYXQtdXNiMi5jCkBAIC0zMCw2ICszMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSB0ZWNobmlzYXRfdXNiMltdID0gewogCXsweDBhMGMsIEtFWV9QT1dFUn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtY2luZXJneS14cy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRlcnJhdGVjLWNpbmVyZ3kteHMuYwppbmRleCBiYzM4ZTM0Li41MzYyOWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtY2luZXJneS14cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXJyYXRlYy1jaW5lcmd5LXhzLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIFRlcnJhdGVjIENpbmVyZ3kgSHlicmlkIFQgVVNCIFhTCiAgICBEZXZpbiBIZWl0bXVlbGxlciA8ZGhlaXRtdWVsbGVyQGxpbnV4dHYub3JnPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRlcnJhdGVjLXNsaW0tMi5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRlcnJhdGVjLXNsaW0tMi5jCmluZGV4IDQ0MDkzOTEuLjRjMTQ5ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXJyYXRlYy1zbGltLTIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtc2xpbS0yLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBUZXJyYVRlYyBzbGltIHJlbW90ZSwgNiByb3dzLCAzIGNvbHVtbnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtc2xpbS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRlcnJhdGVjLXNsaW0uYwppbmRleCAxYWJhZmE1Li4zZDhhMTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtc2xpbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXJyYXRlYy1zbGltLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIFRlcnJhVGVjIHNsaW0gcmVtb3RlLCA3IHJvd3MsIDQgY29sdW1ucy4gKi8KIC8qIFVzZXMgTkVDIGV4dGVuZGVkIDB4MDJiZC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXZpaS1uZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXZpaS1uZWMuYwppbmRleCBlZjViYTNmLi5mMmMzYjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGV2aWktbmVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRldmlpLW5lYy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSB0ZXZpaV9uZWNbXSA9IHsKIAl7IDB4MGEsIEtFWV9QT1dFUjJ9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRpdm8uYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10aXZvLmMKaW5kZXggOThhZDA4NS4uNDU0ZTA2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRpdm8uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGl2by5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIEluaXRpYWwgbWFwcGluZyBpcyBmb3IgdGhlIFRpVm8gcmVtb3RlIGluY2x1ZGVkIGluIHRoZSBOZXJvIExpcXVpZFRWIGJ1bmRsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10b3RhbC1tZWRpYS1pbi1oYW5kLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdG90YWwtbWVkaWEtaW4taGFuZC5jCmluZGV4IDIwYWM0ZTEuLjViOWY5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10b3RhbC1tZWRpYS1pbi1oYW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRvdGFsLW1lZGlhLWluLWhhbmQuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogVXNlcyBORUMgZXh0ZW5kZWQgMHgwMmJkICovCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSB0b3RhbF9tZWRpYV9pbl9oYW5kW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdHJla3N0b3IuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10cmVrc3Rvci5jCmluZGV4IGY4MTkwZWEuLmY5YTJlMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10cmVrc3Rvci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10cmVrc3Rvci5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBUcmVrU3RvciBEVkItVCBVU0IgU3RpY2sgcmVtb3RlIGNvbnRyb2xsZXIuICovCiAvKiBJbXBvcnRlZCBmcm9tIGFmOTAxNS5oLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR0LTE1MDAuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10dC0xNTAwLmMKaW5kZXggMjk1ZjM3My4uY2FlZmY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR0LTE1MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdHQtMTUwMC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBmb3IgdGhlIFRlY2hub3RyZW5kIDE1MDAgYnVuZGxlZCByZW1vdGVzIChncmV5IGFuZCBibGFjayk6ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10d2luaGFuMTAyNy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR3aW5oYW4xMDI3LmMKaW5kZXggOGJmOGRmNi4uNTA5Mjk5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR3aW5oYW4xMDI3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR3aW5oYW4xMDI3LmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHR3aW5oYW5fdnAxMDI3W10gPSB7CiAJeyAweDE2LCBLRVlfUE9XRVIyIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLW0xZi5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXZpZGVvbWF0ZS1tMWYuYwppbmRleCA0OTk0ZDQwLi4zYmQxZGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLW0xZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy12aWRlb21hdGUtbTFmLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHZpZGVvbWF0ZV9tMWZbXSA9IHsKIAl7IDB4MDEsIEtFWV9QT1dFUiB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXZpZGVvbWF0ZS1zMzUwLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXMzNTAuYwppbmRleCA5ZTQ3NGE2Li44YmZjM2U4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXMzNTAuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXMzNTAuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgdmlkZW9tYXRlX3MzNTBbXSA9IHsKIAl7IDB4MDAsIEtFWV9UVn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXR2LXB2ci5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXZpZGVvbWF0ZS10di1wdnIuYwppbmRleCA1ZjJhNDZlLi4zOTBjZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXR2LXB2ci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy12aWRlb21hdGUtdHYtcHZyLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHZpZGVvbWF0ZV90dl9wdnJbXSA9IHsKIAl7IDB4MTQsIEtFWV9NVVRFIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtd2luZmFzdC11c2JpaS1kZWx1eGUuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy13aW5mYXN0LXVzYmlpLWRlbHV4ZS5jCmluZGV4IGJkOGQwMjEuLjI4NTJiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy13aW5mYXN0LXVzYmlpLWRlbHV4ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy13aW5mYXN0LXVzYmlpLWRlbHV4ZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBMZWFkdGVrIFdpbmZhc3QgVFYgVVNCIElJIERlbHV4ZSByZW1vdGUKICAgIE1hZ251cyBBbG0gPG1hZ251cy5hbG1AZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXdpbmZhc3QuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy13aW5mYXN0LmMKaW5kZXggZDhhMzRjMS4uMmRmMWNiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXdpbmZhc3QuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtd2luZmFzdC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBUYWJsZSBmb3IgTGVhZHRlayBXaW5mYXN0IFJlbW90ZSBDb250cm9scyAtIHVzZWQgYnkgYm90aCBidHR2IGFuZCBjeDg4ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMgYi9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jCmluZGV4IDg1ZmY5YTEuLjYwZDNjMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBEcml2ZXIgZm9yIFVTQiBXaW5kb3dzIE1lZGlhIENlbnRlciBFZC4gZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXJzCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDEwIGJ5IEphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBKYXJvZCBXaWxzb24gPGphcm9kQHJlZGhhdC5jb20+CiAgKgogICogQmFzZWQgb24gdGhlIG9yaWdpbmFsIGxpcmNfbWNldXNiIGFuZCBsaXJjX21jZXVzYjIgZHJpdmVycywgYnkgRGFuCiAgKiBDb250aSwgTWFydGluIEJsYXR0ZXIgYW5kIERhbmllbCBNZWxhbmRlciwgdGhlIGxhdHRlciBvZiB3aGljaCB3YXMKQEAgLTE1LDYgKzE1LDExIEBACiAgKiBKb24gU21pcmwsIHdoaWNoIGluY2x1ZGVkIGVuaGFuY2VtZW50cyBhbmQgc2ltcGxpZmljYXRpb25zIHRvIHRoZQogICogaW5jb21pbmcgSVIgYnVmZmVyIHBhcnNpbmcgcm91dGluZXMuCiAgKgorICogVXBkYXRlZCBpbiBKdWx5IG9mIDIwMTEgd2l0aCB0aGUgYWlkIG9mIE1pY3Jvc29mdCdzIG9mZmljaWFsCisgKiByZW1vdGUvdHJhbnNjZWl2ZXIgcmVxdWlyZW1lbnRzIGFuZCBzcGVjaWZpY2F0aW9uIGRvY3VtZW50LCBmb3VuZCBhdAorICogZG93bmxvYWQubWljcm9zb2Z0LmNvbSwgdGl0bGUKKyAqIFdpbmRvd3MtTWVkaWEtQ2VudGVyLVJDLUlSLUNvbGxlY3Rpb24tR3JlZW4tQnV0dG9uLVNwZWNpZmljYXRpb24tMDMtMDgtMjAxMS1WMi5wZGYKKyAqCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zNywxMCArNDIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fd2FrZXVwLmg+CiAjaW5jbHVkZSA8bWVkaWEvcmMtY29yZS5oPgogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIxLjkxIgotI2RlZmluZSBEUklWRVJfQVVUSE9SCSJKYXJvZCBXaWxzb24gPGphcm9kQHdpbHNvbmV0LmNvbT4iCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIxLjkyIgorI2RlZmluZSBEUklWRVJfQVVUSE9SCSJKYXJvZCBXaWxzb24gPGphcm9kQHJlZGhhdC5jb20+IgogI2RlZmluZSBEUklWRVJfREVTQwkiV2luZG93cyBNZWRpYSBDZW50ZXIgRWQuIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICIgXAogCQkJImRldmljZSBkcml2ZXIiCiAjZGVmaW5lIERSSVZFUl9OQU1FCSJtY2V1c2IiCkBAIC02Myw0MyArNjksOTAgQEAKICNkZWZpbmUgTUNFX1BVTFNFX01BU0sJCTB4N2YgLyogUHVsc2UgbWFzayAqLwogI2RlZmluZSBNQ0VfTUFYX1BVTFNFX0xFTkdUSAkweDdmIC8qIExvbmdlc3QgdHJhbnNtaXR0YWJsZSBwdWxzZSBzeW1ib2wgKi8KIAotI2RlZmluZSBNQ0VfSFdfQ01EX0hFQURFUgkweGZmCS8qIE1DRSBoYXJkd2FyZSBjb21tYW5kIGhlYWRlciAqLwotI2RlZmluZSBNQ0VfQ09NTUFORF9IRUFERVIJMHg5ZgkvKiBNQ0UgY29tbWFuZCBoZWFkZXIgKi8KLSNkZWZpbmUgTUNFX0NPTU1BTkRfTUFTSwkweGUwCS8qIE1hc2sgb3V0IGNvbW1hbmQgYml0cyAqLwotI2RlZmluZSBNQ0VfQ09NTUFORF9OVUxMCTB4MDAJLyogVGhlc2Ugc2hvdyB1cCB2YXJpb3VzIHBsYWNlcy4uLiAqLwotLyogaWYgYnVmW2ldICYgTUNFX0NPTU1BTkRfTUFTSyA9PSAweDgwIGFuZCBidWZbaV0gIT0gTUNFX0NPTU1BTkRfSEVBREVSLAotICogdGhlbiB3ZSdyZSBsb29raW5nIGF0IGEgcmF3IElSIGRhdGEgc2FtcGxlICovCi0jZGVmaW5lIE1DRV9DT01NQU5EX0lSREFUQQkweDgwCi0jZGVmaW5lIE1DRV9QQUNLRVRfTEVOR1RIX01BU0sJMHgxZiAvKiBQYWNrZXQgbGVuZ3RoIG1hc2sgKi8KKy8qCisgKiBUaGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRoZSBJUiBoYXJkd2FyZSBpcyBjb21tYW5kLXJlc3BvbnNlCisgKiBiYXNlZC4gQWxsIGNvbW1hbmRzIGFuZCByZXNwb25zZXMgaGF2ZSBhIGNvbnNpc3RlbnQgZm9ybWF0LCB3aGVyZSBhIGxlYWQKKyAqIGJ5dGUgYWx3YXlzIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZGF0YSBmb2xsb3dpbmcgaXQuIFRoZSBsZWFkIGJ5dGUgaGFzCisgKiBhIHBvcnQgdmFsdWUgaW4gdGhlIDMgaGlnaGVzdCBiaXRzIGFuZCBhIGxlbmd0aCB2YWx1ZSBpbiB0aGUgNSBsb3dlc3QKKyAqIGJpdHMuCisgKgorICogVGhlIGxlbmd0aCBmaWVsZCBpcyBvdmVybG9hZGVkLCB3aXRoIGEgdmFsdWUgb2YgMTExMTEgaW5kaWNhdGluZyB0aGF0IHRoZQorICogZm9sbG93aW5nIGJ5dGUgaXMgYSBjb21tYW5kIG9yIHJlc3BvbnNlIGNvZGUsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKKyAqIG1lc3NhZ2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29kZS4gSWYgdGhlIGxlbmd0aCBmaWVsZCBpcyBub3QgMTExMTEsIHRoZW4KKyAqIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHBvcnQgZGF0YSB0aGF0IGZvbGxvdy4KKyAqLworI2RlZmluZSBNQ0VfQ01ECQkJMHgxZgorI2RlZmluZSBNQ0VfUE9SVF9JUgkJMHg0CS8qICgweDQgPDwgNSkgfCBNQ0VfQ01EID0gMHg5ZiAqLworI2RlZmluZSBNQ0VfUE9SVF9TWVMJCTB4NwkvKiAoMHg3IDw8IDUpIHwgTUNFX0NNRCA9IDB4ZmYgKi8KKyNkZWZpbmUgTUNFX1BPUlRfU0VSCQkweDYJLyogMHhjMCB0aHJ1IDB4ZGYgZmx1c2ggJiAweDFmIGJ5dGVzICovCisjZGVmaW5lIE1DRV9QT1JUX01BU0sJMHhlMAkvKiBNYXNrIG91dCBjb21tYW5kIGJpdHMgKi8KIAotLyogU3ViLWNvbW1hbmRzLCB3aGljaCBmb2xsb3cgTUNFX0NPTU1BTkRfSEVBREVSIG9yIE1DRV9IV19DTURfSEVBREVSICovCisvKiBDb21tYW5kIHBvcnQgaGVhZGVycyAqLworI2RlZmluZSBNQ0VfQ01EX1BPUlRfSVIJCTB4OWYJLyogSVItcmVsYXRlZCBjbWQvcnNwICovCisjZGVmaW5lIE1DRV9DTURfUE9SVF9TWVMJMHhmZgkvKiBTeXN0ZW0gKG5vbi1JUikgZGV2aWNlIGNtZC9yc3AgKi8KKworLyogQ29tbWFuZHMgdGhhdCBzZXQgZGV2aWNlIHN0YXRlICAoMi00IGJ5dGVzIGluIGxlbmd0aCkgKi8KKyNkZWZpbmUgTUNFX0NNRF9SRVNFVAkJMHhmZQkvKiBSZXNldCBkZXZpY2UsIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX0NNRF9SRVNVTUUJCTB4YWEJLyogUmVzdW1lIGRldmljZSBhZnRlciBlcnJvciwgMiBieXRlcyAqLworI2RlZmluZSBNQ0VfQ01EX1NFVElSQ0ZTCTB4MDYJLyogU2V0IHR4IGNhcnJpZXIsIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX0NNRF9TRVRJUlRJTUVPVVQJMHgwYwkvKiBTZXQgdGltZW91dCwgNCBieXRlcyAqLworI2RlZmluZSBNQ0VfQ01EX1NFVElSVFhQT1JUUwkweDA4CS8qIFNldCB0eCBwb3J0cywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfQ01EX1NFVElSUlhQT1JURU4JMHgxNAkvKiBTZXQgcnggcG9ydHMsIDMgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX0NNRF9GTEFTSExFRAkweDIzCS8qIEZsYXNoIHJlY2VpdmVyIExFRCwgMiBieXRlcyAqLworCisvKiBDb21tYW5kcyB0aGF0IHF1ZXJ5IGRldmljZSBzdGF0ZSAoYWxsIDIgYnl0ZXMsIHVubGVzcyBub3RlZCkgKi8KKyNkZWZpbmUgTUNFX0NNRF9HRVRJUkNGUwkweDA3CS8qIEdldCBjYXJyaWVyICovCisjZGVmaW5lIE1DRV9DTURfR0VUSVJUSU1FT1VUCTB4MGQJLyogR2V0IHRpbWVvdXQgKi8KKyNkZWZpbmUgTUNFX0NNRF9HRVRJUlRYUE9SVFMJMHgxMwkvKiBHZXQgdHggcG9ydHMgKi8KKyNkZWZpbmUgTUNFX0NNRF9HRVRJUlJYUE9SVEVOCTB4MTUJLyogR2V0IHJ4IHBvcnRzICovCisjZGVmaW5lIE1DRV9DTURfR0VUUE9SVFNUQVRVUwkweDExCS8qIEdldCB0eCBwb3J0IHN0YXR1cywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfQ01EX0dFVElSTlVNUE9SVFMJMHgxNgkvKiBHZXQgbnVtYmVyIG9mIHBvcnRzICovCisjZGVmaW5lIE1DRV9DTURfR0VUV0FLRVNPVVJDRQkweDE3CS8qIEdldCB3YWtlIHNvdXJjZSAqLworI2RlZmluZSBNQ0VfQ01EX0dFVEVNVkVSCTB4MjIJLyogR2V0IGVtdWxhdG9yIGludGVyZmFjZSB2ZXJzaW9uICovCisjZGVmaW5lIE1DRV9DTURfR0VUREVWREVUQUlMUwkweDIxCS8qIEdldCBkZXZpY2UgZGV0YWlscyAoZW0gdmVyMiBvbmx5KSAqLworI2RlZmluZSBNQ0VfQ01EX0dFVFdBS0VTVVBQT1JUCTB4MjAJLyogR2V0IHdha2UgZGV0YWlscyAoZW0gdmVyMiBvbmx5KSAqLworI2RlZmluZSBNQ0VfQ01EX0dFVFdBS0VWRVJTSU9OCTB4MTgJLyogR2V0IHdha2UgcGF0dGVybiAoZW0gdmVyMiBvbmx5KSAqLworCisvKiBNaXNjIGNvbW1hbmRzICovCisjZGVmaW5lIE1DRV9DTURfTk9QCQkweGZmCS8qIE5vIG9wZXJhdGlvbiAqLworCisvKiBSZXNwb25zZXMgdG8gY29tbWFuZHMgKG5vbi1lcnJvciBjYXNlcykgKi8KKyNkZWZpbmUgTUNFX1JTUF9FUUlSQ0ZTCQkweDA2CS8qIHR4IGNhcnJpZXIsIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9FUUlSVElNRU9VVAkweDBjCS8qIHJ4IHRpbWVvdXQsIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9HRVRXQUtFU09VUkNFCTB4MTcJLyogd2FrZSBzb3VyY2UsIDMgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9FUUlSVFhQT1JUUwkweDA4CS8qIHR4IHBvcnQgbWFzaywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRSVJSWFBPUlRFTgkweDE0CS8qIHJ4IHBvcnQgbWFzaywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0dFVFBPUlRTVEFUVVMJMHgxMQkvKiB0eCBwb3J0IHN0YXR1cywgNyBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRSVJSWENGQ05UCTB4MTUJLyogcnggY2FycmllciBjb3VudCwgNCBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRSVJOVU1QT1JUUwkweDE2CS8qIG51bWJlciBvZiBwb3J0cywgNCBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRV0FLRVNVUFBPUlQJMHgyMAkvKiB3YWtlIGNhcGFiaWxpdGllcywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRV0FLRVZFUlNJT04JMHgxOAkvKiB3YWtlIHBhdHRlcm4gZGV0YWlscywgNiBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRREVWREVUQUlMUwkweDIxCS8qIGRldmljZSBjYXBhYmlsaXRpZXMsIDMgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9FUUVNVkVSCQkweDIyCS8qIGVtdWxhdG9yIGludGVyZmFjZSB2ZXIsIDMgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9GTEFTSExFRAkweDIzCS8qIHN1Y2Nlc3MgZmxhc2hpbmcgTEVELCAyIGJ5dGVzICovCisKKy8qIFJlc3BvbnNlcyB0byBlcnJvciBjYXNlcywgbXVzdCBzZW5kIE1DRV9DTURfUkVTVU1FIHRvIGNsZWFyIHRoZW0gKi8KKyNkZWZpbmUgTUNFX1JTUF9DTURfSUxMRUdBTAkweGZlCS8qIGlsbGVnYWwgY29tbWFuZCBmb3IgcG9ydCwgMiBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX1RYX1RJTUVPVVQJMHg4MQkvKiB0eCB0aW1lZCBvdXQsIDIgYnl0ZXMgKi8KKworLyogTWlzYyBjb21tYW5kcy9yZXNwb25zZXMgbm90IGRlZmluZWQgaW4gdGhlIE1DRSByZW1vdGUvdHJhbnNjZWl2ZXIgc3BlYyAqLwogI2RlZmluZSBNQ0VfQ01EX1NJR19FTkQJCTB4MDEJLyogRW5kIG9mIHNpZ25hbCAqLwogI2RlZmluZSBNQ0VfQ01EX1BJTkcJCTB4MDMJLyogUGluZyBkZXZpY2UgKi8KICNkZWZpbmUgTUNFX0NNRF9VTktOT1dOCQkweDA0CS8qIFVua25vd24gKi8KICNkZWZpbmUgTUNFX0NNRF9VTktOT1dOMgkweDA1CS8qIFVua25vd24gKi8KLSNkZWZpbmUgTUNFX0NNRF9TX0NBUlJJRVIJMHgwNgkvKiBTZXQgVFggY2FycmllciBmcmVxdWVuY3kgKi8KLSNkZWZpbmUgTUNFX0NNRF9HX0NBUlJJRVIJMHgwNwkvKiBHZXQgVFggY2FycmllciBmcmVxdWVuY3kgKi8KLSNkZWZpbmUgTUNFX0NNRF9TX1RYTUFTSwkweDA4CS8qIFNldCBUWCBwb3J0IGJpdG1hc2sgKi8KICNkZWZpbmUgTUNFX0NNRF9VTktOT1dOMwkweDA5CS8qIFVua25vd24gKi8KICNkZWZpbmUgTUNFX0NNRF9VTktOT1dONAkweDBhCS8qIFVua25vd24gKi8KICNkZWZpbmUgTUNFX0NNRF9HX1JFVklTSU9OCTB4MGIJLyogR2V0IGh3L3N3IHJldmlzaW9uICovCi0jZGVmaW5lIE1DRV9DTURfU19USU1FT1VUCTB4MGMJLyogU2V0IFJYIHRpbWVvdXQgdmFsdWUgKi8KLSNkZWZpbmUgTUNFX0NNRF9HX1RJTUVPVVQJMHgwZAkvKiBHZXQgUlggdGltZW91dCB2YWx1ZSAqLwogI2RlZmluZSBNQ0VfQ01EX1VOS05PV041CTB4MGUJLyogVW5rbm93biAqLwogI2RlZmluZSBNQ0VfQ01EX1VOS05PV042CTB4MGYJLyogVW5rbm93biAqLwotI2RlZmluZSBNQ0VfQ01EX0dfUlhQT1JUU1RTCTB4MTEJLyogR2V0IFJYIHBvcnQgc3RhdHVzICovCi0jZGVmaW5lIE1DRV9DTURfR19UWE1BU0sJMHgxMwkvKiBTZXQgVFggcG9ydCBiaXRtYXNrICovCi0jZGVmaW5lIE1DRV9DTURfU19SWFNFTlNPUgkweDE0CS8qIFNldCBSWCBzZW5zb3IgKHN0ZC9sZWFybmluZykgKi8KLSNkZWZpbmUgTUNFX0NNRF9HX1JYU0VOU09SCTB4MTUJLyogR2V0IFJYIHNlbnNvciAoc3RkL2xlYXJuaW5nKSAqLwotI2RlZmluZSBNQ0VfUlNQX1BVTFNFX0NPVU5UCTB4MTUJLyogUlggcHVsc2UgY291bnQgKG9ubHkgaWYgbGVhcm5pbmcpICovCi0jZGVmaW5lIE1DRV9DTURfVFhfUE9SVFMJMHgxNgkvKiBHZXQgbnVtYmVyIG9mIFRYIHBvcnRzICovCi0jZGVmaW5lIE1DRV9DTURfR19XQUtFU1JDCTB4MTcJLyogR2V0IHdha2Ugc291cmNlICovCi0jZGVmaW5lIE1DRV9DTURfVU5LTk9XTjcJMHgxOAkvKiBVbmtub3duICovCiAjZGVmaW5lIE1DRV9DTURfVU5LTk9XTjgJMHgxOQkvKiBVbmtub3duICovCiAjZGVmaW5lIE1DRV9DTURfVU5LTk9XTjkJMHgxYgkvKiBVbmtub3duICovCi0jZGVmaW5lIE1DRV9DTURfREVWSUNFX1JFU0VUCTB4YWEJLyogUmVzZXQgdGhlIGhhcmR3YXJlICovCi0jZGVmaW5lIE1DRV9SU1BfQ01EX0lOVkFMSUQJMHhmZQkvKiBJbnZhbGlkIGNvbW1hbmQgaXNzdWVkICovCisjZGVmaW5lIE1DRV9DTURfTlVMTAkJMHgwMAkvKiBUaGVzZSBzaG93IHVwIHZhcmlvdXMgcGxhY2VzLi4uICovCiAKKy8qIGlmIGJ1ZltpXSAmIE1DRV9QT1JUX01BU0sgPT0gMHg4MCBhbmQgYnVmW2ldICE9IE1DRV9DTURfUE9SVF9JUiwKKyAqIHRoZW4gd2UncmUgbG9va2luZyBhdCBhIHJhdyBJUiBkYXRhIHNhbXBsZSAqLworI2RlZmluZSBNQ0VfQ09NTUFORF9JUkRBVEEJMHg4MAorI2RlZmluZSBNQ0VfUEFDS0VUX0xFTkdUSF9NQVNLCTB4MWYgLyogUGFja2V0IGxlbmd0aCBtYXNrICovCiAKIC8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCiAjaWZkZWYgQ09ORklHX1VTQl9ERUJVRwpAQCAtMzg4LDQ4ICs0NDEsMzcgQEAKIAljaGFyIG5hbWVbMTI4XTsKIAljaGFyIHBoeXNbNjRdOwogCWVudW0gbWNldXNiX21vZGVsX3R5cGUgbW9kZWw7CisKKwlib29sIG5lZWRfcmVzZXQ7CS8qIGZsYWcgdG8gaXNzdWUgYSBkZXZpY2UgcmVzdW1lIGNtZCAqLworCXU4IGVtdmVyOwkJLyogZW11bGF0b3IgaW50ZXJmYWNlIHZlcnNpb24gKi8KKwl1OCBudW1fdHhwb3J0czsJCS8qIG51bWJlciBvZiB0cmFuc21pdCBwb3J0cyAqLworCXU4IG51bV9yeHBvcnRzOwkJLyogbnVtYmVyIG9mIHJlY2VpdmUgc2Vuc29ycyAqLworCXU4IHR4cG9ydHNfY2FibGVkOwkvKiBiaXRtYXNrIG9mIHRyYW5zbWl0dGVycyB3aXRoIGNhYmxlICovCisJdTggcnhwb3J0c19hY3RpdmU7CS8qIGJpdG1hc2sgb2YgYWN0aXZlIHJlY2VpdmUgc2Vuc29ycyAqLwogfTsKIAotLyoKLSAqIE1DRSBEZXZpY2UgQ29tbWFuZCBTdHJpbmdzCi0gKiBEZXZpY2UgY29tbWFuZCByZXNwb25zZXMgdmFyeSBmcm9tIGRldmljZSB0byBkZXZpY2UuLi4KLSAqIC0gREVWSUNFX1JFU0VUIHJlc2V0cyB0aGUgaGFyZHdhcmUgdG8gaXRzIGRlZmF1bHQgc3RhdGUKLSAqIC0gR0VUX1JFVklTSU9OIGZldGNoZXMgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIHJldmlzaW9uLCBjb21tb24KLSAqICAgcmVwbGllcyBhcmUgZmYgMGIgNDUgZmYgMWIgMDggYW5kIGZmIDBiIDUwIGZmIDFiIDQyCi0gKiAtIEdFVF9DQVJSSUVSX0ZSRVEgZ2V0cyB0aGUgY2FycmllciBtb2RlIGFuZCBmcmVxdWVuY3kgb2YgdGhlCi0gKiAgIGRldmljZSwgd2l0aCByZXBsaWVzIGluIHRoZSBmb3JtIG9mIDlmIDA2IE1NIEZGLCB3aGVyZSBNTSBpcyAwLTMsCi0gKiAgIG1lYW5pbmcgY2xrIG9mIDEwMDAwMDAwLCAyNTAwMDAwLCA2MjUwMDAgb3IgMTU2MjUwLCBhbmQgRkYgaXMKLSAqICAgKChjbGsgLyBmcmVxdWVuY3kpIC0gMSkKLSAqIC0gR0VUX1JYX1RJTUVPVVQgZmV0Y2hlcyB0aGUgcmVjZWl2ZXIgdGltZW91dCBpbiB1bml0cyBvZiA1MHVzLAotICogICByZXNwb25zZSBpbiB0aGUgZm9ybSBvZiA5ZiAwYyBtc2IgbHNiCi0gKiAtIEdFVF9UWF9CSVRNQVNLIGZldGNoZXMgdGhlIHRyYW5zbWl0dGVyIGJpdG1hc2ssIHJlcGxpZXMgaW4KLSAqICAgdGhlIGZvcm0gb2YgOWYgMDggYm0sIHdoZXJlIGJtIGlzIHRoZSBiaXRtYXNrCi0gKiAtIEdFVF9SWF9TRU5TT1IgZmV0Y2hlcyB0aGUgUlggc2Vuc29yIHNldHRpbmcgLS0gbG9uZy1yYW5nZQotICogICBnZW5lcmFsIHVzZSBvbmUgb3Igc2hvcnQtcmFuZ2UgbGVhcm5pbmcgb25lLCBpbiB0aGUgZm9ybSBvZgotICogICA5ZiAxNCBzcywgd2hlcmUgc3MgaXMgZWl0aGVyIDAxIGZvciBsb25nLXJhbmdlIG9yIDAyIGZvciBzaG9ydAotICogLSBTRVRfQ0FSUklFUl9GUkVRIHNldHMgYSBuZXcgY2FycmllciBtb2RlIGFuZCBmcmVxdWVuY3kKLSAqIC0gU0VUX1RYX0JJVE1BU0sgc2V0cyB0aGUgdHJhbnNtaXR0ZXIgYml0bWFzawotICogLSBTRVRfUlhfVElNRU9VVCBzZXRzIHRoZSByZWNlaXZlciB0aW1lb3V0Ci0gKiAtIFNFVF9SWF9TRU5TT1Igc2V0cyB3aGljaCByZWNlaXZlciBzZW5zb3IgdG8gdXNlCi0gKi8KLXN0YXRpYyBjaGFyIERFVklDRV9SRVNFVFtdCT0ge01DRV9DT01NQU5EX05VTEwsIE1DRV9IV19DTURfSEVBREVSLAotCQkJCSAgIE1DRV9DTURfREVWSUNFX1JFU0VUfTsKLXN0YXRpYyBjaGFyIEdFVF9SRVZJU0lPTltdCT0ge01DRV9IV19DTURfSEVBREVSLCBNQ0VfQ01EX0dfUkVWSVNJT059Owotc3RhdGljIGNoYXIgR0VUX1VOS05PV05bXQk9IHtNQ0VfSFdfQ01EX0hFQURFUiwgTUNFX0NNRF9VTktOT1dON307Ci1zdGF0aWMgY2hhciBHRVRfVU5LTk9XTjJbXQk9IHtNQ0VfQ09NTUFORF9IRUFERVIsIE1DRV9DTURfVU5LTk9XTjJ9Owotc3RhdGljIGNoYXIgR0VUX0NBUlJJRVJfRlJFUVtdCT0ge01DRV9DT01NQU5EX0hFQURFUiwgTUNFX0NNRF9HX0NBUlJJRVJ9Owotc3RhdGljIGNoYXIgR0VUX1JYX1RJTUVPVVRbXQk9IHtNQ0VfQ09NTUFORF9IRUFERVIsIE1DRV9DTURfR19USU1FT1VUfTsKLXN0YXRpYyBjaGFyIEdFVF9UWF9CSVRNQVNLW10JPSB7TUNFX0NPTU1BTkRfSEVBREVSLCBNQ0VfQ01EX0dfVFhNQVNLfTsKLXN0YXRpYyBjaGFyIEdFVF9SWF9TRU5TT1JbXQk9IHtNQ0VfQ09NTUFORF9IRUFERVIsIE1DRV9DTURfR19SWFNFTlNPUn07CisvKiBNQ0UgRGV2aWNlIENvbW1hbmQgU3RyaW5ncywgZ2VuZXJhbGx5IGEgcG9ydCBhbmQgY29tbWFuZCBwYWlyICovCitzdGF0aWMgY2hhciBERVZJQ0VfUkVTVU1FW10JPSB7TUNFX0NNRF9OVUxMLCBNQ0VfQ01EX1BPUlRfU1lTLAorCQkJCSAgIE1DRV9DTURfUkVTVU1FfTsKK3N0YXRpYyBjaGFyIEdFVF9SRVZJU0lPTltdCT0ge01DRV9DTURfUE9SVF9TWVMsIE1DRV9DTURfR19SRVZJU0lPTn07CitzdGF0aWMgY2hhciBHRVRfRU1WRVJbXQkJPSB7TUNFX0NNRF9QT1JUX1NZUywgTUNFX0NNRF9HRVRFTVZFUn07CitzdGF0aWMgY2hhciBHRVRfV0FLRVZFUlNJT05bXQk9IHtNQ0VfQ01EX1BPUlRfU1lTLCBNQ0VfQ01EX0dFVFdBS0VWRVJTSU9OfTsKK3N0YXRpYyBjaGFyIEZMQVNIX0xFRFtdCQk9IHtNQ0VfQ01EX1BPUlRfU1lTLCBNQ0VfQ01EX0ZMQVNITEVEfTsKK3N0YXRpYyBjaGFyIEdFVF9VTktOT1dOMltdCT0ge01DRV9DTURfUE9SVF9JUiwgTUNFX0NNRF9VTktOT1dOMn07CitzdGF0aWMgY2hhciBHRVRfQ0FSUklFUl9GUkVRW10JPSB7TUNFX0NNRF9QT1JUX0lSLCBNQ0VfQ01EX0dFVElSQ0ZTfTsKK3N0YXRpYyBjaGFyIEdFVF9SWF9USU1FT1VUW10JPSB7TUNFX0NNRF9QT1JUX0lSLCBNQ0VfQ01EX0dFVElSVElNRU9VVH07CitzdGF0aWMgY2hhciBHRVRfTlVNX1BPUlRTW10JPSB7TUNFX0NNRF9QT1JUX0lSLCBNQ0VfQ01EX0dFVElSTlVNUE9SVFN9Oworc3RhdGljIGNoYXIgR0VUX1RYX0JJVE1BU0tbXQk9IHtNQ0VfQ01EX1BPUlRfSVIsIE1DRV9DTURfR0VUSVJUWFBPUlRTfTsKK3N0YXRpYyBjaGFyIEdFVF9SWF9TRU5TT1JbXQk9IHtNQ0VfQ01EX1BPUlRfSVIsIE1DRV9DTURfR0VUSVJSWFBPUlRFTn07CiAvKiBzdWIgaW4gZGVzaXJlZCB2YWx1ZXMgaW4gbG93ZXIgYnl0ZSBvciBieXRlcyBmb3IgZnVsbCBjb21tYW5kICovCiAvKiBGSVhNRTogbWFrZSB1c2Ugb2YgdGhlc2UgZm9yIHRyYW5zbWl0Lgotc3RhdGljIGNoYXIgU0VUX0NBUlJJRVJfRlJFUVtdCT0ge01DRV9DT01NQU5EX0hFQURFUiwKLQkJCQkgICBNQ0VfQ01EX1NfQ0FSUklFUiwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgY2hhciBTRVRfVFhfQklUTUFTS1tdCT0ge01DRV9DT01NQU5EX0hFQURFUiwgTUNFX0NNRF9TX1RYTUFTSywgMHgwMH07Ci1zdGF0aWMgY2hhciBTRVRfUlhfVElNRU9VVFtdCT0ge01DRV9DT01NQU5EX0hFQURFUiwKLQkJCQkgICBNQ0VfQ01EX1NfVElNRU9VVCwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgY2hhciBTRVRfUlhfU0VOU09SW10JPSB7TUNFX0NPTU1BTkRfSEVBREVSLAotCQkJCSAgIE1DRV9DTURfU19SWFNFTlNPUiwgMHgwMH07CitzdGF0aWMgY2hhciBTRVRfQ0FSUklFUl9GUkVRW10JPSB7TUNFX0NNRF9QT1JUX0lSLAorCQkJCSAgIE1DRV9DTURfU0VUSVJDRlMsIDB4MDAsIDB4MDB9Oworc3RhdGljIGNoYXIgU0VUX1RYX0JJVE1BU0tbXQk9IHtNQ0VfQ01EX1BPUlRfSVIsIE1DRV9DTURfU0VUSVJUWFBPUlRTLCAweDAwfTsKK3N0YXRpYyBjaGFyIFNFVF9SWF9USU1FT1VUW10JPSB7TUNFX0NNRF9QT1JUX0lSLAorCQkJCSAgIE1DRV9DTURfU0VUSVJUSU1FT1VULCAweDAwLCAweDAwfTsKK3N0YXRpYyBjaGFyIFNFVF9SWF9TRU5TT1JbXQk9IHtNQ0VfQ01EX1BPUlRfSVIsCisJCQkJICAgTUNFX1JTUF9FUUlSUlhQT1JURU4sIDB4MDB9OwogKi8KIAogc3RhdGljIGludCBtY2V1c2JfY21kc2l6ZSh1OCBjbWQsIHU4IHN1YmNtZCkKQEAgLTQzNywyNyArNDc5LDMzIEBACiAJaW50IGRhdGFzaXplID0gMDsKIAogCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBNQ0VfQ09NTUFORF9OVUxMOgotCQlpZiAoc3ViY21kID09IE1DRV9IV19DTURfSEVBREVSKQorCWNhc2UgTUNFX0NNRF9OVUxMOgorCQlpZiAoc3ViY21kID09IE1DRV9DTURfUE9SVF9TWVMpCiAJCQlkYXRhc2l6ZSA9IDE7CiAJCWJyZWFrOwotCWNhc2UgTUNFX0hXX0NNRF9IRUFERVI6CisJY2FzZSBNQ0VfQ01EX1BPUlRfU1lTOgogCQlzd2l0Y2ggKHN1YmNtZCkgeworCQljYXNlIE1DRV9SU1BfRVFXQUtFVkVSU0lPTjoKKwkJCWRhdGFzaXplID0gNDsKKwkJCWJyZWFrOwogCQljYXNlIE1DRV9DTURfR19SRVZJU0lPTjoKIAkJCWRhdGFzaXplID0gMjsKIAkJCWJyZWFrOworCQljYXNlIE1DRV9SU1BfRVFXQUtFU1VQUE9SVDoKKwkJCWRhdGFzaXplID0gMTsKKwkJCWJyZWFrOwogCQl9Ci0JY2FzZSBNQ0VfQ09NTUFORF9IRUFERVI6CisJY2FzZSBNQ0VfQ01EX1BPUlRfSVI6CiAJCXN3aXRjaCAoc3ViY21kKSB7CiAJCWNhc2UgTUNFX0NNRF9VTktOT1dOOgotCQljYXNlIE1DRV9DTURfU19DQVJSSUVSOgotCQljYXNlIE1DRV9DTURfU19USU1FT1VUOgotCQljYXNlIE1DRV9SU1BfUFVMU0VfQ09VTlQ6CisJCWNhc2UgTUNFX1JTUF9FUUlSQ0ZTOgorCQljYXNlIE1DRV9SU1BfRVFJUlRJTUVPVVQ6CisJCWNhc2UgTUNFX1JTUF9FUUlSUlhDRkNOVDoKIAkJCWRhdGFzaXplID0gMjsKIAkJCWJyZWFrOwogCQljYXNlIE1DRV9DTURfU0lHX0VORDoKLQkJY2FzZSBNQ0VfQ01EX1NfVFhNQVNLOgotCQljYXNlIE1DRV9DTURfU19SWFNFTlNPUjoKKwkJY2FzZSBNQ0VfUlNQX0VRSVJUWFBPUlRTOgorCQljYXNlIE1DRV9SU1BfRVFJUlJYUE9SVEVOOgogCQkJZGF0YXNpemUgPSAxOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQ3MCw5ICs1MTgsMTAgQEAKIHsKIAljaGFyIGNvZGVzW1VTQl9CVUZMRU4gKiAzICsgMV07CiAJY2hhciBpbm91dFs5XTsKLQl1OCBjbWQsIHN1YmNtZCwgZGF0YTEsIGRhdGEyOworCXU4IGNtZCwgc3ViY21kLCBkYXRhMSwgZGF0YTIsIGRhdGEzLCBkYXRhNCwgZGF0YTU7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaXItPmRldjsKIAlpbnQgaSwgc3RhcnQsIHNraXAgPSAwOworCXUzMiBjYXJyaWVyLCBwZXJpb2Q7CiAKIAlpZiAoIWRlYnVnKQogCQlyZXR1cm47CkBAIC01MDAsMTggKzU0OSwyOCBAQAogCXN1YmNtZCA9IGJ1ZltzdGFydCArIDFdICYgMHhmZjsKIAlkYXRhMSAgPSBidWZbc3RhcnQgKyAyXSAmIDB4ZmY7CiAJZGF0YTIgID0gYnVmW3N0YXJ0ICsgM10gJiAweGZmOworCWRhdGEzICA9IGJ1ZltzdGFydCArIDRdICYgMHhmZjsKKwlkYXRhNCAgPSBidWZbc3RhcnQgKyA1XSAmIDB4ZmY7CisJZGF0YTUgID0gYnVmW3N0YXJ0ICsgNl0gJiAweGZmOwogCiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIE1DRV9DT01NQU5EX05VTEw6Ci0JCWlmICgoc3ViY21kID09IE1DRV9IV19DTURfSEVBREVSKSAmJgotCQkgICAgKGRhdGExID09IE1DRV9DTURfREVWSUNFX1JFU0VUKSkKLQkJCWRldl9pbmZvKGRldiwgIkRldmljZSByZXNldCByZXF1ZXN0ZWRcbiIpOworCWNhc2UgTUNFX0NNRF9OVUxMOgorCQlpZiAoc3ViY21kID09IE1DRV9DTURfTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoKHN1YmNtZCA9PSBNQ0VfQ01EX1BPUlRfU1lTKSAmJgorCQkgICAgKGRhdGExID09IE1DRV9DTURfUkVTVU1FKSkKKwkJCWRldl9pbmZvKGRldiwgIkRldmljZSByZXN1bWUgcmVxdWVzdGVkXG4iKTsKIAkJZWxzZQogCQkJZGV2X2luZm8oZGV2LCAiVW5rbm93biBjb21tYW5kIDB4JTAyeCAweCUwMnhcbiIsCiAJCQkJIGNtZCwgc3ViY21kKTsKIAkJYnJlYWs7Ci0JY2FzZSBNQ0VfSFdfQ01EX0hFQURFUjoKKwljYXNlIE1DRV9DTURfUE9SVF9TWVM6CiAJCXN3aXRjaCAoc3ViY21kKSB7CisJCWNhc2UgTUNFX1JTUF9FUUVNVkVSOgorCQkJaWYgKCFvdXQpCisJCQkJZGV2X2luZm8oZGV2LCAiRW11bGF0b3IgaW50ZXJmYWNlIHZlcnNpb24gJXhcbiIsCisJCQkJCSBkYXRhMSk7CisJCQlicmVhazsKIAkJY2FzZSBNQ0VfQ01EX0dfUkVWSVNJT046CiAJCQlpZiAobGVuID09IDIpCiAJCQkJZGV2X2luZm8oZGV2LCAiR2V0IGh3L3N3IHJldj9cbiIpOwpAQCAtNTIwLDIxICs1NzksMzUgQEAKIAkJCQkJICIweCUwMnggMHglMDJ4XG4iLCBkYXRhMSwgZGF0YTIsCiAJCQkJCSBidWZbc3RhcnQgKyA0XSwgYnVmW3N0YXJ0ICsgNV0pOwogCQkJYnJlYWs7Ci0JCWNhc2UgTUNFX0NNRF9ERVZJQ0VfUkVTRVQ6Ci0JCQlkZXZfaW5mbyhkZXYsICJEZXZpY2UgcmVzZXQgcmVxdWVzdGVkXG4iKTsKKwkJY2FzZSBNQ0VfQ01EX1JFU1VNRToKKwkJCWRldl9pbmZvKGRldiwgIkRldmljZSByZXN1bWUgcmVxdWVzdGVkXG4iKTsKIAkJCWJyZWFrOwotCQljYXNlIE1DRV9SU1BfQ01EX0lOVkFMSUQ6Ci0JCQlkZXZfaW5mbyhkZXYsICJQcmV2aW91cyBjb21tYW5kIG5vdCBzdXBwb3J0ZWRcbiIpOworCQljYXNlIE1DRV9SU1BfQ01EX0lMTEVHQUw6CisJCQlkZXZfaW5mbyhkZXYsICJJbGxlZ2FsIFBPUlRfU1lTIGNvbW1hbmRcbiIpOwogCQkJYnJlYWs7Ci0JCWNhc2UgTUNFX0NNRF9VTktOT1dONzoKLQkJY2FzZSBNQ0VfQ01EX1VOS05PV045OgorCQljYXNlIE1DRV9SU1BfRVFXQUtFVkVSU0lPTjoKKwkJCWlmICghb3V0KQorCQkJCWRldl9pbmZvKGRldiwgIldha2UgdmVyc2lvbiwgcHJvdG86IDB4JTAyeCwgIgorCQkJCQkgInBheWxvYWQ6IDB4JTAyeCwgYWRkcmVzczogMHglMDJ4LCAiCisJCQkJCSAidmVyc2lvbjogMHglMDJ4XG4iLAorCQkJCQkgZGF0YTEsIGRhdGEyLCBkYXRhMywgZGF0YTQpOworCQkJYnJlYWs7CisJCWNhc2UgTUNFX1JTUF9HRVRQT1JUU1RBVFVTOgorCQkJaWYgKCFvdXQpCisJCQkJLyogV2UgdXNlIGRhdGExICsgMSBoZXJlLCB0byBtYXRjaCBodyBsYWJlbHMgKi8KKwkJCQlkZXZfaW5mbyhkZXYsICJUWCBwb3J0ICVkOiBibGFzdGVyIGlzJXMgY29ubmVjdGVkXG4iLAorCQkJCQkgZGF0YTEgKyAxLCBkYXRhNCA/ICIgbm90IiA6ICIiKTsKKwkJCWJyZWFrOworCQljYXNlIE1DRV9DTURfRkxBU0hMRUQ6CisJCQlkZXZfaW5mbyhkZXYsICJBdHRlbXB0aW5nIHRvIGZsYXNoIExFRFxuIik7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRldl9pbmZvKGRldiwgIlVua25vd24gY29tbWFuZCAweCUwMnggMHglMDJ4XG4iLAogCQkJCSBjbWQsIHN1YmNtZCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKLQljYXNlIE1DRV9DT01NQU5EX0hFQURFUjoKKwljYXNlIE1DRV9DTURfUE9SVF9JUjoKIAkJc3dpdGNoIChzdWJjbWQpIHsKIAkJY2FzZSBNQ0VfQ01EX1NJR19FTkQ6CiAJCQlkZXZfaW5mbyhkZXYsICJFbmQgb2Ygc2lnbmFsXG4iKTsKQEAgLTU0Niw0NyArNjE5LDU1IEBACiAJCQlkZXZfaW5mbyhkZXYsICJSZXNwIHRvIDlmIDA1IG9mIDB4JTAyeCAweCUwMnhcbiIsCiAJCQkJIGRhdGExLCBkYXRhMik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX1NfQ0FSUklFUjoKLQkJCWRldl9pbmZvKGRldiwgIiVzIGNhcnJpZXIgbW9kZSBhbmQgZnJlcSBvZiAiCi0JCQkJICIweCUwMnggMHglMDJ4XG4iLCBpbm91dCwgZGF0YTEsIGRhdGEyKTsKKwkJY2FzZSBNQ0VfUlNQX0VRSVJDRlM6CisJCQlwZXJpb2QgPSBESVZfUk9VTkRfQ0xPU0VTVCgKKwkJCQkJKDEgPDwgZGF0YTEgKiAyKSAqIChkYXRhMiArIDEpLCAxMCk7CisJCQlpZiAoIXBlcmlvZCkKKwkJCQlicmVhazsKKwkJCWNhcnJpZXIgPSAoMTAwMCAqIDEwMDApIC8gcGVyaW9kOworCQkJZGV2X2luZm8oZGV2LCAiJXMgY2FycmllciBvZiAldSBIeiAocGVyaW9kICV1dXMpXG4iLAorCQkJCSBpbm91dCwgY2FycmllciwgcGVyaW9kKTsKIAkJCWJyZWFrOwotCQljYXNlIE1DRV9DTURfR19DQVJSSUVSOgorCQljYXNlIE1DRV9DTURfR0VUSVJDRlM6CiAJCQlkZXZfaW5mbyhkZXYsICJHZXQgY2FycmllciBtb2RlIGFuZCBmcmVxXG4iKTsKIAkJCWJyZWFrOwotCQljYXNlIE1DRV9DTURfU19UWE1BU0s6CisJCWNhc2UgTUNFX1JTUF9FUUlSVFhQT1JUUzoKIAkJCWRldl9pbmZvKGRldiwgIiVzIHRyYW5zbWl0IGJsYXN0ZXIgbWFzayBvZiAweCUwMnhcbiIsCiAJCQkJIGlub3V0LCBkYXRhMSk7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX1NfVElNRU9VVDoKKwkJY2FzZSBNQ0VfUlNQX0VRSVJUSU1FT1VUOgogCQkJLyogdmFsdWUgaXMgaW4gdW5pdHMgb2YgNTB1cywgc28geCo1MC8xMDAwIG1zICovCisJCQlwZXJpb2QgPSAoKGRhdGExIDw8IDgpIHwgZGF0YTIpICogTUNFX1RJTUVfVU5JVCAvIDEwMDA7CiAJCQlkZXZfaW5mbyhkZXYsICIlcyByZWNlaXZlIHRpbWVvdXQgb2YgJWQgbXNcbiIsCi0JCQkJIGlub3V0LAotCQkJCSAoKGRhdGExIDw8IDgpIHwgZGF0YTIpICogTUNFX1RJTUVfVU5JVCAvIDEwMDApOworCQkJCSBpbm91dCwgcGVyaW9kKTsKIAkJCWJyZWFrOwotCQljYXNlIE1DRV9DTURfR19USU1FT1VUOgorCQljYXNlIE1DRV9DTURfR0VUSVJUSU1FT1VUOgogCQkJZGV2X2luZm8oZGV2LCAiR2V0IHJlY2VpdmUgdGltZW91dFxuIik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX0dfVFhNQVNLOgorCQljYXNlIE1DRV9DTURfR0VUSVJUWFBPUlRTOgogCQkJZGV2X2luZm8oZGV2LCAiR2V0IHRyYW5zbWl0IGJsYXN0ZXIgbWFza1xuIik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX1NfUlhTRU5TT1I6CisJCWNhc2UgTUNFX1JTUF9FUUlSUlhQT1JURU46CiAJCQlkZXZfaW5mbyhkZXYsICIlcyAlcy1yYW5nZSByZWNlaXZlIHNlbnNvciBpbiB1c2VcbiIsCiAJCQkJIGlub3V0LCBkYXRhMSA9PSAweDAyID8gInNob3J0IiA6ICJsb25nIik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX0dfUlhTRU5TT1I6Ci0JCS8qIGFrYSBNQ0VfUlNQX1BVTFNFX0NPVU5UICovCisJCWNhc2UgTUNFX0NNRF9HRVRJUlJYUE9SVEVOOgorCQkvKiBha2EgTUNFX1JTUF9FUUlSUlhDRkNOVCAqLwogCQkJaWYgKG91dCkKIAkJCQlkZXZfaW5mbyhkZXYsICJHZXQgcmVjZWl2ZSBzZW5zb3JcbiIpOwogCQkJZWxzZSBpZiAoaXItPmxlYXJuaW5nX2VuYWJsZWQpCiAJCQkJZGV2X2luZm8oZGV2LCAiUlggcHVsc2UgY291bnQ6ICVkXG4iLAogCQkJCQkgKChkYXRhMSA8PCA4KSB8IGRhdGEyKSk7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfUlNQX0NNRF9JTlZBTElEOgotCQkJZGV2X2luZm8oZGV2LCAiRXJyb3IhIEhhcmR3YXJlIGlzIGxpa2VseSB3ZWRnZWQuLi5cbiIpOworCQljYXNlIE1DRV9SU1BfRVFJUk5VTVBPUlRTOgorCQkJaWYgKG91dCkKKwkJCQlicmVhazsKKwkJCWRldl9pbmZvKGRldiwgIk51bSBUWCBwb3J0czogJXgsIG51bSBSWCBwb3J0czogJXhcbiIsCisJCQkJIGRhdGExLCBkYXRhMik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX1VOS05PV04yOgotCQljYXNlIE1DRV9DTURfVU5LTk9XTjM6Ci0JCWNhc2UgTUNFX0NNRF9VTktOT1dONToKKwkJY2FzZSBNQ0VfUlNQX0NNRF9JTExFR0FMOgorCQkJZGV2X2luZm8oZGV2LCAiSWxsZWdhbCBQT1JUX0lSIGNvbW1hbmRcbiIpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfaW5mbyhkZXYsICJVbmtub3duIGNvbW1hbmQgMHglMDJ4IDB4JTAyeFxuIiwKIAkJCQkgY21kLCBzdWJjbWQpOwpAQCAtNTk5LDggKzY4MCw4IEBACiAKIAlpZiAoY21kID09IE1DRV9JUkRBVEFfVFJBSUxFUikKIAkJZGV2X2luZm8oZGV2LCAiRW5kIG9mIHJhdyBJUiBkYXRhXG4iKTsKLQllbHNlIGlmICgoY21kICE9IE1DRV9DT01NQU5EX0hFQURFUikgJiYKLQkJICgoY21kICYgTUNFX0NPTU1BTkRfTUFTSykgPT0gTUNFX0NPTU1BTkRfSVJEQVRBKSkKKwllbHNlIGlmICgoY21kICE9IE1DRV9DTURfUE9SVF9JUikgJiYKKwkJICgoY21kICYgTUNFX1BPUlRfTUFTSykgPT0gTUNFX0NPTU1BTkRfSVJEQVRBKSkKIAkJZGV2X2luZm8oZGV2LCAiUmF3IElSIGRhdGEsICVkIHB1bHNlL3NwYWNlIHNhbXBsZXNcbiIsIGlyLT5yZW0pOwogfQogCkBAIC02MTYsOSArNjk3LDYgQEAKIAlpZiAoaXIpIHsKIAkJbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCi0JCW1jZV9kYmcoaXItPmRldiwgImNhbGxiYWNrIGNhbGxlZCAoc3RhdHVzPSVkIGxlbj0lZClcbiIsCi0JCQl1cmItPnN0YXR1cywgbGVuKTsKLQogCQltY2V1c2JfZGV2X3ByaW50ZGF0YShpciwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIDAsIGxlbiwgdHJ1ZSk7CiAJfQogCkBAIC02ODMsNyArNzYxLDE2IEBACiAKIHN0YXRpYyB2b2lkIG1jZV9hc3luY19vdXQoc3RydWN0IG1jZXVzYl9kZXYgKmlyLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKIHsKKwlpbnQgcnNpemUgPSBzaXplb2YoREVWSUNFX1JFU1VNRSk7CisKKwlpZiAoaXItPm5lZWRfcmVzZXQpIHsKKwkJaXItPm5lZWRfcmVzZXQgPSBmYWxzZTsKKwkJbWNlX3JlcXVlc3RfcGFja2V0KGlyLCBERVZJQ0VfUkVTVU1FLCByc2l6ZSwgTUNFVVNCX1RYKTsKKwkJbXNsZWVwKDEwKTsKKwl9CisKIAltY2VfcmVxdWVzdF9wYWNrZXQoaXIsIGRhdGEsIHNpemUsIE1DRVVTQl9UWCk7CisJbXNsZWVwKDEwKTsKIH0KIAogc3RhdGljIHZvaWQgbWNlX2ZsdXNoX3J4X2J1ZmZlcihzdHJ1Y3QgbWNldXNiX2RldiAqaXIsIGludCBzaXplKQpAQCAtNzA4LDggKzc5NSw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogTUNFIHR4IGluaXQgaGVhZGVyICovCi0JY21kYnVmW2NtZGNvdW50KytdID0gTUNFX0NPTU1BTkRfSEVBREVSOwotCWNtZGJ1ZltjbWRjb3VudCsrXSA9IE1DRV9DTURfU19UWE1BU0s7CisJY21kYnVmW2NtZGNvdW50KytdID0gTUNFX0NNRF9QT1JUX0lSOworCWNtZGJ1ZltjbWRjb3VudCsrXSA9IE1DRV9DTURfU0VUSVJUWFBPUlRTOwogCWNtZGJ1ZltjbWRjb3VudCsrXSA9IGlyLT50eF9tYXNrOwogCiAJLyogR2VuZXJhdGUgbWNlIHBhY2tldCBkYXRhICovCkBAIC03OTUsOCArODgyLDggQEAKIAlzdHJ1Y3QgbWNldXNiX2RldiAqaXIgPSBkZXYtPnByaXY7CiAJaW50IGNsayA9IDEwMDAwMDAwOwogCWludCBwcmVzY2FsZXIgPSAwLCBkaXZpc29yID0gMDsKLQl1bnNpZ25lZCBjaGFyIGNtZGJ1Zls0XSA9IHsgTUNFX0NPTU1BTkRfSEVBREVSLAotCQkJCSAgICBNQ0VfQ01EX1NfQ0FSUklFUiwgMHgwMCwgMHgwMCB9OworCXVuc2lnbmVkIGNoYXIgY21kYnVmWzRdID0geyBNQ0VfQ01EX1BPUlRfSVIsCisJCQkJICAgIE1DRV9DTURfU0VUSVJDRlMsIDB4MDAsIDB4MDAgfTsKIAogCS8qIENhcnJpZXIgaGFzIGNoYW5nZWQgKi8KIAlpZiAoaXItPmNhcnJpZXIgIT0gY2FycmllcikgewpAQCAtODQ0LDE3ICs5MzEsMzQgQEAKIAl1OCBsbyA9IGlyLT5idWZfaW5baW5kZXggKyAyXSAmIDB4ZmY7CiAKIAlzd2l0Y2ggKGlyLT5idWZfaW5baW5kZXhdKSB7CisJLyogdGhlIG9uZSBhbmQgb25seSA1LWJ5dGUgcmV0dXJuIHZhbHVlIGNvbW1hbmQgKi8KKwljYXNlIE1DRV9SU1BfR0VUUE9SVFNUQVRVUzoKKwkJaWYgKChpci0+YnVmX2luW2luZGV4ICsgNF0gJiAweGZmKSA9PSAweDAwKQorCQkJaXItPnR4cG9ydHNfY2FibGVkIHw9IDEgPDwgaGk7CisJCWJyZWFrOworCiAJLyogMi1ieXRlIHJldHVybiB2YWx1ZSBjb21tYW5kcyAqLwotCWNhc2UgTUNFX0NNRF9TX1RJTUVPVVQ6CisJY2FzZSBNQ0VfUlNQX0VRSVJUSU1FT1VUOgogCQlpci0+cmMtPnRpbWVvdXQgPSBVU19UT19OUygoaGkgPDwgOCB8IGxvKSAqIE1DRV9USU1FX1VOSVQpOwogCQlicmVhazsKKwljYXNlIE1DRV9SU1BfRVFJUk5VTVBPUlRTOgorCQlpci0+bnVtX3R4cG9ydHMgPSBoaTsKKwkJaXItPm51bV9yeHBvcnRzID0gbG87CisJCWJyZWFrOwogCiAJLyogMS1ieXRlIHJldHVybiB2YWx1ZSBjb21tYW5kcyAqLwotCWNhc2UgTUNFX0NNRF9TX1RYTUFTSzoKKwljYXNlIE1DRV9SU1BfRVFFTVZFUjoKKwkJaXItPmVtdmVyID0gaGk7CisJCWJyZWFrOworCWNhc2UgTUNFX1JTUF9FUUlSVFhQT1JUUzoKIAkJaXItPnR4X21hc2sgPSBoaTsKIAkJYnJlYWs7Ci0JY2FzZSBNQ0VfQ01EX1NfUlhTRU5TT1I6Ci0JCWlyLT5sZWFybmluZ19lbmFibGVkID0gKGhpID09IDB4MDIpOworCWNhc2UgTUNFX1JTUF9FUUlSUlhQT1JURU46CisJCWlyLT5sZWFybmluZ19lbmFibGVkID0gKChoaSAmIDB4MDIpID09IDB4MDIpOworCQlpci0+cnhwb3J0c19hY3RpdmUgPSBoaTsKKwkJYnJlYWs7CisJY2FzZSBNQ0VfUlNQX0NNRF9JTExFR0FMOgorCQlpci0+bmVlZF9yZXNldCA9IHRydWU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtOTAzLDggKzEwMDcsOCBAQAogCQkJLyogZGVjb2RlIG1jZSBwYWNrZXRzIG9mIHRoZSBmb3JtICg4NCksQUEsQkIsQ0MsREQgKi8KIAkJCS8qIElSIGRhdGEgcGFja2V0cyBjYW4gc3BhbiBVU0IgbWVzc2FnZXMgLSByZW0gKi8KIAkJCWlyLT5jbWQgPSBpci0+YnVmX2luW2ldOwotCQkJaWYgKChpci0+Y21kID09IE1DRV9DT01NQU5EX0hFQURFUikgfHwKLQkJCSAgICAoKGlyLT5jbWQgJiBNQ0VfQ09NTUFORF9NQVNLKSAhPQorCQkJaWYgKChpci0+Y21kID09IE1DRV9DTURfUE9SVF9JUikgfHwKKwkJCSAgICAoKGlyLT5jbWQgJiBNQ0VfUE9SVF9NQVNLKSAhPQogCQkJICAgICBNQ0VfQ09NTUFORF9JUkRBVEEpKSB7CiAJCQkJaXItPnBhcnNlcl9zdGF0ZSA9IFNVQkNNRDsKIAkJCQljb250aW51ZTsKQEAgLTk2OSw2ICsxMDczLDEzIEBACiAJdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIH0KIAorc3RhdGljIHZvaWQgbWNldXNiX2dldF9lbXVsYXRvcl92ZXJzaW9uKHN0cnVjdCBtY2V1c2JfZGV2ICppcikKK3sKKwkvKiBJZiB3ZSBnZXQgbm8gcmVwbHkgb3IgYW4gaWxsZWdhbCBjb21tYW5kIHJlcGx5LCBpdHMgdmVyIDEsIHNheXMgTVMgKi8KKwlpci0+ZW12ZXIgPSAxOworCW1jZV9hc3luY19vdXQoaXIsIEdFVF9FTVZFUiwgc2l6ZW9mKEdFVF9FTVZFUikpOworfQorCiBzdGF0aWMgdm9pZCBtY2V1c2JfZ2VuMV9pbml0KHN0cnVjdCBtY2V1c2JfZGV2ICppcikKIHsKIAlpbnQgcmV0OwpAQCAtMTAxMSw4ICsxMTIyLDggQEAKIAkJCSAgICAgIDB4MDAwMCwgMHgwMTAwLCBOVUxMLCAwLCBIWiAqIDMpOwogCW1jZV9kYmcoZGV2LCAiJXMgLSByZXRDID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCi0JLyogZGV2aWNlIHJlc2V0ICovCi0JbWNlX2FzeW5jX291dChpciwgREVWSUNFX1JFU0VULCBzaXplb2YoREVWSUNFX1JFU0VUKSk7CisJLyogZGV2aWNlIHJlc3VtZSAqLworCW1jZV9hc3luY19vdXQoaXIsIERFVklDRV9SRVNVTUUsIHNpemVvZihERVZJQ0VfUkVTVU1FKSk7CiAKIAkvKiBnZXQgaHcvc3cgcmV2aXNpb24/ICovCiAJbWNlX2FzeW5jX291dChpciwgR0VUX1JFVklTSU9OLCBzaXplb2YoR0VUX1JFVklTSU9OKSk7CkBAIC0xMDIyLDIzICsxMTMzLDM2IEBACiAKIHN0YXRpYyB2b2lkIG1jZXVzYl9nZW4yX2luaXQoc3RydWN0IG1jZXVzYl9kZXYgKmlyKQogewotCS8qIGRldmljZSByZXNldCAqLwotCW1jZV9hc3luY19vdXQoaXIsIERFVklDRV9SRVNFVCwgc2l6ZW9mKERFVklDRV9SRVNFVCkpOworCS8qIGRldmljZSByZXN1bWUgKi8KKwltY2VfYXN5bmNfb3V0KGlyLCBERVZJQ0VfUkVTVU1FLCBzaXplb2YoREVWSUNFX1JFU1VNRSkpOwogCiAJLyogZ2V0IGh3L3N3IHJldmlzaW9uPyAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9SRVZJU0lPTiwgc2l6ZW9mKEdFVF9SRVZJU0lPTikpOwogCi0JLyogdW5rbm93biB3aGF0IHRoZSBuZXh0IHR3byBhY3R1YWxseSByZXR1cm4uLi4gKi8KLQltY2VfYXN5bmNfb3V0KGlyLCBHRVRfVU5LTk9XTiwgc2l6ZW9mKEdFVF9VTktOT1dOKSk7CisJLyogZ2V0IHdha2UgdmVyc2lvbiAocHJvdG9jb2wsIGtleSwgYWRkcmVzcykgKi8KKwltY2VfYXN5bmNfb3V0KGlyLCBHRVRfV0FLRVZFUlNJT04sIHNpemVvZihHRVRfV0FLRVZFUlNJT04pKTsKKworCS8qIHVua25vd24gd2hhdCB0aGlzIG9uZSBhY3R1YWxseSByZXR1cm5zLi4uICovCiAJbWNlX2FzeW5jX291dChpciwgR0VUX1VOS05PV04yLCBzaXplb2YoR0VUX1VOS05PV04yKSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1jZXVzYl9nZXRfcGFyYW1ldGVycyhzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCiB7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBjbWRidWZbM10gPSB7IE1DRV9DTURfUE9SVF9TWVMsCisJCQkJICAgIE1DRV9DTURfR0VUUE9SVFNUQVRVUywgMHgwMCB9OworCisJLyogZGVmYXVsdHMsIGlmIHRoZSBoYXJkd2FyZSBkb2Vzbid0IHN1cHBvcnQgcXVlcnlpbmcgKi8KKwlpci0+bnVtX3R4cG9ydHMgPSAyOworCWlyLT5udW1fcnhwb3J0cyA9IDI7CisKKwkvKiBnZXQgbnVtYmVyIG9mIHR4IGFuZCByeCBwb3J0cyAqLworCW1jZV9hc3luY19vdXQoaXIsIEdFVF9OVU1fUE9SVFMsIHNpemVvZihHRVRfTlVNX1BPUlRTKSk7CisKIAkvKiBnZXQgdGhlIGNhcnJpZXIgYW5kIGZyZXF1ZW5jeSAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9DQVJSSUVSX0ZSRVEsIHNpemVvZihHRVRfQ0FSUklFUl9GUkVRKSk7CiAKLQlpZiAoIWlyLT5mbGFncy5ub190eCkKKwlpZiAoaXItPm51bV90eHBvcnRzICYmICFpci0+ZmxhZ3Mubm9fdHgpCiAJCS8qIGdldCB0aGUgdHJhbnNtaXR0ZXIgYml0bWFzayAqLwogCQltY2VfYXN5bmNfb3V0KGlyLCBHRVRfVFhfQklUTUFTSywgc2l6ZW9mKEdFVF9UWF9CSVRNQVNLKSk7CiAKQEAgLTEwNDcsNiArMTE3MSwxOSBAQAogCiAJLyogZ2V0IHJlY2VpdmVyIHNlbnNvciBzZXR0aW5nICovCiAJbWNlX2FzeW5jX291dChpciwgR0VUX1JYX1NFTlNPUiwgc2l6ZW9mKEdFVF9SWF9TRU5TT1IpKTsKKworCWZvciAoaSA9IDA7IGkgPCBpci0+bnVtX3R4cG9ydHM7IGkrKykgeworCQljbWRidWZbMl0gPSBpOworCQltY2VfYXN5bmNfb3V0KGlyLCBjbWRidWYsIHNpemVvZihjbWRidWYpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1jZXVzYl9mbGFzaF9sZWQoc3RydWN0IG1jZXVzYl9kZXYgKmlyKQoreworCWlmIChpci0+ZW12ZXIgPCAyKQorCQlyZXR1cm47CisKKwltY2VfYXN5bmNfb3V0KGlyLCBGTEFTSF9MRUQsIHNpemVvZihGTEFTSF9MRUQpKTsKIH0KIAogc3RhdGljIHN0cnVjdCByY19kZXYgKm1jZXVzYl9pbml0X3JjX2RldihzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCkBAIC0xMjIwLDYgKzEzNTcsOSBAQAogCW1jZV9kYmcoJmludGYtPmRldiwgIkZsdXNoaW5nIHJlY2VpdmUgYnVmZmVyc1xuIik7CiAJbWNlX2ZsdXNoX3J4X2J1ZmZlcihpciwgbWF4cCk7CiAKKwkvKiBmaWd1cmUgb3V0IHdoaWNoIGZpcm13YXJlL2VtdWxhdG9yIHZlcnNpb24gdGhpcyBoYXJkd2FyZSBoYXMgKi8KKwltY2V1c2JfZ2V0X2VtdWxhdG9yX3ZlcnNpb24oaXIpOworCiAJLyogaW5pdGlhbGl6ZSBkZXZpY2UgKi8KIAlpZiAoaXItPmZsYWdzLm1pY3Jvc29mdF9nZW4xKQogCQltY2V1c2JfZ2VuMV9pbml0KGlyKTsKQEAgLTEyMjgsMTMgKzEzNjgsMjMgQEAKIAogCW1jZXVzYl9nZXRfcGFyYW1ldGVycyhpcik7CiAKKwltY2V1c2JfZmxhc2hfbGVkKGlyKTsKKwogCWlmICghaXItPmZsYWdzLm5vX3R4KQogCQltY2V1c2Jfc2V0X3R4X21hc2soaXItPnJjLCBNQ0VfREVGQVVMVF9UWF9NQVNLKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgaXIpOwogCi0JZGV2X2luZm8oJmludGYtPmRldiwgIlJlZ2lzdGVyZWQgJXMgb24gdXNiJWQ6JWRcbiIsIG5hbWUsCi0JCSBkZXYtPmJ1cy0+YnVzbnVtLCBkZXYtPmRldm51bSk7CisJLyogZW5hYmxlIHdha2UgdmlhIHRoaXMgZGV2aWNlICovCisJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZShpci0+ZGV2LCB0cnVlKTsKKwlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoaXItPmRldiwgdHJ1ZSk7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiUmVnaXN0ZXJlZCAlcyB3aXRoIG1jZSBlbXVsYXRvciBpbnRlcmZhY2UgIgorCQkgInZlcnNpb24gJXhcbiIsIG5hbWUsIGlyLT5lbXZlcik7CisJZGV2X2luZm8oJmludGYtPmRldiwgIiV4IHR4IHBvcnRzICgweCV4IGNhYmxlZCkgYW5kICIKKwkJICIleCByeCBzZW5zb3JzICgweCV4IGFjdGl2ZSlcbiIsCisJCSBpci0+bnVtX3R4cG9ydHMsIGlyLT50eHBvcnRzX2NhYmxlZCwKKwkJIGlyLT5udW1fcnhwb3J0cywgaXItPnJ4cG9ydHNfYWN0aXZlKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JjLWNvcmUtcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1jb3JlLXByaXYuaAppbmRleCAwNGMyYzcyLi5jNmNhODcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3JjLWNvcmUtcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtY29yZS1wcml2LmgKQEAgLTE2Miw0OSArMTYyLDQ5IEBACiAjaWZkZWYgQ09ORklHX0lSX05FQ19ERUNPREVSX01PRFVMRQogI2RlZmluZSBsb2FkX25lY19kZWNvZGUoKQlyZXF1ZXN0X21vZHVsZSgiaXItbmVjLWRlY29kZXIiKQogI2Vsc2UKLSNkZWZpbmUgbG9hZF9uZWNfZGVjb2RlKCkJMAorc3RhdGljIGlubGluZSB2b2lkIGxvYWRfbmVjX2RlY29kZSh2b2lkKSB7IH0KICNlbmRpZgogCiAvKiBmcm9tIGlyLXJjNS1kZWNvZGVyLmMgKi8KICNpZmRlZiBDT05GSUdfSVJfUkM1X0RFQ09ERVJfTU9EVUxFCiAjZGVmaW5lIGxvYWRfcmM1X2RlY29kZSgpCXJlcXVlc3RfbW9kdWxlKCJpci1yYzUtZGVjb2RlciIpCiAjZWxzZQotI2RlZmluZSBsb2FkX3JjNV9kZWNvZGUoKQkwCitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9yYzVfZGVjb2RlKHZvaWQpIHsgfQogI2VuZGlmCiAKIC8qIGZyb20gaXItcmM2LWRlY29kZXIuYyAqLwogI2lmZGVmIENPTkZJR19JUl9SQzZfREVDT0RFUl9NT0RVTEUKICNkZWZpbmUgbG9hZF9yYzZfZGVjb2RlKCkJcmVxdWVzdF9tb2R1bGUoImlyLXJjNi1kZWNvZGVyIikKICNlbHNlCi0jZGVmaW5lIGxvYWRfcmM2X2RlY29kZSgpCTAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX3JjNl9kZWNvZGUodm9pZCkgeyB9CiAjZW5kaWYKIAogLyogZnJvbSBpci1qdmMtZGVjb2Rlci5jICovCiAjaWZkZWYgQ09ORklHX0lSX0pWQ19ERUNPREVSX01PRFVMRQogI2RlZmluZSBsb2FkX2p2Y19kZWNvZGUoKQlyZXF1ZXN0X21vZHVsZSgiaXItanZjLWRlY29kZXIiKQogI2Vsc2UKLSNkZWZpbmUgbG9hZF9qdmNfZGVjb2RlKCkJMAorc3RhdGljIGlubGluZSB2b2lkIGxvYWRfanZjX2RlY29kZSh2b2lkKSB7IH0KICNlbmRpZgogCiAvKiBmcm9tIGlyLXNvbnktZGVjb2Rlci5jICovCiAjaWZkZWYgQ09ORklHX0lSX1NPTllfREVDT0RFUl9NT0RVTEUKICNkZWZpbmUgbG9hZF9zb255X2RlY29kZSgpCXJlcXVlc3RfbW9kdWxlKCJpci1zb255LWRlY29kZXIiKQogI2Vsc2UKLSNkZWZpbmUgbG9hZF9zb255X2RlY29kZSgpCTAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX3NvbnlfZGVjb2RlKHZvaWQpIHsgfQogI2VuZGlmCiAKIC8qIGZyb20gaXItbWNlX2tiZC1kZWNvZGVyLmMgKi8KICNpZmRlZiBDT05GSUdfSVJfTUNFX0tCRF9ERUNPREVSX01PRFVMRQogI2RlZmluZSBsb2FkX21jZV9rYmRfZGVjb2RlKCkJcmVxdWVzdF9tb2R1bGUoImlyLW1jZV9rYmQtZGVjb2RlciIpCiAjZWxzZQotI2RlZmluZSBsb2FkX21jZV9rYmRfZGVjb2RlKCkJMAorc3RhdGljIGlubGluZSB2b2lkIGxvYWRfbWNlX2tiZF9kZWNvZGUodm9pZCkgeyB9CiAjZW5kaWYKIAogLyogZnJvbSBpci1saXJjLWNvZGVjLmMgKi8KICNpZmRlZiBDT05GSUdfSVJfTElSQ19DT0RFQ19NT0RVTEUKICNkZWZpbmUgbG9hZF9saXJjX2NvZGVjKCkJcmVxdWVzdF9tb2R1bGUoImlyLWxpcmMtY29kZWMiKQogI2Vsc2UKLSNkZWZpbmUgbG9hZF9saXJjX2NvZGVjKCkJMAorc3RhdGljIGlubGluZSB2b2lkIGxvYWRfbGlyY19jb2RlYyh2b2lkKSB7IH0KICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMKaW5kZXggNTFhMjNmNC4uMjlmOTAwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJyYy1jb3JlLXByaXYuaCIKIAogLyogU2l6ZXMgYXJlIGluIGJ5dGVzLCAyNTYgYnl0ZXMgYWxsb3dzIGZvciAzMiBlbnRyaWVzIG9uIHg2NCAqLwpAQCAtOTI4LDEwICs5MjksNiBAQAogCiBzdGF0aWMgdm9pZCByY19kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHJjX2RldiAqZGV2ID0gdG9fcmNfZGV2KGRldmljZSk7Ci0KLQlrZnJlZShkZXYpOwotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogfQogCiAjZGVmaW5lIEFERF9IT1RQTFVHX1ZBUihmbXQsIHZhbC4uLikJCQkJCVwKQEAgLTk0NSw2ICs5NDIsOSBAQAogewogCXN0cnVjdCByY19kZXYgKmRldiA9IHRvX3JjX2RldihkZXZpY2UpOwogCisJaWYgKCFkZXYgfHwgIWRldi0+aW5wdXRfZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWlmIChkZXYtPnJjX21hcC5uYW1lKQogCQlBRERfSE9UUExVR19WQVIoIk5BTUU9JXMiLCBkZXYtPnJjX21hcC5uYW1lKTsKIAlpZiAoZGV2LT5kcml2ZXJfbmFtZSkKQEAgLTEwMTMsMTAgKzEwMTMsMTYgQEAKIAogdm9pZCByY19mcmVlX2RldmljZShzdHJ1Y3QgcmNfZGV2ICpkZXYpCiB7Ci0JaWYgKGRldikgeworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwlpZiAoZGV2LT5pbnB1dF9kZXYpCiAJCWlucHV0X2ZyZWVfZGV2aWNlKGRldi0+aW5wdXRfZGV2KTsKLQkJcHV0X2RldmljZSgmZGV2LT5kZXYpOwotCX0KKworCXB1dF9kZXZpY2UoJmRldi0+ZGV2KTsKKworCWtmcmVlKGRldik7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyY19mcmVlX2RldmljZSk7CiAKQEAgLTExNDMsMTQgKzExNDksMTggQEAKIAlpZiAoZGV2LT5kcml2ZXJfdHlwZSA9PSBSQ19EUklWRVJfSVJfUkFXKQogCQlpcl9yYXdfZXZlbnRfdW5yZWdpc3RlcihkZXYpOwogCi0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5pbnB1dF9kZXYpOwotCWRldi0+aW5wdXRfZGV2ID0gTlVMTDsKLQorCS8qIEZyZWVpbmcgdGhlIHRhYmxlIHNob3VsZCBhbHNvIGNhbGwgdGhlIHN0b3AgY2FsbGJhY2sgKi8KIAlpcl9mcmVlX3RhYmxlKCZkZXYtPnJjX21hcCk7CiAJSVJfZHByaW50aygxLCAiRnJlZWQga2V5Y29kZSB0YWJsZVxuIik7CiAKLQlkZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5kZXYpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+aW5wdXRfZGV2KTsKKwlkZXYtPmlucHV0X2RldiA9IE5VTEw7CisKKwlkZXZpY2VfZGVsKCZkZXYtPmRldik7CisKKwlyY19mcmVlX2RldmljZShkZXYpOwogfQorCiBFWFBPUlRfU1lNQk9MX0dQTChyY191bnJlZ2lzdGVyX2RldmljZSk7CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCmluZGV4IGExNjYwNDQuLjYxMjg3ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCkBAIC0xOTUsMTEgKzE5NSw2IEBACiAJZG1hX2FkZHJfdCBkbWFfaW47CiAJZG1hX2FkZHJfdCBkbWFfb3V0OwogCi0JLyogdHJ1ZSBpZiB3cml0ZSB1cmIgaXMgYnVzeSAqLwotCWJvb2wgd3JpdGVfYnVzeTsKLQkvKiB3YWl0IGZvciB0aGUgd3JpdGUgdG8gZmluaXNoICovCi0Jc3RydWN0IGNvbXBsZXRpb24gd3JpdGVfZmluaXNoZWQ7Ci0KIAkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLwogCXN0cnVjdCBtdXRleCBsb2NrOwogCkBAIC0yMDcsOCArMjAyLDYgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCByeF90aW1lb3V0OwogCXUzMiBod190aW1lb3V0OwogCi0JLyogSXMgdGhlIGRldmljZSBjdXJyZW50bHkgcmVjZWl2aW5nPyAqLwotCWJvb2wgcmVjdl9pbl9wcm9ncmVzczsKIAkvKiBpcyB0aGUgZGV0ZWN0b3IgZW5hYmxlZCovCiAJYm9vbCBkZXRfZW5hYmxlZDsKIAkvKiBJcyB0aGUgZGV2aWNlIGN1cnJlbnRseSB0cmFuc21pdHRpbmc/Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvd2luYm9uZC1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvd2luYm9uZC1jaXIuYwppbmRleCBiZWM4YWJjLi4xM2Y1NGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3dpbmJvbmQtY2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy93aW5ib25kLWNpci5jCkBAIC00MSw2ICs0MSw4IEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xMTU1LDEyICsxMTU3LDEyIEBACiAJY2FzZSBJUl9QUk9UT0NPTF9SQzY6CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IEludmFsaWQgcG93ZXItb24gcHJvdG9jb2xcbiIpOworCQlwcl9lcnIoIkludmFsaWQgcG93ZXItb24gcHJvdG9jb2xcbiIpOwogCX0KIAogCXJldCA9IHBucF9yZWdpc3Rlcl9kcml2ZXIoJndiY2lyX2RyaXZlcik7CiAJaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCmluZGV4IGY1NzRkYzAuLmIzMDNhM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKQEAgLTQ2Nyw2ICs0NjcsMjAgQEAKIAkgIE9WNzY3MCBWR0EgY2FtZXJhLiAgSXQgY3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCB0aGUgTTg4QUxQMDEKIAkgIGNvbnRyb2xsZXIuCiAKK2NvbmZpZyBWSURFT19NVDlQMDMxCisJdHJpc3RhdGUgIkFwdGluYSBNVDlQMDMxIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMiAmJiBWSURFT19WNEwyX1NVQkRFVl9BUEkKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgVmlkZW80TGludXgyIHNlbnNvci1sZXZlbCBkcml2ZXIgZm9yIHRoZSBBcHRpbmEKKwkgIChNaWNyb24pIG10OXAwMzEgNSBNcGl4ZWwgY2FtZXJhLgorCitjb25maWcgVklERU9fTVQ5VDAwMQorCXRyaXN0YXRlICJBcHRpbmEgTVQ5VDAwMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIgJiYgVklERU9fVjRMMl9TVUJERVZfQVBJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIFZpZGVvNExpbnV4MiBzZW5zb3ItbGV2ZWwgZHJpdmVyIGZvciB0aGUgQXB0aW5hCisJICAoTWljcm9uKSBtdDB0MDAxIDMgTXBpeGVsIGNhbWVyYS4KKwogY29uZmlnIFZJREVPX01UOVYwMTEKIAl0cmlzdGF0ZSAiTWljcm9uIG10OXYwMTEgc2Vuc29yIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMgpAQCAtNDg5LDYgKzUwMywyNyBAQAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFRvc2hpYmEgVENNODI1eCBWR0EgY2FtZXJhIHNlbnNvci4KIAkgIEl0IGlzIHVzZWQgZm9yIGV4YW1wbGUgaW4gTm9raWEgTjgwMC4KIAorY29uZmlnIFZJREVPX1NSMDMwUEMzMAorCXRyaXN0YXRlICJTaWxpY29uZmlsZSBTUjAzMFBDMzAgc2Vuc29yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFNSMDMwUEMzMCBWR0EgY2FtZXJhIGZyb20gU2lsaWNvbmZpbGUKKworY29uZmlnIFZJREVPX05PT04wMTBQQzMwCisJdHJpc3RhdGUgIlNpbGljb25maWxlIE5PT04wMTBQQzMwIHNlbnNvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIgJiYgRVhQRVJJTUVOVEFMICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE5PT04wMTBQQzMwIENJRiBjYW1lcmEgZnJvbSBTaWxpY29uZmlsZQorCitzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL0tjb25maWciCisKK2NvbmZpZyBWSURFT19TNUs2QUEKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBTNUs2QUFGWCBzZW5zb3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBWNEwyIHNlbnNvci1sZXZlbCBkcml2ZXIgZm9yIFNhbXN1bmcgUzVLNkFBKEZYKSAxLjNNCisJICBjYW1lcmEgc2Vuc29yIHdpdGggYW4gZW1iZWRkZWQgU29DIGltYWdlIHNpZ25hbCBwcm9jZXNzb3IuCisKIGNvbW1lbnQgIkZsYXNoIGRldmljZXMiCiAKIGNvbmZpZyBWSURFT19BRFAxNjUzCkBAIC03MDgsNiArNzQzLDggQEAKIAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9LY29uZmlnIgpAQCAtNzM3LDEyICs3NzQsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXJ2LgogCi1jb25maWcgVklERU9fU1IwMzBQQzMwCi0JdHJpc3RhdGUgIlNSMDMwUEMzMCBWR0EgY2FtZXJhIHNlbnNvciBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIKLQktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBTUjAzMFBDMzAgVkdBIGNhbWVyYSBmcm9tIFNpbGljb25maWxlCi0KIGNvbmZpZyBWSURFT19WSUFfQ0FNRVJBCiAJdHJpc3RhdGUgIlZJQUZCIGNhbWVyYSBjb250cm9sbGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQl9WSUEKQEAgLTc1MywxOCArNzg0LDkgQEAKIAkgICBDaHJvbWU5IGNoaXBzZXRzLiAgQ3VycmVudGx5IG9ubHkgdGVzdGVkIG9uIE9MUEMgeG8tMS41IHN5c3RlbXMKIAkgICB3aXRoIG92NzY3MCBzZW5zb3JzLgogCi1jb25maWcgVklERU9fTk9PTjAxMFBDMzAKLQl0cmlzdGF0ZSAiTk9PTjAxMFBDMzAgQ0lGIGNhbWVyYSBzZW5zb3Igc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyCi0JLS0taGVscC0tLQotCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTk9PTjAxMFBDMzAgQ0lGIGNhbWVyYSBmcm9tIFNpbGljb25maWxlCi0KLXNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvS2NvbmZpZyIKLQogY29uZmlnIFZJREVPX09NQVAzCiAJdHJpc3RhdGUgIk9NQVAgMyBDYW1lcmEgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlzZWxlY3QgT01BUF9JT01NVQotCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBJMkMgJiYgVklERU9fVjRMMl9TVUJERVZfQVBJICYmIEFSQ0hfT01BUDMgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBPTUFQX0lPVk1NICYmIFZJREVPX1Y0TDIgJiYgSTJDICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSSAmJiBBUkNIX09NQVAzICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIERyaXZlciBmb3IgYW4gT01BUCAzIGNhbWVyYSBjb250cm9sbGVyLgogCkBAIC05NDksOCArOTcxLDkgQEAKIAkgIEludGVyZmFjZQogCiBjb25maWcgIFZJREVPX1NBTVNVTkdfUzVQX0ZJTUMKLQl0cmlzdGF0ZSAiU2Ftc3VuZyBTNVAgYW5kIEVYWU5PUzQgY2FtZXJhIGhvc3QgaW50ZXJmYWNlIGRyaXZlciIKLQlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBWSURFT19WNEwyICYmIFBMQVRfUzVQCisJdHJpc3RhdGUgIlNhbXN1bmcgUzVQIGFuZCBFWFlOT1M0IGNhbWVyYSBpbnRlcmZhY2UgZHJpdmVyIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBJMkMgJiYgUExBVF9TNVAgJiYgUE1fUlVOVElNRSAmJiBcCisJCVZJREVPX1Y0TDJfU1VCREVWX0FQSSAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgVklERU9CVUYyX0RNQV9DT05USUcKIAlzZWxlY3QgVjRMMl9NRU0yTUVNX0RFVgogCS0tLWhlbHAtLS0KQEAgLTEwMDQsNiArMTAyNyw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCmluZGV4IDI3MjM5MDAuLjExN2Y5YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQpAQCAtNjUsMTEgKzY1LDE0IEBACiBvYmotJChDT05GSUdfVklERU9fT1Y3NjcwKSAJKz0gb3Y3NjcwLm8KIG9iai0kKENPTkZJR19WSURFT19UQ004MjVYKSArPSB0Y204MjV4Lm8KIG9iai0kKENPTkZJR19WSURFT19UVkVFUFJPTSkgKz0gdHZlZXByb20ubworb2JqLSQoQ09ORklHX1ZJREVPX01UOVAwMzEpICs9IG10OXAwMzEubworb2JqLSQoQ09ORklHX1ZJREVPX01UOVQwMDEpICs9IG10OXQwMDEubwogb2JqLSQoQ09ORklHX1ZJREVPX01UOVYwMTEpICs9IG10OXYwMTEubwogb2JqLSQoQ09ORklHX1ZJREVPX01UOVYwMzIpICs9IG10OXYwMzIubwogb2JqLSQoQ09ORklHX1ZJREVPX1NSMDMwUEMzMCkJKz0gc3IwMzBwYzMwLm8KIG9iai0kKENPTkZJR19WSURFT19OT09OMDEwUEMzMCkJKz0gbm9vbjAxMHBjMzAubwogb2JqLSQoQ09ORklHX1ZJREVPX001TU9MUykJKz0gbTVtb2xzLworb2JqLSQoQ09ORklHX1ZJREVPX1M1SzZBQSkJKz0gczVrNmFhLm8KIG9iai0kKENPTkZJR19WSURFT19BRFAxNjUzKQkrPSBhZHAxNjUzLm8KIAogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfSU1YMDc0KQkJKz0gaW14MDc0Lm8KQEAgLTEwMiw5ICsxMDUsMTEgQEAKIG9iai0kKENPTkZJR19WSURFT19FTTI4WFgpICs9IGVtMjh4eC8KIG9iai0kKENPTkZJR19WSURFT19UTEcyMzAwKSArPSB0bGcyMzAwLwogb2JqLSQoQ09ORklHX1ZJREVPX0NYMjMxWFgpICs9IGN4MjMxeHgvCitvYmotJChDT05GSUdfVklERU9fQ1gyNTgyMSkgKz0gY3gyNTgyMS8KIG9iai0kKENPTkZJR19WSURFT19VU0JWSVNJT04pICs9IHVzYnZpc2lvbi8KIG9iai0kKENPTkZJR19WSURFT19QVlJVU0IyKSArPSBwdnJ1c2IyLwogb2JqLSQoQ09ORklHX1ZJREVPX0NQSUEyKSArPSBjcGlhMi8KK29iai0kKENPTkZJR19WSURFT19UTTYwMDApICs9IHRtNjAwMC8KIG9iai0kKENPTkZJR19WSURFT19NWEIpICs9IG14Yi5vCiBvYmotJChDT05GSUdfVklERU9fSEVYSVVNX09SSU9OKSArPSBoZXhpdW1fb3Jpb24ubwogb2JqLSQoQ09ORklHX1ZJREVPX0hFWElVTV9HRU1JTkkpICs9IGhleGl1bV9nZW1pbmkubwpAQCAtMTkwLDYgKzE5NSw2IEBACiAKIG9iai0kKENPTkZJR19BUkNIX09NQVApCSs9IG9tYXAvCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkcDE2NTMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jCmluZGV4IGJlN2JlZmQuLjEyZWVkZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jCkBAIC0zMSw3ICszMSw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9hZHAxNjUzLmg+CkBAIC0yNTgsNyArMjYwLDcgQEAKIAlpZiAoZmxhc2gtPmN0cmxzLmVycm9yKQogCQlyZXR1cm4gZmxhc2gtPmN0cmxzLmVycm9yOwogCi0JZmF1bHQtPmlzX3ZvbGF0aWxlID0gMTsKKwlmYXVsdC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEU7CiAKIAlmbGFzaC0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZmbGFzaC0+Y3RybHM7CiAJcmV0dXJuIDA7CkBAIC00MTMsNiArNDE1LDEwIEBACiAJc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoOwogCWludCByZXQ7CiAKKwkvKiB3ZSBjb3VsZG4ndCB3b3JrIHdpdGhvdXQgcGxhdGZvcm0gZGF0YSAqLworCWlmIChjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCiAJZmxhc2ggPSBremFsbG9jKHNpemVvZigqZmxhc2gpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZmxhc2ggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC00MjUsMTIgKzQzMSwyMSBAQAogCWZsYXNoLT5zdWJkZXYuaW50ZXJuYWxfb3BzID0gJmFkcDE2NTNfaW50ZXJuYWxfb3BzOwogCWZsYXNoLT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7CiAKLQlhZHAxNjUzX2luaXRfY29udHJvbHMoZmxhc2gpOworCXJldCA9IGFkcDE2NTNfaW5pdF9jb250cm9scyhmbGFzaCk7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX2FuZF9xdWl0OwogCiAJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQoJmZsYXNoLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJa2ZyZWUoZmxhc2gpOworCQlnb3RvIGZyZWVfYW5kX3F1aXQ7CiAKKwlmbGFzaC0+c3ViZGV2LmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVZfRkxBU0g7CisKKwlyZXR1cm4gMDsKKworZnJlZV9hbmRfcXVpdDoKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZmbGFzaC0+Y3RybHMpOworCWtmcmVlKGZsYXNoKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3NS5jCmluZGV4IGQyMzI3ZGIuLjIwNjA3OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3NS5jCkBAIC02MSw2ICs2MSwxMSBAQAogCiBzdGF0aWMgY2hhciAqaW5wdXRzW10gPSB7ICJwYXNzX3Rocm91Z2giLCAicGxheV9iYWNrIiwgImNvbG9yX2JhciIgfTsKIAorc3RhdGljIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBhZHY3MTc1X2NvZGVzW10gPSB7CisJVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDgsCisJVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2LAorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGlubGluZSBpbnQgYWR2NzE3NV93cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCByZWcsIHU4IHZhbHVlKQpAQCAtMjk2LDYgKzMwMSw2MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGFkdjcxNzVfZW51bV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IGluZGV4LAorCQkJCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSAqY29kZSkKK3sKKwlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShhZHY3MTc1X2NvZGVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqY29kZSA9IGFkdjcxNzVfY29kZXNbaW5kZXhdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdjcxNzVfZ19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwl1OCB2YWwgPSBhZHY3MTc1X3JlYWQoc2QsIDB4Nyk7CisKKwlpZiAoKHZhbCAmIDB4NDApID09ICgxIDw8IDYpKQorCQltZi0+Y29kZSA9IFY0TDJfTUJVU19GTVRfVVlWWThfMVgxNjsKKwllbHNlCisJCW1mLT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDg7CisKKwltZi0+Y29sb3JzcGFjZSAgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOworCW1mLT53aWR0aCAgICAgICA9IDA7CisJbWYtPmhlaWdodCAgICAgID0gMDsKKwltZi0+ZmllbGQgICAgICAgPSBWNEwyX0ZJRUxEX0FOWTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdjcxNzVfc19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwl1OCB2YWwgPSBhZHY3MTc1X3JlYWQoc2QsIDB4Nyk7CisJaW50IHJldDsKKworCXN3aXRjaCAobWYtPmNvZGUpIHsKKwljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgorCQl2YWwgJj0gfjB4NDA7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzFYMTY6CisJCXZhbCB8PSAweDQwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwKKwkJCSJpbGxlZ2FsIHY0bDJfbWJ1c19mcmFtZWZtdCBjb2RlOiAlZFxuIiwgbWYtPmNvZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBhZHY3MTc1X3dyaXRlKHNkLCAweDcsIHZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGFkdjcxNzVfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICpjaGlwKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKQEAgLTMyNCw2ICszODMsOSBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgYWR2NzE3NV92aWRlb19vcHMgPSB7CiAJLnNfc3RkX291dHB1dCA9IGFkdjcxNzVfc19zdGRfb3V0cHV0LAogCS5zX3JvdXRpbmcgPSBhZHY3MTc1X3Nfcm91dGluZywKKwkuc19tYnVzX2ZtdCA9IGFkdjcxNzVfc19mbXQsCisJLmdfbWJ1c19mbXQgPSBhZHY3MTc1X2dfZm10LAorCS5lbnVtX21idXNfZm10ICA9IGFkdjcxNzVfZW51bV9mbXQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBhZHY3MTc1X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWs4ODF4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FrODgxeC5jCmluZGV4IGIzODg2NTQuLjUzYzQ5NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWs4ODF4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hazg4MXguYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL2FrODgxeC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hdG1lbC1pc2kuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXRtZWwtaXNpLmMKaW5kZXggN2I4OWYwMC4uOGM3NzVjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hdG1lbC1pc2kuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F0bWVsLWlzaS5jCkBAIC05NCw2ICs5NCw3IEBACiAJdW5zaWduZWQgaW50CQkJaXJxOwogCiAJc3RydWN0IGlzaV9wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKKwl1MTYJCQkJd2lkdGhfZmxhZ3M7CS8qIG1heCAxMiBiaXRzICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCQl2aWRlb19idWZmZXJfbGlzdDsKIAlzdHJ1Y3QgZnJhbWVfYnVmZmVyCQkqYWN0aXZlOwpAQCAtMjQ4LDkgKzI0OSw5IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlWaWRlb2J1ZiBvcGVyYXRpb25zCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpuYnVmZmVycywKLQkJCQl1bnNpZ25lZCBpbnQgKm5wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKLQkJCQl2b2lkICphbGxvY19jdHhzW10pCitzdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKKwkJCQl1bnNpZ25lZCBpbnQgKm5idWZmZXJzLCB1bnNpZ25lZCBpbnQgKm5wbGFuZXMsCisJCQkJdW5zaWduZWQgaW50IHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwpAQCAtMzQxLDcgKzM0Miw3IEBACiAKIAkJCS8qIEluaXRpYWxpemUgdGhlIGRtYSBkZXNjcmlwdG9yICovCiAJCQlkZXNjLT5wX2ZiZC0+ZmJfYWRkcmVzcyA9Ci0JCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOwogCQkJZGVzYy0+cF9mYmQtPm5leHRfZmJkX2FkZHJlc3MgPSAwOwogCQkJc2V0X2RtYV9jdHJsKGRlc2MtPnBfZmJkLCBJU0lfRE1BX0NUUkxfV0IpOwogCkBAIC00MDQsMTIgKzQwNSwxMyBAQAogCiAJaWYgKGlzaS0+YWN0aXZlID09IE5VTEwpIHsKIAkJaXNpLT5hY3RpdmUgPSBidWY7Ci0JCXN0YXJ0X2RtYShpc2ksIGJ1Zik7CisJCWlmICh2YjJfaXNfc3RyZWFtaW5nKHZiLT52YjJfcXVldWUpKQorCQkJc3RhcnRfZG1hKGlzaSwgYnVmKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNpLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQorc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwpAQCAtNDMxLDE3ICs0MzMsMjYgQEAKIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaXNpLT52c3luY193cSwKIAkJCQkgICAgICAgaXNpLT5zdGF0ZSAhPSBJU0lfU1RBVEVfSURMRSk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnI7CiAKLQlpZiAoaXNpLT5zdGF0ZSAhPSBJU0lfU1RBVEVfUkVBRFkpCi0JCXJldHVybiAtRUlPOworCWlmIChpc2ktPnN0YXRlICE9IElTSV9TVEFURV9SRUFEWSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CiAKIAlzcGluX2xvY2tfaXJxKCZpc2ktPmxvY2spOwogCWlzaS0+c3RhdGUgPSBJU0lfU1RBVEVfV0FJVF9TT0Y7CiAJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRESVMsIElTSV9TUl9WU1lOQyk7CisJaWYgKGNvdW50KQorCQlzdGFydF9kbWEoaXNpLCBpc2ktPmFjdGl2ZSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZpc2ktPmxvY2spOwogCiAJcmV0dXJuIDA7CitlcnI6CisJaXNpLT5hY3RpdmUgPSBOVUxMOworCWlzaS0+c2VxdWVuY2UgPSAwOworCUlOSVRfTElTVF9IRUFEKCZpc2ktPnZpZGVvX2J1ZmZlcl9saXN0KTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBhYm9ydCBzdHJlYW1pbmcgYW5kIHdhaXQgZm9yIGxhc3QgYnVmZmVyICovCkBAIC02MzcsNTAgKzY0OCw0MiBAQAogCQkgZm10LT5wYWNraW5nID09IFNPQ19NQlVTX1BBQ0tJTkdfRVhURU5EMTYpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYWtlX2J1c19wYXJhbShzdHJ1Y3QgYXRtZWxfaXNpICppc2kpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQkvKgotCSAqIFBsYXRmb3JtIHNwZWNpZmllZCBzeW5jaHJvbml6YXRpb24gYW5kIHBpeGVsIGNsb2NrIHBvbGFyaXRpZXMgYXJlCi0JICogb25seSBhIHJlY29tbWVuZGF0aW9uIGFuZCBhcmUgb25seSB1c2VkIGR1cmluZyBwcm9iaW5nLiBBdG1lbCBJU0kKLQkgKiBjYW1lcmEgaW50ZXJmYWNlIG9ubHkgd29ya3MgaW4gbWFzdGVyIG1vZGUsIGkuZS4sIHVzZXMgSFNZTkMgYW5kCi0JICogVlNZTkMgc2lnbmFscyBmcm9tIHRoZSBzZW5zb3IKLQkgKi8KLQlmbGFncyA9IFNPQ0FNX01BU1RFUiB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcgfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIOwotCi0JaWYgKGlzaS0+cGRhdGEtPmRhdGFfd2lkdGhfZmxhZ3MgJiBJU0lfREFUQVdJRFRIXzEwKQotCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTA7Ci0KLQlpZiAoaXNpLT5wZGF0YS0+ZGF0YV93aWR0aF9mbGFncyAmIElTSV9EQVRBV0lEVEhfOCkKLQkJZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzg7Ci0KLQlpZiAoZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSykKLQkJcmV0dXJuIGZsYWdzOwotCi0JcmV0dXJuIDA7Ci19CisjZGVmaW5lIElTSV9CVVNfUEFSQU0gKFY0TDJfTUJVU19NQVNURVIgfAlcCisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CVwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cgfAlcCisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8CVwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cgfAlcCisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfAlcCisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwJXAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCkKIAogc3RhdGljIGludCBpc2lfY2FtZXJhX3RyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICAgIHVuc2lnbmVkIGNoYXIgYnVzd2lkdGgpCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7Ci0JdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3M7CisJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgY2ZnID0gey50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMLH07CisJdW5zaWduZWQgbG9uZyBjb21tb25fZmxhZ3M7CiAJaW50IHJldDsKIAotCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKLQlyZXQgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywKLQkJCQkJbWFrZV9idXNfcGFyYW0oaXNpKSk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLAorCQkJCQkJCSAgSVNJX0JVU19QQVJBTSk7CisJCWlmICghY29tbW9uX2ZsYWdzKSB7CisJCQlkZXZfd2FybihpY2QtPnBhcmVudCwKKwkJCQkgIkZsYWdzIGluY29tcGF0aWJsZTogY2FtZXJhIDB4JXgsIGhvc3QgMHgleFxuIiwKKwkJCQkgY2ZnLmZsYWdzLCBJU0lfQlVTX1BBUkFNKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCgxIDw8IChidXN3aWR0aCAtIDEpKSAmIGlzaS0+d2lkdGhfZmxhZ3MpCisJCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOwogfQogCiAKQEAgLTgwMiw1OSArODA1LDcxIEBACiAKIHN0YXRpYyBpbnQgaXNpX2NhbWVyYV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCB1MzIgcGl4Zm10KQogeworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OwotCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmcgPSB7LnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsfTsKKwl1bnNpZ25lZCBsb25nIGNvbW1vbl9mbGFnczsKIAlpbnQgcmV0OwogCXUzMiBjZmcxID0gMDsKIAotCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKLQotCWJ1c19mbGFncyA9IG1ha2VfYnVzX3BhcmFtKGlzaSk7Ci0JY29tbW9uX2ZsYWdzID0gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsIGJ1c19mbGFncyk7Ci0JZGV2X2RiZyhpY2QtPnBhcmVudCwgIkZsYWdzIGNhbTogMHglbHggaG9zdDogMHglbHggY29tbW9uOiAweCVseFxuIiwKLQkJY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MsIGNvbW1vbl9mbGFncyk7Ci0JaWYgKCFjb21tb25fZmxhZ3MpCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLAorCQkJCQkJCSAgSVNJX0JVU19QQVJBTSk7CisJCWlmICghY29tbW9uX2ZsYWdzKSB7CisJCQlkZXZfd2FybihpY2QtPnBhcmVudCwKKwkJCQkgIkZsYWdzIGluY29tcGF0aWJsZTogY2FtZXJhIDB4JXgsIGhvc3QgMHgleFxuIiwKKwkJCQkgY2ZnLmZsYWdzLCBJU0lfQlVTX1BBUkFNKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJY29tbW9uX2ZsYWdzID0gSVNJX0JVU19QQVJBTTsKKwl9CisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIkZsYWdzIGNhbTogMHgleCBob3N0OiAweCV4IGNvbW1vbjogMHglbHhcbiIsCisJCWNmZy5mbGFncywgSVNJX0JVU19QQVJBTSwgY29tbW9uX2ZsYWdzKTsKIAogCS8qIE1ha2UgY2hvaXNlcywgYmFzZWQgb24gcGxhdGZvcm0gcHJlZmVyZW5jZXMgKi8KLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKSkgewogCQlpZiAoaXNpLT5wZGF0YS0+aHN5bmNfYWN0X2xvdykKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fSFNZTkNfQUNUSVZFX0hJR0g7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSDsKIAkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfTE9XOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVzsKIAl9CiAKLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKSkgewogCQlpZiAoaXNpLT5wZGF0YS0+dnN5bmNfYWN0X2xvdykKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fVlNZTkNfQUNUSVZFX0hJR0g7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSDsKIAkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfTE9XOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVzsKIAl9CiAKLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykgJiYKLQkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CiAJCWlmIChpc2ktPnBkYXRhLT5wY2xrX2FjdF9mYWxsaW5nKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkc7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkc7CiAJCWVsc2UKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfRkFMTElORzsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkc7CiAJfQogCi0JcmV0ID0gaWNkLT5vcHMtPnNldF9idXNfcGFyYW0oaWNkLCBjb21tb25fZmxhZ3MpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9kYmcoaWNkLT5wYXJlbnQsICJDYW1lcmEgc2V0X2J1c19wYXJhbSglbHgpIHJldHVybmVkICVkXG4iLAorCWNmZy5mbGFncyA9IGNvbW1vbl9mbGFnczsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkgeworCQlkZXZfZGJnKGljZC0+cGFyZW50LCAiY2FtZXJhIHNfbWJ1c19jb25maWcoMHglbHgpIHJldHVybmVkICVkXG4iLAogCQkJY29tbW9uX2ZsYWdzLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIHNldCBidXMgcGFyYW0gZm9yIElTSSAqLwotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKQorCWlmIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykKIAkJY2ZnMSB8PSBJU0lfQ0ZHMV9IU1lOQ19QT0xfQUNUSVZFX0xPVzsKLQlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpCiAJCWNmZzEgfD0gSVNJX0NGRzFfVlNZTkNfUE9MX0FDVElWRV9MT1c7Ci0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpCisJaWYgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKQogCQljZmcxIHw9IElTSV9DRkcxX1BJWENMS19QT0xfQUNUSVZFX0ZBTExJTkc7CiAKIAlpZiAoaXNpLT5wZGF0YS0+aGFzX2VtYl9zeW5jKQpAQCAtOTczLDYgKzk4OCwxMSBAQAogCQlnb3RvIGVycl9pb3JlbWFwOwogCX0KIAorCWlmIChwZGF0YS0+ZGF0YV93aWR0aF9mbGFncyAmIElTSV9EQVRBV0lEVEhfOCkKKwkJaXNpLT53aWR0aF9mbGFncyA9IDEgPDwgNzsKKwlpZiAocGRhdGEtPmRhdGFfd2lkdGhfZmxhZ3MgJiBJU0lfREFUQVdJRFRIXzEwKQorCQlpc2ktPndpZHRoX2ZsYWdzIHw9IDEgPDwgOTsKKwogCWlzaV93cml0ZWwoaXNpLCBJU0lfQ1RSTCwgSVNJX0NUUkxfRElTKTsKIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L01ha2VmaWxlCmluZGV4IDVjN2YyZjcuLmJkMjIyMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L01ha2VmaWxlCkBAIC0yLDggKzIsOCBAQAogCiBvYmotJChDT05GSUdfVklERU9fQVUwODI4KSArPSBhdTA4MjgubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcwogCi1FWFRSQV9DRkxBR1MgKz0gJChleHRyYS1jZmxhZ3MteSkgJChleHRyYS1jZmxhZ3MtbSkKK2NjZmxhZ3MteSArPSAkKGV4dHJhLWNmbGFncy15KSAkKGV4dHJhLWNmbGFncy1tKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jCmluZGV4IGY4NzIwNDQuLjg1OWVhYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MTkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODE5LmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCWlmIChwc3RkKQogCQkqcHN0ZCA9IHN0ZDsKIAlpZiAocHN0YXR1cykKLQkJKnBzdGF0dXMgPSBzdGF0dXM7CisJCSpwc3RhdHVzID0gcmVzOwogCiAJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiZ2V0IHN0YXR1cyAleFxuIiwgc3RhdHVzKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L01ha2VmaWxlCmluZGV4IGU0MTVmNmYuLjNmOWEyYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9NYWtlZmlsZQpAQCAtOCw2ICs4LDYgQEAKIAogb2JqLSQoQ09ORklHX1ZJREVPX0JUODQ4KSArPSBidHR2Lm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwppbmRleCA1YjE1ZjYzLi41OTM5MDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwpAQCAtMjUsNiArMjUsOCBAQAogCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KQEAgLTI5MDUsMTkgKzI5MDcsMTcgQEAKIAogCQlpZiAodHlwZSAhPSAtMSkgewogCQkJLyogZm91bmQgaXQgKi8KLQkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZGV0ZWN0ZWQ6ICVzIFtjYXJkPSVkXSwgIgotCQkJICAgICAgICJQQ0kgc3Vic3lzdGVtIElEIGlzICUwNHg6JTA0eFxuIiwKLQkJCSAgICAgICBidHYtPmMubnIsY2FyZHNbdHlwZV0ubmFtZSxjYXJkc1t0eXBlXS5jYXJkbnIsCi0JCQkgICAgICAgYnR2LT5jYXJkaWQgJiAweGZmZmYsCi0JCQkgICAgICAgKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CisJCQlwcl9pbmZvKCIlZDogZGV0ZWN0ZWQ6ICVzIFtjYXJkPSVkXSwgUENJIHN1YnN5c3RlbSBJRCBpcyAlMDR4OiUwNHhcbiIsCisJCQkJYnR2LT5jLm5yLCBjYXJkc1t0eXBlXS5uYW1lLCBjYXJkc1t0eXBlXS5jYXJkbnIsCisJCQkJYnR2LT5jYXJkaWQgJiAweGZmZmYsCisJCQkJKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CiAJCQlidHYtPmMudHlwZSA9IGNhcmRzW3R5cGVdLmNhcmRucjsKIAkJfSBlbHNlIHsKIAkJCS8qIDQwNCAqLwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzdWJzeXN0ZW06ICUwNHg6JTA0eCAoVU5LTk9XTilcbiIsCi0JCQkgICAgICAgYnR2LT5jLm5yLCBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKLQkJCSAgICAgICAoYnR2LT5jYXJkaWQgPj4gMTYpICYgMHhmZmZmKTsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJwbGVhc2UgbWFpbCBpZCwgYm9hcmQgbmFtZSBhbmQgIgotCQkJICAgICAgICJ0aGUgY29ycmVjdCBjYXJkPSBpbnNtb2Qgb3B0aW9uIHRvIGxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZ1xuIik7CisJCQlwcl9pbmZvKCIlZDogc3Vic3lzdGVtOiAlMDR4OiUwNHggKFVOS05PV04pXG4iLAorCQkJCWJ0di0+Yy5uciwgYnR2LT5jYXJkaWQgJiAweGZmZmYsCisJCQkJKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CisJCQlwcl9kZWJ1ZygicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUgYW5kIHRoZSBjb3JyZWN0IGNhcmQ9IGluc21vZCBvcHRpb24gdG8gbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnXG4iKTsKIAkJfQogCX0KIApAQCAtMjkyNiwxMCArMjkyNiwxMCBAQAogCQlidHYtPmMudHlwZT1jYXJkW2J0di0+Yy5ucl07CiAKIAkvKiBwcmludCB3aGljaCBjYXJkIGNvbmZpZyB3ZSBhcmUgdXNpbmcgKi8KLQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHVzaW5nOiAlcyBbY2FyZD0lZCwlc11cbiIsYnR2LT5jLm5yLAotCSAgICAgICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlLAotCSAgICAgICBjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzCi0JICAgICAgID8gImluc21vZCBvcHRpb24iIDogImF1dG9kZXRlY3RlZCIpOworCXByX2luZm8oIiVkOiB1c2luZzogJXMgW2NhcmQ9JWQsJXNdXG4iLAorCQlidHYtPmMubnIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmFtZSwgYnR2LT5jLnR5cGUsCisJCWNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMKKwkJPyAiaW5zbW9kIG9wdGlvbiIgOiAiYXV0b2RldGVjdGVkIik7CiAKIAkvKiBvdmVyd3JpdGUgZ3BpbyBzdHVmZiA/PyAqLwogCWlmIChVTlNFVCA9PSBhdWRpb2FsbCAmJiBVTlNFVCA9PSBhdWRpb211eFswXSkKQEAgLTI5NDgsMTIgKzI5NDgsMTMgQEAKIAkJfQogCX0KIAlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrID0gKFVOU0VUICE9IGdwaW9tYXNrKSA/IGdwaW9tYXNrIDogZ3Bpb2JpdHM7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKLQkgICAgICAgYnR2LT5jLm5yLGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2spOworCXByX2luZm8oIiVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKKwkJYnR2LT5jLm5yLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHR2X3R2Y2FyZHMtPmdwaW9tdXgpOyBpKyspIHsKLQkJcHJpbnRrKCIlczB4JXgiLCBpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb211eFtpXSk7CisJCXByX2NvbnQoIiVzMHgleCIsCisJCQlpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb211eFtpXSk7CiAJfQotCXByaW50aygiXG4iKTsKKwlwcl9jb250KCJcbiIpOwogfQogCiAvKgpAQCAtMjk3NCw4ICsyOTc1LDggQEAKIAogCWlmICgtMSAhPSB0eXBlKSB7CiAJCWJ0di0+Yy50eXBlID0gdHlwZTsKLQkJcHJpbnRrKCJidHR2JWQ6IGRldGVjdGVkIGJ5IGVlcHJvbTogJXMgW2NhcmQ9JWRdXG4iLAotCQkgICAgICAgYnR2LT5jLm5yLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlKTsKKwkJcHJfaW5mbygiJWQ6IGRldGVjdGVkIGJ5IGVlcHJvbTogJXMgW2NhcmQ9JWRdXG4iLAorCQkJYnR2LT5jLm5yLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlKTsKIAl9CiB9CiAKQEAgLTMwMTksNyArMzAyMCw3IEBACiAJCXR1bmVyX3R5cGUgPSAzOyAgLyogUGhpbGlwcyBTRUNBTSgrUEFMKSBGUTEyMTZNRSBvciBGSTEyMTZNRiAqLwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvX2dwaW86IHVua25vd24gdHVuZXIgdHlwZS5cbiIsIGJ0di0+Yy5ucik7CisJCXByX2luZm8oIiVkOiBGbHlWaWRlb19ncGlvOiB1bmtub3duIHR1bmVyIHR5cGVcbiIsIGJ0di0+Yy5ucik7CiAJCWJyZWFrOwogCX0KIApAQCAtMzAzNiwxMyArMzAzNywxMyBAQAogCWlmIChpc19jYXB0dXJlX29ubHkpCiAJCXR1bmVyX3R5cGUgPSBUVU5FUl9BQlNFTlQ7IC8qIE5vIHR1bmVyIHByZXNlbnQgKi8KIAotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW8gUmFkaW89JXMgUmVtb3RlQ29udHJvbD0lcyBUdW5lcj0lZCBncGlvPTB4JTA2eFxuIiwKLQkJYnR2LT5jLm5yLCBoYXNfcmFkaW8gPyAieWVzIiA6ICJubyAiLAotCQloYXNfcmVtb3RlID8gInllcyIgOiAibm8gIiwgdHVuZXJfdHlwZSwgZ3Bpbyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlbyAgTFI5MD0lcyB0ZGE5ODIxL3RkYTk4MjA9JXMgY2FwdHVyZV9vbmx5PSVzXG4iLAotCQlidHYtPmMubnIsIGlzX2xyOTAgPyAieWVzIiA6ICJubyAiLAotCQloYXNfdGRhOTgyMF90ZGE5ODIxID8gInllcyIgOiAibm8gIiwKLQkJaXNfY2FwdHVyZV9vbmx5ID8gInllcyIgOiAibm8gIik7CisJcHJfaW5mbygiJWQ6IEZseVZpZGVvIFJhZGlvPSVzIFJlbW90ZUNvbnRyb2w9JXMgVHVuZXI9JWQgZ3Bpbz0weCUwNnhcbiIsCisJCWJ0di0+Yy5uciwgaGFzX3JhZGlvID8gInllcyIgOiAibm8iLAorCQloYXNfcmVtb3RlID8gInllcyIgOiAibm8iLCB0dW5lcl90eXBlLCBncGlvKTsKKwlwcl9pbmZvKCIlZDogRmx5VmlkZW8gIExSOTA9JXMgdGRhOTgyMS90ZGE5ODIwPSVzIGNhcHR1cmVfb25seT0lc1xuIiwKKwkJYnR2LT5jLm5yLCBpc19scjkwID8gInllcyIgOiAibm8iLAorCQloYXNfdGRhOTgyMF90ZGE5ODIxID8gInllcyIgOiAibm8iLAorCQlpc19jYXB0dXJlX29ubHkgPyAieWVzIiA6ICJubyIpOwogCiAJaWYgKHR1bmVyX3R5cGUgIT0gVU5TRVQpIC8qIG9ubHkgc2V0IGlmIGtub3duIHR1bmVyIGF1dG9kZXRlY3RlZCwgZWxzZSBsZXQgaW5zbW9kIG9wdGlvbiB0aHJvdWdoICovCiAJCWJ0di0+dHVuZXJfdHlwZSA9IHR1bmVyX3R5cGU7CkBAIC0zMDkxLDEyICszMDkyLDExIEBACiAJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9CT0FSRF9QSU5OQUNMRSkKIAkJCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfUElOTkFDTEVQUk87CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgImJ0dHYlZDogbWlybzogaWQ9JWQgdHVuZXI9JWQgcmFkaW89JXMgc3RlcmVvPSVzXG4iLAotCQkgICAgICAgYnR2LT5jLm5yLCBpZCsxLCBidHYtPnR1bmVyX3R5cGUsCi0JCSAgICAgICAhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKLQkJICAgICAgIChidHYtPmhhc19tYXRjaGJveCA/ICJtYXRjaGJveCIgOiAiZm10dW5lciIpLAotCQkgICAgICAgKC0xID09IG1zcCkgPyAibm8iIDogInllcyIpOworCQlwcl9pbmZvKCIlZDogbWlybzogaWQ9JWQgdHVuZXI9JWQgcmFkaW89JXMgc3RlcmVvPSVzXG4iLAorCQkJYnR2LT5jLm5yLCBpZCsxLCBidHYtPnR1bmVyX3R5cGUsCisJCQkhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKKwkJCShidHYtPmhhc19tYXRjaGJveCA/ICJtYXRjaGJveCIgOiAiZm10dW5lciIpLAorCQkJKC0xID09IG1zcCkgPyAibm8iIDogInllcyIpOwogCX0gZWxzZSB7CiAJCS8qIG5ldyBjYXJkcyB3aXRoIG1pY3JvdHVuZSB0dW5lciAqLwogCQlpZCA9IDYzIC0gaWQ7CkBAIC0zMTM4LDkgKzMxMzgsOCBAQAogCQl9CiAJCWlmICgtMSAhPSBtc3ApCiAJCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfUElOTkFDTEVQUk87Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJidHR2JWQ6IHBpbm5hY2xlL210OiBpZD0lZCBpbmZvPVwiJXNcIiByYWRpbz0lc1xuIiwKLQkJICAgICAgIGJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKKwkJcHJfaW5mbygiJWQ6IHBpbm5hY2xlL210OiBpZD0lZCBpbmZvPVwiJXNcIiByYWRpbz0lc1xuIiwKKwkJCWJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKIAkJYnR2LT50dW5lcl90eXBlID0gVFVORVJfTVQyMDMyOwogCX0KIH0KQEAgLTMyMDIsNyArMzIwMSw3IEBACiAKIHN0YXRpYyB2b2lkIGluaXRfbG1sYnQ0eChzdHJ1Y3QgYnR0diAqYnR2KQogewotCXByaW50ayhLRVJOX0RFQlVHICJMTUxCVDR4IGluaXRcbiIpOworCXByX2RlYnVnKCJMTUxCVDR4IGluaXRcbiIpOwogCWJ0d3JpdGUoMHgwMDAwMDAsIEJUODQ4X0dQSU9fUkVHX0lOUCk7CiAJZ3Bpb19pbm91dCgweGZmZmZmZiwgMHgwMDA2QzApOwogCWdwaW9fd3JpdGUoMHgwMDAwMDApOwpAQCAtMzI0Niw3ICszMjQ1LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGJ0dHZfZGVidWcpCi0JCXByaW50aygiYnR0diVkOiBCVDg3OEEgQVJFU0VUXG4iLGJ0di0+Yy5ucik7CisJCXByX2RlYnVnKCIlZDogQlQ4NzhBIEFSRVNFVFxuIiwgYnR2LT5jLm5yKTsKIAlidHdyaXRlKCgxPDw3KSwgMHgwNTgpOwogCXVkZWxheSgxMCk7CiAJYnR3cml0ZSggICAgIDAsIDB4MDU4KTsKQEAgLTMzNDksNyArMzM0OCw4IEBACiAJY2FzZSBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjE6CiAJCWlmIChidHYtPmNhcmRpZCA9PSAweDMwMDIxNDRmKSB7CiAJCQlidHYtPmhhc19yYWRpbz0xOwotCQkJcHJpbnRrKCJidHR2JWQ6IHJhZGlvIGRldGVjdGVkIGJ5IHN1YnN5c3RlbSBpZCAoQ1BIMDV4KVxuIixidHYtPmMubnIpOworCQkJcHJfaW5mbygiJWQ6IHJhZGlvIGRldGVjdGVkIGJ5IHN1YnN5c3RlbSBpZCAoQ1BIMDV4KVxuIiwKKwkJCQlidHYtPmMubnIpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQlRUVl9CT0FSRF9TVEIyOgpAQCAtMzQzOCwxNyArMzQzOCwxNiBAQAogCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcltidHYtPmMubnJdOwogCiAJaWYgKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9BQlNFTlQpCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdHVuZXIgYWJzZW50XG4iLCBidHYtPmMubnIpOwotCWVsc2UgaWYoYnR2LT50dW5lcl90eXBlID09IFVOU0VUKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHR1bmVyIHR5cGUgdW5zZXRcbiIsIGJ0di0+Yy5ucik7CisJCXByX2luZm8oIiVkOiB0dW5lciBhYnNlbnRcbiIsIGJ0di0+Yy5ucik7CisJZWxzZSBpZiAoYnR2LT50dW5lcl90eXBlID09IFVOU0VUKQorCQlwcl93YXJuKCIlZDogdHVuZXIgdHlwZSB1bnNldFxuIiwgYnR2LT5jLm5yKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdHVuZXIgdHlwZT0lZFxuIiwgYnR2LT5jLm5yLAotCQkgICAgICAgYnR2LT50dW5lcl90eXBlKTsKKwkJcHJfaW5mbygiJWQ6IHR1bmVyIHR5cGU9JWRcbiIsIGJ0di0+Yy5uciwgYnR2LT50dW5lcl90eXBlKTsKIAogCWlmIChhdXRvbG9hZCAhPSBVTlNFVCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHRoZSBhdXRvbG9hZCBvcHRpb24gaXMgb2Jzb2xldGUuXG4iLCBidHYtPmMubnIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHVzZSBvcHRpb24gbXNwMzQwMCwgdGRhNzQzMiBvciB0dmF1ZGlvIHRvXG4iLCBidHYtPmMubnIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG92ZXJyaWRlIHdoaWNoIGF1ZGlvIG1vZHVsZSBzaG91bGQgYmUgdXNlZC5cbiIsIGJ0di0+Yy5ucik7CisJCXByX3dhcm4oIiVkOiB0aGUgYXV0b2xvYWQgb3B0aW9uIGlzIG9ic29sZXRlXG4iLCBidHYtPmMubnIpOworCQlwcl93YXJuKCIlZDogdXNlIG9wdGlvbiBtc3AzNDAwLCB0ZGE3NDMyIG9yIHR2YXVkaW8gdG8gb3ZlcnJpZGUgd2hpY2ggYXVkaW8gbW9kdWxlIHNob3VsZCBiZSB1c2VkXG4iLAorCQkJYnR2LT5jLm5yKTsKIAl9CiAKIAlpZiAoVU5TRVQgPT0gYnR2LT50dW5lcl90eXBlKQpAQCAtMzU0MSw4ICszNTQwLDcgQEAKIAl9CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHVua25vd24gYXVkaW9kZXYgdmFsdWUhXG4iLAotCQkJYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IHVua25vd24gYXVkaW9kZXYgdmFsdWUhXG4iLCBidHYtPmMubnIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNTg1LDggKzM1ODMsNyBAQAogCQlyZXR1cm47CiAKIG5vX2F1ZGlvOgotCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogYXVkaW8gYWJzZW50LCBubyBhdWRpbyBkZXZpY2UgZm91bmQhXG4iLAotCQkJYnR2LT5jLm5yKTsKKwlwcl93YXJuKCIlZDogYXVkaW8gYWJzZW50LCBubyBhdWRpbyBkZXZpY2UgZm91bmQhXG4iLCBidHYtPmMubnIpOwogfQogCiAKQEAgLTM2MzksMTkgKzM2MzYsMTkgQEAKIHsKIAlpZiggc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiVGVtaWMgNDA2NiBGWTUiLDE0KSA9PTApIHsKIAkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDXzQwNjZGWTVfUEFMX0k7Ci0JCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAotCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7CisJCXByX2luZm8oIiVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAorCQkJYnR2LT5jLm5yLCAmZWVwcm9tX2RhdGFbMHgxZV0pOwogCX0gZWxzZSBpZiAoc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiQWxwcyBUU0JCNSIsMTApID09MCkgewogCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfQUxQU19UU0JCNV9QQUxfSTsKLQkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCi0JCSAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKKwkJcHJfaW5mbygiJWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCisJCQlidHYtPmMubnIsICZlZXByb21fZGF0YVsweDFlXSk7CiAJfSBlbHNlIGlmIChzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJQaGlsaXBzIEZNMTI0NiIsMTQpID09MCkgewogCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfUEhJTElQU19OVFNDOwotCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKLQkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOworCQlwcl9pbmZvKCIlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKKwkJCWJ0di0+Yy5uciwgJmVlcHJvbV9kYXRhWzB4MWVdKTsKIAl9IGVsc2UgewotCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBVbmtub3duIFR1bmVyU3RyaW5nOiAlc1xuIiwKLQkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOworCQlwcl9pbmZvKCIlZDogTW9kdGVjOiBVbmtub3duIFR1bmVyU3RyaW5nOiAlc1xuIiwKKwkJCWJ0di0+Yy5uciwgJmVlcHJvbV9kYXRhWzB4MWVdKTsKIAl9CiB9CiAKQEAgLTM2NjMsNyArMzY2MCw3IEBACiAJYnR2LT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKIAlidHYtPmhhc19yYWRpbyAgPSB0di5oYXNfcmFkaW87CiAKLQlwcmludGsoImJ0dHYlZDogSGF1cHBhdWdlIGVlcHJvbSBpbmRpY2F0ZXMgbW9kZWwjJWRcbiIsCisJcHJfaW5mbygiJWQ6IEhhdXBwYXVnZSBlZXByb20gaW5kaWNhdGVzIG1vZGVsIyVkXG4iLAogCQlidHYtPmMubnIsIHR2Lm1vZGVsKTsKIAogCS8qCkBAIC0zNjcxLDcgKzM2NjgsNyBAQAogCSAqIHR5cGUgYmFzZWQgb24gbW9kZWwgIy4KIAkgKi8KIAlpZih0di5tb2RlbCA9PSA2NDkwMCkgewotCQlwcmludGsoImJ0dHYlZDogU3dpdGNoaW5nIGJvYXJkIHR5cGUgZnJvbSAlcyB0byAlc1xuIiwKKwkJcHJfaW5mbygiJWQ6IFN3aXRjaGluZyBib2FyZCB0eXBlIGZyb20gJXMgdG8gJXNcbiIsCiAJCQlidHYtPmMubnIsCiAJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsCiAJCQlidHR2X3R2Y2FyZHNbQlRUVl9CT0FSRF9IQVVQUEFVR0VfSU1QQUNUVkNCXS5uYW1lKTsKQEAgLTM2OTgsOCArMzY5NSw3IEBACiAJZnJlcT04ODAwMC82Mi41OwogCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogd3JpdGUgMHgxZWQ4ICovCiAJaWYgKDB4MWVkOCA9PSB0ZWE1NzU3X3JlYWQoYnR2KSkgewotCQlwcmludGsoImJ0dHYlZDogVGVycmF0ZWMgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgZm91bmQuXG4iLAotCQkgICAgICAgYnR2LT5jLm5yKTsKKwkJcHJfaW5mbygiJWQ6IFRlcnJhdGVjIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGZvdW5kXG4iLCBidHYtPmMubnIpOwogCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CiAJCWJ0di0+aGFzX3NhYTY1ODggID0gMTsKIAkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwpAQCAtMzc3MSwxMyArMzc2NywxMiBAQAogCiAJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgImhjd2FtYy5yYmYiLCAmYnR2LT5jLnBjaS0+ZGV2KTsKIAlpZiAocmMgIT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLAotCQkgICAgICAgYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLCBidHYtPmMubnIpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJjID0gcHZyX2FsdGVyYV9sb2FkKGJ0diwgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplKTsKLQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGFsdGVyYSBmaXJtd2FyZSB1cGxvYWQgJXNcbiIsCi0JICAgICAgIGJ0di0+Yy5uciwgKHJjIDwgMCkgPyAiZmFpbGVkIiA6ICJvayIpOworCXByX2luZm8oIiVkOiBhbHRlcmEgZmlybXdhcmUgdXBsb2FkICVzXG4iLAorCQlidHYtPmMubnIsIChyYyA8IDApID8gImZhaWxlZCIgOiAib2siKTsKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0zODczLDI5ICszODY4LDI3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIHVua25vd24uLi5sZWF2ZSBnZW5lcmljLCBidXQgZ2V0IHNlcmlhbCAjICovCi0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6ICIKLQkJCSAgICAgICAib3NwcmV5IGVlcHJvbTogdW5rbm93biBjYXJkIHR5cGUgMHglMDR4XG4iLAotCQkJICAgICAgIGJ0di0+Yy5uciwgdHlwZSk7CisJCQlwcl9pbmZvKCIlZDogb3NwcmV5IGVlcHJvbTogdW5rbm93biBjYXJkIHR5cGUgMHglMDR4XG4iLAorCQkJCWJ0di0+Yy5uciwgdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCQlzZXJpYWwgPSBnZXRfdW5hbGlnbmVkX2JlMzIoKF9fYmUzMiAqKShlZSs2KSk7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBvc3ByZXkgZWVwcm9tOiBjYXJkPSVkICclcycgc2VyaWFsPSV1XG4iLAotCSAgICAgICBidHYtPmMubnIsIGNhcmRpZCwKLQkgICAgICAgY2FyZGlkPjAgPyBidHR2X3R2Y2FyZHNbY2FyZGlkXS5uYW1lIDogIlVua25vd24iLCBzZXJpYWwpOworCXByX2luZm8oIiVkOiBvc3ByZXkgZWVwcm9tOiBjYXJkPSVkICclcycgc2VyaWFsPSV1XG4iLAorCQlidHYtPmMubnIsIGNhcmRpZCwKKwkJY2FyZGlkID4gMCA/IGJ0dHZfdHZjYXJkc1tjYXJkaWRdLm5hbWUgOiAiVW5rbm93biIsIHNlcmlhbCk7CiAKIAlpZiAoY2FyZGlkPDAgfHwgYnR2LT5jLnR5cGUgPT0gY2FyZGlkKQogCQlyZXR1cm47CiAKIAkvKiBjYXJkIHR5cGUgaXNuJ3Qgc2V0IGNvcnJlY3RseSAqLwogCWlmIChjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogIgotCQkgICAgICAgIk5vdCBvdmVycmlkaW5nIHVzZXIgc3BlY2lmaWVkIGNhcmQgdHlwZVxuIiwgYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IG9zcHJleSBlZXByb206IE5vdCBvdmVycmlkaW5nIHVzZXIgc3BlY2lmaWVkIGNhcmQgdHlwZVxuIiwKKwkJCWJ0di0+Yy5ucik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBvc3ByZXkgZWVwcm9tOiAiCi0JCSAgICAgICAiQ2hhbmdpbmcgY2FyZCB0eXBlIGZyb20gJWQgdG8gJWRcbiIsIGJ0di0+Yy5uciwKLQkJICAgICAgIGJ0di0+Yy50eXBlLCBjYXJkaWQpOworCQlwcl9pbmZvKCIlZDogb3NwcmV5IGVlcHJvbTogQ2hhbmdpbmcgY2FyZCB0eXBlIGZyb20gJWQgdG8gJWRcbiIsCisJCQlidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBjYXJkaWQpOwogCQlidHYtPmMudHlwZSA9IGNhcmRpZDsKIAl9CiB9CkBAIC0zOTM4LDE0ICszOTMxLDE0IEBACiAJCWlmICh0dW5lcl9mb3JtYXQgPT0gMHgwOSkKIAkJCXR1bmVyX3R5cGUgPSBUVU5FUl9MR19OVFNDX05FV19UQVBDOyAvKiBUQVBDLUc3MDJQICovCiAKLQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEF2ZXJtZWRpYSBlZXByb21bMHglMDJ4JTAyeF06IHR1bmVyPSIsCisJcHJfaW5mbygiJWQ6IEF2ZXJtZWRpYSBlZXByb21bMHglMDJ4JTAyeF06IHR1bmVyPSIsCiAJCWJ0di0+Yy5uciwgZWVwcm9tX2RhdGFbMHg0MV0sIGVlcHJvbV9kYXRhWzB4NDJdKTsKIAlpZiAodHVuZXJfdHlwZSkgewogCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcl90eXBlOwotCQlwcmludGsoS0VSTl9DT05UICIlZCIsIHR1bmVyX3R5cGUpOworCQlwcl9jb250KCIlZCIsIHR1bmVyX3R5cGUpOwogCX0gZWxzZQotCQlwcmludGsoS0VSTl9DT05UICJVbmtub3duIHR5cGUiKTsKLQlwcmludGsoS0VSTl9DT05UICIgcmFkaW86JXMgcmVtb3RlIGNvbnRyb2w6JXNcbiIsCisJCXByX2NvbnQoIlVua25vd24gdHlwZSIpOworCXByX2NvbnQoIiByYWRpbzolcyByZW1vdGUgY29udHJvbDolc1xuIiwKIAkgICAgICAgdHVuZXJfdHZfZm0gICAgID8gInllcyIgOiAibm8iLAogCSAgICAgICBidHYtPmhhc19yZW1vdGUgPyAieWVzIiA6ICJubyIpOwogfQpAQCAtMzk5Myw4ICszOTg2LDggQEAKIAlpZiAoYnR0dl9ncGlvKQogCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJtc3AzNHh4Iik7CiAJaWYgKGJ0dHZfdmVyYm9zZSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBIYXVwcGF1Z2UvVm9vZG9vIG1zcDM0eHg6IHJlc2V0IGxpbmUgIgotCQkgICAgICAgImluaXQgWyVkXVxuIiwgYnR2LT5jLm5yLCBwaW4pOworCQlwcl9pbmZvKCIlZDogSGF1cHBhdWdlL1Zvb2RvbyBtc3AzNHh4OiByZXNldCBsaW5lIGluaXQgWyVkXVxuIiwKKwkJCWJ0di0+Yy5uciwgcGluKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQwMzQsNyArNDAyNyw3IEBACiAJYnR3cml0ZShCVDg0OF9BRENfUkVTRVJWRUR8QlQ4NDhfQURDX0FHQ19FTiwgQlQ4NDhfQURDKTsKIAogCS8qCUluaXRpYWxpc2UgTUFYNTE3IERBQyAqLwotCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgREFDIHJlZmVyZW5jZSB2b2x0YWdlIGxldmVsIC4uLlxuIik7CisJcHJfaW5mbygiU2V0dGluZyBEQUMgcmVmZXJlbmNlIHZvbHRhZ2UgbGV2ZWwgLi4uXG4iKTsKIAlidHR2X0kyQ1dyaXRlKGJ0diwweDVFLDAsMHg4MCwxKTsKIAogCS8qCUluaXRpYWxpc2UgMTJDNTA4IFBJQyAqLwpAQCAtNDA0Myw3ICs0MDM2LDcgQEAKIAkgKglhcmd1bWVudCBzbyB0aGUgbnVtYmVycyBhcmUgZGlmZmVyZW50ICovCiAKIAotCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpc2luZyAxMkM1MDggUElDIGNoaXAgLi4uXG4iKTsKKwlwcl9pbmZvKCJJbml0aWFsaXNpbmcgMTJDNTA4IFBJQyBjaGlwIC4uLlxuIik7CiAKIAkvKiBGaXJzdCBvZiBhbGwsIGVuYWJsZSB0aGUgY2xvY2sgbGluZS4gVGhpcyBpcyB1c2VkIGluIHRoZSBQWEMyMDAtRiAqLwogCXZhbCA9IGJ0cmVhZChCVDg0OF9HUElPX0RNQV9DVEwpOwpAQCAtNDA2MiwxMyArNDA1NSwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbHMpOyBpKyspIHsKIAkJdG1wPWJ0dHZfSTJDV3JpdGUoYnR2LDB4MUUsMCx2YWxzW2ldLDEpOwogCQlpZiAodG1wICE9IC0xKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgIkkyQyBXcml0ZSglMi4yeCkgPSAlaVxuSTJDIFJlYWQgKCkgPSAlMi4yeFxuXG4iLAorCQkJcHJfaW5mbygiSTJDIFdyaXRlKCUyLjJ4KSA9ICVpXG5JMkMgUmVhZCAoKSA9ICUyLjJ4XG5cbiIsCiAJCQkgICAgICAgdmFsc1tpXSx0bXAsYnR0dl9JMkNSZWFkKGJ0diwweDFGLE5VTEwpKTsKIAkJfQogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIlBYQzIwMCBJbml0aWFsaXNlZC5cbiIpOworCXByX2luZm8oIlBYQzIwMCBJbml0aWFsaXNlZFxuIik7CiB9CiAKIApAQCAtNDEwNyw4ICs0MDk5LDcgQEAKIAl1aW50MzJfdCBkYXRhUmVhZCA9IDA7CiAJbG9uZyB3YXRjaGRvZ192YWx1ZSA9IDB4MEU7CiAKLQlwcmludGsgKEtFUk5fSU5GTwotCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uIGluIHByb2dyZXNzIC4uLlxuIiwKKwlwcl9pbmZvKCIlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbiBpbiBwcm9ncmVzcyAuLi5cbiIsCiAJCWJ0di0+Yy5ucik7CiAKIAlidHdyaXRlICgweDAwYzNmZWZmLCBCVDg0OF9HUElPX09VVF9FTik7CkBAIC00MTIyLDggKzQxMTMsNyBAQAogCWRhdGFSZWFkID0gYnRyZWFkIChCVDg0OF9HUElPX0RBVEEpOwogCiAJaWYgKCgoKGRhdGFSZWFkID4+IDE4KSAmIDB4MDEpICE9IDApIHx8ICgoKGRhdGFSZWFkID4+IDE5KSAmIDB4MDEpICE9IDEpKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPCi0JCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uKDEpIEVSUk9SX0NQTERfQ2hlY2tfRmFpbGVkIChyZWFkICVkKVxuIiwKKwkJcHJfaW5mbygiJWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24oMSkgRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgKHJlYWQgJWQpXG4iLAogCQkJYnR2LT5jLm5yLCBkYXRhUmVhZCk7CiAJfQogCkBAIC00MTM2LDE1ICs0MTI2LDEzIEBACiAJZGF0YVJlYWQgPSBidHJlYWQgKEJUODQ4X0dQSU9fREFUQSk7CiAKIAlpZiAoKCgoZGF0YVJlYWQgPj4gMTgpICYgMHgwMSkgIT0gMCkgfHwgKCgoZGF0YVJlYWQgPj4gMTkpICYgMHgwMSkgIT0gMCkpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8KLQkJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24oMikgRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgKHJlYWQgJWQpXG4iLAorCQlwcl9pbmZvKCIlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbigyKSBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCAocmVhZCAlZClcbiIsCiAJCQlidHYtPmMubnIsIGRhdGFSZWFkKTsKIAogCQlyZXR1cm47CiAJfQogCi0JcHJpbnRrIChLRVJOX0lORk8KLQkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbiBjb21wbGV0ZS5cbiIsIGJ0di0+Yy5ucik7CisJcHJfaW5mbygiJWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24gY29tcGxldGVcbiIsIGJ0di0+Yy5ucik7CiB9CiAKIApAQCAtNDI2MSwyMiArNDI0OSwyNSBAQAogCXdoaWxlIChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKIAkJc2NoZWR1bGUoKTsKIAlpZiAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiB0ZWE1NzU3OiByZWFkIHRpbWVvdXRcbiIsYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IHRlYTU3NTc6IHJlYWQgdGltZW91dFxuIiwgYnR2LT5jLm5yKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRwcmludGsoImJ0dHYlZDogdGVhNTc1NzoiLGJ0di0+Yy5ucik7CisJZHByaW50aygiJWQ6IHRlYTU3NTc6IiwgYnR2LT5jLm5yKTsKIAlmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykgewogCQl1ZGVsYXkoNSk7CiAJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKIAkJdWRlbGF5KDUpOwotCQlkcHJpbnRrKCIlYyIsKGJ1c19pbihidHYsYnR2LT5tYm94X21vc3QpID09IDApPydUJzonLScpOworCQlkcHJpbnRrX2NvbnQoIiVjIiwKKwkJCSAgICAgYnVzX2luKGJ0diwgYnR2LT5tYm94X21vc3QpID09IDAgPyAnVCcgOiAnLScpOwogCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKIAkJdmFsdWUgPDw9IDE7CiAJCXZhbHVlIHw9IChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSA9PSAwKT8wOjE7ICAvKiBNU0IgZmlyc3QgKi8KLQkJZHByaW50aygiJWMiLCAoYnVzX2luKGJ0dixidHYtPm1ib3hfbW9zdCkgPT0gMCk/J1MnOidNJyk7CisJCWRwcmludGtfY29udCgiJWMiLAorCQkJICAgICBidXNfaW4oYnR2LCBidHYtPm1ib3hfbW9zdCkgPT0gMCA/ICdTJyA6ICdNJyk7CiAJfQotCWRwcmludGsoIlxuYnR0diVkOiB0ZWE1NzU3OiByZWFkIDB4JVhcbiIsIGJ0di0+Yy5uciwgdmFsdWUpOworCWRwcmludGtfY29udCgiXG4iKTsKKwlkcHJpbnRrKCIlZDogdGVhNTc1NzogcmVhZCAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKIAlyZXR1cm4gdmFsdWU7CiB9CiAKQEAgLTQyOTUsNyArNDI4Niw3IEBACiAJaWYgKGJ0dHZfZ3BpbykKIAkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyB3cml0ZSIpOwogCi0JZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiB3cml0ZSAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKKwlkcHJpbnRrKCIlZDogdGVhNTc1Nzogd3JpdGUgMHglWFxuIiwgYnR2LT5jLm5yLCB2YWx1ZSk7CiAJYnVzX2xvdyhidHYsYnR2LT5tYm94X2Nsayk7CiAJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF93ZSk7CiAJZm9yIChpID0gMDsgaSA8IDI1OyBpKyspIHsKQEAgLTQ1NDcsNyArNDUzOCw3IEBACiBzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfbXV4c2VsIChzdHJ1Y3QgYnR0diogYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCiB7CiAKLQlkcHJpbnRrIChLRVJOX0RFQlVHICJidHR2JWQgOiBwaWNvbG9fdGV0cmFfbXV4c2VsID0+ICBpbnB1dCA9ICVkXG4iLGJ0di0+Yy5ucixpbnB1dCk7CisJZHByaW50aygiJWQgOiBwaWNvbG9fdGV0cmFfbXV4c2VsID0+ICBpbnB1dCA9ICVkXG4iLCBidHYtPmMubnIsIGlucHV0KTsKIAkvKkp1c3Qgc2V0IHRoZSByaWdodCBwYXRoIGluIHRoZSBhbmFsb2cgbXVsdGlwbGV4ZXJzIDogY2hhbm5lbCAxIC0+IDQgPT0+IEFuYWxvZyBNdXggPT0+IE1VWDAqLwogCS8qR1BJT1syMF0mR1BJT1syMV0gdXNlZCB0byBjaG9vc2UgdGhlIHJpZ2h0IGlucHV0Ki8KIAlidHdyaXRlIChpbnB1dDw8MjAsQlQ4NDhfR1BJT19EQVRBKTsKQEAgLTQ1OTIsNyArNDU4Myw3IEBACiAJaW50IGtleSA9IGlucHV0ICUgNDsKIAlpbnQgbWF0cml4ID0gaW5wdXQgLyA0OwogCi0JZHByaW50aygiYnR0diVkOiBpdmMxMjBfbXV4c2VsOiBJbnB1dCAtICUwMmQgfCBUREEgLSAlMDJkIHwgSW4gLSAlMDJkXG4iLAorCWRwcmludGsoIiVkOiBpdmMxMjBfbXV4c2VsOiBJbnB1dCAtICUwMmQgfCBUREEgLSAlMDJkIHwgSW4gLSAlMDJkXG4iLAogCQlidHYtPmMubnIsIGlucHV0LCBtYXRyaXgsIGtleSk7CiAKIAkvKiBIYW5kbGVzIHRoZSBpbnB1dCBzZWxlY3Rpb24gb24gdGhlIFREQTg1NDAncyAqLwpAQCAtNDY0OSwxNSArNDY0MCwxNyBAQAogCWJ1ZlsxXT0wOwogCXJjPWJ0dHZfSTJDV3JpdGUoYnR2LChQWF9JMkNfUElDPDwxKSxidWZbMF0sYnVmWzFdLDEpOwogCWlmIChyYykgewotCSAgcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogUFhDMjAwX211eHNlbDogcGljIGNmZyB3cml0ZSBmYWlsZWQ6JWRcbiIsIGJ0di0+Yy5ucixyYyk7CisJCXByX2RlYnVnKCIlZDogUFhDMjAwX211eHNlbDogcGljIGNmZyB3cml0ZSBmYWlsZWQ6JWRcbiIsCisJCQkgYnR2LT5jLm5yLCByYyk7CiAJICAvKiBub3QgUFhDID8gZG8gbm90aGluZyAqLwotCSAgcmV0dXJuOworCQlyZXR1cm47CiAJfQogCiAJcmM9YnR0dl9JMkNSZWFkKGJ0diwoUFhfSTJDX1BJQzw8MSksTlVMTCk7CiAJaWYgKCEocmMgJiBQWF9DRkdfUFhDMjAwRikpIHsKLQkgIHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IFBYQzIwMF9tdXhzZWw6IG5vdCBQWEMyMDBGIHJjOiVkIFxuIiwgYnR2LT5jLm5yLHJjKTsKLQkgIHJldHVybjsKKwkJcHJfZGVidWcoIiVkOiBQWEMyMDBfbXV4c2VsOiBub3QgUFhDMjAwRiByYzolZFxuIiwKKwkJCSBidHYtPmMubnIsIHJjKTsKKwkJcmV0dXJuOwogCX0KIAogCkBAIC00Njk2LDcgKzQ2ODksNyBAQAogCWVsc2UgLyogb2xkZXIgZGV2aWNlICovCiAJICBidGFuZCh+QlQ4NDhfSUZPUk1fTVVYU0VMLEJUODQ4X0lGT1JNKTsKIAotCXByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IHNldHRpbmcgaW5wdXQgY2hhbm5lbCB0bzolZFxuIiwgYnR2LT5jLm5yLChpbnQpbXV4KTsKKwlwcl9kZWJ1ZygiJWQ6IHNldHRpbmcgaW5wdXQgY2hhbm5lbCB0bzolZFxuIiwgYnR2LT5jLm5yLCAoaW50KW11eCk7CiB9CiAKIHN0YXRpYyB2b2lkIHBoeXRlY19tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQpAQCAtNDg0NywyOSArNDg0MCwyNyBAQAogCiAJLyogcHJpbnQgd2FybmluZ3MgYWJvdXQgYW55IHF1aXJrcyBmb3VuZCAqLwogCWlmICh0cml0b24xKQotCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBFVEJGIGVuYWJsZWQuXG4iKTsKKwkJcHJfaW5mbygiSG9zdCBicmlkZ2UgbmVlZHMgRVRCRiBlbmFibGVkXG4iKTsKIAlpZiAodnNmeCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2UgbmVlZHMgVlNGWCBlbmFibGVkLlxuIik7CisJCXByX2luZm8oIkhvc3QgYnJpZGdlIG5lZWRzIFZTRlggZW5hYmxlZFxuIik7CiAJaWYgKHBjaXBjaV9mYWlsKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IGJ0dHYgYW5kIHlvdXIgY2hpcHNldCBtYXkgbm90IHdvcmsgIgotCQkJCQkJCSJ0b2dldGhlci5cbiIpOworCQlwcl9pbmZvKCJidHR2IGFuZCB5b3VyIGNoaXBzZXQgbWF5IG5vdCB3b3JrIHRvZ2V0aGVyXG4iKTsKIAkJaWYgKCFub19vdmVybGF5KSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBvdmVybGF5IHdpbGwgYmUgZGlzYWJsZWQuXG4iKTsKKwkJCXByX2luZm8oIm92ZXJsYXkgd2lsbCBiZSBkaXNhYmxlZFxuIik7CiAJCQlub19vdmVybGF5ID0gMTsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IG92ZXJsYXkgZm9yY2VkLiBVc2UgdGhpcyAiCi0JCQkJCQkib3B0aW9uIGF0IHlvdXIgb3duIHJpc2suXG4iKTsKKwkJCXByX2luZm8oIm92ZXJsYXkgZm9yY2VkLiBVc2UgdGhpcyBvcHRpb24gYXQgeW91ciBvd24gcmlzay5cbiIpOwogCQl9CiAJfQogCWlmIChVTlNFVCAhPSBsYXRlbmN5KQotCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBwY2kgbGF0ZW5jeSBmaXh1cCBbJWRdXG4iLGxhdGVuY3kpOworCQlwcl9pbmZvKCJwY2kgbGF0ZW5jeSBmaXh1cCBbJWRdXG4iLCBsYXRlbmN5KTsKIAl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0MSwgZGV2KSkpIHsKIAkJdW5zaWduZWQgY2hhciBiOwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTMsICZiKTsKIAkJaWYgKGJ0dHZfZGVidWcpCi0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZTogODI0NDFGWCBOYXRvbWEsICIKLQkJCSAgICAgICAiYnVmY29uPTB4JTAyeFxuIixiKTsKKwkJCXByX2luZm8oIkhvc3QgYnJpZGdlOiA4MjQ0MUZYIE5hdG9tYSwgYnVmY29uPTB4JTAyeFxuIiwKKwkJCQliKTsKIAl9CiB9CiAKQEAgLTQ4ODIsMTIgKzQ4NzMsMTMgQEAKIAogCWlmIChidHR2X3ZlcmJvc2UpIHsKIAkJaWYgKHRyaXRvbjEpCi0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIEVUQkYgKDQzMEZYL1ZQMyBjb21wYXRpYmlsdHkpXG4iLGJ0di0+Yy5ucik7CisJCQlwcl9pbmZvKCIlZDogZW5hYmxpbmcgRVRCRiAoNDMwRlgvVlAzIGNvbXBhdGliaWxpdHkpXG4iLAorCQkJCWJ0di0+Yy5ucik7CiAJCWlmICh2c2Z4ICYmIGJ0di0+aWQgPj0gODc4KQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBlbmFibGluZyBWU0ZYXG4iLGJ0di0+Yy5ucik7CisJCQlwcl9pbmZvKCIlZDogZW5hYmxpbmcgVlNGWFxuIiwgYnR2LT5jLm5yKTsKIAkJaWYgKFVOU0VUICE9IGxhdGVuY3kpCi0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHNldHRpbmcgcGNpIHRpbWVyIHRvICVkXG4iLAotCQkJICAgICAgIGJ0di0+Yy5ucixsYXRlbmN5KTsKKwkJCXByX2luZm8oIiVkOiBzZXR0aW5nIHBjaSB0aW1lciB0byAlZFxuIiwKKwkJCQlidHYtPmMubnIsIGxhdGVuY3kpOwogCX0KIAogCWlmIChidHYtPmlkIDwgODc4KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKaW5kZXggMTQ0NDRkZS4uM2RkMDY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYwpAQCAtMzQsNiArMzQsOCBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC05NDIsOCArOTQ0LDggQEAKIHZvaWQgZnJlZV9idHJlc19sb2NrKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCBidHR2X2ZoICpmaCwgaW50IGJpdHMpCiB7CiAJaWYgKChmaC0+cmVzb3VyY2VzICYgYml0cykgIT0gYml0cykgewotCQkvKiB0cnlpbmcgdG8gZnJlZSByZXNzb3VyY2VzIG5vdCBhbGxvY2F0ZWQgYnkgdXMgLi4uICovCi0JCXByaW50aygiYnR0djogQlVHISAoYnRyZXMpXG4iKTsKKwkJLyogdHJ5aW5nIHRvIGZyZWUgcmVzb3VyY2VzIG5vdCBhbGxvY2F0ZWQgYnkgdXMgLi4uICovCisJCXByX2VycigiQlVHISAoYnRyZXMpXG4iKTsKIAl9CiAJZmgtPnJlc291cmNlcyAgJj0gfmJpdHM7CiAJYnR2LT5yZXNvdXJjZXMgJj0gfmJpdHM7CkBAIC0xMDAwLDcgKzEwMDIsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAoYnR2LT5wbGwucGxsX29mcmVxID09IGJ0di0+cGxsLnBsbF9jdXJyZW50KSB7Ci0JCWRwcmludGsoImJ0dHYlZDogUExMOiBubyBjaGFuZ2UgcmVxdWlyZWRcbiIsYnR2LT5jLm5yKTsKKwkJZHByaW50aygiJWQ6IFBMTDogbm8gY2hhbmdlIHJlcXVpcmVkXG4iLCBidHYtPmMubnIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDA4LDIxICsxMDEwLDIzIEBACiAJCS8qIG5vIFBMTCBuZWVkZWQgKi8KIAkJaWYgKGJ0di0+cGxsLnBsbF9jdXJyZW50ID09IDApCiAJCQlyZXR1cm47Ci0JCWJ0dHZfcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBQTEwgY2FuIHNsZWVwLCB1c2luZyBYVEFMICglZCkuXG4iLAotCQkJYnR2LT5jLm5yLGJ0di0+cGxsLnBsbF9pZnJlcSk7CisJCWlmIChidHR2X3ZlcmJvc2UpCisJCQlwcl9pbmZvKCIlZDogUExMIGNhbiBzbGVlcCwgdXNpbmcgWFRBTCAoJWQpXG4iLAorCQkJCWJ0di0+Yy5uciwgYnR2LT5wbGwucGxsX2lmcmVxKTsKIAkJYnR3cml0ZSgweDAwLEJUODQ4X1RHQ1RSTCk7CiAJCWJ0d3JpdGUoMHgwMCxCVDg0OF9QTExfWENJKTsKIAkJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAwOwogCQlyZXR1cm47CiAJfQogCi0JYnR0dl9wcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IFBMTDogJWQgPT4gJWQgIixidHYtPmMubnIsCi0JCWJ0di0+cGxsLnBsbF9pZnJlcSwgYnR2LT5wbGwucGxsX29mcmVxKTsKKwlpZiAoYnR0dl92ZXJib3NlKQorCQlwcl9pbmZvKCIlZDogU2V0dGluZyBQTEw6ICVkID0+ICVkIChuZWVkcyB1cCB0byAxMDBtcylcbiIsCisJCQlidHYtPmMubnIsCisJCQlidHYtPnBsbC5wbGxfaWZyZXEsIGJ0di0+cGxsLnBsbF9vZnJlcSk7CiAJc2V0X3BsbF9mcmVxKGJ0diwgYnR2LT5wbGwucGxsX2lmcmVxLCBidHYtPnBsbC5wbGxfb2ZyZXEpOwogCiAJZm9yIChpPTA7IGk8MTA7IGkrKykgewogCQkvKiAgTGV0IG90aGVyIHBlb3BsZSBydW4gd2hpbGUgdGhlIFBMTCBzdGFiaWxpemVzICovCi0JCWJ0dHZfcHJpbnRrKCIuIik7CiAJCW1zbGVlcCgxMCk7CiAKIAkJaWYgKGJ0cmVhZChCVDg0OF9EU1RBVFVTKSAmIEJUODQ4X0RTVEFUVVNfUExPQ0spIHsKQEAgLTEwMzAsMTIgKzEwMzQsMTQgQEAKIAkJfSBlbHNlIHsKIAkJCWJ0d3JpdGUoMHgwOCxCVDg0OF9UR0NUUkwpOwogCQkJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSBidHYtPnBsbC5wbGxfb2ZyZXE7Ci0JCQlidHR2X3ByaW50aygiIG9rXG4iKTsKKwkJCWlmIChidHR2X3ZlcmJvc2UpCisJCQkJcHJfaW5mbygiUExMIHNldCBva1xuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAtMTsKLQlidHR2X3ByaW50aygiZmFpbGVkXG4iKTsKKwlpZiAoYnR0dl92ZXJib3NlKQorCQlwcl9pbmZvKCJTZXR0aW5nIFBMTCBmYWlsZWRcbiIpOwogCXJldHVybjsKIH0KIApAQCAtMTA0Nyw3ICsxMDUzLDcgQEAKIAlpbnQgZnNjICAgICAgID0gYnR0dl90dm5vcm1zW2J0di0+dHZub3JtXS5Gc2M7CiAKIAlpZiAoYnR2LT5pbnB1dCA9PSBidHYtPmRpZykgewotCQlkcHJpbnRrKCJidHR2JWQ6IGxvYWQgZGlnaXRhbCB0aW1pbmcgdGFibGUgKHRhYmxlX2lkeD0lZClcbiIsCisJCWRwcmludGsoIiVkOiBsb2FkIGRpZ2l0YWwgdGltaW5nIHRhYmxlICh0YWJsZV9pZHg9JWQpXG4iLAogCQkJYnR2LT5jLm5yLHRhYmxlX2lkeCk7CiAKIAkJLyogdGltaW5nIGNoYW5nZS4uLnJlc2V0IHRpbWluZyBnZW5lcmF0b3IgYWRkcmVzcyAqLwpAQCAtMTA3Niw3ICsxMDgyLDcgQEAKIHsKIAlpbnQgdmFsdWU7CiAKLQkvLyBwcmludGsoImJ0dHY6IHNldCBicmlnaHQ6ICVkXG4iLGJyaWdodCk7IC8vIERFQlVHCisJLy8gcHJpbnRrKCJzZXQgYnJpZ2h0OiAlZFxuIiwgYnJpZ2h0KTsgLy8gREVCVUcKIAlidHYtPmJyaWdodCA9IGJyaWdodDsKIAogCS8qIFdlIHdhbnQgLTEyOCB0byAxMjcgd2UgZ2V0IDAtNjU1MzUgKi8KQEAgLTExNTAsOCArMTE1Niw3IEBACiAJfQogCW11eCA9IGJ0dHZfbXV4c2VsKGJ0diwgaW5wdXQpOwogCWJ0YW9yKG11eDw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwotCWRwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiB2aWRlbyBtdXg6IGlucHV0PSVkIG11eD0lZFxuIiwKLQkJYnR2LT5jLm5yLGlucHV0LG11eCk7CisJZHByaW50aygiJWQ6IHZpZGVvIG11eDogaW5wdXQ9JWQgbXV4PSVkXG4iLCBidHYtPmMubnIsIGlucHV0LCBtdXgpOwogCiAJLyogY2FyZCBzcGVjaWZpYyBob29rICovCiAJaWYoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tdXhzZWxfaG9vaykKQEAgLTE0NDAsNyArMTQ0NSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChidHR2X3ZlcmJvc2UpCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogcmVzZXQsIHJlaW5pdGlhbGl6ZVxuIixidHYtPmMubnIpOworCQlwcl9pbmZvKCIlZDogcmVzZXQsIHJlaW5pdGlhbGl6ZVxuIiwgYnR2LT5jLm5yKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOwogCWJ0di0+ZXJyb3JzPTA7CiAJYnR0dl9zZXRfZG1hKGJ0diwwKTsKQEAgLTE2MjIsOCArMTYyNyw4IEBACiAJdW5zaWduZWQgaW50IG91dGJpdHMsIGRhdGE7CiAJb3V0Yml0cyA9IGJ0cmVhZChCVDg0OF9HUElPX09VVF9FTik7CiAJZGF0YSAgICA9IGJ0cmVhZChCVDg0OF9HUElPX0RBVEEpOwotCXByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IGdwaW86IGVuPSUwOHgsIG91dD0lMDh4IGluPSUwOHggWyVzXVxuIiwKLQkgICAgICAgYnR2LT5jLm5yLG91dGJpdHMsZGF0YSAmIG91dGJpdHMsIGRhdGEgJiB+b3V0Yml0cywgY29tbWVudCk7CisJcHJfZGVidWcoIiVkOiBncGlvOiBlbj0lMDh4LCBvdXQ9JTA4eCBpbj0lMDh4IFslc11cbiIsCisJCSBidHYtPmMubnIsIG91dGJpdHMsIGRhdGEgJiBvdXRiaXRzLCBkYXRhICYgfm91dGJpdHMsIGNvbW1lbnQpOwogfQogCiBzdGF0aWMgdm9pZCBidHR2X2ZpZWxkX2NvdW50KHN0cnVjdCBidHR2ICpidHYpCkBAIC0xNjY4LDcgKzE2NzMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlkcHJpbnRrKCJzd2l0Y2hfb3ZlcmxheTogZW50ZXIgW25ldz0lcF1cbiIsbmV3KTsKKwlkcHJpbnRrKCJzd2l0Y2hfb3ZlcmxheTogZW50ZXIgW25ldz0lcF1cbiIsIG5ldyk7CiAJaWYgKG5ldykKIAkJbmV3LT52Yi5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKQEAgLTE2NzgsNyArMTY4Myw4IEBACiAJYnR0dl9zZXRfZG1hKGJ0diwgMHgwMyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOwogCWlmIChOVUxMICE9IG9sZCkgewotCQlkcHJpbnRrKCJzd2l0Y2hfb3ZlcmxheTogb2xkPSVwIHN0YXRlIGlzICVkXG4iLG9sZCxvbGQtPnZiLnN0YXRlKTsKKwkJZHByaW50aygic3dpdGNoX292ZXJsYXk6IG9sZD0lcCBzdGF0ZSBpcyAlZFxuIiwKKwkJCW9sZCwgb2xkLT52Yi5zdGF0ZSk7CiAJCWJ0dHZfZG1hX2ZyZWUoJmZoLT5jYXAsYnR2LCBvbGQpOwogCQlrZnJlZShvbGQpOwogCX0KQEAgLTIwMjksMTEgKzIwMzUsMTEgQEAKIAlzdHJ1Y3QgYnR0dl9maCAqZmggID0gZjsKIAlzdHJ1Y3QgYnR0diAqYnR2ID0gZmgtPmJ0djsKIAotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogPT09PT09PT0gIFNUQVJUIFNUQVRVUyBDQVJEICMlZCAgPT09PT09PT1cbiIsCi0JCQlidHYtPmMubnIsIGJ0di0+Yy5ucik7CisJcHJfaW5mbygiJWQ6ID09PT09PT09ICBTVEFSVCBTVEFUVVMgQ0FSRCAjJWQgID09PT09PT09XG4iLAorCQlidHYtPmMubnIsIGJ0di0+Yy5ucik7CiAJYnR0dl9jYWxsX2FsbChidHYsIGNvcmUsIGxvZ19zdGF0dXMpOwotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogPT09PT09PT0gIEVORCBTVEFUVVMgQ0FSRCAgICMlZCAgPT09PT09PT1cbiIsCi0JCQlidHYtPmMubnIsIGJ0di0+Yy5ucik7CisJcHJfaW5mbygiJWQ6ID09PT09PT09ICBFTkQgU1RBVFVTIENBUkQgICAjJWQgID09PT09PT09XG4iLAorCQlidHYtPmMubnIsIGJ0di0+Yy5ucik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1OTgsNyArMjYwNCw3IEBACiAJc3RydWN0IGJ0dHYgKmJ0diA9IGZoLT5idHY7CiAKIAlpZiAobm9fb3ZlcmxheSA+IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6IG5vX292ZXJsYXlcbiIpOworCQlwcl9lcnIoIlY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWTogbm9fb3ZlcmxheVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjY3Myw3ICsyNjc5LDcgQEAKIAlpbnQgcmM7CiAKIAlpZiAobm9fb3ZlcmxheSA+IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6IG5vX292ZXJsYXlcbiIpOworCQlwcl9lcnIoIlY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWTogbm9fb3ZlcmxheVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjcxNCw3ICsyNzIwLDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmICh1bmxpa2VseSghZmgtPm92LnNldHVwX29rKSkgewotCQkJZHByaW50aygiYnR0diVkOiBvdmVybGF5OiAhc2V0dXBfb2tcbiIsIGJ0di0+Yy5ucik7CisJCQlkcHJpbnRrKCIlZDogb3ZlcmxheTogIXNldHVwX29rXG4iLCBidHYtPmMubnIpOwogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJfQogCQlpZiAocmV0dmFsKQpAQCAtMzA5MSw4ICszMDk3LDggQEAKIAogCWlmIChmaC0+YnR2LT5lcnJvcnMpCiAJCWJ0dHZfcmVpbml0X2J0ODQ4KGZoLT5idHYpOwotCWRwcmludGsoImJ0dHYlZDogcmVhZCBjb3VudD0lZCB0eXBlPSVzXG4iLAotCQlmaC0+YnR2LT5jLm5yLChpbnQpY291bnQsdjRsMl90eXBlX25hbWVzW2ZoLT50eXBlXSk7CisJZHByaW50aygiJWQ6IHJlYWQgY291bnQ9JWQgdHlwZT0lc1xuIiwKKwkJZmgtPmJ0di0+Yy5uciwgKGludCljb3VudCwgdjRsMl90eXBlX25hbWVzW2ZoLT50eXBlXSk7CiAKIAlzd2l0Y2ggKGZoLT50eXBlKSB7CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CkBAIC0zMTc0LDcgKzMxODAsNyBAQAogCXN0cnVjdCBidHR2X2ZoICpmaDsKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IDA7CiAKLQlkcHJpbnRrKEtFUk5fREVCVUcgImJ0dHY6IG9wZW4gZGV2PSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpKTsKKwlkcHJpbnRrKCJvcGVuIGRldj0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSk7CiAKIAlpZiAodmRldi0+dmZsX3R5cGUgPT0gVkZMX1RZUEVfR1JBQkJFUikgewogCQl0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwpAQCAtMzE4NSw4ICszMTkxLDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IG9wZW4gY2FsbGVkICh0eXBlPSVzKVxuIiwKLQkJYnR2LT5jLm5yLHY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7CisJZHByaW50aygiJWQ6IG9wZW4gY2FsbGVkICh0eXBlPSVzKVxuIiwKKwkJYnR2LT5jLm5yLCB2NGwyX3R5cGVfbmFtZXNbdHlwZV0pOwogCiAJLyogYWxsb2NhdGUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwogCWZoID0ga21hbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7CkBAIC0zMjg4LDcgKzMyOTQsNyBAQAogewogCXN0cnVjdCBidHR2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCWRwcmludGsoImJ0dHYlZDogbW1hcCB0eXBlPSVzIDB4JWx4KyVsZFxuIiwKKwlkcHJpbnRrKCIlZDogbW1hcCB0eXBlPSVzIDB4JWx4KyVsZFxuIiwKIAkJZmgtPmJ0di0+Yy5uciwgdjRsMl90eXBlX25hbWVzW2ZoLT50eXBlXSwKIAkJdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KTsKIAlyZXR1cm4gdmlkZW9idWZfbW1hcF9tYXBwZXIoYnR0dl9xdWV1ZShmaCksdm1hKTsKQEAgLTMzNzAsOSArMzM3Niw5IEBACiAJc3RydWN0IGJ0dHYgKmJ0diA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IGJ0dHZfZmggKmZoOwogCi0JZHByaW50aygiYnR0djogb3BlbiBkZXY9JXNcbiIsIHZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpOworCWRwcmludGsoIm9wZW4gZGV2PSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpKTsKIAotCWRwcmludGsoImJ0dHYlZDogb3BlbiBjYWxsZWQgKHJhZGlvKVxuIixidHYtPmMubnIpOworCWRwcmludGsoIiVkOiBvcGVuIGNhbGxlZCAocmFkaW8pXG4iLCBidHYtPmMubnIpOwogCiAJLyogYWxsb2NhdGUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwogCWZoID0ga21hbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7CkBAIC0zNjE2LDEyICszNjIyLDEyIEBACiAJfTsKIAlpbnQgaTsKIAotCXByaW50aygiMHglMDh4IFsgJXMiLCByaXNjLAorCXByX2NvbnQoIjB4JTA4eCBbICVzIiwgcmlzYywKIAkgICAgICAgaW5zdHJbcmlzYyA+PiAyOF0gPyBpbnN0cltyaXNjID4+IDI4XSA6ICJJTlZBTElEIik7CiAJZm9yIChpID0gQVJSQVlfU0laRShiaXRzKS0xOyBpID49IDA7IGktLSkKIAkJaWYgKHJpc2MgJiAoMSA8PCAoaSArIDEyKSkpCi0JCQlwcmludGsoIiAlcyIsYml0c1tpXSk7Ci0JcHJpbnRrKCIgY291bnQ9JWQgXVxuIiwgcmlzYyAmIDB4ZmZmKTsKKwkJCXByX2NvbnQoIiAlcyIsIGJpdHNbaV0pOworCXByX2NvbnQoIiBjb3VudD0lZCBdXG4iLCByaXNjICYgMHhmZmYpOwogCXJldHVybiBpbmNyW3Jpc2MgPj4gMjhdID8gaW5jcltyaXNjID4+IDI4XSA6IDE7CiB9CiAKQEAgLTM2MzAsMTYgKzM2MzYsMTggQEAKIHsKIAl1bnNpZ25lZCBpbnQgaSxqLG47CiAKLQlwcmludGsoIiVzOiByaXNjIGRpc2FzbTogJXAgW2RtYT0weCUwOGx4XVxuIiwKLQkgICAgICAgYnR2LT5jLnY0bDJfZGV2Lm5hbWUsIHJpc2MtPmNwdSwgKHVuc2lnbmVkIGxvbmcpcmlzYy0+ZG1hKTsKKwlwcl9pbmZvKCIlczogcmlzYyBkaXNhc206ICVwIFtkbWE9MHglMDhseF1cbiIsCisJCWJ0di0+Yy52NGwyX2Rldi5uYW1lLCByaXNjLT5jcHUsICh1bnNpZ25lZCBsb25nKXJpc2MtPmRtYSk7CiAJZm9yIChpID0gMDsgaSA8IChyaXNjLT5zaXplID4+IDIpOyBpICs9IG4pIHsKLQkJcHJpbnRrKCIlczogICAweCVseDogIiwgYnR2LT5jLnY0bDJfZGV2Lm5hbWUsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykocmlzYy0+ZG1hICsgKGk8PDIpKSk7CisJCXByX2luZm8oIiVzOiAgIDB4JWx4OiAiLAorCQkJYnR2LT5jLnY0bDJfZGV2Lm5hbWUsCisJCQkodW5zaWduZWQgbG9uZykocmlzYy0+ZG1hICsgKGk8PDIpKSk7CiAJCW4gPSBidHR2X3Jpc2NfZGVjb2RlKGxlMzJfdG9fY3B1KHJpc2MtPmNwdVtpXSkpOwogCQlmb3IgKGogPSAxOyBqIDwgbjsgaisrKQotCQkJcHJpbnRrKCIlczogICAweCVseDogMHglMDh4IFsgYXJnICMlZCBdXG4iLAotCQkJICAgICAgIGJ0di0+Yy52NGwyX2Rldi5uYW1lLCAodW5zaWduZWQgbG9uZykocmlzYy0+ZG1hICsgKChpK2opPDwyKSksCi0JCQkgICAgICAgcmlzYy0+Y3B1W2kral0sIGopOworCQkJcHJfaW5mbygiJXM6ICAgMHglbHg6IDB4JTA4eCBbIGFyZyAjJWQgXVxuIiwKKwkJCQlidHYtPmMudjRsMl9kZXYubmFtZSwKKwkJCQkodW5zaWduZWQgbG9uZykocmlzYy0+ZG1hICsgKChpK2opPDwyKSksCisJCQkJcmlzYy0+Y3B1W2kral0sIGopOwogCQlpZiAoMCA9PSByaXNjLT5jcHVbaV0pCiAJCQlicmVhazsKIAl9CkBAIC0zNjQ3LDE3ICszNjU1LDE4IEBACiAKIHN0YXRpYyB2b2lkIGJ0dHZfcHJpbnRfcmlzY2FkZHIoc3RydWN0IGJ0dHYgKmJ0dikKIHsKLQlwcmludGsoIiAgbWFpbjogJTA4THhcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5tYWluLmRtYSk7Ci0JcHJpbnRrKCIgIHZiaSA6IG89JTA4THggZT0lMDhMeFxuIiwKLQkgICAgICAgYnR2LT5jdmJpID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN2YmktPnRvcC5kbWEgOiAwLAotCSAgICAgICBidHYtPmN2YmkgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3ZiaS0+Ym90dG9tLmRtYSA6IDApOwotCXByaW50aygiICBjYXAgOiBvPSUwOEx4IGU9JTA4THhcbiIsCi0JICAgICAgIGJ0di0+Y3Vyci50b3AgICAgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3Vyci50b3AtPnRvcC5kbWEgOiAwLAotCSAgICAgICBidHYtPmN1cnIuYm90dG9tID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN1cnIuYm90dG9tLT5ib3R0b20uZG1hIDogMCk7Ci0JcHJpbnRrKCIgIHNjciA6IG89JTA4THggZT0lMDhMeFxuIiwKLQkgICAgICAgYnR2LT5zY3JlZW4gPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+c2NyZWVuLT50b3AuZG1hIDogMCwKLQkgICAgICAgYnR2LT5zY3JlZW4gPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+c2NyZWVuLT5ib3R0b20uZG1hIDogMCk7CisJcHJfaW5mbygiICBtYWluOiAlMDhsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5tYWluLmRtYSk7CisJcHJfaW5mbygiICB2YmkgOiBvPSUwOGxseCBlPSUwOGxseFxuIiwKKwkJYnR2LT5jdmJpID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN2YmktPnRvcC5kbWEgOiAwLAorCQlidHYtPmN2YmkgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3ZiaS0+Ym90dG9tLmRtYSA6IDApOworCXByX2luZm8oIiAgY2FwIDogbz0lMDhsbHggZT0lMDhsbHhcbiIsCisJCWJ0di0+Y3Vyci50b3AKKwkJPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3Vyci50b3AtPnRvcC5kbWEgOiAwLAorCQlidHYtPmN1cnIuYm90dG9tCisJCT8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN1cnIuYm90dG9tLT5ib3R0b20uZG1hIDogMCk7CisJcHJfaW5mbygiICBzY3IgOiBvPSUwOGxseCBlPSUwOGxseFxuIiwKKwkJYnR2LT5zY3JlZW4gPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+c2NyZWVuLT50b3AuZG1hIDogMCwKKwkJYnR2LT5zY3JlZW4gPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+c2NyZWVuLT5ib3R0b20uZG1hIDogMCk7CiAJYnR0dl9yaXNjX2Rpc2FzbShidHYsICZidHYtPm1haW4pOwogfQogCkBAIC0zNjkwLDM0ICszNjk5LDM0IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlwcmludGsoImJpdHM6Iik7CisJcHJfY29udCgiYml0czoiKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcnFfbmFtZSk7IGkrKykgewogCQlpZiAocHJpbnQgJiAoMSA8PCBpKSkKLQkJCXByaW50aygiICVzIixpcnFfbmFtZVtpXSk7CisJCQlwcl9jb250KCIgJXMiLCBpcnFfbmFtZVtpXSk7CiAJCWlmIChtYXJrICYgKDEgPDwgaSkpCi0JCQlwcmludGsoIioiKTsKKwkJCXByX2NvbnQoIioiKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGJ0dHZfaXJxX2RlYnVnX2xvd19sYXRlbmN5KHN0cnVjdCBidHR2ICpidHYsIHUzMiByYykKIHsKLQlwcmludGsoImJ0dHYlZDogaXJxOiBza2lwcGVkIGZyYW1lIFttYWluPSVseCxvX3ZiaT0lbHgsb19maWVsZD0lbHgscmM9JWx4XVxuIiwKLQkgICAgICAgYnR2LT5jLm5yLAotCSAgICAgICAodW5zaWduZWQgbG9uZylidHYtPm1haW4uZG1hLAotCSAgICAgICAodW5zaWduZWQgbG9uZylsZTMyX3RvX2NwdShidHYtPm1haW4uY3B1W1JJU0NfU0xPVF9PX1ZCSSsxXSksCi0JICAgICAgICh1bnNpZ25lZCBsb25nKWxlMzJfdG9fY3B1KGJ0di0+bWFpbi5jcHVbUklTQ19TTE9UX09fRklFTEQrMV0pLAotCSAgICAgICAodW5zaWduZWQgbG9uZylyYyk7CisJcHJfd2FybigiJWQ6IGlycTogc2tpcHBlZCBmcmFtZSBbbWFpbj0lbHgsb192Ymk9JWx4LG9fZmllbGQ9JWx4LHJjPSVseF1cbiIsCisJCWJ0di0+Yy5uciwKKwkJKHVuc2lnbmVkIGxvbmcpYnR2LT5tYWluLmRtYSwKKwkJKHVuc2lnbmVkIGxvbmcpbGUzMl90b19jcHUoYnR2LT5tYWluLmNwdVtSSVNDX1NMT1RfT19WQkkrMV0pLAorCQkodW5zaWduZWQgbG9uZylsZTMyX3RvX2NwdShidHYtPm1haW4uY3B1W1JJU0NfU0xPVF9PX0ZJRUxEKzFdKSwKKwkJKHVuc2lnbmVkIGxvbmcpcmMpOwogCiAJaWYgKDAgPT0gKGJ0cmVhZChCVDg0OF9EU1RBVFVTKSAmIEJUODQ4X0RTVEFUVVNfSExPQykpIHsKLQkJcHJpbnRrKCJidHR2JWQ6IE9oLCB0aGVyZSAodGVtcG9yYXJlbHk/KSBpcyBubyBpbnB1dCBzaWduYWwuICIKLQkJICAgICAgICJPaywgdGhlbiB0aGlzIGlzIGhhcm1sZXNzLCBkb24ndCB3b3JyeSA7KVxuIiwKLQkJICAgICAgIGJ0di0+Yy5ucik7CisJCXByX25vdGljZSgiJWQ6IE9oLCB0aGVyZSAodGVtcG9yYXJpbHk/KSBpcyBubyBpbnB1dCBzaWduYWwuICIKKwkJCSAgIk9rLCB0aGVuIHRoaXMgaXMgaGFybWxlc3MsIGRvbid0IHdvcnJ5IDspXG4iLAorCQkJICBidHYtPmMubnIpOwogCQlyZXR1cm47CiAJfQotCXByaW50aygiYnR0diVkOiBVaG0uIExvb2tzIGxpa2Ugd2UgaGF2ZSB1bnVzdWFsIGhpZ2ggSVJRIGxhdGVuY2llcy5cbiIsCi0JICAgICAgIGJ0di0+Yy5ucik7Ci0JcHJpbnRrKCJidHR2JWQ6IExldHMgdHJ5IHRvIGNhdGNoIHRoZSBjdWxwaXQgcmVkLWhhbmRlZCAuLi5cbiIsCi0JICAgICAgIGJ0di0+Yy5ucik7CisJcHJfbm90aWNlKCIlZDogVWhtLiBMb29rcyBsaWtlIHdlIGhhdmUgdW51c3VhbCBoaWdoIElSUSBsYXRlbmNpZXNcbiIsCisJCSAgYnR2LT5jLm5yKTsKKwlwcl9ub3RpY2UoIiVkOiBMZXRzIHRyeSB0byBjYXRjaCB0aGUgY3VscGl0IHJlZC1oYW5kZWQgLi4uXG4iLAorCQkgIGJ0di0+Yy5ucik7CiAJZHVtcF9zdGFjaygpOwogfQogCkBAIC0zNzk4LDkgKzM4MDcsOSBAQAogCQl9CiAJfQogCi0JZHByaW50aygiYnR0diVkOiBuZXh0IHNldDogdG9wPSVwIGJvdHRvbT0lcCBbc2NyZWVuPSVwLGlycT0lZCwlZF1cbiIsCi0JCWJ0di0+Yy5ucixzZXQtPnRvcCwgc2V0LT5ib3R0b20sCi0JCWJ0di0+c2NyZWVuLHNldC0+ZnJhbWVfaXJxLHNldC0+dG9wX2lycSk7CisJZHByaW50aygiJWQ6IG5leHQgc2V0OiB0b3A9JXAgYm90dG9tPSVwIFtzY3JlZW49JXAsaXJxPSVkLCVkXVxuIiwKKwkJYnR2LT5jLm5yLCBzZXQtPnRvcCwgc2V0LT5ib3R0b20sCisJCWJ0di0+c2NyZWVuLCBzZXQtPmZyYW1lX2lycSwgc2V0LT50b3BfaXJxKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzgxNSw3ICszODI0LDggQEAKIAlpZiAod2FrZXVwLT50b3AgPT0gd2FrZXVwLT5ib3R0b20pIHsKIAkJaWYgKE5VTEwgIT0gd2FrZXVwLT50b3AgJiYgY3Vyci0+dG9wICE9IHdha2V1cC0+dG9wKSB7CiAJCQlpZiAoaXJxX2RlYnVnID4gMSkKLQkJCQlwcmludGsoImJ0dHYlZDogd2FrZXVwOiBib3RoPSVwXG4iLGJ0di0+Yy5ucix3YWtldXAtPnRvcCk7CisJCQkJcHJfZGVidWcoIiVkOiB3YWtldXA6IGJvdGg9JXBcbiIsCisJCQkJCSBidHYtPmMubnIsIHdha2V1cC0+dG9wKTsKIAkJCXdha2V1cC0+dG9wLT52Yi50cyA9IHRzOwogCQkJd2FrZXVwLT50b3AtPnZiLmZpZWxkX2NvdW50ID0gYnR2LT5maWVsZF9jb3VudDsKIAkJCXdha2V1cC0+dG9wLT52Yi5zdGF0ZSA9IHN0YXRlOwpAQCAtMzgyNCw3ICszODM0LDggQEAKIAl9IGVsc2UgewogCQlpZiAoTlVMTCAhPSB3YWtldXAtPnRvcCAmJiBjdXJyLT50b3AgIT0gd2FrZXVwLT50b3ApIHsKIAkJCWlmIChpcnFfZGVidWcgPiAxKQotCQkJCXByaW50aygiYnR0diVkOiB3YWtldXA6IHRvcD0lcFxuIixidHYtPmMubnIsd2FrZXVwLT50b3ApOworCQkJCXByX2RlYnVnKCIlZDogd2FrZXVwOiB0b3A9JXBcbiIsCisJCQkJCSBidHYtPmMubnIsIHdha2V1cC0+dG9wKTsKIAkJCXdha2V1cC0+dG9wLT52Yi50cyA9IHRzOwogCQkJd2FrZXVwLT50b3AtPnZiLmZpZWxkX2NvdW50ID0gYnR2LT5maWVsZF9jb3VudDsKIAkJCXdha2V1cC0+dG9wLT52Yi5zdGF0ZSA9IHN0YXRlOwpAQCAtMzgzMiw3ICszODQzLDggQEAKIAkJfQogCQlpZiAoTlVMTCAhPSB3YWtldXAtPmJvdHRvbSAmJiBjdXJyLT5ib3R0b20gIT0gd2FrZXVwLT5ib3R0b20pIHsKIAkJCWlmIChpcnFfZGVidWcgPiAxKQotCQkJCXByaW50aygiYnR0diVkOiB3YWtldXA6IGJvdHRvbT0lcFxuIixidHYtPmMubnIsd2FrZXVwLT5ib3R0b20pOworCQkJCXByX2RlYnVnKCIlZDogd2FrZXVwOiBib3R0b209JXBcbiIsCisJCQkJCSBidHYtPmMubnIsIHdha2V1cC0+Ym90dG9tKTsKIAkJCXdha2V1cC0+Ym90dG9tLT52Yi50cyA9IHRzOwogCQkJd2FrZXVwLT5ib3R0b20tPnZiLmZpZWxkX2NvdW50ID0gYnR2LT5maWVsZF9jb3VudDsKIAkJCXdha2V1cC0+Ym90dG9tLT52Yi5zdGF0ZSA9IHN0YXRlOwpAQCAtMzg2NiwxMSArMzg3OCwxMSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoYnR0dl92ZXJib3NlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdGltZW91dDogZHJvcD0lZCBpcnE9JWQvJWQsIHJpc2M9JTA4eCwgIiwKLQkJICAgICAgIGJ0di0+Yy5uciwgYnR2LT5mcmFtZWRyb3AsIGJ0di0+aXJxX21lLCBidHYtPmlycV90b3RhbCwKLQkJICAgICAgIGJ0cmVhZChCVDg0OF9SSVNDX0NPVU5UKSk7CisJCXByX2luZm8oIiVkOiB0aW1lb3V0OiBkcm9wPSVkIGlycT0lZC8lZCwgcmlzYz0lMDh4LCAiLAorCQkJYnR2LT5jLm5yLCBidHYtPmZyYW1lZHJvcCwgYnR2LT5pcnFfbWUsIGJ0di0+aXJxX3RvdGFsLAorCQkJYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpKTsKIAkJYnR0dl9wcmludF9pcnFiaXRzKGJ0cmVhZChCVDg0OF9JTlRfU1RBVCksMCk7Ci0JCXByaW50aygiXG4iKTsKKwkJcHJfY29udCgiXG4iKTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOwpAQCAtNDAzMywyMSArNDA0NSwyMyBAQAogCQlkc3RhdD1idHJlYWQoQlQ4NDhfRFNUQVRVUyk7CiAKIAkJaWYgKGlycV9kZWJ1ZykgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogaXJxIGxvb3A9JWQgZmM9JWQgIgotCQkJICAgICAgICJyaXNjcz0leCwgcmlzY2M9JTA4eCwgIiwKLQkJCSAgICAgICBidHYtPmMubnIsIGNvdW50LCBidHYtPmZpZWxkX2NvdW50LAotCQkJICAgICAgIHN0YXQ+PjI4LCBidHJlYWQoQlQ4NDhfUklTQ19DT1VOVCkpOworCQkJcHJfZGVidWcoIiVkOiBpcnEgbG9vcD0lZCBmYz0lZCByaXNjcz0leCwgcmlzY2M9JTA4eCwgIiwKKwkJCQkgYnR2LT5jLm5yLCBjb3VudCwgYnR2LT5maWVsZF9jb3VudCwKKwkJCQkgc3RhdD4+MjgsIGJ0cmVhZChCVDg0OF9SSVNDX0NPVU5UKSk7CiAJCQlidHR2X3ByaW50X2lycWJpdHMoc3RhdCxhc3RhdCk7CiAJCQlpZiAoc3RhdCAmIEJUODQ4X0lOVF9ITE9DSykKLQkJCQlwcmludGsoIiAgIEhMT0MgPT4gJXMiLCAoZHN0YXQgJiBCVDg0OF9EU1RBVFVTX0hMT0MpCi0JCQkJICAgICAgID8gInllcyIgOiAibm8iKTsKKwkJCQlwcl9jb250KCIgICBITE9DID0+ICVzIiwKKwkJCQkJZHN0YXQgJiBCVDg0OF9EU1RBVFVTX0hMT0MKKwkJCQkJPyAieWVzIiA6ICJubyIpOwogCQkJaWYgKHN0YXQgJiBCVDg0OF9JTlRfVlBSRVMpCi0JCQkJcHJpbnRrKCIgICBQUkVTID0+ICVzIiwgKGRzdGF0ICYgQlQ4NDhfRFNUQVRVU19QUkVTKQotCQkJCSAgICAgICA/ICJ5ZXMiIDogIm5vIik7CisJCQkJcHJfY29udCgiICAgUFJFUyA9PiAlcyIsCisJCQkJCWRzdGF0ICYgQlQ4NDhfRFNUQVRVU19QUkVTCisJCQkJCT8gInllcyIgOiAibm8iKTsKIAkJCWlmIChzdGF0ICYgQlQ4NDhfSU5UX0ZNVENIRykKLQkJCQlwcmludGsoIiAgIE5VTUwgPT4gJXMiLCAoZHN0YXQgJiBCVDg0OF9EU1RBVFVTX05VTUwpCi0JCQkJICAgICAgID8gIjYyNSIgOiAiNTI1Iik7Ci0JCQlwcmludGsoIlxuIik7CisJCQkJcHJfY29udCgiICAgTlVNTCA9PiAlcyIsCisJCQkJCWRzdGF0ICYgQlQ4NDhfRFNUQVRVU19OVU1MCisJCQkJCT8gIjYyNSIgOiAiNTI1Iik7CisJCQlwcl9jb250KCJcbiIpOwogCQl9CiAKIAkJaWYgKGFzdGF0JkJUODQ4X0lOVF9WU1lOQykKQEAgLTQwNzUsMTggKzQwODksMTkgQEAKIAkJCWF1ZGlvX211dGUoYnR2LCBidHYtPm11dGUpOyAgLyogdHJpZ2dlciBhdXRvbXV0ZSAqLwogCiAJCWlmIChhc3RhdCAmIChCVDg0OF9JTlRfU0NFUlJ8QlQ4NDhfSU5UX09DRVJSKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiAlcyVzIEAgJTA4eCwiLGJ0di0+Yy5uciwKLQkJCSAgICAgICAoYXN0YXQgJiBCVDg0OF9JTlRfU0NFUlIpID8gIlNDRVJSIiA6ICIiLAotCQkJICAgICAgIChhc3RhdCAmIEJUODQ4X0lOVF9PQ0VSUikgPyAiT0NFUlIiIDogIiIsCi0JCQkgICAgICAgYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpKTsKKwkJCXByX2luZm8oIiVkOiAlcyVzIEAgJTA4eCwiLAorCQkJCWJ0di0+Yy5uciwKKwkJCQkoYXN0YXQgJiBCVDg0OF9JTlRfU0NFUlIpID8gIlNDRVJSIiA6ICIiLAorCQkJCShhc3RhdCAmIEJUODQ4X0lOVF9PQ0VSUikgPyAiT0NFUlIiIDogIiIsCisJCQkJYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpKTsKIAkJCWJ0dHZfcHJpbnRfaXJxYml0cyhzdGF0LGFzdGF0KTsKLQkJCXByaW50aygiXG4iKTsKKwkJCXByX2NvbnQoIlxuIik7CiAJCQlpZiAoYnR0dl9kZWJ1ZykKIAkJCQlidHR2X3ByaW50X3Jpc2NhZGRyKGJ0dik7CiAJCX0KIAkJaWYgKGZkc3IgJiYgYXN0YXQgJiBCVDg0OF9JTlRfRkRTUikgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGRFNSIEAgJTA4eFxuIiwKLQkJCSAgICAgICBidHYtPmMubnIsYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpKTsKKwkJCXByX2luZm8oIiVkOiBGRFNSIEAgJTA4eFxuIiwKKwkJCQlidHYtPmMubnIsIGJ0cmVhZChCVDg0OF9SSVNDX0NPVU5UKSk7CiAJCQlpZiAoYnR0dl9kZWJ1ZykKIAkJCQlidHR2X3ByaW50X3Jpc2NhZGRyKGJ0dik7CiAJCX0KQEAgLTQwOTcsMTEgKzQxMTIsMTEgQEAKIAkJCWlmIChjb3VudCA+IDggfHwgIShhc3RhdCAmIEJUODQ4X0lOVF9HUElOVCkpIHsKIAkJCQlidHdyaXRlKDAsIEJUODQ4X0lOVF9NQVNLKTsKIAotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkgICAiYnR0diVkOiBJUlEgbG9ja3VwLCBjbGVhcmVkIGludCBtYXNrIFsiLCBidHYtPmMubnIpOworCQkJCXByX2VycigiJWQ6IElSUSBsb2NrdXAsIGNsZWFyZWQgaW50IG1hc2sgWyIsCisJCQkJICAgICAgIGJ0di0+Yy5ucik7CiAJCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkgICAiYnR0diVkOiBJUlEgbG9ja3VwLCBjbGVhcmluZyBHUElOVCBmcm9tIGludCBtYXNrIFsiLCBidHYtPmMubnIpOworCQkJCXByX2VycigiJWQ6IElSUSBsb2NrdXAsIGNsZWFyaW5nIEdQSU5UIGZyb20gaW50IG1hc2sgWyIsCisJCQkJICAgICAgIGJ0di0+Yy5ucik7CiAKIAkJCQlidHdyaXRlKGJ0cmVhZChCVDg0OF9JTlRfTUFTSykgJiAoLTEgXiBCVDg0OF9JTlRfR1BJTlQpLAogCQkJCQkJQlQ4NDhfSU5UX01BU0spOwpAQCAtNDEwOSw3ICs0MTI0LDcgQEAKIAogCQkJYnR0dl9wcmludF9pcnFiaXRzKHN0YXQsYXN0YXQpOwogCi0JCQlwcmludGsoIl1cbiIpOworCQkJcHJfY29udCgiXVxuIik7CiAJCX0KIAl9CiAJYnR2LT5pcnFfdG90YWwrKzsKQEAgLTQxNzEsNyArNDE4Niw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBidHR2X3JlZ2lzdGVyX3ZpZGVvKHN0cnVjdCBidHR2ICpidHYpCiB7CiAJaWYgKG5vX292ZXJsYXkgPiAwKQotCQlwcmludGsoImJ0dHY6IE92ZXJsYXkgc3VwcG9ydCBkaXNhYmxlZC5cbiIpOworCQlwcl9ub3RpY2UoIk92ZXJsYXkgc3VwcG9ydCBkaXNhYmxlZFxuIik7CiAKIAkvKiB2aWRlbyAqLwogCWJ0di0+dmlkZW9fZGV2ID0gdmRldl9pbml0KGJ0diwgJmJ0dHZfdmlkZW9fdGVtcGxhdGUsICJ2aWRlbyIpOwpAQCAtNDE4MSwxMiArNDE5NiwxMSBAQAogCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoYnR2LT52aWRlb19kZXYsIFZGTF9UWVBFX0dSQUJCRVIsCiAJCQkJICB2aWRlb19ucltidHYtPmMubnJdKSA8IDApCiAJCWdvdG8gZXJyOwotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCi0JICAgICAgIGJ0di0+Yy5uciwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShidHYtPnZpZGVvX2RldikpOworCXByX2luZm8oIiVkOiByZWdpc3RlcmVkIGRldmljZSAlc1xuIiwKKwkJYnR2LT5jLm5yLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGJ0di0+dmlkZW9fZGV2KSk7CiAJaWYgKGRldmljZV9jcmVhdGVfZmlsZSgmYnR2LT52aWRlb19kZXYtPmRldiwKIAkJCQkgICAgICZkZXZfYXR0cl9jYXJkKTwwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnR0diVkOiBkZXZpY2VfY3JlYXRlX2ZpbGUgJ2NhcmQnICIKLQkJICAgICAgICJmYWlsZWRcbiIsIGJ0di0+Yy5ucik7CisJCXByX2VycigiJWQ6IGRldmljZV9jcmVhdGVfZmlsZSAnY2FyZCcgZmFpbGVkXG4iLCBidHYtPmMubnIpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTQxOTgsOCArNDIxMiw4IEBACiAJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShidHYtPnZiaV9kZXYsIFZGTF9UWVBFX1ZCSSwKIAkJCQkgIHZiaV9ucltidHYtPmMubnJdKSA8IDApCiAJCWdvdG8gZXJyOwotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCi0JICAgICAgIGJ0di0+Yy5uciwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShidHYtPnZiaV9kZXYpKTsKKwlwcl9pbmZvKCIlZDogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCisJCWJ0di0+Yy5uciwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShidHYtPnZiaV9kZXYpKTsKIAogCWlmICghYnR2LT5oYXNfcmFkaW8pCiAJCXJldHVybiAwOwpAQCAtNDIxMCw4ICs0MjI0LDggQEAKIAlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGJ0di0+cmFkaW9fZGV2LCBWRkxfVFlQRV9SQURJTywKIAkJCQkgIHJhZGlvX25yW2J0di0+Yy5ucl0pIDwgMCkKIAkJZ290byBlcnI7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiByZWdpc3RlcmVkIGRldmljZSAlc1xuIiwKLQkgICAgICAgYnR2LT5jLm5yLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGJ0di0+cmFkaW9fZGV2KSk7CisJcHJfaW5mbygiJWQ6IHJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLAorCQlidHYtPmMubnIsIHZpZGVvX2RldmljZV9ub2RlX25hbWUoYnR2LT5yYWRpb19kZXYpKTsKIAogCS8qIGFsbCBkb25lICovCiAJcmV0dXJuIDA7CkBAIC00MjQ0LDEwICs0MjU4LDEwIEBACiAKIAlpZiAoYnR0dl9udW0gPT0gQlRUVl9NQVgpCiAJCXJldHVybiAtRU5PTUVNOwotCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEJ0OHh4IGNhcmQgZm91bmQgKCVkKS5cbiIsIGJ0dHZfbnVtKTsKKwlwcl9pbmZvKCJCdDh4eCBjYXJkIGZvdW5kICglZClcbiIsIGJ0dHZfbnVtKTsKIAlidHR2c1tidHR2X251bV0gPSBidHYgPSBremFsbG9jKHNpemVvZigqYnR2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ0diA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnR0djogb3V0IG9mIG1lbW9yeS5cbiIpOworCQlwcl9lcnIoIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJYnR2LT5jLm5yICA9IGJ0dHZfbnVtOwpAQCAtNDI3NywyMSArNDI5MSwxOSBAQAogCWJ0di0+Yy5wY2kgPSBkZXY7CiAJYnR2LT5pZCAgPSBkZXYtPmRldmljZTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IENhbid0IGVuYWJsZSBkZXZpY2UuXG4iLAotCQkgICAgICAgYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IENhbid0IGVuYWJsZSBkZXZpY2VcbiIsIGJ0di0+Yy5ucik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAocGNpX3NldF9kbWFfbWFzayhkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIsCi0JCSAgICAgICBidHYtPmMubnIpOworCQlwcl93YXJuKCIlZDogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZVxuIiwgYnR2LT5jLm5yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsMCksCiAJCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsMCksCiAJCQkJYnR2LT5jLnY0bDJfZGV2Lm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogY2FuJ3QgcmVxdWVzdCBpb21lbSAoMHglbGx4KS5cbiIsCi0JCSAgICAgICBidHYtPmMubnIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChkZXYsMCkpOworCQlwcl93YXJuKCIlZDogY2FuJ3QgcmVxdWVzdCBpb21lbSAoMHglbGx4KVxuIiwKKwkJCWJ0di0+Yy5uciwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCkpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlwY2lfc2V0X21hc3RlcihkZXYpOwpAQCAtNDI5OSwyMiArNDMxMSwyMSBAQAogCiAJcmVzdWx0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJmRldi0+ZGV2LCAmYnR2LT5jLnY0bDJfZGV2KTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKCkgZmFpbGVkXG4iLCBidHYtPmMubnIpOworCQlwcl93YXJuKCIlZDogdjRsMl9kZXZpY2VfcmVnaXN0ZXIoKSBmYWlsZWRcbiIsIGJ0di0+Yy5ucik7CiAJCWdvdG8gZmFpbDA7CiAJfQogCiAJYnR2LT5yZXZpc2lvbiA9IGRldi0+cmV2aXNpb247CiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJmxhdCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBCdCVkIChyZXYgJWQpIGF0ICVzLCAiLAotCSAgICAgICBidHR2X251bSxidHYtPmlkLCBidHYtPnJldmlzaW9uLCBwY2lfbmFtZShkZXYpKTsKLQlwcmludGsoImlycTogJWQsIGxhdGVuY3k6ICVkLCBtbWlvOiAweCVsbHhcbiIsCi0JICAgICAgIGJ0di0+Yy5wY2ktPmlycSwgbGF0LAotCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChkZXYsMCkpOworCXByX2luZm8oIiVkOiBCdCVkIChyZXYgJWQpIGF0ICVzLCBpcnE6ICVkLCBsYXRlbmN5OiAlZCwgbW1pbzogMHglbGx4XG4iLAorCQlidHR2X251bSwgYnR2LT5pZCwgYnR2LT5yZXZpc2lvbiwgcGNpX25hbWUoZGV2KSwKKwkJYnR2LT5jLnBjaS0+aXJxLCBsYXQsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCkpOwogCXNjaGVkdWxlKCk7CiAKIAlidHYtPmJ0ODQ4X21taW8gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLCAweDEwMDApOwogCWlmIChOVUxMID09IGJ0di0+YnQ4NDhfbW1pbykgewotCQlwcmludGsoImJ0dHYlZDogaW9yZW1hcCgpIGZhaWxlZFxuIiwgYnR2LT5jLm5yKTsKKwkJcHJfZXJyKCIlZDogaW9yZW1hcCgpIGZhaWxlZFxuIiwgYnR2LT5jLm5yKTsKIAkJcmVzdWx0ID0gLUVJTzsKIAkJZ290byBmYWlsMTsKIAl9CkBAIC00MzI3LDggKzQzMzgsOCBAQAogCXJlc3VsdCA9IHJlcXVlc3RfaXJxKGJ0di0+Yy5wY2ktPmlycSwgYnR0dl9pcnEsCiAJICAgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgYnR2LT5jLnY0bDJfZGV2Lm5hbWUsICh2b2lkICopYnR2KTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImJ0dHYlZDogY2FuJ3QgZ2V0IElSUSAlZFxuIiwKLQkJICAgICAgIGJ0dHZfbnVtLGJ0di0+Yy5wY2ktPmlycSk7CisJCXByX2VycigiJWQ6IGNhbid0IGdldCBJUlEgJWRcbiIsCisJCSAgICAgICBidHR2X251bSwgYnR2LT5jLnBjaS0+aXJxKTsKIAkJZ290byBmYWlsMTsKIAl9CiAKQEAgLTQ0MzMsNyArNDQ0NCw3IEBACiAJc3RydWN0IGJ0dHYgKmJ0diA9IHRvX2J0dHYodjRsMl9kZXYpOwogCiAJaWYgKGJ0dHZfdmVyYm9zZSkKLQkJcHJpbnRrKCJidHR2JWQ6IHVubG9hZGluZ1xuIixidHYtPmMubnIpOworCQlwcl9pbmZvKCIlZDogdW5sb2FkaW5nXG4iLCBidHYtPmMubnIpOwogCiAJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKIAkJZmx1c2hfcmVxdWVzdF9tb2R1bGVzKGJ0dik7CkBAIC00NDgxLDcgKzQ0OTIsNyBAQAogCXN0cnVjdCBidHR2X2J1ZmZlcl9zZXQgaWRsZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZHByaW50aygiYnR0diVkOiBzdXNwZW5kICVkXG4iLCBidHYtPmMubnIsIHN0YXRlLmV2ZW50KTsKKwlkcHJpbnRrKCIlZDogc3VzcGVuZCAlZFxuIiwgYnR2LT5jLm5yLCBzdGF0ZS5ldmVudCk7CiAKIAkvKiBzdG9wIGRtYSArIGlycXMgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOwpAQCAtNDUxNywxNCArNDUyOCwxMyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycjsKIAotCWRwcmludGsoImJ0dHYlZDogcmVzdW1lXG4iLCBidHYtPmMubnIpOworCWRwcmludGsoIiVkOiByZXN1bWVcbiIsIGJ0di0+Yy5ucik7CiAKIAkvKiByZXN0b3JlIHBjaSBzdGF0ZSAqLwogCWlmIChidHYtPnN0YXRlLmRpc2FibGVkKSB7CiAJCWVycj1wY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKIAkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBDYW4ndCBlbmFibGUgZGV2aWNlLlxuIiwKLQkJCQkJCQkJYnR2LT5jLm5yKTsKKwkJCXByX3dhcm4oIiVkOiBDYW4ndCBlbmFibGUgZGV2aWNlXG4iLCBidHYtPmMubnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQlidHYtPnN0YXRlLmRpc2FibGVkID0gMDsKQEAgLTQ1MzIsOCArNDU0Miw3IEBACiAJZXJyPXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKIAlpZiAoZXJyKSB7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBDYW4ndCBlbmFibGUgZGV2aWNlLlxuIiwKLQkJCQkJCQlidHYtPmMubnIpOworCQlwcl93YXJuKCIlZDogQ2FuJ3QgZW5hYmxlIGRldmljZVxuIiwgYnR2LT5jLm5yKTsKIAkJYnR2LT5zdGF0ZS5kaXNhYmxlZCA9IDE7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtNDU4NSwyMiArNDU5NCwyMSBAQAogCiAJYnR0dl9udW0gPSAwOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAotCSAgICAgICBCVFRWX1ZFUlNJT04pOworCXByX2luZm8oImRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwgQlRUVl9WRVJTSU9OKTsKIAlpZiAoZ2J1ZmZlcnMgPCAyIHx8IGdidWZmZXJzID4gVklERU9fTUFYX0ZSQU1FKQogCQlnYnVmZmVycyA9IDI7CiAJaWYgKGdidWZzaXplID4gQlRUVl9NQVhfRkJVRikKIAkJZ2J1ZnNpemUgPSBCVFRWX01BWF9GQlVGOwogCWdidWZzaXplID0gKGdidWZzaXplICsgUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0s7CiAJaWYgKGJ0dHZfdmVyYm9zZSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogdXNpbmcgJWQgYnVmZmVycyB3aXRoICVkayAoJWQgcGFnZXMpIGVhY2ggZm9yIGNhcHR1cmVcbiIsCi0JCSAgICAgICBnYnVmZmVycywgZ2J1ZnNpemUgPj4gMTAsIGdidWZzaXplID4+IFBBR0VfU0hJRlQpOworCQlwcl9pbmZvKCJ1c2luZyAlZCBidWZmZXJzIHdpdGggJWRrICglZCBwYWdlcykgZWFjaCBmb3IgY2FwdHVyZVxuIiwKKwkJCWdidWZmZXJzLCBnYnVmc2l6ZSA+PiAxMCwgZ2J1ZnNpemUgPj4gUEFHRV9TSElGVCk7CiAKIAlidHR2X2NoZWNrX2NoaXBzZXQoKTsKIAogCXJldCA9IGJ1c19yZWdpc3RlcigmYnR0dl9zdWJfYnVzX3R5cGUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHY6IGJ1c19yZWdpc3RlciBlcnJvcjogJWRcbiIsIHJldCk7CisJCXByX3dhcm4oImJ1c19yZWdpc3RlciBlcnJvcjogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJ0dHZfcGNpX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWdwaW8uYwppbmRleCAxM2NlNzJjLi45MjJlODIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZ3Bpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1ncGlvLmMKQEAgLTI2LDYgKzI2LDggQEAKIAogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC05OSw3ICsxMDEsNyBAQAogCQlrZnJlZShzdWIpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlwcmludGsoImJ0dHYlZDogYWRkIHN1YmRldmljZSBcIiVzXCJcbiIsIGNvcmUtPm5yLCBkZXZfbmFtZSgmc3ViLT5kZXYpKTsKKwlwcl9pbmZvKCIlZDogYWRkIHN1YmRldmljZSBcIiVzXCJcbiIsIGNvcmUtPm5yLCBkZXZfbmFtZSgmc3ViLT5kZXYpKTsKIAlsaXN0X2FkZF90YWlsKCZzdWItPmxpc3QsJmNvcmUtPnN1YnMpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWkyYy5jCmluZGV4IGQ0OWI2NzUuLmUzOTUyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaTJjLmMKQEAgLTI3LDYgKzI3LDggQEAKIAogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xNTQsOSArMTU2LDcgQEAKIAlpZiAocmV0dmFsID09IDApCiAJCWdvdG8gZWlvOwogCWlmIChpMmNfZGVidWcpIHsKLQkJcHJpbnRrKCIgPFcgJTAyeCAlMDJ4IiwgbXNnLT5hZGRyIDw8IDEsIG1zZy0+YnVmWzBdKTsKLQkJaWYgKCEoeG1pdCAmIEJUODc4X0kyQ19OT1NUT1ApKQotCQkJcHJpbnRrKCIgPlxuIik7CisJCXByX2NvbnQoIiA8VyAlMDJ4ICUwMngiLCBtc2ctPmFkZHIgPDwgMSwgbXNnLT5idWZbMF0pOwogCX0KIAogCWZvciAoY250ID0gMTsgY250IDwgbXNnLT5sZW47IGNudCsrICkgewpAQCAtMTcwLDE5ICsxNzAsMTggQEAKIAkJCWdvdG8gZXJyOwogCQlpZiAocmV0dmFsID09IDApCiAJCQlnb3RvIGVpbzsKLQkJaWYgKGkyY19kZWJ1ZykgewotCQkJcHJpbnRrKCIgJTAyeCIsIG1zZy0+YnVmW2NudF0pOwotCQkJaWYgKCEoeG1pdCAmIEJUODc4X0kyQ19OT1NUT1ApKQotCQkJCXByaW50aygiID5cbiIpOwotCQl9CisJCWlmIChpMmNfZGVidWcpCisJCQlwcl9jb250KCIgJTAyeCIsIG1zZy0+YnVmW2NudF0pOwogCX0KKwlpZiAoISh4bWl0ICYgQlQ4NzhfSTJDX05PU1RPUCkpCisJCXByX2NvbnQoIj5cbiIpOwogCXJldHVybiBtc2ctPmxlbjsKIAogIGVpbzoKIAlyZXR2YWwgPSAtRUlPOwogIGVycjoKIAlpZiAoaTJjX2RlYnVnKQotCQlwcmludGsoIiBFUlI6ICVkXG4iLHJldHZhbCk7CisJCXByX2NvbnQoIiBFUlI6ICVkXG4iLHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTkzLDcgKzE5Miw3IEBACiAJdTMyIGNudDsKIAlpbnQgcmV0dmFsOwogCi0JZm9yKGNudCA9IDA7IGNudCA8IG1zZy0+bGVuOyBjbnQrKykgeworCWZvciAoY250ID0gMDsgY250IDwgbXNnLT5sZW47IGNudCsrKSB7CiAJCXhtaXQgPSAobXNnLT5hZGRyIDw8IDI1KSB8ICgxIDw8IDI0KSB8IEkyQ19IVzsKIAkJaWYgKGNudCA8IG1zZy0+bGVuLTEpCiAJCQl4bWl0IHw9IEJUODQ4X0kyQ19XM0I7CkBAIC0yMDEsNiArMjAwLDEyIEBACiAJCQl4bWl0IHw9IEJUODc4X0kyQ19OT1NUT1A7CiAJCWlmIChjbnQpCiAJCQl4bWl0IHw9IEJUODc4X0kyQ19OT1NUQVJUOworCisJCWlmIChpMmNfZGVidWcpIHsKKwkJCWlmICghKHhtaXQgJiBCVDg3OF9JMkNfTk9TVEFSVCkpCisJCQkJcHJfY29udCgiIDxSICUwMngiLCAobXNnLT5hZGRyIDw8IDEpICsxKTsKKwkJfQorCiAJCWJ0d3JpdGUoeG1pdCwgQlQ4NDhfSTJDKTsKIAkJcmV0dmFsID0gYnR0dl9pMmNfd2FpdF9kb25lKGJ0dik7CiAJCWlmIChyZXR2YWwgPCAwKQpAQCAtMjA5LDIwICsyMTQsMjAgQEAKIAkJCWdvdG8gZWlvOwogCQltc2ctPmJ1ZltjbnRdID0gKCh1MzIpYnRyZWFkKEJUODQ4X0kyQykgPj4gOCkgJiAweGZmOwogCQlpZiAoaTJjX2RlYnVnKSB7Ci0JCQlpZiAoISh4bWl0ICYgQlQ4NzhfSTJDX05PU1RBUlQpKQotCQkJCXByaW50aygiIDxSICUwMngiLCAobXNnLT5hZGRyIDw8IDEpICsxKTsKLQkJCXByaW50aygiID0lMDJ4IiwgbXNnLT5idWZbY250XSk7Ci0JCQlpZiAoISh4bWl0ICYgQlQ4NzhfSTJDX05PU1RPUCkpCi0JCQkJcHJpbnRrKCIgPlxuIik7CisJCQlwcl9jb250KCIgPSUwMngiLCBtc2ctPmJ1ZltjbnRdKTsKIAkJfQorCQlpZiAoaTJjX2RlYnVnICYmICEoeG1pdCAmIEJUODc4X0kyQ19OT1NUT1ApKQorCQkJcHJfY29udCgiID5cbiIpOwogCX0KKworCiAJcmV0dXJuIG1zZy0+bGVuOwogCiAgZWlvOgogCXJldHZhbCA9IC1FSU87CiAgZXJyOgogCWlmIChpMmNfZGVidWcpCi0JCXByaW50aygiIEVSUjogJWRcbiIscmV0dmFsKTsKKwkJcHJfY29udCgiIEVSUjogJWRcbiIscmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yMzQsNyArMjM5LDggQEAKIAlpbnQgaTsKIAogCWlmIChpMmNfZGVidWcpCi0JCXByaW50aygiYnQtaTJjOiIpOworCQlwcl9kZWJ1ZygiYnQtaTJjOiIpOworCiAJYnR3cml0ZShCVDg0OF9JTlRfSTJDRE9ORXxCVDg0OF9JTlRfUkFDSywgQlQ4NDhfSU5UX1NUQVQpOwogCWZvciAoaSA9IDAgOyBpIDwgbnVtOyBpKyspIHsKIAkJaWYgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgewpAQCAtMjcxLDIwICsyNzcsMjAgQEAKIAlpZiAoMCAhPSBidHYtPmkyY19yYykKIAkJcmV0dXJuIC0xOwogCWlmIChidHR2X3ZlcmJvc2UgJiYgTlVMTCAhPSBwcm9iZV9mb3IpCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogaTJjOiBjaGVja2luZyBmb3IgJXMgQCAweCUwMnguLi4gIiwKLQkJICAgICAgIGJ0di0+Yy5ucixwcm9iZV9mb3IsYWRkcik7CisJCXByX2luZm8oIiVkOiBpMmM6IGNoZWNraW5nIGZvciAlcyBAIDB4JTAyeC4uLiAiLAorCQkJYnR2LT5jLm5yLCBwcm9iZV9mb3IsIGFkZHIpOwogCWJ0di0+aTJjX2NsaWVudC5hZGRyID0gYWRkciA+PiAxOwogCWlmICgxICE9IGkyY19tYXN0ZXJfcmVjdigmYnR2LT5pMmNfY2xpZW50LCAmYnVmZmVyLCAxKSkgewogCQlpZiAoTlVMTCAhPSBwcm9iZV9mb3IpIHsKIAkJCWlmIChidHR2X3ZlcmJvc2UpCi0JCQkJcHJpbnRrKCJub3QgZm91bmRcbiIpOworCQkJCXByX2NvbnQoIm5vdCBmb3VuZFxuIik7CiAJCX0gZWxzZQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBpMmMgcmVhZCAweCV4OiBlcnJvclxuIiwKLQkJCSAgICAgICBidHYtPmMubnIsYWRkcik7CisJCQlwcl93YXJuKCIlZDogaTJjIHJlYWQgMHgleDogZXJyb3JcbiIsCisJCQkJYnR2LT5jLm5yLCBhZGRyKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAoYnR0dl92ZXJib3NlICYmIE5VTEwgIT0gcHJvYmVfZm9yKQotCQlwcmludGsoImZvdW5kXG4iKTsKKwkJcHJfY29udCgiZm91bmRcbiIpOwogCXJldHVybiBidWZmZXI7CiB9CiAKQEAgLTMzNSw4ICszNDEsOCBAQAogCQlyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCZidWYsMCk7CiAJCWlmIChyYyA8IDApCiAJCQljb250aW51ZTsKLQkJcHJpbnRrKCIlczogaTJjIHNjYW46IGZvdW5kIGRldmljZSBAIDB4JXggIFslc11cbiIsCi0JCSAgICAgICBuYW1lLCBpIDw8IDEsIGkyY19kZXZzW2ldID8gaTJjX2RldnNbaV0gOiAiPz8/Iik7CisJCXByX2luZm8oIiVzOiBpMmMgc2NhbjogZm91bmQgZGV2aWNlIEAgMHgleCAgWyVzXVxuIiwKKwkJCW5hbWUsIGkgPDwgMSwgaTJjX2RldnNbaV0gPyBpMmNfZGV2c1tpXSA6ICI/Pz8iKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlucHV0LmMKaW5kZXggNjc3ZDcwYy4uZWY0YzdjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlucHV0LmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0zNiw5ICszOCwxMCBAQAogbW9kdWxlX3BhcmFtKGlyX3JjNV9yZW1vdGVfZ2FwLCBpbnQsIDA2NDQpOwogCiAjdW5kZWYgZHByaW50awotI2RlZmluZSBkcHJpbnRrKGFyZy4uLikgZG8gewlcCi0JaWYgKGlyX2RlYnVnID49IDEpCVwKLQkJcHJpbnRrKGFyZyk7CVwKKyNkZWZpbmUgZHByaW50ayhmbXQsIC4uLikJCQlcCitkbyB7CQkJCQkJXAorCWlmIChpcl9kZWJ1ZyA+PSAxKQkJCVwKKwkJcHJfaW5mbyhmbXQsICMjX19WQV9BUkdTX18pOwlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIERFVk5BTUUgImJ0dHYtaW5wdXQiCkBAIC02Miw3ICs2NSw3IEBACiAKIAkvKiBleHRyYWN0IGRhdGEgKi8KIAlkYXRhID0gaXJfZXh0cmFjdF9iaXRzKGdwaW8sIGlyLT5tYXNrX2tleWNvZGUpOwotCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogaXJxIGdwaW89MHgleCBjb2RlPSVkIHwgJXMlcyVzXG4iLAorCWRwcmludGsoImlycSBncGlvPTB4JXggY29kZT0lZCB8ICVzJXMlc1xuIiwKIAkJZ3BpbywgZGF0YSwKIAkJaXItPnBvbGxpbmcgICAgICAgICAgICAgICA/ICJwb2xsIiAgOiAiaXJxIiwKIAkJKGdwaW8gJiBpci0+bWFza19rZXlkb3duKSA/ICIgZG93biIgOiAiIiwKQEAgLTk2LDcgKzk5LDcgQEAKIAlrZXl1cCA9IChncGlvICYgaXItPm1hc2tfa2V5dXApID8gMSA8PCAzMSA6IDA7CiAKIAlpZiAoKGlyLT5sYXN0X2dwaW8gJiAweDdmKSAhPSBkYXRhKSB7Ci0JCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogZ3Bpbz0weCV4IGNvZGU9JWQgfCAlc1xuIiwKKwkJZHByaW50aygiZ3Bpbz0weCV4IGNvZGU9JWQgfCAlc1xuIiwKIAkJCWdwaW8sIGRhdGEsCiAJCQkoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSA/ICIgdXAiIDogInVwL2Rvd24iKTsKIApAQCAtMTA3LDcgKzExMCw3IEBACiAJCWlmICgoaXItPmxhc3RfZ3BpbyAmIDEgPDwgMzEpID09IGtleXVwKQogCQkJcmV0dXJuOwogCi0JCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjooY250KSBncGlvPTB4JXggY29kZT0lZCB8ICVzXG4iLAorCQlkcHJpbnRrKCIoY250KSBncGlvPTB4JXggY29kZT0lZCB8ICVzXG4iLAogCQkJZ3BpbywgZGF0YSwKIAkJCShncGlvICYgaXItPm1hc2tfa2V5dXApID8gIiB1cCIgOiAiZG93biIpOwogCkBAIC0xNzcsMTMgKzE4MCwxMiBAQAogCQkJcmM1IHw9IDE7CiAJCWJyZWFrOwogCQljYXNlIDM6Ci0JCQlkcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6cmM1X2RlY29kZSgleCkgYmFkIGNvZGVcbiIsCisJCQlkcHJpbnRrKCJyYzVfZGVjb2RlKCV4KSBiYWQgY29kZVxuIiwKIAkJCQlvcmdfY29kZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQlkcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6IgotCQkiY29kZT0leCwgcmM1PSV4LCBzdGFydD0leCwgdG9nZ2xlPSV4LCBhZGRyZXNzPSV4LCAiCisJZHByaW50aygiY29kZT0leCwgcmM1PSV4LCBzdGFydD0leCwgdG9nZ2xlPSV4LCBhZGRyZXNzPSV4LCAiCiAJCSJpbnN0cj0leFxuIiwgcmM1LCBvcmdfY29kZSwgUkM1X1NUQVJUKHJjNSksCiAJCVJDNV9UT0dHTEUocmM1KSwgUkM1X0FERFIocmM1KSwgUkM1X0lOU1RSKHJjNSkpOwogCXJldHVybiByYzU7CkBAIC0yMTIsMjAgKzIxNCwyMCBAQAogCiAJLyogQWxsb3cgc29tZSB0aW1lciBqaXR0ZXIgKFJDNSBpcyB+MjRtcyBhbnl3YXkgc28gdGhpcyBpcyBvaykgKi8KIAlpZiAoZ2FwIDwgMjgwMDApIHsKLQkJZHByaW50ayhLRVJOX0lORk8gREVWTkFNRSAiOiBzcHVyaW91cyB0aW1lcl9lbmRcbiIpOworCQlkcHJpbnRrKCJzcHVyaW91cyB0aW1lcl9lbmRcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGlyLT5sYXN0X2JpdCA8IDIwKSB7CiAJCS8qIGlnbm9yZSBzcHVyaW91cyBjb2RlcyAoY2F1c2VkIGJ5IGxpZ2h0L290aGVyIHJlbW90ZXMpICovCi0JCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogc2hvcnQgY29kZTogJXhcbiIsIGlyLT5jb2RlKTsKKwkJZHByaW50aygic2hvcnQgY29kZTogJXhcbiIsIGlyLT5jb2RlKTsKIAl9IGVsc2UgewogCQlpci0+Y29kZSA9IChpci0+Y29kZSA8PCBpci0+c2hpZnRfYnkpIHwgMTsKIAkJcmM1ID0gYnR0dl9yYzVfZGVjb2RlKGlyLT5jb2RlKTsKIAogCQkvKiB0d28gc3RhcnQgYml0cz8gKi8KIAkJaWYgKFJDNV9TVEFSVChyYzUpICE9IGlyLT5zdGFydCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6IgorCQkJcHJfaW5mbyhERVZOQU1FICI6IgogCQkJICAgICAgICIgcmM1IHN0YXJ0IGJpdHMgaW52YWxpZDogJXVcbiIsIFJDNV9TVEFSVChyYzUpKTsKIAogCQkJLyogcmlnaHQgYWRkcmVzcz8gKi8KQEAgLTIzNSw4ICsyMzcsNyBAQAogCiAJCQkvKiBHb29kIGNvZGUgKi8KIAkJCXJjX2tleWRvd24oaXItPmRldiwgaW5zdHIsIHRvZ2dsZSk7Ci0JCQlkcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6IgotCQkJCSIgaW5zdHJ1Y3Rpb24gJXgsIHRvZ2dsZSAleFxuIiwKKwkJCWRwcmludGsoImluc3RydWN0aW9uICV4LCB0b2dnbGUgJXhcbiIsCiAJCQkJaW5zdHIsIHRvZ2dsZSk7CiAJCX0KIAl9CkBAIC0yNjUsNyArMjY2LDcgQEAKIAkJICAgIHR2LnR2X3VzZWMgLSBpci0+YmFzZV90aW1lLnR2X3VzZWM7CiAJfQogCi0JZHByaW50ayhLRVJOX0lORk8gREVWTkFNRSAiOiBSQzUgSVJROiBnYXAgJWQgdXMgZm9yICVzXG4iLAorCWRwcmludGsoIlJDNSBJUlE6IGdhcCAlZCB1cyBmb3IgJXNcbiIsCiAJCWdhcCwgKGdwaW8gJiAweDIwKSA/ICJtYXJrIiA6ICJzcGFjZSIpOwogCiAJLyogcmVtb3RlIElSUT8gKi8KQEAgLTM0MCwxNCArMzQxLDE0IEBACiAKIAkvKiBwb2xsIElSIGNoaXAgKi8KIAlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoaXItPmMsICZiLCAxKSkgewotCQlkcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6IHJlYWQgZXJyb3JcbiIpOworCQlkcHJpbnRrKCJyZWFkIGVycm9yXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJLyogaWdub3JlIDB4YWEgKi8KIAlpZiAoYj09MHhhYSkKIAkJcmV0dXJuIDA7Ci0JZHByaW50ayhLRVJOX0lORk8gREVWTkFNRSAiOiBrZXkgJTAyeFxuIiwgYik7CisJZHByaW50aygia2V5ICUwMnhcbiIsIGIpOwogCiAJLyoKIAkgKiBOT1RFOgpAQCAtNTE3LDcgKzUxOCw3IEBACiAJCWJyZWFrOwogCX0KIAlpZiAoTlVMTCA9PSBpcl9jb2RlcykgewotCQlkcHJpbnRrKEtFUk5fSU5GTyAiT29vcHM6IElSIGNvbmZpZyBlcnJvciBbY2FyZD0lZF1cbiIsIGJ0di0+Yy50eXBlKTsKKwkJZHByaW50aygiT29vcHM6IElSIGNvbmZpZyBlcnJvciBbY2FyZD0lZF1cbiIsIGJ0di0+Yy50eXBlKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LXJpc2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1yaXNjLmMKaW5kZXggOWI1N2QwOS4uODJjYzQ3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LXJpc2MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtcmlzYy5jCkBAIC0yNCw2ICsyNCw4IEBACiAKICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC00NzMsOCArNDc1LDcgQEAKIAljYXBjdGwgfD0gKGJ0di0+Y2FwX2N0bCAmIDB4MGMpID8gMHgwYyA6IDB4MDA7ICAvKiB2YmkgZGF0YSAqLwogCWNhcGN0bCB8PSBvdmVycmlkZTsKIAotCWQycHJpbnRrKEtFUk5fREVCVUcKLQkJICJidHR2JWQ6IGNhcGN0bD0leCBsaXJxPSVkIHRvcD0lMDhMeC8lMDhMeCBldmVuPSUwOEx4LyUwOEx4XG4iLAorCWQycHJpbnRrKCIlZDogY2FwY3RsPSV4IGxpcnE9JWQgdG9wPSUwOGxseC8lMDhsbHggZXZlbj0lMDhsbHgvJTA4bGx4XG4iLAogCQkgYnR2LT5jLm5yLGNhcGN0bCxidHYtPmxvb3BfaXJxLAogCQkgYnR2LT5jdmJpICAgICAgICAgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3ZiaS0+dG9wLmRtYSAgICAgICAgICAgIDogMCwKIAkJIGJ0di0+Y3Vyci50b3AgICAgID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN1cnIudG9wLT50b3AuZG1hICAgICAgICA6IDAsCkBAIC01MTcsOCArNTE4LDggQEAKIAogCWlmICgocmMgPSBidGN4X3Jpc2NtZW1fYWxsb2MoYnR2LT5jLnBjaSwmYnR2LT5tYWluLFBBR0VfU0laRSkpIDwgMCkKIAkJcmV0dXJuIHJjOwotCWRwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiByaXNjIG1haW4gQCAlMDhMeFxuIiwKLQkJYnR2LT5jLm5yLCh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5tYWluLmRtYSk7CisJZHByaW50aygiJWQ6IHJpc2MgbWFpbiBAICUwOGxseFxuIiwKKwkJYnR2LT5jLm5yLCAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+bWFpbi5kbWEpOwogCiAJYnR2LT5tYWluLmNwdVswXSA9IGNwdV90b19sZTMyKEJUODQ4X1JJU0NfU1lOQyB8IEJUODQ4X1JJU0NfUkVTWU5DIHwKIAkJCQkgICAgICAgQlQ4NDhfRklGT19TVEFUVVNfVlJFKTsKQEAgLTU1NywxMiArNTU4LDEyIEBACiAJdW5zaWduZWQgbG9uZyBuZXh0ID0gYnR2LT5tYWluLmRtYSArICgoc2xvdCsyKSA8PCAyKTsKIAogCWlmIChOVUxMID09IHJpc2MpIHsKLQkJZDJwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiByaXNjPSVwIHNsb3RbJWRdPU5VTExcbiIsCi0JCQkgYnR2LT5jLm5yLHJpc2Msc2xvdCk7CisJCWQycHJpbnRrKCIlZDogcmlzYz0lcCBzbG90WyVkXT1OVUxMXG4iLCBidHYtPmMubnIsIHJpc2MsIHNsb3QpOwogCQlidHYtPm1haW4uY3B1W3Nsb3QrMV0gPSBjcHVfdG9fbGUzMihuZXh0KTsKIAl9IGVsc2UgewotCQlkMnByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IHJpc2M9JXAgc2xvdFslZF09JTA4THggaXJxPSVkXG4iLAotCQkJIGJ0di0+Yy5ucixyaXNjLHNsb3QsKHVuc2lnbmVkIGxvbmcgbG9uZylyaXNjLT5kbWEsaXJxZmxhZ3MpOworCQlkMnByaW50aygiJWQ6IHJpc2M9JXAgc2xvdFslZF09JTA4bGx4IGlycT0lZFxuIiwKKwkJCSBidHYtPmMubnIsIHJpc2MsIHNsb3QsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyaXNjLT5kbWEsIGlycWZsYWdzKTsKIAkJY21kID0gQlQ4NDhfUklTQ19KVU1QOwogCQlpZiAoaXJxZmxhZ3MpIHsKIAkJCWNtZCB8PSBCVDg0OF9SSVNDX0lSUTsKQEAgLTcwOCw4ICs3MDksNyBAQAogCWNvbnN0IHN0cnVjdCBidHR2X3R2bm9ybSAqdHZub3JtID0gYnR0dl90dm5vcm1zICsgYnVmLT50dm5vcm07CiAJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hPXZpZGVvYnVmX3RvX2RtYSgmYnVmLT52Yik7CiAKLQlkcHJpbnRrKEtFUk5fREVCVUcKLQkJImJ0dHYlZDogYnVmZmVyIGZpZWxkOiAlcyAgZm9ybWF0OiAlcyAgc2l6ZTogJWR4JWRcbiIsCisJZHByaW50aygiJWQ6IGJ1ZmZlciBmaWVsZDogJXMgIGZvcm1hdDogJXMgIHNpemU6ICVkeCVkXG4iLAogCQlidHYtPmMubnIsIHY0bDJfZmllbGRfbmFtZXNbYnVmLT52Yi5maWVsZF0sCiAJCWJ1Zi0+Zm10LT5uYW1lLCBidWYtPnZiLndpZHRoLCBidWYtPnZiLmhlaWdodCk7CiAKQEAgLTg3MCwxMCArODcwLDkgQEAKIAkJICBzdHJ1Y3QgYnR0dl9idWZmZXIgKmJ1ZikKIHsKIAkvKiBjaGVjayBpbnRlcmxlYXZlLCBib3R0b20rdG9wIGZpZWxkcyAqLwotCWRwcmludGsoS0VSTl9ERUJVRwotCQkiYnR0diVkOiBvdmVybGF5IGZpZWxkczogJXMgZm9ybWF0OiAlcyAgc2l6ZTogJWR4JWRcbiIsCisJZHByaW50aygiJWQ6IG92ZXJsYXkgZmllbGRzOiAlcyBmb3JtYXQ6ICVzICBzaXplOiAlZHglZFxuIiwKIAkJYnR2LT5jLm5yLCB2NGwyX2ZpZWxkX25hbWVzW2J1Zi0+dmIuZmllbGRdLAotCQlmbXQtPm5hbWUsb3YtPncud2lkdGgsb3YtPncuaGVpZ2h0KTsKKwkJZm10LT5uYW1lLCBvdi0+dy53aWR0aCwgb3YtPncuaGVpZ2h0KTsKIAogCS8qIGNhbGN1bGF0ZSBnZW9tZXRyeSAqLwogCWJ0dHZfY2FsY19nZW8oYnR2LCZidWYtPmdlbyxvdi0+dy53aWR0aCxvdi0+dy5oZWlnaHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtdmJpLmMKaW5kZXggZTc5YTQwMi4uYjQzMzI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di12YmkuYwpAQCAtMjMsNiArMjMsOCBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtNjUsOCArNjcsMTEgQEAKICNpZmRlZiBkcHJpbnRrCiAjIHVuZGVmIGRwcmludGsKICNlbmRpZgotI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAodmJpX2RlYnVnKSBcCi0JcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZC92Ymk6ICIgZm10LCBidHYtPmMubnIgLCAjIyBhcmcpCisjZGVmaW5lIGRwcmludGsoZm10LCAuLi4pCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAodmJpX2RlYnVnKQkJCQkJCQlcCisJCXByX2RlYnVnKCIlZDogIiBmbXQsIGJ0di0+Yy5uciwgIyNfX1ZBX0FSR1NfXyk7CQlcCit9IHdoaWxlICgwKQogCiAjZGVmaW5lIElNQUdFX1NJWkUoZm10KSBcCiAJKCgoZm10KS0+Y291bnRbMF0gKyAoZm10KS0+Y291bnRbMV0pICogKGZtdCktPnNhbXBsZXNfcGVyX2xpbmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKaW5kZXggMzE4ZWRmMi4uZGI5NDNhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKQEAgLTMxMCw5ICszMTAsMjEgQEAKIGV4dGVybiB2b2lkIGJ0dHZfZ3Bpb190cmFja2luZyhzdHJ1Y3QgYnR0diAqYnR2LCBjaGFyICpjb21tZW50KTsKIGV4dGVybiBpbnQgaW5pdF9idHR2X2kyYyhzdHJ1Y3QgYnR0diAqYnR2KTsKIAotI2RlZmluZSBidHR2X3ByaW50ayBpZiAoYnR0dl92ZXJib3NlKSBwcmludGsKLSNkZWZpbmUgZHByaW50ayAgaWYgKGJ0dHZfZGVidWcgPj0gMSkgcHJpbnRrCi0jZGVmaW5lIGQycHJpbnRrIGlmIChidHR2X2RlYnVnID49IDIpIHByaW50aworI2RlZmluZSBkcHJpbnRrKGZtdCwgLi4uKQkJCVwKK2RvIHsJCQkJCQlcCisJaWYgKGJ0dHZfZGVidWcgPj0gMSkJCQlcCisJCXByX2RlYnVnKGZtdCwgIyNfX1ZBX0FSR1NfXyk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIGRwcmludGtfY29udChmbXQsIC4uLikJCQlcCitkbyB7CQkJCQkJXAorCWlmIChidHR2X2RlYnVnID49IDEpCQkJXAorCQlwcl9jb250KGZtdCwgIyNfX1ZBX0FSR1NfXyk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIGQycHJpbnRrKGZtdCwgLi4uKQkJCVwKK2RvIHsJCQkJCQlcCisJaWYgKGJ0dHZfZGVidWcgPj0gMikJCQlcCisJCXByaW50ayhmbXQsICMjX19WQV9BUkdTX18pOwlcCit9IHdoaWxlICgwKQogCiAjZGVmaW5lIEJUVFZfTUFYX0ZCVUYgICAweDIwODAwMAogI2RlZmluZSBCVFRWX1RJTUVPVVQgICAgbXNlY3NfdG9famlmZmllcyg1MDApICAgIC8qIDAuNSBzZWNvbmRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3VzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl91c2IuYwppbmRleCBkYzViMDdhLi41OWM3OTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3VzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdXNiLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJjcGlhMi5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvTWFrZWZpbGUKaW5kZXggMmZhZGQ5ZC4uYTg2YmFiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9NYWtlZmlsZQpAQCAtOCw2ICs4LDYgQEAKIG9iai0kKENPTkZJR19WSURFT19DWDE4KSArPSBjeDE4Lm8KIG9iai0kKENPTkZJR19WSURFT19DWDE4X0FMU0EpICs9IGN4MTgtYWxzYS5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5jCmluZGV4IDllMmY4NzAuLmM2ZmYzMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5jCkBAIC0xMDg1LDYgKzEwODUsOCBAQAogCQlzZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKIAkJc2V0dXAudHlwZSA9IGN4LT5vcHRpb25zLnR1bmVyOwogCQlzZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UVjsgIC8qIG1hdGNoZXMgVFYgdHVuZXJzICovCisJCWlmIChjeC0+b3B0aW9ucy5yYWRpbyA+IDApCisJCQlzZXR1cC5tb2RlX21hc2sgfD0gVF9SQURJTzsKIAkJc2V0dXAudHVuZXJfY2FsbGJhY2sgPSAoc2V0dXAudHlwZSA9PSBUVU5FUl9YQzIwMjgpID8KIAkJCWN4MThfcmVzZXRfdHVuZXJfZ3BpbyA6IE5VTEw7CiAJCWN4MThfY2FsbF9hbGwoY3gsIHR1bmVyLCBzX3R5cGVfYWRkciwgJnNldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmgKaW5kZXggMTgzNDIwNy4uYjlhOTRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmgKQEAgLTQwOSw2ICs0MDksNyBAQAogCiAJLyogVmlkZW9idWYgZm9yIFlVViB2aWRlbyAqLwogCXUzMiBwaXhlbGZvcm1hdDsKKwl1MzIgdmJfYnl0ZXNfcGVyX2ZyYW1lOwogCXN0cnVjdCBsaXN0X2hlYWQgdmJfY2FwdHVyZTsgICAgLyogdmlkZW8gY2FwdHVyZSBxdWV1ZSAqLwogCXNwaW5sb2NrX3QgdmJfbG9jazsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB2Yl90aW1lb3V0OwpAQCAtNDMwLDEwICs0MzEsNiBAQAogCXUzMiBvcGVuX2lkOwogCWludCB0eXBlOwogCXN0cnVjdCBjeDE4ICpjeDsKLQotCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSB2YnVmX3E7Ci0Jc3BpbmxvY2tfdCBzX2xvY2s7IC8qIFByb3RlY3QgdmJ1Zl9xICovCi0JZW51bSB2NGwyX2J1Zl90eXBlIHZiX3R5cGU7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjeDE4X29wZW5faWQgKmZoMmlkKHN0cnVjdCB2NGwyX2ZoICpmaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpbGVvcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpbGVvcHMuYwppbmRleCAwNzQxMWYzLi4xNGNiOTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1maWxlb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZmlsZW9wcy5jCkBAIC03ODQsOCArNzg0LDYgQEAKIAkJY3gxOF9yZWxlYXNlX3N0cmVhbShzKTsKIAl9IGVsc2UgewogCQljeDE4X3N0b3BfY2FwdHVyZShpZCwgMCk7Ci0JCWlmIChpZC0+dHlwZSA9PSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9ZVVYpCi0JCQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmlkLT52YnVmX3EpOwogCX0KIAlrZnJlZShpZCk7CiAJbXV0ZXhfdW5sb2NrKCZjeC0+c2VyaWFsaXplX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKaW5kZXggYWZlMGEyOS4uNjZiMWMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCkBAIC0xNjAsMTIgKzE2MCw3IEBACiAJcGl4Zm10LT5wcml2ID0gMDsKIAlpZiAoaWQtPnR5cGUgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfWVVWKSB7CiAJCXBpeGZtdC0+cGl4ZWxmb3JtYXQgPSBzLT5waXhlbGZvcm1hdDsKLQkJLyogSE0xMiBZVVYgc2l6ZSBpcyAoWT0oaCo3MjApICsgVVY9KGgqKDcyMC8yKSkpCi0JCSAgIFVZVVYgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjApKSkgKi8KLQkJaWYgKHMtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ITTEyKQotCQkJcGl4Zm10LT5zaXplaW1hZ2UgPSBwaXhmbXQtPmhlaWdodCAqIDcyMCAqIDMgLyAyOwotCQllbHNlCi0JCQlwaXhmbXQtPnNpemVpbWFnZSA9IHBpeGZtdC0+aGVpZ2h0ICogNzIwICogMjsKKwkJcGl4Zm10LT5zaXplaW1hZ2UgPSBzLT52Yl9ieXRlc19wZXJfZnJhbWU7CiAJCXBpeGZtdC0+Ynl0ZXNwZXJsaW5lID0gNzIwOwogCX0gZWxzZSB7CiAJCXBpeGZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKQEAgLTI5Niw2ICsyOTEsMTIgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCXMtPnBpeGVsZm9ybWF0ID0gZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0OworCS8qIEhNMTIgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjAvMikpKQorCSAgIFVZVVYgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjApKSkgKi8KKwlpZiAocy0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0hNMTIpCisJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGggKiA3MjAgKiAzIC8gMjsKKwllbHNlCisJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGggKiA3MjAgKiAyOwogCiAJbWJ1c19mbXQud2lkdGggPSBjeC0+Y3hoZGwud2lkdGggPSB3OwogCW1idXNfZm10LmhlaWdodCA9IGN4LT5jeGhkbC5oZWlnaHQgPSBoOwpAQCAtNDYzLDEzICs0NjQsMTYgQEAKIHN0YXRpYyBpbnQgY3gxOF9xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCiAJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdmNhcCkKIHsKLQlzdHJ1Y3QgY3gxOCAqY3ggPSBmaDJpZChmaCktPmN4OworCXN0cnVjdCBjeDE4X29wZW5faWQgKmlkID0gZmgyaWQoZmgpOworCXN0cnVjdCBjeDE4ICpjeCA9IGlkLT5jeDsKIAogCXN0cmxjcHkodmNhcC0+ZHJpdmVyLCBDWDE4X0RSSVZFUl9OQU1FLCBzaXplb2YodmNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweSh2Y2FwLT5jYXJkLCBjeC0+Y2FyZF9uYW1lLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXNucHJpbnRmKHZjYXAtPmJ1c19pbmZvLCBzaXplb2YodmNhcC0+YnVzX2luZm8pLAogCQkgIlBDSTolcyIsIHBjaV9uYW1lKGN4LT5wY2lfZGV2KSk7CiAJdmNhcC0+Y2FwYWJpbGl0aWVzID0gY3gtPnY0bDJfY2FwOyAJICAgIC8qIGNhcGFiaWxpdGllcyAqLworCWlmIChpZC0+dHlwZSA9PSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9ZVVYpCisJCXZjYXAtPmNhcGFiaWxpdGllcyB8PSBWNEwyX0NBUF9TVFJFQU1JTkc7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guYwppbmRleCBjMDcxOTFlLi4wYzc3OTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1tYWlsYm94LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAl9CiAKIAkvKiBJZiB3ZSd2ZSBmaWxsZWQgdGhlIGJ1ZmZlciBhcyBwZXIgdGhlIGNhbGxlcnMgcmVzIHRoZW4gZGlzcGF0Y2ggaXQgKi8KLQlpZiAodmJfYnVmLT5ieXRlc191c2VkID49ICh2Yl9idWYtPnZiLndpZHRoICogdmJfYnVmLT52Yi5oZWlnaHQgKiAyKSkgeworCWlmICh2Yl9idWYtPmJ5dGVzX3VzZWQgPj0gcy0+dmJfYnl0ZXNfcGVyX2ZyYW1lKSB7CiAJCWRpc3BhdGNoID0gMTsKIAkJdmJfYnVmLT5ieXRlc191c2VkID0gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zdHJlYW1zLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zdHJlYW1zLmMKaW5kZXggODUyZjQyMC4uNjM4Y2NhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc3RyZWFtcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuYwpAQCAtMTM4LDYgKzEzOCwxMiBAQAogCQlidWYtPnR2bm9ybSAgICA9IGN4LT5zdGQ7CiAJCXMtPnBpeGVsZm9ybWF0ID0gcGl4ZWxmb3JtYXQ7CiAKKwkJLyogSE0xMiBZVVYgc2l6ZSBpcyAoWT0oaCo3MjApICsgVVY9KGgqKDcyMC8yKSkpCisJCSAgIFVZVVYgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjApKSkgKi8KKwkJaWYgKHMtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ITTEyKQorCQkJcy0+dmJfYnl0ZXNfcGVyX2ZyYW1lID0gaGVpZ2h0ICogNzIwICogMyAvIDI7CisJCWVsc2UKKwkJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGhlaWdodCAqIDcyMCAqIDI7CiAJCWN4MThfZG1hX2ZyZWUocSwgcywgYnVmKTsKIAl9CiAKQEAgLTE1NCw2ICsxNjAsMTIgQEAKIAkJYnVmLT50dm5vcm0gICAgPSBjeC0+c3RkOwogCQlzLT5waXhlbGZvcm1hdCA9IHBpeGVsZm9ybWF0OwogCisJCS8qIEhNMTIgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjAvMikpKQorCQkgICBVWVVWIFlVViBzaXplIGlzIChZPShoKjcyMCkgKyBVVj0oaCooNzIwKSkpICovCisJCWlmIChzLT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfSE0xMikKKwkJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGhlaWdodCAqIDcyMCAqIDMgLyAyOworCQllbHNlCisJCQlzLT52Yl9ieXRlc19wZXJfZnJhbWUgPSBoZWlnaHQgKiA3MjAgKiAyOwogCQlyYyA9IHZpZGVvYnVmX2lvbG9jayhxLCAmYnVmLT52YiwgTlVMTCk7CiAJCWlmIChyYyAhPSAwKQogCQkJZ290byBmYWlsOwpAQCAtMjg3LDYgKzI5OSw3IEBACiAKIAkJLyogQXNzdW1lIHRoZSBwcmV2aW91cyBwaXhlbCBkZWZhdWx0ICovCiAJCXMtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0hNMTI7CisJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGN4LT5jeGhkbC5oZWlnaHQgKiA3MjAgKiAzIC8gMjsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9NYWtlZmlsZQppbmRleCAyYzI0ODQzLi5iMzM0ODk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L01ha2VmaWxlCkBAIC04LDkgKzgsOSBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0NYMjMxWFhfQUxTQSkgKz0gY3gyMzF4eC1hbHNhLm8KIG9iai0kKENPTkZJR19WSURFT19DWDIzMVhYX0RWQikgKz0gY3gyMzF4eC1kdmIubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCmluZGV4IGNhYWIxYmYuLmIzOTFlOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCkBAIC0zOCw3ICszOCw3IEBACiBjb25maWcgTUVESUFfQUxURVJBX0NJCiAJdHJpc3RhdGUgIkFsdGVyYSBGUEdBIGJhc2VkIENJIG1vZHVsZSIKIAlkZXBlbmRzIG9uIFZJREVPX0NYMjM4ODUgJiYgRFZCX0NPUkUKLQlzZWxlY3QgU1RBUExfQUxURVJBCisJc2VsZWN0IEFMVEVSQV9TVEFQTAogCS0tLWhlbHAtLS0KIAkgIEFuIEFsdGVyYSBGUEdBIENJIG1vZHVsZSBmb3IgTmV0VVAgRHVhbCBEVkItVC9DIFJGIENJIGNhcmQuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9NYWtlZmlsZQppbmRleCAyMzI5M2M3Li5mODFmMjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L01ha2VmaWxlCkBAIC0yLDE0ICsyLDE0IEBACiAJCSAgICBjeDIzODg1LWNvcmUubyBjeDIzODg1LWkyYy5vIGN4MjM4ODUtZHZiLm8gY3gyMzg4NS00MTcubyBcCiAJCSAgICBjeDIzODg1LWlvY3RsLm8gY3gyMzg4NS1pci5vIGN4MjM4ODUtYXYubyBjeDIzODg1LWlucHV0Lm8gXAogCQkgICAgY3gyMzg4OC1pci5vIG5ldHVwLWluaXQubyBjaW1heDIubyBuZXR1cC1lZXByb20ubyBcCi0JCSAgICBjeDIzODg1LWYzMDAubworCQkgICAgY3gyMzg4NS1mMzAwLm8gY3gyMzg4NS1hbHNhLm8KIAogb2JqLSQoQ09ORklHX1ZJREVPX0NYMjM4ODUpICs9IGN4MjM4ODUubwogb2JqLSQoQ09ORklHX01FRElBX0FMVEVSQV9DSSkgKz0gYWx0ZXJhLWNpLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKIAotRVhUUkFfQ0ZMQUdTICs9ICQoZXh0cmEtY2ZsYWdzLXkpICQoZXh0cmEtY2ZsYWdzLW0pCitjY2ZsYWdzLXkgKz0gJChleHRyYS1jZmxhZ3MteSkgJChleHRyYS1jZmxhZ3MtbSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWFsc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTUxNjkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtYWxzYS5jCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICoKKyAqICBTdXBwb3J0IGZvciBDWDIzODg1IGFuYWxvZyBhdWRpbyBjYXB0dXJlCisgKgorICogICAgKGMpIDIwMDggTWlqaGFpbCBNb3JleXJhIDxtaWpoYWlsLm1vcmV5cmFAZ21haWwuY29tPgorICogICAgQWRhcHRlZCBmcm9tIGN4ODgtYWxzYS5jCisgKiAgICAoYykgMjAwOSBTdGV2ZW4gVG90aCA8c3RvdGhAa2VybmVsbGFicy5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisKKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworCisjaW5jbHVkZSAiY3gyMzg4NS5oIgorI2luY2x1ZGUgImN4MjM4ODUtcmVnLmgiCisKKyNkZWZpbmUgQVVESU9fU1JBTV9DSEFOTkVMCVNSQU1fQ0gwNworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKQlpZiAoYXVkaW9fZGVidWcgPj0gbGV2ZWwpIFwKKwlwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQsIGNoaXAtPmRldi0+bmFtZSAsICMjIGFyZykKKworI2RlZmluZSBkcHJpbnRrX2NvcmUobGV2ZWwsIGZtdCwgYXJnLi4uKQlpZiAoYXVkaW9fZGVidWcgPj0gbGV2ZWwpIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBjaGlwLT5kZXYtPm5hbWUgLCAjIyBhcmcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlNb2R1bGUgZ2xvYmFsIHN0YXRpYyB2YXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBkaXNhYmxlX2FuYWxvZ19hdWRpbzsKK21vZHVsZV9wYXJhbShkaXNhYmxlX2FuYWxvZ19hdWRpbywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9hbmFsb2dfYXVkaW8sICJkaXNhYmxlIGFuYWxvZyBhdWRpbyBBTFNBIGRyaXZlciIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvX2RlYnVnOworbW9kdWxlX3BhcmFtKGF1ZGlvX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhhdWRpb19kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbYW5hbG9nIGF1ZGlvXSIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJQm9hcmQgc3BlY2lmaWMgZnVudGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25zdGFudHMgdGFrZW4gZnJvbSBjeDg4LXJlZy5oICovCisjZGVmaW5lIEFVRF9JTlRfRE5fUklTQ0kxICAgICAgICgxIDw8ICAwKQorI2RlZmluZSBBVURfSU5UX1VQX1JJU0NJMSAgICAgICAoMSA8PCAgMSkKKyNkZWZpbmUgQVVEX0lOVF9SRFNfRE5fUklTQ0kxICAgKDEgPDwgIDIpCisjZGVmaW5lIEFVRF9JTlRfRE5fUklTQ0kyICAgICAgICgxIDw8ICA0KSAvKiB5ZXMsIDMgaXMgc2tpcHBlZCAqLworI2RlZmluZSBBVURfSU5UX1VQX1JJU0NJMiAgICAgICAoMSA8PCAgNSkKKyNkZWZpbmUgQVVEX0lOVF9SRFNfRE5fUklTQ0kyICAgKDEgPDwgIDYpCisjZGVmaW5lIEFVRF9JTlRfRE5fU1lOQyAgICAgICAgICgxIDw8IDEyKQorI2RlZmluZSBBVURfSU5UX1VQX1NZTkMgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgQVVEX0lOVF9SRFNfRE5fU1lOQyAgICAgKDEgPDwgMTQpCisjZGVmaW5lIEFVRF9JTlRfT1BDX0VSUiAgICAgICAgICgxIDw8IDE2KQorI2RlZmluZSBBVURfSU5UX0JFUl9JUlEgICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgQVVEX0lOVF9NQ0hHX0lSUSAgICAgICAgKDEgPDwgMjEpCisjZGVmaW5lIEdQX0NPVU5UX0NPTlRST0xfUkVTRVQJMHgzCisKKy8qCisgKiBCT0FSRCBTcGVjaWZpYzogU2V0cyBhdWRpbyBETUEKKyAqLworCitzdGF0aWMgaW50IGN4MjM4ODVfc3RhcnRfYXVkaW9fZG1hKHN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY2hpcCkKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19idWZmZXIgKmJ1ZiA9IGNoaXAtPmJ1ZjsKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiAgPSBjaGlwLT5kZXY7CisJc3RydWN0IHNyYW1fY2hhbm5lbCAqYXVkaW9fY2ggPQorCQkmZGV2LT5zcmFtX2NoYW5uZWxzW0FVRElPX1NSQU1fQ0hBTk5FTF07CisKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBNYWtlIHN1cmUgUklTQy9GSUZPIGFyZSBvZmYgYmVmb3JlIGNoYW5naW5nIEZJRk8vUklTQyBzZXR0aW5ncyAqLworCWN4X2NsZWFyKEFVRF9JTlRfRE1BX0NUTCwgMHgxMSk7CisKKwkvKiBzZXR1cCBmaWZvICsgZm9ybWF0IC0gb3V0IGNoYW5uZWwgKi8KKwljeDIzODg1X3NyYW1fY2hhbm5lbF9zZXR1cChjaGlwLT5kZXYsIGF1ZGlvX2NoLCBidWYtPmJwbCwKKwkJYnVmLT5yaXNjLmRtYSk7CisKKwkvKiBzZXRzIGJwbCBzaXplICovCisJY3hfd3JpdGUoQVVEX0lOVF9BX0xOR1RILCBidWYtPmJwbCk7CisKKwkvKiBUaGlzIGlzIHJlcXVpcmVkIHRvIGdldCBnb29kIGF1ZGlvICgxIHNlZW1zIHRvIGJlIG9rKSAqLworCWN4X3dyaXRlKEFVRF9JTlRfQV9NT0RFLCAxKTsKKworCS8qIHJlc2V0IGNvdW50ZXIgKi8KKwljeF93cml0ZShBVURfSU5UX0FfR1BDTlRfQ1RMLCBHUF9DT1VOVF9DT05UUk9MX1JFU0VUKTsKKwlhdG9taWNfc2V0KCZjaGlwLT5jb3VudCwgMCk7CisKKwlkcHJpbnRrKDEsICJTdGFydCBhdWRpbyBETUEsICVkIEIvbGluZSwgJWQgbGluZXMvRklGTywgJWQgcGVyaW9kcywgJWQgIgorCQkiYnl0ZSBidWZmZXJcbiIsIGJ1Zi0+YnBsLCBjeF9yZWFkKGF1ZGlvX2NoLT5jbWRzX3N0YXJ0KzEyKT4+MSwKKwkJY2hpcC0+bnVtX3BlcmlvZHMsIGJ1Zi0+YnBsICogY2hpcC0+bnVtX3BlcmlvZHMpOworCisJLyogRW5hYmxlcyBjb3JyZXNwb25kaW5nIGJpdHMgYXQgQVVEX0lOVF9TVEFUICovCisJY3hfd3JpdGUoQVVESU9fSU5UX0lOVF9NU0ssIEFVRF9JTlRfT1BDX0VSUiB8IEFVRF9JTlRfRE5fU1lOQyB8CisJCQkJICAgIEFVRF9JTlRfRE5fUklTQ0kxKTsKKworCS8qIENsZWFuIGFueSBwZW5kaW5nIGludGVycnVwdCBiaXRzIGFscmVhZHkgc2V0ICovCisJY3hfd3JpdGUoQVVESU9fSU5UX0lOVF9TVEFULCB+MCk7CisKKwkvKiBlbmFibGUgYXVkaW8gaXJxcyAqLworCWN4X3NldChQQ0lfSU5UX01TSywgY2hpcC0+ZGV2LT5wY2lfaXJxbWFzayB8IFBDSV9NU0tfQVVEX0lOVCk7CisKKwkvKiBzdGFydCBkbWEgKi8KKwljeF9zZXQoREVWX0NOVFJMMiwgKDE8PDUpKTsgLyogRW5hYmxlcyBSaXNjIFByb2Nlc3NvciAqLworCWN4X3NldChBVURfSU5UX0RNQV9DVEwsIDB4MTEpOyAvKiBhdWRpbyBkb3duc3RyZWFtIEZJRk8gYW5kCisJCQkJCSAgUklTQyBlbmFibGUgKi8KKwlpZiAoYXVkaW9fZGVidWcpCisJCWN4MjM4ODVfc3JhbV9jaGFubmVsX2R1bXAoY2hpcC0+ZGV2LCBhdWRpb19jaCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJPQVJEIFNwZWNpZmljOiBSZXNldHMgYXVkaW8gRE1BCisgKi8KK3N0YXRpYyBpbnQgY3gyMzg4NV9zdG9wX2F1ZGlvX2RtYShzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXApCit7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSBjaGlwLT5kZXY7CisJZHByaW50aygxLCAiU3RvcHBpbmcgYXVkaW8gRE1BXG4iKTsKKworCS8qIHN0b3AgZG1hICovCisJY3hfY2xlYXIoQVVEX0lOVF9ETUFfQ1RMLCAweDExKTsKKworCS8qIGRpc2FibGUgaXJxcyAqLworCWN4X2NsZWFyKFBDSV9JTlRfTVNLLCBQQ0lfTVNLX0FVRF9JTlQpOworCWN4X2NsZWFyKEFVRElPX0lOVF9JTlRfTVNLLCBBVURfSU5UX09QQ19FUlIgfCBBVURfSU5UX0ROX1NZTkMgfAorCQkJCSAgICBBVURfSU5UX0ROX1JJU0NJMSk7CisKKwlpZiAoYXVkaW9fZGVidWcpCisJCWN4MjM4ODVfc3JhbV9jaGFubmVsX2R1bXAoY2hpcC0+ZGV2LAorCQkJJmRldi0+c3JhbV9jaGFubmVsc1tBVURJT19TUkFNX0NIQU5ORUxdKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQk9BUkQgU3BlY2lmaWM6IEhhbmRsZXMgYXVkaW8gSVJRCisgKi8KK2ludCBjeDIzODg1X2F1ZGlvX2lycShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIHN0YXR1cywgdTMyIG1hc2spCit7CisJc3RydWN0IGN4MjM4ODVfYXVkaW9fZGV2ICpjaGlwID0gZGV2LT5hdWRpb19kZXY7CisKKwlpZiAoMCA9PSAoc3RhdHVzICYgbWFzaykpCisJCXJldHVybiAwOworCisJY3hfd3JpdGUoQVVESU9fSU5UX0lOVF9TVEFULCBzdGF0dXMpOworCisJLyogcmlzYyBvcCBjb2RlIGVycm9yICovCisJaWYgKHN0YXR1cyAmIEFVRF9JTlRfT1BDX0VSUikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy8xOiBBdWRpbyByaXNjIG9wIGNvZGUgZXJyb3JcbiIsCisJCQlkZXYtPm5hbWUpOworCQljeF9jbGVhcihBVURfSU5UX0RNQV9DVEwsIDB4MTEpOworCQljeDIzODg1X3NyYW1fY2hhbm5lbF9kdW1wKGRldiwKKwkJCSZkZXYtPnNyYW1fY2hhbm5lbHNbQVVESU9fU1JBTV9DSEFOTkVMXSk7CisJfQorCWlmIChzdGF0dXMgJiBBVURfSU5UX0ROX1NZTkMpIHsKKwkJZHByaW50aygxLCAiRG93bnN0cmVhbSBzeW5jIGVycm9yXG4iKTsKKwkJY3hfd3JpdGUoQVVEX0lOVF9BX0dQQ05UX0NUTCwgR1BfQ09VTlRfQ09OVFJPTF9SRVNFVCk7CisJCXJldHVybiAxOworCX0KKwkvKiByaXNjMSBkb3duc3RyZWFtICovCisJaWYgKHN0YXR1cyAmIEFVRF9JTlRfRE5fUklTQ0kxKSB7CisJCWF0b21pY19zZXQoJmNoaXAtPmNvdW50LCBjeF9yZWFkKEFVRF9JTlRfQV9HUENOVCkpOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPnN1YnN0cmVhbSk7CisJfQorCS8qIEZJWE1FOiBBbnkgb3RoZXIgc3RhdHVzIHNob3VsZCBkZXNlcnZlIGEgc3BlY2lhbCBoYW5kbGluZz8gKi8KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRzcF9idWZmZXJfZnJlZShzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXApCit7CisJQlVHX09OKCFjaGlwLT5kbWFfc2l6ZSk7CisKKwlkcHJpbnRrKDIsICJGcmVlaW5nIGJ1ZmZlclxuIik7CisJdmlkZW9idWZfZG1hX3VubWFwKCZjaGlwLT5wY2ktPmRldiwgY2hpcC0+ZG1hX3Jpc2MpOworCXZpZGVvYnVmX2RtYV9mcmVlKGNoaXAtPmRtYV9yaXNjKTsKKwlidGN4X3Jpc2NtZW1fZnJlZShjaGlwLT5wY2ksICZjaGlwLT5idWYtPnJpc2MpOworCWtmcmVlKGNoaXAtPmJ1Zik7CisKKwljaGlwLT5kbWFfcmlzYyA9IE5VTEw7CisJY2hpcC0+ZG1hX3NpemUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkJQUxTQSBQQ00gSW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERpZ2l0YWwgaGFyZHdhcmUgZGVmaW5pdGlvbgorICovCisjZGVmaW5lIERFRkFVTFRfRklGT19TSVpFCTQwOTYKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9jeDIzODg1X2RpZ2l0YWxfaHcgPSB7CisJLmluZm8gPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQsCisJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKworCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDgwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIEFuYWxvZyBhdWRpbyBvdXRwdXQgd2lsbCBiZSBmdWxsIG9mIGNsaWNrcyBhbmQgcG9wcyBpZiB0aGVyZQorCSAgIGFyZSBub3QgZXhhY3RseSBmb3VyIGxpbmVzIGluIHRoZSBTUkFNIEZJRk8gYnVmZmVyLiAgKi8KKwkucGVyaW9kX2J5dGVzX21pbiA9IERFRkFVTFRfRklGT19TSVpFLzQsCisJLnBlcmlvZF9ieXRlc19tYXggPSBERUZBVUxUX0ZJRk9fU0laRS80LAorCS5wZXJpb2RzX21pbiA9IDEsCisJLnBlcmlvZHNfbWF4ID0gMTAyNCwKKwkuYnVmZmVyX2J5dGVzX21heCA9ICgxMDI0KjEwMjQpLAorfTsKKworLyoKKyAqIGF1ZGlvIHBjbSBjYXB0dXJlIG9wZW4gY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfY3gyMzg4NV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZXJyOworCisJaWYgKCFjaGlwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQlVHOiBjeDIzODg1IGNhbid0IGZpbmQgZGV2aWNlIHN0cnVjdC4iCisJCQkJIiBDYW4ndCBwcm9jZWVkIHdpdGggb3BlblxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9wb3cyKHJ1bnRpbWUsIDAsCisJCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfZXJyb3I7CisKKwljaGlwLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlydW50aW1lLT5odyA9IHNuZF9jeDIzODg1X2RpZ2l0YWxfaHc7CisKKwlpZiAoY2hpcC0+ZGV2LT5zcmFtX2NoYW5uZWxzW0FVRElPX1NSQU1fQ0hBTk5FTF0uZmlmb19zaXplICE9CisJCURFRkFVTFRfRklGT19TSVpFKSB7CisJCXVuc2lnbmVkIGludCBicGwgPSBjaGlwLT5kZXYtPgorCQkJc3JhbV9jaGFubmVsc1tBVURJT19TUkFNX0NIQU5ORUxdLmZpZm9fc2l6ZSAvIDQ7CisJCWJwbCAmPSB+NzsgLyogbXVzdCBiZSBtdWx0aXBsZSBvZiA4ICovCisJCXJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19taW4gPSBicGw7CisJCXJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19tYXggPSBicGw7CisJfQorCisJcmV0dXJuIDA7CitfZXJyb3I6CisJZHByaW50aygxLCAiRXJyb3Igb3BlbmluZyBQQ00hXG4iKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogYXVkaW8gY2xvc2UgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfY3gyMzg4NV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGh3X3BhcmFtcyBjYWxsYmFjaworICovCitzdGF0aWMgaW50IHNuZF9jeDIzODg1X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQoreworCXN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWE7CisKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19idWZmZXIgKmJ1ZjsKKwlpbnQgcmV0OworCisJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEpIHsKKwkJZHNwX2J1ZmZlcl9mcmVlKGNoaXApOworCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKKwl9CisKKwljaGlwLT5wZXJpb2Rfc2l6ZSA9IHBhcmFtc19wZXJpb2RfYnl0ZXMoaHdfcGFyYW1zKTsKKwljaGlwLT5udW1fcGVyaW9kcyA9IHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyk7CisJY2hpcC0+ZG1hX3NpemUgPSBjaGlwLT5wZXJpb2Rfc2l6ZSAqIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyk7CisKKwlCVUdfT04oIWNoaXAtPmRtYV9zaXplKTsKKwlCVUdfT04oY2hpcC0+bnVtX3BlcmlvZHMgJiAoY2hpcC0+bnVtX3BlcmlvZHMtMSkpOworCisJYnVmID0ga3phbGxvYyhzaXplb2YoKmJ1ZiksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWYtPmJwbCA9IGNoaXAtPnBlcmlvZF9zaXplOworCisJZG1hID0gJmJ1Zi0+ZG1hOworCXZpZGVvYnVmX2RtYV9pbml0KGRtYSk7CisJcmV0ID0gdmlkZW9idWZfZG1hX2luaXRfa2VybmVsKGRtYSwgUENJX0RNQV9GUk9NREVWSUNFLAorCQkJKFBBR0VfQUxJR04oY2hpcC0+ZG1hX3NpemUpID4+IFBBR0VfU0hJRlQpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IHZpZGVvYnVmX2RtYV9tYXAoJmNoaXAtPnBjaS0+ZGV2LCBkbWEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gY3gyMzg4NV9yaXNjX2RhdGFidWZmZXIoY2hpcC0+cGNpLCAmYnVmLT5yaXNjLCBkbWEtPnNnbGlzdCwKKwkJCQkgICBjaGlwLT5wZXJpb2Rfc2l6ZSwgY2hpcC0+bnVtX3BlcmlvZHMsIDEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogTG9vcCBiYWNrIHRvIHN0YXJ0IG9mIHByb2dyYW0gKi8KKwlidWYtPnJpc2Muam1wWzBdID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QfFJJU0NfSVJRMXxSSVNDX0NOVF9JTkMpOworCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKKwlidWYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7IC8qIGJpdHMgNjMtMzIgKi8KKworCWNoaXAtPmJ1ZiA9IGJ1ZjsKKwljaGlwLT5kbWFfcmlzYyA9IGRtYTsKKworCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBjaGlwLT5kbWFfcmlzYy0+dmFkZHI7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPSBjaGlwLT5kbWFfc2l6ZTsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyID0gMDsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBodyBmcmVlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX2N4MjM4ODVfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKworCXN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKSB7CisJCWRzcF9idWZmZXJfZnJlZShjaGlwKTsKKwkJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX2N4MjM4ODVfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRyaWdnZXIgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfY3gyMzg4NV9jYXJkX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJaW50IGNtZCkKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IGVycjsKKworCS8qIExvY2FsIGludGVycnVwdHMgYXJlIGFscmVhZHkgZGlzYWJsZWQgYnkgQUxTQSAqLworCXNwaW5fbG9jaygmY2hpcC0+bG9jayk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWVyciA9IGN4MjM4ODVfc3RhcnRfYXVkaW9fZG1hKGNoaXApOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWVyciA9IGN4MjM4ODVfc3RvcF9hdWRpb19kbWEoY2hpcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZjaGlwLT5sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBwb2ludGVyIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfY3gyMzg4NV9wb2ludGVyKAorCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXUxNiBjb3VudDsKKworCWNvdW50ID0gYXRvbWljX3JlYWQoJmNoaXAtPmNvdW50KTsKKworCXJldHVybiBydW50aW1lLT5wZXJpb2Rfc2l6ZSAqIChjb3VudCAmIChydW50aW1lLT5wZXJpb2RzLTEpKTsKK30KKworLyoKKyAqIHBhZ2UgY2FsbGJhY2sgKG5lZWRlZCBmb3IgbW1hcCkKKyAqLworc3RhdGljIHN0cnVjdCBwYWdlICpzbmRfY3gyMzg4NV9wYWdlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXZvaWQgKnBhZ2VwdHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhICsgb2Zmc2V0OworCXJldHVybiB2bWFsbG9jX3RvX3BhZ2UocGFnZXB0cik7Cit9CisKKy8qCisgKiBvcGVyYXRvcnMKKyAqLworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3gyMzg4NV9wY21fb3BzID0geworCS5vcGVuID0gc25kX2N4MjM4ODVfcGNtX29wZW4sCisJLmNsb3NlID0gc25kX2N4MjM4ODVfY2xvc2UsCisJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9IHNuZF9jeDIzODg1X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IHNuZF9jeDIzODg1X2h3X2ZyZWUsCisJLnByZXBhcmUgPSBzbmRfY3gyMzg4NV9wcmVwYXJlLAorCS50cmlnZ2VyID0gc25kX2N4MjM4ODVfY2FyZF90cmlnZ2VyLAorCS5wb2ludGVyID0gc25kX2N4MjM4ODVfcG9pbnRlciwKKwkucGFnZSA9IHNuZF9jeDIzODg1X3BhZ2UsCit9OworCisvKgorICogY3JlYXRlIGEgUENNIGRldmljZQorICovCitzdGF0aWMgaW50IHNuZF9jeDIzODg1X3BjbShzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXAsIGludCBkZXZpY2UsCisJY2hhciAqbmFtZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzbmRfcGNtICpwY207CisKKwllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCBkZXZpY2UsIDAsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlzdHJjcHkocGNtLT5uYW1lLCBuYW1lKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfY3gyMzg4NV9wY21fb3BzKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJQmFzaWMgRmxvdyBmb3IgU291bmQgRGV2aWNlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBBbHNhIENvbnN0cnVjdG9yIC0gQ29tcG9uZW50IHByb2JlCisgKi8KKworc3RydWN0IGN4MjM4ODVfYXVkaW9fZGV2ICpjeDIzODg1X2F1ZGlvX3JlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXA7CisJaW50IGVycjsKKworCWlmIChkaXNhYmxlX2FuYWxvZ19hdWRpbykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZGV2LT5zcmFtX2NoYW5uZWxzW0FVRElPX1NSQU1fQ0hBTk5FTF0uY21kc19zdGFydCA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IE1pc3NpbmcgU1JBTSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gIgorCQkJImZvciBhbmFsb2cgVFYgQXVkaW9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZXJyID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAorCQkJVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYpLCAmY2FyZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwljaGlwID0gKHN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqKSBjYXJkLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+ZGV2ID0gZGV2OworCWNoaXAtPnBjaSA9IGRldi0+cGNpOworCWNoaXAtPmNhcmQgPSBjYXJkOworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5sb2NrKTsKKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldi0+cGNpLT5kZXYpOworCisJZXJyID0gc25kX2N4MjM4ODVfcGNtKGNoaXAsIDAsICJDWDIzODg1IERpZ2l0YWwiKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0cmNweShjYXJkLT5kcml2ZXIsICJDWDIzODg1Iik7CisJc3ByaW50ZihjYXJkLT5zaG9ydG5hbWUsICJDb25leGFudCBDWDIzODg1Iik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0ICVzIiwgY2FyZC0+c2hvcnRuYW1lLCBkZXYtPm5hbWUpOworCisJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlkcHJpbnRrKDAsICJyZWdpc3RlcmVkIEFMU0EgYXVkaW8gZGV2aWNlXG4iKTsKKworCXJldHVybiBjaGlwOworCitlcnJvcjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXByaW50ayhLRVJOX0VSUiAiJXMoKTogRmFpbGVkIHRvIHJlZ2lzdGVyIGFuYWxvZyAiCisJCQkiYXVkaW8gYWRhcHRlclxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBBTFNBIGRlc3RydWN0b3IKKyAqLwordm9pZCBjeDIzODg1X2F1ZGlvX3VucmVnaXN0ZXIoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCit7CisJc3RydWN0IGN4MjM4ODVfYXVkaW9fZGV2ICpjaGlwID0gZGV2LT5hdWRpb19kZXY7CisKKwlzbmRfY2FyZF9mcmVlKGNoaXAtPmNhcmQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKaW5kZXggNzZiNzU2My4uYzNjZjA4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCkBAIC0yNSw4ICsyNSw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxtZWRpYS9jeDI1ODQwLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxtaXNjL2FsdGVyYS5oPgogCi0jaW5jbHVkZSAiLi4vLi4vLi4vc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmgiCiAjaW5jbHVkZSAiY3gyMzg4NS5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgogI2luY2x1ZGUgIm5ldHVwLWVlcHJvbS5oIgpAQCAtMTA2LDEyICsxMDYsMTQgQEAKIAkJCS52bXV4ICAgPQlDWDI1ODQwX1ZJTjdfQ0gzIHwKIAkJCQkJQ1gyNTg0MF9WSU41X0NIMiB8CiAJCQkJCUNYMjU4NDBfVklOMl9DSDEsCisJCQkuYW11eCAgID0gQ1gyNTg0MF9BVURJTzgsCiAJCQkuZ3BpbzAgID0gMCwKIAkJfSwgewogCQkJLnR5cGUgICA9IENYMjM4ODVfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICA9CUNYMjU4NDBfVklON19DSDMgfAogCQkJCQlDWDI1ODQwX1ZJTjRfQ0gyIHwKIAkJCQkJQ1gyNTg0MF9WSU42X0NIMSwKKwkJCS5hbXV4ICAgPSBDWDI1ODQwX0FVRElPNywKIAkJCS5ncGlvMCAgPSAwLAogCQl9LCB7CiAJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX1NWSURFTywKQEAgLTExOSw2ICsxMjEsNyBAQAogCQkJCQlDWDI1ODQwX1ZJTjRfQ0gyIHwKIAkJCQkJQ1gyNTg0MF9WSU44X0NIMSB8CiAJCQkJCUNYMjU4NDBfU1ZJREVPX09OLAorCQkJLmFtdXggICA9IENYMjU4NDBfQVVESU83LAogCQkJLmdwaW8wICA9IDAsCiAJCX0gfSwKIAl9LApAQCAtMTUzLDcgKzE1NiwzMCBAQAogCX0sCiAJW0NYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE1MDBdID0gewogCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWLUhWUjE1MDAiLAorCQkucG9ydGEJCT0gQ1gyMzg4NV9BTkFMT0dfVklERU8sCiAJCS5wb3J0YwkJPSBDWDIzODg1X01QRUdfRFZCLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2FkZHIJPSAweDYxLCAvKiAweGMyID4+IDEgKi8KKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDIzODg1X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPQlDWDI1ODQwX1ZJTjdfQ0gzIHwKKwkJCQkJQ1gyNTg0MF9WSU41X0NIMiB8CisJCQkJCUNYMjU4NDBfVklOMl9DSDEsCisJCQkuZ3BpbzAgID0gMCwKKwkJfSwgeworCQkJLnR5cGUgICA9IENYMjM4ODVfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9CUNYMjU4NDBfVklON19DSDMgfAorCQkJCQlDWDI1ODQwX1ZJTjRfQ0gyIHwKKwkJCQkJQ1gyNTg0MF9WSU42X0NIMSwKKwkJCS5ncGlvMCAgPSAwLAorCQl9LCB7CisJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgPQlDWDI1ODQwX1ZJTjdfQ0gzIHwKKwkJCQkJQ1gyNTg0MF9WSU40X0NIMiB8CisJCQkJCUNYMjU4NDBfVklOOF9DSDEgfAorCQkJCQlDWDI1ODQwX1NWSURFT19PTiwKKwkJCS5ncGlvMCAgPSAwLAorCQl9IH0sCiAJfSwKIAlbQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIwMF0gPSB7CiAJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luVFYtSFZSMTIwMCIsCkBAIC0zODcsNiArNDEzLDMxIEBACiAJCQkJLnZtdXggICA9IENYMjU4NDBfQ09NUE9TSVRFMSwKIAkJfSB9LAogCX0sCisJW0NYMjM4ODVfQk9BUkRfTVBYODg1XSA9IHsKKwkJLm5hbWUJCT0gIk1QWC04ODUiLAorCQkucG9ydGEJCT0gQ1gyMzg4NV9BTkFMT0dfVklERU8sCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gQ1gyNTg0MF9DT01QT1NJVEUxLAorCQkJLmFtdXggICA9IENYMjU4NDBfQVVESU82LAorCQkJLmdwaW8wICA9IDAsCisJCX0sIHsKKwkJCS50eXBlICAgPSBDWDIzODg1X1ZNVVhfQ09NUE9TSVRFMiwKKwkJCS52bXV4ICAgPSBDWDI1ODQwX0NPTVBPU0lURTIsCisJCQkuYW11eCAgID0gQ1gyNTg0MF9BVURJTzYsCisJCQkuZ3BpbzAgID0gMCwKKwkJfSwgeworCQkJLnR5cGUgICA9IENYMjM4ODVfVk1VWF9DT01QT1NJVEUzLAorCQkJLnZtdXggICA9IENYMjU4NDBfQ09NUE9TSVRFMywKKwkJCS5hbXV4ICAgPSBDWDI1ODQwX0FVRElPNywKKwkJCS5ncGlvMCAgPSAwLAorCQl9LCB7CisJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX0NPTVBPU0lURTQsCisJCQkudm11eCAgID0gQ1gyNTg0MF9DT01QT1NJVEU0LAorCQkJLmFtdXggICA9IENYMjU4NDBfQVVESU83LAorCQkJLmdwaW8wICA9IDAsCisJCX0gfSwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDIzODg1X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3gyMzg4NV9ib2FyZHMpOwogCkBAIC0xNDE1LDYgKzE0NjYsOCBAQAogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYVFYxMjAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9HT1RWSUVXX1g1XzNEX0hZQlJJRDoKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE1MDA6CisJY2FzZSBDWDIzODg1X0JPQVJEX01QWDg4NToKIAkJZGV2LT5zZF9jeDI1ODQwID0gdjRsMl9pMmNfbmV3X3N1YmRldigmZGV2LT52NGwyX2RldiwKIAkJCQkmZGV2LT5pMmNfYnVzWzJdLmkyY19hZGFwLAogCQkJCSJjeDI1ODQwIiwgMHg4OCA+PiAxLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYwppbmRleCBlZTQxYTg4Li40MGU2OGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCkBAIC01NCw3ICs1NCw3IEBACiAKICNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pXAogCWRvIHsgaWYgKGRlYnVnID49IGxldmVsKVwKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzLzA6ICIgZm10LCBkZXYtPm5hbWUsICMjIGFyZyk7XAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBkZXYtPm5hbWUsICMjIGFyZyk7XAogCX0gd2hpbGUgKDApCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3gyMzg4NV9kZXZjb3VudDsKQEAgLTE1NSwxMiArMTU1LDEyIEBACiAJCS5jbnQyX3JlZwk9IERNQTVfQ05UMiwKIAl9LAogCVtTUkFNX0NIMDddID0gewotCQkubmFtZQkJPSAiY2g3IiwKLQkJLmNtZHNfc3RhcnQJPSAweDAsCi0JCS5jdHJsX3N0YXJ0CT0gMHgwLAotCQkuY2R0CQk9IDB4MCwKLQkJLmZpZm9fc3RhcnQJPSAweDAsCi0JCS5maWZvX3NpemUJPSAweDAsCisJCS5uYW1lCQk9ICJUViBBdWRpbyIsCisJCS5jbWRzX3N0YXJ0CT0gMHgxMDE5MCwKKwkJLmN0cmxfc3RhcnQJPSAweDEwNDgwLAorCQkuY2R0CQk9IDB4MTBhMDAsCisJCS5maWZvX3N0YXJ0CT0gMHg3MDAwLAorCQkuZmlmb19zaXplCT0gMHgxMDAwLAogCQkucHRyMV9yZWcJPSBETUE2X1BUUjEsCiAJCS5wdHIyX3JlZwk9IERNQTZfUFRSMiwKIAkJLmNudDFfcmVnCT0gRE1BNl9DTlQxLApAQCAtMTA4MiwxMCArMTA4MiwxMCBAQAogc3RhdGljIF9fbGUzMiAqY3gyMzg4NV9yaXNjX2ZpZWxkKF9fbGUzMiAqcnAsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAogCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHUzMiBzeW5jX2xpbmUsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGJwbCwgdW5zaWduZWQgaW50IHBhZGRpbmcsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGxpbmVzKQorCQkJICAgICAgIHVuc2lnbmVkIGludCBsaW5lcywgIHVuc2lnbmVkIGludCBscGkpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQl1bnNpZ25lZCBpbnQgbGluZSwgdG9kbzsKKwl1bnNpZ25lZCBpbnQgbGluZSwgdG9kbywgc29sOwogCiAJLyogc3luYyBpbnN0cnVjdGlvbiAqLwogCWlmIChzeW5jX2xpbmUgIT0gTk9fU1lOQ19MSU5FKQpAQCAtMTA5OCwxNiArMTA5OCwyMiBAQAogCQkJb2Zmc2V0IC09IHNnX2RtYV9sZW4oc2cpOwogCQkJc2crKzsKIAkJfQorCisJCWlmIChscGkgJiYgbGluZSA+IDAgJiYgIShsaW5lICUgbHBpKSkKKwkJCXNvbCA9IFJJU0NfU09MIHwgUklTQ19JUlExIHwgUklTQ19DTlRfSU5DOworCQllbHNlCisJCQlzb2wgPSBSSVNDX1NPTDsKKwogCQlpZiAoYnBsIDw9IHNnX2RtYV9sZW4oc2cpLW9mZnNldCkgewogCQkJLyogZml0cyBpbnRvIGN1cnJlbnQgY2h1bmsgKi8KLQkJCSoocnArKykgPSBjcHVfdG9fbGUzMihSSVNDX1dSSVRFfFJJU0NfU09MfFJJU0NfRU9MfGJwbCk7CisJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19XUklURXxzb2x8UklTQ19FT0x8YnBsKTsKIAkJCSoocnArKykgPSBjcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzZykrb2Zmc2V0KTsKIAkJCSoocnArKykgPSBjcHVfdG9fbGUzMigwKTsgLyogYml0cyA2My0zMiAqLwogCQkJb2Zmc2V0ICs9IGJwbDsKIAkJfSBlbHNlIHsKIAkJCS8qIHNjYW5saW5lIG5lZWRzIHRvIGJlIHNwbGl0ICovCiAJCQl0b2RvID0gYnBsOwotCQkJKihycCsrKSA9IGNwdV90b19sZTMyKFJJU0NfV1JJVEV8UklTQ19TT0x8CisJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19XUklURXxzb2x8CiAJCQkJCSAgICAoc2dfZG1hX2xlbihzZyktb2Zmc2V0KSk7CiAJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2cpK29mZnNldCk7CiAJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoMCk7IC8qIGJpdHMgNjMtMzIgKi8KQEAgLTExNjQsMTAgKzExNzAsMTAgQEAKIAlycCA9IHJpc2MtPmNwdTsKIAlpZiAoVU5TRVQgIT0gdG9wX29mZnNldCkKIAkJcnAgPSBjeDIzODg1X3Jpc2NfZmllbGQocnAsIHNnbGlzdCwgdG9wX29mZnNldCwgMCwKLQkJCQkJYnBsLCBwYWRkaW5nLCBsaW5lcyk7CisJCQkJCWJwbCwgcGFkZGluZywgbGluZXMsIDApOwogCWlmIChVTlNFVCAhPSBib3R0b21fb2Zmc2V0KQogCQlycCA9IGN4MjM4ODVfcmlzY19maWVsZChycCwgc2dsaXN0LCBib3R0b21fb2Zmc2V0LCAweDIwMCwKLQkJCQkJYnBsLCBwYWRkaW5nLCBsaW5lcyk7CisJCQkJCWJwbCwgcGFkZGluZywgbGluZXMsIDApOwogCiAJLyogc2F2ZSBwb2ludGVyIHRvIGptcCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCiAJcmlzYy0+am1wID0gcnA7CkBAIC0xMTc1LDExICsxMTgxLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3gyMzg4NV9yaXNjX2RhdGFidWZmZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwKK2ludCBjeDIzODg1X3Jpc2NfZGF0YWJ1ZmZlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLAogCQkJCSAgIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCiAJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCiAJCQkJICAgdW5zaWduZWQgaW50IGJwbCwKLQkJCQkgICB1bnNpZ25lZCBpbnQgbGluZXMpCisJCQkJICAgdW5zaWduZWQgaW50IGxpbmVzLCB1bnNpZ25lZCBpbnQgbHBpKQogewogCXUzMiBpbnN0cnVjdGlvbnM7CiAJX19sZTMyICpycDsKQEAgLTExOTksNyArMTIwNSw4IEBACiAKIAkvKiB3cml0ZSByaXNjIGluc3RydWN0aW9ucyAqLwogCXJwID0gcmlzYy0+Y3B1OwotCXJwID0gY3gyMzg4NV9yaXNjX2ZpZWxkKHJwLCBzZ2xpc3QsIDAsIE5PX1NZTkNfTElORSwgYnBsLCAwLCBsaW5lcyk7CisJcnAgPSBjeDIzODg1X3Jpc2NfZmllbGQocnAsIHNnbGlzdCwgMCwgTk9fU1lOQ19MSU5FLAorCQkJCWJwbCwgMCwgbGluZXMsIGxwaSk7CiAKIAkvKiBzYXZlIHBvaW50ZXIgdG8gam1wIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KIAlyaXNjLT5qbXAgPSBycDsKQEAgLTEyMDcsNiArMTIxNCw1NCBAQAogCXJldHVybiAwOwogfQogCitpbnQgY3gyMzg4NV9yaXNjX3ZiaWJ1ZmZlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIHVuc2lnbmVkIGludCB0b3Bfb2Zmc2V0LAorCQkJdW5zaWduZWQgaW50IGJvdHRvbV9vZmZzZXQsIHVuc2lnbmVkIGludCBicGwsCisJCQl1bnNpZ25lZCBpbnQgcGFkZGluZywgdW5zaWduZWQgaW50IGxpbmVzKQoreworCXUzMiBpbnN0cnVjdGlvbnMsIGZpZWxkczsKKwlfX2xlMzIgKnJwOworCWludCByYzsKKworCWZpZWxkcyA9IDA7CisJaWYgKFVOU0VUICE9IHRvcF9vZmZzZXQpCisJCWZpZWxkcysrOworCWlmIChVTlNFVCAhPSBib3R0b21fb2Zmc2V0KQorCQlmaWVsZHMrKzsKKworCS8qIGVzdGltYXRlIHJpc2MgbWVtOiB3b3JzdCBjYXNlIGlzIG9uZSB3cml0ZSBwZXIgcGFnZSBib3JkZXIgKworCSAgIG9uZSB3cml0ZSBwZXIgc2NhbiBsaW5lICsgc3luY3MgKyBqdW1wIChhbGwgMiBkd29yZHMpLiAgUGFkZGluZworCSAgIGNhbiBjYXVzZSBuZXh0IGJwbCB0byBzdGFydCBjbG9zZSB0byBhIHBhZ2UgYm9yZGVyLiAgRmlyc3QgRE1BCisJICAgcmVnaW9uIG1heSBiZSBzbWFsbGVyIHRoYW4gUEFHRV9TSVpFICovCisJLyogd3JpdGUgYW5kIGp1bXAgbmVlZCBhbmQgZXh0cmEgZHdvcmQgKi8KKwlpbnN0cnVjdGlvbnMgID0gZmllbGRzICogKDEgKyAoKGJwbCArIHBhZGRpbmcpICogbGluZXMpCisJCS8gUEFHRV9TSVpFICsgbGluZXMpOworCWluc3RydWN0aW9ucyArPSAyOworCXJjID0gYnRjeF9yaXNjbWVtX2FsbG9jKHBjaSwgcmlzYywgaW5zdHJ1Y3Rpb25zKjEyKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJLyogd3JpdGUgcmlzYyBpbnN0cnVjdGlvbnMgKi8KKwlycCA9IHJpc2MtPmNwdTsKKworCS8qIFN5bmMgdG8gbGluZSA2LCBzbyBVUyBDQyBsaW5lIDIxIHdpbGwgYXBwZWFyIGluIGxpbmUgJzEyJworCSAqIGluIHRoZSB1c2VybGFuZCB2YmkgcGF5bG9hZCAqLworCWlmIChVTlNFVCAhPSB0b3Bfb2Zmc2V0KQorCQlycCA9IGN4MjM4ODVfcmlzY19maWVsZChycCwgc2dsaXN0LCB0b3Bfb2Zmc2V0LCA2LAorCQkJCQlicGwsIHBhZGRpbmcsIGxpbmVzLCAwKTsKKworCWlmIChVTlNFVCAhPSBib3R0b21fb2Zmc2V0KQorCQlycCA9IGN4MjM4ODVfcmlzY19maWVsZChycCwgc2dsaXN0LCBib3R0b21fb2Zmc2V0LCAweDIwNywKKwkJCQkJYnBsLCBwYWRkaW5nLCBsaW5lcywgMCk7CisKKworCisJLyogc2F2ZSBwb2ludGVyIHRvIGptcCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCisJcmlzYy0+am1wID0gcnA7CisJQlVHX09OKChyaXNjLT5qbXAgLSByaXNjLT5jcHUgKyAyKSAqIHNpemVvZigqcmlzYy0+Y3B1KSA+IHJpc2MtPnNpemUpOworCXJldHVybiAwOworfQorCisKIGludCBjeDIzODg1X3Jpc2Nfc3RvcHBlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAogCQkJCXUzMiByZWcsIHUzMiBtYXNrLCB1MzIgdmFsdWUpCiB7CkBAIC0xNTE3LDcgKzE1NzIsNyBAQAogCQkJZ290byBmYWlsOwogCQljeDIzODg1X3Jpc2NfZGF0YWJ1ZmZlcihkZXYtPnBjaSwgJmJ1Zi0+cmlzYywKIAkJCQkJdmlkZW9idWZfdG9fZG1hKCZidWYtPnZiKS0+c2dsaXN0LAotCQkJCQlidWYtPnZiLndpZHRoLCBidWYtPnZiLmhlaWdodCk7CisJCQkJCWJ1Zi0+dmIud2lkdGgsIGJ1Zi0+dmIuaGVpZ2h0LCAwKTsKIAl9CiAJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOwogCXJldHVybiAwOwpAQCAtMTc0MSwxNSArMTc5NiwxOSBAQAogCXN0cnVjdCBjeDIzODg1X3RzcG9ydCAqdHMyID0gJmRldi0+dHMyOwogCXUzMiBwY2lfc3RhdHVzLCBwY2lfbWFzazsKIAl1MzIgdmlkYV9zdGF0dXMsIHZpZGFfbWFzazsKKwl1MzIgYXVkaW50X3N0YXR1cywgYXVkaW50X21hc2s7CiAJdTMyIHRzMV9zdGF0dXMsIHRzMV9tYXNrOwogCXUzMiB0czJfc3RhdHVzLCB0czJfbWFzazsKIAlpbnQgdmlkYV9jb3VudCA9IDAsIHRzMV9jb3VudCA9IDAsIHRzMl9jb3VudCA9IDAsIGhhbmRsZWQgPSAwOworCWludCBhdWRpbnRfY291bnQgPSAwOwogCWJvb2wgc3ViZGV2X2hhbmRsZWQ7CiAKIAlwY2lfc3RhdHVzID0gY3hfcmVhZChQQ0lfSU5UX1NUQVQpOwogCXBjaV9tYXNrID0gY3gyMzg4NV9pcnFfZ2V0X21hc2soZGV2KTsKIAl2aWRhX3N0YXR1cyA9IGN4X3JlYWQoVklEX0FfSU5UX1NUQVQpOwogCXZpZGFfbWFzayA9IGN4X3JlYWQoVklEX0FfSU5UX01TSyk7CisJYXVkaW50X3N0YXR1cyA9IGN4X3JlYWQoQVVESU9fSU5UX0lOVF9TVEFUKTsKKwlhdWRpbnRfbWFzayA9IGN4X3JlYWQoQVVESU9fSU5UX0lOVF9NU0spOwogCXRzMV9zdGF0dXMgPSBjeF9yZWFkKFZJRF9CX0lOVF9TVEFUKTsKIAl0czFfbWFzayA9IGN4X3JlYWQoVklEX0JfSU5UX01TSyk7CiAJdHMyX3N0YXR1cyA9IGN4X3JlYWQoVklEX0NfSU5UX1NUQVQpOwpAQCAtMTc1OSwxMiArMTgxOCwxNSBAQAogCQlnb3RvIG91dDsKIAogCXZpZGFfY291bnQgPSBjeF9yZWFkKFZJRF9BX0dQQ05UKTsKKwlhdWRpbnRfY291bnQgPSBjeF9yZWFkKEFVRF9JTlRfQV9HUENOVCk7CiAJdHMxX2NvdW50ID0gY3hfcmVhZCh0czEtPnJlZ19ncGNudCk7CiAJdHMyX2NvdW50ID0gY3hfcmVhZCh0czItPnJlZ19ncGNudCk7CiAJZHByaW50ayg3LCAicGNpX3N0YXR1czogMHglMDh4ICBwY2lfbWFzazogMHglMDh4XG4iLAogCQlwY2lfc3RhdHVzLCBwY2lfbWFzayk7CiAJZHByaW50ayg3LCAidmlkYV9zdGF0dXM6IDB4JTA4eCB2aWRhX21hc2s6IDB4JTA4eCBjb3VudDogMHgleFxuIiwKIAkJdmlkYV9zdGF0dXMsIHZpZGFfbWFzaywgdmlkYV9jb3VudCk7CisJZHByaW50ayg3LCAiYXVkaW50X3N0YXR1czogMHglMDh4IGF1ZGludF9tYXNrOiAweCUwOHggY291bnQ6IDB4JXhcbiIsCisJCWF1ZGludF9zdGF0dXMsIGF1ZGludF9tYXNrLCBhdWRpbnRfY291bnQpOwogCWRwcmludGsoNywgInRzMV9zdGF0dXM6IDB4JTA4eCAgdHMxX21hc2s6IDB4JTA4eCBjb3VudDogMHgleFxuIiwKIAkJdHMxX3N0YXR1cywgdHMxX21hc2ssIHRzMV9jb3VudCk7CiAJZHByaW50ayg3LCAidHMyX3N0YXR1czogMHglMDh4ICB0czJfbWFzazogMHglMDh4IGNvdW50OiAweCV4XG4iLApAQCAtMTg2MSw2ICsxOTIzLDkgQEAKIAlpZiAodmlkYV9zdGF0dXMpCiAJCWhhbmRsZWQgKz0gY3gyMzg4NV92aWRlb19pcnEoZGV2LCB2aWRhX3N0YXR1cyk7CiAKKwlpZiAoYXVkaW50X3N0YXR1cykKKwkJaGFuZGxlZCArPSBjeDIzODg1X2F1ZGlvX2lycShkZXYsIGF1ZGludF9zdGF0dXMsIGF1ZGludF9tYXNrKTsKKwogCWlmIChwY2lfc3RhdHVzICYgUENJX01TS19JUikgewogCQlzdWJkZXZfaGFuZGxlZCA9IGZhbHNlOwogCQl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGNvcmUsIGludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCmluZGV4IGFhODNmMDcuLmJjYjQ1YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCkBAIC04NDQsNyArODQ0LDcgQEAKIAkJCXN0YXRpYyBzdHJ1Y3QgeGMyMDI4X2N0cmwgY3RsID0gewogCQkJCS5mbmFtZSAgID0gWEMzMDI4TF9ERUZBVUxUX0ZJUk1XQVJFLAogCQkJCS5tYXhfbGVuID0gNjQsCi0JCQkJLmRlbW9kICAgPSA1MDAwLAorCQkJCS5kZW1vZCAgID0gWEMzMDI4X0ZFX0RJQkNPTTUyLAogCQkJCS8qIFRoaXMgaXMgdHJ1ZSBmb3IgYWxsIGRlbW9kcyB3aXRoCiAJCQkJCXYzNiBmaXJtd2FyZT8gKi8KIAkJCQkudHlwZSAgICA9IFhDMjAyOF9EMjYzMywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaTJjLmMKaW5kZXggMzA3ZmY1NC4uMGZmN2E5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaTJjLmMKQEAgLTI4Nyw2ICsyODcsNyBAQAogCVsweDMyID4+IDFdID0gImN4MjQyMjciLAogCVsweDg4ID4+IDFdID0gImN4MjU4MzciLAogCVsweDg0ID4+IDFdID0gInRkYTgyOTUiLAorCVsweDk4ID4+IDFdID0gImZsYXRpcm9uIiwKIAlbMHhhMCA+PiAxXSA9ICJlZXByb20iLAogCVsweGMwID4+IDFdID0gInR1bmVyL210MjEzMS90ZGE4Mjc1IiwKIAlbMHhjMiA+PiAxXSA9ICJ0dW5lci9tdDIxMzEvdGRhODI3NS94YzUwMDAveGMzMDI4IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXJlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtcmVnLmgKaW5kZXggYzg3YWM2OC4uYTk5OTM2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtcmVnLmgKQEAgLTIwMyw2ICsyMDMsNyBAQAogI2RlZmluZSBTRDJfQklBU19DVFJMCTB4MDAwMDAwMEEKICNkZWZpbmUgQU1QX0JJQVNfQ1RSTAkweDAwMDAwMDBDCiAjZGVmaW5lIENIX1BXUl9DVFJMMQkweDAwMDAwMDBFCisjZGVmaW5lIEZMRF9DSF9TRUwgICAgICAoMSA8PCAzKQogI2RlZmluZSBDSF9QV1JfQ1RSTDIJMHgwMDAwMDAwRgogI2RlZmluZSBEU01fU1RBVFVTMQkweDAwMDAwMDEwCiAjZGVmaW5lIERTTV9TVEFUVVMyCTB4MDAwMDAwMTEKQEAgLTI3MSw3ICsyNzIsOSBAQAogI2RlZmluZSBWSURfQkNfTVNLX09QQ19FUlIgKDEgPDwgMTYpCiAjZGVmaW5lIFZJRF9CQ19NU0tfU1lOQyAgICAoMSA8PCAxMikKICNkZWZpbmUgVklEX0JDX01TS19PRiAgICAgICgxIDw8ICA4KQorI2RlZmluZSBWSURfQkNfTVNLX1ZCSV9SSVNDSTIgKDEgPDwgIDUpCiAjZGVmaW5lIFZJRF9CQ19NU0tfUklTQ0kyICAoMSA8PCAgNCkKKyNkZWZpbmUgVklEX0JDX01TS19WQklfUklTQ0kxICgxIDw8ICAxKQogI2RlZmluZSBWSURfQkNfTVNLX1JJU0NJMSAgIDEKIAogI2RlZmluZSBWSURfQ19JTlRfTVNLCTB4MDAwNDAwNDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmJpLmMKaW5kZXggYzBiNjAzOC4uYTExNTRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmJpLmMKQEAgLTQxLDYgKzQxLDEyIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisjZGVmaW5lIFZCSV9MSU5FX0xFTkdUSCAxNDQwCisjZGVmaW5lIE5UU0NfVkJJX1NUQVJUX0xJTkUgMTAgICAgICAgIC8qIGxpbmUgMTAgLSAyMSAqLworI2RlZmluZSBOVFNDX1ZCSV9FTkRfTElORSAgIDIxCisjZGVmaW5lIE5UU0NfVkJJX0xJTkVTICAgICAgKE5UU0NfVkJJX0VORF9MSU5FIC0gTlRTQ19WQklfU1RBUlRfTElORSArIDEpCisKKwogaW50IGN4MjM4ODVfdmJpX2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CkBAIC00OSw0MyArNTUsODYgQEAKIAogCWlmIChkZXYtPnR2bm9ybSAmIFY0TDJfU1REXzUyNV82MCkgewogCQkvKiBudHNjICovCi0JCWYtPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSA9IDI4NjM2MzYzOworCQlmLT5mbXQudmJpLnNhbXBsZXNfcGVyX2xpbmUgPSBWQklfTElORV9MRU5HVEg7CisJCWYtPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSA9IDI3MDAwMDAwOworCQlmLT5mbXQudmJpLnNhbXBsZV9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfR1JFWTsKKwkJZi0+Zm10LnZiaS5vZmZzZXQgPSAwOworCQlmLT5mbXQudmJpLmZsYWdzID0gMDsKIAkJZi0+Zm10LnZiaS5zdGFydFswXSA9IDEwOwotCQlmLT5mbXQudmJpLnN0YXJ0WzFdID0gMjczOwotCisJCWYtPmZtdC52YmkuY291bnRbMF0gPSAxNzsKKwkJZi0+Zm10LnZiaS5zdGFydFsxXSA9IDI2MyArIDEwICsgMTsKKwkJZi0+Zm10LnZiaS5jb3VudFsxXSA9IDE3OwogCX0gZWxzZSBpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF82MjVfNTApIHsKIAkJLyogcGFsICovCiAJCWYtPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSA9IDM1NDY4OTUwOwogCQlmLT5mbXQudmJpLnN0YXJ0WzBdID0gNyAtIDE7CiAJCWYtPmZtdC52Ymkuc3RhcnRbMV0gPSAzMTkgLSAxOwogCX0KKwogCXJldHVybiAwOwogfQogCisvKiBXZSdyZSBnaXZlbiB0aGUgVmlkZW8gSW50ZXJydXB0IHN0YXR1cyByZWdpc3Rlci4KKyAqIFRoZSBjeDIzODg1X3ZpZGVvX2lycSgpIGZ1bmMgaGFzIGFscmVhZHkgdmFsaWRhdGVkCisgKiB0aGUgcG90ZW50aWFsIGVycm9yIGJpdHMsIHdlIGp1c3QgbmVlZCB0bworICogZGVhbCB3aXRoIHZiaSBwYXlsb2FkIGFuZCByZXR1cm4gaW5kaWNhdGlvbiBpZgorICogd2UgYWN0dWFsbHkgcHJvY2Vzc2VkIGFueSBwYXlsb2FkLgorICovCitpbnQgY3gyMzg4NV92YmlfaXJxKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgc3RhdHVzKQoreworCXUzMiBjb3VudDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoc3RhdHVzICYgVklEX0JDX01TS19WQklfUklTQ0kxKSB7CisJCWRwcmludGsoMSwgIiVzKCkgVklEX0JDX01TS19WQklfUklTQ0kxXG4iLCBfX2Z1bmNfXyk7CisJCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CisJCWNvdW50ID0gY3hfcmVhZChWSURfQV9HUENOVCk7CisJCWN4MjM4ODVfdmlkZW9fd2FrZXVwKGRldiwgJmRldi0+dmJpcSwgY291bnQpOworCQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CisJCWhhbmRsZWQrKzsKKwl9CisKKwlpZiAoc3RhdHVzICYgVklEX0JDX01TS19WQklfUklTQ0kyKSB7CisJCWRwcmludGsoMSwgIiVzKCkgVklEX0JDX01TS19WQklfUklTQ0kyXG4iLCBfX2Z1bmNfXyk7CisJCWRwcmludGsoMiwgInN0b3BwZXIgdmJpXG4iKTsKKwkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwkJY3gyMzg4NV9yZXN0YXJ0X3ZiaV9xdWV1ZShkZXYsICZkZXYtPnZiaXEpOworCQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CisJCWhhbmRsZWQrKzsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKwogc3RhdGljIGludCBjeDIzODg1X3N0YXJ0X3ZiaV9kbWEoc3RydWN0IGN4MjM4ODVfZGV2ICAgICpkZXYsCiAJCQkgc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEsCiAJCQkgc3RydWN0IGN4MjM4ODVfYnVmZmVyICAgKmJ1ZikKIHsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKIAkvKiBzZXR1cCBmaWZvICsgZm9ybWF0ICovCiAJY3gyMzg4NV9zcmFtX2NoYW5uZWxfc2V0dXAoZGV2LCAmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwMl0sCiAJCQkJYnVmLT52Yi53aWR0aCwgYnVmLT5yaXNjLmRtYSk7CiAKIAkvKiByZXNldCBjb3VudGVyICovCisJY3hfd3JpdGUoVklEX0FfR1BDTlRfQ1RMLCAzKTsKKwljeF93cml0ZShWSURfQV9WQklfQ1RSTCwgMyk7CisJY3hfd3JpdGUoVkJJX0FfR1BDTlRfQ1RMLCAzKTsKIAlxLT5jb3VudCA9IDE7CiAKLQkvKiBlbmFibGUgaXJxcyAqLworCS8qIGVuYWJsZSBpcnEgKi8KIAljeDIzODg1X2lycV9hZGRfZW5hYmxlKGRldiwgMHgwMSk7CiAJY3hfc2V0KFZJRF9BX0lOVF9NU0ssIDB4MDAwMDIyKTsKIAogCS8qIHN0YXJ0IGRtYSAqLwogCWN4X3NldChERVZfQ05UUkwyLCAoMTw8NSkpOwotCWN4X3NldChWSURfQV9ETUFfQ1RMLCAweDAwMDAwMDIyKTsKKwljeF9zZXQoVklEX0FfRE1BX0NUTCwgMHgyMik7IC8qIEZJRk8gYW5kIFJJU0MgZW5hYmxlICovCiAKIAlyZXR1cm4gMDsKIH0KIAogCi1zdGF0aWMgaW50IGN4MjM4ODVfcmVzdGFydF92YmlfcXVldWUoc3RydWN0IGN4MjM4ODVfZGV2ICAgICpkZXYsCitpbnQgY3gyMzg4NV9yZXN0YXJ0X3ZiaV9xdWV1ZShzdHJ1Y3QgY3gyMzg4NV9kZXYgICAgKmRldiwKIAkJCSAgICAgc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEpCiB7CiAJc3RydWN0IGN4MjM4ODVfYnVmZmVyICpidWY7CkBAIC0xMDIsNyArMTUxLDcgQEAKIAkJYnVmID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgY3gyMzg4NV9idWZmZXIsIHZiLnF1ZXVlKTsKIAkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7CiAJfQotCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7CisJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgKEJVRkZFUl9USU1FT1VUIC8gMzApKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEzLDggKzE2Miw3IEBACiAJc3RydWN0IGN4MjM4ODVfYnVmZmVyICpidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWN4MjM4ODVfc3JhbV9jaGFubmVsX2R1bXAoZGV2LCAmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwMl0pOwotCisJLyogU3RvcCB0aGUgVkJJIGVuZ2luZSAqLwogCWN4X2NsZWFyKFZJRF9BX0RNQV9DVEwsIDB4MjIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKQEAgLTEzMiw3ICsxODAsNyBAQAogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgVkJJX0xJTkVfTEVOR1RIIDIwNDgKKyNkZWZpbmUgVkJJX0xJTkVfTEVOR1RIIDE0NDAKICNkZWZpbmUgVkJJX0xJTkVfQ09VTlQgMTcKIAogc3RhdGljIGludApAQCAtMTczLDcgKzIyMSw3IEBACiAJCXJjID0gdmlkZW9idWZfaW9sb2NrKHEsICZidWYtPnZiLCBOVUxMKTsKIAkJaWYgKDAgIT0gcmMpCiAJCQlnb3RvIGZhaWw7Ci0JCWN4MjM4ODVfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCWN4MjM4ODVfcmlzY192YmlidWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCiAJCQkJIGRtYS0+c2dsaXN0LAogCQkJCSAwLCBidWYtPnZiLndpZHRoICogYnVmLT52Yi5oZWlnaHQsCiAJCQkJIGJ1Zi0+dmIud2lkdGgsIDAsCkBAIC0yMDcsNyArMjU1LDcgQEAKIAkJY3gyMzg4NV9zdGFydF92YmlfZG1hKGRldiwgcSwgYnVmKTsKIAkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKIAkJYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7Ci0JCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7CisJCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcyArIChCVUZGRVJfVElNRU9VVCAvIDMwKSk7CiAJCWRwcmludGsoMiwgIlslcC8lZF0gdmJpX3F1ZXVlIC0gZmlyc3QgYWN0aXZlXG4iLAogCQkJYnVmLCBidWYtPnZiLmkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmlkZW8uYwppbmRleCA4OTZiYjMyLi5lNzMwYjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZpZGVvLmMKQEAgLTM3LDYgKzM3LDggQEAKICNpbmNsdWRlICJjeDIzODg1LWlvY3RsLmgiCiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9jeDI1ODQwLmg+CisKIE1PRFVMRV9ERVNDUklQVElPTigidjRsMiBkcml2ZXIgbW9kdWxlIGZvciBjeDIzODg1IGJhc2VkIFRWIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC02OSwxNCArNzEsMTQgQEAKIAogI2RlZmluZSBkcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLilcCiAJZG8geyBpZiAodmlkZW9fZGVidWcgPj0gbGV2ZWwpXAotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMvMDogIiBmbXQsIGRldi0+bmFtZSwgIyMgYXJnKTtcCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQsIGRldi0+bmFtZSwgIyMgYXJnKTtcCiAJfSB3aGlsZSAoMCkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogc3RhdGljIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAjZGVmaW5lIEZPUk1BVF9GTEFHU19QQUNLRUQgICAgICAgMHgwMQotCisjaWYgMAogc3RhdGljIHN0cnVjdCBjeDIzODg1X2ZtdCBmb3JtYXRzW10gPSB7CiAJewogCQkubmFtZSAgICAgPSAiOCBicHAsIGdyYXkiLApAQCAtMTMwLDYgKzEzMiwyMyBAQAogCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAogCX0sCiB9OworI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgY3gyMzg4NV9mbXQgZm9ybWF0c1tdID0geworCXsKKyNpZiAwCisJCS5uYW1lICAgICA9ICI0OjI6MiwgcGFja2VkLCBVWVZZIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1VZVlksCisJCS5kZXB0aCAgICA9IDE2LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0sIHsKKyNlbmRpZgorCQkubmFtZSAgICAgPSAiNDoyOjIsIHBhY2tlZCwgWVVZViIsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCQkuZGVwdGggICAgPSAxNiwKKwkJLmZsYWdzICAgID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKKwl9Cit9OworI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY3gyMzg4NV9mbXQgKmZvcm1hdF9ieV9mb3VyY2ModW5zaWduZWQgaW50IGZvdXJjYykKIHsKQEAgLTEzOSw3ICsxNTgsMTIgQEAKIAkJaWYgKGZvcm1hdHNbaV0uZm91cmNjID09IGZvdXJjYykKIAkJCXJldHVybiBmb3JtYXRzK2k7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzKDB4JTA4eCkgTk9UIEZPVU5EXG4iLCBfX2Z1bmNfXywgZm91cmNjKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzKCVjJWMlYyVjKSBOT1QgRk9VTkRcbiIsIF9fZnVuY19fLAorCQkoZm91cmNjICYgMHhmZiksCisJCSgoZm91cmNjID4+IDgpICYgMHhmZiksCisJCSgoZm91cmNjID4+IDE2KSAmIDB4ZmYpLAorCQkoKGZvdXJjYyA+PiAyNCkgJiAweGZmKQorCQkpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0xNzEsNyArMTk1LDcgQEAKIAkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCiAJCQkubmFtZSAgICAgICAgICA9ICJDb250cmFzdCIsCiAJCQkubWluaW11bSAgICAgICA9IDAsCi0JCQkubWF4aW11bSAgICAgICA9IDB4ZmYsCisJCQkubWF4aW11bSAgICAgICA9IDB4N2YsCiAJCQkuc3RlcCAgICAgICAgICA9IDEsCiAJCQkuZGVmYXVsdF92YWx1ZSA9IDB4M2YsCiAJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCkBAIC0xODQsMTAgKzIwOCwxMCBAQAogCQkudiA9IHsKIAkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfSFVFLAogCQkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKLQkJCS5taW5pbXVtICAgICAgID0gMCwKLQkJCS5tYXhpbXVtICAgICAgID0gMHhmZiwKKwkJCS5taW5pbXVtICAgICAgID0gLTEyNywKKwkJCS5tYXhpbXVtICAgICAgID0gMTI4LAogCQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkJLmRlZmF1bHRfdmFsdWUgPSAweDdmLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAsCiAJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCX0sCiAJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAxMjgsCkBAIC0yMDIsOSArMjI2LDkgQEAKIAkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKIAkJCS5uYW1lICAgICAgICAgID0gIlNhdHVyYXRpb24iLAogCQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkJLm1heGltdW0gICAgICAgPSAweGZmLAorCQkJLm1heGltdW0gICAgICAgPSAweDdmLAogCQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkJLmRlZmF1bHRfdmFsdWUgPSAweDdmLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDNmLAogCQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQl9LAogCQkub2ZmICAgICAgICAgICAgICAgICAgID0gMCwKQEAgLTI1OCw4ICsyODIsOCBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyB2b2lkIGN4MjM4ODVfdmlkZW9fd2FrZXVwKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAotCQkgc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEsIHUzMiBjb3VudCkKK3ZvaWQgY3gyMzg4NV92aWRlb193YWtldXAoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEsIHUzMiBjb3VudCkKIHsKIAlzdHJ1Y3QgY3gyMzg4NV9idWZmZXIgKmJ1ZjsKIAlpbnQgYmM7CkBAIC0zOTMsNiArNDE3LDcxIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogfQogCitzdGF0aWMgaW50IGN4MjM4ODVfZmxhdGlyb25fd3JpdGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHU4IHJlZywgdTggZGF0YSkKK3sKKwkvKiA4IGJpdCByZWdpc3RlcnMsIDggYml0IHZhbHVlcyAqLworCXU4IGJ1ZltdID0geyByZWcsIGRhdGEgfTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDk4ID4+IDEsCisJCS5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSAyIH07CisKKwlyZXR1cm4gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19idXNbMl0uaTJjX2FkYXAsICZtc2csIDEpOworfQorCitzdGF0aWMgdTggY3gyMzg4NV9mbGF0aXJvbl9yZWFkKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1OCByZWcpCit7CisJLyogOCBiaXQgcmVnaXN0ZXJzLCA4IGJpdCB2YWx1ZXMgKi8KKwlpbnQgcmV0OworCXU4IGIwW10gPSB7IHJlZyB9OworCXU4IGIxW10gPSB7IDAgfTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7IC5hZGRyID0gMHg5OCA+PiAxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYjAsIC5sZW4gPSAxIH0sCisJCXsgLmFkZHIgPSAweDk4ID4+IDEsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjEsIC5sZW4gPSAxIH0KKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19idXNbMl0uaTJjX2FkYXAsICZtc2dbMF0sIDIpOworCWlmIChyZXQgIT0gMikKKwkJcHJpbnRrKEtFUk5fRVJSICIlcygpIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gYjFbMF07Cit9CisKK3N0YXRpYyB2b2lkIGN4MjM4ODVfZmxhdGlyb25fZHVtcChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKK3sKKwlpbnQgaTsKKwlkcHJpbnRrKDEsICJGbGF0aXJvbiBkdW1wXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgyNDsgaSsrKSB7CisJCWRwcmludGsoMSwgIkZJWyUwMnhdID0gJTAyeFxuIiwgaSwKKwkJCWN4MjM4ODVfZmxhdGlyb25fcmVhZChkZXYsIGkpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3gyMzg4NV9mbGF0aXJvbl9tdXgoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIGludCBpbnB1dCkKK3sKKwl1OCB2YWw7CisJZHByaW50aygxLCAiJXMoaW5wdXQgPSAlZClcbiIsIF9fZnVuY19fLCBpbnB1dCk7CisKKwlpZiAoaW5wdXQgPT0gMSkKKwkJdmFsID0gY3gyMzg4NV9mbGF0aXJvbl9yZWFkKGRldiwgQ0hfUFdSX0NUUkwxKSAmIH5GTERfQ0hfU0VMOworCWVsc2UgaWYgKGlucHV0ID09IDIpCisJCXZhbCA9IGN4MjM4ODVfZmxhdGlyb25fcmVhZChkZXYsIENIX1BXUl9DVFJMMSkgfCBGTERfQ0hfU0VMOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWwgfD0gMHgyMDsgLyogRW5hYmxlIGNsb2NrIHRvIGRlbHRhLXNpZ21hIGFuZCBkZWMgZmlsdGVyICovCisKKwljeDIzODg1X2ZsYXRpcm9uX3dyaXRlKGRldiwgQ0hfUFdSX0NUUkwxLCB2YWwpOworCisJLyogV2FrZSB1cCAqLworCWN4MjM4ODVfZmxhdGlyb25fd3JpdGUoZGV2LCBDSF9QV1JfQ1RSTDIsIDApOworCisJaWYgKHZpZGVvX2RlYnVnKQorCQljeDIzODg1X2ZsYXRpcm9uX2R1bXAoZGV2KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGN4MjM4ODVfdmlkZW9fbXV4KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCiB7CiAJZHByaW50aygxLCAiJXMoKSB2aWRlb19tdXg6ICVkIFt2bXV4PSVkLCBncGlvPTB4JXgsMHgleCwweCV4LDB4JXhdXG4iLApAQCAtNDEzLDI3ICs1MDIsNTkgQEAKIAl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfY3gyNTg0MCwgdmlkZW8sIHNfcm91dGluZywKIAkJCUlOUFVUKGlucHV0KS0+dm11eCwgMCwgMCk7CiAKKwlpZiAoKGRldi0+Ym9hcmQgPT0gQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTgwMCkgfHwKKwkJKGRldi0+Ym9hcmQgPT0gQ1gyMzg4NV9CT0FSRF9NUFg4ODUpKSB7CisJCS8qIENvbmZpZ3VyZSBhdWRpbyByb3V0aW5nICovCisJCXY0bDJfc3ViZGV2X2NhbGwoZGV2LT5zZF9jeDI1ODQwLCBhdWRpbywgc19yb3V0aW5nLAorCQkJSU5QVVQoaW5wdXQpLT5hbXV4LCAwLCAwKTsKKworCQlpZiAoSU5QVVQoaW5wdXQpLT5hbXV4ID09IENYMjU4NDBfQVVESU83KQorCQkJY3gyMzg4NV9mbGF0aXJvbl9tdXgoZGV2LCAxKTsKKwkJZWxzZSBpZiAoSU5QVVQoaW5wdXQpLT5hbXV4ID09IENYMjU4NDBfQVVESU82KQorCQkJY3gyMzg4NV9mbGF0aXJvbl9tdXgoZGV2LCAyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDIzODg1X2F1ZGlvX211eChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGlucHV0KQoreworCWRwcmludGsoMSwgIiVzKGlucHV0PSVkKVxuIiwgX19mdW5jX18sIGlucHV0KTsKKworCS8qIFRoZSBiYXNlYmFuZCB2aWRlbyBjb3JlIG9mIHRoZSBjeDIzODg1IGhhcyB0d28gYXVkaW8gaW5wdXRzLgorCSAqIExSMSBhbmQgTFIyLiBJbiBhbG1vc3QgZXZlcnkgc2luZ2xlIGNhc2Ugc28gZmFyIG9ubHkgSFZSMXh4eAorCSAqIGNhcmRzIHdlJ3ZlIG9ubHkgZXZlciBzdXBwb3J0ZWQgTFIxLiBUaW1lIHRvIHN1cHBvcnQgTFIyLAorCSAqIHdoaWNoIGlzIGF2YWlsYWJsZSB2aWEgdGhlIG9wdGlvbmFsIHdoaXRlIGJyZWFrb3V0IGhlYWRlciBvbgorCSAqIHRoZSBib2FyZC4KKwkgKiBXZSdsbCB1c2UgYSBjb3VsZCBvZiBleGlzdGluZyBlbnVtcyBpbiB0aGUgY2FyZCBzdHJ1Y3QgdG8gYWxsb3cKKwkgKiBkZXZzIHRvIHNwZWNpZnkgd2hpY2ggYmFzZWJhbmQgaW5wdXQgdGhleSBuZWVkLCBvciBqdXN0IGRlZmF1bHQKKwkgKiB0byB3aGF0IHdlJ3ZlIGFsd2F5cyB1c2VkLgorCSAqLworCWlmIChJTlBVVChpbnB1dCktPmFtdXggPT0gQ1gyNTg0MF9BVURJTzcpCisJCWN4MjM4ODVfZmxhdGlyb25fbXV4KGRldiwgMSk7CisJZWxzZSBpZiAoSU5QVVQoaW5wdXQpLT5hbXV4ID09IENYMjU4NDBfQVVESU82KQorCQljeDIzODg1X2ZsYXRpcm9uX211eChkZXYsIDIpOworCWVsc2UgeworCQkvKiBOb3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQsIGFzc3VtZSB0aGUgZGVmYXVsdC4gKi8KKwkJY3gyMzg4NV9mbGF0aXJvbl9tdXgoZGV2LCAxKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgaW50IGN4MjM4ODVfc2V0X3NjYWxlKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgd2lkdGgsCi0JdW5zaWduZWQgaW50IGhlaWdodCwgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQotewotCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBjeDIzODg1X3N0YXJ0X3ZpZGVvX2RtYShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwKIAkJCSAgIHN0cnVjdCBjeDIzODg1X2RtYXF1ZXVlICpxLAogCQkJICAgc3RydWN0IGN4MjM4ODVfYnVmZmVyICpidWYpCiB7CiAJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCisJLyogU3RvcCB0aGUgZG1hL2ZpZm8gYmVmb3JlIHdlIHRhbXBlciB3aXRoIGl0J3MgcmlzYyBwcm9ncmFtcyAqLworCWN4X2NsZWFyKFZJRF9BX0RNQV9DVEwsIDB4MTEpOworCiAJLyogc2V0dXAgZmlmbyArIGZvcm1hdCAqLwogCWN4MjM4ODVfc3JhbV9jaGFubmVsX3NldHVwKGRldiwgJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDFdLAogCQkJCWJ1Zi0+YnBsLCBidWYtPnJpc2MuZG1hKTsKLQljeDIzODg1X3NldF9zY2FsZShkZXYsIGJ1Zi0+dmIud2lkdGgsIGJ1Zi0+dmIuaGVpZ2h0LCBidWYtPnZiLmZpZWxkKTsKIAogCS8qIHJlc2V0IGNvdW50ZXIgKi8KIAljeF93cml0ZShWSURfQV9HUENOVF9DVEwsIDMpOwpAQCAtNzQ4LDcgKzg2OSw3IEBACiAJZmgtPnR5cGUgICAgID0gdHlwZTsKIAlmaC0+d2lkdGggICAgPSAzMjA7CiAJZmgtPmhlaWdodCAgID0gMjQwOwotCWZoLT5mbXQgICAgICA9IGZvcm1hdF9ieV9mb3VyY2MoVjRMMl9QSVhfRk1UX0JHUjI0KTsKKwlmaC0+Zm10ICAgICAgPSBmb3JtYXRfYnlfZm91cmNjKFY0TDJfUElYX0ZNVF9ZVVlWKTsKIAogCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmY3gyMzg4NV92aWRlb19xb3BzLAogCQkJICAgICZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5zbG9jaywKQEAgLTc1Nyw2ICs4NzgsMTQgQEAKIAkJCSAgICBzaXplb2Yoc3RydWN0IGN4MjM4ODVfYnVmZmVyKSwKIAkJCSAgICBmaCwgTlVMTCk7CiAKKwl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmJpcSwgJmN4MjM4ODVfdmJpX3FvcHMsCisJCSZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5zbG9jaywKKwkJVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwKKwkJVjRMMl9GSUVMRF9TRVFfVEIsCisJCXNpemVvZihzdHJ1Y3QgY3gyMzg4NV9idWZmZXIpLAorCQlmaCwgTlVMTCk7CisKKwogCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKIAogCXJldHVybiAwOwpAQCAtODg0LDggKzEwMTMsOSBAQAogc3RhdGljIGludCBjeDIzODg1X3NldF9jb250cm9sKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAogCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKIHsKLQlkcHJpbnRrKDEsICIlcygpIGNhbGxpbmcgY3gyNTg0MChWSURJT0NfU19DVFJMKSIKLQkJIiAoZGlzYWJsZWQgLSBubyBhY3Rpb24pXG4iLCBfX2Z1bmNfXyk7CisJZHByaW50aygxLCAiJXMoKSBjYWxsaW5nIGN4MjU4NDAoVklESU9DX1NfQ1RSTClcbiIsIF9fZnVuY19fKTsKKwljYWxsX2FsbChkZXYsIGNvcmUsIHNfY3RybCwgY3RsKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMDU5LDEzICsxMTg5LDIyIEBACiAJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKQorCWlmICgoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSAmJgorCQkoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodW5saWtlbHkoIXJlc19nZXQoZGV2LCBmaCwgZ2V0X3Jlc291cmNlKGZoKSkpKQogCQlyZXR1cm4gLUVCVVNZOworCisJLyogRG9uJ3Qgc3RhcnQgVkJJIHN0cmVhbWluZyB1bmxlc3MgdmlkYSBzdHJlYW1pbmcKKwkgKiBoYXMgYWxyZWFkeSBzdGFydGVkLgorCSAqLworCWlmICgoZmgtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkgJiYKKwkJKChjeF9yZWFkKFZJRF9BX0RNQV9DVEwpICYgMHgxMSkgPT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwogfQogCkBAIC0xMDc2LDcgKzEyMTUsOCBAQAogCWludCBlcnIsIHJlczsKIAlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCWlmICgoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSAmJgorCQkoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChpICE9IGZoLT50eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExMTksNyArMTI1OSw3IEBACiAJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJbiA9IGktPmluZGV4OwotCWlmIChuID49IDQpCisJaWYgKG4gPj0gTUFYX0NYMjM4ODVfSU5QVVQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKDAgPT0gSU5QVVQobiktPnR5cGUpCkBAIC0xMTMzLDYgKzEyNzMsMTEgQEAKIAkJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKIAkJaS0+c3RkID0gQ1gyMzg4NV9OT1JNUzsKIAl9CisKKwkvKiBUd28gc2VsZWN0YWJsZSBhdWRpbyBpbnB1dHMgZm9yIG5vbi10diBpbnB1dHMgKi8KKwlpZiAoSU5QVVQobiktPnR5cGUgIT0gQ1gyMzg4NV9WTVVYX1RFTEVWSVNJT04pCisJCWktPmF1ZGlvc2V0ID0gMHgzOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNTksMTMgKzEzMDQsMjAgQEAKIAogCWRwcmludGsoMSwgIiVzKCVkKVxuIiwgX19mdW5jX18sIGkpOwogCi0JaWYgKGkgPj0gNCkgeworCWlmIChpID49IE1BWF9DWDIzODg1X0lOUFVUKSB7CiAJCWRwcmludGsoMSwgIiVzKCkgLUVJTlZBTFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoSU5QVVQoaSktPnR5cGUgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCWN4MjM4ODVfdmlkZW9fbXV4KGRldiwgaSk7CisKKwkvKiBCeSBkZWZhdWx0IGVzdGFibGlzaCB0aGUgZGVmYXVsdCBhdWRpbyBpbnB1dCBmb3IgdGhlIGNhcmQgYWxzbyAqLworCS8qIENhbGxlciBpcyBmcmVlIHRvIHVzZSBWSURJT0NfU19BVURJTyB0byBvdmVycmlkZSBhZnRlcndhcmRzICovCisJY3gyMzg4NV9hdWRpb19tdXgoZGV2LCBpKTsKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMTg1LDYgKzEzMzcsNjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjeDIzODg1X3F1ZXJ5X2F1ZGlucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCXN0cnVjdCB2NGwyX2F1ZGlvICppKQoreworCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyMzg4NV9maCAqKXByaXYpLT5kZXY7CisJc3RhdGljIGNvbnN0IGNoYXIgKmluYW1lW10gPSB7CisJCVswXSA9ICJCYXNlYmFuZCBML1IgMSIsCisJCVsxXSA9ICJCYXNlYmFuZCBML1IgMiIsCisJfTsKKwl1bnNpZ25lZCBpbnQgbjsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwluID0gaS0+aW5kZXg7CisJaWYgKG4gPj0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoaSwgMCwgc2l6ZW9mKCppKSk7CisJaS0+aW5kZXggPSBuOworCXN0cmNweShpLT5uYW1lLCBpbmFtZVtuXSk7CisJaS0+Y2FwYWJpbGl0eSAgPSBWNEwyX0FVRENBUF9TVEVSRU87CisJaS0+bW9kZSAgPSBWNEwyX0FVRE1PREVfQVZMOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fYXVkaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmkpCit7CisJcmV0dXJuIGN4MjM4ODVfcXVlcnlfYXVkaW5wdXQoZmlsZSwgcHJpdiwgaSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJc3RydWN0IHY0bDJfYXVkaW8gKmkpCit7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDIzODg1X2ZoICopcHJpdiktPmRldjsKKworCWktPmluZGV4ID0gZGV2LT5hdWRpbnB1dDsKKwlkcHJpbnRrKDEsICIlcyhpbnB1dD0lZClcbiIsIF9fZnVuY19fLCBpLT5pbmRleCk7CisKKwlyZXR1cm4gY3gyMzg4NV9xdWVyeV9hdWRpbnB1dChmaWxlLCBwcml2LCBpKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwlzdHJ1Y3QgdjRsMl9hdWRpbyAqaSkKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjM4ODVfZmggKilwcml2KS0+ZGV2OworCWlmIChpLT5pbmRleCA+PSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRwcmludGsoMSwgIiVzKCVkKVxuIiwgX19mdW5jX18sIGktPmluZGV4KTsKKworCWRldi0+YXVkaW5wdXQgPSBpLT5pbmRleDsKKworCS8qIFNraXAgdGhlIGF1ZGlvIGRlZmF1bHRzIGZyb20gdGhlIGNhcmRzIHN0cnVjdCwgY2FsbGVyIHdhbnRzCisJICogZGlyZWN0bHkgdG91Y2ggdGhlIGF1ZGlvIG11eCBoYXJkd2FyZS4gKi8KKwljeDIzODg1X2ZsYXRpcm9uX211eChkZXYsIGRldi0+YXVkaW5wdXQgKyAxKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCiB7CkBAIC0xMjIxLDEwICsxNDMxLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzdHJjcHkodC0+bmFtZSwgIlRlbGV2aXNpb24iKTsKLQl0LT50eXBlICAgICAgID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JdC0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX05PUk07Ci0JdC0+cmFuZ2VoaWdoICA9IDB4ZmZmZmZmZmZVTDsKLQl0LT5zaWduYWwgPSAweGZmZmYgOyAvKiBMT0NLRUQgKi8KKworCWNhbGxfYWxsKGRldiwgdHVuZXIsIGdfdHVuZXIsIHQpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjM3LDYgKzE0NDUsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoMCAhPSB0LT5pbmRleCkKIAkJcmV0dXJuIC1FSU5WQUw7CisJLyogVXBkYXRlIHRoZSBBL1YgY29yZSAqLworCWNhbGxfYWxsKGRldiwgdHVuZXIsIHNfdHVuZXIsIHQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMDIsMTAgKzE1MTMsNiBAQAogCXN0cnVjdCBjeDIzODg1X2J1ZmZlciAqYnVmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQljeDIzODg1X3NyYW1fY2hhbm5lbF9kdW1wKGRldiwgJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDFdKTsKLQotCWN4X2NsZWFyKFZJRF9BX0RNQV9DVEwsIDB4MTEpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKIAkJYnVmID0gbGlzdF9lbnRyeShxLT5hY3RpdmUubmV4dCwKQEAgLTEzMTMsNyArMTUyMCw3IEBACiAJCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKIAkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0VSUk9SOwogCQl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOwotCQlwcmludGsoS0VSTl9FUlIgIiVzLzA6IFslcC8lZF0gdGltZW91dCAtIGRtYT0weCUwOGx4XG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBbJXAvJWRdIHRpbWVvdXQgLSBkbWE9MHglMDhseFxuIiwKIAkJCWRldi0+bmFtZSwgYnVmLCBidWYtPnZiLmksCiAJCQkodW5zaWduZWQgbG9uZylidWYtPnJpc2MuZG1hKTsKIAl9CkBAIC0xMzI5LDI3ICsxNTM2LDQzIEBACiAJbWFzayAgID0gY3hfcmVhZChWSURfQV9JTlRfTVNLKTsKIAlpZiAoMCA9PSAoc3RhdHVzICYgbWFzaykpCiAJCXJldHVybiBoYW5kbGVkOworCiAJY3hfd3JpdGUoVklEX0FfSU5UX1NUQVQsIHN0YXR1cyk7CiAKLQlkcHJpbnRrKDIsICIlcygpIHN0YXR1cyA9IDB4JTA4eFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0JLyogcmlzYyBvcCBjb2RlIGVycm9yICovCi0JaWYgKHN0YXR1cyAmICgxIDw8IDE2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy8wOiB2aWRlbyByaXNjIG9wIGNvZGUgZXJyb3JcbiIsCi0JCQlkZXYtPm5hbWUpOwotCQljeF9jbGVhcihWSURfQV9ETUFfQ1RMLCAweDExKTsKLQkJY3gyMzg4NV9zcmFtX2NoYW5uZWxfZHVtcChkZXYsICZkZXYtPnNyYW1fY2hhbm5lbHNbU1JBTV9DSDAxXSk7CisJLyogcmlzYyBvcCBjb2RlIGVycm9yLCBmaWZvIG92ZXJmbG93IG9yIGxpbmUgc3luYyBkZXRlY3Rpb24gZXJyb3IgKi8KKwlpZiAoKHN0YXR1cyAmIFZJRF9CQ19NU0tfT1BDX0VSUikgfHwKKwkJKHN0YXR1cyAmIFZJRF9CQ19NU0tfU1lOQykgfHwKKwkJKHN0YXR1cyAmIFZJRF9CQ19NU0tfT0YpKSB7CisKKwkJaWYgKHN0YXR1cyAmIFZJRF9CQ19NU0tfT1BDX0VSUikgeworCQkJZHByaW50ayg3LCAiIChWSURfQkNfTVNLX09QQ19FUlIgMHglMDh4KVxuIiwKKwkJCQlWSURfQkNfTVNLX09QQ19FUlIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHZpZGVvIHJpc2Mgb3AgY29kZSBlcnJvclxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJY3gyMzg4NV9zcmFtX2NoYW5uZWxfZHVtcChkZXYsCisJCQkJJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDFdKTsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBWSURfQkNfTVNLX1NZTkMpCisJCQlkcHJpbnRrKDcsICIgKFZJRF9CQ19NU0tfU1lOQyAweCUwOHgpICIKKwkJCQkidmlkZW8gbGluZXMgbWlzcy1tYXRjaFxuIiwKKwkJCQlWSURfQkNfTVNLX1NZTkMpOworCisJCWlmIChzdGF0dXMgJiBWSURfQkNfTVNLX09GKQorCQkJZHByaW50ayg3LCAiIChWSURfQkNfTVNLX09GIDB4JTA4eCkgZmlmbyBvdmVyZmxvd1xuIiwKKwkJCQlWSURfQkNfTVNLX09GKTsKKwogCX0KIAotCS8qIHJpc2MxIHkgKi8KLQlpZiAoc3RhdHVzICYgMHgwMSkgeworCS8qIFZpZGVvICovCisJaWYgKHN0YXR1cyAmIFZJRF9CQ19NU0tfUklTQ0kxKSB7CiAJCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CiAJCWNvdW50ID0gY3hfcmVhZChWSURfQV9HUENOVCk7CiAJCWN4MjM4ODVfdmlkZW9fd2FrZXVwKGRldiwgJmRldi0+dmlkcSwgY291bnQpOwogCQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CiAJCWhhbmRsZWQrKzsKIAl9Ci0JLyogcmlzYzIgeSAqLwotCWlmIChzdGF0dXMgJiAweDEwKSB7CisJaWYgKHN0YXR1cyAmIFZJRF9CQ19NU0tfUklTQ0kyKSB7CiAJCWRwcmludGsoMiwgInN0b3BwZXIgdmlkZW9cbiIpOwogCQlzcGluX2xvY2soJmRldi0+c2xvY2spOwogCQljeDIzODg1X3Jlc3RhcnRfdmlkZW9fcXVldWUoZGV2LCAmZGV2LT52aWRxKTsKQEAgLTEzNTcsNiArMTU4MCw5IEBACiAJCWhhbmRsZWQrKzsKIAl9CiAKKwkvKiBBbGxvdyB0aGUgVkJJIGZyYW1ld29yayB0byBwcm9jZXNzIGl0J3MgcGF5bG9hZCAqLworCWhhbmRsZWQgKz0gY3gyMzg4NV92YmlfaXJxKGRldiwgc3RhdHVzKTsKKwogCXJldHVybiBoYW5kbGVkOwogfQogCkBAIC0xNDA1LDYgKzE2MzEsOSBAQAogCS52aWRpb2NfZ19yZWdpc3RlciAgICA9IGN4MjM4ODVfZ19yZWdpc3RlciwKIAkudmlkaW9jX3NfcmVnaXN0ZXIgICAgPSBjeDIzODg1X3NfcmVnaXN0ZXIsCiAjZW5kaWYKKwkudmlkaW9jX2VudW1hdWRpbyAgICAgPSB2aWRpb2NfZW51bV9hdWRpbnB1dCwKKwkudmlkaW9jX2dfYXVkaW8gICAgICAgPSB2aWRpb2NfZ19hdWRpbnB1dCwKKwkudmlkaW9jX3NfYXVkaW8gICAgICAgPSB2aWRpb2Nfc19hdWRpbnB1dCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjM4ODVfdmJpX3RlbXBsYXRlOwpAQCAtMTQyOSw2ICsxNjU4LDE0IEBACiAJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCWN4MjM4ODVfaXJxX3JlbW92ZShkZXYsIDB4MDEpOwogCisJaWYgKGRldi0+dmJpX2RldikgeworCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPnZiaV9kZXYpKQorCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT52YmlfZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT52YmlfZGV2KTsKKwkJZGV2LT52YmlfZGV2ID0gTlVMTDsKKwkJYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksICZkZXYtPnZiaXEuc3RvcHBlcik7CisJfQogCWlmIChkZXYtPnZpZGVvX2RldikgewogCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPnZpZGVvX2RldikpCiAJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnZpZGVvX2Rldik7CkBAIC0xNDM4LDYgKzE2NzUsOSBAQAogCiAJCWJ0Y3hfcmlzY21lbV9mcmVlKGRldi0+cGNpLCAmZGV2LT52aWRxLnN0b3BwZXIpOwogCX0KKworCWlmIChkZXYtPmF1ZGlvX2RldikKKwkJY3gyMzg4NV9hdWRpb191bnJlZ2lzdGVyKGRldik7CiB9CiAKIGludCBjeDIzODg1X3ZpZGVvX3JlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQpAQCAtMTQ2Myw3ICsxNzAzLDE0IEBACiAJY3gyMzg4NV9yaXNjX3N0b3BwZXIoZGV2LT5wY2ksICZkZXYtPnZpZHEuc3RvcHBlciwKIAkJVklEX0FfRE1BX0NUTCwgMHgxMSwgMHgwMCk7CiAKLQkvKiBEb24ndCBlbmFibGUgVkJJIHlldCAqLworCS8qIGluaXQgdmJpIGRtYSBxdWV1ZXMgKi8KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52YmlxLmFjdGl2ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJpcS5xdWV1ZWQpOworCWRldi0+dmJpcS50aW1lb3V0LmZ1bmN0aW9uID0gY3gyMzg4NV92YmlfdGltZW91dDsKKwlkZXYtPnZiaXEudGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWluaXRfdGltZXIoJmRldi0+dmJpcS50aW1lb3V0KTsKKwljeDIzODg1X3Jpc2Nfc3RvcHBlcihkZXYtPnBjaSwgJmRldi0+dmJpcS5zdG9wcGVyLAorCQlWSURfQV9ETUFfQ1RMLCAweDIyLCAweDAwKTsKIAogCWN4MjM4ODVfaXJxX2FkZF9lbmFibGUoZGV2LCAweDAxKTsKIApAQCAtMTUwNCw4ICsxNzUxLDcgQEAKIAkJfQogCX0KIAotCi0JLyogcmVnaXN0ZXIgdjRsIGRldmljZXMgKi8KKwkvKiByZWdpc3RlciBWaWRlbyBkZXZpY2UgKi8KIAlkZXYtPnZpZGVvX2RldiA9IGN4MjM4ODVfdmRldl9pbml0KGRldiwgZGV2LT5wY2ksCiAJCSZjeDIzODg1X3ZpZGVvX3RlbXBsYXRlLCAidmlkZW8iKTsKIAllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT52aWRlb19kZXYsIFZGTF9UWVBFX0dSQUJCRVIsCkBAIC0xNTE1LDEzICsxNzYxLDMxIEBACiAJCQlkZXYtPm5hbWUpOwogCQlnb3RvIGZhaWxfdW5yZWc7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIiVzLzA6IHJlZ2lzdGVyZWQgZGV2aWNlICVzIFt2NGwyXVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgJXMgW3Y0bDJdXG4iLAogCSAgICAgICBkZXYtPm5hbWUsIHZpZGVvX2RldmljZV9ub2RlX25hbWUoZGV2LT52aWRlb19kZXYpKTsKKworCS8qIHJlZ2lzdGVyIFZCSSBkZXZpY2UgKi8KKwlkZXYtPnZiaV9kZXYgPSBjeDIzODg1X3ZkZXZfaW5pdChkZXYsIGRldi0+cGNpLAorCQkmY3gyMzg4NV92YmlfdGVtcGxhdGUsICJ2YmkiKTsKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT52YmlfZGV2LCBWRkxfVFlQRV9WQkksCisJCQkJICAgIHZiaV9ucltkZXYtPm5yXSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IHJlZ2lzdGVyIHZiaSBkZXZpY2VcbiIsCisJCQlkZXYtPm5hbWUpOworCQlnb3RvIGZhaWxfdW5yZWc7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWdpc3RlcmVkIGRldmljZSAlc1xuIiwKKwkgICAgICAgZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+dmJpX2RldikpOworCisJLyogUmVnaXN0ZXIgQUxTQSBhdWRpbyBkZXZpY2UgKi8KKwlkZXYtPmF1ZGlvX2RldiA9IGN4MjM4ODVfYXVkaW9fcmVnaXN0ZXIoZGV2KTsKKwogCS8qIGluaXRpYWwgZGV2aWNlIGNvbmZpZ3VyYXRpb24gKi8KIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCWN4MjM4ODVfc2V0X3R2bm9ybShkZXYsIGRldi0+dHZub3JtKTsKIAlpbml0X2NvbnRyb2xzKGRldik7CiAJY3gyMzg4NV92aWRlb19tdXgoZGV2LCAwKTsKKwljeDIzODg1X2F1ZGlvX211eChkZXYsIDApOwogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKaW5kZXggZDg2YmMwYi4uYjQ5MDM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oCkBAIC04Niw2ICs4Niw3IEBACiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfR09UVklFV19YNV8zRF9IWUJSSUQgICAgIDI5CiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfTkVUVVBfRFVBTF9EVkJfVF9DX0NJX1JGIDMwCiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMCAzMQorI2RlZmluZSBDWDIzODg1X0JPQVJEX01QWDg4NSAgICAgICAgICAgICAgICAgICAzMgogCiAjZGVmaW5lIEdQSU9fMCAweDAwMDAwMDAxCiAjZGVmaW5lIEdQSU9fMSAweDAwMDAwMDAyCkBAIC0xOTIsNiArMTkzLDcgQEAKIHN0cnVjdCBjeDIzODg1X2lucHV0IHsKIAllbnVtIGN4MjM4ODVfaXR5cGUgdHlwZTsKIAl1bnNpZ25lZCBpbnQgICAgdm11eDsKKwl1bnNpZ25lZCBpbnQgICAgYW11eDsKIAl1MzIgICAgICAgICAgICAgZ3BpbzAsIGdwaW8xLCBncGlvMiwgZ3BpbzM7CiB9OwogCkBAIC0zMTgsNiArMzIwLDM0IEBACiAJc3RydWN0IHJjX2RldgkJKnJjOwogfTsKIAorc3RydWN0IGN4MjM4ODVfYXVkaW9fYnVmZmVyIHsKKwl1bnNpZ25lZCBpbnQJCWJwbDsKKwlzdHJ1Y3QgYnRjeF9yaXNjbWVtCXJpc2M7CisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZglkbWE7Cit9OworCitzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgeworCXN0cnVjdCBjeDIzODg1X2RldgkqZGV2OworCisJc3RydWN0IHBjaV9kZXYJCSpwY2k7CisKKwlzdHJ1Y3Qgc25kX2NhcmQJCSpjYXJkOworCisJc3BpbmxvY2tfdAkJbG9jazsKKworCWF0b21pY190CQljb3VudDsKKworCXVuc2lnbmVkIGludAkJZG1hX3NpemU7CisJdW5zaWduZWQgaW50CQlwZXJpb2Rfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCW51bV9wZXJpb2RzOworCisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZgkqZG1hX3Jpc2M7CisKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19idWZmZXIgICAqYnVmOworCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Cit9OworCiBzdHJ1Y3QgY3gyMzg4NV9kZXYgewogCWF0b21pY190ICAgICAgICAgICAgICAgICAgIHJlZmNvdW50OwogCXN0cnVjdCB2NGwyX2RldmljZSAJICAgdjRsMl9kZXY7CkBAIC0zNjIsNiArMzkyLDcgQEAKIAkvKiBBbmFsb2cgdmlkZW8gKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXM7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaW5wdXQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgYXVkaW5wdXQ7IC8qIFNlbGVjdGFibGUgYXVkaW8gaW5wdXQgKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICB0dmF1ZGlvOwogCXY0bDJfc3RkX2lkICAgICAgICAgICAgICAgIHR2bm9ybTsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICB0dW5lcl90eXBlOwpAQCAtNDAwLDYgKzQzMSw5IEBACiAJYXRvbWljX3QgICAgICAgICAgICAgICAgICAgdjRsX3JlYWRlcl9jb3VudDsKIAlzdHJ1Y3QgY3gyMzg4NV90dm5vcm0gICAgICBlbmNvZGVybm9ybTsKIAorCS8qIEFuYWxvZyByYXcgYXVkaW8gKi8KKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgICAqYXVkaW9fZGV2OworCiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjeDIzODg1X2RldiAqdG9fY3gyMzg4NShzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KQpAQCAtNDc4LDYgKzUxMiwxMSBAQAogCXVuc2lnbmVkIGludCB0b3Bfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgYm90dG9tX29mZnNldCwKIAl1bnNpZ25lZCBpbnQgYnBsLCB1bnNpZ25lZCBpbnQgcGFkZGluZywgdW5zaWduZWQgaW50IGxpbmVzKTsKIAorZXh0ZXJuIGludCBjeDIzODg1X3Jpc2NfdmJpYnVmZmVyKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJc3RydWN0IGJ0Y3hfcmlzY21lbSAqcmlzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJdW5zaWduZWQgaW50IHRvcF9vZmZzZXQsIHVuc2lnbmVkIGludCBib3R0b21fb2Zmc2V0LAorCXVuc2lnbmVkIGludCBicGwsIHVuc2lnbmVkIGludCBwYWRkaW5nLCB1bnNpZ25lZCBpbnQgbGluZXMpOworCiB2b2lkIGN4MjM4ODVfY2FuY2VsX2J1ZmZlcnMoc3RydWN0IGN4MjM4ODVfdHNwb3J0ICpwb3J0KTsKIAogZXh0ZXJuIGludCBjeDIzODg1X3Jlc3RhcnRfcXVldWUoc3RydWN0IGN4MjM4ODVfdHNwb3J0ICpwb3J0LApAQCAtNTMzLDYgKzU3Miw4IEBACiBleHRlcm4gaW50IGN4MjM4ODVfdmlkZW9fcmVnaXN0ZXIoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgY3gyMzg4NV92aWRlb191bnJlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KTsKIGV4dGVybiBpbnQgY3gyMzg4NV92aWRlb19pcnEoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBzdGF0dXMpOworZXh0ZXJuIHZvaWQgY3gyMzg4NV92aWRlb193YWtldXAoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEsIHUzMiBjb3VudCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBjeDIzODg1LXZiaS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQwLDYgKzU4MSw5IEBACiAJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKIGV4dGVybiB2b2lkIGN4MjM4ODVfdmJpX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKIGV4dGVybiBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjM4ODVfdmJpX3FvcHM7CitleHRlcm4gaW50IGN4MjM4ODVfcmVzdGFydF92YmlfcXVldWUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEpOworZXh0ZXJuIGludCBjeDIzODg1X3ZiaV9pcnEoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBzdGF0dXMpOwogCiAvKiBjeDIzODg1LWkyYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIGV4dGVybiBpbnQgY3gyMzg4NV9pMmNfcmVnaXN0ZXIoc3RydWN0IGN4MjM4ODVfaTJjICpidXMpOwpAQCAtNTYzLDYgKzYwNywxOCBAQAogZXh0ZXJuIHZvaWQgbWM0MTdfZ3Bpb19jbGVhcihzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIG1hc2spOwogZXh0ZXJuIHZvaWQgbWM0MTdfZ3Bpb19lbmFibGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBtYXNrLCBpbnQgYXNvdXRwdXQpOwogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogY3gyMzg4NS1hbHNhLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworZXh0ZXJuIHN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY3gyMzg4NV9hdWRpb19yZWdpc3RlcigKKwkJCQkJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgY3gyMzg4NV9hdWRpb191bnJlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KTsKK2V4dGVybiBpbnQgY3gyMzg4NV9hdWRpb19pcnEoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBzdGF0dXMsIHUzMiBtYXNrKTsKK2V4dGVybiBpbnQgY3gyMzg4NV9yaXNjX2RhdGFidWZmZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkJCSAgIHVuc2lnbmVkIGludCBicGwsCisJCQkJICAgdW5zaWduZWQgaW50IGxpbmVzLAorCQkJCSAgIHVuc2lnbmVkIGludCBscGkpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogdHYgbm9ybXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg4LWlyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4OC1pci5jCmluZGV4IGUzN2JlNmYuLmJiMWNlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg4LWlyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODgtaXIuYwpAQCAtNjczLDcgKzY3Myw3IEBACiAKIAl1bnNpZ25lZCBpbnQgaSwgbjsKIAl1bmlvbiBjeDIzODg4X2lyX2ZpZm9fcmVjICpwOwotCXVuc2lnbmVkIHUsIHY7CisJdW5zaWduZWQgdSwgdiwgdzsKIAogCW4gPSBjb3VudCAvIHNpemVvZih1bmlvbiBjeDIzODg4X2lyX2ZpZm9fcmVjKQogCQkqIHNpemVvZih1bmlvbiBjeDIzODg4X2lyX2ZpZm9fcmVjKTsKQEAgLTY5MiwxMSArNjkyLDEyIEBACiAJCWlmICgocC0+aHdfZmlmb19kYXRhICYgRklGT19SWFRYX1JUTykgPT0gRklGT19SWFRYX1JUTykgewogCQkJLyogQXNzdW1lIFJUTyB3YXMgYmVjYXVzZSBvZiBubyBJUiBsaWdodCBpbnB1dCAqLwogCQkJdSA9IDA7Ci0JCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogZW5kIG9mIHJ4XG4iKTsKKwkJCXcgPSAxOwogCQl9IGVsc2UgewogCQkJdSA9IChwLT5od19maWZvX2RhdGEgJiBGSUZPX1JYVFhfTFZMKSA/IDEgOiAwOwogCQkJaWYgKGludmVydCkKIAkJCQl1ID0gdSA/IDAgOiAxOworCQkJdyA9IDA7CiAJCX0KIAogCQl2ID0gKHVuc2lnbmVkKSBwdWxzZV93aWR0aF9jb3VudF90b19ucygKQEAgLTcwNyw5ICs3MDgsMTIgQEAKIAkJaW5pdF9pcl9yYXdfZXZlbnQoJnAtPmlyX2NvcmVfZGF0YSk7CiAJCXAtPmlyX2NvcmVfZGF0YS5wdWxzZSA9IHU7CiAJCXAtPmlyX2NvcmVfZGF0YS5kdXJhdGlvbiA9IHY7CisJCXAtPmlyX2NvcmVfZGF0YS50aW1lb3V0ID0gdzsKIAotCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogJTEwdSBucyAgJXNcbiIsCi0JCQkgdiwgdSA/ICJtYXJrIiA6ICJzcGFjZSIpOworCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogJTEwdSBucyAgJXMgICVzXG4iLAorCQkJIHYsIHUgPyAibWFyayIgOiAic3BhY2UiLCB3ID8gIih0aW1lZCBvdXQpIiA6ICIiKTsKKwkJaWYgKHcpCisJCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogZW5kIG9mIHJ4XG4iKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL0tjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9LY29uZmlnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvTWFrZWZpbGUKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLXVwc3RyZWFtLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uYwpyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1hdWRpby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmgKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYmlmZnVuY3MuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWJpZmZ1bmNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYmlmZnVuY3MuaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtYmlmZnVuY3MuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtY2FyZHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jYXJkcy5jCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1jYXJkcy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWNvcmUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWNvcmUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtZ3Bpby5jCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1pMmMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1pMmMuYwpyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtaTJjLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLWRlZmluZXMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLW1lZHVzYS1kZWZpbmVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLWRlZmluZXMuaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLWRlZmluZXMuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtcmVnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXJlZy5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtcmVnLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uYwpyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1yZWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1yZWcuaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtcmVnLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtc3JhbS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtc3JhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXNyYW0uaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtc3JhbS5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmgKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2OTA3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLmMKQEAgLTAsMCArMSwyMDEyIEBACisvKgorICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjU4MjEgUENJZSBicmlkZ2UKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IENvbmV4YW50IFN5c3RlbXMgSW5jLgorICogIEF1dGhvcnMgIDxzaHUubGluQGNvbmV4YW50LmNvbT4sIDxoaWVwLmh1eW5oQGNvbmV4YW50LmNvbT4KKyAqICBCYXNlZCBvbiBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+IGN4MjM4ODUgZHJpdmVyCisgKiAgUGFydHMgYWRhcHRlZC90YWtlbiBmcm9tIEVkdWFyZG8gTW9zY29zbyBSdWJpbm8KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgRWR1YXJkbyBNb3Njb3NvIFJ1YmlubyA8bW9zY29zb0BUb3BvTG9naWNhLmNvbT4KKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSAiY3gyNTgyMS12aWRlby5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oInY0bDIgZHJpdmVyIG1vZHVsZSBmb3IgY3gyNTgyMSBiYXNlZCBUViBjYXJkcyIpOworTU9EVUxFX0FVVEhPUigiSGllcCBIdXluaCA8aGllcC5odXluaEBjb25leGFudC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fbnJbXSA9IHtbMCAuLi4gKENYMjU4MjFfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmFkaW9fbnJbXSA9IHtbMCAuLi4gKENYMjU4MjFfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHZpZGVvX25yLCBpbnQsIE5VTEwsIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KHJhZGlvX25yLCBpbnQsIE5VTEwsIDA0NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAidmlkZW8gZGV2aWNlIG51bWJlcnMiKTsKK01PRFVMRV9QQVJNX0RFU0MocmFkaW9fbnIsICJyYWRpbyBkZXZpY2UgbnVtYmVycyIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX2RlYnVnID0gVklERU9fREVCVUc7Cittb2R1bGVfcGFyYW0odmlkZW9fZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX2RlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFt2aWRlb10iKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBpcnFfZGVidWc7Cittb2R1bGVfcGFyYW0oaXJxX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpcnFfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW0lSUSBoYW5kbGVyXSIpOworCit1bnNpZ25lZCBpbnQgdmlkX2xpbWl0ID0gMTY7Cittb2R1bGVfcGFyYW0odmlkX2xpbWl0LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh2aWRfbGltaXQsICJjYXB0dXJlIG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMiKTsKKworc3RhdGljIHZvaWQgY3gyNTgyMV9pbml0X2NvbnRyb2xzKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbl9udW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wczsKKworI2RlZmluZSBGT1JNQVRfRkxBR1NfUEFDS0VEICAgICAgIDB4MDEKKworc3RydWN0IGN4MjU4MjFfZm10IGZvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lID0gIjggYnBwLCBncmF5IiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9HUkVZLAorCQkuZGVwdGggPSA4LAorCQkuZmxhZ3MgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCSB9LCB7CisJCS5uYW1lID0gIjQ6MToxLCBwYWNrZWQsIFk0MVAiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1k0MVAsCisJCS5kZXB0aCA9IDEyLAorCQkuZmxhZ3MgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0sIHsKKwkJLm5hbWUgPSAiNDoyOjIsIHBhY2tlZCwgWVVZViIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVZViwKKwkJLmRlcHRoID0gMTYsCisJCS5mbGFncyA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSwgeworCQkubmFtZSA9ICI0OjI6MiwgcGFja2VkLCBVWVZZIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9VWVZZLAorCQkuZGVwdGggPSAxNiwKKwkJLmZsYWdzID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKKwl9LCB7CisJCS5uYW1lID0gIjQ6MjowLCBZVVYiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1lVVjQyMCwKKwkJLmRlcHRoID0gMTIsCisJCS5mbGFncyA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSwKK307CisKK2ludCBjeDI1ODIxX2dldF9mb3JtYXRfc2l6ZSh2b2lkKQoreworCXJldHVybiBBUlJBWV9TSVpFKGZvcm1hdHMpOworfQorCitzdHJ1Y3QgY3gyNTgyMV9mbXQgKmN4MjU4MjFfZm9ybWF0X2J5X2ZvdXJjYyh1bnNpZ25lZCBpbnQgZm91cmNjKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfWTQxUCB8fCBmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1lVVjQxMVApCisJCXJldHVybiBmb3JtYXRzICsgMTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdHMpOyBpKyspCisJCWlmIChmb3JtYXRzW2ldLmZvdXJjYyA9PSBmb3VyY2MpCisJCQlyZXR1cm4gZm9ybWF0cyArIGk7CisKKwlwcl9lcnIoIiVzKDB4JTA4eCkgTk9UIEZPVU5EXG4iLCBfX2Z1bmNfXywgZm91cmNjKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBjeDI1ODIxX2R1bXBfdmlkZW9fcXVldWUoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmICghbGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZxLT5hY3RpdmUpCisJCSAgICBidWYgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOworCX0KKworCWlmICghbGlzdF9lbXB0eSgmcS0+cXVldWVkKSkgeworCQlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZxLT5xdWV1ZWQpCisJCSAgICBidWYgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOworCX0KKworfQorCit2b2lkIGN4MjU4MjFfdmlkZW9fd2FrZXVwKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSwKKwkJCSAgdTMyIGNvdW50KQoreworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOworCWludCBiYzsKKworCWZvciAoYmMgPSAwOzsgYmMrKykgeworCQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQkJZHByaW50aygxLCAiYmM9JWQgKD0wOiBhY3RpdmUgZW1wdHkpXG4iLCBiYyk7CisJCQlicmVhazsKKwkJfQorCisJCWJ1ZiA9CisJCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKKworCQkvKiBjb3VudCBjb21lcyBmcm9tIHRoZSBodyBhbmQgaXQgaXMgMTZiaXQgd2lkZSAtLQorCQkgKiB0aGlzIHRyaWNrIGhhbmRsZXMgd3JhcC1hcm91bmRzIGNvcnJlY3RseSBmb3IKKwkJICogdXAgdG8gMzI3NjcgYnVmZmVycyBpbiBmbGlnaHQuLi4gKi8KKwkJaWYgKChzMTYpIChjb3VudCAtIGJ1Zi0+Y291bnQpIDwgMCkKKwkJCWJyZWFrOworCisJCWRvX2dldHRpbWVvZmRheSgmYnVmLT52Yi50cyk7CisJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ET05FOworCQlsaXN0X2RlbCgmYnVmLT52Yi5xdWV1ZSk7CisJCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpCisJCWRlbF90aW1lcigmcS0+dGltZW91dCk7CisJZWxzZQorCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7CisJaWYgKGJjICE9IDEpCisJCXByX2VycigiJXM6ICVkIGJ1ZmZlcnMgaGFuZGxlZCAoc2hvdWxkIGJlIDEpXG4iLCBfX2Z1bmNfXywgYmMpOworfQorCisjaWZkZWYgVFVORVJfRkxBRworaW50IGN4MjU4MjFfc2V0X3R2bm9ybShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgdjRsMl9zdGRfaWQgbm9ybSkKK3sKKwlkcHJpbnRrKDEsICIlcyhub3JtID0gMHglMDh4KSBuYW1lOiBbJXNdXG4iLAorCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGludClub3JtLCB2NGwyX25vcm1fdG9fbmFtZShub3JtKSk7CisKKwlkZXYtPnR2bm9ybSA9IG5vcm07CisKKwkvKiBUZWxsIHRoZSBpbnRlcm5hbCBBL1YgZGVjb2RlciAqLworCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBzX3N0ZCwgbm9ybSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdHJ1Y3QgdmlkZW9fZGV2aWNlICpjeDI1ODIxX3ZkZXZfaW5pdChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgICAgc3RydWN0IHZpZGVvX2RldmljZSAqdGVtcGxhdGUsCisJCQkJICAgICAgIGNoYXIgKnR5cGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmIChOVUxMID09IHZmZCkKKwkJcmV0dXJuIE5VTEw7CisJKnZmZCA9ICp0ZW1wbGF0ZTsKKwl2ZmQtPnY0bDJfZGV2ID0gJmRldi0+djRsMl9kZXY7CisJdmZkLT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CisJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwgIiVzICVzICglcykiLCBkZXYtPm5hbWUsIHR5cGUsCisJCSBjeDI1ODIxX2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lKTsKKwl2aWRlb19zZXRfZHJ2ZGF0YSh2ZmQsIGRldik7CisJcmV0dXJuIHZmZDsKK30KKworLyoKK3N0YXRpYyBpbnQgY3gyNTgyMV9jdHJsX3F1ZXJ5KHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCit7CisJaW50IGk7CisKKwlpZiAocWN0cmwtPmlkIDwgVjRMMl9DSURfQkFTRSB8fCBxY3RybC0+aWQgPj0gVjRMMl9DSURfTEFTVFAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgQ1gyNTgyMV9DVExTOyBpKyspCisJCWlmIChjeDI1ODIxX2N0bHNbaV0udi5pZCA9PSBxY3RybC0+aWQpCisJCQlicmVhazsKKwlpZiAoaSA9PSBDWDI1ODIxX0NUTFMpIHsKKwkJKnFjdHJsID0gbm9fY3RsOworCQlyZXR1cm4gMDsKKwl9CisJKnFjdHJsID0gY3gyNTgyMV9jdGxzW2ldLnY7CisJcmV0dXJuIDA7Cit9CisqLworCisvKiByZXNvdXJjZSBtYW5hZ2VtZW50ICovCitpbnQgY3gyNTgyMV9yZXNfZ2V0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsCisJCSAgICB1bnNpZ25lZCBpbnQgYml0KQoreworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwlpZiAoZmgtPnJlc291cmNlcyAmIGJpdCkKKwkJLyogaGF2ZSBpdCBhbHJlYWR5IGFsbG9jYXRlZCAqLworCQlyZXR1cm4gMTsKKworCS8qIGlzIGl0IGZyZWU/ICovCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwlpZiAoZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzICYgYml0KSB7CisJCS8qIG5vLCBzb21lb25lIGVsc2UgdXNlcyBpdCAqLworCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJCXJldHVybiAwOworCX0KKwkvKiBpdCdzIGZyZWUsIGdyYWIgaXQgKi8KKwlmaC0+cmVzb3VyY2VzIHw9IGJpdDsKKwlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5yZXNvdXJjZXMgfD0gYml0OworCWRwcmludGsoMSwgInJlczogZ2V0ICVkXG4iLCBiaXQpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwlyZXR1cm4gMTsKK30KKworaW50IGN4MjU4MjFfcmVzX2NoZWNrKHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlyZXR1cm4gZmgtPnJlc291cmNlcyAmIGJpdDsKK30KKworaW50IGN4MjU4MjFfcmVzX2xvY2tlZChzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCit7CisJcmV0dXJuIGZoLT5kZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5yZXNvdXJjZXMgJiBiaXQ7Cit9CisKK3ZvaWQgY3gyNTgyMV9yZXNfZnJlZShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IGN4MjU4MjFfZmggKmZoLAorCQkgICAgICB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwlCVUdfT04oKGZoLT5yZXNvdXJjZXMgJiBiaXRzKSAhPSBiaXRzKTsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCWZoLT5yZXNvdXJjZXMgJj0gfmJpdHM7CisJZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzICY9IH5iaXRzOworCWRwcmludGsoMSwgInJlczogcHV0ICVkXG4iLCBiaXRzKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGVvX211eChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGlucHV0KQoreworCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CisJbWVtc2V0KCZyb3V0ZSwgMCwgc2l6ZW9mKHJvdXRlKSk7CisKKwlkcHJpbnRrKDEsICIlcygpOiB2aWRlb19tdXg6ICVkIFt2bXV4PSVkLCBncGlvPTB4JXgsMHgleCwweCV4LDB4JXhdXG4iLAorCQlfX2Z1bmNfXywgaW5wdXQsIElOUFVUKGlucHV0KS0+dm11eCwgSU5QVVQoaW5wdXQpLT5ncGlvMCwKKwkJSU5QVVQoaW5wdXQpLT5ncGlvMSwgSU5QVVQoaW5wdXQpLT5ncGlvMiwgSU5QVVQoaW5wdXQpLT5ncGlvMyk7CisJZGV2LT5pbnB1dCA9IGlucHV0OworCisJcm91dGUuaW5wdXQgPSBJTlBVVChpbnB1dCktPnZtdXg7CisKKwkvKiBUZWxsIHRoZSBpbnRlcm5hbCBBL1YgZGVjb2RlciAqLworCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19yb3V0aW5nLCBJTlBVVChpbnB1dCktPnZtdXgsIDAsIDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSwKKwkJCSAgICBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiwKKwkJCSAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsKQoreworCWludCB0bXAgPSAwOworCisJLyogc2V0dXAgZmlmbyArIGZvcm1hdCAqLworCWN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwKGRldiwgY2hhbm5lbCwgYnVmLT5icGwsIGJ1Zi0+cmlzYy5kbWEpOworCisJLyogcmVzZXQgY291bnRlciAqLworCWN4X3dyaXRlKGNoYW5uZWwtPmdwY250X2N0bCwgMyk7CisJcS0+Y291bnQgPSAxOworCisJLyogZW5hYmxlIGlycSAqLworCWN4X3NldChQQ0lfSU5UX01TSywgY3hfcmVhZChQQ0lfSU5UX01TSykgfCAoMSA8PCBjaGFubmVsLT5pKSk7CisJY3hfc2V0KGNoYW5uZWwtPmludF9tc2ssIDB4MTEpOworCisJLyogc3RhcnQgZG1hICovCisJY3hfd3JpdGUoY2hhbm5lbC0+ZG1hX2N0bCwgMHgxMSk7CS8qIEZJRk8gYW5kIFJJU0MgZW5hYmxlICovCisKKwkvKiBtYWtlIHN1cmUgdXBzdHJlYW0gc2V0dGluZyBpZiBhbnkgaXMgcmV2ZXJzZWQgKi8KKwl0bXAgPSBjeF9yZWFkKFZJRF9DSF9NT0RFX1NFTCk7CisJY3hfd3JpdGUoVklEX0NIX01PREVfU0VMLCB0bXAgJiAweEZGRkZGRTAwKTsKKworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV9yZXN0YXJ0X3ZpZGVvX3F1ZXVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxLAorCQkJCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYsICpwcmV2OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlpZiAoIWxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKKwkJYnVmID0KKwkJICAgIGxpc3RfZW50cnkocS0+YWN0aXZlLm5leHQsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOworCisJCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLCBjaGFubmVsKTsKKworCQlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZxLT5hY3RpdmUpIHsKKwkJCWJ1ZiA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5xdWV1ZSk7CisJCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKKwkJfQorCisJCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcyArIEJVRkZFUl9USU1FT1VUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJldiA9IE5VTEw7CisJZm9yICg7OykgeworCQlpZiAobGlzdF9lbXB0eSgmcS0+cXVldWVkKSkKKwkJCXJldHVybiAwOworCisJCWJ1ZiA9CisJCSAgICBsaXN0X2VudHJ5KHEtPnF1ZXVlZC5uZXh0LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKKworCQlpZiAoTlVMTCA9PSBwcmV2KSB7CisJCQlsaXN0X21vdmVfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7CisJCQljeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShkZXYsIHEsIGJ1ZiwgY2hhbm5lbCk7CisJCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7CisJCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7CisJCX0gZWxzZSBpZiAocHJldi0+dmIud2lkdGggPT0gYnVmLT52Yi53aWR0aCAmJgorCQkJICAgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0ICYmCisJCQkgICBwcmV2LT5mbXQgPT0gYnVmLT5mbXQpIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKKwkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7CisJCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKKwkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7CisJCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOyAvKiBCaXRzIDYzIC0gMzIgKi8KKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisJCXByZXYgPSBidWY7CisJfQorfQorCit2b2lkIGN4MjU4MjFfdmlkX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBjeDI1ODIxX2RhdGEgKnRpbWVvdXRfZGF0YSA9IChzdHJ1Y3QgY3gyNTgyMV9kYXRhICopZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IHRpbWVvdXRfZGF0YS0+ZGV2OworCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwgPSB0aW1lb3V0X2RhdGEtPmNoYW5uZWw7CisJc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxOworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBjeDI1ODIxX3NyYW1fY2hhbm5lbF9kdW1wKGRldiwgY2hhbm5lbCk7ICovCisJY3hfY2xlYXIoY2hhbm5lbC0+ZG1hX2N0bCwgMHgxMSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQlidWYgPQorCQkgICAgbGlzdF9lbnRyeShxLT5hY3RpdmUubmV4dCwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5xdWV1ZSk7CisJCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKworCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfRVJST1I7CisJCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7CisJfQorCisJY3gyNTgyMV9yZXN0YXJ0X3ZpZGVvX3F1ZXVlKGRldiwgcSwgY2hhbm5lbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOworfQorCitpbnQgY3gyNTgyMV92aWRlb19pcnEoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSwgdTMyIHN0YXR1cykKK3sKKwl1MzIgY291bnQgPSAwOworCWludCBoYW5kbGVkID0gMDsKKwl1MzIgbWFzazsKKwlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsID0gZGV2LT5jaGFubmVsc1tjaGFuX251bV0uc3JhbV9jaGFubmVsczsKKworCW1hc2sgPSBjeF9yZWFkKGNoYW5uZWwtPmludF9tc2spOworCWlmICgwID09IChzdGF0dXMgJiBtYXNrKSkKKwkJcmV0dXJuIGhhbmRsZWQ7CisKKwljeF93cml0ZShjaGFubmVsLT5pbnRfc3RhdCwgc3RhdHVzKTsKKworCS8qIHJpc2Mgb3AgY29kZSBlcnJvciAqLworCWlmIChzdGF0dXMgJiAoMSA8PCAxNikpIHsKKwkJcHJfd2FybigiJXMsICVzOiB2aWRlbyByaXNjIG9wIGNvZGUgZXJyb3JcbiIsCisJCQlkZXYtPm5hbWUsIGNoYW5uZWwtPm5hbWUpOworCQljeF9jbGVhcihjaGFubmVsLT5kbWFfY3RsLCAweDExKTsKKwkJY3gyNTgyMV9zcmFtX2NoYW5uZWxfZHVtcChkZXYsIGNoYW5uZWwpOworCX0KKworCS8qIHJpc2MxIHkgKi8KKwlpZiAoc3RhdHVzICYgRkxEX1ZJRF9EU1RfUklTQzEpIHsKKwkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwkJY291bnQgPSBjeF9yZWFkKGNoYW5uZWwtPmdwY250KTsKKwkJY3gyNTgyMV92aWRlb193YWtldXAoZGV2LCAmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxLAorCQkJCWNvdW50KTsKKwkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworCQloYW5kbGVkKys7CisJfQorCisJLyogcmlzYzIgeSAqLworCWlmIChzdGF0dXMgJiAweDEwKSB7CisJCWRwcmludGsoMiwgInN0b3BwZXIgdmlkZW9cbiIpOworCQlzcGluX2xvY2soJmRldi0+c2xvY2spOworCQljeDI1ODIxX3Jlc3RhcnRfdmlkZW9fcXVldWUoZGV2LAorCQkJCSZkZXYtPmNoYW5uZWxzW2NoYW5uZWwtPmldLnZpZHEsIGNoYW5uZWwpOworCQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CisJCWhhbmRsZWQrKzsKKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3ZvaWQgY3gyNTgyMV92aWRlb2lvY3RsX3VucmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpCit7CisJaWYgKGRldi0+aW9jdGxfZGV2KSB7CisJCWlmICh2aWRlb19pc19yZWdpc3RlcmVkKGRldi0+aW9jdGxfZGV2KSkKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+aW9jdGxfZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT5pb2N0bF9kZXYpOworCisJCWRldi0+aW9jdGxfZGV2ID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgY3gyNTgyMV92aWRlb191bnJlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbl9udW0pCit7CisJY3hfY2xlYXIoUENJX0lOVF9NU0ssIDEpOworCisJaWYgKGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2RldikgeworCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpKQorCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoCisJCQkJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2Rldik7CisJCWVsc2UKKwkJCXZpZGVvX2RldmljZV9yZWxlYXNlKAorCQkJCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpOworCisJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2RldiA9IE5VTEw7CisKKwkJYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksCisJCQkJJmRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZHEuc3RvcHBlcik7CisKKwkJcHJfd2FybigiZGV2aWNlICVkIHJlbGVhc2VkIVxuIiwgY2hhbl9udW0pOworCX0KKworfQorCitpbnQgY3gyNTgyMV92aWRlb19yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldikKK3sKKwlpbnQgZXJyOworCWludCBpOworCisJc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX2RldmljZSA9IHsKKwkJLm5hbWUgPSAiY3gyNTgyMS12aWRlbyIsCisJCS5mb3BzID0gJnZpZGVvX2ZvcHMsCisJCS5taW5vciA9IC0xLAorCQkuaW9jdGxfb3BzID0gJnZpZGVvX2lvY3RsX29wcywKKwkJLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAorCQkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLAorCX07CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5zbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZJRF9DSEFOTkVMX05VTSAtIDE7ICsraSkgeworCQljeDI1ODIxX2luaXRfY29udHJvbHMoZGV2LCBpKTsKKworCQljeDI1ODIxX3Jpc2Nfc3RvcHBlcihkZXYtPnBjaSwgJmRldi0+Y2hhbm5lbHNbaV0udmlkcS5zdG9wcGVyLAorCQkJCWRldi0+Y2hhbm5lbHNbaV0uc3JhbV9jaGFubmVscy0+ZG1hX2N0bCwKKwkJCQkweDExLCAwKTsKKworCQlkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMgPSAmY3gyNTgyMV9zcmFtX2NoYW5uZWxzW2ldOworCQlkZXYtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiA9IE5VTEw7CisJCWRldi0+Y2hhbm5lbHNbaV0ucmVzb3VyY2VzID0gMDsKKworCQljeF93cml0ZShkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMtPmludF9zdGF0LCAweGZmZmZmZmZmKTsKKworCQlJTklUX0xJU1RfSEVBRCgmZGV2LT5jaGFubmVsc1tpXS52aWRxLmFjdGl2ZSk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXYtPmNoYW5uZWxzW2ldLnZpZHEucXVldWVkKTsKKworCQlkZXYtPmNoYW5uZWxzW2ldLnRpbWVvdXRfZGF0YS5kZXYgPSBkZXY7CisJCWRldi0+Y2hhbm5lbHNbaV0udGltZW91dF9kYXRhLmNoYW5uZWwgPQorCQkJJmN4MjU4MjFfc3JhbV9jaGFubmVsc1tpXTsKKwkJZGV2LT5jaGFubmVsc1tpXS52aWRxLnRpbWVvdXQuZnVuY3Rpb24gPQorCQkJY3gyNTgyMV92aWRfdGltZW91dDsKKwkJZGV2LT5jaGFubmVsc1tpXS52aWRxLnRpbWVvdXQuZGF0YSA9CisJCQkodW5zaWduZWQgbG9uZykmZGV2LT5jaGFubmVsc1tpXS50aW1lb3V0X2RhdGE7CisJCWluaXRfdGltZXIoJmRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0KTsKKworCQkvKiByZWdpc3RlciB2NGwgZGV2aWNlcyAqLworCQlkZXYtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiA9IGN4MjU4MjFfdmRldl9pbml0KGRldiwKKwkJCQlkZXYtPnBjaSwgJmN4MjU4MjFfdmlkZW9fZGV2aWNlLCAidmlkZW8iKTsKKworCQllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT5jaGFubmVsc1tpXS52aWRlb19kZXYsCisJCQkJVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnJbZGV2LT5ucl0pOworCisJCWlmIChlcnIgPCAwKQorCQkJZ290byBmYWlsX3VucmVnOworCisJfQorCisJLyogc2V0IFBDSSBpbnRlcnJ1cHQgKi8KKwljeF9zZXQoUENJX0lOVF9NU0ssIDB4ZmYpOworCisJLyogaW5pdGlhbCBkZXZpY2UgY29uZmlndXJhdGlvbiAqLworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisjaWZkZWYgVFVORVJfRkxBRworCWRldi0+dHZub3JtID0gY3gyNTgyMV92aWRlb19kZXZpY2UuY3VycmVudF9ub3JtOworCWN4MjU4MjFfc2V0X3R2bm9ybShkZXYsIGRldi0+dHZub3JtKTsKKyNlbmRpZgorCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCisJcmV0dXJuIDA7CisKK2ZhaWxfdW5yZWc6CisJY3gyNTgyMV92aWRlb191bnJlZ2lzdGVyKGRldiwgaSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGN4MjU4MjFfYnVmZmVyX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50ICpjb3VudCwKKwkJIHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBxLT5wcml2X2RhdGE7CisKKwkqc2l6ZSA9IGZoLT5mbXQtPmRlcHRoICogZmgtPndpZHRoICogZmgtPmhlaWdodCA+PiAzOworCisJaWYgKDAgPT0gKmNvdW50KQorCQkqY291bnQgPSAzMjsKKworCWlmICgqc2l6ZSAqICpjb3VudCA+IHZpZF9saW1pdCAqIDEwMjQgKiAxMDI0KQorCQkqY291bnQgPSAodmlkX2xpbWl0ICogMTAyNCAqIDEwMjQpIC8gKnNpemU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJICAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYgPQorCSAgICBjb250YWluZXJfb2YodmIsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIpOworCWludCByYywgaW5pdF9idWZmZXIgPSAwOworCXUzMiBsaW5lMF9vZmZzZXQsIGxpbmUxX29mZnNldDsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEoJmJ1Zi0+dmIpOworCWludCBicGxfbG9jYWwgPSBMSU5FX1NJWkVfRDE7CisJaW50IGNoYW5uZWxfb3BlbmVkID0gZmgtPmNoYW5uZWxfaWQ7CisKKwlCVUdfT04oTlVMTCA9PSBmaC0+Zm10KTsKKwlpZiAoZmgtPndpZHRoIDwgNDggfHwgZmgtPndpZHRoID4gNzIwIHx8CisJICAgIGZoLT5oZWlnaHQgPCAzMiB8fCBmaC0+aGVpZ2h0ID4gNTc2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1Zi0+dmIuc2l6ZSA9IChmaC0+d2lkdGggKiBmaC0+aGVpZ2h0ICogZmgtPmZtdC0+ZGVwdGgpID4+IDM7CisKKwlpZiAoMCAhPSBidWYtPnZiLmJhZGRyICYmIGJ1Zi0+dmIuYnNpemUgPCBidWYtPnZiLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJ1Zi0+Zm10ICE9IGZoLT5mbXQgfHwKKwkgICAgYnVmLT52Yi53aWR0aCAhPSBmaC0+d2lkdGggfHwKKwkgICAgYnVmLT52Yi5oZWlnaHQgIT0gZmgtPmhlaWdodCB8fCBidWYtPnZiLmZpZWxkICE9IGZpZWxkKSB7CisJCWJ1Zi0+Zm10ID0gZmgtPmZtdDsKKwkJYnVmLT52Yi53aWR0aCA9IGZoLT53aWR0aDsKKwkJYnVmLT52Yi5oZWlnaHQgPSBmaC0+aGVpZ2h0OworCQlidWYtPnZiLmZpZWxkID0gZmllbGQ7CisJCWluaXRfYnVmZmVyID0gMTsKKwl9CisKKwlpZiAoVklERU9CVUZfTkVFRFNfSU5JVCA9PSBidWYtPnZiLnN0YXRlKSB7CisJCWluaXRfYnVmZmVyID0gMTsKKwkJcmMgPSB2aWRlb2J1Zl9pb2xvY2socSwgJmJ1Zi0+dmIsIE5VTEwpOworCQlpZiAoMCAhPSByYykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgcHJfZm10KCJ2aWRlb2J1Zl9pb2xvY2sgZmFpbGVkIVxuIikpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJZHByaW50aygxLCAiaW5pdF9idWZmZXI9JWRcbiIsIGluaXRfYnVmZmVyKTsKKworCWlmIChpbml0X2J1ZmZlcikgeworCisJCWNoYW5uZWxfb3BlbmVkID0gZGV2LT5jaGFubmVsX29wZW5lZDsKKwkJaWYgKGNoYW5uZWxfb3BlbmVkIDwgMCB8fCBjaGFubmVsX29wZW5lZCA+IDcpCisJCQljaGFubmVsX29wZW5lZCA9IDc7CisKKwkJaWYgKGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9vcGVuZWRdLnBpeGVsX2Zvcm1hdHMgPT0KKwkJCQlQSVhFTF9GUk1UXzQxMSkKKwkJCWJ1Zi0+YnBsID0gKGJ1Zi0+Zm10LT5kZXB0aCAqIGJ1Zi0+dmIud2lkdGgpID4+IDM7CisJCWVsc2UKKwkJCWJ1Zi0+YnBsID0gKGJ1Zi0+Zm10LT5kZXB0aCA+PiAzKSAqIChidWYtPnZiLndpZHRoKTsKKworCQlpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0ucGl4ZWxfZm9ybWF0cyA9PQorCQkJCVBJWEVMX0ZSTVRfNDExKSB7CisJCQlicGxfbG9jYWwgPSBidWYtPmJwbDsKKwkJfSBlbHNlIHsKKwkJCWJwbF9sb2NhbCA9IGJ1Zi0+YnBsOyAgIC8qIERlZmF1bHQgKi8KKworCQkJaWYgKGNoYW5uZWxfb3BlbmVkID49IDAgJiYgY2hhbm5lbF9vcGVuZWQgPD0gNykgeworCQkJCWlmIChkZXYtPmNoYW5uZWxzW2NoYW5uZWxfb3BlbmVkXQorCQkJCQkJLnVzZV9jaWZfcmVzb2x1dGlvbikgeworCQkJCQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcKKwkJCQkJICAgIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQorCQkJCQkJYnBsX2xvY2FsID0gMzUyIDw8IDE7CisJCQkJCWVsc2UKKwkJCQkJCWJwbF9sb2NhbCA9CisJCQkJCQkgZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0uCisJCQkJCQkgY2lmX3dpZHRoIDw8CisJCQkJCQkgMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlzd2l0Y2ggKGJ1Zi0+dmIuZmllbGQpIHsKKwkJY2FzZSBWNEwyX0ZJRUxEX1RPUDoKKwkJCWN4MjU4MjFfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJCSAgICBkbWEtPnNnbGlzdCwgMCwgVU5TRVQsCisJCQkJCSAgICBidWYtPmJwbCwgMCwgYnVmLT52Yi5oZWlnaHQpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9GSUVMRF9CT1RUT006CisJCQljeDI1ODIxX3Jpc2NfYnVmZmVyKGRldi0+cGNpLCAmYnVmLT5yaXNjLAorCQkJCQkgICAgZG1hLT5zZ2xpc3QsIFVOU0VULCAwLAorCQkJCQkgICAgYnVmLT5icGwsIDAsIGJ1Zi0+dmIuaGVpZ2h0KTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKwkJCS8qIEFsbCBvdGhlciBmb3JtYXRzIGFyZSB0b3AgZmllbGQgZmlyc3QgKi8KKwkJCWxpbmUwX29mZnNldCA9IDA7CisJCQlsaW5lMV9vZmZzZXQgPSBidWYtPmJwbDsKKwkJCWRwcmludGsoMSwgInRvcCBmaWVsZCBmaXJzdFxuIik7CisKKwkJCWN4MjU4MjFfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJCSAgICBkbWEtPnNnbGlzdCwgbGluZTBfb2Zmc2V0LAorCQkJCQkgICAgYnBsX2xvY2FsLCBicGxfbG9jYWwsIGJwbF9sb2NhbCwKKwkJCQkJICAgIGJ1Zi0+dmIuaGVpZ2h0ID4+IDEpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9GSUVMRF9TRVFfVEI6CisJCQljeDI1ODIxX3Jpc2NfYnVmZmVyKGRldi0+cGNpLCAmYnVmLT5yaXNjLAorCQkJCQkgICAgZG1hLT5zZ2xpc3QsCisJCQkJCSAgICAwLCBidWYtPmJwbCAqIChidWYtPnZiLmhlaWdodCA+PiAxKSwKKwkJCQkJICAgIGJ1Zi0+YnBsLCAwLCBidWYtPnZiLmhlaWdodCA+PiAxKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRklFTERfU0VRX0JUOgorCQkJY3gyNTgyMV9yaXNjX2J1ZmZlcihkZXYtPnBjaSwgJmJ1Zi0+cmlzYywKKwkJCQkJICAgIGRtYS0+c2dsaXN0LAorCQkJCQkgICAgYnVmLT5icGwgKiAoYnVmLT52Yi5oZWlnaHQgPj4gMSksIDAsCisJCQkJCSAgICBidWYtPmJwbCwgMCwgYnVmLT52Yi5oZWlnaHQgPj4gMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfQorCisJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcHJlcCAtICVkeCVkICVkYnBwIFwiJXNcIiAtIGRtYT0weCUwOGx4XG4iLAorCQlidWYsIGJ1Zi0+dmIuaSwgZmgtPndpZHRoLCBmaC0+aGVpZ2h0LCBmaC0+Zm10LT5kZXB0aCwKKwkJZmgtPmZtdC0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpYnVmLT5yaXNjLmRtYSk7CisKKwlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUFJFUEFSRUQ7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwljeDI1ODIxX2ZyZWVfYnVmZmVyKHEsIGJ1Zik7CisJcmV0dXJuIHJjOworfQorCit2b2lkIGN4MjU4MjFfYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkJICAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KKwkgICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKKworCWN4MjU4MjFfZnJlZV9idWZmZXIocSwgYnVmKTsKK30KKworc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpnZXRfcXVldWUoc3RydWN0IGN4MjU4MjFfZmggKmZoKQoreworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJcmV0dXJuICZmaC0+dmlkcTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitpbnQgY3gyNTgyMV9nZXRfcmVzb3VyY2Uoc3RydWN0IGN4MjU4MjFfZmggKmZoLCBpbnQgcmVzb3VyY2UpCit7CisJc3dpdGNoIChmaC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlyZXR1cm4gcmVzb3VyY2U7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAwOworCX0KK30KKworaW50IGN4MjU4MjFfdmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHZpZGVvYnVmX21tYXBfbWFwcGVyKGdldF9xdWV1ZShmaCksIHZtYSk7Cit9CisKKworc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KKwkgICBjb250YWluZXJfb2YodmIsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIpOworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqcHJldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSA9ICZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS52aWRxOworCisJLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLworCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOworCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7CisJYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOyAgICAgIC8qIGJpdHMgNjMtMzIgKi8KKworCWRwcmludGsoMiwgImptcCB0byBzdG9wcGVyICgweCV4KVxuIiwgYnVmLT5yaXNjLmptcFsxXSk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPnF1ZXVlZCk7CisJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7CisJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIHF1ZXVlZFxuIiwgYnVmLAorCQkJCWJ1Zi0+dmIuaSk7CisKKwl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7CisJCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAorCQkJCWRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnNyYW1fY2hhbm5lbHMpOworCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKKwkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOworCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IGFjdGl2ZSwgYnVmIGNudCA9ICVkLCBxLT5jb3VudCA9ICVkXG4iLAorCQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7CisJfSBlbHNlIHsKKwkJcHJldiA9IGxpc3RfZW50cnkocS0+YWN0aXZlLnByZXYsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwKKwkJCQl2Yi5xdWV1ZSk7CisJCWlmIChwcmV2LT52Yi53aWR0aCA9PSBidWYtPnZiLndpZHRoCisJCSAgICYmIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodAorCQkgICAmJiBwcmV2LT5mbXQgPT0gYnVmLT5mbXQpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOworCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKKwkJCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOworCQkJcHJldi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKKworCQkJLyogNjQgYml0IGJpdHMgNjMtMzIgKi8KKwkJCXByZXYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7CisJCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmUsIGJ1Zi0+Y291bnQ9JWRcbiIsCisJCQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50KTsKKworCQl9IGVsc2UgeworCQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPnF1ZXVlZCk7CisJCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOworCQkJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBxdWV1ZWRcbiIsIGJ1ZiwKKwkJCQkJYnVmLT52Yi5pKTsKKwkJfQorCX0KKworCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKQorCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgY3gyNTgyMV92aWRlb19xb3BzID0geworCS5idWZfc2V0dXAgPSBjeDI1ODIxX2J1ZmZlcl9zZXR1cCwKKwkuYnVmX3ByZXBhcmUgPSBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlLAorCS5idWZfcXVldWUgPSBidWZmZXJfcXVldWUsCisJLmJ1Zl9yZWxlYXNlID0gY3gyNTgyMV9idWZmZXJfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmgsICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWludCBtaW5vciA9IHZpZGVvX2RldmRhdGEoZmlsZSktPm1pbm9yOworCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCXUzMiBwaXhfZm9ybWF0OworCWludCBjaF9pZCA9IDA7CisJaW50IGk7CisKKwlkcHJpbnRrKDEsICJvcGVuIGRldj0lcyB0eXBlPSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpLAorCQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKKworCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCisJZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBmaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9sb2NrKCZjeDI1ODIxX2Rldmxpc3RfbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmY3gyNTgyMV9kZXZsaXN0KQorCXsKKwkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGN4MjU4MjFfZGV2LCBkZXZsaXN0KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZJRF9DSEFOTkVMX05VTTsgaSsrKSB7CisJCQlpZiAoaC0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2ICYmCisJCQkgICBoLT5jaGFubmVsc1tpXS52aWRlb19kZXYtPm1pbm9yID09IG1pbm9yKSB7CisJCQkJZGV2ID0gaDsKKwkJCQljaF9pZCA9IGk7CisJCQkJdHlwZSAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoTlVMTCA9PSBkZXYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjeDI1ODIxX2Rldmxpc3RfbXV0ZXgpOworCQlrZnJlZShmaCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOworCWZoLT5kZXYgPSBkZXY7CisJZmgtPnR5cGUgPSB0eXBlOworCWZoLT53aWR0aCA9IDcyMDsKKwlmaC0+Y2hhbm5lbF9pZCA9IGNoX2lkOworCisJaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQorCQlmaC0+aGVpZ2h0ID0gNTc2OworCWVsc2UKKwkJZmgtPmhlaWdodCA9IDQ4MDsKKworCWRldi0+Y2hhbm5lbF9vcGVuZWQgPSBmaC0+Y2hhbm5lbF9pZDsKKwlpZiAoZGV2LT5jaGFubmVsc1tjaF9pZF0ucGl4ZWxfZm9ybWF0cyA9PSBQSVhFTF9GUk1UXzQxMSkKKwkJcGl4X2Zvcm1hdCA9IFY0TDJfUElYX0ZNVF9ZNDFQOworCWVsc2UKKwkJcGl4X2Zvcm1hdCA9IFY0TDJfUElYX0ZNVF9ZVVlWOworCWZoLT5mbXQgPSBjeDI1ODIxX2Zvcm1hdF9ieV9mb3VyY2MocGl4X2Zvcm1hdCk7CisKKwl2NGwyX3ByaW9fb3BlbigmZGV2LT5jaGFubmVsc1tjaF9pZF0ucHJpbywgJmZoLT5wcmlvKTsKKworCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmY3gyNTgyMV92aWRlb19xb3BzLAorCQkJICAgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAorCQkJICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkJICAgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciksIGZoLCBOVUxMKTsKKworCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKKwltdXRleF91bmxvY2soJmN4MjU4MjFfZGV2bGlzdF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJaWYgKGN4MjU4MjFfcmVzX2xvY2tlZChmaCwgUkVTT1VSQ0VfVklERU8wKSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfb25lKCZmaC0+dmlkcSwgZGF0YSwgY291bnQsIHBwb3MsCisJCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7CisKKwlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMCkpIHsKKwkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KKwkJaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCisJCQlyZXR1cm4gUE9MTEVSUjsKKwkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKKwkJCQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnN0cmVhbSk7CisJfSBlbHNlIHsKKwkJLyogcmVhZCgpIGNhcHR1cmUgKi8KKwkJYnVmID0gKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqKWZoLT52aWRxLnJlYWRfYnVmOworCQlpZiAoTlVMTCA9PSBidWYpCisJCQlyZXR1cm4gUE9MTEVSUjsKKwl9CisKKwlwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+dmIuZG9uZSwgd2FpdCk7CisJaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRE9ORSB8fCBidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0VSUk9SKSB7CisJCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUpIHsKKwkJCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKworCQkJaWYgKGRldiAmJiBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXQorCQkJCQkudXNlX2NpZl9yZXNvbHV0aW9uKSB7CisJCQkJdTggY2FtX2lkID0gKigoY2hhciAqKWJ1Zi0+dmIuYmFkZHIgKyAzKTsKKwkJCQltZW1jcHkoKGNoYXIgKilidWYtPnZiLmJhZGRyLAorCQkJCSAgICAgIChjaGFyICopYnVmLT52Yi5iYWRkciArIChmaC0+d2lkdGggKiAyKSwKKwkJCQkgICAgICAoZmgtPndpZHRoICogMikpOworCQkJCSooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMykgPSBjYW1faWQ7CisJCQl9CisJCX0KKworCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisKKwkvKiBzdG9wIHRoZSByaXNjIGVuZ2luZSBhbmQgZmlmbyAqLworCWN4X3dyaXRlKGNoYW5uZWwwLT5kbWFfY3RsLCAwKTsgLyogRklGTyBhbmQgUklTQyBkaXNhYmxlICovCisKKwkvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KKwlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMCkpIHsKKwkJdmlkZW9idWZfcXVldWVfY2FuY2VsKCZmaC0+dmlkcSk7CisJCWN4MjU4MjFfcmVzX2ZyZWUoZGV2LCBmaCwgUkVTT1VSQ0VfVklERU8wKTsKKwl9CisKKwlpZiAoZmgtPnZpZHEucmVhZF9idWYpIHsKKwkJY3gyNTgyMV9idWZmZXJfcmVsZWFzZSgmZmgtPnZpZHEsIGZoLT52aWRxLnJlYWRfYnVmKTsKKwkJa2ZyZWUoZmgtPnZpZHEucmVhZF9idWYpOworCX0KKworCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZpZHEpOworCisJdjRsMl9wcmlvX2Nsb3NlKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLCBmaC0+cHJpbyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShmaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworCisJaWYgKHVubGlrZWx5KGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVubGlrZWx5KGkgIT0gZmgtPnR5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1bmxpa2VseSghY3gyNTgyMV9yZXNfZ2V0KGRldiwgZmgsIGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLAorCQkJCQkJUkVTT1VSQ0VfVklERU8wKSkpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworCWludCBlcnIsIHJlczsKKworCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpICE9IGZoLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzApOworCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OworCWludCBlcnI7CisJaW50IHBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKKworCWlmIChmaCkgeworCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sCisJCQkJICAgICAgZmgtPnByaW8pOworCQlpZiAoMCAhPSBlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwllcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7CisKKwlpZiAoMCAhPSBlcnIpCisJCXJldHVybiBlcnI7CisKKwlmaC0+Zm10ID0gY3gyNTgyMV9mb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCWZoLT52aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKworCS8qIGNoZWNrIGlmIHdpZHRoIGFuZCBoZWlnaHQgaXMgdmFsaWQgYmFzZWQgb24gc2V0IHN0YW5kYXJkICovCisJaWYgKGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgoZi0+Zm10LnBpeC53aWR0aCwgZGV2LT50dm5vcm0pKQorCQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOworCisJaWYgKGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KGYtPmZtdC5waXguaGVpZ2h0LCBkZXYtPnR2bm9ybSkpCisJCWZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKKworCWlmIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZNDFQKQorCQlwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MTE7CisJZWxzZSBpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVVZVikKKwkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDIyOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljeDI1ODIxX3NldF9waXhlbF9mb3JtYXQoZGV2LCBTUkFNX0NIMDAsIHBpeF9mb3JtYXQpOworCisJLyogY2hlY2sgaWYgY2lmIHJlc29sdXRpb24gKi8KKwlpZiAoZmgtPndpZHRoID09IDMyMCB8fCBmaC0+d2lkdGggPT0gMzUyKQorCQlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS51c2VfY2lmX3Jlc29sdXRpb24gPSAxOworCWVsc2UKKwkJZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0udXNlX2NpZl9yZXNvbHV0aW9uID0gMDsKKworCWRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmNpZl93aWR0aCA9IGZoLT53aWR0aDsKKwltZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCBmaC0+d2lkdGgsIFNSQU1fQ0gwMCk7CisKKwlkcHJpbnRrKDIsICIlcygpOiB3aWR0aD0lZCBoZWlnaHQ9JWQgZmllbGQ9JWRcbiIsIF9fZnVuY19fLCBmaC0+d2lkdGgsCisJCWZoLT5oZWlnaHQsIGZoLT52aWRxLmZpZWxkKTsKKwl2NGwyX2ZpbGxfbWJ1c19mb3JtYXQoJm1idXNfZm10LCAmZi0+Zm10LnBpeCwgVjRMMl9NQlVTX0ZNVF9GSVhFRCk7CisJY3gyNTgyMV9jYWxsX2FsbChkZXYsIHZpZGVvLCBzX21idXNfZm10LCAmbWJ1c19mbXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKworCXJldF92YWwgPSB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisKKwlwLT5zZXF1ZW5jZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnZpZHEuY291bnQ7CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJY2hhciBuYW1lWzMyICsgMl07CisKKwlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KKwkJCQkJCQkJLnNyYW1fY2hhbm5lbHM7CisJdTMyIHRtcCA9IDA7CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy8yIiwgZGV2LT5uYW1lKTsKKwlwcl9pbmZvKCIlcy8yOiA9PT09PT09PT09PT0gIFNUQVJUIExPRyBTVEFUVVMgID09PT09PT09PT09PVxuIiwKKwkJZGV2LT5uYW1lKTsKKwljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgbG9nX3N0YXR1cyk7CisJdG1wID0gY3hfcmVhZChzcmFtX2NoLT5kbWFfY3RsKTsKKwlwcl9pbmZvKCJWaWRlbyBpbnB1dCAwIGlzICVzXG4iLAorCQkodG1wICYgMHgxMSkgPyAic3RyZWFtaW5nIiA6ICJzdG9wcGVkIik7CisJcHJfaW5mbygiJXMvMjogPT09PT09PT09PT09PSAgRU5EIExPRyBTVEFUVVMgID09PT09PT09PT09PT1cbiIsCisJCWRldi0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7CisJaW50IGVycjsKKworCWlmIChmaCkgeworCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sCisJCQkJICAgICAgZmgtPnByaW8pOworCQlpZiAoMCAhPSBlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBjeDI1ODIxX3NldF9jb250cm9sKGRldiwgY3RsLCBmaC0+Y2hhbm5lbF9pZCk7Cit9CisKKy8qIFZJREVPIElPQ1RMUyAqLworaW50IGN4MjU4MjFfdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCisJZi0+Zm10LnBpeC53aWR0aCA9IGZoLT53aWR0aDsKKwlmLT5mbXQucGl4LmhlaWdodCA9IGZoLT5oZWlnaHQ7CisJZi0+Zm10LnBpeC5maWVsZCA9IGZoLT52aWRxLmZpZWxkOworCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPSBmaC0+Zm10LT5mb3VyY2M7CisJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSAoZi0+Zm10LnBpeC53aWR0aCAqIGZoLT5mbXQtPmRlcHRoKSA+PiAzOworCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9mbXQgKmZtdDsKKwllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisJdW5zaWduZWQgaW50IG1heHcsIG1heGg7CisKKwlmbXQgPSBjeDI1ODIxX2Zvcm1hdF9ieV9mb3VyY2MoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJaWYgKE5VTEwgPT0gZm10KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKwltYXh3ID0gNzIwOworCW1heGggPSA1NzY7CisKKwlpZiAoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHsKKwkJaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gbWF4aCAvIDIpCisJCQlmaWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJZWxzZQorCQkJZmllbGQgPSBWNEwyX0ZJRUxEX1RPUDsKKwl9CisKKwlzd2l0Y2ggKGZpZWxkKSB7CisJY2FzZSBWNEwyX0ZJRUxEX1RPUDoKKwljYXNlIFY0TDJfRklFTERfQk9UVE9NOgorCQltYXhoID0gbWF4aCAvIDI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmLT5mbXQucGl4LmZpZWxkID0gZmllbGQ7CisJaWYgKGYtPmZtdC5waXguaGVpZ2h0IDwgMzIpCisJCWYtPmZtdC5waXguaGVpZ2h0ID0gMzI7CisJaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gbWF4aCkKKwkJZi0+Zm10LnBpeC5oZWlnaHQgPSBtYXhoOworCWlmIChmLT5mbXQucGl4LndpZHRoIDwgNDgpCisJCWYtPmZtdC5waXgud2lkdGggPSA0ODsKKwlpZiAoZi0+Zm10LnBpeC53aWR0aCA+IG1heHcpCisJCWYtPmZtdC5waXgud2lkdGggPSBtYXh3OworCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDM7CisJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSAoZi0+Zm10LnBpeC53aWR0aCAqIGZtdC0+ZGVwdGgpID4+IDM7CisJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPSBmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKworCXN0cmNweShjYXAtPmRyaXZlciwgImN4MjU4MjEiKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgY3gyNTgyMV9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlBDSWU6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOworCWNhcC0+dmVyc2lvbiA9IENYMjU4MjFfVkVSU0lPTl9DT0RFOworCWNhcC0+Y2FwYWJpbGl0aWVzID0KKwkgICAgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1JFQURXUklURSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKKwlpZiAoVU5TRVQgIT0gZGV2LT50dW5lcl90eXBlKQorCQljYXAtPmNhcGFiaWxpdGllcyB8PSBWNEwyX0NBUF9UVU5FUjsKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlpZiAodW5saWtlbHkoZi0+aW5kZXggPj0gQVJSQVlfU0laRShmb3JtYXRzKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgZm9ybWF0c1tmLT5pbmRleF0ubmFtZSwgc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJZi0+cGl4ZWxmb3JtYXQgPSBmb3JtYXRzW2YtPmluZGV4XS5mb3VyY2M7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCXJldHVybiB2aWRlb2J1Zl9yZXFidWZzKGdldF9xdWV1ZShmaCksIHApOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJcmV0dXJuIHZpZGVvYnVmX3F1ZXJ5YnVmKGdldF9xdWV1ZShmaCksIHApOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJcmV0dXJuIHZpZGVvYnVmX3FidWYoZ2V0X3F1ZXVlKGZoKSwgcCk7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19nX3ByaW9yaXR5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmLCBlbnVtIHY0bDJfcHJpb3JpdHkgKnApCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZiktPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmOworCisJKnAgPSB2NGwyX3ByaW9fbWF4KCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvKTsKKworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZiwKKwkJCSAgICAgIGVudW0gdjRsMl9wcmlvcml0eSBwcmlvKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZiktPmRldjsKKworCXJldHVybiB2NGwyX3ByaW9fY2hhbmdlKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLCAmZmgtPnByaW8sCisJCQlwcmlvKTsKK30KKworI2lmZGVmIFRVTkVSX0ZMQUcKK2ludCBjeDI1ODIxX3ZpZGlvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKiB0dm5vcm1zKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlpbnQgZXJyOworCisJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKGZoKSB7CisJCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKKwkJCQkgICAgICBmaC0+cHJpbyk7CisJCWlmICgwICE9IGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGRldi0+dHZub3JtID09ICp0dm5vcm1zKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJY3gyNTgyMV9zZXRfdHZub3JtKGRldiwgKnR2bm9ybXMpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCW1lZHVzYV9zZXRfdmlkZW9zdGFuZGFyZChkZXYpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IGN4MjU4MjFfZW51bV9pbnB1dChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IHY0bDJfaW5wdXQgKmkpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbmFtZVtdID0geworCQlbQ1gyNTgyMV9WTVVYX0NPTVBPU0lURV0gPSAiQ29tcG9zaXRlIiwKKwkJW0NYMjU4MjFfVk1VWF9TVklERU9dID0gIlMtVmlkZW8iLAorCQlbQ1gyNTgyMV9WTVVYX0RFQlVHXSA9ICJmb3IgZGVidWcgb25seSIsCisJfTsKKwl1bnNpZ25lZCBpbnQgbjsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwluID0gaS0+aW5kZXg7CisJaWYgKG4gPj0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoMCA9PSBJTlBVVChuKS0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwlzdHJjcHkoaS0+bmFtZSwgaW5hbWVbSU5QVVQobiktPnR5cGVdKTsKKworCWktPnN0ZCA9IENYMjU4MjFfTk9STVM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICAgc3RydWN0IHY0bDJfaW5wdXQgKmkpCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIGN4MjU4MjFfZW51bV9pbnB1dChkZXYsIGkpOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7CisKKwkqaSA9IGRldi0+aW5wdXQ7CisJZHByaW50aygxLCAiJXMoKTogcmV0dXJucyAlZFxuIiwgX19mdW5jX18sICppKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlpbnQgZXJyOworCisJZHByaW50aygxLCAiJXMoJWQpXG4iLCBfX2Z1bmNfXywgaSk7CisKKwlpZiAoZmgpIHsKKwkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAorCQkJCSAgICAgIGZoLT5wcmlvKTsKKwkJaWYgKDAgIT0gZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoaSA+PSBDWDI1ODIxX05SX0lOUFVUKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IC1FSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwljeDI1ODIxX3ZpZGVvX211eChkZXYsIGkpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFRVTkVSX0ZMQUcKK2ludCBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisKKwlmLT5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7CisKKwljeDI1ODIxX2NhbGxfYWxsKGRldiwgdHVuZXIsIGdfZnJlcXVlbmN5LCBmKTsKKworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV9zZXRfZnJlcShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJZGV2LT5mcmVxID0gZi0+ZnJlcXVlbmN5OworCisJY3gyNTgyMV9jYWxsX2FsbChkZXYsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgZik7CisKKwkvKiBXaGVuIGNoYW5naW5nIGNoYW5uZWxzIGl0IGlzIHJlcXVpcmVkIHRvIHJlc2V0IFRWQVVESU8gKi8KKwltc2xlZXAoMTApOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldjsKKwlpbnQgZXJyOworCisJaWYgKGZoKSB7CisJCWRldiA9IGZoLT5kZXY7CisJCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKKwkJCQkgICAgICBmaC0+cHJpbyk7CisJCWlmICgwICE9IGVycikKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJJbnZhbGlkIGZoIHBvaW50ZXIhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGN4MjU4MjFfc2V0X2ZyZXEoZGV2LCBmKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworaW50IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkgICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilmaCktPmRldjsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2hvc3QoJnJlZy0+bWF0Y2gpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBnX3JlZ2lzdGVyLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJICAgICAgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZmgpLT5kZXY7CisKKwlpZiAoIXY0bDJfY2hpcF9tYXRjaF9ob3N0KCZyZWctPm1hdGNoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgc19yZWdpc3RlciwgcmVnKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKKworI2lmZGVmIFRVTkVSX0ZMQUcKK2ludCBjeDI1ODIxX3ZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworCisJaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgwICE9IHQtPmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweSh0LT5uYW1lLCAiVGVsZXZpc2lvbiIpOworCXQtPnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTk9STTsKKwl0LT5yYW5nZWhpZ2ggPSAweGZmZmZmZmZmVUw7CisKKwl0LT5zaWduYWwgPSAweGZmZmY7CS8qIExPQ0tFRCAqLworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV92aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfdHVuZXIgKnQpCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCWludCBlcnI7CisKKwlpZiAoZmgpIHsKKwkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAorCQkJCSAgICAgIGZoLT5wcmlvKTsKKwkJaWYgKDAgIT0gZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJaWYgKFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKDAgIT0gdC0+aW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBub19jdGwgPSB7CisJLm5hbWUgPSAiNDIiLAorCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBjeDI1ODIxX2N0bHNbXSA9IHsKKwkvKiAtLS0gdmlkZW8gLS0tICovCisJeworCSAuaWQgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCSAubmFtZSA9ICJCcmlnaHRuZXNzIiwKKwkgLm1pbmltdW0gPSAwLAorCSAubWF4aW11bSA9IDEwMDAwLAorCSAuc3RlcCA9IDEsCisJIC5kZWZhdWx0X3ZhbHVlID0gNjIwMCwKKwkgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSB9LCB7CisJICAgICAuaWQgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkgICAgIC5uYW1lID0gIkNvbnRyYXN0IiwKKwkgICAgIC5taW5pbXVtID0gMCwKKwkgICAgIC5tYXhpbXVtID0gMTAwMDAsCisJICAgICAuc3RlcCA9IDEsCisJICAgICAuZGVmYXVsdF92YWx1ZSA9IDUwMDAsCisJICAgICAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgICB9LCB7CisJCSAuaWQgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAorCQkgLm5hbWUgPSAiU2F0dXJhdGlvbiIsCisJCSAubWluaW11bSA9IDAsCisJCSAubWF4aW11bSA9IDEwMDAwLAorCQkgLnN0ZXAgPSAxLAorCQkgLmRlZmF1bHRfdmFsdWUgPSA1MDAwLAorCQkgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkgfSwgeworCQkgICAgIC5pZCA9IFY0TDJfQ0lEX0hVRSwKKwkJICAgICAubmFtZSA9ICJIdWUiLAorCQkgICAgIC5taW5pbXVtID0gMCwKKwkJICAgICAubWF4aW11bSA9IDEwMDAwLAorCQkgICAgIC5zdGVwID0gMSwKKwkJICAgICAuZGVmYXVsdF92YWx1ZSA9IDUwMDAsCisJCSAgICAgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkgICAgIH0KK307CitzdGF0aWMgY29uc3QgaW50IENYMjU4MjFfQ1RMUyA9IEFSUkFZX1NJWkUoY3gyNTgyMV9jdGxzKTsKKworc3RhdGljIGludCBjeDI1ODIxX2N0cmxfcXVlcnkoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKK3sKKwlpbnQgaTsKKworCWlmIChxY3RybC0+aWQgPCBWNEwyX0NJRF9CQVNFIHx8IHFjdHJsLT5pZCA+PSBWNEwyX0NJRF9MQVNUUDEpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAoaSA9IDA7IGkgPCBDWDI1ODIxX0NUTFM7IGkrKykKKwkJaWYgKGN4MjU4MjFfY3Rsc1tpXS5pZCA9PSBxY3RybC0+aWQpCisJCQlicmVhazsKKwlpZiAoaSA9PSBDWDI1ODIxX0NUTFMpIHsKKwkJKnFjdHJsID0gbm9fY3RsOworCQlyZXR1cm4gMDsKKwl9CisJKnFjdHJsID0gY3gyNTgyMV9jdGxzW2ldOworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkgICAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCit7CisJcmV0dXJuIGN4MjU4MjFfY3RybF9xdWVyeShxY3RybCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVklERU8gQ1RSTCBJT0NUTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmxfYnlfaWQodW5zaWduZWQgaW50IGlkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKQorCQlpZiAoY3gyNTgyMV9jdGxzW2ldLmlkID09IGlkKQorCQkJcmV0dXJuIGN4MjU4MjFfY3RscyArIGk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisKKwljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmw7CisKKwljdHJsID0gY3RybF9ieV9pZChjdGwtPmlkKTsKKworCWlmIChOVUxMID09IGN0cmwpCisJCXJldHVybiAtRUlOVkFMOworCXN3aXRjaCAoY3RsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9icmlnaHQ7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX2h1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9jb250cmFzdDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX3NhdHVyYXRpb247CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfc2V0X2NvbnRyb2woc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwsIGludCBjaGFuX251bSkKK3sKKwlpbnQgZXJyOworCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybDsKKworCWVyciA9IC1FSU5WQUw7CisKKwljdHJsID0gY3RybF9ieV9pZChjdGwtPmlkKTsKKworCWlmIChOVUxMID09IGN0cmwpCisJCXJldHVybiBlcnI7CisKKwlzd2l0Y2ggKGN0cmwtPnR5cGUpIHsKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU46CisJY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgorCWNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKKwkJaWYgKGN0bC0+dmFsdWUgPCBjdHJsLT5taW5pbXVtKQorCQkJY3RsLT52YWx1ZSA9IGN0cmwtPm1pbmltdW07CisJCWlmIChjdGwtPnZhbHVlID4gY3RybC0+bWF4aW11bSkKKwkJCWN0bC0+dmFsdWUgPSBjdHJsLT5tYXhpbXVtOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBub3RoaW5nICovIDsKKwl9CisKKwlzd2l0Y2ggKGN0bC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9icmlnaHQgPSBjdGwtPnZhbHVlOworCQltZWR1c2Ffc2V0X2JyaWdodG5lc3MoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5jdGxfaHVlID0gY3RsLT52YWx1ZTsKKwkJbWVkdXNhX3NldF9odWUoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9jb250cmFzdCA9IGN0bC0+dmFsdWU7CisJCW1lZHVzYV9zZXRfY29udHJhc3QoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJZGV2LT5jaGFubmVsc1tjaGFuX251bV0uY3RsX3NhdHVyYXRpb24gPSBjdGwtPnZhbHVlOworCQltZWR1c2Ffc2V0X3NhdHVyYXRpb24oZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CisJCWJyZWFrOworCX0KKworCWVyciA9IDA7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBjeDI1ODIxX2luaXRfY29udHJvbHMoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSkKK3sKKwlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKSB7CisJCWN0cmwuaWQgPSBjeDI1ODIxX2N0bHNbaV0uaWQ7CisJCWN0cmwudmFsdWUgPSBjeDI1ODIxX2N0bHNbaV0uZGVmYXVsdF92YWx1ZTsKKworCQljeDI1ODIxX3NldF9jb250cm9sKGRldiwgJmN0cmwsIGNoYW5fbnVtKTsKKwl9Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworCisJaWYgKGNyb3BjYXAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwljcm9wY2FwLT5ib3VuZHMudG9wID0gY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOworCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IDcyMDsKKwljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gZGV2LT50dm5vcm0gPT0gVjRMMl9TVERfUEFMX0JHID8gNTc2IDogNDgwOworCWNyb3BjYXAtPnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9CisJCWRldi0+dHZub3JtID09IFY0TDJfU1REX1BBTF9CRyA/IDU5IDogMTA7CisJY3JvcGNhcC0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPQorCQlkZXYtPnR2bm9ybSA9PSBWNEwyX1NURF9QQUxfQkcgPyA1NCA6IDExOworCWNyb3BjYXAtPmRlZnJlY3QgPSBjcm9wY2FwLT5ib3VuZHM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19zX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCWludCBlcnI7CisKKwlpZiAoZmgpIHsKKwkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAorCQkJCSAgICAgIGZoLT5wcmlvKTsKKwkJaWYgKDAgIT0gZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJLyogY3gyNTgyMV92aWRpb2Nfc19jcm9wIG5vdCBzdXBwb3J0ZWQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGN4MjU4MjFfdmlkaW9jX2dfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY3JvcCAqY3JvcCkKK3sKKwkvKiBjeDI1ODIxX3ZpZGlvY19nX2Nyb3Agbm90IHN1cHBvcnRlZCAqLworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfcXVlcnlzdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICogbm9ybSkKK3sKKwkvKiBtZWR1c2EgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBzdGFuZGFyZCBzZW5zaW5nIG9mIGN1cnJlbnQgaW5wdXQgKi8KKwkqbm9ybSA9IENYMjU4MjFfTk9STVM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgodTMyIHdpZHRoLCB2NGwyX3N0ZF9pZCB0dm5vcm0pCit7CisJaWYgKHR2bm9ybSA9PSBWNEwyX1NURF9QQUxfQkcpIHsKKwkJaWYgKHdpZHRoID09IDM1MiB8fCB3aWR0aCA9PSA3MjApCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKHR2bm9ybSA9PSBWNEwyX1NURF9OVFNDX00pIHsKKwkJaWYgKHdpZHRoID09IDMyMCB8fCB3aWR0aCA9PSAzNTIgfHwgd2lkdGggPT0gNzIwKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KHUzMiBoZWlnaHQsIHY0bDJfc3RkX2lkIHR2bm9ybSkKK3sKKwlpZiAodHZub3JtID09IFY0TDJfU1REX1BBTF9CRykgeworCQlpZiAoaGVpZ2h0ID09IDU3NiB8fCBoZWlnaHQgPT0gMjg4KQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCWlmICh0dm5vcm0gPT0gVjRMMl9TVERfTlRTQ19NKSB7CisJCWlmIChoZWlnaHQgPT0gNDgwIHx8IGhlaWdodCA9PSAyNDApCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKwlpbnQgY29tbWFuZCA9IDA7CisJc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKKworCWRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKKworCWlmICghZGF0YV9mcm9tX3VzZXIpIHsKKwkJcHJfZXJyKCIlcygpOiBVcHN0cmVhbSBkYXRhIGlzIElOVkFMSUQuIFJldHVybmluZ1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwljb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CisKKwlpZiAoY29tbWFuZCAhPSBVUFNUUkVBTV9TVEFSVF9WSURFTyAmJiBjb21tYW5kICE9IFVQU1RSRUFNX1NUT1BfVklERU8pCisJCXJldHVybiAwOworCisJZGV2LT5pbnB1dF9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKKwlkZXYtPmlucHV0X2F1ZGlvZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7CisJZGV2LT52aWRfc3RkbmFtZSA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKKwlkZXYtPnBpeGVsX2Zvcm1hdCA9IGRhdGFfZnJvbV91c2VyLT5waXhlbF9mb3JtYXQ7CisJZGV2LT5jaGFubmVsX3NlbGVjdCA9IGRhdGFfZnJvbV91c2VyLT5jaGFubmVsX3NlbGVjdDsKKwlkZXYtPmNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgVVBTVFJFQU1fU1RBUlRfVklERU86CisJCWN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gxKGRldiwgZGF0YV9mcm9tX3VzZXIpOworCQlicmVhazsKKworCWNhc2UgVVBTVFJFQU1fU1RPUF9WSURFTzoKKwkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMShkZXYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfdXBzdHJlYW0xMChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJaW50IGNvbW1hbmQgPSAwOworCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7CisKKwlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7CisKKwlpZiAoIWRhdGFfZnJvbV91c2VyKSB7CisJCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCisJaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfVklERU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX1ZJREVPKQorCQlyZXR1cm4gMDsKKworCWRldi0+aW5wdXRfZmlsZW5hbWVfY2gyID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOworCWRldi0+aW5wdXRfYXVkaW9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKKwlkZXYtPnZpZF9zdGRuYW1lX2NoMiA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKKwlkZXYtPnBpeGVsX2Zvcm1hdF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OworCWRldi0+Y2hhbm5lbF9zZWxlY3RfY2gyID0gZGF0YV9mcm9tX3VzZXItPmNoYW5uZWxfc2VsZWN0OworCWRldi0+Y29tbWFuZF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgVVBTVFJFQU1fU1RBUlRfVklERU86CisJCWN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gyKGRldiwgZGF0YV9mcm9tX3VzZXIpOworCQlicmVhazsKKworCWNhc2UgVVBTVFJFQU1fU1RPUF9WSURFTzoKKwkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMihkZXYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfdXBzdHJlYW0xMShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJaW50IGNvbW1hbmQgPSAwOworCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7CisKKwlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7CisKKwlpZiAoIWRhdGFfZnJvbV91c2VyKSB7CisJCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCisJaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfQVVESU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX0FVRElPKQorCQlyZXR1cm4gMDsKKworCWRldi0+aW5wdXRfZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7CisJZGV2LT5pbnB1dF9hdWRpb2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOworCWRldi0+dmlkX3N0ZG5hbWUgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7CisJZGV2LT5waXhlbF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OworCWRldi0+Y2hhbm5lbF9zZWxlY3QgPSBkYXRhX2Zyb21fdXNlci0+Y2hhbm5lbF9zZWxlY3Q7CisJZGV2LT5jb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFVQU1RSRUFNX1NUQVJUX0FVRElPOgorCQljeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKGRldiwgZGF0YV9mcm9tX3VzZXIpOworCQlicmVhazsKKworCWNhc2UgVVBTVFJFQU1fU1RPUF9BVURJTzoKKwkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX2F1ZGlvKGRldik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyB2aWRlb19pb2N0bF9zZXQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKKwlpbnQgY29tbWFuZDsKKwlpbnQgd2lkdGggPSA3MjA7CisJaW50IHNlbGVjdGVkX2NoYW5uZWwgPSAwLCBwaXhfZm9ybWF0ID0gMCwgaSA9IDA7CisJaW50IGNpZl9lbmFibGUgPSAwLCBjaWZfd2lkdGggPSAwOworCXUzMiB2YWx1ZSA9IDA7CisKKwlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgZG93bnN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKKworCWlmICghZGF0YV9mcm9tX3VzZXIpIHsKKwkJcHJfZXJyKCIlcygpOiBVc2VyIGRhdGEgaXMgSU5WQUxJRC4gUmV0dXJuaW5nXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKworCWlmIChjb21tYW5kICE9IFNFVF9WSURFT19TVEQgJiYgY29tbWFuZCAhPSBTRVRfUElYRUxfRk9STUFUCisJICAgJiYgY29tbWFuZCAhPSBFTkFCTEVfQ0lGX1JFU09MVVRJT04gJiYgY29tbWFuZCAhPSBSRUdfUkVBRAorCSAgICYmIGNvbW1hbmQgIT0gUkVHX1dSSVRFICYmIGNvbW1hbmQgIT0gTUVEVVNBX1JFQUQKKwkgICAmJiBjb21tYW5kICE9IE1FRFVTQV9XUklURSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFNFVF9WSURFT19TVEQ6CisJCWlmICghc3RyY21wKGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZSwgIlBBTCIpKQorCQkJZGV2LT50dm5vcm0gPSBWNEwyX1NURF9QQUxfQkc7CisJCWVsc2UKKwkJCWRldi0+dHZub3JtID0gVjRMMl9TVERfTlRTQ19NOworCQltZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QSVhFTF9GT1JNQVQ6CisJCXNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7CisJCXBpeF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OworCisJCWlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7CisJCQlzZWxlY3RlZF9jaGFubmVsIC09IDQ7CisJCQlzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7CisJCX0KKworCQlpZiAoc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKQorCQkJY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgc2VsZWN0ZWRfY2hhbm5lbCwKKwkJCQkJCXBpeF9mb3JtYXQpOworCisJCWJyZWFrOworCisJY2FzZSBFTkFCTEVfQ0lGX1JFU09MVVRJT046CisJCXNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7CisJCWNpZl9lbmFibGUgPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3Jlc29sdXRpb25fZW5hYmxlOworCQljaWZfd2lkdGggPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3dpZHRoOworCisJCWlmIChjaWZfZW5hYmxlKSB7CisJCQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcKKwkJCSAgICB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykgeworCQkJCXdpZHRoID0gMzUyOworCQkJfSBlbHNlIHsKKwkJCQl3aWR0aCA9IGNpZl93aWR0aDsKKwkJCQlpZiAoY2lmX3dpZHRoICE9IDMyMCAmJiBjaWZfd2lkdGggIT0gMzUyKQorCQkJCQl3aWR0aCA9IDMyMDsKKwkJCX0KKwkJfQorCisJCWlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7CisJCQlzZWxlY3RlZF9jaGFubmVsIC09IDQ7CisJCQlzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7CisJCX0KKworCQlpZiAoc2VsZWN0ZWRfY2hhbm5lbCA8PSA3ICYmIHNlbGVjdGVkX2NoYW5uZWwgPj0gMCkgeworCQkJZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS4KKwkJCQl1c2VfY2lmX3Jlc29sdXRpb24gPSBjaWZfZW5hYmxlOworCQkJZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS5jaWZfd2lkdGggPSB3aWR0aDsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBWSURfQ0hBTk5FTF9OVU07IGkrKykgeworCQkJCWRldi0+Y2hhbm5lbHNbaV0udXNlX2NpZl9yZXNvbHV0aW9uID0KKwkJCQkJY2lmX2VuYWJsZTsKKwkJCQlkZXYtPmNoYW5uZWxzW2ldLmNpZl93aWR0aCA9IHdpZHRoOworCQkJfQorCQl9CisKKwkJbWVkdXNhX3NldF9yZXNvbHV0aW9uKGRldiwgd2lkdGgsIHNlbGVjdGVkX2NoYW5uZWwpOworCQlicmVhazsKKwljYXNlIFJFR19SRUFEOgorCQlkYXRhX2Zyb21fdXNlci0+cmVnX2RhdGEgPSBjeF9yZWFkKGRhdGFfZnJvbV91c2VyLT5yZWdfYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgUkVHX1dSSVRFOgorCQljeF93cml0ZShkYXRhX2Zyb21fdXNlci0+cmVnX2FkZHJlc3MsIGRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTUVEVVNBX1JFQUQ6CisJCXZhbHVlID0gY3gyNTgyMV9pMmNfcmVhZCgmZGV2LT5pMmNfYnVzWzBdLAorCQkJCQkgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAorCQkJCQkgJmRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTUVEVVNBX1dSSVRFOgorCQljeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLAorCQkJCSAgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAorCQkJCSAgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGN4MjU4MjFfdmlkZW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50ICByZXQgPSAwOworCisJc3RydWN0IGN4MjU4MjFfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgaXQncyB0aGUgdmlkZW8gdXBzdHJlYW0gKi8KKwlpZiAoZmgtPmNoYW5uZWxfaWQgPT0gU1JBTV9DSDA5KSB7CisJCXJldCA9IHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTApIHsKKwkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMChmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTEpIHsKKwkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMShmaWxlLCBjbWQsIGFyZyk7CisJCXJldCA9IHZpZGVvX2lvY3RsX3NldChmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHZpZGVvX2lvY3RsMihmaWxlLCBjbWQsIGFyZyk7Cit9CisKKy8qIGV4cG9ydGVkIHN0dWZmICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB2aWRlb19vcGVuLAorCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKKwkucmVhZCA9IHZpZGVvX3JlYWQsCisJLnBvbGwgPSB2aWRlb19wb2xsLAorCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAorCS5pb2N0bCA9IGN4MjU4MjFfdmlkZW9faW9jdGwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKKyNpZmRlZiBUVU5FUl9GTEFHCisJLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAorCS52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKKyNlbmRpZgorCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCisJLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCisJLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCisJLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAorCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCisJLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKKyNpZmRlZiBUVU5FUl9GTEFHCisJLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKKwkudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAorI2VuZGlmCit9OworCitzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9pb2N0bF90ZW1wbGF0ZSA9IHsKKwkubmFtZSA9ICJjeDI1ODIxLXZpZGVvaW9jdGwiLAorCS5mb3BzID0gJnZpZGVvX2ZvcHMsCisJLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCisJLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAorCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS12aWRlby5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJkMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEuaApAQCAtMCwwICsxLDYxNyBAQAorLyoKKyAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KKyAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+CisgKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgQ1gyNTgyMV9IXworI2RlZmluZSBDWDI1ODIxX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS90dmVlcHJvbS5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWR2Yi5oPgorCisjaW5jbHVkZSAiYnRjeC1yaXNjLmgiCisjaW5jbHVkZSAiY3gyNTgyMS1yZWcuaCIKKyNpbmNsdWRlICJjeDI1ODIxLW1lZHVzYS1yZWcuaCIKKyNpbmNsdWRlICJjeDI1ODIxLXNyYW0uaCIKKyNpbmNsdWRlICJjeDI1ODIxLWF1ZGlvLmgiCisjaW5jbHVkZSAibWVkaWEvY3gyMzQxeC5oIgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNkZWZpbmUgQ1gyNTgyMV9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgMTA2KQorCisjZGVmaW5lIFVOU0VUICgtMVUpCisjZGVmaW5lIE5PX1NZTkNfTElORSAoLTFVKQorCisjZGVmaW5lIENYMjU4MjFfTUFYQk9BUkRTIDIKKworI2RlZmluZSBUUlVFICAgIDEKKyNkZWZpbmUgRkFMU0UgICAwCisjZGVmaW5lIExJTkVfU0laRV9EMSAgICAxNDQwCisKKy8qIE51bWJlciBvZiBkZWNvZGVycyBhbmQgZW5jb2RlcnMgKi8KKyNkZWZpbmUgTUFYX0RFQ09ERVJTICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfRU5DT0RFUlMgICAgICAgICAgICAyCisjZGVmaW5lIFFVQURfREVDT0RFUlMgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX0NBTUVSQVMgICAgICAgICAgICAgMTYKKworLyogTWF4IG51bWJlciBvZiBpbnB1dHMgYnkgY2FyZCAqLworI2RlZmluZSBNQVhfQ1gyNTgyMV9JTlBVVCA4CisjZGVmaW5lIElOUFVUKG5yKSAoJmN4MjU4MjFfYm9hcmRzW2Rldi0+Ym9hcmRdLmlucHV0W25yXSkKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8wICAgICAgIDEKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8xICAgICAgIDIKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8yICAgICAgIDQKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8zICAgICAgIDgKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU80ICAgICAgIDE2CisjZGVmaW5lIFJFU09VUkNFX1ZJREVPNSAgICAgICAzMgorI2RlZmluZSBSRVNPVVJDRV9WSURFTzYgICAgICAgNjQKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU83ICAgICAgIDEyOAorI2RlZmluZSBSRVNPVVJDRV9WSURFTzggICAgICAgMjU2CisjZGVmaW5lIFJFU09VUkNFX1ZJREVPOSAgICAgICA1MTIKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8xMCAgICAgIDEwMjQKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8xMSAgICAgIDIwNDgKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU9fSU9DVEwgIDQwOTYKKworI2RlZmluZSBCVUZGRVJfVElNRU9VVCAgICAgKEhaKQkvKiAwLjUgc2Vjb25kcyAqLworCisjZGVmaW5lIFVOS05PV05fQk9BUkQgICAgICAgMAorI2RlZmluZSBDWDI1ODIxX0JPQVJEICAgICAgICAxCisKKy8qIEN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLworI2RlZmluZSBDWDI1ODIxX05PUk1TIChcCisJVjRMMl9TVERfTlRTQ19NIHwgIFY0TDJfU1REX05UU0NfTV9KUCB8IFY0TDJfU1REX05UU0NfTV9LUiB8IFwKKwlWNEwyX1NURF9QQUxfQkcgfCAgVjRMMl9TVERfUEFMX0RLICAgIHwgIFY0TDJfU1REX1BBTF9JICAgIHwgXAorCVY0TDJfU1REX1BBTF9NICB8ICBWNEwyX1NURF9QQUxfTiAgICAgfCAgVjRMMl9TVERfUEFMX0ggICAgfCBcCisJVjRMMl9TVERfUEFMX05jKQorCisjZGVmaW5lIENYMjU4MjFfQk9BUkRfQ09ORVhBTlRfQVRIRU5BMTAgMQorI2RlZmluZSBNQVhfVklEX0NIQU5ORUxfTlVNICAgICAxMgorI2RlZmluZSBWSURfQ0hBTk5FTF9OVU0gOAorI2RlZmluZSBDWDI1ODIxX05SX0lOUFVUIDIKKworc3RydWN0IGN4MjU4MjFfZm10IHsKKwljaGFyICpuYW1lOworCXUzMiBmb3VyY2M7CQkvKiB2NGwyIGZvcm1hdCBpZCAqLworCWludCBkZXB0aDsKKwlpbnQgZmxhZ3M7CisJdTMyIGN4Zm9ybWF0OworfTsKKworc3RydWN0IGN4MjU4MjFfY3RybCB7CisJc3RydWN0IHY0bDJfcXVlcnljdHJsIHY7CisJdTMyIG9mZjsKKwl1MzIgcmVnOworCXUzMiBtYXNrOworCXUzMiBzaGlmdDsKK307CisKK3N0cnVjdCBjeDI1ODIxX3R2bm9ybSB7CisJY2hhciAqbmFtZTsKKwl2NGwyX3N0ZF9pZCBpZDsKKwl1MzIgY3hpZm9ybWF0OworCXUzMiBjeG9mb3JtYXQ7Cit9OworCitzdHJ1Y3QgY3gyNTgyMV9maCB7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXY7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJaW50IHJhZGlvOworCXUzMiByZXNvdXJjZXM7CisKKwllbnVtIHY0bDJfcHJpb3JpdHkgcHJpbzsKKworCS8qIHZpZGVvIG92ZXJsYXkgKi8KKwlzdHJ1Y3QgdjRsMl93aW5kb3cgd2luOworCXN0cnVjdCB2NGwyX2NsaXAgKmNsaXBzOworCXVuc2lnbmVkIGludCBuY2xpcHM7CisKKwkvKiB2aWRlbyBjYXB0dXJlICovCisJc3RydWN0IGN4MjU4MjFfZm10ICpmbXQ7CisJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGNoYW5uZWxfaWQ7CisKKwkvKiB2YmkgY2FwdHVyZSAqLworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSB2aWRxOworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSB2YmlxOworCisJLyogSDI2NCBFbmNvZGVyIHNwZWNpZmljcyBPTkxZICovCisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlIG1wZWdxOworCWF0b21pY190IHY0bF9yZWFkaW5nOworfTsKKworZW51bSBjeDI1ODIxX2l0eXBlIHsKKwlDWDI1ODIxX1ZNVVhfQ09NUE9TSVRFID0gMSwKKwlDWDI1ODIxX1ZNVVhfU1ZJREVPLAorCUNYMjU4MjFfVk1VWF9ERUJVRywKKwlDWDI1ODIxX1JBRElPLAorfTsKKworZW51bSBjeDI1ODIxX3NyY19zZWxfdHlwZSB7CisJQ1gyNTgyMV9TUkNfU0VMX0VYVF82NTZfVklERU8gPSAwLAorCUNYMjU4MjFfU1JDX1NFTF9QQVJBTExFTF9NUEVHX1ZJREVPCit9OworCisvKiBidWZmZXIgZm9yIG9uZSB2aWRlbyBmcmFtZSAqLworc3RydWN0IGN4MjU4MjFfYnVmZmVyIHsKKwkvKiBjb21tb24gdjRsIGJ1ZmZlciBzdHVmZiAtLSBtdXN0IGJlIGZpcnN0ICovCisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciB2YjsKKworCS8qIGN4MjU4MjEgc3BlY2lmaWMgKi8KKwl1bnNpZ25lZCBpbnQgYnBsOworCXN0cnVjdCBidGN4X3Jpc2NtZW0gcmlzYzsKKwlzdHJ1Y3QgY3gyNTgyMV9mbXQgKmZtdDsKKwl1MzIgY291bnQ7Cit9OworCitzdHJ1Y3QgY3gyNTgyMV9pbnB1dCB7CisJZW51bSBjeDI1ODIxX2l0eXBlIHR5cGU7CisJdW5zaWduZWQgaW50IHZtdXg7CisJdTMyIGdwaW8wLCBncGlvMSwgZ3BpbzIsIGdwaW8zOworfTsKKworZW51bSBwb3J0IHsKKwlDWDI1ODIxX1VOREVGSU5FRCA9IDAsCisJQ1gyNTgyMV9SQVcsCisJQ1gyNTgyMV8yNjQKK307CisKK3N0cnVjdCBjeDI1ODIxX2JvYXJkIHsKKwljaGFyICpuYW1lOworCWVudW0gcG9ydCBwb3J0YTsKKwllbnVtIHBvcnQgcG9ydGI7CisJZW51bSBwb3J0IHBvcnRjOworCXVuc2lnbmVkIGludCB0dW5lcl90eXBlOworCXVuc2lnbmVkIGludCByYWRpb190eXBlOworCXVuc2lnbmVkIGNoYXIgdHVuZXJfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHJhZGlvX2FkZHI7CisKKwl1MzIgY2xrX2ZyZXE7CisJc3RydWN0IGN4MjU4MjFfaW5wdXQgaW5wdXRbQ1gyNTgyMV9OUl9JTlBVVF07Cit9OworCitzdHJ1Y3QgY3gyNTgyMV9zdWJpZCB7CisJdTE2IHN1YnZlbmRvcjsKKwl1MTYgc3ViZGV2aWNlOworCXUzMiBjYXJkOworfTsKKworc3RydWN0IGN4MjU4MjFfaTJjIHsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldjsKKworCWludCBucjsKKworCS8qIGkyYyBpL28gKi8KKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXA7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGkyY19hbGdvOworCXN0cnVjdCBpMmNfY2xpZW50IGkyY19jbGllbnQ7CisJdTMyIGkyY19yYzsKKworCS8qIGN4MjU4MjEgcmVnaXN0ZXJzIHVzZWQgZm9yIHJhdyBhZGRlc3MgKi8KKwl1MzIgaTJjX3BlcmlvZDsKKwl1MzIgcmVnX2N0cmw7CisJdTMyIHJlZ19zdGF0OworCXUzMiByZWdfYWRkcjsKKwl1MzIgcmVnX3JkYXRhOworCXUzMiByZWdfd2RhdGE7Cit9OworCitzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSB7CisJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmU7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZWQ7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZW91dDsKKwlzdHJ1Y3QgYnRjeF9yaXNjbWVtIHN0b3BwZXI7CisJdTMyIGNvdW50OworfTsKKworc3RydWN0IGN4MjU4MjFfZGF0YSB7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXY7CisJc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbDsKK307CisKK3N0cnVjdCBjeDI1ODIxX2NoYW5uZWwgeworCXN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgcHJpbzsKKworCWludCBjdGxfYnJpZ2h0OworCWludCBjdGxfY29udHJhc3Q7CisJaW50IGN0bF9odWU7CisJaW50IGN0bF9zYXR1cmF0aW9uOworCXN0cnVjdCBjeDI1ODIxX2RhdGEgdGltZW91dF9kYXRhOworCisJc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2OworCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlIHZpZHE7CisKKwlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoYW5uZWxzOworCisJc3RydWN0IG11dGV4IGxvY2s7CisJaW50IHJlc291cmNlczsKKworCWludCBwaXhlbF9mb3JtYXRzOworCWludCB1c2VfY2lmX3Jlc29sdXRpb247CisJaW50IGNpZl93aWR0aDsKK307CisKK3N0cnVjdCBjeDI1ODIxX2RldiB7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZsaXN0OworCWF0b21pY190IHJlZmNvdW50OworCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKKworCS8qIHBjaSBzdHVmZiAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJdW5zaWduZWQgY2hhciBwY2lfcmV2LCBwY2lfbGF0OworCWludCBwY2lfYnVzLCBwY2lfc2xvdDsKKwl1MzIgYmFzZV9pb19hZGRyOworCXUzMiBfX2lvbWVtICpsbW1pbzsKKwl1OCBfX2lvbWVtICpibW1pbzsKKwlpbnQgcGNpX2lycW1hc2s7CisJaW50IGh3cmV2aXNpb247CisKKwl1MzIgY2xrX2ZyZXE7CisKKwkvKiBJMkMgYWRhcHRlcnM6IE1hc3RlciAxICYgMiAoRXh0ZXJuYWwpICYgTWFzdGVyIDMgKEludGVybmFsIG9ubHkpICovCisJc3RydWN0IGN4MjU4MjFfaTJjIGkyY19idXNbM107CisKKwlpbnQgbnI7CisJc3RydWN0IG11dGV4IGxvY2s7CisKKwlzdHJ1Y3QgY3gyNTgyMV9jaGFubmVsIGNoYW5uZWxzW01BWF9WSURfQ0hBTk5FTF9OVU1dOworCisJLyogYm9hcmQgZGV0YWlscyAqLworCXVuc2lnbmVkIGludCBib2FyZDsKKwljaGFyIG5hbWVbMzJdOworCisJLyogQW5hbG9nIHZpZGVvICovCisJdTMyIHJlc291cmNlczsKKwl1bnNpZ25lZCBpbnQgaW5wdXQ7CisJdTMyIHR2YXVkaW87CisJdjRsMl9zdGRfaWQgdHZub3JtOworCXVuc2lnbmVkIGludCB0dW5lcl90eXBlOworCXVuc2lnbmVkIGNoYXIgdHVuZXJfYWRkcjsKKwl1bnNpZ25lZCBpbnQgcmFkaW9fdHlwZTsKKwl1bnNpZ25lZCBjaGFyIHJhZGlvX2FkZHI7CisJdW5zaWduZWQgaW50IGhhc19yYWRpbzsKKwl1bnNpZ25lZCBpbnQgdmlkZWNfdHlwZTsKKwl1bnNpZ25lZCBjaGFyIHZpZGVjX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgX21heF9udW1fZGVjb2RlcnM7CisKKwkvKiBBbmFsb2cgQXVkaW8gVXBzdHJlYW0gKi8KKwlpbnQgX2F1ZGlvX2lzX3J1bm5pbmc7CisJaW50IF9hdWRpb3BpeGVsX2Zvcm1hdDsKKwlpbnQgX2lzX2ZpcnN0X2F1ZGlvX2ZyYW1lOworCWludCBfYXVkaW9maWxlX3N0YXR1czsKKwlpbnQgX2F1ZGlvX2xpbmVzX2NvdW50OworCWludCBfYXVkaW9mcmFtZV9jb3VudDsKKwlpbnQgX2F1ZGlvX3Vwc3RyZWFtX2NoYW5uZWw7CisJaW50IF9sYXN0X2luZGV4X2lycTsgICAgLyogVGhlIGxhc3QgaW50ZXJydXB0IGluZGV4IHByb2Nlc3NlZC4gKi8KKworCV9fbGUzMiAqX3Jpc2NfYXVkaW9fam1wX2FkZHI7CisJX19sZTMyICpfcmlzY192aXJ0X3N0YXJ0X2FkZHI7CisJX19sZTMyICpfcmlzY192aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCBfcmlzY19waHlzX2FkZHI7CisJZG1hX2FkZHJfdCBfcmlzY19waHlzX3N0YXJ0X2FkZHI7CisKKwl1bnNpZ25lZCBpbnQgX2F1ZGlvcmlzY19zaXplOworCXVuc2lnbmVkIGludCBfYXVkaW9kYXRhX2J1Zl9zaXplOworCV9fbGUzMiAqX2F1ZGlvZGF0YV9idWZfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgX2F1ZGlvZGF0YV9idWZfcGh5c19hZGRyOworCWNoYXIgKl9hdWRpb2ZpbGVuYW1lOworCisJLyogVjRsICovCisJdTMyIGZyZXE7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmJpX2RldjsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpyYWRpb19kZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSAqaW9jdGxfZGV2OworCisJc3BpbmxvY2tfdCBzbG9jazsKKworCS8qIFZpZGVvIFVwc3RyZWFtICovCisJaW50IF9saW5lX3NpemU7CisJaW50IF9wcm9nX2NudDsKKwlpbnQgX3BpeGVsX2Zvcm1hdDsKKwlpbnQgX2lzX2ZpcnN0X2ZyYW1lOworCWludCBfaXNfcnVubmluZzsKKwlpbnQgX2ZpbGVfc3RhdHVzOworCWludCBfbGluZXNfY291bnQ7CisJaW50IF9mcmFtZV9jb3VudDsKKwlpbnQgX2NoYW5uZWxfdXBzdHJlYW1fc2VsZWN0OworCXVuc2lnbmVkIGludCBfcmlzY19zaXplOworCisJX19sZTMyICpfZG1hX3ZpcnRfc3RhcnRfYWRkcjsKKwlfX2xlMzIgKl9kbWFfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgX2RtYV9waHlzX2FkZHI7CisJZG1hX2FkZHJfdCBfZG1hX3BoeXNfc3RhcnRfYWRkcjsKKworCXVuc2lnbmVkIGludCBfZGF0YV9idWZfc2l6ZTsKKwlfX2xlMzIgKl9kYXRhX2J1Zl92aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCBfZGF0YV9idWZfcGh5c19hZGRyOworCWNoYXIgKl9maWxlbmFtZTsKKwljaGFyICpfZGVmYXVsdG5hbWU7CisKKwlpbnQgX2xpbmVfc2l6ZV9jaDI7CisJaW50IF9wcm9nX2NudF9jaDI7CisJaW50IF9waXhlbF9mb3JtYXRfY2gyOworCWludCBfaXNfZmlyc3RfZnJhbWVfY2gyOworCWludCBfaXNfcnVubmluZ19jaDI7CisJaW50IF9maWxlX3N0YXR1c19jaDI7CisJaW50IF9saW5lc19jb3VudF9jaDI7CisJaW50IF9mcmFtZV9jb3VudF9jaDI7CisJaW50IF9jaGFubmVsMl91cHN0cmVhbV9zZWxlY3Q7CisJdW5zaWduZWQgaW50IF9yaXNjX3NpemVfY2gyOworCisJX19sZTMyICpfZG1hX3ZpcnRfc3RhcnRfYWRkcl9jaDI7CisJX19sZTMyICpfZG1hX3ZpcnRfYWRkcl9jaDI7CisJZG1hX2FkZHJfdCBfZG1hX3BoeXNfYWRkcl9jaDI7CisJZG1hX2FkZHJfdCBfZG1hX3BoeXNfc3RhcnRfYWRkcl9jaDI7CisKKwl1bnNpZ25lZCBpbnQgX2RhdGFfYnVmX3NpemVfY2gyOworCV9fbGUzMiAqX2RhdGFfYnVmX3ZpcnRfYWRkcl9jaDI7CisJZG1hX2FkZHJfdCBfZGF0YV9idWZfcGh5c19hZGRyX2NoMjsKKwljaGFyICpfZmlsZW5hbWVfY2gyOworCWNoYXIgKl9kZWZhdWx0bmFtZV9jaDI7CisKKwkvKiBNUEVHIEVuY29kZXIgT05MWSBzZXR0aW5ncyAqLworCXUzMiBjeDIzNDE3X21haWxib3g7CisJc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgbXBlZ19wYXJhbXM7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdjRsX2RldmljZTsKKwlhdG9taWNfdCB2NGxfcmVhZGVyX2NvdW50OworCXN0cnVjdCBjeDI1ODIxX3R2bm9ybSBlbmNvZGVybm9ybTsKKworCXUzMiB1cHN0cmVhbV9yaXNjYnVmX3NpemU7CisJdTMyIHVwc3RyZWFtX2RhdGFidWZfc2l6ZTsKKwl1MzIgdXBzdHJlYW1fcmlzY2J1Zl9zaXplX2NoMjsKKwl1MzIgdXBzdHJlYW1fZGF0YWJ1Zl9zaXplX2NoMjsKKwl1MzIgYXVkaW9fdXBzdHJlYW1fcmlzY2J1Zl9zaXplOworCXUzMiBhdWRpb191cHN0cmVhbV9kYXRhYnVmX3NpemU7CisJaW50IF9pc05UU0M7CisJaW50IF9mcmFtZV9pbmRleDsKKwlpbnQgX2F1ZGlvZnJhbWVfaW5kZXg7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9pcnFfcXVldWVzOworCXN0cnVjdCB3b3JrX3N0cnVjdCBfaXJxX3dvcmtfZW50cnk7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9pcnFfcXVldWVzX2NoMjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgX2lycV93b3JrX2VudHJ5X2NoMjsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqX2lycV9hdWRpb19xdWV1ZXM7CisJc3RydWN0IHdvcmtfc3RydWN0IF9hdWRpb193b3JrX2VudHJ5OworCWNoYXIgKmlucHV0X2ZpbGVuYW1lOworCWNoYXIgKmlucHV0X2ZpbGVuYW1lX2NoMjsKKwlpbnQgX2ZyYW1lX2luZGV4X2NoMjsKKwlpbnQgX2lzTlRTQ19jaDI7CisJY2hhciAqdmlkX3N0ZG5hbWVfY2gyOworCWludCBwaXhlbF9mb3JtYXRfY2gyOworCWludCBjaGFubmVsX3NlbGVjdF9jaDI7CisJaW50IGNvbW1hbmRfY2gyOworCWNoYXIgKmlucHV0X2F1ZGlvZmlsZW5hbWU7CisJY2hhciAqdmlkX3N0ZG5hbWU7CisJaW50IHBpeGVsX2Zvcm1hdDsKKwlpbnQgY2hhbm5lbF9zZWxlY3Q7CisJaW50IGNvbW1hbmQ7CisJaW50IGNoYW5uZWxfb3BlbmVkOworfTsKKworc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0IHsKKwljaGFyICppbnB1dF9maWxlbmFtZTsKKwljaGFyICp2aWRfc3RkbmFtZTsKKwlpbnQgcGl4ZWxfZm9ybWF0OworCWludCBjaGFubmVsX3NlbGVjdDsKKwlpbnQgY29tbWFuZDsKK307CisKK3N0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0IHsKKwljaGFyICp2aWRfc3RkbmFtZTsKKwlpbnQgcGl4ZWxfZm9ybWF0OworCWludCBjaWZfcmVzb2x1dGlvbl9lbmFibGU7CisJaW50IGNpZl93aWR0aDsKKwlpbnQgZGVjb2Rlcl9zZWxlY3Q7CisJaW50IGNvbW1hbmQ7CisJaW50IHJlZ19hZGRyZXNzOworCWludCByZWdfZGF0YTsKK307CisKK2V4dGVybiBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKnVwX2RhdGE7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGN4MjU4MjFfZGV2ICpnZXRfY3gyNTgyMShzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YodjRsMl9kZXYsIHN0cnVjdCBjeDI1ODIxX2RldiwgdjRsMl9kZXYpOworfQorCisjZGVmaW5lIGN4MjU4MjFfY2FsbF9hbGwoZGV2LCBvLCBmLCBhcmdzLi4uKSBcCisJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIG8sIGYsICMjYXJncykKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgY3gyNTgyMV9kZXZsaXN0OworZXh0ZXJuIHN0cnVjdCBtdXRleCBjeDI1ODIxX2Rldmxpc3RfbXV0ZXg7CisKK2V4dGVybiBzdHJ1Y3QgY3gyNTgyMV9ib2FyZCBjeDI1ODIxX2JvYXJkc1tdOworZXh0ZXJuIHN0cnVjdCBjeDI1ODIxX3N1YmlkIGN4MjU4MjFfc3ViaWRzW107CisKKyNkZWZpbmUgU1JBTV9DSDAwICAwCQkvKiBWaWRlbyBBICovCisjZGVmaW5lIFNSQU1fQ0gwMSAgMQkJLyogVmlkZW8gQiAqLworI2RlZmluZSBTUkFNX0NIMDIgIDIJCS8qIFZpZGVvIEMgKi8KKyNkZWZpbmUgU1JBTV9DSDAzICAzCQkvKiBWaWRlbyBEICovCisjZGVmaW5lIFNSQU1fQ0gwNCAgNAkJLyogVmlkZW8gRSAqLworI2RlZmluZSBTUkFNX0NIMDUgIDUJCS8qIFZpZGVvIEYgKi8KKyNkZWZpbmUgU1JBTV9DSDA2ICA2CQkvKiBWaWRlbyBHICovCisjZGVmaW5lIFNSQU1fQ0gwNyAgNwkJLyogVmlkZW8gSCAqLworCisjZGVmaW5lIFNSQU1fQ0gwOCAgOAkJLyogQXVkaW8gQSAqLworI2RlZmluZSBTUkFNX0NIMDkgIDkJCS8qIFZpZGVvIFVwc3RyZWFtIEkgKi8KKyNkZWZpbmUgU1JBTV9DSDEwICAxMAkJLyogVmlkZW8gVXBzdHJlYW0gSiAqLworI2RlZmluZSBTUkFNX0NIMTEgIDExCQkvKiBBdWRpbyBVcHN0cmVhbSBBVURfQ0hBTk5FTF9CICovCisKKyNkZWZpbmUgVklEX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9JICAgICBTUkFNX0NIMDkKKyNkZWZpbmUgVklEX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9KICAgICBTUkFNX0NIMTAKKyNkZWZpbmUgQVVESU9fVVBTVFJFQU1fU1JBTV9DSEFOTkVMX0IgICBTUkFNX0NIMTEKKyNkZWZpbmUgVklERU9fSU9DVExfQ0ggIDExCisKK3N0cnVjdCBzcmFtX2NoYW5uZWwgeworCWNoYXIgKm5hbWU7CisJdTMyIGk7CisJdTMyIGNtZHNfc3RhcnQ7CisJdTMyIGN0cmxfc3RhcnQ7CisJdTMyIGNkdDsKKwl1MzIgZmlmb19zdGFydDsKKwl1MzIgZmlmb19zaXplOworCXUzMiBwdHIxX3JlZzsKKwl1MzIgcHRyMl9yZWc7CisJdTMyIGNudDFfcmVnOworCXUzMiBjbnQyX3JlZzsKKwl1MzIgaW50X21zazsKKwl1MzIgaW50X3N0YXQ7CisJdTMyIGludF9tc3RhdDsKKwl1MzIgZG1hX2N0bDsKKwl1MzIgZ3BjbnRfY3RsOworCXUzMiBncGNudDsKKwl1MzIgYXVkX2xlbmd0aDsKKwl1MzIgYXVkX2NmZzsKKwl1MzIgZmxkX2F1ZF9maWZvX2VuOworCXUzMiBmbGRfYXVkX3Jpc2NfZW47CisKKwkvKiBGb3IgVXBzdHJlYW0gVmlkZW8gKi8KKwl1MzIgdmlkX2ZtdF9jdGw7CisJdTMyIHZpZF9hY3RpdmVfY3RsMTsKKwl1MzIgdmlkX2FjdGl2ZV9jdGwyOworCXUzMiB2aWRfY2R0X3NpemU7CisKKwl1MzIgdmlwX2N0bDsKKwl1MzIgcGl4X2ZybXQ7CisJdTMyIGp1bXBvbmx5OworCXUzMiBpcnFfYml0OworfTsKK2V4dGVybiBzdHJ1Y3Qgc3JhbV9jaGFubmVsIGN4MjU4MjFfc3JhbV9jaGFubmVsc1tdOworCisjZGVmaW5lIFNUQVRVU19TVUNDRVNTICAgICAgICAgMAorI2RlZmluZSBTVEFUVVNfVU5TVUNDRVNTRlVMICAgIC0xCisKKyNkZWZpbmUgY3hfcmVhZChyZWcpICAgICAgICAgICAgIHJlYWRsKGRldi0+bG1taW8gKyAoKHJlZyk+PjIpKQorI2RlZmluZSBjeF93cml0ZShyZWcsIHZhbHVlKSAgICAgd3JpdGVsKCh2YWx1ZSksIGRldi0+bG1taW8gKyAoKHJlZyk+PjIpKQorCisjZGVmaW5lIGN4X2FuZG9yKHJlZywgbWFzaywgdmFsdWUpIFwKKwl3cml0ZWwoKHJlYWRsKGRldi0+bG1taW8rKChyZWcpPj4yKSkgJiB+KG1hc2spKSB8XAorCSgodmFsdWUpICYgKG1hc2spKSwgZGV2LT5sbW1pbysoKHJlZyk+PjIpKQorCisjZGVmaW5lIGN4X3NldChyZWcsIGJpdCkgICAgICAgICAgY3hfYW5kb3IoKHJlZyksIChiaXQpLCAoYml0KSkKKyNkZWZpbmUgY3hfY2xlYXIocmVnLCBiaXQpICAgICAgICBjeF9hbmRvcigocmVnKSwgKGJpdCksIDApCisKKyNkZWZpbmUgU2V0X0dQSU9fQml0KEJpdCkgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEJpdCkKKyNkZWZpbmUgQ2xlYXJfR1BJT19CaXQoQml0KSAgICAgICAgICAgICAgICAgICAgICh+KDEgPDwgQml0KSkKKworI2RlZmluZSBDWDI1ODIxX0VSUihmbXQsIGFyZ3MuLi4pCQkJXAorCXByX2VycigiKCVkKTogIiBmbXQsIGRldi0+Ym9hcmQsICMjYXJncykKKyNkZWZpbmUgQ1gyNTgyMV9XQVJOKGZtdCwgYXJncy4uLikJCQlcCisJcHJfd2FybigiKCVkKTogIiBmbXQsIGRldi0+Ym9hcmQsICMjYXJncykKKyNkZWZpbmUgQ1gyNTgyMV9JTkZPKGZtdCwgYXJncy4uLikJCQlcCisJcHJfaW5mbygiKCVkKTogIiBmbXQsIGRldi0+Ym9hcmQsICMjYXJncykKKworZXh0ZXJuIGludCBjeDI1ODIxX2kyY19yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9pMmMgKmJ1cyk7CitleHRlcm4gdm9pZCBjeDI1ODIxX2NhcmRfc2V0dXAoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOworZXh0ZXJuIGludCBjeDI1ODIxX2lyX2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOworZXh0ZXJuIGludCBjeDI1ODIxX2kyY19yZWFkKHN0cnVjdCBjeDI1ODIxX2kyYyAqYnVzLCB1MTYgcmVnX2FkZHIsIGludCAqdmFsdWUpOworZXh0ZXJuIGludCBjeDI1ODIxX2kyY193cml0ZShzdHJ1Y3QgY3gyNTgyMV9pMmMgKmJ1cywgdTE2IHJlZ19hZGRyLCBpbnQgdmFsdWUpOworZXh0ZXJuIGludCBjeDI1ODIxX2kyY191bnJlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2kyYyAqYnVzKTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfZ3Bpb19pbml0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc2V0X2dwaW9waW5fZGlyZWN0aW9uKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgIGludCBwaW5fbnVtYmVyLCBpbnQgcGluX2xvZ2ljX3ZhbHVlKTsKKworZXh0ZXJuIGludCBtZWR1c2FfdmlkZW9faW5pdChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gaW50IG1lZHVzYV9zZXRfdmlkZW9zdGFuZGFyZChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBtZWR1c2Ffc2V0X3Jlc29sdXRpb24oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCB3aWR0aCwKKwkJCQkgIGludCBkZWNvZGVyX3NlbGVjdCk7CitleHRlcm4gaW50IG1lZHVzYV9zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IGJyaWdodG5lc3MsCisJCQkJIGludCBkZWNvZGVyKTsKK2V4dGVybiBpbnQgbWVkdXNhX3NldF9jb250cmFzdChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IGNvbnRyYXN0LAorCQkJICAgICAgIGludCBkZWNvZGVyKTsKK2V4dGVybiBpbnQgbWVkdXNhX3NldF9odWUoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBodWUsIGludCBkZWNvZGVyKTsKK2V4dGVybiBpbnQgbWVkdXNhX3NldF9zYXR1cmF0aW9uKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgc2F0dXJhdGlvbiwKKwkJCQkgaW50IGRlY29kZXIpOworCitleHRlcm4gaW50IGN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoLCB1bnNpZ25lZCBpbnQgYnBsLAorCQkJCSAgICAgIHUzMiByaXNjKTsKKworZXh0ZXJuIGludCBjeDI1ODIxX3Jpc2NfYnVmZmVyKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCisJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRvcF9vZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJvdHRvbV9vZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJwbCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGFkZGluZywgdW5zaWduZWQgaW50IGxpbmVzKTsKK2V4dGVybiBpbnQgY3gyNTgyMV9yaXNjX2RhdGFidWZmZXJfYXVkaW8oc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkJIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCisJCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKKwkJCQkJIHVuc2lnbmVkIGludCBicGwsCisJCQkJCSB1bnNpZ25lZCBpbnQgbGluZXMsIHVuc2lnbmVkIGludCBscGkpOworZXh0ZXJuIHZvaWQgY3gyNTgyMV9mcmVlX2J1ZmZlcihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYpOworZXh0ZXJuIGludCBjeDI1ODIxX3Jpc2Nfc3RvcHBlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkJCXUzMiByZWcsIHUzMiBtYXNrLCB1MzIgdmFsdWUpOworZXh0ZXJuIHZvaWQgY3gyNTgyMV9zcmFtX2NoYW5uZWxfZHVtcChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCk7CitleHRlcm4gdm9pZCBjeDI1ODIxX3NyYW1fY2hhbm5lbF9kdW1wX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gpOworCitleHRlcm4gc3RydWN0IGN4MjU4MjFfZGV2ICpjeDI1ODIxX2Rldl9nZXQoc3RydWN0IHBjaV9kZXYgKnBjaSk7CitleHRlcm4gdm9pZCBjeDI1ODIxX3ByaW50X2lycWJpdHMoY2hhciAqbmFtZSwgY2hhciAqdGFnLCBjaGFyICoqc3RyaW5ncywKKwkJCQkgIGludCBsZW4sIHUzMiBiaXRzLCB1MzIgbWFzayk7CitleHRlcm4gdm9pZCBjeDI1ODIxX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKK2V4dGVybiBpbnQgY3gyNTgyMV9zcmFtX2NoYW5uZWxfc2V0dXBfYXVkaW8oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkJCSAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCBicGwsIHUzMiByaXNjKTsKKworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZHVwc3RyZWFtX2luaXRfY2gxKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQlpbnQgY2hhbm5lbF9zZWxlY3QsIGludCBwaXhlbF9mb3JtYXQpOworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZHVwc3RyZWFtX2luaXRfY2gyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQlpbnQgY2hhbm5lbF9zZWxlY3QsIGludCBwaXhlbF9mb3JtYXQpOworZXh0ZXJuIGludCBjeDI1ODIxX2F1ZGlvX3Vwc3RyZWFtX2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkJICAgICAgIGludCBjaGFubmVsX3NlbGVjdCk7CitleHRlcm4gdm9pZCBjeDI1ODIxX2ZyZWVfbWVtX3Vwc3RyZWFtX2NoMShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBjeDI1ODIxX2ZyZWVfbWVtX3Vwc3RyZWFtX2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBjeDI1ODIxX2ZyZWVfbWVtX3Vwc3RyZWFtX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gxKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdAorCQkJCQkgICAgICp1cF9kYXRhKTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdAorCQkJCQkgICAgICp1cF9kYXRhKTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fYXVkaW8oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkJCSBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKnVwX2RhdGEpOworZXh0ZXJuIHZvaWQgY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBjeDI1ODIxX3N0b3BfdXBzdHJlYW1fdmlkZW9fY2gyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc3RvcF91cHN0cmVhbV9hdWRpbyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gaW50IGN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwX3Vwc3RyZWFtKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnBsLCB1MzIgcmlzYyk7CitleHRlcm4gdm9pZCBjeDI1ODIxX3NldF9waXhlbF9mb3JtYXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFubmVsLAorCQkJCSAgICAgdTMyIGZvcm1hdCk7CitleHRlcm4gdm9pZCBjeDI1ODIxX3ZpZGVvaW9jdGxfdW5yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gc3RydWN0IHZpZGVvX2RldmljZSAqY3gyNTgyMV92ZGV2X2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCSAgICAgIHN0cnVjdCB2aWRlb19kZXZpY2UgKnRlbXBsYXRlLAorCQkJCQkgICAgICBjaGFyICp0eXBlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL01ha2VmaWxlCmluZGV4IDJlZTk2ZDMuLmRjNDBkZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvTWFrZWZpbGUKQEAgLTMsNCArMyw0IEBACiAKIG9iai0kKENPTkZJR19WSURFT19DWDI1ODQwKSArPSBjeDI1ODQwLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWF1ZGlvLmMKaW5kZXggMzRiOTZjNy4uMDA1ZjExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jCkBAIC00ODAsNiArNDgwLDcgQEAKIAogc3RhdGljIHZvaWQgc2V0X3ZvbHVtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgdm9sdW1lKQogeworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAlpbnQgdm9sOwogCiAJLyogQ29udmVydCB0aGUgdm9sdW1lIHRvIG1zcDM0MDAgdmFsdWVzICgwLTEyNykgKi8KQEAgLTQ5NSw3ICs0OTYsMTQgQEAKIAl9CiAKIAkvKiBQQVRIMV9WT0xVTUUgKi8KLQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4ZDQsIDIyOCAtICh2b2wgKiAyKSk7CisJaWYgKGlzX2N4MjM4OHgoc3RhdGUpKSB7CisJCS8qIGZvciBjeDIzODg1IHZvbHVtZSBkb2Vzbid0IHdvcmssCisJCSAqIHRoZSBjYWxjdWxhdGlvbiBhbHdheXMgcmVzdWx0cyBpbgorCQkgKiBlNCByZWdhcmRsZXNzLgorCQkgKi8KKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4OGQ0LCB2b2x1bWUpOworCX0gZWxzZQorCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4ZDQsIDIyOCAtICh2b2wgKiAyKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9iYWxhbmNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBiYWxhbmNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jCmluZGV4IGI3ZWUyYWUuLmNkOTk3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMKQEAgLTcwMiw2ICs3MDIsMTMgQEAKIAogCS8qIHN0YXJ0IG1pY3JvY29udHJvbGxlciAqLwogCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MDMsIH4weDEwLCAweDEwKTsKKworCS8qIENDIHJhdyBlbmFibGUgKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0MDQsIDB4MGIpOworCisJLyogQ0Mgb24gKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0MmYsIDB4NjYpOworCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg0NzQsIDB4MWUxZTYwMWEpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTA2Nyw2ICsxMDc0LDE4IEBACiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDkxOSwgMHgwMSk7CiAJfQogCisJaWYgKGlzX2N4MjM4OHgoc3RhdGUpICYmICgoYXVkX2lucHV0ID09IENYMjU4NDBfQVVESU83KSB8fAorCQkoYXVkX2lucHV0ID09IENYMjU4NDBfQVVESU82KSkpIHsKKwkJLyogQ29uZmlndXJlIGF1ZGlvIGZyb20gTFIxIG9yIExSMiBpbnB1dCAqLworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTEwLCAwKTsKKwkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhkMCwgMHg2MzA3Myk7CisJfSBlbHNlCisJaWYgKGlzX2N4MjM4OHgoc3RhdGUpICYmIChhdWRfaW5wdXQgPT0gQ1gyNTg0MF9BVURJTzgpKSB7CisJCS8qIENvbmZpZ3VyZSBhdWRpbyBmcm9tIHR1bmVyL3NpZiBpbnB1dCAqLworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTEwLCAweDEyYjAwMGM5KTsKKwkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhkMCwgMHgxZjA2Mzg3MCk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWlyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1pci5jCmluZGV4IDdlYjc5YWYuLjEzYzM4MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWlyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtaXIuYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvY3gyNTg0MC5oPgogI2luY2x1ZGUgPG1lZGlhL3JjLWNvcmUuaD4KIApAQCAtNjY4LDcgKzY2OSw3IEBACiAJdTE2IGRpdmlkZXI7CiAJdW5zaWduZWQgaW50IGksIG47CiAJdW5pb24gY3gyNTg0MF9pcl9maWZvX3JlYyAqcDsKLQl1bnNpZ25lZCB1LCB2OworCXVuc2lnbmVkIHUsIHYsIHc7CiAKIAlpZiAoaXJfc3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC02OTQsMTEgKzY5NSwxMiBAQAogCQlpZiAoKHAtPmh3X2ZpZm9fZGF0YSAmIEZJRk9fUlhUWF9SVE8pID09IEZJRk9fUlhUWF9SVE8pIHsKIAkJCS8qIEFzc3VtZSBSVE8gd2FzIGJlY2F1c2Ugb2Ygbm8gSVIgbGlnaHQgaW5wdXQgKi8KIAkJCXUgPSAwOwotCQkJdjRsMl9kYmcoMiwgaXJfZGVidWcsIHNkLCAicnggcmVhZDogZW5kIG9mIHJ4XG4iKTsKKwkJCXcgPSAxOwogCQl9IGVsc2UgewogCQkJdSA9IChwLT5od19maWZvX2RhdGEgJiBGSUZPX1JYVFhfTFZMKSA/IDEgOiAwOwogCQkJaWYgKGludmVydCkKIAkJCQl1ID0gdSA/IDAgOiAxOworCQkJdyA9IDA7CiAJCX0KIAogCQl2ID0gKHVuc2lnbmVkKSBwdWxzZV93aWR0aF9jb3VudF90b19ucygKQEAgLTcwOSw5ICs3MTEsMTIgQEAKIAkJaW5pdF9pcl9yYXdfZXZlbnQoJnAtPmlyX2NvcmVfZGF0YSk7CiAJCXAtPmlyX2NvcmVfZGF0YS5wdWxzZSA9IHU7CiAJCXAtPmlyX2NvcmVfZGF0YS5kdXJhdGlvbiA9IHY7CisJCXAtPmlyX2NvcmVfZGF0YS50aW1lb3V0ID0gdzsKIAotCQl2NGwyX2RiZygyLCBpcl9kZWJ1Zywgc2QsICJyeCByZWFkOiAlMTB1IG5zICAlc1xuIiwKLQkJCSB2LCB1ID8gIm1hcmsiIDogInNwYWNlIik7CisJCXY0bDJfZGJnKDIsIGlyX2RlYnVnLCBzZCwgInJ4IHJlYWQ6ICUxMHUgbnMgICVzICAlc1xuIiwKKwkJCSB2LCB1ID8gIm1hcmsiIDogInNwYWNlIiwgdyA/ICIodGltZWQgb3V0KSIgOiAiIik7CisJCWlmICh3KQorCQkJdjRsMl9kYmcoMiwgaXJfZGVidWcsIHNkLCAicnggcmVhZDogZW5kIG9mIHJ4XG4iKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUKaW5kZXggNWI3ZTI2Ny4uYzFhMjc4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZQpAQCAtMTAsNyArMTAsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSArPSBjeDg4LWR2Yi5vCiBvYmotJChDT05GSUdfVklERU9fQ1g4OF9WUDMwNTQpICs9IGN4ODgtdnAzMDU0LWkyYy5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKaW5kZXggZmJjYWExYy4uZmJmZGQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwpAQCAtNjM2LDkgKzYzNiw2IEBACiAJY3hfd3JpdGUoTU9fUENJX0lOVFNUQVQsICAgMHhGRkZGRkZGRik7IC8vIENsZWFyIFBDSSBpbnQKIAljeF93cml0ZShNT19JTlQxX1NUQVQsICAgICAweEZGRkZGRkZGKTsgLy8gQ2xlYXIgUklTQyBpbnQKIAotCS8qIHNldCBkZWZhdWx0IG5vdGNoIGZpbHRlciAqLwotCWN4X2FuZG9yKE1PX0hUT1RBTCwgMHgxODAwLCAoSExOb3RjaEZpbHRlcjR4RnNjIDw8IDExKSk7Ci0KIAkvKiBSZXNldCBvbi1ib2FyZCBwYXJ0cyAqLwogCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDApOwogCW1zbGVlcCgxMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwppbmRleCA2MGQyOGZkLi45MjFjNTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKQEAgLTI2Niw3ICsyNjYsNyBAQAogCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSLAogCQkJLm5hbWUgICAgICAgICAgPSAiTm90Y2ggZmlsdGVyIiwKIAkJCS5taW5pbXVtICAgICAgID0gMCwKLQkJCS5tYXhpbXVtICAgICAgID0gMywKKwkJCS5tYXhpbXVtICAgICAgID0gMSwKIAkJCS5zdGVwICAgICAgICAgID0gMSwKIAkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwLAogCQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtMzU1X2NjZGMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9kbTM1NV9jY2RjLmMKaW5kZXggYzI5YWM4OC4uYmQ0NDNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtMzU1X2NjZGMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvZG0zNTVfY2NkYy5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL2RtMzU1X2NjZGMuaD4KICNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3Zwc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9kbTY0NHhfY2NkYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtNjQ0eF9jY2RjLmMKaW5kZXggYzhiMzJjMS4uODA1MWMyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtNjQ0eF9jY2RjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtNjQ0eF9jY2RjLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvZG02NDR4X2NjZGMuaD4KICNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3Zwc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX2Rpc3BsYXkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX2Rpc3BsYXkuYwppbmRleCA3ZjFkODNhLi44NTg4YTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfZGlzcGxheS5jCkBAIC00Myw3ICs0Myw2IEBACiAKIHN0YXRpYyBpbnQgZGVidWc7CiAKLSNkZWZpbmUgVlBCRV9ESVNQTEFZX1NEX0JVRl9TSVpFICg3MjAqNTc2KjIpCiAjZGVmaW5lIFZQQkVfREVGQVVMVF9OVU1fQlVGUyAzCiAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmMKaW5kZXggNTM1Mjg4NC4uY2VjY2Y0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmMKQEAgLTExNjIsNyArMTE2Miw3IEBACiAJCWdvdG8gZnJlZV9tZW07CiAJfQogCW9zZC0+b3NkX2Jhc2VfcGh5cyA9IHJlcy0+c3RhcnQ7Ci0Jb3NkLT5vc2Rfc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJb3NkLT5vc2Rfc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihvc2QtPm9zZF9iYXNlX3BoeXMsIG9zZC0+b3NkX3NpemUsCiAJCQkJTU9EVUxFX05BTUUpKSB7CiAJCWRldl9lcnIob3NkLT5kZXYsICJVbmFibGUgdG8gcmVzZXJ2ZSBPU0QgTU1JTyByZWdpb25cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L0tjb25maWcKaW5kZXggMjgxZWU0Mi4uZjZmNjIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9LY29uZmlnCkBAIC00MSw2ICs0MSw4IEBACiAJc2VsZWN0IERWQl9DWEQyODIwUiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfRFJYSyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfVERBMTgyNzFDMkREIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9UREExMDA3MSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfQTgyOTMgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgVklERU9CVUZfRFZCCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIERWQiBjYXJkcyBiYXNlZCBvbiB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKaW5kZXggMzhhYWEwMC4uMmFiZGY3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKQEAgLTksOCArOSw4IEBACiBvYmotJChDT05GSUdfVklERU9fRU0yOFhYX0FMU0EpICs9IGVtMjh4eC1hbHNhLm8KIG9iai0kKENPTkZJR19WSURFT19FTTI4WFhfRFZCKSArPSBlbTI4eHgtZHZiLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwppbmRleCAzZTM5NTlmLi45Yjc0N2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwpAQCAtNjAsNyArNjAsNyBAQAogbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICBpbnQsIE5VTEwsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjYXJkLCAgICAgImNhcmQgdHlwZSIpOwogCi0vKiBCaXRtYXNrIG1hcmtpbmcgYWxsb2NhdGVkIGRldmljZXMgZnJvbSAwIHRvIEVNMjhYWF9NQVhCT0FSRFMgKi8KKy8qIEJpdG1hc2sgbWFya2luZyBhbGxvY2F0ZWQgZGV2aWNlcyBmcm9tIDAgdG8gRU0yOFhYX01BWEJPQVJEUyAtIDEgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVtMjh4eF9kZXZ1c2VkOwogCiBzdHJ1Y3QgZW0yOHh4X2hhc2hfdGFibGUgewpAQCAtMzE3LDYgKzMxNywyNSBAQAogfTsKICNlbmRpZgogCisvKiAyMDEzOjAyNGYgUENUViBEVkItUzIgU3RpY2sgNDYwZQorICogR1BJT18wIC0gUE9XRVJfT04KKyAqIEdQSU9fMSAtIEJPT1NUCisgKiBHUElPXzIgLSBWVVZfTE5CIChyZWQgTEVEKQorICogR1BJT18zIC0gRVhUXzEyVgorICogR1BJT180IC0gSU5UX0RFTSAoREVNT0QgR1BJT18wKQorICogR1BJT181IC0gSU5UX0xOQgorICogR1BJT182IC0gUkVTRVRfREVNCisgKiBHUElPXzcgLSBMRUQgKGdyZWVuIExFRCkKKyAqLworc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBwY3R2XzQ2MGVbXSA9IHsKKwl7RU0yODc0X1I4MF9HUElPLCAweDAxLCAweGZmLCAgNTB9LAorCXsweDBkLCAgICAgICAgICAgIDB4ZmYsIDB4ZmYsICA1MH0sCisJe0VNMjg3NF9SODBfR1BJTywgMHg0MSwgMHhmZiwgIDUwfSwgLyogR1BJT182PTEgKi8KKwl7MHgwZCwgICAgICAgICAgICAweDQyLCAweGZmLCAgNTB9LAorCXtFTTI4NzRfUjgwX0dQSU8sIDB4NjEsIDB4ZmYsICA1MH0sIC8qIEdQSU9fNT0xICovCisJeyAgICAgICAgICAgICAtMSwgICAtMSwgICAtMSwgIC0xfSwKK307CisKIC8qCiAgKiAgQm9hcmQgZGVmaW5pdGlvbnMKICAqLwpAQCAtMTgxMCw2ICsxODI5LDE3IEBACiAJCS5oYXNfZHZiICAgICAgID0gMSwKIAkJLmlyX2NvZGVzICAgICAgPSBSQ19NQVBfUElOTkFDTEVfUENUVl9IRCwKIAl9LAorCS8qIDIwMTM6MDI0ZiBQQ1RWIERWQi1TMiBTdGljayA0NjBlCisJICogRW1waWEgRU0yODE3NCwgTlhQIFREQTEwMDcxLCBDb25leGFudCBDWDI0MTE4QSBhbmQgQWxsZWdybyBBODI5MyAqLworCVtFTTI4MTc0X0JPQVJEX1BDVFZfNDYwRV0gPSB7CisJCS5pMmNfc3BlZWQgICAgID0gRU0yODc0X0kyQ19TRUNPTkRBUllfQlVTX1NFTEVDVCB8CisJCQlFTTI4WFhfSTJDX0NMS19XQUlUX0VOQUJMRSB8IEVNMjhYWF9JMkNfRlJFUV80MDBfS0haLAorCQkubmFtZSAgICAgICAgICA9ICJQQ1RWIERWQi1TMiBTdGljayAoNDYwZSkiLAorCQkudHVuZXJfdHlwZSAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLnR1bmVyX2dwaW8gICAgPSBwY3R2XzQ2MGUsCisJCS5oYXNfZHZiICAgICAgID0gMSwKKwkJLmlyX2NvZGVzICAgICAgPSBSQ19NQVBfUElOTkFDTEVfUENUVl9IRCwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBlbTI4eHhfYmNvdW50ID0gQVJSQVlfU0laRShlbTI4eHhfYm9hcmRzKTsKIApAQCAtMTg5Myw2ICsxOTIzLDggQEAKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg2MF9CT0FSRF9URVJSQVRFQ19BVjM1MCB9LAogCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDA5NiksCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4NjBfQk9BUkRfVEVSUkFURUNfR1JBQkJZIH0sCisJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgxMEFGKSwKKwkJCS5kcml2ZXJfaW5mbyA9IEVNMjg2MF9CT0FSRF9URVJSQVRFQ19HUkFCQlkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwZmQ5LCAweDAwMzMpLAogCQkJLmRyaXZlcl9pbmZvID0gRU0yODYwX0JPQVJEX0VMR0FUT19WSURFT19DQVBUVVJFfSwKIAl7IFVTQl9ERVZJQ0UoMHgxODViLCAweDI4NzApLApAQCAtMTk0MSw2ICsxOTczLDggQEAKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg3MF9CT0FSRF9LV09STERfQTM0MCB9LAogCXsgVVNCX0RFVklDRSgweDIwMTMsIDB4MDI0ZiksCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4MTc0X0JPQVJEX1BDVFZfMjkwRSB9LAorCXsgVVNCX0RFVklDRSgweDIwMTMsIDB4MDI0YyksCisJCQkuZHJpdmVyX2luZm8gPSBFTTI4MTc0X0JPQVJEX1BDVFZfNDYwRSB9LAogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZW0yOHh4X2lkX3RhYmxlKTsKQEAgLTI3NjgsOSArMjgwMiw5IEBACiAjZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KIAogLyoKLSAqIGVtMjh4eF9yZWFsZWFzZV9yZXNvdXJjZXMoKQorICogZW0yOHh4X3JlbGVhc2VfcmVzb3VyY2VzKCkKICAqIHVucmVnaXN0ZXJzIHRoZSB2NGwyLGkyYyBhbmQgdXNiIGRldmljZXMKLSAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaXNjb25lY3RlZCBvciBhdCBtb2R1bGUgdW5sb2FkCisgKiBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGdldHMgZGlzY29ubmVjdGVkIG9yIGF0IG1vZHVsZSB1bmxvYWQKICovCiB2b2lkIGVtMjh4eF9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CkBAIC0yNzg0LDggKzI4MTgsNiBAQAogCiAJZW0yOHh4X3JlbGVhc2VfYW5hbG9nX3Jlc291cmNlcyhkZXYpOwogCi0JZW0yOHh4X3JlbW92ZV9mcm9tX2Rldmxpc3QoZGV2KTsKLQogCWVtMjh4eF9pMmNfdW5yZWdpc3RlcihkZXYpOwogCiAJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CkBAIC0yNzkzLDcgKzI4MjUsNyBAQAogCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CiAKIAkvKiBNYXJrIGRldmljZSBhcyB1bnVzZWQgKi8KLQllbTI4eHhfZGV2dXNlZCAmPSB+KDEgPDwgZGV2LT5kZXZubyk7CisJY2xlYXJfYml0KGRldi0+ZGV2bm8sICZlbTI4eHhfZGV2dXNlZCk7CiB9OwogCiAvKgpAQCAtMjgwNiw3ICsyODM4LDYgQEAKIHsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSAqZGV2aGFuZGxlOwogCWludCByZXR2YWw7Ci0JaW50IGVyckNvZGU7CiAKIAlkZXYtPnVkZXYgPSB1ZGV2OwogCW11dGV4X2luaXQoJmRldi0+Y3RybF91cmJfbG9jayk7CkBAIC0yODgzLDEwICsyOTE0LDkgQEAKIAl9CiAKIAlpZiAoZGV2LT5pc19hdWRpb19vbmx5KSB7Ci0JCWVyckNvZGUgPSBlbTI4eHhfYXVkaW9fc2V0dXAoZGV2KTsKLQkJaWYgKGVyckNvZGUpCisJCXJldHZhbCA9IGVtMjh4eF9hdWRpb19zZXR1cChkZXYpOworCQlpZiAocmV0dmFsKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWVtMjh4eF9hZGRfaW50b19kZXZsaXN0KGRldik7CiAJCWVtMjh4eF9pbml0X2V4dGVuc2lvbihkZXYpOwogCiAJCXJldHVybiAwOwpAQCAtMjkwMyw3ICsyOTMzLDcgQEAKIAkJLyogUmVzZXRzIEkyQyBzcGVlZCAqLwogCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IwNl9JMkNfQ0xLLCBkZXYtPmJvYXJkLmkyY19zcGVlZCk7CiAJCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZ3NfcmVxIGZhaWxlZCEiCisJCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZyBmYWlsZWQhIgogCQkJCSAgICAgICIgcmV0dmFsIFslZF1cbiIsCiAJCQkJICAgICAgX19mdW5jX18sIHJldHZhbCk7CiAJCQlyZXR1cm4gcmV0dmFsOwpAQCAtMjkxNywxMiArMjk0NywxMSBAQAogCX0KIAogCS8qIHJlZ2lzdGVyIGkyYyBidXMgKi8KLQllcnJDb2RlID0gZW0yOHh4X2kyY19yZWdpc3RlcihkZXYpOwotCWlmIChlcnJDb2RlIDwgMCkgewotCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKLQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF9pMmNfcmVnaXN0ZXIgLSBlcnJDb2RlIFslZF0hXG4iLAotCQkJX19mdW5jX18sIGVyckNvZGUpOwotCQlyZXR1cm4gZXJyQ29kZTsKKwlyZXR2YWwgPSBlbTI4eHhfaTJjX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF9pMmNfcmVnaXN0ZXIgLSBlcnJvciBbJWRdIVxuIiwKKwkJCV9fZnVuY19fLCByZXR2YWwpOworCQlnb3RvIHVucmVnaXN0ZXJfZGV2OwogCX0KIAogCS8qCkBAIC0yOTM2LDExICsyOTY1LDExIEBACiAJZW0yOHh4X2NhcmRfc2V0dXAoZGV2KTsKIAogCS8qIENvbmZpZ3VyZSBhdWRpbyAqLwotCWVyckNvZGUgPSBlbTI4eHhfYXVkaW9fc2V0dXAoZGV2KTsKLQlpZiAoZXJyQ29kZSA8IDApIHsKLQkJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7Ci0JCWVtMjh4eF9lcnJkZXYoIiVzOiBFcnJvciB3aGlsZSBzZXR0aW5nIGF1ZGlvIC0gZXJyQ29kZSBbJWRdIVxuIiwKLQkJCV9fZnVuY19fLCBlcnJDb2RlKTsKKwlyZXR2YWwgPSBlbTI4eHhfYXVkaW9fc2V0dXAoZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQllbTI4eHhfZXJyZGV2KCIlczogRXJyb3Igd2hpbGUgc2V0dGluZyBhdWRpbyAtIGVycm9yIFslZF0hXG4iLAorCQkJX19mdW5jX18sIHJldHZhbCk7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKiB3YWtlIGkyYyBkZXZpY2VzICovCkBAIC0yOTU0LDQxICsyOTgzLDQxIEBACiAKIAlpZiAoZGV2LT5ib2FyZC5oYXNfbXNwMzR4eCkgewogCQkvKiBTZW5kIGEgcmVzZXQgdG8gb3RoZXIgY2hpcHMgdmlhIGdwaW8gKi8KLQkJZXJyQ29kZSA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA4X0dQSU8sIDB4ZjcpOwotCQlpZiAoZXJyQ29kZSA8IDApIHsKLQkJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfd3JpdGVfcmVnc19yZXEgLSAiCi0JCQkJICAgICAgIm1zcDM0eHgoMSkgZmFpbGVkISBlcnJDb2RlIFslZF1cbiIsCi0JCQkJICAgICAgX19mdW5jX18sIGVyckNvZGUpOwotCQkJcmV0dXJuIGVyckNvZGU7CisJCXJldHZhbCA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA4X0dQSU8sIDB4ZjcpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF93cml0ZV9yZWcgLSAiCisJCQkJICAgICAgIm1zcDM0eHgoMSkgZmFpbGVkISBlcnJvciBbJWRdXG4iLAorCQkJCSAgICAgIF9fZnVuY19fLCByZXR2YWwpOworCQkJZ290byBmYWlsOwogCQl9CiAJCW1zbGVlcCgzKTsKIAotCQllcnJDb2RlID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmZik7Ci0JCWlmIChlcnJDb2RlIDwgMCkgewotCQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF93cml0ZV9yZWdzX3JlcSAtICIKLQkJCQkgICAgICAibXNwMzR4eCgyKSBmYWlsZWQhIGVyckNvZGUgWyVkXVxuIiwKLQkJCQkgICAgICBfX2Z1bmNfXywgZXJyQ29kZSk7Ci0JCQlyZXR1cm4gZXJyQ29kZTsKKwkJcmV0dmFsID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmZik7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZyAtICIKKwkJCQkgICAgICAibXNwMzR4eCgyKSBmYWlsZWQhIGVycm9yIFslZF1cbiIsCisJCQkJICAgICAgX19mdW5jX18sIHJldHZhbCk7CisJCQlnb3RvIGZhaWw7CiAJCX0KIAkJbXNsZWVwKDMpOwogCX0KIAotCWVtMjh4eF9hZGRfaW50b19kZXZsaXN0KGRldik7Ci0KIAlyZXR2YWwgPSBlbTI4eHhfcmVnaXN0ZXJfYW5hbG9nX2RldmljZXMoZGV2KTsKIAlpZiAocmV0dmFsIDwgMCkgewotCQllbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKLQkJZ290byBmYWlsX3JlZ19kZXZpY2VzOworCQlnb3RvIGZhaWw7CiAJfQogCi0JZW0yOHh4X2luaXRfZXh0ZW5zaW9uKGRldik7Ci0KIAkvKiBTYXZlIHNvbWUgcG93ZXIgYnkgcHV0dGluZyB0dW5lciB0byBzbGVlcCAqLwogCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBjb3JlLCBzX3Bvd2VyLCAwKTsKIAogCXJldHVybiAwOwogCi1mYWlsX3JlZ19kZXZpY2VzOgorZmFpbDoKKwllbTI4eHhfaTJjX3VucmVnaXN0ZXIoZGV2KTsKKwordW5yZWdpc3Rlcl9kZXY6CisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0zMDE1LDggKzMwNDQsMTYgQEAKIAl1ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKIAogCS8qIENoZWNrIHRvIHNlZSBuZXh0IGZyZWUgZGV2aWNlIGFuZCBtYXJrIGFzIHVzZWQgKi8KLQluciA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmVtMjh4eF9kZXZ1c2VkLCBFTTI4WFhfTUFYQk9BUkRTKTsKLQllbTI4eHhfZGV2dXNlZCB8PSAxPDxucjsKKwlkbyB7CisJCW5yID0gZmluZF9maXJzdF96ZXJvX2JpdCgmZW0yOHh4X2RldnVzZWQsIEVNMjhYWF9NQVhCT0FSRFMpOworCQlpZiAobnIgPj0gRU0yOFhYX01BWEJPQVJEUykgeworCQkJLyogTm8gZnJlZSBkZXZpY2Ugc2xvdHMgKi8KKwkJCXByaW50ayhEUklWRVJfTkFNRSAiOiBTdXBwb3J0cyBvbmx5ICVpIGVtMjh4eCBib2FyZHMuXG4iLAorCQkJCQlFTTI4WFhfTUFYQk9BUkRTKTsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9ub19zbG90OworCQl9CisJfSB3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChuciwgJmVtMjh4eF9kZXZ1c2VkKSk7CiAKIAkvKiBEb24ndCByZWdpc3RlciBhdWRpbyBpbnRlcmZhY2VzICovCiAJaWYgKGludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfQVVESU8pIHsKQEAgLTMwMjcsNyArMzA2NCw2IEBACiAJCQlpZm51bSwKIAkJCWludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyk7CiAKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMwNzYsNyArMzExMiw2IEBACiAJCQkJZW0yOHh4X2VycihEUklWRVJfTkFNRSAiIFRoaXMgaXMgYW4gYW5jaWxpYXJ5ICIKIAkJCQkJImludGVyZmFjZSBub3QgdXNlZCBieSB0aGUgZHJpdmVyXG4iKTsKIAotCQkJCWVtMjh4eF9kZXZ1c2VkICY9IH4oMTw8bnIpOwogCQkJCXJldHZhbCA9IC1FTk9ERVY7CiAJCQkJZ290byBlcnI7CiAJCQl9CkBAIC0zMTMyLDI5ICszMTY3LDE5IEBACiAJCXByaW50ayhEUklWRVJfTkFNRSAiOiBEZXZpY2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CiAJCXByaW50ayhEUklWRVJfTkFNRSAiOiBEZXZpY2UgbXVzdCBiZSBjb25uZWN0ZWQgdG8gYSBoaWdoLXNwZWVkIgogCQkgICAgICAgIiBVU0IgMi4wIHBvcnQuXG4iKTsKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyOwogCX0KIAotCWlmIChuciA+PSBFTTI4WFhfTUFYQk9BUkRTKSB7Ci0JCXByaW50ayhEUklWRVJfTkFNRSAiOiBTdXBwb3J0cyBvbmx5ICVpIGVtMjh4eCBib2FyZHMuXG4iLAotCQkJCUVNMjhYWF9NQVhCT0FSRFMpOwotCQllbTI4eHhfZGV2dXNlZCAmPSB+KDE8PG5yKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCWlmIChkZXYgPT0gTlVMTCkgewogCQllbTI4eHhfZXJyKERSSVZFUl9OQU1FICI6IG91dCBvZiBtZW1vcnkhXG4iKTsKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KIAotCXNucHJpbnRmKGRldi0+bmFtZSwgMjksICJlbTI4eHggIyVkIiwgbnIpOworCXNucHJpbnRmKGRldi0+bmFtZSwgc2l6ZW9mKGRldi0+bmFtZSksICJlbTI4eHggIyVkIiwgbnIpOwogCWRldi0+ZGV2bm8gPSBucjsKIAlkZXYtPm1vZGVsID0gaWQtPmRyaXZlcl9pbmZvOwogCWRldi0+YWx0ICAgPSAtMTsKQEAgLTMxNzcsNyArMzIwMiw2IEBACiAKIAlpZiAoZGV2LT5hbHRfbWF4X3BrdF9zaXplID09IE5VTEwpIHsKIAkJZW0yOHh4X2VycmRldigib3V0IG9mIG1lbW9yeSFcbiIpOwotCQllbTI4eHhfZGV2dXNlZCAmPSB+KDE8PG5yKTsKIAkJa2ZyZWUoZGV2KTsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnI7CkBAIC0zMjA0LDggKzMyMjgsOCBAQAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJcmV0dmFsID0gZW0yOHh4X2luaXRfZGV2KCZkZXYsIHVkZXYsIGludGVyZmFjZSwgbnIpOwogCWlmIChyZXR2YWwpIHsKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxkZXYtPmRldm5vKTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCQlrZnJlZShkZXYtPmFsdF9tYXhfcGt0X3NpemUpOwogCQlrZnJlZShkZXYpOwogCQlnb3RvIGVycjsKIAl9CkBAIC0zMjE3LDE1ICszMjQxLDI2IEBACiAJICovCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCisJLyoKKwkgKiBUaGVzZSBleHRlbnNpb25zIGNhbiBiZSBtb2R1bGVzLiBJZiB0aGUgbW9kdWxlcyBhcmUgYWxyZWFkeQorCSAqIGxvYWRlZCB0aGVuIHdlIGNhbiBpbml0aWFsaXNlIHRoZSBkZXZpY2Ugbm93LCBvdGhlcndpc2Ugd2UKKwkgKiB3aWxsIGluaXRpYWxpc2UgaXQgd2hlbiB0aGUgbW9kdWxlcyBsb2FkIGluc3RlYWQuCisJICovCisJZW0yOHh4X2luaXRfZXh0ZW5zaW9uKGRldik7CisKIAlyZXR1cm4gMDsKIAogZXJyOgorCWNsZWFyX2JpdChuciwgJmVtMjh4eF9kZXZ1c2VkKTsKKworZXJyX25vX3Nsb3Q6CisJdXNiX3B1dF9kZXYodWRldik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoKICAqIGVtMjh4eF91c2JfZGlzY29ubmVjdCgpCi0gKiBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGdldHMgZGljb25lbmN0ZWQKKyAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaXNjb25uZWN0ZWQKICAqIHZpZGVvIGRldmljZSB3aWxsIGJlIHVucmVnaXN0ZXJlZCBvbiB2NGwyX2Nsb3NlIGluIGNhc2UgaXQgaXMgc3RpbGwgb3BlbgogICovCiBzdGF0aWMgdm9pZCBlbTI4eHhfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKQEAgLTMyNzMsMTAgKzMzMDgsMTAgQEAKIAkJZW0yOHh4X3JlbGVhc2VfcmVzb3VyY2VzKGRldik7CiAJfQogCi0JZW0yOHh4X2Nsb3NlX2V4dGVuc2lvbihkZXYpOwotCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCisJZW0yOHh4X2Nsb3NlX2V4dGVuc2lvbihkZXYpOworCiAJaWYgKCFkZXYtPnVzZXJzKSB7CiAJCWtmcmVlKGRldi0+YWx0X21heF9wa3Rfc2l6ZSk7CiAJCWtmcmVlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwppbmRleCA1N2IxYjVjLi44MDRhNGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKQEAgLTExODQsMjUgKzExODQsNiBAQAogc3RhdGljIERFRklORV9NVVRFWChlbTI4eHhfZGV2bGlzdF9tdXRleCk7CiAKIC8qCi0gKiBlbTI4eHhfcmVhbGVhc2VfcmVzb3VyY2VzKCkKLSAqIHVucmVnaXN0ZXJzIHRoZSB2NGwyLGkyYyBhbmQgdXNiIGRldmljZXMKLSAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaXNjb25lY3RlZCBvciBhdCBtb2R1bGUgdW5sb2FkCi0qLwotdm9pZCBlbTI4eHhfcmVtb3ZlX2Zyb21fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpCi17Ci0JbXV0ZXhfbG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfZGVsKCZkZXYtPmRldmxpc3QpOwotCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotfTsKLQotdm9pZCBlbTI4eHhfYWRkX2ludG9fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpCi17Ci0JbXV0ZXhfbG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2bGlzdCwgJmVtMjh4eF9kZXZsaXN0KTsKLQltdXRleF91bmxvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKLX07Ci0KLS8qCiAgKiBFeHRlbnNpb24gaW50ZXJmYWNlCiAgKi8KIApAQCAtMTIxNyw4ICsxMTk4LDggQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmVtMjh4eF9kZXZsaXN0LCBkZXZsaXN0KSB7CiAJCW9wcy0+aW5pdChkZXYpOwogCX0KLQlwcmludGsoS0VSTl9JTkZPICJFbTI4eHg6IEluaXRpYWxpemVkICglcykgZXh0ZW5zaW9uXG4iLCBvcHMtPm5hbWUpOwogCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOworCXByaW50ayhLRVJOX0lORk8gIkVtMjh4eDogSW5pdGlhbGl6ZWQgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGVtMjh4eF9yZWdpc3Rlcl9leHRlbnNpb24pOwpAQCAtMTIzMSwzNiArMTIxMiwzNCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZW0yOHh4X2Rldmxpc3QsIGRldmxpc3QpIHsKIAkJb3BzLT5maW5pKGRldik7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIkVtMjh4eDogUmVtb3ZlZCAoJXMpIGV4dGVuc2lvblxuIiwgb3BzLT5uYW1lKTsKIAlsaXN0X2RlbCgmb3BzLT5uZXh0KTsKIAltdXRleF91bmxvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKKwlwcmludGsoS0VSTl9JTkZPICJFbTI4eHg6IFJlbW92ZWQgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGVtMjh4eF91bnJlZ2lzdGVyX2V4dGVuc2lvbik7CiAKIHZvaWQgZW0yOHh4X2luaXRfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHggKmRldikKIHsKLQlzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKIAogCW11dGV4X2xvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKLQlpZiAoIWxpc3RfZW1wdHkoJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCkpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKLQkJCWlmIChvcHMtPmluaXQpCi0JCQkJb3BzLT5pbml0KGRldik7Ci0JCX0KKwlsaXN0X2FkZF90YWlsKCZkZXYtPmRldmxpc3QsICZlbTI4eHhfZGV2bGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKKwkJaWYgKG9wcy0+aW5pdCkKKwkJCW9wcy0+aW5pdChkZXYpOwogCX0KIAltdXRleF91bmxvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKIH0KIAogdm9pZCBlbTI4eHhfY2xvc2VfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHggKmRldikKIHsKLQlzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKIAogCW11dGV4X2xvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKLQlpZiAoIWxpc3RfZW1wdHkoJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCkpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKLQkJCWlmIChvcHMtPmZpbmkpCi0JCQkJb3BzLT5maW5pKGRldik7Ci0JCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgeworCQlpZiAob3BzLT5maW5pKQorCQkJb3BzLT5maW5pKGRldik7CiAJfQorCWxpc3RfZGVsKCZkZXYtPmRldmxpc3QpOwogCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jCmluZGV4IGU1OTE2ZGUuLmNlZjdhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJjeGQyODIwci5oIgogI2luY2x1ZGUgInRkYTE4MjcxYzJkZC5oIgogI2luY2x1ZGUgImRyeGsuaCIKKyNpbmNsdWRlICJ0ZGExMDA3MS5oIgorI2luY2x1ZGUgImE4MjkzLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBlbTI4eHggYmFzZWQgRFZCIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4iKTsKQEAgLTEyMiw3ICsxMjQsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgZHZiX2lzb2NfY29weShzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBpbmxpbmUgaW50IGVtMjh4eF9kdmJfaXNvY19jb3B5KHN0cnVjdCBlbTI4eHggKmRldiwgc3RydWN0IHVyYiAqdXJiKQogewogCWludCBpOwogCkBAIC0xNTUsNyArMTU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IGVtMjh4eF9kdmIgKmR2YikKK3N0YXRpYyBpbnQgZW0yOHh4X3N0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgZW0yOHh4X2R2YiAqZHZiKQogewogCWludCByYzsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBkdmItPmFkYXB0ZXIucHJpdjsKQEAgLTE3NSwxMCArMTc3LDEwIEBACiAKIAlyZXR1cm4gZW0yOHh4X2luaXRfaXNvYyhkZXYsIEVNMjhYWF9EVkJfTUFYX1BBQ0tFVFMsCiAJCQkJRU0yOFhYX0RWQl9OVU1fQlVGUywgbWF4X2R2Yl9wYWNrZXRfc2l6ZSwKLQkJCQlkdmJfaXNvY19jb3B5KTsKKwkJCQllbTI4eHhfZHZiX2lzb2NfY29weSk7CiB9CiAKLXN0YXRpYyBpbnQgc3RvcF9zdHJlYW1pbmcoc3RydWN0IGVtMjh4eF9kdmIgKmR2YikKK3N0YXRpYyBpbnQgZW0yOHh4X3N0b3Bfc3RyZWFtaW5nKHN0cnVjdCBlbTI4eHhfZHZiICpkdmIpCiB7CiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gZHZiLT5hZGFwdGVyLnByaXY7CiAKQEAgLTE4OSw3ICsxOTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQorc3RhdGljIGludCBlbTI4eHhfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCiB7CiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggID0gZmVlZC0+ZGVtdXg7CiAJc3RydWN0IGVtMjh4eF9kdmIgKmR2YiA9IGRlbXV4LT5wcml2OwpAQCAtMjAzLDcgKzIwNSw3IEBACiAJcmMgPSBkdmItPm5mZWVkczsKIAogCWlmIChkdmItPm5mZWVkcyA9PSAxKSB7Ci0JCXJldCA9IHN0YXJ0X3N0cmVhbWluZyhkdmIpOworCQlyZXQgPSBlbTI4eHhfc3RhcnRfc3RyZWFtaW5nKGR2Yik7CiAJCWlmIChyZXQgPCAwKQogCQkJcmMgPSByZXQ7CiAJfQpAQCAtMjEyLDcgKzIxNCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHN0b3BfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCitzdGF0aWMgaW50IGVtMjh4eF9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ICA9IGZlZWQtPmRlbXV4OwogCXN0cnVjdCBlbTI4eHhfZHZiICpkdmIgPSBkZW11eC0+cHJpdjsKQEAgLTIyMiw3ICsyMjQsNyBAQAogCWR2Yi0+bmZlZWRzLS07CiAKIAlpZiAoMCA9PSBkdmItPm5mZWVkcykKLQkJZXJyID0gc3RvcF9zdHJlYW1pbmcoZHZiKTsKKwkJZXJyID0gZW0yOHh4X3N0b3Bfc3RyZWFtaW5nKGR2Yik7CiAKIAltdXRleF91bmxvY2soJmR2Yi0+bG9jayk7CiAJcmV0dXJuIGVycjsKQEAgLTM4MCw3ICszODIsNyBAQAogCWVtMjh4eF9ncGlvX3NldChkZXYsIHRlcnJhdGVjX2g1X2VuZCk7CiB9OwogCi1zdGF0aWMgaW50IG10MzUyX3RlcnJhdGVjX3hzX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IGVtMjh4eF9tdDM1Ml90ZXJyYXRlY194c19pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCS8qIFZhbHVlcyBleHRyYWN0ZWQgZnJvbSBhIFVTQiB0cmFjZSBvZiB0aGUgVGVycmF0ZWMgV2luZG93cyBkcml2ZXIgKi8KIAlzdGF0aWMgdTggY2xvY2tfY29uZmlnW10gICA9IHsgQ0xPQ0tfQ1RMLCAgMHgzOCwgMHgyYyB9OwpAQCAtNDEyLDcgKzQxNCw3IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAoMHgxZSA+PiAxKSwKIAkubm9fdHVuZXIgPSAxLAogCS5pZjIgPSA0NTYwMCwKLQkuZGVtb2RfaW5pdCA9IG10MzUyX3RlcnJhdGVjX3hzX2luaXQsCisJLmRlbW9kX2luaXQgPSBlbTI4eHhfbXQzNTJfdGVycmF0ZWNfeHNfaW5pdCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdGRhMTAwMjNfY29uZmlnIGVtMjh4eF90ZGExMDAyM19jb25maWcgPSB7CkBAIC00MzgsMTEgKzQ0MCwyNSBAQAogCiBzdGF0aWMgc3RydWN0IHRkYTE4MjcxX2NvbmZpZyBlbTI4eHhfY3hkMjgyMHJfdGRhMTgyNzFfY29uZmlnID0gewogCS5vdXRwdXRfb3B0ID0gVERBMTgyNzFfT1VUUFVUX0xUX09GRiwKKwkuZ2F0ZSA9IFREQTE4MjcxX0dBVEVfRElHSVRBTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGRhMTAwNzFfY29uZmlnIGVtMjh4eF90ZGExMDA3MV9jb25maWcgPSB7CisJLmkyY19hZGRyZXNzID0gMHg1NSwgLyogKDB4YWEgPj4gMSkgKi8KKwkuaTJjX3dyX21heCA9IDY0LAorCS50c19tb2RlID0gVERBMTAwNzFfVFNfU0VSSUFMLAorCS5zcGVjX2ludiA9IDAsCisJLnh0YWwgPSA0MDQ0NDAwMCwgLyogNDAuNDQ0IE1IeiAqLworCS5wbGxfbXVsdGlwbGllciA9IDIwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhODI5M19jb25maWcgZW0yOHh4X2E4MjkzX2NvbmZpZyA9IHsKKwkuaTJjX2FkZHIgPSAweDA4LCAvKiAoMHgxMCA+PiAxKSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgYXR0YWNoX3hjMzAyOCh1OCBhZGRyLCBzdHJ1Y3QgZW0yOHh4ICpkZXYpCitzdGF0aWMgaW50IGVtMjh4eF9hdHRhY2hfeGMzMDI4KHU4IGFkZHIsIHN0cnVjdCBlbTI4eHggKmRldikKIHsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKIAlzdHJ1Y3QgeGMyMDI4X2NvbmZpZyBjZmc7CkBAIC00NzIsMTAgKzQ4OCw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHJlZ2lzdGVyX2R2YihzdHJ1Y3QgZW0yOHh4X2R2YiAqZHZiLAotCQkgc3RydWN0IG1vZHVsZSAqbW9kdWxlLAotCQkgc3RydWN0IGVtMjh4eCAqZGV2LAotCQkgc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBlbTI4eHhfcmVnaXN0ZXJfZHZiKHN0cnVjdCBlbTI4eHhfZHZiICpkdmIsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwKKwkJCSAgICAgICBzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmVzdWx0OwogCkBAIC01MjIsOCArNTM2LDggQEAKIAlkdmItPmRlbXV4LnByaXYgICAgICAgPSBkdmI7CiAJZHZiLT5kZW11eC5maWx0ZXJudW0gID0gMjU2OwogCWR2Yi0+ZGVtdXguZmVlZG51bSAgICA9IDI1NjsKLQlkdmItPmRlbXV4LnN0YXJ0X2ZlZWQgPSBzdGFydF9mZWVkOwotCWR2Yi0+ZGVtdXguc3RvcF9mZWVkICA9IHN0b3BfZmVlZDsKKwlkdmItPmRlbXV4LnN0YXJ0X2ZlZWQgPSBlbTI4eHhfc3RhcnRfZmVlZDsKKwlkdmItPmRlbXV4LnN0b3BfZmVlZCAgPSBlbTI4eHhfc3RvcF9mZWVkOwogCiAJcmVzdWx0ID0gZHZiX2RteF9pbml0KCZkdmItPmRlbXV4KTsKIAlpZiAocmVzdWx0IDwgMCkgewpAQCAtNTkxLDcgKzYwNSw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9kdmIoc3RydWN0IGVtMjh4eF9kdmIgKmR2YikKK3N0YXRpYyB2b2lkIGVtMjh4eF91bnJlZ2lzdGVyX2R2YihzdHJ1Y3QgZW0yOHh4X2R2YiAqZHZiKQogewogCWR2Yl9uZXRfcmVsZWFzZSgmZHZiLT5uZXQpOwogCWR2Yi0+ZGVtdXguZG14LnJlbW92ZV9mcm9udGVuZCgmZHZiLT5kZW11eC5kbXgsICZkdmItPmZlX21lbSk7CkBAIC02MDcsOSArNjIxLDkgQEAKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIpOwogfQogCi1zdGF0aWMgaW50IGR2Yl9pbml0KHN0cnVjdCBlbTI4eHggKmRldikKK3N0YXRpYyBpbnQgZW0yOHh4X2R2Yl9pbml0KHN0cnVjdCBlbTI4eHggKmRldikKIHsKLQlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMCwgbWZlX3NoYXJlZCA9IDA7CiAJc3RydWN0IGVtMjh4eF9kdmIgKmR2YjsKIAogCWlmICghZGV2LT5ib2FyZC5oYXNfZHZiKSB7CkBAIC02NDgsNyArNjYyLDcgQEAKIAkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2gobGdkdDMzMHhfYXR0YWNoLAogCQkJCQkgICAmZW0yODgwX2xnZHQzMzAzX2RldiwKIAkJCQkJICAgJmRldi0+aTJjX2FkYXApOwotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC02NTcsNyArNjcxLDcgQEAKIAkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCiAJCQkJCSAgICZlbTI4eHhfemwxMDM1M193aXRoX3hjMzAyOCwKIAkJCQkJICAgJmRldi0+aTJjX2FkYXApOwotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC02NjgsNyArNjgyLDcgQEAKIAkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCiAJCQkJCSAgICZlbTI4eHhfemwxMDM1M194YzMwMjhfbm9faTJjX2dhdGUsCiAJCQkJCSAgICZkZXYtPmkyY19hZGFwKTsKLQkJaWYgKGF0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKKwkJaWYgKGVtMjh4eF9hdHRhY2hfeGMzMDI4KDB4NjEsIGRldikgPCAwKSB7CiAJCQlyZXN1bHQgPSAtRUlOVkFMOwogCQkJZ290byBvdXRfZnJlZTsKIAkJfQpAQCAtNjg5LDcgKzcwMyw3IEBACiAJCQkJCQkgICAmZGV2LT5pMmNfYWRhcCk7CiAJCX0KIAotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC02OTksNyArNzEzLDcgQEAKIAkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2goczVoMTQwOV9hdHRhY2gsCiAJCQkJCSAgICZlbTI4eHhfczVoMTQwOV93aXRoX3hjMzAyOCwKIAkJCQkJICAgJmRldi0+aTJjX2FkYXApOwotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC03MjAsNyArNzM0LDcgQEAKIAljYXNlIEVNMjg4Ml9CT0FSRF9QSU5OQUNMRV9IWUJSSURfUFJPXzMzMEU6CiAJCWR2Yi0+ZmVbMF0gPSBkdmJfYXR0YWNoKGRyeGRfYXR0YWNoLCAmZW0yOHh4X2RyeGQsIE5VTEwsCiAJCQkJCSAgICZkZXYtPmkyY19hZGFwLCAmZGV2LT51ZGV2LT5kZXYpOwotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC03NTMsMTEgKzc2Nyw5IEBACiAJCWR2Yi0+ZmVbMF0gPSBkdmJfYXR0YWNoKGN4ZDI4MjByX2F0dGFjaCwKIAkJCSZlbTI4eHhfY3hkMjgyMHJfY29uZmlnLCAmZGV2LT5pMmNfYWRhcCwgTlVMTCk7CiAJCWlmIChkdmItPmZlWzBdKSB7Ci0JCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY190dW5lcjsKLQkJCWkyY190dW5lciA9IGN4ZDI4MjByX2dldF90dW5lcl9pMmNfYWRhcHRlcihkdmItPmZlWzBdKTsKIAkJCS8qIEZFIDAgYXR0YWNoIHR1bmVyICovCiAJCQlpZiAoIWR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBkdmItPmZlWzBdLCAweDYwLAotCQkJCWkyY190dW5lciwgJmVtMjh4eF9jeGQyODIwcl90ZGExODI3MV9jb25maWcpKSB7CisJCQkJJmRldi0+aTJjX2FkYXAsICZlbTI4eHhfY3hkMjgyMHJfdGRhMTgyNzFfY29uZmlnKSkgewogCQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goZHZiLT5mZVswXSk7CiAJCQkJcmVzdWx0ID0gLUVJTlZBTDsKIAkJCQlnb3RvIG91dF9mcmVlOwpAQCAtNzY4LDEwICs3ODAsMTIgQEAKIAkJCWR2Yi0+ZmVbMV0tPmlkID0gMTsKIAkJCS8qIEZFIDEgYXR0YWNoIHR1bmVyICovCiAJCQlpZiAoIWR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBkdmItPmZlWzFdLCAweDYwLAotCQkJCWkyY190dW5lciwgJmVtMjh4eF9jeGQyODIwcl90ZGExODI3MV9jb25maWcpKSB7CisJCQkJJmRldi0+aTJjX2FkYXAsICZlbTI4eHhfY3hkMjgyMHJfdGRhMTgyNzFfY29uZmlnKSkgewogCQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goZHZiLT5mZVsxXSk7CiAJCQkJLyogbGVhdmUgRkUgMCBzdGlsbCBhY3RpdmUgKi8KIAkJCX0KKworCQkJbWZlX3NoYXJlZCA9IDE7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBFTTI4ODRfQk9BUkRfVEVSUkFURUNfSDU6CkBAIC04MDksNiArODIzLDE2IEBACiAJCSAgICAgICBzaXplb2YoZHZiLT5mZVswXS0+b3BzLnR1bmVyX29wcykpOwogCiAJCWJyZWFrOworCWNhc2UgRU0yODE3NF9CT0FSRF9QQ1RWXzQ2MEU6CisJCS8qIGF0dGFjaCBkZW1vZCAqLworCQlkdmItPmZlWzBdID0gZHZiX2F0dGFjaCh0ZGExMDA3MV9hdHRhY2gsCisJCQkmZW0yOHh4X3RkYTEwMDcxX2NvbmZpZywgJmRldi0+aTJjX2FkYXApOworCisJCS8qIGF0dGFjaCBTRUMgKi8KKwkJaWYgKGR2Yi0+ZmVbMF0pCisJCQlkdmJfYXR0YWNoKGE4MjkzX2F0dGFjaCwgZHZiLT5mZVswXSwgJmRldi0+aTJjX2FkYXAsCisJCQkJJmVtMjh4eF9hODI5M19jb25maWcpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQllbTI4eHhfZXJyZGV2KCIvMjogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCIKIAkJCQkiIGlzbid0IHN1cHBvcnRlZCB5ZXRcbiIpOwpAQCAtODIzLDExICs4NDcsMTQgQEAKIAlkdmItPmZlWzBdLT5jYWxsYmFjayA9IGVtMjh4eF90dW5lcl9jYWxsYmFjazsKIAogCS8qIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcgKi8KLQlyZXN1bHQgPSByZWdpc3Rlcl9kdmIoZHZiLCBUSElTX01PRFVMRSwgZGV2LCAmZGV2LT51ZGV2LT5kZXYpOworCXJlc3VsdCA9IGVtMjh4eF9yZWdpc3Rlcl9kdmIoZHZiLCBUSElTX01PRFVMRSwgZGV2LCAmZGV2LT51ZGV2LT5kZXYpOwogCiAJaWYgKHJlc3VsdCA8IDApCiAJCWdvdG8gb3V0X2ZyZWU7CiAKKwkvKiBNRkUgbG9jayAqLworCWR2Yi0+YWRhcHRlci5tZmVfc2hhcmVkID0gbWZlX3NoYXJlZDsKKwogCWVtMjh4eF9pbmZvKCJTdWNjZXNzZnVsbHkgbG9hZGVkIGVtMjh4eC1kdmJcbiIpOwogcmV0OgogCWVtMjh4eF9zZXRfbW9kZShkZXYsIEVNMjhYWF9TVVNQRU5EKTsKQEAgLTg0MCw3ICs4NjcsMTQgQEAKIAlnb3RvIHJldDsKIH0KIAotc3RhdGljIGludCBkdmJfZmluaShzdHJ1Y3QgZW0yOHh4ICpkZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgcHJldmVudF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyAqb3BzKQoreworCW9wcy0+c2V0X3ZvbHRhZ2UgPSBOVUxMOworCW9wcy0+c2xlZXAgPSBOVUxMOworCW9wcy0+dHVuZXJfb3BzLnNsZWVwID0gTlVMTDsKK30KKworc3RhdGljIGludCBlbTI4eHhfZHZiX2Zpbmkoc3RydWN0IGVtMjh4eCAqZGV2KQogewogCWlmICghZGV2LT5ib2FyZC5oYXNfZHZiKSB7CiAJCS8qIFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbiAqLwpAQCAtODQ4LDggKzg4MiwxOSBAQAogCX0KIAogCWlmIChkZXYtPmR2YikgewotCQl1bnJlZ2lzdGVyX2R2YihkZXYtPmR2Yik7Ci0JCWtmcmVlKGRldi0+ZHZiKTsKKwkJc3RydWN0IGVtMjh4eF9kdmIgKmR2YiA9IGRldi0+ZHZiOworCisJCWlmIChkZXYtPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgeworCQkJLyogV2UgY2Fubm90IHRlbGwgdGhlIGRldmljZSB0byBzbGVlcAorCQkJICogb25jZSBpdCBoYXMgYmVlbiB1bnBsdWdnZWQuICovCisJCQlpZiAoZHZiLT5mZVswXSkKKwkJCQlwcmV2ZW50X3NsZWVwKCZkdmItPmZlWzBdLT5vcHMpOworCQkJaWYgKGR2Yi0+ZmVbMV0pCisJCQkJcHJldmVudF9zbGVlcCgmZHZiLT5mZVsxXS0+b3BzKTsKKwkJfQorCisJCWVtMjh4eF91bnJlZ2lzdGVyX2R2YihkdmIpOworCQlrZnJlZShkdmIpOwogCQlkZXYtPmR2YiA9IE5VTEw7CiAJfQogCkBAIC04NTksOCArOTA0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgZW0yOHh4X29wcyBkdmJfb3BzID0gewogCS5pZCAgID0gRU0yOFhYX0RWQiwKIAkubmFtZSA9ICJFbTI4eHggZHZiIEV4dGVuc2lvbiIsCi0JLmluaXQgPSBkdmJfaW5pdCwKLQkuZmluaSA9IGR2Yl9maW5pLAorCS5pbml0ID0gZW0yOHh4X2R2Yl9pbml0LAorCS5maW5pID0gZW0yOHh4X2R2Yl9maW5pLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZW0yOHh4X2R2Yl9yZWdpc3Rlcih2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYwppbmRleCA1ZDEyYjE0Li42NzlkYTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYwpAQCAtNDYzLDExICs0NjMsMTEgQEAKIAlpZiAoIWlyKQogCQlyZXR1cm4gMDsKIAotCWVtMjh4eF9pcl9zdG9wKGlyLT5yYyk7Ci0JcmNfdW5yZWdpc3Rlcl9kZXZpY2UoaXItPnJjKTsKLQlrZnJlZShpcik7CisJaWYgKGlyLT5yYykKKwkJcmNfdW5yZWdpc3Rlcl9kZXZpY2UoaXItPnJjKTsKIAogCS8qIGRvbmUgKi8KKwlrZnJlZShpcik7CiAJZGV2LT5pciA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCmluZGV4IGQxNzZkYzAuLjliNDU1N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCkBAIC0xMTU2LDYgKzExNTYsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2aWRpb2NfcXVlcnlzdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICpub3JtKQoreworCXN0cnVjdCBlbTI4eHhfZmggICAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgZW0yOHh4ICAgICAgKmRldiA9IGZoLT5kZXY7CisJaW50ICAgICAgICAgICAgICAgIHJjOworCisJcmMgPSBjaGVja19kZXYoZGV2KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdmlkZW8sIHF1ZXJ5c3RkLCBub3JtKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHZpZGlvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKm5vcm0pCiB7CiAJc3RydWN0IGVtMjh4eF9maCAgICpmaCAgPSBwcml2OwpAQCAtMTc4Nyw2ICsxODAyLDQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZnJhbWVzaXplcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpmc2l6ZSkKK3sKKwlzdHJ1Y3QgZW0yOHh4X2ZoICAgICAgKmZoICA9IHByaXY7CisJc3RydWN0IGVtMjh4eCAgICAgICAgICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBlbTI4eHhfZm10ICAgICAqZm10OworCXVuc2lnbmVkIGludAkgICAgICBtYXh3ID0gbm9ybV9tYXh3KGRldik7CisJdW5zaWduZWQgaW50CSAgICAgIG1heGggPSBub3JtX21heGgoZGV2KTsKKworCWZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZnNpemUtPnBpeGVsX2Zvcm1hdCk7CisJaWYgKCFmbXQpIHsKKwkJZW0yOHh4X3ZpZGVvZGJnKCJGb3VyY2MgZm9ybWF0ICglMDh4KSBpbnZhbGlkLlxuIiwKKwkJCQlmc2l6ZS0+cGl4ZWxfZm9ybWF0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRldi0+Ym9hcmQuaXNfZW0yODAwKSB7CisJCWlmIChmc2l6ZS0+aW5kZXggPiAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZzaXplLT50eXBlID0gVjRMMl9GUk1TSVpFX1RZUEVfRElTQ1JFVEU7CisJCWZzaXplLT5kaXNjcmV0ZS53aWR0aCA9IG1heHcgLyAoMSArIGZzaXplLT5pbmRleCk7CisJCWZzaXplLT5kaXNjcmV0ZS5oZWlnaHQgPSBtYXhoIC8gKDEgKyBmc2l6ZS0+aW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZnNpemUtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUmVwb3J0IGEgY29udGludW91cyByYW5nZSAqLworCWZzaXplLT50eXBlID0gVjRMMl9GUk1TSVpFX1RZUEVfU1RFUFdJU0U7CisJZnNpemUtPnN0ZXB3aXNlLm1pbl93aWR0aCA9IDQ4OworCWZzaXplLT5zdGVwd2lzZS5taW5faGVpZ2h0ID0gMzI7CisJZnNpemUtPnN0ZXB3aXNlLm1heF93aWR0aCA9IG1heHc7CisJZnNpemUtPnN0ZXB3aXNlLm1heF9oZWlnaHQgPSBtYXhoOworCWZzaXplLT5zdGVwd2lzZS5zdGVwX3dpZHRoID0gMTsKKwlmc2l6ZS0+c3RlcHdpc2Uuc3RlcF9oZWlnaHQgPSAxOworCXJldHVybiAwOworfQorCiAvKiBTbGljZWQgVkJJIGlvY3RscyAqLwogc3RhdGljIGludCB2aWRpb2NfZ19mbXRfc2xpY2VkX3ZiaV9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKQEAgLTIyMDAsNiArMjI1NCw3IEBACiAJCSAgIGZyZWUgdGhlIHJlbWFpbmluZyByZXNvdXJjZXMgKi8KIAkJaWYgKGRldi0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB7CiAJCQllbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKKwkJCWtmcmVlKGRldi0+YWx0X21heF9wa3Rfc2l6ZSk7CiAJCQlrZnJlZShkZXYpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIzNDAsMTAgKzIzOTUsMTAgQEAKIAkudmlkaW9jX3NfZm10X3ZpZF9jYXAgICAgICAgPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKIAkudmlkaW9jX2dfZm10X3ZiaV9jYXAgICAgICAgPSB2aWRpb2NfZ19mbXRfdmJpX2NhcCwKIAkudmlkaW9jX3NfZm10X3ZiaV9jYXAgICAgICAgPSB2aWRpb2Nfc19mbXRfdmJpX2NhcCwKKwkudmlkaW9jX2VudW1fZnJhbWVzaXplcyAgICAgPSB2aWRpb2NfZW51bV9mcmFtZXNpemVzLAogCS52aWRpb2NfZ19hdWRpbyAgICAgICAgICAgICA9IHZpZGlvY19nX2F1ZGlvLAogCS52aWRpb2Nfc19hdWRpbyAgICAgICAgICAgICA9IHZpZGlvY19zX2F1ZGlvLAogCS52aWRpb2NfY3JvcGNhcCAgICAgICAgICAgICA9IHZpZGlvY19jcm9wY2FwLAotCiAJLnZpZGlvY19nX2ZtdF9zbGljZWRfdmJpX2NhcCAgID0gdmlkaW9jX2dfZm10X3NsaWNlZF92YmlfY2FwLAogCS52aWRpb2NfdHJ5X2ZtdF9zbGljZWRfdmJpX2NhcCA9IHZpZGlvY190cnlfc2V0X3NsaWNlZF92YmlfY2FwLAogCS52aWRpb2Nfc19mbXRfc2xpY2VkX3ZiaV9jYXAgICA9IHZpZGlvY190cnlfc2V0X3NsaWNlZF92YmlfY2FwLApAQCAtMjM1Myw2ICsyNDA4LDcgQEAKIAkudmlkaW9jX3FidWYgICAgICAgICAgICAgICAgPSB2aWRpb2NfcWJ1ZiwKIAkudmlkaW9jX2RxYnVmICAgICAgICAgICAgICAgPSB2aWRpb2NfZHFidWYsCiAJLnZpZGlvY19nX3N0ZCAgICAgICAgICAgICAgID0gdmlkaW9jX2dfc3RkLAorCS52aWRpb2NfcXVlcnlzdGQgICAgICAgICAgICA9IHZpZGlvY19xdWVyeXN0ZCwKIAkudmlkaW9jX3Nfc3RkICAgICAgICAgICAgICAgPSB2aWRpb2Nfc19zdGQsCiAJLnZpZGlvY19nX3Bhcm0JCSAgICA9IHZpZGlvY19nX3Bhcm0sCiAJLnZpZGlvY19zX3Bhcm0JCSAgICA9IHZpZGlvY19zX3Bhcm0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oCmluZGV4IGQ4MDY1OGIuLjJhMmNiN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oCkBAIC0xMjAsNiArMTIwLDcgQEAKICNkZWZpbmUgRU0yODc0X0JPQVJEX0xFQURFUlNISVBfSVNEQlQJCSAgNzcKICNkZWZpbmUgRU0yODE3NF9CT0FSRF9QQ1RWXzI5MEUgICAgICAgICAgICAgICAgICAgNzgKICNkZWZpbmUgRU0yODg0X0JPQVJEX1RFUlJBVEVDX0g1CQkgIDc5CisjZGVmaW5lIEVNMjgxNzRfQk9BUkRfUENUVl80NjBFICAgICAgICAgICAgICAgICAgIDgwCiAKIC8qIExpbWl0cyBtaW5pbXVtIGFuZCBkZWZhdWx0IG51bWJlciBvZiBidWZmZXJzICovCiAjZGVmaW5lIEVNMjhYWF9NSU5fQlVGIDQKQEAgLTY3Nyw4ICs2NzgsNiBAQAogaW50IGVtMjh4eF9zZXRfbW9kZShzdHJ1Y3QgZW0yOHh4ICpkZXYsIGVudW0gZW0yOHh4X21vZGUgc2V0X21vZGUpOwogaW50IGVtMjh4eF9ncGlvX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSAqZ3Bpbyk7CiB2b2lkIGVtMjh4eF93YWtlX2kyYyhzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotdm9pZCBlbTI4eHhfcmVtb3ZlX2Zyb21fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotdm9pZCBlbTI4eHhfYWRkX2ludG9fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IGVtMjh4eF9vcHMgKmRldik7CiB2b2lkIGVtMjh4eF91bnJlZ2lzdGVyX2V4dGVuc2lvbihzdHJ1Y3QgZW0yOHh4X29wcyAqZGV2KTsKIHZvaWQgZW0yOHh4X2luaXRfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHggKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxLmgKaW5kZXggMTRiYjkwNy4uMzM3ZGVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTEuaApAQCAtMTY1LDQ1ICsxNjUsNDkgQEAKICN1bmRlZiBEQkcKICN1bmRlZiBLREJHCiAjaWZkZWYgRVQ2MVgyNTFfREVCVUcKLSMJZGVmaW5lIERCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZGVidWcgPj0gKGxldmVsKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoKGxldmVsKSA9PSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWRldl9lcnIoJmNhbS0+dXNiZGV2LT5kZXYsIGZtdCAiXG4iLCAjIyBhcmdzKTsgICAgICAgIFwKLQkJZWxzZSBpZiAoKGxldmVsKSA9PSAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlkZXZfaW5mbygmY2FtLT51c2JkZXYtPmRldiwgZm10ICJcbiIsICMjIGFyZ3MpOyAgICAgICBcCi0JCWVsc2UgaWYgKChsZXZlbCkgPj0gMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJZGV2X2luZm8oJmNhbS0+dXNiZGV2LT5kZXYsICJbJXM6JXM6JWRdICIgZm10ICJcbiIsICAgXAotCQkJCSBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncyk7IFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBEQkcobGV2ZWwsIGZtdCwgLi4uKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKGRlYnVnID49IChsZXZlbCkpIHsJCQkJCQlcCisJCWlmICgobGV2ZWwpID09IDEpCQkJCQlcCisJCQlkZXZfZXJyKCZjYW0tPnVzYmRldi0+ZGV2LCBmbXQgIlxuIiwJCVwKKwkJCQkjI19fVkFfQVJHU19fKTsJCQkJXAorCQllbHNlIGlmICgobGV2ZWwpID09IDIpCQkJCQlcCisJCQlkZXZfaW5mbygmY2FtLT51c2JkZXYtPmRldiwgZm10ICJcbiIsCQlcCisJCQkJICMjX19WQV9BUkdTX18pOwkJCVwKKwkJZWxzZSBpZiAoKGxldmVsKSA+PSAzKQkJCQkJXAorCQkJZGV2X2luZm8oJmNhbS0+dXNiZGV2LT5kZXYsICJbJXM6JXM6JWRdICIgZm10ICJcbiIsIFwKKwkJCQkgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXywJCVwKKwkJCQkgIyNfX1ZBX0FSR1NfXyk7CQkJXAorCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCi0jCWRlZmluZSBLREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGRlYnVnID49IChsZXZlbCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKChsZXZlbCkgPT0gMSB8fCAobGV2ZWwpID09IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcl9pbmZvKCJldDYxeDI1MTogIiBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgICAgICBcCi0JCWVsc2UgaWYgKChsZXZlbCkgPT0gMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJfZGVidWcoInNuOWMxMDI6IFslczolczolZF0gIiBmbXQgIlxuIiwgX19GSUxFX18sICAgXAotCQkJCSBfX2Z1bmNfXywgX19MSU5FX18gLCAjIyBhcmdzKTsgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBLREJHKGxldmVsLCBmbXQsIC4uLikJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKSB7CQkJCQkJXAorCQlpZiAoKGxldmVsKSA9PSAxIHx8IChsZXZlbCkgPT0gMikJCQlcCisJCQlwcl9pbmZvKGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKTsJCVwKKwkJZWxzZSBpZiAoKGxldmVsKSA9PSAzKQkJCQkJXAorCQkJcHJfZGVidWcoIlslczolczolZF0gIiBmbXQgIlxuIiwJCVwKKwkJCQkgX19GSUxFX18sICBfX2Z1bmNfXywgX19MSU5FX18sCQlcCisJCQkJICMjX19WQV9BUkdTX18pOwkJCVwKKwl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQotIwlkZWZpbmUgVjRMREJHKGxldmVsLCBuYW1lLCBjbWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXY0bF9wcmludF9pb2N0bChuYW1lLCBjbWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBWNExEQkcobGV2ZWwsIG5hbWUsIGNtZCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKGRlYnVnID49IChsZXZlbCkpCQkJCQkJXAorCQl2NGxfcHJpbnRfaW9jdGwobmFtZSwgY21kKTsJCQkJXAogfSB3aGlsZSAoMCkKICNlbHNlCi0jCWRlZmluZSBEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8gezt9IHdoaWxlKDApCi0jCWRlZmluZSBLREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKQotIwlkZWZpbmUgVjRMREJHKGxldmVsLCBuYW1lLCBjbWQpIGRvIHs7fSB3aGlsZSgwKQorI2RlZmluZSBEQkcobGV2ZWwsIGZtdCwgLi4uKSBkbyB7O30gd2hpbGUoMCkKKyNkZWZpbmUgS0RCRyhsZXZlbCwgZm10LCAuLi4pIGRvIHs7fSB3aGlsZSgwKQorI2RlZmluZSBWNExEQkcobGV2ZWwsIG5hbWUsIGNtZCkgZG8gezt9IHdoaWxlKDApCiAjZW5kaWYKIAogI3VuZGVmIFBEQkcKLSNkZWZpbmUgUERCRyhmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRldl9pbmZvKCZjYW0tPnVzYmRldi0+ZGV2LCAiWyVzOiVzOiVkXSAiIGZtdCAiXG4iLCBfX0ZJTEVfXywgX19mdW5jX18sICAgXAotCSBfX0xJTkVfXyAsICMjIGFyZ3MpCisjZGVmaW5lIFBEQkcoZm10LCAuLi4pCQkJCQkJCVwKKwlkZXZfaW5mbygmY2FtLT51c2JkZXYtPmRldiwgIlslczolczolZF0gIiBmbXQgIlxuIiwJCVwKKwkJIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pCiAKICN1bmRlZiBQREJHRwotI2RlZmluZSBQREJHRyhmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKSAvKiBwbGFjZWhvbGRlciAqLworI2RlZmluZSBQREJHRyhmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSAoMCkgLyogcGxhY2Vob2xkZXIgKi8KIAogI2VuZGlmIC8qIF9FVDYxWDI1MV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwppbmRleCA5YTFlODBhLi5kMzc3N2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfdGFzNTEzMGQxYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV90YXM1MTMwZDFiLmMKaW5kZXggMDRiN2ZiYi4uY2VkMmUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV90YXM1MTMwZDFiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV90YXM1MTMwZDFiLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgImV0NjF4MjUxX3NlbnNvci5oIgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZwppbmRleCA0M2Q5YTIwLi4xMDNhZjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnCkBAIC0zNTYsNiArMzU2LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV90NjEzLgogCitjb25maWcgVVNCX0dTUENBX1RPUFJPCisJdHJpc3RhdGUgIlRPUFJPIFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlCisJICBUUDY4MDAgYW5kIFRQNjgxMCBUb3BybyBjaGlwcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2FfdG9wcm8uCisKIGNvbmZpZyBVU0JfR1NQQ0FfVFY4NTMyCiAJdHJpc3RhdGUgIlRWODUzMiBVU0IgQ2FtZXJhIERyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZQppbmRleCBkNjM2NGE4Li5mMzQ1ZjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUKQEAgLTM1LDYgKzM1LDcgQEAKIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU1RLMDE0KSAgICs9IGdzcGNhX3N0azAxNC5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NUVjA2ODApICArPSBnc3BjYV9zdHYwNjgwLm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfVDYxMykgICAgICs9IGdzcGNhX3Q2MTMubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9UT1BSTykgICAgKz0gZ3NwY2FfdG9wcm8ubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9UVjg1MzIpICAgKz0gZ3NwY2FfdHY4NTMyLm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfVkMwMzJYKSAgICs9IGdzcGNhX3ZjMDMyeC5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1ZJQ0FNKSAgICArPSBnc3BjYV92aWNhbS5vCkBAIC03OCw2ICs3OSw3IEBACiBnc3BjYV9zdHYwNjgwLW9ianMgIDo9IHN0djA2ODAubwogZ3NwY2Ffc3VucGx1cy1vYmpzICA6PSBzdW5wbHVzLm8KIGdzcGNhX3Q2MTMtb2JqcyAgICAgOj0gdDYxMy5vCitnc3BjYV90b3Byby1vYmpzICAgIDo9IHRvcHJvLm8KIGdzcGNhX3R2ODUzMi1vYmpzICAgOj0gdHY4NTMyLm8KIGdzcGNhX3ZjMDMyeC1vYmpzICAgOj0gdmMwMzJ4Lm8KIGdzcGNhX3ZpY2FtLW9ianMgICAgOj0gdmljYW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9iZW5xLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2JlbnEuYwppbmRleCBhMDljNDcwLi42YWUyNjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2JlbnEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2JlbnEuYwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgImJlbnEiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtNjIsNyArNjQsNyBAQAogCQkJMCwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTg0LDIwICs4Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2RfaXNvY19pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UoZ3NwY2FfZGV2LT5kZXYsIGdzcGNhX2Rldi0+aWZhY2UsCi0JCWdzcGNhX2Rldi0+bmJhbHQgLSAxKTsKLQlpZiAocmV0IDwgMCkgewotCQllcnIoInVzYl9zZXRfaW50ZXJmYWNlIGZhaWxlZCIpOwotCQlyZXR1cm4gcmV0OwotCX0KLS8qCXJlZ193KGdzcGNhX2RldiwgMHgwMDAzLCAweDAwMDIpOyAqLwotCXJldHVybiAwOwotfQotCiAvKiAtLSBzdGFydCB0aGUgY2FtZXJhIC0tICovCiBzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKQEAgLTExMyw3ICsxMDEsNyBAQAogCWZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihTRF9OUEtULCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWVycigidXNiX2FsbG9jX3VyYiBmYWlsZWQiKTsKKwkJCXByX2VycigidXNiX2FsbG9jX3VyYiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJZ3NwY2FfZGV2LT51cmJbbl0gPSB1cmI7CkBAIC0xMjMsNyArMTExLDcgQEAKIAkJCQkJCSZ1cmItPnRyYW5zZmVyX2RtYSk7CiAKIAkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCWVycigidXNiX2FsbG9jX2NvaGVyZW50IGZhaWxlZCIpOworCQkJcHJfZXJyKCJ1c2JfYWxsb2NfY29oZXJlbnQgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXVyYi0+ZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CkBAIC0xODEsNyArMTY5LDcgQEAKIAkJaWYgKGdzcGNhX2Rldi0+ZnJvemVuKQogCQkJcmV0dXJuOwogI2VuZGlmCi0JCWVycigidXJiIHN0YXR1czogJWQiLCB1cmItPnN0YXR1cyk7CisJCXByX2VycigidXJiIHN0YXR1czogJWRcbiIsIHVyYi0+c3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjA5LDcgKzE5Nyw3IEBACiAJCWlmIChzdCA9PSAwKQogCQkJc3QgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKIAkJaWYgKHN0KSB7Ci0JCQllcnIoIklTT0MgZGF0YSBlcnJvcjogWyVkXSBzdGF0dXM9JWQiLAorCQkJcHJfZXJyKCJJU09DIGRhdGEgZXJyb3I6IFslZF0gc3RhdHVzPSVkXG4iLAogCQkJCWksIHN0KTsKIAkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwogCQkJY29udGludWU7CkBAIC0yNTYsMTAgKzI0NCwxMCBAQAogCS8qIHJlc3VibWl0IHRoZSBVUkJzICovCiAJc3QgPSB1c2Jfc3VibWl0X3VyYih1cmIwLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3QgPCAwKQotCQllcnIoInVzYl9zdWJtaXRfdXJiKDApIHJldCAlZCIsIHN0KTsKKwkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYigwKSByZXQgJWRcbiIsIHN0KTsKIAlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0IDwgMCkKLQkJZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZCIsIHN0KTsKKwkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZFxuIiwgc3QpOwogfQogCiAvKiBzdWItZHJpdmVyIGRlc2NyaXB0aW9uICovCkBAIC0yNjksNyArMjU3LDYgQEAKIAkubmN0cmxzID0gQVJSQVlfU0laRShzZF9jdHJscyksCiAJLmNvbmZpZyA9IHNkX2NvbmZpZywKIAkuaW5pdCA9IHNkX2luaXQsCi0JLmlzb2NfaW5pdCA9IHNkX2lzb2NfaW5pdCwKIAkuc3RhcnQgPSBzZF9zdGFydCwKIAkuc3RvcE4gPSBzZF9zdG9wTiwKIAkucGt0X3NjYW4gPSBzZF9wa3Rfc2NhbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYwppbmRleCA4YjM5ODQ5Li40YzU2ZGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NvbmV4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jb25leC5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAiY29uZXgiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMTI5LDcgKzEzMSw3IEBACiAKICNpZmRlZiBHU1BDQV9ERUJVRwogCWlmIChsZW4gPiBVU0JfQlVGX1NaKSB7Ci0JCWVycigicmVnX3I6IGJ1ZmZlciBvdmVyZmxvdyIpOworCQlwcl9lcnIoInJlZ19yOiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogCQlyZXR1cm47CiAJfQogI2VuZGlmCkBAIC0xNjksNyArMTcxLDcgQEAKIAogI2lmZGVmIEdTUENBX0RFQlVHCiAJaWYgKGxlbiA+IFVTQl9CVUZfU1opIHsKLQkJZXJyKCJyZWdfdzogYnVmZmVyIG92ZXJmbG93Iik7CisJCXByX2VycigicmVnX3c6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAJCXJldHVybjsKIAl9CiAJUERFQlVHKERfVVNCTywgInJlZyB3cml0ZSBbJTAyeF0gPSAlMDJ4Li4iLCBpbmRleCwgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NwaWExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NwaWExLmMKaW5kZXggZjJhOTQ1MS4uZjliODZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jcGlhMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY3BpYTEuYwpAQCAtMjYsNiArMjYsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgImNwaWExIgogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KQEAgLTU1MCw4ICs1NTIsNyBAQAogCQkJICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmLCBkYXRhYnl0ZXMsIDEwMDApOwogCiAJaWYgKHJldCA8IDApCi0JCWVycigidXNiX2NvbnRyb2xfbXNnICUwMngsIGVycm9yICVkIiwgY29tbWFuZFsxXSwKLQkJICAgICAgIHJldCk7CisJCXByX2VycigidXNiX2NvbnRyb2xfbXNnICUwMngsIGVycm9yICVkXG4iLCBjb21tYW5kWzFdLCByZXQpOwogCiAJaWYgKHJldCA9PSAtRVBJUEUgJiYgcmV0cmllcyA+IDApIHsKIAkJcmV0cmllcy0tOwpAQCAtMTI3OSw3ICsxMjgwLDcgQEAKIAljbWRbN10gPSAwOwogCXJldCA9IGNwaWFfdXNiX3RyYW5zZmVyQ21kKGdzcGNhX2RldiwgY21kKTsKIAlpZiAocmV0KSB7Ci0JCWVycigiUmVhZFZQUmVncygzMCw0LDksOCkgLSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJSZWFkVlBSZWdzKDMwLDQsOSw4KSAtIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCXJldHVybjsKIAl9CiAJZXhwX2FjYyA9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZXRvbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZXRvbXMuYwppbmRleCA0YjJjNDgzLi4wMzU3ZDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2V0b21zLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9ldG9tcy5jCkBAIC0xOCw2ICsxOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAiZXRvbXMiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMjM2LDcgKzIzOCw3IEBACiAKICNpZmRlZiBHU1BDQV9ERUJVRwogCWlmIChsZW4gPiBVU0JfQlVGX1NaKSB7Ci0JCWVycigicmVnX3I6IGJ1ZmZlciBvdmVyZmxvdyIpOworCQlwcl9lcnIoInJlZ19yOiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogCQlyZXR1cm47CiAJfQogI2VuZGlmCkBAIC0yNzQsNyArMjc2LDcgQEAKIAogI2lmZGVmIEdTUENBX0RFQlVHCiAJaWYgKGxlbiA+IFVTQl9CVUZfU1opIHsKLQkJZXJyKCJyZWdfdzogYnVmZmVyIG92ZXJmbG93Iik7CisJCXByX2VycigicmVnX3c6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAJCXJldHVybjsKIAl9CiAJUERFQlVHKERfVVNCTywgInJlZyB3cml0ZSBbJTAyeF0gPSAlMDJ4Li4iLCBpbmRleCwgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2ZpbmVwaXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZmluZXBpeC5jCmluZGV4IDk4N2I0YjY5ZC4uZWE0ODIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9maW5lcGl4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9maW5lcGl4LmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJmaW5lcGl4IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTE4Miw3ICsxODQsNyBAQAogCS8qIEluaXQgdGhlIGRldmljZSAqLwogCXJldCA9IGNvbW1hbmQoZ3NwY2FfZGV2LCAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoImluaXQgZmFpbGVkICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJpbml0IGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE5NCwxNCArMTk2LDE0IEBACiAJCQlGUElYX01BWF9UUkFOU0ZFUiwgJmxlbiwKIAkJCUZQSVhfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJ1c2JfYnVsa19tc2cgZmFpbGVkICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJ1c2JfYnVsa19tc2cgZmFpbGVkICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIFJlcXVlc3QgYSBmcmFtZSwgYnV0IGRvbid0IHJlYWQgaXQgKi8KIAlyZXQgPSBjb21tYW5kKGdzcGNhX2RldiwgMSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJmcmFtZSByZXF1ZXN0IGZhaWxlZCAlZCIsIHJldCk7CisJCXByX2VycigiZnJhbWUgcmVxdWVzdCBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9NYWtlZmlsZQppbmRleCAxM2M5NDAzLi5mNTExZWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvTWFrZWZpbGUKQEAgLTYsNSArNiw1IEBACiAJCSAgICBnbDg2MC1vdjk2NTUubyBcCiAJCSAgICBnbDg2MC1taTIwMjAubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuYwppbmRleCBlOGUwNzFhLi4yY2VkM2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5jCkBAIC0xOCw2ICsxOCw5IEBACiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSAiZ3NwY2EuaCIKICNpbmNsdWRlICJnbDg2MC5oIgogCkBAIC01NzIsOSArNTc1LDggQEAKIAl9CiAKIAlpZiAociA8IDApCi0JCWVycigiY3RybCB0cmFuc2ZlciBmYWlsZWQgJTRkICIKLQkJCSJbcCUwMnggciVkIHYlMDR4IGklMDR4IGxlbiVkXSIsCi0JCQlyLCBwcmVmLCByZXEsIHZhbCwgaW5kZXgsIGxlbik7CisJCXByX2VycigiY3RybCB0cmFuc2ZlciBmYWlsZWQgJTRkIFtwJTAyeCByJWQgdiUwNHggaSUwNHggbGVuJWRdXG4iLAorCQkgICAgICAgciwgcHJlZiwgcmVxLCB2YWwsIGluZGV4LCBsZW4pOwogCWVsc2UgaWYgKGxlbiA+IDEgJiYgciA8IGxlbikKIAkJUERFQlVHKERfRVJSLCAic2hvcnQgY3RybCB0cmFuc2ZlciAlZC8lZCIsIHIsIGxlbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYwppbmRleCA1ZGE0ODc5Li44ODFlMDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCkBAIC0yMSw3ICsyMSw5IEBACiAgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jZGVmaW5lIE1PRFVMRV9OQU1FICJnc3BjYSIKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2RlZmluZSBHU1BDQV9WRVJTSU9OCSIyLjE0LjAiCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTUwLDEyICs1MiwxMCBAQAogI2Vycm9yICJERUZfTlVSQlMgdG9vIGJpZyIKICNlbmRpZgogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OX05VTUJFUgkiMi4xMy4wIgotCiBNT0RVTEVfQVVUSE9SKCJKZWFuLUZyYW7Dp29pcyBNb2luZSA8aHR0cDovL21vaW5lamYuZnJlZS5mcj4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiR1NQQ0EgVVNCIENhbWVyYSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OX05VTUJFUik7CitNT0RVTEVfVkVSU0lPTihHU1BDQV9WRVJTSU9OKTsKIAogI2lmZGVmIEdTUENBX0RFQlVHCiBpbnQgZ3NwY2FfZGVidWcgPSBEX0VSUiB8IERfUFJPQkU7CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlpZiAocmV0ID09IDApIHsKIAkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJldCA8IDApCi0JCQllcnIoIlJlc3VibWl0IFVSQiBmYWlsZWQgd2l0aCBlcnJvciAlaSIsIHJldCk7CisJCQlwcl9lcnIoIlJlc3VibWl0IFVSQiBmYWlsZWQgd2l0aCBlcnJvciAlaVxuIiwgcmV0KTsKIAl9CiB9CiAKQEAgLTE3Nyw4ICsxNzcsOCBAQAogCiAJCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwogCQlpZiAoZXJyKSB7Ci0JCQllcnIoIklucHV0IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJWkiLAotCQkJCWVycik7CisJCQlwcl9lcnIoIklucHV0IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJWlcbiIsCisJCQkgICAgICAgZXJyKTsKIAkJCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9IE5VTEw7CiAJCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwogCQl9IGVsc2UgewpAQCAtMzIzLDggKzMyMyw4IEBACiAJCS8qIGNoZWNrIHRoZSBwYWNrZXQgc3RhdHVzIGFuZCBsZW5ndGggKi8KIAkJc3QgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKIAkJaWYgKHN0KSB7Ci0JCQllcnIoIklTT0MgZGF0YSBlcnJvcjogWyVkXSBsZW49JWQsIHN0YXR1cz0lZCIsCi0JCQkJaSwgbGVuLCBzdCk7CisJCQlwcl9lcnIoIklTT0MgZGF0YSBlcnJvcjogWyVkXSBsZW49JWQsIHN0YXR1cz0lZFxuIiwKKwkJCSAgICAgICBpLCBsZW4sIHN0KTsKIAkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwogCQkJY29udGludWU7CiAJCX0KQEAgLTM0Niw3ICszNDYsNyBAQAogCS8qIHJlc3VibWl0IHRoZSBVUkIgKi8KIAlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0IDwgMCkKLQkJZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZCIsIHN0KTsKKwkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZFxuIiwgc3QpOwogfQogCiAvKgpAQCAtNDAwLDcgKzQwMCw3IEBACiAJaWYgKGdzcGNhX2Rldi0+Y2FtLmJ1bGtfbnVyYnMgIT0gMCkgewogCQlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChzdCA8IDApCi0JCQllcnIoInVzYl9zdWJtaXRfdXJiKCkgcmV0ICVkIiwgc3QpOworCQkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZFxuIiwgc3QpOwogCX0KIH0KIApAQCAtNDY0LDcgKzQ2NCw3IEBACiAJCX0gZWxzZSB7CiAvKiAhISBpbWFnZSBpcyBOVUxMIG9ubHkgd2hlbiBsYXN0IHBrdCBpcyBMQVNUIG9yIERJU0NBUkQKIAkJCWlmIChnc3BjYV9kZXYtPmltYWdlID09IE5VTEwpIHsKLQkJCQllcnIoImdzcGNhX2ZyYW1lX2FkZCgpIGltYWdlID09IE5VTEwiKTsKKwkJCQlwcl9lcnIoImdzcGNhX2ZyYW1lX2FkZCgpIGltYWdlID09IE5VTExcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KICAqLwpAQCAtNDk3LDE5ICs0OTcsNiBAQAogfQogRVhQT1JUX1NZTUJPTChnc3BjYV9mcmFtZV9hZGQpOwogCi1zdGF0aWMgaW50IGdzcGNhX2lzX2NvbXByZXNzZWQoX191MzIgZm9ybWF0KQotewotCXN3aXRjaCAoZm9ybWF0KSB7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTUpQRUc6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfSlBFRzoKLQljYXNlIFY0TDJfUElYX0ZNVF9TUENBNTYxOgotCWNhc2UgVjRMMl9QSVhfRk1UX1BBQzIwNzoKLQljYXNlIFY0TDJfUElYX0ZNVF9NUjk3MzEwQToKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGZyYW1lX2FsbG9jKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldiwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQllbnVtIHY0bDJfbWVtb3J5IG1lbW9yeSwgdW5zaWduZWQgaW50IGNvdW50KQogewpAQCAtNTI1LDcgKzUxMiw3IEBACiAJCWNvdW50ID0gR1NQQ0FfTUFYX0ZSQU1FUyAtIDE7CiAJZ3NwY2FfZGV2LT5mcmJ1ZiA9IHZtYWxsb2NfMzIoZnJzeiAqIGNvdW50KTsKIAlpZiAoIWdzcGNhX2Rldi0+ZnJidWYpIHsKLQkJZXJyKCJmcmFtZSBhbGxvYyBmYWlsZWQiKTsKKwkJcHJfZXJyKCJmcmFtZSBhbGxvYyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZ3NwY2FfZGV2LT5jYXB0X2ZpbGUgPSBmaWxlOwpAQCAtNTk3LDcgKzU4NCw3IEBACiAJCXJldHVybiAwOwogCXJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKGdzcGNhX2Rldi0+ZGV2LCBnc3BjYV9kZXYtPmlmYWNlLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJZXJyKCJzZXQgYWx0IDAgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJzZXQgYWx0IDAgZXJyICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY0MCw1MyArNjI3LDEwNCBAQAogCXJldHVybiBOVUxMOwogfQogCi0vKgotICogbG9vayBmb3IgYW4gaW5wdXQgKGlzb2Mgb3IgYnVsaykgZW5kcG9pbnQKLSAqCi0gKiBUaGUgZW5kcG9pbnQgaXMgZGVmaW5lZCBieSB0aGUgc3ViZHJpdmVyLgotICogVXNlIG9ubHkgdGhlIGZpcnN0IGlzb2MgKHNvbWUgWm9yYW4gLSAweDA1NzI6MHgwMDAxIC0gaGF2ZSB0d28gc3VjaCBlcCkuCi0gKiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCBtYW55IHRpbWVzIHdoZW4gdGhlIGJhbmR3aWR0aCBpcyB0b28gc21hbGwKLSAqICh0aGUgYmFuZHdpZHRoIGlzIGNoZWNrZWQgb24gdXJiIHN1Ym1pdCkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmdldF9lcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCisvKiBjb21wdXRlIHRoZSBtaW5pbXVtIGJhbmR3aWR0aCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmZXIgKi8KK3N0YXRpYyB1MzIgd2hpY2hfYmFuZHdpZHRoKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKLQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOwotCWludCB4ZmVyLCBpLCByZXQ7CisJdTMyIGJhbmR3aWR0aDsKKwlpbnQgaTsKIAotCWludGYgPSB1c2JfaWZudW1fdG9faWYoZ3NwY2FfZGV2LT5kZXYsIGdzcGNhX2Rldi0+aWZhY2UpOwotCWVwID0gTlVMTDsKLQl4ZmVyID0gZ3NwY2FfZGV2LT5jYW0uYnVsayA/IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKLQkJCQkgICA6IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M7Ci0JaSA9IGdzcGNhX2Rldi0+YWx0OwkJCS8qIHByZXZpb3VzIGFsdCBzZXR0aW5nICovCi0JaWYgKGdzcGNhX2Rldi0+Y2FtLnJldmVyc2VfYWx0cykgewotCQl3aGlsZSAoKytpIDwgZ3NwY2FfZGV2LT5uYmFsdCkgewotCQkJZXAgPSBhbHRfeGZlcigmaW50Zi0+YWx0c2V0dGluZ1tpXSwgeGZlcik7Ci0JCQlpZiAoZXApCi0JCQkJYnJlYWs7Ci0JCX0KKwlpID0gZ3NwY2FfZGV2LT5jdXJyX21vZGU7CisJYmFuZHdpZHRoID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbaV0uc2l6ZWltYWdlOworCisJLyogaWYgdGhlIGltYWdlIGlzIGNvbXByZXNzZWQsIGVzdGltYXRlIHRoZSBtZWFuIGltYWdlIHNpemUgKi8KKwlpZiAoYmFuZHdpZHRoIDwgZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbaV0ud2lkdGggKgorCQkJCWdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2ldLmhlaWdodCkKKwkJYmFuZHdpZHRoIC89IDM7CisKKwkvKiBlc3RpbWF0ZSB0aGUgZnJhbWUgcmF0ZSAqLworCWlmIChnc3BjYV9kZXYtPnNkX2Rlc2MtPmdldF9zdHJlYW1wYXJtKSB7CisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gcGFybTsKKworCQlwYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSAxNTsKKwkJZ3NwY2FfZGV2LT5zZF9kZXNjLT5nZXRfc3RyZWFtcGFybShnc3BjYV9kZXYsICZwYXJtKTsKKwkJYmFuZHdpZHRoICo9IHBhcm0ucGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvcjsKIAl9IGVsc2UgewotCQl3aGlsZSAoLS1pID49IDApIHsKLQkJCWVwID0gYWx0X3hmZXIoJmludGYtPmFsdHNldHRpbmdbaV0sIHhmZXIpOwotCQkJaWYgKGVwKQotCQkJCWJyZWFrOworCQliYW5kd2lkdGggKj0gMTU7CQkvKiAxNSBmcHMgKi8KKwl9CisKKwlQREVCVUcoRF9TVFJFQU0sICJtaW4gYmFuZHdpZHRoOiAlZCIsIGJhbmR3aWR0aCk7CisJcmV0dXJuIGJhbmR3aWR0aDsKK30KKworLyogZW5kcG9pbnQgdGFibGUgKi8KKyNkZWZpbmUgTUFYX0FMVCAxNgorc3RydWN0IGVwX3RiX3MgeworCXUzMiBhbHQ7CisJdTMyIGJhbmR3aWR0aDsKK307CisKKy8qCisgKiBidWlsZCB0aGUgdGFibGUgb2YgdGhlIGVuZHBvaW50cworICogYW5kIGNvbXB1dGUgdGhlIG1pbmltdW0gYmFuZHdpZHRoIGZvciB0aGUgaW1hZ2UgdHJhbnNmZXIKKyAqLworc3RhdGljIGludCBidWlsZF9lcF90YihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCWludCB4ZmVyLAorCQkJc3RydWN0IGVwX3RiX3MgKmVwX3RiKQoreworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXA7CisJaW50IGksIGosIG5iYWx0LCBwc2l6ZSwgZm91bmQ7CisJdTMyIGJhbmR3aWR0aCwgbGFzdF9idzsKKworCW5iYWx0ID0gaW50Zi0+bnVtX2FsdHNldHRpbmc7CisJaWYgKG5iYWx0ID4gTUFYX0FMVCkKKwkJbmJhbHQgPSBNQVhfQUxUOwkvKiBmaXhtZTogc2hvdWxkIHdhcm4gKi8KKworCS8qIGJ1aWxkIHRoZSBlbmRwb2ludCB0YWJsZSAqLworCWkgPSAwOworCWxhc3RfYncgPSAwOworCWZvciAoOzspIHsKKwkJZXBfdGItPmJhbmR3aWR0aCA9IDIwMDAgKiAyMDAwICogMTIwOworCQlmb3VuZCA9IDA7CisJCWZvciAoaiA9IDA7IGogPCBuYmFsdDsgaisrKSB7CisJCQllcCA9IGFsdF94ZmVyKCZpbnRmLT5hbHRzZXR0aW5nW2pdLCB4ZmVyKTsKKwkJCWlmIChlcCA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJcHNpemUgPSBsZTE2X3RvX2NwdShlcC0+ZGVzYy53TWF4UGFja2V0U2l6ZSk7CisJCQlpZiAoIWdzcGNhX2Rldi0+Y2FtLmJ1bGspCQkvKiBpc29jICovCisJCQkJcHNpemUgPSAocHNpemUgJiAweDA3ZmYpICoKKwkJCQkJCSgxICsgKChwc2l6ZSA+PiAxMSkgJiAzKSk7CisJCQliYW5kd2lkdGggPSBwc2l6ZSAqIGVwLT5kZXNjLmJJbnRlcnZhbCAqIDEwMDA7CisJCQlpZiAoZ3NwY2FfZGV2LT5kZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdICisJCQkgfHwgZ3NwY2FfZGV2LT5kZXYtPnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikKKwkJCQliYW5kd2lkdGggKj0gODsKKwkJCWlmIChiYW5kd2lkdGggPD0gbGFzdF9idykKKwkJCQljb250aW51ZTsKKwkJCWlmIChiYW5kd2lkdGggPCBlcF90Yi0+YmFuZHdpZHRoKSB7CisJCQkJZXBfdGItPmJhbmR3aWR0aCA9IGJhbmR3aWR0aDsKKwkJCQllcF90Yi0+YWx0ID0gajsKKwkJCQlmb3VuZCA9IDE7CisJCQl9CiAJCX0KKwkJaWYgKCFmb3VuZCkKKwkJCWJyZWFrOworCQlQREVCVUcoRF9TVFJFQU0sICJhbHQgJWQgYmFuZHdpZHRoICVkIiwKKwkJCQllcF90Yi0+YWx0LCBlcF90Yi0+YmFuZHdpZHRoKTsKKwkJbGFzdF9idyA9IGVwX3RiLT5iYW5kd2lkdGg7CisJCWkrKzsKKwkJZXBfdGIrKzsKIAl9Ci0JaWYgKGVwID09IE5VTEwpIHsKLQkJZXJyKCJubyB0cmFuc2ZlciBlbmRwb2ludCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKKworCS8qIGdldCB0aGUgcmVxdWVzdGVkIGJhbmR3aWR0aCBhbmQgc3RhcnQgYXQgdGhlIGhpZ2hlc3QgYXRsc2V0dGluZyAqLworCWJhbmR3aWR0aCA9IHdoaWNoX2JhbmR3aWR0aChnc3BjYV9kZXYpOworCWVwX3RiLS07CisJd2hpbGUgKGkgPiAxKSB7CisJCWVwX3RiLS07CisJCWlmIChlcF90Yi0+YmFuZHdpZHRoIDwgYmFuZHdpZHRoKQorCQkJYnJlYWs7CisJCWktLTsKIAl9Ci0JUERFQlVHKERfU1RSRUFNLCAidXNlIGFsdCAlZCBlcCAweCUwMngiLAotCQkJaSwgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7Ci0JZ3NwY2FfZGV2LT5hbHQgPSBpOwkJLyogbWVtb3JpemUgdGhlIGN1cnJlbnQgYWx0IHNldHRpbmcgKi8KLQlpZiAoZ3NwY2FfZGV2LT5uYmFsdCA+IDEpIHsKLQkJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UoZ3NwY2FfZGV2LT5kZXYsIGdzcGNhX2Rldi0+aWZhY2UsIGkpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZXJyKCJzZXQgYWx0ICVkIGVyciAlZCIsIGksIHJldCk7Ci0JCQllcCA9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVwOworCXJldHVybiBpOwogfQogCiAvKgpAQCAtNzMxLDcgKzc2OSw3IEBACiAJZm9yIChuID0gMDsgbiA8IG51cmJzOyBuKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihucGt0LCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWVycigidXNiX2FsbG9jX3VyYiBmYWlsZWQiKTsKKwkJCXByX2VycigidXNiX2FsbG9jX3VyYiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJZ3NwY2FfZGV2LT51cmJbbl0gPSB1cmI7CkBAIC03NDEsNyArNzc5LDcgQEAKIAkJCQkJCSZ1cmItPnRyYW5zZmVyX2RtYSk7CiAKIAkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCWVycigidXNiX2FsbG9jX2NvaGVyZW50IGZhaWxlZCIpOworCQkJcHJfZXJyKCJ1c2JfYWxsb2NfY29oZXJlbnQgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXVyYi0+ZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CkBAIC03NTIsNyArNzkwLDEwIEBACiAJCQkJCQkgICAgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CiAJCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQCiAJCQkJCXwgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7Ci0JCQl1cmItPmludGVydmFsID0gZXAtPmRlc2MuYkludGVydmFsOworCQkJaWYgKGdzcGNhX2Rldi0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfTE9XKQorCQkJCXVyYi0+aW50ZXJ2YWwgPSBlcC0+ZGVzYy5iSW50ZXJ2YWw7CisJCQllbHNlCisJCQkJdXJiLT5pbnRlcnZhbCA9IDEgPDwgKGVwLT5kZXNjLmJJbnRlcnZhbCAtIDEpOwogCQkJdXJiLT5jb21wbGV0ZSA9IGlzb2NfaXJxOwogCQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IG5wa3Q7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbnBrdDsgaSsrKSB7CkBAIC03NzQsOSArODE1LDExIEBACiAgKi8KIHN0YXRpYyBpbnQgZ3NwY2FfaW5pdF90cmFuc2ZlcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcDsKIAlzdHJ1Y3QgdXJiICp1cmI7Ci0JaW50IG4sIHJldDsKKwlzdHJ1Y3QgZXBfdGJfcyBlcF90YltNQVhfQUxUXTsKKwlpbnQgbiwgcmV0LCB4ZmVyLCBhbHQsIGFsdF9pZHg7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZnc3BjYV9kZXYtPnVzYl9sb2NrKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKQEAgLTc5NCwzMCArODM3LDY1IEBACiAKIAlnc3BjYV9kZXYtPnVzYl9lcnIgPSAwOwogCi0JLyogc2V0IHRoZSBoaWdoZXIgYWx0ZXJuYXRlIHNldHRpbmcgYW5kCi0JICogbG9vcCB1bnRpbCB1cmIgc3VibWl0IHN1Y2NlZWRzICovCi0JaWYgKGdzcGNhX2Rldi0+Y2FtLnJldmVyc2VfYWx0cykKLQkJZ3NwY2FfZGV2LT5hbHQgPSAwOwotCWVsc2UKLQkJZ3NwY2FfZGV2LT5hbHQgPSBnc3BjYV9kZXYtPm5iYWx0OwotCisJLyogZG8gdGhlIHNwZWNpZmljIHN1YmRyaXZlciBzdHVmZiBiZWZvcmUgZW5kcG9pbnQgc2VsZWN0aW9uICovCisJZ3NwY2FfZGV2LT5hbHQgPSAwOwogCWlmIChnc3BjYV9kZXYtPnNkX2Rlc2MtPmlzb2NfaW5pdCkgewogCQlyZXQgPSBnc3BjYV9kZXYtPnNkX2Rlc2MtPmlzb2NfaW5pdChnc3BjYV9kZXYpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gdW5sb2NrOwogCX0KKwlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKGdzcGNhX2Rldi0+ZGV2LCBnc3BjYV9kZXYtPmlmYWNlKTsKKwl4ZmVyID0gZ3NwY2FfZGV2LT5jYW0uYnVsayA/IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKKwkJCQkgICA6IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M7CiAKLQlnc3BjYV9pbnB1dF9kZXN0cm95X3VyYihnc3BjYV9kZXYpOwotCWVwID0gZ2V0X2VwKGdzcGNhX2Rldik7Ci0JaWYgKGVwID09IE5VTEwpIHsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXQ7CisJLyogaWYgdGhlIHN1YmRyaXZlciBmb3JjZWQgYW4gYWx0c2V0dGluZywgZ2V0IHRoZSBlbmRwb2ludCAqLworCWlmIChnc3BjYV9kZXYtPmFsdCAhPSAwKSB7CisJCWdzcGNhX2Rldi0+YWx0LS07CS8qIChwcmV2aW91cyB2ZXJzaW9uIGNvbXBhdGliaWxpdHkpICovCisJCWVwID0gYWx0X3hmZXIoJmludGYtPmFsdHNldHRpbmdbZ3NwY2FfZGV2LT5hbHRdLCB4ZmVyKTsKKwkJaWYgKGVwID09IE5VTEwpIHsKKwkJCXByX2VycigiYmFkIGFsdHNldHRpbmcgJWRcbiIsIGdzcGNhX2Rldi0+YWx0KTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQllcF90YlswXS5hbHQgPSBnc3BjYV9kZXYtPmFsdDsKKwkJYWx0X2lkeCA9IDE7CisJfSBlbHNlIHsKKworCS8qIGVsc2UsIGNvbXB1dGUgdGhlIG1pbmltdW0gYmFuZHdpZHRoCisJICogYW5kIGJ1aWxkIHRoZSBlbmRwb2ludCB0YWJsZSAqLworCQlhbHRfaWR4ID0gYnVpbGRfZXBfdGIoZ3NwY2FfZGV2LCBpbnRmLCB4ZmVyLCBlcF90Yik7CisJCWlmIChhbHRfaWR4IDw9IDApIHsKKwkJCXByX2Vycigibm8gdHJhbnNmZXIgZW5kcG9pbnQgZm91bmRcbiIpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gdW5sb2NrOworCQl9CiAJfQorCisJLyogc2V0IHRoZSBoaWdoZXN0IGFsdGVybmF0ZSBzZXR0aW5nIGFuZAorCSAqIGxvb3AgdW50aWwgdXJiIHN1Ym1pdCBzdWNjZWVkcyAqLworCWdzcGNhX2lucHV0X2Rlc3Ryb3lfdXJiKGdzcGNhX2Rldik7CisKKwlnc3BjYV9kZXYtPmFsdCA9IGVwX3RiWy0tYWx0X2lkeF0uYWx0OworCWFsdCA9IC0xOwogCWZvciAoOzspIHsKKwkJaWYgKGFsdCAhPSBnc3BjYV9kZXYtPmFsdCkgeworCQkJYWx0ID0gZ3NwY2FfZGV2LT5hbHQ7CisJCQlpZiAoZ3NwY2FfZGV2LT5uYmFsdCA+IDEpIHsKKwkJCQlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShnc3BjYV9kZXYtPmRldiwKKwkJCQkJCQlnc3BjYV9kZXYtPmlmYWNlLAorCQkJCQkJCWFsdCk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJaWYgKHJldCA9PSAtRU5PU1BDKQorCQkJCQkJZ290byByZXRyeTsgLypmaXhtZTogdWdseSovCisJCQkJCXByX2Vycigic2V0IGFsdCAlZCBlcnIgJWRcbiIsIGFsdCwgcmV0KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CiAJCWlmICghZ3NwY2FfZGV2LT5jYW0ubm9fdXJiX2NyZWF0ZSkgewotCQkJUERFQlVHKERfU1RSRUFNLCAiaW5pdCB0cmFuc2ZlciBhbHQgJWQiLAotCQkJCWdzcGNhX2Rldi0+YWx0KTsKLQkJCXJldCA9IGNyZWF0ZV91cmJzKGdzcGNhX2RldiwgZXApOworCQkJUERFQlVHKERfU1RSRUFNLCAiaW5pdCB0cmFuc2ZlciBhbHQgJWQiLCBhbHQpOworCQkJcmV0ID0gY3JlYXRlX3VyYnMoZ3NwY2FfZGV2LAorCQkJCWFsdF94ZmVyKCZpbnRmLT5hbHRzZXR0aW5nW2FsdF0sIHhmZXIpKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJZGVzdHJveV91cmJzKGdzcGNhX2Rldik7CiAJCQkJZ290byBvdXQ7CkBAIC04NTEsMjkgKzkyOSwzNSBAQAogCQkJCWJyZWFrOwogCQl9CiAJCWlmIChyZXQgPj0gMCkKLQkJCWJyZWFrOworCQkJYnJlYWs7CQkJLyogdHJhbnNmZXIgaXMgc3RhcnRlZCAqLworCisJCS8qIHNvbWV0aGluZyB3aGVuIHdyb25nCisJCSAqIHN0b3AgdGhlIHdlYmNhbSBhbmQgZnJlZSB0aGUgdHJhbnNmZXIgcmVzb3VyY2VzICovCiAJCWdzcGNhX3N0cmVhbV9vZmYoZ3NwY2FfZGV2KTsKIAkJaWYgKHJldCAhPSAtRU5PU1BDKSB7Ci0JCQllcnIoInVzYl9zdWJtaXRfdXJiIGFsdCAlZCBlcnIgJWQiLAotCQkJCWdzcGNhX2Rldi0+YWx0LCByZXQpOworCQkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYiBhbHQgJWQgZXJyICVkXG4iLAorCQkJICAgICAgIGdzcGNhX2Rldi0+YWx0LCByZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQkvKiB0aGUgYmFuZHdpZHRoIGlzIG5vdCB3aWRlIGVub3VnaAogCQkgKiBuZWdvdGlhdGUgb3IgdHJ5IGEgbG93ZXIgYWx0ZXJuYXRlIHNldHRpbmcgKi8KK3JldHJ5OgogCQlQREVCVUcoRF9FUlJ8RF9TVFJFQU0sCi0JCQkiYmFuZHdpZHRoIG5vdCB3aWRlIGVub3VnaCAtIHRyeWluZyBhZ2FpbiIpOworCQkJImFsdCAlZCAtIGJhbmR3aWR0aCBub3Qgd2lkZSBlbm91Z2ggLSB0cnlpbmcgYWdhaW4iLAorCQkJYWx0KTsKIAkJbXNsZWVwKDIwKTsJLyogd2FpdCBmb3Iga2lsbCBjb21wbGV0ZSAqLwogCQlpZiAoZ3NwY2FfZGV2LT5zZF9kZXNjLT5pc29jX25lZ28pIHsKIAkJCXJldCA9IGdzcGNhX2Rldi0+c2RfZGVzYy0+aXNvY19uZWdvKGdzcGNhX2Rldik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKLQkJCWVwID0gZ2V0X2VwKGdzcGNhX2Rldik7Ci0JCQlpZiAoZXAgPT0gTlVMTCkgeworCQkJaWYgKGFsdF9pZHggPD0gMCkgeworCQkJCXByX2Vycigibm8gdHJhbnNmZXIgZW5kcG9pbnQgZm91bmRcbiIpOwogCQkJCXJldCA9IC1FSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9CisJCQlhbHQgPSBlcF90YlstLWFsdF9pZHhdLmFsdDsKIAkJfQogCX0KIG91dDoKQEAgLTEwNDQsNyArMTEyOCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwkJLyogbm8gbW9yZSBmb3JtYXQgKi8KIAogCWZtdGRlc2MtPnBpeGVsZm9ybWF0ID0gZm10X3RiW2luZGV4XTsKLQlpZiAoZ3NwY2FfaXNfY29tcHJlc3NlZChmbXRfdGJbaW5kZXhdKSkKKwlpZiAoZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbaV0uc2l6ZWltYWdlIDwKKwkJCWdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2ldLndpZHRoICoKKwkJCQlnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVtpXS5oZWlnaHQpCiAJCWZtdGRlc2MtPmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOwogCWZtdGRlc2MtPmRlc2NyaXB0aW9uWzBdID0gZm10ZGVzYy0+cGl4ZWxmb3JtYXQgJiAweGZmOwogCWZtdGRlc2MtPmRlc2NyaXB0aW9uWzFdID0gKGZtdGRlc2MtPnBpeGVsZm9ybWF0ID4+IDgpICYgMHhmZjsKQEAgLTIxOTUsMTkgKzIyODEsMjAgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAlpbnQgcmV0OwogCi0JUERFQlVHKERfUFJPQkUsICJwcm9iaW5nICUwNHg6JTA0eCIsIGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CisJcHJfaW5mbygiJXMtIiBHU1BDQV9WRVJTSU9OICIgcHJvYmluZyAlMDR4OiUwNHhcbiIsCisJCXNkX2Rlc2MtPm5hbWUsIGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CiAKIAkvKiBjcmVhdGUgdGhlIGRldmljZSAqLwogCWlmIChkZXZfc2l6ZSA8IHNpemVvZiAqZ3NwY2FfZGV2KQogCQlkZXZfc2l6ZSA9IHNpemVvZiAqZ3NwY2FfZGV2OwogCWdzcGNhX2RldiA9IGt6YWxsb2MoZGV2X3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghZ3NwY2FfZGV2KSB7Ci0JCWVycigiY291bGRuJ3Qga3phbGxvYyBnc3BjYSBzdHJ1Y3QiKTsKKwkJcHJfZXJyKCJjb3VsZG4ndCBremFsbG9jIGdzcGNhIHN0cnVjdFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlnc3BjYV9kZXYtPnVzYl9idWYgPSBrbWFsbG9jKFVTQl9CVUZfU1osIEdGUF9LRVJORUwpOwogCWlmICghZ3NwY2FfZGV2LT51c2JfYnVmKSB7Ci0JCWVycigib3V0IG9mIG1lbW9yeSIpOworCQlwcl9lcnIoIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMjY0LDcgKzIzNTEsNyBAQAogCQkJCSAgVkZMX1RZUEVfR1JBQkJFUiwKIAkJCQkgIC0xKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBlcnIgJWRcbiIsIHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjI5Niw4ICsyMzgzLDggQEAKIAogCS8qIHdlIGRvbid0IGhhbmRsZSBtdWx0aS1jb25maWcgY2FtZXJhcyAqLwogCWlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpIHsKLQkJZXJyKCIlMDR4OiUwNHggdG9vIG1hbnkgY29uZmlnIiwKLQkJCQlpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOworCQlwcl9lcnIoIiUwNHg6JTA0eCB0b28gbWFueSBjb25maWdcbiIsCisJCSAgICAgICBpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTI0ODAsNyArMjU2Nyw3IEBACiAvKiAtLSBtb2R1bGUgaW5zZXJ0IC8gcmVtb3ZlIC0tICovCiBzdGF0aWMgaW50IF9faW5pdCBnc3BjYV9pbml0KHZvaWQpCiB7Ci0JaW5mbygidiIgRFJJVkVSX1ZFUlNJT05fTlVNQkVSICIgcmVnaXN0ZXJlZCIpOworCXByX2luZm8oInYiIEdTUENBX1ZFUlNJT04gIiByZWdpc3RlcmVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIHN0YXRpYyB2b2lkIF9fZXhpdCBnc3BjYV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmgKaW5kZXggNDllMmZjYi4uZTQ0NGYxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuaApAQCAtMTQsMTEgKzE0LDEyIEBACiAjaWZkZWYgR1NQQ0FfREVCVUcKIC8qIEdTUENBIG91ciBkZWJ1ZyBtZXNzYWdlcyAqLwogZXh0ZXJuIGludCBnc3BjYV9kZWJ1ZzsKLSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKLQlkbyB7XAotCQlpZiAoZ3NwY2FfZGVidWcgJiAobGV2ZWwpKSBcCi0JCQlwcmludGsoS0VSTl9JTkZPIE1PRFVMRV9OQU1FICI6ICIgZm10ICJcbiIsICMjIGFyZ3MpOyBcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoZ3NwY2FfZGVidWcgJiAobGV2ZWwpKQkJCQlcCisJCXByX2luZm8oZm10LCAjI19fVkFfQVJHU19fKTsJCQlcCit9IHdoaWxlICgwKQorCiAjZGVmaW5lIERfRVJSICAweDAxCiAjZGVmaW5lIERfUFJPQkUgMHgwMgogI2RlZmluZSBEX0NPTkYgMHgwNApAQCAtMjksMTcgKzMwLDggQEAKICNkZWZpbmUgRF9VU0JPIDB4MDAKICNkZWZpbmUgRF9WNEwyIDB4MDEwMAogI2Vsc2UKLSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCAuLi4pCiAjZW5kaWYKLSN1bmRlZiBlcnIKLSNkZWZpbmUgZXJyKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX0VSUiBNT0RVTEVfTkFNRSAiOiAiIGZtdCAiXG4iLCAjIyBhcmdzKQotI3VuZGVmIGluZm8KLSNkZWZpbmUgaW5mbyhmbXQsIGFyZ3MuLi4pIFwKLQlwcmludGsoS0VSTl9JTkZPIE1PRFVMRV9OQU1FICI6ICIgZm10ICJcbiIsICMjIGFyZ3MpCi0jdW5kZWYgd2FybgotI2RlZmluZSB3YXJuKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX1dBUk5JTkcgTU9EVUxFX05BTUUgIjogIiBmbXQgIlxuIiwgIyMgYXJncykKIAogI2RlZmluZSBHU1BDQV9NQVhfRlJBTUVTIDE2CS8qIG1heGltdW0gbnVtYmVyIG9mIHZpZGVvIGZyYW1lIGJ1ZmZlcnMgKi8KIC8qIGltYWdlIHRyYW5zZmVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9qZWlsaW5qLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2plaWxpbmouYwppbmRleCAxYmQ5YzRiLi44ZTNkYWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2plaWxpbmouYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2plaWxpbmouYwpAQCAtMjQsNiArMjQsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgImplaWxpbmoiCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMTMsOCArMTE1LDggQEAKIAkJCXVzYl9zbmRidWxrcGlwZShnc3BjYV9kZXYtPmRldiwgMyksCiAJCQlnc3BjYV9kZXYtPnVzYl9idWYsIDIsIE5VTEwsIDUwMCk7CiAJaWYgKHJldHZhbCA8IDApIHsKLQkJZXJyKCJjb21tYW5kIHdyaXRlIFslMDJ4XSBlcnJvciAlZCIsCi0JCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByZXR2YWwpOworCQlwcl9lcnIoImNvbW1hbmQgd3JpdGUgWyUwMnhdIGVycm9yICVkXG4iLAorCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByZXR2YWwpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXR2YWw7CiAJfQogfQpAQCAtMTMxLDggKzEzMyw4IEBACiAJCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCBOVUxMLCA1MDApOwogCXJlc3BvbnNlID0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwogCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWVycigicmVhZCBjb21tYW5kIFslMDJ4XSBlcnJvciAlZCIsCi0JCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByZXR2YWwpOworCQlwcl9lcnIoInJlYWQgY29tbWFuZCBbJTAyeF0gZXJyb3IgJWRcbiIsCisJCSAgICAgICBnc3BjYV9kZXYtPnVzYl9idWZbMF0sIHJldHZhbCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldHZhbDsKIAl9CiB9CkBAIC00MDMsMTMgKzQwNSw3IEBACiAJZGV2LT50eXBlID0gaWQtPmRyaXZlcl9pbmZvOwogCWdzcGNhX2Rldi0+Y2FtLmN0cmxzID0gZGV2LT5jdHJsczsKIAlkZXYtPnF1YWxpdHkgPSBRVUFMSVRZX0RFRjsKLQlkZXYtPmN0cmxzW0xJR0hURlJFUV0uZGVmID0gVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWjsKLQlkZXYtPmN0cmxzW1JFRF0uZGVmID0gUkVEX0JBTEFOQ0VfREVGOwotCWRldi0+Y3RybHNbR1JFRU5dLmRlZiA9IEdSRUVOX0JBTEFOQ0VfREVGOwotCWRldi0+Y3RybHNbQkxVRV0uZGVmID0gQkxVRV9CQUxBTkNFX0RFRjsKLQlQREVCVUcoRF9QUk9CRSwKLQkJIkpFSUxJTkogY2FtZXJhIGRldGVjdGVkIgotCQkiICh2aWQvcGlkIDB4JTA0WDoweCUwNFgpIiwgaWQtPmlkVmVuZG9yLCBpZC0+aWRQcm9kdWN0KTsKKwogCWNhbS0+Y2FtX21vZGUgPSBqbGpfbW9kZTsKIAljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUoamxqX21vZGUpOwogCWNhbS0+YnVsayA9IDE7CkBAIC00MjIsNyArNDE4LDcgQEAKIHsKIAlpbnQgaTsKIAl1OCAqYnVmOwotCXU4IHN0b3BfY29tbWFuZHNbXVsyXSA9IHsKKwlzdGF0aWMgdTggc3RvcF9jb21tYW5kc1tdWzJdID0gewogCQl7MHg3MSwgMHgwMH0sCiAJCXsweDcwLCAweDA5fSwKIAkJezB4NzEsIDB4ODB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9raW5lY3QuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Eva2luZWN0LmMKaW5kZXggMjZmYzIwNi4uNGZlNTFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9raW5lY3QuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2tpbmVjdC5jCkBAIC0yNCw2ICsyNCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAia2luZWN0IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTM0LDExICszNiw2IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkdTUENBL0tpbmVjdCBTZW5zb3IgRGV2aWNlIFVTQiBDYW1lcmEgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLSNpZmRlZiBHU1BDQV9ERUJVRwotaW50IGdzcGNhX2RlYnVnID0gRF9FUlIgfCBEX1BST0JFIHwgRF9DT05GIHwgRF9TVFJFQU0gfCBEX0ZSQU0gfCBEX1BBQ0sgfAotCURfVVNCSSB8IERfVVNCTyB8IERfVjRMMjsKLSNlbmRpZgotCiBzdHJ1Y3QgcGt0X2hkciB7CiAJdWludDhfdCBtYWdpY1syXTsKIAl1aW50OF90IHBhZDsKQEAgLTE0MSw3ICsxMzgsNyBAQAogCXN0cnVjdCBjYW1faGRyICpyaGRyID0gKHZvaWQgKilpYnVmOwogCiAJaWYgKGNtZF9sZW4gJiAxIHx8IGNtZF9sZW4gPiAoMHg0MDAgLSBzaXplb2YoKmNoZHIpKSkgewotCQllcnIoInNlbmRfY21kOiBJbnZhbGlkIGNvbW1hbmQgbGVuZ3RoICgweCV4KSIsIGNtZF9sZW4pOworCQlwcl9lcnIoInNlbmRfY21kOiBJbnZhbGlkIGNvbW1hbmQgbGVuZ3RoICgweCV4KVxuIiwgY21kX2xlbik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE1Nyw3ICsxNTQsNyBAQAogCVBERUJVRyhEX1VTQk8sICJDb250cm9sIGNtZD0lMDR4IHRhZz0lMDR4IGxlbj0lMDR4OiAlZCIsIGNtZCwKIAkJc2QtPmNhbV90YWcsIGNtZF9sZW4sIHJlcyk7CiAJaWYgKHJlcyA8IDApIHsKLQkJZXJyKCJzZW5kX2NtZDogT3V0cHV0IGNvbnRyb2wgdHJhbnNmZXIgZmFpbGVkICglZCkiLCByZXMpOworCQlwcl9lcnIoInNlbmRfY21kOiBPdXRwdXQgY29udHJvbCB0cmFuc2ZlciBmYWlsZWQgKCVkKVxuIiwgcmVzKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAKQEAgLTE2NiwzMyArMTYzLDM1IEBACiAJfSB3aGlsZSAoYWN0dWFsX2xlbiA9PSAwKTsKIAlQREVCVUcoRF9VU0JPLCAiQ29udHJvbCByZXBseTogJWQiLCByZXMpOwogCWlmIChhY3R1YWxfbGVuIDwgc2l6ZW9mKCpyaGRyKSkgewotCQllcnIoInNlbmRfY21kOiBJbnB1dCBjb250cm9sIHRyYW5zZmVyIGZhaWxlZCAoJWQpIiwgcmVzKTsKKwkJcHJfZXJyKCJzZW5kX2NtZDogSW5wdXQgY29udHJvbCB0cmFuc2ZlciBmYWlsZWQgKCVkKVxuIiwgcmVzKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAJYWN0dWFsX2xlbiAtPSBzaXplb2YoKnJoZHIpOwogCiAJaWYgKHJoZHItPm1hZ2ljWzBdICE9IDB4NTIgfHwgcmhkci0+bWFnaWNbMV0gIT0gMHg0MikgewotCQllcnIoInNlbmRfY21kOiBCYWQgbWFnaWMgJTAyeCAlMDJ4Iiwgcmhkci0+bWFnaWNbMF0sCi0JCQlyaGRyLT5tYWdpY1sxXSk7CisJCXByX2Vycigic2VuZF9jbWQ6IEJhZCBtYWdpYyAlMDJ4ICUwMnhcbiIsCisJCSAgICAgICByaGRyLT5tYWdpY1swXSwgcmhkci0+bWFnaWNbMV0pOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmIChyaGRyLT5jbWQgIT0gY2hkci0+Y21kKSB7Ci0JCWVycigic2VuZF9jbWQ6IEJhZCBjbWQgJTAyeCAhPSAlMDJ4Iiwgcmhkci0+Y21kLCBjaGRyLT5jbWQpOworCQlwcl9lcnIoInNlbmRfY21kOiBCYWQgY21kICUwMnggIT0gJTAyeFxuIiwKKwkJICAgICAgIHJoZHItPmNtZCwgY2hkci0+Y21kKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAocmhkci0+dGFnICE9IGNoZHItPnRhZykgewotCQllcnIoInNlbmRfY21kOiBCYWQgdGFnICUwNHggIT0gJTA0eCIsIHJoZHItPnRhZywgY2hkci0+dGFnKTsKKwkJcHJfZXJyKCJzZW5kX2NtZDogQmFkIHRhZyAlMDR4ICE9ICUwNHhcbiIsCisJCSAgICAgICByaGRyLT50YWcsIGNoZHItPnRhZyk7CiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKGNwdV90b19sZTE2KHJoZHItPmxlbikgIT0gKGFjdHVhbF9sZW4vMikpIHsKLQkJZXJyKCJzZW5kX2NtZDogQmFkIGxlbiAlMDR4ICE9ICUwNHgiLAotCQkJCWNwdV90b19sZTE2KHJoZHItPmxlbiksIChpbnQpKGFjdHVhbF9sZW4vMikpOworCQlwcl9lcnIoInNlbmRfY21kOiBCYWQgbGVuICUwNHggIT0gJTA0eFxuIiwKKwkJICAgICAgIGNwdV90b19sZTE2KHJoZHItPmxlbiksIChpbnQpKGFjdHVhbF9sZW4vMikpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKGFjdHVhbF9sZW4gPiByZXBseV9sZW4pIHsKLQkJd2Fybigic2VuZF9jbWQ6IERhdGEgYnVmZmVyIGlzICVkIGJ5dGVzIGxvbmcsIGJ1dCBnb3QgJWQgYnl0ZXMiLAotCQkJCXJlcGx5X2xlbiwgYWN0dWFsX2xlbik7CisJCXByX3dhcm4oInNlbmRfY21kOiBEYXRhIGJ1ZmZlciBpcyAlZCBieXRlcyBsb25nLCBidXQgZ290ICVkIGJ5dGVzXG4iLAorCQkJcmVwbHlfbGVuLCBhY3R1YWxfbGVuKTsKIAkJbWVtY3B5KHJlcGx5YnVmLCBpYnVmK3NpemVvZigqcmhkciksIHJlcGx5X2xlbik7CiAJfSBlbHNlIHsKIAkJbWVtY3B5KHJlcGx5YnVmLCBpYnVmK3NpemVvZigqcmhkciksIGFjdHVhbF9sZW4pOwpAQCAtMjE4LDggKzIxNyw4IEBACiAJaWYgKHJlcyA8IDApCiAJCXJldHVybiByZXM7CiAJaWYgKHJlcyAhPSAyKSB7Ci0JCXdhcm4oInNlbmRfY21kIHJldHVybmVkICVkIFslMDR4ICUwNHhdLCAwMDAwIGV4cGVjdGVkIiwKLQkJCQlyZXMsIHJlcGx5WzBdLCByZXBseVsxXSk7CisJCXByX3dhcm4oInNlbmRfY21kIHJldHVybmVkICVkIFslMDR4ICUwNHhdLCAwMDAwIGV4cGVjdGVkXG4iLAorCQkJcmVzLCByZXBseVswXSwgcmVwbHlbMV0pOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM1Myw4ICszNTIsOCBAQAogCQlyZXR1cm47CiAKIAlpZiAoaGRyLT5tYWdpY1swXSAhPSAnUicgfHwgaGRyLT5tYWdpY1sxXSAhPSAnQicpIHsKLQkJd2FybigiW1N0cmVhbSAlMDJ4XSBJbnZhbGlkIG1hZ2ljICUwMnglMDJ4Iiwgc2QtPnN0cmVhbV9mbGFnLAotCQkJCWhkci0+bWFnaWNbMF0sIGhkci0+bWFnaWNbMV0pOworCQlwcl93YXJuKCJbU3RyZWFtICUwMnhdIEludmFsaWQgbWFnaWMgJTAyeCUwMnhcbiIsCisJCQlzZC0+c3RyZWFtX2ZsYWcsIGhkci0+bWFnaWNbMF0sIGhkci0+bWFnaWNbMV0pOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNjgsNyArMzY3LDcgQEAKIAkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGRhdGEsIGRhdGFsZW4pOwogCiAJZWxzZQotCQl3YXJuKCJQYWNrZXQgdHlwZSBub3QgcmVjb2duaXplZC4uLiIpOworCQlwcl93YXJuKCJQYWNrZXQgdHlwZSBub3QgcmVjb2duaXplZC4uLlxuIik7CiB9CiAKIC8qIHN1Yi1kcml2ZXIgZGVzY3JpcHRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Eva29uaWNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2tvbmljYS5jCmluZGV4IDU5NjQ2OTEuLmYzZjdmZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Eva29uaWNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9rb25pY2EuYwpAQCAtMjgsNiArMjgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgImtvbmljYSIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0yMDAsNyArMjAyLDcgQEAKIAkJCTAsCiAJCQkxMDAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193IGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3cgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMjIxLDcgKzIyMyw3IEBACiAJCQkyLAogCQkJMTAwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTI4NCw3ICsyODYsNyBAQAogCWludGYgPSB1c2JfaWZudW1fdG9faWYoc2QtPmdzcGNhX2Rldi5kZXYsIHNkLT5nc3BjYV9kZXYuaWZhY2UpOwogCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpbnRmLCBzZC0+Z3NwY2FfZGV2LmFsdCk7CiAJaWYgKCFhbHQpIHsKLQkJZXJyKCJDb3VsZG4ndCBnZXQgYWx0c2V0dGluZyIpOworCQlwcl9lcnIoIkNvdWxkbid0IGdldCBhbHRzZXR0aW5nXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0zMTUsNyArMzE3LDcgQEAKIAkJCWxlMTZfdG9fY3B1KGFsdC0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZSk7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoU0RfTlBLVCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQllcnIoInVzYl9hbGxvY191cmIgZmFpbGVkIik7CisJCQlwcl9lcnIoInVzYl9hbGxvY191cmIgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCWdzcGNhX2Rldi0+dXJiW25dID0gdXJiOwpAQCAtMzI0LDcgKzMyNiw3IEBACiAJCQkJCQlHRlBfS0VSTkVMLAogCQkJCQkJJnVyYi0+dHJhbnNmZXJfZG1hKTsKIAkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCWVycigidXNiX2J1ZmZlcl9hbGxvYyBmYWlsZWQiKTsKKwkJCXByX2VycigidXNiX2J1ZmZlcl9hbGxvYyBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtMzg2LDcgKzM4OCw3IEBACiAJCVBERUJVRyhEX0VSUiwgInVyYiBzdGF0dXM6ICVkIiwgdXJiLT5zdGF0dXMpOwogCQlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChzdCA8IDApCi0JCQllcnIoInJlc3VibWl0IHVyYiBlcnJvciAlZCIsIHN0KTsKKwkJCXByX2VycigicmVzdWJtaXQgdXJiIGVycm9yICVkXG4iLCBzdCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ3Nyw3ICs0NzksNyBAQAogCX0KIAlzdCA9IHVzYl9zdWJtaXRfdXJiKHN0YXR1c191cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdCA8IDApCi0JCWVycigidXNiX3N1Ym1pdF91cmIoc3RhdHVzX3VyYikgcmV0ICVkIiwgc3QpOworCQlwcl9lcnIoInVzYl9zdWJtaXRfdXJiKHN0YXR1c191cmIpIHJldCAlZFxuIiwgc3QpOwogfQogCiBzdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9NYWtlZmlsZQppbmRleCBiZjdhMTlhLi43ZjUyOTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvTWFrZWZpbGUKQEAgLTgsNCArOCw0IEBACiAJCSAgICBtNTYwMl9zNWs4M2EubyBcCiAJCSAgICBtNTYwMl9zNWs0YWEubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfY29yZS5jCmluZGV4IGE3NzIyYjEuLjY3NTMzZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfY29yZS5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgIm01NjAyX292OTY1MC5oIgogI2luY2x1ZGUgIm01NjAyX292NzY2MC5oIgogI2luY2x1ZGUgIm01NjAyX210OW0xMTEuaCIKQEAgLTE5MiwxMCArMTk0LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMHg4MDsgaSsrKSB7CiAJCXVuc2lnbmVkIGNoYXIgdmFsID0gMDsKIAkJbTU2MDJfcmVhZF9icmlkZ2Uoc2QsIGksICZ2YWwpOwotCQlpbmZvKCJBTGkgbTU2MDIgYWRkcmVzcyAweCV4IGNvbnRhaW5zIDB4JXgiLCBpLCB2YWwpOworCQlwcl9pbmZvKCJBTGkgbTU2MDIgYWRkcmVzcyAweCV4IGNvbnRhaW5zIDB4JXhcbiIsIGksIHZhbCk7CiAJfQotCWluZm8oIldhcm5pbmc6IFRoZSBBTGkgbTU2MDIgd2ViY2FtIHByb2JhYmx5IHdvbid0IHdvcmsgIgotCQkidW50aWwgaXQncyBwb3dlciBjeWNsZWQiKTsKKwlwcl9pbmZvKCJXYXJuaW5nOiBUaGUgQUxpIG01NjAyIHdlYmNhbSBwcm9iYWJseSB3b24ndCB3b3JrIHVudGlsIGl0J3MgcG93ZXIgY3ljbGVkXG4iKTsKIH0KIAogc3RhdGljIGludCBtNTYwMl9wcm9iZV9zZW5zb3Ioc3RydWN0IHNkICpzZCkKQEAgLTIzMSw3ICsyMzIsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIE1vcmUgc2Vuc29yIHByb2JlIGZ1bmN0aW9uIGdvZXMgaGVyZSAqLwotCWluZm8oIkZhaWxlZCB0byBmaW5kIGEgc2Vuc29yIik7CisJcHJfaW5mbygiRmFpbGVkIHRvIGZpbmQgYSBzZW5zb3JcbiIpOwogCXNkLT5zZW5zb3IgPSBOVUxMOwogCXJldHVybiAtRU5PREVWOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9tdDltMTExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuYwppbmRleCAwZDYwNWE1Li42MjY4YWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuYwpAQCAtMTYsNiArMTYsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlICJtNTYwMl9tdDltMTExLmgiCiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9zZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwpAQCAtMTYzLDcgKzE2NSw3IEBACiAKIAlpZiAoZm9yY2Vfc2Vuc29yKSB7CiAJCWlmIChmb3JjZV9zZW5zb3IgPT0gTVQ5TTExMV9TRU5TT1IpIHsKLQkJCWluZm8oIkZvcmNpbmcgYSAlcyBzZW5zb3IiLCBtdDltMTExLm5hbWUpOworCQkJcHJfaW5mbygiRm9yY2luZyBhICVzIHNlbnNvclxuIiwgbXQ5bTExMS5uYW1lKTsKIAkJCWdvdG8gc2Vuc29yX2ZvdW5kOwogCQl9CiAJCS8qIElmIHdlIHdhbnQgdG8gZm9yY2UgYW5vdGhlciBzZW5zb3IsIGRvbid0IHRyeSB0byBwcm9iZSB0aGlzCkBAIC0xOTEsNyArMTkzLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGRhdGFbMF0gPT0gMHgxNCkgJiYgKGRhdGFbMV0gPT0gMHgzYSkpIHsKLQkJaW5mbygiRGV0ZWN0ZWQgYSBtdDltMTExIHNlbnNvciIpOworCQlwcl9pbmZvKCJEZXRlY3RlZCBhIG10OW0xMTEgc2Vuc29yXG4iKTsKIAkJZ290byBzZW5zb3JfZm91bmQ7CiAJfQogCkBAIC02MTIsMzQgKzYxNCwzNCBAQAogewogCXU4IGFkZHJlc3MsIHZhbHVlWzJdID0gezB4MDAsIDB4MDB9OwogCi0JaW5mbygiRHVtcGluZyB0aGUgbXQ5bTExMSByZWdpc3RlciBzdGF0ZSIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIG10OW0xMTEgcmVnaXN0ZXIgc3RhdGVcbiIpOwogCi0JaW5mbygiRHVtcGluZyB0aGUgbXQ5bTExMSBzZW5zb3IgY29yZSByZWdpc3RlcnMiKTsKKwlwcl9pbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIHNlbnNvciBjb3JlIHJlZ2lzdGVyc1xuIik7CiAJdmFsdWVbMV0gPSBNVDlNMTExX1NFTlNPUl9DT1JFOwogCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgdmFsdWUsIDIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKIAkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKLQkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXgiLAotCQkgICAgIGFkZHJlc3MsIHZhbHVlWzBdLCB2YWx1ZVsxXSk7CisJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCV4XG4iLAorCQkJYWRkcmVzcywgdmFsdWVbMF0sIHZhbHVlWzFdKTsKIAl9CiAKLQlpbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIGNvbG9yIHBpcGVsaW5lIHJlZ2lzdGVycyIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIG10OW0xMTEgY29sb3IgcGlwZWxpbmUgcmVnaXN0ZXJzXG4iKTsKIAl2YWx1ZVsxXSA9IE1UOU0xMTFfQ09MT1JQSVBFOwogCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgdmFsdWUsIDIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKIAkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKLQkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXgiLAotCQkgICAgIGFkZHJlc3MsIHZhbHVlWzBdLCB2YWx1ZVsxXSk7CisJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCV4XG4iLAorCQkJYWRkcmVzcywgdmFsdWVbMF0sIHZhbHVlWzFdKTsKIAl9CiAKLQlpbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIGNhbWVyYSBjb250cm9sIHJlZ2lzdGVycyIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIG10OW0xMTEgY2FtZXJhIGNvbnRyb2wgcmVnaXN0ZXJzXG4iKTsKIAl2YWx1ZVsxXSA9IE1UOU0xMTFfQ0FNRVJBX0NPTlRST0w7CiAJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBNVDlNMTExX1BBR0VfTUFQLCB2YWx1ZSwgMik7CiAJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8IDB4ZmY7IGFkZHJlc3MrKykgewogCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgdmFsdWUsIDIpOwotCQlpbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXgleCIsCi0JCSAgICAgYWRkcmVzcywgdmFsdWVbMF0sIHZhbHVlWzFdKTsKKwkJcHJfaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXhcbiIsCisJCQlhZGRyZXNzLCB2YWx1ZVswXSwgdmFsdWVbMV0pOwogCX0KIAotCWluZm8oIm10OW0xMTEgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOworCXByX2luZm8oIm10OW0xMTEgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZVxuIik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292NzY2MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9vdjc2NjAuYwppbmRleCBiMTJmNjA0Li45YTE0ODM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292NzY2MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y3NjYwLmMKQEAgLTE2LDYgKzE2LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSAibTU2MDJfb3Y3NjYwLmgiCiAKIHN0YXRpYyBpbnQgb3Y3NjYwX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CkBAIC0xNDksNyArMTUxLDcgQEAKIAogCWlmIChmb3JjZV9zZW5zb3IpIHsKIAkJaWYgKGZvcmNlX3NlbnNvciA9PSBPVjc2NjBfU0VOU09SKSB7Ci0JCQlpbmZvKCJGb3JjaW5nIGFuICVzIHNlbnNvciIsIG92NzY2MC5uYW1lKTsKKwkJCXByX2luZm8oIkZvcmNpbmcgYW4gJXMgc2Vuc29yXG4iLCBvdjc2NjAubmFtZSk7CiAJCQlnb3RvIHNlbnNvcl9mb3VuZDsKIAkJfQogCQkvKiBJZiB3ZSB3YW50IHRvIGZvcmNlIGFub3RoZXIgc2Vuc29yLApAQCAtMTgwLDEwICsxODIsMTAgQEAKIAlpZiAobTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WNzY2MF9WRVIsICZ2ZXJfaWQsIDEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWluZm8oIlNlbnNvciByZXBvcnRlZCAweCV4JXgiLCBwcm9kX2lkLCB2ZXJfaWQpOworCXByX2luZm8oIlNlbnNvciByZXBvcnRlZCAweCV4JXhcbiIsIHByb2RfaWQsIHZlcl9pZCk7CiAKIAlpZiAoKHByb2RfaWQgPT0gMHg3NikgJiYgKHZlcl9pZCA9PSAweDYwKSkgewotCQlpbmZvKCJEZXRlY3RlZCBhIG92NzY2MCBzZW5zb3IiKTsKKwkJcHJfaW5mbygiRGV0ZWN0ZWQgYSBvdjc2NjAgc2Vuc29yXG4iKTsKIAkJZ290byBzZW5zb3JfZm91bmQ7CiAJfQogCXJldHVybiAtRU5PREVWOwpAQCAtNDU3LDE3ICs0NTksMTYgQEAKIHN0YXRpYyB2b2lkIG92NzY2MF9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKQogewogCWludCBhZGRyZXNzOwotCWluZm8oIkR1bXBpbmcgdGhlIG92NzY2MCByZWdpc3RlciBzdGF0ZSIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIG92NzY2MCByZWdpc3RlciBzdGF0ZVxuIik7CiAJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8IDB4YTk7IGFkZHJlc3MrKykgewogCQl1OCB2YWx1ZTsKIAkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWx1ZSwgMSk7Ci0JCWluZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCIsCi0JCSAgICAgYWRkcmVzcywgdmFsdWUpOworCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXhcbiIsIGFkZHJlc3MsIHZhbHVlKTsKIAl9CiAKLQlpbmZvKCJvdjc2NjAgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOworCXByX2luZm8oIm92NzY2MCByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlXG4iKTsKIAotCWluZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlIik7CisJcHJfaW5mbygiUHJvYmluZyBmb3Igd2hpY2ggcmVnaXN0ZXJzIHRoYXQgYXJlIHJlYWQvd3JpdGVcbiIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKIAkJdTggb2xkX3ZhbHVlLCBjdHJsX3ZhbHVlOwogCQl1OCB0ZXN0X3ZhbHVlWzJdID0gezB4ZmYsIDB4ZmZ9OwpAQCAtNDc3LDkgKzQ3OCw5IEBACiAJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CiAKIAkJaWYgKGN0cmxfdmFsdWUgPT0gdGVzdF92YWx1ZVswXSkKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgd3JpdGVhYmxlIiwgYWRkcmVzcyk7CisJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZVxuIiwgYWRkcmVzcyk7CiAJCWVsc2UKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5IiwgYWRkcmVzcyk7CisJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seVxuIiwgYWRkcmVzcyk7CiAKIAkJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSAqLwogCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9vdjk2NTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y5NjUwLmMKaW5kZXggNzAzZDQ4Ni4uMjExNGE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9vdjk2NTAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292OTY1MC5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgIm01NjAyX292OTY1MC5oIgogCiBzdGF0aWMgaW50IG92OTY1MF9zZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwpAQCAtMjk5LDcgKzMwMSw3IEBACiAKIAlpZiAoZm9yY2Vfc2Vuc29yKSB7CiAJCWlmIChmb3JjZV9zZW5zb3IgPT0gT1Y5NjUwX1NFTlNPUikgewotCQkJaW5mbygiRm9yY2luZyBhbiAlcyBzZW5zb3IiLCBvdjk2NTAubmFtZSk7CisJCQlwcl9pbmZvKCJGb3JjaW5nIGFuICVzIHNlbnNvclxuIiwgb3Y5NjUwLm5hbWUpOwogCQkJZ290byBzZW5zb3JfZm91bmQ7CiAJCX0KIAkJLyogSWYgd2Ugd2FudCB0byBmb3JjZSBhbm90aGVyIHNlbnNvciwKQEAgLTMzMCw3ICszMzIsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgocHJvZF9pZCA9PSAweDk2KSAmJiAodmVyX2lkID09IDB4NTIpKSB7Ci0JCWluZm8oIkRldGVjdGVkIGFuIG92OTY1MCBzZW5zb3IiKTsKKwkJcHJfaW5mbygiRGV0ZWN0ZWQgYW4gb3Y5NjUwIHNlbnNvclxuIik7CiAJCWdvdG8gc2Vuc29yX2ZvdW5kOwogCX0KIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTg1MCwxNyArODUyLDE2IEBACiBzdGF0aWMgdm9pZCBvdjk2NTBfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCkKIHsKIAlpbnQgYWRkcmVzczsKLQlpbmZvKCJEdW1waW5nIHRoZSBvdjk2NTAgcmVnaXN0ZXIgc3RhdGUiKTsKKwlwcl9pbmZvKCJEdW1waW5nIHRoZSBvdjk2NTAgcmVnaXN0ZXIgc3RhdGVcbiIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGE5OyBhZGRyZXNzKyspIHsKIAkJdTggdmFsdWU7CiAJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmdmFsdWUsIDEpOwotCQlpbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXgiLAotCQkgICAgIGFkZHJlc3MsIHZhbHVlKTsKKwkJcHJfaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4XG4iLCBhZGRyZXNzLCB2YWx1ZSk7CiAJfQogCi0JaW5mbygib3Y5NjUwIHJlZ2lzdGVyIHN0YXRlIGR1bXAgY29tcGxldGUiKTsKKwlwcl9pbmZvKCJvdjk2NTAgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZVxuIik7CiAKLQlpbmZvKCJQcm9iaW5nIGZvciB3aGljaCByZWdpc3RlcnMgdGhhdCBhcmUgcmVhZC93cml0ZSIpOworCXByX2luZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlXG4iKTsKIAlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDwgMHhmZjsgYWRkcmVzcysrKSB7CiAJCXU4IG9sZF92YWx1ZSwgY3RybF92YWx1ZTsKIAkJdTggdGVzdF92YWx1ZVsyXSA9IHsweGZmLCAweGZmfTsKQEAgLTg3MCw5ICs4NzEsOSBAQAogCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJmN0cmxfdmFsdWUsIDEpOwogCiAJCWlmIChjdHJsX3ZhbHVlID09IHRlc3RfdmFsdWVbMF0pCi0JCQlpbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZSIsIGFkZHJlc3MpOworCQkJcHJfaW5mbygicmVnaXN0ZXIgMHgleCBpcyB3cml0ZWFibGVcbiIsIGFkZHJlc3MpOwogCQllbHNlCi0JCQlpbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seSIsIGFkZHJlc3MpOworCQkJcHJfaW5mbygicmVnaXN0ZXIgMHgleCBpcyByZWFkIG9ubHlcbiIsIGFkZHJlc3MpOwogCiAJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KIAkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBhZGRyZXNzLCAmb2xkX3ZhbHVlLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfcG8xMDMwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3BvMTAzMC5jCmluZGV4IDFmZWJkMzQuLmI4NzcxNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfcG8xMDMwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9wbzEwMzAuYwpAQCAtMTYsNiArMTYsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlICJtNTYwMl9wbzEwMzAuaCIKIAogc3RhdGljIGludCBwbzEwMzBfZ2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CkBAIC0xOTcsNyArMTk5LDcgQEAKIAogCWlmIChmb3JjZV9zZW5zb3IpIHsKIAkJaWYgKGZvcmNlX3NlbnNvciA9PSBQTzEwMzBfU0VOU09SKSB7Ci0JCQlpbmZvKCJGb3JjaW5nIGEgJXMgc2Vuc29yIiwgcG8xMDMwLm5hbWUpOworCQkJcHJfaW5mbygiRm9yY2luZyBhICVzIHNlbnNvclxuIiwgcG8xMDMwLm5hbWUpOwogCQkJZ290byBzZW5zb3JfZm91bmQ7CiAJCX0KIAkJLyogSWYgd2Ugd2FudCB0byBmb3JjZSBhbm90aGVyIHNlbnNvciwgZG9uJ3QgdHJ5IHRvIHByb2JlIHRoaXMKQEAgLTIyMSw3ICsyMjMsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkZXZfaWRfaCA9PSAweDMwKSB7Ci0JCWluZm8oIkRldGVjdGVkIGEgcG8xMDMwIHNlbnNvciIpOworCQlwcl9pbmZvKCJEZXRlY3RlZCBhIHBvMTAzMCBzZW5zb3JcbiIpOwogCQlnb3RvIHNlbnNvcl9mb3VuZDsKIAl9CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0yNjcsNyArMjY5LDcgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlpbmZvKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXQiKTsKKwkJCXByX2luZm8oIkludmFsaWQgc3RyZWFtIGNvbW1hbmQsIGV4aXRpbmcgaW5pdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTczMywxNiArNzM1LDE1IEBACiAJaW50IGFkZHJlc3M7CiAJdTggdmFsdWUgPSAwOwogCi0JaW5mbygiRHVtcGluZyB0aGUgcG8xMDMwIHNlbnNvciBjb3JlIHJlZ2lzdGVycyIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIHBvMTAzMCBzZW5zb3IgY29yZSByZWdpc3RlcnNcbiIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweDdmOyBhZGRyZXNzKyspIHsKIAkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWx1ZSwgMSk7Ci0JCWluZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCIsCi0JCSAgICAgYWRkcmVzcywgdmFsdWUpOworCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXhcbiIsIGFkZHJlc3MsIHZhbHVlKTsKIAl9CiAKLQlpbmZvKCJwbzEwMzAgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOworCXByX2luZm8oInBvMTAzMCByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlXG4iKTsKIAotCWluZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlIik7CisJcHJfaW5mbygiUHJvYmluZyBmb3Igd2hpY2ggcmVnaXN0ZXJzIHRoYXQgYXJlIHJlYWQvd3JpdGVcbiIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKIAkJdTggb2xkX3ZhbHVlLCBjdHJsX3ZhbHVlOwogCQl1OCB0ZXN0X3ZhbHVlWzJdID0gezB4ZmYsIDB4ZmZ9OwpAQCAtNzUyLDkgKzc1Myw5IEBACiAJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CiAKIAkJaWYgKGN0cmxfdmFsdWUgPT0gdGVzdF92YWx1ZVswXSkKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgd3JpdGVhYmxlIiwgYWRkcmVzcyk7CisJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZVxuIiwgYWRkcmVzcyk7CiAJCWVsc2UKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5IiwgYWRkcmVzcyk7CisJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seVxuIiwgYWRkcmVzcyk7CiAKIAkJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSAqLwogCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs0YWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrNGFhLmMKaW5kZXggZDI3MjgwYi4uY2M4ZWMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs0YWEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azRhYS5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgIm01NjAyX3M1azRhYS5oIgogCiBzdGF0aWMgaW50IHM1azRhYV9nZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKQEAgLTI0MCw3ICsyNDIsNyBAQAogCiAJaWYgKGZvcmNlX3NlbnNvcikgewogCQlpZiAoZm9yY2Vfc2Vuc29yID09IFM1SzRBQV9TRU5TT1IpIHsKLQkJCWluZm8oIkZvcmNpbmcgYSAlcyBzZW5zb3IiLCBzNWs0YWEubmFtZSk7CisJCQlwcl9pbmZvKCJGb3JjaW5nIGEgJXMgc2Vuc29yXG4iLCBzNWs0YWEubmFtZSk7CiAJCQlnb3RvIHNlbnNvcl9mb3VuZDsKIAkJfQogCQkvKiBJZiB3ZSB3YW50IHRvIGZvcmNlIGFub3RoZXIgc2Vuc29yLCBkb24ndCB0cnkgdG8gcHJvYmUgdGhpcwpAQCAtMjc2LDcgKzI3OCw3IEBACiAJCQkJCQkgIGRhdGEsIDIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpbmZvKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXQiKTsKKwkJCXByX2luZm8oIkludmFsaWQgc3RyZWFtIGNvbW1hbmQsIGV4aXRpbmcgaW5pdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTI5Miw3ICsyOTQsNyBAQAogCWlmIChtZW1jbXAocHJvZF9pZCwgZXhwZWN0ZWRfcHJvZF9pZCwgc2l6ZW9mKHByb2RfaWQpKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJZWxzZQotCQlpbmZvKCJEZXRlY3RlZCBhIHM1azRhYSBzZW5zb3IiKTsKKwkJcHJfaW5mbygiRGV0ZWN0ZWQgYSBzNWs0YWEgc2Vuc29yXG4iKTsKIAogc2Vuc29yX2ZvdW5kOgogCXNlbnNvcl9zZXR0aW5ncyA9IGttYWxsb2MoCkBAIC0zNDcsNyArMzQ5LDcgQEAKIAkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCWVycigiSW52YWxpZCBzdHJlYW0gY29tbWFuZCwgZXhpdGluZyBpbml0Iik7CisJCQkJcHJfZXJyKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC0zODMsNyArMzg1LDcgQEAKIAkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCWVycigiSW52YWxpZCBzdHJlYW0gY29tbWFuZCwgZXhpdGluZyBpbml0Iik7CisJCQkJcHJfZXJyKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC00NDcsNyArNDQ5LDcgQEAKIAkJCQlpbml0X3M1azRhYVtpXVsxXSwgZGF0YSwgMik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWluZm8oIkludmFsaWQgc3RyZWFtIGNvbW1hbmQsIGV4aXRpbmcgaW5pdCIpOworCQkJcHJfaW5mbygiSW52YWxpZCBzdHJlYW0gY29tbWFuZCwgZXhpdGluZyBpbml0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtNjg2LDIwICs2ODgsMjEgQEAKIAltNTYwMl9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmb2xkX3BhZ2UsIDEpOwogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCAxNjsgcGFnZSsrKSB7CiAJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmcGFnZSwgMSk7Ci0JCWluZm8oIkR1bXBpbmcgdGhlIHM1azRhYSByZWdpc3RlciBzdGF0ZSBmb3IgcGFnZSAweCV4IiwgcGFnZSk7CisJCXByX2luZm8oIkR1bXBpbmcgdGhlIHM1azRhYSByZWdpc3RlciBzdGF0ZSBmb3IgcGFnZSAweCV4XG4iLAorCQkJcGFnZSk7CiAJCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPD0gMHhmZjsgYWRkcmVzcysrKSB7CiAJCQl1OCB2YWx1ZSA9IDA7CiAJCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJnZhbHVlLCAxKTsKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCIsCi0JCQkgICAgIGFkZHJlc3MsIHZhbHVlKTsKKwkJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleFxuIiwKKwkJCQlhZGRyZXNzLCB2YWx1ZSk7CiAJCX0KIAl9Ci0JaW5mbygiczVrNGFhIHJlZ2lzdGVyIHN0YXRlIGR1bXAgY29tcGxldGUiKTsKKwlwcl9pbmZvKCJzNWs0YWEgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZVxuIik7CiAKIAlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgMTY7IHBhZ2UrKykgewogCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJnBhZ2UsIDEpOwotCQlpbmZvKCJQcm9iaW5nIGZvciB3aGljaCByZWdpc3RlcnMgdGhhdCBhcmUgIgotCQkgICAgICJyZWFkL3dyaXRlIGZvciBwYWdlIDB4JXgiLCBwYWdlKTsKKwkJcHJfaW5mbygiUHJvYmluZyBmb3Igd2hpY2ggcmVnaXN0ZXJzIHRoYXQgYXJlIHJlYWQvd3JpdGUgZm9yIHBhZ2UgMHgleFxuIiwKKwkJCXBhZ2UpOwogCQlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDw9IDB4ZmY7IGFkZHJlc3MrKykgewogCQkJdTggb2xkX3ZhbHVlLCBjdHJsX3ZhbHVlLCB0ZXN0X3ZhbHVlID0gMHhmZjsKIApAQCAtNzA4LDE0ICs3MTEsMTYgQEAKIAkJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CiAKIAkJCWlmIChjdHJsX3ZhbHVlID09IHRlc3RfdmFsdWUpCi0JCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyB3cml0ZWFibGUiLCBhZGRyZXNzKTsKKwkJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZVxuIiwKKwkJCQkJYWRkcmVzcyk7CiAJCQllbHNlCi0JCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyByZWFkIG9ubHkiLCBhZGRyZXNzKTsKKwkJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seVxuIiwKKwkJCQkJYWRkcmVzcyk7CiAKIAkJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KIAkJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWx1ZSwgMSk7CiAJCX0KIAl9Ci0JaW5mbygiUmVhZC93cml0ZSByZWdpc3RlciBwcm9iaW5nIGNvbXBsZXRlIik7CisJcHJfaW5mbygiUmVhZC93cml0ZSByZWdpc3RlciBwcm9iaW5nIGNvbXBsZXRlXG4iKTsKIAltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJm9sZF9wYWdlLCAxKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jCmluZGV4IGZiZDkxNTQuLjFkZTc0M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuYwpAQCAtMTYsNiArMTYsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSAibTU2MDJfczVrODNhLmgiCiAKQEAgLTEzNSw3ICsxMzcsNyBAQAogCiAJaWYgKGZvcmNlX3NlbnNvcikgewogCQlpZiAoZm9yY2Vfc2Vuc29yID09IFM1SzgzQV9TRU5TT1IpIHsKLQkJCWluZm8oIkZvcmNpbmcgYSAlcyBzZW5zb3IiLCBzNWs4M2EubmFtZSk7CisJCQlwcl9pbmZvKCJGb3JjaW5nIGEgJXMgc2Vuc29yXG4iLCBzNWs4M2EubmFtZSk7CiAJCQlnb3RvIHNlbnNvcl9mb3VuZDsKIAkJfQogCQkvKiBJZiB3ZSB3YW50IHRvIGZvcmNlIGFub3RoZXIgc2Vuc29yLCBkb24ndCB0cnkgdG8gcHJvYmUgdGhpcwpAQCAtMTY4LDcgKzE3MCw3IEBACiAJaWYgKChwcm9kX2lkID09IDB4ZmYpIHx8ICh2ZXJfaWQgPT0gMHhmZikpCiAJCXJldHVybiAtRU5PREVWOwogCWVsc2UKLQkJaW5mbygiRGV0ZWN0ZWQgYSBzNWs4M2Egc2Vuc29yIik7CisJCXByX2luZm8oIkRldGVjdGVkIGEgczVrODNhIHNlbnNvclxuIik7CiAKIHNlbnNvcl9mb3VuZDoKIAlzZW5zX3ByaXYgPSBrbWFsbG9jKApAQCAtMjI3LDcgKzIyOSw3IEBACiAJCQkJaW5pdF9zNWs4M2FbaV1bMV0sIGRhdGEsIDIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpbmZvKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXQiKTsKKwkJCXByX2luZm8oIkludmFsaWQgc3RyZWFtIGNvbW1hbmQsIGV4aXRpbmcgaW5pdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTI3Myw3ICsyNzUsNyBAQAogCQlzNWs4M2FfZ2V0X3JvdGF0aW9uKHNkLCAmcmVnKTsKIAkJaWYgKHByZXZpb3VzX3JvdGF0aW9uICE9IHJlZykgewogCQkJcHJldmlvdXNfcm90YXRpb24gPSByZWc7Ci0JCQlpbmZvKCJDYW1lcmEgd2FzIGZsaXBwZWQiKTsKKwkJCXByX2luZm8oIkNhbWVyYSB3YXMgZmxpcHBlZFxuIik7CiAKIAkJCXM1azgzYV9nZXRfdmZsaXAoKHN0cnVjdCBnc3BjYV9kZXYgKikgc2QsICZ2ZmxpcCk7CiAJCQlzNWs4M2FfZ2V0X2hmbGlwKChzdHJ1Y3QgZ3NwY2FfZGV2ICopIHNkLCAmaGZsaXApOwpAQCAtNTY2LDIwICs1NjgsMjAgQEAKIAogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCAxNjsgcGFnZSsrKSB7CiAJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCAmcGFnZSwgMSk7Ci0JCWluZm8oIkR1bXBpbmcgdGhlIHM1azgzYSByZWdpc3RlciBzdGF0ZSBmb3IgcGFnZSAweCV4IiwgcGFnZSk7CisJCXByX2luZm8oIkR1bXBpbmcgdGhlIHM1azgzYSByZWdpc3RlciBzdGF0ZSBmb3IgcGFnZSAweCV4XG4iLAorCQkJcGFnZSk7CiAJCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPD0gMHhmZjsgYWRkcmVzcysrKSB7CiAJCQl1OCB2YWwgPSAwOwogCQkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWwsIDEpOwotCQkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4IiwKLQkJCSAgICAgYWRkcmVzcywgdmFsKTsKKwkJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleFxuIiwgYWRkcmVzcywgdmFsKTsKIAkJfQogCX0KLQlpbmZvKCJzNWs4M2EgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOworCXByX2luZm8oInM1azgzYSByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlXG4iKTsKIAogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCAxNjsgcGFnZSsrKSB7CiAJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCAmcGFnZSwgMSk7Ci0JCWluZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlICIKLQkJCQkiZm9yIHBhZ2UgMHgleCIsIHBhZ2UpOworCQlwcl9pbmZvKCJQcm9iaW5nIGZvciB3aGljaCByZWdpc3RlcnMgdGhhdCBhcmUgcmVhZC93cml0ZSBmb3IgcGFnZSAweCV4XG4iLAorCQkJcGFnZSk7CiAJCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPD0gMHhmZjsgYWRkcmVzcysrKSB7CiAJCQl1OCBvbGRfdmFsLCBjdHJsX3ZhbCwgdGVzdF92YWwgPSAweGZmOwogCkBAIC01ODgsMTQgKzU5MCwxNiBAQAogCQkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZjdHJsX3ZhbCwgMSk7CiAKIAkJCWlmIChjdHJsX3ZhbCA9PSB0ZXN0X3ZhbCkKLQkJCQlpbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZSIsIGFkZHJlc3MpOworCQkJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggaXMgd3JpdGVhYmxlXG4iLAorCQkJCQlhZGRyZXNzKTsKIAkJCWVsc2UKLQkJCQlpbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seSIsIGFkZHJlc3MpOworCQkJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5XG4iLAorCQkJCQlhZGRyZXNzKTsKIAogCQkJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWwgKi8KIAkJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWwsIDEpOwogCQl9CiAJfQotCWluZm8oIlJlYWQvd3JpdGUgcmVnaXN0ZXIgcHJvYmluZyBjb21wbGV0ZSIpOworCXByX2luZm8oIlJlYWQvd3JpdGUgcmVnaXN0ZXIgcHJvYmluZyBjb21wbGV0ZVxuIik7CiAJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbWFycy5jCmluZGV4IDAxOTYyMDkuLmVmNDVmYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbWFycy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbWFycy5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAibWFycyIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0xNzgsOCArMTgwLDggQEAKIAkJCSZhbGVuLAogCQkJNTAwKTsJLyogdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZyB3cml0ZSBbJTAyeF0gZXJyb3IgJWQiLAotCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByZXQpOworCQlwcl9lcnIoInJlZyB3cml0ZSBbJTAyeF0gZXJyb3IgJWRcbiIsCisJCSAgICAgICBnc3BjYV9kZXYtPnVzYl9idWZbMF0sIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21yOTczMTBhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21yOTczMTBhLmMKaW5kZXggOTdlNTA3OS4uNDczZTgxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tcjk3MzEwYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbXI5NzMxMGEuYwpAQCAtNDAsNiArNDAsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgIm1yOTczMTBhIgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTI2Nyw3ICsyNjksNyBAQAogCQkJICB1c2Jfc25kYnVsa3BpcGUoZ3NwY2FfZGV2LT5kZXYsIDQpLAogCQkJICBnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwgTlVMTCwgNTAwKTsKIAlpZiAocmMgPCAwKQotCQllcnIoInJlZyB3cml0ZSBbJTAyeF0gZXJyb3IgJWQiLAorCQlwcl9lcnIoInJlZyB3cml0ZSBbJTAyeF0gZXJyb3IgJWRcbiIsCiAJCSAgICAgICBnc3BjYV9kZXYtPnVzYl9idWZbMF0sIHJjKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0yODEsNyArMjgzLDcgQEAKIAkJCSAgdXNiX3JjdmJ1bGtwaXBlKGdzcGNhX2Rldi0+ZGV2LCAzKSwKIAkJCSAgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sIE5VTEwsIDUwMCk7CiAJaWYgKHJjIDwgMCkKLQkJZXJyKCJyZWcgcmVhZCBbJTAyeF0gZXJyb3IgJWQiLAorCQlwcl9lcnIoInJlZyByZWFkIFslMDJ4XSBlcnJvciAlZFxuIiwKIAkJICAgICAgIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSwgcmMpOwogCXJldHVybiByYzsKIH0KQEAgLTU0MCw3ICs1NDIsNyBAQAogCQkJc2QtPnNlbnNvcl90eXBlID0gMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZXJyKCJVbmtub3duIENJRiBTZW5zb3IgaWQgOiAlMDJ4IiwKKwkJCXByX2VycigiVW5rbm93biBDSUYgU2Vuc29yIGlkIDogJTAyeFxuIiwKIAkJCSAgICAgICBnc3BjYV9kZXYtPnVzYl9idWZbMV0pOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTU3NSwxMCArNTc3LDEwIEBACiAJCQlzZC0+c2Vuc29yX3R5cGUgPSAyOwogCQl9IGVsc2UgaWYgKChnc3BjYV9kZXYtPnVzYl9idWZbMF0gIT0gMHgwMykgJiYKIAkJCQkJKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSAhPSAweDA0KSkgewotCQkJZXJyKCJVbmtub3duIFZHQSBTZW5zb3IgaWQgQnl0ZSAwOiAlMDJ4IiwKLQkJCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdKTsKLQkJCWVycigiRGVmYXVsdHMgYXNzdW1lZCwgbWF5IG5vdCB3b3JrIik7Ci0JCQllcnIoIlBsZWFzZSByZXBvcnQgdGhpcyIpOworCQkJcHJfZXJyKCJVbmtub3duIFZHQSBTZW5zb3IgaWQgQnl0ZSAwOiAlMDJ4XG4iLAorCQkJICAgICAgIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CisJCQlwcl9lcnIoIkRlZmF1bHRzIGFzc3VtZWQsIG1heSBub3Qgd29ya1xuIik7CisJCQlwcl9lcnIoIlBsZWFzZSByZXBvcnQgdGhpc1xuIik7CiAJCX0KIAkJLyogU2FrYXIgRGlnaXRhbCBjb2xvciBuZWVkcyB0byBiZSBhZGp1c3RlZC4gKi8KIAkJaWYgKChnc3BjYV9kZXYtPnVzYl9idWZbMF0gPT0gMHgwMykgJiYKQEAgLTU5NSwxMCArNTk3LDEwIEBACiAJCQkJLyogTm90aGluZyB0byBkbyBoZXJlLiAqLwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQllcnIoIlVua25vd24gVkdBIFNlbnNvciBpZCBCeXRlIDE6ICUwMngiLAotCQkJCQlnc3BjYV9kZXYtPnVzYl9idWZbMV0pOwotCQkJCWVycigiRGVmYXVsdHMgYXNzdW1lZCwgbWF5IG5vdCB3b3JrIik7Ci0JCQkJZXJyKCJQbGVhc2UgcmVwb3J0IHRoaXMiKTsKKwkJCQlwcl9lcnIoIlVua25vd24gVkdBIFNlbnNvciBpZCBCeXRlIDE6ICUwMnhcbiIsCisJCQkJICAgICAgIGdzcGNhX2Rldi0+dXNiX2J1ZlsxXSk7CisJCQkJcHJfZXJyKCJEZWZhdWx0cyBhc3N1bWVkLCBtYXkgbm90IHdvcmtcbiIpOworCQkJCXByX2VycigiUGxlYXNlIHJlcG9ydCB0aGlzXG4iKTsKIAkJCX0KIAkJfQogCQlQREVCVUcoRF9QUk9CRSwgIk1SOTczMTBBIFZHQSBjYW1lcmEgZGV0ZWN0ZWQsIHNlbnNvcjogJWQiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9udzgweC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9udzgweC5jCmluZGV4IDhlNzU0ZmQuLjc2ODE4MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evbnc4MHguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL253ODB4LmMKQEAgLTIwLDYgKzIwLDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJudzgweCIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0xNTcxLDcgKzE1NzMsNyBAQAogCQkJbGVuLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193IGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3cgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMTU5Miw3ICsxNTk0LDcgQEAKIAkJCTB4MDAsIGluZGV4LAogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sIDUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfciBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ19yIGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCQlyZXR1cm47CiAJfQpAQCAtMTgwMiw3ICsxODA0LDggQEAKIAkJfQogCX0KIAlpZiAod2ViY2FtX2NoaXBbc2QtPndlYmNhbV0gIT0gc2QtPmJyaWRnZSkgewotCQllcnIoIkJhZCB3ZWJjYW0gdHlwZSAlZCBmb3IgTlc4MCVkIiwgc2QtPndlYmNhbSwgc2QtPmJyaWRnZSk7CisJCXByX2VycigiQmFkIHdlYmNhbSB0eXBlICVkIGZvciBOVzgwJWRcbiIsCisJCSAgICAgICBzZC0+d2ViY2FtLCBzZC0+YnJpZGdlKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gLUVOT0RFVjsKIAkJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKaW5kZXggMTgzMDVjOC4uNmEwMWIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYwpAQCAtMzYsNiArMzYsOSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqCiAgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJvdjUxOSIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0yMTcxLDcgKzIxNzQsNyBAQAogCQkJc2QtPmdzcGNhX2Rldi51c2JfYnVmLCAxLCA1MDApOwogbGVhdmU6CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyAlMDJ4IGZhaWxlZCAlZCIsIGluZGV4LCByZXQpOworCQlwcl9lcnIoInJlZ193ICUwMnggZmFpbGVkICVkXG4iLCBpbmRleCwgcmV0KTsKIAkJc2QtPmdzcGNhX2Rldi51c2JfZXJyID0gcmV0OwogCQlyZXR1cm47CiAJfQpAQCAtMjIxMCw3ICsyMjEzLDcgQEAKIAkJUERFQlVHKERfVVNCSSwgIkdFVCAlMDJ4IDAwMDAgJTA0eCAlMDJ4IiwKIAkJCXJlcSwgaW5kZXgsIHJldCk7CiAJfSBlbHNlIHsKLQkJZXJyKCJyZWdfciAlMDJ4IGZhaWxlZCAlZCIsIGluZGV4LCByZXQpOworCQlwcl9lcnIoInJlZ19yICUwMnggZmFpbGVkICVkXG4iLCBpbmRleCwgcmV0KTsKIAkJc2QtPmdzcGNhX2Rldi51c2JfZXJyID0gcmV0OwogCX0KIApAQCAtMjIzNSw3ICsyMjM4LDcgQEAKIAlpZiAocmV0ID49IDApIHsKIAkJcmV0ID0gc2QtPmdzcGNhX2Rldi51c2JfYnVmWzBdOwogCX0gZWxzZSB7Ci0JCWVycigicmVnX3I4ICUwMnggZmFpbGVkICVkIiwgaW5kZXgsIHJldCk7CisJCXByX2VycigicmVnX3I4ICUwMnggZmFpbGVkICVkXG4iLCBpbmRleCwgcmV0KTsKIAkJc2QtPmdzcGNhX2Rldi51c2JfZXJyID0gcmV0OwogCX0KIApAQCAtMjI4OCw3ICsyMjkxLDcgQEAKIAkJCTAsIGluZGV4LAogCQkJc2QtPmdzcGNhX2Rldi51c2JfYnVmLCBuLCA1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3czMiAlMDJ4IGZhaWxlZCAlZCIsIGluZGV4LCByZXQpOworCQlwcl9lcnIoInJlZ193MzIgJTAyeCBmYWlsZWQgJWRcbiIsIGluZGV4LCByZXQpOwogCQlzZC0+Z3NwY2FfZGV2LnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMjQ1Nyw3ICsyNDYwLDcgQEAKIAkJCSh1MTYpIHZhbHVlLCAodTE2KSByZWcsIE5VTEwsIDAsIDUwMCk7CiAKIAlpZiAocmV0IDwgMCkgewotCQllcnIoIm92ZngyX2kyY193ICUwMnggZmFpbGVkICVkIiwgcmVnLCByZXQpOworCQlwcl9lcnIoIm92ZngyX2kyY193ICUwMnggZmFpbGVkICVkXG4iLCByZWcsIHJldCk7CiAJCXNkLT5nc3BjYV9kZXYudXNiX2VyciA9IHJldDsKIAl9CiAKQEAgLTI0ODEsNyArMjQ4NCw3IEBACiAJCXJldCA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZlswXTsKIAkJUERFQlVHKERfVVNCSSwgIm92ZngyX2kyY19yICUwMnggJTAyeCIsIHJlZywgcmV0KTsKIAl9IGVsc2UgewotCQllcnIoIm92ZngyX2kyY19yICUwMnggZmFpbGVkICVkIiwgcmVnLCByZXQpOworCQlwcl9lcnIoIm92ZngyX2kyY19yICUwMnggZmFpbGVkICVkXG4iLCByZWcsIHJldCk7CiAJCXNkLT5nc3BjYV9kZXYudXNiX2VyciA9IHJldDsKIAl9CiAKQEAgLTI3MjcsNyArMjczMCw3IEBACiAJaW50IGhpZ2gsIGxvdzsKIAogCWlmIChzZC0+YnJpZGdlICE9IEJSSURHRV9PVkZYMikgewotCQllcnIoImVycm9yIGhpcmVzIHNlbnNvcnMgb25seSBzdXBwb3J0ZWQgd2l0aCBvdmZ4MiIpOworCQlwcl9lcnIoImVycm9yIGhpcmVzIHNlbnNvcnMgb25seSBzdXBwb3J0ZWQgd2l0aCBvdmZ4MlxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI3NjIsNyArMjc2NSw3IEBACiAJCX0KIAkJYnJlYWs7CiAJfQotCWVycigiRXJyb3IgdW5rbm93biBzZW5zb3IgdHlwZTogJTAyeCUwMngiLCBoaWdoLCBsb3cpOworCXByX2VycigiRXJyb3IgdW5rbm93biBzZW5zb3IgdHlwZTogJTAyeCUwMnhcbiIsIGhpZ2gsIGxvdyk7CiB9CiAKIC8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WODExMCwgT1Y4NjEwIHNlbnNvci4gVGhlIE9WODExMCB1c2VzCkBAIC0yNzgzLDcgKzI3ODYsNyBAQAogCWlmICgocmMgJiAzKSA9PSAxKQogCQlzZC0+c2Vuc29yID0gU0VOX09WODYxMDsKIAllbHNlCi0JCWVycigiVW5rbm93biBpbWFnZSBzZW5zb3IgdmVyc2lvbjogJWQiLCByYyAmIDMpOworCQlwcl9lcnIoIlVua25vd24gaW1hZ2Ugc2Vuc29yIHZlcnNpb246ICVkXG4iLCByYyAmIDMpOwogfQogCiAvKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjc2MTAsIE9WNzYyMCwgb3IgT1Y3NkJFIHNlbnNvci4gVGhlIE9WNzZCRSB1c2VzCkBAIC0yODQwLDggKzI4NDMsOCBAQAogCQlpZiAoaGlnaCA9PSAweDc2KSB7CiAJCQlzd2l0Y2ggKGxvdykgewogCQkJY2FzZSAweDMwOgotCQkJCWVycigiU2Vuc29yIGlzIGFuIE9WNzYzMC9PVjc2MzUiKTsKLQkJCQllcnIoIjc2MzAgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciIpOworCQkJCXByX2VycigiU2Vuc29yIGlzIGFuIE9WNzYzMC9PVjc2MzVcbiIpOworCQkJCXByX2VycigiNzYzMCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyXG4iKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIDB4NDA6CiAJCQkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgaXMgYW4gT1Y3NjQ1Iik7CkBAIC0yODY4LDcgKzI4NzEsNyBAQAogCQkJc2QtPnNlbnNvciA9IFNFTl9PVjc2MjA7CiAJCX0KIAl9IGVsc2UgewotCQllcnIoIlVua25vd24gaW1hZ2Ugc2Vuc29yIHZlcnNpb246ICVkIiwgcmMgJiAzKTsKKwkJcHJfZXJyKCJVbmtub3duIGltYWdlIHNlbnNvciB2ZXJzaW9uOiAlZFxuIiwgcmMgJiAzKTsKIAl9CiB9CiAKQEAgLTI4OTEsOCArMjg5NCw3IEBACiAJc3dpdGNoIChyYykgewogCWNhc2UgMHgwMDoKIAkJc2QtPnNlbnNvciA9IFNFTl9PVjY2MzA7Ci0JCXdhcm4oIldBUk5JTkc6IFNlbnNvciBpcyBhbiBPVjY2MzA4LiBZb3VyIGNhbWVyYSBtYXkgaGF2ZSIpOwotCQl3YXJuKCJiZWVuIG1pc2RldGVjdGVkIGluIHByZXZpb3VzIGRyaXZlciB2ZXJzaW9ucy4iKTsKKwkJcHJfd2FybigiV0FSTklORzogU2Vuc29yIGlzIGFuIE9WNjYzMDguIFlvdXIgY2FtZXJhIG1heSBoYXZlIGJlZW4gbWlzZGV0ZWN0ZWQgaW4gcHJldmlvdXMgZHJpdmVyIHZlcnNpb25zLlxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgwMToKIAkJc2QtPnNlbnNvciA9IFNFTl9PVjY2MjA7CkBAIC0yOTA4LDExICsyOTEwLDEwIEBACiAJCWJyZWFrOwogCWNhc2UgMHg5MDoKIAkJc2QtPnNlbnNvciA9IFNFTl9PVjY2MzA7Ci0JCXdhcm4oIldBUk5JTkc6IFNlbnNvciBpcyBhbiBPVjY2MzA3LiBZb3VyIGNhbWVyYSBtYXkgaGF2ZSIpOwotCQl3YXJuKCJiZWVuIG1pc2RldGVjdGVkIGluIHByZXZpb3VzIGRyaXZlciB2ZXJzaW9ucy4iKTsKKwkJcHJfd2FybigiV0FSTklORzogU2Vuc29yIGlzIGFuIE9WNjYzMDcuIFlvdXIgY2FtZXJhIG1heSBoYXZlIGJlZW4gbWlzZGV0ZWN0ZWQgaW4gcHJldmlvdXMgZHJpdmVyIHZlcnNpb25zLlxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVycigiRkFUQUw6IFVua25vd24gc2Vuc29yIHZlcnNpb246IDB4JTAyeCIsIHJjKTsKKwkJcHJfZXJyKCJGQVRBTDogVW5rbm93biBzZW5zb3IgdmVyc2lvbjogMHglMDJ4XG4iLCByYyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM0MDUsNyArMzQwNiw3IEBACiAJfSBlbHNlIGlmIChpbml0X292X3NlbnNvcihzZCwgT1ZfSElSRVNfU0lEKSA+PSAwKSB7CiAJCW92X2hpcmVzX2NvbmZpZ3VyZShzZCk7CiAJfSBlbHNlIHsKLQkJZXJyKCJDYW4ndCBkZXRlcm1pbmUgc2Vuc29yIHNsYXZlIElEcyIpOworCQlwcl9lcnIoIkNhbid0IGRldGVybWluZSBzZW5zb3Igc2xhdmUgSURzXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTM1OTAsNyArMzU5MSw3IEBACiAJaW50ZiA9IHVzYl9pZm51bV90b19pZihzZC0+Z3NwY2FfZGV2LmRldiwgc2QtPmdzcGNhX2Rldi5pZmFjZSk7CiAJYWx0ID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIHNkLT5nc3BjYV9kZXYuYWx0KTsKIAlpZiAoIWFsdCkgewotCQllcnIoIkNvdWxkbid0IGdldCBhbHRzZXR0aW5nIik7CisJCXByX2VycigiQ291bGRuJ3QgZ2V0IGFsdHNldHRpbmdcbiIpOwogCQlzZC0+Z3NwY2FfZGV2LnVzYl9lcnIgPSAtRUlPOwogCQlyZXR1cm47CiAJfQpAQCAtMzcxMyw3ICszNzE0LDcgQEAKIAlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKHNkLT5nc3BjYV9kZXYuZGV2LCBzZC0+Z3NwY2FfZGV2LmlmYWNlKTsKIAlhbHQgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50Ziwgc2QtPmdzcGNhX2Rldi5hbHQpOwogCWlmICghYWx0KSB7Ci0JCWVycigiQ291bGRuJ3QgZ2V0IGFsdHNldHRpbmciKTsKKwkJcHJfZXJyKCJDb3VsZG4ndCBnZXQgYWx0c2V0dGluZ1xuIik7CiAJCXNkLT5nc3BjYV9kZXYudXNiX2VyciA9IC1FSU87CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTM0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTM0LmMKaW5kZXggMGM2MzY5Yi4uNzY5MDdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUzNC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzQuYwpAQCAtMjgsNiArMjgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgIm92NTM0IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTc3NSw3ICs3NzcsNyBAQAogCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJICAgICAgMHgwMCwgcmVnLCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsIENUUkxfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJ3cml0ZSBmYWlsZWQgJWQiLCByZXQpOworCQlwcl9lcnIoIndyaXRlIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTc5NCw3ICs3OTYsNyBAQAogCQkJICAgICAgMHgwMCwgcmVnLCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsIENUUkxfVElNRU9VVCk7CiAJUERFQlVHKERfVVNCSSwgIkdFVCAwMSAwMDAwICUwNHggJTAyeCIsIHJlZywgZ3NwY2FfZGV2LT51c2JfYnVmWzBdKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlYWQgZmFpbGVkICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWFkIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIAlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwpAQCAtODU4LDcgKzg2MCw3IEBACiAJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgT1Y1MzRfUkVHX09QRVJBVElPTiwgT1Y1MzRfT1BfV1JJVEVfMyk7CiAKIAlpZiAoIXNjY2JfY2hlY2tfc3RhdHVzKGdzcGNhX2RldikpIHsKLQkJZXJyKCJzY2NiX3JlZ193cml0ZSBmYWlsZWQiKTsKKwkJcHJfZXJyKCJzY2NiX3JlZ193cml0ZSBmYWlsZWRcbiIpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRUlPOwogCX0KIH0KQEAgLTg2OCwxMSArODcwLDExIEBACiAJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgT1Y1MzRfUkVHX1NVQkFERFIsIHJlZyk7CiAJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgT1Y1MzRfUkVHX09QRVJBVElPTiwgT1Y1MzRfT1BfV1JJVEVfMik7CiAJaWYgKCFzY2NiX2NoZWNrX3N0YXR1cyhnc3BjYV9kZXYpKQotCQllcnIoInNjY2JfcmVnX3JlYWQgZmFpbGVkIDEiKTsKKwkJcHJfZXJyKCJzY2NiX3JlZ19yZWFkIGZhaWxlZCAxXG4iKTsKIAogCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIE9WNTM0X1JFR19PUEVSQVRJT04sIE9WNTM0X09QX1JFQURfMik7CiAJaWYgKCFzY2NiX2NoZWNrX3N0YXR1cyhnc3BjYV9kZXYpKQotCQllcnIoInNjY2JfcmVnX3JlYWQgZmFpbGVkIDIiKTsKKwkJcHJfZXJyKCJzY2NiX3JlZ19yZWFkIGZhaWxlZCAyXG4iKTsKIAogCXJldHVybiBvdjUzNF9yZWdfcmVhZChnc3BjYV9kZXYsIE9WNTM0X1JFR19SRUFEKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzRfOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUzNF85LmMKaW5kZXggYWFmNTQyOC4uYjNiMWVhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUzNF85LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUzNF85LmMKQEAgLTEsNyArMSw3IEBACiAvKgotICogb3Y1MzQtb3Y5NjV4IGdzcGNhIGRyaXZlcgorICogb3Y1MzQtb3Y5eHh4IGdzcGNhIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEplYW4tRnJhbmNvaXMgTW9pbmUgaHR0cDovL21vaW5lamYuZnJlZS5mcgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgSmVhbi1GcmFuY29pcyBNb2luZSBodHRwOi8vbW9pbmVqZi5mcmVlLmZyCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW50b25pbyBPc3BpdGUgPG9zcGl0ZUBzdHVkZW50aS51bmluYS5pdD4KICAqIENvcHlyaWdodCAoQykgMjAwOCBKaW0gUGFyaXMgPGppbUBqdGFuLmNvbT4KICAqCkBAIC0yNCw2ICsyNCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAib3Y1MzRfOSIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC00NSwzOSArNDcsNDQgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiR1NQQ0EvT1Y1MzRfOSBVU0IgQ2FtZXJhIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisvKiBjb250cm9scyAqLworZW51bSBlX2N0cmwgeworCUJSSUdIVE5FU1MsCisJQ09OVFJBU1QsCisJQVVUT0dBSU4sCisJRVhQT1NVUkUsCisJU0hBUlBORVNTLAorCVNBVFVSLAorCUxJR0hURlJFUSwKKwlOQ1RSTFMJCS8qIG51bWJlciBvZiBjb250cm9scyAqLworfTsKKwogLyogc3BlY2lmaWMgd2ViY2FtIGRlc2NyaXB0b3IgKi8KIHN0cnVjdCBzZCB7CiAJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CS8qICEhIG11c3QgYmUgdGhlIGZpcnN0IGl0ZW0gKi8KKwlzdHJ1Y3QgZ3NwY2FfY3RybCBjdHJsc1tOQ1RSTFNdOwogCV9fdTMyIGxhc3RfcHRzOwogCXU4IGxhc3RfZmlkOwogCi0JdTggYnJpZ2h0bmVzczsKLQl1OCBjb250cmFzdDsKLQl1OCBhdXRvZ2FpbjsKLQl1OCBleHBvc3VyZTsKLQlzOCBzaGFycG5lc3M7Ci0JdTggc2F0dXI7Ci0JdTggZnJlcTsKKwl1OCBzZW5zb3I7Cit9OworZW51bSBzZW5zb3JzIHsKKwlTRU5TT1JfT1Y5NjV4LAkJLyogb3Y5NjU3ICovCisJU0VOU09SX09WOTcxeCwJCS8qIG92OTcxMiAqLworCU5TRU5TT1JTCiB9OwogCiAvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCi1zdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwotc3RhdGljIGludCBzZF9nZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7Ci1zdGF0aWMgaW50IHNkX3NldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKLXN0YXRpYyBpbnQgc2RfZ2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKLXN0YXRpYyBpbnQgc2Rfc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwotc3RhdGljIGludCBzZF9nZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwotc3RhdGljIGludCBzZF9zZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7Ci1zdGF0aWMgaW50IHNkX2dldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7Ci1zdGF0aWMgaW50IHNkX3NldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7Ci1zdGF0aWMgaW50IHNkX2dldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwotc3RhdGljIGludCBzZF9zZXRzYXR1cihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7Ci1zdGF0aWMgaW50IHNkX2dldHNhdHVyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7Ci1zdGF0aWMgaW50IHNkX3NldGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwotc3RhdGljIGludCBzZF9nZXRmcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgdm9pZCBzZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CitzdGF0aWMgdm9pZCBzZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOworc3RhdGljIHZvaWQgc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKK3N0YXRpYyB2b2lkIHNldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CitzdGF0aWMgdm9pZCBzZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKK3N0YXRpYyB2b2lkIHNldHNhdHVyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CitzdGF0aWMgdm9pZCBzZXRsaWdodGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjdHJsIHNkX2N0cmxzW10gPSB7Ci0gICAgewkJCQkJCQkvKiAwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGN0cmwgc2RfY3RybHNbTkNUUkxTXSA9IHsKK1tCUklHSFRORVNTXSA9IHsKIAl7CiAJCS5pZCAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKIAkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApAQCAtODUsMTMgKzkyLDExIEBACiAJCS5taW5pbXVtID0gMCwKIAkJLm1heGltdW0gPSAxNSwKIAkJLnN0ZXAgICAgPSAxLAotI2RlZmluZSBCUklHSFRORVNTX0RFRiA3Ci0JCS5kZWZhdWx0X3ZhbHVlID0gQlJJR0hUTkVTU19ERUYsCisJCS5kZWZhdWx0X3ZhbHVlID0gNwogCX0sCi0JLnNldCA9IHNkX3NldGJyaWdodG5lc3MsCi0JLmdldCA9IHNkX2dldGJyaWdodG5lc3MsCisJLnNldF9jb250cm9sID0gc2V0YnJpZ2h0bmVzcwogICAgIH0sCi0gICAgewkJCQkJCQkvKiAxICovCitbQ09OVFJBU1RdID0gewogCXsKIAkJLmlkICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKIAkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApAQCAtOTksMTMgKzEwNCwxMSBAQAogCQkubWluaW11bSA9IDAsCiAJCS5tYXhpbXVtID0gMTUsCiAJCS5zdGVwICAgID0gMSwKLSNkZWZpbmUgQ09OVFJBU1RfREVGIDMKLQkJLmRlZmF1bHRfdmFsdWUgPSBDT05UUkFTVF9ERUYsCisJCS5kZWZhdWx0X3ZhbHVlID0gMwogCX0sCi0JLnNldCA9IHNkX3NldGNvbnRyYXN0LAotCS5nZXQgPSBzZF9nZXRjb250cmFzdCwKKwkuc2V0X2NvbnRyb2wgPSBzZXRjb250cmFzdAogICAgIH0sCi0gICAgewkJCQkJCQkvKiAyICovCitbQVVUT0dBSU5dID0gewogCXsKIAkJLmlkICAgICAgPSBWNEwyX0NJRF9BVVRPR0FJTiwKIAkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLApAQCAtMTE2LDExICsxMTksOSBAQAogI2RlZmluZSBBVVRPR0FJTl9ERUYgMQogCQkuZGVmYXVsdF92YWx1ZSA9IEFVVE9HQUlOX0RFRiwKIAl9LAotCS5zZXQgPSBzZF9zZXRhdXRvZ2FpbiwKLQkuZ2V0ID0gc2RfZ2V0YXV0b2dhaW4sCisJLnNldF9jb250cm9sID0gc2V0YXV0b2dhaW4KICAgICB9LAotI2RlZmluZSBFWFBPX0lEWCAzCi0gICAgewkJCQkJCQkvKiAzICovCitbRVhQT1NVUkVdID0gewogCXsKIAkJLmlkICAgICAgPSBWNEwyX0NJRF9FWFBPU1VSRSwKIAkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApAQCAtMTI4LDEzICsxMjksMTEgQEAKIAkJLm1pbmltdW0gPSAwLAogCQkubWF4aW11bSA9IDMsCiAJCS5zdGVwICAgID0gMSwKLSNkZWZpbmUgRVhQT19ERUYgMAotCQkuZGVmYXVsdF92YWx1ZSA9IEVYUE9fREVGLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAKIAl9LAotCS5zZXQgPSBzZF9zZXRleHBvc3VyZSwKLQkuZ2V0ID0gc2RfZ2V0ZXhwb3N1cmUsCisJLnNldF9jb250cm9sID0gc2V0ZXhwb3N1cmUKICAgICB9LAotICAgIHsJCQkJCQkJLyogNCAqLworW1NIQVJQTkVTU10gPSB7CiAJewogCQkuaWQgICAgICA9IFY0TDJfQ0lEX1NIQVJQTkVTUywKIAkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApAQCAtMTQyLDEzICsxNDEsMTEgQEAKIAkJLm1pbmltdW0gPSAtMSwJCS8qIC0xID0gYXV0byAqLwogCQkubWF4aW11bSA9IDQsCiAJCS5zdGVwICAgID0gMSwKLSNkZWZpbmUgU0hBUlBORVNTX0RFRiAtMQotCQkuZGVmYXVsdF92YWx1ZSA9IFNIQVJQTkVTU19ERUYsCisJCS5kZWZhdWx0X3ZhbHVlID0gLTEKIAl9LAotCS5zZXQgPSBzZF9zZXRzaGFycG5lc3MsCi0JLmdldCA9IHNkX2dldHNoYXJwbmVzcywKKwkuc2V0X2NvbnRyb2wgPSBzZXRzaGFycG5lc3MKICAgICB9LAotICAgIHsJCQkJCQkJLyogNSAqLworW1NBVFVSXSA9IHsKIAl7CiAJCS5pZCAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKIAkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApAQCAtMTU2LDEzICsxNTMsMTEgQEAKIAkJLm1pbmltdW0gPSAwLAogCQkubWF4aW11bSA9IDQsCiAJCS5zdGVwICAgID0gMSwKLSNkZWZpbmUgU0FUVVJfREVGIDIKLQkJLmRlZmF1bHRfdmFsdWUgPSBTQVRVUl9ERUYsCisJCS5kZWZhdWx0X3ZhbHVlID0gMgogCX0sCi0JLnNldCA9IHNkX3NldHNhdHVyLAotCS5nZXQgPSBzZF9nZXRzYXR1ciwKKwkuc2V0X2NvbnRyb2wgPSBzZXRzYXR1cgogICAgIH0sCi0gICAgeworW0xJR0hURlJFUV0gPSB7CiAJewogCQkuaWQJID0gVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1ksCiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKQEAgLTE3MCwxMSArMTY1LDkgQEAKIAkJLm1pbmltdW0gPSAwLAogCQkubWF4aW11bSA9IDIsCS8qIDA6IDAsIDE6IDUwSHosIDI6NjBIeiAqLwogCQkuc3RlcCAgICA9IDEsCi0jZGVmaW5lIEZSRVFfREVGIDAKLQkJLmRlZmF1bHRfdmFsdWUgPSBGUkVRX0RFRiwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwCiAJfSwKLQkuc2V0ID0gc2Rfc2V0ZnJlcSwKLQkuZ2V0ID0gc2RfZ2V0ZnJlcSwKKwkuc2V0X2NvbnRyb2wgPSBzZXRsaWdodGZyZXEKICAgICB9LAogfTsKIApAQCAtMjA2LDYgKzE5OSwxNCBAQAogCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IG92OTcxeF9tb2RlW10gPSB7CisJezY0MCwgNDgwLCBWNEwyX1BJWF9GTVRfU0JHR1I4LCBWNEwyX0ZJRUxEX05PTkUsCisJCS5ieXRlc3BlcmxpbmUgPSA2NDAsCisJCS5zaXplaW1hZ2UgPSA2NDAgKiA0ODAsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IKKwl9Cit9OworCiBzdGF0aWMgY29uc3QgdTggYnJpZGdlX2luaXRbXVsyXSA9IHsKIAl7MHg4OCwgMHhmOH0sCiAJezB4ODksIDB4ZmZ9LApAQCAtMjQwLDcgKzI0MSw3IEBACiAJezB4OTQsIDB4MTF9LAogfTsKIAotc3RhdGljIGNvbnN0IHU4IHNlbnNvcl9pbml0W11bMl0gPSB7CitzdGF0aWMgY29uc3QgdTggb3Y5NjV4X2luaXRbXVsyXSA9IHsKIAl7MHgxMiwgMHg4MH0sCS8qIGNvbTcgLSBTU0NCIHJlc2V0ICovCiAJezB4MDAsIDB4MDB9LAkvKiBnYWluICovCiAJezB4MDEsIDB4ODB9LAkvKiBibHVlICovCkBAIC00NTAsNyArNDUxLDcgQEAKIAl7MHg5NCwgMHgxMX0sCiB9OwogCi1zdGF0aWMgY29uc3QgdTggc2Vuc29yX2luaXRfMltdWzJdID0geworc3RhdGljIGNvbnN0IHU4IG92OTY1eF9pbml0XzJbXVsyXSA9IHsKIAl7MHgzYiwgMHhjNH0sCiAJezB4MWUsIDB4MDR9LAkvKiBtdmZwICovCiAJezB4MTMsIDB4ZTB9LAkvKiBjb204ICovCkBAIC00OTIsNyArNDkzLDY1IEBACiAJezB4MTMsIDB4ZTd9LAkvKiBjb204IC0gZXZlcnl0aGluZyAoQUdDLCBBV0IgYW5kIEFFQykgKi8KIH07CiAKLXN0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfMV92Z2FbXVsyXSA9IHsJLyogc2FtZSBmb3IgcXZnYSAqLworc3RhdGljIGNvbnN0IHU4IG92OTcxeF9pbml0W11bMl0gPSB7CisJezB4MTIsIDB4ODB9LAorCXsweDA5LCAweDEwfSwKKwl7MHgxZSwgMHgwN30sCisJezB4NWYsIDB4MTh9LAorCXsweDY5LCAweDA0fSwKKwl7MHg2NSwgMHgyYX0sCisJezB4NjgsIDB4MGF9LAorCXsweDM5LCAweDI4fSwKKwl7MHg0ZCwgMHg5MH0sCisJezB4YzEsIDB4ODB9LAorCXsweDBjLCAweDMwfSwKKwl7MHg2ZCwgMHgwMn0sCisJezB4OTYsIDB4ZjF9LAorCXsweGJjLCAweDY4fSwKKwl7MHgxMiwgMHgwMH0sCisJezB4M2IsIDB4MDB9LAorCXsweDk3LCAweDgwfSwKKwl7MHgxNywgMHgyNX0sCisJezB4MTgsIDB4YTJ9LAorCXsweDE5LCAweDAxfSwKKwl7MHgxYSwgMHhjYX0sCisJezB4MDMsIDB4MGF9LAorCXsweDMyLCAweDA3fSwKKwl7MHg5OCwgMHg0MH0sCS8qezB4OTgsIDB4MDB9LCovCisJezB4OTksIDB4QTB9LAkvKnsweDk5LCAweDAwfSwqLworCXsweDlhLCAweDAxfSwJLyp7MHg5YSwgMHgwMH0sKi8KKwl7MHg1NywgMHgwMH0sCisJezB4NTgsIDB4Nzh9LAkvKnsweDU4LCAweGM4fSwqLworCXsweDU5LCAweDUwfSwJLyp7MHg1OSwgMHhhMH0sKi8KKwl7MHg0YywgMHgxM30sCisJezB4NGIsIDB4MzZ9LAorCXsweDNkLCAweDNjfSwKKwl7MHgzZSwgMHgwM30sCisJezB4YmQsIDB4NTB9LAkvKnsweGJkLCAweGEwfSwqLworCXsweGJlLCAweDc4fSwJLyp7MHhiZSwgMHhjOH0sKi8KKwl7MHg0ZSwgMHg1NX0sCisJezB4NGYsIDB4NTV9LAorCXsweDUwLCAweDU1fSwKKwl7MHg1MSwgMHg1NX0sCisJezB4MjQsIDB4NTV9LAorCXsweDI1LCAweDQwfSwKKwl7MHgyNiwgMHhhMX0sCisJezB4NWMsIDB4NTl9LAorCXsweDVkLCAweDAwfSwKKwl7MHgxMSwgMHgwMH0sCisJezB4MmEsIDB4OTh9LAorCXsweDJiLCAweDA2fSwKKwl7MHgyZCwgMHgwMH0sCisJezB4MmUsIDB4MDB9LAorCXsweDEzLCAweGE1fSwKKwl7MHgxNCwgMHg0MH0sCisJezB4NGEsIDB4MDB9LAorCXsweDQ5LCAweGNlfSwKKwl7MHgyMiwgMHgwM30sCisJezB4MDksIDB4MDB9Cit9OworCitzdGF0aWMgY29uc3QgdTggb3Y5NjV4X3N0YXJ0XzFfdmdhW11bMl0gPSB7CS8qIHNhbWUgZm9yIHF2Z2EgKi8KIAl7MHgxMiwgMHg2Mn0sCS8qIGNvbTcgLSAzMGZwcyBWR0EgWVVWICovCiAJezB4MzYsIDB4ZmF9LAkvKiBhcmVmMyAqLwogCXsweDY5LCAweDBhfSwJLyogaHYgKi8KQEAgLTUxNSw3ICs1NzQsNyBAQAogCXsweGMwLCAweGFhfSwKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfMV9zdmdhW11bMl0gPSB7CitzdGF0aWMgY29uc3QgdTggb3Y5NjV4X3N0YXJ0XzFfc3ZnYVtdWzJdID0gewogCXsweDEyLCAweDAyfSwJLyogY29tNyAtIFlVWVYgLSBWR0EgMTUgZnVsbCByZXNvbHV0aW9uICovCiAJezB4MzYsIDB4Zjh9LAkvKiBhcmVmMyAqLwogCXsweDY5LCAweDAyfSwJLyogaHYgKi8KQEAgLTUzNyw3ICs1OTYsNyBAQAogCXsweGMwLCAweGUyfSwKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfMV94Z2FbXVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBvdjk2NXhfc3RhcnRfMV94Z2FbXVsyXSA9IHsKIAl7MHgxMiwgMHgwMn0sCS8qIGNvbTcgKi8KIAl7MHgzNiwgMHhmOH0sCS8qIGFyZWYzICovCiAJezB4NjksIDB4MDJ9LAkvKiBodiAqLwpAQCAtNTYwLDcgKzYxOSw3IEBACiAJezB4YzAsIDB4ZTJ9LAogfTsKIAotc3RhdGljIGNvbnN0IHU4IHNlbnNvcl9zdGFydF8xX3N4Z2FbXVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBvdjk2NXhfc3RhcnRfMV9zeGdhW11bMl0gPSB7CiAJezB4MTIsIDB4MDJ9LAkvKiBjb203ICovCiAJezB4MzYsIDB4Zjh9LAkvKiBhcmVmMyAqLwogCXsweDY5LCAweDAyfSwJLyogaHYgKi8KQEAgLTcwOSw3ICs3NjgsNyBAQAogCXsweDk0LCAweDExfSwKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfMl9xdmdhW11bMl0gPSB7CitzdGF0aWMgY29uc3QgdTggb3Y5NjV4X3N0YXJ0XzJfcXZnYVtdWzJdID0gewogCXsweDNiLCAweGU0fSwJLyogY29tMTEgLSBuaWdodCBtb2RlIDEvNCBmcmFtZSByYXRlICovCiAJezB4MWUsIDB4MDR9LAkvKiBtdmZwICovCiAJezB4MTMsIDB4ZTB9LAkvKiBjb204ICovCkBAIC03MjcsNyArNzg2LDcgQEAKIAl7MHgzYSwgMHg4MH0sCS8qIHRzbGIgLSB5dXl2ICovCiB9OwogCi1zdGF0aWMgY29uc3QgdTggc2Vuc29yX3N0YXJ0XzJfdmdhW11bMl0gPSB7CitzdGF0aWMgY29uc3QgdTggb3Y5NjV4X3N0YXJ0XzJfdmdhW11bMl0gPSB7CiAJezB4M2IsIDB4YzR9LAkvKiBjb20xMSAtIG5pZ2h0IG1vZGUgMS80IGZyYW1lIHJhdGUgKi8KIAl7MHgxZSwgMHgwNH0sCS8qIG12ZnAgKi8KIAl7MHgxMywgMHhlMH0sCS8qIGNvbTggKi8KQEAgLTc0Myw3ICs4MDIsNyBAQAogCXsweDJkLCAweDAwfSwJLyogYWR2ZmwgKi8KIH07CiAKLXN0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfMl9zdmdhW11bMl0gPSB7CS8qIHNhbWUgZm9yIHhnYSAqLworc3RhdGljIGNvbnN0IHU4IG92OTY1eF9zdGFydF8yX3N2Z2FbXVsyXSA9IHsJLyogc2FtZSBmb3IgeGdhICovCiAJezB4M2IsIDB4YzR9LAkvKiBjb20xMSAtIG5pZ2h0IG1vZGUgMS80IGZyYW1lIHJhdGUgKi8KIAl7MHgxZSwgMHgwNH0sCS8qIG12ZnAgKi8KIAl7MHgxMywgMHhlMH0sCS8qIGNvbTggKi8KQEAgLTc1Nyw3ICs4MTYsNyBAQAogCXsweGEzLCAweDQxfSwJLyogYmQ2MCAqLwogfTsKIAotc3RhdGljIGNvbnN0IHU4IHNlbnNvcl9zdGFydF8yX3N4Z2FbXVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBvdjk2NXhfc3RhcnRfMl9zeGdhW11bMl0gPSB7CiAJezB4MTMsIDB4ZTB9LAkvKiBjb204ICovCiAJezB4MDAsIDB4MDB9LAogCXsweDEzLCAweGU3fSwJLyogY29tOCAtIGV2ZXJ5dGhpbmcgKEFHQywgQVdCIGFuZCBBRUMpICovCkBAIC03ODUsNyArODQ0LDcgQEAKIAkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCSAgICAgIDB4MDAsIHJlZywgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCBDVFJMX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3cgZmFpbGVkICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfdyBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC04MTAsNyArODY5LDcgQEAKIAkJCSAgICAgIDB4MDAsIHJlZywgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCBDVFJMX1RJTUVPVVQpOwogCVBERUJVRyhEX1VTQkksICJyZWdfciBbJTA0eF0gLT4gJTAyeCIsIHJlZywgZ3NwY2FfZGV2LT51c2JfYnVmWzBdKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ19yIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3IgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogCXJldHVybiBnc3BjYV9kZXYtPnVzYl9idWZbMF07CkBAIC04NDgsNyArOTA3LDcgQEAKIAlyZWdfd19pKGdzcGNhX2RldiwgT1Y1MzRfUkVHX09QRVJBVElPTiwgT1Y1MzRfT1BfV1JJVEVfMyk7CiAKIAlpZiAoIXNjY2JfY2hlY2tfc3RhdHVzKGdzcGNhX2RldikpCi0JCWVycigic2NjYl93cml0ZSBmYWlsZWQiKTsKKwkJcHJfZXJyKCJzY2NiX3dyaXRlIGZhaWxlZFxuIik7CiB9CiAKIHN0YXRpYyB1OCBzY2NiX3JlYWQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1MTYgcmVnKQpAQCAtODU2LDExICs5MTUsMTEgQEAKIAlyZWdfdyhnc3BjYV9kZXYsIE9WNTM0X1JFR19TVUJBRERSLCByZWcpOwogCXJlZ193KGdzcGNhX2RldiwgT1Y1MzRfUkVHX09QRVJBVElPTiwgT1Y1MzRfT1BfV1JJVEVfMik7CiAJaWYgKCFzY2NiX2NoZWNrX3N0YXR1cyhnc3BjYV9kZXYpKQotCQllcnIoInNjY2JfcmVhZCBmYWlsZWQgMSIpOworCQlwcl9lcnIoInNjY2JfcmVhZCBmYWlsZWQgMVxuIik7CiAKIAlyZWdfdyhnc3BjYV9kZXYsIE9WNTM0X1JFR19PUEVSQVRJT04sIE9WNTM0X09QX1JFQURfMik7CiAJaWYgKCFzY2NiX2NoZWNrX3N0YXR1cyhnc3BjYV9kZXYpKQotCQllcnIoInNjY2JfcmVhZCBmYWlsZWQgMiIpOworCQlwcl9lcnIoInNjY2JfcmVhZCBmYWlsZWQgMlxuIik7CiAKIAlyZXR1cm4gcmVnX3IoZ3NwY2FfZGV2LCBPVjUzNF9SRUdfUkVBRCk7CiB9CkBAIC05MjIsNyArOTgxLDkgQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJdTggdmFsOwogCi0JdmFsID0gc2QtPmJyaWdodG5lc3M7CisJaWYgKGdzcGNhX2Rldi0+Y3RybF9kaXMgJiAoMSA8PCBCUklHSFRORVNTKSkKKwkJcmV0dXJuOworCXZhbCA9IHNkLT5jdHJsc1tCUklHSFRORVNTXS52YWw7CiAJaWYgKHZhbCA8IDgpCiAJCXZhbCA9IDE1IC0gdmFsOwkJLyogZiAuLiA4ICovCiAJZWxzZQpAQCAtOTM1LDggKzk5NiwxMCBAQAogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAorCWlmIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgQ09OVFJBU1QpKQorCQlyZXR1cm47CiAJc2NjYl93cml0ZShnc3BjYV9kZXYsIDB4NTYsCS8qIGNuc3QxIC0gY29udHJhc3QgMSBjdHJsIGNvZWZmICovCi0JCQlzZC0+Y29udHJhc3QgPDwgNCk7CisJCQlzZC0+Y3RybHNbQ09OVFJBU1RdLnZhbCA8PCA0KTsKIH0KIAogc3RhdGljIHZvaWQgc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtOTQ0LDEwICsxMDA3LDEyIEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCXU4IHZhbDsKIAorCWlmIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgQVVUT0dBSU4pKQorCQlyZXR1cm47CiAvKmZpeG1lOiBzaG91bGQgYWRqdXN0IGFnYy9hd2IvYWVjIGJ5IGRpZmZlcmVudCBjb250cm9scyAqLwogCXZhbCA9IHNjY2JfcmVhZChnc3BjYV9kZXYsIDB4MTMpOwkJLyogY29tOCAqLwogCXNjY2Jfd3JpdGUoZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsKLQlpZiAoc2QtPmF1dG9nYWluKQorCWlmIChzZC0+Y3RybHNbQVVUT0dBSU5dLnZhbCkKIAkJdmFsIHw9IDB4MDU7CQkvKiBhZ2MgJiBhZWMgKi8KIAllbHNlCiAJCXZhbCAmPSAweGZhOwpAQCAtOTYwLDggKzEwMjUsMTAgQEAKIAl1OCB2YWw7CiAJc3RhdGljIGNvbnN0IHU4IGV4cG9bNF0gPSB7MHgwMCwgMHgyNSwgMHgzOCwgMHg1ZX07CiAKKwlpZiAoZ3NwY2FfZGV2LT5jdHJsX2RpcyAmICgxIDw8IEVYUE9TVVJFKSkKKwkJcmV0dXJuOwogCXNjY2Jfd3JpdGUoZ3NwY2FfZGV2LCAweDEwLAkJCS8qIGFlY1s5OjJdICovCi0JCQlleHBvW3NkLT5leHBvc3VyZV0pOworCQkJZXhwb1tzZC0+Y3RybHNbRVhQT1NVUkVdLnZhbF0pOwogCiAJdmFsID0gc2NjYl9yZWFkKGdzcGNhX2RldiwgMHgxMyk7CQkvKiBjb204ICovCiAJc2NjYl93cml0ZShnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOwpAQCAtOTc3LDcgKzEwNDQsOSBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAlzOCB2YWw7CiAKLQl2YWwgPSBzZC0+c2hhcnBuZXNzOworCWlmIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgU0hBUlBORVNTKSkKKwkJcmV0dXJuOworCXZhbCA9IHNkLT5jdHJsc1tTSEFSUE5FU1NdLnZhbDsKIAlpZiAodmFsIDwgMCkgewkJCQkvKiBhdXRvICovCiAJCXZhbCA9IHNjY2JfcmVhZChnc3BjYV9kZXYsIDB4NDIpOwkvKiBjb20xNyAqLwogCQlzY2NiX3dyaXRlKGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7CkBAIC0xMDA2LDggKzEwNzUsMTAgQEAKIAkJezB4NDgsIDB4OTB9CiAJfTsKIAotCXZhbDEgPSBtYXRyaXhbc2QtPnNhdHVyXVswXTsKLQl2YWwyID0gbWF0cml4W3NkLT5zYXR1cl1bMV07CisJaWYgKGdzcGNhX2Rldi0+Y3RybF9kaXMgJiAoMSA8PCBTQVRVUikpCisJCXJldHVybjsKKwl2YWwxID0gbWF0cml4W3NkLT5jdHJsc1tTQVRVUl0udmFsXVswXTsKKwl2YWwyID0gbWF0cml4W3NkLT5jdHJsc1tTQVRVUl0udmFsXVsxXTsKIAl2YWwzID0gdmFsMSArIHZhbDI7CiAJc2NjYl93cml0ZShnc3BjYV9kZXYsIDB4NGYsIHZhbDMpOwkvKiBtYXRyaXggY29lZmYgKi8KIAlzY2NiX3dyaXRlKGdzcGNhX2RldiwgMHg1MCwgdmFsMyk7CkBAIC0xMDIyLDE0ICsxMDkzLDE2IEBACiAJc2NjYl93cml0ZShnc3BjYV9kZXYsIDB4NDEsIHZhbDEpOwogfQogCi1zdGF0aWMgdm9pZCBzZXRmcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyB2b2lkIHNldGxpZ2h0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCXU4IHZhbDsKIAorCWlmIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgTElHSFRGUkVRKSkKKwkJcmV0dXJuOwogCXZhbCA9IHNjY2JfcmVhZChnc3BjYV9kZXYsIDB4MTMpOwkJLyogY29tOCAqLwogCXNjY2Jfd3JpdGUoZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsKLQlpZiAoc2QtPmZyZXEgPT0gMCkgeworCWlmIChzZC0+Y3RybHNbTElHSFRGUkVRXS52YWwgPT0gMCkgewogCQlzY2NiX3dyaXRlKGdzcGNhX2RldiwgMHgxMywgdmFsICYgMHhkZik7CiAJCXJldHVybjsKIAl9CkBAIC0xMDM3LDcgKzExMTAsNyBAQAogCiAJdmFsID0gc2NjYl9yZWFkKGdzcGNhX2RldiwgMHg0Mik7CQkvKiBjb20xNyAqLwogCXNjY2Jfd3JpdGUoZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsKLQlpZiAoc2QtPmZyZXEgPT0gMSkKKwlpZiAoc2QtPmN0cmxzW0xJR0hURlJFUV0udmFsID09IDEpCiAJCXZhbCB8PSAweDAxOwogCWVsc2UKIAkJdmFsICY9IDB4ZmU7CkBAIC0xMDQ5LDM0ICsxMTIyLDE5IEBACiAJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQlzdHJ1Y3QgY2FtICpjYW07CiAKLQljYW0gPSAmZ3NwY2FfZGV2LT5jYW07CisJZ3NwY2FfZGV2LT5jYW0uY3RybHMgPSBzZC0+Y3RybHM7CiAKLQljYW0tPmNhbV9tb2RlID0gb3Y5NjV4X21vZGU7Ci0JY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKG92OTY1eF9tb2RlKTsKLQotCXNkLT5icmlnaHRuZXNzID0gQlJJR0hUTkVTU19ERUY7Ci0Jc2QtPmNvbnRyYXN0ID0gQ09OVFJBU1RfREVGOwogI2lmIEFVVE9HQUlOX0RFRiAhPSAwCi0Jc2QtPmF1dG9nYWluID0gQVVUT0dBSU5fREVGOwotCWdzcGNhX2Rldi0+Y3RybF9pbmFjIHw9ICgxIDw8IEVYUE9fSURYKTsKKwlnc3BjYV9kZXYtPmN0cmxfaW5hYyB8PSAoMSA8PCBFWFBPU1VSRSk7CiAjZW5kaWYKLSNpZiBFWFBPX0RFRiAhPSAwCi0Jc2QtPmV4cG9zdXJlID0gRVhQT19ERUY7Ci0jZW5kaWYKLSNpZiBTSEFSUE5FU1NfREVGICE9IDAKLQlzZC0+c2hhcnBuZXNzID0gU0hBUlBORVNTX0RFRjsKLSNlbmRpZgotCXNkLT5zYXR1ciA9IFNBVFVSX0RFRjsKLQlzZC0+ZnJlcSA9IEZSRVFfREVGOwotCiAJcmV0dXJuIDA7CiB9CiAKIC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIGFuZCByZXN1bWUgdGltZSAqLwogc3RhdGljIGludCBzZF9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJdTE2IHNlbnNvcl9pZDsKIAogCS8qIHJlc2V0IGJyaWRnZSAqLwpAQCAtMTA5OSw2OCArMTE1NywxMTcgQEAKIAlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBJRDogJTA0eCIsIHNlbnNvcl9pZCk7CiAKIAkvKiBpbml0aWFsaXplICovCi0JcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2VfaW5pdCwKLQkJCUFSUkFZX1NJWkUoYnJpZGdlX2luaXQpKTsKLQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3JfaW5pdCwKLQkJCUFSUkFZX1NJWkUoc2Vuc29yX2luaXQpKTsKLQlyZWdfd19hcnJheShnc3BjYV9kZXYsIGJyaWRnZV9pbml0XzIsCi0JCQlBUlJBWV9TSVpFKGJyaWRnZV9pbml0XzIpKTsKLQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3JfaW5pdF8yLAotCQkJQVJSQVlfU0laRShzZW5zb3JfaW5pdF8yKSk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweGUwLCAweDAwKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4ZTAsIDB4MDEpOwotCXNldF9sZWQoZ3NwY2FfZGV2LCAwKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4ZTAsIDB4MDApOworCWlmICgoc2Vuc29yX2lkICYgMHhmZmYwKSA9PSAweDk2NTApIHsKKwkJc2QtPnNlbnNvciA9IFNFTlNPUl9PVjk2NXg7CisKKwkJZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGUgPSBvdjk2NXhfbW9kZTsKKwkJZ3NwY2FfZGV2LT5jYW0ubm1vZGVzID0gQVJSQVlfU0laRShvdjk2NXhfbW9kZSk7CisKKwkJcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2VfaW5pdCwKKwkJCQlBUlJBWV9TSVpFKGJyaWRnZV9pbml0KSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIG92OTY1eF9pbml0LAorCQkJCUFSUkFZX1NJWkUob3Y5NjV4X2luaXQpKTsKKwkJcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2VfaW5pdF8yLAorCQkJCUFSUkFZX1NJWkUoYnJpZGdlX2luaXRfMikpOworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBvdjk2NXhfaW5pdF8yLAorCQkJCUFSUkFZX1NJWkUob3Y5NjV4X2luaXRfMikpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4ZTAsIDB4MDApOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4ZTAsIDB4MDEpOworCQlzZXRfbGVkKGdzcGNhX2RldiwgMCk7CisJCXJlZ193KGdzcGNhX2RldiwgMHhlMCwgMHgwMCk7CisJfSBlbHNlIGlmICgoc2Vuc29yX2lkICYgMHhmZmYwKSA9PSAweDk3MTApIHsKKwkJY29uc3QgY2hhciAqcDsKKwkJaW50IGw7CisKKwkJc2QtPnNlbnNvciA9IFNFTlNPUl9PVjk3MXg7CisKKwkJZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGUgPSBvdjk3MXhfbW9kZTsKKwkJZ3NwY2FfZGV2LT5jYW0ubm1vZGVzID0gQVJSQVlfU0laRShvdjk3MXhfbW9kZSk7CisKKwkJLyogbm8gY29udHJvbCB5ZXQgKi8KKwkJZ3NwY2FfZGV2LT5jdHJsX2RpcyA9ICgxIDw8IE5DVFJMUykgLSAxOworCisJCWdzcGNhX2Rldi0+Y2FtLmJ1bGsgPSAxOworCQlnc3BjYV9kZXYtPmNhbS5idWxrX3NpemUgPSAxNjM4NDsKKwkJZ3NwY2FfZGV2LT5jYW0uYnVsa19udXJicyA9IDI7CisKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NzF4X2luaXQsCisJCQkJQVJSQVlfU0laRShvdjk3MXhfaW5pdCkpOworCisJCS8qIHNldCB2aWRlbyBmb3JtYXQgb24gYnJpZGdlIHByb2Nlc3NvciAqLworCQkvKiBhY2Nlc3MgYnJpZGdlIHByb2Nlc3NvcidzIHZpZGVvIGZvcm1hdCByZWdpc3RlcnMgYXQ6IDB4MDAgKi8KKwkJcmVnX3coZ3NwY2FfZGV2LCAweDFjLCAweDAwKTsKKwkJLypzZXQgcmVnaXN0ZXI6IDB4MDAgaXMgJ1JBVzgnLCAweDQwIGlzICdZVVY0MjInIChZVVlWPykqLworCQlyZWdfdyhnc3BjYV9kZXYsIDB4MWQsIDB4MDApOworCisJCS8qIFdpbGwgVy4gc3BlY2lmaWMgc3R1ZmYKKwkJICogc2V0IFZTWU5DIHRvCisJCSAqCW91dHB1dCAoMHgxZikgaWYgZmlyc3Qgd2ViY2FtCisJCSAqCWlucHV0ICgweDE3KSBpZiAybmQgb3IgM3JkIHdlYmNhbSAqLworCQlwID0gdmlkZW9fZGV2aWNlX25vZGVfbmFtZSgmZ3NwY2FfZGV2LT52ZGV2KTsKKwkJbCA9IHN0cmxlbihwKSAtIDE7CisJCWlmIChwW2xdID09ICcwJykKKwkJCXJlZ193KGdzcGNhX2RldiwgMHg1NiwgMHgxZik7CisJCWVsc2UKKwkJCXJlZ193KGdzcGNhX2RldiwgMHg1NiwgMHgxNyk7CisJfSBlbHNlIHsKKwkJZXJyKCJVbmtub3duIHNlbnNvciAlMDR4Iiwgc2Vuc29yX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKIH0KIAogc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX09WOTcxeCkKKwkJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKIAlzd2l0Y2ggKGdzcGNhX2Rldi0+Y3Vycl9tb2RlKSB7CiAJY2FzZSBRVkdBX01PREU6CQkJLyogMzIweDI0MCAqLwotCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3Jfc3RhcnRfMV92Z2EsCi0JCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfMV92Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X3N0YXJ0XzFfdmdhLAorCQkJCUFSUkFZX1NJWkUob3Y5NjV4X3N0YXJ0XzFfdmdhKSk7CiAJCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX3N0YXJ0X3F2Z2EsCiAJCQkJQVJSQVlfU0laRShicmlkZ2Vfc3RhcnRfcXZnYSkpOwotCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3Jfc3RhcnRfMl9xdmdhLAotCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0XzJfcXZnYSkpOworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBvdjk2NXhfc3RhcnRfMl9xdmdhLAorCQkJCUFSUkFZX1NJWkUob3Y5NjV4X3N0YXJ0XzJfcXZnYSkpOwogCQlicmVhazsKIAljYXNlIFZHQV9NT0RFOgkJCS8qIDY0MHg0ODAgKi8KLQkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0XzFfdmdhLAotCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0XzFfdmdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIG92OTY1eF9zdGFydF8xX3ZnYSwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9zdGFydF8xX3ZnYSkpOwogCQlyZWdfd19hcnJheShnc3BjYV9kZXYsIGJyaWRnZV9zdGFydF92Z2EsCiAJCQkJQVJSQVlfU0laRShicmlkZ2Vfc3RhcnRfdmdhKSk7Ci0JCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF8yX3ZnYSwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF8yX3ZnYSkpOworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBvdjk2NXhfc3RhcnRfMl92Z2EsCisJCQkJQVJSQVlfU0laRShvdjk2NXhfc3RhcnRfMl92Z2EpKTsKIAkJYnJlYWs7CiAJY2FzZSBTVkdBX01PREU6CQkJLyogODAweDYwMCAqLwotCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3Jfc3RhcnRfMV9zdmdhLAotCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0XzFfc3ZnYSkpOworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBvdjk2NXhfc3RhcnRfMV9zdmdhLAorCQkJCUFSUkFZX1NJWkUob3Y5NjV4X3N0YXJ0XzFfc3ZnYSkpOwogCQlyZWdfd19hcnJheShnc3BjYV9kZXYsIGJyaWRnZV9zdGFydF9zdmdhLAogCQkJCUFSUkFZX1NJWkUoYnJpZGdlX3N0YXJ0X3N2Z2EpKTsKLQkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0XzJfc3ZnYSwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF8yX3N2Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X3N0YXJ0XzJfc3ZnYSwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9zdGFydF8yX3N2Z2EpKTsKIAkJYnJlYWs7CiAJY2FzZSBYR0FfTU9ERToJCQkvKiAxMDI0eDc2OCAqLwotCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3Jfc3RhcnRfMV94Z2EsCi0JCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfMV94Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X3N0YXJ0XzFfeGdhLAorCQkJCUFSUkFZX1NJWkUob3Y5NjV4X3N0YXJ0XzFfeGdhKSk7CiAJCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX3N0YXJ0X3hnYSwKIAkJCQlBUlJBWV9TSVpFKGJyaWRnZV9zdGFydF94Z2EpKTsKLQkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0XzJfc3ZnYSwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF8yX3N2Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X3N0YXJ0XzJfc3ZnYSwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9zdGFydF8yX3N2Z2EpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIC8qCWNhc2UgU1hHQV9NT0RFOgkJCSAqIDEyODB4MTAyNCAqLwotCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3Jfc3RhcnRfMV9zeGdhLAotCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0XzFfc3hnYSkpOworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBvdjk2NXhfc3RhcnRfMV9zeGdhLAorCQkJCUFSUkFZX1NJWkUob3Y5NjV4X3N0YXJ0XzFfc3hnYSkpOwogCQlyZWdfd19hcnJheShnc3BjYV9kZXYsIGJyaWRnZV9zdGFydF9zeGdhLAogCQkJCUFSUkFZX1NJWkUoYnJpZGdlX3N0YXJ0X3N4Z2EpKTsKLQkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0XzJfc3hnYSwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF8yX3N4Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X3N0YXJ0XzJfc3hnYSwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9zdGFydF8yX3N4Z2EpKTsKIAkJYnJlYWs7CiAJfQotCXNldGZyZXEoZ3NwY2FfZGV2KTsKKwlzZXRsaWdodGZyZXEoZ3NwY2FfZGV2KTsKIAlzZXRhdXRvZ2Fpbihnc3BjYV9kZXYpOwogCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsKIAlzZXRjb250cmFzdChnc3BjYV9kZXYpOwpAQCAtMTE5OCw5ICsxMzA1LDExIEBACiAJX191MzIgdGhpc19wdHM7CiAJdTggdGhpc19maWQ7CiAJaW50IHJlbWFpbmluZ19sZW4gPSBsZW47CisJaW50IHBheWxvYWRfbGVuOwogCisJcGF5bG9hZF9sZW4gPSBnc3BjYV9kZXYtPmNhbS5idWxrID8gMjA0OCA6IDIwNDA7CiAJZG8gewotCQlsZW4gPSBtaW4ocmVtYWluaW5nX2xlbiwgMjA0MCk7CisJCWxlbiA9IG1pbihyZW1haW5pbmdfbGVuLCBwYXlsb2FkX2xlbik7CiAKIAkJLyogUGF5bG9hZHMgYXJlIHByZWZpeGVkIHdpdGggYSBVVkMtc3R5bGUgaGVhZGVyLiAgV2UKIAkJICAgY29uc2lkZXIgYSBmcmFtZSB0byBzdGFydCB3aGVuIHRoZSBGSUQgdG9nZ2xlcywgb3IgdGhlIFBUUwpAQCAtMTI2MiwxMzggKzEzNzEsNiBAQAogCX0gd2hpbGUgKHJlbWFpbmluZ19sZW4gPiAwKTsKIH0KIAotLyogY29udHJvbHMgKi8KLXN0YXRpYyBpbnQgc2Rfc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQlzZC0+YnJpZ2h0bmVzcyA9IHZhbDsKLQlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCi0JCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsKLQlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwotfQotCi1zdGF0aWMgaW50IHNkX2dldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCSp2YWwgPSBzZC0+YnJpZ2h0bmVzczsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZF9zZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQlzZC0+Y29udHJhc3QgPSB2YWw7Ci0JaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQotCQlzZXRjb250cmFzdChnc3BjYV9kZXYpOwotCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7Ci19Ci0KLXN0YXRpYyBpbnQgc2RfZ2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCSp2YWwgPSBzZC0+Y29udHJhc3Q7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2Rfc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0Jc2QtPmF1dG9nYWluID0gdmFsOwotCi0JaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKSB7Ci0JCWlmICh2YWwpCi0JCQlnc3BjYV9kZXYtPmN0cmxfaW5hYyB8PSAoMSA8PCBFWFBPX0lEWCk7Ci0JCWVsc2UKLQkJCWdzcGNhX2Rldi0+Y3RybF9pbmFjICY9IH4oMSA8PCBFWFBPX0lEWCk7Ci0JCXNldGF1dG9nYWluKGdzcGNhX2Rldik7Ci0JfQotCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7Ci19Ci0KLXN0YXRpYyBpbnQgc2RfZ2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCSp2YWwgPSBzZC0+YXV0b2dhaW47Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2Rfc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0Jc2QtPmV4cG9zdXJlID0gdmFsOwotCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKLQlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwotfQotCi1zdGF0aWMgaW50IHNkX2dldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQkqdmFsID0gc2QtPmV4cG9zdXJlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNkX3NldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQlzZC0+c2hhcnBuZXNzID0gdmFsOwotCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJc2V0c2hhcnBuZXNzKGdzcGNhX2Rldik7Ci0JcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKLX0KLQotc3RhdGljIGludCBzZF9nZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCSp2YWwgPSBzZC0+c2hhcnBuZXNzOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNkX3NldHNhdHVyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCXNkLT5zYXR1ciA9IHZhbDsKLQlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCi0JCXNldHNhdHVyKGdzcGNhX2Rldik7Ci0JcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKLX0KLQotc3RhdGljIGludCBzZF9nZXRzYXR1cihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0JKnZhbCA9IHNkLT5zYXR1cjsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgc2Rfc2V0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQlzZC0+ZnJlcSA9IHZhbDsKLQlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCi0JCXNldGZyZXEoZ3NwY2FfZGV2KTsKLQlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwotfQotCi1zdGF0aWMgaW50IHNkX2dldGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCSp2YWwgPSBzZC0+ZnJlcTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzZF9xdWVyeW1lbnUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAogCQkJc3RydWN0IHY0bDJfcXVlcnltZW51ICptZW51KQogewpAQCAtMTQxOSw3ICsxMzk2LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RfZGVzYyBzZF9kZXNjID0gewogCS5uYW1lICAgICA9IE1PRFVMRV9OQU1FLAogCS5jdHJscyAgICA9IHNkX2N0cmxzLAotCS5uY3RybHMgICA9IEFSUkFZX1NJWkUoc2RfY3RybHMpLAorCS5uY3RybHMgICA9IE5DVFJMUywKIAkuY29uZmlnICAgPSBzZF9jb25maWcsCiAJLmluaXQgICAgID0gc2RfaW5pdCwKIAkuc3RhcnQgICAgPSBzZF9zdGFydCwKQEAgLTE0MzAsNiArMTQwNyw3IEBACiAKIC8qIC0tIG1vZHVsZSBpbml0aWFsaXNhdGlvbiAtLSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MDVhOSwgMHg4MDY1KX0sCiAJe1VTQl9ERVZJQ0UoMHgwNmY4LCAweDMwMDMpfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjMjA3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzIwNy5jCmluZGV4IDgxNzM5YTIuLjE2MDBkZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjMjA3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWMyMDcuYwpAQCAtMjMsNiArMjMsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInBhYzIwNyIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0xNzgsOCArMTgwLDggQEAKIAkJCTB4MDAsIGluZGV4LAogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW5ndGgsIFBBQzIwN19DVFJMX1RJTUVPVVQpOwogCWlmIChlcnIgPCAwKQotCQllcnIoIkZhaWxlZCB0byB3cml0ZSByZWdpc3RlcnMgdG8gaW5kZXggMHglMDRYLCBlcnJvciAlZCkiLAotCQkJaW5kZXgsIGVycik7CisJCXByX2VycigiRmFpbGVkIHRvIHdyaXRlIHJlZ2lzdGVycyB0byBpbmRleCAweCUwNFgsIGVycm9yICVkXG4iLAorCQkgICAgICAgaW5kZXgsIGVycik7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTk0LDggKzE5Niw4IEBACiAJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCiAJCQl2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIFBBQzIwN19DVFJMX1RJTUVPVVQpOwogCWlmIChlcnIpCi0JCWVycigiRmFpbGVkIHRvIHdyaXRlIGEgcmVnaXN0ZXIgKGluZGV4IDB4JTA0WCwiCi0JCQkiIHZhbHVlIDB4JTAyWCwgZXJyb3IgJWQpIiwgaW5kZXgsIHZhbHVlLCBlcnIpOworCQlwcl9lcnIoIkZhaWxlZCB0byB3cml0ZSBhIHJlZ2lzdGVyIChpbmRleCAweCUwNFgsIHZhbHVlIDB4JTAyWCwgZXJyb3IgJWQpXG4iLAorCQkgICAgICAgaW5kZXgsIHZhbHVlLCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTIxMCw4ICsyMTIsOCBAQAogCQkJMHgwMCwgaW5kZXgsCiAJCQlnc3BjYV9kZXYtPnVzYl9idWYsIDEsIFBBQzIwN19DVFJMX1RJTUVPVVQpOwogCWlmIChyZXMgPCAwKSB7Ci0JCWVycigiRmFpbGVkIHRvIHJlYWQgYSByZWdpc3RlciAoaW5kZXggMHglMDRYLCBlcnJvciAlZCkiLAotCQkJaW5kZXgsIHJlcyk7CisJCXByX2VycigiRmFpbGVkIHRvIHJlYWQgYSByZWdpc3RlciAoaW5kZXggMHglMDRYLCBlcnJvciAlZClcbiIsCisJCSAgICAgICBpbmRleCwgcmVzKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMwMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzAyLmMKaW5kZXggNTYxNWQ3Yi4uMWM0NGY3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzAyLmMKQEAgLTYxLDYgKzYxLDggQEAKICAgICAzICAgfCAweDIxICAgICAgIHwgc2V0aHZmbGlwKCkKICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAicGFjNzMwMiIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC00MDgsOCArNDEwLDggQEAKIAkJCWluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfd19idWYgZmFpbGVkIGluZGV4IDB4JTAyeCwgZXJyb3IgJWQiLAotCQkJaW5kZXgsIHJldCk7CisJCXByX2VycigicmVnX3dfYnVmIGZhaWxlZCBpbmRleCAweCUwMngsIGVycm9yICVkXG4iLAorCQkgICAgICAgaW5kZXgsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC00MzEsOCArNDMzLDggQEAKIAkJCTAsIGluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3coKSBmYWlsZWQgaW5kZXggMHglMDJ4LCB2YWx1ZSAweCUwMngsIGVycm9yICVkIiwKLQkJCWluZGV4LCB2YWx1ZSwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfdygpIGZhaWxlZCBpbmRleCAweCUwMngsIHZhbHVlIDB4JTAyeCwgZXJyb3IgJWRcbiIsCisJCSAgICAgICBpbmRleCwgdmFsdWUsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC00NjYsOSArNDY4LDggQEAKIAkJCQkwLCBpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAogCQkJCTUwMCk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQllcnIoInJlZ193X3BhZ2UoKSBmYWlsZWQgaW5kZXggMHglMDJ4LCAiCi0JCQkidmFsdWUgMHglMDJ4LCBlcnJvciAlZCIsCi0JCQkJaW5kZXgsIHBhZ2VbaW5kZXhdLCByZXQpOworCQkJcHJfZXJyKCJyZWdfd19wYWdlKCkgZmFpbGVkIGluZGV4IDB4JTAyeCwgdmFsdWUgMHglMDJ4LCBlcnJvciAlZFxuIiwKKwkJCSAgICAgICBpbmRleCwgcGFnZVtpbmRleF0sIHJldCk7CiAJCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzczMTEuYwppbmRleCBmODgwMWI1Li43NTA5ZDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzczMTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzczMTEuYwpAQCAtNDksNiArNDksOCBAQAogCQlmb3IgbWF4IGdhaW4sIDB4MTQgZm9yIG1pbmltYWwgZ2Fpbi4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAicGFjNzMxMSIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0yNzYsOCArMjc4LDggQEAKIAkJCWluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfd19idWYoKSBmYWlsZWQgaW5kZXggMHglMDJ4LCBlcnJvciAlZCIsCi0JCQlpbmRleCwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfd19idWYoKSBmYWlsZWQgaW5kZXggMHglMDJ4LCBlcnJvciAlZFxuIiwKKwkJICAgICAgIGluZGV4LCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMjk5LDggKzMwMSw4IEBACiAJCQkwLCBpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193KCkgZmFpbGVkIGluZGV4IDB4JTAyeCwgdmFsdWUgMHglMDJ4LCBlcnJvciAlZCIsCi0JCQlpbmRleCwgdmFsdWUsIHJldCk7CisJCXByX2VycigicmVnX3coKSBmYWlsZWQgaW5kZXggMHglMDJ4LCB2YWx1ZSAweCUwMngsIGVycm9yICVkXG4iLAorCQkgICAgICAgaW5kZXgsIHZhbHVlLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMzM0LDkgKzMzNiw4IEBACiAJCQkJMCwgaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKIAkJCQk1MDApOwogCQlpZiAocmV0IDwgMCkgewotCQkJZXJyKCJyZWdfd19wYWdlKCkgZmFpbGVkIGluZGV4IDB4JTAyeCwgIgotCQkJInZhbHVlIDB4JTAyeCwgZXJyb3IgJWQiLAotCQkJCWluZGV4LCBwYWdlW2luZGV4XSwgcmV0KTsKKwkJCXByX2VycigicmVnX3dfcGFnZSgpIGZhaWxlZCBpbmRleCAweCUwMngsIHZhbHVlIDB4JTAyeCwgZXJyb3IgJWRcbiIsCisJCQkgICAgICAgaW5kZXgsIHBhZ2VbaW5kZXhdLCByZXQpOwogCQkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc2U0MDEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc2U0MDEuYwppbmRleCA0YzI4M2MyLi4zYjcxYmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zZTQwMS5jCkBAIC0yMyw2ICsyMyw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic2U0MDEiCiAKICNkZWZpbmUgQlVMS19TSVpFIDQwOTYKQEAgLTE0NCw4ICsxNDYsOCBAQAogCQkJICAgICAgdmFsdWUsIDAsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCWlmICghc2lsZW50KQotCQkJZXJyKCJ3cml0ZSByZXEgZmFpbGVkIHJlcSAlIzA0eCB2YWwgJSMwNHggZXJyb3IgJWQiLAotCQkJICAgIHJlcSwgdmFsdWUsIGVycik7CisJCQlwcl9lcnIoIndyaXRlIHJlcSBmYWlsZWQgcmVxICUjMDR4IHZhbCAlIzA0eCBlcnJvciAlZFxuIiwKKwkJCSAgICAgICByZXEsIHZhbHVlLCBlcnIpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSBlcnI7CiAJfQogfQpAQCAtMTU4LDcgKzE2MCw3IEBACiAJCXJldHVybjsKIAogCWlmIChVU0JfQlVGX1NaIDwgUkVBRF9SRVFfU0laRSkgewotCQllcnIoIlVTQl9CVUZfU1ogdG9vIHNtYWxsISEiKTsKKwkJcHJfZXJyKCJVU0JfQlVGX1NaIHRvbyBzbWFsbCEhXG4iKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gLUVOT0JVRlM7CiAJCXJldHVybjsKIAl9CkBAIC0xNjksNyArMTcxLDggQEAKIAkJCSAgICAgIDAsIDAsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgUkVBRF9SRVFfU0laRSwgMTAwMCk7CiAJaWYgKGVyciA8IDApIHsKIAkJaWYgKCFzaWxlbnQpCi0JCQllcnIoInJlYWQgcmVxIGZhaWxlZCByZXEgJSMwNHggZXJyb3IgJWQiLCByZXEsIGVycik7CisJCQlwcl9lcnIoInJlYWQgcmVxIGZhaWxlZCByZXEgJSMwNHggZXJyb3IgJWRcbiIsCisJCQkgICAgICAgcmVxLCBlcnIpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSBlcnI7CiAJfQogfQpAQCAtMTg4LDggKzE5MSw4IEBACiAJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQkgICAgICBwYXJhbSwgc2VsZWN0b3IsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVycigic2V0IGZlYXR1cmUgZmFpbGVkIHNlbCAlIzA0eCBwYXJhbSAlIzA0eCBlcnJvciAlZCIsCi0JCSAgICBzZWxlY3RvciwgcGFyYW0sIGVycik7CisJCXByX2Vycigic2V0IGZlYXR1cmUgZmFpbGVkIHNlbCAlIzA0eCBwYXJhbSAlIzA0eCBlcnJvciAlZFxuIiwKKwkJICAgICAgIHNlbGVjdG9yLCBwYXJhbSwgZXJyKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOwogCX0KIH0KQEAgLTIwMiw3ICsyMDUsNyBAQAogCQlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwogCiAJaWYgKFVTQl9CVUZfU1ogPCAyKSB7Ci0JCWVycigiVVNCX0JVRl9TWiB0b28gc21hbGwhISIpOworCQlwcl9lcnIoIlVTQl9CVUZfU1ogdG9vIHNtYWxsISFcbiIpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRU5PQlVGUzsKIAkJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKIAl9CkBAIC0yMTMsNyArMjE2LDggQEAKIAkJCSAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJICAgICAgMCwgc2VsZWN0b3IsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMiwgMTAwMCk7CiAJaWYgKGVyciA8IDApIHsKLQkJZXJyKCJnZXQgZmVhdHVyZSBmYWlsZWQgc2VsICUjMDR4IGVycm9yICVkIiwgc2VsZWN0b3IsIGVycik7CisJCXByX2VycigiZ2V0IGZlYXR1cmUgZmFpbGVkIHNlbCAlIzA0eCBlcnJvciAlZFxuIiwKKwkJICAgICAgIHNlbGVjdG9yLCBlcnIpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSBlcnI7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMzAwLDIxICszMDQsMjEgQEAKIAkJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKIAogCWlmIChjZFsxXSAhPSAweDQxKSB7Ci0JCWVycigiV3JvbmcgZGVzY3JpcHRvciB0eXBlIik7CisJCXByX2VycigiV3JvbmcgZGVzY3JpcHRvciB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKCEoY2RbMl0gJiBTRTQwMV9GT1JNQVRfQkFZRVIpKSB7Ci0JCWVycigiQmF5ZXIgZm9ybWF0IG5vdCBzdXBwb3J0ZWQhIik7CisJCXByX2VycigiQmF5ZXIgZm9ybWF0IG5vdCBzdXBwb3J0ZWQhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKGNkWzNdKQotCQlpbmZvKCJFeHRyYUZlYXR1cmVzOiAlZCIsIGNkWzNdKTsKKwkJcHJfaW5mbygiRXh0cmFGZWF0dXJlczogJWRcbiIsIGNkWzNdKTsKIAogCW4gPSBjZFs0XSB8IChjZFs1XSA8PCA4KTsKIAlpZiAobiA+IE1BWF9NT0RFUykgewotCQllcnIoIlRvbyBtYW55IGZyYW1lIHNpemVzIik7CisJCXByX2VycigiVG9vIG1hbnkgZnJhbWUgc2l6ZXNcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTM1MywxNSArMzU3LDE2IEBACiAJCQlzZC0+Zm10c1tpXS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjg7CiAJCQlzZC0+Zm10c1tpXS5ieXRlc3BlcmxpbmUgPSB3aWR0aHNbaV07CiAJCQlzZC0+Zm10c1tpXS5zaXplaW1hZ2UgPSB3aWR0aHNbaV0gKiBoZWlnaHRzW2ldOwotCQkJaW5mbygiRnJhbWUgc2l6ZTogJWR4JWQgYmF5ZXIiLCB3aWR0aHNbaV0sIGhlaWdodHNbaV0pOworCQkJcHJfaW5mbygiRnJhbWUgc2l6ZTogJWR4JWQgYmF5ZXJcbiIsCisJCQkJd2lkdGhzW2ldLCBoZWlnaHRzW2ldKTsKIAkJfSBlbHNlIHsKIAkJCS8qIEZvdW5kIGEgbWF0Y2ggdXNlIGphbmdndSBjb21wcmVzc2lvbiAqLwogCQkJc2QtPmZtdHNbaV0ucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfU0U0MDE7CiAJCQlzZC0+Zm10c1tpXS5ieXRlc3BlcmxpbmUgPSAwOwogCQkJc2QtPmZtdHNbaV0uc2l6ZWltYWdlID0gd2lkdGhzW2ldICogaGVpZ2h0c1tpXSAqIDM7Ci0JCQlpbmZvKCJGcmFtZSBzaXplOiAlZHglZCAxLyVkdGggamFuZ2d1IiwKLQkJCSAgICAgd2lkdGhzW2ldLCBoZWlnaHRzW2ldLAotCQkJICAgICBzZC0+Zm10c1tpXS5wcml2ICogc2QtPmZtdHNbaV0ucHJpdik7CisJCQlwcl9pbmZvKCJGcmFtZSBzaXplOiAlZHglZCAxLyVkdGggamFuZ2d1XG4iLAorCQkJCXdpZHRoc1tpXSwgaGVpZ2h0c1tpXSwKKwkJCQlzZC0+Zm10c1tpXS5wcml2ICogc2QtPmZtdHNbaV0ucHJpdik7CiAJCX0KIAl9CiAKQEAgLTU3MSwxMSArNTc2LDEyIEBACiAJCXBsZW4gICA9ICgoYml0cyArIDQ3KSA+PiA0KSA8PCAxOwogCQkvKiBTYW5pdHkgY2hlY2tzICovCiAJCWlmIChwbGVuID4gMTAyNCkgewotCQkJZXJyKCJpbnZhbGlkIHBhY2tldCBsZW4gJWQgcmVzdGFydGluZyBzdHJlYW0iLCBwbGVuKTsKKwkJCXByX2VycigiaW52YWxpZCBwYWNrZXQgbGVuICVkIHJlc3RhcnRpbmcgc3RyZWFtXG4iLAorCQkJICAgICAgIHBsZW4pOwogCQkJZ290byBlcnJvcjsKIAkJfQogCQlpZiAoaW5mbyA9PSAzKSB7Ci0JCQllcnIoInVua25vd24gZnJhbWUgaW5mbyB2YWx1ZSByZXN0YXJ0aW5nIHN0cmVhbSIpOworCQkJcHJfZXJyKCJ1bmtub3duIGZyYW1lIGluZm8gdmFsdWUgcmVzdGFydGluZyBzdHJlYW1cbiIpOwogCQkJZ290byBlcnJvcjsKIAkJfQogCkBAIC01OTksOCArNjA1LDggQEAKIAkJCWJyZWFrOwogCQljYXNlIDE6IC8qIEVPRiAqLwogCQkJaWYgKHNkLT5waXhlbHNfcmVhZCAhPSBpbWFnZXNpemUpIHsKLQkJCQllcnIoImZyYW1lIHNpemUgJWQgZXhwZWN0ZWQgJWQiLAotCQkJCSAgICBzZC0+cGl4ZWxzX3JlYWQsIGltYWdlc2l6ZSk7CisJCQkJcHJfZXJyKCJmcmFtZSBzaXplICVkIGV4cGVjdGVkICVkXG4iLAorCQkJCSAgICAgICBzZC0+cGl4ZWxzX3JlYWQsIGltYWdlc2l6ZSk7CiAJCQkJZ290byBlcnJvcjsKIAkJCX0KIAkJCXNkX2NvbXBsZXRlX2ZyYW1lKGdzcGNhX2Rldiwgc2QtPnBhY2tldCwgcGxlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NuOWMyMDI4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NuOWMyMDI4LmMKaW5kZXggNDI3MWY4Ni4uNDhhYWUzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjAyOC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc245YzIwMjguYwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInNuOWMyMDI4IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTc1LDggKzc3LDggQEAKIAkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKIAkJCTIsIDAsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgNiwgNTAwKTsKIAlpZiAocmMgPCAwKSB7Ci0JCWVycigiY29tbWFuZCB3cml0ZSBbJTAyeF0gZXJyb3IgJWQiLAotCQkJCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSwgcmMpOworCQlwcl9lcnIoImNvbW1hbmQgd3JpdGUgWyUwMnhdIGVycm9yICVkXG4iLAorCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTkzLDcgKzk1LDcgQEAKIAkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAogCQkJMSwgMCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCA1MDApOwogCWlmIChyYyAhPSAxKSB7Ci0JCWVycigicmVhZDEgZXJyb3IgJWQiLCByYyk7CisJCXByX2VycigicmVhZDEgZXJyb3IgJWRcbiIsIHJjKTsKIAkJcmV0dXJuIChyYyA8IDApID8gcmMgOiAtRUlPOwogCX0KIAlQREVCVUcoRF9VU0JJLCAicmVhZDEgcmVzcG9uc2UgJTAyeCIsIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CkBAIC0xMDksNyArMTExLDcgQEAKIAkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAogCQkJNCwgMCwgZ3NwY2FfZGV2LT51c2JfYnVmLCA0LCA1MDApOwogCWlmIChyYyAhPSA0KSB7Ci0JCWVycigicmVhZDQgZXJyb3IgJWQiLCByYyk7CisJCXByX2VycigicmVhZDQgZXJyb3IgJWRcbiIsIHJjKTsKIAkJcmV0dXJuIChyYyA8IDApID8gcmMgOiAtRUlPOwogCX0KIAltZW1jcHkocmVhZGluZywgZ3NwY2FfZGV2LT51c2JfYnVmLCA0KTsKQEAgLTEzMSw3ICsxMzMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAyNTYgJiYgc3RhdHVzIDwgMjsgaSsrKQogCQlzdGF0dXMgPSBzbjljMjAyOF9yZWFkMShnc3BjYV9kZXYpOwogCWlmIChzdGF0dXMgIT0gMikgewotCQllcnIoImxvbmcgY29tbWFuZCBzdGF0dXMgcmVhZCBlcnJvciAlZCIsIHN0YXR1cyk7CisJCXByX2VycigibG9uZyBjb21tYW5kIHN0YXR1cyByZWFkIGVycm9yICVkXG4iLCBzdGF0dXMpOwogCQlyZXR1cm4gKHN0YXR1cyA8IDApID8gc3RhdHVzIDogLUVJTzsKIAl9CiAKQEAgLTYzOCw3ICs2NDAsNyBAQAogCQllcnJfY29kZSA9IHN0YXJ0X3Zpdml0YXJfY2FtKGdzcGNhX2Rldik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVycigiU3RhcnRpbmcgdW5rbm93biBjYW1lcmEsIHBsZWFzZSByZXBvcnQgdGhpcyIpOworCQlwcl9lcnIoIlN0YXJ0aW5nIHVua25vd24gY2FtZXJhLCBwbGVhc2UgcmVwb3J0IHRoaXNcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NuOWMyMHguYwppbmRleCBjNDMxOTAwLi44NmUwN2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NuOWMyMHguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NuOWMyMHguYwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTExMjMsNyArMTEyNSw3IEBACiAJCQlsZW5ndGgsCiAJCQk1MDApOwogCWlmICh1bmxpa2VseShyZXN1bHQgPCAwIHx8IHJlc3VsdCAhPSBsZW5ndGgpKSB7Ci0JCWVycigiUmVhZCByZWdpc3RlciBmYWlsZWQgMHglMDJYIiwgcmVnKTsKKwkJcHJfZXJyKCJSZWFkIHJlZ2lzdGVyIGZhaWxlZCAweCUwMlhcbiIsIHJlZyk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTExNDQsNyArMTE0Niw3IEBACiAJCQlsZW5ndGgsCiAJCQk1MDApOwogCWlmICh1bmxpa2VseShyZXN1bHQgPCAwIHx8IHJlc3VsdCAhPSBsZW5ndGgpKSB7Ci0JCWVycigiV3JpdGUgcmVnaXN0ZXIgZmFpbGVkIGluZGV4IDB4JTAyWCIsIHJlZyk7CisJCXByX2VycigiV3JpdGUgcmVnaXN0ZXIgZmFpbGVkIGluZGV4IDB4JTAyWFxuIiwgcmVnKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXJldHVybiAwOwpAQCAtMTI3NSwxNCArMTI3NywxNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChpZCAhPSAweDdmYTIpIHsKLQkJZXJyKCJzZW5zb3IgaWQgZm9yIG92OTY1MCBkb2Vzbid0IG1hdGNoICgweCUwNHgpIiwgaWQpOworCQlwcl9lcnIoInNlbnNvciBpZCBmb3Igb3Y5NjUwIGRvZXNuJ3QgbWF0Y2ggKDB4JTA0eClcbiIsIGlkKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3Y5NjUwX2luaXQpOyBpKyspIHsKIAkJaWYgKGkyY193MShnc3BjYV9kZXYsIG92OTY1MF9pbml0W2ldLnJlZywKIAkJCQlvdjk2NTBfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJZXJyKCJPVjk2NTAgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJcHJfZXJyKCJPVjk2NTAgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTEyOTksNyArMTMwMSw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3Y5NjU1X2luaXQpOyBpKyspIHsKIAkJaWYgKGkyY193MShnc3BjYV9kZXYsIG92OTY1NV9pbml0W2ldLnJlZywKIAkJCQlvdjk2NTVfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJZXJyKCJPVjk2NTUgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJcHJfZXJyKCJPVjk2NTUgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTEzMTgsNyArMTMyMCw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc29pOTY4X2luaXQpOyBpKyspIHsKIAkJaWYgKGkyY193MShnc3BjYV9kZXYsIHNvaTk2OF9pbml0W2ldLnJlZywKIAkJCQlzb2k5NjhfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJZXJyKCJTT0k5Njggc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJcHJfZXJyKCJTT0k5Njggc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTEzMzgsNyArMTM0MCw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3Y3NjYwX2luaXQpOyBpKyspIHsKIAkJaWYgKGkyY193MShnc3BjYV9kZXYsIG92NzY2MF9pbml0W2ldLnJlZywKIAkJCQlvdjc2NjBfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJZXJyKCJPVjc2NjAgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJcHJfZXJyKCJPVjc2NjAgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTEzNTUsNyArMTM1Nyw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3Y3NjcwX2luaXQpOyBpKyspIHsKIAkJaWYgKGkyY193MShnc3BjYV9kZXYsIG92NzY3MF9pbml0W2ldLnJlZywKIAkJCQlvdjc2NzBfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJZXJyKCJPVjc2NzAgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJcHJfZXJyKCJPVjc2NzAgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTEzNzksMTQgKzEzODEsMTQgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ5djAxMV9pbml0KTsgaSsrKSB7CiAJCQlpZiAoaTJjX3cyKGdzcGNhX2RldiwgbXQ5djAxMV9pbml0W2ldLnJlZywKIAkJCQkJbXQ5djAxMV9pbml0W2ldLnZhbCkgPCAwKSB7Ci0JCQkJZXJyKCJNVDlWMDExIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCQlwcl9lcnIoIk1UOVYwMTEgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9CiAJCX0KIAkJc2QtPmhzdGFydCA9IDI7CiAJCXNkLT52c3RhcnQgPSAyOwogCQlzZC0+c2Vuc29yID0gU0VOU09SX01UOVYwMTE7Ci0JCWluZm8oIk1UOVYwMTEgc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIk1UOVYwMTEgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMzk3LDcgKzEzOTksNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdDl2MTExX2luaXQpOyBpKyspIHsKIAkJCWlmIChpMmNfdzIoZ3NwY2FfZGV2LCBtdDl2MTExX2luaXRbaV0ucmVnLAogCQkJCQltdDl2MTExX2luaXRbaV0udmFsKSA8IDApIHsKLQkJCQllcnIoIk1UOVYxMTEgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJCXByX2VycigiTVQ5VjExMSBzZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCX0KIAkJfQpAQCAtMTQwNyw3ICsxNDA5LDcgQEAKIAkJc2QtPmhzdGFydCA9IDI7CiAJCXNkLT52c3RhcnQgPSAyOwogCQlzZC0+c2Vuc29yID0gU0VOU09SX01UOVYxMTE7Ci0JCWluZm8oIk1UOVYxMTEgc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIk1UOVYxMTEgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNDIyLDE0ICsxNDI0LDE0IEBACiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10OXYxMTJfaW5pdCk7IGkrKykgewogCQkJaWYgKGkyY193Mihnc3BjYV9kZXYsIG10OXYxMTJfaW5pdFtpXS5yZWcsCiAJCQkJCW10OXYxMTJfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJCWVycigiTVQ5VjExMiBzZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCQkJcHJfZXJyKCJNVDlWMTEyIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJCXJldHVybiAtRU5PREVWOwogCQkJfQogCQl9CiAJCXNkLT5oc3RhcnQgPSA2OwogCQlzZC0+dnN0YXJ0ID0gMjsKIAkJc2QtPnNlbnNvciA9IFNFTlNPUl9NVDlWMTEyOwotCQlpbmZvKCJNVDlWMTEyIHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJNVDlWMTEyIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTQ0Myw3ICsxNDQ1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdDltMTEyX2luaXQpOyBpKyspIHsKIAkJaWYgKGkyY193Mihnc3BjYV9kZXYsIG10OW0xMTJfaW5pdFtpXS5yZWcsCiAJCQkJbXQ5bTExMl9pbml0W2ldLnZhbCkgPCAwKSB7Ci0JCQllcnIoIk1UOU0xMTIgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJcHJfZXJyKCJNVDlNMTEyIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0xNDYxLDcgKzE0NjMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10OW0xMTFfaW5pdCk7IGkrKykgewogCQlpZiAoaTJjX3cyKGdzcGNhX2RldiwgbXQ5bTExMV9pbml0W2ldLnJlZywKIAkJCQltdDltMTExX2luaXRbaV0udmFsKSA8IDApIHsKLQkJCWVycigiTVQ5TTExMSBzZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCQlwcl9lcnIoIk1UOU0xMTEgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTE0ODUsMjAgKzE0ODcsMjAgQEAKIAlzd2l0Y2ggKGlkKSB7CiAJY2FzZSAweDg0MTE6CiAJY2FzZSAweDg0MjE6Ci0JCWluZm8oIk1UOU0wMDEgY29sb3Igc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIk1UOU0wMDEgY29sb3Igc2Vuc29yIGRldGVjdGVkXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSAweDg0MzE6Ci0JCWluZm8oIk1UOU0wMDEgbW9ubyBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygiTVQ5TTAwMSBtb25vIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVycigiTm8gTVQ5TTAwMSBjaGlwIGRldGVjdGVkLCBJRCA9ICV4XG4iLCBpZCk7CisJCXByX2VycigiTm8gTVQ5TTAwMSBjaGlwIGRldGVjdGVkLCBJRCA9ICV4XG5cbiIsIGlkKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ5bTAwMV9pbml0KTsgaSsrKSB7CiAJCWlmIChpMmNfdzIoZ3NwY2FfZGV2LCBtdDltMDAxX2luaXRbaV0ucmVnLAogCQkJCW10OW0wMDFfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJZXJyKCJNVDlNMDAxIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCXByX2VycigiTVQ5TTAwMSBzZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQpAQCAtMTUxNyw3ICsxNTE5LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShodjcxMzFyX2luaXQpOyBpKyspIHsKIAkJaWYgKGkyY193MShnc3BjYV9kZXYsIGh2NzEzMXJfaW5pdFtpXS5yZWcsCiAJCQkJaHY3MTMxcl9pbml0W2ldLnZhbCkgPCAwKSB7Ci0JCQllcnIoIkhWNzEzMVIgU2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJcHJfZXJyKCJIVjcxMzFSIFNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0yMTAzLDcgKzIxMDUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJyaWRnZV9pbml0KTsgaSsrKSB7CiAJCXZhbHVlID0gYnJpZGdlX2luaXRbaV1bMV07CiAJCWlmIChyZWdfdyhnc3BjYV9kZXYsIGJyaWRnZV9pbml0W2ldWzBdLCAmdmFsdWUsIDEpIDwgMCkgewotCQkJZXJyKCJEZXZpY2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCQlwcl9lcnIoIkRldmljZSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0yMTE0LDcgKzIxMTYsNyBAQAogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDEwMDYsIDB4MjApOwogCiAJaWYgKHJlZ193KGdzcGNhX2RldiwgMHgxMGMwLCBpMmNfaW5pdCwgOSkgPCAwKSB7Ci0JCWVycigiRGV2aWNlIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQlwcl9lcnIoIkRldmljZSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTIxMjIsMjcgKzIxMjQsMjcgQEAKIAljYXNlIFNFTlNPUl9PVjk2NTA6CiAJCWlmIChvdjk2NTBfaW5pdF9zZW5zb3IoZ3NwY2FfZGV2KSA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJaW5mbygiT1Y5NjUwIHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJPVjk2NTAgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfT1Y5NjU1OgogCQlpZiAob3Y5NjU1X2luaXRfc2Vuc29yKGdzcGNhX2RldikgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWluZm8oIk9WOTY1NSBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygiT1Y5NjU1IHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX1NPSTk2ODoKIAkJaWYgKHNvaTk2OF9pbml0X3NlbnNvcihnc3BjYV9kZXYpIDwgMCkKIAkJCXJldHVybiAtRU5PREVWOwotCQlpbmZvKCJTT0k5Njggc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIlNPSTk2OCBzZW5zb3IgZGV0ZWN0ZWRcbiIpOwogCQlicmVhazsKIAljYXNlIFNFTlNPUl9PVjc2NjA6CiAJCWlmIChvdjc2NjBfaW5pdF9zZW5zb3IoZ3NwY2FfZGV2KSA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJaW5mbygiT1Y3NjYwIHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJPVjc2NjAgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfT1Y3NjcwOgogCQlpZiAob3Y3NjcwX2luaXRfc2Vuc29yKGdzcGNhX2RldikgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWluZm8oIk9WNzY3MCBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygiT1Y3NjcwIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX01UOVZQUkI6CiAJCWlmIChtdDl2X2luaXRfc2Vuc29yKGdzcGNhX2RldikgPCAwKQpAQCAtMjE1MSwxMiArMjE1MywxMiBAQAogCWNhc2UgU0VOU09SX01UOU0xMTE6CiAJCWlmIChtdDltMTExX2luaXRfc2Vuc29yKGdzcGNhX2RldikgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWluZm8oIk1UOU0xMTEgc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIk1UOU0xMTEgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfTVQ5TTExMjoKIAkJaWYgKG10OW0xMTJfaW5pdF9zZW5zb3IoZ3NwY2FfZGV2KSA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJaW5mbygiTVQ5TTExMiBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygiTVQ5TTExMiBzZW5zb3IgZGV0ZWN0ZWRcbiIpOwogCQlicmVhazsKIAljYXNlIFNFTlNPUl9NVDlNMDAxOgogCQlpZiAobXQ5bTAwMV9pbml0X3NlbnNvcihnc3BjYV9kZXYpIDwgMCkKQEAgLTIxNjUsMTAgKzIxNjcsMTAgQEAKIAljYXNlIFNFTlNPUl9IVjcxMzFSOgogCQlpZiAoaHY3MTMxcl9pbml0X3NlbnNvcihnc3BjYV9kZXYpIDwgMCkKIAkJCXJldHVybiAtRU5PREVWOwotCQlpbmZvKCJIVjcxMzFSIHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJIVjcxMzFSIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWluZm8oIlVuc3VwcG9ydGVkIFNlbnNvciIpOworCQlwcl9pbmZvKCJVbnN1cHBvcnRlZCBTZW5zb3JcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTIyNjMsMTkgKzIyNjUsMTkgQEAKIAlzd2l0Y2ggKG1vZGUgJiBTQ0FMRV9NQVNLKSB7CiAJY2FzZSBTQ0FMRV8xMjgweDEwMjQ6CiAJCXNjYWxlID0gMHhjMDsKLQkJaW5mbygiU2V0IDEyODB4MTAyNCIpOworCQlwcl9pbmZvKCJTZXQgMTI4MHgxMDI0XG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBTQ0FMRV82NDB4NDgwOgogCQlzY2FsZSA9IDB4ODA7Ci0JCWluZm8oIlNldCA2NDB4NDgwIik7CisJCXByX2luZm8oIlNldCA2NDB4NDgwXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBTQ0FMRV8zMjB4MjQwOgogCQlzY2FsZSA9IDB4OTA7Ci0JCWluZm8oIlNldCAzMjB4MjQwIik7CisJCXByX2luZm8oIlNldCAzMjB4MjQwXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBTQ0FMRV8xNjB4MTIwOgogCQlzY2FsZSA9IDB4YTA7Ci0JCWluZm8oIlNldCAxNjB4MTIwIik7CisJCXByX2luZm8oIlNldCAxNjB4MTIwXG4iKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNTEzLDcgKzI1MTUsNyBAQAogCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MjhmKSwgU045QzIwWChPVjk2NTAsIDB4MzAsIDApfSwKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjJhMCksIFNOOUMyMFgoT1Y3NjcwLCAweDIxLCAwKX0sCiAJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYyYjApLCBTTjlDMjBYKE1UOVZQUkIsIDB4MDAsIDApfSwKLQl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjJiMyksIFNOOUMyMFgoT1Y5NjU1LCAweDMwLCAwKX0sCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYyYjMpLCBTTjlDMjBYKE9WOTY1NSwgMHgzMCwgTEVEX1JFVkVSU0UpfSwKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjJiYiksIFNOOUMyMFgoT1Y3NjYwLCAweDIxLCBMRURfUkVWRVJTRSl9LAogCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MmJjKSwgU045QzIwWChIVjcxMzFSLCAweDExLCAwKX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDVlLCAweDAwZjQpLCBTTjlDMjBYKE9WOTY1MCwgMHgzMCwgMCl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMKaW5kZXggYzQ3N2FkMS4uYzc0NmJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFNvbml4IHNuOWMxMDJwIHNuOWMxMDUgc245YzEyMCAoanBlZykgc3ViZHJpdmVyCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgSmVhbi1GcmFuw6dvaXMgTW9pbmUgPGh0dHA6Ly9tb2luZWpmLmZyZWUuZnI+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBKZWFuLUZyYW7Dp29pcyBNb2luZSA8aHR0cDovL21vaW5lamYuZnJlZS5mcj4KICAqIENvcHlyaWdodCAoQykgMjAwNSBNaWNoZWwgWGhhYXJkIG14aGFhcmRAbWFnaWMuZnIKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMTksNiArMTksOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInNvbml4aiIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0xMzYsNyArMTM4LDcgQEAKIHN0YXRpYyB2b2lkIHNldGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjdHJsIHNkX2N0cmxzW05DVFJMU10gPSB7Ci1bQlJJR0hUTkVTU10gPSAgeworW0JSSUdIVE5FU1NdID0gewogCSAgICB7CiAJCS5pZCAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKIAkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApAQCAtMTU3LDcgKzE1OSw3IEBACiAjZGVmaW5lIENPTlRSQVNUX01BWCAxMjcKIAkJLm1heGltdW0gPSBDT05UUkFTVF9NQVgsCiAJCS5zdGVwICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSA2MywKKwkJLmRlZmF1bHRfdmFsdWUgPSAyMCwKIAkgICAgfSwKIAkgICAgLnNldF9jb250cm9sID0gc2V0Y29udHJhc3QKIAl9LApAQCAtNzM3LDcgKzczOSw3IEBACiAJezB4ZDEsIDB4NWQsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXsweGQxLCAweDVkLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7MHhkMSwgMHg1ZCwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgxMH0sCi0JezB4ZDEsIDB4NWQsIDB4MmYsIDB4ZjcsIDB4QjAsIDB4MDAsIDB4MDQsIDB4MTB9LAorCXsweGQxLCAweDVkLCAweDJmLCAweGY3LCAweGIwLCAweDAwLCAweDA0LCAweDEwfSwKIAl7MHhkMSwgMHg1ZCwgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4ZDEsIDB4NWQsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MTB9LAogCXsweGIxLCAweDVkLCAweDNkLCAweDA2LCAweDhmLCAweDAwLCAweDAwLCAweDEwfSwKQEAgLTEyNzcsNyArMTI3OSw3IEBACiAJCQkvKiBnbG9iYWwgZ2FpbiA/IDogMDcgLSBjaGFuZ2Ugd2l0aCAweDE1IGF0IHRoZSBlbmQgKi8KIAl7MHhhMSwgMHgyMSwgMHgxMCwgMHgzZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIC8qID8/Pz8gOiAwNjNmICovCiAJezB4YTEsIDB4MjEsIDB4MDQsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAotCXsweGIxLCAweDIxLCAweDJkLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDEwfSwKKwl7MHhiMSwgMHgyMSwgMHgyZCwgMHg2MywgMHgwMywgMHgwMCwgMHgwMCwgMHgxMH0sCiAJCQkvKiBleHBvc3VyZSA/IDogMDIwMCAtIGNoYW5nZSB3aXRoIDB4MWUgYXQgdGhlIGVuZCAqLwogCXt9CiB9OwpAQCAtMTM5NSw3ICsxMzk3LDcgQEAKIAkJcmV0dXJuOwogI2lmZGVmIEdTUENBX0RFQlVHCiAJaWYgKGxlbiA+IFVTQl9CVUZfU1opIHsKLQkJZXJyKCJyZWdfcjogYnVmZmVyIG92ZXJmbG93Iik7CisJCXByX2VycigicmVnX3I6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAJCXJldHVybjsKIAl9CiAjZW5kaWYKQEAgLTE0MDgsNyArMTQxMCw3IEBACiAJCQk1MDApOwogCVBERUJVRyhEX1VTQkksICJyZWdfciBbJTAyeF0gLT4gJTAyeCIsIHZhbHVlLCBnc3BjYV9kZXYtPnVzYl9idWZbMF0pOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3IgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfciBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0xNDMyLDcgKzE0MzQsNyBAQAogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193MSBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193MSBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0xNDQ5LDcgKzE0NTEsNyBAQAogCQl2YWx1ZSwgYnVmZmVyWzBdLCBidWZmZXJbMV0pOwogI2lmZGVmIEdTUENBX0RFQlVHCiAJaWYgKGxlbiA+IFVTQl9CVUZfU1opIHsKLQkJZXJyKCJyZWdfdzogYnVmZmVyIG92ZXJmbG93Iik7CisJCXByX2VycigicmVnX3c6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAJCXJldHVybjsKIAl9CiAjZW5kaWYKQEAgLTE0NjIsNyArMTQ2NCw3IEBACiAJCQlnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTE1MDIsNyArMTUwNCw3IEBACiAJCQlnc3BjYV9kZXYtPnVzYl9idWYsIDgsCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiaTJjX3cxIGVyciAlZCIsIHJldCk7CisJCXByX2VycigiaTJjX3cxIGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTE1MjcsNyArMTUyOSw3IEBACiAJCQk1MDApOwogCW1zbGVlcCgyKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoImkyY193OCBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoImkyY193OCBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0xNTkxLDcgKzE1OTMsNyBAQAogCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBIVjcxMzFSIGZvdW5kIik7CiAJCXJldHVybjsKIAl9Ci0Jd2FybigiRXJyb25lb3VzIEhWNzEzMVIgSUQgMHglMDJ4IDB4JTAyeCAweCUwMngiLAorCXByX3dhcm4oIkVycm9uZW91cyBIVjcxMzFSIElEIDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAogCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0sIGdzcGNhX2Rldi0+dXNiX2J1ZlsxXSwKIAkJZ3NwY2FfZGV2LT51c2JfYnVmWzJdKTsKIH0KQEAgLTE3MTAsNyArMTcxMiw3IEBACiAJCXNkLT5zZW5zb3IgPSBTRU5TT1JfUE8xMDMwOwogCQlyZXR1cm47CiAJfQotCWVycigiVW5rbm93biBzZW5zb3IgJTA0eCIsIHZhbCk7CisJcHJfZXJyKCJVbmtub3duIHNlbnNvciAlMDR4XG4iLCB2YWwpOwogfQogCiAvKiAwYzQ1OjYxNDIgc2Vuc29yIG1heSBiZSBwbzIwMzBuLCBnYzAzMDUgb3IgZ2MwMzA3ICovCkBAIC0xNzQ4LDcgKzE3NTAsNyBAQAogCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBwbzIwMzBuIik7CiAvKgkJc2QtPnNlbnNvciA9IFNFTlNPUl9QTzIwMzBOOyAqLwogCX0gZWxzZSB7Ci0JCWVycigiVW5rbm93biBzZW5zb3IgSUQgJTA0eCIsIHZhbCk7CisJCXByX2VycigiVW5rbm93biBzZW5zb3IgSUQgJTA0eFxuIiwgdmFsKTsKIAl9CiB9CiAKQEAgLTIwMDYsOCArMjAwOCw3IEBACiAJY2FzZSBTRU5TT1JfT002ODAyOgogCQlleHBvID0gYnJpZ2h0bmVzcyA8PCAyOwogCQlzZC0+ZXhwb3N1cmUgPSBzZXRleHBvc3VyZShnc3BjYV9kZXYsIGV4cG8pOwotCQlrMiA9IGJyaWdodG5lc3MgPj4gMzsKLQkJYnJlYWs7CisJCXJldHVybjsJCQkvKiBZIG9mZnNldCBhbHJlYWR5IHNldCAqLwogCX0KIAogCXJlZ193MShnc3BjYV9kZXYsIDB4OTYsIGsyKTsJLyogY29sb3IgbWF0cml4IFkgb2Zmc2V0ICovCkBAIC0yMDE5LDEzICsyMDIwLDEzIEBACiAJdTggazI7CiAJdTggY29udHJhc3RbNl07CiAKLQlrMiA9IHNkLT5jdHJsc1tDT05UUkFTVF0udmFsICogMHgzMCAvIChDT05UUkFTVF9NQVggKyAxKQotCQkJCSsgMHgxMDsJCS8qIDEwLi40MCAqLworCWsyID0gc2QtPmN0cmxzW0NPTlRSQVNUXS52YWwgKiAzNyAvIChDT05UUkFTVF9NQVggKyAxKQorCQkJCSsgMzc7CQkvKiAzNy4uNzMgKi8KIAljb250cmFzdFswXSA9IChrMiArIDEpIC8gMjsJCS8qIHJlZCAqLwogCWNvbnRyYXN0WzFdID0gMDsKIAljb250cmFzdFsyXSA9IGsyOwkJCS8qIGdyZWVuICovCiAJY29udHJhc3RbM10gPSAwOwotCWNvbnRyYXN0WzRdID0gKGsyICsgMSkgLyA1OwkJLyogYmx1ZSAqLworCWNvbnRyYXN0WzRdID0gazIgLyA1OwkJCS8qIGJsdWUgKi8KIAljb250cmFzdFs1XSA9IDA7CiAJcmVnX3coZ3NwY2FfZGV2LCAweDg0LCBjb250cmFzdCwgc2l6ZW9mIGNvbnRyYXN0KTsKIH0KQEAgLTI1MDcsOSArMjUwOCw3IEBACiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX0hWNzEzMVI6CiAJY2FzZSBTRU5TT1JfTUkwMzYwOgotCQlpZiAobW9kZSkKLQkJCXJlZzAxIHw9IFNZU19TRUxfNDhNOwkvKiAzMjB4MjQwOiBjbGsgNDhNaHogKi8KLQkJZWxzZQorCQlpZiAoIW1vZGUpCiAJCQlyZWcwMSAmPSB+U1lTX1NFTF80OE07CS8qIDY0MHg0ODA6IGNsayAyNE1oeiAqLwogCQlyZWcxNyAmPSB+TUNLX1NJWkVfTUFTSzsKIAkJcmVnMTcgfD0gMHgwMTsJCQkvKiBjbG9jayAvIDEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTE1MjguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTE1MjguYwppbmRleCA3NmMwMDZiLi42OTU2NzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2ExNTI4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhMTUyOC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIHNwY2ExNTI4IHN1YmRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBKZWFuLUZyYW5jb2lzIE1vaW5lIChodHRwOi8vbW9pbmVqZi5mcmVlLmZyKQorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSmVhbi1GcmFuY29pcyBNb2luZSAoaHR0cDovL21vaW5lamYuZnJlZS5mcikKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzcGNhMTUyOCIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0xNzEsNyArMTczLDcgQEAKIAlQREVCVUcoRF9VU0JJLCAiR0VUICUwMnggMDAwMCAlMDR4ICUwMngiLCByZXEsIGluZGV4LAogCQkJIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfciBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ19yIGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTE5Myw3ICsxOTUsNyBAQAogCQkJdmFsdWUsIGluZGV4LAogCQkJTlVMTCwgMCwgNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193IGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3cgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMjE3LDIxICsyMTksMjMgQEAKIAkJCXZhbHVlLCBpbmRleCwKIAkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwgNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193IGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3cgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQogCiBzdGF0aWMgdm9pZCB3YWl0X3N0YXR1c18wKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKLQlpbnQgaTsKKwlpbnQgaSwgdzsKIAotCWkgPSAyMDsKKwlpID0gMTY7CisJdyA9IDA7CiAJZG8gewogCQlyZWdfcihnc3BjYV9kZXYsIDB4MjEsIDB4MDAwMCwgMSk7CiAJCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbMF0gPT0gMCkKIAkJCXJldHVybjsKLQkJbXNsZWVwKDMwKTsKKwkJdyArPSAxNTsKKwkJbXNsZWVwKHcpOwogCX0gd2hpbGUgKC0taSA+IDApOwogCVBERUJVRyhEX0VSUiwgIndhaXRfc3RhdHVzXzAgdGltZW91dCIpOwogCWdzcGNhX2Rldi0+dXNiX2VyciA9IC1FVElNRTsKQEAgLTMwNyw4ICszMTEsNiBAQAogCXNkLT5jb2xvciA9IENPTE9SX0RFRjsKIAlzZC0+c2hhcnBuZXNzID0gU0hBUlBORVNTX0RFRjsKIAotCWdzcGNhX2Rldi0+bmJhbHQgPSA0OwkJLyogdXNlIGFsdGVybmF0ZSBzZXR0aW5nIDMgKi8KLQogCXJldHVybiAwOwogfQogCkBAIC0zNDcsOCArMzQ5LDEyIEBACiAJbW9kZSA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OwogCXJlZ193Yihnc3BjYV9kZXYsIDB4MjUsIDB4MDAwMCwgMHgwMDA0LCBtb2RlKTsKIAlyZWdfcihnc3BjYV9kZXYsIDB4MjUsIDB4MDAwNCwgMSk7Ci0JcmVnX3diKGdzcGNhX2RldiwgMHgyNywgMHgwMDAwLCAweDAwMDAsIDB4MDYpOworCXJlZ193Yihnc3BjYV9kZXYsIDB4MjcsIDB4MDAwMCwgMHgwMDAwLCAweDA2KTsJLyogNDIwICovCiAJcmVnX3IoZ3NwY2FfZGV2LCAweDI3LCAweDAwMDAsIDEpOworCisvKiBub3QgdXNlZnVsLi4KKwlnc3BjYV9kZXYtPmFsdCA9IDQ7CQkqIHVzZSBhbHRlcm5hdGUgc2V0dGluZyAzICovCisKIAlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwogfQogCkBAIC0zNjEsOCArMzY3LDggQEAKIAlqcGVnX2RlZmluZShzZC0+anBlZ19oZHIsIGdzcGNhX2Rldi0+aGVpZ2h0LCBnc3BjYV9kZXYtPndpZHRoLAogCQkJMHgyMik7CQkvKiBKUEVHIDQxMSAqLwogCi0JLyogdGhlIEpQRUcgcXVhbGl0eSBzZWVtcyB0byBiZSA4MiUgKi8KLQlqcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgODIpOworCS8qIHRoZSBKUEVHIHF1YWxpdHkgc2hhbGwgYmUgODUlICovCisJanBlZ19zZXRfcXVhbChzZC0+anBlZ19oZHIsIDg1KTsKIAogCS8qIHNldCB0aGUgY29udHJvbHMgKi8KIAlzZXRicmlnaHRuZXNzKGdzcGNhX2Rldik7CkBAIC0zNzcsNyArMzgzLDcgQEAKIAogCS8qIHN0YXJ0IHRoZSBjYXB0dXJlICovCiAJd2FpdF9zdGF0dXNfMChnc3BjYV9kZXYpOwotCXJlZ193KGdzcGNhX2RldiwgMHgzMSwgMHgwMDAwLCAweDAwMDQpOworCXJlZ193KGdzcGNhX2RldiwgMHgzMSwgMHgwMDAwLCAweDAwMDQpOwkvKiBzdGFydCByZXF1ZXN0ICovCiAJd2FpdF9zdGF0dXNfMShnc3BjYV9kZXYpOwogCXdhaXRfc3RhdHVzXzAoZ3NwY2FfZGV2KTsKIAltc2xlZXAoMjAwKTsKQEAgLTM5MCw3ICszOTYsNyBAQAogewogCS8qIHN0b3AgdGhlIGNhcHR1cmUgKi8KIAl3YWl0X3N0YXR1c18wKGdzcGNhX2Rldik7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDMxLCAweDAwMDAsIDB4MDAwMCk7CisJcmVnX3coZ3NwY2FfZGV2LCAweDMxLCAweDAwMDAsIDB4MDAwMCk7CS8qIHN0b3AgcmVxdWVzdCAqLwogCXdhaXRfc3RhdHVzXzEoZ3NwY2FfZGV2KTsKIAl3YWl0X3N0YXR1c18wKGdzcGNhX2Rldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jCmluZGV4IDNlNzY5NTEuLmJiODJjOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3BjYTUwMCIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0zOTYsNyArMzk4LDcgQEAKIAkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCXZhbHVlLCBpbmRleCwgTlVMTCwgMCwgNTAwKTsKIAlpZiAocmV0IDwgMCkKLQkJZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQxOCw3ICs0MjAsNyBAQAogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW5ndGgsCiAJCQk1MDApOwkJLyogdGltZW91dCAqLwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3JfMTIgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfcl8xMiBlcnIgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldHVybiAoZ3NwY2FfZGV2LT51c2JfYnVmWzFdIDw8IDgpICsgZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDEuYwppbmRleCBmN2VmMjgyLi43YWFhYzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDEuYwpAQCAtMTksNiArMTksOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInNwY2E1MDEiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMTg1Miw3ICsxODU0LDcgQEAKIAlQREVCVUcoRF9VU0JPLCAicmVnIHdyaXRlOiAweCUwMnggMHglMDJ4IDB4JTAyeCIsCiAJCXJlcSwgaW5kZXgsIHZhbHVlKTsKIAlpZiAocmV0IDwgMCkKLQkJZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA1LmMKaW5kZXggZTViZjg2NS4uMTY3MjJkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA1LmMKQEAgLTE5LDYgKzE5LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzcGNhNTA1IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTU3OCw3ICs1ODAsNyBAQAogCVBERUJVRyhEX1VTQk8sICJyZWcgd3JpdGU6IDB4JTAyeCwweCUwMng6MHglMDJ4LCAlZCIsCiAJCXJlcSwgaW5kZXgsIHZhbHVlLCByZXQpOwogCWlmIChyZXQgPCAwKQotCQllcnIoInJlZyB3cml0ZTogZXJyb3IgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZyB3cml0ZTogZXJyb3IgJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjg1LDggKzY4Nyw4IEBACiAJCXJldHVybiByZXQ7CiAJfQogCWlmIChyZXQgIT0gMHgwMTAxKSB7Ci0JCWVycigiQWZ0ZXIgdmVjdG9yIHJlYWQgcmV0dXJucyAweCUwNHggc2hvdWxkIGJlIDB4MDEwMSIsCi0JCQlyZXQpOworCQlwcl9lcnIoIkFmdGVyIHZlY3RvciByZWFkIHJldHVybnMgMHglMDR4IHNob3VsZCBiZSAweDAxMDFcbiIsCisJCSAgICAgICByZXQpOwogCX0KIAogCXJldCA9IHJlZ193cml0ZShnc3BjYV9kZXYtPmRldiwgMHgwNiwgMHgxNiwgMHgwYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwOC5jCmluZGV4IDlkMGI0NjAuLmE0NGZlM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwOC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwOC5jCkBAIC0xOCw2ICsxOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3BjYTUwOCIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0xMjc1LDcgKzEyNzcsNyBAQAogCVBERUJVRyhEX1VTQk8sICJyZWcgd3JpdGUgaToweCUwNHggPSAweCUwMngiLAogCQlpbmRleCwgdmFsdWUpOwogCWlmIChyZXQgPCAwKQotCQllcnIoInJlZyB3cml0ZTogZXJyb3IgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZyB3cml0ZTogZXJyb3IgJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTI5Nyw3ICsxMjk5LDcgQEAKIAlQREVCVUcoRF9VU0JJLCAicmVnIHJlYWQgaTolMDR4IC0tPiAlMDJ4IiwKIAkJaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfcmVhZCBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ19yZWFkIGVyciAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTU2MS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTYxLmMKaW5kZXggZTgzNmU3Ny4uYzgyZmQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTYxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTYxLmMKQEAgLTIwLDYgKzIwLDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzcGNhNTYxIgogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KQEAgLTMxNSw3ICszMTcsNyBAQAogCQkJICAgICAgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCA1MDApOwogCVBERUJVRyhEX1VTQk8sICJyZWcgd3JpdGU6IDB4JTAyeDoweCUwMngiLCBpbmRleCwgdmFsdWUpOwogCWlmIChyZXQgPCAwKQotCQllcnIoInJlZyB3cml0ZTogZXJyb3IgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZyB3cml0ZTogZXJyb3IgJWRcbiIsIHJldCk7CiB9CiAKIHN0YXRpYyB2b2lkIHdyaXRlX3ZlY3RvcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTA1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTA1LmMKaW5kZXggNWJhOTZhZi4uZGY4MDVmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkwNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MDUuYwpAQCAtMzMsNiArMzMsOCBAQAogICogZHJpdmVycy4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInNxOTA1IgogCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CkBAIC0xMjMsOCArMTI1LDcgQEAKIAkJCSAgICAgIFNROTA1X0NPTU1BTkQsIGluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsCiAJCQkgICAgICBTUTkwNV9DTURfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCIlczogdXNiX2NvbnRyb2xfbXNnIGZhaWxlZCAoJWQpIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQlwcl9lcnIoIiVzOiB1c2JfY29udHJvbF9tc2cgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTM1LDggKzEzNiw3IEBACiAJCQkgICAgICBTUTkwNV9QSU5HLCAwLCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsCiAJCQkgICAgICBTUTkwNV9DTURfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCIlczogdXNiX2NvbnRyb2xfbXNnIGZhaWxlZCAyICglZCkiLAotCQkJX19mdW5jX18sIHJldCk7CisJCXByX2VycigiJXM6IHVzYl9jb250cm9sX21zZyBmYWlsZWQgMiAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQkJICAgICAgU1E5MDVfUkVBRF9ET05FLCAwLCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsCiAJCQkgICAgICBTUTkwNV9DTURfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCIlczogdXNiX2NvbnRyb2xfbXNnIGZhaWxlZCAoJWQpIiwgX19mdW5jX18sIHJldCk7CisJCXByX2VycigiJXM6IHVzYl9jb250cm9sX21zZyBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xODYsNyArMTg2LDcgQEAKIAlpZiAobmVlZF9sb2NrKQogCQltdXRleF91bmxvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiJXM6IHVzYl9jb250cm9sX21zZyBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCByZXQpOworCQlwcl9lcnIoIiVzOiB1c2JfY29udHJvbF9tc2cgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXQgPSB1c2JfYnVsa19tc2coZ3NwY2FfZGV2LT5kZXYsCkBAIC0xOTUsOCArMTk1LDcgQEAKIAogCS8qIHN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgMCwgb3RoZXJ3aXNlICBuZWdhdGl2ZSAqLwogCWlmIChyZXQgPCAwIHx8IGFjdF9sZW4gIT0gc2l6ZSkgewotCQllcnIoImJ1bGsgcmVhZCBmYWlsICglZCkgbGVuICVkLyVkIiwKLQkJCXJldCwgYWN0X2xlbiwgc2l6ZSk7CisJCXByX2VycigiYnVsayByZWFkIGZhaWwgKCVkKSBsZW4gJWQvJWRcbiIsIHJldCwgYWN0X2xlbiwgc2l6ZSk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTIyNiw3ICsyMjUsNyBAQAogCiAJYnVmZmVyID0ga21hbGxvYyhTUTkwNV9NQVhfVFJBTlNGRVIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlpZiAoIWJ1ZmZlcikgewotCQllcnIoIkNvdWxkbid0IGFsbG9jYXRlIFVTQiBidWZmZXIiKTsKKwkJcHJfZXJyKCJDb3VsZG4ndCBhbGxvY2F0ZSBVU0IgYnVmZmVyXG4iKTsKIAkJZ290byBxdWl0X3N0cmVhbTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MDVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTA1Yy5jCmluZGV4IDQ1NzU2M2IuLmMyYzA1NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MDVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkwNWMuYwpAQCAtMjcsNiArMjcsOCBAQAogICogYW5kIG1heSBjb250YWluIGNvZGUgZnJhZ21lbnRzIGZyb20gaXQuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzcTkwNWMiCiAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KQEAgLTk1LDggKzk3LDcgQEAKIAkJCSAgICAgIGNvbW1hbmQsIGluZGV4LCBOVUxMLCAwLAogCQkJICAgICAgU1E5MDVDX0NNRF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoIiVzOiB1c2JfY29udHJvbF9tc2cgZmFpbGVkICglZCkiLAotCQkJX19mdW5jX18sIHJldCk7CisJCXByX2VycigiJXM6IHVzYl9jb250cm9sX21zZyBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xMTUsOCArMTE2LDcgQEAKIAkJCSAgICAgIGNvbW1hbmQsIGluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIHNpemUsCiAJCQkgICAgICBTUTkwNUNfQ01EX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiJXM6IHVzYl9jb250cm9sX21zZyBmYWlsZWQgKCVkKSIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJcHJfZXJyKCIlczogdXNiX2NvbnRyb2xfbXNnIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiAJYnVmZmVyID0ga21hbGxvYyhTUTkwNUNfTUFYX1RSQU5TRkVSLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJaWYgKCFidWZmZXIpIHsKLQkJZXJyKCJDb3VsZG4ndCBhbGxvY2F0ZSBVU0IgYnVmZmVyIik7CisJCXByX2VycigiQ291bGRuJ3QgYWxsb2NhdGUgVVNCIGJ1ZmZlclxuIik7CiAJCWdvdG8gcXVpdF9zdHJlYW07CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTMweC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkzMHguYwppbmRleCA4MjE1ZDVkLi5lNDI1NWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTMweC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MzB4LmMKQEAgLTIwLDYgKzIwLDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzcTkzMHgiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtNDY4LDcgKzQ3MCw3IEBACiAJCQl2YWx1ZSwgMCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3IgJTA0eCBmYWlsZWQgJWQiLCB2YWx1ZSwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfciAlMDR4IGZhaWxlZCAlZFxuIiwgdmFsdWUsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC00ODgsNyArNDkwLDcgQEAKIAkJCTUwMCk7CiAJbXNsZWVwKDMwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193ICUwNHggJTA0eCBmYWlsZWQgJWQiLCB2YWx1ZSwgaW5kZXgsIHJldCk7CisJCXByX2VycigicmVnX3cgJTA0eCAlMDR4IGZhaWxlZCAlZFxuIiwgdmFsdWUsIGluZGV4LCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtNTExLDcgKzUxMyw3IEBACiAJCQkxMDAwKTsKIAltc2xlZXAoMzApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3diICUwNHggJTA0eCBmYWlsZWQgJWQiLCB2YWx1ZSwgaW5kZXgsIHJldCk7CisJCXByX2VycigicmVnX3diICUwNHggJTA0eCBmYWlsZWQgJWRcbiIsIHZhbHVlLCBpbmRleCwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTU1Niw3ICs1NTgsNyBAQAogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCBidWYgLSBnc3BjYV9kZXYtPnVzYl9idWYsCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiaTJjX3dyaXRlIGZhaWxlZCAlZCIsIHJldCk7CisJCXByX2VycigiaTJjX3dyaXRlIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTU3NSw3ICs1NzcsNyBAQAogCiAjaWZkZWYgR1NQQ0FfREVCVUcKIAlpZiAoKGJhdGNoc2l6ZSAtIDEpICogMyA+IFVTQl9CVUZfU1opIHsKLQkJZXJyKCJCdWc6IHVzYl9idWYgb3ZlcmZsb3ciKTsKKwkJcHJfZXJyKCJCdWc6IHVzYl9idWYgb3ZlcmZsb3dcbiIpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRU5PTUVNOwogCQlyZXR1cm47CiAJfQpAQCAtNjEyLDcgKzYxNCw3IEBACiAJCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCBidWYgLSBnc3BjYV9kZXYtPnVzYl9idWYsCiAJCQkJNTAwKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWVycigidWNidXNfd3JpdGUgZmFpbGVkICVkIiwgcmV0KTsKKwkJCXByX2VycigidWNidXNfd3JpdGUgZmFpbGVkICVkXG4iLCByZXQpOwogCQkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCQkJcmV0dXJuOwogCQl9CkBAIC02ODgsNyArNjkwLDcgQEAKIAkJCWJyZWFrOwogCX0KIAlpZiAoaSA+PSBBUlJBWV9TSVpFKHByb2JlX29yZGVyKSkgewotCQllcnIoIlVua25vd24gc2Vuc29yIik7CisJCXByX2VycigiVW5rbm93biBzZW5zb3JcbiIpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRUlOVkFMOwogCQlyZXR1cm47CiAJfQpAQCAtNjk2LDcgKzY5OCw4IEBACiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJY2FzZSBTRU5TT1JfT1Y3NjYwOgogCWNhc2UgU0VOU09SX09WOTYzMDoKLQkJZXJyKCJTZW5zb3IgJXMgbm90IHlldCB0cmVhdGVkIiwgc2Vuc29yX3RiW3NkLT5zZW5zb3JdLm5hbWUpOworCQlwcl9lcnIoIlNlbnNvciAlcyBub3QgeWV0IHRyZWF0ZWRcbiIsCisJCSAgICAgICBzZW5zb3JfdGJbc2QtPnNlbnNvcl0ubmFtZSk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KQEAgLTEwOTEsNyArMTA5NCw3IEBACiAJZ3NwY2FfZGV2LT5jYW0uYnVsa19udXJicyA9IDE7CiAJcmV0ID0gdXNiX3N1Ym1pdF91cmIoZ3NwY2FfZGV2LT51cmJbMF0sIEdGUF9BVE9NSUMpOwogCWlmIChyZXQgPCAwKQotCQllcnIoInNkX2RxX2NhbGxiYWNrKCkgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJzZF9kcV9jYWxsYmFjaygpIGVyciAlZFxuIiwgcmV0KTsKIAogCS8qIHdhaXQgYSBsaXR0bGUgdGltZSwgb3RoZXJ3aXNlIHRoZSB3ZWJjYW0gY3Jhc2hlcyAqLwogCW1zbGVlcCgxMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3RrMDE0LmMKaW5kZXggNzYzNzQ3Ny4uNDJhN2EyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0azAxNC5jCkBAIC0xOCw2ICsxOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3RrMDE0IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTEzNyw3ICsxMzksNyBAQAogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ19yIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3IgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJCXJldHVybiAwOwogCX0KQEAgLTE2Miw3ICsxNjQsNyBAQAogCQkJMCwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTE5Miw3ICsxOTQsNyBAQAogCQkJJmFsZW4sCiAJCQk1MDApOwkJLyogdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJjdl92YWwgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyY3ZfdmFsIGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTIzNSw3ICsyMzcsNyBAQAogCQkJJmFsZW4sCiAJCQk1MDApOwkvKiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigic25kX3ZhbCBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInNuZF92YWwgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfSBlbHNlIHsKIAkJaWYgKGFkcyA9PSAweDAwM2YwOCkgewpAQCAtMzE1LDcgKzMxNyw3IEBACiAJcmV0ID0gcmVnX3IoZ3NwY2FfZGV2LCAweDA3NDApOwogCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPj0gMCkgewogCQlpZiAocmV0ICE9IDB4ZmYpIHsKLQkJCWVycigiaW5pdCByZWc6IDB4JTAyeCIsIHJldCk7CisJCQlwcl9lcnIoImluaXQgcmVnOiAweCUwMnhcbiIsIHJldCk7CiAJCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRUlPOwogCQl9CiAJfQpAQCAtMzQ5LDggKzM1MSw4IEBACiAJCQkJCWdzcGNhX2Rldi0+aWZhY2UsCiAJCQkJCWdzcGNhX2Rldi0+YWx0KTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInNldCBpbnRmICVkICVkIGZhaWxlZCIsCi0JCQlnc3BjYV9kZXYtPmlmYWNlLCBnc3BjYV9kZXYtPmFsdCk7CisJCXByX2Vycigic2V0IGludGYgJWQgJWQgZmFpbGVkXG4iLAorCQkgICAgICAgZ3NwY2FfZGV2LT5pZmFjZSwgZ3NwY2FfZGV2LT5hbHQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDY4MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNjgwLmMKaW5kZXggZTJlZjQxYy4uNGRjYzdlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNjgwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNjgwLmMKQEAgLTI3LDYgKzI3LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzdHYwNjgwIgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTc5LDcgKzgxLDcgQEAKIAkJCSAgICAgIHZhbCwgMCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBzaXplLCA1MDApOwogCiAJaWYgKChyZXQgPCAwKSAmJiAocmVxICE9IDB4MGEpKQotCQllcnIoInVzYl9jb250cm9sX21zZyBlcnJvciAlaSwgcmVxdWVzdCA9IDB4JXgsIGVycm9yID0gJWkiLAorCQlwcl9lcnIoInVzYl9jb250cm9sX21zZyBlcnJvciAlaSwgcmVxdWVzdCA9IDB4JXgsIGVycm9yID0gJWlcbiIsCiAJCSAgICAgICBzZXQsIHJlcSwgcmV0KTsKIAogCXJldHVybiByZXQ7CkBAIC0yMzYsNyArMjM4LDcgQEAKIAogCWlmIChzdHZfc25kY3RybChnc3BjYV9kZXYsIDIsIDB4MDYsIDB4MDEwMCwgMHgxMikgIT0gMHgxMiB8fAogCSAgICBnc3BjYV9kZXYtPnVzYl9idWZbOF0gIT0gMHg1MyB8fCBnc3BjYV9kZXYtPnVzYl9idWZbOV0gIT0gMHgwNSkgewotCQllcnIoIkNvdWxkIG5vdCBnZXQgZGVzY3JpcHRvciAwMTAwLiIpOworCQlwcl9lcnIoIkNvdWxkIG5vdCBnZXQgZGVzY3JpcHRvciAwMTAwXG4iKTsKIAkJcmV0dXJuIHN0djA2ODBfaGFuZGxlX2Vycm9yKGdzcGNhX2RldiwgLUVJTyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvTWFrZWZpbGUKaW5kZXggMmYzYzNhNi4uNWIzMThmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9NYWtlZmlsZQpAQCAtNiw1ICs2LDUgQEAKIAkJICAgICAgc3R2MDZ4eF9wYjAxMDAubyBcCiAJCSAgICAgIHN0djA2eHhfc3Q2NDIyLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguYwppbmRleCBhYmYxNjU4Li5iMWZjYTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmMKQEAgLTI3LDYgKzI3LDggQEAKICAqIFAvTiA4NjEwNDAtMDAwMDogU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MTAgICAtIFF1aWNrQ2FtIFdlYgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSAic3R2MDZ4eF9zZW5zb3IuaCIKIApAQCAtMTg5LDcgKzE5MSw3IEBACiAJCQkgICAgICAweDA0LCAweDQwLCAweDE0MDAsIDAsIGJ1ZiwgSTJDX0JVRkZFUl9MRU5HVEgsCiAJCQkgICAgICBTVFYwNlhYX1VSQl9NU0dfVElNRU9VVCk7CiAJaWYgKGVyciA8IDApIHsKLQkJZXJyKCJJMkM6IFJlYWQgZXJyb3Igd3JpdGluZyBhZGRyZXNzOiAlZCIsIGVycik7CisJCXByX2VycigiSTJDOiBSZWFkIGVycm9yIHdyaXRpbmcgYWRkcmVzczogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0yMTMsMTQgKzIxNSwxNCBAQAogCWludCBpOwogCXU4IGRhdGEsIGJ1ZjsKIAotCWluZm8oIkR1bXBpbmcgYWxsIHN0djA2eHggYnJpZGdlIHJlZ2lzdGVycyIpOworCXByX2luZm8oIkR1bXBpbmcgYWxsIHN0djA2eHggYnJpZGdlIHJlZ2lzdGVyc1xuIik7CiAJZm9yIChpID0gMHgxNDAwOyBpIDwgMHgxNjBmOyBpKyspIHsKIAkJc3R2MDZ4eF9yZWFkX2JyaWRnZShzZCwgaSwgJmRhdGEpOwogCi0JCWluZm8oIlJlYWQgMHgleCBmcm9tIGFkZHJlc3MgMHgleCIsIGRhdGEsIGkpOworCQlwcl9pbmZvKCJSZWFkIDB4JXggZnJvbSBhZGRyZXNzIDB4JXhcbiIsIGRhdGEsIGkpOwogCX0KIAotCWluZm8oIlRlc3Rpbmcgc3R2MDZ4eCBicmlkZ2UgcmVnaXN0ZXJzIGZvciB3cml0YWJpbGl0eSIpOworCXByX2luZm8oIlRlc3Rpbmcgc3R2MDZ4eCBicmlkZ2UgcmVnaXN0ZXJzIGZvciB3cml0YWJpbGl0eVxuIik7CiAJZm9yIChpID0gMHgxNDAwOyBpIDwgMHgxNjBmOyBpKyspIHsKIAkJc3R2MDZ4eF9yZWFkX2JyaWRnZShzZCwgaSwgJmRhdGEpOwogCQlidWYgPSBkYXRhOwpAQCAtMjI4LDEyICsyMzAsMTIgQEAKIAkJc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc2QsIGksIDB4ZmYpOwogCQlzdHYwNnh4X3JlYWRfYnJpZGdlKHNkLCBpLCAmZGF0YSk7CiAJCWlmIChkYXRhID09IDB4ZmYpCi0JCQlpbmZvKCJSZWdpc3RlciAweCV4IGlzIHJlYWQvd3JpdGUiLCBpKTsKKwkJCXByX2luZm8oIlJlZ2lzdGVyIDB4JXggaXMgcmVhZC93cml0ZVxuIiwgaSk7CiAJCWVsc2UgaWYgKGRhdGEgIT0gYnVmKQotCQkJaW5mbygiUmVnaXN0ZXIgMHgleCBpcyByZWFkL3dyaXRlLCIKLQkJCSAgICAgIiBidXQgb25seSBwYXJ0aWFsbHkiLCBpKTsKKwkJCXByX2luZm8oIlJlZ2lzdGVyIDB4JXggaXMgcmVhZC93cml0ZSwgYnV0IG9ubHkgcGFydGlhbGx5XG4iLAorCQkJCWkpOwogCQllbHNlCi0JCQlpbmZvKCJSZWdpc3RlciAweCV4IGlzIHJlYWQtb25seSIsIGkpOworCQkJcHJfaW5mbygiUmVnaXN0ZXIgMHgleCBpcyByZWFkLW9ubHlcbiIsIGkpOwogCiAJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBpLCBidWYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eC5oCmluZGV4IGUwZjYzYzUuLmQyNzBhNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguaApAQCAtMzcsNiArMzcsOCBAQAogCiAjZGVmaW5lIFNUVl9JU09DX0VORFBPSU5UX0FERFIJCTB4ODEKIAorI2RlZmluZSBTVFZfUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUwOQorCiAjZGVmaW5lIFNUVl9SRUcyMwkJCTB4MDQyMwogCiAvKiBDb250cm9sIHJlZ2lzdGVycyBvZiB0aGUgU1RWMDYwMCBBU0lDICovCkBAIC02MSw3ICs2Myw5IEBACiAKIC8qIFJlZmVycyB0byB0aGUgQ0lGIDM1MngyODggYW5kIFFDSUYgMTc2eDE0NCAqLwogLyogMTogMjg4IGxpbmVzLCAyOiAxNDQgbGluZXMgKi8KLSNkZWZpbmUgU1RWX1lfQ1RSTAkJCTB4MTVjMworI2RlZmluZSBTVFZfWV9DVFJMCQkgICAgICAgIDB4MTVjMworCisjZGVmaW5lIFNUVl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgxNjIwCiAKIC8qIDB4YTogMzUyIGNvbHVtbnMsIDB4NjogMTc2IGNvbHVtbnMgKi8KICNkZWZpbmUgU1RWX1hfQ1RSTAkJCTB4MTY4MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfaGRjcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfaGRjcy5jCmluZGV4IGI4MTU2ODUuLmE4Njk4YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X2hkY3MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9oZGNzLmMKQEAgLTI4LDYgKzI4LDggQEAKICAqIFAvTiA4NjEwNDAtMDAwMDogU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MTAgICAtIFF1aWNrQ2FtIFdlYgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgInN0djA2eHhfaGRjcy5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGN0cmwgaGRjczF4MDBfY3RybFtdID0gewpAQCAtNDI4LDcgKzQzMCw3IEBACiAJaWYgKHJldCA8IDAgfHwgc2Vuc29yICE9IDB4MDgpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaW5mbygiSERDUy0xMDAwLzExMDAgc2Vuc29yIGRldGVjdGVkIik7CisJcHJfaW5mbygiSERDUy0xMDAwLzExMDAgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAogCXNkLT5nc3BjYV9kZXYuY2FtLmNhbV9tb2RlID0gaGRjczF4MDBfbW9kZTsKIAlzZC0+Z3NwY2FfZGV2LmNhbS5ubW9kZXMgPSBBUlJBWV9TSVpFKGhkY3MxeDAwX21vZGUpOwpAQCAtNDg3LDcgKzQ4OSw3IEBACiAJaWYgKHJldCA8IDAgfHwgc2Vuc29yICE9IDB4MTApCiAJCXJldHVybiAtRU5PREVWOwogCi0JaW5mbygiSERDUy0xMDIwIHNlbnNvciBkZXRlY3RlZCIpOworCXByX2luZm8oIkhEQ1MtMTAyMCBzZW5zb3IgZGV0ZWN0ZWRcbiIpOwogCiAJc2QtPmdzcGNhX2Rldi5jYW0uY2FtX21vZGUgPSBoZGNzMTAyMF9tb2RlOwogCXNkLT5nc3BjYV9kZXYuY2FtLm5tb2RlcyA9IEFSUkFZX1NJWkUoaGRjczEwMjBfbW9kZSk7CkBAIC02MDEsMTEgKzYwMywxMSBAQAogewogCXUxNiByZWcsIHZhbDsKIAotCWluZm8oIkR1bXBpbmcgc2Vuc29yIHJlZ2lzdGVyczoiKTsKKwlwcl9pbmZvKCJEdW1waW5nIHNlbnNvciByZWdpc3RlcnM6XG4iKTsKIAogCWZvciAocmVnID0gSERDU19JREVOVDsgcmVnIDw9IEhEQ1NfUk9XRVhQSDsgcmVnKyspIHsKIAkJc3R2MDZ4eF9yZWFkX3NlbnNvcihzZCwgcmVnLCAmdmFsKTsKLQkJaW5mbygicmVnIDB4JTAyeCA9IDB4JTAyeCIsIHJlZywgdmFsKTsKKwkJcHJfaW5mbygicmVnIDB4JTAyeCA9IDB4JTAyeFxuIiwgcmVnLCB2YWwpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3BiMDEwMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfcGIwMTAwLmMKaW5kZXggNzVhNWI5Yy4uMjZmMTRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfcGIwMTAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfcGIwMTAwLmMKQEAgLTQ0LDYgKzQ0LDggQEAKICAqIFBCX0NGSUxMSU4gICAgICAgPSBSNSAgPSAweDBFICgxNCBkZWMpICAgICA6IFNldHMgdGhlIGZyYW1lIHJhdGUKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlICJzdHYwNnh4X3BiMDEwMC5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGN0cmwgcGIwMTAwX2N0cmxbXSA9IHsKQEAgLTE5MCw3ICsxOTIsNyBAQAogCQlpZiAoIXNlbnNvcl9zZXR0aW5ncykKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCWluZm8oIlBob3RvYml0IHBiMDEwMCBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygiUGhvdG9iaXQgcGIwMTAwIHNlbnNvciBkZXRlY3RlZFxuIik7CiAKIAkJc2QtPmdzcGNhX2Rldi5jYW0uY2FtX21vZGUgPSBwYjAxMDBfbW9kZTsKIAkJc2QtPmdzcGNhX2Rldi5jYW0ubm1vZGVzID0gQVJSQVlfU0laRShwYjAxMDBfbW9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9zdDY0MjIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3N0NjQyMi5jCmluZGV4IDhhNDU2ZGUuLjk5NDBlMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3N0NjQyMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3N0NjQyMi5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgInN0djA2eHhfc3Q2NDIyLmgiCiAKIC8qIGNvbnRyb2xzICovCkBAIC0xMzYsNyArMTM4LDcgQEAKIAlpZiAoc2QtPmJyaWRnZSAhPSBCUklER0VfU1Q2NDIyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWluZm8oInN0NjQyMiBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwlwcl9pbmZvKCJzdDY0MjIgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAogCXNlbnNvcl9zZXR0aW5ncyA9IGttYWxsb2Moc2l6ZW9mICpzZW5zb3Jfc2V0dGluZ3MsIEdGUF9LRVJORUwpOwogCWlmICghc2Vuc29yX3NldHRpbmdzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfdnY2NDEwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF92djY0MTAuYwppbmRleCBmODM5ODQzLi5hNWM2OWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF92djY0MTAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF92djY0MTAuYwpAQCAtMjcsNiArMjcsOCBAQAogICogUC9OIDg2MTA0MC0wMDAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYxMCAgIC0gUXVpY2tDYW0gV2ViCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSAic3R2MDZ4eF92djY0MTAuaCIKIAogc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdnY2NDEwX21vZGVbXSA9IHsKQEAgLTExMiw3ICsxMTQsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkYXRhID09IDB4MTkpIHsKLQkJaW5mbygidnY2NDEwIHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJ2djY0MTAgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAogCQlzZW5zb3Jfc2V0dGluZ3MgPSBrbWFsbG9jKEFSUkFZX1NJWkUodnY2NDEwX2N0cmwpICogc2l6ZW9mKHMzMiksCiAJCQkJCSAgR0ZQX0tFUk5FTCk7CkBAIC0xMzgsMTggKzE0MCw3IEBACiAJczMyICpzZW5zb3Jfc2V0dGluZ3MgPSBzZC0+c2Vuc29yX3ByaXY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHZfYnJpZGdlX2luaXQpOyBpKyspIHsKLQkJLyogaWYgTlVMTCB0aGVuIGxlbiBjb250YWlucyBzaW5nbGUgdmFsdWUgKi8KLQkJaWYgKHN0dl9icmlkZ2VfaW5pdFtpXS5kYXRhID09IE5VTEwpIHsKLQkJCWVyciA9IHN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLAotCQkJCXN0dl9icmlkZ2VfaW5pdFtpXS5zdGFydCwKLQkJCQlzdHZfYnJpZGdlX2luaXRbaV0ubGVuKTsKLQkJfSBlbHNlIHsKLQkJCWludCBqOwotCQkJZm9yIChqID0gMDsgaiA8IHN0dl9icmlkZ2VfaW5pdFtpXS5sZW47IGorKykKLQkJCQllcnIgPSBzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwKLQkJCQkJc3R2X2JyaWRnZV9pbml0W2ldLnN0YXJ0ICsgaiwKLQkJCQkJc3R2X2JyaWRnZV9pbml0W2ldLmRhdGFbal0pOwotCQl9CisJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBzdHZfYnJpZGdlX2luaXRbaV0uYWRkciwgc3R2X2JyaWRnZV9pbml0W2ldLmRhdGEpOwogCX0KIAogCWlmIChlcnIgPCAwKQpAQCAtMTgzLDE1ICsxNzQsNiBAQAogCXN0cnVjdCBjYW0gKmNhbSA9ICZzZC0+Z3NwY2FfZGV2LmNhbTsKIAl1MzIgcHJpdiA9IGNhbS0+Y2FtX21vZGVbc2QtPmdzcGNhX2Rldi5jdXJyX21vZGVdLnByaXY7CiAKLQlpZiAocHJpdiAmIFZWNjQxMF9DUk9QX1RPX1FWR0EpIHsKLQkJUERFQlVHKERfQ09ORiwgIkNyb3BwaW5nIHRvIFFWR0EiKTsKLQkJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFZWNjQxMF9YRU5ESCwgMzIwIC0gMSk7Ci0JCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBWVjY0MTBfWUVOREgsIDI0MCAtIDEpOwotCX0gZWxzZSB7Ci0JCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBWVjY0MTBfWEVOREgsIDM2MCAtIDEpOwotCQlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgVlY2NDEwX1lFTkRILCAyOTQgLSAxKTsKLQl9Ci0KIAlpZiAocHJpdiAmIFZWNjQxMF9TVUJTQU1QTEUpIHsKIAkJUERFQlVHKERfQ09ORiwgIkVuYWJsaW5nIHN1YnNhbXBsaW5nIik7CiAJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfWV9DVFJMLCAweDAyKTsKQEAgLTIwMSw4ICsxODMsOCBAQAogCX0gZWxzZSB7CiAJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfWV9DVFJMLCAweDAxKTsKIAkJc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc2QsIFNUVl9YX0NUUkwsIDB4MGEpOworCQlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1NDQU5fUkFURSwgMHgwMCk7CiAKLQkJc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc2QsIFNUVl9TQ0FOX1JBVEUsIDB4MjApOwogCX0KIAogCS8qIFR1cm4gb24gTEVEICovCkBAIC0yNDIsMTEgKzIyNCwxMSBAQAogCXU4IGk7CiAJaW50IGVyciA9IDA7CiAKLQlpbmZvKCJEdW1waW5nIGFsbCB2djY0MTAgc2Vuc29yIHJlZ2lzdGVycyIpOworCXByX2luZm8oIkR1bXBpbmcgYWxsIHZ2NjQxMCBzZW5zb3IgcmVnaXN0ZXJzXG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgMHhmZiAmJiAhZXJyOyBpKyspIHsKIAkJdTE2IGRhdGE7CiAJCWVyciA9IHN0djA2eHhfcmVhZF9zZW5zb3Ioc2QsIGksICZkYXRhKTsKLQkJaW5mbygiUmVnaXN0ZXIgMHgleCBjb250YWluZWQgMHgleCIsIGksIGRhdGEpOworCQlwcl9pbmZvKCJSZWdpc3RlciAweCV4IGNvbnRhaW5lZCAweCV4XG4iLCBpLCBkYXRhKTsKIAl9CiAJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF92djY0MTAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3Z2NjQxMC5oCmluZGV4IDdmZTM1ODcuLmEyNWI4ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3Z2NjQxMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3Z2NjQxMC5oCkBAIC0yMTEsNDkgKzIxMSw0OSBAQAogCiAvKiBJZiBOVUxMLCBvbmx5IHNpbmdsZSB2YWx1ZSB0byB3cml0ZSwgc3RvcmVkIGluIGxlbiAqLwogc3RydWN0IHN0dl9pbml0IHsKLQljb25zdCB1OCAqZGF0YTsKLQl1MTYgc3RhcnQ7Ci0JdTggbGVuOwotfTsKLQotc3RhdGljIGNvbnN0IHU4IHgxNTAwW10gPSB7CS8qIDB4MTUwMCAtIDB4MTUwZiAqLwotCTB4MGIsIDB4YTcsIDB4YjcsIDB4MDAsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCB4MTUzNltdID0gewkvKiAweDE1MzYgLSAweDE1M2IgKi8KLQkweDAyLCAweDAwLCAweDYwLCAweDAxLCAweDIwLCAweDAxCisJdTE2IGFkZHI7CisJdTggZGF0YTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3R2X2luaXQgc3R2X2JyaWRnZV9pbml0W10gPSB7CiAJLyogVGhpcyByZWcgaXMgd3JpdHRlbiB0d2ljZS4gU29tZSBraW5kIG9mIHJlc2V0PyAqLwotCXtOVUxMLCAgMHgxNjIwLCAweDgwfSwKLQl7TlVMTCwgIDB4MTYyMCwgMHgwMH0sCi0Je05VTEwsICAweDE0NDMsIDB4MDB9LAotCXtOVUxMLCAgMHgxNDIzLCAweDA0fSwKLQl7eDE1MDAsIDB4MTUwMCwgQVJSQVlfU0laRSh4MTUwMCl9LAotCXt4MTUzNiwgMHgxNTM2LCBBUlJBWV9TSVpFKHgxNTM2KX0sCisJe1NUVl9SRVNFVCwgMHg4MH0sCisJe1NUVl9SRVNFVCwgMHgwMH0sCisJe1NUVl9TQ0FOX1JBVEUsIDB4MDB9LAorCXtTVFZfSTJDX0ZMVVNILCAweDA0fSwKKwl7U1RWX1JFRzAwLCAweDBifSwKKwl7U1RWX1JFRzAxLCAweGE3fSwKKwl7U1RWX1JFRzAyLCAweGI3fSwKKwl7U1RWX1JFRzAzLCAweDAwfSwKKwl7U1RWX1JFRzA0LCAweDAwfSwKKwl7MHgxNTM2LCAweDAyfSwKKwl7MHgxNTM3LCAweDAwfSwKKwl7MHgxNTM4LCAweDYwfSwKKwl7MHgxNTM5LCAweDAxfSwKKwl7MHgxNTNhLCAweDIwfSwKKwl7MHgxNTNiLCAweDAxfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1OCB2djY0MTBfc2Vuc29yX2luaXRbXVsyXSA9IHsKIAkvKiBTZXR1cCByZWdpc3RlcnMgKi8KLQl7VlY2NDEwX1NFVFVQMCwJCVZWNjQxMF9TT0ZUX1JFU0VUfSwKLQl7VlY2NDEwX1NFVFVQMCwJCVZWNjQxMF9MT1dfUE9XRVJfTU9ERX0sCisJe1ZWNjQxMF9TRVRVUDAsCVZWNjQxMF9TT0ZUX1JFU0VUfSwKKwl7VlY2NDEwX1NFVFVQMCwJVlY2NDEwX0xPV19QT1dFUl9NT0RFfSwKIAkvKiBVc2Ugc2h1ZmZsZWQgcmVhZC1vdXQgbW9kZSAqLwotCXtWVjY0MTBfU0VUVVAxLAkJQklUKDYpfSwKLQkvKiBBbGwgbW9kZXMgdG8gMSAqLwotCXtWVjY0MTBfRkdNT0RFUywJQklUKDYpIHwgQklUKDQpIHwgQklUKDIpIHwgQklUKDApfSwKLQl7VlY2NDEwX1BJTk1BUFBJTkcsCTB4MDB9LAorCXtWVjY0MTBfU0VUVVAxLAlCSVQoNil9LAorCS8qIEFsbCBtb2RlcyB0byAxLCBGU1QsIEZhc3QgUUNLLCBGcmVlIHJ1bm5pbmcgUUNLLCBGcmVlIHJ1bm5pbmcgTFNULCBGU1Qgd2lsbCBxdWFsaWZ5IHZpc2libGUgcGl4ZWxzICovCisJe1ZWNjQxMF9GR01PREVTLCBCSVQoNikgfCBCSVQoNCkgfCBCSVQoMikgfCBCSVQoMCl9LAorCXtWVjY0MTBfUElOTUFQUElORywgMHgwMH0sCiAJLyogUHJlLWNsb2NrIGdlbmVyYXRvciBkaXZpZGUgb2ZmICovCi0Je1ZWNjQxMF9EQVRBRk9STUFULAlCSVQoNykgfCBCSVQoMCl9LAorCXtWVjY0MTBfREFUQUZPUk1BVCwgQklUKDcpIHwgQklUKDApfSwKIAotCXtWVjY0MTBfQ0xLRElWLAkJVlY2NDEwX0NMS19ESVZfMn0sCisJe1ZWNjQxMF9DTEtESVYsCVZWNjQxMF9DTEtfRElWXzJ9LAogCiAJLyogU3lzdGVtIHJlZ2lzdGVycyAqLwogCS8qIEVuYWJsZSB2b2x0YWdlIGRvdWJsZXIgKi8KLQl7VlY2NDEwX0FTMCwJCUJJVCg2KSB8IEJJVCg0KSB8IEJJVCgzKSB8IEJJVCgyKSB8IEJJVCgxKX0sCi0Je1ZWNjQxMF9BVDAsCQkweDAwfSwKKwl7VlY2NDEwX0FTMCwgQklUKDYpIHwgQklUKDQpIHwgQklUKDMpIHwgQklUKDIpIHwgQklUKDEpfSwKKwl7VlY2NDEwX0FUMCwgMHgwMH0sCiAJLyogUG93ZXIgdXAgYXVkaW8sIGRpZmZlcmVudGlhbCAqLwotCXtWVjY0MTBfQVQxLAkJQklUKDQpfEJJVCgwKX0sCisJe1ZWNjQxMF9BVDEsIEJJVCg0KSB8IEJJVCgwKX0sCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMKaW5kZXggNmVjMjMyOS4uYzg5MDk3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzdW5wbHVzIgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTMyNSw3ICszMjcsNyBAQAogCiAjaWZkZWYgR1NQQ0FfREVCVUcKIAlpZiAobGVuID4gVVNCX0JVRl9TWikgewotCQllcnIoInJlZ19yOiBidWZmZXIgb3ZlcmZsb3ciKTsKKwkJcHJfZXJyKCJyZWdfcjogYnVmZmVyIG92ZXJmbG93XG4iKTsKIAkJcmV0dXJuOwogCX0KICNlbmRpZgpAQCAtMzQwLDcgKzM0Miw3IEBACiAJCQlsZW4gPyBnc3BjYV9kZXYtPnVzYl9idWYgOiBOVUxMLCBsZW4sCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3IgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfciBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0zNjUsNyArMzY3LDcgQEAKIAkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfd18xIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3dfMSBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0zODUsNyArMzg3LDcgQEAKIAkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCXZhbHVlLCBpbmRleCwgTlVMTCwgMCwgNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193X3JpdiBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193X3JpdiBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdDYxMy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMKaW5kZXggZDFkNzMzYi4uOTBmMDg3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMKQEAgLTI2LDYgKzI2LDggQEAKICAqCQkJQ29zdGFudGlubyBMZWFuZHJvCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJ0NjEzIgogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTcyLDcgKzU3NCw3IEBACiAKIAkJdG1wYnVmID0ga21lbWR1cChidWZmZXIsIGxlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdG1wYnVmKSB7Ci0JCQllcnIoIk91dCBvZiBtZW1vcnkiKTsKKwkJCXByX2VycigiT3V0IG9mIG1lbW9yeVxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAkJdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LApAQCAtNTk4LDcgKzYwMCw3IEBACiAJfSBlbHNlIHsKIAkJcCA9IHRtcGJ1ZiA9IGttYWxsb2MobGVuICogMiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdG1wYnVmKSB7Ci0JCQllcnIoIk91dCBvZiBtZW1vcnkiKTsKKwkJCXByX2VycigiT3V0IG9mIG1lbW9yeVxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC02NTIsNyArNjU0LDcgQEAKIAl9CiAJYnl0ZSA9IHJlZ19yKGdzcGNhX2RldiwgMHgwMDYzKTsKIAlpZiAoYnl0ZSAhPSAweDE3KSB7Ci0JCWVycigiQmFkIHNlbnNvciByZXNldCAlMDJ4IiwgYnl0ZSk7CisJCXByX2VycigiQmFkIHNlbnNvciByZXNldCAlMDJ4XG4iLCBieXRlKTsKIAkJLyogY29udGludWU/ICovCiAJfQogCkBAIC04OTAsNyArODkyLDcgQEAKIAkJc2QtPnNlbnNvciA9IFNFTlNPUl9PTTY4MDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVycigidW5rbm93biBzZW5zb3IgJTA0eCIsIHNlbnNvcl9pZCk7CisJCXByX2VycigidW5rbm93biBzZW5zb3IgJTA0eFxuIiwgc2Vuc29yX2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC05MDUsNyArOTA3LDcgQEAKIAkJCQlicmVhazsJCS8qIE9LICovCiAJCX0KIAkJaWYgKGkgPCAwKSB7Ci0JCQllcnIoIkJhZCBzZW5zb3IgcmVzZXQgJTAyeCIsIHRlc3RfYnl0ZSk7CisJCQlwcl9lcnIoIkJhZCBzZW5zb3IgcmVzZXQgJTAyeFxuIiwgdGVzdF9ieXRlKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCXJlZ193X2J1Zihnc3BjYV9kZXYsIG4yLCBzaXplb2YgbjIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90b3Byby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90b3Byby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTk2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3RvcHJvLmMKQEAgLTAsMCArMSw0OTg5IEBACisvKgorICogVG9wcm8gVFA2ODAwLzY4MTAgd2ViY2FtIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSmVhbi1GcmFuw6dvaXMgTW9pbmUgKGh0dHA6Ly9tb2luZWpmLmZyZWUuZnIpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQW5kZXJzIEJsb21kZWxsIChhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2UpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhvbWFzIENoYW1wYWduZSAobGFmZXVpbEBnbWFpbC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgImdzcGNhLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiVG9wcm8gVFA2ODAwLzY4MTAgZ3NwY2Egd2ViY2FtIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSmVhbi1GcmFuY29pcyBNb2luZSA8aHR0cDovL21vaW5lamYuZnJlZS5mcj4sICIKKwkJIkFuZGVycyBCbG9tZGVsbCA8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGZvcmNlX3NlbnNvciA9IC0xOworCisvKiBKUEVHIGhlYWRlciAqLworc3RhdGljIGNvbnN0IHU4IGpwZWdfaGVhZFtdID0geworCTB4ZmYsIDB4ZDgsCQkJLyoganBlZyAqLworCisvKiBxdWFudGl6YXRpb24gdGFibGUgcXVhbGl0eSA1MCUgKi8KKwkweGZmLCAweGRiLCAweDAwLCAweDg0LAkJLyogRFFUICovCiswLAorI2RlZmluZSBKUEVHX1FUMF9PRkZTRVQgNworCTB4MTAsIDB4MGIsIDB4MGMsIDB4MGUsIDB4MGMsIDB4MGEsIDB4MTAsIDB4MGUsCisJMHgwZCwgMHgwZSwgMHgxMiwgMHgxMSwgMHgxMCwgMHgxMywgMHgxOCwgMHgyOCwKKwkweDFhLCAweDE4LCAweDE2LCAweDE2LCAweDE4LCAweDMxLCAweDIzLCAweDI1LAorCTB4MWQsIDB4MjgsIDB4M2EsIDB4MzMsIDB4M2QsIDB4M2MsIDB4MzksIDB4MzMsCisJMHgzOCwgMHgzNywgMHg0MCwgMHg0OCwgMHg1YywgMHg0ZSwgMHg0MCwgMHg0NCwKKwkweDU3LCAweDQ1LCAweDM3LCAweDM4LCAweDUwLCAweDZkLCAweDUxLCAweDU3LAorCTB4NWYsIDB4NjIsIDB4NjcsIDB4NjgsIDB4NjcsIDB4M2UsIDB4NGQsIDB4NzEsCisJMHg3OSwgMHg3MCwgMHg2NCwgMHg3OCwgMHg1YywgMHg2NSwgMHg2NywgMHg2MywKKzEsCisjZGVmaW5lIEpQRUdfUVQxX09GRlNFVCA3MgorCTB4MTEsIDB4MTIsIDB4MTIsIDB4MTgsIDB4MTUsIDB4MTgsIDB4MmYsIDB4MWEsCisJMHgxYSwgMHgyZiwgMHg2MywgMHg0MiwgMHgzOCwgMHg0MiwgMHg2MywgMHg2MywKKwkweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCTB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywKKwkweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCTB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywKKworCS8qIERlZmluZSBIdWZmbWFuIHRhYmxlICh0aGFua3MgdG8gVGhvbWFzIEthaXNlcikgKi8KKwkweGZmLCAweGM0LCAweDAxLCAweDVlLAorCTB4MDAsIDB4MDAsIDB4MDIsIDB4MDMsCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLAorCTB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MTAsCisJMHgwMCwgMHgwMiwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwNCwgMHgwMywgMHgwNCwKKwkweDA3LCAweDA1LCAweDA0LCAweDA2LCAweDAxLCAweDAwLCAweDAwLCAweDU3LAorCTB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MTEsIDB4MDQsIDB4MTIsIDB4MjEsCisJMHgzMSwgMHgxMywgMHg0MSwgMHg1MSwgMHg2MSwgMHgwNSwgMHgyMiwgMHgzMiwKKwkweDE0LCAweDcxLCAweDgxLCAweDkxLCAweDE1LCAweDIzLCAweDQyLCAweDUyLAorCTB4NjIsIDB4YTEsIDB4YjEsIDB4MDYsIDB4MzMsIDB4NzIsIDB4YzEsIDB4ZDEsCisJMHgyNCwgMHg0MywgMHg1MywgMHg4MiwgMHgxNiwgMHgzNCwgMHg5MiwgMHhhMiwKKwkweGUxLCAweGYxLCAweGYwLCAweDA3LCAweDA4LCAweDE3LCAweDE4LCAweDI1LAorCTB4MjYsIDB4MjcsIDB4MjgsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4NDQsCisJMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywKKwkweDU4LCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDczLAorCTB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4ODMsIDB4ODQsIDB4ODUsCisJMHg4NiwgMHg4NywgMHg4OCwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywKKwkweDk4LCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGIyLAorCTB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YzIsIDB4YzMsCisJMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhkMiwgMHhkMywgMHhkNCwKKwkweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGUyLCAweGUzLCAweGU0LCAweGU1LAorCTB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsCisJMHhmNywgMHhmOCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsCisJMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgxMSwgMHgwMCwgMHgwMiwKKwkweDAxLCAweDAyLCAweDA0LCAweDA0LCAweDAzLCAweDA0LCAweDA3LCAweDA1LAorCTB4MDQsIDB4MDYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NTcsIDB4MDAsIDB4MDEsCisJMHgxMSwgMHgwMiwgMHgyMSwgMHgwMywgMHgxMiwgMHgzMSwgMHg0MSwgMHgxMywKKwkweDIyLCAweDUxLCAweDYxLCAweDA0LCAweDMyLCAweDcxLCAweDA1LCAweDE0LAorCTB4MjMsIDB4NDIsIDB4MzMsIDB4NTIsIDB4ODEsIDB4OTEsIDB4YTEsIDB4YjEsCisJMHhmMCwgMHgwNiwgMHgxNSwgMHhjMSwgMHhkMSwgMHhlMSwgMHgyNCwgMHg0MywKKwkweDYyLCAweGYxLCAweDE2LCAweDI1LCAweDM0LCAweDUzLCAweDcyLCAweDgyLAorCTB4OTIsIDB4MDcsIDB4MDgsIDB4MTcsIDB4MTgsIDB4MjYsIDB4MjcsIDB4MjgsCisJMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywKKwkweDQ4LCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDYzLCAweDY0LAorCTB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsCisJMHg3NywgMHg3OCwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwKKwkweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweGEyLCAweGEzLAorCTB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YjIsIDB4YjMsIDB4YjQsCisJMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwKKwkweGM2LCAweGM3LCAweGM4LCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LAorCTB4ZDcsIDB4ZDgsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsCisJMHhlOCwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKwkweGZmLCAweGMwLCAweDAwLCAweDExLAkJLyogU09GMCAoc3RhcnQgb2YgZnJhbWUgMCAqLworCTB4MDgsCQkJCS8qIGRhdGEgcHJlY2lzaW9uICovCisjZGVmaW5lIEpQRUdfSEVJR0hUX09GRlNFVCA0OTMKKwkweDAxLCAweGUwLAkJCS8qIGhlaWdodCAqLworCTB4MDIsIDB4ODAsCQkJLyogd2lkdGggKi8KKwkweDAzLAkJCQkvKiBjb21wb25lbnQgbnVtYmVyICovCisJCTB4MDEsCisJCQkweDIxLAkJLyogc2FtcGxlcyBZID0ganBlZyA0MjIgKi8KKwkJCTB4MDAsCQkvKiBxdWFudCBZICovCisJCTB4MDIsIDB4MTEsIDB4MDEsCS8qIHNhbXBsZXMgQ2JDciAtIHF1YW50IENiQ3IgKi8KKwkJMHgwMywgMHgxMSwgMHgwMSwKKworCTB4ZmYsIDB4ZGEsIDB4MDAsIDB4MGMsCQkvKiBTT1MgKHN0YXJ0IG9mIHNjYW4pICovCisJMHgwMywgMHgwMSwgMHgwMCwgMHgwMiwgMHgxMSwgMHgwMywgMHgxMSwgMHgwMCwgMHgzZiwgMHgwMAorI2RlZmluZSBKUEVHX0hEUl9TWiA1MjEKK307CisKK2VudW0gZV9jdHJsIHsKKwlFWFBPU1VSRSwKKwlRVUFMSVRZLAorCVNIQVJQTkVTUywKKwlSR0FJTiwKKwlHQUlOLAorCUJHQUlOLAorCUdBTU1BLAorCUFVVE9HQUlOLAorCU5DVFJMUwkJLyogbnVtYmVyIG9mIGNvbnRyb2xzICovCit9OworCisjZGVmaW5lIEFVVE9HQUlOX0RFRiAxCisKK3N0cnVjdCBzZCB7CisJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CS8qICEhIG11c3QgYmUgdGhlIGZpcnN0IGl0ZW0gKi8KKworCXN0cnVjdCBnc3BjYV9jdHJsIGN0cmxzW05DVFJMU107CisKKwl1OCBmcmFtZXJhdGU7CisJdTggcXVhbGl0eTsJCS8qIHdlYmNhbSBjdXJyZW50IEpQRUcgcXVhbGl0eSAoMC4uMTYpICovCisJczggYWdfY250OwkJLyogYXV0b2dhaW4gLyBzdGFydCBjb3VudGVyIGZvciB0cDY4MTAgKi8KKyNkZWZpbmUgQUdfQ05UX1NUQVJUIDEzCQkvKiBjaGVjayBnYWluIGV2ZXJ5IE4gZnJhbWVzICovCisKKwl1OCBicmlkZ2U7CisJdTggc2Vuc29yOworCisJdTgganBlZ19oZHJbSlBFR19IRFJfU1pdOworfTsKKworZW51bSBicmlkZ2VzIHsKKwlCUklER0VfVFA2ODAwLAorCUJSSURHRV9UUDY4MTAsCit9OworCitlbnVtIHNlbnNvcnMgeworCVNFTlNPUl9DWDAzNDIsCisJU0VOU09SX1NPSTc2M0EsCQkvKiB+PSBvdjc2MzAgLyBvdjc2NDggKi8KKwlOU0VOU09SUworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmdhX21vZGVbXSA9IHsKKwl7MzIwLCAyNDAsIFY0TDJfUElYX0ZNVF9KUEVHLCBWNEwyX0ZJRUxEX05PTkUsCisJCS5ieXRlc3BlcmxpbmUgPSAzMjAsCisJCS5zaXplaW1hZ2UgPSAzMjAgKiAyNDAgKiA0IC8gOCArIDU5MCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFR30sCisJezY0MCwgNDgwLCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gNjQwLAorCQkuc2l6ZWltYWdlID0gNjQwICogNDgwICogMyAvIDggKyA1OTAsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUd9Cit9OworCisvKgorICogSlBFRyBxdWFsaXR5CisgKiBpbmRleDogd2ViY2FtIGNvbXByZXNzaW9uCisgKiB2YWx1ZTogSlBFRyBxdWFsaXR5IGluICUKKyAqLworc3RhdGljIGNvbnN0IHU4IGpwZWdfcVsxN10gPSB7CisJODgsIDc3LCA2NywgNTcsIDU1LCA1NSwgNDUsIDQ1LCAzNiwgMzYsIDMwLCAzMCwgMjYsIDI2LCAyMiwgMjIsIDk0Cit9OworCisjZGVmaW5lIEJVTEtfT1VUX1NJWkUJCTB4MjAKKyNpZiBCVUxLX09VVF9TSVpFID4gVVNCX0JVRl9TWgorI2Vycm9yICJVU0IgYnVmZmVyIHRvbyBzbWFsbCIKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdTggcmF0ZXNbXSA9IHszMCwgMjAsIDE1LCAxMCwgNywgNX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGZyYW1lcmF0ZXMgZnJhbWVyYXRlc1tdID0geworCXsKKwkJLnJhdGVzID0gcmF0ZXMsCisJCS5ucmF0ZXMgPSBBUlJBWV9TSVpFKHJhdGVzKQorCX0sCisJeworCQkucmF0ZXMgPSByYXRlcywKKwkJLm5yYXRlcyA9IEFSUkFZX1NJWkUocmF0ZXMpCisJfQorfTsKK3N0YXRpYyBjb25zdCB1OCByYXRlc182ODEwW10gPSB7MzAsIDE1LCAxMCwgNywgNX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGZyYW1lcmF0ZXMgZnJhbWVyYXRlc182ODEwW10gPSB7CisJeworCQkucmF0ZXMgPSByYXRlc182ODEwLAorCQkubnJhdGVzID0gQVJSQVlfU0laRShyYXRlc182ODEwKQorCX0sCisJeworCQkucmF0ZXMgPSByYXRlc182ODEwLAorCQkubnJhdGVzID0gQVJSQVlfU0laRShyYXRlc182ODEwKQorCX0KK307CisKKy8qCisgKiB3ZWJjYW0gcXVhbGl0eSBpbiAlCisgKiB0aGUgbGFzdCB2YWx1ZSBpcyB0aGUgdWx0cmEgZmluZSBxdWFsaXR5CisgKi8KKworLyogVFA2ODAwIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgVFA2ODAwX1IxMF9TSUZfVFlQRQkJMHgxMAorI2RlZmluZSBUUDY4MDBfUjExX1NJRl9DT05UUk9MCQkweDExCisjZGVmaW5lIFRQNjgwMF9SMTJfU0lGX0FERFJfUwkJMHgxMgorI2RlZmluZSBUUDY4MDBfUjEzX1NJRl9UWF9EQVRBCQkweDEzCisjZGVmaW5lIFRQNjgwMF9SMTRfU0lGX1JYX0RBVEEJCTB4MTQKKyNkZWZpbmUgVFA2ODAwX1IxNV9HUElPX1BVCQkweDE1CisjZGVmaW5lIFRQNjgwMF9SMTZfR1BJT19QRAkJMHgxNgorI2RlZmluZSBUUDY4MDBfUjE3X0dQSU9fSU8JCTB4MTcKKyNkZWZpbmUgVFA2ODAwX1IxOF9HUElPX0RBVEEJCTB4MTgKKyNkZWZpbmUgVFA2ODAwX1IxOV9TSUZfQUREUl9TMgkJMHgxOQorI2RlZmluZSBUUDY4MDBfUjFBX1NJRl9UWF9EQVRBMgkJMHgxYQorI2RlZmluZSBUUDY4MDBfUjFCX1NJRl9SWF9EQVRBMgkJMHgxYgorI2RlZmluZSBUUDY4MDBfUjIxX0VORFBfMV9DVEwJCTB4MjEKKyNkZWZpbmUgVFA2ODAwX1IyRl9USU1JTkdfQ0ZHCQkweDJmCisjZGVmaW5lIFRQNjgwMF9SMzBfU0VOU09SX0NGRwkJMHgzMAorI2RlZmluZSBUUDY4MDBfUjMxX1BJWEVMX1NUQVJUCQkweDMxCisjZGVmaW5lIFRQNjgwMF9SMzJfUElYRUxfRU5EX0wJCTB4MzIKKyNkZWZpbmUgVFA2ODAwX1IzM19QSVhFTF9FTkRfSAkJMHgzMworI2RlZmluZSBUUDY4MDBfUjM0X0xJTkVfU1RBUlQJCTB4MzQKKyNkZWZpbmUgVFA2ODAwX1IzNV9MSU5FX0VORF9MCQkweDM1CisjZGVmaW5lIFRQNjgwMF9SMzZfTElORV9FTkRfSAkJMHgzNgorI2RlZmluZSBUUDY4MDBfUjM3X0ZST05UX0RBUktfU1QJMHgzNworI2RlZmluZSBUUDY4MDBfUjM4X0ZST05UX0RBUktfRU5ECTB4MzgKKyNkZWZpbmUgVFA2ODAwX1IzOV9SRUFSX0RBUktfU1RfTAkweDM5CisjZGVmaW5lIFRQNjgwMF9SM0FfUkVBUl9EQVJLX1NUX0gJMHgzYQorI2RlZmluZSBUUDY4MDBfUjNCX1JFQVJfREFSS19FTkRfTAkweDNiCisjZGVmaW5lIFRQNjgwMF9SM0NfUkVBUl9EQVJLX0VORF9ICTB4M2MKKyNkZWZpbmUgVFA2ODAwX1IzRF9IT1JJWl9EQVJLX0xJTkVfTAkweDNkCisjZGVmaW5lIFRQNjgwMF9SM0VfSE9SSVpfREFSS19MSU5FX0gJMHgzZQorI2RlZmluZSBUUDY4MDBfUjNGX0ZSQU1FX1JBVEUJCTB4M2YKKyNkZWZpbmUgVFA2ODAwX1I1MAkJCTB4NTAKKyNkZWZpbmUgVFA2ODAwX1I1MQkJCTB4NTEKKyNkZWZpbmUgVFA2ODAwX1I1MgkJCTB4NTIKKyNkZWZpbmUgVFA2ODAwX1I1MwkJCTB4NTMKKyNkZWZpbmUgVFA2ODAwX1I1NF9EQVJLX0NGRwkJMHg1NAorI2RlZmluZSBUUDY4MDBfUjU1X0dBTU1BX1IJCTB4NTUKKyNkZWZpbmUgVFA2ODAwX1I1Nl9HQU1NQV9HCQkweDU2CisjZGVmaW5lIFRQNjgwMF9SNTdfR0FNTUFfQgkJMHg1NworI2RlZmluZSBUUDY4MDBfUjVDX0VER0VfVEhSTEQJCTB4NWMKKyNkZWZpbmUgVFA2ODAwX1I1RF9ERU1PU0FJQ19DRkcJCTB4NWQKKyNkZWZpbmUgVFA2ODAwX1I3OF9GT1JNQVQJCTB4NzgKKyNkZWZpbmUgVFA2ODAwX1I3OV9RVUFMSVRZCQkweDc5CisjZGVmaW5lIFRQNjgwMF9SN0FfQkxLX1RIUkxECQkweDdhCisKKy8qIENYMDM0MiByZWdpc3RlciBvZmZzZXRzICovCisKKyNkZWZpbmUgQ1gwMzQyX1NFTlNPUl9JRAkJMHgwMAorI2RlZmluZSBDWDAzNDJfVkVSU0lPTl9OTwkJMHgwMQorI2RlZmluZSBDWDAzNDJfT1JHX1hfTAkJCTB4MDIKKyNkZWZpbmUgQ1gwMzQyX09SR19YX0gJCQkweDAzCisjZGVmaW5lIENYMDM0Ml9PUkdfWV9MCQkJMHgwNAorI2RlZmluZSBDWDAzNDJfT1JHX1lfSAkJCTB4MDUKKyNkZWZpbmUgQ1gwMzQyX1NUT1BfWF9MCQkJMHgwNgorI2RlZmluZSBDWDAzNDJfU1RPUF9YX0gJCQkweDA3CisjZGVmaW5lIENYMDM0Ml9TVE9QX1lfTAkJCTB4MDgKKyNkZWZpbmUgQ1gwMzQyX1NUT1BfWV9ICQkJMHgwOQorI2RlZmluZSBDWDAzNDJfRlJBTUVfV0lEVEhfTAkJMHgwYQorI2RlZmluZSBDWDAzNDJfRlJBTUVfV0lEVEhfSAkJMHgwYgorI2RlZmluZSBDWDAzNDJfRlJBTUVfSEVJR0hfTAkJMHgwYworI2RlZmluZSBDWDAzNDJfRlJBTUVfSEVJR0hfSAkJMHgwZAorI2RlZmluZSBDWDAzNDJfRVhQT19MSU5FX0wJCTB4MTAKKyNkZWZpbmUgQ1gwMzQyX0VYUE9fTElORV9ICQkweDExCisjZGVmaW5lIENYMDM0Ml9FWFBPX0NMS19MCQkweDEyCisjZGVmaW5lIENYMDM0Ml9FWFBPX0NMS19ICQkweDEzCisjZGVmaW5lIENYMDM0Ml9SQVdfR1JHQUlOX0wJCTB4MTQKKyNkZWZpbmUgQ1gwMzQyX1JBV19HUkdBSU5fSAkJMHgxNQorI2RlZmluZSBDWDAzNDJfUkFXX0dCR0FJTl9MCQkweDE2CisjZGVmaW5lIENYMDM0Ml9SQVdfR0JHQUlOX0gJCTB4MTcKKyNkZWZpbmUgQ1gwMzQyX1JBV19SR0FJTl9MCQkweDE4CisjZGVmaW5lIENYMDM0Ml9SQVdfUkdBSU5fSAkJMHgxOQorI2RlZmluZSBDWDAzNDJfUkFXX0JHQUlOX0wJCTB4MWEKKyNkZWZpbmUgQ1gwMzQyX1JBV19CR0FJTl9ICQkweDFiCisjZGVmaW5lIENYMDM0Ml9HTE9CQUxfR0FJTgkJMHgxYworI2RlZmluZSBDWDAzNDJfU1lTX0NUUkxfMAkJMHgyMAorI2RlZmluZSBDWDAzNDJfU1lTX0NUUkxfMQkJMHgyMQorI2RlZmluZSBDWDAzNDJfU1lTX0NUUkxfMgkJMHgyMgorI2RlZmluZSBDWDAzNDJfQllQQVNTX01PREUJCTB4MjMKKyNkZWZpbmUgQ1gwMzQyX1NZU19DVFJMXzMJCTB4MjQKKyNkZWZpbmUgQ1gwMzQyX1RJTUlOR19FTgkJMHgyNQorI2RlZmluZSBDWDAzNDJfT1VUUFVUX0NUUkwJCTB4MjYKKyNkZWZpbmUgQ1gwMzQyX0FVVE9fQURDX0NBTElCCQkweDI3CisjZGVmaW5lIENYMDM0Ml9TWVNfQ1RSTF80CQkweDI4CisjZGVmaW5lIENYMDM0Ml9BRENHTgkJCTB4MzAKKyNkZWZpbmUgQ1gwMzQyX1NMUENSCQkJMHgzMQorI2RlZmluZSBDWDAzNDJfU0xQRk5fTE8JCQkweDMyCisjZGVmaW5lIENYMDM0Ml9BRENfQ1RMCQkJMHgzMworI2RlZmluZSBDWDAzNDJfTFZSU1RfQkxCSUFTCQkweDM0CisjZGVmaW5lIENYMDM0Ml9WVEhTRUwJCQkweDM1CisjZGVmaW5lIENYMDM0Ml9SQU1QX1JJVgkJCTB4MzYKKyNkZWZpbmUgQ1gwMzQyX0xET1NFTAkJCTB4MzcKKyNkZWZpbmUgQ1gwMzQyX0NMT0NLX0dFTgkJMHg0MAorI2RlZmluZSBDWDAzNDJfU09GVF9SRVNFVAkJMHg0MQorI2RlZmluZSBDWDAzNDJfUExMCQkJMHg0MgorI2RlZmluZSBDWDAzNDJfRFJfRU5IX1BVTFNFX09GRlNFVF9MCTB4NDMKKyNkZWZpbmUgQ1gwMzQyX0RSX0VOSF9QVUxTRV9PRkZTRVRfSAkweDQ0CisjZGVmaW5lIENYMDM0Ml9EUl9FTkhfUFVMU0VfUE9TX0wJMHg0NQorI2RlZmluZSBDWDAzNDJfRFJfRU5IX1BVTFNFX1BPU19ICTB4NDYKKyNkZWZpbmUgQ1gwMzQyX0RSX0VOSF9QVUxTRV9XSURUSAkweDQ3CisjZGVmaW5lIENYMDM0Ml9BU19DVVJSRU5UX0NOVF9MCQkweDQ4CisjZGVmaW5lIENYMDM0Ml9BU19DVVJSRU5UX0NOVF9ICQkweDQ5CisjZGVmaW5lIENYMDM0Ml9BU19QUkVWSU9VU19DTlRfTAkweDRhCisjZGVmaW5lIENYMDM0Ml9BU19QUkVWSU9VU19DTlRfSAkweDRiCisjZGVmaW5lIENYMDM0Ml9TUFZfVkFMVUVfTAkJMHg0YworI2RlZmluZSBDWDAzNDJfU1BWX1ZBTFVFX0gJCTB4NGQKKyNkZWZpbmUgQ1gwMzQyX0dQWExUSERfTAkJMHg1MAorI2RlZmluZSBDWDAzNDJfR1BYTFRIRF9ICQkweDUxCisjZGVmaW5lIENYMDM0Ml9SQlBYTFRIRF9MCQkweDUyCisjZGVmaW5lIENYMDM0Ml9SQlBYTFRIRF9ICQkweDUzCisjZGVmaW5lIENYMDM0Ml9QTEFORVRIRF9MCQkweDU0CisjZGVmaW5lIENYMDM0Ml9QTEFORVRIRF9ICQkweDU1CisjZGVmaW5lIENYMDM0Ml9ST1dEQVJLX1RICQkweDU2CisjZGVmaW5lIENYMDM0Ml9ST1dEQVJLX1RPTAkJMHg1NworI2RlZmluZSBDWDAzNDJfUkJfR0FQX0wJCQkweDU4CisjZGVmaW5lIENYMDM0Ml9SQl9HQVBfSAkJCTB4NTkKKyNkZWZpbmUgQ1gwMzQyX0dfR0FQX0wJCQkweDVhCisjZGVmaW5lIENYMDM0Ml9HX0dBUF9ICQkJMHg1YgorI2RlZmluZSBDWDAzNDJfQVVUT19ST1dfREFSSwkJMHg2MAorI2RlZmluZSBDWDAzNDJfTUFOVUFMX0RBUktfVkFMVUUJMHg2MQorI2RlZmluZSBDWDAzNDJfR0JfREFSS19PRkZTRVQJCTB4NjIKKyNkZWZpbmUgQ1gwMzQyX0dSX0RBUktfT0ZGU0VUCQkweDYzCisjZGVmaW5lIENYMDM0Ml9SRURfREFSS19PRkZTRVQJCTB4NjQKKyNkZWZpbmUgQ1gwMzQyX0JMVUVfREFSS19PRkZTRVQJCTB4NjUKKyNkZWZpbmUgQ1gwMzQyX0RBVEFfU0NBTElOR19NVUxUSQkweDY2CisjZGVmaW5lIENYMDM0Ml9BVVRPRF9RX0ZSQU1FCQkweDY3CisjZGVmaW5lIENYMDM0Ml9BVVRPRF9BTExPV19WQVJJCQkweDY4CisjZGVmaW5lIENYMDM0Ml9BVVRPX0RBUktfVkFMVUVfTAkweDY5CisjZGVmaW5lIENYMDM0Ml9BVVRPX0RBUktfVkFMVUVfSAkweDZhCisjZGVmaW5lIENYMDM0Ml9JT19DVFJMXzAJCTB4NzAKKyNkZWZpbmUgQ1gwMzQyX0lPX0NUUkxfMQkJMHg3MQorI2RlZmluZSBDWDAzNDJfSU9fQ1RSTF8yCQkweDcyCisjZGVmaW5lIENYMDM0Ml9JRExFX0NUUkwJCTB4NzMKKyNkZWZpbmUgQ1gwMzQyX1RFU1RfTU9ERQkJMHg3NAorI2RlZmluZSBDWDAzNDJfRlJBTUVfRklYX0RBVEFfVEVTVAkweDc1CisjZGVmaW5lIENYMDM0Ml9GUkFNRV9DTlRfVEVTVAkJMHg3NgorI2RlZmluZSBDWDAzNDJfUlNUX09WRVJGTE9XX0wJCTB4ODAKKyNkZWZpbmUgQ1gwMzQyX1JTVF9PVkVSRkxPV19ICQkweDgxCisjZGVmaW5lIENYMDM0Ml9SU1RfVU5ERVJGTE9XX0wJCTB4ODIKKyNkZWZpbmUgQ1gwMzQyX1JTVF9VTkRFUkZMT1dfSAkJMHg4MworI2RlZmluZSBDWDAzNDJfREFUQV9PVkVSRkxPV19MCQkweDg0CisjZGVmaW5lIENYMDM0Ml9EQVRBX09WRVJGTE9XX0gJCTB4ODUKKyNkZWZpbmUgQ1gwMzQyX0RBVEFfVU5ERVJGTE9XX0wJCTB4ODYKKyNkZWZpbmUgQ1gwMzQyX0RBVEFfVU5ERVJGTE9XX0gJCTB4ODcKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF8wX0xfaXJzdAkweDkwCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfMF9IX2lyc3QJMHg5MQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzFfTF9pcnN0CTB4OTIKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF8xX0hfaXJzdAkweDkzCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfMl9MX2lyc3QJMHg5NAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzJfSF9pcnN0CTB4OTUKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF8zX0xfaXJzdAkweDk2CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfM19IX2lyc3QJMHg5NworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzRfTF9pcnN0CTB4OTgKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF80X0hfaXJzdAkweDk5CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfNV9MX2lyc3QJMHg5YQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzVfSF9pcnN0CTB4OWIKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF82X0xfaXJzdAkweDljCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfNl9IX2lyc3QJMHg5ZAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzdfTF9pcnN0CTB4OWUKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF83X0hfaXJzdAkweDlmCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfMF9MX2l0eAkweGEwCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfMF9IX2l0eAkweGExCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfMV9MX2l0eAkweGEyCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfMV9IX2l0eAkweGEzCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfMl9MX2l0eAkweGE0CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfMl9IX2l0eAkweGE1CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfM19MX2l0eAkweGE2CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfM19IX2l0eAkweGE3CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfNF9MX2l0eAkweGE4CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfNF9IX2l0eAkweGE5CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfNV9MX2l0eAkweGFhCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfNV9IX2l0eAkweGFiCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfNl9MX2l0eAkweGFjCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfNl9IX2l0eAkweGFkCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfN19MX2l0eAkweGFlCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzFfN19IX2l0eAkweGFmCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfMF9MX2l3bAkweGIwCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfMF9IX2l3bAkweGIxCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfMV9MX2l3bAkweGIyCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfMV9IX2l3bAkweGIzCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfMl9MX2l3bAkweGI0CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfMl9IX2l3bAkweGI1CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfM19MX2l3bAkweGI2CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfM19IX2l3bAkweGI3CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfNF9MX2l3bAkweGI4CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfNF9IX2l3bAkweGI5CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfNV9MX2l3bAkweGJhCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfNV9IX2l3bAkweGJiCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfNl9MX2l3bAkweGJjCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfNl9IX2l3bAkweGJkCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfN19MX2l3bAkweGJlCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzJfN19IX2l3bAkweGJmCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfMF9MX2Vuc3AJMHhjMAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzBfSF9lbnNwCTB4YzEKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM18xX0xfZW5zcAkweGMyCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfMV9IX2Vuc3AJMHhjMworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzJfTF9lbnNwCTB4YzQKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM18yX0hfZW5zcAkweGM1CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfM19MX2Vuc3AJMHhjNgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzNfSF9lbnNwCTB4YzcKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM180X0xfZW5zcAkweGM4CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfNF9IX2Vuc3AJMHhjOQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzVfTF9lbnNwCTB4Y2EKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM181X0hfZW5zcAkweGNiCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfNl9MX2Vuc3AJMHhjYworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzZfSF9lbnNwCTB4Y2QKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM183X0xfZW5zcAkweGNlCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfN19IX2Vuc3AJMHhjZgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF80XzBfTF9zZWxhCTB4ZDAKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNF8wX0hfc2VsYQkweGQxCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzRfMV9MX3NlbGEJMHhkMgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF80XzFfSF9zZWxhCTB4ZDMKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNV8wX0xfaW50bGEJMHhlMAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF81XzBfSF9pbnRsYQkweGUxCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzVfMV9MX2ludGxhCTB4ZTIKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNV8xX0hfaW50bGEJMHhlMworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF81XzJfTF9pbnRsYQkweGU0CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzVfMl9IX2ludGxhCTB4ZTUKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNV8zX0xfaW50bGEJMHhlNgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF81XzNfSF9pbnRsYQkweGU3CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzZfMF9MX3hhX3NlbF9wb3MgMHhmMAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF82XzBfSF94YV9zZWxfcG9zIDB4ZjEKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfN18xX0xfY2RzX3BvcwkweGYyCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzdfMV9IX2Nkc19wb3MJMHhmMworI2RlZmluZSBDWDAzNDJfU0VOU09SX0hFSUdIVF9MCQkweGZiCisjZGVmaW5lIENYMDM0Ml9TRU5TT1JfSEVJR0hUX0gJCTB4ZmMKKyNkZWZpbmUgQ1gwMzQyX1NFTlNPUl9XSURUSF9MCQkweGZkCisjZGVmaW5lIENYMDM0Ml9TRU5TT1JfV0lEVEhfSAkJMHhmZQorI2RlZmluZSBDWDAzNDJfVlNZTkNfSFNZTkNfUkVBRAkJMHhmZgorCitzdHJ1Y3QgY21kIHsKKwl1OCByZWc7CisJdTggdmFsOworfTsKKworc3RhdGljIGNvbnN0IHU4IERRVFsxN11bMTMwXSA9IHsKKwkvKiBEZWZpbmUgcXVhbnRpemF0aW9uIHRhYmxlICh0aGFua3MgdG8gVGhvbWFzIEthaXNlcikgKi8KKwl7CQkJLyogUXVhbGl0eSAwICovCisJIDB4MDAsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDEsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDYsIDB4MDUsIDB4MDYsIDB4MGIsIDB4MDYsCisJIDB4MDYsIDB4MGIsIDB4MTgsIDB4MTAsIDB4MGUsIDB4MTAsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgMSAqLworCSAweDAwLAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LAorCSAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LAorCSAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LCAweDA5LAorCSAweDAxLAorCSAweDA4LCAweDA5LCAweDA5LCAweDBjLCAweDBhLCAweDBjLCAweDE3LCAweDBkLAorCSAweDBkLCAweDE3LCAweDMxLCAweDIxLCAweDFjLCAweDIxLCAweDMxLCAweDMxLAorCSAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLAorCSAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLAorCSAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLAorCSAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLAorCSAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLAorCSAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDIgKi8KKwkgMHgwMCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwKKwkgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwKKwkgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwKKwkgMHgwNiwgMHgwNiwgMHgwNiwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwKKwkgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwKKwkgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwKKwkgMHgwMSwKKwkgMHgwYywgMHgwZCwgMHgwZCwgMHgxMiwgMHgwZiwgMHgxMiwgMHgyMywgMHgxMywKKwkgMHgxMywgMHgyMywgMHg0YSwgMHgzMSwgMHgyYSwgMHgzMSwgMHg0YSwgMHg0YSwKKwkgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwKKwkgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwKKwkgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwKKwkgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwKKwkgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwKKwkgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwgMHg0YSwKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSAzICovCisJIDB4MDAsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCisJIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCisJIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCisJIDB4MDgsIDB4MDgsIDB4MDgsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisJIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisJIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsCisJIDB4MDEsCisJIDB4MTEsIDB4MTIsIDB4MTIsIDB4MTgsIDB4MTUsIDB4MTgsIDB4MmYsIDB4MWEsCisJIDB4MWEsIDB4MmYsIDB4NjMsIDB4NDIsIDB4MzgsIDB4NDIsIDB4NjMsIDB4NjMsCisJIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgNCAqLworCSAweDAwLAorCSAweDA0LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LAorCSAweDA1LCAweDA1LCAweDBhLCAweDBhLCAweDBhLCAweDA1LCAweDA1LCAweDA1LAorCSAweDA1LCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLAorCSAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLAorCSAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLAorCSAweDBhLCAweDBhLCAweDBhLCAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDE3LAorCSAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDE3LAorCSAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDE3LAorCSAweDAxLAorCSAweDExLCAweDE2LCAweDE2LCAweDFlLCAweDFhLCAweDFlLCAweDNhLCAweDIwLAorCSAweDIwLCAweDNhLCAweDdiLCAweDUyLCAweDQ2LCAweDUyLCAweDdiLCAweDdiLAorCSAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLAorCSAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLAorCSAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLAorCSAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLAorCSAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLAorCSAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLCAweDdiLAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDUgKi8KKwkgMHgwMCwKKwkgMHgwNCwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwKKwkgMHgwNiwgMHgwNiwgMHgwYywgMHgwYywgMHgwYywgMHgwNiwgMHgwNiwgMHgwNiwKKwkgMHgwNiwgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywKKwkgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywKKwkgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywKKwkgMHgwYywgMHgwYywgMHgwYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywKKwkgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywKKwkgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywKKwkgMHgwMSwKKwkgMHgxMSwgMHgxYiwgMHgxYiwgMHgyNCwgMHgxZiwgMHgyNCwgMHg0NiwgMHgyNywKKwkgMHgyNywgMHg0NiwgMHg5NCwgMHg2MywgMHg1NCwgMHg2MywgMHg5NCwgMHg5NCwKKwkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwKKwkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwKKwkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwKKwkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwKKwkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwKKwkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSA2ICovCisJIDB4MDAsCisJIDB4MDUsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsCisJIDB4MDcsIDB4MDcsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MDcsIDB4MDcsIDB4MDcsCisJIDB4MDcsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsCisJIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsCisJIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsCisJIDB4MGUsIDB4MGUsIDB4MGUsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsCisJIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsCisJIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsCisJIDB4MDEsCisJIDB4MTUsIDB4MWYsIDB4MWYsIDB4MmEsIDB4MjQsIDB4MmEsIDB4NTIsIDB4MmQsCisJIDB4MmQsIDB4NTIsIDB4YWQsIDB4NzMsIDB4NjIsIDB4NzMsIDB4YWQsIDB4YWQsCisJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgNyAqLworCSAweDAwLAorCSAweDA1LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LAorCSAweDA4LCAweDA4LCAweDEwLCAweDEwLCAweDEwLCAweDA4LCAweDA4LCAweDA4LAorCSAweDA4LCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCSAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCSAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCSAweDEwLCAweDEwLCAweDEwLCAweDI2LCAweDI2LCAweDI2LCAweDI2LCAweDI2LAorCSAweDI2LCAweDI2LCAweDI2LCAweDI2LCAweDI2LCAweDI2LCAweDI2LCAweDI2LAorCSAweDI2LCAweDI2LCAweDI2LCAweDI2LCAweDI2LCAweDI2LCAweDI2LCAweDI2LAorCSAweDAxLAorCSAweDE1LCAweDI0LCAweDI0LCAweDMwLCAweDJhLCAweDMwLCAweDVlLCAweDM0LAorCSAweDM0LCAweDVlLCAweGM2LCAweDg0LCAweDcwLCAweDg0LCAweGM2LCAweGM2LAorCSAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCSAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCSAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCSAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCSAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCSAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDggKi8KKwkgMHgwMCwKKwkgMHgwNiwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwKKwkgMHgwYSwgMHgwYSwgMHgxNCwgMHgxNCwgMHgxNCwgMHgwYSwgMHgwYSwgMHgwYSwKKwkgMHgwYSwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwKKwkgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwKKwkgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwKKwkgMHgwMSwKKwkgMHgxOSwgMHgyZCwgMHgyZCwgMHgzYywgMHgzNCwgMHgzYywgMHg3NSwgMHg0MSwKKwkgMHg0MSwgMHg3NSwgMHhmNywgMHhhNSwgMHg4YywgMHhhNSwgMHhmNywgMHhmNywKKwkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywKKwkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywKKwkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywKKwkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywKKwkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywKKwkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSA5ICovCisJIDB4MDAsCisJIDB4MDYsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsCisJIDB4MGMsIDB4MGMsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MGMsIDB4MGMsIDB4MGMsCisJIDB4MGMsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MTgsIDB4MzksIDB4MzksIDB4MzksIDB4MzksIDB4MzksCisJIDB4MzksIDB4MzksIDB4MzksIDB4MzksIDB4MzksIDB4MzksIDB4MzksIDB4MzksCisJIDB4MzksIDB4MzksIDB4MzksIDB4MzksIDB4MzksIDB4MzksIDB4MzksIDB4MzksCisJIDB4MDEsCisJIDB4MTksIDB4MzYsIDB4MzYsIDB4NDgsIDB4M2YsIDB4NDgsIDB4OGQsIDB4NGUsCisJIDB4NGUsIDB4OGQsIDB4ZmYsIDB4YzYsIDB4YTgsIDB4YzYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgMTAgKi8KKwkgMHgwMCwKKwkgMHgwNywgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZSwKKwkgMHgwZSwgMHgwZSwgMHgxYywgMHgxYywgMHgxYywgMHgwZSwgMHgwZSwgMHgwZSwKKwkgMHgwZSwgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywKKwkgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywKKwkgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywKKwkgMHgxYywgMHgxYywgMHgxYywgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwKKwkgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwKKwkgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MiwKKwkgMHgwMSwKKwkgMHgxZCwgMHgzZiwgMHgzZiwgMHg1NCwgMHg0OSwgMHg1NCwgMHhhNCwgMHg1YiwKKwkgMHg1YiwgMHhhNCwgMHhmZiwgMHhlNywgMHhjNCwgMHhlNywgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSAxMSAqLworCSAweDAwLAorCSAweDA3LCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCSAweDEwLCAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDEwLCAweDEwLCAweDEwLAorCSAweDEwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDRjLCAweDRjLCAweDRjLCAweDRjLCAweDRjLAorCSAweDRjLCAweDRjLCAweDRjLCAweDRjLCAweDRjLCAweDRjLCAweDRjLCAweDRjLAorCSAweDRjLCAweDRjLCAweDRjLCAweDRjLCAweDRjLCAweDRjLCAweDRjLCAweDRjLAorCSAweDAxLAorCSAweDFkLCAweDQ4LCAweDQ4LCAweDYwLCAweDU0LCAweDYwLCAweGJjLCAweDY4LAorCSAweDY4LCAweGJjLCAweGZmLCAweGZmLCAweGUwLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDEyICovCisJIDB4MDAsCisJIDB4MDgsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsCisJIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsCisJIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsCisJIDB4MjgsIDB4MjgsIDB4MjgsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsCisJIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsCisJIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsCisJIDB4MDEsCisJIDB4MjIsIDB4NWEsIDB4NWEsIDB4NzgsIDB4NjksIDB4NzgsIDB4ZWIsIDB4ODIsCisJIDB4ODIsIDB4ZWIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgMTMgKi8KKwkgMHgwMCwKKwkgMHgwOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKwkgMHgxOCwgMHgxOCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgxOCwgMHgxOCwgMHgxOCwKKwkgMHgxOCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwKKwkgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwKKwkgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwKKwkgMHgzMCwgMHgzMCwgMHgzMCwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwKKwkgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwKKwkgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwgMHg3MiwKKwkgMHgwMSwKKwkgMHgyMiwgMHg2YywgMHg2YywgMHg5MCwgMHg3ZSwgMHg5MCwgMHhmZiwgMHg5YywKKwkgMHg5YywgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSAxNCAqLworCSAweDAwLAorCSAweDBhLCAweDFjLCAweDFjLCAweDFjLCAweDFjLCAweDFjLCAweDFjLCAweDFjLAorCSAweDFjLCAweDFjLCAweDM4LCAweDM4LCAweDM4LCAweDFjLCAweDFjLCAweDFjLAorCSAweDFjLCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LAorCSAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LAorCSAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM4LAorCSAweDM4LCAweDM4LCAweDM4LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LAorCSAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LAorCSAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg1LAorCSAweDAxLAorCSAweDJhLCAweDdlLCAweDdlLCAweGE4LCAweDkzLCAweGE4LCAweGZmLCAweGI2LAorCSAweGI2LCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDE1ICovCisJIDB4MDAsCisJIDB4MGEsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsCisJIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsCisJIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsCisJIDB4NDAsIDB4NDAsIDB4NDAsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsCisJIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsCisJIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsCisJIDB4MDEsCisJIDB4MmEsIDB4OTAsIDB4OTAsIDB4YzAsIDB4YTgsIDB4YzAsIDB4ZmYsIDB4ZDAsCisJIDB4ZDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgMTYtMzEgKi8KKwkgMHgwMCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwMSwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgdHA2ODEwX2N4X2luaXRfY29tbW9uW10gPSB7CisJezB4MWMsIDB4MDB9LAorCXtUUDY4MDBfUjEwX1NJRl9UWVBFLCAweDAwfSwKKwl7MHg0ZSwgMHgwMH0sCisJezB4NGYsIDB4MDB9LAorCXtUUDY4MDBfUjUwLCAweGZmfSwKKwl7VFA2ODAwX1I1MSwgMHgwM30sCisJezB4MDAsIDB4MDd9LAorCXtUUDY4MDBfUjc5X1FVQUxJVFksIDB4MDN9LAorCXtUUDY4MDBfUjJGX1RJTUlOR19DRkcsIDB4Mzd9LAorCXtUUDY4MDBfUjMwX1NFTlNPUl9DRkcsIDB4MTB9LAorCXtUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDB9LAorCXtUUDY4MDBfUjUyLCAweDQwfSwKKwl7VFA2ODAwX1I1MywgMHg0MH0sCisJe1RQNjgwMF9SNTRfREFSS19DRkcsIDB4NDB9LAorCXtUUDY4MDBfUjMwX1NFTlNPUl9DRkcsIDB4MTh9LAorCXsweDRiLCAweDAwfSwKKwl7VFA2ODAwX1IzRl9GUkFNRV9SQVRFLCAweDgzfSwKKwl7VFA2ODAwX1I3OV9RVUFMSVRZLCAweDA1fSwKKwl7VFA2ODAwX1IyMV9FTkRQXzFfQ1RMLCAweDAwfSwKKwl7MHg3YywgMHgwNH0sCisJezB4MjUsIDB4MTR9LAorCXsweDI2LCAweDBmfSwKKwl7MHg3YiwgMHgxMH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCB0cDY4MTBfb3ZfaW5pdF9jb21tb25bXSA9IHsKKwl7MHgxYywgMHgwMH0sCisJe1RQNjgwMF9SMTBfU0lGX1RZUEUsIDB4MDB9LAorCXsweDRlLCAweDAwfSwKKwl7MHg0ZiwgMHgwMH0sCisJe1RQNjgwMF9SNTAsIDB4ZmZ9LAorCXtUUDY4MDBfUjUxLCAweDAzfSwKKwl7MHgwMCwgMHgwN30sCisJe1RQNjgwMF9SNTIsIDB4NDB9LAorCXtUUDY4MDBfUjUzLCAweDQwfSwKKwl7VFA2ODAwX1I1NF9EQVJLX0NGRywgMHg0MH0sCisJe1RQNjgwMF9SNzlfUVVBTElUWSwgMHgwM30sCisJe1RQNjgwMF9SMkZfVElNSU5HX0NGRywgMHgxN30sCisJe1RQNjgwMF9SMzBfU0VOU09SX0NGRywgMHgxOH0sCisJe1RQNjgwMF9SMjFfRU5EUF8xX0NUTCwgMHgwMH0sCisJe1RQNjgwMF9SM0ZfRlJBTUVfUkFURSwgMHg4Nn0sCisJezB4MjUsIDB4MTh9LAorCXsweDI2LCAweDBmfSwKKwl7MHg3YiwgMHg5MH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCB0cDY4MTBfYnJpZGdlX3N0YXJ0W10gPSB7CisJezB4NTksIDB4ODh9LAorCXsweDVhLCAweDBmfSwKKwl7MHg1YiwgMHg0ZX0sCisJe1RQNjgwMF9SNUNfRURHRV9USFJMRCwgMHg2M30sCisJe1RQNjgwMF9SNURfREVNT1NBSUNfQ0ZHLCAweDAwfSwKKwl7MHgwMywgMHg3Zn0sCisJezB4MDQsIDB4ODB9LAorCXsweDA2LCAweDAwfSwKKwl7MHgwMCwgMHgwMH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCB0cDY4MTBfbGF0ZV9zdGFydFtdID0geworCXsweDdkLCAweDAxfSwKKwl7MHhiMCwgMHgwNH0sCisJezB4YjEsIDB4MDR9LAorCXsweGIyLCAweDA0fSwKKwl7MHhiMywgMHgwNH0sCisJezB4YjQsIDB4MDR9LAorCXsweGI1LCAweDA0fSwKKwl7MHhiNiwgMHgwOH0sCisJezB4YjcsIDB4MDh9LAorCXsweGI4LCAweDA0fSwKKwl7MHhiOSwgMHgwNH0sCisJezB4YmEsIDB4MDR9LAorCXsweGJiLCAweDA0fSwKKwl7MHhiYywgMHgwNH0sCisJezB4YmQsIDB4MDh9LAorCXsweGJlLCAweDA4fSwKKwl7MHhiZiwgMHgwOH0sCisJezB4YzAsIDB4MDR9LAorCXsweGMxLCAweDA0fSwKKwl7MHhjMiwgMHgwOH0sCisJezB4YzMsIDB4MDh9LAorCXsweGM0LCAweDA4fSwKKwl7MHhjNSwgMHgwOH0sCisJezB4YzYsIDB4MDh9LAorCXsweGM3LCAweDEzfSwKKwl7MHhjOCwgMHgwNH0sCisJezB4YzksIDB4MDh9LAorCXsweGNhLCAweDA4fSwKKwl7MHhjYiwgMHgwOH0sCisJezB4Y2MsIDB4MDh9LAorCXsweGNkLCAweDA4fSwKKwl7MHhjZSwgMHgxM30sCisJezB4Y2YsIDB4MTN9LAorCXsweGQwLCAweDA4fSwKKwl7MHhkMSwgMHgwOH0sCisJezB4ZDIsIDB4MDh9LAorCXsweGQzLCAweDA4fSwKKwl7MHhkNCwgMHgwOH0sCisJezB4ZDUsIDB4MTN9LAorCXsweGQ2LCAweDEzfSwKKwl7MHhkNywgMHgxM30sCisJezB4ZDgsIDB4MDh9LAorCXsweGQ5LCAweDA4fSwKKwl7MHhkYSwgMHgwOH0sCisJezB4ZGIsIDB4MDh9LAorCXsweGRjLCAweDEzfSwKKwl7MHhkZCwgMHgxM30sCisJezB4ZGUsIDB4MTN9LAorCXsweGRmLCAweDEzfSwKKwl7MHhlMCwgMHgwOH0sCisJezB4ZTEsIDB4MDh9LAorCXsweGUyLCAweDA4fSwKKwl7MHhlMywgMHgxM30sCisJezB4ZTQsIDB4MTN9LAorCXsweGU1LCAweDEzfSwKKwl7MHhlNiwgMHgxM30sCisJezB4ZTcsIDB4MTN9LAorCXsweGU4LCAweDA4fSwKKwl7MHhlOSwgMHgwOH0sCisJezB4ZWEsIDB4MTN9LAorCXsweGViLCAweDEzfSwKKwl7MHhlYywgMHgxM30sCisJezB4ZWQsIDB4MTN9LAorCXsweGVlLCAweDEzfSwKKwl7MHhlZiwgMHgxM30sCisJezB4N2QsIDB4MDJ9LAorCisJLyogbGF0ZXIgYWZ0ZXIgaXNvYyBzdGFydCAqLworCXsweDdkLCAweDA4fSwKKwl7MHg3ZCwgMHgwMH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBjeDAzNDJfdGltaW5nX3NlcVtdID0geworCXtDWDAzNDJfQ0hBTk5FTF8wXzFfTF9pcnN0LCAweDIwfSwKKwl7Q1gwMzQyX0NIQU5ORUxfMF8yX0xfaXJzdCwgMHgyNH0sCisJe0NYMDM0Ml9DSEFOTkVMXzBfMl9IX2lyc3QsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF8wXzNfTF9pcnN0LCAweDJmfSwKKwl7Q1gwMzQyX0NIQU5ORUxfMF8zX0hfaXJzdCwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzFfMF9MX2l0eCwgMHgwMn0sCisJe0NYMDM0Ml9DSEFOTkVMXzFfMF9IX2l0eCwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzFfMV9MX2l0eCwgMHgyMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzFfMV9IX2l0eCwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzFfMl9MX2l0eCwgMHhlNH0sCisJe0NYMDM0Ml9DSEFOTkVMXzFfMl9IX2l0eCwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzFfM19MX2l0eCwgMHhlZX0sCisJe0NYMDM0Ml9DSEFOTkVMXzFfM19IX2l0eCwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzJfMF9MX2l3bCwgMHgzMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzJfMF9IX2l3bCwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzNfMF9MX2Vuc3AsIDB4MzR9LAorCXtDWDAzNDJfQ0hBTk5FTF8zXzFfTF9lbnNwLCAweGUyfSwKKwl7Q1gwMzQyX0NIQU5ORUxfM18xX0hfZW5zcCwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzNfMl9MX2Vuc3AsIDB4ZjZ9LAorCXtDWDAzNDJfQ0hBTk5FTF8zXzJfSF9lbnNwLCAweDAwfSwKKwl7Q1gwMzQyX0NIQU5ORUxfM18zX0xfZW5zcCwgMHhmNH0sCisJe0NYMDM0Ml9DSEFOTkVMXzNfM19IX2Vuc3AsIDB4MDJ9LAorCXtDWDAzNDJfQ0hBTk5FTF80XzBfTF9zZWxhLCAweDI2fSwKKwl7Q1gwMzQyX0NIQU5ORUxfNF8wX0hfc2VsYSwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzRfMV9MX3NlbGEsIDB4ZTJ9LAorCXtDWDAzNDJfQ0hBTk5FTF80XzFfSF9zZWxhLCAweDAwfSwKKwl7Q1gwMzQyX0NIQU5ORUxfNV8wX0xfaW50bGEsIDB4MjZ9LAorCXtDWDAzNDJfQ0hBTk5FTF81XzFfTF9pbnRsYSwgMHgyOX0sCisJe0NYMDM0Ml9DSEFOTkVMXzVfMl9MX2ludGxhLCAweGYwfSwKKwl7Q1gwMzQyX0NIQU5ORUxfNV8yX0hfaW50bGEsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF81XzNfTF9pbnRsYSwgMHhmM30sCisJe0NYMDM0Ml9DSEFOTkVMXzVfM19IX2ludGxhLCAweDAwfSwKKwl7Q1gwMzQyX0NIQU5ORUxfNl8wX0xfeGFfc2VsX3BvcywgMHgyNH0sCisJe0NYMDM0Ml9DSEFOTkVMXzdfMV9MX2Nkc19wb3MsIDB4MDJ9LAorCXtDWDAzNDJfVElNSU5HX0VOLCAweDAxfSwKK307CisKKy8qIGRlZmluZSB0aGUgSlBFRyBoZWFkZXIgKi8KK3N0YXRpYyB2b2lkIGpwZWdfZGVmaW5lKHU4ICpqcGVnX2hkciwKKwkJCWludCBoZWlnaHQsCisJCQlpbnQgd2lkdGgpCit7CisJbWVtY3B5KGpwZWdfaGRyLCBqcGVnX2hlYWQsIHNpemVvZiBqcGVnX2hlYWQpOworCWpwZWdfaGRyW0pQRUdfSEVJR0hUX09GRlNFVCArIDBdID0gaGVpZ2h0ID4+IDg7CisJanBlZ19oZHJbSlBFR19IRUlHSFRfT0ZGU0VUICsgMV0gPSBoZWlnaHQ7CisJanBlZ19oZHJbSlBFR19IRUlHSFRfT0ZGU0VUICsgMl0gPSB3aWR0aCA+PiA4OworCWpwZWdfaGRyW0pQRUdfSEVJR0hUX09GRlNFVCArIDNdID0gd2lkdGg7Cit9CisKKy8qIHNldCB0aGUgSlBFRyBxdWFsaXR5IGZvciBzZW5zb3Igc29pNzYzYSAqLworc3RhdGljIHZvaWQganBlZ19zZXRfcXVhbCh1OCAqanBlZ19oZHIsCisJCQkgIGludCBxdWFsaXR5KQoreworCWludCBpLCBzYzsKKworCWlmIChxdWFsaXR5IDwgNTApCisJCXNjID0gNTAwMCAvIHF1YWxpdHk7CisJZWxzZQorCQlzYyA9IDIwMCAtIHF1YWxpdHkgKiAyOworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWpwZWdfaGRyW0pQRUdfUVQwX09GRlNFVCArIGldID0KKwkJCShqcGVnX2hlYWRbSlBFR19RVDBfT0ZGU0VUICsgaV0gKiBzYyArIDUwKSAvIDEwMDsKKwkJanBlZ19oZHJbSlBFR19RVDFfT0ZGU0VUICsgaV0gPQorCQkJKGpwZWdfaGVhZFtKUEVHX1FUMV9PRkZTRVQgKyBpXSAqIHNjICsgNTApIC8gMTAwOworCX0KK30KKworc3RhdGljIHZvaWQgcmVnX3coc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCBpbmRleCwgdTggdmFsdWUpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGdzcGNhX2Rldi0+ZGV2OworCWludCByZXQ7CisKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAorCQkJMHgwZSwKKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCXZhbHVlLCBpbmRleCwgTlVMTCwgMCwgNTAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OworCX0KK30KKworLyogdGhlIHJldHVybmVkIHZhbHVlIGlzIGluIGdzcGNhX2Rldi0+dXNiX2J1ZiAqLworc3RhdGljIHZvaWQgcmVnX3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCBpbmRleCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CisJaW50IHJldDsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCisJCQkweDBkLAorCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkwLCBpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCA1MDApOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigicmVnX3IgZXJyICVkXG4iLCByZXQpOworCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWdfd19idWYoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJY29uc3Qgc3RydWN0IGNtZCAqcCwgaW50IGwpCit7CisJZG8geworCQlyZWdfdyhnc3BjYV9kZXYsIHAtPnJlZywgcC0+dmFsKTsKKwkJcCsrOworCX0gd2hpbGUgKC0tbCA+IDApOworfQorCitzdGF0aWMgaW50IGkyY193KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTggaW5kZXgsIHU4IHZhbHVlKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMV9TSUZfQ09OVFJPTCwgMHgwMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE5X1NJRl9BRERSX1MyLCBpbmRleCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEzX1NJRl9UWF9EQVRBLCB2YWx1ZSk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjExX1NJRl9DT05UUk9MLCAweDAxKTsKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKQorCQlyZXR1cm4gMDsKKwltc2xlZXAoNSk7CisJcmVnX3IoZ3NwY2FfZGV2LCBUUDY4MDBfUjExX1NJRl9DT05UUk9MKTsKKwlpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzBdID09IDApCisJCXJldHVybiAwOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMV9TSUZfQ09OVFJPTCwgMHgwMCk7CisJcmV0dXJuIC0xOwkJCQkvKiBlcnJvciAqLworfQorCitzdGF0aWMgdm9pZCBpMmNfd19idWYoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJY29uc3Qgc3RydWN0IGNtZCAqcCwgaW50IGwpCit7CisJZG8geworCQlpMmNfdyhnc3BjYV9kZXYsIHAtPnJlZywgcC0+dmFsKTsKKwkJcCsrOworCX0gd2hpbGUgKC0tbCA+IDApOworfQorCitzdGF0aWMgaW50IGkyY19yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTggaW5kZXgsIGludCBsZW4pCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCB2OworCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE5X1NJRl9BRERSX1MyLCBpbmRleCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjExX1NJRl9DT05UUk9MLCAweDAyKTsKKwltc2xlZXAoNSk7CisJcmVnX3IoZ3NwY2FfZGV2LCBUUDY4MDBfUjE0X1NJRl9SWF9EQVRBKTsKKwl2ID0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOworCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApCisJCXJldHVybiB2OworCWlmIChsZW4gPiAxKSB7CisJCXJlZ19yKGdzcGNhX2RldiwgVFA2ODAwX1IxQl9TSUZfUlhfREFUQTIpOworCQl2IHw9IChnc3BjYV9kZXYtPnVzYl9idWZbMF0gPDwgOCk7CisJfQorCXJlZ19yKGdzcGNhX2RldiwgVFA2ODAwX1IxMV9TSUZfQ09OVFJPTCk7CisJaWYgKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9PSAwKQorCQlyZXR1cm4gdjsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTFfU0lGX0NPTlRST0wsIDB4MDApOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgYnVsa193KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJICB1OCB0YWcsCisJCSAgY29uc3QgdTggKmRhdGEsCisJCSAgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CisJaW50IGNvdW50LCBhY3R1YWxfY291bnQsIHJldDsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisJZm9yICg7OykgeworCQljb3VudCA9IGxlbmd0aCA+IEJVTEtfT1VUX1NJWkUgLSAxCisJCQkJPyBCVUxLX09VVF9TSVpFIC0gMSA6IGxlbmd0aDsKKwkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gdGFnOworCQltZW1jcHkoJmdzcGNhX2Rldi0+dXNiX2J1ZlsxXSwgZGF0YSwgY291bnQpOworCQlyZXQgPSB1c2JfYnVsa19tc2coZGV2LAorCQkJCSAgIHVzYl9zbmRidWxrcGlwZShkZXYsIDMpLAorCQkJCSAgIGdzcGNhX2Rldi0+dXNiX2J1ZiwgY291bnQgKyAxLAorCQkJCSAgICZhY3R1YWxfY291bnQsIDUwMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoImJ1bGsgd3JpdGUgZXJyb3IgJWQgdGFnPSUwMnhcbiIsCisJCQkJcmV0LCB0YWcpOworCQkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OworCQkJcmV0dXJuOworCQl9CisJCWxlbmd0aCAtPSBjb3VudDsKKwkJaWYgKGxlbmd0aCA8PSAwKQorCQkJYnJlYWs7CisJCWRhdGEgKz0gY291bnQ7CisJfQorfQorCitzdGF0aWMgaW50IHByb2JlXzY4MTAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXU4IGdwaW87CisJaW50IHJldDsKKworCXJlZ19yKGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEpOworCWdwaW8gPSBnc3BjYV9kZXYtPnVzYl9idWZbMF07CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3Bpbyk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3BpbyB8IDB4MjApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8pOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMF9TSUZfVFlQRSwgMHgwNCk7CS8qIGkyYyAxNiBiaXRzICovCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEyX1NJRl9BRERSX1MsIDB4MjEpOwkvKiBvdj8/PyAqLworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxQV9TSUZfVFhfREFUQTIsIDB4MDApOworCWlmIChpMmNfdyhnc3BjYV9kZXYsIDB4MDAsIDB4MDApID49IDApCisJCXJldHVybiBTRU5TT1JfU09JNzYzQTsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTBfU0lGX1RZUEUsIDB4MDApOwkvKiBpMmMgOCBiaXRzICovCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEyX1NJRl9BRERSX1MsIDB4N2YpOwkvKiAodW5rbm93biBpMmMpICovCisJaWYgKGkyY193KGdzcGNhX2RldiwgMHgwMCwgMHgwMCkgPj0gMCkKKwkJcmV0dXJuIC0yOworCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3BpbyB8IDB4MjApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8pOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTBfU0lGX1RZUEUsIDB4MDApOwkvKiBpMmMgOCBiaXRzICovCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEyX1NJRl9BRERSX1MsIDB4MTEpOwkvKiB0YXM/Pz8gLyBodj8/PyAqLworCXJldCA9IGkyY19yKGdzcGNhX2RldiwgMHgwMCwgMSk7CisJaWYgKHJldCA+IDApCisJCXJldHVybiAtMzsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvIHwgMHgyMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEyX1NJRl9BRERSX1MsIDB4NmUpOwkvKiBwbz8/PyAqLworCXJldCA9IGkyY19yKGdzcGNhX2RldiwgMHgwMCwgMSk7CisJaWYgKHJldCA+IDApCisJCXJldHVybiAtNDsKKworCXJldCA9IGkyY19yKGdzcGNhX2RldiwgMHgwMSwgMSk7CisJaWYgKHJldCA+IDApCisJCXJldHVybiAtNTsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvIHwgMHgyMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEwX1NJRl9UWVBFLCAweDA0KTsJLyogaTJjIDE2IGJpdHMgKi8KKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTJfU0lGX0FERFJfUywgMHg1ZCk7CS8qIG1pL210Pz8/ICovCisJcmV0ID0gaTJjX3IoZ3NwY2FfZGV2LCAweDAwLCAyKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0dXJuIC02OworCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3BpbyB8IDB4MjApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8pOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTJfU0lGX0FERFJfUywgMHg1Yyk7CS8qIG1pL210Pz8/ICovCisJcmV0ID0gaTJjX3IoZ3NwY2FfZGV2LCAweDM2LCAyKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0dXJuIC03OworCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3Bpbyk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3BpbyB8IDB4MjApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8pOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDYxKTsJLyogKHVua25vd24gaTJjKSAqLworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxQV9TSUZfVFhfREFUQTIsIDB4MTApOworCWlmIChpMmNfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDApID49IDApCisJCXJldHVybiAtODsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvIHwgMHgyMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEwX1NJRl9UWVBFLCAweDAwKTsJLyogaTJjIDggYml0cyAqLworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDIwKTsJLyogY3gwMzQyICovCisJcmV0ID0gaTJjX3IoZ3NwY2FfZGV2LCAweDAwLCAxKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0dXJuIFNFTlNPUl9DWDAzNDI7CisJcmV0dXJuIC05OworfQorCitzdGF0aWMgdm9pZCBjeDAzNDJfNjgxMF9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCByZWdfaW5pdF8xW10gPSB7CisJCXtUUDY4MDBfUjJGX1RJTUlOR19DRkcsIDB4MmZ9LAorCQl7MHgyNSwgMHgwMn0sCisJCXtUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDB9LAorCQl7VFA2ODAwX1IzRl9GUkFNRV9SQVRFLCAweDgwfSwKKwkJe1RQNjgwMF9SMkZfVElNSU5HX0NGRywgMHgyZn0sCisJCXtUUDY4MDBfUjE4X0dQSU9fREFUQSwgMHhlMX0sCisJCXtUUDY4MDBfUjE4X0dQSU9fREFUQSwgMHhjMX0sCisJCXtUUDY4MDBfUjE4X0dQSU9fREFUQSwgMHhlMX0sCisJCXtUUDY4MDBfUjExX1NJRl9DT05UUk9MLCAweDAwfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHJlZ19pbml0XzJbXSA9IHsKKwkJe1RQNjgwMF9SNzhfRk9STUFULCAweDQ4fSwKKwkJe1RQNjgwMF9SMTFfU0lGX0NPTlRST0wsIDB4MDB9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgc2Vuc29yX2luaXRbXSA9IHsKKwkJe0NYMDM0Ml9PVVRQVVRfQ1RSTCwgMHgwN30sCisJCXtDWDAzNDJfQllQQVNTX01PREUsIDB4NTh9LAorCQl7Q1gwMzQyX0dQWExUSERfTCwgMHgyOH0sCisJCXtDWDAzNDJfUkJQWExUSERfTCwgMHgyOH0sCisJCXtDWDAzNDJfUExBTkVUSERfTCwgMHg1MH0sCisJCXtDWDAzNDJfUExBTkVUSERfSCwgMHgwM30sCisJCXtDWDAzNDJfUkJfR0FQX0wsIDB4ZmZ9LAorCQl7Q1gwMzQyX1JCX0dBUF9ILCAweDA3fSwKKwkJe0NYMDM0Ml9HX0dBUF9MLCAweGZmfSwKKwkJe0NYMDM0Ml9HX0dBUF9ILCAweDA3fSwKKwkJe0NYMDM0Ml9SU1RfT1ZFUkZMT1dfTCwgMHg1Y30sCisJCXtDWDAzNDJfUlNUX09WRVJGTE9XX0gsIDB4MDF9LAorCQl7Q1gwMzQyX0RBVEFfT1ZFUkZMT1dfTCwgMHhmY30sCisJCXtDWDAzNDJfREFUQV9PVkVSRkxPV19ILCAweDAzfSwKKwkJe0NYMDM0Ml9EQVRBX1VOREVSRkxPV19MLCAweDAwfSwKKwkJe0NYMDM0Ml9EQVRBX1VOREVSRkxPV19ILCAweDAwfSwKKwkJe0NYMDM0Ml9TWVNfQ1RSTF8wLCAweDQwfSwKKwkJe0NYMDM0Ml9HTE9CQUxfR0FJTiwgMHgwMX0sCisJCXtDWDAzNDJfQ0xPQ0tfR0VOLCAweDAwfSwKKwkJe0NYMDM0Ml9TWVNfQ1RSTF8wLCAweDAyfSwKKwkJe0NYMDM0Ml9JRExFX0NUUkwsIDB4MDV9LAorCQl7Q1gwMzQyX0FEQ0dOLCAweDAwfSwKKwkJe0NYMDM0Ml9BRENfQ1RMLCAweDAwfSwKKwkJe0NYMDM0Ml9MVlJTVF9CTEJJQVMsIDB4MDF9LAorCQl7Q1gwMzQyX1ZUSFNFTCwgMHgwYn0sCisJCXtDWDAzNDJfUkFNUF9SSVYsIDB4MGJ9LAorCQl7Q1gwMzQyX0xET1NFTCwgMHgwN30sCisJCXtDWDAzNDJfU1BWX1ZBTFVFX0wsIDB4NDB9LAorCQl7Q1gwMzQyX1NQVl9WQUxVRV9ILCAweDAyfSwKKworCQl7Q1gwMzQyX0FVVE9fQURDX0NBTElCLCAweDgxfSwKKwkJe0NYMDM0Ml9USU1JTkdfRU4sIDB4MDF9LAorCX07CisKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCByZWdfaW5pdF8xLCBBUlJBWV9TSVpFKHJlZ19pbml0XzEpKTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCB0cDY4MTBfY3hfaW5pdF9jb21tb24sCisJCQlBUlJBWV9TSVpFKHRwNjgxMF9jeF9pbml0X2NvbW1vbikpOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIHJlZ19pbml0XzIsIEFSUkFZX1NJWkUocmVnX2luaXRfMikpOworCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEyX1NJRl9BRERSX1MsIDB4MjApOwkvKiBjeDAzNDIgSTJDIGFkZHIgKi8KKwlpMmNfd19idWYoZ3NwY2FfZGV2LCBzZW5zb3JfaW5pdCwgQVJSQVlfU0laRShzZW5zb3JfaW5pdCkpOworCWkyY193X2J1Zihnc3BjYV9kZXYsIGN4MDM0Ml90aW1pbmdfc2VxLCBBUlJBWV9TSVpFKGN4MDM0Ml90aW1pbmdfc2VxKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNvaTc2M2FfNjgxMF9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCByZWdfaW5pdF8xW10gPSB7CisJCXtUUDY4MDBfUjJGX1RJTUlOR19DRkcsIDB4MmZ9LAorCQl7VFA2ODAwX1IxOF9HUElPX0RBVEEsIDB4ZTF9LAorCQl7MHgyNSwgMHgwMn0sCisJCXtUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDB9LAorCQl7VFA2ODAwX1IzRl9GUkFNRV9SQVRFLCAweDgwfSwKKwkJe1RQNjgwMF9SMkZfVElNSU5HX0NGRywgMHgyZn0sCisJCXtUUDY4MDBfUjE4X0dQSU9fREFUQSwgMHhjMX0sCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCByZWdfaW5pdF8yW10gPSB7CisJCXtUUDY4MDBfUjc4X0ZPUk1BVCwgMHg1NH0sCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBzZW5zb3JfaW5pdFtdID0geworCQl7MHgwMCwgMHgwMH0sCisJCXsweDAxLCAweDgwfSwKKwkJezB4MDIsIDB4ODB9LAorCQl7MHgwMywgMHg5MH0sCisJCXsweDA0LCAweDIwfSwKKwkJezB4MDUsIDB4MjB9LAorCQl7MHgwNiwgMHg4MH0sCisJCXsweDA3LCAweDAwfSwKKwkJezB4MDgsIDB4ZmZ9LAorCQl7MHgwOSwgMHhmZn0sCisJCXsweDBhLCAweDc2fSwJCS8qIDc2MzAgPSBzb2k2NzNhICovCisJCXsweDBiLCAweDMwfSwKKwkJezB4MGMsIDB4MjB9LAorCQl7MHgwZCwgMHgyMH0sCisJCXsweDBlLCAweGZmfSwKKwkJezB4MGYsIDB4ZmZ9LAorCQl7MHgxMCwgMHg0MX0sCisJCXsweDE1LCAweDE0fSwKKwkJezB4MTEsIDB4NDB9LAorCQl7MHgxMiwgMHg0OH0sCisJCXsweDEzLCAweDgwfSwKKwkJezB4MTQsIDB4ODB9LAorCQl7MHgxNiwgMHgwM30sCisJCXsweDI4LCAweGIwfSwKKwkJezB4NzEsIDB4MjB9LAorCQl7MHg3NSwgMHg4ZX0sCisJCXsweDE3LCAweDFifSwKKwkJezB4MTgsIDB4YmR9LAorCQl7MHgxOSwgMHgwNX0sCisJCXsweDFhLCAweGY2fSwKKwkJezB4MWIsIDB4MDR9LAorCQl7MHgxYywgMHg3Zn0sCQkvKiBvbW5pdmlzaW9uICovCisJCXsweDFkLCAweGEyfSwKKwkJezB4MWUsIDB4MDB9LAorCQl7MHgxZiwgMHgwMH0sCisJCXsweDIwLCAweDQ1fSwKKwkJezB4MjEsIDB4ODB9LAorCQl7MHgyMiwgMHg4MH0sCisJCXsweDIzLCAweGVlfSwKKwkJezB4MjQsIDB4NTB9LAorCQl7MHgyNSwgMHg3YX0sCisJCXsweDI2LCAweGEwfSwKKwkJezB4MjcsIDB4OWF9LAorCQl7MHgyOSwgMHgzMH0sCisJCXsweDJhLCAweDgwfSwKKwkJezB4MmIsIDB4MDB9LAorCQl7MHgyYywgMHhhY30sCisJCXsweDJkLCAweDA1fSwKKwkJezB4MmUsIDB4ODB9LAorCQl7MHgyZiwgMHgzY30sCisJCXsweDMwLCAweDIyfSwKKwkJezB4MzEsIDB4MDB9LAorCQl7MHgzMiwgMHg4Nn0sCisJCXsweDMzLCAweDA4fSwKKwkJezB4MzQsIDB4ZmZ9LAorCQl7MHgzNSwgMHhmZn0sCisJCXsweDM2LCAweGZmfSwKKwkJezB4MzcsIDB4ZmZ9LAorCQl7MHgzOCwgMHhmZn0sCisJCXsweDM5LCAweGZmfSwKKwkJezB4M2EsIDB4ZmV9LAorCQl7MHgzYiwgMHhmZX0sCisJCXsweDNjLCAweGZlfSwKKwkJezB4M2QsIDB4ZmV9LAorCQl7MHgzZSwgMHhmZX0sCisJCXsweDNmLCAweDcxfSwKKwkJezB4NDAsIDB4ZmZ9LAorCQl7MHg0MSwgMHhmZn0sCisJCXsweDQyLCAweGZmfSwKKwkJezB4NDMsIDB4ZmZ9LAorCQl7MHg0NCwgMHhmZn0sCisJCXsweDQ1LCAweGZmfSwKKwkJezB4NDYsIDB4ZmZ9LAorCQl7MHg0NywgMHhmZn0sCisJCXsweDQ4LCAweGZmfSwKKwkJezB4NDksIDB4ZmZ9LAorCQl7MHg0YSwgMHhmZX0sCisJCXsweDRiLCAweGZmfSwKKwkJezB4NGMsIDB4MDB9LAorCQl7MHg0ZCwgMHgwMH0sCisJCXsweDRlLCAweGZmfSwKKwkJezB4NGYsIDB4ZmZ9LAorCQl7MHg1MCwgMHhmZn0sCisJCXsweDUxLCAweGZmfSwKKwkJezB4NTIsIDB4ZmZ9LAorCQl7MHg1MywgMHhmZn0sCisJCXsweDU0LCAweGZmfSwKKwkJezB4NTUsIDB4ZmZ9LAorCQl7MHg1NiwgMHhmZn0sCisJCXsweDU3LCAweGZmfSwKKwkJezB4NTgsIDB4ZmZ9LAorCQl7MHg1OSwgMHhmZn0sCisJCXsweDVhLCAweGZmfSwKKwkJezB4NWIsIDB4ZmV9LAorCQl7MHg1YywgMHhmZn0sCisJCXsweDVkLCAweDhmfSwKKwkJezB4NWUsIDB4ZmZ9LAorCQl7MHg1ZiwgMHg4Zn0sCisJCXsweDYwLCAweGEyfSwKKwkJezB4NjEsIDB4NGF9LAorCQl7MHg2MiwgMHhmM30sCisJCXsweDYzLCAweDc1fSwKKwkJezB4NjQsIDB4ZjB9LAorCQl7MHg2NSwgMHgwMH0sCisJCXsweDY2LCAweDU1fSwKKwkJezB4NjcsIDB4OTJ9LAorCQl7MHg2OCwgMHhhMH0sCisJCXsweDY5LCAweDRhfSwKKwkJezB4NmEsIDB4MjJ9LAorCQl7MHg2YiwgMHgwMH0sCisJCXsweDZjLCAweDMzfSwKKwkJezB4NmQsIDB4NDR9LAorCQl7MHg2ZSwgMHgyMn0sCisJCXsweDZmLCAweDg0fSwKKwkJezB4NzAsIDB4MGJ9LAorCQl7MHg3MiwgMHgxMH0sCisJCXsweDczLCAweDUwfSwKKwkJezB4NzQsIDB4MjF9LAorCQl7MHg3NiwgMHgwMH0sCisJCXsweDc3LCAweGE1fSwKKwkJezB4NzgsIDB4ODB9LAorCQl7MHg3OSwgMHg4MH0sCisJCXsweDdhLCAweDgwfSwKKwkJezB4N2IsIDB4ZTJ9LAorCQl7MHg3YywgMHgwMH0sCisJCXsweDdkLCAweGY3fSwKKwkJezB4N2UsIDB4MDB9LAorCQl7MHg3ZiwgMHgwMH0sCisJfTsKKworCXJlZ193X2J1Zihnc3BjYV9kZXYsIHJlZ19pbml0XzEsIEFSUkFZX1NJWkUocmVnX2luaXRfMSkpOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIHRwNjgxMF9vdl9pbml0X2NvbW1vbiwKKwkJCUFSUkFZX1NJWkUodHA2ODEwX292X2luaXRfY29tbW9uKSk7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgcmVnX2luaXRfMiwgQVJSQVlfU0laRShyZWdfaW5pdF8yKSk7CisKKwlpMmNfdyhnc3BjYV9kZXYsIDB4MTIsIDB4ODApOwkJLyogc2Vuc29yIHJlc2V0ICovCisJbXNsZWVwKDEwKTsKKwlpMmNfd19idWYoZ3NwY2FfZGV2LCBzZW5zb3JfaW5pdCwgQVJSQVlfU0laRShzZW5zb3JfaW5pdCkpOworfQorCisvKiBzZXQgdGhlIGdhaW4gYW5kIGV4cG9zdXJlICovCitzdGF0aWMgdm9pZCBzZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX0NYMDM0MikgeworCQlpbnQgZXhwbzsKKworCQlleHBvID0gKHNkLT5jdHJsc1tFWFBPU1VSRV0udmFsIDw8IDIpIC0gMTsKKwkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfRVhQT19MSU5FX0wsIGV4cG8pOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9FWFBPX0xJTkVfSCwgZXhwbyA+PiA4KTsKKwkJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCkKKwkJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1JBV19HQkdBSU5fSCwKKwkJCQkJCXNkLT5jdHJsc1tHQUlOXS52YWwgPj4gOCk7CisJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1JBV19HQkdBSU5fTCwgc2QtPmN0cmxzW0dBSU5dLnZhbCk7CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApCisJCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9SQVdfR1JHQUlOX0gsCisJCQkJCQlzZC0+Y3RybHNbR0FJTl0udmFsID4+IDgpOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9SQVdfR1JHQUlOX0wsIHNkLT5jdHJsc1tHQUlOXS52YWwpOworCQlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKQorCQkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfUkFXX0JHQUlOX0gsCisJCQkJCQlzZC0+Y3RybHNbQkdBSU5dLnZhbCA+PiA4KTsKKwkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfUkFXX0JHQUlOX0wsIHNkLT5jdHJsc1tCR0FJTl0udmFsKTsKKwkJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCkKKwkJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1JBV19SR0FJTl9ILAorCQkJCQkJc2QtPmN0cmxzW1JHQUlOXS52YWwgPj4gOCk7CisJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1JBV19SR0FJTl9MLCBzZC0+Y3RybHNbUkdBSU5dLnZhbCk7CisJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1NZU19DVFJMXzAsCisJCQkJc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwID8gMHg4MCA6IDB4ODEpOworCQlyZXR1cm47CisJfQorCisJLyogc29pNzYzYSAqLworCWkyY193KGdzcGNhX2RldiwgMHgxMCwJCS8qIEFFQ19IIChleHBvc3VyZSB0aW1lKSAqLworCQkJIHNkLT5jdHJsc1tFWFBPU1VSRV0udmFsKTsKKy8qCWkyY193KGdzcGNhX2RldiwgMHg3NiwgMHgwMik7CSAqIEFFQ19MIChbMTowXSAqLworCWkyY193KGdzcGNhX2RldiwgMHgwMCwJCS8qIGdhaW4gKi8KKwkJCSBzZC0+Y3RybHNbR0FJTl0udmFsKTsKK30KKworLyogc2V0IHRoZSBKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgKi8KK3N0YXRpYyB2b2lkIHNldF9kcXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCBxKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCS8qIHVwZGF0ZSB0aGUganBlZyBxdWFudGl6YXRpb24gdGFibGVzICovCisJUERFQlVHKERfU1RSRUFNLCAicSAlZCAtPiAlZCIsIHNkLT5xdWFsaXR5LCBxKTsKKwlzZC0+cXVhbGl0eSA9IHE7CisJaWYgKHEgPiAxNikKKwkJcSA9IDE2OworCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9TT0k3NjNBKQorCQlqcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwganBlZ19xW3FdKTsKKwllbHNlCisJCW1lbWNweSgmc2QtPmpwZWdfaGRyW0pQRUdfUVQwX09GRlNFVCAtIDFdLAorCQkJRFFUW3FdLCBzaXplb2YgRFFUWzBdKTsKK30KKworLyogc2V0IHRoZSBKUEVHIGNvbXByZXNzaW9uIHF1YWxpdHkgZmFjdG9yICovCitzdGF0aWMgdm9pZCBzZXRxdWFsaXR5KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTE2IHE7CisKKwlxID0gc2QtPmN0cmxzW1FVQUxJVFldLnZhbDsKKwlpZiAocSAhPSAxNikKKwkJcSA9IDE1IC0gcTsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I3QV9CTEtfVEhSTEQsIDB4MDApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I3OV9RVUFMSVRZLCAweDA0KTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNzlfUVVBTElUWSwgcSk7CisKKwkvKiBhdXRvIHF1YWxpdHkgKi8KKwlpZiAocSA9PSAxNSAmJiBzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MTApIHsKKwkJbXNsZWVwKDQpOworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SN0FfQkxLX1RIUkxELCAweDE5KTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCB1OCBjb2xvcl9udWxsWzE4XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKK3N0YXRpYyBjb25zdCB1OCBjb2xvcl9nYWluW05TRU5TT1JTXVsxOF0gPSB7CitbU0VOU09SX0NYMDM0Ml0gPQorCXsweDRjLCAweDAwLCAweGE5LCAweDAwLCAweDMxLCAweDAwLAkvKiBZIFIvRy9CIChMRSB2YWx1ZXMpICovCisJIDB4YjYsIDB4MDMsIDB4NmMsIDB4MDMsIDB4ZTAsIDB4MDAsCS8qIFUgUi9HL0IgKi8KKwkgMHhkZiwgMHgwMCwgMHg0NiwgMHgwMywgMHhkYywgMHgwM30sCS8qIFYgUi9HL0IgKi8KK1tTRU5TT1JfU09JNzYzQV0gPQorCXsweDRjLCAweDAwLCAweDk1LCAweDAwLCAweDFkLCAweDAwLAkvKiBZIFIvRy9CIChMRSB2YWx1ZXMpICovCisJIDB4YjYsIDB4MDMsIDB4NmMsIDB4MDMsIDB4ZDcsIDB4MDAsCS8qIFUgUi9HL0IgKi8KKwkgMHhkNSwgMHgwMCwgMHg0NiwgMHgwMywgMHhkYywgMHgwM30sCS8qIFYgUi9HL0IgKi8KK307CisKK3N0YXRpYyB2b2lkIHNldGdhbW1hKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IGdhbW1hOworI2RlZmluZSBOR0FNTUEgNgorCXN0YXRpYyBjb25zdCB1OCBnYW1tYV90YltOR0FNTUFdWzNdWzEwMjRdID0geworCSAgICB7CQkJCS8qIGdhbW1hIDAgLSBmcm9tIHRwNjgwMCArIHNvaTc2M2EgKi8KKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAyLAorCQkgMHgwMiwgMHgwMywgMHgwNSwgMHgwNywgMHgwNywgMHgwOCwgMHgwOSwgMHgwOSwKKwkJIDB4MGEsIDB4MGMsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGUsIDB4MTAsIDB4MTEsCisJCSAweDExLCAweDEyLCAweDE0LCAweDE0LCAweDE1LCAweDE2LCAweDE2LCAweDE3LAorCQkgMHgxNywgMHgxOCwgMHgxYSwgMHgxYSwgMHgxYiwgMHgxYiwgMHgxYywgMHgxZSwKKwkJIDB4MWUsIDB4MWYsIDB4MWYsIDB4MjAsIDB4MjAsIDB4MjIsIDB4MjMsIDB4MjMsCisJCSAweDI1LCAweDI1LCAweDI2LCAweDI2LCAweDI3LCAweDI3LCAweDI4LCAweDI4LAorCQkgMHgyOSwgMHgyOSwgMHgyYiwgMHgyYywgMHgyYywgMHgyZCwgMHgyZCwgMHgyZiwKKwkJIDB4MmYsIDB4MzAsIDB4MzAsIDB4MzEsIDB4MzEsIDB4MzMsIDB4MzMsIDB4MzQsCisJCSAweDM0LCAweDM0LCAweDM1LCAweDM1LCAweDM3LCAweDM3LCAweDM4LCAweDM4LAorCQkgMHgzOSwgMHgzOSwgMHgzYSwgMHgzYSwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYywKKwkJIDB4M2MsIDB4M2QsIDB4M2QsIDB4M2YsIDB4M2YsIDB4NDAsIDB4NDAsIDB4NDAsCisJCSAweDQyLCAweDQyLCAweDQzLCAweDQzLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ1LAorCQkgMHg0NSwgMHg0NywgMHg0NywgMHg0NywgMHg0OCwgMHg0OCwgMHg0OSwgMHg0OSwKKwkJIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGIsIDB4NGIsIDB4NGIsIDB4NGMsIDB4NGMsCisJCSAweDRkLCAweDRkLCAweDRkLCAweDRmLCAweDRmLCAweDUwLCAweDUwLCAweDUwLAorCQkgMHg1MiwgMHg1MiwgMHg1MiwgMHg1MywgMHg1MywgMHg1NCwgMHg1NCwgMHg1NCwKKwkJIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTgsIDB4NTgsIDB4NTgsCisJCSAweDU5LCAweDU5LCAweDU5LCAweDVhLCAweDVhLCAweDVhLCAweDViLCAweDViLAorCQkgMHg1YiwgMHg1YywgMHg1YywgMHg1YywgMHg1ZSwgMHg1ZSwgMHg1ZSwgMHg1ZiwKKwkJIDB4NWYsIDB4NWYsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjEsIDB4NjEsIDB4NjEsCisJCSAweDYyLCAweDYyLCAweDYyLCAweDYzLCAweDYzLCAweDYzLCAweDY1LCAweDY1LAorCQkgMHg2NSwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg2NywgMHg2NywgMHg2OCwKKwkJIDB4NjgsIDB4NjgsIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NmEsIDB4NmEsCisJCSAweDZhLCAweDZjLCAweDZjLCAweDZjLCAweDZkLCAweDZkLCAweDZkLCAweDZlLAorCQkgMHg2ZSwgMHg2ZSwgMHg2ZSwgMHg2ZiwgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MCwKKwkJIDB4NzAsIDB4NzEsIDB4NzEsIDB4NzEsIDB4NzEsIDB4NzMsIDB4NzMsIDB4NzMsCisJCSAweDc0LCAweDc0LCAweDc0LCAweDc0LCAweDc1LCAweDc1LCAweDc1LCAweDc3LAorCQkgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwKKwkJIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsCisJCSAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLAorCQkgMHg3ZCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkJIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsCisJCSAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg2LAorCQkgMHg4NiwgMHg4NiwgMHg4NiwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwKKwkJIDB4ODksIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGIsCisJCSAweDhiLCAweDhiLCAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhkLCAweDhlLAorCQkgMHg4ZSwgMHg4ZSwgMHg4ZSwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg5MCwKKwkJIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJCSAweDkyLCAweDkyLCAweDkyLCAweDkyLCAweDkzLCAweDkzLCAweDkzLCAweDkzLAorCQkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NiwKKwkJIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsCisJCSAweDk4LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlhLCAweDlhLAorCQkgMHg5YSwgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywKKwkJIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWUsCisJCSAweDllLCAweDllLCAweDllLCAweDllLCAweGEwLCAweGEwLCAweGEwLCAweGEwLAorCQkgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMiwgMHhhMiwgMHhhMiwKKwkJIDB4YTIsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsCisJCSAweGE0LCAweGE0LCAweGE0LCAweGE1LCAweGE1LCAweGE1LCAweGE1LCAweGE2LAorCQkgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOCwKKwkJIDB4YTgsIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YWIsIDB4YWIsIDB4YWIsCisJCSAweGFiLCAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFkLAorCQkgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwKKwkJIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsCisJCSAweGIwLCAweGIwLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIyLAorCQkgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiMywKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsCisJCSAweGI2LCAweGI2LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI4LAorCQkgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwKKwkJIDB4YjksIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmMsIDB4YmMsCisJCSAweGJjLCAweGJjLCAweGJjLCAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJkLAorCQkgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZiwgMHhiZiwgMHhiZiwKKwkJIDB4YmYsIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsCisJCSAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMzLCAweGMzLCAweGMzLCAweGMzLAorCQkgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNSwgMHhjNSwKKwkJIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCisJCSAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM5LCAweGM5LCAweGM5LAorCQkgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAweGNjLCAweGNjLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNlLAorCQkgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwKKwkJIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDEsCisJCSAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQzLCAweGQzLCAweGQzLCAweGQzLAorCQkgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNiwgMHhkNiwKKwkJIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsCisJCSAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LAorCQkgMHhkOSwgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsCisJCSAweGRkLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRmLAorCQkgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsCisJCSAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLAorCQkgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTcsCisJCSAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU4LCAweGU4LCAweGU4LCAweGU4LAorCQkgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlYiwgMHhlYiwgMHhlYiwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWQsCisJCSAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVlLCAweGVlLCAweGVlLCAweGVlLAorCQkgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwgMHhmMCwKKwkJIDB4ZjAsIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjMsCisJCSAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGY0LCAweGY0LCAweGY0LCAweGY0LAorCQkgMHhmNCwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZifSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAyLAorCQkgMHgwMiwgMHgwMywgMHgwNSwgMHgwNywgMHgwNywgMHgwOCwgMHgwOSwgMHgwOSwKKwkJIDB4MGEsIDB4MGMsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGUsIDB4MTAsIDB4MTEsCisJCSAweDExLCAweDEyLCAweDE0LCAweDE0LCAweDE1LCAweDE2LCAweDE2LCAweDE3LAorCQkgMHgxNywgMHgxOCwgMHgxYSwgMHgxYSwgMHgxYiwgMHgxYiwgMHgxYywgMHgxZSwKKwkJIDB4MWUsIDB4MWYsIDB4MWYsIDB4MjAsIDB4MjAsIDB4MjIsIDB4MjMsIDB4MjMsCisJCSAweDI1LCAweDI1LCAweDI2LCAweDI2LCAweDI3LCAweDI3LCAweDI4LCAweDI4LAorCQkgMHgyOSwgMHgyOSwgMHgyYiwgMHgyYywgMHgyYywgMHgyZCwgMHgyZCwgMHgyZiwKKwkJIDB4MmYsIDB4MzAsIDB4MzAsIDB4MzEsIDB4MzEsIDB4MzMsIDB4MzMsIDB4MzQsCisJCSAweDM0LCAweDM0LCAweDM1LCAweDM1LCAweDM3LCAweDM3LCAweDM4LCAweDM4LAorCQkgMHgzOSwgMHgzOSwgMHgzYSwgMHgzYSwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYywKKwkJIDB4M2MsIDB4M2QsIDB4M2QsIDB4M2YsIDB4M2YsIDB4NDAsIDB4NDAsIDB4NDAsCisJCSAweDQyLCAweDQyLCAweDQzLCAweDQzLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ1LAorCQkgMHg0NSwgMHg0NywgMHg0NywgMHg0NywgMHg0OCwgMHg0OCwgMHg0OSwgMHg0OSwKKwkJIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGIsIDB4NGIsIDB4NGIsIDB4NGMsIDB4NGMsCisJCSAweDRkLCAweDRkLCAweDRkLCAweDRmLCAweDRmLCAweDUwLCAweDUwLCAweDUwLAorCQkgMHg1MiwgMHg1MiwgMHg1MiwgMHg1MywgMHg1MywgMHg1NCwgMHg1NCwgMHg1NCwKKwkJIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTgsIDB4NTgsIDB4NTgsCisJCSAweDU5LCAweDU5LCAweDU5LCAweDVhLCAweDVhLCAweDVhLCAweDViLCAweDViLAorCQkgMHg1YiwgMHg1YywgMHg1YywgMHg1YywgMHg1ZSwgMHg1ZSwgMHg1ZSwgMHg1ZiwKKwkJIDB4NWYsIDB4NWYsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjEsIDB4NjEsIDB4NjEsCisJCSAweDYyLCAweDYyLCAweDYyLCAweDYzLCAweDYzLCAweDYzLCAweDY1LCAweDY1LAorCQkgMHg2NSwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg2NywgMHg2NywgMHg2OCwKKwkJIDB4NjgsIDB4NjgsIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NmEsIDB4NmEsCisJCSAweDZhLCAweDZjLCAweDZjLCAweDZjLCAweDZkLCAweDZkLCAweDZkLCAweDZlLAorCQkgMHg2ZSwgMHg2ZSwgMHg2ZSwgMHg2ZiwgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MCwKKwkJIDB4NzAsIDB4NzEsIDB4NzEsIDB4NzEsIDB4NzEsIDB4NzMsIDB4NzMsIDB4NzMsCisJCSAweDc0LCAweDc0LCAweDc0LCAweDc0LCAweDc1LCAweDc1LCAweDc1LCAweDc3LAorCQkgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwKKwkJIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsCisJCSAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLAorCQkgMHg3ZCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkJIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsCisJCSAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg2LAorCQkgMHg4NiwgMHg4NiwgMHg4NiwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwKKwkJIDB4ODksIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGIsCisJCSAweDhiLCAweDhiLCAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhkLCAweDhlLAorCQkgMHg4ZSwgMHg4ZSwgMHg4ZSwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg5MCwKKwkJIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJCSAweDkyLCAweDkyLCAweDkyLCAweDkyLCAweDkzLCAweDkzLCAweDkzLCAweDkzLAorCQkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NiwKKwkJIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsCisJCSAweDk4LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlhLCAweDlhLAorCQkgMHg5YSwgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywKKwkJIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWUsCisJCSAweDllLCAweDllLCAweDllLCAweDllLCAweGEwLCAweGEwLCAweGEwLCAweGEwLAorCQkgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMiwgMHhhMiwgMHhhMiwKKwkJIDB4YTIsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsCisJCSAweGE0LCAweGE0LCAweGE0LCAweGE1LCAweGE1LCAweGE1LCAweGE1LCAweGE2LAorCQkgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOCwKKwkJIDB4YTgsIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YWIsIDB4YWIsIDB4YWIsCisJCSAweGFiLCAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFkLAorCQkgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwKKwkJIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsCisJCSAweGIwLCAweGIwLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIyLAorCQkgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiMywKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsCisJCSAweGI2LCAweGI2LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI4LAorCQkgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwKKwkJIDB4YjksIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmMsIDB4YmMsCisJCSAweGJjLCAweGJjLCAweGJjLCAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJkLAorCQkgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZiwgMHhiZiwgMHhiZiwKKwkJIDB4YmYsIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsCisJCSAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMzLCAweGMzLCAweGMzLCAweGMzLAorCQkgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNSwgMHhjNSwKKwkJIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCisJCSAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM5LCAweGM5LCAweGM5LAorCQkgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAweGNjLCAweGNjLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNlLAorCQkgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwKKwkJIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDEsCisJCSAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQzLCAweGQzLCAweGQzLCAweGQzLAorCQkgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNiwgMHhkNiwKKwkJIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsCisJCSAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LAorCQkgMHhkOSwgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsCisJCSAweGRkLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRmLAorCQkgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsCisJCSAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLAorCQkgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTcsCisJCSAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU4LCAweGU4LCAweGU4LCAweGU4LAorCQkgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlYiwgMHhlYiwgMHhlYiwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWQsCisJCSAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVlLCAweGVlLCAweGVlLCAweGVlLAorCQkgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwgMHhmMCwKKwkJIDB4ZjAsIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjMsCisJCSAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGY0LCAweGY0LCAweGY0LCAweGY0LAorCQkgMHhmNCwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZifSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAyLAorCQkgMHgwMiwgMHgwMywgMHgwNSwgMHgwNywgMHgwNywgMHgwOCwgMHgwOSwgMHgwOSwKKwkJIDB4MGEsIDB4MGMsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGUsIDB4MTAsIDB4MTEsCisJCSAweDExLCAweDEyLCAweDE0LCAweDE0LCAweDE1LCAweDE2LCAweDE2LCAweDE3LAorCQkgMHgxNywgMHgxOCwgMHgxYSwgMHgxYSwgMHgxYiwgMHgxYiwgMHgxYywgMHgxZSwKKwkJIDB4MWUsIDB4MWYsIDB4MWYsIDB4MjAsIDB4MjAsIDB4MjIsIDB4MjMsIDB4MjMsCisJCSAweDI1LCAweDI1LCAweDI2LCAweDI2LCAweDI3LCAweDI3LCAweDI4LCAweDI4LAorCQkgMHgyOSwgMHgyOSwgMHgyYiwgMHgyYywgMHgyYywgMHgyZCwgMHgyZCwgMHgyZiwKKwkJIDB4MmYsIDB4MzAsIDB4MzAsIDB4MzEsIDB4MzEsIDB4MzMsIDB4MzMsIDB4MzQsCisJCSAweDM0LCAweDM0LCAweDM1LCAweDM1LCAweDM3LCAweDM3LCAweDM4LCAweDM4LAorCQkgMHgzOSwgMHgzOSwgMHgzYSwgMHgzYSwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYywKKwkJIDB4M2MsIDB4M2QsIDB4M2QsIDB4M2YsIDB4M2YsIDB4NDAsIDB4NDAsIDB4NDAsCisJCSAweDQyLCAweDQyLCAweDQzLCAweDQzLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ1LAorCQkgMHg0NSwgMHg0NywgMHg0NywgMHg0NywgMHg0OCwgMHg0OCwgMHg0OSwgMHg0OSwKKwkJIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGIsIDB4NGIsIDB4NGIsIDB4NGMsIDB4NGMsCisJCSAweDRkLCAweDRkLCAweDRkLCAweDRmLCAweDRmLCAweDUwLCAweDUwLCAweDUwLAorCQkgMHg1MiwgMHg1MiwgMHg1MiwgMHg1MywgMHg1MywgMHg1NCwgMHg1NCwgMHg1NCwKKwkJIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTgsIDB4NTgsIDB4NTgsCisJCSAweDU5LCAweDU5LCAweDU5LCAweDVhLCAweDVhLCAweDVhLCAweDViLCAweDViLAorCQkgMHg1YiwgMHg1YywgMHg1YywgMHg1YywgMHg1ZSwgMHg1ZSwgMHg1ZSwgMHg1ZiwKKwkJIDB4NWYsIDB4NWYsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjEsIDB4NjEsIDB4NjEsCisJCSAweDYyLCAweDYyLCAweDYyLCAweDYzLCAweDYzLCAweDYzLCAweDY1LCAweDY1LAorCQkgMHg2NSwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg2NywgMHg2NywgMHg2OCwKKwkJIDB4NjgsIDB4NjgsIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NmEsIDB4NmEsCisJCSAweDZhLCAweDZjLCAweDZjLCAweDZjLCAweDZkLCAweDZkLCAweDZkLCAweDZlLAorCQkgMHg2ZSwgMHg2ZSwgMHg2ZSwgMHg2ZiwgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MCwKKwkJIDB4NzAsIDB4NzEsIDB4NzEsIDB4NzEsIDB4NzEsIDB4NzMsIDB4NzMsIDB4NzMsCisJCSAweDc0LCAweDc0LCAweDc0LCAweDc0LCAweDc1LCAweDc1LCAweDc1LCAweDc2LAorCQkgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwKKwkJIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsCisJCSAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLAorCQkgMHg3ZCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkJIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsCisJCSAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg2LAorCQkgMHg4NiwgMHg4NiwgMHg4NiwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwKKwkJIDB4ODksIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGIsCisJCSAweDhiLCAweDhiLCAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhkLCAweDhlLAorCQkgMHg4ZSwgMHg4ZSwgMHg4ZSwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg5MCwKKwkJIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisJCSAweDkyLCAweDkyLCAweDkyLCAweDkyLCAweDkzLCAweDkzLCAweDkzLCAweDkzLAorCQkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NiwKKwkJIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsCisJCSAweDk4LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlhLCAweDlhLAorCQkgMHg5YSwgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywKKwkJIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWUsCisJCSAweDllLCAweDllLCAweDllLCAweDllLCAweGEwLCAweGEwLCAweGEwLCAweGEwLAorCQkgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMiwgMHhhMiwgMHhhMiwKKwkJIDB4YTIsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsCisJCSAweGE0LCAweGE0LCAweGE0LCAweGE1LCAweGE1LCAweGE1LCAweGE1LCAweGE2LAorCQkgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOCwKKwkJIDB4YTgsIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YWIsIDB4YWIsIDB4YWIsCisJCSAweGFiLCAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFkLAorCQkgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwKKwkJIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsCisJCSAweGIwLCAweGIwLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIyLAorCQkgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiMywKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsCisJCSAweGI2LCAweGI2LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI4LAorCQkgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwKKwkJIDB4YjksIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmMsIDB4YmMsCisJCSAweGJjLCAweGJjLCAweGJjLCAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJkLAorCQkgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZiwgMHhiZiwgMHhiZiwKKwkJIDB4YmYsIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsCisJCSAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMzLCAweGMzLCAweGMzLCAweGMzLAorCQkgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNSwgMHhjNSwKKwkJIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsCisJCSAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM5LCAweGM5LCAweGM5LAorCQkgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAweGNjLCAweGNjLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNlLAorCQkgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwKKwkJIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDEsCisJCSAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQzLCAweGQzLCAweGQzLCAweGQzLAorCQkgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNiwgMHhkNiwKKwkJIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsCisJCSAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LAorCQkgMHhkOSwgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsCisJCSAweGRkLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRmLAorCQkgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsCisJCSAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLAorCQkgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTcsCisJCSAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU4LCAweGU4LCAweGU4LCAweGU4LAorCQkgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlYiwgMHhlYiwgMHhlYiwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWQsCisJCSAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVlLCAweGVlLCAweGVlLCAweGVlLAorCQkgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwgMHhmMCwKKwkJIDB4ZjAsIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjMsCisJCSAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGY0LCAweGY0LCAweGY0LCAweGY0LAorCQkgMHhmNCwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZifQorCSAgICB9LAorCSAgICB7CQkJCS8qIGdhbW1hIDEgLSBmcm9tIHRwNjgxMCArIHNvaTc2M2EgKi8KKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsCisJCSAweDBjLCAweDBkLCAweDBlLCAweDEwLCAweDExLCAweDEyLCAweDE0LCAweDE1LAorCQkgMHgxNiwgMHgxNywgMHgxOCwgMHgxYSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZSwKKwkJIDB4MWYsIDB4MjAsIDB4MjIsIDB4MjIsIDB4MjMsIDB4MjUsIDB4MjYsIDB4MjcsCisJCSAweDI3LCAweDI4LCAweDI5LCAweDJiLCAweDJiLCAweDJjLCAweDJkLCAweDJmLAorCQkgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMywgMHgzMywgMHgzNCwgMHgzNSwgMHgzNSwKKwkJIDB4MzcsIDB4MzgsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2EsIDB4M2IsIDB4M2MsCisJCSAweDNjLCAweDNkLCAweDNmLCAweDNmLCAweDQwLCAweDQyLCAweDQyLCAweDQzLAorCQkgMHg0MywgMHg0NCwgMHg0NSwgMHg0NSwgMHg0NywgMHg0NywgMHg0OCwgMHg0OSwKKwkJIDB4NDksIDB4NGEsIDB4NGEsIDB4NGIsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGQsCisJCSAweDRmLCAweDRmLCAweDUwLCAweDUwLCAweDUyLCAweDUyLCAweDUzLCAweDUzLAorCQkgMHg1NCwgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NiwgMHg1OCwgMHg1OCwgMHg1OSwKKwkJIDB4NTksIDB4NWEsIDB4NWEsIDB4NWIsIDB4NWIsIDB4NWMsIDB4NWMsIDB4NWUsCisJCSAweDVlLCAweDVlLCAweDVmLCAweDVmLCAweDYwLCAweDYwLCAweDYxLCAweDYxLAorCQkgMHg2MiwgMHg2MiwgMHg2MywgMHg2MywgMHg2NSwgMHg2NSwgMHg2NSwgMHg2NiwKKwkJIDB4NjYsIDB4NjcsIDB4NjcsIDB4NjgsIDB4NjgsIDB4NjksIDB4NjksIDB4NjksCisJCSAweDZhLCAweDZhLCAweDZjLCAweDZjLCAweDZkLCAweDZkLCAweDZkLCAweDZlLAorCQkgMHg2ZSwgMHg2ZiwgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MCwgMHg3MSwgMHg3MSwKKwkJIDB4NzMsIDB4NzMsIDB4NzMsIDB4NzQsIDB4NzQsIDB4NzQsIDB4NzUsIDB4NzUsCisJCSAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LAorCQkgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywgMHg3YywKKwkJIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsCisJCSAweDgxLCAweDgxLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDg0LCAweDg0LAorCQkgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4OCwKKwkJIDB4ODgsIDB4ODgsIDB4ODksIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsIDB4OGEsCisJCSAweDhiLCAweDhiLCAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhlLCAweDhlLAorCQkgMHg4ZSwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MSwKKwkJIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTMsIDB4OTMsCisJCSAweDkzLCAweDk0LCAweDk0LCAweDk0LCAweDk2LCAweDk2LCAweDk2LCAweDk3LAorCQkgMHg5NywgMHg5NywgMHg5NywgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OSwgMHg5OSwKKwkJIDB4OTksIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsCisJCSAweDljLCAweDljLCAweDljLCAweDljLCAweDlkLCAweDlkLCAweDlkLCAweDllLAorCQkgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMSwgMHhhMSwKKwkJIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTMsIDB4YTMsCisJCSAweGEzLCAweGE0LCAweGE0LCAweGE0LCAweGE0LCAweGE1LCAweGE1LCAweGE1LAorCQkgMHhhNSwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOCwKKwkJIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisJCSAweGFjLCAweGFjLCAweGFjLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFlLAorCQkgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwgMHhiMCwKKwkJIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjIsCisJCSAweGIyLCAweGIyLCAweGIyLCAweGIzLCAweGIzLCAweGIzLCAweGIzLCAweGI0LAorCQkgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNywKKwkJIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsCisJCSAweGI5LCAweGI5LCAweGI5LCAweGI5LCAweGJhLCAweGJhLCAweGJhLCAweGJhLAorCQkgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwKKwkJIDB4YmQsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmYsIDB4YmYsIDB4YmYsCisJCSAweGJmLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMyLCAweGMyLAorCQkgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywgMHhjMywgMHhjMywgMHhjNCwgMHhjNCwKKwkJIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzYsCisJCSAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM3LCAweGM3LCAweGM3LCAweGM3LAorCQkgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2MsIDB4Y2MsCisJCSAweGNjLCAweGNjLCAweGNjLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNlLAorCQkgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwKKwkJIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDEsIDB4ZDEsCisJCSAweGQxLCAweGQxLCAweGQzLCAweGQzLCAweGQzLCAweGQzLCAweGQzLCAweGQ0LAorCQkgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwKKwkJIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDgsIDB4ZDgsIDB4ZDgsCisJCSAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGRhLAorCQkgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsCisJCSAweGRlLCAweGRlLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGUwLAorCQkgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwKKwkJIDB4ZTEsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTMsIDB4ZTMsCisJCSAweGUzLCAweGUzLCAweGUzLCAweGU0LCAweGU0LCAweGU0LCAweGU0LCAweGU0LAorCQkgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNiwgMHhlNiwgMHhlNiwKKwkJIDB4ZTYsIDB4ZTYsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTgsCisJCSAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU5LCAweGU5LCAweGU5LCAweGU5LAorCQkgMHhlOSwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYywgMHhlYywKKwkJIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsCisJCSAweGVlLCAweGVlLCAweGVlLCAweGVlLCAweGVlLCAweGVmLCAweGVmLCAweGVmLAorCQkgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwKKwkJIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjMsIDB4ZjMsIDB4ZjMsCisJCSAweGYzLCAweGYzLCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY1LAorCQkgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LAorCQkgMHhmOSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLAorCQkgMHhmYywgMHhmYywgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZSwKKwkJIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCisJCSAweDA1LCAweDA3LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBjLCAweDBkLAorCQkgMHgwZSwgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxNCwgMHgxNSwgMHgxNSwKKwkJIDB4MTYsIDB4MTcsIDB4MTgsIDB4MWEsIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWUsCisJCSAweDFlLCAweDFmLCAweDIwLCAweDIwLCAweDIyLCAweDIzLCAweDI1LCAweDI1LAorCQkgMHgyNiwgMHgyNywgMHgyNywgMHgyOCwgMHgyOSwgMHgyOSwgMHgyYiwgMHgyYywKKwkJIDB4MmMsIDB4MmQsIDB4MmQsIDB4MmYsIDB4MzAsIDB4MzAsIDB4MzEsIDB4MzEsCisJCSAweDMzLCAweDM0LCAweDM0LCAweDM1LCAweDM1LCAweDM3LCAweDM4LCAweDM4LAorCQkgMHgzOSwgMHgzOSwgMHgzYSwgMHgzYSwgMHgzYiwgMHgzYiwgMHgzYywgMHgzZCwKKwkJIDB4M2QsIDB4M2YsIDB4M2YsIDB4NDAsIDB4NDAsIDB4NDIsIDB4NDIsIDB4NDMsCisJCSAweDQzLCAweDQ0LCAweDQ0LCAweDQ1LCAweDQ1LCAweDQ3LCAweDQ3LCAweDQ4LAorCQkgMHg0OCwgMHg0OSwgMHg0OSwgMHg0YSwgMHg0YSwgMHg0YiwgMHg0YiwgMHg0YywKKwkJIDB4NGMsIDB4NGQsIDB4NGQsIDB4NGQsIDB4NGYsIDB4NGYsIDB4NTAsIDB4NTAsCisJCSAweDUyLCAweDUyLCAweDUzLCAweDUzLCAweDUzLCAweDU0LCAweDU0LCAweDU1LAorCQkgMHg1NSwgMHg1NiwgMHg1NiwgMHg1NiwgMHg1OCwgMHg1OCwgMHg1OSwgMHg1OSwKKwkJIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWIsIDB4NWIsIDB4NWMsIDB4NWMsIDB4NWMsCisJCSAweDVlLCAweDVlLCAweDVmLCAweDVmLCAweDVmLCAweDYwLCAweDYwLCAweDYwLAorCQkgMHg2MSwgMHg2MSwgMHg2MiwgMHg2MiwgMHg2MiwgMHg2MywgMHg2MywgMHg2NSwKKwkJIDB4NjUsIDB4NjUsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NjcsIDB4NjcsCisJCSAweDY4LCAweDY4LCAweDY5LCAweDY5LCAweDY5LCAweDZhLCAweDZhLCAweDZhLAorCQkgMHg2YywgMHg2YywgMHg2YywgMHg2ZCwgMHg2ZCwgMHg2ZCwgMHg2ZSwgMHg2ZSwKKwkJIDB4NmUsIDB4NmYsIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzAsIDB4NzAsIDB4NzEsCisJCSAweDcxLCAweDcxLCAweDczLCAweDczLCAweDczLCAweDc0LCAweDc0LCAweDc0LAorCQkgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwKKwkJIDB4NzgsIDB4NzksIDB4NzksIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsCisJCSAweDdiLCAweDdiLCAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdkLAorCQkgMHg3ZCwgMHg3ZCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MCwKKwkJIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsCisJCSAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg2LAorCQkgMHg4NiwgMHg4NiwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg4OSwKKwkJIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGIsIDB4OGIsIDB4OGIsCisJCSAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhkLCAweDhlLCAweDhlLCAweDhlLAorCQkgMHg4ZSwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MCwKKwkJIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsCisJCSAweDkzLCAweDkzLCAweDkzLCAweDkzLCAweDk0LCAweDk0LCAweDk0LCAweDk0LAorCQkgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NywgMHg5NywgMHg5NywgMHg5NywKKwkJIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksIDB4OTksIDB4OTksCisJCSAweDlhLCAweDlhLCAweDlhLCAweDlhLCAweDlhLCAweDliLCAweDliLCAweDliLAorCQkgMHg5YiwgMHg5YywgMHg5YywgMHg5YywgMHg5YywgMHg5ZCwgMHg5ZCwgMHg5ZCwKKwkJIDB4OWQsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4YTAsIDB4YTAsCisJCSAweGEwLCAweGEwLCAweGExLCAweGExLCAweGExLCAweGExLCAweGEyLCAweGEyLAorCQkgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMywgMHhhMywgMHhhMywgMHhhMywgMHhhNCwKKwkJIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisJCSAweGE2LCAweGE2LCAweGE2LCAweGE2LCAweGE2LCAweGE4LCAweGE4LCAweGE4LAorCQkgMHhhOCwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhYiwgMHhhYiwKKwkJIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWQsCisJCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFlLCAweGFlLCAweGFlLCAweGFlLAorCQkgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwKKwkJIDB4YjAsIDB4YjAsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjIsCisJCSAweGIyLCAweGIyLCAweGIyLCAweGIyLCAweGIzLCAweGIzLCAweGIzLCAweGIzLAorCQkgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNiwgMHhiNiwgMHhiNiwKKwkJIDB4YjYsIDB4YjYsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjgsCisJCSAweGI4LCAweGI4LCAweGI4LCAweGI4LCAweGI5LCAweGI5LCAweGI5LCAweGI5LAorCQkgMHhiOSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYywgMHhiYywKKwkJIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsCisJCSAweGJlLCAweGJlLCAweGJlLCAweGJlLCAweGJlLCAweGJlLCAweGJmLCAweGJmLAorCQkgMHhiZiwgMHhiZiwgMHhiZiwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwKKwkJIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzMsIDB4YzMsIDB4YzMsCisJCSAweGMzLCAweGMzLCAweGM0LCAweGM0LCAweGM0LCAweGM0LCAweGM0LCAweGM1LAorCQkgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNiwgMHhjNiwgMHhjNiwKKwkJIDB4YzYsIDB4YzYsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzksCisJCSAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGNhLCAweGNhLCAweGNhLAorCQkgMHhjYSwgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYywKKwkJIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2QsIDB4Y2QsIDB4Y2QsCisJCSAweGNkLCAweGNkLCAweGNlLCAweGNlLCAweGNlLCAweGNlLCAweGNlLCAweGNmLAorCQkgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhkMCwgMHhkMCwgMHhkMCwKKwkJIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsCisJCSAweGQzLCAweGQzLCAweGQzLCAweGQzLCAweGQzLCAweGQ0LCAweGQ0LCAweGQ0LAorCQkgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwKKwkJIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDgsIDB4ZDgsCisJCSAweGQ4LCAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LAorCQkgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwgMHhkYiwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsCisJCSAweGRkLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRmLAorCQkgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsCisJCSAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLCAweGUzLAorCQkgMHhlMywgMHhlMywgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsCisJCSAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LAorCQkgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwgMHhlOSwKKwkJIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJCSAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVkLCAweGVkLAorCQkgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsCisJCSAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYxLCAweGYxLCAweGYxLCAweGYxLAorCQkgMHhmMSwgMHhmMSwgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmNCwKKwkJIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsCisJCSAweGY1LCAweGY1LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY3LAorCQkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwKKwkJIDB4ZjgsIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZmEsCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLAorCQkgMHhmYSwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYywgMHhmYywKKwkJIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsCisJCSAweGZjLCAweGZkLCAweGZkLCAweGZkLCAweGZkLCAweGZkLCAweGZlLCAweGZlLAorCQkgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA1LCAweDA1LCAweDA3LAorCQkgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYSwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZSwKKwkJIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTIsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTYsCisJCSAweDE3LCAweDE4LCAweDE4LCAweDFhLCAweDFiLCAweDFiLCAweDFjLCAweDFlLAorCQkgMHgxZSwgMHgxZiwgMHgxZiwgMHgyMCwgMHgyMiwgMHgyMiwgMHgyMywgMHgyMywKKwkJIDB4MjUsIDB4MjYsIDB4MjYsIDB4MjcsIDB4MjcsIDB4MjgsIDB4MjksIDB4MjksCisJCSAweDJiLCAweDJiLCAweDJjLCAweDJjLCAweDJkLCAweDJkLCAweDJmLCAweDMwLAorCQkgMHgzMCwgMHgzMSwgMHgzMSwgMHgzMywgMHgzMywgMHgzNCwgMHgzNCwgMHgzNSwKKwkJIDB4MzUsIDB4MzcsIDB4MzcsIDB4MzgsIDB4MzgsIDB4MzksIDB4MzksIDB4M2EsCisJCSAweDNhLCAweDNiLCAweDNiLCAweDNiLCAweDNjLCAweDNjLCAweDNkLCAweDNkLAorCQkgMHgzZiwgMHgzZiwgMHg0MCwgMHg0MCwgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MywKKwkJIDB4NDMsIDB4NDQsIDB4NDQsIDB4NDUsIDB4NDUsIDB4NDcsIDB4NDcsIDB4NDcsCisJCSAweDQ4LCAweDQ4LCAweDQ5LCAweDQ5LCAweDQ5LCAweDRhLCAweDRhLCAweDRiLAorCQkgMHg0YiwgMHg0YiwgMHg0YywgMHg0YywgMHg0ZCwgMHg0ZCwgMHg0ZCwgMHg0ZiwKKwkJIDB4NGYsIDB4NTAsIDB4NTAsIDB4NTAsIDB4NTIsIDB4NTIsIDB4NTIsIDB4NTMsCisJCSAweDUzLCAweDU0LCAweDU0LCAweDU0LCAweDU1LCAweDU1LCAweDU1LCAweDU2LAorCQkgMHg1NiwgMHg1OCwgMHg1OCwgMHg1OCwgMHg1OSwgMHg1OSwgMHg1OSwgMHg1YSwKKwkJIDB4NWEsIDB4NWEsIDB4NWIsIDB4NWIsIDB4NWIsIDB4NWMsIDB4NWMsIDB4NWMsCisJCSAweDVlLCAweDVlLCAweDVlLCAweDVmLCAweDVmLCAweDVmLCAweDYwLCAweDYwLAorCQkgMHg2MCwgMHg2MSwgMHg2MSwgMHg2MSwgMHg2MiwgMHg2MiwgMHg2MiwgMHg2MywKKwkJIDB4NjMsIDB4NjMsIDB4NjUsIDB4NjUsIDB4NjUsIDB4NjYsIDB4NjYsIDB4NjYsCisJCSAweDY2LCAweDY3LCAweDY3LCAweDY3LCAweDY4LCAweDY4LCAweDY4LCAweDY5LAorCQkgMHg2OSwgMHg2OSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YywgMHg2YywKKwkJIDB4NmMsIDB4NmQsIDB4NmQsIDB4NmQsIDB4NmQsIDB4NmUsIDB4NmUsIDB4NmUsCisJCSAweDZmLCAweDZmLCAweDZmLCAweDZmLCAweDcwLCAweDcwLCAweDcwLCAweDcxLAorCQkgMHg3MSwgMHg3MSwgMHg3MSwgMHg3MywgMHg3MywgMHg3MywgMHg3NCwgMHg3NCwKKwkJIDB4NzQsIDB4NzQsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzcsIDB4NzcsCisJCSAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LAorCQkgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YiwKKwkJIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2QsIDB4N2QsIDB4N2QsCisJCSAweDdkLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDgwLCAweDgwLCAweDgwLAorCQkgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwKKwkJIDB4ODIsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODUsCisJCSAweDg1LCAweDg2LCAweDg2LCAweDg2LCAweDg2LCAweDg4LCAweDg4LCAweDg4LAorCQkgMHg4OCwgMHg4OCwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4YSwgMHg4YSwKKwkJIDB4OGEsIDB4OGEsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGQsCisJCSAweDhkLCAweDhkLCAweDhkLCAweDhlLCAweDhlLCAweDhlLCAweDhlLCAweDhlLAorCQkgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MCwKKwkJIDB4OTAsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTIsIDB4OTIsCisJCSAweDkyLCAweDkyLCAweDkzLCAweDkzLCAweDkzLCAweDkzLCAweDk0LCAweDk0LAorCQkgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NiwKKwkJIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsCisJCSAweDk4LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDk5LCAweDlhLCAweDlhLAorCQkgMHg5YSwgMHg5YSwgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YiwKKwkJIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWQsIDB4OWQsIDB4OWQsCisJCSAweDlkLCAweDlkLCAweDllLCAweDllLCAweDllLCAweDllLCAweDllLCAweGEwLAorCQkgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMSwKKwkJIDB4YTEsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTMsIDB4YTMsCisJCSAweGEzLCAweGEzLCAweGEzLCAweGE0LCAweGE0LCAweGE0LCAweGE0LCAweGE0LAorCQkgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNiwKKwkJIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisJCSAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGFiLCAweGFiLAorCQkgMHhhYiwgMHhhYiwgMHhhYiwgMHhhYywgMHhhYywgMHhhYywgMHhhYywgMHhhYywKKwkJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWUsIDB4YWUsCisJCSAweGFlLCAweGFlLCAweGFlLCAweGFmLCAweGFmLCAweGFmLCAweGFmLCAweGFmLAorCQkgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwKKwkJIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsCisJCSAweGIyLCAweGIzLCAweGIzLCAweGIzLCAweGIzLCAweGIzLCAweGIzLCAweGI0LAorCQkgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNiwKKwkJIDB4YjYsIDB4YjYsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsCisJCSAweGI4LCAweGI4LCAweGI4LCAweGI4LCAweGI4LCAweGI5LCAweGI5LCAweGI5LAorCQkgMHhiOSwgMHhiOSwgMHhiOSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYSwKKwkJIDB4YmEsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmQsIDB4YmQsCisJCSAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJlLCAweGJlLCAweGJlLCAweGJlLAorCQkgMHhiZSwgMHhiZSwgMHhiZiwgMHhiZiwgMHhiZiwgMHhiZiwgMHhiZiwgMHhiZiwKKwkJIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsIDB4YzIsCisJCSAweGMyLCAweGMyLCAweGMyLCAweGMzLCAweGMzLCAweGMzLCAweGMzLCAweGMzLAorCQkgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNSwKKwkJIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsIDB4YzYsCisJCSAweGM2LCAweGM2LCAweGM2LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM3LAorCQkgMHhjNywgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsCisJCSAweGNiLCAweGNiLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLAorCQkgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsCisJCSAweGNmLCAweGNmLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLAorCQkgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywKKwkJIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsCisJCSAweGQ0LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ3LAorCQkgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkOCwgMHhkOCwgMHhkOCwKKwkJIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksCisJCSAweGQ5LCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRiLAorCQkgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsCisJCSAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGUwLCAweGUwLAorCQkgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwKKwkJIDB4ZTEsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTMsCisJCSAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGU0LCAweGU0LCAweGU0LAorCQkgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwKKwkJIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTcsIDB4ZTcsCisJCSAweGU3LCAweGU3LCAweGU3LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LAorCQkgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlYiwgMHhlYiwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsCisJCSAweGVjLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVlLAorCQkgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwKKwkJIDB4ZWYsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjEsCisJCSAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYzLCAweGYzLCAweGYzLCAweGYzLAorCQkgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNSwgMHhmNSwKKwkJIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsCisJCSAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY4LCAweGY4LCAweGY4LAorCQkgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZhLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZjLCAweGZjLCAweGZjLAorCQkgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmZCwKKwkJIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfQorCSAgICB9LAorCSAgICB7CQkJCQkJCS8qIGdhbW1hIDIgKi8KKwkJezB4MDAsIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDcsIDB4MDgsIDB4MGEsIDB4MGMsCisJCSAweDBkLCAweDBlLCAweDEwLCAweDEyLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorCQkgMHgxOCwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMiwKKwkJIDB4MjMsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmIsIDB4MmMsCisJCSAweDJkLCAweDJkLCAweDJmLCAweDMwLCAweDMxLCAweDMzLCAweDM0LCAweDM0LAorCQkgMHgzNSwgMHgzNywgMHgzOCwgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYiwKKwkJIDB4M2MsIDB4M2QsIDB4M2YsIDB4M2YsIDB4NDAsIDB4NDIsIDB4NDIsIDB4NDMsCisJCSAweDQ0LCAweDQ0LCAweDQ1LCAweDQ3LCAweDQ3LCAweDQ4LCAweDQ5LCAweDQ5LAorCQkgMHg0YSwgMHg0YiwgMHg0YiwgMHg0YywgMHg0YywgMHg0ZCwgMHg0ZiwgMHg0ZiwKKwkJIDB4NTAsIDB4NTAsIDB4NTIsIDB4NTMsIDB4NTMsIDB4NTQsIDB4NTQsIDB4NTUsCisJCSAweDU1LCAweDU2LCAweDU2LCAweDU4LCAweDU4LCAweDU5LCAweDVhLCAweDVhLAorCQkgMHg1YiwgMHg1YiwgMHg1YywgMHg1YywgMHg1ZSwgMHg1ZSwgMHg1ZiwgMHg1ZiwKKwkJIDB4NjAsIDB4NjAsIDB4NjEsIDB4NjEsIDB4NjIsIDB4NjIsIDB4NjMsIDB4NjMsCisJCSAweDY1LCAweDY1LCAweDY1LCAweDY2LCAweDY2LCAweDY3LCAweDY3LCAweDY4LAorCQkgMHg2OCwgMHg2OSwgMHg2OSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YywgMHg2YywKKwkJIDB4NmQsIDB4NmQsIDB4NmUsIDB4NmUsIDB4NmUsIDB4NmYsIDB4NmYsIDB4NzAsCisJCSAweDcwLCAweDcwLCAweDcxLCAweDcxLCAweDczLCAweDczLCAweDczLCAweDc0LAorCQkgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwKKwkJIDB4NzgsIDB4NzksIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsCisJCSAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdmLCAweDdmLAorCQkgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwKKwkJIDB4ODIsIDB4ODIsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODUsCisJCSAweDg2LCAweDg2LCAweDg2LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDg5LAorCQkgMHg4OSwgMHg4YSwgMHg4YSwgMHg4YSwgMHg4YiwgMHg4YiwgMHg4YiwgMHg4ZCwKKwkJIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsIDB4OGYsCisJCSAweDhmLCAweDkwLCAweDkwLCAweDkwLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCQkgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MywgMHg5MywgMHg5MywgMHg5MywgMHg5NCwKKwkJIDB4OTQsIDB4OTQsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTcsCisJCSAweDk3LCAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk5LCAweDk5LCAweDk5LAorCQkgMHg5YSwgMHg5YSwgMHg5YSwgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YiwKKwkJIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWUsCisJCSAweDllLCAweDllLCAweDllLCAweGEwLCAweGEwLCAweGEwLCAweGEwLCAweGExLAorCQkgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMywKKwkJIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTUsIDB4YTUsCisJCSAweGE1LCAweGE1LCAweGE1LCAweGE2LCAweGE2LCAweGE2LCAweGE2LCAweGE4LAorCQkgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhYiwKKwkJIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWQsCisJCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFlLCAweGFlLCAweGFlLCAweGFlLAorCQkgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMCwKKwkJIDB4YjAsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjIsIDB4YjIsIDB4YjIsCisJCSAweGIyLCAweGIyLCAweGIzLCAweGIzLCAweGIzLCAweGIzLCAweGI0LCAweGI0LAorCQkgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNywKKwkJIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsCisJCSAweGI4LCAweGI5LCAweGI5LCAweGI5LCAweGI5LCAweGJhLCAweGJhLCAweGJhLAorCQkgMHhiYSwgMHhiYSwgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiZCwKKwkJIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsCisJCSAweGJlLCAweGJmLCAweGJmLCAweGJmLCAweGJmLCAweGJmLCAweGMwLCAweGMwLAorCQkgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywKKwkJIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsCisJCSAweGM0LCAweGM0LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM2LAorCQkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNywgMHhjNywgMHhjNywgMHhjNywKKwkJIDB4YzcsIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsCisJCSAweGNhLCAweGNhLCAweGNhLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNiLAorCQkgMHhjYiwgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjZCwgMHhjZCwKKwkJIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsCisJCSAweGNlLCAweGNmLCAweGNmLCAweGNmLCAweGNmLCAweGNmLCAweGQwLCAweGQwLAorCQkgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwKKwkJIDB4ZDEsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDQsIDB4ZDQsCisJCSAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LAorCQkgMHhkNiwgMHhkNiwgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkOCwKKwkJIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDksIDB4ZDksIDB4ZDksCisJCSAweGQ5LCAweGQ5LCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRhLAorCQkgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkZCwgMHhkZCwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsCisJCSAweGRlLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGUwLAorCQkgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMSwgMHhlMSwgMHhlMSwKKwkJIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsCisJCSAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGU0LCAweGU0LAorCQkgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsCisJCSAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU4LCAweGU4LAorCQkgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwKKwkJIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJCSAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVkLCAweGVkLCAweGVkLAorCQkgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsCisJCSAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYxLCAweGYxLCAweGYxLAorCQkgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmMywKKwkJIDB4ZjMsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjUsCisJCSAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY2LCAweGY2LCAweGY2LAorCQkgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywKKwkJIDB4ZjcsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjksCisJCSAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGZhLCAweGZhLCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZifSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDUsCisJCSAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBkLCAweDBlLCAweDEwLCAweDExLAorCQkgMHgxMiwgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNiwgMHgxNywgMHgxOCwgMHgxYSwKKwkJIDB4MWIsIDB4MWMsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjAsIDB4MjIsIDB4MjMsCisJCSAweDI1LCAweDI2LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDI5LCAweDJiLAorCQkgMHgyYywgMHgyZCwgMHgyZCwgMHgyZiwgMHgzMCwgMHgzMCwgMHgzMSwgMHgzMywKKwkJIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzUsIDB4MzcsIDB4MzgsIDB4MzgsIDB4MzksCisJCSAweDNhLCAweDNhLCAweDNiLCAweDNiLCAweDNjLCAweDNkLCAweDNkLCAweDNmLAorCQkgMHgzZiwgMHg0MCwgMHg0MiwgMHg0MiwgMHg0MywgMHg0MywgMHg0NCwgMHg0NCwKKwkJIDB4NDUsIDB4NDUsIDB4NDcsIDB4NDcsIDB4NDgsIDB4NDgsIDB4NDksIDB4NGEsCisJCSAweDRhLCAweDRiLCAweDRiLCAweDRjLCAweDRjLCAweDRkLCAweDRkLCAweDRkLAorCQkgMHg0ZiwgMHg0ZiwgMHg1MCwgMHg1MCwgMHg1MiwgMHg1MiwgMHg1MywgMHg1MywKKwkJIDB4NTQsIDB4NTQsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTYsIDB4NTgsCisJCSAweDU4LCAweDU5LCAweDU5LCAweDVhLCAweDVhLCAweDVhLCAweDViLCAweDViLAorCQkgMHg1YywgMHg1YywgMHg1YywgMHg1ZSwgMHg1ZSwgMHg1ZiwgMHg1ZiwgMHg1ZiwKKwkJIDB4NjAsIDB4NjAsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjIsIDB4NjIsIDB4NjMsCisJCSAweDYzLCAweDYzLCAweDY1LCAweDY1LCAweDY1LCAweDY2LCAweDY2LCAweDY3LAorCQkgMHg2NywgMHg2NywgMHg2OCwgMHg2OCwgMHg2OCwgMHg2OSwgMHg2OSwgMHg2OSwKKwkJIDB4NmEsIDB4NmEsIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmQsIDB4NmQsIDB4NmQsCisJCSAweDZlLCAweDZlLCAweDZlLCAweDZmLCAweDZmLCAweDZmLCAweDcwLCAweDcwLAorCQkgMHg3MCwgMHg3MSwgMHg3MSwgMHg3MSwgMHg3MywgMHg3MywgMHg3MywgMHg3MywKKwkJIDB4NzQsIDB4NzQsIDB4NzQsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzcsIDB4NzcsCisJCSAweDc3LCAweDc4LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LCAweDc5LAorCQkgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YywKKwkJIDB4N2MsIDB4N2MsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2YsIDB4N2YsCisJCSAweDdmLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgxLCAweDgxLCAweDgxLAorCQkgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwKKwkJIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODgsCisJCSAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDg5LCAweDg5LCAweDg5LCAweDhhLAorCQkgMHg4YSwgMHg4YSwgMHg4YSwgMHg4YiwgMHg4YiwgMHg4YiwgMHg4YiwgMHg4ZCwKKwkJIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsCisJCSAweDhmLCAweDhmLCAweDhmLCAweDkwLCAweDkwLCAweDkwLCAweDkwLCAweDkxLAorCQkgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MiwKKwkJIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisJCSAweDk0LCAweDk2LCAweDk2LCAweDk2LCAweDk2LCAweDk3LCAweDk3LCAweDk3LAorCQkgMHg5NywgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OSwgMHg5OSwKKwkJIDB4OTksIDB4OTksIDB4OTksIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWIsCisJCSAweDliLCAweDliLCAweDliLCAweDliLCAweDljLCAweDljLCAweDljLCAweDljLAorCQkgMHg5ZCwgMHg5ZCwgMHg5ZCwgMHg5ZCwgMHg5ZCwgMHg5ZSwgMHg5ZSwgMHg5ZSwKKwkJIDB4OWUsIDB4OWUsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTEsCisJCSAweGExLCAweGExLCAweGExLCAweGExLCAweGEyLCAweGEyLCAweGEyLCAweGEyLAorCQkgMHhhMiwgMHhhMywgMHhhMywgMHhhMywgMHhhMywgMHhhMywgMHhhNCwgMHhhNCwKKwkJIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisJCSAweGE2LCAweGE2LCAweGE2LCAweGE2LCAweGE2LCAweGE4LCAweGE4LCAweGE4LAorCQkgMHhhOCwgMHhhOCwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhYiwKKwkJIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisJCSAweGFjLCAweGFjLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFlLAorCQkgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwKKwkJIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjEsCisJCSAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIyLCAweGIyLCAweGIyLAorCQkgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiMywgMHhiMywgMHhiMywKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsCisJCSAweGI2LCAweGI2LCAweGI2LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI3LAorCQkgMHhiNywgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwKKwkJIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsCisJCSAweGJhLCAweGJhLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJjLAorCQkgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZSwgMHhiZSwKKwkJIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsCisJCSAweGJmLCAweGJmLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLAorCQkgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywKKwkJIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsCisJCSAweGM0LCAweGM0LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM1LAorCQkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNywgMHhjNywKKwkJIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzksIDB4YzksIDB4YzksCisJCSAweGM5LCAweGM5LCAweGM5LCAweGNhLCAweGNhLCAweGNhLCAweGNhLCAweGNhLAorCQkgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYywKKwkJIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2QsIDB4Y2QsCisJCSAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNlLCAweGNlLCAweGNlLCAweGNlLAorCQkgMHhjZSwgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwKKwkJIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDEsCisJCSAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQzLCAweGQzLAorCQkgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwKKwkJIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsCisJCSAweGQ2LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ4LAorCQkgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOSwgMHhkOSwKKwkJIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsCisJCSAweGRhLCAweGRhLCAweGRhLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRiLAorCQkgMHhkYiwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwKKwkJIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGYsIDB4ZGYsCisJCSAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGUwLCAweGUwLCAweGUwLAorCQkgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwKKwkJIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsCisJCSAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGU0LAorCQkgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsCisJCSAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LAorCQkgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwKKwkJIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJCSAweGViLCAweGViLCAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLAorCQkgMHhlYywgMHhlYywgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwKKwkJIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWYsCisJCSAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGYwLCAweGYwLCAweGYwLAorCQkgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwKKwkJIDB4ZjEsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjQsCisJCSAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY1LCAweGY1LAorCQkgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJCSAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY5LCAweGY5LAorCQkgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZifSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDcsIDB4MDgsCisJCSAweDA5LCAweDBhLCAweDBjLCAweDBlLCAweDEwLCAweDExLCAweDEyLCAweDE0LAorCQkgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZSwKKwkJIDB4MWYsIDB4MjAsIDB4MjAsIDB4MjIsIDB4MjMsIDB4MjUsIDB4MjYsIDB4MjcsCisJCSAweDI4LCAweDI4LCAweDI5LCAweDJiLCAweDJjLCAweDJkLCAweDJkLCAweDJmLAorCQkgMHgzMCwgMHgzMSwgMHgzMSwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNSwgMHgzNywKKwkJIDB4MzgsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2MsCisJCSAweDNkLCAweDNmLCAweDNmLCAweDQwLCAweDQwLCAweDQyLCAweDQzLCAweDQzLAorCQkgMHg0NCwgMHg0NCwgMHg0NSwgMHg0NywgMHg0NywgMHg0OCwgMHg0OCwgMHg0OSwKKwkJIDB4NGEsIDB4NGEsIDB4NGIsIDB4NGIsIDB4NGMsIDB4NGMsIDB4NGQsIDB4NGQsCisJCSAweDRmLCAweDRmLCAweDUwLCAweDUwLCAweDUyLCAweDUyLCAweDUzLCAweDUzLAorCQkgMHg1NCwgMHg1NCwgMHg1NSwgMHg1NSwgMHg1NiwgMHg1NiwgMHg1OCwgMHg1OCwKKwkJIDB4NTksIDB4NTksIDB4NWEsIDB4NWEsIDB4NWIsIDB4NWIsIDB4NWMsIDB4NWMsCisJCSAweDVjLCAweDVlLCAweDVlLCAweDVmLCAweDVmLCAweDYwLCAweDYwLCAweDYxLAorCQkgMHg2MSwgMHg2MSwgMHg2MiwgMHg2MiwgMHg2MywgMHg2MywgMHg2NSwgMHg2NSwKKwkJIDB4NjUsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NjcsIDB4NjcsIDB4NjgsIDB4NjgsCisJCSAweDY5LCAweDY5LCAweDY5LCAweDZhLCAweDZhLCAweDZhLCAweDZjLCAweDZjLAorCQkgMHg2ZCwgMHg2ZCwgMHg2ZCwgMHg2ZSwgMHg2ZSwgMHg2ZSwgMHg2ZiwgMHg2ZiwKKwkJIDB4NzAsIDB4NzAsIDB4NzAsIDB4NzEsIDB4NzEsIDB4NzEsIDB4NzMsIDB4NzMsCisJCSAweDczLCAweDc0LCAweDc0LCAweDc0LCAweDc1LCAweDc1LCAweDc1LCAweDc3LAorCQkgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwKKwkJIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsCisJCSAweDdjLCAweDdkLCAweDdkLCAweDdkLCAweDdmLCAweDdmLCAweDdmLCAweDgwLAorCQkgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwKKwkJIDB4ODIsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsCisJCSAweDg2LCAweDg2LCAweDg2LCAweDg4LCAweDg4LCAweDg4LCAweDg4LCAweDg5LAorCQkgMHg4OSwgMHg4OSwgMHg4YSwgMHg4YSwgMHg4YSwgMHg4YSwgMHg4YiwgMHg4YiwKKwkJIDB4OGIsIDB4OGIsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGUsIDB4OGUsIDB4OGUsCisJCSAweDhlLCAweDhmLCAweDhmLCAweDhmLCAweDhmLCAweDkwLCAweDkwLCAweDkwLAorCQkgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MiwKKwkJIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisJCSAweDk2LCAweDk2LCAweDk2LCAweDk2LCAweDk3LCAweDk3LCAweDk3LCAweDk3LAorCQkgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwKKwkJIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsCisJCSAweDliLCAweDljLCAweDljLCAweDljLCAweDljLCAweDlkLCAweDlkLCAweDlkLAorCQkgMHg5ZCwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHhhMCwgMHhhMCwKKwkJIDB4YTAsIDB4YTAsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsCisJCSAweGEyLCAweGEyLCAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGEzLCAweGE0LAorCQkgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwKKwkJIDB4YTUsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTgsIDB4YTgsIDB4YTgsCisJCSAweGE4LCAweGE4LCAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGFiLAorCQkgMHhhYiwgMHhhYiwgMHhhYiwgMHhhYiwgMHhhYywgMHhhYywgMHhhYywgMHhhYywKKwkJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWUsIDB4YWUsIDB4YWUsCisJCSAweGFlLCAweGFlLCAweGFmLCAweGFmLCAweGFmLCAweGFmLCAweGFmLCAweGIwLAorCQkgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwKKwkJIDB4YjEsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsCisJCSAweGIzLCAweGIzLCAweGIzLCAweGI0LCAweGIzLCAweGI0LCAweGI0LCAweGI0LAorCQkgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywKKwkJIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsCisJCSAweGI5LCAweGI5LCAweGI5LCAweGI5LCAweGI5LCAweGI5LCAweGJhLCAweGJhLAorCQkgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiYywKKwkJIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmUsIDB4YmUsCisJCSAweGJlLCAweGJlLCAweGJlLCAweGJmLCAweGJmLCAweGJmLCAweGJmLCAweGJmLAorCQkgMHhiZiwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMiwgMHhjMiwKKwkJIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsCisJCSAweGMzLCAweGMzLCAweGM0LCAweGM0LCAweGM0LCAweGM0LCAweGM0LCAweGM1LAorCQkgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNiwgMHhjNiwgMHhjNiwKKwkJIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsCisJCSAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGNhLCAweGNhLAorCQkgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwKKwkJIDB4Y2IsIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNlLCAweGNlLAorCQkgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwKKwkJIDB4Y2YsIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsCisJCSAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQzLCAweGQzLAorCQkgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwKKwkJIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsCisJCSAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ4LCAweGQ4LAorCQkgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkOSwKKwkJIDB4ZDksIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsCisJCSAweGRhLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRkLAorCQkgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZSwgMHhkZSwgMHhkZSwKKwkJIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZGYsCisJCSAweGRmLCAweGUwLCAweGUwLCAweGUwLCAweGUwLCAweGUwLCAweGUwLCAweGUwLAorCQkgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMiwgMHhlMiwKKwkJIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsCisJCSAweGUzLCAweGUzLCAweGU0LCAweGU0LCAweGU0LCAweGU0LCAweGU0LCAweGU0LAorCQkgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNiwKKwkJIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTcsIDB4ZTcsIDB4ZTcsCisJCSAweGU3LCAweGU3LCAweGU3LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LAorCQkgMHhlOCwgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsCisJCSAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVkLCAweGVkLCAweGVkLAorCQkgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsCisJCSAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYxLCAweGYxLAorCQkgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMywgMHhmMywgMHhmMywgMHhmMywKKwkJIDB4ZjMsIDB4ZjMsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsCisJCSAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY2LCAweGY2LAorCQkgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNywgMHhmNywgMHhmNywgMHhmNywKKwkJIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZifQorCSAgICB9LAorCSAgICB7CQkJCS8qIGdhbW1hIDMgLSBmcm9tIHRwNjgxMCArIGN4MDM0MiAqLworCQl7MHgwOCwgMHgwOSwgMHgwYywgMHgwZCwgMHgxMCwgMHgxMSwgMHgxNCwgMHgxNSwKKwkJIDB4MTcsIDB4MTgsIDB4MWEsIDB4MWMsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjMsCisJCSAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDJiLCAweDJjLCAweDJkLCAweDJmLAorCQkgMHgzMCwgMHgzMSwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNywgMHgzOCwgMHgzOSwKKwkJIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2YsIDB4NDAsIDB4NDIsIDB4NDMsCisJCSAweDQ0LCAweDQ1LCAweDQ3LCAweDQ4LCAweDQ4LCAweDQ5LCAweDRhLCAweDRiLAorCQkgMHg0YywgMHg0ZCwgMHg0ZCwgMHg0ZiwgMHg1MCwgMHg1MiwgMHg1MywgMHg1MywKKwkJIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTgsIDB4NTksIDB4NWEsIDB4NWEsCisJCSAweDViLCAweDVjLCAweDVjLCAweDVlLCAweDVmLCAweDVmLCAweDYwLCAweDYxLAorCQkgMHg2MSwgMHg2MiwgMHg2MywgMHg2MywgMHg2NSwgMHg2NiwgMHg2NiwgMHg2NywKKwkJIDB4NjgsIDB4NjgsIDB4NjksIDB4NjksIDB4NmEsIDB4NmMsIDB4NmMsIDB4NmQsCisJCSAweDZkLCAweDZlLCAweDZmLCAweDZmLCAweDcwLCAweDcwLCAweDcxLCAweDczLAorCQkgMHg3MywgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NywgMHg3NywgMHg3OCwKKwkJIDB4NzgsIDB4NzksIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsCisJCSAweDdkLCAweDdkLCAweDdmLCAweDdmLCAweDgwLCAweDgwLCAweDgxLCAweDgxLAorCQkgMHg4MiwgMHg4MiwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NiwgMHg4NiwKKwkJIDB4ODYsIDB4ODgsIDB4ODgsIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsIDB4OGIsCisJCSAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhlLCAweDhlLCAweDhmLCAweDhmLAorCQkgMHg5MCwgMHg5MCwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MiwgMHg5MiwgMHg5MywKKwkJIDB4OTMsIDB4OTMsIDB4OTQsIDB4OTQsIDB4OTYsIDB4OTYsIDB4OTcsIDB4OTcsCisJCSAweDk3LCAweDk4LCAweDk4LCAweDk5LCAweDk5LCAweDk5LCAweDlhLCAweDlhLAorCQkgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywgMHg5YywgMHg5ZCwgMHg5ZCwKKwkJIDB4OWUsIDB4OWUsIDB4OWUsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTEsIDB4YTEsCisJCSAweGEyLCAweGEyLCAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGE0LCAweGE0LAorCQkgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwKKwkJIDB4YTgsIDB4YTksIDB4YTksIDB4YTksIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWMsCisJCSAweGFjLCAweGFjLCAweGFkLCAweGFkLCAweGFkLCAweGFlLCAweGFlLCAweGFlLAorCQkgMHhhZiwgMHhhZiwgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwKKwkJIDB4YjEsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsIDB4YjMsCisJCSAweGI0LCAweGI0LCAweGI0LCAweGI2LCAweGI2LCAweGI2LCAweGI3LCAweGI3LAorCQkgMHhiNywgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwKKwkJIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmQsCisJCSAweGJkLCAweGJkLCAweGJlLCAweGJlLCAweGJlLCAweGJlLCAweGJmLCAweGJmLAorCQkgMHhiZiwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMiwgMHhjMiwgMHhjMiwKKwkJIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsCisJCSAweGM1LCAweGM1LCAweGM1LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM3LAorCQkgMHhjNywgMHhjNywgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2EsIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2MsIDB4Y2MsCisJCSAweGNjLCAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNlLCAweGNlLCAweGNlLAorCQkgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhkMCwgMHhkMCwgMHhkMCwKKwkJIDB4ZDAsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDMsIDB4ZDMsIDB4ZDMsCisJCSAweGQzLCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ2LCAweGQ2LCAweGQ2LAorCQkgMHhkNiwgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkOCwgMHhkOCwgMHhkOCwKKwkJIDB4ZDgsIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsCisJCSAweGRhLCAweGRhLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRkLCAweGRkLAorCQkgMHhkZCwgMHhkZCwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZiwgMHhkZiwKKwkJIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTEsCisJCSAweGUxLCAweGUxLCAweGUxLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLAorCQkgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsCisJCSAweGU2LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU4LCAweGU4LAorCQkgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlYiwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsCisJCSAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVlLCAweGVlLCAweGVlLAorCQkgMHhlZSwgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwgMHhmMCwKKwkJIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsCisJCSAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGY0LCAweGY0LCAweGY0LAorCQkgMHhmNCwgMHhmNCwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwKKwkJIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJCSAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LAorCQkgMHhmOSwgMHhmOSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLAorCQkgMHhmYywgMHhmYywgMHhmYywgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwKKwkJIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9LAorCQl7MHgwMywgMHgwNSwgMHgwNywgMHgwOSwgMHgwYSwgMHgwYywgMHgwZCwgMHgxMCwKKwkJIDB4MTEsIDB4MTIsIDB4MTQsIDB4MTUsIDB4MTcsIDB4MTgsIDB4MWEsIDB4MWIsCisJCSAweDFjLCAweDFlLCAweDFmLCAweDIwLCAweDIyLCAweDIzLCAweDI1LCAweDI2LAorCQkgMHgyNywgMHgyOCwgMHgyOSwgMHgyYiwgMHgyYywgMHgyYywgMHgyZCwgMHgyZiwKKwkJIDB4MzAsIDB4MzEsIDB4MzMsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzcsIDB4MzgsCisJCSAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNiLCAweDNjLCAweDNkLCAweDNmLAorCQkgMHgzZiwgMHg0MCwgMHg0MiwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NSwKKwkJIDB4NDcsIDB4NDcsIDB4NDgsIDB4NDksIDB4NDksIDB4NGEsIDB4NGIsIDB4NGIsCisJCSAweDRjLCAweDRkLCAweDRkLCAweDRmLCAweDRmLCAweDUwLCAweDUyLCAweDUyLAorCQkgMHg1MywgMHg1MywgMHg1NCwgMHg1NCwgMHg1NSwgMHg1NSwgMHg1NiwgMHg1OCwKKwkJIDB4NTgsIDB4NTksIDB4NTksIDB4NWEsIDB4NWEsIDB4NWIsIDB4NWIsIDB4NWMsCisJCSAweDVjLCAweDVlLCAweDVlLCAweDVmLCAweDVmLCAweDYwLCAweDYwLCAweDYxLAorCQkgMHg2MSwgMHg2MiwgMHg2MiwgMHg2MywgMHg2MywgMHg2NSwgMHg2NSwgMHg2NiwKKwkJIDB4NjYsIDB4NjcsIDB4NjcsIDB4NjcsIDB4NjgsIDB4NjgsIDB4NjksIDB4NjksCisJCSAweDZhLCAweDZhLCAweDZjLCAweDZjLCAweDZjLCAweDZkLCAweDZkLCAweDZlLAorCQkgMHg2ZSwgMHg2ZiwgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MCwgMHg3MSwgMHg3MSwKKwkJIDB4NzEsIDB4NzMsIDB4NzMsIDB4NzQsIDB4NzQsIDB4NzQsIDB4NzUsIDB4NzUsCisJCSAweDc3LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc5LCAweDc5LCAweDc5LAorCQkgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywKKwkJIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsCisJCSAweDgwLCAweDgxLCAweDgxLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDg0LAorCQkgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwgMHg4NiwgMHg4NiwKKwkJIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsCisJCSAweDhhLCAweDhiLCAweDhiLCAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhlLAorCQkgMHg4ZSwgMHg4ZSwgMHg4ZSwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg5MCwgMHg5MCwKKwkJIDB4OTAsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTIsIDB4OTIsCisJCSAweDkzLCAweDkzLCAweDkzLCAweDkzLCAweDk0LCAweDk0LCAweDk0LCAweDk2LAorCQkgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NywgMHg5NywgMHg5NywgMHg5OCwgMHg5OCwKKwkJIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksIDB4OTksIDB4OWEsIDB4OWEsIDB4OWEsCisJCSAweDlhLCAweDliLCAweDliLCAweDliLCAweDliLCAweDljLCAweDljLCAweDljLAorCQkgMHg5YywgMHg5ZCwgMHg5ZCwgMHg5ZCwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHg5ZSwKKwkJIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisJCSAweGEyLCAweGEyLCAweGEyLCAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGEzLAorCQkgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwKKwkJIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisJCSAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGFiLCAweGFiLCAweGFiLAorCQkgMHhhYiwgMHhhYywgMHhhYywgMHhhYywgMHhhYywgMHhhZCwgMHhhZCwgMHhhZCwKKwkJIDB4YWQsIDB4YWQsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWYsIDB4YWYsCisJCSAweGFmLCAweGFmLCAweGIwLCAweGIwLCAweGIwLCAweGIwLCAweGIwLCAweGIxLAorCQkgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMiwKKwkJIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjQsIDB4YjQsIDB4YjQsCisJCSAweGI0LCAweGI2LCAweGI2LCAweGI2LCAweGI2LCAweGI2LCAweGI3LCAweGI3LAorCQkgMHhiNywgMHhiNywgMHhiNywgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwKKwkJIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsCisJCSAweGJhLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJkLCAweGJkLAorCQkgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwKKwkJIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsCisJCSAweGMwLCAweGMwLCAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMzLAorCQkgMHhjMywgMHhjMywgMHhjMywgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwKKwkJIDB4YzQsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsCisJCSAweGM2LCAweGM2LCAweGM2LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM3LAorCQkgMHhjNywgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsCisJCSAweGNiLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNkLCAweGNkLAorCQkgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4ZDAsCisJCSAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQxLCAweGQxLCAweGQxLCAweGQxLAorCQkgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkNCwKKwkJIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsIDB4ZDYsCisJCSAweGQ2LCAweGQ2LCAweGQ2LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LAorCQkgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOSwgMHhkOSwKKwkJIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsCisJCSAweGRhLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRkLAorCQkgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZSwgMHhkZSwgMHhkZSwKKwkJIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZGYsCisJCSAweGRmLCAweGUwLCAweGUwLCAweGUwLCAweGUwLCAweGUwLCAweGUwLCAweGUxLAorCQkgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMiwgMHhlMiwgMHhlMiwKKwkJIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsCisJCSAweGUzLCAweGU0LCAweGU0LCAweGU0LCAweGU0LCAweGU0LCAweGU0LCAweGU1LAorCQkgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNiwgMHhlNiwgMHhlNiwKKwkJIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsCisJCSAweGU3LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU5LAorCQkgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlYiwgMHhlYiwgMHhlYiwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsCisJCSAweGVjLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVlLAorCQkgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwKKwkJIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisJCSAweGYwLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYzLAorCQkgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwKKwkJIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsCisJCSAweGY1LCAweGY1LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LAorCQkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmOCwgMHhmOCwKKwkJIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksCisJCSAweGY5LCAweGY5LCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsCisJCSAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLAorCQkgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZSwgMHhmZSwKKwkJIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9LAorCQl7MHgwNywgMHgwOCwgMHgwYSwgMHgwYywgMHgwZSwgMHgxMCwgMHgxMiwgMHgxNCwKKwkJIDB4MTYsIDB4MTcsIDB4MTgsIDB4MWIsIDB4MWMsIDB4MWUsIDB4MWYsIDB4MjAsCisJCSAweDIzLCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJiLCAweDJkLAorCQkgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNywgMHgzOCwKKwkJIDB4MzksIDB4M2EsIDB4M2IsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2YsIDB4NDAsCisJCSAweDQyLCAweDQzLCAweDQ0LCAweDQ0LCAweDQ1LCAweDQ3LCAweDQ4LCAweDQ5LAorCQkgMHg0YSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZCwgMHg0ZiwgMHg1MCwKKwkJIDB4NTIsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NTgsCisJCSAweDU4LCAweDU5LCAweDVhLCAweDViLCAweDViLCAweDVjLCAweDVlLCAweDVlLAorCQkgMHg1ZiwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MSwgMHg2MiwgMHg2MywgMHg2MywKKwkJIDB4NjUsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjcsIDB4NjgsIDB4NjgsIDB4NjksCisJCSAweDZhLCAweDZhLCAweDZjLCAweDZjLCAweDZkLCAweDZkLCAweDZlLCAweDZlLAorCQkgMHg2ZiwgMHg3MCwgMHg3MCwgMHg3MSwgMHg3MSwgMHg3MywgMHg3MywgMHg3NCwKKwkJIDB4NzQsIDB4NzUsIDB4NzUsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzksCisJCSAweDc5LCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdjLCAweDdjLCAweDdkLAorCQkgMHg3ZCwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwKKwkJIDB4ODIsIDB4ODIsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODYsIDB4ODYsCisJCSAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhiLAorCQkgMHg4YiwgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZSwgMHg4ZSwgMHg4ZSwgMHg4ZiwKKwkJIDB4OGYsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTIsCisJCSAweDkyLCAweDkzLCAweDkzLCAweDk0LCAweDk0LCAweDk0LCAweDk2LCAweDk2LAorCQkgMHg5NiwgMHg5NywgMHg5NywgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OSwgMHg5OSwKKwkJIDB4OTksIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWMsIDB4OWMsCisJCSAweDljLCAweDlkLCAweDlkLCAweDlkLCAweDllLCAweDllLCAweDllLCAweGEwLAorCQkgMHhhMCwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMywKKwkJIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTUsIDB4YTUsIDB4YTUsCisJCSAweGE2LCAweGE2LCAweGE2LCAweGE4LCAweGE4LCAweGE4LCAweGE4LCAweGE5LAorCQkgMHhhOSwgMHhhOSwgMHhhYiwgMHhhYiwgMHhhYiwgMHhhYywgMHhhYywgMHhhYywKKwkJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWYsIDB4YWYsCisJCSAweGFmLCAweGFmLCAweGIwLCAweGIwLCAweGIwLCAweGIxLCAweGIxLCAweGIxLAorCQkgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiNCwKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjcsIDB4YjcsCisJCSAweGI3LCAweGI3LCAweGI4LCAweGI4LCAweGI4LCAweGI5LCAweGI5LCAweGI5LAorCQkgMHhiOSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYywgMHhiYywgMHhiYywgMHhiYywKKwkJIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmYsCisJCSAweGJmLCAweGJmLCAweGJmLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMyLAorCQkgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywgMHhjMywgMHhjMywgMHhjNCwKKwkJIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsCisJCSAweGM2LCAweGM2LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM5LCAweGM5LAorCQkgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYiwgMHhjYiwKKwkJIDB4Y2IsIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2QsIDB4Y2QsCisJCSAweGNkLCAweGNkLCAweGNkLCAweGNlLCAweGNlLCAweGNlLCAweGNlLCAweGNmLAorCQkgMHhjZiwgMHhjZiwgMHhjZiwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMSwKKwkJIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsCisJCSAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LAorCQkgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkOCwgMHhkOCwgMHhkOCwKKwkJIDB4ZDgsIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZGEsIDB4ZGEsCisJCSAweGRhLCAweGRhLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRkLAorCQkgMHhkZCwgMHhkZCwgMHhkZCwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwKKwkJIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsCisJCSAweGUwLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUyLCAweGUyLAorCQkgMHhlMiwgMHhlMiwgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlNCwKKwkJIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsCisJCSAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LCAweGU3LAorCQkgMHhlNywgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwKKwkJIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJCSAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVkLCAweGVkLAorCQkgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwKKwkJIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisJCSAweGYwLCAweGYwLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYzLAorCQkgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwKKwkJIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsCisJCSAweGY2LCAweGY2LCAweGY2LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY3LAorCQkgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwKKwkJIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywKKwkJIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmQsIDB4ZmQsIDB4ZmQsCisJCSAweGZkLCAweGZkLCAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9CisJICAgIH0sCisJICAgIHsJCQkJLyogZ2FtbWEgNCAtIGZyb20gdHA2ODAwICsgc29pNzYzYSAqLworCQl7MHgxMSwgMHgxNCwgMHgxNSwgMHgxNywgMHgxYSwgMHgxYiwgMHgxZSwgMHgxZiwKKwkJIDB4MjIsIDB4MjMsIDB4MjUsIDB4MjcsIDB4MjgsIDB4MmIsIDB4MmMsIDB4MmQsCisJCSAweDJmLCAweDMxLCAweDMzLCAweDM0LCAweDM1LCAweDM4LCAweDM5LCAweDNhLAorCQkgMHgzYiwgMHgzYywgMHgzZCwgMHg0MCwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwKKwkJIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGYsCisJCSAweDUwLCAweDUyLCAweDUzLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU4LAorCQkgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YiwgMHg1YywgMHg1ZSwgMHg1ZiwgMHg2MCwKKwkJIDB4NjEsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjUsIDB4NjUsIDB4NjYsIDB4NjcsCisJCSAweDY4LCAweDY4LCAweDY5LCAweDZhLCAweDZjLCAweDZjLCAweDZkLCAweDZlLAorCQkgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MSwgMHg3MywgMHg3NCwgMHg3NCwKKwkJIDB4NzUsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsCisJCSAweDdiLCAweDdjLCAweDdjLCAweDdkLCAweDdmLCAweDdmLCAweDgwLCAweDgwLAorCQkgMHg4MSwgMHg4MSwgMHg4MiwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NiwKKwkJIDB4ODYsIDB4ODgsIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsIDB4OGIsIDB4OGIsCisJCSAweDhkLCAweDhkLCAweDhlLCAweDhlLCAweDhmLCAweDkwLCAweDkwLCAweDkxLAorCQkgMHg5MSwgMHg5MiwgMHg5MiwgMHg5MywgMHg5MywgMHg5NCwgMHg5NCwgMHg5NiwKKwkJIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksCisJCSAweDlhLCAweDlhLCAweDliLCAweDliLCAweDljLCAweDljLCAweDlkLCAweDlkLAorCQkgMHg5ZSwgMHg5ZSwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMSwgMHhhMSwgMHhhMiwKKwkJIDB4YTIsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTUsIDB4YTUsCisJCSAweGE2LCAweGE2LCAweGE2LCAweGE4LCAweGE4LCAweGE5LCAweGE5LCAweGFiLAorCQkgMHhhYiwgMHhhYiwgMHhhYywgMHhhYywgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwKKwkJIDB4YWUsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjEsIDB4YjEsCisJCSAweGIxLCAweGIyLCAweGIyLCAweGIyLCAweGIzLCAweGIzLCAweGI0LCAweGI0LAorCQkgMHhiNCwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywgMHhiOCwgMHhiOCwKKwkJIDB4YjgsIDB4YjksIDB4YjksIDB4YjksIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmMsCisJCSAweGJjLCAweGJkLCAweGJkLCAweGJkLCAweGJlLCAweGJlLCAweGJlLCAweGJmLAorCQkgMHhiZiwgMHhiZiwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMiwgMHhjMiwgMHhjMiwKKwkJIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsCisJCSAweGM1LCAweGM2LCAweGM2LCAweGM2LCAweGM3LCAweGM3LCAweGM3LCAweGM5LAorCQkgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwKKwkJIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2UsCisJCSAweGNlLCAweGNlLCAweGNmLCAweGNmLCAweGNmLCAweGNmLCAweGQwLCAweGQwLAorCQkgMHhkMCwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywgMHhkMywgMHhkMywKKwkJIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDcsIDB4ZDcsCisJCSAweGQ3LCAweGQ3LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LAorCQkgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGYsCisJCSAweGRmLCAweGRmLCAweGRmLCAweGUwLCAweGUwLCAweGUwLCAweGUxLCAweGUxLAorCQkgMHhlMSwgMHhlMSwgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMywgMHhlMywKKwkJIDB4ZTMsIDB4ZTMsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsCisJCSAweGU1LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LCAweGU3LAorCQkgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwKKwkJIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsCisJCSAweGVjLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVlLCAweGVlLCAweGVlLAorCQkgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwgMHhmMCwgMHhmMCwKKwkJIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjMsIDB4ZjMsIDB4ZjMsCisJCSAweGYzLCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY1LCAweGY1LCAweGY1LAorCQkgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNywgMHhmNywKKwkJIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjksIDB4ZjksCisJCSAweGY5LCAweGY5LCAweGZhLCAweGY5LCAweGZhLCAweGZhLCAweGZhLCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmJ9LAorCQl7MHgwOCwgMHgwYSwgMHgwYywgMHgwZSwgMHgxMCwgMHgxMSwgMHgxNCwgMHgxNSwKKwkJIDB4MTYsIDB4MTcsIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWUsIDB4MWYsIDB4MjAsCisJCSAweDIzLCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJiLCAweDJjLAorCQkgMHgyZCwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMywgMHgzNCwgMHgzNCwgMHgzNSwKKwkJIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2MsIDB4M2QsCisJCSAweDNmLCAweDQwLCAweDQyLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ1LAorCQkgMHg0NywgMHg0OCwgMHg0OSwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YiwgMHg0YywKKwkJIDB4NGQsIDB4NGYsIDB4NGYsIDB4NTAsIDB4NTIsIDB4NTIsIDB4NTMsIDB4NTQsCisJCSAweDU0LCAweDU1LCAweDU1LCAweDU2LCAweDU4LCAweDU4LCAweDU5LCAweDVhLAorCQkgMHg1YSwgMHg1YiwgMHg1YiwgMHg1YywgMHg1ZSwgMHg1ZSwgMHg1ZiwgMHg1ZiwKKwkJIDB4NjAsIDB4NjAsIDB4NjEsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjMsIDB4NjUsCisJCSAweDY1LCAweDY2LCAweDY2LCAweDY3LCAweDY3LCAweDY4LCAweDY4LCAweDY5LAorCQkgMHg2OSwgMHg2YSwgMHg2YSwgMHg2YywgMHg2YywgMHg2ZCwgMHg2ZCwgMHg2ZSwKKwkJIDB4NmUsIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzAsIDB4NzEsIDB4NzEsIDB4NzMsCisJCSAweDczLCAweDc0LCAweDc0LCAweDc0LCAweDc1LCAweDc1LCAweDc3LCAweDc3LAorCQkgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YiwKKwkJIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsIDB4N2QsIDB4N2QsIDB4N2YsIDB4N2YsCisJCSAweDdmLCAweDgwLCAweDgwLCAweDgxLCAweDgxLCAweDgxLCAweDgyLCAweDgyLAorCQkgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NiwgMHg4NiwgMHg4NiwKKwkJIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsIDB4OGEsCisJCSAweDhiLCAweDhiLCAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhlLCAweDhlLAorCQkgMHg4ZSwgMHg4ZiwgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MSwgMHg5MSwKKwkJIDB4OTEsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTQsCisJCSAweDk0LCAweDk0LCAweDk2LCAweDk2LCAweDk2LCAweDk3LCAweDk3LCAweDk3LAorCQkgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5YSwKKwkJIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWMsIDB4OWMsIDB4OWMsCisJCSAweDljLCAweDlkLCAweDlkLCAweDlkLCAweDllLCAweDllLCAweDllLCAweGEwLAorCQkgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMiwgMHhhMiwKKwkJIDB4YTIsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTQsCisJCSAweGE1LCAweGE1LCAweGE1LCAweGE1LCAweGE2LCAweGE2LCAweGE2LCAweGE2LAorCQkgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhYiwKKwkJIDB4YWEsIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWQsIDB4YWQsCisJCSAweGFkLCAweGFkLCAweGFlLCAweGFlLCAweGFlLCAweGFlLCAweGFmLCAweGFmLAorCQkgMHhhZiwgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwKKwkJIDB4YjEsIDB4YjEsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsCisJCSAweGIzLCAweGIzLCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI2LCAweGI2LAorCQkgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywgMHhiNywgMHhiNywgMHhiOCwgMHhiOCwKKwkJIDB4YjgsIDB4YjgsIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YmEsIDB4YmEsCisJCSAweGJhLCAweGJhLCAweGJhLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJkLAorCQkgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwKKwkJIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsCisJCSAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMzLCAweGMzLCAweGMzLAorCQkgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNSwgMHhjNSwKKwkJIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzcsCisJCSAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM5LCAweGM5LCAweGM5LCAweGM5LAorCQkgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwKKwkJIDB4Y2IsIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2QsCisJCSAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNlLCAweGNlLCAweGNlLCAweGNlLAorCQkgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhkMCwgMHhkMCwgMHhkMCwKKwkJIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDMsCisJCSAweGQzLCAweGQzLCAweGQzLCAweGQzLCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LAorCQkgMHhkNCwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNywgMHhkNywKKwkJIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsCisJCSAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGRhLCAweGRhLAorCQkgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsCisJCSAweGRlLCAweGRlLCAweGRlLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLAorCQkgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMSwgMHhlMSwgMHhlMSwKKwkJIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsCisJCSAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGU0LCAweGU0LAorCQkgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwKKwkJIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTcsIDB4ZTcsCisJCSAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU4LCAweGU4LCAweGU4LCAweGU4LAorCQkgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlYiwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsCisJCSAweGVjLCAweGVjLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLAorCQkgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwKKwkJIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisJCSAweGYwLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYzLAorCQkgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwKKwkJIDB4ZjQsIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsCisJCSAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY3LCAweGY3LAorCQkgMHhmNywgMHhmNywgMHhmNywgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwKKwkJIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZmEsCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmJ9LAorCQl7MHgwZCwgMHgxMCwgMHgxMSwgMHgxNCwgMHgxNSwgMHgxNywgMHgxOCwgMHgxYiwKKwkJIDB4MWMsIDB4MWUsIDB4MjAsIDB4MjIsIDB4MjMsIDB4MjYsIDB4MjcsIDB4MjgsCisJCSAweDI5LCAweDJiLCAweDJkLCAweDJmLCAweDMwLCAweDMxLCAweDMzLCAweDM0LAorCQkgMHgzNSwgMHgzNywgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwKKwkJIDB4M2YsIDB4NDAsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDcsIDB4NDgsCisJCSAweDQ5LCAweDRhLCAweDRiLCAweDRiLCAweDRjLCAweDRkLCAweDRmLCAweDUwLAorCQkgMHg1MiwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NiwgMHg1OCwKKwkJIDB4NTksIDB4NWEsIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWUsIDB4NWUsIDB4NWYsCisJCSAweDYwLCAweDYwLCAweDYxLCAweDYyLCAweDYyLCAweDYzLCAweDY1LCAweDY1LAorCQkgMHg2NiwgMHg2NywgMHg2NywgMHg2OCwgMHg2OSwgMHg2OSwgMHg2YSwgMHg2YywKKwkJIDB4NmMsIDB4NmQsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzAsCisJCSAweDcxLCAweDczLCAweDczLCAweDc0LCAweDc0LCAweDc1LCAweDc1LCAweDc3LAorCQkgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwKKwkJIDB4N2MsIDB4N2MsIDB4N2QsIDB4N2QsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsCisJCSAweDgxLCAweDgxLCAweDgyLCAweDgyLCAweDg0LCAweDg0LCAweDg1LCAweDg1LAorCQkgMHg4NiwgMHg4NiwgMHg4OCwgMHg4OCwgMHg4OSwgMHg4OSwgMHg4YSwgMHg4YSwKKwkJIDB4OGIsIDB4OGIsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGUsIDB4OGUsIDB4OGYsCisJCSAweDhmLCAweDkwLCAweDkwLCAweDkxLCAweDkxLCAweDkxLCAweDkyLCAweDkyLAorCQkgMHg5MywgMHg5MywgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NiwgMHg5NiwgMHg5NywKKwkJIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksIDB4OWEsIDB4OWEsCisJCSAweDlhLCAweDliLCAweDliLCAweDljLCAweDljLCAweDljLCAweDlkLCAweDlkLAorCQkgMHg5ZCwgMHg5ZSwgMHg5ZSwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMSwgMHhhMSwKKwkJIDB4YTEsIDB4YTIsIDB4YTIsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsCisJCSAweGE0LCAweGE1LCAweGE1LCAweGE1LCAweGE2LCAweGE2LCAweGE4LCAweGE4LAorCQkgMHhhOCwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhYiwgMHhhYiwgMHhhYiwgMHhhYywKKwkJIDB4YWMsIDB4YWMsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWUsIDB4YWUsIDB4YWUsCisJCSAweGFmLCAweGFmLCAweGFmLCAweGIwLCAweGIwLCAweGIwLCAweGIxLCAweGIxLAorCQkgMHhiMSwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiNCwKKwkJIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjcsIDB4YjcsCisJCSAweGI3LCAweGI4LCAweGI4LCAweGI4LCAweGI5LCAweGI5LCAweGI5LCAweGJhLAorCQkgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYywgMHhiYywgMHhiYywgMHhiZCwgMHhiZCwKKwkJIDB4YmQsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmYsIDB4YmYsIDB4YmYsCisJCSAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMyLCAweGMyLCAweGMyLCAweGMzLAorCQkgMHhjMywgMHhjMywgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNSwgMHhjNSwKKwkJIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzcsIDB4YzcsCisJCSAweGM3LCAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGNhLCAweGNhLCAweGNhLAorCQkgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYywgMHhjYywgMHhjYywgMHhjYywKKwkJIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsCisJCSAweGNmLCAweGNmLCAweGNmLCAweGNmLCAweGQwLCAweGQwLCAweGQwLCAweGQwLAorCQkgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywgMHhkMywgMHhkMywKKwkJIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsCisJCSAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LAorCQkgMHhkOSwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsCisJCSAweGRkLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRmLCAweGRmLCAweGRmLAorCQkgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMSwgMHhlMSwKKwkJIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTMsIDB4ZTMsCisJCSAweGUzLCAweGUzLCAweGUzLCAweGU0LCAweGU0LCAweGU0LCAweGU0LCAweGU1LAorCQkgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNiwKKwkJIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTgsIDB4ZTgsIDB4ZTgsCisJCSAweGU4LCAweGU5LCAweGU5LCAweGU5LCAweGU5LCAweGU5LCAweGViLCAweGViLAorCQkgMHhlYiwgMHhlYiwgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlZCwKKwkJIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsCisJCSAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGYwLCAweGYwLCAweGYwLAorCQkgMHhmMCwgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMywKKwkJIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsCisJCSAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY2LCAweGY2LCAweGY2LAorCQkgMHhmNiwgMHhmNiwgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmOCwKKwkJIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksCisJCSAweGY5LCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmJ9CisJICAgIH0sCisJICAgIHsJCQkJCQkJLyogZ2FtbWEgNSAqLworCQl7MHgxNiwgMHgxOCwgMHgxOSwgMHgxYiwgMHgxZCwgMHgxZSwgMHgyMCwgMHgyMSwKKwkJIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjcsIDB4MjgsIDB4MmEsIDB4MmIsIDB4MmMsCisJCSAweDJkLCAweDJmLCAweDMwLCAweDMxLCAweDMyLCAweDM0LCAweDM1LCAweDM2LAorCQkgMHgzNywgMHgzOCwgMHgzOSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwKKwkJIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisJCSAweDQ4LCAweDQ5LCAweDRhLCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLAorCQkgMHg0ZiwgMHg1MCwgMHg1MSwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwKKwkJIDB4NTYsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NTksIDB4NWEsIDB4NWIsCisJCSAweDVjLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAweDVmLCAweDYwLCAweDYxLAorCQkgMHg2MiwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NiwKKwkJIDB4NjcsIDB4NjgsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmEsIDB4NmIsIDB4NmIsCisJCSAweDZjLCAweDZkLCAweDZkLCAweDZlLCAweDZmLCAweDZmLCAweDcwLCAweDcwLAorCQkgMHg3MSwgMHg3MSwgMHg3MiwgMHg3MywgMHg3MywgMHg3NCwgMHg3NCwgMHg3NSwKKwkJIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksCisJCSAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdjLCAweDdkLCAweDdkLCAweDdlLAorCQkgMHg3ZSwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MiwKKwkJIDB4ODIsIDB4ODMsIDB4ODMsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsCisJCSAweDg2LCAweDg2LCAweDg3LCAweDg3LCAweDg4LCAweDg4LCAweDg5LCAweDg5LAorCQkgMHg4YSwgMHg4YSwgMHg4YiwgMHg4YiwgMHg4YiwgMHg4YywgMHg4YywgMHg4ZCwKKwkJIDB4OGQsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsIDB4OGYsIDB4OTAsIDB4OTAsCisJCSAweDkxLCAweDkxLCAweDkxLCAweDkyLCAweDkyLCAweDkzLCAweDkzLCAweDk0LAorCQkgMHg5NCwgMHg5NCwgMHg5NSwgMHg5NSwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NywKKwkJIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksIDB4OWEsIDB4OWEsCisJCSAweDlhLCAweDliLCAweDliLCAweDliLCAweDljLCAweDljLCAweDlkLCAweDlkLAorCQkgMHg5ZCwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHg5ZiwgMHg5ZiwgMHhhMCwgMHhhMCwKKwkJIDB4YTAsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTMsCisJCSAweGEzLCAweGE0LCAweGE0LCAweGE0LCAweGE1LCAweGE1LCAweGE1LCAweGE2LAorCQkgMHhhNiwgMHhhNiwgMHhhNywgMHhhNywgMHhhNywgMHhhOCwgMHhhOCwgMHhhOCwKKwkJIDB4YTksIDB4YTksIDB4YTksIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWIsIDB4YWIsCisJCSAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFkLCAweGFkLCAweGFkLCAweGFlLAorCQkgMHhhZSwgMHhhZSwgMHhhZiwgMHhhZiwgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwKKwkJIDB4YjAsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsCisJCSAweGIzLCAweGIzLCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI1LCAweGI1LAorCQkgMHhiNSwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywgMHhiNywgMHhiNywKKwkJIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjksIDB4YjksIDB4YjksIDB4YmEsIDB4YmEsCisJCSAweGJhLCAweGJhLCAweGJiLCAweGJiLCAweGJiLCAweGJjLCAweGJjLCAweGJjLAorCQkgMHhiYywgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwKKwkJIDB4YmYsIDB4YmYsIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzEsCisJCSAweGMxLCAweGMxLCAweGMxLCAweGMyLCAweGMyLCAweGMyLCAweGMzLCAweGMzLAorCQkgMHhjMywgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNSwgMHhjNSwKKwkJIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzcsIDB4YzcsIDB4YzcsCisJCSAweGM3LCAweGM4LCAweGM4LCAweGM4LCAweGM4LCAweGM5LCAweGM5LCAweGM5LAorCQkgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwKKwkJIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2QsIDB4Y2QsIDB4Y2QsCisJCSAweGNkLCAweGNlLCAweGNlLCAweGNlLCAweGNlLCAweGNmLCAweGNmLCAweGNmLAorCQkgMHhjZiwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMSwgMHhkMSwgMHhkMSwKKwkJIDB4ZDEsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDMsIDB4ZDMsIDB4ZDMsCisJCSAweGQzLCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ1LCAweGQ1LCAweGQ1LAorCQkgMHhkNSwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNywgMHhkNywKKwkJIDB4ZDcsIDB4ZDcsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDksIDB4ZDksCisJCSAweGQ5LCAweGQ5LCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRiLAorCQkgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYywgMHhkYywgMHhkYywgMHhkYywgMHhkZCwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsCisJCSAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGUwLCAweGUwLCAweGUwLAorCQkgMHhlMCwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMiwgMHhlMiwKKwkJIDB4ZTIsIDB4ZTIsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTQsCisJCSAweGU0LCAweGU0LCAweGU0LCAweGU1LCAweGU1LCAweGU1LCAweGU1LCAweGU1LAorCQkgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNywgMHhlNywgMHhlNywgMHhlNywKKwkJIDB4ZTcsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTksIDB4ZTksCisJCSAweGU5LCAweGU5LCAweGVhLCAweGVhLCAweGVhLCAweGVhLCAweGVhLCAweGViLAorCQkgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYywgMHhlYywgMHhlYywgMHhlYywKKwkJIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWUsIDB4ZWUsIDB4ZWUsCisJCSAweGVlLCAweGVlLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGYwLAorCQkgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwKKwkJIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjMsIDB4ZjMsIDB4ZjMsCisJCSAweGYzLCAweGYzLCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY1LAorCQkgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmQsIDB4ZmQsCisJCSAweGZkLCAweGZkLCAweGZkLCAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZlLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9LAorCQl7MHgwZiwgMHgxMSwgMHgxMiwgMHgxNCwgMHgxNSwgMHgxNiwgMHgxOCwgMHgxOSwKKwkJIDB4MWEsIDB4MWIsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsCisJCSAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLAorCQkgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMSwgMHgzMiwKKwkJIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzgsIDB4MzksCisJCSAweDNhLCAweDNiLCAweDNjLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAweDNmLAorCQkgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NCwgMHg0NSwKKwkJIDB4NDYsIDB4NDcsIDB4NDcsIDB4NDgsIDB4NDksIDB4NDksIDB4NGEsIDB4NGIsCisJCSAweDRiLCAweDRjLCAweDRjLCAweDRkLCAweDRlLCAweDRlLCAweDRmLCAweDUwLAorCQkgMHg1MCwgMHg1MSwgMHg1MSwgMHg1MiwgMHg1MywgMHg1MywgMHg1NCwgMHg1NCwKKwkJIDB4NTUsIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTgsIDB4NTksCisJCSAweDU5LCAweDVhLCAweDVhLCAweDViLCAweDViLCAweDVjLCAweDVjLCAweDVkLAorCQkgMHg1ZCwgMHg1ZSwgMHg1ZSwgMHg1ZiwgMHg1ZiwgMHg2MCwgMHg2MCwgMHg2MSwKKwkJIDB4NjEsIDB4NjIsIDB4NjIsIDB4NjMsIDB4NjMsIDB4NjQsIDB4NjQsIDB4NjUsCisJCSAweDY1LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDY3LCAweDY4LCAweDY4LAorCQkgMHg2OSwgMHg2OSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YiwgMHg2YiwgMHg2YywKKwkJIDB4NmMsIDB4NmQsIDB4NmQsIDB4NmQsIDB4NmUsIDB4NmUsIDB4NmYsIDB4NmYsCisJCSAweDZmLCAweDcwLCAweDcwLCAweDcxLCAweDcxLCAweDcxLCAweDcyLCAweDcyLAorCQkgMHg3MywgMHg3MywgMHg3MywgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NSwKKwkJIDB4NzYsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsCisJCSAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLAorCQkgMHg3YiwgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZSwgMHg3ZSwKKwkJIDB4N2UsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsCisJCSAweDgxLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDgzLCAweDgzLCAweDgzLAorCQkgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwKKwkJIDB4ODYsIDB4ODYsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODgsIDB4ODgsIDB4ODgsCisJCSAweDg4LCAweDg5LCAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhhLCAweDhiLAorCQkgMHg4YiwgMHg4YiwgMHg4YiwgMHg4YywgMHg4YywgMHg4YywgMHg4ZCwgMHg4ZCwKKwkJIDB4OGQsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsIDB4OGYsIDB4OGYsCisJCSAweDkwLCAweDkwLCAweDkwLCAweDkwLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCQkgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MywgMHg5MywgMHg5MywgMHg5MywgMHg5NCwKKwkJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTUsIDB4OTUsIDB4OTUsIDB4OTYsIDB4OTYsCisJCSAweDk2LCAweDk2LCAweDk3LCAweDk3LCAweDk3LCAweDk3LCAweDk4LCAweDk4LAorCQkgMHg5OCwgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5YSwgMHg5YSwKKwkJIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWMsIDB4OWMsCisJCSAweDljLCAweDljLCAweDlkLCAweDlkLCAweDlkLCAweDlkLCAweDllLCAweDllLAorCQkgMHg5ZSwgMHg5ZSwgMHg5ZiwgMHg5ZiwgMHg5ZiwgMHg5ZiwgMHhhMCwgMHhhMCwKKwkJIDB4YTAsIDB4YTAsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsCisJCSAweGEyLCAweGEyLCAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGEzLCAweGE0LAorCQkgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwKKwkJIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisJCSAweGE4LCAweGE4LCAweGE4LCAweGE4LCAweGE4LCAweGE5LCAweGE5LCAweGE5LAorCQkgMHhhOSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYiwgMHhhYiwKKwkJIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWQsCisJCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFlLCAweGFlLCAweGFlLCAweGFlLAorCQkgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwKKwkJIDB4YjAsIDB4YjAsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjIsCisJCSAweGIyLCAweGIyLCAweGIyLCAweGIyLCAweGIzLCAweGIzLCAweGIzLCAweGIzLAorCQkgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNSwgMHhiNSwgMHhiNSwKKwkJIDB4YjUsIDB4YjUsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjcsCisJCSAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI4LCAweGI4LCAweGI4LCAweGI4LAorCQkgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiYSwgMHhiYSwKKwkJIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsCisJCSAweGJiLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJkLCAweGJkLAorCQkgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwKKwkJIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsCisJCSAweGMwLCAweGMwLCAweGMwLCAweGMxLCAweGMxLCAweGMxLCAweGMxLCAweGMxLAorCQkgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywgMHhjMywKKwkJIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsCisJCSAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM2LCAweGM2LAorCQkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjNywKKwkJIDB4YzcsIDB4YzgsIDB4YzgsIDB4YzgsIDB4YzgsIDB4YzgsIDB4YzksIDB4YzksCisJCSAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGNhLCAweGNhLCAweGNhLCAweGNhLAorCQkgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYywKKwkJIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2QsCisJCSAweGNkLCAweGNkLCAweGNlLCAweGNlLCAweGNlLCAweGNlLCAweGNlLCAweGNlLAorCQkgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhkMCwgMHhkMCwgMHhkMCwKKwkJIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsCisJCSAweGQxLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQzLAorCQkgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwKKwkJIDB4ZDQsIDB4ZDQsIDB4ZDUsIDB4ZDUsIDB4ZDUsIDB4ZDUsIDB4ZDUsIDB4ZDUsCisJCSAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ3LCAweGQ3LAorCQkgMHhkNywgMHhkNywgMHhkNywgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwKKwkJIDB4ZDgsIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZGEsCisJCSAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRiLCAweGRiLCAweGRiLAorCQkgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYywgMHhkYywgMHhkYywgMHhkYywgMHhkYywKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsCisJCSAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRmLCAweGRmLCAweGRmLCAweGRmLAorCQkgMHhkZiwgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwKKwkJIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsCisJCSAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLCAweGUzLCAweGUzLAorCQkgMHhlMywgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsCisJCSAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LAorCQkgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwgMHhlOSwKKwkJIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWEsIDB4ZWEsIDB4ZWEsIDB4ZWEsCisJCSAweGVhLCAweGVhLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCQkgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlZCwgMHhlZCwKKwkJIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsCisJCSAweGVlLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGYwLAorCQkgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwKKwkJIDB4ZjEsIDB4ZjEsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjIsCisJCSAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGY0LCAweGY0LCAweGY0LAorCQkgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwKKwkJIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsCisJCSAweGY3LCAweGY3LCAweGY3LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY4LAorCQkgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZkLCAweGZkLAorCQkgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwKKwkJIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9LAorCQl7MHgxMywgMHgxNSwgMHgxNiwgMHgxOCwgMHgxOSwgMHgxYiwgMHgxYywgMHgxZSwKKwkJIDB4MWYsIDB4MjAsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjYsIDB4MjcsIDB4MjgsCisJCSAweDI5LCAweDJhLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAweDMwLCAweDMxLAorCQkgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKKwkJIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIDB4NDAsIDB4NDEsCisJCSAweDQyLCAweDQzLCAweDQ0LCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LAorCQkgMHg0OSwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZCwgMHg0ZSwKKwkJIDB4NGYsIDB4NTAsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTMsIDB4NTQsCisJCSAweDU1LCAweDU1LCAweDU2LCAweDU3LCAweDU3LCAweDU4LCAweDU5LCAweDU5LAorCQkgMHg1YSwgMHg1YiwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZCwgMHg1ZSwgMHg1ZiwKKwkJIDB4NWYsIDB4NjAsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjIsIDB4NjMsIDB4NjMsCisJCSAweDY0LCAweDY1LCAweDY1LCAweDY2LCAweDY2LCAweDY3LCAweDY3LCAweDY4LAorCQkgMHg2OSwgMHg2OSwgMHg2YSwgMHg2YSwgMHg2YiwgMHg2YiwgMHg2YywgMHg2YywKKwkJIDB4NmQsIDB4NmQsIDB4NmUsIDB4NmUsIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzAsCisJCSAweDcxLCAweDcxLCAweDcyLCAweDcyLCAweDczLCAweDczLCAweDc0LCAweDc0LAorCQkgMHg3NSwgMHg3NSwgMHg3NiwgMHg3NiwgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwKKwkJIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2MsCisJCSAweDdjLCAweDdkLCAweDdkLCAweDdlLCAweDdlLCAweDdlLCAweDdmLCAweDdmLAorCQkgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MywKKwkJIDB4ODMsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODYsIDB4ODYsCisJCSAweDg2LCAweDg3LCAweDg3LCAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDg5LAorCQkgMHg4OSwgMHg4YSwgMHg4YSwgMHg4YiwgMHg4YiwgMHg4YiwgMHg4YywgMHg4YywKKwkJIDB4OGMsIDB4OGQsIDB4OGQsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsIDB4OGYsCisJCSAweDhmLCAweDkwLCAweDkwLCAweDkwLCAweDkxLCAweDkxLCAweDkyLCAweDkyLAorCQkgMHg5MiwgMHg5MywgMHg5MywgMHg5MywgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NSwKKwkJIDB4OTUsIDB4OTUsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTcsCisJCSAweDk4LCAweDk4LCAweDk4LCAweDk5LCAweDk5LCAweDk5LCAweDlhLCAweDlhLAorCQkgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywgMHg5YywgMHg5ZCwKKwkJIDB4OWQsIDB4OWQsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWYsIDB4OWYsCisJCSAweDlmLCAweGEwLCAweGEwLCAweGEwLCAweGExLCAweGExLCAweGExLCAweGEyLAorCQkgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMywgMHhhMywgMHhhMywgMHhhNCwgMHhhNCwKKwkJIDB4YTQsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTYsIDB4YTYsIDB4YTYsCisJCSAweGE3LCAweGE3LCAweGE3LCAweGE3LCAweGE4LCAweGE4LCAweGE4LCAweGE5LAorCQkgMHhhOSwgMHhhOSwgMHhhOSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYiwgMHhhYiwKKwkJIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWQsIDB4YWQsCisJCSAweGFkLCAweGFlLCAweGFlLCAweGFlLCAweGFlLCAweGFmLCAweGFmLCAweGFmLAorCQkgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwKKwkJIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisJCSAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI1LCAweGI1LCAweGI1LCAweGI1LAorCQkgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywgMHhiNywgMHhiNywKKwkJIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisJCSAweGJhLCAweGJhLCAweGJhLCAweGJhLCAweGJiLCAweGJiLCAweGJiLCAweGJiLAorCQkgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwKKwkJIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsCisJCSAweGJmLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMxLCAweGMxLCAweGMxLAorCQkgMHhjMSwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywKKwkJIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsCisJCSAweGM1LCAweGM1LCAweGM1LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM3LAorCQkgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjOCwgMHhjOCwgMHhjOCwgMHhjOCwKKwkJIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsIDB4Y2EsCisJCSAweGNhLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNjLCAweGNjLAorCQkgMHhjYywgMHhjYywgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsCisJCSAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQxLCAweGQxLCAweGQxLAorCQkgMHhkMSwgMHhkMSwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMywKKwkJIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsCisJCSAweGQ1LCAweGQ1LCAweGQ1LCAweGQ1LCAweGQ1LCAweGQ2LCAweGQ2LCAweGQ2LAorCQkgMHhkNiwgMHhkNiwgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkOCwKKwkJIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksCisJCSAweGQ5LCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRiLCAweGRiLAorCQkgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYywgMHhkYywgMHhkYywgMHhkYywgMHhkYywKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsCisJCSAweGRlLCAweGRlLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGUwLAorCQkgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwKKwkJIDB4ZTEsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTMsIDB4ZTMsCisJCSAweGUzLCAweGUzLCAweGUzLCAweGU0LCAweGU0LCAweGU0LCAweGU0LCAweGU0LAorCQkgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNiwgMHhlNiwKKwkJIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsCisJCSAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU5LCAweGU5LCAweGU5LAorCQkgMHhlOSwgMHhlOSwgMHhlOSwgMHhlYSwgMHhlYSwgMHhlYSwgMHhlYSwgMHhlYSwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsCisJCSAweGVjLCAweGVjLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLAorCQkgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwKKwkJIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisJCSAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYyLCAweGYyLCAweGYyLAorCQkgMHhmMiwgMHhmMiwgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmMywKKwkJIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsCisJCSAweGY1LCAweGY1LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LAorCQkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmOCwgMHhmOCwgMHhmOCwKKwkJIDB4ZjgsIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywKKwkJIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmUsIDB4ZmUsIDB4ZmUsCisJCSAweGZlLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9LAorCSAgICB9LAorCX07CisKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMjFfRU5EUF8xX0NUTCwgMHgwMCk7CisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgxMCkKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDAyLCAweDI4KTsKKy8qCW1zbGVlcCg1MCk7ICovCisJZ2FtbWEgPSBzZC0+Y3RybHNbR0FNTUFdLnZhbDsKKwlidWxrX3coZ3NwY2FfZGV2LCAweDAwLCBnYW1tYV90YltnYW1tYV1bMF0sIDEwMjQpOworCWJ1bGtfdyhnc3BjYV9kZXYsIDB4MDEsIGdhbW1hX3RiW2dhbW1hXVsxXSwgMTAyNCk7CisJYnVsa193KGdzcGNhX2RldiwgMHgwMiwgZ2FtbWFfdGJbZ2FtbWFdWzJdLCAxMDI0KTsKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODEwKSB7CisJCWludCBpOworCisJCXJlZ193KGdzcGNhX2RldiwgMHgwMiwgMHgyYik7CisJCXJlZ193KGdzcGNhX2RldiwgMHgwMiwgMHgyOCk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNTVfR0FNTUFfUiwKKwkJCQlnYW1tYV90YltnYW1tYV1bMF1baV0pOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDIsIDB4MmIpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDIsIDB4MjgpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjU2X0dBTU1BX0csCisJCQkJZ2FtbWFfdGJbZ2FtbWFdWzFdW2ldKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDAyLCAweDJiKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDAyLCAweDI4KTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I1N19HQU1NQV9CLAorCQkJCWdhbW1hX3RiW2dhbW1hXVsyXVtpXSk7CisJCXJlZ193KGdzcGNhX2RldiwgMHgwMiwgMHgyOCk7CisJfQorCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IyMV9FTkRQXzFfQ1RMLCAweDAzKTsKKy8qCW1zbGVlcCg1MCk7ICovCit9CisKK3N0YXRpYyB2b2lkIHNldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4IHZhbDsKKworCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApIHsKKwkJdmFsID0gc2QtPmN0cmxzW1NIQVJQTkVTU10udmFsCisJCQkJfCAweDA4OwkJLyogZ3JpZCBjb21wZW5zYXRpb24gZW5hYmxlICovCisJCWlmIChnc3BjYV9kZXYtPndpZHRoID09IDY0MCkKKwkJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I3OF9GT1JNQVQsIDB4MDApOyAvKiB2Z2EgKi8KKwkJZWxzZQorCQkJdmFsIHw9IDB4MDQ7CQkvKiBzY2FsaW5nIGRvd24gZW5hYmxlICovCisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I1RF9ERU1PU0FJQ19DRkcsIHZhbCk7CisJfSBlbHNlIHsKKwkJdmFsID0gKHNkLT5jdHJsc1tTSEFSUE5FU1NdLnZhbCA8PCA1KSB8IDB4MDg7CisJCXJlZ193KGdzcGNhX2RldiwgMHg1OSwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlpZiAoZ3NwY2FfZGV2LT5jdHJsX2RpcyAmICgxIDw8IEFVVE9HQUlOKSkKKwkJcmV0dXJuOworCWlmIChzZC0+Y3RybHNbQVVUT0dBSU5dLnZhbCkgeworCQlzZC0+YWdfY250ID0gQUdfQ05UX1NUQVJUOworCQlnc3BjYV9kZXYtPmN0cmxfaW5hYyB8PSAoMSA8PCBFWFBPU1VSRSkgfCAoMSA8PCBHQUlOKTsKKwl9IGVsc2UgeworCQlzZC0+YWdfY250ID0gLTE7CisJCWdzcGNhX2Rldi0+Y3RybF9pbmFjICY9IH4oKDEgPDwgRVhQT1NVUkUpIHwgKDEgPDwgR0FJTikpOworCX0KK30KKworLyogc2V0IHRoZSByZXNvbHV0aW9uIGZvciBzZW5zb3IgY3gwMzQyICovCitzdGF0aWMgdm9pZCBzZXRfcmVzb2x1dGlvbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDApOworCWlmIChnc3BjYV9kZXYtPndpZHRoID09IDMyMCkgeworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SM0ZfRlJBTUVfUkFURSwgMHgwNik7CisJCW1zbGVlcCgxMDApOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9BVVRPX0FEQ19DQUxJQiwgMHgwMSk7CisJCW1zbGVlcCgxMDApOworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMjFfRU5EUF8xX0NUTCwgMHgwMyk7CisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I3OF9GT1JNQVQsIDB4MDEpOwkvKiBxdmdhICovCisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I1RF9ERU1PU0FJQ19DRkcsIDB4MGQpOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9FWFBPX0xJTkVfTCwgMHgzNyk7CisJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX0VYUE9fTElORV9ILCAweDAxKTsKKwl9IGVsc2UgeworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SM0ZfRlJBTUVfUkFURSwgMHgwNSk7CisJCW1zbGVlcCgxMDApOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9BVVRPX0FEQ19DQUxJQiwgMHgwMSk7CisJCW1zbGVlcCgxMDApOworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMjFfRU5EUF8xX0NUTCwgMHgwMyk7CisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I3OF9GT1JNQVQsIDB4MDApOwkvKiB2Z2EgKi8KKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjVEX0RFTU9TQUlDX0NGRywgMHgwOSk7CisJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX0VYUE9fTElORV9MLCAweGNmKTsKKwkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfRVhQT19MSU5FX0gsIDB4MDApOworCX0KKwlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9TWVNfQ1RSTF8wLCAweDAxKTsKKwlidWxrX3coZ3NwY2FfZGV2LCAweDAzLCBjb2xvcl9nYWluW1NFTlNPUl9DWDAzNDJdLAorCQkJCUFSUkFZX1NJWkUoY29sb3JfZ2FpblswXSkpOworCXNldGdhbW1hKGdzcGNhX2Rldik7CisJc2V0cXVhbGl0eShnc3BjYV9kZXYpOworfQorCisvKiBjb252ZXJ0IHRoZSBmcmFtZSByYXRlIHRvIGEgdHA2OHgwIHZhbHVlICovCitzdGF0aWMgaW50IGdldF9mcl9pZHgoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgaTsKKworCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmF0ZXMpIC0gMTsgaSsrKSB7CisJCQlpZiAoc2QtPmZyYW1lcmF0ZSA+PSByYXRlc1tpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpID0gNiAtIGk7CQkvKiAxID0gNWZwcyAuLiA2ID0gMzBmcHMgKi8KKworCQkvKiA2NDB4NDgwICogMzAgZnBzIGRvZXMgbm90IHdvcmsgKi8KKwkJaWYgKGkgPT0gNgkJCS8qIGlmIDMwIGZwcyAqLworCQkgJiYgZ3NwY2FfZGV2LT53aWR0aCA9PSA2NDApCisJCQlpID0gMHg4NjsJCS8qIDE1IGZwcyAqLworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhdGVzXzY4MTApIC0gMTsgaSsrKSB7CisJCQlpZiAoc2QtPmZyYW1lcmF0ZSA+PSByYXRlc182ODEwW2ldKQorCQkJCWJyZWFrOworCQl9CisJCWkgPSA3IC0gaTsJCS8qIDMgPSA1ZnBzIC4uIDcgPSAzMGZwcyAqLworCisJCS8qIDY0MHg0ODAgKiAzMCBmcHMgZG9lcyBub3Qgd29yayAqLworCQlpZiAoaSA9PSA3CQkJLyogaWYgMzAgZnBzICovCisJCSAmJiBnc3BjYV9kZXYtPndpZHRoID09IDY0MCkKKwkJCWkgPSA2OwkJCS8qIDE1IGZwcyAqLworCQlpIHw9IDB4ODA7CQkJLyogY2xvY2sgKiAxICovCisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBzZXRmcmFtZXJhdGUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCBmcl9pZHg7CisKKwlmcl9pZHggPSBnZXRfZnJfaWR4KGdzcGNhX2Rldik7CisKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODEwKSB7CisJCXJlZ19yKGdzcGNhX2RldiwgMHg3Yik7CisJCXJlZ193KGdzcGNhX2RldiwgMHg3YiwKKwkJCXNkLT5zZW5zb3IgPT0gU0VOU09SX0NYMDM0MiA/IDB4MTAgOiAweDkwKTsKKwkJaWYgKHNkLT5jdHJsc1tFWFBPU1VSRV0udmFsID49IDEyOCkKKwkJCWZyX2lkeCA9IDB4ZjA7CQkvKiBsb3dlciBmcmFtZSByYXRlICovCisJfQorCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjNGX0ZSQU1FX1JBVEUsIGZyX2lkeCk7CisKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfQ1gwMzQyKQorCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9BVVRPX0FEQ19DQUxJQiwgMHgwMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHJnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IHJnYWluOworCisJcmdhaW4gPSBzZC0+Y3RybHNbUkdBSU5dLnZhbDsKKwlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9SQVdfUkdBSU5fSCwgcmdhaW4gPj4gOCk7CisJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfUkFXX1JHQUlOX0wsIHJnYWluKTsKKwlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9TWVNfQ1RSTF8wLCAweDgwKTsKK30KKworc3RhdGljIGludCBzZF9zZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9DWDAzNDIpIHsKKwkJc2QtPmN0cmxzW0JHQUlOXS52YWwgPSBzZC0+Y3RybHNbQkdBSU5dLnZhbAorCQkJCQkqIHZhbCAvIHNkLT5jdHJsc1tHQUlOXS52YWw7CisJCWlmIChzZC0+Y3RybHNbQkdBSU5dLnZhbCA+IDQwOTUpCisJCQlzZC0+Y3RybHNbQkdBSU5dLnZhbCA9IDQwOTU7CisJCXNkLT5jdHJsc1tSR0FJTl0udmFsID0gc2QtPmN0cmxzW1JHQUlOXS52YWwKKwkJCQkJKiB2YWwgLyBzZC0+Y3RybHNbR0FJTl0udmFsOworCQlpZiAoc2QtPmN0cmxzW1JHQUlOXS52YWwgPiA0MDk1KQorCQkJc2QtPmN0cmxzW1JHQUlOXS52YWwgPSA0MDk1OworCX0KKwlzZC0+Y3RybHNbR0FJTl0udmFsID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworfQorCitzdGF0aWMgdm9pZCBzZXRiZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBiZ2FpbjsKKworCWJnYWluID0gc2QtPmN0cmxzW0JHQUlOXS52YWw7CisJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfUkFXX0JHQUlOX0gsIGJnYWluID4+IDgpOworCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1JBV19CR0FJTl9MLCBiZ2Fpbik7CisJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfU1lTX0NUUkxfMCwgMHg4MCk7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUgKi8KK3N0YXRpYyBpbnQgc2RfY29uZmlnKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPmJyaWRnZSA9IGlkLT5kcml2ZXJfaW5mbzsKKworCWdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlID0gdmdhX21vZGU7CisJZ3NwY2FfZGV2LT5jYW0ubm1vZGVzID0gQVJSQVlfU0laRSh2Z2FfbW9kZSk7CisJZ3NwY2FfZGV2LT5jYW0ubW9kZV9mcmFtZXJhdGVzID0gc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwID8KKwkJCWZyYW1lcmF0ZXMgOiBmcmFtZXJhdGVzXzY4MTA7CisKKwlzZC0+ZnJhbWVyYXRlID0gMzA7CQkvKiBkZWZhdWx0OiAzMCBmcHMgKi8KKwlnc3BjYV9kZXYtPmNhbS5jdHJscyA9IHNkLT5jdHJsczsKKwlyZXR1cm4gMDsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCitzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCB0cDY4MDBfcHJlaW5pdFtdID0geworCQl7VFA2ODAwX1IxMF9TSUZfVFlQRSwgMHgwMX0sCS8qIHNpZiAqLworCQl7VFA2ODAwX1IxMV9TSUZfQ09OVFJPTCwgMHgwMX0sCisJCXtUUDY4MDBfUjE1X0dQSU9fUFUsIDB4OWZ9LAorCQl7VFA2ODAwX1IxNl9HUElPX1BELCAweDlmfSwKKwkJe1RQNjgwMF9SMTdfR1BJT19JTywgMHg4MH0sCisJCXtUUDY4MDBfUjE4X0dQSU9fREFUQSwgMHg0MH0sCS8qIExFRCBvZmYgKi8KKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHRwNjgxMF9wcmVpbml0W10gPSB7CisJCXtUUDY4MDBfUjJGX1RJTUlOR19DRkcsIDB4MmZ9LAorCQl7VFA2ODAwX1IxNV9HUElPX1BVLCAweDZmfSwKKwkJe1RQNjgwMF9SMTZfR1BJT19QRCwgMHg0MH0sCisJCXtUUDY4MDBfUjE3X0dQSU9fSU8sIDB4OWZ9LAorCQl7VFA2ODAwX1IxOF9HUElPX0RBVEEsIDB4YzF9LAkvKiBMRUQgb2ZmICovCisJfTsKKworCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApCisJCXJlZ193X2J1Zihnc3BjYV9kZXYsIHRwNjgwMF9wcmVpbml0LAorCQkJCUFSUkFZX1NJWkUodHA2ODAwX3ByZWluaXQpKTsKKwllbHNlCisJCXJlZ193X2J1Zihnc3BjYV9kZXYsIHRwNjgxMF9wcmVpbml0LAorCQkJCUFSUkFZX1NJWkUodHA2ODEwX3ByZWluaXQpKTsKKwltc2xlZXAoMTUpOworCXJlZ19yKGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEpOworCVBERUJVRyhEX1BST0JFLCAiZ3BpbzogJTAyeCIsIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CisvKiB2YWx1ZXM6CisgKgkweDgwOiBzbmFwc2hvdCBidXR0b24KKyAqCTB4NDA6IExFRAorICoJMHgyMDogKGJyaWRnZSAvIHNlbnNvcikgcmVzZXQgZm9yIHRwNjgxMCA/CisgKgkweDA3OiBzZW5zb3IgdHlwZSA/CisgKi8KKworCS8qIGd1ZXNzIHRoZSBzZW5zb3IgdHlwZSAqLworCWlmIChmb3JjZV9zZW5zb3IgPj0gMCkgeworCQlzZC0+c2Vuc29yID0gZm9yY2Vfc2Vuc29yOworCX0gZWxzZSB7CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApIHsKKy8qZml4bWU6IG5vdCBzdXJlIHRoaXMgaXMgd29ya2luZyovCisJCQlzd2l0Y2ggKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSAmIDB4MDcpIHsKKwkJCWNhc2UgMDoKKwkJCQlzZC0+c2Vuc29yID0gU0VOU09SX1NPSTc2M0E7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJc2QtPnNlbnNvciA9IFNFTlNPUl9DWDAzNDI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbnQgc2Vuc29yOworCisJCQlzZW5zb3IgPSBwcm9iZV82ODEwKGdzcGNhX2Rldik7CisJCQlpZiAoc2Vuc29yIDwgMCkgeworCQkJCXByX3dhcm4oIlVua25vd24gc2Vuc29yICVkIC0gZm9yY2VkIHRvIHNvaTc2M2FcbiIsCisJCQkJCS1zZW5zb3IpOworCQkJCXNlbnNvciA9IFNFTlNPUl9TT0k3NjNBOworCQkJfQorCQkJc2QtPnNlbnNvciA9IHNlbnNvcjsKKwkJfQorCX0KKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfU09JNzYzQSkgeworCQlwcl9pbmZvKCJTZW5zb3Igc29pNzYzYVxuIik7CisJCXNkLT5jdHJsc1tHQU1NQV0uZGVmID0gc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwID8gMCA6IDE7CisJCXNkLT5jdHJsc1tHQUlOXS5tYXggPSAxNTsKKwkJc2QtPmN0cmxzW0dBSU5dLmRlZiA9IDM7CisJCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBSR0FJTikgfCAoMSA8PCBCR0FJTik7CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MTApIHsKKwkJCXNvaTc2M2FfNjgxMF9pbml0KGdzcGNhX2Rldik7CisjaWYgQVVUT0dBSU5fREVGCisJCQlnc3BjYV9kZXYtPmN0cmxfaW5hYyB8PSAoMSA8PCBFWFBPU1VSRSkgfCAoMSA8PCBHQUlOKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJZ3NwY2FfZGV2LT5jdHJsX2RpcyB8PSAoMSA8PCBBVVRPR0FJTik7CisJCX0KKwl9IGVsc2UgeworCQlwcl9pbmZvKCJTZW5zb3IgY3gwMzQyXG4iKTsKKwkJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgxMCkgeworCQkJY3gwMzQyXzY4MTBfaW5pdChnc3BjYV9kZXYpOworI2lmIEFVVE9HQUlOX0RFRgorCQkJZ3NwY2FfZGV2LT5jdHJsX2luYWMgfD0gKDEgPDwgRVhQT1NVUkUpIHwgKDEgPDwgR0FJTik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWdzcGNhX2Rldi0+Y3RybF9kaXMgfD0gKDEgPDwgQVVUT0dBSU4pOworCQl9CisJfQorCisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgxMCkKKwkJc2QtPmN0cmxzW1FVQUxJVFldLmRlZiA9IDA7CS8qIGF1dG8gcXVhbGl0eSAqLworCXNldF9kcXQoZ3NwY2FfZGV2LCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGNob29zaW5nIHRoZSBhbHQgc2V0dGluZyAqLworc3RhdGljIGludCBzZF9pc29jX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBjeF9zZW5zb3JfaW5pdFtdID0geworCQl7Q1gwMzQyX0FVVE9fQURDX0NBTElCLCAweDgxfSwKKwkJe0NYMDM0Ml9FWFBPX0xJTkVfTCwgMHgzN30sCisJCXtDWDAzNDJfRVhQT19MSU5FX0gsIDB4MDF9LAorCQl7Q1gwMzQyX1JBV19HUkdBSU5fTCwgMHgwMH0sCisJCXtDWDAzNDJfUkFXX0dCR0FJTl9MLCAweDAwfSwKKwkJe0NYMDM0Ml9SQVdfUkdBSU5fTCwgMHgwMH0sCisJCXtDWDAzNDJfUkFXX0JHQUlOX0wsIDB4MDB9LAorCQl7Q1gwMzQyX1NZU19DVFJMXzAsIDB4ODF9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgY3hfYnJpZGdlX2luaXRbXSA9IHsKKwkJezB4NGQsIDB4MDB9LAorCQl7MHg0YywgMHhmZn0sCisJCXsweDRlLCAweGZmfSwKKwkJezB4NGYsIDB4MDB9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgb3Zfc2Vuc29yX2luaXRbXSA9IHsKKwkJezB4MTAsIDB4NzV9LAkJLyogZXhwb3N1cmUgKi8KKwkJezB4NzYsIDB4MDN9LAorCQl7MHgwMCwgMHgwMH0sCQkvKiBnYWluICovCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBvdl9icmlkZ2VfaW5pdFtdID0geworCQl7MHg3YiwgMHg5MH0sCisJCXtUUDY4MDBfUjNGX0ZSQU1FX1JBVEUsIDB4ODd9LAorCX07CisKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKQorCQlyZXR1cm4gMDsKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfQ1gwMzQyKSB7CisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDIwKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjNGX0ZSQU1FX1JBVEUsIDB4ODcpOworCQlpMmNfd19idWYoZ3NwY2FfZGV2LCBjeF9zZW5zb3JfaW5pdCwKKwkJCQlBUlJBWV9TSVpFKGN4X3NlbnNvcl9pbml0KSk7CisJCXJlZ193X2J1Zihnc3BjYV9kZXYsIGN4X2JyaWRnZV9pbml0LAorCQkJCUFSUkFZX1NJWkUoY3hfYnJpZGdlX2luaXQpKTsKKwkJYnVsa193KGdzcGNhX2RldiwgMHgwMywgY29sb3JfbnVsbCwgc2l6ZW9mIGNvbG9yX251bGwpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4NTksIDB4NDApOworCX0gZWxzZSB7CisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDIxKTsKKwkJaTJjX3dfYnVmKGdzcGNhX2Rldiwgb3Zfc2Vuc29yX2luaXQsCisJCQkJQVJSQVlfU0laRShvdl9zZW5zb3JfaW5pdCkpOworCQlyZWdfcihnc3BjYV9kZXYsIDB4N2IpOworCQlyZWdfd19idWYoZ3NwY2FfZGV2LCBvdl9icmlkZ2VfaW5pdCwKKwkJCQlBUlJBWV9TSVpFKG92X2JyaWRnZV9pbml0KSk7CisJfQorCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I3OF9GT1JNQVQsCisJCQlnc3BjYV9kZXYtPmN1cnJfbW9kZSA/IDB4MDAgOiAweDAxKTsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworfQorCitzdGF0aWMgdm9pZCBzZXRfbGVkKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgaW50IG9uKQoreworCXU4IGRhdGE7CisKKwlyZWdfcihnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBKTsKKwlkYXRhID0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOworCWlmIChvbikKKwkJZGF0YSAmPSB+MHg0MDsKKwllbHNlCisJCWRhdGEgfD0gMHg0MDsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgY3gwMzQyXzY4MDBfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHJlZ19pbml0W10gPSB7CisvKmZpeG1lOiBpcyB0aGlzIHVzZWZ1bGw/Ki8KKwkJe1RQNjgwMF9SMTdfR1BJT19JTywgMHg5Zn0sCisJCXtUUDY4MDBfUjE2X0dQSU9fUEQsIDB4NDB9LAorCQl7VFA2ODAwX1IxMF9TSUZfVFlQRSwgMHgwMH0sCS8qIGkyYyA4IGJpdHMgKi8KKwkJe1RQNjgwMF9SNTAsIDB4MDB9LAorCQl7VFA2ODAwX1I1MSwgMHgwMH0sCisJCXtUUDY4MDBfUjUyLCAweGZmfSwKKwkJe1RQNjgwMF9SNTMsIDB4MDN9LAorCQl7VFA2ODAwX1I1NF9EQVJLX0NGRywgMHgwN30sCisJCXtUUDY4MDBfUjVDX0VER0VfVEhSTEQsIDB4NDB9LAorCQl7VFA2ODAwX1I3QV9CTEtfVEhSTEQsIDB4NDB9LAorCQl7VFA2ODAwX1IyRl9USU1JTkdfQ0ZHLCAweDE3fSwKKwkJe1RQNjgwMF9SMzBfU0VOU09SX0NGRywgMHgxOH0sCS8qIEcxQi4uUkcwICovCisJCXtUUDY4MDBfUjM3X0ZST05UX0RBUktfU1QsIDB4MDB9LAorCQl7VFA2ODAwX1IzOF9GUk9OVF9EQVJLX0VORCwgMHgwMH0sCisJCXtUUDY4MDBfUjM5X1JFQVJfREFSS19TVF9MLCAweDAwfSwKKwkJe1RQNjgwMF9SM0FfUkVBUl9EQVJLX1NUX0gsIDB4MDB9LAorCQl7VFA2ODAwX1IzQl9SRUFSX0RBUktfRU5EX0wsIDB4MDB9LAorCQl7VFA2ODAwX1IzQ19SRUFSX0RBUktfRU5EX0gsIDB4MDB9LAorCQl7VFA2ODAwX1IzRF9IT1JJWl9EQVJLX0xJTkVfTCwgMHgwMH0sCisJCXtUUDY4MDBfUjNFX0hPUklaX0RBUktfTElORV9ILCAweDAwfSwKKwkJe1RQNjgwMF9SMjFfRU5EUF8xX0NUTCwgMHgwM30sCisKKwkJe1RQNjgwMF9SMzFfUElYRUxfU1RBUlQsIDB4MGJ9LAorCQl7VFA2ODAwX1IzMl9QSVhFTF9FTkRfTCwgMHg4YX0sCisJCXtUUDY4MDBfUjMzX1BJWEVMX0VORF9ILCAweDAyfSwKKwkJe1RQNjgwMF9SMzRfTElORV9TVEFSVCwgMHgwZX0sCisJCXtUUDY4MDBfUjM1X0xJTkVfRU5EX0wsIDB4ZjR9LAorCQl7VFA2ODAwX1IzNl9MSU5FX0VORF9ILCAweDAxfSwKKwkJe1RQNjgwMF9SNzhfRk9STUFULCAweDAwfSwKKwkJe1RQNjgwMF9SMTJfU0lGX0FERFJfUywgMHgyMH0sCS8qIGN4MDM0MiBpMmMgYWRkciAqLworCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgc2Vuc29yX2luaXRbXSA9IHsKKwkJe0NYMDM0Ml9PVVRQVVRfQ1RSTCwgMHgwN30sCisJCXtDWDAzNDJfQllQQVNTX01PREUsIDB4NTh9LAorCQl7Q1gwMzQyX0dQWExUSERfTCwgMHgxNn0sCisJCXtDWDAzNDJfUkJQWExUSERfTCwgMHgxNn0sCisJCXtDWDAzNDJfUExBTkVUSERfTCwgMHhjMH0sCisJCXtDWDAzNDJfUExBTkVUSERfSCwgMHgwM30sCisJCXtDWDAzNDJfUkJfR0FQX0wsIDB4ZmZ9LAorCQl7Q1gwMzQyX1JCX0dBUF9ILCAweDA3fSwKKwkJe0NYMDM0Ml9HX0dBUF9MLCAweGZmfSwKKwkJe0NYMDM0Ml9HX0dBUF9ILCAweDA3fSwKKwkJe0NYMDM0Ml9SU1RfT1ZFUkZMT1dfTCwgMHg1Y30sCisJCXtDWDAzNDJfUlNUX09WRVJGTE9XX0gsIDB4MDF9LAorCQl7Q1gwMzQyX0RBVEFfT1ZFUkZMT1dfTCwgMHhmY30sCisJCXtDWDAzNDJfREFUQV9PVkVSRkxPV19ILCAweDAzfSwKKwkJe0NYMDM0Ml9EQVRBX1VOREVSRkxPV19MLCAweDAwfSwKKwkJe0NYMDM0Ml9EQVRBX1VOREVSRkxPV19ILCAweDAwfSwKKwkJe0NYMDM0Ml9TWVNfQ1RSTF8wLCAweDQwfSwKKwkJe0NYMDM0Ml9HTE9CQUxfR0FJTiwgMHgwMX0sCisJCXtDWDAzNDJfQ0xPQ0tfR0VOLCAweDAwfSwKKwkJe0NYMDM0Ml9TWVNfQ1RSTF8wLCAweDAyfSwKKwkJe0NYMDM0Ml9JRExFX0NUUkwsIDB4MDV9LAorCQl7Q1gwMzQyX0FEQ0dOLCAweDAwfSwKKwkJe0NYMDM0Ml9BRENfQ1RMLCAweDAwfSwKKwkJe0NYMDM0Ml9MVlJTVF9CTEJJQVMsIDB4MDF9LAorCQl7Q1gwMzQyX1ZUSFNFTCwgMHgwYn0sCisJCXtDWDAzNDJfUkFNUF9SSVYsIDB4MGJ9LAorCQl7Q1gwMzQyX0xET1NFTCwgMHgwN30sCisJCXtDWDAzNDJfU1BWX1ZBTFVFX0wsIDB4NDB9LAorCQl7Q1gwMzQyX1NQVl9WQUxVRV9ILCAweDAyfSwKKwl9OworCisJcmVnX3dfYnVmKGdzcGNhX2RldiwgcmVnX2luaXQsIEFSUkFZX1NJWkUocmVnX2luaXQpKTsKKwlpMmNfd19idWYoZ3NwY2FfZGV2LCBzZW5zb3JfaW5pdCwgQVJSQVlfU0laRShzZW5zb3JfaW5pdCkpOworCWkyY193X2J1Zihnc3BjYV9kZXYsIGN4MDM0Ml90aW1pbmdfc2VxLCBBUlJBWV9TSVpFKGN4MDM0Ml90aW1pbmdfc2VxKSk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjVDX0VER0VfVEhSTEQsIDB4MTApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I1NF9EQVJLX0NGRywgMHgwMCk7CisJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfRVhQT19MSU5FX0gsIDB4MDApOworCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1NZU19DVFJMXzAsIDB4MDEpOworCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJc2V0X2xlZChnc3BjYV9kZXYsIDEpOworCXNldF9yZXNvbHV0aW9uKGdzcGNhX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIGN4MDM0Ml82ODEwX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBzZW5zb3JfaW5pdF8yW10gPSB7CisJCXtDWDAzNDJfRVhQT19MSU5FX0wsIDB4NmZ9LAorCQl7Q1gwMzQyX0VYUE9fTElORV9ILCAweDAyfSwKKwkJe0NYMDM0Ml9SQVdfR1JHQUlOX0wsIDB4MDB9LAorCQl7Q1gwMzQyX1JBV19HQkdBSU5fTCwgMHgwMH0sCisJCXtDWDAzNDJfUkFXX1JHQUlOX0wsIDB4MDB9LAorCQl7Q1gwMzQyX1JBV19CR0FJTl9MLCAweDAwfSwKKwkJe0NYMDM0Ml9TWVNfQ1RSTF8wLCAweDgxfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIGJyaWRnZV9pbml0XzJbXSA9IHsKKwkJezB4NGQsIDB4MDB9LAorCQl7MHg0YywgMHhmZn0sCisJCXsweDRlLCAweGZmfSwKKwkJezB4NGYsIDB4MDB9LAorCQl7VFA2ODAwX1I3QV9CTEtfVEhSTEQsIDB4MDB9LAorCQl7VFA2ODAwX1I3OV9RVUFMSVRZLCAweDA0fSwKKwkJe1RQNjgwMF9SNzlfUVVBTElUWSwgMHgwMX0sCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBicmlkZ2VfaW5pdF8zW10gPSB7CisJCXtUUDY4MDBfUjMxX1BJWEVMX1NUQVJULCAweDA4fSwKKwkJe1RQNjgwMF9SMzJfUElYRUxfRU5EX0wsIDB4ODd9LAorCQl7VFA2ODAwX1IzM19QSVhFTF9FTkRfSCwgMHgwMn0sCisJCXtUUDY4MDBfUjM0X0xJTkVfU1RBUlQsIDB4MGV9LAorCQl7VFA2ODAwX1IzNV9MSU5FX0VORF9MLCAweGY0fSwKKwkJe1RQNjgwMF9SMzZfTElORV9FTkRfSCwgMHgwMX0sCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBzZW5zb3JfaW5pdF8zW10gPSB7CisJCXtDWDAzNDJfQVVUT19BRENfQ0FMSUIsIDB4ODF9LAorCQl7Q1gwMzQyX0VYUE9fTElORV9MLCAweDZmfSwKKwkJe0NYMDM0Ml9FWFBPX0xJTkVfSCwgMHgwMn0sCisJCXtDWDAzNDJfUkFXX0dSR0FJTl9MLCAweDAwfSwKKwkJe0NYMDM0Ml9SQVdfR0JHQUlOX0wsIDB4MDB9LAorCQl7Q1gwMzQyX1JBV19SR0FJTl9MLCAweDAwfSwKKwkJe0NYMDM0Ml9SQVdfQkdBSU5fTCwgMHgwMH0sCisJCXtDWDAzNDJfU1lTX0NUUkxfMCwgMHg4MX0sCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBicmlkZ2VfaW5pdF81W10gPSB7CisJCXsweDRkLCAweDAwfSwKKwkJezB4NGMsIDB4ZmZ9LAorCQl7MHg0ZSwgMHhmZn0sCisJCXsweDRmLCAweDAwfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHNlbnNvcl9pbml0XzRbXSA9IHsKKwkJe0NYMDM0Ml9FWFBPX0xJTkVfTCwgMHhkM30sCisJCXtDWDAzNDJfRVhQT19MSU5FX0gsIDB4MDF9LAorLypmaXhtZTogZ2FpbnMsIGJ1dCAwMC4uODAgb25seSovCisJCXtDWDAzNDJfUkFXX0dSR0FJTl9MLCAweDQwfSwKKwkJe0NYMDM0Ml9SQVdfR0JHQUlOX0wsIDB4NDB9LAorCQl7Q1gwMzQyX1JBV19SR0FJTl9MLCAweDQwfSwKKwkJe0NYMDM0Ml9SQVdfQkdBSU5fTCwgMHg0MH0sCisJCXtDWDAzNDJfU1lTX0NUUkxfMCwgMHg4MX0sCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBzZW5zb3JfaW5pdF81W10gPSB7CisJCXtDWDAzNDJfSURMRV9DVFJMLCAweDA1fSwKKwkJe0NYMDM0Ml9BRENHTiwgMHgwMH0sCisJCXtDWDAzNDJfQURDX0NUTCwgMHgwMH0sCisJCXtDWDAzNDJfTFZSU1RfQkxCSUFTLCAweDAxfSwKKwkJe0NYMDM0Ml9WVEhTRUwsIDB4MGJ9LAorCQl7Q1gwMzQyX1JBTVBfUklWLCAweDBifSwKKwkJe0NYMDM0Ml9MRE9TRUwsIDB4MDd9LAorCQl7Q1gwMzQyX1NQVl9WQUxVRV9MLCAweDQwfSwKKwkJe0NYMDM0Ml9TUFZfVkFMVUVfSCwgMHgwMn0sCisJCXtDWDAzNDJfQVVUT19BRENfQ0FMSUIsIDB4ODF9LAorCX07CisKKwlyZWdfdyhnc3BjYV9kZXYsIDB4MjIsIGdzcGNhX2Rldi0+YWx0KTsKKwlpMmNfd19idWYoZ3NwY2FfZGV2LCBzZW5zb3JfaW5pdF8yLCBBUlJBWV9TSVpFKHNlbnNvcl9pbml0XzIpKTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCBicmlkZ2VfaW5pdF8yLCBBUlJBWV9TSVpFKGJyaWRnZV9pbml0XzIpKTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCB0cDY4MTBfY3hfaW5pdF9jb21tb24sCisJCQlBUlJBWV9TSVpFKHRwNjgxMF9jeF9pbml0X2NvbW1vbikpOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIGJyaWRnZV9pbml0XzMsIEFSUkFZX1NJWkUoYnJpZGdlX2luaXRfMykpOworCWlmIChnc3BjYV9kZXYtPmN1cnJfbW9kZSkgeworCQlyZWdfdyhnc3BjYV9kZXYsIDB4NGEsIDB4N2YpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDcsIDB4MDUpOworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNzhfRk9STUFULCAweDAwKTsJLyogdmdhICovCisJfSBlbHNlIHsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDRhLCAweGZmKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDA3LCAweDg1KTsKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjc4X0ZPUk1BVCwgMHgwMSk7CS8qIHF2Z2EgKi8KKwl9CisJc2V0Z2FtbWEoZ3NwY2FfZGV2KTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCB0cDY4MTBfYnJpZGdlX3N0YXJ0LAorCQkJQVJSQVlfU0laRSh0cDY4MTBfYnJpZGdlX3N0YXJ0KSk7CisJc2V0c2hhcnBuZXNzKGdzcGNhX2Rldik7CisJYnVsa193KGdzcGNhX2RldiwgMHgwMywgY29sb3JfZ2FpbltTRU5TT1JfQ1gwMzQyXSwKKwkJCQlBUlJBWV9TSVpFKGNvbG9yX2dhaW5bMF0pKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SM0ZfRlJBTUVfUkFURSwgMHg4Nyk7CisJaTJjX3dfYnVmKGdzcGNhX2Rldiwgc2Vuc29yX2luaXRfMywgQVJSQVlfU0laRShzZW5zb3JfaW5pdF8zKSk7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgYnJpZGdlX2luaXRfNSwgQVJSQVlfU0laRShicmlkZ2VfaW5pdF81KSk7CisJaTJjX3dfYnVmKGdzcGNhX2Rldiwgc2Vuc29yX2luaXRfNCwgQVJSQVlfU0laRShzZW5zb3JfaW5pdF80KSk7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgYnJpZGdlX2luaXRfNSwgQVJSQVlfU0laRShicmlkZ2VfaW5pdF81KSk7CisJaTJjX3dfYnVmKGdzcGNhX2Rldiwgc2Vuc29yX2luaXRfNSwgQVJSQVlfU0laRShzZW5zb3JfaW5pdF81KSk7CisKKwlzZXRfbGVkKGdzcGNhX2RldiwgMSk7CisvKglzZXRxdWFsaXR5KGdzcGNhX2Rldik7ICovCit9CisKK3N0YXRpYyB2b2lkIHNvaTc2M2FfNjgwMF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgcmVnX2luaXRbXSA9IHsKKwkJe1RQNjgwMF9SNzlfUVVBTElUWSwgMHgwNH0sCisJCXtUUDY4MDBfUjc5X1FVQUxJVFksIDB4MDF9LAorCQl7VFA2ODAwX1IxMF9TSUZfVFlQRSwgMHgwMH0sCS8qIGkyYyA4IGJpdHMgKi8KKworCQl7VFA2ODAwX1I1MCwgMHgwMH0sCisJCXtUUDY4MDBfUjUxLCAweDAwfSwKKwkJe1RQNjgwMF9SNTIsIDB4ZmZ9LAorCQl7VFA2ODAwX1I1MywgMHgwM30sCisJCXtUUDY4MDBfUjU0X0RBUktfQ0ZHLCAweDA3fSwKKwkJe1RQNjgwMF9SNUNfRURHRV9USFJMRCwgMHg0MH0sCisKKwkJe1RQNjgwMF9SNzlfUVVBTElUWSwgMHgwM30sCisJCXtUUDY4MDBfUjdBX0JMS19USFJMRCwgMHg0MH0sCisKKwkJe1RQNjgwMF9SMkZfVElNSU5HX0NGRywgMHg0Nn0sCisJCXtUUDY4MDBfUjMwX1NFTlNPUl9DRkcsIDB4MTB9LAkvKiBCRzEuLkcwUiAqLworCQl7VFA2ODAwX1IzN19GUk9OVF9EQVJLX1NULCAweDAwfSwKKwkJe1RQNjgwMF9SMzhfRlJPTlRfREFSS19FTkQsIDB4MDB9LAorCQl7VFA2ODAwX1IzOV9SRUFSX0RBUktfU1RfTCwgMHgwMH0sCisJCXtUUDY4MDBfUjNBX1JFQVJfREFSS19TVF9ILCAweDAwfSwKKwkJe1RQNjgwMF9SM0JfUkVBUl9EQVJLX0VORF9MLCAweDAwfSwKKwkJe1RQNjgwMF9SM0NfUkVBUl9EQVJLX0VORF9ILCAweDAwfSwKKwkJe1RQNjgwMF9SM0RfSE9SSVpfREFSS19MSU5FX0wsIDB4MDB9LAorCQl7VFA2ODAwX1IzRV9IT1JJWl9EQVJLX0xJTkVfSCwgMHgwMH0sCisJCXtUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDN9LAorCisJCXtUUDY4MDBfUjNGX0ZSQU1FX1JBVEUsIDB4MDR9LAkvKiAxNSBmcHMgKi8KKwkJe1RQNjgwMF9SNURfREVNT1NBSUNfQ0ZHLCAweDBlfSwgLyogc2NhbGUgZG93biAtIG1lZGl1bSBlZGdlICovCisKKwkJe1RQNjgwMF9SMzFfUElYRUxfU1RBUlQsIDB4MWJ9LAorCQl7VFA2ODAwX1IzMl9QSVhFTF9FTkRfTCwgMHg5YX0sCisJCXtUUDY4MDBfUjMzX1BJWEVMX0VORF9ILCAweDAyfSwKKwkJe1RQNjgwMF9SMzRfTElORV9TVEFSVCwgMHgwZn0sCisJCXtUUDY4MDBfUjM1X0xJTkVfRU5EX0wsIDB4ZjR9LAorCQl7VFA2ODAwX1IzNl9MSU5FX0VORF9ILCAweDAxfSwKKwkJe1RQNjgwMF9SNzhfRk9STUFULCAweDAxfSwJLyogcXZnYSAqLworCQl7VFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDIxfSwJLyogc29pNzYzYSBpMmMgYWRkciAqLworCQl7VFA2ODAwX1IxQV9TSUZfVFhfREFUQTIsIDB4MDB9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgc2Vuc29yX2luaXRbXSA9IHsKKwkJezB4MTIsIDB4NDh9LAkJLyogbWlycm9yIC0gUkdCICovCisJCXsweDEzLCAweGEwfSwJCS8qIGNsb2NrIC0gbm8gQUdDIG5vciBBRUMgKi8KKwkJezB4MDMsIDB4YTR9LAkJLyogc2F0dXJhdGlvbiAqLworCQl7MHgwNCwgMHgzMH0sCQkvKiBodWUgKi8KKwkJezB4MDUsIDB4ODh9LAkJLyogY29udHJhc3QgKi8KKwkJezB4MDYsIDB4NjB9LAkJLyogYnJpZ2h0bmVzcyAqLworCQl7MHgxMCwgMHg0MX0sCQkvKiBBRUMgKi8KKwkJezB4MTEsIDB4NDB9LAkJLyogY2xvY2sgcmF0ZSAqLworCQl7MHgxMywgMHhhMH0sCisJCXsweDE0LCAweDAwfSwJCS8qIDY0MHg0ODAgKi8KKwkJezB4MTUsIDB4MTR9LAorCQl7MHgxZiwgMHg0MX0sCisJCXsweDIwLCAweDgwfSwKKwkJezB4MjMsIDB4ZWV9LAorCQl7MHgyNCwgMHg1MH0sCisJCXsweDI1LCAweDdhfSwKKwkJezB4MjYsIDB4MDB9LAorCQl7MHgyNywgMHhlMn0sCisJCXsweDI4LCAweGIwfSwKKwkJezB4MmEsIDB4MDB9LAorCQl7MHgyYiwgMHgwMH0sCisJCXsweDJkLCAweDgxfSwKKwkJezB4MmYsIDB4OWR9LAorCQl7MHg2MCwgMHg4MH0sCisJCXsweDYxLCAweDAwfSwKKwkJezB4NjIsIDB4ODh9LAorCQl7MHg2MywgMHgxMX0sCisJCXsweDY0LCAweDg5fSwKKwkJezB4NjUsIDB4MDB9LAorCQl7MHg2NywgMHg5NH0sCisJCXsweDY4LCAweDdhfSwKKwkJezB4NjksIDB4MGZ9LAorCQl7MHg2YywgMHg4MH0sCisJCXsweDZkLCAweDgwfSwKKwkJezB4NmUsIDB4ODB9LAorCQl7MHg2ZiwgMHhmZn0sCisJCXsweDcxLCAweDIwfSwKKwkJezB4NzQsIDB4MjB9LAorCQl7MHg3NSwgMHg4Nn0sCisJCXsweDc3LCAweGI1fSwKKwkJezB4MTcsIDB4MTh9LAkJLyogSCBocmVmIHN0YXJ0ICovCisJCXsweDE4LCAweGJmfSwJCS8qIEggaHJlZiBlbmQgKi8KKwkJezB4MTksIDB4MDN9LAkJLyogViBzdGFydCAqLworCQl7MHgxYSwgMHhmOH0sCQkvKiBWIGVuZCAqLworCQl7MHgwMSwgMHg4MH0sCQkvKiBibHVlIGdhaW4gKi8KKwkJezB4MDIsIDB4ODB9LAkJLyogcmVkIGdhaW4gKi8KKwl9OworCisJcmVnX3dfYnVmKGdzcGNhX2RldiwgcmVnX2luaXQsIEFSUkFZX1NJWkUocmVnX2luaXQpKTsKKworCWkyY193KGdzcGNhX2RldiwgMHgxMiwgMHg4MCk7CQkvKiBzZW5zb3IgcmVzZXQgKi8KKwltc2xlZXAoMTApOworCisJaTJjX3dfYnVmKGdzcGNhX2Rldiwgc2Vuc29yX2luaXQsIEFSUkFZX1NJWkUoc2Vuc29yX2luaXQpKTsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I1Q19FREdFX1RIUkxELCAweDEwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNTRfREFSS19DRkcsIDB4MDApOworCisJc2V0c2hhcnBuZXNzKGdzcGNhX2Rldik7CisKKwlidWxrX3coZ3NwY2FfZGV2LCAweDAzLCBjb2xvcl9nYWluW1NFTlNPUl9TT0k3NjNBXSwKKwkJCQlBUlJBWV9TSVpFKGNvbG9yX2dhaW5bMF0pKTsKKworCXNldF9sZWQoZ3NwY2FfZGV2LCAxKTsKKwlzZXRleHBvc3VyZShnc3BjYV9kZXYpOworCXNldHF1YWxpdHkoZ3NwY2FfZGV2KTsKKwlzZXRnYW1tYShnc3BjYV9kZXYpOworfQorCitzdGF0aWMgdm9pZCBzb2k3NjNhXzY4MTBfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIGJyaWRnZV9pbml0XzJbXSA9IHsKKwkJe1RQNjgwMF9SN0FfQkxLX1RIUkxELCAweDAwfSwKKwkJe1RQNjgwMF9SNzlfUVVBTElUWSwgMHgwNH0sCisJCXtUUDY4MDBfUjc5X1FVQUxJVFksIDB4MDF9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgYnJpZGdlX2luaXRfM1tdID0geworCQl7VFA2ODAwX1IzMV9QSVhFTF9TVEFSVCwgMHgyMH0sCisJCXtUUDY4MDBfUjMyX1BJWEVMX0VORF9MLCAweDlmfSwKKwkJe1RQNjgwMF9SMzNfUElYRUxfRU5EX0gsIDB4MDJ9LAorCQl7VFA2ODAwX1IzNF9MSU5FX1NUQVJULCAweDEzfSwKKwkJe1RQNjgwMF9SMzVfTElORV9FTkRfTCwgMHhmOH0sCisJCXtUUDY4MDBfUjM2X0xJTkVfRU5EX0gsIDB4MDF9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgYnJpZGdlX2luaXRfNltdID0geworCQl7MHgwOCwgMHhmZn0sCisJCXsweDA5LCAweGZmfSwKKwkJezB4MGEsIDB4NWZ9LAorCQl7MHgwYiwgMHg4MH0sCisJfTsKKworCXJlZ193KGdzcGNhX2RldiwgMHgyMiwgZ3NwY2FfZGV2LT5hbHQpOworCWJ1bGtfdyhnc3BjYV9kZXYsIDB4MDMsIGNvbG9yX251bGwsIHNpemVvZiBjb2xvcl9udWxsKTsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4NTksIDB4NDApOworCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgYnJpZGdlX2luaXRfMiwgQVJSQVlfU0laRShicmlkZ2VfaW5pdF8yKSk7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgdHA2ODEwX292X2luaXRfY29tbW9uLAorCQkJQVJSQVlfU0laRSh0cDY4MTBfb3ZfaW5pdF9jb21tb24pKTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCBicmlkZ2VfaW5pdF8zLCBBUlJBWV9TSVpFKGJyaWRnZV9pbml0XzMpKTsKKwlpZiAoZ3NwY2FfZGV2LT5jdXJyX21vZGUpIHsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDRhLCAweDdmKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDA3LCAweDA1KTsKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjc4X0ZPUk1BVCwgMHgwMCk7CS8qIHZnYSAqLworCX0gZWxzZSB7CisJCXJlZ193KGdzcGNhX2RldiwgMHg0YSwgMHhmZik7CisJCXJlZ193KGdzcGNhX2RldiwgMHgwNywgMHg4NSk7CisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I3OF9GT1JNQVQsIDB4MDEpOwkvKiBxdmdhICovCisJfQorCXNldGdhbW1hKGdzcGNhX2Rldik7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgdHA2ODEwX2JyaWRnZV9zdGFydCwKKwkJCUFSUkFZX1NJWkUodHA2ODEwX2JyaWRnZV9zdGFydCkpOworCisJaWYgKGdzcGNhX2Rldi0+Y3Vycl9tb2RlKSB7CisJCXJlZ193KGdzcGNhX2RldiwgMHg0ZiwgMHgwMCk7CisJCXJlZ193KGdzcGNhX2RldiwgMHg0ZSwgMHg3Yyk7CisJfQorCisJcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDAwKTsKKworCXNldHNoYXJwbmVzcyhnc3BjYV9kZXYpOworCWJ1bGtfdyhnc3BjYV9kZXYsIDB4MDMsIGNvbG9yX2dhaW5bU0VOU09SX1NPSTc2M0FdLAorCQkJCUFSUkFZX1NJWkUoY29sb3JfZ2FpblswXSkpOworCXNldF9sZWQoZ3NwY2FfZGV2LCAxKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SM0ZfRlJBTUVfUkFURSwgMHhmMCk7CisJc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCBicmlkZ2VfaW5pdF82LCBBUlJBWV9TSVpFKGJyaWRnZV9pbml0XzYpKTsKK30KKworLyogLS0gc3RhcnQgdGhlIGNhbWVyYSAtLSAqLworc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJanBlZ19kZWZpbmUoc2QtPmpwZWdfaGRyLCBnc3BjYV9kZXYtPmhlaWdodCwgZ3NwY2FfZGV2LT53aWR0aCk7CisJc2V0X2RxdChnc3BjYV9kZXYsIHNkLT5xdWFsaXR5KTsKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKSB7CisJCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9DWDAzNDIpCisJCQljeDAzNDJfNjgwMF9zdGFydChnc3BjYV9kZXYpOworCQllbHNlCisJCQlzb2k3NjNhXzY4MDBfc3RhcnQoZ3NwY2FfZGV2KTsKKwl9IGVsc2UgeworCQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfQ1gwMzQyKQorCQkJY3gwMzQyXzY4MTBfc3RhcnQoZ3NwY2FfZGV2KTsKKwkJZWxzZQorCQkJc29pNzYzYV82ODEwX3N0YXJ0KGdzcGNhX2Rldik7CisJCXJlZ193X2J1Zihnc3BjYV9kZXYsIHRwNjgxMF9sYXRlX3N0YXJ0LAorCQkJCUFSUkFZX1NJWkUodHA2ODEwX2xhdGVfc3RhcnQpKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDgwLCAweDAzKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDgyLCBnc3BjYV9kZXYtPmN1cnJfbW9kZSA/IDB4MGEgOiAweDBlKTsKKworCQlzZXRleHBvc3VyZShnc3BjYV9kZXYpOworCQlzZXRxdWFsaXR5KGdzcGNhX2Rldik7CisJCXNldGF1dG9nYWluKGdzcGNhX2Rldik7CisJfQorCisJc2V0ZnJhbWVyYXRlKGdzcGNhX2Rldik7CisKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworfQorCitzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCkKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjJGX1RJTUlOR19DRkcsIDB4MDMpOworCXNldF9sZWQoZ3NwY2FfZGV2LCAwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMjFfRU5EUF8xX0NUTCwgMHgwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXU4ICpkYXRhLAorCQkJaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkvKiB0aGUgc3RhcnQgb2YgZnJhbWUgY29udGFpbnM6CisJICoJZmYgZDgKKwkgKglmZiBmZQorCSAqCXdpZHRoIC8gMTYKKwkgKgloZWlnaHQgLyA4CisJICoJcXVhbGl0eQorCSAqLworCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MTApIHsKKwkJaWYgKCpkYXRhICE9IDB4NWEpIHsKKy8qZml4bWU6IGRvbid0IGRpc2NhcmQgdGhlIHdob2xlIGZyYW1lLi4qLworCQkJaWYgKCpkYXRhID09IDB4YWEgfHwgKmRhdGEgPT0gMHgwMCkKKwkJCQlyZXR1cm47CisJCQlpZiAoKmRhdGEgPiAweGMwKSB7CisJCQkJUERFQlVHKERfRlJBTSwgImJhZCBmcmFtZSIpOworCQkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlkYXRhKys7CisJCWxlbi0tOworCQlpZiAoKmRhdGEgPT0gMHhmZiAmJiBkYXRhWzFdID09IDB4ZDgpIHsKKy8qZml4bWU6IHRoZXJlIG1heSBiZSBpbmZvcm1hdGlvbiBpbiB0aGUgNCBoaWdoIGJpdHMqLworCQkJaWYgKChkYXRhWzZdICYgMHgwZikgIT0gc2QtPnF1YWxpdHkpCisJCQkJc2V0X2RxdChnc3BjYV9kZXYsIGRhdGFbNl0gJiAweDBmKTsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKKwkJCQkJc2QtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7CisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsCisJCQkJCWRhdGEgKyA3LCBsZW4gLSA3KTsKKwkJfSBlbHNlIGlmIChkYXRhW2xlbiAtIDJdID09IDB4ZmYgJiYgZGF0YVtsZW4gLSAxXSA9PSAweGQ5KSB7CisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKKwkJCQkJZGF0YSwgbGVuKTsKKwkJfSBlbHNlIHsKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKKwkJCQkJZGF0YSwgbGVuKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJc3dpdGNoICgqZGF0YSkgeworCWNhc2UgMHg1NToKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGRhdGEsIDApOworCisJCWlmIChsZW4gPCA4CisJCSB8fCBkYXRhWzFdICE9IDB4ZmYgfHwgZGF0YVsyXSAhPSAweGQ4CisJCSB8fCBkYXRhWzNdICE9IDB4ZmYgfHwgZGF0YVs0XSAhPSAweGZlKSB7CisKKwkJCS8qIEhhdmUgb25seSBzZWVuIHRoaXMgd2l0aCBjb3JydXB0IGZyYW1lcyAqLworCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGRhdGFbN10gIT0gc2QtPnF1YWxpdHkpCisJCQlzZXRfZHF0KGdzcGNhX2RldiwgZGF0YVs3XSk7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKKwkJCQlzZC0+anBlZ19oZHIsIEpQRUdfSERSX1NaKTsKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAorCQkJCWRhdGEgKyA4LCBsZW4gLSA4KTsKKwkJYnJlYWs7CisJY2FzZSAweGFhOgorCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKKwkJYnJlYWs7CisJY2FzZSAweGNjOgorCQlpZiAoZGF0YVsxXSAhPSAweGZmIHx8IGRhdGFbMl0gIT0gMHhkOCkKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKKwkJCQkJZGF0YSArIDEsIGxlbiAtIDEpOworCQllbHNlCisJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKKwkJYnJlYWs7CisJfQorfQorCisvKiAtLSBkbyBhdXRvZ2FpbiAtLSAqLworLyogZ2FpbiBzZXR0aW5nIGlzIGRvbmUgaW4gc2V0ZXhwb3N1cmUoKSBmb3IgdHA2ODEwICovCitzdGF0aWMgdm9pZCBzZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldikge30KKy8qICEhIGNvYXJzZV9ncmFpbmVkX2V4cG9fYXV0b2dhaW4gaXMgbm90IHVzZWQgISEgKi8KKyNkZWZpbmUgZXhwX3Rvb19sb3dfY250IGJyaWRnZQorI2RlZmluZSBleHBfdG9vX2hpZ2hfY250IHNlbnNvcgorCisjaW5jbHVkZSAiYXV0b2dhaW5fZnVuY3Rpb25zLmgiCitzdGF0aWMgdm9pZCBzZF9kcV9jYWxsYmFjayhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCByZXQsIGFsZW47CisJaW50IGx1bWEsIGV4cG87CisKKwlpZiAoc2QtPmFnX2NudCA8IDApCisJCXJldHVybjsKKwlpZiAoLS1zZC0+YWdfY250ID4gNSkKKwkJcmV0dXJuOworCXN3aXRjaCAoc2QtPmFnX2NudCkgeworLyoJY2FzZSA1OiAqLworCWRlZmF1bHQ6CisJCXJlZ193KGdzcGNhX2RldiwgMHg3ZCwgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDI3LCAweGIwKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlyZWdfdyhnc3BjYV9kZXYsIDB4MGMsIDB4MDEpOworCQlicmVhazsKKwljYXNlIDI6CisJCXJldCA9IHVzYl9idWxrX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCQl1c2JfcmN2YnVsa3BpcGUoZ3NwY2FfZGV2LT5kZXYsIDB4MDIpLAorCQkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwKKwkJCQkzMiwKKwkJCQkmYWxlbiwKKwkJCQk1MDApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJidWxrIGVyciAlZFxuIiwgcmV0KTsKKwkJCWJyZWFrOworCQl9CisJCS8qIHZhbHVlcyBub3QgdXNlZCAodW5rbm93bikgKi8KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyZWdfdyhnc3BjYV9kZXYsIDB4MjcsIDB4ZDApOworCQlicmVhazsKKwljYXNlIDA6CisJCXJldCA9IHVzYl9idWxrX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCQl1c2JfcmN2YnVsa3BpcGUoZ3NwY2FfZGV2LT5kZXYsIDB4MDIpLAorCQkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwKKwkJCQkzMiwKKwkJCQkmYWxlbiwKKwkJCQk1MDApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJidWxrIGVyciAlZFxuIiwgcmV0KTsKKwkJCWJyZWFrOworCQl9CisJCWx1bWEgPSAoKGdzcGNhX2Rldi0+dXNiX2J1Zls4XSA8PCA4KSArIGdzcGNhX2Rldi0+dXNiX2J1Zls3XSArCisJCQkoZ3NwY2FfZGV2LT51c2JfYnVmWzExXSA8PCA4KSArIGdzcGNhX2Rldi0+dXNiX2J1ZlsxMF0gKworCQkJKGdzcGNhX2Rldi0+dXNiX2J1ZlsxNF0gPDwgOCkgKyBnc3BjYV9kZXYtPnVzYl9idWZbMTNdICsKKwkJCShnc3BjYV9kZXYtPnVzYl9idWZbMTddIDw8IDgpICsgZ3NwY2FfZGV2LT51c2JfYnVmWzE2XSArCisJCQkoZ3NwY2FfZGV2LT51c2JfYnVmWzIwXSA8PCA4KSArIGdzcGNhX2Rldi0+dXNiX2J1ZlsxOV0gKworCQkJKGdzcGNhX2Rldi0+dXNiX2J1ZlsyM10gPDwgOCkgKyBnc3BjYV9kZXYtPnVzYl9idWZbMjJdICsKKwkJCShnc3BjYV9kZXYtPnVzYl9idWZbMjZdIDw8IDgpICsgZ3NwY2FfZGV2LT51c2JfYnVmWzI1XSArCisJCQkoZ3NwY2FfZGV2LT51c2JfYnVmWzI5XSA8PCA4KSArIGdzcGNhX2Rldi0+dXNiX2J1ZlsyOF0pCisJCQkJLyA4OworCQlpZiAoZ3NwY2FfZGV2LT53aWR0aCA9PSA2NDApCisJCQlsdW1hIC89IDQ7CisJCXJlZ193KGdzcGNhX2RldiwgMHg3ZCwgMHgwMCk7CisKKwkJZXhwbyA9IHNkLT5jdHJsc1tFWFBPU1VSRV0udmFsOworCQlyZXQgPSBhdXRvX2dhaW5fbl9leHBvc3VyZShnc3BjYV9kZXYsIGx1bWEsCisJCQkJNjAsCS8qIGRlc2lyZWQgbHVtYSAqLworCQkJCTYsCS8qIGRlYWQgem9uZSAqLworCQkJCTIsCS8qIGdhaW4ga25lZSAqLworCQkJCTcwKTsJLyogZXhwbyBrbmVlICovCisJCXNkLT5hZ19jbnQgPSBBR19DTlRfU1RBUlQ7CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MTApIHsKKwkJCWlmICgoZXhwbyA+PSAxMjggJiYgc2QtPmN0cmxzW0VYUE9TVVJFXS52YWwgPCAxMjgpCisJCQkgfHwgKGV4cG8gPCAxMjggJiYgc2QtPmN0cmxzW0VYUE9TVVJFXS52YWwgPj0gMTI4KSkKKwkJCQlzZXRmcmFtZXJhdGUoZ3NwY2FfZGV2KTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qIGdldCBzdHJlYW0gcGFyYW1ldGVycyAoZnJhbWVyYXRlKSAqLworc3RhdGljIHZvaWQgc2RfZ2V0X3N0cmVhbXBhcm0oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJICAgICBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwYXJtKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybSAqY3AgPSAmcGFybS0+cGFybS5jYXB0dXJlOworCXN0cnVjdCB2NGwyX2ZyYWN0ICp0cGYgPSAmY3AtPnRpbWVwZXJmcmFtZTsKKwlpbnQgZnIsIGk7CisKKwljcC0+Y2FwYWJpbGl0eSB8PSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisJdHBmLT5udW1lcmF0b3IgPSAxOworCWkgPSBnZXRfZnJfaWR4KGdzcGNhX2Rldik7CisJaWYgKGkgJiAweDgwKSB7CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApCisJCQlmciA9IHJhdGVzWzYgLSAoaSAmIDB4MDcpXTsKKwkJZWxzZQorCQkJZnIgPSByYXRlc182ODEwWzcgLSAoaSAmIDB4MDcpXTsKKwl9IGVsc2UgeworCQlmciA9IHJhdGVzWzYgLSBpXTsKKwl9CisJdHBmLT5kZW5vbWluYXRvciA9IGZyOworfQorCisvKiBzZXQgc3RyZWFtIHBhcmFtZXRlcnMgKGZyYW1lcmF0ZSkgKi8KK3N0YXRpYyB2b2lkIHNkX3NldF9zdHJlYW1wYXJtKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0gKmNwID0gJnBhcm0tPnBhcm0uY2FwdHVyZTsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCAqdHBmID0gJmNwLT50aW1lcGVyZnJhbWU7CisJaW50IGZyLCBpOworCisJc2QtPmZyYW1lcmF0ZSA9IHRwZi0+ZGVub21pbmF0b3IgLyB0cGYtPm51bWVyYXRvcjsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGZyYW1lcmF0ZShnc3BjYV9kZXYpOworCisJLyogUmV0dXJuIHRoZSBhY3R1YWwgZnJhbWVyYXRlICovCisJaSA9IGdldF9mcl9pZHgoZ3NwY2FfZGV2KTsKKwlpZiAoaSAmIDB4ODApCisJCWZyID0gcmF0ZXNfNjgxMFs3IC0gKGkgJiAweDA3KV07CisJZWxzZQorCQlmciA9IHJhdGVzWzYgLSBpXTsKKwl0cGYtPm51bWVyYXRvciA9IDE7CisJdHBmLT5kZW5vbWluYXRvciA9IGZyOworfQorCitzdGF0aWMgaW50IHNkX3NldF9qY29tcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKmpjb21wKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9TT0k3NjNBKQorCQlqcGVnX3NldF9xdWFsKHNkLT5qcGVnX2hkciwgamNvbXAtPnF1YWxpdHkpOworLyoJZWxzZQorCQlmaXhtZTogVE9ETworKi8KKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworfQorCitzdGF0aWMgaW50IHNkX2dldF9qY29tcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKmpjb21wKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCW1lbXNldChqY29tcCwgMCwgc2l6ZW9mICpqY29tcCk7CisJamNvbXAtPnF1YWxpdHkgPSBqcGVnX3Fbc2QtPnF1YWxpdHldOworCWpjb21wLT5qcGVnX21hcmtlcnMgPSBWNEwyX0pQRUdfTUFSS0VSX0RIVAorCQkJfCBWNEwyX0pQRUdfTUFSS0VSX0RRVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjdHJsIHNkX2N0cmxzW05DVFJMU10gPSB7CitbRVhQT1NVUkVdID0geworCSAgICB7CisJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkV4cG9zdXJlIiwKKwkJLm1pbmltdW0gPSAweDAxLAorCQkubWF4aW11bSA9IDB4ZGMsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAweDRlLAorCSAgICB9LAorCSAgICAuc2V0X2NvbnRyb2wgPSBzZXRleHBvc3VyZQorCX0sCitbUVVBTElUWV0gPSB7CisJICAgIHsKKwkJLmlkID0gVjRMMl9DSURfUFJJVkFURV9CQVNFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkNvbXByZXNzaW9uIHF1YWxpdHkiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMTUsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxMywKKwkgICAgfSwKKwkgICAgLnNldF9jb250cm9sID0gc2V0cXVhbGl0eQorCX0sCitbUkdBSU5dID0geworCSAgICB7CisJCS5pZCA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIlJlZCBiYWxhbmNlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDQwOTUsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAyNTYsCisJICAgIH0sCisJICAgIC5zZXRfY29udHJvbCA9IHNldHJnYWluCisJfSwKK1tHQUlOXSA9IHsKKwkgICAgeworCQkuaWQgPSBWNEwyX0NJRF9HQUlOLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkdhaW4iLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gNDA5NSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDI1NiwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldGdhaW4KKwl9LAorW0JHQUlOXSA9IHsKKwkgICAgeworCQkuaWQgPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiQmx1ZSBiYWxhbmNlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDQwOTUsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAyNTYsCisJICAgIH0sCisJICAgIC5zZXRfY29udHJvbCA9IHNldGJnYWluCisJfSwKK1tTSEFSUE5FU1NdID0geworCSAgICB7CisJCS5pZAkgPSBWNEwyX0NJRF9TSEFSUE5FU1MsCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgPSAiU2hhcnBuZXNzIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDMsCisJCS5zdGVwICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAyLAorCSAgICB9LAorCSAgICAuc2V0X2NvbnRyb2wgPSBzZXRzaGFycG5lc3MKKwl9LAorW0dBTU1BXSA9IHsKKwkgICAgeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0dBTU1BLAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgID0gIkdhbW1hIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IE5HQU1NQSAtIDEsCisJCS5zdGVwICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCSAgICB9LAorCSAgICAuc2V0X2NvbnRyb2wgPSBzZXRnYW1tYQorCX0sCitbQVVUT0dBSU5dID0geworCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfQVVUT0dBSU4sCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgICAgPSAiQXV0byBHYWluIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBBVVRPR0FJTl9ERUYKKwkgICAgfSwKKwkgICAgLnNldF9jb250cm9sID0gc2V0YXV0b2dhaW4KKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZF9kZXNjIHNkX2Rlc2MgPSB7CisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKKwkuY3RybHMgPSBzZF9jdHJscywKKwkubmN0cmxzID0gTkNUUkxTLAorCS5jb25maWcgPSBzZF9jb25maWcsCisJLmluaXQgPSBzZF9pbml0LAorCS5pc29jX2luaXQgPSBzZF9pc29jX2luaXQsCisJLnN0YXJ0ID0gc2Rfc3RhcnQsCisJLnN0b3BOID0gc2Rfc3RvcE4sCisJLnBrdF9zY2FuID0gc2RfcGt0X3NjYW4sCisJLmRxX2NhbGxiYWNrID0gc2RfZHFfY2FsbGJhY2ssCisJLmdldF9zdHJlYW1wYXJtID0gc2RfZ2V0X3N0cmVhbXBhcm0sCisJLnNldF9zdHJlYW1wYXJtID0gc2Rfc2V0X3N0cmVhbXBhcm0sCisJLmdldF9qY29tcCA9IHNkX2dldF9qY29tcCwKKwkuc2V0X2pjb21wID0gc2Rfc2V0X2pjb21wLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MDZhMiwgMHgwMDAzKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX1RQNjgwMH0sCisJe1VTQl9ERVZJQ0UoMHgwNmEyLCAweDY4MTApLCAuZHJpdmVyX2luZm8gPSBCUklER0VfVFA2ODEwfSwKKwl7fQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworc3RhdGljIGludCBzZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBnc3BjYV9kZXZfcHJvYmUoaW50ZXJmYWNlLCBpZCwgJnNkX2Rlc2MsIHNpemVvZihzdHJ1Y3Qgc2QpLAorCQkJICAgICAgIFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNkX2RyaXZlciA9IHsKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCS5pZF90YWJsZSA9IGRldmljZV90YWJsZSwKKwkucHJvYmUgPSBzZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGdzcGNhX2Rpc2Nvbm5lY3QsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBnc3BjYV9zdXNwZW5kLAorCS5yZXN1bWUgPSBnc3BjYV9yZXN1bWUsCisJLnJlc2V0X3Jlc3VtZSA9IGdzcGNhX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworLyogLS0gbW9kdWxlIGluc2VydCAvIHJlbW92ZSAtLSAqLworc3RhdGljIGludCBfX2luaXQgc2RfbW9kX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZzZF9kcml2ZXIpOworfQorc3RhdGljIHZvaWQgX19leGl0IHNkX21vZF9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnNkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNkX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHNkX21vZF9leGl0KTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX3NlbnNvciwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfc2Vuc29yLAorCSJGb3JjZSBzZW5zb3IuIDA6IGN4MDM0MiwgMTogc29pNzYzYSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92YzAzMnguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmMwMzJ4LmMKaW5kZXggNmNhZWQ3My4uN2VlMmM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92YzAzMnguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3ZjMDMyeC5jCkBAIC0yMCw2ICsyMCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAidmMwMzJ4IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTMxNjksNyArMzE3MSw3IEBACiAJCQlpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3IgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfciBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0zMjEwLDcgKzMyMTIsNyBAQAogCQkJdmFsdWUsIGluZGV4LCBOVUxMLCAwLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193IGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3cgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMzIzNSw4ICszMjM3LDcgQEAKIAogCXJlZ19yKGdzcGNhX2RldiwgMHhhMSwgMHhiMzNmLCAxKTsKIAlpZiAoIShnc3BjYV9kZXYtPnVzYl9idWZbMF0gJiAweDAyKSkgewotCQllcnIoIkkyYyBCdXMgQnVzeSBXYWl0ICUwMngiLAotCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdKTsKKwkJcHJfZXJyKCJJMmMgQnVzIEJ1c3kgV2FpdCAlMDJ4XG4iLCBnc3BjYV9kZXYtPnVzYl9idWZbMF0pOwogCQlyZXR1cm4gMDsKIAl9CiAJcmVnX3coZ3NwY2FfZGV2LCAweGEwLCBhZGRyZXNzLCAweGIzM2EpOwpAQCAtMzM0OSw3ICszMzUwLDcgQEAKIAkJbXNsZWVwKDIwKTsKIAl9IHdoaWxlICgtLXJldHJ5ID4gMCk7CiAJaWYgKHJldHJ5IDw9IDApCi0JCWVycigiaTJjX3dyaXRlIHRpbWVvdXQiKTsKKwkJcHJfZXJyKCJpMmNfd3JpdGUgdGltZW91dFxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIHB1dF90YWJfdG9fcmVnKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKQEAgLTM0NDYsNyArMzQ0Nyw3IEBACiAKIAlzd2l0Y2ggKHNlbnNvcikgewogCWNhc2UgLTE6Ci0JCWVycigiVW5rbm93biBzZW5zb3IuLi4iKTsKKwkJcHJfZXJyKCJVbmtub3duIHNlbnNvci4uLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCWNhc2UgU0VOU09SX0hWNzEzMVI6CiAJCVBERUJVRyhEX1BST0JFLCAiRmluZCBTZW5zb3IgSFY3MTMxUiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92aWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92aWNhbS5jCmluZGV4IDg0ZGZiYWIuLjgxZGQ0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmljYW0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3ZpY2FtLmMKQEAgLTI2LDYgKzI2LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJ2aWNhbSIKICNkZWZpbmUgSEVBREVSX1NJWkUgNjQKIApAQCAtMTE3LDcgKzExOSw3IEBACiAJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQkgICAgICB2YWx1ZSwgaW5kZXgsIGRhdGEsIGxlbiwgMTAwMCk7CiAJaWYgKHJldCA8IDApCi0JCWVycigiY29udHJvbCBtc2cgcmVxICUwMlggZXJyb3IgJWQiLCByZXF1ZXN0LCByZXQpOworCQlwcl9lcnIoImNvbnRyb2wgbXNnIHJlcSAlMDJYIGVycm9yICVkXG4iLCByZXF1ZXN0LCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE4OSw4ICsxOTEsOCBAQAogCQkJICAgZGF0YSwgc2l6ZSwgJmFjdF9sZW4sIDEwMDAwKTsKIAkvKiBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIDAsIG90aGVyd2lzZSAgbmVnYXRpdmUgKi8KIAlpZiAocmV0IDwgMCB8fCBhY3RfbGVuICE9IHNpemUpIHsKLQkJZXJyKCJidWxrIHJlYWQgZmFpbCAoJWQpIGxlbiAlZC8lZCIsCi0JCQlyZXQsIGFjdF9sZW4sIHNpemUpOworCQlwcl9lcnIoImJ1bGsgcmVhZCBmYWlsICglZCkgbGVuICVkLyVkXG4iLAorCQkgICAgICAgcmV0LCBhY3RfbGVuLCBzaXplKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXJldHVybiAwOwpAQCAtMjE2LDcgKzIxOCw3IEBACiAJCSAgIEhFQURFUl9TSVpFOwogCWJ1ZmZlciA9IGttYWxsb2MoZnJhbWVfc3osIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlpZiAoIWJ1ZmZlcikgewotCQllcnIoIkNvdWxkbid0IGFsbG9jYXRlIFVTQiBidWZmZXIiKTsKKwkJcHJfZXJyKCJDb3VsZG4ndCBhbGxvY2F0ZSBVU0IgYnVmZmVyXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjY5LDcgKzI3MSw3IEBACiAJcmV0ID0gcmVxdWVzdF9paGV4X2Zpcm13YXJlKCZmdywgInZpY2FtL2Zpcm13YXJlLmZ3IiwKIAkJCQkgICAgJmdzcGNhX2Rldi0+ZGV2LT5kZXYpOwogCWlmIChyZXQpIHsKLQkJZXJyKCJGYWlsZWQgdG8gbG9hZCBcInZpY2FtL2Zpcm13YXJlLmZ3XCI6ICVkXG4iLCByZXQpOworCQlwcl9lcnIoIkZhaWxlZCB0byBsb2FkIFwidmljYW0vZmlybXdhcmUuZndcIjogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3c5OTZYY2YuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evdzk5NlhjZi5jCmluZGV4IDRhOWU2MjIuLjI3ZDJjZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evdzk5NlhjZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evdzk5NlhjZi5jCkBAIC0zMSw2ICszMSw4IEBACiAgICB0aGUgc2Vuc29yIGRyaXZlcnMgdG8gdjRsMiBzdWIgZHJpdmVycywgYW5kIHByb3Blcmx5IHNwbGl0IG9mIHRoaXMKICAgIGRyaXZlciBmcm9tIG92NTE5LmMgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIFc5OTY4Q0ZfSTJDX0JVU19ERUxBWSAgICA0IC8qIGRlbGF5IGluIHVzIGZvciBJMkMgYml0IHIvdyBvcGVyYXRpb25zICovCiAKICNkZWZpbmUgWV9RVUFOVEFCTEUgKCZzZC0+anBlZ19oZHJbSlBFR19RVDBfT0ZGU0VUXSkKQEAgLTgxLDcgKzgzLDcgQEAKIAkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCSAgICAgIHZhbHVlLCAweDA2LCBzZC0+Z3NwY2FfZGV2LnVzYl9idWYsIDYsIDUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJXcml0ZSBGU0IgcmVnaXN0ZXJzIGZhaWxlZCAoJWQpIiwgcmV0KTsKKwkJcHJfZXJyKCJXcml0ZSBGU0IgcmVnaXN0ZXJzIGZhaWxlZCAoJWQpXG4iLCByZXQpOwogCQlzZC0+Z3NwY2FfZGV2LnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMTA4LDcgKzExMCw3IEBACiAJdWRlbGF5KFc5OTY4Q0ZfSTJDX0JVU19ERUxBWSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQllcnIoIldyaXRlIFNCIHJlZyBbMDFdICUwNHggZmFpbGVkIiwgdmFsdWUpOworCQlwcl9lcnIoIldyaXRlIFNCIHJlZyBbMDFdICUwNHggZmFpbGVkXG4iLCB2YWx1ZSk7CiAJCXNkLT5nc3BjYV9kZXYudXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0xMzUsNyArMTM3LDcgQEAKIAkJcmV0ID0gc2QtPmdzcGNhX2Rldi51c2JfYnVmWzBdIHwKIAkJICAgICAgKHNkLT5nc3BjYV9kZXYudXNiX2J1ZlsxXSA8PCA4KTsKIAl9IGVsc2UgewotCQllcnIoIlJlYWQgU0IgcmVnIFswMV0gZmFpbGVkIik7CisJCXByX2VycigiUmVhZCBTQiByZWcgWzAxXSBmYWlsZWRcbiIpOwogCQlzZC0+Z3NwY2FfZGV2LnVzYl9lcnIgPSByZXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3hpcmxpbmtfY2l0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3hpcmxpbmtfY2l0LmMKaW5kZXggYzA4OWEwZi4uM2FlZDQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS94aXJsaW5rX2NpdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EveGlybGlua19jaXQuYwpAQCAtMjcsNiArMjcsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInhpcmxpbmstY2l0IgogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KQEAgLTgwMCw4ICs4MDIsOCBAQAogCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfRU5EUE9JTlQsCiAJCQl2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDEwMDApOwogCWlmIChlcnIgPCAwKQotCQllcnIoIkZhaWxlZCB0byB3cml0ZSBhIHJlZ2lzdGVyIChpbmRleCAweCUwNFgsIgotCQkJIiB2YWx1ZSAweCUwMlgsIGVycm9yICVkKSIsIGluZGV4LCB2YWx1ZSwgZXJyKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gd3JpdGUgYSByZWdpc3RlciAoaW5kZXggMHglMDRYLCB2YWx1ZSAweCUwMlgsIGVycm9yICVkKVxuIiwKKwkJICAgICAgIGluZGV4LCB2YWx1ZSwgZXJyKTsKIAogCXJldHVybiAwOwogfQpAQCAtODE2LDggKzgxOCw4IEBACiAJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0VORFBPSU5ULAogCQkJMHgwMCwgaW5kZXgsIGJ1ZiwgOCwgMTAwMCk7CiAJaWYgKHJlcyA8IDApIHsKLQkJZXJyKCJGYWlsZWQgdG8gcmVhZCBhIHJlZ2lzdGVyIChpbmRleCAweCUwNFgsIGVycm9yICVkKSIsCi0JCQlpbmRleCwgcmVzKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVhZCBhIHJlZ2lzdGVyIChpbmRleCAweCUwNFgsIGVycm9yICVkKVxuIiwKKwkJICAgICAgIGluZGV4LCByZXMpOwogCQlyZXR1cm4gcmVzOwogCX0KIApAQCAtMTU4Nyw3ICsxNTg5LDcgQEAKIAlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKGdzcGNhX2Rldi0+ZGV2LCBnc3BjYV9kZXYtPmlmYWNlKTsKIAlhbHQgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50ZiwgZ3NwY2FfZGV2LT5hbHQpOwogCWlmICghYWx0KSB7Ci0JCWVycigiQ291bGRuJ3QgZ2V0IGFsdHNldHRpbmciKTsKKwkJcHJfZXJyKCJDb3VsZG4ndCBnZXQgYWx0c2V0dGluZ1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMjgyNCw3ICsyODI2LDcgQEAKIAogCXJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKGdzcGNhX2Rldi0+ZGV2LCBnc3BjYV9kZXYtPmlmYWNlLCAxKTsKIAlpZiAocmV0IDwgMCkKLQkJZXJyKCJzZXQgYWx0IDEgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJzZXQgYWx0IDEgZXJyICVkXG4iLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHguYwppbmRleCA2MWNkZDU2Li4zMGVhMWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3pjM3h4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS96YzN4eC5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInpjM3h4IgogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KQEAgLTU2NjYsNyArNTY2OCw3IEBACiAJCQlpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ19yX2kgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfcl9pIGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCQlyZXR1cm4gMDsKIAl9CkBAIC01Njk4LDcgKzU3MDAsNyBAQAogCQkJdmFsdWUsIGluZGV4LCBOVUxMLCAwLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193X2kgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfd19pIGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTU3MjQsNyArNTcyNiw3IEBACiAJbXNsZWVwKDIwKTsKIAlyZXRieXRlID0gcmVnX3JfaShnc3BjYV9kZXYsIDB4MDA5MSk7CQkvKiByZWFkIHN0YXR1cyAqLwogCWlmIChyZXRieXRlICE9IDB4MDApCi0JCWVycigiaTJjX3Igc3RhdHVzIGVycm9yICUwMngiLCByZXRieXRlKTsKKwkJcHJfZXJyKCJpMmNfciBzdGF0dXMgZXJyb3IgJTAyeFxuIiwgcmV0Ynl0ZSk7CiAJcmV0dmFsID0gcmVnX3JfaShnc3BjYV9kZXYsIDB4MDA5NSk7CQkvKiByZWFkIExvd2J5dGUgKi8KIAlyZXR2YWwgfD0gcmVnX3JfaShnc3BjYV9kZXYsIDB4MDA5NikgPDwgODsJLyogcmVhZCBIaWdodGJ5dGUgKi8KIAlQREVCVUcoRF9VU0JJLCAiaTJjIHIgWyUwMnhdIC0+ICUwNHggKCUwMngpIiwKQEAgLTU3NDgsNyArNTc1MCw3IEBACiAJbXNsZWVwKDEpOwogCXJldGJ5dGUgPSByZWdfcl9pKGdzcGNhX2RldiwgMHgwMDkxKTsJCS8qIHJlYWQgc3RhdHVzICovCiAJaWYgKHJldGJ5dGUgIT0gMHgwMCkKLQkJZXJyKCJpMmNfdyBzdGF0dXMgZXJyb3IgJTAyeCIsIHJldGJ5dGUpOworCQlwcl9lcnIoImkyY193IHN0YXR1cyBlcnJvciAlMDJ4XG4iLCByZXRieXRlKTsKIAlQREVCVUcoRF9VU0JPLCAiaTJjIHcgWyUwMnhdID0gJTAyeCUwMnggKCUwMngpIiwKIAkJCXJlZywgdmFsSCwgdmFsTCwgcmV0Ynl0ZSk7CiAJcmV0dXJuIHJldGJ5dGU7CkBAIC02NDk3LDcgKzY0OTksNyBAQAogCQkJCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIEdDMDMwMyIpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQl3YXJuKCJVbmtub3duIHNlbnNvciAtIHNldCB0byBUQVM1MTMwQyIpOworCQkJCXByX3dhcm4oIlVua25vd24gc2Vuc29yIC0gc2V0IHRvIFRBUzUxMzBDXG4iKTsKIAkJCQlzZC0+c2Vuc29yID0gU0VOU09SX1RBUzUxMzBDOwogCQkJfQogCQkJYnJlYWs7CkBAIC02NjAzLDcgKzY2MDUsNyBAQAogCQkJc2QtPnNlbnNvciA9IFNFTlNPUl9PVjc2MjA7CS8qIHNhbWUgc2Vuc29yICg/KSAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQllcnIoIlVua25vd24gc2Vuc29yICUwNHgiLCBzZW5zb3IpOworCQkJcHJfZXJyKCJVbmtub3duIHNlbnNvciAlMDR4XG4iLCBzZW5zb3IpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC02OTcwLDYgKzY5NzIsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MDNmMCwgMHgxYjA3KX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDA0MWUpfSwKIAl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDAxNyl9LAogCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDFjKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBUzEwNn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9NYWtlZmlsZQppbmRleCAzYmFhOWY2Li41MmYwNTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvTWFrZWZpbGUKQEAgLTIsNiArMiw2IEBACiAKIG9iai0kKENPTkZJR19WSURFT19IRFBWUikgKz0gaGRwdnIubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCiAKLUVYVFJBX0NGTEFHUyArPSAkKGV4dHJhLWNmbGFncy15KSAkKGV4dHJhLWNmbGFncy1tKQorY2NmbGFncy15ICs9ICQoZXh0cmEtY2ZsYWdzLXkpICQoZXh0cmEtY2ZsYWdzLW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci1pMmMuYwppbmRleCAyYTFhYzI4Li44MmU4MTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItaTJjLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImhkcHZyLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX2dlbWluaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fZ2VtaW5pLmMKaW5kZXggY2JjNTA1YS4uYTYyMzIyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fZ2VtaW5pLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fZ2VtaW5pLmMKQEAgLTIxLDkgKzIxLDEyIEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgREVCVUdfVkFSSUFCTEUgZGVidWcKIAogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKQEAgLTE3NSwxMyArMTc4LDE0IEBACiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIAlpbnQgaSA9IDA7CiAKLQlERUJfRCgoImhleGl1bV9pbml0X2RvbmUgY2FsbGVkLlxuIikpOworCURFQl9EKCJoZXhpdW1faW5pdF9kb25lIGNhbGxlZFxuIik7CiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWxwZXIgaWNzIHRvIHVzZWZ1bCB2YWx1ZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGhleGl1bV9rczAxMjdiKTsgaSsrKSB7CiAJCWRhdGEuYnl0ZSA9IGhleGl1bV9rczAxMjdiW2ldOwogCQlpZiAoMCAhPSBpMmNfc21idXNfeGZlcigmaGV4aXVtLT5pMmNfYWRhcHRlciwgMHg2YywgMCwgSTJDX1NNQlVTX1dSSVRFLCBpLCBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSkpIHsKLQkJCXByaW50aygiaGV4aXVtX2dlbWluaTogaGV4aXVtX2luaXRfZG9uZSgpIGZhaWxlZCBmb3IgYWRkcmVzcyAweCUwMnhcbiIsIGkpOworCQkJcHJfZXJyKCJoZXhpdW1faW5pdF9kb25lKCkgZmFpbGVkIGZvciBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCSAgICAgICBpKTsKIAkJfQogCX0KIApAQCAtMTkyLDcgKzE5Niw3IEBACiB7CiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIAotCURFQl9EKCgiLlxuIikpOworCURFQl9EKCJcbiIpOwogCiAJZGF0YS5ieXRlID0gaGV4aXVtX2lucHV0X3NlbGVjdFtpbnB1dF0uYnl0ZTsKIAlpZiAoMCAhPSBpMmNfc21idXNfeGZlcigmaGV4aXVtLT5pMmNfYWRhcHRlciwgMHg2YywgMCwgSTJDX1NNQlVTX1dSSVRFLCBoZXhpdW1faW5wdXRfc2VsZWN0W2lucHV0XS5hZHIsIEkyQ19TTUJVU19CWVRFX0RBVEEsICZkYXRhKSkgewpAQCAtMjA3LDEyICsyMTEsMTMgQEAKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwogCWludCBpID0gMDsKIAotCURFQl9EKCgiLlxuIikpOworCURFQl9EKCJcbiIpOwogCiAJd2hpbGUgKHZkZWNbaV0uYWRyICE9IC0xKSB7CiAJCWRhdGEuYnl0ZSA9IHZkZWNbaV0uYnl0ZTsKIAkJaWYgKDAgIT0gaTJjX3NtYnVzX3hmZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIsIDB4NmMsIDAsIEkyQ19TTUJVU19XUklURSwgdmRlY1tpXS5hZHIsIEkyQ19TTUJVU19CWVRFX0RBVEEsICZkYXRhKSkgewotCQkJcHJpbnRrKCJoZXhpdW1faW5pdF9kb25lOiBoZXhpdW1fc2V0X3N0YW5kYXJkKCkgZmFpbGVkIGZvciBhZGRyZXNzIDB4JTAyeFxuIiwgaSk7CisJCQlwcl9lcnIoImhleGl1bV9pbml0X2RvbmU6IGhleGl1bV9zZXRfc3RhbmRhcmQoKSBmYWlsZWQgZm9yIGFkZHJlc3MgMHglMDJ4XG4iLAorCQkJICAgICAgIGkpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCWkrKzsKQEAgLTIyMiwxNCArMjI3LDE0IEBACiAKIHN0YXRpYyBpbnQgdmlkaW9jX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKIHsKLQlERUJfRUUoKCJWSURJT0NfRU5VTUlOUFVUICVkLlxuIiwgaS0+aW5kZXgpKTsKKwlERUJfRUUoIlZJRElPQ19FTlVNSU5QVVQgJWRcbiIsIGktPmluZGV4KTsKIAogCWlmIChpLT5pbmRleCA+PSBIRVhJVU1fSU5QVVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1lbWNweShpLCAmaGV4aXVtX2lucHV0c1tpLT5pbmRleF0sIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpOwogCi0JREVCX0QoKCJ2NGwyX2lvY3RsOiBWSURJT0NfRU5VTUlOUFVUICVkLlxuIiwgaS0+aW5kZXgpKTsKKwlERUJfRCgidjRsMl9pb2N0bDogVklESU9DX0VOVU1JTlBVVCAlZFxuIiwgaS0+aW5kZXgpOwogCXJldHVybiAwOwogfQogCkBAIC0yNDAsNyArMjQ1LDcgQEAKIAogCSppbnB1dCA9IGhleGl1bS0+Y3VyX2lucHV0OwogCi0JREVCX0QoKCJWSURJT0NfR19JTlBVVDogJWRcbiIsICppbnB1dCkpOworCURFQl9EKCJWSURJT0NfR19JTlBVVDogJWRcbiIsICppbnB1dCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0OSw3ICsyNTQsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gKChzdHJ1Y3Qgc2FhNzE0Nl9maCAqKWZoKS0+ZGV2OwogCXN0cnVjdCBoZXhpdW0gKmhleGl1bSA9IChzdHJ1Y3QgaGV4aXVtICopIGRldi0+ZXh0X3ByaXY7CiAKLQlERUJfRUUoKCJWSURJT0NfU19JTlBVVCAlZC5cbiIsIGlucHV0KSk7CisJREVCX0VFKCJWSURJT0NfU19JTlBVVCAlZFxuIiwgaW5wdXQpOwogCiAJaWYgKGlucHV0ID49IEhFWElVTV9JTlBVVFMpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjcwLDcgKzI3NSw3IEBACiAJZm9yIChpID0gSEVYSVVNX0NPTlRST0xTIC0gMTsgaSA+PSAwOyBpLS0pIHsKIAkJaWYgKGhleGl1bV9jb250cm9sc1tpXS5pZCA9PSBxYy0+aWQpIHsKIAkJCSpxYyA9IGhleGl1bV9jb250cm9sc1tpXTsKLQkJCURFQl9EKCgiVklESU9DX1FVRVJZQ1RSTCAlZC5cbiIsIHFjLT5pZCkpOworCQkJREVCX0QoIlZJRElPQ19RVUVSWUNUUkwgJWRcbiIsIHFjLT5pZCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTI5Myw3ICsyOTgsNyBAQAogCiAJaWYgKHZjLT5pZCA9PSBWNEwyX0NJRF9QUklWQVRFX0JBU0UpIHsKIAkJdmMtPnZhbHVlID0gaGV4aXVtLT5jdXJfYnc7Ci0JCURFQl9EKCgiVklESU9DX0dfQ1RSTCBCVzolZC5cbiIsIHZjLT52YWx1ZSkpOworCQlERUJfRCgiVklESU9DX0dfQ1RSTCBCVzolZFxuIiwgdmMtPnZhbHVlKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAtRUlOVkFMOwpAQCAtMzE2LDcgKzMyMSw3IEBACiAJaWYgKHZjLT5pZCA9PSBWNEwyX0NJRF9QUklWQVRFX0JBU0UpCiAJCWhleGl1bS0+Y3VyX2J3ID0gdmMtPnZhbHVlOwogCi0JREVCX0QoKCJWSURJT0NfU19DVFJMIEJXOiVkLlxuIiwgaGV4aXVtLT5jdXJfYncpKTsKKwlERUJfRCgiVklESU9DX1NfQ1RSTCBCVzolZFxuIiwgaGV4aXVtLT5jdXJfYncpOwogCiAJaWYgKDAgPT0gaGV4aXVtLT5jdXJfYncgJiYgVjRMMl9TVERfUEFMID09IGhleGl1bS0+Y3VyX3N0ZCkgewogCQloZXhpdW1fc2V0X3N0YW5kYXJkKGhleGl1bSwgaGV4aXVtX3BhbCk7CkBAIC0zNTEsMTQgKzM1NiwxNCBAQAogLyogdGhpcyBmdW5jdGlvbiBvbmx5IGdldHMgY2FsbGVkIHdoZW4gdGhlIHByb2Jpbmcgd2FzIHN1Y2Nlc3NmdWwgKi8KIHN0YXRpYyBpbnQgaGV4aXVtX2F0dGFjaChzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgc3RydWN0IHNhYTcxNDZfcGNpX2V4dGVuc2lvbl9kYXRhICppbmZvKQogewotCXN0cnVjdCBoZXhpdW0gKmhleGl1bSA9IChzdHJ1Y3QgaGV4aXVtICopIGRldi0+ZXh0X3ByaXY7CisJc3RydWN0IGhleGl1bSAqaGV4aXVtOwogCWludCByZXQ7CiAKLQlERUJfRUUoKCIuXG4iKSk7CisJREVCX0VFKCJcbiIpOwogCiAJaGV4aXVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhleGl1bSksIEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IGhleGl1bSkgewotCQlwcmludGsoImhleGl1bV9nZW1pbmk6IG5vdCBlbm91Z2gga2VybmVsIG1lbW9yeSBpbiBoZXhpdW1fYXR0YWNoKCkuXG4iKTsKKwkJcHJfZXJyKCJub3QgZW5vdWdoIGtlcm5lbCBtZW1vcnkgaW4gaGV4aXVtX2F0dGFjaCgpXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWRldi0+ZXh0X3ByaXYgPSBoZXhpdW07CkBAIC0zNzEsNyArMzc2LDcgQEAKIAl9OwogCXNhYTcxNDZfaTJjX2FkYXB0ZXJfcHJlcGFyZShkZXYsICZoZXhpdW0tPmkyY19hZGFwdGVyLCBTQUE3MTQ2X0kyQ19CVVNfQklUX1JBVEVfNDgwKTsKIAlpZiAoaTJjX2FkZF9hZGFwdGVyKCZoZXhpdW0tPmkyY19hZGFwdGVyKSA8IDApIHsKLQkJREVCX1MoKCJjYW5ub3QgcmVnaXN0ZXIgaTJjLWRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCURFQl9TKCJjYW5ub3QgcmVnaXN0ZXIgaTJjLWRldmljZS4gc2tpcHBpbmcuXG4iKTsKIAkJa2ZyZWUoaGV4aXVtKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtNDAyLDExICs0MDcsMTEgQEAKIAl2dl9kYXRhLm9wcy52aWRpb2Nfc19pbnB1dCA9IHZpZGlvY19zX2lucHV0OwogCXJldCA9IHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZoZXhpdW0tPnZpZGVvX2RldiwgZGV2LCAiaGV4aXVtIGdlbWluaSIsIFZGTF9UWVBFX0dSQUJCRVIpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiaGV4aXVtX2dlbWluaTogY2Fubm90IHJlZ2lzdGVyIGNhcHR1cmUgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIik7CisJCXByX2VycigiY2Fubm90IHJlZ2lzdGVyIGNhcHR1cmUgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JcHJpbnRrKCJoZXhpdW1fZ2VtaW5pOiBmb3VuZCAnaGV4aXVtIGdlbWluaScgZnJhbWUgZ3JhYmJlci0lZC5cbiIsIGhleGl1bV9udW0pOworCXByX2luZm8oImZvdW5kICdoZXhpdW0gZ2VtaW5pJyBmcmFtZSBncmFiYmVyLSVkXG4iLCBoZXhpdW1fbnVtKTsKIAloZXhpdW1fbnVtKys7CiAKIAlyZXR1cm4gMDsKQEAgLTQxNiw3ICs0MjEsNyBAQAogewogCXN0cnVjdCBoZXhpdW0gKmhleGl1bSA9IChzdHJ1Y3QgaGV4aXVtICopIGRldi0+ZXh0X3ByaXY7CiAKLQlERUJfRUUoKCJkZXY6JXBcbiIsIGRldikpOworCURFQl9FRSgiZGV2OiVwXG4iLCBkZXYpOwogCiAJc2FhNzE0Nl91bnJlZ2lzdGVyX2RldmljZSgmaGV4aXVtLT52aWRlb19kZXYsIGRldik7CiAJc2FhNzE0Nl92dl9yZWxlYXNlKGRldik7CkBAIC01MDgsNyArNTEzLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGhleGl1bV9pbml0X21vZHVsZSh2b2lkKQogewogCWlmICgwICE9IHNhYTcxNDZfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZoZXhpdW1fZXh0ZW5zaW9uKSkgewotCQlERUJfUygoImZhaWxlZCB0byByZWdpc3RlciBleHRlbnNpb24uXG4iKSk7CisJCURFQl9TKCJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0ZW5zaW9uXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9vcmlvbi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fb3Jpb24uYwppbmRleCA2YWQ3ZTFjLi4yM2RlYmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9vcmlvbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX29yaW9uLmMKQEAgLTIxLDkgKzIxLDEyIEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgREVCVUdfVkFSSUFCTEUgZGVidWcKIAogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKQEAgLTIwOSw3ICsyMTIsNyBAQAogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CiAJaW50IGVyciA9IDA7CiAKLQlERUJfRUUoKCIuXG4iKSk7CisJREVCX0VFKCJcbiIpOwogCiAJLyogdGhlcmUgYXJlIG5vIGhleGl1bSBvcmlvbiBjYXJkcyB3aXRoIHJldmlzaW9uIDAgc2FhNzE0NnMgKi8KIAlpZiAoMCA9PSBkZXYtPnJldmlzaW9uKSB7CkBAIC0yMTgsNyArMjIxLDcgQEAKIAogCWhleGl1bSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoZXhpdW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBoZXhpdW0pIHsKLQkJcHJpbnRrKCJoZXhpdW1fb3Jpb246IGhleGl1bV9wcm9iZTogbm90IGVub3VnaCBrZXJuZWwgbWVtb3J5LlxuIik7CisJCXByX2VycigiaGV4aXVtX3Byb2JlOiBub3QgZW5vdWdoIGtlcm5lbCBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTIzNCw3ICsyMzcsNyBAQAogCX07CiAJc2FhNzE0Nl9pMmNfYWRhcHRlcl9wcmVwYXJlKGRldiwgJmhleGl1bS0+aTJjX2FkYXB0ZXIsIFNBQTcxNDZfSTJDX0JVU19CSVRfUkFURV80ODApOwogCWlmIChpMmNfYWRkX2FkYXB0ZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIpIDwgMCkgewotCQlERUJfUygoImNhbm5vdCByZWdpc3RlciBpMmMtZGV2aWNlLiBza2lwcGluZy5cbiIpKTsKKwkJREVCX1MoImNhbm5vdCByZWdpc3RlciBpMmMtZGV2aWNlLiBza2lwcGluZy5cbiIpOwogCQlrZnJlZShoZXhpdW0pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0yNDgsNyArMjUxLDcgQEAKIAogCS8qIGRldGVjdCBuZXdlciBIZXhpdW0gT3Jpb24gY2FyZHMgYnkgc3Vic3lzdGVtIGlkcyAqLwogCWlmICgweDE3YzggPT0gZGV2LT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgJiYgMHgwMTAxID09IGRldi0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlKSB7Ci0JCXByaW50aygiaGV4aXVtX29yaW9uOiBkZXZpY2UgaXMgYSBIZXhpdW0gT3Jpb24gdy8gMSBTVkhTICsgMyBCTkMgaW5wdXRzLlxuIik7CisJCXByX2luZm8oImRldmljZSBpcyBhIEhleGl1bSBPcmlvbiB3LyAxIFNWSFMgKyAzIEJOQyBpbnB1dHNcbiIpOwogCQkvKiB3ZSBzdG9yZSB0aGUgcG9pbnRlciBpbiBvdXIgcHJpdmF0ZSBkYXRhIGZpZWxkICovCiAJCWRldi0+ZXh0X3ByaXYgPSBoZXhpdW07CiAJCWhleGl1bS0+dHlwZSA9IEhFWElVTV9PUklPTl8xU1ZIU18zQk5DOwpAQCAtMjU2LDcgKzI1OSw3IEBACiAJfQogCiAJaWYgKDB4MTdjOCA9PSBkZXYtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciAmJiAweDIxMDEgPT0gZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpIHsKLQkJcHJpbnRrKCJoZXhpdW1fb3Jpb246IGRldmljZSBpcyBhIEhleGl1bSBPcmlvbiB3LyA0IEJOQyBpbnB1dHMuXG4iKTsKKwkJcHJfaW5mbygiZGV2aWNlIGlzIGEgSGV4aXVtIE9yaW9uIHcvIDQgQk5DIGlucHV0c1xuIik7CiAJCS8qIHdlIHN0b3JlIHRoZSBwb2ludGVyIGluIG91ciBwcml2YXRlIGRhdGEgZmllbGQgKi8KIAkJZGV2LT5leHRfcHJpdiA9IGhleGl1bTsKIAkJaGV4aXVtLT50eXBlID0gSEVYSVVNX09SSU9OXzRCTkM7CkBAIC0yNjYsNyArMjY5LDcgQEAKIAkvKiBjaGVjayBpZiB0aGlzIGlzIGFuIG9sZCBoZXhpdW0gT3Jpb24gY2FyZCBieSBsb29raW5nIGF0CiAJICAgYSBzYWE3MTEwIGF0IGFkZHJlc3MgMHg0ZSAqLwogCWlmICgwID09IChlcnIgPSBpMmNfc21idXNfeGZlcigmaGV4aXVtLT5pMmNfYWRhcHRlciwgMHg0ZSwgMCwgSTJDX1NNQlVTX1JFQUQsIDB4MDAsIEkyQ19TTUJVU19CWVRFX0RBVEEsICZkYXRhKSkpIHsKLQkJcHJpbnRrKCJoZXhpdW1fb3Jpb246IGRldmljZSBpcyBhIEhleGl1bSBIVi1QQ0k2L09yaW9uIChvbGQpLlxuIik7CisJCXByX2luZm8oImRldmljZSBpcyBhIEhleGl1bSBIVi1QQ0k2L09yaW9uIChvbGQpXG4iKTsKIAkJLyogd2Ugc3RvcmUgdGhlIHBvaW50ZXIgaW4gb3VyIHByaXZhdGUgZGF0YSBmaWVsZCAqLwogCQlkZXYtPmV4dF9wcml2ID0gaGV4aXVtOwogCQloZXhpdW0tPnR5cGUgPSBIRVhJVU1fSFZfUENJNl9PUklPTjsKQEAgLTI4OCwxMyArMjkxLDEzIEBACiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIAlpbnQgaSA9IDA7CiAKLQlERUJfRCgoImhleGl1bV9pbml0X2RvbmUgY2FsbGVkLlxuIikpOworCURFQl9EKCJoZXhpdW1faW5pdF9kb25lIGNhbGxlZFxuIik7CiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWxwZXIgaWNzIHRvIHVzZWZ1bCB2YWx1ZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGhleGl1bV9zYWE3MTEwKTsgaSsrKSB7CiAJCWRhdGEuYnl0ZSA9IGhleGl1bV9zYWE3MTEwW2ldOwogCQlpZiAoMCAhPSBpMmNfc21idXNfeGZlcigmaGV4aXVtLT5pMmNfYWRhcHRlciwgMHg0ZSwgMCwgSTJDX1NNQlVTX1dSSVRFLCBpLCBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSkpIHsKLQkJCXByaW50aygiaGV4aXVtX29yaW9uOiBmYWlsZWQgZm9yIGFkZHJlc3MgMHglMDJ4XG4iLCBpKTsKKwkJCXByX2VycigiZmFpbGVkIGZvciBhZGRyZXNzIDB4JTAyeFxuIiwgaSk7CiAJCX0KIAl9CiAKQEAgLTMwNiw3ICszMDksNyBAQAogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CiAJaW50IGkgPSAwOwogCi0JREVCX0QoKCIuXG4iKSk7CisJREVCX0QoIlxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCWludCBhZHIgPSBoZXhpdW1faW5wdXRfc2VsZWN0W2lucHV0XS5kYXRhW2ldLmFkcjsKQEAgLTMxNCw3ICszMTcsNyBAQAogCQlpZiAoMCAhPSBpMmNfc21idXNfeGZlcigmaGV4aXVtLT5pMmNfYWRhcHRlciwgMHg0ZSwgMCwgSTJDX1NNQlVTX1dSSVRFLCBhZHIsIEkyQ19TTUJVU19CWVRFX0RBVEEsICZkYXRhKSkgewogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCXByaW50aygiJWQ6IDB4JTAyeCA9PiAweCUwMnhcbiIsaW5wdXQsIGFkcixkYXRhLmJ5dGUpOworCQlwcl9kZWJ1ZygiJWQ6IDB4JTAyeCA9PiAweCUwMnhcbiIsIGlucHV0LCBhZHIsIGRhdGEuYnl0ZSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMjIsMTQgKzMyNSwxNCBAQAogCiBzdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfaW5wdXQgKmkpCiB7Ci0JREVCX0VFKCgiVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsIGktPmluZGV4KSk7CisJREVCX0VFKCJWSURJT0NfRU5VTUlOUFVUICVkXG4iLCBpLT5pbmRleCk7CiAKIAlpZiAoaS0+aW5kZXggPj0gSEVYSVVNX0lOUFVUUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltZW1jcHkoaSwgJmhleGl1bV9pbnB1dHNbaS0+aW5kZXhdLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKTsKIAotCURFQl9EKCgidjRsMl9pb2N0bDogVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsIGktPmluZGV4KSk7CisJREVCX0QoInY0bDJfaW9jdGw6IFZJRElPQ19FTlVNSU5QVVQgJWRcbiIsIGktPmluZGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQwLDcgKzM0Myw3IEBACiAKIAkqaW5wdXQgPSBoZXhpdW0tPmN1cl9pbnB1dDsKIAotCURFQl9EKCgiVklESU9DX0dfSU5QVVQ6ICVkXG4iLCAqaW5wdXQpKTsKKwlERUJfRCgiVklESU9DX0dfSU5QVVQ6ICVkXG4iLCAqaW5wdXQpOwogCXJldHVybiAwOwogfQogCkBAIC0zNjUsMTggKzM2OCwxOCBAQAogewogCXN0cnVjdCBoZXhpdW0gKmhleGl1bSA9IChzdHJ1Y3QgaGV4aXVtICopIGRldi0+ZXh0X3ByaXY7CiAKLQlERUJfRUUoKCIuXG4iKSk7CisJREVCX0VFKCJcbiIpOwogCiAJc2FhNzE0Nl92dl9pbml0KGRldiwgJnZ2X2RhdGEpOwogCXZ2X2RhdGEub3BzLnZpZGlvY19lbnVtX2lucHV0ID0gdmlkaW9jX2VudW1faW5wdXQ7CiAJdnZfZGF0YS5vcHMudmlkaW9jX2dfaW5wdXQgPSB2aWRpb2NfZ19pbnB1dDsKIAl2dl9kYXRhLm9wcy52aWRpb2Nfc19pbnB1dCA9IHZpZGlvY19zX2lucHV0OwogCWlmICgwICE9IHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZoZXhpdW0tPnZpZGVvX2RldiwgZGV2LCAiaGV4aXVtIG9yaW9uIiwgVkZMX1RZUEVfR1JBQkJFUikpIHsKLQkJcHJpbnRrKCJoZXhpdW1fb3Jpb246IGNhbm5vdCByZWdpc3RlciBjYXB0dXJlIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpOworCQlwcl9lcnIoImNhbm5vdCByZWdpc3RlciBjYXB0dXJlIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JcHJpbnRrKCJoZXhpdW1fb3Jpb246IGZvdW5kICdoZXhpdW0gb3Jpb24nIGZyYW1lIGdyYWJiZXItJWQuXG4iLCBoZXhpdW1fbnVtKTsKKwlwcl9lcnIoImZvdW5kICdoZXhpdW0gb3Jpb24nIGZyYW1lIGdyYWJiZXItJWRcbiIsIGhleGl1bV9udW0pOwogCWhleGl1bV9udW0rKzsKIAogCS8qIHRoZSByZXN0ICovCkBAIC0zOTAsNyArMzkzLDcgQEAKIHsKIAlzdHJ1Y3QgaGV4aXVtICpoZXhpdW0gPSAoc3RydWN0IGhleGl1bSAqKSBkZXYtPmV4dF9wcml2OwogCi0JREVCX0VFKCgiZGV2OiVwXG4iLCBkZXYpKTsKKwlERUJfRUUoImRldjolcFxuIiwgZGV2KTsKIAogCXNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2UoJmhleGl1bS0+dmlkZW9fZGV2LCBkZXYpOwogCXNhYTcxNDZfdnZfcmVsZWFzZShkZXYpOwpAQCAtNDc5LDcgKzQ4Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBoZXhpdW1faW5pdF9tb2R1bGUodm9pZCkKIHsKIAlpZiAoMCAhPSBzYWE3MTQ2X3JlZ2lzdGVyX2V4dGVuc2lvbigmZXh0ZW5zaW9uKSkgewotCQlERUJfUygoImZhaWxlZCB0byByZWdpc3RlciBleHRlbnNpb24uXG4iKSk7CisJCURFQl9TKCJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0ZW5zaW9uXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lteDA3NC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pbXgwNzQuYwppbmRleCAwMzgyZWE3Li5lZWM3NWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lteDA3NC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaW14MDc0LmMKQEAgLTEyLDExICsxMiwxMiBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAKQEAgLTI2Nyw2ICsyNjgsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpbXgwNzRfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX0NTSTI7CisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19DU0kyXzJfTEFORSB8CisJCVY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMCB8CisJCVY0TDJfTUJVU19DU0kyX0NPTlRJTlVPVVNfQ0xPQ0s7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgaW14MDc0X3N1YmRldl92aWRlb19vcHMgPSB7CiAJLnNfc3RyZWFtCT0gaW14MDc0X3Nfc3RyZWFtLAogCS5zX21idXNfZm10CT0gaW14MDc0X3NfZm10LApAQCAtMjc1LDYgKzI4Nyw3IEBACiAJLmVudW1fbWJ1c19mbXQJPSBpbXgwNzRfZW51bV9mbXQsCiAJLmdfY3JvcAkJPSBpbXgwNzRfZ19jcm9wLAogCS5jcm9wY2FwCT0gaW14MDc0X2Nyb3BjYXAsCisJLmdfbWJ1c19jb25maWcJPSBpbXgwNzRfZ19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgaW14MDc0X3N1YmRldl9jb3JlX29wcyA9IHsKQEAgLTI4NiwyOCArMjk5LDcgQEAKIAkudmlkZW8JPSAmaW14MDc0X3N1YmRldl92aWRlb19vcHMsCiB9OwogCi0vKgotICogV2UgaGF2ZSB0byBwcm92aWRlIHNvYy1jYW1lcmEgb3BlcmF0aW9ucywgYnV0IHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc2F5Ci0gKiB0aGVyZS4gVGhlIE1JUEkgQ1NJMiBkcml2ZXIgd2lsbCBwcm92aWRlIC5xdWVyeV9idXNfcGFyYW0gYW5kIC5zZXRfYnVzX3BhcmFtCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlteDA3NF9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW14MDc0X3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgaW14MDc0X29wcyA9IHsKLQkucXVlcnlfYnVzX3BhcmFtCT0gaW14MDc0X3F1ZXJ5X2J1c19wYXJhbSwKLQkuc2V0X2J1c19wYXJhbQkJPSBpbXgwNzRfc2V0X2J1c19wYXJhbSwKLX07Ci0KLXN0YXRpYyBpbnQgaW14MDc0X3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgaW14MDc0X3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJaW50IHJldDsKIAl1MTYgaWQ7CkBAIC00MTcsMTcgKzQwOSwxMCBAQAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIHsKIAlzdHJ1Y3QgaW14MDc0ICpwcml2OwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJaW50IHJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSU1YMDc0OiBtaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlpZiAoIWljbCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIklNWDA3NDogbWlzc2luZyBwbGF0Zm9ybSBkYXRhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDQ1LDEyICs0MzAsMTAgQEAKIAogCXY0bDJfaTJjX3N1YmRldl9pbml0KCZwcml2LT5zdWJkZXYsIGNsaWVudCwgJmlteDA3NF9zdWJkZXZfb3BzKTsKIAotCWljZC0+b3BzCT0gJmlteDA3NF9vcHM7CiAJcHJpdi0+Zm10CT0gJmlteDA3NF9jb2xvdXJfZm10c1swXTsKIAotCXJldCA9IGlteDA3NF92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJcmV0ID0gaW14MDc0X3ZpZGVvX3Byb2JlKGNsaWVudCk7CiAJaWYgKHJldCA8IDApIHsKLQkJaWNkLT5vcHMgPSBOVUxMOwogCQlrZnJlZShwcml2KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC00NjEsMTAgKzQ0NCw4IEBACiBzdGF0aWMgaW50IGlteDA3NF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgaW14MDc0ICpwcml2ID0gdG9faW14MDc0KGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAotCWljZC0+b3BzID0gTlVMTDsKIAlpZiAoaWNsLT5mcmVlX2J1cykKIAkJaWNsLT5mcmVlX2J1cyhpY2wpOwogCWtmcmVlKHByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L01ha2VmaWxlCmluZGV4IDI2Y2UwZDYuLjcxYWI3NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvTWFrZWZpbGUKQEAgLTcsOCArNyw4IEBACiBvYmotJChDT05GSUdfVklERU9fSVZUVikgKz0gaXZ0di5vCiBvYmotJChDT05GSUdfVklERU9fRkJfSVZUVikgKz0gaXZ0dmZiLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYwppbmRleCAwZmI3NTUyLi40MTEwOGE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMKQEAgLTExODAsNiArMTE4MCw4IEBACiAJCXNldHVwLmFkZHIgPSBBRERSX1VOU0VUOwogCQlzZXR1cC50eXBlID0gaXR2LT5vcHRpb25zLnR1bmVyOwogCQlzZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UVjsgIC8qIG1hdGNoZXMgVFYgdHVuZXJzICovCisJCWlmIChpdHYtPm9wdGlvbnMucmFkaW8gPiAwKQorCQkJc2V0dXAubW9kZV9tYXNrIHw9IFRfUkFESU87CiAJCXNldHVwLnR1bmVyX2NhbGxiYWNrID0gKHNldHVwLnR5cGUgPT0gVFVORVJfWEMyMDI4KSA/CiAJCQlpdnR2X3Jlc2V0X3R1bmVyX2dwaW8gOiBOVUxMOwogCQlpdnR2X2NhbGxfYWxsKGl0diwgdHVuZXIsIHNfdHlwZV9hZGRyLCAmc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKaW5kZXggM2U1YzA5MC4uZWNhZmE2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCkBAIC0xMjAzLDkgKzEyMDMsNyBAQAogCQkJCQljYXAtPnNlcnZpY2VfbGluZXNbZl1bbF0gPSBzZXQ7CiAJCQl9CiAJCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChjYXAtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVCkgeworCX0gZWxzZSBpZiAoY2FwLT50eXBlID09IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQpIHsKIAkJaWYgKCEoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1NMSUNFRF9WQklfT1VUUFVUKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoaXR2LT5pc182MGh6KSB7CkBAIC0xMjE1LDkgKzEyMTMsMTYgQEAKIAkJCWNhcC0+c2VydmljZV9saW5lc1swXVsyM10gPSBWNEwyX1NMSUNFRF9XU1NfNjI1OwogCQkJY2FwLT5zZXJ2aWNlX2xpbmVzWzBdWzE2XSA9IFY0TDJfU0xJQ0VEX1ZQUzsKIAkJfQotCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmV0dXJuIC1FSU5WQUw7CisKKwlzZXQgPSAwOworCWZvciAoZiA9IDA7IGYgPCAyOyBmKyspCisJCWZvciAobCA9IDA7IGwgPCAyNDsgbCsrKQorCQkJc2V0IHw9IGNhcC0+c2VydmljZV9saW5lc1tmXVtsXTsKKwljYXAtPnNlcnZpY2Vfc2V0ID0gc2V0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGl2dHZfZ19lbmNfaW5kZXgoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9lbmNfaWR4ICppZHgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYwppbmRleCBmYjhlNGE3Li4wNWFiMzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KQEAgLTkzNiw3ICs5MzcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIXBkYXRhLT5pcnEpIHsKKwlpZiAoIWNsaWVudC0+aXJxKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSW50ZXJydXB0IG5vdCBhc3NpZ25lZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTk3Myw3ICs5NzQsNyBAQAogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+aXJxX3dhaXRxKTsKIAlJTklUX1dPUksoJmluZm8tPndvcmtfaXJxLCBtNW1vbHNfaXJxX3dvcmspOwotCXJldCA9IHJlcXVlc3RfaXJxKHBkYXRhLT5pcnEsIG01bW9sc19pcnFfaGFuZGxlciwKKwlyZXQgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwgbTVtb2xzX2lycV9oYW5kbGVyLAogCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HLCBNT0RVTEVfTkFNRSwgc2QpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJbnRlcnJ1cHQgcmVxdWVzdCBmYWlsZWQ6ICVkXG4iLCByZXQpOwpAQCAtOTk4LDcgKzk5OSw3IEBACiAJc3RydWN0IG01bW9sc19pbmZvICppbmZvID0gdG9fbTVtb2xzKHNkKTsKIAogCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKLQlmcmVlX2lycShpbmZvLT5wZGF0YS0+aXJxLCBzZCk7CisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHNkKTsKIAogCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShzdXBwbGllcyksIHN1cHBsaWVzKTsKIAlncGlvX2ZyZWUoaW5mby0+cGRhdGEtPmdwaW9fcmVzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbWNhbS1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuYwppbmRleCA4M2MxNDUxLi44MGVjNjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuYwpAQCAtNDUwLDcgKzQ1MCw3IEBACiAJCWJ1ZiA9IGNhbS0+dmJfYnVmc1tmcmFtZSBeIDB4MV07CiAJCWNhbS0+dmJfYnVmc1tmcmFtZV0gPSBidWY7CiAJCW1jYW1fcmVnX3dyaXRlKGNhbSwgZnJhbWUgPT0gMCA/IFJFR19ZMEJBUiA6IFJFR19ZMUJBUiwKLQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcigmYnVmLT52Yl9idWYsIDApKTsKKwkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcigmYnVmLT52Yl9idWYsIDApKTsKIAkJc2V0X2JpdChDRl9TSU5HTEVfQlVGRkVSLCAmY2FtLT5mbGFncyk7CiAJCXNpbmdsZXMrKzsKIAkJcmV0dXJuOwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmY2FtLT5idWZmZXJzLCBzdHJ1Y3QgbWNhbV92Yl9idWZmZXIsIHF1ZXVlKTsKIAlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKIAltY2FtX3JlZ193cml0ZShjYW0sIGZyYW1lID09IDAgPyBSRUdfWTBCQVIgOiBSRUdfWTFCQVIsCi0JCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcigmYnVmLT52Yl9idWYsIDApKTsKKwkJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKCZidWYtPnZiX2J1ZiwgMCkpOwogCWNhbS0+dmJfYnVmc1tmcmFtZV0gPSBidWY7CiAJY2xlYXJfYml0KENGX1NJTkdMRV9CVUZGRVIsICZjYW0tPmZsYWdzKTsKIH0KQEAgLTg4Myw4ICs4ODMsOSBAQAogICogVmlkZW9idWYyIGludGVyZmFjZSBjb2RlLgogICovCiAKLXN0YXRpYyBpbnQgbWNhbV92Yl9xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpuYnVmcywKLQkJdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCitzdGF0aWMgaW50IG1jYW1fdmJfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsCisJCWNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LCB1bnNpZ25lZCBpbnQgKm5idWZzLAorCQl1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsIHVuc2lnbmVkIGludCBzaXplc1tdLAogCQl2b2lkICphbGxvY19jdHhzW10pCiB7CiAJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKQEAgLTk0MCwxMiArOTQxLDE0IEBACiAvKgogICogVGhlc2UgbmVlZCB0byBiZSBjYWxsZWQgd2l0aCB0aGUgbXV0ZXggaGVsZCBmcm9tIHZiMgogICovCi1zdGF0aWMgaW50IG1jYW1fdmJfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQorc3RhdGljIGludCBtY2FtX3ZiX3N0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CiAKLQlpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUpCisJaWYgKGNhbS0+c3RhdGUgIT0gU19JRExFKSB7CisJCUlOSVRfTElTVF9IRUFEKCZjYW0tPmJ1ZmZlcnMpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJY2FtLT5zZXF1ZW5jZSA9IDA7CiAJLyoKIAkgKiBWaWRlb2J1ZjIgc25lYWtpbHkgaG9hcmRzIGFsbCB0aGUgYnVmZmVycyBhbmQgd29uJ3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21tcC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21tcC1kcml2ZXIuYwppbmRleCBkNmI3NjQ1Li5mYjBiMTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tbXAtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbW1wLWRyaXZlci5jCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlICJtY2FtLWNvcmUuaCIKIAorTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTptbXAtY2FtZXJhIik7CiBNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21lbTJtZW1fdGVzdGRldi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tZW0ybWVtX3Rlc3RkZXYuYwppbmRleCAxNjZiZjkzLi4xMjg5N2U4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21lbTJtZW1fdGVzdGRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWVtMm1lbV90ZXN0ZGV2LmMKQEAgLTczOCw5ICs3MzgsMTAgQEAKICAqIFF1ZXVlIG9wZXJhdGlvbnMKICAqLwogCi1zdGF0aWMgaW50IG0ybXRlc3RfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsCi0JCQkJdW5zaWduZWQgaW50ICpucGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCi0JCQkJdm9pZCAqYWxsb2NfY3R4c1tdKQorc3RhdGljIGludCBtMm10ZXN0X3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLAorCQkJCWNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAorCQkJCXVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsIHVuc2lnbmVkIGludCAqbnBsYW5lcywKKwkJCQl1bnNpZ25lZCBpbnQgc2l6ZXNbXSwgdm9pZCAqYWxsb2NfY3R4c1tdKQogewogCXN0cnVjdCBtMm10ZXN0X2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CiAJc3RydWN0IG0ybXRlc3RfcV9kYXRhICpxX2RhdGE7CkBAIC03OTMsMTAgKzc5NCwyNCBAQAogCXY0bDJfbTJtX2J1Zl9xdWV1ZShjdHgtPm0ybV9jdHgsIHZiKTsKIH0KIAorc3RhdGljIHZvaWQgbTJtdGVzdF93YWl0X3ByZXBhcmUoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgbTJtdGVzdF9jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7CisJbTJtdGVzdF91bmxvY2soY3R4KTsKK30KKworc3RhdGljIHZvaWQgbTJtdGVzdF93YWl0X2ZpbmlzaChzdHJ1Y3QgdmIyX3F1ZXVlICpxKQoreworCXN0cnVjdCBtMm10ZXN0X2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdihxKTsKKwltMm10ZXN0X2xvY2soY3R4KTsKK30KKwogc3RhdGljIHN0cnVjdCB2YjJfb3BzIG0ybXRlc3RfcW9wcyA9IHsKIAkucXVldWVfc2V0dXAJID0gbTJtdGVzdF9xdWV1ZV9zZXR1cCwKIAkuYnVmX3ByZXBhcmUJID0gbTJtdGVzdF9idWZfcHJlcGFyZSwKIAkuYnVmX3F1ZXVlCSA9IG0ybXRlc3RfYnVmX3F1ZXVlLAorCS53YWl0X3ByZXBhcmUJID0gbTJtdGVzdF93YWl0X3ByZXBhcmUsCisJLndhaXRfZmluaXNoCSA9IG0ybXRlc3Rfd2FpdF9maW5pc2gsCiB9OwogCiBzdGF0aWMgaW50IHF1ZXVlX2luaXQodm9pZCAqcHJpdiwgc3RydWN0IHZiMl9xdWV1ZSAqc3JjX3ZxLCBzdHJ1Y3QgdmIyX3F1ZXVlICpkc3RfdnEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKaW5kZXggYzQzYzgxZi4uZDBmNTM4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYwpAQCAtNDI2LDYgKzQyNiwyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1zcF9xdWVyeXN0ZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCAqaWQpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJKmlkICY9IHN0YXRlLT5kZXRlY3RlZF9zdGQ7CisKKwl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LAorCQkiZGV0ZWN0ZWQgc3RhbmRhcmQ6ICVzKDB4JTA4THgpXG4iLAorCQltc3Bfc3RhbmRhcmRfc3RkX25hbWUoc3RhdGUtPnN0ZCksIHN0YXRlLT5kZXRlY3RlZF9zdGQpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbXNwX3Nfc3RkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIGlkKQogewogCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwpAQCAtNjE2LDYgKzYzMCwxMCBAQAogCS5zX3N0ZCA9IG1zcF9zX3N0ZCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG1zcF92aWRlb19vcHMgPSB7CisJLnF1ZXJ5c3RkID0gbXNwX3F1ZXJ5c3RkLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl90dW5lcl9vcHMgbXNwX3R1bmVyX29wcyA9IHsKIAkuc19mcmVxdWVuY3kgPSBtc3Bfc19mcmVxdWVuY3ksCiAJLmdfdHVuZXIgPSBtc3BfZ190dW5lciwKQEAgLTYzMCw2ICs2NDgsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtc3Bfb3BzID0gewogCS5jb3JlID0gJm1zcF9jb3JlX29wcywKKwkudmlkZW8gPSAmbXNwX3ZpZGVvX29wcywKIAkudHVuZXIgPSAmbXNwX3R1bmVyX29wcywKIAkuYXVkaW8gPSAmbXNwX2F1ZGlvX29wcywKIH07CkBAIC02NjQsNiArNjgzLDcgQEAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmbXNwX29wcyk7CiAKIAlzdGF0ZS0+djRsMl9zdGQgPSBWNEwyX1NURF9OVFNDOworCXN0YXRlLT5kZXRlY3RlZF9zdGQgPSBWNEwyX1NURF9BTEw7CiAJc3RhdGUtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwogCXN0YXRlLT5pbnB1dCA9IC0xOwogCXN0YXRlLT5pMnNfbW9kZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmgKaW5kZXggMzJhNDc4ZS4uODMxZThkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuaApAQCAtNzUsNyArNzUsNyBAQAogCWludCBvcG1vZGU7CiAJaW50IHN0ZDsKIAlpbnQgbW9kZTsKLQl2NGwyX3N0ZF9pZCB2NGwyX3N0ZDsKKwl2NGwyX3N0ZF9pZCB2NGwyX3N0ZCwgZGV0ZWN0ZWRfc3RkOwogCWludCBuaWNhbV9vbjsKIAlpbnQgYWNiOwogCWludCBpbl9zY2FydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMKaW5kZXggODAzODdlMi4uZjhiNTE3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMKQEAgLTM3LDI5ICszNyw0OSBAQAogCWludCByZXR2YWw7CiAJaW50IG1haW4sIHNlY29uZDsKIAljaGFyICpuYW1lOworCXY0bDJfc3RkX2lkIHN0ZDsKIH0gbXNwX3N0ZGxpc3RbXSA9IHsKLQl7IDB4MDAwMCwgMCwgMCwgImNvdWxkIG5vdCBkZXRlY3Qgc291bmQgc3RhbmRhcmQiIH0sCi0JeyAweDAwMDEsIDAsIDAsICJhdXRvZGV0ZWN0IHN0YXJ0IiB9LAotCXsgMHgwMDAyLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjcyKSwgIjQuNS80LjcyICBNIER1YWwgRk0tU3RlcmVvIiB9LAotCXsgMHgwMDAzLCBNU1BfQ0FSUklFUig1LjUpLCBNU1BfQ0FSUklFUig1Ljc0MjE4NzUpLCAiNS41LzUuNzQgIEIvRyBEdWFsIEZNLVN0ZXJlbyIgfSwKLQl7IDB4MDAwNCwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi4yNTc4MTI1KSwgIjYuNS82LjI1ICBEL0sxIER1YWwgRk0tU3RlcmVvIiB9LAotCXsgMHgwMDA1LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2Ljc0MjE4NzUpLCAiNi41LzYuNzQgIEQvSzIgRHVhbCBGTS1TdGVyZW8iIH0sCi0JeyAweDAwMDYsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNSksICI2LjUgIEQvSyBGTS1Nb25vIChIREVWMykiIH0sCi0JeyAweDAwMDcsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuNzQyMTg3NSksICI2LjUvNS43NCAgRC9LMyBEdWFsIEZNLVN0ZXJlbyIgfSwKLQl7IDB4MDAwOCwgTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS44NSksICI1LjUvNS44NSAgQi9HIE5JQ0FNIEZNIiB9LAotCXsgMHgwMDA5LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwgIjYuNS81Ljg1ICBMIE5JQ0FNIEFNIiB9LAotCXsgMHgwMDBhLCBNU1BfQ0FSUklFUig2LjApLCBNU1BfQ0FSUklFUig2LjU1KSwgIjYuMC82LjU1ICBJIE5JQ0FNIEZNIiB9LAotCXsgMHgwMDBiLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwgIjYuNS81Ljg1ICBEL0sgTklDQU0gRk0iIH0sCi0JeyAweDAwMGMsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuODUpLCAiNi41LzUuODUgIEQvSyBOSUNBTSBGTSAoSERFVjIpIiB9LAotCXsgMHgwMDBkLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwgIjYuNS81Ljg1ICBEL0sgTklDQU0gRk0gKEhERVYzKSIgfSwKLQl7IDB4MDAyMCwgTVNQX0NBUlJJRVIoNC41KSwgTVNQX0NBUlJJRVIoNC41KSwgIjQuNSAgTSBCVFNDLVN0ZXJlbyIgfSwKLQl7IDB4MDAyMSwgTVNQX0NBUlJJRVIoNC41KSwgTVNQX0NBUlJJRVIoNC41KSwgIjQuNSAgTSBCVFNDLU1vbm8gKyBTQVAiIH0sCi0JeyAweDAwMzAsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNSksICI0LjUgIE0gRUlBLUogSmFwYW4gU3RlcmVvIiB9LAotCXsgMHgwMDQwLCBNU1BfQ0FSUklFUigxMC43KSwgTVNQX0NBUlJJRVIoMTAuNyksICIxMC43ICBGTS1TdGVyZW8gUmFkaW8iIH0sCi0JeyAweDAwNTAsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNSksICI2LjUgIFNBVC1Nb25vIiB9LAotCXsgMHgwMDUxLCBNU1BfQ0FSUklFUig3LjAyKSwgTVNQX0NBUlJJRVIoNy4yMCksICI3LjAyLzcuMjAgIFNBVC1TdGVyZW8iIH0sCi0JeyAweDAwNjAsIE1TUF9DQVJSSUVSKDcuMiksIE1TUF9DQVJSSUVSKDcuMiksICI3LjIgIFNBVCBBRFIiIH0sCi0JeyAgICAgLTEsIDAsIDAsIE5VTEwgfSwgLyogRU9GICovCisJeyAweDAwMDAsIDAsIDAsICJjb3VsZCBub3QgZGV0ZWN0IHNvdW5kIHN0YW5kYXJkIiwgVjRMMl9TVERfQUxMIH0sCisJeyAweDAwMDEsIDAsIDAsICJhdXRvZGV0ZWN0IHN0YXJ0IiwgVjRMMl9TVERfQUxMIH0sCisJeyAweDAwMDIsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNzIpLAorCSAgIjQuNS80LjcyICBNIER1YWwgRk0tU3RlcmVvIiwgVjRMMl9TVERfTU4gfSwKKwl7IDB4MDAwMywgTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS43NDIxODc1KSwKKwkgICI1LjUvNS43NCAgQi9HIER1YWwgRk0tU3RlcmVvIiwgVjRMMl9TVERfQkcgfSwKKwl7IDB4MDAwNCwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi4yNTc4MTI1KSwKKwkgICI2LjUvNi4yNSAgRC9LMSBEdWFsIEZNLVN0ZXJlbyIsIFY0TDJfU1REX0RLIH0sCisJeyAweDAwMDUsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuNzQyMTg3NSksCisJICAiNi41LzYuNzQgIEQvSzIgRHVhbCBGTS1TdGVyZW8iLCBWNEwyX1NURF9ESyB9LAorCXsgMHgwMDA2LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2LjUpLAorCSAgIjYuNSAgRC9LIEZNLU1vbm8gKEhERVYzKSIsIFY0TDJfU1REX0RLIH0sCisJeyAweDAwMDcsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuNzQyMTg3NSksCisJICAiNi41LzUuNzQgIEQvSzMgRHVhbCBGTS1TdGVyZW8iLCBWNEwyX1NURF9ESyB9LAorCXsgMHgwMDA4LCBNU1BfQ0FSUklFUig1LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwKKwkgICI1LjUvNS44NSAgQi9HIE5JQ0FNIEZNIiwgVjRMMl9TVERfQkcgfSwKKwl7IDB4MDAwOSwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNS44NSksCisJICAiNi41LzUuODUgIEwgTklDQU0gQU0iLCBWNEwyX1NURF9MIH0sCisJeyAweDAwMGEsIE1TUF9DQVJSSUVSKDYuMCksIE1TUF9DQVJSSUVSKDYuNTUpLAorCSAgIjYuMC82LjU1ICBJIE5JQ0FNIEZNIiwgVjRMMl9TVERfUEFMX0kgfSwKKwl7IDB4MDAwYiwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNS44NSksCisJICAiNi41LzUuODUgIEQvSyBOSUNBTSBGTSIsIFY0TDJfU1REX0RLIH0sCisJeyAweDAwMGMsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuODUpLAorCSAgIjYuNS81Ljg1ICBEL0sgTklDQU0gRk0gKEhERVYyKSIsIFY0TDJfU1REX0RLIH0sCisJeyAweDAwMGQsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuODUpLAorCSAgIjYuNS81Ljg1ICBEL0sgTklDQU0gRk0gKEhERVYzKSIsIFY0TDJfU1REX0RLIH0sCisJeyAweDAwMjAsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNSksCisJICAiNC41ICBNIEJUU0MtU3RlcmVvIiwgVjRMMl9TVERfTVRTIH0sCisJeyAweDAwMjEsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNSksCisJICAiNC41ICBNIEJUU0MtTW9ubyArIFNBUCIsIFY0TDJfU1REX01UUyB9LAorCXsgMHgwMDMwLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjUpLAorCSAgIjQuNSAgTSBFSUEtSiBKYXBhbiBTdGVyZW8iLCBWNEwyX1NURF9OVFNDX01fSlAgfSwKKwl7IDB4MDA0MCwgTVNQX0NBUlJJRVIoMTAuNyksIE1TUF9DQVJSSUVSKDEwLjcpLAorCSAgIjEwLjcgIEZNLVN0ZXJlbyBSYWRpbyIsIFY0TDJfU1REX0FMTCB9LAorCXsgMHgwMDUwLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2LjUpLAorCSAgIjYuNSAgU0FULU1vbm8iLCBWNEwyX1NURF9BTEwgfSwKKwl7IDB4MDA1MSwgTVNQX0NBUlJJRVIoNy4wMiksIE1TUF9DQVJSSUVSKDcuMjApLAorCSAgIjcuMDIvNy4yMCAgU0FULVN0ZXJlbyIsIFY0TDJfU1REX0FMTCB9LAorCXsgMHgwMDYwLCBNU1BfQ0FSUklFUig3LjIpLCBNU1BfQ0FSUklFUig3LjIpLAorCSAgIjcuMiAgU0FUIEFEUiIsIFY0TDJfU1REX0FMTCB9LAorCXsgICAgIC0xLCAwLCAwLCBOVUxMLCAwIH0sIC8qIEVPRiAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBtc3AzNDAwY19pbml0X2RhdGFfZGVtIHsKQEAgLTE1Niw2ICsxNzYsMTYgQEAKIAlyZXR1cm4gInVua25vd24iOwogfQogCitzdGF0aWMgdjRsMl9zdGRfaWQgbXNwX3N0YW5kYXJkX3N0ZChpbnQgc3RkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgbXNwX3N0ZGxpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJCWlmIChtc3Bfc3RkbGlzdFtpXS5yZXR2YWwgPT0gc3RkKQorCQkJcmV0dXJuIG1zcF9zdGRsaXN0W2ldLnN0ZDsKKwlyZXR1cm4gVjRMMl9TVERfQUxMOworfQorCiBzdGF0aWMgdm9pZCBtc3Bfc2V0X3NvdXJjZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgc3JjKQogewogCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwpAQCAtNDc5LDYgKzUwOSw3IEBACiAJaW50IGNvdW50LCBtYXgxLCBtYXgyLCB2YWwxLCB2YWwyLCB2YWwsIGk7CiAKIAl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQwMCBkYWVtb24gc3RhcnRlZFxuIik7CisJc3RhdGUtPmRldGVjdGVkX3N0ZCA9IFY0TDJfU1REX0FMTDsKIAlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQwMCB0aHJlYWQ6IHNsZWVwXG4iKTsKQEAgLTU3OSw2ICs2MTAsNyBAQAogCQlzdGF0ZS0+bWFpbiA9IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0X21haW5bbWF4MV0uY2RvOwogCQlzd2l0Y2ggKG1heDEpIHsKIAkJY2FzZSAxOiAvKiA1LjUgKi8KKwkJCXN0YXRlLT5kZXRlY3RlZF9zdGQgPSBWNEwyX1NURF9CRyB8IFY0TDJfU1REX1BBTF9IOwogCQkJaWYgKG1heDIgPT0gMCkgewogCQkJCS8qIEIvRyBGTS1zdGVyZW8gKi8KIAkJCQlzdGF0ZS0+c2Vjb25kID0gbXNwMzQwMGNfY2Fycmllcl9kZXRlY3RfNTVbbWF4Ml0uY2RvOwpAQCAtNTk2LDYgKzYyOCw3IEBACiAJCQlicmVhazsKIAkJY2FzZSAyOiAvKiA2LjAgKi8KIAkJCS8qIFBBTCBJIE5JQ0FNICovCisJCQlzdGF0ZS0+ZGV0ZWN0ZWRfc3RkID0gVjRMMl9TVERfUEFMX0k7CiAJCQlzdGF0ZS0+c2Vjb25kID0gTVNQX0NBUlJJRVIoNi41NTIpOwogCQkJbXNwMzQwMGNfc2V0X21vZGUoY2xpZW50LCBNU1BfTU9ERV9GTV9OSUNBTTIpOwogCQkJc3RhdGUtPm5pY2FtX29uID0gMTsKQEAgLTYwNywyMiArNjQwLDI2IEBACiAJCQkJc3RhdGUtPnNlY29uZCA9IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0XzY1W21heDJdLmNkbzsKIAkJCQltc3AzNDAwY19zZXRfbW9kZShjbGllbnQsIE1TUF9NT0RFX0ZNX1RFUlJBKTsKIAkJCQlzdGF0ZS0+d2F0Y2hfc3RlcmVvID0gMTsKKwkJCQlzdGF0ZS0+ZGV0ZWN0ZWRfc3RkID0gVjRMMl9TVERfREs7CiAJCQl9IGVsc2UgaWYgKG1heDIgPT0gMCAmJiAoc3RhdGUtPnY0bDJfc3RkICYgVjRMMl9TVERfU0VDQU0pKSB7CiAJCQkJLyogTCBOSUNBTSBvciBBTS1tb25vICovCiAJCQkJc3RhdGUtPnNlY29uZCA9IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0XzY1W21heDJdLmNkbzsKIAkJCQltc3AzNDAwY19zZXRfbW9kZShjbGllbnQsIE1TUF9NT0RFX0FNX05JQ0FNKTsKIAkJCQlzdGF0ZS0+d2F0Y2hfc3RlcmVvID0gMTsKKwkJCQlzdGF0ZS0+ZGV0ZWN0ZWRfc3RkID0gVjRMMl9TVERfTDsKIAkJCX0gZWxzZSBpZiAobWF4MiA9PSAwICYmIHN0YXRlLT5oYXNfbmljYW0pIHsKIAkJCQkvKiBEL0sgTklDQU0gKi8KIAkJCQlzdGF0ZS0+c2Vjb25kID0gbXNwMzQwMGNfY2Fycmllcl9kZXRlY3RfNjVbbWF4Ml0uY2RvOwogCQkJCW1zcDM0MDBjX3NldF9tb2RlKGNsaWVudCwgTVNQX01PREVfRk1fTklDQU0xKTsKIAkJCQlzdGF0ZS0+bmljYW1fb24gPSAxOwogCQkJCXN0YXRlLT53YXRjaF9zdGVyZW8gPSAxOworCQkJCXN0YXRlLT5kZXRlY3RlZF9zdGQgPSBWNEwyX1NURF9ESzsKIAkJCX0gZWxzZSB7CiAJCQkJZ290byBub19zZWNvbmQ7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAwOiAvKiA0LjUgKi8KKwkJCXN0YXRlLT5kZXRlY3RlZF9zdGQgPSBWNEwyX1NURF9NTjsKIAkJZGVmYXVsdDoKIG5vX3NlY29uZDoKIAkJCXN0YXRlLT5zZWNvbmQgPSBtc3AzNDAwY19jYXJyaWVyX2RldGVjdF9tYWluW21heDFdLmNkbzsKQEAgLTY2Miw2ICs2OTksNyBAQAogCWludCB2YWwsIGksIHN0ZCwgY291bnQ7CiAKIAl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQxMCBkYWVtb24gc3RhcnRlZFxuIik7CisJc3RhdGUtPmRldGVjdGVkX3N0ZCA9IFY0TDJfU1REX0FMTDsKIAlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQxMCB0aHJlYWQ6IHNsZWVwXG4iKTsKQEAgLTc0Myw2ICs3ODEsOCBAQAogCQkJCQltc3Bfc3RkbGlzdFs4XS5uYW1lIDogInVua25vd24iLCB2YWwpOwogCQkJc3RhdGUtPnN0ZCA9IHZhbCA9IDB4MDAwOTsKIAkJCW1zcF93cml0ZV9kZW0oY2xpZW50LCAweDIwLCB2YWwpOworCQl9IGVsc2UgeworCQkJc3RhdGUtPmRldGVjdGVkX3N0ZCA9IG1zcF9zdGFuZGFyZF9zdGQoc3RhdGUtPnN0ZCk7CiAJCX0KIAogCQkvKiBzZXQgc3RlcmVvICovCkBAIC05NTcsNiArOTk3LDcgQEAKIAlpbnQgdmFsLCBpOwogCiAJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0eHhnIGRhZW1vbiBzdGFydGVkXG4iKTsKKwlzdGF0ZS0+ZGV0ZWN0ZWRfc3RkID0gVjRMMl9TVERfQUxMOwogCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNHh4ZyB0aHJlYWQ6IHNsZWVwXG4iKTsKQEAgLTEwMTMsNiArMTA1NCw3IEBACiAJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsCiAJCQkiZGV0ZWN0ZWQgc3RhbmRhcmQ6ICVzICgweCUwNHgpXG4iLAogCQkJbXNwX3N0YW5kYXJkX3N0ZF9uYW1lKHN0YXRlLT5zdGQpLCBzdGF0ZS0+c3RkKTsKKwkJc3RhdGUtPmRldGVjdGVkX3N0ZCA9IG1zcF9zdGFuZGFyZF9zdGQoc3RhdGUtPnN0ZCk7CiAKIAkJaWYgKHN0YXRlLT5zdGQgPT0gOSkgewogCQkJLyogQU0gTklDQU0gbW9kZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0wMDEuYwppbmRleCA0ZGE5Y2NhLi5lMmIxMDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0wMDEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0wMDEuYwpAQCAtMTIsMTAgKzEyLDEzIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAorI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CiAKIC8qCiAgKiBtdDltMDAxIGkyYyBhZGRyZXNzIDB4NWQKQEAgLTg0LDE1ICs4NywxOSBAQAogCiBzdHJ1Y3QgbXQ5bTAwMSB7CiAJc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgaGRsOworCXN0cnVjdCB7CisJCS8qIGV4cG9zdXJlL2F1dG8tZXhwb3N1cmUgY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsICphdXRvZXhwb3N1cmU7CisJCXN0cnVjdCB2NGwyX2N0cmwgKmV4cG9zdXJlOworCX07CiAJc3RydWN0IHY0bDJfcmVjdCByZWN0OwkvKiBTZW5zb3Igd2luZG93ICovCiAJY29uc3Qgc3RydWN0IG10OW0wMDFfZGF0YWZtdCAqZm10OwogCWNvbnN0IHN0cnVjdCBtdDltMDAxX2RhdGFmbXQgKmZtdHM7CiAJaW50IG51bV9mbXRzOwogCWludCBtb2RlbDsJLyogVjRMMl9JREVOVF9NVDlNMDAxKiBjb2RlcyBmcm9tIHY0bDItY2hpcC1pZGVudC5oICovCi0JdW5zaWduZWQgaW50IGdhaW47Ci0JdW5zaWduZWQgaW50IGV4cG9zdXJlOworCXVuc2lnbmVkIGludCB0b3RhbF9oOwogCXVuc2lnbmVkIHNob3J0IHlfc2tpcF90b3A7CS8qIExpbmVzIHRvIHNraXAgYXQgdGhlIHRvcCAqLwotCXVuc2lnbmVkIGNoYXIgYXV0b2V4cG9zdXJlOwogfTsKIAogc3RhdGljIHN0cnVjdCBtdDltMDAxICp0b19tdDltMDAxKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC0xNjUsNTQgKzE3MiwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG10OW0wMDFfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQl1bnNpZ25lZCBsb25nIHdpZHRoX2ZsYWcgPSBmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF9NQVNLOwotCi0JLyogT25seSBvbmUgd2lkdGggYml0IG1heSBiZSBzZXQgKi8KLQlpZiAoIWlzX3Bvd2VyX29mXzIod2lkdGhfZmxhZykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGljbC0+c2V0X2J1c19wYXJhbSkKLQkJcmV0dXJuIGljbC0+c2V0X2J1c19wYXJhbShpY2wsIHdpZHRoX2ZsYWcpOwotCi0JLyoKLQkgKiBXaXRob3V0IGJvYXJkIHNwZWNpZmljIGJ1cyB3aWR0aCBzZXR0aW5ncyB3ZSBvbmx5IHN1cHBvcnQgdGhlCi0JICogc2Vuc29ycyBuYXRpdmUgYnVzIHdpZHRoCi0JICovCi0JaWYgKHdpZHRoX2ZsYWcgPT0gU09DQU1fREFUQVdJRFRIXzEwKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtdDltMDAxX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQkvKiBNVDlNMDAxIGhhcyBhbGwgY2FwdHVyZV9mb3JtYXQgcGFyYW1ldGVycyBmaXhlZCAqLwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0ggfCBTT0NBTV9NQVNURVI7Ci0KLQlpZiAoaWNsLT5xdWVyeV9idXNfcGFyYW0pCi0JCWZsYWdzIHw9IGljbC0+cXVlcnlfYnVzX3BhcmFtKGljbCkgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSzsKLQllbHNlCi0JCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF8xMDsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLX0KLQogc3RhdGljIGludCBtdDltMDAxX3NfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlzdHJ1Y3QgbXQ5bTAwMSAqbXQ5bTAwMSA9IHRvX210OW0wMDEoY2xpZW50KTsKIAlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3QgPSBhLT5jOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpbnQgcmV0OwogCWNvbnN0IHUxNiBoYmxhbmsgPSA5LCB2YmxhbmsgPSAyNTsKLQl1bnNpZ25lZCBpbnQgdG90YWxfaDsKIAogCWlmIChtdDltMDAxLT5mbXRzID09IG10OW0wMDFfY29sb3VyX2ZtdHMpCiAJCS8qCkBAIC0yMzEsNyArMTk3LDcgQEAKIAlzb2NfY2FtZXJhX2xpbWl0X3NpZGUoJnJlY3QudG9wLCAmcmVjdC5oZWlnaHQsCiAJCSAgICAgTVQ5TTAwMV9ST1dfU0tJUCwgTVQ5TTAwMV9NSU5fSEVJR0hULCBNVDlNMDAxX01BWF9IRUlHSFQpOwogCi0JdG90YWxfaCA9IHJlY3QuaGVpZ2h0ICsgbXQ5bTAwMS0+eV9za2lwX3RvcCArIHZibGFuazsKKwltdDltMDAxLT50b3RhbF9oID0gcmVjdC5oZWlnaHQgKyBtdDltMDAxLT55X3NraXBfdG9wICsgdmJsYW5rOwogCiAJLyogQmxhbmtpbmcgYW5kIHN0YXJ0IHZhbHVlcyAtIGRlZmF1bHQuLi4gKi8KIAlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlNMDAxX0hPUklaT05UQUxfQkxBTktJTkcsIGhibGFuayk7CkBAIC0yNDAsNyArMjA2LDcgQEAKIAogCS8qCiAJICogVGhlIGNhbGxlciBwcm92aWRlcyBhIHN1cHBvcnRlZCBmb3JtYXQsIGFzIHZlcmlmaWVkIHBlcgotCSAqIGNhbGwgdG8gaWNkLT50cnlfZm10KCkKKwkgKiBjYWxsIHRvIC50cnlfbWJ1c19mbXQoKQogCSAqLwogCWlmICghcmV0KQogCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlNMDAxX0NPTFVNTl9TVEFSVCwgcmVjdC5sZWZ0KTsKQEAgLTI1MSwxNyArMjE3LDggQEAKIAlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5TTAwMV9XSU5ET1dfSEVJR0hULAogCQkJCXJlY3QuaGVpZ2h0ICsgbXQ5bTAwMS0+eV9za2lwX3RvcCAtIDEpOwotCWlmICghcmV0ICYmIG10OW0wMDEtPmF1dG9leHBvc3VyZSkgewotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlNMDAxX1NIVVRURVJfV0lEVEgsIHRvdGFsX2gpOwotCQlpZiAoIXJldCkgewotCQkJY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCA9Ci0JCQkJc29jX2NhbWVyYV9maW5kX3FjdHJsKGljZC0+b3BzLAotCQkJCQkJICAgICAgVjRMMl9DSURfRVhQT1NVUkUpOwotCQkJbXQ5bTAwMS0+ZXhwb3N1cmUgPSAoNTI0ICsgKHRvdGFsX2ggLSAxKSAqCi0JCQkJIChxY3RybC0+bWF4aW11bSAtIHFjdHJsLT5taW5pbXVtKSkgLwotCQkJCTEwNDggKyBxY3RybC0+bWluaW11bTsKLQkJfQotCX0KKwlpZiAoIXJldCAmJiB2NGwyX2N0cmxfZ19jdHJsKG10OW0wMDEtPmF1dG9leHBvc3VyZSkgPT0gVjRMMl9FWFBPU1VSRV9BVVRPKQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlNMDAxX1NIVVRURVJfV0lEVEgsIG10OW0wMDEtPnRvdGFsX2gpOwogCiAJaWYgKCFyZXQpCiAJCW10OW0wMDEtPnJlY3QgPSByZWN0OwpAQCAtNDIxLDEwNyArMzc4LDQ4IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBtdDltMDAxX2NvbnRyb2xzW10gPSB7Ci0JewotCQkuaWQJCT0gVjRMMl9DSURfVkZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJGbGlwIFZlcnRpY2FsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0dBSU4sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJHYWluIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEyNywKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSA2NCwKLQkJLmZsYWdzCQk9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUiwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9FWFBPU1VSRSwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkV4cG9zdXJlIiwKLQkJLm1pbmltdW0JPSAxLAotCQkubWF4aW11bQk9IDI1NSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAyNTUsCi0JCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19TTElERVIsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkVfQVVUTywKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkF1dG9tYXRpYyBFeHBvc3VyZSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBtdDltMDAxX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSBtdDltMDAxX3NldF9idXNfcGFyYW0sCi0JLnF1ZXJ5X2J1c19wYXJhbQk9IG10OW0wMDFfcXVlcnlfYnVzX3BhcmFtLAotCS5jb250cm9scwkJPSBtdDltMDAxX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtdDltMDAxX2NvbnRyb2xzKSwKLX07Ci0KLXN0YXRpYyBpbnQgbXQ5bTAwMV9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgbXQ5bTAwMV9nX3ZvbGF0aWxlX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0wMDEgKm10OW0wMDEgPSB0b19tdDltMDAxKGNsaWVudCk7Ci0JaW50IGRhdGE7CisJc3RydWN0IG10OW0wMDEgKm10OW0wMDEgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwKKwkJCQkJICAgICAgIHN0cnVjdCBtdDltMDAxLCBoZGwpOworCXMzMiBtaW4sIG1heDsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBNVDlNMDAxX1JFQURfT1BUSU9OUzIpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSAhIShkYXRhICYgMHg4MDAwKTsKLQkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgotCQljdHJsLT52YWx1ZSA9IG10OW0wMDEtPmF1dG9leHBvc3VyZTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgotCQljdHJsLT52YWx1ZSA9IG10OW0wMDEtPmdhaW47Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCWN0cmwtPnZhbHVlID0gbXQ5bTAwMS0+ZXhwb3N1cmU7CisJCW1pbiA9IG10OW0wMDEtPmV4cG9zdXJlLT5taW5pbXVtOworCQltYXggPSBtdDltMDAxLT5leHBvc3VyZS0+bWF4aW11bTsKKwkJbXQ5bTAwMS0+ZXhwb3N1cmUtPnZhbCA9CisJCQkoNTI0ICsgKG10OW0wMDEtPnRvdGFsX2ggLSAxKSAqIChtYXggLSBtaW4pKSAvIDEwNDggKyBtaW47CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdDltMDAxX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCBtdDltMDAxX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogeworCXN0cnVjdCBtdDltMDAxICptdDltMDAxID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsCisJCQkJCSAgICAgICBzdHJ1Y3QgbXQ5bTAwMSwgaGRsKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJm10OW0wMDEtPnN1YmRldjsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0wMDEgKm10OW0wMDEgPSB0b19tdDltMDAxKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmw7CisJc3RydWN0IHY0bDJfY3RybCAqZXhwID0gbXQ5bTAwMS0+ZXhwb3N1cmU7CiAJaW50IGRhdGE7CiAKLQlxY3RybCA9IHNvY19jYW1lcmFfZmluZF9xY3RybCgmbXQ5bTAwMV9vcHMsIGN0cmwtPmlkKTsKLQotCWlmICghcWN0cmwpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWlmIChjdHJsLT52YWx1ZSkKKwkJaWYgKGN0cmwtPnZhbCkKIAkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgTVQ5TTAwMV9SRUFEX09QVElPTlMyLCAweDgwMDApOwogCQllbHNlCiAJCQlkYXRhID0gcmVnX2NsZWFyKGNsaWVudCwgTVQ5TTAwMV9SRUFEX09QVElPTlMyLCAweDgwMDApOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7CisJCXJldHVybiAwOworCiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoY3RybC0+dmFsdWUgPiBxY3RybC0+bWF4aW11bSB8fCBjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtKQotCQkJcmV0dXJuIC1FSU5WQUw7CiAJCS8qIFNlZSBEYXRhc2hlZXQgVGFibGUgNywgR2FpbiBzZXR0aW5ncy4gKi8KLQkJaWYgKGN0cmwtPnZhbHVlIDw9IHFjdHJsLT5kZWZhdWx0X3ZhbHVlKSB7CisJCWlmIChjdHJsLT52YWwgPD0gY3RybC0+ZGVmYXVsdF92YWx1ZSkgewogCQkJLyogUGFjayBpdCBpbnRvIDAuLjEgc3RlcCAwLjEyNSwgcmVnaXN0ZXIgdmFsdWVzIDAuLjggKi8KLQkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBxY3RybC0+ZGVmYXVsdF92YWx1ZSAtIHFjdHJsLT5taW5pbXVtOwotCQkJZGF0YSA9ICgoY3RybC0+dmFsdWUgLSBxY3RybC0+bWluaW11bSkgKiA4ICsgcmFuZ2UgLyAyKSAvIHJhbmdlOworCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IGN0cmwtPmRlZmF1bHRfdmFsdWUgLSBjdHJsLT5taW5pbXVtOworCQkJZGF0YSA9ICgoY3RybC0+dmFsIC0gY3RybC0+bWluaW11bSkgKiA4ICsgcmFuZ2UgLyAyKSAvIHJhbmdlOwogCiAJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlNldHRpbmcgZ2FpbiAlZFxuIiwgZGF0YSk7CiAJCQlkYXRhID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5TTAwMV9HTE9CQUxfR0FJTiwgZGF0YSk7CkBAIC01MzAsOCArNDI4LDggQEAKIAkJfSBlbHNlIHsKIAkJCS8qIFBhY2sgaXQgaW50byAxLjEyNS4uMTUgdmFyaWFibGUgc3RlcCwgcmVnaXN0ZXIgdmFsdWVzIDkuLjY3ICovCiAJCQkvKiBXZSBhc3N1bWUgcWN0cmwtPm1heGltdW0gLSBxY3RybC0+ZGVmYXVsdF92YWx1ZSAtIDEgPiAwICovCi0JCQl1bnNpZ25lZCBsb25nIHJhbmdlID0gcWN0cmwtPm1heGltdW0gLSBxY3RybC0+ZGVmYXVsdF92YWx1ZSAtIDE7Ci0JCQl1bnNpZ25lZCBsb25nIGdhaW4gPSAoKGN0cmwtPnZhbHVlIC0gcWN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxKSAqCisJCQl1bnNpZ25lZCBsb25nIHJhbmdlID0gY3RybC0+bWF4aW11bSAtIGN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxOworCQkJdW5zaWduZWQgbG9uZyBnYWluID0gKChjdHJsLT52YWwgLSBjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gMSkgKgogCQkJCQkgICAgICAgMTExICsgcmFuZ2UgLyAyKSAvIHJhbmdlICsgOTsKIAogCQkJaWYgKGdhaW4gPD0gMzIpCkBAIC01NDcsNjYgKzQ0NSw0NCBAQAogCQkJaWYgKGRhdGEgPCAwKQogCQkJCXJldHVybiAtRUlPOwogCQl9CisJCXJldHVybiAwOwogCi0JCS8qIFN1Y2Nlc3MgKi8KLQkJbXQ5bTAwMS0+Z2FpbiA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQkvKiBtdDltMDAxIGhhcyBtYXhpbXVtID09IGRlZmF1bHQgKi8KLQkJaWYgKGN0cmwtPnZhbHVlID4gcWN0cmwtPm1heGltdW0gfHwgY3RybC0+dmFsdWUgPCBxY3RybC0+bWluaW11bSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQllbHNlIHsKLQkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBxY3RybC0+bWF4aW11bSAtIHFjdHJsLT5taW5pbXVtOwotCQkJdW5zaWduZWQgbG9uZyBzaHV0dGVyID0gKChjdHJsLT52YWx1ZSAtIHFjdHJsLT5taW5pbXVtKSAqIDEwNDggKworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKKwkJaWYgKGN0cmwtPnZhbCA9PSBWNEwyX0VYUE9TVVJFX01BTlVBTCkgeworCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IGV4cC0+bWF4aW11bSAtIGV4cC0+bWluaW11bTsKKwkJCXVuc2lnbmVkIGxvbmcgc2h1dHRlciA9ICgoZXhwLT52YWwgLSBleHAtPm1pbmltdW0pICogMTA0OCArCiAJCQkJCQkgcmFuZ2UgLyAyKSAvIHJhbmdlICsgMTsKIAogCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsCiAJCQkJIlNldHRpbmcgc2h1dHRlciB3aWR0aCBmcm9tICVkIHRvICVsdVxuIiwKLQkJCQlyZWdfcmVhZChjbGllbnQsIE1UOU0wMDFfU0hVVFRFUl9XSURUSCksCi0JCQkJc2h1dHRlcik7CisJCQkJcmVnX3JlYWQoY2xpZW50LCBNVDlNMDAxX1NIVVRURVJfV0lEVEgpLCBzaHV0dGVyKTsKIAkJCWlmIChyZWdfd3JpdGUoY2xpZW50LCBNVDlNMDAxX1NIVVRURVJfV0lEVEgsIHNodXR0ZXIpIDwgMCkKIAkJCQlyZXR1cm4gLUVJTzsKLQkJCW10OW0wMDEtPmV4cG9zdXJlID0gY3RybC0+dmFsdWU7Ci0JCQltdDltMDAxLT5hdXRvZXhwb3N1cmUgPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKLQkJaWYgKGN0cmwtPnZhbHVlKSB7CisJCX0gZWxzZSB7CiAJCQljb25zdCB1MTYgdmJsYW5rID0gMjU7Ci0JCQl1bnNpZ25lZCBpbnQgdG90YWxfaCA9IG10OW0wMDEtPnJlY3QuaGVpZ2h0ICsKKworCQkJbXQ5bTAwMS0+dG90YWxfaCA9IG10OW0wMDEtPnJlY3QuaGVpZ2h0ICsKIAkJCQltdDltMDAxLT55X3NraXBfdG9wICsgdmJsYW5rOwotCQkJaWYgKHJlZ193cml0ZShjbGllbnQsIE1UOU0wMDFfU0hVVFRFUl9XSURUSCwKLQkJCQkgICAgICB0b3RhbF9oKSA8IDApCisJCQlpZiAocmVnX3dyaXRlKGNsaWVudCwgTVQ5TTAwMV9TSFVUVEVSX1dJRFRILCBtdDltMDAxLT50b3RhbF9oKSA8IDApCiAJCQkJcmV0dXJuIC1FSU87Ci0JCQlxY3RybCA9IHNvY19jYW1lcmFfZmluZF9xY3RybChpY2QtPm9wcywgVjRMMl9DSURfRVhQT1NVUkUpOwotCQkJbXQ5bTAwMS0+ZXhwb3N1cmUgPSAoNTI0ICsgKHRvdGFsX2ggLSAxKSAqCi0JCQkJIChxY3RybC0+bWF4aW11bSAtIHFjdHJsLT5taW5pbXVtKSkgLwotCQkJCTEwNDggKyBxY3RybC0+bWluaW11bTsKLQkJCW10OW0wMDEtPmF1dG9leHBvc3VyZSA9IDE7Ci0JCX0gZWxzZQotCQkJbXQ5bTAwMS0+YXV0b2V4cG9zdXJlID0gMDsKLQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDA7CiAJfQotCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKgogICogSW50ZXJmYWNlIGFjdGl2ZSwgY2FuIHVzZSBpMmMuIElmIGl0IGZhaWxzLCBpdCBjYW4gaW5kZWVkIG1lYW4sIHRoYXQKICAqIHRoaXMgd2Fzbid0IG91ciBjYXB0dXJlIGludGVyZmFjZSwgc28sIHdlIHdhaXQgZm9yIHRoZSByaWdodCBvbmUKICAqLwotc3RhdGljIGludCBtdDltMDAxX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorc3RhdGljIGludCBtdDltMDAxX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKIAkJCSAgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBtdDltMDAxICptdDltMDAxID0gdG9fbXQ5bTAwMShjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwogCXMzMiBkYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCi0JQlVHX09OKCFpY2QtPnBhcmVudCB8fAotCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKLQogCS8qIEVuYWJsZSB0aGUgY2hpcCAqLwogCWRhdGEgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlNMDAxX0NISVBfRU5BQkxFLCAxKTsKIAlkZXZfZGJnKCZjbGllbnQtPmRldiwgIndyaXRlOiAlZFxuIiwgZGF0YSk7CkBAIC02NjEsMTggKzUzNywxMSBAQAogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBpbml0aWFsaXNlIHRoZSBjYW1lcmFcbiIpOwogCiAJLyogbXQ5bTAwMV9pbml0KCkgaGFzIHJlc2V0IHRoZSBjaGlwLCByZXR1cm5pbmcgcmVnaXN0ZXJzIHRvIGRlZmF1bHRzICovCi0JbXQ5bTAwMS0+Z2FpbiA9IDY0OwotCW10OW0wMDEtPmV4cG9zdXJlID0gMjU1OwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJm10OW0wMDEtPmhkbCk7CiB9CiAKLXN0YXRpYyB2b2lkIG10OW0wMDFfdmlkZW9fcmVtb3ZlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQorc3RhdGljIHZvaWQgbXQ5bTAwMV92aWRlb19yZW1vdmUoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCi0JZGV2X2RiZyhpY2QtPnBkZXYsICJWaWRlbyByZW1vdmVkOiAlcCwgJXBcbiIsCi0JCWljZC0+cGFyZW50LCBpY2QtPnZkZXYpOwogCWlmIChpY2wtPmZyZWVfYnVzKQogCQlpY2wtPmZyZWVfYnVzKGljbCk7CiB9CkBAIC02ODcsOSArNTU2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBtdDltMDAxX2N0cmxfb3BzID0geworCS5nX3ZvbGF0aWxlX2N0cmwgPSBtdDltMDAxX2dfdm9sYXRpbGVfY3RybCwKKwkuc19jdHJsID0gbXQ5bTAwMV9zX2N0cmwsCit9OworCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG10OW0wMDFfc3ViZGV2X2NvcmVfb3BzID0gewotCS5nX2N0cmwJCT0gbXQ5bTAwMV9nX2N0cmwsCi0JLnNfY3RybAkJPSBtdDltMDAxX3NfY3RybCwKIAkuZ19jaGlwX2lkZW50CT0gbXQ5bTAwMV9nX2NoaXBfaWRlbnQsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCS5nX3JlZ2lzdGVyCT0gbXQ5bTAwMV9nX3JlZ2lzdGVyLApAQCAtNzEwLDYgKzU4Miw0MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG10OW0wMDFfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCS8qIE1UOU0wMDEgaGFzIGFsbCBjYXB0dXJlX2Zvcm1hdCBwYXJhbWV0ZXJzIGZpeGVkICovCisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfTUFTVEVSOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKwljZmctPmZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDltMDAxX3NfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQljb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCWNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisJc3RydWN0IG10OW0wMDEgKm10OW0wMDEgPSB0b19tdDltMDAxKGNsaWVudCk7CisJdW5zaWduZWQgaW50IGJwcyA9IHNvY19tYnVzX2dldF9mbXRkZXNjKG10OW0wMDEtPmZtdC0+Y29kZSktPmJpdHNfcGVyX3NhbXBsZTsKKworCWlmIChpY2wtPnNldF9idXNfcGFyYW0pCisJCXJldHVybiBpY2wtPnNldF9idXNfcGFyYW0oaWNsLCAxIDw8IChicHMgLSAxKSk7CisKKwkvKgorCSAqIFdpdGhvdXQgYm9hcmQgc3BlY2lmaWMgYnVzIHdpZHRoIHNldHRpbmdzIHdlIG9ubHkgc3VwcG9ydCB0aGUKKwkgKiBzZW5zb3JzIG5hdGl2ZSBidXMgd2lkdGgKKwkgKi8KKwlyZXR1cm4gYnBzID09IDEwID8gMCA6IC1FSU5WQUw7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG10OW0wMDFfc3ViZGV2X3ZpZGVvX29wcyA9IHsKIAkuc19zdHJlYW0JPSBtdDltMDAxX3Nfc3RyZWFtLAogCS5zX21idXNfZm10CT0gbXQ5bTAwMV9zX2ZtdCwKQEAgLTcxOSw2ICs2MjUsOCBAQAogCS5nX2Nyb3AJCT0gbXQ5bTAwMV9nX2Nyb3AsCiAJLmNyb3BjYXAJPSBtdDltMDAxX2Nyb3BjYXAsCiAJLmVudW1fbWJ1c19mbXQJPSBtdDltMDAxX2VudW1fZm10LAorCS5nX21idXNfY29uZmlnCT0gbXQ5bTAwMV9nX21idXNfY29uZmlnLAorCS5zX21idXNfY29uZmlnCT0gbXQ5bTAwMV9zX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9zZW5zb3Jfb3BzIG10OW0wMDFfc3ViZGV2X3NlbnNvcl9vcHMgPSB7CkBAIC03MzUsMTcgKzY0MywxMCBAQAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7CiAJc3RydWN0IG10OW0wMDEgKm10OW0wMDE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAlpbnQgcmV0OwogCi0JaWYgKCFpY2QpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNVDlNMDAxOiBtaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlpZiAoIWljbCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1UOU0wMDEgZHJpdmVyIG5lZWRzIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc2MiwyNSArNjYzLDQwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJm10OW0wMDEtPnN1YmRldiwgY2xpZW50LCAmbXQ5bTAwMV9zdWJkZXZfb3BzKTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZtdDltMDAxLT5oZGwsIDQpOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDltMDAxLT5oZGwsICZtdDltMDAxX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfVkZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDltMDAxLT5oZGwsICZtdDltMDAxX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfR0FJTiwgMCwgMTI3LCAxLCA2NCk7CisJbXQ5bTAwMS0+ZXhwb3N1cmUgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5bTAwMS0+aGRsLCAmbXQ5bTAwMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0VYUE9TVVJFLCAxLCAyNTUsIDEsIDI1NSk7CisJLyoKKwkgKiBTaW11bGF0ZWQgYXV0b2V4cG9zdXJlLiBJZiBlbmFibGVkLCB3ZSBjYWxjdWxhdGUgc2h1dHRlciB3aWR0aAorCSAqIG91cnNlbHZlcyBpbiB0aGUgZHJpdmVyIGJhc2VkIG9uIHZlcnRpY2FsIGJsYW5raW5nIGFuZCBmcmFtZSB3aWR0aAorCSAqLworCW10OW0wMDEtPmF1dG9leHBvc3VyZSA9IHY0bDJfY3RybF9uZXdfc3RkX21lbnUoJm10OW0wMDEtPmhkbCwKKwkJCSZtdDltMDAxX2N0cmxfb3BzLCBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPLCAxLCAwLAorCQkJVjRMMl9FWFBPU1VSRV9BVVRPKTsKKwltdDltMDAxLT5zdWJkZXYuY3RybF9oYW5kbGVyID0gJm10OW0wMDEtPmhkbDsKKwlpZiAobXQ5bTAwMS0+aGRsLmVycm9yKSB7CisJCWludCBlcnIgPSBtdDltMDAxLT5oZGwuZXJyb3I7CisKKwkJa2ZyZWUobXQ5bTAwMSk7CisJCXJldHVybiBlcnI7CisJfQorCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMiwgJm10OW0wMDEtPmF1dG9leHBvc3VyZSwKKwkJCQkJVjRMMl9FWFBPU1VSRV9NQU5VQUwsIHRydWUpOwogCiAJLyogU2Vjb25kIHN0YWdlIHByb2JlIC0gd2hlbiBhIGNhcHR1cmUgYWRhcHRlciBpcyB0aGVyZSAqLwotCWljZC0+b3BzCQk9ICZtdDltMDAxX29wczsKLQogCW10OW0wMDEtPnlfc2tpcF90b3AJPSAwOwogCW10OW0wMDEtPnJlY3QubGVmdAk9IE1UOU0wMDFfQ09MVU1OX1NLSVA7CiAJbXQ5bTAwMS0+cmVjdC50b3AJPSBNVDlNMDAxX1JPV19TS0lQOwogCW10OW0wMDEtPnJlY3Qud2lkdGgJPSBNVDlNMDAxX01BWF9XSURUSDsKIAltdDltMDAxLT5yZWN0LmhlaWdodAk9IE1UOU0wMDFfTUFYX0hFSUdIVDsKIAotCS8qCi0JICogU2ltdWxhdGVkIGF1dG9leHBvc3VyZS4gSWYgZW5hYmxlZCwgd2UgY2FsY3VsYXRlIHNodXR0ZXIgd2lkdGgKLQkgKiBvdXJzZWx2ZXMgaW4gdGhlIGRyaXZlciBiYXNlZCBvbiB2ZXJ0aWNhbCBibGFua2luZyBhbmQgZnJhbWUgd2lkdGgKLQkgKi8KLQltdDltMDAxLT5hdXRvZXhwb3N1cmUgPSAxOwotCi0JcmV0ID0gbXQ5bTAwMV92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJcmV0ID0gbXQ5bTAwMV92aWRlb19wcm9iZShpY2wsIGNsaWVudCk7CiAJaWYgKHJldCkgewotCQlpY2QtPm9wcyA9IE5VTEw7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OW0wMDEtPmhkbCk7CiAJCWtmcmVlKG10OW0wMDEpOwogCX0KIApAQCAtNzkwLDEwICs3MDYsMTEgQEAKIHN0YXRpYyBpbnQgbXQ5bTAwMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbXQ5bTAwMSAqbXQ5bTAwMSA9IHRvX210OW0wMDEoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOwogCi0JaWNkLT5vcHMgPSBOVUxMOwotCW10OW0wMDFfdmlkZW9fcmVtb3ZlKGljZCk7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJm10OW0wMDEtPnN1YmRldik7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmbXQ5bTAwMS0+aGRsKTsKKwltdDltMDAxX3ZpZGVvX3JlbW92ZShpY2wpOwogCWtmcmVlKG10OW0wMDEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jCmluZGV4IGEzNTdhYTguLmNmMmMwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jCkBAIC0xMywxMCArMTMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAKIC8qCiAgKiBNVDlNMTExLCBNVDlNMTEyIGFuZCBNVDlNMTMxOgpAQCAtMTc3LDYgKzE4MCw4IEBACiAKIHN0cnVjdCBtdDltMTExIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBoZGw7CisJc3RydWN0IHY0bDJfY3RybCAqZ2FpbjsKIAlpbnQgbW9kZWw7CS8qIFY0TDJfSURFTlRfTVQ5TTExMSBvciBWNEwyX0lERU5UX01UOU0xMTIgY29kZQogCQkJICogZnJvbSB2NGwyLWNoaXAtaWRlbnQuaCAqLwogCWVudW0gbXQ5bTExMV9jb250ZXh0IGNvbnRleHQ7CkBAIC0xODQsMTMgKzE4OSw5IEBACiAJc3RydWN0IG11dGV4IHBvd2VyX2xvY2s7IC8qIGxvY2sgdG8gcHJvdGVjdCBwb3dlcl9jb3VudCAqLwogCWludCBwb3dlcl9jb3VudDsKIAljb25zdCBzdHJ1Y3QgbXQ5bTExMV9kYXRhZm10ICpmbXQ7Ci0JdW5zaWduZWQgaW50IGdhaW47Ci0JdW5zaWduZWQgY2hhciBhdXRvZXhwb3N1cmU7CisJaW50IGxhc3RwYWdlOwkvKiBQYWdlTWFwIGNhY2hlIHZhbHVlICovCiAJdW5zaWduZWQgY2hhciBkYXRhd2lkdGg7CiAJdW5zaWduZWQgaW50IHBvd2VyZWQ6MTsKLQl1bnNpZ25lZCBpbnQgaGZsaXA6MTsKLQl1bnNpZ25lZCBpbnQgdmZsaXA6MTsKLQl1bnNpZ25lZCBpbnQgYXV0b3doaXRlYmFsYW5jZToxOwogfTsKIAogc3RhdGljIHN0cnVjdCBtdDltMTExICp0b19tdDltMTExKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC0yMDIsMTcgKzIwMywxNyBAQAogewogCWludCByZXQ7CiAJdTE2IHBhZ2U7Ci0Jc3RhdGljIGludCBsYXN0cGFnZSA9IC0xOwkvKiBQYWdlTWFwIGNhY2hlIHZhbHVlICovCisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CiAKIAlwYWdlID0gKHJlZyA+PiA4KTsKLQlpZiAocGFnZSA9PSBsYXN0cGFnZSkKKwlpZiAocGFnZSA9PSBtdDltMTExLT5sYXN0cGFnZSkKIAkJcmV0dXJuIDA7CiAJaWYgKHBhZ2UgPiAyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBNVDlNMTExX1BBR0VfTUFQLCBzd2FiMTYocGFnZSkpOwogCWlmICghcmV0KQotCQlsYXN0cGFnZSA9IHBhZ2U7CisJCW10OW0xMTEtPmxhc3RwYWdlID0gcGFnZTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNjIsMjEgKzM2Myw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbXQ5bTExMV9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IFNPQ0FNX01BU1RFUiB8IFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIIHwgU09DQU1fREFUQVdJRFRIXzg7Ci0KLQlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5bTExMV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCB1bnNpZ25lZCBsb25nIGYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbXQ5bTExMV9tYWtlX3JlY3Qoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsCiAJCQkgICAgIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpCiB7CkBAIC02NTksNTAgKzY0NSw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBtdDltMTExX2NvbnRyb2xzW10gPSB7Ci0JewotCQkuaWQJCT0gVjRMMl9DSURfVkZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJGbGlwIFZlcnRpY2FseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfSEZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJGbGlwIEhvcml6b250YWx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LCB7CS8qIGdhaW4gPSAxLzMyKnZhbCAoPT5nYWluPTEgaWYgdmFsPT0zMikgKi8KLQkJLmlkCQk9IFY0TDJfQ0lEX0dBSU4sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJHYWluIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDYzICogMiAqIDIsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMzIsCi0JCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19TTElERVIsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkVfQVVUTywKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkF1dG8gRXhwb3N1cmUiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAxLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgbXQ5bTExMV9vcHMgPSB7Ci0JLnF1ZXJ5X2J1c19wYXJhbQk9IG10OW0xMTFfcXVlcnlfYnVzX3BhcmFtLAotCS5zZXRfYnVzX3BhcmFtCQk9IG10OW0xMTFfc2V0X2J1c19wYXJhbSwKLQkuY29udHJvbHMJCT0gbXQ5bTExMV9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobXQ5bTExMV9jb250cm9scyksCi19OwotCiBzdGF0aWMgaW50IG10OW0xMTFfc2V0X2ZsaXAoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsIGludCBmbGlwLCBpbnQgbWFzaykKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKQEAgLTc0Myw3ICs2ODUsNiBAQAogCWlmIChnYWluID4gNjMgKiAyICogMikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdDltMTExLT5nYWluID0gZ2FpbjsKIAlpZiAoKGdhaW4gPj0gNjQgKiAyKSAmJiAoZ2FpbiA8IDYzICogMiAqIDIpKQogCQl2YWwgPSAoMSA8PCAxMCkgfCAoMSA8PCA5KSB8IChnYWluIC8gNCk7CiAJZWxzZSBpZiAoKGdhaW4gPj0gNjQpICYmIChnYWluIDwgNjQgKiAyKSkKQEAgLTc1NywxMTggKzY5OCw0NyBAQAogc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvZXhwb3N1cmUoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsIGludCBvbikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKLQlpbnQgcmV0OwogCiAJaWYgKG9uKQotCQlyZXQgPSByZWdfc2V0KE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPRVhQT19FTik7Ci0JZWxzZQotCQlyZXQgPSByZWdfY2xlYXIoT1BFUl9NT0RFX0NUUkwsIE1UOU0xMTFfT1BNT0RFX0FVVE9FWFBPX0VOKTsKLQotCWlmICghcmV0KQotCQltdDltMTExLT5hdXRvZXhwb3N1cmUgPSBvbjsKLQotCXJldHVybiByZXQ7CisJCXJldHVybiByZWdfc2V0KE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPRVhQT19FTik7CisJcmV0dXJuIHJlZ19jbGVhcihPUEVSX01PREVfQ1RSTCwgTVQ5TTExMV9PUE1PREVfQVVUT0VYUE9fRU4pOwogfQogCiBzdGF0aWMgaW50IG10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2Uoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsIGludCBvbikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKLQlpbnQgcmV0OwogCiAJaWYgKG9uKQotCQlyZXQgPSByZWdfc2V0KE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPV0hJVEVCQUxfRU4pOwotCWVsc2UKLQkJcmV0ID0gcmVnX2NsZWFyKE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPV0hJVEVCQUxfRU4pOwotCi0JaWYgKCFyZXQpCi0JCW10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UgPSBvbjsKLQotCXJldHVybiByZXQ7CisJCXJldHVybiByZWdfc2V0KE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPV0hJVEVCQUxfRU4pOworCXJldHVybiByZWdfY2xlYXIoT1BFUl9NT0RFX0NUUkwsIE1UOU0xMTFfT1BNT0RFX0FVVE9XSElURUJBTF9FTik7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgbXQ5bTExMV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwotCWludCBkYXRhOworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsCisJCQkJCSAgICAgICBzdHJ1Y3QgbXQ5bTExMSwgaGRsKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQlpZiAobXQ5bTExMS0+Y29udGV4dCA9PSBISUdIUE9XRVIpCi0JCQlkYXRhID0gcmVnX3JlYWQoUkVBRF9NT0RFX0IpOwotCQllbHNlCi0JCQlkYXRhID0gcmVnX3JlYWQoUkVBRF9NT0RFX0EpOwotCi0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9ICEhKGRhdGEgJiBNVDlNMTExX1JNQl9NSVJST1JfUk9XUyk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCWlmIChtdDltMTExLT5jb250ZXh0ID09IEhJR0hQT1dFUikKLQkJCWRhdGEgPSByZWdfcmVhZChSRUFEX01PREVfQik7Ci0JCWVsc2UKLQkJCWRhdGEgPSByZWdfcmVhZChSRUFEX01PREVfQSk7Ci0KLQkJaWYgKGRhdGEgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0JCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIE1UOU0xMTFfUk1CX01JUlJPUl9DT0xTKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlkYXRhID0gbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4obXQ5bTExMSk7Ci0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiBkYXRhOwotCQljdHJsLT52YWx1ZSA9IGRhdGE7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKLQkJY3RybC0+dmFsdWUgPSBtdDltMTExLT5hdXRvZXhwb3N1cmU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgotCQljdHJsLT52YWx1ZSA9IG10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2U7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtdDltMTExX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgbXQ5bTExMSwgc3ViZGV2KTsKLQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsOwotCWludCByZXQ7Ci0KLQlxY3RybCA9IHNvY19jYW1lcmFfZmluZF9xY3RybCgmbXQ5bTExMV9vcHMsIGN0cmwtPmlkKTsKLQlpZiAoIXFjdHJsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQltdDltMTExLT52ZmxpcCA9IGN0cmwtPnZhbHVlOwotCQlyZXQgPSBtdDltMTExX3NldF9mbGlwKG10OW0xMTEsIGN0cmwtPnZhbHVlLAorCQlyZXR1cm4gbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBjdHJsLT52YWwsCiAJCQkJCU1UOU0xMTFfUk1CX01JUlJPUl9ST1dTKTsKLQkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJbXQ5bTExMS0+aGZsaXAgPSBjdHJsLT52YWx1ZTsKLQkJcmV0ID0gbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBjdHJsLT52YWx1ZSwKKwkJcmV0dXJuIG10OW0xMTFfc2V0X2ZsaXAobXQ5bTExMSwgY3RybC0+dmFsLAogCQkJCQlNVDlNMTExX1JNQl9NSVJST1JfQ09MUyk7Ci0JCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJcmV0ID0gbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4obXQ5bTExMSwgY3RybC0+dmFsdWUpOwotCQlicmVhazsKKwkJcmV0dXJuIG10OW0xMTFfc2V0X2dsb2JhbF9nYWluKG10OW0xMTEsIGN0cmwtPnZhbCk7CiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgotCQlyZXQgPSAgbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKG10OW0xMTEsIGN0cmwtPnZhbHVlKTsKLQkJYnJlYWs7CisJCXJldHVybiBtdDltMTExX3NldF9hdXRvZXhwb3N1cmUobXQ5bTExMSwgY3RybC0+dmFsKTsKIAljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKLQkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2UobXQ5bTExMSwgY3RybC0+dmFsdWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gbXQ5bTExMV9zZXRfYXV0b3doaXRlYmFsYW5jZShtdDltMTExLCBjdHJsLT52YWwpOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9zdXNwZW5kKHN0cnVjdCBtdDltMTExICptdDltMTExKQogewotCW10OW0xMTEtPmdhaW4gPSBtdDltMTExX2dldF9nbG9iYWxfZ2FpbihtdDltMTExKTsKKwl2NGwyX2N0cmxfc19jdHJsKG10OW0xMTEtPmdhaW4sIG10OW0xMTFfZ2V0X2dsb2JhbF9nYWluKG10OW0xMTEpKTsKIAogCXJldHVybiAwOwogfQpAQCAtODc4LDExICs3NDgsNyBAQAogCW10OW0xMTFfc2V0X2NvbnRleHQobXQ5bTExMSwgbXQ5bTExMS0+Y29udGV4dCk7CiAJbXQ5bTExMV9zZXRfcGl4Zm10KG10OW0xMTEsIG10OW0xMTEtPmZtdC0+Y29kZSk7CiAJbXQ5bTExMV9zZXR1cF9yZWN0KG10OW0xMTEsICZtdDltMTExLT5yZWN0KTsKLQltdDltMTExX3NldF9mbGlwKG10OW0xMTEsIG10OW0xMTEtPmhmbGlwLCBNVDlNMTExX1JNQl9NSVJST1JfQ09MUyk7Ci0JbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBtdDltMTExLT52ZmxpcCwgTVQ5TTExMV9STUJfTUlSUk9SX1JPV1MpOwotCW10OW0xMTFfc2V0X2dsb2JhbF9nYWluKG10OW0xMTEsIG10OW0xMTEtPmdhaW4pOwotCW10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShtdDltMTExLCBtdDltMTExLT5hdXRvZXhwb3N1cmUpOwotCW10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2UobXQ5bTExMSwgbXQ5bTExMS0+YXV0b3doaXRlYmFsYW5jZSk7CisJdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJm10OW0xMTEtPmhkbCk7CiB9CiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9yZXN1bWUoc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCkBAIC05MTAsOCArNzc2LDYgQEAKIAkJcmV0ID0gbXQ5bTExMV9yZXNldChtdDltMTExKTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gbXQ5bTExMV9zZXRfY29udGV4dChtdDltMTExLCBtdDltMTExLT5jb250ZXh0KTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKG10OW0xMTEsIG10OW0xMTEtPmF1dG9leHBvc3VyZSk7CiAJaWYgKHJldCkKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJtdDltMTExIGluaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtOTIxLDIwICs3ODUsMTIgQEAKICAqIEludGVyZmFjZSBhY3RpdmUsIGNhbiB1c2UgaTJjLiBJZiBpdCBmYWlscywgaXQgY2FuIGluZGVlZCBtZWFuLCB0aGF0CiAgKiB0aGlzIHdhc24ndCBvdXIgY2FwdHVyZSBpbnRlcmZhY2UsIHNvLCB3ZSB3YWl0IGZvciB0aGUgcmlnaHQgb25lCiAgKi8KLXN0YXRpYyBpbnQgbXQ5bTExMV92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCSAgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtdDltMTExX3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CiAJczMyIGRhdGE7CiAJaW50IHJldDsKIAotCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCi0JQlVHX09OKCFpY2QtPnBhcmVudCB8fAotCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKLQotCW10OW0xMTEtPmF1dG9leHBvc3VyZSA9IDE7Ci0JbXQ5bTExMS0+YXV0b3doaXRlYmFsYW5jZSA9IDE7Ci0KIAlkYXRhID0gcmVnX3JlYWQoQ0hJUF9WRVJTSU9OKTsKIAogCXN3aXRjaCAoZGF0YSkgewpAQCAtOTQ4LDE3ICs4MDQsMTYgQEAKIAkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRGV0ZWN0ZWQgYSBNVDlNMTEyIGNoaXAgSUQgJXhcbiIsIGRhdGEpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXQgPSAtRU5PREVWOwogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCSJObyBNVDlNMTExL01UOU0xMTIvTVQ5TTEzMSBjaGlwIGRldGVjdGVkIHJlZ2lzdGVyIHJlYWQgJXhcbiIsCiAJCQlkYXRhKTsKLQkJZ290byBlaTJjOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyZXQgPSBtdDltMTExX2luaXQobXQ5bTExMSk7Ci0KLWVpMmM6Ci0JcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmbXQ5bTExMS0+aGRsKTsKIH0KIAogc3RhdGljIGludCBtdDltMTExX3NfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQpAQCAtOTk1LDkgKzg1MCwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBtdDltMTExX2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBtdDltMTExX3NfY3RybCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXQ5bTExMV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmdfY3RybAkJPSBtdDltMTExX2dfY3RybCwKLQkuc19jdHJsCQk9IG10OW0xMTFfc19jdHJsLAogCS5nX2NoaXBfaWRlbnQJPSBtdDltMTExX2dfY2hpcF9pZGVudCwKIAkuc19wb3dlcgk9IG10OW0xMTFfc19wb3dlciwKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCkBAIC0xMDE2LDYgKzg3MywyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG10OW0xMTFfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfTUFTVEVSIHwgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8CisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKwljZmctPmZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgbXQ5bTExMV9zdWJkZXZfdmlkZW9fb3BzID0gewogCS5zX21idXNfZm10CT0gbXQ5bTExMV9zX2ZtdCwKIAkuZ19tYnVzX2ZtdAk9IG10OW0xMTFfZ19mbXQsCkBAIC0xMDI0LDYgKzg5Niw3IEBACiAJLmdfY3JvcAkJPSBtdDltMTExX2dfY3JvcCwKIAkuY3JvcGNhcAk9IG10OW0xMTFfY3JvcGNhcCwKIAkuZW51bV9tYnVzX2ZtdAk9IG10OW0xMTFfZW51bV9mbXQsCisJLmdfbWJ1c19jb25maWcJPSBtdDltMTExX2dfbWJ1c19jb25maWcsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtdDltMTExX3N1YmRldl9vcHMgPSB7CkBAIC0xMDM1LDE3ICs5MDgsMTAgQEAKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQogewogCXN0cnVjdCBtdDltMTExICptdDltMTExOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJaW50IHJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibXQ5bTExMTogc29jLWNhbWVyYSBkYXRhIG1pc3NpbmchXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJaWYgKCFpY2wpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJtdDltMTExOiBkcml2ZXIgbmVlZHMgcGxhdGZvcm0gZGF0YVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA2MiwxOSArOTI4LDM3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJm10OW0xMTEtPnN1YmRldiwgY2xpZW50LCAmbXQ5bTExMV9zdWJkZXZfb3BzKTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZtdDltMTExLT5oZGwsIDUpOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDltMTExLT5oZGwsICZtdDltMTExX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfVkZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDltMTExLT5oZGwsICZtdDltMTExX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDltMTExLT5oZGwsICZtdDltMTExX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLCAwLCAxLCAxLCAxKTsKKwltdDltMTExLT5nYWluID0gdjRsMl9jdHJsX25ld19zdGQoJm10OW0xMTEtPmhkbCwgJm10OW0xMTFfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9HQUlOLCAwLCA2MyAqIDIgKiAyLCAxLCAzMik7CisJdjRsMl9jdHJsX25ld19zdGRfbWVudSgmbXQ5bTExMS0+aGRsLAorCQkJJm10OW0xMTFfY3RybF9vcHMsIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sIDEsIDAsCisJCQlWNEwyX0VYUE9TVVJFX0FVVE8pOworCW10OW0xMTEtPnN1YmRldi5jdHJsX2hhbmRsZXIgPSAmbXQ5bTExMS0+aGRsOworCWlmIChtdDltMTExLT5oZGwuZXJyb3IpIHsKKwkJaW50IGVyciA9IG10OW0xMTEtPmhkbC5lcnJvcjsKKworCQlrZnJlZShtdDltMTExKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKIAkvKiBTZWNvbmQgc3RhZ2UgcHJvYmUgLSB3aGVuIGEgY2FwdHVyZSBhZGFwdGVyIGlzIHRoZXJlICovCi0JaWNkLT5vcHMJCT0gJm10OW0xMTFfb3BzOwotCiAJbXQ5bTExMS0+cmVjdC5sZWZ0CT0gTVQ5TTExMV9NSU5fREFSS19DT0xTOwogCW10OW0xMTEtPnJlY3QudG9wCT0gTVQ5TTExMV9NSU5fREFSS19ST1dTOwogCW10OW0xMTEtPnJlY3Qud2lkdGgJPSBNVDlNMTExX01BWF9XSURUSDsKIAltdDltMTExLT5yZWN0LmhlaWdodAk9IE1UOU0xMTFfTUFYX0hFSUdIVDsKIAltdDltMTExLT5mbXQJCT0gJm10OW0xMTFfY29sb3VyX2ZtdHNbMF07CisJbXQ5bTExMS0+bGFzdHBhZ2UJPSAtMTsKIAotCXJldCA9IG10OW0xMTFfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOworCXJldCA9IG10OW0xMTFfdmlkZW9fcHJvYmUoY2xpZW50KTsKIAlpZiAocmV0KSB7Ci0JCWljZC0+b3BzID0gTlVMTDsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmbXQ5bTExMS0+aGRsKTsKIAkJa2ZyZWUobXQ5bTExMSk7CiAJfQogCkBAIC0xMDg0LDkgKzk2OCw5IEBACiBzdGF0aWMgaW50IG10OW0xMTFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JaWNkLT5vcHMgPSBOVUxMOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZtdDltMTExLT5zdWJkZXYpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OW0xMTEtPmhkbCk7CiAJa2ZyZWUobXQ5bTExMSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5cDAzMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDlwMDMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjMDY4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5cDAzMS5jCkBAIC0wLDAgKzEsOTY0IEBACisvKgorICogRHJpdmVyIGZvciBNVDlQMDMxIENNT1MgSW1hZ2UgU2Vuc29yIGZyb20gQXB0aW5hCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExLCBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIEphdmllciBNYXJ0aW4gPGphdmllci5tYXJ0aW5AdmlzdGEtc2lsaWNvbi5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIEd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPgorICoKKyAqIEJhc2VkIG9uIHRoZSBNVDlWMDMyIGRyaXZlciBhbmQgQmFzdGlhbiBIZWNodCdzIGNvZGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworI2luY2x1ZGUgPG1lZGlhL210OXAwMzEuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCisjZGVmaW5lIE1UOVAwMzFfUElYRUxfQVJSQVlfV0lEVEgJCQkyNzUyCisjZGVmaW5lIE1UOVAwMzFfUElYRUxfQVJSQVlfSEVJR0hUCQkJMjAwNAorCisjZGVmaW5lIE1UOVAwMzFfQ0hJUF9WRVJTSU9OCQkJCTB4MDAKKyNkZWZpbmUJCU1UOVAwMzFfQ0hJUF9WRVJTSU9OX1ZBTFVFCQkweDE4MDEKKyNkZWZpbmUgTVQ5UDAzMV9ST1dfU1RBUlQJCQkJMHgwMQorI2RlZmluZQkJTVQ5UDAzMV9ST1dfU1RBUlRfTUlOCQkJMAorI2RlZmluZQkJTVQ5UDAzMV9ST1dfU1RBUlRfTUFYCQkJMjAwNAorI2RlZmluZQkJTVQ5UDAzMV9ST1dfU1RBUlRfREVGCQkJNTQKKyNkZWZpbmUgTVQ5UDAzMV9DT0xVTU5fU1RBUlQJCQkJMHgwMgorI2RlZmluZQkJTVQ5UDAzMV9DT0xVTU5fU1RBUlRfTUlOCQkwCisjZGVmaW5lCQlNVDlQMDMxX0NPTFVNTl9TVEFSVF9NQVgJCTI3NTAKKyNkZWZpbmUJCU1UOVAwMzFfQ09MVU1OX1NUQVJUX0RFRgkJMTYKKyNkZWZpbmUgTVQ5UDAzMV9XSU5ET1dfSEVJR0hUCQkJCTB4MDMKKyNkZWZpbmUJCU1UOVAwMzFfV0lORE9XX0hFSUdIVF9NSU4JCTIKKyNkZWZpbmUJCU1UOVAwMzFfV0lORE9XX0hFSUdIVF9NQVgJCTIwMDYKKyNkZWZpbmUJCU1UOVAwMzFfV0lORE9XX0hFSUdIVF9ERUYJCTE5NDQKKyNkZWZpbmUgTVQ5UDAzMV9XSU5ET1dfV0lEVEgJCQkJMHgwNAorI2RlZmluZQkJTVQ5UDAzMV9XSU5ET1dfV0lEVEhfTUlOCQkyCisjZGVmaW5lCQlNVDlQMDMxX1dJTkRPV19XSURUSF9NQVgJCTI3NTIKKyNkZWZpbmUJCU1UOVAwMzFfV0lORE9XX1dJRFRIX0RFRgkJMjU5MgorI2RlZmluZSBNVDlQMDMxX0hPUklaT05UQUxfQkxBTksJCQkweDA1CisjZGVmaW5lCQlNVDlQMDMxX0hPUklaT05UQUxfQkxBTktfTUlOCQkwCisjZGVmaW5lCQlNVDlQMDMxX0hPUklaT05UQUxfQkxBTktfTUFYCQk0MDk1CisjZGVmaW5lIE1UOVAwMzFfVkVSVElDQUxfQkxBTksJCQkJMHgwNgorI2RlZmluZQkJTVQ5UDAzMV9WRVJUSUNBTF9CTEFOS19NSU4JCTAKKyNkZWZpbmUJCU1UOVAwMzFfVkVSVElDQUxfQkxBTktfTUFYCQk0MDk1CisjZGVmaW5lCQlNVDlQMDMxX1ZFUlRJQ0FMX0JMQU5LX0RFRgkJMjUKKyNkZWZpbmUgTVQ5UDAzMV9PVVRQVVRfQ09OVFJPTAkJCQkweDA3CisjZGVmaW5lCQlNVDlQMDMxX09VVFBVVF9DT05UUk9MX0NFTgkJMgorI2RlZmluZQkJTVQ5UDAzMV9PVVRQVVRfQ09OVFJPTF9TWU4JCTEKKyNkZWZpbmUJCU1UOVAwMzFfT1VUUFVUX0NPTlRST0xfREVGCQkweDFmODIKKyNkZWZpbmUgTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX1VQUEVSCQkJMHgwOAorI2RlZmluZSBNVDlQMDMxX1NIVVRURVJfV0lEVEhfTE9XRVIJCQkweDA5CisjZGVmaW5lCQlNVDlQMDMxX1NIVVRURVJfV0lEVEhfTUlOCQkxCisjZGVmaW5lCQlNVDlQMDMxX1NIVVRURVJfV0lEVEhfTUFYCQkxMDQ4NTc1CisjZGVmaW5lCQlNVDlQMDMxX1NIVVRURVJfV0lEVEhfREVGCQkxOTQzCisjZGVmaW5lCU1UOVAwMzFfUExMX0NPTlRST0wJCQkJMHgxMAorI2RlZmluZQkJTVQ5UDAzMV9QTExfQ09OVFJPTF9QV1JPRkYJCTB4MDA1MAorI2RlZmluZQkJTVQ5UDAzMV9QTExfQ09OVFJPTF9QV1JPTgkJMHgwMDUxCisjZGVmaW5lCQlNVDlQMDMxX1BMTF9DT05UUk9MX1VTRVBMTAkJMHgwMDUyCisjZGVmaW5lCU1UOVAwMzFfUExMX0NPTkZJR18xCQkJCTB4MTEKKyNkZWZpbmUJTVQ5UDAzMV9QTExfQ09ORklHXzIJCQkJMHgxMgorI2RlZmluZSBNVDlQMDMxX1BJWEVMX0NMT0NLX0NPTlRST0wJCQkweDBhCisjZGVmaW5lIE1UOVAwMzFfRlJBTUVfUkVTVEFSVAkJCQkweDBiCisjZGVmaW5lIE1UOVAwMzFfU0hVVFRFUl9ERUxBWQkJCQkweDBjCisjZGVmaW5lIE1UOVAwMzFfUlNUCQkJCQkweDBkCisjZGVmaW5lCQlNVDlQMDMxX1JTVF9FTkFCTEUJCQkxCisjZGVmaW5lCQlNVDlQMDMxX1JTVF9ESVNBQkxFCQkJMAorI2RlZmluZSBNVDlQMDMxX1JFQURfTU9ERV8xCQkJCTB4MWUKKyNkZWZpbmUgTVQ5UDAzMV9SRUFEX01PREVfMgkJCQkweDIwCisjZGVmaW5lCQlNVDlQMDMxX1JFQURfTU9ERV8yX1JPV19NSVIJCSgxIDw8IDE1KQorI2RlZmluZQkJTVQ5UDAzMV9SRUFEX01PREVfMl9DT0xfTUlSCQkoMSA8PCAxNCkKKyNkZWZpbmUJCU1UOVAwMzFfUkVBRF9NT0RFXzJfUk9XX0JMQwkJKDEgPDwgNikKKyNkZWZpbmUgTVQ5UDAzMV9ST1dfQUREUkVTU19NT0RFCQkJMHgyMgorI2RlZmluZSBNVDlQMDMxX0NPTFVNTl9BRERSRVNTX01PREUJCQkweDIzCisjZGVmaW5lIE1UOVAwMzFfR0xPQkFMX0dBSU4JCQkJMHgzNQorI2RlZmluZQkJTVQ5UDAzMV9HTE9CQUxfR0FJTl9NSU4JCQk4CisjZGVmaW5lCQlNVDlQMDMxX0dMT0JBTF9HQUlOX01BWAkJCTEwMjQKKyNkZWZpbmUJCU1UOVAwMzFfR0xPQkFMX0dBSU5fREVGCQkJOAorI2RlZmluZQkJTVQ5UDAzMV9HTE9CQUxfR0FJTl9NVUxUCQkoMSA8PCA2KQorI2RlZmluZSBNVDlQMDMxX1JPV19CTEFDS19ERUZfT0ZGU0VUCQkJMHg0YgorI2RlZmluZSBNVDlQMDMxX1RFU1RfUEFUVEVSTgkJCQkweGEwCisjZGVmaW5lCQlNVDlQMDMxX1RFU1RfUEFUVEVSTl9TSElGVAkJMworI2RlZmluZQkJTVQ5UDAzMV9URVNUX1BBVFRFUk5fRU5BQkxFCQkoMSA8PCAwKQorI2RlZmluZQkJTVQ5UDAzMV9URVNUX1BBVFRFUk5fRElTQUJMRQkJKDAgPDwgMCkKKyNkZWZpbmUgTVQ5UDAzMV9URVNUX1BBVFRFUk5fR1JFRU4JCQkweGExCisjZGVmaW5lIE1UOVAwMzFfVEVTVF9QQVRURVJOX1JFRAkJCTB4YTIKKyNkZWZpbmUgTVQ5UDAzMV9URVNUX1BBVFRFUk5fQkxVRQkJCTB4YTMKKworc3RydWN0IG10OXAwMzFfcGxsX2RpdnMgeworCXUzMiBleHRfZnJlcTsKKwl1MzIgdGFyZ2V0X2ZyZXE7CisJdTggbTsKKwl1OCBuOworCXU4IHAxOworfTsKKworc3RydWN0IG10OXAwMzEgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7CisJc3RydWN0IG1lZGlhX3BhZCBwYWQ7CisJc3RydWN0IHY0bDJfcmVjdCBjcm9wOyAgLyogU2Vuc29yIHdpbmRvdyAqLworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0OworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBjdHJsczsKKwlzdHJ1Y3QgbXQ5cDAzMV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgbXV0ZXggcG93ZXJfbG9jazsgLyogbG9jayB0byBwcm90ZWN0IHBvd2VyX2NvdW50ICovCisJaW50IHBvd2VyX2NvdW50OworCXUxNiB4c2tpcDsKKwl1MTYgeXNraXA7CisKKwljb25zdCBzdHJ1Y3QgbXQ5cDAzMV9wbGxfZGl2cyAqcGxsOworCisJLyogUmVnaXN0ZXJzIGNhY2hlICovCisJdTE2IG91dHB1dF9jb250cm9sOworCXUxNiBtb2RlMjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXQ5cDAzMSAqdG9fbXQ5cDAzMShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDlwMDMxLCBzdWJkZXYpOworfQorCitzdGF0aWMgaW50IG10OXAwMzFfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJczMyIGRhdGEgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOworCXJldHVybiBkYXRhIDwgMCA/IGRhdGEgOiBiZTE2X3RvX2NwdShkYXRhKTsKK30KKworc3RhdGljIGludCBtdDlwMDMxX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IGRhdGEpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIGNwdV90b19iZTE2KGRhdGEpKTsKK30KKworc3RhdGljIGludCBtdDlwMDMxX3NldF9vdXRwdXRfY29udHJvbChzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSwgdTE2IGNsZWFyLAorCQkJCSAgICAgIHUxNiBzZXQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXAwMzEtPnN1YmRldik7CisJdTE2IHZhbHVlID0gKG10OXAwMzEtPm91dHB1dF9jb250cm9sICYgfmNsZWFyKSB8IHNldDsKKwlpbnQgcmV0OworCisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfT1VUUFVUX0NPTlRST0wsIHZhbHVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW10OXAwMzEtPm91dHB1dF9jb250cm9sID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9zZXRfbW9kZTIoc3RydWN0IG10OXAwMzEgKm10OXAwMzEsIHUxNiBjbGVhciwgdTE2IHNldCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5cDAzMS0+c3ViZGV2KTsKKwl1MTYgdmFsdWUgPSAobXQ5cDAzMS0+bW9kZTIgJiB+Y2xlYXIpIHwgc2V0OworCWludCByZXQ7CisKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9SRUFEX01PREVfMiwgdmFsdWUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXQ5cDAzMS0+bW9kZTIgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDlwMDMxX3Jlc2V0KHN0cnVjdCBtdDlwMDMxICptdDlwMDMxKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDlwMDMxLT5zdWJkZXYpOworCWludCByZXQ7CisKKwkvKiBEaXNhYmxlIGNoaXAgb3V0cHV0LCBzeW5jaHJvbm91cyBvcHRpb24gdXBkYXRlICovCisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfUlNULCBNVDlQMDMxX1JTVF9FTkFCTEUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1JTVCwgTVQ5UDAzMV9SU1RfRElTQUJMRSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbXQ5cDAzMV9zZXRfb3V0cHV0X2NvbnRyb2wobXQ5cDAzMSwgTVQ5UDAzMV9PVVRQVVRfQ09OVFJPTF9DRU4sCisJCQkJCSAgMCk7Cit9CisKKy8qCisgKiBUaGlzIHN0YXRpYyB0YWJsZSB1c2VzIGV4dF9mcmVxIGFuZCB2ZGRfaW8gdmFsdWVzIHRvIHNlbGVjdCBzdWl0YWJsZQorICogUExMIGRpdmlkZXJzIG0sIG4gYW5kIHAxIHdoaWNoIGhhdmUgYmVlbiBjYWxjdWxhdGVkIGFzIHNwZWNpZmllYyBpbiBwMzYKKyAqIG9mIEFwdGluYSdzIG10OXAwMzEgZGF0YXNoZWV0LiBOZXcgdmFsdWVzIHNob3VsZCBiZSBhZGRlZCBoZXJlLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG10OXAwMzFfcGxsX2RpdnMgbXQ5cDAzMV9kaXZzW10gPSB7CisJLyogZXh0X2ZyZXEJdGFyZ2V0X2ZyZXEJbQluCXAxICovCisJezIxMDAwMDAwLAk0ODAwMDAwMCwJMjYsCTIsCTZ9Cit9OworCitzdGF0aWMgaW50IG10OXAwMzFfcGxsX2dldF9kaXZzKHN0cnVjdCBtdDlwMDMxICptdDlwMDMxKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDlwMDMxLT5zdWJkZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ5cDAzMV9kaXZzKTsgaSsrKSB7CisJCWlmIChtdDlwMDMxX2RpdnNbaV0uZXh0X2ZyZXEgPT0gbXQ5cDAzMS0+cGRhdGEtPmV4dF9mcmVxICYmCisJCSAgbXQ5cDAzMV9kaXZzW2ldLnRhcmdldF9mcmVxID09IG10OXAwMzEtPnBkYXRhLT50YXJnZXRfZnJlcSkgeworCQkJbXQ5cDAzMS0+cGxsID0gJm10OXAwMzFfZGl2c1tpXTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJZGV2X2VycigmY2xpZW50LT5kZXYsICJDb3VsZG4ndCBmaW5kIFBMTCBkaXZpZGVycyBmb3IgZXh0X2ZyZXEgPSAlZCwgIgorCQkidGFyZ2V0X2ZyZXEgPSAlZFxuIiwgbXQ5cDAzMS0+cGRhdGEtPmV4dF9mcmVxLAorCQltdDlwMDMxLT5wZGF0YS0+dGFyZ2V0X2ZyZXEpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG10OXAwMzFfcGxsX2VuYWJsZShzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5cDAzMS0+c3ViZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfUExMX0NPTlRST0wsCisJCQkgICAgTVQ5UDAzMV9QTExfQ09OVFJPTF9QV1JPTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9QTExfQ09ORklHXzEsCisJCQkgICAgKG10OXAwMzEtPnBsbC0+bSA8PCA4KSB8IChtdDlwMDMxLT5wbGwtPm4gLSAxKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9QTExfQ09ORklHXzIsIG10OXAwMzEtPnBsbC0+cDEgLSAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9QTExfQ09OVFJPTCwKKwkJCSAgICBNVDlQMDMxX1BMTF9DT05UUk9MX1BXUk9OIHwKKwkJCSAgICBNVDlQMDMxX1BMTF9DT05UUk9MX1VTRVBMTCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXQ5cDAzMV9wbGxfZGlzYWJsZShzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5cDAzMS0+c3ViZGV2KTsKKworCXJldHVybiBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9QTExfQ09OVFJPTCwKKwkJCSAgICAgTVQ5UDAzMV9QTExfQ09OVFJPTF9QV1JPRkYpOworfQorCitzdGF0aWMgaW50IG10OXAwMzFfcG93ZXJfb24oc3RydWN0IG10OXAwMzEgKm10OXAwMzEpCit7CisJLyogRW5zdXJlIFJFU0VUX0JBUiBpcyBsb3cgKi8KKwlpZiAobXQ5cDAzMS0+cGRhdGEtPnJlc2V0KSB7CisJCW10OXAwMzEtPnBkYXRhLT5yZXNldCgmbXQ5cDAzMS0+c3ViZGV2LCAxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0KKworCS8qIEVtYWJsZSBjbG9jayAqLworCWlmIChtdDlwMDMxLT5wZGF0YS0+c2V0X3hjbGspCisJCW10OXAwMzEtPnBkYXRhLT5zZXRfeGNsaygmbXQ5cDAzMS0+c3ViZGV2LAorCQkJCQkgbXQ5cDAzMS0+cGRhdGEtPmV4dF9mcmVxKTsKKworCS8qIE5vdyBSRVNFVF9CQVIgbXVzdCBiZSBoaWdoICovCisJaWYgKG10OXAwMzEtPnBkYXRhLT5yZXNldCkgeworCQltdDlwMDMxLT5wZGF0YS0+cmVzZXQoJm10OXAwMzEtPnN1YmRldiwgMCk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXQ5cDAzMV9wb3dlcl9vZmYoc3RydWN0IG10OXAwMzEgKm10OXAwMzEpCit7CisJaWYgKG10OXAwMzEtPnBkYXRhLT5yZXNldCkgeworCQltdDlwMDMxLT5wZGF0YS0+cmVzZXQoJm10OXAwMzEtPnN1YmRldiwgMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CisKKwlpZiAobXQ5cDAzMS0+cGRhdGEtPnNldF94Y2xrKQorCQltdDlwMDMxLT5wZGF0YS0+c2V0X3hjbGsoJm10OXAwMzEtPnN1YmRldiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX19tdDlwMDMxX3NldF9wb3dlcihzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSwgYm9vbCBvbikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5cDAzMS0+c3ViZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKCFvbikgeworCQltdDlwMDMxX3Bvd2VyX29mZihtdDlwMDMxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gbXQ5cDAzMV9wb3dlcl9vbihtdDlwMDMxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG10OXAwMzFfcmVzZXQobXQ5cDAzMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVzZXQgdGhlIGNhbWVyYVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZtdDlwMDMxLT5jdHJscyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIHN1YmRldiB2aWRlbyBvcGVyYXRpb25zCisgKi8KKworc3RhdGljIGludCBtdDlwMDMxX3NldF9wYXJhbXMoc3RydWN0IG10OXAwMzEgKm10OXAwMzEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXAwMzEtPnN1YmRldik7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0ID0gJm10OXAwMzEtPmZvcm1hdDsKKwljb25zdCBzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wID0gJm10OXAwMzEtPmNyb3A7CisJdW5zaWduZWQgaW50IGhibGFuazsKKwl1bnNpZ25lZCBpbnQgdmJsYW5rOworCXVuc2lnbmVkIGludCB4c2tpcDsKKwl1bnNpZ25lZCBpbnQgeXNraXA7CisJdW5zaWduZWQgaW50IHhiaW47CisJdW5zaWduZWQgaW50IHliaW47CisJaW50IHJldDsKKworCS8qIFdpbmRvd3MgcG9zaXRpb24gYW5kIHNpemUuCisJICoKKwkgKiBUT0RPOiBNYWtlIHN1cmUgdGhlIHN0YXJ0IGNvb3JkaW5hdGVzIGFuZCB3aW5kb3cgc2l6ZSBtYXRjaCB0aGUKKwkgKiBza2lwcGluZywgYmlubmluZyBhbmQgbWlycm9yaW5nIChzZWUgZGVzY3JpcHRpb24gb2YgcmVnaXN0ZXJzIDIgYW5kIDQKKwkgKiBpbiB0YWJsZSAxMywgYW5kIEJpbm5pbmcgc2VjdGlvbiBvbiBwYWdlIDQxKS4KKwkgKi8KKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9DT0xVTU5fU1RBUlQsIGNyb3AtPmxlZnQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1JPV19TVEFSVCwgY3JvcC0+dG9wKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9XSU5ET1dfV0lEVEgsIGNyb3AtPndpZHRoIC0gMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfV0lORE9XX0hFSUdIVCwgY3JvcC0+aGVpZ2h0IC0gMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBSb3cgYW5kIGNvbHVtbiBiaW5uaW5nIGFuZCBza2lwcGluZy4gVXNlIHRoZSBtYXhpbXVtIGJpbm5pbmcgdmFsdWUKKwkgKiBjb21wYXRpYmxlIHdpdGggdGhlIHNraXBwaW5nIHNldHRpbmdzLgorCSAqLworCXhza2lwID0gRElWX1JPVU5EX0NMT1NFU1QoY3JvcC0+d2lkdGgsIGZvcm1hdC0+d2lkdGgpOworCXlza2lwID0gRElWX1JPVU5EX0NMT1NFU1QoY3JvcC0+aGVpZ2h0LCBmb3JtYXQtPmhlaWdodCk7CisJeGJpbiA9IDEgPDwgKGZmcyh4c2tpcCkgLSAxKTsKKwl5YmluID0gMSA8PCAoZmZzKHlza2lwKSAtIDEpOworCisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfQ09MVU1OX0FERFJFU1NfTU9ERSwKKwkJCSAgICAoKHhiaW4gLSAxKSA8PCA0KSB8ICh4c2tpcCAtIDEpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9ST1dfQUREUkVTU19NT0RFLAorCQkJICAgICgoeWJpbiAtIDEpIDw8IDQpIHwgKHlza2lwIC0gMSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQmxhbmtpbmcgLSB1c2UgbWluaW11bSB2YWx1ZSBmb3IgaG9yaXpvbnRhbCBibGFua2luZyBhbmQgZGVmYXVsdAorCSAqIHZhbHVlIGZvciB2ZXJ0aWNhbCBibGFua2luZy4KKwkgKi8KKwloYmxhbmsgPSAzNDYgKiB5YmluICsgNjQgKyAoODAgPj4gbWF4X3QodW5zaWduZWQgaW50LCB4YmluLCAzKSk7CisJdmJsYW5rID0gTVQ5UDAzMV9WRVJUSUNBTF9CTEFOS19ERUY7CisKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9IT1JJWk9OVEFMX0JMQU5LLCBoYmxhbmspOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1ZFUlRJQ0FMX0JMQU5LLCB2YmxhbmspOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDlwMDMxX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBtdDlwMDMxICptdDlwMDMxID0gdG9fbXQ5cDAzMShzdWJkZXYpOworCWludCByZXQ7CisKKwlpZiAoIWVuYWJsZSkgeworCQkvKiBTdG9wIHNlbnNvciByZWFkb3V0ICovCisJCXJldCA9IG10OXAwMzFfc2V0X291dHB1dF9jb250cm9sKG10OXAwMzEsCisJCQkJCQkgTVQ5UDAzMV9PVVRQVVRfQ09OVFJPTF9DRU4sIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0dXJuIG10OXAwMzFfcGxsX2Rpc2FibGUobXQ5cDAzMSk7CisJfQorCisJcmV0ID0gbXQ5cDAzMV9zZXRfcGFyYW1zKG10OXAwMzEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU3dpdGNoIHRvIG1hc3RlciAibm9ybWFsIiBtb2RlICovCisJcmV0ID0gbXQ5cDAzMV9zZXRfb3V0cHV0X2NvbnRyb2wobXQ5cDAzMSwgMCwKKwkJCQkJIE1UOVAwMzFfT1VUUFVUX0NPTlRST0xfQ0VOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBtdDlwMDMxX3BsbF9lbmFibGUobXQ5cDAzMSk7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9lbnVtX21idXNfY29kZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNvZGUpCit7CisJc3RydWN0IG10OXAwMzEgKm10OXAwMzEgPSB0b19tdDlwMDMxKHN1YmRldik7CisKKwlpZiAoY29kZS0+cGFkIHx8IGNvZGUtPmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvZGUtPmNvZGUgPSBtdDlwMDMxLT5mb3JtYXQuY29kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDlwMDMxX2VudW1fZnJhbWVfc2l6ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9zaXplX2VudW0gKmZzZSkKK3sKKwlzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSA9IHRvX210OXAwMzEoc3ViZGV2KTsKKworCWlmIChmc2UtPmluZGV4ID49IDggfHwgZnNlLT5jb2RlICE9IG10OXAwMzEtPmZvcm1hdC5jb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZzZS0+bWluX3dpZHRoID0gTVQ5UDAzMV9XSU5ET1dfV0lEVEhfREVGCisJCSAgICAgICAvIG1pbl90KHVuc2lnbmVkIGludCwgNywgZnNlLT5pbmRleCArIDEpOworCWZzZS0+bWF4X3dpZHRoID0gZnNlLT5taW5fd2lkdGg7CisJZnNlLT5taW5faGVpZ2h0ID0gTVQ5UDAzMV9XSU5ET1dfSEVJR0hUX0RFRiAvIChmc2UtPmluZGV4ICsgMSk7CisJZnNlLT5tYXhfaGVpZ2h0ID0gZnNlLT5taW5faGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICoKK19fbXQ5cDAzMV9nZXRfcGFkX2Zvcm1hdChzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSB1bnNpZ25lZCBpbnQgcGFkLCB1MzIgd2hpY2gpCit7CisJc3dpdGNoICh3aGljaCkgeworCWNhc2UgVjRMMl9TVUJERVZfRk9STUFUX1RSWToKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCBwYWQpOworCWNhc2UgVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRToKKwkJcmV0dXJuICZtdDlwMDMxLT5mb3JtYXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHY0bDJfcmVjdCAqCitfX210OXAwMzFfZ2V0X3BhZF9jcm9wKHN0cnVjdCBtdDlwMDMxICptdDlwMDMxLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkgICAgIHVuc2lnbmVkIGludCBwYWQsIHUzMiB3aGljaCkKK3sKKwlzd2l0Y2ggKHdoaWNoKSB7CisJY2FzZSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfZ2V0X3RyeV9jcm9wKGZoLCBwYWQpOworCWNhc2UgVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRToKKwkJcmV0dXJuICZtdDlwMDMxLT5jcm9wOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KKworc3RhdGljIGludCBtdDlwMDMxX2dldF9mb3JtYXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBtdDlwMDMxICptdDlwMDMxID0gdG9fbXQ5cDAzMShzdWJkZXYpOworCisJZm10LT5mb3JtYXQgPSAqX19tdDlwMDMxX2dldF9wYWRfZm9ybWF0KG10OXAwMzEsIGZoLCBmbXQtPnBhZCwKKwkJCQkJCWZtdC0+d2hpY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXAwMzFfc2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmb3JtYXQpCit7CisJc3RydWN0IG10OXAwMzEgKm10OXAwMzEgPSB0b19tdDlwMDMxKHN1YmRldik7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqX19mb3JtYXQ7CisJc3RydWN0IHY0bDJfcmVjdCAqX19jcm9wOworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCXVuc2lnbmVkIGludCBocmF0aW87CisJdW5zaWduZWQgaW50IHZyYXRpbzsKKworCV9fY3JvcCA9IF9fbXQ5cDAzMV9nZXRfcGFkX2Nyb3AobXQ5cDAzMSwgZmgsIGZvcm1hdC0+cGFkLAorCQkJCQlmb3JtYXQtPndoaWNoKTsKKworCS8qIENsYW1wIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHRvIGF2b2lkIGRpdmlkaW5nIGJ5IHplcm8uICovCisJd2lkdGggPSBjbGFtcF90KHVuc2lnbmVkIGludCwgQUxJR04oZm9ybWF0LT5mb3JtYXQud2lkdGgsIDIpLAorCQkJbWF4KF9fY3JvcC0+d2lkdGggLyA3LCBNVDlQMDMxX1dJTkRPV19XSURUSF9NSU4pLAorCQkJX19jcm9wLT53aWR0aCk7CisJaGVpZ2h0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIEFMSUdOKGZvcm1hdC0+Zm9ybWF0LmhlaWdodCwgMiksCisJCQltYXgoX19jcm9wLT5oZWlnaHQgLyA4LCBNVDlQMDMxX1dJTkRPV19IRUlHSFRfTUlOKSwKKwkJCV9fY3JvcC0+aGVpZ2h0KTsKKworCWhyYXRpbyA9IERJVl9ST1VORF9DTE9TRVNUKF9fY3JvcC0+d2lkdGgsIHdpZHRoKTsKKwl2cmF0aW8gPSBESVZfUk9VTkRfQ0xPU0VTVChfX2Nyb3AtPmhlaWdodCwgaGVpZ2h0KTsKKworCV9fZm9ybWF0ID0gX19tdDlwMDMxX2dldF9wYWRfZm9ybWF0KG10OXAwMzEsIGZoLCBmb3JtYXQtPnBhZCwKKwkJCQkJICAgIGZvcm1hdC0+d2hpY2gpOworCV9fZm9ybWF0LT53aWR0aCA9IF9fY3JvcC0+d2lkdGggLyBocmF0aW87CisJX19mb3JtYXQtPmhlaWdodCA9IF9fY3JvcC0+aGVpZ2h0IC8gdnJhdGlvOworCisJZm9ybWF0LT5mb3JtYXQgPSAqX19mb3JtYXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDlwMDMxX2dldF9jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IG10OXAwMzEgKm10OXAwMzEgPSB0b19tdDlwMDMxKHN1YmRldik7CisKKwljcm9wLT5yZWN0ID0gKl9fbXQ5cDAzMV9nZXRfcGFkX2Nyb3AobXQ5cDAzMSwgZmgsIGNyb3AtPnBhZCwKKwkJCQkJICAgICBjcm9wLT53aGljaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9zZXRfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9jcm9wICpjcm9wKQoreworCXN0cnVjdCBtdDlwMDMxICptdDlwMDMxID0gdG9fbXQ5cDAzMShzdWJkZXYpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKl9fZm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgKl9fY3JvcDsKKwlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CisKKwkvKiBDbGFtcCB0aGUgY3JvcCByZWN0YW5nbGUgYm91bmRhcmllcyBhbmQgYWxpZ24gdGhlbSB0byBhIG11bHRpcGxlIG9mIDIKKwkgKiBwaXhlbHMgdG8gZW5zdXJlIGEgR1JCRyBCYXllciBwYXR0ZXJuLgorCSAqLworCXJlY3QubGVmdCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QubGVmdCwgMiksIE1UOVAwMzFfQ09MVU1OX1NUQVJUX01JTiwKKwkJCSAgTVQ5UDAzMV9DT0xVTU5fU1RBUlRfTUFYKTsKKwlyZWN0LnRvcCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QudG9wLCAyKSwgTVQ5UDAzMV9ST1dfU1RBUlRfTUlOLAorCQkJIE1UOVAwMzFfUk9XX1NUQVJUX01BWCk7CisJcmVjdC53aWR0aCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3Qud2lkdGgsIDIpLAorCQkJICAgTVQ5UDAzMV9XSU5ET1dfV0lEVEhfTUlOLAorCQkJICAgTVQ5UDAzMV9XSU5ET1dfV0lEVEhfTUFYKTsKKwlyZWN0LmhlaWdodCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QuaGVpZ2h0LCAyKSwKKwkJCSAgICBNVDlQMDMxX1dJTkRPV19IRUlHSFRfTUlOLAorCQkJICAgIE1UOVAwMzFfV0lORE9XX0hFSUdIVF9NQVgpOworCisJcmVjdC53aWR0aCA9IG1pbihyZWN0LndpZHRoLCBNVDlQMDMxX1BJWEVMX0FSUkFZX1dJRFRIIC0gcmVjdC5sZWZ0KTsKKwlyZWN0LmhlaWdodCA9IG1pbihyZWN0LmhlaWdodCwgTVQ5UDAzMV9QSVhFTF9BUlJBWV9IRUlHSFQgLSByZWN0LnRvcCk7CisKKwlfX2Nyb3AgPSBfX210OXAwMzFfZ2V0X3BhZF9jcm9wKG10OXAwMzEsIGZoLCBjcm9wLT5wYWQsIGNyb3AtPndoaWNoKTsKKworCWlmIChyZWN0LndpZHRoICE9IF9fY3JvcC0+d2lkdGggfHwgcmVjdC5oZWlnaHQgIT0gX19jcm9wLT5oZWlnaHQpIHsKKwkJLyogUmVzZXQgdGhlIG91dHB1dCBpbWFnZSBzaXplIGlmIHRoZSBjcm9wIHJlY3RhbmdsZSBzaXplIGhhcworCQkgKiBiZWVuIG1vZGlmaWVkLgorCQkgKi8KKwkJX19mb3JtYXQgPSBfX210OXAwMzFfZ2V0X3BhZF9mb3JtYXQobXQ5cDAzMSwgZmgsIGNyb3AtPnBhZCwKKwkJCQkJCSAgICBjcm9wLT53aGljaCk7CisJCV9fZm9ybWF0LT53aWR0aCA9IHJlY3Qud2lkdGg7CisJCV9fZm9ybWF0LT5oZWlnaHQgPSByZWN0LmhlaWdodDsKKwl9CisKKwkqX19jcm9wID0gcmVjdDsKKwljcm9wLT5yZWN0ID0gcmVjdDsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgY29udHJvbCBvcGVyYXRpb25zCisgKi8KKworI2RlZmluZSBWNEwyX0NJRF9URVNUX1BBVFRFUk4JCShWNEwyX0NJRF9VU0VSX0JBU0UgfCAweDEwMDEpCisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSA9CisJCQljb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IG10OXAwMzEsIGN0cmxzKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5cDAzMS0+c3ViZGV2KTsKKwl1MTYgZGF0YTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1NIVVRURVJfV0lEVEhfVVBQRVIsCisJCQkJICAgIChjdHJsLT52YWwgPj4gMTYpICYgMHhmZmZmKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldHVybiBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX0xPV0VSLAorCQkJCSAgICAgY3RybC0+dmFsICYgMHhmZmZmKTsKKworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJLyogR2FpbiBpcyBjb250cm9sbGVkIGJ5IDIgYW5hbG9nIHN0YWdlcyBhbmQgYSBkaWdpdGFsIHN0YWdlLgorCQkgKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSAzIHN0YWdlcyBhcmUKKwkJICoKKwkJICogU3RhZ2UgICAgICAgICAgICAgICAgTWluICAgICBNYXggICAgIFN0ZXAKKwkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAqIEZpcnN0IGFuYWxvZyBzdGFnZSAgIHgxICAgICAgeDIgICAgICAxCisJCSAqIFNlY29uZCBhbmFsb2cgc3RhZ2UgIHgxICAgICAgeDQgICAgICAwLjEyNQorCQkgKiBEaWdpdGFsIHN0YWdlICAgICAgICB4MSAgICAgIHgxNiAgICAgMC4xMjUKKwkJICoKKwkJICogVG8gbWluaW1pemUgbm9pc2UsIHRoZSBnYWluIHN0YWdlcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUKKwkJICogc2Vjb25kIGFuYWxvZyBzdGFnZSwgZmlyc3QgYW5hbG9nIHN0YWdlLCBkaWdpdGFsIHN0YWdlIG9yZGVyLgorCQkgKiBHYWluIGZyb20gYSBwcmV2aW91cyBzdGFnZSBzaG91bGQgYmUgcHVzaGVkIHRvIGl0cyBtYXhpbXVtCisJCSAqIHZhbHVlIGJlZm9yZSB0aGUgbmV4dCBzdGFnZSBpcyB1c2VkLgorCQkgKi8KKwkJaWYgKGN0cmwtPnZhbCA8PSAzMikgeworCQkJZGF0YSA9IGN0cmwtPnZhbDsKKwkJfSBlbHNlIGlmIChjdHJsLT52YWwgPD0gNjQpIHsKKwkJCWN0cmwtPnZhbCAmPSB+MTsKKwkJCWRhdGEgPSAoMSA8PCA2KSB8IChjdHJsLT52YWwgPj4gMSk7CisJCX0gZWxzZSB7CisJCQljdHJsLT52YWwgJj0gfjc7CisJCQlkYXRhID0gKChjdHJsLT52YWwgLSA2NCkgPDwgNSkgfCAoMSA8PCA2KSB8IDMyOworCQl9CisKKwkJcmV0dXJuIG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX0dMT0JBTF9HQUlOLCBkYXRhKTsKKworCWNhc2UgVjRMMl9DSURfSEZMSVA6CisJCWlmIChjdHJsLT52YWwpCisJCQlyZXR1cm4gbXQ5cDAzMV9zZXRfbW9kZTIobXQ5cDAzMSwKKwkJCQkJMCwgTVQ5UDAzMV9SRUFEX01PREVfMl9DT0xfTUlSKTsKKwkJZWxzZQorCQkJcmV0dXJuIG10OXAwMzFfc2V0X21vZGUyKG10OXAwMzEsCisJCQkJCU1UOVAwMzFfUkVBRF9NT0RFXzJfQ09MX01JUiwgMCk7CisKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQlpZiAoY3RybC0+dmFsKQorCQkJcmV0dXJuIG10OXAwMzFfc2V0X21vZGUyKG10OXAwMzEsCisJCQkJCTAsIE1UOVAwMzFfUkVBRF9NT0RFXzJfUk9XX01JUik7CisJCWVsc2UKKwkJCXJldHVybiBtdDlwMDMxX3NldF9tb2RlMihtdDlwMDMxLAorCQkJCQlNVDlQMDMxX1JFQURfTU9ERV8yX1JPV19NSVIsIDApOworCisJY2FzZSBWNEwyX0NJRF9URVNUX1BBVFRFUk46CisJCWlmICghY3RybC0+dmFsKSB7CisJCQlyZXQgPSBtdDlwMDMxX3NldF9tb2RlMihtdDlwMDMxLAorCQkJCQkwLCBNVDlQMDMxX1JFQURfTU9ERV8yX1JPV19CTEMpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKworCQkJcmV0dXJuIG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1RFU1RfUEFUVEVSTiwKKwkJCQkJICAgICBNVDlQMDMxX1RFU1RfUEFUVEVSTl9ESVNBQkxFKTsKKwkJfQorCisJCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1RFU1RfUEFUVEVSTl9HUkVFTiwgMHgwNWEwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9URVNUX1BBVFRFUk5fUkVELCAweDBhNTApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1RFU1RfUEFUVEVSTl9CTFVFLCAweDBhYTApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gbXQ5cDAzMV9zZXRfbW9kZTIobXQ5cDAzMSwgTVQ5UDAzMV9SRUFEX01PREVfMl9ST1dfQkxDLAorCQkJCQkwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9ST1dfQkxBQ0tfREVGX09GRlNFVCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXR1cm4gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfVEVTVF9QQVRURVJOLAorCQkJCSgoY3RybC0+dmFsIC0gMSkgPDwgTVQ5UDAzMV9URVNUX1BBVFRFUk5fU0hJRlQpCisJCQkJfCBNVDlQMDMxX1RFU1RfUEFUVEVSTl9FTkFCTEUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2NGwyX2N0cmxfb3BzIG10OXAwMzFfY3RybF9vcHMgPSB7CisJLnNfY3RybCA9IG10OXAwMzFfc19jdHJsLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtdDlwMDMxX3Rlc3RfcGF0dGVybl9tZW51W10gPSB7CisJIkRpc2FibGVkIiwKKwkiQ29sb3IgRmllbGQiLAorCSJIb3Jpem9udGFsIEdyYWRpZW50IiwKKwkiVmVydGljYWwgR3JhZGllbnQiLAorCSJEaWFnb25hbCBHcmFkaWVudCIsCisJIkNsYXNzaWMgVGVzdCBQYXR0ZXJuIiwKKwkiV2Fsa2luZyAxcyIsCisJIk1vbm9jaHJvbWUgSG9yaXpvbnRhbCBCYXJzIiwKKwkiTW9ub2Nocm9tZSBWZXJ0aWNhbCBCYXJzIiwKKwkiVmVydGljYWwgQ29sb3IgQmFycyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgbXQ5cDAzMV9jdHJsc1tdID0geworCXsKKwkJLm9wcwkJPSAmbXQ5cDAzMV9jdHJsX29wcywKKwkJLmlkCQk9IFY0TDJfQ0lEX1RFU1RfUEFUVEVSTiwKKwkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKKwkJLm5hbWUJCT0gIlRlc3QgUGF0dGVybiIsCisJCS5taW4JCT0gMCwKKwkJLm1heAkJPSBBUlJBWV9TSVpFKG10OXAwMzFfdGVzdF9wYXR0ZXJuX21lbnUpIC0gMSwKKwkJLnN0ZXAJCT0gMCwKKwkJLmRlZgkJPSAwLAorCQkuZmxhZ3MJCT0gMCwKKwkJLm1lbnVfc2tpcF9tYXNrCT0gMCwKKwkJLnFtZW51CQk9IG10OXAwMzFfdGVzdF9wYXR0ZXJuX21lbnUsCisJfQorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFY0TDIgc3ViZGV2IGNvcmUgb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9zZXRfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsIGludCBvbikKK3sKKwlzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSA9IHRvX210OXAwMzEoc3ViZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJm10OXAwMzEtPnBvd2VyX2xvY2spOworCisJLyogSWYgdGhlIHBvd2VyIGNvdW50IGlzIG1vZGlmaWVkIGZyb20gMCB0byAhPSAwIG9yIGZyb20gIT0gMCB0byAwLAorCSAqIHVwZGF0ZSB0aGUgcG93ZXIgc3RhdGUuCisJICovCisJaWYgKG10OXAwMzEtPnBvd2VyX2NvdW50ID09ICFvbikgeworCQlyZXQgPSBfX210OXAwMzFfc2V0X3Bvd2VyKG10OXAwMzEsICEhb24pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIFVwZGF0ZSB0aGUgcG93ZXIgY291bnQuICovCisJbXQ5cDAzMS0+cG93ZXJfY291bnQgKz0gb24gPyAxIDogLTE7CisJV0FSTl9PTihtdDlwMDMxLT5wb3dlcl9jb3VudCA8IDApOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZtdDlwMDMxLT5wb3dlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgaW50ZXJuYWwgb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9yZWdpc3RlcmVkKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHN1YmRldik7CisJc3RydWN0IG10OXAwMzEgKm10OXAwMzEgPSB0b19tdDlwMDMxKHN1YmRldik7CisJczMyIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IG10OXAwMzFfcG93ZXJfb24obXQ5cDAzMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNVDlQMDMxIHBvd2VyIHVwIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUmVhZCBvdXQgdGhlIGNoaXAgdmVyc2lvbiByZWdpc3RlciAqLworCWRhdGEgPSBtdDlwMDMxX3JlYWQoY2xpZW50LCBNVDlQMDMxX0NISVBfVkVSU0lPTik7CisJaWYgKGRhdGEgIT0gTVQ5UDAzMV9DSElQX1ZFUlNJT05fVkFMVUUpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNVDlQMDMxIG5vdCBkZXRlY3RlZCwgd3JvbmcgdmVyc2lvbiAiCisJCQkiMHglMDR4XG4iLCBkYXRhKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbXQ5cDAzMV9wb3dlcl9vZmYobXQ5cDAzMSk7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJNVDlQMDMxIGRldGVjdGVkIGF0IGFkZHJlc3MgMHglMDJ4XG4iLAorCQkgY2xpZW50LT5hZGRyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9vcGVuKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQoreworCXN0cnVjdCBtdDlwMDMxICptdDlwMDMxID0gdG9fbXQ5cDAzMShzdWJkZXYpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wOworCisJY3JvcCA9IHY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgMCk7CisJY3JvcC0+bGVmdCA9IE1UOVAwMzFfQ09MVU1OX1NUQVJUX0RFRjsKKwljcm9wLT50b3AgPSBNVDlQMDMxX1JPV19TVEFSVF9ERUY7CisJY3JvcC0+d2lkdGggPSBNVDlQMDMxX1dJTkRPV19XSURUSF9ERUY7CisJY3JvcC0+aGVpZ2h0ID0gTVQ5UDAzMV9XSU5ET1dfSEVJR0hUX0RFRjsKKworCWZvcm1hdCA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCAwKTsKKworCWlmIChtdDlwMDMxLT5wZGF0YS0+dmVyc2lvbiA9PSBNVDlQMDMxX01PTk9DSFJPTUVfVkVSU0lPTikKKwkJZm9ybWF0LT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZMTJfMVgxMjsKKwllbHNlCisJCWZvcm1hdC0+Y29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMl8xWDEyOworCisJZm9ybWF0LT53aWR0aCA9IE1UOVAwMzFfV0lORE9XX1dJRFRIX0RFRjsKKwlmb3JtYXQtPmhlaWdodCA9IE1UOVAwMzFfV0lORE9XX0hFSUdIVF9ERUY7CisJZm9ybWF0LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlmb3JtYXQtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKworCW10OXAwMzEtPnhza2lwID0gMTsKKwltdDlwMDMxLT55c2tpcCA9IDE7CisJcmV0dXJuIG10OXAwMzFfc2V0X3Bvd2VyKHN1YmRldiwgMSk7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9jbG9zZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKK3sKKwlyZXR1cm4gbXQ5cDAzMV9zZXRfcG93ZXIoc3ViZGV2LCAwKTsKK30KKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtdDlwMDMxX3N1YmRldl9jb3JlX29wcyA9IHsKKwkuc19wb3dlciAgICAgICAgPSBtdDlwMDMxX3NldF9wb3dlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG10OXAwMzFfc3ViZGV2X3ZpZGVvX29wcyA9IHsKKwkuc19zdHJlYW0gICAgICAgPSBtdDlwMDMxX3Nfc3RyZWFtLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfb3BzIG10OXAwMzFfc3ViZGV2X3BhZF9vcHMgPSB7CisJLmVudW1fbWJ1c19jb2RlID0gbXQ5cDAzMV9lbnVtX21idXNfY29kZSwKKwkuZW51bV9mcmFtZV9zaXplID0gbXQ5cDAzMV9lbnVtX2ZyYW1lX3NpemUsCisJLmdldF9mbXQgPSBtdDlwMDMxX2dldF9mb3JtYXQsCisJLnNldF9mbXQgPSBtdDlwMDMxX3NldF9mb3JtYXQsCisJLmdldF9jcm9wID0gbXQ5cDAzMV9nZXRfY3JvcCwKKwkuc2V0X2Nyb3AgPSBtdDlwMDMxX3NldF9jcm9wLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXQ5cDAzMV9zdWJkZXZfb3BzID0geworCS5jb3JlICAgPSAmbXQ5cDAzMV9zdWJkZXZfY29yZV9vcHMsCisJLnZpZGVvICA9ICZtdDlwMDMxX3N1YmRldl92aWRlb19vcHMsCisJLnBhZCAgICA9ICZtdDlwMDMxX3N1YmRldl9wYWRfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXQ5cDAzMV9zdWJkZXZfaW50ZXJuYWxfb3BzID0geworCS5yZWdpc3RlcmVkID0gbXQ5cDAzMV9yZWdpc3RlcmVkLAorCS5vcGVuID0gbXQ5cDAzMV9vcGVuLAorCS5jbG9zZSA9IG10OXAwMzFfY2xvc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRHJpdmVyIGluaXRpYWxpemF0aW9uIGFuZCBwcm9iaW5nCisgKi8KKworc3RhdGljIGludCBtdDlwMDMxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKK3sKKwlzdHJ1Y3QgbXQ5cDAzMV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKSB7CisJCWRldl93YXJuKCZjbGllbnQtPmRldiwKKwkJCSJJMkMtQWRhcHRlciBkb2Vzbid0IHN1cHBvcnQgSTJDX0ZVTkNfU01CVVNfV09SRFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCW10OXAwMzEgPSBremFsbG9jKHNpemVvZigqbXQ5cDAzMSksIEdGUF9LRVJORUwpOworCWlmIChtdDlwMDMxID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbXQ5cDAzMS0+cGRhdGEgPSBwZGF0YTsKKwltdDlwMDMxLT5vdXRwdXRfY29udHJvbAk9IE1UOVAwMzFfT1VUUFVUX0NPTlRST0xfREVGOworCW10OXAwMzEtPm1vZGUyID0gTVQ5UDAzMV9SRUFEX01PREVfMl9ST1dfQkxDOworCisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmbXQ5cDAzMS0+Y3RybHMsIEFSUkFZX1NJWkUobXQ5cDAzMV9jdHJscykgKyA0KTsKKworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDlwMDMxLT5jdHJscywgJm10OXAwMzFfY3RybF9vcHMsCisJCQkgIFY0TDJfQ0lEX0VYUE9TVVJFLCBNVDlQMDMxX1NIVVRURVJfV0lEVEhfTUlOLAorCQkJICBNVDlQMDMxX1NIVVRURVJfV0lEVEhfTUFYLCAxLAorCQkJICBNVDlQMDMxX1NIVVRURVJfV0lEVEhfREVGKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5cDAzMS0+Y3RybHMsICZtdDlwMDMxX2N0cmxfb3BzLAorCQkJICBWNEwyX0NJRF9HQUlOLCBNVDlQMDMxX0dMT0JBTF9HQUlOX01JTiwKKwkJCSAgTVQ5UDAzMV9HTE9CQUxfR0FJTl9NQVgsIDEsIE1UOVAwMzFfR0xPQkFMX0dBSU5fREVGKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5cDAzMS0+Y3RybHMsICZtdDlwMDMxX2N0cmxfb3BzLAorCQkJICBWNEwyX0NJRF9IRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJm10OXAwMzEtPmN0cmxzLCAmbXQ5cDAzMV9jdHJsX29wcywKKwkJCSAgVjRMMl9DSURfVkZMSVAsIDAsIDEsIDEsIDApOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ5cDAzMV9jdHJscyk7ICsraSkKKwkJdjRsMl9jdHJsX25ld19jdXN0b20oJm10OXAwMzEtPmN0cmxzLCAmbXQ5cDAzMV9jdHJsc1tpXSwgTlVMTCk7CisKKwltdDlwMDMxLT5zdWJkZXYuY3RybF9oYW5kbGVyID0gJm10OXAwMzEtPmN0cmxzOworCisJaWYgKG10OXAwMzEtPmN0cmxzLmVycm9yKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogY29udHJvbCBpbml0aWFsaXphdGlvbiBlcnJvciAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBtdDlwMDMxLT5jdHJscy5lcnJvcik7CisKKwltdXRleF9pbml0KCZtdDlwMDMxLT5wb3dlcl9sb2NrKTsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdCgmbXQ5cDAzMS0+c3ViZGV2LCBjbGllbnQsICZtdDlwMDMxX3N1YmRldl9vcHMpOworCW10OXAwMzEtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmbXQ5cDAzMV9zdWJkZXZfaW50ZXJuYWxfb3BzOworCisJbXQ5cDAzMS0+cGFkLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKKwlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmbXQ5cDAzMS0+c3ViZGV2LmVudGl0eSwgMSwgJm10OXAwMzEtPnBhZCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCW10OXAwMzEtPnN1YmRldi5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCW10OXAwMzEtPmNyb3Aud2lkdGggPSBNVDlQMDMxX1dJTkRPV19XSURUSF9ERUY7CisJbXQ5cDAzMS0+Y3JvcC5oZWlnaHQgPSBNVDlQMDMxX1dJTkRPV19IRUlHSFRfREVGOworCW10OXAwMzEtPmNyb3AubGVmdCA9IE1UOVAwMzFfQ09MVU1OX1NUQVJUX0RFRjsKKwltdDlwMDMxLT5jcm9wLnRvcCA9IE1UOVAwMzFfUk9XX1NUQVJUX0RFRjsKKworCWlmIChtdDlwMDMxLT5wZGF0YS0+dmVyc2lvbiA9PSBNVDlQMDMxX01PTk9DSFJPTUVfVkVSU0lPTikKKwkJbXQ5cDAzMS0+Zm9ybWF0LmNvZGUgPSBWNEwyX01CVVNfRk1UX1kxMl8xWDEyOworCWVsc2UKKwkJbXQ5cDAzMS0+Zm9ybWF0LmNvZGUgPSBWNEwyX01CVVNfRk1UX1NHUkJHMTJfMVgxMjsKKworCW10OXAwMzEtPmZvcm1hdC53aWR0aCA9IE1UOVAwMzFfV0lORE9XX1dJRFRIX0RFRjsKKwltdDlwMDMxLT5mb3JtYXQuaGVpZ2h0ID0gTVQ5UDAzMV9XSU5ET1dfSEVJR0hUX0RFRjsKKwltdDlwMDMxLT5mb3JtYXQuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJbXQ5cDAzMS0+Zm9ybWF0LmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKworCXJldCA9IG10OXAwMzFfcGxsX2dldF9kaXZzKG10OXAwMzEpOworCitkb25lOgorCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OXAwMzEtPmN0cmxzKTsKKwkJbWVkaWFfZW50aXR5X2NsZWFudXAoJm10OXAwMzEtPnN1YmRldi5lbnRpdHkpOworCQlrZnJlZShtdDlwMDMxKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OXAwMzFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSA9IHRvX210OXAwMzEoc3ViZGV2KTsKKworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OXAwMzEtPmN0cmxzKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzdWJkZXYpOworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzdWJkZXYtPmVudGl0eSk7CisJa2ZyZWUobXQ5cDAzMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG10OXAwMzFfaWRbXSA9IHsKKwl7ICJtdDlwMDMxIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtdDlwMDMxX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG10OXAwMzFfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtdDlwMDMxIiwKKwl9LAorCS5wcm9iZSAgICAgICAgICA9IG10OXAwMzFfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gbXQ5cDAzMV9yZW1vdmUsCisJLmlkX3RhYmxlICAgICAgID0gbXQ5cDAzMV9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG10OXAwMzFfbW9kX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm10OXAwMzFfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdDlwMDMxX21vZF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm10OXAwMzFfaTJjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG10OXAwMzFfbW9kX2luaXQpOworbW9kdWxlX2V4aXQobXQ5cDAzMV9tb2RfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXB0aW5hIE1UOVAwMzEgQ2FtZXJhIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQmFzdGlhbiBIZWNodCA8aGVjaHRiQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MDAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwNzRiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAwMS5jCkBAIC0wLDAgKzEsODM2IEBACisvKgorICogRHJpdmVyIGZvciBNVDlUMDAxIENNT1MgSW1hZ2UgU2Vuc29yIGZyb20gQXB0aW5hIChNaWNyb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEsIExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KKyAqCisgKiBCYXNlZCBvbiB0aGUgTVQ5TTAwMSBkcml2ZXIsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBHdWVubmFkaSBMaWFraG92ZXRza2kgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL210OXQwMDEuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCisjZGVmaW5lIE1UOVQwMDFfUElYRUxfQVJSQVlfSEVJR0hUCQkJMTU2OAorI2RlZmluZSBNVDlUMDAxX1BJWEVMX0FSUkFZX1dJRFRICQkJMjExMgorCisjZGVmaW5lIE1UOVQwMDFfQ0hJUF9WRVJTSU9OCQkJCTB4MDAKKyNkZWZpbmUJCU1UOVQwMDFfQ0hJUF9JRAkJCQkweDE2MjEKKyNkZWZpbmUgTVQ5VDAwMV9ST1dfU1RBUlQJCQkJMHgwMQorI2RlZmluZQkJTVQ5VDAwMV9ST1dfU1RBUlRfTUlOCQkJMAorI2RlZmluZQkJTVQ5VDAwMV9ST1dfU1RBUlRfREVGCQkJMjAKKyNkZWZpbmUJCU1UOVQwMDFfUk9XX1NUQVJUX01BWAkJCTE1MzQKKyNkZWZpbmUgTVQ5VDAwMV9DT0xVTU5fU1RBUlQJCQkJMHgwMgorI2RlZmluZQkJTVQ5VDAwMV9DT0xVTU5fU1RBUlRfTUlOCQkwCisjZGVmaW5lCQlNVDlUMDAxX0NPTFVNTl9TVEFSVF9ERUYJCTMyCisjZGVmaW5lCQlNVDlUMDAxX0NPTFVNTl9TVEFSVF9NQVgJCTIwNDYKKyNkZWZpbmUgTVQ5VDAwMV9XSU5ET1dfSEVJR0hUCQkJCTB4MDMKKyNkZWZpbmUJCU1UOVQwMDFfV0lORE9XX0hFSUdIVF9NSU4JCTEKKyNkZWZpbmUJCU1UOVQwMDFfV0lORE9XX0hFSUdIVF9ERUYJCTE1MzUKKyNkZWZpbmUJCU1UOVQwMDFfV0lORE9XX0hFSUdIVF9NQVgJCTE1NjcKKyNkZWZpbmUgTVQ5VDAwMV9XSU5ET1dfV0lEVEgJCQkJMHgwNAorI2RlZmluZQkJTVQ5VDAwMV9XSU5ET1dfV0lEVEhfTUlOCQkxCisjZGVmaW5lCQlNVDlUMDAxX1dJTkRPV19XSURUSF9ERUYJCTIwNDcKKyNkZWZpbmUJCU1UOVQwMDFfV0lORE9XX1dJRFRIX01BWAkJMjExMQorI2RlZmluZSBNVDlUMDAxX0hPUklaT05UQUxfQkxBTktJTkcJCQkweDA1CisjZGVmaW5lCQlNVDlUMDAxX0hPUklaT05UQUxfQkxBTktJTkdfTUlOCQkyMQorI2RlZmluZQkJTVQ5VDAwMV9IT1JJWk9OVEFMX0JMQU5LSU5HX01BWAkJMTAyMworI2RlZmluZSBNVDlUMDAxX1ZFUlRJQ0FMX0JMQU5LSU5HCQkJMHgwNgorI2RlZmluZQkJTVQ5VDAwMV9WRVJUSUNBTF9CTEFOS0lOR19NSU4JCTMKKyNkZWZpbmUJCU1UOVQwMDFfVkVSVElDQUxfQkxBTktJTkdfTUFYCQkxMDIzCisjZGVmaW5lIE1UOVQwMDFfT1VUUFVUX0NPTlRST0wJCQkJMHgwNworI2RlZmluZQkJTVQ5VDAwMV9PVVRQVVRfQ09OVFJPTF9TWU5DCQkoMSA8PCAwKQorI2RlZmluZQkJTVQ5VDAwMV9PVVRQVVRfQ09OVFJPTF9DSElQX0VOQUJMRQkoMSA8PCAxKQorI2RlZmluZQkJTVQ5VDAwMV9PVVRQVVRfQ09OVFJPTF9URVNUX0RBVEEJKDEgPDwgNikKKyNkZWZpbmUgTVQ5VDAwMV9TSFVUVEVSX1dJRFRIX0hJR0gJCQkweDA4CisjZGVmaW5lIE1UOVQwMDFfU0hVVFRFUl9XSURUSF9MT1cJCQkweDA5CisjZGVmaW5lCQlNVDlUMDAxX1NIVVRURVJfV0lEVEhfTUlOCQkxCisjZGVmaW5lCQlNVDlUMDAxX1NIVVRURVJfV0lEVEhfREVGCQkxNTYxCisjZGVmaW5lCQlNVDlUMDAxX1NIVVRURVJfV0lEVEhfTUFYCQkoMTAyNCAqIDEwMjQpCisjZGVmaW5lIE1UOVQwMDFfUElYRUxfQ0xPQ0sJCQkJMHgwYQorI2RlZmluZQkJTVQ5VDAwMV9QSVhFTF9DTE9DS19JTlZFUlQJCSgxIDw8IDE1KQorI2RlZmluZQkJTVQ5VDAwMV9QSVhFTF9DTE9DS19TSElGVF9NQVNLCQkoNyA8PCA4KQorI2RlZmluZQkJTVQ5VDAwMV9QSVhFTF9DTE9DS19TSElGVF9TSElGVAkJOAorI2RlZmluZQkJTVQ5VDAwMV9QSVhFTF9DTE9DS19ESVZJREVfTUFTSwkJKDB4N2YgPDwgMCkKKyNkZWZpbmUgTVQ5VDAwMV9GUkFNRV9SRVNUQVJUCQkJCTB4MGIKKyNkZWZpbmUgTVQ5VDAwMV9TSFVUVEVSX0RFTEFZCQkJCTB4MGMKKyNkZWZpbmUJCU1UOVQwMDFfU0hVVFRFUl9ERUxBWV9NQVgJCTIwNDcKKyNkZWZpbmUgTVQ5VDAwMV9SRVNFVAkJCQkJMHgwZAorI2RlZmluZSBNVDlUMDAxX1JFQURfTU9ERTEJCQkJMHgxZQorI2RlZmluZQkJTVQ5VDAwMV9SRUFEX01PREVfU05BUFNIT1QJCSgxIDw8IDgpCisjZGVmaW5lCQlNVDlUMDAxX1JFQURfTU9ERV9TVFJPQkVfRU5BQkxFCQkoMSA8PCA5KQorI2RlZmluZQkJTVQ5VDAwMV9SRUFEX01PREVfU1RST0JFX1dJRFRICQkoMSA8PCAxMCkKKyNkZWZpbmUJCU1UOVQwMDFfUkVBRF9NT0RFX1NUUk9CRV9PVkVSUklERQkoMSA8PCAxMSkKKyNkZWZpbmUgTVQ5VDAwMV9SRUFEX01PREUyCQkJCTB4MjAKKyNkZWZpbmUJCU1UOVQwMDFfUkVBRF9NT0RFX0JBRF9GUkFNRVMJCSgxIDw8IDApCisjZGVmaW5lCQlNVDlUMDAxX1JFQURfTU9ERV9MSU5FX1ZBTElEX0NPTlRJTlVPVVMJKDEgPDwgOSkKKyNkZWZpbmUJCU1UOVQwMDFfUkVBRF9NT0RFX0xJTkVfVkFMSURfRlJBTUUJKDEgPDwgMTApCisjZGVmaW5lIE1UOVQwMDFfUkVBRF9NT0RFMwkJCQkweDIxCisjZGVmaW5lCQlNVDlUMDAxX1JFQURfTU9ERV9HTE9CQUxfUkVTRVQJCSgxIDw8IDApCisjZGVmaW5lCQlNVDlUMDAxX1JFQURfTU9ERV9HSFNUX0NUTAkJKDEgPDwgMSkKKyNkZWZpbmUgTVQ5VDAwMV9ST1dfQUREUkVTU19NT0RFCQkJMHgyMgorI2RlZmluZQkJTVQ5VDAwMV9ST1dfU0tJUF9NQVNLCQkJKDcgPDwgMCkKKyNkZWZpbmUJCU1UOVQwMDFfUk9XX0JJTl9NQVNLCQkJKDMgPDwgMykKKyNkZWZpbmUJCU1UOVQwMDFfUk9XX0JJTl9TSElGVAkJCTMKKyNkZWZpbmUgTVQ5VDAwMV9DT0xVTU5fQUREUkVTU19NT0RFCQkJMHgyMworI2RlZmluZQkJTVQ5VDAwMV9DT0xVTU5fU0tJUF9NQVNLCQkoNyA8PCAwKQorI2RlZmluZQkJTVQ5VDAwMV9DT0xVTU5fQklOX01BU0sJCQkoMyA8PCAzKQorI2RlZmluZQkJTVQ5VDAwMV9DT0xVTU5fQklOX1NISUZUCQkzCisjZGVmaW5lIE1UOVQwMDFfR1JFRU4xX0dBSU4JCQkJMHgyYgorI2RlZmluZSBNVDlUMDAxX0JMVUVfR0FJTgkJCQkweDJjCisjZGVmaW5lIE1UOVQwMDFfUkVEX0dBSU4JCQkJMHgyZAorI2RlZmluZSBNVDlUMDAxX0dSRUVOMl9HQUlOCQkJCTB4MmUKKyNkZWZpbmUgTVQ5VDAwMV9URVNUX0RBVEEJCQkJMHgzMgorI2RlZmluZSBNVDlUMDAxX0dMT0JBTF9HQUlOCQkJCTB4MzUKKyNkZWZpbmUJCU1UOVQwMDFfR0xPQkFMX0dBSU5fTUlOCQkJOAorI2RlZmluZQkJTVQ5VDAwMV9HTE9CQUxfR0FJTl9NQVgJCQkxMDI0CisjZGVmaW5lIE1UOVQwMDFfQkxBQ0tfTEVWRUwJCQkJMHg0OQorI2RlZmluZSBNVDlUMDAxX1JPV19CTEFDS19ERUZBVUxUX09GRlNFVAkJMHg0YgorI2RlZmluZSBNVDlUMDAxX0JMQ19ERUxUQV9USFJFU0hPTERTCQkJMHg1ZAorI2RlZmluZSBNVDlUMDAxX0NBTF9USFJFU0hPTERTCQkJCTB4NWYKKyNkZWZpbmUgTVQ5VDAwMV9HUkVFTjFfT0ZGU0VUCQkJCTB4NjAKKyNkZWZpbmUgTVQ5VDAwMV9HUkVFTjJfT0ZGU0VUCQkJCTB4NjEKKyNkZWZpbmUgTVQ5VDAwMV9CTEFDS19MRVZFTF9DQUxJQlJBVElPTgkJCTB4NjIKKyNkZWZpbmUJCU1UOVQwMDFfQkxBQ0tfTEVWRUxfT1ZFUlJJREUJCSgxIDw8IDApCisjZGVmaW5lCQlNVDlUMDAxX0JMQUNLX0xFVkVMX0RJU0FCTEVfT0ZGU0VUCSgxIDw8IDEpCisjZGVmaW5lCQlNVDlUMDAxX0JMQUNLX0xFVkVMX1JFQ0FMQ1VMQVRFCQkoMSA8PCAxMikKKyNkZWZpbmUJCU1UOVQwMDFfQkxBQ0tfTEVWRUxfTE9DS19SRURfQkxVRQkoMSA8PCAxMykKKyNkZWZpbmUJCU1UOVQwMDFfQkxBQ0tfTEVWRUxfTE9DS19HUkVFTgkJKDEgPDwgMTQpCisjZGVmaW5lIE1UOVQwMDFfUkVEX09GRlNFVAkJCQkweDYzCisjZGVmaW5lIE1UOVQwMDFfQkxVRV9PRkZTRVQJCQkJMHg2NAorCitzdHJ1Y3QgbXQ5dDAwMSB7CisJc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKKwlzdHJ1Y3QgbWVkaWFfcGFkIHBhZDsKKworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgY3JvcDsKKworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBjdHJsczsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluc1s0XTsKKworCXUxNiBvdXRwdXRfY29udHJvbDsKKwl1MTYgYmxhY2tfbGV2ZWw7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtdDl0MDAxICp0b19tdDl0MDAxKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OXQwMDEsIHN1YmRldik7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlzMzIgZGF0YSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7CisJcmV0dXJuIGRhdGEgPCAwID8gZGF0YSA6IGJlMTZfdG9fY3B1KGRhdGEpOworfQorCitzdGF0aWMgaW50IG10OXQwMDFfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgY3B1X3RvX2JlMTYoZGF0YSkpOworfQorCitzdGF0aWMgaW50IG10OXQwMDFfc2V0X291dHB1dF9jb250cm9sKHN0cnVjdCBtdDl0MDAxICptdDl0MDAxLCB1MTYgY2xlYXIsCisJCQkJICAgICAgdTE2IHNldCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5dDAwMS0+c3ViZGV2KTsKKwl1MTYgdmFsdWUgPSAobXQ5dDAwMS0+b3V0cHV0X2NvbnRyb2wgJiB+Y2xlYXIpIHwgc2V0OworCWludCByZXQ7CisKKwlpZiAodmFsdWUgPT0gbXQ5dDAwMS0+b3V0cHV0X2NvbnRyb2wpCisJCXJldHVybiAwOworCisJcmV0ID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfT1VUUFVUX0NPTlRST0wsIHZhbHVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW10OXQwMDEtPm91dHB1dF9jb250cm9sID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIHN1YmRldiB2aWRlbyBvcGVyYXRpb25zCisgKi8KKworc3RhdGljIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKgorX19tdDl0MDAxX2dldF9wYWRfZm9ybWF0KHN0cnVjdCBtdDl0MDAxICptdDl0MDAxLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJIHVuc2lnbmVkIGludCBwYWQsIGVudW0gdjRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZSB3aGljaCkKK3sKKwlzd2l0Y2ggKHdoaWNoKSB7CisJY2FzZSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIHBhZCk7CisJY2FzZSBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFOgorCQlyZXR1cm4gJm10OXQwMDEtPmZvcm1hdDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9yZWN0ICoKK19fbXQ5dDAwMV9nZXRfcGFkX2Nyb3Aoc3RydWN0IG10OXQwMDEgKm10OXQwMDEsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcGFkLCBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2Ugd2hpY2gpCit7CisJc3dpdGNoICh3aGljaCkgeworCWNhc2UgVjRMMl9TVUJERVZfRk9STUFUX1RSWToKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgcGFkKTsKKwljYXNlIFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU6CisJCXJldHVybiAmbXQ5dDAwMS0+Y3JvcDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgaW50IGVuYWJsZSkKK3sKKwljb25zdCB1MTYgbW9kZSA9IE1UOVQwMDFfT1VUUFVUX0NPTlRST0xfQ0hJUF9FTkFCTEU7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc3ViZGV2KTsKKwlzdHJ1Y3QgbXQ5dDAwMSAqbXQ5dDAwMSA9IHRvX210OXQwMDEoc3ViZGV2KTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQgPSAmbXQ5dDAwMS0+Zm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3AgPSAmbXQ5dDAwMS0+Y3JvcDsKKwl1bnNpZ25lZCBpbnQgaHJhdGlvOworCXVuc2lnbmVkIGludCB2cmF0aW87CisJaW50IHJldDsKKworCWlmICghZW5hYmxlKQorCQlyZXR1cm4gbXQ5dDAwMV9zZXRfb3V0cHV0X2NvbnRyb2wobXQ5dDAwMSwgbW9kZSwgMCk7CisKKwkvKiBDb25maWd1cmUgdGhlIHdpbmRvdyBzaXplIGFuZCByb3cvY29sdW1uIGJpbiAqLworCWhyYXRpbyA9IERJVl9ST1VORF9DTE9TRVNUKGNyb3AtPndpZHRoLCBmb3JtYXQtPndpZHRoKTsKKwl2cmF0aW8gPSBESVZfUk9VTkRfQ0xPU0VTVChjcm9wLT5oZWlnaHQsIGZvcm1hdC0+aGVpZ2h0KTsKKworCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1JPV19BRERSRVNTX01PREUsIGhyYXRpbyAtIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfQ09MVU1OX0FERFJFU1NfTU9ERSwgdnJhdGlvIC0gMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9DT0xVTU5fU1RBUlQsIGNyb3AtPmxlZnQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfUk9XX1NUQVJULCBjcm9wLT50b3ApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfV0lORE9XX1dJRFRILCBjcm9wLT53aWR0aCAtIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfV0lORE9XX0hFSUdIVCwgY3JvcC0+aGVpZ2h0IC0gMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTd2l0Y2ggdG8gbWFzdGVyICJub3JtYWwiIG1vZGUgKi8KKwlyZXR1cm4gbXQ5dDAwMV9zZXRfb3V0cHV0X2NvbnRyb2wobXQ5dDAwMSwgMCwgbW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9lbnVtX21idXNfY29kZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNvZGUpCit7CisJaWYgKGNvZGUtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb2RlLT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9lbnVtX2ZyYW1lX3NpemUoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfc2l6ZV9lbnVtICpmc2UpCit7CisJaWYgKGZzZS0+aW5kZXggPj0gOCB8fCBmc2UtPmNvZGUgIT0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTApCisJCXJldHVybiAtRUlOVkFMOworCisJZnNlLT5taW5fd2lkdGggPSAoTVQ5VDAwMV9XSU5ET1dfV0lEVEhfREVGICsgMSkgLyBmc2UtPmluZGV4OworCWZzZS0+bWF4X3dpZHRoID0gZnNlLT5taW5fd2lkdGg7CisJZnNlLT5taW5faGVpZ2h0ID0gKE1UOVQwMDFfV0lORE9XX0hFSUdIVF9ERUYgKyAxKSAvIGZzZS0+aW5kZXg7CisJZnNlLT5tYXhfaGVpZ2h0ID0gZnNlLT5taW5faGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9nZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZvcm1hdCkKK3sKKwlzdHJ1Y3QgbXQ5dDAwMSAqbXQ5dDAwMSA9IHRvX210OXQwMDEoc3ViZGV2KTsKKworCWZvcm1hdC0+Zm9ybWF0ID0gKl9fbXQ5dDAwMV9nZXRfcGFkX2Zvcm1hdChtdDl0MDAxLCBmaCwgZm9ybWF0LT5wYWQsCisJCQkJCQkgICBmb3JtYXQtPndoaWNoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDl0MDAxX3NldF9mb3JtYXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm9ybWF0KQoreworCXN0cnVjdCBtdDl0MDAxICptdDl0MDAxID0gdG9fbXQ5dDAwMShzdWJkZXYpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKl9fZm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgKl9fY3JvcDsKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgaHJhdGlvOworCXVuc2lnbmVkIGludCB2cmF0aW87CisKKwlfX2Nyb3AgPSBfX210OXQwMDFfZ2V0X3BhZF9jcm9wKG10OXQwMDEsIGZoLCBmb3JtYXQtPnBhZCwKKwkJCQkJZm9ybWF0LT53aGljaCk7CisKKwkvKiBDbGFtcCB0aGUgd2lkdGggYW5kIGhlaWdodCB0byBhdm9pZCBkaXZpZGluZyBieSB6ZXJvLiAqLworCXdpZHRoID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIEFMSUdOKGZvcm1hdC0+Zm9ybWF0LndpZHRoLCAyKSwKKwkJCW1heChfX2Nyb3AtPndpZHRoIC8gOCwgTVQ5VDAwMV9XSU5ET1dfSEVJR0hUX01JTiArIDEpLAorCQkJX19jcm9wLT53aWR0aCk7CisJaGVpZ2h0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIEFMSUdOKGZvcm1hdC0+Zm9ybWF0LmhlaWdodCwgMiksCisJCQkgbWF4KF9fY3JvcC0+aGVpZ2h0IC8gOCwgTVQ5VDAwMV9XSU5ET1dfSEVJR0hUX01JTiArIDEpLAorCQkJIF9fY3JvcC0+aGVpZ2h0KTsKKworCWhyYXRpbyA9IERJVl9ST1VORF9DTE9TRVNUKF9fY3JvcC0+d2lkdGgsIHdpZHRoKTsKKwl2cmF0aW8gPSBESVZfUk9VTkRfQ0xPU0VTVChfX2Nyb3AtPmhlaWdodCwgaGVpZ2h0KTsKKworCV9fZm9ybWF0ID0gX19tdDl0MDAxX2dldF9wYWRfZm9ybWF0KG10OXQwMDEsIGZoLCBmb3JtYXQtPnBhZCwKKwkJCQkJICAgIGZvcm1hdC0+d2hpY2gpOworCV9fZm9ybWF0LT53aWR0aCA9IF9fY3JvcC0+d2lkdGggLyBocmF0aW87CisJX19mb3JtYXQtPmhlaWdodCA9IF9fY3JvcC0+aGVpZ2h0IC8gdnJhdGlvOworCisJZm9ybWF0LT5mb3JtYXQgPSAqX19mb3JtYXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDl0MDAxX2dldF9jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IG10OXQwMDEgKm10OXQwMDEgPSB0b19tdDl0MDAxKHN1YmRldik7CisKKwljcm9wLT5yZWN0ID0gKl9fbXQ5dDAwMV9nZXRfcGFkX2Nyb3AobXQ5dDAwMSwgZmgsIGNyb3AtPnBhZCwKKwkJCQkJICAgICBjcm9wLT53aGljaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9zZXRfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9jcm9wICpjcm9wKQoreworCXN0cnVjdCBtdDl0MDAxICptdDl0MDAxID0gdG9fbXQ5dDAwMShzdWJkZXYpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKl9fZm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgKl9fY3JvcDsKKwlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CisKKwkvKiBDbGFtcCB0aGUgY3JvcCByZWN0YW5nbGUgYm91bmRhcmllcyBhbmQgYWxpZ24gdGhlbSB0byBhIG11bHRpcGxlIG9mIDIKKwkgKiBwaXhlbHMuCisJICovCisJcmVjdC5sZWZ0ID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC5sZWZ0LCAyKSwKKwkJCSAgTVQ5VDAwMV9DT0xVTU5fU1RBUlRfTUlOLAorCQkJICBNVDlUMDAxX0NPTFVNTl9TVEFSVF9NQVgpOworCXJlY3QudG9wID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC50b3AsIDIpLAorCQkJIE1UOVQwMDFfUk9XX1NUQVJUX01JTiwKKwkJCSBNVDlUMDAxX1JPV19TVEFSVF9NQVgpOworCXJlY3Qud2lkdGggPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LndpZHRoLCAyKSwKKwkJCSAgIE1UOVQwMDFfV0lORE9XX1dJRFRIX01JTiArIDEsCisJCQkgICBNVDlUMDAxX1dJTkRPV19XSURUSF9NQVggKyAxKTsKKwlyZWN0LmhlaWdodCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QuaGVpZ2h0LCAyKSwKKwkJCSAgICBNVDlUMDAxX1dJTkRPV19IRUlHSFRfTUlOICsgMSwKKwkJCSAgICBNVDlUMDAxX1dJTkRPV19IRUlHSFRfTUFYICsgMSk7CisKKwlyZWN0LndpZHRoID0gbWluKHJlY3Qud2lkdGgsIE1UOVQwMDFfUElYRUxfQVJSQVlfV0lEVEggLSByZWN0LmxlZnQpOworCXJlY3QuaGVpZ2h0ID0gbWluKHJlY3QuaGVpZ2h0LCBNVDlUMDAxX1BJWEVMX0FSUkFZX0hFSUdIVCAtIHJlY3QudG9wKTsKKworCV9fY3JvcCA9IF9fbXQ5dDAwMV9nZXRfcGFkX2Nyb3AobXQ5dDAwMSwgZmgsIGNyb3AtPnBhZCwgY3JvcC0+d2hpY2gpOworCisJaWYgKHJlY3Qud2lkdGggIT0gX19jcm9wLT53aWR0aCB8fCByZWN0LmhlaWdodCAhPSBfX2Nyb3AtPmhlaWdodCkgeworCQkvKiBSZXNldCB0aGUgb3V0cHV0IGltYWdlIHNpemUgaWYgdGhlIGNyb3AgcmVjdGFuZ2xlIHNpemUgaGFzCisJCSAqIGJlZW4gbW9kaWZpZWQuCisJCSAqLworCQlfX2Zvcm1hdCA9IF9fbXQ5dDAwMV9nZXRfcGFkX2Zvcm1hdChtdDl0MDAxLCBmaCwgY3JvcC0+cGFkLAorCQkJCQkJICAgIGNyb3AtPndoaWNoKTsKKwkJX19mb3JtYXQtPndpZHRoID0gcmVjdC53aWR0aDsKKwkJX19mb3JtYXQtPmhlaWdodCA9IHJlY3QuaGVpZ2h0OworCX0KKworCSpfX2Nyb3AgPSByZWN0OworCWNyb3AtPnJlY3QgPSByZWN0OworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIHN1YmRldiBjb250cm9sIG9wZXJhdGlvbnMKKyAqLworCisjZGVmaW5lIFY0TDJfQ0lEX1RFU1RfUEFUVEVSTgkJKFY0TDJfQ0lEX1VTRVJfQkFTRSB8IDB4MTAwMSkKKyNkZWZpbmUgVjRMMl9DSURfQkxBQ0tfTEVWRUxfQVVUTwkoVjRMMl9DSURfVVNFUl9CQVNFIHwgMHgxMDAyKQorI2RlZmluZSBWNEwyX0NJRF9CTEFDS19MRVZFTF9PRkZTRVQJKFY0TDJfQ0lEX1VTRVJfQkFTRSB8IDB4MTAwMykKKyNkZWZpbmUgVjRMMl9DSURfQkxBQ0tfTEVWRUxfQ0FMSUJSQVRFCShWNEwyX0NJRF9VU0VSX0JBU0UgfCAweDEwMDQpCisKKyNkZWZpbmUgVjRMMl9DSURfR0FJTl9SRUQJCShWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBIHwgMHgxMDAxKQorI2RlZmluZSBWNEwyX0NJRF9HQUlOX0dSRUVOX1JFRAkJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDEwMDIpCisjZGVmaW5lIFY0TDJfQ0lEX0dBSU5fR1JFRU5fQkxVRQkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4MTAwMykKKyNkZWZpbmUgVjRMMl9DSURfR0FJTl9CTFVFCQkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4MTAwNCkKKworc3RhdGljIHUxNiBtdDl0MDAxX2dhaW5fdmFsdWUoczMyICpnYWluKQoreworCS8qIEdhaW4gaXMgY29udHJvbGxlZCBieSAyIGFuYWxvZyBzdGFnZXMgYW5kIGEgZGlnaXRhbCBzdGFnZS4gVmFsaWQKKwkgKiB2YWx1ZXMgZm9yIHRoZSAzIHN0YWdlcyBhcmUKKwkgKgorCSAqIFN0YWdlCQlNaW4JTWF4CVN0ZXAKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBGaXJzdCBhbmFsb2cgc3RhZ2UJeDEJeDIJMQorCSAqIFNlY29uZCBhbmFsb2cgc3RhZ2UJeDEJeDQJMC4xMjUKKwkgKiBEaWdpdGFsIHN0YWdlCXgxCXgxNgkwLjEyNQorCSAqCisJICogVG8gbWluaW1pemUgbm9pc2UsIHRoZSBnYWluIHN0YWdlcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgc2Vjb25kCisJICogYW5hbG9nIHN0YWdlLCBmaXJzdCBhbmFsb2cgc3RhZ2UsIGRpZ2l0YWwgc3RhZ2Ugb3JkZXIuIEdhaW4gZnJvbSBhCisJICogcHJldmlvdXMgc3RhZ2Ugc2hvdWxkIGJlIHB1c2hlZCB0byBpdHMgbWF4aW11bSB2YWx1ZSBiZWZvcmUgdGhlIG5leHQKKwkgKiBzdGFnZSBpcyB1c2VkLgorCSAqLworCWlmICgqZ2FpbiA8PSAzMikKKwkJcmV0dXJuICpnYWluOworCisJaWYgKCpnYWluIDw9IDY0KSB7CisJCSpnYWluICY9IH4xOworCQlyZXR1cm4gKDEgPDwgNikgfCAoKmdhaW4gPj4gMSk7CisJfQorCisJKmdhaW4gJj0gfjc7CisJcmV0dXJuICgoKmdhaW4gLSA2NCkgPDwgNSkgfCAoMSA8PCA2KSB8IDMyOworfQorCitzdGF0aWMgaW50IG10OXQwMDFfY3RybF9mcmVlemUoc3RydWN0IG10OXQwMDEgKm10OXQwMDEsIGJvb2wgZnJlZXplKQoreworCXJldHVybiBtdDl0MDAxX3NldF9vdXRwdXRfY29udHJvbChtdDl0MDAxLAorCQlmcmVlemUgPyAwIDogTVQ5VDAwMV9PVVRQVVRfQ09OVFJPTF9TWU5DLAorCQlmcmVlemUgPyBNVDlUMDAxX09VVFBVVF9DT05UUk9MX1NZTkMgOiAwKTsKK30KKworc3RhdGljIGludCBtdDl0MDAxX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0YXRpYyBjb25zdCB1OCBnYWluc1s0XSA9IHsKKwkJTVQ5VDAwMV9SRURfR0FJTiwgTVQ5VDAwMV9HUkVFTjFfR0FJTiwKKwkJTVQ5VDAwMV9HUkVFTjJfR0FJTiwgTVQ5VDAwMV9CTFVFX0dBSU4KKwl9OworCisJc3RydWN0IG10OXQwMDEgKm10OXQwMDEgPQorCQkJY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBtdDl0MDAxLCBjdHJscyk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXQwMDEtPnN1YmRldik7CisJdW5zaWduZWQgaW50IGNvdW50OworCXVuc2lnbmVkIGludCBpOworCXUxNiB2YWx1ZTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfR0FJTl9SRUQ6CisJY2FzZSBWNEwyX0NJRF9HQUlOX0dSRUVOX1JFRDoKKwljYXNlIFY0TDJfQ0lEX0dBSU5fR1JFRU5fQkxVRToKKwljYXNlIFY0TDJfQ0lEX0dBSU5fQkxVRToKKworCQkvKiBEaXNhYmxlIGNvbnRyb2wgdXBkYXRlcyBpZiBtb3JlIHRoYW4gb25lIGNvbnRyb2wgaGFzIGNoYW5nZWQKKwkJICogaW4gdGhlIGNsdXN0ZXIuCisJCSAqLworCQlmb3IgKGkgPSAwLCBjb3VudCA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCXN0cnVjdCB2NGwyX2N0cmwgKmdhaW4gPSBtdDl0MDAxLT5nYWluc1tpXTsKKworCQkJaWYgKGdhaW4tPnZhbCAhPSBnYWluLT5jdXIudmFsKQorCQkJCWNvdW50Kys7CisJCX0KKworCQlpZiAoY291bnQgPiAxKSB7CisJCQlyZXQgPSBtdDl0MDAxX2N0cmxfZnJlZXplKG10OXQwMDEsIHRydWUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIFVwZGF0ZSB0aGUgZ2FpbiBjb250cm9scy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJc3RydWN0IHY0bDJfY3RybCAqZ2FpbiA9IG10OXQwMDEtPmdhaW5zW2ldOworCisJCQlpZiAoZ2Fpbi0+dmFsID09IGdhaW4tPmN1ci52YWwpCisJCQkJY29udGludWU7CisKKwkJCXZhbHVlID0gbXQ5dDAwMV9nYWluX3ZhbHVlKCZnYWluLT52YWwpOworCQkJcmV0ID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIGdhaW5zW2ldLCB2YWx1ZSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW10OXQwMDFfY3RybF9mcmVlemUobXQ5dDAwMSwgZmFsc2UpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKworCQkvKiBFbmFibGUgY29udHJvbCB1cGRhdGVzLiAqLworCQlpZiAoY291bnQgPiAxKSB7CisJCQlyZXQgPSBtdDl0MDAxX2N0cmxfZnJlZXplKG10OXQwMDEsIGZhbHNlKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1NIVVRURVJfV0lEVEhfTE9XLAorCQkJCSAgICBjdHJsLT52YWwgJiAweGZmZmYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0dXJuIG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1NIVVRURVJfV0lEVEhfSElHSCwKKwkJCQkgICAgIGN0cmwtPnZhbCA+PiAxNik7CisKKwljYXNlIFY0TDJfQ0lEX1RFU1RfUEFUVEVSTjoKKwkJcmV0ID0gbXQ5dDAwMV9zZXRfb3V0cHV0X2NvbnRyb2wobXQ5dDAwMSwKKwkJCWN0cmwtPnZhbCA/IDAgOiBNVDlUMDAxX09VVFBVVF9DT05UUk9MX1RFU1RfREFUQSwKKwkJCWN0cmwtPnZhbCA/IE1UOVQwMDFfT1VUUFVUX0NPTlRST0xfVEVTVF9EQVRBIDogMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXR1cm4gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfVEVTVF9EQVRBLCBjdHJsLT52YWwgPDwgMik7CisKKwljYXNlIFY0TDJfQ0lEX0JMQUNLX0xFVkVMX0FVVE86CisJCXZhbHVlID0gY3RybC0+dmFsID8gMCA6IE1UOVQwMDFfQkxBQ0tfTEVWRUxfT1ZFUlJJREU7CisJCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX0JMQUNLX0xFVkVMX0NBTElCUkFUSU9OLAorCQkJCSAgICB2YWx1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQltdDl0MDAxLT5ibGFja19sZXZlbCA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfQkxBQ0tfTEVWRUxfT0ZGU0VUOgorCQlyZXQgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9HUkVFTjFfT0ZGU0VULCBjdHJsLT52YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfR1JFRU4yX09GRlNFVCwgY3RybC0+dmFsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1JFRF9PRkZTRVQsIGN0cmwtPnZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXR1cm4gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfQkxVRV9PRkZTRVQsIGN0cmwtPnZhbCk7CisKKwljYXNlIFY0TDJfQ0lEX0JMQUNLX0xFVkVMX0NBTElCUkFURToKKwkJcmV0dXJuIG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX0JMQUNLX0xFVkVMX0NBTElCUkFUSU9OLAorCQkJCSAgICAgTVQ5VDAwMV9CTEFDS19MRVZFTF9SRUNBTENVTEFURSB8CisJCQkJICAgICBtdDl0MDAxLT5ibGFja19sZXZlbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBtdDl0MDAxX2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBtdDl0MDAxX3NfY3RybCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBtdDl0MDAxX2N0cmxzW10gPSB7CisJeworCQkub3BzCQk9ICZtdDl0MDAxX2N0cmxfb3BzLAorCQkuaWQJCT0gVjRMMl9DSURfVEVTVF9QQVRURVJOLAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZQkJPSAiVGVzdCBwYXR0ZXJuIiwKKwkJLm1pbgkJPSAwLAorCQkubWF4CQk9IDEwMjMsCisJCS5zdGVwCQk9IDEsCisJCS5kZWYJCT0gMCwKKwkJLmZsYWdzCQk9IDAsCisJfSwgeworCQkub3BzCQk9ICZtdDl0MDAxX2N0cmxfb3BzLAorCQkuaWQJCT0gVjRMMl9DSURfQkxBQ0tfTEVWRUxfQVVUTywKKwkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUJCT0gIkJsYWNrIExldmVsLCBBdXRvIiwKKwkJLm1pbgkJPSAwLAorCQkubWF4CQk9IDEsCisJCS5zdGVwCQk9IDEsCisJCS5kZWYJCT0gMSwKKwkJLmZsYWdzCQk9IDAsCisJfSwgeworCQkub3BzCQk9ICZtdDl0MDAxX2N0cmxfb3BzLAorCQkuaWQJCT0gVjRMMl9DSURfQkxBQ0tfTEVWRUxfT0ZGU0VULAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZQkJPSAiQmxhY2sgTGV2ZWwsIE9mZnNldCIsCisJCS5taW4JCT0gLTI1NiwKKwkJLm1heAkJPSAyNTUsCisJCS5zdGVwCQk9IDEsCisJCS5kZWYJCT0gMzIsCisJCS5mbGFncwkJPSAwLAorCX0sIHsKKwkJLm9wcwkJPSAmbXQ5dDAwMV9jdHJsX29wcywKKwkJLmlkCQk9IFY0TDJfQ0lEX0JMQUNLX0xFVkVMX0NBTElCUkFURSwKKwkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OLAorCQkubmFtZQkJPSAiQmxhY2sgTGV2ZWwsIENhbGlicmF0ZSIsCisJCS5taW4JCT0gMCwKKwkJLm1heAkJPSAwLAorCQkuc3RlcAkJPSAwLAorCQkuZGVmCQk9IDAsCisJCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgbXQ5dDAwMV9nYWluc1tdID0geworCXsKKwkJLm9wcwkJPSAmbXQ5dDAwMV9jdHJsX29wcywKKwkJLmlkCQk9IFY0TDJfQ0lEX0dBSU5fUkVELAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZQkJPSAiR2FpbiwgUmVkIiwKKwkJLm1pbgkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01JTiwKKwkJLm1heAkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01BWCwKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZgkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01JTiwKKwkJLmZsYWdzCQk9IDAsCisJfSwgeworCQkub3BzCQk9ICZtdDl0MDAxX2N0cmxfb3BzLAorCQkuaWQJCT0gVjRMMl9DSURfR0FJTl9HUkVFTl9SRUQsCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lCQk9ICJHYWluLCBHcmVlbiAoUikiLAorCQkubWluCQk9IE1UOVQwMDFfR0xPQkFMX0dBSU5fTUlOLAorCQkubWF4CQk9IE1UOVQwMDFfR0xPQkFMX0dBSU5fTUFYLAorCQkuc3RlcAkJPSAxLAorCQkuZGVmCQk9IE1UOVQwMDFfR0xPQkFMX0dBSU5fTUlOLAorCQkuZmxhZ3MJCT0gMCwKKwl9LCB7CisJCS5vcHMJCT0gJm10OXQwMDFfY3RybF9vcHMsCisJCS5pZAkJPSBWNEwyX0NJRF9HQUlOX0dSRUVOX0JMVUUsCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lCQk9ICJHYWluLCBHcmVlbiAoQikiLAorCQkubWluCQk9IE1UOVQwMDFfR0xPQkFMX0dBSU5fTUlOLAorCQkubWF4CQk9IE1UOVQwMDFfR0xPQkFMX0dBSU5fTUFYLAorCQkuc3RlcAkJPSAxLAorCQkuZGVmCQk9IE1UOVQwMDFfR0xPQkFMX0dBSU5fTUlOLAorCQkuZmxhZ3MJCT0gMCwKKwl9LCB7CisJCS5vcHMJCT0gJm10OXQwMDFfY3RybF9vcHMsCisJCS5pZAkJPSBWNEwyX0NJRF9HQUlOX0JMVUUsCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lCQk9ICJHYWluLCBCbHVlIiwKKwkJLm1pbgkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01JTiwKKwkJLm1heAkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01BWCwKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZgkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01JTiwKKwkJLmZsYWdzCQk9IDAsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIHN1YmRldiBpbnRlcm5hbCBvcGVyYXRpb25zCisgKi8KKworc3RhdGljIGludCBtdDl0MDAxX29wZW4oc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCit7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3A7CisKKwljcm9wID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9jcm9wKGZoLCAwKTsKKwljcm9wLT5sZWZ0ID0gTVQ5VDAwMV9DT0xVTU5fU1RBUlRfREVGOworCWNyb3AtPnRvcCA9IE1UOVQwMDFfUk9XX1NUQVJUX0RFRjsKKwljcm9wLT53aWR0aCA9IE1UOVQwMDFfV0lORE9XX1dJRFRIX0RFRiArIDE7CisJY3JvcC0+aGVpZ2h0ID0gTVQ5VDAwMV9XSU5ET1dfSEVJR0hUX0RFRiArIDE7CisKKwlmb3JtYXQgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgMCk7CisJZm9ybWF0LT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTA7CisJZm9ybWF0LT53aWR0aCA9IE1UOVQwMDFfV0lORE9XX1dJRFRIX0RFRiArIDE7CisJZm9ybWF0LT5oZWlnaHQgPSBNVDlUMDAxX1dJTkRPV19IRUlHSFRfREVGICsgMTsKKwlmb3JtYXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCWZvcm1hdC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG10OXQwMDFfc3ViZGV2X3ZpZGVvX29wcyA9IHsKKwkuc19zdHJlYW0gPSBtdDl0MDAxX3Nfc3RyZWFtLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfb3BzIG10OXQwMDFfc3ViZGV2X3BhZF9vcHMgPSB7CisJLmVudW1fbWJ1c19jb2RlID0gbXQ5dDAwMV9lbnVtX21idXNfY29kZSwKKwkuZW51bV9mcmFtZV9zaXplID0gbXQ5dDAwMV9lbnVtX2ZyYW1lX3NpemUsCisJLmdldF9mbXQgPSBtdDl0MDAxX2dldF9mb3JtYXQsCisJLnNldF9mbXQgPSBtdDl0MDAxX3NldF9mb3JtYXQsCisJLmdldF9jcm9wID0gbXQ5dDAwMV9nZXRfY3JvcCwKKwkuc2V0X2Nyb3AgPSBtdDl0MDAxX3NldF9jcm9wLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXQ5dDAwMV9zdWJkZXZfb3BzID0geworCS52aWRlbyA9ICZtdDl0MDAxX3N1YmRldl92aWRlb19vcHMsCisJLnBhZCA9ICZtdDl0MDAxX3N1YmRldl9wYWRfb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXQ5dDAwMV9zdWJkZXZfaW50ZXJuYWxfb3BzID0geworCS5vcGVuID0gbXQ5dDAwMV9vcGVuLAorfTsKKworc3RhdGljIGludCBtdDl0MDAxX3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG10OXQwMDFfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXMzMiBkYXRhOworCWludCByZXQ7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJQcm9iaW5nIE1UOVQwMDEgYXQgYWRkcmVzcyAweCUwMnhcbiIsCisJCSBjbGllbnQtPmFkZHIpOworCisJLyogUmVzZXQgdGhlIGNoaXAgYW5kIHN0b3AgZGF0YSByZWFkIG91dCAqLworCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1JFU0VULCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1JFU0VULCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCAgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9PVVRQVVRfQ09OVFJPTCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBDb25maWd1cmUgdGhlIHBpeGVsIGNsb2NrIHBvbGFyaXR5ICovCisJaWYgKHBkYXRhICYmIHBkYXRhLT5jbGtfcG9sKSB7CisJCXJldCAgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9QSVhFTF9DTE9DSywKKwkJCQkgICAgIE1UOVQwMDFfUElYRUxfQ0xPQ0tfSU5WRVJUKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJlYWQgYW5kIGNoZWNrIHRoZSBzZW5zb3IgdmVyc2lvbiAqLworCWRhdGEgPSBtdDl0MDAxX3JlYWQoY2xpZW50LCBNVDlUMDAxX0NISVBfVkVSU0lPTik7CisJaWYgKGRhdGEgIT0gTVQ5VDAwMV9DSElQX0lEKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTVQ5VDAwMSBub3QgZGV0ZWN0ZWQsIHdyb25nIHZlcnNpb24gIgorCQkJIjB4JTA0eFxuIiwgZGF0YSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIk1UOVQwMDEgZGV0ZWN0ZWQgYXQgYWRkcmVzcyAweCUwMnhcbiIsCisJCSBjbGllbnQtPmFkZHIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDl0MDAxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKK3sKKwlzdHJ1Y3QgbXQ5dDAwMSAqbXQ5dDAwMTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKSB7CisJCWRldl93YXJuKCZjbGllbnQtPmFkYXB0ZXItPmRldiwKKwkJCSAiSTJDLUFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0IEkyQ19GVU5DX1NNQlVTX1dPUkRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBtdDl0MDAxX3ZpZGVvX3Byb2JlKGNsaWVudCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltdDl0MDAxID0ga3phbGxvYyhzaXplb2YoKm10OXQwMDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10OXQwMDEpCisJCXJldHVybiAtRU5PTUVNOworCisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmbXQ5dDAwMS0+Y3RybHMsIEFSUkFZX1NJWkUobXQ5dDAwMV9jdHJscykgKworCQkJCQkJQVJSQVlfU0laRShtdDl0MDAxX2dhaW5zKSArIDIpOworCisJdjRsMl9jdHJsX25ld19zdGQoJm10OXQwMDEtPmN0cmxzLCAmbXQ5dDAwMV9jdHJsX29wcywKKwkJCSAgVjRMMl9DSURfRVhQT1NVUkUsIE1UOVQwMDFfU0hVVFRFUl9XSURUSF9NSU4sCisJCQkgIE1UOVQwMDFfU0hVVFRFUl9XSURUSF9NQVgsIDEsCisJCQkgIE1UOVQwMDFfU0hVVFRFUl9XSURUSF9ERUYpOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDl0MDAxLT5jdHJscywgJm10OXQwMDFfY3RybF9vcHMsCisJCQkgIFY0TDJfQ0lEX0JMQUNLX0xFVkVMLCAxLCAxLCAxLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10OXQwMDFfY3RybHMpOyArK2kpCisJCXY0bDJfY3RybF9uZXdfY3VzdG9tKCZtdDl0MDAxLT5jdHJscywgJm10OXQwMDFfY3RybHNbaV0sIE5VTEwpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ5dDAwMV9nYWlucyk7ICsraSkKKwkJbXQ5dDAwMS0+Z2FpbnNbaV0gPSB2NGwyX2N0cmxfbmV3X2N1c3RvbSgmbXQ5dDAwMS0+Y3RybHMsCisJCQkmbXQ5dDAwMV9nYWluc1tpXSwgTlVMTCk7CisKKwl2NGwyX2N0cmxfY2x1c3RlcihBUlJBWV9TSVpFKG10OXQwMDFfZ2FpbnMpLCBtdDl0MDAxLT5nYWlucyk7CisKKwltdDl0MDAxLT5zdWJkZXYuY3RybF9oYW5kbGVyID0gJm10OXQwMDEtPmN0cmxzOworCisJaWYgKG10OXQwMDEtPmN0cmxzLmVycm9yKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb250cm9sIGluaXRpYWxpemF0aW9uIGVycm9yICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIG10OXQwMDEtPmN0cmxzLmVycm9yKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW10OXQwMDEtPmNyb3AubGVmdCA9IE1UOVQwMDFfQ09MVU1OX1NUQVJUX0RFRjsKKwltdDl0MDAxLT5jcm9wLnRvcCA9IE1UOVQwMDFfUk9XX1NUQVJUX0RFRjsKKwltdDl0MDAxLT5jcm9wLndpZHRoID0gTVQ5VDAwMV9XSU5ET1dfV0lEVEhfREVGICsgMTsKKwltdDl0MDAxLT5jcm9wLmhlaWdodCA9IE1UOVQwMDFfV0lORE9XX0hFSUdIVF9ERUYgKyAxOworCisJbXQ5dDAwMS0+Zm9ybWF0LmNvZGUgPSBWNEwyX01CVVNfRk1UX1NHUkJHMTBfMVgxMDsKKwltdDl0MDAxLT5mb3JtYXQud2lkdGggPSBNVDlUMDAxX1dJTkRPV19XSURUSF9ERUYgKyAxOworCW10OXQwMDEtPmZvcm1hdC5oZWlnaHQgPSBNVDlUMDAxX1dJTkRPV19IRUlHSFRfREVGICsgMTsKKwltdDl0MDAxLT5mb3JtYXQuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJbXQ5dDAwMS0+Zm9ybWF0LmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKworCXY0bDJfaTJjX3N1YmRldl9pbml0KCZtdDl0MDAxLT5zdWJkZXYsIGNsaWVudCwgJm10OXQwMDFfc3ViZGV2X29wcyk7CisJbXQ5dDAwMS0+c3ViZGV2LmludGVybmFsX29wcyA9ICZtdDl0MDAxX3N1YmRldl9pbnRlcm5hbF9vcHM7CisJbXQ5dDAwMS0+c3ViZGV2LmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOworCisJbXQ5dDAwMS0+cGFkLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKKwlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmbXQ5dDAwMS0+c3ViZGV2LmVudGl0eSwgMSwgJm10OXQwMDEtPnBhZCwgMCk7CisKK2RvbmU6CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmbXQ5dDAwMS0+Y3RybHMpOworCQltZWRpYV9lbnRpdHlfY2xlYW51cCgmbXQ5dDAwMS0+c3ViZGV2LmVudGl0eSk7CisJCWtmcmVlKG10OXQwMDEpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtdDl0MDAxICptdDl0MDAxID0gdG9fbXQ5dDAwMShzdWJkZXYpOworCisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmbXQ5dDAwMS0+Y3RybHMpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHN1YmRldik7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnN1YmRldi0+ZW50aXR5KTsKKwlrZnJlZShtdDl0MDAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG10OXQwMDFfaWRbXSA9IHsKKwl7ICJtdDl0MDAxIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtdDl0MDAxX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG10OXQwMDFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm10OXQwMDEiLAorCX0sCisJLnByb2JlCQk9IG10OXQwMDFfcHJvYmUsCisJLnJlbW92ZQkJPSBtdDl0MDAxX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBtdDl0MDAxX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXQ5dDAwMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtdDl0MDAxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdDl0MDAxX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbXQ5dDAwMV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtdDl0MDAxX2luaXQpOworbW9kdWxlX2V4aXQobXQ5dDAwMV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBcHRpbmEgKE1pY3JvbikgTVQ5VDAwMSBDYW1lcmEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQwMzEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jCmluZGV4IDMwNTQ3Y2MuLjBlNzg0NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jCkBAIC0xMywxMSArMTMsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorCisvKgorICogQVRURU5USU9OOiB0aGlzIGRyaXZlciBzdGlsbCBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBzb2MtY2FtZXJhCisgKiBmcmFtZXdvcmsgYmVjYXVzZSBvZiBpdHMgUE0gaW1wbGVtZW50YXRpb24sIHVzaW5nIHRoZSB2aWRlb19kZXZpY2Ugbm9kZS4KKyAqIElmIGhhcmR3YXJlIGJlY29tZXMgYXZhaWxhYmxlIGZvciB0ZXN0aW5nLCBhbHRlcm5hdGl2ZSBQTSBhcHByb2FjaGVzIHNoYWxsCisgKiBiZSBjb25zaWRlcmVkIGFuZCB0ZXN0ZWQuCisgKi8KIAogLyoKICAqIG10OXQwMzEgaTJjIGFkZHJlc3MgMHg1ZApAQCAtNTcsMjEgKzY3LDIwIEBACiAjZGVmaW5lIE1UOVQwMzFfQ09MVU1OX1NLSVAJCTMyCiAjZGVmaW5lIE1UOVQwMzFfUk9XX1NLSVAJCTIwCiAKLSNkZWZpbmUgTVQ5VDAzMV9CVVNfUEFSQU0JKFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8CVwKLQlTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HIHwgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAlcCi0JU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9EQVRBX0FDVElWRV9ISUdIIHwJXAotCVNPQ0FNX01BU1RFUiB8IFNPQ0FNX0RBVEFXSURUSF8xMCkKLQogc3RydWN0IG10OXQwMzEgewogCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGhkbDsKKwlzdHJ1Y3QgeworCQkvKiBleHBvc3VyZS9hdXRvLWV4cG9zdXJlIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybCAqYXV0b2V4cG9zdXJlOworCQlzdHJ1Y3QgdjRsMl9jdHJsICpleHBvc3VyZTsKKwl9OwogCXN0cnVjdCB2NGwyX3JlY3QgcmVjdDsJLyogU2Vuc29yIHdpbmRvdyAqLwogCWludCBtb2RlbDsJLyogVjRMMl9JREVOVF9NVDlUMDMxKiBjb2RlcyBmcm9tIHY0bDItY2hpcC1pZGVudC5oICovCiAJdTE2IHhza2lwOwogCXUxNiB5c2tpcDsKLQl1bnNpZ25lZCBpbnQgZ2FpbjsKKwl1bnNpZ25lZCBpbnQgdG90YWxfaDsKIAl1bnNpZ25lZCBzaG9ydCB5X3NraXBfdG9wOwkvKiBMaW5lcyB0byBza2lwIGF0IHRoZSB0b3AgKi8KLQl1bnNpZ25lZCBpbnQgZXhwb3N1cmU7Ci0JdW5zaWduZWQgY2hhciBhdXRvZXhwb3N1cmU7CiB9OwogCiBzdGF0aWMgc3RydWN0IG10OXQwMzEgKnRvX210OXQwMzEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKQEAgLTE3OSw5NSArMTg4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdDl0MDMxX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQodG9fc29jX2NhbWVyYV9jb250cm9sKGljZCkpOwotCi0JLyogVGhlIGNhbGxlciBzaG91bGQgaGF2ZSBxdWVyaWVkIG91ciBwYXJhbWV0ZXJzLCBjaGVjayBhbnl3YXkgKi8KLQlpZiAoZmxhZ3MgJiB+TVQ5VDAzMV9CVVNfUEFSQU0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykKLQkJcmVnX2NsZWFyKGNsaWVudCwgTVQ5VDAzMV9QSVhFTF9DTE9DS19DT05UUk9MLCAweDgwMDApOwotCWVsc2UKLQkJcmVnX3NldChjbGllbnQsIE1UOVQwMzFfUElYRUxfQ0xPQ0tfQ09OVFJPTCwgMHg4MDAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtdDl0MDMxX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIE1UOVQwMzFfQlVTX1BBUkFNKTsKLX0KLQotZW51bSB7Ci0JTVQ5VDAzMV9DVFJMX1ZGTElQLAotCU1UOVQwMzFfQ1RSTF9IRkxJUCwKLQlNVDlUMDMxX0NUUkxfR0FJTiwKLQlNVDlUMDMxX0NUUkxfRVhQT1NVUkUsCi0JTVQ5VDAzMV9DVFJMX0VYUE9TVVJFX0FVVE8sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIG10OXQwMzFfY29udHJvbHNbXSA9IHsKLQlbTVQ5VDAzMV9DVFJMX1ZGTElQXSA9IHsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotCVtNVDlUMDMxX0NUUkxfSEZMSVBdID0gewotCQkuaWQJCT0gVjRMMl9DSURfSEZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJGbGlwIEhvcml6b250YWxseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLQlbTVQ5VDAzMV9DVFJMX0dBSU5dID0gewotCQkuaWQJCT0gVjRMMl9DSURfR0FJTiwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkdhaW4iLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMTI3LAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDY0LAotCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSLAotCX0sCi0JW01UOVQwMzFfQ1RSTF9FWFBPU1VSRV0gPSB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9FWFBPU1VSRSwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkV4cG9zdXJlIiwKLQkJLm1pbmltdW0JPSAxLAotCQkubWF4aW11bQk9IDI1NSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAyNTUsCi0JCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19TTElERVIsCi0JfSwKLQlbTVQ5VDAzMV9DVFJMX0VYUE9TVVJFX0FVVE9dID0gewotCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkVfQVVUTywKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkF1dG9tYXRpYyBFeHBvc3VyZSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBtdDl0MDMxX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSBtdDl0MDMxX3NldF9idXNfcGFyYW0sCi0JLnF1ZXJ5X2J1c19wYXJhbQk9IG10OXQwMzFfcXVlcnlfYnVzX3BhcmFtLAotCS5jb250cm9scwkJPSBtdDl0MDMxX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtdDl0MDMxX2NvbnRyb2xzKSwKLX07Ci0KIC8qIHRhcmdldCBtdXN0IGJlIF9ldmVuXyAqLwogc3RhdGljIHUxNiBtdDl0MDMxX3NraXAoczMyICpzb3VyY2UsIHMzMiB0YXJnZXQsIHMzMiBtYXgpCiB7CkBAIC0zNTMsNyArMjczLDcgQEAKIAogCS8qCiAJICogVGhlIGNhbGxlciBwcm92aWRlcyBhIHN1cHBvcnRlZCBmb3JtYXQsIGFzIGd1YXJhbnRlZWQgYnkKLQkgKiBpY2QtPnRyeV9mbXRfY2FwKCksIHNvY19jYW1lcmFfc19jcm9wKCkgYW5kIHNvY19jYW1lcmFfY3JvcGNhcCgpCisJICogLnRyeV9tYnVzX2ZtdCgpLCBzb2NfY2FtZXJhX3NfY3JvcCgpIGFuZCBzb2NfY2FtZXJhX2Nyb3BjYXAoKQogCSAqLwogCWlmIChyZXQgPj0gMCkKIAkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5VDAzMV9DT0xVTU5fU1RBUlQsIHJlY3QtPmxlZnQpOwpAQCAtMzY0LDE3ICsyODQsMTAgQEAKIAlpZiAocmV0ID49IDApCiAJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIE1UOVQwMzFfV0lORE9XX0hFSUdIVCwKIAkJCQlyZWN0LT5oZWlnaHQgKyBtdDl0MDMxLT55X3NraXBfdG9wIC0gMSk7Ci0JaWYgKHJldCA+PSAwICYmIG10OXQwMzEtPmF1dG9leHBvc3VyZSkgewotCQl1bnNpZ25lZCBpbnQgdG90YWxfaCA9IHJlY3QtPmhlaWdodCArIG10OXQwMzEtPnlfc2tpcF90b3AgKyB2Ymxhbms7Ci0JCXJldCA9IHNldF9zaHV0dGVyKGNsaWVudCwgdG90YWxfaCk7Ci0JCWlmIChyZXQgPj0gMCkgewotCQkJY29uc3QgdTMyIHNodXR0ZXJfbWF4ID0gTVQ5VDAzMV9NQVhfSEVJR0hUICsgdmJsYW5rOwotCQkJY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCA9Ci0JCQkJJm10OXQwMzFfY29udHJvbHNbTVQ5VDAzMV9DVFJMX0VYUE9TVVJFXTsKLQkJCW10OXQwMzEtPmV4cG9zdXJlID0gKHNodXR0ZXJfbWF4IC8gMiArICh0b3RhbF9oIC0gMSkgKgotCQkJCSAocWN0cmwtPm1heGltdW0gLSBxY3RybC0+bWluaW11bSkpIC8KLQkJCQlzaHV0dGVyX21heCArIHFjdHJsLT5taW5pbXVtOwotCQl9CisJaWYgKHJldCA+PSAwICYmIHY0bDJfY3RybF9nX2N0cmwobXQ5dDAzMS0+YXV0b2V4cG9zdXJlKSA9PSBWNEwyX0VYUE9TVVJFX0FVVE8pIHsKKwkJbXQ5dDAzMS0+dG90YWxfaCA9IHJlY3QtPmhlaWdodCArIG10OXQwMzEtPnlfc2tpcF90b3AgKyB2Ymxhbms7CisKKwkJcmV0ID0gc2V0X3NodXR0ZXIoY2xpZW50LCBtdDl0MDMxLT50b3RhbF9oKTsKIAl9CiAKIAkvKiBSZS1lbmFibGUgcmVnaXN0ZXIgdXBkYXRlLCBjb21taXQgYWxsIGNoYW5nZXMgKi8KQEAgLTU0Myw3MSArNDU2LDU3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBtdDl0MDMxX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCBtdDl0MDMxX2dfdm9sYXRpbGVfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5dDAzMSAqbXQ5dDAzMSA9IHRvX210OXQwMzEoY2xpZW50KTsKLQlpbnQgZGF0YTsKKwlzdHJ1Y3QgbXQ5dDAzMSAqbXQ5dDAzMSA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLAorCQkJCQkgICAgICAgc3RydWN0IG10OXQwMzEsIGhkbCk7CisJY29uc3QgdTMyIHNodXR0ZXJfbWF4ID0gTVQ5VDAzMV9NQVhfSEVJR0hUICsgTVQ5VDAzMV9WRVJUSUNBTF9CTEFOSzsKKwlzMzIgbWluLCBtYXg7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJZGF0YSA9IHJlZ19yZWFkKGNsaWVudCwgTVQ5VDAzMV9SRUFEX01PREVfMik7Ci0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9ICEhKGRhdGEgJiAweDgwMDApOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBNVDlUMDMxX1JFQURfTU9ERV8yKTsKLQkJaWYgKGRhdGEgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0JCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIDB4NDAwMCk7Ci0JCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKLQkJY3RybC0+dmFsdWUgPSBtdDl0MDMxLT5hdXRvZXhwb3N1cmU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJY3RybC0+dmFsdWUgPSBtdDl0MDMxLT5nYWluOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQljdHJsLT52YWx1ZSA9IG10OXQwMzEtPmV4cG9zdXJlOworCQltaW4gPSBtdDl0MDMxLT5leHBvc3VyZS0+bWluaW11bTsKKwkJbWF4ID0gbXQ5dDAzMS0+ZXhwb3N1cmUtPm1heGltdW07CisJCW10OXQwMzEtPmV4cG9zdXJlLT52YWwgPQorCQkJKHNodXR0ZXJfbWF4IC8gMiArIChtdDl0MDMxLT50b3RhbF9oIC0gMSkgKiAobWF4IC0gbWluKSkKKwkJCQkvIHNodXR0ZXJfbWF4ICsgbWluOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5dDAzMV9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgbXQ5dDAzMV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKKwlzdHJ1Y3QgbXQ5dDAzMSAqbXQ5dDAzMSA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLAorCQkJCQkgICAgICAgc3RydWN0IG10OXQwMzEsIGhkbCk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZtdDl0MDMxLT5zdWJkZXY7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxID0gdG9fbXQ5dDAzMShjbGllbnQpOwotCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmw7CisJc3RydWN0IHY0bDJfY3RybCAqZXhwID0gbXQ5dDAzMS0+ZXhwb3N1cmU7CiAJaW50IGRhdGE7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJaWYgKGN0cmwtPnZhbHVlKQorCQlpZiAoY3RybC0+dmFsKQogCQkJZGF0YSA9IHJlZ19zZXQoY2xpZW50LCBNVDlUMDMxX1JFQURfTU9ERV8yLCAweDgwMDApOwogCQllbHNlCiAJCQlkYXRhID0gcmVnX2NsZWFyKGNsaWVudCwgTVQ5VDAzMV9SRUFEX01PREVfMiwgMHg4MDAwKTsKIAkJaWYgKGRhdGEgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOworCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlpZiAoY3RybC0+dmFsdWUpCisJCWlmIChjdHJsLT52YWwpCiAJCQlkYXRhID0gcmVnX3NldChjbGllbnQsIE1UOVQwMzFfUkVBRF9NT0RFXzIsIDB4NDAwMCk7CiAJCWVsc2UKIAkJCWRhdGEgPSByZWdfY2xlYXIoY2xpZW50LCBNVDlUMDMxX1JFQURfTU9ERV8yLCAweDQwMDApOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7CisJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJcWN0cmwgPSAmbXQ5dDAzMV9jb250cm9sc1tNVDlUMDMxX0NUUkxfR0FJTl07Ci0JCWlmIChjdHJsLT52YWx1ZSA+IHFjdHJsLT5tYXhpbXVtIHx8IGN0cmwtPnZhbHVlIDwgcWN0cmwtPm1pbmltdW0pCi0JCQlyZXR1cm4gLUVJTlZBTDsKIAkJLyogU2VlIERhdGFzaGVldCBUYWJsZSA3LCBHYWluIHNldHRpbmdzLiAqLwotCQlpZiAoY3RybC0+dmFsdWUgPD0gcWN0cmwtPmRlZmF1bHRfdmFsdWUpIHsKKwkJaWYgKGN0cmwtPnZhbCA8PSBjdHJsLT5kZWZhdWx0X3ZhbHVlKSB7CiAJCQkvKiBQYWNrIGl0IGludG8gMC4uMSBzdGVwIDAuMTI1LCByZWdpc3RlciB2YWx1ZXMgMC4uOCAqLwotCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IHFjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gcWN0cmwtPm1pbmltdW07Ci0JCQlkYXRhID0gKChjdHJsLT52YWx1ZSAtIHFjdHJsLT5taW5pbXVtKSAqIDggKyByYW5nZSAvIDIpIC8gcmFuZ2U7CisJCQl1bnNpZ25lZCBsb25nIHJhbmdlID0gY3RybC0+ZGVmYXVsdF92YWx1ZSAtIGN0cmwtPm1pbmltdW07CisJCQlkYXRhID0gKChjdHJsLT52YWwgLSBjdHJsLT5taW5pbXVtKSAqIDggKyByYW5nZSAvIDIpIC8gcmFuZ2U7CiAKIAkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU2V0dGluZyBnYWluICVkXG4iLCBkYXRhKTsKIAkJCWRhdGEgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlUMDMxX0dMT0JBTF9HQUlOLCBkYXRhKTsKQEAgLTYxNiw5ICs1MTUsOSBAQAogCQl9IGVsc2UgewogCQkJLyogUGFjayBpdCBpbnRvIDEuMTI1Li4xMjggdmFyaWFibGUgc3RlcCwgcmVnaXN0ZXIgdmFsdWVzIDkuLjB4Nzg2MCAqLwogCQkJLyogV2UgYXNzdW1lIHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxID4gMCAqLwotCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxOworCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IGN0cmwtPm1heGltdW0gLSBjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gMTsKIAkJCS8qIGNhbGN1bGF0ZWQgZ2FpbjogbWFwIDY1Li4xMjcgdG8gOS4uMTAyNCBzdGVwIDAuMTI1ICovCi0JCQl1bnNpZ25lZCBsb25nIGdhaW4gPSAoKGN0cmwtPnZhbHVlIC0gcWN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxKSAqCisJCQl1bnNpZ25lZCBsb25nIGdhaW4gPSAoKGN0cmwtPnZhbCAtIGN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxKSAqCiAJCQkJCSAgICAgICAxMDE1ICsgcmFuZ2UgLyAyKSAvIHJhbmdlICsgOTsKIAogCQkJaWYgKGdhaW4gPD0gMzIpCQkvKiBjYWxjdWxhdGVkIGdhaW4gOS4uMzIgLT4gOS4uMzIgKi8KQEAgLTYzNSwxOSArNTM0LDEzIEBACiAJCQlpZiAoZGF0YSA8IDApCiAJCQkJcmV0dXJuIC1FSU87CiAJCX0KKwkJcmV0dXJuIDA7CiAKLQkJLyogU3VjY2VzcyAqLwotCQltdDl0MDMxLT5nYWluID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCXFjdHJsID0gJm10OXQwMzFfY29udHJvbHNbTVQ5VDAzMV9DVFJMX0VYUE9TVVJFXTsKLQkJLyogbXQ5dDAzMSBoYXMgbWF4aW11bSA9PSBkZWZhdWx0ICovCi0JCWlmIChjdHJsLT52YWx1ZSA+IHFjdHJsLT5tYXhpbXVtIHx8IGN0cmwtPnZhbHVlIDwgcWN0cmwtPm1pbmltdW0pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZWxzZSB7Ci0JCQljb25zdCB1bnNpZ25lZCBsb25nIHJhbmdlID0gcWN0cmwtPm1heGltdW0gLSBxY3RybC0+bWluaW11bTsKLQkJCWNvbnN0IHUzMiBzaHV0dGVyID0gKChjdHJsLT52YWx1ZSAtIHFjdHJsLT5taW5pbXVtKSAqIDEwNDggKwotCQkJCQkgICAgIHJhbmdlIC8gMikgLyByYW5nZSArIDE7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgorCQlpZiAoY3RybC0+dmFsID09IFY0TDJfRVhQT1NVUkVfTUFOVUFMKSB7CisJCQl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBleHAtPm1heGltdW0gLSBleHAtPm1pbmltdW07CisJCQl1bnNpZ25lZCBpbnQgc2h1dHRlciA9ICgoZXhwLT52YWwgLSBleHAtPm1pbmltdW0pICogMTA0OCArCisJCQkJCQkgcmFuZ2UgLyAyKSAvIHJhbmdlICsgMTsKIAkJCXUzMiBvbGQ7CiAKIAkJCWdldF9zaHV0dGVyKGNsaWVudCwgJm9sZCk7CkBAIC02NTUsMjcgKzU0OCwxNSBAQAogCQkJCW9sZCwgc2h1dHRlcik7CiAJCQlpZiAoc2V0X3NodXR0ZXIoY2xpZW50LCBzaHV0dGVyKSA8IDApCiAJCQkJcmV0dXJuIC1FSU87Ci0JCQltdDl0MDMxLT5leHBvc3VyZSA9IGN0cmwtPnZhbHVlOwotCQkJbXQ5dDAzMS0+YXV0b2V4cG9zdXJlID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86Ci0JCWlmIChjdHJsLT52YWx1ZSkgeworCQl9IGVsc2UgewogCQkJY29uc3QgdTE2IHZibGFuayA9IE1UOVQwMzFfVkVSVElDQUxfQkxBTks7Ci0JCQljb25zdCB1MzIgc2h1dHRlcl9tYXggPSBNVDlUMDMxX01BWF9IRUlHSFQgKyB2Ymxhbms7Ci0JCQl1bnNpZ25lZCBpbnQgdG90YWxfaCA9IG10OXQwMzEtPnJlY3QuaGVpZ2h0ICsKKwkJCW10OXQwMzEtPnRvdGFsX2ggPSBtdDl0MDMxLT5yZWN0LmhlaWdodCArCiAJCQkJbXQ5dDAzMS0+eV9za2lwX3RvcCArIHZibGFuazsKIAotCQkJaWYgKHNldF9zaHV0dGVyKGNsaWVudCwgdG90YWxfaCkgPCAwKQorCQkJaWYgKHNldF9zaHV0dGVyKGNsaWVudCwgbXQ5dDAzMS0+dG90YWxfaCkgPCAwKQogCQkJCXJldHVybiAtRUlPOwotCQkJcWN0cmwgPSAmbXQ5dDAzMV9jb250cm9sc1tNVDlUMDMxX0NUUkxfRVhQT1NVUkVdOwotCQkJbXQ5dDAzMS0+ZXhwb3N1cmUgPSAoc2h1dHRlcl9tYXggLyAyICsgKHRvdGFsX2ggLSAxKSAqCi0JCQkJIChxY3RybC0+bWF4aW11bSAtIHFjdHJsLT5taW5pbXVtKSkgLwotCQkJCXNodXR0ZXJfbWF4ICsgcWN0cmwtPm1pbmltdW07Ci0JCQltdDl0MDMxLT5hdXRvZXhwb3N1cmUgPSAxOwotCQl9IGVsc2UKLQkJCW10OXQwMzEtPmF1dG9leHBvc3VyZSA9IDA7Ci0JCWJyZWFrOworCQl9CisJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTcwMCw4ICs1ODEsNyBAQAogc3RhdGljIGludCBtdDl0MDMxX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdG9fdmlkZW9fZGV2aWNlKGRldik7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBkZXZfZ2V0X2RydmRhdGEodmRldi0+cGFyZW50KTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV92ZGV2X3RvX3N1YmRldih2ZGV2KTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSB0b19tdDl0MDMxKGNsaWVudCk7CiAKQEAgLTczNCw2ICs2MTQsMTkgQEAKIAkucG0JPSAmbXQ5dDAzMV9kZXZfcG1fb3BzLAogfTsKIAorc3RhdGljIGludCBtdDl0MDMxX3NfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gc29jX2NhbWVyYV9pMmNfdG9fdmRldihjbGllbnQpOworCisJaWYgKG9uKQorCQl2ZGV2LT5kZXYudHlwZSA9ICZtdDl0MDMxX2Rldl90eXBlOworCWVsc2UKKwkJdmRldi0+ZGV2LnR5cGUgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBJbnRlcmZhY2UgYWN0aXZlLCBjYW4gdXNlIGkyYy4gSWYgaXQgZmFpbHMsIGl0IGNhbiBpbmRlZWQgbWVhbiwgdGhhdAogICogdGhpcyB3YXNuJ3Qgb3VyIGNhcHR1cmUgaW50ZXJmYWNlLCBzbywgd2Ugd2FpdCBmb3IgdGhlIHJpZ2h0IG9uZQpAQCAtNzQxLDcgKzYzNCw2IEBACiBzdGF0aWMgaW50IG10OXQwMzFfdmlkZW9fcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbXQ5dDAzMSAqbXQ5dDAzMSA9IHRvX210OXQwMzEoY2xpZW50KTsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gc29jX2NhbWVyYV9pMmNfdG9fdmRldihjbGllbnQpOwogCXMzMiBkYXRhOwogCWludCByZXQ7CiAKQEAgLTc2OCwxMSArNjYwLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gaW5pdGlhbGlzZSB0aGUgY2FtZXJhXG4iKTsKIAllbHNlCi0JCXZkZXYtPmRldi50eXBlID0gJm10OXQwMzFfZGV2X3R5cGU7Ci0KLQkvKiBtdDl0MDMxX2lkbGUoKSBoYXMgcmVzZXQgdGhlIGNoaXAgdG8gZGVmYXVsdC4gKi8KLQltdDl0MDMxLT5leHBvc3VyZSA9IDI1NTsKLQltdDl0MDMxLT5nYWluID0gNjQ7CisJCXY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZtdDl0MDMxLT5oZGwpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc4NywxMCArNjc1LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBtdDl0MDMxX2N0cmxfb3BzID0geworCS5nX3ZvbGF0aWxlX2N0cmwgPSBtdDl0MDMxX2dfdm9sYXRpbGVfY3RybCwKKwkuc19jdHJsID0gbXQ5dDAzMV9zX2N0cmwsCit9OworCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG10OXQwMzFfc3ViZGV2X2NvcmVfb3BzID0gewotCS5nX2N0cmwJCT0gbXQ5dDAzMV9nX2N0cmwsCi0JLnNfY3RybAkJPSBtdDl0MDMxX3NfY3RybCwKIAkuZ19jaGlwX2lkZW50CT0gbXQ5dDAzMV9nX2NoaXBfaWRlbnQsCisJLnNfcG93ZXIJPSBtdDl0MDMxX3NfcG93ZXIsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCS5nX3JlZ2lzdGVyCT0gbXQ5dDAzMV9nX3JlZ2lzdGVyLAogCS5zX3JlZ2lzdGVyCT0gbXQ5dDAzMV9zX3JlZ2lzdGVyLApAQCAtODA3LDYgKzY5OSwzNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG10OXQwMzFfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfTUFTVEVSIHwgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8CisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0g7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMOworCWNmZy0+ZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXQwMzFfc19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCWNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCWlmIChzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKSAmCisJICAgIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKQorCQlyZXR1cm4gcmVnX2NsZWFyKGNsaWVudCwgTVQ5VDAzMV9QSVhFTF9DTE9DS19DT05UUk9MLCAweDgwMDApOworCWVsc2UKKwkJcmV0dXJuIHJlZ19zZXQoY2xpZW50LCBNVDlUMDMxX1BJWEVMX0NMT0NLX0NPTlRST0wsIDB4ODAwMCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG10OXQwMzFfc3ViZGV2X3ZpZGVvX29wcyA9IHsKIAkuc19zdHJlYW0JPSBtdDl0MDMxX3Nfc3RyZWFtLAogCS5zX21idXNfZm10CT0gbXQ5dDAzMV9zX2ZtdCwKQEAgLTgxNiw2ICs3MzYsOCBAQAogCS5nX2Nyb3AJCT0gbXQ5dDAzMV9nX2Nyb3AsCiAJLmNyb3BjYXAJPSBtdDl0MDMxX2Nyb3BjYXAsCiAJLmVudW1fbWJ1c19mbXQJPSBtdDl0MDMxX2VudW1fZm10LAorCS5nX21idXNfY29uZmlnCT0gbXQ5dDAzMV9nX21idXNfY29uZmlnLAorCS5zX21idXNfY29uZmlnCT0gbXQ5dDAzMV9zX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9zZW5zb3Jfb3BzIG10OXQwMzFfc3ViZGV2X3NlbnNvcl9vcHMgPSB7CkBAIC04MzIsMTggKzc1NCwxMyBAQAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7CiAJc3RydWN0IG10OXQwMzEgKm10OXQwMzE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwogCWludCByZXQ7CiAKLQlpZiAoaWNkKSB7Ci0JCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCQlpZiAoIWljbCkgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNVDlUMDMxIGRyaXZlciBuZWVkcyBwbGF0Zm9ybSBkYXRhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWNkLT5vcHMgPSAmbXQ5dDAzMV9vcHM7CisJaWYgKCFpY2wpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNVDlUMDMxIGRyaXZlciBuZWVkcyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKSB7CkBAIC04NTcsNiArNzc0LDMzIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJm10OXQwMzEtPnN1YmRldiwgY2xpZW50LCAmbXQ5dDAzMV9zdWJkZXZfb3BzKTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZtdDl0MDMxLT5oZGwsIDUpOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDl0MDMxLT5oZGwsICZtdDl0MDMxX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfVkZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDl0MDMxLT5oZGwsICZtdDl0MDMxX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDl0MDMxLT5oZGwsICZtdDl0MDMxX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfR0FJTiwgMCwgMTI3LCAxLCA2NCk7CisKKwkvKgorCSAqIFNpbXVsYXRlZCBhdXRvZXhwb3N1cmUuIElmIGVuYWJsZWQsIHdlIGNhbGN1bGF0ZSBzaHV0dGVyIHdpZHRoCisJICogb3Vyc2VsdmVzIGluIHRoZSBkcml2ZXIgYmFzZWQgb24gdmVydGljYWwgYmxhbmtpbmcgYW5kIGZyYW1lIHdpZHRoCisJICovCisJbXQ5dDAzMS0+YXV0b2V4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGRfbWVudSgmbXQ5dDAzMS0+aGRsLAorCQkJJm10OXQwMzFfY3RybF9vcHMsIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sIDEsIDAsCisJCQlWNEwyX0VYUE9TVVJFX0FVVE8pOworCW10OXQwMzEtPmV4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGQoJm10OXQwMzEtPmhkbCwgJm10OXQwMzFfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9FWFBPU1VSRSwgMSwgMjU1LCAxLCAyNTUpOworCisJbXQ5dDAzMS0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZtdDl0MDMxLT5oZGw7CisJaWYgKG10OXQwMzEtPmhkbC5lcnJvcikgeworCQlpbnQgZXJyID0gbXQ5dDAzMS0+aGRsLmVycm9yOworCisJCWtmcmVlKG10OXQwMzEpOworCQlyZXR1cm4gZXJyOworCX0KKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDIsICZtdDl0MDMxLT5hdXRvZXhwb3N1cmUsCisJCQkJVjRMMl9FWFBPU1VSRV9NQU5VQUwsIHRydWUpOwogCiAJbXQ5dDAzMS0+eV9za2lwX3RvcAk9IDA7CiAJbXQ5dDAzMS0+cmVjdC5sZWZ0CT0gTVQ5VDAzMV9DT0xVTU5fU0tJUDsKQEAgLTg2NCwxMiArODA4LDYgQEAKIAltdDl0MDMxLT5yZWN0LndpZHRoCT0gTVQ5VDAzMV9NQVhfV0lEVEg7CiAJbXQ5dDAzMS0+cmVjdC5oZWlnaHQJPSBNVDlUMDMxX01BWF9IRUlHSFQ7CiAKLQkvKgotCSAqIFNpbXVsYXRlZCBhdXRvZXhwb3N1cmUuIElmIGVuYWJsZWQsIHdlIGNhbGN1bGF0ZSBzaHV0dGVyIHdpZHRoCi0JICogb3Vyc2VsdmVzIGluIHRoZSBkcml2ZXIgYmFzZWQgb24gdmVydGljYWwgYmxhbmtpbmcgYW5kIGZyYW1lIHdpZHRoCi0JICovCi0JbXQ5dDAzMS0+YXV0b2V4cG9zdXJlID0gMTsKLQogCW10OXQwMzEtPnhza2lwID0gMTsKIAltdDl0MDMxLT55c2tpcCA9IDE7CiAKQEAgLTg4MCw4ICs4MTgsNyBAQAogCW10OXQwMzFfZGlzYWJsZShjbGllbnQpOwogCiAJaWYgKHJldCkgewotCQlpZiAoaWNkKQotCQkJaWNkLT5vcHMgPSBOVUxMOworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZtdDl0MDMxLT5oZGwpOwogCQlrZnJlZShtdDl0MDMxKTsKIAl9CiAKQEAgLTg5MSwxMCArODI4LDkgQEAKIHN0YXRpYyBpbnQgbXQ5dDAzMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbXQ5dDAzMSAqbXQ5dDAzMSA9IHRvX210OXQwMzEoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQlpZiAoaWNkKQotCQlpY2QtPm9wcyA9IE5VTEw7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJm10OXQwMzEtPnN1YmRldik7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmbXQ5dDAzMS0+aGRsKTsKIAlrZnJlZShtdDl0MDMxKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MTEyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYwppbmRleCBkMmUwYTUwLi4zMjExNGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYwpAQCAtMjIsMTEgKzIyLDExIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9tdDl0MTEyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKQEAgLTM0LDExICszNCw3IEBACiAvKiAjZGVmaW5lIEVYVF9DTE9DSyAyNDAwMDAwMCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQogCQkJbWFjcm8KLQotCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZnJhbWUgc2l6ZQpAQCAtODAsMTcgKzc2LDggQEAKICNkZWZpbmUgVkFSOChpZCwgb2Zmc2V0KSBfVkFSKGlkLCBvZmZzZXQsIDB4ODAwMCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KIAkJCXN0cnVjdAotCi0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBtdDl0MTEyX2ZyYW1lX3NpemUgewotCXUxNiB3aWR0aDsKLQl1MTYgaGVpZ2h0OwotfTsKLQogc3RydWN0IG10OXQxMTJfZm9ybWF0IHsKIAllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZTsKIAllbnVtIHY0bDJfY29sb3JzcGFjZSBjb2xvcnNwYWNlOwpAQCAtMTAyLDIxICs4OSwxNyBAQAogCXN0cnVjdCB2NGwyX3N1YmRldgkJIHN1YmRldjsKIAlzdHJ1Y3QgbXQ5dDExMl9jYW1lcmFfaW5mbwkqaW5mbzsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkJKmNsaWVudDsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UJIGljZDsKLQlzdHJ1Y3QgbXQ5dDExMl9mcmFtZV9zaXplCSBmcmFtZTsKKwlzdHJ1Y3QgdjRsMl9yZWN0CQkgZnJhbWU7CiAJY29uc3Qgc3RydWN0IG10OXQxMTJfZm9ybWF0CSpmb3JtYXQ7CiAJaW50CQkJCSBtb2RlbDsKIAl1MzIJCQkJIGZsYWdzOwogLyogZm9yIGZsYWdzICovCi0jZGVmaW5lIElOSVRfRE9ORSAgKDE8PDApCisjZGVmaW5lIElOSVRfRE9ORQkoMSA8PCAwKQorI2RlZmluZSBQQ0xLX1JJU0lORwkoMSA8PCAxKQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KIAkJCXN1cHBvcnRlZCBmb3JtYXQKLQotCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXQ5dDExMl9mb3JtYXQgbXQ5dDExMl9jZm10c1tdID0gewpAQCAtMTU0LDExICsxMzcsNyBAQAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KIAkJCWdlbmVyYWwgZnVuY3Rpb24KLQotCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IG10OXQxMTJfcHJpdiAqdG9fbXQ5dDExMihjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewpAQCAtMzI2LDUwICszMDUsNDcgQEAKIAluID0gKG4gPj4gOCkgJiAweDAwM2Y7CiAKIAllbmFibGUgPSAoKDYwMDAgPiBleHQpIHx8ICg1NDAwMCA8IGV4dCkpID8gIlgiIDogIiI7Ci0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRVhUQ0xLICAgICAgICAgIDogJTEwdSBLICVzXG4iLCBleHQsIGVuYWJsZSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJFWFRDTEsgICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGV4dCwgZW5hYmxlKTsKIAogCXZjbyA9IDIgKiBtICogZXh0IC8gKG4rMSk7CiAJZW5hYmxlID0gKCgzODQwMDAgPiB2Y28pIHx8ICg3NjgwMDAgPCB2Y28pKSA/ICJYIiA6ICIiOwotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlZDTyAgICAgICAgICAgICA6ICUxMHUgSyAlc1xuIiwgdmNvLCBlbmFibGUpOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVkNPICAgICAgICAgICAgIDogJTEwdSBLICVzXG4iLCB2Y28sIGVuYWJsZSk7CiAKIAljbGsgPSB2Y28gLyAocDErMSkgLyAocDIrMSk7CiAJZW5hYmxlID0gKDk2MDAwIDwgY2xrKSA/ICJYIiA6ICIiOwotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlBJWENMSyAgICAgICAgICA6ICUxMHUgSyAlc1xuIiwgY2xrLCBlbmFibGUpOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUElYQ0xLICAgICAgICAgIDogJTEwdSBLICVzXG4iLCBjbGssIGVuYWJsZSk7CiAKIAljbGsgPSB2Y28gLyAocDMrMSk7CiAJZW5hYmxlID0gKDc2ODAwMCA8IGNsaykgPyAiWCIgOiAiIjsKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJNSVBJQ0xLICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIk1JUElDTEsgICAgICAgICA6ICUxMHUgSyAlc1xuIiwgY2xrLCBlbmFibGUpOwogCiAJY2xrID0gdmNvIC8gKHA2KzEpOwogCWVuYWJsZSA9ICg5NjAwMCA8IGNsaykgPyAiWCIgOiAiIjsKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJNQ1UgQ0xLICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIk1DVSBDTEsgICAgICAgICA6ICUxMHUgSyAlc1xuIiwgY2xrLCBlbmFibGUpOwogCiAJY2xrID0gdmNvIC8gKHA1KzEpOwogCWVuYWJsZSA9ICg1NDAwMCA8IGNsaykgPyAiWCIgOiAiIjsKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJTT0MgQ0xLICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlNPQyBDTEsgICAgICAgICA6ICUxMHUgSyAlc1xuIiwgY2xrLCBlbmFibGUpOwogCiAJY2xrID0gdmNvIC8gKHA0KzEpOwogCWVuYWJsZSA9ICg3MDAwMCA8IGNsaykgPyAiWCIgOiAiIjsKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJTZW5zb3IgQ0xLICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlNlbnNvciBDTEsgICAgICA6ICUxMHUgSyAlc1xuIiwgY2xrLCBlbmFibGUpOwogCiAJY2xrID0gdmNvIC8gKHA3KzEpOwotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkV4dGVybmFsIHNlbnNvciA6ICUxMHUgS1xuIiwgY2xrKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkV4dGVybmFsIHNlbnNvciA6ICUxMHUgS1xuIiwgY2xrKTsKIAogCWNsayA9IGV4dCAvIChuKzEpOwogCWVuYWJsZSA9ICgoMjAwMCA+IGNsaykgfHwgKDI0MDAwIDwgY2xrKSkgPyAiWCIgOiAiIjsKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJQRkQgICAgICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlBGRCAgICAgICAgICAgICA6ICUxMHUgSyAlc1xuIiwgY2xrLCBlbmFibGUpOwogCiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgbXQ5dDExMl9mcmFtZV9jaGVjayh1MzIgKndpZHRoLCB1MzIgKmhlaWdodCkKK3N0YXRpYyB2b2lkIG10OXQxMTJfZnJhbWVfY2hlY2sodTMyICp3aWR0aCwgdTMyICpoZWlnaHQsIHUzMiAqbGVmdCwgdTMyICp0b3ApCiB7Ci0JaWYgKCp3aWR0aCA+IE1BWF9XSURUSCkKLQkJKndpZHRoID0gTUFYX1dJRFRIOwotCi0JaWYgKCpoZWlnaHQgPiBNQVhfSEVJR0hUKQotCQkqaGVpZ2h0ID0gTUFYX0hFSUdIVDsKKwlzb2NfY2FtZXJhX2xpbWl0X3NpZGUobGVmdCwgd2lkdGgsIDAsIDAsIE1BWF9XSURUSCk7CisJc29jX2NhbWVyYV9saW1pdF9zaWRlKHRvcCwgaGVpZ2h0LCAwLCAwLCBNQVhfSEVJR0hUKTsKIH0KIAogc3RhdGljIGludCBtdDl0MTEyX3NldF9hX2ZyYW1lX3NpemUoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTc1OCw0OCArNzM0LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KLQkJCXNvY19jYW1lcmFfb3BzCi0KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBtdDl0MTEyX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJIHVuc2lnbmVkIGxvbmcJZmxhZ3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG10OXQxMTJfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpKTsKLQlzdHJ1Y3QgbXQ5dDExMl9wcml2ICpwcml2ID0gdG9fbXQ5dDExMihjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTT0NBTV9NQVNURVIgfCBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fREFUQV9BQ1RJVkVfSElHSDsKLQotCWZsYWdzIHw9IChwcml2LT5pbmZvLT5mbGFncyAmIE1UOVQxMTJfRkxBR19QQ0xLX1JJU0lOR19FREdFKSA/Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyA6IFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkc7Ci0KLQlpZiAocHJpdi0+aW5mby0+ZmxhZ3MgJiBNVDlUMTEyX0ZMQUdfREFUQVdJRFRIXzgpCi0JCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF84OwotCWVsc2UKLQkJZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzEwOwotCi0JcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwotfQotCi1zdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfb3BzIG10OXQxMTJfb3BzID0gewotCS5zZXRfYnVzX3BhcmFtCQk9IG10OXQxMTJfc2V0X2J1c19wYXJhbSwKLQkucXVlcnlfYnVzX3BhcmFtCT0gbXQ5dDExMl9xdWVyeV9idXNfcGFyYW0sCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQogCQkJdjRsMl9zdWJkZXZfY29yZV9vcHMKLQotCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IG10OXQxMTJfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQkJc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmlkKQpAQCAtODUwLDExICs3ODUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCiAJCQl2NGwyX3N1YmRldl92aWRlb19vcHMKLQotCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IG10OXQxMTJfc19zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IGVuYWJsZSkKIHsKQEAgLTg3Nyw4ICs4MDgsNyBAQAogCX0KIAogCWlmICghKHByaXYtPmZsYWdzICYgSU5JVF9ET05FKSkgewotCQl1MTYgcGFyYW0gPSAoTVQ5VDExMl9GTEFHX1BDTEtfUklTSU5HX0VER0UgJgotCQkJICAgICBwcml2LT5pbmZvLT5mbGFncykgPyAweDAwMDEgOiAweDAwMDA7CisJCXUxNiBwYXJhbSA9IFBDTEtfUklTSU5HICYgcHJpdi0+ZmxhZ3MgPyAweDAwMDEgOiAweDAwMDA7CiAKIAkJRUNIRUNLRVIocmV0LCBtdDl0MTEyX2luaXRfY2FtZXJhKGNsaWVudCkpOwogCkBAIC05MTAsMTkgKzg0MCwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5dDExMl9zZXRfcGFyYW1zKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiB3aWR0aCwgdTMyIGhlaWdodCwKK3N0YXRpYyBpbnQgbXQ5dDExMl9zZXRfcGFyYW1zKHN0cnVjdCBtdDl0MTEyX3ByaXYgKnByaXYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0LAogCQkJICAgICAgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGUpCiB7Ci0Jc3RydWN0IG10OXQxMTJfcHJpdiAqcHJpdiA9IHRvX210OXQxMTIoY2xpZW50KTsKIAlpbnQgaTsKIAotCXByaXYtPmZvcm1hdCA9IE5VTEw7Ci0KLQkvKgotCSAqIGZyYW1lIHNpemUgY2hlY2sKLQkgKi8KLQltdDl0MTEyX2ZyYW1lX2NoZWNrKCZ3aWR0aCwgJmhlaWdodCk7Ci0KIAkvKgogCSAqIGdldCBjb2xvciBmb3JtYXQKIAkgKi8KQEAgLTkzMyw4ICs4NTYsMTMgQEAKIAlpZiAoaSA9PSBBUlJBWV9TSVpFKG10OXQxMTJfY2ZtdHMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByaXYtPmZyYW1lLndpZHRoICA9ICh1MTYpd2lkdGg7Ci0JcHJpdi0+ZnJhbWUuaGVpZ2h0ID0gKHUxNiloZWlnaHQ7CisJcHJpdi0+ZnJhbWUgID0gKnJlY3Q7CisKKwkvKgorCSAqIGZyYW1lIHNpemUgY2hlY2sKKwkgKi8KKwltdDl0MTEyX2ZyYW1lX2NoZWNrKCZwcml2LT5mcmFtZS53aWR0aCwgJnByaXYtPmZyYW1lLmhlaWdodCwKKwkJCSAgICAmcHJpdi0+ZnJhbWUubGVmdCwgJnByaXYtPmZyYW1lLnRvcCk7CiAKIAlwcml2LT5mb3JtYXQgPSBtdDl0MTEyX2NmbXRzICsgaTsKIApAQCAtOTQ1LDkgKzg3MywxMiBAQAogewogCWEtPmJvdW5kcy5sZWZ0CQkJPSAwOwogCWEtPmJvdW5kcy50b3AJCQk9IDA7Ci0JYS0+Ym91bmRzLndpZHRoCQkJPSBWR0FfV0lEVEg7Ci0JYS0+Ym91bmRzLmhlaWdodAkJPSBWR0FfSEVJR0hUOwotCWEtPmRlZnJlY3QJCQk9IGEtPmJvdW5kczsKKwlhLT5ib3VuZHMud2lkdGgJCQk9IE1BWF9XSURUSDsKKwlhLT5ib3VuZHMuaGVpZ2h0CQk9IE1BWF9IRUlHSFQ7CisJYS0+ZGVmcmVjdC5sZWZ0CQkJPSAwOworCWEtPmRlZnJlY3QudG9wCQkJPSAwOworCWEtPmRlZnJlY3Qud2lkdGgJCT0gVkdBX1dJRFRIOworCWEtPmRlZnJlY3QuaGVpZ2h0CQk9IFZHQV9IRUlHSFQ7CiAJYS0+dHlwZQkJCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAlhLT5waXhlbGFzcGVjdC5udW1lcmF0b3IJPSAxOwogCWEtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yCT0gMTsKQEAgLTk1NywxMSArODg4LDExIEBACiAKIHN0YXRpYyBpbnQgbXQ5dDExMl9nX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKIHsKLQlhLT5jLmxlZnQJPSAwOwotCWEtPmMudG9wCT0gMDsKLQlhLT5jLndpZHRoCT0gVkdBX1dJRFRIOwotCWEtPmMuaGVpZ2h0CT0gVkdBX0hFSUdIVDsKLQlhLT50eXBlCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IG10OXQxMTJfcHJpdiAqcHJpdiA9IHRvX210OXQxMTIoY2xpZW50KTsKKworCWEtPmMJPSBwcml2LT5mcmFtZTsKKwlhLT50eXBlCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NjksMTAgKzkwMCwxMCBAQAogc3RhdGljIGludCBtdDl0MTEyX3NfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgbXQ5dDExMl9wcml2ICpwcml2ID0gdG9fbXQ5dDExMihjbGllbnQpOwogCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmYS0+YzsKIAotCXJldHVybiBtdDl0MTEyX3NldF9wYXJhbXMoY2xpZW50LCByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0LAotCQkJCSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYOCk7CisJcmV0dXJuIG10OXQxMTJfc2V0X3BhcmFtcyhwcml2LCByZWN0LCBwcml2LT5mb3JtYXQtPmNvZGUpOwogfQogCiBzdGF0aWMgaW50IG10OXQxMTJfZ19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKQEAgLTk4MSwxNiArOTEyLDkgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IG10OXQxMTJfcHJpdiAqcHJpdiA9IHRvX210OXQxMTIoY2xpZW50KTsKIAotCWlmICghcHJpdi0+Zm9ybWF0KSB7Ci0JCWludCByZXQgPSBtdDl0MTEyX3NldF9wYXJhbXMoY2xpZW50LCBWR0FfV0lEVEgsIFZHQV9IRUlHSFQsCi0JCQkJCSAgICAgVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDgpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCiAJbWYtPndpZHRoCT0gcHJpdi0+ZnJhbWUud2lkdGg7CiAJbWYtPmhlaWdodAk9IHByaXYtPmZyYW1lLmhlaWdodDsKLQkvKiBUT0RPOiBzZXQgY29sb3JzcGFjZSAqLworCW1mLT5jb2xvcnNwYWNlCT0gcHJpdi0+Zm9ybWF0LT5jb2xvcnNwYWNlOwogCW1mLT5jb2RlCT0gcHJpdi0+Zm9ybWF0LT5jb2RlOwogCW1mLT5maWVsZAk9IFY0TDJfRklFTERfTk9ORTsKIApAQCAtMTAwMSwxNyArOTI1LDQyIEBACiAJCQkgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBtdDl0MTEyX3ByaXYgKnByaXYgPSB0b19tdDl0MTEyKGNsaWVudCk7CisJc3RydWN0IHY0bDJfcmVjdCByZWN0ID0geworCQkud2lkdGggPSBtZi0+d2lkdGgsCisJCS5oZWlnaHQgPSBtZi0+aGVpZ2h0LAorCQkubGVmdCA9IHByaXYtPmZyYW1lLmxlZnQsCisJCS50b3AgPSBwcml2LT5mcmFtZS50b3AsCisJfTsKKwlpbnQgcmV0OwogCi0JLyogVE9ETzogc2V0IGNvbG9yc3BhY2UgKi8KLQlyZXR1cm4gbXQ5dDExMl9zZXRfcGFyYW1zKGNsaWVudCwgbWYtPndpZHRoLCBtZi0+aGVpZ2h0LCBtZi0+Y29kZSk7CisJcmV0ID0gbXQ5dDExMl9zZXRfcGFyYW1zKHByaXYsICZyZWN0LCBtZi0+Y29kZSk7CisKKwlpZiAoIXJldCkKKwkJbWYtPmNvbG9yc3BhY2UgPSBwcml2LT5mb3JtYXQtPmNvbG9yc3BhY2U7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG10OXQxMTJfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJICAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCiB7Ci0JbXQ5dDExMl9mcmFtZV9jaGVjaygmbWYtPndpZHRoLCAmbWYtPmhlaWdodCk7CisJdW5zaWduZWQgaW50IHRvcCwgbGVmdDsKKwlpbnQgaTsKIAotCS8qIFRPRE86IHNldCBjb2xvcnNwYWNlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ5dDExMl9jZm10cyk7IGkrKykKKwkJaWYgKG10OXQxMTJfY2ZtdHNbaV0uY29kZSA9PSBtZi0+Y29kZSkKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gQVJSQVlfU0laRShtdDl0MTEyX2NmbXRzKSkgeworCQltZi0+Y29kZSA9IFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OworCQltZi0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOworCX0gZWxzZSB7CisJCW1mLT5jb2xvcnNwYWNlCT0gbXQ5dDExMl9jZm10c1tpXS5jb2xvcnNwYWNlOworCX0KKworCW10OXQxMTJfZnJhbWVfY2hlY2soJm1mLT53aWR0aCwgJm1mLT5oZWlnaHQsICZsZWZ0LCAmdG9wKTsKKwogCW1mLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKIAogCXJldHVybiAwOwpAQCAtMTAyNCw2ICs5NzMsMzUgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkqY29kZSA9IG10OXQxMTJfY2ZtdHNbaW5kZXhdLmNvZGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDl0MTEyX2dfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQkgc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19NQVNURVIgfCBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORzsKKwljZmctPnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUw7CisJY2ZnLT5mbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDExMl9zX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIGNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5dDExMl9wcml2ICpwcml2ID0gdG9fbXQ5dDExMihjbGllbnQpOworCisJaWYgKHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORykKKwkJcHJpdi0+ZmxhZ3MgfD0gUENMS19SSVNJTkc7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAzNiwzMSArMTAxNCwyNCBAQAogCS5nX2Nyb3AJCT0gbXQ5dDExMl9nX2Nyb3AsCiAJLnNfY3JvcAkJPSBtdDl0MTEyX3NfY3JvcCwKIAkuZW51bV9tYnVzX2ZtdAk9IG10OXQxMTJfZW51bV9mbXQsCisJLmdfbWJ1c19jb25maWcJPSBtdDl0MTEyX2dfbWJ1c19jb25maWcsCisJLnNfbWJ1c19jb25maWcJPSBtdDl0MTEyX3NfbWJ1c19jb25maWcsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQogCQkJaTJjIGRyaXZlcgotCi0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG10OXQxMTJfc3ViZGV2X29wcyA9IHsKIAkuY29yZQk9ICZtdDl0MTEyX3N1YmRldl9jb3JlX29wcywKIAkudmlkZW8JPSAmbXQ5dDExMl9zdWJkZXZfdmlkZW9fb3BzLAogfTsKIAotc3RhdGljIGludCBtdDl0MTEyX2NhbWVyYV9wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtdDl0MTEyX2NhbWVyYV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBtdDl0MTEyX3ByaXYgKnByaXYgPSB0b19tdDl0MTEyKGNsaWVudCk7CiAJY29uc3QgY2hhciAgICAgICAgICAqZGV2bmFtZTsKIAlpbnQgICAgICAgICAgICAgICAgICBjaGlwaWQ7CiAKLQkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLwotCUJVR19PTighaWNkLT5wYXJlbnQgfHwKLQkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7Ci0KIAkvKgogCSAqIGNoZWNrIGFuZCBzaG93IGNoaXAgSUQKIAkgKi8KQEAgLTEwODgsMjAgKzEwNTksMjEgQEAKIHN0YXRpYyBpbnQgbXQ5dDExMl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7Ci0Jc3RydWN0IG10OXQxMTJfcHJpdiAgICAgICAgKnByaXY7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICAgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAgICAgKmljbDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCXN0cnVjdCBtdDl0MTEyX3ByaXYgKnByaXY7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCXN0cnVjdCB2NGwyX3JlY3QgcmVjdCA9IHsKKwkJLndpZHRoID0gVkdBX1dJRFRILAorCQkuaGVpZ2h0ID0gVkdBX0hFSUdIVCwKKwkJLmxlZnQgPSAoTUFYX1dJRFRIIC0gVkdBX1dJRFRIKSAvIDIsCisJCS50b3AgPSAoTUFYX0hFSUdIVCAtIFZHQV9IRUlHSFQpIC8gMiwKKwl9OworCWludCByZXQ7CiAKLQlpZiAoIWljZCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm10OXQxMTI6IG1pc3Npbmcgc29jLWNhbWVyYSBkYXRhIVxuIik7CisJaWYgKCFpY2wgfHwgIWljbC0+cHJpdikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm10OXQxMTI6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQlpZiAoIWljbCB8fCAhaWNsLT5wcml2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMTEwLDEzICsxMDgyLDEyIEBACiAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCBjbGllbnQsICZtdDl0MTEyX3N1YmRldl9vcHMpOwogCi0JaWNkLT5vcHMgPSAmbXQ5dDExMl9vcHM7Ci0KLQlyZXQgPSBtdDl0MTEyX2NhbWVyYV9wcm9iZShpY2QsIGNsaWVudCk7Ci0JaWYgKHJldCkgewotCQlpY2QtPm9wcyA9IE5VTEw7CisJcmV0ID0gbXQ5dDExMl9jYW1lcmFfcHJvYmUoY2xpZW50KTsKKwlpZiAocmV0KQogCQlrZnJlZShwcml2KTsKLQl9CisKKwkvKiBDYW5ub3QgZmFpbDogdXNpbmcgdGhlIGRlZmF1bHQgc3VwcG9ydGVkIHBpeGVsIGNvZGUgKi8KKwltdDl0MTEyX3NldF9wYXJhbXMocHJpdiwgJnJlY3QsIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMTI0LDkgKzEwOTUsNyBAQAogc3RhdGljIGludCBtdDl0MTEyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBtdDl0MTEyX3ByaXYgKnByaXYgPSB0b19tdDl0MTEyKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JaWNkLT5vcHMgPSBOVUxMOwogCWtmcmVlKHByaXYpOwogCXJldHVybiAwOwogfQpAQCAtMTE0NywxMSArMTExNiw3IEBACiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQogCQkJbW9kdWxlIGZ1bmN0aW9uCi0KLQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBfX2luaXQgbXQ5dDExMl9tb2R1bGVfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMTEuYwppbmRleCA4OTNhOGI4Li5kYjc0ZGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMTEuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDIyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMjIuYwppbmRleCA1MWIwZmNjLi42OTBlZTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMjIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMjIuYwpAQCAtMTMsMTAgKzEzLDEzIEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvc29jX21lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogCiAvKgogICogbXQ5djAyMiBpMmMgYWRkcmVzcyAweDQ4LCAweDRjLCAweDU4LCAweDVjCkBAIC0xMDAsNiArMTAzLDE3IEBACiAKIHN0cnVjdCBtdDl2MDIyIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBoZGw7CisJc3RydWN0IHsKKwkJLyogZXhwb3N1cmUvYXV0by1leHBvc3VyZSBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwgKmF1dG9leHBvc3VyZTsKKwkJc3RydWN0IHY0bDJfY3RybCAqZXhwb3N1cmU7CisJfTsKKwlzdHJ1Y3QgeworCQkvKiBnYWluL2F1dG8tZ2FpbiBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwgKmF1dG9nYWluOworCQlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluOworCX07CiAJc3RydWN0IHY0bDJfcmVjdCByZWN0OwkvKiBTZW5zb3Igd2luZG93ICovCiAJY29uc3Qgc3RydWN0IG10OXYwMjJfZGF0YWZtdCAqZm10OwogCWNvbnN0IHN0cnVjdCBtdDl2MDIyX2RhdGFmbXQgKmZtdHM7CkBAIC0xNzgsNiArMTkyLDggQEAKIAkJcmV0ID0gcmVnX2NsZWFyKGNsaWVudCwgTVQ5VjAyMl9CTEFDS19MRVZFTF9DQUxJQl9DVFJMLCAxKTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5VjAyMl9ESUdJVEFMX1RFU1RfUEFUVEVSTiwgMCk7CisJaWYgKCFyZXQpCisJCXJldHVybiB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmbXQ5djAyMi0+aGRsKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xOTksNzggKzIxNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5djAyMl9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpKTsKLQlzdHJ1Y3QgbXQ5djAyMiAqbXQ5djAyMiA9IHRvX210OXYwMjIoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQl1bnNpZ25lZCBpbnQgd2lkdGhfZmxhZyA9IGZsYWdzICYgU09DQU1fREFUQVdJRFRIX01BU0s7Ci0JaW50IHJldDsKLQl1MTYgcGl4Y2xrID0gMDsKLQotCS8qIE9ubHkgb25lIHdpZHRoIGJpdCBtYXkgYmUgc2V0ICovCi0JaWYgKCFpc19wb3dlcl9vZl8yKHdpZHRoX2ZsYWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpY2wtPnNldF9idXNfcGFyYW0pIHsKLQkJcmV0ID0gaWNsLT5zZXRfYnVzX3BhcmFtKGljbCwgd2lkdGhfZmxhZyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFdpdGhvdXQgYm9hcmQgc3BlY2lmaWMgYnVzIHdpZHRoIHNldHRpbmdzIHdlIG9ubHkgc3VwcG9ydCB0aGUKLQkJICogc2Vuc29ycyBuYXRpdmUgYnVzIHdpZHRoCi0JCSAqLwotCQlpZiAod2lkdGhfZmxhZyAhPSBTT0NBTV9EQVRBV0lEVEhfMTApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwotCi0JaWYgKGZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykKLQkJcGl4Y2xrIHw9IDB4MTA7Ci0KLQlpZiAoIShmbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIKSkKLQkJcGl4Y2xrIHw9IDB4MTsKLQotCWlmICghKGZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0gpKQotCQlwaXhjbGsgfD0gMHgyOwotCi0JcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5VjAyMl9QSVhDTEtfRlZfTFYsIHBpeGNsayk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoIShmbGFncyAmIFNPQ0FNX01BU1RFUikpCi0JCW10OXYwMjItPmNoaXBfY29udHJvbCAmPSB+MHg4OwotCi0JcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5VjAyMl9DSElQX0NPTlRST0wsIG10OXYwMjItPmNoaXBfY29udHJvbCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkNhbGN1bGF0ZWQgcGl4Y2xrIDB4JXgsIGNoaXAgY29udHJvbCAweCV4XG4iLAotCQlwaXhjbGssIG10OXYwMjItPmNoaXBfY29udHJvbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbXQ5djAyMl9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JdW5zaWduZWQgaW50IGZsYWdzID0gU09DQU1fTUFTVEVSIHwgU09DQU1fU0xBVkUgfAotCQlTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XIHwKLQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSDsKLQotCWlmIChpY2wtPnF1ZXJ5X2J1c19wYXJhbSkKLQkJZmxhZ3MgfD0gaWNsLT5xdWVyeV9idXNfcGFyYW0oaWNsKSAmIFNPQ0FNX0RBVEFXSURUSF9NQVNLOwotCWVsc2UKLQkJZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzEwOwotCi0JcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwotfQotCiBzdGF0aWMgaW50IG10OXYwMjJfc19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwpAQCAtMzg5LDcgKzMzMyw3IEBACiAKIAkvKgogCSAqIFRoZSBjYWxsZXIgcHJvdmlkZXMgYSBzdXBwb3J0ZWQgZm9ybWF0LCBhcyB2ZXJpZmllZCBwZXIgY2FsbCB0bwotCSAqIGljZC0+dHJ5X2ZtdCgpLCBkYXRhd2lkdGggaXMgZnJvbSBvdXIgc3VwcG9ydGVkIGZvcm1hdCBsaXN0CisJICogLnRyeV9tYnVzX2ZtdCgpLCBkYXRhd2lkdGggaXMgZnJvbSBvdXIgc3VwcG9ydGVkIGZvcm1hdCBsaXN0CiAJICovCiAJc3dpdGNoIChtZi0+Y29kZSkgewogCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZOF8xWDg6CkBAIC01MDIsMjM2ICs0NDYsMTMxIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBtdDl2MDIyX2NvbnRyb2xzW10gPSB7Ci0JewotCQkuaWQJCT0gVjRMMl9DSURfVkZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJGbGlwIFZlcnRpY2FsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBIb3Jpem9udGFsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0dBSU4sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJBbmFsb2cgR2FpbiIsCi0JCS5taW5pbXVtCT0gNjQsCi0JCS5tYXhpbXVtCT0gMTI3LAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDY0LAotCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0VYUE9TVVJFLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZQkJPSAiRXhwb3N1cmUiLAotCQkubWluaW11bQk9IDEsCi0JCS5tYXhpbXVtCT0gMjU1LAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDI1NSwKLQkJLmZsYWdzCQk9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUiwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9BVVRPR0FJTiwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkF1dG9tYXRpYyBHYWluIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMSwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiQXV0b21hdGljIEV4cG9zdXJlIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfb3BzIG10OXYwMjJfb3BzID0gewotCS5zZXRfYnVzX3BhcmFtCQk9IG10OXYwMjJfc2V0X2J1c19wYXJhbSwKLQkucXVlcnlfYnVzX3BhcmFtCT0gbXQ5djAyMl9xdWVyeV9idXNfcGFyYW0sCi0JLmNvbnRyb2xzCQk9IG10OXYwMjJfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG10OXYwMjJfY29udHJvbHMpLAotfTsKLQotc3RhdGljIGludCBtdDl2MDIyX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCBtdDl2MDIyX2dfdm9sYXRpbGVfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogeworCXN0cnVjdCBtdDl2MDIyICptdDl2MDIyID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsCisJCQkJCSAgICAgICBzdHJ1Y3QgbXQ5djAyMiwgaGRsKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJm10OXYwMjItPnN1YmRldjsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybDsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluID0gbXQ5djAyMi0+Z2FpbjsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpleHAgPSBtdDl2MDIyLT5leHBvc3VyZTsKIAl1bnNpZ25lZCBsb25nIHJhbmdlOwogCWludCBkYXRhOwogCi0JcWN0cmwgPSBzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoJm10OXYwMjJfb3BzLCBjdHJsLT5pZCk7Ci0KIAlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJZGF0YSA9IHJlZ19yZWFkKGNsaWVudCwgTVQ5VjAyMl9SRUFEX01PREUpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSAhIShkYXRhICYgMHgxMCk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfUkVBRF9NT0RFKTsKLQkJaWYgKGRhdGEgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0JCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIDB4MjApOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86Ci0JCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSAhIShkYXRhICYgMHgxKTsKLQkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKLQkJZGF0YSA9IHJlZ19yZWFkKGNsaWVudCwgTVQ5VjAyMl9BRUNfQUdDX0VOQUJMRSk7Ci0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9ICEhKGRhdGEgJiAweDIpOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0dBSU46CiAJCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfQU5BTE9HX0dBSU4pOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlyYW5nZSA9IHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPm1pbmltdW07Ci0JCWN0cmwtPnZhbHVlID0gKChkYXRhIC0gMTYpICogcmFuZ2UgKyAyNCkgLyA0OCArIHFjdHJsLT5taW5pbXVtOwotCi0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCXJhbmdlID0gZ2Fpbi0+bWF4aW11bSAtIGdhaW4tPm1pbmltdW07CisJCWdhaW4tPnZhbCA9ICgoZGF0YSAtIDE2KSAqIHJhbmdlICsgMjQpIC8gNDggKyBnYWluLT5taW5pbXVtOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86CiAJCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfVE9UQUxfU0hVVFRFUl9XSURUSCk7CiAJCWlmIChkYXRhIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCi0JCXJhbmdlID0gcWN0cmwtPm1heGltdW0gLSBxY3RybC0+bWluaW11bTsKLQkJY3RybC0+dmFsdWUgPSAoKGRhdGEgLSAxKSAqIHJhbmdlICsgMjM5KSAvIDQ3OSArIHFjdHJsLT5taW5pbXVtOwotCi0JCWJyZWFrOworCQlyYW5nZSA9IGV4cC0+bWF4aW11bSAtIGV4cC0+bWluaW11bTsKKwkJZXhwLT52YWwgPSAoKGRhdGEgLSAxKSAqIHJhbmdlICsgMjM5KSAvIDQ3OSArIGV4cC0+bWluaW11bTsKKwkJcmV0dXJuIDA7CiAJfQotCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IG10OXYwMjJfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IG10OXYwMjJfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0JaW50IGRhdGE7CisJc3RydWN0IG10OXYwMjIgKm10OXYwMjIgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwKKwkJCQkJICAgICAgIHN0cnVjdCBtdDl2MDIyLCBoZGwpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSAmbXQ5djAyMi0+c3ViZGV2OwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsOwotCi0JcWN0cmwgPSBzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoJm10OXYwMjJfb3BzLCBjdHJsLT5pZCk7Ci0JaWYgKCFxY3RybCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaW50IGRhdGE7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJaWYgKGN0cmwtPnZhbHVlKQorCQlpZiAoY3RybC0+dmFsKQogCQkJZGF0YSA9IHJlZ19zZXQoY2xpZW50LCBNVDlWMDIyX1JFQURfTU9ERSwgMHgxMCk7CiAJCWVsc2UKIAkJCWRhdGEgPSByZWdfY2xlYXIoY2xpZW50LCBNVDlWMDIyX1JFQURfTU9ERSwgMHgxMCk7CiAJCWlmIChkYXRhIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQlicmVhazsKKwkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJaWYgKGN0cmwtPnZhbHVlKQorCQlpZiAoY3RybC0+dmFsKQogCQkJZGF0YSA9IHJlZ19zZXQoY2xpZW50LCBNVDlWMDIyX1JFQURfTU9ERSwgMHgyMCk7CiAJCWVsc2UKIAkJCWRhdGEgPSByZWdfY2xlYXIoY2xpZW50LCBNVDlWMDIyX1JFQURfTU9ERSwgMHgyMCk7CiAJCWlmIChkYXRhIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCS8qIG10OXYwMjIgaGFzIG1pbmltdW0gPT0gZGVmYXVsdCAqLwotCQlpZiAoY3RybC0+dmFsdWUgPiBxY3RybC0+bWF4aW11bSB8fCBjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVsc2UgewotCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPm1pbmltdW07CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46CisJCWlmIChjdHJsLT52YWwpIHsKKwkJCWlmIChyZWdfc2V0KGNsaWVudCwgTVQ5VjAyMl9BRUNfQUdDX0VOQUJMRSwgMHgyKSA8IDApCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluID0gbXQ5djAyMi0+Z2FpbjsKKwkJCS8qIG10OXYwMjIgaGFzIG1pbmltdW0gPT0gZGVmYXVsdCAqLworCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IGdhaW4tPm1heGltdW0gLSBnYWluLT5taW5pbXVtOwogCQkJLyogVmFsaWQgdmFsdWVzIDE2IHRvIDY0LCAzMiB0byA2NCBtdXN0IGJlIGV2ZW4uICovCi0JCQl1bnNpZ25lZCBsb25nIGdhaW4gPSAoKGN0cmwtPnZhbHVlIC0gcWN0cmwtPm1pbmltdW0pICoKKwkJCXVuc2lnbmVkIGxvbmcgZ2Fpbl92YWwgPSAoKGdhaW4tPnZhbCAtIGdhaW4tPm1pbmltdW0pICoKIAkJCQkJICAgICAgNDggKyByYW5nZSAvIDIpIC8gcmFuZ2UgKyAxNjsKLQkJCWlmIChnYWluID49IDMyKQotCQkJCWdhaW4gJj0gfjE7CisKKwkJCWlmIChnYWluX3ZhbCA+PSAzMikKKwkJCQlnYWluX3ZhbCAmPSB+MTsKKwogCQkJLyoKIAkJCSAqIFRoZSB1c2VyIHdhbnRzIHRvIHNldCBnYWluIG1hbnVhbGx5LCBob3BlLCBzaGUKIAkJCSAqIGtub3dzLCB3aGF0IHNoZSdzIGRvaW5nLi4uIFN3aXRjaCBBR0Mgb2ZmLgogCQkJICovCi0KIAkJCWlmIChyZWdfY2xlYXIoY2xpZW50LCBNVDlWMDIyX0FFQ19BR0NfRU5BQkxFLCAweDIpIDwgMCkKIAkJCQlyZXR1cm4gLUVJTzsKIAogCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTZXR0aW5nIGdhaW4gZnJvbSAlZCB0byAlbHVcbiIsCi0JCQkJcmVnX3JlYWQoY2xpZW50LCBNVDlWMDIyX0FOQUxPR19HQUlOKSwgZ2Fpbik7Ci0JCQlpZiAocmVnX3dyaXRlKGNsaWVudCwgTVQ5VjAyMl9BTkFMT0dfR0FJTiwgZ2FpbikgPCAwKQorCQkJCXJlZ19yZWFkKGNsaWVudCwgTVQ5VjAyMl9BTkFMT0dfR0FJTiksIGdhaW5fdmFsKTsKKwkJCWlmIChyZWdfd3JpdGUoY2xpZW50LCBNVDlWMDIyX0FOQUxPR19HQUlOLCBnYWluX3ZhbCkgPCAwKQogCQkJCXJldHVybiAtRUlPOwogCQl9Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCS8qIG10OXYwMjIgaGFzIG1heGltdW0gPT0gZGVmYXVsdCAqLwotCQlpZiAoY3RybC0+dmFsdWUgPiBxY3RybC0+bWF4aW11bSB8fCBjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVsc2UgewotCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPm1pbmltdW07Ci0JCQl1bnNpZ25lZCBsb25nIHNodXR0ZXIgPSAoKGN0cmwtPnZhbHVlIC0gcWN0cmwtPm1pbmltdW0pICoKLQkJCQkJCSA0NzkgKyByYW5nZSAvIDIpIC8gcmFuZ2UgKyAxOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86CisJCWlmIChjdHJsLT52YWwgPT0gVjRMMl9FWFBPU1VSRV9BVVRPKSB7CisJCQlkYXRhID0gcmVnX3NldChjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUsIDB4MSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgdjRsMl9jdHJsICpleHAgPSBtdDl2MDIyLT5leHBvc3VyZTsKKwkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBleHAtPm1heGltdW0gLSBleHAtPm1pbmltdW07CisJCQl1bnNpZ25lZCBsb25nIHNodXR0ZXIgPSAoKGV4cC0+dmFsIC0gZXhwLT5taW5pbXVtKSAqCisJCQkJCTQ3OSArIHJhbmdlIC8gMikgLyByYW5nZSArIDE7CisKIAkJCS8qCiAJCQkgKiBUaGUgdXNlciB3YW50cyB0byBzZXQgc2h1dHRlciB3aWR0aCBtYW51YWxseSwgaG9wZSwKIAkJCSAqIHNoZSBrbm93cywgd2hhdCBzaGUncyBkb2luZy4uLiBTd2l0Y2ggQUVDIG9mZi4KIAkJCSAqLwotCi0JCQlpZiAocmVnX2NsZWFyKGNsaWVudCwgTVQ5VjAyMl9BRUNfQUdDX0VOQUJMRSwgMHgxKSA8IDApCisJCQlkYXRhID0gcmVnX2NsZWFyKGNsaWVudCwgTVQ5VjAyMl9BRUNfQUdDX0VOQUJMRSwgMHgxKTsKKwkJCWlmIChkYXRhIDwgMCkKIAkJCQlyZXR1cm4gLUVJTzsKLQogCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTaHV0dGVyIHdpZHRoIGZyb20gJWQgdG8gJWx1XG4iLAotCQkJCXJlZ19yZWFkKGNsaWVudCwgTVQ5VjAyMl9UT1RBTF9TSFVUVEVSX1dJRFRIKSwKLQkJCQlzaHV0dGVyKTsKKwkJCQkJcmVnX3JlYWQoY2xpZW50LCBNVDlWMDIyX1RPVEFMX1NIVVRURVJfV0lEVEgpLAorCQkJCQlzaHV0dGVyKTsKIAkJCWlmIChyZWdfd3JpdGUoY2xpZW50LCBNVDlWMDIyX1RPVEFMX1NIVVRURVJfV0lEVEgsCi0JCQkJICAgICAgc2h1dHRlcikgPCAwKQorCQkJCQkJc2h1dHRlcikgPCAwKQogCQkJCXJldHVybiAtRUlPOwogCQl9Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46Ci0JCWlmIChjdHJsLT52YWx1ZSkKLQkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgTVQ5VjAyMl9BRUNfQUdDX0VOQUJMRSwgMHgyKTsKLQkJZWxzZQotCQkJZGF0YSA9IHJlZ19jbGVhcihjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUsIDB4Mik7Ci0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86Ci0JCWlmIChjdHJsLT52YWx1ZSkKLQkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgTVQ5VjAyMl9BRUNfQUdDX0VOQUJMRSwgMHgxKTsKLQkJZWxzZQotCQkJZGF0YSA9IHJlZ19jbGVhcihjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUsIDB4MSk7Ci0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQlicmVhazsKKwkJcmV0dXJuIDA7CiAJfQotCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKgogICogSW50ZXJmYWNlIGFjdGl2ZSwgY2FuIHVzZSBpMmMuIElmIGl0IGZhaWxzLCBpdCBjYW4gaW5kZWVkIG1lYW4sIHRoYXQKICAqIHRoaXMgd2Fzbid0IG91ciBjYXB0dXJlIGludGVyZmFjZSwgc28sIHdlIHdhaXQgZm9yIHRoZSByaWdodCBvbmUKICAqLwotc3RhdGljIGludCBtdDl2MDIyX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG10OXYwMjJfdmlkZW9fcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbXQ5djAyMiAqbXQ5djAyMiA9IHRvX210OXYwMjIoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJczMyIGRhdGE7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KLQlCVUdfT04oIWljZC0+cGFyZW50IHx8Ci0JICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwotCiAJLyogUmVhZCBvdXQgdGhlIGNoaXAgdmVyc2lvbiByZWdpc3RlciAqLwogCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfQ0hJUF9WRVJTSU9OKTsKIApAQCAtODA1LDE2ICs2NDQsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIG10OXYwMjJfdmlkZW9fcmVtb3ZlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCi0JZGV2X2RiZyhpY2QtPnBkZXYsICJWaWRlbyByZW1vdmVkOiAlcCwgJXBcbiIsCi0JCWljZC0+cGFyZW50LCBpY2QtPnZkZXYpOwotCWlmIChpY2wtPmZyZWVfYnVzKQotCQlpY2wtPmZyZWVfYnVzKGljbCk7Ci19Ci0KIHN0YXRpYyBpbnQgbXQ5djAyMl9nX3NraXBfdG9wX2xpbmVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiAqbGluZXMpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwpAQCAtODI1LDkgKzY1NCwxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgbXQ5djAyMl9jdHJsX29wcyA9IHsKKwkuZ192b2xhdGlsZV9jdHJsID0gbXQ5djAyMl9nX3ZvbGF0aWxlX2N0cmwsCisJLnNfY3RybCA9IG10OXYwMjJfc19jdHJsLAorfTsKKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtdDl2MDIyX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuZ19jdHJsCQk9IG10OXYwMjJfZ19jdHJsLAotCS5zX2N0cmwJCT0gbXQ5djAyMl9zX2N0cmwsCiAJLmdfY2hpcF9pZGVudAk9IG10OXYwMjJfZ19jaGlwX2lkZW50LAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIAkuZ19yZWdpc3Rlcgk9IG10OXYwMjJfZ19yZWdpc3RlciwKQEAgLTg0OCw2ICs2ODAsNzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtdDl2MDIyX2dfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisKKwljZmctPmZsYWdzID0gVjRMMl9NQlVTX01BU1RFUiB8IFY0TDJfTUJVU19TTEFWRSB8CisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyB8CisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cgfAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSDsKKwljZmctPnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUw7CisJY2ZnLT5mbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5djAyMl9zX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIGNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5djAyMiAqbXQ5djAyMiA9IHRvX210OXYwMjIoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisJdW5zaWduZWQgaW50IGJwcyA9IHNvY19tYnVzX2dldF9mbXRkZXNjKG10OXYwMjItPmZtdC0+Y29kZSktPmJpdHNfcGVyX3NhbXBsZTsKKwlpbnQgcmV0OworCXUxNiBwaXhjbGsgPSAwOworCisJaWYgKGljbC0+c2V0X2J1c19wYXJhbSkgeworCQlyZXQgPSBpY2wtPnNldF9idXNfcGFyYW0oaWNsLCAxIDw8IChicHMgLSAxKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAoYnBzICE9IDEwKSB7CisJCS8qCisJCSAqIFdpdGhvdXQgYm9hcmQgc3BlY2lmaWMgYnVzIHdpZHRoIHNldHRpbmdzIHdlIG9ubHkgc3VwcG9ydCB0aGUKKwkJICogc2Vuc29ycyBuYXRpdmUgYnVzIHdpZHRoCisJCSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORykKKwkJcGl4Y2xrIHw9IDB4MTA7CisKKwlpZiAoIShmbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCkpCisJCXBpeGNsayB8PSAweDE7CisKKwlpZiAoIShmbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCkpCisJCXBpeGNsayB8PSAweDI7CisKKwlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlWMDIyX1BJWENMS19GVl9MViwgcGl4Y2xrKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghKGZsYWdzICYgVjRMMl9NQlVTX01BU1RFUikpCisJCW10OXYwMjItPmNoaXBfY29udHJvbCAmPSB+MHg4OworCisJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5VjAyMl9DSElQX0NPTlRST0wsIG10OXYwMjItPmNoaXBfY29udHJvbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkNhbGN1bGF0ZWQgcGl4Y2xrIDB4JXgsIGNoaXAgY29udHJvbCAweCV4XG4iLAorCQlwaXhjbGssIG10OXYwMjItPmNoaXBfY29udHJvbCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgbXQ5djAyMl9zdWJkZXZfdmlkZW9fb3BzID0gewogCS5zX3N0cmVhbQk9IG10OXYwMjJfc19zdHJlYW0sCiAJLnNfbWJ1c19mbXQJPSBtdDl2MDIyX3NfZm10LApAQCAtODU3LDYgKzc1NSw4IEBACiAJLmdfY3JvcAkJPSBtdDl2MDIyX2dfY3JvcCwKIAkuY3JvcGNhcAk9IG10OXYwMjJfY3JvcGNhcCwKIAkuZW51bV9tYnVzX2ZtdAk9IG10OXYwMjJfZW51bV9mbXQsCisJLmdfbWJ1c19jb25maWcJPSBtdDl2MDIyX2dfbWJ1c19jb25maWcsCisJLnNfbWJ1c19jb25maWcJPSBtdDl2MDIyX3NfbWJ1c19jb25maWcsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3NlbnNvcl9vcHMgbXQ5djAyMl9zdWJkZXZfc2Vuc29yX29wcyA9IHsKQEAgLTg3MywxNyArNzczLDEwIEBACiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIHsKIAlzdHJ1Y3QgbXQ5djAyMiAqbXQ5djAyMjsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOwogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsOwogCWludCByZXQ7CiAKLQlpZiAoIWljZCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1UOVYwMjI6IG1pc3Npbmcgc29jLWNhbWVyYSBkYXRhIVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwogCWlmICghaWNsKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTVQ5VjAyMiBkcml2ZXIgbmVlZHMgcGxhdGZvcm0gZGF0YVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTAwLDEwICs3OTMsMzkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdCgmbXQ5djAyMi0+c3ViZGV2LCBjbGllbnQsICZtdDl2MDIyX3N1YmRldl9vcHMpOworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJm10OXYwMjItPmhkbCwgNik7CisJdjRsMl9jdHJsX25ld19zdGQoJm10OXYwMjItPmhkbCwgJm10OXYwMjJfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9WRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJm10OXYwMjItPmhkbCwgJm10OXYwMjJfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9IRkxJUCwgMCwgMSwgMSwgMCk7CisJbXQ5djAyMi0+YXV0b2dhaW4gPSB2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5djAyMi0+aGRsLCAmbXQ5djAyMl9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0FVVE9HQUlOLCAwLCAxLCAxLCAxKTsKKwltdDl2MDIyLT5nYWluID0gdjRsMl9jdHJsX25ld19zdGQoJm10OXYwMjItPmhkbCwgJm10OXYwMjJfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9HQUlOLCAwLCAxMjcsIDEsIDY0KTsKKworCS8qCisJICogU2ltdWxhdGVkIGF1dG9leHBvc3VyZS4gSWYgZW5hYmxlZCwgd2UgY2FsY3VsYXRlIHNodXR0ZXIgd2lkdGgKKwkgKiBvdXJzZWx2ZXMgaW4gdGhlIGRyaXZlciBiYXNlZCBvbiB2ZXJ0aWNhbCBibGFua2luZyBhbmQgZnJhbWUgd2lkdGgKKwkgKi8KKwltdDl2MDIyLT5hdXRvZXhwb3N1cmUgPSB2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KCZtdDl2MDIyLT5oZGwsCisJCQkmbXQ5djAyMl9jdHJsX29wcywgVjRMMl9DSURfRVhQT1NVUkVfQVVUTywgMSwgMCwKKwkJCVY0TDJfRVhQT1NVUkVfQVVUTyk7CisJbXQ5djAyMi0+ZXhwb3N1cmUgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5djAyMi0+aGRsLCAmbXQ5djAyMl9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0VYUE9TVVJFLCAxLCAyNTUsIDEsIDI1NSk7CisKKwltdDl2MDIyLT5zdWJkZXYuY3RybF9oYW5kbGVyID0gJm10OXYwMjItPmhkbDsKKwlpZiAobXQ5djAyMi0+aGRsLmVycm9yKSB7CisJCWludCBlcnIgPSBtdDl2MDIyLT5oZGwuZXJyb3I7CisKKwkJa2ZyZWUobXQ5djAyMik7CisJCXJldHVybiBlcnI7CisJfQorCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMiwgJm10OXYwMjItPmF1dG9leHBvc3VyZSwKKwkJCQlWNEwyX0VYUE9TVVJFX01BTlVBTCwgdHJ1ZSk7CisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigyLCAmbXQ5djAyMi0+YXV0b2dhaW4sIDAsIHRydWUpOwogCiAJbXQ5djAyMi0+Y2hpcF9jb250cm9sID0gTVQ5VjAyMl9DSElQX0NPTlRST0xfREVGQVVMVDsKIAotCWljZC0+b3BzCQk9ICZtdDl2MDIyX29wczsKIAkvKgogCSAqIE1UOVYwMjIgX3JlYWxseV8gY29ycnVwdHMgdGhlIGZpcnN0IHJlYWQgb3V0IGxpbmUuCiAJICogVE9ETzogdmVyaWZ5IG9uIGkuTVgzMQpAQCAtOTE0LDkgKzgzNiw5IEBACiAJbXQ5djAyMi0+cmVjdC53aWR0aAk9IE1UOVYwMjJfTUFYX1dJRFRIOwogCW10OXYwMjItPnJlY3QuaGVpZ2h0CT0gTVQ5VjAyMl9NQVhfSEVJR0hUOwogCi0JcmV0ID0gbXQ5djAyMl92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJcmV0ID0gbXQ5djAyMl92aWRlb19wcm9iZShjbGllbnQpOwogCWlmIChyZXQpIHsKLQkJaWNkLT5vcHMgPSBOVUxMOworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZtdDl2MDIyLT5oZGwpOwogCQlrZnJlZShtdDl2MDIyKTsKIAl9CiAKQEAgLTkyNiwxMCArODQ4LDEyIEBACiBzdGF0aWMgaW50IG10OXYwMjJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG10OXYwMjIgKm10OXYwMjIgPSB0b19tdDl2MDIyKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAotCWljZC0+b3BzID0gTlVMTDsKLQltdDl2MDIyX3ZpZGVvX3JlbW92ZShpY2QpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZtdDl2MDIyLT5zdWJkZXYpOworCWlmIChpY2wtPmZyZWVfYnVzKQorCQlpY2wtPmZyZWVfYnVzKGljbCk7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmbXQ5djAyMi0+aGRsKTsKIAlrZnJlZShtdDl2MDIyKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMzIuYwppbmRleCBjNjRlMWRjLi5mMDgwYzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMzIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMzIuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9tdDl2MDMyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214MV9jYW1lcmEuYwppbmRleCAwODdkYjEyLi4xOGU5NGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214MV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214MV9jYW1lcmEuYwpAQCAtNzgsMTEgKzc4LDEwIEBACiAjZGVmaW5lIENTSV9JUlFfTUFTSwkoQ1NJU1JfU0ZGX09SX0lOVCB8IENTSVNSX1JGRl9PUl9JTlQgfCBcCiAJCQlDU0lTUl9TVEFURkZfSU5UIHwgQ1NJU1JfUlhGRl9JTlQgfCBDU0lTUl9TT0ZfSU5UKQogCi0jZGVmaW5lIENTSV9CVVNfRkxBR1MJKFNPQ0FNX01BU1RFUiB8IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgXAotCQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XIHwgXAotCQkJU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8IFwKLQkJCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0ggfCBTT0NBTV9EQVRBX0FDVElWRV9MT1cgfCBcCi0JCQlTT0NBTV9EQVRBV0lEVEhfOCkKKyNkZWZpbmUgQ1NJX0JVU19GTEFHUwkoVjRMMl9NQlVTX01BU1RFUiB8IFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8IFwKKwkJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XIHwgXAorCQkJVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwgXAorCQkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XKQogCiAjZGVmaW5lIE1BWF9WSURFT19NRU0gMTYJLyogVmlkZW8gbWVtb3J5IGxpbWl0IGluIG1lZ2FieXRlcyAqLwogCkBAIC00OTAsNTkgKzQ4OSw3MyBAQAogCiBzdGF0aWMgaW50IG14MV9jYW1lcmFfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgX191MzIgcGl4Zm10KQogeworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNmZyA9IHsudHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTCx9OworCXVuc2lnbmVkIGxvbmcgY29tbW9uX2ZsYWdzOwogCXVuc2lnbmVkIGludCBjc2ljcjE7CiAJaW50IHJldDsKIAotCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKLQogCS8qIE1YMSBzdXBwb3J0cyBvbmx5IDhiaXQgYnVzd2lkdGggKi8KLQljb21tb25fZmxhZ3MgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywKLQkJCQkJCSAgICAgICBDU0lfQlVTX0ZMQUdTKTsKLQlpZiAoIWNvbW1vbl9mbGFncykKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19jb25maWcsICZjZmcpOworCWlmICghcmV0KSB7CisJCWNvbW1vbl9mbGFncyA9IHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKCZjZmcsIENTSV9CVVNfRkxBR1MpOworCQlpZiAoIWNvbW1vbl9mbGFncykgeworCQkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCisJCQkJICJGbGFncyBpbmNvbXBhdGlibGU6IGNhbWVyYSAweCV4LCBob3N0IDB4JXhcbiIsCisJCQkJIGNmZy5mbGFncywgQ1NJX0JVU19GTEFHUyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkgeworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCWNvbW1vbl9mbGFncyA9IENTSV9CVVNfRkxBR1M7CisJfQogCiAJLyogTWFrZSBjaG9pc2VzLCBiYXNlZCBvbiBwbGF0Zm9ybSBjaG9pY2UgKi8KLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIKSAmJgotCQkoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkJKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKSkgewogCQkJaWYgKCFwY2Rldi0+cGRhdGEgfHwKIAkJCSAgICAgcGNkZXYtPnBkYXRhLT5mbGFncyAmIE1YMV9DQU1FUkFfVlNZTkNfSElHSCkKLQkJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1ZTWU5DX0FDVElWRV9MT1c7CisJCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVzsKIAkJCWVsc2UKLQkJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIOworCQkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIOwogCX0KIAotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfUklTSU5HKSAmJgotCQkoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcpICYmCisJCShjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORykpIHsKIAkJCWlmICghcGNkZXYtPnBkYXRhIHx8CiAJCQkgICAgIHBjZGV2LT5wZGF0YS0+ZmxhZ3MgJiBNWDFfQ0FNRVJBX1BDTEtfUklTSU5HKQotCQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfRkFMTElORzsKKwkJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HOwogCQkJZWxzZQotCQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfUklTSU5HOworCQkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORzsKIAl9CiAKLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0RBVEFfQUNUSVZFX0hJR0gpICYmCi0JCShjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBX0FDVElWRV9MT1cpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCkgJiYKKwkJKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19EQVRBX0FDVElWRV9MT1cpKSB7CiAJCQlpZiAoIXBjZGV2LT5wZGF0YSB8fAogCQkJICAgICBwY2Rldi0+cGRhdGEtPmZsYWdzICYgTVgxX0NBTUVSQV9EQVRBX0hJR0gpCi0JCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9EQVRBX0FDVElWRV9MT1c7CisJCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XOwogCQkJZWxzZQotCQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fREFUQV9BQ1RJVkVfSElHSDsKKwkJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIOwogCX0KIAotCXJldCA9IGljZC0+b3BzLT5zZXRfYnVzX3BhcmFtKGljZCwgY29tbW9uX2ZsYWdzKTsKLQlpZiAocmV0IDwgMCkKKwljZmcuZmxhZ3MgPSBjb21tb25fZmxhZ3M7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfbWJ1c19jb25maWcsICZjZmcpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PSU9DVExDTUQpIHsKKwkJZGV2X2RiZyhpY2QtPnBhcmVudCwgImNhbWVyYSBzX21idXNfY29uZmlnKDB4JWx4KSByZXR1cm5lZCAlZFxuIiwKKwkJCWNvbW1vbl9mbGFncywgcmV0KTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAljc2ljcjEgPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENTSUNSMSk7CiAKLQlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfUklTSU5HKQorCWlmIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKQogCQljc2ljcjEgfD0gQ1NJQ1IxX1JFREdFOwotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCkKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIKQogCQljc2ljcjEgfD0gQ1NJQ1IxX1NPRl9QT0w7Ci0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0RBVEFfQUNUSVZFX0xPVykKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0xPVykKIAkJY3NpY3IxIHw9IENTSUNSMV9EQVRBX1BPTDsKIAogCV9fcmF3X3dyaXRlbChjc2ljcjEsIHBjZGV2LT5iYXNlICsgQ1NJQ1IxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgyX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKaW5kZXggZWMyNDEwYy4uYTgwM2Q5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKQEAgLTY4NiwxNiArNjg2LDE1IEBACiAJCQlpY2QsICZpY2QtPnZpZGVvX2xvY2spOwogfQogCi0jZGVmaW5lIE1YMl9CVVNfRkxBR1MJKFNPQ0FNX0RBVEFXSURUSF84IHwgXAotCQkJU09DQU1fTUFTVEVSIHwgXAotCQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBcCi0JCQlTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XIHwgXAotCQkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfCBcCi0JCQlTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XIHwgXAotCQkJU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgXAotCQkJU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8IFwKLQkJCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0ggfCBcCi0JCQlTT0NBTV9EQVRBX0FDVElWRV9MT1cpCisjZGVmaW5lIE1YMl9CVVNfRkxBR1MJKFY0TDJfTUJVU19NQVNURVIgfCBcCisJCQlWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBcCisJCQlWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVyB8IFwKKwkJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8IFwKKwkJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XIHwgXAorCQkJVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8IFwKKwkJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwgXAorCQkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0ggfCBcCisJCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XKQogCiBzdGF0aWMgaW50IG14MjdfY2FtZXJhX2VtbWFfcHJwX3Jlc2V0KHN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYpCiB7CkBAIC03NzAsNDYgKzc2OSw1OSBAQAogc3RhdGljIGludCBteDJfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCV9fdTMyIHBpeGZtdCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOwotCWludCByZXQgPSAwOworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNmZyA9IHsudHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTCx9OworCXVuc2lnbmVkIGxvbmcgY29tbW9uX2ZsYWdzOworCWludCByZXQ7CiAJaW50IGJ5dGVzcGVybGluZTsKIAl1MzIgY3NpY3IxID0gcGNkZXYtPmNzaWNyMTsKIAotCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKLQotCWNvbW1vbl9mbGFncyA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLAotCQkJCU1YMl9CVVNfRkxBR1MpOwotCWlmICghY29tbW9uX2ZsYWdzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0gpICYmCi0JICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKSkgewotCQlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgTVgyX0NBTUVSQV9IU1lOQ19ISUdIKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfTE9XOwotCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIOwotCX0KLQotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfUklTSU5HKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykpIHsKLQkJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIE1YMl9DQU1FUkFfUENMS19TQU1QTEVfUklTSU5HKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HOwotCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORzsKLQl9Ci0KLQlyZXQgPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbShpY2QsIGNvbW1vbl9mbGFncyk7Ci0JaWYgKHJldCA8IDApCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19jb25maWcsICZjZmcpOworCWlmICghcmV0KSB7CisJCWNvbW1vbl9mbGFncyA9IHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKCZjZmcsIE1YMl9CVVNfRkxBR1MpOworCQlpZiAoIWNvbW1vbl9mbGFncykgeworCQkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCisJCQkJICJGbGFncyBpbmNvbXBhdGlibGU6IGNhbWVyYSAweCV4LCBob3N0IDB4JXhcbiIsCisJCQkJIGNmZy5mbGFncywgTVgyX0JVU19GTEFHUyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkgewogCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCWNvbW1vbl9mbGFncyA9IE1YMl9CVVNfRkxBR1M7CisJfQogCi0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKSkgeworCQlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgTVgyX0NBTUVSQV9IU1lOQ19ISUdIKQorCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVzsKKwkJZWxzZQorCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0g7CisJfQorCisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CisJCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBNWDJfQ0FNRVJBX1BDTEtfU0FNUExFX1JJU0lORykKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkc7CisJCWVsc2UKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORzsKKwl9CisKKwljZmcuZmxhZ3MgPSBjb21tb25fZmxhZ3M7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfbWJ1c19jb25maWcsICZjZmcpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PSU9DVExDTUQpIHsKKwkJZGV2X2RiZyhpY2QtPnBhcmVudCwgImNhbWVyYSBzX21idXNfY29uZmlnKDB4JWx4KSByZXR1cm5lZCAlZFxuIiwKKwkJCWNvbW1vbl9mbGFncywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORykKIAkJY3NpY3IxIHw9IENTSUNSMV9SRURHRTsKLQlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0gpCisJaWYgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCkKIAkJY3NpY3IxIHw9IENTSUNSMV9TT0ZfUE9MOwotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCkKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIKQogCQljc2ljcjEgfD0gQ1NJQ1IxX0hTWU5DX1BPTDsKIAlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgTVgyX0NBTUVSQV9TV0FQMTYpCiAJCWNzaWNyMSB8PSBDU0lDUjFfU1dBUDE2X0VOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9teDNfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214M19jYW1lcmEuYwppbmRleCBjMDQ1YjQ3Li5mOTZmOTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214M19jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214M19jYW1lcmEuYwpAQCAtMTA5LDEwICsxMDksMTIgQEAKIAogCXVuc2lnbmVkIGxvbmcJCXBsYXRmb3JtX2ZsYWdzOwogCXVuc2lnbmVkIGxvbmcJCW1jbGs7CisJdTE2CQkJd2lkdGhfZmxhZ3M7CS8qIG1heCAxNSBiaXRzICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWNhcHR1cmU7CiAJc3BpbmxvY2tfdAkJbG9jazsJCS8qIFByb3RlY3RzIHZpZGVvIGJ1ZmZlciBsaXN0cyAqLwogCXN0cnVjdCBteDNfY2FtZXJhX2J1ZmZlciAqYWN0aXZlOworCXNpemVfdAkJCWJ1Zl90b3RhbDsKIAlzdHJ1Y3QgdmIyX2FsbG9jX2N0eAkqYWxsb2NfY3R4OwogCWVudW0gdjRsMl9maWVsZAkJZmllbGQ7CiAJaW50CQkJc2VxdWVuY2U7CkBAIC0xOTAsNzkgKzE5Miw1MyBAQAogICogQ2FsY3VsYXRlIHRoZSBfX2J1ZmZlcl9fIChub3QgZGF0YSkgc2l6ZSBhbmQgbnVtYmVyIG9mIGJ1ZmZlcnMuCiAgKi8KIHN0YXRpYyBpbnQgbXgzX3ZpZGVvYnVmX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLAorCQkJY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCiAJCQl1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsCi0JCQl1bnNpZ25lZCBsb25nIHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKKwkJCXVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY19jdHhzW10pCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2cSk7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7Ci0JaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAotCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwotCi0JaWYgKGJ5dGVzX3Blcl9saW5lIDwgMCkKLQkJcmV0dXJuIGJ5dGVzX3Blcl9saW5lOworCWludCBieXRlc19wZXJfbGluZTsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OwogCiAJaWYgKCFteDNfY2FtLT5pZG1hY19jaGFubmVsWzBdKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSpudW1fcGxhbmVzID0gMTsKLQotCW14M19jYW0tPnNlcXVlbmNlID0gMDsKLQlzaXplc1swXSA9IGJ5dGVzX3Blcl9saW5lICogaWNkLT51c2VyX2hlaWdodDsKLQlhbGxvY19jdHhzWzBdID0gbXgzX2NhbS0+YWxsb2NfY3R4OwotCi0JaWYgKCEqY291bnQpCi0JCSpjb3VudCA9IDMyOwotCi0JaWYgKHNpemVzWzBdICogKmNvdW50ID4gTUFYX1ZJREVPX01FTSAqIDEwMjQgKiAxMDI0KQotCQkqY291bnQgPSBNQVhfVklERU9fTUVNICogMTAyNCAqIDEwMjQgLyBzaXplc1swXTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG14M192aWRlb2J1Zl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZiLT52YjJfcXVldWUpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7Ci0Jc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwotCXN0cnVjdCBpZG1hY19jaGFubmVsICppY2hhbiA9IG14M19jYW0tPmlkbWFjX2NoYW5uZWxbMF07Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlzdHJ1Y3QgbXgzX2NhbWVyYV9idWZmZXIgKmJ1ZjsKLQlzaXplX3QgbmV3X3NpemU7Ci0JaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAorCWlmIChmbXQpIHsKKwkJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwKKwkJCQkJCQkJZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwkJaWYgKCF4bGF0ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGZtdC0+Zm10LnBpeC53aWR0aCwKKwkJCQkJCQkgeGxhdGUtPmhvc3RfZm10KTsKKwkJaGVpZ2h0ID0gZm10LT5mbXQucGl4LmhlaWdodDsKKwl9IGVsc2UgeworCQkvKiBDYWxsZWQgZnJvbSBWSURJT0NfUkVRQlVGUyBvciBpbiBjb21wYXRpYmlsaXR5IG1vZGUgKi8KKwkJYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCiAJCQkJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7Ci0KKwkJaGVpZ2h0ID0gaWNkLT51c2VyX2hlaWdodDsKKwl9CiAJaWYgKGJ5dGVzX3Blcl9saW5lIDwgMCkKIAkJcmV0dXJuIGJ5dGVzX3Blcl9saW5lOwogCi0JYnVmID0gdG9fbXgzX3ZiKHZiKTsKLQlzZyA9ICZidWYtPnNnOworCXNpemVzWzBdID0gYnl0ZXNfcGVyX2xpbmUgKiBoZWlnaHQ7CiAKLQluZXdfc2l6ZSA9IGJ5dGVzX3Blcl9saW5lICogaWNkLT51c2VyX2hlaWdodDsKKwlhbGxvY19jdHhzWzBdID0gbXgzX2NhbS0+YWxsb2NfY3R4OwogCi0JaWYgKHZiMl9wbGFuZV9zaXplKHZiLCAwKSA8IG5ld19zaXplKSB7Ci0JCWRldl9lcnIoaWNkLT5wYXJlbnQsICJCdWZmZXIgdG9vIHNtYWxsICglbHUgPCAlenUpXG4iLAotCQkJdmIyX3BsYW5lX3NpemUodmIsIDApLCBuZXdfc2l6ZSk7Ci0JCXJldHVybiAtRU5PQlVGUzsKLQl9CisJaWYgKCF2cS0+bnVtX2J1ZmZlcnMpCisJCW14M19jYW0tPnNlcXVlbmNlID0gMDsKIAotCWlmIChidWYtPnN0YXRlID09IENTSV9CVUZfTkVFRFNfSU5JVCkgewotCQlzZ19kbWFfYWRkcmVzcyhzZykJPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCk7Ci0JCXNnX2RtYV9sZW4oc2cpCQk9IG5ld19zaXplOworCWlmICghKmNvdW50KQorCQkqY291bnQgPSAyOwogCi0JCWJ1Zi0+dHhkID0gaWNoYW4tPmRtYV9jaGFuLmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coCi0JCQkmaWNoYW4tPmRtYV9jaGFuLCBzZywgMSwgRE1BX0ZST01fREVWSUNFLAotCQkJRE1BX1BSRVBfSU5URVJSVVBUKTsKLQkJaWYgKCFidWYtPnR4ZCkKLQkJCXJldHVybiAtRUlPOworCS8qIElmICpudW1fcGxhbmVzICE9IDAsIHdlIGhhdmUgYWxyZWFkeSB2ZXJpZmllZCAqY291bnQuICovCisJaWYgKCEqbnVtX3BsYW5lcyAmJgorCSAgICBzaXplc1swXSAqICpjb3VudCArIG14M19jYW0tPmJ1Zl90b3RhbCA+IE1BWF9WSURFT19NRU0gKiAxMDI0ICogMTAyNCkKKwkJKmNvdW50ID0gKE1BWF9WSURFT19NRU0gKiAxMDI0ICogMTAyNCAtIG14M19jYW0tPmJ1Zl90b3RhbCkgLworCQkJc2l6ZXNbMF07CiAKLQkJYnVmLT50eGQtPmNhbGxiYWNrX3BhcmFtCT0gYnVmLT50eGQ7Ci0JCWJ1Zi0+dHhkLT5jYWxsYmFjawkJPSBteDNfY2FtX2RtYV9kb25lOwotCi0JCWJ1Zi0+c3RhdGUgPSBDU0lfQlVGX1BSRVBBUkVEOwotCX0KLQotCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgbmV3X3NpemUpOworCSpudW1fcGxhbmVzID0gMTsKIAogCXJldHVybiAwOwogfQpAQCAtMjg2LDI4ICsyNjIsNTggQEAKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9idWZmZXIgKmJ1ZiA9IHRvX214M192Yih2Yik7Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGQgPSBidWYtPnR4ZDsKLQlzdHJ1Y3QgaWRtYWNfY2hhbm5lbCAqaWNoYW4gPSB0b19pZG1hY19jaGFuKHR4ZC0+Y2hhbik7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9ICZidWYtPnNnOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkOworCXN0cnVjdCBpZG1hY19jaGFubmVsICppY2hhbiA9IG14M19jYW0tPmlkbWFjX2NoYW5uZWxbMF07CiAJc3RydWN0IGlkbWFjX3ZpZGVvX3BhcmFtICp2aWRlbyA9ICZpY2hhbi0+cGFyYW1zLnZpZGVvOwotCWRtYV9jb29raWVfdCBjb29raWU7Ci0JdTMyIGZvdXJjYyA9IGljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10LT5mb3VyY2M7CisJY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICpob3N0X2ZtdCA9IGljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10OworCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwgaG9zdF9mbXQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKwlzaXplX3QgbmV3X3NpemU7CisKKwlCVUdfT04oYnl0ZXNfcGVyX2xpbmUgPD0gMCk7CisKKwluZXdfc2l6ZSA9IGJ5dGVzX3Blcl9saW5lICogaWNkLT51c2VyX2hlaWdodDsKKworCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBuZXdfc2l6ZSkgeworCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiQnVmZmVyICMlZCB0b28gc21hbGwgKCVsdSA8ICV6dSlcbiIsCisJCQl2Yi0+djRsMl9idWYuaW5kZXgsIHZiMl9wbGFuZV9zaXplKHZiLCAwKSwgbmV3X3NpemUpOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChidWYtPnN0YXRlID09IENTSV9CVUZfTkVFRFNfSU5JVCkgeworCQlzZ19kbWFfYWRkcmVzcyhzZykJPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7CisJCXNnX2RtYV9sZW4oc2cpCQk9IG5ld19zaXplOworCisJCXR4ZCA9IGljaGFuLT5kbWFfY2hhbi5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKAorCQkJJmljaGFuLT5kbWFfY2hhbiwgc2csIDEsIERNQV9GUk9NX0RFVklDRSwKKwkJCURNQV9QUkVQX0lOVEVSUlVQVCk7CisJCWlmICghdHhkKQorCQkJZ290byBlcnJvcjsKKworCQl0eGQtPmNhbGxiYWNrX3BhcmFtCT0gdHhkOworCQl0eGQtPmNhbGxiYWNrCQk9IG14M19jYW1fZG1hX2RvbmU7CisKKwkJYnVmLT5zdGF0ZQkJPSBDU0lfQlVGX1BSRVBBUkVEOworCQlidWYtPnR4ZAkJPSB0eGQ7CisJfSBlbHNlIHsKKwkJdHhkID0gYnVmLT50eGQ7CisJfQorCisJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiLCAwLCBuZXdfc2l6ZSk7CiAKIAkvKiBUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIG9mIG9uZSBzZy1lbGVtZW50ICovCi0JdmlkZW8tPm91dF9waXhlbF9mbXQJPSBmb3VyY2NfdG9faXB1X3BpeChmb3VyY2MpOworCXZpZGVvLT5vdXRfcGl4ZWxfZm10ID0gZm91cmNjX3RvX2lwdV9waXgoaG9zdF9mbXQtPmZvdXJjYyk7CiAKIAlpZiAodmlkZW8tPm91dF9waXhlbF9mbXQgPT0gSVBVX1BJWF9GTVRfR0VORVJJQykgewogCQkvKgotCQkgKiBJZiB0aGUgSVBVIERNQSBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgdG8gdHJhbnNwb3J0Ci0JCSAqIGdlbmVyaWMgOC1iaXQgZGF0YSwgd2UgaGF2ZSB0byBzZXQgdXAgY29ycmVjdGx5IHRoZQotCQkgKiBnZW9tZXRyeSBwYXJhbWV0ZXJzIHVwb24gdGhlIGN1cnJlbnQgcGl4ZWwgZm9ybWF0LgotCQkgKiBTbywgc2luY2UgdGhlIERNQSBob3Jpem9udGFsIHBhcmFtZXRlcnMgYXJlIGV4cHJlc3NlZAotCQkgKiBpbiBieXRlcyBub3QgcGl4ZWxzLCBjb252ZXJ0IHRoZXNlIGluIHRoZSByaWdodCB1bml0LgorCQkgKiBJZiB0aGUgSVBVIERNQSBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgdG8gdHJhbnNmZXIgZ2VuZXJpYworCQkgKiA4LWJpdCBkYXRhLCB3ZSBoYXZlIHRvIHNldCB1cCB0aGUgZ2VvbWV0cnkgcGFyYW1ldGVycworCQkgKiBjb3JyZWN0bHksIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwaXhlbCBmb3JtYXQuIFRoZSBETUEKKwkJICogaG9yaXpvbnRhbCBwYXJhbWV0ZXJzIGluIHRoaXMgY2FzZSBhcmUgZXhwcmVzc2VkIGluIGJ5dGVzLAorCQkgKiBub3QgaW4gcGl4ZWxzLgogCQkgKi8KLQkJaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAotCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwotCQlCVUdfT04oYnl0ZXNfcGVyX2xpbmUgPD0gMCk7Ci0KIAkJdmlkZW8tPm91dF93aWR0aAk9IGJ5dGVzX3Blcl9saW5lOwogCQl2aWRlby0+b3V0X2hlaWdodAk9IGljZC0+dXNlcl9oZWlnaHQ7CiAJCXZpZGVvLT5vdXRfc3RyaWRlCT0gYnl0ZXNfcGVyX2xpbmU7CkBAIC0zNTEsNiArMzU3LDcgQEAKIAkJbXgzX2NhbS0+YWN0aXZlID0gTlVMTDsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm14M19jYW0tPmxvY2ssIGZsYWdzKTsKK2Vycm9yOgogCXZiMl9idWZmZXJfZG9uZSh2YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CiB9CiAKQEAgLTM4NCwxNyArMzkxLDI0IEBACiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXgzX2NhbS0+bG9jaywgZmxhZ3MpOworCisJbXgzX2NhbS0+YnVmX3RvdGFsIC09IHZiMl9wbGFuZV9zaXplKHZiLCAwKTsKIH0KIAogc3RhdGljIGludCBteDNfdmlkZW9idWZfaW5pdChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCiB7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9idWZmZXIgKmJ1ZiA9IHRvX214M192Yih2Yik7CisKIAkvKiBUaGlzIGlzIGZvciBsb2NraW5nIGRlYnVnZ2luZyBvbmx5ICovCiAJSU5JVF9MSVNUX0hFQUQoJmJ1Zi0+cXVldWUpOwogCXNnX2luaXRfdGFibGUoJmJ1Zi0+c2csIDEpOwogCiAJYnVmLT5zdGF0ZSA9IENTSV9CVUZfTkVFRFNfSU5JVDsKLQlidWYtPnR4ZCA9IE5VTEw7CisKKwlteDNfY2FtLT5idWZfdG90YWwgKz0gdmIyX3BsYW5lX3NpemUodmIsIDApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDUsMTMgKzQxOSwxMiBAQAogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwogCXN0cnVjdCBpZG1hY19jaGFubmVsICppY2hhbiA9IG14M19jYW0tPmlkbWFjX2NoYW5uZWxbMF07Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuOwogCXN0cnVjdCBteDNfY2FtZXJhX2J1ZmZlciAqYnVmLCAqdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoaWNoYW4pIHsKLQkJY2hhbiA9ICZpY2hhbi0+ZG1hX2NoYW47Ci0JCWNoYW4tPmRldmljZS0+ZGV2aWNlX2NvbnRyb2woY2hhbiwgRE1BX1RFUk1JTkFURV9BTEwsIDApOworCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSAmaWNoYW4tPmRtYV9jaGFuOworCQljaGFuLT5kZXZpY2UtPmRldmljZV9jb250cm9sKGNoYW4sIERNQV9QQVVTRSwgMCk7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm14M19jYW0tPmxvY2ssIGZsYWdzKTsKQEAgLTQxOSw4ICs0MzIsOCBAQAogCW14M19jYW0tPmFjdGl2ZSA9IE5VTEw7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnVmLCB0bXAsICZteDNfY2FtLT5jYXB0dXJlLCBxdWV1ZSkgewotCQlidWYtPnN0YXRlID0gQ1NJX0JVRl9ORUVEU19JTklUOwogCQlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKKwkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZteDNfY2FtLT5sb2NrLCBmbGFncyk7CkBAIC00MzAsNyArNDQzLDYgQEAKIAogc3RhdGljIHN0cnVjdCB2YjJfb3BzIG14M192aWRlb2J1Zl9vcHMgPSB7CiAJLnF1ZXVlX3NldHVwCT0gbXgzX3ZpZGVvYnVmX3NldHVwLAotCS5idWZfcHJlcGFyZQk9IG14M192aWRlb2J1Zl9wcmVwYXJlLAogCS5idWZfcXVldWUJPSBteDNfdmlkZW9idWZfcXVldWUsCiAJLmJ1Zl9jbGVhbnVwCT0gbXgzX3ZpZGVvYnVmX3JlbGVhc2UsCiAJLmJ1Zl9pbml0CT0gbXgzX3ZpZGVvYnVmX2luaXQsCkBAIC01MTQsNiArNTI2LDcgQEAKIAogCW14M19jYW1lcmFfYWN0aXZhdGUobXgzX2NhbSwgaWNkKTsKIAorCW14M19jYW0tPmJ1Zl90b3RhbCA9IDA7CiAJbXgzX2NhbS0+aWNkID0gaWNkOwogCiAJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJNWDMgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCkBAIC01NDgsNTggKzU2MSwyNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgYnVzd2lkdGgsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCS8qCisJICogSWYgcmVxdWVzdGVkIGRhdGEgd2lkdGggaXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSwgdXNlIGl0IG9yIGFueQorCSAqIHBvc3NpYmxlIGxvd2VyIHZhbHVlIC0gaS5NWDMxIGlzIHNtYXJ0IGVub3VnaCB0byBzaGlmdCBiaXRzCisJICovCisJaWYgKGJ1c3dpZHRoID4gZmxzKG14M19jYW0tPndpZHRoX2ZsYWdzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgogCSAqIFBsYXRmb3JtIHNwZWNpZmllZCBzeW5jaHJvbml6YXRpb24gYW5kIHBpeGVsIGNsb2NrIHBvbGFyaXRpZXMgYXJlCiAJICogb25seSBhIHJlY29tbWVuZGF0aW9uIGFuZCBhcmUgb25seSB1c2VkIGR1cmluZyBwcm9iaW5nLiBNWDN4CiAJICogY2FtZXJhIGludGVyZmFjZSBvbmx5IHdvcmtzIGluIG1hc3RlciBtb2RlLCBpLmUuLCB1c2VzIEhTWU5DIGFuZAogCSAqIFZTWU5DIHNpZ25hbHMgZnJvbSB0aGUgc2Vuc29yCiAJICovCi0JKmZsYWdzID0gU09DQU1fTUFTVEVSIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XIHwKLQkJU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwKLQkJU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9EQVRBX0FDVElWRV9MT1c7Ci0KLQkvKgotCSAqIElmIHJlcXVlc3RlZCBkYXRhIHdpZHRoIGlzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0sIHVzZSBpdCBvciBhbnkKLQkgKiBwb3NzaWJsZSBsb3dlciB2YWx1ZSAtIGkuTVgzMSBpcyBzbWFydCBlbm91Z2ggdG8gc2NoaWZ0IGJpdHMKLQkgKi8KLQlpZiAobXgzX2NhbS0+cGxhdGZvcm1fZmxhZ3MgJiBNWDNfQ0FNRVJBX0RBVEFXSURUSF8xNSkKLQkJKmZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF8xNSB8IFNPQ0FNX0RBVEFXSURUSF8xMCB8Ci0JCQlTT0NBTV9EQVRBV0lEVEhfOCB8IFNPQ0FNX0RBVEFXSURUSF80OwotCWVsc2UgaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9EQVRBV0lEVEhfMTApCi0JCSpmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTAgfCBTT0NBTV9EQVRBV0lEVEhfOCB8Ci0JCQlTT0NBTV9EQVRBV0lEVEhfNDsKLQllbHNlIGlmIChteDNfY2FtLT5wbGF0Zm9ybV9mbGFncyAmIE1YM19DQU1FUkFfREFUQVdJRFRIXzgpCi0JCSpmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfOCB8IFNPQ0FNX0RBVEFXSURUSF80OwotCWVsc2UgaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9EQVRBV0lEVEhfNCkKLQkJKmZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF80OwotCi0Jc3dpdGNoIChidXN3aWR0aCkgewotCWNhc2UgMTU6Ci0JCWlmICghKCpmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF8xNSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSAxMDoKLQkJaWYgKCEoKmZsYWdzICYgU09DQU1fREFUQVdJRFRIXzEwKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCWlmICghKCpmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF84KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWlmICghKCpmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF80KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfd2FybihteDNfY2FtLT5zb2NfaG9zdC52NGwyX2Rldi5kZXYsCi0JCQkgIlVuc3VwcG9ydGVkIGJ1cyB3aWR0aCAlZFxuIiwgYnVzd2lkdGgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJKmZsYWdzID0gVjRMMl9NQlVTX01BU1RFUiB8CisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cgfAorCQlWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwKKwkJVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcgfAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9MT1c7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYwNyw5ICs1ODksMTEgQEAKIHN0YXRpYyBpbnQgbXgzX2NhbWVyYV90cnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgZGVwdGgpCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7Ci0JdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNhbWVyYV9mbGFnczsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmcgPSB7LnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsfTsKKwl1bnNpZ25lZCBsb25nIGJ1c19mbGFncywgY29tbW9uX2ZsYWdzOwogCWludCByZXQgPSB0ZXN0X3BsYXRmb3JtX3BhcmFtKG14M19jYW0sIGRlcHRoLCAmYnVzX2ZsYWdzKTsKIAogCWRldl9kYmcoaWNkLT5wYXJlbnQsICJyZXF1ZXN0IGJ1cyB3aWR0aCAlZCBiaXQ6ICVkXG4iLCBkZXB0aCwgcmV0KTsKQEAgLTYxNywxNSArNjAxLDIxIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQljYW1lcmFfZmxhZ3MgPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtKGljZCk7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19jb25maWcsICZjZmcpOworCWlmICghcmV0KSB7CisJCWNvbW1vbl9mbGFncyA9IHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKCZjZmcsCisJCQkJCQkJICBidXNfZmxhZ3MpOworCQlpZiAoIWNvbW1vbl9mbGFncykgeworCQkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCisJCQkJICJGbGFncyBpbmNvbXBhdGlibGU6IGNhbWVyYSAweCV4LCBob3N0IDB4JWx4XG4iLAorCQkJCSBjZmcuZmxhZ3MsIGJ1c19mbGFncyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkgeworCQlyZXR1cm4gcmV0OworCX0KIAotCXJldCA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfd2FybihpY2QtPnBhcmVudCwKLQkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgJWx4LCBob3N0ICVseFxuIiwKLQkJCSBjYW1lcmFfZmxhZ3MsIGJ1c19mbGFncyk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgYm9vbCBjaGFuX2ZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKmFyZykKQEAgLTk5NCw5ICs5ODQsMTEgQEAKIAogc3RhdGljIGludCBteDNfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIF9fdTMyIHBpeGZtdCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGJ1c19mbGFncywgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3M7CisJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgY2ZnID0gey50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMLH07CisJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNvbW1vbl9mbGFnczsKIAl1MzIgZHcsIHNlbnNfY29uZjsKIAljb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgKmZtdDsKIAlpbnQgYnVzd2lkdGg7CkBAIC0xMDA4LDgzICsxMDAwLDc2IEBACiAJaWYgKCFmbXQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYnVzd2lkdGggPSBmbXQtPmJpdHNfcGVyX3NhbXBsZTsKLQlyZXQgPSB0ZXN0X3BsYXRmb3JtX3BhcmFtKG14M19jYW0sIGJ1c3dpZHRoLCAmYnVzX2ZsYWdzKTsKLQogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXhmbXQpOwogCWlmICgheGxhdGUpIHsKIAkJZGV2X3dhcm4oZGV2LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwgcGl4Zm10KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJYnVzd2lkdGggPSBmbXQtPmJpdHNfcGVyX3NhbXBsZTsKKwlyZXQgPSB0ZXN0X3BsYXRmb3JtX3BhcmFtKG14M19jYW0sIGJ1c3dpZHRoLCAmYnVzX2ZsYWdzKTsKKwogCWRldl9kYmcoZGV2LCAicmVxdWVzdGVkIGJ1cyB3aWR0aCAlZCBiaXQ6ICVkXG4iLCBidXN3aWR0aCwgcmV0KTsKIAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JY2FtZXJhX2ZsYWdzID0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbShpY2QpOwotCi0JY29tbW9uX2ZsYWdzID0gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsIGJ1c19mbGFncyk7Ci0JZGV2X2RiZyhkZXYsICJGbGFncyBjYW06IDB4JWx4IGhvc3Q6IDB4JWx4IGNvbW1vbjogMHglbHhcbiIsCi0JCWNhbWVyYV9mbGFncywgYnVzX2ZsYWdzLCBjb21tb25fZmxhZ3MpOwotCWlmICghY29tbW9uX2ZsYWdzKSB7Ci0JCWRldl9kYmcoZGV2LCAibm8gY29tbW9uIGZsYWdzIik7Ci0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLAorCQkJCQkJCSAgYnVzX2ZsYWdzKTsKKwkJaWYgKCFjb21tb25fZmxhZ3MpIHsKKwkJCWRldl93YXJuKGljZC0+cGFyZW50LAorCQkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgMHgleCwgaG9zdCAweCVseFxuIiwKKwkJCQkgY2ZnLmZsYWdzLCBidXNfZmxhZ3MpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpIHsKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQljb21tb25fZmxhZ3MgPSBidXNfZmxhZ3M7CiAJfQogCisJZGV2X2RiZyhkZXYsICJGbGFncyBjYW06IDB4JXggaG9zdDogMHglbHggY29tbW9uOiAweCVseFxuIiwKKwkJY2ZnLmZsYWdzLCBidXNfZmxhZ3MsIGNvbW1vbl9mbGFncyk7CisKIAkvKiBNYWtlIGNob2ljZXMsIGJhc2VkIG9uIHBsYXRmb3JtIHByZWZlcmVuY2VzICovCi0JaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCkgJiYKLQkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0gpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykpIHsKIAkJaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9IU1ApCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0g7CiAJCWVsc2UKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fSFNZTkNfQUNUSVZFX0xPVzsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1c7CiAJfQogCi0JaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCkgJiYKLQkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0gpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVykpIHsKIAkJaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9WU1ApCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0g7CiAJCWVsc2UKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fVlNZTkNfQUNUSVZFX0xPVzsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1c7CiAJfQogCi0JaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBX0FDVElWRV9ISUdIKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fREFUQV9BQ1RJVkVfTE9XKSkgeworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0gpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XKSkgewogCQlpZiAobXgzX2NhbS0+cGxhdGZvcm1fZmxhZ3MgJiBNWDNfQ0FNRVJBX0RQKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9EQVRBX0FDVElWRV9ISUdIOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSDsKIAkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9EQVRBX0FDVElWRV9MT1c7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19EQVRBX0FDVElWRV9MT1c7CiAJfQogCi0JaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcpICYmCi0JICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HKSkgeworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORykgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKSkgewogCQlpZiAobXgzX2NhbS0+cGxhdGZvcm1fZmxhZ3MgJiBNWDNfQ0FNRVJBX1BDUCkKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfUklTSU5HOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HOwogCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkc7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HOwogCX0KIAotCS8qCi0JICogTWFrZSB0aGUgY2FtZXJhIHdvcmsgaW4gd2lkZXN0IGNvbW1vbiBtb2RlLCB3ZSdsbCB0YWtlIGNhcmUgb2YKLQkgKiB0aGUgcmVzdAotCSAqLwotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfMTUpCi0JCWNvbW1vbl9mbGFncyA9IChjb21tb25fZmxhZ3MgJiB+U09DQU1fREFUQVdJRFRIX01BU0spIHwKLQkJCVNPQ0FNX0RBVEFXSURUSF8xNTsKLQllbHNlIGlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfMTApCi0JCWNvbW1vbl9mbGFncyA9IChjb21tb25fZmxhZ3MgJiB+U09DQU1fREFUQVdJRFRIX01BU0spIHwKLQkJCVNPQ0FNX0RBVEFXSURUSF8xMDsKLQllbHNlIGlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfOCkKLQkJY29tbW9uX2ZsYWdzID0gKGNvbW1vbl9mbGFncyAmIH5TT0NBTV9EQVRBV0lEVEhfTUFTSykgfAotCQkJU09DQU1fREFUQVdJRFRIXzg7Ci0JZWxzZQotCQljb21tb25fZmxhZ3MgPSAoY29tbW9uX2ZsYWdzICYgflNPQ0FNX0RBVEFXSURUSF9NQVNLKSB8Ci0JCQlTT0NBTV9EQVRBV0lEVEhfNDsKLQotCXJldCA9IGljZC0+b3BzLT5zZXRfYnVzX3BhcmFtKGljZCwgY29tbW9uX2ZsYWdzKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZGJnKGRldiwgImNhbWVyYSBzZXRfYnVzX3BhcmFtKCVseCkgcmV0dXJuZWQgJWRcbiIsCisJY2ZnLmZsYWdzID0gY29tbW9uX2ZsYWdzOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCWRldl9kYmcoZGV2LCAiY2FtZXJhIHNfbWJ1c19jb25maWcoMHglbHgpIHJldHVybmVkICVkXG4iLAogCQkJY29tbW9uX2ZsYWdzLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTExMDgsMTMgKzEwOTMsMTMgQEAKIAkvKiBUaGlzIGhhcyBiZWVuIHNldCBpbiBteDNfY2FtZXJhX2FjdGl2YXRlKCksIGJ1dCB3ZSBjbGVhciBpdCBhYm92ZSAqLwogCXNlbnNfY29uZiB8PSBDU0lfU0VOU19DT05GX0RBVEFfRk1UX0JBWUVSOwogCi0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpCisJaWYgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKQogCQlzZW5zX2NvbmYgfD0gMSA8PCBDU0lfU0VOU19DT05GX1BJWF9DTEtfUE9MX1NISUZUOwotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKQorCWlmIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykKIAkJc2Vuc19jb25mIHw9IDEgPDwgQ1NJX1NFTlNfQ09ORl9IU1lOQ19QT0xfU0hJRlQ7Ci0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpCisJaWYgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKQogCQlzZW5zX2NvbmYgfD0gMSA8PCBDU0lfU0VOU19DT05GX1ZTWU5DX1BPTF9TSElGVDsKLQlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fREFUQV9BQ1RJVkVfTE9XKQorCWlmIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XKQogCQlzZW5zX2NvbmYgfD0gMSA8PCBDU0lfU0VOU19DT05GX0RBVEFfUE9MX1NISUZUOwogCiAJLyogSnVzdCBkbyB3aGF0IHdlJ3JlIGFza2VkIHRvIGRvICovCkBAIC0xMTk5LDYgKzExODQsMTQgQEAKIAkJCSAiZGF0YSB3aWR0aHMsIHVzaW5nIGRlZmF1bHQgOCBiaXRcbiIpOwogCQlteDNfY2FtLT5wbGF0Zm9ybV9mbGFncyB8PSBNWDNfQ0FNRVJBX0RBVEFXSURUSF84OwogCX0KKwlpZiAobXgzX2NhbS0+cGxhdGZvcm1fZmxhZ3MgJiBNWDNfQ0FNRVJBX0RBVEFXSURUSF80KQorCQlteDNfY2FtLT53aWR0aF9mbGFncyA9IDEgPDwgMzsKKwlpZiAobXgzX2NhbS0+cGxhdGZvcm1fZmxhZ3MgJiBNWDNfQ0FNRVJBX0RBVEFXSURUSF84KQorCQlteDNfY2FtLT53aWR0aF9mbGFncyB8PSAxIDw8IDc7CisJaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9EQVRBV0lEVEhfMTApCisJCW14M19jYW0tPndpZHRoX2ZsYWdzIHw9IDEgPDwgOTsKKwlpZiAobXgzX2NhbS0+cGxhdGZvcm1fZmxhZ3MgJiBNWDNfQ0FNRVJBX0RBVEFXSURUSF8xNSkKKwkJbXgzX2NhbS0+d2lkdGhfZmxhZ3MgfD0gMSA8PCAxNDsKIAogCW14M19jYW0tPm1jbGsgPSBteDNfY2FtLT5wZGF0YS0+bWNsa18xMGtoeiAqIDEwMDAwOwogCWlmICghbXgzX2NhbS0+bWNsaykgewpAQCAtMTI4MSw4ICsxMjc0LDYgQEAKIAogCWRtYWVuZ2luZV9wdXQoKTsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpLk1YM3ggQ2FtZXJhIGRyaXZlciB1bmxvYWRlZFxuIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMKaW5kZXggMGIzODUwMC4uMmU0MTMxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jCkBAIC0yMSwxMiArMjEsMTUgQEAKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBERUJVR19WQVJJQUJMRSBkZWJ1ZwogCiAjaW5jbHVkZSA8bWVkaWEvc2FhNzE0Nl92di5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS9zYWE3MTE1Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJteGIuaCIKICNpbmNsdWRlICJ0ZWE2NDE1Yy5oIgpAQCAtMTcxLDcgKzE3NCw3IEBACiAKIAlteGIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXhiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG14YiA9PSBOVUxMKSB7Ci0JCURFQl9EKCgibm90IGVub3VnaCBrZXJuZWwgbWVtb3J5LlxuIikpOworCQlERUJfRCgibm90IGVub3VnaCBrZXJuZWwgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNzksNyArMTgyLDcgQEAKIAogCXNhYTcxNDZfaTJjX2FkYXB0ZXJfcHJlcGFyZShkZXYsICZteGItPmkyY19hZGFwdGVyLCBTQUE3MTQ2X0kyQ19CVVNfQklUX1JBVEVfNDgwKTsKIAlpZiAoaTJjX2FkZF9hZGFwdGVyKCZteGItPmkyY19hZGFwdGVyKSA8IDApIHsKLQkJREVCX1MoKCJjYW5ub3QgcmVnaXN0ZXIgaTJjLWRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCURFQl9TKCJjYW5ub3QgcmVnaXN0ZXIgaTJjLWRldmljZS4gc2tpcHBpbmcuXG4iKTsKIAkJa2ZyZWUobXhiKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtMjAwLDcgKzIwMyw3IEBACiAJLyogY2hlY2sgaWYgYWxsIGRldmljZXMgYXJlIHByZXNlbnQgKi8KIAlpZiAoIW14Yi0+dGVhNjQyMF8xIHx8ICFteGItPnRlYTY0MjBfMiB8fCAhbXhiLT50ZWE2NDE1YyB8fAogCSAgICAhbXhiLT50ZGE5ODQwIHx8ICFteGItPnNhYTcxMTFhIHx8ICFteGItPnR1bmVyKSB7Ci0JCXByaW50aygibXhiOiBkaWQgbm90IGZpbmQgYWxsIGkyYyBkZXZpY2VzLiBhYm9ydGluZ1xuIik7CisJCXByX2VycigiZGlkIG5vdCBmaW5kIGFsbCBpMmMgZGV2aWNlcy4gYWJvcnRpbmdcbiIpOwogCQlpMmNfZGVsX2FkYXB0ZXIoJm14Yi0+aTJjX2FkYXB0ZXIpOwogCQlrZnJlZShteGIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTM0NiwxMSArMzQ5LDExIEBACiAJCQltc2cuYnVmID0gJm14Yl9zYWE3NzQwX2luaXRbaV0uZGF0YVswXTsKIAkJCWVyciA9IGkyY190cmFuc2ZlcigmbXhiLT5pMmNfYWRhcHRlciwgJm1zZywgMSk7CiAJCQlpZiAoZXJyICE9IDEpIHsKLQkJCQlERUJfRCgoImZhaWxlZCB0byBpbml0aWFsaXplICdzb3VuZCBhcmVuYSBtb2R1bGUnLlxuIikpOworCQkJCURFQl9EKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSAnc291bmQgYXJlbmEgbW9kdWxlJ1xuIik7CiAJCQkJZ290byBlcnI7CiAJCQl9CiAJCX0KLQkJSU5GTygoIidzb3VuZCBhcmVuYSBtb2R1bGUnIGRldGVjdGVkLlxuIikpOworCQlwcl9pbmZvKCInc291bmQgYXJlbmEgbW9kdWxlJyBkZXRlY3RlZFxuIik7CiAJfQogZXJyOgogCS8qIHRoZSByZXN0IGZvciBzYWE3MTQ2OiB5b3Ugc2hvdWxkIGRlZmluaXRlbHkgc2V0IHNvbWUgYmFzaWMgdmFsdWVzCkBAIC0zOTAsNyArMzkzLDcgQEAKIAlmb3IgKGkgPSBNQVhDT05UUk9MUyAtIDE7IGkgPj0gMDsgaS0tKSB7CiAJCWlmIChteGJfY29udHJvbHNbaV0uaWQgPT0gcWMtPmlkKSB7CiAJCQkqcWMgPSBteGJfY29udHJvbHNbaV07Ci0JCQlERUJfRCgoIlZJRElPQ19RVUVSWUNUUkwgJWQuXG4iLCBxYy0+aWQpKTsKKwkJCURFQl9EKCJWSURJT0NfUVVFUllDVFJMICVkXG4iLCBxYy0+aWQpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC00MTMsMTEgKzQxNiwxMSBAQAogCiAJaWYgKHZjLT5pZCA9PSBWNEwyX0NJRF9BVURJT19NVVRFKSB7CiAJCXZjLT52YWx1ZSA9IG14Yi0+Y3VyX211dGU7Ci0JCURFQl9EKCgiVklESU9DX0dfQ1RSTCBWNEwyX0NJRF9BVURJT19NVVRFOiVkLlxuIiwgdmMtPnZhbHVlKSk7CisJCURFQl9EKCJWSURJT0NfR19DVFJMIFY0TDJfQ0lEX0FVRElPX01VVEU6JWRcbiIsIHZjLT52YWx1ZSk7CiAJCXJldHVybiAwOwogCX0KIAotCURFQl9FRSgoIlZJRElPQ19HX0NUUkwgVjRMMl9DSURfQVVESU9fTVVURTolZC5cbiIsIHZjLT52YWx1ZSkpOworCURFQl9FRSgiVklESU9DX0dfQ1RSTCBWNEwyX0NJRF9BVURJT19NVVRFOiVkXG4iLCB2Yy0+dmFsdWUpOwogCXJldHVybiAwOwogfQogCkBAIC00NDAsMTQgKzQ0MywxNCBAQAogCQkvKiBzd2l0Y2ggdGhlIGF1ZGlvLXNvdXJjZSAqLwogCQl0ZWE2NDIwX3JvdXRlX2xpbmUobXhiLCB2Yy0+dmFsdWUgPyA2IDoKIAkJCQl2aWRlb19hdWRpb19jb25uZWN0W214Yi0+Y3VyX2lucHV0XSk7Ci0JCURFQl9FRSgoIlZJRElPQ19TX0NUUkwsIFY0TDJfQ0lEX0FVRElPX01VVEU6ICVkLlxuIiwgdmMtPnZhbHVlKSk7CisJCURFQl9FRSgiVklESU9DX1NfQ1RSTCwgVjRMMl9DSURfQVVESU9fTVVURTogJWRcbiIsIHZjLT52YWx1ZSk7CiAJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfaW5wdXQgKmkpCiB7Ci0JREVCX0VFKCgiVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsIGktPmluZGV4KSk7CisJREVCX0VFKCJWSURJT0NfRU5VTUlOUFVUICVkXG4iLCBpLT5pbmRleCk7CiAJaWYgKGktPmluZGV4ID49IE1YQl9JTlBVVFMpCiAJCXJldHVybiAtRUlOVkFMOwogCW1lbWNweShpLCAmbXhiX2lucHV0c1tpLT5pbmRleF0sIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpOwpAQCAtNDYwLDcgKzQ2Myw3IEBACiAJc3RydWN0IG14YiAqbXhiID0gKHN0cnVjdCBteGIgKilkZXYtPmV4dF9wcml2OwogCSppID0gbXhiLT5jdXJfaW5wdXQ7CiAKLQlERUJfRUUoKCJWSURJT0NfR19JTlBVVCAlZC5cbiIsICppKSk7CisJREVCX0VFKCJWSURJT0NfR19JTlBVVCAlZFxuIiwgKmkpOwogCXJldHVybiAwOwogfQogCkBAIC00NzEsNyArNDc0LDcgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgaSA9IDA7CiAKLQlERUJfRUUoKCJWSURJT0NfU19JTlBVVCAlZC5cbiIsIGlucHV0KSk7CisJREVCX0VFKCJWSURJT0NfU19JTlBVVCAlZFxuIiwgaW5wdXQpOwogCiAJaWYgKGlucHV0ID49IE1YQl9JTlBVVFMpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTE0LDcgKzUxNyw3IEBACiAKIAkvKiBzd2l0Y2ggdmlkZW8gaW4gc2FhNzExMWEgKi8KIAlpZiAoc2FhNzExMWFfY2FsbChteGIsIHZpZGVvLCBzX3JvdXRpbmcsIGksIFNBQTcxMTFfRk1UX0NDSVIsIDApKQotCQlwcmludGsoS0VSTl9FUlIgIlZJRElPQ19TX0lOUFVUOiBjb3VsZCBub3QgYWRkcmVzcyBzYWE3MTExYS5cbiIpOworCQlwcl9lcnIoIlZJRElPQ19TX0lOUFVUOiBjb3VsZCBub3QgYWRkcmVzcyBzYWE3MTExYVxuIik7CiAKIAkvKiBzd2l0Y2ggdGhlIGF1ZGlvLXNvdXJjZSBvbmx5IGlmIG5lY2Vzc2FyeSAqLwogCWlmICgwID09IG14Yi0+Y3VyX211dGUpCkBAIC01MjksMTEgKzUzMiwxMiBAQAogCXN0cnVjdCBteGIgKm14YiA9IChzdHJ1Y3QgbXhiICopZGV2LT5leHRfcHJpdjsKIAogCWlmICh0LT5pbmRleCkgewotCQlERUJfRCgoIlZJRElPQ19HX1RVTkVSOiBjaGFubmVsICVkIGRvZXMgbm90IGhhdmUgYSB0dW5lciBhdHRhY2hlZC5cbiIsIHQtPmluZGV4KSk7CisJCURFQl9EKCJWSURJT0NfR19UVU5FUjogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIgYXR0YWNoZWRcbiIsCisJCSAgICAgIHQtPmluZGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JREVCX0VFKCgiVklESU9DX0dfVFVORVI6ICVkXG4iLCB0LT5pbmRleCkpOworCURFQl9FRSgiVklESU9DX0dfVFVORVI6ICVkXG4iLCB0LT5pbmRleCk7CiAKIAltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CiAJc3RybGNweSh0LT5uYW1lLCAiVFYgVHVuZXIiLCBzaXplb2YodC0+bmFtZSkpOwpAQCAtNTUwLDcgKzU1NCw4IEBACiAJc3RydWN0IG14YiAqbXhiID0gKHN0cnVjdCBteGIgKilkZXYtPmV4dF9wcml2OwogCiAJaWYgKHQtPmluZGV4KSB7Ci0JCURFQl9EKCgiVklESU9DX1NfVFVORVI6IGNoYW5uZWwgJWQgZG9lcyBub3QgaGF2ZSBhIHR1bmVyIGF0dGFjaGVkLlxuIiwgdC0+aW5kZXgpKTsKKwkJREVCX0QoIlZJRElPQ19TX1RVTkVSOiBjaGFubmVsICVkIGRvZXMgbm90IGhhdmUgYSB0dW5lciBhdHRhY2hlZFxuIiwKKwkJICAgICAgdC0+aW5kZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTU2NCwxNCArNTY5LDE0IEBACiAJc3RydWN0IG14YiAqbXhiID0gKHN0cnVjdCBteGIgKilkZXYtPmV4dF9wcml2OwogCiAJaWYgKG14Yi0+Y3VyX2lucHV0KSB7Ci0JCURFQl9EKCgiVklESU9DX0dfRlJFUTogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIhXG4iLAotCQkJCQlteGItPmN1cl9pbnB1dCkpOworCQlERUJfRCgiVklESU9DX0dfRlJFUTogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIhXG4iLAorCQkgICAgICBteGItPmN1cl9pbnB1dCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCSpmID0gbXhiLT5jdXJfZnJlcTsKIAotCURFQl9FRSgoIlZJRElPQ19HX0ZSRVE6IGZyZXE6MHglMDh4LlxuIiwgbXhiLT5jdXJfZnJlcS5mcmVxdWVuY3kpKTsKKwlERUJfRUUoIlZJRElPQ19HX0ZSRVE6IGZyZXE6MHglMDh4XG4iLCBteGItPmN1cl9mcmVxLmZyZXF1ZW5jeSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4OCwxMiArNTkzLDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKG14Yi0+Y3VyX2lucHV0KSB7Ci0JCURFQl9EKCgiVklESU9DX1NfRlJFUTogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIhXG4iLCBteGItPmN1cl9pbnB1dCkpOworCQlERUJfRCgiVklESU9DX1NfRlJFUTogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIhXG4iLAorCQkgICAgICBteGItPmN1cl9pbnB1dCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCW14Yi0+Y3VyX2ZyZXEgPSAqZjsKLQlERUJfRUUoKCJWSURJT0NfU19GUkVRVUVOQ1k6IGZyZXE6MHglMDh4LlxuIiwgbXhiLT5jdXJfZnJlcS5mcmVxdWVuY3kpKTsKKwlERUJfRUUoIlZJRElPQ19TX0ZSRVFVRU5DWTogZnJlcToweCUwOHhcbiIsIG14Yi0+Y3VyX2ZyZXEuZnJlcXVlbmN5KTsKIAogCS8qIHR1bmUgaW4gZGVzaXJlZCBmcmVxdWVuY3kgKi8KIAl0dW5lcl9jYWxsKG14YiwgdHVuZXIsIHNfZnJlcXVlbmN5LCAmbXhiLT5jdXJfZnJlcSk7CkBAIC02MTIsMTggKzYxOCwxOCBAQAogCXN0cnVjdCBteGIgKm14YiA9IChzdHJ1Y3QgbXhiICopZGV2LT5leHRfcHJpdjsKIAogCWlmIChhLT5pbmRleCA+IE1YQl9JTlBVVFMpIHsKLQkJREVCX0QoKCJWSURJT0NfR19BVURJTyAlZCBvdXQgb2YgcmFuZ2UuXG4iLCBhLT5pbmRleCkpOworCQlERUJfRCgiVklESU9DX0dfQVVESU8gJWQgb3V0IG9mIHJhbmdlXG4iLCBhLT5pbmRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCURFQl9FRSgoIlZJRElPQ19HX0FVRElPICVkLlxuIiwgYS0+aW5kZXgpKTsKKwlERUJfRUUoIlZJRElPQ19HX0FVRElPICVkXG4iLCBhLT5pbmRleCk7CiAJbWVtY3B5KGEsICZteGJfYXVkaW9zW3ZpZGVvX2F1ZGlvX2Nvbm5lY3RbbXhiLT5jdXJfaW5wdXRdXSwgc2l6ZW9mKHN0cnVjdCB2NGwyX2F1ZGlvKSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKIHsKLQlERUJfRCgoIlZJRElPQ19TX0FVRElPICVkLlxuIiwgYS0+aW5kZXgpKTsKKwlERUJfRCgiVklESU9DX1NfQVVESU8gJWRcbiIsIGEtPmluZGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjU1LDExICs2NjEsMTEgQEAKIAkJaW50IGkgPSAqKGludCAqKWFyZzsKIAogCQlpZiAoaSA8IDAgfHwgaSA+PSBNWEJfQVVESU9TKSB7Ci0JCQlERUJfRCgoImlsbGVnYWwgYXJndW1lbnQgdG8gTVhCX1NfQVVESU9fQ0Q6IGk6JWQuXG4iLCBpKSk7CisJCQlERUJfRCgiaW52YWxpZCBhcmd1bWVudCB0byBNWEJfU19BVURJT19DRDogaTolZFxuIiwgaSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCURFQl9FRSgoIk1YQl9TX0FVRElPX0NEOiBpOiVkLlxuIiwgaSkpOworCQlERUJfRUUoIk1YQl9TX0FVRElPX0NEOiBpOiVkXG4iLCBpKTsKIAogCQl0ZWE2NDIwX3JvdXRlX2NkKG14YiwgaSk7CiAJCXJldHVybiAwOwpAQCAtNjY5LDE3ICs2NzUsMTggQEAKIAkJaW50IGkgPSAqKGludCAqKWFyZzsKIAogCQlpZiAoaSA8IDAgfHwgaSA+PSBNWEJfQVVESU9TKSB7Ci0JCQlERUJfRCgoImlsbGVnYWwgYXJndW1lbnQgdG8gTVhCX1NfQVVESU9fTElORTogaTolZC5cbiIsIGkpKTsKKwkJCURFQl9EKCJpbnZhbGlkIGFyZ3VtZW50IHRvIE1YQl9TX0FVRElPX0xJTkU6IGk6JWRcbiIsCisJCQkgICAgICBpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJREVCX0VFKCgiTVhCX1NfQVVESU9fTElORTogaTolZC5cbiIsIGkpKTsKKwkJREVCX0VFKCJNWEJfU19BVURJT19MSU5FOiBpOiVkXG4iLCBpKTsKIAkJdGVhNjQyMF9yb3V0ZV9saW5lKG14YiwgaSk7CiAJCXJldHVybiAwOwogCX0KIAlkZWZhdWx0OgogLyoKLQkJREVCMihwcmludGsoImRvZXMgbm90IGhhbmRsZSB0aGlzIGlvY3RsLlxuIikpOworCQlERUIyKHByX2VycigiZG9lcyBub3QgaGFuZGxlIHRoaXMgaW9jdGxcbiIpKTsKICovCiAJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQpAQCAtNjkzLDcgKzcwMCw3IEBACiB7CiAJc3RydWN0IG14YiAqbXhiOwogCi0JREVCX0VFKCgiZGV2OiVwXG4iLCBkZXYpKTsKKwlERUJfRUUoImRldjolcFxuIiwgZGV2KTsKIAogCXNhYTcxNDZfdnZfaW5pdChkZXYsICZ2dl9kYXRhKTsKIAlpZiAobXhiX3Byb2JlKGRldikpIHsKQEAgLTcyMCw3ICs3MjcsNyBAQAogI2VuZGlmCiAJdnZfZGF0YS5vcHMudmlkaW9jX2RlZmF1bHQgPSB2aWRpb2NfZGVmYXVsdDsKIAlpZiAoc2FhNzE0Nl9yZWdpc3Rlcl9kZXZpY2UoJm14Yi0+dmlkZW9fZGV2LCBkZXYsICJteGIiLCBWRkxfVFlQRV9HUkFCQkVSKSkgewotCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgY2FwdHVyZSB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCUVSUigiY2Fubm90IHJlZ2lzdGVyIGNhcHR1cmUgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIik7CiAJCXNhYTcxNDZfdnZfcmVsZWFzZShkZXYpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNzI4LDExICs3MzUsMTEgQEAKIAkvKiBpbml0aWFsaXphdGlvbiBzdHVmZiAodmJpKSAob25seSBmb3IgcmV2aXNpb24gPiAwIGFuZCBmb3IgZXh0ZW5zaW9ucyB3aGljaCB3YW50IGl0KSovCiAJaWYgKE1YQl9CT0FSRF9DQU5fRE9fVkJJKGRldikpIHsKIAkJaWYgKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZteGItPnZiaV9kZXYsIGRldiwgIm14YiIsIFZGTF9UWVBFX1ZCSSkpIHsKLQkJCUVSUigoImNhbm5vdCByZWdpc3RlciB2YmkgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIikpOworCQkJRVJSKCJjYW5ub3QgcmVnaXN0ZXIgdmJpIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpOwogCQl9CiAJfQogCi0JcHJpbnRrKCJteGI6IGZvdW5kIE11bHRpbWVkaWEgZVh0ZW5zaW9uIEJvYXJkICMlZC5cbiIsIG14Yl9udW0pOworCXByX2luZm8oImZvdW5kIE11bHRpbWVkaWEgZVh0ZW5zaW9uIEJvYXJkICMlZFxuIiwgbXhiX251bSk7CiAKIAlteGJfbnVtKys7CiAJbXhiX2luaXRfZG9uZShkZXYpOwpAQCAtNzQzLDcgKzc1MCw3IEBACiB7CiAJc3RydWN0IG14YiAqbXhiID0gKHN0cnVjdCBteGIgKilkZXYtPmV4dF9wcml2OwogCi0JREVCX0VFKCgiZGV2OiVwXG4iLCBkZXYpKTsKKwlERUJfRUUoImRldjolcFxuIiwgZGV2KTsKIAogCXNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2UoJm14Yi0+dmlkZW9fZGV2LGRldik7CiAJaWYgKE1YQl9CT0FSRF9DQU5fRE9fVkJJKGRldikpCkBAIC03NjUsNyArNzcyLDcgQEAKIAlpZiAoVjRMMl9TVERfUEFMX0kgPT0gc3RhbmRhcmQtPmlkKSB7CiAJCXY0bDJfc3RkX2lkIHN0ZCA9IFY0TDJfU1REX1BBTF9JOwogCi0JCURFQl9EKCgiVklESU9DX1NfU1REOiBzZXR0aW5nIG14YiBmb3IgUEFMX0kuXG4iKSk7CisJCURFQl9EKCJWSURJT0NfU19TVEQ6IHNldHRpbmcgbXhiIGZvciBQQUxfSVxuIik7CiAJCS8qIHNldCB0aGUgNzE0NiBncGlvIHJlZ2lzdGVyIC0tIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcyBleGFjdGx5ICovCiAJCXNhYTcxNDZfd3JpdGUoZGV2LCBHUElPX0NUUkwsIDB4MDA0MDQwNTApOwogCQkvKiB1bnNldCB0aGUgNzExMSBncGlvIHJlZ2lzdGVyIC0tIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcyBleGFjdGx5ICovCkBAIC03NzQsNyArNzgxLDcgQEAKIAl9IGVsc2UgewogCQl2NGwyX3N0ZF9pZCBzdGQgPSBWNEwyX1NURF9QQUxfQkc7CiAKLQkJREVCX0QoKCJWSURJT0NfU19TVEQ6IHNldHRpbmcgbXhiIGZvciBQQUwvTlRTQy9TRUNBTS5cbiIpKTsKKwkJREVCX0QoIlZJRElPQ19TX1NURDogc2V0dGluZyBteGIgZm9yIFBBTC9OVFNDL1NFQ0FNXG4iKTsKIAkJLyogc2V0IHRoZSA3MTQ2IGdwaW8gcmVnaXN0ZXIgLS0gSSBkb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzIGV4YWN0bHkgKi8KIAkJc2FhNzE0Nl93cml0ZShkZXYsIEdQSU9fQ1RSTCwgMHgwMDQwNDA1MCk7CiAJCS8qIHNldCB0aGUgNzExMSBncGlvIHJlZ2lzdGVyIC0tIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcyBleGFjdGx5ICovCkBAIC04NTIsNyArODU5LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IG14Yl9pbml0X21vZHVsZSh2b2lkKQogewogCWlmIChzYWE3MTQ2X3JlZ2lzdGVyX2V4dGVuc2lvbigmZXh0ZW5zaW9uKSkgewotCQlERUJfUygoImZhaWxlZCB0byByZWdpc3RlciBleHRlbnNpb24uXG4iKSk7CisJCURFQl9TKCJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0ZW5zaW9uXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL25vb24wMTBwYzMwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL25vb24wMTBwYzMwLmMKaW5kZXggMzVmNzIyYS4uNTA4MzhiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9ub29uMDEwcGMzMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbm9vbjAxMHBjMzAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBEcml2ZXIgZm9yIFNpbGljb25GaWxlIE5PT04wMTBQQzMwIENJRiAoMS8xMSIpIEltYWdlIFNlbnNvciB3aXRoIElTUAogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCiAgKiBDb250YWN0OiBTeWx3ZXN0ZXIgTmF3cm9ja2ksIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPgogICoKICAqIEluaXRpYWwgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBiYXNlZCBvbiBhIGRyaXZlciBhdXRob3JlZCBieQpAQCAtMTAsNyArMTAsNyBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyZ3Npb24uCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL25vb24wMTBwYzMwLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgpAQCAtMTMxLDE3ICsxMzIsMjMgQEAKIAogc3RydWN0IG5vb24wMTBfaW5mbyB7CiAJc3RydWN0IHY0bDJfc3ViZGV2IHNkOworCXN0cnVjdCBtZWRpYV9wYWQgcGFkOwogCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBoZGw7Ci0JY29uc3Qgc3RydWN0IG5vb24wMTBwYzMwX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBseVtOT09OMDEwX05VTV9TVVBQTElFU107CisJdTMyIGdwaW9fbnJlc2V0OworCXUzMiBncGlvX25zdGJ5OworCisJLyogUHJvdGVjdHMgdGhlIHN0cnVjdCBtZW1iZXJzIGJlbG93ICovCisJc3RydWN0IG11dGV4IGxvY2s7CisKIAljb25zdCBzdHJ1Y3Qgbm9vbjAxMF9mb3JtYXQgKmN1cnJfZm10OwogCWNvbnN0IHN0cnVjdCBub29uMDEwX2ZybXNpemUgKmN1cnJfd2luOworCXVuc2lnbmVkIGludCBhcHBseV9uZXdfY2ZnOjE7CisJdW5zaWduZWQgaW50IHN0cmVhbWluZzoxOwogCXVuc2lnbmVkIGludCBoZmxpcDoxOwogCXVuc2lnbmVkIGludCB2ZmxpcDoxOwogCXVuc2lnbmVkIGludCBwb3dlcjoxOwogCXU4IGkyY19yZWdfcGFnZTsKLQlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbHlbTk9PTjAxMF9OVU1fU1VQUExJRVNdOwotCXUzMiBncGlvX25yZXNldDsKLQl1MzIgZ3Bpb19uc3RieTsKIH07CiAKIHN0cnVjdCBpMmNfcmVndmFsIHsKQEAgLTI5Miw4ICsyOTksMTAgQEAKIAl1OCByZWcgPSBzbGVlcCA/IDB4RjEgOiAweEYwOwogCWludCByZXQgPSAwOwogCi0JaWYgKHJlc2V0KQorCWlmIChyZXNldCkgewogCQlyZXQgPSBjYW1faTJjX3dyaXRlKHNkLCBQT1dFUl9DVFJMX1JFRywgcmVnIHwgMHgwMik7CisJCXVkZWxheSgyMCk7CisJfQogCWlmICghcmV0KSB7CiAJCXJldCA9IGNhbV9pMmNfd3JpdGUoc2QsIFBPV0VSX0NUUkxfUkVHLCByZWcpOwogCQlpZiAocmVzZXQgJiYgIXJldCkKQEAgLTMxMyw2ICszMjIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qIENhbGxlZCB3aXRoIHN0cnVjdCBub29uMDEwX2luZm8ubG9jayBtdXRleCBoZWxkICovCiBzdGF0aWMgaW50IG5vb24wMTBfc2V0X2ZsaXAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IGhmbGlwLCBpbnQgdmZsaXApCiB7CiAJc3RydWN0IG5vb24wMTBfaW5mbyAqaW5mbyA9IHRvX25vb24wMTAoc2QpOwpAQCAtMzQwLDIxICszNTAsMTggQEAKIHN0YXRpYyBpbnQgbm9vbjAxMF9zZXRfcGFyYW1zKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CiAJc3RydWN0IG5vb24wMTBfaW5mbyAqaW5mbyA9IHRvX25vb24wMTAoc2QpOwotCWludCByZXQ7CiAKLQlpZiAoIWluZm8tPmN1cnJfd2luKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IGNhbV9pMmNfd3JpdGUoc2QsIFZET19DVExfUkVHKDApLCBpbmZvLT5jdXJyX3dpbi0+dmlkX2N0bDEpOwotCi0JaWYgKCFyZXQgJiYgaW5mby0+Y3Vycl9mbXQpCi0JCXJldCA9IGNhbV9pMmNfd3JpdGUoc2QsIElTUF9DVExfUkVHKDApLAotCQkJCWluZm8tPmN1cnJfZm10LT5pc3BjdGwxX3JlZyk7Ci0JcmV0dXJuIHJldDsKKwlpbnQgcmV0ID0gY2FtX2kyY193cml0ZShzZCwgVkRPX0NUTF9SRUcoMCksCisJCQkJaW5mby0+Y3Vycl93aW4tPnZpZF9jdGwxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBjYW1faTJjX3dyaXRlKHNkLCBJU1BfQ1RMX1JFRygwKSwKKwkJCSAgICAgaW5mby0+Y3Vycl9mbXQtPmlzcGN0bDFfcmVnKTsKIH0KIAogLyogRmluZCBuZWFyZXN0IG1hdGNoaW5nIGltYWdlIHBpeGVsIHNpemUuICovCi1zdGF0aWMgaW50IG5vb24wMTBfdHJ5X2ZyYW1lX3NpemUoc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCitzdGF0aWMgaW50IG5vb24wMTBfdHJ5X2ZyYW1lX3NpemUoc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYsCisJCQkJICBjb25zdCBzdHJ1Y3Qgbm9vbjAxMF9mcm1zaXplICoqc2l6ZSkKIHsKIAl1bnNpZ25lZCBpbnQgbWluX2VyciA9IH4wOwogCWludCBpID0gQVJSQVlfU0laRShub29uMDEwX3NpemVzKTsKQEAgLTM3NCwxMSArMzgxLDE0IEBACiAJaWYgKG1hdGNoKSB7CiAJCW1mLT53aWR0aCAgPSBtYXRjaC0+d2lkdGg7CiAJCW1mLT5oZWlnaHQgPSBtYXRjaC0+aGVpZ2h0OworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbWF0Y2g7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorLyogQ2FsbGVkIHdpdGggaW5mby5sb2NrIG11dGV4IGhlbGQgKi8KIHN0YXRpYyBpbnQgcG93ZXJfZW5hYmxlKHN0cnVjdCBub29uMDEwX2luZm8gKmluZm8pCiB7CiAJaW50IHJldDsKQEAgLTQxOSw2ICs0MjksNyBAQAogCXJldHVybiAwOwogfQogCisvKiBDYWxsZWQgd2l0aCBpbmZvLmxvY2sgbXV0ZXggaGVsZCAqLwogc3RhdGljIGludCBwb3dlcl9kaXNhYmxlKHN0cnVjdCBub29uMDEwX2luZm8gKmluZm8pCiB7CiAJaW50IHJldDsKQEAgLTQ0OCwxNDcgKzQ1OSwxNzUgQEAKIHN0YXRpYyBpbnQgbm9vbjAxMF9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gdG9fc2QoY3RybCk7CisJc3RydWN0IG5vb24wMTBfaW5mbyAqaW5mbyA9IHRvX25vb24wMTAoc2QpOworCWludCByZXQgPSAwOwogCiAJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXM6IGN0cmxfaWQ6ICVkLCB2YWx1ZTogJWRcbiIsCiAJCSBfX2Z1bmNfXywgY3RybC0+aWQsIGN0cmwtPnZhbCk7CiAKKwltdXRleF9sb2NrKCZpbmZvLT5sb2NrKTsKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgbm90IHBvd2VyZWQgdXAgYnkgdGhlIGhvc3QgZHJpdmVyIGRvCisJICogbm90IGFwcGx5IGFueSBjb250cm9scyB0byBIL1cgYXQgdGhpcyB0aW1lLiBJbnN0ZWFkCisJICogdGhlIGNvbnRyb2xzIHdpbGwgYmUgcmVzdG9yZWQgcmlnaHQgYWZ0ZXIgcG93ZXItdXAuCisJICovCisJaWYgKCFpbmZvLT5wb3dlcikKKwkJZ290byB1bmxvY2s7CisKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6Ci0JCXJldHVybiBub29uMDEwX2VuYWJsZV9hdXRvd2hpdGViYWxhbmNlKHNkLCBjdHJsLT52YWwpOworCQlyZXQgPSBub29uMDEwX2VuYWJsZV9hdXRvd2hpdGViYWxhbmNlKHNkLCBjdHJsLT52YWwpOworCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJcmV0dXJuIGNhbV9pMmNfd3JpdGUoc2QsIE1XQl9CR0FJTl9SRUcsIGN0cmwtPnZhbCk7CisJCXJldCA9IGNhbV9pMmNfd3JpdGUoc2QsIE1XQl9CR0FJTl9SRUcsIGN0cmwtPnZhbCk7CisJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCXJldHVybiBjYW1faTJjX3dyaXRlKHNkLCBNV0JfUkdBSU5fUkVHLCBjdHJsLT52YWwpOworCQlyZXQgPSAgY2FtX2kyY193cml0ZShzZCwgTVdCX1JHQUlOX1JFRywgY3RybC0+dmFsKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldCA9IC1FSU5WQUw7CiAJfQordW5sb2NrOgorCW11dGV4X3VubG9jaygmaW5mby0+bG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBub29uMDEwX2VudW1fZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHVuc2lnbmVkIGludCBpbmRleCwKLQkJCSAgICBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgKmNvZGUpCitzdGF0aWMgaW50IG5vb24wMTBfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNvZGUpCiB7Ci0JaWYgKCFjb2RlIHx8IGluZGV4ID49IEFSUkFZX1NJWkUobm9vbjAxMF9mb3JtYXRzKSkKKwlpZiAoY29kZS0+aW5kZXggPj0gQVJSQVlfU0laRShub29uMDEwX2Zvcm1hdHMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSpjb2RlID0gbm9vbjAxMF9mb3JtYXRzW2luZGV4XS5jb2RlOworCWNvZGUtPmNvZGUgPSBub29uMDEwX2Zvcm1hdHNbY29kZS0+aW5kZXhdLmNvZGU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbm9vbjAxMF9nX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3N0YXRpYyBpbnQgbm9vbjAxMF9nZXRfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCiB7CiAJc3RydWN0IG5vb24wMTBfaW5mbyAqaW5mbyA9IHRvX25vb24wMTAoc2QpOwotCWludCByZXQ7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWY7CiAKLQlpZiAoIW1mKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghaW5mby0+Y3Vycl93aW4gfHwgIWluZm8tPmN1cnJfZm10KSB7Ci0JCXJldCA9IG5vb24wMTBfc2V0X3BhcmFtcyhzZCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCWlmIChmbXQtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpIHsKKwkJaWYgKGZoKSB7CisJCQltZiA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCAwKTsKKwkJCWZtdC0+Zm9ybWF0ID0gKm1mOworCQl9CisJCXJldHVybiAwOwogCX0KKwltZiA9ICZmbXQtPmZvcm1hdDsKIAotCW1mLT53aWR0aAk9IGluZm8tPmN1cnJfd2luLT53aWR0aDsKLQltZi0+aGVpZ2h0CT0gaW5mby0+Y3Vycl93aW4tPmhlaWdodDsKLQltZi0+Y29kZQk9IGluZm8tPmN1cnJfZm10LT5jb2RlOwotCW1mLT5jb2xvcnNwYWNlCT0gaW5mby0+Y3Vycl9mbXQtPmNvbG9yc3BhY2U7Ci0JbWYtPmZpZWxkCT0gVjRMMl9GSUVMRF9OT05FOworCW11dGV4X2xvY2soJmluZm8tPmxvY2spOworCW1mLT53aWR0aCA9IGluZm8tPmN1cnJfd2luLT53aWR0aDsKKwltZi0+aGVpZ2h0ID0gaW5mby0+Y3Vycl93aW4tPmhlaWdodDsKKwltZi0+Y29kZSA9IGluZm8tPmN1cnJfZm10LT5jb2RlOworCW1mLT5jb2xvcnNwYWNlID0gaW5mby0+Y3Vycl9mbXQtPmNvbG9yc3BhY2U7CisJbWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwogCisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAogLyogUmV0dXJuIG5lYXJlc3QgbWVkaWEgYnVzIGZyYW1lIGZvcm1hdC4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9vbjAxMF9mb3JtYXQgKnRyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9vbjAxMF9mb3JtYXQgKm5vb24wMTBfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJCQkgICAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCiB7CiAJaW50IGkgPSBBUlJBWV9TSVpFKG5vb24wMTBfZm9ybWF0cyk7CiAKLQlub29uMDEwX3RyeV9mcmFtZV9zaXplKG1mKTsKLQotCXdoaWxlIChpLS0pCisJd2hpbGUgKC0taSkKIAkJaWYgKG1mLT5jb2RlID09IG5vb24wMTBfZm9ybWF0c1tpXS5jb2RlKQogCQkJYnJlYWs7Ci0KIAltZi0+Y29kZSA9IG5vb24wMTBfZm9ybWF0c1tpXS5jb2RlOwogCiAJcmV0dXJuICZub29uMDEwX2Zvcm1hdHNbaV07CiB9CiAKLXN0YXRpYyBpbnQgbm9vbjAxMF90cnlfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQkgICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKLXsKLQlpZiAoIXNkIHx8ICFtZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0cnlfZm10KHNkLCBtZik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbm9vbjAxMF9zX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQorc3RhdGljIGludCBub29uMDEwX3NldF9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZtdCkKIHsKIAlzdHJ1Y3Qgbm9vbjAxMF9pbmZvICppbmZvID0gdG9fbm9vbjAxMChzZCk7CisJY29uc3Qgc3RydWN0IG5vb24wMTBfZnJtc2l6ZSAqc2l6ZSA9IE5VTEw7CisJY29uc3Qgc3RydWN0IG5vb24wMTBfZm9ybWF0ICpuZjsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZjsKKwlpbnQgcmV0ID0gMDsKIAotCWlmICghc2QgfHwgIW1mKQotCQlyZXR1cm4gLUVJTlZBTDsKKwluZiA9IG5vb24wMTBfdHJ5X2ZtdChzZCwgJmZtdC0+Zm9ybWF0KTsKKwlub29uMDEwX3RyeV9mcmFtZV9zaXplKCZmbXQtPmZvcm1hdCwgJnNpemUpOworCWZtdC0+Zm9ybWF0LmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKIAotCWluZm8tPmN1cnJfZm10ID0gdHJ5X2ZtdChzZCwgbWYpOwotCi0JcmV0dXJuIG5vb24wMTBfc2V0X3BhcmFtcyhzZCk7CisJaWYgKGZtdC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkgeworCQlpZiAoZmgpIHsKKwkJCW1mID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIDApOworCQkJKm1mID0gZm10LT5mb3JtYXQ7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCW11dGV4X2xvY2soJmluZm8tPmxvY2spOworCWlmICghaW5mby0+c3RyZWFtaW5nKSB7CisJCWluZm8tPmFwcGx5X25ld19jZmcgPSAxOworCQlpbmZvLT5jdXJyX2ZtdCA9IG5mOworCQlpbmZvLT5jdXJyX3dpbiA9IHNpemU7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVCVVNZOworCX0KKwltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCXJldHVybiByZXQ7CiB9CiAKKy8qIENhbGxlZCB3aXRoIHN0cnVjdCBub29uMDEwX2luZm8ubG9jayBtdXRleCBoZWxkICovCiBzdGF0aWMgaW50IG5vb24wMTBfYmFzZV9jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKLQlzdHJ1Y3Qgbm9vbjAxMF9pbmZvICppbmZvID0gdG9fbm9vbjAxMChzZCk7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vb24wMTBfYnVsa193cml0ZV9yZWcoc2QsIG5vb24wMTBfYmFzZV9yZWdzKTsKLQlpZiAoIXJldCkgewotCQlpbmZvLT5jdXJyX2ZtdCA9ICZub29uMDEwX2Zvcm1hdHNbMF07Ci0JCWluZm8tPmN1cnJfd2luID0gJm5vb24wMTBfc2l6ZXNbMF07CisJaW50IHJldCA9IG5vb24wMTBfYnVsa193cml0ZV9yZWcoc2QsIG5vb24wMTBfYmFzZV9yZWdzKTsKKwlpZiAoIXJldCkKIAkJcmV0ID0gbm9vbjAxMF9zZXRfcGFyYW1zKHNkKTsKLQl9CiAJaWYgKCFyZXQpCiAJCXJldCA9IG5vb24wMTBfc2V0X2ZsaXAoc2QsIDEsIDApOwotCWlmICghcmV0KQotCQlyZXQgPSBub29uMDEwX3Bvd2VyX2N0cmwoc2QsIGZhbHNlLCBmYWxzZSk7CiAKLQkvKiBzeW5jIHRoZSBoYW5kbGVyIGFuZCB0aGUgcmVnaXN0ZXJzIHN0YXRlICovCi0JdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJnRvX25vb24wMTAoc2QpLT5oZGwpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbm9vbjAxMF9zX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKIHsKIAlzdHJ1Y3Qgbm9vbjAxMF9pbmZvICppbmZvID0gdG9fbm9vbjAxMChzZCk7Ci0JY29uc3Qgc3RydWN0IG5vb24wMTBwYzMwX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gaW5mby0+cGRhdGE7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAotCWlmIChXQVJOKHBkYXRhID09IE5VTEwsICJObyBwbGF0Zm9ybSBkYXRhIVxuIikpCi0JCXJldHVybiAtRU5PTUVNOwotCisJbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7CiAJaWYgKG9uKSB7CiAJCXJldCA9IHBvd2VyX2VuYWJsZShpbmZvKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJldCA9IG5vb24wMTBfYmFzZV9jb25maWcoc2QpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IG5vb24wMTBfYmFzZV9jb25maWcoc2QpOwogCX0gZWxzZSB7CiAJCW5vb24wMTBfcG93ZXJfY3RybChzZCwgZmFsc2UsIHRydWUpOwogCQlyZXQgPSBwb3dlcl9kaXNhYmxlKGluZm8pOwotCQlpbmZvLT5jdXJyX3dpbiA9IE5VTEw7Ci0JCWluZm8tPmN1cnJfZm10ID0gTlVMTDsKIAl9CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5sb2NrKTsKKworCS8qIFJlc3RvcmUgdGhlIGNvbnRyb2xzIHN0YXRlICovCisJaWYgKCFyZXQgJiYgb24pCisJCXJldCA9IHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZpbmZvLT5oZGwpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBub29uMDEwX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJCXN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICpjaGlwKQorc3RhdGljIGludCBub29uMDEwX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IG5vb24wMTBfaW5mbyAqaW5mbyA9IHRvX25vb24wMTAoc2QpOworCWludCByZXQgPSAwOwogCi0JcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgY2hpcCwKLQkJCQkJICBWNEwyX0lERU5UX05PT04wMTBQQzMwLCAwKTsKKwltdXRleF9sb2NrKCZpbmZvLT5sb2NrKTsKKwlpZiAoIWluZm8tPnN0cmVhbWluZyAhPSAhb24pIHsKKwkJcmV0ID0gbm9vbjAxMF9wb3dlcl9jdHJsKHNkLCBmYWxzZSwgIW9uKTsKKwkJaWYgKCFyZXQpCisJCQlpbmZvLT5zdHJlYW1pbmcgPSBvbjsKKwl9CisJaWYgKCFyZXQgJiYgb24gJiYgaW5mby0+YXBwbHlfbmV3X2NmZykgeworCQlyZXQgPSBub29uMDEwX3NldF9wYXJhbXMoc2QpOworCQlpZiAoIXJldCkKKwkJCWluZm8tPmFwcGx5X25ld19jZmcgPSAwOworCX0KKwltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbm9vbjAxMF9sb2dfc3RhdHVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCkBAIC01OTksMTIgKzYzOCwyNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG5vb24wMTBfb3BlbihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQoreworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIDApOworCisJbWYtPndpZHRoID0gbm9vbjAxMF9zaXplc1swXS53aWR0aDsKKwltZi0+aGVpZ2h0ID0gbm9vbjAxMF9zaXplc1swXS5oZWlnaHQ7CisJbWYtPmNvZGUgPSBub29uMDEwX2Zvcm1hdHNbMF0uY29kZTsKKwltZi0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOworCW1mLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbm9vbjAxMF9zdWJkZXZfaW50ZXJuYWxfb3BzID0geworCS5vcGVuID0gbm9vbjAxMF9vcGVuLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIG5vb24wMTBfY3RybF9vcHMgPSB7CiAJLnNfY3RybCA9IG5vb24wMTBfc19jdHJsLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBub29uMDEwX2NvcmVfb3BzID0gewotCS5nX2NoaXBfaWRlbnQJPSBub29uMDEwX2dfY2hpcF9pZGVudCwKIAkuc19wb3dlcgk9IG5vb24wMTBfc19wb3dlciwKIAkuZ19jdHJsCQk9IHY0bDJfc3ViZGV2X2dfY3RybCwKIAkuc19jdHJsCQk9IHY0bDJfc3ViZGV2X3NfY3RybCwKQEAgLTYxNiwxNSArNjcwLDE5IEBACiAJLmxvZ19zdGF0dXMJPSBub29uMDEwX2xvZ19zdGF0dXMsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBub29uMDEwX3ZpZGVvX29wcyA9IHsKLQkuZ19tYnVzX2ZtdAk9IG5vb24wMTBfZ19mbXQsCi0JLnNfbWJ1c19mbXQJPSBub29uMDEwX3NfZm10LAotCS50cnlfbWJ1c19mbXQJPSBub29uMDEwX3RyeV9mbXQsCi0JLmVudW1fbWJ1c19mbXQJPSBub29uMDEwX2VudW1fZm10LAorc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfb3BzIG5vb24wMTBfcGFkX29wcyA9IHsKKwkuZW51bV9tYnVzX2NvZGUJPSBub29uMDEwX2VudW1fbWJ1c19jb2RlLAorCS5nZXRfZm10CT0gbm9vbjAxMF9nZXRfZm10LAorCS5zZXRfZm10CT0gbm9vbjAxMF9zZXRfZm10LAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgbm9vbjAxMF92aWRlb19vcHMgPSB7CisJLnNfc3RyZWFtCT0gbm9vbjAxMF9zX3N0cmVhbSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG5vb24wMTBfb3BzID0gewogCS5jb3JlCT0gJm5vb24wMTBfY29yZV9vcHMsCisJLnBhZAk9ICZub29uMDEwX3BhZF9vcHMsCiAJLnZpZGVvCT0gJm5vb24wMTBfdmlkZW9fb3BzLAogfTsKIApAQCAtNjY1LDEwICs3MjMsMTQgQEAKIAlpZiAoIWluZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCisJbXV0ZXhfaW5pdCgmaW5mby0+bG9jayk7CiAJc2QgPSAmaW5mby0+c2Q7CiAJc3RybGNweShzZC0+bmFtZSwgTU9EVUxFX05BTUUsIHNpemVvZihzZC0+bmFtZSkpOwogCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZub29uMDEwX29wcyk7CiAKKwlzZC0+aW50ZXJuYWxfb3BzID0gJm5vb24wMTBfc3ViZGV2X2ludGVybmFsX29wczsKKwlzZC0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7CisKIAl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZpbmZvLT5oZGwsIDMpOwogCiAJdjRsMl9jdHJsX25ld19zdGQoJmluZm8tPmhkbCwgJm5vb24wMTBfY3RybF9vcHMsCkBAIC02ODQsMTAgKzc0NiwxMSBAQAogCWlmIChyZXQpCiAJCWdvdG8gbnBfZXJyOwogCi0JaW5mby0+cGRhdGEJCT0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpbmZvLT5pMmNfcmVnX3BhZ2UJPSAtMTsKIAlpbmZvLT5ncGlvX25yZXNldAk9IC1FSU5WQUw7CiAJaW5mby0+Z3Bpb19uc3RieQk9IC1FSU5WQUw7CisJaW5mby0+Y3Vycl9mbXQJCT0gJm5vb24wMTBfZm9ybWF0c1swXTsKKwlpbmZvLT5jdXJyX3dpbgkJPSAmbm9vbjAxMF9zaXplc1swXTsKIAogCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX25yZXNldCkpIHsKIAkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5ncGlvX25yZXNldCwgIk5PT04wMTBQQzMwIE5SU1QiKTsKQEAgLTcxOSwxMSArNzgyLDE3IEBACiAJaWYgKHJldCkKIAkJZ290byBucF9yZWdfZXJyOwogCisJaW5mby0+cGFkLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKKwlzZC0+ZW50aXR5LnR5cGUgPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVl9TRU5TT1I7CisJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQoJnNkLT5lbnRpdHksIDEsICZpbmZvLT5wYWQsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG5wX21lX2VycjsKKwogCXJldCA9IG5vb24wMTBfZGV0ZWN0KGNsaWVudCwgaW5mbyk7CiAJaWYgKCFyZXQpCiAJCXJldHVybiAwOwogCi0JLyogdGhlIHNlbnNvciBkZXRlY3Rpb24gZmFpbGVkICovCitucF9tZV9lcnI6CiAJcmVndWxhdG9yX2J1bGtfZnJlZShOT09OMDEwX05VTV9TVVBQTElFUywgaW5mby0+c3VwcGx5KTsKIG5wX3JlZ19lcnI6CiAJaWYgKGdwaW9faXNfdmFsaWQoaW5mby0+Z3Bpb19uc3RieSkpCkBAIC03NTQsNiArODIzLDcgQEAKIAlpZiAoZ3Bpb19pc192YWxpZChpbmZvLT5ncGlvX25zdGJ5KSkKIAkJZ3Bpb19mcmVlKGluZm8tPmdwaW9fbnN0YnkpOwogCisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnNkLT5lbnRpdHkpOwogCWtmcmVlKGluZm8pOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCmluZGV4IGIzYTVlY2QuLjljNWMxOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKQEAgLTQwMCw3ICs0MDAsNiBAQAogCiAJb3ZsLT5nZXRfb3ZlcmxheV9pbmZvKG92bCwgJmluZm8pOwogCWluZm8ucGFkZHIgPSBhZGRyOwotCWluZm8udmFkZHIgPSBOVUxMOwogCWluZm8ud2lkdGggPSBjcm9wd2lkdGg7CiAJaW5mby5oZWlnaHQgPSBjcm9waGVpZ2h0OwogCWluZm8uY29sb3JfbW9kZSA9IHZvdXQtPmRzc19tb2RlOwpAQCAtODM0LDYgKzgzMywxNSBAQAogLyoKICAqICBGaWxlIG9wZXJhdGlvbnMKICAqLworc3RhdGljIHVuc2lnbmVkIGludCBvbWFwX3ZvdXRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxID0gJnZvdXQtPnZicTsKKworCXJldHVybiB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlLCBxLCB3YWl0KTsKK30KKwogc3RhdGljIHZvaWQgb21hcF92b3V0X3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKQEAgLTExNjUsMTIgKzExNzMsMTcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCA9IGZoOworCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKKwlzdHJ1Y3Qgb21hcHZpZGVvX2luZm8gKm92aWQ7CiAJc3RydWN0IHY0bDJfd2luZG93ICp3aW4gPSAmZi0+Zm10LndpbjsKIAorCW92aWQgPSAmdm91dC0+dmlkX2luZm87CisJb3ZsID0gb3ZpZC0+b3ZlcmxheXNbMF07CisKIAlyZXQgPSBvbWFwX3ZvdXRfdHJ5X3dpbmRvdygmdm91dC0+ZmJ1Ziwgd2luKTsKIAogCWlmICghcmV0KSB7Ci0JCWlmICh2b3V0LT52aWQgPT0gT01BUF9WSURFTzEpCisJCWlmICgob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9HTE9CQUxfQUxQSEEpID09IDApCiAJCQl3aW4tPmdsb2JhbF9hbHBoYSA9IDI1NTsKIAkJZWxzZQogCQkJd2luLT5nbG9iYWxfYWxwaGEgPSBmLT5mbXQud2luLmdsb2JhbF9hbHBoYTsKQEAgLTExOTQsOCArMTIwNyw4IEBACiAKIAlyZXQgPSBvbWFwX3ZvdXRfbmV3X3dpbmRvdygmdm91dC0+Y3JvcCwgJnZvdXQtPndpbiwgJnZvdXQtPmZidWYsIHdpbik7CiAJaWYgKCFyZXQpIHsKLQkJLyogVmlkZW8xIHBsYW5lIGRvZXMgbm90IHN1cHBvcnQgZ2xvYmFsIGFscGhhICovCi0JCWlmIChvdmwtPmlkID09IE9NQVBfRFNTX1ZJREVPMSkKKwkJLyogVmlkZW8xIHBsYW5lIGRvZXMgbm90IHN1cHBvcnQgZ2xvYmFsIGFscGhhIG9uIE9NQVAzICovCisJCWlmICgob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9HTE9CQUxfQUxQSEEpID09IDApCiAJCQl2b3V0LT53aW4uZ2xvYmFsX2FscGhhID0gMjU1OwogCQllbHNlCiAJCQl2b3V0LT53aW4uZ2xvYmFsX2FscGhhID0gZi0+Zm10Lndpbi5nbG9iYWxfYWxwaGE7CkBAIC0xNzg4LDcgKzE4MDEsOSBAQAogCWlmIChvdmwtPm1hbmFnZXIgJiYgb3ZsLT5tYW5hZ2VyLT5nZXRfbWFuYWdlcl9pbmZvICYmCiAJCQlvdmwtPm1hbmFnZXItPnNldF9tYW5hZ2VyX2luZm8pIHsKIAkJb3ZsLT5tYW5hZ2VyLT5nZXRfbWFuYWdlcl9pbmZvKG92bC0+bWFuYWdlciwgJmluZm8pOwotCQlpbmZvLmFscGhhX2VuYWJsZWQgPSBlbmFibGU7CisJCS8qIGVuYWJsZSB0aGlzIG9ubHkgaWYgdGhlcmUgaXMgbm8gem9yZGVyIGNhcCAqLworCQlpZiAoKG92bC0+Y2FwcyAmIE9NQVBfRFNTX09WTF9DQVBfWk9SREVSKSA9PSAwKQorCQkJaW5mby5wYXJ0aWFsX2FscGhhX2VuYWJsZWQgPSBlbmFibGU7CiAJCWlmIChvdmwtPm1hbmFnZXItPnNldF9tYW5hZ2VyX2luZm8ob3ZsLT5tYW5hZ2VyLCAmaW5mbykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xODIwLDcgKzE4MzUsNyBAQAogCX0KIAlpZiAob3ZsLT5tYW5hZ2VyICYmIG92bC0+bWFuYWdlci0+Z2V0X21hbmFnZXJfaW5mbykgewogCQlvdmwtPm1hbmFnZXItPmdldF9tYW5hZ2VyX2luZm8ob3ZsLT5tYW5hZ2VyLCAmaW5mbyk7Ci0JCWlmIChpbmZvLmFscGhhX2VuYWJsZWQpCisJCWlmIChpbmZvLnBhcnRpYWxfYWxwaGFfZW5hYmxlZCkKIAkJCWEtPmZsYWdzIHw9IFY0TDJfRkJVRl9GTEFHX0xPQ0FMX0FMUEhBOwogCX0KIApAQCAtMTg1NSw2ICsxODcwLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBvbWFwX3ZvdXRfZm9wcyA9IHsKIAkub3duZXIgCQk9IFRISVNfTU9EVUxFLAorCS5wb2xsCQk9IG9tYXBfdm91dF9wb2xsLAogCS51bmxvY2tlZF9pb2N0bAk9IHZpZGVvX2lvY3RsMiwKIAkubW1hcCAJCT0gb21hcF92b3V0X21tYXAsCiAJLm9wZW4gCQk9IG9tYXBfdm91dF9vcGVuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDFfY2FtZXJhLmMKaW5kZXggOGE5NDdlNi4uZTg3YWUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAxX2NhbWVyYS5jCkBAIC0xMDIsMTAgKzEwMiwxMCBAQAogLyogZW5kIG9mIE9NQVAxIENhbWVyYSBJbnRlcmZhY2UgcmVnaXN0ZXJzICovCiAKIAotI2RlZmluZSBTT0NBTV9CVVNfRkxBR1MJKFNPQ0FNX01BU1RFUiB8IFwKLQkJCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBcCi0JCQlTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HIHwgXAotCQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8IFNPQ0FNX0RBVEFXSURUSF84KQorI2RlZmluZSBTT0NBTV9CVVNfRkxBR1MJKFY0TDJfTUJVU19NQVNURVIgfCBcCisJCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBcCisJCQlWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcgfCBcCisJCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCkKIAogCiAjZGVmaW5lIEZJRk9fU0laRQkJKChUSFJFU0hPTERfTUFTSyA+PiBUSFJFU0hPTERfU0hJRlQpICsgMSkKQEAgLTE0MzgsNDEgKzE0MzgsNTUgQEAKIHN0YXRpYyBpbnQgb21hcDFfY2FtX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCV9fdTMyIHBpeGZtdCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2KTsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZTsKIAljb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgKmZtdDsKLQl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNmZyA9IHsudHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTCx9OworCXVuc2lnbmVkIGxvbmcgY29tbW9uX2ZsYWdzOwogCXUzMiBjdHJsY2xvY2ssIG1vZGU7CiAJaW50IHJldDsKIAotCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKLQotCWNvbW1vbl9mbGFncyA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLAotCQkJU09DQU1fQlVTX0ZMQUdTKTsKLQlpZiAoIWNvbW1vbl9mbGFncykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBNYWtlIGNob2ljZXMsIHBvc3NpYmx5IGJhc2VkIG9uIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gKi8KLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykgJiYKLQkJCShjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HKSkgewotCQlpZiAoIXBjZGV2LT5wZGF0YSB8fAotCQkJCXBjZGV2LT5wZGF0YS0+ZmxhZ3MgJiBPTUFQMV9DQU1FUkFfTENMS19SSVNJTkcpCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkc7Ci0JCWVsc2UKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfUklTSU5HOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLCBTT0NBTV9CVVNfRkxBR1MpOworCQlpZiAoIWNvbW1vbl9mbGFncykgeworCQkJZGV2X3dhcm4oZGV2LAorCQkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgMHgleCwgaG9zdCAweCV4XG4iLAorCQkJCSBjZmcuZmxhZ3MsIFNPQ0FNX0JVU19GTEFHUyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkgeworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCWNvbW1vbl9mbGFncyA9IFNPQ0FNX0JVU19GTEFHUzsKIAl9CiAKLQlyZXQgPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbShpY2QsIGNvbW1vbl9mbGFncyk7Ci0JaWYgKHJldCA8IDApCisJLyogTWFrZSBjaG9pY2VzLCBwb3NzaWJseSBiYXNlZCBvbiBwbGF0Zm9ybSBjb25maWd1cmF0aW9uICovCisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKSAmJgorCQkJKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKSkgeworCQlpZiAoIXBjZGV2LT5wZGF0YSB8fAorCQkJCXBjZGV2LT5wZGF0YS0+ZmxhZ3MgJiBPTUFQMV9DQU1FUkFfTENMS19SSVNJTkcpCisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HOworCQllbHNlCisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkc7CisJfQorCisJY2ZnLmZsYWdzID0gY29tbW9uX2ZsYWdzOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCWRldl9kYmcoZGV2LCAiY2FtZXJhIHNfbWJ1c19jb25maWcoMHglbHgpIHJldHVybmVkICVkXG4iLAorCQkJY29tbW9uX2ZsYWdzLCByZXQpOwogCQlyZXR1cm4gcmV0OworCX0KIAogCWN0cmxjbG9jayA9IENBTV9SRUFEX0NBQ0hFKHBjZGV2LCBDVFJMQ0xPQ0spOwogCWlmIChjdHJsY2xvY2sgJiBMQ0xLX0VOKQogCQlDQU1fV1JJVEUocGNkZXYsIENUUkxDTE9DSywgY3RybGNsb2NrICYgfkxDTEtfRU4pOwogCi0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykgeworCWlmIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKSB7CiAJCWRldl9kYmcoZGV2LCAiQ1RSTENMT0NLX1JFRyB8PSBQT0xDTEtcbiIpOwogCQljdHJsY2xvY2sgfD0gUE9MQ0xLOwogCX0gZWxzZSB7CkBAIC0xNTY1LDEwICsxNTc5LDEwIEBACiAJcGNkZXYtPmNsayA9IGNsazsKIAogCXBjZGV2LT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXBjZGV2LT5wZmxhZ3MgPSBwY2Rldi0+cGRhdGEtPmZsYWdzOwotCi0JaWYgKHBjZGV2LT5wZGF0YSkKKwlpZiAocGNkZXYtPnBkYXRhKSB7CisJCXBjZGV2LT5wZmxhZ3MgPSBwY2Rldi0+cGRhdGEtPmZsYWdzOwogCQlwY2Rldi0+Y2FtZXhjbGsgPSBwY2Rldi0+cGRhdGEtPmNhbWV4Y2xrX2toeiAqIDEwMDA7CisJfQogCiAJc3dpdGNoIChwY2Rldi0+Y2FtZXhjbGspIHsKIAljYXNlIDYwMDAwMDA6CkBAIC0xNTc4LDYgKzE1OTIsNyBAQAogCWNhc2UgMjQwMDAwMDA6CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCS8qIHBjZGV2LT5jYW1leGNsayAhPSAwID0+IHBjZGV2LT5wZGF0YSAhPSBOVUxMICovCiAJCWRldl93YXJuKCZwZGV2LT5kZXYsCiAJCQkJIkluY29ycmVjdCBzZW5zb3IgY2xvY2sgZnJlcXVlbmN5ICVsZCBrSHosICIKIAkJCQkic2hvdWxkIGJlIG9uZSBvZiAwLCA2LCA4LCA5LjYsIDEyIG9yIDI0IE1IeiwgIgpAQCAtMTU4NSw4ICsxNjAwLDcgQEAKIAkJCQlwY2Rldi0+cGRhdGEtPmNhbWV4Y2xrX2toeik7CiAJCXBjZGV2LT5jYW1leGNsayA9IDA7CiAJY2FzZSAwOgotCQlkZXZfaW5mbygmcGRldi0+ZGV2LAotCQkJCSJOb3QgcHJvdmlkaW5nIHNlbnNvciBjbG9ja1xuIik7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJOb3QgcHJvdmlkaW5nIHNlbnNvciBjbG9ja1xuIik7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJnBjZGV2LT5jYXB0dXJlKTsKQEAgLTE3MTYsNSArMTczMCw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAxIENhbWVyYSBJbnRlcmZhY2UgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJKYW51c3ogS3J6eXN6dG9maWsgPGprcnp5c3p0QHRpcy5pY25ldC5wbD4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9MSUNFTlNFKERSSVZFUl9WRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUklWRVJfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMKaW5kZXggZWI5N2JmZi4uNDU1MjJlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0uYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL01ha2VmaWxlCmluZGV4IGIxYjM0NDc3Li5lODg0N2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvTWFrZWZpbGUKQEAgLTEsOCArMSw2IEBACiAjIE1ha2VmaWxlIGZvciBPTUFQMyBJU1AgZHJpdmVyCiAKLWlmZGVmIENPTkZJR19WSURFT19PTUFQM19ERUJVRwotRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKLWVuZGlmCitjY2ZsYWdzLSQoQ09ORklHX1ZJREVPX09NQVAzX0RFQlVHKSArPSAtRERFQlVHCiAKIG9tYXAzLWlzcC1vYmpzICs9IFwKIAlpc3AubyBpc3BxdWV1ZS5vIGlzcHZpZGVvLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmMKaW5kZXggNWNlYTJiYi4uYjgxOGNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5jCkBAIC04MCw2ICs4MCwxMyBAQAogI2luY2x1ZGUgImlzcGgzYS5oIgogI2luY2x1ZGUgImlzcGhpc3QuaCIKIAorLyoKKyAqIHRoaXMgaXMgcHJvdmlkZWQgYXMgYW4gaW50ZXJpbSBzb2x1dGlvbiB1bnRpbCBvbWFwM2lzcCBkb2Vzbid0IG5lZWQKKyAqIGFueSBvbWFwLXNwZWNpZmljIGlvbW11IEFQSQorICovCisjZGVmaW5lIHRvX2lvbW11KGRldikJCQkJCQkJXAorCShzdHJ1Y3Qgb21hcF9pb21tdSAqKXBsYXRmb3JtX2dldF9kcnZkYXRhKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKQorCiBzdGF0aWMgdW5zaWduZWQgaW50IGF1dG9pZGxlOwogbW9kdWxlX3BhcmFtKGF1dG9pZGxlLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhdXRvaWRsZSwgIkVuYWJsZSBPTUFQM0lTUCBBVVRPSURMRSBzdXBwb3J0Iik7CkBAIC03MzIsNyArNzM5LDcgQEAKIAlzdHJ1Y3QgbWVkaWFfcGFkICpwYWQ7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBpcGUtPmxvY2ssIGZsYWdzKTsKIAlwaXBlLT5zdGF0ZSAmPSB+KElTUF9QSVBFTElORV9JRExFX0lOUFVUIHwgSVNQX1BJUEVMSU5FX0lETEVfT1VUUFVUKTsKQEAgLTc1Niw3ICs3NjMsNyBAQAogCiAJCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc3ViZGV2LCB2aWRlbywgc19zdHJlYW0sIG1vZGUpOwogCQlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gcmV0OwogCiAJCWlmIChzdWJkZXYgPT0gJmlzcC0+aXNwX2NjZGMuc3ViZGV2KSB7CiAJCQl2NGwyX3N1YmRldl9jYWxsKCZpc3AtPmlzcF9hZXdiLnN1YmRldiwgdmlkZW8sCkBAIC03NzcsNyArNzg0LDcgQEAKIAlpZiAocGlwZS0+ZG9fcHJvcGFnYXRpb24gJiYgbW9kZSA9PSBJU1BfUElQRUxJTkVfU1RSRUFNX1NJTkdMRVNIT1QpCiAJCWF0b21pY19pbmMoJnBpcGUtPmZyYW1lX251bWJlcik7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGlzcF9waXBlbGluZV93YWl0X3Jlc2l6ZXIoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKQEAgLTExMDgsNyArMTExNSw3IEBACiB7CiAJaXNwX3NhdmVfY29udGV4dChpc3AsIGlzcF9yZWdfbGlzdCk7CiAJaWYgKGlzcC0+aW9tbXUpCi0JCWlvbW11X3NhdmVfY3R4KGlzcC0+aW9tbXUpOworCQlvbWFwX2lvbW11X3NhdmVfY3R4KGlzcC0+aW9tbXUpOwogfQogCiAvKgpAQCAtMTEyMiw3ICsxMTI5LDcgQEAKIHsKIAlpc3BfcmVzdG9yZV9jb250ZXh0KGlzcCwgaXNwX3JlZ19saXN0KTsKIAlpZiAoaXNwLT5pb21tdSkKLQkJaW9tbXVfcmVzdG9yZV9jdHgoaXNwLT5pb21tdSk7CisJCW9tYXBfaW9tbXVfcmVzdG9yZV9jdHgoaXNwLT5pb21tdSk7CiAJb21hcDNpc3BfY2NkY19yZXN0b3JlX2NvbnRleHQoaXNwKTsKIAlvbWFwM2lzcF9wcmV2aWV3X3Jlc3RvcmVfY29udGV4dChpc3ApOwogfQpAQCAtMTY5Nyw2ICsxNzA0LDcgQEAKIAlpc3AtPm1lZGlhX2Rldi5kZXYgPSBpc3AtPmRldjsKIAlzdHJsY3B5KGlzcC0+bWVkaWFfZGV2Lm1vZGVsLCAiVEkgT01BUDMgSVNQIiwKIAkJc2l6ZW9mKGlzcC0+bWVkaWFfZGV2Lm1vZGVsKSk7CisJaXNwLT5tZWRpYV9kZXYuaHdfcmV2aXNpb24gPSBpc3AtPnJldmlzaW9uOwogCWlzcC0+bWVkaWFfZGV2Lmxpbmtfbm90aWZ5ID0gaXNwX3BpcGVsaW5lX2xpbmtfbm90aWZ5OwogCXJldCA9IG1lZGlhX2RldmljZV9yZWdpc3RlcigmaXNwLT5tZWRpYV9kZXYpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0xOTc1LDcgKzE5ODMsOCBAQAogCWlzcF9jbGVhbnVwX21vZHVsZXMoaXNwKTsKIAogCW9tYXAzaXNwX2dldChpc3ApOwotCWlvbW11X3B1dChpc3AtPmlvbW11KTsKKwlpb21tdV9kZXRhY2hfZGV2aWNlKGlzcC0+ZG9tYWluLCBpc3AtPmlvbW11X2Rldik7CisJaW9tbXVfZG9tYWluX2ZyZWUoaXNwLT5kb21haW4pOwogCW9tYXAzaXNwX3B1dChpc3ApOwogCiAJZnJlZV9pcnEoaXNwLT5pcnFfbnVtLCBpc3ApOwpAQCAtMjEyMywyNSArMjEzMiw0MSBAQAogCX0KIAogCS8qIElPTU1VICovCi0JaXNwLT5pb21tdSA9IGlvbW11X2dldCgiaXNwIik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGlzcC0+aW9tbXUpKSB7Ci0JCWlzcC0+aW9tbXUgPSBOVUxMOworCWlzcC0+aW9tbXVfZGV2ID0gb21hcF9maW5kX2lvbW11X2RldmljZSgiaXNwIik7CisJaWYgKCFpc3AtPmlvbW11X2RldikgeworCQlkZXZfZXJyKGlzcC0+ZGV2LCAib21hcF9maW5kX2lvbW11X2RldmljZSBmYWlsZWRcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycm9yX2lzcDsKIAl9CiAKKwkvKiB0byBiZSByZW1vdmVkIG9uY2UgaW9tbXUgbWlncmF0aW9uIGlzIGNvbXBsZXRlICovCisJaXNwLT5pb21tdSA9IHRvX2lvbW11KGlzcC0+aW9tbXVfZGV2KTsKKworCWlzcC0+ZG9tYWluID0gaW9tbXVfZG9tYWluX2FsbG9jKHBkZXYtPmRldi5idXMpOworCWlmICghaXNwLT5kb21haW4pIHsKKwkJZGV2X2Vycihpc3AtPmRldiwgImNhbid0IGFsbG9jIGlvbW11IGRvbWFpblxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfaXNwOworCX0KKworCXJldCA9IGlvbW11X2F0dGFjaF9kZXZpY2UoaXNwLT5kb21haW4sIGlzcC0+aW9tbXVfZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGF0dGFjaCBpb21tdSBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlnb3RvIGZyZWVfZG9tYWluOworCX0KKwogCS8qIEludGVycnVwdCAqLwogCWlzcC0+aXJxX251bSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKGlzcC0+aXJxX251bSA8PSAwKSB7CiAJCWRldl9lcnIoaXNwLT5kZXYsICJObyBJUlEgcmVzb3VyY2VcbiIpOwogCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycm9yX2lzcDsKKwkJZ290byBkZXRhY2hfZGV2OwogCX0KIAogCWlmIChyZXF1ZXN0X2lycShpc3AtPmlycV9udW0sIGlzcF9pc3IsIElSUUZfU0hBUkVELCAiT01BUDMgSVNQIiwgaXNwKSkgewogCQlkZXZfZXJyKGlzcC0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgSVJRXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJvcl9pc3A7CisJCWdvdG8gZGV0YWNoX2RldjsKIAl9CiAKIAkvKiBFbnRpdGllcyAqLwpAQCAtMjE2Miw4ICsyMTg3LDExIEBACiAJaXNwX2NsZWFudXBfbW9kdWxlcyhpc3ApOwogZXJyb3JfaXJxOgogCWZyZWVfaXJxKGlzcC0+aXJxX251bSwgaXNwKTsKK2RldGFjaF9kZXY6CisJaW9tbXVfZGV0YWNoX2RldmljZShpc3AtPmRvbWFpbiwgaXNwLT5pb21tdV9kZXYpOworZnJlZV9kb21haW46CisJaW9tbXVfZG9tYWluX2ZyZWUoaXNwLT5kb21haW4pOwogZXJyb3JfaXNwOgotCWlvbW11X3B1dChpc3AtPmlvbW11KTsKIAlvbWFwM2lzcF9wdXQoaXNwKTsKIGVycm9yOgogCWlzcF9wdXRfY2xvY2tzKGlzcCk7CkBAIC0yMTgzLDYgKzIyMTEsOCBAQAogCXJlZ3VsYXRvcl9wdXQoaXNwLT5pc3BfY3NpcGh5Mi52ZGQpOwogCXJlZ3VsYXRvcl9wdXQoaXNwLT5pc3BfY3NpcGh5MS52ZGQpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJbXV0ZXhfZGVzdHJveSgmaXNwLT5pc3BfbXV0ZXgpOwogCWtmcmVlKGlzcCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmgKaW5kZXggNTI5ZTU4Mi4uNzA1OTQ2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5oCkBAIC0yNywxMSArMjcsMTMgQEAKICNpZm5kZWYgT01BUDNfSVNQX0NPUkVfSAogI2RlZmluZSBPTUFQM19JU1BfQ09SRV9ICiAKKyNpbmNsdWRlIDxtZWRpYS9vbWFwM2lzcC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KICNpbmNsdWRlIDxwbGF0L2lvbW11Lmg+CiAjaW5jbHVkZSA8cGxhdC9pb3ZtbS5oPgogCkBAIC05NCwxNCArOTYsNiBAQAogCU9NQVAzX0lTUF9TVUJDTEtfUkVTSVpFUgk9ICgxIDw8IDQpLAogfTsKIAotZW51bSBpc3BfaW50ZXJmYWNlX3R5cGUgewotCUlTUF9JTlRFUkZBQ0VfUEFSQUxMRUwsCi0JSVNQX0lOVEVSRkFDRV9DU0kyQV9QSFkyLAotCUlTUF9JTlRFUkZBQ0VfQ0NQMkJfUEhZMSwKLQlJU1BfSU5URVJGQUNFX0NDUDJCX1BIWTIsCi0JSVNQX0lOVEVSRkFDRV9DU0kyQ19QSFkxLAotfTsKLQogLyogSVNQOiBPTUFQIDM0eHggRVMgMS4wICovCiAjZGVmaW5lIElTUF9SRVZJU0lPTl8xXzAJCTB4MTAKIC8qIElTUDI6IE9NQVAgMzR4eCBFUyAyLjAsIDIuMSBhbmQgMy4wICovCkBAIC0xMzAsODIgKzEyNCw2IEBACiAJdTMyIHZhbDsKIH07CiAKLS8qKgotICogc3RydWN0IGlzcF9wYXJhbGxlbF9wbGF0Zm9ybV9kYXRhIC0gUGFyYWxsZWwgaW50ZXJmYWNlIHBsYXRmb3JtIGRhdGEKLSAqIEBkYXRhX2xhbmVfc2hpZnQ6IERhdGEgbGFuZSBzaGlmdGVyCi0gKgkJMCAtIENBTUVYVFsxMzowXSAtPiBDQU1bMTM6MF0KLSAqCQkxIC0gQ0FNRVhUWzEzOjJdIC0+IENBTVsxMTowXQotICoJCTIgLSBDQU1FWFRbMTM6NF0gLT4gQ0FNWzk6MF0KLSAqCQkzIC0gQ0FNRVhUWzEzOjZdIC0+IENBTVs3OjBdCi0gKiBAY2xrX3BvbDogUGl4ZWwgY2xvY2sgcG9sYXJpdHkKLSAqCQkwIC0gTm9uIEludmVydGVkLCAxIC0gSW52ZXJ0ZWQKLSAqIEBoc19wb2w6IEhvcml6b250YWwgc3luY2hyb25pemF0aW9uIHBvbGFyaXR5Ci0gKgkJMCAtIEFjdGl2ZSBoaWdoLCAxIC0gQWN0aXZlIGxvdwotICogQHZzX3BvbDogVmVydGljYWwgc3luY2hyb25pemF0aW9uIHBvbGFyaXR5Ci0gKgkJMCAtIEFjdGl2ZSBoaWdoLCAxIC0gQWN0aXZlIGxvdwotICogQGJyaWRnZTogQ0NEQyBCcmlkZ2UgaW5wdXQgY29udHJvbAotICoJCUlTUENUUkxfUEFSX0JSSURHRV9ESVNBQkxFIC0gRGlzYWJsZQotICoJCUlTUENUUkxfUEFSX0JSSURHRV9MRU5ESUFOIC0gTGl0dGxlIGVuZGlhbgotICoJCUlTUENUUkxfUEFSX0JSSURHRV9CRU5ESUFOIC0gQmlnIGVuZGlhbgotICovCi1zdHJ1Y3QgaXNwX3BhcmFsbGVsX3BsYXRmb3JtX2RhdGEgewotCXVuc2lnbmVkIGludCBkYXRhX2xhbmVfc2hpZnQ6MjsKLQl1bnNpZ25lZCBpbnQgY2xrX3BvbDoxOwotCXVuc2lnbmVkIGludCBoc19wb2w6MTsKLQl1bnNpZ25lZCBpbnQgdnNfcG9sOjE7Ci0JdW5zaWduZWQgaW50IGJyaWRnZTo0OwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgaXNwX2NjcDJfcGxhdGZvcm1fZGF0YSAtIENDUDIgaW50ZXJmYWNlIHBsYXRmb3JtIGRhdGEKLSAqIEBzdHJvYmVfY2xrX3BvbDogU3Ryb2JlL2Nsb2NrIHBvbGFyaXR5Ci0gKgkJMCAtIE5vbiBJbnZlcnRlZCwgMSAtIEludmVydGVkCi0gKiBAY3JjOiBFbmFibGUgdGhlIGN5Y2xpYyByZWR1bmRhbmN5IGNoZWNrCi0gKiBAY2NwMl9tb2RlOiBFbmFibGUgQ0NQMiBjb21wYXRpYmlsaXR5IG1vZGUKLSAqCQkwIC0gTUlQSS1DU0kxIG1vZGUsIDEgLSBDQ1AyIG1vZGUKLSAqIEBwaHlfbGF5ZXI6IFBoeXNpY2FsIGxheWVyIHNlbGVjdGlvbgotICoJCUlTUENDUDJfQ1RSTF9QSFlfU0VMX0NMT0NLIC0gRGF0YS9jbG9jayBwaHlzaWNhbCBsYXllcgotICoJCUlTUENDUDJfQ1RSTF9QSFlfU0VMX1NUUk9CRSAtIERhdGEvc3Ryb2JlIHBoeXNpY2FsIGxheWVyCi0gKiBAdnBjbGtfZGl2OiBWaWRlbyBwb3J0IG91dHB1dCBjbG9jayBjb250cm9sCi0gKi8KLXN0cnVjdCBpc3BfY2NwMl9wbGF0Zm9ybV9kYXRhIHsKLQl1bnNpZ25lZCBpbnQgc3Ryb2JlX2Nsa19wb2w6MTsKLQl1bnNpZ25lZCBpbnQgY3JjOjE7Ci0JdW5zaWduZWQgaW50IGNjcDJfbW9kZToxOwotCXVuc2lnbmVkIGludCBwaHlfbGF5ZXI6MTsKLQl1bnNpZ25lZCBpbnQgdnBjbGtfZGl2OjI7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpc3BfY3NpMl9wbGF0Zm9ybV9kYXRhIC0gQ1NJMiBpbnRlcmZhY2UgcGxhdGZvcm0gZGF0YQotICogQGNyYzogRW5hYmxlIHRoZSBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjawotICogQHZwY2xrX2RpdjogVmlkZW8gcG9ydCBvdXRwdXQgY2xvY2sgY29udHJvbAotICovCi1zdHJ1Y3QgaXNwX2NzaTJfcGxhdGZvcm1fZGF0YSB7Ci0JdW5zaWduZWQgY3JjOjE7Ci0JdW5zaWduZWQgdnBjbGtfZGl2OjI7Ci19OwotCi1zdHJ1Y3QgaXNwX3N1YmRldl9pMmNfYm9hcmRfaW5mbyB7Ci0Jc3RydWN0IGkyY19ib2FyZF9pbmZvICpib2FyZF9pbmZvOwotCWludCBpMmNfYWRhcHRlcl9pZDsKLX07Ci0KLXN0cnVjdCBpc3BfdjRsMl9zdWJkZXZzX2dyb3VwIHsKLQlzdHJ1Y3QgaXNwX3N1YmRldl9pMmNfYm9hcmRfaW5mbyAqc3ViZGV2czsKLQllbnVtIGlzcF9pbnRlcmZhY2VfdHlwZSBpbnRlcmZhY2U7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaXNwX3BhcmFsbGVsX3BsYXRmb3JtX2RhdGEgcGFyYWxsZWw7Ci0JCXN0cnVjdCBpc3BfY2NwMl9wbGF0Zm9ybV9kYXRhIGNjcDI7Ci0JCXN0cnVjdCBpc3BfY3NpMl9wbGF0Zm9ybV9kYXRhIGNzaTI7Ci0JfSBidXM7IC8qIGdjYyA8IDQuNi4wIGNob2tlcyBvbiBhbm9ueW1vdXMgdW5pb24gaW5pdGlhbGl6ZXJzICovCi19OwotCi1zdHJ1Y3QgaXNwX3BsYXRmb3JtX2RhdGEgewotCXN0cnVjdCBpc3BfdjRsMl9zdWJkZXZzX2dyb3VwICpzdWJkZXZzOwotCXZvaWQgKCpzZXRfY29uc3RyYWludHMpKHN0cnVjdCBpc3BfZGV2aWNlICppc3AsIGJvb2wgZW5hYmxlKTsKLX07Ci0KIHN0cnVjdCBpc3BfcGxhdGZvcm1fY2FsbGJhY2sgewogCXUzMiAoKnNldF94Y2xrKShzdHJ1Y3QgaXNwX2RldmljZSAqaXNwLCB1MzIgeGNsaywgdTggeGNsa3NlbCk7CiAJaW50ICgqY3NpcGh5X2NvbmZpZykoc3RydWN0IGlzcF9jc2lwaHkgKnBoeSwKQEAgLTI5NCw3ICsyMTIsOSBAQAogCXVuc2lnbmVkIGludCBzYmxfcmVzb3VyY2VzOwogCXVuc2lnbmVkIGludCBzdWJjbGtfcmVzb3VyY2VzOwogCi0Jc3RydWN0IGlvbW11ICppb21tdTsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqaW9tbXU7CisJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluOworCXN0cnVjdCBkZXZpY2UgKmlvbW11X2RldjsKIAogCXN0cnVjdCBpc3BfcGxhdGZvcm1fY2FsbGJhY2sgcGxhdGZvcm1fY2I7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY2RjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjZGMuYwppbmRleCA4MDc5NmViLi5iMGIwZmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjZGMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjZGMuYwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJCWRtYV91bm1hcF9zZyhpc3AtPmRldiwgcmVxLT5pb3ZtLT5zZ3QtPnNnbCwKIAkJCSAgICAgcmVxLT5pb3ZtLT5zZ3QtPm5lbnRzLCBETUFfVE9fREVWSUNFKTsKIAlpZiAocmVxLT50YWJsZSkKLQkJaW9tbXVfdmZyZWUoaXNwLT5pb21tdSwgcmVxLT50YWJsZSk7CisJCW9tYXBfaW9tbXVfdmZyZWUoaXNwLT5kb21haW4sIGlzcC0+aW9tbXUsIHJlcS0+dGFibGUpOwogCWtmcmVlKHJlcSk7CiB9CiAKQEAgLTQzOCwxNSArNDM4LDE1IEBACiAKIAkJcmVxLT5lbmFibGUgPSAxOwogCi0JCXJlcS0+dGFibGUgPSBpb21tdV92bWFsbG9jKGlzcC0+aW9tbXUsIDAsIHJlcS0+Y29uZmlnLnNpemUsCi0JCQkJCSAgIElPTU1VX0ZMQUcpOworCQlyZXEtPnRhYmxlID0gb21hcF9pb21tdV92bWFsbG9jKGlzcC0+ZG9tYWluLCBpc3AtPmlvbW11LCAwLAorCQkJCQlyZXEtPmNvbmZpZy5zaXplLCBJT01NVV9GTEFHKTsKIAkJaWYgKElTX0VSUl9WQUxVRShyZXEtPnRhYmxlKSkgewogCQkJcmVxLT50YWJsZSA9IDA7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBkb25lOwogCQl9CiAKLQkJcmVxLT5pb3ZtID0gZmluZF9pb3ZtX2FyZWEoaXNwLT5pb21tdSwgcmVxLT50YWJsZSk7CisJCXJlcS0+aW92bSA9IG9tYXBfZmluZF9pb3ZtX2FyZWEoaXNwLT5pb21tdSwgcmVxLT50YWJsZSk7CiAJCWlmIChyZXEtPmlvdm0gPT0gTlVMTCkgewogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZG9uZTsKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCQlkbWFfc3luY19zZ19mb3JfY3B1KGlzcC0+ZGV2LCByZXEtPmlvdm0tPnNndC0+c2dsLAogCQkJCSAgICByZXEtPmlvdm0tPnNndC0+bmVudHMsIERNQV9UT19ERVZJQ0UpOwogCi0JCXRhYmxlID0gZGFfdG9fdmEoaXNwLT5pb21tdSwgcmVxLT50YWJsZSk7CisJCXRhYmxlID0gb21hcF9kYV90b192YShpc3AtPmlvbW11LCByZXEtPnRhYmxlKTsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKHRhYmxlLCBjb25maWctPmxzYywgcmVxLT5jb25maWcuc2l6ZSkpIHsKIAkJCXJldCA9IC1FRkFVTFQ7CiAJCQlnb3RvIGRvbmU7CkBAIC03MzEsMTggKzczMSwxOSBAQAogCiAJCQkvKgogCQkJICogdGFibGVfbmV3IG11c3QgYmUgNjQtYnl0ZXMgYWxpZ25lZCwgYnV0IGl0J3MKLQkJCSAqIGFscmVhZHkgZG9uZSBieSBpb21tdV92bWFsbG9jKCkuCisJCQkgKiBhbHJlYWR5IGRvbmUgYnkgb21hcF9pb21tdV92bWFsbG9jKCkuCiAJCQkgKi8KIAkJCXNpemUgPSBjY2RjLT5mcGMuZnBudW0gKiA0OwotCQkJdGFibGVfbmV3ID0gaW9tbXVfdm1hbGxvYyhpc3AtPmlvbW11LCAwLCBzaXplLAotCQkJCQkJICBJT01NVV9GTEFHKTsKKwkJCXRhYmxlX25ldyA9IG9tYXBfaW9tbXVfdm1hbGxvYyhpc3AtPmRvbWFpbiwgaXNwLT5pb21tdSwKKwkJCQkJCQkwLCBzaXplLCBJT01NVV9GTEFHKTsKIAkJCWlmIChJU19FUlJfVkFMVUUodGFibGVfbmV3KSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRhX3RvX3ZhKGlzcC0+aW9tbXUsIHRhYmxlX25ldyksCisJCQlpZiAoY29weV9mcm9tX3VzZXIob21hcF9kYV90b192YShpc3AtPmlvbW11LCB0YWJsZV9uZXcpLAogCQkJCQkgICAoX19mb3JjZSB2b2lkIF9fdXNlciAqKQogCQkJCQkgICBjY2RjLT5mcGMuZnBjYWRkciwgc2l6ZSkpIHsKLQkJCQlpb21tdV92ZnJlZShpc3AtPmlvbW11LCB0YWJsZV9uZXcpOworCQkJCW9tYXBfaW9tbXVfdmZyZWUoaXNwLT5kb21haW4sIGlzcC0+aW9tbXUsCisJCQkJCQkJCXRhYmxlX25ldyk7CiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAKQEAgLTc1Miw3ICs3NTMsNyBAQAogCiAJCWNjZGNfY29uZmlndXJlX2ZwYyhjY2RjKTsKIAkJaWYgKHRhYmxlX29sZCAhPSAwKQotCQkJaW9tbXVfdmZyZWUoaXNwLT5pb21tdSwgdGFibGVfb2xkKTsKKwkJCW9tYXBfaW9tbXVfdmZyZWUoaXNwLT5kb21haW4sIGlzcC0+aW9tbXUsIHRhYmxlX29sZCk7CiAJfQogCiAJcmV0dXJuIGNjZGNfbHNjX2NvbmZpZyhjY2RjLCBjY2RjX3N0cnVjdCk7CkBAIC0xNDA1LDExICsxNDA2LDE0IEBACiAKIHN0YXRpYyB2b2lkIGNjZGNfaHNfdnNfaXNyKHN0cnVjdCBpc3BfY2NkY19kZXZpY2UgKmNjZGMpCiB7CisJc3RydWN0IGlzcF9waXBlbGluZSAqcGlwZSA9CisJCXRvX2lzcF9waXBlbGluZSgmY2NkYy0+dmlkZW9fb3V0LnZpZGVvLmVudGl0eSk7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9ICZjY2RjLT5zdWJkZXYuZGV2bm9kZTsKIAlzdHJ1Y3QgdjRsMl9ldmVudCBldmVudDsKIAogCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwotCWV2ZW50LnR5cGUgPSBWNEwyX0VWRU5UX09NQVAzSVNQX0hTX1ZTOworCWV2ZW50LnR5cGUgPSBWNEwyX0VWRU5UX0ZSQU1FX1NZTkM7CisJZXZlbnQudS5mcmFtZV9zeW5jLmZyYW1lX3NlcXVlbmNlID0gYXRvbWljX3JlYWQoJnBpcGUtPmZyYW1lX251bWJlcik7CiAKIAl2NGwyX2V2ZW50X3F1ZXVlKHZkZXYsICZldmVudCk7CiB9CkBAIC0xNjkxLDcgKzE2OTUsMTEgQEAKIHN0YXRpYyBpbnQgY2NkY19zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZmggKmZoLAogCQkJCXN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKQogewotCWlmIChzdWItPnR5cGUgIT0gVjRMMl9FVkVOVF9PTUFQM0lTUF9IU19WUykKKwlpZiAoc3ViLT50eXBlICE9IFY0TDJfRVZFTlRfRlJBTUVfU1lOQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBsaW5lIG51bWJlciBpcyB6ZXJvIGF0IGZyYW1lIHN0YXJ0ICovCisJaWYgKHN1Yi0+aWQgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gdjRsMl9ldmVudF9zdWJzY3JpYmUoZmgsIHN1YiwgT01BUDNJU1BfQ0NEQ19ORVZFTlRTKTsKQEAgLTE4MjgsNyArMTgzNiw3IEBACiAJCSAqIGNhbGxlcnMgdG8gcmVxdWVzdCBhbiBvdXRwdXQgc2l6ZSBiaWdnZXIgdGhhbiB0aGUgaW5wdXQgc2l6ZQogCQkgKiB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiAxNi4KIAkJICovCi0JCWZtdC0+d2lkdGggPSBjbGFtcF90KHUzMiwgd2lkdGgsIDMyLCAoZm10LT53aWR0aCArIDE1KSAmIH4xNSk7CisJCWZtdC0+d2lkdGggPSBjbGFtcF90KHUzMiwgd2lkdGgsIDMyLCBmbXQtPndpZHRoICsgMTUpOwogCQlmbXQtPndpZHRoICY9IH4xNTsKIAkJZm10LT5oZWlnaHQgPSBjbGFtcF90KHUzMiwgaGVpZ2h0LCAzMiwgZm10LT5oZWlnaHQpOwogCQlicmVhazsKQEAgLTIxNDQsNiArMjE1MiwzNyBAQAogCS5saW5rX3NldHVwID0gY2NkY19saW5rX3NldHVwLAogfTsKIAordm9pZCBvbWFwM2lzcF9jY2RjX3VucmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jY2RjX2RldmljZSAqY2NkYykKK3sKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmY2NkYy0+c3ViZGV2KTsKKwlvbWFwM2lzcF92aWRlb191bnJlZ2lzdGVyKCZjY2RjLT52aWRlb19vdXQpOworfQorCitpbnQgb21hcDNpc3BfY2NkY19yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX2NjZGNfZGV2aWNlICpjY2RjLAorCXN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKK3sKKwlpbnQgcmV0OworCisJLyogUmVnaXN0ZXIgdGhlIHN1YmRldiBhbmQgdmlkZW8gbm9kZS4gKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJmNjZGMtPnN1YmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmY2NkYy0+dmlkZW9fb3V0LCB2ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlvbWFwM2lzcF9jY2RjX3VucmVnaXN0ZXJfZW50aXRpZXMoY2NkYyk7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElTUCBDQ0RDIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwCisgKi8KKwogLyoKICAqIGNjZGNfaW5pdF9lbnRpdGllcyAtIEluaXRpYWxpemUgVjRMMiBzdWJkZXYgYW5kIG1lZGlhIGVudGl0eQogICogQGNjZGM6IElTUCBDQ0RDIG1vZHVsZQpAQCAtMjE4NSw1MCArMjIyNCwyMyBAQAogCiAJcmV0ID0gb21hcDNpc3BfdmlkZW9faW5pdCgmY2NkYy0+dmlkZW9fb3V0LCAiQ0NEQyIpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX3ZpZGVvOwogCiAJLyogQ29ubmVjdCB0aGUgQ0NEQyBzdWJkZXYgdG8gdGhlIHZpZGVvIG5vZGUuICovCiAJcmV0ID0gbWVkaWFfZW50aXR5X2NyZWF0ZV9saW5rKCZjY2RjLT5zdWJkZXYuZW50aXR5LCBDQ0RDX1BBRF9TT1VSQ0VfT0YsCiAJCQkmY2NkYy0+dmlkZW9fb3V0LnZpZGVvLmVudGl0eSwgMCwgMCk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBvbWFwM2lzcF9jY2RjX3VucmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jY2RjX2RldmljZSAqY2NkYykKLXsKLQltZWRpYV9lbnRpdHlfY2xlYW51cCgmY2NkYy0+c3ViZGV2LmVudGl0eSk7Ci0KLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmY2NkYy0+c3ViZGV2KTsKLQlvbWFwM2lzcF92aWRlb191bnJlZ2lzdGVyKCZjY2RjLT52aWRlb19vdXQpOwotfQotCi1pbnQgb21hcDNpc3BfY2NkY19yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX2NjZGNfZGV2aWNlICpjY2RjLAotCXN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKLXsKLQlpbnQgcmV0OwotCi0JLyogUmVnaXN0ZXIgdGhlIHN1YmRldiBhbmQgdmlkZW8gbm9kZS4gKi8KLQlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJmNjZGMtPnN1YmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmY2NkYy0+dmlkZW9fb3V0LCB2ZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKKwkJZ290byBlcnJvcl9saW5rOwogCiAJcmV0dXJuIDA7CiAKLWVycm9yOgotCW9tYXAzaXNwX2NjZGNfdW5yZWdpc3Rlcl9lbnRpdGllcyhjY2RjKTsKK2Vycm9yX2xpbms6CisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmY2NkYy0+dmlkZW9fb3V0KTsKK2Vycm9yX3ZpZGVvOgorCW1lZGlhX2VudGl0eV9jbGVhbnVwKG1lKTsKIAlyZXR1cm4gcmV0OwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogSVNQIENDREMgaW5pdGlhbGlzYXRpb24gYW5kIGNsZWFudXAKLSAqLwotCiAvKgogICogb21hcDNpc3BfY2NkY19pbml0IC0gQ0NEQyBtb2R1bGUgaW5pdGlhbGl6YXRpb24uCiAgKiBAZGV2OiBEZXZpY2UgcG9pbnRlciBzcGVjaWZpYyB0byB0aGUgT01BUDMgSVNQLgpAQCAtMjI0MCw2ICsyMjUyLDcgQEAKIGludCBvbWFwM2lzcF9jY2RjX2luaXQoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKIHsKIAlzdHJ1Y3QgaXNwX2NjZGNfZGV2aWNlICpjY2RjID0gJmlzcC0+aXNwX2NjZGM7CisJaW50IHJldDsKIAogCXNwaW5fbG9ja19pbml0KCZjY2RjLT5sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjY2RjLT53YWl0KTsKQEAgLTIyNjgsNyArMjI4MSwxMyBAQAogCWNjZGMtPnVwZGF0ZSA9IE9NQVAzSVNQX0NDRENfQkxDTEFNUDsKIAljY2RjX2FwcGx5X2NvbnRyb2xzKGNjZGMpOwogCi0JcmV0dXJuIGNjZGNfaW5pdF9lbnRpdGllcyhjY2RjKTsKKwlyZXQgPSBjY2RjX2luaXRfZW50aXRpZXMoY2NkYyk7CisJaWYgKHJldCA8IDApIHsKKwkJbXV0ZXhfZGVzdHJveSgmY2NkYy0+aW9jdGxfbG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yMjc5LDYgKzIyOTgsOSBAQAogewogCXN0cnVjdCBpc3BfY2NkY19kZXZpY2UgKmNjZGMgPSAmaXNwLT5pc3BfY2NkYzsKIAorCW9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoJmNjZGMtPnZpZGVvX291dCk7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJmNjZGMtPnN1YmRldi5lbnRpdHkpOworCiAJLyogRnJlZSBMU0MgcmVxdWVzdHMuIEFzIHRoZSBDQ0RDIGlzIHN0b3BwZWQgdGhlcmUncyBubyBhY3RpdmUgcmVxdWVzdCwKIAkgKiBzbyBvbmx5IHRoZSBwZW5kaW5nIHJlcXVlc3QgYW5kIHRoZSBmcmVlIHF1ZXVlIG5lZWQgdG8gYmUgaGFuZGxlZC4KIAkgKi8KQEAgLTIyODcsNSArMjMwOSw3IEBACiAJY2NkY19sc2NfZnJlZV9xdWV1ZShjY2RjLCAmY2NkYy0+bHNjLmZyZWVfcXVldWUpOwogCiAJaWYgKGNjZGMtPmZwYy5mcGNhZGRyICE9IDApCi0JCWlvbW11X3ZmcmVlKGlzcC0+aW9tbXUsIGNjZGMtPmZwYy5mcGNhZGRyKTsKKwkJb21hcF9pb21tdV92ZnJlZShpc3AtPmRvbWFpbiwgaXNwLT5pb21tdSwgY2NkYy0+ZnBjLmZwY2FkZHIpOworCisJbXV0ZXhfZGVzdHJveSgmY2NkYy0+aW9jdGxfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NwMi5jCmluZGV4IGVjOWUzOTUuLjkwNGNhOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NwMi5jCkBAIC0yNDMsOSArMjQzLDkgQEAKIAogCXZhbCA9IGlzcF9yZWdfcmVhZGwoaXNwLCBPTUFQM19JU1BfSU9NRU1fQ0NQMiwgSVNQQ0NQMl9DVFJMKTsKIAlpZiAoISh2YWwgJiBJU1BDQ1AyX0NUUkxfTU9ERSkpIHsKLQkJaWYgKHBkYXRhLT5jY3AyX21vZGUpCisJCWlmIChwZGF0YS0+Y2NwMl9tb2RlID09IElTUF9DQ1AyX01PREVfQ0NQMikKIAkJCWRldl93YXJuKGlzcC0+ZGV2LCAiT01BUDMgQ0NQMiBidXMgbm90IGF2YWlsYWJsZVxuIik7Ci0JCWlmIChwZGF0YS0+cGh5X2xheWVyID09IElTUENDUDJfQ1RSTF9QSFlfU0VMX1NUUk9CRSkKKwkJaWYgKHBkYXRhLT5waHlfbGF5ZXIgPT0gSVNQX0NDUDJfUEhZX0RBVEFfU1RST0JFKQogCQkJLyogU3Ryb2JlIG1vZGUgcmVxdWlyZXMgQ0NQMiAqLwogCQkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTAzMiw2ICsxMDMyLDQ4IEBACiB9OwogCiAvKgorICogb21hcDNpc3BfY2NwMl91bnJlZ2lzdGVyX2VudGl0aWVzIC0gVW5yZWdpc3RlciBtZWRpYSBlbnRpdGllczogc3ViZGV2CisgKiBAY2NwMjogUG9pbnRlciB0byBJU1AgQ0NQMiBkZXZpY2UKKyAqLwordm9pZCBvbWFwM2lzcF9jY3AyX3VucmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jY3AyX2RldmljZSAqY2NwMikKK3sKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmY2NwMi0+c3ViZGV2KTsKKwlvbWFwM2lzcF92aWRlb191bnJlZ2lzdGVyKCZjY3AyLT52aWRlb19pbik7Cit9CisKKy8qCisgKiBvbWFwM2lzcF9jY3AyX3JlZ2lzdGVyX2VudGl0aWVzIC0gUmVnaXN0ZXIgdGhlIHN1YmRldiBtZWRpYSBlbnRpdHkKKyAqIEBjY3AyOiBQb2ludGVyIHRvIElTUCBDQ1AyIGRldmljZQorICogQHZkZXY6IFBvaW50ZXIgdG8gdjRsIGRldmljZQorICogcmV0dXJuIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVybyBvbiBzdWNjZXNzCisgKi8KKworaW50IG9tYXAzaXNwX2NjcDJfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jY3AyX2RldmljZSAqY2NwMiwKKwkJCQkgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2Rlcy4gKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJmNjcDItPnN1YmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmY2NwMi0+dmlkZW9faW4sIHZkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCW9tYXAzaXNwX2NjcDJfdW5yZWdpc3Rlcl9lbnRpdGllcyhjY3AyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSVNQIGNjcDIgaW5pdGlhbGlzYXRpb24gYW5kIGNsZWFudXAKKyAqLworCisvKgogICogY2NwMl9pbml0X2VudGl0aWVzIC0gSW5pdGlhbGl6ZSBjY3AyIHN1YmRldiBhbmQgbWVkaWEgZW50aXR5LgogICogQGNjcDI6IFBvaW50ZXIgdG8gSVNQIENDUDIgZGV2aWNlCiAgKiByZXR1cm4gbmVnYXRpdmUgZXJyb3IgY29kZSBvciB6ZXJvIG9uIHN1Y2Nlc3MKQEAgLTEwODMsNzIgKzExMjUsMjMgQEAKIAogCXJldCA9IG9tYXAzaXNwX3ZpZGVvX2luaXQoJmNjcDItPnZpZGVvX2luLCAiQ0NQMiIpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX3ZpZGVvOwogCiAJLyogQ29ubmVjdCB0aGUgdmlkZW8gbm9kZSB0byB0aGUgY2NwMiBzdWJkZXYuICovCiAJcmV0ID0gbWVkaWFfZW50aXR5X2NyZWF0ZV9saW5rKCZjY3AyLT52aWRlb19pbi52aWRlby5lbnRpdHksIDAsCiAJCQkJICAgICAgICZjY3AyLT5zdWJkZXYuZW50aXR5LCBDQ1AyX1BBRF9TSU5LLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl9saW5rOwogCiAJcmV0dXJuIDA7Ci19CiAKLS8qCi0gKiBvbWFwM2lzcF9jY3AyX3VucmVnaXN0ZXJfZW50aXRpZXMgLSBVbnJlZ2lzdGVyIG1lZGlhIGVudGl0aWVzOiBzdWJkZXYKLSAqIEBjY3AyOiBQb2ludGVyIHRvIElTUCBDQ1AyIGRldmljZQotICovCi12b2lkIG9tYXAzaXNwX2NjcDJfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX2NjcDJfZGV2aWNlICpjY3AyKQoteworZXJyb3JfbGluazoKKwlvbWFwM2lzcF92aWRlb19jbGVhbnVwKCZjY3AyLT52aWRlb19pbik7CitlcnJvcl92aWRlbzoKIAltZWRpYV9lbnRpdHlfY2xlYW51cCgmY2NwMi0+c3ViZGV2LmVudGl0eSk7Ci0KLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmY2NwMi0+c3ViZGV2KTsKLQlvbWFwM2lzcF92aWRlb191bnJlZ2lzdGVyKCZjY3AyLT52aWRlb19pbik7Ci19Ci0KLS8qCi0gKiBvbWFwM2lzcF9jY3AyX3JlZ2lzdGVyX2VudGl0aWVzIC0gUmVnaXN0ZXIgdGhlIHN1YmRldiBtZWRpYSBlbnRpdHkKLSAqIEBjY3AyOiBQb2ludGVyIHRvIElTUCBDQ1AyIGRldmljZQotICogQHZkZXY6IFBvaW50ZXIgdG8gdjRsIGRldmljZQotICogcmV0dXJuIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVybyBvbiBzdWNjZXNzCi0gKi8KLQotaW50IG9tYXAzaXNwX2NjcDJfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jY3AyX2RldmljZSAqY2NwMiwKLQkJCQkgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQotewotCWludCByZXQ7Ci0KLQkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2Rlcy4gKi8KLQlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJmNjcDItPnN1YmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmY2NwMi0+dmlkZW9faW4sIHZkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yOgotCW9tYXAzaXNwX2NjcDJfdW5yZWdpc3Rlcl9lbnRpdGllcyhjY3AyKTsKIAlyZXR1cm4gcmV0OwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogSVNQIGNjcDIgaW5pdGlhbGlzYXRpb24gYW5kIGNsZWFudXAKLSAqLwotCi0vKgotICogb21hcDNpc3BfY2NwMl9jbGVhbnVwIC0gQ0NQMiB1bi1pbml0aWFsaXphdGlvbgotICogQGlzcCA6IFBvaW50ZXIgdG8gSVNQIGRldmljZQotICovCi12b2lkIG9tYXAzaXNwX2NjcDJfY2xlYW51cChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwKQotewotCXN0cnVjdCBpc3BfY2NwMl9kZXZpY2UgKmNjcDIgPSAmaXNwLT5pc3BfY2NwMjsKLQotCXJlZ3VsYXRvcl9wdXQoY2NwMi0+dmRkc19jc2liKTsKLX0KLQogLyoKICAqIG9tYXAzaXNwX2NjcDJfaW5pdCAtIENDUDIgaW5pdGlhbGl6YXRpb24uCiAgKiBAaXNwIDogUG9pbnRlciB0byBJU1AgZGV2aWNlCkBAIC0xMTg0LDEzICsxMTc3LDI1IEBACiAJfQogCiAJcmV0ID0gY2NwMl9pbml0X2VudGl0aWVzKGNjcDIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKKwlpZiAocmV0IDwgMCkgeworCQlyZWd1bGF0b3JfcHV0KGNjcDItPnZkZHNfY3NpYik7CisJCXJldHVybiByZXQ7CisJfQogCiAJY2NwMl9yZXNldChjY3AyKTsKLW91dDoKLQlpZiAocmV0KQotCQlvbWFwM2lzcF9jY3AyX2NsZWFudXAoaXNwKTsKKwlyZXR1cm4gMDsKK30KIAotCXJldHVybiByZXQ7CisvKgorICogb21hcDNpc3BfY2NwMl9jbGVhbnVwIC0gQ0NQMiB1bi1pbml0aWFsaXphdGlvbgorICogQGlzcCA6IFBvaW50ZXIgdG8gSVNQIGRldmljZQorICovCit2b2lkIG9tYXAzaXNwX2NjcDJfY2xlYW51cChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwKQoreworCXN0cnVjdCBpc3BfY2NwMl9kZXZpY2UgKmNjcDIgPSAmaXNwLT5pc3BfY2NwMjsKKworCW9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoJmNjcDItPnZpZGVvX2luKTsKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmY2NwMi0+c3ViZGV2LmVudGl0eSk7CisKKwlyZWd1bGF0b3JfcHV0KGNjcDItPnZkZHNfY3NpYik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNzaTIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY3NpMi5jCmluZGV4IDY5MTYxYTYuLjBjNWYxY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY3NpMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY3NpMi5jCkBAIC0xMTg3LDYgKzExODcsMzcgQEAKIAkubGlua19zZXR1cCA9IGNzaTJfbGlua19zZXR1cCwKIH07CiAKK3ZvaWQgb21hcDNpc3BfY3NpMl91bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfY3NpMl9kZXZpY2UgKmNzaTIpCit7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJmNzaTItPnN1YmRldik7CisJb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmY3NpMi0+dmlkZW9fb3V0KTsKK30KKworaW50IG9tYXAzaXNwX2NzaTJfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jc2kyX2RldmljZSAqY3NpMiwKKwkJCQkgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2Rlcy4gKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJmNzaTItPnN1YmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmY3NpMi0+dmlkZW9fb3V0LCB2ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlvbWFwM2lzcF9jc2kyX3VucmVnaXN0ZXJfZW50aXRpZXMoY3NpMik7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElTUCBDU0kyIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwCisgKi8KKwogLyoKICAqIGNzaTJfaW5pdF9lbnRpdGllcyAtIEluaXRpYWxpemUgc3ViZGV2IGFuZCBtZWRpYSBlbnRpdHkuCiAgKiBAY3NpMjogUG9pbnRlciB0byBjc2kyIHN0cnVjdHVyZS4KQEAgLTEyMjgsNTcgKzEyNTksMjMgQEAKIAogCXJldCA9IG9tYXAzaXNwX3ZpZGVvX2luaXQoJmNzaTItPnZpZGVvX291dCwgIkNTSTJhIik7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfdmlkZW87CiAKIAkvKiBDb25uZWN0IHRoZSBDU0kyIHN1YmRldiB0byB0aGUgdmlkZW8gbm9kZS4gKi8KIAlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoJmNzaTItPnN1YmRldi5lbnRpdHksIENTSTJfUEFEX1NPVVJDRSwKIAkJCQkgICAgICAgJmNzaTItPnZpZGVvX291dC52aWRlby5lbnRpdHksIDAsIDApOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX2xpbms7CiAKIAlyZXR1cm4gMDsKLX0KIAotdm9pZCBvbWFwM2lzcF9jc2kyX3VucmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jc2kyX2RldmljZSAqY3NpMikKLXsKK2Vycm9yX2xpbms6CisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmY3NpMi0+dmlkZW9fb3V0KTsKK2Vycm9yX3ZpZGVvOgogCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZjc2kyLT5zdWJkZXYuZW50aXR5KTsKLQotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZjc2kyLT5zdWJkZXYpOwotCW9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoJmNzaTItPnZpZGVvX291dCk7Ci19Ci0KLWludCBvbWFwM2lzcF9jc2kyX3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfY3NpMl9kZXZpY2UgKmNzaTIsCi0JCQkJICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKLXsKLQlpbnQgcmV0OwotCi0JLyogUmVnaXN0ZXIgdGhlIHN1YmRldiBhbmQgdmlkZW8gbm9kZXMuICovCi0JcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZjc2kyLT5zdWJkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoJmNzaTItPnZpZGVvX291dCwgdmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0Jb21hcDNpc3BfY3NpMl91bnJlZ2lzdGVyX2VudGl0aWVzKGNzaTIpOwogCXJldHVybiByZXQ7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBJU1AgQ1NJMiBpbml0aWFsaXNhdGlvbiBhbmQgY2xlYW51cAotICovCi0KLS8qCi0gKiBvbWFwM2lzcF9jc2kyX2NsZWFudXAgLSBSb3V0aW5lIGZvciBtb2R1bGUgZHJpdmVyIGNsZWFudXAKLSAqLwotdm9pZCBvbWFwM2lzcF9jc2kyX2NsZWFudXAoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKLXsKLX0KLQogLyoKICAqIG9tYXAzaXNwX2NzaTJfaW5pdCAtIFJvdXRpbmUgZm9yIG1vZHVsZSBkcml2ZXIgaW5pdAogICovCkBAIC0xMjk4LDcgKzEyOTUsNyBAQAogCiAJcmV0ID0gY3NpMl9pbml0X2VudGl0aWVzKGNzaTJhKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBmYWlsOworCQlyZXR1cm4gcmV0OwogCiAJaWYgKGlzcC0+cmV2aXNpb24gPT0gSVNQX1JFVklTSU9OXzE1XzApIHsKIAkJY3NpMmMtPmlzcCA9IGlzcDsKQEAgLTEzMTEsNyArMTMwOCwxNSBAQAogCX0KIAogCXJldHVybiAwOwotZmFpbDoKLQlvbWFwM2lzcF9jc2kyX2NsZWFudXAoaXNwKTsKLQlyZXR1cm4gcmV0OworfQorCisvKgorICogb21hcDNpc3BfY3NpMl9jbGVhbnVwIC0gUm91dGluZSBmb3IgbW9kdWxlIGRyaXZlciBjbGVhbnVwCisgKi8KK3ZvaWQgb21hcDNpc3BfY3NpMl9jbGVhbnVwKHN0cnVjdCBpc3BfZGV2aWNlICppc3ApCit7CisJc3RydWN0IGlzcF9jc2kyX2RldmljZSAqY3NpMmEgPSAmaXNwLT5pc3BfY3NpMmE7CisKKwlvbWFwM2lzcF92aWRlb19jbGVhbnVwKCZjc2kyYS0+dmlkZW9fb3V0KTsKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmY3NpMmEtPnN1YmRldi5lbnRpdHkpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BoM2FfYWV3Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BoM2FfYWV3Yi5jCmluZGV4IDgwNjhjZWYuLmEzYzc2YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwaDNhX2Fld2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGgzYV9hZXdiLmMKQEAgLTM3MCw1ICszNzAsNSBAQAogewogCWtmcmVlKGlzcC0+aXNwX2Fld2IucHJpdik7CiAJa2ZyZWUoaXNwLT5pc3BfYWV3Yi5yZWNvdmVyX3ByaXYpOwotCW9tYXAzaXNwX3N0YXRfZnJlZSgmaXNwLT5pc3BfYWV3Yik7CisJb21hcDNpc3Bfc3RhdF9jbGVhbnVwKCZpc3AtPmlzcF9hZXdiKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwaDNhX2FmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGgzYV9hZi5jCmluZGV4IGJhNTRkMGEuLjU4ZTBiYzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGgzYV9hZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwaDNhX2FmLmMKQEAgLTQyNSw1ICs0MjUsNSBAQAogewogCWtmcmVlKGlzcC0+aXNwX2FmLnByaXYpOwogCWtmcmVlKGlzcC0+aXNwX2FmLnJlY292ZXJfcHJpdik7Ci0Jb21hcDNpc3Bfc3RhdF9mcmVlKCZpc3AtPmlzcF9hZik7CisJb21hcDNpc3Bfc3RhdF9jbGVhbnVwKCZpc3AtPmlzcF9hZik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGhpc3QuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwaGlzdC5jCmluZGV4IDE3NDM4NTYuLjExNjM5MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwaGlzdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwaGlzdC5jCkBAIC01MTYsNSArNTE2LDUgQEAKIAlpZiAoSElTVF9VU0lOR19ETUEoJmlzcC0+aXNwX2hpc3QpKQogCQlvbWFwX2ZyZWVfZG1hKGlzcC0+aXNwX2hpc3QuZG1hX2NoKTsKIAlrZnJlZShpc3AtPmlzcF9oaXN0LnByaXYpOwotCW9tYXAzaXNwX3N0YXRfZnJlZSgmaXNwLT5pc3BfaGlzdCk7CisJb21hcDNpc3Bfc3RhdF9jbGVhbnVwKCZpc3AtPmlzcF9oaXN0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcHJldmlldy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BwcmV2aWV3LmMKaW5kZXggYWJhNTM3YS4uY2NiODc2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BwcmV2aWV3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BwcmV2aWV3LmMKQEAgLTc2LDkgKzc2LDUxIEBACiAKICNkZWZpbmUgREVGX0RFVEVDVF9DT1JSRUNUX1ZBTAkweGUKIAotI2RlZmluZSBQUkVWX01JTl9XSURUSAkJNjQKLSNkZWZpbmUgUFJFVl9NSU5fSEVJR0hUCQk4Ci0jZGVmaW5lIFBSRVZfTUFYX0hFSUdIVAkJMTYzODQKKy8qCisgKiBNYXJnaW5zIGFuZCBpbWFnZSBzaXplIGxpbWl0cy4KKyAqCisgKiBUaGUgcHJldmlldyBlbmdpbmUgY3JvcHMgc2V2ZXJhbCByb3dzIGFuZCBjb2x1bW5zIGludGVybmFsbHkgZGVwZW5kaW5nIG9uCisgKiB3aGljaCBmaWx0ZXJzIGFyZSBlbmFibGVkLiBUbyBhdm9pZCBmb3JtYXQgY2hhbmdlcyB3aGVuIHRoZSBmaWx0ZXJzIGFyZQorICogZW5hYmxlZCBvciBkaXNhYmxlZCAod2hpY2ggd291bGQgcHJldmVudCB0aGVtIGZyb20gYmVpbmcgdHVybmVkIG9uIG9yIG9mZgorICogZHVyaW5nIHN0cmVhbWluZyksIHRoZSBkcml2ZXIgYXNzdW1lcyBhbGwgdGhlIGZpbHRlcnMgYXJlIGVuYWJsZWQgd2hlbgorICogY29tcHV0aW5nIHNpbmsgY3JvcCBhbmQgc291cmNlIGZvcm1hdCBsaW1pdHMuCisgKgorICogSWYgYSBmaWx0ZXIgaXMgZGlzYWJsZWQsIGFkZGl0aW9uYWwgY3JvcHBpbmcgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhdCB0aGUKKyAqIHByZXZpZXcgZW5naW5lIGlucHV0IGJ5IHRoZSBkcml2ZXIgdG8gYXZvaWQgb3ZlcmZsb3cgYXQgbGluZSBhbmQgZnJhbWUgZW5kLgorICogVGhpcyBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IGZvciBhcHBsaWNhdGlvbnMuCisgKgorICogTWVkaWFuIGZpbHRlcgkJNCBwaXhlbHMKKyAqIE5vaXNlIGZpbHRlciwKKyAqIEZhdWx0eSBwaXhlbHMgY29ycmVjdGlvbgk0IHBpeGVscywgNCBsaW5lcworICogQ0ZBIGZpbHRlcgkJCTQgcGl4ZWxzLCA0IGxpbmVzIGluIEJheWVyIG1vZGUKKyAqCQkJCQkgIDIgbGluZXMgaW4gb3RoZXIgbW9kZXMKKyAqIENvbG9yIHN1cHByZXNzaW9uCQkyIHBpeGVscworICogb3IgbHVtYSBlbmhhbmNlbWVudAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWF4aW11bSB0b3RhbAkJMTQgcGl4ZWxzLCA4IGxpbmVzCisgKgorICogVGhlIGNvbG9yIHN1cHByZXNzaW9uIGFuZCBsdW1hIGVuaGFuY2VtZW50IGZpbHRlcnMgYXJlIGFwcGxpZWQgYWZ0ZXIgYmF5ZXIgdG8KKyAqIFlVViBjb252ZXJzaW9uLiBUaGV5IHRodXMgY2FuIGNyb3Agb25lIHBpeGVsIG9uIHRoZSBsZWZ0IGFuZCBvbmUgcGl4ZWwgb24gdGhlCisgKiByaWdodCBzaWRlIG9mIHRoZSBpbWFnZSB3aXRob3V0IGNoYW5naW5nIHRoZSBjb2xvciBwYXR0ZXJuLiBXaGVuIGJvdGggdGhvc2UKKyAqIGZpbHRlcnMgYXJlIGRpc2FibGVkLCB0aGUgZHJpdmVyIG11c3QgY3JvcCB0aGUgdHdvIHBpeGVscyBvbiB0aGUgc2FtZSBzaWRlIG9mCisgKiB0aGUgaW1hZ2UgdG8gYXZvaWQgY2hhbmdpbmcgdGhlIGJheWVyIHBhdHRlcm4uIFRoZSBsZWZ0IG1hcmdpbiBpcyB0aHVzIHNldCB0bworICogOCBwaXhlbHMgYW5kIHRoZSByaWdodCBtYXJnaW4gdG8gNiBwaXhlbHMuCisgKi8KKworI2RlZmluZSBQUkVWX01BUkdJTl9MRUZUCTgKKyNkZWZpbmUgUFJFVl9NQVJHSU5fUklHSFQJNgorI2RlZmluZSBQUkVWX01BUkdJTl9UT1AJCTQKKyNkZWZpbmUgUFJFVl9NQVJHSU5fQk9UVE9NCTQKKworI2RlZmluZSBQUkVWX01JTl9JTl9XSURUSAk2NAorI2RlZmluZSBQUkVWX01JTl9JTl9IRUlHSFQJOAorI2RlZmluZSBQUkVWX01BWF9JTl9IRUlHSFQJMTYzODQKKworI2RlZmluZSBQUkVWX01JTl9PVVRfV0lEVEgJMAorI2RlZmluZSBQUkVWX01JTl9PVVRfSEVJR0hUCTAKKyNkZWZpbmUgUFJFVl9NQVhfT1VUX1dJRFRICTEyODAKKyNkZWZpbmUgUFJFVl9NQVhfT1VUX1dJRFRIX0VTMgkzMzAwCisjZGVmaW5lIFBSRVZfTUFYX09VVF9XSURUSF8zNjMwCTQwOTYKIAogLyoKICAqIENvZWZpY2llbnQgVGFibGVzIGZvciB0aGUgc3VibW9kdWxlcyBpbiBQcmV2aWV3LgpAQCAtOTc5LDUyICsxMDIxLDM2IEBACiAgKiBlbmFibGVkIHdoZW4gcmVwb3J0aW5nIHNvdXJjZSBwYWQgZm9ybWF0cyB0byB1c2Vyc3BhY2UuIElmIHRoaXMgYXNzdW1wdGlvbiBpcwogICogbm90IHRydWUsIHJvd3MgYW5kIGNvbHVtbnMgbXVzdCBiZSBtYW51YWxseSBjcm9wcGVkIGF0IHRoZSBwcmV2aWV3IGVuZ2luZQogICogaW5wdXQgdG8gYXZvaWQgb3ZlcmZsb3dzIGF0IHRoZSBlbmQgb2YgbGluZXMgYW5kIGZyYW1lcy4KKyAqCisgKiBTZWUgdGhlIGV4cGxhbmF0aW9uIGF0IHRoZSBQUkVWX01BUkdJTl8qIGRlZmluaXRpb25zIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIHN0YXRpYyB2b2lkIHByZXZpZXdfY29uZmlnX2lucHV0X3NpemUoc3RydWN0IGlzcF9wcmV2X2RldmljZSAqcHJldikKIHsKIAlzdHJ1Y3QgaXNwX2RldmljZSAqaXNwID0gdG9faXNwX2RldmljZShwcmV2KTsKIAlzdHJ1Y3QgcHJldl9wYXJhbXMgKnBhcmFtcyA9ICZwcmV2LT5wYXJhbXM7Ci0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0ID0gJnByZXYtPmZvcm1hdHNbUFJFVl9QQURfU0lOS107Ci0JdW5zaWduZWQgaW50IHNwaCA9IDA7Ci0JdW5zaWduZWQgaW50IGVwaCA9IGZvcm1hdC0+d2lkdGggLSAxOwotCXVuc2lnbmVkIGludCBzbHYgPSAwOwotCXVuc2lnbmVkIGludCBlbHYgPSBmb3JtYXQtPmhlaWdodCAtIDE7CisJdW5zaWduZWQgaW50IHNwaCA9IHByZXYtPmNyb3AubGVmdDsKKwl1bnNpZ25lZCBpbnQgZXBoID0gcHJldi0+Y3JvcC5sZWZ0ICsgcHJldi0+Y3JvcC53aWR0aCAtIDE7CisJdW5zaWduZWQgaW50IHNsdiA9IHByZXYtPmNyb3AudG9wOworCXVuc2lnbmVkIGludCBlbHYgPSBwcmV2LT5jcm9wLnRvcCArIHByZXYtPmNyb3AuaGVpZ2h0IC0gMTsKIAotCWlmIChwcmV2LT5pbnB1dCA9PSBQUkVWSUVXX0lOUFVUX0NDREMpIHsKLQkJc3BoICs9IDI7Ci0JCWVwaCAtPSAyOworCWlmIChwYXJhbXMtPmZlYXR1cmVzICYgUFJFVl9DRkEpIHsKKwkJc3BoIC09IDI7CisJCWVwaCArPSAyOworCQlzbHYgLT0gMjsKKwkJZWx2ICs9IDI7CiAJfQotCi0JLyoKLQkgKiBNZWRpYW4gZmlsdGVyCTQgcGl4ZWxzCi0JICogTm9pc2UgZmlsdGVyCQk0IHBpeGVscywgNCBsaW5lcwotCSAqIG9yIGZhdWx0eSBwaXhlbHMgY29ycmVjdGlvbgotCSAqIENGQSBmaWx0ZXIJCTQgcGl4ZWxzLCA0IGxpbmVzIGluIEJheWVyIG1vZGUKLQkgKgkJCQkgIDIgbGluZXMgaW4gb3RoZXIgbW9kZXMKLQkgKiBDb2xvciBzdXBwcmVzc2lvbgkyIHBpeGVscwotCSAqIG9yIGx1bWEgZW5oYW5jZW1lbnQKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogTWF4aW11bSB0b3RhbAkxNCBwaXhlbHMsIDggbGluZXMKLQkgKi8KLQotCWlmICghKHBhcmFtcy0+ZmVhdHVyZXMgJiBQUkVWX0NGQSkpIHsKLQkJc3BoICs9IDI7Ci0JCWVwaCAtPSAyOwotCQlzbHYgKz0gMjsKLQkJZWx2IC09IDI7CisJaWYgKHBhcmFtcy0+ZmVhdHVyZXMgJiAoUFJFVl9ERUZFQ1RfQ09SIHwgUFJFVl9OT0lTRV9GSUxURVIpKSB7CisJCXNwaCAtPSAyOworCQllcGggKz0gMjsKKwkJc2x2IC09IDI7CisJCWVsdiArPSAyOwogCX0KLQlpZiAoIShwYXJhbXMtPmZlYXR1cmVzICYgKFBSRVZfREVGRUNUX0NPUiB8IFBSRVZfTk9JU0VfRklMVEVSKSkpIHsKLQkJc3BoICs9IDI7Ci0JCWVwaCAtPSAyOwotCQlzbHYgKz0gMjsKLQkJZWx2IC09IDI7CisJaWYgKHBhcmFtcy0+ZmVhdHVyZXMgJiBQUkVWX0hPUlpfTUVESUFOX0ZJTFRFUikgeworCQlzcGggLT0gMjsKKwkJZXBoICs9IDI7CiAJfQotCWlmICghKHBhcmFtcy0+ZmVhdHVyZXMgJiBQUkVWX0hPUlpfTUVESUFOX0ZJTFRFUikpIHsKLQkJc3BoICs9IDI7Ci0JCWVwaCAtPSAyOwotCX0KLQlpZiAoIShwYXJhbXMtPmZlYXR1cmVzICYgKFBSRVZfQ0hST01BX1NVUFBSRVNTIHwgUFJFVl9MVU1BX0VOSEFOQ0UpKSkKLQkJc3BoICs9IDI7CisJaWYgKHBhcmFtcy0+ZmVhdHVyZXMgJiAoUFJFVl9DSFJPTUFfU1VQUFJFU1MgfCBQUkVWX0xVTUFfRU5IQU5DRSkpCisJCXNwaCAtPSAyOwogCiAJaXNwX3JlZ193cml0ZWwoaXNwLCAoc3BoIDw8IElTUFBSVl9IT1JaX0lORk9fU1BIX1NISUZUKSB8IGVwaCwKIAkJICAgICAgIE9NQVAzX0lTUF9JT01FTV9QUkVWLCBJU1BQUlZfSE9SWl9JTkZPKTsKQEAgLTEyMjgsNyArMTI1NCw2IEBACiAJLyogSW5pdCB2YWx1ZXMgKi8KIAlwYXJhbXMtPmNvbnRyYXN0ID0gSVNQUFJWX0NPTlRSQVNUX0RFRiAqIElTUFBSVl9DT05UUkFTVF9VTklUUzsKIAlwYXJhbXMtPmJyaWdodG5lc3MgPSBJU1BQUlZfQlJJR0hUX0RFRiAqIElTUFBSVl9CUklHSFRfVU5JVFM7Ci0JcGFyYW1zLT5hdmVyYWdlID0gTk9fQVZFOwogCXBhcmFtcy0+Y2ZhLmZvcm1hdCA9IE9NQVAzSVNQX0NGQUZNVF9CQVlFUjsKIAltZW1jcHkocGFyYW1zLT5jZmEudGFibGUsIGNmYV9jb2VmX3RhYmxlLAogCSAgICAgICBzaXplb2YocGFyYW1zLT5jZmEudGFibGUpKTsKQEAgLTEyODEsMTQgKzEzMDYsMTQgQEAKIAogCXN3aXRjaCAoaXNwLT5yZXZpc2lvbikgewogCWNhc2UgSVNQX1JFVklTSU9OXzFfMDoKLQkJcmV0dXJuIElTUFBSVl9NQVhPVVRQVVRfV0lEVEg7CisJCXJldHVybiBQUkVWX01BWF9PVVRfV0lEVEg7CiAKIAljYXNlIElTUF9SRVZJU0lPTl8yXzA6CiAJZGVmYXVsdDoKLQkJcmV0dXJuIElTUFBSVl9NQVhPVVRQVVRfV0lEVEhfRVMyOworCQlyZXR1cm4gUFJFVl9NQVhfT1VUX1dJRFRIX0VTMjsKIAogCWNhc2UgSVNQX1JFVklTSU9OXzE1XzA6Ci0JCXJldHVybiBJU1BQUlZfTUFYT1VUUFVUX1dJRFRIXzM2MzA7CisJCXJldHVybiBQUkVWX01BWF9PVVRfV0lEVEhfMzYzMDsKIAl9CiB9CiAKQEAgLTEyOTYsOCArMTMyMSw2IEBACiB7CiAJc3RydWN0IGlzcF9kZXZpY2UgKmlzcCA9IHRvX2lzcF9kZXZpY2UocHJldik7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OwotCXVuc2lnbmVkIGludCBtYXhfb3V0X3dpZHRoOwotCXVuc2lnbmVkIGludCBmb3JtYXRfYXZnOwogCiAJcHJldmlld19zZXR1cF9odyhwcmV2KTsKIApAQCAtMTMzNSwxMCArMTM1OCw3IEBACiAJCXByZXZpZXdfY29uZmlnX291dGxpbmVvZmZzZXQocHJldiwKIAkJCQlBTElHTihmb3JtYXQtPndpZHRoLCAweDEwKSAqIDIpOwogCi0JbWF4X291dF93aWR0aCA9IHByZXZpZXdfbWF4X291dF93aWR0aChwcmV2KTsKLQotCWZvcm1hdF9hdmcgPSBmbHMoRElWX1JPVU5EX1VQKGZvcm1hdC0+d2lkdGgsIG1heF9vdXRfd2lkdGgpIC0gMSk7Ci0JcHJldmlld19jb25maWdfYXZlcmFnZXIocHJldiwgZm9ybWF0X2F2Zyk7CisJcHJldmlld19jb25maWdfYXZlcmFnZXIocHJldiwgMCk7CiAJcHJldmlld19jb25maWdfeWNwb3MocHJldiwgZm9ybWF0LT5jb2RlKTsKIH0KIApAQCAtMTU5Nyw2ICsxNjE3LDE2IEBACiAJCXJldHVybiAmcHJldi0+Zm9ybWF0c1twYWRdOwogfQogCitzdGF0aWMgc3RydWN0IHY0bDJfcmVjdCAqCitfX3ByZXZpZXdfZ2V0X2Nyb3Aoc3RydWN0IGlzcF9wcmV2X2RldmljZSAqcHJldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJICAgZW51bSB2NGwyX3N1YmRldl9mb3JtYXRfd2hlbmNlIHdoaWNoKQoreworCWlmICh3aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKQorCQlyZXR1cm4gdjRsMl9zdWJkZXZfZ2V0X3RyeV9jcm9wKGZoLCBQUkVWX1BBRF9TSU5LKTsKKwllbHNlCisJCXJldHVybiAmcHJldi0+Y3JvcDsKK30KKwogLyogcHJldmlld2VyIGZvcm1hdCBkZXNjcmlwdGlvbnMgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHJldmlld19pbnB1dF9mbXRzW10gPSB7CiAJVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTAsCkBAIC0xNjExLDI0ICsxNjQxLDI1IEBACiB9OwogCiAvKgotICogcHJldmlld190cnlfZm9ybWF0IC0gSGFuZGxlIHRyeSBmb3JtYXQgYnkgcGFkIHN1YmRldiBtZXRob2QKLSAqIEBwcmV2OiBJU1AgcHJldmlldyBkZXZpY2UKLSAqIEBmaCA6IFY0TDIgc3ViZGV2IGZpbGUgaGFuZGxlCi0gKiBAcGFkOiBwYWQgbnVtCi0gKiBAZm10OiBwb2ludGVyIHRvIHY0bDIgZm9ybWF0IHN0cnVjdHVyZQorICogcHJldmlld190cnlfZm9ybWF0IC0gVmFsaWRhdGUgYSBmb3JtYXQKKyAqIEBwcmV2OiBJU1AgcHJldmlldyBlbmdpbmUKKyAqIEBmaDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBwYWQ6IHBhZCBudW1iZXIKKyAqIEBmbXQ6IGZvcm1hdCB0byBiZSB2YWxpZGF0ZWQKKyAqIEB3aGljaDogdHJ5L2FjdGl2ZSBmb3JtYXQgc2VsZWN0b3IKKyAqCisgKiBWYWxpZGF0ZSBhbmQgYWRqdXN0IHRoZSBnaXZlbiBmb3JtYXQgZm9yIHRoZSBnaXZlbiBwYWQgYmFzZWQgb24gdGhlIHByZXZpZXcKKyAqIGVuZ2luZSBsaW1pdHMgYW5kIHRoZSBmb3JtYXQgYW5kIGNyb3AgcmVjdGFuZ2xlcyBvbiBvdGhlciBwYWRzLgogICovCiBzdGF0aWMgdm9pZCBwcmV2aWV3X3RyeV9mb3JtYXQoc3RydWN0IGlzcF9wcmV2X2RldmljZSAqcHJldiwKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLCB1bnNpZ25lZCBpbnQgcGFkLAogCQkJICAgICAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZtdCwKIAkJCSAgICAgICBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2Ugd2hpY2gpCiB7Ci0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OwotCXVuc2lnbmVkIGludCBtYXhfb3V0X3dpZHRoOwogCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBwaXhlbGNvZGU7CisJc3RydWN0IHY0bDJfcmVjdCAqY3JvcDsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCW1heF9vdXRfd2lkdGggPSBwcmV2aWV3X21heF9vdXRfd2lkdGgocHJldik7Ci0KIAlzd2l0Y2ggKHBhZCkgewogCWNhc2UgUFJFVl9QQURfU0lOSzoKIAkJLyogV2hlbiByZWFkaW5nIGRhdGEgZnJvbSB0aGUgQ0NEQywgdGhlIGlucHV0IHNpemUgaGFzIGFscmVhZHkKQEAgLTE2NDEsMTAgKzE2NzIsMTEgQEAKIAkJICogZmlsdGVyIGFycmF5IGludGVycG9sYXRpb24uCiAJCSAqLwogCQlpZiAocHJldi0+aW5wdXQgPT0gUFJFVklFV19JTlBVVF9NRU1PUlkpIHsKLQkJCWZtdC0+d2lkdGggPSBjbGFtcF90KHUzMiwgZm10LT53aWR0aCwgUFJFVl9NSU5fV0lEVEgsCi0JCQkJCSAgICAgbWF4X291dF93aWR0aCAqIDgpOwotCQkJZm10LT5oZWlnaHQgPSBjbGFtcF90KHUzMiwgZm10LT5oZWlnaHQsIFBSRVZfTUlOX0hFSUdIVCwKLQkJCQkJICAgICAgUFJFVl9NQVhfSEVJR0hUKTsKKwkJCWZtdC0+d2lkdGggPSBjbGFtcF90KHUzMiwgZm10LT53aWR0aCwgUFJFVl9NSU5fSU5fV0lEVEgsCisJCQkJCSAgICAgcHJldmlld19tYXhfb3V0X3dpZHRoKHByZXYpKTsKKwkJCWZtdC0+aGVpZ2h0ID0gY2xhbXBfdCh1MzIsIGZtdC0+aGVpZ2h0LAorCQkJCQkgICAgICBQUkVWX01JTl9JTl9IRUlHSFQsCisJCQkJCSAgICAgIFBSRVZfTUFYX0lOX0hFSUdIVCk7CiAJCX0KIAogCQlmbXQtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKQEAgLTE2NjEsMTUgKzE2OTMsOCBAQAogCiAJY2FzZSBQUkVWX1BBRF9TT1VSQ0U6CiAJCXBpeGVsY29kZSA9IGZtdC0+Y29kZTsKLQkJZm9ybWF0ID0gX19wcmV2aWV3X2dldF9mb3JtYXQocHJldiwgZmgsIFBSRVZfUEFEX1NJTkssIHdoaWNoKTsKLQkJbWVtY3B5KGZtdCwgZm9ybWF0LCBzaXplb2YoKmZtdCkpOworCQkqZm10ID0gKl9fcHJldmlld19nZXRfZm9ybWF0KHByZXYsIGZoLCBQUkVWX1BBRF9TSU5LLCB3aGljaCk7CiAKLQkJLyogVGhlIHByZXZpZXcgbW9kdWxlIG91dHB1dCBzaXplIGlzIGNvbmZpZ3VyYWJsZSB0aHJvdWdoIHRoZQotCQkgKiBpbnB1dCBpbnRlcmZhY2UgKGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNyb3BwaW5nKSBhbmQgdGhlCi0JCSAqIGF2ZXJhZ2VyIChob3Jpem9udGFsIHNjYWxpbmcgYnkgMS8xLCAxLzIsIDEvNCBvciAxLzgpLiBJbgotCQkgKiBzcGl0ZSBvZiB0aGlzLCBoYXJkY29kZSB0aGUgb3V0cHV0IHNpemUgdG8gdGhlIGJpZ2dlc3QKLQkJICogcG9zc2libGUgdmFsdWUgZm9yIHNpbXBsaWNpdHkgcmVhc29ucy4KLQkJICovCiAJCXN3aXRjaCAocGl4ZWxjb2RlKSB7CiAJCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8xWDE2OgogCQljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMVgxNjoKQEAgLTE2ODEsMzEgKzE3MDYsMTQgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJLyogVGhlIFRSTSBzdGF0ZXMgKDEyLjEuNC43LjEuMikgdGhhdCAyIHBpeGVscyBtdXN0IGJlIGNyb3BwZWQKLQkJICogZnJvbSB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgd2hlbiB0aGUgaW5wdXQgc291cmNlIGlzIHRoZQotCQkgKiBDQ0RDLiBUaGlzIHNlZW1zIG5vdCB0byBiZSBuZWVkZWQgaW4gcHJhY3RpY2UsIGludmVzdGlnYXRpb24KLQkJICogaXMgcmVxdWlyZWQuCisJCS8qIFRoZSBwcmV2aWV3IG1vZHVsZSBvdXRwdXQgc2l6ZSBpcyBjb25maWd1cmFibGUgdGhyb3VnaCB0aGUKKwkJICogYXZlcmFnZXIgKGhvcml6b250YWwgc2NhbGluZyBieSAxLzEsIDEvMiwgMS80IG9yIDEvOCkuIFRoaXMKKwkJICogaXMgbm90IHN1cHBvcnRlZCB5ZXQsIGhhcmRjb2RlIHRoZSBvdXRwdXQgc2l6ZSB0byB0aGUgY3JvcAorCQkgKiByZWN0YW5nbGUgc2l6ZS4KIAkJICovCi0JCWlmIChwcmV2LT5pbnB1dCA9PSBQUkVWSUVXX0lOUFVUX0NDREMpCi0JCQlmbXQtPndpZHRoIC09IDQ7Ci0KLQkJLyogVGhlIHByZXZpZXcgbW9kdWxlIGNhbiBvdXRwdXQgYSBtYXhpbXVtIG9mIDMzMTIgcGl4ZWxzCi0JCSAqIGhvcml6b250YWxseSBkdWUgdG8gZml4ZWQgbWVtb3J5LWxpbmUgc2l6ZXMuIENvbXB1dGUgdGhlCi0JCSAqIGhvcml6b250YWwgYXZlcmFnaW5nIGZhY3RvciBhY2NvcmRpbmdseS4gTm90ZSB0aGF0IHRoZSBsaW1pdAotCQkgKiBhcHBsaWVzIHRvIHRoZSBub2lzZSBmaWx0ZXIgYW5kIENGQSBpbnRlcnBvbGF0aW9uIGJsb2Nrcywgc28KLQkJICogaXQgZG9lc24ndCB0YWtlIGNyb3BwaW5nIGJ5IGZ1cnRoZXIgYmxvY2tzIGludG8gYWNjb3VudC4KLQkJICoKLQkJICogRVMgMS4wIGhhcmR3YXJlIHJldmlzaW9uIGlzIGxpbWl0ZWQgdG8gMTI4MCBwaXhlbHMKLQkJICogaG9yaXpvbnRhbGx5LgotCQkgKi8KLQkJZm10LT53aWR0aCA+Pj0gZmxzKERJVl9ST1VORF9VUChmbXQtPndpZHRoLCBtYXhfb3V0X3dpZHRoKSAtIDEpOwotCi0JCS8qIEFzc3VtZSB0aGF0IGFsbCBibG9ja3MgYXJlIGVuYWJsZWQgYW5kIGNyb3AgcGl4ZWxzIGFuZCBsaW5lcwotCQkgKiBhY2NvcmRpbmdseS4gU2VlIHByZXZpZXdfY29uZmlnX2lucHV0X3NpemUoKSBmb3IgbW9yZQotCQkgKiBpbmZvcm1hdGlvbi4KLQkJICovCi0JCWZtdC0+d2lkdGggLT0gMTQ7Ci0JCWZtdC0+aGVpZ2h0IC09IDg7CisJCWNyb3AgPSBfX3ByZXZpZXdfZ2V0X2Nyb3AocHJldiwgZmgsIHdoaWNoKTsKKwkJZm10LT53aWR0aCA9IGNyb3AtPndpZHRoOworCQlmbXQtPmhlaWdodCA9IGNyb3AtPmhlaWdodDsKIAogCQlmbXQtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKIAkJYnJlYWs7CkBAIC0xNzE1LDYgKzE3MjMsNDkgQEAKIH0KIAogLyoKKyAqIHByZXZpZXdfdHJ5X2Nyb3AgLSBWYWxpZGF0ZSBhIGNyb3AgcmVjdGFuZ2xlCisgKiBAcHJldjogSVNQIHByZXZpZXcgZW5naW5lCisgKiBAc2luazogZm9ybWF0IG9uIHRoZSBzaW5rIHBhZAorICogQGNyb3A6IGNyb3AgcmVjdGFuZ2xlIHRvIGJlIHZhbGlkYXRlZAorICoKKyAqIFRoZSBwcmV2aWV3IGVuZ2luZSBjcm9wcyBsaW5lcyBhbmQgY29sdW1ucyBmb3IgaXRzIGludGVybmFsIG9wZXJhdGlvbiwKKyAqIGRlcGVuZGluZyBvbiB3aGljaCBmaWx0ZXJzIGFyZSBlbmFibGVkLiBFbmZvcmNlIG1pbmltdW0gY3JvcCBtYXJnaW5zIHRvCisgKiBoYW5kbGUgdGhhdCB0cmFuc3BhcmVudGx5IGZvciB1c2Vyc3BhY2UuCisgKgorICogU2VlIHRoZSBleHBsYW5hdGlvbiBhdCB0aGUgUFJFVl9NQVJHSU5fKiBkZWZpbml0aW9ucyBmb3IgbW9yZSBkZXRhaWxzLgorICovCitzdGF0aWMgdm9pZCBwcmV2aWV3X3RyeV9jcm9wKHN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKnNpbmssCisJCQkgICAgIHN0cnVjdCB2NGwyX3JlY3QgKmNyb3ApCit7CisJdW5zaWduZWQgaW50IGxlZnQgPSBQUkVWX01BUkdJTl9MRUZUOworCXVuc2lnbmVkIGludCByaWdodCA9IHNpbmstPndpZHRoIC0gUFJFVl9NQVJHSU5fUklHSFQ7CisJdW5zaWduZWQgaW50IHRvcCA9IFBSRVZfTUFSR0lOX1RPUDsKKwl1bnNpZ25lZCBpbnQgYm90dG9tID0gc2luay0+aGVpZ2h0IC0gUFJFVl9NQVJHSU5fQk9UVE9NOworCisJLyogV2hlbiBwcm9jZXNzaW5nIGRhdGEgb24tdGhlLWZseSBmcm9tIHRoZSBDQ0RDLCBhdCBsZWFzdCAyIHBpeGVscyBtdXN0CisJICogYmUgY3JvcHBlZCBmcm9tIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlcyBvZiB0aGUgaW1hZ2UuIEFzIHdlIGRvbid0CisJICoga25vdyB3aGljaCBmaWx0ZXJzIHdpbGwgYmUgZW5hYmxlZCwgaW5jcmVhc2UgdGhlIGxlZnQgYW5kIHJpZ2h0CisJICogbWFyZ2lucyBieSB0d28uCisJICovCisJaWYgKHByZXYtPmlucHV0ID09IFBSRVZJRVdfSU5QVVRfQ0NEQykgeworCQlsZWZ0ICs9IDI7CisJCXJpZ2h0IC09IDI7CisJfQorCisJLyogUmVzdHJpY3QgbGVmdC90b3AgdG8gZXZlbiB2YWx1ZXMgdG8ga2VlcCB0aGUgQmF5ZXIgcGF0dGVybi4gKi8KKwljcm9wLT5sZWZ0ICY9IH4xOworCWNyb3AtPnRvcCAmPSB+MTsKKworCWNyb3AtPmxlZnQgPSBjbGFtcF90KHUzMiwgY3JvcC0+bGVmdCwgbGVmdCwgcmlnaHQgLSBQUkVWX01JTl9PVVRfV0lEVEgpOworCWNyb3AtPnRvcCA9IGNsYW1wX3QodTMyLCBjcm9wLT50b3AsIHRvcCwgYm90dG9tIC0gUFJFVl9NSU5fT1VUX0hFSUdIVCk7CisJY3JvcC0+d2lkdGggPSBjbGFtcF90KHUzMiwgY3JvcC0+d2lkdGgsIFBSRVZfTUlOX09VVF9XSURUSCwKKwkJCSAgICAgIHJpZ2h0IC0gY3JvcC0+bGVmdCk7CisJY3JvcC0+aGVpZ2h0ID0gY2xhbXBfdCh1MzIsIGNyb3AtPmhlaWdodCwgUFJFVl9NSU5fT1VUX0hFSUdIVCwKKwkJCSAgICAgICBib3R0b20gLSBjcm9wLT50b3ApOworfQorCisvKgogICogcHJldmlld19lbnVtX21idXNfY29kZSAtIEhhbmRsZSBwaXhlbCBmb3JtYXQgZW51bWVyYXRpb24KICAqIEBzZCAgICAgOiBwb2ludGVyIHRvIHY0bDIgc3ViZGV2IHN0cnVjdHVyZQogICogQGZoICAgICA6IFY0TDIgc3ViZGV2IGZpbGUgaGFuZGxlCkBAIC0xNzc2LDYgKzE4MjcsNjAgQEAKIH0KIAogLyoKKyAqIHByZXZpZXdfZ2V0X2Nyb3AgLSBSZXRyaWV2ZSB0aGUgY3JvcCByZWN0YW5nbGUgb24gYSBwYWQKKyAqIEBzZDogSVNQIHByZXZpZXcgVjRMMiBzdWJkZXZpY2UKKyAqIEBmaDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBjcm9wOiBjcm9wIHJlY3RhbmdsZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBwcmV2aWV3X2dldF9jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IGlzcF9wcmV2X2RldmljZSAqcHJldiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJLyogQ3JvcHBpbmcgaXMgb25seSBzdXBwb3J0ZWQgb24gdGhlIHNpbmsgcGFkLiAqLworCWlmIChjcm9wLT5wYWQgIT0gUFJFVl9QQURfU0lOSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcm9wLT5yZWN0ID0gKl9fcHJldmlld19nZXRfY3JvcChwcmV2LCBmaCwgY3JvcC0+d2hpY2gpOworCXJldHVybiAwOworfQorCisvKgorICogcHJldmlld19zZXRfY3JvcCAtIFJldHJpZXZlIHRoZSBjcm9wIHJlY3RhbmdsZSBvbiBhIHBhZAorICogQHNkOiBJU1AgcHJldmlldyBWNEwyIHN1YmRldmljZQorICogQGZoOiBWNEwyIHN1YmRldiBmaWxlIGhhbmRsZQorICogQGNyb3A6IGNyb3AgcmVjdGFuZ2xlCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHByZXZpZXdfc2V0X2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCAqY3JvcCkKK3sKKwlzdHJ1Y3QgaXNwX3ByZXZfZGV2aWNlICpwcmV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCisJLyogQ3JvcHBpbmcgaXMgb25seSBzdXBwb3J0ZWQgb24gdGhlIHNpbmsgcGFkLiAqLworCWlmIChjcm9wLT5wYWQgIT0gUFJFVl9QQURfU0lOSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUaGUgY3JvcCByZWN0YW5nbGUgY2FuJ3QgYmUgY2hhbmdlZCB3aGlsZSBzdHJlYW1pbmcuICovCisJaWYgKHByZXYtPnN0YXRlICE9IElTUF9QSVBFTElORV9TVFJFQU1fU1RPUFBFRCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZvcm1hdCA9IF9fcHJldmlld19nZXRfZm9ybWF0KHByZXYsIGZoLCBQUkVWX1BBRF9TSU5LLCBjcm9wLT53aGljaCk7CisJcHJldmlld190cnlfY3JvcChwcmV2LCBmb3JtYXQsICZjcm9wLT5yZWN0KTsKKwkqX19wcmV2aWV3X2dldF9jcm9wKHByZXYsIGZoLCBjcm9wLT53aGljaCkgPSBjcm9wLT5yZWN0OworCisJLyogVXBkYXRlIHRoZSBzb3VyY2UgZm9ybWF0LiAqLworCWZvcm1hdCA9IF9fcHJldmlld19nZXRfZm9ybWF0KHByZXYsIGZoLCBQUkVWX1BBRF9TT1VSQ0UsIGNyb3AtPndoaWNoKTsKKwlwcmV2aWV3X3RyeV9mb3JtYXQocHJldiwgZmgsIFBSRVZfUEFEX1NPVVJDRSwgZm9ybWF0LCBjcm9wLT53aGljaCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIHByZXZpZXdfZ2V0X2Zvcm1hdCAtIEhhbmRsZSBnZXQgZm9ybWF0IGJ5IHBhZHMgc3ViZGV2IG1ldGhvZAogICogQHNkIDogcG9pbnRlciB0byB2NGwyIHN1YmRldiBzdHJ1Y3R1cmUKICAqIEBmaCA6IFY0TDIgc3ViZGV2IGZpbGUgaGFuZGxlCkBAIC0xODA4LDYgKzE5MTMsNyBAQAogewogCXN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQ7CisJc3RydWN0IHY0bDJfcmVjdCAqY3JvcDsKIAogCWZvcm1hdCA9IF9fcHJldmlld19nZXRfZm9ybWF0KHByZXYsIGZoLCBmbXQtPnBhZCwgZm10LT53aGljaCk7CiAJaWYgKGZvcm1hdCA9PSBOVUxMKQpAQCAtMTgxOCw5ICsxOTI0LDE4IEBACiAKIAkvKiBQcm9wYWdhdGUgdGhlIGZvcm1hdCBmcm9tIHNpbmsgdG8gc291cmNlICovCiAJaWYgKGZtdC0+cGFkID09IFBSRVZfUEFEX1NJTkspIHsKKwkJLyogUmVzZXQgdGhlIGNyb3AgcmVjdGFuZ2xlLiAqLworCQljcm9wID0gX19wcmV2aWV3X2dldF9jcm9wKHByZXYsIGZoLCBmbXQtPndoaWNoKTsKKwkJY3JvcC0+bGVmdCA9IDA7CisJCWNyb3AtPnRvcCA9IDA7CisJCWNyb3AtPndpZHRoID0gZm10LT5mb3JtYXQud2lkdGg7CisJCWNyb3AtPmhlaWdodCA9IGZtdC0+Zm9ybWF0LmhlaWdodDsKKworCQlwcmV2aWV3X3RyeV9jcm9wKHByZXYsICZmbXQtPmZvcm1hdCwgY3JvcCk7CisKKwkJLyogVXBkYXRlIHRoZSBzb3VyY2UgZm9ybWF0LiAqLwogCQlmb3JtYXQgPSBfX3ByZXZpZXdfZ2V0X2Zvcm1hdChwcmV2LCBmaCwgUFJFVl9QQURfU09VUkNFLAogCQkJCQkgICAgICBmbXQtPndoaWNoKTsKLQkJKmZvcm1hdCA9IGZtdC0+Zm9ybWF0OwogCQlwcmV2aWV3X3RyeV9mb3JtYXQocHJldiwgZmgsIFBSRVZfUEFEX1NPVVJDRSwgZm9ybWF0LAogCQkJCSAgIGZtdC0+d2hpY2gpOwogCX0KQEAgLTE4NjksNiArMTk4NCw4IEBACiAJLmVudW1fZnJhbWVfc2l6ZSA9IHByZXZpZXdfZW51bV9mcmFtZV9zaXplLAogCS5nZXRfZm10ID0gcHJldmlld19nZXRfZm9ybWF0LAogCS5zZXRfZm10ID0gcHJldmlld19zZXRfZm9ybWF0LAorCS5nZXRfY3JvcCA9IHByZXZpZXdfZ2V0X2Nyb3AsCisJLnNldF9jcm9wID0gcHJldmlld19zZXRfY3JvcCwKIH07CiAKIC8qIHN1YmRldiBvcGVyYXRpb25zICovCkBAIC0xOTY2LDggKzIwODMsNDQgQEAKIAkubGlua19zZXR1cCA9IHByZXZpZXdfbGlua19zZXR1cCwKIH07CiAKK3ZvaWQgb21hcDNpc3BfcHJldmlld191bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYpCit7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnByZXYtPnN1YmRldik7CisJb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmcHJldi0+dmlkZW9faW4pOworCW9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoJnByZXYtPnZpZGVvX291dCk7Cit9CisKK2ludCBvbWFwM2lzcF9wcmV2aWV3X3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYsCisJc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2Rlcy4gKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJnByZXYtPnN1YmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmcHJldi0+dmlkZW9faW4sIHZkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoJnByZXYtPnZpZGVvX291dCwgdmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJb21hcDNpc3BfcHJldmlld191bnJlZ2lzdGVyX2VudGl0aWVzKHByZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJU1AgcHJldmlld2VyIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwCisgKi8KKwogLyoKLSAqIHJldmlld19pbml0X2VudGl0aWVzIC0gSW5pdGlhbGl6ZSBzdWJkZXYgYW5kIG1lZGlhIGVudGl0eS4KKyAqIHByZXZpZXdfaW5pdF9lbnRpdGllcyAtIEluaXRpYWxpemUgc3ViZGV2IGFuZCBtZWRpYSBlbnRpdHkuCiAgKiBAcHJldiA6IFBvaW50ZXIgdG8gcHJldmlldyBzdHJ1Y3R1cmUKICAqIHJldHVybiAtRU5PTUVNIG9yIHplcm8gb24gc3VjY2VzcwogICovCkBAIC0yMDI0LDY5ICsyMTc3LDM0IEBACiAKIAlyZXQgPSBvbWFwM2lzcF92aWRlb19pbml0KCZwcmV2LT52aWRlb19pbiwgInByZXZpZXciKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl92aWRlb19pbjsKIAogCXJldCA9IG9tYXAzaXNwX3ZpZGVvX2luaXQoJnByZXYtPnZpZGVvX291dCwgInByZXZpZXciKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl92aWRlb19vdXQ7CiAKIAkvKiBDb25uZWN0IHRoZSB2aWRlbyBub2RlcyB0byB0aGUgcHJldmlld2VyIHN1YmRldi4gKi8KIAlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoJnByZXYtPnZpZGVvX2luLnZpZGVvLmVudGl0eSwgMCwKIAkJCSZwcmV2LT5zdWJkZXYuZW50aXR5LCBQUkVWX1BBRF9TSU5LLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl9saW5rOwogCiAJcmV0ID0gbWVkaWFfZW50aXR5X2NyZWF0ZV9saW5rKCZwcmV2LT5zdWJkZXYuZW50aXR5LCBQUkVWX1BBRF9TT1VSQ0UsCiAJCQkmcHJldi0+dmlkZW9fb3V0LnZpZGVvLmVudGl0eSwgMCwgMCk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfbGluazsKIAogCXJldHVybiAwOwotfQogCi12b2lkIG9tYXAzaXNwX3ByZXZpZXdfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX3ByZXZfZGV2aWNlICpwcmV2KQoteworZXJyb3JfbGluazoKKwlvbWFwM2lzcF92aWRlb19jbGVhbnVwKCZwcmV2LT52aWRlb19vdXQpOworZXJyb3JfdmlkZW9fb3V0OgorCW9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoJnByZXYtPnZpZGVvX2luKTsKK2Vycm9yX3ZpZGVvX2luOgogCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZwcmV2LT5zdWJkZXYuZW50aXR5KTsKLQotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZwcmV2LT5zdWJkZXYpOwotCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnByZXYtPmN0cmxzKTsKLQlvbWFwM2lzcF92aWRlb191bnJlZ2lzdGVyKCZwcmV2LT52aWRlb19pbik7Ci0Jb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmcHJldi0+dmlkZW9fb3V0KTsKLX0KLQotaW50IG9tYXAzaXNwX3ByZXZpZXdfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9wcmV2X2RldmljZSAqcHJldiwKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnZkZXYpCi17Ci0JaW50IHJldDsKLQotCS8qIFJlZ2lzdGVyIHRoZSBzdWJkZXYgYW5kIHZpZGVvIG5vZGVzLiAqLwotCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldih2ZGV2LCAmcHJldi0+c3ViZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCXJldCA9IG9tYXAzaXNwX3ZpZGVvX3JlZ2lzdGVyKCZwcmV2LT52aWRlb19pbiwgdmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmcHJldi0+dmlkZW9fb3V0LCB2ZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCXJldHVybiAwOwotCi1lcnJvcjoKLQlvbWFwM2lzcF9wcmV2aWV3X3VucmVnaXN0ZXJfZW50aXRpZXMocHJldik7CiAJcmV0dXJuIHJldDsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIElTUCBwcmV2aWV3ZXIgaW5pdGlhbGlzYXRpb24gYW5kIGNsZWFudXAKLSAqLwotCi12b2lkIG9tYXAzaXNwX3ByZXZpZXdfY2xlYW51cChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwKQotewotfQotCiAvKgogICogaXNwX3ByZXZpZXdfaW5pdCAtIFByZXZpZXdlciBpbml0aWFsaXphdGlvbi4KICAqIEBkZXYgOiBQb2ludGVyIHRvIElTUCBkZXZpY2UKQEAgLTIwOTUsMTkgKzIyMTMsMjAgQEAKIGludCBvbWFwM2lzcF9wcmV2aWV3X2luaXQoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKIHsKIAlzdHJ1Y3QgaXNwX3ByZXZfZGV2aWNlICpwcmV2ID0gJmlzcC0+aXNwX3ByZXY7Ci0JaW50IHJldDsKIAogCXNwaW5fbG9ja19pbml0KCZwcmV2LT5sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcmV2LT53YWl0KTsKIAlwcmV2aWV3X2luaXRfcGFyYW1zKHByZXYpOwogCi0JcmV0ID0gcHJldmlld19pbml0X2VudGl0aWVzKHByZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKKwlyZXR1cm4gcHJldmlld19pbml0X2VudGl0aWVzKHByZXYpOworfQogCi1vdXQ6Ci0JaWYgKHJldCkKLQkJb21hcDNpc3BfcHJldmlld19jbGVhbnVwKGlzcCk7Cit2b2lkIG9tYXAzaXNwX3ByZXZpZXdfY2xlYW51cChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwKQoreworCXN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYgPSAmaXNwLT5pc3BfcHJldjsKIAotCXJldHVybiByZXQ7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcHJldi0+Y3RybHMpOworCW9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoJnByZXYtPnZpZGVvX2luKTsKKwlvbWFwM2lzcF92aWRlb19jbGVhbnVwKCZwcmV2LT52aWRlb19vdXQpOworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZwcmV2LT5zdWJkZXYuZW50aXR5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcHJldmlldy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BwcmV2aWV3LmgKaW5kZXggZmE5NDNiZC4uZjU0ZTc3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BwcmV2aWV3LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BwcmV2aWV3LmgKQEAgLTQ1LDExICs0NSw2IEBACiAjZGVmaW5lIElTUFBSVl9DT05UUkFTVF9ISUdICQkweEZGCiAjZGVmaW5lIElTUFBSVl9DT05UUkFTVF9VTklUUwkJMHgxCiAKLSNkZWZpbmUgTk9fQVZFCQkJCTB4MAotI2RlZmluZSBBVkVfMl9QSVgJCQkweDEKLSNkZWZpbmUgQVZFXzRfUElYCQkJMHgyCi0jZGVmaW5lIEFWRV84X1BJWAkJCTB4MwotCiAvKiBGZWF0dXJlcyBsaXN0ICovCiAjZGVmaW5lIFBSRVZfTFVNQV9FTkhBTkNFCQlPTUFQM0lTUF9QUkVWX0xVTUFFTkgKICNkZWZpbmUgUFJFVl9JTlZFUlNFX0FMQVcJCU9NQVAzSVNQX1BSRVZfSU5WQUxBVwpAQCAtMTA2LDcgKzEwMSw2IEBACiAgKiBAcmdiMnljYmNyOiBSR0IgdG8geWNiY3IgcGFyYW1ldGVycy4KICAqIEBobWVkOiBIb3Jpem9udGFsIG1lZGlhbiBmaWx0ZXIuCiAgKiBAeWNsaW1pdDogWUMgbGltaXRzIHBhcmFtZXRlcnMuCi0gKiBAYXZlcmFnZTogRG93bnNhbXBsaW5nIHJhdGUgZm9yIGF2ZXJhZ2VyLgogICogQGNvbnRyYXN0OiBDb250cmFzdC4KICAqIEBicmlnaHRuZXNzOiBCcmlnaHRuZXNzLgogICovCkBAIC0xMjQsNyArMTE4LDYgQEAKIAlzdHJ1Y3Qgb21hcDNpc3BfcHJldl9jc2MgcmdiMnljYmNyOwogCXN0cnVjdCBvbWFwM2lzcF9wcmV2X2htZWQgaG1lZDsKIAlzdHJ1Y3Qgb21hcDNpc3BfcHJldl95Y2xpbWl0IHljbGltaXQ7Ci0JdTggYXZlcmFnZTsKIAl1OCBjb250cmFzdDsKIAl1OCBicmlnaHRuZXNzOwogfTsKQEAgLTE1OSw2ICsxNTIsNyBAQAogICogQHN1YmRldjogVjRMMiBzdWJkZXZpY2UKICAqIEBwYWRzOiBNZWRpYSBlbnRpdHkgcGFkcwogICogQGZvcm1hdHM6IEFjdGl2ZSBmb3JtYXRzIGF0IHRoZSBzdWJkZXYgcGFkCisgKiBAY3JvcDogQWN0aXZlIGNyb3AgcmVjdGFuZ2xlCiAgKiBAaW5wdXQ6IE1vZHVsZSBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBpbnB1dCBwYWQKICAqIEBvdXRwdXQ6IEJpdG1hc2sgb2YgdGhlIGFjdGl2ZSBvdXRwdXQKICAqIEB2aWRlb19pbjogSW5wdXQgdmlkZW8gZW50aXR5CkBAIC0xNzcsNiArMTcxLDcgQEAKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OwogCXN0cnVjdCBtZWRpYV9wYWQgcGFkc1tQUkVWX1BBRFNfTlVNXTsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdHNbUFJFVl9QQURTX05VTV07CisJc3RydWN0IHY0bDJfcmVjdCBjcm9wOwogCiAJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGN0cmxzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHF1ZXVlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHF1ZXVlLmMKaW5kZXggOWMzMTcxNC4uOWJlYmIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BxdWV1ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcXVldWUuYwpAQCAtODY4LDYgKzg2OCwxMCBAQAogCQlnb3RvIGRvbmU7CiAKIAlpZiAodmJ1Zi0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX1VTRVJQVFIgJiYKKwkgICAgdmJ1Zi0+bGVuZ3RoIDwgYnVmLT52YnVmLmxlbmd0aCkKKwkJZ290byBkb25lOworCisJaWYgKHZidWYtPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSICYmCiAJICAgIHZidWYtPm0udXNlcnB0ciAhPSBidWYtPnZidWYubS51c2VycHRyKSB7CiAJCWlzcF92aWRlb19idWZmZXJfY2xlYW51cChidWYpOwogCQlidWYtPnZidWYubS51c2VycHRyID0gdmJ1Zi0+bS51c2VycHRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3ByZWcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcmVnLmgKaW5kZXggNjlmNmFmNi4uMDg0ZWE3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3ByZWcuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHJlZy5oCkBAIC00MDIsOSArNDAyLDYgQEAKICNkZWZpbmUgSVNQUFJWX1lFTkhfVEFCTEVfQUREUgkJMHgxMDAwCiAjZGVmaW5lIElTUFBSVl9DRkFfVEFCTEVfQUREUgkJMHgxNDAwCiAKLSNkZWZpbmUgSVNQUFJWX01BWE9VVFBVVF9XSURUSAkJMTI4MAotI2RlZmluZSBJU1BQUlZfTUFYT1VUUFVUX1dJRFRIX0VTMgkzMzAwCi0jZGVmaW5lIElTUFBSVl9NQVhPVVRQVVRfV0lEVEhfMzYzMAk0MDk2CiAjZGVmaW5lIElTUFJTWl9NSU5fT1VUUFVUCQk2NAogI2RlZmluZSBJU1BSU1pfTUFYX09VVFBVVAkJMzMxMgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHJlc2l6ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcmVzaXplci5jCmluZGV4IDBiYjBmOGMuLjUwZTU5M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcmVzaXplci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcmVzaXplci5jCkBAIC0xNjA4LDYgKzE2MDgsNDIgQEAKIAkubGlua19zZXR1cCA9IHJlc2l6ZXJfbGlua19zZXR1cCwKIH07CiAKK3ZvaWQgb21hcDNpc3BfcmVzaXplcl91bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfcmVzX2RldmljZSAqcmVzKQoreworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZyZXMtPnN1YmRldik7CisJb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmcmVzLT52aWRlb19pbik7CisJb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmcmVzLT52aWRlb19vdXQpOworfQorCitpbnQgb21hcDNpc3BfcmVzaXplcl9yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX3Jlc19kZXZpY2UgKnJlcywKKwkJCQkgICAgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2Rlcy4gKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJnJlcy0+c3ViZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG9tYXAzaXNwX3ZpZGVvX3JlZ2lzdGVyKCZyZXMtPnZpZGVvX2luLCB2ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG9tYXAzaXNwX3ZpZGVvX3JlZ2lzdGVyKCZyZXMtPnZpZGVvX291dCwgdmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJb21hcDNpc3BfcmVzaXplcl91bnJlZ2lzdGVyX2VudGl0aWVzKHJlcyk7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElTUCByZXNpemVyIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwCisgKi8KKwogLyoKICAqIHJlc2l6ZXJfaW5pdF9lbnRpdGllcyAtIEluaXRpYWxpemUgcmVzaXplciBzdWJkZXYgYW5kIG1lZGlhIGVudGl0eS4KICAqIEByZXMgOiBQb2ludGVyIHRvIHJlc2l6ZXIgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMTY1Miw2OCArMTY4OCwzNCBAQAogCiAJcmV0ID0gb21hcDNpc3BfdmlkZW9faW5pdCgmcmVzLT52aWRlb19pbiwgInJlc2l6ZXIiKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl92aWRlb19pbjsKIAogCXJldCA9IG9tYXAzaXNwX3ZpZGVvX2luaXQoJnJlcy0+dmlkZW9fb3V0LCAicmVzaXplciIpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX3ZpZGVvX291dDsKIAogCS8qIENvbm5lY3QgdGhlIHZpZGVvIG5vZGVzIHRvIHRoZSByZXNpemVyIHN1YmRldi4gKi8KIAlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoJnJlcy0+dmlkZW9faW4udmlkZW8uZW50aXR5LCAwLAogCQkJJnJlcy0+c3ViZGV2LmVudGl0eSwgUkVTWl9QQURfU0lOSywgMCk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfbGluazsKIAogCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluaygmcmVzLT5zdWJkZXYuZW50aXR5LCBSRVNaX1BBRF9TT1VSQ0UsCiAJCQkmcmVzLT52aWRlb19vdXQudmlkZW8uZW50aXR5LCAwLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl9saW5rOwogCiAJcmV0dXJuIDA7Ci19CiAKLXZvaWQgb21hcDNpc3BfcmVzaXplcl91bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfcmVzX2RldmljZSAqcmVzKQoteworZXJyb3JfbGluazoKKwlvbWFwM2lzcF92aWRlb19jbGVhbnVwKCZyZXMtPnZpZGVvX291dCk7CitlcnJvcl92aWRlb19vdXQ6CisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmcmVzLT52aWRlb19pbik7CitlcnJvcl92aWRlb19pbjoKIAltZWRpYV9lbnRpdHlfY2xlYW51cCgmcmVzLT5zdWJkZXYuZW50aXR5KTsKLQotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZyZXMtPnN1YmRldik7Ci0Jb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmcmVzLT52aWRlb19pbik7Ci0Jb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmcmVzLT52aWRlb19vdXQpOwotfQotCi1pbnQgb21hcDNpc3BfcmVzaXplcl9yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX3Jlc19kZXZpY2UgKnJlcywKLQkJCQkgICAgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQotewotCWludCByZXQ7Ci0KLQkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2Rlcy4gKi8KLQlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJnJlcy0+c3ViZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCXJldCA9IG9tYXAzaXNwX3ZpZGVvX3JlZ2lzdGVyKCZyZXMtPnZpZGVvX2luLCB2ZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCXJldCA9IG9tYXAzaXNwX3ZpZGVvX3JlZ2lzdGVyKCZyZXMtPnZpZGVvX291dCwgdmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0Jb21hcDNpc3BfcmVzaXplcl91bnJlZ2lzdGVyX2VudGl0aWVzKHJlcyk7CiAJcmV0dXJuIHJldDsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIElTUCByZXNpemVyIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwCi0gKi8KLQotdm9pZCBvbWFwM2lzcF9yZXNpemVyX2NsZWFudXAoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKLXsKLX0KLQogLyoKICAqIGlzcF9yZXNpemVyX2luaXQgLSBSZXNpemVyIGluaXRpYWxpemF0aW9uLgogICogQGlzcCA6IFBvaW50ZXIgdG8gSVNQIGRldmljZQpAQCAtMTcyMiwxNyArMTcyNCwxNyBAQAogaW50IG9tYXAzaXNwX3Jlc2l6ZXJfaW5pdChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwKQogewogCXN0cnVjdCBpc3BfcmVzX2RldmljZSAqcmVzID0gJmlzcC0+aXNwX3JlczsKLQlpbnQgcmV0OwogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcmVzLT53YWl0KTsKIAlhdG9taWNfc2V0KCZyZXMtPnN0b3BwaW5nLCAwKTsKLQlyZXQgPSByZXNpemVyX2luaXRfZW50aXRpZXMocmVzKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisJcmV0dXJuIHJlc2l6ZXJfaW5pdF9lbnRpdGllcyhyZXMpOworfQogCi1vdXQ6Ci0JaWYgKHJldCkKLQkJb21hcDNpc3BfcmVzaXplcl9jbGVhbnVwKGlzcCk7Cit2b2lkIG9tYXAzaXNwX3Jlc2l6ZXJfY2xlYW51cChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwKQoreworCXN0cnVjdCBpc3BfcmVzX2RldmljZSAqcmVzID0gJmlzcC0+aXNwX3JlczsKIAotCXJldHVybiByZXQ7CisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmcmVzLT52aWRlb19pbik7CisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmcmVzLT52aWRlb19vdXQpOworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZyZXMtPnN1YmRldi5lbnRpdHkpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BzdGF0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuYwppbmRleCA4MDgwNjU5Li42OGQ1Mzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuYwpAQCAtMzY2LDcgKzM2Niw4IEBACiAJCQkJZG1hX3VubWFwX3NnKGlzcC0+ZGV2LCBidWYtPmlvdm0tPnNndC0+c2dsLAogCQkJCQkgICAgIGJ1Zi0+aW92bS0+c2d0LT5uZW50cywKIAkJCQkJICAgICBETUFfRlJPTV9ERVZJQ0UpOwotCQkJaW9tbXVfdmZyZWUoaXNwLT5pb21tdSwgYnVmLT5pb21tdV9hZGRyKTsKKwkJCW9tYXBfaW9tbXVfdmZyZWUoaXNwLT5kb21haW4sIGlzcC0+aW9tbXUsCisJCQkJCQkJYnVmLT5pb21tdV9hZGRyKTsKIAkJfSBlbHNlIHsKIAkJCWlmICghYnVmLT52aXJ0X2FkZHIpCiAJCQkJY29udGludWU7CkBAIC0zOTksOCArNDAwLDggQEAKIAkJc3RydWN0IGlvdm1fc3RydWN0ICppb3ZtOwogCiAJCVdBUk5fT04oYnVmLT5kbWFfYWRkcik7Ci0JCWJ1Zi0+aW9tbXVfYWRkciA9IGlvbW11X3ZtYWxsb2MoaXNwLT5pb21tdSwgMCwgc2l6ZSwKLQkJCQkJCUlPTU1VX0ZMQUcpOworCQlidWYtPmlvbW11X2FkZHIgPSBvbWFwX2lvbW11X3ZtYWxsb2MoaXNwLT5kb21haW4sIGlzcC0+aW9tbXUsIDAsCisJCQkJCQkJc2l6ZSwgSU9NTVVfRkxBRyk7CiAJCWlmIChJU19FUlIoKHZvaWQgKilidWYtPmlvbW11X2FkZHIpKSB7CiAJCQlkZXZfZXJyKHN0YXQtPmlzcC0+ZGV2LAogCQkJCSAiJXM6IENhbid0IGFjcXVpcmUgbWVtb3J5IGZvciAiCkBAIC00MDksNyArNDEwLDcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKLQkJaW92bSA9IGZpbmRfaW92bV9hcmVhKGlzcC0+aW9tbXUsIGJ1Zi0+aW9tbXVfYWRkcik7CisJCWlvdm0gPSBvbWFwX2ZpbmRfaW92bV9hcmVhKGlzcC0+aW9tbXUsIGJ1Zi0+aW9tbXVfYWRkcik7CiAJCWlmICghaW92bSB8fAogCQkgICAgIWRtYV9tYXBfc2coaXNwLT5kZXYsIGlvdm0tPnNndC0+c2dsLCBpb3ZtLT5zZ3QtPm5lbnRzLAogCQkJCURNQV9GUk9NX0RFVklDRSkpIHsKQEAgLTQxOCw3ICs0MTksNyBAQAogCQl9CiAJCWJ1Zi0+aW92bSA9IGlvdm07CiAKLQkJYnVmLT52aXJ0X2FkZHIgPSBkYV90b192YShzdGF0LT5pc3AtPmlvbW11LAorCQlidWYtPnZpcnRfYWRkciA9IG9tYXBfZGFfdG9fdmEoc3RhdC0+aXNwLT5pb21tdSwKIAkJCQkJICAodTMyKWJ1Zi0+aW9tbXVfYWRkcik7CiAJCWJ1Zi0+ZW1wdHkgPSAxOwogCQlkZXZfZGJnKHN0YXQtPmlzcC0+ZGV2LCAiJXM6IGJ1ZmZlclslZF0gYWxsb2NhdGVkLiIKQEAgLTEwMjIsMjQgKzEwMjMsNiBAQAogCV9fc3RhdF9pc3Ioc3RhdCwgMSk7CiB9CiAKLXN0YXRpYyBpbnQgaXNwX3N0YXRfaW5pdF9lbnRpdGllcyhzdHJ1Y3QgaXNwc3RhdCAqc3RhdCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgKnNkX29wcykKLXsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiA9ICZzdGF0LT5zdWJkZXY7Ci0Jc3RydWN0IG1lZGlhX2VudGl0eSAqbWUgPSAmc3ViZGV2LT5lbnRpdHk7Ci0KLQl2NGwyX3N1YmRldl9pbml0KHN1YmRldiwgc2Rfb3BzKTsKLQlzbnByaW50ZihzdWJkZXYtPm5hbWUsIFY0TDJfU1VCREVWX05BTUVfU0laRSwgIk9NQVAzIElTUCAlcyIsIG5hbWUpOwotCXN1YmRldi0+Z3JwX2lkID0gMSA8PCAxNjsJLyogZ3JvdXAgSUQgZm9yIGlzcCBzdWJkZXZzICovCi0Jc3ViZGV2LT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTIHwgVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0JdjRsMl9zZXRfc3ViZGV2ZGF0YShzdWJkZXYsIHN0YXQpOwotCi0Jc3RhdC0+cGFkLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTks7Ci0JbWUtPm9wcyA9IE5VTEw7Ci0KLQlyZXR1cm4gbWVkaWFfZW50aXR5X2luaXQobWUsIDEsICZzdGF0LT5wYWQsIDApOwotfQotCiBpbnQgb21hcDNpc3Bfc3RhdF9zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCiAJCQkJICBzdHJ1Y3QgdjRsMl9maCAqZmgsCiAJCQkJICBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1YikKQEAgLTEwNjEsNyArMTA0NCw2IEBACiAKIHZvaWQgb21hcDNpc3Bfc3RhdF91bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BzdGF0ICpzdGF0KQogewotCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzdGF0LT5zdWJkZXYuZW50aXR5KTsKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmc3RhdC0+c3ViZGV2KTsKIH0KIApAQCAtMTA3MSwyMSArMTA1Myw1MCBAQAogCXJldHVybiB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJnN0YXQtPnN1YmRldik7CiB9CiAKK3N0YXRpYyBpbnQgaXNwX3N0YXRfaW5pdF9lbnRpdGllcyhzdHJ1Y3QgaXNwc3RhdCAqc3RhdCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgKnNkX29wcykKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiA9ICZzdGF0LT5zdWJkZXY7CisJc3RydWN0IG1lZGlhX2VudGl0eSAqbWUgPSAmc3ViZGV2LT5lbnRpdHk7CisKKwl2NGwyX3N1YmRldl9pbml0KHN1YmRldiwgc2Rfb3BzKTsKKwlzbnByaW50ZihzdWJkZXYtPm5hbWUsIFY0TDJfU1VCREVWX05BTUVfU0laRSwgIk9NQVAzIElTUCAlcyIsIG5hbWUpOworCXN1YmRldi0+Z3JwX2lkID0gMSA8PCAxNjsJLyogZ3JvdXAgSUQgZm9yIGlzcCBzdWJkZXZzICovCisJc3ViZGV2LT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTIHwgVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7CisJdjRsMl9zZXRfc3ViZGV2ZGF0YShzdWJkZXYsIHN0YXQpOworCisJc3RhdC0+cGFkLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTks7CisJbWUtPm9wcyA9IE5VTEw7CisKKwlyZXR1cm4gbWVkaWFfZW50aXR5X2luaXQobWUsIDEsICZzdGF0LT5wYWQsIDApOworfQorCiBpbnQgb21hcDNpc3Bfc3RhdF9pbml0KHN0cnVjdCBpc3BzdGF0ICpzdGF0LCBjb25zdCBjaGFyICpuYW1lLAogCQkgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyAqc2Rfb3BzKQogeworCWludCByZXQ7CisKIAlzdGF0LT5idWYgPSBrY2FsbG9jKFNUQVRfTUFYX0JVRlMsIHNpemVvZigqc3RhdC0+YnVmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzdGF0LT5idWYpCiAJCXJldHVybiAtRU5PTUVNOworCiAJaXNwX3N0YXRfYnVmX2NsZWFyKHN0YXQpOwogCW11dGV4X2luaXQoJnN0YXQtPmlvY3RsX2xvY2spOwogCWF0b21pY19zZXQoJnN0YXQtPmJ1Zl9lcnIsIDApOwogCi0JcmV0dXJuIGlzcF9zdGF0X2luaXRfZW50aXRpZXMoc3RhdCwgbmFtZSwgc2Rfb3BzKTsKKwlyZXQgPSBpc3Bfc3RhdF9pbml0X2VudGl0aWVzKHN0YXQsIG5hbWUsIHNkX29wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJbXV0ZXhfZGVzdHJveSgmc3RhdC0+aW9jdGxfbG9jayk7CisJCWtmcmVlKHN0YXQtPmJ1Zik7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBvbWFwM2lzcF9zdGF0X2ZyZWUoc3RydWN0IGlzcHN0YXQgKnN0YXQpCit2b2lkIG9tYXAzaXNwX3N0YXRfY2xlYW51cChzdHJ1Y3QgaXNwc3RhdCAqc3RhdCkKIHsKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmc3RhdC0+c3ViZGV2LmVudGl0eSk7CisJbXV0ZXhfZGVzdHJveSgmc3RhdC0+aW9jdGxfbG9jayk7CiAJaXNwX3N0YXRfYnVmc19mcmVlKHN0YXQpOwogCWtmcmVlKHN0YXQtPmJ1Zik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5oCmluZGV4IGQ4NmRhOTQuLjliN2M4NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5oCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAkJCQkgICAgIHN0cnVjdCBvbWFwM2lzcF9zdGF0X2RhdGEgKmRhdGEpOwogaW50IG9tYXAzaXNwX3N0YXRfaW5pdChzdHJ1Y3QgaXNwc3RhdCAqc3RhdCwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgKnNkX29wcyk7Ci12b2lkIG9tYXAzaXNwX3N0YXRfZnJlZShzdHJ1Y3QgaXNwc3RhdCAqc3RhdCk7Cit2b2lkIG9tYXAzaXNwX3N0YXRfY2xlYW51cChzdHJ1Y3QgaXNwc3RhdCAqc3RhdCk7CiBpbnQgb21hcDNpc3Bfc3RhdF9zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCiAJCQkJICBzdHJ1Y3QgdjRsMl9maCAqZmgsCiAJCQkJICBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1Yik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmMKaW5kZXggZmQ5NjVhZC4uZDEwMDA3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uYwpAQCAtMjc4LDcgKzI3OCw4IEBACiAgKiBsaW1pdHMgcmVwb3J0ZWQgYnkgZXZlcnkgYmxvY2sgaW4gdGhlIHBpcGVsaW5lLgogICoKICAqIFJldHVybiAwIGlmIGFsbCBmb3JtYXRzIG1hdGNoLCBvciAtRVBJUEUgaWYgYXQgbGVhc3Qgb25lIGxpbmsgaXMgZm91bmQgd2l0aAotICogZGlmZmVyZW50IGZvcm1hdHMgb24gaXRzIHR3byBlbmRzLgorICogZGlmZmVyZW50IGZvcm1hdHMgb24gaXRzIHR3byBlbmRzIG9yIGlmIHRoZSBwaXBlbGluZSBkb2Vzbid0IHN0YXJ0IHdpdGggYQorICogdmlkZW8gc291cmNlIChlaXRoZXIgYSBzdWJkZXYgd2l0aCBubyBpbnB1dCBwYWQsIG9yIGEgbm9uLXN1YmRldiBlbnRpdHkpLgogICovCiBzdGF0aWMgaW50IGlzcF92aWRlb192YWxpZGF0ZV9waXBlbGluZShzdHJ1Y3QgaXNwX3BpcGVsaW5lICpwaXBlKQogewpAQCAtMzI5LDEwICszMzAsMTUgQEAKIAkJICogaW4gdGhlIG1pZGRsZSBvZiBpdC4gKi8KIAkJc2hpZnRlcl9saW5rID0gc3ViZGV2ID09ICZpc3AtPmlzcF9jY2RjLnN1YmRldjsKIAotCQkvKiBSZXRyaWV2ZSB0aGUgc291cmNlIGZvcm1hdCAqLworCQkvKiBSZXRyaWV2ZSB0aGUgc291cmNlIGZvcm1hdC4gUmV0dXJuIGFuIGVycm9yIGlmIG5vIHNvdXJjZQorCQkgKiBlbnRpdHkgY2FuIGJlIGZvdW5kLCBhbmQgc3RvcCBjaGVja2luZyB0aGUgcGlwZWxpbmUgaWYgdGhlCisJCSAqIHNvdXJjZSBlbnRpdHkgaXNuJ3QgYSBzdWJkZXYuCisJCSAqLwogCQlwYWQgPSBtZWRpYV9lbnRpdHlfcmVtb3RlX3NvdXJjZShwYWQpOwotCQlpZiAocGFkID09IE5VTEwgfHwKLQkJICAgIG1lZGlhX2VudGl0eV90eXBlKHBhZC0+ZW50aXR5KSAhPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVikKKwkJaWYgKHBhZCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FUElQRTsKKworCQlpZiAobWVkaWFfZW50aXR5X3R5cGUocGFkLT5lbnRpdHkpICE9IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWKQogCQkJYnJlYWs7CiAKIAkJc3ViZGV2ID0gbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KHBhZC0+ZW50aXR5KTsKQEAgLTQ0Niw3ICs0NTIsNyBAQAogCXNndC0+bmVudHMgPSBzZ2xlbjsKIAlzZ3QtPm9yaWdfbmVudHMgPSBzZ2xlbjsKIAotCWRhID0gaW9tbXVfdm1hcChpc3AtPmlvbW11LCAwLCBzZ3QsIElPTU1VX0ZMQUcpOworCWRhID0gb21hcF9pb21tdV92bWFwKGlzcC0+ZG9tYWluLCBpc3AtPmlvbW11LCAwLCBzZ3QsIElPTU1VX0ZMQUcpOwogCWlmIChJU19FUlJfVkFMVUUoZGEpKQogCQlrZnJlZShzZ3QpOwogCkBAIC00NjIsNyArNDY4LDcgQEAKIHsKIAlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKIAotCXNndCA9IGlvbW11X3Z1bm1hcChpc3AtPmlvbW11LCAodTMyKWRhKTsKKwlzZ3QgPSBvbWFwX2lvbW11X3Z1bm1hcChpc3AtPmRvbWFpbiwgaXNwLT5pb21tdSwgKHUzMilkYSk7CiAJa2ZyZWUoc2d0KTsKIH0KIApAQCAtMTA1MCw2ICsxMDU2LDE0IEBACiAJCWlmICh2aWRlby0+aXNwLT5wZGF0YS0+c2V0X2NvbnN0cmFpbnRzKQogCQkJdmlkZW8tPmlzcC0+cGRhdGEtPnNldF9jb25zdHJhaW50cyh2aWRlby0+aXNwLCBmYWxzZSk7CiAJCW1lZGlhX2VudGl0eV9waXBlbGluZV9zdG9wKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKKwkJLyogVGhlIERNQSBxdWV1ZSBtdXN0IGJlIGVtcHRpZWQgaGVyZSwgb3RoZXJ3aXNlIENDREMgaW50ZXJydXB0cworCQkgKiB0aGF0IHdpbGwgZ2V0IHRyaWdnZXJlZCB0aGUgbmV4dCB0aW1lIHRoZSBDQ0RDIGlzIHBvd2VyZWQgdXAKKwkJICogd2lsbCB0cnkgdG8gYWNjZXNzIGJ1ZmZlcnMgdGhhdCBtaWdodCBoYXZlIGJlZW4gZnJlZWQgYnV0CisJCSAqIHN0aWxsIHByZXNlbnQgaW4gdGhlIERNQSBxdWV1ZS4gVGhpcyBjYW4gZWFzaWx5IGdldCB0cmlnZ2VyZWQKKwkJICogaWYgdGhlIGFib3ZlIG9tYXAzaXNwX3BpcGVsaW5lX3NldF9zdHJlYW0oKSBjYWxsIGZhaWxzIG9uIGEKKwkJICogc3lzdGVtIHdpdGggYSBmcmVlLXJ1bm5pbmcgc2Vuc29yLgorCQkgKi8KKwkJSU5JVF9MSVNUX0hFQUQoJnZpZGVvLT5kbWFxdWV1ZSk7CiAJCXZpZGVvLT5xdWV1ZSA9IE5VTEw7CiAJfQogCkBAIC0xMzExLDYgKzEzMjUsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBvbWFwM2lzcF92aWRlb19jbGVhbnVwKHN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvKQoreworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKKwltdXRleF9kZXN0cm95KCZ2aWRlby0+c3RyZWFtX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJnZpZGVvLT5tdXRleCk7Cit9CisKIGludCBvbWFwM2lzcF92aWRlb19yZWdpc3RlcihzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbywgc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQogewogCWludCByZXQ7CkBAIC0xMzI3LDggKzEzNDgsNiBAQAogCiB2b2lkIG9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoc3RydWN0IGlzcF92aWRlbyAqdmlkZW8pCiB7Ci0JaWYgKHZpZGVvX2lzX3JlZ2lzdGVyZWQoJnZpZGVvLT52aWRlbykpIHsKLQkJbWVkaWFfZW50aXR5X2NsZWFudXAoJnZpZGVvLT52aWRlby5lbnRpdHkpOworCWlmICh2aWRlb19pc19yZWdpc3RlcmVkKCZ2aWRlby0+dmlkZW8pKQogCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmdmlkZW8tPnZpZGVvKTsKLQl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmgKaW5kZXggNTMxNjBhYS4uMDhjYmZhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uaApAQCAtMTkwLDYgKzE5MCw3IEBACiAJCQkJY29udGFpbmVyX29mKHEsIHN0cnVjdCBpc3BfdmlkZW9fZmgsIHF1ZXVlKQogCiBpbnQgb21hcDNpc3BfdmlkZW9faW5pdChzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbywgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIG9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoc3RydWN0IGlzcF92aWRlbyAqdmlkZW8pOwogaW50IG9tYXAzaXNwX3ZpZGVvX3JlZ2lzdGVyKHN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvLAogCQkJICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdmRldik7CiB2b2lkIG9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoc3RydWN0IGlzcF92aWRlbyAqdmlkZW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjI2NDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3YyNjQwLmMKaW5kZXggOWNlMmZhMC4uYjUyNDdjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjI2NDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292MjY0MC5jCkBAIC0xOCwxMSArMTgsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KLSNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc29jX21lZGlhYnVzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogCiAjZGVmaW5lIFZBTF9TRVQoeCwgbWFzaywgcnNoaWZ0LCBsc2hpZnQpICBcCiAJCSgoKCh4KSA+PiByc2hpZnQpICYgbWFzaykgPDwgbHNoaWZ0KQpAQCAtMjk5LDEyICszMDEsMTAgQEAKIAogc3RydWN0IG92MjY0MF9wcml2IHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKLQlzdHJ1Y3Qgb3YyNjQwX2NhbWVyYV9pbmZvCSppbmZvOworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlcgloZGw7CiAJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlCWNmbXRfY29kZTsKIAljb25zdCBzdHJ1Y3Qgb3YyNjQwX3dpbl9zaXplCSp3aW47CiAJaW50CQkJCW1vZGVsOwotCXUxNgkJCQlmbGFnX3ZmbGlwOjE7Ci0JdTE2CQkJCWZsYWdfaGZsaXA6MTsKIH07CiAKIC8qCkBAIC02MTAsMjkgKzYxMCw2IEBACiB9OwogCiAvKgotICogU3VwcG9ydGVkIGNvbnRyb2xzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgb3YyNjQwX2NvbnRyb2xzW10gPSB7Ci0JewotCQkuaWQJCT0gVjRMMl9DSURfVkZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJGbGlwIFZlcnRpY2FsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBIb3Jpem9udGFsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sCi19OwotCi0vKgogICogR2VuZXJhbCBmdW5jdGlvbnMKICAqLwogc3RhdGljIHN0cnVjdCBvdjI2NDBfcHJpdiAqdG9fb3YyNjQwKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC03MDEsODEgKzY3OCwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG92MjY0MF9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW50IG92MjY0MF9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQl1bnNpZ25lZCBsb25nIHdpZHRoX2ZsYWcgPSBmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF9NQVNLOwotCi0JLyogT25seSBvbmUgd2lkdGggYml0IG1heSBiZSBzZXQgKi8KLQlpZiAoIWlzX3Bvd2VyX29mXzIod2lkdGhfZmxhZykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGljbC0+c2V0X2J1c19wYXJhbSkKLQkJcmV0dXJuIGljbC0+c2V0X2J1c19wYXJhbShpY2wsIHdpZHRoX2ZsYWcpOwotCi0JLyoKLQkgKiBXaXRob3V0IGJvYXJkIHNwZWNpZmljIGJ1cyB3aWR0aCBzZXR0aW5ncyB3ZSBzdXBwb3J0IG9ubHkgdGhlCi0JICogc2Vuc29ycyBuYXRpdmUgYnVzIHdpZHRoIHdpdGNoIGFyZSB0ZXN0ZWQgd29ya2luZwotCSAqLwotCWlmICh3aWR0aF9mbGFnICYgKFNPQ0FNX0RBVEFXSURUSF8xMCB8IFNPQ0FNX0RBVEFXSURUSF84KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3YyNjQwX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fTUFTVEVSIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0g7Ci0KLQlpZiAoaWNsLT5xdWVyeV9idXNfcGFyYW0pCi0JCWZsYWdzIHw9IGljbC0+cXVlcnlfYnVzX3BhcmFtKGljbCkgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSzsKLQllbHNlCi0JCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF8xMDsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBvdjI2NDBfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9CisJCSZjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IG92MjY0MF9wcml2LCBoZGwpLT5zdWJkZXY7CiAJc3RydWN0IGkyY19jbGllbnQgICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3Qgb3YyNjQwX3ByaXYgKnByaXYgPSB0b19vdjI2NDAoY2xpZW50KTsKLQotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQljdHJsLT52YWx1ZSA9IHByaXYtPmZsYWdfdmZsaXA7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+ZmxhZ19oZmxpcDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92MjY0MF9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBvdjI2NDBfcHJpdiAqcHJpdiA9IHRvX292MjY0MChjbGllbnQpOwotCWludCByZXQgPSAwOwogCXU4IHZhbDsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQl2YWwgPSBjdHJsLT52YWx1ZSA/IFJFRzA0X1ZGTElQX0lNRyA6IDB4MDA7Ci0JCXByaXYtPmZsYWdfdmZsaXAgPSBjdHJsLT52YWx1ZSA/IDEgOiAwOwotCQlyZXQgPSBvdjI2NDBfbWFza19zZXQoY2xpZW50LCBSRUcwNCwgUkVHMDRfVkZMSVBfSU1HLCB2YWwpOwotCQlicmVhazsKKwkJdmFsID0gY3RybC0+dmFsID8gUkVHMDRfVkZMSVBfSU1HIDogMHgwMDsKKwkJcmV0dXJuIG92MjY0MF9tYXNrX3NldChjbGllbnQsIFJFRzA0LCBSRUcwNF9WRkxJUF9JTUcsIHZhbCk7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJdmFsID0gY3RybC0+dmFsdWUgPyBSRUcwNF9IRkxJUF9JTUcgOiAweDAwOwotCQlwcml2LT5mbGFnX2hmbGlwID0gY3RybC0+dmFsdWUgPyAxIDogMDsKLQkJcmV0ID0gb3YyNjQwX21hc2tfc2V0KGNsaWVudCwgUkVHMDQsIFJFRzA0X0hGTElQX0lNRywgdmFsKTsKLQkJYnJlYWs7CisJCXZhbCA9IGN0cmwtPnZhbCA/IFJFRzA0X0hGTElQX0lNRyA6IDB4MDA7CisJCXJldHVybiBvdjI2NDBfbWFza19zZXQoY2xpZW50LCBSRUcwNCwgUkVHMDRfSEZMSVBfSU1HLCB2YWwpOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgb3YyNjQwX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLApAQCAtMTAyMywxOCArOTQyLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3YyNjQwX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgb3YyNjQwX3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG92MjY0MF9wcml2ICpwcml2ID0gdG9fb3YyNjQwKGNsaWVudCk7CiAJdTggcGlkLCB2ZXIsIG1pZGgsIG1pZGw7CiAJY29uc3QgY2hhciAqZGV2bmFtZTsKIAlpbnQgcmV0OwogCi0JLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KLQlCVUdfT04oIWljZC0+cGFyZW50IHx8Ci0JICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwotCiAJLyoKIAkgKiBjaGVjayBhbmQgc2hvdyBwcm9kdWN0IElEIGFuZCBtYW51ZmFjdHVyZXIgSUQKIAkgKi8KQEAgLTEwNjAsMjIgKzk3NCwxNyBAQAogCQkgIiVzIFByb2R1Y3QgSUQgJTB4OiUweCBNYW51ZmFjdHVyZXIgSUQgJXg6JXhcbiIsCiAJCSBkZXZuYW1lLCBwaWQsIHZlciwgbWlkaCwgbWlkbCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJnByaXYtPmhkbCk7CiAKIGVycjoKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfb3BzIG92MjY0MF9vcHMgPSB7Ci0JLnNldF9idXNfcGFyYW0JCT0gb3YyNjQwX3NldF9idXNfcGFyYW0sCi0JLnF1ZXJ5X2J1c19wYXJhbQk9IG92MjY0MF9xdWVyeV9idXNfcGFyYW0sCi0JLmNvbnRyb2xzCQk9IG92MjY0MF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUob3YyNjQwX2NvbnRyb2xzKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBvdjI2NDBfY3RybF9vcHMgPSB7CisJLnNfY3RybCA9IG92MjY0MF9zX2N0cmwsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG92MjY0MF9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmdfY3RybAkJPSBvdjI2NDBfZ19jdHJsLAotCS5zX2N0cmwJCT0gb3YyNjQwX3NfY3RybCwKIAkuZ19jaGlwX2lkZW50CT0gb3YyNjQwX2dfY2hpcF9pZGVudCwKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiAJLmdfcmVnaXN0ZXIJPSBvdjI2NDBfZ19yZWdpc3RlciwKQEAgLTEwODMsNiArOTkyLDIxIEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBpbnQgb3YyNjQwX2dfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisKKwljZmctPmZsYWdzID0gVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8IFY0TDJfTUJVU19NQVNURVIgfAorCQlWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSDsKKwljZmctPnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUw7CisJY2ZnLT5mbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG92MjY0MF9zdWJkZXZfdmlkZW9fb3BzID0gewogCS5zX3N0cmVhbQk9IG92MjY0MF9zX3N0cmVhbSwKIAkuZ19tYnVzX2ZtdAk9IG92MjY0MF9nX2ZtdCwKQEAgLTEwOTEsNiArMTAxNSw3IEBACiAJLmNyb3BjYXAJPSBvdjI2NDBfY3JvcGNhcCwKIAkuZ19jcm9wCQk9IG92MjY0MF9nX2Nyb3AsCiAJLmVudW1fbWJ1c19mbXQJPSBvdjI2NDBfZW51bV9mbXQsCisJLmdfbWJ1c19jb25maWcJPSBvdjI2NDBfZ19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG92MjY0MF9zdWJkZXZfb3BzID0gewpAQCAtMTEwNCwxOCArMTAyOSwxMSBAQAogc3RhdGljIGludCBvdjI2NDBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7Ci0Jc3RydWN0IG92MjY0MF9wcml2ICAgICAgICAqcHJpdjsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBpMmNfYWRhcHRlciAgICAgICAgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgICAgKmljbDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICByZXQ7CisJc3RydWN0IG92MjY0MF9wcml2CSpwcml2OworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsJKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOworCWludAkJCXJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIk9WMjY0MDogbWlzc2luZyBzb2MtY2FtZXJhIGRhdGEhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJaWYgKCFpY2wpIHsKIAkJZGV2X2VycigmYWRhcHRlci0+ZGV2LAogCQkJIk9WMjY0MDogTWlzc2luZyBwbGF0Zm9ybV9kYXRhIGZvciBkcml2ZXJcbiIpOwpAQCAtMTEzNSwxNSArMTA1MywyMyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlwcml2LT5pbmZvID0gaWNsLT5wcml2OwotCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgY2xpZW50LCAmb3YyNjQwX3N1YmRldl9vcHMpOworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJnByaXYtPmhkbCwgMik7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92MjY0MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3YyNjQwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCXByaXYtPnN1YmRldi5jdHJsX2hhbmRsZXIgPSAmcHJpdi0+aGRsOworCWlmIChwcml2LT5oZGwuZXJyb3IpIHsKKwkJaW50IGVyciA9IHByaXYtPmhkbC5lcnJvcjsKIAotCWljZC0+b3BzID0gJm92MjY0MF9vcHM7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gZXJyOworCX0KIAotCXJldCA9IG92MjY0MF92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJcmV0ID0gb3YyNjQwX3ZpZGVvX3Byb2JlKGNsaWVudCk7CiAJaWYgKHJldCkgewotCQlpY2QtPm9wcyA9IE5VTEw7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnByaXYtPmhkbCk7CiAJCWtmcmVlKHByaXYpOwogCX0gZWxzZSB7CiAJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsICJPVjI2NDAgUHJvYmVkXG4iKTsKQEAgLTExNTUsOSArMTA4MSw5IEBACiBzdGF0aWMgaW50IG92MjY0MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3Qgb3YyNjQwX3ByaXYgICAgICAgKnByaXYgPSB0b19vdjI2NDAoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQlpY2QtPm9wcyA9IE5VTEw7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnByaXYtPnN1YmRldik7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcHJpdi0+aGRsKTsKIAlrZnJlZShwcml2KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1NjQyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTY0Mi5jCmluZGV4IDM0OWE0YWQuLmJiMzdlYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1NjQyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjU2NDIuYwpAQCAtMTQsMTQgKzE0LDE2IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CiAKQEAgLTM1LDcgKzM3LDcgQEAKICNkZWZpbmUgUkVHX1dJTkRPV19TVEFSVF9ZX0xPVwkJMHgzODAzCiAjZGVmaW5lIFJFR19XSU5ET1dfV0lEVEhfSElHSAkJMHgzODA0CiAjZGVmaW5lIFJFR19XSU5ET1dfV0lEVEhfTE9XCQkweDM4MDUKLSNkZWZpbmUgUkVHX1dJTkRPV19IRUlHSFRfSElHSCAJCTB4MzgwNgorI2RlZmluZSBSRUdfV0lORE9XX0hFSUdIVF9ISUdICQkweDM4MDYKICNkZWZpbmUgUkVHX1dJTkRPV19IRUlHSFRfTE9XCQkweDM4MDcKICNkZWZpbmUgUkVHX09VVF9XSURUSF9ISUdICQkweDM4MDgKICNkZWZpbmUgUkVHX09VVF9XSURUSF9MT1cJCTB4MzgwOQpAQCAtNDUsMjAgKzQ3LDQ1IEBACiAjZGVmaW5lIFJFR19PVVRfVE9UQUxfV0lEVEhfTE9XCQkweDM4MGQKICNkZWZpbmUgUkVHX09VVF9UT1RBTF9IRUlHSFRfSElHSAkweDM4MGUKICNkZWZpbmUgUkVHX09VVF9UT1RBTF9IRUlHSFRfTE9XCTB4MzgwZgorI2RlZmluZSBSRUdfT1VUUFVUX0ZPUk1BVAkJMHg0MzAwCisjZGVmaW5lIFJFR19JU1BfQ1RSTF8wMQkJCTB4NTAwMQorI2RlZmluZSBSRUdfQVZHX1dJTkRPV19FTkRfWF9ISUdICTB4NTY4MgorI2RlZmluZSBSRUdfQVZHX1dJTkRPV19FTkRfWF9MT1cJMHg1NjgzCisjZGVmaW5lIFJFR19BVkdfV0lORE9XX0VORF9ZX0hJR0gJMHg1Njg2CisjZGVmaW5lIFJFR19BVkdfV0lORE9XX0VORF9ZX0xPVwkweDU2ODcKIAotLyoKLSAqIGRlZmluZSBzdGFuZGFyZCByZXNvbHV0aW9uLgotICogV29ya3MgY3VycmVudGx5IG9ubHkgZm9yIHVwIHRvIDcyMCBsaW5lcwotICogZWcuIDMyMHgyNDAsIDY0MHg0ODAsIDgwMHg2MDAsIDEyODB4NzIwLCAyMDQ4eDcyMAotICovCi0KLSNkZWZpbmUgT1Y1NjQyX1dJRFRICQkxMjgwCi0jZGVmaW5lIE9WNTY0Ml9IRUlHSFQJCTcyMAotI2RlZmluZSBPVjU2NDJfVE9UQUxfV0lEVEgJMzIwMAotI2RlZmluZSBPVjU2NDJfVE9UQUxfSEVJR0hUCTIwMDAKKy8qIGFjdGl2ZSBwaXhlbCBhcnJheSBzaXplICovCiAjZGVmaW5lIE9WNTY0Ml9TRU5TT1JfU0laRV9YCTI1OTIKICNkZWZpbmUgT1Y1NjQyX1NFTlNPUl9TSVpFX1kJMTk0NAogCisvKgorICogQWJvdXQgT1Y1NjQyIHJlc29sdXRpb24sIGNyb3BwaW5nIGFuZCBiaW5uaW5nOgorICogVGhpcyBzZW5zb3Igc3VwcG9ydHMgaXQgYWxsLCBhdCBsZWFzdCBpbiB0aGUgZmVhdHVyZSBkZXNjcmlwdGlvbi4KKyAqIFVuZm9ydHVuYXRlbHksIG5vIGNvbWJpbmF0aW9uIG9mIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBzZXR0aW5ncyBjb3VsZCBtYWtlCisgKiB0aGUgY2hpcCB3b3JrIHRoZSBpbnRlbmRlZCB3YXkuIEFzIGl0IHdvcmtzIHdpdGggcHJlZGVmaW5lZCByZWdpc3RlciBsaXN0cywKKyAqIHNvbWUgdW5kb2N1bWVudGVkIHJlZ2lzdGVycyBhcmUgcHJlc3VtYWJseSBjaGFuZ2VkIHRoZXJlIHRvIGFjaGlldmUgdGhlaXIKKyAqIGdvYWxzLgorICogVGhpcyBkcml2ZXIgY3VycmVudGx5IG9ubHkgd29ya3MgZm9yIHJlc29sdXRpb25zIHVwIHRvIDcyMCBsaW5lcyB3aXRoIGEKKyAqIDE6MSBzY2FsZS4gSG9wZWZ1bGx5IHRoZXNlIHJlc3RyaWN0aW9ucyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAqLworI2RlZmluZSBPVjU2NDJfTUFYX1dJRFRICU9WNTY0Ml9TRU5TT1JfU0laRV9YCisjZGVmaW5lIE9WNTY0Ml9NQVhfSEVJR0hUCTcyMAorCisvKiBkZWZhdWx0IHNpemVzICovCisjZGVmaW5lIE9WNTY0Ml9ERUZBVUxUX1dJRFRICTEyODAKKyNkZWZpbmUgT1Y1NjQyX0RFRkFVTFRfSEVJR0hUCU9WNTY0Ml9NQVhfSEVJR0hUCisKKy8qIG1pbmltdW0gZXh0cmEgYmxhbmtpbmcgKi8KKyNkZWZpbmUgQkxBTktJTkdfRVhUUkFfV0lEVEgJCTUwMAorI2RlZmluZSBCTEFOS0lOR19FWFRSQV9IRUlHSFQJCTIwCisKKy8qCisgKiB0aGUgc2Vuc29yJ3MgYXV0b2V4cG9zdXJlIGlzIGJ1Z2d5IHdoZW4gc2V0dGluZyB0b3RhbF9oZWlnaHQgbG93LgorICogSXQgdHJpZXMgdG8gZXhwb3NlIGxvbmdlciB0aGFuIDEgZnJhbWUgcGVyaW9kIHdpdGhvdXQgdGFraW5nIGNhcmUgb2YgaXQKKyAqIGFuZCB0aGlzIGxlYWRzIHRvIHdlaXJkIG91dHB1dC4gU28gd2Ugc2V0IDEwMDAgbGluZXMgYXMgbWluaW11bS4KKyAqLworI2RlZmluZSBCTEFOS0lOR19NSU5fSEVJR0hUCQkxMDAwCisKIHN0cnVjdCByZWd2YWxfbGlzdCB7CiAJdTE2IHJlZ19udW07CiAJdTggdmFsdWU7CkBAIC01ODIsNiArNjA5LDExIEBACiBzdHJ1Y3Qgb3Y1NjQyIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKIAljb25zdCBzdHJ1Y3Qgb3Y1NjQyX2RhdGFmbXQJKmZtdDsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICAgICAgICAgIGNyb3BfcmVjdDsKKworCS8qIGJsYW5raW5nIGluZm9ybWF0aW9uICovCisJaW50IHRvdGFsX3dpZHRoOworCWludCB0b3RhbF9oZWlnaHQ7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG92NTY0Ml9kYXRhZm10IG92NTY0Ml9jb2xvdXJfZm10c1tdID0gewpAQCAtNjQyLDYgKzY3NCwyMSBAQAogCiAJcmV0dXJuIDA7CiB9CisKKy8qCisgKiBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byB3cml0ZSAxNiBiaXQgcmVnaXN0ZXIgdmFsdWVzIHRoYXQgYXJlIHNwbGl0IHVwCisgKiBpbnRvIHR3byBjb25zZWN1dGl2ZSBoaWdoIGFuZCBsb3cgcGFydHMKKyAqLworc3RhdGljIGludCByZWdfd3JpdGUxNihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnLCB1MTYgdmFsMTYpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ193cml0ZShjbGllbnQsIHJlZywgdmFsMTYgPj4gOCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gcmVnX3dyaXRlKGNsaWVudCwgcmVnICsgMSwgdmFsMTYgJiAweDAwZmYpOworfQorCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogc3RhdGljIGludCBvdjU2NDJfZ2V0X3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQogewpAQCAtNjg1LDU4ICs3MzIsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvdjU2NDJfc2V0X3Jlc29sdXRpb24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgb3Y1NjQyX3NldF9yZXNvbHV0aW9uKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBvdjU2NDIgKnByaXYgPSB0b19vdjU2NDIoY2xpZW50KTsKKwlpbnQgd2lkdGggPSBwcml2LT5jcm9wX3JlY3Qud2lkdGg7CisJaW50IGhlaWdodCA9IHByaXYtPmNyb3BfcmVjdC5oZWlnaHQ7CisJaW50IHRvdGFsX3dpZHRoID0gcHJpdi0+dG90YWxfd2lkdGg7CisJaW50IHRvdGFsX2hlaWdodCA9IHByaXYtPnRvdGFsX2hlaWdodDsKKwlpbnQgc3RhcnRfeCA9IChPVjU2NDJfU0VOU09SX1NJWkVfWCAtIHdpZHRoKSAvIDI7CisJaW50IHN0YXJ0X3kgPSAoT1Y1NjQyX1NFTlNPUl9TSVpFX1kgLSBoZWlnaHQpIC8gMjsKIAlpbnQgcmV0OwotCXU4IHN0YXJ0X3hfaGlnaCA9ICgoT1Y1NjQyX1NFTlNPUl9TSVpFX1ggLSBPVjU2NDJfV0lEVEgpIC8gMikgPj4gODsKLQl1OCBzdGFydF94X2xvdyAgPSAoKE9WNTY0Ml9TRU5TT1JfU0laRV9YIC0gT1Y1NjQyX1dJRFRIKSAvIDIpICYgMHhmZjsKLQl1OCBzdGFydF95X2hpZ2ggPSAoKE9WNTY0Ml9TRU5TT1JfU0laRV9ZIC0gT1Y1NjQyX0hFSUdIVCkgLyAyKSA+PiA4OwotCXU4IHN0YXJ0X3lfbG93ICA9ICgoT1Y1NjQyX1NFTlNPUl9TSVpFX1kgLSBPVjU2NDJfSEVJR0hUKSAvIDIpICYgMHhmZjsKIAotCXU4IHdpZHRoX2hpZ2gJPSBPVjU2NDJfV0lEVEggID4+IDg7Ci0JdTggd2lkdGhfbG93CT0gT1Y1NjQyX1dJRFRIICAmIDB4ZmY7Ci0JdTggaGVpZ2h0X2hpZ2gJPSBPVjU2NDJfSEVJR0hUID4+IDg7Ci0JdTggaGVpZ2h0X2xvdwk9IE9WNTY0Ml9IRUlHSFQgJiAweGZmOwotCi0JdTggdG90YWxfd2lkdGhfaGlnaCAgPSBPVjU2NDJfVE9UQUxfV0lEVEggID4+IDg7Ci0JdTggdG90YWxfd2lkdGhfbG93ICAgPSBPVjU2NDJfVE9UQUxfV0lEVEggICYgMHhmZjsKLQl1OCB0b3RhbF9oZWlnaHRfaGlnaCA9IE9WNTY0Ml9UT1RBTF9IRUlHSFQgPj4gODsKLQl1OCB0b3RhbF9oZWlnaHRfbG93ICA9IE9WNTY0Ml9UT1RBTF9IRUlHSFQgJiAweGZmOwotCi0JcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19TVEFSVF9YX0hJR0gsIHN0YXJ0X3hfaGlnaCk7CisJLyoKKwkgKiBUaGlzIHNob3VsZCBzZXQgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBjcm9wcGluZy4KKwkgKiBEb2Vzbid0IHdvcmsgc28gZmFyLgorCSAqLworCXJldCA9IHJlZ193cml0ZTE2KGNsaWVudCwgUkVHX1dJTkRPV19TVEFSVF9YX0hJR0gsIHN0YXJ0X3gpOwogCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1NUQVJUX1hfTE9XLCBzdGFydF94X2xvdyk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfU1RBUlRfWV9ISUdILCBzdGFydF95X2hpZ2gpOwotCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1NUQVJUX1lfTE9XLCBzdGFydF95X2xvdyk7CisJCXJldCA9IHJlZ193cml0ZTE2KGNsaWVudCwgUkVHX1dJTkRPV19TVEFSVF9ZX0hJR0gsIHN0YXJ0X3kpOworCWlmICghcmV0KSB7CisJCXByaXYtPmNyb3BfcmVjdC5sZWZ0ID0gc3RhcnRfeDsKKwkJcHJpdi0+Y3JvcF9yZWN0LnRvcCA9IHN0YXJ0X3k7CisJfQogCiAJaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfV0lEVEhfSElHSCwgd2lkdGhfaGlnaCk7CisJCXJldCA9IHJlZ193cml0ZTE2KGNsaWVudCwgUkVHX1dJTkRPV19XSURUSF9ISUdILCB3aWR0aCk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfV0lEVEhfTE9XICwgd2lkdGhfbG93KTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19IRUlHSFRfSElHSCwgaGVpZ2h0X2hpZ2gpOwotCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX0hFSUdIVF9MT1csICBoZWlnaHRfbG93KTsKKwkJcmV0ID0gcmVnX3dyaXRlMTYoY2xpZW50LCBSRUdfV0lORE9XX0hFSUdIVF9ISUdILCBoZWlnaHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcHJpdi0+Y3JvcF9yZWN0LndpZHRoID0gd2lkdGg7CisJcHJpdi0+Y3JvcF9yZWN0LmhlaWdodCA9IGhlaWdodDsKIAorCS8qIFNldCB0aGUgb3V0cHV0IHdpbmRvdyBzaXplLiBPbmx5IDE6MSBzY2FsZSBpcyBzdXBwb3J0ZWQgc28gZmFyLiAqLworCXJldCA9IHJlZ193cml0ZTE2KGNsaWVudCwgUkVHX09VVF9XSURUSF9ISUdILCB3aWR0aCk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfV0lEVEhfSElHSCwgd2lkdGhfaGlnaCk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfV0lEVEhfTE9XICwgd2lkdGhfbG93KTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9IRUlHSFRfSElHSCwgaGVpZ2h0X2hpZ2gpOwotCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX0hFSUdIVF9MT1csICBoZWlnaHRfbG93KTsKKwkJcmV0ID0gcmVnX3dyaXRlMTYoY2xpZW50LCBSRUdfT1VUX0hFSUdIVF9ISUdILCBoZWlnaHQpOwogCisJLyogVG90YWwgd2lkdGggPSBvdXRwdXQgc2l6ZSArIGJsYW5raW5nICovCiAJaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfVE9UQUxfV0lEVEhfSElHSCwgdG90YWxfd2lkdGhfaGlnaCk7CisJCXJldCA9IHJlZ193cml0ZTE2KGNsaWVudCwgUkVHX09VVF9UT1RBTF9XSURUSF9ISUdILCB0b3RhbF93aWR0aCk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfVE9UQUxfV0lEVEhfTE9XLCB0b3RhbF93aWR0aF9sb3cpOworCQlyZXQgPSByZWdfd3JpdGUxNihjbGllbnQsIFJFR19PVVRfVE9UQUxfSEVJR0hUX0hJR0gsIHRvdGFsX2hlaWdodCk7CisKKwkvKiBTZXRzIHRoZSB3aW5kb3cgZm9yIEFXQiBjYWxjdWxhdGlvbnMgKi8KIAlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9UT1RBTF9IRUlHSFRfSElHSCwgdG90YWxfaGVpZ2h0X2hpZ2gpOworCQlyZXQgPSByZWdfd3JpdGUxNihjbGllbnQsIFJFR19BVkdfV0lORE9XX0VORF9YX0hJR0gsIHdpZHRoKTsKIAlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9UT1RBTF9IRUlHSFRfTE9XLCAgdG90YWxfaGVpZ2h0X2xvdyk7CisJCXJldCA9IHJlZ193cml0ZTE2KGNsaWVudCwgUkVHX0FWR19XSU5ET1dfRU5EX1lfSElHSCwgaGVpZ2h0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03NDQsMTggKzc4OCwxOCBAQAogc3RhdGljIGludCBvdjU2NDJfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IG92NTY0MiAqcHJpdiA9IHRvX292NTY0MihjbGllbnQpOwogCWNvbnN0IHN0cnVjdCBvdjU2NDJfZGF0YWZtdCAqZm10ID0gb3Y1NjQyX2ZpbmRfZGF0YWZtdChtZi0+Y29kZSk7CiAKLQlkZXZfZGJnKHNkLT52NGwyX2Rldi0+ZGV2LCAiJXMoJXUpIHdpZHRoOiAldSBoZWlndGg6ICV1XG4iLAotCQkJX19mdW5jX18sIG1mLT5jb2RlLCBtZi0+d2lkdGgsIG1mLT5oZWlnaHQpOworCW1mLT53aWR0aCA9IHByaXYtPmNyb3BfcmVjdC53aWR0aDsKKwltZi0+aGVpZ2h0ID0gcHJpdi0+Y3JvcF9yZWN0LmhlaWdodDsKIAogCWlmICghZm10KSB7CiAJCW1mLT5jb2RlCT0gb3Y1NjQyX2NvbG91cl9mbXRzWzBdLmNvZGU7CiAJCW1mLT5jb2xvcnNwYWNlCT0gb3Y1NjQyX2NvbG91cl9mbXRzWzBdLmNvbG9yc3BhY2U7CiAJfQogCi0JbWYtPndpZHRoCT0gT1Y1NjQyX1dJRFRIOwotCW1mLT5oZWlnaHQJPSBPVjU2NDJfSEVJR0hUOwogCW1mLT5maWVsZAk9IFY0TDJfRklFTERfTk9ORTsKIAogCXJldHVybiAwOwpAQCAtNzY3LDIwICs4MTEsMTMgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IG92NTY0MiAqcHJpdiA9IHRvX292NTY0MihjbGllbnQpOwogCi0JZGV2X2RiZyhzZC0+djRsMl9kZXYtPmRldiwgIiVzKCV1KVxuIiwgX19mdW5jX18sIG1mLT5jb2RlKTsKLQogCS8qIE1JUEkgQ1NJIGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgZm9ybWF0LCBkb3VibGUtY2hlY2sgKi8KIAlpZiAoIW92NTY0Ml9maW5kX2RhdGFmbXQobWYtPmNvZGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW92NTY0Ml90cnlfZm10KHNkLCBtZik7Ci0KIAlwcml2LT5mbXQgPSBvdjU2NDJfZmluZF9kYXRhZm10KG1mLT5jb2RlKTsKIAotCW92NTY0Ml93cml0ZV9hcnJheShjbGllbnQsIG92NTY0Ml9kZWZhdWx0X3JlZ3NfaW5pdCk7Ci0Jb3Y1NjQyX3NldF9yZXNvbHV0aW9uKGNsaWVudCk7Ci0Jb3Y1NjQyX3dyaXRlX2FycmF5KGNsaWVudCwgb3Y1NjQyX2RlZmF1bHRfcmVnc19maW5hbGlzZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNzk0LDggKzgzMSw4IEBACiAKIAltZi0+Y29kZQk9IGZtdC0+Y29kZTsKIAltZi0+Y29sb3JzcGFjZQk9IGZtdC0+Y29sb3JzcGFjZTsKLQltZi0+d2lkdGgJPSBPVjU2NDJfV0lEVEg7Ci0JbWYtPmhlaWdodAk9IE9WNTY0Ml9IRUlHSFQ7CisJbWYtPndpZHRoCT0gcHJpdi0+Y3JvcF9yZWN0LndpZHRoOworCW1mLT5oZWlnaHQJPSBwcml2LT5jcm9wX3JlY3QuaGVpZ2h0OwogCW1mLT5maWVsZAk9IFY0TDJfRklFTERfTk9ORTsKIAogCXJldHVybiAwOwpAQCAtODI4LDE1ICs4NjUsNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvdjU2NDJfc19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBvdjU2NDIgKnByaXYgPSB0b19vdjU2NDIoY2xpZW50KTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmEtPmM7CisJaW50IHJldDsKKworCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmcmVjdC0+d2lkdGgsIDQ4LCBPVjU2NDJfTUFYX1dJRFRILCAxLAorCQkJICAgICAgJnJlY3QtPmhlaWdodCwgMzIsIE9WNTY0Ml9NQVhfSEVJR0hULCAxLCAwKTsKKworCXByaXYtPmNyb3BfcmVjdC53aWR0aAk9IHJlY3QtPndpZHRoOworCXByaXYtPmNyb3BfcmVjdC5oZWlnaHQJPSByZWN0LT5oZWlnaHQ7CisJcHJpdi0+dG90YWxfd2lkdGgJPSByZWN0LT53aWR0aCArIEJMQU5LSU5HX0VYVFJBX1dJRFRIOworCXByaXYtPnRvdGFsX2hlaWdodAk9IG1heF90KGludCwgcmVjdC0+aGVpZ2h0ICsKKwkJCQkJCQlCTEFOS0lOR19FWFRSQV9IRUlHSFQsCisJCQkJCQkJQkxBTktJTkdfTUlOX0hFSUdIVCk7CisJcHJpdi0+Y3JvcF9yZWN0LndpZHRoCQk9IHJlY3QtPndpZHRoOworCXByaXYtPmNyb3BfcmVjdC5oZWlnaHQJCT0gcmVjdC0+aGVpZ2h0OworCisJcmV0ID0gb3Y1NjQyX3dyaXRlX2FycmF5KGNsaWVudCwgb3Y1NjQyX2RlZmF1bHRfcmVnc19pbml0KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gb3Y1NjQyX3NldF9yZXNvbHV0aW9uKHNkKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gb3Y1NjQyX3dyaXRlX2FycmF5KGNsaWVudCwgb3Y1NjQyX2RlZmF1bHRfcmVnc19maW5hbGlzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG92NTY0Ml9nX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IG92NTY0MiAqcHJpdiA9IHRvX292NTY0MihjbGllbnQpOwogCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmYS0+YzsKIAotCWEtPnR5cGUJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCXJlY3QtPnRvcAk9IDA7Ci0JcmVjdC0+bGVmdAk9IDA7Ci0JcmVjdC0+d2lkdGgJPSBPVjU2NDJfV0lEVEg7Ci0JcmVjdC0+aGVpZ2h0CT0gT1Y1NjQyX0hFSUdIVDsKKwlpZiAoYS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJKnJlY3QgPSBwcml2LT5jcm9wX3JlY3Q7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg0NSw4ICs5MTEsOCBAQAogewogCWEtPmJvdW5kcy5sZWZ0CQkJPSAwOwogCWEtPmJvdW5kcy50b3AJCQk9IDA7Ci0JYS0+Ym91bmRzLndpZHRoCQkJPSBPVjU2NDJfV0lEVEg7Ci0JYS0+Ym91bmRzLmhlaWdodAkJPSBPVjU2NDJfSEVJR0hUOworCWEtPmJvdW5kcy53aWR0aAkJCT0gT1Y1NjQyX01BWF9XSURUSDsKKwlhLT5ib3VuZHMuaGVpZ2h0CQk9IE9WNTY0Ml9NQVhfSEVJR0hUOwogCWEtPmRlZnJlY3QJCQk9IGEtPmJvdW5kczsKIAlhLT50eXBlCQkJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwogCWEtPnBpeGVsYXNwZWN0Lm51bWVyYXRvcgk9IDE7CkBAIC04NTUsMTYgKzkyMSw0NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG92NTY0Ml9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwljZmctPnR5cGUgPSBWNEwyX01CVVNfQ1NJMjsKKwljZmctPmZsYWdzID0gVjRMMl9NQlVTX0NTSTJfMl9MQU5FIHwgVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTF8wIHwKKwkJCQkJVjRMMl9NQlVTX0NTSTJfQ09OVElOVU9VU19DTE9DSzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NTY0Ml9zX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCByZXQ7CisKKwlpZiAoIW9uKQorCQlyZXR1cm4gMDsKKworCWNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXJldCA9IG92NTY0Ml93cml0ZV9hcnJheShjbGllbnQsIG92NTY0Ml9kZWZhdWx0X3JlZ3NfaW5pdCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG92NTY0Ml9zZXRfcmVzb2x1dGlvbihzZCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG92NTY0Ml93cml0ZV9hcnJheShjbGllbnQsIG92NTY0Ml9kZWZhdWx0X3JlZ3NfZmluYWxpc2UpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgb3Y1NjQyX3N1YmRldl92aWRlb19vcHMgPSB7CiAJLnNfbWJ1c19mbXQJPSBvdjU2NDJfc19mbXQsCiAJLmdfbWJ1c19mbXQJPSBvdjU2NDJfZ19mbXQsCiAJLnRyeV9tYnVzX2ZtdAk9IG92NTY0Ml90cnlfZm10LAogCS5lbnVtX21idXNfZm10CT0gb3Y1NjQyX2VudW1fZm10LAorCS5zX2Nyb3AJCT0gb3Y1NjQyX3NfY3JvcCwKIAkuZ19jcm9wCQk9IG92NTY0Ml9nX2Nyb3AsCiAJLmNyb3BjYXAJPSBvdjU2NDJfY3JvcGNhcCwKKwkuZ19tYnVzX2NvbmZpZwk9IG92NTY0Ml9nX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjU2NDJfc3ViZGV2X2NvcmVfb3BzID0geworCS5zX3Bvd2VyCT0gb3Y1NjQyX3NfcG93ZXIsCiAJLmdfY2hpcF9pZGVudAk9IG92NTY0Ml9nX2NoaXBfaWRlbnQsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCS5nX3JlZ2lzdGVyCT0gb3Y1NjQyX2dldF9yZWdpc3RlciwKQEAgLTg3NywyOCArOTc0LDcgQEAKIAkudmlkZW8JPSAmb3Y1NjQyX3N1YmRldl92aWRlb19vcHMsCiB9OwogCi0vKgotICogV2UgaGF2ZSB0byBwcm92aWRlIHNvYy1jYW1lcmEgb3BlcmF0aW9ucywgYnV0IHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc2F5Ci0gKiB0aGVyZS4gVGhlIE1JUEkgQ1NJMiBkcml2ZXIgd2lsbCBwcm92aWRlIC5xdWVyeV9idXNfcGFyYW0gYW5kIC5zZXRfYnVzX3BhcmFtCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvY19vdjU2NDJfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNvY19vdjU2NDJfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBzb2Nfb3Y1NjQyX29wcyA9IHsKLQkucXVlcnlfYnVzX3BhcmFtCT0gc29jX292NTY0Ml9xdWVyeV9idXNfcGFyYW0sCi0JLnNldF9idXNfcGFyYW0JCT0gc29jX292NTY0Ml9zZXRfYnVzX3BhcmFtLAotfTsKLQotc3RhdGljIGludCBvdjU2NDJfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBvdjU2NDJfdmlkZW9fcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlpbnQgcmV0OwogCXU4IGlkX2hpZ2gsIGlkX2xvdzsKQEAgLTkyOSwxNiArMTAwNSw5IEBACiAJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQogewogCXN0cnVjdCBvdjU2NDIgKnByaXY7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJaW50IHJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiT1Y1NjQyOiBtaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlpZiAoIWljbCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk9WNTY0MjogbWlzc2luZyBwbGF0Zm9ybSBkYXRhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTUwLDE3ICsxMDE5LDI0IEBACiAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCBjbGllbnQsICZvdjU2NDJfc3ViZGV2X29wcyk7CiAKLQlpY2QtPm9wcwk9ICZzb2Nfb3Y1NjQyX29wczsKLQlwcml2LT5mbXQJPSAmb3Y1NjQyX2NvbG91cl9mbXRzWzBdOworCXByaXYtPmZtdAkJPSAmb3Y1NjQyX2NvbG91cl9mbXRzWzBdOwogCi0JcmV0ID0gb3Y1NjQyX3ZpZGVvX3Byb2JlKGljZCwgY2xpZW50KTsKKwlwcml2LT5jcm9wX3JlY3Qud2lkdGgJPSBPVjU2NDJfREVGQVVMVF9XSURUSDsKKwlwcml2LT5jcm9wX3JlY3QuaGVpZ2h0CT0gT1Y1NjQyX0RFRkFVTFRfSEVJR0hUOworCXByaXYtPmNyb3BfcmVjdC5sZWZ0CT0gKE9WNTY0Ml9NQVhfV0lEVEggLSBPVjU2NDJfREVGQVVMVF9XSURUSCkgLyAyOworCXByaXYtPmNyb3BfcmVjdC50b3AJPSAoT1Y1NjQyX01BWF9IRUlHSFQgLSBPVjU2NDJfREVGQVVMVF9IRUlHSFQpIC8gMjsKKwlwcml2LT5jcm9wX3JlY3Qud2lkdGgJPSBPVjU2NDJfREVGQVVMVF9XSURUSDsKKwlwcml2LT5jcm9wX3JlY3QuaGVpZ2h0CT0gT1Y1NjQyX0RFRkFVTFRfSEVJR0hUOworCXByaXYtPnRvdGFsX3dpZHRoID0gT1Y1NjQyX0RFRkFVTFRfV0lEVEggKyBCTEFOS0lOR19FWFRSQV9XSURUSDsKKwlwcml2LT50b3RhbF9oZWlnaHQgPSBCTEFOS0lOR19NSU5fSEVJR0hUOworCisJcmV0ID0gb3Y1NjQyX3ZpZGVvX3Byb2JlKGNsaWVudCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKIAlyZXR1cm4gMDsKIAogZXJyb3I6Ci0JaWNkLT5vcHMgPSBOVUxMOwogCWtmcmVlKHByaXYpOwogCXJldHVybiByZXQ7CiB9CkBAIC05NjgsMTAgKzEwNDQsOCBAQAogc3RhdGljIGludCBvdjU2NDJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG92NTY0MiAqcHJpdiA9IHRvX292NTY0MihjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAKLQlpY2QtPm9wcyA9IE5VTEw7CiAJaWYgKGljbC0+ZnJlZV9idXMpCiAJCWljbC0+ZnJlZV9idXMoaWNsKTsKIAlrZnJlZShwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y2NjUwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NjY1MC5jCmluZGV4IDQ1NmQ5YWQuLjlmMmQyNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y2NjUwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjY2NTAuYwpAQCAtMjgsMTAgKzI4LDEyIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgotCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogCiAvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBSRUdfR0FJTgkJMHgwMAkvKiByYW5nZSAwMCAtIDNGICovCkBAIC0xNzcsMjAgKzE3OSwyMyBAQAogCiBzdHJ1Y3Qgb3Y2NjUwIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYJc3ViZGV2OwotCi0JaW50CQkJZ2FpbjsKLQlpbnQJCQlibHVlOwotCWludAkJCXJlZDsKLQlpbnQJCQlzYXR1cmF0aW9uOwotCWludAkJCWh1ZTsKLQlpbnQJCQlicmlnaHRuZXNzOwotCWludAkJCWV4cG9zdXJlOwotCWludAkJCWdhbW1hOwotCWludAkJCWFlYzsKLQlib29sCQkJdmZsaXA7Ci0JYm9vbAkJCWhmbGlwOwotCWJvb2wJCQlhd2I7Ci0JYm9vbAkJCWFnYzsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgaGRsOworCXN0cnVjdCB7CisJCS8qIGV4cG9zdXJlL2F1dG9leHBvc3VyZSBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwgKmF1dG9leHBvc3VyZTsKKwkJc3RydWN0IHY0bDJfY3RybCAqZXhwb3N1cmU7CisJfTsKKwlzdHJ1Y3QgeworCQkvKiBnYWluL2F1dG9nYWluIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybCAqYXV0b2dhaW47CisJCXN0cnVjdCB2NGwyX2N0cmwgKmdhaW47CisJfTsKKwlzdHJ1Y3QgeworCQkvKiBibHVlL3JlZC9hdXRvd2hpdGViYWxhbmNlIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybCAqYXV0b3diOworCQlzdHJ1Y3QgdjRsMl9jdHJsICpibHVlOworCQlzdHJ1Y3QgdjRsMl9jdHJsICpyZWQ7CisJfTsKIAlib29sCQkJaGFsZl9zY2FsZTsJLyogc2NhbGUgZG93biBvdXRwdXQgYnkgMiAqLwogCXN0cnVjdCB2NGwyX3JlY3QJcmVjdDsJCS8qIHNlbnNvciBjcm9wcGluZyB3aW5kb3cgKi8KIAl1bnNpZ25lZCBsb25nCQlwY2xrX2xpbWl0OwkvKiBmcm9tIGhvc3QgKi8KQEAgLTIxMCwxMjYgKzIxNSw2IEBACiAJVjRMMl9NQlVTX0ZNVF9ZOF8xWDgsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIG92NjY1MF9jb250cm9sc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0FVVE9HQUlOLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiQUdDIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMSwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0dBSU4sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJHYWluIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDB4M2YsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gREVGX0dBSU4sCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJBV0IiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAxLAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZQkJPSAiQmx1ZSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAweGZmLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IERFRl9CTFVFLAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJSZWQiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMHhmZiwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSBERUZfUkVELAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfU0FUVVJBVElPTiwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIlNhdHVyYXRpb24iLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMHhmLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDB4OCwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0hVRSwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkh1ZSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSBIVUVfTUFTSywKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSBERUZfSFVFLAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfQlJJR0hUTkVTUywKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkJyaWdodG5lc3MiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMHhmZiwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAweDgwLAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkVfQVVUTywKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkFFQyIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAzLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9FWFBPU1VSRSwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkV4cG9zdXJlIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDB4ZmYsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gREVGX0FFQ0gsCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9HQU1NQSwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkdhbW1hIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDB4ZmYsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMHgxMiwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBIb3Jpem9udGFsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sCi19OwotCiAvKiByZWFkIGEgcmVnaXN0ZXIgKi8KIHN0YXRpYyBpbnQgb3Y2NjUwX3JlZ19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggKnZhbCkKIHsKQEAgLTQxOSwyMTMgKzMwNCw5MCBAQAogCXJldHVybiAwOwogfQogCi0vKiBBbHRlciBidXMgc2V0dGluZ3Mgb24gY2FtZXJhIHNpZGUgKi8KLXN0YXRpYyBpbnQgb3Y2NjUwX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7Ci0JaW50IHJldDsKLQotCWZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7Ci0KLQlpZiAoZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcpCi0JCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUosIENPTUpfUENMS19SSVNJTkcsIDApOwotCWVsc2UKLQkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NSiwgMCwgQ09NSl9QQ0xLX1JJU0lORyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChmbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cpCi0JCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUYsIENPTUZfSFJFRl9MT1csIDApOwotCWVsc2UKLQkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NRiwgMCwgQ09NRl9IUkVGX0xPVyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChmbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIKQotCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01KLCBDT01KX1ZTWU5DX0hJR0gsIDApOwotCWVsc2UKLQkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NSiwgMCwgQ09NSl9WU1lOQ19ISUdIKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFJlcXVlc3QgYnVzIHNldHRpbmdzIG9uIGNhbWVyYSBzaWRlICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvdjY2NTBfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCi0JdW5zaWduZWQgbG9uZyBmbGFncyA9IFNPQ0FNX01BU1RFUiB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8IFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcgfAotCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cgfAotCQlTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cgfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIIHwgU09DQU1fREFUQVdJRFRIXzg7Ci0KLQlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7Ci19Ci0KIC8qIEdldCBzdGF0dXMgb2YgYWRkaXRpb25hbCBjYW1lcmEgY2FwYWJpbGl0aWVzICovCi1zdGF0aWMgaW50IG92NjY1MF9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgb3Y2NTUwX2dfdm9sYXRpbGVfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogeworCXN0cnVjdCBvdjY2NTAgKnByaXYgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IG92NjY1MCwgaGRsKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJnByaXYtPnN1YmRldjsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG92NjY1MCAqcHJpdiA9IHRvX292NjY1MChjbGllbnQpOwotCXVpbnQ4X3QgcmVnOwotCWludCByZXQgPSAwOworCXVpbnQ4X3QgcmVnLCByZWcyOworCWludCByZXQ7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5hZ2M7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJaWYgKHByaXYtPmFnYykgewotCQkJcmV0ID0gb3Y2NjUwX3JlZ19yZWFkKGNsaWVudCwgUkVHX0dBSU4sICZyZWcpOwotCQkJY3RybC0+dmFsdWUgPSByZWc7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLT52YWx1ZSA9IHByaXYtPmdhaW47Ci0JCX0KLQkJYnJlYWs7CisJCXJldCA9IG92NjY1MF9yZWdfcmVhZChjbGllbnQsIFJFR19HQUlOLCAmcmVnKTsKKwkJaWYgKCFyZXQpCisJCQlwcml2LT5nYWluLT52YWwgPSByZWc7CisJCXJldHVybiByZXQ7CiAJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+YXdiOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJaWYgKHByaXYtPmF3YikgewotCQkJcmV0ID0gb3Y2NjUwX3JlZ19yZWFkKGNsaWVudCwgUkVHX0JMVUUsICZyZWcpOwotCQkJY3RybC0+dmFsdWUgPSByZWc7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLT52YWx1ZSA9IHByaXYtPmJsdWU7CisJCXJldCA9IG92NjY1MF9yZWdfcmVhZChjbGllbnQsIFJFR19CTFVFLCAmcmVnKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBvdjY2NTBfcmVnX3JlYWQoY2xpZW50LCBSRUdfUkVELCAmcmVnMik7CisJCWlmICghcmV0KSB7CisJCQlwcml2LT5ibHVlLT52YWwgPSByZWc7CisJCQlwcml2LT5yZWQtPnZhbCA9IHJlZzI7CiAJCX0KLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJaWYgKHByaXYtPmF3YikgewotCQkJcmV0ID0gb3Y2NjUwX3JlZ19yZWFkKGNsaWVudCwgUkVHX1JFRCwgJnJlZyk7Ci0JCQljdHJsLT52YWx1ZSA9IHJlZzsKLQkJfSBlbHNlIHsKLQkJCWN0cmwtPnZhbHVlID0gcHJpdi0+cmVkOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5zYXR1cmF0aW9uOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5odWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5icmlnaHRuZXNzOwotCQlicmVhazsKKwkJcmV0dXJuIHJldDsKIAljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+YWVjOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlpZiAocHJpdi0+YWVjKSB7Ci0JCQlyZXQgPSBvdjY2NTBfcmVnX3JlYWQoY2xpZW50LCBSRUdfQUVDSCwgJnJlZyk7Ci0JCQljdHJsLT52YWx1ZSA9IHJlZzsKLQkJfSBlbHNlIHsKLQkJCWN0cmwtPnZhbHVlID0gcHJpdi0+ZXhwb3N1cmU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9HQU1NQToKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5nYW1tYTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT52ZmxpcDsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5oZmxpcDsKLQkJYnJlYWs7CisJCXJldCA9IG92NjY1MF9yZWdfcmVhZChjbGllbnQsIFJFR19BRUNILCAmcmVnKTsKKwkJaWYgKCFyZXQpCisJCQlwcml2LT5leHBvc3VyZS0+dmFsID0gcmVnOworCQlyZXR1cm4gcmV0OwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKiBTZXQgc3RhdHVzIG9mIGFkZGl0aW9uYWwgY2FtZXJhIGNhcGFiaWxpdGllcyAqLwotc3RhdGljIGludCBvdjY2NTBfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IG92NjU1MF9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKKwlzdHJ1Y3Qgb3Y2NjUwICpwcml2ID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBvdjY2NTAsIGhkbCk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZwcml2LT5zdWJkZXY7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBvdjY2NTAgKnByaXYgPSB0b19vdjY2NTAoY2xpZW50KTsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46CiAJCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUIsCi0JCQkJY3RybC0+dmFsdWUgPyBDT01CX0FHQyA6IDAsIENPTUJfQUdDKTsKLQkJaWYgKCFyZXQpCi0JCQlwcml2LT5hZ2MgPSBjdHJsLT52YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlyZXQgPSBvdjY2NTBfcmVnX3dyaXRlKGNsaWVudCwgUkVHX0dBSU4sIGN0cmwtPnZhbHVlKTsKLQkJaWYgKCFyZXQpCi0JCQlwcml2LT5nYWluID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOworCQkJCWN0cmwtPnZhbCA/IENPTUJfQUdDIDogMCwgQ09NQl9BR0MpOworCQlpZiAoIXJldCAmJiAhY3RybC0+dmFsKQorCQkJcmV0ID0gb3Y2NjUwX3JlZ193cml0ZShjbGllbnQsIFJFR19HQUlOLCBwcml2LT5nYWluLT52YWwpOworCQlyZXR1cm4gcmV0OwogCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgogCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01CLAotCQkJCWN0cmwtPnZhbHVlID8gQ09NQl9BV0IgOiAwLCBDT01CX0FXQik7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+YXdiID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQlyZXQgPSBvdjY2NTBfcmVnX3dyaXRlKGNsaWVudCwgUkVHX0JMVUUsIGN0cmwtPnZhbHVlKTsKLQkJaWYgKCFyZXQpCi0JCQlwcml2LT5ibHVlID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCXJldCA9IG92NjY1MF9yZWdfd3JpdGUoY2xpZW50LCBSRUdfUkVELCBjdHJsLT52YWx1ZSk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+cmVkID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfU0FULCBTRVRfU0FUKGN0cmwtPnZhbHVlKSwKLQkJCQlTQVRfTUFTSyk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+c2F0dXJhdGlvbiA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfSFVFLCBTRVRfSFVFKGN0cmwtPnZhbHVlKSwKLQkJCQlIVUVfTUFTSyk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+aHVlID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJcmV0ID0gb3Y2NjUwX3JlZ193cml0ZShjbGllbnQsIFJFR19CUlQsIGN0cmwtPnZhbHVlKTsKLQkJaWYgKCFyZXQpCi0JCQlwcml2LT5icmlnaHRuZXNzID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKLQkJc3dpdGNoIChjdHJsLT52YWx1ZSkgewotCQljYXNlIFY0TDJfRVhQT1NVUkVfQVVUTzoKLQkJCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUIsIENPTUJfQUVDLCAwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NQiwgMCwgQ09NQl9BRUMpOwotCQkJYnJlYWs7CisJCQkJY3RybC0+dmFsID8gQ09NQl9BV0IgOiAwLCBDT01CX0FXQik7CisJCWlmICghcmV0ICYmICFjdHJsLT52YWwpIHsKKwkJCXJldCA9IG92NjY1MF9yZWdfd3JpdGUoY2xpZW50LCBSRUdfQkxVRSwgcHJpdi0+Ymx1ZS0+dmFsKTsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IG92NjY1MF9yZWdfd3JpdGUoY2xpZW50LCBSRUdfUkVELAorCQkJCQkJCXByaXYtPnJlZC0+dmFsKTsKIAkJfQotCQlpZiAoIXJldCkKLQkJCXByaXYtPmFlYyA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlyZXQgPSBvdjY2NTBfcmVnX3dyaXRlKGNsaWVudCwgUkVHX0FFQ0gsIGN0cmwtPnZhbHVlKTsKLQkJaWYgKCFyZXQpCi0JCQlwcml2LT5leHBvc3VyZSA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKKwkJcmV0dXJuIHJldDsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCXJldHVybiBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19TQVQsIFNFVF9TQVQoY3RybC0+dmFsKSwKKwkJCQlTQVRfTUFTSyk7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCXJldHVybiBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19IVUUsIFNFVF9IVUUoY3RybC0+dmFsKSwKKwkJCQlIVUVfTUFTSyk7CisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQlyZXR1cm4gb3Y2NjUwX3JlZ193cml0ZShjbGllbnQsIFJFR19CUlQsIGN0cmwtPnZhbCk7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgorCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01CLCBjdHJsLT52YWwgPT0KKwkJCQlWNEwyX0VYUE9TVVJFX0FVVE8gPyBDT01CX0FFQyA6IDAsIENPTUJfQUVDKTsKKwkJaWYgKCFyZXQgJiYgY3RybC0+dmFsID09IFY0TDJfRVhQT1NVUkVfTUFOVUFMKQorCQkJcmV0ID0gb3Y2NjUwX3JlZ193cml0ZShjbGllbnQsIFJFR19BRUNILAorCQkJCQkJcHJpdi0+ZXhwb3N1cmUtPnZhbCk7CisJCXJldHVybiByZXQ7CiAJY2FzZSBWNEwyX0NJRF9HQU1NQToKLQkJcmV0ID0gb3Y2NjUwX3JlZ193cml0ZShjbGllbnQsIFJFR19HQU0xLCBjdHJsLT52YWx1ZSk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+Z2FtbWEgPSBjdHJsLT52YWx1ZTsKLQkJYnJlYWs7CisJCXJldHVybiBvdjY2NTBfcmVnX3dyaXRlKGNsaWVudCwgUkVHX0dBTTEsIGN0cmwtPnZhbCk7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NQiwKLQkJCQljdHJsLT52YWx1ZSA/IENPTUJfRkxJUF9WIDogMCwgQ09NQl9GTElQX1YpOwotCQlpZiAoIXJldCkKLQkJCXByaXYtPnZmbGlwID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOworCQlyZXR1cm4gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NQiwKKwkJCQljdHJsLT52YWwgPyBDT01CX0ZMSVBfViA6IDAsIENPTUJfRkxJUF9WKTsKIAljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01CLAotCQkJCWN0cmwtPnZhbHVlID8gQ09NQl9GTElQX0ggOiAwLCBDT01CX0ZMSVBfSCk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+aGZsaXAgPSBjdHJsLT52YWx1ZTsKLQkJYnJlYWs7CisJCXJldHVybiBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01CLAorCQkJCWN0cmwtPnZhbCA/IENPTUJfRkxJUF9IIDogMCwgQ09NQl9GTElQX0gpOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIC8qIEdldCBjaGlwIGlkZW50aWZpY2F0aW9uICovCkBAIC03NzgsNyArNTQwLDcgQEAKIHN0YXRpYyBpbnQgb3Y2NjUwX3NfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopc2QtPmdycF9pZDsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9zZW5zZSAqc2Vuc2UgPSBpY2QtPnNlbnNlOwogCXN0cnVjdCBvdjY2NTAgKnByaXYgPSB0b19vdjY2NTAoY2xpZW50KTsKIAlib29sIGhhbGZfc2NhbGUgPSAhaXNfdW5zY2FsZWRfb2sobWYtPndpZHRoLCBtZi0+aGVpZ2h0LCAmcHJpdi0+cmVjdCk7CkBAIC0xMDU3LDggKzgxOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBvdjY2NTBfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgb3Y2NjUwX3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJdTgJCXBpZGgsIHBpZGwsIG1pZGgsIG1pZGw7CiAJaW50CQlyZXQgPSAwOwpAQCAtMTA5NCwxNiArODU1LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBvdjY2NTBfb3BzID0gewotCS5zZXRfYnVzX3BhcmFtCQk9IG92NjY1MF9zZXRfYnVzX3BhcmFtLAotCS5xdWVyeV9idXNfcGFyYW0JPSBvdjY2NTBfcXVlcnlfYnVzX3BhcmFtLAotCS5jb250cm9scwkJPSBvdjY2NTBfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG92NjY1MF9jb250cm9scyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgb3Y2NTUwX2N0cmxfb3BzID0geworCS5nX3ZvbGF0aWxlX2N0cmwgPSBvdjY1NTBfZ192b2xhdGlsZV9jdHJsLAorCS5zX2N0cmwgPSBvdjY1NTBfc19jdHJsLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjY2NTBfY29yZV9vcHMgPSB7Ci0JLmdfY3RybAkJCT0gb3Y2NjUwX2dfY3RybCwKLQkuc19jdHJsCQkJPSBvdjY2NTBfc19jdHJsLAogCS5nX2NoaXBfaWRlbnQJCT0gb3Y2NjUwX2dfY2hpcF9pZGVudCwKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiAJLmdfcmVnaXN0ZXIJCT0gb3Y2NjUwX2dldF9yZWdpc3RlciwKQEAgLTExMTEsNiArODY4LDU1IEBACiAjZW5kaWYKIH07CiAKKy8qIFJlcXVlc3QgYnVzIHNldHRpbmdzIG9uIGNhbWVyYSBzaWRlICovCitzdGF0aWMgaW50IG92NjY1MF9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19NQVNURVIgfAorCQlWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcgfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XIHwKKwkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0g7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMOworCWNmZy0+ZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKTsKKworCXJldHVybiAwOworfQorCisvKiBBbHRlciBidXMgc2V0dGluZ3Mgb24gY2FtZXJhIHNpZGUgKi8KK3N0YXRpYyBpbnQgb3Y2NjUwX3NfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQljb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCWludCByZXQ7CisKKwlpZiAoZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKQorCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01KLCBDT01KX1BDTEtfUklTSU5HLCAwKTsKKwllbHNlCisJCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUosIDAsIENPTUpfUENMS19SSVNJTkcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykKKwkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NRiwgQ09NRl9IUkVGX0xPVywgMCk7CisJZWxzZQorCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01GLCAwLCBDT01GX0hSRUZfTE9XKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIKQorCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01KLCBDT01KX1ZTWU5DX0hJR0gsIDApOworCWVsc2UKKwkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NSiwgMCwgQ09NSl9WU1lOQ19ISUdIKTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG92NjY1MF92aWRlb19vcHMgPSB7CiAJLnNfc3RyZWFtCT0gb3Y2NjUwX3Nfc3RyZWFtLAogCS5nX21idXNfZm10CT0gb3Y2NjUwX2dfZm10LApAQCAtMTEyMiw2ICs5MjgsOCBAQAogCS5zX2Nyb3AJCT0gb3Y2NjUwX3NfY3JvcCwKIAkuZ19wYXJtCQk9IG92NjY1MF9nX3Bhcm0sCiAJLnNfcGFybQkJPSBvdjY2NTBfc19wYXJtLAorCS5nX21idXNfY29uZmlnCT0gb3Y2NjUwX2dfbWJ1c19jb25maWcsCisJLnNfbWJ1c19jb25maWcJPSBvdjY2NTBfc19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG92NjY1MF9zdWJkZXZfb3BzID0gewpAQCAtMTEzNiwxNiArOTQ0LDkgQEAKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7CiAJc3RydWN0IG92NjY1MCAqcHJpdjsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAlpbnQgcmV0OwogCi0JaWYgKCFpY2QpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlpZiAoIWljbCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1pc3NpbmcgcGxhdGZvcm1fZGF0YSBmb3IgZHJpdmVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTU5LDggKzk2MCw0NiBAQAogCX0KIAogCXY0bDJfaTJjX3N1YmRldl9pbml0KCZwcml2LT5zdWJkZXYsIGNsaWVudCwgJm92NjY1MF9zdWJkZXZfb3BzKTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZwcml2LT5oZGwsIDEzKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y2NTUwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfVkZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjY1NTBfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9IRkxJUCwgMCwgMSwgMSwgMCk7CisJcHJpdi0+YXV0b2dhaW4gPSB2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y2NTUwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfQVVUT0dBSU4sIDAsIDEsIDEsIDEpOworCXByaXYtPmdhaW4gPSB2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y2NTUwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfR0FJTiwgMCwgMHgzZiwgMSwgREVGX0dBSU4pOworCXByaXYtPmF1dG93YiA9IHY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjY1NTBfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsIDAsIDEsIDEsIDEpOworCXByaXYtPmJsdWUgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y2NTUwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfQkxVRV9CQUxBTkNFLCAwLCAweGZmLCAxLCBERUZfQkxVRSk7CisJcHJpdi0+cmVkID0gdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NjU1MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1JFRF9CQUxBTkNFLCAwLCAweGZmLCAxLCBERUZfUkVEKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y2NTUwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfU0FUVVJBVElPTiwgMCwgMHhmLCAxLCAweDgpOworCXY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjY1NTBfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9IVUUsIDAsIEhVRV9NQVNLLCAxLCBERUZfSFVFKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y2NTUwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfQlJJR0hUTkVTUywgMCwgMHhmZiwgMSwgMHg4MCk7CisJcHJpdi0+YXV0b2V4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGRfbWVudSgmcHJpdi0+aGRsLAorCQkJJm92NjU1MF9jdHJsX29wcywgVjRMMl9DSURfRVhQT1NVUkVfQVVUTywKKwkJCVY0TDJfRVhQT1NVUkVfTUFOVUFMLCAwLCBWNEwyX0VYUE9TVVJFX0FVVE8pOworCXByaXYtPmV4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NjU1MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0VYUE9TVVJFLCAwLCAweGZmLCAxLCBERUZfQUVDSCk7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NjU1MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0dBTU1BLCAwLCAweGZmLCAxLCAweDEyKTsKIAotCWljZC0+b3BzID0gJm92NjY1MF9vcHM7CisJcHJpdi0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZwcml2LT5oZGw7CisJaWYgKHByaXYtPmhkbC5lcnJvcikgeworCQlpbnQgZXJyID0gcHJpdi0+aGRsLmVycm9yOworCisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gZXJyOworCX0KKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDIsICZwcml2LT5hdXRvZ2FpbiwgMCwgdHJ1ZSk7CisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigzLCAmcHJpdi0+YXV0b3diLCAwLCB0cnVlKTsKKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDIsICZwcml2LT5hdXRvZXhwb3N1cmUsCisJCQkJVjRMMl9FWFBPU1VSRV9NQU5VQUwsIHRydWUpOwogCiAJcHJpdi0+cmVjdC5sZWZ0CSAgPSBERUZfSFNUUlQgPDwgMTsKIAlwcml2LT5yZWN0LnRvcAkgID0gREVGX1ZTVFJUIDw8IDE7CkBAIC0xMTcwLDEwICsxMDA5LDEyIEBACiAJcHJpdi0+Y29kZQkgID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7CiAJcHJpdi0+Y29sb3JzcGFjZSAgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKIAotCXJldCA9IG92NjY1MF92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJcmV0ID0gb3Y2NjUwX3ZpZGVvX3Byb2JlKGNsaWVudCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZwcml2LT5oZGwpOwogCiAJaWYgKHJldCkgewotCQlpY2QtPm9wcyA9IE5VTEw7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnByaXYtPmhkbCk7CiAJCWtmcmVlKHByaXYpOwogCX0KIApAQCAtMTE4NCw2ICsxMDI1LDggQEAKIHsKIAlzdHJ1Y3Qgb3Y2NjUwICpwcml2ID0gdG9fb3Y2NjUwKGNsaWVudCk7CiAKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcHJpdi0+c3ViZGV2KTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwcml2LT5oZGwpOwogCWtmcmVlKHByaXYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMKaW5kZXggMzk3ODcwZi4uOWY2Y2UzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jCkBAIC0yMCwxMiArMjAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9vdjc3MnguaD4KKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgotI2luY2x1ZGUgPG1lZGlhL292NzcyeC5oPgogCiAvKgogICogcmVnaXN0ZXIgb2Zmc2V0CkBAIC00MDAsNiArNDAyLDcgQEAKIAogc3RydWN0IG92NzcyeF9wcml2IHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgICAgICAgICAgICAgICAgc3ViZGV2OworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlcgkgIGhkbDsKIAlzdHJ1Y3Qgb3Y3NzJ4X2NhbWVyYV9pbmZvICAgICAgICAqaW5mbzsKIAljb25zdCBzdHJ1Y3Qgb3Y3NzJ4X2NvbG9yX2Zvcm1hdCAqY2ZtdDsKIAljb25zdCBzdHJ1Y3Qgb3Y3NzJ4X3dpbl9zaXplICAgICAqd2luOwpAQCAtNTE3LDM2ICs1MjAsNiBAQAogCS5yZWdzICAgICA9IG92NzcyeF9xdmdhX3JlZ3MsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIG92NzcyeF9jb250cm9sc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBIb3Jpem9udGFsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfQkFORF9TVE9QX0ZJTFRFUiwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkJhbmQtc3RvcCBmaWx0ZXIiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMjU2LAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLX07Ci0KIC8qCiAgKiBnZW5lcmFsIGZ1bmN0aW9uCiAgKi8KQEAgLTYyMCw3NSArNTkzLDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Y3NzJ4X3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJdW5zaWduZWQgbG9uZwkJICBmbGFncykKK3N0YXRpYyBpbnQgb3Y3NzJ4X3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvdjc3MnhfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpKTsKLQlzdHJ1Y3Qgb3Y3NzJ4X3ByaXYgKnByaXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fTUFTVEVSIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0g7Ci0KLQlpZiAocHJpdi0+aW5mby0+ZmxhZ3MgJiBPVjc3MlhfRkxBR184QklUKQotCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfODsKLQllbHNlCi0JCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF8xMDsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBvdjc3MnhfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3Qgb3Y3NzJ4X3ByaXYsIHN1YmRldik7Ci0KLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5mbGFnX3ZmbGlwOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQljdHJsLT52YWx1ZSA9IHByaXYtPmZsYWdfaGZsaXA7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQkFORF9TVE9QX0ZJTFRFUjoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5iYW5kX2ZpbHRlcjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92NzcyeF9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKKwlzdHJ1Y3Qgb3Y3NzJ4X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwKKwkJCQkJCXN0cnVjdCBvdjc3MnhfcHJpdiwgaGRsKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJnByaXYtPnN1YmRldjsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3Qgb3Y3NzJ4X3ByaXYsIHN1YmRldik7CiAJaW50IHJldCA9IDA7CiAJdTggdmFsOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCXZhbCA9IGN0cmwtPnZhbHVlID8gVkZMSVBfSU1HIDogMHgwMDsKLQkJcHJpdi0+ZmxhZ192ZmxpcCA9IGN0cmwtPnZhbHVlOworCQl2YWwgPSBjdHJsLT52YWwgPyBWRkxJUF9JTUcgOiAweDAwOworCQlwcml2LT5mbGFnX3ZmbGlwID0gY3RybC0+dmFsOwogCQlpZiAocHJpdi0+aW5mby0+ZmxhZ3MgJiBPVjc3MlhfRkxBR19WRkxJUCkKIAkJCXZhbCBePSBWRkxJUF9JTUc7Ci0JCXJldCA9IG92NzcyeF9tYXNrX3NldChjbGllbnQsIENPTTMsIFZGTElQX0lNRywgdmFsKTsKLQkJYnJlYWs7CisJCXJldHVybiBvdjc3MnhfbWFza19zZXQoY2xpZW50LCBDT00zLCBWRkxJUF9JTUcsIHZhbCk7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJdmFsID0gY3RybC0+dmFsdWUgPyBIRkxJUF9JTUcgOiAweDAwOwotCQlwcml2LT5mbGFnX2hmbGlwID0gY3RybC0+dmFsdWU7CisJCXZhbCA9IGN0cmwtPnZhbCA/IEhGTElQX0lNRyA6IDB4MDA7CisJCXByaXYtPmZsYWdfaGZsaXAgPSBjdHJsLT52YWw7CiAJCWlmIChwcml2LT5pbmZvLT5mbGFncyAmIE9WNzcyWF9GTEFHX0hGTElQKQogCQkJdmFsIF49IEhGTElQX0lNRzsKLQkJcmV0ID0gb3Y3NzJ4X21hc2tfc2V0KGNsaWVudCwgQ09NMywgSEZMSVBfSU1HLCB2YWwpOwotCQlicmVhazsKKwkJcmV0dXJuIG92NzcyeF9tYXNrX3NldChjbGllbnQsIENPTTMsIEhGTElQX0lNRywgdmFsKTsKIAljYXNlIFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVI6Ci0JCWlmICgodW5zaWduZWQpY3RybC0+dmFsdWUgPiAyNTYpCi0JCQljdHJsLT52YWx1ZSA9IDI1NjsKLQkJaWYgKGN0cmwtPnZhbHVlID09IHByaXYtPmJhbmRfZmlsdGVyKQotCQkJYnJlYWs7Ci0JCWlmICghY3RybC0+dmFsdWUpIHsKKwkJaWYgKCFjdHJsLT52YWwpIHsKIAkJCS8qIFN3aXRjaCB0aGUgZmlsdGVyIG9mZiwgaXQgaXMgb24gbm93ICovCiAJCQlyZXQgPSBvdjc3MnhfbWFza19zZXQoY2xpZW50LCBCREJBU0UsIDB4ZmYsIDB4ZmYpOwogCQkJaWYgKCFyZXQpCkBAIC02OTYsNyArNjI0LDcgQEAKIAkJCQkJCSAgICAgIEJOREZfT05fT0ZGLCAwKTsKIAkJfSBlbHNlIHsKIAkJCS8qIFN3aXRjaCB0aGUgZmlsdGVyIG9uLCBzZXQgQUVDIGxvdyBsaW1pdCAqLwotCQkJdmFsID0gMjU2IC0gY3RybC0+dmFsdWU7CisJCQl2YWwgPSAyNTYgLSBjdHJsLT52YWw7CiAJCQlyZXQgPSBvdjc3MnhfbWFza19zZXQoY2xpZW50LCBDT004LAogCQkJCQkgICAgICBCTkRGX09OX09GRiwgQk5ERl9PTl9PRkYpOwogCQkJaWYgKCFyZXQpCkBAIC03MDQsMTEgKzYzMiwxMSBAQAogCQkJCQkJICAgICAgMHhmZiwgdmFsKTsKIAkJfQogCQlpZiAoIXJldCkKLQkJCXByaXYtPmJhbmRfZmlsdGVyID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOworCQkJcHJpdi0+YmFuZF9maWx0ZXIgPSBjdHJsLT52YWw7CisJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBvdjc3MnhfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCkBAIC04MjIsMTMgKzc1MCwxMyBAQAogCQkJZ290byBvdjc3Mnhfc2V0X2ZtdF9lcnJvcjsKIAogCQlyZXQgPSBvdjc3MnhfbWFza19zZXQoY2xpZW50LAotCQkJCSAgICAgIEVER0VfVFJTSExELCBFREdFX1RIUkVTSE9MRF9NQVNLLAorCQkJCSAgICAgIEVER0VfVFJTSExELCBPVjc3MlhfRURHRV9USFJFU0hPTERfTUFTSywKIAkJCQkgICAgICBwcml2LT5pbmZvLT5lZGdlY3RybC50aHJlc2hvbGQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3Y3NzJ4X3NldF9mbXRfZXJyb3I7CiAKIAkJcmV0ID0gb3Y3NzJ4X21hc2tfc2V0KGNsaWVudCwKLQkJCQkgICAgICBFREdFX1NUUk5HVCwgRURHRV9TVFJFTkdUSF9NQVNLLAorCQkJCSAgICAgIEVER0VfU1RSTkdULCBPVjc3MlhfRURHRV9TVFJFTkdUSF9NQVNLLAogCQkJCSAgICAgIHByaXYtPmluZm8tPmVkZ2VjdHJsLnN0cmVuZ3RoKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG92NzcyeF9zZXRfZm10X2Vycm9yOwpAQCAtODQwLDEzICs3NjgsMTMgQEAKIAkJICogc2V0IHVwcGVyIGFuZCBsb3dlciBsaW1pdAogCQkgKi8KIAkJcmV0ID0gb3Y3NzJ4X21hc2tfc2V0KGNsaWVudCwKLQkJCQkgICAgICBFREdFX1VQUEVSLCBFREdFX1VQUEVSX01BU0ssCisJCQkJICAgICAgRURHRV9VUFBFUiwgT1Y3NzJYX0VER0VfVVBQRVJfTUFTSywKIAkJCQkgICAgICBwcml2LT5pbmZvLT5lZGdlY3RybC51cHBlcik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdjc3Mnhfc2V0X2ZtdF9lcnJvcjsKIAogCQlyZXQgPSBvdjc3MnhfbWFza19zZXQoY2xpZW50LAotCQkJCSAgICAgIEVER0VfTE9XRVIsIEVER0VfTE9XRVJfTUFTSywKKwkJCQkgICAgICBFREdFX0xPV0VSLCBPVjc3MlhfRURHRV9MT1dFUl9NQVNLLAogCQkJCSAgICAgIHByaXYtPmluZm8tPmVkZ2VjdHJsLmxvd2VyKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG92NzcyeF9zZXRfZm10X2Vycm9yOwpAQCAtMTAyNSwxNyArOTUzLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Y3NzJ4X3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgb3Y3NzJ4X3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gdG9fb3Y3NzJ4KGNsaWVudCk7CiAJdTggICAgICAgICAgICAgICAgICBwaWQsIHZlcjsKIAljb25zdCBjaGFyICAgICAgICAgKmRldm5hbWU7CiAKLQkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLwotCUJVR19PTighaWNkLT5wYXJlbnQgfHwKLQkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7Ci0KIAkvKgogCSAqIGNoZWNrIGFuZCBzaG93IHByb2R1Y3QgSUQgYW5kIG1hbnVmYWN0dXJlciBJRAogCSAqLwpAQCAtMTA2NCwyMCArOTg3LDE0IEBACiAJCSB2ZXIsCiAJCSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNSURIKSwKIAkJIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1JREwpKTsKLQotCXJldHVybiAwOworCXJldHVybiB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmcHJpdi0+aGRsKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBvdjc3Mnhfb3BzID0gewotCS5zZXRfYnVzX3BhcmFtCQk9IG92NzcyeF9zZXRfYnVzX3BhcmFtLAotCS5xdWVyeV9idXNfcGFyYW0JPSBvdjc3MnhfcXVlcnlfYnVzX3BhcmFtLAotCS5jb250cm9scwkJPSBvdjc3MnhfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG92NzcyeF9jb250cm9scyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgb3Y3NzJ4X2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBvdjc3Mnhfc19jdHJsLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjc3Mnhfc3ViZGV2X2NvcmVfb3BzID0gewotCS5nX2N0cmwJCT0gb3Y3NzJ4X2dfY3RybCwKLQkuc19jdHJsCQk9IG92NzcyeF9zX2N0cmwsCiAJLmdfY2hpcF9pZGVudAk9IG92NzcyeF9nX2NoaXBfaWRlbnQsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCS5nX3JlZ2lzdGVyCT0gb3Y3NzJ4X2dfcmVnaXN0ZXIsCkBAIC0xMDk1LDYgKzEwMTIsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvdjc3MnhfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX01BU1RFUiB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKwljZmctPmZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgb3Y3NzJ4X3N1YmRldl92aWRlb19vcHMgPSB7CiAJLnNfc3RyZWFtCT0gb3Y3NzJ4X3Nfc3RyZWFtLAogCS5nX21idXNfZm10CT0gb3Y3NzJ4X2dfZm10LApAQCAtMTEwMyw2ICsxMDM1LDcgQEAKIAkuY3JvcGNhcAk9IG92NzcyeF9jcm9wY2FwLAogCS5nX2Nyb3AJCT0gb3Y3NzJ4X2dfY3JvcCwKIAkuZW51bV9tYnVzX2ZtdAk9IG92NzcyeF9lbnVtX2ZtdCwKKwkuZ19tYnVzX2NvbmZpZwk9IG92NzcyeF9nX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgb3Y3NzJ4X3N1YmRldl9vcHMgPSB7CkBAIC0xMTE3LDIxICsxMDUwLDE2IEBACiBzdGF0aWMgaW50IG92NzcyeF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIHsKLQlzdHJ1Y3Qgb3Y3NzJ4X3ByaXYgICAgICAgICpwcml2OwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IGkyY19hZGFwdGVyICAgICAgICAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAgICAqaWNsOwotCWludCAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKwlzdHJ1Y3Qgb3Y3NzJ4X3ByaXYJKnByaXY7CisJc3RydWN0IHNvY19jYW1lcmFfbGluawkqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCXN0cnVjdCBpMmNfYWRhcHRlcgkqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CisJaW50CQkJcmV0OwogCi0JaWYgKCFpY2QpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJPVjc3Mlg6IG1pc3Npbmcgc29jLWNhbWVyYSBkYXRhIVxuIik7CisJaWYgKCFpY2wgfHwgIWljbC0+cHJpdikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk9WNzcyWDogbWlzc2luZyBwbGF0Zm9ybSBkYXRhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCWlmICghaWNsIHx8ICFpY2wtPnByaXYpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwKIAkJCSJJMkMtQWRhcHRlciBkb2Vzbid0IHN1cHBvcnQgIgpAQCAtMTE0NiwxMiArMTA3NCwyNCBAQAogCXByaXYtPmluZm8gPSBpY2wtPnByaXY7CiAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCBjbGllbnQsICZvdjc3Mnhfc3ViZGV2X29wcyk7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmcHJpdi0+aGRsLCAzKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y3NzJ4X2N0cmxfb3BzLAorCQkJVjRMMl9DSURfVkZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjc3MnhfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9IRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NzcyeF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIsIDAsIDI1NiwgMSwgMCk7CisJcHJpdi0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZwcml2LT5oZGw7CisJaWYgKHByaXYtPmhkbC5lcnJvcikgeworCQlpbnQgZXJyID0gcHJpdi0+aGRsLmVycm9yOwogCi0JaWNkLT5vcHMJCT0gJm92NzcyeF9vcHM7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gZXJyOworCX0KIAotCXJldCA9IG92NzcyeF92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJcmV0ID0gb3Y3NzJ4X3ZpZGVvX3Byb2JlKGNsaWVudCk7CiAJaWYgKHJldCkgewotCQlpY2QtPm9wcyA9IE5VTEw7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnByaXYtPmhkbCk7CiAJCWtmcmVlKHByaXYpOwogCX0KIApAQCAtMTE2MSw5ICsxMTAxLDkgQEAKIHN0YXRpYyBpbnQgb3Y3NzJ4X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBvdjc3MnhfcHJpdiAqcHJpdiA9IHRvX292NzcyeChjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCWljZC0+b3BzID0gTlVMTDsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcHJpdi0+c3ViZGV2KTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwcml2LT5oZGwpOwogCWtmcmVlKHByaXYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmMKaW5kZXggMzY4MWE2Zi4uYTRmOTk3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5jCkBAIC0yNCwxMCArMjQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogCiAjaW5jbHVkZSAib3Y5NjQwLmgiCiAKQEAgLTE2MiwyNyArMTY1LDYgQEAKIAlWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfTEUsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIG92OTY0MF9jb250cm9sc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBIb3Jpem9udGFsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sCi19OwotCiAvKiByZWFkIGEgcmVnaXN0ZXIgKi8KIHN0YXRpYyBpbnQgb3Y5NjQwX3JlZ19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggKnZhbCkKIHsKQEAgLTI4NCw3NSArMjY2LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIEFsdGVyIGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLwotc3RhdGljIGludCBvdjk2NDBfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXJldHVybiAwOwotfQotCi0vKiBSZXF1ZXN0IGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Y5NjQwX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQotCS8qCi0JICogUkVWSVNJVDogdGhlIGNhbWVyYSBwcm9iYWJseSBjYW4gZG8gMTAgYml0IHRyYW5zZmVycywgYnV0IEkgZG9uJ3QKLQkgKiAgICAgICAgICBoYXZlIHRob3NlIHBpbnMgY29ubmVjdGVkIG9uIG15IGhhcmR3YXJlLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9NQVNURVIgfAotCQlTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8IFNPQ0FNX0RBVEFXSURUSF84OwotCi0JcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwotfQotCi0vKiBHZXQgc3RhdHVzIG9mIGFkZGl0aW9uYWwgY2FtZXJhIGNhcGFiaWxpdGllcyAqLwotc3RhdGljIGludCBvdjk2NDBfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IG92OTY0MF9wcml2ICpwcml2ID0gdG9fb3Y5NjQwX3NlbnNvcihzZCk7Ci0KLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5mbGFnX3ZmbGlwOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQljdHJsLT52YWx1ZSA9IHByaXYtPmZsYWdfaGZsaXA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogLyogU2V0IHN0YXR1cyBvZiBhZGRpdGlvbmFsIGNhbWVyYSBjYXBhYmlsaXRpZXMgKi8KLXN0YXRpYyBpbnQgb3Y5NjQwX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCBvdjk2NDBfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBvdjk2NDBfcHJpdiAqcHJpdiA9IHRvX292OTY0MF9zZW5zb3Ioc2QpOwotCi0JaW50IHJldCA9IDA7CisJc3RydWN0IG92OTY0MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBvdjk2NDBfcHJpdiwgaGRsKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmcHJpdi0+c3ViZGV2KTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQlwcml2LT5mbGFnX3ZmbGlwID0gY3RybC0+dmFsdWU7Ci0JCWlmIChjdHJsLT52YWx1ZSkKLQkJCXJldCA9IG92OTY0MF9yZWdfcm13KGNsaWVudCwgT1Y5NjQwX01WRlAsCisJCWlmIChjdHJsLT52YWwpCisJCQlyZXR1cm4gb3Y5NjQwX3JlZ19ybXcoY2xpZW50LCBPVjk2NDBfTVZGUCwKIAkJCQkJCQlPVjk2NDBfTVZGUF9WLCAwKTsKLQkJZWxzZQotCQkJcmV0ID0gb3Y5NjQwX3JlZ19ybXcoY2xpZW50LCBPVjk2NDBfTVZGUCwKLQkJCQkJCQkwLCBPVjk2NDBfTVZGUF9WKTsKLQkJYnJlYWs7CisJCXJldHVybiBvdjk2NDBfcmVnX3JtdyhjbGllbnQsIE9WOTY0MF9NVkZQLCAwLCBPVjk2NDBfTVZGUF9WKTsKIAljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlwcml2LT5mbGFnX2hmbGlwID0gY3RybC0+dmFsdWU7Ci0JCWlmIChjdHJsLT52YWx1ZSkKLQkJCXJldCA9IG92OTY0MF9yZWdfcm13KGNsaWVudCwgT1Y5NjQwX01WRlAsCisJCWlmIChjdHJsLT52YWwpCisJCQlyZXR1cm4gb3Y5NjQwX3JlZ19ybXcoY2xpZW50LCBPVjk2NDBfTVZGUCwKIAkJCQkJCQlPVjk2NDBfTVZGUF9ILCAwKTsKLQkJZWxzZQotCQkJcmV0ID0gb3Y5NjQwX3JlZ19ybXcoY2xpZW50LCBPVjk2NDBfTVZGUCwKLQkJCQkJCQkwLCBPVjk2NDBfTVZGUF9IKTsKLQkJYnJlYWs7CisJCXJldHVybiBvdjk2NDBfcmVnX3JtdyhjbGllbnQsIE9WOTY0MF9NVkZQLCAwLCBPVjk2NDBfTVZGUF9IKTsKIAl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKiBHZXQgY2hpcCBpZGVudGlmaWNhdGlvbiAqLwpAQCAtNjQ2LDEwICs1NzgsNyBAQAogCXJldHVybiAwOwogfQogCi0KLQotc3RhdGljIGludCBvdjk2NDBfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgb3Y5NjQwX3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBvdjk2NDBfcHJpdiAqcHJpdiA9IHRvX292OTY0MF9zZW5zb3Ioc2QpOwpAQCAtNjU3LDI5ICs1ODYsMTkgQEAKIAljb25zdCBjaGFyCSpkZXZuYW1lOwogCWludAkJcmV0ID0gMDsKIAotCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCi0JQlVHX09OKCFpY2QtPnBhcmVudCB8fAotCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKLQogCS8qCiAJICogY2hlY2sgYW5kIHNob3cgcHJvZHVjdCBJRCBhbmQgbWFudWZhY3R1cmVyIElECiAJICovCiAKIAlyZXQgPSBvdjk2NDBfcmVnX3JlYWQoY2xpZW50LCBPVjk2NDBfUElELCAmcGlkKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gb3Y5NjQwX3JlZ19yZWFkKGNsaWVudCwgT1Y5NjQwX1ZFUiwgJnZlcik7CisJaWYgKCFyZXQpCisJCXJldCA9IG92OTY0MF9yZWdfcmVhZChjbGllbnQsIE9WOTY0MF9NSURILCAmbWlkaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG92OTY0MF9yZWdfcmVhZChjbGllbnQsIE9WOTY0MF9NSURMLCAmbWlkbCk7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlyZXQgPSBvdjk2NDBfcmVnX3JlYWQoY2xpZW50LCBPVjk2NDBfVkVSLCAmdmVyKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCXJldCA9IG92OTY0MF9yZWdfcmVhZChjbGllbnQsIE9WOTY0MF9NSURILCAmbWlkaCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlyZXQgPSBvdjk2NDBfcmVnX3JlYWQoY2xpZW50LCBPVjk2NDBfTUlETCwgJm1pZGwpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOworCQlyZXR1cm4gcmV0OwogCiAJc3dpdGNoIChWRVJTSU9OKHBpZCwgdmVyKSkgewogCWNhc2UgT1Y5NjQwX1YyOgpAQCAtNjkzLDI3ICs2MTIsMjAgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJQcm9kdWN0IElEIGVycm9yICV4OiV4XG4iLCBwaWQsIHZlcik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyBQcm9kdWN0IElEICUweDolMHggTWFudWZhY3R1cmVyIElEICV4OiV4XG4iLAogCQkgZGV2bmFtZSwgcGlkLCB2ZXIsIG1pZGgsIG1pZGwpOwogCi1lcnI6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJnByaXYtPmhkbCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgb3Y5NjQwX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSBvdjk2NDBfc2V0X2J1c19wYXJhbSwKLQkucXVlcnlfYnVzX3BhcmFtCT0gb3Y5NjQwX3F1ZXJ5X2J1c19wYXJhbSwKLQkuY29udHJvbHMJCT0gb3Y5NjQwX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShvdjk2NDBfY29udHJvbHMpLAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIG92OTY0MF9jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gb3Y5NjQwX3NfY3RybCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgb3Y5NjQwX2NvcmVfb3BzID0gewotCS5nX2N0cmwJCQk9IG92OTY0MF9nX2N0cmwsCi0JLnNfY3RybAkJCT0gb3Y5NjQwX3NfY3RybCwKIAkuZ19jaGlwX2lkZW50CQk9IG92OTY0MF9nX2NoaXBfaWRlbnQsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCS5nX3JlZ2lzdGVyCQk9IG92OTY0MF9nZXRfcmVnaXN0ZXIsCkBAIC03MjIsNiArNjM0LDIyIEBACiAKIH07CiAKKy8qIFJlcXVlc3QgYnVzIHNldHRpbmdzIG9uIGNhbWVyYSBzaWRlICovCitzdGF0aWMgaW50IG92OTY0MF9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfTUFTVEVSIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0g7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMOworCWNmZy0+ZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBvdjk2NDBfdmlkZW9fb3BzID0gewogCS5zX3N0cmVhbQk9IG92OTY0MF9zX3N0cmVhbSwKIAkuc19tYnVzX2ZtdAk9IG92OTY0MF9zX2ZtdCwKQEAgLTcyOSw3ICs2NTcsNyBAQAogCS5lbnVtX21idXNfZm10CT0gb3Y5NjQwX2VudW1fZm10LAogCS5jcm9wY2FwCT0gb3Y5NjQwX2Nyb3BjYXAsCiAJLmdfY3JvcAkJPSBvdjk2NDBfZ19jcm9wLAotCisJLmdfbWJ1c19jb25maWcJPSBvdjk2NDBfZ19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG92OTY0MF9zdWJkZXZfb3BzID0gewpAQCAtNzQ0LDE2ICs2NzIsOSBAQAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIHsKIAlzdHJ1Y3Qgb3Y5NjQwX3ByaXYgKnByaXY7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QJPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJaW50IHJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTWlzc2luZyBzb2MtY2FtZXJhIGRhdGEhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJaWYgKCFpY2wpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNaXNzaW5nIHBsYXRmb3JtX2RhdGEgZm9yIGRyaXZlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzY4LDEyICs2ODksMjMgQEAKIAogCXY0bDJfaTJjX3N1YmRldl9pbml0KCZwcml2LT5zdWJkZXYsIGNsaWVudCwgJm92OTY0MF9zdWJkZXZfb3BzKTsKIAotCWljZC0+b3BzCT0gJm92OTY0MF9vcHM7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmcHJpdi0+aGRsLCAyKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y5NjQwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfVkZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjk2NDBfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9IRkxJUCwgMCwgMSwgMSwgMCk7CisJcHJpdi0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZwcml2LT5oZGw7CisJaWYgKHByaXYtPmhkbC5lcnJvcikgeworCQlpbnQgZXJyID0gcHJpdi0+aGRsLmVycm9yOwogCi0JcmV0ID0gb3Y5NjQwX3ZpZGVvX3Byb2JlKGljZCwgY2xpZW50KTsKKwkJa2ZyZWUocHJpdik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0ID0gb3Y5NjQwX3ZpZGVvX3Byb2JlKGNsaWVudCk7CiAKIAlpZiAocmV0KSB7Ci0JCWljZC0+b3BzID0gTlVMTDsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcHJpdi0+aGRsKTsKIAkJa2ZyZWUocHJpdik7CiAJfQogCkBAIC03ODUsNiArNzE3LDggQEAKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IG92OTY0MF9wcml2ICpwcml2ID0gdG9fb3Y5NjQwX3NlbnNvcihzZCk7CiAKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcHJpdi0+c3ViZGV2KTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwcml2LT5oZGwpOwogCWtmcmVlKHByaXYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmgKaW5kZXggZjhhNTFiNy4uNmIzM2E5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5oCkBAIC0xOTgsMTIgKzE5OCwxMCBAQAogCiBzdHJ1Y3Qgb3Y5NjQwX3ByaXYgewogCXN0cnVjdCB2NGwyX3N1YmRldgkJc3ViZGV2OworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlcgloZGw7CiAKIAlpbnQJCQkJbW9kZWw7CiAJaW50CQkJCXJldmlzaW9uOwotCi0JYm9vbAkJCQlmbGFnX3ZmbGlwOwotCWJvb2wJCQkJZmxhZ19oZmxpcDsKIH07CiAKICNlbmRpZgkvKiBfX0RSSVZFUlNfTUVESUFfVklERU9fT1Y5NjQwX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk3NDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NzQwLmMKaW5kZXggZWRkMWZmYy4uZDlhOWY3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk3NDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTc0MC5jCkBAIC0xNCw4ICsxNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogCiAjZGVmaW5lIHRvX292OTc0MChzZCkJCWNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG92OTc0MF9wcml2LCBzdWJkZXYpCiAKQEAgLTE5Miw2ICsxOTUsNyBAQAogCiBzdHJ1Y3Qgb3Y5NzQwX3ByaXYgewogCXN0cnVjdCB2NGwyX3N1YmRldgkJc3ViZGV2OworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlcgloZGw7CiAKIAlpbnQJCQkJaWRlbnQ7CiAJdTE2CQkJCW1vZGVsOwpAQCAtMzkyLDI3ICszOTYsNiBAQAogCVY0TDJfTUJVU19GTVRfWVVZVjhfMlg4LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBvdjk3NDBfY29udHJvbHNbXSA9IHsKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9WRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgVmVydGljYWxseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9IRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgSG9yaXpvbnRhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotfTsKLQogLyogcmVhZCBhIHJlZ2lzdGVyICovCiBzdGF0aWMgaW50IG92OTc0MF9yZWdfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnLCB1OCAqdmFsKQogewpAQCAtNTYwLDI1ICs1NDMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIEFsdGVyIGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLwotc3RhdGljIGludCBvdjk3NDBfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXJldHVybiAwOwotfQotCi0vKiBSZXF1ZXN0IGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Y5NzQwX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9NQVNURVIgfAotCQlTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8IFNPQ0FNX0RBVEFXSURUSF84OwotCi0JcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwotfQotCiAvKiBzZWxlY3QgbmVhcmVzdCBoaWdoZXIgcmVzb2x1dGlvbiBmb3IgY2FwdHVyZSAqLwogc3RhdGljIHZvaWQgb3Y5NzQwX3Jlc19yb3VuZHVwKHUzMiAqd2lkdGgsIHUzMiAqaGVpZ2h0KQogewpAQCAtNzg4LDM2ICs3NTIsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogR2V0IHN0YXR1cyBvZiBhZGRpdGlvbmFsIGNhbWVyYSBjYXBhYmlsaXRpZXMgKi8KLXN0YXRpYyBpbnQgb3Y5NzQwX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBvdjk3NDBfcHJpdiAqcHJpdiA9IHRvX292OTc0MChzZCk7Ci0KLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5mbGFnX3ZmbGlwOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQljdHJsLT52YWx1ZSA9IHByaXYtPmZsYWdfaGZsaXA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCiAvKiBTZXQgc3RhdHVzIG9mIGFkZGl0aW9uYWwgY2FtZXJhIGNhcGFiaWxpdGllcyAqLwotc3RhdGljIGludCBvdjk3NDBfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IG92OTc0MF9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlzdHJ1Y3Qgb3Y5NzQwX3ByaXYgKnByaXYgPSB0b19vdjk3NDAoc2QpOworCXN0cnVjdCBvdjk3NDBfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3Qgb3Y5NzQwX3ByaXYsIGhkbCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJcHJpdi0+ZmxhZ192ZmxpcCA9IGN0cmwtPnZhbHVlOworCQlwcml2LT5mbGFnX3ZmbGlwID0gY3RybC0+dmFsOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlwcml2LT5mbGFnX2hmbGlwID0gY3RybC0+dmFsdWU7CisJCXByaXYtPmZsYWdfaGZsaXAgPSBjdHJsLT52YWw7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODkwLDE4ICs4MzYsMTMgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IG92OTc0MF92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG92OTc0MF92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgb3Y5NzQwX3ByaXYgKnByaXYgPSB0b19vdjk3NDAoc2QpOwogCXU4IG1vZGVsaGksIG1vZGVsbG87CiAJaW50IHJldDsKIAotCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCi0JQlVHX09OKCFpY2QtPnBhcmVudCB8fAotCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKLQogCS8qCiAJICogY2hlY2sgYW5kIHNob3cgcHJvZHVjdCBJRCBhbmQgbWFudWZhY3R1cmVyIElECiAJICovCkBAIC05NDIsMjUgKzg4MywzMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgb3Y5NzQwX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSBvdjk3NDBfc2V0X2J1c19wYXJhbSwKLQkucXVlcnlfYnVzX3BhcmFtCT0gb3Y5NzQwX3F1ZXJ5X2J1c19wYXJhbSwKLQkuY29udHJvbHMJCT0gb3Y5NzQwX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShvdjk3NDBfY29udHJvbHMpLAotfTsKKy8qIFJlcXVlc3QgYnVzIHNldHRpbmdzIG9uIGNhbWVyYSBzaWRlICovCitzdGF0aWMgaW50IG92OTc0MF9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfTUFTVEVSIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0g7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMOworCWNmZy0+ZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKTsKKworCXJldHVybiAwOworfQogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBvdjk3NDBfdmlkZW9fb3BzID0gewotCS5zX3N0cmVhbQkJPSBvdjk3NDBfc19zdHJlYW0sCi0JLnNfbWJ1c19mbXQJCT0gb3Y5NzQwX3NfZm10LAotCS50cnlfbWJ1c19mbXQJCT0gb3Y5NzQwX3RyeV9mbXQsCi0JLmVudW1fbWJ1c19mbXQJCT0gb3Y5NzQwX2VudW1fZm10LAotCS5jcm9wY2FwCQk9IG92OTc0MF9jcm9wY2FwLAotCS5nX2Nyb3AJCQk9IG92OTc0MF9nX2Nyb3AsCisJLnNfc3RyZWFtCT0gb3Y5NzQwX3Nfc3RyZWFtLAorCS5zX21idXNfZm10CT0gb3Y5NzQwX3NfZm10LAorCS50cnlfbWJ1c19mbXQJPSBvdjk3NDBfdHJ5X2ZtdCwKKwkuZW51bV9tYnVzX2ZtdAk9IG92OTc0MF9lbnVtX2ZtdCwKKwkuY3JvcGNhcAk9IG92OTc0MF9jcm9wY2FwLAorCS5nX2Nyb3AJCT0gb3Y5NzQwX2dfY3JvcCwKKwkuZ19tYnVzX2NvbmZpZwk9IG92OTc0MF9nX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjk3NDBfY29yZV9vcHMgPSB7Ci0JLmdfY3RybAkJCT0gb3Y5NzQwX2dfY3RybCwKLQkuc19jdHJsCQkJPSBvdjk3NDBfc19jdHJsLAogCS5nX2NoaXBfaWRlbnQJCT0gb3Y5NzQwX2dfY2hpcF9pZGVudCwKIAkuc19wb3dlcgkJPSBvdjk3NDBfc19wb3dlciwKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCkBAIC05NzQsNiArOTIzLDEwIEBACiAJLnZpZGVvCQkJPSAmb3Y5NzQwX3ZpZGVvX29wcywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBvdjk3NDBfY3RybF9vcHMgPSB7CisJLnNfY3RybCA9IG92OTc0MF9zX2N0cmwsCit9OworCiAvKgogICogaTJjX2RyaXZlciBmdW5jdGlvbgogICovCkBAIC05ODEsMTYgKzkzNCw5IEBACiAJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQogewogCXN0cnVjdCBvdjk3NDBfcHJpdiAqcHJpdjsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZAk9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAlpbnQgcmV0OwogCi0JaWYgKCFpY2QpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlpZiAoIWljbCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1pc3NpbmcgcGxhdGZvcm1fZGF0YSBmb3IgZHJpdmVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDAzLDEyICs5NDksMjQgQEAKIAl9CiAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCBjbGllbnQsICZvdjk3NDBfc3ViZGV2X29wcyk7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmcHJpdi0+aGRsLCAxMyk7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92OTc0MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y5NzQwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCXByaXYtPnN1YmRldi5jdHJsX2hhbmRsZXIgPSAmcHJpdi0+aGRsOworCWlmIChwcml2LT5oZGwuZXJyb3IpIHsKKwkJaW50IGVyciA9IHByaXYtPmhkbC5lcnJvcjsKIAotCWljZC0+b3BzID0gJm92OTc0MF9vcHM7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gZXJyOworCX0KIAotCXJldCA9IG92OTc0MF92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJcmV0ID0gb3Y5NzQwX3ZpZGVvX3Byb2JlKGNsaWVudCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZwcml2LT5oZGwpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWljZC0+b3BzID0gTlVMTDsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcHJpdi0+aGRsKTsKIAkJa2ZyZWUocHJpdik7CiAJfQogCkBAIC0xMDE5LDggKzk3Nyw5IEBACiB7CiAJc3RydWN0IG92OTc0MF9wcml2ICpwcml2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcHJpdi0+c3ViZGV2KTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwcml2LT5oZGwpOwogCWtmcmVlKHByaXYpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9NYWtlZmlsZQppbmRleCBkZTJmYzE0Li5jMTdmMzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL01ha2VmaWxlCkBAIC0xNiw3ICsxNiw3IEBACiAKIG9iai0kKENPTkZJR19WSURFT19QVlJVU0IyKSArPSBwdnJ1c2IyLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWRldmF0dHIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWRldmF0dHIuYwppbmRleCBlNzk5MzMxLi5jNmRhOGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1kZXZhdHRyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZGV2YXR0ci5jCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlICJwdnJ1c2IyLWRldmF0dHIuaCIKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIC8qIFRoaXMgaXMgbmVlZGVkIGluIG9yZGVyIHRvIHB1bGwgaW4gdHVuZXIgdHlwZSBpZHMuLi4gKi8KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYwppbmRleCBlOThkMzgyLi4xMjJiNDU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KQEAgLTI5OTMsNiArMjk5NCwxMyBAQAogCQlwdnIyX3N1YmRldl9zZXRfY29udHJvbChoZHcsIGlkLCAjbGFiLCAoaGR3KS0+bGFiIyNfdmFsKTsgXAogCX0KIAoraW50IHB2cjJfaGR3X2dldF9kZXRlY3RlZF9zdGQoc3RydWN0IHB2cjJfaGR3ICpoZHcsIHY0bDJfc3RkX2lkICpzdGQpCit7CisJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmhkdy0+djRsMl9kZXYsIDAsCisJCQkgICAgIHZpZGVvLCBxdWVyeXN0ZCwgc3RkKTsKKwlyZXR1cm4gMDsKK30KKwogLyogRXhlY3V0ZSB3aGF0ZXZlciBjb21tYW5kcyBhcmUgcmVxdWlyZWQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiBhbGwgdGhlCiAgICBzdWItZGV2aWNlcyBzbyB0aGF0IHRoZXkgbWF0Y2ggb3VyIGN1cnJlbnQgY29udHJvbCB2YWx1ZXMuICovCiBzdGF0aWMgdm9pZCBwdnIyX3N1YmRldl91cGRhdGUoc3RydWN0IHB2cjJfaGR3ICpoZHcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oCmluZGV4IGQ3NzUzYWUuLjY2NTQ2NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oCkBAIC0yMTQsNiArMjE0LDkgQEAKIGludCBwdnIyX2hkd19nZXRfc3RkZW51bV92YWx1ZShzdHJ1Y3QgcHZyMl9oZHcgKmhkdyxzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqc3RkLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBpZHgpOwogCisvKiBHZXQgdGhlIGRldGVjdGVkIHZpZGVvIHN0YW5kYXJkICovCitpbnQgcHZyMl9oZHdfZ2V0X2RldGVjdGVkX3N0ZChzdHJ1Y3QgcHZyMl9oZHcgKmhkdywgdjRsMl9zdGRfaWQgKnN0ZCk7CisKIC8qIEVuYWJsZSAvIGRpc2FibGUgcmV0cmlldmFsIG9mIENQVSBmaXJtd2FyZSBvciBwcm9tIGNvbnRlbnRzLiAgVGhpcyBtdXN0CiAgICBiZSBlbmFibGVkIGJlZm9yZSBwdnIyX2hkd19jcHVmd19nZXQoKSB3aWxsIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IGRvaW5nCiAgICB0aGlzIG1heSBwcmV2ZW50IHRoZSBkZXZpY2UgZnJvbSBydW5uaW5nIChhbmQgbGVhdmluZyB0aGlzIG1vZGUgbWF5CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNvcmUuYwppbmRleCBlNzJkNTEwLi44ODVjZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jb3JlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvaXIta2JkLWkyYy5oPgogI2luY2x1ZGUgInB2cnVzYjItaTJjLWNvcmUuaCIKICNpbmNsdWRlICJwdnJ1c2IyLWhkdy1pbnRlcm5hbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCmluZGV4IGUyN2Y4YWIuLjZkNjY2MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJwdnJ1c2IyLXY0bDIuaCIKICNpbmNsdWRlICJwdnJ1c2IyLWlvcmVhZC5oIgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CkBAIC0yMjcsNiArMjI4LDE0IEBACiAJCWJyZWFrOwogCX0KIAorCWNhc2UgVklESU9DX1FVRVJZU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwkJKnN0ZCA9IFY0TDJfU1REX0FMTDsKKwkJcmV0ID0gcHZyMl9oZHdfZ2V0X2RldGVjdGVkX3N0ZChoZHcsIHN0ZCk7CisJCWJyZWFrOworCX0KKwogCWNhc2UgVklESU9DX0dfU1REOgogCXsKIAkJaW50IHZhbCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCmluZGV4IDUxY2EzNTguLjAxZmY2NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCkBAIC03NDQsOSArNzQ0LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBWaWRlb2J1ZjIgb3BlcmF0aW9ucyAqLwogCi1zdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKm5idWZmZXJzLAotCQkJCXVuc2lnbmVkIGludCAqbnBsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAotCQkJCXZvaWQgKmFsbG9jX2N0eHNbXSkKK3N0YXRpYyBpbnQgcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIGNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAorCQkJCXVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsIHVuc2lnbmVkIGludCAqbnBsYW5lcywKKwkJCQl1bnNpZ25lZCBpbnQgc2l6ZXNbXSwgdm9pZCAqYWxsb2NfY3R4c1tdKQogewogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CiAKQEAgLTgxNiw3ICs4MTYsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnF1ZXVlZF9idWZzX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCitzdGF0aWMgaW50IHN0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYwppbmRleCA4YzcwZTY0Li5hMTBmZjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCkBAIC04Myw2ICs4Myw3IEBACiAJLmlkCT0gUFdDX0NJRF9DVVNUT00oY29udG91ciksCiAJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCS5uYW1lCT0gIkNvbnRvdXIiLAorCS5mbGFncyAgPSBWNEwyX0NUUkxfRkxBR19TTElERVIsCiAJLm1pbgk9IDAsCiAJLm1heAk9IDYzLAogCS5zdGVwCT0gMSwKQEAgLTIwNiw4ICsyMDcsNyBAQAogCXBkZXYtPmJsdWVfYmFsYW5jZSA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKIAkJCQlWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsIDAsIDI1NSwgMSwgZGVmKTsKIAotCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMywgJnBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZSwgYXdiX21hbnVhbCwKLQkJCSAgICAgICBwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPmN1ci52YWwgPT0gYXdiX2F1dG8pOworCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMywgJnBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZSwgYXdiX21hbnVhbCwgdHJ1ZSk7CiAKIAkvKiBhdXRvZ2FpbiwgZ2FpbiAqLwogCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsIEFHQ19NT0RFX0ZPUk1BVFRFUiwgJmRlZik7CkBAIC0zMzEsMTIgKzMzMSwxMiBAQAogCXBkZXYtPnJlc3RvcmVfdXNlciA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnB3Y19yZXN0b3JlX3VzZXJfY2ZnLAogCQkJCQkJICBOVUxMKTsKIAlpZiAocGRldi0+cmVzdG9yZV91c2VyKQotCQlwZGV2LT5yZXN0b3JlX3VzZXItPmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfVVBEQVRFOworCQlwZGV2LT5yZXN0b3JlX3VzZXItPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1VQREFURTsKIAlwZGV2LT5yZXN0b3JlX2ZhY3RvcnkgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsCiAJCQkJCQkgICAgICZwd2NfcmVzdG9yZV9mYWN0b3J5X2NmZywKIAkJCQkJCSAgICAgTlVMTCk7CiAJaWYgKHBkZXYtPnJlc3RvcmVfZmFjdG9yeSkKLQkJcGRldi0+cmVzdG9yZV9mYWN0b3J5LT5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX1VQREFURTsKKwkJcGRldi0+cmVzdG9yZV9mYWN0b3J5LT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CiAKIAlpZiAoIShwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkpCiAJCXJldHVybiBoZGwtPmVycm9yOwpAQCAtNTYzLDggKzU2MywxMCBAQAogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgotCQlpZiAocGRldi0+Y29sb3JfYmFsX3ZhbGlkICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsCi0JCQkJcGRldi0+bGFzdF9jb2xvcl9iYWxfdXBkYXRlICsgSFogLyA0KSkgeworCQlpZiAocGRldi0+Y29sb3JfYmFsX3ZhbGlkICYmCisJCQkocGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgIT0gYXdiX2F1dG8gfHwKKwkJCSB0aW1lX2JlZm9yZShqaWZmaWVzLAorCQkJCXBkZXYtPmxhc3RfY29sb3JfYmFsX3VwZGF0ZSArIEhaIC8gNCkpKSB7CiAJCQlwZGV2LT5yZWRfYmFsYW5jZS0+dmFsICA9IHBkZXYtPmxhc3RfcmVkX2JhbGFuY2U7CiAJCQlwZGV2LT5ibHVlX2JhbGFuY2UtPnZhbCA9IHBkZXYtPmxhc3RfYmx1ZV9iYWxhbmNlOwogCQkJYnJlYWs7CkBAIC02MzAsNyArNjMyLDcgQEAKIAogc3RhdGljIGludCBwd2Nfc2V0X2F3YihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJaWYgKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+aXNfbmV3KSB7CiAJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfQ0hST01fQ1RMLApAQCAtNjM5LDUyICs2NDEsMzQgQEAKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKLQkJLyogVXBkYXRlIHZhbCB3aGVuIGNvbWluZyBmcm9tIGF1dG8gb3IgZ29pbmcgdG8gYSBwcmVzZXQgKi8KLQkJaWYgKHBkZXYtPnJlZF9iYWxhbmNlLT5pc192b2xhdGlsZSB8fAotCQkgICAgcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgPT0gYXdiX2luZG9vciB8fAotCQkgICAgcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgPT0gYXdiX291dGRvb3IgfHwKLQkJICAgIHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsID09IGF3Yl9mbCkgewotCQkJaWYgKCFwZGV2LT5yZWRfYmFsYW5jZS0+aXNfbmV3KQotCQkJCXB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKLQkJCQkJUkVBRF9SRURfR0FJTl9GT1JNQVRURVIsCi0JCQkJCSZwZGV2LT5yZWRfYmFsYW5jZS0+dmFsKTsKLQkJCWlmICghcGRldi0+Ymx1ZV9iYWxhbmNlLT5pc19uZXcpCi0JCQkJcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAotCQkJCQlSRUFEX0JMVUVfR0FJTl9GT1JNQVRURVIsCi0JCQkJCSZwZGV2LT5ibHVlX2JhbGFuY2UtPnZhbCk7Ci0JCX0KLQkJaWYgKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsID09IGF3Yl9hdXRvKSB7Ci0JCQlwZGV2LT5yZWRfYmFsYW5jZS0+aXNfdm9sYXRpbGUgPSB0cnVlOwotCQkJcGRldi0+Ymx1ZV9iYWxhbmNlLT5pc192b2xhdGlsZSA9IHRydWU7Ci0JCQlwZGV2LT5jb2xvcl9iYWxfdmFsaWQgPSBmYWxzZTsgLyogRm9yY2UgY2FjaGUgdXBkYXRlICovCi0JCX0gZWxzZSB7Ci0JCQlwZGV2LT5yZWRfYmFsYW5jZS0+aXNfdm9sYXRpbGUgPSBmYWxzZTsKLQkJCXBkZXYtPmJsdWVfYmFsYW5jZS0+aXNfdm9sYXRpbGUgPSBmYWxzZTsKLQkJfQotCX0KLQotCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5yZWRfYmFsYW5jZS0+aXNfbmV3KSB7CiAJCWlmIChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCAhPSBhd2JfbWFudWFsKQotCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXBkZXYtPmNvbG9yX2JhbF92YWxpZCA9IGZhbHNlOyAvKiBGb3JjZSBjYWNoZSB1cGRhdGUgKi8KKwl9CisJaWYgKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsICE9IGF3Yl9tYW51YWwpCisJCXJldHVybiAwOworCisJaWYgKHBkZXYtPnJlZF9iYWxhbmNlLT5pc19uZXcpIHsKIAkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9DSFJPTV9DVEwsCiAJCQkJICAgICAgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIsCiAJCQkJICAgICAgcGRldi0+cmVkX2JhbGFuY2UtPnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5ibHVlX2JhbGFuY2UtPmlzX25ldykgewotCQlpZiAocGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgIT0gYXdiX21hbnVhbCkKLQkJCXJldHVybiAtRUJVU1k7CisJaWYgKHBkZXYtPmJsdWVfYmFsYW5jZS0+aXNfbmV3KSB7CiAJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfQ0hST01fQ1RMLAogCQkJCSAgICAgIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUiwKIAkJCQkgICAgICBwZGV2LT5ibHVlX2JhbGFuY2UtPnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKiBGb3IgQ09ERUMyIG1vZGVscyB3aGljaCBoYXZlIHNlcGFyYXRlIGF1dG9nYWluIGFuZCBhdXRvIGV4cG9zdXJlICovCiBzdGF0aWMgaW50IHB3Y19zZXRfYXV0b2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCWlmIChwZGV2LT5hdXRvZ2Fpbi0+aXNfbmV3KSB7CiAJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKQEAgLTY5MiwyNyArNjc2LDI4IEBACiAJCQkJICAgICAgcGRldi0+YXV0b2dhaW4tPnZhbCA/IDAgOiAweGZmKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CisKIAkJaWYgKHBkZXYtPmF1dG9nYWluLT52YWwpCiAJCQlwZGV2LT5nYWluX3ZhbGlkID0gZmFsc2U7IC8qIEZvcmNlIGNhY2hlIHVwZGF0ZSAqLwotCQllbHNlIGlmICghcGRldi0+Z2Fpbi0+aXNfbmV3KQotCQkJcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAotCQkJCQlSRUFEX0FHQ19GT1JNQVRURVIsCi0JCQkJCSZwZGV2LT5nYWluLT52YWwpOwogCX0KLQlpZiAocmV0ID09IDAgJiYgcGRldi0+Z2Fpbi0+aXNfbmV3KSB7Ci0JCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQotCQkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQorCQlyZXR1cm4gMDsKKworCWlmIChwZGV2LT5nYWluLT5pc19uZXcpIHsKIAkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAogCQkJCSAgICAgIFBSRVNFVF9BR0NfRk9STUFUVEVSLAogCQkJCSAgICAgIHBkZXYtPmdhaW4tPnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKiBGb3IgQ09ERUMyIG1vZGVscyB3aGljaCBoYXZlIHNlcGFyYXRlIGF1dG9nYWluIGFuZCBhdXRvIGV4cG9zdXJlICovCiBzdGF0aWMgaW50IHB3Y19zZXRfZXhwb3N1cmVfYXV0byhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCWludCBpc19hdXRvID0gcGRldi0+ZXhwb3N1cmVfYXV0by0+dmFsID09IFY0TDJfRVhQT1NVUkVfQVVUTzsKIAogCWlmIChwZGV2LT5leHBvc3VyZV9hdXRvLT5pc19uZXcpIHsKQEAgLTcyMSwyNyArNzA2LDI4IEBACiAJCQkJICAgICAgaXNfYXV0byA/IDAgOiAweGZmKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CisKIAkJaWYgKGlzX2F1dG8pCiAJCQlwZGV2LT5leHBvc3VyZV92YWxpZCA9IGZhbHNlOyAvKiBGb3JjZSBjYWNoZSB1cGRhdGUgKi8KLQkJZWxzZSBpZiAoIXBkZXYtPmV4cG9zdXJlLT5pc19uZXcpCi0JCQlwd2NfZ2V0X3UxNl9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAotCQkJCQkgUkVBRF9TSFVUVEVSX0ZPUk1BVFRFUiwKLQkJCQkJICZwZGV2LT5leHBvc3VyZS0+dmFsKTsKIAl9Ci0JaWYgKHJldCA9PSAwICYmIHBkZXYtPmV4cG9zdXJlLT5pc19uZXcpIHsKLQkJaWYgKGlzX2F1dG8pCi0JCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGlzX2F1dG8pCisJCXJldHVybiAwOworCisJaWYgKHBkZXYtPmV4cG9zdXJlLT5pc19uZXcpIHsKIAkJcmV0ID0gcHdjX3NldF91MTZfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKIAkJCQkgICAgICAgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSLAogCQkJCSAgICAgICBwZGV2LT5leHBvc3VyZS0+dmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIEZvciBDT0RFQzMgbW9kZWxzIHdoaWNoIGhhdmUgYXV0b2dhaW4gY29udHJvbGxpbmcgYm90aCBnYWluIGFuZCBleHBvc3VyZSAqLwogc3RhdGljIGludCBwd2Nfc2V0X2F1dG9nYWluX2V4cG8oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCWlmIChwZGV2LT5hdXRvZ2Fpbi0+aXNfbmV3KSB7CiAJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKQEAgLTc0OSwzNSArNzM1LDMyIEBACiAJCQkJICAgICAgcGRldi0+YXV0b2dhaW4tPnZhbCA/IDAgOiAweGZmKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CisKIAkJaWYgKHBkZXYtPmF1dG9nYWluLT52YWwpIHsKIAkJCXBkZXYtPmdhaW5fdmFsaWQgICAgID0gZmFsc2U7IC8qIEZvcmNlIGNhY2hlIHVwZGF0ZSAqLwogCQkJcGRldi0+ZXhwb3N1cmVfdmFsaWQgPSBmYWxzZTsgLyogRm9yY2UgY2FjaGUgdXBkYXRlICovCi0JCX0gZWxzZSB7Ci0JCQlpZiAoIXBkZXYtPmdhaW4tPmlzX25ldykKLQkJCQlwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCi0JCQkJCQlSRUFEX0FHQ19GT1JNQVRURVIsCi0JCQkJCQkmcGRldi0+Z2Fpbi0+dmFsKTsKLQkJCWlmICghcGRldi0+ZXhwb3N1cmUtPmlzX25ldykKLQkJCQlwd2NfZ2V0X3UxNl9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAotCQkJCQkJIFJFQURfU0hVVFRFUl9GT1JNQVRURVIsCi0JCQkJCQkgJnBkZXYtPmV4cG9zdXJlLT52YWwpOwogCQl9CiAJfQotCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5nYWluLT5pc19uZXcpIHsKLQkJaWYgKHBkZXYtPmF1dG9nYWluLT52YWwpCi0JCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHBkZXYtPmF1dG9nYWluLT52YWwpCisJCXJldHVybiAwOworCisJaWYgKHBkZXYtPmdhaW4tPmlzX25ldykgewogCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCiAJCQkJICAgICAgUFJFU0VUX0FHQ19GT1JNQVRURVIsCiAJCQkJICAgICAgcGRldi0+Z2Fpbi0+dmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQotCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5leHBvc3VyZS0+aXNfbmV3KSB7Ci0JCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQotCQkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChwZGV2LT5leHBvc3VyZS0+aXNfbmV3KSB7CiAJCXJldCA9IHB3Y19zZXRfdTE2X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCiAJCQkJICAgICAgIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUiwKIAkJCQkgICAgICAgcGRldi0+ZXhwb3N1cmUtPnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHB3Y19zZXRfbW90b3Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCkBAIC04NzgsMTAgKzg2MSw2IEBACiAJCQkJCXBkZXYtPmF1dG9jb250b3VyLT52YWwgPyAwIDogMHhmZik7CiAJCX0KIAkJaWYgKHJldCA9PSAwICYmIHBkZXYtPmNvbnRvdXItPmlzX25ldykgewotCQkJaWYgKHBkZXYtPmF1dG9jb250b3VyLT52YWwpIHsKLQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQkJYnJlYWs7Ci0JCQl9CiAJCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCiAJCQkJCSAgICAgIFBSRVNFVF9DT05UT1VSX0ZPUk1BVFRFUiwKIAkJCQkJICAgICAgcGRldi0+Y29udG91ci0+dmFsKTsKQEAgLTEwOTksNiArMTA3OCwxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHB3Y19sb2dfc3RhdHVzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCXY0bDJfY3RybF9oYW5kbGVyX2xvZ19zdGF0dXMoJnBkZXYtPmN0cmxfaGFuZGxlciwgUFdDX05BTUUpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgbG9uZyBwd2NfZGVmYXVsdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIGJvb2wgdmFsaWRfcHJpbywKIAkJCWludCBjbWQsIHZvaWQgKmFyZykKIHsKQEAgLTExMjIsNiArMTEwOSw3IEBACiAJLnZpZGlvY19kcWJ1ZgkJCSAgICA9IHB3Y19kcWJ1ZiwKIAkudmlkaW9jX3N0cmVhbW9uCQkgICAgPSBwd2Nfc3RyZWFtb24sCiAJLnZpZGlvY19zdHJlYW1vZmYJCSAgICA9IHB3Y19zdHJlYW1vZmYsCisJLnZpZGlvY19sb2dfc3RhdHVzCQkgICAgPSBwd2NfbG9nX3N0YXR1cywKIAkudmlkaW9jX2VudW1fZnJhbWVzaXplcwkJICAgID0gcHdjX2VudW1fZnJhbWVzaXplcywKIAkudmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMJICAgID0gcHdjX2VudW1fZnJhbWVpbnRlcnZhbHMsCiAJLnZpZGlvY19kZWZhdWx0CQkgICAgPSBwd2NfZGVmYXVsdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMKaW5kZXggZDA3ZGYyMmEuLjc5ZmIyMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCkBAIC0yMTQsNiArMjE0LDcgQEAKIAl1bnNpZ25lZCBsb25nCQljaWNsazsKIAl1bnNpZ25lZCBsb25nCQltY2xrOwogCXUzMgkJCW1jbGtfZGl2aXNvcjsKKwl1MTYJCQl3aWR0aF9mbGFnczsJLyogbWF4IDEwIGJpdHMgKi8KIAogCXN0cnVjdCBsaXN0X2hlYWQJY2FwdHVyZTsKIApAQCAtMTAyMCwzNyArMTAyMSwyMCBAQAogCSAqIHF1aWNrIGNhcHR1cmUgaW50ZXJmYWNlIHN1cHBvcnRzIGJvdGguCiAJICovCiAJKmZsYWdzID0gKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfTUFTVEVSID8KLQkJICBTT0NBTV9NQVNURVIgOiBTT0NBTV9TTEFWRSkgfAotCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9MT1cgfAotCQlTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cgfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwKLQkJU09DQU1fUENMS19TQU1QTEVfRkFMTElORzsKKwkJICBWNEwyX01CVVNfTUFTVEVSIDogVjRMMl9NQlVTX1NMQVZFKSB8CisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cgfAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfAorCQlWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORzsKIAogCS8qIElmIHJlcXVlc3RlZCBkYXRhIHdpZHRoIGlzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0sIHVzZSBpdCAqLwotCXN3aXRjaCAoYnVzd2lkdGgpIHsKLQljYXNlIDEwOgotCQlpZiAoIShwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX0RBVEFXSURUSF8xMCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJKmZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF8xMDsKLQkJYnJlYWs7Ci0JY2FzZSA5OgotCQlpZiAoIShwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX0RBVEFXSURUSF85KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQkqZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzk7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJaWYgKCEocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9EQVRBV0lEVEhfOCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJKmZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF84OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaWYgKCgxIDw8IChidXN3aWR0aCAtIDEpKSAmIHBjZGV2LT53aWR0aF9mbGFncykKKwkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIHZvaWQgcHhhX2NhbWVyYV9zZXR1cF9jaWNyKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLApAQCAtMTA3MCwxMiArMTA1NCwxMiBAQAogCSAqIERhdGF3aWR0aCBpcyBub3cgZ3VhcmFudGVlZCB0byBiZSBlcXVhbCB0byBvbmUgb2YgdGhlIHRocmVlIHZhbHVlcy4KIAkgKiBXZSBmaXggYml0LXBlci1waXhlbCBlcXVhbCB0byBkYXRhLXdpZHRoLi4uCiAJICovCi0Jc3dpdGNoIChmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF9NQVNLKSB7Ci0JY2FzZSBTT0NBTV9EQVRBV0lEVEhfMTA6CisJc3dpdGNoIChpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+Yml0c19wZXJfc2FtcGxlKSB7CisJY2FzZSAxMDoKIAkJZHcgPSA0OwogCQlicHAgPSAweDQwOwogCQlicmVhazsKLQljYXNlIFNPQ0FNX0RBVEFXSURUSF85OgorCWNhc2UgOToKIAkJZHcgPSAzOwogCQlicHAgPSAweDIwOwogCQlicmVhazsKQEAgLTEwODQsNyArMTA2OCw3IEBACiAJCSAqIEFjdHVhbGx5IGl0IGNhbiBvbmx5IGJlIDggbm93LAogCQkgKiBkZWZhdWx0IGlzIGp1c3QgdG8gc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncwogCQkgKi8KLQljYXNlIFNPQ0FNX0RBVEFXSURUSF84OgorCWNhc2UgODoKIAkJZHcgPSAyOwogCQlicHAgPSAwOwogCX0KQEAgLTEwOTMsMTEgKzEwNzcsMTEgQEAKIAkJY2ljcjQgfD0gQ0lDUjRfUENMS19FTjsKIAlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9NQ0xLX0VOKQogCQljaWNyNCB8PSBDSUNSNF9NQ0xLX0VOOwotCWlmIChmbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpCisJaWYgKGZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpCiAJCWNpY3I0IHw9IENJQ1I0X1BDUDsKLQlpZiAoZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKQorCWlmIChmbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKQogCQljaWNyNCB8PSBDSUNSNF9IU1A7Ci0JaWYgKGZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykKKwlpZiAoZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVykKIAkJY2ljcjQgfD0gQ0lDUjRfVlNQOwogCiAJY2ljcjAgPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1IwKTsKQEAgLTExNTEsOSArMTEzNSwxMSBAQAogCiBzdGF0aWMgaW50IHB4YV9jYW1lcmFfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgX191MzIgcGl4Zm10KQogeworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGJ1c19mbGFncywgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3M7CisJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgY2ZnID0gey50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMLH07CisJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNvbW1vbl9mbGFnczsKIAlpbnQgcmV0OwogCXN0cnVjdCBweGFfY2FtICpjYW0gPSBpY2QtPmhvc3RfcHJpdjsKIApAQCAtMTE2Miw0NSArMTE0OCw1OSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JY2FtZXJhX2ZsYWdzID0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbShpY2QpOwotCi0JY29tbW9uX2ZsYWdzID0gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsIGJ1c19mbGFncyk7Ci0JaWYgKCFjb21tb25fZmxhZ3MpCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLAorCQkJCQkJCSAgYnVzX2ZsYWdzKTsKKwkJaWYgKCFjb21tb25fZmxhZ3MpIHsKKwkJCWRldl93YXJuKGljZC0+cGFyZW50LAorCQkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgMHgleCwgaG9zdCAweCVseFxuIiwKKwkJCQkgY2ZnLmZsYWdzLCBidXNfZmxhZ3MpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpIHsKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQljb21tb25fZmxhZ3MgPSBidXNfZmxhZ3M7CisJfQogCiAJcGNkZXYtPmNoYW5uZWxzID0gMTsKIAogCS8qIE1ha2UgY2hvaXNlcywgYmFzZWQgb24gcGxhdGZvcm0gcHJlZmVyZW5jZXMgKi8KLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKSkgewogCQlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9IU1ApCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0g7CiAJCWVsc2UKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fSFNZTkNfQUNUSVZFX0xPVzsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1c7CiAJfQogCi0JaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCkgJiYKLQkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0gpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVykpIHsKIAkJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfVlNQKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfSElHSDsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIOwogCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1ZTWU5DX0FDVElWRV9MT1c7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XOwogCX0KIAotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfUklTSU5HKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORykpIHsKIAkJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfUENQKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkc7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkc7CiAJCWVsc2UKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfRkFMTElORzsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkc7CisJfQorCisJY2ZnLmZsYWdzID0gY29tbW9uX2ZsYWdzOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCWRldl9kYmcoaWNkLT5wYXJlbnQsICJjYW1lcmEgc19tYnVzX2NvbmZpZygweCVseCkgcmV0dXJuZWQgJWRcbiIsCisJCQljb21tb25fZmxhZ3MsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCiAJY2FtLT5mbGFncyA9IGNvbW1vbl9mbGFnczsKIAotCXJldCA9IGljZC0+b3BzLT5zZXRfYnVzX3BhcmFtKGljZCwgY29tbW9uX2ZsYWdzKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQogCXB4YV9jYW1lcmFfc2V0dXBfY2ljcihpY2QsIGNvbW1vbl9mbGFncywgcGl4Zm10KTsKIAogCXJldHVybiAwOwpAQCAtMTIwOSwxNyArMTIwOSwzMSBAQAogc3RhdGljIGludCBweGFfY2FtZXJhX3RyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICAgIHVuc2lnbmVkIGNoYXIgYnVzd2lkdGgpCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwotCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjYW1lcmFfZmxhZ3M7CisJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgY2ZnID0gey50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMLH07CisJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNvbW1vbl9mbGFnczsKIAlpbnQgcmV0ID0gdGVzdF9wbGF0Zm9ybV9wYXJhbShwY2RldiwgYnVzd2lkdGgsICZidXNfZmxhZ3MpOwogCiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQljYW1lcmFfZmxhZ3MgPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtKGljZCk7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19jb25maWcsICZjZmcpOworCWlmICghcmV0KSB7CisJCWNvbW1vbl9mbGFncyA9IHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKCZjZmcsCisJCQkJCQkJICBidXNfZmxhZ3MpOworCQlpZiAoIWNvbW1vbl9mbGFncykgeworCQkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCisJCQkJICJGbGFncyBpbmNvbXBhdGlibGU6IGNhbWVyYSAweCV4LCBob3N0IDB4JWx4XG4iLAorCQkJCSBjZmcuZmxhZ3MsIGJ1c19mbGFncyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAocmV0ID09IC1FTk9JT0NUTENNRCkgeworCQlyZXQgPSAwOworCX0KIAotCXJldHVybiBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywgYnVzX2ZsYWdzKSA/IDAgOiAtRUlOVkFMOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgcHhhX2NhbWVyYV9mb3JtYXRzW10gPSB7CkBAIC0xNjg3LDYgKzE3MDEsMTIgQEAKIAkJCSAiZGF0YSB3aWR0aHMsIHVzaW5nIGRlZmF1bHQgMTAgYml0XG4iKTsKIAkJcGNkZXYtPnBsYXRmb3JtX2ZsYWdzIHw9IFBYQV9DQU1FUkFfREFUQVdJRFRIXzEwOwogCX0KKwlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9EQVRBV0lEVEhfOCkKKwkJcGNkZXYtPndpZHRoX2ZsYWdzID0gMSA8PCA3OworCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX0RBVEFXSURUSF85KQorCQlwY2Rldi0+d2lkdGhfZmxhZ3MgfD0gMSA8PCA4OworCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX0RBVEFXSURUSF8xMCkKKwkJcGNkZXYtPndpZHRoX2ZsYWdzIHw9IDEgPDwgOTsKIAlwY2Rldi0+bWNsayA9IHBjZGV2LT5wZGF0YS0+bWNsa18xMGtoeiAqIDEwMDAwOwogCWlmICghcGNkZXYtPm1jbGspIHsKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcmo1NG4xY2IwYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9yajU0bjFjYjBjLmMKaW5kZXggODQ3Y2NjMC4uOTkzNzM4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9yajU0bjFjYjBjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9yajU0bjFjYjBjLmMKQEAgLTExLDEzICsxMSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3JqNTRuMWNiMGMuaD4KICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc29jX21lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CiAKICNkZWZpbmUgUko1NE4xX0RFVl9DT0RFCQkJMHgwNDAwCiAjZGVmaW5lIFJKNTROMV9ERVZfQ09ERTIJCTB4MDQwMQpAQCAtMTQ4LDYgKzE1MCw3IEBACiAKIHN0cnVjdCByajU0bjEgewogCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGhkbDsKIAlzdHJ1Y3Qgcmo1NG4xX2Nsb2NrX2RpdiBjbGtfZGl2OwogCWNvbnN0IHN0cnVjdCByajU0bjFfZGF0YWZtdCAqZm10OwogCXN0cnVjdCB2NGwyX3JlY3QgcmVjdDsJLyogU2Vuc29yIHdpbmRvdyAqLwpAQCAtNDk5LDMxICs1MDIsNiBAQAogCXJldHVybiByZWdfc2V0KGNsaWVudCwgUko1NE4xX1NUSUxMX0NPTlRST0wsICghZW5hYmxlKSA8PCA3LCAweDgwKTsKIH0KIAotc3RhdGljIGludCByajU0bjFfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQkvKiBGaWd1cmVzIDIuNS0xIHRvIDIuNS0zIC0gZGVmYXVsdCBmYWxsaW5nIHBpeGNsayBlZGdlICovCi0KLQlpZiAoZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcpCi0JCXJldHVybiByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfT1VUX1NJR1BPLCAxIDw8IDQpOwotCWVsc2UKLQkJcmV0dXJuIHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9PVVRfU0lHUE8sIDApOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByajU0bjFfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgZmxhZ3MgPQotCQlTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKLQkJU09DQU1fTUFTVEVSIHwgU09DQU1fREFUQVdJRFRIXzggfAotCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSDsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLX0KLQogc3RhdGljIGludCByajU0bjFfc2V0X3JlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgIHUxNiByZWdfeCwgdTE2IHJlZ195LCB1MTYgcmVnX3h5LAogCQkJICAgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KQpAQCAtMTIwMiwxMzQgKzExODAsNTEgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIHJqNTRuMV9jb250cm9sc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9IRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgSG9yaXpvbnRhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZQkJPSAiR2FpbiIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxMjcsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gNjYsCi0JCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19TTElERVIsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiQXV0byB3aGl0ZSBiYWxhbmNlIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyByajU0bjFfb3BzID0gewotCS5zZXRfYnVzX3BhcmFtCQk9IHJqNTRuMV9zZXRfYnVzX3BhcmFtLAotCS5xdWVyeV9idXNfcGFyYW0JPSByajU0bjFfcXVlcnlfYnVzX3BhcmFtLAotCS5jb250cm9scwkJPSByajU0bjFfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJqNTRuMV9jb250cm9scyksCi19OwotCi1zdGF0aWMgaW50IHJqNTRuMV9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgcmo1NG4xX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogeworCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3Qgcmo1NG4xLCBoZGwpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSAmcmo1NG4xLT5zdWJkZXY7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IHRvX3JqNTRuMShjbGllbnQpOwogCWludCBkYXRhOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIFJKNTROMV9NSVJST1JfU1RJTExfTU9ERSk7Ci0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9ICEoZGF0YSAmIDEpOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBSSjU0TjFfTUlSUk9SX1NUSUxMX01PREUpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSAhKGRhdGEgJiAyKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBSSjU0TjFfWV9HQUlOKTsKLQkJaWYgKGRhdGEgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJY3RybC0+dmFsdWUgPSBkYXRhIC8gMjsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6Ci0JCWN0cmwtPnZhbHVlID0gcmo1NG4xLT5hdXRvX3diOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByajU0bjFfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0JaW50IGRhdGE7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IHRvX3JqNTRuMShjbGllbnQpOwotCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmw7Ci0KLQlxY3RybCA9IHNvY19jYW1lcmFfZmluZF9xY3RybCgmcmo1NG4xX29wcywgY3RybC0+aWQpOwotCWlmICghcWN0cmwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWlmIChjdHJsLT52YWx1ZSkKKwkJaWYgKGN0cmwtPnZhbCkKIAkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgUko1NE4xX01JUlJPUl9TVElMTF9NT0RFLCAwLCAxKTsKIAkJZWxzZQogCQkJZGF0YSA9IHJlZ19zZXQoY2xpZW50LCBSSjU0TjFfTUlSUk9SX1NUSUxMX01PREUsIDEsIDEpOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7CisJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCWlmIChjdHJsLT52YWx1ZSkKKwkJaWYgKGN0cmwtPnZhbCkKIAkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgUko1NE4xX01JUlJPUl9TVElMTF9NT0RFLCAwLCAyKTsKIAkJZWxzZQogCQkJZGF0YSA9IHJlZ19zZXQoY2xpZW50LCBSSjU0TjFfTUlSUk9SX1NUSUxMX01PREUsIDIsIDIpOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7CisJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJaWYgKGN0cmwtPnZhbHVlID4gcWN0cmwtPm1heGltdW0gfHwKLQkJICAgIGN0cmwtPnZhbHVlIDwgcWN0cmwtPm1pbmltdW0pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZWxzZSBpZiAocmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX1lfR0FJTiwgY3RybC0+dmFsdWUgKiAyKSA8IDApCisJCWlmIChyZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfWV9HQUlOLCBjdHJsLT52YWwgKiAyKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7CisJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgogCQkvKiBBdXRvIFdCIGFyZWEgLSB3aG9sZSBpbWFnZSAqLwotCQlpZiAocmVnX3NldChjbGllbnQsIFJKNTROMV9XQl9TRUxfV0VJR0hUX0ksIGN0cmwtPnZhbHVlIDw8IDcsCisJCWlmIChyZWdfc2V0KGNsaWVudCwgUko1NE4xX1dCX1NFTF9XRUlHSFRfSSwgY3RybC0+dmFsIDw8IDcsCiAJCQkgICAgMHg4MCkgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCXJqNTRuMS0+YXV0b193YiA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKKwkJcmo1NG4xLT5hdXRvX3diID0gY3RybC0+dmFsOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIHJqNTRuMV9jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gcmo1NG4xX3NfY3RybCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgcmo1NG4xX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuZ19jdHJsCQk9IHJqNTRuMV9nX2N0cmwsCi0JLnNfY3RybAkJPSByajU0bjFfc19jdHJsLAogCS5nX2NoaXBfaWRlbnQJPSByajU0bjFfZ19jaGlwX2lkZW50LAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIAkuZ19yZWdpc3Rlcgk9IHJqNTRuMV9nX3JlZ2lzdGVyLApAQCAtMTMzNyw2ICsxMjMyLDM2IEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBpbnQgcmo1NG4xX2dfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisKKwljZmctPmZsYWdzID0KKwkJVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKKwkJVjRMMl9NQlVTX01BU1RFUiB8IFY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKwljZmctPmZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByajU0bjFfc19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCWNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCS8qIEZpZ3VyZXMgMi41LTEgdG8gMi41LTMgLSBkZWZhdWx0IGZhbGxpbmcgcGl4Y2xrIGVkZ2UgKi8KKwlpZiAoc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZykgJgorCSAgICBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKQorCQlyZXR1cm4gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX09VVF9TSUdQTywgMSA8PCA0KTsKKwllbHNlCisJCXJldHVybiByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfT1VUX1NJR1BPLCAwKTsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgcmo1NG4xX3N1YmRldl92aWRlb19vcHMgPSB7CiAJLnNfc3RyZWFtCT0gcmo1NG4xX3Nfc3RyZWFtLAogCS5zX21idXNfZm10CT0gcmo1NG4xX3NfZm10LApAQCAtMTM0Niw2ICsxMjcxLDggQEAKIAkuZ19jcm9wCQk9IHJqNTRuMV9nX2Nyb3AsCiAJLnNfY3JvcAkJPSByajU0bjFfc19jcm9wLAogCS5jcm9wY2FwCT0gcmo1NG4xX2Nyb3BjYXAsCisJLmdfbWJ1c19jb25maWcJPSByajU0bjFfZ19tYnVzX2NvbmZpZywKKwkuc19tYnVzX2NvbmZpZwk9IHJqNTRuMV9zX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgcmo1NG4xX3N1YmRldl9vcHMgPSB7CkBAIC0xMzU3LDE3ICsxMjg0LDEyIEBACiAgKiBJbnRlcmZhY2UgYWN0aXZlLCBjYW4gdXNlIGkyYy4gSWYgaXQgZmFpbHMsIGl0IGNhbiBpbmRlZWQgbWVhbiwgdGhhdAogICogdGhpcyB3YXNuJ3Qgb3VyIGNhcHR1cmUgaW50ZXJmYWNlLCBzbywgd2Ugd2FpdCBmb3IgdGhlIHJpZ2h0IG9uZQogICovCi1zdGF0aWMgaW50IHJqNTRuMV92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IHJqNTRuMV92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICAgICAgc3RydWN0IHJqNTRuMV9wZGF0YSAqcHJpdikKIHsKIAlpbnQgZGF0YTEsIGRhdGEyOwogCWludCByZXQ7CiAKLQkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLwotCUJVR19PTighaWNkLT5wYXJlbnQgfHwKLQkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7Ci0KIAkvKiBSZWFkIG91dCB0aGUgY2hpcCB2ZXJzaW9uIHJlZ2lzdGVyICovCiAJZGF0YTEgPSByZWdfcmVhZChjbGllbnQsIFJKNTROMV9ERVZfQ09ERSk7CiAJZGF0YTIgPSByZWdfcmVhZChjbGllbnQsIFJKNTROMV9ERVZfQ09ERTIpOwpAQCAtMTM5NSwxOCArMTMxNywxMSBAQAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIHsKIAlzdHJ1Y3Qgcmo1NG4xICpyajU0bjE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKIAlzdHJ1Y3Qgcmo1NG4xX3BkYXRhICpyajU0bjFfcHJpdjsKIAlpbnQgcmV0OwogCi0JaWYgKCFpY2QpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJSSjU0TjFDQjBDOiBtaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlpZiAoIWljbCB8fCAhaWNsLT5wcml2KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUko1NE4xQ0IwQzogbWlzc2luZyBwbGF0Zm9ybSBkYXRhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQyNSw4ICsxMzQwLDIyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnJqNTRuMS0+c3ViZGV2LCBjbGllbnQsICZyajU0bjFfc3ViZGV2X29wcyk7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmcmo1NG4xLT5oZGwsIDQpOworCXY0bDJfY3RybF9uZXdfc3RkKCZyajU0bjEtPmhkbCwgJnJqNTRuMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcmo1NG4xLT5oZGwsICZyajU0bjFfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9IRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJnJqNTRuMS0+aGRsLCAmcmo1NG4xX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfR0FJTiwgMCwgMTI3LCAxLCA2Nik7CisJdjRsMl9jdHJsX25ld19zdGQoJnJqNTRuMS0+aGRsLCAmcmo1NG4xX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLCAwLCAxLCAxLCAxKTsKKwlyajU0bjEtPnN1YmRldi5jdHJsX2hhbmRsZXIgPSAmcmo1NG4xLT5oZGw7CisJaWYgKHJqNTRuMS0+aGRsLmVycm9yKSB7CisJCWludCBlcnIgPSByajU0bjEtPmhkbC5lcnJvcjsKIAotCWljZC0+b3BzCQk9ICZyajU0bjFfb3BzOworCQlrZnJlZShyajU0bjEpOworCQlyZXR1cm4gZXJyOworCX0KIAogCXJqNTRuMS0+Y2xrX2RpdgkJPSBjbGtfZGl2OwogCXJqNTRuMS0+cmVjdC5sZWZ0CT0gUko1NE4xX0NPTFVNTl9TS0lQOwpAQCAtMTQ0MCwyNSArMTM2OSwyNCBAQAogCXJqNTRuMS0+dGdjbGtfbWh6CT0gKHJqNTRuMV9wcml2LT5tY2xrX2ZyZXEgLyBQTExfTCAqIFBMTF9OKSAvCiAJCShjbGtfZGl2LnJhdGlvX3RnICsgMSkgLyAoY2xrX2Rpdi5yYXRpb190ICsgMSk7CiAKLQlyZXQgPSByajU0bjFfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQsIHJqNTRuMV9wcml2KTsKKwlyZXQgPSByajU0bjFfdmlkZW9fcHJvYmUoY2xpZW50LCByajU0bjFfcHJpdik7CiAJaWYgKHJldCA8IDApIHsKLQkJaWNkLT5vcHMgPSBOVUxMOworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZyajU0bjEtPmhkbCk7CiAJCWtmcmVlKHJqNTRuMSk7CiAJCXJldHVybiByZXQ7CiAJfQotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJnJqNTRuMS0+aGRsKTsKIH0KIAogc3RhdGljIGludCByajU0bjFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHJqNTRuMSAqcmo1NG4xID0gdG9fcmo1NG4xKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAotCWljZC0+b3BzID0gTlVMTDsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcmo1NG4xLT5zdWJkZXYpOwogCWlmIChpY2wtPmZyZWVfYnVzKQogCQlpY2wtPmZyZWVfYnVzKGljbCk7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcmo1NG4xLT5oZGwpOwogCWtmcmVlKHJqNTRuMSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVrNmFhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1azZhYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZjdmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1azZhYS5jCkBAIC0wLDAgKzEsMTY4MSBAQAorLyoKKyAqIERyaXZlciBmb3IgU2Ftc3VuZyBTNUs2QUFGWCBTWEdBIDEvNiIgMS4zTSBDTU9TIEltYWdlIFNlbnNvcgorICogd2l0aCBlbWJlZGRlZCBTb0MgSVNQLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIFN5bHdlc3RlciBOYXdyb2NraSA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBhIGRyaXZlciBhdXRob3JlZCBieSBEb25nc29vIE5hdGhhbmllbCBLaW0uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIERvbmdzb28gTmF0aGFuaWVsIEtpbSA8ZG9uZ3NvbzQ1LmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZWRpYS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPG1lZGlhL21lZGlhLWVudGl0eS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgorI2luY2x1ZGUgPG1lZGlhL3M1azZhYS5oPgorCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworCisjZGVmaW5lIERSSVZFUl9OQU1FCQkJIlM1SzZBQSIKKworLyogVGhlIHRva2VuIHRvIGluZGljYXRlIGFycmF5IHRlcm1pbmF0aW9uICovCisjZGVmaW5lIFM1SzZBQV9URVJNCQkJMHhmZmZmCisjZGVmaW5lIFM1SzZBQV9PVVRfV0lEVEhfREVGCQk2NDAKKyNkZWZpbmUgUzVLNkFBX09VVF9IRUlHSFRfREVGCQk0ODAKKyNkZWZpbmUgUzVLNkFBX1dJTl9XSURUSF9NQVgJCTEyODAKKyNkZWZpbmUgUzVLNkFBX1dJTl9IRUlHSFRfTUFYCQkxMDI0CisjZGVmaW5lIFM1SzZBQV9XSU5fV0lEVEhfTUlOCQk4CisjZGVmaW5lIFM1SzZBQV9XSU5fSEVJR0hUX01JTgkJOAorCisvKgorICogSC9XIHJlZ2lzdGVyIEludGVyZmFjZSAoMHhEMDAwMDAwMCAtIDB4RDAwMDBGRkYpCisgKi8KKyNkZWZpbmUgQUhCX01TQl9BRERSX1BUUgkJMHhmY2ZjCisjZGVmaW5lIEdFTl9SRUdfT0ZGU0gJCQkweGQwMDAKKyNkZWZpbmUgUkVHX0NNRFdSX0FERFJICQkJMHgwMDI4CisjZGVmaW5lIFJFR19DTURXUl9BRERSTAkJCTB4MDAyYQorI2RlZmluZSBSRUdfQ01EUkRfQUREUkgJCQkweDAwMmMKKyNkZWZpbmUgUkVHX0NNRFJEX0FERFJMCQkJMHgwMDJlCisjZGVmaW5lIFJFR19DTURCVUYwX0FERFIJCTB4MGYxMgorI2RlZmluZSBSRUdfQ01EQlVGMV9BRERSCQkweDBmMTAKKworLyoKKyAqIEhvc3QgUy9XIFJlZ2lzdGVyIGludGVyZmFjZSAoMHg3MDAwMDAwMCAtIDB4NzAwMDIwMDApCisgKiBUaGUgdmFsdWUgb2YgdGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGFkZHJlc3MgYnl0ZXMgaXMgMHg3MDAwLAorICogKEhPU1RfU1dJRl9PRkZTX0gpLiBUaGUgcmVnaXN0ZXIgYWRkcmVzc2VzIGJlbG93IHNwZWNpZnkgMiBMU0JzLgorICovCisjZGVmaW5lIEhPU1RfU1dJRl9PRkZTSAkJCTB4NzAwMAorCisvKiBJbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCisvKiBNYXN0ZXIgY2xvY2sgZnJlcXVlbmN5IGluIEtIeiAqLworI2RlZmluZSBSRUdfSV9JTkNMS19GUkVRX0wJCTB4MDFiOAorI2RlZmluZSBSRUdfSV9JTkNMS19GUkVRX0gJCTB4MDFiYQorI2RlZmluZSAgTUlOX01DTEtfRlJFUV9LSFoJCTYwMDBVCisjZGVmaW5lICBNQVhfTUNMS19GUkVRX0tIWgkJMjcwMDBVCisjZGVmaW5lIFJFR19JX1VTRV9OUFZJX0NMT0NLUwkJMHgwMWM2CisjZGVmaW5lIFJFR19JX1VTRV9OTUlQSV9DTE9DS1MJCTB4MDFjOAorCisvKiBDbG9jayBjb25maWd1cmF0aW9ucywgbiA9IDAuLjIuIFJFR19JXyogZnJlcXVlbmN5IHVuaXQgaXMgNCBrSHouICovCisjZGVmaW5lIFJFR19JX09QQ0xLXzRLSFoobikJCSgobikgKiA2ICsgMHgwMWNjKQorI2RlZmluZSBSRUdfSV9NSU5fT1VUUkFURV80S0haKG4pCSgobikgKiA2ICsgMHgwMWNlKQorI2RlZmluZSBSRUdfSV9NQVhfT1VUUkFURV80S0haKG4pCSgobikgKiA2ICsgMHgwMWQwKQorI2RlZmluZSAgU1lTX1BMTF9PVVRfRlJFUQkJKDQ4MDAwMDAwIC8gNDAwMCkKKyNkZWZpbmUgIFBDTEtfRlJFUV9NSU4JCQkoMjQwMDAwMDAgLyA0MDAwKQorI2RlZmluZSAgUENMS19GUkVRX01BWAkJCSg0ODAwMDAwMCAvIDQwMDApCisjZGVmaW5lIFJFR19JX0lOSVRfUEFSQU1TX1VQREFURUQJMHgwMWUwCisjZGVmaW5lIFJFR19JX0VSUk9SX0lORk8JCTB4MDFlMgorCisvKiBHZW5lcmFsIHB1cnBvc2UgcGFyYW1ldGVycyAqLworI2RlZmluZSBSRUdfVVNFUl9CUklHSFRORVNTCQkweDAxZTQKKyNkZWZpbmUgUkVHX1VTRVJfQ09OVFJBU1QJCTB4MDFlNgorI2RlZmluZSBSRUdfVVNFUl9TQVRVUkFUSU9OCQkweDAxZTgKKyNkZWZpbmUgUkVHX1VTRVJfU0hBUlBCTFVSCQkweDAxZWEKKworI2RlZmluZSBSRUdfR19TUEVDX0VGRkVDVFMJCTB4MDFlZQorI2RlZmluZSBSRUdfR19FTkFCTEVfUFJFVgkJMHgwMWYwCisjZGVmaW5lIFJFR19HX0VOQUJMRV9QUkVWX0NIRwkJMHgwMWYyCisjZGVmaW5lIFJFR19HX05FV19DRkdfU1lOQwkJMHgwMWY4CisjZGVmaW5lIFJFR19HX1BSRVZaT09NX0lOX1dJRFRICQkweDAyMGEKKyNkZWZpbmUgUkVHX0dfUFJFVlpPT01fSU5fSEVJR0hUCTB4MDIwYworI2RlZmluZSBSRUdfR19QUkVWWk9PTV9JTl9YT0ZGUwkJMHgwMjBlCisjZGVmaW5lIFJFR19HX1BSRVZaT09NX0lOX1lPRkZTCQkweDAyMTAKKyNkZWZpbmUgUkVHX0dfSU5QVVRTX0NIQU5HRV9SRVEJCTB4MDIxYQorI2RlZmluZSBSRUdfR19BQ1RJVkVfUFJFVl9DRkcJCTB4MDIxYworI2RlZmluZSBSRUdfR19QUkVWX0NGR19DSEcJCTB4MDIxZQorI2RlZmluZSBSRUdfR19QUkVWX09QRU5fQUZURVJfQ0gJMHgwMjIwCisjZGVmaW5lIFJFR19HX1BSRVZfQ0ZHX0VSUk9SCQkweDAyMjIKKworLyogUHJldmlldyBjb250cm9sIHNlY3Rpb24uIG4gPSAwLi4uNC4gKi8KKyNkZWZpbmUgUFJFRyhuLCB4KQkJCSgobikgKiAweDI2ICsgeCkKKyNkZWZpbmUgUkVHX1BfT1VUX1dJRFRIKG4pCQlQUkVHKG4sIDB4MDI0MikKKyNkZWZpbmUgUkVHX1BfT1VUX0hFSUdIVChuKQkJUFJFRyhuLCAweDAyNDQpCisjZGVmaW5lIFJFR19QX0ZNVChuKQkJCVBSRUcobiwgMHgwMjQ2KQorI2RlZmluZSBSRUdfUF9NQVhfT1VUX1JBVEUobikJCVBSRUcobiwgMHgwMjQ4KQorI2RlZmluZSBSRUdfUF9NSU5fT1VUX1JBVEUobikJCVBSRUcobiwgMHgwMjRhKQorI2RlZmluZSBSRUdfUF9QVklfTUFTSyhuKQkJUFJFRyhuLCAweDAyNGMpCisjZGVmaW5lIFJFR19QX0NMS19JTkRFWChuKQkJUFJFRyhuLCAweDAyNGUpCisjZGVmaW5lIFJFR19QX0ZSX1JBVEVfVFlQRShuKQkJUFJFRyhuLCAweDAyNTApCisjZGVmaW5lICBGUl9SQVRFX0RZTkFNSUMJCTAKKyNkZWZpbmUgIEZSX1JBVEVfRklYRUQJCQkxCisjZGVmaW5lICBGUl9SQVRFX0ZJWEVEX0FDQ1VSQVRFCQkyCisjZGVmaW5lIFJFR19QX0ZSX1JBVEVfUV9UWVBFKG4pCQlQUkVHKG4sIDB4MDI1MikKKyNkZWZpbmUgIEZSX1JBVEVfUV9CRVNUX0ZSUkFURQkJMSAvKiBCaW5uaW5nIGVuYWJsZWQgKi8KKyNkZWZpbmUgIEZSX1JBVEVfUV9CRVNUX1FVQUxJVFkJCTIgLyogQmlubmluZyBkaXNhYmxlZCAqLworLyogRnJhbWUgcGVyaW9kIGluIDAuMSBtcyB1bml0cyAqLworI2RlZmluZSBSRUdfUF9NQVhfRlJfVElNRShuKQkJUFJFRyhuLCAweDAyNTQpCisjZGVmaW5lIFJFR19QX01JTl9GUl9USU1FKG4pCQlQUkVHKG4sIDB4MDI1NikKKy8qIENvbnZlcnNpb24gdG8gUkVHX1BfW01BWC9NSU5dX0ZSX1RJTUUgdmFsdWU7IF9fdDogdGltZSBpbiB1cyAqLworI2RlZmluZSAgVVNfVE9fRlJfVElNRShfX3QpCQkoKF9fdCkgLyAxMDApCisjZGVmaW5lICBTNUs2QUFfTUlOX0ZSX1RJTUUJCTMzMzAwICAvKiB1cyAqLworI2RlZmluZSAgUzVLNkFBX01BWF9GUl9USU1FCQk2NTAwMDAgLyogdXMgKi8KKyNkZWZpbmUgIFM1SzZBQV9NQVhfSElHSFJFU19GUl9USU1FCTY2NiAgICAvKiB4MTAwIHVzICovCisvKiBUaGUgYmVsb3cgNSByZWdpc3RlcnMgYXJlIGZvciAiZGV2aWNlIGNvcnJlY3Rpb24iIHZhbHVlcyAqLworI2RlZmluZSBSRUdfUF9DT0xPUlRFTVAobikJCVBSRUcobiwgMHgwMjVlKQorI2RlZmluZSBSRUdfUF9QUkVWX01JUlJPUihuKQkJUFJFRyhuLCAweDAyNjIpCisKKy8qIEV4dGVuZGVkIGltYWdlIHByb3BlcnR5IGNvbnRyb2xzICovCisvKiBFeHBvc3VyZSB0aW1lIGluIDEwIHVzIHVuaXRzICovCisjZGVmaW5lIFJFR19TRl9VU1JfRVhQT1NVUkVfTAkJMHgwM2M2CisjZGVmaW5lIFJFR19TRl9VU1JfRVhQT1NVUkVfSAkJMHgwM2M4CisjZGVmaW5lIFJFR19TRl9VU1JfRVhQT1NVUkVfQ0hHCQkweDAzY2EKKyNkZWZpbmUgUkVHX1NGX1VTUl9UT1RfR0FJTgkJMHgwM2NjCisjZGVmaW5lIFJFR19TRl9VU1JfVE9UX0dBSU5fQ0hHCQkweDAzY2UKKyNkZWZpbmUgUkVHX1NGX1JHQUlOCQkJMHgwM2QwCisjZGVmaW5lIFJFR19TRl9SR0FJTl9DSEcJCTB4MDNkMgorI2RlZmluZSBSRUdfU0ZfR0dBSU4JCQkweDAzZDQKKyNkZWZpbmUgUkVHX1NGX0dHQUlOX0NIRwkJMHgwM2Q2CisjZGVmaW5lIFJFR19TRl9CR0FJTgkJCTB4MDNkOAorI2RlZmluZSBSRUdfU0ZfQkdBSU5fQ0hHCQkweDAzZGEKKyNkZWZpbmUgUkVHX1NGX0ZMSUNLRVJfUVVBTlQJCTB4MDNkYworI2RlZmluZSBSRUdfU0ZfRkxJQ0tFUl9RVUFOVF9DSEcJMHgwM2RlCisKKy8qIE91dHB1dCBpbnRlcmZhY2UgKHBhcmFsbGVsL01JUEkpIHNldHVwICovCisjZGVmaW5lIFJFR19PSUZfRU5fTUlQSV9MQU5FUwkJMHgwM2ZhCisjZGVmaW5lIFJFR19PSUZfRU5fUEFDS0VUUwkJMHgwM2ZjCisjZGVmaW5lIFJFR19PSUZfQ0ZHX0NIRwkJCTB4MDNmZQorCisvKiBBdXRvLWFsZ29yaXRobXMgZW5hYmxlIG1hc2sgKi8KKyNkZWZpbmUgUkVHX0RCR19BVVRPQUxHX0VOCQkweDA0MDAKKyNkZWZpbmUgIEFBTEdfQUxMX0VOX01BU0sJCSgxIDw8IDApCisjZGVmaW5lICBBQUxHX0FFX0VOX01BU0sJCSgxIDw8IDEpCisjZGVmaW5lICBBQUxHX0RJVkxFSV9FTl9NQVNLCQkoMSA8PCAyKQorI2RlZmluZSAgQUFMR19XQl9FTl9NQVNLCQkoMSA8PCAzKQorI2RlZmluZSAgQUFMR19GTElDS0VSX0VOX01BU0sJCSgxIDw8IDUpCisjZGVmaW5lICBBQUxHX0ZJVF9FTl9NQVNLCQkoMSA8PCA2KQorI2RlZmluZSAgQUFMR19XUkhXX0VOX01BU0sJCSgxIDw8IDcpCisKKy8qIEZpcm13YXJlIHJldmlzaW9uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFJFR19GV19BUElWRVIJCQkweDAxMmUKKyNkZWZpbmUgIFM1SzZBQUZYX0ZXX0FQSVZFUgkJMHgwMDAxCisjZGVmaW5lIFJFR19GV19SRVZJU0lPTgkJCTB4MDEzMAorCisvKiBGb3Igbm93IHdlIHVzZSBvbmx5IG9uZSB1c2VyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgc2V0ICovCisjZGVmaW5lIFM1SzZBQV9NQVhfUFJFU0VUUwkJMQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHM1azZhYV9zdXBwbHlfbmFtZXNbXSA9IHsKKwkidmRkX2NvcmUiLAkvKiBEaWdpdGFsIGNvcmUgc3VwcGx5IDEuNVYgKDEuNFYgdG8gMS42VikgKi8KKwkidmRkYSIsCQkvKiBBbmFsb2cgcG93ZXIgc3VwcGx5IDIuOFYgKDIuNlYgdG8gMy4wVikgKi8KKwkidmRkX3JlZyIsCS8qIFJlZ3VsYXRvciBpbnB1dCBwb3dlciAxLjhWICgxLjdWIHRvIDEuOVYpCisJCQkgICBvciAyLjhWICgyLjZWIHRvIDMuMCkgKi8KKwkidmRkaW8iLAkvKiBJL08gc3VwcGx5IDEuOFYgKDEuNjVWIHRvIDEuOTVWKQorCQkJICAgb3IgMi44ViAoMi41ViB0byAzLjFWKSAqLworfTsKKyNkZWZpbmUgUzVLNkFBX05VTV9TVVBQTElFUyBBUlJBWV9TSVpFKHM1azZhYV9zdXBwbHlfbmFtZXMpCisKK2VudW0gczVrNmFhX2dwaW9faWQgeworCVNUQlksCisJUlNULAorCUdQSU9fTlVNLAorfTsKKworc3RydWN0IHM1azZhYV9yZWd2YWwgeworCXUxNiBhZGRyOworCXUxNiB2YWw7Cit9OworCitzdHJ1Y3QgczVrNmFhX3BpeGZtdCB7CisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGU7CisJdTMyIGNvbG9yc3BhY2U7CisJLyogUkVHX1BfRk1UKHgpIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IHJlZ19wX2ZtdDsKK307CisKK3N0cnVjdCBzNWs2YWFfcHJlc2V0IHsKKwkvKiBvdXRwdXQgcGl4ZWwgZm9ybWF0IGFuZCByZXNvbHV0aW9uICovCisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKKwl1OCBjbGtfaWQ7CisJdTggaW5kZXg7Cit9OworCitzdHJ1Y3QgczVrNmFhX2N0cmxzIHsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgaGFuZGxlcjsKKwkvKiBBdXRvIC8gbWFudWFsIHdoaXRlIGJhbGFuY2UgY2x1c3RlciAqLworCXN0cnVjdCB2NGwyX2N0cmwgKmF3YjsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluX3JlZDsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluX2JsdWU7CisJc3RydWN0IHY0bDJfY3RybCAqZ2Fpbl9ncmVlbjsKKwkvKiBNaXJyb3IgY2x1c3RlciAqLworCXN0cnVjdCB2NGwyX2N0cmwgKmhmbGlwOworCXN0cnVjdCB2NGwyX2N0cmwgKnZmbGlwOworCS8qIEF1dG8gZXhwb3N1cmUgLyBtYW51YWwgZXhwb3N1cmUgYW5kIGdhaW4gY2x1c3RlciAqLworCXN0cnVjdCB2NGwyX2N0cmwgKmF1dG9fZXhwOworCXN0cnVjdCB2NGwyX2N0cmwgKmV4cG9zdXJlOworCXN0cnVjdCB2NGwyX2N0cmwgKmdhaW47Cit9OworCitzdHJ1Y3QgczVrNmFhX2ludGVydmFsIHsKKwl1MTYgcmVnX2ZyX3RpbWU7CisJc3RydWN0IHY0bDJfZnJhY3QgaW50ZXJ2YWw7CisJLyogTWF4aW11bSByZWN0YW5nbGUgZm9yIHRoZSBpbnRlcnZhbCAqLworCXN0cnVjdCB2NGwyX2ZybXNpemVfZGlzY3JldGUgc2l6ZTsKK307CisKK3N0cnVjdCBzNWs2YWEgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKKwlzdHJ1Y3QgbWVkaWFfcGFkIHBhZDsKKworCWVudW0gdjRsMl9tYnVzX3R5cGUgYnVzX3R5cGU7CisJdTggbWlwaV9sYW5lczsKKworCWludCAoKnNfcG93ZXIpKGludCBlbmFibGUpOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW1M1SzZBQV9OVU1fU1VQUExJRVNdOworCXN0cnVjdCBzNWs2YWFfZ3BpbyBncGlvW0dQSU9fTlVNXTsKKworCS8qIGV4dGVybmFsIG1hc3RlciBjbG9jayBmcmVxdWVuY3kgKi8KKwl1bnNpZ25lZCBsb25nIG1jbGtfZnJlcXVlbmN5OworCS8qIElTUCBpbnRlcm5hbCBtYXN0ZXIgY2xvY2sgZnJlcXVlbmN5ICovCisJdTE2IGNsa19mb3A7CisJLyogb3V0cHV0IHBpeGVsIGNsb2NrIGZyZXF1ZW5jeSByYW5nZSAqLworCXUxNiBwY2xrX2ZtaW47CisJdTE2IHBjbGtfZm1heDsKKworCXVuc2lnbmVkIGludCBpbnZfaGZsaXA6MTsKKwl1bnNpZ25lZCBpbnQgaW52X3ZmbGlwOjE7CisKKwkvKiBwcm90ZWN0cyB0aGUgc3RydWN0IG1lbWJlcnMgYmVsb3cgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCS8qIHNlbnNvciBtYXRyaXggc2NhbiB3aW5kb3cgKi8KKwlzdHJ1Y3QgdjRsMl9yZWN0IGNjZF9yZWN0OworCisJc3RydWN0IHM1azZhYV9jdHJscyBjdHJsczsKKwlzdHJ1Y3QgczVrNmFhX3ByZXNldCBwcmVzZXRzW1M1SzZBQV9NQVhfUFJFU0VUU107CisJc3RydWN0IHM1azZhYV9wcmVzZXQgKnByZXNldDsKKwljb25zdCBzdHJ1Y3QgczVrNmFhX2ludGVydmFsICpmaXY7CisKKwl1bnNpZ25lZCBpbnQgc3RyZWFtaW5nOjE7CisJdW5zaWduZWQgaW50IGFwcGx5X2NmZzoxOworCXVuc2lnbmVkIGludCBhcHBseV9jcm9wOjE7CisJdW5zaWduZWQgaW50IHBvd2VyOworfTsKKworc3RhdGljIHN0cnVjdCBzNWs2YWFfcmVndmFsIHM1azZhYV9hbmFsb2dfY29uZmlnW10gPSB7CisJLyogQW5hbG9nIHNldHRpbmdzICovCisJeyAweDExMmEsIDB4MDAwMCB9LCB7IDB4MTEzMiwgMHgwMDAwIH0sCisJeyAweDExM2UsIDB4MDAwMCB9LCB7IDB4MTE1YywgMHgwMDAwIH0sCisJeyAweDExNjQsIDB4MDAwMCB9LCB7IDB4MTE3NCwgMHgwMDAwIH0sCisJeyAweDExNzgsIDB4MDAwMCB9LCB7IDB4MDc3YSwgMHgwMDAwIH0sCisJeyAweDA3N2MsIDB4MDAwMCB9LCB7IDB4MDc3ZSwgMHgwMDAwIH0sCisJeyAweDA3ODAsIDB4MDAwMCB9LCB7IDB4MDc4MiwgMHgwMDAwIH0sCisJeyAweDA3ODQsIDB4MDAwMCB9LCB7IDB4MDc4NiwgMHgwMDAwIH0sCisJeyAweDA3ODgsIDB4MDAwMCB9LCB7IDB4MDdhMiwgMHgwMDAwIH0sCisJeyAweDA3YTQsIDB4MDAwMCB9LCB7IDB4MDdhNiwgMHgwMDAwIH0sCisJeyAweDA3YTgsIDB4MDAwMCB9LCB7IDB4MDdiNiwgMHgwMDAwIH0sCisJeyAweDA3YjgsIDB4MDAwMiB9LCB7IDB4MDdiYSwgMHgwMDA0IH0sCisJeyAweDA3YmMsIDB4MDAwNCB9LCB7IDB4MDdiZSwgMHgwMDA1IH0sCisJeyAweDA3YzAsIDB4MDAwNSB9LCB7IFM1SzZBQV9URVJNLCAwIH0sCit9OworCisvKiBUT0RPOiBBZGQgUkdCODg4IGFuZCBCYXllciBmb3JtYXQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgczVrNmFhX3BpeGZtdCBzNWs2YWFfZm9ybWF0c1tdID0geworCXsgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsCVY0TDJfQ09MT1JTUEFDRV9KUEVHLAk1IH0sCisJLyogcmFuZ2UgMTYtMjQwICovCisJeyBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCwJVjRMMl9DT0xPUlNQQUNFX1JFQzcwOSwJNiB9LAorCXsgVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0JFLAlWNEwyX0NPTE9SU1BBQ0VfSlBFRywJMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzNWs2YWFfaW50ZXJ2YWwgczVrNmFhX2ludGVydmFsc1tdID0geworCXsgMTAwMCwgezEwMDAwLCAxMDAwMDAwfSwgezEyODAsIDEwMjR9IH0sIC8qIDEwIGZwcyAqLworCXsgNjY2LCAgezE1MDAwLCAxMDAwMDAwfSwgezEyODAsIDEwMjR9IH0sIC8qIDE1IGZwcyAqLworCXsgNTAwLCAgezIwMDAwLCAxMDAwMDAwfSwgezEyODAsIDcyMH0gfSwgIC8qIDIwIGZwcyAqLworCXsgNDAwLCAgezI1MDAwLCAxMDAwMDAwfSwgezY0MCwgNDgwfSB9LCAgIC8qIDI1IGZwcyAqLworCXsgMzMzLCAgezMzMzAwLCAxMDAwMDAwfSwgezY0MCwgNDgwfSB9LCAgIC8qIDMwIGZwcyAqLworfTsKKworI2RlZmluZSBTNUs2QUFfSU5URVJWQUxfREVGX0lOREVYIDEgLyogMTUgZnBzICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHY0bDJfc3ViZGV2ICpjdHJsX3RvX3NkKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJcmV0dXJuICZjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IHM1azZhYSwgY3RybHMuaGFuZGxlciktPnNkOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzNWs2YWEgKnRvX3M1azZhYShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBzNWs2YWEsIHNkKTsKK30KKworLyogU2V0IGluaXRpYWwgdmFsdWVzIGZvciBhbGwgcHJldmlldyBwcmVzZXRzICovCitzdGF0aWMgdm9pZCBzNWs2YWFfcHJlc2V0c19kYXRhX2luaXQoc3RydWN0IHM1azZhYSAqczVrNmFhKQoreworCXN0cnVjdCBzNWs2YWFfcHJlc2V0ICpwcmVzZXQgPSAmczVrNmFhLT5wcmVzZXRzWzBdOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFM1SzZBQV9NQVhfUFJFU0VUUzsgaSsrKSB7CisJCXByZXNldC0+bWJ1c19mbXQud2lkdGgJPSBTNUs2QUFfT1VUX1dJRFRIX0RFRjsKKwkJcHJlc2V0LT5tYnVzX2ZtdC5oZWlnaHQJPSBTNUs2QUFfT1VUX0hFSUdIVF9ERUY7CisJCXByZXNldC0+bWJ1c19mbXQuY29kZQk9IHM1azZhYV9mb3JtYXRzWzBdLmNvZGU7CisJCXByZXNldC0+aW5kZXgJCT0gaTsKKwkJcHJlc2V0LT5jbGtfaWQJCT0gMDsKKwkJcHJlc2V0Kys7CisJfQorCisJczVrNmFhLT5maXYgPSAmczVrNmFhX2ludGVydmFsc1tTNUs2QUFfSU5URVJWQUxfREVGX0lOREVYXTsKKwlzNWs2YWEtPnByZXNldCA9ICZzNWs2YWEtPnByZXNldHNbMF07Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX2kyY19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiBhZGRyLCB1MTYgKnZhbCkKK3sKKwl1OCB3YnVmWzJdID0ge2FkZHIgPj4gOCwgYWRkciAmIDB4RkZ9OworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKKwl1OCByYnVmWzJdOworCWludCByZXQ7CisKKwltc2dbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwltc2dbMF0uZmxhZ3MgPSAwOworCW1zZ1swXS5sZW4gPSAyOworCW1zZ1swXS5idWYgPSB3YnVmOworCisJbXNnWzFdLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJbXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJbXNnWzFdLmxlbiA9IDI7CisJbXNnWzFdLmJ1ZiA9IHJidWY7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworCSp2YWwgPSBiZTE2X3RvX2NwdSgqKCh1MTYgKilyYnVmKSk7CisKKwl2NGwyX2RiZygzLCBkZWJ1ZywgY2xpZW50LCAiaTJjX3JlYWQ6IDB4JTA0WCA6IDB4JTA0eFxuIiwgYWRkciwgKnZhbCk7CisKKwlyZXR1cm4gcmV0ID09IDIgPyAwIDogcmV0OworfQorCitzdGF0aWMgaW50IHM1azZhYV9pMmNfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IGFkZHIsIHUxNiB2YWwpCit7CisJdTggYnVmWzRdID0ge2FkZHIgPj4gOCwgYWRkciAmIDB4RkYsIHZhbCA+PiA4LCB2YWwgJiAweEZGfTsKKworCWludCByZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDQpOworCXY0bDJfZGJnKDMsIGRlYnVnLCBjbGllbnQsICJpMmNfd3JpdGU6IDB4JTA0WCA6IDB4JTA0eFxuIiwgYWRkciwgdmFsKTsKKworCXJldHVybiByZXQgPT0gNCA/IDAgOiByZXQ7Cit9CisKKy8qIFRoZSBjb21tYW5kIHJlZ2lzdGVyIHdyaXRlLCBhc3N1bWVzIENvbW1hbmRfV3JfYWRkSCA9IDB4NzAwMC4gKi8KK3N0YXRpYyBpbnQgczVrNmFhX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1MTYgYWRkciwgdTE2IHZhbCkKK3sKKwlpbnQgcmV0ID0gczVrNmFhX2kyY193cml0ZShjLCBSRUdfQ01EV1JfQUREUkwsIGFkZHIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHM1azZhYV9pMmNfd3JpdGUoYywgUkVHX0NNREJVRjBfQUREUiwgdmFsKTsKK30KKworLyogVGhlIGNvbW1hbmQgcmVnaXN0ZXIgcmVhZCwgYXNzdW1lcyBDb21tYW5kX1JkX2FkZEggPSAweDcwMDAuICovCitzdGF0aWMgaW50IHM1azZhYV9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiBhZGRyLCB1MTYgKnZhbCkKK3sKKwlpbnQgcmV0ID0gczVrNmFhX2kyY193cml0ZShjbGllbnQsIFJFR19DTURSRF9BRERSTCwgYWRkcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gczVrNmFhX2kyY19yZWFkKGNsaWVudCwgUkVHX0NNREJVRjBfQUREUiwgdmFsKTsKK30KKworc3RhdGljIGludCBzNWs2YWFfd3JpdGVfYXJyYXkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBzNWs2YWFfcmVndmFsICptc2cpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXUxNiBhZGRyX2luY3IgPSAwOworCWludCByZXQgPSAwOworCisJd2hpbGUgKG1zZy0+YWRkciAhPSBTNUs2QUFfVEVSTSkgeworCQlpZiAoYWRkcl9pbmNyICE9IDIpCisJCQlyZXQgPSBzNWs2YWFfaTJjX3dyaXRlKGNsaWVudCwgUkVHX0NNRFdSX0FERFJMLAorCQkJCQkgICAgICAgbXNnLT5hZGRyKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlyZXQgPSBzNWs2YWFfaTJjX3dyaXRlKGNsaWVudCwgUkVHX0NNREJVRjBfQUREUiwgbXNnLT52YWwpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCS8qIEFzc3VtZSB0aGF0IG1zZy0+YWRkciBpcyBhbHdheXMgbGVzcyB0aGFuIDB4ZmZmYyAqLworCQlhZGRyX2luY3IgPSAobXNnICsgMSktPmFkZHIgLSBtc2ctPmFkZHI7CisJCW1zZysrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIENvbmZpZ3VyZSB0aGUgQUhCIGhpZ2ggYWRkcmVzcyBieXRlcyBmb3IgR1RHIHJlZ2lzdGVycyBhY2Nlc3MgKi8KK3N0YXRpYyBpbnQgczVrNmFhX3NldF9haGJfYWRkcmVzcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCByZXQgPSBzNWs2YWFfaTJjX3dyaXRlKGNsaWVudCwgQUhCX01TQl9BRERSX1BUUiwgR0VOX1JFR19PRkZTSCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBzNWs2YWFfaTJjX3dyaXRlKGNsaWVudCwgUkVHX0NNRFJEX0FERFJILCBIT1NUX1NXSUZfT0ZGU0gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHM1azZhYV9pMmNfd3JpdGUoY2xpZW50LCBSRUdfQ01EV1JfQUREUkgsIEhPU1RfU1dJRl9PRkZTSCk7Cit9CisKKy8qKgorICogczVrNmFhX2NvbmZpZ3VyZV9waXhlbF9jbG9jayAtIGFwcGx5IElTUCBtYWluIGNsb2NrL1BMTCBjb25maWd1cmF0aW9uCisgKgorICogQ29uZmlndXJlIHRoZSBpbnRlcm5hbCBJU1AgUExMIGZvciB0aGUgcmVxdWlyZWQgb3V0cHV0IGZyZXF1ZW5jeS4KKyAqIExvY2tpbmc6IGNhbGxlZCB3aXRoIHM1azZhYS5sb2NrIG11dGV4IGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgczVrNmFhX2NvbmZpZ3VyZV9waXhlbF9jbG9ja3Moc3RydWN0IHM1azZhYSAqczVrNmFhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmczVrNmFhLT5zZCk7CisJdW5zaWduZWQgbG9uZyBmbWNsayA9IHM1azZhYS0+bWNsa19mcmVxdWVuY3kgLyAxMDAwOworCXUxNiBzdGF0dXM7CisJaW50IHJldDsKKworCWlmIChXQVJOKGZtY2xrIDwgTUlOX01DTEtfRlJFUV9LSFogfHwgZm1jbGsgPiBNQVhfTUNMS19GUkVRX0tIWiwKKwkJICJJbnZhbGlkIGNsb2NrIGZyZXF1ZW5jeTogJWxkXG4iLCBmbWNsaykpCisJCXJldHVybiAtRUlOVkFMOworCisJczVrNmFhLT5wY2xrX2ZtaW4gPSBQQ0xLX0ZSRVFfTUlOOworCXM1azZhYS0+cGNsa19mbWF4ID0gUENMS19GUkVRX01BWDsKKwlzNWs2YWEtPmNsa19mb3AgPSBTWVNfUExMX09VVF9GUkVROworCisJLyogRXh0ZXJuYWwgaW5wdXQgY2xvY2sgZnJlcXVlbmN5IGluIGtIeiAqLworCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfSV9JTkNMS19GUkVRX0gsIGZtY2xrID4+IDE2KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGMsIFJFR19JX0lOQ0xLX0ZSRVFfTCwgZm1jbGsgJiAweEZGRkYpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX0lfVVNFX05QVklfQ0xPQ0tTLCAxKTsKKwkvKiBJbnRlcm5hbCBQTEwgZnJlcXVlbmN5ICovCisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfSV9PUENMS180S0haKDApLCBzNWs2YWEtPmNsa19mb3ApOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX0lfTUlOX09VVFJBVEVfNEtIWigwKSwKKwkJCQkgICBzNWs2YWEtPnBjbGtfZm1pbik7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfSV9NQVhfT1VUUkFURV80S0haKDApLAorCQkJCSAgIHM1azZhYS0+cGNsa19mbWF4KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGMsIFJFR19JX0lOSVRfUEFSQU1TX1VQREFURUQsIDEpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfcmVhZChjLCBSRUdfSV9FUlJPUl9JTkZPLCAmc3RhdHVzKTsKKworCXJldHVybiByZXQgPyByZXQgOiAoc3RhdHVzID8gLUVJTlZBTCA6IDApOworfQorCisvKiBTZXQgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW1hZ2UgZmxpcHBpbmcgKi8KK3N0YXRpYyBpbnQgczVrNmFhX3NldF9taXJyb3Ioc3RydWN0IHM1azZhYSAqczVrNmFhLCBpbnQgaG9yaXpfZmxpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmczVrNmFhLT5zZCk7CisJaW50IGluZGV4ID0gczVrNmFhLT5wcmVzZXQtPmluZGV4OworCisJdW5zaWduZWQgaW50IHZmbGlwID0gczVrNmFhLT5jdHJscy52ZmxpcC0+dmFsIF4gczVrNmFhLT5pbnZfdmZsaXA7CisJdW5zaWduZWQgaW50IGZsaXAgPSAoaG9yaXpfZmxpcCBeIHM1azZhYS0+aW52X2hmbGlwKSB8ICh2ZmxpcCA8PCAxKTsKKworCXJldHVybiBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfUF9QUkVWX01JUlJPUihpbmRleCksIGZsaXApOworfQorCisvKiBDb25maWd1cmUgYXV0by9tYW51YWwgd2hpdGUgYmFsYW5jZSBhbmQgUi9HL0IgZ2FpbnMgKi8KK3N0YXRpYyBpbnQgczVrNmFhX3NldF9hd2Ioc3RydWN0IHM1azZhYSAqczVrNmFhLCBpbnQgYXdiKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmczVrNmFhLT5zZCk7CisJc3RydWN0IHM1azZhYV9jdHJscyAqY3RybHMgPSAmczVrNmFhLT5jdHJsczsKKwl1MTYgcmVnOworCisJaW50IHJldCA9IHM1azZhYV9yZWFkKGMsIFJFR19EQkdfQVVUT0FMR19FTiwgJnJlZyk7CisKKwlpZiAoIXJldCAmJiAhYXdiKSB7CisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfU0ZfUkdBSU4sIGN0cmxzLT5nYWluX3JlZC0+dmFsKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX1NGX1JHQUlOX0NIRywgMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfU0ZfR0dBSU4sIGN0cmxzLT5nYWluX2dyZWVuLT52YWwpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfU0ZfR0dBSU5fQ0hHLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGMsIFJFR19TRl9CR0FJTiwgY3RybHMtPmdhaW5fYmx1ZS0+dmFsKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX1NGX0JHQUlOX0NIRywgMSk7CisJfQorCWlmICghcmV0KSB7CisJCXJlZyA9IGF3YiA/IHJlZyB8IEFBTEdfV0JfRU5fTUFTSyA6IHJlZyAmIH5BQUxHX1dCX0VOX01BU0s7CisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfREJHX0FVVE9BTEdfRU4sIHJlZyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogUHJvZ3JhbSBGVyB3aXRoIGV4cG9zdXJlIHRpbWUsICdleHBvc3VyZScgaW4gdXMgdW5pdHMgKi8KK3N0YXRpYyBpbnQgczVrNmFhX3NldF91c2VyX2V4cG9zdXJlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBleHBvc3VyZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGltZSA9IGV4cG9zdXJlIC8gMTA7CisKKwlpbnQgcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1NGX1VTUl9FWFBPU1VSRV9MLCB0aW1lICYgMHhmZmZmKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1NGX1VTUl9FWFBPU1VSRV9ILCB0aW1lID4+IDE2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfU0ZfVVNSX0VYUE9TVVJFX0NIRywgMSk7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3NldF91c2VyX2dhaW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGdhaW4pCit7CisJaW50IHJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19TRl9VU1JfVE9UX0dBSU4sIGdhaW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHM1azZhYV93cml0ZShjbGllbnQsIFJFR19TRl9VU1JfVE9UX0dBSU5fQ0hHLCAxKTsKK30KKworLyogU2V0IGF1dG8vbWFudWFsIGV4cG9zdXJlIGFuZCB0b3RhbCBnYWluICovCitzdGF0aWMgaW50IHM1azZhYV9zZXRfYXV0b19leHBvc3VyZShzdHJ1Y3QgczVrNmFhICpzNWs2YWEsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCXVuc2lnbmVkIGludCBleHBfdGltZSA9IHM1azZhYS0+Y3RybHMuZXhwb3N1cmUtPnZhbDsKKwl1MTYgYXV0b19hbGc7CisKKwlpbnQgcmV0ID0gczVrNmFhX3JlYWQoYywgUkVHX0RCR19BVVRPQUxHX0VOLCAmYXV0b19hbGcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgYywgIm1hbl9leHA6ICVkLCBhdXRvX2V4cDogJWQsIGFfYWxnOiAweCV4XG4iLAorCQkgZXhwX3RpbWUsIHZhbHVlLCBhdXRvX2FsZyk7CisKKwlpZiAodmFsdWUgPT0gVjRMMl9FWFBPU1VSRV9BVVRPKSB7CisJCWF1dG9fYWxnIHw9IEFBTEdfQUVfRU5fTUFTSyB8IEFBTEdfRElWTEVJX0VOX01BU0s7CisJfSBlbHNlIHsKKwkJcmV0ID0gczVrNmFhX3NldF91c2VyX2V4cG9zdXJlKGMsIGV4cF90aW1lKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHM1azZhYV9zZXRfdXNlcl9nYWluKGMsIHM1azZhYS0+Y3RybHMuZ2Fpbi0+dmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWF1dG9fYWxnICY9IH4oQUFMR19BRV9FTl9NQVNLIHwgQUFMR19ESVZMRUlfRU5fTUFTSyk7CisJfQorCisJcmV0dXJuIHM1azZhYV93cml0ZShjLCBSRUdfREJHX0FVVE9BTEdfRU4sIGF1dG9fYWxnKTsKK30KKworc3RhdGljIGludCBzNWs2YWFfc2V0X2FudGlfZmxpY2tlcihzdHJ1Y3QgczVrNmFhICpzNWs2YWEsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmczVrNmFhLT5zZCk7CisJdTE2IGF1dG9fYWxnOworCWludCByZXQ7CisKKwlyZXQgPSBzNWs2YWFfcmVhZChjbGllbnQsIFJFR19EQkdfQVVUT0FMR19FTiwgJmF1dG9fYWxnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbHVlID09IFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZX0FVVE8pIHsKKwkJYXV0b19hbGcgfD0gQUFMR19GTElDS0VSX0VOX01BU0s7CisJfSBlbHNlIHsKKwkJYXV0b19hbGcgJj0gfkFBTEdfRkxJQ0tFUl9FTl9NQVNLOworCQkvKiBUaGUgVjRMMl9DSURfTElORV9GUkVRVUVOQ1kgY29udHJvbCB2YWx1ZXMgbWF0Y2gKKwkJICogdGhlIHJlZ2lzdGVyIHZhbHVlcyAqLworCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfU0ZfRkxJQ0tFUl9RVUFOVCwgdmFsdWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1NGX0ZMSUNLRVJfUVVBTlRfQ0hHLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHM1azZhYV93cml0ZShjbGllbnQsIFJFR19EQkdfQVVUT0FMR19FTiwgYXV0b19hbGcpOworfQorCitzdGF0aWMgaW50IHM1azZhYV9zZXRfY29sb3JmeChzdHJ1Y3QgczVrNmFhICpzNWs2YWEsIGludCB2YWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbG9yZnhbXSA9IHsKKwkJeyBWNEwyX0NPTE9SRlhfTk9ORSwJIDAgfSwKKwkJeyBWNEwyX0NPTE9SRlhfQlcsCSAxIH0sCisJCXsgVjRMMl9DT0xPUkZYX05FR0FUSVZFLCAyIH0sCisJCXsgVjRMMl9DT0xPUkZYX1NFUElBLAkgMyB9LAorCQl7IFY0TDJfQ09MT1JGWF9TS1lfQkxVRSwgNCB9LAorCQl7IFY0TDJfQ09MT1JGWF9TS0VUQ0gsCSA1IH0sCisJfTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbG9yZngpOyBpKyspIHsKKwkJaWYgKGNvbG9yZnhbaV0uaWQgPT0gdmFsKQorCQkJcmV0dXJuIHM1azZhYV93cml0ZShjbGllbnQsIFJFR19HX1NQRUNfRUZGRUNUUywKKwkJCQkJICAgIGNvbG9yZnhbaV0udmFsdWUpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBzNWs2YWFfcHJldmlld19jb25maWdfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTE2IGVycm9yID0gMDsKKwlpbnQgcmV0ID0gczVrNmFhX3JlYWQoY2xpZW50LCBSRUdfR19QUkVWX0NGR19FUlJPUiwgJmVycm9yKTsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJlcnJvcjogMHgleCAoJWQpXG4iLCBlcnJvciwgcmV0KTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogKGVycm9yID8gLUVJTlZBTCA6IDApOworfQorCitzdGF0aWMgaW50IHM1azZhYV9nZXRfcGl4Zm10X2luZGV4KHN0cnVjdCBzNWs2YWEgKnM1azZhYSwKKwkJCQkgICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHM1azZhYV9mb3JtYXRzKTsgaSsrKQorCQlpZiAobWYtPmNvbG9yc3BhY2UgPT0gczVrNmFhX2Zvcm1hdHNbaV0uY29sb3JzcGFjZSAmJgorCQkgICAgbWYtPmNvZGUgPT0gczVrNmFhX2Zvcm1hdHNbaV0uY29kZSkKKwkJCXJldHVybiBpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1azZhYV9zZXRfb3V0cHV0X2ZyYW1lZm10KHN0cnVjdCBzNWs2YWEgKnM1azZhYSwKKwkJCQkgICAgICBzdHJ1Y3QgczVrNmFhX3ByZXNldCAqcHJlc2V0KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzNWs2YWEtPnNkKTsKKwlpbnQgZm10X2luZGV4ID0gczVrNmFhX2dldF9waXhmbXRfaW5kZXgoczVrNmFhLCAmcHJlc2V0LT5tYnVzX2ZtdCk7CisJaW50IHJldDsKKworCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19QX09VVF9XSURUSChwcmVzZXQtPmluZGV4KSwKKwkJCSAgIHByZXNldC0+bWJ1c19mbXQud2lkdGgpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfUF9PVVRfSEVJR0hUKHByZXNldC0+aW5kZXgpLAorCQkJCSAgIHByZXNldC0+bWJ1c19mbXQuaGVpZ2h0KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1BfRk1UKHByZXNldC0+aW5kZXgpLAorCQkJCSAgIHM1azZhYV9mb3JtYXRzW2ZtdF9pbmRleF0ucmVnX3BfZm10KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHM1azZhYV9zZXRfaW5wdXRfcGFyYW1zKHN0cnVjdCBzNWs2YWEgKnM1azZhYSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCXN0cnVjdCB2NGwyX3JlY3QgKnIgPSAmczVrNmFhLT5jY2RfcmVjdDsKKwlpbnQgcmV0OworCisJcmV0ID0gczVrNmFhX3dyaXRlKGMsIFJFR19HX1BSRVZaT09NX0lOX1dJRFRILCByLT53aWR0aCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfR19QUkVWWk9PTV9JTl9IRUlHSFQsIHItPmhlaWdodCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfR19QUkVWWk9PTV9JTl9YT0ZGUywgci0+bGVmdCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfR19QUkVWWk9PTV9JTl9ZT0ZGUywgci0+dG9wKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGMsIFJFR19HX0lOUFVUU19DSEFOR0VfUkVRLCAxKTsKKwlpZiAoIXJldCkKKwkJczVrNmFhLT5hcHBseV9jcm9wID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogczVrNmFhX2NvbmZpZ3VyZV92aWRlb19idXMgLSBjb25maWd1cmUgdGhlIHZpZGVvIG91dHB1dCBpbnRlcmZhY2UKKyAqIEBidXNfdHlwZTogdmlkZW8gYnVzIHR5cGU6IHBhcmFsbGVsIG9yIE1JUEktQ1NJCisgKiBAbmxhbmVzOiBudW1iZXIgb2YgTUlQSSBsYW5lcyB0byBiZSB1c2VkIChNSVBJLUNTSSBvbmx5KQorICoKKyAqIE5vdGU6IE9ubHkgcGFyYWxsZWwgYnVzIG9wZXJhdGlvbiBoYXMgYmVlbiB0ZXN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgczVrNmFhX2NvbmZpZ3VyZV92aWRlb19idXMoc3RydWN0IHM1azZhYSAqczVrNmFhLAorCQkJCSAgICAgIGVudW0gdjRsMl9tYnVzX3R5cGUgYnVzX3R5cGUsIGludCBubGFuZXMpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCXUxNiBjZmcgPSAwOworCWludCByZXQ7CisKKwkvKgorCSAqIFRPRE86IFRoZSBzZW5zb3IgaXMgc3VwcG9zZWQgdG8gc3VwcG9ydCBCVC42MDEgYW5kIEJULjY1NgorCSAqIGJ1dCB0aGVyZSBpcyBub3RoaW5nIGluZGljYXRpbmcgaG93IHRvIHN3aXRjaCBiZXR3ZWVuIGJvdGgKKwkgKiBpbiB0aGUgZGF0YXNoZWV0LiBGb3Igbm93IGRlZmF1bHQgQlQuNjAxIGludGVyZmFjZSBpcyBhc3N1bWVkLgorCSAqLworCWlmIChidXNfdHlwZSA9PSBWNEwyX01CVVNfQ1NJMikKKwkJY2ZnID0gbmxhbmVzOworCWVsc2UgaWYgKGJ1c190eXBlICE9IFY0TDJfTUJVU19QQVJBTExFTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfT0lGX0VOX01JUElfTEFORVMsIGNmZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX09JRl9DRkdfQ0hHLCAxKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc3dpdGNoaW5nIHRvIG5ldyB1c2VyIGNvbmZpZ3VyYXRpb24gc2V0Ki8KK3N0YXRpYyBpbnQgczVrNmFhX25ld19jb25maWdfc3luYyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgdGltZW91dCwKKwkJCQkgIGludCBjaWQpCit7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKKwl1MTYgcmVnID0gMTsKKwlpbnQgcmV0OworCisJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX0dfQUNUSVZFX1BSRVZfQ0ZHLCBjaWQpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfR19QUkVWX0NGR19DSEcsIDEpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfR19ORVdfQ0ZHX1NZTkMsIDEpOworCWlmICh0aW1lb3V0ID09IDApCisJCXJldHVybiByZXQ7CisKKwl3aGlsZSAocmV0ID49IDAgJiYgdGltZV9pc19hZnRlcl9qaWZmaWVzKGVuZCkpIHsKKwkJcmV0ID0gczVrNmFhX3JlYWQoY2xpZW50LCBSRUdfR19ORVdfQ0ZHX1NZTkMsICZyZWcpOworCQlpZiAoIXJlZykKKwkJCXJldHVybiAwOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgNTAwMCk7CisJfQorCXJldHVybiByZXQgPyByZXQgOiAtRVRJTUVET1VUOworfQorCisvKioKKyAqIHM1azZhYV9zZXRfcHJldl9jb25maWcgLSB3cml0ZSB1c2VyIHByZXZpZXcgcmVnaXN0ZXIgc2V0CisgKgorICogQ29uZmlndXJlIG91dHB1dCByZXNvbHV0aW9uIGFuZCBjb2xvciBmcm9tYXQsIHBpeGVsIGNsb2NrCisgKiBmcmVxdWVuY3kgcmFuZ2UsIGRldmljZSBmcmFtZSByYXRlIHR5cGUgYW5kIGZyYW1lIHBlcmlvZCByYW5nZS4KKyAqLworc3RhdGljIGludCBzNWs2YWFfc2V0X3ByZXZfY29uZmlnKHN0cnVjdCBzNWs2YWEgKnM1azZhYSwKKwkJCQkgIHN0cnVjdCBzNWs2YWFfcHJlc2V0ICpwcmVzZXQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCWludCBpZHggPSBwcmVzZXQtPmluZGV4OworCXUxNiBmcmFtZV9yYXRlX3E7CisJaW50IHJldDsKKworCWlmIChzNWs2YWEtPmZpdi0+cmVnX2ZyX3RpbWUgPj0gUzVLNkFBX01BWF9ISUdIUkVTX0ZSX1RJTUUpCisJCWZyYW1lX3JhdGVfcSA9IEZSX1JBVEVfUV9CRVNUX0ZSUkFURTsKKwllbHNlCisJCWZyYW1lX3JhdGVfcSA9IEZSX1JBVEVfUV9CRVNUX1FVQUxJVFk7CisKKwlyZXQgPSBzNWs2YWFfc2V0X291dHB1dF9mcmFtZWZtdChzNWs2YWEsIHByZXNldCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19QX01BWF9PVVRfUkFURShpZHgpLAorCQkJCSAgIHM1azZhYS0+cGNsa19mbWF4KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1BfTUlOX09VVF9SQVRFKGlkeCksCisJCQkJICAgczVrNmFhLT5wY2xrX2ZtaW4pOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfUF9DTEtfSU5ERVgoaWR4KSwKKwkJCQkgICBwcmVzZXQtPmNsa19pZCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19QX0ZSX1JBVEVfVFlQRShpZHgpLAorCQkJCSAgIEZSX1JBVEVfRFlOQU1JQyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19QX0ZSX1JBVEVfUV9UWVBFKGlkeCksCisJCQkJICAgZnJhbWVfcmF0ZV9xKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1BfTUFYX0ZSX1RJTUUoaWR4KSwKKwkJCQkgICBzNWs2YWEtPmZpdi0+cmVnX2ZyX3RpbWUgKyAzMyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19QX01JTl9GUl9USU1FKGlkeCksCisJCQkJICAgczVrNmFhLT5maXYtPnJlZ19mcl90aW1lIC0gMzMpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfbmV3X2NvbmZpZ19zeW5jKGNsaWVudCwgMjUwLCBpZHgpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfcHJldmlld19jb25maWdfc3RhdHVzKGNsaWVudCk7CisJaWYgKCFyZXQpCisJCXM1azZhYS0+YXBwbHlfY2ZnID0gMDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJGcmFtZSBpbnRlcnZhbDogJWQgKy8tIDMuM21zLiAoJWQpXG4iLAorCQkgczVrNmFhLT5maXYtPnJlZ19mcl90aW1lLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogczVrNmFhX2luaXRpYWxpemVfaXNwIC0gYmFzaWMgSVNQIE1DVSBpbml0aWFsaXphdGlvbgorICoKKyAqIENvbmZpZ3VyZSBBSEIgYWRkcmVzc2VzIGZvciByZWdpc3RlcnMgcmVhZC93cml0ZTsgY29uZmlndXJlIFBMTHMgZm9yCisgKiByZXF1aXJlZCBvdXRwdXQgcGl4ZWwgY2xvY2suIFRoZSBJU1AgcG93ZXIgc3VwcGx5IG5lZWRzIHRvIGJlIGFscmVhZHkKKyAqIGVuYWJsZWQsIHdpdGggYW4gb3B0aW9uYWwgSC9XIHJlc2V0LgorICogTG9ja2luZzogY2FsbGVkIHdpdGggczVrNmFhLmxvY2sgbXV0ZXggaGVsZC4KKyAqLworc3RhdGljIGludCBzNWs2YWFfaW5pdGlhbGl6ZV9pc3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHM1azZhYSAqczVrNmFhID0gdG9fczVrNmFhKHNkKTsKKwlpbnQgcmV0OworCisJczVrNmFhLT5hcHBseV9jcm9wID0gMTsKKwlzNWs2YWEtPmFwcGx5X2NmZyA9IDE7CisJbXNsZWVwKDEwMCk7CisKKwlyZXQgPSBzNWs2YWFfc2V0X2FoYl9hZGRyZXNzKGNsaWVudCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBzNWs2YWFfY29uZmlndXJlX3ZpZGVvX2J1cyhzNWs2YWEsIHM1azZhYS0+YnVzX3R5cGUsCisJCQkJCSBzNWs2YWEtPm1pcGlfbGFuZXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gczVrNmFhX3dyaXRlX2FycmF5KHNkLCBzNWs2YWFfYW5hbG9nX2NvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwltc2xlZXAoMjApOworCisJcmV0dXJuIHM1azZhYV9jb25maWd1cmVfcGl4ZWxfY2xvY2tzKHM1azZhYSk7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX2dwaW9fc2V0X3ZhbHVlKHN0cnVjdCBzNWs2YWEgKnByaXYsIGludCBpZCwgdTMyIHZhbCkKK3sKKwlpZiAoIWdwaW9faXNfdmFsaWQocHJpdi0+Z3Bpb1tpZF0uZ3BpbykpCisJCXJldHVybiAwOworCWdwaW9fc2V0X3ZhbHVlKHByaXYtPmdwaW9baWRdLmdwaW8sICEhdmFsKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzNWs2YWFfZ3Bpb19hc3NlcnQoc3RydWN0IHM1azZhYSAqcHJpdiwgaW50IGlkKQoreworCXJldHVybiBzNWs2YWFfZ3Bpb19zZXRfdmFsdWUocHJpdiwgaWQsIHByaXYtPmdwaW9baWRdLmxldmVsKTsKK30KKworc3RhdGljIGludCBzNWs2YWFfZ3Bpb19kZWFzc2VydChzdHJ1Y3QgczVrNmFhICpwcml2LCBpbnQgaWQpCit7CisJcmV0dXJuIHM1azZhYV9ncGlvX3NldF92YWx1ZShwcml2LCBpZCwgIXByaXYtPmdwaW9baWRdLmxldmVsKTsKK30KKworc3RhdGljIGludCBfX3M1azZhYV9wb3dlcl9vbihzdHJ1Y3QgczVrNmFhICpzNWs2YWEpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShTNUs2QUFfTlVNX1NVUFBMSUVTLCBzNWs2YWEtPnN1cHBsaWVzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmIChzNWs2YWFfZ3Bpb19kZWFzc2VydChzNWs2YWEsIFNUQlkpKQorCQl1c2xlZXBfcmFuZ2UoMTUwLCAyMDApOworCisJaWYgKHM1azZhYS0+c19wb3dlcikKKwkJcmV0ID0gczVrNmFhLT5zX3Bvd2VyKDEpOworCXVzbGVlcF9yYW5nZSg0MDAwLCA0MDAwKTsKKworCWlmIChzNWs2YWFfZ3Bpb19kZWFzc2VydChzNWs2YWEsIFJTVCkpCisJCW1zbGVlcCgyMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fczVrNmFhX3Bvd2VyX29mZihzdHJ1Y3QgczVrNmFhICpzNWs2YWEpCit7CisJaW50IHJldDsKKworCWlmIChzNWs2YWFfZ3Bpb19hc3NlcnQoczVrNmFhLCBSU1QpKQorCQl1c2xlZXBfcmFuZ2UoMTAwLCAxNTApOworCisJaWYgKHM1azZhYS0+c19wb3dlcikgeworCQlyZXQgPSBzNWs2YWEtPnNfcG93ZXIoMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoczVrNmFhX2dwaW9fYXNzZXJ0KHM1azZhYSwgU1RCWSkpCisJCXVzbGVlcF9yYW5nZSg1MCwgMTAwKTsKKwlzNWs2YWEtPnN0cmVhbWluZyA9IDA7CisKKwlyZXR1cm4gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShTNUs2QUFfTlVNX1NVUFBMSUVTLCBzNWs2YWEtPnN1cHBsaWVzKTsKK30KKworLyoKKyAqIFY0TDIgc3ViZGV2IGNvcmUgYW5kIHZpZGVvIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIGludCBzNWs2YWFfc2V0X3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmczVrNmFhLT5sb2NrKTsKKworCWlmICghb24gPT0gczVrNmFhLT5wb3dlcikgeworCQlpZiAob24pIHsKKwkJCXJldCA9IF9fczVrNmFhX3Bvd2VyX29uKHM1azZhYSk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBzNWs2YWFfaW5pdGlhbGl6ZV9pc3Aoc2QpOworCQl9IGVsc2UgeworCQkJcmV0ID0gX19zNWs2YWFfcG93ZXJfb2ZmKHM1azZhYSk7CisJCX0KKworCQlpZiAoIXJldCkKKwkJCXM1azZhYS0+cG93ZXIgKz0gb24gPyAxIDogLTE7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzNWs2YWEtPmxvY2spOworCisJaWYgKCFvbiB8fCByZXQgfHwgczVrNmFhLT5wb3dlciAhPSAxKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKHNkLT5jdHJsX2hhbmRsZXIpOworfQorCitzdGF0aWMgaW50IF9fczVrNmFhX3N0cmVhbShzdHJ1Y3QgczVrNmFhICpzNWs2YWEsIGludCBlbmFibGUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCWludCByZXQgPSAwOworCisJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX0dfRU5BQkxFX1BSRVYsIGVuYWJsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19HX0VOQUJMRV9QUkVWX0NIRywgMSk7CisJaWYgKCFyZXQpCisJCXM1azZhYS0+c3RyZWFtaW5nID0gZW5hYmxlOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzNWs2YWFfc19zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQoreworCXN0cnVjdCBzNWs2YWEgKnM1azZhYSA9IHRvX3M1azZhYShzZCk7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZzNWs2YWEtPmxvY2spOworCisJaWYgKHM1azZhYS0+c3RyZWFtaW5nID09ICFvbikgeworCQlpZiAoIXJldCAmJiBzNWs2YWEtPmFwcGx5X2NmZykKKwkJCXJldCA9IHM1azZhYV9zZXRfcHJldl9jb25maWcoczVrNmFhLCBzNWs2YWEtPnByZXNldCk7CisJCWlmIChzNWs2YWEtPmFwcGx5X2Nyb3ApCisJCQlyZXQgPSBzNWs2YWFfc2V0X2lucHV0X3BhcmFtcyhzNWs2YWEpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IF9fczVrNmFhX3N0cmVhbShzNWs2YWEsICEhb24pOworCX0KKwltdXRleF91bmxvY2soJnM1azZhYS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHM1azZhYV9nX2ZyYW1lX2ludGVydmFsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsICpmaSkKK3sKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCisJbXV0ZXhfbG9jaygmczVrNmFhLT5sb2NrKTsKKwlmaS0+aW50ZXJ2YWwgPSBzNWs2YWEtPmZpdi0+aW50ZXJ2YWw7CisJbXV0ZXhfdW5sb2NrKCZzNWs2YWEtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19zNWs2YWFfc2V0X2ZyYW1lX2ludGVydmFsKHN0cnVjdCBzNWs2YWEgKnM1azZhYSwKKwkJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsICpmaSkKK3sKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptYnVzX2ZtdCA9ICZzNWs2YWEtPnByZXNldC0+bWJ1c19mbXQ7CisJY29uc3Qgc3RydWN0IHM1azZhYV9pbnRlcnZhbCAqZml2ID0gJnM1azZhYV9pbnRlcnZhbHNbMF07CisJdW5zaWduZWQgaW50IGVyciwgbWluX2VyciA9IFVJTlRfTUFYOworCXVuc2lnbmVkIGludCBpLCBmcl90aW1lOworCisJaWYgKGZpLT5pbnRlcnZhbC5kZW5vbWluYXRvciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZyX3RpbWUgPSBmaS0+aW50ZXJ2YWwubnVtZXJhdG9yICogMTAwMDAgLyBmaS0+aW50ZXJ2YWwuZGVub21pbmF0b3I7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzNWs2YWFfaW50ZXJ2YWxzKTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBzNWs2YWFfaW50ZXJ2YWwgKml2ID0gJnM1azZhYV9pbnRlcnZhbHNbaV07CisKKwkJaWYgKG1idXNfZm10LT53aWR0aCA+IGl2LT5zaXplLndpZHRoIHx8CisJCSAgICBtYnVzX2ZtdC0+aGVpZ2h0ID4gaXYtPnNpemUuaGVpZ2h0KQorCQkJY29udGludWU7CisKKwkJZXJyID0gYWJzKGl2LT5yZWdfZnJfdGltZSAtIGZyX3RpbWUpOworCQlpZiAoZXJyIDwgbWluX2VycikgeworCQkJZml2ID0gaXY7CisJCQltaW5fZXJyID0gZXJyOworCQl9CisJfQorCXM1azZhYS0+Zml2ID0gZml2OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZzNWs2YWEtPnNkLCAiQ2hhbmdlZCBmcmFtZSBpbnRlcnZhbCB0byAlZCB1c1xuIiwKKwkJIGZpdi0+cmVnX2ZyX3RpbWUgKiAxMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1azZhYV9zX2ZyYW1lX2ludGVydmFsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsICpmaSkKK3sKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCWludCByZXQ7CisKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJTZXR0aW5nICVkLyVkIGZyYW1lIGludGVydmFsXG4iLAorCQkgZmktPmludGVydmFsLm51bWVyYXRvciwgZmktPmludGVydmFsLmRlbm9taW5hdG9yKTsKKworCW11dGV4X2xvY2soJnM1azZhYS0+bG9jayk7CisJcmV0ID0gX19zNWs2YWFfc2V0X2ZyYW1lX2ludGVydmFsKHM1azZhYSwgZmkpOworCXM1azZhYS0+YXBwbHlfY2ZnID0gMTsKKworCW11dGV4X3VubG9jaygmczVrNmFhLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVjRMMiBzdWJkZXYgcGFkIGxldmVsIGFuZCB2aWRlbyBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgczVrNmFhX2VudW1fZnJhbWVfaW50ZXJ2YWwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfaW50ZXJ2YWxfZW51bSAqZmllKQoreworCXN0cnVjdCBzNWs2YWEgKnM1azZhYSA9IHRvX3M1azZhYShzZCk7CisJY29uc3Qgc3RydWN0IHM1azZhYV9pbnRlcnZhbCAqZmk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZmllLT5pbmRleCA+IEFSUkFZX1NJWkUoczVrNmFhX2ludGVydmFscykpCisJCXJldHVybiAtRUlOVkFMOworCisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZmaWUtPndpZHRoLCBTNUs2QUFfV0lOX1dJRFRIX01JTiwKKwkJCSAgICAgIFM1SzZBQV9XSU5fV0lEVEhfTUFYLCAxLAorCQkJICAgICAgJmZpZS0+aGVpZ2h0LCBTNUs2QUFfV0lOX0hFSUdIVF9NSU4sCisJCQkgICAgICBTNUs2QUFfV0lOX0hFSUdIVF9NQVgsIDEsIDApOworCisJbXV0ZXhfbG9jaygmczVrNmFhLT5sb2NrKTsKKwlmaSA9ICZzNWs2YWFfaW50ZXJ2YWxzW2ZpZS0+aW5kZXhdOworCWlmIChmaWUtPndpZHRoID4gZmktPnNpemUud2lkdGggfHwgZmllLT5oZWlnaHQgPiBmaS0+c2l6ZS5oZWlnaHQpCisJCXJldCA9IC1FSU5WQUw7CisJZWxzZQorCQlmaWUtPmludGVydmFsID0gZmktPmludGVydmFsOworCW11dGV4X3VubG9jaygmczVrNmFhLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX2VudW1fbWJ1c19jb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJIHN0cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSAqY29kZSkKK3sKKwlpZiAoY29kZS0+aW5kZXggPj0gQVJSQVlfU0laRShzNWs2YWFfZm9ybWF0cykpCisJCXJldHVybiAtRUlOVkFMOworCisJY29kZS0+Y29kZSA9IHM1azZhYV9mb3JtYXRzW2NvZGUtPmluZGV4XS5jb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1azZhYV9lbnVtX2ZyYW1lX3NpemUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfc2l6ZV9lbnVtICpmc2UpCit7CisJaW50IGkgPSBBUlJBWV9TSVpFKHM1azZhYV9mb3JtYXRzKTsKKworCWlmIChmc2UtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aGlsZSAoLS1pKQorCQlpZiAoZnNlLT5jb2RlID09IHM1azZhYV9mb3JtYXRzW2ldLmNvZGUpCisJCQlicmVhazsKKworCWZzZS0+Y29kZSA9IHM1azZhYV9mb3JtYXRzW2ldLmNvZGU7CisJZnNlLT5taW5fd2lkdGggID0gUzVLNkFBX1dJTl9XSURUSF9NSU47CisJZnNlLT5tYXhfd2lkdGggID0gUzVLNkFBX1dJTl9XSURUSF9NQVg7CisJZnNlLT5tYXhfaGVpZ2h0ID0gUzVLNkFBX1dJTl9IRUlHSFRfTUlOOworCWZzZS0+bWluX2hlaWdodCA9IFM1SzZBQV9XSU5fSEVJR0hUX01BWDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfcmVjdCAqCitfX3M1azZhYV9nZXRfY3JvcF9yZWN0KHN0cnVjdCBzNWs2YWEgKnM1azZhYSwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJICAgICAgIGVudW0gdjRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZSB3aGljaCkKK3sKKwlpZiAod2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRSkKKwkJcmV0dXJuICZzNWs2YWEtPmNjZF9yZWN0OworCWlmICh3aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKQorCQlyZXR1cm4gdjRsMl9zdWJkZXZfZ2V0X3RyeV9jcm9wKGZoLCAwKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzNWs2YWFfdHJ5X2Zvcm1hdChzdHJ1Y3QgczVrNmFhICpzNWs2YWEsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwl2NGxfYm91bmRfYWxpZ25faW1hZ2UoJm1mLT53aWR0aCwgUzVLNkFBX1dJTl9XSURUSF9NSU4sCisJCQkgICAgICBTNUs2QUFfV0lOX1dJRFRIX01BWCwgMSwKKwkJCSAgICAgICZtZi0+aGVpZ2h0LCBTNUs2QUFfV0lOX0hFSUdIVF9NSU4sCisJCQkgICAgICBTNUs2QUFfV0lOX0hFSUdIVF9NQVgsIDEsIDApOworCisJaWYgKG1mLT5jb2xvcnNwYWNlICE9IFY0TDJfQ09MT1JTUEFDRV9KUEVHICYmCisJICAgIG1mLT5jb2xvcnNwYWNlICE9IFY0TDJfQ09MT1JTUEFDRV9SRUM3MDkpCisJCW1mLT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7CisKKwlpbmRleCA9IHM1azZhYV9nZXRfcGl4Zm10X2luZGV4KHM1azZhYSwgbWYpOworCisJbWYtPmNvbG9yc3BhY2UJPSBzNWs2YWFfZm9ybWF0c1tpbmRleF0uY29sb3JzcGFjZTsKKwltZi0+Y29kZQk9IHM1azZhYV9mb3JtYXRzW2luZGV4XS5jb2RlOworCW1mLT5maWVsZAk9IFY0TDJfRklFTERfTk9ORTsKK30KKworc3RhdGljIGludCBzNWs2YWFfZ2V0X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IHM1azZhYSAqczVrNmFhID0gdG9fczVrNmFhKHNkKTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZjsKKworCW1lbXNldChmbXQtPnJlc2VydmVkLCAwLCBzaXplb2YoZm10LT5yZXNlcnZlZCkpOworCisJaWYgKGZtdC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkgeworCQltZiA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCAwKTsKKwkJZm10LT5mb3JtYXQgPSAqbWY7CisJCXJldHVybiAwOworCX0KKworCW11dGV4X2xvY2soJnM1azZhYS0+bG9jayk7CisJZm10LT5mb3JtYXQgPSBzNWs2YWEtPnByZXNldC0+bWJ1c19mbXQ7CisJbXV0ZXhfdW5sb2NrKCZzNWs2YWEtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3NldF9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBzNWs2YWEgKnM1azZhYSA9IHRvX3M1azZhYShzZCk7CisJc3RydWN0IHM1azZhYV9wcmVzZXQgKnByZXNldCA9IHM1azZhYS0+cHJlc2V0OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mOworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3A7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZzNWs2YWEtPmxvY2spOworCXM1azZhYV90cnlfZm9ybWF0KHM1azZhYSwgJmZtdC0+Zm9ybWF0KTsKKworCWlmIChmbXQtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpIHsKKwkJbWYgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgZm10LT5wYWQpOworCQljcm9wID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9jcm9wKGZoLCAwKTsKKwl9IGVsc2UgeworCQlpZiAoczVrNmFhLT5zdHJlYW1pbmcpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJfSBlbHNlIHsKKwkJCW1mID0gJnByZXNldC0+bWJ1c19mbXQ7CisJCQljcm9wID0gJnM1azZhYS0+Y2NkX3JlY3Q7CisJCQlzNWs2YWEtPmFwcGx5X2NmZyA9IDE7CisJCX0KKwl9CisKKwlpZiAocmV0ID09IDApIHsKKwkJc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsIGZpdiA9IHsKKwkJCS5pbnRlcnZhbCA9IHswLCAxfQorCQl9OworCisJCSptZiA9IGZtdC0+Zm9ybWF0OworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIGNyb3Agd2luZG93IGlzIHZhbGlkLCBpLmUuIGl0cyBzaXplIGlzCisJCSAqIGdyZWF0ZXIgdGhhbiB0aGUgb3V0cHV0IHdpbmRvdywgYXMgdGhlIElTUCBzdXBwb3J0cworCQkgKiBvbmx5IGRvd24tc2NhbGluZy4KKwkJICovCisJCWNyb3AtPndpZHRoID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIGNyb3AtPndpZHRoLCBtZi0+d2lkdGgsCisJCQkJICAgICAgUzVLNkFBX1dJTl9XSURUSF9NQVgpOworCQljcm9wLT5oZWlnaHQgPSBjbGFtcF90KHVuc2lnbmVkIGludCwgY3JvcC0+aGVpZ2h0LCBtZi0+aGVpZ2h0LAorCQkJCSAgICAgICBTNUs2QUFfV0lOX0hFSUdIVF9NQVgpOworCQljcm9wLT5sZWZ0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIGNyb3AtPmxlZnQsIDAsCisJCQkJICAgICBTNUs2QUFfV0lOX1dJRFRIX01BWCAtIGNyb3AtPndpZHRoKTsKKwkJY3JvcC0+dG9wICA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBjcm9wLT50b3AsIDAsCisJCQkJICAgICBTNUs2QUFfV0lOX0hFSUdIVF9NQVggLSBjcm9wLT5oZWlnaHQpOworCisJCS8qIFJlc2V0IHRvIG1pbmltdW0gcG9zc2libGUgZnJhbWUgaW50ZXJ2YWwgKi8KKwkJcmV0ID0gX19zNWs2YWFfc2V0X2ZyYW1lX2ludGVydmFsKHM1azZhYSwgJmZpdik7CisJfQorCW11dGV4X3VubG9jaygmczVrNmFhLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX2dldF9jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCAqY3JvcCkKK3sKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3Q7CisKKwltZW1zZXQoY3JvcC0+cmVzZXJ2ZWQsIDAsIHNpemVvZihjcm9wLT5yZXNlcnZlZCkpOworCW11dGV4X2xvY2soJnM1azZhYS0+bG9jayk7CisKKwlyZWN0ID0gX19zNWs2YWFfZ2V0X2Nyb3BfcmVjdChzNWs2YWEsIGZoLCBjcm9wLT53aGljaCk7CisJaWYgKHJlY3QpCisJCWNyb3AtPnJlY3QgPSAqcmVjdDsKKworCW11dGV4X3VubG9jaygmczVrNmFhLT5sb2NrKTsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIkN1cnJlbnQgY3JvcCByZWN0YW5nbGU6ICglZCwlZCkvJWR4JWRcbiIsCisJCSByZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3NldF9jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCAqY3JvcCkKK3sKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mOworCXVuc2lnbmVkIGludCBtYXhfeCwgbWF4X3k7CisJc3RydWN0IHY0bDJfcmVjdCAqY3JvcF9yOworCisJbXV0ZXhfbG9jaygmczVrNmFhLT5sb2NrKTsKKwljcm9wX3IgPSBfX3M1azZhYV9nZXRfY3JvcF9yZWN0KHM1azZhYSwgZmgsIGNyb3AtPndoaWNoKTsKKworCWlmIChjcm9wLT53aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFKSB7CisJCW1mID0gJnM1azZhYS0+cHJlc2V0LT5tYnVzX2ZtdDsKKwkJczVrNmFhLT5hcHBseV9jcm9wID0gMTsKKwl9IGVsc2UgeworCQltZiA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCAwKTsKKwl9CisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZjcm9wLT5yZWN0LndpZHRoLCBtZi0+d2lkdGgsCisJCQkgICAgICBTNUs2QUFfV0lOX1dJRFRIX01BWCwgMSwKKwkJCSAgICAgICZjcm9wLT5yZWN0LmhlaWdodCwgbWYtPmhlaWdodCwKKwkJCSAgICAgIFM1SzZBQV9XSU5fSEVJR0hUX01BWCwgMSwgMCk7CisKKwltYXhfeCA9IChTNUs2QUFfV0lOX1dJRFRIX01BWCAtIGNyb3AtPnJlY3Qud2lkdGgpICYgfjE7CisJbWF4X3kgPSAoUzVLNkFBX1dJTl9IRUlHSFRfTUFYIC0gY3JvcC0+cmVjdC5oZWlnaHQpICYgfjE7CisKKwljcm9wLT5yZWN0LmxlZnQgPSBjbGFtcF90KHVuc2lnbmVkIGludCwgY3JvcC0+cmVjdC5sZWZ0LCAwLCBtYXhfeCk7CisJY3JvcC0+cmVjdC50b3AgID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIGNyb3AtPnJlY3QudG9wLCAwLCBtYXhfeSk7CisKKwkqY3JvcF9yID0gY3JvcC0+cmVjdDsKKworCW11dGV4X3VubG9jaygmczVrNmFhLT5sb2NrKTsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlNldCBjcm9wIHJlY3RhbmdsZTogKCVkLCVkKS8lZHglZFxuIiwKKwkJIGNyb3Bfci0+bGVmdCwgY3JvcF9yLT50b3AsIGNyb3Bfci0+d2lkdGgsIGNyb3Bfci0+aGVpZ2h0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9vcHMgczVrNmFhX3BhZF9vcHMgPSB7CisJLmVudW1fbWJ1c19jb2RlCQk9IHM1azZhYV9lbnVtX21idXNfY29kZSwKKwkuZW51bV9mcmFtZV9zaXplCT0gczVrNmFhX2VudW1fZnJhbWVfc2l6ZSwKKwkuZW51bV9mcmFtZV9pbnRlcnZhbAk9IHM1azZhYV9lbnVtX2ZyYW1lX2ludGVydmFsLAorCS5nZXRfZm10CQk9IHM1azZhYV9nZXRfZm10LAorCS5zZXRfZm10CQk9IHM1azZhYV9zZXRfZm10LAorCS5nZXRfY3JvcAkJPSBzNWs2YWFfZ2V0X2Nyb3AsCisJLnNldF9jcm9wCQk9IHM1azZhYV9zZXRfY3JvcCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHM1azZhYV92aWRlb19vcHMgPSB7CisJLmdfZnJhbWVfaW50ZXJ2YWwJPSBzNWs2YWFfZ19mcmFtZV9pbnRlcnZhbCwKKwkuc19mcmFtZV9pbnRlcnZhbAk9IHM1azZhYV9zX2ZyYW1lX2ludGVydmFsLAorCS5zX3N0cmVhbQkJPSBzNWs2YWFfc19zdHJlYW0sCit9OworCisvKgorICogVjRMMiBzdWJkZXYgY29udHJvbHMKKyAqLworCitzdGF0aWMgaW50IHM1azZhYV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gY3RybF90b19zZChjdHJsKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHM1azZhYSAqczVrNmFhID0gdG9fczVrNmFhKHNkKTsKKwlpbnQgaWR4LCBlcnIgPSAwOworCisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiY3RybDogMHgleCwgdmFsdWU6ICVkXG4iLCBjdHJsLT5pZCwgY3RybC0+dmFsKTsKKworCW11dGV4X2xvY2soJnM1azZhYS0+bG9jayk7CisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBwb3dlcmVkIHVwIGJ5IHRoZSBob3N0IGRyaXZlciBkbworCSAqIG5vdCBhcHBseSBhbnkgY29udHJvbHMgdG8gSC9XIGF0IHRoaXMgdGltZS4gSW5zdGVhZAorCSAqIHRoZSBjb250cm9scyB3aWxsIGJlIHJlc3RvcmVkIHJpZ2h0IGFmdGVyIHBvd2VyLXVwLgorCSAqLworCWlmIChzNWs2YWEtPnBvd2VyID09IDApCisJCWdvdG8gdW5sb2NrOworCWlkeCA9IHM1azZhYS0+cHJlc2V0LT5pbmRleDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKKwkJZXJyID0gczVrNmFhX3NldF9hd2IoczVrNmFhLCBjdHJsLT52YWwpOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJZXJyID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1VTRVJfQlJJR0hUTkVTUywgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0NPTE9SRlg6CisJCWVyciA9IHM1azZhYV9zZXRfY29sb3JmeChzNWs2YWEsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJZXJyID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1VTRVJfQ09OVFJBU1QsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgorCQllcnIgPSBzNWs2YWFfc2V0X2F1dG9fZXhwb3N1cmUoczVrNmFhLCBjdHJsLT52YWwpOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfSEZMSVA6CisJCWVyciA9IHM1azZhYV9zZXRfbWlycm9yKHM1azZhYSwgY3RybC0+dmFsKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQllcnIgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfR19QUkVWX0NGR19DSEcsIDEpOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1k6CisJCWVyciA9IHM1azZhYV9zZXRfYW50aV9mbGlja2VyKHM1azZhYSwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCWVyciA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19VU0VSX1NBVFVSQVRJT04sIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCWVyciA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19VU0VSX1NIQVJQQkxVUiwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkU6CisJCWVyciA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19QX0NPTE9SVEVNUChpZHgpLCBjdHJsLT52YWwpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWVyciA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19HX1BSRVZfQ0ZHX0NIRywgMSk7CisJCWJyZWFrOworCX0KK3VubG9jazoKKwltdXRleF91bmxvY2soJnM1azZhYS0+bG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIHM1azZhYV9jdHJsX29wcyA9IHsKKwkuc19jdHJsCT0gczVrNmFhX3NfY3RybCwKK307CisKK3N0YXRpYyBpbnQgczVrNmFhX2xvZ19zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwl2NGwyX2N0cmxfaGFuZGxlcl9sb2dfc3RhdHVzKHNkLT5jdHJsX2hhbmRsZXIsIHNkLT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBWNEwyX0NJRF9SRURfR0FJTgkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4MTAwMSkKKyNkZWZpbmUgVjRMMl9DSURfR1JFRU5fR0FJTgkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4MTAwMikKKyNkZWZpbmUgVjRMMl9DSURfQkxVRV9HQUlOCShWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBIHwgMHgxMDAzKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgczVrNmFhX2N0cmxzW10gPSB7CisJeworCQkub3BzCT0gJnM1azZhYV9jdHJsX29wcywKKwkJLmlkCT0gVjRMMl9DSURfUkVEX0dBSU4sCisJCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUJPSAiR2FpbiwgUmVkIiwKKwkJLm1pbgk9IDAsCisJCS5tYXgJPSAyNTYsCisJCS5kZWYJPSAxMjcsCisJCS5zdGVwCT0gMSwKKwl9LCB7CisJCS5vcHMJPSAmczVrNmFhX2N0cmxfb3BzLAorCQkuaWQJPSBWNEwyX0NJRF9HUkVFTl9HQUlOLAorCQkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lCT0gIkdhaW4sIEdyZWVuIiwKKwkJLm1pbgk9IDAsCisJCS5tYXgJPSAyNTYsCisJCS5kZWYJPSAxMjcsCisJCS5zdGVwCT0gMSwKKwl9LCB7CisJCS5vcHMJPSAmczVrNmFhX2N0cmxfb3BzLAorCQkuaWQJPSBWNEwyX0NJRF9CTFVFX0dBSU4sCisJCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUJPSAiR2FpbiwgQmx1ZSIsCisJCS5taW4JPSAwLAorCQkubWF4CT0gMjU2LAorCQkuZGVmCT0gMTI3LAorCQkuc3RlcAk9IDEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgczVrNmFhX2luaXRpYWxpemVfY3RybHMoc3RydWN0IHM1azZhYSAqczVrNmFhKQoreworCWNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzICpvcHMgPSAmczVrNmFhX2N0cmxfb3BzOworCXN0cnVjdCBzNWs2YWFfY3RybHMgKmN0cmxzID0gJnM1azZhYS0+Y3RybHM7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwgPSAmY3RybHMtPmhhbmRsZXI7CisKKwlpbnQgcmV0ID0gdjRsMl9jdHJsX2hhbmRsZXJfaW5pdChoZGwsIDE2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qIEF1dG8gd2hpdGUgYmFsYW5jZSBjbHVzdGVyICovCisJY3RybHMtPmF3YiA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsCisJCQkJICAgICAgIDAsIDEsIDEsIDEpOworCWN0cmxzLT5nYWluX3JlZCA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnM1azZhYV9jdHJsc1swXSwgTlVMTCk7CisJY3RybHMtPmdhaW5fZ3JlZW4gPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZzNWs2YWFfY3RybHNbMV0sIE5VTEwpOworCWN0cmxzLT5nYWluX2JsdWUgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZzNWs2YWFfY3RybHNbMl0sIE5VTEwpOworCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoNCwgJmN0cmxzLT5hd2IsIDAsIGZhbHNlKTsKKworCWN0cmxzLT5oZmxpcCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9IRkxJUCwgMCwgMSwgMSwgMCk7CisJY3RybHMtPnZmbGlwID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCBvcHMsIFY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfY2x1c3RlcigyLCAmY3RybHMtPmhmbGlwKTsKKworCWN0cmxzLT5hdXRvX2V4cCA9IHY0bDJfY3RybF9uZXdfc3RkX21lbnUoaGRsLCBvcHMsCisJCQkJVjRMMl9DSURfRVhQT1NVUkVfQVVUTywKKwkJCQlWNEwyX0VYUE9TVVJFX01BTlVBTCwgMCwgVjRMMl9FWFBPU1VSRV9BVVRPKTsKKwkvKiBFeHBvc3VyZSB0aW1lOiB4IDEgdXMgKi8KKwljdHJscy0+ZXhwb3N1cmUgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIG9wcywgVjRMMl9DSURfRVhQT1NVUkUsCisJCQkJCSAgICAwLCA2MDAwMDAwVSwgMSwgMTAwMDAwVSk7CisJLyogVG90YWwgZ2FpbjogMjU2IDw9PiAxeCAqLworCWN0cmxzLT5nYWluID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCBvcHMsIFY0TDJfQ0lEX0dBSU4sCisJCQkJCTAsIDI1NiwgMSwgMjU2KTsKKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDMsICZjdHJscy0+YXV0b19leHAsIDAsIGZhbHNlKTsKKworCXY0bDJfY3RybF9uZXdfc3RkX21lbnUoaGRsLCBvcHMsIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZLAorCQkJICAgICAgIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZX0FVVE8sIDAsCisJCQkgICAgICAgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfQVVUTyk7CisKKwl2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KGhkbCwgb3BzLCBWNEwyX0NJRF9DT0xPUkZYLAorCQkJICAgICAgIFY0TDJfQ09MT1JGWF9TS1lfQkxVRSwgfjB4NmYsIFY0TDJfQ09MT1JGWF9OT05FKTsKKworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFLAorCQkJICAwLCAyNTYsIDEsIDApOworCisJdjRsMl9jdHJsX25ld19zdGQoaGRsLCBvcHMsIFY0TDJfQ0lEX1NBVFVSQVRJT04sIC0xMjcsIDEyNywgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoaGRsLCBvcHMsIFY0TDJfQ0lEX0JSSUdIVE5FU1MsIC0xMjcsIDEyNywgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoaGRsLCBvcHMsIFY0TDJfQ0lEX0NPTlRSQVNULCAtMTI3LCAxMjcsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9TSEFSUE5FU1MsIC0xMjcsIDEyNywgMSwgMCk7CisKKwlpZiAoaGRsLT5lcnJvcikgeworCQlyZXQgPSBoZGwtPmVycm9yOworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKGhkbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJczVrNmFhLT5zZC5jdHJsX2hhbmRsZXIgPSBoZGw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBWNEwyIHN1YmRldiBpbnRlcm5hbCBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgczVrNmFhX29wZW4oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKK3sKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgMCk7CisJc3RydWN0IHY0bDJfcmVjdCAqY3JvcCA9IHY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgMCk7CisKKwlmb3JtYXQtPmNvbG9yc3BhY2UgPSBzNWs2YWFfZm9ybWF0c1swXS5jb2xvcnNwYWNlOworCWZvcm1hdC0+Y29kZSA9IHM1azZhYV9mb3JtYXRzWzBdLmNvZGU7CisJZm9ybWF0LT53aWR0aCA9IFM1SzZBQV9PVVRfV0lEVEhfREVGOworCWZvcm1hdC0+aGVpZ2h0ID0gUzVLNkFBX09VVF9IRUlHSFRfREVGOworCWZvcm1hdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisKKwljcm9wLT53aWR0aCA9IFM1SzZBQV9XSU5fV0lEVEhfTUFYOworCWNyb3AtPmhlaWdodCA9IFM1SzZBQV9XSU5fSEVJR0hUX01BWDsKKwljcm9wLT5sZWZ0ID0gMDsKKwljcm9wLT50b3AgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzNWs2YWFfY2hlY2tfZndfcmV2aXNpb24oc3RydWN0IHM1azZhYSAqczVrNmFhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzNWs2YWEtPnNkKTsKKwl1MTYgYXBpX3ZlciA9IDAsIGZ3X3JldiA9IDA7CisKKwlpbnQgcmV0ID0gczVrNmFhX3NldF9haGJfYWRkcmVzcyhjbGllbnQpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV9yZWFkKGNsaWVudCwgUkVHX0ZXX0FQSVZFUiwgJmFwaV92ZXIpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfcmVhZChjbGllbnQsIFJFR19GV19SRVZJU0lPTiwgJmZ3X3Jldik7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmczVrNmFhLT5zZCwgIkZXIHJldmlzaW9uIGNoZWNrIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXY0bDJfaW5mbygmczVrNmFhLT5zZCwgIkZXIEFQSSB2ZXIuOiAweCVYLCBGVyByZXYuOiAweCVYXG4iLAorCQkgIGFwaV92ZXIsIGZ3X3Jldik7CisKKwlyZXR1cm4gYXBpX3ZlciA9PSBTNUs2QUFGWF9GV19BUElWRVIgPyAwIDogLUVOT0RFVjsKK30KKworc3RhdGljIGludCBzNWs2YWFfcmVnaXN0ZXJlZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBzNWs2YWEgKnM1azZhYSA9IHRvX3M1azZhYShzZCk7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnM1azZhYS0+bG9jayk7CisJcmV0ID0gX19zNWs2YWFfcG93ZXJfb24oczVrNmFhKTsKKwlpZiAoIXJldCkgeworCQltc2xlZXAoMTAwKTsKKwkJcmV0ID0gczVrNmFhX2NoZWNrX2Z3X3JldmlzaW9uKHM1azZhYSk7CisJCV9fczVrNmFhX3Bvd2VyX29mZihzNWs2YWEpOworCX0KKwltdXRleF91bmxvY2soJnM1azZhYS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2ludGVybmFsX29wcyBzNWs2YWFfc3ViZGV2X2ludGVybmFsX29wcyA9IHsKKwkucmVnaXN0ZXJlZCA9IHM1azZhYV9yZWdpc3RlcmVkLAorCS5vcGVuID0gczVrNmFhX29wZW4sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHM1azZhYV9jb3JlX29wcyA9IHsKKwkuc19wb3dlciA9IHM1azZhYV9zZXRfcG93ZXIsCisJLmxvZ19zdGF0dXMgPSBzNWs2YWFfbG9nX3N0YXR1cywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHM1azZhYV9zdWJkZXZfb3BzID0geworCS5jb3JlID0gJnM1azZhYV9jb3JlX29wcywKKwkucGFkID0gJnM1azZhYV9wYWRfb3BzLAorCS52aWRlbyA9ICZzNWs2YWFfdmlkZW9fb3BzLAorfTsKKworLyoKKyAqIEdQSU8gc2V0dXAKKyAqLworc3RhdGljIGludCBzNWs2YWFfY29uZmlndXJlX2dwaW8oaW50IG5yLCBpbnQgdmFsLCBjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSB2YWwgPyBHUElPRl9PVVRfSU5JVF9ISUdIIDogR1BJT0ZfT1VUX0lOSVRfTE9XOworCWludCByZXQ7CisKKwlpZiAoIWdwaW9faXNfdmFsaWQobnIpKQorCQlyZXR1cm4gMDsKKwlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKG5yLCBmbGFncywgbmFtZSk7CisJaWYgKCFyZXQpCisJCWdwaW9fZXhwb3J0KG5yLCAwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzNWs2YWFfZnJlZV9ncGlvcyhzdHJ1Y3QgczVrNmFhICpzNWs2YWEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzNWs2YWEtPmdwaW8pOyBpKyspIHsKKwkJaWYgKCFncGlvX2lzX3ZhbGlkKHM1azZhYS0+Z3Bpb1tpXS5ncGlvKSkKKwkJCWNvbnRpbnVlOworCQlncGlvX2ZyZWUoczVrNmFhLT5ncGlvW2ldLmdwaW8pOworCQlzNWs2YWEtPmdwaW9baV0uZ3BpbyA9IC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IHM1azZhYV9jb25maWd1cmVfZ3Bpb3Moc3RydWN0IHM1azZhYSAqczVrNmFhLAorCQkJCSAgY29uc3Qgc3RydWN0IHM1azZhYV9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgczVrNmFhX2dwaW8gKmdwaW8gPSAmcGRhdGEtPmdwaW9fc3RieTsKKwlpbnQgcmV0OworCisJczVrNmFhLT5ncGlvW1NUQlldLmdwaW8gPSAtRUlOVkFMOworCXM1azZhYS0+Z3Bpb1tSU1RdLmdwaW8gID0gLUVJTlZBTDsKKworCXJldCA9IHM1azZhYV9jb25maWd1cmVfZ3BpbyhncGlvLT5ncGlvLCBncGlvLT5sZXZlbCwgIlM1SzZBQV9TVEJZIik7CisJaWYgKHJldCkgeworCQlzNWs2YWFfZnJlZV9ncGlvcyhzNWs2YWEpOworCQlyZXR1cm4gcmV0OworCX0KKwlzNWs2YWEtPmdwaW9bU1RCWV0gPSAqZ3BpbzsKKwlpZiAoZ3Bpb19pc192YWxpZChncGlvLT5ncGlvKSkKKwkJZ3Bpb19zZXRfdmFsdWUoZ3Bpby0+Z3BpbywgMCk7CisKKwlncGlvID0gJnBkYXRhLT5ncGlvX3Jlc2V0OworCXJldCA9IHM1azZhYV9jb25maWd1cmVfZ3BpbyhncGlvLT5ncGlvLCBncGlvLT5sZXZlbCwgIlM1SzZBQV9SU1QiKTsKKwlpZiAocmV0KSB7CisJCXM1azZhYV9mcmVlX2dwaW9zKHM1azZhYSk7CisJCXJldHVybiByZXQ7CisJfQorCXM1azZhYS0+Z3Bpb1tSU1RdID0gKmdwaW87CisJaWYgKGdwaW9faXNfdmFsaWQoZ3Bpby0+Z3BpbykpCisJCWdwaW9fc2V0X3ZhbHVlKGdwaW8tPmdwaW8sIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJY29uc3Qgc3RydWN0IHM1azZhYV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWE7CisJaW50IGksIHJldDsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUGxhdGZvcm0gZGF0YSBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBkYXRhLT5tY2xrX2ZyZXF1ZW5jeSA9PSAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTUNMSyBmcmVxdWVuY3kgbm90IHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXM1azZhYSA9IGt6YWxsb2Moc2l6ZW9mKCpzNWs2YWEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXM1azZhYSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZzNWs2YWEtPmxvY2spOworCisJczVrNmFhLT5tY2xrX2ZyZXF1ZW5jeSA9IHBkYXRhLT5tY2xrX2ZyZXF1ZW5jeTsKKwlzNWs2YWEtPmJ1c190eXBlID0gcGRhdGEtPmJ1c190eXBlOworCXM1azZhYS0+bWlwaV9sYW5lcyA9IHBkYXRhLT5ubGFuZXM7CisJczVrNmFhLT5zX3Bvd2VyCT0gcGRhdGEtPnNldF9wb3dlcjsKKwlzNWs2YWEtPmludl9oZmxpcCA9IHBkYXRhLT5ob3Jpel9mbGlwOworCXM1azZhYS0+aW52X3ZmbGlwID0gcGRhdGEtPnZlcnRfZmxpcDsKKworCXNkID0gJnM1azZhYS0+c2Q7CisJc3RybGNweShzZC0+bmFtZSwgRFJJVkVSX05BTUUsIHNpemVvZihzZC0+bmFtZSkpOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZzNWs2YWFfc3ViZGV2X29wcyk7CisKKwlzZC0+aW50ZXJuYWxfb3BzID0gJnM1azZhYV9zdWJkZXZfaW50ZXJuYWxfb3BzOworCXNkLT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCXM1azZhYS0+cGFkLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKKwlzZC0+ZW50aXR5LnR5cGUgPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVl9TRU5TT1I7CisJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQoJnNkLT5lbnRpdHksIDEsICZzNWs2YWEtPnBhZCwgMCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZXJyMTsKKworCXJldCA9IHM1azZhYV9jb25maWd1cmVfZ3Bpb3MoczVrNmFhLCBwZGF0YSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZXJyMjsKKworCWZvciAoaSA9IDA7IGkgPCBTNUs2QUFfTlVNX1NVUFBMSUVTOyBpKyspCisJCXM1azZhYS0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gczVrNmFhX3N1cHBseV9uYW1lc1tpXTsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldCgmY2xpZW50LT5kZXYsIFM1SzZBQV9OVU1fU1VQUExJRVMsCisJCQkJIHM1azZhYS0+c3VwcGxpZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHJlZ3VsYXRvcnNcbiIpOworCQlnb3RvIG91dF9lcnIzOworCX0KKworCXJldCA9IHM1azZhYV9pbml0aWFsaXplX2N0cmxzKHM1azZhYSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZXJyNDsKKworCXM1azZhYV9wcmVzZXRzX2RhdGFfaW5pdChzNWs2YWEpOworCisJczVrNmFhLT5jY2RfcmVjdC53aWR0aCA9IFM1SzZBQV9XSU5fV0lEVEhfTUFYOworCXM1azZhYS0+Y2NkX3JlY3QuaGVpZ2h0CT0gUzVLNkFBX1dJTl9IRUlHSFRfTUFYOworCXM1azZhYS0+Y2NkX3JlY3QubGVmdCA9IDA7CisJczVrNmFhLT5jY2RfcmVjdC50b3AgPSAwOworCisJcmV0dXJuIDA7CisKK291dF9lcnI0OgorCXJlZ3VsYXRvcl9idWxrX2ZyZWUoUzVLNkFBX05VTV9TVVBQTElFUywgczVrNmFhLT5zdXBwbGllcyk7CitvdXRfZXJyMzoKKwlzNWs2YWFfZnJlZV9ncGlvcyhzNWs2YWEpOworb3V0X2VycjI6CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnM1azZhYS0+c2QuZW50aXR5KTsKK291dF9lcnIxOgorCWtmcmVlKHM1azZhYSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzNWs2YWFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzNWs2YWEgKnM1azZhYSA9IHRvX3M1azZhYShzZCk7CisKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZShzZC0+Y3RybF9oYW5kbGVyKTsKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmc2QtPmVudGl0eSk7CisJcmVndWxhdG9yX2J1bGtfZnJlZShTNUs2QUFfTlVNX1NVUFBMSUVTLCBzNWs2YWEtPnN1cHBsaWVzKTsKKwlzNWs2YWFfZnJlZV9ncGlvcyhzNWs2YWEpOworCWtmcmVlKHM1azZhYSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHM1azZhYV9pZFtdID0geworCXsgRFJJVkVSX05BTUUsIDAgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHM1azZhYV9pZCk7CisKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHM1azZhYV9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUKKwl9LAorCS5wcm9iZQkJPSBzNWs2YWFfcHJvYmUsCisJLnJlbW92ZQkJPSBzNWs2YWFfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHM1azZhYV9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHM1azZhYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZzNWs2YWFfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzNWs2YWFfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZzNWs2YWFfaTJjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHM1azZhYV9pbml0KTsKK21vZHVsZV9leGl0KHM1azZhYV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFM1SzZBQShGWCkgU1hHQSBjYW1lcmEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9NYWtlZmlsZQppbmRleCBkZjY5NTRhLi4zM2RlYzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACi1zNXAtZmltYy1vYmpzIDo9IGZpbWMtY29yZS5vIGZpbWMtcmVnLm8gZmltYy1jYXB0dXJlLm8KK3M1cC1maW1jLW9ianMgOj0gZmltYy1jb3JlLm8gZmltYy1yZWcubyBmaW1jLWNhcHR1cmUubyBmaW1jLW1kZXZpY2UubwogczVwLWNzaXMtb2JqcyA6PSBtaXBpLWNzaXMubwogCiBvYmotJChDT05GSUdfVklERU9fUzVQX01JUElfQ1NJUykJKz0gczVwLWNzaXMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jYXB0dXJlLmMKaW5kZXggMGQ3MzBlNS4uYzhkOTFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY2FwdHVyZS5jCkBAIC0xNiwxMSArMTYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KQEAgLTI5LDEzNSArMjcsODggQEAKICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItY29yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CiAKKyNpbmNsdWRlICJmaW1jLW1kZXZpY2UuaCIKICNpbmNsdWRlICJmaW1jLWNvcmUuaCIKIAotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldiAqZmltY19zdWJkZXZfcmVnaXN0ZXIoc3RydWN0IGZpbWNfZGV2ICpmaW1jLAotCQkJCQkgICAgc3RydWN0IHM1cF9maW1jX2lzcF9pbmZvICppc3BfaW5mbykKK3N0YXRpYyBpbnQgZmltY19pbml0X2NhcHR1cmUoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQogewotCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXA7Ci0Jc3RydWN0IGZpbWNfdmlkX2NhcCAqdmlkX2NhcCA9ICZmaW1jLT52aWRfY2FwOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBOVUxMOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmltYy0+dmlkX2NhcC5jdHg7CisJc3RydWN0IGZpbWNfc2Vuc29yX2luZm8gKnNlbnNvcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOwogCi0JaTJjX2FkYXAgPSBpMmNfZ2V0X2FkYXB0ZXIoaXNwX2luZm8tPmkyY19idXNfbnVtKTsKLQlpZiAoIWkyY19hZGFwKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCXNkID0gdjRsMl9pMmNfbmV3X3N1YmRldl9ib2FyZCgmdmlkX2NhcC0+djRsMl9kZXYsIGkyY19hZGFwLAotCQkJCSAgICAgICBpc3BfaW5mby0+Ym9hcmRfaW5mbywgTlVMTCk7Ci0JaWYgKCFzZCkgewotCQl2NGwyX2VycigmdmlkX2NhcC0+djRsMl9kZXYsICJmYWlsZWQgdG8gYWNxdWlyZSBzdWJkZXZcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQl2NGwyX2luZm8oJnZpZF9jYXAtPnY0bDJfZGV2LCAic3ViZGV2aWNlICVzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bHlcbiIsCi0JCWlzcF9pbmZvLT5ib2FyZF9pbmZvLT50eXBlKTsKLQotCXJldHVybiBzZDsKLX0KLQotc3RhdGljIHZvaWQgZmltY19zdWJkZXZfdW5yZWdpc3RlcihzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCi17Ci0Jc3RydWN0IGZpbWNfdmlkX2NhcCAqdmlkX2NhcCA9ICZmaW1jLT52aWRfY2FwOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0KLQlpZiAodmlkX2NhcC0+aW5wdXRfaW5kZXggPCAwKQotCQlyZXR1cm47CS8qIFN1YmRldmljZSBhbHJlYWR5IHJlbGVhc2VkIG9yIG5vdCByZWdpc3RlcmVkLiAqLwotCi0JaWYgKHZpZF9jYXAtPnNkKSB7Ci0JCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHZpZF9jYXAtPnNkKTsKLQkJY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSh2aWRfY2FwLT5zZCk7Ci0JCWkyY191bnJlZ2lzdGVyX2RldmljZShjbGllbnQpOwotCQlpMmNfcHV0X2FkYXB0ZXIoY2xpZW50LT5hZGFwdGVyKTsKLQkJdmlkX2NhcC0+c2QgPSBOVUxMOwotCX0KLQotCXZpZF9jYXAtPmlucHV0X2luZGV4ID0gLTE7Ci19Ci0KLS8qKgotICogZmltY19zdWJkZXZfYXR0YWNoIC0gYXR0YWNoIHY0bDJfc3ViZGV2IHRvIGNhbWVyYSBob3N0IGludGVyZmFjZQotICoKLSAqIEBmaW1jOiBGSU1DIGRldmljZSBpbmZvcm1hdGlvbgotICogQGluZGV4OiBpbmRleCB0byB0aGUgYXJyYXkgb2YgYXZhaWxhYmxlIHN1YmRldmljZXMsCi0gKgkgICAtMSBmb3IgZnVsbCBhcnJheSBzZWFyY2ggb3Igbm9uIG5lZ2F0aXZlIHZhbHVlCi0gKgkgICB0byBzZWxlY3Qgc3BlY2lmaWMgc3ViZGV2aWNlCi0gKi8KLXN0YXRpYyBpbnQgZmltY19zdWJkZXZfYXR0YWNoKHN0cnVjdCBmaW1jX2RldiAqZmltYywgaW50IGluZGV4KQotewotCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXAgPSAmZmltYy0+dmlkX2NhcDsKLQlzdHJ1Y3QgczVwX3BsYXRmb3JtX2ZpbWMgKnBkYXRhID0gZmltYy0+cGRhdGE7Ci0Jc3RydWN0IHM1cF9maW1jX2lzcF9pbmZvICppc3BfaW5mbzsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fY2xpZW50czsgKytpKSB7Ci0JCWlzcF9pbmZvID0gJnBkYXRhLT5pc3BfaW5mb1tpXTsKLQotCQlpZiAoaW5kZXggPj0gMCAmJiBpICE9IGluZGV4KQotCQkJY29udGludWU7Ci0KLQkJc2QgPSBmaW1jX3N1YmRldl9yZWdpc3RlcihmaW1jLCBpc3BfaW5mbyk7Ci0JCWlmICghSVNfRVJSX09SX05VTEwoc2QpKSB7Ci0JCQl2aWRfY2FwLT5zZCA9IHNkOwotCQkJdmlkX2NhcC0+aW5wdXRfaW5kZXggPSBpOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXZpZF9jYXAtPmlucHV0X2luZGV4ID0gLTE7Ci0JdmlkX2NhcC0+c2QgPSBOVUxMOwotCXY0bDJfZXJyKCZ2aWRfY2FwLT52NGwyX2RldiwgImZpbWMlZDogc2Vuc29yIGF0dGFjaCBmYWlsZWRcbiIsCi0JCSBmaW1jLT5pZCk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbnQgZmltY19pc3Bfc3ViZGV2X2luaXQoc3RydWN0IGZpbWNfZGV2ICpmaW1jLCB1bnNpZ25lZCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IHM1cF9maW1jX2lzcF9pbmZvICppc3BfaW5mbzsKLQlzdHJ1Y3QgczVwX3BsYXRmb3JtX2ZpbWMgKnBkYXRhID0gZmltYy0+cGRhdGE7Ci0JaW50IHJldDsKLQotCWlmIChpbmRleCA+PSBwZGF0YS0+bnVtX2NsaWVudHMpCisJaWYgKGZpbWMtPnBpcGVsaW5lLnNlbnNvciA9PSBOVUxMIHx8IGN0eCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChjdHgtPnNfZnJhbWUuZm10ID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaXNwX2luZm8gPSAmcGRhdGEtPmlzcF9pbmZvW2luZGV4XTsKKwlzZW5zb3IgPSB2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoZmltYy0+cGlwZWxpbmUuc2Vuc29yKTsKIAotCWlmIChpc3BfaW5mby0+Y2xrX2ZyZXF1ZW5jeSkKLQkJY2xrX3NldF9yYXRlKGZpbWMtPmNsb2NrW0NMS19DQU1dLCBpc3BfaW5mby0+Y2xrX2ZyZXF1ZW5jeSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisJZmltY19wcmVwYXJlX2RtYV9vZmZzZXQoY3R4LCAmY3R4LT5kX2ZyYW1lKTsKKwlmaW1jX3NldF95dXZfb3JkZXIoY3R4KTsKIAotCXJldCA9IGNsa19lbmFibGUoZmltYy0+Y2xvY2tbQ0xLX0NBTV0pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJZmltY19od19zZXRfY2FtZXJhX3BvbGFyaXR5KGZpbWMsIHNlbnNvci0+cGRhdGEpOworCWZpbWNfaHdfc2V0X2NhbWVyYV90eXBlKGZpbWMsIHNlbnNvci0+cGRhdGEpOworCWZpbWNfaHdfc2V0X2NhbWVyYV9zb3VyY2UoZmltYywgc2Vuc29yLT5wZGF0YSk7CisJZmltY19od19zZXRfY2FtZXJhX29mZnNldChmaW1jLCAmY3R4LT5zX2ZyYW1lKTsKIAotCXJldCA9IGZpbWNfc3ViZGV2X2F0dGFjaChmaW1jLCBpbmRleCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGZpbWNfaHdfc2V0X2NhbWVyYV9wb2xhcml0eShmaW1jLCBpc3BfaW5mbyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoZmltYy0+dmlkX2NhcC5zZCwgY29yZSwgc19wb3dlciwgMSk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBlbmFibGluZyBwb3dlciBmYWlsZWQgc28gdW5yZWdpc3RlciBzdWJkZXYgKi8KLQlmaW1jX3N1YmRldl91bnJlZ2lzdGVyKGZpbWMpOwotCi0JdjRsMl9lcnIoJmZpbWMtPnZpZF9jYXAudjRsMl9kZXYsICJJU1AgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiAlZFxuIiwKLQkJIHJldCk7Ci0KKwlyZXQgPSBmaW1jX3NldF9zY2FsZXJfaW5mbyhjdHgpOworCWlmICghcmV0KSB7CisJCWZpbWNfaHdfc2V0X2lucHV0X3BhdGgoY3R4KTsKKwkJZmltY19od19zZXRfcHJlc2NhbGVyKGN0eCk7CisJCWZpbWNfaHdfc2V0X21haW5zY2FsZXIoY3R4KTsKKwkJZmltY19od19zZXRfdGFyZ2V0X2Zvcm1hdChjdHgpOworCQlmaW1jX2h3X3NldF9yb3RhdGlvbihjdHgpOworCQlmaW1jX2h3X3NldF9lZmZlY3QoY3R4LCBmYWxzZSk7CisJCWZpbWNfaHdfc2V0X291dHB1dF9wYXRoKGN0eCk7CisJCWZpbWNfaHdfc2V0X291dF9kbWEoY3R4KTsKKwkJY2xlYXJfYml0KFNUX0NBUFRfQVBQTFlfQ0ZHLCAmZmltYy0+c3RhdGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19zdG9wX2NhcHR1cmUoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQorc3RhdGljIGludCBmaW1jX2NhcHR1cmVfc3RhdGVfY2xlYW51cChzdHJ1Y3QgZmltY19kZXYgKmZpbWMsIGJvb2wgc3VzcGVuZCkKK3sKKwlzdHJ1Y3QgZmltY192aWRfY2FwICpjYXAgPSAmZmltYy0+dmlkX2NhcDsKKwlzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHN0cmVhbWluZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOworCXN0cmVhbWluZyA9IGZpbWMtPnN0YXRlICYgKDEgPDwgU1RfQ0FQVF9JU1BfU1RSRUFNKTsKKworCWZpbWMtPnN0YXRlICY9IH4oMSA8PCBTVF9DQVBUX1JVTiB8IDEgPDwgU1RfQ0FQVF9TSFVUIHwKKwkJCSAxIDw8IFNUX0NBUFRfU1RSRUFNIHwgMSA8PCBTVF9DQVBUX0lTUF9TVFJFQU0pOworCWlmICghc3VzcGVuZCkKKwkJZmltYy0+c3RhdGUgJj0gfigxIDw8IFNUX0NBUFRfUEVORCB8IDEgPDwgU1RfQ0FQVF9TVVNQRU5ERUQpOworCisJLyogUmVsZWFzZSB1bnVzZWQgYnVmZmVycyAqLworCXdoaWxlICghc3VzcGVuZCAmJiAhbGlzdF9lbXB0eSgmY2FwLT5wZW5kaW5nX2J1Zl9xKSkgeworCQlidWYgPSBmaW1jX3BlbmRpbmdfcXVldWVfcG9wKGNhcCk7CisJCXZiMl9idWZmZXJfZG9uZSgmYnVmLT52YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisJfQorCS8qIElmIHN1c3BlbmRpbmcgcHV0IHVudXNlZCBidWZmZXJzIG9udG8gcGVuZGluZyBxdWV1ZSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmY2FwLT5hY3RpdmVfYnVmX3EpKSB7CisJCWJ1ZiA9IGZpbWNfYWN0aXZlX3F1ZXVlX3BvcChjYXApOworCQlpZiAoc3VzcGVuZCkKKwkJCWZpbWNfcGVuZGluZ19xdWV1ZV9hZGQoY2FwLCBidWYpOworCQllbHNlCisJCQl2YjJfYnVmZmVyX2RvbmUoJmJ1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCX0KKwlzZXRfYml0KFNUX0NBUFRfU1VTUEVOREVELCAmZmltYy0+c3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoc3RyZWFtaW5nKQorCQlyZXR1cm4gZmltY19waXBlbGluZV9zX3N0cmVhbShmaW1jLCAwKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbWNfc3RvcF9jYXB0dXJlKHN0cnVjdCBmaW1jX2RldiAqZmltYywgYm9vbCBzdXNwZW5kKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGZpbWNfdmlkX2NhcCAqY2FwOwotCXN0cnVjdCBmaW1jX3ZpZF9idWZmZXIgKmJ1ZjsKLQotCWNhcCA9ICZmaW1jLT52aWRfY2FwOwogCiAJaWYgKCFmaW1jX2NhcHR1cmVfYWN0aXZlKGZpbWMpKQogCQlyZXR1cm4gMDsKQEAgLTE2OSw4MSArMTIwLDczIEBACiAKIAl3YWl0X2V2ZW50X3RpbWVvdXQoZmltYy0+aXJxX3F1ZXVlLAogCQkJICAgIXRlc3RfYml0KFNUX0NBUFRfU0hVVCwgJmZpbWMtPnN0YXRlKSwKLQkJCSAgIEZJTUNfU0hVVERPV05fVElNRU9VVCk7CisJCQkgICAoMipIWi8xMCkpOyAvKiAyMDAgbXMgKi8KIAotCXY0bDJfc3ViZGV2X2NhbGwoY2FwLT5zZCwgdmlkZW8sIHNfc3RyZWFtLCAwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOwotCWZpbWMtPnN0YXRlICY9IH4oMSA8PCBTVF9DQVBUX1JVTiB8IDEgPDwgU1RfQ0FQVF9QRU5EIHwKLQkJCSAxIDw8IFNUX0NBUFRfU0hVVCB8IDEgPDwgU1RfQ0FQVF9TVFJFQU0pOwotCi0JZmltYy0+dmlkX2NhcC5hY3RpdmVfYnVmX2NudCA9IDA7Ci0KLQkvKiBSZWxlYXNlIGJ1ZmZlcnMgdGhhdCB3ZXJlIGVucXVldWVkIGluIHRoZSBkcml2ZXIgYnkgdmlkZW9idWYyLiAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmY2FwLT5wZW5kaW5nX2J1Zl9xKSkgewotCQlidWYgPSBwZW5kaW5nX3F1ZXVlX3BvcChjYXApOwotCQl2YjJfYnVmZmVyX2RvbmUoJmJ1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOwotCX0KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmY2FwLT5hY3RpdmVfYnVmX3EpKSB7Ci0JCWJ1ZiA9IGFjdGl2ZV9xdWV1ZV9wb3AoY2FwKTsKLQkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOwotCi0JZGJnKCJzdGF0ZTogMHglbHgiLCBmaW1jLT5zdGF0ZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGZpbWNfY2FwdHVyZV9zdGF0ZV9jbGVhbnVwKGZpbWMsIHN1c3BlbmQpOwogfQogCi1zdGF0aWMgaW50IHN0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQorLyoqCisgKiBmaW1jX2NhcHR1cmVfY29uZmlnX3VwZGF0ZSAtIGFwcGx5IHRoZSBjYW1lcmEgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBUbyBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGludGVycnVwdCBoYW5kbGVyIHdpdGggZmltYy5zbG9jaworICogc3BpbmxvY2sgaGVsZC4gSXQgdXBkYXRlcyB0aGUgY2FtZXJhIHBpeGVsIGNyb3AsIHJvdGF0aW9uIGFuZAorICogaW1hZ2UgZmxpcCBpbiBIL1cuCisgKi8KK2ludCBmaW1jX2NhcHR1cmVfY29uZmlnX3VwZGF0ZShzdHJ1Y3QgZmltY19jdHggKmN0eCkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHEtPmRydl9wcml2OwogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7Ci0Jc3RydWN0IHM1cF9maW1jX2lzcF9pbmZvICppc3BfaW5mbzsKIAlpbnQgcmV0OwogCi0JZmltY19od19yZXNldChmaW1jKTsKKwlpZiAodGVzdF9iaXQoU1RfQ0FQVF9BUFBMWV9DRkcsICZmaW1jLT5zdGF0ZSkpCisJCXJldHVybiAwOwogCi0JcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChmaW1jLT52aWRfY2FwLnNkLCB2aWRlbywgc19zdHJlYW0sIDEpOwotCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGZpbWNfcHJlcGFyZV9jb25maWcoY3R4LCBjdHgtPnN0YXRlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaXNwX2luZm8gPSAmZmltYy0+cGRhdGEtPmlzcF9pbmZvW2ZpbWMtPnZpZF9jYXAuaW5wdXRfaW5kZXhdOwotCWZpbWNfaHdfc2V0X2NhbWVyYV90eXBlKGZpbWMsIGlzcF9pbmZvKTsKLQlmaW1jX2h3X3NldF9jYW1lcmFfc291cmNlKGZpbWMsIGlzcF9pbmZvKTsKKwlzcGluX2xvY2soJmN0eC0+c2xvY2spOwogCWZpbWNfaHdfc2V0X2NhbWVyYV9vZmZzZXQoZmltYywgJmN0eC0+c19mcmFtZSk7Ci0KLQlpZiAoY3R4LT5zdGF0ZSAmIEZJTUNfUEFSQU1TKSB7Ci0JCXJldCA9IGZpbWNfc2V0X3NjYWxlcl9pbmZvKGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCWVycigiU2NhbGVyIHNldHVwIGVycm9yIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWZpbWNfaHdfc2V0X2lucHV0X3BhdGgoY3R4KTsKKwlyZXQgPSBmaW1jX3NldF9zY2FsZXJfaW5mbyhjdHgpOworCWlmIChyZXQgPT0gMCkgewogCQlmaW1jX2h3X3NldF9wcmVzY2FsZXIoY3R4KTsKIAkJZmltY19od19zZXRfbWFpbnNjYWxlcihjdHgpOwogCQlmaW1jX2h3X3NldF90YXJnZXRfZm9ybWF0KGN0eCk7CiAJCWZpbWNfaHdfc2V0X3JvdGF0aW9uKGN0eCk7Ci0JCWZpbWNfaHdfc2V0X2VmZmVjdChjdHgpOworCQlmaW1jX3ByZXBhcmVfZG1hX29mZnNldChjdHgsICZjdHgtPmRfZnJhbWUpOworCQlmaW1jX2h3X3NldF9vdXRfZG1hKGN0eCk7CisJCXNldF9iaXQoU1RfQ0FQVF9BUFBMWV9DRkcsICZmaW1jLT5zdGF0ZSk7CiAJfQorCXNwaW5fdW5sb2NrKCZjdHgtPnNsb2NrKTsKKwlyZXR1cm4gcmV0OworfQogCi0JZmltY19od19zZXRfb3V0cHV0X3BhdGgoY3R4KTsKLQlmaW1jX2h3X3NldF9vdXRfZG1hKGN0eCk7CitzdGF0aWMgaW50IHN0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBxLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OworCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXAgPSAmZmltYy0+dmlkX2NhcDsKKwlpbnQgbWluX2J1ZnM7CisJaW50IHJldDsKIAotCUlOSVRfTElTVF9IRUFEKCZmaW1jLT52aWRfY2FwLnBlbmRpbmdfYnVmX3EpOwotCUlOSVRfTElTVF9IRUFEKCZmaW1jLT52aWRfY2FwLmFjdGl2ZV9idWZfcSk7Ci0JZmltYy0+dmlkX2NhcC5hY3RpdmVfYnVmX2NudCA9IDA7Ci0JZmltYy0+dmlkX2NhcC5mcmFtZV9jb3VudCA9IDA7Ci0JZmltYy0+dmlkX2NhcC5idWZfaW5kZXggPSAwOworCWZpbWNfaHdfcmVzZXQoZmltYyk7CisJdmlkX2NhcC0+ZnJhbWVfY291bnQgPSAwOworCisJcmV0ID0gZmltY19pbml0X2NhcHR1cmUoZmltYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKIAogCXNldF9iaXQoU1RfQ0FQVF9QRU5ELCAmZmltYy0+c3RhdGUpOwogCisJbWluX2J1ZnMgPSBmaW1jLT52aWRfY2FwLnJlcWJ1ZnNfY291bnQgPiAxID8gMiA6IDE7CisKKwlpZiAodmlkX2NhcC0+YWN0aXZlX2J1Zl9jbnQgPj0gbWluX2J1ZnMgJiYKKwkgICAgIXRlc3RfYW5kX3NldF9iaXQoU1RfQ0FQVF9TVFJFQU0sICZmaW1jLT5zdGF0ZSkpIHsKKwkJZmltY19hY3RpdmF0ZV9jYXB0dXJlKGN0eCk7CisKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNUX0NBUFRfSVNQX1NUUkVBTSwgJmZpbWMtPnN0YXRlKSkKKwkJCWZpbWNfcGlwZWxpbmVfc19zdHJlYW0oZmltYywgMSk7CisJfQorCiAJcmV0dXJuIDA7CitlcnJvcjoKKwlmaW1jX2NhcHR1cmVfc3RhdGVfY2xlYW51cChmaW1jLCBmYWxzZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQpAQCAtMjU0LDcgKzE5Nyw0NiBAQAogCWlmICghZmltY19jYXB0dXJlX2FjdGl2ZShmaW1jKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gZmltY19zdG9wX2NhcHR1cmUoZmltYyk7CisJcmV0dXJuIGZpbWNfc3RvcF9jYXB0dXJlKGZpbWMsIGZhbHNlKTsKK30KKworaW50IGZpbWNfY2FwdHVyZV9zdXNwZW5kKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwlib29sIHN1c3BlbmQgPSBmaW1jX2NhcHR1cmVfYnVzeShmaW1jKTsKKworCWludCByZXQgPSBmaW1jX3N0b3BfY2FwdHVyZShmaW1jLCBzdXNwZW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBmaW1jX3BpcGVsaW5lX3NodXRkb3duKGZpbWMpOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKTsKKworaW50IGZpbWNfY2FwdHVyZV9yZXN1bWUoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQoreworCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXAgPSAmZmltYy0+dmlkX2NhcDsKKwlzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpidWY7CisJaW50IGk7CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTVF9DQVBUX1NVU1BFTkRFRCwgJmZpbWMtPnN0YXRlKSkKKwkJcmV0dXJuIDA7CisKKwlJTklUX0xJU1RfSEVBRCgmZmltYy0+dmlkX2NhcC5hY3RpdmVfYnVmX3EpOworCXZpZF9jYXAtPmJ1Zl9pbmRleCA9IDA7CisJZmltY19waXBlbGluZV9pbml0aWFsaXplKGZpbWMsICZmaW1jLT52aWRfY2FwLnZmZC0+ZW50aXR5LAorCQkJCSBmYWxzZSk7CisJZmltY19pbml0X2NhcHR1cmUoZmltYyk7CisKKwljbGVhcl9iaXQoU1RfQ0FQVF9TVVNQRU5ERUQsICZmaW1jLT5zdGF0ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmlkX2NhcC0+cmVxYnVmc19jb3VudDsgaSsrKSB7CisJCWlmIChsaXN0X2VtcHR5KCZ2aWRfY2FwLT5wZW5kaW5nX2J1Zl9xKSkKKwkJCWJyZWFrOworCQlidWYgPSBmaW1jX3BlbmRpbmdfcXVldWVfcG9wKHZpZF9jYXApOworCQlidWZmZXJfcXVldWUoJmJ1Zi0+dmIpOworCX0KKwlyZXR1cm4gMDsKKwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGdldF9wbGFuZV9zaXplKHN0cnVjdCBmaW1jX2ZyYW1lICpmciwgdW5zaWduZWQgaW50IHBsYW5lKQpAQCAtMjY0LDkgKzI0Niw5IEBACiAJcmV0dXJuIGZyLT5mX3dpZHRoICogZnItPmZfaGVpZ2h0ICogZnItPmZtdC0+ZGVwdGhbcGxhbmVdIC8gODsKIH0KIAotc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywKLQkJICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAotCQkgICAgICAgdm9pZCAqYWxsb2NhdG9yc1tdKQorc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgIGNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCwKKwkJICAgICAgIHVuc2lnbmVkIGludCAqbnVtX2J1ZmZlcnMsIHVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywKKwkJICAgICAgIHVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY2F0b3JzW10pCiB7CiAJc3RydWN0IGZpbWNfY3R4ICpjdHggPSB2cS0+ZHJ2X3ByaXY7CiAJc3RydWN0IGZpbWNfZm10ICpmbXQgPSBjdHgtPmRfZnJhbWUuZm10OwpAQCAtMjg5LDIxICsyNzEsMjAgQEAKIHsKIAlzdHJ1Y3QgdmIyX3F1ZXVlICp2cSA9IHZiLT52YjJfcXVldWU7CiAJc3RydWN0IGZpbWNfY3R4ICpjdHggPSB2cS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9ICZjdHgtPmZpbWNfZGV2LT5tMm0udjRsMl9kZXY7CiAJaW50IGk7CiAKLQlpZiAoIWN0eC0+ZF9mcmFtZS5mbXQgfHwgdnEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKwlpZiAoY3R4LT5kX2ZyYW1lLmZtdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoaSA9IDA7IGkgPCBjdHgtPmRfZnJhbWUuZm10LT5tZW1wbGFuZXM7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIHNpemUgPSBnZXRfcGxhbmVfc2l6ZSgmY3R4LT5kX2ZyYW1lLCBpKTsKKwkJdW5zaWduZWQgbG9uZyBzaXplID0gY3R4LT5kX2ZyYW1lLnBheWxvYWRbaV07CiAKIAkJaWYgKHZiMl9wbGFuZV9zaXplKHZiLCBpKSA8IHNpemUpIHsKLQkJCXY0bDJfZXJyKHY0bDJfZGV2LCAiVXNlciBidWZmZXIgdG9vIHNtYWxsICglbGQgPCAlbGQpXG4iLAorCQkJdjRsMl9lcnIoY3R4LT5maW1jX2Rldi0+dmlkX2NhcC52ZmQsCisJCQkJICJVc2VyIGJ1ZmZlciB0b28gc21hbGwgKCVsZCA8ICVsZClcbiIsCiAJCQkJIHZiMl9wbGFuZV9zaXplKHZiLCBpKSwgc2l6ZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCiAJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgaSwgc2l6ZSk7CiAJfQogCkBAIC0zMTIsMTAgKzI5MywxMCBAQAogCiBzdGF0aWMgdm9pZCBidWZmZXJfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwogCXN0cnVjdCBmaW1jX3ZpZF9idWZmZXIgKmJ1ZgogCQk9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciwgdmIpOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwogCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXAgPSAmZmltYy0+dmlkX2NhcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBtaW5fYnVmczsKQEAgLTMyMywxNSArMzA0LDE2IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CiAJZmltY19wcmVwYXJlX2FkZHIoY3R4LCAmYnVmLT52YiwgJmN0eC0+ZF9mcmFtZSwgJmJ1Zi0+cGFkZHIpOwogCi0JaWYgKCF0ZXN0X2JpdChTVF9DQVBUX1NUUkVBTSwgJmZpbWMtPnN0YXRlKQotCSAgICAgJiYgdmlkX2NhcC0+YWN0aXZlX2J1Zl9jbnQgPCBGSU1DX01BWF9PVVRfQlVGUykgeworCWlmICghdGVzdF9iaXQoU1RfQ0FQVF9TVVNQRU5ERUQsICZmaW1jLT5zdGF0ZSkgJiYKKwkgICAgIXRlc3RfYml0KFNUX0NBUFRfU1RSRUFNLCAmZmltYy0+c3RhdGUpICYmCisJICAgIHZpZF9jYXAtPmFjdGl2ZV9idWZfY250IDwgRklNQ19NQVhfT1VUX0JVRlMpIHsKIAkJLyogU2V0dXAgdGhlIGJ1ZmZlciBkaXJlY3RseSBmb3IgcHJvY2Vzc2luZy4gKi8KIAkJaW50IGJ1Zl9pZCA9ICh2aWRfY2FwLT5yZXFidWZzX2NvdW50ID09IDEpID8gLTEgOgogCQkJCXZpZF9jYXAtPmJ1Zl9pbmRleDsKIAogCQlmaW1jX2h3X3NldF9vdXRwdXRfYWRkcihmaW1jLCAmYnVmLT5wYWRkciwgYnVmX2lkKTsKIAkJYnVmLT5pbmRleCA9IHZpZF9jYXAtPmJ1Zl9pbmRleDsKLQkJYWN0aXZlX3F1ZXVlX2FkZCh2aWRfY2FwLCBidWYpOworCQlmaW1jX2FjdGl2ZV9xdWV1ZV9hZGQodmlkX2NhcCwgYnVmKTsKIAogCQlpZiAoKyt2aWRfY2FwLT5idWZfaW5kZXggPj0gRklNQ19NQVhfT1VUX0JVRlMpCiAJCQl2aWRfY2FwLT5idWZfaW5kZXggPSAwOwpAQCAtMzQxLDEwICszMjMsMTcgQEAKIAogCW1pbl9idWZzID0gdmlkX2NhcC0+cmVxYnVmc19jb3VudCA+IDEgPyAyIDogMTsKIAotCWlmICh2aWRfY2FwLT5hY3RpdmVfYnVmX2NudCA+PSBtaW5fYnVmcyAmJgotCSAgICAhdGVzdF9hbmRfc2V0X2JpdChTVF9DQVBUX1NUUkVBTSwgJmZpbWMtPnN0YXRlKSkKLQkJZmltY19hY3RpdmF0ZV9jYXB0dXJlKGN0eCk7CiAKKwlpZiAodmIyX2lzX3N0cmVhbWluZygmdmlkX2NhcC0+dmJxKSAmJgorCSAgICB2aWRfY2FwLT5hY3RpdmVfYnVmX2NudCA+PSBtaW5fYnVmcyAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdChTVF9DQVBUX1NUUkVBTSwgJmZpbWMtPnN0YXRlKSkgeworCQlmaW1jX2FjdGl2YXRlX2NhcHR1cmUoY3R4KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoU1RfQ0FQVF9JU1BfU1RSRUFNLCAmZmltYy0+c3RhdGUpKQorCQkJZmltY19waXBlbGluZV9zX3N0cmVhbShmaW1jLCAxKTsKKwkJcmV0dXJuOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOwogfQogCkBAIC0zNzAsMTAgKzM1OSw0MCBAQAogCS5zdG9wX3N0cmVhbWluZwkJPSBzdG9wX3N0cmVhbWluZywKIH07CiAKKy8qKgorICogZmltY19jYXB0dXJlX2N0cmxzX2NyZWF0ZSAtIGluaXRpYWxpemUgdGhlIGNvbnRyb2wgaGFuZGxlcgorICogSW5pdGlhbGl6ZSB0aGUgY2FwdHVyZSB2aWRlbyBub2RlIGNvbnRyb2wgaGFuZGxlciBhbmQgZmlsbCBpdAorICogd2l0aCB0aGUgRklNQyBjb250cm9scy4gSW5oZXJpdCBhbnkgc2Vuc29yJ3MgY29udHJvbHMgaWYgdGhlCisgKiAndXNlcl9zdWJkZXZfYXBpJyBmbGFnIGlzIGZhbHNlIChkZWZhdWx0IGJlaGF2aW91cikuCisgKiBUaGlzIGZ1bmN0aW9uIG5lZWQgdG8gYmUgY2FsbGVkIHdpdGggdGhlIGdyYXBoIG11dGV4IGhlbGQuCisgKi8KK2ludCBmaW1jX2NhcHR1cmVfY3RybHNfY3JlYXRlKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwlzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwID0gJmZpbWMtPnZpZF9jYXA7CisJaW50IHJldDsKKworCWlmIChXQVJOX09OKHZpZF9jYXAtPmN0eCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAodmlkX2NhcC0+Y3R4LT5jdHJsc19yZHkpCisJCXJldHVybiAwOworCisJcmV0ID0gZmltY19jdHJsc19jcmVhdGUodmlkX2NhcC0+Y3R4KTsKKwlpZiAocmV0IHx8IHZpZF9jYXAtPnVzZXJfc3ViZGV2X2FwaSkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiB2NGwyX2N0cmxfYWRkX2hhbmRsZXIoJnZpZF9jYXAtPmN0eC0+Y3RybF9oYW5kbGVyLAorCQkJCSAgICBmaW1jLT5waXBlbGluZS5zZW5zb3ItPmN0cmxfaGFuZGxlcik7Cit9CisKK3N0YXRpYyBpbnQgZmltY19jYXB0dXJlX3NldF9kZWZhdWx0X2Zvcm1hdChzdHJ1Y3QgZmltY19kZXYgKmZpbWMpOworCiBzdGF0aWMgaW50IGZpbWNfY2FwdHVyZV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IHY0bDJfZmhfb3BlbihmaWxlKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlkYmcoInBpZDogJWQsIHN0YXRlOiAweCVseCIsIHRhc2tfcGlkX25yKGN1cnJlbnQpLCBmaW1jLT5zdGF0ZSk7CiAKQEAgLTM4MSwxNyArNDAwLDI3IEBACiAJaWYgKGZpbWNfbTJtX2FjdGl2ZShmaW1jKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCXNldF9iaXQoU1RfQ0FQVF9CVVNZLCAmZmltYy0+c3RhdGUpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmZpbWMtPnBkZXYtPmRldik7CisKIAlpZiAoKytmaW1jLT52aWRfY2FwLnJlZmNudCA9PSAxKSB7Ci0JCXJldCA9IGZpbWNfaXNwX3N1YmRldl9pbml0KGZpbWMsIDApOwotCQlpZiAocmV0KSB7CisJCXJldCA9IGZpbWNfcGlwZWxpbmVfaW5pdGlhbGl6ZShmaW1jLAorCQkJICAgICAgICZmaW1jLT52aWRfY2FwLnZmZC0+ZW50aXR5LCB0cnVlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmZpbWMtPnBkZXYtPmRldiwKKwkJCQkiVmlkZW8gcGlwZWxpbmUgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJCXBtX3J1bnRpbWVfcHV0X3N5bmMoJmZpbWMtPnBkZXYtPmRldik7CiAJCQlmaW1jLT52aWRfY2FwLnJlZmNudC0tOwotCQkJcmV0dXJuIC1FSU87CisJCQl2NGwyX2ZoX3JlbGVhc2UoZmlsZSk7CisJCQljbGVhcl9iaXQoU1RfQ0FQVF9CVVNZLCAmZmltYy0+c3RhdGUpOworCQkJcmV0dXJuIHJldDsKIAkJfQorCQlyZXQgPSBmaW1jX2NhcHR1cmVfY3RybHNfY3JlYXRlKGZpbWMpOworCisJCWlmICghcmV0ICYmICFmaW1jLT52aWRfY2FwLnVzZXJfc3ViZGV2X2FwaSkKKwkJCXJldCA9IGZpbWNfY2FwdHVyZV9zZXRfZGVmYXVsdF9mb3JtYXQoZmltYyk7CiAJfQotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmltYy0+dmlkX2NhcC5jdHg7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGZpbWNfY2FwdHVyZV9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTQwMSwzNyArNDMwLDM2IEBACiAJZGJnKCJwaWQ6ICVkLCBzdGF0ZTogMHglbHgiLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgZmltYy0+c3RhdGUpOwogCiAJaWYgKC0tZmltYy0+dmlkX2NhcC5yZWZjbnQgPT0gMCkgewotCQlmaW1jX3N0b3BfY2FwdHVyZShmaW1jKTsKLQkJdmIyX3F1ZXVlX3JlbGVhc2UoJmZpbWMtPnZpZF9jYXAudmJxKTsKLQotCQl2NGwyX2VycigmZmltYy0+dmlkX2NhcC52NGwyX2RldiwgInJlbGVhc2luZyBJU1BcbiIpOwotCi0JCXY0bDJfc3ViZGV2X2NhbGwoZmltYy0+dmlkX2NhcC5zZCwgY29yZSwgc19wb3dlciwgMCk7Ci0JCWNsa19kaXNhYmxlKGZpbWMtPmNsb2NrW0NMS19DQU1dKTsKLQkJZmltY19zdWJkZXZfdW5yZWdpc3RlcihmaW1jKTsKKwkJY2xlYXJfYml0KFNUX0NBUFRfQlVTWSwgJmZpbWMtPnN0YXRlKTsKKwkJZmltY19zdG9wX2NhcHR1cmUoZmltYywgZmFsc2UpOworCQlmaW1jX3BpcGVsaW5lX3NodXRkb3duKGZpbWMpOworCQljbGVhcl9iaXQoU1RfQ0FQVF9TVVNQRU5ERUQsICZmaW1jLT5zdGF0ZSk7CiAJfQogCi0JcmV0dXJuIDA7CisJcG1fcnVudGltZV9wdXQoJmZpbWMtPnBkZXYtPmRldik7CisKKwlpZiAoZmltYy0+dmlkX2NhcC5yZWZjbnQgPT0gMCkgeworCQl2YjJfcXVldWVfcmVsZWFzZSgmZmltYy0+dmlkX2NhcC52YnEpOworCQlmaW1jX2N0cmxzX2RlbGV0ZShmaW1jLT52aWRfY2FwLmN0eCk7CisJfQorCXJldHVybiB2NGwyX2ZoX3JlbGVhc2UoZmlsZSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmltY19jYXB0dXJlX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXJldHVybiB2YjJfcG9sbCgmZmltYy0+dmlkX2NhcC52YnEsIGZpbGUsIHdhaXQpOwogfQogCiBzdGF0aWMgaW50IGZpbWNfY2FwdHVyZV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlyZXR1cm4gdmIyX21tYXAoJmZpbWMtPnZpZF9jYXAudmJxLCB2bWEpOwogfQogCi0vKiB2aWRlbyBkZXZpY2UgZmlsZSBvcGVyYXRpb25zICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGZpbWNfY2FwdHVyZV9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBmaW1jX2NhcHR1cmVfb3BlbiwKQEAgLTQ0MSwyNjMgKzQ2OSw1NTMgQEAKIAkubW1hcAkJPSBmaW1jX2NhcHR1cmVfbW1hcCwKIH07CiAKKy8qCisgKiBGb3JtYXQgYW5kIGNyb3AgbmVnb3RpYXRpb24gaGVscGVycworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmltY19mbXQgKmZpbWNfY2FwdHVyZV90cnlfZm9ybWF0KHN0cnVjdCBmaW1jX2N0eCAqY3R4LAorCQkJCQkJdTMyICp3aWR0aCwgdTMyICpoZWlnaHQsCisJCQkJCQl1MzIgKmNvZGUsIHUzMiAqZm91cmNjLCBpbnQgcGFkKQoreworCWJvb2wgcm90YXRpb24gPSBjdHgtPnJvdGF0aW9uID09IDkwIHx8IGN0eC0+cm90YXRpb24gPT0gMjcwOworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CisJc3RydWN0IHNhbXN1bmdfZmltY192YXJpYW50ICp2YXIgPSBmaW1jLT52YXJpYW50OworCXN0cnVjdCBmaW1jX3BpeF9saW1pdCAqcGwgPSB2YXItPnBpeF9saW1pdDsKKwlzdHJ1Y3QgZmltY19mcmFtZSAqZHN0ID0gJmN0eC0+ZF9mcmFtZTsKKwl1MzIgZGVwdGgsIG1pbl93LCBtYXhfdywgbWluX2gsIGFsaWduX2ggPSAzOworCXUzMiBtYXNrID0gRk1UX0ZMQUdTX0NBTTsKKwlzdHJ1Y3QgZmltY19mbXQgKmZmbXQ7CisKKwkvKiBDb2xvciBjb252ZXJzaW9uIGZyb20vdG8gSlBFRyBpcyBub3Qgc3VwcG9ydGVkICovCisJaWYgKGNvZGUgJiYgY3R4LT5zX2ZyYW1lLmZtdCAmJiBwYWQgPT0gRklNQ19TRF9QQURfU09VUkNFICYmCisJICAgIGZpbWNfZm10X2lzX2pwZWcoY3R4LT5zX2ZyYW1lLmZtdC0+Y29sb3IpKQorCQkqY29kZSA9IFY0TDJfTUJVU19GTVRfSlBFR18xWDg7CisKKwlpZiAoZm91cmNjICYmICpmb3VyY2MgIT0gVjRMMl9QSVhfRk1UX0pQRUcgJiYgcGFkICE9IEZJTUNfU0RfUEFEX1NJTkspCisJCW1hc2sgfD0gRk1UX0ZMQUdTX00yTTsKKworCWZmbXQgPSBmaW1jX2ZpbmRfZm9ybWF0KGZvdXJjYywgY29kZSwgbWFzaywgMCk7CisJaWYgKFdBUk5fT04oIWZmbXQpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoY29kZSkKKwkJKmNvZGUgPSBmZm10LT5tYnVzX2NvZGU7CisJaWYgKGZvdXJjYykKKwkJKmZvdXJjYyA9IGZmbXQtPmZvdXJjYzsKKworCWlmIChwYWQgPT0gRklNQ19TRF9QQURfU0lOSykgeworCQltYXhfdyA9IGZpbWNfZm10X2lzX2pwZWcoZmZtdC0+Y29sb3IpID8KKwkJCXBsLT5zY2FsZXJfZGlzX3cgOiBwbC0+c2NhbGVyX2VuX3c7CisJCS8qIEFwcGx5IHRoZSBjYW1lcmEgaW5wdXQgaW50ZXJmYWNlIHBpeGVsIGNvbnN0cmFpbnRzICovCisJCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSh3aWR0aCwgbWF4X3QodTMyLCAqd2lkdGgsIDMyKSwgbWF4X3csIDQsCisJCQkJICAgICAgaGVpZ2h0LCBtYXhfdCh1MzIsICpoZWlnaHQsIDMyKSwKKwkJCQkgICAgICBGSU1DX0NBTUlGX01BWF9IRUlHSFQsCisJCQkJICAgICAgZmltY19mbXRfaXNfanBlZyhmZm10LT5jb2xvcikgPyAzIDogMSwKKwkJCQkgICAgICAwKTsKKwkJcmV0dXJuIGZmbXQ7CisJfQorCS8qIENhbid0IHNjYWxlIG9yIGNyb3AgaW4gdHJhbnNwYXJlbnQgKEpQRUcpIHRyYW5zZmVyIG1vZGUgKi8KKwlpZiAoZmltY19mbXRfaXNfanBlZyhmZm10LT5jb2xvcikpIHsKKwkJKndpZHRoICA9IGN0eC0+c19mcmFtZS5mX3dpZHRoOworCQkqaGVpZ2h0ID0gY3R4LT5zX2ZyYW1lLmZfaGVpZ2h0OworCQlyZXR1cm4gZmZtdDsKKwl9CisJLyogQXBwbHkgdGhlIHNjYWxlciBhbmQgdGhlIG91dHB1dCBETUEgY29uc3RyYWludHMgKi8KKwltYXhfdyA9IHJvdGF0aW9uID8gcGwtPm91dF9yb3RfZW5fdyA6IHBsLT5vdXRfcm90X2Rpc193OworCW1pbl93ID0gY3R4LT5zdGF0ZSAmIEZJTUNfRFNUX0NST1AgPyBkc3QtPndpZHRoIDogdmFyLT5taW5fb3V0X3BpeHNpemU7CisJbWluX2ggPSBjdHgtPnN0YXRlICYgRklNQ19EU1RfQ1JPUCA/IGRzdC0+aGVpZ2h0IDogdmFyLT5taW5fb3V0X3BpeHNpemU7CisJaWYgKGZpbWMtPmlkID09IDEgJiYgdmFyLT5waXhfaG9mZikKKwkJYWxpZ25faCA9IGZpbWNfZm10X2lzX3JnYihmZm10LT5jb2xvcikgPyAwIDogMTsKKworCWRlcHRoID0gZmltY19nZXRfZm9ybWF0X2RlcHRoKGZmbXQpOworCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSh3aWR0aCwgbWluX3csIG1heF93LAorCQkJICAgICAgZmZzKHZhci0+bWluX291dF9waXhzaXplKSAtIDEsCisJCQkgICAgICBoZWlnaHQsIG1pbl9oLCBGSU1DX0NBTUlGX01BWF9IRUlHSFQsCisJCQkgICAgICBhbGlnbl9oLAorCQkJICAgICAgNjQvKEFMSUdOKGRlcHRoLCA4KSkpOworCisJZGJnKCJwYWQlZDogY29kZTogMHgleCwgJWR4JWQuIGRzdCBmbXQ6ICVkeCVkIiwKKwkgICAgcGFkLCBjb2RlID8gKmNvZGUgOiAwLCAqd2lkdGgsICpoZWlnaHQsCisJICAgIGRzdC0+Zl93aWR0aCwgZHN0LT5mX2hlaWdodCk7CisKKwlyZXR1cm4gZmZtdDsKK30KKworc3RhdGljIHZvaWQgZmltY19jYXB0dXJlX3RyeV9jcm9wKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBzdHJ1Y3QgdjRsMl9yZWN0ICpyLAorCQkJCSAgaW50IHBhZCkKK3sKKwlib29sIHJvdGF0ZSA9IGN0eC0+cm90YXRpb24gPT0gOTAgfHwgY3R4LT5yb3RhdGlvbiA9PSAyNzA7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKKwlzdHJ1Y3Qgc2Ftc3VuZ19maW1jX3ZhcmlhbnQgKnZhciA9IGZpbWMtPnZhcmlhbnQ7CisJc3RydWN0IGZpbWNfcGl4X2xpbWl0ICpwbCA9IHZhci0+cGl4X2xpbWl0OworCXN0cnVjdCBmaW1jX2ZyYW1lICpzaW5rID0gJmN0eC0+c19mcmFtZTsKKwl1MzIgbWF4X3csIG1heF9oLCBtaW5fdyA9IDAsIG1pbl9oID0gMCwgbWluX3N6OworCXUzMiBhbGlnbl9zeiA9IDAsIGFsaWduX2ggPSA0OworCXUzMiBtYXhfc2NfaCwgbWF4X3NjX3Y7CisKKwkvKiBJbiBKUEVHIHRyYW5zcGFyZW50IHRyYW5zZmVyIG1vZGUgY3JvcHBpbmcgaXMgbm90IHN1cHBvcnRlZCAqLworCWlmIChmaW1jX2ZtdF9pc19qcGVnKGN0eC0+ZF9mcmFtZS5mbXQtPmNvbG9yKSkgeworCQlyLT53aWR0aCAgPSBzaW5rLT5mX3dpZHRoOworCQlyLT5oZWlnaHQgPSBzaW5rLT5mX2hlaWdodDsKKwkJci0+bGVmdCAgID0gci0+dG9wID0gMDsKKwkJcmV0dXJuOworCX0KKwlpZiAocGFkID09IEZJTUNfU0RfUEFEX1NPVVJDRSkgeworCQlpZiAoY3R4LT5yb3RhdGlvbiAhPSA5MCAmJiBjdHgtPnJvdGF0aW9uICE9IDI3MCkKKwkJCWFsaWduX2ggPSAxOworCQltYXhfc2NfaCA9IG1pbihTQ0FMRVJfTUFYX0hSQVRJTywgMSA8PCAoZmZzKHNpbmstPndpZHRoKSAtIDMpKTsKKwkJbWF4X3NjX3YgPSBtaW4oU0NBTEVSX01BWF9WUkFUSU8sIDEgPDwgKGZmcyhzaW5rLT5oZWlnaHQpIC0gMSkpOworCQltaW5fc3ogPSB2YXItPm1pbl9vdXRfcGl4c2l6ZTsKKwl9IGVsc2UgeworCQl1MzIgZGVwdGggPSBmaW1jX2dldF9mb3JtYXRfZGVwdGgoc2luay0+Zm10KTsKKwkJYWxpZ25fc3ogPSA2NC9BTElHTihkZXB0aCwgOCk7CisJCW1pbl9zeiA9IHZhci0+bWluX2lucF9waXhzaXplOworCQltaW5fdyA9IG1pbl9oID0gbWluX3N6OworCQltYXhfc2NfaCA9IG1heF9zY192ID0gMTsKKwl9CisJLyoKKwkgKiBGb3IgdGhlIGNyb3AgcmVjdGFuZ2xlIGF0IHNvdXJjZSBwYWQgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50cworCSAqIG11c3QgYmUgbWV0OgorCSAqIC0gaXQgbXVzdCBmaXQgaW4gdGhlIHNpbmsgcGFkIGZvcm1hdCByZWN0YW5nbGUgKGZfd2lkdGgvZl9oZWlnaHQpOworCSAqIC0gbWF4aW11bSBkb3duc2NhbGluZyByYXRpbyBpcyA2NDsKKwkgKiAtIG1heGltdW0gY3JvcCBzaXplIGRlcGVuZHMgaWYgdGhlIHJvdGF0b3IgaXMgdXNlZCBvciBub3Q7CisJICogLSB0aGUgc2luayBwYWQgZm9ybWF0IHdpZHRoL2hlaWdodCBtdXN0IGJlIDQgbXVsdGlwbGUgb2YgdGhlCisJICogICBwcmVzY2FsZXIgcmF0aW9zIGRldGVybWluZWQgYnkgc2luayBwYWQgc2l6ZSBhbmQgc291cmNlIHBhZCBjcm9wLAorCSAqICAgdGhlIHByZXNjYWxlciByYXRpbyBpcyByZXR1cm5lZCBieSBmaW1jX2dldF9zY2FsZXJfZmFjdG9yKCkuCisJICovCisJbWF4X3cgPSBtaW5fdCh1MzIsCisJCSAgICAgIHJvdGF0ZSA/IHBsLT5vdXRfcm90X2VuX3cgOiBwbC0+b3V0X3JvdF9kaXNfdywKKwkJICAgICAgcm90YXRlID8gc2luay0+Zl9oZWlnaHQgOiBzaW5rLT5mX3dpZHRoKTsKKwltYXhfaCA9IG1pbl90KHUzMiwgRklNQ19DQU1JRl9NQVhfSEVJR0hULCBzaW5rLT5mX2hlaWdodCk7CisJaWYgKHBhZCA9PSBGSU1DX1NEX1BBRF9TT1VSQ0UpIHsKKwkJbWluX3cgPSBtaW5fdCh1MzIsIG1heF93LCBzaW5rLT5mX3dpZHRoIC8gbWF4X3NjX2gpOworCQltaW5faCA9IG1pbl90KHUzMiwgbWF4X2gsIHNpbmstPmZfaGVpZ2h0IC8gbWF4X3NjX3YpOworCQlpZiAocm90YXRlKSB7CisJCQlzd2FwKG1heF9zY19oLCBtYXhfc2Nfdik7CisJCQlzd2FwKG1pbl93LCBtaW5faCk7CisJCX0KKwl9CisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZyLT53aWR0aCwgbWluX3csIG1heF93LCBmZnMobWluX3N6KSAtIDEsCisJCQkgICAgICAmci0+aGVpZ2h0LCBtaW5faCwgbWF4X2gsIGFsaWduX2gsCisJCQkgICAgICBhbGlnbl9zeik7CisJLyogQWRqdXN0IGxlZnQvdG9wIGlmIGNyb3BwaW5nIHJlY3RhbmdsZSBpcyBvdXQgb2YgYm91bmRzICovCisJci0+bGVmdCA9IGNsYW1wX3QodTMyLCByLT5sZWZ0LCAwLCBzaW5rLT5mX3dpZHRoIC0gci0+d2lkdGgpOworCXItPnRvcCAgPSBjbGFtcF90KHUzMiwgci0+dG9wLCAwLCBzaW5rLT5mX2hlaWdodCAtIHItPmhlaWdodCk7CisJci0+bGVmdCA9IHJvdW5kX2Rvd24oci0+bGVmdCwgdmFyLT5ob3Jfb2Zmc19hbGlnbik7CisKKwlkYmcoInBhZCVkOiAoJWQsJWQpLyVkeCVkLCBzaW5rIGZtdDogJWR4JWQiLAorCSAgICBwYWQsIHItPmxlZnQsIHItPnRvcCwgci0+d2lkdGgsIHItPmhlaWdodCwKKwkgICAgc2luay0+Zl93aWR0aCwgc2luay0+Zl9oZWlnaHQpOworfQorCisvKgorICogVGhlIHZpZGVvIG5vZGUgaW9jdGwgb3BlcmF0aW9ucworICovCiBzdGF0aWMgaW50IGZpbWNfdmlkaW9jX3F1ZXJ5Y2FwX2NhcHR1cmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlzdHJuY3B5KGNhcC0+ZHJpdmVyLCBmaW1jLT5wZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5kcml2ZXIpIC0gMSk7CiAJc3RybmNweShjYXAtPmNhcmQsIGZpbWMtPnBkZXYtPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpIC0gMSk7CiAJY2FwLT5idXNfaW5mb1swXSA9IDA7Ci0JY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9TVFJFQU1JTkcgfCBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKLQkJCSAgICBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORTsKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1NUUkVBTUlORyB8IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qIFN5bmNocm9uaXplIGZvcm1hdHMgb2YgdGhlIGNhbWVyYSBpbnRlcmZhY2UgaW5wdXQgYW5kIGF0dGFjaGVkICBzZW5zb3IuICovCi1zdGF0aWMgaW50IHN5bmNfY2FwdHVyZV9mbXQoc3RydWN0IGZpbWNfY3R4ICpjdHgpCitzdGF0aWMgaW50IGZpbWNfY2FwX2VudW1fZm10X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKIHsKLQlzdHJ1Y3QgZmltY19mcmFtZSAqZnJhbWUgPSAmY3R4LT5zX2ZyYW1lOwotCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7Ci0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10ID0gJmZpbWMtPnZpZF9jYXAuZm10OwotCWludCByZXQ7CisJc3RydWN0IGZpbWNfZm10ICpmbXQ7CiAKLQlmbXQtPndpZHRoICA9IGN0eC0+ZF9mcmFtZS5vX3dpZHRoOwotCWZtdC0+aGVpZ2h0ID0gY3R4LT5kX2ZyYW1lLm9faGVpZ2h0OwotCi0JcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChmaW1jLT52aWRfY2FwLnNkLCB2aWRlbywgc19tYnVzX2ZtdCwgZm10KTsKLQlpZiAocmV0ID09IC1FTk9JT0NUTENNRCkgewotCQllcnIoInNfbWJ1c19mbXQgZmFpbGVkIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWRiZygidzogJWQsIGg6ICVkLCBjb2RlPSAlZCIsIGZtdC0+d2lkdGgsIGZtdC0+aGVpZ2h0LCBmbXQtPmNvZGUpOwotCi0JZnJhbWUtPmZtdCA9IGZpbmRfbWJ1c19mb3JtYXQoZm10LCBGTVRfRkxBR1NfQ0FNKTsKLQlpZiAoIWZyYW1lLT5mbXQpIHsKLQkJZXJyKCJmaW1jIHNvdXJjZSBmb3JtYXQgbm90IGZvdW5kXG4iKTsKKwlmbXQgPSBmaW1jX2ZpbmRfZm9ybWF0KE5VTEwsIE5VTEwsIEZNVF9GTEFHU19DQU0gfCBGTVRfRkxBR1NfTTJNLAorCQkJICAgICAgIGYtPmluZGV4KTsKKwlpZiAoIWZtdCkKIAkJcmV0dXJuIC1FSU5WQUw7CisJc3RybmNweShmLT5kZXNjcmlwdGlvbiwgZm10LT5uYW1lLCBzaXplb2YoZi0+ZGVzY3JpcHRpb24pIC0gMSk7CisJZi0+cGl4ZWxmb3JtYXQgPSBmbXQtPmZvdXJjYzsKKwlpZiAoZm10LT5mb3VyY2MgPT0gVjRMMl9NQlVTX0ZNVF9KUEVHXzFYOCkKKwkJZi0+ZmxhZ3MgfD0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpbWNfcGlwZWxpbmVfdHJ5X2Zvcm1hdCAtIG5lZ290aWF0ZSBhbmQvb3Igc2V0IGZvcm1hdHMgYXQgcGlwZWxpbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzCisgKiBAY3R4OiBGSU1DIGNhcHR1cmUgY29udGV4dAorICogQHRmbXQ6IG1lZGlhIGJ1cyBmb3JtYXQgdG8gdHJ5L3NldCBvbiBzdWJkZXZzCisgKiBAZm10X2lkOiBmaW1jIHBpeGVsIGZvcm1hdCBpZCBjb3JyZXNwb25kaW5nIHRvIHJldHVybmVkIEB0Zm10IChvdXRwdXQpCisgKiBAc2V0OiB0cnVlIHRvIHNldCBmb3JtYXQgb24gc3ViZGV2cywgZmFsc2UgdG8gdHJ5IG9ubHkKKyAqLworc3RhdGljIGludCBmaW1jX3BpcGVsaW5lX3RyeV9mb3JtYXQoc3RydWN0IGZpbWNfY3R4ICpjdHgsCisJCQkJICAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKnRmbXQsCisJCQkJICAgIHN0cnVjdCBmaW1jX2ZtdCAqKmZtdF9pZCwKKwkJCQkgICAgYm9vbCBzZXQpCit7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZmltYy0+cGlwZWxpbmUuc2Vuc29yOworCXN0cnVjdCB2NGwyX3N1YmRldiAqY3NpcyA9IGZpbWMtPnBpcGVsaW5lLmNzaXM7CisJc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCBzZm10OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mID0gJnNmbXQuZm9ybWF0OworCXN0cnVjdCBmaW1jX2ZtdCAqZmZtdCA9IE5VTEw7CisJaW50IHJldCwgaSA9IDA7CisKKwlpZiAoV0FSTl9PTighc2QgfHwgIXRmbXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmc2ZtdCwgMCwgc2l6ZW9mKHNmbXQpKTsKKwlzZm10LmZvcm1hdCA9ICp0Zm10OworCisJc2ZtdC53aGljaCA9IHNldCA/IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkUgOiBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZOworCXdoaWxlICgxKSB7CisJCWZmbXQgPSBmaW1jX2ZpbmRfZm9ybWF0KE5VTEwsIG1mLT5jb2RlICE9IDAgPyAmbWYtPmNvZGUgOiBOVUxMLAorCQkJCQlGTVRfRkxBR1NfQ0FNLCBpKyspOworCQlpZiAoZmZtdCA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogTm90aWZ5IHVzZXItc3BhY2UgaWYgY29tbW9uIHBpeGVsIGNvZGUgZm9yCisJCQkgKiBob3N0IGFuZCBzZW5zb3IgZG9lcyBub3QgZXhpc3QuCisJCQkgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1mLT5jb2RlID0gdGZtdC0+Y29kZSA9IGZmbXQtPm1idXNfY29kZTsKKworCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBwYWQsIHNldF9mbXQsIE5VTEwsICZzZm10KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChtZi0+Y29kZSAhPSB0Zm10LT5jb2RlKSB7CisJCQltZi0+Y29kZSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWYtPndpZHRoICE9IHRmbXQtPndpZHRoIHx8IG1mLT53aWR0aCAhPSB0Zm10LT53aWR0aCkgeworCQkJdTMyIGZjYyA9IGZmbXQtPmZvdXJjYzsKKwkJCXRmbXQtPndpZHRoICA9IG1mLT53aWR0aDsKKwkJCXRmbXQtPmhlaWdodCA9IG1mLT5oZWlnaHQ7CisJCQlmZm10ID0gZmltY19jYXB0dXJlX3RyeV9mb3JtYXQoY3R4LAorCQkJCQkgICAgICAgJnRmbXQtPndpZHRoLCAmdGZtdC0+aGVpZ2h0LAorCQkJCQkgICAgICAgTlVMTCwgJmZjYywgRklNQ19TRF9QQURfU09VUkNFKTsKKwkJCWlmIChmZm10ICYmIGZmbXQtPm1idXNfY29kZSkKKwkJCQltZi0+Y29kZSA9IGZmbXQtPm1idXNfY29kZTsKKwkJCWlmIChtZi0+d2lkdGggIT0gdGZtdC0+d2lkdGggfHwgbWYtPndpZHRoICE9IHRmbXQtPndpZHRoKQorCQkJCWNvbnRpbnVlOworCQkJdGZtdC0+Y29kZSA9IG1mLT5jb2RlOworCQl9CisJCWlmIChjc2lzKQorCQkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChjc2lzLCBwYWQsIHNldF9mbXQsIE5VTEwsICZzZm10KTsKKworCQlpZiAobWYtPmNvZGUgPT0gdGZtdC0+Y29kZSAmJgorCQkgICAgbWYtPndpZHRoID09IHRmbXQtPndpZHRoICYmIG1mLT53aWR0aCA9PSB0Zm10LT53aWR0aCkKKwkJCWJyZWFrOwogCX0KIAotCWZyYW1lLT5mX3dpZHRoCT0gZm10LT53aWR0aDsKLQlmcmFtZS0+Zl9oZWlnaHQgPSBmbXQtPmhlaWdodDsKLQlmcmFtZS0+d2lkdGgJPSBmbXQtPndpZHRoOwotCWZyYW1lLT5oZWlnaHQJPSBmbXQtPmhlaWdodDsKLQlmcmFtZS0+b193aWR0aAk9IGZtdC0+d2lkdGg7Ci0JZnJhbWUtPm9faGVpZ2h0ID0gZm10LT5oZWlnaHQ7Ci0JZnJhbWUtPm9mZnNfaAk9IDA7Ci0JZnJhbWUtPm9mZnNfdgk9IDA7CisJaWYgKGZtdF9pZCAmJiBmZm10KQorCQkqZm10X2lkID0gZmZtdDsKKwkqdGZtdCA9ICptZjsKIAorCWRiZygiY29kZTogMHgleCwgJWR4JWQsICVwIiwgbWYtPmNvZGUsIG1mLT53aWR0aCwgbWYtPmhlaWdodCwgZmZtdCk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZmltY19jYXBfZ19mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaW1jLT52aWRfY2FwLmN0eDsKKworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGZpbWNfZmlsbF9mb3JtYXQoJmN0eC0+ZF9mcmFtZSwgZik7Cit9CisKK3N0YXRpYyBpbnQgZmltY19jYXBfdHJ5X2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCSAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4ID0gJmYtPmZtdC5waXhfbXA7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbWMtPnZpZF9jYXAuY3R4OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWY7CisJc3RydWN0IGZpbWNfZm10ICpmZm10ID0gTlVMTDsKKworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0pQRUcpIHsKKwkJZmltY19jYXB0dXJlX3RyeV9mb3JtYXQoY3R4LCAmcGl4LT53aWR0aCwgJnBpeC0+aGVpZ2h0LAorCQkJCQlOVUxMLCAmcGl4LT5waXhlbGZvcm1hdCwKKwkJCQkJRklNQ19TRF9QQURfU0lOSyk7CisJCWN0eC0+c19mcmFtZS5mX3dpZHRoICA9IHBpeC0+d2lkdGg7CisJCWN0eC0+c19mcmFtZS5mX2hlaWdodCA9IHBpeC0+aGVpZ2h0OworCX0KKwlmZm10ID0gZmltY19jYXB0dXJlX3RyeV9mb3JtYXQoY3R4LCAmcGl4LT53aWR0aCwgJnBpeC0+aGVpZ2h0LAorCQkJCSAgICAgICBOVUxMLCAmcGl4LT5waXhlbGZvcm1hdCwKKwkJCQkgICAgICAgRklNQ19TRF9QQURfU09VUkNFKTsKKwlpZiAoIWZmbXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFmaW1jLT52aWRfY2FwLnVzZXJfc3ViZGV2X2FwaSkgeworCQltZi53aWR0aCAgPSBwaXgtPndpZHRoOworCQltZi5oZWlnaHQgPSBwaXgtPmhlaWdodDsKKwkJbWYuY29kZSAgID0gZmZtdC0+bWJ1c19jb2RlOworCQlmaW1jX21kX2dyYXBoX2xvY2soZmltYyk7CisJCWZpbWNfcGlwZWxpbmVfdHJ5X2Zvcm1hdChjdHgsICZtZiwgJmZmbXQsIGZhbHNlKTsKKwkJZmltY19tZF9ncmFwaF91bmxvY2soZmltYyk7CisKKwkJcGl4LT53aWR0aAkgPSBtZi53aWR0aDsKKwkJcGl4LT5oZWlnaHQJID0gbWYuaGVpZ2h0OworCQlpZiAoZmZtdCkKKwkJCXBpeC0+cGl4ZWxmb3JtYXQgPSBmZm10LT5mb3VyY2M7CisJfQorCisJZmltY19hZGp1c3RfbXBsYW5lX2Zvcm1hdChmZm10LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCwgcGl4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmltY19jYXB0dXJlX21hcmtfanBlZ194ZmVyKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBib29sIGpwZWcpCit7CisJY3R4LT5zY2FsZXIuZW5hYmxlZCA9ICFqcGVnOworCWZpbWNfY3RybHNfYWN0aXZhdGUoY3R4LCAhanBlZyk7CisKKwlpZiAoanBlZykKKwkJc2V0X2JpdChTVF9DQVBUX0pQRUcsICZjdHgtPmZpbWNfZGV2LT5zdGF0ZSk7CisJZWxzZQorCQljbGVhcl9iaXQoU1RfQ0FQVF9KUEVHLCAmY3R4LT5maW1jX2Rldi0+c3RhdGUpOworfQorCitzdGF0aWMgaW50IGZpbWNfY2FwdHVyZV9zZXRfZm9ybWF0KHN0cnVjdCBmaW1jX2RldiAqZmltYywgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmltYy0+dmlkX2NhcC5jdHg7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeCA9ICZmLT5mbXQucGl4X21wOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mID0gJmZpbWMtPnZpZF9jYXAubWY7CisJc3RydWN0IGZpbWNfZnJhbWUgKmZmID0gJmN0eC0+ZF9mcmFtZTsKKwlzdHJ1Y3QgZmltY19mbXQgKnNfZm10ID0gTlVMTDsKKwlpbnQgcmV0LCBpOworCisJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZiMl9pc19idXN5KCZmaW1jLT52aWRfY2FwLnZicSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBQcmUtY29uZmlndXJlIGZvcm1hdCBhdCBjYW1lcmEgaW50ZXJmYWNlIGlucHV0LCBmb3IgSlBFRyBvbmx5ICovCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0pQRUcpIHsKKwkJZmltY19jYXB0dXJlX3RyeV9mb3JtYXQoY3R4LCAmcGl4LT53aWR0aCwgJnBpeC0+aGVpZ2h0LAorCQkJCQlOVUxMLCAmcGl4LT5waXhlbGZvcm1hdCwKKwkJCQkJRklNQ19TRF9QQURfU0lOSyk7CisJCWN0eC0+c19mcmFtZS5mX3dpZHRoICA9IHBpeC0+d2lkdGg7CisJCWN0eC0+c19mcmFtZS5mX2hlaWdodCA9IHBpeC0+aGVpZ2h0OworCX0KKwkvKiBUcnkgdGhlIGZvcm1hdCBhdCB0aGUgc2NhbGVyIGFuZCB0aGUgRE1BIG91dHB1dCAqLworCWZmLT5mbXQgPSBmaW1jX2NhcHR1cmVfdHJ5X2Zvcm1hdChjdHgsICZwaXgtPndpZHRoLCAmcGl4LT5oZWlnaHQsCisJCQkJCSAgTlVMTCwgJnBpeC0+cGl4ZWxmb3JtYXQsCisJCQkJCSAgRklNQ19TRF9QQURfU09VUkNFKTsKKwlpZiAoIWZmLT5mbXQpCisJCXJldHVybiAtRUlOVkFMOworCS8qIFRyeSB0byBtYXRjaCBmb3JtYXQgYXQgdGhlIGhvc3QgYW5kIHRoZSBzZW5zb3IgKi8KKwlpZiAoIWZpbWMtPnZpZF9jYXAudXNlcl9zdWJkZXZfYXBpKSB7CisJCW1mLT5jb2RlICAgPSBmZi0+Zm10LT5tYnVzX2NvZGU7CisJCW1mLT53aWR0aCAgPSBwaXgtPndpZHRoOworCQltZi0+aGVpZ2h0ID0gcGl4LT5oZWlnaHQ7CisKKwkJZmltY19tZF9ncmFwaF9sb2NrKGZpbWMpOworCQlyZXQgPSBmaW1jX3BpcGVsaW5lX3RyeV9mb3JtYXQoY3R4LCBtZiwgJnNfZm10LCB0cnVlKTsKKwkJZmltY19tZF9ncmFwaF91bmxvY2soZmltYyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlwaXgtPndpZHRoICA9IG1mLT53aWR0aDsKKwkJcGl4LT5oZWlnaHQgPSBtZi0+aGVpZ2h0OworCX0KKwlmaW1jX2FkanVzdF9tcGxhbmVfZm9ybWF0KGZmLT5mbXQsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0LCBwaXgpOworCWZvciAoaSA9IDA7IGkgPCBmZi0+Zm10LT5jb2xwbGFuZXM7IGkrKykKKwkJZmYtPnBheWxvYWRbaV0gPQorCQkJKHBpeC0+d2lkdGggKiBwaXgtPmhlaWdodCAqIGZmLT5mbXQtPmRlcHRoW2ldKSAvIDg7CisKKwlzZXRfZnJhbWVfYm91bmRzKGZmLCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CisJLyogUmVzZXQgdGhlIGNvbXBvc2l0aW9uIHJlY3RhbmdsZSBpZiBub3QgeWV0IGNvbmZpZ3VyZWQgKi8KKwlpZiAoIShjdHgtPnN0YXRlICYgRklNQ19EU1RfQ1JPUCkpCisJCXNldF9mcmFtZV9jcm9wKGZmLCAwLCAwLCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CisKKwlmaW1jX2NhcHR1cmVfbWFya19qcGVnX3hmZXIoY3R4LCBmaW1jX2ZtdF9pc19qcGVnKGZmLT5mbXQtPmNvbG9yKSk7CisKKwkvKiBSZXNldCBjcm9wcGluZyBhbmQgc2V0IGZvcm1hdCBhdCB0aGUgY2FtZXJhIGludGVyZmFjZSBpbnB1dCAqLworCWlmICghZmltYy0+dmlkX2NhcC51c2VyX3N1YmRldl9hcGkpIHsKKwkJY3R4LT5zX2ZyYW1lLmZtdCA9IHNfZm10OworCQlzZXRfZnJhbWVfYm91bmRzKCZjdHgtPnNfZnJhbWUsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwkJc2V0X2ZyYW1lX2Nyb3AoJmN0eC0+c19mcmFtZSwgMCwgMCwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgZmltY19jYXBfc19mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7Ci0Jc3RydWN0IGZpbWNfZnJhbWUgKmZyYW1lOwotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXg7Ci0JaW50IHJldDsKLQlpbnQgaTsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0JaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBmaW1jX3ZpZGlvY190cnlfZm10X21wbGFuZShmaWxlLCBwcml2LCBmKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHZiMl9pc19idXN5KCZmaW1jLT52aWRfY2FwLnZicSkgfHwgZmltY19jYXB0dXJlX2FjdGl2ZShmaW1jKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWZyYW1lID0gJmN0eC0+ZF9mcmFtZTsKLQotCXBpeCA9ICZmLT5mbXQucGl4X21wOwotCWZyYW1lLT5mbXQgPSBmaW5kX2Zvcm1hdChmLCBGTVRfRkxBR1NfTTJNIHwgRk1UX0ZMQUdTX0NBTSk7Ci0JaWYgKCFmcmFtZS0+Zm10KSB7Ci0JCWVycigiZmltYyB0YXJnZXQgZm9ybWF0IG5vdCBmb3VuZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBmcmFtZS0+Zm10LT5jb2xwbGFuZXM7IGkrKykgewotCQlmcmFtZS0+cGF5bG9hZFtpXSA9Ci0JCQkocGl4LT53aWR0aCAqIHBpeC0+aGVpZ2h0ICogZnJhbWUtPmZtdC0+ZGVwdGhbaV0pID4+IDM7Ci0JfQotCi0JLyogT3V0cHV0IERNQSBmcmFtZSBwaXhlbCBzaXplIGFuZCBvZmZzZXRzLiAqLwotCWZyYW1lLT5mX3dpZHRoID0gcGl4LT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lICogOAotCQkJLyBmcmFtZS0+Zm10LT5kZXB0aFswXTsKLQlmcmFtZS0+Zl9oZWlnaHQgPSBwaXgtPmhlaWdodDsKLQlmcmFtZS0+d2lkdGgJPSBwaXgtPndpZHRoOwotCWZyYW1lLT5oZWlnaHQJPSBwaXgtPmhlaWdodDsKLQlmcmFtZS0+b193aWR0aAk9IHBpeC0+d2lkdGg7Ci0JZnJhbWUtPm9faGVpZ2h0ID0gcGl4LT5oZWlnaHQ7Ci0JZnJhbWUtPm9mZnNfaAk9IDA7Ci0JZnJhbWUtPm9mZnNfdgk9IDA7Ci0KLQljdHgtPnN0YXRlIHw9IChGSU1DX1BBUkFNUyB8IEZJTUNfRFNUX0ZNVCk7Ci0KLQlyZXQgPSBzeW5jX2NhcHR1cmVfZm10KGN0eCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZmltY19jYXB0dXJlX3NldF9mb3JtYXQoZmltYywgZik7CiB9CiAKIHN0YXRpYyBpbnQgZmltY19jYXBfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppKQorCQkJICAgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKLQlzdHJ1Y3QgczVwX3BsYXRmb3JtX2ZpbWMgKnBsZGF0YSA9IGN0eC0+ZmltY19kZXYtPnBkYXRhOwotCXN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyAqaXNwX2luZm87CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZmltYy0+cGlwZWxpbmUuc2Vuc29yOwogCi0JaWYgKGktPmluZGV4ID49IHBsZGF0YS0+bnVtX2NsaWVudHMpCisJaWYgKGktPmluZGV4ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaXNwX2luZm8gPSAmcGxkYXRhLT5pc3BfaW5mb1tpLT5pbmRleF07Ci0KIAlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQlzdHJuY3B5KGktPm5hbWUsIGlzcF9pbmZvLT5ib2FyZF9pbmZvLT50eXBlLCAzMik7CisJaWYgKHNkKQorCQlzdHJsY3B5KGktPm5hbWUsIHNkLT5uYW1lLCBzaXplb2YoaS0+bmFtZSkpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZpbWNfY2FwX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJICB1bnNpZ25lZCBpbnQgaSkKK3N0YXRpYyBpbnQgZmltY19jYXBfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7Ci0Jc3RydWN0IHM1cF9wbGF0Zm9ybV9maW1jICpwZGF0YSA9IGZpbWMtPnBkYXRhOwotCi0JaWYgKGZpbWNfY2FwdHVyZV9hY3RpdmUoY3R4LT5maW1jX2RldikpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAoaSA+PSBwZGF0YS0+bnVtX2NsaWVudHMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0KLQlpZiAoZmltYy0+dmlkX2NhcC5zZCkgewotCQlpbnQgcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChmaW1jLT52aWRfY2FwLnNkLCBjb3JlLCBzX3Bvd2VyLCAwKTsKLQkJaWYgKHJldCkKLQkJCWVycigic19wb3dlciBmYWlsZWQ6ICVkIiwgcmV0KTsKLQotCQljbGtfZGlzYWJsZShmaW1jLT5jbG9ja1tDTEtfQ0FNXSk7Ci0JfQotCi0JLyogUmVsZWFzZSB0aGUgYXR0YWNoZWQgc2Vuc29yIHN1YmRldmljZS4gKi8KLQlmaW1jX3N1YmRldl91bnJlZ2lzdGVyKGZpbWMpOwotCi0JcmV0dXJuIGZpbWNfaXNwX3N1YmRldl9pbml0KGZpbWMsIGkpOworCXJldHVybiBpID09IDAgPyBpIDogLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBmaW1jX2NhcF9nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmkpCitzdGF0aWMgaW50IGZpbWNfY2FwX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IGZpbWNfdmlkX2NhcCAqY2FwID0gJmN0eC0+ZmltY19kZXYtPnZpZF9jYXA7CisJKmkgPSAwOworCXJldHVybiAwOworfQogCi0JKmkgPSBjYXAtPmlucHV0X2luZGV4OworLyoqCisgKiBmaW1jX3BpcGVsaW5lX3ZhbGlkYXRlIC0gY2hlY2sgZm9yIGZvcm1hdHMgaW5jb25zaXN0ZW5jaWVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBzb3VyY2UgYW5kIHNpbmsgcGFkIG9mIGVhY2ggbGluaworICoKKyAqIFJldHVybiAwIGlmIGFsbCBmb3JtYXRzIG1hdGNoIG9yIC1FUElQRSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZmltY19waXBlbGluZV92YWxpZGF0ZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCBzaW5rX2ZtdCwgc3JjX2ZtdDsKKwlzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwID0gJmZpbWMtPnZpZF9jYXA7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKwlzdHJ1Y3QgbWVkaWFfcGFkICpwYWQ7CisJaW50IHJldDsKKworCS8qIFN0YXJ0IHdpdGggdGhlIHZpZGVvIGNhcHR1cmUgbm9kZSBwYWQgKi8KKwlwYWQgPSBtZWRpYV9lbnRpdHlfcmVtb3RlX3NvdXJjZSgmdmlkX2NhcC0+dmRfcGFkKTsKKwlpZiAocGFkID09IE5VTEwpCisJCXJldHVybiAtRVBJUEU7CisJLyogRklNQy57Tn0gc3ViZGV2aWNlICovCisJc2QgPSBtZWRpYV9lbnRpdHlfdG9fdjRsMl9zdWJkZXYocGFkLT5lbnRpdHkpOworCisJd2hpbGUgKDEpIHsKKwkJLyogUmV0cmlldmUgZm9ybWF0IGF0IHRoZSBzaW5rIHBhZCAqLworCQlwYWQgPSAmc2QtPmVudGl0eS5wYWRzWzBdOworCQlpZiAoIShwYWQtPmZsYWdzICYgTUVESUFfUEFEX0ZMX1NJTkspKQorCQkJYnJlYWs7CisJCS8qIERvbid0IGNhbGwgRklNQyBzdWJkZXYgb3BlcmF0aW9uIHRvIGF2b2lkIG5lc3RlZCBsb2NraW5nICovCisJCWlmIChzZCA9PSBmaW1jLT52aWRfY2FwLnN1YmRldikgeworCQkJc3RydWN0IGZpbWNfZnJhbWUgKmZmID0gJnZpZF9jYXAtPmN0eC0+c19mcmFtZTsKKwkJCXNpbmtfZm10LmZvcm1hdC53aWR0aCA9IGZmLT5mX3dpZHRoOworCQkJc2lua19mbXQuZm9ybWF0LmhlaWdodCA9IGZmLT5mX2hlaWdodDsKKwkJCXNpbmtfZm10LmZvcm1hdC5jb2RlID0gZmYtPmZtdCA/IGZmLT5mbXQtPm1idXNfY29kZSA6IDA7CisJCX0gZWxzZSB7CisJCQlzaW5rX2ZtdC5wYWQgPSBwYWQtPmluZGV4OworCQkJc2lua19mbXQud2hpY2ggPSBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFOworCQkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgcGFkLCBnZXRfZm10LCBOVUxMLCAmc2lua19mbXQpOworCQkJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkKKwkJCQlyZXR1cm4gLUVQSVBFOworCQl9CisJCS8qIFJldHJpZXZlIGZvcm1hdCBhdCB0aGUgc291cmNlIHBhZCAqLworCQlwYWQgPSBtZWRpYV9lbnRpdHlfcmVtb3RlX3NvdXJjZShwYWQpOworCQlpZiAocGFkID09IE5VTEwgfHwKKwkJICAgIG1lZGlhX2VudGl0eV90eXBlKHBhZC0+ZW50aXR5KSAhPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVikKKwkJCWJyZWFrOworCisJCXNkID0gbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KHBhZC0+ZW50aXR5KTsKKwkJc3JjX2ZtdC5wYWQgPSBwYWQtPmluZGV4OworCQlzcmNfZm10LndoaWNoID0gVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTsKKwkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgcGFkLCBnZXRfZm10LCBOVUxMLCAmc3JjX2ZtdCk7CisJCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PSU9DVExDTUQpCisJCQlyZXR1cm4gLUVQSVBFOworCisJCWlmIChzcmNfZm10LmZvcm1hdC53aWR0aCAhPSBzaW5rX2ZtdC5mb3JtYXQud2lkdGggfHwKKwkJICAgIHNyY19mbXQuZm9ybWF0LmhlaWdodCAhPSBzaW5rX2ZtdC5mb3JtYXQuaGVpZ2h0IHx8CisJCSAgICBzcmNfZm10LmZvcm1hdC5jb2RlICE9IHNpbmtfZm10LmZvcm1hdC5jb2RlKQorCQkJcmV0dXJuIC1FUElQRTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZmltY19jYXBfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IGZpbWNfcGlwZWxpbmUgKnAgPSAmZmltYy0+cGlwZWxpbmU7CisJaW50IHJldDsKIAotCWlmIChmaW1jX2NhcHR1cmVfYWN0aXZlKGZpbWMpIHx8ICFmaW1jLT52aWRfY2FwLnNkKQorCWlmIChmaW1jX2NhcHR1cmVfYWN0aXZlKGZpbWMpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JaWYgKCEoY3R4LT5zdGF0ZSAmIEZJTUNfRFNUX0ZNVCkpIHsKLQkJdjRsMl9lcnIoJmZpbWMtPnZpZF9jYXAudjRsMl9kZXYsICJGb3JtYXQgaXMgbm90IHNldFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwltZWRpYV9lbnRpdHlfcGlwZWxpbmVfc3RhcnQoJnAtPnNlbnNvci0+ZW50aXR5LCBwLT5waXBlKTsKIAorCWlmIChmaW1jLT52aWRfY2FwLnVzZXJfc3ViZGV2X2FwaSkgeworCQlyZXQgPSBmaW1jX3BpcGVsaW5lX3ZhbGlkYXRlKGZpbWMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAJcmV0dXJuIHZiMl9zdHJlYW1vbigmZmltYy0+dmlkX2NhcC52YnEsIHR5cGUpOwogfQogCiBzdGF0aWMgaW50IGZpbWNfY2FwX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBmaW1jLT5waXBlbGluZS5zZW5zb3I7CisJaW50IHJldDsKIAotCXJldHVybiB2YjJfc3RyZWFtb2ZmKCZmaW1jLT52aWRfY2FwLnZicSwgdHlwZSk7CisJcmV0ID0gdmIyX3N0cmVhbW9mZigmZmltYy0+dmlkX2NhcC52YnEsIHR5cGUpOworCWlmIChyZXQgPT0gMCkKKwkJbWVkaWFfZW50aXR5X3BpcGVsaW5lX3N0b3AoJnNkLT5lbnRpdHkpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZmltY19jYXBfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxYnVmcykKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IGZpbWNfdmlkX2NhcCAqY2FwID0gJmN0eC0+ZmltY19kZXYtPnZpZF9jYXA7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCWludCByZXQgPSB2YjJfcmVxYnVmcygmZmltYy0+dmlkX2NhcC52YnEsIHJlcWJ1ZnMpOwogCi0KLQlyZXQgPSB2YjJfcmVxYnVmcygmY2FwLT52YnEsIHJlcWJ1ZnMpOwogCWlmICghcmV0KQotCQljYXAtPnJlcWJ1ZnNfY291bnQgPSByZXFidWZzLT5jb3VudDsKLQorCQlmaW1jLT52aWRfY2FwLnJlcWJ1ZnNfY291bnQgPSByZXFidWZzLT5jb3VudDsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGZpbWNfY2FwX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKmNhcCA9ICZjdHgtPmZpbWNfZGV2LT52aWRfY2FwOworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKLQlyZXR1cm4gdmIyX3F1ZXJ5YnVmKCZjYXAtPnZicSwgYnVmKTsKKwlyZXR1cm4gdmIyX3F1ZXJ5YnVmKCZmaW1jLT52aWRfY2FwLnZicSwgYnVmKTsKIH0KIAogc3RhdGljIGludCBmaW1jX2NhcF9xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IGZpbWNfdmlkX2NhcCAqY2FwID0gJmN0eC0+ZmltY19kZXYtPnZpZF9jYXA7Ci0JcmV0dXJuIHZiMl9xYnVmKCZjYXAtPnZicSwgYnVmKTsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJcmV0dXJuIHZiMl9xYnVmKCZmaW1jLT52aWRfY2FwLnZicSwgYnVmKTsKIH0KIAogc3RhdGljIGludCBmaW1jX2NhcF9kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKLQlyZXR1cm4gdmIyX2RxYnVmKCZjdHgtPmZpbWNfZGV2LT52aWRfY2FwLnZicSwgYnVmLAotCQlmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci19CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAotc3RhdGljIGludCBmaW1jX2NhcF9zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQkvKiBBbGxvdyBhbnkgY29udHJvbHMgYnV0IDkwLzI3MCByb3RhdGlvbiB3aGlsZSBzdHJlYW1pbmcgKi8KLQlpZiAoIWZpbWNfY2FwdHVyZV9hY3RpdmUoY3R4LT5maW1jX2RldikgfHwKLQkgICAgY3RybC0+aWQgIT0gVjRMMl9DSURfUk9UQVRFIHx8Ci0JICAgIChjdHJsLT52YWx1ZSAhPSA5MCAmJiBjdHJsLT52YWx1ZSAhPSAyNzApKSB7Ci0JCXJldCA9IGNoZWNrX2N0cmxfdmFsKGN0eCwgY3RybCk7Ci0JCWlmICghcmV0KSB7Ci0JCQlyZXQgPSBmaW1jX3NfY3RybChjdHgsIGN0cmwpOwotCQkJaWYgKCFyZXQpCi0JCQkJY3R4LT5zdGF0ZSB8PSBGSU1DX1BBUkFNUzsKLQkJfQotCX0KLQlpZiAocmV0ID09IC1FSU5WQUwpCi0JCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoY3R4LT5maW1jX2Rldi0+dmlkX2NhcC5zZCwKLQkJCQkgICAgICAgY29yZSwgc19jdHJsLCBjdHJsKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiB2YjJfZHFidWYoJmZpbWMtPnZpZF9jYXAudmJxLCBidWYsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIH0KIAogc3RhdGljIGludCBmaW1jX2NhcF9jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCSAgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcikKIHsKLQlzdHJ1Y3QgZmltY19mcmFtZSAqZjsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoOworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IGZpbWNfZnJhbWUgKmYgPSAmZmltYy0+dmlkX2NhcC5jdHgtPnNfZnJhbWU7CiAKIAlpZiAoY3ItPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmID0gJmN0eC0+c19mcmFtZTsKLQogCWNyLT5ib3VuZHMubGVmdAkJPSAwOwogCWNyLT5ib3VuZHMudG9wCQk9IDA7CiAJY3ItPmJvdW5kcy53aWR0aAk9IGYtPm9fd2lkdGg7CkBAIC03MDksMTAgKzEwMjcsOCBAQAogCiBzdGF0aWMgaW50IGZpbWNfY2FwX2dfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyKQogewotCXN0cnVjdCBmaW1jX2ZyYW1lICpmOwotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JZiA9ICZjdHgtPnNfZnJhbWU7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZmltY19mcmFtZSAqZiA9ICZmaW1jLT52aWRfY2FwLmN0eC0+c19mcmFtZTsKIAogCWNyLT5jLmxlZnQJPSBmLT5vZmZzX2g7CiAJY3ItPmMudG9wCT0gZi0+b2Zmc192OwpAQCAtNzIyLDUzICsxMDM4LDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19jYXBfc19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKLQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jcm9wICpjcikKK3N0YXRpYyBpbnQgZmltY19jYXBfc19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY3JvcCAqY3IpCiB7Ci0Jc3RydWN0IGZpbWNfZnJhbWUgKmY7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmltYy0+dmlkX2NhcC5jdHg7CisJc3RydWN0IGZpbWNfZnJhbWUgKmZmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoZmltY19jYXB0dXJlX2FjdGl2ZShmaW1jKSkKLQkJcmV0dXJuIC1FQlVTWTsKKwlmaW1jX2NhcHR1cmVfdHJ5X2Nyb3AoY3R4LCAmY3ItPmMsIEZJTUNfU0RfUEFEX1NJTkspOworCWZmID0gJmN0eC0+c19mcmFtZTsKIAotCXJldCA9IGZpbWNfdHJ5X2Nyb3AoY3R4LCBjcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmICghKGN0eC0+c3RhdGUgJiBGSU1DX0RTVF9GTVQpKSB7Ci0JCXY0bDJfZXJyKCZmaW1jLT52aWRfY2FwLnY0bDJfZGV2LAotCQkJICJDYXB0dXJlIGNvbG9yIGZvcm1hdCBub3Qgc2V0XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7IC8qIFRPRE86IG1ha2Ugc3VyZSB0aGlzIGlzIHRoZSByaWdodCB2YWx1ZSAqLwotCX0KLQotCWYgPSAmY3R4LT5zX2ZyYW1lOwotCS8qIENoZWNrIGZvciB0aGUgcGl4ZWwgc2NhbGluZyByYXRpbyB3aGVuIGNyb3BwaW5nIGlucHV0IGltYWdlLiAqLwotCXJldCA9IGZpbWNfY2hlY2tfc2NhbGVyX3JhdGlvKGNyLT5jLndpZHRoLCBjci0+Yy5oZWlnaHQsCi0JCQkJICAgICAgY3R4LT5kX2ZyYW1lLndpZHRoLCBjdHgtPmRfZnJhbWUuaGVpZ2h0LAotCQkJCSAgICAgIGN0eC0+cm90YXRpb24pOwotCWlmIChyZXQpIHsKLQkJdjRsMl9lcnIoJmZpbWMtPnZpZF9jYXAudjRsMl9kZXYsICJPdXQgb2YgdGhlIHNjYWxlciByYW5nZVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZi0+b2Zmc19oID0gY3ItPmMubGVmdDsKLQlmLT5vZmZzX3YgPSBjci0+Yy50b3A7Ci0JZi0+d2lkdGggID0gY3ItPmMud2lkdGg7Ci0JZi0+aGVpZ2h0ID0gY3ItPmMuaGVpZ2h0OworCXNwaW5fbG9ja19pcnFzYXZlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOworCXNldF9mcmFtZV9jcm9wKGZmLCBjci0+Yy5sZWZ0LCBjci0+Yy50b3AsIGNyLT5jLndpZHRoLCBjci0+Yy5oZWlnaHQpOworCXNldF9iaXQoU1RfQ0FQVF9BUFBMWV9DRkcsICZmaW1jLT5zdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgZmltY19jYXB0dXJlX2lvY3RsX29wcyA9IHsKIAkudmlkaW9jX3F1ZXJ5Y2FwCQk9IGZpbWNfdmlkaW9jX3F1ZXJ5Y2FwX2NhcHR1cmUsCiAKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY192aWRpb2NfZW51bV9mbXRfbXBsYW5lLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfdmlkaW9jX3RyeV9mbXRfbXBsYW5lLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUJPSBmaW1jX2NhcF9lbnVtX2ZtdF9tcGxhbmUsCisJLnZpZGlvY190cnlfZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY19jYXBfdHJ5X2ZtdF9tcGxhbmUsCiAJLnZpZGlvY19zX2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfY2FwX3NfZm10X21wbGFuZSwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY192aWRpb2NfZ19mbXRfbXBsYW5lLAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUJPSBmaW1jX2NhcF9nX2ZtdF9tcGxhbmUsCiAKIAkudmlkaW9jX3JlcWJ1ZnMJCQk9IGZpbWNfY2FwX3JlcWJ1ZnMsCiAJLnZpZGlvY19xdWVyeWJ1ZgkJPSBmaW1jX2NhcF9xdWVyeWJ1ZiwKQEAgLTc3OSwxMCArMTA3Myw2IEBACiAJLnZpZGlvY19zdHJlYW1vbgkJPSBmaW1jX2NhcF9zdHJlYW1vbiwKIAkudmlkaW9jX3N0cmVhbW9mZgkJPSBmaW1jX2NhcF9zdHJlYW1vZmYsCiAKLQkudmlkaW9jX3F1ZXJ5Y3RybAkJPSBmaW1jX3ZpZGlvY19xdWVyeWN0cmwsCi0JLnZpZGlvY19nX2N0cmwJCQk9IGZpbWNfdmlkaW9jX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybAkJCT0gZmltY19jYXBfc19jdHJsLAotCiAJLnZpZGlvY19nX2Nyb3AJCQk9IGZpbWNfY2FwX2dfY3JvcCwKIAkudmlkaW9jX3NfY3JvcAkJCT0gZmltY19jYXBfc19jcm9wLAogCS52aWRpb2NfY3JvcGNhcAkJCT0gZmltY19jYXBfY3JvcGNhcCwKQEAgLTc5MiwxNyArMTA4MiwzMjggQEAKIAkudmlkaW9jX2dfaW5wdXQJCQk9IGZpbWNfY2FwX2dfaW5wdXQsCiB9OwogCi0vKiBmaW1jLT5sb2NrIG11c3QgYmUgYWxyZWFkeSBpbml0aWFsaXplZCAqLwotaW50IGZpbWNfcmVnaXN0ZXJfY2FwdHVyZV9kZXZpY2Uoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQorLyogQ2FwdHVyZSBzdWJkZXYgbWVkaWEgZW50aXR5IG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgZmltY19saW5rX3NldHVwKHN0cnVjdCBtZWRpYV9lbnRpdHkgKmVudGl0eSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBtZWRpYV9wYWQgKmxvY2FsLAorCQkJICAgY29uc3Qgc3RydWN0IG1lZGlhX3BhZCAqcmVtb3RlLCB1MzIgZmxhZ3MpCiB7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9ICZmaW1jLT52aWRfY2FwLnY0bDJfZGV2OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBtZWRpYV9lbnRpdHlfdG9fdjRsMl9zdWJkZXYoZW50aXR5KTsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmIChtZWRpYV9lbnRpdHlfdHlwZShyZW1vdGUtPmVudGl0eSkgIT0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKFdBUk5fT04oZmltYyA9PSBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlkYmcoIiVzIC0tPiAlcywgZmxhZ3M6IDB4JXguIGlucHV0OiAweCV4IiwKKwkgICAgbG9jYWwtPmVudGl0eS0+bmFtZSwgcmVtb3RlLT5lbnRpdHktPm5hbWUsIGZsYWdzLAorCSAgICBmaW1jLT52aWRfY2FwLmlucHV0KTsKKworCWlmIChmbGFncyAmIE1FRElBX0xOS19GTF9FTkFCTEVEKSB7CisJCWlmIChmaW1jLT52aWRfY2FwLmlucHV0ICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCQlmaW1jLT52aWRfY2FwLmlucHV0ID0gc2QtPmdycF9pZDsKKwkJcmV0dXJuIDA7CisJfQorCisJZmltYy0+dmlkX2NhcC5pbnB1dCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVkaWFfZW50aXR5X29wZXJhdGlvbnMgZmltY19zZF9tZWRpYV9vcHMgPSB7CisJLmxpbmtfc2V0dXAgPSBmaW1jX2xpbmtfc2V0dXAsCit9OworCisvKioKKyAqIGZpbWNfc2Vuc29yX25vdGlmeSAtIHY0bDJfZGV2aWNlIG5vdGlmaWNhdGlvbiBmcm9tIGEgc2Vuc29yIHN1YmRldgorICogQHNkOiBwb2ludGVyIHRvIGEgc3ViZGV2IGdlbmVyYXRpbmcgdGhlIG5vdGlmaWNhdGlvbgorICogQG5vdGlmaWNhdGlvbjogdGhlIG5vdGlmaWNhdGlvbiB0eXBlLCBtdXN0IGJlIFM1UF9GSU1DX1RYX0VORF9OT1RJRlkKKyAqIEBhcmc6IHBvaW50ZXIgdG8gYW4gdTMyIHR5cGUgaW50ZWdlciB0aGF0IHN0b3JlcyB0aGUgZnJhbWUgcGF5bG9hZCB2YWx1ZQorICoKKyAqIFRoZSBFbmQgT2YgRnJhbWUgbm90aWZpY2F0aW9uIHNlbnQgYnkgc2Vuc29yIHN1YmRldiBpbiBpdHMgc3RpbGwgY2FwdHVyZQorICogbW9kZS4gSWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBWU1lOQyBnZW5lcmF0ZWQgYnkgdGhlIHNlbnNvciBhdCB0aGUKKyAqIGJlZ2lubmluZyBvZiBhIGZyYW1lIHRyYW5zbWlzc2lvbiwgRklNQyBkb2VzIG5vdCBpc3N1ZSB0aGUgTGFzdElycQorICogKGVuZCBvZiBmcmFtZSkgaW50ZXJydXB0LiBBbmQgdGhpcyBub3RpZmljYXRpb24gaXMgdXNlZCB0byBjb21wbGV0ZSB0aGUKKyAqIGZyYW1lIGNhcHR1cmUgYW5kIHJldHVybmluZyBhIGJ1ZmZlciB0byB1c2VyLXNwYWNlLiBTdWJkZXYgZHJpdmVycyBzaG91bGQKKyAqIGNhbGwgdGhpcyBub3RpZmljYXRpb24gZnJvbSB0aGVpciBsYXN0ICdFbmQgb2YgZnJhbWUgY2FwdHVyZScgaW50ZXJydXB0LgorICovCit2b2lkIGZpbWNfc2Vuc29yX25vdGlmeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgbm90aWZpY2F0aW9uLAorCQkJdm9pZCAqYXJnKQoreworCXN0cnVjdCBmaW1jX3NlbnNvcl9pbmZvCSpzZW5zb3I7CisJc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqYnVmOworCXN0cnVjdCBmaW1jX21kICpmbWQ7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2QgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2Vuc29yID0gdjRsMl9nZXRfc3ViZGV2X2hvc3RkYXRhKHNkKTsKKwlmbWQgPSBlbnRpdHlfdG9fZmltY19tZGV2KCZzZC0+ZW50aXR5KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmbWQtPnNsb2NrLCBmbGFncyk7CisJZmltYyA9IHNlbnNvciA/IHNlbnNvci0+aG9zdCA6IE5VTEw7CisKKwlpZiAoZmltYyAmJiBhcmcgJiYgbm90aWZpY2F0aW9uID09IFM1UF9GSU1DX1RYX0VORF9OT1RJRlkgJiYKKwkgICAgdGVzdF9iaXQoU1RfQ0FQVF9QRU5ELCAmZmltYy0+c3RhdGUpKSB7CisJCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmltYy0+c2xvY2ssIGlycV9mbGFncyk7CisJCWlmICghbGlzdF9lbXB0eSgmZmltYy0+dmlkX2NhcC5hY3RpdmVfYnVmX3EpKSB7CisJCQlidWYgPSBsaXN0X2VudHJ5KGZpbWMtPnZpZF9jYXAuYWN0aXZlX2J1Zl9xLm5leHQsCisJCQkJCSBzdHJ1Y3QgZmltY192aWRfYnVmZmVyLCBsaXN0KTsKKwkJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCgmYnVmLT52YiwgMCwgKigodTMyICopYXJnKSk7CisJCX0KKwkJZmltY19jYXB0dXJlX2lycV9oYW5kbGVyKGZpbWMsIHRydWUpOworCQlmaW1jX2RlYWN0aXZhdGVfY2FwdHVyZShmaW1jKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGlycV9mbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZtZC0+c2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBmaW1jX3N1YmRldl9lbnVtX21idXNfY29kZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X21idXNfY29kZV9lbnVtICpjb2RlKQoreworCXN0cnVjdCBmaW1jX2ZtdCAqZm10OworCisJZm10ID0gZmltY19maW5kX2Zvcm1hdChOVUxMLCBOVUxMLCBGTVRfRkxBR1NfQ0FNLCBjb2RlLT5pbmRleCk7CisJaWYgKCFmbXQpCisJCXJldHVybiAtRUlOVkFMOworCWNvZGUtPmNvZGUgPSBmbXQtPm1idXNfY29kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW1jX3N1YmRldl9nZXRfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaW1jLT52aWRfY2FwLmN0eDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZjsKKwlzdHJ1Y3QgZmltY19mcmFtZSAqZmY7CisKKwlpZiAoZm10LT53aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKSB7CisJCW1mID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIGZtdC0+cGFkKTsKKwkJZm10LT5mb3JtYXQgPSAqbWY7CisJCXJldHVybiAwOworCX0KKwltZiA9ICZmbXQtPmZvcm1hdDsKKwltZi0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOworCWZmID0gZm10LT5wYWQgPT0gRklNQ19TRF9QQURfU0lOSyA/ICZjdHgtPnNfZnJhbWUgOiAmY3R4LT5kX2ZyYW1lOworCisJbXV0ZXhfbG9jaygmZmltYy0+bG9jayk7CisJLyogVGhlIHBpeGVsIGNvZGUgaXMgc2FtZSBvbiBib3RoIGlucHV0IGFuZCBvdXRwdXQgcGFkICovCisJaWYgKCFXQVJOX09OKGN0eC0+c19mcmFtZS5mbXQgPT0gTlVMTCkpCisJCW1mLT5jb2RlID0gY3R4LT5zX2ZyYW1lLmZtdC0+bWJ1c19jb2RlOworCW1mLT53aWR0aCAgPSBmZi0+Zl93aWR0aDsKKwltZi0+aGVpZ2h0ID0gZmYtPmZfaGVpZ2h0OworCW11dGV4X3VubG9jaygmZmltYy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW1jX3N1YmRldl9zZXRfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYgPSAmZm10LT5mb3JtYXQ7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaW1jLT52aWRfY2FwLmN0eDsKKwlzdHJ1Y3QgZmltY19mcmFtZSAqZmY7CisJc3RydWN0IGZpbWNfZm10ICpmZm10OworCisJZGJnKCJwYWQlZDogY29kZTogMHgleCwgJWR4JWQiLAorCSAgICBmbXQtPnBhZCwgbWYtPmNvZGUsIG1mLT53aWR0aCwgbWYtPmhlaWdodCk7CisKKwlpZiAoZm10LT5wYWQgPT0gRklNQ19TRF9QQURfU09VUkNFICYmCisJICAgIHZiMl9pc19idXN5KCZmaW1jLT52aWRfY2FwLnZicSkpCisJCXJldHVybiAtRUJVU1k7CisKKwltdXRleF9sb2NrKCZmaW1jLT5sb2NrKTsKKwlmZm10ID0gZmltY19jYXB0dXJlX3RyeV9mb3JtYXQoY3R4LCAmbWYtPndpZHRoLCAmbWYtPmhlaWdodCwKKwkJCQkgICAgICAgJm1mLT5jb2RlLCBOVUxMLCBmbXQtPnBhZCk7CisJbXV0ZXhfdW5sb2NrKCZmaW1jLT5sb2NrKTsKKwltZi0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOworCisJaWYgKGZtdC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkgeworCQltZiA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCBmbXQtPnBhZCk7CisJCSptZiA9IGZtdC0+Zm9ybWF0OworCQlyZXR1cm4gMDsKKwl9CisJZmltY19jYXB0dXJlX21hcmtfanBlZ194ZmVyKGN0eCwgZmltY19mbXRfaXNfanBlZyhmZm10LT5jb2xvcikpOworCisJZmYgPSBmbXQtPnBhZCA9PSBGSU1DX1NEX1BBRF9TSU5LID8KKwkJJmN0eC0+c19mcmFtZSA6ICZjdHgtPmRfZnJhbWU7CisKKwltdXRleF9sb2NrKCZmaW1jLT5sb2NrKTsKKwlzZXRfZnJhbWVfYm91bmRzKGZmLCBtZi0+d2lkdGgsIG1mLT5oZWlnaHQpOworCWZmLT5mbXQgPSBmZm10OworCisJLyogUmVzZXQgdGhlIGNyb3AgcmVjdGFuZ2xlIGlmIHJlcXVpcmVkLiAqLworCWlmICghKGZtdC0+cGFkID09IEZJTUNfU0RfUEFEX1NPVVJDRSAmJiAoY3R4LT5zdGF0ZSAmIEZJTUNfRFNUX0NST1ApKSkKKwkJc2V0X2ZyYW1lX2Nyb3AoZmYsIDAsIDAsIG1mLT53aWR0aCwgbWYtPmhlaWdodCk7CisKKwlpZiAoZm10LT5wYWQgPT0gRklNQ19TRF9QQURfU0lOSykKKwkJY3R4LT5zdGF0ZSAmPSB+RklNQ19EU1RfQ1JPUDsKKwltdXRleF91bmxvY2soJmZpbWMtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbWNfc3ViZGV2X2dldF9jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCAqY3JvcCkKK3sKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbWMtPnZpZF9jYXAuY3R4OworCXN0cnVjdCB2NGwyX3JlY3QgKnIgPSAmY3JvcC0+cmVjdDsKKwlzdHJ1Y3QgZmltY19mcmFtZSAqZmY7CisKKwlpZiAoY3JvcC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkgeworCQljcm9wLT5yZWN0ID0gKnY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgY3JvcC0+cGFkKTsKKwkJcmV0dXJuIDA7CisJfQorCWZmID0gY3JvcC0+cGFkID09IEZJTUNfU0RfUEFEX1NJTksgPworCQkmY3R4LT5zX2ZyYW1lIDogJmN0eC0+ZF9mcmFtZTsKKworCW11dGV4X2xvY2soJmZpbWMtPmxvY2spOworCXItPmxlZnQJICA9IGZmLT5vZmZzX2g7CisJci0+dG9wCSAgPSBmZi0+b2Zmc192OworCXItPndpZHRoICA9IGZmLT53aWR0aDsKKwlyLT5oZWlnaHQgPSBmZi0+aGVpZ2h0OworCW11dGV4X3VubG9jaygmZmltYy0+bG9jayk7CisKKwlkYmcoImZmOiVwLCBwYWQlZDogbDolZCwgdDolZCwgJWR4JWQsIGZfdzogJWQsIGZfaDogJWQiLAorCSAgICBmZiwgY3JvcC0+cGFkLCByLT5sZWZ0LCByLT50b3AsIHItPndpZHRoLCByLT5oZWlnaHQsCisJICAgIGZmLT5mX3dpZHRoLCBmZi0+Zl9oZWlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmltY19zdWJkZXZfc2V0X2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCXN0cnVjdCB2NGwyX3N1YmRldl9jcm9wICpjcm9wKQoreworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmltYy0+dmlkX2NhcC5jdHg7CisJc3RydWN0IHY0bDJfcmVjdCAqciA9ICZjcm9wLT5yZWN0OworCXN0cnVjdCBmaW1jX2ZyYW1lICpmZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGJnKCIoJWQsJWQpLyVkeCVkIiwgci0+bGVmdCwgci0+dG9wLCByLT53aWR0aCwgci0+aGVpZ2h0KTsKKworCWZmID0gY3JvcC0+cGFkID09IEZJTUNfU0RfUEFEX1NPVVJDRSA/CisJCSZjdHgtPmRfZnJhbWUgOiAmY3R4LT5zX2ZyYW1lOworCisJbXV0ZXhfbG9jaygmZmltYy0+bG9jayk7CisJZmltY19jYXB0dXJlX3RyeV9jcm9wKGN0eCwgciwgY3JvcC0+cGFkKTsKKworCWlmIChjcm9wLT53aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKSB7CisJCW11dGV4X2xvY2soJmZpbWMtPmxvY2spOworCQkqdjRsMl9zdWJkZXZfZ2V0X3RyeV9jcm9wKGZoLCBjcm9wLT5wYWQpID0gKnI7CisJCXJldHVybiAwOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKwlzZXRfZnJhbWVfY3JvcChmZiwgci0+bGVmdCwgci0+dG9wLCByLT53aWR0aCwgci0+aGVpZ2h0KTsKKwlpZiAoY3JvcC0+cGFkID09IEZJTUNfU0RfUEFEX1NPVVJDRSkKKwkJY3R4LT5zdGF0ZSB8PSBGSU1DX0RTVF9DUk9QOworCisJc2V0X2JpdChTVF9DQVBUX0FQUExZX0NGRywgJmZpbWMtPnN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOworCisJZGJnKCJwYWQlZDogKCVkLCVkKS8lZHglZCIsIGNyb3AtPnBhZCwgci0+bGVmdCwgci0+dG9wLAorCSAgICByLT53aWR0aCwgci0+aGVpZ2h0KTsKKworCW11dGV4X3VubG9jaygmZmltYy0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX29wcyBmaW1jX3N1YmRldl9wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZSA9IGZpbWNfc3ViZGV2X2VudW1fbWJ1c19jb2RlLAorCS5nZXRfZm10ID0gZmltY19zdWJkZXZfZ2V0X2ZtdCwKKwkuc2V0X2ZtdCA9IGZpbWNfc3ViZGV2X3NldF9mbXQsCisJLmdldF9jcm9wID0gZmltY19zdWJkZXZfZ2V0X2Nyb3AsCisJLnNldF9jcm9wID0gZmltY19zdWJkZXZfc2V0X2Nyb3AsCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBmaW1jX3N1YmRldl9vcHMgPSB7CisJLnBhZCA9ICZmaW1jX3N1YmRldl9wYWRfb3BzLAorfTsKKworc3RhdGljIGludCBmaW1jX2NyZWF0ZV9jYXB0dXJlX3N1YmRldihzdHJ1Y3QgZmltY19kZXYgKmZpbWMsCisJCQkJICAgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCWludCByZXQ7CisKKwlzZCA9IGt6YWxsb2Moc2l6ZW9mKCpzZCksIEdGUF9LRVJORUwpOworCWlmICghc2QpCisJCXJldHVybiAtRU5PTUVNOworCisJdjRsMl9zdWJkZXZfaW5pdChzZCwgJmZpbWNfc3ViZGV2X29wcyk7CisJc2QtPmZsYWdzID0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7CisJc25wcmludGYoc2QtPm5hbWUsIHNpemVvZihzZC0+bmFtZSksICJGSU1DLiVkIiwgZmltYy0+cGRldi0+aWQpOworCisJZmltYy0+dmlkX2NhcC5zZF9wYWRzW0ZJTUNfU0RfUEFEX1NJTktdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTks7CisJZmltYy0+dmlkX2NhcC5zZF9wYWRzW0ZJTUNfU0RfUEFEX1NPVVJDRV0uZmxhZ3MgPSBNRURJQV9QQURfRkxfU09VUkNFOworCXJldCA9IG1lZGlhX2VudGl0eV9pbml0KCZzZC0+ZW50aXR5LCBGSU1DX1NEX1BBRFNfTlVNLAorCQkJCWZpbWMtPnZpZF9jYXAuc2RfcGFkcywgMCk7CisJaWYgKHJldCkKKwkJZ290byBtZV9lcnI7CisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHY0bDJfZGV2LCBzZCk7CisJaWYgKHJldCkKKwkJZ290byBzZF9lcnI7CisKKwlmaW1jLT52aWRfY2FwLnN1YmRldiA9IHNkOworCXY0bDJfc2V0X3N1YmRldmRhdGEoc2QsIGZpbWMpOworCXNkLT5lbnRpdHkub3BzID0gJmZpbWNfc2RfbWVkaWFfb3BzOworCXJldHVybiAwOworc2RfZXJyOgorCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzZC0+ZW50aXR5KTsKK21lX2VycjoKKwlrZnJlZShzZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZmltY19kZXN0cm95X2NhcHR1cmVfc3ViZGV2KHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZmltYy0+dmlkX2NhcC5zdWJkZXY7CisKKwlpZiAoIXNkKQorCQlyZXR1cm47CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnNkLT5lbnRpdHkpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZShzZCk7CisJc2QgPSBOVUxMOworfQorCisvKiBTZXQgZGVmYXVsdCBmb3JtYXQgYXQgdGhlIHNlbnNvciBhbmQgaG9zdCBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgZmltY19jYXB0dXJlX3NldF9kZWZhdWx0X2Zvcm1hdChzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCit7CisJc3RydWN0IHY0bDJfZm9ybWF0IGZtdCA9IHsKKwkJLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FLAorCQkuZm10LnBpeF9tcCA9IHsKKwkJCS53aWR0aAkJPSA2NDAsCisJCQkuaGVpZ2h0CQk9IDQ4MCwKKwkJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCQkJLmZpZWxkCQk9IFY0TDJfRklFTERfTk9ORSwKKwkJCS5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCisJCX0sCisJfTsKKworCXJldHVybiBmaW1jX2NhcHR1cmVfc2V0X2Zvcm1hdChmaW1jLCAmZm10KTsKK30KKworLyogZmltYy0+bG9jayBtdXN0IGJlIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KK2ludCBmaW1jX3JlZ2lzdGVyX2NhcHR1cmVfZGV2aWNlKHN0cnVjdCBmaW1jX2RldiAqZmltYywKKwkJCQkgc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKK3sKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7CiAJc3RydWN0IGZpbWNfdmlkX2NhcCAqdmlkX2NhcDsKIAlzdHJ1Y3QgZmltY19jdHggKmN0eDsKLQlzdHJ1Y3QgdjRsMl9mb3JtYXQgZjsKLQlzdHJ1Y3QgZmltY19mcmFtZSAqZnI7CiAJc3RydWN0IHZiMl9xdWV1ZSAqcTsKLQlpbnQgcmV0OworCWludCByZXQgPSAtRU5PTUVNOwogCiAJY3R4ID0ga3phbGxvYyhzaXplb2YgKmN0eCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjdHgpCkBAIC04MTIsMzMgKzE0MTMsMjEgQEAKIAljdHgtPmluX3BhdGgJID0gRklNQ19DQU1FUkE7CiAJY3R4LT5vdXRfcGF0aAkgPSBGSU1DX0RNQTsKIAljdHgtPnN0YXRlCSA9IEZJTUNfQ1RYX0NBUDsKLQotCS8qIERlZmF1bHQgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZnJhbWVzICovCi0JZi5mbXQucGl4LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjMyOwotCWZyID0gJmN0eC0+ZF9mcmFtZTsKLQlmci0+Zm10ID0gZmluZF9mb3JtYXQoJmYsIEZNVF9GTEFHU19NMk0pOwotCWZyLT53aWR0aCA9IGZyLT5mX3dpZHRoID0gZnItPm9fd2lkdGggPSA2NDA7Ci0JZnItPmhlaWdodCA9IGZyLT5mX2hlaWdodCA9IGZyLT5vX2hlaWdodCA9IDQ4MDsKLQotCWlmICghdjRsMl9kZXYtPm5hbWVbMF0pCi0JCXNucHJpbnRmKHY0bDJfZGV2LT5uYW1lLCBzaXplb2YodjRsMl9kZXYtPm5hbWUpLAotCQkJICIlcy5jYXB0dXJlIiwgZGV2X25hbWUoJmZpbWMtPnBkZXYtPmRldikpOwotCi0JcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoTlVMTCwgdjRsMl9kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2luZm87CisJY3R4LT5zX2ZyYW1lLmZtdCA9IGZpbWNfZmluZF9mb3JtYXQoTlVMTCwgTlVMTCwgRk1UX0ZMQUdTX0NBTSwgMCk7CisJY3R4LT5kX2ZyYW1lLmZtdCA9IGZpbWNfZmluZF9mb3JtYXQoTlVMTCwgTlVMTCwgRk1UX0ZMQUdTX0NBTSwgMCk7CiAKIAl2ZmQgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKIAlpZiAoIXZmZCkgewogCQl2NGwyX2Vycih2NGwyX2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB2aWRlbyBkZXZpY2VcbiIpOwotCQlnb3RvIGVycl92NGwyX3JlZzsKKwkJZ290byBlcnJfdmRfYWxsb2M7CiAJfQogCi0Jc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwgIiVzOmNhcCIsCisJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwgIiVzLmNhcHR1cmUiLAogCQkgZGV2X25hbWUoJmZpbWMtPnBkZXYtPmRldikpOwogCiAJdmZkLT5mb3BzCT0gJmZpbWNfY2FwdHVyZV9mb3BzOwogCXZmZC0+aW9jdGxfb3BzCT0gJmZpbWNfY2FwdHVyZV9pb2N0bF9vcHM7CisJdmZkLT52NGwyX2Rldgk9IHY0bDJfZGV2OwogCXZmZC0+bWlub3IJPSAtMTsKIAl2ZmQtPnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKIAl2ZmQtPmxvY2sJPSAmZmltYy0+bG9jazsKQEAgLTg0OSw4ICsxNDM4LDYgQEAKIAl2aWRfY2FwLT5hY3RpdmVfYnVmX2NudCA9IDA7CiAJdmlkX2NhcC0+cmVxYnVmc19jb3VudCAgPSAwOwogCXZpZF9jYXAtPnJlZmNudCA9IDA7Ci0JLyogRGVmYXVsdCBjb2xvciBmb3JtYXQgZm9yIGltYWdlIHNlbnNvciAqLwotCXZpZF9jYXAtPmZtdC5jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7CiAKIAlJTklUX0xJU1RfSEVBRCgmdmlkX2NhcC0+cGVuZGluZ19idWZfcSk7CiAJSU5JVF9MSVNUX0hFQUQoJnZpZF9jYXAtPmFjdGl2ZV9idWZfcSk7CkBAIC04NjgsMzQgKzE0NTUsMzcgQEAKIAogCXZiMl9xdWV1ZV9pbml0KHEpOwogCi0JcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZmZCwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwotCWlmIChyZXQpIHsKLQkJdjRsMl9lcnIodjRsMl9kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdmlkZW8gZGV2aWNlXG4iKTsKLQkJZ290byBlcnJfdmRfcmVnOwotCX0KKwlmaW1jLT52aWRfY2FwLnZkX3BhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOworCXJldCA9IG1lZGlhX2VudGl0eV9pbml0KCZ2ZmQtPmVudGl0eSwgMSwgJmZpbWMtPnZpZF9jYXAudmRfcGFkLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9lbnQ7CisJcmV0ID0gZmltY19jcmVhdGVfY2FwdHVyZV9zdWJkZXYoZmltYywgdjRsMl9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3NkX3JlZzsKIAotCXY0bDJfaW5mbyh2NGwyX2RldiwKLQkJICAiRklNQyBjYXB0dXJlIGRyaXZlciByZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZFxuIiwKLQkJICB2ZmQtPm51bSk7Ci0KKwl2ZmQtPmN0cmxfaGFuZGxlciA9ICZjdHgtPmN0cmxfaGFuZGxlcjsKIAlyZXR1cm4gMDsKIAotZXJyX3ZkX3JlZzoKK2Vycl9zZF9yZWc6CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnZmZC0+ZW50aXR5KTsKK2Vycl9lbnQ6CiAJdmlkZW9fZGV2aWNlX3JlbGVhc2UodmZkKTsKLWVycl92NGwyX3JlZzoKLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKHY0bDJfZGV2KTsKLWVycl9pbmZvOgorZXJyX3ZkX2FsbG9jOgogCWtmcmVlKGN0eCk7Ci0JZGV2X2VycigmZmltYy0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluc3RhbGxcbiIpOwogCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgZmltY191bnJlZ2lzdGVyX2NhcHR1cmVfZGV2aWNlKHN0cnVjdCBmaW1jX2RldiAqZmltYykKIHsKLQlzdHJ1Y3QgZmltY192aWRfY2FwICpjYXB0dXJlID0gJmZpbWMtPnZpZF9jYXA7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkID0gZmltYy0+dmlkX2NhcC52ZmQ7CiAKLQlpZiAoY2FwdHVyZS0+dmZkKQotCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShjYXB0dXJlLT52ZmQpOwotCi0Ja2ZyZWUoY2FwdHVyZS0+Y3R4KTsKKwlpZiAodmZkKSB7CisJCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZ2ZmQtPmVudGl0eSk7CisJCS8qIENhbiBhbHNvIGJlIGNhbGxlZCBpZiB2aWRlbyBkZXZpY2Ugd2FzCisJCSAgIG5vdCByZWdpc3RlcmVkICovCisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZmZCk7CisJfQorCWZpbWNfZGVzdHJveV9jYXB0dXJlX3N1YmRldihmaW1jKTsKKwlrZnJlZShmaW1jLT52aWRfY2FwLmN0eCk7CisJZmltYy0+dmlkX2NhcC5jdHggPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmMKaW5kZXggYWE1NTA2Ni4uMTljYTZkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTI3LDkgKzI4LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KIAogI2luY2x1ZGUgImZpbWMtY29yZS5oIgorI2luY2x1ZGUgImZpbWMtbWRldmljZS5oIgogCiBzdGF0aWMgY2hhciAqZmltY19jbG9ja3NbTUFYX0ZJTUNfQ0xPQ0tTXSA9IHsKLQkic2Nsa19maW1jIiwgImZpbWMiLCAic2Nsa19jYW0iCisJInNjbGtfZmltYyIsICJmaW1jIgogfTsKIAogc3RhdGljIHN0cnVjdCBmaW1jX2ZtdCBmaW1jX2Zvcm1hdHNbXSA9IHsKQEAgLTE1Nyw1OSArMTU5LDI4IEBACiAJCS5tZW1wbGFuZXMJPSAyLAogCQkuY29scGxhbmVzCT0gMiwKIAkJLmZsYWdzCQk9IEZNVF9GTEFHU19NMk0sCisJfSwgeworCQkubmFtZQkJPSAiSlBFRyBlbmNvZGVkIGRhdGEiLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9KUEVHLAorCQkuY29sb3IJCT0gUzVQX0ZJTUNfSlBFRywKKwkJLmRlcHRoCQk9IHsgOCB9LAorCQkubWVtcGxhbmVzCT0gMSwKKwkJLmNvbHBsYW5lcwk9IDEsCisJCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX0pQRUdfMVg4LAorCQkuZmxhZ3MJCT0gRk1UX0ZMQUdTX0NBTSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBmaW1jX2N0cmxzW10gPSB7Ci0JewotCQkuaWQJCT0gVjRMMl9DSURfSEZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJIb3Jpem9udGFsIGZsaXAiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiVmVydGljYWwgZmxpcCIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfUk9UQVRFLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZQkJPSAiUm90YXRpb24gKENDVykiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMjcwLAotCQkuc3RlcAkJPSA5MCwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmdldF9jdHJsKGludCBpZCkKK2ludCBmaW1jX2NoZWNrX3NjYWxlcl9yYXRpbyhzdHJ1Y3QgZmltY19jdHggKmN0eCwgaW50IHN3LCBpbnQgc2gsCisJCQkgICAgaW50IGR3LCBpbnQgZGgsIGludCByb3RhdGlvbikKIHsKLQlpbnQgaTsKKwlpZiAocm90YXRpb24gPT0gOTAgfHwgcm90YXRpb24gPT0gMjcwKQorCQlzd2FwKGR3LCBkaCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmaW1jX2N0cmxzKTsgKytpKQotCQlpZiAoaWQgPT0gZmltY19jdHJsc1tpXS5pZCkKLQkJCXJldHVybiAmZmltY19jdHJsc1tpXTsKLQlyZXR1cm4gTlVMTDsKLX0KKwlpZiAoIWN0eC0+c2NhbGVyLmVuYWJsZWQpCisJCXJldHVybiAoc3cgPT0gZHcgJiYgc2ggPT0gZGgpID8gMCA6IC1FSU5WQUw7CiAKLWludCBmaW1jX2NoZWNrX3NjYWxlcl9yYXRpbyhpbnQgc3csIGludCBzaCwgaW50IGR3LCBpbnQgZGgsIGludCByb3QpCi17Ci0JaW50IHR4LCB0eTsKLQotCWlmIChyb3QgPT0gOTAgfHwgcm90ID09IDI3MCkgewotCQl0eSA9IGR3OwotCQl0eCA9IGRoOwotCX0gZWxzZSB7Ci0JCXR4ID0gZHc7Ci0JCXR5ID0gZGg7Ci0JfQotCi0JaWYgKChzdyA+PSBTQ0FMRVJfTUFYX0hSQVRJTyAqIHR4KSB8fCAoc2ggPj0gU0NBTEVSX01BWF9WUkFUSU8gKiB0eSkpCisJaWYgKChzdyA+PSBTQ0FMRVJfTUFYX0hSQVRJTyAqIGR3KSB8fCAoc2ggPj0gU0NBTEVSX01BWF9WUkFUSU8gKiBkaCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIDA7CkBAIC0yMzUsMTAgKzIwNiwxMSBAQAogCiBpbnQgZmltY19zZXRfc2NhbGVyX2luZm8oc3RydWN0IGZpbWNfY3R4ICpjdHgpCiB7CisJc3RydWN0IHNhbXN1bmdfZmltY192YXJpYW50ICp2YXJpYW50ID0gY3R4LT5maW1jX2Rldi0+dmFyaWFudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY3R4LT5maW1jX2Rldi0+cGRldi0+ZGV2OwogCXN0cnVjdCBmaW1jX3NjYWxlciAqc2MgPSAmY3R4LT5zY2FsZXI7CiAJc3RydWN0IGZpbWNfZnJhbWUgKnNfZnJhbWUgPSAmY3R4LT5zX2ZyYW1lOwogCXN0cnVjdCBmaW1jX2ZyYW1lICpkX2ZyYW1lID0gJmN0eC0+ZF9mcmFtZTsKLQlzdHJ1Y3Qgc2Ftc3VuZ19maW1jX3ZhcmlhbnQgKnZhcmlhbnQgPSBjdHgtPmZpbWNfZGV2LT52YXJpYW50OwogCWludCB0eCwgdHksIHN4LCBzeTsKIAlpbnQgcmV0OwogCkBAIC0yNTAsMTUgKzIyMiwxNCBAQAogCQl0eSA9IGRfZnJhbWUtPmhlaWdodDsKIAl9CiAJaWYgKHR4IDw9IDAgfHwgdHkgPD0gMCkgewotCQl2NGwyX2VycigmY3R4LT5maW1jX2Rldi0+bTJtLnY0bDJfZGV2LAotCQkJImludmFsaWQgdGFyZ2V0IHNpemU6ICVkIHggJWQiLCB0eCwgdHkpOworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgdGFyZ2V0IHNpemU6ICVkeCVkIiwgdHgsIHR5KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3ggPSBzX2ZyYW1lLT53aWR0aDsKIAlzeSA9IHNfZnJhbWUtPmhlaWdodDsKIAlpZiAoc3ggPD0gMCB8fCBzeSA8PSAwKSB7Ci0JCWVycigiaW52YWxpZCBzb3VyY2Ugc2l6ZTogJWQgeCAlZCIsIHN4LCBzeSk7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBzb3VyY2Ugc2l6ZTogJWR4JWQiLCBzeCwgc3kpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc2MtPnJlYWxfd2lkdGggPSBzeDsKQEAgLTMwMSw3ICsyNzIsNiBAQAogc3RhdGljIHZvaWQgZmltY19tMm1fam9iX2ZpbmlzaChzdHJ1Y3QgZmltY19jdHggKmN0eCwgaW50IHZiX3N0YXRlKQogewogCXN0cnVjdCB2YjJfYnVmZmVyICpzcmNfdmIsICpkc3RfdmI7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKIAogCWlmICghY3R4IHx8ICFjdHgtPm0ybV9jdHgpCiAJCXJldHVybjsKQEAgLTMxMiw1NCArMjgyLDY4IEBACiAJaWYgKHNyY192YiAmJiBkc3RfdmIpIHsKIAkJdjRsMl9tMm1fYnVmX2RvbmUoc3JjX3ZiLCB2Yl9zdGF0ZSk7CiAJCXY0bDJfbTJtX2J1Zl9kb25lKGRzdF92YiwgdmJfc3RhdGUpOwotCQl2NGwyX20ybV9qb2JfZmluaXNoKGZpbWMtPm0ybS5tMm1fZGV2LCBjdHgtPm0ybV9jdHgpOworCQl2NGwyX20ybV9qb2JfZmluaXNoKGN0eC0+ZmltY19kZXYtPm0ybS5tMm1fZGV2LAorCQkJCSAgICBjdHgtPm0ybV9jdHgpOwogCX0KIH0KIAogLyogQ29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIHdoaWNoIGhhcyBiZWVuIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uLiAqLwotc3RhdGljIHZvaWQgZmltY19tMm1fc2h1dGRvd24oc3RydWN0IGZpbWNfY3R4ICpjdHgpCitzdGF0aWMgaW50IGZpbWNfbTJtX3NodXRkb3duKHN0cnVjdCBmaW1jX2N0eCAqY3R4KQogewogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CiAJaW50IHJldDsKIAogCWlmICghZmltY19tMm1fcGVuZGluZyhmaW1jKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAogCWZpbWNfY3R4X3N0YXRlX2xvY2tfc2V0KEZJTUNfQ1RYX1NIVVQsIGN0eCk7CiAKIAlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoZmltYy0+aXJxX3F1ZXVlLAogCQkJICAgIWZpbWNfY3R4X3N0YXRlX2lzX3NldChGSU1DX0NUWF9TSFVULCBjdHgpLAogCQkJICAgRklNQ19TSFVURE9XTl9USU1FT1VUKTsKLQkvKgotCSAqIEluIGNhc2Ugb2YgYSB0aW1lb3V0IHRoZSBidWZmZXJzIGFyZSBub3QgcmVsZWFzZWQgaW4gdGhlIGludGVycnVwdAotCSAqIGhhbmRsZXIgc28gcmV0dXJuIHRoZW0gaGVyZSB3aXRoIHRoZSBlcnJvciBmbGFnIHNldCwgaWYgdGhlcmUgYXJlCi0JICogYW55IG9uIHRoZSBxdWV1ZS4KLQkgKi8KLQlpZiAocmV0ID09IDApCi0JCWZpbWNfbTJtX2pvYl9maW5pc2goY3R4LCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKworCXJldHVybiByZXQgPT0gMCA/IC1FVElNRURPVVQgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHEtPmRydl9wcml2OworCWludCByZXQ7CisKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZjdHgtPmZpbWNfZGV2LT5wZGV2LT5kZXYpOworCXJldHVybiByZXQgPiAwID8gMCA6IHJldDsKIH0KIAogc3RhdGljIGludCBzdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQogewogCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcS0+ZHJ2X3ByaXY7CisJaW50IHJldDsKIAotCWZpbWNfbTJtX3NodXRkb3duKGN0eCk7CisJcmV0ID0gZmltY19tMm1fc2h1dGRvd24oY3R4KTsKKwlpZiAocmV0ID09IC1FVElNRURPVVQpCisJCWZpbWNfbTJtX2pvYl9maW5pc2goY3R4LCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKIAorCXBtX3J1bnRpbWVfcHV0KCZjdHgtPmZpbWNfZGV2LT5wZGV2LT5kZXYpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBmaW1jX2NhcHR1cmVfaXJxX2hhbmRsZXIoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQordm9pZCBmaW1jX2NhcHR1cmVfaXJxX2hhbmRsZXIoc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBib29sIGZpbmFsKQogewogCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKmNhcCA9ICZmaW1jLT52aWRfY2FwOwogCXN0cnVjdCBmaW1jX3ZpZF9idWZmZXIgKnZfYnVmOwogCXN0cnVjdCB0aW1ldmFsICp0djsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUX0NBUFRfU0hVVCwgJmZpbWMtPnN0YXRlKSkgeworCQl3YWtlX3VwKCZmaW1jLT5pcnFfcXVldWUpOworCQlyZXR1cm47CisJfQorCiAJaWYgKCFsaXN0X2VtcHR5KCZjYXAtPmFjdGl2ZV9idWZfcSkgJiYKLQkgICAgdGVzdF9iaXQoU1RfQ0FQVF9SVU4sICZmaW1jLT5zdGF0ZSkpIHsKKwkgICAgdGVzdF9iaXQoU1RfQ0FQVF9SVU4sICZmaW1jLT5zdGF0ZSkgJiYgZmluYWwpIHsKIAkJa3RpbWVfZ2V0X3JlYWxfdHMoJnRzKTsKIAotCQl2X2J1ZiA9IGFjdGl2ZV9xdWV1ZV9wb3AoY2FwKTsKKwkJdl9idWYgPSBmaW1jX2FjdGl2ZV9xdWV1ZV9wb3AoY2FwKTsKIAogCQl0diA9ICZ2X2J1Zi0+dmIudjRsMl9idWYudGltZXN0YW1wOwogCQl0di0+dHZfc2VjID0gdHMudHZfc2VjOwpAQCAtMzY5LDE5ICszNTMsMTQgQEAKIAkJdmIyX2J1ZmZlcl9kb25lKCZ2X2J1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7CiAJfQogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVF9DQVBUX1NIVVQsICZmaW1jLT5zdGF0ZSkpIHsKLQkJd2FrZV91cCgmZmltYy0+aXJxX3F1ZXVlKTsKLQkJcmV0dXJuOwotCX0KLQogCWlmICghbGlzdF9lbXB0eSgmY2FwLT5wZW5kaW5nX2J1Zl9xKSkgewogCi0JCXZfYnVmID0gcGVuZGluZ19xdWV1ZV9wb3AoY2FwKTsKKwkJdl9idWYgPSBmaW1jX3BlbmRpbmdfcXVldWVfcG9wKGNhcCk7CiAJCWZpbWNfaHdfc2V0X291dHB1dF9hZGRyKGZpbWMsICZ2X2J1Zi0+cGFkZHIsIGNhcC0+YnVmX2luZGV4KTsKIAkJdl9idWYtPmluZGV4ID0gY2FwLT5idWZfaW5kZXg7CiAKIAkJLyogTW92ZSB0aGUgYnVmZmVyIHRvIHRoZSBjYXB0dXJlIGFjdGl2ZSBxdWV1ZSAqLwotCQlhY3RpdmVfcXVldWVfYWRkKGNhcCwgdl9idWYpOworCQlmaW1jX2FjdGl2ZV9xdWV1ZV9hZGQoY2FwLCB2X2J1Zik7CiAKIAkJZGJnKCJuZXh0IGZyYW1lOiAlZCwgZG9uZSBmcmFtZTogJWQiLAogCQkgICAgZmltY19od19nZXRfZnJhbWVfaW5kZXgoZmltYyksIHZfYnVmLT5pbmRleCk7CkBAIC0zOTEsNyArMzcwLDggQEAKIAl9CiAKIAlpZiAoY2FwLT5hY3RpdmVfYnVmX2NudCA9PSAwKSB7Ci0JCWNsZWFyX2JpdChTVF9DQVBUX1JVTiwgJmZpbWMtPnN0YXRlKTsKKwkJaWYgKGZpbmFsKQorCQkJY2xlYXJfYml0KFNUX0NBUFRfUlVOLCAmZmltYy0+c3RhdGUpOwogCiAJCWlmICgrK2NhcC0+YnVmX2luZGV4ID49IEZJTUNfTUFYX09VVF9CVUZTKQogCQkJY2FwLT5idWZfaW5kZXggPSAwOwpAQCAtMzk5LDExICszNzksMTMgQEAKIAkJc2V0X2JpdChTVF9DQVBUX1JVTiwgJmZpbWMtPnN0YXRlKTsKIAl9CiAKKwlmaW1jX2NhcHR1cmVfY29uZmlnX3VwZGF0ZShjYXAtPmN0eCk7CisKIAlkYmcoImZyYW1lOiAlZCwgYWN0aXZlX2J1Zl9jbnQ6ICVkIiwKIAkgICAgZmltY19od19nZXRfZnJhbWVfaW5kZXgoZmltYyksIGNhcC0+YWN0aXZlX2J1Zl9jbnQpOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgZmltY19pc3IoaW50IGlycSwgdm9pZCAqcHJpdikKK3N0YXRpYyBpcnFyZXR1cm5fdCBmaW1jX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gcHJpdjsKIAlzdHJ1Y3QgZmltY192aWRfY2FwICpjYXAgPSAmZmltYy0+dmlkX2NhcDsKQEAgLTQxMSw5ICszOTMsMTcgQEAKIAogCWZpbWNfaHdfY2xlYXJfaXJxKGZpbWMpOwogCisJc3Bpbl9sb2NrKCZmaW1jLT5zbG9jayk7CisKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUX00yTV9QRU5ELCAmZmltYy0+c3RhdGUpKSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RfTTJNX1NVU1BFTkRJTkcsICZmaW1jLT5zdGF0ZSkpIHsKKwkJCXNldF9iaXQoU1RfTTJNX1NVU1BFTkRFRCwgJmZpbWMtPnN0YXRlKTsKKwkJCXdha2VfdXAoJmZpbWMtPmlycV9xdWV1ZSk7CisJCQlnb3RvIG91dDsKKwkJfQogCQljdHggPSB2NGwyX20ybV9nZXRfY3Vycl9wcml2KGZpbWMtPm0ybS5tMm1fZGV2KTsKIAkJaWYgKGN0eCAhPSBOVUxMKSB7CisJCQlzcGluX3VubG9jaygmZmltYy0+c2xvY2spOwogCQkJZmltY19tMm1fam9iX2ZpbmlzaChjdHgsIFZCMl9CVUZfU1RBVEVfRE9ORSk7CiAKIAkJCXNwaW5fbG9jaygmY3R4LT5zbG9jayk7CkBAIC00MjMsMjEgKzQxMywxNiBAQAogCQkJfQogCQkJc3Bpbl91bmxvY2soJmN0eC0+c2xvY2spOwogCQl9Ci0KIAkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCXNwaW5fbG9jaygmZmltYy0+c2xvY2spOwotCi0JaWYgKHRlc3RfYml0KFNUX0NBUFRfUEVORCwgJmZpbWMtPnN0YXRlKSkgewotCQlmaW1jX2NhcHR1cmVfaXJxX2hhbmRsZXIoZmltYyk7Ci0KKwl9IGVsc2UgaWYgKHRlc3RfYml0KFNUX0NBUFRfUEVORCwgJmZpbWMtPnN0YXRlKSkgeworCQlmaW1jX2NhcHR1cmVfaXJxX2hhbmRsZXIoZmltYywKKwkJCQkgIXRlc3RfYml0KFNUX0NBUFRfSlBFRywgJmZpbWMtPnN0YXRlKSk7CiAJCWlmIChjYXAtPmFjdGl2ZV9idWZfY250ID09IDEpIHsKIAkJCWZpbWNfZGVhY3RpdmF0ZV9jYXB0dXJlKGZpbWMpOwogCQkJY2xlYXJfYml0KFNUX0NBUFRfU1RSRUFNLCAmZmltYy0+c3RhdGUpOwogCQl9CiAJfQotCitvdXQ6CiAJc3Bpbl91bmxvY2soJmZpbWMtPnNsb2NrKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC00NTcsNyArNDQyLDcgQEAKIAlkYmcoIm1lbXBsYW5lcz0gJWQsIGNvbHBsYW5lcz0gJWQsIHBpeF9zaXplPSAlZCIsCiAJCWZyYW1lLT5mbXQtPm1lbXBsYW5lcywgZnJhbWUtPmZtdC0+Y29scGxhbmVzLCBwaXhfc2l6ZSk7CiAKLQlwYWRkci0+eSA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKKwlwYWRkci0+eSA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCAwKTsKIAogCWlmIChmcmFtZS0+Zm10LT5tZW1wbGFuZXMgPT0gMSkgewogCQlzd2l0Y2ggKGZyYW1lLT5mbXQtPmNvbHBsYW5lcykgewpAQCAtNDg1LDEwICs0NzAsMTAgQEAKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChmcmFtZS0+Zm10LT5tZW1wbGFuZXMgPj0gMikKLQkJCXBhZGRyLT5jYiA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAxKTsKKwkJCXBhZGRyLT5jYiA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCAxKTsKIAogCQlpZiAoZnJhbWUtPmZtdC0+bWVtcGxhbmVzID09IDMpCi0JCQlwYWRkci0+Y3IgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMik7CisJCQlwYWRkci0+Y3IgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMik7CiAJfQogCiAJZGJnKCJQSFlTX0FERFI6IHk9IDB4JVggIGNiPSAweCVYIGNyPSAweCVYIHJldD0gJWQiLApAQCAtNDk4LDcgKzQ4Myw3IEBACiB9CiAKIC8qIFNldCBvcmRlciBmb3IgMSBhbmQgMiBwbGFuZSBZQ0JDUiA0OjI6MiBmb3JtYXRzLiAqLwotc3RhdGljIHZvaWQgZmltY19zZXRfeXV2X29yZGVyKHN0cnVjdCBmaW1jX2N0eCAqY3R4KQordm9pZCBmaW1jX3NldF95dXZfb3JkZXIoc3RydWN0IGZpbWNfY3R4ICpjdHgpCiB7CiAJLyogVGhlIG9uZSBvbmx5IG1vZGUgc3VwcG9ydGVkIGluIFNvQy4gKi8KIAljdHgtPmluX29yZGVyXzJwID0gUzVQX0ZJTUNfTFNCX0NSQ0I7CkBAIC01NDAsNyArNTI1LDcgQEAKIAlkYmcoImN0eC0+b3V0X29yZGVyXzFwPSAlZCIsIGN0eC0+b3V0X29yZGVyXzFwKTsKIH0KIAotc3RhdGljIHZvaWQgZmltY19wcmVwYXJlX2RtYV9vZmZzZXQoc3RydWN0IGZpbWNfY3R4ICpjdHgsIHN0cnVjdCBmaW1jX2ZyYW1lICpmKQordm9pZCBmaW1jX3ByZXBhcmVfZG1hX29mZnNldChzdHJ1Y3QgZmltY19jdHggKmN0eCwgc3RydWN0IGZpbWNfZnJhbWUgKmYpCiB7CiAJc3RydWN0IHNhbXN1bmdfZmltY192YXJpYW50ICp2YXJpYW50ID0gY3R4LT5maW1jX2Rldi0+dmFyaWFudDsKIAl1MzIgaSwgZGVwdGggPSAwOwpAQCAtNjA2LDkgKzU5MSw2IEBACiAJCWZpbWNfc2V0X3l1dl9vcmRlcihjdHgpOwogCX0KIAotCS8qIElucHV0IERNQSBtb2RlIGlzIG5vdCBhbGxvd2VkIHdoZW4gdGhlIHNjYWxlciBpcyBkaXNhYmxlZC4gKi8KLQljdHgtPnNjYWxlci5lbmFibGVkID0gMTsKLQogCWlmIChmbGFncyAmIEZJTUNfU1JDX0FERFIpIHsKIAkJdmIgPSB2NGwyX20ybV9uZXh0X3NyY19idWYoY3R4LT5tMm1fY3R4KTsKIAkJcmV0ID0gZmltY19wcmVwYXJlX2FkZHIoY3R4LCB2Yiwgc19mcmFtZSwgJnNfZnJhbWUtPnBhZGRyKTsKQEAgLTYzNSwxMCArNjE3LDEwIEBACiAJCXJldHVybjsKIAogCWZpbWMgPSBjdHgtPmZpbWNfZGV2OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+c2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKIAlzZXRfYml0KFNUX00yTV9QRU5ELCAmZmltYy0+c3RhdGUpOwogCisJc3Bpbl9sb2NrKCZjdHgtPnNsb2NrKTsKIAljdHgtPnN0YXRlIHw9IChGSU1DX1NSQ19BRERSIHwgRklNQ19EU1RfQUREUik7CiAJcmV0ID0gZmltY19wcmVwYXJlX2NvbmZpZyhjdHgsIGN0eC0+c3RhdGUpOwogCWlmIChyZXQpCkBAIC02NDksOCArNjMxLDYgQEAKIAkJY3R4LT5zdGF0ZSB8PSBGSU1DX1BBUkFNUzsKIAkJZmltYy0+bTJtLmN0eCA9IGN0eDsKIAl9Ci0KLQlzcGluX2xvY2soJmZpbWMtPnNsb2NrKTsKIAlmaW1jX2h3X3NldF9pbnB1dF9hZGRyKGZpbWMsICZjdHgtPnNfZnJhbWUucGFkZHIpOwogCiAJaWYgKGN0eC0+c3RhdGUgJiBGSU1DX1BBUkFNUykgewpAQCAtNjY1LDcgKzY0NSw3IEBACiAJCWZpbWNfaHdfc2V0X21haW5zY2FsZXIoY3R4KTsKIAkJZmltY19od19zZXRfdGFyZ2V0X2Zvcm1hdChjdHgpOwogCQlmaW1jX2h3X3NldF9yb3RhdGlvbihjdHgpOwotCQlmaW1jX2h3X3NldF9lZmZlY3QoY3R4KTsKKwkJZmltY19od19zZXRfZWZmZWN0KGN0eCwgZmFsc2UpOwogCX0KIAogCWZpbWNfaHdfc2V0X291dHB1dF9wYXRoKGN0eCk7CkBAIC02ODAsMTAgKzY2MCw5IEBACiAJY3R4LT5zdGF0ZSAmPSAoRklNQ19DVFhfTTJNIHwgRklNQ19DVFhfQ0FQIHwKIAkJICAgICAgIEZJTUNfU1JDX0ZNVCB8IEZJTUNfRFNUX0ZNVCk7CiAJZmltY19od19hY3RpdmF0ZV9pbnB1dF9kbWEoZmltYywgdHJ1ZSk7Ci0Jc3Bpbl91bmxvY2soJmZpbWMtPnNsb2NrKTsKLQogZG1hX3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPnNsb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2soJmN0eC0+c2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGZpbWNfam9iX2Fib3J0KHZvaWQgKnByaXYpCkBAIC02OTEsOSArNjcwLDkgQEAKIAlmaW1jX20ybV9zaHV0ZG93bihwcml2KTsKIH0KIAotc3RhdGljIGludCBmaW1jX3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKm51bV9idWZmZXJzLAotCQkJICAgIHVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAotCQkJICAgIHZvaWQgKmFsbG9jYXRvcnNbXSkKK3N0YXRpYyBpbnQgZmltY19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCisJCQkgICAgdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywgdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLAorCQkJICAgIHVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY2F0b3JzW10pCiB7CiAJc3RydWN0IGZpbWNfY3R4ICpjdHggPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKIAlzdHJ1Y3QgZmltY19mcmFtZSAqZjsKQEAgLTc2MiwxNjcgKzc0MSwyMDUgQEAKIAkud2FpdF9wcmVwYXJlCSA9IGZpbWNfdW5sb2NrLAogCS53YWl0X2ZpbmlzaAkgPSBmaW1jX2xvY2ssCiAJLnN0b3Bfc3RyZWFtaW5nCSA9IHN0b3Bfc3RyZWFtaW5nLAorCS5zdGFydF9zdHJlYW1pbmcgPSBzdGFydF9zdHJlYW1pbmcsCiB9OwogCi1zdGF0aWMgaW50IGZpbWNfbTJtX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQorLyoKKyAqIFY0TDIgY29udHJvbHMgaGFuZGxpbmcKKyAqLworI2RlZmluZSBjdHJsX3RvX2N0eChfX2N0cmwpIFwKKwljb250YWluZXJfb2YoKF9fY3RybCktPmhhbmRsZXIsIHN0cnVjdCBmaW1jX2N0eCwgY3RybF9oYW5kbGVyKQorCitzdGF0aWMgaW50IGZpbWNfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBjdHJsX3RvX2N0eChjdHJsKTsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OworCXN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCAqdmFyaWFudCA9IGZpbWMtPnZhcmlhbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0hGTElQOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5zbG9jaywgZmxhZ3MpOworCQljdHgtPmhmbGlwID0gY3RybC0+dmFsOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPnNsb2NrLCBmbGFncyk7CisJCWN0eC0+dmZsaXAgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9ST1RBVEU6CisJCWlmIChmaW1jX2NhcHR1cmVfcGVuZGluZyhmaW1jKSB8fAorCQkgICAgZmltY19jdHhfc3RhdGVfaXNfc2V0KEZJTUNfRFNUX0ZNVCB8IEZJTUNfU1JDX0ZNVCwgY3R4KSkgeworCQkJcmV0ID0gZmltY19jaGVja19zY2FsZXJfcmF0aW8oY3R4LCBjdHgtPnNfZnJhbWUud2lkdGgsCisJCQkJCWN0eC0+c19mcmFtZS5oZWlnaHQsIGN0eC0+ZF9mcmFtZS53aWR0aCwKKwkJCQkJY3R4LT5kX2ZyYW1lLmhlaWdodCwgY3RybC0+dmFsKTsKKwkJfQorCQlpZiAocmV0KSB7CisJCQl2NGwyX2VycihmaW1jLT5tMm0udmZkLCAiT3V0IG9mIHNjYWxlciByYW5nZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoKGN0cmwtPnZhbCA9PSA5MCB8fCBjdHJsLT52YWwgPT0gMjcwKSAmJgorCQkgICAgIXZhcmlhbnQtPmhhc19vdXRfcm90KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPnNsb2NrLCBmbGFncyk7CisJCWN0eC0+cm90YXRpb24gPSBjdHJsLT52YWw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJdjRsMl9lcnIoZmltYy0+djRsMl9kZXYsICJJbnZhbGlkIGNvbnRyb2w6IDB4JVhcbiIsIGN0cmwtPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWN0eC0+c3RhdGUgfD0gRklNQ19QQVJBTVM7CisJc2V0X2JpdChTVF9DQVBUX0FQUExZX0NGRywgJmZpbWMtPnN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBmaW1jX2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBmaW1jX3NfY3RybCwKK307CisKK2ludCBmaW1jX2N0cmxzX2NyZWF0ZShzdHJ1Y3QgZmltY19jdHggKmN0eCkKK3sKKwlpZiAoY3R4LT5jdHJsc19yZHkpCisJCXJldHVybiAwOworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJmN0eC0+Y3RybF9oYW5kbGVyLCAzKTsKKworCWN0eC0+Y3RybF9yb3RhdGUgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmY3R4LT5jdHJsX2hhbmRsZXIsICZmaW1jX2N0cmxfb3BzLAorCQkJCSAgICAgVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCWN0eC0+Y3RybF9oZmxpcCA9IHY0bDJfY3RybF9uZXdfc3RkKCZjdHgtPmN0cmxfaGFuZGxlciwgJmZpbWNfY3RybF9vcHMsCisJCQkJICAgIFY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwljdHgtPmN0cmxfdmZsaXAgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmY3R4LT5jdHJsX2hhbmRsZXIsICZmaW1jX2N0cmxfb3BzLAorCQkJCSAgICBWNEwyX0NJRF9ST1RBVEUsIDAsIDI3MCwgOTAsIDApOworCWN0eC0+Y3RybHNfcmR5ID0gY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3IgPT0gMDsKKworCXJldHVybiBjdHgtPmN0cmxfaGFuZGxlci5lcnJvcjsKK30KKwordm9pZCBmaW1jX2N0cmxzX2RlbGV0ZShzdHJ1Y3QgZmltY19jdHggKmN0eCkKK3sKKwlpZiAoY3R4LT5jdHJsc19yZHkpIHsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmY3R4LT5jdHJsX2hhbmRsZXIpOworCQljdHgtPmN0cmxzX3JkeSA9IGZhbHNlOworCX0KK30KKwordm9pZCBmaW1jX2N0cmxzX2FjdGl2YXRlKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBib29sIGFjdGl2ZSkKK3sKKwlpZiAoIWN0eC0+Y3RybHNfcmR5KQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZjdHgtPmN0cmxfaGFuZGxlci5sb2NrKTsKKwl2NGwyX2N0cmxfYWN0aXZhdGUoY3R4LT5jdHJsX3JvdGF0ZSwgYWN0aXZlKTsKKwl2NGwyX2N0cmxfYWN0aXZhdGUoY3R4LT5jdHJsX2hmbGlwLCBhY3RpdmUpOworCXY0bDJfY3RybF9hY3RpdmF0ZShjdHgtPmN0cmxfdmZsaXAsIGFjdGl2ZSk7CisKKwlpZiAoYWN0aXZlKSB7CisJCWN0eC0+cm90YXRpb24gPSBjdHgtPmN0cmxfcm90YXRlLT52YWw7CisJCWN0eC0+aGZsaXAgICAgPSBjdHgtPmN0cmxfaGZsaXAtPnZhbDsKKwkJY3R4LT52ZmxpcCAgICA9IGN0eC0+Y3RybF92ZmxpcC0+dmFsOworCX0gZWxzZSB7CisJCWN0eC0+cm90YXRpb24gPSAwOworCQljdHgtPmhmbGlwICAgID0gMDsKKwkJY3R4LT52ZmxpcCAgICA9IDA7CisJfQorCW11dGV4X3VubG9jaygmY3R4LT5jdHJsX2hhbmRsZXIubG9jayk7Cit9CisKKy8qCisgKiBWNEwyIGlvY3RsIGhhbmRsZXJzCisgKi8KK3N0YXRpYyBpbnQgZmltY19tMm1fcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOwogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CiAKIAlzdHJuY3B5KGNhcC0+ZHJpdmVyLCBmaW1jLT5wZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5kcml2ZXIpIC0gMSk7CiAJc3RybmNweShjYXAtPmNhcmQsIGZpbWMtPnBkZXYtPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpIC0gMSk7CiAJY2FwLT5idXNfaW5mb1swXSA9IDA7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9TVFJFQU1JTkcgfAotCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUIHwKIAkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkUgfCBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBmaW1jX3ZpZGlvY19lbnVtX2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3N0YXRpYyBpbnQgZmltY19tMm1fZW51bV9mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQogewogCXN0cnVjdCBmaW1jX2ZtdCAqZm10OwogCi0JaWYgKGYtPmluZGV4ID49IEFSUkFZX1NJWkUoZmltY19mb3JtYXRzKSkKKwlmbXQgPSBmaW1jX2ZpbmRfZm9ybWF0KE5VTEwsIE5VTEwsIEZNVF9GTEFHU19NMk0sIGYtPmluZGV4KTsKKwlpZiAoIWZtdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmbXQgPSAmZmltY19mb3JtYXRzW2YtPmluZGV4XTsKIAlzdHJuY3B5KGYtPmRlc2NyaXB0aW9uLCBmbXQtPm5hbWUsIHNpemVvZihmLT5kZXNjcmlwdGlvbikgLSAxKTsKIAlmLT5waXhlbGZvcm1hdCA9IGZtdC0+Zm91cmNjOwotCiAJcmV0dXJuIDA7CiB9CiAKLWludCBmaW1jX3ZpZGlvY19nX2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK2ludCBmaW1jX2ZpbGxfZm9ybWF0KHN0cnVjdCBmaW1jX2ZyYW1lICpmcmFtZSwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKLQlzdHJ1Y3QgZmltY19mcmFtZSAqZnJhbWU7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeG07CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeG0gPSAmZi0+Zm10LnBpeF9tcDsKIAlpbnQgaTsKIAotCWZyYW1lID0gY3R4X2dldF9mcmFtZShjdHgsIGYtPnR5cGUpOwotCWlmIChJU19FUlIoZnJhbWUpKQotCQlyZXR1cm4gUFRSX0VSUihmcmFtZSk7Ci0KLQlwaXhtID0gJmYtPmZtdC5waXhfbXA7Ci0KLQlwaXhtLT53aWR0aAkJPSBmcmFtZS0+d2lkdGg7Ci0JcGl4bS0+aGVpZ2h0CQk9IGZyYW1lLT5oZWlnaHQ7Ci0JcGl4bS0+ZmllbGQJCT0gVjRMMl9GSUVMRF9OT05FOwotCXBpeG0tPnBpeGVsZm9ybWF0CT0gZnJhbWUtPmZtdC0+Zm91cmNjOwotCXBpeG0tPmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKLQlwaXhtLT5udW1fcGxhbmVzCT0gZnJhbWUtPmZtdC0+bWVtcGxhbmVzOworCXBpeG0tPndpZHRoID0gZnJhbWUtPm9fd2lkdGg7CisJcGl4bS0+aGVpZ2h0ID0gZnJhbWUtPm9faGVpZ2h0OworCXBpeG0tPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCXBpeG0tPnBpeGVsZm9ybWF0ID0gZnJhbWUtPmZtdC0+Zm91cmNjOworCXBpeG0tPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKKwlwaXhtLT5udW1fcGxhbmVzID0gZnJhbWUtPmZtdC0+bWVtcGxhbmVzOwogCiAJZm9yIChpID0gMDsgaSA8IHBpeG0tPm51bV9wbGFuZXM7ICsraSkgewotCQlpbnQgYnBsID0gZnJhbWUtPm9fd2lkdGg7Ci0KKwkJaW50IGJwbCA9IGZyYW1lLT5mX3dpZHRoOwogCQlpZiAoZnJhbWUtPmZtdC0+Y29scGxhbmVzID09IDEpIC8qIHBhY2tlZCBmb3JtYXRzICovCiAJCQlicGwgPSAoYnBsICogZnJhbWUtPmZtdC0+ZGVwdGhbMF0pIC8gODsKLQogCQlwaXhtLT5wbGFuZV9mbXRbaV0uYnl0ZXNwZXJsaW5lID0gYnBsOwotCiAJCXBpeG0tPnBsYW5lX2ZtdFtpXS5zaXplaW1hZ2UgPSAoZnJhbWUtPm9fd2lkdGggKgogCQkJZnJhbWUtPm9faGVpZ2h0ICogZnJhbWUtPmZtdC0+ZGVwdGhbaV0pIC8gODsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGZpbWNfZm10ICpmaW5kX2Zvcm1hdChzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYsIHVuc2lnbmVkIGludCBtYXNrKQordm9pZCBmaW1jX2ZpbGxfZnJhbWUoc3RydWN0IGZpbWNfZnJhbWUgKmZyYW1lLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IGZpbWNfZm10ICpmbXQ7Ci0JdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeG0gPSAmZi0+Zm10LnBpeF9tcDsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZpbWNfZm9ybWF0cyk7ICsraSkgewotCQlmbXQgPSAmZmltY19mb3JtYXRzW2ldOwotCQlpZiAoZm10LT5mb3VyY2MgPT0gZi0+Zm10LnBpeF9tcC5waXhlbGZvcm1hdCAmJgotCQkgICAoZm10LT5mbGFncyAmIG1hc2spKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChpID09IEFSUkFZX1NJWkUoZmltY19mb3JtYXRzKSkgPyBOVUxMIDogZm10OworCWZyYW1lLT5mX3dpZHRoICA9IHBpeG0tPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmU7CisJaWYgKGZyYW1lLT5mbXQtPmNvbHBsYW5lcyA9PSAxKQorCQlmcmFtZS0+Zl93aWR0aCA9IChmcmFtZS0+Zl93aWR0aCAqIDgpIC8gZnJhbWUtPmZtdC0+ZGVwdGhbMF07CisJZnJhbWUtPmZfaGVpZ2h0CT0gcGl4bS0+aGVpZ2h0OworCWZyYW1lLT53aWR0aCAgICA9IHBpeG0tPndpZHRoOworCWZyYW1lLT5oZWlnaHQgICA9IHBpeG0tPmhlaWdodDsKKwlmcmFtZS0+b193aWR0aCAgPSBwaXhtLT53aWR0aDsKKwlmcmFtZS0+b19oZWlnaHQgPSBwaXhtLT5oZWlnaHQ7CisJZnJhbWUtPm9mZnNfaCAgID0gMDsKKwlmcmFtZS0+b2Zmc192ICAgPSAwOwogfQogCi1zdHJ1Y3QgZmltY19mbXQgKmZpbmRfbWJ1c19mb3JtYXQoc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZiwKLQkJCQkgIHVuc2lnbmVkIGludCBtYXNrKQorLyoqCisgKiBmaW1jX2FkanVzdF9tcGxhbmVfZm9ybWF0IC0gYWRqdXN0IGJ5dGVzcGVybGluZS9zaXplaW1hZ2UgZm9yIGVhY2ggcGxhbmUKKyAqIEBmbXQ6IGZpbWMgcGl4ZWwgZm9ybWF0IGRlc2NyaXB0aW9uIChpbnB1dCkKKyAqIEB3aWR0aDogcmVxdWVzdGVkIHBpeGVsIHdpZHRoCisgKiBAaGVpZ2h0OiByZXF1ZXN0ZWQgcGl4ZWwgaGVpZ2h0CisgKiBAcGl4OiBtdWx0aS1wbGFuZSBmb3JtYXQgdG8gYWRqdXN0CisgKi8KK3ZvaWQgZmltY19hZGp1c3RfbXBsYW5lX2Zvcm1hdChzdHJ1Y3QgZmltY19mbXQgKmZtdCwgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0LAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXgpCiB7Ci0Jc3RydWN0IGZpbWNfZm10ICpmbXQ7Ci0JdW5zaWduZWQgaW50IGk7CisJdTMyIGJ5dGVzcGVybGluZSA9IDA7CisJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmaW1jX2Zvcm1hdHMpOyArK2kpIHsKLQkJZm10ID0gJmZpbWNfZm9ybWF0c1tpXTsKLQkJaWYgKGZtdC0+bWJ1c19jb2RlID09IGYtPmNvZGUgJiYgKGZtdC0+ZmxhZ3MgJiBtYXNrKSkKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiAoaSA9PSBBUlJBWV9TSVpFKGZpbWNfZm9ybWF0cykpID8gTlVMTCA6IGZtdDsKLX0KLQotCi1pbnQgZmltY192aWRpb2NfdHJ5X2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwotCXN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCAqdmFyaWFudCA9IGZpbWMtPnZhcmlhbnQ7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeCA9ICZmLT5mbXQucGl4X21wOwotCXN0cnVjdCBmaW1jX2ZtdCAqZm10OwotCXUzMiBtYXhfd2lkdGgsIG1vZF94LCBtb2RfeSwgbWFzazsKLQlpbnQgaSwgaXNfb3V0cHV0ID0gMDsKLQotCi0JaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7Ci0JCWlmIChmaW1jX2N0eF9zdGF0ZV9pc19zZXQoRklNQ19DVFhfQ0FQLCBjdHgpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlzX291dHB1dCA9IDE7Ci0JfSBlbHNlIGlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGJnKCJ3OiAlZCwgaDogJWQiLCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7Ci0KLQltYXNrID0gaXNfb3V0cHV0ID8gRk1UX0ZMQUdTX00yTSA6IEZNVF9GTEFHU19NMk0gfCBGTVRfRkxBR1NfQ0FNOwotCWZtdCA9IGZpbmRfZm9ybWF0KGYsIG1hc2spOwotCWlmICghZm10KSB7Ci0JCXY0bDJfZXJyKCZmaW1jLT5tMm0udjRsMl9kZXYsICJGb3VyY2MgZm9ybWF0ICgweCVYKSBpbnZhbGlkLlxuIiwKLQkJCSBwaXgtPnBpeGVsZm9ybWF0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHBpeC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpCi0JCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JZWxzZSBpZiAoVjRMMl9GSUVMRF9OT05FICE9IHBpeC0+ZmllbGQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGlzX291dHB1dCkgewotCQltYXhfd2lkdGggPSB2YXJpYW50LT5waXhfbGltaXQtPnNjYWxlcl9kaXNfdzsKLQkJbW9kX3ggPSBmZnModmFyaWFudC0+bWluX2lucF9waXhzaXplKSAtIDE7Ci0JfSBlbHNlIHsKLQkJbWF4X3dpZHRoID0gdmFyaWFudC0+cGl4X2xpbWl0LT5vdXRfcm90X2Rpc193OwotCQltb2RfeCA9IGZmcyh2YXJpYW50LT5taW5fb3V0X3BpeHNpemUpIC0gMTsKLQl9Ci0KLQlpZiAodGlsZWRfZm10KGZtdCkpIHsKLQkJbW9kX3ggPSA2OyAvKiA2NCB4IDMyIHBpeGVscyB0aWxlICovCi0JCW1vZF95ID0gNTsKLQl9IGVsc2UgewotCQlpZiAoZmltYy0+aWQgPT0gMSAmJiB2YXJpYW50LT5waXhfaG9mZikKLQkJCW1vZF95ID0gZmltY19mbXRfaXNfcmdiKGZtdC0+Y29sb3IpID8gMCA6IDE7Ci0JCWVsc2UKLQkJCW1vZF95ID0gbW9kX3g7Ci0JfQotCi0JZGJnKCJtb2RfeDogJWQsIG1vZF95OiAlZCwgbWF4X3c6ICVkIiwgbW9kX3gsIG1vZF95LCBtYXhfd2lkdGgpOwotCi0JdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZwaXgtPndpZHRoLCAxNiwgbWF4X3dpZHRoLCBtb2RfeCwKLQkJJnBpeC0+aGVpZ2h0LCA4LCB2YXJpYW50LT5waXhfbGltaXQtPnNjYWxlcl9kaXNfdywgbW9kX3ksIDApOwotCi0JcGl4LT5udW1fcGxhbmVzID0gZm10LT5tZW1wbGFuZXM7CiAJcGl4LT5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7Ci0KKwlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCXBpeC0+bnVtX3BsYW5lcyA9IGZtdC0+bWVtcGxhbmVzOworCXBpeC0+aGVpZ2h0ID0gaGVpZ2h0OworCXBpeC0+d2lkdGggPSB3aWR0aDsKIAogCWZvciAoaSA9IDA7IGkgPCBwaXgtPm51bV9wbGFuZXM7ICsraSkgewogCQl1MzIgYnBsID0gcGl4LT5wbGFuZV9mbXRbaV0uYnl0ZXNwZXJsaW5lOwpAQCAtOTM2LDQ4ICs5NTMsMTQyIEBACiAJCQlicGwgPSAocGl4LT53aWR0aCAqIGZtdC0+ZGVwdGhbMF0pIC8gODsKIAogCQlpZiAoaSA9PSAwKSAvKiBTYW1lIGJ5dGVzcGVybGluZSBmb3IgZWFjaCBwbGFuZS4gKi8KLQkJCW1vZF94ID0gYnBsOworCQkJYnl0ZXNwZXJsaW5lID0gYnBsOwogCi0JCXBpeC0+cGxhbmVfZm10W2ldLmJ5dGVzcGVybGluZSA9IG1vZF94OworCQlwaXgtPnBsYW5lX2ZtdFtpXS5ieXRlc3BlcmxpbmUgPSBieXRlc3BlcmxpbmU7CiAJCSpzaXplaW1hZ2UgPSAocGl4LT53aWR0aCAqIHBpeC0+aGVpZ2h0ICogZm10LT5kZXB0aFtpXSkgLyA4OwogCX0KK30KIAorc3RhdGljIGludCBmaW1jX20ybV9nX2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOworCXN0cnVjdCBmaW1jX2ZyYW1lICpmcmFtZSA9IGN0eF9nZXRfZnJhbWUoY3R4LCBmLT50eXBlKTsKKworCWlmIChJU19FUlIoZnJhbWUpKQorCQlyZXR1cm4gUFRSX0VSUihmcmFtZSk7CisKKwlyZXR1cm4gZmltY19maWxsX2Zvcm1hdChmcmFtZSwgZik7Cit9CisKKy8qKgorICogZmltY19maW5kX2Zvcm1hdCAtIGxvb2t1cCBmaW1jIGNvbG9yIGZvcm1hdCBieSBmb3VyY2Mgb3IgbWVkaWEgYnVzIGZvcm1hdAorICogQHBpeGVsZm9ybWF0OiBmb3VyY2MgdG8gbWF0Y2gsIGlnbm9yZWQgaWYgbnVsbAorICogQG1idXNfY29kZTogbWVkaWEgYnVzIGNvZGUgdG8gbWF0Y2gsIGlnbm9yZWQgaWYgbnVsbAorICogQG1hc2s6IHRoZSBjb2xvciBmbGFncyB0byBtYXRjaAorICogQGluZGV4OiBvZmZzZXQgaW4gdGhlIGZpbWNfZm9ybWF0cyBhcnJheSwgaWdub3JlZCBpZiBuZWdhdGl2ZQorICovCitzdHJ1Y3QgZmltY19mbXQgKmZpbWNfZmluZF9mb3JtYXQodTMyICpwaXhlbGZvcm1hdCwgdTMyICptYnVzX2NvZGUsCisJCQkJICB1bnNpZ25lZCBpbnQgbWFzaywgaW50IGluZGV4KQoreworCXN0cnVjdCBmaW1jX2ZtdCAqZm10LCAqZGVmX2ZtdCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGlkID0gMDsKKworCWlmIChpbmRleCA+PSBBUlJBWV9TSVpFKGZpbWNfZm9ybWF0cykpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmltY19mb3JtYXRzKTsgKytpKSB7CisJCWZtdCA9ICZmaW1jX2Zvcm1hdHNbaV07CisJCWlmICghKGZtdC0+ZmxhZ3MgJiBtYXNrKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGl4ZWxmb3JtYXQgJiYgZm10LT5mb3VyY2MgPT0gKnBpeGVsZm9ybWF0KQorCQkJcmV0dXJuIGZtdDsKKwkJaWYgKG1idXNfY29kZSAmJiBmbXQtPm1idXNfY29kZSA9PSAqbWJ1c19jb2RlKQorCQkJcmV0dXJuIGZtdDsKKwkJaWYgKGluZGV4ID09IGlkKQorCQkJZGVmX2ZtdCA9IGZtdDsKKwkJaWQrKzsKKwl9CisJcmV0dXJuIGRlZl9mbXQ7Cit9CisKK3N0YXRpYyBpbnQgZmltY190cnlfZm10X21wbGFuZShzdHJ1Y3QgZmltY19jdHggKmN0eCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CisJc3RydWN0IHNhbXN1bmdfZmltY192YXJpYW50ICp2YXJpYW50ID0gZmltYy0+dmFyaWFudDsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4ID0gJmYtPmZtdC5waXhfbXA7CisJc3RydWN0IGZpbWNfZm10ICpmbXQ7CisJdTMyIG1heF93LCBtb2RfeCwgbW9kX3k7CisKKwlpZiAoIUlTX00yTShmLT50eXBlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYmcoInc6ICVkLCBoOiAlZCIsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKworCWZtdCA9IGZpbWNfZmluZF9mb3JtYXQoJnBpeC0+cGl4ZWxmb3JtYXQsIE5VTEwsIEZNVF9GTEFHU19NMk0sIDApOworCWlmIChXQVJOKGZtdCA9PSBOVUxMLCAiUGl4ZWwgZm9ybWF0IGxvb2t1cCBmYWlsZWQiKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGl4LT5maWVsZCA9PSBWNEwyX0ZJRUxEX0FOWSkKKwkJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwllbHNlIGlmIChwaXgtPmZpZWxkICE9IFY0TDJfRklFTERfTk9ORSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJbWF4X3cgPSB2YXJpYW50LT5waXhfbGltaXQtPnNjYWxlcl9kaXNfdzsKKwkJbW9kX3ggPSBmZnModmFyaWFudC0+bWluX2lucF9waXhzaXplKSAtIDE7CisJfSBlbHNlIHsKKwkJbWF4X3cgPSB2YXJpYW50LT5waXhfbGltaXQtPm91dF9yb3RfZGlzX3c7CisJCW1vZF94ID0gZmZzKHZhcmlhbnQtPm1pbl9vdXRfcGl4c2l6ZSkgLSAxOworCX0KKworCWlmICh0aWxlZF9mbXQoZm10KSkgeworCQltb2RfeCA9IDY7IC8qIDY0IHggMzIgcGl4ZWxzIHRpbGUgKi8KKwkJbW9kX3kgPSA1OworCX0gZWxzZSB7CisJCWlmIChmaW1jLT5pZCA9PSAxICYmIHZhcmlhbnQtPnBpeF9ob2ZmKQorCQkJbW9kX3kgPSBmaW1jX2ZtdF9pc19yZ2IoZm10LT5jb2xvcikgPyAwIDogMTsKKwkJZWxzZQorCQkJbW9kX3kgPSBtb2RfeDsKKwl9CisJZGJnKCJtb2RfeDogJWQsIG1vZF95OiAlZCwgbWF4X3c6ICVkIiwgbW9kX3gsIG1vZF95LCBtYXhfdyk7CisKKwl2NGxfYm91bmRfYWxpZ25faW1hZ2UoJnBpeC0+d2lkdGgsIDE2LCBtYXhfdywgbW9kX3gsCisJCSZwaXgtPmhlaWdodCwgOCwgdmFyaWFudC0+cGl4X2xpbWl0LT5zY2FsZXJfZGlzX3csIG1vZF95LCAwKTsKKworCWZpbWNfYWRqdXN0X21wbGFuZV9mb3JtYXQoZm10LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCwgJmYtPmZtdC5waXhfbXApOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZpbWNfbTJtX3NfZm10X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKK3N0YXRpYyBpbnQgZmltY19tMm1fdHJ5X2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCSAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CisKKwlyZXR1cm4gZmltY190cnlfZm10X21wbGFuZShjdHgsIGYpOworfQorCitzdGF0aWMgaW50IGZpbWNfbTJtX3NfZm10X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCiAJCQkJIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOwogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CiAJc3RydWN0IHZiMl9xdWV1ZSAqdnE7CiAJc3RydWN0IGZpbWNfZnJhbWUgKmZyYW1lOwogCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXg7CiAJaW50IGksIHJldCA9IDA7CiAKLQlyZXQgPSBmaW1jX3ZpZGlvY190cnlfZm10X21wbGFuZShmaWxlLCBwcml2LCBmKTsKKwlyZXQgPSBmaW1jX3RyeV9mbXRfbXBsYW5lKGN0eCwgZik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXZxID0gdjRsMl9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwgZi0+dHlwZSk7CiAKIAlpZiAodmIyX2lzX2J1c3kodnEpKSB7Ci0JCXY0bDJfZXJyKCZmaW1jLT5tMm0udjRsMl9kZXYsICJxdWV1ZSAoJWQpIGJ1c3lcbiIsIGYtPnR5cGUpOworCQl2NGwyX2VycihmaW1jLT5tMm0udmZkLCAicXVldWUgKCVkKSBidXN5XG4iLCBmLT50eXBlKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwlpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCiAJCWZyYW1lID0gJmN0eC0+c19mcmFtZTsKLQl9IGVsc2UgaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCWVsc2UKIAkJZnJhbWUgPSAmY3R4LT5kX2ZyYW1lOwotCX0gZWxzZSB7Ci0JCXY0bDJfZXJyKCZmaW1jLT5tMm0udjRsMl9kZXYsCi0JCQkgIldyb25nIGJ1ZmZlci92aWRlbyBxdWV1ZSB0eXBlICglZClcbiIsIGYtPnR5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlwaXggPSAmZi0+Zm10LnBpeF9tcDsKLQlmcmFtZS0+Zm10ID0gZmluZF9mb3JtYXQoZiwgRk1UX0ZMQUdTX00yTSk7CisJZnJhbWUtPmZtdCA9IGZpbWNfZmluZF9mb3JtYXQoJnBpeC0+cGl4ZWxmb3JtYXQsIE5VTEwsCisJCQkJICAgICAgRk1UX0ZMQUdTX00yTSwgMCk7CiAJaWYgKCFmcmFtZS0+Zm10KQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtOTg2LDE1ICsxMDk3LDkgQEAKIAkJCShwaXgtPndpZHRoICogcGl4LT5oZWlnaHQgKiBmcmFtZS0+Zm10LT5kZXB0aFtpXSkgLyA4OwogCX0KIAotCWZyYW1lLT5mX3dpZHRoCT0gcGl4LT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lICogOCAvCi0JCWZyYW1lLT5mbXQtPmRlcHRoWzBdOwotCWZyYW1lLT5mX2hlaWdodAk9IHBpeC0+aGVpZ2h0OwotCWZyYW1lLT53aWR0aAk9IHBpeC0+d2lkdGg7Ci0JZnJhbWUtPmhlaWdodAk9IHBpeC0+aGVpZ2h0OwotCWZyYW1lLT5vX3dpZHRoCT0gcGl4LT53aWR0aDsKLQlmcmFtZS0+b19oZWlnaHQgPSBwaXgtPmhlaWdodDsKLQlmcmFtZS0+b2Zmc19oCT0gMDsKLQlmcmFtZS0+b2Zmc192CT0gMDsKKwlmaW1jX2ZpbGxfZnJhbWUoZnJhbWUsIGYpOworCisJY3R4LT5zY2FsZXIuZW5hYmxlZCA9IDE7CiAKIAlpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQogCQlmaW1jX2N0eF9zdGF0ZV9sb2NrX3NldChGSU1DX1BBUkFNUyB8IEZJTUNfRFNUX0ZNVCwgY3R4KTsKQEAgLTEwMDYsMzkgKzExMTEsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmaW1jX20ybV9yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxYnVmcykKK3N0YXRpYyBpbnQgZmltY19tMm1fcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKKwogCXJldHVybiB2NGwyX20ybV9yZXFidWZzKGZpbGUsIGN0eC0+bTJtX2N0eCwgcmVxYnVmcyk7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19tMm1fcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3N0YXRpYyBpbnQgZmltY19tMm1fcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOworCiAJcmV0dXJuIHY0bDJfbTJtX3F1ZXJ5YnVmKGZpbGUsIGN0eC0+bTJtX2N0eCwgYnVmKTsKIH0KIAotc3RhdGljIGludCBmaW1jX20ybV9xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3N0YXRpYyBpbnQgZmltY19tMm1fcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKIAogCXJldHVybiB2NGwyX20ybV9xYnVmKGZpbGUsIGN0eC0+bTJtX2N0eCwgYnVmKTsKIH0KIAotc3RhdGljIGludCBmaW1jX20ybV9kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQorc3RhdGljIGludCBmaW1jX20ybV9kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CisKIAlyZXR1cm4gdjRsMl9tMm1fZHFidWYoZmlsZSwgY3R4LT5tMm1fY3R4LCBidWYpOwogfQogCi1zdGF0aWMgaW50IGZpbWNfbTJtX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCitzdGF0aWMgaW50IGZpbWNfbTJtX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCSAgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKIAogCS8qIFRoZSBzb3VyY2UgYW5kIHRhcmdldCBjb2xvciBmb3JtYXQgbmVlZCB0byBiZSBzZXQgKi8KIAlpZiAoVjRMMl9UWVBFX0lTX09VVFBVVCh0eXBlKSkgewpAQCAtMTA1MSwxNDkgKzExNTksMTkgQEAKIAlyZXR1cm4gdjRsMl9tMm1fc3RyZWFtb24oZmlsZSwgY3R4LT5tMm1fY3R4LCB0eXBlKTsKIH0KIAotc3RhdGljIGludCBmaW1jX20ybV9zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCitzdGF0aWMgaW50IGZpbWNfbTJtX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCiAJCQkgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKKwogCXJldHVybiB2NGwyX20ybV9zdHJlYW1vZmYoZmlsZSwgY3R4LT5tMm1fY3R4LCB0eXBlKTsKIH0KIAotaW50IGZpbWNfdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQotewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKLQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmM7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQljID0gZ2V0X2N0cmwocWMtPmlkKTsKLQlpZiAoYykgewotCQkqcWMgPSAqYzsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGZpbWNfY3R4X3N0YXRlX2lzX3NldChGSU1DX0NUWF9DQVAsIGN0eCkpIHsKLQkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoY3R4LT5maW1jX2Rldi0+dmlkX2NhcC5zZCwKLQkJCQkJY29yZSwgcXVlcnljdHJsLCBxYyk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBmaW1jX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKLQotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQljdHJsLT52YWx1ZSA9IChGTElQX1hfQVhJUyAmIGN0eC0+ZmxpcCkgPyAxIDogMDsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJY3RybC0+dmFsdWUgPSAoRkxJUF9ZX0FYSVMgJiBjdHgtPmZsaXApID8gMSA6IDA7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfUk9UQVRFOgotCQljdHJsLT52YWx1ZSA9IGN0eC0+cm90YXRpb247Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmIChmaW1jX2N0eF9zdGF0ZV9pc19zZXQoRklNQ19DVFhfQ0FQLCBjdHgpKSB7Ci0JCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChmaW1jLT52aWRfY2FwLnNkLCBjb3JlLAotCQkJCQkJZ19jdHJsLCBjdHJsKTsKLQkJfSBlbHNlIHsKLQkJCXY0bDJfZXJyKCZmaW1jLT5tMm0udjRsMl9kZXYsICJJbnZhbGlkIGNvbnRyb2xcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0JZGJnKCJjdHJsLT52YWx1ZT0gJWQiLCBjdHJsLT52YWx1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGNoZWNrX2N0cmxfdmFsKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmM7Ci0JYyA9IGdldF9jdHJsKGN0cmwtPmlkKTsKLQlpZiAoIWMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGN0cmwtPnZhbHVlIDwgYy0+bWluaW11bSB8fCBjdHJsLT52YWx1ZSA+IGMtPm1heGltdW0KLQkJfHwgKGMtPnN0ZXAgIT0gMCAmJiBjdHJsLT52YWx1ZSAlIGMtPnN0ZXAgIT0gMCkpIHsKLQkJdjRsMl9lcnIoJmN0eC0+ZmltY19kZXYtPm0ybS52NGwyX2RldiwKLQkJIkludmFsaWQgY29udHJvbCB2YWx1ZVxuIik7Ci0JCXJldHVybiAtRVJBTkdFOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgZmltY19zX2N0cmwoc3RydWN0IGZpbWNfY3R4ICpjdHgsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHNhbXN1bmdfZmltY192YXJpYW50ICp2YXJpYW50ID0gY3R4LT5maW1jX2Rldi0+dmFyaWFudDsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCWlmIChjdHJsLT52YWx1ZSkKLQkJCWN0eC0+ZmxpcCB8PSBGTElQX1hfQVhJUzsKLQkJZWxzZQotCQkJY3R4LT5mbGlwICY9IH5GTElQX1hfQVhJUzsKLQkJYnJlYWs7Ci0KLQljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQlpZiAoY3RybC0+dmFsdWUpCi0JCQljdHgtPmZsaXAgfD0gRkxJUF9ZX0FYSVM7Ci0JCWVsc2UKLQkJCWN0eC0+ZmxpcCAmPSB+RkxJUF9ZX0FYSVM7Ci0JCWJyZWFrOwotCi0JY2FzZSBWNEwyX0NJRF9ST1RBVEU6Ci0JCWlmIChmaW1jX2N0eF9zdGF0ZV9pc19zZXQoRklNQ19EU1RfRk1UIHwgRklNQ19TUkNfRk1ULCBjdHgpKSB7Ci0JCQlyZXQgPSBmaW1jX2NoZWNrX3NjYWxlcl9yYXRpbyhjdHgtPnNfZnJhbWUud2lkdGgsCi0JCQkJCWN0eC0+c19mcmFtZS5oZWlnaHQsIGN0eC0+ZF9mcmFtZS53aWR0aCwKLQkJCQkJY3R4LT5kX2ZyYW1lLmhlaWdodCwgY3RybC0+dmFsdWUpOwotCQl9Ci0KLQkJaWYgKHJldCkgewotCQkJdjRsMl9lcnIoJmZpbWMtPm0ybS52NGwyX2RldiwgIk91dCBvZiBzY2FsZXIgcmFuZ2VcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKiBDaGVjayBmb3IgdGhlIG91dHB1dCByb3RhdG9yIGF2YWlsYWJpbGl0eSAqLwotCQlpZiAoKGN0cmwtPnZhbHVlID09IDkwIHx8IGN0cmwtPnZhbHVlID09IDI3MCkgJiYKLQkJICAgIChjdHgtPmluX3BhdGggPT0gRklNQ19ETUEgJiYgIXZhcmlhbnQtPmhhc19vdXRfcm90KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQljdHgtPnJvdGF0aW9uID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJdjRsMl9lcnIoJmZpbWMtPm0ybS52NGwyX2RldiwgIkludmFsaWQgY29udHJvbFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZpbWNfY3R4X3N0YXRlX2xvY2tfc2V0KEZJTUNfUEFSQU1TLCBjdHgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmltY19tMm1fc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBjaGVja19jdHJsX3ZhbChjdHgsIGN0cmwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBmaW1jX3NfY3RybChjdHgsIGN0cmwpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGZpbWNfbTJtX2Nyb3BjYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAotCQkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY3IpCisJCQkgICAgc3RydWN0IHY0bDJfY3JvcGNhcCAqY3IpCiB7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOwogCXN0cnVjdCBmaW1jX2ZyYW1lICpmcmFtZTsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoOwogCiAJZnJhbWUgPSBjdHhfZ2V0X2ZyYW1lKGN0eCwgY3ItPnR5cGUpOwogCWlmIChJU19FUlIoZnJhbWUpKQpAQCAtMTIwMSw4ICsxMTc5LDggQEAKIAogCWNyLT5ib3VuZHMubGVmdAkJPSAwOwogCWNyLT5ib3VuZHMudG9wCQk9IDA7Ci0JY3ItPmJvdW5kcy53aWR0aAk9IGZyYW1lLT5mX3dpZHRoOwotCWNyLT5ib3VuZHMuaGVpZ2h0CT0gZnJhbWUtPmZfaGVpZ2h0OworCWNyLT5ib3VuZHMud2lkdGgJPSBmcmFtZS0+b193aWR0aDsKKwljci0+Ym91bmRzLmhlaWdodAk9IGZyYW1lLT5vX2hlaWdodDsKIAljci0+ZGVmcmVjdAkJPSBjci0+Ym91bmRzOwogCiAJcmV0dXJuIDA7CkBAIC0xMjEwLDggKzExODgsOCBAQAogCiBzdGF0aWMgaW50IGZpbWNfbTJtX2dfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyKQogeworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKIAlzdHJ1Y3QgZmltY19mcmFtZSAqZnJhbWU7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlmcmFtZSA9IGN0eF9nZXRfZnJhbWUoY3R4LCBjci0+dHlwZSk7CiAJaWYgKElTX0VSUihmcmFtZSkpCkBAIC0xMjI1LDI2ICsxMjAzLDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBmaW1jX3RyeV9jcm9wKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBzdHJ1Y3QgdjRsMl9jcm9wICpjcikKK3N0YXRpYyBpbnQgZmltY19tMm1fdHJ5X2Nyb3Aoc3RydWN0IGZpbWNfY3R4ICpjdHgsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyKQogewogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CiAJc3RydWN0IGZpbWNfZnJhbWUgKmY7CiAJdTMyIG1pbl9zaXplLCBoYWxpZ24sIGRlcHRoID0gMDsKLQlib29sIGlzX2NhcHR1cmVfY3R4OwogCWludCBpOwogCiAJaWYgKGNyLT5jLnRvcCA8IDAgfHwgY3ItPmMubGVmdCA8IDApIHsKLQkJdjRsMl9lcnIoJmZpbWMtPm0ybS52NGwyX2RldiwKKwkJdjRsMl9lcnIoZmltYy0+bTJtLnZmZCwKIAkJCSJkb2Vzbid0IHN1cHBvcnQgbmVnYXRpdmUgdmFsdWVzIGZvciB0b3AgJiBsZWZ0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0JaXNfY2FwdHVyZV9jdHggPSBmaW1jX2N0eF9zdGF0ZV9pc19zZXQoRklNQ19DVFhfQ0FQLCBjdHgpOwotCiAJaWYgKGNyLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCi0JCWYgPSBpc19jYXB0dXJlX2N0eCA/ICZjdHgtPnNfZnJhbWUgOiAmY3R4LT5kX2ZyYW1lOwotCWVsc2UgaWYgKGNyLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSAmJgotCQkgIWlzX2NhcHR1cmVfY3R4KQorCQlmID0gJmN0eC0+ZF9mcmFtZTsKKwllbHNlIGlmIChjci0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCiAJCWYgPSAmY3R4LT5zX2ZyYW1lOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjUzLDE1ICsxMjI2LDEwIEBACiAJCWZpbWMtPnZhcmlhbnQtPm1pbl9pbnBfcGl4c2l6ZSA6IGZpbWMtPnZhcmlhbnQtPm1pbl9vdXRfcGl4c2l6ZTsKIAogCS8qIEdldCBwaXhlbCBhbGlnbm1lbnQgY29uc3RyYWludHMuICovCi0JaWYgKGlzX2NhcHR1cmVfY3R4KSB7Ci0JCW1pbl9zaXplID0gMTY7Ci0JCWhhbGlnbiA9IDQ7Ci0JfSBlbHNlIHsKLQkJaWYgKGZpbWMtPmlkID09IDEgJiYgZmltYy0+dmFyaWFudC0+cGl4X2hvZmYpCi0JCQloYWxpZ24gPSBmaW1jX2ZtdF9pc19yZ2IoZi0+Zm10LT5jb2xvcikgPyAwIDogMTsKLQkJZWxzZQotCQkJaGFsaWduID0gZmZzKG1pbl9zaXplKSAtIDE7Ci0JfQorCWlmIChmaW1jLT5pZCA9PSAxICYmIGZpbWMtPnZhcmlhbnQtPnBpeF9ob2ZmKQorCQloYWxpZ24gPSBmaW1jX2ZtdF9pc19yZ2IoZi0+Zm10LT5jb2xvcikgPyAwIDogMTsKKwllbHNlCisJCWhhbGlnbiA9IGZmcyhtaW5fc2l6ZSkgLSAxOwogCiAJZm9yIChpID0gMDsgaSA8IGYtPmZtdC0+Y29scGxhbmVzOyBpKyspCiAJCWRlcHRoICs9IGYtPmZtdC0+ZGVwdGhbaV07CkBAIC0xMjc4LDcgKzEyNDYsNyBAQAogCQljci0+Yy50b3AgPSBmLT5vX2hlaWdodCAtIGNyLT5jLmhlaWdodDsKIAogCWNyLT5jLmxlZnQgPSByb3VuZF9kb3duKGNyLT5jLmxlZnQsIG1pbl9zaXplKTsKLQljci0+Yy50b3AgID0gcm91bmRfZG93bihjci0+Yy50b3AsIGlzX2NhcHR1cmVfY3R4ID8gMTYgOiA4KTsKKwljci0+Yy50b3AgID0gcm91bmRfZG93bihjci0+Yy50b3AsIGZpbWMtPnZhcmlhbnQtPmhvcl9vZmZzX2FsaWduKTsKIAogCWRiZygibDolZCwgdDolZCwgdzolZCwgaDolZCwgZl93OiAlZCwgZl9oOiAlZCIsCiAJICAgIGNyLT5jLmxlZnQsIGNyLT5jLnRvcCwgY3ItPmMud2lkdGgsIGNyLT5jLmhlaWdodCwKQEAgLTEyODksMTIgKzEyNTcsMTIgQEAKIAogc3RhdGljIGludCBmaW1jX20ybV9zX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9jcm9wICpjcikKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CiAJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKIAlzdHJ1Y3QgZmltY19mcmFtZSAqZjsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZmltY190cnlfY3JvcChjdHgsIGNyKTsKKwlyZXQgPSBmaW1jX20ybV90cnlfY3JvcChjdHgsIGNyKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMzA0LDE4ICsxMjcyLDE2IEBACiAJLyogQ2hlY2sgdG8gc2VlIGlmIHNjYWxpbmcgcmF0aW8gaXMgd2l0aGluIHN1cHBvcnRlZCByYW5nZSAqLwogCWlmIChmaW1jX2N0eF9zdGF0ZV9pc19zZXQoRklNQ19EU1RfRk1UIHwgRklNQ19TUkNfRk1ULCBjdHgpKSB7CiAJCWlmIChjci0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKLQkJCXJldCA9IGZpbWNfY2hlY2tfc2NhbGVyX3JhdGlvKGNyLT5jLndpZHRoLCBjci0+Yy5oZWlnaHQsCi0JCQkJCQkgICAgICBjdHgtPmRfZnJhbWUud2lkdGgsCi0JCQkJCQkgICAgICBjdHgtPmRfZnJhbWUuaGVpZ2h0LAotCQkJCQkJICAgICAgY3R4LT5yb3RhdGlvbik7CisJCQlyZXQgPSBmaW1jX2NoZWNrX3NjYWxlcl9yYXRpbyhjdHgsIGNyLT5jLndpZHRoLAorCQkJCQljci0+Yy5oZWlnaHQsIGN0eC0+ZF9mcmFtZS53aWR0aCwKKwkJCQkJY3R4LT5kX2ZyYW1lLmhlaWdodCwgY3R4LT5yb3RhdGlvbik7CiAJCX0gZWxzZSB7Ci0JCQlyZXQgPSBmaW1jX2NoZWNrX3NjYWxlcl9yYXRpbyhjdHgtPnNfZnJhbWUud2lkdGgsCi0JCQkJCQkgICAgICBjdHgtPnNfZnJhbWUuaGVpZ2h0LAotCQkJCQkJICAgICAgY3ItPmMud2lkdGgsIGNyLT5jLmhlaWdodCwKLQkJCQkJCSAgICAgIGN0eC0+cm90YXRpb24pOworCQkJcmV0ID0gZmltY19jaGVja19zY2FsZXJfcmF0aW8oY3R4LCBjdHgtPnNfZnJhbWUud2lkdGgsCisJCQkJCWN0eC0+c19mcmFtZS5oZWlnaHQsIGNyLT5jLndpZHRoLAorCQkJCQljci0+Yy5oZWlnaHQsIGN0eC0+cm90YXRpb24pOwogCQl9CiAJCWlmIChyZXQpIHsKLQkJCXY0bDJfZXJyKCZmaW1jLT5tMm0udjRsMl9kZXYsICJPdXQgb2Ygc2NhbGVyIHJhbmdlXG4iKTsKKwkJCXY0bDJfZXJyKGZpbWMtPm0ybS52ZmQsICJPdXQgb2Ygc2NhbGVyIHJhbmdlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTMzMywxNCArMTI5OSwxNCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBmaW1jX20ybV9pb2N0bF9vcHMgPSB7CiAJLnZpZGlvY19xdWVyeWNhcAkJPSBmaW1jX20ybV9xdWVyeWNhcCwKIAotCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUJPSBmaW1jX3ZpZGlvY19lbnVtX2ZtdF9tcGxhbmUsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZQk9IGZpbWNfdmlkaW9jX2VudW1fZm10X21wbGFuZSwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY19tMm1fZW51bV9mbXRfbXBsYW5lLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX291dF9tcGxhbmUJPSBmaW1jX20ybV9lbnVtX2ZtdF9tcGxhbmUsCiAKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY192aWRpb2NfZ19mbXRfbXBsYW5lLAotCS52aWRpb2NfZ19mbXRfdmlkX291dF9tcGxhbmUJPSBmaW1jX3ZpZGlvY19nX2ZtdF9tcGxhbmUsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfbTJtX2dfZm10X21wbGFuZSwKKwkudmlkaW9jX2dfZm10X3ZpZF9vdXRfbXBsYW5lCT0gZmltY19tMm1fZ19mbXRfbXBsYW5lLAogCi0JLnZpZGlvY190cnlfZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY192aWRpb2NfdHJ5X2ZtdF9tcGxhbmUsCi0JLnZpZGlvY190cnlfZm10X3ZpZF9vdXRfbXBsYW5lCT0gZmltY192aWRpb2NfdHJ5X2ZtdF9tcGxhbmUsCisJLnZpZGlvY190cnlfZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY19tMm1fdHJ5X2ZtdF9tcGxhbmUsCisJLnZpZGlvY190cnlfZm10X3ZpZF9vdXRfbXBsYW5lCT0gZmltY19tMm1fdHJ5X2ZtdF9tcGxhbmUsCiAKIAkudmlkaW9jX3NfZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY19tMm1fc19mbXRfbXBsYW5lLAogCS52aWRpb2Nfc19mbXRfdmlkX291dF9tcGxhbmUJPSBmaW1jX20ybV9zX2ZtdF9tcGxhbmUsCkBAIC0xMzU0LDEwICsxMzIwLDYgQEAKIAkudmlkaW9jX3N0cmVhbW9uCQk9IGZpbWNfbTJtX3N0cmVhbW9uLAogCS52aWRpb2Nfc3RyZWFtb2ZmCQk9IGZpbWNfbTJtX3N0cmVhbW9mZiwKIAotCS52aWRpb2NfcXVlcnljdHJsCQk9IGZpbWNfdmlkaW9jX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX2dfY3RybAkJCT0gZmltY192aWRpb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsCQkJPSBmaW1jX20ybV9zX2N0cmwsCi0KIAkudmlkaW9jX2dfY3JvcAkJCT0gZmltY19tMm1fZ19jcm9wLAogCS52aWRpb2Nfc19jcm9wCQkJPSBmaW1jX20ybV9zX2Nyb3AsCiAJLnZpZGlvY19jcm9wY2FwCQkJPSBmaW1jX20ybV9jcm9wY2FwCkBAIC0xMzk2LDcgKzEzNTgsOCBAQAogc3RhdGljIGludCBmaW1jX20ybV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBOVUxMOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4OworCWludCByZXQ7CiAKIAlkYmcoInBpZDogJWQsIHN0YXRlOiAweCVseCwgcmVmY250OiAlZCIsCiAJCXRhc2tfcGlkX25yKGN1cnJlbnQpLCBmaW1jLT5zdGF0ZSwgZmltYy0+dmlkX2NhcC5yZWZjbnQpOwpAQCAtMTQwOCwxOSArMTM3MSwyNCBAQAogCWlmIChmaW1jLT52aWRfY2FwLnJlZmNudCA+IDApCiAJCXJldHVybiAtRUJVU1k7CiAKLQlmaW1jLT5tMm0ucmVmY250Kys7Ci0Jc2V0X2JpdChTVF9PVVRETUFfUlVOLCAmZmltYy0+c3RhdGUpOwotCiAJY3R4ID0ga3phbGxvYyhzaXplb2YgKmN0eCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjdHgpCiAJCXJldHVybiAtRU5PTUVNOworCXY0bDJfZmhfaW5pdCgmY3R4LT5maCwgZmltYy0+bTJtLnZmZCk7CisJcmV0ID0gZmltY19jdHJsc19jcmVhdGUoY3R4KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZoOwogCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gY3R4OworCS8qIFVzZSBzZXBhcmF0ZSBjb250cm9sIGhhbmRsZXIgcGVyIGZpbGUgaGFuZGxlICovCisJY3R4LT5maC5jdHJsX2hhbmRsZXIgPSAmY3R4LT5jdHJsX2hhbmRsZXI7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJmN0eC0+Zmg7CisJdjRsMl9maF9hZGQoJmN0eC0+ZmgpOworCiAJY3R4LT5maW1jX2RldiA9IGZpbWM7CiAJLyogRGVmYXVsdCBjb2xvciBmb3JtYXQgKi8KIAljdHgtPnNfZnJhbWUuZm10ID0gJmZpbWNfZm9ybWF0c1swXTsKIAljdHgtPmRfZnJhbWUuZm10ID0gJmZpbWNfZm9ybWF0c1swXTsKLQkvKiBTZXR1cCB0aGUgZGV2aWNlIGNvbnRleHQgZm9yIG1lbTJtZW0gbW9kZS4gKi8KKwkvKiBTZXR1cCB0aGUgZGV2aWNlIGNvbnRleHQgZm9yIG1lbW9yeS10by1tZW1vcnkgbW9kZSAqLwogCWN0eC0+c3RhdGUgPSBGSU1DX0NUWF9NMk07CiAJY3R4LT5mbGFncyA9IDA7CiAJY3R4LT5pbl9wYXRoID0gRklNQ19ETUE7CkBAIC0xNDI5LDM0ICsxMzk3LDQ2IEBACiAKIAljdHgtPm0ybV9jdHggPSB2NGwyX20ybV9jdHhfaW5pdChmaW1jLT5tMm0ubTJtX2RldiwgY3R4LCBxdWV1ZV9pbml0KTsKIAlpZiAoSVNfRVJSKGN0eC0+bTJtX2N0eCkpIHsKLQkJaW50IGVyciA9IFBUUl9FUlIoY3R4LT5tMm1fY3R4KTsKLQkJa2ZyZWUoY3R4KTsKLQkJcmV0dXJuIGVycjsKKwkJcmV0ID0gUFRSX0VSUihjdHgtPm0ybV9jdHgpOworCQlnb3RvIGVycm9yX2M7CiAJfQogCisJaWYgKGZpbWMtPm0ybS5yZWZjbnQrKyA9PSAwKQorCQlzZXRfYml0KFNUX00yTV9SVU4sICZmaW1jLT5zdGF0ZSk7CiAJcmV0dXJuIDA7CisKK2Vycm9yX2M6CisJZmltY19jdHJsc19kZWxldGUoY3R4KTsKK2Vycm9yX2ZoOgorCXY0bDJfZmhfZGVsKCZjdHgtPmZoKTsKKwl2NGwyX2ZoX2V4aXQoJmN0eC0+ZmgpOworCWtmcmVlKGN0eCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBmaW1jX20ybV9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7CiAJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKIAogCWRiZygicGlkOiAlZCwgc3RhdGU6IDB4JWx4LCByZWZjbnQ9ICVkIiwKIAkJdGFza19waWRfbnIoY3VycmVudCksIGZpbWMtPnN0YXRlLCBmaW1jLT5tMm0ucmVmY250KTsKIAogCXY0bDJfbTJtX2N0eF9yZWxlYXNlKGN0eC0+bTJtX2N0eCk7Ci0Ja2ZyZWUoY3R4KTsKLQlpZiAoLS1maW1jLT5tMm0ucmVmY250IDw9IDApCi0JCWNsZWFyX2JpdChTVF9PVVRETUFfUlVOLCAmZmltYy0+c3RhdGUpOworCWZpbWNfY3RybHNfZGVsZXRlKGN0eCk7CisJdjRsMl9maF9kZWwoJmN0eC0+ZmgpOworCXY0bDJfZmhfZXhpdCgmY3R4LT5maCk7CiAKKwlpZiAoLS1maW1jLT5tMm0ucmVmY250IDw9IDApCisJCWNsZWFyX2JpdChTVF9NMk1fUlVOLCAmZmltYy0+c3RhdGUpOworCWtmcmVlKGN0eCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmltY19tMm1fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKKwkJCQkgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaWxlLT5wcml2YXRlX2RhdGEpOwogCiAJcmV0dXJuIHY0bDJfbTJtX3BvbGwoZmlsZSwgY3R4LT5tMm1fY3R4LCB3YWl0KTsKIH0KQEAgLTE0NjQsNyArMTQ0NCw3IEBACiAKIHN0YXRpYyBpbnQgZmltY19tMm1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAogCXJldHVybiB2NGwyX20ybV9tbWFwKGZpbGUsIGN0eC0+bTJtX2N0eCwgdm1hKTsKIH0KQEAgLTE0ODMsOTIgKzE0NjMsNzMgQEAKIAkuam9iX2Fib3J0CT0gZmltY19qb2JfYWJvcnQsCiB9OwogCi1zdGF0aWMgaW50IGZpbWNfcmVnaXN0ZXJfbTJtX2RldmljZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCitpbnQgZmltY19yZWdpc3Rlcl9tMm1fZGV2aWNlKHN0cnVjdCBmaW1jX2RldiAqZmltYywKKwkJCSAgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2OwogCWludCByZXQgPSAwOwogCiAJaWYgKCFmaW1jKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBkZXYgPSBmaW1jLT5wZGV2OwotCXY0bDJfZGV2ID0gJmZpbWMtPm0ybS52NGwyX2RldjsKLQotCS8qIHNldCBuYW1lIGlmIGl0IGlzIGVtcHR5ICovCi0JaWYgKCF2NGwyX2Rldi0+bmFtZVswXSkKLQkJc25wcmludGYodjRsMl9kZXYtPm5hbWUsIHNpemVvZih2NGwyX2Rldi0+bmFtZSksCi0JCQkgIiVzLm0ybSIsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKLQotCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYsIHY0bDJfZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9tMm1fcjE7CisJZmltYy0+djRsMl9kZXYgPSB2NGwyX2RldjsKIAogCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOwogCWlmICghdmZkKSB7CiAJCXY0bDJfZXJyKHY0bDJfZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHZpZGVvIGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX20ybV9yMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJdmZkLT5mb3BzCT0gJmZpbWNfbTJtX2ZvcHM7CiAJdmZkLT5pb2N0bF9vcHMJPSAmZmltY19tMm1faW9jdGxfb3BzOworCXZmZC0+djRsMl9kZXYJPSB2NGwyX2RldjsKIAl2ZmQtPm1pbm9yCT0gLTE7CiAJdmZkLT5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CiAJdmZkLT5sb2NrCT0gJmZpbWMtPmxvY2s7CiAKLQlzbnByaW50Zih2ZmQtPm5hbWUsIHNpemVvZih2ZmQtPm5hbWUpLCAiJXM6bTJtIiwgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCisJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwgIiVzLm0ybSIsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKIAl2aWRlb19zZXRfZHJ2ZGF0YSh2ZmQsIGZpbWMpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZpbWMpOwogCiAJZmltYy0+bTJtLnZmZCA9IHZmZDsKIAlmaW1jLT5tMm0ubTJtX2RldiA9IHY0bDJfbTJtX2luaXQoJm0ybV9vcHMpOwogCWlmIChJU19FUlIoZmltYy0+bTJtLm0ybV9kZXYpKSB7CiAJCXY0bDJfZXJyKHY0bDJfZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgdjRsMi1tMm0gZGV2aWNlXG4iKTsKIAkJcmV0ID0gUFRSX0VSUihmaW1jLT5tMm0ubTJtX2Rldik7Ci0JCWdvdG8gZXJyX20ybV9yMjsKKwkJZ290byBlcnJfaW5pdDsKIAl9CiAKLQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UodmZkLCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7Ci0JaWYgKHJldCkgewotCQl2NGwyX2Vycih2NGwyX2RldiwKLQkJCSAiJXMoKTogZmFpbGVkIHRvIHJlZ2lzdGVyIHZpZGVvIGRldmljZVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycl9tMm1fcjM7Ci0JfQotCXY0bDJfaW5mbyh2NGwyX2RldiwKLQkJICAiRklNQyBtMm0gZHJpdmVyIHJlZ2lzdGVyZWQgYXMgL2Rldi92aWRlbyVkXG4iLCB2ZmQtPm51bSk7CisJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQoJnZmZC0+ZW50aXR5LCAwLCBOVUxMLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gMDsKLQotZXJyX20ybV9yMzoKIAl2NGwyX20ybV9yZWxlYXNlKGZpbWMtPm0ybS5tMm1fZGV2KTsKLWVycl9tMm1fcjI6CitlcnJfaW5pdDoKIAl2aWRlb19kZXZpY2VfcmVsZWFzZShmaW1jLT5tMm0udmZkKTsKLWVycl9tMm1fcjE6Ci0JdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcih2NGwyX2Rldik7Ci0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBmaW1jX3VucmVnaXN0ZXJfbTJtX2RldmljZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCit2b2lkIGZpbWNfdW5yZWdpc3Rlcl9tMm1fZGV2aWNlKHN0cnVjdCBmaW1jX2RldiAqZmltYykKIHsKLQlpZiAoZmltYykgewotCQl2NGwyX20ybV9yZWxlYXNlKGZpbWMtPm0ybS5tMm1fZGV2KTsKLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZmltYy0+bTJtLnZmZCk7CisJaWYgKCFmaW1jKQorCQlyZXR1cm47CiAKLQkJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZmltYy0+bTJtLnY0bDJfZGV2KTsKKwlpZiAoZmltYy0+bTJtLm0ybV9kZXYpCisJCXY0bDJfbTJtX3JlbGVhc2UoZmltYy0+bTJtLm0ybV9kZXYpOworCWlmIChmaW1jLT5tMm0udmZkKSB7CisJCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZmaW1jLT5tMm0udmZkLT5lbnRpdHkpOworCQkvKiBDYW4gYWxzbyBiZSBjYWxsZWQgaWYgdmlkZW8gZGV2aWNlIHdhc24ndCByZWdpc3RlcmVkICovCisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGZpbWMtPm0ybS52ZmQpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgZmltY19jbGtfcmVsZWFzZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCitzdGF0aWMgdm9pZCBmaW1jX2Nsa19wdXQoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBmaW1jLT5udW1fY2xvY2tzOyBpKyspIHsKLQkJaWYgKGZpbWMtPmNsb2NrW2ldKSB7Ci0JCQljbGtfZGlzYWJsZShmaW1jLT5jbG9ja1tpXSk7CisJCWlmIChmaW1jLT5jbG9ja1tpXSkKIAkJCWNsa19wdXQoZmltYy0+Y2xvY2tbaV0pOwotCQl9CiAJfQogfQogCkBAIC0xNTc3LDE1ICsxNTM4LDUwIEBACiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IGZpbWMtPm51bV9jbG9ja3M7IGkrKykgewogCQlmaW1jLT5jbG9ja1tpXSA9IGNsa19nZXQoJmZpbWMtPnBkZXYtPmRldiwgZmltY19jbG9ja3NbaV0pOwotCi0JCWlmICghSVNfRVJSX09SX05VTEwoZmltYy0+Y2xvY2tbaV0pKSB7Ci0JCQljbGtfZW5hYmxlKGZpbWMtPmNsb2NrW2ldKTsKKwkJaWYgKCFJU19FUlJfT1JfTlVMTChmaW1jLT5jbG9ja1tpXSkpCiAJCQljb250aW51ZTsKLQkJfQogCQlkZXZfZXJyKCZmaW1jLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGZpbWMgY2xvY2s6ICVzXG4iLAogCQkJZmltY19jbG9ja3NbaV0pOwogCQlyZXR1cm4gLUVOWElPOwogCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbWNfbTJtX3N1c3BlbmQoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRpbWVvdXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoIWZpbWNfbTJtX3BlbmRpbmcoZmltYykpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsZWFyX2JpdChTVF9NMk1fU1VTUEVOREVELCAmZmltYy0+c3RhdGUpOworCXNldF9iaXQoU1RfTTJNX1NVU1BFTkRJTkcsICZmaW1jLT5zdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKworCXRpbWVvdXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoZmltYy0+aXJxX3F1ZXVlLAorCQkJICAgICB0ZXN0X2JpdChTVF9NMk1fU1VTUEVOREVELCAmZmltYy0+c3RhdGUpLAorCQkJICAgICBGSU1DX1NIVVRET1dOX1RJTUVPVVQpOworCisJY2xlYXJfYml0KFNUX00yTV9TVVNQRU5ESU5HLCAmZmltYy0+c3RhdGUpOworCXJldHVybiB0aW1lb3V0ID09IDAgPyAtRUFHQUlOIDogMDsKK30KKworc3RhdGljIGludCBmaW1jX20ybV9yZXN1bWUoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKwkvKiBDbGVhciBmb3IgZnVsbCBIL1cgc2V0dXAgaW4gZmlyc3QgcnVuIGFmdGVyIHJlc3VtZSAqLworCWZpbWMtPm0ybS5jdHggPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUX00yTV9TVVNQRU5ERUQsICZmaW1jLT5zdGF0ZSkpCisJCWZpbWNfbTJtX2pvYl9maW5pc2goZmltYy0+bTJtLmN0eCwKKwkJCQkgICAgVkIyX0JVRl9TVEFURV9FUlJPUik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1OTYsNyArMTU5Miw2IEBACiAJc3RydWN0IHNhbXN1bmdfZmltY19kcml2ZXJkYXRhICpkcnZfZGF0YTsKIAlzdHJ1Y3QgczVwX3BsYXRmb3JtX2ZpbWMgKnBkYXRhOwogCWludCByZXQgPSAwOwotCWludCBjYXBfaW5wdXRfaW5kZXggPSAtMTsKIAogCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzKCk6XG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTE2MTQsMTUgKzE2MDksMTYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmaW1jLT5pZCA9IHBkZXYtPmlkOworCiAJZmltYy0+dmFyaWFudCA9IGRydl9kYXRhLT52YXJpYW50W2ZpbWMtPmlkXTsKIAlmaW1jLT5wZGV2ID0gcGRldjsKIAlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWZpbWMtPnBkYXRhID0gcGRhdGE7Ci0JZmltYy0+c3RhdGUgPSBTVF9JRExFOworCisJc2V0X2JpdChTVF9MUE0sICZmaW1jLT5zdGF0ZSk7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmaW1jLT5pcnFfcXVldWUpOwogCXNwaW5fbG9ja19pbml0KCZmaW1jLT5zbG9jayk7Ci0KIAltdXRleF9pbml0KCZmaW1jLT5sb2NrKTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CkBAIC0xNjQ3LDcxICsxNjQzLDUxIEBACiAJCWdvdG8gZXJyX3JlcV9yZWdpb247CiAJfQogCi0JZmltYy0+bnVtX2Nsb2NrcyA9IE1BWF9GSU1DX0NMT0NLUyAtIDE7Ci0KLQkvKiBDaGVjayBpZiBhIHZpZGVvIGNhcHR1cmUgbm9kZSBuZWVkcyB0byBiZSByZWdpc3RlcmVkLiAqLwotCWlmIChwZGF0YSAmJiBwZGF0YS0+bnVtX2NsaWVudHMgPiAwKSB7Ci0JCWNhcF9pbnB1dF9pbmRleCA9IDA7Ci0JCWZpbWMtPm51bV9jbG9ja3MrKzsKLQl9Ci0KLQlyZXQgPSBmaW1jX2Nsa19nZXQoZmltYyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfcmVnc191bm1hcDsKLQljbGtfc2V0X3JhdGUoZmltYy0+Y2xvY2tbQ0xLX0JVU10sIGRydl9kYXRhLT5sY2xrX2ZyZXF1ZW5jeSk7Ci0KIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOwogCWlmICghcmVzKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgSVJRIHJlc291cmNlXG4iKTsKIAkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGVycl9jbGs7CisJCWdvdG8gZXJyX3JlZ3NfdW5tYXA7CiAJfQogCWZpbWMtPmlycSA9IHJlcy0+c3RhcnQ7CiAKLQlmaW1jX2h3X3Jlc2V0KGZpbWMpOworCWZpbWMtPm51bV9jbG9ja3MgPSBNQVhfRklNQ19DTE9DS1M7CisJcmV0ID0gZmltY19jbGtfZ2V0KGZpbWMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JlZ3NfdW5tYXA7CisJY2xrX3NldF9yYXRlKGZpbWMtPmNsb2NrW0NMS19CVVNdLCBkcnZfZGF0YS0+bGNsa19mcmVxdWVuY3kpOworCWNsa19lbmFibGUoZmltYy0+Y2xvY2tbQ0xLX0JVU10pOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoZmltYy0+aXJxLCBmaW1jX2lzciwgMCwgcGRldi0+bmFtZSwgZmltYyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZmltYyk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShmaW1jLT5pcnEsIGZpbWNfaXJxX2hhbmRsZXIsIDAsIHBkZXYtPm5hbWUsIGZpbWMpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluc3RhbGwgaXJxICglZClcbiIsIHJldCk7CiAJCWdvdG8gZXJyX2NsazsKIAl9CiAKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZwZGV2LT5kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9pcnE7CiAJLyogSW5pdGlhbGl6ZSBjb250aWd1b3VzIG1lbW9yeSBhbGxvY2F0b3IgKi8KLQlmaW1jLT5hbGxvY19jdHggPSB2YjJfZG1hX2NvbnRpZ19pbml0X2N0eCgmZmltYy0+cGRldi0+ZGV2KTsKKwlmaW1jLT5hbGxvY19jdHggPSB2YjJfZG1hX2NvbnRpZ19pbml0X2N0eCgmcGRldi0+ZGV2KTsKIAlpZiAoSVNfRVJSKGZpbWMtPmFsbG9jX2N0eCkpIHsKIAkJcmV0ID0gUFRSX0VSUihmaW1jLT5hbGxvY19jdHgpOwotCQlnb3RvIGVycl9pcnE7CisJCWdvdG8gZXJyX3BtOwogCX0KIAotCXJldCA9IGZpbWNfcmVnaXN0ZXJfbTJtX2RldmljZShmaW1jKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9pcnE7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiRklNQy4lZCByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseVxuIiwgZmltYy0+aWQpOwogCi0JLyogQXQgbGVhc3Qgb25lIGNhbWVyYSBzZW5zb3IgaXMgcmVxdWlyZWQgdG8gcmVnaXN0ZXIgY2FwdHVyZSBub2RlICovCi0JaWYgKGNhcF9pbnB1dF9pbmRleCA+PSAwKSB7Ci0JCXJldCA9IGZpbWNfcmVnaXN0ZXJfY2FwdHVyZV9kZXZpY2UoZmltYyk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycl9tMm07Ci0JCWNsa19kaXNhYmxlKGZpbWMtPmNsb2NrW0NMS19DQU1dKTsKLQl9Ci0JLyoKLQkgKiBFeGNsdWRlIHRoZSBhZGRpdGlvbmFsIG91dHB1dCBETUEgYWRkcmVzcyByZWdpc3RlcnMgYnkgbWFza2luZwotCSAqIHRoZW0gb3V0IG9uIEhXIHJldmlzaW9ucyB0aGF0IHByb3ZpZGUgZXh0ZW5kZWQgY2FwYWJpbGl0ZXMuCi0JICovCi0JaWYgKGZpbWMtPnZhcmlhbnQtPm91dF9idWZfY291bnQgPiA0KQotCQlmaW1jX2h3X3NldF9kbWFfc2VxKGZpbWMsIDB4Rik7Ci0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcygpOiBmaW1jLSVkIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5XG4iLAotCQlfX2Z1bmNfXywgZmltYy0+aWQpOwotCisJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CiAJcmV0dXJuIDA7CiAKLWVycl9tMm06Ci0JZmltY191bnJlZ2lzdGVyX20ybV9kZXZpY2UoZmltYyk7CitlcnJfcG06CisJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CiBlcnJfaXJxOgogCWZyZWVfaXJxKGZpbWMtPmlycSwgZmltYyk7CiBlcnJfY2xrOgotCWZpbWNfY2xrX3JlbGVhc2UoZmltYyk7CisJZmltY19jbGtfcHV0KGZpbWMpOwogZXJyX3JlZ3NfdW5tYXA6CiAJaW91bm1hcChmaW1jLT5yZWdzKTsKIGVycl9yZXFfcmVnaW9uOgpAQCAtMTcxOSwzMSArMTY5NSwxMDUgQEAKIAlrZnJlZShmaW1jLT5yZWdzX3Jlcyk7CiBlcnJfaW5mbzoKIAlrZnJlZShmaW1jKTsKLQogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgZmltY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0JZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlkYmcoImZpbWMlZDogc3RhdGU6IDB4JWx4IiwgZmltYy0+aWQsIGZpbWMtPnN0YXRlKTsKKworCS8qIEVuYWJsZSBjbG9ja3MgYW5kIHBlcmZvcm0gYmFzaWMgaW5pdGFsaXphdGlvbiAqLworCWNsa19lbmFibGUoZmltYy0+Y2xvY2tbQ0xLX0dBVEVdKTsKKwlmaW1jX2h3X3Jlc2V0KGZpbWMpOworCWlmIChmaW1jLT52YXJpYW50LT5vdXRfYnVmX2NvdW50ID4gNCkKKwkJZmltY19od19zZXRfZG1hX3NlcShmaW1jLCAweEYpOworCisJLyogUmVzdW1lIHRoZSBjYXB0dXJlIG9yIG1lbS10by1tZW0gZGV2aWNlICovCisJaWYgKGZpbWNfY2FwdHVyZV9idXN5KGZpbWMpKQorCQlyZXR1cm4gZmltY19jYXB0dXJlX3Jlc3VtZShmaW1jKTsKKwllbHNlIGlmIChmaW1jX20ybV9wZW5kaW5nKGZpbWMpKQorCQlyZXR1cm4gZmltY19tMm1fcmVzdW1lKGZpbWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbWNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPQlkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChmaW1jX2NhcHR1cmVfYnVzeShmaW1jKSkKKwkJcmV0ID0gZmltY19jYXB0dXJlX3N1c3BlbmQoZmltYyk7CisJZWxzZQorCQlyZXQgPSBmaW1jX20ybV9zdXNwZW5kKGZpbWMpOworCWlmICghcmV0KQorCQljbGtfZGlzYWJsZShmaW1jLT5jbG9ja1tDTEtfR0FURV0pOworCisJZGJnKCJmaW1jJWQ6IHN0YXRlOiAweCVseCIsIGZpbWMtPmlkLCBmaW1jLT5zdGF0ZSk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBmaW1jX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0JZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRiZygiZmltYyVkOiBzdGF0ZTogMHglbHgiLCBmaW1jLT5pZCwgZmltYy0+c3RhdGUpOworCisJLyogRG8gbm90IHJlc3VtZSBpZiB0aGUgZGV2aWNlIHdhcyBpZGxlIGJlZm9yZSBzeXN0ZW0gc3VzcGVuZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFNUX0xQTSwgJmZpbWMtPnN0YXRlKSB8fAorCSAgICAoIWZpbWNfbTJtX2FjdGl2ZShmaW1jKSAmJiAhZmltY19jYXB0dXJlX2J1c3koZmltYykpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwlmaW1jX2h3X3Jlc2V0KGZpbWMpOworCWlmIChmaW1jLT52YXJpYW50LT5vdXRfYnVmX2NvdW50ID4gNCkKKwkJZmltY19od19zZXRfZG1hX3NlcShmaW1jLCAweEYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoZmltY19jYXB0dXJlX2J1c3koZmltYykpCisJCXJldHVybiBmaW1jX2NhcHR1cmVfcmVzdW1lKGZpbWMpOworCisJcmV0dXJuIGZpbWNfbTJtX3Jlc3VtZShmaW1jKTsKK30KKworc3RhdGljIGludCBmaW1jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9CWRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZGJnKCJmaW1jJWQ6IHN0YXRlOiAweCVseCIsIGZpbWMtPmlkLCBmaW1jLT5zdGF0ZSk7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChTVF9MUE0sICZmaW1jLT5zdGF0ZSkpCisJCXJldHVybiAwOworCWlmIChmaW1jX2NhcHR1cmVfYnVzeShmaW1jKSkKKwkJcmV0dXJuIGZpbWNfY2FwdHVyZV9zdXNwZW5kKGZpbWMpOworCisJcmV0dXJuIGZpbWNfbTJtX3N1c3BlbmQoZmltYyk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKIHN0YXRpYyBpbnQgX19kZXZleGl0IGZpbWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0KLQkJKHN0cnVjdCBmaW1jX2RldiAqKXBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JZnJlZV9pcnEoZmltYy0+aXJxLCBmaW1jKTsKLQlmaW1jX2h3X3Jlc2V0KGZpbWMpOwotCi0JZmltY191bnJlZ2lzdGVyX20ybV9kZXZpY2UoZmltYyk7Ci0JZmltY191bnJlZ2lzdGVyX2NhcHR1cmVfZGV2aWNlKGZpbWMpOwotCi0JZmltY19jbGtfcmVsZWFzZShmaW1jKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJZmltY19ydW50aW1lX3N1c3BlbmQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKCZwZGV2LT5kZXYpOwogCiAJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgoZmltYy0+YWxsb2NfY3R4KTsKIAorCWNsa19kaXNhYmxlKGZpbWMtPmNsb2NrW0NMS19CVVNdKTsKKwlmaW1jX2Nsa19wdXQoZmltYyk7CisJZnJlZV9pcnEoZmltYy0+aXJxLCBmaW1jKTsKIAlpb3VubWFwKGZpbWMtPnJlZ3MpOwogCXJlbGVhc2VfcmVzb3VyY2UoZmltYy0+cmVnc19yZXMpOwogCWtmcmVlKGZpbWMtPnJlZ3NfcmVzKTsKIAlrZnJlZShmaW1jKTsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyBkcml2ZXIgdW5sb2FkZWRcbiIsIHBkZXYtPm5hbWUpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJkcml2ZXIgdW5sb2FkZWRcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzg2LDYgKzE4MzYsNyBAQAogc3RhdGljIHN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCBmaW1jMF92YXJpYW50X3M1cCA9IHsKIAkuaGFzX2lucF9yb3QJID0gMSwKIAkuaGFzX291dF9yb3QJID0gMSwKKwkuaGFzX2NhbV9pZgkgPSAxLAogCS5taW5faW5wX3BpeHNpemUgPSAxNiwKIAkubWluX291dF9waXhzaXplID0gMTYsCiAJLmhvcl9vZmZzX2FsaWduCSA9IDgsCkBAIC0xNzk0LDYgKzE4NDUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCBmaW1jMl92YXJpYW50X3M1cCA9IHsKKwkuaGFzX2NhbV9pZgkgPSAxLAogCS5taW5faW5wX3BpeHNpemUgPSAxNiwKIAkubWluX291dF9waXhzaXplID0gMTYsCiAJLmhvcl9vZmZzX2FsaWduCSA9IDgsCkBAIC0xODA1LDYgKzE4NTcsNyBAQAogCS5waXhfaG9mZgkgPSAxLAogCS5oYXNfaW5wX3JvdAkgPSAxLAogCS5oYXNfb3V0X3JvdAkgPSAxLAorCS5oYXNfY2FtX2lmCSA9IDEsCiAJLm1pbl9pbnBfcGl4c2l6ZSA9IDE2LAogCS5taW5fb3V0X3BpeHNpemUgPSAxNiwKIAkuaG9yX29mZnNfYWxpZ24JID0gOCwKQEAgLTE4MTYsNiArMTg2OSw3IEBACiAJLnBpeF9ob2ZmCSA9IDEsCiAJLmhhc19pbnBfcm90CSA9IDEsCiAJLmhhc19vdXRfcm90CSA9IDEsCisJLmhhc19jYW1faWYJID0gMSwKIAkuaGFzX21haW5zY2FsZXJfZXh0ID0gMSwKIAkubWluX2lucF9waXhzaXplID0gMTYsCiAJLm1pbl9vdXRfcGl4c2l6ZSA9IDE2LApAQCAtMTgyNSw2ICsxODc5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19maW1jX3ZhcmlhbnQgZmltYzJfdmFyaWFudF9zNXB2MjEwID0geworCS5oYXNfY2FtX2lmCSA9IDEsCiAJLnBpeF9ob2ZmCSA9IDEsCiAJLm1pbl9pbnBfcGl4c2l6ZSA9IDE2LAogCS5taW5fb3V0X3BpeHNpemUgPSAxNiwKQEAgLTE4MzcsMjIgKzE4OTIsMjQgQEAKIAkucGl4X2hvZmYJID0gMSwKIAkuaGFzX2lucF9yb3QJID0gMSwKIAkuaGFzX291dF9yb3QJID0gMSwKKwkuaGFzX2NhbV9pZgkgPSAxLAogCS5oYXNfY2lzdGF0dXMyCSA9IDEsCiAJLmhhc19tYWluc2NhbGVyX2V4dCA9IDEsCiAJLm1pbl9pbnBfcGl4c2l6ZSA9IDE2LAogCS5taW5fb3V0X3BpeHNpemUgPSAxNiwKLQkuaG9yX29mZnNfYWxpZ24JID0gMSwKKwkuaG9yX29mZnNfYWxpZ24JID0gMiwKIAkub3V0X2J1Zl9jb3VudAkgPSAzMiwKIAkucGl4X2xpbWl0CSA9ICZzNXBfcGl4X2xpbWl0WzFdLAogfTsKIAotc3RhdGljIHN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCBmaW1jMl92YXJpYW50X2V4eW5vczQgPSB7CitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZmltY192YXJpYW50IGZpbWMzX3ZhcmlhbnRfZXh5bm9zNCA9IHsKIAkucGl4X2hvZmYJID0gMSwKKwkuaGFzX2NhbV9pZgkgPSAxLAogCS5oYXNfY2lzdGF0dXMyCSA9IDEsCiAJLmhhc19tYWluc2NhbGVyX2V4dCA9IDEsCiAJLm1pbl9pbnBfcGl4c2l6ZSA9IDE2LAogCS5taW5fb3V0X3BpeHNpemUgPSAxNiwKLQkuaG9yX29mZnNfYWxpZ24JID0gMSwKKwkuaG9yX29mZnNfYWxpZ24JID0gMiwKIAkub3V0X2J1Zl9jb3VudAkgPSAzMiwKIAkucGl4X2xpbWl0CSA9ICZzNXBfcGl4X2xpbWl0WzNdLAogfTsKQEAgLTE4ODUsNyArMTk0Miw3IEBACiAJCVswXSA9ICZmaW1jMF92YXJpYW50X2V4eW5vczQsCiAJCVsxXSA9ICZmaW1jMF92YXJpYW50X2V4eW5vczQsCiAJCVsyXSA9ICZmaW1jMF92YXJpYW50X2V4eW5vczQsCi0JCVszXSA9ICZmaW1jMl92YXJpYW50X2V4eW5vczQsCisJCVszXSA9ICZmaW1jM192YXJpYW50X2V4eW5vczQsCiAJfSwKIAkubnVtX2VudGl0aWVzID0gNCwKIAkubGNsa19mcmVxdWVuY3kgPSAxNjYwMDAwMDBVTCwKQEAgLTE5MDYsMzMgKzE5NjMsMjggQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBmaW1jX2RyaXZlcl9pZHMpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZmltY19wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoZmltY19zdXNwZW5kLCBmaW1jX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoZmltY19ydW50aW1lX3N1c3BlbmQsIGZpbWNfcnVudGltZV9yZXN1bWUsIE5VTEwpCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmaW1jX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gZmltY19wcm9iZSwKLQkucmVtb3ZlCT0gX19kZXZleGl0X3AoZmltY19yZW1vdmUpLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZmltY19yZW1vdmUpLAogCS5pZF90YWJsZQk9IGZpbWNfZHJpdmVyX2lkcywKIAkuZHJpdmVyID0gewotCQkubmFtZQk9IE1PRFVMRV9OQU1FLAorCQkubmFtZQk9IEZJTUNfTU9EVUxFX05BTUUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0gICAgID0gJmZpbWNfcG1fb3BzLAogCX0KIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGZpbWNfaW5pdCh2b2lkKQoraW50IF9faW5pdCBmaW1jX3JlZ2lzdGVyX2RyaXZlcih2b2lkKQogewotCWludCByZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZpbWNfZHJpdmVyKTsKLQlpZiAocmV0KQotCQllcnIoInBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlciBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZmltY19kcml2ZXIsIGZpbWNfcHJvYmUpOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmltY19leGl0KHZvaWQpCit2b2lkIF9fZXhpdCBmaW1jX3VucmVnaXN0ZXJfZHJpdmVyKHZvaWQpCiB7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZpbWNfZHJpdmVyKTsKIH0KLQotbW9kdWxlX2luaXQoZmltY19pbml0KTsKLW1vZHVsZV9leGl0KGZpbWNfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlN5bHdlc3RlciBOYXdyb2NraSA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUzVQIEZJTUMgY2FtZXJhIGhvc3QgaW50ZXJmYWNlL3ZpZGVvIHBvc3Rwcm9jZXNzb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfVkVSU0lPTigiMS4wLjEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5oCmluZGV4IDFmNzA3NzIuLmE2OTM2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuaApAQCAtMTEsMTIgKzExLDE2IEBACiAKIC8qI2RlZmluZSBERUJVRyovCiAKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWVkaWEvbWVkaWEtZW50aXR5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLW1lbTJtZW0uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLW1lZGlhYnVzLmg+CkBAIC0zMiwzOCArMzYsNDYgQEAKIAogLyogVGltZSB0byB3YWl0IGZvciBuZXh0IGZyYW1lIFZTWU5DIGludGVycnVwdCB3aGlsZSBzdG9wcGluZyBvcGVyYXRpb24uICovCiAjZGVmaW5lIEZJTUNfU0hVVERPV05fVElNRU9VVAkoKDEwMCpIWikvMTAwMCkKLSNkZWZpbmUgTUFYX0ZJTUNfQ0xPQ0tTCQkzCi0jZGVmaW5lIE1PRFVMRV9OQU1FCQkiczVwLWZpbWMiCisjZGVmaW5lIE1BWF9GSU1DX0NMT0NLUwkJMgorI2RlZmluZSBGSU1DX01PRFVMRV9OQU1FCSJzNXAtZmltYyIKICNkZWZpbmUgRklNQ19NQVhfREVWUwkJNAogI2RlZmluZSBGSU1DX01BWF9PVVRfQlVGUwk0CiAjZGVmaW5lIFNDQUxFUl9NQVhfSFJBVElPCTY0CiAjZGVmaW5lIFNDQUxFUl9NQVhfVlJBVElPCTY0CiAjZGVmaW5lIERNQV9NSU5fU0laRQkJOAorI2RlZmluZSBGSU1DX0NBTUlGX01BWF9IRUlHSFQJMHgyMDAwCiAKIC8qIGluZGljZXMgdG8gdGhlIGNsb2NrcyBhcnJheSAqLwogZW51bSB7CiAJQ0xLX0JVUywKIAlDTEtfR0FURSwKLQlDTEtfQ0FNLAogfTsKIAogZW51bSBmaW1jX2Rldl9mbGFncyB7Ci0JLyogZm9yIG0ybSBub2RlICovCi0JU1RfSURMRSwKLQlTVF9PVVRETUFfUlVOLAorCVNUX0xQTSwKKwkvKiBtMm0gbm9kZSAqLworCVNUX00yTV9SVU4sCiAJU1RfTTJNX1BFTkQsCi0JLyogZm9yIGNhcHR1cmUgbm9kZSAqLworCVNUX00yTV9TVVNQRU5ESU5HLAorCVNUX00yTV9TVVNQRU5ERUQsCisJLyogY2FwdHVyZSBub2RlICovCiAJU1RfQ0FQVF9QRU5ELAogCVNUX0NBUFRfUlVOLAogCVNUX0NBUFRfU1RSRUFNLAorCVNUX0NBUFRfSVNQX1NUUkVBTSwKKwlTVF9DQVBUX1NVU1BFTkRFRCwKIAlTVF9DQVBUX1NIVVQsCisJU1RfQ0FQVF9CVVNZLAorCVNUX0NBUFRfQVBQTFlfQ0ZHLAorCVNUX0NBUFRfSlBFRywKIH07CiAKLSNkZWZpbmUgZmltY19tMm1fYWN0aXZlKGRldikgdGVzdF9iaXQoU1RfT1VURE1BX1JVTiwgJihkZXYpLT5zdGF0ZSkKKyNkZWZpbmUgZmltY19tMm1fYWN0aXZlKGRldikgdGVzdF9iaXQoU1RfTTJNX1JVTiwgJihkZXYpLT5zdGF0ZSkKICNkZWZpbmUgZmltY19tMm1fcGVuZGluZyhkZXYpIHRlc3RfYml0KFNUX00yTV9QRU5ELCAmKGRldiktPnN0YXRlKQogCiAjZGVmaW5lIGZpbWNfY2FwdHVyZV9ydW5uaW5nKGRldikgdGVzdF9iaXQoU1RfQ0FQVF9SVU4sICYoZGV2KS0+c3RhdGUpCiAjZGVmaW5lIGZpbWNfY2FwdHVyZV9wZW5kaW5nKGRldikgdGVzdF9iaXQoU1RfQ0FQVF9QRU5ELCAmKGRldiktPnN0YXRlKQorI2RlZmluZSBmaW1jX2NhcHR1cmVfYnVzeShkZXYpIHRlc3RfYml0KFNUX0NBUFRfQlVTWSwgJihkZXYpLT5zdGF0ZSkKIAogZW51bSBmaW1jX2RhdGFwYXRoIHsKIAlGSU1DX0NBTUVSQSwKQEAgLTgzLDkgKzk1LDE0IEBACiAJUzVQX0ZJTUNfQ0JZQ1JZNDIyLAogCVM1UF9GSU1DX0NSWUNCWTQyMiwKIAlTNVBfRklNQ19ZQ0JDUjQ0NF9MT0NBTCwKKwlTNVBfRklNQ19KUEVHID0gMHg0MCwKIH07CiAKLSNkZWZpbmUgZmltY19mbXRfaXNfcmdiKHgpICgoeCkgJiAweDEwKQorI2RlZmluZSBmaW1jX2ZtdF9pc19yZ2IoeCkgKCEhKCh4KSAmIDB4MTApKQorI2RlZmluZSBmaW1jX2ZtdF9pc19qcGVnKHgpICghISgoeCkgJiAweDQwKSkKKworI2RlZmluZSBJU19NMk0oX19zdHJ0KSAoKF9fc3RydCkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FIHx8IFwKKwkJCV9fc3RydCA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQogCiAvKiBDYi9DciBjaHJvbWluYW5jZSBjb21wb25lbnRzIG9yZGVyIGZvciAyIHBsYW5lIFkvQ2JDciA0OjI6MiBmb3JtYXRzLiAqLwogI2RlZmluZQlTNVBfRklNQ19MU0JfQ1JDQglTNVBfQ0lPQ1RSTF9PUkRFUjQyMl8yUF9MU0JfQ1JDQgpAQCAtMTA0LDkgKzEyMSwxMCBAQAogI2RlZmluZQlGSU1DX0RTVF9BRERSCQkoMSA8PCAyKQogI2RlZmluZQlGSU1DX1NSQ19GTVQJCSgxIDw8IDMpCiAjZGVmaW5lCUZJTUNfRFNUX0ZNVAkJKDEgPDwgNCkKLSNkZWZpbmUJRklNQ19DVFhfTTJNCQkoMSA8PCA1KQotI2RlZmluZQlGSU1DX0NUWF9DQVAJCSgxIDw8IDYpCi0jZGVmaW5lCUZJTUNfQ1RYX1NIVVQJCSgxIDw8IDcpCisjZGVmaW5lCUZJTUNfRFNUX0NST1AJCSgxIDw8IDUpCisjZGVmaW5lCUZJTUNfQ1RYX00yTQkJKDEgPDwgMTYpCisjZGVmaW5lCUZJTUNfQ1RYX0NBUAkJKDEgPDwgMTcpCisjZGVmaW5lCUZJTUNfQ1RYX1NIVVQJCSgxIDw8IDE4KQogCiAvKiBJbWFnZSBjb252ZXJzaW9uIGZsYWdzICovCiAjZGVmaW5lCUZJTUNfSU5fRE1BX0FDQ0VTU19USUxFRAkoMSA8PCAwKQpAQCAtMTIyLDExICsxNDAsNiBAQAogLyogWSAoMTYgfiAyMzUpLCBDYi9DciAoMTYgfiAyNDApICovCiAjZGVmaW5lCUZJTUNfQ09MT1JfUkFOR0VfTkFSUk9XCQkoMSA8PCAzKQogCi0jZGVmaW5lCUZMSVBfTk9ORQkJCTAKLSNkZWZpbmUJRkxJUF9YX0FYSVMJCQkxCi0jZGVmaW5lCUZMSVBfWV9BWElTCQkJMgotI2RlZmluZQlGTElQX1hZX0FYSVMJCQkoRkxJUF9YX0FYSVMgfCBGTElQX1lfQVhJUykKLQogLyoqCiAgKiBzdHJ1Y3QgZmltY19mbXQgLSB0aGUgZHJpdmVyJ3MgaW50ZXJuYWwgY29sb3IgZm9ybWF0IGRhdGEKICAqIEBtYnVzX2NvZGU6IE1lZGlhIEJ1cyBwaXhlbCBjb2RlLCAtMSBpZiBub3QgYXBwbGljYWJsZQpAQCAtMjc1LDI2ICsyODgsMjkgQEAKIC8qKgogICogc3RydWN0IGZpbWNfbTJtX2RldmljZSAtIHY0bDIgbWVtb3J5LXRvLW1lbW9yeSBkZXZpY2UgZGF0YQogICogQHZmZDogdGhlIHZpZGVvIGRldmljZSBub2RlIGZvciB2NGwyIG0ybSBtb2RlCi0gKiBAdjRsMl9kZXY6IHY0bDIgZGV2aWNlIGZvciBtMm0gbW9kZQogICogQG0ybV9kZXY6IHY0bDIgbWVtb3J5LXRvLW1lbW9yeSBkZXZpY2UgZGF0YQogICogQGN0eDogaGFyZHdhcmUgY29udGV4dCBkYXRhCiAgKiBAcmVmY250OiB0aGUgcmVmZXJlbmNlIGNvdW50ZXIKICAqLwogc3RydWN0IGZpbWNfbTJtX2RldmljZSB7CiAJc3RydWN0IHZpZGVvX2RldmljZQkqdmZkOwotCXN0cnVjdCB2NGwyX2RldmljZQl2NGwyX2RldjsKIAlzdHJ1Y3QgdjRsMl9tMm1fZGV2CSptMm1fZGV2OwogCXN0cnVjdCBmaW1jX2N0eAkJKmN0eDsKIAlpbnQJCQlyZWZjbnQ7CiB9OwogCisjZGVmaW5lIEZJTUNfU0RfUEFEX1NJTksJMAorI2RlZmluZSBGSU1DX1NEX1BBRF9TT1VSQ0UJMQorI2RlZmluZSBGSU1DX1NEX1BBRFNfTlVNCTIKKwogLyoqCiAgKiBzdHJ1Y3QgZmltY192aWRfY2FwIC0gY2FtZXJhIGNhcHR1cmUgZGV2aWNlIGluZm9ybWF0aW9uCiAgKiBAY3R4OiBoYXJkd2FyZSBjb250ZXh0IGRhdGEKICAqIEB2ZmQ6IHZpZGVvIGRldmljZSBub2RlIGZvciBjYW1lcmEgY2FwdHVyZSBtb2RlCi0gKiBAdjRsMl9kZXY6IHY0bDJfZGV2aWNlIHN0cnVjdCB0byBtYW5hZ2Ugc3ViZGV2cwotICogQHNkOiBwb2ludGVyIHRvIGNhbWVyYSBzZW5zb3Igc3ViZGV2aWNlIGN1cnJlbnRseSBpbiB1c2UKLSAqIEBmbXQ6IE1lZGlhIEJ1cyBmb3JtYXQgY29uZmlndXJlZCBhdCBzZWxlY3RlZCBpbWFnZSBzZW5zb3IKKyAqIEBzdWJkZXY6IHN1YmRldiBleHBvc2luZyB0aGUgRklNQyBwcm9jZXNzaW5nIGJsb2NrCisgKiBAdmRfcGFkOiBmaW1jIHZpZGVvIGNhcHR1cmUgbm9kZSBwYWQKKyAqIEBzZF9wYWRzOiBmaW1jIHZpZGVvIHByb2Nlc3NpbmcgYmxvY2sgcGFkcworICogQG1mOiBtZWRpYSBidXMgZm9ybWF0IGF0IHRoZSBGSU1DIGNhbWVyYSBpbnB1dCAoYW5kIHRoZSBzY2FsZXIgb3V0cHV0KSBwYWQKICAqIEBwZW5kaW5nX2J1Zl9xOiB0aGUgcGVuZGluZyBidWZmZXIgcXVldWUgaGVhZAogICogQGFjdGl2ZV9idWZfcTogdGhlIHF1ZXVlIGhlYWQgb2YgYnVmZmVycyBzY2hlZHVsZWQgaW4gaGFyZHdhcmUKICAqIEB2YnE6IHRoZSBjYXB0dXJlIGFtIHZpZGVvIGJ1ZmZlciBxdWV1ZQpAQCAtMzA0LDE0ICszMjAsMTcgQEAKICAqIEByZXFidWZzX2NvdW50OiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkIGluIFJFUUJVRlMgaW9jdGwKICAqIEBpbnB1dF9pbmRleDogaW5wdXQgKGNhbWVyYSBzZW5zb3IpIGluZGV4CiAgKiBAcmVmY250OiBkcml2ZXIncyBwcml2YXRlIHJlZmVyZW5jZSBjb3VudGVyCisgKiBAaW5wdXQ6IGNhcHR1cmUgaW5wdXQgdHlwZSwgZ3JwX2lkIG9mIHRoZSBhdHRhY2hlZCBzdWJkZXYKKyAqIEB1c2VyX3N1YmRldl9hcGk6IHRydWUgaWYgc3ViZGV2cyBhcmUgbm90IGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3QgZHJpdmVyCiAgKi8KIHN0cnVjdCBmaW1jX3ZpZF9jYXAgewogCXN0cnVjdCBmaW1jX2N0eAkJCSpjdHg7CiAJc3RydWN0IHZiMl9hbGxvY19jdHgJCSphbGxvY19jdHg7CiAJc3RydWN0IHZpZGVvX2RldmljZQkJKnZmZDsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UJCXY0bDJfZGV2OwotCXN0cnVjdCB2NGwyX3N1YmRldgkJKnNkOzsKLQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10CWZtdDsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYJCSpzdWJkZXY7CisJc3RydWN0IG1lZGlhX3BhZAkJdmRfcGFkOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQJbWY7CisJc3RydWN0IG1lZGlhX3BhZAkJc2RfcGFkc1tGSU1DX1NEX1BBRFNfTlVNXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlwZW5kaW5nX2J1Zl9xOwogCXN0cnVjdCBsaXN0X2hlYWQJCWFjdGl2ZV9idWZfcTsKIAlzdHJ1Y3QgdmIyX3F1ZXVlCQl2YnE7CkBAIC0zMjEsNiArMzQwLDggQEAKIAl1bnNpZ25lZCBpbnQJCQlyZXFidWZzX2NvdW50OwogCWludAkJCQlpbnB1dF9pbmRleDsKIAlpbnQJCQkJcmVmY250OworCXUzMgkJCQlpbnB1dDsKKwlib29sCQkJCXVzZXJfc3ViZGV2X2FwaTsKIH07CiAKIC8qKgpAQCAtMzUxLDYgKzM3Miw3IEBACiAgKiBAaGFzX2Npc3RhdHVzMjogMSBpZiBDSVNUQVRVUzIgcmVnaXN0ZXIgaXMgcHJlc2VudCBpbiB0aGlzIElQIHJldmlzaW9uCiAgKiBAaGFzX21haW5zY2FsZXJfZXh0OiAxIGlmIGV4dGVuZGVkIG1haW5zY2FsZXIgcmF0aW9zIGluIENJRVhURU4gcmVnaXN0ZXIKICAqCQkJIGFyZSBwcmVzZW50IGluIHRoaXMgSVAgcmV2aXNpb24KKyAqIEBoYXNfY2FtX2lmOiBzZXQgaWYgdGhpcyBpbnN0YW5jZSBoYXMgYSBjYW1lcmEgaW5wdXQgaW50ZXJmYWNlCiAgKiBAcGl4X2xpbWl0OiBwaXhlbCBzaXplIGNvbnN0cmFpbnRzIGZvciB0aGUgc2NhbGVyCiAgKiBAbWluX2lucF9waXhzaXplOiBtaW5pbXVtIGlucHV0IHBpeGVsIHNpemUKICAqIEBtaW5fb3V0X3BpeHNpemU6IG1pbmltdW0gb3V0cHV0IHBpeGVsIHNpemUKQEAgLTM2Myw2ICszODUsNyBAQAogCXVuc2lnbmVkIGludAloYXNfb3V0X3JvdDoxOwogCXVuc2lnbmVkIGludAloYXNfY2lzdGF0dXMyOjE7CiAJdW5zaWduZWQgaW50CWhhc19tYWluc2NhbGVyX2V4dDoxOworCXVuc2lnbmVkIGludAloYXNfY2FtX2lmOjE7CiAJc3RydWN0IGZpbWNfcGl4X2xpbWl0ICpwaXhfbGltaXQ7CiAJdTE2CQltaW5faW5wX3BpeHNpemU7CiAJdTE2CQltaW5fb3V0X3BpeHNpemU7CkBAIC0zODMsNiArNDA2LDEyIEBACiAJaW50CQludW1fZW50aXRpZXM7CiB9OwogCitzdHJ1Y3QgZmltY19waXBlbGluZSB7CisJc3RydWN0IG1lZGlhX3BpcGVsaW5lICpwaXBlOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Vuc29yOworCXN0cnVjdCB2NGwyX3N1YmRldiAqY3NpczsKK307CisKIHN0cnVjdCBmaW1jX2N0eDsKIAogLyoqCkBAIC0zOTksMTAgKzQyOCwxMiBAQAogICogQHJlZ3NfcmVzOgl0aGUgcmVzb3VyY2UgY2xhaW1lZCBmb3IgSU8gcmVnaXN0ZXJzCiAgKiBAaXJxOglGSU1DIGludGVycnVwdCBudW1iZXIKICAqIEBpcnFfcXVldWU6CWludGVycnVwdCBoYW5kbGVyIHdhaXRxdWV1ZQorICogQHY0bDJfZGV2Oglyb290IHY0bDJfZGV2aWNlCiAgKiBAbTJtOgltZW1vcnktdG8tbWVtb3J5IFY0TDIgZGV2aWNlIGluZm9ybWF0aW9uCiAgKiBAdmlkX2NhcDoJY2FtZXJhIGNhcHR1cmUgZGV2aWNlIGluZm9ybWF0aW9uCiAgKiBAc3RhdGU6CWZsYWdzIHVzZWQgdG8gc3luY2hyb25pemUgbTJtIGFuZCBjYXB0dXJlIG1vZGUgb3BlcmF0aW9uCiAgKiBAYWxsb2NfY3R4Ogl2aWRlb2J1ZjIgbWVtb3J5IGFsbG9jYXRvciBjb250ZXh0CisgKiBAcGlwZWxpbmU6CWZpbWMgdmlkZW8gY2FwdHVyZSBwaXBlbGluZSBkYXRhIHN0cnVjdHVyZQogICovCiBzdHJ1Y3QgZmltY19kZXYgewogCXNwaW5sb2NrX3QJCQlzbG9jazsKQEAgLTQxNywxMCArNDQ4LDEyIEBACiAJc3RydWN0IHJlc291cmNlCQkJKnJlZ3NfcmVzOwogCWludAkJCQlpcnE7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJCWlycV9xdWV1ZTsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UJCSp2NGwyX2RldjsKIAlzdHJ1Y3QgZmltY19tMm1fZGV2aWNlCQltMm07CiAJc3RydWN0IGZpbWNfdmlkX2NhcAkJdmlkX2NhcDsKIAl1bnNpZ25lZCBsb25nCQkJc3RhdGU7CiAJc3RydWN0IHZiMl9hbGxvY19jdHgJCSphbGxvY19jdHg7CisJc3RydWN0IGZpbWNfcGlwZWxpbmUJCXBpcGVsaW5lOwogfTsKIAogLyoqCkBAIC00MzcsMTEgKzQ3MCwxOCBAQAogICogQHNjYWxlcjoJCWltYWdlIHNjYWxlciBwcm9wZXJ0aWVzCiAgKiBAZWZmZWN0OgkJaW1hZ2UgZWZmZWN0CiAgKiBAcm90YXRpb246CQlpbWFnZSBjbG9ja3dpc2Ugcm90YXRpb24gaW4gZGVncmVlcwotICogQGZsaXA6CQlpbWFnZSBmbGlwIG1vZGUKKyAqIEBoZmxpcDoJCWluZGljYXRlcyBpbWFnZSBob3Jpem9udGFsIGZsaXAgaWYgc2V0CisgKiBAdmZsaXA6CQlpbmRpY2F0ZXMgaW1hZ2UgdmVydGljYWwgZmxpcCBpZiBzZXQKICAqIEBmbGFnczoJCWFkZGl0aW9uYWwgZmxhZ3MgZm9yIGltYWdlIGNvbnZlcnNpb24KICAqIEBzdGF0ZToJCWZsYWdzIHRvIGtlZXAgdHJhY2sgb2YgdXNlciBjb25maWd1cmF0aW9uCiAgKiBAZmltY19kZXY6CQl0aGUgRklNQyBkZXZpY2UgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KICAqIEBtMm1fY3R4OgkJbWVtb3J5LXRvLW1lbW9yeSBkZXZpY2UgY29udGV4dAorICogQGZoOgkJCXY0bDIgZmlsZSBoYW5kbGUKKyAqIEBjdHJsX2hhbmRsZXI6CXY0bDIgY29udHJvbHMgaGFuZGxlcgorICogQGN0cmxfcm90YXRlCQlpbWFnZSByb3RhdGlvbiBjb250cm9sCisgKiBAY3RybF9oZmxpcAkJaG9yaXpvbnRhbCBmbGlwIGNvbnRyb2wKKyAqIEBjdHJsX3ZmbGlwCQl2YXJ0aWNhbCBmbGlwIGNvbnRyb2wKKyAqIEBjdHJsc19yZHk6CQl0cnVlIGlmIHRoZSBjb250cm9sIGhhbmRsZXIgaXMgaW5pdGlhbGl6ZWQKICAqLwogc3RydWN0IGZpbWNfY3R4IHsKIAlzcGlubG9ja190CQlzbG9jazsKQEAgLTQ1NiwxMyArNDk2LDQ5IEBACiAJc3RydWN0IGZpbWNfc2NhbGVyCXNjYWxlcjsKIAlzdHJ1Y3QgZmltY19lZmZlY3QJZWZmZWN0OwogCWludAkJCXJvdGF0aW9uOwotCXUzMgkJCWZsaXA7CisJdW5zaWduZWQgaW50CQloZmxpcDoxOworCXVuc2lnbmVkIGludAkJdmZsaXA6MTsKIAl1MzIJCQlmbGFnczsKIAl1MzIJCQlzdGF0ZTsKIAlzdHJ1Y3QgZmltY19kZXYJCSpmaW1jX2RldjsKIAlzdHJ1Y3QgdjRsMl9tMm1fY3R4CSptMm1fY3R4OworCXN0cnVjdCB2NGwyX2ZoCQlmaDsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgY3RybF9oYW5kbGVyOworCXN0cnVjdCB2NGwyX2N0cmwJKmN0cmxfcm90YXRlOworCXN0cnVjdCB2NGwyX2N0cmwJKmN0cmxfaGZsaXA7CisJc3RydWN0IHY0bDJfY3RybAkqY3RybF92ZmxpcDsKKwlib29sCQkJY3RybHNfcmR5OwogfTsKIAorI2RlZmluZSBmaF90b19jdHgoX19maCkgY29udGFpbmVyX29mKF9fZmgsIHN0cnVjdCBmaW1jX2N0eCwgZmgpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnJhbWVfYm91bmRzKHN0cnVjdCBmaW1jX2ZyYW1lICpmLCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQpCit7CisJZi0+b193aWR0aCAgPSB3aWR0aDsKKwlmLT5vX2hlaWdodCA9IGhlaWdodDsKKwlmLT5mX3dpZHRoICA9IHdpZHRoOworCWYtPmZfaGVpZ2h0ID0gaGVpZ2h0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZyYW1lX2Nyb3Aoc3RydWN0IGZpbWNfZnJhbWUgKmYsCisJCQkJICB1MzIgbGVmdCwgdTMyIHRvcCwgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KQoreworCWYtPm9mZnNfaCA9IGxlZnQ7CisJZi0+b2Zmc192ID0gdG9wOworCWYtPndpZHRoICA9IHdpZHRoOworCWYtPmhlaWdodCA9IGhlaWdodDsKK30KKworc3RhdGljIGlubGluZSB1MzIgZmltY19nZXRfZm9ybWF0X2RlcHRoKHN0cnVjdCBmaW1jX2ZtdCAqZmYpCit7CisJdTMyIGksIGRlcHRoID0gMDsKKworCWlmIChmZiAhPSBOVUxMKQorCQlmb3IgKGkgPSAwOyBpIDwgZmYtPmNvbHBsYW5lczsgaSsrKQorCQkJZGVwdGggKz0gZmYtPmRlcHRoW2ldOworCXJldHVybiBkZXB0aDsKK30KKwogc3RhdGljIGlubGluZSBib29sIGZpbWNfY2FwdHVyZV9hY3RpdmUoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC01NjEsNyArNjM3LDcgQEAKIAl9IGVsc2UgaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgPT0gdHlwZSkgewogCQlmcmFtZSA9ICZjdHgtPmRfZnJhbWU7CiAJfSBlbHNlIHsKLQkJdjRsMl9lcnIoJmN0eC0+ZmltY19kZXYtPm0ybS52NGwyX2RldiwKKwkJdjRsMl9lcnIoY3R4LT5maW1jX2Rldi0+djRsMl9kZXYsCiAJCQkiV3JvbmcgYnVmZmVyL3ZpZGVvIHF1ZXVlIHR5cGUgKCVkKVxuIiwgdHlwZSk7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KQEAgLTU5NSw3ICs2NzEsNyBAQAogdm9pZCBmaW1jX2h3X3NldF9wcmVzY2FsZXIoc3RydWN0IGZpbWNfY3R4ICpjdHgpOwogdm9pZCBmaW1jX2h3X3NldF9tYWluc2NhbGVyKHN0cnVjdCBmaW1jX2N0eCAqY3R4KTsKIHZvaWQgZmltY19od19lbl9jYXB0dXJlKHN0cnVjdCBmaW1jX2N0eCAqY3R4KTsKLXZvaWQgZmltY19od19zZXRfZWZmZWN0KHN0cnVjdCBmaW1jX2N0eCAqY3R4KTsKK3ZvaWQgZmltY19od19zZXRfZWZmZWN0KHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBib29sIGFjdGl2ZSk7CiB2b2lkIGZpbWNfaHdfc2V0X2luX2RtYShzdHJ1Y3QgZmltY19jdHggKmN0eCk7CiB2b2lkIGZpbWNfaHdfc2V0X2lucHV0X3BhdGgoc3RydWN0IGZpbWNfY3R4ICpjdHgpOwogdm9pZCBmaW1jX2h3X3NldF9vdXRwdXRfcGF0aChzdHJ1Y3QgZmltY19jdHggKmN0eCk7CkBAIC02MTQsMzYgKzY5MCw0NSBAQAogLyogZmltYy1jb3JlLmMgKi8KIGludCBmaW1jX3ZpZGlvY19lbnVtX2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZik7Ci1pbnQgZmltY192aWRpb2NfZ19mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwotaW50IGZpbWNfdmlkaW9jX3RyeV9mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7Ci1pbnQgZmltY192aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKTsKLWludCBmaW1jX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCSAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKTsKK2ludCBmaW1jX2N0cmxzX2NyZWF0ZShzdHJ1Y3QgZmltY19jdHggKmN0eCk7Cit2b2lkIGZpbWNfY3RybHNfZGVsZXRlKHN0cnVjdCBmaW1jX2N0eCAqY3R4KTsKK3ZvaWQgZmltY19jdHJsc19hY3RpdmF0ZShzdHJ1Y3QgZmltY19jdHggKmN0eCwgYm9vbCBhY3RpdmUpOworaW50IGZpbWNfZmlsbF9mb3JtYXQoc3RydWN0IGZpbWNfZnJhbWUgKmZyYW1lLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwordm9pZCBmaW1jX2FkanVzdF9tcGxhbmVfZm9ybWF0KHN0cnVjdCBmaW1jX2ZtdCAqZm10LCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQsCisJCQkgICAgICAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeCk7CitzdHJ1Y3QgZmltY19mbXQgKmZpbWNfZmluZF9mb3JtYXQodTMyICpwaXhlbGZvcm1hdCwgdTMyICptYnVzX2NvZGUsCisJCQkJICB1bnNpZ25lZCBpbnQgbWFzaywgaW50IGluZGV4KTsKIAotaW50IGZpbWNfdHJ5X2Nyb3Aoc3RydWN0IGZpbWNfY3R4ICpjdHgsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyKTsKLWludCBjaGVja19jdHJsX3ZhbChzdHJ1Y3QgZmltY19jdHggKmN0eCwgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpOwotaW50IGZpbWNfc19jdHJsKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKTsKLQotc3RydWN0IGZpbWNfZm10ICpmaW5kX2Zvcm1hdChzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYsIHVuc2lnbmVkIGludCBtYXNrKTsKLXN0cnVjdCBmaW1jX2ZtdCAqZmluZF9tYnVzX2Zvcm1hdChzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmLAotCQkJCSAgdW5zaWduZWQgaW50IG1hc2spOwotCi1pbnQgZmltY19jaGVja19zY2FsZXJfcmF0aW8oaW50IHN3LCBpbnQgc2gsIGludCBkdywgaW50IGRoLCBpbnQgcm90KTsKK2ludCBmaW1jX2NoZWNrX3NjYWxlcl9yYXRpbyhzdHJ1Y3QgZmltY19jdHggKmN0eCwgaW50IHN3LCBpbnQgc2gsCisJCQkgICAgaW50IGR3LCBpbnQgZGgsIGludCByb3RhdGlvbik7CiBpbnQgZmltY19zZXRfc2NhbGVyX2luZm8oc3RydWN0IGZpbWNfY3R4ICpjdHgpOwogaW50IGZpbWNfcHJlcGFyZV9jb25maWcoc3RydWN0IGZpbWNfY3R4ICpjdHgsIHUzMiBmbGFncyk7CiBpbnQgZmltY19wcmVwYXJlX2FkZHIoc3RydWN0IGZpbWNfY3R4ICpjdHgsIHN0cnVjdCB2YjJfYnVmZmVyICp2YiwKIAkJICAgICAgc3RydWN0IGZpbWNfZnJhbWUgKmZyYW1lLCBzdHJ1Y3QgZmltY19hZGRyICpwYWRkcik7Cit2b2lkIGZpbWNfcHJlcGFyZV9kbWFfb2Zmc2V0KHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBzdHJ1Y3QgZmltY19mcmFtZSAqZik7Cit2b2lkIGZpbWNfc2V0X3l1dl9vcmRlcihzdHJ1Y3QgZmltY19jdHggKmN0eCk7Cit2b2lkIGZpbWNfZmlsbF9mcmFtZShzdHJ1Y3QgZmltY19mcmFtZSAqZnJhbWUsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7Cit2b2lkIGZpbWNfY2FwdHVyZV9pcnFfaGFuZGxlcihzdHJ1Y3QgZmltY19kZXYgKmZpbWMsIGJvb2wgZG9uZSk7CisKK2ludCBmaW1jX3JlZ2lzdGVyX20ybV9kZXZpY2Uoc3RydWN0IGZpbWNfZGV2ICpmaW1jLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KTsKK3ZvaWQgZmltY191bnJlZ2lzdGVyX20ybV9kZXZpY2Uoc3RydWN0IGZpbWNfZGV2ICpmaW1jKTsKK2ludCBmaW1jX3JlZ2lzdGVyX2RyaXZlcih2b2lkKTsKK3ZvaWQgZmltY191bnJlZ2lzdGVyX2RyaXZlcih2b2lkKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogZmltYy1jYXB0dXJlLmMJCQkJCSovCi1pbnQgZmltY19yZWdpc3Rlcl9jYXB0dXJlX2RldmljZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpOworaW50IGZpbWNfcmVnaXN0ZXJfY2FwdHVyZV9kZXZpY2Uoc3RydWN0IGZpbWNfZGV2ICpmaW1jLAorCQkJCSBzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KTsKIHZvaWQgZmltY191bnJlZ2lzdGVyX2NhcHR1cmVfZGV2aWNlKHN0cnVjdCBmaW1jX2RldiAqZmltYyk7Ci1pbnQgZmltY19zZW5zb3Jfc2RfaW5pdChzdHJ1Y3QgZmltY19kZXYgKmZpbWMsIGludCBpbmRleCk7CitpbnQgZmltY19jYXB0dXJlX2N0cmxzX2NyZWF0ZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpOwogaW50IGZpbWNfdmlkX2NhcF9idWZfcXVldWUoc3RydWN0IGZpbWNfZGV2ICpmaW1jLAogCQkJICAgICBzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpmaW1jX3ZiKTsKK3ZvaWQgZmltY19zZW5zb3Jfbm90aWZ5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHVuc2lnbmVkIGludCBub3RpZmljYXRpb24sCisJCQl2b2lkICphcmcpOworaW50IGZpbWNfY2FwdHVyZV9zdXNwZW5kKHN0cnVjdCBmaW1jX2RldiAqZmltYyk7CitpbnQgZmltY19jYXB0dXJlX3Jlc3VtZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpOworaW50IGZpbWNfY2FwdHVyZV9jb25maWdfdXBkYXRlKHN0cnVjdCBmaW1jX2N0eCAqY3R4KTsKIAogLyogTG9ja2luZzogdGhlIGNhbGxlciBob2xkcyBmaW1jLT5zbG9jayAqLwogc3RhdGljIGlubGluZSB2b2lkIGZpbWNfYWN0aXZhdGVfY2FwdHVyZShzdHJ1Y3QgZmltY19jdHggKmN0eCkKQEAgLTY2MSwyMiArNzQ2LDI3IEBACiB9CiAKIC8qCi0gKiBBZGQgYnVmIHRvIHRoZSBjYXB0dXJlIGFjdGl2ZSBidWZmZXJzIHF1ZXVlLgotICogTG9ja2luZzogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCBmaW1jX2Rldjo6c2xvY2sgaGVsZC4KKyAqIEJ1ZmZlciBsaXN0IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMuIE11c3QgYmUgY2FsbGVkIHdpdGggZmltYy5zbG9jayBoZWxkLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZlX3F1ZXVlX2FkZChzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwLAotCQkJCSAgICBzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpidWYpCisKKy8qKgorICogZmltY19hY3RpdmVfcXVldWVfYWRkIC0gYWRkIGJ1ZmZlciB0byB0aGUgY2FwdHVyZSBhY3RpdmUgYnVmZmVycyBxdWV1ZQorICogQGJ1ZjogYnVmZmVyIHRvIGFkZCB0byB0aGUgYWN0aXZlIGJ1ZmZlcnMgbGlzdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmltY19hY3RpdmVfcXVldWVfYWRkKHN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXAsCisJCQkJCSBzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpidWYpCiB7CiAJbGlzdF9hZGRfdGFpbCgmYnVmLT5saXN0LCAmdmlkX2NhcC0+YWN0aXZlX2J1Zl9xKTsKIAl2aWRfY2FwLT5hY3RpdmVfYnVmX2NudCsrOwogfQogCi0vKgotICogUG9wIGEgdmlkZW8gYnVmZmVyIGZyb20gdGhlIGNhcHR1cmUgYWN0aXZlIGJ1ZmZlcnMgcXVldWUKLSAqIExvY2tpbmc6IE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggZmltY19kZXY6OnNsb2NrIGhlbGQuCisvKioKKyAqIGZpbWNfYWN0aXZlX3F1ZXVlX3BvcCAtIHBvcCBidWZmZXIgZnJvbSB0aGUgY2FwdHVyZSBhY3RpdmUgYnVmZmVycyBxdWV1ZQorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhlIGFjdGl2ZV9idWZfcSBsaXN0IGlzIG5vdCBlbXB0eS4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZmltY192aWRfYnVmZmVyICoKLWFjdGl2ZV9xdWV1ZV9wb3Aoc3RydWN0IGZpbWNfdmlkX2NhcCAqdmlkX2NhcCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqZmltY19hY3RpdmVfcXVldWVfcG9wKAorCQkJCSAgICBzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwKQogewogCXN0cnVjdCBmaW1jX3ZpZF9idWZmZXIgKmJ1ZjsKIAlidWYgPSBsaXN0X2VudHJ5KHZpZF9jYXAtPmFjdGl2ZV9idWZfcS5uZXh0LApAQCAtNjg2LDE2ICs3NzYsMjMgQEAKIAlyZXR1cm4gYnVmOwogfQogCi0vKiBBZGQgdmlkZW8gYnVmZmVyIHRvIHRoZSBjYXB0dXJlIHBlbmRpbmcgYnVmZmVycyBxdWV1ZSAqLworLyoqCisgKiBmaW1jX3BlbmRpbmdfcXVldWVfYWRkIC0gYWRkIGJ1ZmZlciB0byB0aGUgY2FwdHVyZSBwZW5kaW5nIGJ1ZmZlcnMgcXVldWUKKyAqIEBidWY6IGJ1ZmZlciB0byBhZGQgdG8gdGhlIHBlbmRpbmcgYnVmZmVycyBsaXN0CisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmaW1jX3BlbmRpbmdfcXVldWVfYWRkKHN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXAsCiAJCQkJCSAgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqYnVmKQogewogCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJnZpZF9jYXAtPnBlbmRpbmdfYnVmX3EpOwogfQogCi0vKiBBZGQgdmlkZW8gYnVmZmVyIHRvIHRoZSBjYXB0dXJlIHBlbmRpbmcgYnVmZmVycyBxdWV1ZSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZmltY192aWRfYnVmZmVyICoKLXBlbmRpbmdfcXVldWVfcG9wKHN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXApCisvKioKKyAqIGZpbWNfcGVuZGluZ19xdWV1ZV9wb3AgLSBwb3AgYnVmZmVyIGZyb20gdGhlIGNhcHR1cmUgcGVuZGluZyBidWZmZXJzIHF1ZXVlCisgKgorICogVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGUgcGVuZGluZ19idWZfcSBsaXN0IGlzIG5vdCBlbXB0eS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpmaW1jX3BlbmRpbmdfcXVldWVfcG9wKAorCQkJCSAgICAgc3RydWN0IGZpbWNfdmlkX2NhcCAqdmlkX2NhcCkKIHsKIAlzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpidWY7CiAJYnVmID0gbGlzdF9lbnRyeSh2aWRfY2FwLT5wZW5kaW5nX2J1Zl9xLm5leHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtbWRldmljZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLW1kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzMzN2IxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLW1kZXZpY2UuYwpAQCAtMCwwICsxLDg1OCBAQAorLyoKKyAqIFM1UC9FWFlOT1M0IFNvQyBzZXJpZXMgY2FtZXJhIGhvc3QgaW50ZXJmYWNlIG1lZGlhIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIENvbnRhY3Q6IFN5bHdlc3RlciBOYXdyb2NraSwgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWEtZGV2aWNlLmg+CisKKyNpbmNsdWRlICJmaW1jLWNvcmUuaCIKKyNpbmNsdWRlICJmaW1jLW1kZXZpY2UuaCIKKyNpbmNsdWRlICJtaXBpLWNzaXMuaCIKKworc3RhdGljIGludCBfX2ZpbWNfbWRfc2V0X2NhbWNsayhzdHJ1Y3QgZmltY19tZCAqZm1kLAorCQkJCXN0cnVjdCBmaW1jX3NlbnNvcl9pbmZvICpzX2luZm8sCisJCQkJYm9vbCBvbik7CisvKioKKyAqIGZpbWNfcGlwZWxpbmVfcHJlcGFyZSAtIHVwZGF0ZSBwaXBlbGluZSBpbmZvcm1hdGlvbiB3aXRoIHN1YmRldmljZSBwb2ludGVycworICogQGZpbWM6IGZpbWMgZGV2aWNlIHRlcm1pbmF0aW5nIHRoZSBwaXBlbGluZQorICoKKyAqIENhbGxlciBob2xkcyB0aGUgZ3JhcGggbXV0ZXguCisgKi8KK3ZvaWQgZmltY19waXBlbGluZV9wcmVwYXJlKHN0cnVjdCBmaW1jX2RldiAqZmltYywgc3RydWN0IG1lZGlhX2VudGl0eSAqbWUpCit7CisJc3RydWN0IG1lZGlhX2VudGl0eV9ncmFwaCBncmFwaDsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCisJbWVkaWFfZW50aXR5X2dyYXBoX3dhbGtfc3RhcnQoJmdyYXBoLCBtZSk7CisKKwl3aGlsZSAoKG1lID0gbWVkaWFfZW50aXR5X2dyYXBoX3dhbGtfbmV4dCgmZ3JhcGgpKSkgeworCQlpZiAobWVkaWFfZW50aXR5X3R5cGUobWUpICE9IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWKQorCQkJY29udGludWU7CisJCXNkID0gbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KG1lKTsKKworCQlpZiAoc2QtPmdycF9pZCA9PSBTRU5TT1JfR1JPVVBfSUQpCisJCQlmaW1jLT5waXBlbGluZS5zZW5zb3IgPSBzZDsKKwkJZWxzZSBpZiAoc2QtPmdycF9pZCA9PSBDU0lTX0dST1VQX0lEKQorCQkJZmltYy0+cGlwZWxpbmUuY3NpcyA9IHNkOworCX0KK30KKworLyoqCisgKiBfX3N1YmRldl9zZXRfcG93ZXIgLSBjaGFuZ2UgcG93ZXIgc3RhdGUgb2YgYSBzaW5nbGUgc3ViZGV2CisgKiBAc2Q6IHN1YmRldmljZSB0byBjaGFuZ2UgcG93ZXIgc3RhdGUgZm9yCisgKiBAb246IDEgdG8gZW5hYmxlIHBvd2VyIG9yIDAgdG8gZGlzYWJsZQorICoKKyAqIFJldHVybiByZXN1bHQgb2Ygc19wb3dlciBzdWJkZXYgb3BlcmF0aW9uIG9yIC1FTlhJTyBpZiBzZCBhcmd1bWVudAorICogaXMgTlVMTC4gUmV0dXJuIDAgaWYgdGhlIHN1YmRldmljZSBkb2VzIG5vdCBpbXBsZW1lbnQgc19wb3dlci4KKyAqLworc3RhdGljIGludCBfX3N1YmRldl9zZXRfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQoreworCWludCAqdXNlX2NvdW50OworCWludCByZXQ7CisKKwlpZiAoc2QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXVzZV9jb3VudCA9ICZzZC0+ZW50aXR5LnVzZV9jb3VudDsKKwlpZiAob24gJiYgKCp1c2VfY291bnQpKysgPiAwKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICghb24gJiYgKCp1c2VfY291bnQgPT0gMCB8fCAtLSgqdXNlX2NvdW50KSA+IDApKQorCQlyZXR1cm4gMDsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX3Bvd2VyLCBvbik7CisKKwlyZXR1cm4gcmV0ICE9IC1FTk9JT0NUTENNRCA/IHJldCA6IDA7Cit9CisKKy8qKgorICogZmltY19waXBlbGluZV9zX3Bvd2VyIC0gY2hhbmdlIHBvd2VyIHN0YXRlIG9mIGFsbCBwaXBlbGluZSBzdWJkZXZzCisgKiBAZmltYzogZmltYyBkZXZpY2UgdGVybWluYXRpbmcgdGhlIHBpcGVsaW5lCisgKiBAc3RhdGU6IDEgdG8gZW5hYmxlIHBvd2VyIG9yIDAgZm9yIHBvd2VyIGRvd24KKyAqCisgKiBOZWVkIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBncmFwaCBtdXRleCBoZWxkLgorICovCitpbnQgZmltY19waXBlbGluZV9zX3Bvd2VyKHN0cnVjdCBmaW1jX2RldiAqZmltYywgaW50IHN0YXRlKQoreworCWludCByZXQgPSAwOworCisJaWYgKGZpbWMtPnBpcGVsaW5lLnNlbnNvciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKHN0YXRlKSB7CisJCXJldCA9IF9fc3ViZGV2X3NldF9wb3dlcihmaW1jLT5waXBlbGluZS5jc2lzLCAxKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOWElPKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIF9fc3ViZGV2X3NldF9wb3dlcihmaW1jLT5waXBlbGluZS5zZW5zb3IsIDEpOworCX0KKworCXJldCA9IF9fc3ViZGV2X3NldF9wb3dlcihmaW1jLT5waXBlbGluZS5zZW5zb3IsIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gX19zdWJkZXZfc2V0X3Bvd2VyKGZpbWMtPnBpcGVsaW5lLmNzaXMsIDApOworCisJcmV0dXJuIHJldCA9PSAtRU5YSU8gPyAwIDogcmV0OworfQorCisvKioKKyAqIF9fZmltY19waXBlbGluZV9pbml0aWFsaXplIC0gdXBkYXRlIHRoZSBwaXBlbGluZSBpbmZvcm1hdGlvbiwgZW5hYmxlIHBvd2VyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGFsbCBwaXBlbGluZSBzdWJkZXZzIGFuZCB0aGUgc2Vuc29yIGNsb2NrCisgKiBAbWU6IG1lZGlhIGVudGl0eSB0byBzdGFydCBncmFwaCB3YWxrIHdpdGgKKyAqIEBwcmVwOiB0cnVlIHRvIGFjcXVpcmUgc2Vuc29yIChhbmQgY3Npcykgc3ViZGV2cworICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgZ3JhcGggbXV0ZXggaGVsZC4KKyAqLworc3RhdGljIGludCBfX2ZpbWNfcGlwZWxpbmVfaW5pdGlhbGl6ZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMsCisJCQkJICAgICAgc3RydWN0IG1lZGlhX2VudGl0eSAqbWUsIGJvb2wgcHJlcCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHByZXApCisJCWZpbWNfcGlwZWxpbmVfcHJlcGFyZShmaW1jLCBtZSk7CisJaWYgKGZpbWMtPnBpcGVsaW5lLnNlbnNvciA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBmaW1jX21kX3NldF9jYW1jbGsoZmltYy0+cGlwZWxpbmUuc2Vuc29yLCB0cnVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBmaW1jX3BpcGVsaW5lX3NfcG93ZXIoZmltYywgMSk7Cit9CisKK2ludCBmaW1jX3BpcGVsaW5lX2luaXRpYWxpemUoc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBzdHJ1Y3QgbWVkaWFfZW50aXR5ICptZSwKKwkJCSAgICAgYm9vbCBwcmVwKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZtZS0+cGFyZW50LT5ncmFwaF9tdXRleCk7CisJcmV0ID0gIF9fZmltY19waXBlbGluZV9pbml0aWFsaXplKGZpbWMsIG1lLCBwcmVwKTsKKwltdXRleF91bmxvY2soJm1lLT5wYXJlbnQtPmdyYXBoX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogX19maW1jX3BpcGVsaW5lX3NodXRkb3duIC0gZGlzYWJsZSB0aGUgc2Vuc29yIGNsb2NrIGFuZCBwaXBlbGluZSBwb3dlcgorICogQGZpbWM6IGZpbWMgZGV2aWNlIHRlcm1pbmF0aW5nIHRoZSBwaXBlbGluZQorICoKKyAqIERpc2FibGUgcG93ZXIgb2YgYWxsIHN1YmRldnMgaW4gdGhlIHBpcGVsaW5lIGFuZCB0dXJuIG9mZiB0aGUgZXh0ZXJuYWwKKyAqIHNlbnNvciBjbG9jay4KKyAqIENhbGxlZCB3aXRoIHRoZSBncmFwaCBtdXRleCBoZWxkLgorICovCitpbnQgX19maW1jX3BpcGVsaW5lX3NodXRkb3duKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChmaW1jLT5waXBlbGluZS5zZW5zb3IpIHsKKwkJcmV0ID0gZmltY19waXBlbGluZV9zX3Bvd2VyKGZpbWMsIDApOworCQlmaW1jX21kX3NldF9jYW1jbGsoZmltYy0+cGlwZWxpbmUuc2Vuc29yLCBmYWxzZSk7CisJfQorCXJldHVybiByZXQgPT0gLUVOWElPID8gMCA6IHJldDsKK30KKworaW50IGZpbWNfcGlwZWxpbmVfc2h1dGRvd24oc3RydWN0IGZpbWNfZGV2ICpmaW1jKQoreworCXN0cnVjdCBtZWRpYV9lbnRpdHkgKm1lID0gJmZpbWMtPnZpZF9jYXAudmZkLT5lbnRpdHk7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm1lLT5wYXJlbnQtPmdyYXBoX211dGV4KTsKKwlyZXQgPSBfX2ZpbWNfcGlwZWxpbmVfc2h1dGRvd24oZmltYyk7CisJbXV0ZXhfdW5sb2NrKCZtZS0+cGFyZW50LT5ncmFwaF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGZpbWNfcGlwZWxpbmVfc19zdHJlYW0gLSBpbnZva2Ugc19zdHJlYW0gb24gcGlwZWxpbmUgc3ViZGV2cworICogQGZpbWM6IGZpbWMgZGV2aWNlIHRlcm1pbmF0aW5nIHRoZSBwaXBlbGluZQorICogQG9uOiBwYXNzZWQgYXMgdGhlIHNfc3RyZWFtIGNhbGwgYXJndW1lbnQKKyAqLworaW50IGZpbWNfcGlwZWxpbmVfc19zdHJlYW0oc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBpbnQgb24pCit7CisJc3RydWN0IGZpbWNfcGlwZWxpbmUgKnAgPSAmZmltYy0+cGlwZWxpbmU7CisJaW50IHJldCA9IDA7CisKKwlpZiAocC0+c2Vuc29yID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChvbiAmJiBwLT5jc2lzKSB8fCAhb24pCisJCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwob24gPyBwLT5jc2lzIDogcC0+c2Vuc29yLAorCQkJCSAgICAgICB2aWRlbywgc19zdHJlYW0sIG9uKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQorCQlyZXR1cm4gcmV0OworCWlmICgoIW9uICYmIHAtPmNzaXMpIHx8IG9uKQorCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKG9uID8gcC0+c2Vuc29yIDogcC0+Y3NpcywKKwkJCQkgICAgICAgdmlkZW8sIHNfc3RyZWFtLCBvbik7CisJcmV0dXJuIHJldCA9PSAtRU5PSU9DVExDTUQgPyAwIDogcmV0OworfQorCisvKgorICogU2Vuc29yIHN1YmRldmljZSBoZWxwZXIgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXYgKmZpbWNfbWRfcmVnaXN0ZXJfc2Vuc29yKHN0cnVjdCBmaW1jX21kICpmbWQsCisJCQkJICAgc3RydWN0IGZpbWNfc2Vuc29yX2luZm8gKnNfaW5mbykKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IE5VTEw7CisKKwlpZiAoIXNfaW5mbyB8fCAhZm1kKQorCQlyZXR1cm4gTlVMTDsKKworCWFkYXB0ZXIgPSBpMmNfZ2V0X2FkYXB0ZXIoc19pbmZvLT5wZGF0YS0+aTJjX2J1c19udW0pOworCWlmICghYWRhcHRlcikKKwkJcmV0dXJuIE5VTEw7CisJc2QgPSB2NGwyX2kyY19uZXdfc3ViZGV2X2JvYXJkKCZmbWQtPnY0bDJfZGV2LCBhZGFwdGVyLAorCQkJCSAgICAgICBzX2luZm8tPnBkYXRhLT5ib2FyZF9pbmZvLCBOVUxMKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoc2QpKSB7CisJCXY0bDJfZXJyKCZmbWQtPnY0bDJfZGV2LCAiRmFpbGVkIHRvIGFjcXVpcmUgc3ViZGV2XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXY0bDJfc2V0X3N1YmRldl9ob3N0ZGF0YShzZCwgc19pbmZvKTsKKwlzZC0+Z3JwX2lkID0gU0VOU09SX0dST1VQX0lEOworCisJdjRsMl9pbmZvKCZmbWQtPnY0bDJfZGV2LCAiUmVnaXN0ZXJlZCBzZW5zb3Igc3ViZGV2aWNlICVzXG4iLAorCQkgIHNfaW5mby0+cGRhdGEtPmJvYXJkX2luZm8tPnR5cGUpOworCXJldHVybiBzZDsKK30KKworc3RhdGljIHZvaWQgZmltY19tZF91bnJlZ2lzdGVyX3NlbnNvcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghY2xpZW50KQorCQlyZXR1cm47CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOworCWkyY191bnJlZ2lzdGVyX2RldmljZShjbGllbnQpOworCWkyY19wdXRfYWRhcHRlcihjbGllbnQtPmFkYXB0ZXIpOworfQorCitzdGF0aWMgaW50IGZpbWNfbWRfcmVnaXN0ZXJfc2Vuc29yX2VudGl0aWVzKHN0cnVjdCBmaW1jX21kICpmbWQpCit7CisJc3RydWN0IHM1cF9wbGF0Zm9ybV9maW1jICpwZGF0YSA9IGZtZC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGZpbWNfZGV2ICpmZCA9IE5VTEw7CisJaW50IG51bV9jbGllbnRzLCByZXQsIGk7CisKKwkvKgorCSAqIFJ1bnRpbWUgcmVzdW1lIG9uZSBvZiB0aGUgRklNQyBlbnRpdGllcyB0byBtYWtlIHN1cmUKKwkgKiB0aGUgc2Nsa19jYW0gY2xvY2tzIGFyZSBub3QgZ2xvYmFsbHkgZGlzYWJsZWQuCisJICovCisJZm9yIChpID0gMDsgIWZkICYmIGkgPCBBUlJBWV9TSVpFKGZtZC0+ZmltYyk7IGkrKykKKwkJaWYgKGZtZC0+ZmltY1tpXSkKKwkJCWZkID0gZm1kLT5maW1jW2ldOworCWlmICghZmQpCisJCXJldHVybiAtRU5YSU87CisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmZmQtPnBkZXYtPmRldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlXQVJOX09OKHBkYXRhLT5udW1fY2xpZW50cyA+IEFSUkFZX1NJWkUoZm1kLT5zZW5zb3IpKTsKKwludW1fY2xpZW50cyA9IG1pbl90KHUzMiwgcGRhdGEtPm51bV9jbGllbnRzLCBBUlJBWV9TSVpFKGZtZC0+c2Vuc29yKSk7CisKKwlmbWQtPm51bV9zZW5zb3JzID0gbnVtX2NsaWVudHM7CisJZm9yIChpID0gMDsgaSA8IG51bV9jbGllbnRzOyBpKyspIHsKKwkJZm1kLT5zZW5zb3JbaV0ucGRhdGEgPSAmcGRhdGEtPmlzcF9pbmZvW2ldOworCQlyZXQgPSBfX2ZpbWNfbWRfc2V0X2NhbWNsayhmbWQsICZmbWQtPnNlbnNvcltpXSwgdHJ1ZSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJZm1kLT5zZW5zb3JbaV0uc3ViZGV2ID0KKwkJCWZpbWNfbWRfcmVnaXN0ZXJfc2Vuc29yKGZtZCwgJmZtZC0+c2Vuc29yW2ldKTsKKwkJcmV0ID0gX19maW1jX21kX3NldF9jYW1jbGsoZm1kLCAmZm1kLT5zZW5zb3JbaV0sIGZhbHNlKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKwlwbV9ydW50aW1lX3B1dCgmZmQtPnBkZXYtPmRldik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1JUEkgQ1NJUyBhbmQgRklNQyBwbGF0Zm9ybSBkZXZpY2VzIHJlZ2lzdHJhdGlvbi4KKyAqLworc3RhdGljIGludCBmaW1jX3JlZ2lzdGVyX2NhbGxiYWNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZmltY19tZCAqZm1kID0gcDsKKwlpbnQgcmV0OworCisJaWYgKCFmaW1jIHx8ICFmaW1jLT5wZGV2KQorCQlyZXR1cm4gMDsKKwlpZiAoZmltYy0+cGRldi0+aWQgPCAwIHx8IGZpbWMtPnBkZXYtPmlkID49IEZJTUNfTUFYX0RFVlMpCisJCXJldHVybiAwOworCisJZm1kLT5maW1jW2ZpbWMtPnBkZXYtPmlkXSA9IGZpbWM7CisJcmV0ID0gZmltY19yZWdpc3Rlcl9tMm1fZGV2aWNlKGZpbWMsICZmbWQtPnY0bDJfZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGZpbWNfcmVnaXN0ZXJfY2FwdHVyZV9kZXZpY2UoZmltYywgJmZtZC0+djRsMl9kZXYpOworCWlmICghcmV0KQorCQlmaW1jLT52aWRfY2FwLnVzZXJfc3ViZGV2X2FwaSA9IGZtZC0+dXNlcl9zdWJkZXZfYXBpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3Npc19yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGZpbWNfbWQgKmZtZCA9IHA7CisJaW50IGlkLCByZXQ7CisKKwlpZiAoIXNkKQorCQlyZXR1cm4gMDsKKwlwZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJaWYgKCFwZGV2IHx8IHBkZXYtPmlkIDwgMCB8fCBwZGV2LT5pZCA+PSBDU0lTX01BWF9FTlRJVElFUykKKwkJcmV0dXJuIDA7CisJdjRsMl9pbmZvKHNkLCAiY3NpcyVkIHNkOiAlc1xuIiwgcGRldi0+aWQsIHNkLT5uYW1lKTsKKworCWlkID0gcGRldi0+aWQgPCAwID8gMCA6IHBkZXYtPmlkOworCWZtZC0+Y3Npc1tpZF0uc2QgPSBzZDsKKwlzZC0+Z3JwX2lkID0gQ1NJU19HUk9VUF9JRDsKKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYoJmZtZC0+djRsMl9kZXYsIHNkKTsKKwlpZiAocmV0KQorCQl2NGwyX2VycigmZm1kLT52NGwyX2RldiwKKwkJCSAiRmFpbGVkIHRvIHJlZ2lzdGVyIENTSVMgc3ViZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGZpbWNfbWRfcmVnaXN0ZXJfcGxhdGZvcm1fZW50aXRpZXMgLSByZWdpc3RlciBGSU1DIGFuZCBDU0lTIG1lZGlhIGVudGl0aWVzCisgKi8KK3N0YXRpYyBpbnQgZmltY19tZF9yZWdpc3Rlcl9wbGF0Zm9ybV9lbnRpdGllcyhzdHJ1Y3QgZmltY19tZCAqZm1kKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXI7CisJaW50IHJldDsKKworCWRyaXZlciA9IGRyaXZlcl9maW5kKEZJTUNfTU9EVUxFX05BTUUsICZwbGF0Zm9ybV9idXNfdHlwZSk7CisJaWYgKCFkcml2ZXIpCisJCXJldHVybiAtRU5PREVWOworCXJldCA9IGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoZHJpdmVyLCBOVUxMLCBmbWQsCisJCQkJICAgICBmaW1jX3JlZ2lzdGVyX2NhbGxiYWNrKTsKKwlwdXRfZHJpdmVyKGRyaXZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRyaXZlciA9IGRyaXZlcl9maW5kKENTSVNfRFJJVkVSX05BTUUsICZwbGF0Zm9ybV9idXNfdHlwZSk7CisJaWYgKGRyaXZlcikgeworCQlyZXQgPSBkcml2ZXJfZm9yX2VhY2hfZGV2aWNlKGRyaXZlciwgTlVMTCwgZm1kLAorCQkJCQkgICAgIGNzaXNfcmVnaXN0ZXJfY2FsbGJhY2spOworCQlwdXRfZHJpdmVyKGRyaXZlcik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpbWNfbWRfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgZmltY19tZCAqZm1kKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEZJTUNfTUFYX0RFVlM7IGkrKykgeworCQlpZiAoZm1kLT5maW1jW2ldID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZmltY191bnJlZ2lzdGVyX20ybV9kZXZpY2UoZm1kLT5maW1jW2ldKTsKKwkJZmltY191bnJlZ2lzdGVyX2NhcHR1cmVfZGV2aWNlKGZtZC0+ZmltY1tpXSk7CisJCWZtZC0+ZmltY1tpXSA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBDU0lTX01BWF9FTlRJVElFUzsgaSsrKSB7CisJCWlmIChmbWQtPmNzaXNbaV0uc2QgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihmbWQtPmNzaXNbaV0uc2QpOworCQlmbWQtPmNzaXNbaV0uc2QgPSBOVUxMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZm1kLT5udW1fc2Vuc29yczsgaSsrKSB7CisJCWlmIChmbWQtPnNlbnNvcltpXS5zdWJkZXYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmaW1jX21kX3VucmVnaXN0ZXJfc2Vuc29yKGZtZC0+c2Vuc29yW2ldLnN1YmRldik7CisJCWZtZC0+c2Vuc29yW2ldLnN1YmRldiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGZpbWNfbWRfcmVnaXN0ZXJfdmlkZW9fbm9kZXMoc3RydWN0IGZpbWNfbWQgKmZtZCkKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBGSU1DX01BWF9ERVZTICYmICFyZXQ7IGkrKykgeworCQlpZiAoIWZtZC0+ZmltY1tpXSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChmbWQtPmZpbWNbaV0tPm0ybS52ZmQpCisJCQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZm1kLT5maW1jW2ldLT5tMm0udmZkLAorCQkJCQkJICAgIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlpZiAoZm1kLT5maW1jW2ldLT52aWRfY2FwLnZmZCkKKwkJCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShmbWQtPmZpbWNbaV0tPnZpZF9jYXAudmZkLAorCQkJCQkJICAgIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9fZmltY19tZF9jcmVhdGVfZmltY19saW5rcyAtIGNyZWF0ZSBsaW5rcyB0byBhbGwgRklNQyBlbnRpdGllcworICogQGZtZDogZmltYyBtZWRpYSBkZXZpY2UKKyAqIEBzb3VyY2U6IHRoZSBzb3VyY2UgZW50aXR5IHRvIGNyZWF0ZSBsaW5rcyB0byBhbGwgZmltYyBlbnRpdGllcyBmcm9tCisgKiBAc2Vuc29yOiBzZW5zb3Igc3ViZGV2IGxpbmtlZCB0byBGSU1DW2ZpbWNfaWRdIGVudGl0eSwgbWF5IGJlIG51bGwKKyAqIEBwYWQ6IHRoZSBzb3VyY2UgZW50aXR5IHBhZCBpbmRleAorICogQGZpbWNfaWQ6IGluZGV4IG9mIHRoZSBmaW1jIGRldmljZSBmb3Igd2hpY2ggbGluayBzaG91bGQgYmUgZW5hYmxlZAorICovCitzdGF0aWMgaW50IF9fZmltY19tZF9jcmVhdGVfZmltY19saW5rcyhzdHJ1Y3QgZmltY19tZCAqZm1kLAorCQkJCSAgICAgICBzdHJ1Y3QgbWVkaWFfZW50aXR5ICpzb3VyY2UsCisJCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldiAqc2Vuc29yLAorCQkJCSAgICAgICBpbnQgcGFkLCBpbnQgZmltY19pZCkKK3sKKwlzdHJ1Y3QgZmltY19zZW5zb3JfaW5mbyAqc19pbmZvOworCXN0cnVjdCBtZWRpYV9lbnRpdHkgKnNpbms7CisJdW5zaWduZWQgaW50IGZsYWdzOworCWludCByZXQsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRklNQ19NQVhfREVWUzsgaSsrKSB7CisJCWlmICghZm1kLT5maW1jW2ldKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIFNvbWUgRklNQyB2YXJpYW50cyBhcmUgbm90IGZpdHRlZCB3aXRoIGNhbWVyYSBjYXB0dXJlCisJCSAqIGludGVyZmFjZS4gU2tpcCBjcmVhdGluZyBhIGxpbmsgZnJvbSBzZW5zb3IgZm9yIHRob3NlLgorCQkgKi8KKwkJaWYgKHNlbnNvci0+Z3JwX2lkID09IFNFTlNPUl9HUk9VUF9JRCAmJgorCQkgICAgIWZtZC0+ZmltY1tpXS0+dmFyaWFudC0+aGFzX2NhbV9pZikKKwkJCWNvbnRpbnVlOworCisJCWZsYWdzID0gKGkgPT0gZmltY19pZCkgPyBNRURJQV9MTktfRkxfRU5BQkxFRCA6IDA7CisJCXNpbmsgPSAmZm1kLT5maW1jW2ldLT52aWRfY2FwLnN1YmRldi0+ZW50aXR5OworCQlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoc291cmNlLCBwYWQsIHNpbmssCisJCQkJCSAgICAgIEZJTUNfU0RfUEFEX1NJTkssIGZsYWdzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogTm90aWZ5IEZJTUMgY2FwdHVyZSBzdWJkZXYgZW50aXR5ICovCisJCXJldCA9IG1lZGlhX2VudGl0eV9jYWxsKHNpbmssIGxpbmtfc2V0dXAsICZzaW5rLT5wYWRzWzBdLAorCQkJCQkmc291cmNlLT5wYWRzW3BhZF0sIGZsYWdzKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXY0bDJfaW5mbygmZm1kLT52NGwyX2RldiwgImNyZWF0ZWQgbGluayBbJXNdICVjPiBbJXNdIiwKKwkJCSAgc291cmNlLT5uYW1lLCBmbGFncyA/ICc9JyA6ICctJywgc2luay0+bmFtZSk7CisKKwkJaWYgKGZsYWdzID09IDApCisJCQljb250aW51ZTsKKwkJc19pbmZvID0gdjRsMl9nZXRfc3ViZGV2X2hvc3RkYXRhKHNlbnNvcik7CisJCWlmICghV0FSTl9PTihzX2luZm8gPT0gTlVMTCkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZtZC0+c2xvY2ssIGlycV9mbGFncyk7CisJCQlzX2luZm8tPmhvc3QgPSBmbWQtPmZpbWNbaV07CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbWQtPnNsb2NrLCBpcnFfZmxhZ3MpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGZpbWNfbWRfY3JlYXRlX2xpbmtzIC0gY3JlYXRlIGRlZmF1bHQgbGlua3MgYmV0d2VlbiByZWdpc3RlcmVkIGVudGl0aWVzCisgKgorICogUGFyYWxsZWwgaW50ZXJmYWNlIHNlbnNvciBlbnRpdGllcyBhcmUgY29ubmVjdGVkIGRpcmVjdGx5IHRvIEZJTUMgY2FwdHVyZQorICogZW50aXRpZXMuIFRoZSBzZW5zb3JzIHVzaW5nIE1JUEkgQ1NJUyBidXMgYXJlIGNvbm5lY3RlZCB0aHJvdWdoIGltbXV0YWJsZQorICogbGluayB3aXRoIENTSSByZWNlaXZlciBlbnRpdHkgc3BlY2lmaWVkIGJ5IG11eF9pZC4gQW55IHJlZ2lzdGVyZWQgQ1NJUworICogZW50aXR5IGhhcyBhIGxpbmsgdG8gZWFjaCByZWdpc3RlcmVkIEZJTUMgY2FwdHVyZSBlbnRpdHkuIEVuYWJsZWQgbGlua3MKKyAqIGFyZSBjcmVhdGVkIGJ5IGRlZmF1bHQgYmV0d2VlbiBlYWNoIHN1YnNlcXVlbnQgcmVnaXN0ZXJlZCBzZW5zb3IgYW5kCisgKiBzdWJzZXF1ZW50IEZJTUMgY2FwdHVyZSBlbnRpdHkuIFRoZSBudW1iZXIgb2YgZGVmYXVsdCBhY3RpdmUgbGlua3MgaXMKKyAqIGRldGVybWluZWQgYnkgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgc2Vuc29ycyBvciBGSU1DIGVudGl0aWVzLAorICogd2hpY2hldmVyIGlzIGxlc3MuCisgKi8KK3N0YXRpYyBpbnQgZmltY19tZF9jcmVhdGVfbGlua3Moc3RydWN0IGZpbWNfbWQgKmZtZCkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNlbnNvciwgKmNzaXM7CisJc3RydWN0IHM1cF9maW1jX2lzcF9pbmZvICpwZGF0YTsKKwlzdHJ1Y3QgZmltY19zZW5zb3JfaW5mbyAqc19pbmZvOworCXN0cnVjdCBtZWRpYV9lbnRpdHkgKnNvdXJjZSwgKnNpbms7CisJaW50IGksIHBhZCwgZmltY19pZCA9IDA7CisJaW50IHJldCA9IDA7CisJdTMyIGZsYWdzOworCisJZm9yIChpID0gMDsgaSA8IGZtZC0+bnVtX3NlbnNvcnM7IGkrKykgeworCQlpZiAoZm1kLT5zZW5zb3JbaV0uc3ViZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlzZW5zb3IgPSBmbWQtPnNlbnNvcltpXS5zdWJkZXY7CisJCXNfaW5mbyA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZW5zb3IpOworCQlpZiAoIXNfaW5mbyB8fCAhc19pbmZvLT5wZGF0YSkKKwkJCWNvbnRpbnVlOworCisJCXNvdXJjZSA9IE5VTEw7CisJCXBkYXRhID0gc19pbmZvLT5wZGF0YTsKKworCQlzd2l0Y2ggKHBkYXRhLT5idXNfdHlwZSkgeworCQljYXNlIEZJTUNfTUlQSV9DU0kyOgorCQkJaWYgKFdBUk4ocGRhdGEtPm11eF9pZCA+PSBDU0lTX01BWF9FTlRJVElFUywKKwkJCQkiV3JvbmcgQ1NJIGNoYW5uZWwgaWQ6ICVkXG4iLCBwZGF0YS0+bXV4X2lkKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJY3NpcyA9IGZtZC0+Y3Npc1twZGF0YS0+bXV4X2lkXS5zZDsKKwkJCWlmIChXQVJOKGNzaXMgPT0gTlVMTCwKKwkJCQkgIk1JUEktQ1NJIGludGVyZmFjZSBzcGVjaWZpZWQgIgorCQkJCSAiYnV0IHM1cC1jc2lzIG1vZHVsZSBpcyBub3QgbG9hZGVkIVxuIikpCisJCQkJY29udGludWU7CisKKwkJCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluaygmc2Vuc29yLT5lbnRpdHksIDAsCisJCQkJCSAgICAgICZjc2lzLT5lbnRpdHksIENTSVNfUEFEX1NJTkssCisJCQkJCSAgICAgIE1FRElBX0xOS19GTF9JTU1VVEFCTEUgfAorCQkJCQkgICAgICBNRURJQV9MTktfRkxfRU5BQkxFRCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCXY0bDJfaW5mbygmZm1kLT52NGwyX2RldiwgImNyZWF0ZWQgbGluayBbJXNdID0+IFslc10iLAorCQkJCSAgc2Vuc29yLT5lbnRpdHkubmFtZSwgY3Npcy0+ZW50aXR5Lm5hbWUpOworCisJCQlzb3VyY2UgPSAmY3Npcy0+ZW50aXR5OworCQkJcGFkID0gQ1NJU19QQURfU09VUkNFOworCQkJYnJlYWs7CisKKwkJY2FzZSBGSU1DX0lUVV82MDEuLi5GSU1DX0lUVV82NTY6CisJCQlzb3VyY2UgPSAmc2Vuc29yLT5lbnRpdHk7CisJCQlwYWQgPSAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXY0bDJfZXJyKCZmbWQtPnY0bDJfZGV2LCAiV3JvbmcgYnVzX3R5cGU6ICV4XG4iLAorCQkJCSBwZGF0YS0+YnVzX3R5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHNvdXJjZSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gX19maW1jX21kX2NyZWF0ZV9maW1jX2xpbmtzKGZtZCwgc291cmNlLCBzZW5zb3IsIHBhZCwKKwkJCQkJCSAgZmltY19pZCsrKTsKKwl9CisJLyogQ3JlYXRlIGltbXV0YWJsZSBsaW5rcyBiZXR3ZWVuIGVhY2ggRklNQydzIHN1YmRldiBhbmQgdmlkZW8gbm9kZSAqLworCWZsYWdzID0gTUVESUFfTE5LX0ZMX0lNTVVUQUJMRSB8IE1FRElBX0xOS19GTF9FTkFCTEVEOworCWZvciAoaSA9IDA7IGkgPCBGSU1DX01BWF9ERVZTOyBpKyspIHsKKwkJaWYgKCFmbWQtPmZpbWNbaV0pCisJCQljb250aW51ZTsKKwkJc291cmNlID0gJmZtZC0+ZmltY1tpXS0+dmlkX2NhcC5zdWJkZXYtPmVudGl0eTsKKwkJc2luayA9ICZmbWQtPmZpbWNbaV0tPnZpZF9jYXAudmZkLT5lbnRpdHk7CisJCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluayhzb3VyY2UsIEZJTUNfU0RfUEFEX1NPVVJDRSwKKwkJCQkJICAgICAgc2luaywgMCwgZmxhZ3MpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoZSBwZXJpcGhlcmFsIHNlbnNvciBjbG9jayBtYW5hZ2VtZW50LgorICovCitzdGF0aWMgaW50IGZpbWNfbWRfZ2V0X2Nsb2NrcyhzdHJ1Y3QgZmltY19tZCAqZm1kKQoreworCWNoYXIgY2xrX25hbWVbMzJdOworCXN0cnVjdCBjbGsgKmNsb2NrOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEZJTUNfTUFYX0NBTUNMS1M7IGkrKykgeworCQlzbnByaW50ZihjbGtfbmFtZSwgc2l6ZW9mKGNsa19uYW1lKSwgInNjbGtfY2FtJXUiLCBpKTsKKwkJY2xvY2sgPSBjbGtfZ2V0KE5VTEwsIGNsa19uYW1lKTsKKwkJaWYgKElTX0VSUl9PUl9OVUxMKGNsb2NrKSkgeworCQkJdjRsMl9lcnIoJmZtZC0+djRsMl9kZXYsICJGYWlsZWQgdG8gZ2V0IGNsb2NrOiAlcyIsCisJCQkJICBjbGtfbmFtZSk7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCWZtZC0+Y2FtY2xrW2ldLmNsb2NrID0gY2xvY2s7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaW1jX21kX3B1dF9jbG9ja3Moc3RydWN0IGZpbWNfbWQgKmZtZCkKK3sKKwlpbnQgaSA9IEZJTUNfTUFYX0NBTUNMS1M7CisKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJaWYgKElTX0VSUl9PUl9OVUxMKGZtZC0+Y2FtY2xrW2ldLmNsb2NrKSkKKwkJCWNvbnRpbnVlOworCQljbGtfcHV0KGZtZC0+Y2FtY2xrW2ldLmNsb2NrKTsKKwkJZm1kLT5jYW1jbGtbaV0uY2xvY2sgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBfX2ZpbWNfbWRfc2V0X2NhbWNsayhzdHJ1Y3QgZmltY19tZCAqZm1kLAorCQkJCQkgc3RydWN0IGZpbWNfc2Vuc29yX2luZm8gKnNfaW5mbywKKwkJCQkJIGJvb2wgb24pCit7CisJc3RydWN0IHM1cF9maW1jX2lzcF9pbmZvICpwZGF0YSA9IHNfaW5mby0+cGRhdGE7CisJc3RydWN0IGZpbWNfY2FtY2xrX2luZm8gKmNhbWNsazsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChXQVJOX09OKHBkYXRhLT5jbGtfaWQgPj0gRklNQ19NQVhfQ0FNQ0xLUykgfHwgZm1kID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNfaW5mby0+Y2xrX29uID09IG9uKQorCQlyZXR1cm4gMDsKKwljYW1jbGsgPSAmZm1kLT5jYW1jbGtbcGRhdGEtPmNsa19pZF07CisKKwlkYmcoImNhbWNsayAlZCwgZjogJWx1LCBjbGs6ICVwLCBvbjogJWQiLAorCSAgICBwZGF0YS0+Y2xrX2lkLCBwZGF0YS0+Y2xrX2ZyZXF1ZW5jeSwgY2FtY2xrLCBvbik7CisKKwlpZiAob24pIHsKKwkJaWYgKGNhbWNsay0+dXNlX2NvdW50ID4gMCAmJgorCQkgICAgY2FtY2xrLT5mcmVxdWVuY3kgIT0gcGRhdGEtPmNsa19mcmVxdWVuY3kpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY2FtY2xrLT51c2VfY291bnQrKyA9PSAwKSB7CisJCQljbGtfc2V0X3JhdGUoY2FtY2xrLT5jbG9jaywgcGRhdGEtPmNsa19mcmVxdWVuY3kpOworCQkJY2FtY2xrLT5mcmVxdWVuY3kgPSBwZGF0YS0+Y2xrX2ZyZXF1ZW5jeTsKKwkJCXJldCA9IGNsa19lbmFibGUoY2FtY2xrLT5jbG9jayk7CisJCX0KKwkJc19pbmZvLT5jbGtfb24gPSAxOworCQlkYmcoIkVuYWJsZWQgY2FtY2xrICVkOiBmOiAlbHUiLCBwZGF0YS0+Y2xrX2lkLAorCQkgICAgY2xrX2dldF9yYXRlKGNhbWNsay0+Y2xvY2spKTsKKworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChXQVJOX09OKGNhbWNsay0+dXNlX2NvdW50ID09IDApKQorCQlyZXR1cm4gMDsKKworCWlmICgtLWNhbWNsay0+dXNlX2NvdW50ID09IDApIHsKKwkJY2xrX2Rpc2FibGUoY2FtY2xrLT5jbG9jayk7CisJCXNfaW5mby0+Y2xrX29uID0gMDsKKwkJZGJnKCJEaXNhYmxlZCBjYW1jbGsgJWQiLCBwZGF0YS0+Y2xrX2lkKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBmaW1jX21kX3NldF9jYW1jbGsgLSBwZXJpcGhlcmFsIHNlbnNvciBjbG9jayBzZXR1cAorICogQHNkOiBzZW5zb3Igc3ViZGV2IHRvIGNvbmZpZ3VyZSBzY2xrX2NhbSBjbG9jayBmb3IKKyAqIEBvbjogMSB0byBlbmFibGUgb3IgMCB0byBkaXNhYmxlIHRoZSBjbG9jaworICoKKyAqIFRoZXJlIGFyZSAyIHNlcGFyYXRlIGNsb2NrIG91dHB1dHMgYXZhaWxhYmxlIGluIHRoZSBTb0MgZm9yIGV4dGVybmFsCisgKiBpbWFnZSBwcm9jZXNzb3JzLiBUaGVzZSBjbG9ja3MgYXJlIHNoYXJlZCBiZXR3ZWVuIGFsbCByZWdpc3RlcmVkIEZJTUMKKyAqIGRldmljZXMgdG8gd2hpY2ggc2Vuc29ycyBjYW4gYmUgYXR0YWNoZWQsIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoCisgKiB0aGUgTUlQSSBDU0kgcmVjZWl2ZXIuIFRoZSBjbG9jayBpcyBhbGxvd2VkIGhlcmUgdG8gYmUgdXNlZCBieQorICogbXVsdGlwbGUgc2Vuc29ycyBjb25jdXJyZW50bHkgaWYgdGhleSB1c2Ugc2FtZSBmcmVxdWVuY3kuCisgKiBUaGUgcGVyIHNlbnNvciBzdWJkZXYgY2xrX29uIGF0dHJpYnV0ZSBoZWxwcyB0byBzeW5jaHJvbml6ZSBhY2Nlc3NlcworICogdG8gdGhlIHNjbGtfY2FtIGNsb2NrcyBmcm9tIHRoZSB2aWRlbyBhbmQgbWVkaWEgZGV2aWNlIG5vZGVzLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZ3JhcGggbXV0ZXggaXMgaGVsZC4KKyAqLworaW50IGZpbWNfbWRfc2V0X2NhbWNsayhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBib29sIG9uKQoreworCXN0cnVjdCBmaW1jX3NlbnNvcl9pbmZvICpzX2luZm8gPSB2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOworCXN0cnVjdCBmaW1jX21kICpmbWQgPSBlbnRpdHlfdG9fZmltY19tZGV2KCZzZC0+ZW50aXR5KTsKKworCXJldHVybiBfX2ZpbWNfbWRfc2V0X2NhbWNsayhmbWQsIHNfaW5mbywgb24pOworfQorCitzdGF0aWMgaW50IGZpbWNfbWRfbGlua19ub3RpZnkoc3RydWN0IG1lZGlhX3BhZCAqc291cmNlLAorCQkJICAgICAgIHN0cnVjdCBtZWRpYV9wYWQgKnNpbmssIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCXN0cnVjdCBmaW1jX2RldiAqZmltYzsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChtZWRpYV9lbnRpdHlfdHlwZShzaW5rLT5lbnRpdHkpICE9IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWKQorCQlyZXR1cm4gMDsKKworCXNkID0gbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KHNpbmstPmVudGl0eSk7CisJZmltYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJaWYgKCEoZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkpIHsKKwkJcmV0ID0gX19maW1jX3BpcGVsaW5lX3NodXRkb3duKGZpbWMpOworCQlmaW1jLT5waXBlbGluZS5zZW5zb3IgPSBOVUxMOworCQlmaW1jLT5waXBlbGluZS5jc2lzID0gTlVMTDsKKworCQltdXRleF9sb2NrKCZmaW1jLT5sb2NrKTsKKwkJZmltY19jdHJsc19kZWxldGUoZmltYy0+dmlkX2NhcC5jdHgpOworCQltdXRleF91bmxvY2soJmZpbWMtPmxvY2spOworCQlyZXR1cm4gcmV0OworCX0KKwkvKgorCSAqIExpbmsgYWN0aXZhdGlvbi4gRW5hYmxlIHBvd2VyIG9mIHBpcGVsaW5lIGVsZW1lbnRzIG9ubHkgaWYgdGhlCisJICogcGlwZWxpbmUgaXMgYWxyZWFkeSBpbiB1c2UsIGkuZS4gaXRzIHZpZGVvIG5vZGUgaXMgb3BlbmVkLgorCSAqIFJlY3JlYXRlIHRoZSBjb250cm9scyBkZXN0cm95ZWQgZHVyaW5nIHRoZSBsaW5rIGRlYWN0aXZhdGlvbi4KKwkgKi8KKwltdXRleF9sb2NrKCZmaW1jLT5sb2NrKTsKKwlpZiAoZmltYy0+dmlkX2NhcC5yZWZjbnQgPiAwKSB7CisJCXJldCA9IF9fZmltY19waXBlbGluZV9pbml0aWFsaXplKGZpbWMsIHNvdXJjZS0+ZW50aXR5LCB0cnVlKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBmaW1jX2NhcHR1cmVfY3RybHNfY3JlYXRlKGZpbWMpOworCX0KKwltdXRleF91bmxvY2soJmZpbWMtPmxvY2spOworCisJcmV0dXJuIHJldCA/IC1FUElQRSA6IHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZmltY19tZF9zeXNmc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBmaW1jX21kICpmbWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChmbWQtPnVzZXJfc3ViZGV2X2FwaSkKKwkJcmV0dXJuIHN0cmxjcHkoYnVmLCAiU3ViLWRldmljZSBBUEkgKHN1Yi1kZXYpXG4iLCBQQUdFX1NJWkUpOworCisJcmV0dXJuIHN0cmxjcHkoYnVmLCAiVjRMMiB2aWRlbyBub2RlIG9ubHkgQVBJICh2aWQtZGV2KVxuIiwgUEFHRV9TSVpFKTsKK30KKworc3RhdGljIHNzaXplX3QgZmltY19tZF9zeXNmc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBmaW1jX21kICpmbWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlib29sIHN1YmRldl9hcGk7CisJaW50IGk7CisKKwlpZiAoIXN0cmNtcChidWYsICJ2aWQtZGV2XG4iKSkKKwkJc3ViZGV2X2FwaSA9IGZhbHNlOworCWVsc2UgaWYgKCFzdHJjbXAoYnVmLCAic3ViLWRldlxuIikpCisJCXN1YmRldl9hcGkgPSB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGNvdW50OworCisJZm1kLT51c2VyX3N1YmRldl9hcGkgPSBzdWJkZXZfYXBpOworCWZvciAoaSA9IDA7IGkgPCBGSU1DX01BWF9ERVZTOyBpKyspCisJCWlmIChmbWQtPmZpbWNbaV0pCisJCQlmbWQtPmZpbWNbaV0tPnZpZF9jYXAudXNlcl9zdWJkZXZfYXBpID0gc3ViZGV2X2FwaTsKKwlyZXR1cm4gY291bnQ7Cit9CisvKgorICogVGhpcyBkZXZpY2UgYXR0cmlidXRlIGlzIHRvIHNlbGVjdCB2aWRlbyBwaXBlbGluZSBjb25maWd1cmF0aW9uIG1ldGhvZC4KKyAqIFRoZXJlIGFyZSBmb2xsb3dpbmcgdmFsaWQgdmFsdWVzOgorICogIHZpZC1kZXYgLSBmb3IgVjRMMiB2aWRlbyBub2RlIEFQSSBvbmx5LCBzdWJkZXZpY2Ugd2lsbCBiZSBjb25maWd1cmVkCisgKiAgYnkgdGhlIGhvc3QgZHJpdmVyLgorICogIHN1Yi1kZXYgLSBmb3IgbWVkaWEgY29udHJvbGxlciBBUEksIHN1YmRldnMgbXVzdCBiZSBjb25maWd1cmVkIGluIHVzZXIKKyAqICBzcGFjZSBiZWZvcmUgc3RhcnRpbmcgc3RyZWFtaW5nLgorICovCitzdGF0aWMgREVWSUNFX0FUVFIoc3ViZGV2X2NvbmZfbW9kZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIGZpbWNfbWRfc3lzZnNfc2hvdywgZmltY19tZF9zeXNmc19zdG9yZSk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZpbWNfbWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2OworCXN0cnVjdCBmaW1jX21kICpmbWQ7CisJaW50IHJldDsKKworCWlmIChXQVJOKCFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgIlBsYXRmb3JtIGRhdGEgbm90IHNwZWNpZmllZCFcbiIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmaW1jX21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJmZtZC0+c2xvY2spOworCWZtZC0+cGRldiA9IHBkZXY7CisKKwlzdHJsY3B5KGZtZC0+bWVkaWFfZGV2Lm1vZGVsLCAiU0FNU1VORyBTNVAgRklNQyIsCisJCXNpemVvZihmbWQtPm1lZGlhX2Rldi5tb2RlbCkpOworCWZtZC0+bWVkaWFfZGV2Lmxpbmtfbm90aWZ5ID0gZmltY19tZF9saW5rX25vdGlmeTsKKwlmbWQtPm1lZGlhX2Rldi5kZXYgPSAmcGRldi0+ZGV2OworCisJdjRsMl9kZXYgPSAmZm1kLT52NGwyX2RldjsKKwl2NGwyX2Rldi0+bWRldiA9ICZmbWQtPm1lZGlhX2RldjsKKwl2NGwyX2Rldi0+bm90aWZ5ID0gZmltY19zZW5zb3Jfbm90aWZ5OworCXNucHJpbnRmKHY0bDJfZGV2LT5uYW1lLCBzaXplb2YodjRsMl9kZXYtPm5hbWUpLCAiJXMiLAorCQkgZGV2X25hbWUoJnBkZXYtPmRldikpOworCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmZtZC0+djRsMl9kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfZXJyKHY0bDJfZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHY0bDJfZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnIxOworCX0KKwlyZXQgPSBtZWRpYV9kZXZpY2VfcmVnaXN0ZXIoJmZtZC0+bWVkaWFfZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2Vycih2NGwyX2RldiwgIkZhaWxlZCB0byByZWdpc3RlciBtZWRpYSBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycjI7CisJfQorCXJldCA9IGZpbWNfbWRfZ2V0X2Nsb2NrcyhmbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKKworCWZtZC0+dXNlcl9zdWJkZXZfYXBpID0gZmFsc2U7CisJcmV0ID0gZmltY19tZF9yZWdpc3Rlcl9wbGF0Zm9ybV9lbnRpdGllcyhmbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKKworCXJldCA9IGZpbWNfbWRfcmVnaXN0ZXJfc2Vuc29yX2VudGl0aWVzKGZtZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnIzOworCXJldCA9IGZpbWNfbWRfY3JlYXRlX2xpbmtzKGZtZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnIzOworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldl9ub2RlcygmZm1kLT52NGwyX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnIzOworCXJldCA9IGZpbWNfbWRfcmVnaXN0ZXJfdmlkZW9fbm9kZXMoZm1kKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjM7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3N1YmRldl9jb25mX21vZGUpOworCWlmICghcmV0KSB7CisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZtZCk7CisJCXJldHVybiAwOworCX0KK2VycjM6CisJbWVkaWFfZGV2aWNlX3VucmVnaXN0ZXIoJmZtZC0+bWVkaWFfZGV2KTsKKwlmaW1jX21kX3B1dF9jbG9ja3MoZm1kKTsKKwlmaW1jX21kX3VucmVnaXN0ZXJfZW50aXRpZXMoZm1kKTsKK2VycjI6CisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZm1kLT52NGwyX2Rldik7CitlcnIxOgorCWtmcmVlKGZtZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZmltY19tZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZmltY19tZCAqZm1kID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIWZtZCkKKwkJcmV0dXJuIDA7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9zdWJkZXZfY29uZl9tb2RlKTsKKwlmaW1jX21kX3VucmVnaXN0ZXJfZW50aXRpZXMoZm1kKTsKKwltZWRpYV9kZXZpY2VfdW5yZWdpc3RlcigmZm1kLT5tZWRpYV9kZXYpOworCWZpbWNfbWRfcHV0X2Nsb2NrcyhmbWQpOworCWtmcmVlKGZtZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZpbWNfbWRfZHJpdmVyID0geworCS5wcm9iZQkJPSBmaW1jX21kX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZmltY19tZF9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInM1cC1maW1jLW1kIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworaW50IF9faW5pdCBmaW1jX21kX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJlcXVlc3RfbW9kdWxlKCJzNXAtY3NpcyIpOworCXJldCA9IGZpbWNfcmVnaXN0ZXJfZHJpdmVyKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmaW1jX21kX2RyaXZlcik7Cit9Cit2b2lkIF9fZXhpdCBmaW1jX21kX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZmltY19tZF9kcml2ZXIpOworCWZpbWNfdW5yZWdpc3Rlcl9kcml2ZXIoKTsKK30KKworbW9kdWxlX2luaXQoZmltY19tZF9pbml0KTsKK21vZHVsZV9leGl0KGZpbWNfbWRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlN5bHdlc3RlciBOYXdyb2NraSA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUzVQIEZJTUMgY2FtZXJhIGhvc3QgaW50ZXJmYWNlL3ZpZGVvIHBvc3Rwcm9jZXNzb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMi4wLjEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1tZGV2aWNlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtbWRldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzc4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtbWRldmljZS5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIEZJTUNfTURFVklDRV9IXworI2RlZmluZSBGSU1DX01ERVZJQ0VfSF8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWEtZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWEtZW50aXR5Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCisjaW5jbHVkZSAiZmltYy1jb3JlLmgiCisjaW5jbHVkZSAibWlwaS1jc2lzLmgiCisKKy8qIEdyb3VwIElEcyBvZiBzZW5zb3IsIE1JUEkgQ1NJUyBhbmQgdGhlIHdyaXRlYmFjayBzdWJkZXZzLiAqLworI2RlZmluZSBTRU5TT1JfR1JPVVBfSUQJCSgxIDw8IDgpCisjZGVmaW5lIENTSVNfR1JPVVBfSUQJCSgxIDw8IDkpCisjZGVmaW5lIFdSSVRFQkFDS19HUk9VUF9JRAkoMSA8PCAxMCkKKworI2RlZmluZSBGSU1DX01BWF9TRU5TT1JTCTgKKyNkZWZpbmUgRklNQ19NQVhfQ0FNQ0xLUwkyCisKK3N0cnVjdCBmaW1jX2NzaXNfaW5mbyB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKwlpbnQgaWQ7Cit9OworCitzdHJ1Y3QgZmltY19jYW1jbGtfaW5mbyB7CisJc3RydWN0IGNsayAqY2xvY2s7CisJaW50IHVzZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGZyZXF1ZW5jeTsKK307CisKKy8qKgorICogc3RydWN0IGZpbWNfc2Vuc29yX2luZm8gLSBpbWFnZSBkYXRhIHNvdXJjZSBzdWJkZXYgaW5mb3JtYXRpb24KKyAqIEBwZGF0YTogc2Vuc29yJ3MgYXRycmlidXRlcyBwYXNzZWQgYXMgbWVkaWEgZGV2aWNlJ3MgcGxhdGZvcm0gZGF0YQorICogQHN1YmRldjogaW1hZ2Ugc2Vuc29yIHY0bDIgc3ViZGV2CisgKiBAaG9zdDogZmltYyBkZXZpY2UgdGhlIHNlbnNvciBpcyBjdXJyZW50bHkgbGlua2VkIHRvCisgKiBAY2xrX29uOiBzY2xrX2NhbSBjbG9jaydzIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YmRldgorICoKKyAqIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgYXBwbGllcyB0byBpbWFnZSBzZW5zb3IgYW5kIHRoZSB3cml0ZWJhY2sgc3ViZGV2cy4KKyAqLworc3RydWN0IGZpbWNfc2Vuc29yX2luZm8geworCXN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyAqcGRhdGE7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXY7CisJc3RydWN0IGZpbWNfZGV2ICpob3N0OworCWJvb2wgY2xrX29uOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmltY19tZCAtIGZpbWMgbWVkaWEgZGV2aWNlIGluZm9ybWF0aW9uCisgKiBAY3NpczogTUlQSSBDU0lTIHN1YmRldnMgZGF0YQorICogQHNlbnNvcjogYXJyYXkgb2YgcmVnaXN0ZXJlZCBzZW5zb3Igc3ViZGV2cworICogQG51bV9zZW5zb3JzOiBhY3R1YWwgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgc2Vuc29ycworICogQGNhbWNsazogZXh0ZXJuYWwgc2Vuc29yIGNsb2NrIGluZm9ybWF0aW9uCisgKiBAZmltYzogYXJyYXkgb2YgcmVnaXN0ZXJlZCBmaW1jIGRldmljZXMKKyAqIEBtZWRpYV9kZXY6IHRvcCBsZXZlbCBtZWRpYSBkZXZpY2UKKyAqIEB2NGwyX2RldjogdG9wIGxldmVsIHY0bDJfZGV2aWNlIGhvbGRpbmcgdXAgdGhlIHN1YmRldnMKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgdGhpcyBtZWRpYSBkZXZpY2UgaXMgaG9va2VkIHVwIGludG8KKyAqIEB1c2VyX3N1YmRldl9hcGk6IHRydWUgaWYgc3ViZGV2cyBhcmUgbm90IGNvbmZpZ3VyZWQgYnkgdGhlIGhvc3QgZHJpdmVyCisgKiBAc2xvY2s6IHNwaW5sb2NrIHByb3RlY3RpbmcgQHNlbnNvciBhcnJheQorICovCitzdHJ1Y3QgZmltY19tZCB7CisJc3RydWN0IGZpbWNfY3Npc19pbmZvIGNzaXNbQ1NJU19NQVhfRU5USVRJRVNdOworCXN0cnVjdCBmaW1jX3NlbnNvcl9pbmZvIHNlbnNvcltGSU1DX01BWF9TRU5TT1JTXTsKKwlpbnQgbnVtX3NlbnNvcnM7CisJc3RydWN0IGZpbWNfY2FtY2xrX2luZm8gY2FtY2xrW0ZJTUNfTUFYX0NBTUNMS1NdOworCXN0cnVjdCBmaW1jX2RldiAqZmltY1tGSU1DX01BWF9ERVZTXTsKKwlzdHJ1Y3QgbWVkaWFfZGV2aWNlIG1lZGlhX2RldjsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlib29sIHVzZXJfc3ViZGV2X2FwaTsKKwlzcGlubG9ja190IHNsb2NrOworfTsKKworI2RlZmluZSBpc19zdWJkZXZfcGFkKHBhZCkgKHBhZCA9PSBOVUxMIHx8IFwKKwltZWRpYV9lbnRpdHlfdHlwZShwYWQtPmVudGl0eSkgPT0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVYpCisKKyNkZWZpbmUgbWVfc3VidHlwZShtZSkgXAorCSgobWUtPnR5cGUpICYgKE1FRElBX0VOVF9UWVBFX01BU0sgfCBNRURJQV9FTlRfU1VCVFlQRV9NQVNLKSkKKworI2RlZmluZSBzdWJkZXZfaGFzX2Rldm5vZGUoX19zZCkgKF9fc2QtPmZsYWdzICYgVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREUpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZpbWNfbWQgKmVudGl0eV90b19maW1jX21kZXYoc3RydWN0IG1lZGlhX2VudGl0eSAqbWUpCit7CisJcmV0dXJuIG1lLT5wYXJlbnQgPT0gTlVMTCA/IE5VTEwgOgorCQljb250YWluZXJfb2YobWUtPnBhcmVudCwgc3RydWN0IGZpbWNfbWQsIG1lZGlhX2Rldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaW1jX21kX2dyYXBoX2xvY2soc3RydWN0IGZpbWNfZGV2ICpmaW1jKQoreworCUJVR19PTihmaW1jLT52aWRfY2FwLnZmZCA9PSBOVUxMKTsKKwltdXRleF9sb2NrKCZmaW1jLT52aWRfY2FwLnZmZC0+ZW50aXR5LnBhcmVudC0+Z3JhcGhfbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmltY19tZF9ncmFwaF91bmxvY2soc3RydWN0IGZpbWNfZGV2ICpmaW1jKQoreworCUJVR19PTihmaW1jLT52aWRfY2FwLnZmZCA9PSBOVUxMKTsKKwltdXRleF91bmxvY2soJmZpbWMtPnZpZF9jYXAudmZkLT5lbnRpdHkucGFyZW50LT5ncmFwaF9tdXRleCk7Cit9CisKK2ludCBmaW1jX21kX3NldF9jYW1jbGsoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgYm9vbCBvbik7Cit2b2lkIGZpbWNfcGlwZWxpbmVfcHJlcGFyZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMsIHN0cnVjdCBtZWRpYV9lbnRpdHkgKm1lKTsKK2ludCBmaW1jX3BpcGVsaW5lX2luaXRpYWxpemUoc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBzdHJ1Y3QgbWVkaWFfZW50aXR5ICptZSwKKwkJCSAgICAgYm9vbCByZXN1bWUpOworaW50IGZpbWNfcGlwZWxpbmVfc2h1dGRvd24oc3RydWN0IGZpbWNfZGV2ICpmaW1jKTsKK2ludCBmaW1jX3BpcGVsaW5lX3NfcG93ZXIoc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBpbnQgc3RhdGUpOworaW50IGZpbWNfcGlwZWxpbmVfc19zdHJlYW0oc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBpbnQgc3RhdGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1yZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1yZWcuYwppbmRleCA0ODkzYjJkLi4yMGU2NjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtcmVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLXJlZy5jCkBAIC0zMCw3ICszMCw3IEBACiAJY2ZnID0gcmVhZGwoZGV2LT5yZWdzICsgUzVQX0NJR0NUUkwpOwogCWNmZyB8PSAoUzVQX0NJR0NUUkxfU1dSU1QgfCBTNVBfQ0lHQ1RSTF9JUlFfTEVWRUwpOwogCXdyaXRlbChjZmcsIGRldi0+cmVncyArIFM1UF9DSUdDVFJMKTsKLQl1ZGVsYXkoMTAwMCk7CisJdWRlbGF5KDEwKTsKIAogCWNmZyA9IHJlYWRsKGRldi0+cmVncyArIFM1UF9DSUdDVFJMKTsKIAljZmcgJj0gflM1UF9DSUdDVFJMX1NXUlNUOwpAQCAtNDEsMTkgKzQxLDExIEBACiB7CiAJdTMyIGZsaXAgPSBTNVBfTVNDVFJMX0ZMSVBfTk9STUFMOwogCi0Jc3dpdGNoIChjdHgtPmZsaXApIHsKLQljYXNlIEZMSVBfWF9BWElTOgorCWlmIChjdHgtPmhmbGlwKQogCQlmbGlwID0gUzVQX01TQ1RSTF9GTElQX1hfTUlSUk9SOwotCQlicmVhazsKLQljYXNlIEZMSVBfWV9BWElTOgorCWlmIChjdHgtPnZmbGlwKQogCQlmbGlwID0gUzVQX01TQ1RSTF9GTElQX1lfTUlSUk9SOwotCQlicmVhazsKLQljYXNlIEZMSVBfWFlfQVhJUzoKLQkJZmxpcCA9IFM1UF9NU0NUUkxfRkxJUF8xODA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKwogCWlmIChjdHgtPnJvdGF0aW9uIDw9IDkwKQogCQlyZXR1cm4gZmxpcDsKIApAQCAtNjQsMTkgKzU2LDExIEBACiB7CiAJdTMyIGZsaXAgPSBTNVBfQ0lUUkdGTVRfRkxJUF9OT1JNQUw7CiAKLQlzd2l0Y2ggKGN0eC0+ZmxpcCkgewotCWNhc2UgRkxJUF9YX0FYSVM6Ci0JCWZsaXAgPSBTNVBfQ0lUUkdGTVRfRkxJUF9YX01JUlJPUjsKLQkJYnJlYWs7Ci0JY2FzZSBGTElQX1lfQVhJUzoKLQkJZmxpcCA9IFM1UF9DSVRSR0ZNVF9GTElQX1lfTUlSUk9SOwotCQlicmVhazsKLQljYXNlIEZMSVBfWFlfQVhJUzoKLQkJZmxpcCA9IFM1UF9DSVRSR0ZNVF9GTElQXzE4MDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCWlmIChjdHgtPmhmbGlwKQorCQlmbGlwIHw9IFM1UF9DSVRSR0ZNVF9GTElQX1hfTUlSUk9SOworCWlmIChjdHgtPnZmbGlwKQorCQlmbGlwIHw9IFM1UF9DSVRSR0ZNVF9GTElQX1lfTUlSUk9SOworCiAJaWYgKGN0eC0+cm90YXRpb24gPD0gOTApCiAJCXJldHVybiBmbGlwOwogCkBAIC0zNjgsMTcgKzM1MiwxOSBAQAogCXdyaXRlbChjZmcgfCBTNVBfQ0lJTUdDUFRfSU1HQ1BURU4sIGRldi0+cmVncyArIFM1UF9DSUlNR0NQVCk7CiB9CiAKLXZvaWQgZmltY19od19zZXRfZWZmZWN0KHN0cnVjdCBmaW1jX2N0eCAqY3R4KQordm9pZCBmaW1jX2h3X3NldF9lZmZlY3Qoc3RydWN0IGZpbWNfY3R4ICpjdHgsIGJvb2wgYWN0aXZlKQogewogCXN0cnVjdCBmaW1jX2RldiAqZGV2ID0gY3R4LT5maW1jX2RldjsKIAlzdHJ1Y3QgZmltY19lZmZlY3QgKmVmZmVjdCA9ICZjdHgtPmVmZmVjdDsKLQl1MzIgY2ZnID0gKFM1UF9DSUlNR0VGRl9JRV9FTkFCTEUgfCBTNVBfQ0lJTUdFRkZfSUVfU0NfQUZURVIpOworCXUzMiBjZmcgPSAwOwogCi0JY2ZnIHw9IGVmZmVjdC0+dHlwZTsKLQotCWlmIChlZmZlY3QtPnR5cGUgPT0gUzVQX0ZJTUNfRUZGRUNUX0FSQklUUkFSWSkgewotCQljZmcgfD0gUzVQX0NJSU1HRUZGX1BBVF9DQihlZmZlY3QtPnBhdF9jYik7Ci0JCWNmZyB8PSBTNVBfQ0lJTUdFRkZfUEFUX0NSKGVmZmVjdC0+cGF0X2NyKTsKKwlpZiAoYWN0aXZlKSB7CisJCWNmZyB8PSBTNVBfQ0lJTUdFRkZfSUVfU0NfQUZURVIgfCBTNVBfQ0lJTUdFRkZfSUVfRU5BQkxFOworCQljZmcgfD0gZWZmZWN0LT50eXBlOworCQlpZiAoZWZmZWN0LT50eXBlID09IFM1UF9GSU1DX0VGRkVDVF9BUkJJVFJBUlkpIHsKKwkJCWNmZyB8PSBTNVBfQ0lJTUdFRkZfUEFUX0NCKGVmZmVjdC0+cGF0X2NiKTsKKwkJCWNmZyB8PSBTNVBfQ0lJTUdFRkZfUEFUX0NSKGVmZmVjdC0+cGF0X2NyKTsKKwkJfQogCX0KIAogCXdyaXRlbChjZmcsIGRldi0+cmVncyArIFM1UF9DSUlNR0VGRik7CkBAIC01NDcsMjAgKzUzMywyNCBAQAogCXUzMiBjZmcgPSByZWFkbChmaW1jLT5yZWdzICsgUzVQX0NJR0NUUkwpOwogCiAJY2ZnICY9IH4oUzVQX0NJR0NUUkxfSU5WUE9MUENMSyB8IFM1UF9DSUdDVFJMX0lOVlBPTFZTWU5DIHwKLQkJIFM1UF9DSUdDVFJMX0lOVlBPTEhSRUYgfCBTNVBfQ0lHQ1RSTF9JTlZQT0xIU1lOQyk7CisJCSBTNVBfQ0lHQ1RSTF9JTlZQT0xIUkVGIHwgUzVQX0NJR0NUUkxfSU5WUE9MSFNZTkMgfAorCQkgUzVQX0NJR0NUUkxfSU5WUE9MRklFTEQpOwogCi0JaWYgKGNhbS0+ZmxhZ3MgJiBGSU1DX0NMS19JTlZfUENMSykKKwlpZiAoY2FtLT5mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKQogCQljZmcgfD0gUzVQX0NJR0NUUkxfSU5WUE9MUENMSzsKIAotCWlmIChjYW0tPmZsYWdzICYgRklNQ19DTEtfSU5WX1ZTWU5DKQorCWlmIChjYW0tPmZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpCiAJCWNmZyB8PSBTNVBfQ0lHQ1RSTF9JTlZQT0xWU1lOQzsKIAotCWlmIChjYW0tPmZsYWdzICYgRklNQ19DTEtfSU5WX0hSRUYpCisJaWYgKGNhbS0+ZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykKIAkJY2ZnIHw9IFM1UF9DSUdDVFJMX0lOVlBPTEhSRUY7CiAKLQlpZiAoY2FtLT5mbGFncyAmIEZJTUNfQ0xLX0lOVl9IU1lOQykKKwlpZiAoY2FtLT5mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKQogCQljZmcgfD0gUzVQX0NJR0NUUkxfSU5WUE9MSFNZTkM7CiAKKwlpZiAoY2FtLT5mbGFncyAmIFY0TDJfTUJVU19GSUVMRF9FVkVOX0xPVykKKwkJY2ZnIHw9IFM1UF9DSUdDVFJMX0lOVlBPTEZJRUxEOworCiAJd3JpdGVsKGNmZywgZmltYy0+cmVncyArIFM1UF9DSUdDVFJMKTsKIAogCXJldHVybiAwOwpAQCAtNTg4LDcgKzU3OCw3IEBACiAKIAlpZiAoY2FtLT5idXNfdHlwZSA9PSBGSU1DX0lUVV82MDEgfHwgY2FtLT5idXNfdHlwZSA9PSBGSU1DX0lUVV82NTYpIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGl4X2Rlc2MpOyBpKyspIHsKLQkJCWlmIChmaW1jLT52aWRfY2FwLmZtdC5jb2RlID09IHBpeF9kZXNjW2ldLnBpeGVsY29kZSkgeworCQkJaWYgKGZpbWMtPnZpZF9jYXAubWYuY29kZSA9PSBwaXhfZGVzY1tpXS5waXhlbGNvZGUpIHsKIAkJCQljZmcgPSBwaXhfZGVzY1tpXS5jaXNyY2ZtdDsKIAkJCQlidXNfd2lkdGggPSBwaXhfZGVzY1tpXS5idXNfd2lkdGg7CiAJCQkJYnJlYWs7CkBAIC01OTYsOSArNTg2LDkgQEAKIAkJfQogCiAJCWlmIChpID09IEFSUkFZX1NJWkUocGl4X2Rlc2MpKSB7Ci0JCQl2NGwyX2VycigmZmltYy0+dmlkX2NhcC52NGwyX2RldiwKKwkJCXY0bDJfZXJyKGZpbWMtPnZpZF9jYXAudmZkLAogCQkJCSAiQ2FtZXJhIGNvbG9yIGZvcm1hdCBub3Qgc3VwcG9ydGVkOiAlZFxuIiwKLQkJCQkgZmltYy0+dmlkX2NhcC5mbXQuY29kZSk7CisJCQkJIGZpbWMtPnZpZF9jYXAubWYuY29kZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC02MDgsNiArNTk4LDkgQEAKIAkJCWVsc2UgaWYgKGJ1c193aWR0aCA9PSAxNikKIAkJCQljZmcgfD0gUzVQX0NJU1JDRk1UX0lUVTYwMV8xNkJJVDsKIAkJfSAvKiBlbHNlIGRlZmF1bHRzIHRvIElUVS1SIEJULjY1NiA4LWJpdCAqLworCX0gZWxzZSBpZiAoY2FtLT5idXNfdHlwZSA9PSBGSU1DX01JUElfQ1NJMikgeworCQlpZiAoZmltY19mbXRfaXNfanBlZyhmLT5mbXQtPmNvbG9yKSkKKwkJCWNmZyB8PSBTNVBfQ0lTUkNGTVRfSVRVNjAxXzhCSVQ7CiAJfQogCiAJY2ZnIHw9IFM1UF9DSVNSQ0ZNVF9IU0laRShmLT5vX3dpZHRoKSB8IFM1UF9DSVNSQ0ZNVF9WU0laRShmLT5vX2hlaWdodCk7CkBAIC02NDksNyArNjQyLDcgQEAKIAkvKiBTZWxlY3QgSVRVIEIgaW50ZXJmYWNlLCBkaXNhYmxlIFdyaXRlYmFjayBwYXRoIGFuZCB0ZXN0IHBhdHRlcm4uICovCiAJY2ZnICY9IH4oUzVQX0NJR0NUUkxfVEVTVFBBVF9NQVNLIHwgUzVQX0NJR0NUUkxfU0VMQ0FNX0lUVV9BIHwKIAkJUzVQX0NJR0NUUkxfU0VMQ0FNX01JUEkgfCBTNVBfQ0lHQ1RSTF9DQU1JRl9TRUxXQiB8Ci0JCVM1UF9DSUdDVFJMX1NFTENBTV9NSVBJX0EpOworCQlTNVBfQ0lHQ1RSTF9TRUxDQU1fTUlQSV9BIHwgUzVQX0NJR0NUUkxfQ0FNX0pQRUcpOwogCiAJaWYgKGNhbS0+YnVzX3R5cGUgPT0gRklNQ19NSVBJX0NTSTIpIHsKIAkJY2ZnIHw9IFM1UF9DSUdDVFJMX1NFTENBTV9NSVBJOwpAQCAtNjU4LDExICs2NTEsMTggQEAKIAkJCWNmZyB8PSBTNVBfQ0lHQ1RSTF9TRUxDQU1fTUlQSV9BOwogCiAJCS8qIFRPRE86IGFkZCByZW1haW5pbmcgc3VwcG9ydGVkIGZvcm1hdHMuICovCi0JCWlmICh2aWRfY2FwLT5mbXQuY29kZSA9PSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYOCkgeworCQlzd2l0Y2ggKHZpZF9jYXAtPm1mLmNvZGUpIHsKKwkJY2FzZSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYODoKIAkJCXRtcCA9IFM1UF9DU0lJTUdGTVRfWUNCQ1I0MjJfOEJJVDsKLQkJfSBlbHNlIHsKLQkJCWVycigiY2FtZXJhIGltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkOiAlZCIsCi0JCQkgICAgdmlkX2NhcC0+Zm10LmNvZGUpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9NQlVTX0ZNVF9KUEVHXzFYODoKKwkJCXRtcCA9IFM1UF9DU0lJTUdGTVRfVVNFUigxKTsKKwkJCWNmZyB8PSBTNVBfQ0lHQ1RSTF9DQU1fSlBFRzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdjRsMl9lcnIoZmltYy0+dmlkX2NhcC52ZmQsCisJCQkJICJOb3Qgc3VwcG9ydGVkIGNhbWVyYSBwaXhlbCBmb3JtYXQ6ICVkIiwKKwkJCQkgdmlkX2NhcC0+bWYuY29kZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQl0bXAgfD0gKGNhbS0+Y3NpX2RhdGFfYWxpZ24gPT0gMzIpIDw8IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL21pcGktY3Npcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9taXBpLWNzaXMuYwppbmRleCBlZjA1NmQ2Li41OWQ3OWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL21pcGktY3Npcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvbWlwaS1jc2lzLmMKQEAgLTgxLDYgKzgxLDEyIEBACiB9OwogI2RlZmluZSBOVU1fQ1NJU19DTE9DS1MJQVJSQVlfU0laRShjc2lfY2xvY2tfbmFtZSkKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjc2lzX3N1cHBseV9uYW1lW10gPSB7CisJInZkZDExIiwgLyogMS4xViBvciAxLjJWIChzNXBjMTAwKSBNSVBJIENTSSBzdXBwcGx5ICovCisJInZkZDE4IiwgLyogVkREIDEuOFYgYW5kIE1JUEkgQ1NJIFBMTCBzdXBwbHkgKi8KK307CisjZGVmaW5lIENTSVNfTlVNX1NVUFBMSUVTIEFSUkFZX1NJWkUoY3Npc19zdXBwbHlfbmFtZSkKKwogZW51bSB7CiAJU1RfUE9XRVJFRAk9IDEsCiAJU1RfU1RSRUFNSU5HCT0gMiwKQEAgLTEwOSw5ICsxMTUsOSBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IHJlc291cmNlICpyZWdzX3JlczsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbQ1NJU19OVU1fU1VQUExJRVNdOwogCXN0cnVjdCBjbGsgKmNsb2NrW05VTV9DU0lTX0NMT0NLU107CiAJaW50IGlycTsKLQlzdHJ1Y3QgcmVndWxhdG9yICpzdXBwbHk7CiAJdTMyIGZsYWdzOwogCWNvbnN0IHN0cnVjdCBjc2lzX3BpeF9mb3JtYXQgKmNzaXNfZm10OwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0OwpAQCAtNDYwLDYgKzQ2Niw3IEBACiAJc3RydWN0IHJlc291cmNlICpyZWdzX3JlczsKIAlzdHJ1Y3QgY3Npc19zdGF0ZSAqc3RhdGU7CiAJaW50IHJldCA9IC1FTk9NRU07CisJaW50IGk7CiAKIAlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghc3RhdGUpCkBAIC01MTksMTQgKzUyNiwxMyBAQAogCQlnb3RvIGVfY2xrcHV0OwogCX0KIAotCWlmICghcGRhdGEtPmZpeGVkX3BoeV92ZGQpIHsKLQkJc3RhdGUtPnN1cHBseSA9IHJlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgInZkZCIpOwotCQlpZiAoSVNfRVJSKHN0YXRlLT5zdXBwbHkpKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKHN0YXRlLT5zdXBwbHkpOwotCQkJc3RhdGUtPnN1cHBseSA9IE5VTEw7Ci0JCQlnb3RvIGVfY2xrcHV0OwotCQl9Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBDU0lTX05VTV9TVVBQTElFUzsgaSsrKQorCQlzdGF0ZS0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gY3Npc19zdXBwbHlfbmFtZVtpXTsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldCgmcGRldi0+ZGV2LCBDU0lTX05VTV9TVVBQTElFUywKKwkJCQkgc3RhdGUtPnN1cHBsaWVzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVfY2xrcHV0OwogCiAJcmV0ID0gcmVxdWVzdF9pcnEoc3RhdGUtPmlycSwgczVwY3Npc19pcnFfaGFuZGxlciwgMCwKIAkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIHN0YXRlKTsKQEAgLTU1Myw3ICs1NTksNiBAQAogCS8qIC4uIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHN1YmRldi4gKi8KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmc3RhdGUtPnNkKTsKIAotCXN0YXRlLT5mbGFncyA9IFNUX1NVU1BFTkRFRDsKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAogCXJldHVybiAwOwpAQCAtNTYxLDggKzU2Niw3IEBACiBlX2lycWZyZWU6CiAJZnJlZV9pcnEoc3RhdGUtPmlycSwgc3RhdGUpOwogZV9yZWdwdXQ6Ci0JaWYgKHN0YXRlLT5zdXBwbHkpCi0JCXJlZ3VsYXRvcl9wdXQoc3RhdGUtPnN1cHBseSk7CisJcmVndWxhdG9yX2J1bGtfZnJlZShDU0lTX05VTV9TVVBQTElFUywgc3RhdGUtPnN1cHBsaWVzKTsKIGVfY2xrcHV0OgogCWNsa19kaXNhYmxlKHN0YXRlLT5jbG9ja1tDU0lTX0NMS19NVVhdKTsKIAlzNXBjc2lzX2Nsa19wdXQoc3RhdGUpOwpAQCAtNTc1LDcgKzU3OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzNXBjc2lzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzNXBjc2lzX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBib29sIHJ1bnRpbWUpCiB7CiAJc3RydWN0IHM1cF9wbGF0Zm9ybV9taXBpX2NzaXMgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKQEAgLTU5MiwyMSArNTk2LDIxIEBACiAJCXJldCA9IHBkYXRhLT5waHlfZW5hYmxlKHN0YXRlLT5wZGV2LCBmYWxzZSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIHVubG9jazsKLQkJaWYgKHN0YXRlLT5zdXBwbHkpIHsKLQkJCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKHN0YXRlLT5zdXBwbHkpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIHVubG9jazsKLQkJfQorCQlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKENTSVNfTlVNX1NVUFBMSUVTLAorCQkJCQkgICAgIHN0YXRlLT5zdXBwbGllcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIHVubG9jazsKIAkJY2xrX2Rpc2FibGUoc3RhdGUtPmNsb2NrW0NTSVNfQ0xLX0dBVEVdKTsKIAkJc3RhdGUtPmZsYWdzICY9IH5TVF9QT1dFUkVEOworCQlpZiAoIXJ1bnRpbWUpCisJCQlzdGF0ZS0+ZmxhZ3MgfD0gU1RfU1VTUEVOREVEOwogCX0KLQlzdGF0ZS0+ZmxhZ3MgfD0gU1RfU1VTUEVOREVEOwogIHVubG9jazoKIAltdXRleF91bmxvY2soJnN0YXRlLT5sb2NrKTsKIAlyZXR1cm4gcmV0ID8gLUVBR0FJTiA6IDA7CiB9CiAKLXN0YXRpYyBpbnQgczVwY3Npc19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzNXBjc2lzX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgcnVudGltZSkKIHsKIAlzdHJ1Y3QgczVwX3BsYXRmb3JtX21pcGlfY3NpcyAqcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwpAQCAtNjE4LDIwICs2MjIsMjAgQEAKIAkJIF9fZnVuY19fLCBzdGF0ZS0+ZmxhZ3MpOwogCiAJbXV0ZXhfbG9jaygmc3RhdGUtPmxvY2spOwotCWlmICghKHN0YXRlLT5mbGFncyAmIFNUX1NVU1BFTkRFRCkpCisJaWYgKCFydW50aW1lICYmICEoc3RhdGUtPmZsYWdzICYgU1RfU1VTUEVOREVEKSkKIAkJZ290byB1bmxvY2s7CiAKIAlpZiAoIShzdGF0ZS0+ZmxhZ3MgJiBTVF9QT1dFUkVEKSkgewotCQlpZiAoc3RhdGUtPnN1cHBseSkKLQkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3RhdGUtPnN1cHBseSk7CisJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShDU0lTX05VTV9TVVBQTElFUywKKwkJCQkJICAgIHN0YXRlLT5zdXBwbGllcyk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIHVubG9jazsKLQogCQlyZXQgPSBwZGF0YS0+cGh5X2VuYWJsZShzdGF0ZS0+cGRldiwgdHJ1ZSk7CiAJCWlmICghcmV0KSB7CiAJCQlzdGF0ZS0+ZmxhZ3MgfD0gU1RfUE9XRVJFRDsKLQkJfSBlbHNlIGlmIChzdGF0ZS0+c3VwcGx5KSB7Ci0JCQlyZWd1bGF0b3JfZGlzYWJsZShzdGF0ZS0+c3VwcGx5KTsKKwkJfSBlbHNlIHsKKwkJCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQ1NJU19OVU1fU1VQUExJRVMsCisJCQkJCSAgICAgICBzdGF0ZS0+c3VwcGxpZXMpOwogCQkJZ290byB1bmxvY2s7CiAJCX0KIAkJY2xrX2VuYWJsZShzdGF0ZS0+Y2xvY2tbQ1NJU19DTEtfR0FURV0pOwpAQCAtNjQ2LDI0ICs2NTAsMjYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBzNXBjc2lzX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzNXBjc2lzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBzNXBjc2lzX3N1c3BlbmQoZGV2KTsKKwlyZXR1cm4gczVwY3Npc19wbV9zdXNwZW5kKGRldiwgZmFsc2UpOwogfQogCi1zdGF0aWMgaW50IHM1cGNzaXNfcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgczVwY3Npc19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCWludCByZXQ7CisJcmV0dXJuIHM1cGNzaXNfcG1fcmVzdW1lKGRldiwgZmFsc2UpOworfQorI2VuZGlmCiAKLQlyZXQgPSBzNXBjc2lzX3Jlc3VtZShkZXYpOworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitzdGF0aWMgaW50IHM1cGNzaXNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gczVwY3Npc19wbV9zdXNwZW5kKGRldiwgdHJ1ZSk7Cit9CiAKLQlpZiAoIXJldCkgewotCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKLQkJcmV0ID0gcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7Ci0JCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Ci0JfQotCi0JcmV0dXJuIHJldDsKK3N0YXRpYyBpbnQgczVwY3Npc19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHM1cGNzaXNfcG1fcmVzdW1lKGRldiwgdHJ1ZSk7CiB9CiAjZW5kaWYKIApAQCAtNjc5LDggKzY4NSw3IEBACiAJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKCZwZGV2LT5kZXYpOwogCiAJczVwY3Npc19jbGtfcHV0KHN0YXRlKTsKLQlpZiAoc3RhdGUtPnN1cHBseSkKLQkJcmVndWxhdG9yX3B1dChzdGF0ZS0+c3VwcGx5KTsKKwlyZWd1bGF0b3JfYnVsa19mcmVlKENTSVNfTlVNX1NVUFBMSUVTLCBzdGF0ZS0+c3VwcGxpZXMpOwogCiAJbWVkaWFfZW50aXR5X2NsZWFudXAoJnN0YXRlLT5zZC5lbnRpdHkpOwogCWZyZWVfaXJxKHN0YXRlLT5pcnEsIHN0YXRlKTsKQEAgLTY5Miw4ICs2OTcsOSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgczVwY3Npc19wbV9vcHMgPSB7Ci0JU0VUX1JVTlRJTUVfUE1fT1BTKHM1cGNzaXNfc3VzcGVuZCwgczVwY3Npc19yZXN1bWUsIE5VTEwpCi0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoczVwY3Npc19wbV9zdXNwZW5kLCBzNXBjc2lzX3BtX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoczVwY3Npc19ydW50aW1lX3N1c3BlbmQsIHM1cGNzaXNfcnVudGltZV9yZXN1bWUsCisJCQkgICBOVUxMKQorCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHM1cGNzaXNfc3VzcGVuZCwgczVwY3Npc19yZXN1bWUpCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzNXBjc2lzX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvcmVncy1maW1jLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL3JlZ3MtZmltYy5oCmluZGV4IDBmZWEzZTYuLmM4ZTNiOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvcmVncy1maW1jLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9yZWdzLWZpbWMuaApAQCAtNTQsMTIgKzU0LDE0IEBACiAjZGVmaW5lIFM1UF9DSUdDVFJMX0lSUV9DTFIJCSgxIDw8IDE5KQogI2RlZmluZSBTNVBfQ0lHQ1RSTF9JUlFfRU5BQkxFCQkoMSA8PCAxNikKICNkZWZpbmUgUzVQX0NJR0NUUkxfU0hEV19ESVNBQkxFCSgxIDw8IDEyKQorI2RlZmluZSBTNVBfQ0lHQ1RSTF9DQU1fSlBFRwkJKDEgPDwgOCkKICNkZWZpbmUgUzVQX0NJR0NUUkxfU0VMQ0FNX01JUElfQQkoMSA8PCA3KQogI2RlZmluZSBTNVBfQ0lHQ1RSTF9DQU1JRl9TRUxXQgkJKDEgPDwgNikKIC8qIDAgLSBJVFU2MDE7IDEgLSBJVFU3MDkgKi8KICNkZWZpbmUgUzVQX0NJR0NUUkxfQ1NDX0lUVTYwMV83MDkJKDEgPDwgNSkKICNkZWZpbmUgUzVQX0NJR0NUUkxfSU5WUE9MSFNZTkMJCSgxIDw8IDQpCiAjZGVmaW5lIFM1UF9DSUdDVFJMX1NFTENBTV9NSVBJCQkoMSA8PCAzKQorI2RlZmluZSBTNVBfQ0lHQ1RSTF9JTlZQT0xGSUVMRAkJKDEgPDwgMSkKICNkZWZpbmUgUzVQX0NJR0NUUkxfSU5URVJMQUNFCQkoMSA8PCAwKQogCiAvKiBXaW5kb3cgb2Zmc2V0IDIgKi8KQEAgLTE4NCw3ICsxODYsNiBAQAogCiAvKiBJbWFnZSBlZmZlY3QgKi8KICNkZWZpbmUgUzVQX0NJSU1HRUZGCQkJMHhkMAotI2RlZmluZSBTNVBfQ0lJTUdFRkZfSUVfRElTQUJMRQkJKDAgPDwgMzApCiAjZGVmaW5lIFM1UF9DSUlNR0VGRl9JRV9FTkFCTEUJCSgxIDw8IDMwKQogI2RlZmluZSBTNVBfQ0lJTUdFRkZfSUVfU0NfQkVGT1JFCSgwIDw8IDI5KQogI2RlZmluZSBTNVBfQ0lJTUdFRkZfSUVfU0NfQUZURVIJKDEgPDwgMjkpCkBAIC0yODYsMTAgKzI4Nyw4IEBACiAjZGVmaW5lIFM1UF9DU0lJTUdGTVRfUkFXOAkJMHgyYQogI2RlZmluZSBTNVBfQ1NJSU1HRk1UX1JBVzEwCQkweDJiCiAjZGVmaW5lIFM1UF9DU0lJTUdGTVRfUkFXMTIJCTB4MmMKLSNkZWZpbmUgUzVQX0NTSUlNR0ZNVF9VU0VSMQkJMHgzMAotI2RlZmluZSBTNVBfQ1NJSU1HRk1UX1VTRVIyCQkweDMxCi0jZGVmaW5lIFM1UF9DU0lJTUdGTVRfVVNFUjMJCTB4MzIKLSNkZWZpbmUgUzVQX0NTSUlNR0ZNVF9VU0VSNAkJMHgzMworLyogVXNlciBkZWZpbmVkIGZvcm1hdHMuIHggPSAwLi4uMTYuICovCisjZGVmaW5lIFM1UF9DU0lJTUdGTVRfVVNFUih4KQkJKDB4MzAgKyB4IC0gMSkKIAogLyogT3V0cHV0IGZyYW1lIGJ1ZmZlciBzZXF1ZW5jZSBtYXNrICovCiAjZGVmaW5lIFM1UF9DSUZDTlRTRVEJCQkweDFGQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjLmMKaW5kZXggN2RjN2VhYi4uOGJlOGI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mYy5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgICBhcHByb3ByYWl0ZSBmbGFncyAqLwogCXNyY19idWYgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkc3RfYnVmLCAmY3R4LT5kc3RfcXVldWUsIGxpc3QpIHsKLQkJaWYgKHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKGRzdF9idWYtPmIsIDApID09IGRlY195X2FkZHIpIHsKKwkJaWYgKHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKGRzdF9idWYtPmIsIDApID09IGRlY195X2FkZHIpIHsKIAkJCW1lbWNweSgmZHN0X2J1Zi0+Yi0+djRsMl9idWYudGltZWNvZGUsCiAJCQkJJnNyY19idWYtPmItPnY0bDJfYnVmLnRpbWVjb2RlLAogCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl90aW1lY29kZSkpOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJICogY2hlY2sgd2hpY2ggdmlkZW9idWYgZG9lcyBpdCBjb3JyZXNwb25kIHRvICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkc3RfYnVmLCAmY3R4LT5kc3RfcXVldWUsIGxpc3QpIHsKIAkJLyogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgYnVmZmVyIHdlJ3JlIGxvb2tpbmcgZm9yICovCi0JCWlmICh2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihkc3RfYnVmLT5iLCAwKSA9PSBkc3BsX3lfYWRkcikgeworCQlpZiAodmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoZHN0X2J1Zi0+YiwgMCkgPT0gZHNwbF95X2FkZHIpIHsKIAkJCWxpc3RfZGVsKCZkc3RfYnVmLT5saXN0KTsKIAkJCWN0eC0+ZHN0X3F1ZXVlX2NudC0tOwogCQkJZHN0X2J1Zi0+Yi0+djRsMl9idWYuc2VxdWVuY2UgPSBjdHgtPnNlcXVlbmNlOwpAQCAtOTQwLDkgKzk0MCw4IEBACiAJcmV0dXJuICFzdHJjbXAoZGV2X25hbWUoZGV2KSwgKGNoYXIgKilkYXRhKTsKIH0KIAotCiAvKiBNRkMgcHJvYmUgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHM1cF9tZmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgczVwX21mY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2OwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKQEAgLTEyMzYsNyArMTIzNSw3IEBACiAJCQkgICBOVUxMKQogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczVwX21mY19wZHJ2ID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczVwX21mY19kcml2ZXIgPSB7CiAJLnByb2JlCT0gczVwX21mY19wcm9iZSwKIAkucmVtb3ZlCT0gX19kZXZleGl0X3AoczVwX21mY19yZW1vdmUpLAogCS5kcml2ZXIJPSB7CkBAIC0xMjU0LDE1ICsxMjUzLDE1IEBACiAJaW50IHJldDsKIAogCXByX2luZm8oIiVzIiwgYmFubmVyKTsKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnM1cF9tZmNfcGRydik7CisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzNXBfbWZjX2RyaXZlcik7CiAJaWYgKHJldCkKIAkJcHJfZXJyKCJQbGF0Zm9ybSBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzNXBfbWZjX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBzNXBfbWZjX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczVwX21mY19wZHJ2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczVwX21mY19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChzNXBfbWZjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY3RybC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY3RybC5jCmluZGV4IDVmNGRhODAuLmYyNDgxYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2N0cmwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jdHJsLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAkgKiBpbnRvIGtlcm5lbC4gKi8KIAltZmNfZGVidWdfZW50ZXIoKTsKIAllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKChjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKiopJmZ3X2Jsb2IsCi0JCQkJICAgICAiczVwYzExMC1tZmMuZnciLCBkZXYtPnY0bDJfZGV2LmRldik7CisJCQkJICAgICAiczVwLW1mYy5mdyIsIGRldi0+djRsMl9kZXYuZGV2KTsKIAlpZiAoZXJyICE9IDApIHsKIAkJbWZjX2VycigiRmlybXdhcmUgaXMgbm90IHByZXNlbnQgaW4gdGhlIC9saWIvZmlybXdhcmUgZGlyZWN0b3J5IG5vciBjb21waWxlZCBpbiBrZXJuZWxcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExNiw3ICsxMTYsNyBAQAogCSAqIGludG8ga2VybmVsLiAqLwogCW1mY19kZWJ1Z19lbnRlcigpOwogCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKikmZndfYmxvYiwKLQkJCQkgICAgICJzNXBjMTEwLW1mYy5mdyIsIGRldi0+djRsMl9kZXYuZGV2KTsKKwkJCQkgICAgICJzNXAtbWZjLmZ3IiwgZGV2LT52NGwyX2Rldi5kZXYpOwogCWlmIChlcnIgIT0gMCkgewogCQltZmNfZXJyKCJGaXJtd2FyZSBpcyBub3QgcHJlc2VudCBpbiB0aGUgL2xpYi9maXJtd2FyZSBkaXJlY3Rvcnkgbm9yIGNvbXBpbGVkIGluIGtlcm5lbFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19kZWMuYwppbmRleCBiMmM1MDUyLi44NDRhNGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19kZWMuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCS5tYXhpbXVtID0gMzIsCiAJCS5zdGVwID0gMSwKIAkJLmRlZmF1bHRfdmFsdWUgPSAxLAotCQkuaXNfdm9sYXRpbGUgPSAxLAorCQkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19WT0xBVElMRSwKIAl9LAogfTsKIApAQCAtMjIwLDggKzIyMCw4IEBACiAJc3RybmNweShjYXAtPmNhcmQsIGRldi0+cGxhdF9kZXYtPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpIC0gMSk7CiAJY2FwLT5idXNfaW5mb1swXSA9IDA7CiAJY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMSwgMCwgMCk7Ci0JY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUCi0JCQkJCQkgICAgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORSB8CisJCQlWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCXJldHVybiAwOwogfQogCkBAIC03NDQsOSArNzQ0LDEwIEBACiAJLnZpZGlvY19nX2Nyb3AgPSB2aWRpb2NfZ19jcm9wLAogfTsKIAotc3RhdGljIGludCBzNXBfbWZjX3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKmJ1Zl9jb3VudCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnBsYW5lX2NvdW50LCB1bnNpZ25lZCBsb25nIHBzaXplW10sCi0JCQkgICAgICAgdm9pZCAqYWxsb2NhdG9yc1tdKQorc3RhdGljIGludCBzNXBfbWZjX3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLAorCQkJY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsIHVuc2lnbmVkIGludCAqYnVmX2NvdW50LAorCQkJdW5zaWduZWQgaW50ICpwbGFuZV9jb3VudCwgdW5zaWduZWQgaW50IHBzaXplW10sCisJCQl2b2lkICphbGxvY2F0b3JzW10pCiB7CiAJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgodnEtPmRydl9wcml2KTsKIApAQCAtODI0LDcgKzgyNSw3IEBACiAJCQlyZXR1cm4gMDsKIAkJZm9yIChpID0gMDsgaSA8PSBjdHgtPnNyY19mbXQtPm51bV9wbGFuZXMgOyBpKyspIHsKIAkJCWlmIChJU19FUlJfT1JfTlVMTChFUlJfUFRSKAotCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgaSkpKSkgeworCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgaSkpKSkgewogCQkJCW1mY19lcnIoIlBsYW5lIG1lbSBub3QgYWxsb2NhdGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KQEAgLTgzNywxMyArODM4LDEzIEBACiAJCWkgPSB2Yi0+djRsMl9idWYuaW5kZXg7CiAJCWN0eC0+ZHN0X2J1ZnNbaV0uYiA9IHZiOwogCQljdHgtPmRzdF9idWZzW2ldLmNvb2tpZS5yYXcubHVtYSA9Ci0JCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOwogCQljdHgtPmRzdF9idWZzW2ldLmNvb2tpZS5yYXcuY2hyb21hID0KLQkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDEpOworCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMSk7CiAJCWN0eC0+ZHN0X2J1ZnNfY250Kys7CiAJfSBlbHNlIGlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKIAkJaWYgKElTX0VSUl9PUl9OVUxMKEVSUl9QVFIoCi0JCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKSkpKSB7CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCAwKSkpKSB7CiAJCQltZmNfZXJyKCJQbGFuZSBtZW1vcnkgbm90IGFsbG9jYXRlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtODU1LDcgKzg1Niw3IEBACiAJCWkgPSB2Yi0+djRsMl9idWYuaW5kZXg7CiAJCWN0eC0+c3JjX2J1ZnNbaV0uYiA9IHZiOwogCQljdHgtPnNyY19idWZzW2ldLmNvb2tpZS5zdHJlYW0gPQotCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCk7CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCAwKTsKIAkJY3R4LT5zcmNfYnVmc19jbnQrKzsKIAl9IGVsc2UgewogCQltZmNfZXJyKCJzNXBfbWZjX2J1Zl9pbml0OiB1bmtub3duIHF1ZXVlIHR5cGVcbiIpOwpAQCAtODY0LDcgKzg2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczVwX21mY19zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3N0YXRpYyBpbnQgczVwX21mY19zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHEtPmRydl9wcml2KTsKIAlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OwpAQCAtMTAyMCw3ICsxMDIxLDcgQEAKIAkJCXJldHVybiBjdHgtPmN0cmxfaGFuZGxlci5lcnJvcjsKIAkJfQogCQlpZiAoY29udHJvbHNbaV0uaXNfdm9sYXRpbGUgJiYgY3R4LT5jdHJsc1tpXSkKLQkJCWN0eC0+Y3RybHNbaV0tPmlzX3ZvbGF0aWxlID0gMTsKKwkJCWN0eC0+Y3RybHNbaV0tPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMKaW5kZXggZmVlMDk0YS4uMWU4Y2RiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMKQEAgLTU5OSw4ICs1OTksOCBAQAogCXdoaWxlICghbGlzdF9lbXB0eSgmY3R4LT5yZWZfcXVldWUpKSB7CiAJCW1iX2VudHJ5ID0gbGlzdF9lbnRyeSgoJmN0eC0+cmVmX3F1ZXVlKS0+bmV4dCwKIAkJCQkJCXN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7Ci0JCW1iX3lfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKG1iX2VudHJ5LT5iLCAwKTsKLQkJbWJfY19hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIobWJfZW50cnktPmIsIDEpOworCQltYl95X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihtYl9lbnRyeS0+YiwgMCk7CisJCW1iX2NfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKG1iX2VudHJ5LT5iLCAxKTsKIAkJbGlzdF9kZWwoJm1iX2VudHJ5LT5saXN0KTsKIAkJY3R4LT5yZWZfcXVldWVfY250LS07CiAJCWxpc3RfYWRkX3RhaWwoJm1iX2VudHJ5LT5saXN0LCAmY3R4LT5zcmNfcXVldWUpOwpAQCAtNjIyLDcgKzYyMiw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CiAJZHN0X21iID0gbGlzdF9lbnRyeShjdHgtPmRzdF9xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOwotCWRzdF9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoZHN0X21iLT5iLCAwKTsKKwlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKGRzdF9tYi0+YiwgMCk7CiAJZHN0X3NpemUgPSB2YjJfcGxhbmVfc2l6ZShkc3RfbWItPmIsIDApOwogCXM1cF9tZmNfc2V0X2VuY19zdHJlYW1fYnVmZmVyKGN0eCwgZHN0X2FkZHIsIGRzdF9zaXplKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKQEAgLTY2OCwxNCArNjY4LDE0IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CiAJc3JjX21iID0gbGlzdF9lbnRyeShjdHgtPnNyY19xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOwotCXNyY195X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihzcmNfbWItPmIsIDApOwotCXNyY19jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihzcmNfbWItPmIsIDEpOworCXNyY195X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihzcmNfbWItPmIsIDApOworCXNyY19jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihzcmNfbWItPmIsIDEpOwogCXM1cF9tZmNfc2V0X2VuY19mcmFtZV9idWZmZXIoY3R4LCBzcmNfeV9hZGRyLCBzcmNfY19hZGRyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKIAlkc3RfbWIgPSBsaXN0X2VudHJ5KGN0eC0+ZHN0X3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7Ci0JZHN0X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihkc3RfbWItPmIsIDApOworCWRzdF9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoZHN0X21iLT5iLCAwKTsKIAlkc3Rfc2l6ZSA9IHZiMl9wbGFuZV9zaXplKGRzdF9tYi0+YiwgMCk7CiAJczVwX21mY19zZXRfZW5jX3N0cmVhbV9idWZmZXIoY3R4LCBkc3RfYWRkciwgZHN0X3NpemUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOwpAQCAtNzAzLDggKzcwMyw4IEBACiAJaWYgKHNsaWNlX3R5cGUgPj0gMCkgewogCQlzNXBfbWZjX2dldF9lbmNfZnJhbWVfYnVmZmVyKGN0eCwgJmVuY195X2FkZHIsICZlbmNfY19hZGRyKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYl9lbnRyeSwgJmN0eC0+c3JjX3F1ZXVlLCBsaXN0KSB7Ci0JCQltYl95X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMCk7Ci0JCQltYl9jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMSk7CisJCQltYl95X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihtYl9lbnRyeS0+YiwgMCk7CisJCQltYl9jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihtYl9lbnRyeS0+YiwgMSk7CiAJCQlpZiAoKGVuY195X2FkZHIgPT0gbWJfeV9hZGRyKSAmJgogCQkJCQkJKGVuY19jX2FkZHIgPT0gbWJfY19hZGRyKSkgewogCQkJCWxpc3RfZGVsKCZtYl9lbnRyeS0+bGlzdCk7CkBAIC03MTUsOCArNzE1LDggQEAKIAkJCX0KIAkJfQogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1iX2VudHJ5LCAmY3R4LT5yZWZfcXVldWUsIGxpc3QpIHsKLQkJCW1iX3lfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKG1iX2VudHJ5LT5iLCAwKTsKLQkJCW1iX2NfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKG1iX2VudHJ5LT5iLCAxKTsKKwkJCW1iX3lfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKG1iX2VudHJ5LT5iLCAwKTsKKwkJCW1iX2NfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKG1iX2VudHJ5LT5iLCAxKTsKIAkJCWlmICgoZW5jX3lfYWRkciA9PSBtYl95X2FkZHIpICYmCiAJCQkJCQkoZW5jX2NfYWRkciA9PSBtYl9jX2FkZHIpKSB7CiAJCQkJbGlzdF9kZWwoJm1iX2VudHJ5LT5saXN0KTsKQEAgLTc4NSw4ICs3ODUsOCBAQAogCXN0cm5jcHkoY2FwLT5jYXJkLCBkZXYtPnBsYXRfZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSAtIDEpOwogCWNhcC0+YnVzX2luZm9bMF0gPSAwOwogCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDEsIDAsIDApOwotCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRQotCQkJICB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVAorCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkUKKwkJCSAgfCBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FCiAJCQkgIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCXJldHVybiAwOwogfQpAQCAtMTUwMSwyMCArMTUwMSwyMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGZtdC0+bnVtX3BsYW5lczsgaSsrKSB7Ci0JCWlmICghdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIGkpKSB7CisJCWlmICghdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIGkpKSB7CiAJCQltZmNfZXJyKCJmYWlsZWQgdG8gZ2V0IHBsYW5lIGNvb2tpZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQltZmNfZGVidWcoMiwgImluZGV4OiAlZCwgcGxhbmVbJWRdIGNvb2tpZTogMHglMDh6eCIsCiAJCQkJdmItPnY0bDJfYnVmLmluZGV4LCBpLAotCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCBpKSk7CisJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIGkpKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgczVwX21mY19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwKLQkJICAgICAgIHVuc2lnbmVkIGludCAqYnVmX2NvdW50LCB1bnNpZ25lZCBpbnQgKnBsYW5lX2NvdW50LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBwc2l6ZVtdLCB2b2lkICphbGxvY2F0b3JzW10pCisJCQljb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKKwkJCXVuc2lnbmVkIGludCAqYnVmX2NvdW50LCB1bnNpZ25lZCBpbnQgKnBsYW5lX2NvdW50LAorCQkJdW5zaWduZWQgaW50IHBzaXplW10sIHZvaWQgKmFsbG9jYXRvcnNbXSkKIHsKIAlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eCh2cS0+ZHJ2X3ByaXYpOwogCkBAIC0xNTg0LDcgKzE1ODUsNyBAQAogCQlpID0gdmItPnY0bDJfYnVmLmluZGV4OwogCQljdHgtPmRzdF9idWZzW2ldLmIgPSB2YjsKIAkJY3R4LT5kc3RfYnVmc1tpXS5jb29raWUuc3RyZWFtID0KLQkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDApOworCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7CiAJCWN0eC0+ZHN0X2J1ZnNfY250Kys7CiAJfSBlbHNlIGlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKIAkJcmV0ID0gY2hlY2tfdmJfd2l0aF9mbXQoY3R4LT5zcmNfZm10LCB2Yik7CkBAIC0xNTkzLDkgKzE1OTQsOSBAQAogCQlpID0gdmItPnY0bDJfYnVmLmluZGV4OwogCQljdHgtPnNyY19idWZzW2ldLmIgPSB2YjsKIAkJY3R4LT5zcmNfYnVmc1tpXS5jb29raWUucmF3Lmx1bWEgPQotCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCk7CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCAwKTsKIAkJY3R4LT5zcmNfYnVmc1tpXS5jb29raWUucmF3LmNocm9tYSA9Ci0JCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAxKTsKKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDEpOwogCQljdHgtPnNyY19idWZzX2NudCsrOwogCX0gZWxzZSB7CiAJCW1mY19lcnIoImluYXZsaWQgcXVldWUgdHlwZTogJWRcbiIsIHZxLT50eXBlKTsKQEAgLTE2NDAsNyArMTY0MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczVwX21mY19zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3N0YXRpYyBpbnQgczVwX21mY19zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHEtPmRydl9wcml2KTsKIAlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OwpAQCAtMTgxNCw3ICsxODE1LDcgQEAKIAkJCXJldHVybiBjdHgtPmN0cmxfaGFuZGxlci5lcnJvcjsKIAkJfQogCQlpZiAoY29udHJvbHNbaV0uaXNfdm9sYXRpbGUgJiYgY3R4LT5jdHJsc1tpXSkKLQkJCWN0eC0+Y3RybHNbaV0tPmlzX3ZvbGF0aWxlID0gMTsKKwkJCWN0eC0+Y3RybHNbaV0tPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX29wci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfb3ByLmMKaW5kZXggN2IyMzkxNi4uZTA4YjIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfb3ByLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfb3ByLmMKQEAgLTExMzUsNyArMTEzNSw3IEBACiAJdGVtcF92YiA9IGxpc3RfZW50cnkoY3R4LT5zcmNfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKIAl0ZW1wX3ZiLT51c2VkID0gMTsKIAlzNXBfbWZjX3NldF9kZWNfc3RyZWFtX2J1ZmZlcihjdHgsCi0JCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHRlbXBfdmItPmIsIDApLCBjdHgtPmNvbnN1bWVkX3N0cmVhbSwKKwkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodGVtcF92Yi0+YiwgMCksIGN0eC0+Y29uc3VtZWRfc3RyZWFtLAogCQkJCQl0ZW1wX3ZiLT5iLT52NGwyX3BsYW5lc1swXS5ieXRlc3VzZWQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOwogCWluZGV4ID0gdGVtcF92Yi0+Yi0+djRsMl9idWYuaW5kZXg7CkBAIC0xMTcyLDEyICsxMTcyLDEyIEBACiAJfQogCXNyY19tYiA9IGxpc3RfZW50cnkoY3R4LT5zcmNfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKIAlzcmNfbWItPnVzZWQgPSAxOwotCXNyY195X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihzcmNfbWItPmIsIDApOwotCXNyY19jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihzcmNfbWItPmIsIDEpOworCXNyY195X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihzcmNfbWItPmIsIDApOworCXNyY19jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihzcmNfbWItPmIsIDEpOwogCXM1cF9tZmNfc2V0X2VuY19mcmFtZV9idWZmZXIoY3R4LCBzcmNfeV9hZGRyLCBzcmNfY19hZGRyKTsKIAlkc3RfbWIgPSBsaXN0X2VudHJ5KGN0eC0+ZHN0X3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CiAJZHN0X21iLT51c2VkID0gMTsKLQlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKGRzdF9tYi0+YiwgMCk7CisJZHN0X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihkc3RfbWItPmIsIDApOwogCWRzdF9zaXplID0gdmIyX3BsYW5lX3NpemUoZHN0X21iLT5iLCAwKTsKIAlzNXBfbWZjX3NldF9lbmNfc3RyZWFtX2J1ZmZlcihjdHgsIGRzdF9hZGRyLCBkc3Rfc2l6ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CkBAIC0xMjAwLDcgKzEyMDAsNyBAQAogCXM1cF9tZmNfc2V0X2RlY19kZXNjX2J1ZmZlcihjdHgpOwogCW1mY19kZWJ1ZygyLCAiSGVhZGVyIHNpemU6ICVkXG4iLCB0ZW1wX3ZiLT5iLT52NGwyX3BsYW5lc1swXS5ieXRlc3VzZWQpOwogCXM1cF9tZmNfc2V0X2RlY19zdHJlYW1fYnVmZmVyKGN0eCwKLQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih0ZW1wX3ZiLT5iLCAwKSwKKwkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih0ZW1wX3ZiLT5iLCAwKSwKIAkJCQkwLCB0ZW1wX3ZiLT5iLT52NGwyX3BsYW5lc1swXS5ieXRlc3VzZWQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOwogCWRldi0+Y3Vycl9jdHggPSBjdHgtPm51bTsKQEAgLTEyMTksNyArMTIxOSw3IEBACiAJczVwX21mY19zZXRfZW5jX3JlZl9idWZmZXIoY3R4KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CiAJZHN0X21iID0gbGlzdF9lbnRyeShjdHgtPmRzdF9xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOwotCWRzdF9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoZHN0X21iLT5iLCAwKTsKKwlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKGRzdF9tYi0+YiwgMCk7CiAJZHN0X3NpemUgPSB2YjJfcGxhbmVfc2l6ZShkc3RfbWItPmIsIDApOwogCXM1cF9tZmNfc2V0X2VuY19zdHJlYW1fYnVmZmVyKGN0eCwgZHN0X2FkZHIsIGRzdF9zaXplKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKQEAgLTEyNTUsNyArMTI1NSw3IEBACiAJdGVtcF92YiA9IGxpc3RfZW50cnkoY3R4LT5zcmNfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKIAltZmNfZGVidWcoMiwgIkhlYWRlciBzaXplOiAlZFxuIiwgdGVtcF92Yi0+Yi0+djRsMl9wbGFuZXNbMF0uYnl0ZXN1c2VkKTsKIAlzNXBfbWZjX3NldF9kZWNfc3RyZWFtX2J1ZmZlcihjdHgsCi0JCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodGVtcF92Yi0+YiwgMCksCisJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodGVtcF92Yi0+YiwgMCksCiAJCQkJMCwgdGVtcF92Yi0+Yi0+djRsMl9wbGFuZXNbMF0uYnl0ZXN1c2VkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKIAlkZXYtPmN1cnJfY3R4ID0gY3R4LT5udW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvS2NvbmZpZwppbmRleCA5YzM3ZGVlLi5mMmEwOTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L0tjb25maWcKQEAgLTgsNyArOCw3IEBACiAKIGNvbmZpZyBWSURFT19TQU1TVU5HX1M1UF9UVgogCWJvb2wgIlNhbXN1bmcgVFYgZHJpdmVyIGZvciBTNVAgcGxhdGZvcm0gKGV4cGVyaW1lbnRhbCkiCi0JZGVwZW5kcyBvbiBQTEFUX1M1UAorCWRlcGVuZHMgb24gUExBVF9TNVAgJiYgUE1fUlVOVElNRQogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvaGRtaV9kcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L2hkbWlfZHJ2LmMKaW5kZXggMDZkNjY2My4uMDI3OWU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvaGRtaV9kcnYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9oZG1pX2Rydi5jCkBAIC0yMTAsMjAgKzIxMCwxNyBAQAogCS8qIGVuYWJsZSBIUEQgaW50ZXJydXB0cyAqLwogCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX0lOVENfQ09OLCB+MCwgSERNSV9JTlRDX0VOX0dMT0JBTCB8CiAJCUhETUlfSU5UQ19FTl9IUERfUExVRyB8IEhETUlfSU5UQ19FTl9IUERfVU5QTFVHKTsKLQkvKiBjaG9vc2UgSERNSSBtb2RlICovCisJLyogY2hvb3NlIERWSSBtb2RlICovCiAJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfTU9ERV9TRUwsCi0JCUhETUlfTU9ERV9IRE1JX0VOLCBIRE1JX01PREVfTUFTSyk7CisJCUhETUlfTU9ERV9EVklfRU4sIEhETUlfTU9ERV9NQVNLKTsKKwloZG1pX3dyaXRlX21hc2soaGRldiwgSERNSV9DT05fMiwgfjAsCisJCUhETUlfRFZJX1BFUkFNQkxFX0VOIHwgSERNSV9EVklfQkFORF9FTik7CiAJLyogZGlzYWJsZSBibHVlc2NyZWVuICovCiAJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfQ09OXzAsIDAsIEhETUlfQkxVRV9TQ1JfRU4pOwogCS8qIGNob29zZSBibHVlc2NyZWVuIChmZWNhbCkgY29sb3IgKi8KIAloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0JMVUVfU0NSRUVOXzAsIDB4MTIpOwogCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfQkxVRV9TQ1JFRU5fMSwgMHgzNCk7CiAJaGRtaV93cml0ZWIoaGRldiwgSERNSV9CTFVFX1NDUkVFTl8yLCAweDU2KTsKLQkvKiBlbmFibGUgQVZJIHBhY2tldCBldmVyeSB2c3luYywgZml4ZXMgcHVycGxlIGxpbmUgcHJvYmxlbSAqLwotCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfQVZJX0NPTiwgMHgwMik7Ci0JLyogZm9yY2UgWVVWNDQ0LCBsb29rIHRvIENFQS04NjEtRCwgdGFibGUgNyBmb3IgbW9yZSBkZXRhaWwgKi8KLQloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0FWSV9CWVRFKDApLCAyIDw8IDUpOwotCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX0NPTl8xLCAyLCAzIDw8IDUpOwogfQogCiBzdGF0aWMgdm9pZCBoZG1pX3RpbWluZ19hcHBseShzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYsCkBAIC00NDMsNiArNDQwLDcgQEAKIAkJLmhlaWdodCA9IDQ4MCwKIAkJLmNvZGUgPSBWNEwyX01CVVNfRk1UX0ZJWEVELCAvKiBtZWFucyBSR0I4ODggKi8KIAkJLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAogCX0sCiB9OwogCkBAIC00NzUsNiArNDczLDcgQEAKIAkJLmhlaWdodCA9IDcyMCwKIAkJLmNvZGUgPSBWNEwyX01CVVNfRk1UX0ZJWEVELCAvKiBtZWFucyBSR0I4ODggKi8KIAkJLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAogCX0sCiB9OwogCkBAIC01MDcsNiArNTA2LDcgQEAKIAkJLmhlaWdodCA9IDEwODAsCiAJCS5jb2RlID0gVjRMMl9NQlVTX0ZNVF9GSVhFRCwgLyogbWVhbnMgUkdCODg4ICovCiAJCS5maWVsZCA9IFY0TDJfRklFTERfTk9ORSwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKIAl9LAogfTsKIApAQCAtNTM5LDYgKzUzOSw3IEBACiAJCS5oZWlnaHQgPSAxMDgwLAogCQkuY29kZSA9IFY0TDJfTUJVU19GTVRfRklYRUQsIC8qIG1lYW5zIFJHQjg4OCAqLwogCQkuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkUsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlci5oCmluZGV4IGUyMjQyMjQuLjUxYWQ1OWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyLmgKQEAgLTExMSw4ICsxMTEsNiBAQAogZW51bSBteHJfbGF5ZXJfc3RhdGUgewogCS8qKiBsYXllcnMgaXMgbm90IHNob3duICovCiAJTVhSX0xBWUVSX0lETEUgPSAwLAotCS8qKiBzdGF0ZSBiZXR3ZWVuIFNUUkVBTU9OIGFuZCBoYXJkd2FyZSBzdGFydCAqLwotCU1YUl9MQVlFUl9TVFJFQU1JTkdfU1RBUlQsCiAJLyoqIGxheWVyIGlzIHNob3duICovCiAJTVhSX0xBWUVSX1NUUkVBTUlORywKIAkvKiogc3RhdGUgYmVmb3JlIFNUUkVBTU9GRiBpcyBmaW5pc2hlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfZ3JwX2xheWVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9ncnBfbGF5ZXIuYwppbmRleCA1OGYwYmE0Li5kZTgyNzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9ncnBfbGF5ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9ncnBfbGF5ZXIuYwpAQCAtODYsNyArODYsNyBAQAogCWRtYV9hZGRyX3QgYWRkciA9IDA7CiAKIAlpZiAoYnVmKQotCQlhZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoJmJ1Zi0+dmIsIDApOworCQlhZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoJmJ1Zi0+dmIsIDApOwogCW14cl9yZWdfZ3JhcGhfYnVmZmVyKGxheWVyLT5tZGV2LCBsYXllci0+aWR4LCBhZGRyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfcmVnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9yZWcuYwppbmRleCAzOGRhYzY3Li40ODAwYTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9yZWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9yZWcuYwpAQCAtOTAsNyArOTAsNyBAQAogCW14cl92c3luY19zZXRfdXBkYXRlKG1kZXYsIE1YUl9ESVNBQkxFKTsKIAogCS8qIHNldCBvdXRwdXQgaW4gUkdCODg4IG1vZGUgKi8KLQlteHJfd3JpdGUobWRldiwgTVhSX0NGRywgTVhSX0NGR19PVVRfWVVWNDQ0KTsKKwlteHJfd3JpdGUobWRldiwgTVhSX0NGRywgTVhSX0NGR19PVVRfUkdCODg4KTsKIAogCS8qIDE2IGJlYXQgYnVyc3QgaW4gRE1BICovCiAJbXhyX3dyaXRlX21hc2sobWRldiwgTVhSX1NUQVRVUywgTVhSX1NUQVRVU18xNl9CVVJTVCwKQEAgLTM3Niw2ICszNzYsMTIgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7CiAJbXhyX3ZzeW5jX3NldF91cGRhdGUobWRldiwgTVhSX0RJU0FCTEUpOwogCisJLyogc2VsZWN0aW5nIGNvbG9yc3BhY2UgYWNjZXB0ZWQgYnkgb3V0cHV0ICovCisJaWYgKGZtdC0+Y29sb3JzcGFjZSA9PSBWNEwyX0NPTE9SU1BBQ0VfSlBFRykKKwkJdmFsIHw9IE1YUl9DRkdfT1VUX1lVVjQ0NDsKKwllbHNlCisJCXZhbCB8PSBNWFJfQ0ZHX09VVF9SR0I4ODg7CisKIAkvKiBjaG9vc2luZyBiZXR3ZWVuIGludGVybGFjZSBhbmQgcHJvZ3Jlc3NpdmUgbW9kZSAqLwogCWlmIChmbXQtPmZpZWxkID09IFY0TDJfRklFTERfSU5URVJMQUNFRCkKIAkJdmFsIHw9IE1YUl9DRkdfU0NBTl9JTlRFUkxBQ0U7CkBAIC0zOTQsNyArNDAwLDggQEAKIAllbHNlCiAJCVdBUk4oMSwgInVucmVjb2duaXplZCBtYnVzIGhlaWdodCAldSFcbiIsIGZtdC0+aGVpZ2h0KTsKIAotCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9DRkcsIHZhbCwgTVhSX0NGR19TQ0FOX01BU0spOworCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9DRkcsIHZhbCwgTVhSX0NGR19TQ0FOX01BU0sgfAorCQlNWFJfQ0ZHX09VVF9NQVNLKTsKIAogCXZhbCA9IChmbXQtPmZpZWxkID09IFY0TDJfRklFTERfSU5URVJMQUNFRCkgPyB+MCA6IDA7CiAJdnBfd3JpdGVfbWFzayhtZGV2LCBWUF9NT0RFLCB2YWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdmlkZW8uYwppbmRleCA0M2FjMjJmLi5lMTZkM2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZpZGVvLmMKQEAgLTcyNyw4ICs3MjcsOCBAQAogCS51bmxvY2tlZF9pb2N0bCA9IHZpZGVvX2lvY3RsMiwKIH07CiAKLXN0YXRpYyBpbnQgcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsCi0JdW5zaWduZWQgaW50ICpucGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCitzdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQsCisJdW5zaWduZWQgaW50ICpuYnVmZmVycywgdW5zaWduZWQgaW50ICpucGxhbmVzLCB1bnNpZ25lZCBpbnQgc2l6ZXNbXSwKIAl2b2lkICphbGxvY19jdHhzW10pCiB7CiAJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKQEAgLTc2NCwxOSArNzY0LDEwIEBACiAJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOwogCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbXVzdF9zdGFydCA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOwotCWlmIChsYXllci0+c3RhdGUgPT0gTVhSX0xBWUVSX1NUUkVBTUlOR19TVEFSVCkgewotCQlsYXllci0+c3RhdGUgPSBNWFJfTEFZRVJfU1RSRUFNSU5HOwotCQltdXN0X3N0YXJ0ID0gMTsKLQl9CiAJbGlzdF9hZGRfdGFpbCgmYnVmZmVyLT5saXN0LCAmbGF5ZXItPmVucV9saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7Ci0JaWYgKG11c3Rfc3RhcnQpIHsKLQkJbGF5ZXItPm9wcy5zdHJlYW1fc2V0KGxheWVyLCBNWFJfRU5BQkxFKTsKLQkJbXhyX3N0cmVhbWVyX2dldChtZGV2KTsKLQl9CiAKIAlteHJfZGJnKG1kZXYsICJxdWV1aW5nIGJ1ZmZlclxuIik7CiB9CkBAIC03OTcsMTMgKzc4OCwxOSBAQAogCW11dGV4X3VubG9jaygmbGF5ZXItPm11dGV4KTsKIH0KIAotc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCitzdGF0aWMgaW50IHN0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CiAJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbXhyX2RiZyhtZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChjb3VudCA9PSAwKSB7CisJCW14cl9kYmcobWRldiwgIm5vIG91dHB1dCBidWZmZXJzIHF1ZXVlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIGJsb2NrIGFueSBjaGFuZ2VzIGluIG91dHB1dCBjb25maWd1cmF0aW9uICovCiAJbXhyX291dHB1dF9nZXQobWRldik7CiAKQEAgLTgxNCw5ICs4MTEsMTIgQEAKIAlsYXllci0+b3BzLmZvcm1hdF9zZXQobGF5ZXIpOwogCS8qIGVuYWJsaW5nIGxheWVyIGluIGhhcmR3YXJlICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxheWVyLT5lbnFfc2xvY2ssIGZsYWdzKTsKLQlsYXllci0+c3RhdGUgPSBNWFJfTEFZRVJfU1RSRUFNSU5HX1NUQVJUOworCWxheWVyLT5zdGF0ZSA9IE1YUl9MQVlFUl9TVFJFQU1JTkc7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOwogCisJbGF5ZXItPm9wcy5zdHJlYW1fc2V0KGxheWVyLCBNWFJfRU5BQkxFKTsKKwlteHJfc3RyZWFtZXJfZ2V0KG1kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZwX2xheWVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92cF9sYXllci5jCmluZGV4IDY5NTBlZDguLmYzYmIyZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZwX2xheWVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdnBfbGF5ZXIuYwpAQCAtOTcsOSArOTcsOSBAQAogCQlteHJfcmVnX3ZwX2J1ZmZlcihsYXllci0+bWRldiwgbHVtYV9hZGRyLCBjaHJvbWFfYWRkcik7CiAJCXJldHVybjsKIAl9Ci0JbHVtYV9hZGRyWzBdID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoJmJ1Zi0+dmIsIDApOworCWx1bWFfYWRkclswXSA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKCZidWYtPnZiLCAwKTsKIAlpZiAobGF5ZXItPmZtdC0+bnVtX3N1YmZyYW1lcyA9PSAyKSB7Ci0JCWNocm9tYV9hZGRyWzBdID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoJmJ1Zi0+dmIsIDEpOworCQljaHJvbWFfYWRkclswXSA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKCZidWYtPnZiLCAxKTsKIAl9IGVsc2UgewogCQkvKiBGSVhNRTogbXhyX2dldF9wbGFuZV9zaXplIGNvbXB1dGUgaW50ZWdlciBkaXZpc2lvbiwKIAkJICogd2hpY2ggaXMgc2xvdyBhbmQgc2hvdWxkIG5vdCBiZSBwZXJmb3JtZWQgaW4gaW50ZXJydXB0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLWhkbWkuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3MtaGRtaS5oCmluZGV4IGFjOTNhZDYuLjMzMjQ3ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3MtaGRtaS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3MtaGRtaS5oCkBAIC0xMjcsNiArMTI3LDEwIEBACiAjZGVmaW5lIEhETUlfQkxVRV9TQ1JfRU4JCSgxIDw8IDUpCiAjZGVmaW5lIEhETUlfRU4JCQkJKDEgPDwgMCkKIAorLyogSERNSV9DT05fMiAqLworI2RlZmluZSBIRE1JX0RWSV9QRVJBTUJMRV9FTgkJKDEgPDwgNSkKKyNkZWZpbmUgSERNSV9EVklfQkFORF9FTgkJKDEgPDwgMSkKKwogLyogSERNSV9QSFlfU1RBVFVTICovCiAjZGVmaW5lIEhETUlfUEhZX1NUQVRVU19SRUFEWQkJKDEgPDwgMCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1taXhlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1taXhlci5oCmluZGV4IDNjODQ0MjYuLjE1OGFiYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3MtbWl4ZXIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLW1peGVyLmgKQEAgLTY3LDYgKzY3LDcgQEAKIC8qIGJpdHMgZm9yIE1YUl9DRkcgKi8KICNkZWZpbmUgTVhSX0NGR19PVVRfWVVWNDQ0CQkoMCA8PCA4KQogI2RlZmluZSBNWFJfQ0ZHX09VVF9SR0I4ODgJCSgxIDw8IDgpCisjZGVmaW5lIE1YUl9DRkdfT1VUX01BU0sJCSgxIDw8IDgpCiAjZGVmaW5lIE1YUl9DRkdfRFNUX1NETwkJCSgwIDw8IDcpCiAjZGVmaW5lIE1YUl9DRkdfRFNUX0hETUkJCSgxIDw8IDcpCiAjZGVmaW5lIE1YUl9DRkdfRFNUX01BU0sJCSgxIDw8IDcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9zZG9fZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9zZG9fZHJ2LmMKaW5kZXggNGRkZGQ2Yi4uOGNlYzY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvc2RvX2Rydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3Nkb19kcnYuYwpAQCAtMTcwLDYgKzE3MCw3IEBACiAJZm10LT5oZWlnaHQgPSBzZGV2LT5mbXQtPmhlaWdodDsKIAlmbXQtPmNvZGUgPSBWNEwyX01CVVNfRk1UX0ZJWEVEOwogCWZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJZm10LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKaW5kZXggZjJhZTQwNS4uNWNmZGJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKQEAgLTc5Myw3ICs3OTMsNiBAQAogCQkJc2FhNzExeF93cml0ZShzZCwgUl8wRl9DSFJPTUFfR0FJTl9DTlRMLCBzdGF0ZS0+Z2Fpbi0+dmFsKTsKIAkJZWxzZQogCQkJc2FhNzExeF93cml0ZShzZCwgUl8wRl9DSFJPTUFfR0FJTl9DTlRMLCBzdGF0ZS0+Z2Fpbi0+dmFsIHwgMHg4MCk7Ci0JCXY0bDJfY3RybF9hY3RpdmF0ZShzdGF0ZS0+Z2FpbiwgIXN0YXRlLT5hZ2MtPnZhbCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTEzNDUsMzUgKzEzNDQsNTcgQEAKIHN0YXRpYyBpbnQgc2FhNzExeF9xdWVyeXN0ZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCAqc3RkKQogewogCXN0cnVjdCBzYWE3MTF4X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKLQlpbnQgcmVnMWU7CisJaW50IHJlZzFmLCByZWcxZTsKIAotCSpzdGQgPSBWNEwyX1NURF9BTEw7Ci0JaWYgKHN0YXRlLT5pZGVudCAhPSBWNEwyX0lERU5UX1NBQTcxMTUpIHsKLQkJaW50IHJlZzFmID0gc2FhNzExeF9yZWFkKHNkLCBSXzFGX1NUQVRVU19CWVRFXzJfVkRfREVDKTsKKwkvKgorCSAqIFRoZSBWNEwyIGNvcmUgYWxyZWFkeSBpbml0aWFsaXplcyBzdGQgd2l0aCBhbGwgc3VwcG9ydGVkCisJICogU3RhbmRhcmRzLiBBbGwgZHJpdmVyIG5lZWRzIHRvIGRvIGlzIHRvIG1hc2sgaXQsIHRvIHJlbW92ZQorCSAqIHN0YW5kYXJkcyB0aGF0IGRvbid0IGFwcGx5IGZyb20gdGhlIG1hc2sKKwkgKi8KIAotCQlpZiAocmVnMWYgJiAweDIwKQotCQkJKnN0ZCA9IFY0TDJfU1REXzUyNV82MDsKLQkJZWxzZQotCQkJKnN0ZCA9IFY0TDJfU1REXzYyNV81MDsKKwlyZWcxZiA9IHNhYTcxMXhfcmVhZChzZCwgUl8xRl9TVEFUVVNfQllURV8yX1ZEX0RFQyk7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiU3RhdHVzIGJ5dGUgMiAoMHgxZik9MHglMDJ4XG4iLCByZWcxZik7CiAKLQkJcmV0dXJuIDA7Ci0JfQorCS8qIGhvcml6b250YWwvdmVydGljYWwgbm90IGxvY2tlZCAqLworCWlmIChyZWcxZiAmIDB4NDApCisJCWdvdG8gcmV0OworCisJaWYgKHJlZzFmICYgMHgyMCkKKwkJKnN0ZCAmPSBWNEwyX1NURF81MjVfNjA7CisJZWxzZQorCQkqc3RkICY9IFY0TDJfU1REXzYyNV81MDsKKworCWlmIChzdGF0ZS0+aWRlbnQgIT0gVjRMMl9JREVOVF9TQUE3MTE1KQorCQlnb3RvIHJldDsKIAogCXJlZzFlID0gc2FhNzExeF9yZWFkKHNkLCBSXzFFX1NUQVRVU19CWVRFXzFfVkRfREVDKTsKIAogCXN3aXRjaCAocmVnMWUgJiAweDAzKSB7CiAJY2FzZSAxOgotCQkqc3RkID0gVjRMMl9TVERfTlRTQzsKKwkJKnN0ZCAmPSBWNEwyX1NURF9OVFNDOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCSpzdGQgPSBWNEwyX1NURF9QQUw7CisJCS8qCisJCSAqIFY0TDJfU1REX1BBTCBqdXN0IGNvdmVyIHRoZSBldXJvcGVhbiBQQUwgc3RhbmRhcmRzLgorCQkgKiBUaGlzIGlzIHdyb25nLCBhcyB0aGUgZGV2aWNlIGNvdWxkIGFsc28gYmUgdXNpbmcgYW4KKwkJICogb3RoZXIgUEFMIHN0YW5kYXJkLgorCQkgKi8KKwkJKnN0ZCAmPSBWNEwyX1NURF9QQUwgICB8IFY0TDJfU1REX1BBTF9OICB8IFY0TDJfU1REX1BBTF9OYyB8CisJCQlWNEwyX1NURF9QQUxfTSB8IFY0TDJfU1REX1BBTF82MDsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQkqc3RkID0gVjRMMl9TVERfU0VDQU07CisJCSpzdGQgJj0gVjRMMl9TVERfU0VDQU07CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCS8qIENhbid0IGRldGVjdCBhbnl0aGluZyAqLwogCQlicmVhazsKIAl9CisKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJTdGF0dXMgYnl0ZSAxICgweDFlKT0weCUwMnhcbiIsIHJlZzFlKTsKKworcmV0OgorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImRldGVjdGVkIHN0ZCBtYXNrID0gJTA4THhcbiIsICpzdGQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MDEsNyArMTYyMiw2IEBACiAJCQlWNEwyX0NJRF9DSFJPTUFfQUdDLCAwLCAxLCAxLCAxKTsKIAlzdGF0ZS0+Z2FpbiA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnNhYTcxMXhfY3RybF9vcHMsCiAJCQlWNEwyX0NJRF9DSFJPTUFfR0FJTiwgMCwgMTI3LCAxLCA0MCk7Ci0Jc3RhdGUtPmdhaW4tPmlzX3ZvbGF0aWxlID0gMTsKIAlzZC0+Y3RybF9oYW5kbGVyID0gaGRsOwogCWlmIChoZGwtPmVycm9yKSB7CiAJCWludCBlcnIgPSBoZGwtPmVycm9yOwpAQCAtMTYxMCw4ICsxNjMwLDcgQEAKIAkJa2ZyZWUoc3RhdGUpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlzdGF0ZS0+YWdjLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19VUERBVEU7Ci0JdjRsMl9jdHJsX2NsdXN0ZXIoMiwgJnN0YXRlLT5hZ2MpOworCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMiwgJnN0YXRlLT5hZ2MsIDAsIHRydWUpOwogCiAJc3RhdGUtPmlucHV0ID0gLTE7CiAJc3RhdGUtPm91dHB1dCA9IFNBQTcxMTVfSVBPUlRfT047CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvTWFrZWZpbGUKaW5kZXggOGE1ZmY0ZC4uYTY0NmNjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9NYWtlZmlsZQpAQCAtMTAsNyArMTAsNyBAQAogCiBvYmotJChDT05GSUdfVklERU9fU0FBNzEzNF9EVkIpICs9IHNhYTcxMzQtZHZiLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCmluZGV4IGJjOGQ2YmIuLjliNTUwNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaApAQCAtODQzLDEwICs4NDMsMTAgQEAKIGludCBzYWE3MTM0X2lyX3N0YXJ0KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKIHZvaWQgc2FhNzEzNF9pcl9zdG9wKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKICNlbHNlCi0jZGVmaW5lIHNhYTcxMzRfaW5wdXRfaW5pdDEoZGV2KQkoMCkKLSNkZWZpbmUgc2FhNzEzNF9pbnB1dF9maW5pKGRldikJCSgwKQotI2RlZmluZSBzYWE3MTM0X2lucHV0X2lycShkZXYpCQkoMCkKLSNkZWZpbmUgc2FhNzEzNF9wcm9iZV9pMmNfaXIoZGV2KQkoMCkKLSNkZWZpbmUgc2FhNzEzNF9pcl9zdGFydChkZXYpCQkoMCkKLSNkZWZpbmUgc2FhNzEzNF9pcl9zdG9wKGRldikJCSgwKQorI2RlZmluZSBzYWE3MTM0X2lucHV0X2luaXQxKGRldikJKCh2b2lkKTApCisjZGVmaW5lIHNhYTcxMzRfaW5wdXRfZmluaShkZXYpCQkoKHZvaWQpMCkKKyNkZWZpbmUgc2FhNzEzNF9pbnB1dF9pcnEoZGV2KQkJKCh2b2lkKTApCisjZGVmaW5lIHNhYTcxMzRfcHJvYmVfaTJjX2lyKGRldikJKCh2b2lkKTApCisjZGVmaW5lIHNhYTcxMzRfaXJfc3RhcnQoZGV2KQkJKCh2b2lkKTApCisjZGVmaW5lIHNhYTcxMzRfaXJfc3RvcChkZXYpCQkoKHZvaWQpMCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L01ha2VmaWxlCmluZGV4IDYzMDNhOGUuLmVjZDU4MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvTWFrZWZpbGUKQEAgLTQsOSArNCw5IEBACiAKIG9iai0kKENPTkZJR19WSURFT19TQUE3MTY0KSArPSBzYWE3MTY0Lm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKIAotRVhUUkFfQ0ZMQUdTICs9ICQoZXh0cmEtY2ZsYWdzLXkpICQoZXh0cmEtY2ZsYWdzLW0pCitjY2ZsYWdzLXkgKz0gJChleHRyYS1jZmxhZ3MteSkgJChleHRyYS1jZmxhZ3MtbSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1jYXJkcy5jCmluZGV4IDY5ODIyYTQuLjk3MTU5MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtY2FyZHMuYwpAQCAtMjAzLDYgKzIwMyw2NiBAQAogCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCiAJCX0gfSwKIAl9LAorCVtTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzRdID0geworCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWLUhWUjIyMDAiLAorCQkucG9ydGEJCT0gU0FBNzE2NF9NUEVHX0RWQiwKKwkJLnBvcnRiCQk9IFNBQTcxNjRfTVBFR19EVkIsCisJCS5wb3J0YwkJPSBTQUE3MTY0X01QRUdfRU5DT0RFUiwKKwkJLnBvcnRkCQk9IFNBQTcxNjRfTVBFR19FTkNPREVSLAorCQkucG9ydGUJCT0gU0FBNzE2NF9NUEVHX1ZCSSwKKwkJLnBvcnRmCQk9IFNBQTcxNjRfTVBFR19WQkksCisJCS5jaGlwcmV2CT0gU0FBNzE2NF9DSElQX1JFVjMsCisJCS51bml0CQk9IHt7CisJCQkuaWQJCT0gMHgxZCwKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9FRVBST00sCisJCQkubmFtZQkJPSAiNEsgRUVQUk9NIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzAsCisJCQkuaTJjX2J1c19hZGRyCT0gMHhhMCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDA0LAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX1RVTkVSLAorCQkJLm5hbWUJCT0gIlREQTE4MjcxLTEiLAorCQkJLmkyY19idXNfbnIJPSBTQUE3MTY0X0kyQ19CVVNfMSwKKwkJCS5pMmNfYnVzX2FkZHIJPSAweGMwID4+IDEsCisJCQkuaTJjX3JlZ19sZW4JPSBSRUdMRU5fOGJpdCwKKwkJfSwgeworCQkJLmlkCQk9IDB4MDUsCisJCQkudHlwZQkJPSBTQUE3MTY0X1VOSVRfQU5BTE9HX0RFTU9EVUxBVE9SLAorCQkJLm5hbWUJCT0gIlREQTgyOTAtMSIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18xLAorCQkJLmkyY19idXNfYWRkcgk9IDB4ODQgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9LCB7CisJCQkuaWQJCT0gMHgxYiwKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9UVU5FUiwKKwkJCS5uYW1lCQk9ICJUREExODI3MS0yIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzIsCisJCQkuaTJjX2J1c19hZGRyCT0gMHhjMCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDFjLAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX0FOQUxPR19ERU1PRFVMQVRPUiwKKwkJCS5uYW1lCQk9ICJUREE4MjkwLTIiLAorCQkJLmkyY19idXNfbnIJPSBTQUE3MTY0X0kyQ19CVVNfMiwKKwkJCS5pMmNfYnVzX2FkZHIJPSAweDg0ID4+IDEsCisJCQkuaTJjX3JlZ19sZW4JPSBSRUdMRU5fOGJpdCwKKwkJfSwgeworCQkJLmlkCQk9IDB4MWUsCisJCQkudHlwZQkJPSBTQUE3MTY0X1VOSVRfRElHSVRBTF9ERU1PRFVMQVRPUiwKKwkJCS5uYW1lCQk9ICJUREExMDA0OC0xIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzEsCisJCQkuaTJjX2J1c19hZGRyCT0gMHgxMCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDFmLAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX0RJR0lUQUxfREVNT0RVTEFUT1IsCisJCQkubmFtZQkJPSAiVERBMTAwNDgtMiIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18yLAorCQkJLmkyY19idXNfYWRkcgk9IDB4MTIgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9IH0sCisJfSwKIAlbU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjI1MF0gPSB7CiAJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luVFYtSFZSMjI1MCIsCiAJCS5wb3J0YQkJPSBTQUE3MTY0X01QRUdfRFZCLApAQCAtMzg3LDYgKzQ0Nyw2MiBAQAogCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCiAJCX0gfSwKIAl9LAorCVtTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzVdID0geworCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWLUhWUjIyMDAiLAorCQkucG9ydGEJCT0gU0FBNzE2NF9NUEVHX0RWQiwKKwkJLnBvcnRiCQk9IFNBQTcxNjRfTVBFR19EVkIsCisJCS5jaGlwcmV2CT0gU0FBNzE2NF9DSElQX1JFVjMsCisJCS51bml0CQk9IHt7CisJCQkuaWQJCT0gMHgyMywKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9FRVBST00sCisJCQkubmFtZQkJPSAiNEsgRUVQUk9NIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzAsCisJCQkuaTJjX2J1c19hZGRyCT0gMHhhMCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDA0LAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX1RVTkVSLAorCQkJLm5hbWUJCT0gIlREQTE4MjcxLTEiLAorCQkJLmkyY19idXNfbnIJPSBTQUE3MTY0X0kyQ19CVVNfMSwKKwkJCS5pMmNfYnVzX2FkZHIJPSAweGMwID4+IDEsCisJCQkuaTJjX3JlZ19sZW4JPSBSRUdMRU5fOGJpdCwKKwkJfSwgeworCQkJLmlkCQk9IDB4MDUsCisJCQkudHlwZQkJPSBTQUE3MTY0X1VOSVRfQU5BTE9HX0RFTU9EVUxBVE9SLAorCQkJLm5hbWUJCT0gIlREQTgyOTAtMSIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18xLAorCQkJLmkyY19idXNfYWRkcgk9IDB4ODQgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9LCB7CisJCQkuaWQJCT0gMHgyMSwKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9UVU5FUiwKKwkJCS5uYW1lCQk9ICJUREExODI3MS0yIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzIsCisJCQkuaTJjX2J1c19hZGRyCT0gMHhjMCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDIyLAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX0FOQUxPR19ERU1PRFVMQVRPUiwKKwkJCS5uYW1lCQk9ICJUREE4MjkwLTIiLAorCQkJLmkyY19idXNfbnIJPSBTQUE3MTY0X0kyQ19CVVNfMiwKKwkJCS5pMmNfYnVzX2FkZHIJPSAweDg0ID4+IDEsCisJCQkuaTJjX3JlZ19sZW4JPSBSRUdMRU5fOGJpdCwKKwkJfSwgeworCQkJLmlkCQk9IDB4MjQsCisJCQkudHlwZQkJPSBTQUE3MTY0X1VOSVRfRElHSVRBTF9ERU1PRFVMQVRPUiwKKwkJCS5uYW1lCQk9ICJUREExMDA0OC0xIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzEsCisJCQkuaTJjX2J1c19hZGRyCT0gMHgxMCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDI1LAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX0RJR0lUQUxfREVNT0RVTEFUT1IsCisJCQkubmFtZQkJPSAiVERBMTAwNDgtMiIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18yLAorCQkJLmkyY19idXNfYWRkcgk9IDB4MTIgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9IH0sCisJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgc2FhNzE2NF9iY291bnQgPSBBUlJBWV9TSVpFKHNhYTcxNjRfYm9hcmRzKTsKIApAQCAtNDI2LDYgKzU0MiwxNCBAQAogCQkuc3VidmVuZG9yID0gMHgwMDcwLAogCQkuc3ViZGV2aWNlID0gMHg4ODUxLAogCQkuY2FyZCAgICAgID0gU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjI1MF8yLAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4ODk0MCwKKwkJLmNhcmQgICAgICA9IFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfNCwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDg5NTMsCisJCS5jYXJkICAgICAgPSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzUsCiAJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgc2FhNzE2NF9pZGNvdW50ID0gQVJSQVlfU0laRShzYWE3MTY0X3N1Ymlkcyk7CkBAIC00NjksNiArNTkzLDggQEAKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDA6CiAJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzI6CiAJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzM6CisJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzQ6CisJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzU6CiAJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjUwOgogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjI1MF8yOgogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjI1MF8zOgpAQCAtNTQ5LDYgKzY3NSw4IEBACiAJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwOgogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF8yOgogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF8zOgorCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF80OgorCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF81OgogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjI1MDoKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyNTBfMjoKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyNTBfMzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtZHZiLmMKaW5kZXggZjY1ZWFiNi4uNWM1Y2MzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtZHZiLmMKQEAgLTQ3NSw2ICs0NzUsOCBAQAogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMDoKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfMjoKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfMzoKKwljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfNDoKKwljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfNToKIAkJaTJjX2J1cyA9ICZkZXYtPmkyY19idXNbcG9ydC0+bnIgKyAxXTsKIAkJc3dpdGNoIChwb3J0LT5ucikgewogCQljYXNlIDA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQuaAppbmRleCA2Njc4YmYxLi43NDJiMzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LmgKQEAgLTgyLDYgKzgyLDggQEAKICNkZWZpbmUgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF8zCTYKICNkZWZpbmUgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjI1MF8yCTcKICNkZWZpbmUgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjI1MF8zCTgKKyNkZWZpbmUgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF80CTkKKyNkZWZpbmUgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF81CTEwCiAKICNkZWZpbmUgU0FBNzE2NF9NQVhfVU5JVFMJCTgKICNkZWZpbmUgU0FBNzE2NF9UU19OVU1CRVJfT0ZfTElORVMJMzEyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKaW5kZXggZTU0MDg5OC4uZjM5MDY4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYwpAQCAtOTAsNyArOTAsNiBAQAogc3RydWN0IHNoX21vYmlsZV9jZXVfYnVmZmVyIHsKIAlzdHJ1Y3QgdmIyX2J1ZmZlciB2YjsgLyogdjRsIGJ1ZmZlciBtdXN0IGJlIGZpcnN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKLQllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZTsKIH07CiAKIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiB7CkBAIC0xMDAsNyArOTksOCBAQAogCiAJdW5zaWduZWQgaW50IGlycTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7Ci0JdW5zaWduZWQgbG9uZyB2aWRlb19saW1pdDsKKwlzaXplX3QgdmlkZW9fbGltaXQ7CisJc2l6ZV90IGJ1Zl90b3RhbDsKIAogCXNwaW5sb2NrX3QgbG9jazsJCS8qIFByb3RlY3RzIHZpZGVvIGJ1ZmZlciBsaXN0cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgY2FwdHVyZTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogfTsKIAogc3RydWN0IHNoX21vYmlsZV9jZXVfY2FtIHsKLQkvKiBDRVUgb2Zmc2V0cyB3aXRoaW4gc2NhbGVkIGJ5IHRoZSBDRVUgY2FtZXJhIG91dHB1dCAqLworCS8qIENFVSBvZmZzZXRzIHdpdGhpbiB0aGUgY2FtZXJhIG91dHB1dCwgYmVmb3JlIHRoZSBDRVUgc2NhbGVyICovCiAJdW5zaWduZWQgaW50IGNldV9sZWZ0OwogCXVuc2lnbmVkIGludCBjZXVfdG9wOwogCS8qIENsaWVudCBvdXRwdXQsIGFzIHNlZW4gYnkgdGhlIENFVSAqLwpAQCAtMTQ0LDMwICsxNDQsNiBAQAogCXJldHVybiBjb250YWluZXJfb2YodmIsIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2J1ZmZlciwgdmIpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYWtlX2J1c19wYXJhbShzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlmbGFncyA9IFNPQ0FNX01BU1RFUiB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0g7Ci0KLQlpZiAocGNkZXYtPnBkYXRhLT5mbGFncyAmIFNIX0NFVV9GTEFHX1VTRV84QklUX0JVUykKLQkJZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzg7Ci0KLQlpZiAocGNkZXYtPnBkYXRhLT5mbGFncyAmIFNIX0NFVV9GTEFHX1VTRV8xNkJJVF9CVVMpCi0JCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF8xNjsKLQotCWlmIChmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF9NQVNLKQotCQlyZXR1cm4gZmxhZ3M7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgY2V1X3dyaXRlKHN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcHJpdiwKIAkJICAgICAgdW5zaWduZWQgbG9uZyByZWdfb2ZmcywgdTMyIGRhdGEpCiB7CkBAIC0yMTYsMzQgKzE5Miw2MiBAQAogLyoKICAqICBWaWRlb2J1ZiBvcGVyYXRpb25zCiAgKi8KKworLyoKKyAqIC5xdWV1ZV9zZXR1cCgpIGlzIGNhbGxlZCB0byBjaGVjaywgd2hldGhlciB0aGUgZHJpdmVyIGNhbiBhY2NlcHQgdGhlCisgKgkJICByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ1ZmZlcnMgYW5kIHRvIGZpbGwgaW4gcGxhbmUgc2l6ZXMKKyAqCQkgIGZvciB0aGUgY3VycmVudCBmcmFtZSBmb3JtYXQgaWYgcmVxdWlyZWQKKyAqLwogc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3ZpZGVvYnVmX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLAorCQkJY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCiAJCQl1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsCi0JCQl1bnNpZ25lZCBsb25nIHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKKwkJCXVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY19jdHhzW10pCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjb250YWluZXJfb2YodnEsIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSwgdmIyX3ZpZHEpOwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCi0JCQkJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7CisJaW50IGJ5dGVzX3Blcl9saW5lOworCXVuc2lnbmVkIGludCBoZWlnaHQ7CiAKKwlpZiAoZm10KSB7CisJCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsCisJCQkJCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJCWlmICgheGxhdGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShmbXQtPmZtdC5waXgud2lkdGgsCisJCQkJCQkJIHhsYXRlLT5ob3N0X2ZtdCk7CisJCWhlaWdodCA9IGZtdC0+Zm10LnBpeC5oZWlnaHQ7CisJfSBlbHNlIHsKKwkJLyogQ2FsbGVkIGZyb20gVklESU9DX1JFUUJVRlMgb3IgaW4gY29tcGF0aWJpbGl0eSBtb2RlICovCisJCWJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAorCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOworCQloZWlnaHQgPSBpY2QtPnVzZXJfaGVpZ2h0OworCX0KIAlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQogCQlyZXR1cm4gYnl0ZXNfcGVyX2xpbmU7CiAKLQkqbnVtX3BsYW5lcyA9IDE7CisJc2l6ZXNbMF0gPSBieXRlc19wZXJfbGluZSAqIGhlaWdodDsKIAotCXBjZGV2LT5zZXF1ZW5jZSA9IDA7Ci0Jc2l6ZXNbMF0gPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7CiAJYWxsb2NfY3R4c1swXSA9IHBjZGV2LT5hbGxvY19jdHg7CiAKKwlpZiAoIXZxLT5udW1fYnVmZmVycykKKwkJcGNkZXYtPnNlcXVlbmNlID0gMDsKKwogCWlmICghKmNvdW50KQogCQkqY291bnQgPSAyOwogCi0JaWYgKHBjZGV2LT52aWRlb19saW1pdCkgewotCQlpZiAoUEFHRV9BTElHTihzaXplc1swXSkgKiAqY291bnQgPiBwY2Rldi0+dmlkZW9fbGltaXQpCi0JCQkqY291bnQgPSBwY2Rldi0+dmlkZW9fbGltaXQgLyBQQUdFX0FMSUdOKHNpemVzWzBdKTsKKwkvKiBJZiAqbnVtX3BsYW5lcyAhPSAwLCB3ZSBoYXZlIGFscmVhZHkgdmVyaWZpZWQgKmNvdW50LiAqLworCWlmIChwY2Rldi0+dmlkZW9fbGltaXQgJiYgISpudW1fcGxhbmVzKSB7CisJCXNpemVfdCBzaXplID0gUEFHRV9BTElHTihzaXplc1swXSkgKiAqY291bnQ7CisKKwkJaWYgKHNpemUgKyBwY2Rldi0+YnVmX3RvdGFsID4gcGNkZXYtPnZpZGVvX2xpbWl0KQorCQkJKmNvdW50ID0gKHBjZGV2LT52aWRlb19saW1pdCAtIHBjZGV2LT5idWZfdG90YWwpIC8KKwkJCQlQQUdFX0FMSUdOKHNpemVzWzBdKTsKIAl9CiAKLQlkZXZfZGJnKGljZC0+cGFyZW50LCAiY291bnQ9JWQsIHNpemU9JWx1XG4iLCAqY291bnQsIHNpemVzWzBdKTsKKwkqbnVtX3BsYW5lcyA9IDE7CisKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiY291bnQ9JWQsIHNpemU9JXVcbiIsICpjb3VudCwgc2l6ZXNbMF0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjcsNiArMjcxLDcgQEAKIAl1bnNpZ25lZCBsb25nIHRvcDEsIHRvcDI7CiAJdW5zaWduZWQgbG9uZyBib3R0b20xLCBib3R0b20yOwogCXUzMiBzdGF0dXM7CisJYm9vbCBwbGFuYXI7CiAJaW50IHJldCA9IDA7CiAKIAkvKgpAQCAtMzEyLDE5ICszMTcsMzEgQEAKIAkJYm90dG9tMgk9IENEQkNSOwogCX0KIAotCXBoeXNfYWRkcl90b3AgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihwY2Rldi0+YWN0aXZlLCAwKTsKLQotCWNldV93cml0ZShwY2RldiwgdG9wMSwgcGh5c19hZGRyX3RvcCk7Ci0JaWYgKFY0TDJfRklFTERfTk9ORSAhPSBwY2Rldi0+ZmllbGQpIHsKLQkJcGh5c19hZGRyX2JvdHRvbSA9IHBoeXNfYWRkcl90b3AgKyBpY2QtPnVzZXJfd2lkdGg7Ci0JCWNldV93cml0ZShwY2RldiwgYm90dG9tMSwgcGh5c19hZGRyX2JvdHRvbSk7Ci0JfQorCXBoeXNfYWRkcl90b3AgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihwY2Rldi0+YWN0aXZlLCAwKTsKIAogCXN3aXRjaCAoaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQtPmZvdXJjYykgewogCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6CiAJY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKIAljYXNlIFY0TDJfUElYX0ZNVF9OVjE2OgogCWNhc2UgVjRMMl9QSVhfRk1UX05WNjE6CisJCXBsYW5hciA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBsYW5hciA9IGZhbHNlOworCX0KKworCWNldV93cml0ZShwY2RldiwgdG9wMSwgcGh5c19hZGRyX3RvcCk7CisJaWYgKFY0TDJfRklFTERfTk9ORSAhPSBwY2Rldi0+ZmllbGQpIHsKKwkJaWYgKHBsYW5hcikKKwkJCXBoeXNfYWRkcl9ib3R0b20gPSBwaHlzX2FkZHJfdG9wICsgaWNkLT51c2VyX3dpZHRoOworCQllbHNlCisJCQlwaHlzX2FkZHJfYm90dG9tID0gcGh5c19hZGRyX3RvcCArCisJCQkJc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAorCQkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKKwkJY2V1X3dyaXRlKHBjZGV2LCBib3R0b20xLCBwaHlzX2FkZHJfYm90dG9tKTsKKwl9CisKKwlpZiAocGxhbmFyKSB7CiAJCXBoeXNfYWRkcl90b3AgKz0gaWNkLT51c2VyX3dpZHRoICoKIAkJCWljZC0+dXNlcl9oZWlnaHQ7CiAJCWNldV93cml0ZShwY2RldiwgdG9wMiwgcGh5c19hZGRyX3RvcCk7CkBAIC0zNDEsNDQgKzM1OCwxMSBAQAogCiBzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfdmlkZW9idWZfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjb250YWluZXJfb2YodmItPnZiMl9xdWV1ZSwgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLCB2YjJfdmlkcSk7Ci0Jc3RydWN0IHNoX21vYmlsZV9jZXVfYnVmZmVyICpidWY7Ci0JaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAotCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCWlmIChieXRlc19wZXJfbGluZSA8IDApCi0JCXJldHVybiBieXRlc19wZXJfbGluZTsKLQotCWJ1ZiA9IHRvX2NldV92Yih2Yik7Ci0KLQlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JXAgJWx1XG4iLCBfX2Z1bmNfXywKLQkJdmIsIHZiMl9wbGFuZV92YWRkcih2YiwgMCksIHZiMl9nZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCkpOworCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2J1ZmZlciAqYnVmID0gdG9fY2V1X3ZiKHZiKTsKIAogCS8qIEFkZGVkIGxpc3QgaGVhZCBpbml0aWFsaXphdGlvbiBvbiBhbGxvYyAqLwogCVdBUk4oIWxpc3RfZW1wdHkoJmJ1Zi0+cXVldWUpLCAiQnVmZmVyICVwIG9uIHF1ZXVlIVxuIiwgdmIpOwogCi0jaWZkZWYgREVCVUcKLQkvKgotCSAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzZWUgaWYgd2UgYWN0dWFsbHkgZmlsbAotCSAqIHRoZSBidWZmZXIgd2l0aCBzb21ldGhpbmcKLQkgKi8KLQlpZiAodmIyX3BsYW5lX3ZhZGRyKHZiLCAwKSkKLQkJbWVtc2V0KHZiMl9wbGFuZV92YWRkcih2YiwgMCksIDB4YWEsIHZiMl9nZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCkpOwotI2VuZGlmCi0KLQlCVUdfT04oTlVMTCA9PSBpY2QtPmN1cnJlbnRfZm10KTsKLQotCXNpemUgPSBpY2QtPnVzZXJfaGVpZ2h0ICogYnl0ZXNfcGVyX2xpbmU7Ci0KLQlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgc2l6ZSkgewotCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiQnVmZmVyIHRvbyBzbWFsbCAoJWx1IDwgJWx1KVxuIiwKLQkJCXZiMl9wbGFuZV9zaXplKHZiLCAwKSwgc2l6ZSk7Ci0JCXJldHVybiAtRU5PQlVGUzsKLQl9Ci0KLQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIsIDAsIHNpemUpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM4OCwxMCArMzcyLDM1IEBACiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2J1ZmZlciAqYnVmID0gdG9fY2V1X3ZiKHZiKTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAorCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOworCisJaWYgKGJ5dGVzX3Blcl9saW5lIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXNpemUgPSBpY2QtPnVzZXJfaGVpZ2h0ICogYnl0ZXNfcGVyX2xpbmU7CisKKwlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgc2l6ZSkgeworCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiQnVmZmVyICMlZCB0b28gc21hbGwgKCVsdSA8ICVsdSlcbiIsCisJCQl2Yi0+djRsMl9idWYuaW5kZXgsIHZiMl9wbGFuZV9zaXplKHZiLCAwKSwgc2l6ZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiLCAwLCBzaXplKTsKIAogCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglcCAlbHVcbiIsIF9fZnVuY19fLAogCQl2YiwgdmIyX3BsYW5lX3ZhZGRyKHZiLCAwKSwgdmIyX2dldF9wbGFuZV9wYXlsb2FkKHZiLCAwKSk7CiAKKyNpZmRlZiBERUJVRworCS8qCisJICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHNlZSBpZiB3ZSBhY3R1YWxseSBmaWxsCisJICogdGhlIGJ1ZmZlciB3aXRoIHNvbWV0aGluZworCSAqLworCWlmICh2YjJfcGxhbmVfdmFkZHIodmIsIDApKQorCQltZW1zZXQodmIyX3BsYW5lX3ZhZGRyKHZiLCAwKSwgMHhhYSwgdmIyX2dldF9wbGFuZV9wYXlsb2FkKHZiLCAwKSk7CisjZW5kaWYKKwogCXNwaW5fbG9ja19pcnEoJnBjZGV2LT5sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZidWYtPnF1ZXVlLCAmcGNkZXYtPmNhcHR1cmUpOwogCkBAIC00MDUsNiArNDE0LDExIEBACiAJCXNoX21vYmlsZV9jZXVfY2FwdHVyZShwY2Rldik7CiAJfQogCXNwaW5fdW5sb2NrX2lycSgmcGNkZXYtPmxvY2spOworCisJcmV0dXJuOworCitlcnJvcjoKKwl2YjJfYnVmZmVyX2RvbmUodmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOwogfQogCiBzdGF0aWMgdm9pZCBzaF9tb2JpbGVfY2V1X3ZpZGVvYnVmX3JlbGVhc2Uoc3RydWN0IHZiMl9idWZmZXIgKnZiKQpAQCAtNDI5LDExICs0NDMsMjMgQEAKIAlpZiAoYnVmLT5xdWV1ZS5uZXh0KQogCQlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKIAorCXBjZGV2LT5idWZfdG90YWwgLT0gUEFHRV9BTElHTih2YjJfcGxhbmVfc2l6ZSh2YiwgMCkpOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcygpICV6dSBieXRlcyBidWZmZXJzXG4iLCBfX2Z1bmNfXywKKwkJcGNkZXYtPmJ1Zl90b3RhbCk7CisKIAlzcGluX3VubG9ja19pcnEoJnBjZGV2LT5sb2NrKTsKIH0KIAogc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3ZpZGVvYnVmX2luaXQoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogeworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY29udGFpbmVyX29mKHZiLT52YjJfcXVldWUsIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSwgdmIyX3ZpZHEpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKworCXBjZGV2LT5idWZfdG90YWwgKz0gUEFHRV9BTElHTih2YjJfcGxhbmVfc2l6ZSh2YiwgMCkpOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcygpICV6dSBieXRlcyBidWZmZXJzXG4iLCBfX2Z1bmNfXywKKwkJcGNkZXYtPmJ1Zl90b3RhbCk7CisKIAkvKiBUaGlzIGlzIGZvciBsb2NraW5nIGRlYnVnZ2luZyBvbmx5ICovCiAJSU5JVF9MSVNUX0hFQUQoJnRvX2NldV92Yih2YiktPnF1ZXVlKTsKIAlyZXR1cm4gMDsKQEAgLTUzNSwxOSArNTYxLDI5IEBACiAKIAlwbV9ydW50aW1lX2dldF9zeW5jKGljaS0+djRsMl9kZXYuZGV2KTsKIAorCXBjZGV2LT5idWZfdG90YWwgPSAwOworCiAJcmV0ID0gc2hfbW9iaWxlX2NldV9zb2Z0X3Jlc2V0KHBjZGV2KTsKIAogCWNzaTJfc2QgPSBmaW5kX2NzaTIocGNkZXYpOworCWlmIChjc2kyX3NkKQorCQljc2kyX3NkLT5ncnBfaWQgPSAobG9uZylpY2Q7CiAKIAlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKGNzaTJfc2QsIGNvcmUsIHNfcG93ZXIsIDEpOwotCWlmIChyZXQgIT0gLUVOT0RFViAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EICYmIHJldCA8IDApIHsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EICYmIHJldCAhPSAtRU5PREVWKSB7CiAJCXBtX3J1bnRpbWVfcHV0X3N5bmMoaWNpLT52NGwyX2Rldi5kZXYpOwotCX0gZWxzZSB7Ci0JCXBjZGV2LT5pY2QgPSBpY2Q7Ci0JCXJldCA9IDA7CisJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIHJldDsKKwkvKgorCSAqIC1FTk9ERVYgaXMgc3BlY2lhbDogZWl0aGVyIGNzaTJfc2QgPT0gTlVMTCBvciB0aGUgQ1NJLTIgZHJpdmVyCisJICogaGFzIG5vdCBmb3VuZCB0aGlzIHNvYy1jYW1lcmEgZGV2aWNlIGFtb25nIGl0cyBjbGllbnRzCisJICovCisJaWYgKHJldCA9PSAtRU5PREVWICYmIGNzaTJfc2QpCisJCWNzaTJfc2QtPmdycF9pZCA9IDA7CisJcGNkZXYtPmljZCA9IGljZDsKKworCXJldHVybiAwOwogfQogCiAvKiBDYWxsZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCkBAIC01NjAsNiArNTk2LDggQEAKIAlCVUdfT04oaWNkICE9IHBjZGV2LT5pY2QpOwogCiAJdjRsMl9zdWJkZXZfY2FsbChjc2kyX3NkLCBjb3JlLCBzX3Bvd2VyLCAwKTsKKwlpZiAoY3NpMl9zZCkKKwkJY3NpMl9zZC0+Z3JwX2lkID0gMDsKIAkvKiBkaXNhYmxlIGNhcHR1cmUsIGRpc2FibGUgaW50ZXJydXB0cyAqLwogCWNldV93cml0ZShwY2RldiwgQ0VJRVIsIDApOwogCXNoX21vYmlsZV9jZXVfc29mdF9yZXNldChwY2Rldik7CkBAIC02MjgsMjIgKzY2NiwyMiBAQAogCWxlZnRfb2Zmc2V0CT0gY2FtLT5jZXVfbGVmdDsKIAl0b3Bfb2Zmc2V0CT0gY2FtLT5jZXVfdG9wOwogCi0JLyogQ0VVIGNyb3BwaW5nIChDRlNaUikgaXMgYXBwbGllZCBfYWZ0ZXJfIHRoZSBzY2FsaW5nIGZpbHRlciAoQ0ZMQ1IpICovCisJV0FSTl9PTihpY2QtPnVzZXJfd2lkdGggJiAzIHx8IGljZC0+dXNlcl9oZWlnaHQgJiAzKTsKKworCXdpZHRoID0gaWNkLT51c2VyX3dpZHRoOworCiAJaWYgKHBjZGV2LT5pbWFnZV9tb2RlKSB7CiAJCWluX3dpZHRoID0gY2FtLT53aWR0aDsKIAkJaWYgKCFwY2Rldi0+aXNfMTZiaXQpIHsKIAkJCWluX3dpZHRoICo9IDI7CiAJCQlsZWZ0X29mZnNldCAqPSAyOwogCQl9Ci0JCXdpZHRoID0gaWNkLT51c2VyX3dpZHRoOwotCQljZHdkcl93aWR0aCA9IGljZC0+dXNlcl93aWR0aDsKKwkJY2R3ZHJfd2lkdGggPSB3aWR0aDsKIAl9IGVsc2UgewotCQlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCisJCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKHdpZHRoLAogCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwogCQl1bnNpZ25lZCBpbnQgd19mYWN0b3I7CiAKLQkJd2lkdGggPSBpY2QtPnVzZXJfd2lkdGg7Ci0KIAkJc3dpdGNoIChpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+cGFja2luZykgewogCQljYXNlIFNPQ19NQlVTX1BBQ0tJTkdfMlg4X1BBREhJOgogCQkJd19mYWN0b3IgPSAyOwpAQCAtNjUzLDEwICs2OTEsMTAgQEAKIAkJfQogCiAJCWluX3dpZHRoID0gY2FtLT53aWR0aCAqIHdfZmFjdG9yOwotCQlsZWZ0X29mZnNldCA9IGxlZnRfb2Zmc2V0ICogd19mYWN0b3I7CisJCWxlZnRfb2Zmc2V0ICo9IHdfZmFjdG9yOwogCiAJCWlmIChieXRlc19wZXJfbGluZSA8IDApCi0JCQljZHdkcl93aWR0aCA9IGljZC0+dXNlcl93aWR0aDsKKwkJCWNkd2RyX3dpZHRoID0gd2lkdGg7CiAJCWVsc2UKIAkJCWNkd2RyX3dpZHRoID0gYnl0ZXNfcGVyX2xpbmU7CiAJfQpAQCAtNjY0LDcgKzcwMiw3IEBACiAJaGVpZ2h0ID0gaWNkLT51c2VyX2hlaWdodDsKIAlpbl9oZWlnaHQgPSBjYW0tPmhlaWdodDsKIAlpZiAoVjRMMl9GSUVMRF9OT05FICE9IHBjZGV2LT5maWVsZCkgewotCQloZWlnaHQgLz0gMjsKKwkJaGVpZ2h0ID0gKGhlaWdodCAvIDIpICYgfjM7CiAJCWluX2hlaWdodCAvPSAyOwogCQl0b3Bfb2Zmc2V0IC89IDI7CiAJCWNkd2RyX3dpZHRoICo9IDI7CkBAIC02ODYsNiArNzI0LDcgQEAKIAogCWNldV93cml0ZShwY2RldiwgQ0FNT1IsIGNhbW9yKTsKIAljZXVfd3JpdGUocGNkZXYsIENBUFdSLCAoaW5faGVpZ2h0IDw8IDE2KSB8IGluX3dpZHRoKTsKKwkvKiBDRlNaUiBjbGlwcGluZyBpcyBhcHBsaWVkIF9hZnRlcl8gdGhlIHNjYWxpbmcgZmlsdGVyIChDRkxDUikgKi8KIAljZXVfd3JpdGUocGNkZXYsIENGU1pSLCAoaGVpZ2h0IDw8IDE2KSB8IHdpZHRoKTsKIAljZXVfd3JpdGUocGNkZXYsIENEV0RSLCBjZHdkcl93aWR0aCk7CiB9CkBAIC03MjMsNjYgKzc2Miw5MyBAQAogCQljZXVfd3JpdGUocGNkZXYsIENBUFNSLCBjYXBzcik7CiB9CiAKKy8qIEZpbmQgdGhlIGJ1cyBzdWJkZXZpY2UgZHJpdmVyLCBlLmcuLCBDU0kyICovCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2ICpmaW5kX2J1c19zdWJkZXYoc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiwKKwkJCQkJICAgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJaWYgKHBjZGV2LT5jc2kyX3BkZXYpIHsKKwkJc3RydWN0IHY0bDJfc3ViZGV2ICpjc2kyX3NkID0gZmluZF9jc2kyKHBjZGV2KTsKKwkJaWYgKGNzaTJfc2QgJiYgY3NpMl9zZC0+Z3JwX2lkID09ICh1MzIpaWNkKQorCQkJcmV0dXJuIGNzaTJfc2Q7CisJfQorCisJcmV0dXJuIHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Cit9CisKKyNkZWZpbmUgQ0VVX0JVU19GTEFHUyAoVjRMMl9NQlVTX01BU1RFUiB8CVwKKwkJVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8CVwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwJXAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyB8CVwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwJXAorCQlWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVyB8CVwKKwkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0gpCisKIC8qIENhcHR1cmUgaXMgbm90IHJ1bm5pbmcsIG5vIGludGVycnVwdHMsIG5vIGxvY2tpbmcgbmVlZGVkICovCiBzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCQkgICAgICAgX191MzIgcGl4Zm10KQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3MsIHZhbHVlOwotCWludCB5dXZfbGluZXNraXA7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGZpbmRfYnVzX3N1YmRldihwY2RldiwgaWNkKTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9jYW0gKmNhbSA9IGljZC0+aG9zdF9wcml2OworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNmZyA9IHsudHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTCx9OworCXVuc2lnbmVkIGxvbmcgdmFsdWUsIGNvbW1vbl9mbGFncyA9IENFVV9CVVNfRkxBR1M7CiAJdTMyIGNhcHNyID0gY2FwdHVyZV9zYXZlX3Jlc2V0KHBjZGV2KTsKKwl1bnNpZ25lZCBpbnQgeXV2X2xpbmVza2lwOworCWludCByZXQ7CiAKLQljYW1lcmFfZmxhZ3MgPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtKGljZCk7Ci0JY29tbW9uX2ZsYWdzID0gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsCi0JCQkJCQkgICAgICAgbWFrZV9idXNfcGFyYW0ocGNkZXYpKTsKLQlpZiAoIWNvbW1vbl9mbGFncykKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBJZiB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGdfbWJ1c19jb25maWcsIHdlIGp1c3QgdXNlIG91cgorCSAqIHBsYXRmb3JtIGRhdGEKKwkgKi8KKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZ19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKCFyZXQpIHsKKwkJY29tbW9uX2ZsYWdzID0gc29jX21idXNfY29uZmlnX2NvbXBhdGlibGUoJmNmZywKKwkJCQkJCQkgIGNvbW1vbl9mbGFncyk7CisJCWlmICghY29tbW9uX2ZsYWdzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyogTWFrZSBjaG9pc2VzLCBiYXNlZCBvbiBwbGF0Zm9ybSBwcmVmZXJlbmNlcyAqLwotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0gpICYmCi0JICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKSkgeworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cpKSB7CiAJCWlmIChwY2Rldi0+cGRhdGEtPmZsYWdzICYgU0hfQ0VVX0ZMQUdfSFNZTkNfTE9XKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfSElHSDsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIOwogCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0hTWU5DX0FDVElWRV9MT1c7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XOwogCX0KIAotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0gpICYmCi0JICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XKSkgeworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpKSB7CiAJCWlmIChwY2Rldi0+cGRhdGEtPmZsYWdzICYgU0hfQ0VVX0ZMQUdfVlNZTkNfTE9XKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfSElHSDsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIOwogCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1ZTWU5DX0FDVElWRV9MT1c7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XOwogCX0KIAotCXJldCA9IGljZC0+b3BzLT5zZXRfYnVzX3BhcmFtKGljZCwgY29tbW9uX2ZsYWdzKTsKLQlpZiAocmV0IDwgMCkKKwljZmcuZmxhZ3MgPSBjb21tb25fZmxhZ3M7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfbWJ1c19jb25maWcsICZjZmcpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PSU9DVExDTUQpCiAJCXJldHVybiByZXQ7CiAKLQlzd2l0Y2ggKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0RBVEFXSURUSF9NQVNLKSB7Ci0JY2FzZSBTT0NBTV9EQVRBV0lEVEhfODoKLQkJcGNkZXYtPmlzXzE2Yml0ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTT0NBTV9EQVRBV0lEVEhfMTY6CisJaWYgKGljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10LT5iaXRzX3Blcl9zYW1wbGUgPiA4KQogCQlwY2Rldi0+aXNfMTZiaXQgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJZWxzZQorCQlwY2Rldi0+aXNfMTZiaXQgPSAwOwogCiAJY2V1X3dyaXRlKHBjZGV2LCBDUkNOVFIsIDApOwogCWNldV93cml0ZShwY2RldiwgQ1JDTVBSLCAwKTsKIAogCXZhbHVlID0gMHgwMDAwMDAxMDsgLyogZGF0YSBmZXRjaCBieSBkZWZhdWx0ICovCi0JeXV2X2xpbmVza2lwID0gMDsKKwl5dXZfbGluZXNraXAgPSAweDEwOwogCiAJc3dpdGNoIChpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+Zm91cmNjKSB7CiAJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKIAljYXNlIFY0TDJfUElYX0ZNVF9OVjIxOgotCQl5dXZfbGluZXNraXAgPSAxOyAvKiBza2lwIGZvciBOVjEyLzIxLCBubyBza2lwIGZvciBOVjE2LzYxICovCisJCS8qIGNvbnZlcnQgNDoyOjIgLT4gNDoyOjAgKi8KKwkJeXV2X2xpbmVza2lwID0gMDsgLyogc2tpcCBmb3IgTlYxMi8yMSwgbm8gc2tpcCBmb3IgTlYxNi82MSAqLwogCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIFY0TDJfUElYX0ZNVF9OVjE2OgogCWNhc2UgVjRMMl9QSVhfRk1UX05WNjE6CkBAIC04MDgsOCArODc0LDggQEAKIAkgICAgaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlY2MSkKIAkJdmFsdWUgXj0gMHgwMDAwMDEwMDsgLyogc3dhcCBVLCBWIHRvIGNoYW5nZSBmcm9tIE5WMXgtPk5WeDEgKi8KIAotCXZhbHVlIHw9IGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cgPyAxIDw8IDEgOiAwOwotCXZhbHVlIHw9IGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cgPyAxIDw8IDAgOiAwOworCXZhbHVlIHw9IGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XID8gMSA8PCAxIDogMDsKKwl2YWx1ZSB8PSBjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyA/IDEgPDwgMCA6IDA7CiAJdmFsdWUgfD0gcGNkZXYtPmlzXzE2Yml0ID8gMSA8PCAxMiA6IDA7CiAKIAkvKiBDU0kyIG1vZGUgKi8KQEAgLTg1Miw5ICs5MTgsNyBAQAogCSAqIHVzaW5nIDcgd2Ugc3dhcCB0aGUgZGF0YSBieXRlcyB0byBtYXRjaCB0aGUgaW5jb21pbmcgb3JkZXI6CiAJICogRDAsIEQxLCBEMiwgRDMsIEQ0LCBENSwgRDYsIEQ3CiAJICovCi0JdmFsdWUgPSAweDAwMDAwMDE3OwotCWlmICh5dXZfbGluZXNraXApCi0JCXZhbHVlICY9IH4weDAwMDAwMDEwOyAvKiBjb252ZXJ0IDQ6MjoyIC0+IDQ6MjowICovCisJdmFsdWUgPSAweDAwMDAwMDA3IHwgeXV2X2xpbmVza2lwOwogCiAJY2V1X3dyaXRlKHBjZGV2LCBDRE9DUiwgdmFsdWUpOwogCWNldV93cml0ZShwY2RldiwgQ0ZXQ1IsIDApOyAvKiBrZWVwICJkYXRhZmV0Y2ggZmlyZXdhbGwiIGRpc2FibGVkICovCkBAIC04NzUsMTMgKzkzOSwxOSBAQAogewogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBmaW5kX2J1c19zdWJkZXYocGNkZXYsIGljZCk7CisJdW5zaWduZWQgbG9uZyBjb21tb25fZmxhZ3MgPSBDRVVfQlVTX0ZMQUdTOworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNmZyA9IHsudHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTCx9OworCWludCByZXQ7CiAKLQljYW1lcmFfZmxhZ3MgPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtKGljZCk7Ci0JY29tbW9uX2ZsYWdzID0gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsCi0JCQkJCQkgICAgICAgbWFrZV9idXNfcGFyYW0ocGNkZXYpKTsKLQlpZiAoIWNvbW1vbl9mbGFncyB8fCBidXN3aWR0aCA+IDE2IHx8Ci0JICAgIChidXN3aWR0aCA+IDggJiYgIShjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfMTYpKSkKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZ19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKCFyZXQpCisJCWNvbW1vbl9mbGFncyA9IHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKCZjZmcsCisJCQkJCQkJICBjb21tb25fZmxhZ3MpOworCWVsc2UgaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWNvbW1vbl9mbGFncyB8fCBidXN3aWR0aCA+IDE2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAwOwpAQCAtODkxLDI2ICs5NjEsMjYgQEAKIAl7CiAJCS5mb3VyY2MJCQk9IFY0TDJfUElYX0ZNVF9OVjEyLAogCQkubmFtZQkJCT0gIk5WMTIiLAotCQkuYml0c19wZXJfc2FtcGxlCT0gMTIsCi0JCS5wYWNraW5nCQk9IFNPQ19NQlVTX1BBQ0tJTkdfTk9ORSwKKwkJLmJpdHNfcGVyX3NhbXBsZQk9IDgsCisJCS5wYWNraW5nCQk9IFNPQ19NQlVTX1BBQ0tJTkdfMV81WDgsCiAJCS5vcmRlcgkJCT0gU09DX01CVVNfT1JERVJfTEUsCiAJfSwgewogCQkuZm91cmNjCQkJPSBWNEwyX1BJWF9GTVRfTlYyMSwKIAkJLm5hbWUJCQk9ICJOVjIxIiwKLQkJLmJpdHNfcGVyX3NhbXBsZQk9IDEyLAotCQkucGFja2luZwkJPSBTT0NfTUJVU19QQUNLSU5HX05PTkUsCisJCS5iaXRzX3Blcl9zYW1wbGUJPSA4LAorCQkucGFja2luZwkJPSBTT0NfTUJVU19QQUNLSU5HXzFfNVg4LAogCQkub3JkZXIJCQk9IFNPQ19NQlVTX09SREVSX0xFLAogCX0sIHsKIAkJLmZvdXJjYwkJCT0gVjRMMl9QSVhfRk1UX05WMTYsCiAJCS5uYW1lCQkJPSAiTlYxNiIsCi0JCS5iaXRzX3Blcl9zYW1wbGUJPSAxNiwKLQkJLnBhY2tpbmcJCT0gU09DX01CVVNfUEFDS0lOR19OT05FLAorCQkuYml0c19wZXJfc2FtcGxlCT0gOCwKKwkJLnBhY2tpbmcJCT0gU09DX01CVVNfUEFDS0lOR18yWDhfUEFESEksCiAJCS5vcmRlcgkJCT0gU09DX01CVVNfT1JERVJfTEUsCiAJfSwgewogCQkuZm91cmNjCQkJPSBWNEwyX1BJWF9GTVRfTlY2MSwKIAkJLm5hbWUJCQk9ICJOVjYxIiwKLQkJLmJpdHNfcGVyX3NhbXBsZQk9IDE2LAotCQkucGFja2luZwkJPSBTT0NfTUJVU19QQUNLSU5HX05PTkUsCisJCS5iaXRzX3Blcl9zYW1wbGUJPSA4LAorCQkucGFja2luZwkJPSBTT0NfTUJVU19QQUNLSU5HXzJYOF9QQURISSwKIAkJLm9yZGVyCQkJPSBTT0NfTUJVU19PUkRFUl9MRSwKIAl9LAogfTsKQEAgLTkyMCw2ICs5OTAsOCBAQAogewogCXJldHVybglmbXQtPnBhY2tpbmcgPT0gU09DX01CVVNfUEFDS0lOR19OT05FIHx8CiAJCShmbXQtPmJpdHNfcGVyX3NhbXBsZSA9PSA4ICYmCisJCSBmbXQtPnBhY2tpbmcgPT0gU09DX01CVVNfUEFDS0lOR18xXzVYOCkgfHwKKwkJKGZtdC0+Yml0c19wZXJfc2FtcGxlID09IDggJiYKIAkJIGZtdC0+cGFja2luZyA9PSBTT0NfTUJVU19QQUNLSU5HXzJYOF9QQURISSkgfHwKIAkJKGZtdC0+Yml0c19wZXJfc2FtcGxlID4gOCAmJgogCQkgZm10LT5wYWNraW5nID09IFNPQ19NQlVTX1BBQ0tJTkdfRVhURU5EMTYpOwpAQCAtOTI3LDYgKzk5OSwzOCBAQAogCiBzdGF0aWMgaW50IGNsaWVudF9nX3JlY3Qoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcmVjdCAqcmVjdCk7CiAKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmN0cmxfdG9faWNkKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsCisJCQkJCQkJY3RybF9oYW5kbGVyKTsKK30KKworc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY3RybF90b19pY2QoY3RybCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfU0hBUlBORVNTOgorCQlzd2l0Y2ggKGljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10LT5mb3VyY2MpIHsKKwkJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKKwkJY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKKwkJY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKKwkJY2FzZSBWNEwyX1BJWF9GTVRfTlY2MToKKwkJCWNldV93cml0ZShwY2RldiwgQ0xGQ1IsICFjdHJsLT52YWwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBzaF9tb2JpbGVfY2V1X2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBzaF9tb2JpbGVfY2V1X3NfY3RybCwKK307CisKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9nZXRfZm9ybWF0cyhzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgdW5zaWduZWQgaW50IGlkeCwKIAkJCQkgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGUpCiB7CkBAIC05NTIsNiArMTA1Niw3IEBACiAJfQogCiAJaWYgKCFwY2Rldi0+cGRhdGEtPmNzaTIpIHsKKwkJLyogQXJlIHRoZXJlIGFueSByZXN0cmljdGlvbnMgaW4gdGhlIENTSS0yIGNhc2U/ICovCiAJCXJldCA9IHNoX21vYmlsZV9jZXVfdHJ5X2J1c19wYXJhbShpY2QsIGZtdC0+Yml0c19wZXJfc2FtcGxlKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gMDsKQEAgLTk2Miw2ICsxMDY3LDEyIEBACiAJCXN0cnVjdCB2NGwyX3JlY3QgcmVjdDsKIAkJaW50IHNoaWZ0ID0gMDsKIAorCQkvKiBBZGQgb3VyIGNvbnRyb2wgKi8KKwkJdjRsMl9jdHJsX25ld19zdGQoJmljZC0+Y3RybF9oYW5kbGVyLCAmc2hfbW9iaWxlX2NldV9jdHJsX29wcywKKwkJCQkgIFY0TDJfQ0lEX1NIQVJQTkVTUywgMCwgMSwgMSwgMCk7CisJCWlmIChpY2QtPmN0cmxfaGFuZGxlci5lcnJvcikKKwkJCXJldHVybiBpY2QtPmN0cmxfaGFuZGxlci5lcnJvcjsKKwogCQkvKiBGSVhNRTogc3Vid2luZG93IGlzIGxvc3QgYmV0d2VlbiBjbG9zZSAvIG9wZW4gKi8KIAogCQkvKiBDYWNoZSBjdXJyZW50IGNsaWVudCBnZW9tZXRyeSAqLwpAQCAtMTAwNCw5ICsxMTE1LDYgQEAKIAkJY2FtLT53aWR0aAk9IG1mLndpZHRoOwogCQljYW0tPmhlaWdodAk9IG1mLmhlaWdodDsKIAotCQljYW0tPndpZHRoCT0gbWYud2lkdGg7Ci0JCWNhbS0+aGVpZ2h0CT0gbWYuaGVpZ2h0OwotCiAJCWljZC0+aG9zdF9wcml2ID0gY2FtOwogCX0gZWxzZSB7CiAJCWNhbSA9IGljZC0+aG9zdF9wcml2OwpAQCAtMTI3OCw2ICsxMzg2LDcgQEAKIAl1bnNpZ25lZCBpbnQgd2lkdGggPSBtZi0+d2lkdGgsIGhlaWdodCA9IG1mLT5oZWlnaHQsIHRtcF93LCB0bXBfaDsKIAl1bnNpZ25lZCBpbnQgbWF4X3dpZHRoLCBtYXhfaGVpZ2h0OwogCXN0cnVjdCB2NGwyX2Nyb3BjYXAgY2FwOworCWJvb2wgY2V1XzF0bzE7CiAJaW50IHJldDsKIAogCXJldCA9IHY0bDJfZGV2aWNlX2NhbGxfdW50aWxfZXJyKHNkLT52NGwyX2RldiwgKGxvbmcpaWNkLCB2aWRlbywKQEAgLTEyODcsNyArMTM5NiwxNCBAQAogCiAJZGV2X2dlbyhkZXYsICJjYW1lcmEgc2NhbGVkIHRvICV1eCV1XG4iLCBtZi0+d2lkdGgsIG1mLT5oZWlnaHQpOwogCi0JaWYgKCh3aWR0aCA9PSBtZi0+d2lkdGggJiYgaGVpZ2h0ID09IG1mLT5oZWlnaHQpIHx8ICFjZXVfY2FuX3NjYWxlKQorCWlmICh3aWR0aCA9PSBtZi0+d2lkdGggJiYgaGVpZ2h0ID09IG1mLT5oZWlnaHQpIHsKKwkJLyogUGVyZmVjdCEgVGhlIGNsaWVudCBoYXMgZG9uZSBpdCBhbGwuICovCisJCWNldV8xdG8xID0gdHJ1ZTsKKwkJZ290byB1cGRhdGVfY2FjaGU7CisJfQorCisJY2V1XzF0bzEgPSBmYWxzZTsKKwlpZiAoIWNldV9jYW5fc2NhbGUpCiAJCWdvdG8gdXBkYXRlX2NhY2hlOwogCiAJY2FwLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CkBAIC0xMzI3LDcgKzE0NDMsMTAgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXVwZGF0ZV9zdWJyZWN0KGNhbSk7CisJaWYgKGNldV8xdG8xKQorCQljYW0tPnN1YnJlY3QgPSBjYW0tPnJlY3Q7CisJZWxzZQorCQl1cGRhdGVfc3VicmVjdChjYW0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDE0LDcgKzE1MzMsMTAgQEAKIAljYXBzciA9IGNhcHR1cmVfc2F2ZV9yZXNldChwY2Rldik7CiAJZGV2X2RiZyhkZXYsICJDQVBTUiAweCV4LCBDRkxDUiAweCV4XG4iLCBjYXBzciwgcGNkZXYtPmNmbGNyKTsKIAotCS8qIDEuIC0gMi4gQXBwbHkgaXRlcmF0aXZlIGNhbWVyYSBTX0NST1AgZm9yIG5ldyBpbnB1dCB3aW5kb3cuICovCisJLyoKKwkgKiAxLiAtIDIuIEFwcGx5IGl0ZXJhdGl2ZSBjYW1lcmEgU19DUk9QIGZvciBuZXcgaW5wdXQgd2luZG93LCByZWFkIGJhY2sKKwkgKiBhY3R1YWwgY2FtZXJhIHJlY3RhbmdsZS4KKwkgKi8KIAlyZXQgPSBjbGllbnRfc19jcm9wKGljZCwgYSwgJmNhbV9jcm9wKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTE0OTgsOCArMTYyMCw5IEBACiAJCWNldV93cml0ZShwY2RldiwgQ0ZMQ1IsIGNmbGNyKTsKIAl9CiAKLQlpY2QtPnVzZXJfd2lkdGgJID0gb3V0X3dpZHRoOwotCWljZC0+dXNlcl9oZWlnaHQgPSBvdXRfaGVpZ2h0OworCWljZC0+dXNlcl93aWR0aAkgPSBvdXRfd2lkdGggJiB+MzsKKwlpY2QtPnVzZXJfaGVpZ2h0ID0gb3V0X2hlaWdodCAmIH4zOworCS8qIE9mZnNldHMgYXJlIGFwcGxpZWQgYXQgdGhlIENFVSBzY2FsaW5nIGZpbHRlciBpbnB1dCAqLwogCWNhbS0+Y2V1X2xlZnQJID0gc2NhbGVfZG93bihyZWN0LT5sZWZ0IC0gY2FtX3JlY3QtPmxlZnQsIHNjYWxlX2NhbV9oKSAmIH4xOwogCWNhbS0+Y2V1X3RvcAkgPSBzY2FsZV9kb3duKHJlY3QtPnRvcCAtIGNhbV9yZWN0LT50b3AsIHNjYWxlX2NhbV92KSAmIH4xOwogCkBAIC0xNTM4LDcgKzE2NjEsNyBAQAogICogQ0VVIGNyb3AsIG1hcHBlZCBiYWNrZWQgb250byB0aGUgY2xpZW50IGlucHV0IChzdWJyZWN0KS4KICAqLwogc3RhdGljIHZvaWQgY2FsY3VsYXRlX2NsaWVudF9vdXRwdXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCwgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCisJCWNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCwgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCiB7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfY2FtICpjYW0gPSBpY2QtPmhvc3RfcHJpdjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKQEAgLTE1NzQsOCArMTY5Nyw4IEBACiAJZGV2X2dlbyhkZXYsICIzOiBzY2FsZXMgJXU6JXVcbiIsIHNjYWxlX2gsIHNjYWxlX3YpOwogCiAJLyoKLQkgKiA0LiBDYWxjdWxhdGUgY2xpZW50IG91dHB1dCB3aW5kb3cgYnkgYXBwbHlpbmcgY29tYmluZWQgc2NhbGVzIHRvIHJlYWwKLQkgKiAgICBpbnB1dCB3aW5kb3cuCisJICogNC4gQ2FsY3VsYXRlIGRlc2lyZWQgY2xpZW50IG91dHB1dCB3aW5kb3cgYnkgYXBwbHlpbmcgY29tYmluZWQgc2NhbGVzCisJICogICAgdG8gY2xpZW50IChyZWFsKSBpbnB1dCB3aW5kb3cuCiAJICovCiAJbWYtPndpZHRoCT0gc2NhbGVfZG93bihjYW0tPnJlY3Qud2lkdGgsIHNjYWxlX2gpOwogCW1mLT5oZWlnaHQJPSBzY2FsZV9kb3duKGNhbS0+cmVjdC5oZWlnaHQsIHNjYWxlX3YpOwpAQCAtMTYwMCw4ICsxNzIzLDYgQEAKIAlib29sIGltYWdlX21vZGU7CiAJZW51bSB2NGwyX2ZpZWxkIGZpZWxkOwogCi0JZGV2X2dlbyhkZXYsICJTX0ZNVChwaXg9MHgleCwgJXV4JXUpXG4iLCBwaXhmbXQsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKLQogCXN3aXRjaCAocGl4LT5maWVsZCkgewogCWRlZmF1bHQ6CiAJCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CkBAIC0xNjIyLDggKzE3NDMsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKiAxLi00LiBDYWxjdWxhdGUgY2xpZW50IG91dHB1dCBnZW9tZXRyeSAqLwotCWNhbGN1bGF0ZV9jbGllbnRfb3V0cHV0KGljZCwgJmYtPmZtdC5waXgsICZtZik7CisJLyogMS4tNC4gQ2FsY3VsYXRlIGRlc2lyZWQgY2xpZW50IG91dHB1dCBnZW9tZXRyeSAqLworCWNhbGN1bGF0ZV9jbGllbnRfb3V0cHV0KGljZCwgcGl4LCAmbWYpOwogCW1mLmZpZWxkCT0gcGl4LT5maWVsZDsKIAltZi5jb2xvcnNwYWNlCT0gcGl4LT5jb2xvcnNwYWNlOwogCW1mLmNvZGUJCT0geGxhdGUtPmNvZGU7CkBAIC0xNjM5LDYgKzE3NjAsOSBAQAogCQlpbWFnZV9tb2RlID0gZmFsc2U7CiAJfQogCisJZGV2X2dlbyhkZXYsICJTX0ZNVChwaXg9MHgleCwgZmxkIDB4JXgsIGNvZGUgMHgleCwgJXV4JXUpXG4iLCBwaXhmbXQsIG1mLmZpZWxkLCBtZi5jb2RlLAorCQlwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CisKIAlkZXZfZ2VvKGRldiwgIjQ6IHJlcXVlc3QgY2FtZXJhIG91dHB1dCAldXgldVxuIiwgbWYud2lkdGgsIG1mLmhlaWdodCk7CiAKIAkvKiA1LiAtIDkuICovCkBAIC0xNzAwLDYgKzE4MjQsMTAgQEAKIAlwY2Rldi0+ZmllbGQgPSBmaWVsZDsKIAlwY2Rldi0+aW1hZ2VfbW9kZSA9IGltYWdlX21vZGU7CiAKKwkvKiBDRlNaUiByZXF1aXJlbWVudCAqLworCXBpeC0+d2lkdGgJJj0gfjM7CisJcGl4LT5oZWlnaHQJJj0gfjM7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTcyNSw3ICsxODUzLDggQEAKIAogCS8qIEZJWE1FOiBjYWxjdWxhdGUgdXNpbmcgZGVwdGggYW5kIGJ1cyB3aWR0aCAqLwogCi0JdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZwaXgtPndpZHRoLCAyLCAyNTYwLCAxLAorCS8qIENGU1pSIHJlcXVpcmVzIGhlaWdodCBhbmQgd2lkdGggdG8gYmUgNC1waXhlbCBhbGlnbmVkICovCisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZwaXgtPndpZHRoLCAyLCAyNTYwLCAyLAogCQkJICAgICAgJnBpeC0+aGVpZ2h0LCA0LCAxOTIwLCAyLCAwKTsKIAogCXdpZHRoID0gcGl4LT53aWR0aDsKQEAgLTE3NzgsNiArMTkwNyw5IEBACiAJCQlwaXgtPmhlaWdodCA9IGhlaWdodDsKIAl9CiAKKwlwaXgtPndpZHRoCSY9IH4zOworCXBpeC0+aGVpZ2h0CSY9IH4zOworCiAJZGV2X2dlbyhpY2QtPnBhcmVudCwgIiVzKCk6IHJldHVybiAlZCwgZm10IDB4JXgsICV1eCV1XG4iLAogCQlfX2Z1bmNfXywgcmV0LCBwaXgtPnBpeGVsZm9ybWF0LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CiAKQEAgLTE4MjQsOCArMTk1Niw4IEBACiAJCQkgICAgIG91dF9oZWlnaHQgIT0gZi5mbXQucGl4LmhlaWdodCkpCiAJCQlyZXQgPSAtRUlOVkFMOwogCQlpZiAoIXJldCkgewotCQkJaWNkLT51c2VyX3dpZHRoCQk9IG91dF93aWR0aDsKLQkJCWljZC0+dXNlcl9oZWlnaHQJPSBvdXRfaGVpZ2h0OworCQkJaWNkLT51c2VyX3dpZHRoCQk9IG91dF93aWR0aCAmIH4zOworCQkJaWNkLT51c2VyX2hlaWdodAk9IG91dF9oZWlnaHQgJiB+MzsKIAkJCXJldCA9IHNoX21vYmlsZV9jZXVfc2V0X2J1c19wYXJhbShpY2QsCiAJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10LT5mb3VyY2MpOwogCQl9CkBAIC0xODY5LDU1ICsyMDAxLDYgQEAKIAlyZXR1cm4gdmIyX3F1ZXVlX2luaXQocSk7CiB9CiAKLXN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9nZXRfY3RybChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwotCXUzMiB2YWw7Ci0KLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6Ci0JCXZhbCA9IGNldV9yZWFkKHBjZGV2LCBDTEZDUik7Ci0JCWN0cmwtPnZhbHVlID0gdmFsIF4gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRU5PSU9DVExDTUQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9zZXRfY3RybChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfU0hBUlBORVNTOgotCQlzd2l0Y2ggKGljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10LT5mb3VyY2MpIHsKLQkJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKLQkJY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKLQkJY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKLQkJY2FzZSBWNEwyX1BJWF9GTVRfTlY2MToKLQkJCWNldV93cml0ZShwY2RldiwgQ0xGQ1IsICFjdHJsLT52YWx1ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIC1FTk9JT0NUTENNRDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBzaF9tb2JpbGVfY2V1X2NvbnRyb2xzW10gPSB7Ci0JewotCQkuaWQJCT0gVjRMMl9DSURfU0hBUlBORVNTLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiTG93LXBhc3MgZmlsdGVyIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX2hvc3Rfb3BzIHNoX21vYmlsZV9jZXVfaG9zdF9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5hZGQJCT0gc2hfbW9iaWxlX2NldV9hZGRfZGV2aWNlLApAQCAtMTkyOSwxNCArMjAxMiwxMCBAQAogCS5zZXRfbGl2ZWNyb3AJPSBzaF9tb2JpbGVfY2V1X3NldF9saXZlY3JvcCwKIAkuc2V0X2ZtdAk9IHNoX21vYmlsZV9jZXVfc2V0X2ZtdCwKIAkudHJ5X2ZtdAk9IHNoX21vYmlsZV9jZXVfdHJ5X2ZtdCwKLQkuc2V0X2N0cmwJPSBzaF9tb2JpbGVfY2V1X3NldF9jdHJsLAotCS5nZXRfY3RybAk9IHNoX21vYmlsZV9jZXVfZ2V0X2N0cmwsCiAJLnBvbGwJCT0gc2hfbW9iaWxlX2NldV9wb2xsLAogCS5xdWVyeWNhcAk9IHNoX21vYmlsZV9jZXVfcXVlcnljYXAsCiAJLnNldF9idXNfcGFyYW0JPSBzaF9tb2JpbGVfY2V1X3NldF9idXNfcGFyYW0sCiAJLmluaXRfdmlkZW9idWYyCT0gc2hfbW9iaWxlX2NldV9pbml0X3ZpZGVvYnVmLAotCS5jb250cm9scwk9IHNoX21vYmlsZV9jZXVfY29udHJvbHMsCi0JLm51bV9jb250cm9scwk9IEFSUkFZX1NJWkUoc2hfbW9iaWxlX2NldV9jb250cm9scyksCiB9OwogCiBzdHJ1Y3QgYnVzX3dhaXQgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY3NpMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY3NpMi5jCmluZGV4IDI4OTNhMDEuLmVhNGYwNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NzaTIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jc2kyLmMKQEAgLTE1LDEwICsxNSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zaF9tb2JpbGVfY2V1Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NzaTIuaD4KICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvc29jX21lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC0zNSwxMSArMzcsMTAgQEAKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OwogCXVuc2lnbmVkIGludAkJCWlycTsKKwl1bnNpZ25lZCBsb25nCQkJbWlwaV9mbGFnczsKIAl2b2lkIF9faW9tZW0JCQkqYmFzZTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkqcGRldjsKIAlzdHJ1Y3Qgc2hfY3NpMl9jbGllbnRfY29uZmlnCSpjbGllbnQ7Ci0JdW5zaWduZWQgbG9uZyAoKnF1ZXJ5X2J1c19wYXJhbSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOwotCWludCAoKnNldF9idXNfcGFyYW0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCB1bnNpZ25lZCBsb25nKTsKIH07CiAKIHN0YXRpYyBpbnQgc2hfY3NpMl90cnlfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCkBAIC0xMjcsOSArMTI4LDM0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2hfY3NpMl9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfTUFTVEVSIHwgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0g7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hfY3NpMl9zX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIGNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IHNoX2NzaTIgKnByaXYgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBzaF9jc2kyLCBzdWJkZXYpOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKXNkLT5ncnBfaWQ7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpjbGllbnRfc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNsaWVudF9jZmcgPSB7LnR5cGUgPSBWNEwyX01CVVNfQ1NJMiwKKwkJCQkJICAgICAgLmZsYWdzID0gcHJpdi0+bWlwaV9mbGFnc307CisKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChjbGllbnRfc2QsIHZpZGVvLCBzX21idXNfY29uZmlnLCAmY2xpZW50X2NmZyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHNoX2NzaTJfc3ViZGV2X3ZpZGVvX29wcyA9IHsKIAkuc19tYnVzX2ZtdAk9IHNoX2NzaTJfc19mbXQsCiAJLnRyeV9tYnVzX2ZtdAk9IHNoX2NzaTJfdHJ5X2ZtdCwKKwkuZ19tYnVzX2NvbmZpZwk9IHNoX2NzaTJfZ19tYnVzX2NvbmZpZywKKwkuc19tYnVzX2NvbmZpZwk9IHNoX2NzaTJfc19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyB2b2lkIHNoX2NzaTJfaHdpbml0KHN0cnVjdCBzaF9jc2kyICpwcml2KQpAQCAtMTQ0LDExICsxNzAsMjEgQEAKIAl1ZGVsYXkoNSk7CiAJaW93cml0ZTMyKDB4MDAwMDAwMDAsIHByaXYtPmJhc2UgKyBTSF9DU0kyX1NSU1QpOwogCi0JaWYgKHByaXYtPmNsaWVudC0+bGFuZXMgJiAzKQotCQl0bXAgfD0gcHJpdi0+Y2xpZW50LT5sYW5lcyAmIDM7Ci0JZWxzZQotCQkvKiBEZWZhdWx0IC0gYm90aCBsYW5lcyAqLwotCQl0bXAgfD0gMzsKKwlzd2l0Y2ggKHBkYXRhLT50eXBlKSB7CisJY2FzZSBTSF9DU0kyQzoKKwkJaWYgKHByaXYtPmNsaWVudC0+bGFuZXMgPT0gMSkKKwkJCXRtcCB8PSAxOworCQllbHNlCisJCQkvKiBEZWZhdWx0IC0gYm90aCBsYW5lcyAqLworCQkJdG1wIHw9IDM7CisJCWJyZWFrOworCWNhc2UgU0hfQ1NJMkk6CisJCWlmICghcHJpdi0+Y2xpZW50LT5sYW5lcyB8fCBwcml2LT5jbGllbnQtPmxhbmVzID4gNCkKKwkJCS8qIERlZmF1bHQgLSBhbGwgNCBsYW5lcyAqLworCQkJdG1wIHw9IDB4ZjsKKwkJZWxzZQorCQkJdG1wIHw9ICgxIDw8IHByaXYtPmNsaWVudC0+bGFuZXMpIC0gMTsKKwl9CiAKIAlpZiAocHJpdi0+Y2xpZW50LT5waHkgPT0gU0hfQ1NJMl9QSFlfTUFJTikKIAkJdG1wIHw9IDB4ODAwMDsKQEAgLTE2MywzOCArMTk5LDE4IEBACiAJaW93cml0ZTMyKHRtcCwgcHJpdi0+YmFzZSArIFNIX0NTSTJfQ0hLU1VNKTsKIH0KIAotc3RhdGljIGludCBzaF9jc2kyX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNoX2NzaTJfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfAotCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fTUFTVEVSIHwgU09DQU1fREFUQVdJRFRIXzggfCBTT0NBTV9EQVRBX0FDVElWRV9ISUdIOwotCi0JcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwotfQotCiBzdGF0aWMgaW50IHNoX2NzaTJfY2xpZW50X2Nvbm5lY3Qoc3RydWN0IHNoX2NzaTIgKnByaXYpCiB7CiAJc3RydWN0IHNoX2NzaTJfcGRhdGEgKnBkYXRhID0gcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgKmNzaTJfc2QgPSAmcHJpdi0+c3ViZGV2OwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gTlVMTDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKilwcml2LT5zdWJkZXYuZ3JwX2lkOworCXN0cnVjdCB2NGwyX3N1YmRldiAqY2xpZW50X3NkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZwcml2LT5zdWJkZXYpOwotCWludCBpOworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNmZzsKKwl1bnNpZ25lZCBsb25nIGNvbW1vbl9mbGFncywgY3NpMl9mbGFnczsKKwlpbnQgaSwgcmV0OwogCi0JdjRsMl9kZXZpY2VfZm9yX2VhY2hfc3ViZGV2KHNkLCBjc2kyX3NkLT52NGwyX2RldikKLQkJaWYgKHNkLT5ncnBfaWQpIHsKLQkJCWljZCA9IChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKilzZC0+Z3JwX2lkOwotCQkJYnJlYWs7Ci0JCX0KLQotCWlmICghaWNkKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocHJpdi0+Y2xpZW50KQorCQlyZXR1cm4gLUVCVVNZOwogCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fY2xpZW50czsgaSsrKQogCQlpZiAoJnBkYXRhLT5jbGllbnRzW2ldLnBkZXYtPmRldiA9PSBpY2QtPnBkZXYpCkBAIC0yMDUsMTUgKzIyMSw0MiBAQAogCWlmIChpID09IHBkYXRhLT5udW1fY2xpZW50cykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwkvKiBDaGVjayBpZiB3ZSBjYW4gc3VwcG9ydCB0aGlzIGNhbWVyYSAqLworCWNzaTJfZmxhZ3MgPSBWNEwyX01CVVNfQ1NJMl9DT05USU5VT1VTX0NMT0NLIHwgVjRMMl9NQlVTX0NTSTJfMV9MQU5FOworCisJc3dpdGNoIChwZGF0YS0+dHlwZSkgeworCWNhc2UgU0hfQ1NJMkM6CisJCWlmIChwZGF0YS0+Y2xpZW50c1tpXS5sYW5lcyAhPSAxKQorCQkJY3NpMl9mbGFncyB8PSBWNEwyX01CVVNfQ1NJMl8yX0xBTkU7CisJCWJyZWFrOworCWNhc2UgU0hfQ1NJMkk6CisJCXN3aXRjaCAocGRhdGEtPmNsaWVudHNbaV0ubGFuZXMpIHsKKwkJZGVmYXVsdDoKKwkJCWNzaTJfZmxhZ3MgfD0gVjRMMl9NQlVTX0NTSTJfNF9MQU5FOworCQljYXNlIDM6CisJCQljc2kyX2ZsYWdzIHw9IFY0TDJfTUJVU19DU0kyXzNfTEFORTsKKwkJY2FzZSAyOgorCQkJY3NpMl9mbGFncyB8PSBWNEwyX01CVVNfQ1NJMl8yX0xBTkU7CisJCX0KKwl9CisKKwljZmcudHlwZSA9IFY0TDJfTUJVU19DU0kyOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoY2xpZW50X3NkLCB2aWRlbywgZ19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKHJldCA9PSAtRU5PSU9DVExDTUQpCisJCWNvbW1vbl9mbGFncyA9IGNzaTJfZmxhZ3M7CisJZWxzZSBpZiAoIXJldCkKKwkJY29tbW9uX2ZsYWdzID0gc29jX21idXNfY29uZmlnX2NvbXBhdGlibGUoJmNmZywKKwkJCQkJCQkgIGNzaTJfZmxhZ3MpOworCWVsc2UKKwkJY29tbW9uX2ZsYWdzID0gMDsKKworCWlmICghY29tbW9uX2ZsYWdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEFsbCBnb29kOiBjYW1lcmEgTUlQSSBjb25maWd1cmF0aW9uIHN1cHBvcnRlZCAqLworCXByaXYtPm1pcGlfZmxhZ3MgPSBjb21tb25fZmxhZ3M7CiAJcHJpdi0+Y2xpZW50ID0gcGRhdGEtPmNsaWVudHMgKyBpOwogCi0JcHJpdi0+c2V0X2J1c19wYXJhbQkJPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbTsKLQlwcml2LT5xdWVyeV9idXNfcGFyYW0JCT0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbTsKLQlpY2QtPm9wcy0+c2V0X2J1c19wYXJhbQkJPSBzaF9jc2kyX3NldF9idXNfcGFyYW07Ci0JaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbQk9IHNoX2NzaTJfcXVlcnlfYnVzX3BhcmFtOwotCi0JY3NpMl9zZC0+Z3JwX2lkID0gKGxvbmcpaWNkOwotCiAJcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOwogCiAJc2hfY3NpMl9od2luaXQocHJpdik7CkBAIC0yMjMsMTYgKzI2NiwxMCBAQAogCiBzdGF0aWMgdm9pZCBzaF9jc2kyX2NsaWVudF9kaXNjb25uZWN0KHN0cnVjdCBzaF9jc2kyICpwcml2KQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKXByaXYtPnN1YmRldi5ncnBfaWQ7CisJaWYgKCFwcml2LT5jbGllbnQpCisJCXJldHVybjsKIAogCXByaXYtPmNsaWVudCA9IE5VTEw7Ci0JcHJpdi0+c3ViZGV2LmdycF9pZCA9IDA7Ci0KLQkvKiBEcml2ZXIgaXMgYWJvdXQgdG8gYmUgdW5ib3VuZCAqLwotCWljZC0+b3BzLT5zZXRfYnVzX3BhcmFtCQk9IHByaXYtPnNldF9idXNfcGFyYW07Ci0JaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbQk9IHByaXYtPnF1ZXJ5X2J1c19wYXJhbTsKLQlwcml2LT5zZXRfYnVzX3BhcmFtCQk9IE5VTEw7Ci0JcHJpdi0+cXVlcnlfYnVzX3BhcmFtCQk9IE5VTEw7CiAKIAlwbV9ydW50aW1lX3B1dCh2NGwyX2dldF9zdWJkZXZkYXRhKCZwcml2LT5zdWJkZXYpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfdm91LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX3ZvdS5jCmluZGV4IDZhNzI5ODcuLjk2NDRiZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfdm91LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF92b3UuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zaF92b3UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYwppbmRleCA1YmRmZTdlLi5iNzI1ODBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYwpAQCAtNTAsNDkgKzUwLDY1IEBACiBzdGF0aWMgTElTVF9IRUFEKGRldmljZXMpOwogc3RhdGljIERFRklORV9NVVRFWChsaXN0X2xvY2spOwkJLyogUHJvdGVjdHMgdGhlIGxpc3Qgb2YgaG9zdHMgKi8KIAotc3RhdGljIGludCBzb2NfY2FtZXJhX3Bvd2VyX3NldChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCi0JCQkJaW50IHBvd2VyX29uKQorc3RhdGljIGludCBzb2NfY2FtZXJhX3Bvd2VyX29uKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCkKIHsKLQlpbnQgcmV0OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworCWludCByZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoaWNsLT5udW1fcmVndWxhdG9ycywKKwkJCQkJaWNsLT5yZWd1bGF0b3JzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGljZC0+cGRldiwgIkNhbm5vdCBlbmFibGUgcmVndWxhdG9yc1xuIik7CisJCXJldHVybiByZXQ7CisJfQogCi0JaWYgKHBvd2VyX29uKSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShpY2wtPm51bV9yZWd1bGF0b3JzLAotCQkJCQkgICAgaWNsLT5yZWd1bGF0b3JzKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ2Fubm90IGVuYWJsZSByZWd1bGF0b3JzXG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlpZiAoaWNsLT5wb3dlcikKLQkJCXJldCA9IGljbC0+cG93ZXIoaWNkLT5wZGV2LCBwb3dlcl9vbik7CisJaWYgKGljbC0+cG93ZXIpIHsKKwkJcmV0ID0gaWNsLT5wb3dlcihpY2QtPnBkZXYsIDEpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycihpY2QtPnBkZXYsCiAJCQkJIlBsYXRmb3JtIGZhaWxlZCB0byBwb3dlci1vbiB0aGUgY2FtZXJhLlxuIik7Ci0KLQkJCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoaWNsLT5udW1fcmVndWxhdG9ycywKLQkJCQkJICAgICAgIGljbC0+cmVndWxhdG9ycyk7Ci0JCQlyZXR1cm4gcmV0OworCQkJZ290byBlbGlua3B3cjsKIAkJfQotCX0gZWxzZSB7Ci0JCXJldCA9IDA7Ci0JCWlmIChpY2wtPnBvd2VyKQotCQkJcmV0ID0gaWNsLT5wb3dlcihpY2QtPnBkZXYsIDApOworCX0KKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHNfcG93ZXIsIDEpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PSU9DVExDTUQgJiYgcmV0ICE9IC1FTk9ERVYpCisJCWdvdG8gZXNkcHdyOworCisJcmV0dXJuIDA7CisKK2VzZHB3cjoKKwlpZiAoaWNsLT5wb3dlcikKKwkJaWNsLT5wb3dlcihpY2QtPnBkZXYsIDApOworZWxpbmtwd3I6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShpY2wtPm51bV9yZWd1bGF0b3JzLAorCQkJICAgICAgIGljbC0+cmVndWxhdG9ycyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzb2NfY2FtZXJhX3Bvd2VyX29mZihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CisJaW50IHJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHNfcG93ZXIsIDApOworCisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCAmJiByZXQgIT0gLUVOT0RFVikKKwkJcmV0dXJuIHJldDsKKworCWlmIChpY2wtPnBvd2VyKSB7CisJCXJldCA9IGljbC0+cG93ZXIoaWNkLT5wZGV2LCAwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoaWNkLT5wZGV2LAogCQkJCSJQbGF0Zm9ybSBmYWlsZWQgdG8gcG93ZXItb2ZmIHRoZSBjYW1lcmEuXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQotCQlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKGljbC0+bnVtX3JlZ3VsYXRvcnMsCi0JCQkJCSAgICAgaWNsLT5yZWd1bGF0b3JzKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ2Fubm90IGRpc2FibGUgcmVndWxhdG9yc1xuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShpY2wtPm51bV9yZWd1bGF0b3JzLAorCQkJCSAgICAgaWNsLT5yZWd1bGF0b3JzKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihpY2QtPnBkZXYsICJDYW5ub3QgZGlzYWJsZSByZWd1bGF0b3JzXG4iKTsKKworCXJldHVybiByZXQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoCkBAIC0xMDgsMzggKzEyNCwzOCBAQAogRVhQT1JUX1NZTUJPTChzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyk7CiAKIC8qKgotICogc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoKSAtIGFwcGx5IHBsYXRmb3JtIFNPQ0FNX1NFTlNPUl9JTlZFUlRfKiBmbGFncworICogc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncygpIC0gYXBwbHkgcGxhdGZvcm0gU09DQU1fU0VOU09SX0lOVkVSVF8qIGZsYWdzCiAgKiBAaWNsOgljYW1lcmEgcGxhdGZvcm0gcGFyYW1ldGVycwotICogQGZsYWdzOglmbGFncyB0byBiZSBpbnZlcnRlZCBhY2NvcmRpbmcgdG8gcGxhdGZvcm0gY29uZmlndXJhdGlvbgorICogQGNmZzoJbWVkaWEgYnVzIGNvbmZpZ3VyYXRpb24KICAqIEByZXR1cm46CXJlc3VsdGluZyBmbGFncwogICovCi11bnNpZ25lZCBsb25nIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit1bnNpZ25lZCBsb25nIHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3Moc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQogewotCXVuc2lnbmVkIGxvbmcgZjsKKwl1bnNpZ25lZCBsb25nIGYsIGZsYWdzID0gY2ZnLT5mbGFnczsKIAogCS8qIElmIG9ubHkgb25lIG9mIHRoZSB0d28gcG9sYXJpdGllcyBpcyBzdXBwb3J0ZWQsIHN3aXRjaCB0byB0aGUgb3Bwb3NpdGUgKi8KIAlpZiAoaWNsLT5mbGFncyAmIFNPQ0FNX1NFTlNPUl9JTlZFUlRfSFNZTkMpIHsKLQkJZiA9IGZsYWdzICYgKFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0xPVyk7Ci0JCWlmIChmID09IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHx8IGYgPT0gU09DQU1fSFNZTkNfQUNUSVZFX0xPVykKLQkJCWZsYWdzIF49IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0xPVzsKKwkJZiA9IGZsYWdzICYgKFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKTsKKwkJaWYgKGYgPT0gVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHx8IGYgPT0gVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cpCisJCQlmbGFncyBePSBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVzsKIAl9CiAKIAlpZiAoaWNsLT5mbGFncyAmIFNPQ0FNX1NFTlNPUl9JTlZFUlRfVlNZTkMpIHsKLQkJZiA9IGZsYWdzICYgKFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0xPVyk7Ci0JCWlmIChmID09IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHx8IGYgPT0gU09DQU1fVlNZTkNfQUNUSVZFX0xPVykKLQkJCWZsYWdzIF49IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0xPVzsKKwkJZiA9IGZsYWdzICYgKFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKTsKKwkJaWYgKGYgPT0gVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHx8IGYgPT0gVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpCisJCQlmbGFncyBePSBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVzsKIAl9CiAKIAlpZiAoaWNsLT5mbGFncyAmIFNPQ0FNX1NFTlNPUl9JTlZFUlRfUENMSykgewotCQlmID0gZmxhZ3MgJiAoU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fUENMS19TQU1QTEVfRkFMTElORyk7Ci0JCWlmIChmID09IFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8fCBmID09IFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpCi0JCQlmbGFncyBePSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HOworCQlmID0gZmxhZ3MgJiAoVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKTsKKwkJaWYgKGYgPT0gVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8fCBmID09IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKQorCQkJZmxhZ3MgXj0gVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HOwogCX0KIAogCXJldHVybiBmbGFnczsKIH0KLUVYUE9SVF9TWU1CT0woc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MpOworRVhQT1JUX1NZTUJPTChzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKTsKIAogI2RlZmluZSBwaXhmbXRzdHIoeCkgKHgpICYgMHhmZiwgKCh4KSA+PiA4KSAmIDB4ZmYsICgoeCkgPj4gMTYpICYgMHhmZiwgXAogCSgoeCkgPj4gMjQpICYgMHhmZgpAQCAtMjMzLDYgKzI0OSwxNCBAQAogCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX3N0ZCwgKmEpOwogfQogCitzdGF0aWMgaW50IHNvY19jYW1lcmFfZ19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICphKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworCisJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIGdfc3RkLCBhKTsKK30KKwogc3RhdGljIGludCBzb2NfY2FtZXJhX2VudW1fZnNpemVzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpmc2l6ZSkKIHsKQEAgLTMxOCw2ICszNDIsMzIgQEAKIAkJcmV0dXJuIHZiMl9kcWJ1ZigmaWNkLT52YjJfdmlkcSwgcCwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwogfQogCitzdGF0aWMgaW50IHNvY19jYW1lcmFfY3JlYXRlX2J1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMgKmNyZWF0ZSkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCisJLyogdmlkZW9idWYyIG9ubHkgKi8KKwlpZiAoaWNpLT5vcHMtPmluaXRfdmlkZW9idWYpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UKKwkJcmV0dXJuIHZiMl9jcmVhdGVfYnVmcygmaWNkLT52YjJfdmlkcSwgY3JlYXRlKTsKK30KKworc3RhdGljIGludCBzb2NfY2FtZXJhX3ByZXBhcmVfYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgc3RydWN0IHY0bDJfYnVmZmVyICpiKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisKKwkvKiB2aWRlb2J1ZjIgb25seSAqLworCWlmIChpY2ktPm9wcy0+aW5pdF92aWRlb2J1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZQorCQlyZXR1cm4gdmIyX3ByZXBhcmVfYnVmKCZpY2QtPnZiMl92aWRxLCBiKTsKK30KKwogLyogQWx3YXlzIGVudGVyZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCiBzdGF0aWMgaW50IHNvY19jYW1lcmFfaW5pdF91c2VyX2Zvcm1hdHMoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7CkBAIC00NDgsNyArNDk4LDcgQEAKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2k7CiAJaW50IHJldDsKIAotCWlmICghaWNkLT5vcHMpCisJaWYgKCF0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSkKIAkJLyogTm8gZGV2aWNlIGRyaXZlciBhdHRhY2hlZCAqLwogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtNDc2LDcgKzUyNiw3IEBACiAJCQl9LAogCQl9OwogCi0JCXJldCA9IHNvY19jYW1lcmFfcG93ZXJfc2V0KGljZCwgaWNsLCAxKTsKKwkJcmV0ID0gc29jX2NhbWVyYV9wb3dlcl9vbihpY2QsIGljbCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBlcG93ZXI7CiAKQEAgLTUxMiw2ICs1NjIsNyBAQAogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBlaW5pdHZiOwogCQl9CisJCXY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZpY2QtPmN0cmxfaGFuZGxlcik7CiAJfQogCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaWNkOwpAQCAtNTI5LDcgKzU4MCw3IEBACiBlcmVzdW1lOgogCWljaS0+b3BzLT5yZW1vdmUoaWNkKTsKIGVpY2lhZGQ6Ci0Jc29jX2NhbWVyYV9wb3dlcl9zZXQoaWNkLCBpY2wsIDApOworCXNvY19jYW1lcmFfcG93ZXJfb2ZmKGljZCwgaWNsKTsKIGVwb3dlcjoKIAlpY2QtPnVzZV9jb3VudC0tOwogCW1vZHVsZV9wdXQoaWNpLT5vcHMtPm93bmVyKTsKQEAgLTU1Myw3ICs2MDQsNyBAQAogCQlpZiAoaWNpLT5vcHMtPmluaXRfdmlkZW9idWYyKQogCQkJdmIyX3F1ZXVlX3JlbGVhc2UoJmljZC0+dmIyX3ZpZHEpOwogCi0JCXNvY19jYW1lcmFfcG93ZXJfc2V0KGljZCwgaWNsLCAwKTsKKwkJc29jX2NhbWVyYV9wb3dlcl9vZmYoaWNkLCBpY2wpOwogCX0KIAogCWlmIChpY2QtPnN0cmVhbWVyID09IGZpbGUpCkBAIC03ODEsNzUgKzgzMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc29jX2NhbWVyYV9xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwotCWludCBpOwotCi0JV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7Ci0KLQlpZiAoIXFjLT5pZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBGaXJzdCBjaGVjayBob3N0IGNvbnRyb2xzICovCi0JZm9yIChpID0gMDsgaSA8IGljaS0+b3BzLT5udW1fY29udHJvbHM7IGkrKykKLQkJaWYgKHFjLT5pZCA9PSBpY2ktPm9wcy0+Y29udHJvbHNbaV0uaWQpIHsKLQkJCW1lbWNweShxYywgJihpY2ktPm9wcy0+Y29udHJvbHNbaV0pLAotCQkJCXNpemVvZigqcWMpKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkvKiBUaGVuIGRldmljZSBjb250cm9scyAqLwotCWZvciAoaSA9IDA7IGkgPCBpY2QtPm9wcy0+bnVtX2NvbnRyb2xzOyBpKyspCi0JCWlmIChxYy0+aWQgPT0gaWNkLT5vcHMtPmNvbnRyb2xzW2ldLmlkKSB7Ci0JCQltZW1jcHkocWMsICYoaWNkLT5vcHMtPmNvbnRyb2xzW2ldKSwKLQkJCQlzaXplb2YoKnFjKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgc29jX2NhbWVyYV9nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKLQlpbnQgcmV0OwotCi0JV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7Ci0KLQlpZiAoaWNpLT5vcHMtPmdldF9jdHJsKSB7Ci0JCXJldCA9IGljaS0+b3BzLT5nZXRfY3RybChpY2QsIGN0cmwpOwotCQlpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIGdfY3RybCwgY3RybCk7Ci19Ci0KLXN0YXRpYyBpbnQgc29jX2NhbWVyYV9zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKLQlpbnQgcmV0OwotCi0JV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7Ci0KLQlpZiAoaWNpLT5vcHMtPnNldF9jdHJsKSB7Ci0JCXJldCA9IGljaS0+b3BzLT5zZXRfY3RybChpY2QsIGN0cmwpOwotCQlpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHNfY3RybCwgY3RybCk7Ci19Ci0KIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCSAgICAgIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmEpCiB7CkBAIC0xMDAzLDcgKzk4NSw3IEBACiAJCWdvdG8gZWkyY2dhOwogCX0KIAotCWljbC0+Ym9hcmRfaW5mby0+cGxhdGZvcm1fZGF0YSA9IGljZDsKKwlpY2wtPmJvYXJkX2luZm8tPnBsYXRmb3JtX2RhdGEgPSBpY2w7CiAKIAlzdWJkZXYgPSB2NGwyX2kyY19uZXdfc3ViZGV2X2JvYXJkKCZpY2ktPnY0bDJfZGV2LCBhZGFwLAogCQkJCWljbC0+Ym9hcmRfaW5mbywgTlVMTCk7CkBAIC0xMDUyLDEyICsxMDM0LDI5IEBACiAKIAlkZXZfaW5mbyhpY2QtPnBkZXYsICJQcm9iaW5nICVzXG4iLCBkZXZfbmFtZShpY2QtPnBkZXYpKTsKIAorCS8qCisJICogQ3VycmVudGx5IHRoZSBzdWJkZXYgd2l0aCB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgY29udHJvbHMgKDEzKSBpcworCSAqIG92NjU1MC4gU28gbGV0J3MgcGljayAxNiBhcyBhIGhpbnQgZm9yIHRoZSBjb250cm9sIGhhbmRsZXIuIE5vdGUKKwkgKiB0aGF0IHRoaXMgaXMgYSBoaW50IG9ubHk6IHRvbyBsYXJnZSBhbmQgeW91IHdhc3RlIHNvbWUgbWVtb3J5LCB0b28KKwkgKiBzbWFsbCBhbmQgdGhlcmUgaXMgYSAodmVyeSkgc21hbGwgcGVyZm9ybWFuY2UgaGl0IHdoZW4gbG9va2luZyB1cAorCSAqIGNvbnRyb2xzIGluIHRoZSBpbnRlcm5hbCBoYXNoLgorCSAqLworCXJldCA9IHY0bDJfY3RybF9oYW5kbGVyX2luaXQoJmljZC0+Y3RybF9oYW5kbGVyLCAxNik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoaWNkLT5wZGV2LCBpY2wtPm51bV9yZWd1bGF0b3JzLAogCQkJCSBpY2wtPnJlZ3VsYXRvcnMpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVyZWc7CiAKLQlyZXQgPSBzb2NfY2FtZXJhX3Bvd2VyX3NldChpY2QsIGljbCwgMSk7CisJLyoKKwkgKiBUaGlzIHdpbGwgbm90IHlldCBjYWxsIHY0bDJfc3ViZGV2X2NvcmVfb3BzOjpzX3Bvd2VyKDEpLCBiZWNhdXNlIHRoZQorCSAqIHN1YmRldmljZSBoYXMgbm90IGJlZW4gaW5pdGlhbGlzZWQgeWV0LiBXZSdsbCBoYXZlIHRvIGNhbGwgaXQgb25jZQorCSAqIGFnYWluIGFmdGVyIGluaXRpYWxpc2F0aW9uLCBldmVuIHRob3VnaCBpdCBzaG91bGRuJ3QgYmUgbmVlZGVkLCB3ZQorCSAqIGRvbid0IGRvIGFueSBJTyBoZXJlLgorCSAqLworCXJldCA9IHNvY19jYW1lcmFfcG93ZXJfb24oaWNkLCBpY2wpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVwb3dlcjsKIApAQCAtMTA5OCw2ICsxMDk3LDcgQEAKIAkJaWYgKCFjb250cm9sIHx8ICFjb250cm9sLT5kcml2ZXIgfHwgIWRldl9nZXRfZHJ2ZGF0YShjb250cm9sKSB8fAogCQkgICAgIXRyeV9tb2R1bGVfZ2V0KGNvbnRyb2wtPmRyaXZlci0+b3duZXIpKSB7CiAJCQlpY2wtPmRlbF9kZXZpY2UoaWNkKTsKKwkJCXJldCA9IC1FTk9ERVY7CiAJCQlnb3RvIGVub2RydjsKIAkJfQogCX0KQEAgLTExMDUsNiArMTEwNSw5IEBACiAJc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXNkLT5ncnBfaWQgPSAobG9uZylpY2Q7CiAKKwlpZiAodjRsMl9jdHJsX2FkZF9oYW5kbGVyKCZpY2QtPmN0cmxfaGFuZGxlciwgc2QtPmN0cmxfaGFuZGxlcikpCisJCWdvdG8gZWN0cmw7CisKIAkvKiBBdCB0aGlzIHBvaW50IGNsaWVudCAucHJvYmUoKSBzaG91bGQgaGF2ZSBydW4gYWxyZWFkeSAqLwogCXJldCA9IHNvY19jYW1lcmFfaW5pdF91c2VyX2Zvcm1hdHMoaWNkKTsKIAlpZiAocmV0IDwgMCkKQEAgLTExMjMsNiArMTEyNiwxMCBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGV2aWRzdGFydDsKIAorCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHNfcG93ZXIsIDEpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PSU9DVExDTUQpCisJCWdvdG8gZXNkcHdyOworCiAJLyogVHJ5IHRvIGltcHJvdmUgb3VyIGd1ZXNzIG9mIGEgcmVhc29uYWJsZSB3aW5kb3cgZm9ybWF0ICovCiAJaWYgKCF2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZ19tYnVzX2ZtdCwgJm1mKSkgewogCQlpY2QtPnVzZXJfd2lkdGgJCT0gbWYud2lkdGg7CkBAIC0xMTMzLDE2ICsxMTQwLDE5IEBACiAKIAlpY2ktPm9wcy0+cmVtb3ZlKGljZCk7CiAKLQlzb2NfY2FtZXJhX3Bvd2VyX3NldChpY2QsIGljbCwgMCk7CisJc29jX2NhbWVyYV9wb3dlcl9vZmYoaWNkLCBpY2wpOwogCiAJbXV0ZXhfdW5sb2NrKCZpY2QtPnZpZGVvX2xvY2spOwogCiAJcmV0dXJuIDA7CiAKK2VzZHB3cjoKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShpY2QtPnZkZXYpOwogZXZpZHN0YXJ0OgogCW11dGV4X3VubG9jaygmaWNkLT52aWRlb19sb2NrKTsKIAlzb2NfY2FtZXJhX2ZyZWVfdXNlcl9mb3JtYXRzKGljZCk7CiBlaXVmbXQ6CitlY3RybDoKIAlpZiAoaWNsLT5ib2FyZF9pbmZvKSB7CiAJCXNvY19jYW1lcmFfZnJlZV9pMmMoaWNkKTsKIAl9IGVsc2UgewpAQCAtMTE1MiwxMyArMTE2MiwxNSBAQAogZW5vZHJ2OgogZWFkZGRldjoKIAl2aWRlb19kZXZpY2VfcmVsZWFzZShpY2QtPnZkZXYpOworCWljZC0+dmRldiA9IE5VTEw7CiBldmRjOgogCWljaS0+b3BzLT5yZW1vdmUoaWNkKTsKIGVhZGQ6Ci0Jc29jX2NhbWVyYV9wb3dlcl9zZXQoaWNkLCBpY2wsIDApOworCXNvY19jYW1lcmFfcG93ZXJfb2ZmKGljZCwgaWNsKTsKIGVwb3dlcjoKIAlyZWd1bGF0b3JfYnVsa19mcmVlKGljbC0+bnVtX3JlZ3VsYXRvcnMsIGljbC0+cmVndWxhdG9ycyk7CiBlcmVnOgorCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmljZC0+Y3RybF9oYW5kbGVyKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTczLDYgKzExODUsNyBAQAogCiAJQlVHX09OKCFpY2QtPnBhcmVudCk7CiAKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZpY2QtPmN0cmxfaGFuZGxlcik7CiAJaWYgKHZkZXYpIHsKIAkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UodmRldik7CiAJCWljZC0+dmRldiA9IE5VTEw7CkBAIC0xMzYzLDI0ICsxMzc2LDI0IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgc29jX2NhbWVyYV9pb2N0bF9vcHMgPSB7CiAJLnZpZGlvY19xdWVyeWNhcAkgPSBzb2NfY2FtZXJhX3F1ZXJ5Y2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwICA9IHNvY19jYW1lcmFfdHJ5X2ZtdF92aWRfY2FwLAogCS52aWRpb2NfZ19mbXRfdmlkX2NhcCAgICA9IHNvY19jYW1lcmFfZ19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBzb2NfY2FtZXJhX2VudW1fZm10X3ZpZF9jYXAsCiAJLnZpZGlvY19zX2ZtdF92aWRfY2FwICAgID0gc29jX2NhbWVyYV9zX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IHNvY19jYW1lcmFfZW51bV9mbXRfdmlkX2NhcCwKIAkudmlkaW9jX2VudW1faW5wdXQJID0gc29jX2NhbWVyYV9lbnVtX2lucHV0LAogCS52aWRpb2NfZ19pbnB1dAkJID0gc29jX2NhbWVyYV9nX2lucHV0LAogCS52aWRpb2Nfc19pbnB1dAkJID0gc29jX2NhbWVyYV9zX2lucHV0LAogCS52aWRpb2Nfc19zdGQJCSA9IHNvY19jYW1lcmFfc19zdGQsCisJLnZpZGlvY19nX3N0ZAkJID0gc29jX2NhbWVyYV9nX3N0ZCwKIAkudmlkaW9jX2VudW1fZnJhbWVzaXplcyAgPSBzb2NfY2FtZXJhX2VudW1fZnNpemVzLAogCS52aWRpb2NfcmVxYnVmcwkJID0gc29jX2NhbWVyYV9yZXFidWZzLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwICA9IHNvY19jYW1lcmFfdHJ5X2ZtdF92aWRfY2FwLAogCS52aWRpb2NfcXVlcnlidWYJID0gc29jX2NhbWVyYV9xdWVyeWJ1ZiwKIAkudmlkaW9jX3FidWYJCSA9IHNvY19jYW1lcmFfcWJ1ZiwKIAkudmlkaW9jX2RxYnVmCQkgPSBzb2NfY2FtZXJhX2RxYnVmLAorCS52aWRpb2NfY3JlYXRlX2J1ZnMJID0gc29jX2NhbWVyYV9jcmVhdGVfYnVmcywKKwkudmlkaW9jX3ByZXBhcmVfYnVmCSA9IHNvY19jYW1lcmFfcHJlcGFyZV9idWYsCiAJLnZpZGlvY19zdHJlYW1vbgkgPSBzb2NfY2FtZXJhX3N0cmVhbW9uLAogCS52aWRpb2Nfc3RyZWFtb2ZmCSA9IHNvY19jYW1lcmFfc3RyZWFtb2ZmLAotCS52aWRpb2NfcXVlcnljdHJsCSA9IHNvY19jYW1lcmFfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsCQkgPSBzb2NfY2FtZXJhX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybAkJID0gc29jX2NhbWVyYV9zX2N0cmwsCiAJLnZpZGlvY19jcm9wY2FwCQkgPSBzb2NfY2FtZXJhX2Nyb3BjYXAsCiAJLnZpZGlvY19nX2Nyb3AJCSA9IHNvY19jYW1lcmFfZ19jcm9wLAogCS52aWRpb2Nfc19jcm9wCQkgPSBzb2NfY2FtZXJhX3NfY3JvcCwKQEAgLTE0MDksNiArMTQyMiw3IEBACiAJdmRldi0+aW9jdGxfb3BzCQk9ICZzb2NfY2FtZXJhX2lvY3RsX29wczsKIAl2ZGV2LT5yZWxlYXNlCQk9IHZpZGVvX2RldmljZV9yZWxlYXNlOwogCXZkZXYtPnR2bm9ybXMJCT0gVjRMMl9TVERfVU5LTk9XTjsKKwl2ZGV2LT5jdHJsX2hhbmRsZXIJPSAmaWNkLT5jdHJsX2hhbmRsZXI7CiAJdmRldi0+bG9jawkJPSAmaWNkLT52aWRlb19sb2NrOwogCiAJaWNkLT52ZGV2ID0gdmRldjsKQEAgLTE0MjcsMTEgKzE0NDEsNiBAQAogCWlmICghaWNkLT5wYXJlbnQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFpY2QtPm9wcyB8fAotCSAgICAhaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbSB8fAotCSAgICAhaWNkLT5vcHMtPnNldF9idXNfcGFyYW0pCi0JCXJldHVybiAtRUlOVkFMOwotCiAJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGljZC0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoaWNkLT5wZGV2LCAidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZDogJWRcbiIsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYV9wbGF0Zm9ybS5jCmluZGV4IDgwNjljZDYuLjQ0MDJhOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYV9wbGF0Zm9ybS5jCkBAIC0zMCwzMiArMzAsMTIgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKHN1YmRldiwgc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1fcHJpdiwgc3ViZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKmdldF9pbmZvKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPQotCQl0b19wbGF0Zm9ybV9kZXZpY2UodG9fc29jX2NhbWVyYV9jb250cm9sKGljZCkpOwotCXJldHVybiBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLX0KLQogc3RhdGljIGludCBzb2NfY2FtZXJhX3BsYXRmb3JtX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqcCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXJldHVybiBwLT5zZXRfY2FwdHVyZShwLCBlbmFibGUpOwogfQogCi1zdGF0aWMgaW50IHNvY19jYW1lcmFfcGxhdGZvcm1fc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotc29jX2NhbWVyYV9wbGF0Zm9ybV9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqcCA9IGdldF9pbmZvKGljZCk7Ci0JcmV0dXJuIHAtPmJ1c19wYXJhbTsKLX0KLQogc3RhdGljIGludCBzb2NfY2FtZXJhX3BsYXRmb3JtX2ZpbGxfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQkJCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewpAQCAtMTE1LDYgKzk1LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc29jX2NhbWVyYV9wbGF0Zm9ybV9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJCSAgICAgc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9wbGF0Zm9ybV9pbmZvICpwID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwljZmctPmZsYWdzID0gcC0+bWJ1c19wYXJhbTsKKwljZmctPnR5cGUgPSBwLT5tYnVzX3R5cGU7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgcGxhdGZvcm1fc3ViZGV2X3ZpZGVvX29wcyA9IHsKIAkuc19zdHJlYW0JPSBzb2NfY2FtZXJhX3BsYXRmb3JtX3Nfc3RyZWFtLAogCS5lbnVtX21idXNfZm10CT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9lbnVtX2ZtdCwKQEAgLTEyMyw2ICsxMTQsNyBAQAogCS50cnlfbWJ1c19mbXQJPSBzb2NfY2FtZXJhX3BsYXRmb3JtX2ZpbGxfZm10LAogCS5nX21idXNfZm10CT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9maWxsX2ZtdCwKIAkuc19tYnVzX2ZtdAk9IHNvY19jYW1lcmFfcGxhdGZvcm1fZmlsbF9mbXQsCisJLmdfbWJ1c19jb25maWcJPSBzb2NfY2FtZXJhX3BsYXRmb3JtX2dfbWJ1c19jb25maWcsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBwbGF0Zm9ybV9zdWJkZXZfb3BzID0gewpAQCAtMTMwLDExICsxMjIsNiBAQAogCS52aWRlbwk9ICZwbGF0Zm9ybV9zdWJkZXZfdmlkZW9fb3BzLAogfTsKIAotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBzb2NfY2FtZXJhX3BsYXRmb3JtX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSBzb2NfY2FtZXJhX3BsYXRmb3JtX3NldF9idXNfcGFyYW0sCi0JLnF1ZXJ5X2J1c19wYXJhbQk9IHNvY19jYW1lcmFfcGxhdGZvcm1fcXVlcnlfYnVzX3BhcmFtLAotfTsKLQogc3RhdGljIGludCBzb2NfY2FtZXJhX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpOwpAQCAtMTYzLDggKzE1MCw2IEBACiAJLyogU2V0IHRoZSBjb250cm9sIGRldmljZSByZWZlcmVuY2UgKi8KIAlpY2QtPmNvbnRyb2wgPSAmcGRldi0+ZGV2OwogCi0JaWNkLT5vcHMgPSAmc29jX2NhbWVyYV9wbGF0Zm9ybV9vcHM7Ci0KIAlpY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCiAJdjRsMl9zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCAmcGxhdGZvcm1fc3ViZGV2X29wcyk7CkBAIC0xNzgsNyArMTYzLDYgQEAKIAlyZXR1cm4gcmV0OwogCiBldmRyczoKLQlpY2QtPm9wcyA9IE5VTEw7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJa2ZyZWUocHJpdik7CiAJcmV0dXJuIHJldDsKQEAgLTE4NywxMSArMTcxLDEwIEBACiBzdGF0aWMgaW50IHNvY19jYW1lcmFfcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1fcHJpdiAqcHJpdiA9IGdldF9wcml2KHBkZXYpOwotCXN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKnAgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHAtPmljZDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9wbGF0Zm9ybV9pbmZvICpwID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmcHJpdi0+c3ViZGV2KTsKIAorCXAtPmljZC0+Y29udHJvbCA9IE5VTEw7CiAJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnByaXYtPnN1YmRldik7Ci0JaWNkLT5vcHMgPSBOVUxMOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWtmcmVlKHByaXYpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfbWVkaWFidXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX21lZGlhYnVzLmMKaW5kZXggYmVhN2M5Yy4uY2Y3ZjIxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfbWVkaWFidXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19tZWRpYWJ1cy5jCkBAIC0zODMsNiArMzgzLDM5IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNvY19tYnVzX2dldF9mbXRkZXNjKTsKIAordW5zaWduZWQgaW50IHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKGNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcsCisJCQkJCXVuc2lnbmVkIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGNvbW1vbl9mbGFnczsKKwlib29sIGhzeW5jID0gdHJ1ZSwgdnN5bmMgPSB0cnVlLCBwY2xrLCBkYXRhLCBtb2RlOworCWJvb2wgbWlwaV9sYW5lcywgbWlwaV9jbG9jazsKKworCWNvbW1vbl9mbGFncyA9IGNmZy0+ZmxhZ3MgJiBmbGFnczsKKworCXN3aXRjaCAoY2ZnLT50eXBlKSB7CisJY2FzZSBWNEwyX01CVVNfUEFSQUxMRUw6CisJCWhzeW5jID0gY29tbW9uX2ZsYWdzICYgKFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CisJCQkJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKTsKKwkJdnN5bmMgPSBjb21tb25fZmxhZ3MgJiAoVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwKKwkJCQkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpOworCWNhc2UgVjRMMl9NQlVTX0JUNjU2OgorCQlwY2xrID0gY29tbW9uX2ZsYWdzICYgKFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfAorCQkJCSAgICAgICBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyk7CisJCWRhdGEgPSBjb21tb25fZmxhZ3MgJiAoVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0ggfAorCQkJCSAgICAgICBWNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XKTsKKwkJbW9kZSA9IGNvbW1vbl9mbGFncyAmIChWNEwyX01CVVNfTUFTVEVSIHwgVjRMMl9NQlVTX1NMQVZFKTsKKwkJcmV0dXJuICghaHN5bmMgfHwgIXZzeW5jIHx8ICFwY2xrIHx8ICFkYXRhIHx8ICFtb2RlKSA/CisJCQkwIDogY29tbW9uX2ZsYWdzOworCWNhc2UgVjRMMl9NQlVTX0NTSTI6CisJCW1pcGlfbGFuZXMgPSBjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfQ1NJMl9MQU5FUzsKKwkJbWlwaV9jbG9jayA9IGNvbW1vbl9mbGFncyAmIChWNEwyX01CVVNfQ1NJMl9OT05DT05USU5VT1VTX0NMT0NLIHwKKwkJCQkJICAgICBWNEwyX01CVVNfQ1NJMl9DT05USU5VT1VTX0NMT0NLKTsKKwkJcmV0dXJuICghbWlwaV9sYW5lcyB8fCAhbWlwaV9jbG9jaykgPyAwIDogY29tbW9uX2ZsYWdzOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc29jX21idXNfY29uZmlnX2NvbXBhdGlibGUpOworCiBzdGF0aWMgaW50IF9faW5pdCBzb2NfbWJ1c19pbml0KHZvaWQpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NyMDMwcGMzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zcjAzMHBjMzAuYwppbmRleCA4YWZiMGU4Li5kMWIwN2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NyMDMwcGMzMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3IwMzBwYzMwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgpAQCAtNzE0LDExICs3MTUsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc3IwMzBwYzMwX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgc3IwMzBwYzMwX3NfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKQEAgLTc2NCw3ICs3NjAsNiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgc3IwMzBwYzMwX3ZpZGVvX29wcyA9IHsKLQkuc19zdHJlYW0JPSBzcjAzMHBjMzBfc19zdHJlYW0sCiAJLmdfbWJ1c19mbXQJPSBzcjAzMHBjMzBfZ19mbXQsCiAJLnNfbWJ1c19mbXQJPSBzcjAzMHBjMzBfc19mbXQsCiAJLnRyeV9tYnVzX2ZtdAk9IHNyMDMwcGMzMF90cnlfZm10LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0ay13ZWJjYW0uYwppbmRleCBkMWEyY2VmLi5jYmMxMDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0ay13ZWJjYW0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0ay13ZWJjYW0uYwpAQCAtNTUsNiArNTUsOCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTeW50ZWsgREMxMTI1IHdlYmNhbSBkcml2ZXIiKTsKIAogCisvKiBib29sIGZvciB3ZWJjYW0gTEVEIG1hbmFnZW1lbnQgKi8KK2ludCBmaXJzdF9pbml0ID0gMTsKIAogLyogU29tZSBjYW1lcmFzIGhhdmUgYXVkaW8gaW50ZXJmYWNlcywgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhvc2UgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBzdGt3ZWJjYW1fdGFibGVbXSA9IHsKQEAgLTUxOCw3ICs1MjAsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWZvciAoaSA9IDA7IGkgPCBuX3NidWZzOyBpKyspIHsKIAkJCWlmIChzdGtfc2V0dXBfc2lvYnVmKGRldiwgaSkpCi0JCQkJcmV0dXJuIChkZXYtPm5fc2J1ZnMgPiAxKT8gMCA6IC1FTk9NRU07CisJCQkJcmV0dXJuIChkZXYtPm5fc2J1ZnMgPiAxID8gMCA6IC1FTk9NRU0pOwogCQkJZGV2LT5uX3NidWZzID0gaSsxOwogCQl9CiAJfQpAQCAtNTU4LDkgKzU2MCwxNCBAQAogCXZkZXYgPSB2aWRlb19kZXZkYXRhKGZwKTsKIAlkZXYgPSB2ZGV2X3RvX2NhbWVyYSh2ZGV2KTsKIAotCWlmIChkZXYgPT0gTlVMTCB8fCAhaXNfcHJlc2VudChkZXYpKSB7CisJaWYgKGRldiA9PSBOVUxMIHx8ICFpc19wcmVzZW50KGRldikpCiAJCXJldHVybiAtRU5YSU87Ci0JfQorCisJaWYgKCFmaXJzdF9pbml0KQorCQlzdGtfY2FtZXJhX3dyaXRlX3JlZyhkZXYsIDB4MCwgMHgyNCk7CisJZWxzZQorCQlmaXJzdF9pbml0ID0gMDsKKwogCWZwLT5wcml2YXRlX2RhdGEgPSBkZXY7CiAJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGRldi0+aW50ZXJmYWNlKTsKIApAQCAtNTc0LDEwICs1ODEsMTIgQEAKIAlpZiAoZGV2LT5vd25lciA9PSBmcCkgewogCQlzdGtfc3RvcF9zdHJlYW0oZGV2KTsKIAkJc3RrX2ZyZWVfYnVmZmVycyhkZXYpOworCQlzdGtfY2FtZXJhX3dyaXRlX3JlZyhkZXYsIDB4MCwgMHg0OSk7IC8qIHR1cm4gb2ZmIHRoZSBMRUQgKi8KKwkJdW5zZXRfaW5pdGlhbGlzZWQoZGV2KTsKIAkJZGV2LT5vd25lciA9IE5VTEw7CiAJfQogCi0JaWYoaXNfcHJlc2VudChkZXYpKQorCWlmIChpc19wcmVzZW50KGRldikpCiAJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShkZXYtPmludGVyZmFjZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTY1NCw3ICs2NjMsNyBAQAogCQlyZXR1cm4gUE9MTEVSUjsKIAogCWlmICghbGlzdF9lbXB0eSgmZGV2LT5zaW9fZnVsbCkpCi0JCXJldHVybiAoUE9MTElOIHwgUE9MTFJETk9STSk7CisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04OTEsOSArOTAwLDkgQEAKIAlzdHJ1Y3Qgc3RrX2NhbWVyYSAqZGV2ID0gcHJpdjsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0a19zaXplcykKLQkJCSYmIHN0a19zaXplc1tpXS5tICE9IGRldi0+dnNldHRpbmdzLm1vZGU7Ci0JCWkrKyk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RrX3NpemVzKSAmJgorCQkJc3RrX3NpemVzW2ldLm0gIT0gZGV2LT52c2V0dGluZ3MubW9kZTsgaSsrKQorCQk7CiAJaWYgKGkgPT0gQVJSQVlfU0laRShzdGtfc2l6ZXMpKSB7CiAJCVNUS19FUlJPUigiRVJST1I6IG1vZGUgaW52YWxpZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTMwNSw5ICsxMzE0LDggQEAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKIAogCWVyciA9IHN0a19yZWdpc3Rlcl92aWRlb19kZXZpY2UoZGV2KTsKLQlpZiAoZXJyKSB7CisJaWYgKGVycikKIAkJZ290byBlcnJvcjsKLQl9CiAKIAlyZXR1cm4gMDsKIApAQCAtMTM1MCw2ICsxMzU4LDcgQEAKIAkJcmV0dXJuIDA7CiAJdW5zZXRfaW5pdGlhbGlzZWQoZGV2KTsKIAlzdGtfaW5pdGlhbGlzZShkZXYpOworCXN0a19jYW1lcmFfd3JpdGVfcmVnKGRldiwgMHgwLCAweDQ5KTsKIAlzdGtfc2V0dXBfZm9ybWF0KGRldik7CiAJaWYgKGlzX3N0cmVhbWluZyhkZXYpKQogCQlzdGtfc3RhcnRfc3RyZWFtKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RjbTgyNXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGNtODI1eC5jCmluZGV4IGI2ZWUxYmQuLjQ2MmNhYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGNtODI1eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGNtODI1eC5jCkBAIC0yNyw2ICsyNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW50LWRldmljZS5oPgogCiAjaW5jbHVkZSAidGNtODI1eC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90aW1ibG9naXcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGltYmxvZ2l3LmMKaW5kZXggODRjZDFiNi4uYTA4OTViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90aW1ibG9naXcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RpbWJsb2dpdy5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1jb250aWcuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGxnMjMwMC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGxnMjMwMC9NYWtlZmlsZQppbmRleCA4MWJiN2ZkLi5lYTA5YjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL01ha2VmaWxlCkBAIC0yLDggKzIsOCBAQAogCiBvYmotJChDT05GSUdfVklERU9fVExHMjMwMCkgKz0gcG9zZWlkb24ubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC9LY29uZmlnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvdG02MDAwL0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9NYWtlZmlsZQpyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtYWxzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjc1YzcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWFsc2EuYwpAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqCisgKiAgU3VwcG9ydCBmb3IgYXVkaW8gY2FwdHVyZSBmb3IgdG01NjAwLzYwMDAvNjAxMAorICogICAgKGMpIDIwMDctMjAwOCBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KKyAqCisgKiAgQmFzZWQgb24gY3g4OC1hbHNhLmMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisKKyNpbmNsdWRlICJ0bTYwMDAuaCIKKyNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgorCisjdW5kZWYgZHByaW50aworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKSBkbyB7CQkJCSAgIFwKKwlpZiAoZGVidWcgPj0gbGV2ZWwpCQkJCQkJICAgXAorCQlwcmludGsoS0VSTl9JTkZPICIlcy8xOiAiIGZtdCwgY2hpcC0+Y29yZS0+bmFtZSAsICMjIGFyZyk7IFwKKwl9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJTW9kdWxlIGdsb2JhbCBzdGF0aWMgdmFycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCisKK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IHsxLCBbMSAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMX07CisKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgdG02MDAweCBzb3VuZGNhcmQuIGRlZmF1bHQgZW5hYmxlZC4iKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciB0bTYwMDB4IGNhcHR1cmUgaW50ZXJmYWNlKHMpLiIpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkJTW9kdWxlIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBkcml2ZXIgbW9kdWxlIGZvciB0bTU2MDAvdG02MDAwL3RtNjAxMCBiYXNlZCBUViBjYXJkcyIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tUcmlkZW50LHRtNTYwMH0sIgorCQkJInt7VHJpZGVudCx0bTYwMDB9LCIKKwkJCSJ7e1RyaWRlbnQsdG02MDEwfSIpOworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCU1vZHVsZSBzcGVjaWZpYyBmdW50aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBCT0FSRCBTcGVjaWZpYzogU2V0cyBhdWRpbyBETUEKKyAqLworCitzdGF0aWMgaW50IF90bTYwMDBfc3RhcnRfYXVkaW9fZG1hKHN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXApCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpjb3JlID0gY2hpcC0+Y29yZTsKKworCWRwcmludGsoMSwgIlN0YXJ0aW5nIGF1ZGlvIERNQVxuIik7CisKKwkvKiBFbmFibGVzIGF1ZGlvICovCisJdG02MDAwX3NldF9yZWdfbWFzayhjb3JlLCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9JRiwgMHg0MCwgMHg0MCk7CisKKwl0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoY29yZSwgNDgwMDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBCT0FSRCBTcGVjaWZpYzogUmVzZXRzIGF1ZGlvIERNQQorICovCitzdGF0aWMgaW50IF90bTYwMDBfc3RvcF9hdWRpb19kbWEoc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUgPSBjaGlwLT5jb3JlOworCisJZHByaW50aygxLCAiU3RvcHBpbmcgYXVkaW8gRE1BXG4iKTsKKworCS8qIERpc2FibGVzIGF1ZGlvICovCisJdG02MDAwX3NldF9yZWdfbWFzayhjb3JlLCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9JRiwgMHgwMCwgMHg0MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNwX2J1ZmZlcl9mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlkcHJpbnRrKDIsICJGcmVlaW5nIGJ1ZmZlclxuIik7CisKKwl2ZnJlZShzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKTsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9ieXRlcyA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZHNwX2J1ZmZlcl9hbGxvYyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IHNpemUpCit7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWRwcmludGsoMiwgIkFsbG9jYXRpbmcgYnVmZmVyXG4iKTsKKworCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKSB7CisJCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9ieXRlcyA+IHNpemUpCisJCQlyZXR1cm4gMDsKKworCQlkc3BfYnVmZmVyX2ZyZWUoc3Vic3RyZWFtKTsKKwl9CisKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gdm1hbGxvYyhzaXplKTsKKwlpZiAoIXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPSBzaXplOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCQlBTFNBIFBDTSBJbnRlcmZhY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRGlnaXRhbCBoYXJkd2FyZSBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgREVGQVVMVF9GSUZPX1NJWkUJNDA5NgorCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3RtNjAwMF9kaWdpdGFsX2h3ID0geworCS5pbmZvID0gU05EUlZfUENNX0lORk9fTU1BUCB8CisJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElELAorCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisKKwkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAorCS5yYXRlX21pbiA9IDQ4MDAwLAorCS5yYXRlX21heCA9IDQ4MDAwLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPSAxMjU0NCwKKwkucGVyaW9kc19taW4gPSAxLAorCS5wZXJpb2RzX21heCA9IDk4LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gNjI3MjAgKiA4LAorfTsKKworLyoKKyAqIGF1ZGlvIHBjbSBjYXB0dXJlIG9wZW4gY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfdG02MDAwX3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X3BvdzIocnVudGltZSwgMCwKKwkJCQkJIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfZXJyb3I7CisKKwljaGlwLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlydW50aW1lLT5odyA9IHNuZF90bTYwMDBfZGlnaXRhbF9odzsKKworCXJldHVybiAwOworX2Vycm9yOgorCWRwcmludGsoMSwgIkVycm9yIG9wZW5pbmcgUENNIVxuIik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGF1ZGlvIGNsb3NlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX3RtNjAwMF9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNoaXAtPmNvcmU7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNvcmUtPnN0cmVhbV9zdGFydGVkKSA+IDApIHsKKwkJYXRvbWljX3NldCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQsIDApOworCQlzY2hlZHVsZV93b3JrKCZjb3JlLT53cV90cmlnZ2VyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0bTYwMDBfZmlsbGJ1ZihzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IGNvcmUtPmFkZXY7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBjaGlwLT5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKKwlpbnQgcGVyaW9kX2VsYXBzZWQgPSAwOworCXVuc2lnbmVkIGludCBzdHJpZGUsIGJ1Zl9wb3M7CisJaW50IGxlbmd0aDsKKworCWlmIChhdG9taWNfcmVhZCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQpID09IDApCisJCXJldHVybiAwOworCisJaWYgKCFzaXplIHx8ICFzdWJzdHJlYW0pIHsKKwkJZHByaW50aygxLCAic3Vic3RyZWFtIHdhcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpZiAoIXJ1bnRpbWUgfHwgIXJ1bnRpbWUtPmRtYV9hcmVhKSB7CisJCWRwcmludGsoMSwgInJ1bnRpbWUgd2FzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidWZfcG9zID0gY2hpcC0+YnVmX3BvczsKKwlzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7CisKKwlpZiAoc3RyaWRlID09IDApIHsKKwkJZHByaW50aygxLCAic3RyaWRlIGlzIHplcm9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsZW5ndGggPSBzaXplIC8gc3RyaWRlOworCWlmIChsZW5ndGggPT0gMCkgeworCQlkcHJpbnRrKDEsICIlczogbGVuZ3RoIHdhcyB6ZXJvXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRwcmludGsoMSwgIkNvcHlpbmcgJWQgYnl0ZXMgYXQgJXBbJWRdIC0gYnVmIHNpemU9JWQgeCAlZFxuIiwgc2l6ZSwKKwkJcnVudGltZS0+ZG1hX2FyZWEsIGJ1Zl9wb3MsCisJCSh1bnNpZ25lZCBpbnQpcnVudGltZS0+YnVmZmVyX3NpemUsIHN0cmlkZSk7CisKKwlpZiAoYnVmX3BvcyArIGxlbmd0aCA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkgeworCQl1bnNpZ25lZCBpbnQgY250ID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBidWZfcG9zOworCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyBidWZfcG9zICogc3RyaWRlLCBidWYsIGNudCAqIHN0cmlkZSk7CisJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgYnVmICsgY250ICogc3RyaWRlLAorCQkJbGVuZ3RoICogc3RyaWRlIC0gY250ICogc3RyaWRlKTsKKwl9IGVsc2UKKwkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgYnVmX3BvcyAqIHN0cmlkZSwgYnVmLAorCQkJbGVuZ3RoICogc3RyaWRlKTsKKworCXNuZF9wY21fc3RyZWFtX2xvY2soc3Vic3RyZWFtKTsKKworCWNoaXAtPmJ1Zl9wb3MgKz0gbGVuZ3RoOworCWlmIChjaGlwLT5idWZfcG9zID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCQljaGlwLT5idWZfcG9zIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCisJY2hpcC0+cGVyaW9kX3BvcyArPSBsZW5ndGg7CisJaWYgKGNoaXAtPnBlcmlvZF9wb3MgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKKwkJY2hpcC0+cGVyaW9kX3BvcyAtPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwkJcGVyaW9kX2VsYXBzZWQgPSAxOworCX0KKworCXNuZF9wY21fc3RyZWFtX3VubG9jayhzdWJzdHJlYW0pOworCisJaWYgKHBlcmlvZF9lbGFwc2VkKQorCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGh3X3BhcmFtcyBjYWxsYmFjaworICovCitzdGF0aWMgaW50IHNuZF90bTYwMDBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCit7CisJaW50IHNpemUsIHJjOworCisJc2l6ZSA9IHBhcmFtc19wZXJpb2RfYnl0ZXMoaHdfcGFyYW1zKSAqIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyk7CisKKwlyYyA9IGRzcF9idWZmZXJfYWxsb2Moc3Vic3RyZWFtLCBzaXplKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGh3IGZyZWUgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfdG02MDAwX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUgPSBjaGlwLT5jb3JlOworCisJaWYgKGF0b21pY19yZWFkKCZjb3JlLT5zdHJlYW1fc3RhcnRlZCkgPiAwKSB7CisJCWF0b21pY19zZXQoJmNvcmUtPnN0cmVhbV9zdGFydGVkLCAwKTsKKwkJc2NoZWR1bGVfd29yaygmY29yZS0+d3FfdHJpZ2dlcik7CisJfQorCisJZHNwX2J1ZmZlcl9mcmVlKHN1YnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX3RtNjAwMF9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwljaGlwLT5idWZfcG9zID0gMDsKKwljaGlwLT5wZXJpb2RfcG9zID0gMDsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiB0cmlnZ2VyIGNhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIGF1ZGlvX3RyaWdnZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdG02MDAwX2NvcmUsCisJCQkJCQl3cV90cmlnZ2VyKTsKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gY29yZS0+YWRldjsKKworCWlmIChhdG9taWNfcmVhZCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQpKSB7CisJCWRwcmludGsoMSwgInN0YXJ0aW5nIGNhcHR1cmUiKTsKKwkJX3RtNjAwMF9zdGFydF9hdWRpb19kbWEoY2hpcCk7CisJfSBlbHNlIHsKKwkJZHByaW50aygxLCAic3RvcHBpbmcgY2FwdHVyZSIpOworCQlfdG02MDAwX3N0b3BfYXVkaW9fZG1hKGNoaXApOworCX0KK30KKworc3RhdGljIGludCBzbmRfdG02MDAwX2NhcmRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNoaXAtPmNvcmU7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWF0b21pY19zZXQoJmNvcmUtPnN0cmVhbV9zdGFydGVkLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlhdG9taWNfc2V0KCZjb3JlLT5zdHJlYW1fc3RhcnRlZCwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlzY2hlZHVsZV93b3JrKCZjb3JlLT53cV90cmlnZ2VyKTsKKworCXJldHVybiBlcnI7Cit9CisvKgorICogcG9pbnRlciBjYWxsYmFjaworICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3RtNjAwMF9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlyZXR1cm4gY2hpcC0+YnVmX3BvczsKK30KKworLyoKKyAqIG9wZXJhdG9ycworICovCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90bTYwMDBfcGNtX29wcyA9IHsKKwkub3BlbiA9IHNuZF90bTYwMDBfcGNtX29wZW4sCisJLmNsb3NlID0gc25kX3RtNjAwMF9jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gc25kX3RtNjAwMF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPSBzbmRfdG02MDAwX2h3X2ZyZWUsCisJLnByZXBhcmUgPSBzbmRfdG02MDAwX3ByZXBhcmUsCisJLnRyaWdnZXIgPSBzbmRfdG02MDAwX2NhcmRfdHJpZ2dlciwKKwkucG9pbnRlciA9IHNuZF90bTYwMDBfcG9pbnRlciwKK307CisKKy8qCisgKiBjcmVhdGUgYSBQQ00gZGV2aWNlCisgKi8KKworLyogRklYTUU6IENvbnRyb2wgaW50ZXJmYWNlIC0gSG93IHRvIGNvbnRyb2wgdm9sdW1lL211dGU/ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlCYXNpYyBGbG93IGZvciBTb3VuZCBEZXZpY2VzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEFsc2EgQ29uc3RydWN0b3IgLSBDb21wb25lbnQgcHJvYmUKKyAqLworc3RhdGljIGludCB0bTYwMDBfYXVkaW9faW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQJCSpjYXJkOworCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQJKmNoaXA7CisJaW50CQkJcmM7CisJc3RhdGljIGludAkJZGV2bnI7CisJY2hhcgkJCWNvbXBvbmVudFsxNF07CisJc3RydWN0IHNuZF9wY20JCSpwY207CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGV2bnIgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFlbmFibGVbZGV2bnJdKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJjID0gc25kX2NhcmRfY3JlYXRlKGluZGV4W2Rldm5yXSwgInRtNjAwMCIsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CisJaWYgKHJjIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgY3JlYXRlIGNhcmQgaW5zdGFuY2UgJWRcbiIsIGRldm5yKTsKKwkJcmV0dXJuIHJjOworCX0KKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAidG02MDAwLWFsc2EiKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiVE01NjAwLzYweDAiKTsKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiVE01NjAwLzYweDAgQXVkaW8gYXQgYnVzICVkIGRldmljZSAlZCIsCisJCWRldi0+dWRldi0+YnVzLT5idXNudW0sIGRldi0+dWRldi0+ZGV2bnVtKTsKKworCXNwcmludGYoY29tcG9uZW50LCAiVVNCJTA0eDolMDR4IiwKKwkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOworCXNuZF9jb21wb25lbnRfYWRkKGNhcmQsIGNvbXBvbmVudCk7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT51ZGV2LT5kZXYpOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfdG02MDAwX2NhcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWNoaXAtPmNvcmUgPSBkZXY7CisJY2hpcC0+Y2FyZCA9IGNhcmQ7CisJZGV2LT5hZGV2ID0gY2hpcDsKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOworCisJcmMgPSBzbmRfcGNtX25ldyhjYXJkLCAiVE02MDAwIEF1ZGlvIiwgMCwgMCwgMSwgJnBjbSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJvcl9jaGlwOworCisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJc3RyY3B5KHBjbS0+bmFtZSwgIlRyaWRlbnQgVE01NjAwLzYweDAiKTsKKworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF90bTYwMDBfcGNtX29wcyk7CisKKwlJTklUX1dPUksoJmRldi0+d3FfdHJpZ2dlciwgYXVkaW9fdHJpZ2dlcik7CisJcmMgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycm9yX2NoaXA7CisKKwlkcHJpbnRrKDEsICJSZWdpc3RlcmVkIGF1ZGlvIGRyaXZlciBmb3IgJXNcbiIsIGNhcmQtPmxvbmduYW1lKTsKKworCXJldHVybiAwOworCitlcnJvcl9jaGlwOgorCWtmcmVlKGNoaXApOworCWRldi0+YWRldiA9IE5VTEw7CitlcnJvcjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0bTYwMDBfYXVkaW9fZmluaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkCSpjaGlwID0gZGV2LT5hZGV2OworCisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJaWYgKCFjaGlwKQorCQlyZXR1cm4gMDsKKworCWlmICghY2hpcC0+Y2FyZCkKKwkJcmV0dXJuIDA7CisKKwlzbmRfY2FyZF9mcmVlKGNoaXAtPmNhcmQpOworCWNoaXAtPmNhcmQgPSBOVUxMOworCWtmcmVlKGNoaXApOworCWRldi0+YWRldiA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0bTYwMDBfb3BzIGF1ZGlvX29wcyA9IHsKKwkudHlwZQk9IFRNNjAwMF9BVURJTywKKwkubmFtZQk9ICJUTTYwMDAgQXVkaW8gRXh0ZW5zaW9uIiwKKwkuaW5pdAk9IHRtNjAwMF9hdWRpb19pbml0LAorCS5maW5pCT0gdG02MDAwX2F1ZGlvX2ZpbmksCisJLmZpbGxidWYgPSB0bTYwMDBfZmlsbGJ1ZiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRtNjAwMF9hbHNhX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIHRtNjAwMF9yZWdpc3Rlcl9leHRlbnNpb24oJmF1ZGlvX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0bTYwMDBfYWxzYV91bnJlZ2lzdGVyKHZvaWQpCit7CisJdG02MDAwX3VucmVnaXN0ZXJfZXh0ZW5zaW9uKCZhdWRpb19vcHMpOworfQorCittb2R1bGVfaW5pdCh0bTYwMDBfYWxzYV9yZWdpc3Rlcik7Cittb2R1bGVfZXhpdCh0bTYwMDBfYWxzYV91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWNhcmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyNTc4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1jYXJkcy5jCkBAIC0wLDAgKzEsMTQwMiBAQAorLyoKKyAqICB0bTYwMDAtY2FyZHMuYyAtIGRyaXZlciBmb3IgVE01NjAwL1RNNjAwMC9UTTYwMTAgVVNCIHZpZGVvIGNhcHR1cmUgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS90dmF1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvaTJjLWFkZHIuaD4KKyNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKworI2luY2x1ZGUgInRtNjAwMC5oIgorI2luY2x1ZGUgInRtNjAwMC1yZWdzLmgiCisjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCisjaW5jbHVkZSAieGM1MDAwLmgiCisKKyNkZWZpbmUgVE02MDAwX0JPQVJEX1VOS05PV04JCQkwCisjZGVmaW5lIFRNNTYwMF9CT0FSRF9HRU5FUklDCQkJMQorI2RlZmluZSBUTTYwMDBfQk9BUkRfR0VORVJJQwkJCTIKKyNkZWZpbmUgVE02MDEwX0JPQVJEX0dFTkVSSUMJCQkzCisjZGVmaW5lIFRNNTYwMF9CT0FSRF8xME1PT05TX1VUODIxCQk0CisjZGVmaW5lIFRNNTYwMF9CT0FSRF8xME1PT05TX1VUMzMwCQk1CisjZGVmaW5lIFRNNjAwMF9CT0FSRF9BRFNURUNIX0RVQUxfVFYJCTYKKyNkZWZpbmUgVE02MDAwX0JPQVJEX0ZSRUVDT01fQU5EX1NJTUlMQVIJNworI2RlZmluZSBUTTYwMDBfQk9BUkRfQURTVEVDSF9NSU5JX0RVQUxfVFYJOAorI2RlZmluZSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEgJCTkKKyNkZWZpbmUgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVIJCTEwCisjZGVmaW5lIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUgkJMTEKKyNkZWZpbmUgVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFCTEyCisjZGVmaW5lIFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxCQkxMworI2RlZmluZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUl9MSVRFCQkxNAorI2RlZmluZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURQkxNQorI2RlZmluZSBUTTU2MDBfQk9BUkRfVEVSUkFURUNfR1JBQlNURVIJCTE2CisKKyNkZWZpbmUgaXNfZ2VuZXJpYyhtb2RlbCkgKChtb2RlbCA9PSBUTTYwMDBfQk9BUkRfVU5LTk9XTikgfHwgXAorCQkJICAgKG1vZGVsID09IFRNNTYwMF9CT0FSRF9HRU5FUklDKSB8fCBcCisJCQkgICAobW9kZWwgPT0gVE02MDAwX0JPQVJEX0dFTkVSSUMpIHx8IFwKKwkJCSAgIChtb2RlbCA9PSBUTTYwMTBfQk9BUkRfR0VORVJJQykpCisKKyNkZWZpbmUgVE02MDAwX01BWEJPQVJEUyAgICAgICAgMTYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtdICAgICA9IHtbMCAuLi4gKFRNNjAwMF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkoY2FyZCwgIGludCwgTlVMTCwgMDQ0NCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRtNjAwMF9kZXZ1c2VkOworCisKK3N0cnVjdCB0bTYwMDBfYm9hcmQgeworCWNoYXIgICAgICAgICAgICAqbmFtZTsKKwljaGFyCQllZW5hbWVbMTZdOwkJLyogRUVQUk9NIG5hbWUgKi8KKwl1bnNpZ25lZAllZW5hbWVfc2l6ZTsJCS8qIHNpemUgb2YgRUVQUk9NIG5hbWUgKi8KKwl1bnNpZ25lZAllZW5hbWVfcG9zOwkJLyogUG9zaXRpb24gd2hlcmUgaXQgYXBwZWFycyBhdCBST00gKi8KKworCXN0cnVjdCB0bTYwMDBfY2FwYWJpbGl0aWVzIGNhcHM7CisKKwllbnVtCQl0bTYwMDBfZGV2dHlwZSB0eXBlOwkvKiB2YXJpYW50IG9mIHRoZSBjaGlwc2V0ICovCisJaW50ICAgICAgICAgICAgIHR1bmVyX3R5cGU7ICAgICAvKiB0eXBlIG9mIHRoZSB0dW5lciAqLworCWludCAgICAgICAgICAgICB0dW5lcl9hZGRyOyAgICAgLyogdHVuZXIgYWRkcmVzcyAqLworCWludCAgICAgICAgICAgICBkZW1vZF9hZGRyOyAgICAgLyogZGVtb2R1bGF0b3IgYWRkcmVzcyAqLworCisJc3RydWN0IHRtNjAwMF9ncGlvIGdwaW87CisKKwlzdHJ1Y3QgdG02MDAwX2lucHV0CXZpbnB1dFszXTsKKwlzdHJ1Y3QgdG02MDAwX2lucHV0CXJpbnB1dDsKKworCWNoYXIJCSppcl9jb2RlczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX2JvYXJkIHRtNjAwMF9ib2FyZHNbXSA9IHsKKwlbVE02MDAwX0JPQVJEX1VOS05PV05dID0geworCQkubmFtZSAgICAgICAgID0gIlVua25vd24gdG02MDAwIHZpZGVvIGdyYWJiZXIiLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIJPSAxLAorCQkJLmhhc19lZXByb20JPSAxLAorCQl9LAorCQkuZ3BpbyA9IHsKKwkJCS50dW5lcl9yZXNldAk9IFRNNjAwMF9HUElPXzEsCisJCX0sCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LAorCQl9LAorCX0sCisJW1RNNTYwMF9CT0FSRF9HRU5FUklDXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICJHZW5lcmljIHRtNTYwMCBib2FyZCIsCisJCS50eXBlICAgICAgICAgPSBUTTU2MDAsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCisJCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCisJCS5jYXBzID0geworCQkJLmhhc190dW5lcgk9IDEsCisJCQkuaGFzX2VlcHJvbQk9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDAwX0dQSU9fMSwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJfSwKKwlbVE02MDAwX0JPQVJEX0dFTkVSSUNdID0geworCQkubmFtZSAgICAgICAgID0gIkdlbmVyaWMgdG02MDAwIGJvYXJkIiwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyCT0gMSwKKwkJCS5oYXNfZWVwcm9tCT0gMSwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMDBfR1BJT18xLAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwl9LAorCVtUTTYwMTBfQk9BUkRfR0VORVJJQ10gPSB7CisJCS5uYW1lICAgICAgICAgPSAiR2VuZXJpYyB0bTYwMTAgYm9hcmQiLAorCQkudHlwZSAgICAgICAgID0gVE02MDEwLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIJPSAxLAorCQkJLmhhc19kdmIJPSAxLAorCQkJLmhhc196bDEwMzUzCT0gMSwKKwkJCS5oYXNfZWVwcm9tCT0gMSwKKwkJCS5oYXNfcmVtb3RlCT0gMSwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18yLAorCQkJLnR1bmVyX29uCT0gVE02MDEwX0dQSU9fMywKKwkJCS5kZW1vZF9yZXNldAk9IFRNNjAxMF9HUElPXzEsCisJCQkuZGVtb2Rfb24JPSBUTTYwMTBfR1BJT180LAorCQkJLnBvd2VyX2xlZAk9IFRNNjAxMF9HUElPXzcsCisJCQkuZHZiX2xlZAk9IFRNNjAxMF9HUElPXzUsCisJCQkuaXIJCT0gVE02MDEwX0dQSU9fMCwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJfSwKKwlbVE01NjAwX0JPQVJEXzEwTU9PTlNfVVQ4MjFdID0geworCQkubmFtZSAgICAgICAgID0gIjEwTW9vbnMgVVQgODIxIiwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLmVlbmFtZSAgICAgICA9IHsgJzEnLCAnMCcsICdNJywgJ08nLCAnTycsICdOJywgJ1MnLCAnNScsICc2JywgJzAnLCAnMCcsIDB4ZmYsIDB4NDUsIDB4NWJ9LAorCQkuZWVuYW1lX3NpemUgID0gMTQsCisJCS5lZW5hbWVfcG9zICAgPSAweDE0LAorCQkudHlwZSAgICAgICAgID0gVE01NjAwLAorCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgPSAxLAorCQkJLmhhc19lZXByb20gICA9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDAwX0dQSU9fMSwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJfSwKKwlbVE01NjAwX0JPQVJEXzEwTU9PTlNfVVQzMzBdID0geworCQkubmFtZSAgICAgICAgID0gIjEwTW9vbnMgVVQgMzMwIiwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1BISUxJUFNfRlExMjE2QU1FX01LNCwKKwkJLnR1bmVyX2FkZHIgICA9IDB4YzggPj4gMSwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyICAgID0gMSwKKwkJCS5oYXNfZHZiICAgICAgPSAwLAorCQkJLmhhc196bDEwMzUzICA9IDAsCisJCQkuaGFzX2VlcHJvbSAgID0gMSwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJfSwKKwlbVE02MDAwX0JPQVJEX0FEU1RFQ0hfRFVBTF9UVl0gPSB7CisJCS5uYW1lICAgICAgICAgPSAiQURTVEVDSCBEdWFsIFRWIFVTQiIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCisJCS50dW5lcl9hZGRyICAgPSAweGM4ID4+IDEsCisJCS5jYXBzID0geworCQkJLmhhc190dW5lciAgICA9IDEsCisJCQkuaGFzX3RkYTk4NzQgID0gMSwKKwkJCS5oYXNfZHZiICAgICAgPSAxLAorCQkJLmhhc196bDEwMzUzICA9IDEsCisJCQkuaGFzX2VlcHJvbSAgID0gMSwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJfSwKKwlbVE02MDAwX0JPQVJEX0ZSRUVDT01fQU5EX1NJTUlMQVJdID0geworCQkubmFtZSAgICAgICAgID0gIkZyZWVjb20gSHlicmlkIFN0aWNrIC8gTW9rYSBEVkItVCBSZWNlaXZlciBEdWFsIiwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwgLyogaGFzIGEgWEMzMDI4ICovCisJCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCisJCS5kZW1vZF9hZGRyICAgPSAweDFlID4+IDEsCisJCS5jYXBzID0geworCQkJLmhhc190dW5lciAgICA9IDEsCisJCQkuaGFzX2R2YiAgICAgID0gMSwKKwkJCS5oYXNfemwxMDM1MyAgPSAxLAorCQkJLmhhc19lZXByb20gICA9IDAsCisJCQkuaGFzX3JlbW90ZSAgID0gMSwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMDBfR1BJT180LAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwl9LAorCVtUTTYwMDBfQk9BUkRfQURTVEVDSF9NSU5JX0RVQUxfVFZdID0geworCQkubmFtZSAgICAgICAgID0gIkFEU1RFQ0ggTWluaSBEdWFsIFRWIFVTQiIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsIC8qIGhhcyBhIFhDMzAyOCAqLworCQkudHVuZXJfYWRkciAgID0gMHhjOCA+PiAxLAorCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgPSAxLAorCQkJLmhhc19kdmIgICAgICA9IDEsCisJCQkuaGFzX3psMTAzNTMgID0gMSwKKwkJCS5oYXNfZWVwcm9tICAgPSAwLAorCQl9LAorCQkuZ3BpbyA9IHsKKwkJCS50dW5lcl9yZXNldAk9IFRNNjAwMF9HUElPXzQsCisJCX0sCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LAorCQl9LAorCX0sCisJW1RNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSF0gPSB7CisJCS5uYW1lICAgICAgICAgPSAiSGF1cHBhdWdlIFdpblRWIEhWUi05MDBIIC8gV2luVFYgVVNCMi1TdGljayIsCisJCS5lZW5hbWUgICAgICAgPSB7ICdIJywgMCwgJ1YnLCAwLCAnUicsIDAsICc5JywgMCwgJzAnLCAwLCAnMCcsIDAsICdIJywgMCB9LAorCQkuZWVuYW1lX3NpemUgID0gMTQsCisJCS5lZW5hbWVfcG9zICAgPSAweDQyLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LCAvKiBoYXMgYSBYQzMwMjggKi8KKwkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKKwkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKKwkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyICAgID0gMSwKKwkJCS5oYXNfZHZiICAgICAgPSAxLAorCQkJLmhhc196bDEwMzUzICA9IDEsCisJCQkuaGFzX2VlcHJvbSAgID0gMSwKKwkJCS5oYXNfcmVtb3RlICAgPSAxLAorCQl9LAorCQkuZ3BpbyA9IHsKKwkJCS50dW5lcl9yZXNldAk9IFRNNjAxMF9HUElPXzIsCisJCQkudHVuZXJfb24JPSBUTTYwMTBfR1BJT18zLAorCQkJLmRlbW9kX3Jlc2V0CT0gVE02MDEwX0dQSU9fMSwKKwkJCS5kZW1vZF9vbgk9IFRNNjAxMF9HUElPXzQsCisJCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNywKKwkJCS5kdmJfbGVkCT0gVE02MDEwX0dQSU9fNSwKKwkJCS5pcgkJPSBUTTYwMTBfR1BJT18wLAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfU0lGMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwl9LAorCVtUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUl0gPSB7CisJCS5uYW1lICAgICAgICAgPSAiQmVob2xkZXIgV2FuZGVyIERWQi1UL1RWL0ZNIFVTQjIuMCIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzUwMDAsCisJCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCisJCS5kZW1vZF9hZGRyICAgPSAweDFlID4+IDEsCisJCS50eXBlICAgICAgICAgPSBUTTYwMTAsCisJCS5jYXBzID0geworCQkJLmhhc190dW5lciAgICAgID0gMSwKKwkJCS5oYXNfZHZiICAgICAgICA9IDEsCisJCQkuaGFzX3psMTAzNTMgICAgPSAxLAorCQkJLmhhc19lZXByb20gICAgID0gMSwKKwkJCS5oYXNfcmVtb3RlICAgICA9IDEsCisJCQkuaGFzX3JhZGlvCT0gMSwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18wLAorCQkJLmRlbW9kX3Jlc2V0CT0gVE02MDEwX0dQSU9fMSwKKwkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT182LAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfU0lGMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwkJLnJpbnB1dCA9IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1JBRElPLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQl9LAorCX0sCisJW1RNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUl0gPSB7CisJCS5uYW1lICAgICAgICAgPSAiQmVob2xkZXIgVm95YWdlciBUVi9GTSBVU0IyLjAiLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEM1MDAwLAorCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkudHlwZSAgICAgICAgID0gVE02MDEwLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgICA9IDEsCisJCQkuaGFzX2R2YiAgICAgICAgPSAwLAorCQkJLmhhc196bDEwMzUzICAgID0gMCwKKwkJCS5oYXNfZWVwcm9tICAgICA9IDEsCisJCQkuaGFzX3JlbW90ZSAgICAgPSAxLAorCQkJLmhhc19yYWRpbwk9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMCwKKwkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT182LAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfU0lGMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwkJLnJpbnB1dCA9IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1JBRElPLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQl9LAorCX0sCisJW1RNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRV0gPSB7CisJCS5uYW1lICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSBIeWJyaWQgWEUgLyBDaW5lcmd5IEh5YnJpZC1TdGljayIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsIC8qIGhhcyBhIFhDMzAyOCAqLworCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAorCQkudHlwZSAgICAgICAgID0gVE02MDEwLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgPSAxLAorCQkJLmhhc19kdmIgICAgICA9IDEsCisJCQkuaGFzX3psMTAzNTMgID0gMSwKKwkJCS5oYXNfZWVwcm9tICAgPSAxLAorCQkJLmhhc19yZW1vdGUgICA9IDEsCisJCQkuaGFzX3JhZGlvICAgID0gMSwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18yLAorCQkJLnR1bmVyX29uCT0gVE02MDEwX0dQSU9fMywKKwkJCS5kZW1vZF9yZXNldAk9IFRNNjAxMF9HUElPXzEsCisJCQkuZGVtb2Rfb24JPSBUTTYwMTBfR1BJT180LAorCQkJLnBvd2VyX2xlZAk9IFRNNjAxMF9HUElPXzcsCisJCQkuZHZiX2xlZAk9IFRNNjAxMF9HUElPXzUsCisJCQkuaXIJCT0gVE02MDEwX0dQSU9fMCwKKwkJfSwKKwkJLmlyX2NvZGVzID0gUkNfTUFQX05FQ19URVJSQVRFQ19DSU5FUkdZX1hTLAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfU0lGMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwkJLnJpbnB1dCA9IHsKKwkJCS50eXBlID0gVE02MDAwX0lOUFVUX1JBRElPLAorCQkJLmFtdXggPSBUTTYwMDBfQU1VWF9TSUYxLAorCQl9LAorCX0sCisJW1RNNTYwMF9CT0FSRF9URVJSQVRFQ19HUkFCU1RFUl0gPSB7CisJCS5uYW1lICAgICAgICAgPSAiVGVycmF0ZWMgR3JhYnN0ZXIgQVYgMTUwLzI1MCBNWCIsCisJCS50eXBlICAgICAgICAgPSBUTTU2MDAsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9BQlNFTlQsCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LAorCQl9LAorCX0sCisJW1RNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICJUd2luaGFuIFRVNTAxKDcwNEQxKSIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsIC8qIGhhcyBhIFhDMzAyOCAqLworCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAorCQkudHlwZSAgICAgICAgID0gVE02MDEwLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgPSAxLAorCQkJLmhhc19kdmIgICAgICA9IDEsCisJCQkuaGFzX3psMTAzNTMgID0gMSwKKwkJCS5oYXNfZWVwcm9tICAgPSAxLAorCQkJLmhhc19yZW1vdGUgICA9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMiwKKwkJCS50dW5lcl9vbgk9IFRNNjAxMF9HUElPXzMsCisJCQkuZGVtb2RfcmVzZXQJPSBUTTYwMTBfR1BJT18xLAorCQkJLmRlbW9kX29uCT0gVE02MDEwX0dQSU9fNCwKKwkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT183LAorCQkJLmR2Yl9sZWQJPSBUTTYwMTBfR1BJT181LAorCQkJLmlyCQk9IFRNNjAxMF9HUElPXzAsCisJCX0sCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LAorCQl9LAorCX0sCisJW1RNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSX0xJVEVdID0geworCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFdhbmRlciBMaXRlIERWQi1UL1RWL0ZNIFVTQjIuMCIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzUwMDAsCisJCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCisJCS5kZW1vZF9hZGRyICAgPSAweDFlID4+IDEsCisJCS50eXBlICAgICAgICAgPSBUTTYwMTAsCisJCS5jYXBzID0geworCQkJLmhhc190dW5lciAgICAgID0gMSwKKwkJCS5oYXNfZHZiICAgICAgICA9IDEsCisJCQkuaGFzX3psMTAzNTMgICAgPSAxLAorCQkJLmhhc19lZXByb20gICAgID0gMSwKKwkJCS5oYXNfcmVtb3RlICAgICA9IDAsCisJCQkuaGFzX3JhZGlvCT0gMSwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18wLAorCQkJLmRlbW9kX3Jlc2V0CT0gVE02MDEwX0dQSU9fMSwKKwkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT182LAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfU0lGMSwKKwkJCX0sCisJCX0sCisJCS5yaW5wdXQgPSB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKKwkJfSwKKwl9LAorCVtUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURV0gPSB7CisJCS5uYW1lICAgICAgICAgPSAiQmVob2xkZXIgVm95YWdlciBMaXRlIFRWL0ZNIFVTQjIuMCIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzUwMDAsCisJCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCisJCS50eXBlICAgICAgICAgPSBUTTYwMTAsCisJCS5jYXBzID0geworCQkJLmhhc190dW5lciAgICAgID0gMSwKKwkJCS5oYXNfZHZiICAgICAgICA9IDAsCisJCQkuaGFzX3psMTAzNTMgICAgPSAwLAorCQkJLmhhc19lZXByb20gICAgID0gMSwKKwkJCS5oYXNfcmVtb3RlICAgICA9IDAsCisJCQkuaGFzX3JhZGlvCT0gMSwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18wLAorCQkJLnBvd2VyX2xlZAk9IFRNNjAxMF9HUElPXzYsCisJCX0sCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAorCQkJfSwKKwkJfSwKKwkJLnJpbnB1dCA9IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1JBRElPLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQl9LAorCX0sCit9OworCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdG02MDAwX2lkX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKDB4NjAwMCwgMHgwMDAxKSwgLmRyaXZlcl9pbmZvID0gVE01NjAwX0JPQVJEX0dFTkVSSUMgfSwKKwl7IFVTQl9ERVZJQ0UoMHg2MDAwLCAweDAwMDIpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfR0VORVJJQyB9LAorCXsgVVNCX0RFVklDRSgweDA2ZTEsIDB4ZjMzMiksIC5kcml2ZXJfaW5mbyA9IFRNNjAwMF9CT0FSRF9BRFNURUNIX0RVQUxfVFYgfSwKKwl7IFVTQl9ERVZJQ0UoMHgxNGFhLCAweDA2MjApLCAuZHJpdmVyX2luZm8gPSBUTTYwMDBfQk9BUkRfRlJFRUNPTV9BTkRfU0lNSUxBUiB9LAorCXsgVVNCX0RFVklDRSgweDA2ZTEsIDB4YjMzOSksIC5kcml2ZXJfaW5mbyA9IFRNNjAwMF9CT0FSRF9BRFNURUNIX01JTklfRFVBTF9UViB9LAorCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4NjYwMCksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSCB9LAorCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4NjYwMSksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSCB9LAorCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4NjYxMCksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSCB9LAorCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4NjYxMSksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSCB9LAorCXsgVVNCX0RFVklDRSgweDYwMDAsIDB4ZGVjMCksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSIH0sCisJeyBVU0JfREVWSUNFKDB4NjAwMCwgMHhkZWMxKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSIH0sCisJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgwMDg2KSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFIH0sCisJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgwMEE1KSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFIH0sCisJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgwMDc5KSwgLmRyaXZlcl9pbmZvID0gVE01NjAwX0JPQVJEX1RFUlJBVEVDX0dSQUJTVEVSIH0sCisJeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzMjQwKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDEgfSwKKwl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMyNDEpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMSB9LAorCXsgVVNCX0RFVklDRSgweDEzZDMsIDB4MzI0MyksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxIH0sCisJeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzMjY0KSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDEgfSwKKwl7IFVTQl9ERVZJQ0UoMHg2MDAwLCAweGRlYzIpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUl9MSVRFIH0sCisJeyBVU0JfREVWSUNFKDB4NjAwMCwgMHhkZWMzKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSX0xJVEUgfSwKKwl7IH0KK307CisKKy8qIENvbnRyb2wgcG93ZXIgbGVkIGZvciBzaG93IHNvbWUgYWN0aXZpdHkgKi8KK3ZvaWQgdG02MDAwX2ZsYXNoX2xlZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggc3RhdGUpCit7CisJLyogUG93ZXIgTEVEIHVuY29uZmlndXJlZCAqLworCWlmICghZGV2LT5ncGlvLnBvd2VyX2xlZCkKKwkJcmV0dXJuOworCisJLyogT04gUG93ZXIgTEVEICovCisJaWYgKHN0YXRlKSB7CisJCXN3aXRjaCAoZGV2LT5tb2RlbCkgeworCQljYXNlIFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSDoKKwkJY2FzZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEU6CisJCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJZGV2LT5ncGlvLnBvd2VyX2xlZCwgMHgwMCk7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUjoKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVI6CisJCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURToKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIE9GRiBQb3dlciBMRUQgKi8KKwllbHNlIHsKKwkJc3dpdGNoIChkZXYtPm1vZGVsKSB7CisJCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgorCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKKwkJY2FzZSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMToKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSOgorCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUjoKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUl9MSVRFOgorCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUl9MSVRFOgorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCWRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIFR1bmVyIGNhbGxiYWNrIHRvIHByb3ZpZGUgdGhlIHByb3BlciBncGlvIGNoYW5nZXMgbmVlZGVkIGZvciB4YzUwMDAgKi8KK2ludCB0bTYwMDBfeGM1MDAwX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IHB0cjsKKworCWlmIChkZXYtPnR1bmVyX3R5cGUgIT0gVFVORVJfWEM1MDAwKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgWEM1MDAwX1RVTkVSX1JFU0VUOgorCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKKwkJbXNsZWVwKDE1KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7CisJCW1zbGVlcCgxNSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDEpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3hjNTAwMF9jYWxsYmFjayk7CisKKy8qIFR1bmVyIGNhbGxiYWNrIHRvIHByb3ZpZGUgdGhlIHByb3BlciBncGlvIGNoYW5nZXMgbmVlZGVkIGZvciB4YzIwMjggKi8KKworaW50IHRtNjAwMF90dW5lcl9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBwdHI7CisKKwlpZiAoZGV2LT50dW5lcl90eXBlICE9IFRVTkVSX1hDMjAyOCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFhDMjAyOF9SRVNFVF9DTEs6CisJCXRtNjAwMF9pcl93YWl0KGRldiwgMCk7CisKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULAorCQkJCQkweDAyLCBhcmcpOworCQltc2xlZXAoMTApOworCQlyYyA9IHRtNjAwMF9pMmNfcmVzZXQoZGV2LCAxMCk7CisJCWJyZWFrOworCWNhc2UgWEMyMDI4X1RVTkVSX1JFU0VUOgorCQkvKiBSZXNldCBjb2RlcyBkdXJpbmcgbG9hZCBmaXJtd2FyZSAqLworCQlzd2l0Y2ggKGFyZykgeworCQljYXNlIDA6CisJCQkvKiBuZXdlciB0dW5lciBjYW4gZmFzdGVyIHJlc2V0ICovCisJCQlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKKwkJCWNhc2UgVE01NjAwX0JPQVJEXzEwTU9PTlNfVVQ4MjE6CisJCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKKwkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJCSAgICAgICAweDMwMCwgMHgwMSk7CisJCQkJbXNsZWVwKDEwKTsKKwkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDApOworCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQkJICAgICAgIDB4MzAwLCAweDAwKTsKKwkJCQltc2xlZXAoMTApOworCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMSk7CisJCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCQkgICAgICAgMHgzMDAsIDB4MDEpOworCQkJCWJyZWFrOworCQkJY2FzZSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEg6CisJCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKKwkJCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6CisJCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKKwkJCQltc2xlZXAoNjApOworCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7CisJCQkJbXNsZWVwKDc1KTsKKwkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDEpOworCQkJCW1zbGVlcCg2MCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7CisJCQkJbXNsZWVwKDEzMCk7CisJCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKKwkJCQltc2xlZXAoMTMwKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJdG02MDAwX2lyX3dhaXQoZGV2LCAxKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsCisJCQkJCQkweDAyLCAweDAxKTsKKwkJCW1zbGVlcCgxMCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcmMgPSB0bTYwMDBfaTJjX3Jlc2V0KGRldiwgMTAwKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgWEMyMDI4X0kyQ19GTFVTSDoKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfNTBfU0VUX1NUQVJULCAwLCAwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfNTFfU0VUX1NUT1AsIDAsIDApOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3R1bmVyX2NhbGxiYWNrKTsKKworaW50IHRtNjAwMF9jYXJkc19zZXR1cChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwkvKgorCSAqIEJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLiBIYW5kbGVzIGFsbCBHUElPCisJICogaW5pdGlhbGl6YXRpb24gc2VxdWVuY2VzIHRoYXQgYXJlIGJvYXJkLXNwZWNpZmljLgorCSAqIFVwIHRvIG5vdywgYWxsIGZvdW5kIGRldmljZXMgdXNlIEdQSU8xIGFuZCBHUElPNCBhdCB0aGUgc2FtZSB3YXkuCisJICogUHJvYmFibHksIHRoZXkncmUgYWxsIGJhc2VkIG9uIHNvbWUgcmVmZXJlbmNlIGRldmljZS4gRHVlIHRvIHRoYXQsCisJICogdGhlcmUncyBhIGNvbW1vbiByb3V0aW5lIGF0IHRoZSBlbmQgdG8gaGFuZGxlIHRob3NlIEdQSU8ncy4gRGV2aWNlcworCSAqIHRoYXQgdXNlIGRpZmZlcmVudCBwaW51cHMgb3IgaW5pdCBzZXF1ZW5jZXMgY2FuIGp1c3QgcmV0dXJuIGF0CisJICogdGhlIGJvYXJkLXNwZWNpZmljIHNlc3Npb24uCisJICovCisJc3dpdGNoIChkZXYtPm1vZGVsKSB7CisJY2FzZSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEg6CisJY2FzZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEU6CisJY2FzZSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMToKKwljYXNlIFRNNjAxMF9CT0FSRF9HRU5FUklDOgorCQkvKiBUdXJuIHhjZWl2ZSAzMDI4IG9uICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLnR1bmVyX29uLCAweDAxKTsKKwkJbXNsZWVwKDE1KTsKKwkJLyogVHVybiB6YXJsaW5rIHpsMTAzNTMgb24gKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2Rfb24sIDB4MDApOworCQltc2xlZXAoMTUpOworCQkvKiBSZXNldCB6YXJsaW5rIHpsMTAzNTMgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2RfcmVzZXQsIDB4MDApOworCQltc2xlZXAoNTApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kZW1vZF9yZXNldCwgMHgwMSk7CisJCW1zbGVlcCgxNSk7CisJCS8qIFR1cm4gemFybGluayB6bDEwMzUzIG9mZiAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kZW1vZF9vbiwgMHgwMSk7CisJCW1zbGVlcCgxNSk7CisJCS8qIGlyID8gKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uaXIsIDB4MDEpOworCQltc2xlZXAoMTUpOworCQkvKiBQb3dlciBsZWQgb24gKGJsdWUpICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLnBvd2VyX2xlZCwgMHgwMCk7CisJCW1zbGVlcCgxNSk7CisJCS8qIERWQiBsZWQgb2ZmIChvcmFuZ2UpICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmR2Yl9sZWQsIDB4MDEpOworCQltc2xlZXAoMTUpOworCQkvKiBUdXJuIHphcmxpbmsgemwxMDM1MyBvbiAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kZW1vZF9vbiwgMHgwMCk7CisJCW1zbGVlcCgxNSk7CisJCWJyZWFrOworCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVI6CisJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUl9MSVRFOgorCQkvKiBQb3dlciBsZWQgb24gKGJsdWUpICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLnBvd2VyX2xlZCwgMHgwMSk7CisJCW1zbGVlcCgxNSk7CisJCS8qIFJlc2V0IHphcmxpbmsgemwxMDM1MyAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kZW1vZF9yZXNldCwgMHgwMCk7CisJCW1zbGVlcCg1MCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmRlbW9kX3Jlc2V0LCAweDAxKTsKKwkJbXNsZWVwKDE1KTsKKwkJYnJlYWs7CisJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVI6CisJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURToKKwkJLyogUG93ZXIgbGVkIG9uIChibHVlKSAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDEpOworCQltc2xlZXAoMTUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKgorCSAqIERlZmF1bHQgaW5pdGlhbGl6YXRpb24uIE1vc3Qgb2YgdGhlIGRldmljZXMgc2VlbSB0byB1c2UgR1BJTzEKKwkgKiBhbmQgR1BJTzQub24gdGhlIHNhbWUgd2F5LCBzbywgdGhpcyBoYW5kbGVzIHRoZSBjb21tb24gc2VxdWVuY2UKKwkgKiB1c2VkIGJ5IG1vc3QgZGV2aWNlcy4KKwkgKiBJZiBhIGRldmljZSB1c2VzIGEgZGlmZmVyZW50IHNlcXVlbmNlIG9yIGRpZmZlcmVudCBHUElPIHBpbnMgZm9yCisJICogcmVzZXQsIGp1c3QgYWRkIHRoZSBjb2RlIGF0IHRoZSBib2FyZC1zcGVjaWZpYyBwYXJ0CisJICovCisKKwlpZiAoZGV2LT5ncGlvLnR1bmVyX3Jlc2V0KSB7CisJCWludCByYzsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJcmMgPSB0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJCQlkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDApOworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWkgZG9pbmcgdHVuZXIgcmVzZXRcbiIsIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisKKwkJCW1zbGVlcCgxMCk7IC8qIEp1c3QgdG8gYmUgY29uc2VydmF0aXZlICovCisJCQlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQkJCWRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMSk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSBkb2luZyB0dW5lciByZXNldFxuIiwgcmMpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiVHVuZXIgcmVzZXQgaXMgbm90IGNvbmZpZ3VyZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbXNsZWVwKDUwKTsKKworCXJldHVybiAwOworfTsKKworc3RhdGljIHZvaWQgdG02MDAwX2NvbmZpZ190dW5lcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOworCisJLyogTG9hZCB0dW5lciBtb2R1bGUgKi8KKwl2NGwyX2kyY19uZXdfc3ViZGV2KCZkZXYtPnY0bDJfZGV2LCAmZGV2LT5pMmNfYWRhcCwKKwkJInR1bmVyIiwgZGV2LT50dW5lcl9hZGRyLCBOVUxMKTsKKworCW1lbXNldCgmdHVuX3NldHVwLCAwLCBzaXplb2YodHVuX3NldHVwKSk7CisJdHVuX3NldHVwLnR5cGUgPSBkZXYtPnR1bmVyX3R5cGU7CisJdHVuX3NldHVwLmFkZHIgPSBkZXYtPnR1bmVyX2FkZHI7CisKKwl0dW5fc2V0dXAubW9kZV9tYXNrID0gMDsKKwlpZiAoZGV2LT5jYXBzLmhhc190dW5lcikKKwkJdHVuX3NldHVwLm1vZGVfbWFzayB8PSAoVF9BTkFMT0dfVFYgfCBUX1JBRElPKTsKKworCXN3aXRjaCAoZGV2LT50dW5lcl90eXBlKSB7CisJY2FzZSBUVU5FUl9YQzIwMjg6CisJCXR1bl9zZXR1cC50dW5lcl9jYWxsYmFjayA9IHRtNjAwMF90dW5lcl9jYWxsYmFjazsKKwkJYnJlYWs7CisJY2FzZSBUVU5FUl9YQzUwMDA6CisJCXR1bl9zZXR1cC50dW5lcl9jYWxsYmFjayA9IHRtNjAwMF94YzUwMDBfY2FsbGJhY2s7CisJCWJyZWFrOworCX0KKworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc190eXBlX2FkZHIsICZ0dW5fc2V0dXApOworCisJc3dpdGNoIChkZXYtPnR1bmVyX3R5cGUpIHsKKwljYXNlIFRVTkVSX1hDMjAyODogeworCQlzdHJ1Y3QgdjRsMl9wcml2X3R1bl9jb25maWcgeGMyMDI4X2NmZzsKKwkJc3RydWN0IHhjMjAyOF9jdHJsIGN0bDsKKworCQltZW1zZXQoJnhjMjAyOF9jZmcsIDAsIHNpemVvZih4YzIwMjhfY2ZnKSk7CisJCW1lbXNldCgmY3RsLCAwLCBzaXplb2YoY3RsKSk7CisKKwkJY3RsLmRlbW9kID0gWEMzMDI4X0ZFX1pBUkxJTks0NTY7CisKKwkJeGMyMDI4X2NmZy50dW5lciA9IFRVTkVSX1hDMjAyODsKKwkJeGMyMDI4X2NmZy5wcml2ICA9ICZjdGw7CisKKwkJc3dpdGNoIChkZXYtPm1vZGVsKSB7CisJCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgorCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKKwkJY2FzZSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMToKKwkJCWN0bC5mbmFtZSA9ICJ4YzMwMjhMLXYzNi5mdyI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKKwkJCQljdGwuZm5hbWUgPSAieGMzMDI4LXYyNy5mdyI7CisJCQllbHNlCisJCQkJY3RsLmZuYW1lID0gInhjMzAyOC12MjQuZnciOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyBmaXJtd2FyZSBwYXJhbWV0ZXJzIGZvciB4YzIwMjhcbiIpOworCQl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIHNfY29uZmlnLAorCQkJCSAgICAgJnhjMjAyOF9jZmcpOworCisJCX0KKwkJYnJlYWs7CisJY2FzZSBUVU5FUl9YQzUwMDA6CisJCXsKKwkJc3RydWN0IHY0bDJfcHJpdl90dW5fY29uZmlnICB4YzUwMDBfY2ZnOworCQlzdHJ1Y3QgeGM1MDAwX2NvbmZpZyBjdGwgPSB7CisJCQkuaTJjX2FkZHJlc3MgPSBkZXYtPnR1bmVyX2FkZHIsCisJCQkuaWZfa2h6ICAgICAgPSA0NTcwLAorCQkJLnJhZGlvX2lucHV0ID0gWEM1MDAwX1JBRElPX0ZNMV9NT05PLAorCQkJfTsKKworCQl4YzUwMDBfY2ZnLnR1bmVyID0gVFVORVJfWEM1MDAwOworCQl4YzUwMDBfY2ZnLnByaXYgID0gJmN0bDsKKworCQl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIHNfY29uZmlnLAorCQkJCSAgICAgJnhjNTAwMF9jZmcpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gIlVua25vd24gdHVuZXIgdHlwZS4gVHVuZXIgaXMgbm90IGNvbmZpZ3VyZWQuXG4iKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGZpbGxfYm9hcmRfc3BlY2lmaWNfZGF0YShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpbnQgcmM7CisKKwlkZXYtPmRldl90eXBlICAgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLnR5cGU7CisJZGV2LT50dW5lcl90eXBlID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS50dW5lcl90eXBlOworCWRldi0+dHVuZXJfYWRkciA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0udHVuZXJfYWRkcjsKKworCWRldi0+Z3BpbyA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0uZ3BpbzsKKworCWRldi0+aXJfY29kZXMgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLmlyX2NvZGVzOworCisJZGV2LT5kZW1vZF9hZGRyID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS5kZW1vZF9hZGRyOworCisJZGV2LT5jYXBzID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS5jYXBzOworCisJZGV2LT52aW5wdXRbMF0gPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLnZpbnB1dFswXTsKKwlkZXYtPnZpbnB1dFsxXSA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0udmlucHV0WzFdOworCWRldi0+dmlucHV0WzJdID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS52aW5wdXRbMl07CisJZGV2LT5yaW5wdXQgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLnJpbnB1dDsKKworCS8qIHNldHVwIHBlci1tb2RlbCBxdWlya3MgKi8KKwlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKKwljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKKwkJZGV2LT5xdWlya3MgfD0gVE02MDAwX1FVSVJLX05PX1VTQl9ERUxBWTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBpbml0aWFsaXplIGhhcmR3YXJlICovCisJcmMgPSB0bTYwMDBfaW5pdChkZXYpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiB2NGwyX2RldmljZV9yZWdpc3RlcigmZGV2LT51ZGV2LT5kZXYsICZkZXYtPnY0bDJfZGV2KTsKK30KKworCitzdGF0aWMgdm9pZCB1c2VfYWx0ZXJuYXRpdmVfZGV0ZWN0aW9uX21ldGhvZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpbnQgaSwgbW9kZWwgPSAtMTsKKworCWlmICghZGV2LT5lZWRhdGFfc2l6ZSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG02MDAwX2JvYXJkcyk7IGkrKykgeworCQlpZiAoIXRtNjAwMF9ib2FyZHNbaV0uZWVuYW1lX3NpemUpCisJCQljb250aW51ZTsKKwkJaWYgKGRldi0+ZWVkYXRhX3NpemUgPCB0bTYwMDBfYm9hcmRzW2ldLmVlbmFtZV9wb3MgKworCQkJCSAgICAgICB0bTYwMDBfYm9hcmRzW2ldLmVlbmFtZV9zaXplKQorCQkJY29udGludWU7CisKKwkJaWYgKCFtZW1jbXAoJmRldi0+ZWVkYXRhW3RtNjAwMF9ib2FyZHNbaV0uZWVuYW1lX3Bvc10sCisJCQkgICAgdG02MDAwX2JvYXJkc1tpXS5lZW5hbWUsCisJCQkgICAgdG02MDAwX2JvYXJkc1tpXS5lZW5hbWVfc2l6ZSkpIHsKKwkJCW1vZGVsID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChtb2RlbCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlIGhhcyBlZXByb20gYnV0IGlzIGN1cnJlbnRseSB1bmtub3duXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRldi0+bW9kZWwgPSBtb2RlbDsKKworCXByaW50ayhLRVJOX0lORk8gIkRldmljZSBpZGVudGlmaWVkIHZpYSBlZXByb20gYXMgJXMgKHR5cGUgPSAlZClcbiIsCisJICAgICAgIHRtNjAwMF9ib2FyZHNbbW9kZWxdLm5hbWUsIG1vZGVsKTsKK30KKworc3RhdGljIGludCB0bTYwMDBfaW5pdF9kZXYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHY0bDJfZnJlcXVlbmN5IGY7CisJaW50IHJjID0gMDsKKworCW11dGV4X2luaXQoJmRldi0+bG9jayk7CisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKworCWlmICghaXNfZ2VuZXJpYyhkZXYtPm1vZGVsKSkgeworCQlyYyA9IGZpbGxfYm9hcmRfc3BlY2lmaWNfZGF0YShkZXYpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBlcnI7CisKKwkJLyogcmVnaXN0ZXIgaTJjIGJ1cyAqLworCQlyYyA9IHRtNjAwMF9pMmNfcmVnaXN0ZXIoZGV2KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZXJyOworCX0gZWxzZSB7CisJCS8qIHJlZ2lzdGVyIGkyYyBidXMgKi8KKwkJcmMgPSB0bTYwMDBfaTJjX3JlZ2lzdGVyKGRldik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycjsKKworCQl1c2VfYWx0ZXJuYXRpdmVfZGV0ZWN0aW9uX21ldGhvZChkZXYpOworCisJCXJjID0gZmlsbF9ib2FyZF9zcGVjaWZpY19kYXRhKGRldik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycjsKKwl9CisKKwkvKiBEZWZhdWx0IHZhbHVlcyBmb3IgU1REIGFuZCByZXNvbHV0aW9ucyAqLworCWRldi0+d2lkdGggPSA3MjA7CisJZGV2LT5oZWlnaHQgPSA0ODA7CisJZGV2LT5ub3JtID0gVjRMMl9TVERfUEFMX007CisKKwkvKiBDb25maWd1cmUgdHVuZXIgKi8KKwl0bTYwMDBfY29uZmlnX3R1bmVyKGRldik7CisKKwkvKiBTZXQgdmlkZW8gc3RhbmRhcmQgKi8KKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgY29yZSwgc19zdGQsIGRldi0+bm9ybSk7CisKKwkvKiBTZXQgdHVuZXIgZnJlcXVlbmN5IC0gYWxzbyBsb2FkcyBmaXJtd2FyZSBvbiB4YzIwMjgveGMzMDI4ICovCisJZi50dW5lciA9IDA7CisJZi50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7CisJZi5mcmVxdWVuY3kgPSAzMDkyOwkvKiAxOTMuMjUgTUh6ICovCisJZGV2LT5mcmVxID0gZi5mcmVxdWVuY3k7CisJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgJmYpOworCisJaWYgKGRldi0+Y2Fwcy5oYXNfdGRhOTg3NCkKKwkJdjRsMl9pMmNfbmV3X3N1YmRldigmZGV2LT52NGwyX2RldiwgJmRldi0+aTJjX2FkYXAsCisJCQkidHZhdWRpbyIsIEkyQ19BRERSX1REQTk4NzQsIE5VTEwpOworCisJLyogcmVnaXN0ZXIgYW5kIGluaXRpYWxpemUgVjRMMiAqLworCXJjID0gdG02MDAwX3Y0bDJfcmVnaXN0ZXIoZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCXRtNjAwMF9hZGRfaW50b19kZXZsaXN0KGRldik7CisJdG02MDAwX2luaXRfZXh0ZW5zaW9uKGRldik7CisKKwl0bTYwMDBfaXJfaW5pdChkZXYpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCXJldHVybiAwOworCitlcnI6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCXJldHVybiByYzsKK30KKworLyogaGlnaCBiYW5kd2lkdGggbXVsdGlwbGllciwgYXMgZW5jb2RlZCBpbiBoaWdoc3BlZWQgZW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgaGJfbXVsdCh3TWF4UGFja2V0U2l6ZSkgKDEgKyAoKCh3TWF4UGFja2V0U2l6ZSkgPj4gMTEpICYgMHgwMykpCisKK3N0YXRpYyB2b2lkIGdldF9tYXhfZW5kcG9pbnQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJCQkgICAgIHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCwKKwkJCSAgICAgY2hhciAqbXNndHlwZSwKKwkJCSAgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpjdXJyX2UsCisJCQkgICAgIHN0cnVjdCB0bTYwMDBfZW5kcG9pbnQgKnRtX2VwKQoreworCXUxNiB0bXAgPSBsZTE2X3RvX2NwdShjdXJyX2UtPmRlc2Mud01heFBhY2tldFNpemUpOworCXVuc2lnbmVkIGludCBzaXplID0gdG1wICYgMHg3ZmY7CisKKwlpZiAodWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJCXNpemUgPSBzaXplICogaGJfbXVsdCh0bXApOworCisJaWYgKHNpemUgPiB0bV9lcC0+bWF4c2l6ZSkgeworCQl0bV9lcC0+ZW5kcCA9IGN1cnJfZTsKKwkJdG1fZXAtPm1heHNpemUgPSBzaXplOworCQl0bV9lcC0+YkludGVyZmFjZU51bWJlciA9IGFsdC0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCQl0bV9lcC0+YkFsdGVybmF0ZVNldHRpbmcgPSBhbHQtPmRlc2MuYkFsdGVybmF0ZVNldHRpbmc7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiAlcyBlbmRwb2ludDogMHglMDJ4IChtYXggc2l6ZT0ldSBieXRlcylcbiIsCisJCQkJCW1zZ3R5cGUsIGN1cnJfZS0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzLAorCQkJCQlzaXplKTsKKwl9Cit9CisKKy8qCisgKiB0bTYwMDBfdXNiX3Byb2JlKCkKKyAqIGNoZWNrcyBmb3Igc3VwcG9ydGVkIGRldmljZXMKKyAqLworc3RhdGljIGludCB0bTYwMDBfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQkgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBOVUxMOworCWludCBpLCByYyA9IDA7CisJaW50IG5yID0gMDsKKwljaGFyICpzcGVlZDsKKworCXVzYmRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisKKwkvKiBTZWxlY3RzIHRoZSBwcm9wZXIgaW50ZXJmYWNlICovCisJcmMgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JkZXYsIDAsIDEpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJLyogQ2hlY2sgdG8gc2VlIG5leHQgZnJlZSBkZXZpY2UgYW5kIG1hcmsgYXMgdXNlZCAqLworCW5yID0gZmluZF9maXJzdF96ZXJvX2JpdCgmdG02MDAwX2RldnVzZWQsIFRNNjAwMF9NQVhCT0FSRFMpOworCWlmIChuciA+PSBUTTYwMDBfTUFYQk9BUkRTKSB7CisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBTdXBwb3J0cyBvbmx5ICVpIHRtNjB4eCBib2FyZHMuXG4iLCBUTTYwMDBfTUFYQk9BUkRTKTsKKwkJdXNiX3B1dF9kZXYodXNiZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGRldiBzdHJ1Y3QgKi8KKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwIiAiOiBvdXQgb2YgbWVtb3J5IVxuIik7CisJCXVzYl9wdXRfZGV2KHVzYmRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5zbG9jayk7CisJbXV0ZXhfaW5pdCgmZGV2LT51c2JfbG9jayk7CisKKwkvKiBJbmNyZW1lbnQgdXNhZ2UgY291bnQgKi8KKwlzZXRfYml0KG5yLCAmdG02MDAwX2RldnVzZWQpOworCXNucHJpbnRmKGRldi0+bmFtZSwgMjksICJ0bTYwMDAgIyVkIiwgbnIpOworCisJZGV2LT5tb2RlbCA9IGlkLT5kcml2ZXJfaW5mbzsKKwlpZiAoY2FyZFtucl0gPCBBUlJBWV9TSVpFKHRtNjAwMF9ib2FyZHMpKQorCQlkZXYtPm1vZGVsID0gY2FyZFtucl07CisKKwlkZXYtPnVkZXYgPSB1c2JkZXY7CisJZGV2LT5kZXZubyA9IG5yOworCisJc3dpdGNoICh1c2JkZXYtPnNwZWVkKSB7CisJY2FzZSBVU0JfU1BFRURfTE9XOgorCQlzcGVlZCA9ICIxLjUiOworCQlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9VTktOT1dOOgorCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CisJCXNwZWVkID0gIjEyIjsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1BFRURfSElHSDoKKwkJc3BlZWQgPSAiNDgwIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3BlZWQgPSAidW5rbm93biI7CisJfQorCisJLyogR2V0IGVuZHBvaW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBpbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nOyBpKyspIHsKKwkJaW50IGVwOworCisJCWZvciAoZXAgPSAwOyBlcCA8IGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5kZXNjLmJOdW1FbmRwb2ludHM7IGVwKyspIHsKKwkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludAkqZTsKKwkJCWludCBkaXJfb3V0OworCisJCQllID0gJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5lbmRwb2ludFtlcF07CisKKwkJCWRpcl9vdXQgPSAoKGUtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmCisJCQkJCVVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpOworCisJCQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IGFsdCAlZCwgaW50ZXJmYWNlICVpLCBjbGFzcyAlaVxuIiwKKwkJCSAgICAgICBpLAorCQkJICAgICAgIGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkgICAgICAgaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLmRlc2MuYkludGVyZmFjZUNsYXNzKTsKKworCQkJc3dpdGNoIChlLT5kZXNjLmJtQXR0cmlidXRlcykgeworCQkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgorCQkJCWlmICghZGlyX291dCkgeworCQkJCQlnZXRfbWF4X2VuZHBvaW50KHVzYmRldiwKKwkJCQkJCQkgJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSwKKwkJCQkJCQkgIkJ1bGsgSU4iLCBlLAorCQkJCQkJCSAmZGV2LT5idWxrX2luKTsKKwkJCQl9IGVsc2UgeworCQkJCQlnZXRfbWF4X2VuZHBvaW50KHVzYmRldiwKKwkJCQkJCQkgJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSwKKwkJCQkJCQkgIkJ1bGsgT1VUIiwgZSwKKwkJCQkJCQkgJmRldi0+YnVsa19vdXQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSVNPQzoKKwkJCQlpZiAoIWRpcl9vdXQpIHsKKwkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCisJCQkJCQkJICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCisJCQkJCQkJICJJU09DIElOIiwgZSwKKwkJCQkJCQkgJmRldi0+aXNvY19pbik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCisJCQkJCQkJICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCisJCQkJCQkJICJJU09DIE9VVCIsIGUsCisJCQkJCQkJICZkZXYtPmlzb2Nfb3V0KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKKwkJCQlpZiAoIWRpcl9vdXQpIHsKKwkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCisJCQkJCQkJJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSwKKwkJCQkJCQkiSU5UIElOIiwgZSwKKwkJCQkJCQkmZGV2LT5pbnRfaW4pOworCQkJCX0gZWxzZSB7CisJCQkJCWdldF9tYXhfZW5kcG9pbnQodXNiZGV2LAorCQkJCQkJCSZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCisJCQkJCQkJIklOVCBPVVQiLCBlLAorCQkJCQkJCSZkZXYtPmludF9vdXQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCisJcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBOZXcgdmlkZW8gZGV2aWNlIEAgJXMgTWJwcyAoJTA0eDolMDR4LCBpZm51bSAlZClcbiIsCisJCXNwZWVkLAorCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwkJaW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCisvKiBjaGVjayBpZiB0aGUgdGhlIGRldmljZSBoYXMgdGhlIGlzbyBpbiBlbmRwb2ludCBhdCB0aGUgY29ycmVjdCBwbGFjZSAqLworCWlmICghZGV2LT5pc29jX2luLmVuZHApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IHByb2JpbmcgZXJyb3I6IG5vIElOIElTT0MgZW5kcG9pbnQhXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCisJCWdvdG8gZXJyOworCX0KKworCS8qIHNhdmUgb3VyIGRhdGEgcG9pbnRlciBpbiB0aGlzIGludGVyZmFjZSBkZXZpY2UgKi8KKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogRm91bmQgJXNcbiIsIHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0ubmFtZSk7CisKKwlyYyA9IHRtNjAwMF9pbml0X2RldihkZXYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogRXJyb3IgJWQgd2hpbGUgcmVnaXN0ZXJpbmdcbiIsIHJjKTsKKworCWNsZWFyX2JpdChuciwgJnRtNjAwMF9kZXZ1c2VkKTsKKwl1c2JfcHV0X2Rldih1c2JkZXYpOworCisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiB0bTYwMDBfdXNiX2Rpc2Nvbm5lY3QoKQorICogY2FsbGVkIHdoZW4gdGhlIGRldmljZSBnZXRzIGRpY29uZW5jdGVkCisgKiB2aWRlbyBkZXZpY2Ugd2lsbCBiZSB1bnJlZ2lzdGVyZWQgb24gdjRsMl9jbG9zZSBpbiBjYXNlIGl0IGlzIHN0aWxsIG9wZW4KKyAqLworc3RhdGljIHZvaWQgdG02MDAwX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCisJaWYgKCFkZXYpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogZGlzY29ubmVjdGluZyAlc1xuIiwgZGV2LT5uYW1lKTsKKworCXRtNjAwMF9pcl9maW5pKGRldik7CisKKwlpZiAoZGV2LT5ncGlvLnBvd2VyX2xlZCkgeworCQlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKKwkJY2FzZSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEg6CisJCWNhc2UgVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFOgorCQljYXNlIFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxOgorCQkJLyogUG93ZXIgbGVkIG9mZiAqLworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCWRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDEpOworCQkJbXNsZWVwKDE1KTsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSOgorCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUjoKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUl9MSVRFOgorCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUl9MSVRFOgorCQkJLyogUG93ZXIgbGVkIG9mZiAqLworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCWRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDApOworCQkJbXNsZWVwKDE1KTsKKwkJCWJyZWFrOworCQl9CisJfQorCXRtNjAwMF92NGwyX3VucmVnaXN0ZXIoZGV2KTsKKworCXRtNjAwMF9pMmNfdW5yZWdpc3RlcihkZXYpOworCisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CisKKwlkZXYtPnN0YXRlIHw9IERFVl9ESVNDT05ORUNURUQ7CisKKwl1c2JfcHV0X2RldihkZXYtPnVkZXYpOworCisJdG02MDAwX2Nsb3NlX2V4dGVuc2lvbihkZXYpOworCXRtNjAwMF9yZW1vdmVfZnJvbV9kZXZsaXN0KGRldik7CisKKwljbGVhcl9iaXQoZGV2LT5kZXZubywgJnRtNjAwMF9kZXZ1c2VkKTsKKwlrZnJlZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdG02MDAwX3VzYl9kcml2ZXIgPSB7CisJCS5uYW1lID0gInRtNjAwMCIsCisJCS5wcm9iZSA9IHRtNjAwMF91c2JfcHJvYmUsCisJCS5kaXNjb25uZWN0ID0gdG02MDAwX3VzYl9kaXNjb25uZWN0LAorCQkuaWRfdGFibGUgPSB0bTYwMDBfaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0bTYwMDBfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwIiAiIHY0bDIgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLAorCSAgICAgICAoVE02MDAwX1ZFUlNJT04gID4+IDE2KSAmIDB4ZmYsCisJICAgICAgIChUTTYwMDBfVkVSU0lPTiAgPj4gOCkgJiAweGZmLCBUTTYwMDBfVkVSU0lPTiAgJiAweGZmKTsKKworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJnRtNjAwMF91c2JfZHJpdmVyKTsKKwlpZiAocmVzdWx0KQorCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMCIKKwkJCSAgICIgdXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkLlxuIiwgcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0bTYwMDBfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIGF0IFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmdG02MDAwX3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0bTYwMDBfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQodG02MDAwX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUcmlkZW50IFRWTWFzdGVyIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQjIgYWRhcHRlciIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzgzNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWNvcmUuYwpAQCAtMCwwICsxLDk2NSBAQAorLyoKKyAqICB0bTYwMDAtY29yZS5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGVsIEx1ZHdpZyA8bWljaGVsLmx1ZHdpZ0BnbWFpbC5jb20+CisgKiAgICAgIC0gRFZCLVQgc3VwcG9ydAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSAidG02MDAwLmgiCisjaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisKKyNkZWZpbmUgVVNCX1RJTUVPVVQJKDUgKiBIWikgLyogbXMgKi8KKworaW50IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxX3R5cGUsIHU4IHJlcSwKKwkJCSAgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpidWYsIHUxNiBsZW4pCit7CisJaW50ICAgICAgICAgIHJldCwgaTsKKwl1bnNpZ25lZCBpbnQgcGlwZTsKKwl1OAkgICAgICpkYXRhID0gTlVMTDsKKworCW11dGV4X2xvY2soJmRldi0+dXNiX2xvY2spOworCisJaWYgKGxlbikKKwkJZGF0YSA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKworCWlmIChyZXFfdHlwZSAmIFVTQl9ESVJfSU4pCisJCXBpcGUgPSB1c2JfcmN2Y3RybHBpcGUoZGV2LT51ZGV2LCAwKTsKKwllbHNlIHsKKwkJcGlwZSA9IHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApOworCQltZW1jcHkoZGF0YSwgYnVmLCBsZW4pOworCX0KKworCWlmICh0bTYwMDBfZGVidWcgJiBWNEwyX0RFQlVHX0kyQykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiKGRldiAlcCwgcGlwZSAlMDh4KTogIiwgZGV2LT51ZGV2LCBwaXBlKTsKKworCQlwcmludGsoS0VSTl9DT05UICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIsCisJCQkocmVxX3R5cGUgJiBVU0JfRElSX0lOKSA/ICIgSU4iIDogIk9VVCIsCisJCQlyZXFfdHlwZSwgcmVxLCB2YWx1ZSYweGZmLCB2YWx1ZT4+OCwgaW5kZXgmMHhmZiwKKwkJCWluZGV4Pj44LCBsZW4mMHhmZiwgbGVuPj44KTsKKworCQlpZiAoIShyZXFfdHlwZSAmIFVTQl9ESVJfSU4pKSB7CisJCQlwcmludGsoS0VSTl9DT05UICI+Pj4gIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBidWZbaV0pOworCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJfQorCX0KKworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHBpcGUsIHJlcSwgcmVxX3R5cGUsIHZhbHVlLCBpbmRleCwKKwkJCSAgICAgIGRhdGEsIGxlbiwgVVNCX1RJTUVPVVQpOworCisJaWYgKHJlcV90eXBlICYgIFVTQl9ESVJfSU4pCisJCW1lbWNweShidWYsIGRhdGEsIGxlbik7CisKKwlpZiAodG02MDAwX2RlYnVnICYgVjRMMl9ERUJVR19JMkMpIHsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlmIChyZXFfdHlwZSAmICBVU0JfRElSX0lOKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICI8PDwgKGxlbj0lZClcbiIsIGxlbik7CisKKwkJCXByaW50ayhLRVJOX0NPTlQgIiVzOiBFcnJvciAjJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQl9IGVsc2UgaWYgKHJlcV90eXBlICYgIFVTQl9ESVJfSU4pIHsKKwkJCXByaW50ayhLRVJOX0NPTlQgIjw8PCAiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIGJ1ZltpXSk7CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQl9CisJfQorCisJa2ZyZWUoZGF0YSk7CisJbXNsZWVwKDUpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnVzYl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdG02MDAwX3NldF9yZWcoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCit7CisJcmV0dXJuCisJCXRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SLAorCQkJCSAgICAgIHJlcSwgdmFsdWUsIGluZGV4LCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRtNjAwMF9zZXRfcmVnKTsKKworaW50IHRtNjAwMF9nZXRfcmVnKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQoreworCWludCByYzsKKwl1OCBidWZbMV07CisKKwlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsIHJlcSwKKwkJCQkJdmFsdWUsIGluZGV4LCBidWYsIDEpOworCisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuICpidWY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfZ2V0X3JlZyk7CisKK2ludCB0bTYwMDBfc2V0X3JlZ19tYXNrKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwKKwkJCQkJCXUxNiBpbmRleCwgdTE2IG1hc2spCit7CisJaW50IHJjOworCXU4IGJ1ZlsxXTsKKwl1OCBuZXdfaW5kZXg7CisKKwlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsIHJlcSwKKwkJCQkJdmFsdWUsIGluZGV4LCBidWYsIDEpOworCisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbmV3X2luZGV4ID0gKGJ1ZlswXSAmIH5tYXNrKSB8IChpbmRleCAmIG1hc2spOworCisJaWYgKG5ld19pbmRleCA9PSBpbmRleCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IsCisJCQkJICAgICAgcmVxLCB2YWx1ZSwgbmV3X2luZGV4LCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRtNjAwMF9zZXRfcmVnX21hc2spOworCitpbnQgdG02MDAwX2dldF9yZWcxNihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKK3sKKwlpbnQgcmM7CisJdTggYnVmWzJdOworCisJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SLCByZXEsCisJCQkJCXZhbHVlLCBpbmRleCwgYnVmLCAyKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBidWZbMV18YnVmWzBdPDw4OworfQorCitpbnQgdG02MDAwX2dldF9yZWczMihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKK3sKKwlpbnQgcmM7CisJdTggYnVmWzRdOworCisJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SLCByZXEsCisJCQkJCXZhbHVlLCBpbmRleCwgYnVmLCA0KTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBidWZbM10gfCBidWZbMl0gPDwgOCB8IGJ1ZlsxXSA8PCAxNiB8IGJ1ZlswXSA8PCAyNDsKK30KKworaW50IHRtNjAwMF9pMmNfcmVzZXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHUxNiB0c2xlZXApCit7CisJaW50IHJjOworCisJcmMgPSB0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIFRNNjAwMF9HUElPX0NMSywgMCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbXNsZWVwKHRzbGVlcCk7CisKKwlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgVE02MDAwX0dQSU9fQ0xLLCAxKTsKKwltc2xlZXAodHNsZWVwKTsKKworCXJldHVybiByYzsKK30KKwordm9pZCB0bTYwMDBfc2V0X2ZvdXJjY19mb3JtYXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CisJCWludCB2YWw7CisKKwkJdmFsID0gdG02MDAwX2dldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9JRiwgMCkgJiAweGZjOworCQlpZiAoZGV2LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1VZVlkpCisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX0lGLCB2YWwpOworCQllbHNlCisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX0lGLCB2YWwgfCAxKTsKKwl9IGVsc2UgeworCQlpZiAoZGV2LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1VZVlkpCisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzFfVFJFU0hPTEQsIDB4ZDApOworCQllbHNlCisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzFfVFJFU0hPTEQsIDB4OTApOworCX0KK30KKworc3RhdGljIHZvaWQgdG02MDAwX3NldF92Ymkoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJLyoKKwkgKiBGSVhNRToKKwkgKiBWQkkgbGluZXMgYW5kIHN0YXJ0L2VuZCBhcmUgZGlmZmVyZW50IGJldHdlZW4gNjBIeiBhbmQgNTBIegorCSAqIFNvLCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBjb25maWcgdG8KKwkgKiBzb21ldGhpbmcgdGhhdCB0YWtlcyBpdCBpbnRvIGFjY291bnQsIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnQKKwkgKiBpZiAoZGV2LT5ub3JtICYgVjRMMl9TVERfNTI1XzYwKQorCSAqLworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I0MV9URUxFVEVYVF9WQklfQ09ERTEsIDB4MjcpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNDJfVkJJX0RBVEFfSElHSF9MRVZFTCwgMHg1NSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I0M19WQklfREFUQV9UWVBFX0xJTkU3LCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjQ0X1ZCSV9EQVRBX1RZUEVfTElORTgsIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNDVfVkJJX0RBVEFfVFlQRV9MSU5FOSwgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNDZfVkJJX0RBVEFfVFlQRV9MSU5FMTAsIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjQ3X1ZCSV9EQVRBX1RZUEVfTElORTExLCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I0OF9WQklfREFUQV9UWVBFX0xJTkUxMiwgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNDlfVkJJX0RBVEFfVFlQRV9MSU5FMTMsIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjRBX1ZCSV9EQVRBX1RZUEVfTElORTE0LCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I0Ql9WQklfREFUQV9UWVBFX0xJTkUxNSwgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNENfVkJJX0RBVEFfVFlQRV9MSU5FMTYsIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjREX1ZCSV9EQVRBX1RZUEVfTElORTE3LCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I0RV9WQklfREFUQV9UWVBFX0xJTkUxOCwgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNEZfVkJJX0RBVEFfVFlQRV9MSU5FMTksIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjUwX1ZCSV9EQVRBX1RZUEVfTElORTIwLCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I1MV9WQklfREFUQV9UWVBFX0xJTkUyMSwgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNTJfVkJJX0RBVEFfVFlQRV9MSU5FMjIsIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjUzX1ZCSV9EQVRBX1RZUEVfTElORTIzLCAweDAwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I1NF9WQklfREFUQV9UWVBFX1JMSU5FUywgMHgwMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNTVfVkJJX0xPT1BfRklMVEVSX0dBSU4sIDB4MDEpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjU2X1ZCSV9MT09QX0ZJTFRFUl9JX0dBSU4sIDB4MDApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjU3X1ZCSV9MT09QX0ZJTFRFUl9QX0dBSU4sIDB4MDIpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNThfVkJJX0NBUFRJT05fRFRPMSwgMHgzNSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I1OV9WQklfQ0FQVElPTl9EVE8wLCAweGEwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjVBX1ZCSV9URUxFVEVYVF9EVE8xLCAweDExKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjVCX1ZCSV9URUxFVEVYVF9EVE8wLCAweDRjKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjQwX1RFTEVURVhUX1ZCSV9DT0RFMCwgMHgwMSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCk7CisJfQorfQorCitpbnQgdG02MDAwX2luaXRfYW5hbG9nX21vZGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHY0bDJfZnJlcXVlbmN5IGY7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKKwkJdTggYWN0aXZlID0gVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUZfQVVESU9fRU5BQkxFOworCisJCWlmICghZGV2LT5yYWRpbykKKwkJCWFjdGl2ZSB8PSBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9JRl9WSURFT19FTkFCTEU7CisKKwkJLyogRW5hYmxlIHZpZGVvIGFuZCBhdWRpbyAqLworCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUYsCisJCQkJCQkJYWN0aXZlLCAweDYwKTsKKwkJLyogRGlzYWJsZSBUUyBpbnB1dCAqLworCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLAorCQkJCQkJCTB4MDAsIDB4NDApOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZXMgc29mdCByZXNldCAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEpOworCisJCWlmIChkZXYtPnNjYWxlcikKKwkJCS8qIERpc2FibGUgSGZpbHRlciBhbmQgRW5hYmxlIFRTIERyb3AgZXJyICovCisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwgMHgyMCk7CisJCWVsc2UJLyogRW5hYmxlIEhmaWx0ZXIgYW5kIGRpc2FibGUgVFMgRHJvcCBlcnIgKi8KKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLCAweDgwKTsKKworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMSwgMHg4OCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JEQV9DTEtfU0VMLCAweDIzKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQxX0FERFJfRk9SX1JFUTEsIDB4YzApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDJfQUREUl9GT1JfUkVRMiwgMHhkOCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JENl9FTkRQX1JFUTFfUkVRMiwgMHgwNik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JERl9QV0RPV05fQUNMSywgMHgxZik7CisKKwkJLyogQVAgU29mdHdhcmUgcmVzZXQgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRkZfU09GVF9SRVNFVCwgMHgwMCk7CisKKwkJdG02MDAwX3NldF9mb3VyY2NfZm9ybWF0KGRldik7CisKKwkJLyogRGlzYWJsZXMgc29mdCByZXNldCAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDApOworCX0KKwltc2xlZXAoMjApOworCisJLyogVHVuZXIgZmlybXdhcmUgY2FuIG5vdyBiZSBsb2FkZWQgKi8KKworCS8qCisJICogRklYTUU6IFRoaXMgaXMgYSBoYWNrISB4YzMwMjggInNsZWVwcyIgd2hlbiBubyBjaGFubmVsIGlzIGRldGVjdGVkCisJICogZm9yIG1vcmUgdGhhbiBhIGZldyBzZWNvbmRzLiBOb3Qgc3VyZSB3aHksIGFzIHRoaXMgYmVoYXZpb3IgZG9lcworCSAqIG5vdCBoYXBwZW4gb24gb3RoZXIgZGV2aWNlcyB3aXRoIHhjMzAyOC4gU28sIEkgc3VzcGVjdCB0aGF0IGl0CisJICogaXMgeWV0IGFub3RoZXIgYnVnIGF0IHRtNjAwMC4gQWZ0ZXIgc3RhcnQgc2xlZXBpbmcsIGRlY29kaW5nCisJICogZG9lc24ndCBzdGFydCBhdXRvbWF0aWNhbGx5LiBJbnN0ZWFkLCBpdCByZXF1aXJlcyBzb21lCisJICogSTJDIGNvbW1hbmRzIHRvIHdha2UgaXQgdXAuIEFzIHdlIHdhbnQgdG8gaGF2ZSBpbWFnZSBhdCB0aGUKKwkgKiBiZWdpbm5pbmcsIHdlIG5lZWRlZCB0byBhZGQgdGhpcyBoYWNrLiBUaGUgYmV0dGVyIHdvdWxkIGJlIHRvCisJICogZGlzY292ZXIgc29tZSB3YXkgdG8gbWFrZSB0bTYwMDAgdG8gd2FrZSB1cCB3aXRob3V0IHRoaXMgaGFjay4KKwkgKi8KKwlmLmZyZXF1ZW5jeSA9IGRldi0+ZnJlcTsKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIHNfZnJlcXVlbmN5LCAmZik7CisKKwltc2xlZXAoMTAwKTsKKwl0bTYwMDBfc2V0X3N0YW5kYXJkKGRldik7CisJdG02MDAwX3NldF92YmkoZGV2KTsKKwl0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoZGV2LCA0ODAwMCk7CisKKwkvKiBzd2l0Y2ggZHZiIGxlZCBvZmYgKi8KKwlpZiAoZGV2LT5ncGlvLmR2Yl9sZWQpIHsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJZGV2LT5ncGlvLmR2Yl9sZWQsIDB4MDEpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgdG02MDAwX2luaXRfZGlnaXRhbF9tb2RlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgeworCQkvKiBEaXNhYmxlIHZpZGVvIGFuZCBhdWRpbyAqLworCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUYsCisJCQkJMHgwMCwgMHg2MCk7CisJCS8qIEVuYWJsZSBUUyBpbnB1dCAqLworCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLAorCQkJCTB4NDAsIDB4NDApOworCQkvKiBhbGwgcG93ZXIgZG93biwgYnV0IG5vdCB0aGUgZGlnaXRhbCBkYXRhIHBvcnQgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZFX1BPV0VSX0RPV04sIDB4MjgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTJfUE9XRVJfRE9XTl9DVFJMMSwgMHhmYyk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFNl9QT1dFUl9ET1dOX0NUUkwyLCAweGZmKTsKKwl9IGVsc2UgIHsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRkZfU09GVF9SRVNFVCwgMHgwMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JERl9QV0RPV05fQUNMSywgMHgwOCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFMl9WQURDX1NUQVRVU19DVEwsIDB4MGMpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweGZmKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLCAweGQ4KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMwX0FDVElWRV9WSURFT19TT1VSQ0UsIDB4NDApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzFfVFJFU0hPTEQsIDB4ZDApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMSwgMHgwOSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JEQV9DTEtfU0VMLCAweDM3KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQxX0FERFJfRk9SX1JFUTEsIDB4ZDgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDJfQUREUl9GT1JfUkVRMiwgMHhjMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JENl9FTkRQX1JFUTFfUkVRMiwgMHg2MCk7CisKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkUyX1ZBRENfU1RBVFVTX0NUTCwgMHgwYyk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFOF9WQURDX1BXRE9XTl9DVEwsIDB4ZmYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUsIDB4MDgpOworCQltc2xlZXAoNTApOworCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMHgwMDIwLCAweDAwKTsKKwkJbXNsZWVwKDUwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAweDAwMjAsIDB4MDEpOworCQltc2xlZXAoNTApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsIDB4MDAyMCwgMHgwMCk7CisJCW1zbGVlcCgxMDApOworCX0KKworCS8qIHN3aXRjaCBkdmIgbGVkIG9uICovCisJaWYgKGRldi0+Z3Bpby5kdmJfbGVkKSB7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCWRldi0+Z3Bpby5kdmJfbGVkLCAweDAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodG02MDAwX2luaXRfZGlnaXRhbF9tb2RlKTsKKworc3RydWN0IHJlZ19pbml0IHsKKwl1OCByZXE7CisJdTggcmVnOworCXU4IHZhbDsKK307CisKKy8qIFRoZSBtZWFuaW5nIG9mIHRob3NlIGluaXRpYWxpemF0aW9ucyBhcmUgdW5rbm93biAqLworc3RhdGljIHN0cnVjdCByZWdfaW5pdCB0bTYwMDBfaW5pdF90YWJbXSA9IHsKKwkvKiBSRUcgIFZBTFVFICovCisJeyBUTTYwMDBfUkVRMDdfUkRGX1BXRE9XTl9BQ0xLLCAweDFmIH0sCisJeyBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDggfSwKKwl7IFRNNjAxMF9SRVEwN19SRkZfU09GVF9SRVNFVCwgMHgwMCB9LAorCXsgVE02MDEwX1JFUTA3X1JENV9QT1dFUlNBVkUsIDB4NGYgfSwKKwl7IFRNNjAwMF9SRVEwN19SREFfQ0xLX1NFTCwgMHgyMyB9LAorCXsgVE02MDAwX1JFUTA3X1JEQl9PVVRfU0VMLCAweDA4IH0sCisJeyBUTTYwMDBfUkVRMDdfUkUyX1ZBRENfU1RBVFVTX0NUTCwgMHgwMCB9LAorCXsgVE02MDAwX1JFUTA3X1JFM19WQURDX0lOUF9MUEZfU0VMMSwgMHgxMCB9LAorCXsgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMiwgMHgwMCB9LAorCXsgVE02MDAwX1JFUTA3X1JFOF9WQURDX1BXRE9XTl9DVEwsIDB4MDAgfSwKKwl7IFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUsIDB4NjQgfSwJLyogNDgwMDAgYml0cy9zYW1wbGUsIGV4dGVybmFsIGlucHV0ICovCisJeyBUTTYwMDBfUkVRMDdfUkVFX1ZBRENfQ1RSTF9TRUxfQ09OVFJPTCwgMHhjMiB9LAorCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCQkvKiBTdGFydCBvZiBzb2Z0IHJlc2V0ICovCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDAwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA1X05PSVNFX1RIUkVTSE9MRCwgMHg2NCB9LAorCXsgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1IwOF9MVU1BX0NPTlRSQVNUX0FESiwgMHg4MiB9LAorCXsgVE02MDEwX1JFUTA3X1IwOV9MVU1BX0JSSUdIVE5FU1NfQURKLCAweDM2IH0sCisJeyBUTTYwMTBfUkVRMDdfUjBBX0NIUk9NQV9TQVRVUkFUSU9OX0FESiwgMHg1MCB9LAorCXsgVE02MDEwX1JFUTA3X1IwQ19DSFJPTUFfQUdDX0NPTlRST0wsIDB4NmEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTFfQUdDX1BFQUtfQ09OVFJPTCwgMHhjOSB9LAorCXsgVE02MDEwX1JFUTA3X1IxMl9BR0NfR0FURV9TVEFSVEgsIDB4MDcgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTNfQUdDX0dBVEVfU1RBUlRMLCAweDNiIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE0X0FHQ19HQVRFX1dJRFRILCAweDQ3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjE1X0FHQ19CUF9ERUxBWSwgMHg2ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IxN19ITE9PUF9NQVhTVEFURSwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDhiIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhhMiB9LAorCXsgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTkgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2QgfSwKKwl7IFRNNjAxMF9SRVEwN19SMjBfSFNZTkNfUklTSU5HX0VER0VfVElNRSwgMHgzYyB9LAorCXsgVE02MDEwX1JFUTA3X1IyMV9IU1lOQ19QSEFTRV9PRkZTRVQsIDB4M2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMkRfQ0hST01BX0JVUlNUX0VORCwgMHg0OCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHg2MSB9LAorCXsgVE02MDEwX1JFUTA3X1IzMl9WU1lOQ19ITE9DS19NSU4sIDB4NzQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM0X1ZTWU5DX0FHQ19NSU4sIDB4NzQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNl9WU1lOQ19WQklfTUlOLCAweDdhIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM3X1ZTWU5DX1ZCSV9NQVgsIDB4MjYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzhfVlNZTkNfVEhSRVNIT0xELCAweDQwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM5X1ZTWU5DX1RJTUVfQ09OU1RBTlQsIDB4MGEgfSwKKwl7IFRNNjAxMF9SRVEwN19SNDJfVkJJX0RBVEFfSElHSF9MRVZFTCwgMHg1NSB9LAorCXsgVE02MDEwX1JFUTA3X1I1MV9WQklfREFUQV9UWVBFX0xJTkUyMSwgMHgxMSB9LAorCXsgVE02MDEwX1JFUTA3X1I1NV9WQklfTE9PUF9GSUxURVJfR0FJTiwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1I1N19WQklfTE9PUF9GSUxURVJfUF9HQUlOLCAweDAyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjU4X1ZCSV9DQVBUSU9OX0RUTzEsIDB4MzUgfSwKKwl7IFRNNjAxMF9SRVEwN19SNTlfVkJJX0NBUFRJT05fRFRPMCwgMHhhMCB9LAorCXsgVE02MDEwX1JFUTA3X1I4MF9DT01CX0ZJTFRFUl9UUkVTSE9MRCwgMHgxNSB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NDIgfSwKKwl7IFRNNjAxMF9SRVEwN19SQzFfVFJFU0hPTEQsIDB4ZDAgfSwKKwl7IFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMSwgMHg4OCB9LAorCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCB9LAkJLyogRW5kIG9mIHRoZSBzb2Z0IHJlc2V0ICovCisJeyBUTTYwMTBfUkVRMDVfUjE4X0lNQVNLNywgMHgwMCB9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWdfaW5pdCB0bTYwMTBfaW5pdF90YWJbXSA9IHsKKwl7IFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwgMHgwMCB9LAorCXsgVE02MDEwX1JFUTA3X1JDNF9IU1RBUlQwLCAweGEwIH0sCisJeyBUTTYwMTBfUkVRMDdfUkM2X0hFTkQwLCAweDQwIH0sCisJeyBUTTYwMTBfUkVRMDdfUkNBX1ZFTkQwLCAweDMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9JRiwgMHhlMSB9LAorCXsgVE02MDEwX1JFUTA3X1JFMF9EVklERU9fU09VUkNFLCAweDAzIH0sCisJeyBUTTYwMTBfUkVRMDdfUkZFX1BPV0VSX0RPV04sIDB4N2YgfSwKKworCXsgVE02MDEwX1JFUTA4X1JFMl9QT1dFUl9ET1dOX0NUUkwxLCAweGYwIH0sCisJeyBUTTYwMTBfUkVRMDhfUkUzX0FEQ19JTjFfU0VMLCAweGY0IH0sCisJeyBUTTYwMTBfUkVRMDhfUkU0X0FEQ19JTjJfU0VMLCAweGY4IH0sCisJeyBUTTYwMTBfUkVRMDhfUkU2X1BPV0VSX0RPV05fQ1RSTDIsIDB4MDAgfSwKKwl7IFRNNjAxMF9SRVEwOF9SRUFfQlVGRl9EUlZfQ1RSTCwgMHhmMiB9LAorCXsgVE02MDEwX1JFUTA4X1JFQl9TSUZfR0FJTl9DVFJMLCAweGYwIH0sCisJeyBUTTYwMTBfUkVRMDhfUkVDX1JFVkVSU0VfWUNfQ1RSTCwgMHhjMiB9LAorCXsgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHLCAweDYwIH0sCisJeyBUTTYwMTBfUkVRMDhfUkYxX0FBRENfUE9XRVJfRE9XTiwgMHhmYyB9LAorCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDAwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA1X05PSVNFX1RIUkVTSE9MRCwgMHg2NCB9LAorCXsgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1IwOF9MVU1BX0NPTlRSQVNUX0FESiwgMHg4MiB9LAorCXsgVE02MDEwX1JFUTA3X1IwOV9MVU1BX0JSSUdIVE5FU1NfQURKLCAweDM2IH0sCisJeyBUTTYwMTBfUkVRMDdfUjBBX0NIUk9NQV9TQVRVUkFUSU9OX0FESiwgMHg1MCB9LAorCXsgVE02MDEwX1JFUTA3X1IwQ19DSFJPTUFfQUdDX0NPTlRST0wsIDB4NmEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTFfQUdDX1BFQUtfQ09OVFJPTCwgMHhjOSB9LAorCXsgVE02MDEwX1JFUTA3X1IxMl9BR0NfR0FURV9TVEFSVEgsIDB4MDcgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTNfQUdDX0dBVEVfU1RBUlRMLCAweDNiIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE0X0FHQ19HQVRFX1dJRFRILCAweDQ3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjE1X0FHQ19CUF9ERUxBWSwgMHg2ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IxN19ITE9PUF9NQVhTVEFURSwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDhiIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhhMiB9LAorCXsgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTkgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2QgfSwKKwl7IFRNNjAxMF9SRVEwN19SMjBfSFNZTkNfUklTSU5HX0VER0VfVElNRSwgMHgzYyB9LAorCXsgVE02MDEwX1JFUTA3X1IyMV9IU1lOQ19QSEFTRV9PRkZTRVQsIDB4M2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMkRfQ0hST01BX0JVUlNUX0VORCwgMHg0OCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHg2MSB9LAorCXsgVE02MDEwX1JFUTA3X1IzMl9WU1lOQ19ITE9DS19NSU4sIDB4NzQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM0X1ZTWU5DX0FHQ19NSU4sIDB4NzQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNl9WU1lOQ19WQklfTUlOLCAweDdhIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM3X1ZTWU5DX1ZCSV9NQVgsIDB4MjYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzhfVlNZTkNfVEhSRVNIT0xELCAweDQwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM5X1ZTWU5DX1RJTUVfQ09OU1RBTlQsIDB4MGEgfSwKKwl7IFRNNjAxMF9SRVEwN19SNDJfVkJJX0RBVEFfSElHSF9MRVZFTCwgMHg1NSB9LAorCXsgVE02MDEwX1JFUTA3X1I1MV9WQklfREFUQV9UWVBFX0xJTkUyMSwgMHgxMSB9LAorCXsgVE02MDEwX1JFUTA3X1I1NV9WQklfTE9PUF9GSUxURVJfR0FJTiwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1I1N19WQklfTE9PUF9GSUxURVJfUF9HQUlOLCAweDAyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjU4X1ZCSV9DQVBUSU9OX0RUTzEsIDB4MzUgfSwKKwl7IFRNNjAxMF9SRVEwN19SNTlfVkJJX0NBUFRJT05fRFRPMCwgMHhhMCB9LAorCXsgVE02MDEwX1JFUTA3X1I4MF9DT01CX0ZJTFRFUl9UUkVTSE9MRCwgMHgxNSB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NDIgfSwKKwl7IFRNNjAxMF9SRVEwN19SQzFfVFJFU0hPTEQsIDB4ZDAgfSwKKwl7IFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMSwgMHg4OCB9LAorCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCB9LAorCisJeyBUTTYwMTBfUkVRMDVfUjE4X0lNQVNLNywgMHgwMCB9LAorCisJeyBUTTYwMTBfUkVRMDdfUkQ4X0lSX0xFQURFUjEsIDB4YWEgfSwKKwl7IFRNNjAxMF9SRVEwN19SRDhfSVJfTEVBREVSMCwgMHgzMCB9LAorCXsgVE02MDEwX1JFUTA3X1JEOF9JUl9QVUxTRV9DTlQxLCAweDIwIH0sCisJeyBUTTYwMTBfUkVRMDdfUkQ4X0lSX1BVTFNFX0NOVDAsIDB4ZDAgfSwKKwl7IFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsIDB4MDIsIDB4MDAgfSwKKwl7IFRNNjAxMF9SRVEwN19SRDhfSVIsIDB4MmYgfSwKKworCS8qIHNldCByZW1vdGUgd2FrZXVwIGtleTphbnkga2V5IHdha2V1cCAqLworCXsgVE02MDEwX1JFUTA3X1JFNV9SRU1PVEVfV0FLRVVQLCAgMHhmZSB9LAorCXsgVE02MDEwX1JFUTA3X1JEOF9JUl9XQUtFVVBfU0VMLCAgMHhmZiB9LAorfTsKKworaW50IHRtNjAwMF9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWludCBib2FyZCwgcmMgPSAwLCBpLCBzaXplOworCXN0cnVjdCByZWdfaW5pdCAqdGFiOworCisJLyogQ2hlY2sgYm9hcmQgcmV2aXNpb24gKi8KKwlib2FyZCA9IHRtNjAwMF9nZXRfcmVnMzIoZGV2LCBSRVFfNDBfR0VUX1ZFUlNJT04sIDAsIDApOworCWlmIChib2FyZCA+PSAwKSB7CisJCXN3aXRjaCAoYm9hcmQgJiAweGZmKSB7CisJCWNhc2UgMHhmMzoKKwkJCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIHRtNjAwMFxuIik7CisJCQlpZiAoZGV2LT5kZXZfdHlwZSAhPSBUTTYwMDApCisJCQkJZGV2LT5kZXZfdHlwZSA9IFRNNjAwMDsKKwkJCWJyZWFrOworCQljYXNlIDB4ZjQ6CisJCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCB0bTYwMTBcbiIpOworCQkJaWYgKGRldi0+ZGV2X3R5cGUgIT0gVE02MDEwKQorCQkJCWRldi0+ZGV2X3R5cGUgPSBUTTYwMTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIlVua25vd24gYm9hcmQgdmVyc2lvbiA9IDB4JTA4eFxuIiwgYm9hcmQpOworCQl9CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWkgd2hpbGUgcmV0cmlldmluZyBib2FyZCB2ZXJzaW9uXG4iLCBib2FyZCk7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKKwkJdGFiID0gdG02MDEwX2luaXRfdGFiOworCQlzaXplID0gQVJSQVlfU0laRSh0bTYwMTBfaW5pdF90YWIpOworCX0gZWxzZSB7CisJCXRhYiA9IHRtNjAwMF9pbml0X3RhYjsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUodG02MDAwX2luaXRfdGFiKTsKKwl9CisKKwkvKiBMb2FkIGJvYXJkJ3MgaW5pdGlhbGl6YXRpb24gdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXJjID0gdG02MDAwX3NldF9yZWcoZGV2LCB0YWJbaV0ucmVxLCB0YWJbaV0ucmVnLCB0YWJbaV0udmFsKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSB3aGlsZSBzZXR0aW5nIHJlcSAlZCwgIgorCQkJCQkicmVnICVkIHRvIHZhbHVlICVkXG4iLCByYywKKwkJCQkJdGFiW2ldLnJlcSwgdGFiW2ldLnJlZywgdGFiW2ldLnZhbCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwltc2xlZXAoNSk7IC8qIEp1c3QgdG8gYmUgY29uc2VydmF0aXZlICovCisKKwlyYyA9IHRtNjAwMF9jYXJkc19zZXR1cChkZXYpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgdG02MDAwX3Jlc2V0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWludCBwaXBlOworCWludCBlcnI7CisKKwltc2xlZXAoNTAwKTsKKworCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwgZGV2LT5pc29jX2luLmJJbnRlcmZhY2VOdW1iZXIsIDApOworCWlmIChlcnIgPCAwKSB7CisJCXRtNjAwMF9lcnIoImZhaWxlZCB0byBzZWxlY3QgaW50ZXJmYWNlICVkLCBhbHQuIHNldHRpbmcgMFxuIiwKKwkJCQlkZXYtPmlzb2NfaW4uYkludGVyZmFjZU51bWJlcik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24oZGV2LT51ZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQl0bTYwMDBfZXJyKCJmYWlsZWQgdG8gcmVzZXQgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChkZXYtPnF1aXJrcyAmIFRNNjAwMF9RVUlSS19OT19VU0JfREVMQVkpID09IDApCisJCW1zbGVlcCg1KTsKKworCS8qCisJICogTm90IGFsbCBkZXZpY2VzIGhhdmUgaW50X2luIGRlZmluZWQKKwkgKi8KKwlpZiAoIWRldi0+aW50X2luLmVuZHApCisJCXJldHVybiAwOworCisJZXJyID0gdXNiX3NldF9pbnRlcmZhY2UoZGV2LT51ZGV2LCBkZXYtPmlzb2NfaW4uYkludGVyZmFjZU51bWJlciwgMik7CisJaWYgKGVyciA8IDApIHsKKwkJdG02MDAwX2VycigiZmFpbGVkIHRvIHNlbGVjdCBpbnRlcmZhY2UgJWQsIGFsdC4gc2V0dGluZyAyXG4iLAorCQkJCWRldi0+aXNvY19pbi5iSW50ZXJmYWNlTnVtYmVyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwltc2xlZXAoNSk7CisKKwlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LT51ZGV2LAorCQkJZGV2LT5pbnRfaW4uZW5kcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKworCWVyciA9IHVzYl9jbGVhcl9oYWx0KGRldi0+dWRldiwgcGlwZSk7CisJaWYgKGVyciA8IDApIHsKKwkJdG02MDAwX2VycigidXNiX2NsZWFyX2hhbHQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRtNjAwMF9zZXRfYXVkaW9fYml0cmF0ZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IGJpdHJhdGUpCit7CisJaW50IHZhbCA9IDA7CisJdTggYXJlZ19mMCA9IDB4NjA7IC8qIEFEQyBNQ0xLID0gMjUwIEZzICovCisJdTggYXJlZ18wYSA9IDB4OTE7IC8qIFNJRiA0OEtIeiAqLworCisJc3dpdGNoIChiaXRyYXRlKSB7CisJY2FzZSA0ODAwMDoKKwkJYXJlZ19mMCA9IDB4NjA7IC8qIEFEQyBNQ0xLID0gMjUwIEZzICovCisJCWFyZWdfMGEgPSAweDkxOyAvKiBTSUYgNDhLSHogKi8KKwkJZGV2LT5hdWRpb19iaXRyYXRlID0gYml0cmF0ZTsKKwkJYnJlYWs7CisJY2FzZSAzMjAwMDoKKwkJYXJlZ19mMCA9IDB4MDA7IC8qIEFEQyBNQ0xLID0gMzc1IEZzICovCisJCWFyZWdfMGEgPSAweDkwOyAvKiBTSUYgMzJLSHogKi8KKwkJZGV2LT5hdWRpb19iaXRyYXRlID0gYml0cmF0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKwkvKiBlbmFibGUgSTJTLCBpZiB3ZSB1c2Ugc2lmIG9yIGV4dGVybmFsIEkyUyBkZXZpY2UgKi8KKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKKwkJdmFsID0gdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjBBX0FfSTJTX01PRCwgYXJlZ18wYSk7CisJCWlmICh2YWwgPCAwKQorCQkJcmV0dXJuIHZhbDsKKworCQl2YWwgPSB0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHLAorCQkJCQkJCWFyZWdfZjAsIDB4ZjApOworCQlpZiAodmFsIDwgMCkKKwkJCXJldHVybiB2YWw7CisJfSBlbHNlIHsKKwkJdmFsID0gdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUsCisJCQkJCQkJYXJlZ19mMCwgMHhmMCk7CisJCWlmICh2YWwgPCAwKQorCQkJcmV0dXJuIHZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUpOworCitpbnQgdG02MDAwX3NldF9hdWRpb19yaW5wdXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CisJCS8qIEF1ZGlvIGNyb3NzYmFyIHNldHRpbmcsIGRlZmF1bHQgU0lGMSAqLworCQl1OCBhcmVnX2YwOworCisJCXN3aXRjaCAoZGV2LT5yaW5wdXQuYW11eCkgeworCQljYXNlIFRNNjAwMF9BTVVYX1NJRjE6CisJCWNhc2UgVE02MDAwX0FNVVhfU0lGMjoKKwkJCWFyZWdfZjAgPSAweDAzOworCQkJYnJlYWs7CisJCWNhc2UgVE02MDAwX0FNVVhfQURDMToKKwkJCWFyZWdfZjAgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgVE02MDAwX0FNVVhfQURDMjoKKwkJCWFyZWdfZjAgPSAweDA4OworCQkJYnJlYWs7CisJCWNhc2UgVE02MDAwX0FNVVhfSTJTOgorCQkJYXJlZ19mMCA9IDB4MDQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdWRpbyBpbnB1dCBkb3NuJ3Qgc3VwcG9ydFxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJfQorCQkvKiBTZXQgYXVkaW8gaW5wdXQgY3Jvc3NiYXIgKi8KKwkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywKKwkJCQkJCQlhcmVnX2YwLCAweDBmKTsKKwl9IGVsc2UgeworCQl1OCBhcmVnX2ViOworCQkvKiBBdWRpbyBzZXR0aW5nLCBkZWZhdWx0IExJTkUxICovCisJCXN3aXRjaCAoZGV2LT5yaW5wdXQuYW11eCkgeworCQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6CisJCQlhcmVnX2ViID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAwMF9BTVVYX0FEQzI6CisJCQlhcmVnX2ViID0gMHgwNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF1ZGlvIGlucHV0IGRvc24ndCBzdXBwb3J0XG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQl9CisJCS8qIFNldCBhdWRpbyBpbnB1dCAqLworCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwKKwkJCQkJCQlhcmVnX2ViLCAweDBmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRtNjAxMF9zZXRfbXV0ZV9zaWYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IG11dGUpCit7CisJdTggbXV0ZV9yZWcgPSAwOworCisJaWYgKG11dGUpCisJCW11dGVfcmVnID0gMHgwODsKKworCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUjBBX0FfSTJTX01PRCwgbXV0ZV9yZWcsIDB4MDgpOworfQorCitzdGF0aWMgdm9pZCB0bTYwMTBfc2V0X211dGVfYWRjKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCBtdXRlKQoreworCXU4IG11dGVfcmVnID0gMDsKKworCWlmIChtdXRlKQorCQltdXRlX3JlZyA9IDB4MjA7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKKwkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjJfTEVGVF9DSEFOTkVMX1ZPTCwKKwkJCQkJCQltdXRlX3JlZywgMHgyMCk7CisJCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUkYzX1JJR0hUX0NIQU5ORUxfVk9MLAorCQkJCQkJCW11dGVfcmVnLCAweDIwKTsKKwl9IGVsc2UgeworCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDAwX1JFUTA3X1JFQ19WQURDX0FBRENfTFZPTCwKKwkJCQkJCQltdXRlX3JlZywgMHgyMCk7CisJCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMDBfUkVRMDdfUkVEX1ZBRENfQUFEQ19SVk9MLAorCQkJCQkJCW11dGVfcmVnLCAweDIwKTsKKwl9Cit9CisKK2ludCB0bTYwMDBfdHZhdWRpb19zZXRfbXV0ZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggbXV0ZSkKK3sKKwllbnVtIHRtNjAwMF9tdXggbXV4OworCisJaWYgKGRldi0+cmFkaW8pCisJCW11eCA9IGRldi0+cmlucHV0LmFtdXg7CisJZWxzZQorCQltdXggPSBkZXYtPnZpbnB1dFtkZXYtPmlucHV0XS5hbXV4OworCisJc3dpdGNoIChtdXgpIHsKKwljYXNlIFRNNjAwMF9BTVVYX1NJRjE6CisJY2FzZSBUTTYwMDBfQU1VWF9TSUYyOgorCQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApCisJCQl0bTYwMTBfc2V0X211dGVfc2lmKGRldiwgbXV0ZSk7CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRVJST1I6IFRNNTYwMCBhbmQgVE02MDAwIGRvbid0IGhhcyIKKwkJCQkJIiBTSUYgYXVkaW8gaW5wdXRzLiBQbGVhc2UgY2hlY2sgdGhlICVzIgorCQkJCQkiIGNvbmZpZ3VyYXRpb24uXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUTTYwMDBfQU1VWF9BREMxOgorCWNhc2UgVE02MDAwX0FNVVhfQURDMjoKKwkJdG02MDEwX3NldF9tdXRlX2FkYyhkZXYsIG11dGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0bTYwMTBfc2V0X3ZvbHVtZV9zaWYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCB2b2wpCit7CisJdTggdm9sX3JlZzsKKworCXZvbF9yZWcgPSB2b2wgJiAweDBGOworCisJaWYgKHZvbCA8IDApCisJCXZvbF9yZWcgfD0gMHg0MDsKKworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwN19BX0xFRlRfVk9MLCB2b2xfcmVnKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDhfQV9SSUdIVF9WT0wsIHZvbF9yZWcpOworfQorCitzdGF0aWMgdm9pZCB0bTYwMTBfc2V0X3ZvbHVtZV9hZGMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCB2b2wpCit7CisJdTggdm9sX3JlZzsKKworCXZvbF9yZWcgPSAodm9sICsgMHgxMCkgJiAweDFmOworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JGMl9MRUZUX0NIQU5ORUxfVk9MLCB2b2xfcmVnKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkYzX1JJR0hUX0NIQU5ORUxfVk9MLCB2b2xfcmVnKTsKKwl9IGVsc2UgeworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRUNfVkFEQ19BQURDX0xWT0wsIHZvbF9yZWcpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRURfVkFEQ19BQURDX1JWT0wsIHZvbF9yZWcpOworCX0KK30KKwordm9pZCB0bTYwMDBfc2V0X3ZvbHVtZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IHZvbCkKK3sKKwllbnVtIHRtNjAwMF9tdXggbXV4OworCisJaWYgKGRldi0+cmFkaW8pIHsKKwkJbXV4ID0gZGV2LT5yaW5wdXQuYW11eDsKKwkJdm9sICs9IDg7IC8qIE9mZnNldCB0byAwIGRCICovCisJfSBlbHNlCisJCW11eCA9IGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXg7CisKKwlzd2l0Y2ggKG11eCkgeworCWNhc2UgVE02MDAwX0FNVVhfU0lGMToKKwljYXNlIFRNNjAwMF9BTVVYX1NJRjI6CisJCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKKwkJCXRtNjAxMF9zZXRfdm9sdW1lX3NpZihkZXYsIHZvbCk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIkVSUk9SOiBUTTU2MDAgYW5kIFRNNjAwMCBkb24ndCBoYXMiCisJCQkJCSIgU0lGIGF1ZGlvIGlucHV0cy4gUGxlYXNlIGNoZWNrIHRoZSAlcyIKKwkJCQkJIiBjb25maWd1cmF0aW9uLlxuIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBUTTYwMDBfQU1VWF9BREMxOgorCWNhc2UgVE02MDAwX0FNVVhfQURDMjoKKwkJdG02MDEwX3NldF92b2x1bWVfYWRjKGRldiwgdm9sKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgTElTVF9IRUFEKHRtNjAwMF9kZXZsaXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgodG02MDAwX2Rldmxpc3RfbXV0ZXgpOworCisvKgorICogdG02MDAwX3JlYWxlYXNlX3Jlc291cmNlKCkKKyAqLworCit2b2lkIHRtNjAwMF9yZW1vdmVfZnJvbV9kZXZsaXN0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCW11dGV4X2xvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKKwlsaXN0X2RlbCgmZGV2LT5kZXZsaXN0KTsKKwltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKK307CisKK3ZvaWQgdG02MDAwX2FkZF9pbnRvX2Rldmxpc3Qoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2bGlzdCwgJnRtNjAwMF9kZXZsaXN0KTsKKwltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKK307CisKKy8qCisgKiBFeHRlbnNpb24gaW50ZXJmYWNlCisgKi8KKworc3RhdGljIExJU1RfSEVBRCh0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QpOworCitpbnQgdG02MDAwX2NhbGxfZmlsbGJ1ZihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgZW51bSB0bTYwMDBfb3BzX3R5cGUgdHlwZSwKKwkJCWNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHRtNjAwMF9vcHMgKm9wcyA9IE5VTEw7CisKKwkvKiBGSVhNRTogdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0X2xvY2sgc2hvdWxkIGJlIGEgc3BpbmxvY2sgKi8KKworCWlmICghbGlzdF9lbXB0eSgmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgeworCQkJaWYgKG9wcy0+ZmlsbGJ1ZiAmJiBvcHMtPnR5cGUgPT0gdHlwZSkKKwkJCQlvcHMtPmZpbGxidWYoZGV2LCBidWYsIHNpemUpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJm9wcy0+bmV4dCwgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ0bTYwMDBfZGV2bGlzdCwgZGV2bGlzdCkgeworCQlvcHMtPmluaXQoZGV2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemVkICglcykgZXh0ZW5zaW9uXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBvcHMtPm5hbWUpOworCX0KKwltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodG02MDAwX3JlZ2lzdGVyX2V4dGVuc2lvbik7CisKK3ZvaWQgdG02MDAwX3VucmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdG02MDAwX2Rldmxpc3QsIGRldmxpc3QpCisJCW9wcy0+ZmluaShkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBSZW1vdmUgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7CisJbGlzdF9kZWwoJm9wcy0+bmV4dCk7CisJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZGV2bGlzdF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbik7CisKK3ZvaWQgdG02MDAwX2luaXRfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfb3BzICpvcHMgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOworCWlmICghbGlzdF9lbXB0eSgmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgeworCQkJaWYgKG9wcy0+aW5pdCkKKwkJCQlvcHMtPmluaXQoZGV2KTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKK30KKwordm9pZCB0bTYwMDBfY2xvc2VfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfb3BzICpvcHMgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOworCWlmICghbGlzdF9lbXB0eSgmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgeworCQkJaWYgKG9wcy0+ZmluaSkKKwkJCQlvcHMtPmZpbmkoZGV2KTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1kdmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTZjMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWR2Yi5jCkBAIC0wLDAgKzEsNDUyIEBACisvKgorICogIHRtNjAwMC1kdmIuYyAtIGR2Yi10IHN1cHBvcnQgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hlbCBMdWR3aWcgPG1pY2hlbC5sdWR3aWdAZ21haWwuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJ0bTYwMDAuaCIKKyNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgorCisjaW5jbHVkZSAiemwxMDM1My5oIgorCisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKworI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgorI2luY2x1ZGUgInhjNTAwMC5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIkRWQiBkcml2ZXIgZXh0ZW5zaW9uIG1vZHVsZSBmb3IgdG01NjAwLzYwMDAvNjAxMCBiYXNlZCBUViBjYXJkcyIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e1RyaWRlbnQsIHRtNTYwMH0sIgorCQkJInt7VHJpZGVudCwgdG02MDAwfSwiCisJCQkie3tUcmlkZW50LCB0bTYwMTB9Iik7CisKK3N0YXRpYyBpbnQgZGVidWc7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZSIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfZXJyX3N0YXR1cyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwKKwkJCQkgICAgaW50IHBhY2tldCwgaW50IHN0YXR1cykKK3sKKwljaGFyICplcnJtc2cgPSAiVW5rbm93biI7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgLUVOT0VOVDoKKwkJZXJybXNnID0gInVubGlua2VkIHN5bmNocm9udW91c2x5IjsKKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwkJZXJybXNnID0gInVubGlua2VkIGFzeW5jaHJvbnVvdXNseSI7CisJCWJyZWFrOworCWNhc2UgLUVOT1NSOgorCQllcnJtc2cgPSAiQnVmZmVyIGVycm9yIChvdmVycnVuKSI7CisJCWJyZWFrOworCWNhc2UgLUVQSVBFOgorCQllcnJtc2cgPSAiU3RhbGxlZCAoZGV2aWNlIG5vdCByZXNwb25kaW5nKSI7CisJCWJyZWFrOworCWNhc2UgLUVPVkVSRkxPVzoKKwkJZXJybXNnID0gIkJhYmJsZSAoYmFkIGNhYmxlPykiOworCQlicmVhazsKKwljYXNlIC1FUFJPVE86CisJCWVycm1zZyA9ICJCaXQtc3R1ZmYgZXJyb3IgKGJhZCBjYWJsZT8pIjsKKwkJYnJlYWs7CisJY2FzZSAtRUlMU0VROgorCQllcnJtc2cgPSAiQ1JDL1RpbWVvdXQgKGNvdWxkIGJlIGFueXRoaW5nKSI7CisJCWJyZWFrOworCWNhc2UgLUVUSU1FOgorCQllcnJtc2cgPSAiRGV2aWNlIGRvZXMgbm90IHJlc3BvbmQiOworCQlicmVhazsKKwl9CisJaWYgKHBhY2tldCA8IDApIHsKKwkJZHByaW50ayhkZXYsIDEsICJVUkIgc3RhdHVzICVkIFslc10uXG4iLAorCQkJc3RhdHVzLCBlcnJtc2cpOworCX0gZWxzZSB7CisJCWRwcmludGsoZGV2LCAxLCAiVVJCIHBhY2tldCAlZCwgc3RhdHVzICVkIFslc10uXG4iLAorCQkJcGFja2V0LCBzdGF0dXMsIGVycm1zZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0bTYwMDBfdXJiX3JlY2VpdmVkKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdXJiLT5jb250ZXh0OworCisJaWYgKHVyYi0+c3RhdHVzICE9IDApCisJCXByaW50X2Vycl9zdGF0dXMoZGV2LCAwLCB1cmItPnN0YXR1cyk7CisJZWxzZSBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkKKwkJZHZiX2RteF9zd2ZpbHRlcigmZGV2LT5kdmItPmRlbXV4LCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkJCSAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKwlpZiAoZGV2LT5kdmItPnN0cmVhbXMgPiAwKSB7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogIGVycm9yICVzXG4iLCBfX2Z1bmNfXyk7CisJCQlrZnJlZSh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB0bTYwMDBfc3RhcnRfc3RyZWFtKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHBpcGUsIHNpemU7CisJc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOworCisJcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBnb3Qgc3RhcnQgc3RyZWFtIHJlcXVlc3QgJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChkZXYtPm1vZGUgIT0gVE02MDAwX01PREVfRElHSVRBTCkgeworCQl0bTYwMDBfaW5pdF9kaWdpdGFsX21vZGUoZGV2KTsKKwkJZGV2LT5tb2RlID0gVE02MDAwX01PREVfRElHSVRBTDsKKwl9CisKKwlkdmItPmJ1bGtfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoZHZiLT5idWxrX3VyYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCBhbGxvY2F0ZSB1cmJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwaXBlID0gdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgZGV2LT5idWxrX2luLmVuZHAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcworCQkJCQkJCSAgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOworCisJc2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisJc2l6ZSA9IHNpemUgKiAxNTsgLyogNTEyIHggOCBvciAxMiBvciAxNSAqLworCisJZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKKwkJdXNiX2ZyZWVfdXJiKGR2Yi0+YnVsa191cmIpOworCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogY291bGRuJ3QgYWxsb2NhdGUgdHJhbnNmZXIgYnVmZmVyIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXVzYl9maWxsX2J1bGtfdXJiKGR2Yi0+YnVsa191cmIsIGRldi0+dWRldiwgcGlwZSwKKwkJCQkJCSBkdmItPmJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkJCQkgc2l6ZSwKKwkJCQkJCSB0bTYwMDBfdXJiX3JlY2VpdmVkLCBkZXYpOworCisJcmV0ID0gdXNiX2NsZWFyX2hhbHQoZGV2LT51ZGV2LCBwaXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogZXJyb3IgJWkgaW4gJXMgZHVyaW5nIHBpcGUgcmVzZXRcbiIsCisJCQkJCQkJcmV0LCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBwaXBlIHJlc2V0dGVkXG4iKTsKKworLyoJbXV0ZXhfbG9jaygmdG02MDAwX2RyaXZlci5vcGVuX2Nsb3NlX211dGV4KTsgKi8KKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihkdmItPmJ1bGtfdXJiLCBHRlBfS0VSTkVMKTsKKworLyoJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZHJpdmVyLm9wZW5fY2xvc2VfbXV0ZXgpOyAqLworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IHN1Ym1pdCBvZiB1cmIgZmFpbGVkIChlcnJvcj0laSlcbiIsCisJCQkJCQkJCQlyZXQpOworCisJCWtmcmVlKGR2Yi0+YnVsa191cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9mcmVlX3VyYihkdmItPmJ1bGtfdXJiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdG02MDAwX3N0b3Bfc3RyZWFtKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKKworCWlmIChkdmItPmJ1bGtfdXJiKSB7CisJCXByaW50ayhLRVJOX0lORk8gInVyYiBraWxsaW5nXG4iKTsKKwkJdXNiX2tpbGxfdXJiKGR2Yi0+YnVsa191cmIpOworCQlwcmludGsoS0VSTl9JTkZPICJ1cmIgYnVmZmVyIGZyZWVcbiIpOworCQlrZnJlZShkdmItPmJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfZnJlZV91cmIoZHZiLT5idWxrX3VyYik7CisJCWR2Yi0+YnVsa191cmIgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCB0bTYwMDBfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCit7CisJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGRlbXV4LT5wcml2OworCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKKwlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IGdvdCBzdGFydCBmZWVkIHJlcXVlc3QgJXNcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJmR2Yi0+bXV0ZXgpOworCWlmIChkdmItPnN0cmVhbXMgPT0gMCkgeworCQlkdmItPnN0cmVhbXMgPSAxOworLyoJCW11dGV4X2luaXQoJnRtNjAwMF9kZXYtPnN0cmVtaW5nX211dGV4KTsgKi8KKwkJdG02MDAwX3N0YXJ0X3N0cmVhbShkZXYpOworCX0gZWxzZQorCQkrKyhkdmItPnN0cmVhbXMpOworCW11dGV4X3VubG9jaygmZHZiLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0bTYwMDBfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCkKK3sKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGZlZWQtPmRlbXV4OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZGVtdXgtPnByaXY7CisJc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOworCisJcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBnb3Qgc3RvcCBmZWVkIHJlcXVlc3QgJXNcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJmR2Yi0+bXV0ZXgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAic3RyZWFtICUjeFxuIiwgZHZiLT5zdHJlYW1zKTsKKwktLShkdmItPnN0cmVhbXMpOworCWlmIChkdmItPnN0cmVhbXMgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJzdG9wIHN0cmVhbVxuIik7CisJCXRtNjAwMF9zdG9wX3N0cmVhbShkZXYpOworLyoJCW11dGV4X2Rlc3Ryb3koJnRtNjAwMF9kZXYtPnN0cmVhbWluZ19tdXRleCk7ICovCisJfQorCW11dGV4X3VubG9jaygmZHZiLT5tdXRleCk7CisvKgltdXRleF9kZXN0cm95KCZ0bTYwMDBfZGV2LT5zdHJlYW1pbmdfbXV0ZXgpOyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX2R2Yl9hdHRhY2hfZnJvbnRlbmQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOworCisJaWYgKGRldi0+Y2Fwcy5oYXNfemwxMDM1MykgeworCQlzdHJ1Y3QgemwxMDM1M19jb25maWcgY29uZmlnID0geworCQkJCSAgICAgLmRlbW9kX2FkZHJlc3MgPSBkZXYtPmRlbW9kX2FkZHIsCisJCQkJICAgICAubm9fdHVuZXIgPSAxLAorCQkJCSAgICAgLnBhcmFsbGVsX3RzID0gMSwKKwkJCQkgICAgIC5pZjIgPSA0NTcwMCwKKwkJCQkgICAgIC5kaXNhYmxlX2kyY19nYXRlX2N0cmwgPSAxLAorCQkJCSAgICB9OworCisJCWR2Yi0+ZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmY29uZmlnLAorCQkJCQkJCSAgICZkZXYtPmkyY19hZGFwKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogbm8gZnJvbnRlbmQgZGVmaW5lZCBmb3IgdGhlIGRldmljZSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuICghZHZiLT5mcm9udGVuZCkgPyAtMSA6IDA7Cit9CisKK0RWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOworCitzdGF0aWMgaW50IHJlZ2lzdGVyX2R2YihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpbnQgcmV0ID0gLTE7CisJc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOworCisJbXV0ZXhfaW5pdCgmZHZiLT5tdXRleCk7CisKKwlkdmItPnN0cmVhbXMgPSAwOworCisJLyogYXR0YWNoIHRoZSBmcm9udGVuZCAqLworCXJldCA9IHRtNjAwMF9kdmJfYXR0YWNoX2Zyb250ZW5kKGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGNvdWxkbid0IGF0dGFjaCB0aGUgZnJvbnRlbmQhXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlciwgIlRyaWRlbnQgVFZNYXN0ZXIgNjAwMCBEVkItVCIsCisJCQkJCVRISVNfTU9EVUxFLCAmZGV2LT51ZGV2LT5kZXYsIGFkYXB0ZXJfbnIpOworCWR2Yi0+YWRhcHRlci5wcml2ID0gZGV2OworCisJaWYgKGR2Yi0+ZnJvbnRlbmQpIHsKKwkJc3dpdGNoIChkZXYtPnR1bmVyX3R5cGUpIHsKKwkJY2FzZSBUVU5FUl9YQzIwMjg6IHsKKwkJCXN0cnVjdCB4YzIwMjhfY29uZmlnIGNmZyA9IHsKKwkJCQkuaTJjX2FkYXAgPSAmZGV2LT5pMmNfYWRhcCwKKwkJCQkuaTJjX2FkZHIgPSBkZXYtPnR1bmVyX2FkZHIsCisJCQl9OworCisJCQlkdmItPmZyb250ZW5kLT5jYWxsYmFjayA9IHRtNjAwMF90dW5lcl9jYWxsYmFjazsKKwkJCXJldCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmZHZiLT5hZGFwdGVyLCBkdmItPmZyb250ZW5kKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJ0bTYwMDA6IGNvdWxkbid0IHJlZ2lzdGVyIGZyb250ZW5kXG4iKTsKKwkJCQlnb3RvIGFkYXB0ZXJfZXJyOworCQkJfQorCisJCQlpZiAoIWR2Yl9hdHRhY2goeGMyMDI4X2F0dGFjaCwgZHZiLT5mcm9udGVuZCwgJmNmZykpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogY291bGRuJ3QgcmVnaXN0ZXIgIgorCQkJCQkJImZyb250ZW5kICh4YzMwMjgpXG4iKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZnJvbnRlbmRfZXJyOworCQkJfQorCQkJcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBYQzIwMjgvMzAyOCBhc2tlZCB0byBiZSAiCisJCQkJCSAiYXR0YWNoZWQgdG8gZnJvbnRlbmQhXG4iKTsKKwkJCWJyZWFrOworCQkJfQorCQljYXNlIFRVTkVSX1hDNTAwMDogeworCQkJc3RydWN0IHhjNTAwMF9jb25maWcgY2ZnID0geworCQkJCS5pMmNfYWRkcmVzcyA9IGRldi0+dHVuZXJfYWRkciwKKwkJCX07CisKKwkJCWR2Yi0+ZnJvbnRlbmQtPmNhbGxiYWNrID0gdG02MDAwX3hjNTAwMF9jYWxsYmFjazsKKwkJCXJldCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmZHZiLT5hZGFwdGVyLCBkdmItPmZyb250ZW5kKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJ0bTYwMDA6IGNvdWxkbid0IHJlZ2lzdGVyIGZyb250ZW5kXG4iKTsKKwkJCQlnb3RvIGFkYXB0ZXJfZXJyOworCQkJfQorCisJCQlpZiAoIWR2Yl9hdHRhY2goeGM1MDAwX2F0dGFjaCwgZHZiLT5mcm9udGVuZCwgJmRldi0+aTJjX2FkYXAsICZjZmcpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGNvdWxkbid0IHJlZ2lzdGVyICIKKwkJCQkJCSJmcm9udGVuZCAoeGM1MDAwKVxuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGZyb250ZW5kX2VycjsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogWEM1MDAwIGFza2VkIHRvIGJlICIKKwkJCQkJICJhdHRhY2hlZCB0byBmcm9udGVuZCFcbiIpOworCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IG5vIGZyb250ZW5kIGZvdW5kXG4iKTsKKworCWR2Yi0+ZGVtdXguZG14LmNhcGFiaWxpdGllcyA9IERNWF9UU19GSUxURVJJTkcgfCBETVhfU0VDVElPTl9GSUxURVJJTkcKKwkJCQkJCQkgICAgfCBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORzsKKwlkdmItPmRlbXV4LnByaXYgPSBkZXY7CisJZHZiLT5kZW11eC5maWx0ZXJudW0gPSA4OworCWR2Yi0+ZGVtdXguZmVlZG51bSA9IDg7CisJZHZiLT5kZW11eC5zdGFydF9mZWVkID0gdG02MDAwX3N0YXJ0X2ZlZWQ7CisJZHZiLT5kZW11eC5zdG9wX2ZlZWQgPSB0bTYwMDBfc3RvcF9mZWVkOworCWR2Yi0+ZGVtdXgud3JpdGVfdG9fZGVjb2RlciA9IE5VTEw7CisJcmV0ID0gZHZiX2RteF9pbml0KCZkdmItPmRlbXV4KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogZHZiX2RteF9pbml0IGZhaWxlZCAoZXJybm8gPSAlZClcbiIsIHJldCk7CisJCWdvdG8gZnJvbnRlbmRfZXJyOworCX0KKworCWR2Yi0+ZG14ZGV2LmZpbHRlcm51bSA9IGRldi0+ZHZiLT5kZW11eC5maWx0ZXJudW07CisJZHZiLT5kbXhkZXYuZGVtdXggPSAmZGV2LT5kdmItPmRlbXV4LmRteDsKKwlkdmItPmRteGRldi5jYXBhYmlsaXRpZXMgPSAwOworCisJcmV0ID0gIGR2Yl9kbXhkZXZfaW5pdCgmZHZiLT5kbXhkZXYsICZkdmItPmFkYXB0ZXIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBkdmJfZG14ZGV2X2luaXQgZmFpbGVkIChlcnJubyA9ICVkKVxuIiwgcmV0KTsKKwkJZ290byBkdmJfZG14X2VycjsKKwl9CisKKwlyZXR1cm4gMDsKKworZHZiX2RteF9lcnI6CisJZHZiX2RteF9yZWxlYXNlKCZkdmItPmRlbXV4KTsKK2Zyb250ZW5kX2VycjoKKwlpZiAoZHZiLT5mcm9udGVuZCkgeworCQlkdmJfZnJvbnRlbmRfZGV0YWNoKGR2Yi0+ZnJvbnRlbmQpOworCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChkdmItPmZyb250ZW5kKTsKKwl9CithZGFwdGVyX2VycjoKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJfZHZiKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKKworCWlmIChkdmItPmJ1bGtfdXJiICE9IE5VTEwpIHsKKwkJc3RydWN0IHVyYiAqYnVsa191cmIgPSBkdmItPmJ1bGtfdXJiOworCisJCWtmcmVlKGJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQlidWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJdXNiX3VubGlua191cmIoYnVsa191cmIpOworCQl1c2JfZnJlZV91cmIoYnVsa191cmIpOworCX0KKworLyoJbXV0ZXhfbG9jaygmdG02MDAwX2RyaXZlci5vcGVuX2Nsb3NlX211dGV4KTsgKi8KKwlpZiAoZHZiLT5mcm9udGVuZCkgeworCQlkdmJfZnJvbnRlbmRfZGV0YWNoKGR2Yi0+ZnJvbnRlbmQpOworCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChkdmItPmZyb250ZW5kKTsKKwl9CisKKwlkdmJfZG14ZGV2X3JlbGVhc2UoJmR2Yi0+ZG14ZGV2KTsKKwlkdmJfZG14X3JlbGVhc2UoJmR2Yi0+ZGVtdXgpOworCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlcik7CisJbXV0ZXhfZGVzdHJveSgmZHZiLT5tdXRleCk7CisvKgltdXRleF91bmxvY2soJnRtNjAwMF9kcml2ZXIub3Blbl9jbG9zZV9tdXRleCk7ICovCit9CisKK3N0YXRpYyBpbnQgZHZiX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHRtNjAwMF9kdmIgKmR2YjsKKwlpbnQgcmM7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRldi0+Y2Fwcy5oYXNfZHZiKQorCQlyZXR1cm4gMDsKKworCWR2YiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bTYwMDBfZHZiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkdmIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldi0+ZHZiID0gZHZiOworCisJcmMgPSByZWdpc3Rlcl9kdmIoZGV2KTsKKwlpZiAocmMgPCAwKSB7CisJCWtmcmVlKGR2Yik7CisJCWRldi0+ZHZiID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZiX2Zpbmkoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJaWYgKCFkZXYtPmNhcHMuaGFzX2R2YikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGV2LT5kdmIpIHsKKwkJdW5yZWdpc3Rlcl9kdmIoZGV2KTsKKwkJa2ZyZWUoZGV2LT5kdmIpOworCQlkZXYtPmR2YiA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX29wcyBkdmJfb3BzID0geworCS50eXBlCT0gVE02MDAwX0RWQiwKKwkubmFtZQk9ICJUTTYwMDAgZHZiIEV4dGVuc2lvbiIsCisJLmluaXQJPSBkdmJfaW5pdCwKKwkuZmluaQk9IGR2Yl9maW5pLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdG02MDAwX2R2Yl9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZkdmJfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRtNjAwMF9kdmJfdW5yZWdpc3Rlcih2b2lkKQoreworCXRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbigmZHZiX29wcyk7Cit9CisKK21vZHVsZV9pbml0KHRtNjAwMF9kdmJfcmVnaXN0ZXIpOworbW9kdWxlX2V4aXQodG02MDAwX2R2Yl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjkwYmJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWkyYy5jCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogIHRtNjAwMC1pMmMuYyAtIGRyaXZlciBmb3IgVE01NjAwL1RNNjAwMC9UTTYwMTAgVVNCIHZpZGVvIGNhcHR1cmUgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hlbCBMdWR3aWcgPG1pY2hlbC5sdWR3aWdAZ21haWwuY29tPgorICoJLSBGaXggU01CdXMgUmVhZCBCeXRlIGNvbW1hbmQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlICJ0bTYwMDAuaCIKKyNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGkyY19kZWJ1ZzsKK21vZHVsZV9wYXJhbShpMmNfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGkyY19kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbaTJjXSIpOworCisjZGVmaW5lIGkyY19kcHJpbnRrKGx2bCwgZm10LCBhcmdzLi4uKSBpZiAoaTJjX2RlYnVnID49IGx2bCkgZG8geyBcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgYXQgJXM6ICIgZm10LCBcCisJCQlkZXYtPm5hbWUsIF9fZnVuY19fLCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IHRtNjAwMF9pMmNfc2VuZF9yZWdzKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHIsCisJCQkJX191OCByZWcsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgaW50IHRzbGVlcDsKKwl1bnNpZ25lZCBpbnQgaTJjX3BhY2tldF9saW1pdCA9IDE2OworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKQorCQlpMmNfcGFja2V0X2xpbWl0ID0gNjQ7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC0xOworCisJaWYgKGxlbiA8IDEgfHwgbGVuID4gaTJjX3BhY2tldF9saW1pdCkgeworCQlwcmludGsoS0VSTl9FUlIgIkluY29ycmVjdCBsZW5ndGggb2YgaTJjIHBhY2tldCA9ICVkLCBsaW1pdCBzZXQgdG8gJWRcbiIsCisJCQlsZW4sIGkyY19wYWNrZXRfbGltaXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY2FwdHVyZSBtdXRleCAqLworCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQlVU0JfUkVDSVBfREVWSUNFLCBSRVFfMTZfU0VUX0dFVF9JMkNfV1IxX1JETiwKKwkJYWRkciB8IHJlZyA8PCA4LCAwLCBidWYsIGxlbik7CisKKwlpZiAocmMgPCAwKSB7CisJCS8qIHJlbGVhc2UgbXV0ZXggKi8KKwkJcmV0dXJuIHJjOworCX0KKworCS8qIENhbGN1bGF0ZSBkZWxheSB0aW1lLCAxNDAwMHVzIGZvciA2NCBieXRlcyAqLworCXRzbGVlcCA9ICgobGVuICogMjAwKSArIDIwMCArIDEwMDApIC8gMTAwMDsKKwltc2xlZXAodHNsZWVwKTsKKworCS8qIHJlbGVhc2UgbXV0ZXggKi8KKwlyZXR1cm4gcmM7Cit9CisKKy8qIEdlbmVyaWMgcmVhZCAtIGRvZXNuJ3Qgd29yayBmaW5lIHdpdGggMTZiaXQgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHRtNjAwMF9pMmNfcmVjdl9yZWdzKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHIsCisJCQkJX191OCByZWcsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgcmM7CisJdTggYlsyXTsKKwl1bnNpZ25lZCBpbnQgaTJjX3BhY2tldF9saW1pdCA9IDE2OworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKQorCQlpMmNfcGFja2V0X2xpbWl0ID0gNjQ7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC0xOworCisJaWYgKGxlbiA8IDEgfHwgbGVuID4gaTJjX3BhY2tldF9saW1pdCkgeworCQlwcmludGsoS0VSTl9FUlIgIkluY29ycmVjdCBsZW5ndGggb2YgaTJjIHBhY2tldCA9ICVkLCBsaW1pdCBzZXQgdG8gJWRcbiIsCisJCQlsZW4sIGkyY19wYWNrZXRfbGltaXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY2FwdHVyZSBtdXRleCAqLworCWlmICgoZGV2LT5jYXBzLmhhc196bDEwMzUzKSAmJiAoZGV2LT5kZW1vZF9hZGRyIDw8IDEgPT0gYWRkcikgJiYgKHJlZyAlIDIgPT0gMCkpIHsKKwkJLyoKKwkJICogV29ya2Fyb3VuZCBhbiBJMkMgYnVnIHdoZW4gcmVhZGluZyBmcm9tIHpsMTAzNTMKKwkJICovCisJCXJlZyAtPSAxOworCQlsZW4gKz0gMTsKKworCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4sIGFkZHIgfCByZWcgPDwgOCwgMCwgYiwgbGVuKTsKKworCQkqYnVmID0gYlsxXTsKKwl9IGVsc2UgeworCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4sIGFkZHIgfCByZWcgPDwgOCwgMCwgYnVmLCBsZW4pOworCX0KKworCS8qIHJlbGVhc2UgbXV0ZXggKi8KKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiByZWFkIGZyb20gYSAxNmJpdCByZWdpc3RlcgorICogZm9yIGV4YW1wbGUgeGMyMDI4LCB4YzMwMjggb3IgeGMzMDI4TAorICovCitzdGF0aWMgaW50IHRtNjAwMF9pMmNfcmVjdl9yZWdzMTYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkciwKKwkJCQkgIF9fdTE2IHJlZywgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCByYzsKKwl1bnNpZ25lZCBjaGFyIHVyZWc7CisKKwlpZiAoIWJ1ZiB8fCBsZW4gIT0gMikKKwkJcmV0dXJuIC0xOworCisJLyogY2FwdHVyZSBtdXRleCAqLworCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgeworCQl1cmVnID0gcmVnICYgMHhGRjsKKwkJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQlVU0JfUkVDSVBfREVWSUNFLCBSRVFfMTZfU0VUX0dFVF9JMkNfV1IxX1JETiwKKwkJCWFkZHIgfCAocmVnICYgMHhGRjAwKSwgMCwgJnVyZWcsIDEpOworCisJCWlmIChyYyA8IDApIHsKKwkJCS8qIHJlbGVhc2UgbXV0ZXggKi8KKwkJCXJldHVybiByYzsKKwkJfQorCisJCW1zbGVlcCgxNDAwIC8gMTAwMCk7CisJCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQlVU0JfUkVDSVBfREVWSUNFLCBSRVFfMzVfQUZURUtfVFVORVJfUkVBRCwKKwkJCXJlZywgMCwgYnVmLCBsZW4pOworCX0gZWxzZSB7CisJCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQlVU0JfUkVDSVBfREVWSUNFLCBSRVFfMTRfU0VUX0dFVF9JMkNfV1IyX1JETiwKKwkJCWFkZHIsIHJlZywgYnVmLCBsZW4pOworCX0KKworCS8qIHJlbGVhc2UgbXV0ZXggKi8KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCisJCQkgICBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBpMmNfYWRhcC0+YWxnb19kYXRhOworCWludCBhZGRyLCByYywgaSwgYnl0ZTsKKworCWlmIChudW0gPD0gMCkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWFkZHIgPSAobXNnc1tpXS5hZGRyIDw8IDEpICYgMHhmZjsKKwkJaTJjX2RwcmludGsoMiwgIiVzICVzIGFkZHI9MHgleCBsZW49JWQ6IiwKKwkJCSAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKSA/ICJyZWFkIiA6ICJ3cml0ZSIsCisJCQkgaSA9PSBudW0gLSAxID8gInN0b3AiIDogIm5vbnN0b3AiLCBhZGRyLCBtc2dzW2ldLmxlbik7CisJCWlmIChtc2dzW2ldLmZsYWdzICYgSTJDX01fUkQpIHsKKwkJCS8qIHJlYWQgcmVxdWVzdCB3aXRob3V0IHByZWNlZGluZyByZWdpc3RlciBzZWxlY3Rpb24gKi8KKwkJCS8qCisJCQkgKiBUaGUgVE02MDAwIG9ubHkgc3VwcG9ydHMgYSByZWFkIHRyYW5zYWN0aW9uCisJCQkgKiBpbW1lZGlhdGVseSBhZnRlciBhIDEgb3IgMiBieXRlIHdyaXRlIHRvIHNlbGVjdAorCQkJICogYSByZWdpc3Rlci4gIFdlIGNhbm5vdCBmdWxmaWwgdGhpcyByZXF1ZXN0LgorCQkJICovCisJCQlpMmNfZHByaW50aygyLCAiIHJlYWQgd2l0aG91dCBwcmVjZWRpbmcgd3JpdGUgbm90IgorCQkJCSAgICAgICAiIHN1cHBvcnRlZCIpOworCQkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gZXJyOworCQl9IGVsc2UgaWYgKGkgKyAxIDwgbnVtICYmIG1zZ3NbaV0ubGVuIDw9IDIgJiYKKwkJCSAgIChtc2dzW2kgKyAxXS5mbGFncyAmIEkyQ19NX1JEKSAmJgorCQkJICAgbXNnc1tpXS5hZGRyID09IG1zZ3NbaSArIDFdLmFkZHIpIHsKKwkJCS8qIDEgb3IgMiBieXRlIHdyaXRlIGZvbGxvd2VkIGJ5IGEgcmVhZCAqLworCQkJaWYgKGkyY19kZWJ1ZyA+PSAyKQorCQkJCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBtc2dzW2ldLmxlbjsgYnl0ZSsrKQorCQkJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIG1zZ3NbaV0uYnVmW2J5dGVdKTsKKwkJCWkyY19kcHJpbnRrKDIsICI7IGpvaW5lZCB0byByZWFkICVzIGxlbj0lZDoiLAorCQkJCSAgICBpID09IG51bSAtIDIgPyAic3RvcCIgOiAibm9uc3RvcCIsCisJCQkJICAgIG1zZ3NbaSArIDFdLmxlbik7CisKKwkJCWlmIChtc2dzW2ldLmxlbiA9PSAyKSB7CisJCQkJcmMgPSB0bTYwMDBfaTJjX3JlY3ZfcmVnczE2KGRldiwgYWRkciwKKwkJCQkJbXNnc1tpXS5idWZbMF0gPDwgOCB8IG1zZ3NbaV0uYnVmWzFdLAorCQkJCQltc2dzW2kgKyAxXS5idWYsIG1zZ3NbaSArIDFdLmxlbik7CisJCQl9IGVsc2UgeworCQkJCXJjID0gdG02MDAwX2kyY19yZWN2X3JlZ3MoZGV2LCBhZGRyLCBtc2dzW2ldLmJ1ZlswXSwKKwkJCQkJbXNnc1tpICsgMV0uYnVmLCBtc2dzW2kgKyAxXS5sZW4pOworCQkJfQorCisJCQlpKys7CisKKwkJCWlmIChhZGRyID09IGRldi0+dHVuZXJfYWRkciA8PCAxKSB7CisJCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfNTBfU0VUX1NUQVJULCAwLCAwKTsKKwkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV81MV9TRVRfU1RPUCwgMCwgMCk7CisJCQl9CisJCQlpZiAoaTJjX2RlYnVnID49IDIpCisJCQkJZm9yIChieXRlID0gMDsgYnl0ZSA8IG1zZ3NbaV0ubGVuOyBieXRlKyspCisJCQkJCXByaW50ayhLRVJOX0NPTlQgIiAlMDJ4IiwgbXNnc1tpXS5idWZbYnl0ZV0pOworCQl9IGVsc2UgeworCQkJLyogd3JpdGUgYnl0ZXMgKi8KKwkJCWlmIChpMmNfZGVidWcgPj0gMikKKwkJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykKKwkJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBtc2dzW2ldLmJ1ZltieXRlXSk7CisJCQlyYyA9IHRtNjAwMF9pMmNfc2VuZF9yZWdzKGRldiwgYWRkciwgbXNnc1tpXS5idWZbMF0sCisJCQkJbXNnc1tpXS5idWYgKyAxLCBtc2dzW2ldLmxlbiAtIDEpOworCQl9CisJCWlmIChpMmNfZGVidWcgPj0gMikKKwkJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gbnVtOworZXJyOgorCWkyY19kcHJpbnRrKDIsICIgRVJST1I6ICVpXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHRtNjAwMF9pMmNfZWVwcm9tKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWludCBpLCByYzsKKwl1bnNpZ25lZCBjaGFyICpwID0gZGV2LT5lZWRhdGE7CisJdW5zaWduZWQgY2hhciBieXRlc1sxN107CisKKwlkZXYtPmkyY19jbGllbnQuYWRkciA9IDB4YTAgPj4gMTsKKwlkZXYtPmVlZGF0YV9zaXplID0gMDsKKworCWJ5dGVzWzE2XSA9ICdcMCc7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihkZXYtPmVlZGF0YSk7ICkgeworCQkqcCA9IGk7CisJCXJjID0gdG02MDAwX2kyY19yZWN2X3JlZ3MoZGV2LCAweGEwLCBpLCBwLCAxKTsKKwkJaWYgKHJjIDwgMSkgeworCQkJaWYgKHAgPT0gZGV2LT5lZWRhdGEpCisJCQkJZ290byBub2VlcHJvbTsKKwkJCWVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IGkyYyBlZXByb20gcmVhZCBlcnJvciAoZXJyPSVkKVxuIiwKKwkJCQlkZXYtPm5hbWUsIHJjKTsKKwkJCX0KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRldi0+ZWVkYXRhX3NpemUrKzsKKwkJcCsrOworCQlpZiAoMCA9PSAoaSAlIDE2KSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpMmMgZWVwcm9tICUwMng6IiwgZGV2LT5uYW1lLCBpKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBkZXYtPmVlZGF0YVtpXSk7CisJCWlmICgoZGV2LT5lZWRhdGFbaV0gPj0gJyAnKSAmJiAoZGV2LT5lZWRhdGFbaV0gPD0gJ3onKSkKKwkJCWJ5dGVzW2klMTZdID0gZGV2LT5lZWRhdGFbaV07CisJCWVsc2UKKwkJCWJ5dGVzW2klMTZdID0gJy4nOworCisJCWkrKzsKKworCQlpZiAoMCA9PSAoaSAlIDE2KSkgeworCQkJYnl0ZXNbMTZdID0gJ1wwJzsKKwkJCXByaW50ayhLRVJOX0NPTlQgIiAgJXNcbiIsIGJ5dGVzKTsKKwkJfQorCX0KKwlpZiAoMCAhPSAoaSUxNikpIHsKKwkJYnl0ZXNbaSUxNl0gPSAnXDAnOworCQlmb3IgKGkgJT0gMTY7IGkgPCAxNjsgaSsrKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiICAgIik7CisJCXByaW50ayhLRVJOX0NPTlQgIiAgJXNcbiIsIGJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gMDsKKworbm9lZXByb206CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEh1aCwgbm8gZWVwcm9tIHByZXNlbnQgKGVycj0lZCk/XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHJjKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGZ1bmN0aW9uYWxpdHkoKQorICovCitzdGF0aWMgdTMyIGZ1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19FTVVMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gdG02MDAwX2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyICAgPSB0bTYwMDBfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBmdW5jdGlvbmFsaXR5LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHRtNjAwMF9pMmNfcmVnaXN0ZXIoKQorICogcmVnaXN0ZXIgaTJjIGJ1cworICovCitpbnQgdG02MDAwX2kyY19yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpbnQgcmM7CisKKwlkZXYtPmkyY19hZGFwLm93bmVyID0gVEhJU19NT0RVTEU7CisJZGV2LT5pMmNfYWRhcC5hbGdvID0gJnRtNjAwMF9hbGdvOworCWRldi0+aTJjX2FkYXAuZGV2LnBhcmVudCA9ICZkZXYtPnVkZXYtPmRldjsKKwlzdHJsY3B5KGRldi0+aTJjX2FkYXAubmFtZSwgZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5pMmNfYWRhcC5uYW1lKSk7CisJZGV2LT5pMmNfYWRhcC5hbGdvX2RhdGEgPSBkZXY7CisJaTJjX3NldF9hZGFwZGF0YSgmZGV2LT5pMmNfYWRhcCwgJmRldi0+djRsMl9kZXYpOworCXJjID0gaTJjX2FkZF9hZGFwdGVyKCZkZXYtPmkyY19hZGFwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWRldi0+aTJjX2NsaWVudC5hZGFwdGVyID0gJmRldi0+aTJjX2FkYXA7CisJc3RybGNweShkZXYtPmkyY19jbGllbnQubmFtZSwgInRtNjAwMCBpbnRlcm5hbCIsIEkyQ19OQU1FX1NJWkUpOworCXRtNjAwMF9pMmNfZWVwcm9tKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRtNjAwMF9pMmNfdW5yZWdpc3RlcigpCisgKiB1bnJlZ2lzdGVyIGkyY19idXMKKyAqLworaW50IHRtNjAwMF9pMmNfdW5yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpMmNfZGVsX2FkYXB0ZXIoJmRldi0+aTJjX2FkYXApOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDVkMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWlucHV0LmMKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiAgdG02MDAwLWlucHV0LmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFN0ZWZhbiBSaW5nZWwgPHN0ZWZhbi5yaW5nZWxAYXJjb3IuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgPG1lZGlhL3JjLWNvcmUuaD4KKworI2luY2x1ZGUgInRtNjAwMC5oIgorI2luY2x1ZGUgInRtNjAwMC1yZWdzLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJfZGVidWc7Cittb2R1bGVfcGFyYW0oaXJfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyX2RlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2UgW0lSXSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGVuYWJsZV9pciA9IDE7Cittb2R1bGVfcGFyYW0oZW5hYmxlX2lyLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfaXIsICJlbmFibGUgaXIgKGRlZmF1bHQgaXMgZW5hYmxlKSIpOworCisvKiBudW1iZXIgb2YgNTBtcyBmb3IgT04tT0ZGLU9OIHBvd2VyIGxlZCAqLworLyogc2hvdyBJUiBhY3Rpdml0eSAqLworI2RlZmluZSBQV0xFRF9PRkYgMgorCisjdW5kZWYgZHByaW50aworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pIFwKKwlpZiAoaXJfZGVidWcpIHsgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXMvaXI6ICIgZm10LCBpci0+bmFtZSAsICMjIGFyZyk7IFwKKwl9CisKK3N0cnVjdCB0bTYwMDBfaXJfcG9sbF9yZXN1bHQgeworCXUxNiByY19kYXRhOworfTsKKworc3RydWN0IHRtNjAwMF9JUiB7CisJc3RydWN0IHRtNjAwMF9jb3JlCSpkZXY7CisJc3RydWN0IHJjX2RldgkJKnJjOworCWNoYXIJCQluYW1lWzMyXTsKKwljaGFyCQkJcGh5c1szMl07CisKKwkvKiBwb2xsIGV4cGVybmFsIGRlY29kZXIgKi8KKwlpbnQJCQlwb2xsaW5nOworCXN0cnVjdCBkZWxheWVkX3dvcmsJd29yazsKKwl1OAkJCXdhaXQ6MTsKKwl1OAkJCWtleToxOworCXU4CQkJcHdsZWQ6MTsKKwl1OAkJCXB3bGVkY250OworCXUxNgkJCWtleV9hZGRyOworCXN0cnVjdCB1cmIJCSppbnRfdXJiOworCXU4CQkJKnVyYl9kYXRhOworCisJaW50ICgqZ2V0X2tleSkgKHN0cnVjdCB0bTYwMDBfSVIgKiwgc3RydWN0IHRtNjAwMF9pcl9wb2xsX3Jlc3VsdCAqKTsKKworCS8qIElSIGRldmljZSBwcm9wZXJ0aWVzICovCisJdTY0CQkJcmNfdHlwZTsKK307CisKKwordm9pZCB0bTYwMDBfaXJfd2FpdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggc3RhdGUpCit7CisJc3RydWN0IHRtNjAwMF9JUiAqaXIgPSBkZXYtPmlyOworCisJaWYgKCFkZXYtPmlyKQorCQlyZXR1cm47CisKKwlpZiAoc3RhdGUpCisJCWlyLT53YWl0ID0gMTsKKwllbHNlCisJCWlyLT53YWl0ID0gMDsKK30KKworCitzdGF0aWMgaW50IHRtNjAwMF9pcl9jb25maWcoc3RydWN0IHRtNjAwMF9JUiAqaXIpCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBpci0+ZGV2OworCXU4IGJ1ZlsxMF07CisJaW50IHJjOworCisJc3dpdGNoIChpci0+cmNfdHlwZSkgeworCWNhc2UgUkNfVFlQRV9ORUM6CisJCS8qIFNldHVwIElSIGRlY29kZXIgZm9yIE5FQyBzdGFuZGFyZCAxMk1IeiBzeXN0ZW0gY2xvY2sgKi8KKwkJLyogSVJfTEVBREVSX0NOVCA9IDAuOW1zICAgICAgICAgICAgICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEOF9JUl9MRUFERVIxLCAweGFhKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX0xFQURFUjAsIDB4MzApOworCQkvKiBJUl9QVUxTRV9DTlQgPSAwLjdtcyAgICAgICAgICAgICAgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1BVTFNFX0NOVDEsIDB4MjApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDhfSVJfUFVMU0VfQ05UMCwgMHhkMCk7CisJCS8qIFJlbW90ZSBXQUtFVVAgPSBlbmFibGUgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkU1X1JFTU9URV9XQUtFVVAsIDB4ZmUpOworCQkvKiBJUl9XS1VQX1NFTCA9IExvdyBieXRlIGluIGRlY29kZWQgSVIgZGF0YSAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDhfSVJfV0FLRVVQX1NFTCwgMHhmZik7CisJCS8qIElSX1dLVV9BREQgY29kZSAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDhfSVJfV0FLRVVQX0FERCwgMHhmZik7CisJCXRtNjAwMF9mbGFzaF9sZWQoZGV2LCAwKTsKKwkJbXNsZWVwKDEwMCk7CisJCXRtNjAwMF9mbGFzaF9sZWQoZGV2LCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogaGFjayAqLworCQlidWZbMF0gPSAweGZmOworCQlidWZbMV0gPSAweGZmOworCQlidWZbMl0gPSAweGYyOworCQlidWZbM10gPSAweDJiOworCQlidWZbNF0gPSAweDIwOworCQlidWZbNV0gPSAweDM1OworCQlidWZbNl0gPSAweDYwOworCQlidWZbN10gPSAweDA0OworCQlidWZbOF0gPSAweGMwOworCQlidWZbOV0gPSAweDA4OworCisJCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzAwX1NFVF9JUl9WQUxVRSwgMCwgMCwgYnVmLCAweDBhKTsKKwkJbXNsZWVwKDEwMCk7CisKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSVIgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdG02MDAwX2lyX3VyYl9yZWNlaXZlZChzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHRtNjAwMF9JUiAqaXIgPSBkZXYtPmlyOworCWludCByYzsKKworCWlmICh1cmItPnN0YXR1cyAhPSAwKQorCQlwcmludGsoS0VSTl9JTkZPICJub3QgcmVhZHlcbiIpOworCWVsc2UgaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJbWVtY3B5KGlyLT51cmJfZGF0YSwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKwkJZHByaW50aygiZGF0YSAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBpci0+dXJiX2RhdGFbMF0sCisJCQlpci0+dXJiX2RhdGFbMV0sIGlyLT51cmJfZGF0YVsyXSwgaXItPnVyYl9kYXRhWzNdKTsKKworCQlpci0+a2V5ID0gMTsKKwl9CisKKwlyYyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9wb2xsaW5nX2dldGtleShzdHJ1Y3QgdG02MDAwX0lSICppciwKKwkJCQlzdHJ1Y3QgdG02MDAwX2lyX3BvbGxfcmVzdWx0ICpwb2xsX3Jlc3VsdCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGlyLT5kZXY7CisJaW50IHJjOworCXU4IGJ1ZlsyXTsKKworCWlmIChpci0+d2FpdCAmJiAhJmRldi0+aW50X2luKQorCQlyZXR1cm4gMDsKKworCWlmICgmZGV2LT5pbnRfaW4pIHsKKwkJc3dpdGNoIChpci0+cmNfdHlwZSkgeworCQljYXNlIFJDX1RZUEVfUkM1OgorCQkJcG9sbF9yZXN1bHQtPnJjX2RhdGEgPSBpci0+dXJiX2RhdGFbMF07CisJCQlicmVhazsKKwkJY2FzZSBSQ19UWVBFX05FQzoKKwkJCWlmIChpci0+dXJiX2RhdGFbMV0gPT0gKChpci0+a2V5X2FkZHIgPj4gOCkgJiAweGZmKSkgeworCQkJCXBvbGxfcmVzdWx0LT5yY19kYXRhID0gaXItPnVyYl9kYXRhWzBdCisJCQkJCQkJfCBpci0+dXJiX2RhdGFbMV0gPDwgODsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcG9sbF9yZXN1bHQtPnJjX2RhdGEgPSBpci0+dXJiX2RhdGFbMF0KKwkJCQkJfCBpci0+dXJiX2RhdGFbMV0gPDwgODsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAyLCAwKTsKKwkJbXNsZWVwKDEwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAyLCAxKTsKKwkJbXNsZWVwKDEwKTsKKworCQlpZiAoaXItPnJjX3R5cGUgPT0gUkNfVFlQRV9SQzUpIHsKKwkJCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8CisJCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCQlSRVFfMDJfR0VUX0lSX0NPREUsIDAsIDAsIGJ1ZiwgMSk7CisKKwkJCW1zbGVlcCgxMCk7CisKKwkJCWRwcmludGsoInJlYWQgZGF0YT0lMDJ4XG4iLCBidWZbMF0pOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisKKwkJCXBvbGxfcmVzdWx0LT5yY19kYXRhID0gYnVmWzBdOworCQl9IGVsc2UgeworCQkJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwKKwkJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJCVJFUV8wMl9HRVRfSVJfQ09ERSwgMCwgMCwgYnVmLCAyKTsKKworCQkJbXNsZWVwKDEwKTsKKworCQkJZHByaW50aygicmVhZCBkYXRhPSUwNHhcbiIsIGJ1ZlswXSB8IGJ1ZlsxXSA8PCA4KTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCisJCQlwb2xsX3Jlc3VsdC0+cmNfZGF0YSA9IGJ1ZlswXSB8IGJ1ZlsxXSA8PCA4OworCQl9CisJCWlmICgocG9sbF9yZXN1bHQtPnJjX2RhdGEgJiAweDAwZmYpICE9IDB4ZmYpCisJCQlpci0+a2V5ID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRtNjAwMF9pcl9oYW5kbGVfa2V5KHN0cnVjdCB0bTYwMDBfSVIgKmlyKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gaXItPmRldjsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCB0bTYwMDBfaXJfcG9sbF9yZXN1bHQgcG9sbF9yZXN1bHQ7CisKKwkvKiByZWFkIHRoZSByZWdpc3RlcnMgY29udGFpbmluZyB0aGUgSVIgc3RhdHVzICovCisJcmVzdWx0ID0gaXItPmdldF9rZXkoaXIsICZwb2xsX3Jlc3VsdCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXItPmdldF9rZXkoKSBmYWlsZWQgJWRcbiIsIHJlc3VsdCk7CisJCXJldHVybjsKKwl9CisKKwlkcHJpbnRrKCJpci0+Z2V0X2tleSByZXN1bHQgZGF0YT0lMDR4XG4iLCBwb2xsX3Jlc3VsdC5yY19kYXRhKTsKKworCWlmIChpci0+cHdsZWQpIHsKKwkJaWYgKGlyLT5wd2xlZGNudCA+PSBQV0xFRF9PRkYpIHsKKwkJCWlyLT5wd2xlZCA9IDA7CisJCQlpci0+cHdsZWRjbnQgPSAwOworCQkJdG02MDAwX2ZsYXNoX2xlZChkZXYsIDEpOworCQl9IGVsc2UKKwkJCWlyLT5wd2xlZGNudCArPSAxOworCX0KKworCWlmIChpci0+a2V5KSB7CisJCXJjX2tleWRvd24oaXItPnJjLCBwb2xsX3Jlc3VsdC5yY19kYXRhLCAwKTsKKwkJaXItPmtleSA9IDA7CisJCWlyLT5wd2xlZCA9IDE7CisJCWlyLT5wd2xlZGNudCA9IDA7CisJCXRtNjAwMF9mbGFzaF9sZWQoZGV2LCAwKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0bTYwMDBfaXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHRtNjAwMF9JUiAqaXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRtNjAwMF9JUiwgd29yay53b3JrKTsKKworCXRtNjAwMF9pcl9oYW5kbGVfa2V5KGlyKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmlyLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKGlyLT5wb2xsaW5nKSk7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX2lyX3N0YXJ0KHN0cnVjdCByY19kZXYgKnJjKQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gcmMtPnByaXY7CisKKwlJTklUX0RFTEFZRURfV09SSygmaXItPndvcmssIHRtNjAwMF9pcl93b3JrKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmlyLT53b3JrLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0bTYwMDBfaXJfc3RvcChzdHJ1Y3QgcmNfZGV2ICpyYykKK3sKKwlzdHJ1Y3QgdG02MDAwX0lSICppciA9IHJjLT5wcml2OworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpci0+d29yayk7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX2lyX2NoYW5nZV9wcm90b2NvbChzdHJ1Y3QgcmNfZGV2ICpyYywgdTY0IHJjX3R5cGUpCit7CisJc3RydWN0IHRtNjAwMF9JUiAqaXIgPSByYy0+cHJpdjsKKworCWlmICghaXIpCisJCXJldHVybiAwOworCisJaWYgKChyYy0+cmNfbWFwLnNjYW4pICYmIChyY190eXBlID09IFJDX1RZUEVfTkVDKSkKKwkJaXItPmtleV9hZGRyID0gKChyYy0+cmNfbWFwLnNjYW5bMF0uc2NhbmNvZGUgPj4gOCkgJiAweGZmZmYpOworCisJaXItPmdldF9rZXkgPSBkZWZhdWx0X3BvbGxpbmdfZ2V0a2V5OworCWlyLT5yY190eXBlID0gcmNfdHlwZTsKKworCXRtNjAwMF9pcl9jb25maWcoaXIpOworCS8qIFRPRE8gKi8KKwlyZXR1cm4gMDsKK30KKworaW50IHRtNjAwMF9pcl9pbnRfc3RhcnQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHRtNjAwMF9JUiAqaXIgPSBkZXYtPmlyOworCWludCBwaXBlLCBzaXplOworCWludCBlcnIgPSAtRU5PTUVNOworCisKKwlpZiAoIWlyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlyLT5pbnRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlyLT5pbnRfdXJiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBpcGUgPSB1c2JfcmN2aW50cGlwZShkZXYtPnVkZXYsCisJCWRldi0+aW50X2luLmVuZHAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcworCQkmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CisKKwlzaXplID0gdXNiX21heHBhY2tldChkZXYtPnVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKwlkcHJpbnRrKCJJUiBtYXggc2l6ZTogJWRcbiIsIHNpemUpOworCisJaXItPmludF91cmItPnRyYW5zZmVyX2J1ZmZlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGlyLT5pbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgeworCQl1c2JfZnJlZV91cmIoaXItPmludF91cmIpOworCQlyZXR1cm4gZXJyOworCX0KKwlkcHJpbnRrKCJpbnQgaW50ZXJ2YWw6ICVkXG4iLCBkZXYtPmludF9pbi5lbmRwLT5kZXNjLmJJbnRlcnZhbCk7CisJdXNiX2ZpbGxfaW50X3VyYihpci0+aW50X3VyYiwgZGV2LT51ZGV2LCBwaXBlLAorCQlpci0+aW50X3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBzaXplLAorCQl0bTYwMDBfaXJfdXJiX3JlY2VpdmVkLCBkZXYsCisJCWRldi0+aW50X2luLmVuZHAtPmRlc2MuYkludGVydmFsKTsKKwllcnIgPSB1c2Jfc3VibWl0X3VyYihpci0+aW50X3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycikgeworCQlrZnJlZShpci0+aW50X3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiX2ZyZWVfdXJiKGlyLT5pbnRfdXJiKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaXItPnVyYl9kYXRhID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHRtNjAwMF9pcl9pbnRfc3RvcChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX0lSICppciA9IGRldi0+aXI7CisKKwlpZiAoIWlyKQorCQlyZXR1cm47CisKKwl1c2Jfa2lsbF91cmIoaXItPmludF91cmIpOworCWtmcmVlKGlyLT5pbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCXVzYl9mcmVlX3VyYihpci0+aW50X3VyYik7CisJaXItPmludF91cmIgPSBOVUxMOworCWtmcmVlKGlyLT51cmJfZGF0YSk7CisJaXItPnVyYl9kYXRhID0gTlVMTDsKK30KKworaW50IHRtNjAwMF9pcl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyOworCXN0cnVjdCByY19kZXYgKnJjOworCWludCBlcnIgPSAtRU5PTUVNOworCisJaWYgKCFlbmFibGVfaXIpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFkZXYtPmNhcHMuaGFzX3JlbW90ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRldi0+aXJfY29kZXMpCisJCXJldHVybiAwOworCisJaXIgPSBremFsbG9jKHNpemVvZigqaXIpLCBHRlBfS0VSTkVMKTsKKwlyYyA9IHJjX2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaXIgfHwgIXJjKQorCQlnb3RvIG91dDsKKworCS8qIHJlY29yZCBoYW5kbGVzIHRvIG91cnNlbGYgKi8KKwlpci0+ZGV2ID0gZGV2OworCWRldi0+aXIgPSBpcjsKKwlpci0+cmMgPSByYzsKKworCS8qIGlucHV0IGVpbnJpY2h0ZW4gKi8KKwlyYy0+YWxsb3dlZF9wcm90b3MgPSBSQ19UWVBFX1JDNSB8IFJDX1RZUEVfTkVDOworCXJjLT5wcml2ID0gaXI7CisJcmMtPmNoYW5nZV9wcm90b2NvbCA9IHRtNjAwMF9pcl9jaGFuZ2VfcHJvdG9jb2w7CisJcmMtPm9wZW4gPSB0bTYwMDBfaXJfc3RhcnQ7CisJcmMtPmNsb3NlID0gdG02MDAwX2lyX3N0b3A7CisJcmMtPmRyaXZlcl90eXBlID0gUkNfRFJJVkVSX1NDQU5DT0RFOworCisJaXItPnBvbGxpbmcgPSA1MDsKKwlpci0+cHdsZWQgPSAwOworCWlyLT5wd2xlZGNudCA9IDA7CisKKworCXNucHJpbnRmKGlyLT5uYW1lLCBzaXplb2YoaXItPm5hbWUpLCAidG01NjAwLzYweDAgSVIgKCVzKSIsCisJCQkJCQlkZXYtPm5hbWUpOworCisJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpKTsKKwlzdHJsY2F0KGlyLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihpci0+cGh5cykpOworCisJdG02MDAwX2lyX2NoYW5nZV9wcm90b2NvbChyYywgUkNfVFlQRV9VTktOT1dOKTsKKworCXJjLT5pbnB1dF9uYW1lID0gaXItPm5hbWU7CisJcmMtPmlucHV0X3BoeXMgPSBpci0+cGh5czsKKwlyYy0+aW5wdXRfaWQuYnVzdHlwZSA9IEJVU19VU0I7CisJcmMtPmlucHV0X2lkLnZlcnNpb24gPSAxOworCXJjLT5pbnB1dF9pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCXJjLT5pbnB1dF9pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJcmMtPm1hcF9uYW1lID0gZGV2LT5pcl9jb2RlczsKKwlyYy0+ZHJpdmVyX25hbWUgPSAidG02MDAwIjsKKwlyYy0+ZGV2LnBhcmVudCA9ICZkZXYtPnVkZXYtPmRldjsKKworCWlmICgmZGV2LT5pbnRfaW4pIHsKKwkJZHByaW50aygiSVIgb3ZlciBpbnRcbiIpOworCisJCWVyciA9IHRtNjAwMF9pcl9pbnRfc3RhcnQoZGV2KTsKKworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogaXIgcmVnaXN0ZXIgKi8KKwllcnIgPSByY19yZWdpc3Rlcl9kZXZpY2UocmMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcmV0dXJuIDA7CisKK291dDoKKwlkZXYtPmlyID0gTlVMTDsKKwlyY19mcmVlX2RldmljZShyYyk7CisJa2ZyZWUoaXIpOworCXJldHVybiBlcnI7Cit9CisKK2ludCB0bTYwMDBfaXJfZmluaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX0lSICppciA9IGRldi0+aXI7CisKKwkvKiBza2lwIGRldGFjaCBvbiBub24gYXR0YWNoZWQgYm9hcmQgKi8KKworCWlmICghaXIpCisJCXJldHVybiAwOworCisJcmNfdW5yZWdpc3Rlcl9kZXZpY2UoaXItPnJjKTsKKworCWlmIChpci0+aW50X3VyYikKKwkJdG02MDAwX2lyX2ludF9zdG9wKGRldik7CisKKwlrZnJlZShpcik7CisJZGV2LT5pciA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1yZWdzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDkxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtcmVncy5oCkBAIC0wLDAgKzEsNjAwIEBACisvKgorICogIHRtNjAwMC1yZWdzLmggLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIERlZmluZSBUViBNYXN0ZXIgVE01NjAwL1RNNjAwMC9UTTYwMTAgUmVxdWVzdCBjb2RlcworICovCisjZGVmaW5lIFJFUV8wMF9TRVRfSVJfVkFMVUUJCTAKKyNkZWZpbmUgUkVRXzAxX1NFVF9XQUtFVVBfSVJDT0RFCTEKKyNkZWZpbmUgUkVRXzAyX0dFVF9JUl9DT0RFCQkyCisjZGVmaW5lIFJFUV8wM19TRVRfR0VUX01DVV9QSU4JCTMKKyNkZWZpbmUgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVAk0CisjZGVmaW5lIFJFUV8wNV9TRVRfR0VUX1VTQlJFRwkJNQorCS8qIFdyaXRlOiBSZWdOdW0sIFZhbHVlLCAwICovCisJLyogUmVhZCA6IFJlZ051bSwgVmFsdWUsIDEsIFJlZ1N0YXR1cyAqLworI2RlZmluZSBSRVFfMDZfU0VUX0dFVF9VU0JSRUdfQklUCTYKKyNkZWZpbmUgUkVRXzA3X1NFVF9HRVRfQVZSRUcJCTcKKwkvKiBXcml0ZTogUmVnTnVtLCBWYWx1ZSwgMCAqLworCS8qIFJlYWQgOiBSZWdOdW0sIFZhbHVlLCAxLCBSZWdTdGF0dXMgKi8KKyNkZWZpbmUgUkVRXzA4X1NFVF9HRVRfQVZSRUdfQklUCTgKKyNkZWZpbmUgUkVRXzA5X1NFVF9HRVRfVFVORVJfRlEJCTkKKyNkZWZpbmUgUkVRXzEwX1NFVF9UVU5FUl9TWVNURU0JCTEwCisjZGVmaW5lIFJFUV8xMV9TRVRfRUVQUk9NX0FERFIJCTExCisjZGVmaW5lIFJFUV8xMl9TRVRfR0VUX0VFUFJPTUJZVEUJMTIKKyNkZWZpbmUgUkVRXzEzX0dFVF9FRVBST01fU0VRUkVBRAkxMworI2RlZmluZSBSRVFfMTRfU0VUX0dFVF9JMkNfV1IyX1JETgkxNAorI2RlZmluZSBSRVFfMTVfU0VUX0dFVF9JMkNCWVRFCQkxNQorCS8qIFdyaXRlOiBTdWJhZGRyLCBTbGF2ZSBBZGRyLCB2YWx1ZSwgMCAqLworCS8qIFJlYWQgOiBTdWJhZGRyLCBTbGF2ZSBBZGRyLCB2YWx1ZSwgMSAqLworI2RlZmluZSBSRVFfMTZfU0VUX0dFVF9JMkNfV1IxX1JETgkxNgorCS8qIFN1YmFkZHIsIFNsYXZlIEFkZHIsIDAsIGxlbmd0aCAqLworI2RlZmluZSBSRVFfMTdfU0VUX0dFVF9JMkNGUAkJMTcKKwkvKiBXcml0ZTogU2xhdmUgQWRkciwgcmVnaXN0ZXIsIHZhbHVlICovCisJLyogUmVhZCA6IFNsYXZlIEFkZHIsIHJlZ2lzdGVyLCAyLCBkYXRhICovCisjZGVmaW5lIFJFUV8yMF9EQVRBX1RSQU5TRkVSCQkyMAorI2RlZmluZSBSRVFfMzBfSTJDX1dSSVRFCQkzMAorI2RlZmluZSBSRVFfMzFfSTJDX1JFQUQJCQkzMQorI2RlZmluZSBSRVFfMzVfQUZURUtfVFVORVJfUkVBRAkJMzUKKyNkZWZpbmUgUkVRXzQwX0dFVF9WRVJTSU9OCQk0MAorI2RlZmluZSBSRVFfNTBfU0VUX1NUQVJUCQk1MAorI2RlZmluZSBSRVFfNTFfU0VUX1NUT1AJCQk1MQorI2RlZmluZSBSRVFfNTJfVFJBTlNNSVRfREFUQQkJNTIKKyNkZWZpbmUgUkVRXzUzX1NQSV9JTklUSUFMCQk1MworI2RlZmluZSBSRVFfNTRfU1BJX1NFVFNUQVJUCQk1NAorI2RlZmluZSBSRVFfNTVfU1BJX0lOT1VUREFUQQkJNTUKKyNkZWZpbmUgUkVRXzU2X1NQSV9TRVRTVE9QCQk1NgorCisvKgorICogRGVmaW5lIFRWIE1hc3RlciBUTTU2MDAvVE02MDAwL1RNNjAxMCBHUElPIGxpbmVzCisgKi8KKworI2RlZmluZSBUTTYwMDBfR1BJT19DTEsJCTB4MTAxCisjZGVmaW5lIFRNNjAwMF9HUElPX0RBVEEJMHgxMDAKKworI2RlZmluZSBUTTYwMDBfR1BJT18xCQkweDEwMgorI2RlZmluZSBUTTYwMDBfR1BJT18yCQkweDEwMworI2RlZmluZSBUTTYwMDBfR1BJT18zCQkweDEwNAorI2RlZmluZSBUTTYwMDBfR1BJT180CQkweDMwMAorI2RlZmluZSBUTTYwMDBfR1BJT181CQkweDMwMQorI2RlZmluZSBUTTYwMDBfR1BJT182CQkweDMwNAorI2RlZmluZSBUTTYwMDBfR1BJT183CQkweDMwNQorCisvKiB0bTYwMTAgZGVmaW5lcyBHUElPIHdpdGggZGlmZmVyZW50IHZhbHVlcyAqLworI2RlZmluZSBUTTYwMTBfR1BJT18wICAgICAgMHgwMTAyCisjZGVmaW5lIFRNNjAxMF9HUElPXzEgICAgICAweDAxMDMKKyNkZWZpbmUgVE02MDEwX0dQSU9fMiAgICAgIDB4MDEwNAorI2RlZmluZSBUTTYwMTBfR1BJT18zICAgICAgMHgwMTA1CisjZGVmaW5lIFRNNjAxMF9HUElPXzQgICAgICAweDAxMDYKKyNkZWZpbmUgVE02MDEwX0dQSU9fNSAgICAgIDB4MDEwNworI2RlZmluZSBUTTYwMTBfR1BJT182ICAgICAgMHgwMzAwCisjZGVmaW5lIFRNNjAxMF9HUElPXzcgICAgICAweDAzMDEKKyNkZWZpbmUgVE02MDEwX0dQSU9fOSAgICAgIDB4MDMwNQorLyoKKyAqIERlZmluZSBUViBNYXN0ZXIgVE01NjAwL1RNNjAwMC9UTTYwMTAgVVJCIG1lc3NhZ2UgY29kZXMgYW5kIGxlbmd0aAorICovCisKK2VudW0geworCVRNNjAwMF9VUkJfTVNHX1ZJREVPID0gMSwKKwlUTTYwMDBfVVJCX01TR19BVURJTywKKwlUTTYwMDBfVVJCX01TR19WQkksCisJVE02MDAwX1VSQl9NU0dfUFRTLAorCVRNNjAwMF9VUkJfTVNHX0VSUiwKK307CisKKy8qIERlZmluZSBzcGVjaWZpYyBUTTYwMDAgVmlkZW8gZGVjb2RlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JEOF9URVNUX1NFTAkJCTB4MDcsIDB4ZDgKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JEOV9BX1NJTV9TRUwJCQkweDA3LCAweGQ5CisjZGVmaW5lIFRNNjAwMF9SRVEwN19SREFfQ0xLX1NFTAkJCTB4MDcsIDB4ZGEKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JEQl9PVVRfU0VMCQkJMHgwNywgMHhkYgorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkRDX05TRUxfSTJTCQkJMHgwNywgMHhkYworI2RlZmluZSBUTTYwMDBfUkVRMDdfUkREX0dQSU8yX01EUlYJCQkweDA3LCAweGRkCisjZGVmaW5lIFRNNjAwMF9SRVEwN19SREVfR1BJTzFfTURSVgkJCTB4MDcsIDB4ZGUKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JERl9QV0RPV05fQUNMSwkJCTB4MDcsIDB4ZGYKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFMF9WQURDX1JFRl9DVEwJCQkweDA3LCAweGUwCisjZGVmaW5lIFRNNjAwMF9SRVEwN19SRTFfVkFEQ19EQUNMSU1QCQkJMHgwNywgMHhlMQorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkUyX1ZBRENfU1RBVFVTX0NUTAkJMHgwNywgMHhlMgorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkUzX1ZBRENfSU5QX0xQRl9TRUwxCQkweDA3LCAweGUzCisjZGVmaW5lIFRNNjAwMF9SRVEwN19SRTRfVkFEQ19UQVJHRVQxCQkJMHgwNywgMHhlNAorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkU1X1ZBRENfSU5QX0xQRl9TRUwyCQkweDA3LCAweGU1CisjZGVmaW5lIFRNNjAwMF9SRVEwN19SRTZfVkFEQ19UQVJHRVQyCQkJMHgwNywgMHhlNgorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkU3X1ZBRENfQUdBSU5fQ1RMCQkJMHgwNywgMHhlNworI2RlZmluZSBUTTYwMDBfUkVRMDdfUkU4X1ZBRENfUFdET1dOX0NUTAkJMHgwNywgMHhlOAorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkU5X1ZBRENfSU5QVVRfQ1RMMQkJMHgwNywgMHhlOQorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkVBX1ZBRENfSU5QVVRfQ1RMMgkJMHgwNywgMHhlYQorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFCQkJMHgwNywgMHhlYgorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkVDX1ZBRENfQUFEQ19MVk9MCQkJMHgwNywgMHhlYworI2RlZmluZSBUTTYwMDBfUkVRMDdfUkVEX1ZBRENfQUFEQ19SVk9MCQkJMHgwNywgMHhlZAorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkVFX1ZBRENfQ1RSTF9TRUxfQ09OVFJPTAkJMHgwNywgMHhlZQorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkVGX1ZBRENfR0FJTl9NQVBfQ1RMCQkweDA3LCAweGVmCisjZGVmaW5lIFRNNjAwMF9SRVEwN19SRkRfQklTVF9FUlJfVlNUX0xPVwkJMHgwNywgMHhmZAorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkZFX0JJU1RfRVJSX1ZTVF9ISUdICQkweDA3LCAweGZlCisKKy8qIERlZmluZSBUTTYwMDAvVE02MDEwIFZpZGVvIGRlY29kZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAJCQkweDA3LCAweDAwCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEJCQkweDA3LCAweDAxCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIJCQkweDA3LCAweDAyCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wJCQkweDA3LCAweDAzCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMDRfTFVNQV9IQUdDX0NPTlRST0wJCTB4MDcsIDB4MDQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IwNV9OT0lTRV9USFJFU0hPTEQJCTB4MDcsIDB4MDUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IwNl9BR0NfR0FURV9USFJFU0hPTEQJCTB4MDcsIDB4MDYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTAkJCTB4MDcsIDB4MDcKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IwOF9MVU1BX0NPTlRSQVNUX0FESgkJMHgwNywgMHgwOAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA5X0xVTUFfQlJJR0hUTkVTU19BREoJCTB4MDcsIDB4MDkKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IwQV9DSFJPTUFfU0FUVVJBVElPTl9BREoJCTB4MDcsIDB4MGEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IwQl9DSFJPTUFfSFVFX1BIQVNFX0FESgkJMHgwNywgMHgwYgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjBDX0NIUk9NQV9BR0NfQ09OVFJPTAkJMHgwNywgMHgwYworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMCQkweDA3LCAweDBkCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMEZfQ0hST01BX0FVVE9fUE9TSVRJT04JCTB4MDcsIDB4MGYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxMF9BR0NfUEVBS19OT01JTkFMCQkweDA3LCAweDEwCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMTFfQUdDX1BFQUtfQ09OVFJPTAkJMHgwNywgMHgxMQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjEyX0FHQ19HQVRFX1NUQVJUSAkJMHgwNywgMHgxMgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjEzX0FHQ19HQVRFX1NUQVJUTAkJMHgwNywgMHgxMworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjE0X0FHQ19HQVRFX1dJRFRICQkJMHgwNywgMHgxNAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjE1X0FHQ19CUF9ERUxBWQkJCTB4MDcsIDB4MTUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxNl9MT0NLX0NPVU5UCQkJMHgwNywgMHgxNgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjE3X0hMT09QX01BWFNUQVRFCQkJMHgwNywgMHgxNworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMwkJMHgwNywgMHgxOAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMgkJMHgwNywgMHgxOQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMQkJMHgwNywgMHgxYQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMAkJMHgwNywgMHgxYgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzCQkweDA3LCAweDFjCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIJCTB4MDcsIDB4MWQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMQkJMHgwNywgMHgxZQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwCQkweDA3LCAweDFmCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMjBfSFNZTkNfUklTSU5HX0VER0VfVElNRQkJMHgwNywgMHgyMAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjIxX0hTWU5DX1BIQVNFX09GRlNFVAkJMHgwNywgMHgyMQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjIyX0hTWU5DX1BMTF9TVEFSVF9USU1FCQkweDA3LCAweDIyCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMjNfSFNZTkNfUExMX0VORF9USU1FCQkweDA3LCAweDIzCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMjRfSFNZTkNfVElQX1NUQVJUX1RJTUUJCTB4MDcsIDB4MjQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IyNV9IU1lOQ19USVBfRU5EX1RJTUUJCTB4MDcsIDB4MjUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IyNl9IU1lOQ19SSVNJTkdfRURHRV9TVEFSVAkweDA3LCAweDI2CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMjdfSFNZTkNfUklTSU5HX0VER0VfRU5ECQkweDA3LCAweDI3CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMjhfQkFDS1BPUkNIX1NUQVJUCQkweDA3LCAweDI4CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMjlfQkFDS1BPUkNIX0VORAkJCTB4MDcsIDB4MjkKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IyQV9IU1lOQ19GSUxURVJfU1RBUlQJCTB4MDcsIDB4MmEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IyQl9IU1lOQ19GSUxURVJfRU5ECQkweDA3LCAweDJiCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMkNfQ0hST01BX0JVUlNUX1NUQVJUCQkweDA3LCAweDJjCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMkRfQ0hST01BX0JVUlNUX0VORAkJMHgwNywgMHgyZAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQJCTB4MDcsIDB4MmUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IyRl9BQ1RJVkVfVklERU9fSFdJRFRICQkweDA3LCAweDJmCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVAkJMHgwNywgMHgzMAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQJCTB4MDcsIDB4MzEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzMl9WU1lOQ19ITE9DS19NSU4JCTB4MDcsIDB4MzIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgJCTB4MDcsIDB4MzMKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzNF9WU1lOQ19BR0NfTUlOCQkJMHgwNywgMHgzNAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgJCQkweDA3LCAweDM1CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMzZfVlNZTkNfVkJJX01JTgkJCTB4MDcsIDB4MzYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzN19WU1lOQ19WQklfTUFYCQkJMHgwNywgMHgzNworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjM4X1ZTWU5DX1RIUkVTSE9MRAkJMHgwNywgMHgzOAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjM5X1ZTWU5DX1RJTUVfQ09OU1RBTlQJCTB4MDcsIDB4MzkKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzQV9TVEFUVVMxCQkJMHgwNywgMHgzYQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjNCX1NUQVRVUzIJCQkweDA3LCAweDNiCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SM0NfU1RBVFVTMwkJCTB4MDcsIDB4M2MKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzRl9SRVNFVAkJCQkweDA3LCAweDNmCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNDBfVEVMRVRFWFRfVkJJX0NPREUwCQkweDA3LCAweDQwCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNDFfVEVMRVRFWFRfVkJJX0NPREUxCQkweDA3LCAweDQxCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNDJfVkJJX0RBVEFfSElHSF9MRVZFTAkJMHgwNywgMHg0MgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQzX1ZCSV9EQVRBX1RZUEVfTElORTcJCTB4MDcsIDB4NDMKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I0NF9WQklfREFUQV9UWVBFX0xJTkU4CQkweDA3LCAweDQ0CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNDVfVkJJX0RBVEFfVFlQRV9MSU5FOQkJMHgwNywgMHg0NQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQ2X1ZCSV9EQVRBX1RZUEVfTElORTEwCQkweDA3LCAweDQ2CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNDdfVkJJX0RBVEFfVFlQRV9MSU5FMTEJCTB4MDcsIDB4NDcKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I0OF9WQklfREFUQV9UWVBFX0xJTkUxMgkJMHgwNywgMHg0OAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQ5X1ZCSV9EQVRBX1RZUEVfTElORTEzCQkweDA3LCAweDQ5CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNEFfVkJJX0RBVEFfVFlQRV9MSU5FMTQJCTB4MDcsIDB4NGEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I0Ql9WQklfREFUQV9UWVBFX0xJTkUxNQkJMHgwNywgMHg0YgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjRDX1ZCSV9EQVRBX1RZUEVfTElORTE2CQkweDA3LCAweDRjCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNERfVkJJX0RBVEFfVFlQRV9MSU5FMTcJCTB4MDcsIDB4NGQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I0RV9WQklfREFUQV9UWVBFX0xJTkUxOAkJMHgwNywgMHg0ZQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjRGX1ZCSV9EQVRBX1RZUEVfTElORTE5CQkweDA3LCAweDRmCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNTBfVkJJX0RBVEFfVFlQRV9MSU5FMjAJCTB4MDcsIDB4NTAKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1MV9WQklfREFUQV9UWVBFX0xJTkUyMQkJMHgwNywgMHg1MQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjUyX1ZCSV9EQVRBX1RZUEVfTElORTIyCQkweDA3LCAweDUyCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNTNfVkJJX0RBVEFfVFlQRV9MSU5FMjMJCTB4MDcsIDB4NTMKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1NF9WQklfREFUQV9UWVBFX1JMSU5FUwkJMHgwNywgMHg1NAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjU1X1ZCSV9MT09QX0ZJTFRFUl9HQUlOCQkweDA3LCAweDU1CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNTZfVkJJX0xPT1BfRklMVEVSX0lfR0FJTgkJMHgwNywgMHg1NgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjU3X1ZCSV9MT09QX0ZJTFRFUl9QX0dBSU4JCTB4MDcsIDB4NTcKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1OF9WQklfQ0FQVElPTl9EVE8xCQkweDA3LCAweDU4CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNTlfVkJJX0NBUFRJT05fRFRPMAkJMHgwNywgMHg1OQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjVBX1ZCSV9URUxFVEVYVF9EVE8xCQkweDA3LCAweDVhCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNUJfVkJJX1RFTEVURVhUX0RUTzAJCTB4MDcsIDB4NWIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1Q19WQklfV1NTNjI1X0RUTzEJCTB4MDcsIDB4NWMKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1RF9WQklfV1NTNjI1X0RUTzAJCTB4MDcsIDB4NWQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1RV9WQklfQ0FQVElPTl9GUkFNRV9TVEFSVAkweDA3LCAweDVlCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNUZfVkJJX1dTUzYyNV9GUkFNRV9TVEFSVAkJMHgwNywgMHg1ZgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjYwX1RFTEVURVhUX0ZSQU1FX1NUQVJUCQkweDA3LCAweDYwCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNjFfVkJJX0NDREFUQTEJCQkweDA3LCAweDYxCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNjJfVkJJX0NDREFUQTIJCQkweDA3LCAweDYyCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNjNfVkJJX1dTUzYyNV9EQVRBMQkJMHgwNywgMHg2MworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjY0X1ZCSV9XU1M2MjVfREFUQTIJCTB4MDcsIDB4NjQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I2NV9WQklfREFUQV9TVEFUVVMJCTB4MDcsIDB4NjUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I2Nl9WQklfQ0FQVElPTl9TVEFSVAkJMHgwNywgMHg2NgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjY3X1ZCSV9XU1M2MjVfU1RBUlQJCTB4MDcsIDB4NjcKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I2OF9WQklfVEVMRVRFWFRfU1RBUlQJCTB4MDcsIDB4NjgKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3MF9IU1lOQ19EVE9fSU5DX1NUQVRVUzMJCTB4MDcsIDB4NzAKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3MV9IU1lOQ19EVE9fSU5DX1NUQVRVUzIJCTB4MDcsIDB4NzEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3Ml9IU1lOQ19EVE9fSU5DX1NUQVRVUzEJCTB4MDcsIDB4NzIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3M19IU1lOQ19EVE9fSU5DX1NUQVRVUzAJCTB4MDcsIDB4NzMKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3NF9DSFJPTUFfRFRPX0lOQ19TVEFUVVMzCQkweDA3LCAweDc0CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNzVfQ0hST01BX0RUT19JTkNfU1RBVFVTMgkJMHgwNywgMHg3NQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjc2X0NIUk9NQV9EVE9fSU5DX1NUQVRVUzEJCTB4MDcsIDB4NzYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3N19DSFJPTUFfRFRPX0lOQ19TVEFUVVMwCQkweDA3LCAweDc3CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNzhfQUdDX0FHQUlOX1NUQVRVUwkJMHgwNywgMHg3OAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjc5X0FHQ19ER0FJTl9TVEFUVVMJCTB4MDcsIDB4NzkKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3QV9DSFJPTUFfTUFHX1NUQVRVUwkJMHgwNywgMHg3YQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjdCX0NIUk9NQV9HQUlOX1NUQVRVUzEJCTB4MDcsIDB4N2IKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3Q19DSFJPTUFfR0FJTl9TVEFUVVMwCQkweDA3LCAweDdjCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SN0RfQ09SRElDX0ZSRVFfU1RBVFVTCQkweDA3LCAweDdkCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SN0ZfU1RBVFVTX05PSVNFCQkJMHgwNywgMHg3ZgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjgwX0NPTUJfRklMVEVSX1RSRVNIT0xECQkweDA3LCAweDgwCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHCQkweDA3LCAweDgyCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHCQkweDA3LCAweDgzCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SODRfTk9JU0VfTlRTQ19DCQkJMHgwNywgMHg4NAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjg1X05PSVNFX1BBTF9DCQkJMHgwNywgMHg4NQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjg2X05PSVNFX1BIQVNFX0MJCQkweDA3LCAweDg2CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SODdfTk9JU0VfUEhBU0VfWQkJCTB4MDcsIDB4ODcKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I4QV9DSFJPTUFfTE9PUEZJTFRFUl9TVEFURQkweDA3LCAweDhhCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SOEJfQ0hST01BX0hSRVNBTVBMRVIJCTB4MDcsIDB4OGIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I4RF9DUFVNUF9ERUxBWV9BREoJCTB4MDcsIDB4OGQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I4RV9DUFVNUF9BREoJCQkweDA3LCAweDhlCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SOEZfQ1BVTVBfREVMQVkJCQkweDA3LCAweDhmCisKKy8qIERlZmluZSBUTTYwMDAvVE02MDEwIE1pc2NlbGxhbmVvdXMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRQkJMHgwNywgMHhjMAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkMxX1RSRVNIT0xECQkJMHgwNywgMHhjMQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkMyX0hTWU5DX1dJRFRICQkJMHgwNywgMHhjMgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkMzX0hTVEFSVDEJCQkweDA3LCAweGMzCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SQzRfSFNUQVJUMAkJCTB4MDcsIDB4YzQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JDNV9IRU5EMQkJCQkweDA3LCAweGM1CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SQzZfSEVORDAJCQkJMHgwNywgMHhjNgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkM3X1ZTVEFSVDEJCQkweDA3LCAweGM3CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SQzhfVlNUQVJUMAkJCTB4MDcsIDB4YzgKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JDOV9WRU5EMQkJCQkweDA3LCAweGM5CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SQ0FfVkVORDAJCQkJMHgwNywgMHhjYQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkNCX0RFTEFZCQkJCTB4MDcsIDB4Y2IKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9JRgkJCTB4MDcsIDB4Y2MKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUZfVklERU9fRU5BQkxFICgxIDw8IDUpCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX0lGX0FVRElPX0VOQUJMRSAoMSA8PCA2KQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQwX1VTQl9QRVJJUEhFUllfQ09OVFJPTAkJMHgwNywgMHhkMAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQxX0FERFJfRk9SX1JFUTEJCQkweDA3LCAweGQxCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRDJfQUREUl9GT1JfUkVRMgkJCTB4MDcsIDB4ZDIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JEM19BRERSX0ZPUl9SRVEzCQkJMHgwNywgMHhkMworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ0X0FERFJfRk9SX1JFUTQJCQkweDA3LCAweGQ0CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRDVfUE9XRVJTQVZFCQkJMHgwNywgMHhkNQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ2X0VORFBfUkVRMV9SRVEyCQkJMHgwNywgMHhkNgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ3X0VORFBfUkVRM19SRVE0CQkJMHgwNywgMHhkNworLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVIJCQkJMHgwNywgMHhkOAorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVJfQlNJWkUJCQkweDA3LCAweGQ5CisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9XQUtFVVBfU0VMCQkJMHgwNywgMHhkYQorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVJfV0FLRVVQX0FERAkJCTB4MDcsIDB4ZGIKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSX0xFQURFUjEJCQkweDA3LCAweGRjCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9MRUFERVIwCQkJMHgwNywgMHhkZAorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVJfUFVMU0VfQ05UMQkJCTB4MDcsIDB4ZGUKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSX1BVTFNFX0NOVDAJCQkweDA3LCAweGRmCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JFMF9EVklERU9fU09VUkNFCQkJMHgwNywgMHhlMAorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRTBfRFZJREVPX1NPVVJDRV9JRgkJMHgwNywgMHhlMQorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRTJfT1VUX1NFTDIJCQkweDA3LCAweGUyCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JFM19PVVRfU0VMMQkJCTB4MDcsIDB4ZTMKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkU0X09VVF9TRUwwCQkJMHgwNywgMHhlNAorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRTVfUkVNT1RFX1dBS0VVUAkJCTB4MDcsIDB4ZTUKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkU3X1BVQl9HUElPCQkJMHgwNywgMHhlNworLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRThfVFlQRVNFTF9NT1NfSTJTCQkweDA3LCAweGU4CisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JFOV9UWVBFU0VMX01PU19UUwkJCTB4MDcsIDB4ZTkKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkVBX1RZUEVTRUxfTU9TX0NDSVIJCTB4MDcsIDB4ZWEKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkYwX0JJU1RfQ1JDX1JFU1VMVDAJCTB4MDcsIDB4ZjAKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkYxX0JJU1RfQ1JDX1JFU1VMVDEJCTB4MDcsIDB4ZjEKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkYyX0JJU1RfQ1JDX1JFU1VMVDIJCTB4MDcsIDB4ZjIKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkYzX0JJU1RfQ1JDX1JFU1VMVDMJCTB4MDcsIDB4ZjMKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkY0X0JJU1RfRVJSX1ZTVDIJCQkweDA3LCAweGY0CisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JGNV9CSVNUX0VSUl9WU1QxCQkJMHgwNywgMHhmNQorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRjZfQklTVF9FUlJfVlNUMAkJCTB4MDcsIDB4ZjYKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkY3X0JJU1QJCQkJMHgwNywgMHhmNworLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRkVfUE9XRVJfRE9XTgkJCTB4MDcsIDB4ZmUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JGRl9TT0ZUX1JFU0VUCQkJMHgwNywgMHhmZgorCisvKiBEZWZpbmUgVE02MDAwL1RNNjAxMCBVU0IgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDBfTUFJTl9DVFJMCQkweDA1LCAweDAwCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDFfREVWQUREUgkJMHgwNSwgMHgwMQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjAyX1RFU1QJCQkweDA1LCAweDAyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDRfU09GTjAJCQkweDA1LCAweDA0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDVfU09GTjEJCQkweDA1LCAweDA1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDZfU09GVE0wCQkJMHgwNSwgMHgwNgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjA3X1NPRlRNMQkJCTB4MDUsIDB4MDcKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IwOF9QSFlfVEVTVAkJMHgwNSwgMHgwOAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjA5X1ZDVEwJCQkweDA1LCAweDA5CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMEFfVlNUQQkJCTB4MDUsIDB4MGEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IwQl9DWF9DRkcJCQkweDA1LCAweDBiCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMENfRU5EUDBfUkVHMAkJMHgwNSwgMHgwYworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjEwX0dNQVNLCQkJMHgwNSwgMHgxMAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjExX0lNQVNLMAkJCTB4MDUsIDB4MTEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxMl9JTUFTSzEJCQkweDA1LCAweDEyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTNfSU1BU0syCQkJMHgwNSwgMHgxMworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjE0X0lNQVNLMwkJCTB4MDUsIDB4MTQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxNV9JTUFTSzQJCQkweDA1LCAweDE1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTZfSU1BU0s1CQkJMHgwNSwgMHgxNgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjE3X0lNQVNLNgkJCTB4MDUsIDB4MTcKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxOF9JTUFTSzcJCQkweDA1LCAweDE4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTlfWkVST1AwCQkJMHgwNSwgMHgxOQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjFBX1pFUk9QMQkJCTB4MDUsIDB4MWEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxQ19GSUZPX0VNUDAJCTB4MDUsIDB4MWMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxRF9GSUZPX0VNUDEJCTB4MDUsIDB4MWQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyMF9JUlFfR1JPVVAJCTB4MDUsIDB4MjAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyMV9JUlFfU09VUkNFMAkJMHgwNSwgMHgyMQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjIyX0lSUV9TT1VSQ0UxCQkweDA1LCAweDIyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjNfSVJRX1NPVVJDRTIJCTB4MDUsIDB4MjMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyNF9JUlFfU09VUkNFMwkJMHgwNSwgMHgyNAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjI1X0lSUV9TT1VSQ0U0CQkweDA1LCAweDI1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjZfSVJRX1NPVVJDRTUJCTB4MDUsIDB4MjYKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyN19JUlFfU09VUkNFNgkJMHgwNSwgMHgyNworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjI4X0lSUV9TT1VSQ0U3CQkweDA1LCAweDI4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjlfU0VRX0VSUjAJCTB4MDUsIDB4MjkKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyQV9TRVFfRVJSMQkJMHgwNSwgMHgyYQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjJCX1NFUV9BQk9SVDAJCTB4MDUsIDB4MmIKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyQ19TRVFfQUJPUlQxCQkweDA1LCAweDJjCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMkRfVFhfWkVSTzAJCTB4MDUsIDB4MmQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyRV9UWF9aRVJPMQkJMHgwNSwgMHgyZQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjJGX0lETEVfQ05UCQkweDA1LCAweDJmCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzBfRk5PX1AxCQkJMHgwNSwgMHgzMAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMxX0ZOT19QMgkJCTB4MDUsIDB4MzEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMl9GTk9fUDMJCQkweDA1LCAweDMyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzNfRk5PX1A0CQkJMHgwNSwgMHgzMworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjM0X0ZOT19QNQkJCTB4MDUsIDB4MzQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzNV9GTk9fUDYJCQkweDA1LCAweDM1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzZfRk5PX1A3CQkJMHgwNSwgMHgzNgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjM3X0ZOT19QOAkJCTB4MDUsIDB4MzcKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzOF9GTk9fUDkJCQkweDA1LCAweDM4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzBfRk5PX1AxMAkJMHgwNSwgMHgzOQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMwX0ZOT19QMTEJCTB4MDUsIDB4M2EKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDEyCQkweDA1LCAweDNiCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzBfRk5PX1AxMwkJMHgwNSwgMHgzYworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMwX0ZOT19QMTQJCTB4MDUsIDB4M2QKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDE1CQkweDA1LCAweDNlCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDBfSU5fTUFYUFNfTE9XMQkJMHgwNSwgMHg0MAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQxX0lOX01BWFBTX0hJR0gxCQkweDA1LCAweDQxCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDJfSU5fTUFYUFNfTE9XMgkJMHgwNSwgMHg0MgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQzX0lOX01BWFBTX0hJR0gyCQkweDA1LCAweDQzCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDRfSU5fTUFYUFNfTE9XMwkJMHgwNSwgMHg0NAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQ1X0lOX01BWFBTX0hJR0gzCQkweDA1LCAweDQ1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDZfSU5fTUFYUFNfTE9XNAkJMHgwNSwgMHg0NgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQ3X0lOX01BWFBTX0hJR0g0CQkweDA1LCAweDQ3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDhfSU5fTUFYUFNfTE9XNQkJMHgwNSwgMHg0OAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQ5X0lOX01BWFBTX0hJR0g1CQkweDA1LCAweDQ5CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNEFfSU5fTUFYUFNfTE9XNgkJMHgwNSwgMHg0YQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjRCX0lOX01BWFBTX0hJR0g2CQkweDA1LCAweDRiCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNENfSU5fTUFYUFNfTE9XNwkJMHgwNSwgMHg0YworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjREX0lOX01BWFBTX0hJR0g3CQkweDA1LCAweDRkCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNEVfSU5fTUFYUFNfTE9XOAkJMHgwNSwgMHg0ZQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjRGX0lOX01BWFBTX0hJR0g4CQkweDA1LCAweDRmCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNTBfSU5fTUFYUFNfTE9XOQkJMHgwNSwgMHg1MAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjUxX0lOX01BWFBTX0hJR0g5CQkweDA1LCAweDUxCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDBfSU5fTUFYUFNfTE9XMTAJCTB4MDUsIDB4NTIKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MV9JTl9NQVhQU19ISUdIMTAJMHgwNSwgMHg1MworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQwX0lOX01BWFBTX0xPVzExCQkweDA1LCAweDU0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDExCTB4MDUsIDB4NTUKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxMgkJMHgwNSwgMHg1NgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQxX0lOX01BWFBTX0hJR0gxMgkweDA1LCAweDU3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDBfSU5fTUFYUFNfTE9XMTMJCTB4MDUsIDB4NTgKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MV9JTl9NQVhQU19ISUdIMTMJMHgwNSwgMHg1OQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQwX0lOX01BWFBTX0xPVzE0CQkweDA1LCAweDVhCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDE0CTB4MDUsIDB4NWIKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxNQkJMHgwNSwgMHg1YworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQxX0lOX01BWFBTX0hJR0gxNQkweDA1LCAweDVkCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjBfT1VUX01BWFBTX0xPVzEJCTB4MDUsIDB4NjAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MV9PVVRfTUFYUFNfSElHSDEJMHgwNSwgMHg2MQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYyX09VVF9NQVhQU19MT1cyCQkweDA1LCAweDYyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjNfT1VUX01BWFBTX0hJR0gyCTB4MDUsIDB4NjMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2NF9PVVRfTUFYUFNfTE9XMwkJMHgwNSwgMHg2NAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjY1X09VVF9NQVhQU19ISUdIMwkweDA1LCAweDY1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjZfT1VUX01BWFBTX0xPVzQJCTB4MDUsIDB4NjYKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2N19PVVRfTUFYUFNfSElHSDQJMHgwNSwgMHg2NworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjY4X09VVF9NQVhQU19MT1c1CQkweDA1LCAweDY4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjlfT1VUX01BWFBTX0hJR0g1CTB4MDUsIDB4NjkKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2QV9PVVRfTUFYUFNfTE9XNgkJMHgwNSwgMHg2YQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjZCX09VVF9NQVhQU19ISUdINgkweDA1LCAweDZiCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNkNfT1VUX01BWFBTX0xPVzcJCTB4MDUsIDB4NmMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2RF9PVVRfTUFYUFNfSElHSDcJMHgwNSwgMHg2ZAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjZFX09VVF9NQVhQU19MT1c4CQkweDA1LCAweDZlCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNkZfT1VUX01BWFBTX0hJR0g4CTB4MDUsIDB4NmYKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I3MF9PVVRfTUFYUFNfTE9XOQkJMHgwNSwgMHg3MAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjcxX09VVF9NQVhQU19ISUdIOQkweDA1LCAweDcxCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjBfT1VUX01BWFBTX0xPVzEwCTB4MDUsIDB4NzIKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MV9PVVRfTUFYUFNfSElHSDEwCTB4MDUsIDB4NzMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMTEJMHgwNSwgMHg3NAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMTEJMHgwNSwgMHg3NQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYwX09VVF9NQVhQU19MT1cxMgkweDA1LCAweDc2CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjFfT1VUX01BWFBTX0hJR0gxMgkweDA1LCAweDc3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjBfT1VUX01BWFBTX0xPVzEzCTB4MDUsIDB4NzgKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MV9PVVRfTUFYUFNfSElHSDEzCTB4MDUsIDB4NzkKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMTQJMHgwNSwgMHg3YQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMTQJMHgwNSwgMHg3YgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYwX09VVF9NQVhQU19MT1cxNQkweDA1LCAweDdjCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjFfT1VUX01BWFBTX0hJR0gxNQkweDA1LCAweDdkCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODBfRklGTzAJCQkweDA1LCAweDgwCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODFfRklGTzEJCQkweDA1LCAweDgxCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODJfRklGTzIJCQkweDA1LCAweDgyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODNfRklGTzMJCQkweDA1LCAweDgzCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODRfRklGTzQJCQkweDA1LCAweDg0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODVfRklGTzUJCQkweDA1LCAweDg1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODZfRklGTzYJCQkweDA1LCAweDg2CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODdfRklGTzcJCQkweDA1LCAweDg3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODhfRklGTzgJCQkweDA1LCAweDg4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODlfRklGTzkJCQkweDA1LCAweDg5CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODFfRklGTzEwCQkJMHgwNSwgMHg4YQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgxX0ZJRk8xMQkJCTB4MDUsIDB4OGIKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMTIJCQkweDA1LCAweDhjCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODFfRklGTzEzCQkJMHgwNSwgMHg4ZAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgxX0ZJRk8xNAkJCTB4MDUsIDB4OGUKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMTUJCQkweDA1LCAweDhmCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTBfQ0ZHX0ZJRk8wCQkweDA1LCAweDkwCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTFfQ0ZHX0ZJRk8xCQkweDA1LCAweDkxCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTJfQ0ZHX0ZJRk8yCQkweDA1LCAweDkyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTNfQ0ZHX0ZJRk8zCQkweDA1LCAweDkzCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTRfQ0ZHX0ZJRk80CQkweDA1LCAweDk0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTVfQ0ZHX0ZJRk81CQkweDA1LCAweDk1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTZfQ0ZHX0ZJRk82CQkweDA1LCAweDk2CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTdfQ0ZHX0ZJRk83CQkweDA1LCAweDk3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOThfQ0ZHX0ZJRk84CQkweDA1LCAweDk4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTlfQ0ZHX0ZJRk85CQkweDA1LCAweDk5CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTFfQ0ZHX0ZJRk8xMAkJMHgwNSwgMHg5YQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkxX0NGR19GSUZPMTEJCTB4MDUsIDB4OWIKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzEyCQkweDA1LCAweDljCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTFfQ0ZHX0ZJRk8xMwkJMHgwNSwgMHg5ZAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkxX0NGR19GSUZPMTQJCTB4MDUsIDB4OWUKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzE1CQkweDA1LCAweDlmCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTBfQ1RMX0ZJRk8wCQkweDA1LCAweGEwCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTFfQ1RMX0ZJRk8xCQkweDA1LCAweGExCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTJfQ1RMX0ZJRk8yCQkweDA1LCAweGEyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTNfQ1RMX0ZJRk8zCQkweDA1LCAweGEzCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTRfQ1RMX0ZJRk80CQkweDA1LCAweGE0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTVfQ1RMX0ZJRk81CQkweDA1LCAweGE1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTZfQ1RMX0ZJRk82CQkweDA1LCAweGE2CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTdfQ1RMX0ZJRk83CQkweDA1LCAweGE3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQThfQ1RMX0ZJRk84CQkweDA1LCAweGE4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTlfQ1RMX0ZJRk85CQkweDA1LCAweGE5CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTFfQ1RMX0ZJRk8xMAkJMHgwNSwgMHhhYQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkExX0NUTF9GSUZPMTEJCTB4MDUsIDB4YWIKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzEyCQkweDA1LCAweGFjCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTFfQ1RMX0ZJRk8xMwkJMHgwNSwgMHhhZAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkExX0NUTF9GSUZPMTQJCTB4MDUsIDB4YWUKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzE1CQkweDA1LCAweGFmCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjBfQkNfTE9XX0ZJRk8wCQkweDA1LCAweGIwCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjFfQkNfTE9XX0ZJRk8xCQkweDA1LCAweGIxCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjJfQkNfTE9XX0ZJRk8yCQkweDA1LCAweGIyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjNfQkNfTE9XX0ZJRk8zCQkweDA1LCAweGIzCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjRfQkNfTE9XX0ZJRk80CQkweDA1LCAweGI0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjVfQkNfTE9XX0ZJRk81CQkweDA1LCAweGI1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjZfQkNfTE9XX0ZJRk82CQkweDA1LCAweGI2CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjdfQkNfTE9XX0ZJRk83CQkweDA1LCAweGI3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjhfQkNfTE9XX0ZJRk84CQkweDA1LCAweGI4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjlfQkNfTE9XX0ZJRk85CQkweDA1LCAweGI5CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjFfQkNfTE9XX0ZJRk8xMAkJMHgwNSwgMHhiYQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIxX0JDX0xPV19GSUZPMTEJCTB4MDUsIDB4YmIKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzEyCQkweDA1LCAweGJjCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjFfQkNfTE9XX0ZJRk8xMwkJMHgwNSwgMHhiZAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIxX0JDX0xPV19GSUZPMTQJCTB4MDUsIDB4YmUKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzE1CQkweDA1LCAweGJmCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzBfREFUQV9GSUZPMAkJMHgwNSwgMHhjMAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM0X0RBVEFfRklGTzEJCTB4MDUsIDB4YzQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JDOF9EQVRBX0ZJRk8yCQkweDA1LCAweGM4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQ0NfREFUQV9GSUZPMwkJMHgwNSwgMHhjYworI2RlZmluZSBUTTYwMTBfUkVRMDVfUkQwX0RBVEFfRklGTzQJCTB4MDUsIDB4ZDAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JENF9EQVRBX0ZJRk81CQkweDA1LCAweGQ0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SRDhfREFUQV9GSUZPNgkJMHgwNSwgMHhkOAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkRDX0RBVEFfRklGTzcJCTB4MDUsIDB4ZGMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JFMF9EQVRBX0ZJRk84CQkweDA1LCAweGUwCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SRTRfREFUQV9GSUZPOQkJMHgwNSwgMHhlNAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM0X0RBVEFfRklGTzEwCQkweDA1LCAweGU4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMTEJCTB4MDUsIDB4ZWMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JDNF9EQVRBX0ZJRk8xMgkJMHgwNSwgMHhmMAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM0X0RBVEFfRklGTzEzCQkweDA1LCAweGY0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMTQJCTB4MDUsIDB4ZjgKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JDNF9EQVRBX0ZJRk8xNQkJMHgwNSwgMHhmYworCisvKiBEZWZpbmUgVE02MDEwIEF1ZGlvIGRlY29kZXIgcmVnaXN0ZXJzICovCisvKiBUaGlzIGNvcmUgYXZhaWxhYmxlIG9ubHkgaW4gVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDBfQV9WRVJTSU9OCQkweDA4LCAweDAwCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDFfQV9JTklUCQkJMHgwOCwgMHgwMQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjAyX0FfRklYX0dBSU5fQ1RSTAkweDA4LCAweDAyCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDNfQV9BVVRPX0dBSU5fQ1RSTAkweDA4LCAweDAzCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDRfQV9TSUZfQU1QX0NUUkwJCTB4MDgsIDB4MDQKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IwNV9BX1NUQU5EQVJEX01PRAkJMHgwOCwgMHgwNQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjA2X0FfU09VTkRfTU9ECQkweDA4LCAweDA2CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDdfQV9MRUZUX1ZPTAkJMHgwOCwgMHgwNworI2RlZmluZSBUTTYwMTBfUkVRMDhfUjA4X0FfUklHSFRfVk9MCQkweDA4LCAweDA4CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDlfQV9NQUlOX1ZPTAkJMHgwOCwgMHgwOQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjBBX0FfSTJTX01PRAkJMHgwOCwgMHgwYQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjBCX0FfQVNEX1RIUkVTMQkJMHgwOCwgMHgwYgorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjBDX0FfQVNEX1RIUkVTMgkJMHgwOCwgMHgwYworI2RlZmluZSBUTTYwMTBfUkVRMDhfUjBEX0FfQU1EX1RIUkVTCQkweDA4LCAweDBkCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMEVfQV9NT05PX1RIUkVTMQkJMHgwOCwgMHgwZQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjBGX0FfTU9OT19USFJFUzIJCTB4MDgsIDB4MGYKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IxMF9BX01VVEVfVEhSRVMxCQkweDA4LCAweDEwCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTFfQV9NVVRFX1RIUkVTMgkJMHgwOCwgMHgxMQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjEyX0FfQUdDX1UJCTB4MDgsIDB4MTIKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IxM19BX0FHQ19FUlJfVAkJMHgwOCwgMHgxMworI2RlZmluZSBUTTYwMTBfUkVRMDhfUjE0X0FfQUdDX0dBSU5fSU5JVAkweDA4LCAweDE0CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTVfQV9BR0NfU1RFUF9USFIJCTB4MDgsIDB4MTUKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IxNl9BX0FHQ19HQUlOX01BWAkJMHgwOCwgMHgxNgorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjE3X0FfQUdDX0dBSU5fTUlOCQkweDA4LCAweDE3CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMThfQV9UUl9DVFJMCQkweDA4LCAweDE4CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTlfQV9GSF8yRkhfR0FJTgkJMHgwOCwgMHgxOQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjFBX0FfTklDQU1fU0VSX01BWAkweDA4LCAweDFhCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMUJfQV9OSUNBTV9TRVJfTUlOCTB4MDgsIDB4MWIKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IxRV9BX0dBSU5fREVFTVBIX09VVAkweDA4LCAweDFlCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMUZfQV9URVNUX0lOVEZfU0VMCTB4MDgsIDB4MWYKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IyMF9BX1RFU1RfUElOX1NFTAkJMHgwOCwgMHgyMAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjIxX0FfQUdDX0VSUgkJMHgwOCwgMHgyMQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjIyX0FfQUdDX0dBSU4JCTB4MDgsIDB4MjIKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IyM19BX05JQ0FNX0lORk8JCTB4MDgsIDB4MjMKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IyNF9BX1NFUgkJCTB4MDgsIDB4MjQKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IyNV9BX0MxX0FNUAkJMHgwOCwgMHgyNQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjI2X0FfQzJfQU1QCQkweDA4LCAweDI2CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjdfQV9OT0lTRV9BTVAJCTB4MDgsIDB4MjcKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IyOF9BX0FVRElPX01PREVfUkVTCTB4MDgsIDB4MjgKKworLyogRGVmaW5lIFRNNjAxMCBWaWRlbyBBREMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTBfQURDX1JFRgkJMHgwOCwgMHhlMAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUkUxX0RBQ19DTE1QCQkweDA4LCAweGUxCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTJfUE9XRVJfRE9XTl9DVFJMMQkweDA4LCAweGUyCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwJCTB4MDgsIDB4ZTMKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JFNF9BRENfSU4yX1NFTAkJMHgwOCwgMHhlNAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUkU1X0dBSU5fUEFSQU0JCTB4MDgsIDB4ZTUKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JFNl9QT1dFUl9ET1dOX0NUUkwyCTB4MDgsIDB4ZTYKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JFN19SRUdfR0FJTl9ZCQkweDA4LCAweGU3CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRThfUkVHX0dBSU5fQwkJMHgwOCwgMHhlOAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUkU5X0JJQVNfQ1RSTAkJMHgwOCwgMHhlOQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUkVBX0JVRkZfRFJWX0NUUkwJCTB4MDgsIDB4ZWEKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JFQl9TSUZfR0FJTl9DVFJMCQkweDA4LCAweGViCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRUNfUkVWRVJTRV9ZQ19DVFJMCTB4MDgsIDB4ZWMKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JFRF9HQUlOX1NFTAkJMHgwOCwgMHhlZAorCisvKiBEZWZpbmUgVE02MDEwIEF1ZGlvIEFEQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHCTB4MDgsIDB4ZjAKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JGMV9BQURDX1BPV0VSX0RPV04JMHgwOCwgMHhmMQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUkYyX0xFRlRfQ0hBTk5FTF9WT0wJMHgwOCwgMHhmMgorI2RlZmluZSBUTTYwMTBfUkVRMDhfUkYzX1JJR0hUX0NIQU5ORUxfVk9MCTB4MDgsIDB4ZjMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1zdGRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtc3Rkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDE0NWRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLXN0ZHMuYwpAQCAtMCwwICsxLDY1OSBAQAorLyoKKyAqICB0bTYwMDAtc3Rkcy5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSAidG02MDAwLmgiCisjaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCB0bTYwMTBfYV9tb2RlOworbW9kdWxlX3BhcmFtKHRtNjAxMF9hX21vZGUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHRtNjAxMF9hX21vZGUsICJzZXQgdG02MDEwIHNpZiBhdWRpbyBtb2RlIik7CisKK3N0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzIHsKKwl1bnNpZ25lZCBjaGFyIHJlcTsKKwl1bnNpZ25lZCBjaGFyIHJlZzsKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOworfTsKKworCitzdHJ1Y3QgdG02MDAwX3N0ZF9zZXR0aW5ncyB7CisJdjRsMl9zdGRfaWQgaWQ7CisJc3RydWN0IHRtNjAwMF9yZWdfc2V0dGluZ3MgKmNvbW1vbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyBjb21wb3NpdGVfcGFsX21bXSA9IHsKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MDQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDAgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg4MyB9LAorCXsgVE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4MGEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGUwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4ODggfSwKKwl7IFRNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyMCB9LAorCXsgVE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweDYxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgwYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg1MiB9LAorCXsgVE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4NmYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDRfTFVNQV9IQUdDX0NPTlRST0wsIDB4ZGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDcgfSwKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDAgfSwKKwl7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzIGNvbXBvc2l0ZV9wYWxfbmNbXSA9IHsKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MzYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg5MSB9LAorCXsgVE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4MWYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweDBjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4OGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweGMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgwYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg1MiB9LAorCXsgVE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4NmYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDRfTFVNQV9IQUdDX0NPTlRST0wsIDB4ZGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDcgfSwKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDAgfSwKKwl7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzIGNvbXBvc2l0ZV9wYWxbXSA9IHsKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MzIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDI1IH0sCisJeyBUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHhkNSB9LAorCXsgVE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4NjMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweDUwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4OGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweGMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgwYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg1MiB9LAorCXsgVE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4NmYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDRfTFVNQV9IQUdDX0NPTlRST0wsIDB4ZGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDcgfSwKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDAgfSwKKwl7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzIGNvbXBvc2l0ZV9zZWNhbVtdID0geworCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgzOCB9LAorCXsgVE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMiB9LAorCXsgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MjQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDkyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhlOCB9LAorCXsgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZWQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2QgfSwKKwl7IFRNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4YyB9LAorCXsgVE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDJjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4YzEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDJjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MTggfSwKKwl7IFRNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDQyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHhmZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwNyB9LAorCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRtNjAwMF9yZWdfc2V0dGluZ3MgY29tcG9zaXRlX250c2NbXSA9IHsKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MDAgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDAgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg4YiB9LAorCXsgVE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4YTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGU5IH0sCisJeyBUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4ODggfSwKKwl7IFRNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyMiB9LAorCXsgVE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweDYxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg0MiB9LAorCXsgVE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4NmYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDRfTFVNQV9IQUdDX0NPTlRST0wsIDB4ZGQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDcgfSwKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDAgfSwKKwl7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCB0bTYwMDBfc3RkX3NldHRpbmdzIGNvbXBvc2l0ZV9zdGRzW10gPSB7CisJeyAuaWQgPSBWNEwyX1NURF9QQUxfTSwgLmNvbW1vbiA9IGNvbXBvc2l0ZV9wYWxfbSwgfSwKKwl7IC5pZCA9IFY0TDJfU1REX1BBTF9OYywgLmNvbW1vbiA9IGNvbXBvc2l0ZV9wYWxfbmMsIH0sCisJeyAuaWQgPSBWNEwyX1NURF9QQUwsIC5jb21tb24gPSBjb21wb3NpdGVfcGFsLCB9LAorCXsgLmlkID0gVjRMMl9TVERfU0VDQU0sIC5jb21tb24gPSBjb21wb3NpdGVfc2VjYW0sIH0sCisJeyAuaWQgPSBWNEwyX1NURF9OVFNDLCAuY29tbW9uID0gY29tcG9zaXRlX250c2MsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHRtNjAwMF9yZWdfc2V0dGluZ3Mgc3ZpZGVvX3BhbF9tW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDA1IH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDA0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4ODMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDBhIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHhlMCB9LAorCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHg2MSB9LAorCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyBzdmlkZW9fcGFsX25jW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDM3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDA0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OTEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDFmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHgwYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHhjMSB9LAorCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyBzdmlkZW9fcGFsW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDMzIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDA0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgyNSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4ZDUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDYzIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHg1MCB9LAorCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDhjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MmEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHhjMSB9LAorCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyBzdmlkZW9fc2VjYW1bXSA9IHsKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MzkgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDI0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg5MiB9LAorCXsgVE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4ZTggfSwKKwl7IFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGVkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4OGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyYSB9LAorCXsgVE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweGMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgyYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDE4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg0MiB9LAorCXsgVE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4ZmYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDcgfSwKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDAgfSwKKwl7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzIHN2aWRlb19udHNjW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAzIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE3X0hMT09QX01BWFNUQVRFLCAweDhiIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OGIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweGEyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHhlOSB9LAorCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHg2MSB9LAorCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NDIgfSwKKwl7IFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3N0ZF9zZXR0aW5ncyBzdmlkZW9fc3Rkc1tdID0geworCXsgLmlkID0gVjRMMl9TVERfUEFMX00sIC5jb21tb24gPSBzdmlkZW9fcGFsX20sIH0sCisJeyAuaWQgPSBWNEwyX1NURF9QQUxfTmMsIC5jb21tb24gPSBzdmlkZW9fcGFsX25jLCB9LAorCXsgLmlkID0gVjRMMl9TVERfUEFMLCAuY29tbW9uID0gc3ZpZGVvX3BhbCwgfSwKKwl7IC5pZCA9IFY0TDJfU1REX1NFQ0FNLCAuY29tbW9uID0gc3ZpZGVvX3NlY2FtLCB9LAorCXsgLmlkID0gVjRMMl9TVERfTlRTQywgLmNvbW1vbiA9IHN2aWRlb19udHNjLCB9LAorfTsKKworc3RhdGljIGludCB0bTYwMDBfc2V0X2F1ZGlvX3N0ZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwl1aW50OF90IGFyZWdfMDIgPSAweDA0OyAvKiBHQzEgRml4ZWQgZ2FpbiAwZEIgKi8KKwl1aW50OF90IGFyZWdfMDUgPSAweDAxOyAvKiBBdXRvIDQuNSA9IE0gSmFwYW4sIEF1dG8gNi41ID0gREsgKi8KKwl1aW50OF90IGFyZWdfMDYgPSAweDAyOyAvKiBBdXRvIGRlLWVtcGhhc2lzLCBtYW5udWFsIGNoYW5uZWwgbW9kZSAqLworCXVpbnQ4X3QgbmljYW1fZmxhZyA9IDA7IC8qIE5vIE5JQ0FNICovCisKKwlpZiAoZGV2LT5yYWRpbykgeworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDFfQV9JTklULCAweDAwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAyX0FfRklYX0dBSU5fQ1RSTCwgMHgwNCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwM19BX0FVVE9fR0FJTl9DVFJMLCAweDAwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA0X0FfU0lGX0FNUF9DVFJMLCAweDgwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA1X0FfU1RBTkRBUkRfTU9ELCAweDBjKTsKKwkJLyogc2V0IG1vbm8gb3Igc3RlcmVvICovCisJCWlmIChkZXYtPmFtb2RlID09IFY0TDJfVFVORVJfTU9ERV9NT05PKQorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA2X0FfU09VTkRfTU9ELCAweDAwKTsKKwkJZWxzZSBpZiAoZGV2LT5hbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfU1RFUkVPKQorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA2X0FfU09VTkRfTU9ELCAweDAyKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA5X0FfTUFJTl9WT0wsIDB4MTgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMENfQV9BU0RfVEhSRVMyLCAweDBhKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjBEX0FfQU1EX1RIUkVTLCAweDQwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkYxX0FBRENfUE9XRVJfRE9XTiwgMHhmZSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxRV9BX0dBSU5fREVFTVBIX09VVCwgMHgxMyk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwMV9BX0lOSVQsIDB4ODApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRkVfUE9XRVJfRE9XTiwgMHhmZik7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAodG02MDEwX2FfbW9kZSkgeworCS8qIGF1dG8gKi8KKwljYXNlIDA6CisJCXN3aXRjaCAoZGV2LT5ub3JtKSB7CisJCWNhc2UgVjRMMl9TVERfTlRTQ19NX0tSOgorCQkJYXJlZ18wNSB8PSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9TVERfTlRTQ19NX0pQOgorCQkJYXJlZ18wNSB8PSAweDQwOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9TVERfTlRTQ19NOgorCQljYXNlIFY0TDJfU1REX1BBTF9NOgorCQljYXNlIFY0TDJfU1REX1BBTF9OOgorCQkJYXJlZ18wNSB8PSAweDIwOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9TVERfUEFMX05jOgorCQkJYXJlZ18wNSB8PSAweDYwOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9TVERfU0VDQU1fTDoKKwkJCWFyZWdfMDUgfD0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfU1REX0RLOgorCQkJYXJlZ18wNSB8PSAweDEwOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJLyogQTIgKi8KKwljYXNlIDE6CisJCXN3aXRjaCAoZGV2LT5ub3JtKSB7CisJCWNhc2UgVjRMMl9TVERfQjoKKwkJY2FzZSBWNEwyX1NURF9HSDoKKwkJCWFyZWdfMDUgPSAweDA1OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9TVERfREs6CisJCQlhcmVnXzA1ID0gMHgwOTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCS8qIE5JQ0FNICovCisJY2FzZSAyOgorCQlzd2l0Y2ggKGRldi0+bm9ybSkgeworCQljYXNlIFY0TDJfU1REX0I6CisJCWNhc2UgVjRMMl9TVERfR0g6CisJCQlhcmVnXzA1ID0gMHgwNzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfU1REX0RLOgorCQkJYXJlZ18wNSA9IDB4MDY7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1NURF9QQUxfSToKKwkJCWFyZWdfMDUgPSAweDA4OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9TVERfU0VDQU1fTDoKKwkJCWFyZWdfMDUgPSAweDBhOworCQkJYXJlZ18wMiA9IDB4MDI7CisJCQlicmVhazsKKwkJfQorCQluaWNhbV9mbGFnID0gMTsKKwkJYnJlYWs7CisJLyogb3RoZXIgKi8KKwljYXNlIDM6CisJCXN3aXRjaCAoZGV2LT5ub3JtKSB7CisJCS8qIERLM19BMiAqLworCQljYXNlIFY0TDJfU1REX0RLOgorCQkJYXJlZ18wNSA9IDB4MGI7CisJCQlicmVhazsKKwkJLyogS29yZWEgKi8KKwkJY2FzZSBWNEwyX1NURF9OVFNDX01fS1I6CisJCQlhcmVnXzA1ID0gMHgwNDsKKwkJCWJyZWFrOworCQkvKiBFSUFKICovCisJCWNhc2UgVjRMMl9TVERfTlRTQ19NX0pQOgorCQkJYXJlZ18wNSA9IDB4MDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWFyZWdfMDUgPSAweDAyOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVCwgMHgwMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAyX0FfRklYX0dBSU5fQ1RSTCwgYXJlZ18wMik7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAzX0FfQVVUT19HQUlOX0NUUkwsIDB4MDApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwNF9BX1NJRl9BTVBfQ1RSTCwgMHhhMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA1X0FfU1RBTkRBUkRfTU9ELCBhcmVnXzA1KTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDZfQV9TT1VORF9NT0QsIGFyZWdfMDYpOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwN19BX0xFRlRfVk9MLCAweDAwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDhfQV9SSUdIVF9WT0wsIDB4MDApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwOV9BX01BSU5fVk9MLCAweDA4KTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEFfQV9JMlNfTU9ELCAweDkxKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEJfQV9BU0RfVEhSRVMxLCAweDIwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMENfQV9BU0RfVEhSRVMyLCAweDEyKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMERfQV9BTURfVEhSRVMsIDB4MjApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwRV9BX01PTk9fVEhSRVMxLCAweGYwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEZfQV9NT05PX1RIUkVTMiwgMHg4MCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjEwX0FfTVVURV9USFJFUzEsIDB4YzApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxMV9BX01VVEVfVEhSRVMyLCAweDgwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTJfQV9BR0NfVSwgMHgxMik7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjEzX0FfQUdDX0VSUl9ULCAweGZlKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTRfQV9BR0NfR0FJTl9JTklULCAweDIwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTVfQV9BR0NfU1RFUF9USFIsIDB4MTQpOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxNl9BX0FHQ19HQUlOX01BWCwgMHhmZSk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjE3X0FfQUdDX0dBSU5fTUlOLCAweDAxKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMThfQV9UUl9DVFJMLCAweGEwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTlfQV9GSF8yRkhfR0FJTiwgMHgzMik7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjFBX0FfTklDQU1fU0VSX01BWCwgMHg2NCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjFCX0FfTklDQU1fU0VSX01JTiwgMHgyMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDhfU0VUX0dFVF9BVlJFR19CSVQsIDB4MWMsIDB4MDApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA4X1NFVF9HRVRfQVZSRUdfQklULCAweDFkLCAweDAwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMUVfQV9HQUlOX0RFRU1QSF9PVVQsIDB4MTMpOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxRl9BX1RFU1RfSU5URl9TRUwsIDB4MDApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IyMF9BX1RFU1RfUElOX1NFTCwgMHgwMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVCwgMHg4MCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB0bTYwMDBfZ2V0X3N0ZF9yZXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJLyogQ3VycmVudGx5LCB0aG9zZSBhcmUgdGhlIG9ubHkgc3VwcG9ydGVkIHJlc29sdGlvbnMgKi8KKwlpZiAoZGV2LT5ub3JtICYgVjRMMl9TVERfNTI1XzYwKQorCQlkZXYtPmhlaWdodCA9IDQ4MDsKKwllbHNlCisJCWRldi0+aGVpZ2h0ID0gNTc2OworCisJZGV2LT53aWR0aCA9IDcyMDsKK30KKworc3RhdGljIGludCB0bTYwMDBfbG9hZF9zdGQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzICpzZXQpCit7CisJaW50IGksIHJjOworCisJLyogTG9hZCBib2FyZCdzIGluaXRpYWxpemF0aW9uIHRhYmxlICovCisJZm9yIChpID0gMDsgc2V0W2ldLnJlcTsgaSsrKSB7CisJCXJjID0gdG02MDAwX3NldF9yZWcoZGV2LCBzZXRbaV0ucmVxLCBzZXRbaV0ucmVnLCBzZXRbaV0udmFsdWUpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVpIHdoaWxlIHNldHRpbmcgIgorCQkJICAgICAgICJyZXEgJWQsIHJlZyAlZCB0byB2YWx1ZSAlZFxuIiwKKwkJCSAgICAgICByYywgc2V0W2ldLnJlcSwgc2V0W2ldLnJlZywgc2V0W2ldLnZhbHVlKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgdG02MDAwX3NldF9zdGFuZGFyZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX2lucHV0ICppbnB1dDsKKwlpbnQgaSwgcmMgPSAwOworCXU4IHJlZ18wN19mZSA9IDB4OGE7CisJdTggcmVnXzA4X2YxID0gMHhmYzsKKwl1OCByZWdfMDhfZTIgPSAweGYwOworCXU4IHJlZ18wOF9lNiA9IDB4MGY7CisKKwl0bTYwMDBfZ2V0X3N0ZF9yZXMoZGV2KTsKKworCWlmICghZGV2LT5yYWRpbykKKwkJaW5wdXQgPSAmZGV2LT52aW5wdXRbZGV2LT5pbnB1dF07CisJZWxzZQorCQlpbnB1dCA9ICZkZXYtPnJpbnB1dDsKKworCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgeworCQlzd2l0Y2ggKGlucHV0LT52bXV4KSB7CisJCWNhc2UgVE02MDAwX1ZNVVhfVklERU9fQToKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFM19BRENfSU4xX1NFTCwgMHhmNCk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUFfQlVGRl9EUlZfQ1RSTCwgMHhmMSk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUJfU0lGX0dBSU5fQ1RSTCwgMHhlMCk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUNfUkVWRVJTRV9ZQ19DVFJMLCAweGMyKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFRF9HQUlOX1NFTCwgMHhlOCk7CisJCQlyZWdfMDdfZmUgfD0gMHgwMTsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAwMF9WTVVYX1ZJREVPX0I6CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwsIDB4ZjgpOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVBX0JVRkZfRFJWX0NUUkwsIDB4ZjEpOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVCX1NJRl9HQUlOX0NUUkwsIDB4ZTApOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVDX1JFVkVSU0VfWUNfQ1RSTCwgMHhjMik7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRURfR0FJTl9TRUwsIDB4ZTgpOworCQkJcmVnXzA3X2ZlIHw9IDB4MDE7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMDBfVk1VWF9WSURFT19BQjoKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFM19BRENfSU4xX1NFTCwgMHhmYyk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTRfQURDX0lOMl9TRUwsIDB4ZjgpOworCQkJcmVnXzA4X2U2ID0gMHgwMDsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQV9CVUZGX0RSVl9DVFJMLCAweGYyKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQl9TSUZfR0FJTl9DVFJMLCAweGYwKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQ19SRVZFUlNFX1lDX0NUUkwsIDB4YzIpOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVEX0dBSU5fU0VMLCAweGUwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChpbnB1dC0+YW11eCkgeworCQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6CisJCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHLAorCQkJCTB4MDAsIDB4MGYpOworCQkJYnJlYWs7CisJCWNhc2UgVE02MDAwX0FNVVhfQURDMjoKKwkJCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcsCisJCQkJMHgwOCwgMHgwZik7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMDBfQU1VWF9TSUYxOgorCQkJcmVnXzA4X2UyIHw9IDB4MDI7CisJCQlyZWdfMDhfZTYgPSAweDA4OworCQkJcmVnXzA3X2ZlIHw9IDB4NDA7CisJCQlyZWdfMDhfZjEgfD0gMHgwMjsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFNF9BRENfSU4yX1NFTCwgMHhmMyk7CisJCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHLAorCQkJCTB4MDIsIDB4MGYpOworCQkJYnJlYWs7CisJCWNhc2UgVE02MDAwX0FNVVhfU0lGMjoKKwkJCXJlZ18wOF9lMiB8PSAweDAyOworCQkJcmVnXzA4X2U2ID0gMHgwODsKKwkJCXJlZ18wN19mZSB8PSAweDQwOworCQkJcmVnXzA4X2YxIHw9IDB4MDI7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTRfQURDX0lOMl9TRUwsIDB4ZjcpOworCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywKKwkJCQkweDAyLCAweDBmKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEsIHJlZ18wOF9lMik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFNl9QT1dFUl9ET1dOX0NUUkwyLCByZWdfMDhfZTYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRjFfQUFEQ19QT1dFUl9ET1dOLCByZWdfMDhfZjEpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRkVfUE9XRVJfRE9XTiwgcmVnXzA3X2ZlKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGlucHV0LT52bXV4KSB7CisJCWNhc2UgVE02MDAwX1ZNVVhfVklERU9fQToKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFM19WQURDX0lOUF9MUEZfU0VMMSwgMHgxMCk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRTVfVkFEQ19JTlBfTFBGX1NFTDIsIDB4MDApOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkU4X1ZBRENfUFdET1dOX0NUTCwgMHgwZik7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQkgICAgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgaW5wdXQtPnZfZ3BpbywgMCk7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMDBfVk1VWF9WSURFT19COgorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkUzX1ZBRENfSU5QX0xQRl9TRUwxLCAweDAwKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMiwgMHgwMCk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweDBmKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCSAgICBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBpbnB1dC0+dl9ncGlvLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAwMF9WTVVYX1ZJREVPX0FCOgorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkUzX1ZBRENfSU5QX0xQRl9TRUwxLCAweDEwKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMiwgMHgxMCk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweDAwKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCSAgICBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBpbnB1dC0+dl9ncGlvLCAxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChpbnB1dC0+YW11eCkgeworCQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6CisJCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwKKwkJCQlUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLCAweDAwLCAweDBmKTsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAwMF9BTVVYX0FEQzI6CisJCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwKKwkJCQlUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLCAweDA0LCAweDBmKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGlucHV0LT50eXBlID09IFRNNjAwMF9JTlBVVF9TVklERU8pIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3ZpZGVvX3N0ZHMpOyBpKyspIHsKKwkJCWlmIChkZXYtPm5vcm0gJiBzdmlkZW9fc3Rkc1tpXS5pZCkgeworCQkJCXJjID0gdG02MDAwX2xvYWRfc3RkKGRldiwgc3ZpZGVvX3N0ZHNbaV0uY29tbW9uKTsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21wb3NpdGVfc3Rkcyk7IGkrKykgeworCQkJaWYgKGRldi0+bm9ybSAmIGNvbXBvc2l0ZV9zdGRzW2ldLmlkKSB7CisJCQkJcmMgPSB0bTYwMDBfbG9hZF9zdGQoZGV2LCBjb21wb3NpdGVfc3Rkc1tpXS5jb21tb24pOworCQkJCWdvdG8gcmV0OworCQkJfQorCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworcmV0OgorCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmICgoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApICYmCisJICAgICgoaW5wdXQtPmFtdXggPT0gVE02MDAwX0FNVVhfU0lGMSkgfHwKKwkgICAgKGlucHV0LT5hbXV4ID09IFRNNjAwMF9BTVVYX1NJRjIpKSkKKwkJdG02MDAwX3NldF9hdWRpb19zdGQoZGV2KTsKKworCW1zbGVlcCg0MCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC11c2ItaXNvYy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLXVzYi1pc29jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkMTVhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC11c2ItaXNvYy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAgdG02MDAwLWJ1Zi5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworI2RlZmluZSBUTTYwMDBfVVJCX01TR19MRU4gMTgwCisKK3N0cnVjdCB1c2JfaXNvY19jdGwgeworCQkvKiBtYXggcGFja2V0IHNpemUgb2YgaXNvYyB0cmFuc2FjdGlvbiAqLworCWludAkJCQltYXhfcGt0X3NpemU7CisKKwkJLyogbnVtYmVyIG9mIGFsbG9jYXRlZCB1cmJzICovCisJaW50CQkJCW51bV9idWZzOworCisJCS8qIHVyYiBmb3IgaXNvYyB0cmFuc2ZlcnMgKi8KKwlzdHJ1Y3QgdXJiCQkJKip1cmI7CisKKwkJLyogdHJhbnNmZXIgYnVmZmVycyBmb3IgaXNvYyB0cmFuc2ZlciAqLworCWNoYXIJCQkJKip0cmFuc2Zlcl9idWZmZXI7CisKKwkJLyogTGFzdCBidWZmZXIgY29tbWFuZCBhbmQgcmVnaW9uICovCisJdTgJCQkJY21kOworCWludAkJCQlwb3MsIHNpemUsIHBrdHNpemU7CisKKwkJLyogTGFzdCBmaWVsZDogT0REIG9yIEVWRU4/ICovCisJaW50CQkJCXZmaWVsZCwgZmllbGQ7CisKKwkJLyogU3RvcmVzIGluY29tcGxldGUgY29tbWFuZHMgKi8KKwl1MzIJCQkJdG1wX2J1ZjsKKwlpbnQJCQkJdG1wX2J1Zl9sZW47CisKKwkJLyogU3RvcmVzIGFscmVhZHkgcmVxdWVzdGVkIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgdG02MDAwX2J1ZmZlcgkJKmJ1ZjsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC12aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNWFjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtdmlkZW8uYwpAQCAtMCwwICsxLDE4MTMgQEAKKy8qCisgKiAgIHRtNjAwMC12aWRlby5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGVsIEx1ZHdpZyA8bWljaGVsLmx1ZHdpZ0BnbWFpbC5jb20+CisgKgktIEZpeGVkIG1vZHVsZSBsb2FkL3VubG9hZAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKworI2luY2x1ZGUgInRtNjAwMC1yZWdzLmgiCisjaW5jbHVkZSAidG02MDAwLmgiCisKKyNkZWZpbmUgQlVGRkVSX1RJTUVPVVQgICAgIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkgIC8qIDIgc2Vjb25kcyAqLworCisvKiBMaW1pdHMgbWluaW11bSBhbmQgZGVmYXVsdCBudW1iZXIgb2YgYnVmZmVycyAqLworI2RlZmluZSBUTTYwMDBfTUlOX0JVRiA0CisjZGVmaW5lIFRNNjAwMF9ERUZfQlVGIDgKKworI2RlZmluZSBUTTYwMDBfTUFYX0lTT19QQUNLRVRTCTQ2CS8qIE1heCBudW1iZXIgb2YgSVNPIHBhY2tldHMgKi8KKworLyogRGVjbGFyZSBzdGF0aWMgdmFycyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBwYXJhbWV0ZXJzICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZpZF9saW1pdCA9IDE2OwkvKiBWaWRlbyBtZW1vcnkgbGltaXQsIGluIE1iICovCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CQkvKiAvZGV2L3ZpZGVvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KK3N0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsJCS8qIC9kZXYvcmFkaW9OLCAtMSBmb3IgYXV0b2RldGVjdCAqLworCisvKiBEZWJ1ZyBsZXZlbCAqLworaW50IHRtNjAwMF9kZWJ1ZzsKK0VYUE9SVF9TWU1CT0xfR1BMKHRtNjAwMF9kZWJ1Zyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbm9fY3RybCA9IHsKKwkubmFtZSAgPSAiNDIiLAorCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELAorfTsKKworLyogc3VwcG9ydGVkIGNvbnRyb2xzICovCitzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIHRtNjAwMF9xY3RybFtdID0geworCXsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgICAgICAgID0gIkJyaWdodG5lc3MiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMjU1LAorCQkuc3RlcCAgICAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gNTQsCisJCS5mbGFncyAgICAgICAgID0gMCwKKwl9LCB7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgICAgICAgPSAiQ29udHJhc3QiLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMjU1LAorCQkuc3RlcCAgICAgICAgICA9IDB4MSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxMTksCisJCS5mbGFncyAgICAgICAgID0gMCwKKwl9LCB7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJTYXR1cmF0aW9uIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDI1NSwKKwkJLnN0ZXAgICAgICAgICAgPSAweDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMTEyLAorCQkuZmxhZ3MgICAgICAgICA9IDAsCisJfSwgeworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0hVRSwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJIdWUiLAorCQkubWluaW11bSAgICAgICA9IC0xMjgsCisJCS5tYXhpbXVtICAgICAgID0gMTI3LAorCQkuc3RlcCAgICAgICAgICA9IDB4MSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkuZmxhZ3MgICAgICAgICA9IDAsCisJfSwKKwkJLyogLS0tIGF1ZGlvIC0tLSAqLworCXsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLAorCQkubmFtZSAgICAgICAgICA9ICJNdXRlIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwl9LCB7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAorCQkubmFtZSAgICAgICAgICA9ICJWb2x1bWUiLAorCQkubWluaW11bSAgICAgICA9IC0xNSwKKwkJLm1heGltdW0gICAgICAgPSAxNSwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IENUUkxTID0gQVJSQVlfU0laRSh0bTYwMDBfcWN0cmwpOworc3RhdGljIGludCBxY3RsX3JlZ3NbQVJSQVlfU0laRSh0bTYwMDBfcWN0cmwpXTsKKworc3RhdGljIHN0cnVjdCB0bTYwMDBfZm10IGZvcm1hdFtdID0geworCXsKKwkJLm5hbWUgICAgID0gIjQ6MjoyLCBwYWNrZWQsIFlWWTIiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfWVVZViwKKwkJLmRlcHRoICAgID0gMTYsCisJfSwgeworCQkubmFtZSAgICAgPSAiNDoyOjIsIHBhY2tlZCwgVVlWWSIsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9VWVZZLAorCQkuZGVwdGggICAgPSAxNiwKKwl9LCB7CisJCS5uYW1lICAgICA9ICJBL1YgKyBWQkkgbXV4IHBhY2tldCIsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9UTTYwMDAsCisJCS5kZXB0aCAgICA9IDE2LAorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmxfYnlfaWQodW5zaWduZWQgaW50IGlkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IENUUkxTOyBpKyspCisJCWlmICh0bTYwMDBfcWN0cmxbaV0uaWQgPT0gaWQpCisJCQlyZXR1cm4gdG02MDAwX3FjdHJsK2k7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJRE1BIGFuZCB0aHJlYWQgZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIG5vcm1fbWF4dyhhKSA3MjAKKyNkZWZpbmUgbm9ybV9tYXhoKGEpIDU3NgorCisjZGVmaW5lIG5vcm1fbWludyhhKSBub3JtX21heHcoYSkKKyNkZWZpbmUgbm9ybV9taW5oKGEpIG5vcm1fbWF4aChhKQorCisvKgorICogdmlkZW8tYnVmIGdlbmVyaWMgcm91dGluZSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X25leHRfYnVmKHN0cnVjdCB0bTYwMDBfZG1hcXVldWUgKmRtYV9xLAorCQkJICAgICAgIHN0cnVjdCB0bTYwMDBfYnVmZmVyICAgKipidWYpCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBjb250YWluZXJfb2YoZG1hX3EsIHN0cnVjdCB0bTYwMDBfY29yZSwgdmlkcSk7CisJY2hhciAqb3V0cDsKKworCWlmIChsaXN0X2VtcHR5KCZkbWFfcS0+YWN0aXZlKSkgeworCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19RVUVVRSwgIk5vIGFjdGl2ZSBxdWV1ZSB0byBzZXJ2ZVxuIik7CisJCSpidWYgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJKmJ1ZiA9IGxpc3RfZW50cnkoZG1hX3EtPmFjdGl2ZS5uZXh0LAorCQkJc3RydWN0IHRtNjAwMF9idWZmZXIsIHZiLnF1ZXVlKTsKKworCS8qIENsZWFucyB1cCBidWZmZXIgLSBVc2VmdWwgZm9yIHRlc3RpbmcgZm9yIGZyYW1lL1VSQiBsb3NzICovCisJb3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJigqYnVmKS0+dmIpOworCisJcmV0dXJuOworfQorCisvKgorICogQW5ub3VuY2VzIHRoYXQgYSBidWZmZXIgd2VyZSBmaWxsZWQgYW5kIHJlcXVlc3QgdGhlIG5leHQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJ1ZmZlcl9maWxsZWQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCisJCQkJIHN0cnVjdCB0bTYwMDBfZG1hcXVldWUgKmRtYV9xLAorCQkJCSBzdHJ1Y3QgdG02MDAwX2J1ZmZlciAqYnVmKQoreworCS8qIEFkdmljZSB0aGF0IGJ1ZmZlciB3YXMgZmlsbGVkICovCisJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfSVNPQywgIlslcC8lZF0gd2FrZXVwXG4iLCBidWYsIGJ1Zi0+dmIuaSk7CisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CisJYnVmLT52Yi5maWVsZF9jb3VudCsrOworCWRvX2dldHRpbWVvZmRheSgmYnVmLT52Yi50cyk7CisKKwlsaXN0X2RlbCgmYnVmLT52Yi5xdWV1ZSk7CisJd2FrZV91cCgmYnVmLT52Yi5kb25lKTsKK30KKworLyoKKyAqIElkZW50aWZ5IHRoZSB0bTU2MDAvNjAwMCBidWZmZXIgaGVhZGVyIHR5cGUgYW5kIHByb3Blcmx5IGhhbmRsZXMKKyAqLworc3RhdGljIGludCBjb3B5X3N0cmVhbXModTggKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICpkbWFfcSA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGNvbnRhaW5lcl9vZihkbWFfcSwgc3RydWN0IHRtNjAwMF9jb3JlLCB2aWRxKTsKKwl1OCAqcHRyID0gZGF0YSwgKmVuZHAgPSBkYXRhK2xlbiwgYzsKKwl1bnNpZ25lZCBsb25nIGhlYWRlciA9IDA7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBpbnQgY21kLCBjcHlzaXplLCBwa3RzaXplLCBzaXplLCBmaWVsZCwgYmxvY2ssIGxpbmUsIHBvcyA9IDA7CisJc3RydWN0IHRtNjAwMF9idWZmZXIgKnZidWYgPSBOVUxMOworCWNoYXIgKnZvdXRwID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbGluZXdpZHRoOworCisJaWYgKCFkZXYtPnJhZGlvKSB7CisJCS8qIGdldCB2aWRlbyBidWZmZXIgKi8KKwkJZ2V0X25leHRfYnVmKGRtYV9xLCAmdmJ1Zik7CisKKwkJaWYgKCF2YnVmKQorCQkJcmV0dXJuIHJjOworCQl2b3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJnZidWYtPnZiKTsKKworCQlpZiAoIXZvdXRwKQorCQkJcmV0dXJuIDA7CisJfQorCisJZm9yIChwdHIgPSBkYXRhOyBwdHIgPCBlbmRwOykgeworCQlpZiAoIWRldi0+aXNvY19jdGwuY21kKSB7CisJCQkvKiBIZWFkZXIgKi8KKwkJCWlmIChkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuID4gMCkgeworCQkJCS8qIGZyb20gbGFzdCB1cmIgb3IgcGFja2V0ICovCisJCQkJaGVhZGVyID0gZGV2LT5pc29jX2N0bC50bXBfYnVmOworCQkJCWlmICg0IC0gZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiA+IDApIHsKKwkJCQkJbWVtY3B5KCh1OCAqKSZoZWFkZXIgKworCQkJCQkJZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiwKKwkJCQkJCXB0ciwKKwkJCQkJCTQgLSBkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuKTsKKwkJCQkJcHRyICs9IDQgLSBkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuOworCQkJCX0KKwkJCQlkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHB0ciArIDMgPj0gZW5kcCkgeworCQkJCQkvKiBoYXZlIGluY29tcGxldGUgaGVhZGVyICovCisJCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4gPSBlbmRwIC0gcHRyOworCQkJCQltZW1jcHkoJmRldi0+aXNvY19jdGwudG1wX2J1ZiwgcHRyLAorCQkJCQkJZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbik7CisJCQkJCXJldHVybiByYzsKKwkJCQl9CisJCQkJLyogU2VlayBmb3Igc3luYyAqLworCQkJCWZvciAoOyBwdHIgPCBlbmRwIC0gMzsgcHRyKyspIHsKKwkJCQkJaWYgKCoocHRyICsgMykgPT0gMHg0NykKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBHZXQgbWVzc2FnZSBoZWFkZXIgKi8KKwkJCQloZWFkZXIgPSAqKHVuc2lnbmVkIGxvbmcgKilwdHI7CisJCQkJcHRyICs9IDQ7CisJCQl9CisKKwkJCS8qIHNwbGl0IHRoZSBoZWFkZXIgZmllbGRzICovCisJCQljID0gKGhlYWRlciA+PiAyNCkgJiAweGZmOworCQkJc2l6ZSA9ICgoaGVhZGVyICYgMHg3ZSkgPDwgMSk7CisJCQlpZiAoc2l6ZSA+IDApCisJCQkJc2l6ZSAtPSA0OworCQkJYmxvY2sgPSAoaGVhZGVyID4+IDcpICYgMHhmOworCQkJZmllbGQgPSAoaGVhZGVyID4+IDExKSAmIDB4MTsKKwkJCWxpbmUgID0gKGhlYWRlciA+PiAxMikgJiAweDFmZjsKKwkJCWNtZCAgID0gKGhlYWRlciA+PiAyMSkgJiAweDc7CisJCQkvKiBWYWxpZGF0ZXMgaGFlZGVyIGZpZWxkcyAqLworCQkJaWYgKHNpemUgPiBUTTYwMDBfVVJCX01TR19MRU4pCisJCQkJc2l6ZSA9IFRNNjAwMF9VUkJfTVNHX0xFTjsKKwkJCXBrdHNpemUgPSBUTTYwMDBfVVJCX01TR19MRU47CisJCQkvKgorCQkJICogY2FsY3VsYXRlIHBvc2l0aW9uIGluIGJ1ZmZlciBhbmQgY2hhbmdlIHRoZSBidWZmZXIKKwkJCSAqLworCQkJc3dpdGNoIChjbWQpIHsKKwkJCWNhc2UgVE02MDAwX1VSQl9NU0dfVklERU86CisJCQkJaWYgKCFkZXYtPnJhZGlvKSB7CisJCQkJCWlmICgoZGV2LT5pc29jX2N0bC52ZmllbGQgIT0gZmllbGQpICYmCisJCQkJCQkoZmllbGQgPT0gMSkpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBBbm5vdW5jZXMgdGhhdCBhIG5ldyBidWZmZXIKKwkJCQkJCSAqIHdlcmUgZmlsbGVkCisJCQkJCQkgKi8KKwkJCQkJCWJ1ZmZlcl9maWxsZWQoZGV2LCBkbWFfcSwgdmJ1Zik7CisJCQkJCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JU09DLAorCQkJCQkJCSJuZXcgYnVmZmVyIGZpbGxlZFxuIik7CisJCQkJCQlnZXRfbmV4dF9idWYoZG1hX3EsICZ2YnVmKTsKKwkJCQkJCWlmICghdmJ1ZikKKwkJCQkJCQlyZXR1cm4gcmM7CisJCQkJCQl2b3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJnZidWYtPnZiKTsKKwkJCQkJCWlmICghdm91dHApCisJCQkJCQkJcmV0dXJuIHJjOworCQkJCQkJbWVtc2V0KHZvdXRwLCAwLCB2YnVmLT52Yi5zaXplKTsKKwkJCQkJfQorCQkJCQlsaW5ld2lkdGggPSB2YnVmLT52Yi53aWR0aCA8PCAxOworCQkJCQlwb3MgPSAoKGxpbmUgPDwgMSkgLSBmaWVsZCAtIDEpICoKKwkJCQkJbGluZXdpZHRoICsgYmxvY2sgKiBUTTYwMDBfVVJCX01TR19MRU47CisJCQkJCS8qIERvbid0IGFsbG93IHRvIHdyaXRlIG91dCBvZiB0aGUgYnVmZmVyICovCisJCQkJCWlmIChwb3MgKyBzaXplID4gdmJ1Zi0+dmIuc2l6ZSkKKwkJCQkJCWNtZCA9IFRNNjAwMF9VUkJfTVNHX0VSUjsKKwkJCQkJZGV2LT5pc29jX2N0bC52ZmllbGQgPSBmaWVsZDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZCSToKKwkJCQlicmVhazsKKwkJCWNhc2UgVE02MDAwX1VSQl9NU0dfQVVESU86CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX1BUUzoKKwkJCQlzaXplID0gcGt0c2l6ZTsgLyogU2l6ZSBpcyBhbHdheXMgMTgwIGJ5dGVzICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBDb250aW51ZSB0aGUgbGFzdCBjb3B5ICovCisJCQljbWQgPSBkZXYtPmlzb2NfY3RsLmNtZDsKKwkJCXNpemUgPSBkZXYtPmlzb2NfY3RsLnNpemU7CisJCQlwb3MgPSBkZXYtPmlzb2NfY3RsLnBvczsKKwkJCXBrdHNpemUgPSBkZXYtPmlzb2NfY3RsLnBrdHNpemU7CisJCQlmaWVsZCA9IGRldi0+aXNvY19jdGwuZmllbGQ7CisJCX0KKwkJY3B5c2l6ZSA9IChlbmRwIC0gcHRyID4gc2l6ZSkgPyBzaXplIDogZW5kcCAtIHB0cjsKKwkJaWYgKGNweXNpemUpIHsKKwkJCS8qIGNvcHkgZGF0YSBpbiBkaWZmZXJlbnQgYnVmZmVycyAqLworCQkJc3dpdGNoIChjbWQpIHsKKwkJCWNhc2UgVE02MDAwX1VSQl9NU0dfVklERU86CisJCQkJLyogRmlsbHMgdmlkZW8gYnVmZmVyICovCisJCQkJaWYgKHZidWYpCisJCQkJCW1lbWNweSgmdm91dHBbcG9zXSwgcHRyLCBjcHlzaXplKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVE02MDAwX1VSQl9NU0dfQVVESU86IHsKKwkJCQlpbnQgaTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY3B5c2l6ZTsgaSArPSAyKQorCQkJCQlzd2FiMTZzKCh1MTYgKikocHRyICsgaSkpOworCisJCQkJdG02MDAwX2NhbGxfZmlsbGJ1ZihkZXYsIFRNNjAwMF9BVURJTywgcHRyLCBjcHlzaXplKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgVE02MDAwX1VSQl9NU0dfVkJJOgorCQkJCS8qIE5lZWQgc29tZSBjb2RlIHRvIGNvcHkgdmJpIGJ1ZmZlciAqLworCQkJCWJyZWFrOworCQkJY2FzZSBUTTYwMDBfVVJCX01TR19QVFM6IHsKKwkJCQkvKiBOZWVkIHNvbWUgY29kZSB0byBjb3B5IHB0cyAqLworCQkJCXUzMiBwdHM7CisJCQkJcHRzID0gKih1MzIgKilwdHI7CisJCQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfSVNPQywgImZpZWxkICVkLCBQVFMgJXgiLAorCQkJCQlmaWVsZCwgcHRzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCX0KKwkJfQorCQlpZiAocHRyICsgcGt0c2l6ZSA+IGVuZHApIHsKKwkJCS8qCisJCQkgKiBFbmQgb2YgVVJCIHBhY2tldCwgYnV0IGNtZCBwcm9jZXNzaW5nIGlzIG5vdAorCQkJICogY29tcGxldGUuIFByZXNlcnZlIHRoZSBzdGF0ZSBmb3IgYSBuZXh0IHBhY2tldAorCQkJICovCisJCQlkZXYtPmlzb2NfY3RsLnBvcyA9IHBvcyArIGNweXNpemU7CisJCQlkZXYtPmlzb2NfY3RsLnNpemUgPSBzaXplIC0gY3B5c2l6ZTsKKwkJCWRldi0+aXNvY19jdGwuY21kID0gY21kOworCQkJZGV2LT5pc29jX2N0bC5maWVsZCA9IGZpZWxkOworCQkJZGV2LT5pc29jX2N0bC5wa3RzaXplID0gcGt0c2l6ZSAtIChlbmRwIC0gcHRyKTsKKwkJCXB0ciArPSBlbmRwIC0gcHRyOworCQl9IGVsc2UgeworCQkJZGV2LT5pc29jX2N0bC5jbWQgPSAwOworCQkJcHRyICs9IHBrdHNpemU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJZGVudGlmeSB0aGUgdG01NjAwLzYwMDAgYnVmZmVyIGhlYWRlciB0eXBlIGFuZCBwcm9wZXJseSBoYW5kbGVzCisgKi8KK3N0YXRpYyBpbnQgY29weV9tdWx0aXBsZXhlZCh1OCAqcHRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCXN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBjb250YWluZXJfb2YoZG1hX3EsIHN0cnVjdCB0bTYwMDBfY29yZSwgdmlkcSk7CisJdW5zaWduZWQgaW50IHBvcyA9IGRldi0+aXNvY19jdGwucG9zLCBjcHlzaXplOworCWludCByYyA9IDE7CisJc3RydWN0IHRtNjAwMF9idWZmZXIgKmJ1ZjsKKwljaGFyICpvdXRwID0gTlVMTDsKKworCWdldF9uZXh0X2J1ZihkbWFfcSwgJmJ1Zik7CisJaWYgKGJ1ZikKKwkJb3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJmJ1Zi0+dmIpOworCisJaWYgKCFvdXRwKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCWNweXNpemUgPSBtaW4obGVuLCBidWYtPnZiLnNpemUtcG9zKTsKKwkJbWVtY3B5KCZvdXRwW3Bvc10sIHB0ciwgY3B5c2l6ZSk7CisJCXBvcyArPSBjcHlzaXplOworCQlwdHIgKz0gY3B5c2l6ZTsKKwkJbGVuIC09IGNweXNpemU7CisJCWlmIChwb3MgPj0gYnVmLT52Yi5zaXplKSB7CisJCQlwb3MgPSAwOworCQkJLyogQW5ub3VuY2VzIHRoYXQgYSBuZXcgYnVmZmVyIHdlcmUgZmlsbGVkICovCisJCQlidWZmZXJfZmlsbGVkKGRldiwgZG1hX3EsIGJ1Zik7CisJCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JU09DLCAibmV3IGJ1ZmZlciBmaWxsZWRcbiIpOworCQkJZ2V0X25leHRfYnVmKGRtYV9xLCAmYnVmKTsKKwkJCWlmICghYnVmKQorCQkJCWJyZWFrOworCQkJb3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJihidWYtPnZiKSk7CisJCQlpZiAoIW91dHApCisJCQkJcmV0dXJuIHJjOworCQkJcG9zID0gMDsKKwkJfQorCX0KKworCWRldi0+aXNvY19jdGwucG9zID0gcG9zOworCXJldHVybiByYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByaW50X2Vycl9zdGF0dXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCisJCQkJICAgICBpbnQgcGFja2V0LCBpbnQgc3RhdHVzKQoreworCWNoYXIgKmVycm1zZyA9ICJVbmtub3duIjsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSAtRU5PRU5UOgorCQllcnJtc2cgPSAidW5saW5rZWQgc3luY2hyb251b3VzbHkiOworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCQllcnJtc2cgPSAidW5saW5rZWQgYXN5bmNocm9udW91c2x5IjsKKwkJYnJlYWs7CisJY2FzZSAtRU5PU1I6CisJCWVycm1zZyA9ICJCdWZmZXIgZXJyb3IgKG92ZXJydW4pIjsKKwkJYnJlYWs7CisJY2FzZSAtRVBJUEU6CisJCWVycm1zZyA9ICJTdGFsbGVkIChkZXZpY2Ugbm90IHJlc3BvbmRpbmcpIjsKKwkJYnJlYWs7CisJY2FzZSAtRU9WRVJGTE9XOgorCQllcnJtc2cgPSAiQmFiYmxlIChiYWQgY2FibGU/KSI7CisJCWJyZWFrOworCWNhc2UgLUVQUk9UTzoKKwkJZXJybXNnID0gIkJpdC1zdHVmZiBlcnJvciAoYmFkIGNhYmxlPykiOworCQlicmVhazsKKwljYXNlIC1FSUxTRVE6CisJCWVycm1zZyA9ICJDUkMvVGltZW91dCAoY291bGQgYmUgYW55dGhpbmcpIjsKKwkJYnJlYWs7CisJY2FzZSAtRVRJTUU6CisJCWVycm1zZyA9ICJEZXZpY2UgZG9lcyBub3QgcmVzcG9uZCI7CisJCWJyZWFrOworCX0KKwlpZiAocGFja2V0IDwgMCkgeworCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19RVUVVRSwgIlVSQiBzdGF0dXMgJWQgWyVzXS5cbiIsCisJCQlzdGF0dXMsIGVycm1zZyk7CisJfSBlbHNlIHsKKwkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUVVFVUUsICJVUkIgcGFja2V0ICVkLCBzdGF0dXMgJWQgWyVzXS5cbiIsCisJCQlwYWNrZXQsIHN0YXR1cywgZXJybXNnKTsKKwl9Cit9CisKKworLyoKKyAqIENvbnRyb2xzIHRoZSBpc29jIGNvcHkgb2YgZWFjaCB1cmIgcGFja2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRtNjAwMF9pc29jX2NvcHkoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICpkbWFfcSA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGNvbnRhaW5lcl9vZihkbWFfcSwgc3RydWN0IHRtNjAwMF9jb3JlLCB2aWRxKTsKKwlpbnQgaSwgbGVuID0gMCwgcmMgPSAxLCBzdGF0dXM7CisJY2hhciAqcDsKKworCWlmICh1cmItPnN0YXR1cyA8IDApIHsKKwkJcHJpbnRfZXJyX3N0YXR1cyhkZXYsIC0xLCB1cmItPnN0YXR1cyk7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKKwkJc3RhdHVzID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXByaW50X2Vycl9zdGF0dXMoZGV2LCBpLCBzdGF0dXMpOworCQkJY29udGludWU7CisJCX0KKworCQlsZW4gPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CisKKwkJaWYgKGxlbiA+IDApIHsKKwkJCXAgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCQkJaWYgKCF1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykgeworCQkJCWlmICgoZGV2LT5mb3VyY2MpID09IFY0TDJfUElYX0ZNVF9UTTYwMDApIHsKKwkJCQkJcmMgPSBjb3B5X211bHRpcGxleGVkKHAsIGxlbiwgdXJiKTsKKwkJCQkJaWYgKHJjIDw9IDApCisJCQkJCQlyZXR1cm4gcmM7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29weV9zdHJlYW1zKHAsIGxlbiwgdXJiKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVVSQiBjb250cm9sCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogSVJRIGNhbGxiYWNrLCBjYWxsZWQgYnkgVVJCIGNhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIHRtNjAwMF9pcnFfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICpkbWFfcSA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGNvbnRhaW5lcl9vZihkbWFfcSwgc3RydWN0IHRtNjAwMF9jb3JlLCB2aWRxKTsKKwlpbnQgaTsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJY2FzZSAtRVRJTUVET1VUOgorCQlicmVhazsKKworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJdG02MDAwX2VycigidXJiIGNvbXBsZXRpb24gZXJyb3IgJWQuXG4iLCB1cmItPnN0YXR1cyk7CisJCWJyZWFrOworCX0KKworCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CisJdG02MDAwX2lzb2NfY29weSh1cmIpOworCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKKworCS8qIFJlc2V0IHVyYiBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyA9IDA7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCA9IDA7CisJfQorCisJdXJiLT5zdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmICh1cmItPnN0YXR1cykKKwkJdG02MDAwX2VycigidXJiIHJlc3VibWl0IGZhaWxlZCAoZXJyb3I9JWkpXG4iLAorCQkJdXJiLT5zdGF0dXMpOworfQorCisvKgorICogU3RvcCBhbmQgRGVhbGxvY2F0ZSBVUkJzCisgKi8KK3N0YXRpYyB2b2lkIHRtNjAwMF91bmluaXRfaXNvYyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IGk7CisKKwlkZXYtPmlzb2NfY3RsLmJ1ZiA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgeworCQl1cmIgPSBkZXYtPmlzb2NfY3RsLnVyYltpXTsKKwkJaWYgKHVyYikgeworCQkJdXNiX2tpbGxfdXJiKHVyYik7CisJCQl1c2JfdW5saW5rX3VyYih1cmIpOworCQkJaWYgKGRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyW2ldKSB7CisJCQkJdXNiX2ZyZWVfY29oZXJlbnQoZGV2LT51ZGV2LAorCQkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJCQkJZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0sCisJCQkJCQl1cmItPnRyYW5zZmVyX2RtYSk7CisJCQl9CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCWRldi0+aXNvY19jdGwudXJiW2ldID0gTlVMTDsKKwkJfQorCQlkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcltpXSA9IE5VTEw7CisJfQorCisJa2ZyZWUoZGV2LT5pc29jX2N0bC51cmIpOworCWtmcmVlKGRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyKTsKKworCWRldi0+aXNvY19jdGwudXJiID0gTlVMTDsKKwlkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJZGV2LT5pc29jX2N0bC5udW1fYnVmcyA9IDA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBVUkJzIGFuZCBzdGFydCBJUlEKKyAqLworc3RhdGljIGludCB0bTYwMDBfcHJlcGFyZV9pc29jKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgKmRtYV9xID0gJmRldi0+dmlkcTsKKwlpbnQgaSwgaiwgc2Jfc2l6ZSwgcGlwZSwgc2l6ZSwgbWF4X3BhY2tldHMsIG51bV9idWZzID0gODsKKwlzdHJ1Y3QgdXJiICp1cmI7CisKKwkvKiBEZS1hbGxvY2F0ZXMgYWxsIHBlbmRpbmcgc3R1ZmYgKi8KKwl0bTYwMDBfdW5pbml0X2lzb2MoZGV2KTsKKwkvKiBTdG9wIGludGVycnVwdCBVU0IgcGlwZSAqLworCXRtNjAwMF9pcl9pbnRfc3RvcChkZXYpOworCisJdXNiX3NldF9pbnRlcmZhY2UoZGV2LT51ZGV2LAorCQkJICBkZXYtPmlzb2NfaW4uYkludGVyZmFjZU51bWJlciwKKwkJCSAgZGV2LT5pc29jX2luLmJBbHRlcm5hdGVTZXR0aW5nKTsKKworCS8qIFN0YXJ0IGludGVycnVwdCBVU0IgcGlwZSAqLworCXRtNjAwMF9pcl9pbnRfc3RhcnQoZGV2KTsKKworCXBpcGUgPSB1c2JfcmN2aXNvY3BpcGUoZGV2LT51ZGV2LAorCQkJICAgICAgIGRldi0+aXNvY19pbi5lbmRwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkJICAgICAgIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CisKKwlzaXplID0gdXNiX21heHBhY2tldChkZXYtPnVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKworCWlmIChzaXplID4gZGV2LT5pc29jX2luLm1heHNpemUpCisJCXNpemUgPSBkZXYtPmlzb2NfaW4ubWF4c2l6ZTsKKworCWRldi0+aXNvY19jdGwubWF4X3BrdF9zaXplID0gc2l6ZTsKKworCW1heF9wYWNrZXRzID0gVE02MDAwX01BWF9JU09fUEFDS0VUUzsKKwlzYl9zaXplID0gbWF4X3BhY2tldHMgKiBzaXplOworCisJZGV2LT5pc29jX2N0bC5udW1fYnVmcyA9IG51bV9idWZzOworCisJZGV2LT5pc29jX2N0bC51cmIgPSBrbWFsbG9jKHNpemVvZih2b2lkICopKm51bV9idWZzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aXNvY19jdGwudXJiKSB7CisJCXRtNjAwMF9lcnIoImNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIHVzYiBidWZmZXJzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKHNpemVvZih2b2lkICopKm51bV9idWZzLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXIpIHsKKwkJdG02MDAwX2VycigiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdXNidHJhbnNmZXJcbiIpOworCQlrZnJlZShkZXYtPmlzb2NfY3RsLnVyYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX1FVRVVFLCAiQWxsb2NhdGluZyAlZCB4ICVkIHBhY2tldHMiCisJCSAgICAiICglZCBieXRlcykgb2YgJWQgYnl0ZXMgZWFjaCB0byBoYW5kbGUgJXUgc2l6ZVxuIiwKKwkJICAgIG1heF9wYWNrZXRzLCBudW1fYnVmcywgc2Jfc2l6ZSwKKwkJICAgIGRldi0+aXNvY19pbi5tYXhzaXplLCBzaXplKTsKKworCS8qIGFsbG9jYXRlIHVyYnMgYW5kIHRyYW5zZmVyIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pc29jX2N0bC5udW1fYnVmczsgaSsrKSB7CisJCXVyYiA9IHVzYl9hbGxvY191cmIobWF4X3BhY2tldHMsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYikgeworCQkJdG02MDAwX2VycigiY2Fubm90IGFsbG9jIGlzb2NfY3RsLnVyYiAlaVxuIiwgaSk7CisJCQl0bTYwMDBfdW5pbml0X2lzb2MoZGV2KTsKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZGV2LT5pc29jX2N0bC51cmJbaV0gPSB1cmI7CisKKwkJZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0gPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LAorCQkJc2Jfc2l6ZSwgR0ZQX0tFUk5FTCwgJnVyYi0+dHJhbnNmZXJfZG1hKTsKKwkJaWYgKCFkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcltpXSkgeworCQkJdG02MDAwX2VycigidW5hYmxlIHRvIGFsbG9jYXRlICVpIGJ5dGVzIGZvciB0cmFuc2ZlciIKKwkJCQkJIiBidWZmZXIgJWklc1xuIiwKKwkJCQkJc2Jfc2l6ZSwgaSwKKwkJCQkJaW5faW50ZXJydXB0KCkgPyAiIHdoaWxlIGluIGludCIgOiAiIik7CisJCQl0bTYwMDBfdW5pbml0X2lzb2MoZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcltpXSwgMCwgc2Jfc2l6ZSk7CisKKwkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBkZXYtPnVkZXYsIHBpcGUsCisJCQkJICBkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcltpXSwgc2Jfc2l6ZSwKKwkJCQkgIHRtNjAwMF9pcnFfY2FsbGJhY2ssIGRtYV9xKTsKKwkJdXJiLT5pbnRlcnZhbCA9IGRldi0+aXNvY19pbi5lbmRwLT5kZXNjLmJJbnRlcnZhbDsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IG1heF9wYWNrZXRzOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQIHwgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwkJZm9yIChqID0gMDsgaiA8IG1heF9wYWNrZXRzOyBqKyspIHsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gc2l6ZSAqIGo7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHNpemU7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0bTYwMDBfc3RhcnRfdGhyZWFkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgKmRtYV9xID0gJmRldi0+dmlkcTsKKwlpbnQgaTsKKworCWRtYV9xLT5mcmFtZSA9IDA7CisJZG1hX3EtPmluaV9qaWZmaWVzID0gamlmZmllczsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYV9xLT53cSk7CisKKwkvKiBzdWJtaXQgdXJicyBhbmQgZW5hYmxlcyBJUlEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pc29jX2N0bC5udW1fYnVmczsgaSsrKSB7CisJCWludCByYyA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aXNvY19jdGwudXJiW2ldLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJjKSB7CisJCQl0bTYwMDBfZXJyKCJzdWJtaXQgb2YgdXJiICVpIGZhaWxlZCAoZXJyb3I9JWkpXG4iLCBpLAorCQkJCSAgIHJjKTsKKwkJCXRtNjAwMF91bmluaXRfaXNvYyhkZXYpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJVmlkZW9idWYgb3BlcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludAorYnVmZmVyX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqY291bnQsIHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7CisKKwkqc2l6ZSA9IGZoLT5mbXQtPmRlcHRoICogZmgtPndpZHRoICogZmgtPmhlaWdodCA+PiAzOworCWlmICgwID09ICpjb3VudCkKKwkJKmNvdW50ID0gVE02MDAwX0RFRl9CVUY7CisKKwlpZiAoKmNvdW50IDwgVE02MDAwX01JTl9CVUYpCisJCSpjb3VudCA9IFRNNjAwMF9NSU5fQlVGOworCisJd2hpbGUgKCpzaXplICogKmNvdW50ID4gdmlkX2xpbWl0ICogMTAyNCAqIDEwMjQpCisJCSgqY291bnQpLS07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9idWZmZXIoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgc3RydWN0IHRtNjAwMF9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IHZxLT5wcml2X2RhdGE7CisJc3RydWN0IHRtNjAwMF9jb3JlICAgKmRldiA9IGZoLT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJQlVHKCk7CisKKwkvKiBXZSB1c2VkIHRvIHdhaXQgZm9yIHRoZSBidWZmZXIgdG8gZmluaXNoIGhlcmUsIGJ1dCB0aGlzIGRpZG4ndCB3b3JrCisJICAgYmVjYXVzZSwgYXMgd2Ugd2VyZSBrZWVwaW5nIHRoZSBzdGF0ZSBhcyBWSURFT0JVRl9RVUVVRUQsCisJICAgdmlkZW9idWZfcXVldWVfY2FuY2VsIG1hcmtlZCBpdCBhcyBmaW5pc2hlZCBmb3IgdXMuCisJICAgKEFsc28sIGl0IGNvdWxkIHdlZGdlIGZvcmV2ZXIgaWYgdGhlIGhhcmR3YXJlIHdhcyBtaXNjb25maWd1cmVkLikKKworCSAgIFRoaXMgc2hvdWxkIGJlIHNhZmU7IGJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlLCB0aGUgYnVmZmVyIGlzbid0CisJICAgcXVldWVkIGFueW1vcmUuIElmIHdlIGV2ZXIgc3RhcnQgbWFya2luZyB0aGUgYnVmZmVycyBhcworCSAgIFZJREVPQlVGX0FDVElWRSwgaXQgd29uJ3QgYmUsIHRob3VnaC4KKwkqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNsb2NrLCBmbGFncyk7CisJaWYgKGRldi0+aXNvY19jdGwuYnVmID09IGJ1ZikKKwkJZGV2LT5pc29jX2N0bC5idWYgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKKworCXZpZGVvYnVmX3ZtYWxsb2NfZnJlZSgmYnVmLT52Yik7CisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7Cit9CisKK3N0YXRpYyBpbnQKK2J1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCQkJCQkJZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQoreworCXN0cnVjdCB0bTYwMDBfZmggICAgICpmaCAgPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCB0bTYwMDBfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCB0bTYwMDBfYnVmZmVyLCB2Yik7CisJc3RydWN0IHRtNjAwMF9jb3JlICAgKmRldiA9IGZoLT5kZXY7CisJaW50IHJjID0gMDsKKworCUJVR19PTihOVUxMID09IGZoLT5mbXQpOworCisKKwkvKiBGSVhNRTogSXQgYXNzdW1lcyBkZXB0aD0yICovCisJLyogVGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZCBmb3JtYXQgaXMgMTYgYml0cy9waXhlbCAqLworCWJ1Zi0+dmIuc2l6ZSA9IGZoLT5mbXQtPmRlcHRoKmZoLT53aWR0aCpmaC0+aGVpZ2h0ID4+IDM7CisJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBidWYtPnZiLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJ1Zi0+Zm10ICAgICAgICE9IGZoLT5mbXQgICAgfHwKKwkgICAgYnVmLT52Yi53aWR0aCAgIT0gZmgtPndpZHRoICB8fAorCSAgICBidWYtPnZiLmhlaWdodCAhPSBmaC0+aGVpZ2h0IHx8CisJICAgIGJ1Zi0+dmIuZmllbGQgICE9IGZpZWxkKSB7CisJCWJ1Zi0+Zm10ICAgICAgID0gZmgtPmZtdDsKKwkJYnVmLT52Yi53aWR0aCAgPSBmaC0+d2lkdGg7CisJCWJ1Zi0+dmIuaGVpZ2h0ID0gZmgtPmhlaWdodDsKKwkJYnVmLT52Yi5maWVsZCAgPSBmaWVsZDsKKwkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7CisJfQorCisJaWYgKFZJREVPQlVGX05FRURTX0lOSVQgPT0gYnVmLT52Yi5zdGF0ZSkgeworCQlyYyA9IHZpZGVvYnVmX2lvbG9jayh2cSwgJmJ1Zi0+dmIsIE5VTEwpOworCQlpZiAocmMgIT0gMCkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIWRldi0+aXNvY19jdGwubnVtX2J1ZnMpIHsKKwkJcmMgPSB0bTYwMDBfcHJlcGFyZV9pc29jKGRldik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGZhaWw7CisKKwkJcmMgPSB0bTYwMDBfc3RhcnRfdGhyZWFkKGRldik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGZhaWw7CisKKwl9CisKKwlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUFJFUEFSRUQ7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJZnJlZV9idWZmZXIodnEsIGJ1Zik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAorYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCB0bTYwMDBfYnVmZmVyICAgICpidWYgICAgID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgdG02MDAwX2J1ZmZlciwgdmIpOworCXN0cnVjdCB0bTYwMDBfZmggICAgICAgICpmaCAgICAgID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgICAgICAqZGV2ICAgICA9IGZoLT5kZXY7CisJc3RydWN0IHRtNjAwMF9kbWFxdWV1ZSAgKnZpZHEgICAgPSAmZGV2LT52aWRxOworCisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKKwlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmdmlkcS0+YWN0aXZlKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHRtNjAwMF9idWZmZXIgICAqYnVmICA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHRtNjAwMF9idWZmZXIsIHZiKTsKKworCWZyZWVfYnVmZmVyKHZxLCBidWYpOworfQorCitzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyB0bTYwMDBfdmlkZW9fcW9wcyA9IHsKKwkuYnVmX3NldHVwICAgICAgPSBidWZmZXJfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlICAgID0gYnVmZmVyX3ByZXBhcmUsCisJLmJ1Zl9xdWV1ZSAgICAgID0gYnVmZmVyX3F1ZXVlLAorCS5idWZfcmVsZWFzZSAgICA9IGJ1ZmZlcl9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglJT0NUTCBoYW5kbGluZworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGJvb2wgaXNfcmVzX3JlYWQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHN0cnVjdCB0bTYwMDBfZmggKmZoKQoreworCS8qIElzIHRoZSBjdXJyZW50IGZoIGhhbmRsaW5nIGl0PyBpZiBzbywgdGhhdCdzIE9LICovCisJaWYgKGRldi0+cmVzb3VyY2VzID09IGZoICYmIGRldi0+aXNfcmVzX3JlYWQpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc19yZXNfc3RyZWFtaW5nKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCkKK3sKKwkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLworCWlmIChkZXYtPnJlc291cmNlcyA9PSBmaCkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHJlc19nZXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHN0cnVjdCB0bTYwMDBfZmggKmZoLAorCQkgICBib29sIGlzX3Jlc19yZWFkKQoreworCS8qIElzIHRoZSBjdXJyZW50IGZoIGhhbmRsaW5nIGl0PyBpZiBzbywgdGhhdCdzIE9LICovCisJaWYgKGRldi0+cmVzb3VyY2VzID09IGZoICYmIGRldi0+aXNfcmVzX3JlYWQgPT0gaXNfcmVzX3JlYWQpCisJCXJldHVybiB0cnVlOworCisJLyogaXMgaXQgZnJlZT8gKi8KKwlpZiAoZGV2LT5yZXNvdXJjZXMpCisJCXJldHVybiBmYWxzZTsKKworCS8qIGdyYWIgaXQgKi8KKwlkZXYtPnJlc291cmNlcyA9IGZoOworCWRldi0+aXNfcmVzX3JlYWQgPSBpc19yZXNfcmVhZDsKKwlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19SRVNfTE9DSywgInJlczogZ2V0XG4iKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcmVzX2ZyZWUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHN0cnVjdCB0bTYwMDBfZmggKmZoKQoreworCS8qIElzIHRoZSBjdXJyZW50IGZoIGhhbmRsaW5nIGl0PyBpZiBzbywgdGhhdCdzIE9LICovCisJaWYgKGRldi0+cmVzb3VyY2VzICE9IGZoKQorCQlyZXR1cm47CisKKwlkZXYtPnJlc291cmNlcyA9IE5VTEw7CisJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUkVTX0xPQ0ssICJyZXM6IHB1dFxuIik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJSU9DVEwgdmlkaW9jIGhhbmRsaW5nCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSAoKHN0cnVjdCB0bTYwMDBfZmggKilwcml2KS0+ZGV2OworCisJc3RybGNweShjYXAtPmRyaXZlciwgInRtNjAwMCIsIHNpemVvZihjYXAtPmRyaXZlcikpOworCXN0cmxjcHkoY2FwLT5jYXJkLCAiVHJpZGVudCBUVk1hc3RlciBUTTU2MDAvNjAwMC82MDEwIiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworCWNhcC0+dmVyc2lvbiA9IFRNNjAwMF9WRVJTSU9OOworCWNhcC0+Y2FwYWJpbGl0aWVzID0JVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCQkJVjRMMl9DQVBfU1RSRUFNSU5HICAgICB8CisJCQkJVjRMMl9DQVBfQVVESU8gICAgICAgICB8CisJCQkJVjRMMl9DQVBfUkVBRFdSSVRFOworCisJaWYgKGRldi0+dHVuZXJfdHlwZSAhPSBUVU5FUl9BQlNFTlQpCisJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCWlmICh1bmxpa2VseShmLT5pbmRleCA+PSBBUlJBWV9TSVpFKGZvcm1hdCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmxjcHkoZi0+ZGVzY3JpcHRpb24sIGZvcm1hdFtmLT5pbmRleF0ubmFtZSwgc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJZi0+cGl4ZWxmb3JtYXQgPSBmb3JtYXRbZi0+aW5kZXhdLmZvdXJjYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7CisKKwlmLT5mbXQucGl4LndpZHRoICAgICAgICA9IGZoLT53aWR0aDsKKwlmLT5mbXQucGl4LmhlaWdodCAgICAgICA9IGZoLT5oZWlnaHQ7CisJZi0+Zm10LnBpeC5maWVsZCAgICAgICAgPSBmaC0+dmJfdmlkcS5maWVsZDsKKwlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ICA9IGZoLT5mbXQtPmZvdXJjYzsKKwlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9CisJCShmLT5mbXQucGl4LndpZHRoICogZmgtPmZtdC0+ZGVwdGgpID4+IDM7CisJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQlmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX2ZtdCAqZm9ybWF0X2J5X2ZvdXJjYyh1bnNpZ25lZCBpbnQgZm91cmNjKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZm9ybWF0KTsgaSsrKQorCQlpZiAoZm9ybWF0W2ldLmZvdXJjYyA9PSBmb3VyY2MpCisJCQlyZXR1cm4gZm9ybWF0K2k7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9ICgoc3RydWN0IHRtNjAwMF9maCAqKXByaXYpLT5kZXY7CisJc3RydWN0IHRtNjAwMF9mbXQgKmZtdDsKKwllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisKKwlmbXQgPSBmb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCWlmIChOVUxMID09IGZtdCkgeworCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JT0NUTF9BUkcsICJGb3VyY2MgZm9ybWF0ICgweCUwOHgpIgorCQkJCSIgaW52YWxpZC5cbiIsIGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmaWVsZCA9IGYtPmZtdC5waXguZmllbGQ7CisKKwlpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpCisJCWZpZWxkID0gVjRMMl9GSUVMRF9TRVFfVEI7CisJZWxzZSBpZiAoVjRMMl9GSUVMRF9JTlRFUkxBQ0VEICE9IGZpZWxkKSB7CisJCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX0lPQ1RMX0FSRywgIkZpZWxkIHR5cGUgaW52YWxpZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0bTYwMDBfZ2V0X3N0ZF9yZXMoZGV2KTsKKworCWYtPmZtdC5waXgud2lkdGggID0gZGV2LT53aWR0aDsKKwlmLT5mbXQucGl4LmhlaWdodCA9IGRldi0+aGVpZ2h0OworCisJZi0+Zm10LnBpeC53aWR0aCAmPSB+MHgwMTsKKworCWYtPmZtdC5waXguZmllbGQgPSBmaWVsZDsKKworCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0KKwkJKGYtPmZtdC5waXgud2lkdGggKiBmbXQtPmRlcHRoKSA+PiAzOworCWYtPmZtdC5waXguc2l6ZWltYWdlID0KKwkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKworCXJldHVybiAwOworfQorCisvKkZJWE1FOiBUaGlzIHNlZW1zIHRvIGJlIGdlbmVyaWMgZW5vdWdoIHRvIGJlIGF0IHZpZGVvZGV2MiAqLworc3RhdGljIGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCWludCByZXQgPSB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKGZpbGUsIGZoLCBmKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZoLT5mbXQgICAgICAgICAgID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwlmaC0+d2lkdGggICAgICAgICA9IGYtPmZtdC5waXgud2lkdGg7CisJZmgtPmhlaWdodCAgICAgICAgPSBmLT5mbXQucGl4LmhlaWdodDsKKwlmaC0+dmJfdmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7CisJZmgtPnR5cGUgICAgICAgICAgPSBmLT50eXBlOworCisJZGV2LT5mb3VyY2MgICAgICAgPSBmLT5mbXQucGl4LnBpeGVsZm9ybWF0OworCisJdG02MDAwX3NldF9mb3VyY2NfZm9ybWF0KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpwKQoreworCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7CisKKwlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcygmZmgtPnZiX3ZpZHEsIHApOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisJc3RydWN0IHRtNjAwMF9maCAgKmZoID0gcHJpdjsKKworCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZigmZmgtPnZiX3ZpZHEsIHApOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisJc3RydWN0IHRtNjAwMF9maCAgKmZoID0gcHJpdjsKKworCXJldHVybiB2aWRlb2J1Zl9xYnVmKCZmaC0+dmJfdmlkcSwgcCk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisJc3RydWN0IHRtNjAwMF9maCAgKmZoID0gcHJpdjsKKworCXJldHVybiB2aWRlb2J1Zl9kcWJ1ZigmZmgtPnZiX3ZpZHEsIHAsCisJCQkJZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCit7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKworCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpICE9IGZoLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcmVzX2dldChkZXYsIGZoLCBmYWxzZSkpCisJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKCZmaC0+dmJfdmlkcSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCit7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKworCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGkgIT0gZmgtPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+dmJfdmlkcSk7CisJcmVzX2ZyZWUoZGV2LCBmaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICpub3JtKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKworCWRldi0+bm9ybSA9ICpub3JtOworCXJjID0gdG02MDAwX2luaXRfYW5hbG9nX21vZGUoZGV2KTsKKworCWZoLT53aWR0aCAgPSBkZXYtPndpZHRoOworCWZoLT5oZWlnaHQgPSBkZXYtPmhlaWdodDsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBjb3JlLCBzX3N0ZCwgZGV2LT5ub3JtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqaW5hbWVbXSA9IHsKKwlbVE02MDAwX0lOUFVUX1RWXSA9ICJUZWxldmlzaW9uIiwKKwlbVE02MDAwX0lOUFVUX0NPTVBPU0lURTFdID0gIkNvbXBvc2l0ZSAxIiwKKwlbVE02MDAwX0lOUFVUX0NPTVBPU0lURTJdID0gIkNvbXBvc2l0ZSAyIiwKKwlbVE02MDAwX0lOUFVUX1NWSURFT10gPSAiUy1WaWRlbyIsCit9OworCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppKQoreworCXN0cnVjdCB0bTYwMDBfZmggICAqZmggPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKwl1bnNpZ25lZCBpbnQgbjsKKworCW4gPSBpLT5pbmRleDsKKwlpZiAobiA+PSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGV2LT52aW5wdXRbbl0udHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpLT5pbmRleCA9IG47CisKKwlpZiAoZGV2LT52aW5wdXRbbl0udHlwZSA9PSBUTTYwMDBfSU5QVVRfVFYpCisJCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7CisJZWxzZQorCQlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKworCXN0cmNweShpLT5uYW1lLCBpbmFtZVtkZXYtPnZpbnB1dFtuXS50eXBlXSk7CisKKwlpLT5zdGQgPSBUTTYwMDBfU1REOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwkqaSA9IGRldi0+aW5wdXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCit7CisJc3RydWN0IHRtNjAwMF9maCAgICpmaCA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCWludCByYyA9IDA7CisKKwlpZiAoaSA+PSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWRldi0+dmlucHV0W2ldLnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5pbnB1dCA9IGk7CisKKwlyYyA9IHZpZGlvY19zX3N0ZChmaWxlLCBwcml2LCAmZGV2LT52ZmQtPmN1cnJlbnRfbm9ybSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIC0tLSBjb250cm9scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRtNjAwMF9xY3RybCk7IGkrKykKKwkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gdG02MDAwX3FjdHJsW2ldLmlkKSB7CisJCQltZW1jcHkocWMsICYodG02MDAwX3FjdHJsW2ldKSwKKwkJCQlzaXplb2YoKnFjKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgICAgPSBmaC0+ZGV2OworCWludCAgdmFsOworCisJLyogRklYTUU6IFByb2JhYmx5LCB0aG9zZSB3b24ndCB3b3JrISBNYXliZSB3ZSBuZWVkIHNoYWRvdyByZWdzICovCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCXZhbCA9IHRtNjAwMF9nZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwOF9MVU1BX0NPTlRSQVNUX0FESiwgMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJdmFsID0gdG02MDAwX2dldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjA5X0xVTUFfQlJJR0hUTkVTU19BREosIDApOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCXZhbCA9IHRtNjAwMF9nZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwQV9DSFJPTUFfU0FUVVJBVElPTl9BREosIDApOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwkJdmFsID0gdG02MDAwX2dldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjBCX0NIUk9NQV9IVUVfUEhBU0VfQURKLCAwKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQl2YWwgPSBkZXYtPmN0bF9tdXRlOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwkJdmFsID0gZGV2LT5jdGxfdm9sdW1lOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIHZhbDsKKworCWN0cmwtPnZhbHVlID0gdmFsOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoICA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCXU4ICB2YWwgPSBjdHJsLT52YWx1ZTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SMDhfTFVNQV9DT05UUkFTVF9BREosIHZhbCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjA5X0xVTUFfQlJJR0hUTkVTU19BREosIHZhbCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjBBX0NIUk9NQV9TQVRVUkFUSU9OX0FESiwgdmFsKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwQl9DSFJPTUFfSFVFX1BIQVNFX0FESiwgdmFsKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlkZXYtPmN0bF9tdXRlID0gdmFsOworCQl0bTYwMDBfdHZhdWRpb19zZXRfbXV0ZShkZXYsIHZhbCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQlkZXYtPmN0bF92b2x1bWUgPSB2YWw7CisJCXRtNjAwMF9zZXRfdm9sdW1lKGRldiwgdmFsKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQoreworCXN0cnVjdCB0bTYwMDBfZmggICAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAodW5saWtlbHkoVU5TRVQgPT0gZGV2LT50dW5lcl90eXBlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKDAgIT0gdC0+aW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RyY3B5KHQtPm5hbWUsICJUZWxldmlzaW9uIik7CisJdC0+dHlwZSAgICAgICA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCXQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9OT1JNOworCXQtPnJhbmdlaGlnaCAgPSAweGZmZmZmZmZmVUw7CisJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgZ190dW5lciwgdCk7CisKKwl0LT5hdWRtb2RlID0gZGV2LT5hbW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQoreworCXN0cnVjdCB0bTYwMDBfZmggICAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAoVU5TRVQgPT0gZGV2LT50dW5lcl90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoMCAhPSB0LT5pbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPmFtb2RlID0gdC0+YXVkbW9kZTsKKwlkcHJpbnRrKGRldiwgMywgImF1ZGlvIG1vZGU6ICV4XG4iLCB0LT5hdWRtb2RlKTsKKworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc190dW5lciwgdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCB0bTYwMDBfZmggICAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAodW5saWtlbHkoVU5TRVQgPT0gZGV2LT50dW5lcl90eXBlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmLT50eXBlID0gZmgtPnJhZGlvID8gVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCWYtPmZyZXF1ZW5jeSA9IGRldi0+ZnJlcTsKKworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgZ19mcmVxdWVuY3ksIGYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoICA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCisJaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseShmLT50dW5lciAhPSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKDAgPT0gZmgtPnJhZGlvICYmIFY0TDJfVFVORVJfQU5BTE9HX1RWICE9IGYtPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgxID09IGZoLT5yYWRpbyAmJiBWNEwyX1RVTkVSX1JBRElPICE9IGYtPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5mcmVxID0gZi0+ZnJlcXVlbmN5OworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19mcmVxdWVuY3ksIGYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkaW9fcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlzdHJjcHkoY2FwLT5kcml2ZXIsICJ0bTYwMDAiKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5uYW1lKSk7CisJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCAiVVNCJTA0eDolMDR4IiwKKwkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOworCWNhcC0+dmVyc2lvbiA9IGRldi0+ZGV2X3R5cGU7CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8CisJCQlWNEwyX0NBUF9BVURJTyAgICAgfAorCQkJVjRMMl9DQVBfUkFESU8gICAgIHwKKwkJCVY0TDJfQ0FQX1JFQURXUklURSB8CisJCQlWNEwyX0NBUF9TVFJFQU1JTkc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAoMCAhPSB0LT5pbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CisJc3RyY3B5KHQtPm5hbWUsICJSYWRpbyIpOworCXQtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIGdfdHVuZXIsIHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkaW9fc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnQpCit7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCisJaWYgKDAgIT0gdC0+aW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3R1bmVyLCB0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGlvX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppKQoreworCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAoaS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRldi0+cmlucHV0LnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RyY3B5KGktPm5hbWUsICJSYWRpbyIpOworCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCit7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKworCWlmIChkZXYtPmlucHV0ICE9IDUpCisJCXJldHVybiAtRUlOVkFMOworCisJKmkgPSBkZXYtPmlucHV0IC0gNTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGlvX2dfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQoreworCW1lbXNldChhLCAwLCBzaXplb2YoKmEpKTsKKwlzdHJjcHkoYS0+bmFtZSwgIlJhZGlvIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkaW9fc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkaW9fc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCit7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKworCWlmIChpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGV2LT5yaW5wdXQudHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPmlucHV0ID0gaSArIDU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHY0bDJfc3RkX2lkICpub3JtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGlvX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjKQoreworCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybDsKKworCWlmIChjLT5pZCA8ICBWNEwyX0NJRF9CQVNFIHx8CisJICAgIGMtPmlkID49IFY0TDJfQ0lEX0xBU1RQMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGMtPmlkID09IFY0TDJfQ0lEX0FVRElPX01VVEUpIHsKKwkJY3RybCA9IGN0cmxfYnlfaWQoYy0+aWQpOworCQkqYyA9ICpjdHJsOworCX0gZWxzZQorCQkqYyA9IG5vX2N0cmw7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJRmlsZSBvcGVyYXRpb25zIGZvciB0aGUgZGV2aWNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHRtNjAwMF9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdG02MDAwX2ZoICpmaDsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlpbnQgaSwgcmM7CisJaW50IHJhZGlvID0gMDsKKworCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX09QRU4sICJ0bTYwMDA6IG9wZW4gY2FsbGVkIChkZXY9JXMpXG4iLAorCQl2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpKTsKKworCXN3aXRjaCAodmRldi0+dmZsX3R5cGUpIHsKKwljYXNlIFZGTF9UWVBFX0dSQUJCRVI6CisJCXR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCWJyZWFrOworCWNhc2UgVkZMX1RZUEVfVkJJOgorCQl0eXBlID0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRTsKKwkJYnJlYWs7CisJY2FzZSBWRkxfVFlQRV9SQURJTzoKKwkJcmFkaW8gPSAxOworCQlicmVhazsKKwl9CisKKwkvKiBJZiBtb3JlIHRoYW4gb25lIHVzZXIsIG11dGV4IHNob3VsZCBiZSBhZGRlZCAqLworCWRldi0+dXNlcnMrKzsKKworCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX09QRU4sICJvcGVuIGRldj0lcyB0eXBlPSVzIHVzZXJzPSVkXG4iLAorCQl2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpLCB2NGwyX3R5cGVfbmFtZXNbdHlwZV0sCisJCWRldi0+dXNlcnMpOworCisJLyogYWxsb2NhdGUgKyBpbml0aWFsaXplIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KKwlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGZoKSB7CisJCWRldi0+dXNlcnMtLTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CisJZmgtPmRldiAgICAgID0gZGV2OworCWZoLT5yYWRpbyAgICA9IHJhZGlvOworCWRldi0+cmFkaW8gICA9IHJhZGlvOworCWZoLT50eXBlICAgICA9IHR5cGU7CisJZGV2LT5mb3VyY2MgID0gZm9ybWF0WzBdLmZvdXJjYzsKKworCWZoLT5mbXQgICAgICA9IGZvcm1hdF9ieV9mb3VyY2MoZGV2LT5mb3VyY2MpOworCisJdG02MDAwX2dldF9zdGRfcmVzKGRldik7CisKKwlmaC0+d2lkdGggPSBkZXYtPndpZHRoOworCWZoLT5oZWlnaHQgPSBkZXYtPmhlaWdodDsKKworCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX09QRU4sICJPcGVuOiBmaD0weCUwOGx4LCBkZXY9MHglMDhseCwgIgorCQkJCQkJImRldi0+dmlkcT0weCUwOGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpZmgsICh1bnNpZ25lZCBsb25nKWRldiwKKwkJCSh1bnNpZ25lZCBsb25nKSZkZXYtPnZpZHEpOworCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX09QRU4sICJPcGVuOiBsaXN0X2VtcHR5ICIKKwkJCQkicXVldWVkPSVkXG4iLCBsaXN0X2VtcHR5KCZkZXYtPnZpZHEucXVldWVkKSk7CisJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgIk9wZW46IGxpc3RfZW1wdHkgIgorCQkJCSJhY3RpdmU9JWRcbiIsIGxpc3RfZW1wdHkoJmRldi0+dmlkcS5hY3RpdmUpKTsKKworCS8qIGluaXRpYWxpemUgaGFyZHdhcmUgb24gYW5hbG9nIG1vZGUgKi8KKwlyYyA9IHRtNjAwMF9pbml0X2FuYWxvZ19tb2RlKGRldik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKGRldi0+bW9kZSAhPSBUTTYwMDBfTU9ERV9BTkFMT0cpIHsKKwkJLyogUHV0IGFsbCBjb250cm9scyBhdCBhIHNhbmUgc3RhdGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG02MDAwX3FjdHJsKTsgaSsrKQorCQkJcWN0bF9yZWdzW2ldID0gdG02MDAwX3FjdHJsW2ldLmRlZmF1bHRfdmFsdWU7CisKKwkJZGV2LT5tb2RlID0gVE02MDAwX01PREVfQU5BTE9HOworCX0KKworCWlmICghZmgtPnJhZGlvKSB7CisJCXZpZGVvYnVmX3F1ZXVlX3ZtYWxsb2NfaW5pdCgmZmgtPnZiX3ZpZHEsICZ0bTYwMDBfdmlkZW9fcW9wcywKKwkJCQlOVUxMLCAmZGV2LT5zbG9jaywKKwkJCQlmaC0+dHlwZSwKKwkJCQlWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCisJCQkJc2l6ZW9mKHN0cnVjdCB0bTYwMDBfYnVmZmVyKSwgZmgsICZkZXYtPmxvY2spOworCX0gZWxzZSB7CisJCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX09QRU4sICJ2aWRlb19vcGVuOiBzZXR0aW5nIHJhZGlvIGRldmljZVxuIik7CisJCWRldi0+aW5wdXQgPSA1OworCQl0bTYwMDBfc2V0X2F1ZGlvX3JpbnB1dChkZXYpOworCQl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIHNfcmFkaW8pOworCQl0bTYwMDBfcHJlcGFyZV9pc29jKGRldik7CisJCXRtNjAwMF9zdGFydF90aHJlYWQoZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3RtNjAwMF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgICAgICAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZmgtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCWlmICghcmVzX2dldChmaC0+ZGV2LCBmaCwgdHJ1ZSkpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCXJldHVybiB2aWRlb2J1Zl9yZWFkX3N0cmVhbSgmZmgtPnZiX3ZpZHEsIGRhdGEsIGNvdW50LCBwb3MsIDAsCisJCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3RtNjAwMF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHRtNjAwMF9maCAgICAgICAgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB0bTYwMDBfYnVmZmVyICAgICpidWY7CisKKwlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICE9IGZoLT50eXBlKQorCQlyZXR1cm4gUE9MTEVSUjsKKworCWlmICghIWlzX3Jlc19zdHJlYW1pbmcoZmgtPmRldiwgZmgpKQorCQlyZXR1cm4gUE9MTEVSUjsKKworCWlmICghaXNfcmVzX3JlYWQoZmgtPmRldiwgZmgpKSB7CisJCS8qIHN0cmVhbWluZyBjYXB0dXJlICovCisJCWlmIChsaXN0X2VtcHR5KCZmaC0+dmJfdmlkcS5zdHJlYW0pKQorCQkJcmV0dXJuIFBPTExFUlI7CisJCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPnZiX3ZpZHEuc3RyZWFtLm5leHQsIHN0cnVjdCB0bTYwMDBfYnVmZmVyLCB2Yi5zdHJlYW0pOworCX0gZWxzZSB7CisJCS8qIHJlYWQoKSBjYXB0dXJlICovCisJCXJldHVybiB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlLCAmZmgtPnZiX3ZpZHEsIHdhaXQpOworCX0KKwlwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+dmIuZG9uZSwgd2FpdCk7CisJaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRE9ORSB8fAorCSAgICBidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0VSUk9SKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0bTYwMDBfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgICAgICAgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB0bTYwMDBfY29yZSAgICAgICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgICAgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCisJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgInRtNjAwMDogY2xvc2UgY2FsbGVkIChkZXY9JXMsIHVzZXJzPSVkKVxuIiwKKwkJdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwgZGV2LT51c2Vycyk7CisKKwlkZXYtPnVzZXJzLS07CisKKwlyZXNfZnJlZShkZXYsIGZoKTsKKworCWlmICghZGV2LT51c2VycykgeworCQlpbnQgZXJyOworCisJCXRtNjAwMF91bmluaXRfaXNvYyhkZXYpOworCisJCWlmICghZmgtPnJhZGlvKQorCQkJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+dmJfdmlkcSk7CisKKwkJZXJyID0gdG02MDAwX3Jlc2V0KGRldik7CisJCWlmIChlcnIgPCAwKQorCQkJZGV2X2VycigmdmRldi0+ZGV2LCAicmVzZXQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwl9CisKKwlrZnJlZShmaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0bTYwMDBfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHZpZGVvYnVmX21tYXBfbWFwcGVyKCZmaC0+dmJfdmlkcSwgdm1hKTsKK30KKworc3RhdGljIHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB0bTYwMDBfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHRtNjAwMF9vcGVuLAorCS5yZWxlYXNlID0gdG02MDAwX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsID0gdmlkZW9faW9jdGwyLCAvKiBWNEwyIGlvY3RsIGhhbmRsZXIgKi8KKwkucmVhZCA9IHRtNjAwMF9yZWFkLAorCS5wb2xsID0gdG02MDAwX3BvbGwsCisJLm1tYXAgPSB0bTYwMDBfbW1hcCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdmlkZW9faW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAgICAgICAgICAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwICA9IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcCAgICAgPSB2aWRpb2NfZ19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcCAgID0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3NfZm10X3ZpZF9jYXAgICAgID0gdmlkaW9jX3NfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19zX3N0ZCAgICAgICAgICAgICA9IHZpZGlvY19zX3N0ZCwKKwkudmlkaW9jX2VudW1faW5wdXQgICAgICAgID0gdmlkaW9jX2VudW1faW5wdXQsCisJLnZpZGlvY19nX2lucHV0ICAgICAgICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgICAgICAgPSB2aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX3F1ZXJ5Y3RybCAgICAgICAgID0gdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybCAgICAgICAgICAgID0gdmlkaW9jX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybCAgICAgICAgICAgID0gdmlkaW9jX3NfY3RybCwKKwkudmlkaW9jX2dfdHVuZXIgICAgICAgICAgID0gdmlkaW9jX2dfdHVuZXIsCisJLnZpZGlvY19zX3R1bmVyICAgICAgICAgICA9IHZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19mcmVxdWVuY3kgICAgICAgPSB2aWRpb2NfZ19mcmVxdWVuY3ksCisJLnZpZGlvY19zX2ZyZXF1ZW5jeSAgICAgICA9IHZpZGlvY19zX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3N0cmVhbW9uICAgICAgICAgID0gdmlkaW9jX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmICAgICAgICAgPSB2aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2NfcmVxYnVmcyAgICAgICAgICAgPSB2aWRpb2NfcmVxYnVmcywKKwkudmlkaW9jX3F1ZXJ5YnVmICAgICAgICAgID0gdmlkaW9jX3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZiAgICAgICAgICAgICAgPSB2aWRpb2NfcWJ1ZiwKKwkudmlkaW9jX2RxYnVmICAgICAgICAgICAgID0gdmlkaW9jX2RxYnVmLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdG02MDAwX3RlbXBsYXRlID0geworCS5uYW1lCQk9ICJ0bTYwMDAiLAorCS5mb3BzICAgICAgICAgICA9ICZ0bTYwMDBfZm9wcywKKwkuaW9jdGxfb3BzICAgICAgPSAmdmlkZW9faW9jdGxfb3BzLAorCS5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCisJLnR2bm9ybXMgICAgICAgID0gVE02MDAwX1NURCwKKwkuY3VycmVudF9ub3JtICAgPSBWNEwyX1NURF9OVFNDX00sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHJhZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHRtNjAwMF9vcGVuLAorCS5yZWxlYXNlCT0gdG02MDAwX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsCT0gdmlkZW9faW9jdGwyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyByYWRpb19pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19xdWVyeWNhcAk9IHJhZGlvX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZ190dW5lcgkJPSByYWRpb19nX3R1bmVyLAorCS52aWRpb2NfZW51bV9pbnB1dAk9IHJhZGlvX2VudW1faW5wdXQsCisJLnZpZGlvY19nX2F1ZGlvCQk9IHJhZGlvX2dfYXVkaW8sCisJLnZpZGlvY19zX3R1bmVyCQk9IHJhZGlvX3NfdHVuZXIsCisJLnZpZGlvY19zX2F1ZGlvCQk9IHJhZGlvX3NfYXVkaW8sCisJLnZpZGlvY19zX2lucHV0CQk9IHJhZGlvX3NfaW5wdXQsCisJLnZpZGlvY19zX3N0ZAkJPSByYWRpb19zX3N0ZCwKKwkudmlkaW9jX3F1ZXJ5Y3RybAk9IHJhZGlvX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfaW5wdXQJCT0gcmFkaW9fZ19pbnB1dCwKKwkudmlkaW9jX2dfY3RybAkJPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsCQk9IHZpZGlvY19zX2N0cmwsCisJLnZpZGlvY19nX2ZyZXF1ZW5jeQk9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5CT0gdmlkaW9jX3NfZnJlcXVlbmN5LAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdG02MDAwX3JhZGlvX3RlbXBsYXRlID0geworCS5uYW1lCQkJPSAidG02MDAwIiwKKwkuZm9wcwkJCT0gJnJhZGlvX2ZvcHMsCisJLmlvY3RsX29wcwkJPSAmcmFkaW9faW9jdGxfb3BzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCUluaXRpYWxpemF0aW9uIGFuZCBtb2R1bGUgc3R1ZmYKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2X2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCisJCWNvbnN0IHN0cnVjdCB2aWRlb19kZXZpY2UKKwkJKnRlbXBsYXRlLCBjb25zdCBjaGFyICp0eXBlX25hbWUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOworCisJdmZkID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKE5VTEwgPT0gdmZkKQorCQlyZXR1cm4gTlVMTDsKKworCSp2ZmQgPSAqdGVtcGxhdGU7CisJdmZkLT52NGwyX2RldiA9ICZkZXYtPnY0bDJfZGV2OworCXZmZC0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOworCXZmZC0+ZGVidWcgPSB0bTYwMDBfZGVidWc7CisJdmZkLT5sb2NrID0gJmRldi0+bG9jazsKKworCXNucHJpbnRmKHZmZC0+bmFtZSwgc2l6ZW9mKHZmZC0+bmFtZSksICIlcyAlcyIsIGRldi0+bmFtZSwgdHlwZV9uYW1lKTsKKworCXZpZGVvX3NldF9kcnZkYXRhKHZmZCwgZGV2KTsKKwlyZXR1cm4gdmZkOworfQorCitpbnQgdG02MDAwX3Y0bDJfcmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJaW50IHJldCA9IC0xOworCisJZGV2LT52ZmQgPSB2ZGV2X2luaXQoZGV2LCAmdG02MDAwX3RlbXBsYXRlLCAidmlkZW8iKTsKKworCWlmICghZGV2LT52ZmQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIGRldmljZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGluaXQgdmlkZW8gZG1hIHF1ZXVlcyAqLworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZpZHEuYWN0aXZlKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLnF1ZXVlZCk7CisKKwlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT52ZmQsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKTsKKworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjYW4ndCByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWdpc3RlcmVkIGRldmljZSAlc1xuIiwKKwkgICAgICAgZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+dmZkKSk7CisKKwlpZiAoZGV2LT5jYXBzLmhhc19yYWRpbykgeworCQlkZXYtPnJhZGlvX2RldiA9IHZkZXZfaW5pdChkZXYsICZ0bTYwMDBfcmFkaW9fdGVtcGxhdGUsCisJCQkJCQkJICAgInJhZGlvIik7CisJCWlmICghZGV2LT5yYWRpb19kZXYpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjYW4ndCByZWdpc3RlciByYWRpbyBkZXZpY2VcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiByZXQ7IC8qIEZJWE1FIHJlbGVhc2UgcmVzb3VyY2UgKi8KKwkJfQorCisJCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShkZXYtPnJhZGlvX2RldiwgVkZMX1RZUEVfUkFESU8sCisJCQkJCSAgICByYWRpb19ucik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcmVnaXN0ZXIgcmFkaW8gZGV2aWNlXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gcmV0OyAvKiBGSVhNRSByZWxlYXNlIHJlc291cmNlICovCisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHZpZGVvX2RldmljZV9ub2RlX25hbWUoZGV2LT5yYWRpb19kZXYpKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJUcmlkZW50IFRWTWFzdGVyIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQjIgYm9hcmQgKExvYWQgc3RhdHVzOiAlZClcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHRtNjAwMF92NGwyX3VucmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT52ZmQpOworCisJaWYgKGRldi0+cmFkaW9fZGV2KSB7CisJCWlmICh2aWRlb19pc19yZWdpc3RlcmVkKGRldi0+cmFkaW9fZGV2KSkKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+cmFkaW9fZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT5yYWRpb19kZXYpOworCQlkZXYtPnJhZGlvX2RldiA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB0bTYwMDBfdjRsMl9leGl0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsICJBbGxvdyBjaGFuZ2luZyB2aWRlbyBkZXZpY2UgbnVtYmVyIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgdG02MDAwX2RlYnVnLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImFjdGl2YXRlcyBkZWJ1ZyBpbmZvIik7CisKK21vZHVsZV9wYXJhbSh2aWRfbGltaXQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZF9saW1pdCwgImNhcHR1cmUgbWVtb3J5IGxpbWl0IGluIG1lZ2FieXRlcyIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzdlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAuaApAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqICB0bTYwMDAuaCAtIGRyaXZlciBmb3IgVE01NjAwL1RNNjAwMC9UTTYwMTAgVVNCIHZpZGVvIGNhcHR1cmUgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hlbCBMdWR3aWcgPG1pY2hlbC5sdWR3aWdAZ21haWwuY29tPgorICoJLSBEVkItVCBzdXBwb3J0CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtdm1hbGxvYy5oPgorI2luY2x1ZGUgInRtNjAwMC11c2ItaXNvYy5oIgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorI2luY2x1ZGUgImR2Yl9kZW11eC5oIgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImRteGRldi5oIgorCisjZGVmaW5lIFRNNjAwMF9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCisKKy8qIElucHV0cyAqLworZW51bSB0bTYwMDBfaXR5cGUgeworCVRNNjAwMF9JTlBVVF9UVgk9IDEsCisJVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJVE02MDAwX0lOUFVUX0NPTVBPU0lURTIsCisJVE02MDAwX0lOUFVUX1NWSURFTywKKwlUTTYwMDBfSU5QVVRfRFZCLAorCVRNNjAwMF9JTlBVVF9SQURJTywKK307CisKK2VudW0gdG02MDAwX211eCB7CisJVE02MDAwX1ZNVVhfVklERU9fQSA9IDEsCisJVE02MDAwX1ZNVVhfVklERU9fQiwKKwlUTTYwMDBfVk1VWF9WSURFT19BQiwKKwlUTTYwMDBfQU1VWF9BREMxLAorCVRNNjAwMF9BTVVYX0FEQzIsCisJVE02MDAwX0FNVVhfU0lGMSwKKwlUTTYwMDBfQU1VWF9TSUYyLAorCVRNNjAwMF9BTVVYX0kyUywKK307CisKK2VudW0gdG02MDAwX2RldnR5cGUgeworCVRNNjAwMCA9IDAsCisJVE01NjAwLAorCVRNNjAxMCwKK307CisKK3N0cnVjdCB0bTYwMDBfaW5wdXQgeworCWVudW0gdG02MDAwX2l0eXBlCXR5cGU7CisJZW51bSB0bTYwMDBfbXV4CQl2bXV4OworCWVudW0gdG02MDAwX211eAkJYW11eDsKKwl1bnNpZ25lZCBpbnQJCXZfZ3BpbzsKKwl1bnNpZ25lZCBpbnQJCWFfZ3BpbzsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJQmFzaWMgc3RydWN0dXJlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RydWN0IHRtNjAwMF9mbXQgeworCWNoYXIgICpuYW1lOworCXUzMiAgIGZvdXJjYzsgICAgICAgICAgLyogdjRsMiBmb3JtYXQgaWQgKi8KKwlpbnQgICBkZXB0aDsKK307CisKKy8qIGJ1ZmZlciBmb3Igb25lIHZpZGVvIGZyYW1lICovCitzdHJ1Y3QgdG02MDAwX2J1ZmZlciB7CisJLyogY29tbW9uIHY0bCBidWZmZXIgc3R1ZmYgLS0gbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgdmI7CisKKwlzdHJ1Y3QgdG02MDAwX2ZtdCAgICAgICpmbXQ7Cit9OworCitzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIGFjdGl2ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIHF1ZXVlZDsKKworCS8qIHRocmVhZCBmb3IgZ2VuZXJhdGluZyB2aWRlbyBzdHJlYW0qLworCXN0cnVjdCB0YXNrX3N0cnVjdCAgICAgICAgICprdGhyZWFkOworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgICAgIHdxOworCS8qIENvdW50ZXJzIHRvIGNvbnRyb2wgZnBzIHJhdGUgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBpbmlfamlmZmllczsKK307CisKKy8qIGRldmljZSBzdGF0ZXMgKi8KK2VudW0gdG02MDAwX2NvcmVfc3RhdGUgeworCURFVl9JTklUSUFMSVpFRCAgID0gMHgwMSwKKwlERVZfRElTQ09OTkVDVEVEICA9IDB4MDIsCisJREVWX01JU0NPTkZJR1VSRUQgPSAweDA0LAorfTsKKworLyogaW8gbWV0aG9kcyAqLworZW51bSB0bTYwMDBfaW9fbWV0aG9kIHsKKwlJT19OT05FLAorCUlPX1JFQUQsCisJSU9fTU1BUCwKK307CisKK2VudW0gdG02MDAwX21vZGUgeworCVRNNjAwMF9NT0RFX1VOS05PV04gPSAwLAorCVRNNjAwMF9NT0RFX0FOQUxPRywKKwlUTTYwMDBfTU9ERV9ESUdJVEFMLAorfTsKKworc3RydWN0IHRtNjAwMF9ncGlvIHsKKwlpbnQJCXR1bmVyX3Jlc2V0OworCWludAkJdHVuZXJfb247CisJaW50CQlkZW1vZF9yZXNldDsKKwlpbnQJCWRlbW9kX29uOworCWludAkJcG93ZXJfbGVkOworCWludAkJZHZiX2xlZDsKKwlpbnQJCWlyOworfTsKKworc3RydWN0IHRtNjAwMF9jYXBhYmlsaXRpZXMgeworCXVuc2lnbmVkIGludCAgICBoYXNfdHVuZXI6MTsKKwl1bnNpZ25lZCBpbnQgICAgaGFzX3RkYTk4NzQ6MTsKKwl1bnNpZ25lZCBpbnQgICAgaGFzX2R2YjoxOworCXVuc2lnbmVkIGludCAgICBoYXNfemwxMDM1MzoxOworCXVuc2lnbmVkIGludCAgICBoYXNfZWVwcm9tOjE7CisJdW5zaWduZWQgaW50ICAgIGhhc19yZW1vdGU6MTsKKwl1bnNpZ25lZCBpbnQgICAgaGFzX3JhZGlvOjE7Cit9OworCitzdHJ1Y3QgdG02MDAwX2R2YiB7CisJc3RydWN0IGR2Yl9hZGFwdGVyCWFkYXB0ZXI7CisJc3RydWN0IGR2Yl9kZW11eAlkZW11eDsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kCSpmcm9udGVuZDsKKwlzdHJ1Y3QgZG14ZGV2CQlkbXhkZXY7CisJdW5zaWduZWQgaW50CQlzdHJlYW1zOworCXN0cnVjdCB1cmIJCSpidWxrX3VyYjsKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OworfTsKKworc3RydWN0IHNuZF90bTYwMDBfY2FyZCB7CisJc3RydWN0IHNuZF9jYXJkCQkJKmNhcmQ7CisJc3BpbmxvY2tfdAkJCXJlZ19sb2NrOworCXN0cnVjdCB0bTYwMDBfY29yZQkJKmNvcmU7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtCSpzdWJzdHJlYW07CisKKwkvKiB0ZW1wb3JhcnkgZGF0YSBmb3IgYnVmZmVyIGZpbGwgcHJvY2Vzc2luZyAqLworCXVuc2lnbmVkCQkJYnVmX3BvczsKKwl1bnNpZ25lZAkJCXBlcmlvZF9wb3M7Cit9OworCitzdHJ1Y3QgdG02MDAwX2VuZHBvaW50IHsKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQJKmVuZHA7CisJX191OAkJCQliSW50ZXJmYWNlTnVtYmVyOworCV9fdTgJCQkJYkFsdGVybmF0ZVNldHRpbmc7CisJdW5zaWduZWQJCQltYXhzaXplOworfTsKKworI2RlZmluZSBUTTYwMDBfUVVJUktfTk9fVVNCX0RFTEFZICgxIDw8IDApCisKK3N0cnVjdCB0bTYwMDBfY29yZSB7CisJLyogZ2VuZXJpYyBkZXZpY2UgcHJvcGVydGllcyAqLworCWNoYXIJCQkJbmFtZVszMF07CS8qIG5hbWUgKGluY2x1ZGluZyBtaW5vcikgb2YgdGhlIGRldmljZSAqLworCWludAkJCQltb2RlbDsJCS8qIGluZGV4IGluIHRoZSBkZXZpY2VfZGF0YSBzdHJ1Y3QgKi8KKwlpbnQJCQkJZGV2bm87CQkvKiBtYXJrcyB0aGUgbnVtYmVyIG9mIHRoaXMgZGV2aWNlICovCisJZW51bSB0bTYwMDBfZGV2dHlwZQkJZGV2X3R5cGU7CS8qIHR5cGUgb2YgZGV2aWNlICovCisJdW5zaWduZWQgY2hhcgkJCWVlZGF0YVsyNTZdOwkvKiBFZXByb20gZGF0YSAqLworCXVuc2lnbmVkCQkJZWVkYXRhX3NpemU7CS8qIFNpemUgb2YgdGhlIGVlcHJvbSBpbmZvICovCisKKwl2NGwyX3N0ZF9pZCAgICAgICAgICAgICAgICAgICAgIG5vcm07ICAgICAgICAgICAvKiBDdXJyZW50IG5vcm0gKi8KKwlpbnQJCQkJd2lkdGgsIGhlaWdodDsJLyogU2VsZWN0ZWQgcmVzb2x1dGlvbiAqLworCisJZW51bSB0bTYwMDBfY29yZV9zdGF0ZQkJc3RhdGU7CisKKwkvKiBEZXZpY2UgQ2FwYWJpbGl0aWVzKi8KKwlzdHJ1Y3QgdG02MDAwX2NhcGFiaWxpdGllcwljYXBzOworCisJLyogVHVuZXIgY29uZmlndXJhdGlvbiAqLworCWludAkJCQl0dW5lcl90eXBlOwkJLyogdHlwZSBvZiB0aGUgdHVuZXIgKi8KKwlpbnQJCQkJdHVuZXJfYWRkcjsJCS8qIHR1bmVyIGFkZHJlc3MgKi8KKworCXN0cnVjdCB0bTYwMDBfZ3BpbwkJZ3BpbzsKKworCWNoYXIJCQkJKmlyX2NvZGVzOworCisJX191OAkJCQlyYWRpbzsKKworCS8qIERlbW9kdWxhdG9yIGNvbmZpZ3VyYXRpb24gKi8KKwlpbnQJCQkJZGVtb2RfYWRkcjsJLyogZGVtb2R1bGF0b3IgYWRkcmVzcyAqLworCisJaW50CQkJCWF1ZGlvX2JpdHJhdGU7CisJLyogaTJjIGkvbyAqLworCXN0cnVjdCBpMmNfYWRhcHRlcgkJaTJjX2FkYXA7CisJc3RydWN0IGkyY19jbGllbnQJCWkyY19jbGllbnQ7CisKKworCS8qIGV4dGVuc2lvbiAqLworCXN0cnVjdCBsaXN0X2hlYWQJCWRldmxpc3Q7CisKKwkvKiB2aWRlbyBmb3IgbGludXggKi8KKwlpbnQJCQkJdXNlcnM7CisKKwkvKiB2YXJpb3VzIGRldmljZSBpbmZvICovCisJc3RydWN0IHRtNjAwMF9maAkJKnJlc291cmNlczsJLyogUG9pbnRzIHRvIGZoIHRoYXQgaXMgc3RyZWFtaW5nICovCisJYm9vbAkJCQlpc19yZXNfcmVhZDsKKworCXN0cnVjdCB2aWRlb19kZXZpY2UJCSp2ZmQ7CisJc3RydWN0IHZpZGVvX2RldmljZQkJKnJhZGlvX2RldjsKKwlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlCQl2aWRxOworCXN0cnVjdCB2NGwyX2RldmljZQkJdjRsMl9kZXY7CisKKwlpbnQJCQkJaW5wdXQ7CisJc3RydWN0IHRtNjAwMF9pbnB1dAkJdmlucHV0WzNdOwkvKiB2aWRlbyBpbnB1dCAqLworCXN0cnVjdCB0bTYwMDBfaW5wdXQJCXJpbnB1dDsJCS8qIHJhZGlvIGlucHV0ICovCisKKwlpbnQJCQkJZnJlcTsKKwl1bnNpZ25lZCBpbnQJCQlmb3VyY2M7CisKKwllbnVtIHRtNjAwMF9tb2RlCQltb2RlOworCisJaW50CQkJCWN0bF9tdXRlOyAgICAgICAgICAgICAvKiBhdWRpbyAqLworCWludAkJCQljdGxfdm9sdW1lOworCWludAkJCQlhbW9kZTsKKworCS8qIERWQi1UIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgdG02MDAwX2R2YgkJKmR2YjsKKworCS8qIGF1ZGlvIHN1cHBvcnQgKi8KKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkCQkqYWRldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdxX3RyaWdnZXI7ICAgLyogVHJpZ2dlciB0byBzdGFydC9zdG9wIGF1ZGlvIGZvciBhbHNhIG1vZHVsZSAqLworCWF0b21pY190CQkJc3RyZWFtX3N0YXJ0ZWQ7ICAvKiBzdHJlYW0gc2hvdWxkIGJlIHJ1bm5pbmcgaWYgdHJ1ZSAqLworCisJc3RydWN0IHRtNjAwMF9JUgkJKmlyOworCisJLyogbG9ja3MgKi8KKwlzdHJ1Y3QgbXV0ZXgJCQlsb2NrOworCXN0cnVjdCBtdXRleAkJCXVzYl9sb2NrOworCisJLyogdXNiIHRyYW5zZmVyICovCisJc3RydWN0IHVzYl9kZXZpY2UJCSp1ZGV2OwkJLyogdGhlIHVzYiBkZXZpY2UgKi8KKworCXN0cnVjdCB0bTYwMDBfZW5kcG9pbnQJCWJ1bGtfaW4sIGJ1bGtfb3V0LCBpc29jX2luLCBpc29jX291dDsKKwlzdHJ1Y3QgdG02MDAwX2VuZHBvaW50CQlpbnRfaW4sIGludF9vdXQ7CisKKwkvKiBzY2FsZXIhPTAgaWYgc2NhbGVyIGlzIGFjdGl2ZSovCisJaW50CQkJCXNjYWxlcjsKKworCQkvKiBJc29jIGNvbnRyb2wgc3RydWN0ICovCisJc3RydWN0IHVzYl9pc29jX2N0bCAgICAgICAgICBpc29jX2N0bDsKKworCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgICAgc2xvY2s7CisKKwl1bnNpZ25lZCBsb25nIHF1aXJrczsKK307CisKK2VudW0gdG02MDAwX29wc190eXBlIHsKKwlUTTYwMDBfQVVESU8gPSAweDEwLAorCVRNNjAwMF9EVkIgPSAweDIwLAorfTsKKworc3RydWN0IHRtNjAwMF9vcHMgeworCXN0cnVjdCBsaXN0X2hlYWQJbmV4dDsKKwljaGFyCQkJKm5hbWU7CisJZW51bSB0bTYwMDBfb3BzX3R5cGUJdHlwZTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgdG02MDAwX2NvcmUgKik7CisJaW50ICgqZmluaSkoc3RydWN0IHRtNjAwMF9jb3JlICopOworCWludCAoKmZpbGxidWYpKHN0cnVjdCB0bTYwMDBfY29yZSAqLCBjaGFyICpidWYsIGludCBzaXplKTsKK307CisKK3N0cnVjdCB0bTYwMDBfZmggeworCXN0cnVjdCB0bTYwMDBfY29yZSAgICAgICAgICAgKmRldjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgIHJhZGlvOworCisJLyogdmlkZW8gY2FwdHVyZSAqLworCXN0cnVjdCB0bTYwMDBfZm10ICAgICAgICAgICAgKmZtdDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQ7CisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICAgICAgICB2Yl92aWRxOworCisJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgICAgICB0eXBlOworfTsKKworI2RlZmluZSBUTTYwMDBfU1RECShWNEwyX1NURF9QQUx8VjRMMl9TVERfUEFMX058VjRMMl9TVERfUEFMX05jfCAgICBcCisJCQlWNEwyX1NURF9QQUxfTXxWNEwyX1NURF9QQUxfNjB8VjRMMl9TVERfTlRTQ19NfCBcCisJCQlWNEwyX1NURF9OVFNDX01fSlB8VjRMMl9TVERfU0VDQU0pCisKKy8qIEluIHRtNjAwMC1jYXJkcy5jICovCisKK2ludCB0bTYwMDBfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CitpbnQgdG02MDAwX3hjNTAwMF9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKTsKK2ludCB0bTYwMDBfY2FyZHNfc2V0dXAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwordm9pZCB0bTYwMDBfZmxhc2hfbGVkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCBzdGF0ZSk7CisKKy8qIEluIHRtNjAwMC1jb3JlLmMgKi8KKworaW50IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxdHlwZSwgdTggcmVxLAorCQkJICAgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpidWYsIHUxNiBsZW4pOworaW50IHRtNjAwMF9nZXRfcmVnKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKK2ludCB0bTYwMDBfZ2V0X3JlZzE2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKK2ludCB0bTYwMDBfZ2V0X3JlZzMyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKK2ludCB0bTYwMDBfc2V0X3JlZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCk7CitpbnQgdG02MDAwX3NldF9yZWdfbWFzayhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsCisJCQkJCQl1MTYgaW5kZXgsIHUxNiBtYXNrKTsKK2ludCB0bTYwMDBfaTJjX3Jlc2V0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1MTYgdHNsZWVwKTsKK2ludCB0bTYwMDBfaW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CitpbnQgdG02MDAwX3Jlc2V0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKKworaW50IHRtNjAwMF9pbml0X2FuYWxvZ19tb2RlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfaW5pdF9kaWdpdGFsX21vZGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworaW50IHRtNjAwMF9zZXRfYXVkaW9fYml0cmF0ZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IGJpdHJhdGUpOworaW50IHRtNjAwMF9zZXRfYXVkaW9fcmlucHV0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfdHZhdWRpb19zZXRfbXV0ZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggbXV0ZSk7Cit2b2lkIHRtNjAwMF9zZXRfdm9sdW1lKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBpbnQgdm9sKTsKKworaW50IHRtNjAwMF92NGwyX3JlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfdjRsMl91bnJlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfdjRsMl9leGl0KHZvaWQpOwordm9pZCB0bTYwMDBfc2V0X2ZvdXJjY19mb3JtYXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworCit2b2lkIHRtNjAwMF9yZW1vdmVfZnJvbV9kZXZsaXN0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK3ZvaWQgdG02MDAwX2FkZF9pbnRvX2Rldmxpc3Qoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworaW50IHRtNjAwMF9yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IHRtNjAwMF9vcHMgKm9wcyk7Cit2b2lkIHRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbihzdHJ1Y3QgdG02MDAwX29wcyAqb3BzKTsKK3ZvaWQgdG02MDAwX2luaXRfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK3ZvaWQgdG02MDAwX2Nsb3NlX2V4dGVuc2lvbihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CitpbnQgdG02MDAwX2NhbGxfZmlsbGJ1ZihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgZW51bSB0bTYwMDBfb3BzX3R5cGUgdHlwZSwKKwkJCWNoYXIgKmJ1ZiwgaW50IHNpemUpOworCisKKy8qIEluIHRtNjAwMC1zdGRzLmMgKi8KK3ZvaWQgdG02MDAwX2dldF9zdGRfcmVzKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfc2V0X3N0YW5kYXJkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKKworLyogSW4gdG02MDAwLWkyYy5jICovCitpbnQgdG02MDAwX2kyY19yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CitpbnQgdG02MDAwX2kyY191bnJlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKKworLyogSW4gdG02MDAwLXF1ZXVlLmMgKi8KKworaW50IHRtNjAwMF92NGwyX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworaW50IHRtNjAwMF92aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBlbnVtIHY0bDJfYnVmX3R5cGUgaSk7CitpbnQgdG02MDAwX3ZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgZW51bSB2NGwyX2J1Zl90eXBlIGkpOworaW50IHRtNjAwMF92aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJiKTsKK2ludCB0bTYwMDBfdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKK2ludCB0bTYwMDBfdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CitpbnQgdG02MDAwX3ZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKK3NzaXplX3QgdG02MDAwX3Y0bDJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwKKwkJCSBsb2ZmX3QgKmZfcG9zKTsKK3Vuc2lnbmVkIGludCB0bTYwMDBfdjRsMl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKK2ludCB0bTYwMDBfcXVldWVfaW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CisKKy8qIEluIHRtNjAwMC1hbHNhLmMgKi8KKy8qaW50IHRtNjAwMF9hdWRpb19pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBpbnQgaWR4KTsqLworCisvKiBJbiB0bTYwMDAtaW5wdXQuYyAqLworaW50IHRtNjAwMF9pcl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfaXJfZmluaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Cit2b2lkIHRtNjAwMF9pcl93YWl0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCBzdGF0ZSk7CitpbnQgdG02MDAwX2lyX2ludF9zdGFydChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Cit2b2lkIHRtNjAwMF9pcl9pbnRfc3RvcChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CisKKy8qIERlYnVnIHN0dWZmICovCisKK2V4dGVybiBpbnQgdG02MDAwX2RlYnVnOworCisjZGVmaW5lIGRwcmludGsoZGV2LCBsZXZlbCwgZm10LCBhcmcuLi4pIGRvIHtcCisJaWYgKHRtNjAwMF9kZWJ1ZyAmIGxldmVsKSBcCisJCXByaW50ayhLRVJOX0lORk8gIiglbHUpICVzICVzIDoiZm10LCBqaWZmaWVzLCBcCisJCQkgZGV2LT5uYW1lLCBfX2Z1bmNfXyAsICMjYXJnKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBWNEwyX0RFQlVHX1JFRwkJMHgwMDA0CisjZGVmaW5lIFY0TDJfREVCVUdfSTJDCQkweDAwMDgKKyNkZWZpbmUgVjRMMl9ERUJVR19RVUVVRQkweDAwMTAKKyNkZWZpbmUgVjRMMl9ERUJVR19JU09DCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9ERUJVR19SRVNfTE9DSwkweDAwNDAJLyogUmVzb3VyY2UgbG9ja2luZyAqLworI2RlZmluZSBWNEwyX0RFQlVHX09QRU4JCTB4MDA4MAkvKiB2aWRlbyBvcGVuL2Nsb3NlIGRlYnVnICovCisKKyNkZWZpbmUgdG02MDAwX2VycihmbXQsIGFyZy4uLikgZG8ge1wKKwlwcmludGsoS0VSTl9FUlIgInRtNjAwMCAlcyA6ImZtdCwgXAorCQlfX2Z1bmNfXyAsICMjYXJnKTsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKaW5kZXggYzQ2YTNiYi4uZjIyZGJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKQEAgLTE2OTUsMTQgKzE2OTUsMTcgQEAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CiAJewogCQlpbnQgdm9sdW1lLCBiYWxhbmNlOworCiAJCWlmICghKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSkKIAkJCWJyZWFrOwogCi0JCXZvbHVtZSA9IG1heChjaGlwLT5sZWZ0LGNoaXAtPnJpZ2h0KTsKKwkJdm9sdW1lID0gbWF4KGNoaXAtPmxlZnQsIGNoaXAtPnJpZ2h0KTsKIAkJYmFsYW5jZSA9IGN0cmwtPnZhbHVlOworCQljaGlwLT5sZWZ0ID0gKG1pbig2NTUzNiAtIGJhbGFuY2UsIDMyNzY4KSAqIHZvbHVtZSkgLyAzMjc2ODsKKwkJY2hpcC0+cmlnaHQgPSAobWluKGJhbGFuY2UsIHZvbHVtZSAqIChfX3UxNikzMjc2OCkpIC8gMzI3Njg7CiAKLQkJY2hpcF93cml0ZShjaGlwLGRlc2MtPmxlZnRyZWcsZGVzYy0+dm9sZnVuYyhjaGlwLT5sZWZ0KSk7Ci0JCWNoaXBfd3JpdGUoY2hpcCxkZXNjLT5yaWdodHJlZyxkZXNjLT52b2xmdW5jKGNoaXAtPnJpZ2h0KSk7CisJCWNoaXBfd3JpdGUoY2hpcCwgZGVzYy0+bGVmdHJlZywgZGVzYy0+dm9sZnVuYyhjaGlwLT5sZWZ0KSk7CisJCWNoaXBfd3JpdGUoY2hpcCwgZGVzYy0+cmlnaHRyZWcsIGRlc2MtPnZvbGZ1bmMoY2hpcC0+cmlnaHQpKTsKIAogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE0eC5jCmluZGV4IDliM2U4MjguLjkyNmYwMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE0eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE0eC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MC5jCmluZGV4IGU5MjdkMjUuLjZhYmFhMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHZwNTE1MC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwX3JlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwX3JlZy5oCmluZGV4IDQyNDAwNDMuLjI1YTk5NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MF9yZWcuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTBfcmVnLmgKQEAgLTQ1LDcgKzQ1LDIyIEBACiAKIC8qIFJlc2VydmVkIDFGaC0yN2ggKi8KIAotI2RlZmluZSBUVlA1MTUwX1ZJREVPX1NURCAgICAgICAgICAgMHgyOCAvKiBWaWRlbyBzdGFuZGFyZCAqLworI2RlZmluZSBWSURFT19TVERfTUFTSwkJCSAoMHgwNyA+PiAxKQorI2RlZmluZSBUVlA1MTUwX1ZJREVPX1NURCAgICAgICAgICAgICAgICAweDI4IC8qIFZpZGVvIHN0YW5kYXJkICovCisjZGVmaW5lIFZJREVPX1NURF9BVVRPX1NXSVRDSF9CSVQJIDB4MDAKKyNkZWZpbmUgVklERU9fU1REX05UU0NfTUpfQklUCQkgMHgwMgorI2RlZmluZSBWSURFT19TVERfUEFMX0JER0hJTl9CSVQJIDB4MDQKKyNkZWZpbmUgVklERU9fU1REX1BBTF9NX0JJVAkJIDB4MDYKKyNkZWZpbmUgVklERU9fU1REX1BBTF9DT01CSU5BVElPTl9OX0JJVAkgMHgwOAorI2RlZmluZSBWSURFT19TVERfTlRTQ180XzQzX0JJVAkJIDB4MGEKKyNkZWZpbmUgVklERU9fU1REX1NFQ0FNX0JJVAkJIDB4MGMKKworI2RlZmluZSBWSURFT19TVERfTlRTQ19NSl9CSVRfQVMgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgVklERU9fU1REX1BBTF9CREdISU5fQklUX0FTICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFZJREVPX1NURF9QQUxfTV9CSVRfQVMJCSAgICAgICAgIDB4MDUKKyNkZWZpbmUgVklERU9fU1REX1BBTF9DT01CSU5BVElPTl9OX0JJVF9BUwkgMHgwNworI2RlZmluZSBWSURFT19TVERfTlRTQ180XzQzX0JJVF9BUwkJIDB4MDkKKyNkZWZpbmUgVklERU9fU1REX1NFQ0FNX0JJVF9BUwkJICAgICAgICAgMHgwYgogCiAvKiBSZXNlcnZlZCAyOWgtMmJoICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNzAwMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dnA3MDAyLmMKaW5kZXggYjc5OTg1MS4uNzg3NWU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dnA3MDAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dnA3MDAyLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHZwNzAwMi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CkBAIC0xMjgsNyArMTI5LDcgQEAKIAl7IFRWUDcwMDJfQURDX1NFVFVQLCAweDUwLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0NPQVJTRV9DTEFNUF9DVEwsIDB4MDAsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfU09HX0NMQU1QLCAweDgwLCBUVlA3MDAyX1dSSVRFIH0sCi0JeyBUVlA3MDAyX1JHQl9DT0FSU0VfQ0xBTVBfQ1RMLCAweDAwLCBUVlA3MDAyX1dSSVRFIH0sCisJeyBUVlA3MDAyX1JHQl9DT0FSU0VfQ0xBTVBfQ1RMLCAweDhjLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX1NPR19DT0FSU0VfQ0xBTVBfQ1RMLCAweDA0LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FMQ19QTEFDRU1FTlQsIDB4NWEsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IDB4MzIsIDB4MTgsIFRWUDcwMDJfUkVTRVJWRUQgfSwKQEAgLTE4Miw3ICsxODMsNiBAQAogCXsgVFZQNzAwMl9IUExMX0ZEQktfRElWX01TQlMsIDB4MzUsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9MU0JTLCAweGEwLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfQ1JUTCwgMHgwMiwgVFZQNzAwMl9XUklURSB9LAotCXsgVFZQNzAwMl9IUExMX1BIQVNFX1NFTCwgMHgxNCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUQVJUX1BJWEVMX0xTQlMsIDB4OTEsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9NU0JTLCAweDAwLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RPUF9QSVhFTF9MU0JTLCAweDBCLCBUVlA3MDAyX1dSSVRFIH0sCkBAIC0yMDQsNyArMjA0LDYgQEAKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9NU0JTLCAweDM2LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfRkRCS19ESVZfTFNCUywgMHgwMCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9IUExMX0NSVEwsIDB4MTgsIFRWUDcwMDJfV1JJVEUgfSwKLQl7IFRWUDcwMDJfSFBMTF9QSEFTRV9TRUwsIDB4MTQsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9MU0JTLCAweDlCLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RBUlRfUElYRUxfTVNCUywgMHgwMCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUT1BfUElYRUxfTFNCUywgMHgwRiwgVFZQNzAwMl9XUklURSB9LApAQCAtMjI2LDcgKzIyNSw2IEBACiAJeyBUVlA3MDAyX0hQTExfRkRCS19ESVZfTVNCUywgMHg4OSwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9IUExMX0ZEQktfRElWX0xTQlMsIDB4ODAsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfSFBMTF9DUlRMLCAweDk4LCBUVlA3MDAyX1dSSVRFIH0sCi0JeyBUVlA3MDAyX0hQTExfUEhBU0VfU0VMLCAweDE0LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RBUlRfUElYRUxfTFNCUywgMHgwNiwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUQVJUX1BJWEVMX01TQlMsIDB4MDEsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVE9QX1BJWEVMX0xTQlMsIDB4OGEsIFRWUDcwMDJfV1JJVEUgfSwKQEAgLTI0OCw3ICsyNDYsNiBAQAogCXsgVFZQNzAwMl9IUExMX0ZEQktfRElWX01TQlMsIDB4ODksIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9MU0JTLCAweDgwLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfQ1JUTCwgMHhFMCwgVFZQNzAwMl9XUklURSB9LAotCXsgVFZQNzAwMl9IUExMX1BIQVNFX1NFTCwgMHgxNCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUQVJUX1BJWEVMX0xTQlMsIDB4MDYsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9NU0JTLCAweDAxLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RPUF9QSVhFTF9MU0JTLCAweDhhLCBUVlA3MDAyX1dSSVRFIH0sCkBAIC0yNzAsNyArMjY3LDYgQEAKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9NU0JTLCAweGE1LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfRkRCS19ESVZfTFNCUywgMHgwMCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9IUExMX0NSVEwsIDB4OTgsIFRWUDcwMDJfV1JJVEUgfSwKLQl7IFRWUDcwMDJfSFBMTF9QSEFTRV9TRUwsIDB4MTQsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9MU0JTLCAweDA2LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RBUlRfUElYRUxfTVNCUywgMHgwMSwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUT1BfUElYRUxfTFNCUywgMHg4YSwgVFZQNzAwMl9XUklURSB9LApAQCAtMjkyLDcgKzI4OCw2IEBACiAJeyBUVlA3MDAyX0hQTExfRkRCS19ESVZfTVNCUywgMHg2NywgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9IUExMX0ZEQktfRElWX0xTQlMsIDB4MjAsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfSFBMTF9DUlRMLCAweGEwLCBUVlA3MDAyX1dSSVRFIH0sCi0JeyBUVlA3MDAyX0hQTExfUEhBU0VfU0VMLCAweDE2LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RBUlRfUElYRUxfTFNCUywgMHg0NywgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUQVJUX1BJWEVMX01TQlMsIDB4MDEsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVE9QX1BJWEVMX0xTQlMsIDB4NEIsIFRWUDcwMDJfV1JJVEUgfSwKQEAgLTMxNCw3ICszMDksNiBAQAogCXsgVFZQNzAwMl9IUExMX0ZEQktfRElWX01TQlMsIDB4N2IsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9MU0JTLCAweGMwLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfQ1JUTCwgMHg5OCwgVFZQNzAwMl9XUklURSB9LAotCXsgVFZQNzAwMl9IUExMX1BIQVNFX1NFTCwgMHgxNiwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUQVJUX1BJWEVMX0xTQlMsIDB4NDcsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9NU0JTLCAweDAxLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RPUF9QSVhFTF9MU0JTLCAweDRCLCBUVlA3MDAyX1dSSVRFIH0sCkBAIC02ODcsNiArNjgxLDkgQEAKIAl1OCBjcGxfbXNiOwogCWludCBpbmRleDsKIAorCS8qIFJldHVybiBpbnZhbGlkIHByZXNldCBpZiBubyBhY3RpdmUgaW5wdXQgaXMgZGV0ZWN0ZWQgKi8KKwlxcHJlc2V0LT5wcmVzZXQgPSBWNEwyX0RWX0lOVkFMSUQ7CisKIAlkZXZpY2UgPSB0b190dnA3MDAyKHNkKTsKIAogCS8qIFJlYWQgc3RhbmRhcmRzIGZyb20gZGV2aWNlIHJlZ2lzdGVycyAqLwpAQCAtNzIwLDggKzcxNyw2IEBACiAJaWYgKGluZGV4ID09IE5VTV9QUkVTRVRTKSB7CiAJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImRldGVjdGlvbiBmYWlsZWQ6IGxwZiA9ICV4LCBjcGwgPSAleFxuIiwKIAkJCQkJCQkJbHBmciwgY3Bsbik7Ci0JCS8qIENvdWxkIG5vdCBkZXRlY3QgYSBzaWduYWwsIHNvIHJldHVybiB0aGUgJ2ludmFsaWQnIHByZXNldCAqLwotCQlxcHJlc2V0LT5wcmVzZXQgPSBWNEwyX0RWX0lOVkFMSUQ7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dzk5MTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHc5OTEwLmMKaW5kZXggNzQyNDgyZS4uYTUxNGZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dzk5MTAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R3OTkxMC5jCkBAIC0yMiwxMSArMjIsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KICNpbmNsdWRlIDxtZWRpYS90dzk5MTAuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogCiAjZGVmaW5lIEdFVF9JRCh2YWwpICAoKHZhbCAmIDB4RjgpID4+IDMpCiAjZGVmaW5lIEdFVF9SRVYodmFsKSAodmFsICYgMHgwNykKQEAgLTIwMyw2ICsyMDUsMTAgQEAKICNkZWZpbmUgUlRTRUxfRklFTEQgMHgwNiAvKiAwMTEwID0gRklFTEQgKi8KICNkZWZpbmUgUlRTRUxfUlRDTyAgMHgwNyAvKiAwMTExID0gUlRDTyAoIFJlYWwgVGltZSBDb250cm9sICkgKi8KIAorLyogSFNZTkMgc3RhcnQgYW5kIGVuZCBhcmUgY29uc3RhbnQgZm9yIG5vdyAqLworI2RlZmluZSBIU1lOQ19TVEFSVAkweDAyNjAKKyNkZWZpbmUgSFNZTkNfRU5ECTB4MDMwMAorCiAvKgogICogc3RydWN0dXJlCiAgKi8KQEAgLTIyMCwyMiArMjI2LDExIEBACiAJdTE2ICAgICAgICAgICAgIHZzY2FsZTsKIH07CiAKLXN0cnVjdCB0dzk5MTBfY3JvcHBpbmdfY3RybCB7Ci0JdTE2IHZkZWxheTsKLQl1MTYgdmFjdGl2ZTsKLQl1MTYgaGRlbGF5OwotCXUxNiBoYWN0aXZlOwotfTsKLQotc3RydWN0IHR3OTkxMF9oc3luY19jdHJsIHsKLQl1MTYgc3RhcnQ7Ci0JdTE2IGVuZDsKLX07Ci0KIHN0cnVjdCB0dzk5MTBfcHJpdiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2CQlzdWJkZXY7CiAJc3RydWN0IHR3OTkxMF92aWRlb19pbmZvCSppbmZvOwogCWNvbnN0IHN0cnVjdCB0dzk5MTBfc2NhbGVfY3RybAkqc2NhbGU7CisJdjRsMl9zdGRfaWQJCQlub3JtOwogCXUzMgkJCQlyZXZpc2lvbjsKIH07CiAKQEAgLTMyOSwxMSArMzI0LDYgQEAKIAl9LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0dzk5MTBfaHN5bmNfY3RybCB0dzk5MTBfaHN5bmNfY3RybCA9IHsKLQkuc3RhcnQgPSAweDAyNjAsCi0JLmVuZCAgID0gMHgwMzAwLAotfTsKLQogLyoKICAqIGdlbmVyYWwgZnVuY3Rpb24KICAqLwpAQCAtMzc4LDIxICszNjgsMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHR3OTkxMF9zZXRfaHN5bmMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgdHc5OTEwX2hzeW5jX2N0cmwgKmhzeW5jKQorc3RhdGljIGludCB0dzk5MTBfc2V0X2hzeW5jKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gdG9fdHc5OTEwKGNsaWVudCk7CiAJaW50IHJldDsKIAogCS8qIGJpdCAxMCAtIDMgKi8KIAlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgSFNCRUdJTiwKLQkJCQkJKGhzeW5jLT5zdGFydCAmIDB4MDdGOCkgPj4gMyk7CisJCQkJCShIU1lOQ19TVEFSVCAmIDB4MDdGOCkgPj4gMyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAkvKiBiaXQgMTAgLSAzICovCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEhTRU5ELAotCQkJCQkoaHN5bmMtPmVuZCAmIDB4MDdGOCkgPj4gMyk7CisJCQkJCShIU1lOQ19FTkQgJiAweDA3RjgpID4+IDMpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC00MDAsOCArMzg5LDggQEAKIAkvKiBiaXQgMiAtIDAgKi8KIAlpZiAoMSA9PSBwcml2LT5yZXZpc2lvbikKIAkJcmV0ID0gdHc5OTEwX21hc2tfc2V0KGNsaWVudCwgSFNMT1dDVEwsIDB4NzcsCi0JCQkJICAgICAgKGhzeW5jLT5zdGFydCAmIDB4MDAwNykgPDwgNCB8Ci0JCQkJICAgICAgKGhzeW5jLT5lbmQgICAmIDB4MDAwNykpOworCQkJCSAgICAgIChIU1lOQ19TVEFSVCAmIDB4MDAwNykgPDwgNCB8CisJCQkJICAgICAgKEhTWU5DX0VORCAgICYgMHgwMDA3KSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDMzLDEyICs0MjIsMTEgQEAKIAlyZXR1cm4gdHc5OTEwX21hc2tfc2V0KGNsaWVudCwgQUNOVEwyLCBBQ05UTDJfUEROX01BU0ssIGFjbnRsMik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwqCi10dzk5MTBfc2VsZWN0X25vcm0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHUzMiB3aWR0aCwgdTMyIGhlaWdodCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwgKnR3OTkxMF9zZWxlY3Rfbm9ybSh2NGwyX3N0ZF9pZCBub3JtLAorCQkJCQkJCSAgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KQogewogCWNvbnN0IHN0cnVjdCB0dzk5MTBfc2NhbGVfY3RybCAqc2NhbGU7CiAJY29uc3Qgc3RydWN0IHR3OTkxMF9zY2FsZV9jdHJsICpyZXQgPSBOVUxMOwotCXY0bDJfc3RkX2lkIG5vcm0gPSBpY2QtPnZkZXYtPmN1cnJlbnRfbm9ybTsKIAlfX3UzMiBkaWZmID0gMHhmZmZmZmZmZiwgdG1wOwogCWludCBzaXplLCBpOwogCkBAIC00NjUsNyArNDUzLDcgQEAKIH0KIAogLyoKLSAqIHNvY19jYW1lcmFfb3BzIGZ1bmN0aW9uCisgKiBzdWJkZXZpY2Ugb3BlcmF0aW9ucwogICovCiBzdGF0aWMgaW50IHR3OTkxMF9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKQogewpAQCAtNTA3LDQ5ICs0OTUsMjcgQEAKIAlyZXR1cm4gdHc5OTEwX3Bvd2VyKGNsaWVudCwgZW5hYmxlKTsKIH0KIAotc3RhdGljIGludCB0dzk5MTBfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGludCB0dzk5MTBfZ19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKm5vcm0pCiB7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXU4IHZhbCA9IFZTU0xfVlZBTElEIHwgSFNTTF9EVkFMSUQ7Ci0KLQkvKgotCSAqIHNldCBPVVRDVFIxCi0JICoKLQkgKiBXZSB1c2UgVlZBTElEIGFuZCBEVkFMSUQgc2lnbmFscyB0byBjb250cm9sIFZTWU5DIGFuZCBIU1lOQwotCSAqIG91dHB1dHMsIGluIHRoaXMgbW9kZSB0aGVpciBwb2xhcml0eSBpcyBpbnZlcnRlZC4KLQkgKi8KLQlpZiAoZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKQotCQl2YWwgfD0gSFNQX0hJOwotCi0JaWYgKGZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykKLQkJdmFsIHw9IFZTUF9ISTsKLQotCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgT1VUQ1RSMSwgdmFsKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgdHc5OTEwX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7CiAJc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gdG9fdHc5OTEwKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8IFNPQ0FNX01BU1RFUiB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XICB8IFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cgIHwKLQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8IHByaXYtPmluZm8tPmJ1c3dpZHRoOwogCi0JcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOworCSpub3JtID0gcHJpdi0+bm9ybTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHR3OTkxMF9zX3N0ZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBub3JtKQogewotCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSB0b190dzk5MTAoY2xpZW50KTsKIAotCWlmIChub3JtICYgKFY0TDJfU1REX05UU0MgfCBWNEwyX1NURF9QQUwpKQotCQlyZXQgPSAwOworCWlmICghKG5vcm0gJiAoVjRMMl9TVERfTlRTQyB8IFY0TDJfU1REX1BBTCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiByZXQ7CisJcHJpdi0+bm9ybSA9IG5vcm07CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0dzk5MTBfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCkBAIC02MDAsMTkgKzU2NiwxNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgdHc5OTEwX3NfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQorc3RhdGljIGludCB0dzk5MTBfc2V0X2ZyYW1lKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiAqd2lkdGgsIHUzMiAqaGVpZ2h0KQogewotCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmYS0+YzsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gdG9fdHc5OTEwKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWludCAgICAgICAgICAgICAgICAgcmV0ICA9IC1FSU5WQUw7Ci0JdTggICAgICAgICAgICAgICAgICB2YWw7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdTggdmFsOwogCiAJLyoKIAkgKiBzZWxlY3Qgc3VpdGFibGUgbm9ybQogCSAqLwotCXByaXYtPnNjYWxlID0gdHc5OTEwX3NlbGVjdF9ub3JtKGljZCwgcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7CisJcHJpdi0+c2NhbGUgPSB0dzk5MTBfc2VsZWN0X25vcm0ocHJpdi0+bm9ybSwgKndpZHRoLCAqaGVpZ2h0KTsKIAlpZiAoIXByaXYtPnNjYWxlKQogCQlnb3RvIHR3OTkxMF9zZXRfZm10X2Vycm9yOwogCkBAIC02NzAsMTQgKzYzNCwxMiBAQAogCS8qCiAJICogc2V0IGhzeW5jCiAJICovCi0JcmV0ID0gdHc5OTEwX3NldF9oc3luYyhjbGllbnQsICZ0dzk5MTBfaHN5bmNfY3RybCk7CisJcmV0ID0gdHc5OTEwX3NldF9oc3luYyhjbGllbnQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIHR3OTkxMF9zZXRfZm10X2Vycm9yOwogCi0JcmVjdC0+d2lkdGggPSBwcml2LT5zY2FsZS0+d2lkdGg7Ci0JcmVjdC0+aGVpZ2h0ID0gcHJpdi0+c2NhbGUtPmhlaWdodDsKLQlyZWN0LT5sZWZ0ID0gMDsKLQlyZWN0LT50b3AgPSAwOworCSp3aWR0aCA9IHByaXYtPnNjYWxlLT53aWR0aDsKKwkqaGVpZ2h0ID0gcHJpdi0+c2NhbGUtPmhlaWdodDsKIAogCXJldHVybiByZXQ7CiAKQEAgLTY5NCwyNSArNjU2LDE1IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IHRvX3R3OTkxMChjbGllbnQpOwogCi0JaWYgKCFwcml2LT5zY2FsZSkgewotCQlpbnQgcmV0OwotCQlzdHJ1Y3QgdjRsMl9jcm9wIGNyb3AgPSB7Ci0JCQkuYyA9IHsKLQkJCQkubGVmdAk9IDAsCi0JCQkJLnRvcAk9IDAsCi0JCQkJLndpZHRoCT0gNjQwLAotCQkJCS5oZWlnaHQJPSA0ODAsCi0JCQl9LAotCQl9OwotCQlyZXQgPSB0dzk5MTBfc19jcm9wKHNkLCAmY3JvcCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlhLT5jLmxlZnQJPSAwOwogCWEtPmMudG9wCT0gMDsKLQlhLT5jLndpZHRoCT0gcHJpdi0+c2NhbGUtPndpZHRoOwotCWEtPmMuaGVpZ2h0CT0gcHJpdi0+c2NhbGUtPmhlaWdodDsKKwlpZiAocHJpdi0+bm9ybSAmIFY0TDJfU1REX05UU0MpIHsKKwkJYS0+Yy53aWR0aAk9IDY0MDsKKwkJYS0+Yy5oZWlnaHQJPSA0ODA7CisJfSBlbHNlIHsKKwkJYS0+Yy53aWR0aAk9IDc2ODsKKwkJYS0+Yy5oZWlnaHQJPSA1NzY7CisJfQogCWEtPnR5cGUJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwogCiAJcmV0dXJuIDA7CkBAIC03MjAsMTQgKzY3MiwxOSBAQAogCiBzdGF0aWMgaW50IHR3OTkxMF9jcm9wY2FwKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmEpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IHRvX3R3OTkxMChjbGllbnQpOworCiAJYS0+Ym91bmRzLmxlZnQJCQk9IDA7CiAJYS0+Ym91bmRzLnRvcAkJCT0gMDsKLQlhLT5ib3VuZHMud2lkdGgJCQk9IDc2ODsKLQlhLT5ib3VuZHMuaGVpZ2h0CQk9IDU3NjsKLQlhLT5kZWZyZWN0LmxlZnQJCQk9IDA7Ci0JYS0+ZGVmcmVjdC50b3AJCQk9IDA7Ci0JYS0+ZGVmcmVjdC53aWR0aAkJPSA2NDA7Ci0JYS0+ZGVmcmVjdC5oZWlnaHQJCT0gNDgwOworCWlmIChwcml2LT5ub3JtICYgVjRMMl9TVERfTlRTQykgeworCQlhLT5ib3VuZHMud2lkdGgJCT0gNjQwOworCQlhLT5ib3VuZHMuaGVpZ2h0CT0gNDgwOworCX0gZWxzZSB7CisJCWEtPmJvdW5kcy53aWR0aAkJPSA3Njg7CisJCWEtPmJvdW5kcy5oZWlnaHQJPSA1NzY7CisJfQorCWEtPmRlZnJlY3QJCQk9IGEtPmJvdW5kczsKIAlhLT50eXBlCQkJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwogCWEtPnBpeGVsYXNwZWN0Lm51bWVyYXRvcgk9IDE7CiAJYS0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IJPSAxOwpAQCAtNzQzLDE1ICs3MDAsOCBAQAogCiAJaWYgKCFwcml2LT5zY2FsZSkgewogCQlpbnQgcmV0OwotCQlzdHJ1Y3QgdjRsMl9jcm9wIGNyb3AgPSB7Ci0JCQkuYyA9IHsKLQkJCQkubGVmdAk9IDAsCi0JCQkJLnRvcAk9IDAsCi0JCQkJLndpZHRoCT0gNjQwLAotCQkJCS5oZWlnaHQJPSA0ODAsCi0JCQl9LAotCQl9OwotCQlyZXQgPSB0dzk5MTBfc19jcm9wKHNkLCAmY3JvcCk7CisJCXUzMiB3aWR0aCA9IDY0MCwgaGVpZ2h0ID0gNDgwOworCQlyZXQgPSB0dzk5MTBfc2V0X2ZyYW1lKHNkLCAmd2lkdGgsICZoZWlnaHQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtNzY4LDE3ICs3MTgsNyBAQAogc3RhdGljIGludCB0dzk5MTBfc19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSB0b190dzk5MTAoY2xpZW50KTsKLQkvKiBTZWUgdHc5OTEwX3NfY3JvcCgpIC0gbm8gcHJvcGVyIGNyb3BwaW5nIHN1cHBvcnQgKi8KLQlzdHJ1Y3QgdjRsMl9jcm9wIGEgPSB7Ci0JCS5jID0gewotCQkJLmxlZnQJPSAwLAotCQkJLnRvcAk9IDAsCi0JCQkud2lkdGgJPSBtZi0+d2lkdGgsCi0JCQkuaGVpZ2h0CT0gbWYtPmhlaWdodCwKLQkJfSwKLQl9OworCXUzMiB3aWR0aCA9IG1mLT53aWR0aCwgaGVpZ2h0ID0gbWYtPmhlaWdodDsKIAlpbnQgcmV0OwogCiAJV0FSTl9PTihtZi0+ZmllbGQgIT0gVjRMMl9GSUVMRF9BTlkgJiYKQEAgLTc5MiwxMCArNzMyLDEwIEBACiAKIAltZi0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOwogCi0JcmV0ID0gdHc5OTEwX3NfY3JvcChzZCwgJmEpOworCXJldCA9IHR3OTkxMF9zZXRfZnJhbWUoc2QsICZ3aWR0aCwgJmhlaWdodCk7CiAJaWYgKCFyZXQpIHsKLQkJbWYtPndpZHRoCT0gcHJpdi0+c2NhbGUtPndpZHRoOwotCQltZi0+aGVpZ2h0CT0gcHJpdi0+c2NhbGUtPmhlaWdodDsKKwkJbWYtPndpZHRoCT0gd2lkdGg7CisJCW1mLT5oZWlnaHQJPSBoZWlnaHQ7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC04MDQsNyArNzQ0LDcgQEAKIAkJCSAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSB0b190dzk5MTAoY2xpZW50KTsKIAljb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwgKnNjYWxlOwogCiAJaWYgKFY0TDJfRklFTERfQU5ZID09IG1mLT5maWVsZCkgewpAQCAtODIwLDcgKzc2MCw3IEBACiAJLyoKIAkgKiBzZWxlY3Qgc3VpdGFibGUgbm9ybQogCSAqLwotCXNjYWxlID0gdHc5OTEwX3NlbGVjdF9ub3JtKGljZCwgbWYtPndpZHRoLCBtZi0+aGVpZ2h0KTsKKwlzY2FsZSA9IHR3OTkxMF9zZWxlY3Rfbm9ybShwcml2LT5ub3JtLCBtZi0+d2lkdGgsIG1mLT5oZWlnaHQpOwogCWlmICghc2NhbGUpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC04MzAsMTYgKzc3MCwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHR3OTkxMF92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IHR3OTkxMF92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IHRvX3R3OTkxMChjbGllbnQpOwogCXMzMiBpZDsKIAotCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCi0JQlVHX09OKCFpY2QtPnBhcmVudCB8fAotCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKLQogCS8qCiAJICogdHc5OTEwIG9ubHkgdXNlIDggb3IgMTYgYml0IGJ1cyB3aWR0aAogCSAqLwpAQCAtODY4LDIwICs4MDMsMTUgQEAKIAlkZXZfaW5mbygmY2xpZW50LT5kZXYsCiAJCSAidHc5OTEwIFByb2R1Y3QgSUQgJTB4OiUweFxuIiwgaWQsIHByaXYtPnJldmlzaW9uKTsKIAotCWljZC0+dmRldi0+dHZub3JtcyAgICAgID0gVjRMMl9TVERfTlRTQyB8IFY0TDJfU1REX1BBTDsKLQlpY2QtPnZkZXYtPmN1cnJlbnRfbm9ybSA9IFY0TDJfU1REX05UU0M7CisJcHJpdi0+bm9ybSA9IFY0TDJfU1REX05UU0M7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyB0dzk5MTBfb3BzID0gewotCS5zZXRfYnVzX3BhcmFtCQk9IHR3OTkxMF9zZXRfYnVzX3BhcmFtLAotCS5xdWVyeV9idXNfcGFyYW0JPSB0dzk5MTBfcXVlcnlfYnVzX3BhcmFtLAotfTsKLQogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyB0dzk5MTBfc3ViZGV2X2NvcmVfb3BzID0gewogCS5nX2NoaXBfaWRlbnQJPSB0dzk5MTBfZ19jaGlwX2lkZW50LAogCS5zX3N0ZAkJPSB0dzk5MTBfc19zdGQsCisJLmdfc3RkCQk9IHR3OTkxMF9nX3N0ZCwKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiAJLmdfcmVnaXN0ZXIJPSB0dzk5MTBfZ19yZWdpc3RlciwKIAkuc19yZWdpc3Rlcgk9IHR3OTkxMF9zX3JlZ2lzdGVyLApAQCAtODk4LDYgKzgyOCw0NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHR3OTkxMF9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfTUFTVEVSIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cgfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyB8CisJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKwljZmctPmZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dzk5MTBfc19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCWNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKwl1OCB2YWwgPSBWU1NMX1ZWQUxJRCB8IEhTU0xfRFZBTElEOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKTsKKworCS8qCisJICogc2V0IE9VVENUUjEKKwkgKgorCSAqIFdlIHVzZSBWVkFMSUQgYW5kIERWQUxJRCBzaWduYWxzIHRvIGNvbnRyb2wgVlNZTkMgYW5kIEhTWU5DCisJICogb3V0cHV0cywgaW4gdGhpcyBtb2RlIHRoZWlyIHBvbGFyaXR5IGlzIGludmVydGVkLgorCSAqLworCWlmIChmbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKQorCQl2YWwgfD0gSFNQX0hJOworCisJaWYgKGZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpCisJCXZhbCB8PSBWU1BfSEk7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE9VVENUUjEsIHZhbCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHR3OTkxMF9zdWJkZXZfdmlkZW9fb3BzID0gewogCS5zX3N0cmVhbQk9IHR3OTkxMF9zX3N0cmVhbSwKIAkuZ19tYnVzX2ZtdAk9IHR3OTkxMF9nX2ZtdCwKQEAgLTkwNSw4ICs4NzQsOSBAQAogCS50cnlfbWJ1c19mbXQJPSB0dzk5MTBfdHJ5X2ZtdCwKIAkuY3JvcGNhcAk9IHR3OTkxMF9jcm9wY2FwLAogCS5nX2Nyb3AJCT0gdHc5OTEwX2dfY3JvcCwKLQkuc19jcm9wCQk9IHR3OTkxMF9zX2Nyb3AsCiAJLmVudW1fbWJ1c19mbXQJPSB0dzk5MTBfZW51bV9mbXQsCisJLmdfbWJ1c19jb25maWcJPSB0dzk5MTBfZ19tYnVzX2NvbmZpZywKKwkuc19tYnVzX2NvbmZpZwk9IHR3OTkxMF9zX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdHc5OTEwX3N1YmRldl9vcHMgPSB7CkBAIC05MjIsMjMgKzg5MiwxOCBAQAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIAogewotCXN0cnVjdCB0dzk5MTBfcHJpdiAgICAgICAgICAgICAqcHJpdjsKLQlzdHJ1Y3QgdHc5OTEwX3ZpZGVvX2luZm8gICAgICAgKmluZm87Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICAgICAgICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBpMmNfYWRhcHRlciAgICAgICAgICAgICAqYWRhcHRlciA9CisJc3RydWN0IHR3OTkxMF9wcml2CQkqcHJpdjsKKwlzdHJ1Y3QgdHc5OTEwX3ZpZGVvX2luZm8JKmluZm87CisJc3RydWN0IGkyY19hZGFwdGVyCQkqYWRhcHRlciA9CiAJCXRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAgICAgICAgICppY2w7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQ7CisJc3RydWN0IHNvY19jYW1lcmFfbGluawkJKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKwlpbnQJCQkJcmV0OwogCi0JaWYgKCFpY2QpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJUVzk5MTA6IG1pc3Npbmcgc29jLWNhbWVyYSBkYXRhIVxuIik7CisJaWYgKCFpY2wgfHwgIWljbC0+cHJpdikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlRXOTkxMDogbWlzc2luZyBwbGF0Zm9ybSBkYXRhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCWlmICghaWNsIHx8ICFpY2wtPnByaXYpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaW5mbyA9IGljbC0+cHJpdjsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgewpAQCAtOTU2LDE0ICs5MjEsOSBAQAogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgY2xpZW50LCAmdHc5OTEwX3N1YmRldl9vcHMpOwogCi0JaWNkLT5vcHMgICAgID0gJnR3OTkxMF9vcHM7Ci0JaWNkLT5pZmFjZSAgID0gaWNsLT5idXNfaWQ7Ci0KLQlyZXQgPSB0dzk5MTBfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOwotCWlmIChyZXQpIHsKLQkJaWNkLT5vcHMgPSBOVUxMOworCXJldCA9IHR3OTkxMF92aWRlb19wcm9iZShjbGllbnQpOworCWlmIChyZXQpCiAJCWtmcmVlKHByaXYpOwotCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC05NzEsOSArOTMxLDcgQEAKIHN0YXRpYyBpbnQgdHc5OTEwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IHRvX3R3OTkxMChjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCWljZC0+b3BzID0gTlVMTDsKIAlrZnJlZShwcml2KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vTWFrZWZpbGUKaW5kZXggMzM4NzE4Ny4uYWVhMWUzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vTWFrZWZpbGUKQEAgLTIsNSArMiw1IEBACiAKIG9iai0kKENPTkZJR19WSURFT19VU0JWSVNJT04pICs9IHVzYnZpc2lvbi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1jYXJkcy5jCmluZGV4IDhmNTI2NjEuLjMxMDNkMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1jYXJkcy5jCkBAIC0yNCw2ICsyNCw3IEBACiAKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAjaW5jbHVkZSAidXNidmlzaW9uLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYwppbmRleCAxMGMyMzY0Li4yNTRkMzI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMKQEAgLTEwMTYsNyArMTAxNiw4IEBACiAKIAltZW51X2luZm8gPSAmbWFwcGluZy0+bWVudV9pbmZvW3F1ZXJ5X21lbnUtPmluZGV4XTsKIAotCWlmIChjdHJsLT5pbmZvLmZsYWdzICYgVVZDX0NUUkxfRkxBR19HRVRfUkVTKSB7CisJaWYgKG1hcHBpbmctPmRhdGFfdHlwZSA9PSBVVkNfQ1RSTF9EQVRBX1RZUEVfQklUTUFTSyAmJgorCSAgICAoY3RybC0+aW5mby5mbGFncyAmIFVWQ19DVFJMX0ZMQUdfR0VUX1JFUykpIHsKIAkJczMyIGJpdG1hcDsKIAogCQlpZiAoIWN0cmwtPmNhY2hlZCkgewpAQCAtMTIyNSw3ICsxMjI2LDggQEAKIAkJLyogVmFsaWQgbWVudSBpbmRpY2VzIGFyZSByZXBvcnRlZCBieSB0aGUgR0VUX1JFUyByZXF1ZXN0IGZvcgogCQkgKiBVVkMgY29udHJvbHMgdGhhdCBzdXBwb3J0IGl0LgogCQkgKi8KLQkJaWYgKGN0cmwtPmluZm8uZmxhZ3MgJiBVVkNfQ1RSTF9GTEFHX0dFVF9SRVMpIHsKKwkJaWYgKG1hcHBpbmctPmRhdGFfdHlwZSA9PSBVVkNfQ1RSTF9EQVRBX1RZUEVfQklUTUFTSyAmJgorCQkgICAgKGN0cmwtPmluZm8uZmxhZ3MgJiBVVkNfQ1RSTF9GTEFHX0dFVF9SRVMpKSB7CiAJCQlpZiAoIWN0cmwtPmNhY2hlZCkgewogCQkJCXJldCA9IHV2Y19jdHJsX3BvcHVsYXRlX2NhY2hlKGNoYWluLCBjdHJsKTsKIAkJCQlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYwppbmRleCBlNDEwMGIxLi42NTZkNGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2RyaXZlci5jCkBAIC0xMTQsNiArMTE0LDExIEBACiAJCS5ndWlkCQk9IFVWQ19HVUlEX0ZPUk1BVF9SR0JQLAogCQkuZmNjCQk9IFY0TDJfUElYX0ZNVF9SR0I1NjUsCiAJfSwKKwl7CisJCS5uYW1lCQk9ICJILjI2NCIsCisJCS5ndWlkCQk9IFVWQ19HVUlEX0ZPUk1BVF9IMjY0LAorCQkuZmNjCQk9IFY0TDJfUElYX0ZNVF9IMjY0LAorCX0sCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIzMzEsNiArMjMzNiwxNCBAQAogCSAgLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDEsCiAJICAuYkludGVyZmFjZVByb3RvY29sCT0gMCwKIAkgIC5kcml2ZXJfaW5mbwkJPSBVVkNfUVVJUktfUFJPQkVfREVGIH0sCisJLyogVGhlIEltYWdpbmcgU291cmNlIFVTQiBDQ0QgY2FtZXJhcyAqLworCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCisJCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLAorCSAgLmlkVmVuZG9yCQk9IDB4MTk5ZSwKKwkgIC5pZFByb2R1Y3QJCT0gMHg4MTAyLAorCSAgLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19WRU5ET1JfU1BFQywKKwkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAorCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAgfSwKIAkvKiBCb2RlbGluIFByb1Njb3BlSFIgKi8KIAl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQogCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZfSEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jCmluZGV4IGVhNzFkNWYuLmRhZGYxMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYwpAQCAtMzIsNyArMzIsNyBAQAogICogVVZDIGlvY3RscwogICovCiBzdGF0aWMgaW50IHV2Y19pb2N0bF9jdHJsX21hcChzdHJ1Y3QgdXZjX3ZpZGVvX2NoYWluICpjaGFpbiwKLQlzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfbWFwcGluZyAqeG1hcCwgaW50IG9sZCkKKwlzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfbWFwcGluZyAqeG1hcCkKIHsKIAlzdHJ1Y3QgdXZjX2NvbnRyb2xfbWFwcGluZyAqbWFwOwogCXVuc2lnbmVkIGludCBzaXplOwpAQCAtNTgsMTMgKzU4LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX01FTlU6Ci0JCWlmIChvbGQpIHsKLQkJCXV2Y190cmFjZShVVkNfVFJBQ0VfQ09OVFJPTCwgIlY0TDJfQ1RSTF9UWVBFX01FTlUgbm90ICIKLQkJCQkgICJzdXBwb3J0ZWQgZm9yIFVWQ0lPQ19DVFJMX01BUF9PTEQuXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQogCQlzaXplID0geG1hcC0+bWVudV9jb3VudCAqIHNpemVvZigqbWFwLT5tZW51X2luZm8pOwogCQltYXAtPm1lbnVfaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChtYXAtPm1lbnVfaW5mbyA9PSBOVUxMKSB7CkBAIC01MzgsMjAgKzUzMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHV2Y192NGwyX2lvY3RsX3dhcm4odm9pZCkKLXsKLQlzdGF0aWMgaW50IHdhcm5lZDsKLQotCWlmICh3YXJuZWQpCi0JCXJldHVybjsKLQotCXV2Y19wcmludGsoS0VSTl9JTkZPLCAiRGVwcmVjYXRlZCBVVkNJT0NfQ1RSTF97QURELE1BUF9PTEQsR0VULFNFVH0gIgotCQkgICAiaW9jdGxzIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjYuNDIuXG4iKTsKLQl1dmNfcHJpbnRrKEtFUk5fSU5GTywgIlNlZSBodHRwOi8vd3d3LmlkZWFzb25ib2FyZC5vcmcvdXZjL3VwZ3JhZGUvICIKLQkJICAgImZvciB1cGdyYWRlIGluc3RydWN0aW9ucy5cbiIpOwotCXdhcm5lZCA9IDE7Ci19Ci0KIHN0YXRpYyBsb25nIHV2Y192NGwyX2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CkBAIC0xMDMyLDM3ICsxMDExLDggQEAKIAkJdXZjX3RyYWNlKFVWQ19UUkFDRV9JT0NUTCwgIlVuc3VwcG9ydGVkIGlvY3RsIDB4JTA4eFxuIiwgY21kKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBEeW5hbWljIGNvbnRyb2xzLiBVVkNJT0NfQ1RSTF9BREQsIFVWQ0lPQ19DVFJMX01BUF9PTEQsCi0JICogVVZDSU9DX0NUUkxfR0VUIGFuZCBVVkNJT0NfQ1RSTF9TRVQgYXJlIGRlcHJlY2F0ZWQgYW5kIHNjaGVkdWxlZCBmb3IKLQkgKiByZW1vdmFsIGluIDIuNi40Mi4KLQkgKi8KLQljYXNlIF9fVVZDSU9DX0NUUkxfQUREOgotCQl1dmNfdjRsMl9pb2N0bF93YXJuKCk7Ci0JCXJldHVybiAtRUVYSVNUOwotCi0JY2FzZSBfX1VWQ0lPQ19DVFJMX01BUF9PTEQ6Ci0JCXV2Y192NGwyX2lvY3RsX3dhcm4oKTsKLQljYXNlIF9fVVZDSU9DX0NUUkxfTUFQOgogCWNhc2UgVVZDSU9DX0NUUkxfTUFQOgotCQlyZXR1cm4gdXZjX2lvY3RsX2N0cmxfbWFwKGNoYWluLCBhcmcsCi0JCQkJCSAgY21kID09IF9fVVZDSU9DX0NUUkxfTUFQX09MRCk7Ci0KLQljYXNlIF9fVVZDSU9DX0NUUkxfR0VUOgotCWNhc2UgX19VVkNJT0NfQ1RSTF9TRVQ6Ci0JewotCQlzdHJ1Y3QgdXZjX3h1X2NvbnRyb2wgKnhjdHJsID0gYXJnOwotCQlzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfcXVlcnkgeHFyeSA9IHsKLQkJCS51bml0CQk9IHhjdHJsLT51bml0LAotCQkJLnNlbGVjdG9yCT0geGN0cmwtPnNlbGVjdG9yLAotCQkJLnF1ZXJ5CQk9IGNtZCA9PSBfX1VWQ0lPQ19DVFJMX0dFVAotCQkJCQk/IFVWQ19HRVRfQ1VSIDogVVZDX1NFVF9DVVIsCi0JCQkuc2l6ZQkJPSB4Y3RybC0+c2l6ZSwKLQkJCS5kYXRhCQk9IHhjdHJsLT5kYXRhLAotCQl9OwotCi0JCXV2Y192NGwyX2lvY3RsX3dhcm4oKTsKLQkJcmV0dXJuIHV2Y194dV9jdHJsX3F1ZXJ5KGNoYWluLCAmeHFyeSk7Ci0JfQorCQlyZXR1cm4gdXZjX2lvY3RsX2N0cmxfbWFwKGNoYWluLCBhcmcpOwogCiAJY2FzZSBVVkNJT0NfQ1RSTF9RVUVSWToKIAkJcmV0dXJuIHV2Y194dV9jdHJsX3F1ZXJ5KGNoYWluLCBhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYwppbmRleCBmZmQxMTU4Li5iMDE1ZThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYwpAQCAtNzkwLDggKzc5MCwxMiBAQAogCiAJZm9yIChpID0gMDsgaSA8IFVWQ19VUkJTOyArK2kpIHsKIAkJaWYgKHN0cmVhbS0+dXJiX2J1ZmZlcltpXSkgeworI2lmbmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCiAJCQl1c2JfZnJlZV9jb2hlcmVudChzdHJlYW0tPmRldi0+dWRldiwgc3RyZWFtLT51cmJfc2l6ZSwKIAkJCQlzdHJlYW0tPnVyYl9idWZmZXJbaV0sIHN0cmVhbS0+dXJiX2RtYVtpXSk7CisjZWxzZQorCQkJa2ZyZWUoc3RyZWFtLT51cmJfYnVmZmVyW2ldKTsKKyNlbmRpZgogCQkJc3RyZWFtLT51cmJfYnVmZmVyW2ldID0gTlVMTDsKIAkJfQogCX0KQEAgLTgzMSw5ICs4MzUsMTQgQEAKIAlmb3IgKDsgbnBhY2tldHMgPiAxOyBucGFja2V0cyAvPSAyKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBVVkNfVVJCUzsgKytpKSB7CiAJCQlzdHJlYW0tPnVyYl9zaXplID0gcHNpemUgKiBucGFja2V0czsKKyNpZm5kZWYgQ09ORklHX0RNQV9OT05DT0hFUkVOVAogCQkJc3RyZWFtLT51cmJfYnVmZmVyW2ldID0gdXNiX2FsbG9jX2NvaGVyZW50KAogCQkJCXN0cmVhbS0+ZGV2LT51ZGV2LCBzdHJlYW0tPnVyYl9zaXplLAogCQkJCWdmcF9mbGFncyB8IF9fR0ZQX05PV0FSTiwgJnN0cmVhbS0+dXJiX2RtYVtpXSk7CisjZWxzZQorCQkJc3RyZWFtLT51cmJfYnVmZmVyW2ldID0KKwkJCSAgICBrbWFsbG9jKHN0cmVhbS0+dXJiX3NpemUsIGdmcF9mbGFncyB8IF9fR0ZQX05PV0FSTik7CisjZW5kaWYKIAkJCWlmICghc3RyZWFtLT51cmJfYnVmZmVyW2ldKSB7CiAJCQkJdXZjX2ZyZWVfdXJiX2J1ZmZlcnMoc3RyZWFtKTsKIAkJCQlicmVhazsKQEAgLTkwOCwxMCArOTE3LDE0IEBACiAJCXVyYi0+Y29udGV4dCA9IHN0cmVhbTsKIAkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHN0cmVhbS0+ZGV2LT51ZGV2LAogCQkJCWVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOworI2lmbmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCiAJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJdXJiLT50cmFuc2Zlcl9kbWEgPSBzdHJlYW0tPnVyYl9kbWFbaV07CisjZWxzZQorCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworI2VuZGlmCiAJCXVyYi0+aW50ZXJ2YWwgPSBlcC0+ZGVzYy5iSW50ZXJ2YWw7CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gc3RyZWFtLT51cmJfYnVmZmVyW2ldOwotCQl1cmItPnRyYW5zZmVyX2RtYSA9IHN0cmVhbS0+dXJiX2RtYVtpXTsKIAkJdXJiLT5jb21wbGV0ZSA9IHV2Y192aWRlb19jb21wbGV0ZTsKIAkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IG5wYWNrZXRzOwogCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBzaXplOwpAQCAtOTY5LDggKzk4MiwxMCBAQAogCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHN0cmVhbS0+ZGV2LT51ZGV2LCBwaXBlLAogCQkJc3RyZWFtLT51cmJfYnVmZmVyW2ldLCBzaXplLCB1dmNfdmlkZW9fY29tcGxldGUsCiAJCQlzdHJlYW0pOworI2lmbmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCiAJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAkJdXJiLT50cmFuc2Zlcl9kbWEgPSBzdHJlYW0tPnVyYl9kbWFbaV07CisjZW5kaWYKIAogCQlzdHJlYW0tPnVyYltpXSA9IHVyYjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjdmlkZW8uaAppbmRleCBjYmRkNDliLi40YzEzOTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmgKQEAgLTEsMTA2ICsxLDE2IEBACiAjaWZuZGVmIF9VU0JfVklERU9fSF8KICNkZWZpbmUgX1VTQl9WSURFT19IXwogCisjaWZuZGVmIF9fS0VSTkVMX18KKyNlcnJvciAiVGhlIHV2Y3ZpZGVvLmggaGVhZGVyIGlzIGRlcHJlY2F0ZWQsIHVzZSBsaW51eC91dmN2aWRlby5oIGluc3RlYWQuIgorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotCi0jaWZuZGVmIF9fS0VSTkVMX18KLS8qCi0gKiBUaGlzIGhlYWRlciBwcm92aWRlcyBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgcHJpdmF0ZQotICogdXZjdmlkZW8gQVBJLiBUaGlzIEFQSSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMi42LjQyLgotICogQXBwbGljYXRpb25zIHNob3VsZCBiZSByZWNvbXBpbGVkIGFnYWluc3QgdGhlIHB1YmxpYyBsaW51eC91dmN2aWRlby5oIGhlYWRlci4KLSAqLwotI3dhcm4gIlRoZSB1dmN2aWRlby5oIGhlYWRlciBpcyBkZXByZWNhdGVkLCB1c2UgbGludXgvdXZjdmlkZW8uaCBpbnN0ZWFkLiIKLQotLyoKLSAqIER5bmFtaWMgY29udHJvbHMKLSAqLwotCi0vKiBEYXRhIHR5cGVzIGZvciBVVkMgY29udHJvbCBkYXRhICovCi0jZGVmaW5lIFVWQ19DVFJMX0RBVEFfVFlQRV9SQVcJCTAKLSNkZWZpbmUgVVZDX0NUUkxfREFUQV9UWVBFX1NJR05FRAkxCi0jZGVmaW5lIFVWQ19DVFJMX0RBVEFfVFlQRV9VTlNJR05FRAkyCi0jZGVmaW5lIFVWQ19DVFJMX0RBVEFfVFlQRV9CT09MRUFOCTMKLSNkZWZpbmUgVVZDX0NUUkxfREFUQV9UWVBFX0VOVU0JCTQKLSNkZWZpbmUgVVZDX0NUUkxfREFUQV9UWVBFX0JJVE1BU0sJNQotCi0vKiBDb250cm9sIGZsYWdzICovCi0jZGVmaW5lIFVWQ19DT05UUk9MX1NFVF9DVVIJKDEgPDwgMCkKLSNkZWZpbmUgVVZDX0NPTlRST0xfR0VUX0NVUgkoMSA8PCAxKQotI2RlZmluZSBVVkNfQ09OVFJPTF9HRVRfTUlOCSgxIDw8IDIpCi0jZGVmaW5lIFVWQ19DT05UUk9MX0dFVF9NQVgJKDEgPDwgMykKLSNkZWZpbmUgVVZDX0NPTlRST0xfR0VUX1JFUwkoMSA8PCA0KQotI2RlZmluZSBVVkNfQ09OVFJPTF9HRVRfREVGCSgxIDw8IDUpCi0jZGVmaW5lIFVWQ19DT05UUk9MX1JFU1RPUkUJKDEgPDwgNikKLSNkZWZpbmUgVVZDX0NPTlRST0xfQVVUT19VUERBVEUJKDEgPDwgNykKLQotI2RlZmluZSBVVkNfQ09OVFJPTF9HRVRfUkFOR0UJKFVWQ19DT05UUk9MX0dFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfTUlOIHwgXAotCQkJCSBVVkNfQ09OVFJPTF9HRVRfTUFYIHwgVVZDX0NPTlRST0xfR0VUX1JFUyB8IFwKLQkJCQkgVVZDX0NPTlRST0xfR0VUX0RFRikKLQotc3RydWN0IHV2Y19tZW51X2luZm8gewotCV9fdTMyIHZhbHVlOwotCV9fdTggbmFtZVszMl07Ci19OwotCi1zdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfbWFwcGluZyB7Ci0JX191MzIgaWQ7Ci0JX191OCBuYW1lWzMyXTsKLQlfX3U4IGVudGl0eVsxNl07Ci0JX191OCBzZWxlY3RvcjsKLQotCV9fdTggc2l6ZTsKLQlfX3U4IG9mZnNldDsKLQlfX3UzMiB2NGwyX3R5cGU7Ci0JX191MzIgZGF0YV90eXBlOwotCi0Jc3RydWN0IHV2Y19tZW51X2luZm8gX191c2VyICptZW51X2luZm87Ci0JX191MzIgbWVudV9jb3VudDsKLQotCV9fdTMyIHJlc2VydmVkWzRdOwotfTsKLQotI2VuZGlmCi0KLXN0cnVjdCB1dmNfeHVfY29udHJvbF9pbmZvIHsKLQlfX3U4IGVudGl0eVsxNl07Ci0JX191OCBpbmRleDsKLQlfX3U4IHNlbGVjdG9yOwotCV9fdTE2IHNpemU7Ci0JX191MzIgZmxhZ3M7Ci19OwotCi1zdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfbWFwcGluZ19vbGQgewotCV9fdTggcmVzZXJ2ZWRbNjRdOwotfTsKLQotc3RydWN0IHV2Y194dV9jb250cm9sIHsKLQlfX3U4IHVuaXQ7Ci0JX191OCBzZWxlY3RvcjsKLQlfX3UxNiBzaXplOwotCV9fdTggX191c2VyICpkYXRhOwotfTsKLQotI2lmbmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIFVWQ0lPQ19DVFJMX0FERAkJX0lPVygnVScsIDEsIHN0cnVjdCB1dmNfeHVfY29udHJvbF9pbmZvKQotI2RlZmluZSBVVkNJT0NfQ1RSTF9NQVBfT0xECV9JT1dSKCdVJywgMiwgc3RydWN0IHV2Y194dV9jb250cm9sX21hcHBpbmdfb2xkKQotI2RlZmluZSBVVkNJT0NfQ1RSTF9NQVAJCV9JT1dSKCdVJywgMiwgc3RydWN0IHV2Y194dV9jb250cm9sX21hcHBpbmcpCi0jZGVmaW5lIFVWQ0lPQ19DVFJMX0dFVAkJX0lPV1IoJ1UnLCAzLCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2wpCi0jZGVmaW5lIFVWQ0lPQ19DVFJMX1NFVAkJX0lPVygnVScsIDQsIHN0cnVjdCB1dmNfeHVfY29udHJvbCkKLSNlbHNlCi0jZGVmaW5lIF9fVVZDSU9DX0NUUkxfQURECV9JT1coJ1UnLCAxLCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfaW5mbykKLSNkZWZpbmUgX19VVkNJT0NfQ1RSTF9NQVBfT0xECV9JT1dSKCdVJywgMiwgc3RydWN0IHV2Y194dV9jb250cm9sX21hcHBpbmdfb2xkKQotI2RlZmluZSBfX1VWQ0lPQ19DVFJMX01BUAlfSU9XUignVScsIDIsIHN0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nKQotI2RlZmluZSBfX1VWQ0lPQ19DVFJMX0dFVAlfSU9XUignVScsIDMsIHN0cnVjdCB1dmNfeHVfY29udHJvbCkKLSNkZWZpbmUgX19VVkNJT0NfQ1RSTF9TRVQJX0lPVygnVScsIDQsIHN0cnVjdCB1dmNfeHVfY29udHJvbCkKLSNlbmRpZgotCi0jaWZkZWYgX19LRVJORUxfXwotCiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi92aWRlby5oPgogI2luY2x1ZGUgPGxpbnV4L3V2Y3ZpZGVvLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWEtZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KIApAQCAtMTc5LDYgKzg5LDEwIEBACiAJeyAnTScsICAnNCcsICAnMicsICAnMCcsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIFwKIAkgMHg4MCwgMHgwMCwgMHgwMCwgMHhhYSwgMHgwMCwgMHgzOCwgMHg5YiwgMHg3MX0KIAorI2RlZmluZSBVVkNfR1VJRF9GT1JNQVRfSDI2NCBcCisJeyAnSCcsICAnMicsICAnNicsICAnNCcsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIFwKKwkgMHg4MCwgMHgwMCwgMHgwMCwgMHhhYSwgMHgwMCwgMHgzOCwgMHg5YiwgMHg3MX0KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEcml2ZXIgc3BlY2lmaWMgY29uc3RhbnRzLgogICovCkBAIC02OTgsNiArNjEyLDQgQEAKIHZvaWQgdXZjX3ZpZGVvX2RlY29kZV9pc2lnaHQoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgdXZjX3N0cmVhbWluZyAqc3RyZWFtLAogCQlzdHJ1Y3QgdXZjX2J1ZmZlciAqYnVmKTsKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tcGF0LWlvY3RsMzIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jCmluZGV4IDYxOTc5YjcuLmM2ODUzMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jCkBAIC0xNTksMTEgKzE1OSwyNSBAQAogCX0gZm10OwogfTsKIAotc3RhdGljIGludCBnZXRfdjRsMl9mb3JtYXQzMihzdHJ1Y3QgdjRsMl9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMiBfX3VzZXIgKnVwKQorLyoqCisgKiBzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVyczMyIC0gVklESU9DX0NSRUFURV9CVUZTMzIgYXJndW1lbnQKKyAqIEBpbmRleDoJb24gcmV0dXJuLCBpbmRleCBvZiB0aGUgZmlyc3QgY3JlYXRlZCBidWZmZXIKKyAqIEBjb3VudDoJZW50cnk6IG51bWJlciBvZiByZXF1ZXN0ZWQgYnVmZmVycywKKyAqCQlyZXR1cm46IG51bWJlciBvZiBjcmVhdGVkIGJ1ZmZlcnMKKyAqIEBtZW1vcnk6CWJ1ZmZlciBtZW1vcnkgdHlwZQorICogQGZvcm1hdDoJZnJhbWUgZm9ybWF0LCBmb3Igd2hpY2ggYnVmZmVycyBhcmUgcmVxdWVzdGVkCisgKiBAcmVzZXJ2ZWQ6CWZ1dHVyZSBleHRlbnNpb25zCisgKi8KK3N0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzMzIgeworCV9fdTMyCQkJaW5kZXg7CisJX191MzIJCQljb3VudDsKKwllbnVtIHY0bDJfbWVtb3J5ICAgICAgICBtZW1vcnk7CisJc3RydWN0IHY0bDJfZm9ybWF0MzIJZm9ybWF0OworCV9fdTMyCQkJcmVzZXJ2ZWRbOF07Cit9OworCitzdGF0aWMgaW50IF9fZ2V0X3Y0bDJfZm9ybWF0MzIoc3RydWN0IHY0bDJfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfZm9ybWF0MzIgX191c2VyICp1cCkKIHsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQzMikpIHx8Ci0JCQlnZXRfdXNlcihrcC0+dHlwZSwgJnVwLT50eXBlKSkKLQkJCXJldHVybiAtRUZBVUxUOwogCXN3aXRjaCAoa3AtPnR5cGUpIHsKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgpAQCAtMTkyLDExICsyMDYsMjQgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcHV0X3Y0bDJfZm9ybWF0MzIoc3RydWN0IHY0bDJfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfZm9ybWF0MzIgX191c2VyICp1cCkKK3N0YXRpYyBpbnQgZ2V0X3Y0bDJfZm9ybWF0MzIoc3RydWN0IHY0bDJfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfZm9ybWF0MzIgX191c2VyICp1cCkKIHsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0MzIpKSB8fAotCQlwdXRfdXNlcihrcC0+dHlwZSwgJnVwLT50eXBlKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0MzIpKSB8fAorCQkJZ2V0X3VzZXIoa3AtPnR5cGUsICZ1cC0+dHlwZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gX19nZXRfdjRsMl9mb3JtYXQzMihrcCwgdXApOworfQorCitzdGF0aWMgaW50IGdldF92NGwyX2NyZWF0ZTMyKHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzICprcCwgc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMzMiBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzMzIpKSB8fAorCSAgICBjb3B5X2Zyb21fdXNlcihrcCwgdXAsIG9mZnNldG9mKHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzMzIsIGZvcm1hdC5mbXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBfX2dldF92NGwyX2Zvcm1hdDMyKCZrcC0+Zm9ybWF0LCAmdXAtPmZvcm1hdCk7Cit9CisKK3N0YXRpYyBpbnQgX19wdXRfdjRsMl9mb3JtYXQzMihzdHJ1Y3QgdjRsMl9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMiBfX3VzZXIgKnVwKQorewogCXN3aXRjaCAoa3AtPnR5cGUpIHsKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgpAQCAtMjI1LDYgKzI1MiwyMiBAQAogCX0KIH0KIAorc3RhdGljIGludCBwdXRfdjRsMl9mb3JtYXQzMihzdHJ1Y3QgdjRsMl9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMiBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQzMikpIHx8CisJCXB1dF91c2VyKGtwLT50eXBlLCAmdXAtPnR5cGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gX19wdXRfdjRsMl9mb3JtYXQzMihrcCwgdXApOworfQorCitzdGF0aWMgaW50IHB1dF92NGwyX2NyZWF0ZTMyKHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzICprcCwgc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMzMiBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVyczMyKSkgfHwKKwkgICAgY29weV90b191c2VyKHVwLCBrcCwgb2Zmc2V0b2Yoc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMzMiwgZm9ybWF0LmZtdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIF9fcHV0X3Y0bDJfZm9ybWF0MzIoJmtwLT5mb3JtYXQsICZ1cC0+Zm9ybWF0KTsKK30KKwogc3RydWN0IHY0bDJfc3RhbmRhcmQzMiB7CiAJX191MzIJCSAgICAgaW5kZXg7CiAJX191MzIJCSAgICAgaWRbMl07IC8qIF9fdTY0IHdvdWxkIGdldCB0aGUgYWxpZ25tZW50IHdyb25nICovCkBAIC03MDIsNiArNzQ1LDggQEAKICNkZWZpbmUgVklESU9DX1NfRVhUX0NUUkxTMzIgICAgX0lPV1IoJ1YnLCA3Miwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzMzIpCiAjZGVmaW5lIFZJRElPQ19UUllfRVhUX0NUUkxTMzIgIF9JT1dSKCdWJywgNzMsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sczMyKQogI2RlZmluZQlWSURJT0NfRFFFVkVOVDMyCV9JT1IgKCdWJywgODksIHN0cnVjdCB2NGwyX2V2ZW50MzIpCisjZGVmaW5lIFZJRElPQ19DUkVBVEVfQlVGUzMyCV9JT1dSKCdWJywgOTIsIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzMzIpCisjZGVmaW5lIFZJRElPQ19QUkVQQVJFX0JVRjMyCV9JT1dSKCdWJywgOTMsIHN0cnVjdCB2NGwyX2J1ZmZlcjMyKQogCiAjZGVmaW5lIFZJRElPQ19PVkVSTEFZMzIJX0lPVyAoJ1YnLCAxNCwgczMyKQogI2RlZmluZSBWSURJT0NfU1RSRUFNT04zMglfSU9XICgnVicsIDE4LCBzMzIpCkBAIC03MjEsNiArNzY2LDcgQEAKIAkJc3RydWN0IHY0bDJfc3RhbmRhcmQgdjJzOwogCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgdjJlY3M7CiAJCXN0cnVjdCB2NGwyX2V2ZW50IHYyZXY7CisJCXN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzIHYyY3J0OwogCQl1bnNpZ25lZCBsb25nIHZ4OwogCQlpbnQgdmk7CiAJfSBrYXJnOwpAQCAtNzUxLDYgKzc5Nyw4IEBACiAJY2FzZSBWSURJT0NfU19JTlBVVDMyOiBjbWQgPSBWSURJT0NfU19JTlBVVDsgYnJlYWs7CiAJY2FzZSBWSURJT0NfR19PVVRQVVQzMjogY21kID0gVklESU9DX0dfT1VUUFVUOyBicmVhazsKIAljYXNlIFZJRElPQ19TX09VVFBVVDMyOiBjbWQgPSBWSURJT0NfU19PVVRQVVQ7IGJyZWFrOworCWNhc2UgVklESU9DX0NSRUFURV9CVUZTMzI6IGNtZCA9IFZJRElPQ19DUkVBVEVfQlVGUzsgYnJlYWs7CisJY2FzZSBWSURJT0NfUFJFUEFSRV9CVUYzMjogY21kID0gVklESU9DX1BSRVBBUkVfQlVGOyBicmVhazsKIAl9CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtNzc1LDYgKzgyMywxMiBAQAogCQljb21wYXRpYmxlX2FyZyA9IDA7CiAJCWJyZWFrOwogCisJY2FzZSBWSURJT0NfQ1JFQVRFX0JVRlM6CisJCWVyciA9IGdldF92NGwyX2NyZWF0ZTMyKCZrYXJnLnYyY3J0LCB1cCk7CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19QUkVQQVJFX0JVRjoKIAljYXNlIFZJRElPQ19RVUVSWUJVRjoKIAljYXNlIFZJRElPQ19RQlVGOgogCWNhc2UgVklESU9DX0RRQlVGOgpAQCAtODYwLDYgKzkxNCwxMCBAQAogCQllcnIgPSBwdXRfdjRsMl9mb3JtYXQzMigma2FyZy52MmYsIHVwKTsKIAkJYnJlYWs7CiAKKwljYXNlIFZJRElPQ19DUkVBVEVfQlVGUzoKKwkJZXJyID0gcHV0X3Y0bDJfY3JlYXRlMzIoJmthcmcudjJjcnQsIHVwKTsKKwkJYnJlYWs7CisKIAljYXNlIFZJRElPQ19RVUVSWUJVRjoKIAljYXNlIFZJRElPQ19RQlVGOgogCWNhc2UgVklESU9DX0RRQlVGOgpAQCAtOTU5LDYgKzEwMTcsOCBAQAogCWNhc2UgVklESU9DX0RRRVZFTlQzMjoKIAljYXNlIFZJRElPQ19TVUJTQ1JJQkVfRVZFTlQ6CiAJY2FzZSBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQ6CisJY2FzZSBWSURJT0NfQ1JFQVRFX0JVRlMzMjoKKwljYXNlIFZJRElPQ19QUkVQQVJFX0JVRjMyOgogCQlyZXQgPSBkb192aWRlb19pb2N0bChmaWxlLCBjbWQsIGFyZyk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jdHJscy5jCmluZGV4IDA2YjYwMTQuLjBmNDE1ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jdHJscy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jdHJscy5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CkBAIC00Myw3ICs0NCw3IEBACiB9OwogCiAvKiBTbWFsbCBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBhdXRvY2x1c3RlciBpcyBzZXQgdG8gbWFudWFsCi0gICBtb2RlLiBJbiB0aGF0IGNhc2UgdGhlIGlzX3ZvbGF0aWxlIGZsYWcgc2hvdWxkIGJlIGlnbm9yZWQuICovCisgICBtb2RlLiAqLwogc3RhdGljIGJvb2wgaXNfY3VyX21hbnVhbChjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXIpCiB7CiAJcmV0dXJuIG1hc3Rlci0+aXNfYXV0byAmJiBtYXN0ZXItPmN1ci52YWwgPT0gbWFzdGVyLT5tYW51YWxfbW9kZV92YWx1ZTsKQEAgLTIxMCw2ICsyMTEsNyBAQAogCQkiRGlzYWJsZWQiLAogCQkiNTAgSHoiLAogCQkiNjAgSHoiLAorCQkiQXV0byIsCiAJCU5VTEwKIAl9OwogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FtZXJhX2V4cG9zdXJlX2F1dG9bXSA9IHsKQEAgLTgxOSw4ICs4MjEsOCBAQAogCWZpbGxfZXZlbnQoJmV2LCBjdHJsLCBjaGFuZ2VzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2V2LCAmY3RybC0+ZXZfc3Vicywgbm9kZSkKLQkJaWYgKHNldi0+ZmggJiYgKHNldi0+ZmggIT0gZmggfHwKLQkJCQkoc2V2LT5mbGFncyAmIFY0TDJfRVZFTlRfU1VCX0ZMX0FMTE9XX0ZFRURCQUNLKSkpCisJCWlmIChzZXYtPmZoICE9IGZoIHx8CisJCSAgICAoc2V2LT5mbGFncyAmIFY0TDJfRVZFTlRfU1VCX0ZMX0FMTE9XX0ZFRURCQUNLKSkKIAkJCXY0bDJfZXZlbnRfcXVldWVfZmgoc2V2LT5maCwgJmV2KTsKIH0KIApAQCAtOTM3LDkgKzkzOSwxNSBAQAogCQlicmVhazsKIAl9CiAJaWYgKHVwZGF0ZV9pbmFjdGl2ZSkgewotCQljdHJsLT5mbGFncyAmPSB+VjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7Ci0JCWlmICghaXNfY3VyX21hbnVhbChjdHJsLT5jbHVzdGVyWzBdKSkKKwkJLyogTm90ZTogdXBkYXRlX2luYWN0aXZlIGNhbiBvbmx5IGJlIHRydWUgZm9yIGF1dG8gY2x1c3RlcnMuICovCisJCWN0cmwtPmZsYWdzICY9CisJCQl+KFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFIHwgVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEUpOworCQlpZiAoIWlzX2N1cl9tYW51YWwoY3RybC0+Y2x1c3RlclswXSkpIHsKIAkJCWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQkJaWYgKGN0cmwtPmNsdXN0ZXJbMF0tPmhhc192b2xhdGlsZXMpCisJCQkJY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEU7CisJCX0KKwkJZmggPSBOVUxMOwogCX0KIAlpZiAoY2hhbmdlZCB8fCB1cGRhdGVfaW5hY3RpdmUpIHsKIAkJLyogSWYgYSBjb250cm9sIHdhcyBjaGFuZ2VkIHRoYXQgd2FzIG5vdCBvbmUgb2YgdGhlIGNvbnRyb2xzCkBAIC0xMzk0LDEwICsxNDAyLDggQEAKIAkJCXR5cGUsIG1pbiwgbWF4LAogCQkJaXNfbWVudSA/IGNmZy0+bWVudV9za2lwX21hc2sgOiBzdGVwLAogCQkJZGVmLCBmbGFncywgcW1lbnUsIHByaXYpOwotCWlmIChjdHJsKSB7CisJaWYgKGN0cmwpCiAJCWN0cmwtPmlzX3ByaXZhdGUgPSBjZmctPmlzX3ByaXZhdGU7Ci0JCWN0cmwtPmlzX3ZvbGF0aWxlID0gY2ZnLT5pc192b2xhdGlsZTsKLQl9CiAJcmV0dXJuIGN0cmw7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9uZXdfY3VzdG9tKTsKQEAgLTE0OTEsNiArMTQ5Nyw3IEBACiAvKiBDbHVzdGVyIGNvbnRyb2xzICovCiB2b2lkIHY0bDJfY3RybF9jbHVzdGVyKHVuc2lnbmVkIG5jb250cm9scywgc3RydWN0IHY0bDJfY3RybCAqKmNvbnRyb2xzKQogeworCWJvb2wgaGFzX3ZvbGF0aWxlcyA9IGZhbHNlOwogCWludCBpOwogCiAJLyogVGhlIGZpcnN0IGNvbnRyb2wgaXMgdGhlIG1hc3RlciBjb250cm9sIGFuZCBpdCBtdXN0IG5vdCBiZSBOVUxMICovCkBAIC0xNTAwLDggKzE1MDcsMTEgQEAKIAkJaWYgKGNvbnRyb2xzW2ldKSB7CiAJCQljb250cm9sc1tpXS0+Y2x1c3RlciA9IGNvbnRyb2xzOwogCQkJY29udHJvbHNbaV0tPm5jb250cm9scyA9IG5jb250cm9sczsKKwkJCWlmIChjb250cm9sc1tpXS0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19WT0xBVElMRSkKKwkJCQloYXNfdm9sYXRpbGVzID0gdHJ1ZTsKIAkJfQogCX0KKwljb250cm9sc1swXS0+aGFzX3ZvbGF0aWxlcyA9IGhhc192b2xhdGlsZXM7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9jbHVzdGVyKTsKIApAQCAtMTUwOSwyMiArMTUxOSwyNSBAQAogCQkJICAgIHU4IG1hbnVhbF92YWwsIGJvb2wgc2V0X3ZvbGF0aWxlKQogewogCXN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlciA9IGNvbnRyb2xzWzBdOwotCXUzMiBmbGFnOworCXUzMiBmbGFnID0gMDsKIAlpbnQgaTsKIAogCXY0bDJfY3RybF9jbHVzdGVyKG5jb250cm9scywgY29udHJvbHMpOwogCVdBUk5fT04obmNvbnRyb2xzIDw9IDEpOwogCVdBUk5fT04obWFudWFsX3ZhbCA8IG1hc3Rlci0+bWluaW11bSB8fCBtYW51YWxfdmFsID4gbWFzdGVyLT5tYXhpbXVtKTsKKwlXQVJOX09OKHNldF92b2xhdGlsZSAmJiAhaGFzX29wKG1hc3RlciwgZ192b2xhdGlsZV9jdHJsKSk7CiAJbWFzdGVyLT5pc19hdXRvID0gdHJ1ZTsKKwltYXN0ZXItPmhhc192b2xhdGlsZXMgPSBzZXRfdm9sYXRpbGU7CiAJbWFzdGVyLT5tYW51YWxfbW9kZV92YWx1ZSA9IG1hbnVhbF92YWw7CiAJbWFzdGVyLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19VUERBVEU7Ci0JZmxhZyA9IGlzX2N1cl9tYW51YWwobWFzdGVyKSA/IDAgOiBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKworCWlmICghaXNfY3VyX21hbnVhbChtYXN0ZXIpKQorCQlmbGFnID0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgfAorCQkJKHNldF92b2xhdGlsZSA/IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFIDogMCk7CiAKIAlmb3IgKGkgPSAxOyBpIDwgbmNvbnRyb2xzOyBpKyspCi0JCWlmIChjb250cm9sc1tpXSkgewotCQkJY29udHJvbHNbaV0tPmlzX3ZvbGF0aWxlID0gc2V0X3ZvbGF0aWxlOworCQlpZiAoY29udHJvbHNbaV0pCiAJCQljb250cm9sc1tpXS0+ZmxhZ3MgfD0gZmxhZzsKLQkJfQogfQogRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfYXV0b19jbHVzdGVyKTsKIApAQCAtMTU3OSw5ICsxNTkyLDYgQEAKIHN0YXRpYyB2b2lkIGxvZ19jdHJsKGNvbnN0IHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsCiAJCSAgICAgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpjb2xvbikKIHsKLQlpbnQgZmxfaW5hY3QgPSBjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOwotCWludCBmbF9ncmFiYmVkID0gY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19HUkFCQkVEOwotCiAJaWYgKGN0cmwtPmZsYWdzICYgKFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEIHwgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSkpCiAJCXJldHVybjsKIAlpZiAoY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTKQpAQCAtMTYxMiwxNCArMTYyMiwxNyBAQAogCQlwcmludGsoS0VSTl9DT05UICJ1bmtub3duIHR5cGUgJWQiLCBjdHJsLT50eXBlKTsKIAkJYnJlYWs7CiAJfQotCWlmIChmbF9pbmFjdCAmJiBmbF9ncmFiYmVkKQotCQlwcmludGsoS0VSTl9DT05UICIgKGluYWN0aXZlLCBncmFiYmVkKVxuIik7Ci0JZWxzZSBpZiAoZmxfaW5hY3QpCi0JCXByaW50ayhLRVJOX0NPTlQgIiAoaW5hY3RpdmUpXG4iKTsKLQllbHNlIGlmIChmbF9ncmFiYmVkKQotCQlwcmludGsoS0VSTl9DT05UICIgKGdyYWJiZWQpXG4iKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJaWYgKGN0cmwtPmZsYWdzICYgKFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFIHwKKwkJCSAgIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQgfAorCQkJICAgVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEUpKSB7CisJCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiIGluYWN0aXZlIik7CisJCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQpCisJCQlwcmludGsoS0VSTl9DT05UICIgZ3JhYmJlZCIpOworCQlpZiAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19WT0xBVElMRSkKKwkJCXByaW50ayhLRVJOX0NPTlQgIiB2b2xhdGlsZSIpOworCX0KKwlwcmludGsoS0VSTl9DT05UICJcbiIpOwogfQogCiAvKiBMb2cgYWxsIGNvbnRyb2xzIG93bmVkIGJ5IHRoZSBoYW5kbGVyICovCkBAIC0xOTU5LDcgKzE5NzIsOCBAQAogCQl2NGwyX2N0cmxfbG9jayhtYXN0ZXIpOwogCiAJCS8qIGdfdm9sYXRpbGVfY3RybCB3aWxsIHVwZGF0ZSB0aGUgbmV3IGNvbnRyb2wgdmFsdWVzICovCi0JCWlmIChoYXNfb3AobWFzdGVyLCBnX3ZvbGF0aWxlX2N0cmwpICYmICFpc19jdXJfbWFudWFsKG1hc3RlcikpIHsKKwkJaWYgKChtYXN0ZXItPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEUpIHx8CisJCQkobWFzdGVyLT5oYXNfdm9sYXRpbGVzICYmICFpc19jdXJfbWFudWFsKG1hc3RlcikpKSB7CiAJCQlmb3IgKGogPSAwOyBqIDwgbWFzdGVyLT5uY29udHJvbHM7IGorKykKIAkJCQljdXJfdG9fbmV3KG1hc3Rlci0+Y2x1c3RlcltqXSk7CiAJCQlyZXQgPSBjYWxsX29wKG1hc3RlciwgZ192b2xhdGlsZV9jdHJsKTsKQEAgLTIwMDQsNyArMjAxOCw3IEBACiAKIAl2NGwyX2N0cmxfbG9jayhtYXN0ZXIpOwogCS8qIGdfdm9sYXRpbGVfY3RybCB3aWxsIHVwZGF0ZSB0aGUgY3VycmVudCBjb250cm9sIHZhbHVlcyAqLwotCWlmIChjdHJsLT5pc192b2xhdGlsZSAmJiAhaXNfY3VyX21hbnVhbChtYXN0ZXIpKSB7CisJaWYgKGN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEUpIHsKIAkJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bmNvbnRyb2xzOyBpKyspCiAJCQljdXJfdG9fbmV3KG1hc3Rlci0+Y2x1c3RlcltpXSk7CiAJCXJldCA9IGNhbGxfb3AobWFzdGVyLCBnX3ZvbGF0aWxlX2N0cmwpOwpAQCAtMjEyMCw2ICsyMTM0LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIE9idGFpbiB0aGUgY3VycmVudCB2b2xhdGlsZSB2YWx1ZXMgb2YgYW4gYXV0b2NsdXN0ZXIgYW5kIG1hcmsgdGhlbQorICAgYXMgbmV3LiAqLworc3RhdGljIHZvaWQgdXBkYXRlX2Zyb21fYXV0b19jbHVzdGVyKHN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm5jb250cm9sczsgaSsrKQorCQljdXJfdG9fbmV3KG1hc3Rlci0+Y2x1c3RlcltpXSk7CisJaWYgKCFjYWxsX29wKG1hc3RlciwgZ192b2xhdGlsZV9jdHJsKSkKKwkJZm9yIChpID0gMTsgaSA8IG1hc3Rlci0+bmNvbnRyb2xzOyBpKyspCisJCQlpZiAobWFzdGVyLT5jbHVzdGVyW2ldKQorCQkJCW1hc3Rlci0+Y2x1c3RlcltpXS0+aXNfbmV3ID0gMTsKK30KKwogLyogVHJ5IG9yIHRyeS1hbmQtc2V0IGNvbnRyb2xzICovCiBzdGF0aWMgaW50IHRyeV9zZXRfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsCiAJCQkgICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3MsCkBAIC0yMTY1LDYgKzIxOTMsMzEgQEAKIAkJCWlmIChtYXN0ZXItPmNsdXN0ZXJbal0pCiAJCQkJbWFzdGVyLT5jbHVzdGVyW2pdLT5pc19uZXcgPSAwOwogCisJCS8qIEZvciB2b2xhdGlsZSBhdXRvY2x1c3RlcnMgdGhhdCBhcmUgY3VycmVudGx5IGluIGF1dG8gbW9kZQorCQkgICB3ZSBuZWVkIHRvIGRpc2NvdmVyIGlmIGl0IHdpbGwgYmUgc2V0IHRvIG1hbnVhbCBtb2RlLgorCQkgICBJZiBzbywgdGhlbiB3ZSBoYXZlIHRvIGNvcHkgdGhlIGN1cnJlbnQgdm9sYXRpbGUgdmFsdWVzCisJCSAgIGZpcnN0IHNpbmNlIHRob3NlIHdpbGwgYmVjb21lIHRoZSBuZXcgbWFudWFsIHZhbHVlcyAod2hpY2gKKwkJICAgbWF5IGJlIG92ZXJ3cml0dGVuIGJ5IGV4cGxpY2l0IG5ldyB2YWx1ZXMgZnJvbSB0aGlzIHNldAorCQkgICBvZiBjb250cm9scykuICovCisJCWlmIChtYXN0ZXItPmlzX2F1dG8gJiYgbWFzdGVyLT5oYXNfdm9sYXRpbGVzICYmCisJCQkJCQkhaXNfY3VyX21hbnVhbChtYXN0ZXIpKSB7CisJCQkvKiBQaWNrIGFuIGluaXRpYWwgbm9uLW1hbnVhbCB2YWx1ZSAqLworCQkJczMyIG5ld19hdXRvX3ZhbCA9IG1hc3Rlci0+bWFudWFsX21vZGVfdmFsdWUgKyAxOworCQkJdTMyIHRtcF9pZHggPSBpZHg7CisKKwkJCWRvIHsKKwkJCQkvKiBDaGVjayBpZiB0aGUgYXV0byBjb250cm9sIGlzIHBhcnQgb2YgdGhlCisJCQkJICAgbGlzdCwgYW5kIHJlbWVtYmVyIHRoZSBuZXcgdmFsdWUuICovCisJCQkJaWYgKGhlbHBlcnNbdG1wX2lkeF0uY3RybCA9PSBtYXN0ZXIpCisJCQkJCW5ld19hdXRvX3ZhbCA9IGNzLT5jb250cm9sc1t0bXBfaWR4XS52YWx1ZTsKKwkJCQl0bXBfaWR4ID0gaGVscGVyc1t0bXBfaWR4XS5uZXh0OworCQkJfSB3aGlsZSAodG1wX2lkeCk7CisJCQkvKiBJZiB0aGUgbmV3IHZhbHVlID09IHRoZSBtYW51YWwgdmFsdWUsIHRoZW4gY29weQorCQkJICAgdGhlIGN1cnJlbnQgdm9sYXRpbGUgdmFsdWVzLiAqLworCQkJaWYgKG5ld19hdXRvX3ZhbCA9PSBtYXN0ZXItPm1hbnVhbF9tb2RlX3ZhbHVlKQorCQkJCXVwZGF0ZV9mcm9tX2F1dG9fY2x1c3RlcihtYXN0ZXIpOworCQl9CisKIAkJLyogQ29weSB0aGUgbmV3IGNhbGxlci1zdXBwbGllZCBjb250cm9sIHZhbHVlcy4KIAkJICAgdXNlcl90b19uZXcoKSBzZXRzICdpc19uZXcnIHRvIDEuICovCiAJCWRvIHsKQEAgLTIyMzUsNiArMjI4OCwxMiBAQAogCQlpZiAobWFzdGVyLT5jbHVzdGVyW2ldKQogCQkJbWFzdGVyLT5jbHVzdGVyW2ldLT5pc19uZXcgPSAwOwogCisJLyogRm9yIGF1dG9jbHVzdGVycyB3aXRoIHZvbGF0aWxlcyB0aGF0IGFyZSBzd2l0Y2hlZCBmcm9tIGF1dG8gdG8KKwkgICBtYW51YWwgbW9kZSB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgY3VycmVudCB2b2xhdGlsZSB2YWx1ZXMgc2luY2UKKwkgICB0aG9zZSB3aWxsIGJlY29tZSB0aGUgaW5pdGlhbCBtYW51YWwgdmFsdWVzIGFmdGVyIHN1Y2ggYSBzd2l0Y2guICovCisJaWYgKG1hc3Rlci0+aXNfYXV0byAmJiBtYXN0ZXItPmhhc192b2xhdGlsZXMgJiYgY3RybCA9PSBtYXN0ZXIgJiYKKwkgICAgIWlzX2N1cl9tYW51YWwobWFzdGVyKSAmJiAqdmFsID09IG1hc3Rlci0+bWFudWFsX21vZGVfdmFsdWUpCisJCXVwZGF0ZV9mcm9tX2F1dG9fY2x1c3RlcihtYXN0ZXIpOwogCWN0cmwtPnZhbCA9ICp2YWw7CiAJY3RybC0+aXNfbmV3ID0gMTsKIAlyZXQgPSB0cnlfb3Jfc2V0X2NsdXN0ZXIoZmgsIG1hc3RlciwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMKaW5kZXggZTZhMmMzYi4uMGVkZDYxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYwpAQCAtMjAsNyArMjAsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpZiBkZWZpbmVkKENPTkZJR19TUEkpCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2VuZGlmCkBAIC0xOTMsNiArMTk1LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYpOwogCitzdGF0aWMgdm9pZCB2NGwyX2RldmljZV9yZWxlYXNlX3N1YmRldl9ub2RlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCXNkLT5kZXZub2RlID0gTlVMTDsKKwlrZnJlZSh2ZGV2KTsKK30KKwogaW50IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldl9ub2RlcyhzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7CkBAIC0yMDYsMjIgKzIxNSw0MCBAQAogCQlpZiAoIShzZC0+ZmxhZ3MgJiBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERSkpCiAJCQljb250aW51ZTsKIAotCQl2ZGV2ID0gJnNkLT5kZXZub2RlOworCQl2ZGV2ID0ga3phbGxvYyhzaXplb2YoKnZkZXYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2ZGV2KSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBjbGVhbl91cDsKKwkJfQorCisJCXZpZGVvX3NldF9kcnZkYXRhKHZkZXYsIHNkKTsKIAkJc3RybGNweSh2ZGV2LT5uYW1lLCBzZC0+bmFtZSwgc2l6ZW9mKHZkZXYtPm5hbWUpKTsKIAkJdmRldi0+djRsMl9kZXYgPSB2NGwyX2RldjsKIAkJdmRldi0+Zm9wcyA9ICZ2NGwyX3N1YmRldl9mb3BzOwotCQl2ZGV2LT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHk7CisJCXZkZXYtPnJlbGVhc2UgPSB2NGwyX2RldmljZV9yZWxlYXNlX3N1YmRldl9ub2RlOwogCQl2ZGV2LT5jdHJsX2hhbmRsZXIgPSBzZC0+Y3RybF9oYW5kbGVyOwogCQllcnIgPSBfX3ZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZGV2LCBWRkxfVFlQRV9TVUJERVYsIC0xLCAxLAogCQkJCQkgICAgICBzZC0+b3duZXIpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZSh2ZGV2KTsKKwkJCWdvdG8gY2xlYW5fdXA7CisJCX0KICNpZiBkZWZpbmVkKENPTkZJR19NRURJQV9DT05UUk9MTEVSKQogCQlzZC0+ZW50aXR5LnY0bC5tYWpvciA9IFZJREVPX01BSk9SOwogCQlzZC0+ZW50aXR5LnY0bC5taW5vciA9IHZkZXYtPm1pbm9yOwogI2VuZGlmCisJCXNkLT5kZXZub2RlID0gdmRldjsKIAl9CiAJcmV0dXJuIDA7CisKK2NsZWFuX3VwOgorCWxpc3RfZm9yX2VhY2hfZW50cnkoc2QsICZ2NGwyX2Rldi0+c3ViZGV2cywgbGlzdCkgeworCQlpZiAoIXNkLT5kZXZub2RlKQorCQkJYnJlYWs7CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHNkLT5kZXZub2RlKTsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2X25vZGVzKTsKIApAQCAtMjQ3LDcgKzI3NCw3IEBACiAJaWYgKHY0bDJfZGV2LT5tZGV2KQogCQltZWRpYV9kZXZpY2VfdW5yZWdpc3Rlcl9lbnRpdHkoJnNkLT5lbnRpdHkpOwogI2VuZGlmCi0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnNkLT5kZXZub2RlKTsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShzZC0+ZGV2bm9kZSk7CiAJbW9kdWxlX3B1dChzZC0+b3duZXIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWV2ZW50LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZXZlbnQuYwppbmRleCA1M2IxOTBjLi5jMjZhZDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZXZlbnQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZXZlbnQuYwpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBzZXZfcG9zKGNvbnN0IHN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldiwgdW5zaWduZWQgaWR4KQogewpAQCAtMjE1LDYgKzIxNiw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpOwogCisJaWYgKHN1Yi0+dHlwZSA9PSBWNEwyX0VWRU5UX0FMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoZWxlbXMgPCAxKQogCQllbGVtcyA9IDE7CiAJaWYgKHN1Yi0+dHlwZSA9PSBWNEwyX0VWRU5UX0NUUkwpIHsKQEAgLTI4Miw2ICsyODYsNyBAQAogewogCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOwogCiAJaWYgKHN1Yi0+dHlwZSA9PSBWNEwyX0VWRU5UX0FMTCkgewogCQl2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlX2FsbChmaCk7CkBAIC0yOTIsOCArMjk3LDEyIEBACiAKIAlzZXYgPSB2NGwyX2V2ZW50X3N1YnNjcmliZWQoZmgsIHN1Yi0+dHlwZSwgc3ViLT5pZCk7CiAJaWYgKHNldiAhPSBOVUxMKSB7CisJCS8qIFJlbW92ZSBhbnkgcGVuZGluZyBldmVudHMgZm9yIHRoaXMgc3Vic2NyaXB0aW9uICovCisJCWZvciAoaSA9IDA7IGkgPCBzZXYtPmluX3VzZTsgaSsrKSB7CisJCQlsaXN0X2RlbCgmc2V2LT5ldmVudHNbc2V2X3BvcyhzZXYsIGkpXS5saXN0KTsKKwkJCWZoLT5uYXZhaWxhYmxlLS07CisJCX0KIAkJbGlzdF9kZWwoJnNldi0+bGlzdCk7Ci0JCXNldi0+ZmggPSBOVUxMOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZoLT52ZGV2LT5maF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1maC5jCmluZGV4IDEyMjgyMmQuLjllM2ZjMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1maC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1maC5jCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWZoLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1ldmVudC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWludC1kZXZpY2UuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pbnQtZGV2aWNlLmMKaW5kZXggYTkzNWJhZS4uZjQ0NzM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWludC1kZXZpY2UuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW50LWRldmljZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW50LWRldmljZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jCmluZGV4IDAwMmNlMTMuLmUxZGE4ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jCkBAIC01NSw2ICs1NSwxOSBAQAogCW1lbXNldCgodTggKikocCkgKyBvZmZzZXRvZih0eXBlb2YoKihwKSksIGZpZWxkKSArIHNpemVvZigocCktPmZpZWxkKSwgXAogCTAsIHNpemVvZigqKHApKSAtIG9mZnNldG9mKHR5cGVvZigqKHApKSwgZmllbGQpIC0gc2l6ZW9mKChwKS0+ZmllbGQpKQogCisjZGVmaW5lIGhhdmVfZm10X29wcyhmb28pICgJCQkJCQlcCisJb3BzLT52aWRpb2NfIyNmb28jI19mbXRfdmlkX2NhcCB8fAkJCQlcCisJb3BzLT52aWRpb2NfIyNmb28jI19mbXRfdmlkX291dCB8fAkJCQlcCisJb3BzLT52aWRpb2NfIyNmb28jI19mbXRfdmlkX2NhcF9tcGxhbmUgfHwJCQlcCisJb3BzLT52aWRpb2NfIyNmb28jI19mbXRfdmlkX291dF9tcGxhbmUgfHwJCQlcCisJb3BzLT52aWRpb2NfIyNmb28jI19mbXRfdmlkX292ZXJsYXkgfHwJCQkJXAorCW9wcy0+dmlkaW9jXyMjZm9vIyNfZm10X3ZiaV9jYXAgfHwJCQkJXAorCW9wcy0+dmlkaW9jXyMjZm9vIyNfZm10X3ZpZF9vdXRfb3ZlcmxheSB8fAkJCVwKKwlvcHMtPnZpZGlvY18jI2ZvbyMjX2ZtdF92Ymlfb3V0IHx8CQkJCVwKKwlvcHMtPnZpZGlvY18jI2ZvbyMjX2ZtdF9zbGljZWRfdmJpX2NhcCB8fAkJCVwKKwlvcHMtPnZpZGlvY18jI2ZvbyMjX2ZtdF9zbGljZWRfdmJpX291dCB8fAkJCVwKKwlvcHMtPnZpZGlvY18jI2ZvbyMjX2ZtdF90eXBlX3ByaXZhdGUpCisKIHN0cnVjdCBzdGRfZGVzY3IgewogCXY0bDJfc3RkX2lkIHN0ZDsKIAljb25zdCBjaGFyICpkZXNjcjsKQEAgLTI2MCw2ICsyNzMsOCBAQAogCVtfSU9DX05SKFZJRElPQ19EUUVWRU5UKV0JICAgPSAiVklESU9DX0RRRVZFTlQiLAogCVtfSU9DX05SKFZJRElPQ19TVUJTQ1JJQkVfRVZFTlQpXSAgPSAiVklESU9DX1NVQlNDUklCRV9FVkVOVCIsCiAJW19JT0NfTlIoVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UKV0gPSAiVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UIiwKKwlbX0lPQ19OUihWSURJT0NfQ1JFQVRFX0JVRlMpXSAgICAgID0gIlZJRElPQ19DUkVBVEVfQlVGUyIsCisJW19JT0NfTlIoVklESU9DX1BSRVBBUkVfQlVGKV0gICAgICA9ICJWSURJT0NfUFJFUEFSRV9CVUYiLAogfTsKICNkZWZpbmUgVjRMMl9JT0NUTFMgQVJSQVlfU0laRSh2NGwyX2lvY3RscykKIApAQCAtNDc3LDYzICs0OTIsNiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi0vKioKLSAqIGZtdF9zcF90b19tcCgpIC0gQ29udmVydCBhIHNpbmdsZS1wbGFuZSBmb3JtYXQgdG8gaXRzIG11bHRpLXBsYW5hciAxLXBsYW5lCi0gKiBlcXVpdmFsZW50Ci0gKi8KLXN0YXRpYyBpbnQgZm10X3NwX3RvX21wKGNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZl9zcCwKLQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZl9tcCkKLXsKLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4X21wID0gJmZfbXAtPmZtdC5waXhfbXA7Ci0JY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmZfc3AtPmZtdC5waXg7Ci0KLQlpZiAoZl9zcC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCWZfbXAtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOwotCWVsc2UgaWYgKGZfc3AtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpCi0JCWZfbXAtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBpeF9tcC0+d2lkdGggPSBwaXgtPndpZHRoOwotCXBpeF9tcC0+aGVpZ2h0ID0gcGl4LT5oZWlnaHQ7Ci0JcGl4X21wLT5waXhlbGZvcm1hdCA9IHBpeC0+cGl4ZWxmb3JtYXQ7Ci0JcGl4X21wLT5maWVsZCA9IHBpeC0+ZmllbGQ7Ci0JcGl4X21wLT5jb2xvcnNwYWNlID0gcGl4LT5jb2xvcnNwYWNlOwotCXBpeF9tcC0+bnVtX3BsYW5lcyA9IDE7Ci0JcGl4X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0gcGl4LT5zaXplaW1hZ2U7Ci0JcGl4X21wLT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lID0gcGl4LT5ieXRlc3BlcmxpbmU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBmbXRfbXBfdG9fc3AoKSAtIENvbnZlcnQgYSBtdWx0aS1wbGFuYXIgMS1wbGFuZSBmb3JtYXQgdG8gaXRzIHNpbmdsZS1wbGFuYXIKLSAqIGVxdWl2YWxlbnQKLSAqLwotc3RhdGljIGludCBmbXRfbXBfdG9fc3AoY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmX21wLAotCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmX3NwKQotewotCWNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhfbXAgPSAmZl9tcC0+Zm10LnBpeF9tcDsKLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZl9zcC0+Zm10LnBpeDsKLQotCWlmIChmX21wLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCi0JCWZfc3AtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JZWxzZSBpZiAoZl9tcC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCi0JCWZfc3AtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGl4LT53aWR0aCA9IHBpeF9tcC0+d2lkdGg7Ci0JcGl4LT5oZWlnaHQgPSBwaXhfbXAtPmhlaWdodDsKLQlwaXgtPnBpeGVsZm9ybWF0ID0gcGl4X21wLT5waXhlbGZvcm1hdDsKLQlwaXgtPmZpZWxkID0gcGl4X21wLT5maWVsZDsKLQlwaXgtPmNvbG9yc3BhY2UgPSBwaXhfbXAtPmNvbG9yc3BhY2U7Ci0JcGl4LT5zaXplaW1hZ2UgPSBwaXhfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2U7Ci0JcGl4LT5ieXRlc3BlcmxpbmUgPSBwaXhfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmU7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGxvbmcgX192aWRlb19kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewpAQCAtNTQxLDggKzQ5OSw4IEBACiAJY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzICpvcHMgPSB2ZmQtPmlvY3RsX29wczsKIAl2b2lkICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdjRsMl9maCAqdmZoID0gTlVMTDsKLQlzdHJ1Y3QgdjRsMl9mb3JtYXQgZl9jb3B5OwogCWludCB1c2VfZmhfcHJpbyA9IDA7CisJbG9uZyByZXRfcHJpbyA9IDA7CiAJbG9uZyByZXQgPSAtRU5PVFRZOwogCiAJaWYgKG9wcyA9PSBOVUxMKSB7CkBAIC01NjIsMzkgKzUyMCw4IEBACiAJCXVzZV9maF9wcmlvID0gdGVzdF9iaXQoVjRMMl9GTF9VU0VfRkhfUFJJTywgJnZmZC0+ZmxhZ3MpOwogCX0KIAotCWlmICh1c2VfZmhfcHJpbykgewotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCWNhc2UgVklESU9DX1NfU1REOgotCQljYXNlIFZJRElPQ19TX0lOUFVUOgotCQljYXNlIFZJRElPQ19TX09VVFBVVDoKLQkJY2FzZSBWSURJT0NfU19UVU5FUjoKLQkJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JCWNhc2UgVklESU9DX1NfRk1UOgotCQljYXNlIFZJRElPQ19TX0NST1A6Ci0JCWNhc2UgVklESU9DX1NfQVVESU86Ci0JCWNhc2UgVklESU9DX1NfQVVET1VUOgotCQljYXNlIFZJRElPQ19TX0VYVF9DVFJMUzoKLQkJY2FzZSBWSURJT0NfU19GQlVGOgotCQljYXNlIFZJRElPQ19TX1BSSU9SSVRZOgotCQljYXNlIFZJRElPQ19TX0RWX1BSRVNFVDoKLQkJY2FzZSBWSURJT0NfU19EVl9USU1JTkdTOgotCQljYXNlIFZJRElPQ19TX0pQRUdDT01QOgotCQljYXNlIFZJRElPQ19TX01PRFVMQVRPUjoKLQkJY2FzZSBWSURJT0NfU19QQVJNOgotCQljYXNlIFZJRElPQ19TX0hXX0ZSRVFfU0VFSzoKLQkJY2FzZSBWSURJT0NfRU5DT0RFUl9DTUQ6Ci0JCWNhc2UgVklESU9DX09WRVJMQVk6Ci0JCWNhc2UgVklESU9DX1JFUUJVRlM6Ci0JCWNhc2UgVklESU9DX1NUUkVBTU9OOgotCQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JCQlyZXQgPSB2NGwyX3ByaW9fY2hlY2sodmZkLT5wcmlvLCB2ZmgtPnByaW8pOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGV4aXRfcHJpbzsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCX0KKwlpZiAodXNlX2ZoX3ByaW8pCisJCXJldF9wcmlvID0gdjRsMl9wcmlvX2NoZWNrKHZmZC0+cHJpbywgdmZoLT5wcmlvKTsKIAogCXN3aXRjaCAoY21kKSB7CiAKQEAgLTYzOCwxMiArNTY1LDE0IEBACiAJCWVudW0gdjRsMl9wcmlvcml0eSAqcCA9IGFyZzsKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfcHJpb3JpdHkgJiYgIXVzZV9maF9wcmlvKQotCQkJCWJyZWFrOworCQkJYnJlYWs7CiAJCWRiZ2FyZyhjbWQsICJzZXR0aW5nIHByaW9yaXR5IHRvICVkXG4iLCAqcCk7CiAJCWlmIChvcHMtPnZpZGlvY19zX3ByaW9yaXR5KQogCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19wcmlvcml0eShmaWxlLCBmaCwgKnApOwogCQllbHNlCi0JCQlyZXQgPSB2NGwyX3ByaW9fY2hhbmdlKCZ2ZmQtPnY0bDJfZGV2LT5wcmlvLCAmdmZoLT5wcmlvLCAqcCk7CisJCQlyZXQgPSByZXRfcHJpbyA/IHJldF9wcmlvIDoKKwkJCQl2NGwyX3ByaW9fY2hhbmdlKCZ2ZmQtPnY0bDJfZGV2LT5wcmlvLAorCQkJCQkJCSZ2ZmgtPnByaW8sICpwKTsKIAkJYnJlYWs7CiAJfQogCkBAIC02NTQsMzcgKzU4MywzNyBAQAogCiAJCXN3aXRjaCAoZi0+dHlwZSkgewogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKLQkJCWlmIChvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKGZpbGUsIGZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU6Ci0JCQlpZiAob3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9jYXBfbXBsYW5lKSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZShmaWxlLAogCQkJCQkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgotCQkJaWYgKG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9vdmVybGF5KQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfb3ZlcmxheSkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX292ZXJsYXkoZmlsZSwKIAkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6Ci0JCQlpZiAob3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX291dCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX291dCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX291dChmaWxlLCBmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU6Ci0JCQlpZiAob3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX291dF9tcGxhbmUpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lKSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZShmaWxlLAogCQkJCQkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9QUklWQVRFOgotCQkJaWYgKG9wcy0+dmlkaW9jX2VudW1fZm10X3R5cGVfcHJpdmF0ZSkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfZW51bV9mbXRfdHlwZV9wcml2YXRlKSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19lbnVtX2ZtdF90eXBlX3ByaXZhdGUoZmlsZSwKIAkJCQkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQotCQlpZiAoIXJldCkKKwkJaWYgKGxpa2VseSAoIXJldCkpCiAJCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIHR5cGU9JWQsIGZsYWdzPSVkLCAiCiAJCQkJInBpeGVsZm9ybWF0PSVjJWMlYyVjLCBkZXNjcmlwdGlvbj0nJXMnXG4iLAogCQkJCWYtPmluZGV4LCBmLT50eXBlLCBmLT5mbGFncywKQEAgLTY5Myw2ICs2MjIsMTQgQEAKIAkJCQkoZi0+cGl4ZWxmb3JtYXQgPj4gMTYpICYgMHhmZiwKIAkJCQkoZi0+cGl4ZWxmb3JtYXQgPj4gMjQpICYgMHhmZiwKIAkJCQlmLT5kZXNjcmlwdGlvbik7CisJCWVsc2UgaWYgKHJldCA9PSAtRU5PVFRZICYmCisJCQkgKG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgfHwKKwkJCSAgb3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX291dCB8fAorCQkJICBvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZSB8fAorCQkJICBvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZSB8fAorCQkJICBvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfb3ZlcmxheSB8fAorCQkJICBvcHMtPnZpZGlvY19lbnVtX2ZtdF90eXBlX3ByaXZhdGUpKQorCQkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVklESU9DX0dfRk1UOgpAQCAtNzA0LDExOSArNjQxLDY3IEBACiAKIAkJc3dpdGNoIChmLT50eXBlKSB7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9jYXApIHsKKwkJCWlmIChvcHMtPnZpZGlvY19nX2ZtdF92aWRfY2FwKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9jYXAoZmlsZSwgZmgsIGYpOwotCQkJfSBlbHNlIGlmIChvcHMtPnZpZGlvY19nX2ZtdF92aWRfY2FwX21wbGFuZSkgewotCQkJCWlmIChmbXRfc3BfdG9fbXAoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9jYXBfbXBsYW5lKGZpbGUsIGZoLAotCQkJCQkJCQkgICAgICAgJmZfY29weSk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvKiBEcml2ZXIgaXMgY3VycmVudGx5IGluIG11bHRpLXBsYW5hciBmb3JtYXQsCi0JCQkJICogd2UgY2FuJ3QgcmV0dXJuIGl0IGluIHNpbmdsZS1wbGFuYXIgQVBJKi8KLQkJCQlpZiAoZl9jb3B5LmZtdC5waXhfbXAubnVtX3BsYW5lcyA+IDEpIHsKLQkJCQkJcmV0ID0gLUVCVVNZOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlyZXQgPSBmbXRfbXBfdG9fc3AoJmZfY29weSwgZik7Ci0JCQl9CiAJCQlpZiAoIXJldCkKIAkJCQl2NGxfcHJpbnRfcGl4X2ZtdCh2ZmQsICZmLT5mbXQucGl4KTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU6Ci0JCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUpIHsKKwkJCWlmIChvcHMtPnZpZGlvY19nX2ZtdF92aWRfY2FwX21wbGFuZSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19nX2ZtdF92aWRfY2FwX21wbGFuZShmaWxlLAogCQkJCQkJCQkJZmgsIGYpOwotCQkJfSBlbHNlIGlmIChvcHMtPnZpZGlvY19nX2ZtdF92aWRfY2FwKSB7Ci0JCQkJaWYgKGZtdF9tcF90b19zcChmLCAmZl9jb3B5KSkKLQkJCQkJYnJlYWs7Ci0JCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdmlkX2NhcChmaWxlLAotCQkJCQkJCQlmaCwgJmZfY29weSk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlyZXQgPSBmbXRfc3BfdG9fbXAoJmZfY29weSwgZik7Ci0JCQl9CiAJCQlpZiAoIXJldCkKIAkJCQl2NGxfcHJpbnRfcGl4X2ZtdF9tcGxhbmUodmZkLCAmZi0+Zm10LnBpeF9tcCk7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6Ci0JCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX292ZXJsYXkpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdmVybGF5KSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19nX2ZtdF92aWRfb3ZlcmxheShmaWxlLAogCQkJCQkJCQkgICAgZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6Ci0JCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX291dCkgeworCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXQpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdmlkX291dChmaWxlLCBmaCwgZik7Ci0JCQl9IGVsc2UgaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXRfbXBsYW5lKSB7Ci0JCQkJaWYgKGZtdF9zcF90b19tcChmLCAmZl9jb3B5KSkKLQkJCQkJYnJlYWs7Ci0JCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdmlkX291dF9tcGxhbmUoZmlsZSwgZmgsCi0JCQkJCQkJCQkmZl9jb3B5KTsKLQkJCQlpZiAocmV0KQotCQkJCQlicmVhazsKLQotCQkJCS8qIERyaXZlciBpcyBjdXJyZW50bHkgaW4gbXVsdGktcGxhbmFyIGZvcm1hdCwKLQkJCQkgKiB3ZSBjYW4ndCByZXR1cm4gaXQgaW4gc2luZ2xlLXBsYW5hciBBUEkqLwotCQkJCWlmIChmX2NvcHkuZm10LnBpeF9tcC5udW1fcGxhbmVzID4gMSkgewotCQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXJldCA9IGZtdF9tcF90b19zcCgmZl9jb3B5LCBmKTsKLQkJCX0KIAkJCWlmICghcmV0KQogCQkJCXY0bF9wcmludF9waXhfZm10KHZmZCwgJmYtPmZtdC5waXgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOgotCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXRfbXBsYW5lKSB7CisJCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX291dF9tcGxhbmUpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdmlkX291dF9tcGxhbmUoZmlsZSwKIAkJCQkJCQkJCWZoLCBmKTsKLQkJCX0gZWxzZSBpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX291dCkgewotCQkJCWlmIChmbXRfbXBfdG9fc3AoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXQoZmlsZSwKLQkJCQkJCQkJZmgsICZmX2NvcHkpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJcmV0ID0gZm10X3NwX3RvX21wKCZmX2NvcHksIGYpOwotCQkJfQogCQkJaWYgKCFyZXQpCiAJCQkJdjRsX3ByaW50X3BpeF9mbXRfbXBsYW5lKHZmZCwgJmYtPmZtdC5waXhfbXApOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWToKLQkJCWlmIChvcHMtPnZpZGlvY19nX2ZtdF92aWRfb3V0X292ZXJsYXkpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXRfb3ZlcmxheSkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdmlkX291dF9vdmVybGF5KGZpbGUsCiAJCQkJICAgICAgIGZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6Ci0JCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdmJpX2NhcCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfZ19mbXRfdmJpX2NhcCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdmJpX2NhcChmaWxlLCBmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQ6Ci0JCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdmJpX291dCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfZ19mbXRfdmJpX291dCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdmJpX291dChmaWxlLCBmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRToKLQkJCWlmIChvcHMtPnZpZGlvY19nX2ZtdF9zbGljZWRfdmJpX2NhcCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfZ19mbXRfc2xpY2VkX3ZiaV9jYXApKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3NsaWNlZF92YmlfY2FwKGZpbGUsCiAJCQkJCQkJCQlmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUOgotCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3NsaWNlZF92Ymlfb3V0KQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19nX2ZtdF9zbGljZWRfdmJpX291dCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfc2xpY2VkX3ZiaV9vdXQoZmlsZSwKIAkJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfUFJJVkFURToKLQkJCWlmIChvcHMtPnZpZGlvY19nX2ZtdF90eXBlX3ByaXZhdGUpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2dfZm10X3R5cGVfcHJpdmF0ZSkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdHlwZV9wcml2YXRlKGZpbGUsCiAJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQl9CisJCWlmICh1bmxpa2VseShyZXQgPT0gLUVOT1RUWSAmJiBoYXZlX2ZtdF9vcHMoZykpKQorCQkJcmV0ID0gLUVJTlZBTDsKIAogCQlicmVhazsKIAl9CkBAIC04MjQsNiArNzA5LDE0IEBACiAJewogCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSAoc3RydWN0IHY0bDJfZm9ybWF0ICopYXJnOwogCisJCWlmICghaGF2ZV9mbXRfb3BzKHMpKQorCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAtRUlOVkFMOworCiAJCS8qIEZJWE1FOiBTaG91bGQgYmUgb25lIGR1bXAgcGVyIHR5cGUgKi8KIAkJZGJnYXJnKGNtZCwgInR5cGU9JXNcbiIsIHBydF9uYW1lcyhmLT50eXBlLCB2NGwyX3R5cGVfbmFtZXMpKTsKIApAQCAtODMxLDQ0ICs3MjQsMTUgQEAKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQucGl4KTsKIAkJCXY0bF9wcmludF9waXhfZm10KHZmZCwgJmYtPmZtdC5waXgpOwotCQkJaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9jYXApIHsKKwkJCWlmIChvcHMtPnZpZGlvY19zX2ZtdF92aWRfY2FwKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9jYXAoZmlsZSwgZmgsIGYpOwotCQkJfSBlbHNlIGlmIChvcHMtPnZpZGlvY19zX2ZtdF92aWRfY2FwX21wbGFuZSkgewotCQkJCWlmIChmbXRfc3BfdG9fbXAoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9jYXBfbXBsYW5lKGZpbGUsIGZoLAotCQkJCQkJCQkJJmZfY29weSk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoZl9jb3B5LmZtdC5waXhfbXAubnVtX3BsYW5lcyA+IDEpIHsKLQkJCQkJLyogRHJpdmVycyBzaG91bGRuJ3QgYWRqdXN0IGZyb20gMS1wbGFuZQotCQkJCQkgKiB0byBtb3JlIHRoYW4gMS1wbGFuZSBmb3JtYXRzICovCi0JCQkJCXJldCA9IC1FQlVTWTsKLQkJCQkJV0FSTl9PTigxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJcmV0ID0gZm10X21wX3RvX3NwKCZmX2NvcHksIGYpOwotCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORToKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC5waXhfbXApOwogCQkJdjRsX3ByaW50X3BpeF9mbXRfbXBsYW5lKHZmZCwgJmYtPmZtdC5waXhfbXApOwotCQkJaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9jYXBfbXBsYW5lKSB7CisJCQlpZiAob3BzLT52aWRpb2Nfc19mbXRfdmlkX2NhcF9tcGxhbmUpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19mbXRfdmlkX2NhcF9tcGxhbmUoZmlsZSwKIAkJCQkJCQkJCWZoLCBmKTsKLQkJCX0gZWxzZSBpZiAob3BzLT52aWRpb2Nfc19mbXRfdmlkX2NhcCAmJgotCQkJCQlmLT5mbXQucGl4X21wLm51bV9wbGFuZXMgPT0gMSkgewotCQkJCWlmIChmbXRfbXBfdG9fc3AoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9jYXAoZmlsZSwKLQkJCQkJCQkJZmgsICZmX2NvcHkpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJcmV0ID0gZm10X3NwX3RvX21wKCZmX2NvcHksIGYpOwotCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10Lndpbik7CkBAIC04NzksNDQgKzc0MywxNSBAQAogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnBpeCk7CiAJCQl2NGxfcHJpbnRfcGl4X2ZtdCh2ZmQsICZmLT5mbXQucGl4KTsKLQkJCWlmIChvcHMtPnZpZGlvY19zX2ZtdF92aWRfb3V0KSB7CisJCQlpZiAob3BzLT52aWRpb2Nfc19mbXRfdmlkX291dCkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF92aWRfb3V0KGZpbGUsIGZoLCBmKTsKLQkJCX0gZWxzZSBpZiAob3BzLT52aWRpb2Nfc19mbXRfdmlkX291dF9tcGxhbmUpIHsKLQkJCQlpZiAoZm10X3NwX3RvX21wKGYsICZmX2NvcHkpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF92aWRfb3V0X21wbGFuZShmaWxlLCBmaCwKLQkJCQkJCQkJCSZmX2NvcHkpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGZfY29weS5mbXQucGl4X21wLm51bV9wbGFuZXMgPiAxKSB7Ci0JCQkJCS8qIERyaXZlcnMgc2hvdWxkbid0IGFkanVzdCBmcm9tIDEtcGxhbmUKLQkJCQkJICogdG8gbW9yZSB0aGFuIDEtcGxhbmUgZm9ybWF0cyAqLwotCQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQkJCVdBUk5fT04oMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXJldCA9IGZtdF9tcF90b19zcCgmZl9jb3B5LCBmKTsKLQkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORToKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC5waXhfbXApOwogCQkJdjRsX3ByaW50X3BpeF9mbXRfbXBsYW5lKHZmZCwgJmYtPmZtdC5waXhfbXApOwotCQkJaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9vdXRfbXBsYW5lKSB7CisJCQlpZiAob3BzLT52aWRpb2Nfc19mbXRfdmlkX291dF9tcGxhbmUpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19mbXRfdmlkX291dF9tcGxhbmUoZmlsZSwKIAkJCQkJCQkJCWZoLCBmKTsKLQkJCX0gZWxzZSBpZiAob3BzLT52aWRpb2Nfc19mbXRfdmlkX291dCAmJgotCQkJCQlmLT5mbXQucGl4X21wLm51bV9wbGFuZXMgPT0gMSkgewotCQkJCWlmIChmbXRfbXBfdG9fc3AoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9vdXQoZmlsZSwKLQkJCQkJCQkJZmgsICZmX2NvcHkpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJcmV0ID0gZm10X21wX3RvX3NwKCZmX2NvcHksIGYpOwotCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWToKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC53aW4pOwpAQCAtOTI2LDI5ICs3NjEsMzAgQEAKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQudmJpKTsKLQkJCWlmIChvcHMtPnZpZGlvY19zX2ZtdF92YmlfY2FwKQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19zX2ZtdF92YmlfY2FwKSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF92YmlfY2FwKGZpbGUsIGZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVDoKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC52YmkpOwotCQkJaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZiaV9vdXQpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX3NfZm10X3ZiaV9vdXQpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZm10X3ZiaV9vdXQoZmlsZSwgZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQuc2xpY2VkKTsKLQkJCWlmIChvcHMtPnZpZGlvY19zX2ZtdF9zbGljZWRfdmJpX2NhcCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2Nfc19mbXRfc2xpY2VkX3ZiaV9jYXApKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZm10X3NsaWNlZF92YmlfY2FwKGZpbGUsCiAJCQkJCQkJCQlmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnNsaWNlZCk7Ci0JCQlpZiAob3BzLT52aWRpb2Nfc19mbXRfc2xpY2VkX3ZiaV9vdXQpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX3NfZm10X3NsaWNlZF92Ymlfb3V0KSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF9zbGljZWRfdmJpX291dChmaWxlLAogCQkJCQkJCQkJZmgsIGYpOworCiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6CiAJCQkvKiBDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQucmF3X2RhdGEpOyA8LSBkb2VzIG5vdGhpbmcgKi8KLQkJCWlmIChvcHMtPnZpZGlvY19zX2ZtdF90eXBlX3ByaXZhdGUpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX3NfZm10X3R5cGVfcHJpdmF0ZSkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19mbXRfdHlwZV9wcml2YXRlKGZpbGUsCiAJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwpAQCAtOTY1LDEzMiArODAxLDc3IEBACiAJCXN3aXRjaCAoZi0+dHlwZSkgewogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC5waXgpOwotCQkJaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX2NhcCkgeworCQkJaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX2NhcCkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgZmgsIGYpOwotCQkJfSBlbHNlIGlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9jYXBfbXBsYW5lKSB7Ci0JCQkJaWYgKGZtdF9zcF90b19tcChmLCAmZl9jb3B5KSkKLQkJCQkJYnJlYWs7Ci0JCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZShmaWxlLAotCQkJCQkJCQlmaCwgJmZfY29weSk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoZl9jb3B5LmZtdC5waXhfbXAubnVtX3BsYW5lcyA+IDEpIHsKLQkJCQkJLyogRHJpdmVycyBzaG91bGRuJ3QgYWRqdXN0IGZyb20gMS1wbGFuZQotCQkJCQkgKiB0byBtb3JlIHRoYW4gMS1wbGFuZSBmb3JtYXRzICovCi0JCQkJCXJldCA9IC1FQlVTWTsKLQkJCQkJV0FSTl9PTigxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXJldCA9IGZtdF9tcF90b19zcCgmZl9jb3B5LCBmKTsKLQkJCX0KIAkJCWlmICghcmV0KQogCQkJCXY0bF9wcmludF9waXhfZm10KHZmZCwgJmYtPmZtdC5waXgpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORToKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC5waXhfbXApOwotCQkJaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX2NhcF9tcGxhbmUpIHsKKwkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9jYXBfbXBsYW5lKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX2NhcF9tcGxhbmUoZmlsZSwKIAkJCQkJCQkJCSBmaCwgZik7Ci0JCQl9IGVsc2UgaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX2NhcCAmJgotCQkJCQlmLT5mbXQucGl4X21wLm51bV9wbGFuZXMgPT0gMSkgewotCQkJCWlmIChmbXRfbXBfdG9fc3AoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLAotCQkJCQkJCQkgIGZoLCAmZl9jb3B5KTsKLQkJCQlpZiAocmV0KQotCQkJCQlicmVhazsKLQotCQkJCXJldCA9IGZtdF9zcF90b19tcCgmZl9jb3B5LCBmKTsKLQkJCX0KIAkJCWlmICghcmV0KQogCQkJCXY0bF9wcmludF9waXhfZm10X21wbGFuZSh2ZmQsICZmLT5mbXQucGl4X21wKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC53aW4pOwotCQkJaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX292ZXJsYXkpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX292ZXJsYXkpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX292ZXJsYXkoZmlsZSwKIAkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQucGl4KTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXQpIHsKKwkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXQpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0KGZpbGUsIGZoLCBmKTsKLQkJCX0gZWxzZSBpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0X21wbGFuZSkgewotCQkJCWlmIChmbXRfc3BfdG9fbXAoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX291dF9tcGxhbmUoZmlsZSwKLQkJCQkJCQkJZmgsICZmX2NvcHkpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGZfY29weS5mbXQucGl4X21wLm51bV9wbGFuZXMgPiAxKSB7Ci0JCQkJCS8qIERyaXZlcnMgc2hvdWxkbid0IGFkanVzdCBmcm9tIDEtcGxhbmUKLQkJCQkJICogdG8gbW9yZSB0aGFuIDEtcGxhbmUgZm9ybWF0cyAqLwotCQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQkJCVdBUk5fT04oMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXQgPSBmbXRfbXBfdG9fc3AoJmZfY29weSwgZik7Ci0JCQl9CiAJCQlpZiAoIXJldCkKIAkJCQl2NGxfcHJpbnRfcGl4X2ZtdCh2ZmQsICZmLT5mbXQucGl4KTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORToKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC5waXhfbXApOwotCQkJaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX291dF9tcGxhbmUpIHsKKwkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXRfbXBsYW5lKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX291dF9tcGxhbmUoZmlsZSwKIAkJCQkJCQkJCSBmaCwgZik7Ci0JCQl9IGVsc2UgaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX291dCAmJgotCQkJCQlmLT5mbXQucGl4X21wLm51bV9wbGFuZXMgPT0gMSkgewotCQkJCWlmIChmbXRfbXBfdG9fc3AoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX291dChmaWxlLAotCQkJCQkJCQkgIGZoLCAmZl9jb3B5KTsKLQkJCQlpZiAocmV0KQotCQkJCQlicmVhazsKLQotCQkJCXJldCA9IGZtdF9zcF90b19tcCgmZl9jb3B5LCBmKTsKLQkJCX0KIAkJCWlmICghcmV0KQogCQkJCXY0bF9wcmludF9waXhfZm10X21wbGFuZSh2ZmQsICZmLT5mbXQucGl4X21wKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVk6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQud2luKTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXRfb3ZlcmxheSkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0X292ZXJsYXkpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX291dF9vdmVybGF5KGZpbGUsCiAJCQkJICAgICAgIGZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQudmJpKTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZiaV9jYXApCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX3RyeV9mbXRfdmJpX2NhcCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2ZtdF92YmlfY2FwKGZpbGUsIGZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVDoKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC52YmkpOwotCQkJaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdmJpX291dCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0KSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3ZiaV9vdXQoZmlsZSwgZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQuc2xpY2VkKTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3NsaWNlZF92YmlfY2FwKQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY190cnlfZm10X3NsaWNlZF92YmlfY2FwKSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3NsaWNlZF92YmlfY2FwKGZpbGUsCiAJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQ6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQuc2xpY2VkKTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3NsaWNlZF92Ymlfb3V0KQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY190cnlfZm10X3NsaWNlZF92Ymlfb3V0KSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3NsaWNlZF92Ymlfb3V0KGZpbGUsCiAJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfUFJJVkFURToKIAkJCS8qIENMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC5yYXdfZGF0YSk7IDwtIGRvZXMgbm90aGluZyAqLwotCQkJaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdHlwZV9wcml2YXRlKQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY190cnlfZm10X3R5cGVfcHJpdmF0ZSkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2ZtdF90eXBlX3ByaXZhdGUoZmlsZSwKIAkJCQkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CiAJCX0KLQorCQlpZiAodW5saWtlbHkocmV0ID09IC1FTk9UVFkgJiYgaGF2ZV9mbXRfb3BzKHRyeSkpKQorCQkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCS8qIEZJWE1FOiBUaG9zZSBidWYgcmVxcyBjb3VsZCBiZSBoYW5kbGVkIGhlcmUsCkBAIC0xMTAzLDYgKzg4NCwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2NfcmVxYnVmcykKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJcmV0ID0gY2hlY2tfZm10KG9wcywgcC0+dHlwZSk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKQEAgLTExNjgsNiArOTUzLDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19vdmVybGF5KQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAidmFsdWU9JWRcbiIsICppKTsKIAkJcmV0ID0gb3BzLT52aWRpb2Nfb3ZlcmxheShmaWxlLCBmaCwgKmkpOwogCQlicmVhazsKQEAgLTExOTMsNiArOTgyLDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX2ZidWYpCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCWRiZ2FyZyhjbWQsICJjYXBhYmlsaXR5PTB4JXgsIGZsYWdzPSVkLCBiYXNlPTB4JTA4bHhcbiIsCiAJCQlwLT5jYXBhYmlsaXR5LCBwLT5mbGFncywgKHVuc2lnbmVkIGxvbmcpcC0+YmFzZSk7CiAJCXY0bF9wcmludF9waXhfZm10KHZmZCwgJnAtPmZtdCk7CkBAIC0xMjA1LDYgKzk5OCwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc3RyZWFtb24pCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCWRiZ2FyZyhjbWQsICJ0eXBlPSVzXG4iLCBwcnRfbmFtZXMoaSwgdjRsMl90eXBlX25hbWVzKSk7CiAJCXJldCA9IG9wcy0+dmlkaW9jX3N0cmVhbW9uKGZpbGUsIGZoLCBpKTsKIAkJYnJlYWs7CkBAIC0xMjE1LDYgKzEwMTIsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3N0cmVhbW9mZikKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJZGJnYXJnKGNtZCwgInR5cGU9JXNcbiIsIHBydF9uYW1lcyhpLCB2NGwyX3R5cGVfbmFtZXMpKTsKIAkJcmV0ID0gb3BzLT52aWRpb2Nfc3RyZWFtb2ZmKGZpbGUsIGZoLCBpKTsKIAkJYnJlYWs7CkBAIC0xMjI3LDYgKzEwMjgsMTAgQEAKIAkJdW5zaWduZWQgaW50IGluZGV4ID0gcC0+aW5kZXgsIGksIGogPSAwOwogCQljb25zdCBjaGFyICpkZXNjciA9ICIiOwogCisJCWlmIChpZCA9PSAwKQorCQkJYnJlYWs7CisJCXJldCA9IC1FSU5WQUw7CisKIAkJLyogUmV0dXJuIG5vcm0gYXJyYXkgaW4gYSBjYW5vbmljYWwgd2F5ICovCiAJCWZvciAoaSA9IDA7IGkgPD0gaW5kZXggJiYgaWQ7IGkrKykgewogCQkJLyogbGFzdCBzdGQgdmFsdWUgaW4gdGhlIHN0YW5kYXJkcyBhcnJheSBpcyAwLCBzbyB0aGlzCkBAIC0xMjYyLDE2ICsxMDY3LDE1IEBACiAJewogCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CiAKLQkJcmV0ID0gMDsKIAkJLyogQ2FsbHMgdGhlIHNwZWNpZmljIGhhbmRsZXIgKi8KIAkJaWYgKG9wcy0+dmlkaW9jX2dfc3RkKQogCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19zdGQoZmlsZSwgZmgsIGlkKTsKLQkJZWxzZSBpZiAodmZkLT5jdXJyZW50X25vcm0pCisJCWVsc2UgaWYgKHZmZC0+Y3VycmVudF9ub3JtKSB7CisJCQlyZXQgPSAwOwogCQkJKmlkID0gdmZkLT5jdXJyZW50X25vcm07Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU5WQUw7CisJCX0KIAotCQlpZiAoIXJldCkKKwkJaWYgKGxpa2VseSghcmV0KSkKIAkJCWRiZ2FyZyhjbWQsICJzdGQ9MHglMDhMeFxuIiwgKGxvbmcgbG9uZyB1bnNpZ25lZCkqaWQpOwogCQlicmVhazsKIAl9CkBAIC0xMjgxLDE1ICsxMDg1LDIwIEBACiAKIAkJZGJnYXJnKGNtZCwgInN0ZD0lMDhMeFxuIiwgKGxvbmcgbG9uZyB1bnNpZ25lZCkqaWQpOwogCisJCWlmICghb3BzLT52aWRpb2Nfc19zdGQpCisJCQlicmVhazsKKworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gLUVJTlZBTDsKIAkJbm9ybSA9ICgqaWQpICYgdmZkLT50dm5vcm1zOwogCQlpZiAodmZkLT50dm5vcm1zICYmICFub3JtKQkvKiBDaGVjayBpZiBzdGQgaXMgc3VwcG9ydGVkICovCiAJCQlicmVhazsKIAogCQkvKiBDYWxscyB0aGUgc3BlY2lmaWMgaGFuZGxlciAqLwotCQlpZiAob3BzLT52aWRpb2Nfc19zdGQpCi0JCQlyZXQgPSBvcHMtPnZpZGlvY19zX3N0ZChmaWxlLCBmaCwgJm5vcm0pOwotCQllbHNlCi0JCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSBvcHMtPnZpZGlvY19zX3N0ZChmaWxlLCBmaCwgJm5vcm0pOwogCiAJCS8qIFVwZGF0ZXMgc3RhbmRhcmQgaW5mb3JtYXRpb24gKi8KIAkJaWYgKHJldCA+PSAwKQpAQCAtMTMwMiw2ICsxMTExLDE0IEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19xdWVyeXN0ZCkKIAkJCWJyZWFrOworCQkvKgorCQkgKiBJZiBub3RoaW5nIGRldGVjdGVkLCBpdCBzaG91bGQgcmV0dXJuIGFsbCBzdXBwb3J0ZWQKKwkJICogRHJpdmVycyBqdXN0IG5lZWQgdG8gbWFzayB0aGUgc3RkIGFyZ3VtZW50LCBpbiBvcmRlcgorCQkgKiB0byByZW1vdmUgdGhlIHN0YW5kYXJkcyB0aGF0IGRvbid0IGFwcGx5IGZyb20gdGhlIG1hc2suCisJCSAqIFRoaXMgbWVhbnMgdGhhdCB0dW5lcnMsIGF1ZGlvIGFuZCB2aWRlbyBkZWNvZGVycyBjYW4gam9pbgorCQkgKiB0aGVpciBlZmZvcnRzIHRvIGltcHJvdmUgdGhlIHN0YW5kYXJkcyBkZXRlY3Rpb24KKwkJICovCisJCSpwID0gdmZkLT50dm5vcm1zOwogCQlyZXQgPSBvcHMtPnZpZGlvY19xdWVyeXN0ZChmaWxlLCBmaCwgYXJnKTsKIAkJaWYgKCFyZXQpCiAJCQlkYmdhcmcoY21kLCAiZGV0ZWN0ZWQgc3RkPSUwOEx4XG4iLApAQCAtMTM1OCw2ICsxMTc1LDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX2lucHV0KQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAidmFsdWU9JWRcbiIsICppKTsKIAkJcmV0ID0gb3BzLT52aWRpb2Nfc19pbnB1dChmaWxlLCBmaCwgKmkpOwogCQlicmVhazsKQEAgLTE0MTAsNiArMTIzMSwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc19vdXRwdXQpCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCWRiZ2FyZyhjbWQsICJ2YWx1ZT0lZFxuIiwgKmkpOwogCQlyZXQgPSBvcHMtPnZpZGlvY19zX291dHB1dChmaWxlLCBmaCwgKmkpOwogCQlicmVhazsKQEAgLTE0NzksNiArMTMwNCwxMCBAQAogCQlpZiAoISh2ZmggJiYgdmZoLT5jdHJsX2hhbmRsZXIpICYmICF2ZmQtPmN0cmxfaGFuZGxlciAmJgogCQkJIW9wcy0+dmlkaW9jX3NfY3RybCAmJiAhb3BzLT52aWRpb2Nfc19leHRfY3RybHMpCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAKIAkJZGJnYXJnKGNtZCwgImlkPTB4JXgsIHZhbHVlPSVkXG4iLCBwLT5pZCwgcC0+dmFsdWUpOwogCkBAIC0xNTA0LDYgKzEzMzMsOCBAQAogCQljdHJsLnZhbHVlID0gcC0+dmFsdWU7CiAJCWlmIChjaGVja19leHRfY3RybHMoJmN0cmxzLCAxKSkKIAkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZXh0X2N0cmxzKGZpbGUsIGZoLCAmY3RybHMpOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CiAJY2FzZSBWSURJT0NfR19FWFRfQ1RSTFM6CkBAIC0xNTE1LDggKzEzNDYsMTAgQEAKIAkJCXJldCA9IHY0bDJfZ19leHRfY3RybHModmZoLT5jdHJsX2hhbmRsZXIsIHApOwogCQllbHNlIGlmICh2ZmQtPmN0cmxfaGFuZGxlcikKIAkJCXJldCA9IHY0bDJfZ19leHRfY3RybHModmZkLT5jdHJsX2hhbmRsZXIsIHApOwotCQllbHNlIGlmIChvcHMtPnZpZGlvY19nX2V4dF9jdHJscyAmJiBjaGVja19leHRfY3RybHMocCwgMCkpCi0JCQlyZXQgPSBvcHMtPnZpZGlvY19nX2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CisJCWVsc2UgaWYgKG9wcy0+dmlkaW9jX2dfZXh0X2N0cmxzKQorCQkJcmV0ID0gY2hlY2tfZXh0X2N0cmxzKHAsIDApID8KKwkJCQlvcHMtPnZpZGlvY19nX2V4dF9jdHJscyhmaWxlLCBmaCwgcCkgOgorCQkJCS1FSU5WQUw7CiAJCWVsc2UKIAkJCWJyZWFrOwogCQl2NGxfcHJpbnRfZXh0X2N0cmxzKGNtZCwgdmZkLCBwLCAhcmV0KTsKQEAgLTE1MzAsNiArMTM2MywxMCBAQAogCQlpZiAoISh2ZmggJiYgdmZoLT5jdHJsX2hhbmRsZXIpICYmICF2ZmQtPmN0cmxfaGFuZGxlciAmJgogCQkJCSFvcHMtPnZpZGlvY19zX2V4dF9jdHJscykKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJdjRsX3ByaW50X2V4dF9jdHJscyhjbWQsIHZmZCwgcCwgMSk7CiAJCWlmICh2ZmggJiYgdmZoLT5jdHJsX2hhbmRsZXIpCiAJCQlyZXQgPSB2NGwyX3NfZXh0X2N0cmxzKHZmaCwgdmZoLT5jdHJsX2hhbmRsZXIsIHApOwpAQCAtMTUzNyw2ICsxMzc0LDggQEAKIAkJCXJldCA9IHY0bDJfc19leHRfY3RybHMoTlVMTCwgdmZkLT5jdHJsX2hhbmRsZXIsIHApOwogCQllbHNlIGlmIChjaGVja19leHRfY3RybHMocCwgMCkpCiAJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIAljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTOgpAQCAtMTU1NCw2ICsxMzkzLDggQEAKIAkJCXJldCA9IHY0bDJfdHJ5X2V4dF9jdHJscyh2ZmQtPmN0cmxfaGFuZGxlciwgcCk7CiAJCWVsc2UgaWYgKGNoZWNrX2V4dF9jdHJscyhwLCAwKSkKIAkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9leHRfY3RybHMoZmlsZSwgZmgsIHApOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CiAJY2FzZSBWSURJT0NfUVVFUllNRU5VOgpAQCAtMTYxNCw2ICsxNDU1LDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX2F1ZGlvKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9MHgleCwgIgogCQkJCQkibW9kZT0weCV4XG4iLCBwLT5pbmRleCwgcC0+bmFtZSwKIAkJCQkJcC0+Y2FwYWJpbGl0eSwgcC0+bW9kZSk7CkBAIC0xNjU0LDYgKzE0OTksMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfYXVkb3V0KQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKIAkJCQkJIm1vZGU9JWRcbiIsIHAtPmluZGV4LCBwLT5uYW1lLAogCQkJCQlwLT5jYXBhYmlsaXR5LCBwLT5tb2RlKTsKQEAgLTE2ODMsNiArMTUzMiwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc19tb2R1bGF0b3IpCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCWRiZ2FyZyhjbWQsICJpbmRleD0lZCwgbmFtZT0lcywgY2FwYWJpbGl0eT0lZCwgIgogCQkJCSJyYW5nZWxvdz0lZCwgcmFuZ2VoaWdoPSVkLCB0eHN1YmNoYW5zPSVkXG4iLAogCQkJCXAtPmluZGV4LCBwLT5uYW1lLCBwLT5jYXBhYmlsaXR5LCBwLT5yYW5nZWxvdywKQEAgLTE3MDksNiArMTU2MiwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc19jcm9wKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAidHlwZT0lc1xuIiwgcHJ0X25hbWVzKHAtPnR5cGUsIHY0bDJfdHlwZV9uYW1lcykpOwogCQlkYmdyZWN0KHZmZCwgIiIsICZwLT5jKTsKIAkJcmV0ID0gb3BzLT52aWRpb2Nfc19jcm9wKGZpbGUsIGZoLCBwKTsKQEAgLTE3NTIsMTEgKzE2MDksMTUgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX2dfanBlZ2NvbXApCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCWRiZ2FyZyhjbWQsICJxdWFsaXR5PSVkLCBBUFBuPSVkLCBBUFBfbGVuPSVkLCAiCiAJCQkJCSJDT01fbGVuPSVkLCBqcGVnX21hcmtlcnM9JWRcbiIsCiAJCQkJCXAtPnF1YWxpdHksIHAtPkFQUG4sIHAtPkFQUF9sZW4sCiAJCQkJCXAtPkNPTV9sZW4sIHAtPmpwZWdfbWFya2Vycyk7Ci0JCQlyZXQgPSBvcHMtPnZpZGlvY19zX2pwZWdjb21wKGZpbGUsIGZoLCBwKTsKKwkJcmV0ID0gb3BzLT52aWRpb2Nfc19qcGVnY29tcChmaWxlLCBmaCwgcCk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFZJRElPQ19HX0VOQ19JTkRFWDoKQEAgLTE3NzcsNiArMTYzOCwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2NfZW5jb2Rlcl9jbWQpCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCXJldCA9IG9wcy0+dmlkaW9jX2VuY29kZXJfY21kKGZpbGUsIGZoLCBwKTsKIAkJaWYgKCFyZXQpCiAJCQlkYmdhcmcoY21kLCAiY21kPSVkLCBmbGFncz0leFxuIiwgcC0+Y21kLCBwLT5mbGFncyk7CkBAIC0xNzk3LDYgKzE2NjIsOCBAQAogCXsKIAkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcCA9IGFyZzsKIAorCQlpZiAoIW9wcy0+dmlkaW9jX2dfcGFybSAmJiAhdmZkLT5jdXJyZW50X25vcm0pCisJCQlicmVhazsKIAkJaWYgKG9wcy0+dmlkaW9jX2dfcGFybSkgewogCQkJcmV0ID0gY2hlY2tfZm10KG9wcywgcC0+dHlwZSk7CiAJCQlpZiAocmV0KQpAQCAtMTgwNSwxNCArMTY3MiwxMyBAQAogCQl9IGVsc2UgewogCQkJdjRsMl9zdGRfaWQgc3RkID0gdmZkLT5jdXJyZW50X25vcm07CiAKKwkJCXJldCA9IC1FSU5WQUw7CiAJCQlpZiAocC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCiAJCQkJYnJlYWs7CiAKIAkJCXJldCA9IDA7CiAJCQlpZiAob3BzLT52aWRpb2NfZ19zdGQpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19zdGQoZmlsZSwgZmgsICZzdGQpOwotCQkJZWxzZSBpZiAoc3RkID09IDApCi0JCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWlmIChyZXQgPT0gMCkKIAkJCQl2NGwyX3ZpZGVvX3N0ZF9mcmFtZV9wZXJpb2Qoc3RkLAogCQkJCQkJICAgICZwLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lKTsKQEAgLTE4MjcsNiArMTY5MywxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc19wYXJtKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlyZXQgPSBjaGVja19mbXQob3BzLCBwLT50eXBlKTsKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwpAQCAtMTg2Miw2ICsxNzMyLDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX3R1bmVyKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlwLT50eXBlID0gKHZmZC0+dmZsX3R5cGUgPT0gVkZMX1RZUEVfUkFESU8pID8KIAkJCVY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsKIAkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCBuYW1lPSVzLCB0eXBlPSVkLCAiCkBAIC0xODk2LDYgKzE3NzAsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfZnJlcXVlbmN5KQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAidHVuZXI9JWQsIHR5cGU9JWQsIGZyZXF1ZW5jeT0lZFxuIiwKIAkJCQlwLT50dW5lciwgcC0+dHlwZSwgcC0+ZnJlcXVlbmN5KTsKIAkJcmV0ID0gb3BzLT52aWRpb2Nfc19mcmVxdWVuY3koZmlsZSwgZmgsIHApOwpAQCAtMTk3MCw2ICsxODQ4LDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX2h3X2ZyZXFfc2VlaykKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJdHlwZSA9ICh2ZmQtPnZmbF90eXBlID09IFZGTF9UWVBFX1JBRElPKSA/CiAJCQlWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCWRiZ2FyZyhjbWQsCkBAIC0yMDc0LDYgKzE5NTYsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfZHZfcHJlc2V0KQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCiAJCWRiZ2FyZyhjbWQsICJwcmVzZXQ9JWRcbiIsIHAtPnByZXNldCk7CiAJCXJldCA9IG9wcy0+dmlkaW9jX3NfZHZfcHJlc2V0KGZpbGUsIGZoLCBwKTsKQEAgLTIxMDksNiArMTk5NSwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc19kdl90aW1pbmdzKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCiAJCXN3aXRjaCAocC0+dHlwZSkgewogCQljYXNlIFY0TDJfRFZfQlRfNjU2XzExMjA6CkBAIC0yMjE2LDIwICsyMTA2LDQ3IEBACiAJCWRiZ2FyZyhjbWQsICJ0eXBlPTB4JTguOHgiLCBzdWItPnR5cGUpOwogCQlicmVhazsKIAl9Ci0JZGVmYXVsdDoKKwljYXNlIFZJRElPQ19DUkVBVEVfQlVGUzoKIAl7Ci0JCWJvb2wgdmFsaWRfcHJpbyA9IHRydWU7CisJCXN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzICpjcmVhdGUgPSBhcmc7CiAKLQkJaWYgKCFvcHMtPnZpZGlvY19kZWZhdWx0KQorCQlpZiAoIW9wcy0+dmlkaW9jX2NyZWF0ZV9idWZzKQogCQkJYnJlYWs7Ci0JCWlmICh1c2VfZmhfcHJpbykKLQkJCXZhbGlkX3ByaW8gPSB2NGwyX3ByaW9fY2hlY2sodmZkLT5wcmlvLCB2ZmgtPnByaW8pID49IDA7Ci0JCXJldCA9IG9wcy0+dmlkaW9jX2RlZmF1bHQoZmlsZSwgZmgsIHZhbGlkX3ByaW8sIGNtZCwgYXJnKTsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IGNoZWNrX2ZtdChvcHMsIGNyZWF0ZS0+Zm9ybWF0LnR5cGUpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJcmV0ID0gb3BzLT52aWRpb2NfY3JlYXRlX2J1ZnMoZmlsZSwgZmgsIGNyZWF0ZSk7CisKKwkJZGJnYXJnKGNtZCwgImNvdW50PSVkIEAgJWRcbiIsIGNyZWF0ZS0+Y291bnQsIGNyZWF0ZS0+aW5kZXgpOwogCQlicmVhazsKIAl9CisJY2FzZSBWSURJT0NfUFJFUEFSRV9CVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmIgPSBhcmc7CisKKwkJaWYgKCFvcHMtPnZpZGlvY19wcmVwYXJlX2J1ZikKKwkJCWJyZWFrOworCQlyZXQgPSBjaGVja19mbXQob3BzLCBiLT50eXBlKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXJldCA9IG9wcy0+dmlkaW9jX3ByZXBhcmVfYnVmKGZpbGUsIGZoLCBiKTsKKworCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQiLCBiLT5pbmRleCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlpZiAoIW9wcy0+dmlkaW9jX2RlZmF1bHQpCisJCQlicmVhazsKKwkJcmV0ID0gb3BzLT52aWRpb2NfZGVmYXVsdChmaWxlLCBmaCwgcmV0X3ByaW8gPj0gMCwgY21kLCBhcmcpOworCQlicmVhazsKIAl9IC8qIHN3aXRjaCAqLwogCi1leGl0X3ByaW86CiAJaWYgKHZmZC0+ZGVidWcgJiBWNEwyX0RFQlVHX0lPQ1RMX0FSRykgewogCQlpZiAocmV0IDwgMCkgewogCQkJdjRsX3ByaW50X2lvY3RsKHZmZC0+bmFtZSwgY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1tZW0ybWVtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItbWVtMm1lbS5jCmluZGV4IDNiMTViZjUuLjk3NWQwZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1tZW0ybWVtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLW1lbTJtZW0uYwpAQCAtOTcsMTEgKzk3LDEyIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcV9jdHgtPnJkeV9zcGlubG9jaywgZmxhZ3MpOwogCi0JaWYgKGxpc3RfZW1wdHkoJnFfY3R4LT5yZHlfcXVldWUpKQotCQlnb3RvIGVuZDsKKwlpZiAobGlzdF9lbXB0eSgmcV9jdHgtPnJkeV9xdWV1ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcV9jdHgtPnJkeV9zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAliID0gbGlzdF9lbnRyeShxX2N0eC0+cmR5X3F1ZXVlLm5leHQsIHN0cnVjdCB2NGwyX20ybV9idWZmZXIsIGxpc3QpOwotZW5kOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFfY3R4LT5yZHlfc3BpbmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gJmItPnZiOwogfQpAQCAtMTE3LDEyICsxMTgsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFfY3R4LT5yZHlfc3BpbmxvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnFfY3R4LT5yZHlfcXVldWUpKSB7Ci0JCWIgPSBsaXN0X2VudHJ5KHFfY3R4LT5yZHlfcXVldWUubmV4dCwgc3RydWN0IHY0bDJfbTJtX2J1ZmZlciwKLQkJCQlsaXN0KTsKLQkJbGlzdF9kZWwoJmItPmxpc3QpOwotCQlxX2N0eC0+bnVtX3JkeS0tOworCWlmIChsaXN0X2VtcHR5KCZxX2N0eC0+cmR5X3F1ZXVlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxX2N0eC0+cmR5X3NwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybiBOVUxMOwogCX0KKwliID0gbGlzdF9lbnRyeShxX2N0eC0+cmR5X3F1ZXVlLm5leHQsIHN0cnVjdCB2NGwyX20ybV9idWZmZXIsIGxpc3QpOworCWxpc3RfZGVsKCZiLT5saXN0KTsKKwlxX2N0eC0+bnVtX3JkeS0tOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFfY3R4LT5yZHlfc3BpbmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAmYi0+dmI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItc3ViZGV2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItc3ViZGV2LmMKaW5kZXggYjc5NjdjOS4uNjVhZGU1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLXN1YmRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1zdWJkZXYuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC0xNzMsNiArMTc0LDI1IEBACiAKIAljYXNlIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDoKIAkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHVuc3Vic2NyaWJlX2V2ZW50LCB2ZmgsIGFyZyk7CisKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJY2FzZSBWSURJT0NfREJHX0dfUkVHSVNURVI6CisJeworCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnAgPSBhcmc7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIGdfcmVnaXN0ZXIsIHApOworCX0KKwljYXNlIFZJRElPQ19EQkdfU19SRUdJU1RFUjoKKwl7CisJCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcCA9IGFyZzsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgc19yZWdpc3RlciwgcCk7CisJfQorI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfVklERU9fVjRMMl9TVUJERVZfQVBJKQogCWNhc2UgVklESU9DX1NVQkRFVl9HX0ZNVDogewogCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmb3JtYXQgPSBhcmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1jb3JlLmMKaW5kZXggMzAxNWU2MC4uOTVhM2Y1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWNvcmUuYwpAQCAtMzgsMTMgKzM4LDEzIEBACiAJKCgocSktPm9wcy0+b3ApID8gKChxKS0+b3BzLT5vcChhcmdzKSkgOiAwKQogCiAjZGVmaW5lIFY0TDJfQlVGRkVSX1NUQVRFX0ZMQUdTCShWNEwyX0JVRl9GTEFHX01BUFBFRCB8IFY0TDJfQlVGX0ZMQUdfUVVFVUVEIHwgXAotCQkJCSBWNEwyX0JVRl9GTEFHX0RPTkUgfCBWNEwyX0JVRl9GTEFHX0VSUk9SKQorCQkJCSBWNEwyX0JVRl9GTEFHX0RPTkUgfCBWNEwyX0JVRl9GTEFHX0VSUk9SIHwgXAorCQkJCSBWNEwyX0JVRl9GTEFHX1BSRVBBUkVEKQogCiAvKioKICAqIF9fdmIyX2J1Zl9tZW1fYWxsb2MoKSAtIGFsbG9jYXRlIHZpZGVvIG1lbW9yeSBmb3IgdGhlIGdpdmVuIGJ1ZmZlcgogICovCi1zdGF0aWMgaW50IF9fdmIyX2J1Zl9tZW1fYWxsb2Moc3RydWN0IHZiMl9idWZmZXIgKnZiLAotCQkJCXVuc2lnbmVkIGxvbmcgKnBsYW5lX3NpemVzKQorc3RhdGljIGludCBfX3ZiMl9idWZfbWVtX2FsbG9jKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3QgdmIyX3F1ZXVlICpxID0gdmItPnZiMl9xdWV1ZTsKIAl2b2lkICptZW1fcHJpdjsKQEAgLTUzLDEzICs1MywxMyBAQAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIHBsYW5lcyBpbiB0aGlzIGJ1ZmZlciAqLwogCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHZiLT5udW1fcGxhbmVzOyArK3BsYW5lKSB7CiAJCW1lbV9wcml2ID0gY2FsbF9tZW1vcChxLCBwbGFuZSwgYWxsb2MsIHEtPmFsbG9jX2N0eFtwbGFuZV0sCi0JCQkJCXBsYW5lX3NpemVzW3BsYW5lXSk7CisJCQkJICAgICAgcS0+cGxhbmVfc2l6ZXNbcGxhbmVdKTsKIAkJaWYgKElTX0VSUl9PUl9OVUxMKG1lbV9wcml2KSkKIAkJCWdvdG8gZnJlZTsKIAogCQkvKiBBc3NvY2lhdGUgYWxsb2NhdG9yIHByaXZhdGUgZGF0YSB3aXRoIHRoaXMgcGxhbmUgKi8KIAkJdmItPnBsYW5lc1twbGFuZV0ubWVtX3ByaXYgPSBtZW1fcHJpdjsKLQkJdmItPnY0bDJfcGxhbmVzW3BsYW5lXS5sZW5ndGggPSBwbGFuZV9zaXplc1twbGFuZV07CisJCXZiLT52NGwyX3BsYW5lc1twbGFuZV0ubGVuZ3RoID0gcS0+cGxhbmVfc2l6ZXNbcGxhbmVdOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTEwLDE4ICsxMTAsMjggQEAKICAqIF9fc2V0dXBfb2Zmc2V0cygpIC0gc2V0dXAgdW5pcXVlIG9mZnNldHMgKCJjb29raWVzIikgZm9yIGV2ZXJ5IHBsYW5lIGluCiAgKiBldmVyeSBidWZmZXIgb24gdGhlIHF1ZXVlCiAgKi8KLXN0YXRpYyB2b2lkIF9fc2V0dXBfb2Zmc2V0cyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQorc3RhdGljIHZvaWQgX19zZXR1cF9vZmZzZXRzKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCBuKQogewogCXVuc2lnbmVkIGludCBidWZmZXIsIHBsYW5lOwogCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKLQl1bnNpZ25lZCBsb25nIG9mZiA9IDA7CisJdW5zaWduZWQgbG9uZyBvZmY7CiAKLQlmb3IgKGJ1ZmZlciA9IDA7IGJ1ZmZlciA8IHEtPm51bV9idWZmZXJzOyArK2J1ZmZlcikgeworCWlmIChxLT5udW1fYnVmZmVycykgeworCQlzdHJ1Y3QgdjRsMl9wbGFuZSAqcDsKKwkJdmIgPSBxLT5idWZzW3EtPm51bV9idWZmZXJzIC0gMV07CisJCXAgPSAmdmItPnY0bDJfcGxhbmVzW3ZiLT5udW1fcGxhbmVzIC0gMV07CisJCW9mZiA9IFBBR0VfQUxJR04ocC0+bS5tZW1fb2Zmc2V0ICsgcC0+bGVuZ3RoKTsKKwl9IGVsc2UgeworCQlvZmYgPSAwOworCX0KKworCWZvciAoYnVmZmVyID0gcS0+bnVtX2J1ZmZlcnM7IGJ1ZmZlciA8IHEtPm51bV9idWZmZXJzICsgbjsgKytidWZmZXIpIHsKIAkJdmIgPSBxLT5idWZzW2J1ZmZlcl07CiAJCWlmICghdmIpCiAJCQljb250aW51ZTsKIAogCQlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCB2Yi0+bnVtX3BsYW5lczsgKytwbGFuZSkgeworCQkJdmItPnY0bDJfcGxhbmVzW3BsYW5lXS5sZW5ndGggPSBxLT5wbGFuZV9zaXplc1twbGFuZV07CiAJCQl2Yi0+djRsMl9wbGFuZXNbcGxhbmVdLm0ubWVtX29mZnNldCA9IG9mZjsKIAogCQkJZHByaW50aygzLCAiQnVmZmVyICVkLCBwbGFuZSAlZCBvZmZzZXQgMHglMDhseFxuIiwKQEAgLTE0MSw4ICsxNTEsNyBAQAogICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KICAqLwogc3RhdGljIGludCBfX3ZiMl9xdWV1ZV9hbGxvYyhzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBlbnVtIHY0bDJfbWVtb3J5IG1lbW9yeSwKLQkJCSAgICAgdW5zaWduZWQgaW50IG51bV9idWZmZXJzLCB1bnNpZ25lZCBpbnQgbnVtX3BsYW5lcywKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBwbGFuZV9zaXplc1tdKQorCQkJICAgICB1bnNpZ25lZCBpbnQgbnVtX2J1ZmZlcnMsIHVuc2lnbmVkIGludCBudW1fcGxhbmVzKQogewogCXVuc2lnbmVkIGludCBidWZmZXI7CiAJc3RydWN0IHZiMl9idWZmZXIgKnZiOwpAQCAtMTYzLDEzICsxNzIsMTMgQEAKIAkJdmItPnN0YXRlID0gVkIyX0JVRl9TVEFURV9ERVFVRVVFRDsKIAkJdmItPnZiMl9xdWV1ZSA9IHE7CiAJCXZiLT5udW1fcGxhbmVzID0gbnVtX3BsYW5lczsKLQkJdmItPnY0bDJfYnVmLmluZGV4ID0gYnVmZmVyOworCQl2Yi0+djRsMl9idWYuaW5kZXggPSBxLT5udW1fYnVmZmVycyArIGJ1ZmZlcjsKIAkJdmItPnY0bDJfYnVmLnR5cGUgPSBxLT50eXBlOwogCQl2Yi0+djRsMl9idWYubWVtb3J5ID0gbWVtb3J5OwogCiAJCS8qIEFsbG9jYXRlIHZpZGVvIGJ1ZmZlciBtZW1vcnkgZm9yIHRoZSBNTUFQIHR5cGUgKi8KIAkJaWYgKG1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQKSB7Ci0JCQlyZXQgPSBfX3ZiMl9idWZfbWVtX2FsbG9jKHZiLCBwbGFuZV9zaXplcyk7CisJCQlyZXQgPSBfX3ZiMl9idWZfbWVtX2FsbG9jKHZiKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlkcHJpbnRrKDEsICJGYWlsZWQgYWxsb2NhdGluZyBtZW1vcnkgZm9yICIKIAkJCQkJCSJidWZmZXIgJWRcbiIsIGJ1ZmZlcik7CkBAIC0xOTEsMTUgKzIwMCwxMyBAQAogCQkJfQogCQl9CiAKLQkJcS0+YnVmc1tidWZmZXJdID0gdmI7CisJCXEtPmJ1ZnNbcS0+bnVtX2J1ZmZlcnMgKyBidWZmZXJdID0gdmI7CiAJfQogCi0JcS0+bnVtX2J1ZmZlcnMgPSBidWZmZXI7Ci0KLQlfX3NldHVwX29mZnNldHMocSk7CisJX19zZXR1cF9vZmZzZXRzKHEsIGJ1ZmZlcik7CiAKIAlkcHJpbnRrKDEsICJBbGxvY2F0ZWQgJWQgYnVmZmVycywgJWQgcGxhbmUocykgZWFjaFxuIiwKLQkJCXEtPm51bV9idWZmZXJzLCBudW1fcGxhbmVzKTsKKwkJCWJ1ZmZlciwgbnVtX3BsYW5lcyk7CiAKIAlyZXR1cm4gYnVmZmVyOwogfQpAQCAtMjA3LDEyICsyMTQsMTMgQEAKIC8qKgogICogX192YjJfZnJlZV9tZW0oKSAtIHJlbGVhc2UgYWxsIHZpZGVvIGJ1ZmZlciBtZW1vcnkgZm9yIGEgZ2l2ZW4gcXVldWUKICAqLwotc3RhdGljIHZvaWQgX192YjJfZnJlZV9tZW0oc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3N0YXRpYyB2b2lkIF9fdmIyX2ZyZWVfbWVtKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCBidWZmZXJzKQogewogCXVuc2lnbmVkIGludCBidWZmZXI7CiAJc3RydWN0IHZiMl9idWZmZXIgKnZiOwogCi0JZm9yIChidWZmZXIgPSAwOyBidWZmZXIgPCBxLT5udW1fYnVmZmVyczsgKytidWZmZXIpIHsKKwlmb3IgKGJ1ZmZlciA9IHEtPm51bV9idWZmZXJzIC0gYnVmZmVyczsgYnVmZmVyIDwgcS0+bnVtX2J1ZmZlcnM7CisJICAgICArK2J1ZmZlcikgewogCQl2YiA9IHEtPmJ1ZnNbYnVmZmVyXTsKIAkJaWYgKCF2YikKIAkJCWNvbnRpbnVlOwpAQCAtMjI2LDE3ICsyMzQsMTggQEAKIH0KIAogLyoqCi0gKiBfX3ZiMl9xdWV1ZV9mcmVlKCkgLSBmcmVlIHRoZSBxdWV1ZSAtIHZpZGVvIG1lbW9yeSBhbmQgcmVsYXRlZCBpbmZvcm1hdGlvbgotICogYW5kIHJldHVybiB0aGUgcXVldWUgdG8gYW4gdW5pbml0aWFsaXplZCBzdGF0ZS4gTWlnaHQgYmUgY2FsbGVkIGV2ZW4gaWYgdGhlCi0gKiBxdWV1ZSBoYXMgYWxyZWFkeSBiZWVuIGZyZWVkLgorICogX192YjJfcXVldWVfZnJlZSgpIC0gZnJlZSBidWZmZXJzIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlIC0gdmlkZW8gbWVtb3J5IGFuZAorICogcmVsYXRlZCBpbmZvcm1hdGlvbiwgaWYgbm8gYnVmZmVycyBhcmUgbGVmdCByZXR1cm4gdGhlIHF1ZXVlIHRvIGFuCisgKiB1bmluaXRpYWxpemVkIHN0YXRlLiBNaWdodCBiZSBjYWxsZWQgZXZlbiBpZiB0aGUgcXVldWUgaGFzIGFscmVhZHkgYmVlbiBmcmVlZC4KICAqLwotc3RhdGljIHZvaWQgX192YjJfcXVldWVfZnJlZShzdHJ1Y3QgdmIyX3F1ZXVlICpxKQorc3RhdGljIHZvaWQgX192YjJfcXVldWVfZnJlZShzdHJ1Y3QgdmIyX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgYnVmZmVycykKIHsKIAl1bnNpZ25lZCBpbnQgYnVmZmVyOwogCiAJLyogQ2FsbCBkcml2ZXItcHJvdmlkZWQgY2xlYW51cCBmdW5jdGlvbiBmb3IgZWFjaCBidWZmZXIsIGlmIHByb3ZpZGVkICovCiAJaWYgKHEtPm9wcy0+YnVmX2NsZWFudXApIHsKLQkJZm9yIChidWZmZXIgPSAwOyBidWZmZXIgPCBxLT5udW1fYnVmZmVyczsgKytidWZmZXIpIHsKKwkJZm9yIChidWZmZXIgPSBxLT5udW1fYnVmZmVycyAtIGJ1ZmZlcnM7IGJ1ZmZlciA8IHEtPm51bV9idWZmZXJzOworCQkgICAgICsrYnVmZmVyKSB7CiAJCQlpZiAoTlVMTCA9PSBxLT5idWZzW2J1ZmZlcl0pCiAJCQkJY29udGludWU7CiAJCQlxLT5vcHMtPmJ1Zl9jbGVhbnVwKHEtPmJ1ZnNbYnVmZmVyXSk7CkBAIC0yNDQsMjMgKzI1MywyNiBAQAogCX0KIAogCS8qIFJlbGVhc2UgdmlkZW8gYnVmZmVyIG1lbW9yeSAqLwotCV9fdmIyX2ZyZWVfbWVtKHEpOworCV9fdmIyX2ZyZWVfbWVtKHEsIGJ1ZmZlcnMpOwogCiAJLyogRnJlZSB2aWRlb2J1ZiBidWZmZXJzICovCi0JZm9yIChidWZmZXIgPSAwOyBidWZmZXIgPCBxLT5udW1fYnVmZmVyczsgKytidWZmZXIpIHsKKwlmb3IgKGJ1ZmZlciA9IHEtPm51bV9idWZmZXJzIC0gYnVmZmVyczsgYnVmZmVyIDwgcS0+bnVtX2J1ZmZlcnM7CisJICAgICArK2J1ZmZlcikgewogCQlrZnJlZShxLT5idWZzW2J1ZmZlcl0pOwogCQlxLT5idWZzW2J1ZmZlcl0gPSBOVUxMOwogCX0KIAotCXEtPm51bV9idWZmZXJzID0gMDsKLQlxLT5tZW1vcnkgPSAwOworCXEtPm51bV9idWZmZXJzIC09IGJ1ZmZlcnM7CisJaWYgKCFxLT5udW1fYnVmZmVycykKKwkJcS0+bWVtb3J5ID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmcS0+cXVldWVkX2xpc3QpOwogfQogCiAvKioKICAqIF9fdmVyaWZ5X3BsYW5lc19hcnJheSgpIC0gdmVyaWZ5IHRoYXQgdGhlIHBsYW5lcyBhcnJheSBwYXNzZWQgaW4gc3RydWN0CiAgKiB2NGwyX2J1ZmZlciBmcm9tIHVzZXJzcGFjZSBjYW4gYmUgc2FmZWx5IHVzZWQKICAqLwotc3RhdGljIGludCBfX3ZlcmlmeV9wbGFuZXNfYXJyYXkoc3RydWN0IHZiMl9idWZmZXIgKnZiLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCitzdGF0aWMgaW50IF9fdmVyaWZ5X3BsYW5lc19hcnJheShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIsIGNvbnN0IHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKIHsKIAkvKiBJcyBtZW1vcnkgZm9yIGNvcHlpbmcgcGxhbmUgaW5mb3JtYXRpb24gcHJlc2VudD8gKi8KIAlpZiAoTlVMTCA9PSBiLT5tLnBsYW5lcykgewpAQCAtMjc5LDEzICsyOTEsNDggQEAKIH0KIAogLyoqCisgKiBfX2J1ZmZlcl9pbl91c2UoKSAtIHJldHVybiB0cnVlIGlmIHRoZSBidWZmZXIgaXMgaW4gdXNlIGFuZAorICogdGhlIHF1ZXVlIGNhbm5vdCBiZSBmcmVlZCAoYnkgdGhlIG1lYW5zIG9mIFJFUUJVRlMoMCkpIGNhbGwKKyAqLworc3RhdGljIGJvb2wgX19idWZmZXJfaW5fdXNlKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwl1bnNpZ25lZCBpbnQgcGxhbmU7CisJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgdmItPm51bV9wbGFuZXM7ICsrcGxhbmUpIHsKKwkJdm9pZCAqbWVtX3ByaXYgPSB2Yi0+cGxhbmVzW3BsYW5lXS5tZW1fcHJpdjsKKwkJLyoKKwkJICogSWYgbnVtX3VzZXJzKCkgaGFzIG5vdCBiZWVuIHByb3ZpZGVkLCBjYWxsX21lbW9wCisJCSAqIHdpbGwgcmV0dXJuIDAsIGFwcGFyZW50bHkgbm9ib2R5IGNhcmVzIGFib3V0IHRoaXMKKwkJICogY2FzZSBhbnl3YXkuIElmIG51bV91c2VycygpIHJldHVybnMgbW9yZSB0aGFuIDEsCisJCSAqIHdlIGFyZSBub3QgdGhlIG9ubHkgdXNlciBvZiB0aGUgcGxhbmUncyBtZW1vcnkuCisJCSAqLworCQlpZiAobWVtX3ByaXYgJiYgY2FsbF9tZW1vcChxLCBwbGFuZSwgbnVtX3VzZXJzLCBtZW1fcHJpdikgPiAxKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBfX2J1ZmZlcnNfaW5fdXNlKCkgLSByZXR1cm4gdHJ1ZSBpZiBhbnkgYnVmZmVycyBvbiB0aGUgcXVldWUgYXJlIGluIHVzZSBhbmQKKyAqIHRoZSBxdWV1ZSBjYW5ub3QgYmUgZnJlZWQgKGJ5IHRoZSBtZWFucyBvZiBSRVFCVUZTKDApKSBjYWxsCisgKi8KK3N0YXRpYyBib29sIF9fYnVmZmVyc19pbl91c2Uoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwl1bnNpZ25lZCBpbnQgYnVmZmVyOworCWZvciAoYnVmZmVyID0gMDsgYnVmZmVyIDwgcS0+bnVtX2J1ZmZlcnM7ICsrYnVmZmVyKSB7CisJCWlmIChfX2J1ZmZlcl9pbl91c2UocSwgcS0+YnVmc1tidWZmZXJdKSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgogICogX19maWxsX3Y0bDJfYnVmZmVyKCkgLSBmaWxsIGluIGEgc3RydWN0IHY0bDJfYnVmZmVyIHdpdGggaW5mb3JtYXRpb24gdG8gYmUKICAqIHJldHVybmVkIHRvIHVzZXJzcGFjZQogICovCiBzdGF0aWMgaW50IF9fZmlsbF92NGwyX2J1ZmZlcihzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKIHsKIAlzdHJ1Y3QgdmIyX3F1ZXVlICpxID0gdmItPnZiMl9xdWV1ZTsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJLyogQ29weSBiYWNrIGRhdGEgc3VjaCBhcyB0aW1lc3RhbXAsIGZsYWdzLCBpbnB1dCwgZXRjLiAqLwogCW1lbWNweShiLCAmdmItPnY0bDJfYnVmLCBvZmZzZXRvZihzdHJ1Y3QgdjRsMl9idWZmZXIsIG0pKTsKQEAgLTMzMiwxNSArMzc5LDE4IEBACiAJY2FzZSBWQjJfQlVGX1NUQVRFX0RPTkU6CiAJCWItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKIAkJYnJlYWs7CisJY2FzZSBWQjJfQlVGX1NUQVRFX1BSRVBBUkVEOgorCQliLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1BSRVBBUkVEOworCQlicmVhazsKIAljYXNlIFZCMl9CVUZfU1RBVEVfREVRVUVVRUQ6CiAJCS8qIG5vdGhpbmcgKi8KIAkJYnJlYWs7CiAJfQogCi0JaWYgKHZiLT5udW1fcGxhbmVzX21hcHBlZCA9PSB2Yi0+bnVtX3BsYW5lcykKKwlpZiAoX19idWZmZXJfaW5fdXNlKHEsIHZiKSkKIAkJYi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTQwMiwzMyArNDUyLDYgQEAKIH0KIAogLyoqCi0gKiBfX2J1ZmZlcnNfaW5fdXNlKCkgLSByZXR1cm4gdHJ1ZSBpZiBhbnkgYnVmZmVycyBvbiB0aGUgcXVldWUgYXJlIGluIHVzZSBhbmQKLSAqIHRoZSBxdWV1ZSBjYW5ub3QgYmUgZnJlZWQgKGJ5IHRoZSBtZWFucyBvZiBSRVFCVUZTKDApKSBjYWxsCi0gKi8KLXN0YXRpYyBib29sIF9fYnVmZmVyc19pbl91c2Uoc3RydWN0IHZiMl9xdWV1ZSAqcSkKLXsKLQl1bnNpZ25lZCBpbnQgYnVmZmVyLCBwbGFuZTsKLQlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7Ci0KLQlmb3IgKGJ1ZmZlciA9IDA7IGJ1ZmZlciA8IHEtPm51bV9idWZmZXJzOyArK2J1ZmZlcikgewotCQl2YiA9IHEtPmJ1ZnNbYnVmZmVyXTsKLQkJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgdmItPm51bV9wbGFuZXM7ICsrcGxhbmUpIHsKLQkJCS8qCi0JCQkgKiBJZiBudW1fdXNlcnMoKSBoYXMgbm90IGJlZW4gcHJvdmlkZWQsIGNhbGxfbWVtb3AKLQkJCSAqIHdpbGwgcmV0dXJuIDAsIGFwcGFyZW50bHkgbm9ib2R5IGNhcmVzIGFib3V0IHRoaXMKLQkJCSAqIGNhc2UgYW55d2F5LiBJZiBudW1fdXNlcnMoKSByZXR1cm5zIG1vcmUgdGhhbiAxLAotCQkJICogd2UgYXJlIG5vdCB0aGUgb25seSB1c2VyIG9mIHRoZSBwbGFuZSdzIG1lbW9yeS4KLQkJCSAqLwotCQkJaWYgKGNhbGxfbWVtb3AocSwgcGxhbmUsIG51bV91c2VycywKLQkJCQkJdmItPnBsYW5lc1twbGFuZV0ubWVtX3ByaXYpID4gMSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCiAgKiB2YjJfcmVxYnVmcygpIC0gSW5pdGlhdGUgc3RyZWFtaW5nCiAgKiBAcToJCXZpZGVvYnVmMiBxdWV1ZQogICogQHJlcToJc3RydWN0IHBhc3NlZCBmcm9tIHVzZXJzcGFjZSB0byB2aWRpb2NfcmVxYnVmcyBoYW5kbGVyIGluIGRyaXZlcgpAQCAtNDUzLDggKzQ3Niw3IEBACiAgKi8KIGludCB2YjJfcmVxYnVmcyhzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxKQogewotCXVuc2lnbmVkIGludCBudW1fYnVmZmVycywgbnVtX3BsYW5lczsKLQl1bnNpZ25lZCBsb25nIHBsYW5lX3NpemVzW1ZJREVPX01BWF9QTEFORVNdOworCXVuc2lnbmVkIGludCBudW1fYnVmZmVycywgYWxsb2NhdGVkX2J1ZmZlcnMsIG51bV9wbGFuZXMgPSAwOwogCWludCByZXQgPSAwOwogCiAJaWYgKHEtPmZpbGVpbykgewpAQCAtNTAyLDcgKzUyNCw3IEBACiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAKLQkJX192YjJfcXVldWVfZnJlZShxKTsKKwkJX192YjJfcXVldWVfZnJlZShxLCBxLT5udW1fYnVmZmVycyk7CiAKIAkJLyoKIAkJICogSW4gY2FzZSBvZiBSRVFCVUZTKDApIHJldHVybiBpbW1lZGlhdGVseSB3aXRob3V0IGNhbGxpbmcKQEAgLTUxNiw3ICs1MzgsNyBAQAogCSAqIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdGVkIHZhbHVlcyBhbmQgY3VycmVudCBkZWZhdWx0cyBhcmUgc2FuZS4KIAkgKi8KIAludW1fYnVmZmVycyA9IG1pbl90KHVuc2lnbmVkIGludCwgcmVxLT5jb3VudCwgVklERU9fTUFYX0ZSQU1FKTsKLQltZW1zZXQocGxhbmVfc2l6ZXMsIDAsIHNpemVvZihwbGFuZV9zaXplcykpOworCW1lbXNldChxLT5wbGFuZV9zaXplcywgMCwgc2l6ZW9mKHEtPnBsYW5lX3NpemVzKSk7CiAJbWVtc2V0KHEtPmFsbG9jX2N0eCwgMCwgc2l6ZW9mKHEtPmFsbG9jX2N0eCkpOwogCXEtPm1lbW9yeSA9IHJlcS0+bWVtb3J5OwogCkBAIC01MjQsNTcgKzU0NiwxODAgQEAKIAkgKiBBc2sgdGhlIGRyaXZlciBob3cgbWFueSBidWZmZXJzIGFuZCBwbGFuZXMgcGVyIGJ1ZmZlciBpdCByZXF1aXJlcy4KIAkgKiBEcml2ZXIgYWxzbyBzZXRzIHRoZSBzaXplIGFuZCBhbGxvY2F0b3IgY29udGV4dCBmb3IgZWFjaCBwbGFuZS4KIAkgKi8KLQlyZXQgPSBjYWxsX3FvcChxLCBxdWV1ZV9zZXR1cCwgcSwgJm51bV9idWZmZXJzLCAmbnVtX3BsYW5lcywKLQkJICAgICAgIHBsYW5lX3NpemVzLCBxLT5hbGxvY19jdHgpOworCXJldCA9IGNhbGxfcW9wKHEsIHF1ZXVlX3NldHVwLCBxLCBOVUxMLCAmbnVtX2J1ZmZlcnMsICZudW1fcGxhbmVzLAorCQkgICAgICAgcS0+cGxhbmVfc2l6ZXMsIHEtPmFsbG9jX2N0eCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIEZpbmFsbHksIGFsbG9jYXRlIGJ1ZmZlcnMgYW5kIHZpZGVvIG1lbW9yeSAqLwotCXJldCA9IF9fdmIyX3F1ZXVlX2FsbG9jKHEsIHJlcS0+bWVtb3J5LCBudW1fYnVmZmVycywgbnVtX3BsYW5lcywKLQkJCQlwbGFuZV9zaXplcyk7CisJcmV0ID0gX192YjJfcXVldWVfYWxsb2MocSwgcmVxLT5tZW1vcnksIG51bV9idWZmZXJzLCBudW1fcGxhbmVzKTsKIAlpZiAocmV0ID09IDApIHsKIAkJZHByaW50aygxLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJYWxsb2NhdGVkX2J1ZmZlcnMgPSByZXQ7CisKIAkvKgogCSAqIENoZWNrIGlmIGRyaXZlciBjYW4gaGFuZGxlIHRoZSBhbGxvY2F0ZWQgbnVtYmVyIG9mIGJ1ZmZlcnMuCiAJICovCi0JaWYgKHJldCA8IG51bV9idWZmZXJzKSB7Ci0JCXVuc2lnbmVkIGludCBvcmlnX251bV9idWZmZXJzOworCWlmIChhbGxvY2F0ZWRfYnVmZmVycyA8IG51bV9idWZmZXJzKSB7CisJCW51bV9idWZmZXJzID0gYWxsb2NhdGVkX2J1ZmZlcnM7CiAKLQkJb3JpZ19udW1fYnVmZmVycyA9IG51bV9idWZmZXJzID0gcmV0OwotCQlyZXQgPSBjYWxsX3FvcChxLCBxdWV1ZV9zZXR1cCwgcSwgJm51bV9idWZmZXJzLCAmbnVtX3BsYW5lcywKLQkJCSAgICAgICBwbGFuZV9zaXplcywgcS0+YWxsb2NfY3R4KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZnJlZV9tZW07CisJCXJldCA9IGNhbGxfcW9wKHEsIHF1ZXVlX3NldHVwLCBxLCBOVUxMLCAmbnVtX2J1ZmZlcnMsCisJCQkgICAgICAgJm51bV9wbGFuZXMsIHEtPnBsYW5lX3NpemVzLCBxLT5hbGxvY19jdHgpOwogCi0JCWlmIChvcmlnX251bV9idWZmZXJzIDwgbnVtX2J1ZmZlcnMpIHsKKwkJaWYgKCFyZXQgJiYgYWxsb2NhdGVkX2J1ZmZlcnMgPCBudW1fYnVmZmVycykKIAkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGZyZWVfbWVtOwotCQl9CiAKIAkJLyoKLQkJICogT2ssIGRyaXZlciBhY2NlcHRlZCBzbWFsbGVyIG51bWJlciBvZiBidWZmZXJzLgorCQkgKiBFaXRoZXIgdGhlIGRyaXZlciBoYXMgYWNjZXB0ZWQgYSBzbWFsbGVyIG51bWJlciBvZiBidWZmZXJzLAorCQkgKiBvciAucXVldWVfc2V0dXAoKSByZXR1cm5lZCBhbiBlcnJvcgogCQkgKi8KLQkJcmV0ID0gbnVtX2J1ZmZlcnM7CisJfQorCisJcS0+bnVtX2J1ZmZlcnMgPSBhbGxvY2F0ZWRfYnVmZmVyczsKKworCWlmIChyZXQgPCAwKSB7CisJCV9fdmIyX3F1ZXVlX2ZyZWUocSwgYWxsb2NhdGVkX2J1ZmZlcnMpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qCiAJICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBidWZmZXJzCiAJICogdG8gdGhlIHVzZXJzcGFjZS4KIAkgKi8KLQlyZXEtPmNvdW50ID0gcmV0OworCXJlcS0+Y291bnQgPSBhbGxvY2F0ZWRfYnVmZmVyczsKIAogCXJldHVybiAwOwotCi1mcmVlX21lbToKLQlfX3ZiMl9xdWV1ZV9mcmVlKHEpOwotCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2YjJfcmVxYnVmcyk7CiAKIC8qKgorICogdmIyX2NyZWF0ZV9idWZzKCkgLSBBbGxvY2F0ZSBidWZmZXJzIGFuZCBhbnkgcmVxdWlyZWQgYXV4aWxpYXJ5IHN0cnVjdHMKKyAqIEBxOgkJdmlkZW9idWYyIHF1ZXVlCisgKiBAY3JlYXRlOgljcmVhdGlvbiBwYXJhbWV0ZXJzLCBwYXNzZWQgZnJvbSB1c2Vyc3BhY2UgdG8gdmlkaW9jX2NyZWF0ZV9idWZzCisgKgkJaGFuZGxlciBpbiBkcml2ZXIKKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdmlkaW9jX2NyZWF0ZV9idWZzIGlvY3RsIGhhbmRsZXIgb2YgYSBkcml2ZXIuCisgKiBUaGlzIGZ1bmN0aW9uOgorICogMSkgdmVyaWZpZXMgcGFyYW1ldGVyIHNhbml0eQorICogMikgY2FsbHMgdGhlIC5xdWV1ZV9zZXR1cCgpIHF1ZXVlIG9wZXJhdGlvbgorICogMykgcGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBtZW1vcnkgYWxsb2NhdGlvbnMKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlcyBmcm9tIHRoaXMgZnVuY3Rpb24gYXJlIGludGVuZGVkIHRvIGJlIGRpcmVjdGx5IHJldHVybmVkCisgKiBmcm9tIHZpZGlvY19jcmVhdGVfYnVmcyBoYW5kbGVyIGluIGRyaXZlci4KKyAqLworaW50IHZiMl9jcmVhdGVfYnVmcyhzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyAqY3JlYXRlKQoreworCXVuc2lnbmVkIGludCBudW1fcGxhbmVzID0gMCwgbnVtX2J1ZmZlcnMsIGFsbG9jYXRlZF9idWZmZXJzOworCWludCByZXQgPSAwOworCisJaWYgKHEtPmZpbGVpbykgeworCQlkcHJpbnRrKDEsICIlcygpOiBmaWxlIGlvIGluIHByb2dyZXNzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGNyZWF0ZS0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVAKKwkJCSYmIGNyZWF0ZS0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX1VTRVJQVFIpIHsKKwkJZHByaW50aygxLCAiJXMoKTogdW5zdXBwb3J0ZWQgbWVtb3J5IHR5cGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNyZWF0ZS0+Zm9ybWF0LnR5cGUgIT0gcS0+dHlwZSkgeworCQlkcHJpbnRrKDEsICIlcygpOiByZXF1ZXN0ZWQgdHlwZSBpcyBpbmNvcnJlY3RcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgYWxsIHRoZSByZXF1aXJlZCBtZW1vcnkgb3BzIGZvciBnaXZlbiBtZW1vcnkgdHlwZQorCSAqIGFyZSBhdmFpbGFibGUuCisJICovCisJaWYgKGNyZWF0ZS0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX01NQVAgJiYgX192ZXJpZnlfbW1hcF9vcHMocSkpIHsKKwkJZHByaW50aygxLCAiJXMoKTogTU1BUCBmb3IgY3VycmVudCBzZXR1cCB1bnN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY3JlYXRlLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUiAmJiBfX3ZlcmlmeV91c2VycHRyX29wcyhxKSkgeworCQlkcHJpbnRrKDEsICIlcygpOiBVU0VSUFRSIGZvciBjdXJyZW50IHNldHVwIHVuc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChxLT5udW1fYnVmZmVycyA9PSBWSURFT19NQVhfRlJBTUUpIHsKKwkJZHByaW50aygxLCAiJXMoKTogbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyBhbHJlYWR5IGFsbG9jYXRlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCWNyZWF0ZS0+aW5kZXggPSBxLT5udW1fYnVmZmVyczsKKworCWlmICghcS0+bnVtX2J1ZmZlcnMpIHsKKwkJbWVtc2V0KHEtPnBsYW5lX3NpemVzLCAwLCBzaXplb2YocS0+cGxhbmVfc2l6ZXMpKTsKKwkJbWVtc2V0KHEtPmFsbG9jX2N0eCwgMCwgc2l6ZW9mKHEtPmFsbG9jX2N0eCkpOworCQlxLT5tZW1vcnkgPSBjcmVhdGUtPm1lbW9yeTsKKwl9CisKKwludW1fYnVmZmVycyA9IG1pbihjcmVhdGUtPmNvdW50LCBWSURFT19NQVhfRlJBTUUgLSBxLT5udW1fYnVmZmVycyk7CisKKwkvKgorCSAqIEFzayB0aGUgZHJpdmVyLCB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ1ZmZlcnMsIHBsYW5lcyBwZXIKKwkgKiBidWZmZXIgYW5kIHRoZWlyIHNpemVzIGFyZSBhY2NlcHRhYmxlCisJICovCisJcmV0ID0gY2FsbF9xb3AocSwgcXVldWVfc2V0dXAsIHEsICZjcmVhdGUtPmZvcm1hdCwgJm51bV9idWZmZXJzLAorCQkgICAgICAgJm51bV9wbGFuZXMsIHEtPnBsYW5lX3NpemVzLCBxLT5hbGxvY19jdHgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBGaW5hbGx5LCBhbGxvY2F0ZSBidWZmZXJzIGFuZCB2aWRlbyBtZW1vcnkgKi8KKwlyZXQgPSBfX3ZiMl9xdWV1ZV9hbGxvYyhxLCBjcmVhdGUtPm1lbW9yeSwgbnVtX2J1ZmZlcnMsCisJCQkJbnVtX3BsYW5lcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZHByaW50aygxLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIHdpdGggZXJyb3I6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWFsbG9jYXRlZF9idWZmZXJzID0gcmV0OworCisJLyoKKwkgKiBDaGVjayBpZiBkcml2ZXIgY2FuIGhhbmRsZSB0aGUgc28gZmFyIGFsbG9jYXRlZCBudW1iZXIgb2YgYnVmZmVycy4KKwkgKi8KKwlpZiAocmV0IDwgbnVtX2J1ZmZlcnMpIHsKKwkJbnVtX2J1ZmZlcnMgPSByZXQ7CisKKwkJLyoKKwkJICogcS0+bnVtX2J1ZmZlcnMgY29udGFpbnMgdGhlIHRvdGFsIG51bWJlciBvZiBidWZmZXJzLCB0aGF0IHRoZQorCQkgKiBxdWV1ZSBkcml2ZXIgaGFzIHNldCB1cAorCQkgKi8KKwkJcmV0ID0gY2FsbF9xb3AocSwgcXVldWVfc2V0dXAsIHEsICZjcmVhdGUtPmZvcm1hdCwgJm51bV9idWZmZXJzLAorCQkJICAgICAgICZudW1fcGxhbmVzLCBxLT5wbGFuZV9zaXplcywgcS0+YWxsb2NfY3R4KTsKKworCQlpZiAoIXJldCAmJiBhbGxvY2F0ZWRfYnVmZmVycyA8IG51bV9idWZmZXJzKQorCQkJcmV0ID0gLUVOT01FTTsKKworCQkvKgorCQkgKiBFaXRoZXIgdGhlIGRyaXZlciBoYXMgYWNjZXB0ZWQgYSBzbWFsbGVyIG51bWJlciBvZiBidWZmZXJzLAorCQkgKiBvciAucXVldWVfc2V0dXAoKSByZXR1cm5lZCBhbiBlcnJvcgorCQkgKi8KKwl9CisKKwlxLT5udW1fYnVmZmVycyArPSBhbGxvY2F0ZWRfYnVmZmVyczsKKworCWlmIChyZXQgPCAwKSB7CisJCV9fdmIyX3F1ZXVlX2ZyZWUocSwgYWxsb2NhdGVkX2J1ZmZlcnMpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBidWZmZXJzCisJICogdG8gdGhlIHVzZXJzcGFjZS4KKwkgKi8KKwljcmVhdGUtPmNvdW50ID0gYWxsb2NhdGVkX2J1ZmZlcnM7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZiMl9jcmVhdGVfYnVmcyk7CisKKy8qKgogICogdmIyX3BsYW5lX3ZhZGRyKCkgLSBSZXR1cm4gYSBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIG9mIGEgZ2l2ZW4gcGxhbmUKICAqIEB2YjoJCXZiMl9idWZmZXIgdG8gd2hpY2ggdGhlIHBsYW5lIGluIHF1ZXN0aW9uIGJlbG9uZ3MgdG8KICAqIEBwbGFuZV9ubzoJcGxhbmUgbnVtYmVyIGZvciB3aGljaCB0aGUgYWRkcmVzcyBpcyB0byBiZSByZXR1cm5lZApAQCAtNjU4LDcgKzgwMyw3IEBACiAgKiBfX2ZpbGxfdmIyX2J1ZmZlcigpIC0gZmlsbCBhIHZiMl9idWZmZXIgd2l0aCBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbgogICogYSB2NGwyX2J1ZmZlciBieSB0aGUgdXNlcnNwYWNlCiAgKi8KLXN0YXRpYyBpbnQgX19maWxsX3ZiMl9idWZmZXIoc3RydWN0IHZiMl9idWZmZXIgKnZiLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIsCitzdGF0aWMgaW50IF9fZmlsbF92YjJfYnVmZmVyKHN0cnVjdCB2YjJfYnVmZmVyICp2YiwgY29uc3Qgc3RydWN0IHY0bDJfYnVmZmVyICpiLAogCQkJCXN0cnVjdCB2NGwyX3BsYW5lICp2NGwyX3BsYW5lcykKIHsKIAl1bnNpZ25lZCBpbnQgcGxhbmU7CkBAIC03MjIsNyArODY3LDcgQEAKIC8qKgogICogX19xYnVmX3VzZXJwdHIoKSAtIGhhbmRsZSBxYnVmIG9mIGEgVVNFUlBUUiBidWZmZXIKICAqLwotc3RhdGljIGludCBfX3FidWZfdXNlcnB0cihzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKK3N0YXRpYyBpbnQgX19xYnVmX3VzZXJwdHIoc3RydWN0IHZiMl9idWZmZXIgKnZiLCBjb25zdCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCiB7CiAJc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW1ZJREVPX01BWF9QTEFORVNdOwogCXN0cnVjdCB2YjJfcXVldWUgKnEgPSB2Yi0+dmIyX3F1ZXVlOwpAQCAtNzQ1LDEyICs4OTAsMjAgQEAKIAkJZHByaW50aygzLCAicWJ1ZjogdXNlcnNwYWNlIGFkZHJlc3MgZm9yIHBsYW5lICVkIGNoYW5nZWQsICIKIAkJCQkicmVhY3F1aXJpbmcgbWVtb3J5XG4iLCBwbGFuZSk7CiAKKwkJLyogQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIHBsYW5lIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggKi8KKwkJaWYgKHBsYW5lc1twbGFuZV0ubGVuZ3RoIDwgcS0+cGxhbmVfc2l6ZXNbcGxhbmVdKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwogCQkvKiBSZWxlYXNlIHByZXZpb3VzbHkgYWNxdWlyZWQgbWVtb3J5IGlmIHByZXNlbnQgKi8KIAkJaWYgKHZiLT5wbGFuZXNbcGxhbmVdLm1lbV9wcml2KQogCQkJY2FsbF9tZW1vcChxLCBwbGFuZSwgcHV0X3VzZXJwdHIsCiAJCQkJCXZiLT5wbGFuZXNbcGxhbmVdLm1lbV9wcml2KTsKIAogCQl2Yi0+cGxhbmVzW3BsYW5lXS5tZW1fcHJpdiA9IE5VTEw7CisJCXZiLT52NGwyX3BsYW5lc1twbGFuZV0ubS51c2VycHRyID0gMDsKKwkJdmItPnY0bDJfcGxhbmVzW3BsYW5lXS5sZW5ndGggPSAwOwogCiAJCS8qIEFjcXVpcmUgZWFjaCBwbGFuZSdzIG1lbW9yeSAqLwogCQlpZiAocS0+bWVtX29wcy0+Z2V0X3VzZXJwdHIpIHsKQEAgLTc4OCwxMCArOTQxLDEzIEBACiAJcmV0dXJuIDA7CiBlcnI6CiAJLyogSW4gY2FzZSBvZiBlcnJvcnMsIHJlbGVhc2UgcGxhbmVzIHRoYXQgd2VyZSBhbHJlYWR5IGFjcXVpcmVkICovCi0JZm9yICg7IHBsYW5lID4gMDsgLS1wbGFuZSkgewotCQljYWxsX21lbW9wKHEsIHBsYW5lLCBwdXRfdXNlcnB0ciwKLQkJCQl2Yi0+cGxhbmVzW3BsYW5lIC0gMV0ubWVtX3ByaXYpOwotCQl2Yi0+cGxhbmVzW3BsYW5lIC0gMV0ubWVtX3ByaXYgPSBOVUxMOworCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHZiLT5udW1fcGxhbmVzOyArK3BsYW5lKSB7CisJCWlmICh2Yi0+cGxhbmVzW3BsYW5lXS5tZW1fcHJpdikKKwkJCWNhbGxfbWVtb3AocSwgcGxhbmUsIHB1dF91c2VycHRyLAorCQkJCSAgIHZiLT5wbGFuZXNbcGxhbmVdLm1lbV9wcml2KTsKKwkJdmItPnBsYW5lc1twbGFuZV0ubWVtX3ByaXYgPSBOVUxMOworCQl2Yi0+djRsMl9wbGFuZXNbcGxhbmVdLm0udXNlcnB0ciA9IDA7CisJCXZiLT52NGwyX3BsYW5lc1twbGFuZV0ubGVuZ3RoID0gMDsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtODAwLDcgKzk1Niw3IEBACiAvKioKICAqIF9fcWJ1Zl9tbWFwKCkgLSBoYW5kbGUgcWJ1ZiBvZiBhbiBNTUFQIGJ1ZmZlcgogICovCi1zdGF0aWMgaW50IF9fcWJ1Zl9tbWFwKHN0cnVjdCB2YjJfYnVmZmVyICp2Yiwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQorc3RhdGljIGludCBfX3FidWZfbW1hcChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIsIGNvbnN0IHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKIHsKIAlyZXR1cm4gX19maWxsX3ZiMl9idWZmZXIodmIsIGIsIHZiLT52NGwyX3BsYW5lcyk7CiB9CkBAIC04MTcsNiArOTczLDk1IEBACiAJcS0+b3BzLT5idWZfcXVldWUodmIpOwogfQogCitzdGF0aWMgaW50IF9fYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiLCBjb25zdCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IHZiMl9xdWV1ZSAqcSA9IHZiLT52YjJfcXVldWU7CisJaW50IHJldDsKKworCXN3aXRjaCAocS0+bWVtb3J5KSB7CisJY2FzZSBWNEwyX01FTU9SWV9NTUFQOgorCQlyZXQgPSBfX3FidWZfbW1hcCh2YiwgYik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NRU1PUllfVVNFUlBUUjoKKwkJcmV0ID0gX19xYnVmX3VzZXJwdHIodmIsIGIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJJbnZhbGlkIHF1ZXVlIHR5cGVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlmICghcmV0KQorCQlyZXQgPSBjYWxsX3FvcChxLCBidWZfcHJlcGFyZSwgdmIpOworCWlmIChyZXQpCisJCWRwcmludGsoMSwgInFidWY6IGJ1ZmZlciBwcmVwYXJhdGlvbiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCWVsc2UKKwkJdmItPnN0YXRlID0gVkIyX0JVRl9TVEFURV9QUkVQQVJFRDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdmIyX3ByZXBhcmVfYnVmKCkgLSBQYXNzIG93bmVyc2hpcCBvZiBhIGJ1ZmZlciBmcm9tIHVzZXJzcGFjZSB0byB0aGUga2VybmVsCisgKiBAcToJCXZpZGVvYnVmMiBxdWV1ZQorICogQGI6CQlidWZmZXIgc3RydWN0dXJlIHBhc3NlZCBmcm9tIHVzZXJzcGFjZSB0byB2aWRpb2NfcHJlcGFyZV9idWYKKyAqCQloYW5kbGVyIGluIGRyaXZlcgorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB2aWRpb2NfcHJlcGFyZV9idWYgaW9jdGwgaGFuZGxlciBvZiBhIGRyaXZlci4KKyAqIFRoaXMgZnVuY3Rpb246CisgKiAxKSB2ZXJpZmllcyB0aGUgcGFzc2VkIGJ1ZmZlciwKKyAqIDIpIGNhbGxzIGJ1Zl9wcmVwYXJlIGNhbGxiYWNrIGluIHRoZSBkcml2ZXIgKGlmIHByb3ZpZGVkKSwgaW4gd2hpY2gKKyAqICAgIGRyaXZlci1zcGVjaWZpYyBidWZmZXIgaW5pdGlhbGl6YXRpb24gY2FuIGJlIHBlcmZvcm1lZCwKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlcyBmcm9tIHRoaXMgZnVuY3Rpb24gYXJlIGludGVuZGVkIHRvIGJlIGRpcmVjdGx5IHJldHVybmVkCisgKiBmcm9tIHZpZGlvY19wcmVwYXJlX2J1ZiBoYW5kbGVyIGluIGRyaXZlci4KKyAqLworaW50IHZiMl9wcmVwYXJlX2J1ZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IHZiMl9idWZmZXIgKnZiOworCWludCByZXQ7CisKKwlpZiAocS0+ZmlsZWlvKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IGZpbGUgaW8gaW4gcHJvZ3Jlc3NcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoYi0+dHlwZSAhPSBxLT50eXBlKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IGludmFsaWQgYnVmZmVyIHR5cGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGItPmluZGV4ID49IHEtPm51bV9idWZmZXJzKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IGJ1ZmZlciBpbmRleCBvdXQgb2YgcmFuZ2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmIgPSBxLT5idWZzW2ItPmluZGV4XTsKKwlpZiAoTlVMTCA9PSB2YikgeworCQkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCWRwcmludGsoMSwgIiVzKCk6IGJ1ZmZlciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChiLT5tZW1vcnkgIT0gcS0+bWVtb3J5KSB7CisJCWRwcmludGsoMSwgIiVzKCk6IGludmFsaWQgbWVtb3J5IHR5cGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZiLT5zdGF0ZSAhPSBWQjJfQlVGX1NUQVRFX0RFUVVFVUVEKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IGludmFsaWQgYnVmZmVyIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgdmItPnN0YXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gX19idWZfcHJlcGFyZSh2YiwgYik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlfX2ZpbGxfdjRsMl9idWZmZXIodmIsIGIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2YjJfcHJlcGFyZV9idWYpOworCiAvKioKICAqIHZiMl9xYnVmKCkgLSBRdWV1ZSBhIGJ1ZmZlciBmcm9tIHVzZXJzcGFjZQogICogQHE6CQl2aWRlb2J1ZjIgcXVldWUKQEAgLTgyNiw4ICsxMDcxLDggQEAKICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB2aWRpb2NfcWJ1ZiBpb2N0bCBoYW5kbGVyIG9mIGEgZHJpdmVyLgogICogVGhpcyBmdW5jdGlvbjoKICAqIDEpIHZlcmlmaWVzIHRoZSBwYXNzZWQgYnVmZmVyLAotICogMikgY2FsbHMgYnVmX3ByZXBhcmUgY2FsbGJhY2sgaW4gdGhlIGRyaXZlciAoaWYgcHJvdmlkZWQpLCBpbiB3aGljaAotICogICAgZHJpdmVyLXNwZWNpZmljIGJ1ZmZlciBpbml0aWFsaXphdGlvbiBjYW4gYmUgcGVyZm9ybWVkLAorICogMikgaWYgbmVjZXNzYXJ5LCBjYWxscyBidWZfcHJlcGFyZSBjYWxsYmFjayBpbiB0aGUgZHJpdmVyIChpZiBwcm92aWRlZCksIGluCisgKiAgICB3aGljaCBkcml2ZXItc3BlY2lmaWMgYnVmZmVyIGluaXRpYWxpemF0aW9uIGNhbiBiZSBwZXJmb3JtZWQsCiAgKiAzKSBpZiBzdHJlYW1pbmcgaXMgb24sIHF1ZXVlcyB0aGUgYnVmZmVyIGluIGRyaXZlciBieSB0aGUgbWVhbnMgb2YgYnVmX3F1ZXVlCiAgKiAgICBjYWxsYmFjayBmb3IgcHJvY2Vzc2luZy4KICAqCkBAIC04MzcsNyArMTA4Miw3IEBACiBpbnQgdmIyX3FidWYoc3RydWN0IHZiMl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQogewogCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJaWYgKHEtPmZpbGVpbykgewogCQlkcHJpbnRrKDEsICJxYnVmOiBmaWxlIGlvIGluIHByb2dyZXNzXG4iKTsKQEAgLTg2NiwyOSArMTExMSwxOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAodmItPnN0YXRlICE9IFZCMl9CVUZfU1RBVEVfREVRVUVVRUQpIHsKKwlzd2l0Y2ggKHZiLT5zdGF0ZSkgeworCWNhc2UgVkIyX0JVRl9TVEFURV9ERVFVRVVFRDoKKwkJcmV0ID0gX19idWZfcHJlcGFyZSh2YiwgYik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCWNhc2UgVkIyX0JVRl9TVEFURV9QUkVQQVJFRDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJZHByaW50aygxLCAicWJ1ZjogYnVmZmVyIGFscmVhZHkgaW4gdXNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHEtPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQKQotCQlyZXQgPSBfX3FidWZfbW1hcCh2YiwgYik7Ci0JZWxzZSBpZiAocS0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX1VTRVJQVFIpCi0JCXJldCA9IF9fcWJ1Zl91c2VycHRyKHZiLCBiKTsKLQllbHNlIHsKLQkJV0FSTigxLCAiSW52YWxpZCBxdWV1ZSB0eXBlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGNhbGxfcW9wKHEsIGJ1Zl9wcmVwYXJlLCB2Yik7Ci0JaWYgKHJldCkgewotCQlkcHJpbnRrKDEsICJxYnVmOiBidWZmZXIgcHJlcGFyYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKgogCSAqIEFkZCB0byB0aGUgcXVldWVkIGJ1ZmZlcnMgbGlzdCwgYSBidWZmZXIgd2lsbCBzdGF5IG9uIGl0IHVudGlsCiAJICogZGVxdWV1ZWQgaW4gZHFidWYuCkBAIC05MDMsNiArMTEzNyw5IEBACiAJaWYgKHEtPnN0cmVhbWluZykKIAkJX19lbnF1ZXVlX2luX2RyaXZlcih2Yik7CiAKKwkvKiBGaWxsIGJ1ZmZlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHVzZXJzcGFjZSAqLworCV9fZmlsbF92NGwyX2J1ZmZlcih2YiwgYik7CisKIAlkcHJpbnRrKDEsICJxYnVmIG9mIGJ1ZmZlciAlZCBzdWNjZWVkZWRcbiIsIHZiLT52NGwyX2J1Zi5pbmRleCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDk2LDczICsxMzMzLDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHZiMl9kcWJ1Zik7CiAKIC8qKgotICogdmIyX3N0cmVhbW9uIC0gc3RhcnQgc3RyZWFtaW5nCi0gKiBAcToJCXZpZGVvYnVmMiBxdWV1ZQotICogQHR5cGU6CXR5cGUgYXJndW1lbnQgcGFzc2VkIGZyb20gdXNlcnNwYWNlIHRvIHZpZGlvY19zdHJlYW1vbiBoYW5kbGVyCi0gKgotICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHZpZGlvY19zdHJlYW1vbiBoYW5kbGVyIG9mIGEgZHJpdmVyLgotICogVGhpcyBmdW5jdGlvbjoKLSAqIDEpIHZlcmlmaWVzIGN1cnJlbnQgc3RhdGUKLSAqIDIpIHN0YXJ0cyBzdHJlYW1pbmcgYW5kIHBhc3NlcyBhbnkgcHJldmlvdXNseSBxdWV1ZWQgYnVmZmVycyB0byB0aGUgZHJpdmVyCi0gKgotICogVGhlIHJldHVybiB2YWx1ZXMgZnJvbSB0aGlzIGZ1bmN0aW9uIGFyZSBpbnRlbmRlZCB0byBiZSBkaXJlY3RseSByZXR1cm5lZAotICogZnJvbSB2aWRpb2Nfc3RyZWFtb24gaGFuZGxlciBpbiB0aGUgZHJpdmVyLgotICovCi1pbnQgdmIyX3N0cmVhbW9uKHN0cnVjdCB2YjJfcXVldWUgKnEsIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQotewotCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKLQlpbnQgcmV0OwotCi0JaWYgKHEtPmZpbGVpbykgewotCQlkcHJpbnRrKDEsICJzdHJlYW1vbjogZmlsZSBpbyBpbiBwcm9ncmVzc1xuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JaWYgKHR5cGUgIT0gcS0+dHlwZSkgewotCQlkcHJpbnRrKDEsICJzdHJlYW1vbjogaW52YWxpZCBzdHJlYW0gdHlwZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChxLT5zdHJlYW1pbmcpIHsKLQkJZHByaW50aygxLCAic3RyZWFtb246IGFscmVhZHkgc3RyZWFtaW5nXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQkvKgotCSAqIENhbm5vdCBzdGFydCBzdHJlYW1pbmcgb24gYW4gT1VUUFVUIGRldmljZSBpZiBubyBidWZmZXJzIGhhdmUKLQkgKiBiZWVuIHF1ZXVlZCB5ZXQuCi0JICovCi0JaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQocS0+dHlwZSkpIHsKLQkJaWYgKGxpc3RfZW1wdHkoJnEtPnF1ZXVlZF9saXN0KSkgewotCQkJZHByaW50aygxLCAic3RyZWFtb246IG5vIG91dHB1dCBidWZmZXJzIHF1ZXVlZFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCS8qCi0JICogTGV0IGRyaXZlciBub3RpY2UgdGhhdCBzdHJlYW1pbmcgc3RhdGUgaGFzIGJlZW4gZW5hYmxlZC4KLQkgKi8KLQlyZXQgPSBjYWxsX3FvcChxLCBzdGFydF9zdHJlYW1pbmcsIHEpOwotCWlmIChyZXQpIHsKLQkJZHByaW50aygxLCAic3RyZWFtb246IGRyaXZlciByZWZ1c2VkIHRvIHN0YXJ0IHN0cmVhbWluZ1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcS0+c3RyZWFtaW5nID0gMTsKLQotCS8qCi0JICogSWYgYW55IGJ1ZmZlcnMgd2VyZSBxdWV1ZWQgYmVmb3JlIHN0cmVhbW9uLAotCSAqIHdlIGNhbiBub3cgcGFzcyB0aGVtIHRvIGRyaXZlciBmb3IgcHJvY2Vzc2luZy4KLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZiLCAmcS0+cXVldWVkX2xpc3QsIHF1ZXVlZF9lbnRyeSkKLQkJX19lbnF1ZXVlX2luX2RyaXZlcih2Yik7Ci0KLQlkcHJpbnRrKDMsICJTdHJlYW1vbiBzdWNjZXNzZnVsXG4iKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZiMl9zdHJlYW1vbik7Ci0KLS8qKgogICogX192YjJfcXVldWVfY2FuY2VsKCkgLSBjYW5jZWwgYW5kIHN0b3AgKHBhdXNlKSBzdHJlYW1pbmcKICAqCiAgKiBSZW1vdmVzIGFsbCBxdWV1ZWQgYnVmZmVycyBmcm9tIGRyaXZlcidzIHF1ZXVlIGFuZCBhbGwgYnVmZmVycyBxdWV1ZWQgYnkKQEAgLTEyMDAsNiArMTM3MCw2NCBAQAogfQogCiAvKioKKyAqIHZiMl9zdHJlYW1vbiAtIHN0YXJ0IHN0cmVhbWluZworICogQHE6CQl2aWRlb2J1ZjIgcXVldWUKKyAqIEB0eXBlOgl0eXBlIGFyZ3VtZW50IHBhc3NlZCBmcm9tIHVzZXJzcGFjZSB0byB2aWRpb2Nfc3RyZWFtb24gaGFuZGxlcgorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB2aWRpb2Nfc3RyZWFtb24gaGFuZGxlciBvZiBhIGRyaXZlci4KKyAqIFRoaXMgZnVuY3Rpb246CisgKiAxKSB2ZXJpZmllcyBjdXJyZW50IHN0YXRlCisgKiAyKSBwYXNzZXMgYW55IHByZXZpb3VzbHkgcXVldWVkIGJ1ZmZlcnMgdG8gdGhlIGRyaXZlciBhbmQgc3RhcnRzIHN0cmVhbWluZworICoKKyAqIFRoZSByZXR1cm4gdmFsdWVzIGZyb20gdGhpcyBmdW5jdGlvbiBhcmUgaW50ZW5kZWQgdG8gYmUgZGlyZWN0bHkgcmV0dXJuZWQKKyAqIGZyb20gdmlkaW9jX3N0cmVhbW9uIGhhbmRsZXIgaW4gdGhlIGRyaXZlci4KKyAqLworaW50IHZiMl9zdHJlYW1vbihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7CisJaW50IHJldDsKKworCWlmIChxLT5maWxlaW8pIHsKKwkJZHByaW50aygxLCAic3RyZWFtb246IGZpbGUgaW8gaW4gcHJvZ3Jlc3NcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICh0eXBlICE9IHEtPnR5cGUpIHsKKwkJZHByaW50aygxLCAic3RyZWFtb246IGludmFsaWQgc3RyZWFtIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocS0+c3RyZWFtaW5nKSB7CisJCWRwcmludGsoMSwgInN0cmVhbW9uOiBhbHJlYWR5IHN0cmVhbWluZ1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyoKKwkgKiBJZiBhbnkgYnVmZmVycyB3ZXJlIHF1ZXVlZCBiZWZvcmUgc3RyZWFtb24sCisJICogd2UgY2FuIG5vdyBwYXNzIHRoZW0gdG8gZHJpdmVyIGZvciBwcm9jZXNzaW5nLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodmIsICZxLT5xdWV1ZWRfbGlzdCwgcXVldWVkX2VudHJ5KQorCQlfX2VucXVldWVfaW5fZHJpdmVyKHZiKTsKKworCS8qCisJICogTGV0IGRyaXZlciBub3RpY2UgdGhhdCBzdHJlYW1pbmcgc3RhdGUgaGFzIGJlZW4gZW5hYmxlZC4KKwkgKi8KKwlyZXQgPSBjYWxsX3FvcChxLCBzdGFydF9zdHJlYW1pbmcsIHEsIGF0b21pY19yZWFkKCZxLT5xdWV1ZWRfY291bnQpKTsKKwlpZiAocmV0KSB7CisJCWRwcmludGsoMSwgInN0cmVhbW9uOiBkcml2ZXIgcmVmdXNlZCB0byBzdGFydCBzdHJlYW1pbmdcbiIpOworCQlfX3ZiMl9xdWV1ZV9jYW5jZWwocSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcS0+c3RyZWFtaW5nID0gMTsKKworCWRwcmludGsoMywgIlN0cmVhbW9uIHN1Y2Nlc3NmdWxcbiIpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmIyX3N0cmVhbW9uKTsKKworCisvKioKICAqIHZiMl9zdHJlYW1vZmYgLSBzdG9wIHN0cmVhbWluZwogICogQHE6CQl2aWRlb2J1ZjIgcXVldWUKICAqIEB0eXBlOgl0eXBlIGFyZ3VtZW50IHBhc3NlZCBmcm9tIHVzZXJzcGFjZSB0byB2aWRpb2Nfc3RyZWFtb2ZmIGhhbmRsZXIKQEAgLTEzMzYsMTQgKzE1NjQsNDIgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JdmJfcGxhbmUtPm1hcHBlZCA9IDE7Ci0JdmItPm51bV9wbGFuZXNfbWFwcGVkKys7Ci0KIAlkcHJpbnRrKDMsICJCdWZmZXIgJWQsIHBsYW5lICVkIHN1Y2Nlc3NmdWxseSBtYXBwZWRcbiIsIGJ1ZmZlciwgcGxhbmUpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodmIyX21tYXApOwogCisjaWZuZGVmIENPTkZJR19NTVUKK3Vuc2lnbmVkIGxvbmcgdmIyX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCB2YjJfcXVldWUgKnEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZyBvZmYgPSBwZ29mZiA8PCBQQUdFX1NISUZUOworCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyLCBwbGFuZTsKKwlpbnQgcmV0OworCisJaWYgKHEtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKSB7CisJCWRwcmludGsoMSwgIlF1ZXVlIGlzIG5vdCBjdXJyZW50bHkgc2V0IHVwIGZvciBtbWFwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBGaW5kIHRoZSBwbGFuZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvZmZzZXQgcGFzc2VkIGJ5IHVzZXJzcGFjZS4KKwkgKi8KKwlyZXQgPSBfX2ZpbmRfcGxhbmVfYnlfb2Zmc2V0KHEsIG9mZiwgJmJ1ZmZlciwgJnBsYW5lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdmIgPSBxLT5idWZzW2J1ZmZlcl07CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpdmIyX3BsYW5lX3ZhZGRyKHZiLCBwbGFuZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2YjJfZ2V0X3VubWFwcGVkX2FyZWEpOworI2VuZGlmCisKIHN0YXRpYyBpbnQgX192YjJfaW5pdF9maWxlaW8oc3RydWN0IHZiMl9xdWV1ZSAqcSwgaW50IHJlYWQpOwogc3RhdGljIGludCBfX3ZiMl9jbGVhbnVwX2ZpbGVpbyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKTsKIApAQCAtMTQ2MSw3ICsxNzE3LDcgQEAKIHsKIAlfX3ZiMl9jbGVhbnVwX2ZpbGVpbyhxKTsKIAlfX3ZiMl9xdWV1ZV9jYW5jZWwocSk7Ci0JX192YjJfcXVldWVfZnJlZShxKTsKKwlfX3ZiMl9xdWV1ZV9mcmVlKHEsIHEtPm51bV9idWZmZXJzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZiMl9xdWV1ZV9yZWxlYXNlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLWNvbnRpZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLWNvbnRpZy5jCmluZGV4IGE3OTBhNWYuLmYxN2FkOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWRtYS1jb250aWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtY29udGlnLmMKQEAgLTI0LDcgKzI0LDcgQEAKIHN0cnVjdCB2YjJfZGNfYnVmIHsKIAlzdHJ1Y3QgdmIyX2RjX2NvbmYJCSpjb25mOwogCXZvaWQJCQkJKnZhZGRyOwotCWRtYV9hZGRyX3QJCQlwYWRkcjsKKwlkbWFfYWRkcl90CQkJZG1hX2FkZHI7CiAJdW5zaWduZWQgbG9uZwkJCXNpemU7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0CQkqdm1hOwogCWF0b21pY190CQkJcmVmY291bnQ7CkBAIC00Miw3ICs0Miw3IEBACiAJaWYgKCFidWYpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JYnVmLT52YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChjb25mLT5kZXYsIHNpemUsICZidWYtPnBhZGRyLAorCWJ1Zi0+dmFkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoY29uZi0+ZGV2LCBzaXplLCAmYnVmLT5kbWFfYWRkciwKIAkJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYtPnZhZGRyKSB7CiAJCWRldl9lcnIoY29uZi0+ZGV2LCAiZG1hX2FsbG9jX2NvaGVyZW50IG9mIHNpemUgJWxkIGZhaWxlZFxuIiwKQEAgLTY5LDcgKzY5LDcgQEAKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZidWYtPnJlZmNvdW50KSkgewogCQlkbWFfZnJlZV9jb2hlcmVudChidWYtPmNvbmYtPmRldiwgYnVmLT5zaXplLCBidWYtPnZhZGRyLAotCQkJCSAgYnVmLT5wYWRkcik7CisJCQkJICBidWYtPmRtYV9hZGRyKTsKIAkJa2ZyZWUoYnVmKTsKIAl9CiB9CkBAIC03OCw3ICs3OCw3IEBACiB7CiAJc3RydWN0IHZiMl9kY19idWYgKmJ1ZiA9IGJ1Zl9wcml2OwogCi0JcmV0dXJuICZidWYtPnBhZGRyOworCXJldHVybiAmYnVmLT5kbWFfYWRkcjsKIH0KIAogc3RhdGljIHZvaWQgKnZiMl9kbWFfY29udGlnX3ZhZGRyKHZvaWQgKmJ1Zl9wcml2KQpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiB2YjJfbW1hcF9wZm5fcmFuZ2Uodm1hLCBidWYtPnBhZGRyLCBidWYtPnNpemUsCisJcmV0dXJuIHZiMl9tbWFwX3Bmbl9yYW5nZSh2bWEsIGJ1Zi0+ZG1hX2FkZHIsIGJ1Zi0+c2l6ZSwKIAkJCQkgICZ2YjJfY29tbW9uX3ZtX29wcywgJmJ1Zi0+aGFuZGxlcik7CiB9CiAKQEAgLTExNSwxNCArMTE1LDE0IEBACiB7CiAJc3RydWN0IHZiMl9kY19idWYgKmJ1ZjsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQlkbWFfYWRkcl90IHBhZGRyID0gMDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyID0gMDsKIAlpbnQgcmV0OwogCiAJYnVmID0ga3phbGxvYyhzaXplb2YgKmJ1ZiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JcmV0ID0gdmIyX2dldF9jb250aWdfdXNlcnB0cih2YWRkciwgc2l6ZSwgJnZtYSwgJnBhZGRyKTsKKwlyZXQgPSB2YjJfZ2V0X2NvbnRpZ191c2VycHRyKHZhZGRyLCBzaXplLCAmdm1hLCAmZG1hX2FkZHIpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgYWNxdWlyaW5nIFZNQSBmb3IgdmFkZHIgMHglMDhseFxuIiwKIAkJCQl2YWRkcik7CkBAIC0xMzEsNyArMTMxLDcgQEAKIAl9CiAKIAlidWYtPnNpemUgPSBzaXplOwotCWJ1Zi0+cGFkZHIgPSBwYWRkcjsKKwlidWYtPmRtYV9hZGRyID0gZG1hX2FkZHI7CiAJYnVmLT52bWEgPSB2bWE7CiAKIAlyZXR1cm4gYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLXNnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYwppbmRleCAwNjVmNDY4Li4zYmFkOGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYwpAQCAtNzUsMTIgKzc1LDYgQEAKIAogCXByaW50ayhLRVJOX0RFQlVHICIlczogQWxsb2NhdGVkIGJ1ZmZlciBvZiAlZCBwYWdlc1xuIiwKIAkJX19mdW5jX18sIGJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMpOwotCi0JaWYgKCFidWYtPnZhZGRyKQotCQlidWYtPnZhZGRyID0gdm1fbWFwX3JhbShidWYtPnBhZ2VzLAotCQkJCQlidWYtPnNnX2Rlc2MubnVtX3BhZ2VzLAotCQkJCQktMSwKLQkJCQkJUEFHRV9LRVJORUwpOwogCXJldHVybiBidWY7CiAKIGZhaWxfcGFnZXNfYWxsb2M6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1tZW1vcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jCmluZGV4IDU2OWVlYjMuLjcxYTdhNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jCkBAIC02OCwxMiArNjgsMTIgQEAKIAlpZiAoIXZtYSkKIAkJcmV0dXJuOwogCi0JaWYgKHZtYS0+dm1fZmlsZSkKLQkJZnB1dCh2bWEtPnZtX2ZpbGUpOwotCiAJaWYgKHZtYS0+dm1fb3BzICYmIHZtYS0+dm1fb3BzLT5jbG9zZSkKIAkJdm1hLT52bV9vcHMtPmNsb3NlKHZtYSk7CiAKKwlpZiAodm1hLT52bV9maWxlKQorCQlmcHV0KHZtYS0+dm1fZmlsZSk7CisKIAlrZnJlZSh2bWEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodmIyX3B1dF92bWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwppbmRleCBhODQ4YmQyLi43ZDc1NGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwpAQCAtNjUwLDkgKzY1MCw5IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlWaWRlb2J1ZiBvcGVyYXRpb25zCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpuYnVmZmVycywKLQkJCQl1bnNpZ25lZCBpbnQgKm5wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKLQkJCQl2b2lkICphbGxvY19jdHhzW10pCitzdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKKwkJCQl1bnNpZ25lZCBpbnQgKm5idWZmZXJzLCB1bnNpZ25lZCBpbnQgKm5wbGFuZXMsCisJCQkJdW5zaWduZWQgaW50IHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzdHJ1Y3Qgdml2aV9kZXYgKmRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKQEAgLTc2Niw3ICs3NjYsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCitzdGF0aWMgaW50IHN0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCB2aXZpX2RldiAqZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CiAJZHByaW50ayhkZXYsIDEsICIlc1xuIiwgX19mdW5jX18pOwpAQCAtODUyLDYgKzg1MiwxMSBAQAogCQkoZi0+Zm10LnBpeC53aWR0aCAqIGRldi0+Zm10LT5kZXB0aCkgPj4gMzsKIAlmLT5mbXQucGl4LnNpemVpbWFnZSA9CiAJCWYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisJaWYgKGRldi0+Zm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1lVWVYgfHwKKwkgICAgZGV2LT5mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfVVlWWSkKKwkJZi0+Zm10LnBpeC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKwllbHNlCisJCWYtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOwogCXJldHVybiAwOwogfQogCkBAIC04ODUsNiArODkwLDExIEBACiAJCShmLT5mbXQucGl4LndpZHRoICogZm10LT5kZXB0aCkgPj4gMzsKIAlmLT5mbXQucGl4LnNpemVpbWFnZSA9CiAJCWYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisJaWYgKGZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9ZVVlWIHx8CisJICAgIGZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9VWVZZKQorCQlmLT5mbXQucGl4LmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOworCWVsc2UKKwkJZi0+Zm10LnBpeC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk0OCw2ICs5NTgsMTQgQEAKIAlyZXR1cm4gdmIyX3N0cmVhbW9mZigmZGV2LT52Yl92aWRxLCBpKTsKIH0KIAorc3RhdGljIGludCB2aWRpb2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3Qgdml2aV9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9sb2dfc3RhdHVzKCZkZXYtPmN0cmxfaGFuZGxlciwgZGV2LT52NGwyX2Rldi5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB2aWRpb2Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICppKQogewogCXJldHVybiAwOwpAQCAtMTE5MSw2ICsxMjA5LDcgQEAKIAkudmlkaW9jX3NfaW5wdXQgICAgICAgPSB2aWRpb2Nfc19pbnB1dCwKIAkudmlkaW9jX3N0cmVhbW9uICAgICAgPSB2aWRpb2Nfc3RyZWFtb24sCiAJLnZpZGlvY19zdHJlYW1vZmYgICAgID0gdmlkaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX2xvZ19zdGF0dXMgICAgPSB2aWRpb2NfbG9nX3N0YXR1cywKIAkudmlkaW9jX3N1YnNjcmliZV9ldmVudCA9IHZpZGlvY19zdWJzY3JpYmVfZXZlbnQsCiAJLnZpZGlvY191bnN1YnNjcmliZV9ldmVudCA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYwppbmRleCBjYTM3MmViLi5lNWNhZDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZweDMyMjAuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiAJaWYgKHBzdGQpCiAJCSpwc3RkID0gc3RkOwogCWlmIChwc3RhdHVzKQotCQkqcHN0YXR1cyA9IHN0YXR1czsKKwkJKnBzdGF0dXMgPSByZXM7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKaW5kZXggYzQ5Mjg0Ni4uZTc4Y2Y5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKQEAgLTE2MzgsNiArMTYzOCw5IEBACiAKIAlpZiAoIWNhbS0+cmVhZF9lbmRwb2ludCkgewogCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZCBub3QgZmluZCBidWxrLWluIGVuZHBvaW50XG4iKTsKKwkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoY2FtLT52ZGV2KTsKKwkJa2ZyZWUoY2FtKTsKKwkJY2FtID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tZW1zdGljay5jCmluZGV4IDhjMWQ4NWUuLjU2ZmYxOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tZW1zdGljay5jCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tZW1zdGljay5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAibWVtc3RpY2siCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMKaW5kZXggNGExOTA5YS4uOTcyOWI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9tZW1zdGljay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJtc3Byb19ibG9jayIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9ob3N0L2ptYjM4eF9tcy5jIGIvZHJpdmVycy9tZW1zdGljay9ob3N0L2ptYjM4eF9tcy5jCmluZGV4IGQ4OWQ5MjUuLjZjZTcwZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC9qbWIzOHhfbXMuYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2hvc3Qvam1iMzh4X21zLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtc3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgImptYjM4eF9tcyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9ob3N0L3RpZm1fbXMuYyBiL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMKaW5kZXggMDNmNzFhNC4uYjdhYWNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1zdGljay9ob3N0L3RpZm1fbXMuYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2hvc3QvdGlmbV9tcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJ0aWZtX21zIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwppbmRleCA3OTU2YTEwLi5lOWM2YTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwpAQCAtNjMsNiArNjMsOCBAQAogI2lmZGVmIENPTkZJR19NVFJSCiAjaW5jbHVkZSA8YXNtL210cnIuaD4KICNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogCiAjaW5jbHVkZSAibXB0YmFzZS5oIgogI2luY2x1ZGUgImxzaS9tcGlfbG9nX2ZjLmgiCkBAIC0zMjMsNiArMzI1LDMyIEBACiAJcmV0dXJuIHJjOwogfQogCisKKy8qKgorICogIG1wdF9yZW1vdmVfZGVhZF9pb2NfZnVuYyAtIGt0aHJlYWQgY29udGV4dCB0byByZW1vdmUgZGVhZCBpb2MKKyAqIEBhcmc6IGlucHV0IGFyZ3VtZW50LCB1c2VkIHRvIGRlcml2ZSBpb2MKKyAqCisgKiBSZXR1cm4gMCBpZiBjb250cm9sbGVyIGlzIHJlbW92ZWQgZnJvbSBwY2kgc3Vic3lzdGVtLgorICogUmV0dXJuIC0xIGZvciBvdGhlciBjYXNlLgorICovCitzdGF0aWMgaW50IG1wdF9yZW1vdmVfZGVhZF9pb2NfZnVuYyh2b2lkICphcmcpCit7CisJTVBUX0FEQVBURVIgKmlvYyA9IChNUFRfQURBUFRFUiAqKWFyZzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCWlmICgoaW9jID09IE5VTEwpKQorCQlyZXR1cm4gLTE7CisKKwlwZGV2ID0gaW9jLT5wY2lkZXY7CisJaWYgKChwZGV2ID09IE5VTEwpKQorCQlyZXR1cm4gLTE7CisKKwlwY2lfcmVtb3ZlX2J1c19kZXZpY2UocGRldik7CisJcmV0dXJuIDA7Cit9CisKKworCiAvKioKICAqCW1wdF9mYXVsdF9yZXNldF93b3JrIC0gd29yayBwZXJmb3JtZWQgb24gd29ya3EgYWZ0ZXIgaW9jIGZhdWx0CiAgKglAd29yazogaW5wdXQgYXJndW1lbnQsIHVzZWQgdG8gZGVyaXZlIGlvYwpAQCAtMzM2LDEyICszNjQsNDUgQEAKIAl1MzIJCSBpb2NfcmF3X3N0YXRlOwogCWludAkJIHJjOwogCXVuc2lnbmVkIGxvbmcJIGZsYWdzOworCU1QVF9TQ1NJX0hPU1QJKmhkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAogCWlmIChpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzcyB8fCAhaW9jLT5hY3RpdmUpCiAJCWdvdG8gb3V0OwogCisKIAlpb2NfcmF3X3N0YXRlID0gbXB0X0dldElvY1N0YXRlKGlvYywgMCk7Ci0JaWYgKChpb2NfcmF3X3N0YXRlICYgTVBJX0lPQ19TVEFURV9NQVNLKSA9PSBNUElfSU9DX1NUQVRFX0ZBVUxUKSB7CisJaWYgKChpb2NfcmF3X3N0YXRlICYgTVBJX0lPQ19TVEFURV9NQVNLKSA9PSBNUElfSU9DX1NUQVRFX01BU0spIHsKKwkJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQgIiVzOiBJT0MgaXMgbm9uLW9wZXJhdGlvbmFsICEhISFcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKworCQkvKgorCQkgKiBDYWxsIG1wdHNjc2loX2ZsdXNoX3BlbmRpbmdfY21kcyBjYWxsYmFjayBzbyB0aGF0IHdlCisJCSAqIGZsdXNoIGFsbCBwZW5kaW5nIGNvbW1hbmRzIGJhY2sgdG8gT1MuCisJCSAqIFRoaXMgY2FsbCBpcyByZXF1aXJlZCB0byBhb3ZpZCBkZWFkbG9jayBhdCBibG9jayBsYXllci4KKwkJICogRGVhZCBJT0Mgd2lsbCBmYWlsIHRvIGRvIGRpYWcgcmVzZXQsYW5kIHRoaXMgY2FsbCBpcyBzYWZlCisJCSAqIHNpbmNlIGRlYWQgaW9jIHdpbGwgbmV2ZXIgcmV0dXJuIGFueSBjb21tYW5kIGJhY2sgZnJvbSBIVy4KKwkJICovCisJCWhkID0gc2hvc3RfcHJpdihpb2MtPnNoKTsKKwkJaW9jLT5zY2hlZHVsZV9kZWFkX2lvY19mbHVzaF9ydW5uaW5nX2NtZHMoaGQpOworCisJCS8qUmVtb3ZlIHRoZSBEZWFkIEhvc3QgKi8KKwkJcCA9IGt0aHJlYWRfcnVuKG1wdF9yZW1vdmVfZGVhZF9pb2NfZnVuYywgaW9jLAorCQkJCSJtcHRfZGVhZF9pb2NfJWQiLCBpb2MtPmlkKTsKKwkJaWYgKElTX0VSUihwKSkJeworCQkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVAorCQkJCSIlczogUnVubmluZyBtcHRfZGVhZF9pb2MgdGhyZWFkIGZhaWxlZCAhXG4iLAorCQkJCWlvYy0+bmFtZSwgX19mdW5jX18pOworCQl9IGVsc2UgeworCQkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKKwkJCQkiJXM6IFJ1bm5pbmcgbXB0X2RlYWRfaW9jIHRocmVhZCBzdWNjZXNzICFcbiIsCisJCQkJaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCX0KKwkJcmV0dXJuOyAvKiBkb24ndCByZWFybSB0aW1lciAqLworCX0KKworCWlmICgoaW9jX3Jhd19zdGF0ZSAmIE1QSV9JT0NfU1RBVEVfTUFTSykKKwkJCT09IE1QSV9JT0NfU1RBVEVfRkFVTFQpIHsKIAkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIklPQyBpcyBpbiBGQVVMVCBzdGF0ZSAoJTA0eGgpISEhXG4iLAogCQkgICAgICAgaW9jLT5uYW1lLCBpb2NfcmF3X3N0YXRlICYgTVBJX0RPT1JCRUxMX0RBVEFfTUFTSyk7CiAJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJJc3N1aW5nIEhhcmRSZXNldCBmcm9tICVzISFcbiIsCkBAIC02NDEzLDggKzY0NzQsMTkgQEAKIAkJCXBSZXEtPkFjdGlvbiwgaW9jLT5tcHRiYXNlX2NtZHMuc3RhdHVzLCB0aW1lbGVmdCkpOwogCQlpZiAoaW9jLT5tcHRiYXNlX2NtZHMuc3RhdHVzICYgTVBUX01HTVRfU1RBVFVTX0RJRF9JT0NSRVNFVCkKIAkJCWdvdG8gb3V0OwotCQlpZiAoIXRpbWVsZWZ0KQorCQlpZiAoIXRpbWVsZWZ0KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT50YXNrbWdtdF9sb2NrLCBmbGFncyk7CisJCQlpZiAoaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3MpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnRhc2ttZ210X2xvY2ssCisJCQkJCWZsYWdzKTsKKwkJCQlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVCAiJXM6IGhvc3QgcmVzZXQgaW4iCisJCQkJCSIgcHJvZ3Jlc3MgbXB0X2NvbmZpZyB0aW1lZCBvdXQuISFcbiIsCisJCQkJCV9fZnVuY19fLCBpb2MtPm5hbWUpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT50YXNrbWdtdF9sb2NrLCBmbGFncyk7CiAJCQlpc3N1ZV9oYXJkX3Jlc2V0ID0gMTsKKwkJfQogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTcxMjgsNyArNzIwMCwxOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnRhc2ttZ210X2xvY2ssIGZsYWdzKTsKIAlpZiAoaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3MpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT50YXNrbWdtdF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOworCQlpb2MtPndhaXRfb25fcmVzZXRfY29tcGxldGlvbiA9IDE7CisJCWRvIHsKKwkJCXNzbGVlcCgxKTsKKwkJfSB3aGlsZSAoaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3MgPT0gMSk7CisJCWlvYy0+d2FpdF9vbl9yZXNldF9jb21wbGV0aW9uID0gMDsKKwkJcmV0dXJuIGlvYy0+cmVzZXRfc3RhdHVzOworCX0KKwlpZiAoaW9jLT53YWl0X29uX3Jlc2V0X2NvbXBsZXRpb24pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT50YXNrbWdtdF9sb2NrLCBmbGFncyk7CisJCXJjID0gMDsKKwkJdGltZV9jb3VudCA9IGppZmZpZXM7CisJCWdvdG8gZXhpdDsKIAl9CiAJaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3MgPSAxOwogCWlmIChpb2MtPmFsdF9pb2MpCkBAIC03MTY1LDYgKzcyNDgsNyBAQAogCWlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzID0gMDsKIAlpb2MtPnRhc2ttZ210X3F1aWVzY2VfaW8gPSAwOwogCWlvYy0+dGFza21nbXRfaW5fcHJvZ3Jlc3MgPSAwOworCWlvYy0+cmVzZXRfc3RhdHVzID0gcmM7CiAJaWYgKGlvYy0+YWx0X2lvYykgewogCQlpb2MtPmFsdF9pb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzcyA9IDA7CiAJCWlvYy0+YWx0X2lvYy0+dGFza21nbXRfcXVpZXNjZV9pbyA9IDA7CkBAIC03MTgwLDcgKzcyNjQsNyBAQAogCQkJCQlpb2MtPmFsdF9pb2MsIE1QVF9JT0NfUE9TVF9SRVNFVCk7CiAJCX0KIAl9Ci0KK2V4aXQ6CiAJZHRtcHJpbnRrKGlvYywKIAkgICAgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCSJIYXJkUmVzZXRIYW5kbGVyOiBjb21wbGV0ZWQgKCVkIHNlY29uZHMpOiAlc1xuIiwgaW9jLT5uYW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAppbmRleCBmZTkwMjMzLi5iNGQyNGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaApAQCAtNzYsOCArNzYsOCBAQAogI2RlZmluZSBDT1BZUklHSFQJIkNvcHlyaWdodCAoYykgMTk5OS0yMDA4ICIgTU9EVUxFQVVUSE9SCiAjZW5kaWYKIAotI2RlZmluZSBNUFRfTElOVVhfVkVSU0lPTl9DT01NT04JIjMuMDQuMTkiCi0jZGVmaW5lIE1QVF9MSU5VWF9QQUNLQUdFX05BTUUJCSJAKCMpbXB0bGludXgtMy4wNC4xOSIKKyNkZWZpbmUgTVBUX0xJTlVYX1ZFUlNJT05fQ09NTU9OCSIzLjA0LjIwIgorI2RlZmluZSBNUFRfTElOVVhfUEFDS0FHRV9OQU1FCQkiQCgjKW1wdGxpbnV4LTMuMDQuMjAiCiAjZGVmaW5lIFdIQVRfTUFHSUNfU1RSSU5HCQkiQCIgIigiICIjIiAiKSIKIAogI2RlZmluZSBzaG93X21wdG1vZF92ZXIocyx2ZXIpICBcCkBAIC01NTQsMTAgKzU1NCw0NyBAQAogCXU4CQlmbGFnczsKIH07CiAKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKworLyoKKyAqIE1QVF9TQ1NJX0hPU1QgZGVmaW5lcyAtIFVzZWQgYnkgdGhlIElPQ1RMIGFuZCB0aGUgU0NTSSBkcml2ZXJzCisgKiBQcml2YXRlIHRvIHRoZSBkcml2ZXIuCisgKi8KKworI2RlZmluZSBNUFRfSE9TVF9CVVNfVU5LTk9XTgkJKDB4RkYpCisjZGVmaW5lIE1QVF9IT1NUX1RPT19NQU5ZX1RNCQkoMHgwNSkKKyNkZWZpbmUgTVBUX0hPU1RfTlZSQU1fSU5WQUxJRAkJKDB4RkZGRkZGRkYpCisjZGVmaW5lIE1QVF9IT1NUX05PX0NIQUlOCQkoMHhGRkZGRkZGRikKKyNkZWZpbmUgTVBUX05WUkFNX01BU0tfVElNRU9VVAkJKDB4MDAwMDAwRkYpCisjZGVmaW5lIE1QVF9OVlJBTV9TWU5DX01BU0sJCSgweDAwMDBGRjAwKQorI2RlZmluZSBNUFRfTlZSQU1fU1lOQ19TSElGVAkJKDgpCisjZGVmaW5lIE1QVF9OVlJBTV9ESVNDT05ORUNUX0VOQUJMRQkoMHgwMDAxMDAwMCkKKyNkZWZpbmUgTVBUX05WUkFNX0lEX1NDQU5fRU5BQkxFCSgweDAwMDIwMDAwKQorI2RlZmluZSBNUFRfTlZSQU1fTFVOX1NDQU5fRU5BQkxFCSgweDAwMDQwMDAwKQorI2RlZmluZSBNUFRfTlZSQU1fVEFHX1FVRVVFX0VOQUJMRQkoMHgwMDA4MDAwMCkKKyNkZWZpbmUgTVBUX05WUkFNX1dJREVfRElTQUJMRQkJKDB4MDAxMDAwMDApCisjZGVmaW5lIE1QVF9OVlJBTV9CT09UX0NIT0lDRQkJKDB4MDAyMDAwMDApCisKK3R5cGVkZWYgZW51bSB7CisJRkMsCisJU1BJLAorCVNBUworfSBCVVNfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgX01QVF9TQ1NJX0hPU1QgeworCXN0cnVjdCBfTVBUX0FEQVBURVIJCSAqaW9jOworCXVzaG9ydAkJCSAgc2VsX3RpbWVvdXRbTVBUX01BWF9GQ19ERVZJQ0VTXTsKKwljaGFyCQkJICAqaW5mb19rYnVmOworCWxvbmcJCQkgIGxhc3RfcXVldWVfZnVsbDsKKwl1MTYJCQkgIHNwaV9wZW5kaW5nOworCXN0cnVjdCBsaXN0X2hlYWQJICB0YXJnZXRfcmVzZXRfbGlzdDsKK30gTVBUX1NDU0lfSE9TVDsKKwogdHlwZWRlZiB2b2lkICgqTVBUX0FERF9TR0UpKHZvaWQgKnBBZGRyLCB1MzIgZmxhZ3NsZW5ndGgsIGRtYV9hZGRyX3QgZG1hX2FkZHIpOwogdHlwZWRlZiB2b2lkICgqTVBUX0FERF9DSEFJTikodm9pZCAqcEFkZHIsIHU4IG5leHQsIHUxNiBsZW5ndGgsCiAJCWRtYV9hZGRyX3QgZG1hX2FkZHIpOwogdHlwZWRlZiB2b2lkICgqTVBUX1NDSEVEVUxFX1RBUkdFVF9SRVNFVCkodm9pZCAqaW9jKTsKK3R5cGVkZWYgdm9pZCAoKk1QVF9GTFVTSF9SVU5OSU5HX0NNRFMpKE1QVF9TQ1NJX0hPU1QgKmhkKTsKIAogLyoKICAqICBBZGFwdGVyIFN0cnVjdHVyZSAtIHBjaV9kZXYgc3BlY2lmaWMuIE1heGltdW06IE1QVF9NQVhfQURBUFRFUlMKQEAgLTcxNiw3ICs3NTMsMTAgQEAKIAlpbnQJCQkgdGFza21nbXRfaW5fcHJvZ3Jlc3M7CiAJdTgJCQkgdGFza21nbXRfcXVpZXNjZV9pbzsKIAl1OAkJCSBpb2NfcmVzZXRfaW5fcHJvZ3Jlc3M7CisJdTgJCQkgcmVzZXRfc3RhdHVzOworCXU4CQkJIHdhaXRfb25fcmVzZXRfY29tcGxldGlvbjsKIAlNUFRfU0NIRURVTEVfVEFSR0VUX1JFU0VUIHNjaGVkdWxlX3RhcmdldF9yZXNldDsKKwlNUFRfRkxVU0hfUlVOTklOR19DTURTIHNjaGVkdWxlX2RlYWRfaW9jX2ZsdXNoX3J1bm5pbmdfY21kczsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJIHNhc19wZXJzaXN0X3Rhc2s7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJIGZjX3NldHVwX3Jlc2V0X3dvcms7CkBAIC04MzAsMTkgKzg3MCw2IEBACiAJdTMyCXBhZDsKIH0gTVBUX0xPQ0FMX1JFUExZOwogCi0jZGVmaW5lIE1QVF9IT1NUX0JVU19VTktOT1dOCQkoMHhGRikKLSNkZWZpbmUgTVBUX0hPU1RfVE9PX01BTllfVE0JCSgweDA1KQotI2RlZmluZSBNUFRfSE9TVF9OVlJBTV9JTlZBTElECQkoMHhGRkZGRkZGRikKLSNkZWZpbmUgTVBUX0hPU1RfTk9fQ0hBSU4JCSgweEZGRkZGRkZGKQotI2RlZmluZSBNUFRfTlZSQU1fTUFTS19USU1FT1VUCQkoMHgwMDAwMDBGRikKLSNkZWZpbmUgTVBUX05WUkFNX1NZTkNfTUFTSwkJKDB4MDAwMEZGMDApCi0jZGVmaW5lIE1QVF9OVlJBTV9TWU5DX1NISUZUCQkoOCkKLSNkZWZpbmUgTVBUX05WUkFNX0RJU0NPTk5FQ1RfRU5BQkxFCSgweDAwMDEwMDAwKQotI2RlZmluZSBNUFRfTlZSQU1fSURfU0NBTl9FTkFCTEUJKDB4MDAwMjAwMDApCi0jZGVmaW5lIE1QVF9OVlJBTV9MVU5fU0NBTl9FTkFCTEUJKDB4MDAwNDAwMDApCi0jZGVmaW5lIE1QVF9OVlJBTV9UQUdfUVVFVUVfRU5BQkxFCSgweDAwMDgwMDAwKQotI2RlZmluZSBNUFRfTlZSQU1fV0lERV9ESVNBQkxFCQkoMHgwMDEwMDAwMCkKLSNkZWZpbmUgTVBUX05WUkFNX0JPT1RfQ0hPSUNFCQkoMHgwMDIwMDAwMCkKIAogLyogVGhlIFRNX1NUQVRFIHZhcmlhYmxlIGlzIHVzZWQgdG8gcHJvdmlkZSBzdHJpY3Qgc2luZ2xlIHRocmVhZGluZyBvZiBUTQogICogcmVxdWVzdHMgYXMgd2VsbCBhcyBjb21tdW5pY2F0ZSBUTSBlcnJvciBjb25kaXRpb25zLgpAQCAtODUxLDIxICs4NzgsNiBAQAogI2RlZmluZQlUTV9TVEFURV9JTl9QUk9HUkVTUyAgICgxKQogI2RlZmluZQlUTV9TVEFURV9FUlJPUgkgICAgICAgKDIpCiAKLXR5cGVkZWYgZW51bSB7Ci0JRkMsCi0JU1BJLAotCVNBUwotfSBCVVNfVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgX01QVF9TQ1NJX0hPU1QgewotCU1QVF9BREFQVEVSCQkgKmlvYzsKLQl1c2hvcnQJCQkgIHNlbF90aW1lb3V0W01QVF9NQVhfRkNfREVWSUNFU107Ci0JY2hhciAJCQkgICppbmZvX2tidWY7Ci0JbG9uZwkJCSAgbGFzdF9xdWV1ZV9mdWxsOwotCXUxNgkJCSAgc3BpX3BlbmRpbmc7Ci0Jc3RydWN0IGxpc3RfaGVhZAkgIHRhcmdldF9yZXNldF9saXN0OwotfSBNUFRfU0NTSV9IT1NUOwotCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiAvKgogICoJTW9yZSBEeW5hbWljIE11bHRpLVBhdGhpbmcgc3R1ZmYuLi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCmluZGV4IDc1OTZhZWMuLjlkOTUwNDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMKQEAgLTkyLDYgKzkyLDExIEBACiBtb2R1bGVfcGFyYW0obWF4X2x1biwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobWF4X2x1biwgIiBtYXggbHVuLCBkZWZhdWx0PTE2ODk1ICIpOwogCitzdGF0aWMgaW50IG1wdF9sb2FkdGltZV9tYXhfc2VjdG9ycyA9IDgxOTI7Cittb2R1bGVfcGFyYW0obXB0X2xvYWR0aW1lX21heF9zZWN0b3JzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtcHRfbG9hZHRpbWVfbWF4X3NlY3RvcnMsCisJCSIgTWF4aW11bSBzZWN0b3IgZGVmaW5lIGZvciBIb3N0IEJ1cyBBZGFwdG9yLlJhbmdlIDY0IHRvIDgxOTIgZGVmYXVsdD04MTkyIik7CisKIHN0YXRpYyB1OAltcHRzYXNEb25lQ3R4ID0gTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTOwogc3RhdGljIHU4CW1wdHNhc1Rhc2tDdHggPSBNUFRfTUFYX1BST1RPQ09MX0RSSVZFUlM7CiBzdGF0aWMgdTgJbXB0c2FzSW50ZXJuYWxDdHggPSBNUFRfTUFYX1BST1RPQ09MX0RSSVZFUlM7IC8qIFVzZWQgb25seSBmb3IgaW50ZXJuYWwgY29tbWFuZHMgKi8KQEAgLTI4NSwxMCArMjkwLDExIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+ZndfZXZlbnRfbG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkX3RhaWwoJmZ3X2V2ZW50LT5saXN0LCAmaW9jLT5md19ldmVudF9saXN0KTsKIAlJTklUX0RFTEFZRURfV09SSygmZndfZXZlbnQtPndvcmssIG1wdHNhc19maXJtd2FyZV9ldmVudF93b3JrKTsKLQlkZXZ0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICIlczogYWRkIChmd19ldmVudD0weCVwKVxuIiwKLQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywgZndfZXZlbnQpKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoaW9jLT5md19ldmVudF9xLCAmZndfZXZlbnQtPndvcmssCi0JICAgIGRlbGF5KTsKKwlkZXZ0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICIlczogYWRkIChmd19ldmVudD0weCVwKSIKKwkJIm9uIGNwdWlkICVkXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fLAorCQlmd19ldmVudCwgc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CisJcXVldWVfZGVsYXllZF93b3JrX29uKHNtcF9wcm9jZXNzb3JfaWQoKSwgaW9jLT5md19ldmVudF9xLAorCSAgICAmZndfZXZlbnQtPndvcmssIGRlbGF5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmZ3X2V2ZW50X2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMzAwLDEwICszMDYsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZ3X2V2ZW50X2xvY2ssIGZsYWdzKTsKIAlkZXZ0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICIlczogcmVzY2hlZHVsZSB0YXNrICIKLQkgICAgIihmd19ldmVudD0weCVwKVxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywgZndfZXZlbnQpKTsKKwkgICAgIihmd19ldmVudD0weCVwKW9uIGNwdWlkICVkXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fLAorCQlmd19ldmVudCwgc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CiAJZndfZXZlbnQtPnJldHJpZXMrKzsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoaW9jLT5md19ldmVudF9xLCAmZndfZXZlbnQtPndvcmssCi0JICAgIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmtfb24oc21wX3Byb2Nlc3Nvcl9pZCgpLCBpb2MtPmZ3X2V2ZW50X3EsCisJICAgICZmd19ldmVudC0+d29yaywgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+ZndfZXZlbnRfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0xOTQzLDYgKzE5NTAsMTUgQEAKIAkJZ290byBkb25lOwogCX0KIAorCS8qIEluIGNhc2UgaWYgSU9DIGlzIGluIHJlc2V0IGZyb20gaW50ZXJuYWwgY29udGV4dC4KKwkqICBEbyBub3QgZXhlY3V0ZSBFRUggZm9yIHRoZSBzYW1lIElPQy4gU01MIHNob3VsZCB0byByZXNldCB0aW1lci4KKwkqLworCWlmIChpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzcykgeworCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiOiAlczogaW9jIGlzIGluIHJlc2V0LCIKKwkJICAgICJTTUwgbmVlZCB0byByZXNldCB0aGUgdGltZXIgKHNjPSVwKVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIHNjKSk7CisJCXJjID0gQkxLX0VIX1JFU0VUX1RJTUVSOworCX0KIAl2ZGV2aWNlID0gc2MtPmRldmljZS0+aG9zdGRhdGE7CiAJaWYgKHZkZXZpY2UgJiYgdmRldmljZS0+dnRhcmdldCAmJiAodmRldmljZS0+dnRhcmdldC0+aW5ETUQKIAkJfHwgdmRldmljZS0+dnRhcmdldC0+ZGVsZXRlZCkpIHsKQEAgLTUxNDIsNiArNTE1OCw4IEBACiAJaW9jLT5UYXNrQ3R4ID0gbXB0c2FzVGFza0N0eDsKIAlpb2MtPkludGVybmFsQ3R4ID0gbXB0c2FzSW50ZXJuYWxDdHg7CiAJaW9jLT5zY2hlZHVsZV90YXJnZXRfcmVzZXQgPSAmbXB0c2FzX3NjaGVkdWxlX3RhcmdldF9yZXNldDsKKwlpb2MtPnNjaGVkdWxlX2RlYWRfaW9jX2ZsdXNoX3J1bm5pbmdfY21kcyA9CisJCQkJJm1wdHNjc2loX2ZsdXNoX3J1bm5pbmdfY21kczsKIAkvKiAgQWRkZWQgc2FuaXR5IGNoZWNrIG9uIHJlYWRpbmVzcyBvZiB0aGUgTVBUIGFkYXB0ZXIuCiAJICovCiAJaWYgKGlvYy0+bGFzdF9zdGF0ZSAhPSBNUElfSU9DX1NUQVRFX09QRVJBVElPTkFMKSB7CkBAIC01MjM5LDYgKzUyNTcsMjEgQEAKIAkJc2gtPnNnX3RhYmxlc2l6ZSA9IG51bVNHRTsKIAl9CiAKKwlpZiAobXB0X2xvYWR0aW1lX21heF9zZWN0b3JzKSB7CisJCWlmIChtcHRfbG9hZHRpbWVfbWF4X3NlY3RvcnMgPCA2NCB8fAorCQkJbXB0X2xvYWR0aW1lX21heF9zZWN0b3JzID4gODE5MikgeworCQkJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQgIkludmFsaWQgdmFsdWUgcGFzc2VkIGZvciIKKwkJCQkibXB0X2xvYWR0aW1lX21heF9zZWN0b3JzICVkLiIKKwkJCQkiUmFuZ2UgZnJvbSA2NCB0byA4MTkyXG4iLCBpb2MtPm5hbWUsCisJCQkJbXB0X2xvYWR0aW1lX21heF9zZWN0b3JzKTsKKwkJfQorCQltcHRfbG9hZHRpbWVfbWF4X3NlY3RvcnMgJj0gIDB4RkZGRkZGRkU7CisJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCSJSZXNldHRpbmcgbWF4IHNlY3RvciB0byAlZCBmcm9tICVkXG4iLAorCQkgIGlvYy0+bmFtZSwgbXB0X2xvYWR0aW1lX21heF9zZWN0b3JzLCBzaC0+bWF4X3NlY3RvcnMpKTsKKwkJc2gtPm1heF9zZWN0b3JzID0gbXB0X2xvYWR0aW1lX21heF9zZWN0b3JzOworCX0KKwogCWhkID0gc2hvc3RfcHJpdihzaCk7CiAJaGQtPmlvYyA9IGlvYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCmluZGV4IGNlNjFhNTcuLjBjM2NlZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKQEAgLTgzMCw3ICs4MzAsOCBAQAogCQkJCQlpZiAoKHBTY3NpUmVxLT5DREJbMF0gPT0gUkVBRF82ICAmJiAoKHBTY3NpUmVxLT5DREJbMV0gJiAweDAyKSA9PSAwKSkgfHwKIAkJCQkJICAgIHBTY3NpUmVxLT5DREJbMF0gPT0gUkVBRF8xMCB8fAogCQkJCQkgICAgcFNjc2lSZXEtPkNEQlswXSA9PSBSRUFEXzEyIHx8Ci0JCQkJCSAgICBwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfMTYgfHwKKwkJCQkJCShwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfMTYgJiYKKwkJCQkJCSgocFNjc2lSZXEtPkNEQlsxXSAmIDB4MDIpID09IDApKSB8fAogCQkJCQkgICAgcFNjc2lSZXEtPkNEQlswXSA9PSBWRVJJRlkgIHx8CiAJCQkJCSAgICBwU2NzaVJlcS0+Q0RCWzBdID09IFZFUklGWV8xNikgewogCQkJCQkJaWYgKHNjc2lfYnVmZmxlbihzYykgIT0KQEAgLTEwMjQsNyArMTAyNSw3IEBACiAgKgogICoJTXVzdCBiZSBjYWxsZWQgd2hpbGUgbmV3IEkvT3MgYXJlIGJlaW5nIHF1ZXVlZC4KICAqLwotc3RhdGljIHZvaWQKK3ZvaWQKIG1wdHNjc2loX2ZsdXNoX3J1bm5pbmdfY21kcyhNUFRfU0NTSV9IT1NUICpoZCkKIHsKIAlNUFRfQURBUFRFUiAqaW9jID0gaGQtPmlvYzsKQEAgLTEwNTUsNiArMTA1Niw3IEBACiAJCXNjLT5zY3NpX2RvbmUoc2MpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wobXB0c2NzaWhfZmx1c2hfcnVubmluZ19jbWRzKTsKIAogLyoKICAqCW1wdHNjc2loX3NlYXJjaF9ydW5uaW5nX2NtZHMgLSBEZWxldGUgYW55IGNvbW1hbmRzIGFzc29jaWF0ZWQKQEAgLTE2MjksNyArMTYzMSwxMyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoaW9jX3Jhd19zdGF0ZSAmIE1QSV9ET09SQkVMTF9BQ1RJVkUpIHsKKwkvKiBET09SQkVMTCBBQ1RJVkUgY2hlY2sgaXMgbm90IHJlcXVpcmVkIGlmCisJKiAgTVBJX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfSElHSF9QUklfUSBpcyBzdXBwb3J0ZWQuCisJKi8KKworCWlmICghKChpb2MtPmZhY3RzLklPQ0NhcGFiaWxpdGllcyAmIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX0hJR0hfUFJJX1EpCisJCSAmJiAoaW9jLT5mYWN0cy5Nc2dWZXJzaW9uID49IE1QSV9WRVJTSU9OXzAxXzA1KSkgJiYKKwkJKGlvY19yYXdfc3RhdGUgJiBNUElfRE9PUkJFTExfQUNUSVZFKSkgewogCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVAogCQkJIlRhc2tNZ210IHR5cGU9JXg6IGlvY19zdGF0ZTogIgogCQkJIkRPT1JCRUxMX0FDVElWRSAoMHgleCkhXG4iLApAQCAtMTcyOCw3ICsxNzM2LDkgQEAKIAkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKIAkJICAgICAgICJJc3N1aW5nIFJlc2V0IGZyb20gJXMhISBkb29yYmVsbD0weCUwOHhcbiIsCiAJCSAgICAgICBpb2MtPm5hbWUsIF9fZnVuY19fLCBtcHRfR2V0SW9jU3RhdGUoaW9jLCAwKSk7Ci0JCXJldHZhbCA9IG1wdF9Tb2Z0X0hhcmRfUmVzZXRIYW5kbGVyKGlvYywgQ0FOX1NMRUVQKTsKKwkJcmV0dmFsID0gKGlvYy0+YnVzX3R5cGUgPT0gU0FTKSA/CisJCQltcHRfSGFyZFJlc2V0SGFuZGxlcihpb2MsIENBTl9TTEVFUCkgOgorCQkJbXB0X1NvZnRfSGFyZF9SZXNldEhhbmRsZXIoaW9jLCBDQU5fU0xFRVApOwogCQltcHRfZnJlZV9tc2dfZnJhbWUoaW9jLCBtZik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmgKaW5kZXggNDVhNWZmMy4uNDNlNzVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguaApAQCAtMTM1LDMgKzEzNSw0IEBACiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1wdHNjc2loX2hvc3RfYXR0cnNbXTsKIGV4dGVybiBzdHJ1Y3Qgc2NzaV9jbW5kCSptcHRzY3NpaF9nZXRfc2NzaV9sb29rdXAoTVBUX0FEQVBURVIgKmlvYywgaW50IGkpOwogZXh0ZXJuIHZvaWQgbXB0c2NzaWhfdGFza21nbXRfcmVzcG9uc2VfY29kZShNUFRfQURBUFRFUiAqaW9jLCB1OCByZXNwb25zZV9jb2RlKTsKK2V4dGVybiB2b2lkIG1wdHNjc2loX2ZsdXNoX3J1bm5pbmdfY21kcyhNUFRfU0NTSV9IT1NUICpoZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYwppbmRleCA3M2U0NjU4Li43MTkwZDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiY29yZS5oIgogCiAjZGVmaW5lIE9TTV9ERVNDUklQVElPTgkiSTJPLXN1YnN5c3RlbSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCmluZGV4IGE2N2FkY2IuLmYxMzkxYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL0tjb25maWcKKysrIGIvZHJpdmVycy9tZmQvS2NvbmZpZwpAQCAtMiwyMyArMiw4IEBACiAjIE11bHRpZnVuY3Rpb24gbWlzY2VsbGFuZW91cyBkZXZpY2VzCiAjCiAKLW1lbnVjb25maWcgTUZEX1NVUFBPUlQKLQlib29sICJNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgTXVsdGlmdW5jdGlvbiBkZXZpY2VzIGVtYmVkIHNldmVyYWwgZnVuY3Rpb25zIChlLmcuIEdQSU9zLAotCSAgdG91Y2hzY3JlZW5zLCBrZXlib2FyZHMsIGN1cnJlbnQgcmVndWxhdG9ycywgcG93ZXIgbWFuYWdlbWVudCBjaGlwcywKLQkgIGV0Yy4uLikgaW4gb25lIHNpbmdsZSBpbnRlZ3JhdGVkIGNpcmN1aXQuIFRoZXkgdXN1YWxseSB0YWxrIHRvIHRoZQotCSAgbWFpbiBDUFUgdGhyb3VnaCBvbmUgb3IgbW9yZSBJUlEgbGluZXMgYW5kIGxvdyBzcGVlZCBkYXRhIGJ1c3NlcyAoU1BJLAotCSAgSTJDLCBldGMuLikuIFRoZXkgYXBwZWFyIGFzIG9uZSBzaW5nbGUgZGV2aWNlIHRvIHRoZSBtYWluIHN5c3RlbQotCSAgdGhyb3VnaCB0aGUgZGF0YSBidXMgYW5kIHRoZSBNRkQgZnJhbWV3b3JrIGFsbG93cyBmb3Igc3ViIGRldmljZXMKLQkgIChhLmsuYS4gZnVuY3Rpb25zKSB0byBhcHBlYXIgYXMgZGlzY3JldGUgcGxhdGZvcm0gZGV2aWNlcy4KLQkgIE1GRHMgYXJlIHR5cGljYWxseSBmb3VuZCBvbiBlbWJlZGRlZCBwbGF0Zm9ybXMuCi0KLQkgIFRoaXMgb3B0aW9uIGFsb25lIGRvZXMgbm90IGFkZCBhbnkga2VybmVsIGNvZGUuCi0KLWlmIE1GRF9TVVBQT1JUCitpZiBIQVNfSU9NRU0KK21lbnUgIk11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMiCiAKIGNvbmZpZyBNRkRfQ09SRQogCXRyaXN0YXRlCkBAIC0zOTAsNiArMzc1LDcgQEAKIAl0cmlzdGF0ZSAiU3VwcG9ydCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004NDAwIgogCXNlbGVjdCBNRkRfQ09SRQogCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFJFR01BUF9JMkMKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgV29sZnNvbiBNaWNyb2VsZWNyb25pY3MgV004NDAwIFBNSUMgYW5kIGF1ZGlvCiAJICBDT0RFQy4gIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGNvbW1vbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcKQEAgLTUwMyw2ICs0ODksNyBAQAogY29uZmlnIE1GRF9QQ0Y1MDYzMwogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBOWFAgUENGNTA2MzMiCiAJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgUkVHTUFQX0kyQwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSBpZiB5b3UgaGF2ZSBOWFAgUENGNTA2MzMgY2hpcCBvbiB5b3VyIGJvYXJkLgogCSAgVGhpcyBjb3JlIGRyaXZlciBwcm92aWRlcyByZWdpc3RlciBhY2Nlc3MgYW5kIElSUSBoYW5kbGluZwpAQCAtNTc5LDYgKzU2NiwyMyBAQAogCSAgVGhpcyBlbmFibGVzIHRoZSBQQ0FQIEFTSUMgcHJlc2VudCBvbiBFWlggUGhvbmVzLiBUaGlzIGlzCiAJICBuZWVkZWQgZm9yIE1NQywgVG91Y2hTY3JlZW4sIFNvdW5kLCBVU0IsIGV0Yy4uCiAKK2NvbmZpZyBBQjU1MDBfQ09SRQorCWJvb2wgIlNULUVyaWNzc29uIEFCNTUwMCBNaXhlZCBTaWduYWwgUG93ZXIgTWFuYWdlbWVudCBjaGlwIgorCWRlcGVuZHMgb24gQUJYNTAwX0NPUkUgJiYgTUZEX0RCNTUwMF9QUkNNVQorCXNlbGVjdCBNRkRfQ09SRQorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgYWNjZXNzIHRvIEFCNTUwMCBwb3dlciBtYW5hZ2VtZW50CisJICBjaGlwLiBUaGlzIGNvbm5lY3RzIHRvIHRoZSBkYjU1MDAgY2hpcCB2aWEgdGhlIEkyQyBidXMgdmlhIFBSQ01VLgorCSAgVGhpcyBjaGlwIGVtYmVkcyB2YXJpb3VzIG90aGVyIG11bHRpbWVkaWEgZnVudGlvbmFsaXRpZXMgYXMgd2VsbC4KKworY29uZmlnIEFCNTUwMF9ERUJVRworCWJvb2wgIkVuYWJsZSBkZWJ1ZyBpbmZvIHZpYSBkZWJ1Z2ZzIgorCWRlcGVuZHMgb24gQUI1NTAwX0NPUkUgJiYgREVCVUdfRlMKKwlkZWZhdWx0IHkgaWYgREVCVUdfRlMKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgZGVidWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgQUI1NTAwCisJICB1c2luZyB0aGUgZGVidWcgZmlsZXN5c3RlbSwgZGVidWdmcy4KKwogY29uZmlnIEFCODUwMF9DT1JFCiAJYm9vbCAiU1QtRXJpY3Nzb24gQUI4NTAwIE1peGVkIFNpZ25hbCBQb3dlciBNYW5hZ2VtZW50IGNoaXAiCiAJZGVwZW5kcyBvbiBHRU5FUklDX0hBUkRJUlFTICYmIEFCWDUwMF9DT1JFCkBAIC02MTUsMjAgKzYxOSw2IEBACiAJaGVscAogCSAgQUI4NTAwIEdQQURDIGRyaXZlciB1c2VkIHRvIGNvbnZlcnQgQWNjIGFuZCBiYXR0ZXJ5L2FjL3VzYiB2b2x0YWdlCiAKLWNvbmZpZyBBQjM1NTBfQ09SRQotICAgICAgICBib29sICJTVC1Fcmljc3NvbiBBQjM1NTAgTWl4ZWQgU2lnbmFsIENpcmN1aXQgY29yZSBmdW5jdGlvbnMiCi0Jc2VsZWN0IE1GRF9DT1JFCi0JZGVwZW5kcyBvbiBJMkM9eSAmJiBHRU5FUklDX0hBUkRJUlFTICYmIEFCWDUwMF9DT1JFCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIHRoZSBBQjM1NTAgTWl4ZWQgU2lnbmFsIElDIGNvcmUKLQkgIGZ1bmN0aW9uYWxpdHkuIFRoaXMgY29ubmVjdHMgdG8gYSBBQjM1NTAgb24gdGhlIEkyQyBidXMKLQkgIGFuZCBleHBvc2UgYSBudW1iZXIgb2Ygc3ltYm9scyBuZWVkZWQgZm9yIGRlcGVuZGVudCBkZXZpY2VzCi0JICB0byByZWFkIGFuZCB3cml0ZSByZWdpc3RlcnMgYW5kIHN1YnNjcmliZSB0byBldmVudHMgZnJvbQotCSAgdGhpcyBtdWx0aS1mdW5jdGlvbmFsIElDLiBUaGlzIGlzIG5lZWRlZCB0byB1c2Ugb3RoZXIgZmVhdHVyZXMKLQkgIG9mIHRoZSBBQjM1NTAgc3VjaCBhcyBiYXR0ZXJ5LWJhY2tlZCBSVEMsIGNoYXJnaW5nIGNvbnRyb2wsCi0JICBMRURzLCB2aWJyYXRvciwgc3lzdGVtIHBvd2VyIGFuZCB0ZW1wZXJhdHVyZSwgcG93ZXIgbWFuYWdlbWVudAotCSAgYW5kIEFMU0Egc291bmQuCi0KIGNvbmZpZyBNRkRfREI4NTAwX1BSQ01VCiAJYm9vbCAiU1QtRXJpY3Nzb24gREI4NTAwIFBvd2VyIFJlc2V0IENvbnRyb2wgTWFuYWdlbWVudCBVbml0IgogCWRlcGVuZHMgb24gVVg1MDBfU09DX0RCODUwMApAQCAtNzczLDcgKzc2MywxNyBAQAogCSAgYWRkaXRpb25hbCBkcml2ZXJzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlCiAJICBmdW5jdGlvbmFsaXR5IG9mIHRoZSBkZXZpY2UuCiAKLWVuZGlmICMgTUZEX1NVUFBPUlQKK2NvbmZpZyBNRkRfSU5URUxfTVNJQworCWJvb2wgIlN1cHBvcnQgZm9yIEludGVsIE1TSUMiCisJZGVwZW5kcyBvbiBJTlRFTF9TQ1VfSVBDCisJc2VsZWN0IE1GRF9DT1JFCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBhY2Nlc3MgdG8gSW50ZWwgTVNJQyAoQXZhdGVsZQorCSAgUGFzc2FnZSkgY2hpcC4gVGhpcyBjaGlwIGVtYmVkcyBhdWRpbywgYmF0dGVyeSwgR1BJTywgZXRjLgorCSAgZGV2aWNlcyB1c2VkIGluIEludGVsIE1lZGZpZWxkIHBsYXRmb3Jtcy4KKworZW5kbWVudQorZW5kaWYKIAogbWVudSAiTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzIgogCWRlcGVuZHMgb24gQVJDSF9TQTExMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL01ha2VmaWxlIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKaW5kZXggYzU4MDIwMy4uYjIyOTJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKQEAgLTc5LDcgKzc5LDggQEAKIG9iai0kKENPTkZJR19BQlg1MDBfQ09SRSkJKz0gYWJ4NTAwLWNvcmUubwogb2JqLSQoQ09ORklHX0FCMzEwMF9DT1JFKQkrPSBhYjMxMDAtY29yZS5vCiBvYmotJChDT05GSUdfQUIzMTAwX09UUCkJKz0gYWIzMTAwLW90cC5vCi1vYmotJChDT05GSUdfQUIzNTUwX0NPUkUpCSs9IGFiMzU1MC1jb3JlLm8KK29iai0kKENPTkZJR19BQjU1MDBfQ09SRSkJKz0gYWI1NTAwLWNvcmUubworb2JqLSQoQ09ORklHX0FCNTUwMF9ERUJVRykJKz0gYWI1NTAwLWRlYnVnZnMubwogb2JqLSQoQ09ORklHX0FCODUwMF9DT1JFKQkrPSBhYjg1MDAtY29yZS5vIGFiODUwMC1zeXNjdHJsLm8KIG9iai0kKENPTkZJR19BQjg1MDBfREVCVUcpCSs9IGFiODUwMC1kZWJ1Z2ZzLm8KIG9iai0kKENPTkZJR19BQjg1MDBfR1BBREMpCSs9IGFiODUwMC1ncGFkYy5vCkBAIC0xMDIsMyArMTAzLDQgQEAKIG9iai0kKENPTkZJR19NRkRfUE04WFhYX0lSUSkgCSs9IHBtOHh4eC1pcnEubwogb2JqLSQoQ09ORklHX1RQUzY1OTExX0NPTVBBUkFUT1IpCSs9IHRwczY1OTExLWNvbXBhcmF0b3Iubwogb2JqLSQoQ09ORklHX01GRF9BQVQyODcwX0NPUkUpCSs9IGFhdDI4NzAtY29yZS5vCitvYmotJChDT05GSUdfTUZEX0lOVEVMX01TSUMpCSs9IGludGVsX21zaWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWF0Mjg3MC1jb3JlLmMgYi9kcml2ZXJzL21mZC9hYXQyODcwLWNvcmUuYwppbmRleCAzNDVkYzY1Li4wMmM0MjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYXQyODcwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hYXQyODcwLWNvcmUuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiB7CiAJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaGFyIGJ1ZlszMl07Ci0JaW50IGJ1Zl9zaXplOworCXNzaXplX3QgYnVmX3NpemU7CiAJY2hhciAqc3RhcnQgPSBidWY7CiAJdW5zaWduZWQgbG9uZyBhZGRyLCB2YWw7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiMzEwMC1jb3JlLmMgYi9kcml2ZXJzL21mZC9hYjMxMDAtY29yZS5jCmluZGV4IGEyMGUxYzQuLjYwMTA3ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FiMzEwMC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvYWIzMTAwLWNvcmUuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtODA5LDcgKzgxMCw3IEBACiAJY2hhcgkqbmFtZTsKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWJfZmFtaWx5X2lkIGlkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFiX2ZhbWlseV9pZCBpZHNbXSBfX2RldmluaXRjb25zdCA9IHsKIAkvKiBBQjMxMDAgKi8KIAl7CiAJCS5pZCA9IDB4YzAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjM1NTAtY29yZS5jIGIvZHJpdmVycy9tZmQvYWIzNTUwLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiYTE5NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21mZC9hYjM1NTAtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgU1QtRXJpY3Nzb24KLSAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgotICogTG93LWxldmVsIGNvcmUgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIEFCMzU1MCBJQyBvbiB0aGUgSTJDIGJ1cwotICogYW5kIHNvbWUgYmFzaWMgY2hpcC1jb25maWd1cmF0aW9uLgotICogQXV0aG9yOiBCZW5ndCBKb25zc29uIDxiZW5ndC5nLmpvbnNzb25Ac3Rlcmljc3Nvbi5jb20+Ci0gKiBBdXRob3I6IE1hdHRpYXMgTmlsc3NvbiA8bWF0dGlhcy5pLm5pbHNzb25Ac3Rlcmljc3Nvbi5jb20+Ci0gKiBBdXRob3I6IE1hdHRpYXMgV2FsbGluIDxtYXR0aWFzLndhbGxpbkBzdGVyaWNzc29uLmNvbT4KLSAqIEF1dGhvcjogUmlja2FyZCBBbmRlcnNzb24gPHJpY2thcmQuYW5kZXJzc29uQHN0ZXJpY3Nzb24uY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Ci0KLSNkZWZpbmUgQUIzNTUwX05BTUVfU1RSSU5HICJhYjM1NTAiCi0jZGVmaW5lIEFCMzU1MF9JRF9GT1JNQVRfU1RSSU5HICJBQjM1NTAgJXMiCi0jZGVmaW5lIEFCMzU1MF9OVU1fQkFOS1MgMgotI2RlZmluZSBBQjM1NTBfTlVNX0VWRU5UX1JFRyA1Ci0KLS8qIFRoZXNlIGFyZSB0aGUgb25seSByZWdpc3RlcnMgaW5zaWRlIEFCMzU1MCB1c2VkIGluIHRoaXMgbWFpbiBmaWxlICovCi0KLS8qIENoaXAgSUQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQUIzNTUwX0NJRF9SRUcgICAgICAgICAgIDB4MjAKLQotLyogSW50ZXJydXB0IGV2ZW50IHJlZ2lzdGVycyAqLwotI2RlZmluZSBBQjM1NTBfRVZFTlRfQkFOSyAgICAgICAgMAotI2RlZmluZSBBQjM1NTBfRVZFTlRfUkVHICAgICAgICAgMHgyMgotCi0vKiBSZWFkL3dyaXRlIG9wZXJhdGlvbiB2YWx1ZXMuICovCi0jZGVmaW5lIEFCMzU1MF9QRVJNX1JEICgweDAxKQotI2RlZmluZSBBQjM1NTBfUEVSTV9XUiAoMHgwMikKLQotLyogUmVhZC93cml0ZSBwZXJtaXNzaW9ucy4gKi8KLSNkZWZpbmUgQUIzNTUwX1BFUk1fUk8gKEFCMzU1MF9QRVJNX1JEKQotI2RlZmluZSBBQjM1NTBfUEVSTV9SVyAoQUIzNTUwX1BFUk1fUkQgfCBBQjM1NTBfUEVSTV9XUikKLQotLyoqCi0gKiBzdHJ1Y3QgYWIzNTUwCi0gKiBAYWNjZXNzX211dGV4OiBsb2NrIG91dCBjb25jdXJyZW50IGFjY2Vzc2VzIHRvIHRoZSBBQiByZWdpc3RlcnMKLSAqIEBpMmNfY2xpZW50OiBJMkMgY2xpZW50IGZvciB0aGlzIGNoaXAKLSAqIEBjaGlwX25hbWU6IG5hbWUgb2YgdGhpcyBjaGlwIHZhcmlhbnQKLSAqIEBjaGlwX2lkOiA4IGJpdCBjaGlwIElEIGZvciB0aGlzIGNoaXAgdmFyaWFudAotICogQG1hc2tfd29yazogYSB3b3JrZXIgZm9yIHdyaXRpbmcgdG8gbWFzayByZWdpc3RlcnMKLSAqIEBldmVudF9sb2NrOiBhIGxvY2sgdG8gcHJvdGVjdCB0aGUgZXZlbnRfbWFzawotICogQGV2ZW50X21hc2s6IGEgbG9jYWwgY29weSBvZiB0aGUgbWFzayBldmVudCByZWdpc3RlcnMKLSAqIEBzdGFydHVwX2V2ZW50czogYSBjb3B5IG9mIHRoZSBmaXJzdCByZWFkaW5nIG9mIHRoZSBldmVudCByZWdpc3RlcnMKLSAqIEBzdGFydHVwX2V2ZW50c19yZWFkOiB3aGV0aGVyIHRoZSBmaXJzdCBldmVudHMgaGF2ZSBiZWVuIHJlYWQKLSAqLwotc3RydWN0IGFiMzU1MCB7Ci0Jc3RydWN0IG11dGV4IGFjY2Vzc19tdXRleDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudFtBQjM1NTBfTlVNX0JBTktTXTsKLQljaGFyIGNoaXBfbmFtZVszMl07Ci0JdTggY2hpcF9pZDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbWFza193b3JrOwotCXNwaW5sb2NrX3QgZXZlbnRfbG9jazsKLQl1OCBldmVudF9tYXNrW0FCMzU1MF9OVU1fRVZFTlRfUkVHXTsKLQl1OCBzdGFydHVwX2V2ZW50c1tBQjM1NTBfTlVNX0VWRU5UX1JFR107Ci0JYm9vbCBzdGFydHVwX2V2ZW50c19yZWFkOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXVuc2lnbmVkIGludCBkZWJ1Z19iYW5rOwotCXVuc2lnbmVkIGludCBkZWJ1Z19hZGRyZXNzOwotI2VuZGlmCi19OwotCi0vKioKLSAqIHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlCi0gKiBAZmlyc3Q6IHRoZSBmaXJzdCBhZGRyZXNzIG9mIHRoZSByYW5nZQotICogQGxhc3Q6IHRoZSBsYXN0IGFkZHJlc3Mgb2YgdGhlIHJhbmdlCi0gKiBAcGVybTogYWNjZXNzIHBlcm1pc3Npb25zIGZvciB0aGUgcmFuZ2UKLSAqLwotc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2UgewotCXU4IGZpcnN0OwotCXU4IGxhc3Q7Ci0JdTggcGVybTsKLX07Ci0KLS8qKgotICogc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VzCi0gKiBAY291bnQ6IHRoZSBudW1iZXIgb2YgcmFuZ2VzIGluIHRoZSBsaXN0Ci0gKiBAcmFuZ2U6IHRoZSBsaXN0IG9mIHJlZ2lzdGVyIHJhbmdlcwotICovCi1zdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZXMgewotCXU4IGNvdW50OwotCWNvbnN0IHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlICpyYW5nZTsKLX07Ci0KLS8qCi0gKiBQZXJtaXNzaWJsZSByZWdpc3RlciByYW5nZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgcGVyIGRldmljZSBhbmQgYmFuay4KLSAqCi0gKiBUaGUgcmFuZ2VzIG11c3QgYmUgbGlzdGVkIGluIGluY3JlYXNpbmcgYWRkcmVzcyBvcmRlciwgYW5kIG5vIG92ZXJsYXBzIGFyZQotICogYWxsb3dlZC4gSXQgaXMgYXNzdW1lZCB0aGF0IHdyaXRlIHBlcm1pc3Npb24gaW1wbGllcyByZWFkIHBlcm1pc3Npb24KLSAqIChpLmUuIG9ubHkgUk8gYW5kIFJXIHBlcm1pc3Npb25zIHNob3VsZCBiZSB1c2VkKS4gIFJhbmdlcyB3aXRoIHdyaXRlCi0gKiBwZXJtaXNzaW9uIG11c3Qgbm90IGJlIHNwbGl0IHVwLgotICovCi0KLSNkZWZpbmUgTk9fUkFOR0Ugey5jb3VudCA9IDAsIC5yYW5nZSA9IE5VTEwsfQotCi1zdGF0aWMgc3RydWN0Ci1hYjM1NTBfcmVnX3JhbmdlcyBhYjM1NTBfcmVnX3Jhbmdlc1tBQjM1NTBfTlVNX0RFVklDRVNdW0FCMzU1MF9OVU1fQkFOS1NdID0gewotCVtBQjM1NTBfREVWSURfREFDXSA9IHsKLQkJTk9fUkFOR0UsCi0JCXsKLQkJCS5jb3VudCA9IDIsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHhiMCwKLQkJCQkJLmxhc3QgPSAweGJhLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0JCQkJewotCQkJCQkuZmlyc3QgPSAweGJjLAotCQkJCQkubGFzdCA9IDB4YzMsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUlcsCi0JCQkJfSwKLQkJCX0sCi0JCX0sCi0JfSwKLQlbQUIzNTUwX0RFVklEX0xFRFNdID0gewotCQlOT19SQU5HRSwKLQkJewotCQkJLmNvdW50ID0gMiwKLQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQkJewotCQkJCQkuZmlyc3QgPSAweDVhLAotCQkJCQkubGFzdCA9IDB4ODgsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUlcsCi0JCQkJfSwKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4OGEsCi0JCQkJCS5sYXN0ID0gMHhhZCwKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9SVywKLQkJCQl9LAotCQkJfQotCQl9LAotCX0sCi0JW0FCMzU1MF9ERVZJRF9QT1dFUl0gPSB7Ci0JCXsKLQkJCS5jb3VudCA9IDEsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHgyMSwKLQkJCQkJLmxhc3QgPSAweDIxLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JPLAotCQkJCX0sCi0JCQl9Ci0JCX0sCi0JCU5PX1JBTkdFLAotCX0sCi0JW0FCMzU1MF9ERVZJRF9SRUdVTEFUT1JTXSA9IHsKLQkJewotCQkJLmNvdW50ID0gMSwKLQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQkJewotCQkJCQkuZmlyc3QgPSAweDY5LAotCQkJCQkubGFzdCA9IDB4YTMsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUlcsCi0JCQkJfSwKLQkJCX0KLQkJfSwKLQkJewotCQkJLmNvdW50ID0gMSwKLQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQkJewotCQkJCQkuZmlyc3QgPSAweDE0LAotCQkJCQkubGFzdCA9IDB4MTYsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUlcsCi0JCQkJfSwKLQkJCX0KLQkJfSwKLQl9LAotCVtBQjM1NTBfREVWSURfU0lNXSA9IHsKLQkJewotCQkJLmNvdW50ID0gMSwKLQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQkJewotCQkJCQkuZmlyc3QgPSAweDIxLAotCQkJCQkubGFzdCA9IDB4MjEsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUk8sCi0JCQkJfSwKLQkJCX0KLQkJfSwKLQkJewotCQkJLmNvdW50ID0gMSwKLQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQkJewotCQkJCQkuZmlyc3QgPSAweDE0LAotCQkJCQkubGFzdCA9IDB4MTcsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUlcsCi0JCQkJfSwKLQkJCX0KLQotCQl9LAotCX0sCi0JW0FCMzU1MF9ERVZJRF9VQVJUXSA9IHsKLQkJTk9fUkFOR0UsCi0JCU5PX1JBTkdFLAotCX0sCi0JW0FCMzU1MF9ERVZJRF9SVENdID0gewotCQl7Ci0JCQkuY291bnQgPSAxLAotCQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4MDAsCi0JCQkJCS5sYXN0ID0gMHgwYywKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9SVywKLQkJCQl9LAotCQkJfQotCQl9LAotCQlOT19SQU5HRSwKLQl9LAotCVtBQjM1NTBfREVWSURfQ0hBUkdFUl0gPSB7Ci0JCXsKLQkJCS5jb3VudCA9IDIsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHgxMCwKLQkJCQkJLmxhc3QgPSAweDFhLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0JCQkJewotCQkJCQkuZmlyc3QgPSAweDIxLAotCQkJCQkubGFzdCA9IDB4MjEsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUk8sCi0JCQkJfSwKLQkJCX0KLQkJfSwKLQkJTk9fUkFOR0UsCi0JfSwKLQlbQUIzNTUwX0RFVklEX0FEQ10gPSB7Ci0JCU5PX1JBTkdFLAotCQl7Ci0JCQkuY291bnQgPSAxLAotCQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4MjAsCi0JCQkJCS5sYXN0ID0gMHg1NiwKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9SVywKLQkJCQl9LAotCi0JCQl9Ci0JCX0sCi0JfSwKLQlbQUIzNTUwX0RFVklEX0ZVRUxHQVVHRV0gPSB7Ci0JCXsKLQkJCS5jb3VudCA9IDEsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHgyMSwKLQkJCQkJLmxhc3QgPSAweDIxLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JPLAotCQkJCX0sCi0JCQl9Ci0JCX0sCi0JCXsKLQkJCS5jb3VudCA9IDEsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHgwMCwKLQkJCQkJLmxhc3QgPSAweDBlLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0JCQl9Ci0JCX0sCi0JfSwKLQlbQUIzNTUwX0RFVklEX1ZJQlJBVE9SXSA9IHsKLQkJTk9fUkFOR0UsCi0JCXsKLQkJCS5jb3VudCA9IDEsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHgxMCwKLQkJCQkJLmxhc3QgPSAweDEzLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0KLQkJCX0KLQkJfSwKLQl9LAotCVtBQjM1NTBfREVWSURfQ09ERUNdID0gewotCQl7Ci0JCQkuY291bnQgPSAyLAotCQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4MzEsCi0JCQkJCS5sYXN0ID0gMHg2MywKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9SVywKLQkJCQl9LAotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHg2NSwKLQkJCQkJLmxhc3QgPSAweDY4LAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0JCQl9Ci0JCX0sCi0JCU5PX1JBTkdFLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1mZF9jZWxsIGFiMzU1MF9kZXZzW0FCMzU1MF9OVU1fREVWSUNFU10gPSB7Ci0JW0FCMzU1MF9ERVZJRF9EQUNdID0gewotCQkubmFtZSA9ICJhYjM1NTAtZGFjIiwKLQkJLmlkID0gQUIzNTUwX0RFVklEX0RBQywKLQkJLm51bV9yZXNvdXJjZXMgPSAwLAotCX0sCi0JW0FCMzU1MF9ERVZJRF9MRURTXSA9IHsKLQkJLm5hbWUgPSAiYWIzNTUwLWxlZHMiLAotCQkuaWQgPSBBQjM1NTBfREVWSURfTEVEUywKLQl9LAotCVtBQjM1NTBfREVWSURfUE9XRVJdID0gewotCQkubmFtZSA9ICJhYjM1NTAtcG93ZXIiLAotCQkuaWQgPSBBQjM1NTBfREVWSURfUE9XRVIsCi0JfSwKLQlbQUIzNTUwX0RFVklEX1JFR1VMQVRPUlNdID0gewotCQkubmFtZSA9ICJhYjM1NTAtcmVndWxhdG9ycyIsCi0JCS5pZCA9IEFCMzU1MF9ERVZJRF9SRUdVTEFUT1JTLAotCX0sCi0JW0FCMzU1MF9ERVZJRF9TSU1dID0gewotCQkubmFtZSA9ICJhYjM1NTAtc2ltIiwKLQkJLmlkID0gQUIzNTUwX0RFVklEX1NJTSwKLQl9LAotCVtBQjM1NTBfREVWSURfVUFSVF0gPSB7Ci0JCS5uYW1lID0gImFiMzU1MC11YXJ0IiwKLQkJLmlkID0gQUIzNTUwX0RFVklEX1VBUlQsCi0JfSwKLQlbQUIzNTUwX0RFVklEX1JUQ10gPSB7Ci0JCS5uYW1lID0gImFiMzU1MC1ydGMiLAotCQkuaWQgPSBBQjM1NTBfREVWSURfUlRDLAotCX0sCi0JW0FCMzU1MF9ERVZJRF9DSEFSR0VSXSA9IHsKLQkJLm5hbWUgPSAiYWIzNTUwLWNoYXJnZXIiLAotCQkuaWQgPSBBQjM1NTBfREVWSURfQ0hBUkdFUiwKLQl9LAotCVtBQjM1NTBfREVWSURfQURDXSA9IHsKLQkJLm5hbWUgPSAiYWIzNTUwLWFkYyIsCi0JCS5pZCA9IEFCMzU1MF9ERVZJRF9BREMsCi0JCS5udW1fcmVzb3VyY2VzID0gMTAsCi0JCS5yZXNvdXJjZXMgPSAoc3RydWN0IHJlc291cmNlW10pIHsKLQkJCXsKLQkJCQkubmFtZSA9ICJUUklHR0VSLTAiLAotCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQkJCS5zdGFydCA9IDE2LAotCQkJCS5lbmQgPSAxNiwKLQkJCX0sCi0JCQl7Ci0JCQkJLm5hbWUgPSAiVFJJR0dFUi0xIiwKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCQkuc3RhcnQgPSAxNywKLQkJCQkuZW5kID0gMTcsCi0JCQl9LAotCQkJewotCQkJCS5uYW1lID0gIlRSSUdHRVItMiIsCi0JCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JCQkJLnN0YXJ0ID0gMTgsCi0JCQkJLmVuZCA9IDE4LAotCQkJfSwKLQkJCXsKLQkJCQkubmFtZSA9ICJUUklHR0VSLTMiLAotCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQkJCS5zdGFydCA9IDE5LAotCQkJCS5lbmQgPSAxOSwKLQkJCX0sCi0JCQl7Ci0JCQkJLm5hbWUgPSAiVFJJR0dFUi00IiwKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCQkuc3RhcnQgPSAyMCwKLQkJCQkuZW5kID0gMjAsCi0JCQl9LAotCQkJewotCQkJCS5uYW1lID0gIlRSSUdHRVItNSIsCi0JCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JCQkJLnN0YXJ0ID0gMjEsCi0JCQkJLmVuZCA9IDIxLAotCQkJfSwKLQkJCXsKLQkJCQkubmFtZSA9ICJUUklHR0VSLTYiLAotCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQkJCS5zdGFydCA9IDIyLAotCQkJCS5lbmQgPSAyMiwKLQkJCX0sCi0JCQl7Ci0JCQkJLm5hbWUgPSAiVFJJR0dFUi03IiwKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCQkuc3RhcnQgPSAyMywKLQkJCQkuZW5kID0gMjMsCi0JCQl9LAotCQkJewotCQkJCS5uYW1lID0gIlRSSUdHRVItVkJBVC1UWE9OIiwKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCQkuc3RhcnQgPSAxMywKLQkJCQkuZW5kID0gMTMsCi0JCQl9LAotCQkJewotCQkJCS5uYW1lID0gIlRSSUdHRVItVkJBVCIsCi0JCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JCQkJLnN0YXJ0ID0gMTIsCi0JCQkJLmVuZCA9IDEyLAotCQkJfSwKLQkJfSwKLQl9LAotCVtBQjM1NTBfREVWSURfRlVFTEdBVUdFXSA9IHsKLQkJLm5hbWUgPSAiYWIzNTUwLWZ1ZWxnYXVnZSIsCi0JCS5pZCA9IEFCMzU1MF9ERVZJRF9GVUVMR0FVR0UsCi0JfSwKLQlbQUIzNTUwX0RFVklEX1ZJQlJBVE9SXSA9IHsKLQkJLm5hbWUgPSAiYWIzNTUwLXZpYnJhdG9yIiwKLQkJLmlkID0gQUIzNTUwX0RFVklEX1ZJQlJBVE9SLAotCX0sCi0JW0FCMzU1MF9ERVZJRF9DT0RFQ10gPSB7Ci0JCS5uYW1lID0gImFiMzU1MC1jb2RlYyIsCi0JCS5pZCA9IEFCMzU1MF9ERVZJRF9DT0RFQywKLQl9LAotfTsKLQotLyoKLSAqIEkyQyB0cmFuc2FjdGlvbnMgd2l0aCBlcnJvciBtZXNzYWdlcy4KLSAqLwotc3RhdGljIGludCBhYjM1NTBfaTJjX21hc3Rlcl9zZW5kKHN0cnVjdCBhYjM1NTAgKmFiLCB1OCBiYW5rLCB1OCAqZGF0YSwKLQl1OCBjb3VudCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gaTJjX21hc3Rlcl9zZW5kKGFiLT5pMmNfY2xpZW50W2JhbmtdLCBkYXRhLCBjb3VudCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJZGV2X2VycigmYWItPmkyY19jbGllbnRbMF0tPmRldiwgInNlbmQgZXJyb3I6ICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhYjM1NTBfaTJjX21hc3Rlcl9yZWN2KHN0cnVjdCBhYjM1NTAgKmFiLCB1OCBiYW5rLCB1OCAqZGF0YSwKLQl1OCBjb3VudCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gaTJjX21hc3Rlcl9yZWN2KGFiLT5pMmNfY2xpZW50W2JhbmtdLCBkYXRhLCBjb3VudCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJZGV2X2VycigmYWItPmkyY19jbGllbnRbMF0tPmRldiwgInJlY2VpdmUgZXJyb3I6ICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uYWxpdHkgZm9yIGdldHRpbmcvc2V0dGluZyByZWdpc3RlciB2YWx1ZXMuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoc3RydWN0IGFiMzU1MCAqYWIsIHU4IGJhbmssIHU4IHJlZywKLQl1OCAqdmFsdWUpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWItPmFjY2Vzc19tdXRleCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IGFiMzU1MF9pMmNfbWFzdGVyX3NlbmQoYWIsIGJhbmssICZyZWcsIDEpOwotCWlmICghZXJyKQotCQllcnIgPSBhYjM1NTBfaTJjX21hc3Rlcl9yZWN2KGFiLCBiYW5rLCB2YWx1ZSwgMSk7Ci0KLQltdXRleF91bmxvY2soJmFiLT5hY2Nlc3NfbXV0ZXgpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X3JlZ2lzdGVyX3BhZ2VfaW50ZXJydXB0aWJsZShzdHJ1Y3QgYWIzNTUwICphYiwgdTggYmFuaywKLQl1OCBmaXJzdF9yZWcsIHU4ICpyZWd2YWxzLCB1OCBudW1yZWdzKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmFiLT5hY2Nlc3NfbXV0ZXgpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBhYjM1NTBfaTJjX21hc3Rlcl9zZW5kKGFiLCBiYW5rLCAmZmlyc3RfcmVnLCAxKTsKLQlpZiAoIWVycikKLQkJZXJyID0gYWIzNTUwX2kyY19tYXN0ZXJfcmVjdihhYiwgYmFuaywgcmVndmFscywgbnVtcmVncyk7Ci0KLQltdXRleF91bmxvY2soJmFiLT5hY2Nlc3NfbXV0ZXgpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoc3RydWN0IGFiMzU1MCAqYWIsIHU4IGJhbmssCi0JdTggcmVnLCB1OCBiaXRtYXNrLCB1OCBiaXR2YWx1ZXMpCi17Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAobGlrZWx5KGJpdG1hc2spKSB7Ci0JCXU4IHJlZ19iaXRzWzJdID0ge3JlZywgMH07Ci0KLQkJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhYi0+YWNjZXNzX211dGV4KTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJaWYgKGJpdG1hc2sgPT0gMHhGRikgLyogTm8gbmVlZCB0byByZWFkIGluIHRoaXMgY2FzZS4gKi8KLQkJCXJlZ19iaXRzWzFdID0gYml0dmFsdWVzOwotCQllbHNlIHsgLyogUmVhZCBhbmQgbW9kaWZ5IHRoZSByZWdpc3RlciB2YWx1ZS4gKi8KLQkJCXU4IGJpdHM7Ci0KLQkJCWVyciA9IGFiMzU1MF9pMmNfbWFzdGVyX3NlbmQoYWIsIGJhbmssICZyZWcsIDEpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQkJZXJyID0gYWIzNTUwX2kyY19tYXN0ZXJfcmVjdihhYiwgYmFuaywgJmJpdHMsIDEpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQkJcmVnX2JpdHNbMV0gPSAoKH5iaXRtYXNrICYgYml0cykgfAotCQkJCShiaXRtYXNrICYgYml0dmFsdWVzKSk7Ci0JCX0KLQkJLyogV3JpdGUgdGhlIG5ldyB2YWx1ZS4gKi8KLQkJZXJyID0gYWIzNTUwX2kyY19tYXN0ZXJfc2VuZChhYiwgYmFuaywgcmVnX2JpdHMsIDIpOwotdW5sb2NrX2FuZF9yZXR1cm46Ci0JCW11dGV4X3VubG9jaygmYWItPmFjY2Vzc19tdXRleCk7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBSZWFkL3dyaXRlIHBlcm1pc3Npb24gY2hlY2tpbmcgZnVuY3Rpb25zLgotICovCi1zdGF0aWMgYm9vbCBwYWdlX3dyaXRlX2FsbG93ZWQoY29uc3Qgc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VzICpyYW5nZXMsCi0JdTggZmlyc3RfcmVnLCB1OCBsYXN0X3JlZykKLXsKLQl1OCBpOwotCi0JaWYgKGxhc3RfcmVnIDwgZmlyc3RfcmVnKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzLT5jb3VudDsgaSsrKSB7Ci0JCWlmIChmaXJzdF9yZWcgPCByYW5nZXMtPnJhbmdlW2ldLmZpcnN0KQotCQkJYnJlYWs7Ci0JCWlmICgobGFzdF9yZWcgPD0gcmFuZ2VzLT5yYW5nZVtpXS5sYXN0KSAmJgotCQkJKHJhbmdlcy0+cmFuZ2VbaV0ucGVybSAmIEFCMzU1MF9QRVJNX1dSKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHJlZ193cml0ZV9hbGxvd2VkKGNvbnN0IHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlcyAqcmFuZ2VzLCB1OCByZWcpCi17Ci0JcmV0dXJuIHBhZ2Vfd3JpdGVfYWxsb3dlZChyYW5nZXMsIHJlZywgcmVnKTsKLX0KLQotc3RhdGljIGJvb2wgcGFnZV9yZWFkX2FsbG93ZWQoY29uc3Qgc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VzICpyYW5nZXMsCi0JdTggZmlyc3RfcmVnLCB1OCBsYXN0X3JlZykKLXsKLQl1OCBpOwotCi0JaWYgKGxhc3RfcmVnIDwgZmlyc3RfcmVnKQotCQlyZXR1cm4gZmFsc2U7Ci0JLyogRmluZCB0aGUgcmFuZ2UgKGlmIGl0IGV4aXN0cyBpbiB0aGUgbGlzdCkgdGhhdCBpbmNsdWRlcyBmaXJzdF9yZWcuICovCi0JZm9yIChpID0gMDsgaSA8IHJhbmdlcy0+Y291bnQ7IGkrKykgewotCQlpZiAoZmlyc3RfcmVnIDwgcmFuZ2VzLT5yYW5nZVtpXS5maXJzdCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGZpcnN0X3JlZyA8PSByYW5nZXMtPnJhbmdlW2ldLmxhc3QpCi0JCQlicmVhazsKLQl9Ci0JLyogTWFrZSBzdXJlIHRoYXQgdGhlIGVudGlyZSByYW5nZSB1cCB0byBhbmQgaW5jbHVkaW5nIGxhc3RfcmVnIGlzCi0JICogcmVhZGFibGUuIFRoaXMgbWF5IHNwYW4gc2V2ZXJhbCBvZiB0aGUgcmFuZ2VzIGluIHRoZSBsaXN0LgotCSAqLwotCXdoaWxlICgoaSA8IHJhbmdlcy0+Y291bnQpICYmCi0JCShyYW5nZXMtPnJhbmdlW2ldLnBlcm0gJiBBQjM1NTBfUEVSTV9SRCkpIHsKLQkJaWYgKGxhc3RfcmVnIDw9IHJhbmdlcy0+cmFuZ2VbaV0ubGFzdCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoKCsraSA+PSByYW5nZXMtPmNvdW50KSB8fAotCQkJKHJhbmdlcy0+cmFuZ2VbaV0uZmlyc3QgIT0KLQkJCSAocmFuZ2VzLT5yYW5nZVtpIC0gMV0ubGFzdCArIDEpKSkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCByZWdfcmVhZF9hbGxvd2VkKGNvbnN0IHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlcyAqcmFuZ2VzLCB1OCByZWcpCi17Ci0JcmV0dXJuIHBhZ2VfcmVhZF9hbGxvd2VkKHJhbmdlcywgcmVnLCByZWcpOwotfQotCi0vKgotICogVGhlIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbmFsaXR5LgotICovCi1zdGF0aWMgaW50IGFiMzU1MF9nZXRfY2hpcF9pZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwotCXJldHVybiAoaW50KWFiLT5jaGlwX2lkOwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JdTggYmFuaywgdTggcmVnLCB1OCBiaXRtYXNrLCB1OCBiaXR2YWx1ZXMpCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWI7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCi0JaWYgKChBQjM1NTBfTlVNX0JBTktTIDw9IGJhbmspIHx8Ci0JCSFyZWdfd3JpdGVfYWxsb3dlZCgmYWIzNTUwX3JlZ19yYW5nZXNbcGRldi0+aWRdW2JhbmtdLCByZWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWFiID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQlyZXR1cm4gbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWIsIGJhbmssIHJlZywKLQkJYml0bWFzaywgYml0dmFsdWVzKTsKLX0KLQotc3RhdGljIGludCBhYjM1NTBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCBiYW5rLAotCXU4IHJlZywgdTggdmFsdWUpCi17Ci0JcmV0dXJuIGFiMzU1MF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIGJhbmssIHJlZywgMHhGRiwKLQkJdmFsdWUpOwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGJhbmssCi0JdTggcmVnLCB1OCAqdmFsdWUpCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWI7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCi0JaWYgKChBQjM1NTBfTlVNX0JBTktTIDw9IGJhbmspIHx8Ci0JCSFyZWdfcmVhZF9hbGxvd2VkKCZhYjM1NTBfcmVnX3Jhbmdlc1twZGV2LT5pZF1bYmFua10sIHJlZykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYWIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwotCXJldHVybiBnZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYiwgYmFuaywgcmVnLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX2dldF9yZWdpc3Rlcl9wYWdlX2ludGVycnVwdGlibGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCBiYW5rLAotCXU4IGZpcnN0X3JlZywgdTggKnJlZ3ZhbHMsIHU4IG51bXJlZ3MpCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWI7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCi0JaWYgKChBQjM1NTBfTlVNX0JBTktTIDw9IGJhbmspIHx8Ci0JCSFwYWdlX3JlYWRfYWxsb3dlZCgmYWIzNTUwX3JlZ19yYW5nZXNbcGRldi0+aWRdW2JhbmtdLAotCQkJZmlyc3RfcmVnLCAoZmlyc3RfcmVnICsgbnVtcmVncyAtIDEpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlhYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0JcmV0dXJuIGdldF9yZWdpc3Rlcl9wYWdlX2ludGVycnVwdGlibGUoYWIsIGJhbmssIGZpcnN0X3JlZywgcmVndmFscywKLQkJbnVtcmVncyk7Ci19Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX2V2ZW50X3JlZ2lzdGVyc19zdGFydHVwX3N0YXRlX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JdTggKmV2ZW50KQotewotCXN0cnVjdCBhYjM1NTAgKmFiOwotCi0JYWIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwotCWlmICghYWItPnN0YXJ0dXBfZXZlbnRzX3JlYWQpCi0JCXJldHVybiAtRUFHQUlOOyAvKiBUcnkgYWdhaW4gbGF0ZXIgKi8KLQotCW1lbWNweShldmVudCwgYWItPnN0YXJ0dXBfZXZlbnRzLCBBQjM1NTBfTlVNX0VWRU5UX1JFRyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX3N0YXJ0dXBfaXJxX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBhYjM1NTAgKmFiOwotCXN0cnVjdCBhYjM1NTBfcGxhdGZvcm1fZGF0YSAqcGxmX2RhdGE7Ci0JYm9vbCB2YWw7Ci0KLQlhYiA9IGlycV9nZXRfY2hpcF9kYXRhKGlycSk7Ci0JcGxmX2RhdGEgPSBhYi0+aTJjX2NsaWVudFswXS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaXJxIC09IHBsZl9kYXRhLT5pcnEuYmFzZTsKLQl2YWwgPSAoKGFiLT5zdGFydHVwX2V2ZW50c1tpcnEgLyA4XSAmIEJJVChpcnEgJSA4KSkgIT0gMCk7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgc3RydWN0IGFieDUwMF9vcHMgYWIzNTUwX29wcyA9IHsKLQkuZ2V0X2NoaXBfaWQgPSBhYjM1NTBfZ2V0X2NoaXBfaWQsCi0JLmdldF9yZWdpc3RlciA9IGFiMzU1MF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSwKLQkuc2V0X3JlZ2lzdGVyID0gYWIzNTUwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlLAotCS5nZXRfcmVnaXN0ZXJfcGFnZSA9IGFiMzU1MF9nZXRfcmVnaXN0ZXJfcGFnZV9pbnRlcnJ1cHRpYmxlLAotCS5zZXRfcmVnaXN0ZXJfcGFnZSA9IE5VTEwsCi0JLm1hc2tfYW5kX3NldF9yZWdpc3RlciA9IGFiMzU1MF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSwKLQkuZXZlbnRfcmVnaXN0ZXJzX3N0YXJ0dXBfc3RhdGVfZ2V0ID0KLQkJYWIzNTUwX2V2ZW50X3JlZ2lzdGVyc19zdGFydHVwX3N0YXRlX2dldCwKLQkuc3RhcnR1cF9pcnFfZW5hYmxlZCA9IGFiMzU1MF9zdGFydHVwX2lycV9lbmFibGVkLAotfTsKLQotc3RhdGljIGlycXJldHVybl90IGFiMzU1MF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBhYjM1NTAgKmFiID0gZGF0YTsKLQlpbnQgZXJyOwotCXVuc2lnbmVkIGludCBpOwotCXU4IGVbQUIzNTUwX05VTV9FVkVOVF9SRUddOwotCXU4ICpldmVudHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWV2ZW50cyA9IChhYi0+c3RhcnR1cF9ldmVudHNfcmVhZCA/IGUgOiBhYi0+c3RhcnR1cF9ldmVudHMpOwotCi0JZXJyID0gZ2V0X3JlZ2lzdGVyX3BhZ2VfaW50ZXJydXB0aWJsZShhYiwgQUIzNTUwX0VWRU5UX0JBTkssCi0JCUFCMzU1MF9FVkVOVF9SRUcsIGV2ZW50cywgQUIzNTUwX05VTV9FVkVOVF9SRUcpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2V2ZW50X3JkOwotCi0JaWYgKCFhYi0+c3RhcnR1cF9ldmVudHNfcmVhZCkgewotCQlkZXZfaW5mbygmYWItPmkyY19jbGllbnRbMF0tPmRldiwKLQkJCSJzdGFydHVwIGV2ZW50cyAweCV4LDB4JXgsMHgleCwweCV4LDB4JXhcbiIsCi0JCQlhYi0+c3RhcnR1cF9ldmVudHNbMF0sIGFiLT5zdGFydHVwX2V2ZW50c1sxXSwKLQkJCWFiLT5zdGFydHVwX2V2ZW50c1syXSwgYWItPnN0YXJ0dXBfZXZlbnRzWzNdLAotCQkJYWItPnN0YXJ0dXBfZXZlbnRzWzRdKTsKLQkJYWItPnN0YXJ0dXBfZXZlbnRzX3JlYWQgPSB0cnVlOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBUaGUgdHdvIGhpZ2hlc3QgYml0cyBpbiBldmVudFs0XSBhcmUgbm90IHVzZWQuICovCi0JZXZlbnRzWzRdICY9IDB4M2Y7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWItPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgQUIzNTUwX05VTV9FVkVOVF9SRUc7IGkrKykKLQkJZXZlbnRzW2ldICY9IH5hYi0+ZXZlbnRfbWFza1tpXTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhYi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCi0JZm9yIChpID0gMDsgaSA8IEFCMzU1MF9OVU1fRVZFTlRfUkVHOyBpKyspIHsKLQkJdTggYml0OwotCQl1OCBldmVudF9yZWc7Ci0KLQkJZGV2X2RiZygmYWItPmkyY19jbGllbnRbMF0tPmRldiwgIklSUSBFdmVudFslZF06IDB4JTJ4XG4iLAotCQkJaSwgZXZlbnRzW2ldKTsKLQotCQlldmVudF9yZWcgPSBldmVudHNbaV07Ci0JCWZvciAoYml0ID0gMDsgZXZlbnRfcmVnOyBiaXQrKywgZXZlbnRfcmVnIC89IDIpIHsKLQkJCWlmIChldmVudF9yZWcgJSAyKSB7Ci0JCQkJdW5zaWduZWQgaW50IGlycTsKLQkJCQlzdHJ1Y3QgYWIzNTUwX3BsYXRmb3JtX2RhdGEgKnBsZl9kYXRhOwotCi0JCQkJcGxmX2RhdGEgPSBhYi0+aTJjX2NsaWVudFswXS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JCQkJaXJxID0gcGxmX2RhdGEtPmlycS5iYXNlICsgKGkgKiA4KSArIGJpdDsKLQkJCQloYW5kbGVfbmVzdGVkX2lycShpcnEpOwotCQkJfQotCQl9Ci0JfQotb3V0OgotCXJldHVybiBJUlFfSEFORExFRDsKLQotZXJyX2V2ZW50X3JkOgotCWRldl9kYmcoJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsICJlcnJvciByZWFkaW5nIGV2ZW50IHJlZ2lzdGVyc1xuIik7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VzIGRlYnVnX3Jhbmdlc1tBQjM1NTBfTlVNX0JBTktTXSA9IHsKLQl7Ci0JCS5jb3VudCA9IDYsCi0JCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQl7Ci0JCQkJLmZpcnN0ID0gMHgwMCwKLQkJCQkubGFzdCA9IDB4MGUsCi0JCQl9LAotCQkJewotCQkJCS5maXJzdCA9IDB4MTAsCi0JCQkJLmxhc3QgPSAweDFhLAotCQkJfSwKLQkJCXsKLQkJCQkuZmlyc3QgPSAweDFlLAotCQkJCS5sYXN0ID0gMHg0ZiwKLQkJCX0sCi0JCQl7Ci0JCQkJLmZpcnN0ID0gMHg1MSwKLQkJCQkubGFzdCA9IDB4NjMsCi0JCQl9LAotCQkJewotCQkJCS5maXJzdCA9IDB4NjUsCi0JCQkJLmxhc3QgPSAweGEzLAotCQkJfSwKLQkJCXsKLQkJCQkuZmlyc3QgPSAweGE1LAotCQkJCS5sYXN0ID0gMHhhOCwKLQkJCX0sCi0JCX0KLQl9LAotCXsKLQkJLmNvdW50ID0gOCwKLQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCXsKLQkJCQkuZmlyc3QgPSAweDAwLAotCQkJCS5sYXN0ID0gMHgwZSwKLQkJCX0sCi0JCQl7Ci0JCQkJLmZpcnN0ID0gMHgxMCwKLQkJCQkubGFzdCA9IDB4MTcsCi0JCQl9LAotCQkJewotCQkJCS5maXJzdCA9IDB4MWEsCi0JCQkJLmxhc3QgPSAweDFjLAotCQkJfSwKLQkJCXsKLQkJCQkuZmlyc3QgPSAweDIwLAotCQkJCS5sYXN0ID0gMHg1NiwKLQkJCX0sCi0JCQl7Ci0JCQkJLmZpcnN0ID0gMHg1YSwKLQkJCQkubGFzdCA9IDB4ODgsCi0JCQl9LAotCQkJewotCQkJCS5maXJzdCA9IDB4OGEsCi0JCQkJLmxhc3QgPSAweGFkLAotCQkJfSwKLQkJCXsKLQkJCQkuZmlyc3QgPSAweGIwLAotCQkJCS5sYXN0ID0gMHhiYSwKLQkJCX0sCi0JCQl7Ci0JCQkJLmZpcnN0ID0gMHhiYywKLQkJCQkubGFzdCA9IDB4YzMsCi0JCQl9LAotCQl9Ci0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX3JlZ2lzdGVyc19wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWIgPSBzLT5wcml2YXRlOwotCWludCBiYW5rOwotCi0Jc2VxX3ByaW50ZihzLCBBQjM1NTBfTkFNRV9TVFJJTkcgIiByZWdpc3RlciB2YWx1ZXM6XG4iKTsKLQotCWZvciAoYmFuayA9IDA7IGJhbmsgPCBBQjM1NTBfTlVNX0JBTktTOyBiYW5rKyspIHsKLQkJdW5zaWduZWQgaW50IGk7Ci0KLQkJc2VxX3ByaW50ZihzLCAiIGJhbmsgJWQ6XG4iLCBiYW5rKTsKLQkJZm9yIChpID0gMDsgaSA8IGRlYnVnX3Jhbmdlc1tiYW5rXS5jb3VudDsgaSsrKSB7Ci0JCQl1OCByZWc7Ci0KLQkJCWZvciAocmVnID0gZGVidWdfcmFuZ2VzW2JhbmtdLnJhbmdlW2ldLmZpcnN0OwotCQkJCXJlZyA8PSBkZWJ1Z19yYW5nZXNbYmFua10ucmFuZ2VbaV0ubGFzdDsKLQkJCQlyZWcrKykgewotCQkJCXU4IHZhbHVlOwotCi0JCQkJZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWIsIGJhbmssIHJlZywKLQkJCQkJJnZhbHVlKTsKLQkJCQlzZXFfcHJpbnRmKHMsICIgIFslZC8weCUwMlhdOiAweCUwMlhcbiIsIGJhbmssCi0JCQkJCXJlZywgdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF9yZWdpc3RlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWIzNTUwX3JlZ2lzdGVyc19wcmludCwgaW5vZGUtPmlfcHJpdmF0ZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFiMzU1MF9yZWdpc3RlcnNfZm9wcyA9IHsKLQkub3BlbiA9IGFiMzU1MF9yZWdpc3RlcnNfb3BlbiwKLQkucmVhZCA9IHNlcV9yZWFkLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX2JhbmtfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQotewotCXN0cnVjdCBhYjM1NTAgKmFiID0gcy0+cHJpdmF0ZTsKLQotCXNlcV9wcmludGYocywgIiVkXG4iLCBhYi0+ZGVidWdfYmFuayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX2Jhbmtfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWIzNTUwX2JhbmtfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhYjM1NTBfYmFua193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0Jc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWIgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHVzZXJfYmFuazsKLQlpbnQgZXJyOwotCi0JLyogR2V0IHVzZXJzcGFjZSBzdHJpbmcgYW5kIGFzc3VyZSB0ZXJtaW5hdGlvbiAqLwotCWVyciA9IGtzdHJ0b3VsX2Zyb21fdXNlcih1c2VyX2J1ZiwgY291bnQsIDAsICZ1c2VyX2JhbmspOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAodXNlcl9iYW5rID49IEFCMzU1MF9OVU1fQkFOS1MpIHsKLQkJZGV2X2VycigmYWItPmkyY19jbGllbnRbMF0tPmRldiwKLQkJCSJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gbnVtYmVyIG9mIGJhbmtzXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYWItPmRlYnVnX2JhbmsgPSB1c2VyX2Jhbms7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX2FkZHJlc3NfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQotewotCXN0cnVjdCBhYjM1NTAgKmFiID0gcy0+cHJpdmF0ZTsKLQotCXNlcV9wcmludGYocywgIjB4JTAyWFxuIiwgYWItPmRlYnVnX2FkZHJlc3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF9hZGRyZXNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiMzU1MF9hZGRyZXNzX3ByaW50LCBpbm9kZS0+aV9wcml2YXRlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWIzNTUwX2FkZHJlc3Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBhYjM1NTAgKmFiID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB1c2VyX2FkZHJlc3M7Ci0JaW50IGVycjsKLQotCS8qIEdldCB1c2Vyc3BhY2Ugc3RyaW5nIGFuZCBhc3N1cmUgdGVybWluYXRpb24gKi8KLQllcnIgPSBrc3RydG91bF9mcm9tX3VzZXIodXNlcl9idWYsIGNvdW50LCAwLCAmdXNlcl9hZGRyZXNzKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKHVzZXJfYWRkcmVzcyA+IDB4ZmYpIHsKLQkJZGV2X2VycigmYWItPmkyY19jbGllbnRbMF0tPmRldiwKLQkJCSJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gMHhmZlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhYi0+ZGVidWdfYWRkcmVzcyA9IHVzZXJfYWRkcmVzczsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX3ZhbF9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWIgPSBzLT5wcml2YXRlOwotCWludCBlcnI7Ci0JdTggcmVndmFsdWU7Ci0KLQllcnIgPSBnZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYiwgKHU4KWFiLT5kZWJ1Z19iYW5rLAotCQkodTgpYWItPmRlYnVnX2FkZHJlc3MsICZyZWd2YWx1ZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0Jc2VxX3ByaW50ZihzLCAiMHglMDJYXG4iLCByZWd2YWx1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhYjM1NTBfdmFsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiMzU1MF92YWxfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhYjM1NTBfdmFsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgYWIzNTUwICphYiA9ICgoc3RydWN0IHNlcV9maWxlICopKGZpbGUtPnByaXZhdGVfZGF0YSkpLT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdXNlcl92YWw7Ci0JaW50IGVycjsKLQl1OCByZWd2YWx1ZTsKLQotCS8qIEdldCB1c2Vyc3BhY2Ugc3RyaW5nIGFuZCBhc3N1cmUgdGVybWluYXRpb24gKi8KLQllcnIgPSBrc3RydG91bF9mcm9tX3VzZXIodXNlcl9idWYsIGNvdW50LCAwLCAmdXNlcl92YWwpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAodXNlcl92YWwgPiAweGZmKSB7Ci0JCWRldl9lcnIoJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsCi0JCQkiZGVidWdmcyBlcnJvciBpbnB1dCA+IDB4ZmZcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZXJyID0gbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoCi0JCWFiLCAodTgpYWItPmRlYnVnX2JhbmssCi0JCSh1OClhYi0+ZGVidWdfYWRkcmVzcywgMHhGRiwgKHU4KXVzZXJfdmFsKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWdldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLCAodTgpYWItPmRlYnVnX2JhbmssCi0JCSh1OClhYi0+ZGVidWdfYWRkcmVzcywgJnJlZ3ZhbHVlKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWIzNTUwX2JhbmtfZm9wcyA9IHsKLQkub3BlbiA9IGFiMzU1MF9iYW5rX29wZW4sCi0JLndyaXRlID0gYWIzNTUwX2Jhbmtfd3JpdGUsCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjM1NTBfYWRkcmVzc19mb3BzID0gewotCS5vcGVuID0gYWIzNTUwX2FkZHJlc3Nfb3BlbiwKLQkud3JpdGUgPSBhYjM1NTBfYWRkcmVzc193cml0ZSwKLQkucmVhZCA9IHNlcV9yZWFkLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFiMzU1MF92YWxfZm9wcyA9IHsKLQkub3BlbiA9IGFiMzU1MF92YWxfb3BlbiwKLQkud3JpdGUgPSBhYjM1NTBfdmFsX3dyaXRlLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmFiMzU1MF9kaXI7Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqYWIzNTUwX3JlZ19maWxlOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmFiMzU1MF9iYW5rX2ZpbGU7Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqYWIzNTUwX2FkZHJlc3NfZmlsZTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphYjM1NTBfdmFsX2ZpbGU7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhYjM1NTBfc2V0dXBfZGVidWdmcyhzdHJ1Y3QgYWIzNTUwICphYikKLXsKLQlhYi0+ZGVidWdfYmFuayA9IDA7Ci0JYWItPmRlYnVnX2FkZHJlc3MgPSAweDAwOwotCi0JYWIzNTUwX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihBQjM1NTBfTkFNRV9TVFJJTkcsIE5VTEwpOwotCWlmICghYWIzNTUwX2RpcikKLQkJZ290byBleGl0X25vX2RlYnVnZnM7Ci0KLQlhYjM1NTBfcmVnX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhbGwtcmVnaXN0ZXJzIiwKLQkJU19JUlVHTywgYWIzNTUwX2RpciwgYWIsICZhYjM1NTBfcmVnaXN0ZXJzX2ZvcHMpOwotCWlmICghYWIzNTUwX3JlZ19maWxlKQotCQlnb3RvIGV4aXRfZGVzdHJveV9kaXI7Ci0KLQlhYjM1NTBfYmFua19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXItYmFuayIsCi0JCShTX0lSVUdPIHwgU19JV1VTUiksIGFiMzU1MF9kaXIsIGFiLCAmYWIzNTUwX2JhbmtfZm9wcyk7Ci0JaWYgKCFhYjM1NTBfYmFua19maWxlKQotCQlnb3RvIGV4aXRfZGVzdHJveV9yZWc7Ci0KLQlhYjM1NTBfYWRkcmVzc19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXItYWRkcmVzcyIsCi0JCShTX0lSVUdPIHwgU19JV1VTUiksIGFiMzU1MF9kaXIsIGFiLCAmYWIzNTUwX2FkZHJlc3NfZm9wcyk7Ci0JaWYgKCFhYjM1NTBfYWRkcmVzc19maWxlKQotCQlnb3RvIGV4aXRfZGVzdHJveV9iYW5rOwotCi0JYWIzNTUwX3ZhbF9maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXItdmFsdWUiLAotCQkoU19JUlVHTyB8IFNfSVdVU1IpLCBhYjM1NTBfZGlyLCBhYiwgJmFiMzU1MF92YWxfZm9wcyk7Ci0JaWYgKCFhYjM1NTBfdmFsX2ZpbGUpCi0JCWdvdG8gZXhpdF9kZXN0cm95X2FkZHJlc3M7Ci0KLQlyZXR1cm47Ci0KLWV4aXRfZGVzdHJveV9hZGRyZXNzOgotCWRlYnVnZnNfcmVtb3ZlKGFiMzU1MF9hZGRyZXNzX2ZpbGUpOwotZXhpdF9kZXN0cm95X2Jhbms6Ci0JZGVidWdmc19yZW1vdmUoYWIzNTUwX2JhbmtfZmlsZSk7Ci1leGl0X2Rlc3Ryb3lfcmVnOgotCWRlYnVnZnNfcmVtb3ZlKGFiMzU1MF9yZWdfZmlsZSk7Ci1leGl0X2Rlc3Ryb3lfZGlyOgotCWRlYnVnZnNfcmVtb3ZlKGFiMzU1MF9kaXIpOwotZXhpdF9ub19kZWJ1Z2ZzOgotCWRldl9lcnIoJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZW50cmllcy5cbiIpOwotCXJldHVybjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFiMzU1MF9yZW1vdmVfZGVidWdmcyh2b2lkKQotewotCWRlYnVnZnNfcmVtb3ZlKGFiMzU1MF92YWxfZmlsZSk7Ci0JZGVidWdmc19yZW1vdmUoYWIzNTUwX2FkZHJlc3NfZmlsZSk7Ci0JZGVidWdmc19yZW1vdmUoYWIzNTUwX2JhbmtfZmlsZSk7Ci0JZGVidWdmc19yZW1vdmUoYWIzNTUwX3JlZ19maWxlKTsKLQlkZWJ1Z2ZzX3JlbW92ZShhYjM1NTBfZGlyKTsKLX0KLQotI2Vsc2UgLyogIUNPTkZJR19ERUJVR19GUyAqLwotc3RhdGljIGlubGluZSB2b2lkIGFiMzU1MF9zZXR1cF9kZWJ1Z2ZzKHN0cnVjdCBhYjM1NTAgKmFiKQotewotfQotc3RhdGljIGlubGluZSB2b2lkIGFiMzU1MF9yZW1vdmVfZGVidWdmcyh2b2lkKQotewotfQotI2VuZGlmCi0KLS8qCi0gKiBCYXNpYyBzZXQtdXAsIGRhdGFzdHJ1Y3R1cmUgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gYW5kIEkyQyBpbnRlcmZhY2UuCi0gKiBUaGlzIHNldHMgdXAgYSBkZWZhdWx0IGNvbmZpZyBpbiB0aGUgQUIzNTUwIGNoaXAgc28gdGhhdCBpdAotICogd2lsbCB3b3JrIGFzIGV4cGVjdGVkLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBhYjM1NTBfc2V0dXAoc3RydWN0IGFiMzU1MCAqYWIpCi17Ci0JaW50IGVyciA9IDA7Ci0JaW50IGk7Ci0Jc3RydWN0IGFiMzU1MF9wbGF0Zm9ybV9kYXRhICpwbGZfZGF0YTsKLQlzdHJ1Y3QgYWJ4NTAwX2luaXRfc2V0dGluZ3MgKnNldHRpbmdzOwotCi0JcGxmX2RhdGEgPSBhYi0+aTJjX2NsaWVudFswXS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc2V0dGluZ3MgPSBwbGZfZGF0YS0+aW5pdF9zZXR0aW5nczsKLQotCWZvciAoaSA9IDA7IGkgPCBwbGZfZGF0YS0+aW5pdF9zZXR0aW5nc19zejsgaSsrKSB7Ci0JCWVyciA9IG1hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLAotCQkJc2V0dGluZ3NbaV0uYmFuaywKLQkJCXNldHRpbmdzW2ldLnJlZywKLQkJCTB4RkYsIHNldHRpbmdzW2ldLnNldHRpbmcpOwotCQlpZiAoZXJyKQotCQkJZ290byBleGl0X25vX3NldHVwOwotCi0JCS8qIElmIGV2ZW50IG1hc2sgcmVnaXN0ZXIgdXBkYXRlIHRoZSBldmVudCBtYXNrIGluIGFiMzU1MCAqLwotCQlpZiAoKHNldHRpbmdzW2ldLmJhbmsgPT0gMCkgJiYKLQkJCShBQjM1NTBfSU1SMSA8PSBzZXR0aW5nc1tpXS5yZWcpICYmCi0JCQkoc2V0dGluZ3NbaV0ucmVnIDw9IEFCMzU1MF9JTVI1KSkgewotCQkJYWItPmV2ZW50X21hc2tbc2V0dGluZ3NbaV0ucmVnIC0gQUIzNTUwX0lNUjFdID0KLQkJCQlzZXR0aW5nc1tpXS5zZXR0aW5nOwotCQl9Ci0JfQotZXhpdF9ub19zZXR1cDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBhYjM1NTBfbWFza193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYWIzNTUwICphYiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWIzNTUwLCBtYXNrX3dvcmspOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggbWFza1tBQjM1NTBfTlVNX0VWRU5UX1JFR107Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWItPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgQUIzNTUwX05VTV9FVkVOVF9SRUc7IGkrKykKLQkJbWFza1tpXSA9IGFiLT5ldmVudF9tYXNrW2ldOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFiLT5ldmVudF9sb2NrLCBmbGFncyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQUIzNTUwX05VTV9FVkVOVF9SRUc7IGkrKykgewotCQlpbnQgZXJyOwotCi0JCWVyciA9IG1hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLCAwLAotCQkJKEFCMzU1MF9JTVIxICsgaSksIH4wLCBtYXNrW2ldKTsKLQkJaWYgKGVycikKLQkJCWRldl9lcnIoJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsCi0JCQkJImFiMzU1MF9tYXNrX3dvcmsgZmFpbGVkIDB4JXgsMHgleFxuIiwKLQkJCQkoQUIzNTUwX0lNUjEgKyBpKSwgbWFza1tpXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhYjM1NTBfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYWIzNTUwICphYjsKLQlzdHJ1Y3QgYWIzNTUwX3BsYXRmb3JtX2RhdGEgKnBsZl9kYXRhOwotCWludCBpcnE7Ci0KLQlhYiA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCXBsZl9kYXRhID0gYWItPmkyY19jbGllbnRbMF0tPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlycSA9IGRhdGEtPmlycSAtIHBsZl9kYXRhLT5pcnEuYmFzZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhYi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCWFiLT5ldmVudF9tYXNrW2lycSAvIDhdIHw9IEJJVChpcnEgJSA4KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhYi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCi0Jc2NoZWR1bGVfd29yaygmYWItPm1hc2tfd29yayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFiMzU1MF91bm1hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGFiMzU1MCAqYWI7Ci0Jc3RydWN0IGFiMzU1MF9wbGF0Zm9ybV9kYXRhICpwbGZfZGF0YTsKLQlpbnQgaXJxOwotCi0JYWIgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKLQlwbGZfZGF0YSA9IGFiLT5pMmNfY2xpZW50WzBdLT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpcnEgPSBkYXRhLT5pcnEgLSBwbGZfZGF0YS0+aXJxLmJhc2U7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWItPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQlhYi0+ZXZlbnRfbWFza1tpcnEgLyA4XSAmPSB+QklUKGlycSAlIDgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFiLT5ldmVudF9sb2NrLCBmbGFncyk7Ci0KLQlzY2hlZHVsZV93b3JrKCZhYi0+bWFza193b3JrKTsKLX0KLQotc3RhdGljIHZvaWQgbm9vcChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYWIzNTUwX2lycV9jaGlwID0gewotCS5uYW1lCQk9ICJhYjM1NTAtY29yZSIsIC8qIEtlZXAgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVxdWVzdCAqLwotCS5pcnFfZGlzYWJsZQk9IGFiMzU1MF9tYXNrLCAvKiBObyBkZWZhdWx0IHRvIG1hc2sgaW4gY2hpcC5jICovCi0JLmlycV9hY2sJPSBub29wLAotCS5pcnFfbWFzawk9IGFiMzU1MF9tYXNrLAotCS5pcnFfdW5tYXNrCT0gYWIzNTUwX3VubWFzaywKLX07Ci0KLXN0cnVjdCBhYl9mYW1pbHlfaWQgewotCXU4CWlkOwotCWNoYXIJKm5hbWU7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFiX2ZhbWlseV9pZCBpZHNbXSBfX2luaXRkYXRhID0gewotCS8qIEFCMzU1MCAqLwotCXsKLQkJLmlkID0gQUIzNTUwX1AxQSwKLQkJLm5hbWUgPSAiUDFBIgotCX0sCi0JLyogVGVybWluYXRvciAqLwotCXsKLQkJLmlkID0gMHgwMCwKLQl9Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhYjM1NTBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWI7Ci0Jc3RydWN0IGFiMzU1MF9wbGF0Zm9ybV9kYXRhICphYjM1NTBfcGxmX2RhdGEgPQotCQljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWludCBlcnI7Ci0JaW50IGk7Ci0JaW50IG51bV9pMmNfY2xpZW50cyA9IDA7Ci0KLQlhYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhYjM1NTApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFiKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSAiIEFCMzU1MF9OQU1FX1NUUklORyAiIGRldmljZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIEluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmUgKi8KLQltdXRleF9pbml0KCZhYi0+YWNjZXNzX211dGV4KTsKLQlzcGluX2xvY2tfaW5pdCgmYWItPmV2ZW50X2xvY2spOwotCWFiLT5pMmNfY2xpZW50WzBdID0gY2xpZW50OwotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWIpOwotCi0JLyogUmVhZCBjaGlwIElEIHJlZ2lzdGVyICovCi0JZXJyID0gZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWIsIDAsIEFCMzU1MF9DSURfUkVHLCAmYWItPmNoaXBfaWQpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjb3VsZCBub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgYW5hbG9nICIKLQkJCSJiYXNlYmFuZCBjaGlwXG4iKTsKLQkJZ290byBleGl0X25vX2RldGVjdDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpZHNbaV0uaWQgIT0gMHgwOyBpKyspIHsKLQkJaWYgKGlkc1tpXS5pZCA9PSBhYi0+Y2hpcF9pZCkgewotCQkJc25wcmludGYoJmFiLT5jaGlwX25hbWVbMF0sIHNpemVvZihhYi0+Y2hpcF9uYW1lKSAtIDEsCi0JCQkJQUIzNTUwX0lEX0ZPUk1BVF9TVFJJTkcsIGlkc1tpXS5uYW1lKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGlkc1tpXS5pZCA9PSAweDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmtub3duIGFuYWxvZyBiYXNlYmFuZCBjaGlwIGlkOiAweCV4XG4iLAotCQkJYWItPmNoaXBfaWQpOwotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImRyaXZlciBub3Qgc3RhcnRlZCFcbiIpOwotCQlnb3RvIGV4aXRfbm9fZGV0ZWN0OwotCX0KLQotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgImRldGVjdGVkIEFCIGNoaXA6ICVzXG4iLCAmYWItPmNoaXBfbmFtZVswXSk7Ci0KLQkvKiBBdHRhY2ggb3RoZXIgZHVtbXkgSTJDIGNsaWVudHMuICovCi0Jd2hpbGUgKCsrbnVtX2kyY19jbGllbnRzIDwgQUIzNTUwX05VTV9CQU5LUykgewotCQlhYi0+aTJjX2NsaWVudFtudW1faTJjX2NsaWVudHNdID0KLQkJCWkyY19uZXdfZHVtbXkoY2xpZW50LT5hZGFwdGVyLAotCQkJCShjbGllbnQtPmFkZHIgKyBudW1faTJjX2NsaWVudHMpKTsKLQkJaWYgKCFhYi0+aTJjX2NsaWVudFtudW1faTJjX2NsaWVudHNdKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBleGl0X25vX2R1bW15X2NsaWVudDsKLQkJfQotCQlzdHJsY3B5KGFiLT5pMmNfY2xpZW50W251bV9pMmNfY2xpZW50c10tPm5hbWUsIGlkLT5uYW1lLAotCQkJc2l6ZW9mKGFiLT5pMmNfY2xpZW50W251bV9pMmNfY2xpZW50c10tPm5hbWUpKTsKLQl9Ci0KLQllcnIgPSBhYjM1NTBfc2V0dXAoYWIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXhpdF9ub19zZXR1cDsKLQotCUlOSVRfV09SSygmYWItPm1hc2tfd29yaywgYWIzNTUwX21hc2tfd29yayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYWIzNTUwX3BsZl9kYXRhLT5pcnEuY291bnQ7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgaXJxOwotCi0JCWlycSA9IGFiMzU1MF9wbGZfZGF0YS0+aXJxLmJhc2UgKyBpOwotCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGFiKTsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmFiMzU1MF9pcnFfY2hpcCwKLQkJCQkJIGhhbmRsZV9zaW1wbGVfaXJxKTsKLQkJaXJxX3NldF9uZXN0ZWRfdGhyZWFkKGlycSwgMSk7Ci0jaWZkZWYgQ09ORklHX0FSTQotCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7Ci0jZWxzZQotCQlpcnFfc2V0X25vcHJvYmUoaXJxKTsKLSNlbmRpZgotCX0KLQotCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGNsaWVudC0+aXJxLCBOVUxMLCBhYjM1NTBfaXJxX2hhbmRsZXIsCi0JCUlSUUZfT05FU0hPVCwgImFiMzU1MC1jb3JlIiwgYWIpOwotCS8qIFRoaXMgcmVhbCB1bnByZWRpY3RhYmxlIElSUSBpcyBvZiBjb3Vyc2Ugc2FtcGxlZCBmb3IgZW50cm9weSAqLwotCXJhbmRfaW5pdGlhbGl6ZV9pcnEoY2xpZW50LT5pcnEpOwotCi0JaWYgKGVycikKLQkJZ290byBleGl0X25vX2lycTsKLQotCWVyciA9IGFieDUwMF9yZWdpc3Rlcl9vcHMoJmNsaWVudC0+ZGV2LCAmYWIzNTUwX29wcyk7Ci0JaWYgKGVycikKLQkJZ290byBleGl0X25vX29wczsKLQotCS8qIFNldCB1cCBhbmQgcmVnaXN0ZXIgdGhlIHBsYXRmb3JtIGRldmljZXMuICovCi0JZm9yIChpID0gMDsgaSA8IEFCMzU1MF9OVU1fREVWSUNFUzsgaSsrKSB7Ci0JCWFiMzU1MF9kZXZzW2ldLnBsYXRmb3JtX2RhdGEgPSBhYjM1NTBfcGxmX2RhdGEtPmRldl9kYXRhW2ldOwotCQlhYjM1NTBfZGV2c1tpXS5wZGF0YV9zaXplID0gYWIzNTUwX3BsZl9kYXRhLT5kZXZfZGF0YV9zeltpXTsKLQl9Ci0KLQllcnIgPSBtZmRfYWRkX2RldmljZXMoJmNsaWVudC0+ZGV2LCAwLCBhYjM1NTBfZGV2cywKLQkJQVJSQVlfU0laRShhYjM1NTBfZGV2cyksIE5VTEwsCi0JCWFiMzU1MF9wbGZfZGF0YS0+aXJxLmJhc2UpOwotCi0JYWIzNTUwX3NldHVwX2RlYnVnZnMoYWIpOwotCi0JcmV0dXJuIDA7Ci0KLWV4aXRfbm9fb3BzOgotZXhpdF9ub19pcnE6Ci1leGl0X25vX3NldHVwOgotZXhpdF9ub19kdW1teV9jbGllbnQ6Ci0JLyogVW5yZWdpc3RlciB0aGUgZHVtbXkgaTJjIGNsaWVudHMuICovCi0Jd2hpbGUgKC0tbnVtX2kyY19jbGllbnRzKQotCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoYWItPmkyY19jbGllbnRbbnVtX2kyY19jbGllbnRzXSk7Ci1leGl0X25vX2RldGVjdDoKLQlrZnJlZShhYik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgYWIzNTUwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBhYjM1NTAgKmFiID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50IG51bV9pMmNfY2xpZW50cyA9IEFCMzU1MF9OVU1fQkFOS1M7Ci0KLQltZmRfcmVtb3ZlX2RldmljZXMoJmNsaWVudC0+ZGV2KTsKLQlhYjM1NTBfcmVtb3ZlX2RlYnVnZnMoKTsKLQotCXdoaWxlICgtLW51bV9pMmNfY2xpZW50cykKLQkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGFiLT5pMmNfY2xpZW50W251bV9pMmNfY2xpZW50c10pOwotCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50LCBhbGwgc3Vic2NyaWJlcnMgc2hvdWxkIGhhdmUgdW5yZWdpc3RlcmVkCi0JICogdGhlaXIgbm90aWZpZXJzIHNvIGRlYWN0aXZhdGUgSVJRCi0JICovCi0JZnJlZV9pcnEoY2xpZW50LT5pcnEsIGFiKTsKLQlrZnJlZShhYik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhYjM1NTBfaWRbXSA9IHsKLQl7QUIzNTUwX05BTUVfU1RSSU5HLCAwfSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhYjM1NTBfaWQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWIzNTUwX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9IEFCMzU1MF9OQU1FX1NUUklORywKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLQkuaWRfdGFibGUJPSBhYjM1NTBfaWQsCi0JLnByb2JlCQk9IGFiMzU1MF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZXhpdF9wKGFiMzU1MF9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYWIzNTUwX2kyY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhYjM1NTBfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFiMzU1MF9pMmNfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZhYjM1NTBfZHJpdmVyKTsKLX0KLQotc3Vic3lzX2luaXRjYWxsKGFiMzU1MF9pMmNfaW5pdCk7Ci1tb2R1bGVfZXhpdChhYjM1NTBfaTJjX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJNYXR0aWFzIFdhbGxpbiA8bWF0dGlhcy53YWxsaW5Ac3Rlcmljc3Nvbi5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFCMzU1MCBjb3JlIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI1NTAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FiNTUwMC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxMDYyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL2FiNTUwMC1jb3JlLmMKQEAgLTAsMCArMSwxNDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgU1QtRXJpY3Nzb24KKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICogTG93LWxldmVsIGNvcmUgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIEFCNTUwMCBJQyBvbiB0aGUgSTJDIGJ1cworICogYW5kIHNvbWUgYmFzaWMgY2hpcC1jb25maWd1cmF0aW9uLgorICogQXV0aG9yOiBCZW5ndCBKb25zc29uIDxiZW5ndC5nLmpvbnNzb25Ac3Rlcmljc3Nvbi5jb20+CisgKiBBdXRob3I6IE1hdHRpYXMgTmlsc3NvbiA8bWF0dGlhcy5pLm5pbHNzb25Ac3Rlcmljc3Nvbi5jb20+CisgKiBBdXRob3I6IE1hdHRpYXMgV2FsbGluIDxtYXR0aWFzLndhbGxpbkBzdGVyaWNzc29uLmNvbT4KKyAqIEF1dGhvcjogUmlja2FyZCBBbmRlcnNzb24gPHJpY2thcmQuYW5kZXJzc29uQHN0ZXJpY3Nzb24uY29tPgorICogQXV0aG9yOiBLYXJsIEtvbWllcm93c2tpICA8a2FybC5rb21pZXJvd3NraUBzdGVyaWNzc29uLmNvbT4KKyAqIEF1dGhvcjogQmliZWsgQmFzdSA8YmliZWsuYmFzdUBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBUT0RPOiBFdmVudCBoYW5kbGluZyB3aXRoIGlycV9jaGlwLiBXYWl0aW5nIGZvciBQUkNNVSBmdyBzdXBwb3J0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWI1NTAwL2FiNTUwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvZGI1NTAwLXByY211Lmg+CisKKyNpbmNsdWRlICJhYjU1MDAtY29yZS5oIgorI2luY2x1ZGUgImFiNTUwMC1kZWJ1Z2ZzLmgiCisKKyNkZWZpbmUgQUI1NTAwX05VTV9FVkVOVF9SRUcgMjMKKyNkZWZpbmUgQUI1NTAwX0lUX0xBVENIMF9SRUcgMHg0MAorI2RlZmluZSBBQjU1MDBfSVRfTUFTSzBfUkVHIDB4NjAKKworLyoKKyAqIFBlcm1pc3NpYmxlIHJlZ2lzdGVyIHJhbmdlcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBwZXIgZGV2aWNlIGFuZCBiYW5rLgorICoKKyAqIFRoZSByYW5nZXMgbXVzdCBiZSBsaXN0ZWQgaW4gaW5jcmVhc2luZyBhZGRyZXNzIG9yZGVyLCBhbmQgbm8gb3ZlcmxhcHMgYXJlCisgKiBhbGxvd2VkLiBJdCBpcyBhc3N1bWVkIHRoYXQgd3JpdGUgcGVybWlzc2lvbiBpbXBsaWVzIHJlYWQgcGVybWlzc2lvbgorICogKGkuZS4gb25seSBSTyBhbmQgUlcgcGVybWlzc2lvbnMgc2hvdWxkIGJlIHVzZWQpLiAgUmFuZ2VzIHdpdGggd3JpdGUKKyAqIHBlcm1pc3Npb24gbXVzdCBub3QgYmUgc3BsaXQgdXAuCisgKi8KKworI2RlZmluZSBOT19SQU5HRSB7LmNvdW50ID0gMCwgLnJhbmdlID0gTlVMTCx9CitzdGF0aWMgc3RydWN0IGFiNTUwMF9pMmNfYmFua3MgYWI1NTAwX2JhbmtfcmFuZ2VzW0FCNTUwMF9OVU1fREVWSUNFU10gPSB7CisJW0FCNTUwMF9ERVZJRF9VU0JdID0gIHsKKwkJLm5iYW5rcyA9IDEsCisJCS5iYW5rID0gKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19VU0IsCisJCQkJLm5yYW5nZXMgPSAxMiwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDAxLAorCQkJCQkJLmxhc3QgPSAweDAxLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg4MCwKKwkJCQkJCS5sYXN0ID0gMHg4MywKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4ODcsCisJCQkJCQkubGFzdCA9IDB4OEEsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDhCLAorCQkJCQkJLmxhc3QgPSAweDhCLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg5MSwKKwkJCQkJCS5sYXN0ID0gMHg5MiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4OTMsCisJCQkJCQkubGFzdCA9IDB4OTMsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDk0LAorCQkJCQkJLmxhc3QgPSAweDk0LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHhBOCwKKwkJCQkJCS5sYXN0ID0gMHhCMCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4QjIsCisJCQkJCQkubGFzdCA9IDB4QjIsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweEI0LAorCQkJCQkJLmxhc3QgPSAweEJDLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHhCRiwKKwkJCQkJCS5sYXN0ID0gMHhCRiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4QzEsCisJCQkJCQkubGFzdCA9IDB4QzUsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9BRENdID0gIHsKKwkJLm5iYW5rcyA9IDEsCisJCS5iYW5rID0gKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19BREMsCisJCQkJLm5yYW5nZXMgPSA2LAorCQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MUYsCisJCQkJCQkubGFzdCA9IDB4MjIsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDIzLAorCQkJCQkJLmxhc3QgPSAweDI0LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgyNiwKKwkJCQkJCS5sYXN0ID0gMHgyRCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MkYsCisJCQkJCQkubGFzdCA9IDB4MzQsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDM3LAorCQkJCQkJLmxhc3QgPSAweDU3LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg1OCwKKwkJCQkJCS5sYXN0ID0gMHg1OCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJfSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX0xFRFNdID0gIHsKKwkJLm5iYW5rcyA9IDEsCisJCS5iYW5rID0gKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19MRUQsCisJCQkJLm5yYW5nZXMgPSAxLAorCQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJCQkubGFzdCA9IDB4MEMsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9WSURFT10gPSAgIHsKKwkJLm5iYW5rcyA9IDEsCisJCS5iYW5rID0gKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19WREVOQywKKwkJCQkubnJhbmdlcyA9IDEyLAorCQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJCQkubGFzdCA9IDB4MDgsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDA5LAorCQkJCQkJLmxhc3QgPSAweDA5LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgwQSwKKwkJCQkJCS5sYXN0ID0gMHgxMiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MTUsCisJCQkJCQkubGFzdCA9IDB4MTksCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDFCLAorCQkJCQkJLmxhc3QgPSAweDIxLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgyNywKKwkJCQkJCS5sYXN0ID0gMHgyQywKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4NDEsCisJCQkJCQkubGFzdCA9IDB4NDEsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDQ1LAorCQkJCQkJLmxhc3QgPSAweDVCLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg1RCwKKwkJCQkJCS5sYXN0ID0gMHg1RCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4NjksCisJCQkJCQkubGFzdCA9IDB4NjksCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDZDLAorCQkJCQkJLmxhc3QgPSAweDZELAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg4MCwKKwkJCQkJCS5sYXN0ID0gMHg4MSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJfSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX1JFR1VMQVRPUlNdID0gICB7CisJCS5uYmFua3MgPSAyLAorCQkuYmFuayA9ICAoc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzIFtdKSB7CisJCQl7CisJCQkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1NUQVJUVVAsCisJCQkJLm5yYW5nZXMgPSAxMiwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDAwLAorCQkJCQkJLmxhc3QgPSAweDAxLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgxRiwKKwkJCQkJCS5sYXN0ID0gMHgxRiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MkUsCisJCQkJCQkubGFzdCA9IDB4MkUsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDJGLAorCQkJCQkJLmxhc3QgPSAweDMwLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg1MCwKKwkJCQkJCS5sYXN0ID0gMHg1MSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4NjAsCisJCQkJCQkubGFzdCA9IDB4NjEsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDY2LAorCQkJCQkJLmxhc3QgPSAweDhBLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg4QywKKwkJCQkJCS5sYXN0ID0gMHg5NiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4QUEsCisJCQkJCQkubGFzdCA9IDB4QjQsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweEI3LAorCQkJCQkJLmxhc3QgPSAweEJGLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHhDMSwKKwkJCQkJCS5sYXN0ID0gMHhDQSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4RDMsCisJCQkJCQkubGFzdCA9IDB4RTAsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19TSU1fVVNCU0lNLAorCQkJCS5ucmFuZ2VzID0gMSwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDEzLAorCQkJCQkJLmxhc3QgPSAweDE5LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQl9LAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfU0lNXSA9ICAgeworCQkubmJhbmtzID0gMSwKKwkJLmJhbmsgPSAoc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzIFtdKSB7CisJCQl7CisJCQkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1NJTV9VU0JTSU0sCisJCQkJLm5yYW5nZXMgPSAxLAorCQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MTMsCisJCQkJCQkubGFzdCA9IDB4MTksCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9SVENdID0gICB7CisJCS5uYmFua3MgPSAxLAorCQkuYmFuayA9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfUlRDLAorCQkJCS5ucmFuZ2VzID0gMiwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDAwLAorCQkJCQkJLmxhc3QgPSAweDA0LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgwNiwKKwkJCQkJCS5sYXN0ID0gMHgwQywKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJfSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX0NIQVJHRVJdID0gICB7CisJCS5uYmFua3MgPSAxLAorCQkuYmFuayA9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfQ0hHLAorCQkJCS5ucmFuZ2VzID0gMiwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDExLAorCQkJCQkJLmxhc3QgPSAweDExLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgxMiwKKwkJCQkJCS5sYXN0ID0gMHgxQiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJfSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX0ZVRUxHQVVHRV0gPSAgIHsKKwkJLm5iYW5rcyA9IDEsCisJCS5iYW5rID0gKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19GR19CQVRUQ09NX0FDQywKKwkJCQkubnJhbmdlcyA9IDIsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkJCS5sYXN0ID0gMHgwQiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MEMsCisJCQkJCQkubGFzdCA9IDB4MTAsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9WSUJSQVRPUl0gPSAgIHsKKwkJLm5iYW5rcyA9IDEsCisJCS5iYW5rID0gKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19WSUJSQSwKKwkJCQkubnJhbmdlcyA9IDIsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgxMCwKKwkJCQkJCS5sYXN0ID0gMHgxMywKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4RkUsCisJCQkJCQkubGFzdCA9IDB4RkUsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9DT0RFQ10gPSAgIHsKKwkJLm5iYW5rcyA9IDEsCisJCS5iYW5rID0gKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19BVURJT19IRUFEU0VUVVNCLAorCQkJCS5ucmFuZ2VzID0gMiwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDAwLAorCQkJCQkJLmxhc3QgPSAweDQ4LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHhFQiwKKwkJCQkJCS5sYXN0ID0gMHhGQiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJfSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX1BPV0VSXSA9IHsKKwkJLm5iYW5rcwk9IDIsCisJCS5iYW5rCT0gKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19TVEFSVFVQLAorCQkJCS5ucmFuZ2VzID0gMSwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDMwLAorCQkJCQkJLmxhc3QgPSAweDMwLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQl9LAorCQkJfSwKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfVklUX0lPX0kyQ19DTEtfVFNUX09UUCwKKwkJCQkubnJhbmdlcyA9IDEsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgwMSwKKwkJCQkJCS5sYXN0ID0gMHgwMSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJfSwKKwkJCX0sCisJCX0sCisJfSwKK307CisKKyNkZWZpbmUgQUI1NTAwX0lSUShiYW5rLCBiaXQpCSgoYmFuaykgKiA4ICsgKGJpdCkpCisKKy8qIEkgYXBwb2xvZ2l6ZSBmb3IgdGhlIHJlc291cmNlIG5hbWVzIGJlZWluZyBhIG1peCBvZiB1cHBlciBjYXNlCisgKiBhbmQgbG93ZXIgY2FzZSBidXQgSSB3YW50IHRoZW0gdG8gYmUgZXhhY3QgYXMgdGhlIGRvY3VtZW50YXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgYWI1NTAwX2RldnNbQUI1NTAwX05VTV9ERVZJQ0VTXSA9IHsKKwlbQUI1NTAwX0RFVklEX0xFRFNdID0geworCQkubmFtZSA9ICJhYjU1MDAtbGVkcyIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9MRURTLAorCX0sCisJW0FCNTUwMF9ERVZJRF9QT1dFUl0gPSB7CisJCS5uYW1lID0gImFiNTUwMC1wb3dlciIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9QT1dFUiwKKwl9LAorCVtBQjU1MDBfREVWSURfUkVHVUxBVE9SU10gPSB7CisJCS5uYW1lID0gImFiNTUwMC1yZWd1bGF0b3IiLAorCQkuaWQgPSBBQjU1MDBfREVWSURfUkVHVUxBVE9SUywKKwl9LAorCVtBQjU1MDBfREVWSURfU0lNXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLXNpbSIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9TSU0sCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwkJLnJlc291cmNlcyA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5uYW1lID0gIlNJTU9GRiIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyLCAwKSwgLypyaXNpbmcqLworCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDIsIDEpLCAvKmZhbGxpbmcqLworCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfUlRDXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLXJ0YyIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9SVEMsCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwkJLnJlc291cmNlcyA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5uYW1lCT0gIlJUQ19BbGFybSIsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0CT0gQUI1NTAwX0lSUSgxLCA3KSwKKwkJCQkuZW5kCT0gQUI1NTAwX0lSUSgxLCA3KSwKKwkJCX0KKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfQ0hBUkdFUl0gPSB7CisJCS5uYW1lID0gImFiNTUwMC1jaGFyZ2VyIiwKKwkJLmlkID0gQUI1NTAwX0RFVklEX0NIQVJHRVIsCisJfSwKKwlbQUI1NTAwX0RFVklEX0FEQ10gPSB7CisJCS5uYW1lID0gImFiNTUwMC1hZGMiLAorCQkuaWQgPSBBQjU1MDBfREVWSURfQURDLAorCQkubnVtX3Jlc291cmNlcyA9IDEwLAorCQkucmVzb3VyY2VzID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUgPSAiVFJJR0dFUi0wIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDAsIDApLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDAsIDApLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJUUklHR0VSLTEiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMCwgMSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMCwgMSksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlRSSUdHRVItMiIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgwLCAyKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgwLCAyKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVFJJR0dFUi0zIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDAsIDMpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDAsIDMpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJUUklHR0VSLTQiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMCwgNCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMCwgNCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlRSSUdHRVItNSIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgwLCA1KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgwLCA1KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVFJJR0dFUi02IiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDAsIDYpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDAsIDYpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJUUklHR0VSLTciLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMCwgNyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMCwgNyksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlRSSUdHRVItVkJBVCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgwLCA4KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgwLCA4KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVFJJR0dFUi1WQkFULVRYT04iLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMCwgOSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMCwgOSksCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9GVUVMR0FVR0VdID0geworCQkubmFtZSA9ICJhYjU1MDAtZnVlbGdhdWdlIiwKKwkJLmlkID0gQUI1NTAwX0RFVklEX0ZVRUxHQVVHRSwKKwkJLm51bV9yZXNvdXJjZXMgPSA2LAorCQkucmVzb3VyY2VzID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUgPSAiQmF0dF9hdHRhY2giLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoNywgNSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoNywgNSksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkJhdHRfcmVtb3ZhbCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg3LCA2KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg3LCA2KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVUFSVF9mcmFtaW5nIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDcsIDcpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDcsIDcpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJVQVJUX292ZXJydW4iLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoOCwgMCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoOCwgMCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlVBUlRfUmR5X1JYIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDgsIDEpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDgsIDEpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJVQVJUX1JkeV9UWCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg4LCAyKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg4LCAyKSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX1ZJQlJBVE9SXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLXZpYnJhdG9yIiwKKwkJLmlkID0gQUI1NTAwX0RFVklEX1ZJQlJBVE9SLAorCX0sCisJW0FCNTUwMF9ERVZJRF9DT0RFQ10gPSB7CisJCS5uYW1lID0gImFiNTUwMC1jb2RlYyIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9DT0RFQywKKwkJLm51bV9yZXNvdXJjZXMgPSAzLAorCQkucmVzb3VyY2VzID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUgPSAiYXVkaW9fc3BrcjFfb3ZjIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDksIDUpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDksIDUpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJhdWRpb19wbGxsb2NrZWQiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoOSwgNiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoOSwgNiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gImF1ZGlvX3Nwa3IyX292YyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNywgNCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTcsIDQpLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfVVNCXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLXVzYiIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9VU0IsCisJCS5udW1fcmVzb3VyY2VzID0gMzYsCisJCS5yZXNvdXJjZXMgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZSA9ICJMaW5rX1VwZGF0ZSIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyMiwgMSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMjIsIDEpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJEQ0lPIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDgsIDMpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDgsIDQpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJWQlVTX1IiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoOCwgNSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoOCwgNSksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlZCVVNfRiIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg4LCA2KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg4LCA2KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiQ0hHc3RhdGVfMTBfUENWQlVTY2hnIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDgsIDcpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDgsIDcpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJEQ0lPcmV2ZXJzZV9vdmMiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoOSwgMCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoOSwgMCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlVTQkNoYXJEZXREb25lIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDksIDEpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDksIDEpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJEQ0lPX25vX2xpbWl0IiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDksIDIpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDksIDIpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJVU0Jfc3VzcGVuZCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg5LCAzKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg5LCAzKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiRENJT3JldmVyc2VfZndkY3VycmVudCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg5LCA0KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg5LCA0KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVmJ1c19JbWVhc21heF9jaGFuZ2UiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoOSwgNSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoOSwgNiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIk9WViIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNCwgNSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTQsIDUpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJVU0JjaGFyZ2luZ19OT1RvayIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNSwgMyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTUsIDMpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfYWRwX3NlbnNvcm9mZiIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNSwgNiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTUsIDYpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfYWRwX3Byb2JlcGx1ZyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNSwgNyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTUsIDcpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfYWRwX3NpbmtlcnJvciIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNiwgMCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTYsIDYpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfYWRwX3NvdXJjZWVycm9yIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE2LCAxKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNiwgMSksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gInVzYl9pZGduZF9yIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE2LCAyKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNiwgMiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gInVzYl9pZGduZF9mIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE2LCAzKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNiwgMyksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gInVzYl9pZGRldFIxIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE2LCA0KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNiwgNSksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gInVzYl9pZGRldFIyIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE2LCA2KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNiwgNyksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gInVzYl9pZGRldFIzIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE3LCAwKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNywgMSksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gInVzYl9pZGRldFI0IiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE3LCAyKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNywgMyksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkNoYXJUZW1wV2luZG93T2siLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTcsIDcpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE4LCAwKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVVNCX1NwckRldGVjdCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxOCwgMSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTgsIDEpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfYWRwX3Byb2JlX3VucGx1ZyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxOCwgMiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTgsIDIpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJWQlVTQ2hEcm9wIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE4LCAzKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxOCwgNCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gImRjaW9fY2hhcl9yZWNfZG9uZSIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxOCwgNSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTgsIDUpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJDaGFyZ2luZ19zdG9wcGVkX2J5X3RlbXAiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTgsIDYpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE4LCA2KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiQ0hHc3RhdGVfMTFfU2FmZU1vZGVWQlVTIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDIxLCAxKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgyMSwgMiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkNIR3N0YXRlXzEyX2NvbWxldGVkVkJVUyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyMSwgMiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMjEsIDIpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJDSEdzdGF0ZV8xM19jb21wbGV0ZWRWQlVTIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDIxLCAzKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgyMSwgMyksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkNIR3N0YXRlXzE0X0Z1bGxDaGdEQ0lPIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDIxLCA0KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgyMSwgNCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkNIR3N0YXRlXzE1X1NhZmVNb2RlRENJTyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyMSwgNSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMjEsIDUpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJDSEdzdGF0ZV8xNl9PRkZzdXNwZW5kRENJTyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyMSwgNiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMjEsIDYpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJDSEdzdGF0ZV8xN19jb21wbGV0ZWREQ0lPIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDIxLCA3KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgyMSwgNyksCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9PVFBdID0geworCQkubmFtZSA9ICJhYjU1MDAtb3RwIiwKKwkJLmlkID0gQUI1NTAwX0RFVklEX09UUCwKKwl9LAorCVtBQjU1MDBfREVWSURfVklERU9dID0geworCQkubmFtZSA9ICJhYjU1MDAtdmlkZW8iLAorCQkuaWQgPSBBQjU1MDBfREVWSURfVklERU8sCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwkJLnJlc291cmNlcyA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5uYW1lID0gInBsdWdUVmRldCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyMiwgMiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMjIsIDIpLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfREJJRUNJXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLWRiaWVjaSIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9EQklFQ0ksCisJCS5udW1fcmVzb3VyY2VzID0gMTAsCisJCS5yZXNvdXJjZXMgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZSA9ICJDT0xMIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE0LCAwKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNCwgMCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlJFU0VSUiIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNCwgMSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTQsIDEpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJGUkFFUlIiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTQsIDIpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE0LCAyKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiQ09NRVJSIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE0LCAzKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNCwgMyksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkJTSV9pbmRpY2F0b3IiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTQsIDQpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE0LCA0KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiU1BEU0VUIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE0LCA2KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNCwgNiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkRTRU5UIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE0LCA3KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNCwgNyksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkRSRUMiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTUsIDApLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE1LCAwKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiQUNDSU5UIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE1LCAxKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNSwgMSksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIk5PUElOVCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNSwgMiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTUsIDIpLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfT05TV0FdID0geworCQkubmFtZSA9ICJhYjU1MDAtb25zd2EiLAorCQkuaWQgPSBBQjU1MDBfREVWSURfT05TV0EsCisJCS5udW1fcmVzb3VyY2VzID0gMiwKKwkJLnJlc291cmNlcyA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5uYW1lCT0gIk9OU1dBbl9yaXNpbmciLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydAk9IEFCNTUwMF9JUlEoMSwgMyksCisJCQkJLmVuZAk9IEFCNTUwMF9JUlEoMSwgMyksCisJCQl9LAorCQkJeworCQkJCS5uYW1lCT0gIk9OU1dBbl9mYWxsaW5nIiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQJPSBBQjU1MDBfSVJRKDEsIDQpLAorCQkJCS5lbmQJPSBBQjU1MDBfSVJRKDEsIDQpLAorCQkJfSwKKwkJfSwKKwl9LAorfTsKKworLyoKKyAqIEZ1bmN0aW9uYWxpdHkgZm9yIGdldHRpbmcvc2V0dGluZyByZWdpc3RlciB2YWx1ZXMuCisgKi8KK2ludCBhYjU1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGVfcmF3KHN0cnVjdCBhYjU1MDAgKmFiLAorCQkJCQkgIHU4IGJhbmssIHU4IHJlZywKKwkJCQkJICB1OCAqdmFsdWUpCit7CisJaW50IGVycjsKKworCWlmIChiYW5rID49IEFCNTUwMF9OVU1fQkFOS1MpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhYi0+YWNjZXNzX211dGV4KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGRiNTUwMF9wcmNtdV9hYmJfcmVhZChiYW5raW5mb1tiYW5rXS5zbGF2ZV9hZGRyLCByZWcsIHZhbHVlLCAxKTsKKworCW11dGV4X3VubG9jaygmYWItPmFjY2Vzc19tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBnZXRfcmVnaXN0ZXJfcGFnZV9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBhYjU1MDAgKmFiLCB1OCBiYW5rLAorCXU4IGZpcnN0X3JlZywgdTggKnJlZ3ZhbHMsIHU4IG51bXJlZ3MpCit7CisJaW50IGVycjsKKworCWlmIChiYW5rID49IEFCNTUwMF9OVU1fQkFOS1MpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhYi0+YWNjZXNzX211dGV4KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJd2hpbGUgKG51bXJlZ3MpIHsKKwkJLyogVGhlIGhhcmR3YXJlIGxpbWl0IGZvciBnZXQgcGFnZSBpcyA0ICovCisJCXU4IGN1cm51bSA9IG1pbl90KHU4LCBudW1yZWdzLCA0dSk7CisKKwkJZXJyID0gZGI1NTAwX3ByY211X2FiYl9yZWFkKGJhbmtpbmZvW2JhbmtdLnNsYXZlX2FkZHIsCisJCQkJCSAgICBmaXJzdF9yZWcsIHJlZ3ZhbHMsIGN1cm51bSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQludW1yZWdzIC09IGN1cm51bTsKKwkJZmlyc3RfcmVnICs9IGN1cm51bTsKKwkJcmVndmFscyArPSBjdXJudW07CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZhYi0+YWNjZXNzX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYWI1NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhzdHJ1Y3QgYWI1NTAwICphYiwgdTggYmFuaywKKwl1OCByZWcsIHU4IGJpdG1hc2ssIHU4IGJpdHZhbHVlcykKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmIChiYW5rID49IEFCNTUwMF9OVU1fQkFOS1MpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJpdG1hc2spIHsKKwkJdTggYnVmOworCisJCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWItPmFjY2Vzc19tdXRleCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWlmIChiaXRtYXNrID09IDB4RkYpIC8qIE5vIG5lZWQgdG8gcmVhZCBpbiB0aGlzIGNhc2UuICovCisJCQlidWYgPSBiaXR2YWx1ZXM7CisJCWVsc2UgeyAvKiBSZWFkIGFuZCBtb2RpZnkgdGhlIHJlZ2lzdGVyIHZhbHVlLiAqLworCQkJZXJyID0gZGI1NTAwX3ByY211X2FiYl9yZWFkKGJhbmtpbmZvW2JhbmtdLnNsYXZlX2FkZHIsCisJCQkJcmVnLCAmYnVmLCAxKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKworCQkJYnVmID0gKCh+Yml0bWFzayAmIGJ1ZikgfCAoYml0bWFzayAmIGJpdHZhbHVlcykpOworCQl9CisJCS8qIFdyaXRlIHRoZSBuZXcgdmFsdWUuICovCisJCWVyciA9IGRiNTUwMF9wcmNtdV9hYmJfd3JpdGUoYmFua2luZm9bYmFua10uc2xhdmVfYWRkciwgcmVnLAorCQkJCQkgICAgICZidWYsIDEpOworCisJCW11dGV4X3VubG9jaygmYWItPmFjY2Vzc19tdXRleCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBhYjU1MDAgKmFiLCB1OCBiYW5rLCB1OCByZWcsIHU4IHZhbHVlKQoreworCXJldHVybiBhYjU1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGVfcmF3KGFiLCBiYW5rLCByZWcsCisJCQkJCQkJICAgICAgMHhmZiwgdmFsdWUpOworfQorCisvKgorICogUmVhZC93cml0ZSBwZXJtaXNzaW9uIGNoZWNraW5nIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyAqZ2V0X2JhbmtyZWYodTggZGV2aWQsIHU4IGJhbmspCit7CisJdTggaTsKKworCWlmIChkZXZpZCA8IEFCNTUwMF9OVU1fREVWSUNFUykgeworCQlmb3IgKGkgPSAwOyBpIDwgYWI1NTAwX2JhbmtfcmFuZ2VzW2RldmlkXS5uYmFua3M7IGkrKykgeworCQkJaWYgKGFiNTUwMF9iYW5rX3Jhbmdlc1tkZXZpZF0uYmFua1tpXS5iYW5raWQgPT0gYmFuaykKKwkJCQlyZXR1cm4gJmFiNTUwMF9iYW5rX3Jhbmdlc1tkZXZpZF0uYmFua1tpXTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2wgcGFnZV93cml0ZV9hbGxvd2VkKHU4IGRldmlkLCB1OCBiYW5rLCB1OCBmaXJzdF9yZWcsIHU4IGxhc3RfcmVnKQoreworCXU4IGk7IC8qIHJhbmdlIGxvb3AgaW5kZXggKi8KKwljb25zdCBzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgKmJhbmtyZWY7CisKKwliYW5rcmVmID0gZ2V0X2JhbmtyZWYoZGV2aWQsIGJhbmspOworCWlmIChiYW5rcmVmID09IE5VTEwgfHwgbGFzdF9yZWcgPCBmaXJzdF9yZWcpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBiYW5rcmVmLT5ucmFuZ2VzOyBpKyspIHsKKwkJaWYgKGZpcnN0X3JlZyA8IGJhbmtyZWYtPnJhbmdlW2ldLmZpcnN0KQorCQkJYnJlYWs7CisJCWlmICgobGFzdF9yZWcgPD0gYmFua3JlZi0+cmFuZ2VbaV0ubGFzdCkgJiYKKwkJCShiYW5rcmVmLT5yYW5nZVtpXS5wZXJtICYgQUI1NTAwX1BFUk1fV1IpKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcmVnX3dyaXRlX2FsbG93ZWQodTggZGV2aWQsIHU4IGJhbmssIHU4IHJlZykKK3sKKwlyZXR1cm4gcGFnZV93cml0ZV9hbGxvd2VkKGRldmlkLCBiYW5rLCByZWcsIHJlZyk7Cit9CisKK3N0YXRpYyBib29sIHBhZ2VfcmVhZF9hbGxvd2VkKHU4IGRldmlkLCB1OCBiYW5rLCB1OCBmaXJzdF9yZWcsIHU4IGxhc3RfcmVnKQoreworCXU4IGk7CisJY29uc3Qgc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzICpiYW5rcmVmOworCisJYmFua3JlZiA9IGdldF9iYW5rcmVmKGRldmlkLCBiYW5rKTsKKwlpZiAoYmFua3JlZiA9PSBOVUxMIHx8IGxhc3RfcmVnIDwgZmlyc3RfcmVnKQorCQlyZXR1cm4gZmFsc2U7CisKKworCS8qIEZpbmQgdGhlIHJhbmdlIChpZiBpdCBleGlzdHMgaW4gdGhlIGxpc3QpIHRoYXQgaW5jbHVkZXMgZmlyc3RfcmVnLiAqLworCWZvciAoaSA9IDA7IGkgPCBiYW5rcmVmLT5ucmFuZ2VzOyBpKyspIHsKKwkJaWYgKGZpcnN0X3JlZyA8IGJhbmtyZWYtPnJhbmdlW2ldLmZpcnN0KQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoZmlyc3RfcmVnIDw9IGJhbmtyZWYtPnJhbmdlW2ldLmxhc3QpCisJCQlicmVhazsKKwl9CisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIGVudGlyZSByYW5nZSB1cCB0byBhbmQgaW5jbHVkaW5nIGxhc3RfcmVnIGlzCisJICogcmVhZGFibGUuIFRoaXMgbWF5IHNwYW4gc2V2ZXJhbCBvZiB0aGUgcmFuZ2VzIGluIHRoZSBsaXN0LgorCSAqLworCXdoaWxlICgoaSA8IGJhbmtyZWYtPm5yYW5nZXMpICYmCisJCShiYW5rcmVmLT5yYW5nZVtpXS5wZXJtICYgQUI1NTAwX1BFUk1fUkQpKSB7CisJCWlmIChsYXN0X3JlZyA8PSBiYW5rcmVmLT5yYW5nZVtpXS5sYXN0KQorCQkJcmV0dXJuIHRydWU7CisJCWlmICgoKytpID49IGJhbmtyZWYtPm5yYW5nZXMpIHx8CisJCQkoYmFua3JlZi0+cmFuZ2VbaV0uZmlyc3QgIT0KKwkJCQkoYmFua3JlZi0+cmFuZ2VbaSAtIDFdLmxhc3QgKyAxKSkpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcmVnX3JlYWRfYWxsb3dlZCh1OCBkZXZpZCwgdTggYmFuaywgdTggcmVnKQoreworCXJldHVybiBwYWdlX3JlYWRfYWxsb3dlZChkZXZpZCwgYmFuaywgcmVnLCByZWcpOworfQorCisKKy8qCisgKiBUaGUgZXhwb3J0ZWQgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9uYWxpdHkuCisgKi8KK3N0YXRpYyBpbnQgYWI1NTAwX2dldF9jaGlwX2lkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisKKwlyZXR1cm4gKGludClhYi0+Y2hpcF9pZDsKK30KKworc3RhdGljIGludCBhYjU1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCBiYW5rLCB1OCByZWcsIHU4IGJpdG1hc2ssIHU4IGJpdHZhbHVlcykKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisKKwlpZiAoKEFCNTUwMF9OVU1fQkFOS1MgPD0gYmFuaykgfHwKKwkJIXJlZ193cml0ZV9hbGxvd2VkKHBkZXYtPmlkLCBiYW5rLCByZWcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFiID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwlyZXR1cm4gYWI1NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhhYiwgYmFuaywgcmVnLAorCQliaXRtYXNrLCBiaXR2YWx1ZXMpOworfQorCitzdGF0aWMgaW50IGFiNTUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGJhbmssCisJdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlyZXR1cm4gYWI1NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRldiwgYmFuaywgcmVnLCAweEZGLAorCQl2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgYWI1NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggYmFuaywKKwkJdTggcmVnLCB1OCAqdmFsdWUpCit7CisJc3RydWN0IGFiNTUwMCAqYWI7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCisJaWYgKChBQjU1MDBfTlVNX0JBTktTIDw9IGJhbmspIHx8CisJCSFyZWdfcmVhZF9hbGxvd2VkKHBkZXYtPmlkLCBiYW5rLCByZWcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFiID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwlyZXR1cm4gYWI1NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhhYiwgYmFuaywgcmVnLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgYWI1NTAwX2dldF9yZWdpc3Rlcl9wYWdlX2ludGVycnVwdGlibGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCBiYW5rLAorCQl1OCBmaXJzdF9yZWcsIHU4ICpyZWd2YWxzLCB1OCBudW1yZWdzKQoreworCXN0cnVjdCBhYjU1MDAgKmFiOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKworCWlmICgoQUI1NTAwX05VTV9CQU5LUyA8PSBiYW5rKSB8fAorCQkhcGFnZV9yZWFkX2FsbG93ZWQocGRldi0+aWQsIGJhbmssCisJCQlmaXJzdF9yZWcsIChmaXJzdF9yZWcgKyBudW1yZWdzIC0gMSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFiID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwlyZXR1cm4gZ2V0X3JlZ2lzdGVyX3BhZ2VfaW50ZXJydXB0aWJsZShhYiwgYmFuaywgZmlyc3RfcmVnLCByZWd2YWxzLAorCQludW1yZWdzKTsKK30KKworc3RhdGljIGludAorYWI1NTAwX2V2ZW50X3JlZ2lzdGVyc19zdGFydHVwX3N0YXRlX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICpldmVudCkKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYjsKKworCWFiID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwlpZiAoIWFiLT5zdGFydHVwX2V2ZW50c19yZWFkKQorCQlyZXR1cm4gLUVBR0FJTjsgLyogVHJ5IGFnYWluIGxhdGVyICovCisKKwltZW1jcHkoZXZlbnQsIGFiLT5zdGFydHVwX2V2ZW50cywgQUI1NTAwX05VTV9FVkVOVF9SRUcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFieDUwMF9vcHMgYWI1NTAwX29wcyA9IHsKKwkuZ2V0X2NoaXBfaWQgPSBhYjU1MDBfZ2V0X2NoaXBfaWQsCisJLmdldF9yZWdpc3RlciA9IGFiNTUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSwKKwkuc2V0X3JlZ2lzdGVyID0gYWI1NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlLAorCS5nZXRfcmVnaXN0ZXJfcGFnZSA9IGFiNTUwMF9nZXRfcmVnaXN0ZXJfcGFnZV9pbnRlcnJ1cHRpYmxlLAorCS5zZXRfcmVnaXN0ZXJfcGFnZSA9IE5VTEwsCisJLm1hc2tfYW5kX3NldF9yZWdpc3RlciA9IGFiNTUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSwKKwkuZXZlbnRfcmVnaXN0ZXJzX3N0YXJ0dXBfc3RhdGVfZ2V0ID0KKwkJYWI1NTAwX2V2ZW50X3JlZ2lzdGVyc19zdGFydHVwX3N0YXRlX2dldCwKKwkuc3RhcnR1cF9pcnFfZW5hYmxlZCA9IE5VTEwsCit9OworCisvKgorICogYWI1NTAwX3NldHVwIDogQmFzaWMgc2V0LXVwLCBkYXRhc3RydWN0dXJlIGNyZWF0aW9uL2Rlc3RydWN0aW9uCisgKgkJICBhbmQgSTJDIGludGVyZmFjZS5UaGlzIHNldHMgdXAgYSBkZWZhdWx0IGNvbmZpZworICoJCSAgaW4gdGhlIEFCNTUwMCBjaGlwIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGFzIGV4cGVjdGVkLgorICogQGFiIDoJICBQb2ludGVyIHRvIGFiNTUwMCBzdHJ1Y3R1cmUKKyAqIEBzZXR0aW5ncyA6ICAgIFBvaW50ZXIgdG8gc3RydWN0IGFieDUwMF9pbml0X3NldHRpbmdzCisgKiBAc2l6ZSA6ICAgICAgICBTaXplIG9mIGluaXQgZGF0YQorICovCitzdGF0aWMgaW50IF9faW5pdCBhYjU1MDBfc2V0dXAoc3RydWN0IGFiNTUwMCAqYWIsCisJc3RydWN0IGFieDUwMF9pbml0X3NldHRpbmdzICpzZXR0aW5ncywgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWVyciA9IGFiNTUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoYWIsCisJCQlzZXR0aW5nc1tpXS5iYW5rLAorCQkJc2V0dGluZ3NbaV0ucmVnLAorCQkJMHhGRiwgc2V0dGluZ3NbaV0uc2V0dGluZyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfbm9fc2V0dXA7CisKKwkJLyogSWYgZXZlbnQgbWFzayByZWdpc3RlciB1cGRhdGUgdGhlIGV2ZW50IG1hc2sgaW4gYWI1NTAwICovCisJCWlmICgoc2V0dGluZ3NbaV0uYmFuayA9PSBBQjU1MDBfQkFOS19JVCkgJiYKKwkJCShBQjU1MDBfTUFTS19CQVNFIDw9IHNldHRpbmdzW2ldLnJlZykgJiYKKwkJCShzZXR0aW5nc1tpXS5yZWcgPD0gQUI1NTAwX01BU0tfRU5EKSkgeworCQkJYWItPm1hc2tbc2V0dGluZ3NbaV0ucmVnIC0gQUI1NTAwX01BU0tfQkFTRV0gPQorCQkJCXNldHRpbmdzW2ldLnNldHRpbmc7CisJCX0KKwl9CitleGl0X25vX3NldHVwOgorCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBhYl9mYW1pbHlfaWQgeworCXU4CWlkOworCWNoYXIJKm5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFiX2ZhbWlseV9pZCBpZHNbXSBfX2luaXRkYXRhID0geworCS8qIEFCNTUwMCAqLworCXsKKwkJLmlkID0gQUI1NTAwXzFfMCwKKwkJLm5hbWUgPSAiMS4wIgorCX0sCisJeworCQkuaWQgPSBBQjU1MDBfMV8xLAorCQkubmFtZSA9ICIxLjEiCisJfSwKKwkvKiBUZXJtaW5hdG9yICovCisJeworCQkuaWQgPSAweDAwLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFiNTUwMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhYjU1MDAgKmFiOworCXN0cnVjdCBhYjU1MDBfcGxhdGZvcm1fZGF0YSAqYWI1NTAwX3BsZl9kYXRhID0KKwkJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IGVycjsKKwlpbnQgaTsKKworCWFiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFiNTUwMCksIEdGUF9LRVJORUwpOworCWlmICghYWIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBhYjU1MDAgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZSAqLworCW11dGV4X2luaXQoJmFiLT5hY2Nlc3NfbXV0ZXgpOworCW11dGV4X2luaXQoJmFiLT5pcnFfbG9jayk7CisJYWItPmRldiA9ICZwZGV2LT5kZXY7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBhYik7CisKKwkvKiBSZWFkIGNoaXAgSUQgcmVnaXN0ZXIgKi8KKwllcnIgPSBhYjU1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGVfcmF3KGFiLAorCQkJCQlBQjU1MDBfQkFOS19WSVRfSU9fSTJDX0NMS19UU1RfT1RQLAorCQkJCQlBQjU1MDBfQ0hJUF9JRCwgJmFiLT5jaGlwX2lkKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBhbmFsb2cgIgorCQkJImJhc2ViYW5kIGNoaXBcbiIpOworCQlnb3RvIGV4aXRfbm9fZGV0ZWN0OworCX0KKworCWZvciAoaSA9IDA7IGlkc1tpXS5pZCAhPSAweDA7IGkrKykgeworCQlpZiAoaWRzW2ldLmlkID09IGFiLT5jaGlwX2lkKSB7CisJCQlzbnByaW50ZigmYWItPmNoaXBfbmFtZVswXSwgc2l6ZW9mKGFiLT5jaGlwX25hbWUpIC0gMSwKKwkJCQkiQUI1NTAwICVzIiwgaWRzW2ldLm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGlkc1tpXS5pZCA9PSAweDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5rbm93biBhbmFsb2cgYmFzZWJhbmQgY2hpcCBpZDogMHgleFxuIiwKKwkJCWFiLT5jaGlwX2lkKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZHJpdmVyIG5vdCBzdGFydGVkIVxuIik7CisJCWdvdG8gZXhpdF9ub19kZXRlY3Q7CisJfQorCisJLyogQ2xlYXIgYW5kIG1hc2sgYWxsIGludGVycnVwdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQUI1NTAwX05VTV9JUlFfUkVHUzsgaSsrKSB7CisJCXU4IGxhdGNocmVnID0gQUI1NTAwX0lUX0xBVENIMF9SRUcgKyBpOworCQl1OCBtYXNrcmVnID0gQUI1NTAwX0lUX01BU0swX1JFRyArIGk7CisJCXU4IHZhbDsKKworCQlhYjU1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGVfcmF3KGFiLCBBQjU1MDBfQkFOS19JVCwKKwkJCQkJCSAgICAgIGxhdGNocmVnLCAmdmFsKTsKKwkJc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWIsIEFCNTUwMF9CQU5LX0lULCBtYXNrcmVnLCAweGZmKTsKKwkJYWItPm1hc2tbaV0gPSBhYi0+b2xkbWFza1tpXSA9IDB4ZmY7CisJfQorCisJZXJyID0gYWJ4NTAwX3JlZ2lzdGVyX29wcygmcGRldi0+ZGV2LCAmYWI1NTAwX29wcyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhYjU1MDBfcmVnaXN0ZXIgb3BzIGVycm9yXG4iKTsKKwkJZ290byBleGl0X25vX2RldGVjdDsKKwl9CisKKwkvKiBTZXQgdXAgYW5kIHJlZ2lzdGVyIHRoZSBwbGF0Zm9ybSBkZXZpY2VzLiAqLworCWZvciAoaSA9IDA7IGkgPCBBQjU1MDBfTlVNX0RFVklDRVM7IGkrKykgeworCQlhYjU1MDBfZGV2c1tpXS5wbGF0Zm9ybV9kYXRhID0gYWI1NTAwX3BsZl9kYXRhLT5kZXZfZGF0YVtpXTsKKwkJYWI1NTAwX2RldnNbaV0ucGRhdGFfc2l6ZSA9CisJCQlzaXplb2YoYWI1NTAwX3BsZl9kYXRhLT5kZXZfZGF0YVtpXSk7CisJfQorCisJZXJyID0gbWZkX2FkZF9kZXZpY2VzKCZwZGV2LT5kZXYsIDAsIGFiNTUwMF9kZXZzLAorCQlBUlJBWV9TSVpFKGFiNTUwMF9kZXZzKSwgTlVMTCwKKwkJYWI1NTAwX3BsZl9kYXRhLT5pcnEuYmFzZSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhYjU1MDBfbWZkX2FkZF9kZXZpY2UgZXJyb3JcbiIpOworCQlnb3RvIGV4aXRfbm9fZGV0ZWN0OworCX0KKworCWVyciA9IGFiNTUwMF9zZXR1cChhYiwgYWI1NTAwX3BsZl9kYXRhLT5pbml0X3NldHRpbmdzLAorCQlhYjU1MDBfcGxmX2RhdGEtPmluaXRfc2V0dGluZ3Nfc3opOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWI1NTAwX3NldHVwIGVycm9yXG4iKTsKKwkJZ290byBleGl0X25vX2RldGVjdDsKKwl9CisKKwlhYjU1MDBfc2V0dXBfZGVidWdmcyhhYik7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZGV0ZWN0ZWQgQUIgY2hpcDogJXNcbiIsICZhYi0+Y2hpcF9uYW1lWzBdKTsKKwlyZXR1cm4gMDsKKworZXhpdF9ub19kZXRlY3Q6CisJa2ZyZWUoYWIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGFiNTUwMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJYWI1NTAwX3JlbW92ZV9kZWJ1Z2ZzKCk7CisJbWZkX3JlbW92ZV9kZXZpY2VzKCZwZGV2LT5kZXYpOworCWtmcmVlKGFiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWI1NTAwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhYjU1MDAtY29yZSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZSAgPSBfX2V4aXRfcChhYjU1MDBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFiNTUwMF9jb3JlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhYjU1MDBfZHJpdmVyLCBhYjU1MDBfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWI1NTAwX2NvcmVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhYjU1MDBfZHJpdmVyKTsKK30KKworc3Vic3lzX2luaXRjYWxsKGFiNTUwMF9jb3JlX2luaXQpOworbW9kdWxlX2V4aXQoYWI1NTAwX2NvcmVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hdHRpYXMgV2FsbGluIDxtYXR0aWFzLndhbGxpbkBzdGVyaWNzc29uLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUI1NTAwIGNvcmUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjU1MDAtY29yZS5oIGIvZHJpdmVycy9tZmQvYWI1NTAwLWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2IzMGIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvYWI1NTAwLWNvcmUuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNULUVyaWNzc29uCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqIFNoYXJlZCBkZWZpbml0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgQUI1NTAwIE1GRCBkcml2ZXIKKyAqLworCisvKiBSZWFkL3dyaXRlIG9wZXJhdGlvbiB2YWx1ZXMuICovCisjZGVmaW5lIEFCNTUwMF9QRVJNX1JEICgweDAxKQorI2RlZmluZSBBQjU1MDBfUEVSTV9XUiAoMHgwMikKKworLyogUmVhZC93cml0ZSBwZXJtaXNzaW9ucy4gKi8KKyNkZWZpbmUgQUI1NTAwX1BFUk1fUk8gKEFCNTUwMF9QRVJNX1JEKQorI2RlZmluZSBBQjU1MDBfUEVSTV9SVyAoQUI1NTAwX1BFUk1fUkQgfCBBQjU1MDBfUEVSTV9XUikKKworI2RlZmluZSBBQjU1MDBfTUFTS19CQVNFICgweDYwKQorI2RlZmluZSBBQjU1MDBfTUFTS19FTkQgKDB4NzkpCisjZGVmaW5lIEFCNTUwMF9DSElQX0lEICgweDIwKQorCisvKioKKyAqIHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlCisgKiBAZmlyc3Q6IHRoZSBmaXJzdCBhZGRyZXNzIG9mIHRoZSByYW5nZQorICogQGxhc3Q6IHRoZSBsYXN0IGFkZHJlc3Mgb2YgdGhlIHJhbmdlCisgKiBAcGVybTogYWNjZXNzIHBlcm1pc3Npb25zIGZvciB0aGUgcmFuZ2UKKyAqLworc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2UgeworCXU4IGZpcnN0OworCXU4IGxhc3Q7CisJdTggcGVybTsKK307CisKKy8qKgorICogc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzCisgKiBAY291bnQ6IHRoZSBudW1iZXIgb2YgcmFuZ2VzIGluIHRoZSBsaXN0CisgKiBAcmFuZ2U6IHRoZSBsaXN0IG9mIHJlZ2lzdGVyIHJhbmdlcworICovCitzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgeworCXU4IG5yYW5nZXM7CisJdTggYmFua2lkOworCWNvbnN0IHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlICpyYW5nZTsKK307CisKKy8qKgorICogc3RydWN0IGFiNTUwMF9pMmNfYmFua3MKKyAqIEBjb3VudDogdGhlIG51bWJlciBvZiByYW5nZXMgaW4gdGhlIGxpc3QKKyAqIEByYW5nZTogdGhlIGxpc3Qgb2YgcmVnaXN0ZXIgcmFuZ2VzCisgKi8KK3N0cnVjdCBhYjU1MDBfaTJjX2JhbmtzIHsKKwl1OCBuYmFua3M7CisJY29uc3Qgc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzICpiYW5rOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYWI1NTAwX2JhbmsKKyAqIEBzbGF2ZV9hZGRyOiBJMkMgc2xhdmVfYWRkciBmb3VuZCBpbiBBQjU1MDAgc3BlY2lmaWNhdGlvbgorICogQG5hbWU6IERvY3VtZW50YXRpb24gbmFtZSBvZiB0aGUgYmFuay4gRm9yIHJlZmVyZW5jZQorICovCitzdHJ1Y3QgYWI1NTAwX2JhbmsgeworCXU4IHNsYXZlX2FkZHI7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWI1NTAwX2JhbmsgYmFua2luZm9bQUI1NTAwX05VTV9CQU5LU10gPSB7CisJW0FCNTUwMF9CQU5LX1ZJVF9JT19JMkNfQ0xLX1RTVF9PVFBdID0geworCQlBQjU1MDBfQUREUl9WSVRfSU9fSTJDX0NMS19UU1RfT1RQLCAiVklUX0lPX0kyQ19DTEtfVFNUX09UUCJ9LAorCVtBQjU1MDBfQkFOS19WRERESUdfSU9fSTJDX0NMS19UU1RdID0geworCQlBQjU1MDBfQUREUl9WRERESUdfSU9fSTJDX0NMS19UU1QsICJWRERESUdfSU9fSTJDX0NMS19UU1QifSwKKwlbQUI1NTAwX0JBTktfVkRFTkNdID0ge0FCNTUwMF9BRERSX1ZERU5DLCAiVkRFTkMifSwKKwlbQUI1NTAwX0JBTktfU0lNX1VTQlNJTV0gPSB7QUI1NTAwX0FERFJfU0lNX1VTQlNJTSwgIlNJTV9VU0JTSU0ifSwKKwlbQUI1NTAwX0JBTktfTEVEXSA9IHtBQjU1MDBfQUREUl9MRUQsICJMRUQifSwKKwlbQUI1NTAwX0JBTktfQURDXSA9IHtBQjU1MDBfQUREUl9BREMsICJBREMifSwKKwlbQUI1NTAwX0JBTktfUlRDXSA9IHtBQjU1MDBfQUREUl9SVEMsICJSVEMifSwKKwlbQUI1NTAwX0JBTktfU1RBUlRVUF0gPSB7QUI1NTAwX0FERFJfU1RBUlRVUCwgIlNUQVJUVVAifSwKKwlbQUI1NTAwX0JBTktfREJJX0VDSV0gPSB7QUI1NTAwX0FERFJfREJJX0VDSSwgIkRCSS1FQ0kifSwKKwlbQUI1NTAwX0JBTktfQ0hHXSA9IHtBQjU1MDBfQUREUl9DSEcsICJDSEcifSwKKwlbQUI1NTAwX0JBTktfRkdfQkFUVENPTV9BQ0NdID0geworCQlBQjU1MDBfQUREUl9GR19CQVRUQ09NX0FDQywgIkZHX0JBVENPTV9BQ0MifSwKKwlbQUI1NTAwX0JBTktfVVNCXSA9IHtBQjU1MDBfQUREUl9VU0IsICJVU0IifSwKKwlbQUI1NTAwX0JBTktfSVRdID0ge0FCNTUwMF9BRERSX0lULCAiSVQifSwKKwlbQUI1NTAwX0JBTktfVklCUkFdID0ge0FCNTUwMF9BRERSX1ZJQlJBLCAiVklCUkEifSwKKwlbQUI1NTAwX0JBTktfQVVESU9fSEVBRFNFVFVTQl0gPSB7CisJCUFCNTUwMF9BRERSX0FVRElPX0hFQURTRVRVU0IsICJBVURJT19IRUFEU0VUVVNCIn0sCit9OworCitpbnQgYWI1NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhzdHJ1Y3QgYWI1NTAwICphYiwgdTggYmFuaywgdTggcmVnLAorCXU4ICp2YWx1ZSk7CitpbnQgYWI1NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhzdHJ1Y3QgYWI1NTAwICphYiwgdTggYmFuaywKKwl1OCByZWcsIHU4IGJpdG1hc2ssIHU4IGJpdHZhbHVlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjU1MDAtZGVidWdmcy5jIGIvZHJpdmVycy9tZmQvYWI1NTAwLWRlYnVnZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2MwZWJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvYWI1NTAwLWRlYnVnZnMuYwpAQCAtMCwwICsxLDgwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTVC1Fcmljc3NvbgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKiBEZWJ1Z2ZzIHN1cHBvcnQgZm9yIHRoZSBBQjU1MDAgTUZEIGRyaXZlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWI1NTAwL2FiNTUwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJhYjU1MDAtY29yZS5oIgorI2luY2x1ZGUgImFiNTUwMC1kZWJ1Z2ZzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgYWI1NTAwX3JlZ19yYW5nZXNbQUI1NTAwX05VTV9CQU5LU10gPSB7CisJW0FCNTUwMF9CQU5LX0xFRF0gPSB7CisJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19MRUQsCisJCS5ucmFuZ2VzID0gMSwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwQywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19BRENdID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfQURDLAorCQkubnJhbmdlcyA9IDYsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgxRiwKKwkJCQkubGFzdCA9IDB4MjIsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyMywKKwkJCQkubGFzdCA9IDB4MjQsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyNiwKKwkJCQkubGFzdCA9IDB4MkQsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyRiwKKwkJCQkubGFzdCA9IDB4MzQsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgzNywKKwkJCQkubGFzdCA9IDB4NTcsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg1OCwKKwkJCQkubGFzdCA9IDB4NTgsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0JBTktfUlRDXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1JUQywKKwkJLm5yYW5nZXMgPSAyLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJLmxhc3QgPSAweDA0LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MDYsCisJCQkJLmxhc3QgPSAweDBDLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9CQU5LX1NUQVJUVVBdID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfU1RBUlRVUCwKKwkJLm5yYW5nZXMgPSAxMiwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwMSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDFGLAorCQkJCS5sYXN0ID0gMHgxRiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDJFLAorCQkJCS5sYXN0ID0gMHgyRSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDJGLAorCQkJCS5sYXN0ID0gMHgzMCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDUwLAorCQkJCS5sYXN0ID0gMHg1MSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDYwLAorCQkJCS5sYXN0ID0gMHg2MSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDY2LAorCQkJCS5sYXN0ID0gMHg4QSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDhDLAorCQkJCS5sYXN0ID0gMHg5NiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEFBLAorCQkJCS5sYXN0ID0gMHhCNCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEI3LAorCQkJCS5sYXN0ID0gMHhCRiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEMxLAorCQkJCS5sYXN0ID0gMHhDQSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEQzLAorCQkJCS5sYXN0ID0gMHhFMCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19EQklfRUNJXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX0RCSV9FQ0ksCisJCS5ucmFuZ2VzID0gMywKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwNywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDEwLAorCQkJCS5sYXN0ID0gMHgxMCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDEzLAorCQkJCS5sYXN0ID0gMHgxMywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19DSEddID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfQ0hHLAorCQkubnJhbmdlcyA9IDIsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgxMSwKKwkJCQkubGFzdCA9IDB4MTEsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgxMiwKKwkJCQkubGFzdCA9IDB4MUIsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0JBTktfRkdfQkFUVENPTV9BQ0NdID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfRkdfQkFUVENPTV9BQ0MsCisJCS5ucmFuZ2VzID0gMiwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwQiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDBDLAorCQkJCS5sYXN0ID0gMHgxMCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19VU0JdID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfVVNCLAorCQkubnJhbmdlcyA9IDEyLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDEsCisJCQkJLmxhc3QgPSAweDAxLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4ODAsCisJCQkJLmxhc3QgPSAweDgzLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4ODcsCisJCQkJLmxhc3QgPSAweDhBLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4OEIsCisJCQkJLmxhc3QgPSAweDhCLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4OTEsCisJCQkJLmxhc3QgPSAweDkyLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4OTMsCisJCQkJLmxhc3QgPSAweDkzLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4OTQsCisJCQkJLmxhc3QgPSAweDk0LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4QTgsCisJCQkJLmxhc3QgPSAweEIwLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4QjIsCisJCQkJLmxhc3QgPSAweEIyLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4QjQsCisJCQkJLmxhc3QgPSAweEJDLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4QkYsCisJCQkJLmxhc3QgPSAweEJGLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4QzEsCisJCQkJLmxhc3QgPSAweEM1LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9CQU5LX0lUXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX0lULAorCQkubnJhbmdlcyA9IDQsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkubGFzdCA9IDB4MDIsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyMCwKKwkJCQkubGFzdCA9IDB4MzYsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg0MCwKKwkJCQkubGFzdCA9IDB4NTYsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg2MCwKKwkJCQkubGFzdCA9IDB4NzYsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0JBTktfVkRERElHX0lPX0kyQ19DTEtfVFNUXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1ZERERJR19JT19JMkNfQ0xLX1RTVCwKKwkJLm5yYW5nZXMgPSA3LAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDIsCisJCQkJLmxhc3QgPSAweDAyLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MTIsCisJCQkJLmxhc3QgPSAweDEyLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MzAsCisJCQkJLmxhc3QgPSAweDM0LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NDAsCisJCQkJLmxhc3QgPSAweDQ0LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NTAsCisJCQkJLmxhc3QgPSAweDU0LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NjAsCisJCQkJLmxhc3QgPSAweDY0LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NzAsCisJCQkJLmxhc3QgPSAweDc0LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9CQU5LX1ZJVF9JT19JMkNfQ0xLX1RTVF9PVFBdID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfVklUX0lPX0kyQ19DTEtfVFNUX09UUCwKKwkJLm5yYW5nZXMgPSAxMywKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAxLAorCQkJCS5sYXN0ID0gMHgwMSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAyLAorCQkJCS5sYXN0ID0gMHgwMiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDBELAorCQkJCS5sYXN0ID0gMHgwRiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDFDLAorCQkJCS5sYXN0ID0gMHgxQywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDFFLAorCQkJCS5sYXN0ID0gMHgxRSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDIwLAorCQkJCS5sYXN0ID0gMHgyMSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDI1LAorCQkJCS5sYXN0ID0gMHgyNSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDI4LAorCQkJCS5sYXN0ID0gMHgyQSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDMwLAorCQkJCS5sYXN0ID0gMHgzMywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDQwLAorCQkJCS5sYXN0ID0gMHg0MywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDUwLAorCQkJCS5sYXN0ID0gMHg1MywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDYwLAorCQkJCS5sYXN0ID0gMHg2MywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDcwLAorCQkJCS5sYXN0ID0gMHg3MywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19WSUJSQV0gPSB7CisJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19WSUJSQSwKKwkJLm5yYW5nZXMgPSAyLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MTAsCisJCQkJLmxhc3QgPSAweDEzLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4RkUsCisJCQkJLmxhc3QgPSAweEZFLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9CQU5LX0FVRElPX0hFQURTRVRVU0JdID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfQVVESU9fSEVBRFNFVFVTQiwKKwkJLm5yYW5nZXMgPSAyLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJLmxhc3QgPSAweDQ4LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4RUIsCisJCQkJLmxhc3QgPSAweEZCLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9CQU5LX1NJTV9VU0JTSU1dID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfU0lNX1VTQlNJTSwKKwkJLm5yYW5nZXMgPSAxLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MTMsCisJCQkJLmxhc3QgPSAweDE5LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9CQU5LX1ZERU5DXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1ZERU5DLAorCQkubnJhbmdlcyA9IDEyLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJLmxhc3QgPSAweDA4LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MDksCisJCQkJLmxhc3QgPSAweDA5LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MEEsCisJCQkJLmxhc3QgPSAweDEyLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MTUsCisJCQkJLmxhc3QgPSAweDE5LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MUIsCisJCQkJLmxhc3QgPSAweDIxLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MjcsCisJCQkJLmxhc3QgPSAweDJDLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NDEsCisJCQkJLmxhc3QgPSAweDQxLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NDUsCisJCQkJLmxhc3QgPSAweDVCLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NUQsCisJCQkJLmxhc3QgPSAweDVELAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NjksCisJCQkJLmxhc3QgPSAweDY5LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NkMsCisJCQkJLmxhc3QgPSAweDZELAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4ODAsCisJCQkJLmxhc3QgPSAweDgxLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQl9LAorCX0sCit9OworCitzdGF0aWMgaW50IGFiNTUwMF9yZWdpc3RlcnNfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQoreworCXN0cnVjdCBhYjU1MDAgKmFiID0gcy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1OCBiYW5rID0gKHU4KWFiLT5kZWJ1Z19iYW5rOworCisJc2VxX3ByaW50ZihzLCAiYWI1NTAwIHJlZ2lzdGVyIHZhbHVlczpcbiIpOworCWZvciAoYmFuayA9IDA7IGJhbmsgPCBBQjU1MDBfTlVNX0JBTktTOyBiYW5rKyspIHsKKwkJc2VxX3ByaW50ZihzLCAiIGJhbmsgJXUsICVzICgweCV4KTpcbiIsIGJhbmssCisJCQkJYmFua2luZm9bYmFua10ubmFtZSwKKwkJCQliYW5raW5mb1tiYW5rXS5zbGF2ZV9hZGRyKTsKKwkJZm9yIChpID0gMDsgaSA8IGFiNTUwMF9yZWdfcmFuZ2VzW2JhbmtdLm5yYW5nZXM7IGkrKykgeworCQkJdTggcmVnOworCQkJaW50IGVycjsKKworCQkJZm9yIChyZWcgPSBhYjU1MDBfcmVnX3Jhbmdlc1tiYW5rXS5yYW5nZVtpXS5maXJzdDsKKwkJCQlyZWcgPD0gYWI1NTAwX3JlZ19yYW5nZXNbYmFua10ucmFuZ2VbaV0ubGFzdDsKKwkJCQlyZWcrKykgeworCQkJCXU4IHZhbHVlOworCisJCQkJZXJyID0gYWI1NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhhYiwKKwkJCQkJCQkJYmFuaywgcmVnLAorCQkJCQkJCQkmdmFsdWUpOworCQkJCWlmIChlcnIgPCAwKSB7CisJCQkJCWRldl9lcnIoYWItPmRldiwgImdldF9yZWcgZmFpbGVkICVkIgorCQkJCQkJImJhbmsgMHgleCByZWcgMHgleFxuIiwKKwkJCQkJCWVyciwgYmFuaywgcmVnKTsKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQl9CisKKwkJCQllcnIgPSBzZXFfcHJpbnRmKHMsICJbJWQvMHglMDJYXTogMHglMDJYXG4iLAorCQkJCQkJYmFuaywgcmVnLCB2YWx1ZSk7CisJCQkJaWYgKGVyciA8IDApIHsKKwkJCQkJZGV2X2VycihhYi0+ZGV2LAorCQkJCQkJInNlcV9wcmludGYgb3ZlcmZsb3dcbiIpOworCQkJCQkvKgorCQkJCQkgKiBFcnJvciBpcyBub3QgcmV0dXJuZWQgaGVyZSBzaW5jZQorCQkJCQkgKiB0aGUgb3V0cHV0IGlzIHdhbnRlZCBpbiBhbnkgY2FzZQorCQkJCQkgKi8KKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiNTUwMF9yZWdpc3RlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWI1NTAwX3JlZ2lzdGVyc19wcmludCwgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFiNTUwMF9yZWdpc3RlcnNfZm9wcyA9IHsKKwkub3BlbiA9IGFiNTUwMF9yZWdpc3RlcnNfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgYWI1NTAwX2JhbmtfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQoreworCXN0cnVjdCBhYjU1MDAgKmFiID0gcy0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYocywgIiVkXG4iLCBhYi0+ZGVidWdfYmFuayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWI1NTAwX2Jhbmtfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWI1NTAwX2JhbmtfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgc3NpemVfdCBhYjU1MDBfYmFua193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGFiNTUwMCAqYWIgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKKwljaGFyIGJ1ZlszMl07CisJaW50IGJ1Zl9zaXplOworCXVuc2lnbmVkIGxvbmcgdXNlcl9iYW5rOworCWludCBlcnI7CisKKwkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCisJYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbYnVmX3NpemVdID0gMDsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYmFuayk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodXNlcl9iYW5rID49IEFCNTUwMF9OVU1fQkFOS1MpIHsKKwkJZGV2X2VycihhYi0+ZGV2LAorCQkJImRlYnVnZnMgZXJyb3IgaW5wdXQgPiBudW1iZXIgb2YgYmFua3NcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhYi0+ZGVidWdfYmFuayA9IHVzZXJfYmFuazsKKworCXJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGludCBhYjU1MDBfYWRkcmVzc19wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCit7CisJc3RydWN0IGFiNTUwMCAqYWIgPSBzLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihzLCAiMHglMDJYXG4iLCBhYi0+ZGVidWdfYWRkcmVzcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWI1NTAwX2FkZHJlc3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWI1NTAwX2FkZHJlc3NfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgc3NpemVfdCBhYjU1MDBfYWRkcmVzc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGFiNTUwMCAqYWIgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKKwljaGFyIGJ1ZlszMl07CisJaW50IGJ1Zl9zaXplOworCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyZXNzOworCWludCBlcnI7CisKKwkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCisJYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbYnVmX3NpemVdID0gMDsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYWRkcmVzcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVzZXJfYWRkcmVzcyA+IDB4ZmYpIHsKKwkJZGV2X2VycihhYi0+ZGV2LAorCQkJImRlYnVnZnMgZXJyb3IgaW5wdXQgPiAweGZmXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFiLT5kZWJ1Z19hZGRyZXNzID0gdXNlcl9hZGRyZXNzOworCXJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGludCBhYjU1MDBfdmFsX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYiA9IHMtPnByaXZhdGU7CisJaW50IGVycjsKKwl1OCByZWd2YWx1ZTsKKworCWVyciA9IGFiNTUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoYWIsICh1OClhYi0+ZGVidWdfYmFuaywKKwkJKHU4KWFiLT5kZWJ1Z19hZGRyZXNzLCAmcmVndmFsdWUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihhYi0+ZGV2LCAiZ2V0X3JlZyBmYWlsZWQgJWQsIGJhbmsgMHgleCIKKwkJCSIsIHJlZyAweCV4XG4iLCBlcnIsIGFiLT5kZWJ1Z19iYW5rLAorCQkJYWItPmRlYnVnX2FkZHJlc3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2VxX3ByaW50ZihzLCAiMHglMDJYXG4iLCByZWd2YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYjU1MDBfdmFsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiNTUwMF92YWxfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgc3NpemVfdCBhYjU1MDBfdmFsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYiA9ICgoc3RydWN0IHNlcV9maWxlICopKGZpbGUtPnByaXZhdGVfZGF0YSkpLT5wcml2YXRlOworCWNoYXIgYnVmWzMyXTsKKwlpbnQgYnVmX3NpemU7CisJdW5zaWduZWQgbG9uZyB1c2VyX3ZhbDsKKwlpbnQgZXJyOworCXU4IHJlZ3ZhbHVlOworCisJLyogR2V0IHVzZXJzcGFjZSBzdHJpbmcgYW5kIGFzc3VyZSB0ZXJtaW5hdGlvbiAqLworCWJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZiktMSkpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZltidWZfc2l6ZV0gPSAwOworCisJZXJyID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdXNlcl92YWwpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1c2VyX3ZhbCA+IDB4ZmYpIHsKKwkJZGV2X2VycihhYi0+ZGV2LAorCQkJImRlYnVnZnMgZXJyb3IgaW5wdXQgPiAweGZmXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVyciA9IGFiNTUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoCisJCWFiLCAodTgpYWItPmRlYnVnX2JhbmssCisJCSh1OClhYi0+ZGVidWdfYWRkcmVzcywgMHhGRiwgKHU4KXVzZXJfdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFiNTUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoYWIsICh1OClhYi0+ZGVidWdfYmFuaywKKwkJKHU4KWFiLT5kZWJ1Z19hZGRyZXNzLCAmcmVndmFsdWUpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGJ1Zl9zaXplOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjU1MDBfYmFua19mb3BzID0geworCS5vcGVuID0gYWI1NTAwX2Jhbmtfb3BlbiwKKwkud3JpdGUgPSBhYjU1MDBfYmFua193cml0ZSwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFiNTUwMF9hZGRyZXNzX2ZvcHMgPSB7CisJLm9wZW4gPSBhYjU1MDBfYWRkcmVzc19vcGVuLAorCS53cml0ZSA9IGFiNTUwMF9hZGRyZXNzX3dyaXRlLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWI1NTAwX3ZhbF9mb3BzID0geworCS5vcGVuID0gYWI1NTAwX3ZhbF9vcGVuLAorCS53cml0ZSA9IGFiNTUwMF92YWxfd3JpdGUsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYWI1NTAwX2RpcjsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphYjU1MDBfcmVnX2ZpbGU7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYWI1NTAwX2JhbmtfZmlsZTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphYjU1MDBfYWRkcmVzc19maWxlOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmFiNTUwMF92YWxfZmlsZTsKKwordm9pZCBfX2luaXQgYWI1NTAwX3NldHVwX2RlYnVnZnMoc3RydWN0IGFiNTUwMCAqYWIpCit7CisJYWItPmRlYnVnX2JhbmsgPSBBQjU1MDBfQkFOS19WSVRfSU9fSTJDX0NMS19UU1RfT1RQOworCWFiLT5kZWJ1Z19hZGRyZXNzID0gQUI1NTAwX0NISVBfSUQ7CisKKwlhYjU1MDBfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJhYjU1MDAiLCBOVUxMKTsKKwlpZiAoIWFiNTUwMF9kaXIpCisJCWdvdG8gZXhpdF9ub19kZWJ1Z2ZzOworCisJYWI1NTAwX3JlZ19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYWxsLWJhbmstcmVnaXN0ZXJzIiwKKwkJU19JUlVHTywgYWI1NTAwX2RpciwgYWIsICZhYjU1MDBfcmVnaXN0ZXJzX2ZvcHMpOworCWlmICghYWI1NTAwX3JlZ19maWxlKQorCQlnb3RvIGV4aXRfZGVzdHJveV9kaXI7CisKKwlhYjU1MDBfYmFua19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXItYmFuayIsCisJCShTX0lSVUdPIHwgU19JV1VHTyksIGFiNTUwMF9kaXIsIGFiLCAmYWI1NTAwX2JhbmtfZm9wcyk7CisJaWYgKCFhYjU1MDBfYmFua19maWxlKQorCQlnb3RvIGV4aXRfZGVzdHJveV9yZWc7CisKKwlhYjU1MDBfYWRkcmVzc19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXItYWRkcmVzcyIsCisJCShTX0lSVUdPIHwgU19JV1VHTyksIGFiNTUwMF9kaXIsIGFiLCAmYWI1NTAwX2FkZHJlc3NfZm9wcyk7CisJaWYgKCFhYjU1MDBfYWRkcmVzc19maWxlKQorCQlnb3RvIGV4aXRfZGVzdHJveV9iYW5rOworCisJYWI1NTAwX3ZhbF9maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXItdmFsdWUiLAorCQkoU19JUlVHTyB8IFNfSVdVR08pLCBhYjU1MDBfZGlyLCBhYiwgJmFiNTUwMF92YWxfZm9wcyk7CisJaWYgKCFhYjU1MDBfdmFsX2ZpbGUpCisJCWdvdG8gZXhpdF9kZXN0cm95X2FkZHJlc3M7CisKKwlyZXR1cm47CisKK2V4aXRfZGVzdHJveV9hZGRyZXNzOgorCWRlYnVnZnNfcmVtb3ZlKGFiNTUwMF9hZGRyZXNzX2ZpbGUpOworZXhpdF9kZXN0cm95X2Jhbms6CisJZGVidWdmc19yZW1vdmUoYWI1NTAwX2JhbmtfZmlsZSk7CitleGl0X2Rlc3Ryb3lfcmVnOgorCWRlYnVnZnNfcmVtb3ZlKGFiNTUwMF9yZWdfZmlsZSk7CitleGl0X2Rlc3Ryb3lfZGlyOgorCWRlYnVnZnNfcmVtb3ZlKGFiNTUwMF9kaXIpOworZXhpdF9ub19kZWJ1Z2ZzOgorCWRldl9lcnIoYWItPmRldiwgImZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBlbnRyaWVzLlxuIik7CisJcmV0dXJuOworfQorCit2b2lkIF9fZXhpdCBhYjU1MDBfcmVtb3ZlX2RlYnVnZnModm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShhYjU1MDBfdmFsX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGFiNTUwMF9hZGRyZXNzX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGFiNTUwMF9iYW5rX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGFiNTUwMF9yZWdfZmlsZSk7CisJZGVidWdmc19yZW1vdmUoYWI1NTAwX2Rpcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjU1MDAtZGVidWdmcy5oIGIvZHJpdmVycy9tZmQvYWI1NTAwLWRlYnVnZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzMwYTliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvYWI1NTAwLWRlYnVnZnMuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNULUVyaWNzc29uCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqIERlYnVnZnMgaW50ZXJmYWNlIHRvIHRoZSBBQjU1MDAgY29yZSBkcml2ZXIKKyAqLworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisKK3ZvaWQgYWI1NTAwX3NldHVwX2RlYnVnZnMoc3RydWN0IGFiNTUwMCAqYWIpOwordm9pZCBhYjU1MDBfcmVtb3ZlX2RlYnVnZnModm9pZCk7CisKKyNlbHNlIC8qICFDT05GSUdfREVCVUdfRlMgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGFiNTUwMF9zZXR1cF9kZWJ1Z2ZzKHN0cnVjdCBhYjU1MDAgKmFiKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWI1NTAwX3JlbW92ZV9kZWJ1Z2ZzKHZvaWQpCit7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FiODUwMC1jb3JlLmMKaW5kZXggMzg3NzA1ZS4uMWU5MTczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hYjg1MDAtY29yZS5jCkBAIC05Miw2ICs5Miw4IEBACiAjZGVmaW5lIEFCODUwMF9SRVZfUkVHCQkJMHg4MAogI2RlZmluZSBBQjg1MDBfU1dJVENIX09GRl9TVEFUVVMJMHgwMAogCisjZGVmaW5lIEFCODUwMF9UVVJOX09OX1NUQVRVUwkJMHgwMAorCiAvKgogICogTWFwIGludGVycnVwdCBudW1iZXJzIHRvIHRoZSBMQVRDSCBhbmQgTUFTSyByZWdpc3RlciBvZmZzZXRzLCBJbnRlcnJ1cHQKICAqIG51bWJlcnMgYXJlIGluZGV4ZWQgaW50byB0aGlzIGFycmF5IHdpdGggKG51bSAvIDgpLgpAQCAtMjkzLDYgKzI5NSw3IEBACiAJLmlycV9idXNfbG9jawkJPSBhYjg1MDBfaXJxX2xvY2ssCiAJLmlycV9idXNfc3luY191bmxvY2sJPSBhYjg1MDBfaXJxX3N5bmNfdW5sb2NrLAogCS5pcnFfbWFzawkJPSBhYjg1MDBfaXJxX21hc2ssCisJLmlycV9kaXNhYmxlCQk9IGFiODUwMF9pcnFfbWFzaywKIAkuaXJxX3VubWFzawkJPSBhYjg1MDBfaXJxX3VubWFzaywKIH07CiAKQEAgLTgxMSwxMiArODE0LDQwIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJSN4XG4iLCB2YWx1ZSk7CiB9CiAKKy8qCisgKiBhYjg1MDAgaGFzIHR1cm5lZCBvbiBkdWUgdG8gKFRVUk5fT05fU1RBVFVTKToKKyAqIDB4MDEgUE9SblZiYXQKKyAqIDB4MDIgUG9uS2V5MWRiRgorICogMHgwNCBQb25LZXkyZGJGCisgKiAweDA4IFJUQ0FsYXJtCisgKiAweDEwIE1haW5DaERldAorICogMHgyMCBWYnVzRGV0CisgKiAweDQwIFVzYklERGV0ZWN0CisgKiAweDgwIFJlc2VydmVkCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdHVybl9vbl9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1OCB2YWx1ZTsKKwlzdHJ1Y3QgYWI4NTAwICphYjg1MDA7CisKKwlhYjg1MDAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXQgPSBnZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYjg1MDAsIEFCODUwMF9TWVNfQ1RSTDFfQkxPQ0ssCisJCUFCODUwMF9UVVJOX09OX1NUQVRVUywgJnZhbHVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlI3hcbiIsIHZhbHVlKTsKK30KKwogc3RhdGljIERFVklDRV9BVFRSKGNoaXBfaWQsIFNfSVJVR08sIHNob3dfY2hpcF9pZCwgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoc3dpdGNoX29mZl9zdGF0dXMsIFNfSVJVR08sIHNob3dfc3dpdGNoX29mZl9zdGF0dXMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHR1cm5fb25fc3RhdHVzLCBTX0lSVUdPLCBzaG93X3R1cm5fb25fc3RhdHVzLCBOVUxMKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFiODUwMF9zeXNmc19lbnRyaWVzW10gPSB7CiAJJmRldl9hdHRyX2NoaXBfaWQuYXR0ciwKIAkmZGV2X2F0dHJfc3dpdGNoX29mZl9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfdHVybl9vbl9zdGF0dXMuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtODQzLDExICs4NzQsMTEgQEAKIAkJcmV0dXJuIHJldDsKIAogCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIEFCODUwMF9DVVRFQVJMWToKIAljYXNlIEFCODUwMF9DVVQxUDA6CiAJY2FzZSBBQjg1MDBfQ1VUMVAxOgogCWNhc2UgQUI4NTAwX0NVVDJQMDoKIAljYXNlIEFCODUwMF9DVVQzUDA6CisJY2FzZSBBQjg1MDBfQ1VUM1AzOgogCQlkZXZfaW5mbyhhYjg1MDAtPmRldiwgImRldGVjdGVkIGNoaXAsIHJldmlzaW9uOiAlI3hcbiIsIHZhbHVlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jCmluZGV4IDY0YmRlZWIuLmRlZGI3ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9tZmQvYWI4NTAwLWRlYnVnZnMuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI4NTAwLWdwYWRjLmMgYi9kcml2ZXJzL21mZC9hYjg1MDAtZ3BhZGMuYwppbmRleCBmMTZhZmIyLi5lOTg1ZDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjg1MDAtZ3BhZGMuYworKysgYi9kcml2ZXJzL21mZC9hYjg1MDAtZ3BhZGMuYwpAQCAtMTQzLDEyICsxNDMsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWI4NTAwX2dwYWRjX2dldCk7CiAKLXN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2Uoc3RydWN0IGFiODUwMF9ncGFkYyAqZ3BhZGMsIHU4IGlucHV0LAorLyoqCisgKiBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZSgpIC0gQ29udmVydCBhIHJhdyBBREMgdmFsdWUgdG8gYSB2b2x0YWdlCisgKi8KK2ludCBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZShzdHJ1Y3QgYWI4NTAwX2dwYWRjICpncGFkYywgdTggY2hhbm5lbCwKIAlpbnQgYWRfdmFsdWUpCiB7CiAJaW50IHJlczsKIAotCXN3aXRjaCAoaW5wdXQpIHsKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKIAljYXNlIE1BSU5fQ0hBUkdFUl9WOgogCQkvKiBGb3Igc29tZSByZWFzb24gd2UgZG9uJ3QgaGF2ZSBjYWxpYnJhdGVkIGRhdGEgKi8KIAkJaWYgKCFncGFkYy0+Y2FsX2RhdGFbQURDX0lOUFVUX1ZNQUlOXS5nYWluKSB7CkBAIC0yMzIsMTggKzIzNSw0NiBAQAogCX0KIAlyZXR1cm4gcmVzOwogfQorRVhQT1JUX1NZTUJPTChhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZSk7CiAKIC8qKgogICogYWI4NTAwX2dwYWRjX2NvbnZlcnQoKSAtIGdwYWRjIGNvbnZlcnNpb24KLSAqIEBpbnB1dDoJYW5hbG9nIGlucHV0IHRvIGJlIGNvbnZlcnRlZCB0byBkaWdpdGFsIGRhdGEKKyAqIEBjaGFubmVsOglhbmFsb2cgY2hhbm5lbCB0byBiZSBjb252ZXJ0ZWQgdG8gZGlnaXRhbCBkYXRhCiAgKgogICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgc2VsZWN0ZWQgYW5hbG9nIGkvcCB0byBkaWdpdGFsCiAgKiBkYXRhLgogICovCi1pbnQgYWI4NTAwX2dwYWRjX2NvbnZlcnQoc3RydWN0IGFiODUwMF9ncGFkYyAqZ3BhZGMsIHU4IGlucHV0KQoraW50IGFiODUwMF9ncGFkY19jb252ZXJ0KHN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjLCB1OCBjaGFubmVsKQoreworCWludCBhZF92YWx1ZTsKKwlpbnQgdm9sdGFnZTsKKworCWFkX3ZhbHVlID0gYWI4NTAwX2dwYWRjX3JlYWRfcmF3KGdwYWRjLCBjaGFubmVsKTsKKwlpZiAoYWRfdmFsdWUgPCAwKSB7CisJCWRldl9lcnIoZ3BhZGMtPmRldiwgIkdQQURDIHJhdyB2YWx1ZSBmYWlsZWQgY2g6ICVkXG4iLCBjaGFubmVsKTsKKwkJcmV0dXJuIGFkX3ZhbHVlOworCX0KKworCXZvbHRhZ2UgPSBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZShncGFkYywgY2hhbm5lbCwgYWRfdmFsdWUpOworCisJaWYgKHZvbHRhZ2UgPCAwKQorCQlkZXZfZXJyKGdwYWRjLT5kZXYsICJHUEFEQyB0byB2b2x0YWdlIGNvbnZlcnNpb24gZmFpbGVkIGNoOiIKKwkJCSIgJWQgQUQ6IDB4JXhcbiIsIGNoYW5uZWwsIGFkX3ZhbHVlKTsKKworCXJldHVybiB2b2x0YWdlOworfQorRVhQT1JUX1NZTUJPTChhYjg1MDBfZ3BhZGNfY29udmVydCk7CisKKy8qKgorICogYWI4NTAwX2dwYWRjX3JlYWRfcmF3KCkgLSBncGFkYyByZWFkCisgKiBAY2hhbm5lbDoJYW5hbG9nIGNoYW5uZWwgdG8gYmUgcmVhZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gb2J0YWlucyB0aGUgcmF3IEFEQyB2YWx1ZSwgdGhpcyB0aGVuIG5lZWRzCisgKiB0byBiZSBjb252ZXJ0ZWQgYnkgY2FsbGluZyBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZSgpCisgKi8KK2ludCBhYjg1MDBfZ3BhZGNfcmVhZF9yYXcoc3RydWN0IGFiODUwMF9ncGFkYyAqZ3BhZGMsIHU4IGNoYW5uZWwpCiB7CiAJaW50IHJldDsKLQl1MTYgZGF0YSA9IDA7CiAJaW50IGxvb3BsaW1pdCA9IDA7CiAJdTggdmFsLCBsb3dfZGF0YSwgaGlnaF9kYXRhOwogCkBAIC0yNzgsOSArMzA5LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JLyogU2VsZWN0IHRoZSBpbnB1dCBzb3VyY2UgYW5kIHNldCBhdmVyYWdlIHNhbXBsZXMgdG8gMTYgKi8KKwkvKiBTZWxlY3QgdGhlIGNoYW5uZWwgc291cmNlIGFuZCBzZXQgYXZlcmFnZSBzYW1wbGVzIHRvIDE2ICovCiAJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGdwYWRjLT5kZXYsIEFCODUwMF9HUEFEQywKLQkJQUI4NTAwX0dQQURDX0NUUkwyX1JFRywgKGlucHV0IHwgU1dfQVZHXzE2KSk7CisJCUFCODUwMF9HUEFEQ19DVFJMMl9SRUcsIChjaGFubmVsIHwgU1dfQVZHXzE2KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihncGFkYy0+ZGV2LAogCQkJImdwYWRjX2NvbnZlcnNpb246IHNldCBhdmcgc2FtcGxlcyBmYWlsZWRcbiIpOwpAQCAtMjkyLDcgKzMyMyw3IEBACiAJICogY2hhcmdpbmcgY3VycmVudCBzZW5zZSBpZiBpdCBuZWVkZWQsIEFCQiAzLjAgbmVlZHMgc29tZSBzcGVjaWFsCiAJICogdHJlYXRtZW50IHRvby4KIAkgKi8KLQlzd2l0Y2ggKGlucHV0KSB7CisJc3dpdGNoIChjaGFubmVsKSB7CiAJY2FzZSBNQUlOX0NIQVJHRVJfQzoKIAljYXNlIFVTQl9DSEFSR0VSX0M6CiAJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShncGFkYy0+ZGV2LApAQCAtMzU5LDcgKzM5MCw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWRhdGEgPSAoaGlnaF9kYXRhIDw8IDgpIHwgbG93X2RhdGE7CiAJLyogRGlzYWJsZSBHUEFEQyAqLwogCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShncGFkYy0+ZGV2LCBBQjg1MDBfR1BBREMsCiAJCUFCODUwMF9HUEFEQ19DVFJMMV9SRUcsIERJU19HUEFEQyk7CkBAIC0zNzAsOCArNDAwLDggQEAKIAkvKiBEaXNhYmxlIFZUVm91dCBMRE8gdGhpcyBpcyByZXF1aXJlZCBmb3IgR1BBREMgKi8KIAlyZWd1bGF0b3JfZGlzYWJsZShncGFkYy0+cmVndSk7CiAJbXV0ZXhfdW5sb2NrKCZncGFkYy0+YWI4NTAwX2dwYWRjX2xvY2spOwotCXJldCA9IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKGdwYWRjLCBpbnB1dCwgZGF0YSk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAoaGlnaF9kYXRhIDw8IDgpIHwgbG93X2RhdGE7CiAKIG91dDoKIAkvKgpAQCAtMzg1LDEwICs0MTUsMTAgQEAKIAlyZWd1bGF0b3JfZGlzYWJsZShncGFkYy0+cmVndSk7CiAJbXV0ZXhfdW5sb2NrKCZncGFkYy0+YWI4NTAwX2dwYWRjX2xvY2spOwogCWRldl9lcnIoZ3BhZGMtPmRldiwKLQkJImdwYWRjX2NvbnZlcnNpb246IEZhaWxlZCB0byBBRCBjb252ZXJ0IGNoYW5uZWwgJWRcbiIsIGlucHV0KTsKKwkJImdwYWRjX2NvbnZlcnNpb246IEZhaWxlZCB0byBBRCBjb252ZXJ0IGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGFiODUwMF9ncGFkY19jb252ZXJ0KTsKK0VYUE9SVF9TWU1CT0woYWI4NTAwX2dwYWRjX3JlYWRfcmF3KTsKIAogLyoqCiAgKiBhYjg1MDBfYm1fZ3Bzd2FkY2NvbnZlbmRfaGFuZGxlcigpIC0gaXNyIGZvciBzL3cgZ3BhZGMgY29udmVyc2lvbiBjb21wbGV0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjg1MDAtc3lzY3RybC5jIGIvZHJpdmVycy9tZmQvYWI4NTAwLXN5c2N0cmwuYwppbmRleCAzOTIxODU5Li5mMjBmZWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjg1MDAtc3lzY3RybC5jCisrKyBiL2RyaXZlcnMvbWZkL2FiODUwMC1zeXNjdHJsLmMKQEAgLTUsNiArNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9hYjg1MDAuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYng1MDAtY29yZS5jIGIvZHJpdmVycy9tZmQvYWJ4NTAwLWNvcmUuYwppbmRleCBmMTI3MjBkLi43Y2U2NWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYng1MDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL2FieDUwMC1jb3JlLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwLmg+CiAKIHN0YXRpYyBMSVNUX0hFQUQoYWJ4NTAwX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYXNpYzMuYyBiL2RyaXZlcnMvbWZkL2FzaWMzLmMKaW5kZXggYzcxYWUwOS4uYjg1YmJkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYXNpYzMuYworKysgYi9kcml2ZXJzL21mZC9hc2ljMy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTU4NCw3ICs1ODUsNyBAQAogCXJldHVybiBncGlvY2hpcF9yZW1vdmUoJmFzaWMtPmdwaW8pOwogfQogCi1zdGF0aWMgaW50IGFzaWMzX2Nsa19lbmFibGUoc3RydWN0IGFzaWMzICphc2ljLCBzdHJ1Y3QgYXNpYzNfY2xrICpjbGspCitzdGF0aWMgdm9pZCBhc2ljM19jbGtfZW5hYmxlKHN0cnVjdCBhc2ljMyAqYXNpYywgc3RydWN0IGFzaWMzX2NsayAqY2xrKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIGNkZXg7CkBAIC01OTYsOCArNTk3LDYgQEAKIAkJYXNpYzNfd3JpdGVfcmVnaXN0ZXIoYXNpYywgQVNJQzNfT0ZGU0VUKENMT0NLLCBDREVYKSwgY2RleCk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzaWMtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBhc2ljM19jbGtfZGlzYWJsZShzdHJ1Y3QgYXNpYzMgKmFzaWMsIHN0cnVjdCBhc2ljM19jbGsgKmNsaykKQEAgLTc3OSw2ICs3NzgsOCBAQAogCS5uYW1lICAgICAgICAgID0gInRtaW8tbW1jIiwKIAkuZW5hYmxlICAgICAgICA9IGFzaWMzX21tY19lbmFibGUsCiAJLmRpc2FibGUgICAgICAgPSBhc2ljM19tbWNfZGlzYWJsZSwKKwkuc3VzcGVuZCAgICAgICA9IGFzaWMzX21tY19kaXNhYmxlLAorCS5yZXN1bWUgICAgICAgID0gYXNpYzNfbW1jX2VuYWJsZSwKIAkucGxhdGZvcm1fZGF0YSA9ICZhc2ljM19tbWNfZGF0YSwKIAkucGRhdGFfc2l6ZSAgICA9IHNpemVvZihhc2ljM19tbWNfZGF0YSksCiAJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGFzaWMzX21tY19yZXNvdXJjZXMpLApAQCAtODExLDI0ICs4MTIsNDMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhc2ljM19sZWRzX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSBtZmRfZ2V0X2NlbGwocGRldik7CisJc3RydWN0IGFzaWMzICphc2ljID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCisJd2hpbGUgKGFzaWMzX2dwaW9fZ2V0KCZhc2ljLT5ncGlvLCBBU0lDM19HUElPKEMsIGNlbGwtPmlkKSkgIT0gMCkKKwkJbXNsZWVwKDEpOworCisJYXNpYzNfY2xrX2Rpc2FibGUoYXNpYywgJmFzaWMtPmNsb2Nrc1tjbG9ja19sZWRuW2NlbGwtPmlkXV0pOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgYXNpYzNfY2VsbF9sZWRzW0FTSUMzX05VTV9MRURTXSA9IHsKIAlbMF0gPSB7CiAJCS5uYW1lICAgICAgICAgID0gImxlZHMtYXNpYzMiLAogCQkuaWQgICAgICAgICAgICA9IDAsCiAJCS5lbmFibGUgICAgICAgID0gYXNpYzNfbGVkc19lbmFibGUsCiAJCS5kaXNhYmxlICAgICAgID0gYXNpYzNfbGVkc19kaXNhYmxlLAorCQkuc3VzcGVuZCAgICAgICA9IGFzaWMzX2xlZHNfc3VzcGVuZCwKKwkJLnJlc3VtZSAgICAgICAgPSBhc2ljM19sZWRzX2VuYWJsZSwKIAl9LAogCVsxXSA9IHsKIAkJLm5hbWUgICAgICAgICAgPSAibGVkcy1hc2ljMyIsCiAJCS5pZCAgICAgICAgICAgID0gMSwKIAkJLmVuYWJsZSAgICAgICAgPSBhc2ljM19sZWRzX2VuYWJsZSwKIAkJLmRpc2FibGUgICAgICAgPSBhc2ljM19sZWRzX2Rpc2FibGUsCisJCS5zdXNwZW5kICAgICAgID0gYXNpYzNfbGVkc19zdXNwZW5kLAorCQkucmVzdW1lICAgICAgICA9IGFzaWMzX2xlZHNfZW5hYmxlLAogCX0sCiAJWzJdID0gewogCQkubmFtZSAgICAgICAgICA9ICJsZWRzLWFzaWMzIiwKIAkJLmlkICAgICAgICAgICAgPSAyLAogCQkuZW5hYmxlICAgICAgICA9IGFzaWMzX2xlZHNfZW5hYmxlLAogCQkuZGlzYWJsZSAgICAgICA9IGFzaWMzX2xlZHNfZGlzYWJsZSwKKwkJLnN1c3BlbmQgICAgICAgPSBhc2ljM19sZWRzX3N1c3BlbmQsCisJCS5yZXN1bWUgICAgICAgID0gYXNpYzNfbGVkc19lbmFibGUsCiAJfSwKIH07CiAKQEAgLTk0OSw2ICs5NjksNyBAQAogCQlnb3RvIG91dF91bm1hcDsKIAl9CiAKKwlhc2ljLT5ncGlvLmxhYmVsID0gImFzaWMzIjsKIAlhc2ljLT5ncGlvLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOwogCWFzaWMtPmdwaW8ubmdwaW8gPSBBU0lDM19OVU1fR1BJT1M7CiAJYXNpYy0+Z3Bpby5nZXQgPSBhc2ljM19ncGlvX2dldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RhOTAzeC5jIGIvZHJpdmVycy9tZmQvZGE5MDN4LmMKaW5kZXggMmZhZGJhZS4uMWI3OWMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvZGE5MDN4LmMKKysrIGIvZHJpdmVycy9tZmQvZGE5MDN4LmMKQEAgLTUyMyw3ICs1MjMsNyBAQAogCWNoaXAtPm9wcy0+cmVhZF9ldmVudHMoY2hpcCwgJnRtcCk7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwgZGE5MDN4X2lycV9oYW5kbGVyLAotCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcsCiAJCQkiZGE5MDN4IiwgY2hpcCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RiNTUwMC1wcmNtdS1yZWdzLmggYi9kcml2ZXJzL21mZC9kYjU1MDAtcHJjbXUtcmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YThlOWU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL2RiNTUwMC1wcmNtdS1yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgU1RNaWNyb2VsZWN0cm9uaWNzIDIwMDkKLSAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gU0EgMjAxMAotICoKLSAqIEF1dGhvcjogS3VtYXIgU2FuZ2h2aSA8a3VtYXIuc2FuZ2h2aUBzdGVyaWNzc29uLmNvbT4KLSAqIEF1dGhvcjogU3VuZGFyIEl5ZXIgPHN1bmRhci5peWVyQHN0ZXJpY3Nzb24uY29tPgotICoKLSAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCi0gKgotICogUFJDTSBVbml0IHJlZ2lzdGVycwotICovCi0KLSNpZm5kZWYgX19NQUNIX1BSQ01VX1JFR1NfSAotI2RlZmluZSBfX01BQ0hfUFJDTVVfUkVHU19ICi0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLSNkZWZpbmUgUFJDTV9BUk1fUExMRElWUFMJKF9QUkNNVV9CQVNFICsgMHgxMTgpCi0jZGVmaW5lIFBSQ01fQVJNX1BMTERJVlBTX0FSTV9CUk1fUkFURQkJMHgzZgotI2RlZmluZSBQUkNNX0FSTV9QTExESVZQU19NQVhfTUFTSwkJMHhmCi0KLSNkZWZpbmUgUFJDTV9QTExBUk1fTE9DS1AgICAgICAgKF9QUkNNVV9CQVNFICsgMHgwYTgpCi0jZGVmaW5lIFBSQ01fUExMQVJNX0xPQ0tQX1BSQ01fUExMQVJNX0xPQ0tQMwkweDIKLQotI2RlZmluZSBQUkNNX0FSTV9DSEdDTEtSRVEJKF9QUkNNVV9CQVNFICsgMHgxMTQpCi0jZGVmaW5lIFBSQ01fQVJNX0NIR0NMS1JFUV9QUkNNX0FSTV9DSEdDTEtSRVEJMHgxCi0KLSNkZWZpbmUgUFJDTV9QTExBUk1fRU5BQkxFCShfUFJDTVVfQkFTRSArIDB4OTgpCi0jZGVmaW5lIFBSQ01fUExMQVJNX0VOQUJMRV9QUkNNX1BMTEFSTV9FTkFCTEUJMHgxCi0jZGVmaW5lIFBSQ01fUExMQVJNX0VOQUJMRV9QUkNNX1BMTEFSTV9DT1VOVE9OCTB4MTAwCi0KLSNkZWZpbmUgUFJDTV9BUk1DTEtGSVhfTUdUCShfUFJDTVVfQkFTRSArIDB4MCkKLSNkZWZpbmUgUFJDTV9BOV9SRVNFVE5fQ0xSCShfUFJDTVVfQkFTRSArIDB4MWY0KQotI2RlZmluZSBQUkNNX0E5X1JFU0VUTl9TRVQJKF9QUkNNVV9CQVNFICsgMHgxZjApCi0jZGVmaW5lIFBSQ01fQVJNX0xTX0NMQU1QCShfUFJDTVVfQkFTRSArIDB4MzBjKQotI2RlZmluZSBQUkNNX1NSQU1fQTkJCShfUFJDTVVfQkFTRSArIDB4MzA4KQotCi0vKiBBUk0gV0ZJIFN0YW5kYnkgc2lnbmFsIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBSQ01fQVJNX1dGSV9TVEFOREJZICAgIChfUFJDTVVfQkFTRSArIDB4MTMwKQotI2RlZmluZSBQUkNNX0lPQ1IJCShfUFJDTVVfQkFTRSArIDB4MzEwKQotI2RlZmluZSBQUkNNX0lPQ1JfSU9GT1JDRQkJCTB4MQotCi0vKiBDUFUgbWFpbGJveCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFJDTV9NQk9YX0NQVV9WQUwJKF9QUkNNVV9CQVNFICsgMHgwZmMpCi0jZGVmaW5lIFBSQ01fTUJPWF9DUFVfU0VUCShfUFJDTVVfQkFTRSArIDB4MTAwKQotI2RlZmluZSBQUkNNX01CT1hfQ1BVX0NMUgkoX1BSQ01VX0JBU0UgKyAweDEwNCkKLQotLyogRHVhbCBBOSBjb3JlIGludGVycnVwdCBtYW5hZ2VtZW50IHVuaXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fQTlfTUFTS19SRVEJKF9QUkNNVV9CQVNFICsgMHgzMjgpCi0jZGVmaW5lIFBSQ01fQTlfTUFTS19SRVFfUFJDTV9BOV9NQVNLX1JFUQkweDEKLQotI2RlZmluZSBQUkNNX0E5X01BU0tfQUNLCShfUFJDTVVfQkFTRSArIDB4MzJjKQotI2RlZmluZSBQUkNNX0FSTUlUTVNLMzFUTzAJKF9QUkNNVV9CQVNFICsgMHgxMWMpCi0jZGVmaW5lIFBSQ01fQVJNSVRNU0s2M1RPMzIJKF9QUkNNVV9CQVNFICsgMHgxMjApCi0jZGVmaW5lIFBSQ01fQVJNSVRNU0s5NVRPNjQJKF9QUkNNVV9CQVNFICsgMHgxMjQpCi0jZGVmaW5lIFBSQ01fQVJNSVRNU0sxMjdUTzk2CShfUFJDTVVfQkFTRSArIDB4MTI4KQotI2RlZmluZSBQUkNNX1BPV0VSX1NUQVRFX1ZBTAkoX1BSQ01VX0JBU0UgKyAweDI1QykKLSNkZWZpbmUgUFJDTV9BUk1JVFZBTDMxVE8wCShfUFJDTVVfQkFTRSArIDB4MjYwKQotI2RlZmluZSBQUkNNX0FSTUlUVkFMNjNUTzMyCShfUFJDTVVfQkFTRSArIDB4MjY0KQotI2RlZmluZSBQUkNNX0FSTUlUVkFMOTVUTzY0CShfUFJDTVVfQkFTRSArIDB4MjY4KQotI2RlZmluZSBQUkNNX0FSTUlUVkFMMTI3VE85NgkoX1BSQ01VX0JBU0UgKyAweDI2QykKLQotI2RlZmluZSBQUkNNX0hPU1RBQ0NFU1NfUkVRCShfUFJDTVVfQkFTRSArIDB4MzM0KQotI2RlZmluZSBBUk1fV0FLRVVQX01PREVNCTB4MQotCi0jZGVmaW5lIFBSQ01fQVJNX0lUMV9DTEVBUgkoX1BSQ01VX0JBU0UgKyAweDQ4QykKLSNkZWZpbmUgUFJDTV9BUk1fSVQxX1ZBTAkoX1BSQ01VX0JBU0UgKyAweDQ5NCkKLSNkZWZpbmUgUFJDTV9IT0xEX0VWVAkJKF9QUkNNVV9CQVNFICsgMHgxNzQpCi0KLSNkZWZpbmUgUFJDTV9JVFNUQVRVUzAJCShfUFJDTVVfQkFTRSArIDB4MTQ4KQotI2RlZmluZSBQUkNNX0lUU1RBVFVTMQkJKF9QUkNNVV9CQVNFICsgMHgxNTApCi0jZGVmaW5lIFBSQ01fSVRTVEFUVVMyCQkoX1BSQ01VX0JBU0UgKyAweDE1OCkKLSNkZWZpbmUgUFJDTV9JVFNUQVRVUzMJCShfUFJDTVVfQkFTRSArIDB4MTYwKQotI2RlZmluZSBQUkNNX0lUU1RBVFVTNAkJKF9QUkNNVV9CQVNFICsgMHgxNjgpCi0jZGVmaW5lIFBSQ01fSVRTVEFUVVM1CQkoX1BSQ01VX0JBU0UgKyAweDQ4NCkKLSNkZWZpbmUgUFJDTV9JVENMRUFSNQkJKF9QUkNNVV9CQVNFICsgMHg0ODgpCi0jZGVmaW5lIFBSQ01fQVJNSVRfTUFTS1hQNzBfSVQJKF9QUkNNVV9CQVNFICsgMHgxMDE4KQotCi0vKiBTeXN0ZW0gcmVzZXQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFJDTV9BUEVfU09GVFJTVAkoX1BSQ01VX0JBU0UgKyAweDIyOCkKLQotLyogTGV2ZWwgc2hpZnRlciBhbmQgY2xhbXAgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFJDTV9NTUlQX0xTX0NMQU1QX1NFVCAgICAgKF9QUkNNVV9CQVNFICsgMHg0MjApCi0jZGVmaW5lIFBSQ01fTU1JUF9MU19DTEFNUF9DTFIgICAgIChfUFJDTVVfQkFTRSArIDB4NDI0KQotCi0vKiBQUkNNVSBjbG9jay9QTEwvcmVzZXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fUExMRFNJX0ZSRVEgICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4NTAwKQotI2RlZmluZSBQUkNNX1BMTERTSV9FTkFCTEUgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDUwNCkKLSNkZWZpbmUgUFJDTV9QTExEU0lfTE9DS1AgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg1MDgpCi0jZGVmaW5lIFBSQ01fTENEQ0xLX01HVCAgICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MDQ0KQotI2RlZmluZSBQUkNNX01DREVDTEtfTUdUICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDA2NCkKLSNkZWZpbmUgUFJDTV9IRE1JQ0xLX01HVCAgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgwNTgpCi0jZGVmaW5lIFBSQ01fVFZDTEtfTUdUICAgICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MDdjKQotI2RlZmluZSBQUkNNX0RTSV9QTExPVVRfU0VMICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDUzMCkKLSNkZWZpbmUgUFJDTV9EU0lUVkNMS19ESVYgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg1MkMpCi0jZGVmaW5lIFBSQ01fUExMRFNJX0xPQ0tQICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4NTA4KQotI2RlZmluZSBQUkNNX0FQRV9SRVNFVE5fU0VUICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDFFNCkKLSNkZWZpbmUgUFJDTV9BUEVfUkVTRVROX0NMUiAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgxRTgpCi0jZGVmaW5lIFBSQ01fQ0xLT0NSCQkgICAoX1BSQ01VX0JBU0UgKyAweDFDQykKLQotLyogZVBPRCBhbmQgbWVtb3J5IHBvd2VyIHNpZ25hbCBjb250cm9sIHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUkNNX0VQT0RfQ19TRVQgICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDQxMCkKLSNkZWZpbmUgUFJDTV9TUkFNX0xTX1NMRUVQICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgzMDQpCi0KLS8qIERlYnVnIHBvd2VyIGNvbnRyb2wgdW5pdCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFJDTV9QT1dFUl9TVEFURV9TRVQgICAgICAgKF9QUkNNVV9CQVNFICsgMHgyNTQpCi0KLS8qIE1pc2NlbGxhbmVvdXMgdW5pdCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFJDTV9EU0lfU1dfUkVTRVQgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgzMjQpCi0jZGVmaW5lIFBSQ01fR1BJT0NSICAgICAgICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MTM4KQotI2RlZmluZSBQUkNNX0dQSU9DUl9EQkdfU1RNX01PRF9DTUQxICAgICAgICAgICAgMHg4MDAKLSNkZWZpbmUgUFJDTV9HUElPQ1JfREJHX1VBUlRNT0RfQ01EMCAgICAgICAgICAgIDB4MQotCi0KLSNlbmRpZiAvKiBfX01BQ0hfUFJDTVVfX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZGI1NTAwLXByY211LmMgYi9kcml2ZXJzL21mZC9kYjU1MDAtcHJjbXUuYwppbmRleCA5ZGJiM2NhLi5iYjExNWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9kYjU1MDAtcHJjbXUuYworKysgYi9kcml2ZXJzL21mZC9kYjU1MDAtcHJjbXUuYwpAQCAtMjAsMTEgKzIwLDExIEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9kYjU1MDAtcHJjbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvZGJ4NTAwLXByY211Lmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvZGI1NTAwLXJlZ3MuaD4KLSNpbmNsdWRlICJkYjU1MDAtcHJjbXUtcmVncy5oIgorI2luY2x1ZGUgImRieDUwMC1wcmNtdS1yZWdzLmgiCiAKICNkZWZpbmUgX1BSQ01fTUJfSEVBREVSICh0Y2RtX2Jhc2UgKyAweEZFOCkKICNkZWZpbmUgUFJDTV9SRVFfTUIwX0hFQURFUiAoX1BSQ01fTUJfSEVBREVSICsgMHgwKQpAQCAtMTA5LDE1ICsxMDksMTggQEAKICNkZWZpbmUgUFJDTVVfRFNJX0NMT0NLX1NFVFRJTkcJCQkweDAwMDAwMTI4CiAvKiBUVkNMS19NR1QgUExMU1c9MDAxIChQTExTT0MwKSBQTExESVY9MHgxMywgPSAxOS4wNSBNSFogKi8KICNkZWZpbmUgUFJDTVVfRFNJX0xQX0NMT0NLX1NFVFRJTkcJCTB4MDAwMDAxMzUKLSNkZWZpbmUgUFJDTVVfUExMRFNJX0ZSRVFfU0VUVElORwkJMHgwMDA0MDEzQworI2RlZmluZSBQUkNNVV9QTExEU0lfRlJFUV9TRVRUSU5HCQkweDAwMDIwMTIxCiAjZGVmaW5lIFBSQ01VX0RTSV9QTExPVVRfU0VMX1NFVFRJTkcJCTB4MDAwMDAwMDIKLSNkZWZpbmUgUFJDTVVfRU5BQkxFX0VTQ0FQRV9DTE9DS19ESVYJCTB4MDMwMDAxMDEKKyNkZWZpbmUgUFJDTVVfRU5BQkxFX0VTQ0FQRV9DTE9DS19ESVYJCTB4MDMwMDAyMDEKICNkZWZpbmUgUFJDTVVfRElTQUJMRV9FU0NBUEVfQ0xPQ0tfRElWCQkweDAwMDAwMTAxCiAKICNkZWZpbmUgUFJDTVVfRU5BQkxFX1BMTERTSQkJCTB4MDAwMDAwMDEKICNkZWZpbmUgUFJDTVVfRElTQUJMRV9QTExEU0kJCQkweDAwMDAwMDAwCiAKICNkZWZpbmUgUFJDTVVfRFNJX1JFU0VUX1NXCQkJMHgwMDAwMDAwMworI2RlZmluZSBQUkNNVV9SRVNPVVROMF9QSU4JCQkweDAwMDAwMDAxCisjZGVmaW5lIFBSQ01VX1JFU09VVE4xX1BJTgkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUFJDTVVfUkVTT1VUTjJfUElOCQkJMHgwMDAwMDAwNAogCiAjZGVmaW5lIFBSQ01VX1BMTERTSV9MT0NLUF9MT0NLRUQJCTB4MwogCkBAIC0zMTUsMzEgKzMxOCwzMSBAQAogCQlyID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KLQl3cml0ZWwoTUJPWF9CSVQoMCksIFBSQ01fQVJNX0lUMV9DTEVBUik7CisJd3JpdGVsKE1CT1hfQklUKDApLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGJvb2wgcmVhZF9tYWlsYm94XzEodm9pZCkKIHsKLQl3cml0ZWwoTUJPWF9CSVQoMSksIFBSQ01fQVJNX0lUMV9DTEVBUik7CisJd3JpdGVsKE1CT1hfQklUKDEpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBib29sIHJlYWRfbWFpbGJveF8yKHZvaWQpCiB7Ci0Jd3JpdGVsKE1CT1hfQklUKDIpLCBQUkNNX0FSTV9JVDFfQ0xFQVIpOworCXdyaXRlbChNQk9YX0JJVCgyKSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgYm9vbCByZWFkX21haWxib3hfMyh2b2lkKQogewotCXdyaXRlbChNQk9YX0JJVCgzKSwgUFJDTV9BUk1fSVQxX0NMRUFSKTsKKwl3cml0ZWwoTUJPWF9CSVQoMyksIFBSQ01fQVJNX0lUMV9DTFIpOwogCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGJvb2wgcmVhZF9tYWlsYm94XzQodm9pZCkKIHsKLQl3cml0ZWwoTUJPWF9CSVQoNCksIFBSQ01fQVJNX0lUMV9DTEVBUik7CisJd3JpdGVsKE1CT1hfQklUKDQpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTM2MCwxOSArMzYzLDE5IEBACiAJCXByaW50X3Vua25vd25faGVhZGVyX3dhcm5pbmcoNSwgaGVhZGVyKTsKIAkJYnJlYWs7CiAJfQotCXdyaXRlbChNQk9YX0JJVCg1KSwgUFJDTV9BUk1fSVQxX0NMRUFSKTsKKwl3cml0ZWwoTUJPWF9CSVQoNSksIFBSQ01fQVJNX0lUMV9DTFIpOwogCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGJvb2wgcmVhZF9tYWlsYm94XzYodm9pZCkKIHsKLQl3cml0ZWwoTUJPWF9CSVQoNiksIFBSQ01fQVJNX0lUMV9DTEVBUik7CisJd3JpdGVsKE1CT1hfQklUKDYpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBib29sIHJlYWRfbWFpbGJveF83KHZvaWQpCiB7Ci0Jd3JpdGVsKE1CT1hfQklUKDcpLCBQUkNNX0FSTV9JVDFfQ0xFQVIpOworCXdyaXRlbChNQk9YX0JJVCg3KSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC00MzQsNyArNDM3LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBDbGVhbiB1cCB0aGUgbWFpbGJveCBpbnRlcnJ1cHRzIGFmdGVyIHByZS1rZXJuZWwgY29kZS4gKi8KLQl3cml0ZWwoQUxMX01CT1hfQklUUywgUFJDTV9BUk1fSVQxX0NMRUFSKTsKKwl3cml0ZWwoQUxMX01CT1hfQklUUywgUFJDTV9BUk1fSVQxX0NMUik7CiAKIAlyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoSVJRX0RCNTUwMF9QUkNNVTEsIHByY211X2lycV9oYW5kbGVyLAogCQlwcmNtdV9pcnFfdGhyZWFkX2ZuLCAwLCAicHJjbXUiLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RiODUwMC1wcmNtdS1yZWdzLmggYi9kcml2ZXJzL21mZC9kYjg1MDAtcHJjbXUtcmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJmMDRkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL2RiODUwMC1wcmNtdS1yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgU1RNaWNyb2VsZWN0cm9uaWNzIDIwMDkKLSAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gU0EgMjAxMAotICoKLSAqIEF1dGhvcjogS3VtYXIgU2FuZ2h2aSA8a3VtYXIuc2FuZ2h2aUBzdGVyaWNzc29uLmNvbT4KLSAqIEF1dGhvcjogU3VuZGFyIEl5ZXIgPHN1bmRhci5peWVyQHN0ZXJpY3Nzb24uY29tPgotICoKLSAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCi0gKgotICogUFJDTSBVbml0IHJlZ2lzdGVycwotICovCi0jaWZuZGVmIF9fREI4NTAwX1BSQ01VX1JFR1NfSAotI2RlZmluZSBfX0RCODUwMF9QUkNNVV9SRUdTX0gKLQotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQotI2RlZmluZSBCSVRTKF9zdGFydCwgX2VuZCkgKChCSVQoX2VuZCkgLSBCSVQoX3N0YXJ0KSkgKyBCSVQoX2VuZCkpCi0KLSNkZWZpbmUgUFJDTV9BUk1fUExMRElWUFMgMHgxMTgKLSNkZWZpbmUgUFJDTV9BUk1fUExMRElWUFNfQVJNX0JSTV9SQVRFCUJJVFMoMCwgNSkKLSNkZWZpbmUgUFJDTV9BUk1fUExMRElWUFNfTUFYX01BU0sJMHhGCi0KLSNkZWZpbmUgUFJDTV9QTExBUk1fTE9DS1AgMHgwQTgKLSNkZWZpbmUgUFJDTV9QTExBUk1fTE9DS1BfUFJDTV9QTExBUk1fTE9DS1AzIEJJVCgxKQotCi0jZGVmaW5lIFBSQ01fQVJNX0NIR0NMS1JFUSAweDExNAotI2RlZmluZSBQUkNNX0FSTV9DSEdDTEtSRVFfUFJDTV9BUk1fQ0hHQ0xLUkVRIEJJVCgwKQotCi0jZGVmaW5lIFBSQ01fUExMQVJNX0VOQUJMRSAweDk4Ci0jZGVmaW5lIFBSQ01fUExMQVJNX0VOQUJMRV9QUkNNX1BMTEFSTV9FTkFCTEUJQklUKDApCi0jZGVmaW5lIFBSQ01fUExMQVJNX0VOQUJMRV9QUkNNX1BMTEFSTV9DT1VOVE9OCUJJVCg4KQotCi0jZGVmaW5lIFBSQ01fQVJNQ0xLRklYX01HVAkweDAKLSNkZWZpbmUgUFJDTV9BOV9SRVNFVE5fQ0xSCTB4MWY0Ci0jZGVmaW5lIFBSQ01fQTlfUkVTRVROX1NFVAkweDFmMAotI2RlZmluZSBQUkNNX0FSTV9MU19DTEFNUAkweDMwQwotI2RlZmluZSBQUkNNX1NSQU1fQTkJCTB4MzA4Ci0KLS8qIEFSTSBXRkkgU3RhbmRieSBzaWduYWwgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFJDTV9BUk1fV0ZJX1NUQU5EQlkJMHgxMzAKLSNkZWZpbmUgUFJDTV9JT0NSCQkweDMxMAotI2RlZmluZSBQUkNNX0lPQ1JfSU9GT1JDRSBCSVQoMCkKLQotLyogQ1BVIG1haWxib3ggcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fTUJPWF9DUFVfVkFMIDB4MEZDCi0jZGVmaW5lIFBSQ01fTUJPWF9DUFVfU0VUIDB4MTAwCi0KLS8qIER1YWwgQTkgY29yZSBpbnRlcnJ1cHQgbWFuYWdlbWVudCB1bml0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUkNNX0E5X01BU0tfUkVRIDB4MzI4Ci0jZGVmaW5lIFBSQ01fQTlfTUFTS19SRVFfUFJDTV9BOV9NQVNLX1JFUSBCSVQoMCkKLQotI2RlZmluZSBQUkNNX0E5X01BU0tfQUNLCTB4MzJDCi0jZGVmaW5lIFBSQ01fQVJNSVRNU0szMVRPMAkweDExQwotI2RlZmluZSBQUkNNX0FSTUlUTVNLNjNUTzMyCTB4MTIwCi0jZGVmaW5lIFBSQ01fQVJNSVRNU0s5NVRPNjQJMHgxMjQKLSNkZWZpbmUgUFJDTV9BUk1JVE1TSzEyN1RPOTYJMHgxMjgKLSNkZWZpbmUgUFJDTV9QT1dFUl9TVEFURV9WQUwJMHgyNUMKLSNkZWZpbmUgUFJDTV9BUk1JVFZBTDMxVE8wCTB4MjYwCi0jZGVmaW5lIFBSQ01fQVJNSVRWQUw2M1RPMzIJMHgyNjQKLSNkZWZpbmUgUFJDTV9BUk1JVFZBTDk1VE82NAkweDI2OAotI2RlZmluZSBQUkNNX0FSTUlUVkFMMTI3VE85NgkweDI2QwotCi0jZGVmaW5lIFBSQ01fSE9TVEFDQ0VTU19SRVEgMHgzMzQKLSNkZWZpbmUgUFJDTV9IT1NUQUNDRVNTX1JFUV9IT1NUQUNDRVNTX1JFUSBCSVQoMCkKLQotI2RlZmluZSBQUkNNX0FSTV9JVDFfQ0xSIDB4NDhDCi0jZGVmaW5lIFBSQ01fQVJNX0lUMV9WQUwgMHg0OTQKLQotI2RlZmluZSBQUkNNX0lUU1RBVFVTMAkJMHgxNDgKLSNkZWZpbmUgUFJDTV9JVFNUQVRVUzEJCTB4MTUwCi0jZGVmaW5lIFBSQ01fSVRTVEFUVVMyCQkweDE1OAotI2RlZmluZSBQUkNNX0lUU1RBVFVTMwkJMHgxNjAKLSNkZWZpbmUgUFJDTV9JVFNUQVRVUzQJCTB4MTY4Ci0jZGVmaW5lIFBSQ01fSVRTVEFUVVM1CQkweDQ4NAotI2RlZmluZSBQUkNNX0lUQ0xFQVI1CQkweDQ4OAotI2RlZmluZSBQUkNNX0FSTUlUX01BU0tYUDcwX0lUCTB4MTAxOAotCi0vKiBTeXN0ZW0gcmVzZXQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFJDTV9BUEVfU09GVFJTVCAweDIyOAotCi0vKiBMZXZlbCBzaGlmdGVyIGFuZCBjbGFtcCBjb250cm9sIHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUkNNX01NSVBfTFNfQ0xBTVBfU0VUIDB4NDIwCi0jZGVmaW5lIFBSQ01fTU1JUF9MU19DTEFNUF9DTFIgMHg0MjQKLQotLyogUFJDTVUgSFcgc2VtYXBob3JlICovCi0jZGVmaW5lIFBSQ01fU0VNIDB4NDAwCi0jZGVmaW5lIFBSQ01fU0VNX1BSQ01fU0VNIEJJVCgwKQotCi0vKiBQUkNNVSBjbG9jay9QTEwvcmVzZXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fUExMRFNJX0ZSRVEJMHg1MDAKLSNkZWZpbmUgUFJDTV9QTExEU0lfRU5BQkxFCTB4NTA0Ci0jZGVmaW5lIFBSQ01fUExMRFNJX0xPQ0tQCTB4NTA4Ci0jZGVmaW5lIFBSQ01fRFNJX1BMTE9VVF9TRUwJMHg1MzAKLSNkZWZpbmUgUFJDTV9EU0lUVkNMS19ESVYJMHg1MkMKLSNkZWZpbmUgUFJDTV9BUEVfUkVTRVROX1NFVAkweDFFNAotI2RlZmluZSBQUkNNX0FQRV9SRVNFVE5fQ0xSCTB4MUU4Ci0KLSNkZWZpbmUgUFJDTV9UQ1IJCTB4MUM4Ci0jZGVmaW5lIFBSQ01fVENSX1RFTlNFTF9NQVNLCUJJVFMoMCwgNykKLSNkZWZpbmUgUFJDTV9UQ1JfU1RPUF9USU1FUlMJQklUKDE2KQotI2RlZmluZSBQUkNNX1RDUl9ET1pFX01PREUJQklUKDE3KQotCi0jZGVmaW5lIFBSQ01fQ0xLT0NSCQkJMHgxQ0MKLSNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT0RJVjBfU0hJRlQJMAotI2RlZmluZSBQUkNNX0NMS09DUl9DTEtPRElWMF9NQVNLCUJJVFMoMCwgNSkKLSNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1NFTDBfU0hJRlQJNgotI2RlZmluZSBQUkNNX0NMS09DUl9DTEtPU0VMMF9NQVNLCUJJVFMoNiwgOCkKLSNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT0RJVjFfU0hJRlQJMTYKLSNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT0RJVjFfTUFTSwlCSVRTKDE2LCAyMSkKLSNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1NFTDFfU0hJRlQJMjIKLSNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1NFTDFfTUFTSwlCSVRTKDIyLCAyNCkKLSNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLMVRZUEUJCUJJVCgyOCkKLQotI2RlZmluZSBQUkNNX1NHQUNMS19NR1QJCTB4MDE0Ci0jZGVmaW5lIFBSQ01fVUFSVENMS19NR1QJMHgwMTgKLSNkZWZpbmUgUFJDTV9NU1AwMkNMS19NR1QJMHgwMUMKLSNkZWZpbmUgUFJDTV9NU1AxQ0xLX01HVAkweDI4OAotI2RlZmluZSBQUkNNX0kyQ0NMS19NR1QJCTB4MDIwCi0jZGVmaW5lIFBSQ01fU0RNTUNDTEtfTUdUCTB4MDI0Ci0jZGVmaW5lIFBSQ01fU0xJTUNMS19NR1QJMHgwMjgKLSNkZWZpbmUgUFJDTV9QRVIxQ0xLX01HVAkweDAyQwotI2RlZmluZSBQUkNNX1BFUjJDTEtfTUdUCTB4MDMwCi0jZGVmaW5lIFBSQ01fUEVSM0NMS19NR1QJMHgwMzQKLSNkZWZpbmUgUFJDTV9QRVI1Q0xLX01HVAkweDAzOAotI2RlZmluZSBQUkNNX1BFUjZDTEtfTUdUCTB4MDNDCi0jZGVmaW5lIFBSQ01fUEVSN0NMS19NR1QJMHgwNDAKLSNkZWZpbmUgUFJDTV9MQ0RDTEtfTUdUCQkweDA0NAotI2RlZmluZSBQUkNNX0JNTENMS19NR1QJCTB4MDRDCi0jZGVmaW5lIFBSQ01fSFNJVFhDTEtfTUdUCTB4MDUwCi0jZGVmaW5lIFBSQ01fSFNJUlhDTEtfTUdUCTB4MDU0Ci0jZGVmaW5lIFBSQ01fSERNSUNMS19NR1QJMHgwNTgKLSNkZWZpbmUgUFJDTV9BUEVBVENMS19NR1QJMHgwNUMKLSNkZWZpbmUgUFJDTV9BUEVUUkFDRUNMS19NR1QJMHgwNjAKLSNkZWZpbmUgUFJDTV9NQ0RFQ0xLX01HVAkweDA2NAotI2RlZmluZSBQUkNNX0lQSTJDQ0xLX01HVAkweDA2OAotI2RlZmluZSBQUkNNX0RTSUFMVENMS19NR1QJMHgwNkMKLSNkZWZpbmUgUFJDTV9ETUFDTEtfTUdUCQkweDA3NAotI2RlZmluZSBQUkNNX0IyUjJDTEtfTUdUCTB4MDc4Ci0jZGVmaW5lIFBSQ01fVFZDTEtfTUdUCQkweDA3QwotI2RlZmluZSBQUkNNX1VOSVBST0NMS19NR1QJMHgyNzgKLSNkZWZpbmUgUFJDTV9TU1BDTEtfTUdUCQkweDI4MAotI2RlZmluZSBQUkNNX1JOR0NMS19NR1QJCTB4Mjg0Ci0jZGVmaW5lIFBSQ01fVUlDQ0NMS19NR1QJMHgyN0MKLQotI2RlZmluZSBQUkNNX0NMS19NR1RfQ0xLUExMRElWX01BU0sJQklUUygwLCA0KQotI2RlZmluZSBQUkNNX0NMS19NR1RfQ0xLUExMU1dfTUFTSwlCSVRTKDUsIDcpCi0jZGVmaW5lIFBSQ01fQ0xLX01HVF9DTEtFTgkJQklUKDgpCi0KLS8qIGVQT0QgYW5kIG1lbW9yeSBwb3dlciBzaWduYWwgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFJDTV9FUE9EX0NfU0VUCQkweDQxMAotI2RlZmluZSBQUkNNX1NSQU1fTFNfU0xFRVAJMHgzMDQKLQotLyogRGVidWcgcG93ZXIgY29udHJvbCB1bml0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUkNNX1BPV0VSX1NUQVRFX1NFVCAweDI1NAotCi0vKiBNaXNjZWxsYW5lb3VzIHVuaXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fRFNJX1NXX1JFU0VUIDB4MzI0Ci0jZGVmaW5lIFBSQ01fR1BJT0NSCQkweDEzOAotCi0vKiBHUElPQ1IgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFJDTV9HUElPQ1JfU1BJMl9TRUxFQ1QgQklUKDIzKQotCi0jZGVmaW5lIFBSQ01fRERSX1NVQlNZU19BUEVfTUlOQlcgIDB4NDM4Ci0KLSNlbmRpZiAvKiBfX0RCODUwMF9QUkNNVV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RiODUwMC1wcmNtdS5jIGIvZHJpdmVycy9tZmQvZGI4NTAwLXByY211LmMKaW5kZXggMDJhMTVkNy4uYTI1YWI5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvZGI4NTAwLXByY211LmMKKysrIGIvZHJpdmVycy9tZmQvZGI4NTAwLXByY211LmMKQEAgLTI3LDE0ICsyNywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9kYjg1MDAtcHJjbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvZGJ4NTAwLXByY211Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvZGI4NTAwLXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL2lkLmg+Ci0jaW5jbHVkZSAiZGI4NTAwLXByY211LXJlZ3MuaCIKKyNpbmNsdWRlICJkYng1MDAtcHJjbXUtcmVncy5oIgogCiAvKiBPZmZzZXQgZm9yIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIHdpdGhpbiB0aGUgVENQTSAqLwogI2RlZmluZSBQUkNNVV9GV19WRVJTSU9OX09GRlNFVCAweEE0CkBAIC0xMzEsMTIgKzEzMSwxNCBAQAogI2RlZmluZSBNQjFIX1JFUVVFU1RfQVBFX09QUF8xMDBfVk9MVCAweDMKICNkZWZpbmUgTUIxSF9SRUxFQVNFX0FQRV9PUFBfMTAwX1ZPTFQgMHg0CiAjZGVmaW5lIE1CMUhfUkVMRUFTRV9VU0JfV0FLRVVQIDB4NQorI2RlZmluZSBNQjFIX1BMTF9PTl9PRkYgMHg2CiAKIC8qIE1haWxib3ggMSBSZXF1ZXN0cyAqLwogI2RlZmluZSBQUkNNX1JFUV9NQjFfQVJNX09QUAkJCShQUkNNX1JFUV9NQjEgKyAweDApCiAjZGVmaW5lIFBSQ01fUkVRX01CMV9BUEVfT1BQCQkJKFBSQ01fUkVRX01CMSArIDB4MSkKLSNkZWZpbmUgUFJDTV9SRVFfTUIxX0FQRV9PUFBfMTAwX1JFU1RPUkUJKFBSQ01fUkVRX01CMSArIDB4NCkKLSNkZWZpbmUgUFJDTV9SRVFfTUIxX0FSTV9PUFBfMTAwX1JFU1RPUkUJKFBSQ01fUkVRX01CMSArIDB4OCkKKyNkZWZpbmUgUFJDTV9SRVFfTUIxX1BMTF9PTl9PRkYJCQkoUFJDTV9SRVFfTUIxICsgMHg0KQorI2RlZmluZSBQTExfU09DMV9PRkYJMHg0CisjZGVmaW5lIFBMTF9TT0MxX09OCTB4OAogCiAvKiBNYWlsYm94IDEgQUNLcyAqLwogI2RlZmluZSBQUkNNX0FDS19NQjFfQ1VSUkVOVF9BUk1fT1BQCShQUkNNX0FDS19NQjEgKyAweDApCkBAIC0xODQsNiArMTg2LDExIEBACiAjZGVmaW5lIE1CNEhfSE9URE9HCTB4MTIKICNkZWZpbmUgTUI0SF9IT1RNT04JMHgxMwogI2RlZmluZSBNQjRIX0hPVF9QRVJJT0QJMHgxNAorI2RlZmluZSBNQjRIX0E5V0RPR19DT05GIDB4MTYKKyNkZWZpbmUgTUI0SF9BOVdET0dfRU4gICAweDE3CisjZGVmaW5lIE1CNEhfQTlXRE9HX0RJUyAgMHgxOAorI2RlZmluZSBNQjRIX0E5V0RPR19MT0FEIDB4MTkKKyNkZWZpbmUgTUI0SF9BOVdET0dfS0lDSyAweDIwCiAKIC8qIE1haWxib3ggNCBSZXF1ZXN0cyAqLwogI2RlZmluZSBQUkNNX1JFUV9NQjRfRERSX1NUX0FQX1NMRUVQX0lETEUJKFBSQ01fUkVRX01CNCArIDB4MCkKQEAgLTE5Niw2ICsyMDMsMTMgQEAKICNkZWZpbmUgUFJDTV9SRVFfTUI0X0hPVF9QRVJJT0QJCQkoUFJDTV9SRVFfTUI0ICsgMHgwKQogI2RlZmluZSBIT1RNT05fQ09ORklHX0xPVwkJCUJJVCgwKQogI2RlZmluZSBIT1RNT05fQ09ORklHX0hJR0gJCQlCSVQoMSkKKyNkZWZpbmUgUFJDTV9SRVFfTUI0X0E5V0RPR18wCQkJKFBSQ01fUkVRX01CNCArIDB4MCkKKyNkZWZpbmUgUFJDTV9SRVFfTUI0X0E5V0RPR18xCQkJKFBSQ01fUkVRX01CNCArIDB4MSkKKyNkZWZpbmUgUFJDTV9SRVFfTUI0X0E5V0RPR18yCQkJKFBSQ01fUkVRX01CNCArIDB4MikKKyNkZWZpbmUgUFJDTV9SRVFfTUI0X0E5V0RPR18zCQkJKFBSQ01fUkVRX01CNCArIDB4MykKKyNkZWZpbmUgQTlXRE9HX0FVVE9fT0ZGX0VOCQkJQklUKDcpCisjZGVmaW5lIEE5V0RPR19BVVRPX09GRl9ESVMJCQkwCisjZGVmaW5lIEE5V0RPR19JRF9NQVNLCQkJCTB4ZgogCiAvKiBNYWlsYm94IDUgUmVxdWVzdHMgKi8KICNkZWZpbmUgUFJDTV9SRVFfTUI1X0kyQ19TTEFWRV9PUAkoUFJDTV9SRVFfTUI1ICsgMHgwKQpAQCAtNDEyLDcgKzQyNiw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xrX21ndF9sb2NrKTsKIAotI2RlZmluZSBDTEtfTUdUX0VOVFJZKF9uYW1lKVtQUkNNVV8jI19uYW1lXSA9IHsgKFBSQ01fIyNfbmFtZSMjX01HVCksIDAgfQorI2RlZmluZSBDTEtfTUdUX0VOVFJZKF9uYW1lKVtQUkNNVV8jI19uYW1lXSA9IHsgKFBSQ01fIyNfbmFtZSMjX01HVF9PRkYpLCAwIH0KIHN0cnVjdCBjbGtfbWd0IGNsa19tZ3RbUFJDTVVfTlVNX1JFR19DTE9DS1NdID0gewogCUNMS19NR1RfRU5UUlkoU0dBQ0xLKSwKIAlDTEtfTUdUX0VOVFJZKFVBUlRDTEspLApAQCAtNDQ1LDYgKzQ1OSwzNSBAQAogCUNMS19NR1RfRU5UUlkoVUlDQ0NMSyksCiB9OwogCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqaHdhY2NfcmVndWxhdG9yW05VTV9IV19BQ0NdOworc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKmh3YWNjX3JldF9yZWd1bGF0b3JbTlVNX0hXX0FDQ107CisKK3N0YXRpYyBib29sIGh3YWNjX2VuYWJsZWRbTlVNX0hXX0FDQ107CitzdGF0aWMgYm9vbCBod2FjY19yZXRfZW5hYmxlZFtOVU1fSFdfQUNDXTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmh3YWNjX3JlZ3VsYXRvcl9uYW1lW05VTV9IV19BQ0NdID0geworCVtIV19BQ0NfU1ZBTU1EU1BdCT0gImh3YWNjLXN2YS1tbWRzcCIsCisJW0hXX0FDQ19TVkFQSVBFXQk9ICJod2FjYy1zdmEtcGlwZSIsCisJW0hXX0FDQ19TSUFNTURTUF0JPSAiaHdhY2Mtc2lhLW1tZHNwIiwKKwlbSFdfQUNDX1NJQVBJUEVdCT0gImh3YWNjLXNpYS1waXBlIiwKKwlbSFdfQUNDX1NHQV0JCT0gImh3YWNjLXNnYSIsCisJW0hXX0FDQ19CMlIyXQkJPSAiaHdhY2MtYjJyMiIsCisJW0hXX0FDQ19NQ0RFXQkJPSAiaHdhY2MtbWNkZSIsCisJW0hXX0FDQ19FU1JBTTFdCQk9ICJod2FjYy1lc3JhbTEiLAorCVtIV19BQ0NfRVNSQU0yXQkJPSAiaHdhY2MtZXNyYW0yIiwKKwlbSFdfQUNDX0VTUkFNM10JCT0gImh3YWNjLWVzcmFtMyIsCisJW0hXX0FDQ19FU1JBTTRdCQk9ICJod2FjYy1lc3JhbTQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmh3YWNjX3JldF9yZWd1bGF0b3JfbmFtZVtOVU1fSFdfQUNDXSA9IHsKKwlbSFdfQUNDX1NWQU1NRFNQXQk9ICJod2FjYy1zdmEtbW1kc3AtcmV0IiwKKwlbSFdfQUNDX1NJQU1NRFNQXQk9ICJod2FjYy1zaWEtbW1kc3AtcmV0IiwKKwlbSFdfQUNDX0VTUkFNMV0JCT0gImh3YWNjLWVzcmFtMS1yZXQiLAorCVtIV19BQ0NfRVNSQU0yXQkJPSAiaHdhY2MtZXNyYW0yLXJldCIsCisJW0hXX0FDQ19FU1JBTTNdCQk9ICJod2FjYy1lc3JhbTMtcmV0IiwKKwlbSFdfQUNDX0VTUkFNNF0JCT0gImh3YWNjLWVzcmFtNC1yZXQiLAorfTsKKwogLyoKICogVXNlZCBieSBNQ0RFIHRvIHNldHVwIGFsbCBuZWNlc3NhcnkgUFJDTVUgcmVnaXN0ZXJzCiAqLwpAQCAtNDkzLDU1ICs1MzYsNTEgQEAKIH0gcHJjbXVfdmVyc2lvbjsKIAogCi1pbnQgcHJjbXVfZW5hYmxlX2RzaXBsbCh2b2lkKQoraW50IGRiODUwMF9wcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgaW50IHBsbGRzaWZyZXE7CiAKIAkvKiBDbGVhciBEU0lQTExfUkVTRVROICovCi0Jd3JpdGVsKFBSQ01VX1JFU0VUX0RTSVBMTCwgKF9QUkNNVV9CQVNFICsgUFJDTV9BUEVfUkVTRVROX0NMUikpOworCXdyaXRlbChQUkNNVV9SRVNFVF9EU0lQTEwsIFBSQ01fQVBFX1JFU0VUTl9DTFIpOwogCS8qIFVuY2xhbXAgRFNJUExMIGluL291dCAqLwotCXdyaXRlbChQUkNNVV9VTkNMQU1QX0RTSVBMTCwgKF9QUkNNVV9CQVNFICsgUFJDTV9NTUlQX0xTX0NMQU1QX0NMUikpOworCXdyaXRlbChQUkNNVV9VTkNMQU1QX0RTSVBMTCwgUFJDTV9NTUlQX0xTX0NMQU1QX0NMUik7CiAKIAlpZiAocHJjbXVfaXNfdTg0MDAoKSkKIAkJcGxsZHNpZnJlcSA9IFBSQ01VX1BMTERTSV9GUkVRX1NFVFRJTkdfVTg0MDA7CiAJZWxzZQogCQlwbGxkc2lmcmVxID0gUFJDTVVfUExMRFNJX0ZSRVFfU0VUVElORzsKIAkvKiBTZXQgRFNJIFBMTCBGUkVRICovCi0Jd3JpdGVsKHBsbGRzaWZyZXEsIChfUFJDTVVfQkFTRSArIFBSQ01fUExMRFNJX0ZSRVEpKTsKLQl3cml0ZWwoUFJDTVVfRFNJX1BMTE9VVF9TRUxfU0VUVElORywKLQkJKF9QUkNNVV9CQVNFICsgUFJDTV9EU0lfUExMT1VUX1NFTCkpOworCXdyaXRlbChwbGxkc2lmcmVxLCBQUkNNX1BMTERTSV9GUkVRKTsKKwl3cml0ZWwoUFJDTVVfRFNJX1BMTE9VVF9TRUxfU0VUVElORywgUFJDTV9EU0lfUExMT1VUX1NFTCk7CiAJLyogRW5hYmxlIEVzY2FwZSBjbG9ja3MgKi8KLQl3cml0ZWwoUFJDTVVfRU5BQkxFX0VTQ0FQRV9DTE9DS19ESVYsCi0JCQkJCShfUFJDTVVfQkFTRSArIFBSQ01fRFNJVFZDTEtfRElWKSk7CisJd3JpdGVsKFBSQ01VX0VOQUJMRV9FU0NBUEVfQ0xPQ0tfRElWLCBQUkNNX0RTSVRWQ0xLX0RJVik7CiAKIAkvKiBTdGFydCBEU0kgUExMICovCi0Jd3JpdGVsKFBSQ01VX0VOQUJMRV9QTExEU0ksIChfUFJDTVVfQkFTRSArIFBSQ01fUExMRFNJX0VOQUJMRSkpOworCXdyaXRlbChQUkNNVV9FTkFCTEVfUExMRFNJLCBQUkNNX1BMTERTSV9FTkFCTEUpOwogCS8qIFJlc2V0IERTSSBQTEwgKi8KLQl3cml0ZWwoUFJDTVVfRFNJX1JFU0VUX1NXLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0RTSV9TV19SRVNFVCkpOworCXdyaXRlbChQUkNNVV9EU0lfUkVTRVRfU1csIFBSQ01fRFNJX1NXX1JFU0VUKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlpZiAoKHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9QTExEU0lfTE9DS1ApICYKLQkJCVBSQ01VX1BMTERTSV9MT0NLUF9MT0NLRUQpCisJCWlmICgocmVhZGwoUFJDTV9QTExEU0lfTE9DS1ApICYgUFJDTVVfUExMRFNJX0xPQ0tQX0xPQ0tFRCkKIAkJCQkJPT0gUFJDTVVfUExMRFNJX0xPQ0tQX0xPQ0tFRCkKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMTAwKTsKIAl9CiAJLyogU2V0IERTSVBMTF9SRVNFVE4gKi8KLQl3cml0ZWwoUFJDTVVfUkVTRVRfRFNJUExMLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0FQRV9SRVNFVE5fU0VUKSk7CisJd3JpdGVsKFBSQ01VX1JFU0VUX0RTSVBMTCwgUFJDTV9BUEVfUkVTRVROX1NFVCk7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBwcmNtdV9kaXNhYmxlX2RzaXBsbCh2b2lkKQoraW50IGRiODUwMF9wcmNtdV9kaXNhYmxlX2RzaXBsbCh2b2lkKQogewogCS8qIERpc2FibGUgZHNpIHBsbCAqLwotCXdyaXRlbChQUkNNVV9ESVNBQkxFX1BMTERTSSwgKF9QUkNNVV9CQVNFICsgUFJDTV9QTExEU0lfRU5BQkxFKSk7CisJd3JpdGVsKFBSQ01VX0RJU0FCTEVfUExMRFNJLCBQUkNNX1BMTERTSV9FTkFCTEUpOwogCS8qIERpc2FibGUgIGVzY2FwZWNsb2NrICovCi0Jd3JpdGVsKFBSQ01VX0RJU0FCTEVfRVNDQVBFX0NMT0NLX0RJViwKLQkJCQkJKF9QUkNNVV9CQVNFICsgUFJDTV9EU0lUVkNMS19ESVYpKTsKKwl3cml0ZWwoUFJDTVVfRElTQUJMRV9FU0NBUEVfQ0xPQ0tfRElWLCBQUkNNX0RTSVRWQ0xLX0RJVik7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBwcmNtdV9zZXRfZGlzcGxheV9jbG9ja3Modm9pZCkKK2ludCBkYjg1MDBfcHJjbXVfc2V0X2Rpc3BsYXlfY2xvY2tzKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgZHNpY2xrOwpAQCAtNTU0LDE1ICs1OTMsMTUgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xrX21ndF9sb2NrLCBmbGFncyk7CiAKIAkvKiBHcmFiIHRoZSBIVyBzZW1hcGhvcmUuICovCi0Jd2hpbGUgKChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fU0VNKSAmIFBSQ01fU0VNX1BSQ01fU0VNKSAhPSAwKQorCXdoaWxlICgocmVhZGwoUFJDTV9TRU0pICYgUFJDTV9TRU1fUFJDTV9TRU0pICE9IDApCiAJCWNwdV9yZWxheCgpOwogCi0Jd3JpdGVsKGRzaWNsaywgKF9QUkNNVV9CQVNFICsgUFJDTV9IRE1JQ0xLX01HVCkpOwotCXdyaXRlbChQUkNNVV9EU0lfTFBfQ0xPQ0tfU0VUVElORywgKF9QUkNNVV9CQVNFICsgUFJDTV9UVkNMS19NR1QpKTsKLQl3cml0ZWwoUFJDTVVfRFBJX0NMT0NLX1NFVFRJTkcsIChfUFJDTVVfQkFTRSArIFBSQ01fTENEQ0xLX01HVCkpOworCXdyaXRlbChkc2ljbGssIFBSQ01fSERNSUNMS19NR1QpOworCXdyaXRlbChQUkNNVV9EU0lfTFBfQ0xPQ0tfU0VUVElORywgUFJDTV9UVkNMS19NR1QpOworCXdyaXRlbChQUkNNVV9EUElfQ0xPQ0tfU0VUVElORywgUFJDTV9MQ0RDTEtfTUdUKTsKIAogCS8qIFJlbGVhc2UgdGhlIEhXIHNlbWFwaG9yZS4gKi8KLQl3cml0ZWwoMCwgKF9QUkNNVV9CQVNFICsgUFJDTV9TRU0pKTsKKwl3cml0ZWwoMCwgUFJDTV9TRU0pOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xrX21ndF9sb2NrLCBmbGFncyk7CiAKQEAgLTU3OCw4ICs2MTcsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb2NyX2xvY2ssIGZsYWdzKTsKLQlyZWcgPSByZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fR1BJT0NSKTsKLQl3cml0ZWwocmVnIHwgUFJDTV9HUElPQ1JfU1BJMl9TRUxFQ1QsIF9QUkNNVV9CQVNFICsgUFJDTV9HUElPQ1IpOworCXJlZyA9IHJlYWRsKFBSQ01fR1BJT0NSKTsKKwl3cml0ZWwocmVnIHwgUFJDTV9HUElPQ1JfU1BJMl9TRUxFQ1QsIFBSQ01fR1BJT0NSKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvY3JfbG9jaywgZmxhZ3MpOwogfQogCkBAIC01OTIsOCArNjMxLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9jcl9sb2NrLCBmbGFncyk7Ci0JcmVnID0gcmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX0dQSU9DUik7Ci0Jd3JpdGVsKHJlZyAmIH5QUkNNX0dQSU9DUl9TUEkyX1NFTEVDVCwgX1BSQ01VX0JBU0UgKyBQUkNNX0dQSU9DUik7CisJcmVnID0gcmVhZGwoUFJDTV9HUElPQ1IpOworCXdyaXRlbChyZWcgJiB+UFJDTV9HUElPQ1JfU1BJMl9TRUxFQ1QsIFBSQ01fR1BJT0NSKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvY3JfbG9jaywgZmxhZ3MpOwogfQogCkBAIC03MDEsNyArNzQwLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbGtvdXRfbG9jaywgZmxhZ3MpOwogCi0JdmFsID0gcmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX0NMS09DUik7CisJdmFsID0gcmVhZGwoUFJDTV9DTEtPQ1IpOwogCWlmICh2YWwgJiBkaXZfbWFzaykgewogCQlpZiAoZGl2KSB7CiAJCQlpZiAoKHZhbCAmIG1hc2spICE9IGJpdHMpIHsKQEAgLTcxNSw3ICs3NTQsNyBAQAogCQkJfQogCQl9CiAJfQotCXdyaXRlbCgoYml0cyB8ICh2YWwgJiB+bWFzaykpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0NMS09DUikpOworCXdyaXRlbCgoYml0cyB8ICh2YWwgJiB+bWFzaykpLCBQUkNNX0NMS09DUik7CiAJcmVxdWVzdHNbY2xrb3V0XSArPSAoZGl2ID8gMSA6IC0xKTsKIAogdW5sb2NrX2FuZF9yZXR1cm46CkBAIC03MjQsNyArNzYzLDcgQEAKIAlyZXR1cm4gcjsKIH0KIAotaW50IHByY211X3NldF9wb3dlcl9zdGF0ZSh1OCBzdGF0ZSwgYm9vbCBrZWVwX3VscF9jbGssIGJvb2wga2VlcF9hcF9wbGwpCitpbnQgZGI4NTAwX3ByY211X3NldF9wb3dlcl9zdGF0ZSh1OCBzdGF0ZSwgYm9vbCBrZWVwX3VscF9jbGssIGJvb2wga2VlcF9hcF9wbGwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNzMyLDcgKzc3MSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWIwX3RyYW5zZmVyLmxvY2ssIGZsYWdzKTsKIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDApKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgwKSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZWIoTUIwSF9QT1dFUl9TVEFURV9UUkFOUywgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CMCkpOwpAQCAtNzQxLDcgKzc4MCw3IEBACiAJd3JpdGViKChrZWVwX3VscF9jbGsgPyAxIDogMCksCiAJCSh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjBfVUxQX0NMT0NLX1NUQVRFKSk7CiAJd3JpdGViKDAsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjBfRE9fTk9UX1dGSSkpOwotCXdyaXRlbChNQk9YX0JJVCgwKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwl3cml0ZWwoTUJPWF9CSVQoMCksIFBSQ01fTUJPWF9DUFVfU0VUKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1iMF90cmFuc2Zlci5sb2NrLCBmbGFncyk7CiAKQEAgLTc3MCwxOCArODA5LDE4IEBACiAJCXJldHVybjsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJd2hpbGUgKHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMCkpCisJCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgwKSkKIAkJCWNwdV9yZWxheCgpOwogCQl3cml0ZWwoZGJiX2V2ZW50cywgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CMF9XQUtFVVBfODUwMCkpOwogCQl3cml0ZWwoYWJiX2V2ZW50cywgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CMF9XQUtFVVBfNDUwMCkpOwogCQl3cml0ZWIoaGVhZGVyW2ldLCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUIwKSk7Ci0JCXdyaXRlbChNQk9YX0JJVCgwKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwkJd3JpdGVsKE1CT1hfQklUKDApLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAJfQogCWxhc3RfZGJiX2V2ZW50cyA9IGRiYl9ldmVudHM7CiAJbGFzdF9hYmJfZXZlbnRzID0gYWJiX2V2ZW50czsKIH0KIAotdm9pZCBwcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcykKK3ZvaWQgZGI4NTAwX3ByY211X2VuYWJsZV93YWtldXBzKHUzMiB3YWtldXBzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIGJpdHM7CkBAIC04MDIsNyArODQxLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYjBfdHJhbnNmZXIubG9jaywgZmxhZ3MpOwogfQogCi12b2lkIHByY211X2NvbmZpZ19hYmJfZXZlbnRfcmVhZG91dCh1MzIgYWJiX2V2ZW50cykKK3ZvaWQgZGI4NTAwX3ByY211X2NvbmZpZ19hYmJfZXZlbnRfcmVhZG91dCh1MzIgYWJiX2V2ZW50cykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC04MTQsNyArODUzLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYjBfdHJhbnNmZXIubG9jaywgZmxhZ3MpOwogfQogCi12b2lkIHByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1ZikKK3ZvaWQgZGI4NTAwX3ByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1ZikKIHsKIAlpZiAocmVhZGIodGNkbV9iYXNlICsgUFJDTV9BQ0tfTUIwX1JFQURfUE9JTlRFUikgJiAxKQogCQkqYnVmID0gKHRjZG1fYmFzZSArIFBSQ01fQUNLX01CMF9XQUtFVVBfMV80NTAwKTsKQEAgLTgyMywxMyArODYyLDEzIEBACiB9CiAKIC8qKgotICogcHJjbXVfc2V0X2FybV9vcHAgLSBzZXQgdGhlIGFwcHJvcHJpYXRlIEFSTSBPUFAKKyAqIGRiODUwMF9wcmNtdV9zZXRfYXJtX29wcCAtIHNldCB0aGUgYXBwcm9wcmlhdGUgQVJNIE9QUAogICogQG9wcDogVGhlIG5ldyBBUk0gb3BlcmF0aW5nIHBvaW50IHRvIHdoaWNoIHRyYW5zaXRpb24gaXMgdG8gYmUgbWFkZQogICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlCiAgKgogICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB0aGUgb3BlcmF0aW5nIHBvaW50IG9mIHRoZSBBUk0uCiAgKi8KLWludCBwcmNtdV9zZXRfYXJtX29wcCh1OCBvcHApCitpbnQgZGI4NTAwX3ByY211X3NldF9hcm1fb3BwKHU4IG9wcCkKIHsKIAlpbnQgcjsKIApAQCAtODQwLDE0ICs4NzksMTQgQEAKIAogCW11dGV4X2xvY2soJm1iMV90cmFuc2Zlci5sb2NrKTsKIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDEpKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgxKSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZWIoTUIxSF9BUk1fQVBFX09QUCwgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CMSkpOwogCXdyaXRlYihvcHAsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjFfQVJNX09QUCkpOwogCXdyaXRlYihBUEVfTk9fQ0hBTkdFLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUIxX0FQRV9PUFApKTsKIAotCXdyaXRlbChNQk9YX0JJVCgxKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwl3cml0ZWwoTUJPWF9CSVQoMSksIFBSQ01fTUJPWF9DUFVfU0VUKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtYjFfdHJhbnNmZXIud29yayk7CiAKIAlpZiAoKG1iMV90cmFuc2Zlci5hY2suaGVhZGVyICE9IE1CMUhfQVJNX0FQRV9PUFApIHx8CkBAIC04NjAsMTEgKzg5OSwxMSBAQAogfQogCiAvKioKLSAqIHByY211X2dldF9hcm1fb3BwIC0gZ2V0IHRoZSBjdXJyZW50IEFSTSBPUFAKKyAqIGRiODUwMF9wcmNtdV9nZXRfYXJtX29wcCAtIGdldCB0aGUgY3VycmVudCBBUk0gT1BQCiAgKgogICogUmV0dXJuczogdGhlIGN1cnJlbnQgQVJNIE9QUAogICovCi1pbnQgcHJjbXVfZ2V0X2FybV9vcHAodm9pZCkKK2ludCBkYjg1MDBfcHJjbXVfZ2V0X2FybV9vcHAodm9pZCkKIHsKIAlyZXR1cm4gcmVhZGIodGNkbV9iYXNlICsgUFJDTV9BQ0tfTUIxX0NVUlJFTlRfQVJNX09QUCk7CiB9CkBAIC04NzYsNyArOTE1LDcgQEAKICAqLwogaW50IHByY211X2dldF9kZHJfb3BwKHZvaWQpCiB7Ci0JcmV0dXJuIHJlYWRiKF9QUkNNVV9CQVNFICsgUFJDTV9ERFJfU1VCU1lTX0FQRV9NSU5CVyk7CisJcmV0dXJuIHJlYWRiKFBSQ01fRERSX1NVQlNZU19BUEVfTUlOQlcpOwogfQogCiAvKioKQEAgLTg5Miw3ICs5MzEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBDaGFuZ2luZyB0aGUgRERSIE9QUCBjYW4gaGFuZyB0aGUgaGFyZHdhcmUgcHJlLXYyMSAqLwogCWlmIChjcHVfaXNfdTg1MDB2MjBfb3JfbGF0ZXIoKSAmJiAhY3B1X2lzX3U4NTAwdjIwKCkpCi0JCXdyaXRlYihvcHAsIChfUFJDTVVfQkFTRSArIFBSQ01fRERSX1NVQlNZU19BUEVfTUlOQlcpKTsKKwkJd3JpdGViKG9wcCwgUFJDTV9ERFJfU1VCU1lTX0FQRV9NSU5CVyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkwOSwxNCArOTQ4LDE0IEBACiAKIAltdXRleF9sb2NrKCZtYjFfdHJhbnNmZXIubG9jayk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgxKSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMSkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKE1CMUhfQVJNX0FQRV9PUFAsICh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjEpKTsKIAl3cml0ZWIoQVJNX05PX0NIQU5HRSwgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CMV9BUk1fT1BQKSk7CiAJd3JpdGViKG9wcCwgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CMV9BUEVfT1BQKSk7CiAKLQl3cml0ZWwoTUJPWF9CSVQoMSksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDEpLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmbWIxX3RyYW5zZmVyLndvcmspOwogCiAJaWYgKChtYjFfdHJhbnNmZXIuYWNrLmhlYWRlciAhPSBNQjFIX0FSTV9BUEVfT1BQKSB8fApAQCAtOTY2LDEyICsxMDA1LDEyIEBACiAJCWhlYWRlciA9IE1CMUhfUkVMRUFTRV9BUEVfT1BQXzEwMF9WT0xUOwogCX0KIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDEpKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgxKSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZWIoaGVhZGVyLCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUIxKSk7CiAKLQl3cml0ZWwoTUJPWF9CSVQoMSksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDEpLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmbWIxX3RyYW5zZmVyLndvcmspOwogCiAJaWYgKChtYjFfdHJhbnNmZXIuYWNrLmhlYWRlciAhPSBoZWFkZXIpIHx8CkBAIC05OTUsMTMgKzEwMzQsMTMgQEAKIAogCW11dGV4X2xvY2soJm1iMV90cmFuc2Zlci5sb2NrKTsKIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDEpKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgxKSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZWIoTUIxSF9SRUxFQVNFX1VTQl9XQUtFVVAsCiAJCSh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjEpKTsKIAotCXdyaXRlbChNQk9YX0JJVCgxKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwl3cml0ZWwoTUJPWF9CSVQoMSksIFBSQ01fTUJPWF9DUFVfU0VUKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtYjFfdHJhbnNmZXIud29yayk7CiAKIAlpZiAoKG1iMV90cmFuc2Zlci5hY2suaGVhZGVyICE9IE1CMUhfUkVMRUFTRV9VU0JfV0FLRVVQKSB8fApAQCAtMTAxMywxNSArMTA1MiwxNjkgQEAKIAlyZXR1cm4gcjsKIH0KIAorc3RhdGljIGludCByZXF1ZXN0X3BsbCh1OCBjbG9jaywgYm9vbCBlbmFibGUpCit7CisJaW50IHIgPSAwOworCisJaWYgKGNsb2NrID09IFBSQ01VX1BMTFNPQzEpCisJCWNsb2NrID0gKGVuYWJsZSA/IFBMTF9TT0MxX09OIDogUExMX1NPQzFfT0ZGKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmbWIxX3RyYW5zZmVyLmxvY2spOworCisJd2hpbGUgKHJlYWRsKFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDEpKQorCQljcHVfcmVsYXgoKTsKKworCXdyaXRlYihNQjFIX1BMTF9PTl9PRkYsICh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjEpKTsKKwl3cml0ZWIoY2xvY2ssICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjFfUExMX09OX09GRikpOworCisJd3JpdGVsKE1CT1hfQklUKDEpLCBQUkNNX01CT1hfQ1BVX1NFVCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmbWIxX3RyYW5zZmVyLndvcmspOworCisJaWYgKG1iMV90cmFuc2Zlci5hY2suaGVhZGVyICE9IE1CMUhfUExMX09OX09GRikKKwkJciA9IC1FSU87CisKKwltdXRleF91bmxvY2soJm1iMV90cmFuc2Zlci5sb2NrKTsKKworCXJldHVybiByOworfQorCiAvKioKLSAqIHByY211X3NldF9lcG9kIC0gc2V0IHRoZSBzdGF0ZSBvZiBhIEVQT0QgKHBvd2VyIGRvbWFpbikKKyAqIHByY211X3NldF9od2FjYyAtIHNldCB0aGUgcG93ZXIgc3RhdGUgb2YgYSBoL3cgYWNjZWxlcmF0b3IKKyAqIEBod2FjY19kZXY6IFRoZSBoYXJkd2FyZSBhY2NlbGVyYXRvciAoZW51bSBod19hY2NfZGV2KS4KKyAqIEBzdGF0ZTogVGhlIG5ldyBwb3dlciBzdGF0ZSAoZW51bSBod19hY2Nfc3RhdGUpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcG93ZXIgc3RhdGUgb2YgYSBoYXJkd2FyZSBhY2NlbGVyYXRvci4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCisgKiBOT1RFISBEZXByZWNhdGVkLCB0byBiZSByZW1vdmVkIHdoZW4gYWxsIHVzZXJzIHN3aXRjaGVkIG92ZXIgdG8gdXNlIHRoZQorICogcmVndWxhdG9yIGZyYW1ld29yayBBUEkuCisgKi8KK2ludCBwcmNtdV9zZXRfaHdhY2ModTE2IGh3YWNjX2RldiwgdTggc3RhdGUpCit7CisJaW50IHIgPSAwOworCWJvb2wgcmFtX3JldGVudGlvbiA9IGZhbHNlOworCWJvb2wgZW5hYmxlLCBlbmFibGVfcmV0OworCisJLyogY2hlY2sgYXJndW1lbnQgKi8KKwlCVUdfT04oaHdhY2NfZGV2ID49IE5VTV9IV19BQ0MpOworCisJLyogZ2V0IHN0YXRlIG9mIHN3aXRjaGVzICovCisJZW5hYmxlID0gaHdhY2NfZW5hYmxlZFtod2FjY19kZXZdOworCWVuYWJsZV9yZXQgPSBod2FjY19yZXRfZW5hYmxlZFtod2FjY19kZXZdOworCisJLyogc2V0IGZsYWcgaWYgcmV0ZW50aW9uIGlzIHBvc3NpYmxlICovCisJc3dpdGNoIChod2FjY19kZXYpIHsKKwljYXNlIEhXX0FDQ19TVkFNTURTUDoKKwljYXNlIEhXX0FDQ19TSUFNTURTUDoKKwljYXNlIEhXX0FDQ19FU1JBTTE6CisJY2FzZSBIV19BQ0NfRVNSQU0yOgorCWNhc2UgSFdfQUNDX0VTUkFNMzoKKwljYXNlIEhXX0FDQ19FU1JBTTQ6CisJCXJhbV9yZXRlbnRpb24gPSB0cnVlOworCQlicmVhazsKKwl9CisKKwkvKiBjaGVjayBhcmd1bWVudCAqLworCUJVR19PTihzdGF0ZSA+IEhXX09OKTsKKwlCVUdfT04oc3RhdGUgPT0gSFdfT0ZGX1JBTVJFVCAmJiAhcmFtX3JldGVudGlvbik7CisKKwkvKiBtb2RpZnkgZW5hYmxlIGZsYWdzICovCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgSFdfT0ZGOgorCQllbmFibGVfcmV0ID0gZmFsc2U7CisJCWVuYWJsZSA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIEhXX09OOgorCQllbmFibGUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIEhXX09GRl9SQU1SRVQ6CisJCWVuYWJsZV9yZXQgPSB0cnVlOworCQllbmFibGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorCisJLyogZ2V0IHJlZ3VsYXRvciAobGF6eSkgKi8KKwlpZiAoaHdhY2NfcmVndWxhdG9yW2h3YWNjX2Rldl0gPT0gTlVMTCkgeworCQlod2FjY19yZWd1bGF0b3JbaHdhY2NfZGV2XSA9IHJlZ3VsYXRvcl9nZXQoTlVMTCwKKwkJCWh3YWNjX3JlZ3VsYXRvcl9uYW1lW2h3YWNjX2Rldl0pOworCQlpZiAoSVNfRVJSKGh3YWNjX3JlZ3VsYXRvcltod2FjY19kZXZdKSkgeworCQkJcHJfZXJyKCJwcmNtdTogZmFpbGVkIHRvIGdldCBzdXBwbHkgJXNcbiIsCisJCQkJaHdhY2NfcmVndWxhdG9yX25hbWVbaHdhY2NfZGV2XSk7CisJCQlyID0gUFRSX0VSUihod2FjY19yZWd1bGF0b3JbaHdhY2NfZGV2XSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChyYW1fcmV0ZW50aW9uKSB7CisJCWlmIChod2FjY19yZXRfcmVndWxhdG9yW2h3YWNjX2Rldl0gPT0gTlVMTCkgeworCQkJaHdhY2NfcmV0X3JlZ3VsYXRvcltod2FjY19kZXZdID0gcmVndWxhdG9yX2dldChOVUxMLAorCQkJCWh3YWNjX3JldF9yZWd1bGF0b3JfbmFtZVtod2FjY19kZXZdKTsKKwkJCWlmIChJU19FUlIoaHdhY2NfcmV0X3JlZ3VsYXRvcltod2FjY19kZXZdKSkgeworCQkJCXByX2VycigicHJjbXU6IGZhaWxlZCB0byBnZXQgc3VwcGx5ICVzXG4iLAorCQkJCQlod2FjY19yZXRfcmVndWxhdG9yX25hbWVbaHdhY2NfZGV2XSk7CisJCQkJciA9IFBUUl9FUlIoaHdhY2NfcmV0X3JlZ3VsYXRvcltod2FjY19kZXZdKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworCS8qIHNldCByZWd1bGF0b3JzICovCisJaWYgKHJhbV9yZXRlbnRpb24pIHsKKwkJaWYgKGVuYWJsZV9yZXQgJiYgIWh3YWNjX3JldF9lbmFibGVkW2h3YWNjX2Rldl0pIHsKKwkJCXIgPSByZWd1bGF0b3JfZW5hYmxlKGh3YWNjX3JldF9yZWd1bGF0b3JbaHdhY2NfZGV2XSk7CisJCQlpZiAociA8IDApIHsKKwkJCQlwcl9lcnIoInByY211X3NldF9od2FjYzogcmV0IGVuYWJsZSBmYWlsZWRcbiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaHdhY2NfcmV0X2VuYWJsZWRbaHdhY2NfZGV2XSA9IHRydWU7CisJCX0KKwl9CisKKwlpZiAoZW5hYmxlICYmICFod2FjY19lbmFibGVkW2h3YWNjX2Rldl0pIHsKKwkJciA9IHJlZ3VsYXRvcl9lbmFibGUoaHdhY2NfcmVndWxhdG9yW2h3YWNjX2Rldl0pOworCQlpZiAociA8IDApIHsKKwkJCXByX2VycigicHJjbXVfc2V0X2h3YWNjOiBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWh3YWNjX2VuYWJsZWRbaHdhY2NfZGV2XSA9IHRydWU7CisJfQorCisJaWYgKCFlbmFibGUgJiYgaHdhY2NfZW5hYmxlZFtod2FjY19kZXZdKSB7CisJCXIgPSByZWd1bGF0b3JfZGlzYWJsZShod2FjY19yZWd1bGF0b3JbaHdhY2NfZGV2XSk7CisJCWlmIChyIDwgMCkgeworCQkJcHJfZXJyKCJwcmNtdV9zZXRfaHdhY2M6IGRpc2FibGUgZmFpbGVkXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWh3YWNjX2VuYWJsZWRbaHdhY2NfZGV2XSA9IGZhbHNlOworCX0KKworCWlmIChyYW1fcmV0ZW50aW9uKSB7CisJCWlmICghZW5hYmxlX3JldCAmJiBod2FjY19yZXRfZW5hYmxlZFtod2FjY19kZXZdKSB7CisJCQlyID0gcmVndWxhdG9yX2Rpc2FibGUoaHdhY2NfcmV0X3JlZ3VsYXRvcltod2FjY19kZXZdKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCXByX2VycigicHJjbXVfc2V0X2h3YWNjOiByZXQgZGlzYWJsZSBmYWlsZWRcbiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaHdhY2NfcmV0X2VuYWJsZWRbaHdhY2NfZGV2XSA9IGZhbHNlOworCQl9CisJfQorCitvdXQ6CisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKHByY211X3NldF9od2FjYyk7CisKKy8qKgorICogZGI4NTAwX3ByY211X3NldF9lcG9kIC0gc2V0IHRoZSBzdGF0ZSBvZiBhIEVQT0QgKHBvd2VyIGRvbWFpbikKICAqIEBlcG9kX2lkOiBUaGUgRVBPRCB0byBzZXQKICAqIEBlcG9kX3N0YXRlOiBUaGUgbmV3IEVQT0Qgc3RhdGUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHN0YXRlIG9mIGEgRVBPRCAocG93ZXIgZG9tYWluKS4gSXQgbWF5IG5vdCBiZSBjYWxsZWQKICAqIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCiAgKi8KLWludCBwcmNtdV9zZXRfZXBvZCh1MTYgZXBvZF9pZCwgdTggZXBvZF9zdGF0ZSkKK2ludCBkYjg1MDBfcHJjbXVfc2V0X2Vwb2QodTE2IGVwb2RfaWQsIHU4IGVwb2Rfc3RhdGUpCiB7CiAJaW50IHIgPSAwOwogCWJvb2wgcmFtX3JldGVudGlvbiA9IGZhbHNlOwpAQCAtMTA0OCw3ICsxMjQxLDcgQEAKIAltdXRleF9sb2NrKCZtYjJfdHJhbnNmZXIubG9jayk7CiAKIAkvKiB3YWl0IGZvciBtYWlsYm94ICovCi0Jd2hpbGUgKHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMikpCisJd2hpbGUgKHJlYWRsKFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDIpKQogCQljcHVfcmVsYXgoKTsKIAogCS8qIGZpbGwgaW4gbWFpbGJveCAqLwpAQCAtMTA1OCw3ICsxMjUxLDcgQEAKIAogCXdyaXRlYihNQjJIX0RQUywgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CMikpOwogCi0Jd3JpdGVsKE1CT1hfQklUKDIpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCgyKSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCiAJLyoKIAkgKiBUaGUgY3VycmVudCBmaXJtd2FyZSB2ZXJzaW9uIGRvZXMgbm90IGhhbmRsZSBlcnJvcnMgY29ycmVjdGx5LApAQCAtMTE0NSwxMyArMTMzOCwxMyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1iM190cmFuc2Zlci5sb2NrLCBmbGFncyk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgzKSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMykpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKChlbmFibGUgPyBPTiA6IE9GRiksICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjNfU1lTQ0xLX01HVCkpOwogCiAJd3JpdGViKE1CM0hfU1lTQ0xLLCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUIzKSk7Ci0Jd3JpdGVsKE1CT1hfQklUKDMpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCgzKSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWIzX3RyYW5zZmVyLmxvY2ssIGZsYWdzKTsKIApAQCAtMTE3Nyw3ICsxMzcwLDcgQEAKIAogCWlmICghZW5hYmxlKQogCQl2YWwgfD0gUFJDTV9UQ1JfU1RPUF9USU1FUlM7Ci0Jd3JpdGVsKHZhbCwgKF9QUkNNVV9CQVNFICsgUFJDTV9UQ1IpKTsKKwl3cml0ZWwodmFsLCBQUkNNX1RDUik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExOTAsNyArMTM4Myw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNsa19tZ3RfbG9jaywgZmxhZ3MpOwogCiAJLyogR3JhYiB0aGUgSFcgc2VtYXBob3JlLiAqLwotCXdoaWxlICgocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX1NFTSkgJiBQUkNNX1NFTV9QUkNNX1NFTSkgIT0gMCkKKwl3aGlsZSAoKHJlYWRsKFBSQ01fU0VNKSAmIFBSQ01fU0VNX1BSQ01fU0VNKSAhPSAwKQogCQljcHVfcmVsYXgoKTsKIAogCXZhbCA9IHJlYWRsKF9QUkNNVV9CQVNFICsgY2xrX21ndFtjbG9ja10ub2Zmc2V0KTsKQEAgLTEyMDMsMzQgKzEzOTYsNjEgQEAKIAl3cml0ZWwodmFsLCAoX1BSQ01VX0JBU0UgKyBjbGtfbWd0W2Nsb2NrXS5vZmZzZXQpKTsKIAogCS8qIFJlbGVhc2UgdGhlIEhXIHNlbWFwaG9yZS4gKi8KLQl3cml0ZWwoMCwgKF9QUkNNVV9CQVNFICsgUFJDTV9TRU0pKTsKKwl3cml0ZWwoMCwgUFJDTV9TRU0pOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xrX21ndF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCByZXF1ZXN0X3NnYV9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCit7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJaWYgKGVuYWJsZSkgeworCQl2YWwgPSByZWFkbChQUkNNX0NHQVRJTkdfQllQQVNTKTsKKwkJd3JpdGVsKHZhbCB8IFBSQ01fQ0dBVElOR19CWVBBU1NfSUNOMiwgUFJDTV9DR0FUSU5HX0JZUEFTUyk7CisJfQorCisJcmV0ID0gcmVxdWVzdF9yZWdfY2xvY2soY2xvY2ssIGVuYWJsZSk7CisKKwlpZiAoIXJldCAmJiAhZW5hYmxlKSB7CisJCXZhbCA9IHJlYWRsKFBSQ01fQ0dBVElOR19CWVBBU1MpOworCQl3cml0ZWwodmFsICYgflBSQ01fQ0dBVElOR19CWVBBU1NfSUNOMiwgUFJDTV9DR0FUSU5HX0JZUEFTUyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogLyoqCi0gKiBwcmNtdV9yZXF1ZXN0X2Nsb2NrKCkgLSBSZXF1ZXN0IGZvciBhIGNsb2NrIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgKiBkYjg1MDBfcHJjbXVfcmVxdWVzdF9jbG9jaygpIC0gUmVxdWVzdCBmb3IgYSBjbG9jayB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLgogICogQGNsb2NrOiAgICAgIFRoZSBjbG9jayBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZS4KICAqIEBlbmFibGU6ICAgICBXaGV0aGVyIHRoZSBjbG9jayBzaG91bGQgYmUgZW5hYmxlZCAodHJ1ZSkgb3IgZGlzYWJsZWQgKGZhbHNlKS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIGNsb2NrIGltcGxlbWVudGF0aW9uLgogICogRG8gbm90IHVzZSBpdCBmcm9tIGFueSBvdGhlciBwbGFjZSEKICAqLwotaW50IHByY211X3JlcXVlc3RfY2xvY2sodTggY2xvY2ssIGJvb2wgZW5hYmxlKQoraW50IGRiODUwMF9wcmNtdV9yZXF1ZXN0X2Nsb2NrKHU4IGNsb2NrLCBib29sIGVuYWJsZSkKIHsKKwlzd2l0Y2goY2xvY2spIHsKKwljYXNlIFBSQ01VX1NHQUNMSzoKKwkJcmV0dXJuIHJlcXVlc3Rfc2dhX2Nsb2NrKGNsb2NrLCBlbmFibGUpOworCWNhc2UgUFJDTVVfVElNQ0xLOgorCQlyZXR1cm4gcmVxdWVzdF90aW1jbGsoZW5hYmxlKTsKKwljYXNlIFBSQ01VX1NZU0NMSzoKKwkJcmV0dXJuIHJlcXVlc3Rfc3lzY2xrKGVuYWJsZSk7CisJY2FzZSBQUkNNVV9QTExTT0MxOgorCQlyZXR1cm4gcmVxdWVzdF9wbGwoY2xvY2ssIGVuYWJsZSk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCWlmIChjbG9jayA8IFBSQ01VX05VTV9SRUdfQ0xPQ0tTKQogCQlyZXR1cm4gcmVxdWVzdF9yZWdfY2xvY2soY2xvY2ssIGVuYWJsZSk7Ci0JZWxzZSBpZiAoY2xvY2sgPT0gUFJDTVVfVElNQ0xLKQotCQlyZXR1cm4gcmVxdWVzdF90aW1jbGsoZW5hYmxlKTsKLQllbHNlIGlmIChjbG9jayA9PSBQUkNNVV9TWVNDTEspCi0JCXJldHVybiByZXF1ZXN0X3N5c2NsayhlbmFibGUpOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLWludCBwcmNtdV9jb25maWdfZXNyYW0wX2RlZXBfc2xlZXAodTggc3RhdGUpCitpbnQgZGI4NTAwX3ByY211X2NvbmZpZ19lc3JhbTBfZGVlcF9zbGVlcCh1OCBzdGF0ZSkKIHsKIAlpZiAoKHN0YXRlID4gRVNSQU0wX0RFRVBfU0xFRVBfU1RBVEVfUkVUKSB8fAogCSAgICAoc3RhdGUgPCBFU1JBTTBfREVFUF9TTEVFUF9TVEFURV9PRkYpKQpAQCAtMTIzOCw3ICsxNDU4LDcgQEAKIAogCW11dGV4X2xvY2soJm1iNF90cmFuc2Zlci5sb2NrKTsKIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDQpKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg0KSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZWIoTUI0SF9NRU1fU1QsICh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjQpKTsKQEAgLTEyNDgsNyArMTQ2OCw3IEBACiAJICAgICAgICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjRfRERSX1NUX0FQX0RFRVBfSURMRSkpOwogCXdyaXRlYihzdGF0ZSwgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CNF9FU1JBTTBfU1QpKTsKIAotCXdyaXRlbChNQk9YX0JJVCg0KSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwl3cml0ZWwoTUJPWF9CSVQoNCksIFBSQ01fTUJPWF9DUFVfU0VUKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtYjRfdHJhbnNmZXIud29yayk7CiAKIAltdXRleF91bmxvY2soJm1iNF90cmFuc2Zlci5sb2NrKTsKQEAgLTEyNjAsMTMgKzE0ODAsMTMgQEAKIHsKIAltdXRleF9sb2NrKCZtYjRfdHJhbnNmZXIubG9jayk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg0KSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoNCkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKHRocmVzaG9sZCwgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CNF9IT1RET0dfVEhSRVNIT0xEKSk7CiAJd3JpdGViKE1CNEhfSE9URE9HLCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUI0KSk7CiAKLQl3cml0ZWwoTUJPWF9CSVQoNCksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDQpLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmbWI0X3RyYW5zZmVyLndvcmspOwogCiAJbXV0ZXhfdW5sb2NrKCZtYjRfdHJhbnNmZXIubG9jayk7CkBAIC0xMjc4LDcgKzE0OTgsNyBAQAogewogCW11dGV4X2xvY2soJm1iNF90cmFuc2Zlci5sb2NrKTsKIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDQpKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg0KSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZWIobG93LCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUI0X0hPVE1PTl9MT1cpKTsKQEAgLTEyODcsNyArMTUwNyw3IEBACiAJCSh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjRfSE9UTU9OX0NPTkZJRykpOwogCXdyaXRlYihNQjRIX0hPVE1PTiwgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CNCkpOwogCi0Jd3JpdGVsKE1CT1hfQklUKDQpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCg0KSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1iNF90cmFuc2Zlci53b3JrKTsKIAogCW11dGV4X3VubG9jaygmbWI0X3RyYW5zZmVyLmxvY2spOwpAQCAtMTI5OSwxMyArMTUxOSwxMyBAQAogewogCW11dGV4X2xvY2soJm1iNF90cmFuc2Zlci5sb2NrKTsKIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDQpKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg0KSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZXcodmFsLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUI0X0hPVF9QRVJJT0QpKTsKIAl3cml0ZWIoTUI0SF9IT1RfUEVSSU9ELCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUI0KSk7CiAKLQl3cml0ZWwoTUJPWF9CSVQoNCksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDQpLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmbWI0X3RyYW5zZmVyLndvcmspOwogCiAJbXV0ZXhfdW5sb2NrKCZtYjRfdHJhbnNmZXIubG9jayk7CkBAIC0xMzI2LDYgKzE1NDYsNzggQEAKIAlyZXR1cm4gY29uZmlnX2hvdF9wZXJpb2QoMHhGRkZGKTsKIH0KIAorc3RhdGljIGludCBwcmNtdV9hOXdkb2codTggY21kLCB1OCBkMCwgdTggZDEsIHU4IGQyLCB1OCBkMykKK3sKKworCW11dGV4X2xvY2soJm1iNF90cmFuc2Zlci5sb2NrKTsKKworCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg0KSkKKwkJY3B1X3JlbGF4KCk7CisKKwl3cml0ZWIoZDAsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjRfQTlXRE9HXzApKTsKKwl3cml0ZWIoZDEsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjRfQTlXRE9HXzEpKTsKKwl3cml0ZWIoZDIsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjRfQTlXRE9HXzIpKTsKKwl3cml0ZWIoZDMsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjRfQTlXRE9HXzMpKTsKKworCXdyaXRlYihjbWQsICh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjQpKTsKKworCXdyaXRlbChNQk9YX0JJVCg0KSwgUFJDTV9NQk9YX0NQVV9TRVQpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1iNF90cmFuc2Zlci53b3JrKTsKKworCW11dGV4X3VubG9jaygmbWI0X3RyYW5zZmVyLmxvY2spOworCisJcmV0dXJuIDA7CisKK30KKworaW50IHByY211X2NvbmZpZ19hOXdkb2codTggbnVtLCBib29sIHNsZWVwX2F1dG9fb2ZmKQoreworCUJVR19PTihudW0gPT0gMCB8fCBudW0gPiAweGYpOworCXJldHVybiBwcmNtdV9hOXdkb2coTUI0SF9BOVdET0dfQ09ORiwgbnVtLCAwLCAwLAorCQkJICAgIHNsZWVwX2F1dG9fb2ZmID8gQTlXRE9HX0FVVE9fT0ZGX0VOIDoKKwkJCSAgICBBOVdET0dfQVVUT19PRkZfRElTKTsKK30KKworaW50IHByY211X2VuYWJsZV9hOXdkb2codTggaWQpCit7CisJcmV0dXJuIHByY211X2E5d2RvZyhNQjRIX0E5V0RPR19FTiwgaWQsIDAsIDAsIDApOworfQorCitpbnQgcHJjbXVfZGlzYWJsZV9hOXdkb2codTggaWQpCit7CisJcmV0dXJuIHByY211X2E5d2RvZyhNQjRIX0E5V0RPR19ESVMsIGlkLCAwLCAwLCAwKTsKK30KKworaW50IHByY211X2tpY2tfYTl3ZG9nKHU4IGlkKQoreworCXJldHVybiBwcmNtdV9hOXdkb2coTUI0SF9BOVdET0dfS0lDSywgaWQsIDAsIDAsIDApOworfQorCisvKgorICogdGltZW91dCBpcyAyOCBiaXQsIGluIG1zLgorICovCisjZGVmaW5lIE1BWF9XQVRDSERPR19USU1FT1VUIDEzMTAwMAoraW50IHByY211X2xvYWRfYTl3ZG9nKHU4IGlkLCB1MzIgdGltZW91dCkKK3sKKwlpZiAodGltZW91dCA+IE1BWF9XQVRDSERPR19USU1FT1VUKQorCQkvKgorCQkgKiBEdWUgdG8gY2FsY3VsYXRpb24gYnVnIGluIHByY211IGZ3LCB0aW1lb3V0cworCQkgKiBjYW4ndCBiZSBiaWdnZXIgdGhhbiAxMzEgc2Vjb25kcy4KKwkJICovCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHByY211X2E5d2RvZyhNQjRIX0E5V0RPR19MT0FELAorCQkJICAgIChpZCAmIEE5V0RPR19JRF9NQVNLKSB8CisJCQkgICAgLyoKKwkJCSAgICAgKiBQdXQgdGhlIGxvd2VzdCAyOCBiaXRzIG9mIHRpbWVvdXQgYXQKKwkJCSAgICAgKiBvZmZzZXQgNC4gRm91ciBmaXJzdCBiaXRzIGFyZSB1c2VkIGZvciBpZC4KKwkJCSAgICAgKi8KKwkJCSAgICAodTgpKCh0aW1lb3V0IDw8IDQpICYgMHhmMCksCisJCQkgICAgKHU4KSgodGltZW91dCA+PiA0KSAmIDB4ZmYpLAorCQkJICAgICh1OCkoKHRpbWVvdXQgPj4gMTIpICYgMHhmZiksCisJCQkgICAgKHU4KSgodGltZW91dCA+PiAyMCkgJiAweGZmKSk7Cit9CisKIC8qKgogICogcHJjbXVfc2V0X2Nsb2NrX2RpdmlkZXIoKSAtIENvbmZpZ3VyZSB0aGUgY2xvY2sgZGl2aWRlci4KICAqIEBjbG9jazoJVGhlIGNsb2NrIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlLgpAQCAtMTM0NSw3ICsxNjM3LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xrX21ndF9sb2NrLCBmbGFncyk7CiAKIAkvKiBHcmFiIHRoZSBIVyBzZW1hcGhvcmUuICovCi0Jd2hpbGUgKChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fU0VNKSAmIFBSQ01fU0VNX1BSQ01fU0VNKSAhPSAwKQorCXdoaWxlICgocmVhZGwoUFJDTV9TRU0pICYgUFJDTV9TRU1fUFJDTV9TRU0pICE9IDApCiAJCWNwdV9yZWxheCgpOwogCiAJdmFsID0gcmVhZGwoX1BSQ01VX0JBU0UgKyBjbGtfbWd0W2Nsb2NrXS5vZmZzZXQpOwpAQCAtMTM1NCw3ICsxNjQ2LDcgQEAKIAl3cml0ZWwodmFsLCAoX1BSQ01VX0JBU0UgKyBjbGtfbWd0W2Nsb2NrXS5vZmZzZXQpKTsKIAogCS8qIFJlbGVhc2UgdGhlIEhXIHNlbWFwaG9yZS4gKi8KLQl3cml0ZWwoMCwgKF9QUkNNVV9CQVNFICsgUFJDTV9TRU0pKTsKKwl3cml0ZWwoMCwgUFJDTV9TRU0pOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xrX21ndF9sb2NrLCBmbGFncyk7CiAKQEAgLTEzODAsNyArMTY3Miw3IEBACiAKIAltdXRleF9sb2NrKCZtYjVfdHJhbnNmZXIubG9jayk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg1KSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoNSkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKFBSQ01VX0kyQ19SRUFEKHNsYXZlKSwgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CNV9JMkNfU0xBVkVfT1ApKTsKQEAgLTEzODgsNyArMTY4MCw3IEBACiAJd3JpdGViKHJlZywgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CNV9JMkNfUkVHKSk7CiAJd3JpdGViKDAsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjVfSTJDX1ZBTCkpOwogCi0Jd3JpdGVsKE1CT1hfQklUKDUpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCg1KSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1iNV90cmFuc2Zlci53b3JrLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwMDApKSkgewpAQCAtMTQyNiw3ICsxNzE4LDcgQEAKIAogCW11dGV4X2xvY2soJm1iNV90cmFuc2Zlci5sb2NrKTsKIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDUpKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg1KSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZWIoUFJDTVVfSTJDX1dSSVRFKHNsYXZlKSwgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CNV9JMkNfU0xBVkVfT1ApKTsKQEAgLTE0MzQsNyArMTcyNiw3IEBACiAJd3JpdGViKHJlZywgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CNV9JMkNfUkVHKSk7CiAJd3JpdGViKCp2YWx1ZSwgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CNV9JMkNfVkFMKSk7CiAKLQl3cml0ZWwoTUJPWF9CSVQoNSksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDUpLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAKIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbWI1X3RyYW5zZmVyLndvcmssCiAJCQkJbXNlY3NfdG9famlmZmllcygyMDAwMCkpKSB7CkBAIC0xNDU2LDIxICsxNzQ4LDQ0IEBACiB2b2lkIHByY211X2FjX3dha2VfcmVxKHZvaWQpCiB7CiAJdTMyIHZhbDsKKwl1MzIgc3RhdHVzOwogCiAJbXV0ZXhfbG9jaygmbWIwX3RyYW5zZmVyLmFjX3dha2VfbG9jayk7CiAKLQl2YWwgPSByZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fSE9TVEFDQ0VTU19SRVEpOworCXZhbCA9IHJlYWRsKFBSQ01fSE9TVEFDQ0VTU19SRVEpOwogCWlmICh2YWwgJiBQUkNNX0hPU1RBQ0NFU1NfUkVRX0hPU1RBQ0NFU1NfUkVRKQogCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwogCiAJYXRvbWljX3NldCgmYWNfd2FrZV9yZXFfc3RhdGUsIDEpOwogCi0Jd3JpdGVsKCh2YWwgfCBQUkNNX0hPU1RBQ0NFU1NfUkVRX0hPU1RBQ0NFU1NfUkVRKSwKLQkJKF9QUkNNVV9CQVNFICsgUFJDTV9IT1NUQUNDRVNTX1JFUSkpOworcmV0cnk6CisJd3JpdGVsKCh2YWwgfCBQUkNNX0hPU1RBQ0NFU1NfUkVRX0hPU1RBQ0NFU1NfUkVRKSwgUFJDTV9IT1NUQUNDRVNTX1JFUSk7CiAKIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbWIwX3RyYW5zZmVyLmFjX3dha2Vfd29yaywKLQkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwMDApKSkgewotCQlwcl9lcnIoInByY211OiAlcyB0aW1lZCBvdXQgKDIwIHMpIHdhaXRpbmcgZm9yIGEgcmVwbHkuXG4iLAorCQkJbXNlY3NfdG9famlmZmllcyg1MDAwKSkpIHsKKwkJcHJfY3JpdCgicHJjbXU6ICVzIHRpbWVkIG91dCAoNSBzKSB3YWl0aW5nIGZvciBhIHJlcGx5LlxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKwl9CisKKwkvKgorCSAqIFRoZSBtb2RlbSBjYW4gZ2VuZXJhdGUgYW4gQUNfV0FLRV9BQ0ssIGFuZCB0aGVuIHN0aWxsIGdvIHRvIHNsZWVwLgorCSAqIEFzIGEgd29ya2Fyb3VuZCwgd2Ugd2FpdCwgYW5kIHRoZW4gY2hlY2sgdGhhdCB0aGUgbW9kZW0gaXMgaW5kZWVkCisJICogYXdha2UgKGluIHRlcm1zIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUFJDTV9NT0RfQVdBS0VfU1RBVFVTCisJICogcmVnaXN0ZXIsIHdoaWNoIG1heSBub3QgYmUgdGhlIHdob2xlIHRydXRoKS4KKwkgKi8KKwl1ZGVsYXkoNDAwKTsKKwlzdGF0dXMgPSAocmVhZGwoUFJDTV9NT0RfQVdBS0VfU1RBVFVTKSAmIEJJVFMoMCwgMikpOworCWlmIChzdGF0dXMgIT0gKFBSQ01fTU9EX0FXQUtFX1NUQVRVU19QUkNNX01PRF9BQVBEX0FXQUtFIHwKKwkJCVBSQ01fTU9EX0FXQUtFX1NUQVRVU19QUkNNX01PRF9DT1JFUERfQVdBS0UpKSB7CisJCXByX2VycigicHJjbXU6ICVzIHJlY2VpdmVkIGFjaywgYnV0IG1vZGVtIG5vdCBhd2FrZSAoMHglWCkuXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCXVkZWxheSgxMjAwKTsKKwkJd3JpdGVsKHZhbCwgUFJDTV9IT1NUQUNDRVNTX1JFUSk7CisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1iMF90cmFuc2Zlci5hY193YWtlX3dvcmssCisJCQkJbXNlY3NfdG9famlmZmllcyg1MDAwKSkpCisJCQlnb3RvIHJldHJ5OworCQlwcl9jcml0KCJwcmNtdTogJXMgdGltZWQgb3V0ICg1IHMpIHdhaXRpbmcgZm9yIEFDX1NMRUVQX0FDSy5cbiIsCiAJCQlfX2Z1bmNfXyk7CiAJfQogCkBAIC0xNDg3LDE2ICsxODAyLDE2IEBACiAKIAltdXRleF9sb2NrKCZtYjBfdHJhbnNmZXIuYWNfd2FrZV9sb2NrKTsKIAotCXZhbCA9IHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9IT1NUQUNDRVNTX1JFUSk7CisJdmFsID0gcmVhZGwoUFJDTV9IT1NUQUNDRVNTX1JFUSk7CiAJaWYgKCEodmFsICYgUFJDTV9IT1NUQUNDRVNTX1JFUV9IT1NUQUNDRVNTX1JFUSkpCiAJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAKIAl3cml0ZWwoKHZhbCAmIH5QUkNNX0hPU1RBQ0NFU1NfUkVRX0hPU1RBQ0NFU1NfUkVRKSwKLQkJKF9QUkNNVV9CQVNFICsgUFJDTV9IT1NUQUNDRVNTX1JFUSkpOworCQlQUkNNX0hPU1RBQ0NFU1NfUkVRKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZtYjBfdHJhbnNmZXIuYWNfd2FrZV93b3JrLAotCQkJbXNlY3NfdG9famlmZmllcygyMDAwMCkpKSB7Ci0JCXByX2VycigicHJjbXU6ICVzIHRpbWVkIG91dCAoMjAgcykgd2FpdGluZyBmb3IgYSByZXBseS5cbiIsCisJCQltc2Vjc190b19qaWZmaWVzKDUwMDApKSkgeworCQlwcl9jcml0KCJwcmNtdTogJXMgdGltZWQgb3V0ICg1IHMpIHdhaXRpbmcgZm9yIGEgcmVwbHkuXG4iLAogCQkJX19mdW5jX18pOwogCX0KIApAQCAtMTUwNiwyMSArMTgyMSwzMiBAQAogCW11dGV4X3VubG9jaygmbWIwX3RyYW5zZmVyLmFjX3dha2VfbG9jayk7CiB9CiAKLWJvb2wgcHJjbXVfaXNfYWNfd2FrZV9yZXF1ZXN0ZWQodm9pZCkKK2Jvb2wgZGI4NTAwX3ByY211X2lzX2FjX3dha2VfcmVxdWVzdGVkKHZvaWQpCiB7CiAJcmV0dXJuIChhdG9taWNfcmVhZCgmYWNfd2FrZV9yZXFfc3RhdGUpICE9IDApOwogfQogCiAvKioKLSAqIHByY211X3N5c3RlbV9yZXNldCAtIFN5c3RlbSByZXNldAorICogZGI4NTAwX3ByY211X3N5c3RlbV9yZXNldCAtIFN5c3RlbSByZXNldAogICoKLSAqIFNhdmVzIHRoZSByZXNldCByZWFzb24gY29kZSBhbmQgdGhlbiBzZXRzIHRoZSBBUEVfU09GUlNUIHJlZ2lzdGVyIHdoaWNoCisgKiBTYXZlcyB0aGUgcmVzZXQgcmVhc29uIGNvZGUgYW5kIHRoZW4gc2V0cyB0aGUgQVBFX1NPRlRSU1QgcmVnaXN0ZXIgd2hpY2gKICAqIGZpcmVzIGludGVycnVwdCB0byBmdwogICovCi12b2lkIHByY211X3N5c3RlbV9yZXNldCh1MTYgcmVzZXRfY29kZSkKK3ZvaWQgZGI4NTAwX3ByY211X3N5c3RlbV9yZXNldCh1MTYgcmVzZXRfY29kZSkKIHsKIAl3cml0ZXcocmVzZXRfY29kZSwgKHRjZG1fYmFzZSArIFBSQ01fU1dfUlNUX1JFQVNPTikpOwotCXdyaXRlbCgxLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0FQRV9TT0ZUUlNUKSk7CisJd3JpdGVsKDEsIFBSQ01fQVBFX1NPRlRSU1QpOworfQorCisvKioKKyAqIGRiODUwMF9wcmNtdV9nZXRfcmVzZXRfY29kZSAtIFJldHJpZXZlIFNXIHJlc2V0IHJlYXNvbiBjb2RlCisgKgorICogUmV0cmlldmVzIHRoZSByZXNldCByZWFzb24gY29kZSBzdG9yZWQgYnkgcHJjbXVfc3lzdGVtX3Jlc2V0KCkgYmVmb3JlCisgKiBsYXN0IHJlc3RhcnQuCisgKi8KK3UxNiBkYjg1MDBfcHJjbXVfZ2V0X3Jlc2V0X2NvZGUodm9pZCkKK3sKKwlyZXR1cm4gcmVhZHcodGNkbV9iYXNlICsgUFJDTV9TV19SU1RfUkVBU09OKTsKIH0KIAogLyoqCkBAIC0xNTMwLDExICsxODU2LDExIEBACiB7CiAJbXV0ZXhfbG9jaygmbWIxX3RyYW5zZmVyLmxvY2spOwogCi0Jd2hpbGUgKHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMSkpCisJd2hpbGUgKHJlYWRsKFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDEpKQogCQljcHVfcmVsYXgoKTsKIAogCXdyaXRlYihNQjFIX1JFU0VUX01PREVNLCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUIxKSk7Ci0Jd3JpdGVsKE1CT1hfQklUKDEpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCgxKSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1iMV90cmFuc2Zlci53b3JrKTsKIAogCS8qCkBAIC0xNTUxLDExICsxODc3LDExIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWIwX3RyYW5zZmVyLmxvY2ssIGZsYWdzKTsKIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDApKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgwKSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZWIoTUIwSF9SRUFEX1dBS0VVUF9BQ0ssICh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjApKTsKLQl3cml0ZWwoTUJPWF9CSVQoMCksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDApLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYjBfdHJhbnNmZXIubG9jaywgZmxhZ3MpOwogfQpAQCAtMTYwMCw3ICsxOTI2LDcgQEAKIAkJciA9IGZhbHNlOwogCQlicmVhazsKIAl9Ci0Jd3JpdGVsKE1CT1hfQklUKDApLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0FSTV9JVDFfQ0xSKSk7CisJd3JpdGVsKE1CT1hfQklUKDApLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMTYxMyw3ICsxOTM5LDcgQEAKIAkJUFJDTV9BQ0tfTUIxX0NVUlJFTlRfQVBFX09QUCk7CiAJbWIxX3RyYW5zZmVyLmFjay5hcGVfdm9sdGFnZV9zdGF0dXMgPSByZWFkYih0Y2RtX2Jhc2UgKwogCQlQUkNNX0FDS19NQjFfQVBFX1ZPTFRBR0VfU1RBVFVTKTsKLQl3cml0ZWwoTUJPWF9CSVQoMSksIChfUFJDTVVfQkFTRSArIFBSQ01fQVJNX0lUMV9DTFIpKTsKKwl3cml0ZWwoTUJPWF9CSVQoMSksIFBSQ01fQVJNX0lUMV9DTFIpOwogCWNvbXBsZXRlKCZtYjFfdHJhbnNmZXIud29yayk7CiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtMTYyMSwxNCArMTk0NywxNCBAQAogc3RhdGljIGJvb2wgcmVhZF9tYWlsYm94XzIodm9pZCkKIHsKIAltYjJfdHJhbnNmZXIuYWNrLnN0YXR1cyA9IHJlYWRiKHRjZG1fYmFzZSArIFBSQ01fQUNLX01CMl9EUFNfU1RBVFVTKTsKLQl3cml0ZWwoTUJPWF9CSVQoMiksIChfUFJDTVVfQkFTRSArIFBSQ01fQVJNX0lUMV9DTFIpKTsKKwl3cml0ZWwoTUJPWF9CSVQoMiksIFBSQ01fQVJNX0lUMV9DTFIpOwogCWNvbXBsZXRlKCZtYjJfdHJhbnNmZXIud29yayk7CiAJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgYm9vbCByZWFkX21haWxib3hfMyh2b2lkKQogewotCXdyaXRlbChNQk9YX0JJVCgzKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9BUk1fSVQxX0NMUikpOworCXdyaXRlbChNQk9YX0JJVCgzKSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xNjQzLDYgKzE5NjksMTEgQEAKIAljYXNlIE1CNEhfSE9URE9HOgogCWNhc2UgTUI0SF9IT1RNT046CiAJY2FzZSBNQjRIX0hPVF9QRVJJT0Q6CisJY2FzZSBNQjRIX0E5V0RPR19DT05GOgorCWNhc2UgTUI0SF9BOVdET0dfRU46CisJY2FzZSBNQjRIX0E5V0RPR19ESVM6CisJY2FzZSBNQjRIX0E5V0RPR19MT0FEOgorCWNhc2UgTUI0SF9BOVdET0dfS0lDSzoKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRfdW5rbm93bl9oZWFkZXJfd2FybmluZyg0LCBoZWFkZXIpOwpAQCAtMTY1MCw3ICsxOTgxLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0Jd3JpdGVsKE1CT1hfQklUKDQpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0FSTV9JVDFfQ0xSKSk7CisJd3JpdGVsKE1CT1hfQklUKDQpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAogCWlmIChkb19jb21wbGV0ZSkKIAkJY29tcGxldGUoJm1iNF90cmFuc2Zlci53b3JrKTsKQEAgLTE2NjIsMjAgKzE5OTMsMjAgQEAKIHsKIAltYjVfdHJhbnNmZXIuYWNrLnN0YXR1cyA9IHJlYWRiKHRjZG1fYmFzZSArIFBSQ01fQUNLX01CNV9JMkNfU1RBVFVTKTsKIAltYjVfdHJhbnNmZXIuYWNrLnZhbHVlID0gcmVhZGIodGNkbV9iYXNlICsgUFJDTV9BQ0tfTUI1X0kyQ19WQUwpOwotCXdyaXRlbChNQk9YX0JJVCg1KSwgKF9QUkNNVV9CQVNFICsgUFJDTV9BUk1fSVQxX0NMUikpOworCXdyaXRlbChNQk9YX0JJVCg1KSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJY29tcGxldGUoJm1iNV90cmFuc2Zlci53b3JrKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBib29sIHJlYWRfbWFpbGJveF82KHZvaWQpCiB7Ci0Jd3JpdGVsKE1CT1hfQklUKDYpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0FSTV9JVDFfQ0xSKSk7CisJd3JpdGVsKE1CT1hfQklUKDYpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBib29sIHJlYWRfbWFpbGJveF83KHZvaWQpCiB7Ci0Jd3JpdGVsKE1CT1hfQklUKDcpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0FSTV9JVDFfQ0xSKSk7CisJd3JpdGVsKE1CT1hfQklUKDcpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTE2OTYsNyArMjAyNyw3IEBACiAJdTggbjsKIAlpcnFyZXR1cm5fdCByOwogCi0JYml0cyA9IChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fQVJNX0lUMV9WQUwpICYgQUxMX01CT1hfQklUUyk7CisJYml0cyA9IChyZWFkbChQUkNNX0FSTV9JVDFfVkFMKSAmIEFMTF9NQk9YX0JJVFMpOwogCWlmICh1bmxpa2VseSghYml0cykpCiAJCXJldHVybiBJUlFfTk9ORTsKIApAQCAtMTc2OCw3ICsyMDk5LDcgQEAKIAkuaXJxX3VubWFzawk9IHByY211X2lycV91bm1hc2ssCiB9OwogCi12b2lkIF9faW5pdCBwcmNtdV9lYXJseV9pbml0KHZvaWQpCit2b2lkIF9faW5pdCBkYjg1MDBfcHJjbXVfZWFybHlfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC0xODI2LDYgKzIxNTcsMTYgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBkYjg1MDBfcHJjbXVfaW5pdF9jbGtmb3JjZSh2b2lkKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChQUkNNX0E5UExfRk9SQ0VfQ0xLRU4pOworCXZhbCAmPSB+KFBSQ01fQTlQTF9GT1JDRV9DTEtFTl9QUkNNX0E5UExfRk9SQ0VfQ0xLRU4gfAorCQlQUkNNX0E5UExfRk9SQ0VfQ0xLRU5fUFJDTV9BOUFYSV9GT1JDRV9DTEtFTik7CisJd3JpdGVsKHZhbCwgKFBSQ01fQTlQTF9GT1JDRV9DTEtFTikpOworfQorCiAvKgogICogUG93ZXIgZG9tYWluIHN3aXRjaGVzIChlUE9EcykgbW9kZWxlZCBhcyByZWd1bGF0b3JzIGZvciB0aGUgREI4NTAwIFNvQwogICovCkBAIC0xODYxLDcgKzIyMDIsNDIgQEAKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGRiODUwMF9iMnIyX21jZGVfY29uc3VtZXJzW10gPSB7CiAJUkVHVUxBVE9SX1NVUFBMWSgidnN1cHBseSIsICJiMnIyLjAiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJ2c3VwcGx5IiwgIm1jZGUuMCIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZzdXBwbHkiLCAibWNkZSIpLAorfTsKKworLyogU1ZBIE1NRFNQIHJlZ3VsYXRvciBzd2l0Y2ggKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBkYjg1MDBfc3ZhbW1kc3BfY29uc3VtZXJzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgic3ZhLW1tZHNwIiwgImNtX2NvbnRyb2wiKSwKK307CisKKy8qIFNWQSBwaXBlIHJlZ3VsYXRvciBzd2l0Y2ggKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBkYjg1MDBfc3ZhcGlwZV9jb25zdW1lcnNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJzdmEtcGlwZSIsICJjbV9jb250cm9sIiksCit9OworCisvKiBTSUEgTU1EU1AgcmVndWxhdG9yIHN3aXRjaCAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGRiODUwMF9zaWFtbWRzcF9jb25zdW1lcnNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJzaWEtbW1kc3AiLCAiY21fY29udHJvbCIpLAorfTsKKworLyogU0lBIHBpcGUgcmVndWxhdG9yIHN3aXRjaCAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGRiODUwMF9zaWFwaXBlX2NvbnN1bWVyc1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInNpYS1waXBlIiwgImNtX2NvbnRyb2wiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBkYjg1MDBfc2dhX2NvbnN1bWVyc1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInYtbWFsaSIsIE5VTEwpLAorfTsKKworLyogRVNSQU0xIGFuZCAyIHJlZ3VsYXRvciBzd2l0Y2ggKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBkYjg1MDBfZXNyYW0xMl9jb25zdW1lcnNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJlc3JhbTEyIiwgImNtX2NvbnRyb2wiKSwKK307CisKKy8qIEVTUkFNMyBhbmQgNCByZWd1bGF0b3Igc3dpdGNoICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZGI4NTAwX2VzcmFtMzRfY29uc3VtZXJzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidi1lc3JhbTM0IiwgIm1jZGUiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJlc3JhbTM0IiwgImNtX2NvbnRyb2wiKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBkYjg1MDBfcmVndWxhdG9yc1tEQjg1MDBfTlVNX1JFR1VMQVRPUlNdID0gewpAQCAtMTkyMyw2ICsyMjk5LDggQEAKIAkJCS5uYW1lID0gImRiODUwMC1zdmEtbW1kc3AiLAogCQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJCX0sCisJCS5jb25zdW1lcl9zdXBwbGllcyA9IGRiODUwMF9zdmFtbWRzcF9jb25zdW1lcnMsCisJCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKGRiODUwMF9zdmFtbWRzcF9jb25zdW1lcnMpLAogCX0sCiAJW0RCODUwMF9SRUdVTEFUT1JfU1dJVENIX1NWQU1NRFNQUkVUXSA9IHsKIAkJLmNvbnN0cmFpbnRzID0gewpAQCAtMTkzNyw2ICsyMzE1LDggQEAKIAkJCS5uYW1lID0gImRiODUwMC1zdmEtcGlwZSIsCiAJCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAkJfSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzID0gZGI4NTAwX3N2YXBpcGVfY29uc3VtZXJzLAorCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShkYjg1MDBfc3ZhcGlwZV9jb25zdW1lcnMpLAogCX0sCiAJW0RCODUwMF9SRUdVTEFUT1JfU1dJVENIX1NJQU1NRFNQXSA9IHsKIAkJLnN1cHBseV9yZWd1bGF0b3IgPSAiZGI4NTAwLXZhcGUiLApAQCAtMTk0NCw2ICsyMzI0LDggQEAKIAkJCS5uYW1lID0gImRiODUwMC1zaWEtbW1kc3AiLAogCQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJCX0sCisJCS5jb25zdW1lcl9zdXBwbGllcyA9IGRiODUwMF9zaWFtbWRzcF9jb25zdW1lcnMsCisJCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKGRiODUwMF9zaWFtbWRzcF9jb25zdW1lcnMpLAogCX0sCiAJW0RCODUwMF9SRUdVTEFUT1JfU1dJVENIX1NJQU1NRFNQUkVUXSA9IHsKIAkJLmNvbnN0cmFpbnRzID0gewpAQCAtMTk1Nyw2ICsyMzM5LDggQEAKIAkJCS5uYW1lID0gImRiODUwMC1zaWEtcGlwZSIsCiAJCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAkJfSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzID0gZGI4NTAwX3NpYXBpcGVfY29uc3VtZXJzLAorCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShkYjg1MDBfc2lhcGlwZV9jb25zdW1lcnMpLAogCX0sCiAJW0RCODUwMF9SRUdVTEFUT1JfU1dJVENIX1NHQV0gPSB7CiAJCS5zdXBwbHlfcmVndWxhdG9yID0gImRiODUwMC12YXBlIiwKQEAgLTE5NjQsNiArMjM0OCw5IEBACiAJCQkubmFtZSA9ICJkYjg1MDAtc2dhIiwKIAkJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCQl9LAorCQkuY29uc3VtZXJfc3VwcGxpZXMgPSBkYjg1MDBfc2dhX2NvbnN1bWVycywKKwkJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoZGI4NTAwX3NnYV9jb25zdW1lcnMpLAorCiAJfSwKIAlbREI4NTAwX1JFR1VMQVRPUl9TV0lUQ0hfQjJSMl9NQ0RFXSA9IHsKIAkJLnN1cHBseV9yZWd1bGF0b3IgPSAiZGI4NTAwLXZhcGUiLApAQCAtMTk4MCw2ICsyMzY3LDggQEAKIAkJCS5uYW1lID0gImRiODUwMC1lc3JhbTEyIiwKIAkJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCQl9LAorCQkuY29uc3VtZXJfc3VwcGxpZXMgPSBkYjg1MDBfZXNyYW0xMl9jb25zdW1lcnMsCisJCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKGRiODUwMF9lc3JhbTEyX2NvbnN1bWVycyksCiAJfSwKIAlbREI4NTAwX1JFR1VMQVRPUl9TV0lUQ0hfRVNSQU0xMlJFVF0gPSB7CiAJCS5jb25zdHJhaW50cyA9IHsKQEAgLTE5OTMsNiArMjM4Miw4IEBACiAJCQkubmFtZSA9ICJkYjg1MDAtZXNyYW0zNCIsCiAJCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAkJfSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzID0gZGI4NTAwX2VzcmFtMzRfY29uc3VtZXJzLAorCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShkYjg1MDBfZXNyYW0zNF9jb25zdW1lcnMpLAogCX0sCiAJW0RCODUwMF9SRUdVTEFUT1JfU1dJVENIX0VTUkFNMzRSRVRdID0gewogCQkuY29uc3RyYWludHMgPSB7CkBAIC0yMDI0LDggKzI0MTUsMTAgQEAKIAlpZiAodXg1MDBfaXNfc3ZwKCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJZGI4NTAwX3ByY211X2luaXRfY2xrZm9yY2UoKTsKKwogCS8qIENsZWFuIHVwIHRoZSBtYWlsYm94IGludGVycnVwdHMgYWZ0ZXIgcHJlLWtlcm5lbCBjb2RlLiAqLwotCXdyaXRlbChBTExfTUJPWF9CSVRTLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0FSTV9JVDFfQ0xSKSk7CisJd3JpdGVsKEFMTF9NQk9YX0JJVFMsIFBSQ01fQVJNX0lUMV9DTFIpOwogCiAJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoSVJRX0RCODUwMF9QUkNNVTEsIHByY211X2lycV9oYW5kbGVyLAogCQlwcmNtdV9pcnFfdGhyZWFkX2ZuLCBJUlFGX05PX1NVU1BFTkQsICJwcmNtdSIsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZGJ4NTAwLXByY211LXJlZ3MuaCBiL2RyaXZlcnMvbWZkL2RieDUwMC1wcmNtdS1yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyMmU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL2RieDUwMC1wcmNtdS1yZWdzLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNUTWljcm9lbGVjdHJvbmljcyAyMDA5CisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTAKKyAqCisgKiBBdXRob3I6IEt1bWFyIFNhbmdodmkgPGt1bWFyLnNhbmdodmlAc3Rlcmljc3Nvbi5jb20+CisgKiBBdXRob3I6IFN1bmRhciBJeWVyIDxzdW5kYXIuaXllckBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgorICoKKyAqIFBSQ00gVW5pdCByZWdpc3RlcnMKKyAqLworCisjaWZuZGVmIF9fREI4NTAwX1BSQ01VX1JFR1NfSAorI2RlZmluZSBfX0RCODUwMF9QUkNNVV9SRUdTX0gKKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2RlZmluZSBCSVRTKF9zdGFydCwgX2VuZCkgKChCSVQoX2VuZCkgLSBCSVQoX3N0YXJ0KSkgKyBCSVQoX2VuZCkpCisKKyNkZWZpbmUgUFJDTV9TVkFDTEtfTUdUX09GRgkJMHgwMDgKKyNkZWZpbmUgUFJDTV9TSUFDTEtfTUdUX09GRgkJMHgwMEMKKyNkZWZpbmUgUFJDTV9TR0FDTEtfTUdUX09GRgkJMHgwMTQKKyNkZWZpbmUgUFJDTV9VQVJUQ0xLX01HVF9PRkYJCTB4MDE4CisjZGVmaW5lIFBSQ01fTVNQMDJDTEtfTUdUX09GRgkJMHgwMUMKKyNkZWZpbmUgUFJDTV9JMkNDTEtfTUdUX09GRgkJMHgwMjAKKyNkZWZpbmUgUFJDTV9TRE1NQ0NMS19NR1RfT0ZGCQkweDAyNAorI2RlZmluZSBQUkNNX1NMSU1DTEtfTUdUX09GRgkJMHgwMjgKKyNkZWZpbmUgUFJDTV9QRVIxQ0xLX01HVF9PRkYJCTB4MDJDCisjZGVmaW5lIFBSQ01fUEVSMkNMS19NR1RfT0ZGCQkweDAzMAorI2RlZmluZSBQUkNNX1BFUjNDTEtfTUdUX09GRgkJMHgwMzQKKyNkZWZpbmUgUFJDTV9QRVI1Q0xLX01HVF9PRkYJCTB4MDM4CisjZGVmaW5lIFBSQ01fUEVSNkNMS19NR1RfT0ZGCQkweDAzQworI2RlZmluZSBQUkNNX1BFUjdDTEtfTUdUX09GRgkJMHgwNDAKKyNkZWZpbmUgUFJDTV9QV01DTEtfTUdUX09GRgkJMHgwNDQgLyogZm9yIERCNTUwMCAqLworI2RlZmluZSBQUkNNX0lSREFDTEtfTUdUX09GRgkJMHgwNDggLyogZm9yIERCNTUwMCAqLworI2RlZmluZSBQUkNNX0lSUkNDTEtfTUdUX09GRgkJMHgwNEMgLyogZm9yIERCNTUwMCAqLworI2RlZmluZSBQUkNNX0xDRENMS19NR1RfT0ZGCQkweDA0NAorI2RlZmluZSBQUkNNX0JNTENMS19NR1RfT0ZGCQkweDA0QworI2RlZmluZSBQUkNNX0hTSVRYQ0xLX01HVF9PRkYJCTB4MDUwCisjZGVmaW5lIFBSQ01fSFNJUlhDTEtfTUdUX09GRgkJMHgwNTQKKyNkZWZpbmUgUFJDTV9IRE1JQ0xLX01HVF9PRkYJCTB4MDU4CisjZGVmaW5lIFBSQ01fQVBFQVRDTEtfTUdUX09GRgkJMHgwNUMKKyNkZWZpbmUgUFJDTV9BUEVUUkFDRUNMS19NR1RfT0ZGCTB4MDYwCisjZGVmaW5lIFBSQ01fTUNERUNMS19NR1RfT0ZGCQkweDA2NAorI2RlZmluZSBQUkNNX0lQSTJDQ0xLX01HVF9PRkYJCTB4MDY4CisjZGVmaW5lIFBSQ01fRFNJQUxUQ0xLX01HVF9PRkYJCTB4MDZDCisjZGVmaW5lIFBSQ01fRE1BQ0xLX01HVF9PRkYJCTB4MDc0CisjZGVmaW5lIFBSQ01fQjJSMkNMS19NR1RfT0ZGCQkweDA3OAorI2RlZmluZSBQUkNNX1RWQ0xLX01HVF9PRkYJCTB4MDdDCisjZGVmaW5lIFBSQ01fVU5JUFJPQ0xLX01HVF9PRkYJCTB4Mjc4CisjZGVmaW5lIFBSQ01fU1NQQ0xLX01HVF9PRkYJCTB4MjgwCisjZGVmaW5lIFBSQ01fUk5HQ0xLX01HVF9PRkYJCTB4Mjg0CisjZGVmaW5lIFBSQ01fVUlDQ0NMS19NR1RfT0ZGCQkweDI3QworI2RlZmluZSBQUkNNX01TUDFDTEtfTUdUX09GRgkJMHgyODgKKworI2RlZmluZSBQUkNNX0FSTV9QTExESVZQUwkoX1BSQ01VX0JBU0UgKyAweDExOCkKKyNkZWZpbmUgUFJDTV9BUk1fUExMRElWUFNfQVJNX0JSTV9SQVRFCQkweDNmCisjZGVmaW5lIFBSQ01fQVJNX1BMTERJVlBTX01BWF9NQVNLCQkweGYKKworI2RlZmluZSBQUkNNX1BMTEFSTV9MT0NLUCAgICAgICAoX1BSQ01VX0JBU0UgKyAweDBhOCkKKyNkZWZpbmUgUFJDTV9QTExBUk1fTE9DS1BfUFJDTV9QTExBUk1fTE9DS1AzCTB4MgorCisjZGVmaW5lIFBSQ01fQVJNX0NIR0NMS1JFUQkoX1BSQ01VX0JBU0UgKyAweDExNCkKKyNkZWZpbmUgUFJDTV9BUk1fQ0hHQ0xLUkVRX1BSQ01fQVJNX0NIR0NMS1JFUQkweDEKKworI2RlZmluZSBQUkNNX1BMTEFSTV9FTkFCTEUJKF9QUkNNVV9CQVNFICsgMHg5OCkKKyNkZWZpbmUgUFJDTV9QTExBUk1fRU5BQkxFX1BSQ01fUExMQVJNX0VOQUJMRQkweDEKKyNkZWZpbmUgUFJDTV9QTExBUk1fRU5BQkxFX1BSQ01fUExMQVJNX0NPVU5UT04JMHgxMDAKKworI2RlZmluZSBQUkNNX0FSTUNMS0ZJWF9NR1QJKF9QUkNNVV9CQVNFICsgMHgwKQorI2RlZmluZSBQUkNNX0E5UExfRk9SQ0VfQ0xLRU4JKF9QUkNNVV9CQVNFICsgMHgxOUMpCisjZGVmaW5lIFBSQ01fQTlfUkVTRVROX0NMUgkoX1BSQ01VX0JBU0UgKyAweDFmNCkKKyNkZWZpbmUgUFJDTV9BOV9SRVNFVE5fU0VUCShfUFJDTVVfQkFTRSArIDB4MWYwKQorI2RlZmluZSBQUkNNX0FSTV9MU19DTEFNUAkoX1BSQ01VX0JBU0UgKyAweDMwYykKKyNkZWZpbmUgUFJDTV9TUkFNX0E5CQkoX1BSQ01VX0JBU0UgKyAweDMwOCkKKworI2RlZmluZSBQUkNNX0E5UExfRk9SQ0VfQ0xLRU5fUFJDTV9BOVBMX0ZPUkNFX0NMS0VOIEJJVCgwKQorI2RlZmluZSBQUkNNX0E5UExfRk9SQ0VfQ0xLRU5fUFJDTV9BOUFYSV9GT1JDRV9DTEtFTiBCSVQoMSkKKworLyogQVJNIFdGSSBTdGFuZGJ5IHNpZ25hbCByZWdpc3RlciAqLworI2RlZmluZSBQUkNNX0FSTV9XRklfU1RBTkRCWSAgICAoX1BSQ01VX0JBU0UgKyAweDEzMCkKKyNkZWZpbmUgUFJDTV9JT0NSCQkoX1BSQ01VX0JBU0UgKyAweDMxMCkKKyNkZWZpbmUgUFJDTV9JT0NSX0lPRk9SQ0UJCQkweDEKKworLyogQ1BVIG1haWxib3ggcmVnaXN0ZXJzICovCisjZGVmaW5lIFBSQ01fTUJPWF9DUFVfVkFMCShfUFJDTVVfQkFTRSArIDB4MGZjKQorI2RlZmluZSBQUkNNX01CT1hfQ1BVX1NFVAkoX1BSQ01VX0JBU0UgKyAweDEwMCkKKyNkZWZpbmUgUFJDTV9NQk9YX0NQVV9DTFIJKF9QUkNNVV9CQVNFICsgMHgxMDQpCisKKy8qIER1YWwgQTkgY29yZSBpbnRlcnJ1cHQgbWFuYWdlbWVudCB1bml0IHJlZ2lzdGVycyAqLworI2RlZmluZSBQUkNNX0E5X01BU0tfUkVRCShfUFJDTVVfQkFTRSArIDB4MzI4KQorI2RlZmluZSBQUkNNX0E5X01BU0tfUkVRX1BSQ01fQTlfTUFTS19SRVEJMHgxCisKKyNkZWZpbmUgUFJDTV9BOV9NQVNLX0FDSwkoX1BSQ01VX0JBU0UgKyAweDMyYykKKyNkZWZpbmUgUFJDTV9BUk1JVE1TSzMxVE8wCShfUFJDTVVfQkFTRSArIDB4MTFjKQorI2RlZmluZSBQUkNNX0FSTUlUTVNLNjNUTzMyCShfUFJDTVVfQkFTRSArIDB4MTIwKQorI2RlZmluZSBQUkNNX0FSTUlUTVNLOTVUTzY0CShfUFJDTVVfQkFTRSArIDB4MTI0KQorI2RlZmluZSBQUkNNX0FSTUlUTVNLMTI3VE85NgkoX1BSQ01VX0JBU0UgKyAweDEyOCkKKyNkZWZpbmUgUFJDTV9QT1dFUl9TVEFURV9WQUwJKF9QUkNNVV9CQVNFICsgMHgyNUMpCisjZGVmaW5lIFBSQ01fQVJNSVRWQUwzMVRPMAkoX1BSQ01VX0JBU0UgKyAweDI2MCkKKyNkZWZpbmUgUFJDTV9BUk1JVFZBTDYzVE8zMgkoX1BSQ01VX0JBU0UgKyAweDI2NCkKKyNkZWZpbmUgUFJDTV9BUk1JVFZBTDk1VE82NAkoX1BSQ01VX0JBU0UgKyAweDI2OCkKKyNkZWZpbmUgUFJDTV9BUk1JVFZBTDEyN1RPOTYJKF9QUkNNVV9CQVNFICsgMHgyNkMpCisKKyNkZWZpbmUgUFJDTV9IT1NUQUNDRVNTX1JFUQkoX1BSQ01VX0JBU0UgKyAweDMzNCkKKyNkZWZpbmUgUFJDTV9IT1NUQUNDRVNTX1JFUV9IT1NUQUNDRVNTX1JFUSAweDEKKyNkZWZpbmUgQVJNX1dBS0VVUF9NT0RFTQkweDEKKworI2RlZmluZSBQUkNNX0FSTV9JVDFfQ0xSCShfUFJDTVVfQkFTRSArIDB4NDhDKQorI2RlZmluZSBQUkNNX0FSTV9JVDFfVkFMCShfUFJDTVVfQkFTRSArIDB4NDk0KQorI2RlZmluZSBQUkNNX0hPTERfRVZUCQkoX1BSQ01VX0JBU0UgKyAweDE3NCkKKworI2RlZmluZSBQUkNNX01PRF9BV0FLRV9TVEFUVVMJKF9QUkNNVV9CQVNFICsgMHg0QTApCisjZGVmaW5lIFBSQ01fTU9EX0FXQUtFX1NUQVRVU19QUkNNX01PRF9DT1JFUERfQVdBS0UJQklUKDApCisjZGVmaW5lIFBSQ01fTU9EX0FXQUtFX1NUQVRVU19QUkNNX01PRF9BQVBEX0FXQUtFCUJJVCgxKQorI2RlZmluZSBQUkNNX01PRF9BV0FLRV9TVEFUVVNfUFJDTV9NT0RfVk1PREVNX09GRl9JU08JQklUKDIpCisKKyNkZWZpbmUgUFJDTV9JVFNUQVRVUzAJCShfUFJDTVVfQkFTRSArIDB4MTQ4KQorI2RlZmluZSBQUkNNX0lUU1RBVFVTMQkJKF9QUkNNVV9CQVNFICsgMHgxNTApCisjZGVmaW5lIFBSQ01fSVRTVEFUVVMyCQkoX1BSQ01VX0JBU0UgKyAweDE1OCkKKyNkZWZpbmUgUFJDTV9JVFNUQVRVUzMJCShfUFJDTVVfQkFTRSArIDB4MTYwKQorI2RlZmluZSBQUkNNX0lUU1RBVFVTNAkJKF9QUkNNVV9CQVNFICsgMHgxNjgpCisjZGVmaW5lIFBSQ01fSVRTVEFUVVM1CQkoX1BSQ01VX0JBU0UgKyAweDQ4NCkKKyNkZWZpbmUgUFJDTV9JVENMRUFSNQkJKF9QUkNNVV9CQVNFICsgMHg0ODgpCisjZGVmaW5lIFBSQ01fQVJNSVRfTUFTS1hQNzBfSVQJKF9QUkNNVV9CQVNFICsgMHgxMDE4KQorCisvKiBTeXN0ZW0gcmVzZXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFJDTV9BUEVfU09GVFJTVAkoX1BSQ01VX0JBU0UgKyAweDIyOCkKKworLyogTGV2ZWwgc2hpZnRlciBhbmQgY2xhbXAgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUFJDTV9NTUlQX0xTX0NMQU1QX1NFVCAgICAgKF9QUkNNVV9CQVNFICsgMHg0MjApCisjZGVmaW5lIFBSQ01fTU1JUF9MU19DTEFNUF9DTFIgICAgIChfUFJDTVVfQkFTRSArIDB4NDI0KQorCisvKiBQUkNNVSBjbG9jay9QTEwvcmVzZXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBSQ01fUExMRFNJX0ZSRVEgICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4NTAwKQorI2RlZmluZSBQUkNNX1BMTERTSV9FTkFCTEUgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDUwNCkKKyNkZWZpbmUgUFJDTV9QTExEU0lfTE9DS1AgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg1MDgpCisjZGVmaW5lIFBSQ01fTENEQ0xLX01HVCAgICAgICAgICAgIChfUFJDTVVfQkFTRSArIFBSQ01fTENEQ0xLX01HVF9PRkYpCisjZGVmaW5lIFBSQ01fTUNERUNMS19NR1QgICAgICAgICAgIChfUFJDTVVfQkFTRSArIFBSQ01fTUNERUNMS19NR1RfT0ZGKQorI2RlZmluZSBQUkNNX0hETUlDTEtfTUdUICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyBQUkNNX0hETUlDTEtfTUdUX09GRikKKyNkZWZpbmUgUFJDTV9UVkNMS19NR1QgICAgICAgICAgICAgKF9QUkNNVV9CQVNFICsgUFJDTV9UVkNMS19NR1RfT0ZGKQorI2RlZmluZSBQUkNNX0RTSV9QTExPVVRfU0VMICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDUzMCkKKyNkZWZpbmUgUFJDTV9EU0lUVkNMS19ESVYgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg1MkMpCisjZGVmaW5lIFBSQ01fUExMRFNJX0xPQ0tQICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4NTA4KQorI2RlZmluZSBQUkNNX0FQRV9SRVNFVE5fU0VUICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDFFNCkKKyNkZWZpbmUgUFJDTV9BUEVfUkVTRVROX0NMUiAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgxRTgpCisKKyNkZWZpbmUgUFJDTV9DTEtPQ1IJCSAgIChfUFJDTVVfQkFTRSArIDB4MUNDKQorI2RlZmluZSBQUkNNX0NMS09DUl9DTEtPVVQwX1JFRl9DTEsJKDEgPDwgMCkKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1VUMF9NQVNLCUJJVFMoMCwgMTMpCisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09VVDFfUkVGX0NMSwkoMSA8PCAxNikKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1VUMV9NQVNLCUJJVFMoMTYsIDI5KQorCisvKiBlUE9EIGFuZCBtZW1vcnkgcG93ZXIgc2lnbmFsIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBSQ01fRVBPRF9DX1NFVCAgICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4NDEwKQorI2RlZmluZSBQUkNNX1NSQU1fTFNfU0xFRVAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDMwNCkKKworLyogRGVidWcgcG93ZXIgY29udHJvbCB1bml0IHJlZ2lzdGVycyAqLworI2RlZmluZSBQUkNNX1BPV0VSX1NUQVRFX1NFVCAgICAgICAoX1BSQ01VX0JBU0UgKyAweDI1NCkKKworLyogTWlzY2VsbGFuZW91cyB1bml0IHJlZ2lzdGVycyAqLworI2RlZmluZSBQUkNNX0RTSV9TV19SRVNFVCAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDMyNCkKKyNkZWZpbmUgUFJDTV9HUElPQ1IgICAgICAgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgxMzgpCisjZGVmaW5lIFBSQ01fR1BJT0NSX0RCR19TVE1fTU9EX0NNRDEgICAgICAgICAgICAweDgwMAorI2RlZmluZSBQUkNNX0dQSU9DUl9EQkdfVUFSVE1PRF9DTUQwICAgICAgICAgICAgMHgxCisKKy8qIFBSQ01VIEhXIHNlbWFwaG9yZSAqLworI2RlZmluZSBQUkNNX1NFTSAgICAgICAgICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDQwMCkKKyNkZWZpbmUgUFJDTV9TRU1fUFJDTV9TRU0gQklUKDApCisKKyNkZWZpbmUgUFJDTV9UQ1IgICAgICAgICAgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgxQzgpCisjZGVmaW5lIFBSQ01fVENSX1RFTlNFTF9NQVNLICAgICAgIEJJVFMoMCwgNykKKyNkZWZpbmUgUFJDTV9UQ1JfU1RPUF9USU1FUlMgICAgICAgQklUKDE2KQorI2RlZmluZSBQUkNNX1RDUl9ET1pFX01PREUgICAgICAgICBCSVQoMTcpCisKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT0RJVjBfU0hJRlQJMAorI2RlZmluZSBQUkNNX0NMS09DUl9DTEtPRElWMF9NQVNLCUJJVFMoMCwgNSkKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1NFTDBfU0hJRlQJNgorI2RlZmluZSBQUkNNX0NMS09DUl9DTEtPU0VMMF9NQVNLCUJJVFMoNiwgOCkKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT0RJVjFfU0hJRlQJMTYKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT0RJVjFfTUFTSwlCSVRTKDE2LCAyMSkKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1NFTDFfU0hJRlQJMjIKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1NFTDFfTUFTSwlCSVRTKDIyLCAyNCkKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLMVRZUEUJCUJJVCgyOCkKKworI2RlZmluZSBQUkNNX0NMS19NR1RfQ0xLUExMRElWX01BU0sJQklUUygwLCA0KQorI2RlZmluZSBQUkNNX0NMS19NR1RfQ0xLUExMU1dfTUFTSwlCSVRTKDUsIDcpCisjZGVmaW5lIFBSQ01fQ0xLX01HVF9DTEtFTgkJQklUKDgpCisKKy8qIEdQSU9DUiByZWdpc3RlciAqLworI2RlZmluZSBQUkNNX0dQSU9DUl9TUEkyX1NFTEVDVCBCSVQoMjMpCisKKyNkZWZpbmUgUFJDTV9ERFJfU1VCU1lTX0FQRV9NSU5CVwkoX1BSQ01VX0JBU0UgKyAweDQzOCkKKyNkZWZpbmUgUFJDTV9DR0FUSU5HX0JZUEFTUwkJKF9QUkNNVV9CQVNFICsgMHgxMzQpCisjZGVmaW5lIFBSQ01fQ0dBVElOR19CWVBBU1NfSUNOMglCSVQoNikKKworLyogTWlzY2VsbGFuZW91cyB1bml0IHJlZ2lzdGVycyAqLworI2RlZmluZSBQUkNNX1JFU09VVE5fU0VUCQkoX1BSQ01VX0JBU0UgKyAweDIxNCkKKyNkZWZpbmUgUFJDTV9SRVNPVVROX0NMUgkJKF9QUkNNVV9CQVNFICsgMHgyMTgpCisKKy8qIFN5c3RlbSByZXNldCByZWdpc3RlciAqLworI2RlZmluZSBQUkNNX0FQRV9TT0ZUUlNUCQkoX1BSQ01VX0JBU0UgKyAweDIyOCkKKworI2VuZGlmIC8qIF9fREI4NTAwX1BSQ01VX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZG0zNTVldm1fbXNwLmMgYi9kcml2ZXJzL21mZC9kbTM1NWV2bV9tc3AuYwppbmRleCAzZDRhODYxLi44YWQ4OGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9kbTM1NWV2bV9tc3AuYworKysgYi9kcml2ZXJzL21mZC9kbTM1NWV2bV9tc3AuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2ludGVsX21zaWMuYyBiL2RyaXZlcnMvbWZkL2ludGVsX21zaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2MyNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvaW50ZWxfbXNpYy5jCkBAIC0wLDAgKzEsNTAyIEBACisvKgorICogRHJpdmVyIGZvciBJbnRlbCBNU0lDCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvaW50ZWxfbXNpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS9pbnRlbF9zY3VfaXBjLmg+CisKKyNkZWZpbmUgTVNJQ19WRU5ET1IoaWQpCQkoKGlkID4+IDYpICYgMykKKyNkZWZpbmUgTVNJQ19WRVJTSU9OKGlkKQkoaWQgJiAweDNmKQorI2RlZmluZSBNU0lDX01BSk9SKGlkKQkJKCdBJyArICgoaWQgPj4gMykgJiA3KSkKKyNkZWZpbmUgTVNJQ19NSU5PUihpZCkJCShpZCAmIDcpCisKKy8qCisgKiBNU0lDIGludGVycnVwdCB0cmVlIGlzIHJlYWRhYmxlIGZyb20gU1JBTSBhdCBJTlRFTF9NU0lDX0lSUV9QSFlTX0JBU0UuCisgKiBTaW5jZSBJUlEgYmxvY2sgc3RhcnRzIGZyb20gYWRkcmVzcyAweDAwMiB3ZSBuZWVkIHRvIHN1YnN0cmFjdCB0aGF0IGZyb20KKyAqIHRoZSBhY3R1YWwgSVJRIHN0YXR1cyByZWdpc3RlciBhZGRyZXNzLgorICovCisjZGVmaW5lIE1TSUNfSVJRX1NUQVRVUyh4KQkoSU5URUxfTVNJQ19JUlFfUEhZU19CQVNFICsgKCh4KSAtIDIpKQorI2RlZmluZSBNU0lDX0lSUV9TVEFUVVNfQUNDREVUCU1TSUNfSVJRX1NUQVRVUyhJTlRFTF9NU0lDX0FDQ0RFVCkKKworLyoKKyAqIFRoZSBTQ1UgaGFyZHdhcmUgaGFzIGxpbWl0YXRpb24gb2YgMTYgYnl0ZXMgcGVyIHJlYWQvd3JpdGUgYnVmZmVyIG9uCisgKiBNZWRmaWVsZC4KKyAqLworI2RlZmluZSBTQ1VfSVBDX1JXQlVGX0xJTUlUCTE2CisKKy8qKgorICogc3RydWN0IGludGVsX21zaWMgLSBhbiBNU0lDIE1GRCBpbnN0YW5jZQorICogQHBkZXY6IHBvaW50ZXIgdG8gdGhlIHBsYXRmb3JtIGRldmljZQorICogQHZlbmRvcjogdmVuZG9yIElECisgKiBAdmVyc2lvbjogY2hpcCB2ZXJzaW9uCisgKiBAaXJxX2Jhc2U6IGJhc2UgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIE1TSUMgU1JBTSBpbnRlcnJ1cHQgdHJlZQorICovCitzdHJ1Y3QgaW50ZWxfbXNpYyB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7CisJdW5zaWduZWQJCQl2ZW5kb3I7CisJdW5zaWduZWQJCQl2ZXJzaW9uOworCXZvaWQgX19pb21lbQkJCSppcnFfYmFzZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXNpY190b3VjaF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtc2ljX2FkY19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtc2ljX2JhdHRlcnlfcmVzb3VyY2VzW10gPSB7CisJeworCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXNpY19ncGlvX3Jlc291cmNlc1tdID0geworCXsKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1zaWNfYXVkaW9fcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQkJPSAiSVJRIiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJLyoKKwkgKiBXZSB3aWxsIHBhc3MgSVJRX0JBU0UgdG8gdGhlIGRyaXZlciBub3cgYnV0IHRoaXMgY2FuIGJlIHJlbW92ZWQKKwkgKiB3aGVuL2lmIHRoZSBkcml2ZXIgc3RhcnRzIHRvIHVzZSBpbnRlbF9tc2ljX2lycV9yZWFkKCkuCisJICovCisJeworCQkubmFtZQkJPSAiSVJRX0JBU0UiLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJCS5zdGFydAkJPSBNU0lDX0lSUV9TVEFUVVNfQUNDREVULAorCQkuZW5kCQk9IE1TSUNfSVJRX1NUQVRVU19BQ0NERVQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXNpY19oZG1pX3Jlc291cmNlc1tdID0geworCXsKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1zaWNfdGhlcm1hbF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtc2ljX3Bvd2VyX2J0bl9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtc2ljX29jZF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworLyoKKyAqIERldmljZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgTVNJQyBhbmQgYXJlIGF2YWlsYWJsZSB2aWEgZmlybXdhcmUKKyAqIHBvcHVsYXRlZCBTRkkgREVWUyB0YWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBtZmRfY2VsbCBtc2ljX2RldnNbXSA9IHsKKwlbSU5URUxfTVNJQ19CTE9DS19UT1VDSF0JPSB7CisJCS5uYW1lCQkJPSAibXNpY190b3VjaCIsCisJCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobXNpY190b3VjaF9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzCQk9IG1zaWNfdG91Y2hfcmVzb3VyY2VzLAorCX0sCisJW0lOVEVMX01TSUNfQkxPQ0tfQURDXQkJPSB7CisJCS5uYW1lCQkJPSAibXNpY19hZGMiLAorCQkubnVtX3Jlc291cmNlcwkJPSBBUlJBWV9TSVpFKG1zaWNfYWRjX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMJCT0gbXNpY19hZGNfcmVzb3VyY2VzLAorCX0sCisJW0lOVEVMX01TSUNfQkxPQ0tfQkFUVEVSWV0JPSB7CisJCS5uYW1lCQkJPSAibXNpY19iYXR0ZXJ5IiwKKwkJLm51bV9yZXNvdXJjZXMJCT0gQVJSQVlfU0laRShtc2ljX2JhdHRlcnlfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcwkJPSBtc2ljX2JhdHRlcnlfcmVzb3VyY2VzLAorCX0sCisJW0lOVEVMX01TSUNfQkxPQ0tfR1BJT10JCT0geworCQkubmFtZQkJCT0gIm1zaWNfZ3BpbyIsCisJCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobXNpY19ncGlvX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMJCT0gbXNpY19ncGlvX3Jlc291cmNlcywKKwl9LAorCVtJTlRFTF9NU0lDX0JMT0NLX0FVRElPXQk9IHsKKwkJLm5hbWUJCQk9ICJtc2ljX2F1ZGlvIiwKKwkJLm51bV9yZXNvdXJjZXMJCT0gQVJSQVlfU0laRShtc2ljX2F1ZGlvX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMJCT0gbXNpY19hdWRpb19yZXNvdXJjZXMsCisJfSwKKwlbSU5URUxfTVNJQ19CTE9DS19IRE1JXQkJPSB7CisJCS5uYW1lCQkJPSAibXNpY19oZG1pIiwKKwkJLm51bV9yZXNvdXJjZXMJCT0gQVJSQVlfU0laRShtc2ljX2hkbWlfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcwkJPSBtc2ljX2hkbWlfcmVzb3VyY2VzLAorCX0sCisJW0lOVEVMX01TSUNfQkxPQ0tfVEhFUk1BTF0JPSB7CisJCS5uYW1lCQkJPSAibXNpY190aGVybWFsIiwKKwkJLm51bV9yZXNvdXJjZXMJCT0gQVJSQVlfU0laRShtc2ljX3RoZXJtYWxfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcwkJPSBtc2ljX3RoZXJtYWxfcmVzb3VyY2VzLAorCX0sCisJW0lOVEVMX01TSUNfQkxPQ0tfUE9XRVJfQlROXQk9IHsKKwkJLm5hbWUJCQk9ICJtc2ljX3Bvd2VyX2J0biIsCisJCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobXNpY19wb3dlcl9idG5fcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcwkJPSBtc2ljX3Bvd2VyX2J0bl9yZXNvdXJjZXMsCisJfSwKKwlbSU5URUxfTVNJQ19CTE9DS19PQ0RdCQk9IHsKKwkJLm5hbWUJCQk9ICJtc2ljX29jZCIsCisJCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobXNpY19vY2RfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcwkJPSBtc2ljX29jZF9yZXNvdXJjZXMsCisJfSwKK307CisKKy8qCisgKiBPdGhlciBNU0lDIHJlbGF0ZWQgZGV2aWNlcyB3aGljaCBhcmUgbm90IGRpcmVjdGx5IGF2YWlsYWJsZSB2aWEgU0ZJIERFVlMKKyAqIHRhYmxlLiBUaGVzZSBjYW4gYmUgcHNldWRvIGRldmljZXMsIHJlZ3VsYXRvcnMgZXRjLiB3aGljaCBhcmUgbmVlZGVkIGZvcgorICogZGlmZmVyZW50IHB1cnBvc2VzLgorICoKKyAqIFRoZXNlIGRldmljZXMgYXBwZWFyIG9ubHkgYWZ0ZXIgdGhlIE1TSUMgZHJpdmVyIGl0c2VsZiBpcyBpbml0aWFsaXplZCBzbworICogd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBTQ1UgSVBDIGludGVyZmFjZSBpcyByZWFkeS4KKyAqLworc3RhdGljIHN0cnVjdCBtZmRfY2VsbCBtc2ljX290aGVyX2RldnNbXSA9IHsKKwkvKiBBdWRpbyBjb2RlYyBpbiB0aGUgTVNJQyAqLworCXsKKwkJLmlkCQkJPSAtMSwKKwkJLm5hbWUJCQk9ICJzbjk1MDMxIiwKKwl9LAorfTsKKworLyoqCisgKiBpbnRlbF9tc2ljX3JlZ19yZWFkIC0gcmVhZCBhIHNpbmdsZSBNU0lDIHJlZ2lzdGVyCisgKiBAcmVnOiByZWdpc3RlciB0byByZWFkCisgKiBAdmFsOiByZWdpc3RlciB2YWx1ZSBpcyBwbGFjZWQgaGVyZQorICoKKyAqIFJlYWQgYSBzaW5nbGUgcmVnaXN0ZXIgZnJvbSBNU0lDLiBSZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlCisgKiBlcnJubyBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKgorICogRnVuY3Rpb24gbWF5IHNsZWVwLgorICovCitpbnQgaW50ZWxfbXNpY19yZWdfcmVhZCh1bnNpZ25lZCBzaG9ydCByZWcsIHU4ICp2YWwpCit7CisJcmV0dXJuIGludGVsX3NjdV9pcGNfaW9yZWFkOChyZWcsIHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlbF9tc2ljX3JlZ19yZWFkKTsKKworLyoqCisgKiBpbnRlbF9tc2ljX3JlZ193cml0ZSAtIHdyaXRlIGEgc2luZ2xlIE1TSUMgcmVnaXN0ZXIKKyAqIEByZWc6IHJlZ2lzdGVyIHRvIHdyaXRlCisgKiBAdmFsOiB2YWx1ZSB0byB3cml0ZSB0byB0aGF0IHJlZ2lzdGVyCisgKgorICogV3JpdGUgYSBzaW5nbGUgTVNJQyByZWdpc3Rlci4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlCisgKiBlcnJubyBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKgorICogRnVuY3Rpb24gbWF5IHNsZWVwLgorICovCitpbnQgaW50ZWxfbXNpY19yZWdfd3JpdGUodW5zaWduZWQgc2hvcnQgcmVnLCB1OCB2YWwpCit7CisJcmV0dXJuIGludGVsX3NjdV9pcGNfaW93cml0ZTgocmVnLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfbXNpY19yZWdfd3JpdGUpOworCisvKioKKyAqIGludGVsX21zaWNfcmVnX3VwZGF0ZSAtIHVwZGF0ZSBhIHNpbmdsZSBNU0lDIHJlZ2lzdGVyCisgKiBAcmVnOiByZWdpc3RlciB0byB1cGRhdGUKKyAqIEB2YWw6IHZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlcgorICogQG1hc2s6IHNwZWNpZmllcyB3aGljaCBvZiB0aGUgYml0cyBhcmUgdXBkYXRlZCAoJTAgPSBkb24ndCB1cGRhdGUsCisgKiAgICAgICAgJTEgPSB1cGRhdGUpCisgKgorICogUGVyZm9ybSBhbiB1cGRhdGUgdG8gYSByZWdpc3RlciBAcmVnLiBAbWFzayBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2gKKyAqIGJpdHMgYXJlIHVwZGF0ZWQuIFJldHVybnMgJTAgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSBlcnJubyBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICoKKyAqIEZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqLworaW50IGludGVsX21zaWNfcmVnX3VwZGF0ZSh1bnNpZ25lZCBzaG9ydCByZWcsIHU4IHZhbCwgdTggbWFzaykKK3sKKwlyZXR1cm4gaW50ZWxfc2N1X2lwY191cGRhdGVfcmVnaXN0ZXIocmVnLCB2YWwsIG1hc2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfbXNpY19yZWdfdXBkYXRlKTsKKworLyoqCisgKiBpbnRlbF9tc2ljX2J1bGtfcmVhZCAtIHJlYWQgYW4gYXJyYXkgb2YgcmVnaXN0ZXJzCisgKiBAcmVnOiBhcnJheSBvZiByZWdpc3RlciBhZGRyZXNzZXMgdG8gcmVhZAorICogQGJ1ZjogYXJyYXkgd2hlcmUgdGhlIHJlYWQgdmFsdWVzIGFyZSBwbGFjZWQKKyAqIEBjb3VudDogbnVtYmVyIG9mIHJlZ2lzdGVycyB0byByZWFkCisgKgorICogRnVuY3Rpb24gcmVhZHMgQGNvdW50IHJlZ2lzdGVycyBmcm9tIHRoZSBNU0lDIHVzaW5nIGFkZHJlc3NlcyBwYXNzZWQgaW4KKyAqIEByZWcuIFJlYWQgdmFsdWVzIGFyZSBwbGFjZWQgaW4gQGJ1Zi4gUmVhZHMgYXJlIHBlcmZvcm1lZCBhdG9taWNhbGx5CisgKiB3cnQuIE1TSUMuCisgKgorICogUmV0dXJucyAlMCBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIGVycm5vIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqCisgKiBGdW5jdGlvbiBtYXkgc2xlZXAuCisgKi8KK2ludCBpbnRlbF9tc2ljX2J1bGtfcmVhZCh1bnNpZ25lZCBzaG9ydCAqcmVnLCB1OCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaWYgKFdBUk5fT04oY291bnQgPiBTQ1VfSVBDX1JXQlVGX0xJTUlUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaW50ZWxfc2N1X2lwY19yZWFkdihyZWcsIGJ1ZiwgY291bnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfbXNpY19idWxrX3JlYWQpOworCisvKioKKyAqIGludGVsX21zaWNfYnVsa193cml0ZSAtIHdyaXRlIGFuIGFycmF5IG9mIHZhbHVlcyB0byB0aGUgTVNJQyByZWdpc3RlcnMKKyAqIEByZWc6IGFycmF5IG9mIHJlZ2lzdGVycyB0byB3cml0ZQorICogQGJ1ZjogdmFsdWVzIHRvIHdyaXRlIHRvIGVhY2ggcmVnaXN0ZXIKKyAqIEBjb3VudDogbnVtYmVyIG9mIHJlZ2lzdGVycyB0byB3cml0ZQorICoKKyAqIEZ1bmN0aW9uIHdyaXRlcyBAY291bnQgcmVnaXN0ZXJzIGluIEBidWYgdG8gTVNJQy4gV3JpdGVzIGFyZSBwZXJmb3JtZWQKKyAqIGF0b21pY2FsbHkgd3J0IE1TSUMuIFJldHVybnMgJTAgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSBlcnJubyBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICoKKyAqIEZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqLworaW50IGludGVsX21zaWNfYnVsa193cml0ZSh1bnNpZ25lZCBzaG9ydCAqcmVnLCB1OCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaWYgKFdBUk5fT04oY291bnQgPiBTQ1VfSVBDX1JXQlVGX0xJTUlUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaW50ZWxfc2N1X2lwY193cml0ZXYocmVnLCBidWYsIGNvdW50KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX21zaWNfYnVsa193cml0ZSk7CisKKy8qKgorICogaW50ZWxfbXNpY19pcnFfcmVhZCAtIHJlYWQgYSByZWdpc3RlciBmcm9tIGFuIE1TSUMgaW50ZXJydXB0IHRyZWUKKyAqIEBtc2ljOiBNU0lDIGluc3RhbmNlCisgKiBAcmVnOiBpbnRlcnJ1cHQgcmVnaXN0ZXIgKGJldHdlZW4gJUlOVEVMX01TSUNfSVJRTFZMMSBhbmQKKyAqCSAlSU5URUxfTVNJQ19SRVNFVElSUTIpCisgKiBAdmFsOiB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgaXMgcGxhY2VkIGhlcmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGFuIE1TSUMgc3ViZGV2aWNlIGludGVycnVwdCBoYW5kbGVyIHRvIHJlYWQKKyAqIGEgcmVnaXN0ZXIgdmFsdWUgZnJvbSB0aGUgTVNJQyBpbnRlcnJ1cHQgdHJlZS4gSW4gdGhpcyB3YXkgc3ViZGV2aWNlCisgKiBkcml2ZXJzIGRvbid0IGhhdmUgdG8gbWFwIGluIHRoZSBpbnRlcnJ1cHQgdHJlZSB0aGVtc2VsdmVzIGJ1dCBjYW4ganVzdAorICogY2FsbCB0aGlzIGZ1bmN0aW9uIGluc3RlYWQuCisgKgorICogRnVuY3Rpb24gZG9lc24ndCBzbGVlcCBhbmQgaXMgY2FsbGFibGUgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zICUtRUlOVkFMIGlmIEByZWcgaXMgb3V0c2lkZSBvZiB0aGUgYWxsb3dlZCByZWdpc3RlciByZWdpb24uCisgKi8KK2ludCBpbnRlbF9tc2ljX2lycV9yZWFkKHN0cnVjdCBpbnRlbF9tc2ljICptc2ljLCB1bnNpZ25lZCBzaG9ydCByZWcsIHU4ICp2YWwpCit7CisJaWYgKFdBUk5fT04ocmVnIDwgSU5URUxfTVNJQ19JUlFMVkwxIHx8IHJlZyA+IElOVEVMX01TSUNfUkVTRVRJUlEyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqdmFsID0gcmVhZGIobXNpYy0+aXJxX2Jhc2UgKyAocmVnIC0gSU5URUxfTVNJQ19JUlFMVkwxKSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlbF9tc2ljX2lycV9yZWFkKTsKKworc3RhdGljIGludCBfX2RldmluaXQgaW50ZWxfbXNpY19pbml0X2RldmljZXMoc3RydWN0IGludGVsX21zaWMgKm1zaWMpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IG1zaWMtPnBkZXY7CisJc3RydWN0IGludGVsX21zaWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0LCBpOworCisJaWYgKHBkYXRhLT5ncGlvKSB7CisJCXN0cnVjdCBtZmRfY2VsbCAqY2VsbCA9ICZtc2ljX2RldnNbSU5URUxfTVNJQ19CTE9DS19HUElPXTsKKworCQljZWxsLT5wbGF0Zm9ybV9kYXRhID0gcGRhdGEtPmdwaW87CisJCWNlbGwtPnBkYXRhX3NpemUgPSBzaXplb2YoKnBkYXRhLT5ncGlvKTsKKwl9CisKKwlpZiAocGRhdGEtPm9jZCkgeworCQl1bnNpZ25lZCBncGlvID0gcGRhdGEtPm9jZC0+Z3BpbzsKKworCQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKGdwaW8sIEdQSU9GX0lOLCAib2NkX2dwaW8iKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIE9DRCBHUElPXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBncGlvX3RvX2lycShncGlvKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIElSUSBudW1iZXIgZm9yIE9DRCBHUElPXG4iKTsKKwkJCWdwaW9fZnJlZShncGlvKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKiBVcGRhdGUgdGhlIElSUSBudW1iZXIgZm9yIHRoZSBPQ0QgKi8KKwkJcGRhdGEtPmlycVtJTlRFTF9NU0lDX0JMT0NLX09DRF0gPSByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNpY19kZXZzKTsgaSsrKSB7CisJCWlmICghcGRhdGEtPmlycVtpXSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcygmcGRldi0+ZGV2LCAtMSwgJm1zaWNfZGV2c1tpXSwgMSwgTlVMTCwKKwkJCQkgICAgICBwZGF0YS0+aXJxW2ldKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBtZmRfYWRkX2RldmljZXMoJnBkZXYtPmRldiwgMCwgbXNpY19vdGhlcl9kZXZzLAorCQkJICAgICAgQVJSQVlfU0laRShtc2ljX290aGVyX2RldnMpLCBOVUxMLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwltZmRfcmVtb3ZlX2RldmljZXMoJnBkZXYtPmRldik7CisJaWYgKHBkYXRhLT5vY2QpCisJCWdwaW9fZnJlZShwZGF0YS0+b2NkLT5ncGlvKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpbnRlbF9tc2ljX3JlbW92ZV9kZXZpY2VzKHN0cnVjdCBpbnRlbF9tc2ljICptc2ljKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBtc2ljLT5wZGV2OworCXN0cnVjdCBpbnRlbF9tc2ljX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwltZmRfcmVtb3ZlX2RldmljZXMoJnBkZXYtPmRldik7CisKKwlpZiAocGRhdGEtPm9jZCkKKwkJZ3Bpb19mcmVlKHBkYXRhLT5vY2QtPmdwaW8pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpbnRlbF9tc2ljX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGludGVsX21zaWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaW50ZWxfbXNpYyAqbXNpYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1OCBpZDAsIGlkMTsKKwlpbnQgcmV0OworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIHBhc3NlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpcnN0IHZhbGlkYXRlIHRoYXQgd2UgaGF2ZSBhbiBNU0lDIGluIHBsYWNlICovCisJcmV0ID0gaW50ZWxfc2N1X2lwY19pb3JlYWQ4KElOVEVMX01TSUNfSUQwLCAmaWQwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpZGVudGlmeSB0aGUgTVNJQyBjaGlwIChJRDApXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXQgPSBpbnRlbF9zY3VfaXBjX2lvcmVhZDgoSU5URUxfTVNJQ19JRDEsICZpZDEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGlkZW50aWZ5IHRoZSBNU0lDIGNoaXAgKElEMSlcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWlmIChNU0lDX1ZFTkRPUihpZDApICE9IE1TSUNfVkVORE9SKGlkMSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCB2ZW5kb3IgSUQ6ICV4LCAleFxuIiwgaWQwLCBpZDEpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCW1zaWMgPSBremFsbG9jKHNpemVvZigqbXNpYyksIEdGUF9LRVJORUwpOworCWlmICghbXNpYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc2ljLT52ZW5kb3IgPSBNU0lDX1ZFTkRPUihpZDApOworCW1zaWMtPnZlcnNpb24gPSBNU0lDX1ZFUlNJT04oaWQwKTsKKwltc2ljLT5wZGV2ID0gcGRldjsKKworCS8qCisJICogTWFwIGluIHRoZSBNU0lDIGludGVycnVwdCB0cmVlIGFyZWEgaW4gU1JBTS4gVGhpcyBpcyBleHBvc2VkIHRvCisJICogdGhlIGNsaWVudHMgdmlhIGludGVsX21zaWNfaXJxX3JlYWQoKS4KKwkgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgU1JBTSBpb21lbSByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9mcmVlX21zaWM7CisJfQorCisJcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSk7CisJaWYgKCFyZXMpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGZhaWxfZnJlZV9tc2ljOworCX0KKworCW1zaWMtPmlycV9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFtc2ljLT5pcnFfYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIFNSQU0gbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX3JlbGVhc2VfcmVnaW9uOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1zaWMpOworCisJcmV0ID0gaW50ZWxfbXNpY19pbml0X2RldmljZXMobXNpYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBNU0lDIGRldmljZXNcbiIpOworCQlnb3RvIGZhaWxfdW5tYXBfbWVtOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJJbnRlbCBNU0lDIHZlcnNpb24gJWMlZCAodmVuZG9yICUjeClcbiIsCisJCSBNU0lDX01BSk9SKG1zaWMtPnZlcnNpb24pLCBNU0lDX01JTk9SKG1zaWMtPnZlcnNpb24pLAorCQkgbXNpYy0+dmVuZG9yKTsKKworCXJldHVybiAwOworCitmYWlsX3VubWFwX21lbToKKwlpb3VubWFwKG1zaWMtPmlycV9iYXNlKTsKK2ZhaWxfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CitmYWlsX2ZyZWVfbXNpYzoKKwlrZnJlZShtc2ljKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGludGVsX21zaWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGludGVsX21zaWMgKm1zaWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlpbnRlbF9tc2ljX3JlbW92ZV9kZXZpY2VzKG1zaWMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlvdW5tYXAobXNpYy0+aXJxX2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWtmcmVlKG1zaWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGludGVsX21zaWNfZHJpdmVyID0geworCS5wcm9iZQkJPSBpbnRlbF9tc2ljX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaW50ZWxfbXNpY19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJpbnRlbF9tc2ljIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGludGVsX21zaWNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmludGVsX21zaWNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGludGVsX21zaWNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpbnRlbF9tc2ljX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaW50ZWxfbXNpY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaW50ZWxfbXNpY19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEludGVsIE1TSUMiKTsKK01PRFVMRV9BVVRIT1IoIk1pa2EgV2VzdGVyYmVyZyA8bWlrYS53ZXN0ZXJiZXJnQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2p6NDc0MC1hZGMuYyBiL2RyaXZlcnMvbWZkL2p6NDc0MC1hZGMuYwppbmRleCA1NjM2NTRjLi4xZTllZTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMKKysrIGIvZHJpdmVycy9tZmQvano0NzQwLWFkYy5jCkBAIC0zMjgsNyArMzI4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqejQ3NDBfYWRjX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGp6NDc0MF9hZGNfZHJpdmVyID0gewogCS5wcm9iZQk9IGp6NDc0MF9hZGNfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGp6NDc0MF9hZGNfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWF4ODk5Ny5jIGIvZHJpdmVycy9tZmQvbWF4ODk5Ny5jCmluZGV4IGY4MzEwM2IuLjViZTUzYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21heDg5OTcuYworKysgYi9kcml2ZXJzL21mZC9tYXg4OTk3LmMKQEAgLTIzLDcgKzIzLDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk3Lmg+CkBAIC0xNDIsNyArMTQ0LDYgQEAKIAogCW1heDg5OTctPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOwogCW1heDg5OTctPm9ubyA9IHBkYXRhLT5vbm87Ci0JbWF4ODk5Ny0+d2FrZXVwID0gcGRhdGEtPndha2V1cDsKIAogCW11dGV4X2luaXQoJm1heDg5OTctPmlvbG9jayk7CiAKQEAgLTE2OSw2ICsxNzAsOSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9tZmQ7CiAKKwkvKiBNQVg4OTk3IGhhcyBhIHBvd2VyIGJ1dHRvbiBpbnB1dC4gKi8KKwlkZXZpY2VfaW5pdF93YWtldXAobWF4ODk5Ny0+ZGV2LCBwZGF0YS0+d2FrZXVwKTsKKwogCXJldHVybiByZXQ7CiAKIGVycl9tZmQ6CkBAIC0zOTgsNyArNDAyLDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbWF4ODk5N19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisJc3RydWN0IG1heDg5OTdfZGV2ICptYXg4OTk3ID0gaTJjX2dldF9jbGllbnRkYXRhKGkyYyk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJaXJxX3NldF9pcnFfd2FrZShtYXg4OTk3LT5pcnEsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDg5OTdfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisJc3RydWN0IG1heDg5OTdfZGV2ICptYXg4OTk3ID0gaTJjX2dldF9jbGllbnRkYXRhKGkyYyk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJaXJxX3NldF9pcnFfd2FrZShtYXg4OTk3LT5pcnEsIDApOworCXJldHVybiBtYXg4OTk3X2lycV9yZXN1bWUobWF4ODk5Nyk7Cit9CisKIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIG1heDg5OTdfcG0gPSB7CisJLnN1c3BlbmQgPSBtYXg4OTk3X3N1c3BlbmQsCisJLnJlc3VtZSA9IG1heDg5OTdfcmVzdW1lLAogCS5mcmVlemUgPSBtYXg4OTk3X2ZyZWV6ZSwKIAkucmVzdG9yZSA9IG1heDg5OTdfcmVzdG9yZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tYzEzeHh4LWNvcmUuYyBiL2RyaXZlcnMvbWZkL21jMTN4eHgtY29yZS5jCmluZGV4IDdlNGQ0NGIuLmU5NjE5YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21jMTN4eHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL21jMTN4eHgtY29yZS5jCkBAIC0yNiwyMCArMjYsMTAgQEAKIAogCWlycV9oYW5kbGVyX3QgaXJxaGFuZGxlcltNQzEzWFhYX05VTV9JUlFdOwogCXZvaWQgKmlycWRhdGFbTUMxM1hYWF9OVU1fSVJRXTsKLX07Ci0KLXN0cnVjdCBtYzEzNzgzIHsKLQlzdHJ1Y3QgbWMxM3h4eCBtYzEzeHh4OwogCiAJaW50IGFkY2ZsYWdzOwogfTsKIAotc3RydWN0IG1jMTN4eHggKm1jMTM3ODNfdG9fbWMxM3h4eChzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MykKLXsKLQlyZXR1cm4gJm1jMTM3ODMtPm1jMTN4eHg7Ci19Ci1FWFBPUlRfU1lNQk9MKG1jMTM3ODNfdG9fbWMxM3h4eCk7Ci0KICNkZWZpbmUgTUMxM1hYWF9JUlFTVEFUMAkwCiAjZGVmaW5lIE1DMTNYWFhfSVJRU1RBVDBfQURDRE9ORUkJKDEgPDwgMCkKICNkZWZpbmUgTUMxM1hYWF9JUlFTVEFUMF9BRENCSVNET05FSQkoMSA8PCAxKQpAQCAtMTM2LDE0ICsxMjYsMTQgQEAKICNkZWZpbmUgTUMxM1hYWF9SRVZJU0lPTl9GQUIJCSgweDAzIDw8IDExKQogI2RlZmluZSBNQzEzWFhYX1JFVklTSU9OX0lDSURDT0RFCSgweDNmIDw8IDEzKQogCi0jZGVmaW5lIE1DMTM3ODNfQURDMQkJNDQKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FERU4JCSgxIDw8IDApCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9SQU5ECQkoMSA8PCAxKQotI2RlZmluZSBNQzEzNzgzX0FEQzFfQURTRUwJCSgxIDw8IDMpCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9BU0MJCSgxIDw8IDIwKQotI2RlZmluZSBNQzEzNzgzX0FEQzFfQURUUklHSUdOCQkoMSA8PCAyMSkKKyNkZWZpbmUgTUMxM1hYWF9BREMxCQk0NAorI2RlZmluZSBNQzEzWFhYX0FEQzFfQURFTgkJKDEgPDwgMCkKKyNkZWZpbmUgTUMxM1hYWF9BREMxX1JBTkQJCSgxIDw8IDEpCisjZGVmaW5lIE1DMTNYWFhfQURDMV9BRFNFTAkJKDEgPDwgMykKKyNkZWZpbmUgTUMxM1hYWF9BREMxX0FTQwkJKDEgPDwgMjApCisjZGVmaW5lIE1DMTNYWFhfQURDMV9BRFRSSUdJR04JCSgxIDw8IDIxKQogCi0jZGVmaW5lIE1DMTM3ODNfQURDMgkJNDUKKyNkZWZpbmUgTUMxM1hYWF9BREMyCQk0NQogCiAjZGVmaW5lIE1DMTNYWFhfTlVNUkVHUyAweDNmCiAKQEAgLTQ4Nyw3ICs0NzcsNyBAQAogCU1DMTNYWFhfSURfSU5WQUxJRCwKIH07CiAKLWNvbnN0IGNoYXIgKm1jMTN4eHhfY2hpcG5hbWVbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICptYzEzeHh4X2NoaXBuYW1lW10gPSB7CiAJW01DMTNYWFhfSURfTUMxMzc4M10gPSAibWMxMzc4MyIsCiAJW01DMTNYWFhfSURfTUMxMzg5Ml0gPSAibWMxMzg5MiIsCiB9OwpAQCAtNTU4LDggKzU0OCw2IEBACiAJcmV0dXJuIG1jMTN4eHhfY2hpcG5hbWVbZGV2aWQtPmRyaXZlcl9kYXRhXTsKIH0KIAotI2luY2x1ZGUgPGxpbnV4L21mZC9tYzEzNzgzLmg+Ci0KIGludCBtYzEzeHh4X2dldF9mbGFncyhzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eCkKIHsKIAlzdHJ1Y3QgbWMxM3h4eF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CkBAIC01NjksMTUgKzU1NywxNSBAQAogfQogRVhQT1JUX1NZTUJPTChtYzEzeHh4X2dldF9mbGFncyk7CiAKLSNkZWZpbmUgTUMxMzc4M19BREMxX0NIQU4wX1NISUZUCTUKLSNkZWZpbmUgTUMxMzc4M19BREMxX0NIQU4xX1NISUZUCTgKKyNkZWZpbmUgTUMxM1hYWF9BREMxX0NIQU4wX1NISUZUCTUKKyNkZWZpbmUgTUMxM1hYWF9BREMxX0NIQU4xX1NISUZUCTgKIAogc3RydWN0IG1jMTN4eHhfYWRjZG9uZV9kYXRhIHsKIAlzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eDsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogfTsKIAotc3RhdGljIGlycXJldHVybl90IG1jMTM3ODNfaGFuZGxlcl9hZGNkb25lKGludCBpcnEsIHZvaWQgKmRhdGEpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWMxM3h4eF9oYW5kbGVyX2FkY2RvbmUoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbWMxM3h4eF9hZGNkb25lX2RhdGEgKmFkY2RvbmVfZGF0YSA9IGRhdGE7CiAKQEAgLTU4OCwxMiArNTc2LDExIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0jZGVmaW5lIE1DMTM3ODNfQURDX1dPUktJTkcgKDEgPDwgMCkKKyNkZWZpbmUgTUMxM1hYWF9BRENfV09SS0lORyAoMSA8PCAwKQogCi1pbnQgbWMxMzc4M19hZGNfZG9fY29udmVyc2lvbihzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgdW5zaWduZWQgaW50IG1vZGUsCitpbnQgbWMxM3h4eF9hZGNfZG9fY29udmVyc2lvbihzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eCwgdW5zaWduZWQgaW50IG1vZGUsCiAJCXVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgKnNhbXBsZSkKIHsKLQlzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eCA9ICZtYzEzNzgzLT5tYzEzeHh4OwogCXUzMiBhZGMwLCBhZGMxLCBvbGRfYWRjMDsKIAlpbnQgaSwgcmV0OwogCXN0cnVjdCBtYzEzeHh4X2FkY2RvbmVfZGF0YSBhZGNkb25lX2RhdGEgPSB7CkBAIC02MDUsNTEgKzU5Miw1MSBAQAogCiAJbWMxM3h4eF9sb2NrKG1jMTN4eHgpOwogCi0JaWYgKG1jMTM3ODMtPmFkY2ZsYWdzICYgTUMxMzc4M19BRENfV09SS0lORykgeworCWlmIChtYzEzeHh4LT5hZGNmbGFncyAmIE1DMTNYWFhfQURDX1dPUktJTkcpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDsKIAl9CiAKLQltYzEzNzgzLT5hZGNmbGFncyB8PSBNQzEzNzgzX0FEQ19XT1JLSU5HOworCW1jMTN4eHgtPmFkY2ZsYWdzIHw9IE1DMTNYWFhfQURDX1dPUktJTkc7CiAKLQltYzEzeHh4X3JlZ19yZWFkKG1jMTN4eHgsIE1DMTM3ODNfQURDMCwgJm9sZF9hZGMwKTsKKwltYzEzeHh4X3JlZ19yZWFkKG1jMTN4eHgsIE1DMTNYWFhfQURDMCwgJm9sZF9hZGMwKTsKIAotCWFkYzAgPSBNQzEzNzgzX0FEQzBfQURJTkMxIHwgTUMxMzc4M19BREMwX0FESU5DMjsKLQlhZGMxID0gTUMxMzc4M19BREMxX0FERU4gfCBNQzEzNzgzX0FEQzFfQURUUklHSUdOIHwgTUMxMzc4M19BREMxX0FTQzsKKwlhZGMwID0gTUMxM1hYWF9BREMwX0FESU5DMSB8IE1DMTNYWFhfQURDMF9BRElOQzI7CisJYWRjMSA9IE1DMTNYWFhfQURDMV9BREVOIHwgTUMxM1hYWF9BREMxX0FEVFJJR0lHTiB8IE1DMTNYWFhfQURDMV9BU0M7CiAKIAlpZiAoY2hhbm5lbCA+IDcpCi0JCWFkYzEgfD0gTUMxMzc4M19BREMxX0FEU0VMOworCQlhZGMxIHw9IE1DMTNYWFhfQURDMV9BRFNFTDsKIAogCXN3aXRjaCAobW9kZSkgewotCWNhc2UgTUMxMzc4M19BRENfTU9ERV9UUzoKLQkJYWRjMCB8PSBNQzEzNzgzX0FEQzBfQURSRUZFTiB8IE1DMTM3ODNfQURDMF9UU01PRDAgfAotCQkJTUMxMzc4M19BREMwX1RTTU9EMTsKLQkJYWRjMSB8PSA0IDw8IE1DMTM3ODNfQURDMV9DSEFOMV9TSElGVDsKKwljYXNlIE1DMTNYWFhfQURDX01PREVfVFM6CisJCWFkYzAgfD0gTUMxM1hYWF9BREMwX0FEUkVGRU4gfCBNQzEzWFhYX0FEQzBfVFNNT0QwIHwKKwkJCU1DMTNYWFhfQURDMF9UU01PRDE7CisJCWFkYzEgfD0gNCA8PCBNQzEzWFhYX0FEQzFfQ0hBTjFfU0hJRlQ7CiAJCWJyZWFrOwogCi0JY2FzZSBNQzEzNzgzX0FEQ19NT0RFX1NJTkdMRV9DSEFOOgotCQlhZGMwIHw9IG9sZF9hZGMwICYgTUMxMzc4M19BREMwX1RTTU9EX01BU0s7Ci0JCWFkYzEgfD0gKGNoYW5uZWwgJiAweDcpIDw8IE1DMTM3ODNfQURDMV9DSEFOMF9TSElGVDsKLQkJYWRjMSB8PSBNQzEzNzgzX0FEQzFfUkFORDsKKwljYXNlIE1DMTNYWFhfQURDX01PREVfU0lOR0xFX0NIQU46CisJCWFkYzAgfD0gb2xkX2FkYzAgJiBNQzEzWFhYX0FEQzBfVFNNT0RfTUFTSzsKKwkJYWRjMSB8PSAoY2hhbm5lbCAmIDB4NykgPDwgTUMxM1hYWF9BREMxX0NIQU4wX1NISUZUOworCQlhZGMxIHw9IE1DMTNYWFhfQURDMV9SQU5EOwogCQlicmVhazsKIAotCWNhc2UgTUMxMzc4M19BRENfTU9ERV9NVUxUX0NIQU46Ci0JCWFkYzAgfD0gb2xkX2FkYzAgJiBNQzEzNzgzX0FEQzBfVFNNT0RfTUFTSzsKLQkJYWRjMSB8PSA0IDw8IE1DMTM3ODNfQURDMV9DSEFOMV9TSElGVDsKKwljYXNlIE1DMTNYWFhfQURDX01PREVfTVVMVF9DSEFOOgorCQlhZGMwIHw9IG9sZF9hZGMwICYgTUMxM1hYWF9BREMwX1RTTU9EX01BU0s7CisJCWFkYzEgfD0gNCA8PCBNQzEzWFhYX0FEQzFfQ0hBTjFfU0hJRlQ7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJbWMxMzc4M191bmxvY2sobWMxMzc4Myk7CisJCW1jMTN4eHhfdW5sb2NrKG1jMTN4eHgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkZXZfZGJnKCZtYzEzNzgzLT5tYzEzeHh4LnNwaWRldi0+ZGV2LCAiJXM6IHJlcXVlc3QgaXJxXG4iLCBfX2Z1bmNfXyk7Ci0JbWMxM3h4eF9pcnFfcmVxdWVzdChtYzEzeHh4LCBNQzEzNzgzX0lSUV9BRENET05FLAotCQkJbWMxMzc4M19oYW5kbGVyX2FkY2RvbmUsIF9fZnVuY19fLCAmYWRjZG9uZV9kYXRhKTsKLQltYzEzeHh4X2lycV9hY2sobWMxM3h4eCwgTUMxMzc4M19JUlFfQURDRE9ORSk7CisJZGV2X2RiZygmbWMxM3h4eC0+c3BpZGV2LT5kZXYsICIlczogcmVxdWVzdCBpcnFcbiIsIF9fZnVuY19fKTsKKwltYzEzeHh4X2lycV9yZXF1ZXN0KG1jMTN4eHgsIE1DMTNYWFhfSVJRX0FEQ0RPTkUsCisJCQltYzEzeHh4X2hhbmRsZXJfYWRjZG9uZSwgX19mdW5jX18sICZhZGNkb25lX2RhdGEpOworCW1jMTN4eHhfaXJxX2FjayhtYzEzeHh4LCBNQzEzWFhYX0lSUV9BRENET05FKTsKIAotCW1jMTN4eHhfcmVnX3dyaXRlKG1jMTN4eHgsIE1DMTM3ODNfQURDMCwgYWRjMCk7Ci0JbWMxM3h4eF9yZWdfd3JpdGUobWMxM3h4eCwgTUMxMzc4M19BREMxLCBhZGMxKTsKKwltYzEzeHh4X3JlZ193cml0ZShtYzEzeHh4LCBNQzEzWFhYX0FEQzAsIGFkYzApOworCW1jMTN4eHhfcmVnX3dyaXRlKG1jMTN4eHgsIE1DMTNYWFhfQURDMSwgYWRjMSk7CiAKIAltYzEzeHh4X3VubG9jayhtYzEzeHh4KTsKIApAQCAtNjYwLDI3ICs2NDcsMjcgQEAKIAogCW1jMTN4eHhfbG9jayhtYzEzeHh4KTsKIAotCW1jMTN4eHhfaXJxX2ZyZWUobWMxM3h4eCwgTUMxMzc4M19JUlFfQURDRE9ORSwgJmFkY2RvbmVfZGF0YSk7CisJbWMxM3h4eF9pcnFfZnJlZShtYzEzeHh4LCBNQzEzWFhYX0lSUV9BRENET05FLCAmYWRjZG9uZV9kYXRhKTsKIAogCWlmIChyZXQgPiAwKQogCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CiAJCQlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKG1jMTN4eHgsCi0JCQkJCU1DMTM3ODNfQURDMiwgJnNhbXBsZVtpXSk7CisJCQkJCU1DMTNYWFhfQURDMiwgJnNhbXBsZVtpXSk7CiAJCQlpZiAocmV0KQogCQkJCWJyZWFrOwogCQl9CiAKLQlpZiAobW9kZSA9PSBNQzEzNzgzX0FEQ19NT0RFX1RTKQorCWlmIChtb2RlID09IE1DMTNYWFhfQURDX01PREVfVFMpCiAJCS8qIHJlc3RvcmUgVFNNT0QgKi8KLQkJbWMxM3h4eF9yZWdfd3JpdGUobWMxM3h4eCwgTUMxMzc4M19BREMwLCBvbGRfYWRjMCk7CisJCW1jMTN4eHhfcmVnX3dyaXRlKG1jMTN4eHgsIE1DMTNYWFhfQURDMCwgb2xkX2FkYzApOwogCi0JbWMxMzc4My0+YWRjZmxhZ3MgJj0gfk1DMTM3ODNfQURDX1dPUktJTkc7CisJbWMxM3h4eC0+YWRjZmxhZ3MgJj0gfk1DMTNYWFhfQURDX1dPUktJTkc7CiBvdXQ6CiAJbWMxM3h4eF91bmxvY2sobWMxM3h4eCk7CiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwobWMxMzc4M19hZGNfZG9fY29udmVyc2lvbik7CitFWFBPUlRfU1lNQk9MX0dQTChtYzEzeHh4X2FkY19kb19jb252ZXJzaW9uKTsKIAogc3RhdGljIGludCBtYzEzeHh4X2FkZF9zdWJkZXZpY2VfcGRhdGEoc3RydWN0IG1jMTN4eHggKm1jMTN4eHgsCiAJCWNvbnN0IGNoYXIgKmZvcm1hdCwgdm9pZCAqcGRhdGEsIHNpemVfdCBwZGF0YV9zaXplKQpAQCAtNzE2LDYgKzcwMywxMSBAQAogCWVudW0gbWMxM3h4eF9pZCBpZDsKIAlpbnQgcmV0OwogCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImludmFsaWQgcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCW1jMTN4eHggPSBremFsbG9jKHNpemVvZigqbWMxM3h4eCksIEdGUF9LRVJORUwpOwogCWlmICghbWMxM3h4eCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03NjMsMTAgKzc1NSw4IEBACiAJaWYgKHBkYXRhLT5mbGFncyAmIE1DMTNYWFhfVVNFX0NPREVDKQogCQltYzEzeHh4X2FkZF9zdWJkZXZpY2UobWMxM3h4eCwgIiVzLWNvZGVjIik7CiAKLQlpZiAocGRhdGEtPmZsYWdzICYgTUMxM1hYWF9VU0VfUkVHVUxBVE9SKSB7Ci0JCW1jMTN4eHhfYWRkX3N1YmRldmljZV9wZGF0YShtYzEzeHh4LCAiJXMtcmVndWxhdG9yIiwKLQkJCQkmcGRhdGEtPnJlZ3VsYXRvcnMsIHNpemVvZihwZGF0YS0+cmVndWxhdG9ycykpOwotCX0KKwltYzEzeHh4X2FkZF9zdWJkZXZpY2VfcGRhdGEobWMxM3h4eCwgIiVzLXJlZ3VsYXRvciIsCisJCSZwZGF0YS0+cmVndWxhdG9ycywgc2l6ZW9mKHBkYXRhLT5yZWd1bGF0b3JzKSk7CiAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxM1hYWF9VU0VfUlRDKQogCQltYzEzeHh4X2FkZF9zdWJkZXZpY2UobWMxM3h4eCwgIiVzLXJ0YyIpOwpAQCAtNzc0LDEwICs3NjQsMTQgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxM1hYWF9VU0VfVE9VQ0hTQ1JFRU4pCiAJCW1jMTN4eHhfYWRkX3N1YmRldmljZShtYzEzeHh4LCAiJXMtdHMiKTsKIAotCWlmIChwZGF0YS0+ZmxhZ3MgJiBNQzEzWFhYX1VTRV9MRUQpCisJaWYgKHBkYXRhLT5sZWRzKQogCQltYzEzeHh4X2FkZF9zdWJkZXZpY2VfcGRhdGEobWMxM3h4eCwgIiVzLWxlZCIsCiAJCQkJcGRhdGEtPmxlZHMsIHNpemVvZigqcGRhdGEtPmxlZHMpKTsKIAorCWlmIChwZGF0YS0+YnV0dG9ucykKKwkJbWMxM3h4eF9hZGRfc3ViZGV2aWNlX3BkYXRhKG1jMTN4eHgsICIlcy1wd3JidXR0b24iLAorCQkJCXBkYXRhLT5idXR0b25zLCBzaXplb2YoKnBkYXRhLT5idXR0b25zKSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWVuZWxhdXMuYyBiL2RyaXZlcnMvbWZkL21lbmVsYXVzLmMKaW5kZXggOWNlZThlNy4uY2I0OTEwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWVuZWxhdXMuYworKysgYi9kcml2ZXJzL21mZC9tZW5lbGF1cy5jCkBAIC00NCw3ICs0NCw3IEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tZW5lbGF1cy5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkJIm1lbmVsYXVzIgpAQCAtMTIyNiw3ICsxMjI2LDcgQEAKIAltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfTUNUX0NUUkwxLCAweDczKTsKIAogCWlmIChjbGllbnQtPmlycSA+IDApIHsKLQkJZXJyID0gcmVxdWVzdF9pcnEoY2xpZW50LT5pcnEsIG1lbmVsYXVzX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJZXJyID0gcmVxdWVzdF9pcnEoY2xpZW50LT5pcnEsIG1lbmVsYXVzX2lycSwgMCwKIAkJCQkgIERSSVZFUl9OQU1FLCBtZW5lbGF1cyk7CiAJCWlmIChlcnIpIHsKIAkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAgImNhbid0IGdldCBJUlEgJWQsIGVyciAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21mZC1jb3JlLmMgYi9kcml2ZXJzL21mZC9tZmQtY29yZS5jCmluZGV4IDA5MDI1MjMuLjBmNTkyMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21mZC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvbWZkLWNvcmUuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogaW50IG1mZF9jZWxsX2VuYWJsZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcGNmNTA2MzMtY29yZS5jIGIvZHJpdmVycy9tZmQvcGNmNTA2MzMtY29yZS5jCmluZGV4IDU3ODY4NDE2Li5mZjFhN2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9wY2Y1MDYzMy1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvcGNmNTA2MzMtY29yZS5jCkBAIC0yMyw0NSArMjMsMjIgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmg+CiAKLXN0YXRpYyBpbnQgX19wY2Y1MDYzM19yZWFkKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCB1OCByZWcsIGludCBudW0sIHU4ICpkYXRhKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShwY2YtPmkyY19jbGllbnQsIHJlZywKLQkJCQludW0sIGRhdGEpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKHBjZi0+ZGV2LCAiRXJyb3IgcmVhZGluZyAlZCByZWdzIGF0ICVkXG4iLCBudW0sIHJlZyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fcGNmNTA2MzNfd3JpdGUoc3RydWN0IHBjZjUwNjMzICpwY2YsIHU4IHJlZywgaW50IG51bSwgdTggKmRhdGEpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShwY2YtPmkyY19jbGllbnQsIHJlZywKLQkJCQludW0sIGRhdGEpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKHBjZi0+ZGV2LCAiRXJyb3Igd3JpdGluZyAlZCByZWdzIGF0ICVkXG4iLCBudW0sIHJlZyk7Ci0KLQlyZXR1cm4gcmV0OwotCi19Ci0KIC8qIFJlYWQgYSBibG9jayBvZiB1cCB0byAzMiByZWdzICAqLwogaW50IHBjZjUwNjMzX3JlYWRfYmxvY2soc3RydWN0IHBjZjUwNjMzICpwY2YsIHU4IHJlZywKIAkJCQkJaW50IG5yX3JlZ3MsIHU4ICpkYXRhKQogewogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZwY2YtPmxvY2spOwotCXJldCA9IF9fcGNmNTA2MzNfcmVhZChwY2YsIHJlZywgbnJfcmVncywgZGF0YSk7Ci0JbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOworCXJldCA9IHJlZ21hcF9yYXdfcmVhZChwY2YtPnJlZ21hcCwgcmVnLCBkYXRhLCBucl9yZWdzKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBucl9yZWdzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNmNTA2MzNfcmVhZF9ibG9jayk7CiAKQEAgLTcxLDIxICs0OCwyMiBAQAogewogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZwY2YtPmxvY2spOwotCXJldCA9IF9fcGNmNTA2MzNfd3JpdGUocGNmLCByZWcsIG5yX3JlZ3MsIGRhdGEpOwotCW11dGV4X3VubG9jaygmcGNmLT5sb2NrKTsKKwlyZXQgPSByZWdtYXBfcmF3X3dyaXRlKHBjZi0+cmVnbWFwLCByZWcsIGRhdGEsIG5yX3JlZ3MpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIG5yX3JlZ3M7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2Y1MDYzM193cml0ZV9ibG9jayk7CiAKIHU4IHBjZjUwNjMzX3JlZ19yZWFkKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCB1OCByZWcpCiB7Ci0JdTggdmFsOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKIAotCW11dGV4X2xvY2soJnBjZi0+bG9jayk7Ci0JX19wY2Y1MDYzM19yZWFkKHBjZiwgcmVnLCAxLCAmdmFsKTsKLQltdXRleF91bmxvY2soJnBjZi0+bG9jayk7CisJcmV0ID0gcmVnbWFwX3JlYWQocGNmLT5yZWdtYXAsIHJlZywgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtMTsKIAogCXJldHVybiB2YWw7CiB9CkBAIC05Myw1NiArNzEsMTkgQEAKIAogaW50IHBjZjUwNjMzX3JlZ193cml0ZShzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgdTggcmVnLCB1OCB2YWwpCiB7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJnBjZi0+bG9jayk7Ci0JcmV0ID0gX19wY2Y1MDYzM193cml0ZShwY2YsIHJlZywgMSwgJnZhbCk7Ci0JbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcmVnbWFwX3dyaXRlKHBjZi0+cmVnbWFwLCByZWcsIHZhbCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2Y1MDYzM19yZWdfd3JpdGUpOwogCiBpbnQgcGNmNTA2MzNfcmVnX3NldF9iaXRfbWFzayhzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgdTggcmVnLCB1OCBtYXNrLCB1OCB2YWwpCiB7Ci0JaW50IHJldDsKLQl1OCB0bXA7Ci0KLQl2YWwgJj0gbWFzazsKLQotCW11dGV4X2xvY2soJnBjZi0+bG9jayk7Ci0JcmV0ID0gX19wY2Y1MDYzM19yZWFkKHBjZiwgcmVnLCAxLCAmdG1wKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQl0bXAgJj0gfm1hc2s7Ci0JdG1wIHw9IHZhbDsKLQlyZXQgPSBfX3BjZjUwNjMzX3dyaXRlKHBjZiwgcmVnLCAxLCAmdG1wKTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmcGNmLT5sb2NrKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhwY2YtPnJlZ21hcCwgcmVnLCBtYXNrLCB2YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNmNTA2MzNfcmVnX3NldF9iaXRfbWFzayk7CiAKIGludCBwY2Y1MDYzM19yZWdfY2xlYXJfYml0cyhzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgdTggcmVnLCB1OCB2YWwpCiB7Ci0JaW50IHJldDsKLQl1OCB0bXA7Ci0KLQltdXRleF9sb2NrKCZwY2YtPmxvY2spOwotCXJldCA9IF9fcGNmNTA2MzNfcmVhZChwY2YsIHJlZywgMSwgJnRtcCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JdG1wICY9IH52YWw7Ci0JcmV0ID0gX19wY2Y1MDYzM193cml0ZShwY2YsIHJlZywgMSwgJnRtcCk7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJnBjZi0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocGNmLT5yZWdtYXAsIHJlZywgdmFsLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX3JlZ19jbGVhcl9iaXRzKTsKIApAQCAtMjUxLDYgKzE5MiwxMSBAQAogCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocGNmNTA2MzNfcG0sIHBjZjUwNjMzX3N1c3BlbmQsIHBjZjUwNjMzX3Jlc3VtZSk7CiAKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBwY2Y1MDYzM19yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBjZjUwNjMzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkcykKIHsKQEAgLTI3MiwxNiArMjE4LDIzIEBACiAKIAltdXRleF9pbml0KCZwY2YtPmxvY2spOwogCisJcGNmLT5yZWdtYXAgPSByZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmcGNmNTA2MzNfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihwY2YtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihwY2YtPnJlZ21hcCk7CisJCWRldl9lcnIocGNmLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgbWFwOiAlZFxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcGNmKTsKIAlwY2YtPmRldiA9ICZjbGllbnQtPmRldjsKLQlwY2YtPmkyY19jbGllbnQgPSBjbGllbnQ7CiAKIAl2ZXJzaW9uID0gcGNmNTA2MzNfcmVnX3JlYWQocGNmLCAwKTsKIAl2YXJpYW50ID0gcGNmNTA2MzNfcmVnX3JlYWQocGNmLCAxKTsKIAlpZiAodmVyc2lvbiA8IDAgfHwgdmFyaWFudCA8IDApIHsKIAkJZGV2X2VycihwY2YtPmRldiwgIlVuYWJsZSB0byBwcm9iZSBwY2Y1MDYzM1xuIik7CiAJCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2ZyZWU7CisJCWdvdG8gZXJyX3JlZ21hcDsKIAl9CiAKIAlkZXZfaW5mbyhwY2YtPmRldiwgIlByb2JlZCBkZXZpY2UgdmVyc2lvbiAlZCB2YXJpYW50ICVkXG4iLApAQCAtMzI4LDYgKzI4MSw4IEBACiAKIAlyZXR1cm4gMDsKIAorZXJyX3JlZ21hcDoKKwlyZWdtYXBfZXhpdChwY2YtPnJlZ21hcCk7CiBlcnJfZnJlZToKIAlrZnJlZShwY2YpOwogCkBAIC0zNTEsNiArMzA2LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgUENGNTA2MzNfTlVNX1JFR1VMQVRPUlM7IGkrKykKIAkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGNmLT5yZWd1bGF0b3JfcGRldltpXSk7CiAKKwlyZWdtYXBfZXhpdChwY2YtPnJlZ21hcCk7CiAJa2ZyZWUocGNmKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcGNmNTA2MzMtaXJxLmMgYi9kcml2ZXJzL21mZC9wY2Y1MDYzMy1pcnEuYwppbmRleCAxYjAxOTJmLi4wNDhhM2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9wY2Y1MDYzMy1pcnEuYworKysgYi9kcml2ZXJzL21mZC9wY2Y1MDYzMy1pcnEuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvbWZkL3BjZjUwNjMzL2NvcmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RjMzU4OXguYyBiL2RyaXZlcnMvbWZkL3RjMzU4OXguYwppbmRleCBjMjdlNTE1Li5kZTk3OTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90YzM1ODl4LmMKKysrIGIvZHJpdmVycy9tZmQvdGMzNTg5eC5jCkBAIC0zNTcsNiArMzU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCB0YzM1ODl4X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB0YzM1ODl4ICp0YzM1ODl4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC0zODcsNiArMzg4LDcgQEAKIAogc3RhdGljIGNvbnN0IFNJTVBMRV9ERVZfUE1fT1BTKHRjMzU4OXhfZGV2X3BtX29wcywgdGMzNTg5eF9zdXNwZW5kLAogCQkJCQkJdGMzNTg5eF9yZXN1bWUpOworI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0YzM1ODl4X2lkW10gPSB7CiAJeyAidGMzNTg5eCIsIDI0IH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90aW1iZXJkYWxlLmMgYi9kcml2ZXJzL21mZC90aW1iZXJkYWxlLmMKaW5kZXggNjk2ODc5ZS4uMDJkNjU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdGltYmVyZGFsZS5jCisrKyBiL2RyaXZlcnMvbWZkL3RpbWJlcmRhbGUuYwpAQCAtNjk3LDcgKzY5Nyw3IEBACiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiVGhlIGRyaXZlciBzdXBwb3J0cyBhbiBvbGRlciAiCiAJCQkidmVyc2lvbiBvZiB0aGUgRlBHQSwgcGxlYXNlIHVwZGF0ZSB0aGUgZHJpdmVyIHRvICIKIAkJCSJzdXBwb3J0ICVkLiVkXG4iLCBwcml2LT5mdy5tYWpvciwgcHJpdi0+ZncubWlub3IpOwotCQlnb3RvIGVycl9pb3JlbWFwOworCQlnb3RvIGVycl9jb25maWc7CiAJfQogCWlmIChwcml2LT5mdy5tYWpvciA8IFRJTUJfU1VQUE9SVEVEX01BSk9SIHx8CiAJCXByaXYtPmZ3Lm1pbm9yIDwgVElNQl9SRVFVSVJFRF9NSU5PUikgewpAQCAtNzA1LDEzICs3MDUsMTMgQEAKIAkJCSJwbGVhc2UgdXBncmFkZSB0aGUgRlBHQSB0byBhdCBsZWFzdDogJWQuJWRcbiIsCiAJCQlwcml2LT5mdy5tYWpvciwgcHJpdi0+ZncubWlub3IsCiAJCQlUSU1CX1NVUFBPUlRFRF9NQUpPUiwgVElNQl9SRVFVSVJFRF9NSU5PUik7Ci0JCWdvdG8gZXJyX2lvcmVtYXA7CisJCWdvdG8gZXJyX2NvbmZpZzsKIAl9CiAKIAltc2l4X2VudHJpZXMgPSBremFsbG9jKFRJTUJFUkRBTEVfTlJfSVJRUyAqIHNpemVvZigqbXNpeF9lbnRyaWVzKSwKIAkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFtc2l4X2VudHJpZXMpCi0JCWdvdG8gZXJyX2lvcmVtYXA7CisJCWdvdG8gZXJyX2NvbmZpZzsKIAogCWZvciAoaSA9IDA7IGkgPCBUSU1CRVJEQUxFX05SX0lSUVM7IGkrKykKIAkJbXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKQEAgLTgyNSw2ICs4MjUsOCBAQAogZXJyX2NyZWF0ZV9maWxlOgogCXBjaV9kaXNhYmxlX21zaXgoZGV2KTsKIGVycl9tc2l4OgorCWtmcmVlKG1zaXhfZW50cmllcyk7CitlcnJfY29uZmlnOgogCWlvdW5tYXAocHJpdi0+Y3RsX21lbWJhc2UpOwogZXJyX2lvcmVtYXA6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHByaXYtPmN0bF9tYXBiYXNlLCBDSElQQ1RMU0laRSk7CkBAIC04MzMsNyArODM1LDYgQEAKIGVycl9zdGFydDoKIAlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKIGVycl9lbmFibGU6Ci0Ja2ZyZWUobXNpeF9lbnRyaWVzKTsKIAlrZnJlZShwcml2KTsKIAlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RtaW9fY29yZS5jIGIvZHJpdmVycy9tZmQvdG1pb19jb3JlLmMKaW5kZXggZWRkYzE5YS4uODNhZjc4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdG1pb19jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvdG1pb19jb3JlLmMKQEAgLTYsNiArNiw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3RtaW8uaD4KIAogaW50IHRtaW9fY29yZV9tbWNfZW5hYmxlKHZvaWQgX19pb21lbSAqY25mLCBpbnQgc2hpZnQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RwczY1OTEyLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3RwczY1OTEyLWNvcmUuYwppbmRleCA5NTViYzAwLi41ZmVjMjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTkxMi1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvdHBzNjU5MTItY29yZS5jCkBAIC0xMzEsOSArMTMxLDYgQEAKIAlpZiAoaW5pdF9kYXRhID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5pdF9kYXRhLT5pcnEgPSBwbWljX3BsYXRfZGF0YS0+aXJxOwotCWluaXRfZGF0YS0+aXJxX2Jhc2UgPSBwbWljX3BsYXRfZGF0YS0+aXJxOwotCiAJbXV0ZXhfaW5pdCgmdHBzNjU5MTItPmlvX211dGV4KTsKIAlkZXZfc2V0X2RydmRhdGEodHBzNjU5MTItPmRldiwgdHBzNjU5MTIpOwogCkBAIC0xNTMsMTAgKzE1MCwxMyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIAorCWluaXRfZGF0YS0+aXJxID0gcG1pY19wbGF0X2RhdGEtPmlycTsKKwlpbml0X2RhdGEtPmlycV9iYXNlID0gcG1pY19wbGF0X2RhdGEtPmlycTsKIAlyZXQgPSB0cHM2NTkxMl9pcnFfaW5pdCh0cHM2NTkxMiwgaW5pdF9kYXRhLT5pcnEsIGluaXRfZGF0YSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyOwogCisJa2ZyZWUoaW5pdF9kYXRhKTsKIAlyZXR1cm4gcmV0OwogCiBlcnI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90d2wtY29yZS5jIGIvZHJpdmVycy9tZmQvdHdsLWNvcmUuYwppbmRleCAwMWVjZmVlLi5iZmJkNjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2wtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtMTA5LDcgKzExMCw3IEBACiAjZGVmaW5lIHR3bF9oYXNfd2F0Y2hkb2coKSAgICAgICAgZmFsc2UKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9DT0RFQykgfHwgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9DT0RFQ19NT0RVTEUpIHx8XAorI2lmIGRlZmluZWQoQ09ORklHX01GRF9UV0w0MDMwX0FVRElPKSB8fCBkZWZpbmVkKENPTkZJR19NRkRfVFdMNDAzMF9BVURJT19NT0RVTEUpIHx8XAogCWRlZmluZWQoQ09ORklHX1RXTDYwNDBfQ09SRSkgfHwgZGVmaW5lZChDT05GSUdfVFdMNjA0MF9DT1JFX01PRFVMRSkKICNkZWZpbmUgdHdsX2hhc19jb2RlYygpCXRydWUKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90d2w0MDMwLWlycS5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1pcnEuYwppbmRleCA4YTdlZTMxLi5mMDYyYzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2w0MDMwLWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KQEAgLTI3OCw1OSArMjc3LDYgQEAKIAogc3RhdGljIHVuc2lnbmVkIHR3bDQwMzBfaXJxX2Jhc2U7CiAKLXN0YXRpYyBzdHJ1Y3QgY29tcGxldGlvbiBpcnFfZXZlbnQ7Ci0KLS8qCi0gKiBUaGlzIHRocmVhZCBwcm9jZXNzZXMgaW50ZXJydXB0cyByZXBvcnRlZCBieSB0aGUgUHJpbWFyeSBJbnRlcnJ1cHQgSGFuZGxlci4KLSAqLwotc3RhdGljIGludCB0d2w0MDMwX2lycV90aHJlYWQodm9pZCAqZGF0YSkKLXsKLQlsb25nIGlycSA9IChsb25nKWRhdGE7Ci0Jc3RhdGljIHVuc2lnbmVkIGkyY19lcnJvcnM7Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heF9pMmNfZXJyb3JzID0gMTAwOwotCi0KLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWludCByZXQ7Ci0JCWludCBtb2R1bGVfaXJxOwotCQl1OCBwaWhfaXNyOwotCi0JCS8qIFdhaXQgZm9yIElSUSwgdGhlbiByZWFkIFBJSCBpcnEgc3RhdHVzIChhbHNvIGJsb2NraW5nKSAqLwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmlycV9ldmVudCk7Ci0KLQkJcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX1BJSCwgJnBpaF9pc3IsCi0JCQkJCSAgUkVHX1BJSF9JU1JfUDEpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl93YXJuaW5nKCJ0d2w0MDMwOiBJMkMgZXJyb3IgJWQgcmVhZGluZyBQSUggSVNSXG4iLAotCQkJCQlyZXQpOwotCQkJaWYgKCsraTJjX2Vycm9ycyA+PSBtYXhfaTJjX2Vycm9ycykgewotCQkJCXByaW50ayhLRVJOX0VSUiAiTWF4aW11bSBJMkMgZXJyb3IgY291bnQiCi0JCQkJCQkiIGV4Y2VlZGVkLiAgVGVybWluYXRpbmcgJXMuXG4iLAotCQkJCQkJX19mdW5jX18pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY29tcGxldGUoJmlycV9ldmVudCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIHRoZXNlIGhhbmRsZXJzIGRlYWwgd2l0aCB0aGUgcmVsZXZhbnQgU0lIIGlycSBzdGF0dXMgKi8KLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJZm9yIChtb2R1bGVfaXJxID0gdHdsNDAzMF9pcnFfYmFzZTsKLQkJCQlwaWhfaXNyOwotCQkJCXBpaF9pc3IgPj49IDEsIG1vZHVsZV9pcnErKykgewotCQkJaWYgKHBpaF9pc3IgJiAweDEpCi0JCQkJZ2VuZXJpY19oYW5kbGVfaXJxKG1vZHVsZV9pcnEpOwotCQl9Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCQllbmFibGVfaXJxKGlycSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBoYW5kbGVfdHdsNDAzMF9waWgoKSBpcyB0aGUgZGVzYy0+aGFuZGxlIG1ldGhvZCBmb3IgdGhlIHR3bDQwMzAgaW50ZXJydXB0LgogICogVGhpcyBpcyBhIGNoYWluZWQgaW50ZXJydXB0LCBzbyB0aGVyZSBpcyBubyBkZXNjLT5hY3Rpb24gbWV0aG9kIGZvciBpdC4KQEAgLTM0Miw5ICsyODgsMjUgQEAKICAqLwogc3RhdGljIGlycXJldHVybl90IGhhbmRsZV90d2w0MDMwX3BpaChpbnQgaXJxLCB2b2lkICpkZXZpZCkKIHsKLQkvKiBBY2tub3dsZWRnZSwgY2xlYXIgKkFORCogbWFzayB0aGUgaW50ZXJydXB0Li4uICovCi0JZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JY29tcGxldGUoZGV2aWQpOworCWludAkJbW9kdWxlX2lycTsKKwlpcnFyZXR1cm5fdAlyZXQ7CisJdTgJCXBpaF9pc3I7CisKKwlyZXQgPSB0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUElILCAmcGloX2lzciwKKwkJCVJFR19QSUhfSVNSX1AxKTsKKwlpZiAocmV0KSB7CisJCXByX3dhcm5pbmcoInR3bDQwMzA6IEkyQyBlcnJvciAlZCByZWFkaW5nIFBJSCBJU1JcbiIsIHJldCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiB0aGVzZSBoYW5kbGVycyBkZWFsIHdpdGggdGhlIHJlbGV2YW50IFNJSCBpcnEgc3RhdHVzICovCisJZm9yIChtb2R1bGVfaXJxID0gdHdsNDAzMF9pcnFfYmFzZTsKKwkJCXBpaF9pc3I7CisJCQlwaWhfaXNyID4+PSAxLCBtb2R1bGVfaXJxKyspIHsKKwkJaWYgKHBpaF9pc3IgJiAweDEpCisJCQloYW5kbGVfbmVzdGVkX2lycShtb2R1bGVfaXJxKTsKKwl9CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNDYwLDExNCArNDIyLDE4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2loX2FnZW50X2xvY2spOwotCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwotCiBzdHJ1Y3Qgc2loX2FnZW50IHsKIAlpbnQJCQlpcnFfYmFzZTsKIAljb25zdCBzdHJ1Y3Qgc2loCSpzaWg7CiAKIAl1MzIJCQlpbXI7CiAJYm9vbAkJCWltcl9jaGFuZ2VfcGVuZGluZzsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbWFza193b3JrOwogCiAJdTMyCQkJZWRnZV9jaGFuZ2U7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CWVkZ2Vfd29yazsKKworCXN0cnVjdCBtdXRleAkJaXJxX2xvY2s7CiB9OwogCi1zdGF0aWMgdm9pZCB0d2w0MDMwX3NpaF9kb19tYXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgc2loX2FnZW50CSphZ2VudDsKLQljb25zdCBzdHJ1Y3Qgc2loCSpzaWg7Ci0JdW5pb24gewotCQl1OAlieXRlc1s0XTsKLQkJdTMyCXdvcmQ7Ci0JfQkJCWltcjsKLQlpbnQJCQlzdGF0dXM7Ci0KLQlhZ2VudCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2loX2FnZW50LCBtYXNrX3dvcmspOwotCi0JLyogc2VlIHdoYXQgd29yayB3ZSBoYXZlICovCi0Jc3Bpbl9sb2NrX2lycSgmc2loX2FnZW50X2xvY2spOwotCWlmIChhZ2VudC0+aW1yX2NoYW5nZV9wZW5kaW5nKSB7Ci0JCXNpaCA9IGFnZW50LT5zaWg7Ci0JCS8qIGJ5dGVbMF0gZ2V0cyBvdmVyd3JpdHRlbiBhcyB3ZSB3cml0ZSAuLi4gKi8KLQkJaW1yLndvcmQgPSBjcHVfdG9fbGUzMihhZ2VudC0+aW1yIDw8IDgpOwotCQlhZ2VudC0+aW1yX2NoYW5nZV9wZW5kaW5nID0gZmFsc2U7Ci0JfSBlbHNlCi0JCXNpaCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZzaWhfYWdlbnRfbG9jayk7Ci0JaWYgKCFzaWgpCi0JCXJldHVybjsKLQotCS8qIHdyaXRlIHRoZSB3aG9sZSBtYXNrIC4uLiBzaW1wbGVyIHRoYW4gc3Vic2V0dGluZyBpdCAqLwotCXN0YXR1cyA9IHR3bF9pMmNfd3JpdGUoc2loLT5tb2R1bGUsIGltci5ieXRlcywKLQkJCXNpaC0+bWFza1tpcnFfbGluZV0uaW1yX29mZnNldCwgc2loLT5ieXRlc19peHIpOwotCWlmIChzdGF0dXMpCi0JCXByX2VycigidHdsNDAzMDogJXMsICVzIC0tPiAlZFxuIiwgX19mdW5jX18sCi0JCQkJIndyaXRlIiwgc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQgdHdsNDAzMF9zaWhfZG9fZWRnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHNpaF9hZ2VudAkqYWdlbnQ7Ci0JY29uc3Qgc3RydWN0IHNpaAkqc2loOwotCXU4CQkJYnl0ZXNbNl07Ci0JdTMyCQkJZWRnZV9jaGFuZ2U7Ci0JaW50CQkJc3RhdHVzOwotCi0JYWdlbnQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNpaF9hZ2VudCwgZWRnZV93b3JrKTsKLQotCS8qIHNlZSB3aGF0IHdvcmsgd2UgaGF2ZSAqLwotCXNwaW5fbG9ja19pcnEoJnNpaF9hZ2VudF9sb2NrKTsKLQllZGdlX2NoYW5nZSA9IGFnZW50LT5lZGdlX2NoYW5nZTsKLQlhZ2VudC0+ZWRnZV9jaGFuZ2UgPSAwOwotCXNpaCA9IGVkZ2VfY2hhbmdlID8gYWdlbnQtPnNpaCA6IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZzaWhfYWdlbnRfbG9jayk7Ci0JaWYgKCFzaWgpCi0JCXJldHVybjsKLQotCS8qIFJlYWQsIHJlc2VydmluZyBmaXJzdCBieXRlIGZvciB3cml0ZSBzY3JhdGNoLiAgWWVzLCB0aGlzCi0JICogY291bGQgYmUgY2FjaGVkIGZvciBzb21lIHNwZWVkdXAgLi4uIGJ1dCBiZSBjYXJlZnVsIGFib3V0Ci0JICogYW55IHByb2Nlc3NvciBvbiB0aGUgb3RoZXIgSVJRIGxpbmUsIEVEUiByZWdpc3RlcnMgYXJlCi0JICogc2hhcmVkLgotCSAqLwotCXN0YXR1cyA9IHR3bF9pMmNfcmVhZChzaWgtPm1vZHVsZSwgYnl0ZXMgKyAxLAotCQkJc2loLT5lZHJfb2Zmc2V0LCBzaWgtPmJ5dGVzX2Vkcik7Ci0JaWYgKHN0YXR1cykgewotCQlwcl9lcnIoInR3bDQwMzA6ICVzLCAlcyAtLT4gJWRcbiIsIF9fZnVuY19fLAotCQkJCSJyZWFkIiwgc3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIE1vZGlmeSBvbmx5IHRoZSBiaXRzIHdlIGtub3cgbXVzdCBjaGFuZ2UgKi8KLQl3aGlsZSAoZWRnZV9jaGFuZ2UpIHsKLQkJaW50CQlpID0gZmxzKGVkZ2VfY2hhbmdlKSAtIDE7Ci0JCXN0cnVjdCBpcnFfZGF0YQkqaWRhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKGkgKyBhZ2VudC0+aXJxX2Jhc2UpOwotCQlpbnQJCWJ5dGUgPSAxICsgKGkgPj4gMik7Ci0JCWludAkJb2ZmID0gKGkgJiAweDMpICogMjsKLQkJdW5zaWduZWQgaW50CXR5cGU7Ci0KLQkJYnl0ZXNbYnl0ZV0gJj0gfigweDAzIDw8IG9mZik7Ci0KLQkJdHlwZSA9IGlycWRfZ2V0X3RyaWdnZXJfdHlwZShpZGF0YSk7Ci0JCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCi0JCQlieXRlc1tieXRlXSB8PSBCSVQob2ZmICsgMSk7Ci0JCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKQotCQkJYnl0ZXNbYnl0ZV0gfD0gQklUKG9mZiArIDApOwotCi0JCWVkZ2VfY2hhbmdlICY9IH5CSVQoaSk7Ci0JfQotCi0JLyogV3JpdGUgKi8KLQlzdGF0dXMgPSB0d2xfaTJjX3dyaXRlKHNpaC0+bW9kdWxlLCBieXRlcywKLQkJCXNpaC0+ZWRyX29mZnNldCwgc2loLT5ieXRlc19lZHIpOwotCWlmIChzdGF0dXMpCi0JCXByX2VycigidHdsNDAzMDogJXMsICVzIC0tPiAlZFxuIiwgX19mdW5jX18sCi0JCQkJIndyaXRlIiwgc3RhdHVzKTsKLX0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKQEAgLTU3OSw1MCArNDQ1LDEyNSBAQAogCiBzdGF0aWMgdm9pZCB0d2w0MDMwX3NpaF9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgc2loX2FnZW50ICpzaWggPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzaWhfYWdlbnQgKmFnZW50ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2loX2FnZW50X2xvY2ssIGZsYWdzKTsKLQlzaWgtPmltciB8PSBCSVQoZGF0YS0+aXJxIC0gc2loLT5pcnFfYmFzZSk7Ci0Jc2loLT5pbXJfY2hhbmdlX3BlbmRpbmcgPSB0cnVlOwotCXF1ZXVlX3dvcmsod3EsICZzaWgtPm1hc2tfd29yayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2loX2FnZW50X2xvY2ssIGZsYWdzKTsKKwlhZ2VudC0+aW1yIHw9IEJJVChkYXRhLT5pcnEgLSBhZ2VudC0+aXJxX2Jhc2UpOworCWFnZW50LT5pbXJfY2hhbmdlX3BlbmRpbmcgPSB0cnVlOwogfQogCiBzdGF0aWMgdm9pZCB0d2w0MDMwX3NpaF91bm1hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBzaWhfYWdlbnQgKnNpaCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNpaF9hZ2VudCAqYWdlbnQgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzaWhfYWdlbnRfbG9jaywgZmxhZ3MpOwotCXNpaC0+aW1yICY9IH5CSVQoZGF0YS0+aXJxIC0gc2loLT5pcnFfYmFzZSk7Ci0Jc2loLT5pbXJfY2hhbmdlX3BlbmRpbmcgPSB0cnVlOwotCXF1ZXVlX3dvcmsod3EsICZzaWgtPm1hc2tfd29yayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2loX2FnZW50X2xvY2ssIGZsYWdzKTsKKwlhZ2VudC0+aW1yICY9IH5CSVQoZGF0YS0+aXJxIC0gYWdlbnQtPmlycV9iYXNlKTsKKwlhZ2VudC0+aW1yX2NoYW5nZV9wZW5kaW5nID0gdHJ1ZTsKIH0KIAogc3RhdGljIGludCB0d2w0MDMwX3NpaF9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIHRyaWdnZXIpCiB7Ci0Jc3RydWN0IHNpaF9hZ2VudCAqc2loID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2loX2FnZW50ICphZ2VudCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwogCiAJaWYgKHRyaWdnZXIgJiB+KElSUV9UWVBFX0VER0VfRkFMTElORyB8IElSUV9UWVBFX0VER0VfUklTSU5HKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2loX2FnZW50X2xvY2ssIGZsYWdzKTsKLQlpZiAoaXJxZF9nZXRfdHJpZ2dlcl90eXBlKGRhdGEpICE9IHRyaWdnZXIpIHsKLQkJc2loLT5lZGdlX2NoYW5nZSB8PSBCSVQoZGF0YS0+aXJxIC0gc2loLT5pcnFfYmFzZSk7Ci0JCXF1ZXVlX3dvcmsod3EsICZzaWgtPmVkZ2Vfd29yayk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNpaF9hZ2VudF9sb2NrLCBmbGFncyk7CisJaWYgKGlycWRfZ2V0X3RyaWdnZXJfdHlwZShkYXRhKSAhPSB0cmlnZ2VyKQorCQlhZ2VudC0+ZWRnZV9jaGFuZ2UgfD0gQklUKGRhdGEtPmlycSAtIGFnZW50LT5pcnFfYmFzZSk7CisKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgdHdsNDAzMF9zaWhfYnVzX2xvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBzaWhfYWdlbnQJKmFnZW50ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisKKwltdXRleF9sb2NrKCZhZ2VudC0+aXJxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB0d2w0MDMwX3NpaF9idXNfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBzaWhfYWdlbnQJKmFnZW50ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJY29uc3Qgc3RydWN0IHNpaAkqc2loID0gYWdlbnQtPnNpaDsKKwlpbnQJCQlzdGF0dXM7CisKKwlpZiAoYWdlbnQtPmltcl9jaGFuZ2VfcGVuZGluZykgeworCQl1bmlvbiB7CisJCQl1MzIJd29yZDsKKwkJCXU4CWJ5dGVzWzRdOworCQl9IGltcjsKKworCQkvKiBieXRlWzBdIGdldHMgb3ZlcndyaXRlbiBhcyB3ZSB3cml0ZSAuLi4gKi8KKwkJaW1yLndvcmQgPSBjcHVfdG9fbGUzMihhZ2VudC0+aW1yIDw8IDgpOworCQlhZ2VudC0+aW1yX2NoYW5nZV9wZW5kaW5nID0gZmFsc2U7CisKKwkJLyogd3JpdGUgdGhlIHdob2xlIG1hc2sgLi4uIHNpbXBsZXIgdGhhbiBzdWJzZXR0aW5nIGl0ICovCisJCXN0YXR1cyA9IHR3bF9pMmNfd3JpdGUoc2loLT5tb2R1bGUsIGltci5ieXRlcywKKwkJCQlzaWgtPm1hc2tbaXJxX2xpbmVdLmltcl9vZmZzZXQsCisJCQkJc2loLT5ieXRlc19peHIpOworCQlpZiAoc3RhdHVzKQorCQkJcHJfZXJyKCJ0d2w0MDMwOiAlcywgJXMgLS0+ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJIndyaXRlIiwgc3RhdHVzKTsKKwl9CisKKwlpZiAoYWdlbnQtPmVkZ2VfY2hhbmdlKSB7CisJCXUzMgkJZWRnZV9jaGFuZ2U7CisJCXU4CQlieXRlc1s2XTsKKworCQllZGdlX2NoYW5nZSA9IGFnZW50LT5lZGdlX2NoYW5nZTsKKwkJYWdlbnQtPmVkZ2VfY2hhbmdlID0gMDsKKworCQkvKgorCQkgKiBSZWFkLCByZXNlcnZpbmcgZmlyc3QgYnl0ZSBmb3Igd3JpdGUgc2NyYXRjaC4gIFllcywgdGhpcworCQkgKiBjb3VsZCBiZSBjYWNoZWQgZm9yIHNvbWUgc3BlZWR1cCAuLi4gYnV0IGJlIGNhcmVmdWwgYWJvdXQKKwkJICogYW55IHByb2Nlc3NvciBvbiB0aGUgb3RoZXIgSVJRIGxpbmUsIEVEUiByZWdpc3RlcnMgYXJlCisJCSAqIHNoYXJlZC4KKwkJICovCisJCXN0YXR1cyA9IHR3bF9pMmNfcmVhZChzaWgtPm1vZHVsZSwgYnl0ZXMgKyAxLAorCQkJCXNpaC0+ZWRyX29mZnNldCwgc2loLT5ieXRlc19lZHIpOworCQlpZiAoc3RhdHVzKSB7CisJCQlwcl9lcnIoInR3bDQwMzA6ICVzLCAlcyAtLT4gJWRcbiIsIF9fZnVuY19fLAorCQkJCQkicmVhZCIsIHN0YXR1cyk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBNb2RpZnkgb25seSB0aGUgYml0cyB3ZSBrbm93IG11c3QgY2hhbmdlICovCisJCXdoaWxlIChlZGdlX2NoYW5nZSkgeworCQkJaW50CQlpID0gZmxzKGVkZ2VfY2hhbmdlKSAtIDE7CisJCQlzdHJ1Y3QgaXJxX2RhdGEJKmlkYXRhOworCQkJaW50CQlieXRlID0gMSArIChpID4+IDIpOworCQkJaW50CQlvZmYgPSAoaSAmIDB4MykgKiAyOworCQkJdW5zaWduZWQgaW50CXR5cGU7CisKKwkJCWlkYXRhID0gaXJxX2dldF9pcnFfZGF0YShpICsgYWdlbnQtPmlycV9iYXNlKTsKKworCQkJYnl0ZXNbYnl0ZV0gJj0gfigweDAzIDw8IG9mZik7CisKKwkJCXR5cGUgPSBpcnFkX2dldF90cmlnZ2VyX3R5cGUoaWRhdGEpOworCQkJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKKwkJCQlieXRlc1tieXRlXSB8PSBCSVQob2ZmICsgMSk7CisJCQlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfRkFMTElORykKKwkJCQlieXRlc1tieXRlXSB8PSBCSVQob2ZmICsgMCk7CisKKwkJCWVkZ2VfY2hhbmdlICY9IH5CSVQoaSk7CisJCX0KKworCQkvKiBXcml0ZSAqLworCQlzdGF0dXMgPSB0d2xfaTJjX3dyaXRlKHNpaC0+bW9kdWxlLCBieXRlcywKKwkJCQlzaWgtPmVkcl9vZmZzZXQsIHNpaC0+Ynl0ZXNfZWRyKTsKKwkJaWYgKHN0YXR1cykKKwkJCXByX2VycigidHdsNDAzMDogJXMsICVzIC0tPiAlZFxuIiwgX19mdW5jX18sCisJCQkJCSJ3cml0ZSIsIHN0YXR1cyk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZhZ2VudC0+aXJxX2xvY2spOworfQorCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHR3bDQwMzBfc2loX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJ0d2w0MDMwIiwKLQkuaXJxX21hc2sgICAgICAJPSB0d2w0MDMwX3NpaF9tYXNrLAorCS5pcnFfbWFzawk9IHR3bDQwMzBfc2loX21hc2ssCiAJLmlycV91bm1hc2sJPSB0d2w0MDMwX3NpaF91bm1hc2ssCiAJLmlycV9zZXRfdHlwZQk9IHR3bDQwMzBfc2loX3NldF90eXBlLAorCS5pcnFfYnVzX2xvY2sJPSB0d2w0MDMwX3NpaF9idXNfbG9jaywKKwkuaXJxX2J1c19zeW5jX3VubG9jayA9IHR3bDQwMzBfc2loX2J1c19zeW5jX3VubG9jaywKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC02NTUsOSArNTk2LDcgQEAKIAlpbnQgaXNyOwogCiAJLyogcmVhZGluZyBJU1IgYWNrcyB0aGUgSVJRcywgdXNpbmcgY2xlYXItb24tcmVhZCBtb2RlICovCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwogCWlzciA9IHNpaF9yZWFkX2lzcihzaWgpOwotCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKIAlpZiAoaXNyIDwgMCkgewogCQlwcl9lcnIoInR3bDQwMzA6ICVzIFNJSCwgcmVhZCBJU1IgZXJyb3IgJWRcbiIsCkBAIC02NzIsNyArNjExLDcgQEAKIAkJaXNyICY9IH5CSVQoaXJxKTsKIAogCQlpZiAoaXJxIDwgc2loLT5iaXRzKQotCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGFnZW50LT5pcnFfYmFzZSArIGlycSk7CisJCQloYW5kbGVfbmVzdGVkX2lycShhZ2VudC0+aXJxX2Jhc2UgKyBpcnEpOwogCQllbHNlCiAJCQlwcl9lcnIoInR3bDQwMzA6ICVzIFNJSCwgaW52YWxpZCBJU1IgYml0ICVkXG4iLAogCQkJCXNpaC0+bmFtZSwgaXJxKTsKQEAgLTcxOCwxNSArNjU3LDE0IEBACiAJYWdlbnQtPmlycV9iYXNlID0gaXJxX2Jhc2U7CiAJYWdlbnQtPnNpaCA9IHNpaDsKIAlhZ2VudC0+aW1yID0gfjA7Ci0JSU5JVF9XT1JLKCZhZ2VudC0+bWFza193b3JrLCB0d2w0MDMwX3NpaF9kb19tYXNrKTsKLQlJTklUX1dPUksoJmFnZW50LT5lZGdlX3dvcmssIHR3bDQwMzBfc2loX2RvX2VkZ2UpOworCW11dGV4X2luaXQoJmFnZW50LT5pcnFfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2loLT5iaXRzOyBpKyspIHsKIAkJaXJxID0gaXJxX2Jhc2UgKyBpOwogCisJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgYWdlbnQpOwogCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmdHdsNDAzMF9zaWhfaXJxX2NoaXAsCiAJCQkJCSBoYW5kbGVfZWRnZV9pcnEpOwotCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGFnZW50KTsKIAkJYWN0aXZhdGVfaXJxKGlycSk7CiAJfQogCkBAIC03NTgsNyArNjk2LDYgQEAKIAogCWludAkJCXN0YXR1czsKIAlpbnQJCQlpOwotCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsKIAogCS8qCiAJICogTWFzayBhbmQgY2xlYXIgYWxsIFRXTDQwMzAgaW50ZXJydXB0cyBzaW5jZSBpbml0aWFsbHkgd2UgZG8KQEAgLTc2OCwxMiArNzA1LDYgQEAKIAlpZiAoc3RhdHVzIDwgMCkKIAkJcmV0dXJuIHN0YXR1czsKIAotCXdxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInR3bDQwMzAtaXJxY2hpcCIpOwotCWlmICghd3EpIHsKLQkJcHJfZXJyKCJ0d2w0MDMwOiB3b3JrcXVldWUgRkFJTFxuIik7Ci0JCXJldHVybiAtRVNSQ0g7Ci0JfQotCiAJdHdsNDAzMF9pcnFfYmFzZSA9IGlycV9iYXNlOwogCiAJLyogaW5zdGFsbCBhbiBpcnEgaGFuZGxlciBmb3IgZWFjaCBvZiB0aGUgU0lIIG1vZHVsZXM7CkBAIC03ODcsNiArNzE4LDcgQEAKIAlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9lbmQ7IGkrKykgewogCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJnR3bDQwMzBfaXJxX2NoaXAsCiAJCQkJCSBoYW5kbGVfc2ltcGxlX2lycSk7CisJCWlycV9zZXRfbmVzdGVkX3RocmVhZChpLCAxKTsKIAkJYWN0aXZhdGVfaXJxKGkpOwogCX0KIAl0d2w0MDMwX2lycV9uZXh0ID0gaTsKQEAgLTgwMSwzNCArNzMzLDIyIEBACiAJfQogCiAJLyogaW5zdGFsbCBhbiBpcnEgaGFuZGxlciB0byBkZW11bHRpcGxleCB0aGUgVFdMNDAzMCBpbnRlcnJ1cHQgKi8KLQotCi0JaW5pdF9jb21wbGV0aW9uKCZpcnFfZXZlbnQpOwotCi0Jc3RhdHVzID0gcmVxdWVzdF9pcnEoaXJxX251bSwgaGFuZGxlX3R3bDQwMzBfcGloLCBJUlFGX0RJU0FCTEVELAotCQkJCSJUV0w0MDMwLVBJSCIsICZpcnFfZXZlbnQpOworCXN0YXR1cyA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlycV9udW0sIE5VTEwsIGhhbmRsZV90d2w0MDMwX3BpaCwgMCwKKwkJCQkJIlRXTDQwMzAtUElIIiwgTlVMTCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJcHJfZXJyKCJ0d2w0MDMwOiBjb3VsZCBub3QgY2xhaW0gaXJxJWQ6ICVkXG4iLCBpcnFfbnVtLCBzdGF0dXMpOwogCQlnb3RvIGZhaWxfcnFpcnE7CiAJfQogCi0JdGFzayA9IGt0aHJlYWRfcnVuKHR3bDQwMzBfaXJxX3RocmVhZCwgKHZvaWQgKikobG9uZylpcnFfbnVtLAotCQkJCQkJCQkidHdsNDAzMC1pcnEiKTsKLQlpZiAoSVNfRVJSKHRhc2spKSB7Ci0JCXByX2VycigidHdsNDAzMDogY291bGQgbm90IGNyZWF0ZSBpcnEgJWQgdGhyZWFkIVxuIiwgaXJxX251bSk7Ci0JCXN0YXR1cyA9IFBUUl9FUlIodGFzayk7Ci0JCWdvdG8gZmFpbF9rdGhyZWFkOwotCX0KIAlyZXR1cm4gc3RhdHVzOwotZmFpbF9rdGhyZWFkOgotCWZyZWVfaXJxKGlycV9udW0sICZpcnFfZXZlbnQpOwogZmFpbF9ycWlycToKIAkvKiBjbGVhbiB1cCB0d2w0MDMwX3NpaF9zZXR1cCAqLwogZmFpbDoKLQlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9lbmQ7IGkrKykKKwlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9lbmQ7IGkrKykgeworCQlpcnFfc2V0X25lc3RlZF90aHJlYWQoaSwgMCk7CiAJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpLCBOVUxMLCBOVUxMKTsKLQlkZXN0cm95X3dvcmtxdWV1ZSh3cSk7Ci0Jd3EgPSBOVUxMOworCX0KKwogCXJldHVybiBzdGF0dXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtbWFkYy5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMKaW5kZXggN2NiZjJhYS4uODM0ZjgyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMKQEAgLTc0MCw2ICs3NDAsMjggQEAKIAkJCVRXTDQwMzBfQkNJX0JDSUNUTDEpOwogCQlnb3RvIGVycl9pMmM7CiAJfQorCisJLyogQ2hlY2sgdGhhdCBNQURDIGNsb2NrIGlzIG9uICovCisJcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX0lOVEJSLCAmcmVndmFsLCBUV0w0MDMwX1JFR19HUEJSMSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVhZCByZWcgR1BCUjEgMHglWFxuIiwKKwkJCQlUV0w0MDMwX1JFR19HUEJSMSk7CisJCWdvdG8gZXJyX2kyYzsKKwl9CisKKwkvKiBJZiBNQURDIGNsayBpcyBub3Qgb24sIHR1cm4gaXQgb24gKi8KKwlpZiAoIShyZWd2YWwgJiBUV0w0MDMwX0dQQlIxX01BRENfSEZDTEtfRU4pKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJjbGsgZGlzYWJsZWQsIGVuYWJsaW5nXG4iKTsKKwkJcmVndmFsIHw9IFRXTDQwMzBfR1BCUjFfTUFEQ19IRkNMS19FTjsKKwkJcmV0ID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9JTlRCUiwgcmVndmFsLAorCQkJCSAgICAgICBUV0w0MDMwX1JFR19HUEJSMSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byB3cml0ZSByZWcgR1BCUjEgMHglWFxuIiwKKwkJCQkJVFdMNDAzMF9SRUdfR1BCUjEpOworCQkJZ290byBlcnJfaTJjOworCQl9CisJfQorCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFkYyk7CiAJbXV0ZXhfaW5pdCgmbWFkYy0+bG9jayk7CiAJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKSwgTlVMTCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDYwMzAtaXJxLmMgYi9kcml2ZXJzL21mZC90d2w2MDMwLWlycS5jCmluZGV4IGViM2I1ZjguLjNlZWU0NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDYwMzAtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNjAzMC1pcnEuYwpAQCAtMzIsMTEgKzMyLDEzIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KIAogI2luY2x1ZGUgInR3bC1jb3JlLmgiCiAKQEAgLTgzLDggKzg1LDQ4IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgdW5zaWduZWQgdHdsNjAzMF9pcnFfYmFzZTsKK3N0YXRpYyBpbnQgdHdsX2lycTsKK3N0YXRpYyBib29sIHR3bF9pcnFfd2FrZV9lbmFibGVkOwogCiBzdGF0aWMgc3RydWN0IGNvbXBsZXRpb24gaXJxX2V2ZW50Oworc3RhdGljIGF0b21pY190IHR3bDYwMzBfd2FrZWlycXMgPSBBVE9NSUNfSU5JVCgwKTsKKworc3RhdGljIGludCB0d2w2MDMwX2lycV9wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgcG1fZXZlbnQsIHZvaWQgKnVudXNlZCkKK3sKKwlpbnQgY2hhaW5lZF93YWtldXBzOworCisJc3dpdGNoIChwbV9ldmVudCkgeworCWNhc2UgUE1fU1VTUEVORF9QUkVQQVJFOgorCQljaGFpbmVkX3dha2V1cHMgPSBhdG9taWNfcmVhZCgmdHdsNjAzMF93YWtlaXJxcyk7CisKKwkJaWYgKGNoYWluZWRfd2FrZXVwcyAmJiAhdHdsX2lycV93YWtlX2VuYWJsZWQpIHsKKwkJCWlmIChlbmFibGVfaXJxX3dha2UodHdsX2lycSkpCisJCQkJcHJfZXJyKCJ0d2w2MDMwIElSUSB3YWtlIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJZWxzZQorCQkJCXR3bF9pcnFfd2FrZV9lbmFibGVkID0gdHJ1ZTsKKwkJfSBlbHNlIGlmICghY2hhaW5lZF93YWtldXBzICYmIHR3bF9pcnFfd2FrZV9lbmFibGVkKSB7CisJCQlkaXNhYmxlX2lycV93YWtlKHR3bF9pcnEpOworCQkJdHdsX2lycV93YWtlX2VuYWJsZWQgPSBmYWxzZTsKKwkJfQorCisJCWRpc2FibGVfaXJxKHR3bF9pcnEpOworCQlicmVhazsKKworCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgorCQllbmFibGVfaXJxKHR3bF9pcnEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB0d2w2MDMwX2lycV9wbV9ub3RpZmllcl9ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHR3bDYwMzBfaXJxX3BtX25vdGlmaWVyLAorfTsKIAogLyoKICAqIFRoaXMgdGhyZWFkIHByb2Nlc3NlcyBpbnRlcnJ1cHRzIHJlcG9ydGVkIGJ5IHRoZSBQcmltYXJ5IEludGVycnVwdCBIYW5kbGVyLgpAQCAtMTg3LDYgKzIyOSwxNiBAQAogI2VuZGlmCiB9CiAKK2ludCB0d2w2MDMwX2lycV9zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBvbikKK3sKKwlpZiAob24pCisJCWF0b21pY19pbmMoJnR3bDYwMzBfd2FrZWlycXMpOworCWVsc2UKKwkJYXRvbWljX2RlYygmdHdsNjAzMF93YWtlaXJxcyk7CisKKwlyZXR1cm4gMDsKK30KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHVuc2lnbmVkIHR3bDYwMzBfaXJxX25leHQ7CkBAIC0zMTgsMTAgKzM3MCwxMiBAQAogCXR3bDYwMzBfaXJxX2NoaXAgPSBkdW1teV9pcnFfY2hpcDsKIAl0d2w2MDMwX2lycV9jaGlwLm5hbWUgPSAidHdsNjAzMCI7CiAJdHdsNjAzMF9pcnFfY2hpcC5pcnFfc2V0X3R5cGUgPSBOVUxMOworCXR3bDYwMzBfaXJxX2NoaXAuaXJxX3NldF93YWtlID0gdHdsNjAzMF9pcnFfc2V0X3dha2U7CiAKIAlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9lbmQ7IGkrKykgewogCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJnR3bDYwMzBfaXJxX2NoaXAsCiAJCQkJCSBoYW5kbGVfc2ltcGxlX2lycSk7CisJCWlycV9zZXRfY2hpcF9kYXRhKGksICh2b2lkICopaXJxX251bSk7CiAJCWFjdGl2YXRlX2lycShpKTsKIAl9CiAKQEAgLTMzMSw2ICszODUsMTQgQEAKIAogCS8qIGluc3RhbGwgYW4gaXJxIGhhbmRsZXIgdG8gZGVtdWx0aXBsZXggdGhlIFRXTDYwMzAgaW50ZXJydXB0ICovCiAJaW5pdF9jb21wbGV0aW9uKCZpcnFfZXZlbnQpOworCisJc3RhdHVzID0gcmVxdWVzdF9pcnEoaXJxX251bSwgaGFuZGxlX3R3bDYwMzBfcGloLCAwLAorCQkJCSJUV0w2MDMwLVBJSCIsICZpcnFfZXZlbnQpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2VycigidHdsNjAzMDogY291bGQgbm90IGNsYWltIGlycSVkOiAlZFxuIiwgaXJxX251bSwgc3RhdHVzKTsKKwkJZ290byBmYWlsX2lycTsKKwl9CisKIAl0YXNrID0ga3RocmVhZF9ydW4odHdsNjAzMF9pcnFfdGhyZWFkLCAodm9pZCAqKWlycV9udW0sICJ0d2w2MDMwLWlycSIpOwogCWlmIChJU19FUlIodGFzaykpIHsKIAkJcHJfZXJyKCJ0d2w2MDMwOiBjb3VsZCBub3QgY3JlYXRlIGlycSAlZCB0aHJlYWQhXG4iLCBpcnFfbnVtKTsKQEAgLTMzOCwxNyArNDAwLDE0IEBACiAJCWdvdG8gZmFpbF9rdGhyZWFkOwogCX0KIAotCXN0YXR1cyA9IHJlcXVlc3RfaXJxKGlycV9udW0sIGhhbmRsZV90d2w2MDMwX3BpaCwgSVJRRl9ESVNBQkxFRCwKLQkJCQkiVFdMNjAzMC1QSUgiLCAmaXJxX2V2ZW50KTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlwcl9lcnIoInR3bDYwMzA6IGNvdWxkIG5vdCBjbGFpbSBpcnElZDogJWRcbiIsIGlycV9udW0sIHN0YXR1cyk7Ci0JCWdvdG8gZmFpbF9pcnE7Ci0JfQorCXR3bF9pcnEgPSBpcnFfbnVtOworCXJlZ2lzdGVyX3BtX25vdGlmaWVyKCZ0d2w2MDMwX2lycV9wbV9ub3RpZmllcl9ibG9jayk7CiAJcmV0dXJuIHN0YXR1czsKLWZhaWxfaXJxOgotCWZyZWVfaXJxKGlycV9udW0sICZpcnFfZXZlbnQpOwogCiBmYWlsX2t0aHJlYWQ6CisJZnJlZV9pcnEoaXJxX251bSwgJmlycV9ldmVudCk7CisKK2ZhaWxfaXJxOgogCWZvciAoaSA9IGlycV9iYXNlOyBpIDwgaXJxX2VuZDsgaSsrKQogCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgTlVMTCwgTlVMTCk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTM1Niw2ICs0MTUsNyBAQAogCiBpbnQgdHdsNjAzMF9leGl0X2lycSh2b2lkKQogeworCXVucmVnaXN0ZXJfcG1fbm90aWZpZXIoJnR3bDYwMzBfaXJxX3BtX25vdGlmaWVyX2Jsb2NrKTsKIAogCWlmICh0d2w2MDMwX2lycV9iYXNlKSB7CiAJCXByX2VycigidHdsNjAzMDogY2FuJ3QgeWV0IGNsZWFuIHVwIElSUXM/XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDYwNDAtY29yZS5jIGIvZHJpdmVycy9tZmQvdHdsNjA0MC1jb3JlLmMKaW5kZXggMjRkNDM2Yy4uMjY4ZjgwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNjA0MC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNjA0MC1jb3JlLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC90d2w2MDQwLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0d2w2MDQwX2RldjsKKyNkZWZpbmUgVklCUkFDVFJMX01FTUJFUihyZWcpICgocmVnID09IFRXTDYwNDBfUkVHX1ZJQkNUTEwpID8gMCA6IDEpCiAKIGludCB0d2w2MDQwX3JlZ19yZWFkKHN0cnVjdCB0d2w2MDQwICp0d2w2MDQwLCB1bnNpZ25lZCBpbnQgcmVnKQogewpAQCAtNDIsMTAgKzQyLDE2IEBACiAJdTggdmFsID0gMDsKIAogCW11dGV4X2xvY2soJnR3bDYwNDAtPmlvX211dGV4KTsKLQlyZXQgPSB0d2xfaTJjX3JlYWRfdTgoVFdMX01PRFVMRV9BVURJT19WT0lDRSwgJnZhbCwgcmVnKTsKLQlpZiAocmV0IDwgMCkgewotCQltdXRleF91bmxvY2soJnR3bDYwNDAtPmlvX211dGV4KTsKLQkJcmV0dXJuIHJldDsKKwkvKiBWaWJyYSBjb250cm9sIHJlZ2lzdGVycyBmcm9tIGNhY2hlICovCisJaWYgKHVubGlrZWx5KHJlZyA9PSBUV0w2MDQwX1JFR19WSUJDVExMIHx8CisJCSAgICAgcmVnID09IFRXTDYwNDBfUkVHX1ZJQkNUTFIpKSB7CisJCXZhbCA9IHR3bDYwNDAtPnZpYnJhX2N0cmxfY2FjaGVbVklCUkFDVFJMX01FTUJFUihyZWcpXTsKKwl9IGVsc2UgeworCQlyZXQgPSB0d2xfaTJjX3JlYWRfdTgoVFdMX01PRFVMRV9BVURJT19WT0lDRSwgJnZhbCwgcmVnKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmdHdsNjA0MC0+aW9fbXV0ZXgpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAltdXRleF91bmxvY2soJnR3bDYwNDAtPmlvX211dGV4KTsKIApAQCAtNTksNiArNjUsOSBAQAogCiAJbXV0ZXhfbG9jaygmdHdsNjA0MC0+aW9fbXV0ZXgpOwogCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMX01PRFVMRV9BVURJT19WT0lDRSwgdmFsLCByZWcpOworCS8qIENhY2hlIHRoZSB2aWJyYSBjb250cm9sIHJlZ2lzdGVycyAqLworCWlmIChyZWcgPT0gVFdMNjA0MF9SRUdfVklCQ1RMTCB8fCByZWcgPT0gVFdMNjA0MF9SRUdfVklCQ1RMUikKKwkJdHdsNjA0MC0+dmlicmFfY3RybF9jYWNoZVtWSUJSQUNUUkxfTUVNQkVSKHJlZyldID0gdmFsOwogCW11dGV4X3VubG9jaygmdHdsNjA0MC0+aW9fbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKQEAgLTIwMywxMSArMjEyLDExIEBACiAJaWYgKGludGlkICYgVFdMNjA0MF9USElOVCkgewogCQlzdGF0dXMgPSB0d2w2MDQwX3JlZ19yZWFkKHR3bDYwNDAsIFRXTDYwNDBfUkVHX1NUQVRVUyk7CiAJCWlmIChzdGF0dXMgJiBUV0w2MDQwX1RTSFVUREVUKSB7Ci0JCQlkZXZfd2FybigmdHdsNjA0MF9kZXYtPmRldiwKKwkJCWRldl93YXJuKHR3bDYwNDAtPmRldiwKIAkJCQkgIlRoZXJtYWwgc2h1dGRvd24sIHBvd2VyaW5nLW9mZiIpOwogCQkJdHdsNjA0MF9wb3dlcih0d2w2MDQwLCAwKTsKIAkJfSBlbHNlIHsKLQkJCWRldl93YXJuKCZ0d2w2MDQwX2Rldi0+ZGV2LAorCQkJZGV2X3dhcm4odHdsNjA0MC0+ZGV2LAogCQkJCSAiTGVhdmluZyB0aGVybWFsIHNodXRkb3duLCBwb3dlcmluZy1vbiIpOwogCQkJdHdsNjA0MF9wb3dlcih0d2w2MDQwLCAxKTsKIAkJfQpAQCAtMjI3LDcgKzIzNiw3IEBACiAJaWYgKCF0aW1lX2xlZnQpIHsKIAkJaW50aWQgPSB0d2w2MDQwX3JlZ19yZWFkKHR3bDYwNDAsIFRXTDYwNDBfUkVHX0lOVElEKTsKIAkJaWYgKCEoaW50aWQgJiBUV0w2MDQwX1JFQURZSU5UKSkgewotCQkJZGV2X2VycigmdHdsNjA0MF9kZXYtPmRldiwKKwkJCWRldl9lcnIodHdsNjA0MC0+ZGV2LAogCQkJCSJ0aW1lb3V0IHdhaXRpbmcgZm9yIFJFQURZSU5UXG4iKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CkBAIC0yNTUsNyArMjY0LDcgQEAKIAkJCS8qIHdhaXQgZm9yIHBvd2VyLXVwIGNvbXBsZXRpb24gKi8KIAkJCXJldCA9IHR3bDYwNDBfcG93ZXJfdXBfY29tcGxldGlvbih0d2w2MDQwLCBuYXVkaW50KTsKIAkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKCZ0d2w2MDQwX2Rldi0+ZGV2LAorCQkJCWRldl9lcnIodHdsNjA0MC0+ZGV2LAogCQkJCQkiYXV0b21hdGljIHBvd2VyLWRvd24gZmFpbGVkXG4iKTsKIAkJCQl0d2w2MDQwLT5wb3dlcl9jb3VudCA9IDA7CiAJCQkJZ290byBvdXQ7CkBAIC0yNjQsNyArMjczLDcgQEAKIAkJCS8qIHVzZSBtYW51YWwgcG93ZXItdXAgc2VxdWVuY2UgKi8KIAkJCXJldCA9IHR3bDYwNDBfcG93ZXJfdXAodHdsNjA0MCk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2VycigmdHdsNjA0MF9kZXYtPmRldiwKKwkJCQlkZXZfZXJyKHR3bDYwNDAtPmRldiwKIAkJCQkJIm1hbnVhbCBwb3dlci11cCBmYWlsZWRcbiIpOwogCQkJCXR3bDYwNDAtPnBvd2VyX2NvdW50ID0gMDsKIAkJCQlnb3RvIG91dDsKQEAgLTI3Niw3ICsyODUsNyBAQAogCX0gZWxzZSB7CiAJCS8qIGFscmVhZHkgcG93ZXJlZC1kb3duICovCiAJCWlmICghdHdsNjA0MC0+cG93ZXJfY291bnQpIHsKLQkJCWRldl9lcnIoJnR3bDYwNDBfZGV2LT5kZXYsCisJCQlkZXZfZXJyKHR3bDYwNDAtPmRldiwKIAkJCQkiZGV2aWNlIGlzIGFscmVhZHkgcG93ZXJlZC1vZmZcbiIpOwogCQkJcmV0ID0gLUVQRVJNOwogCQkJZ290byBvdXQ7CkBAIC0zMjYsNyArMzM1LDcgQEAKIAkJCWxwcGxsY3RsICY9IH5UV0w2MDQwX0xQTExGSU47CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRldl9lcnIoJnR3bDYwNDBfZGV2LT5kZXYsCisJCQlkZXZfZXJyKHR3bDYwNDAtPmRldiwKIAkJCQkiZnJlcV9vdXQgJWQgbm90IHN1cHBvcnRlZFxuIiwgZnJlcV9vdXQpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gcGxsX291dDsKQEAgLTM0Nyw3ICszNTYsNyBAQAogCQkJCQkgIGhwcGxsY3RsKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZGV2X2VycigmdHdsNjA0MF9kZXYtPmRldiwKKwkJCWRldl9lcnIodHdsNjA0MC0+ZGV2LAogCQkJCSJmcmVxX2luICVkIG5vdCBzdXBwb3J0ZWRcbiIsIGZyZXFfaW4pOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gcGxsX291dDsKQEAgLTM1Niw3ICszNjUsNyBAQAogCWNhc2UgVFdMNjA0MF9TWVNDTEtfU0VMX0hQUExMOgogCQkvKiBoaWdoLXBlcmZvcm1hbmNlIFBMTCBjYW4gcHJvdmlkZSBvbmx5IDE5LjIgTUh6ICovCiAJCWlmIChmcmVxX291dCAhPSAxOTIwMDAwMCkgewotCQkJZGV2X2VycigmdHdsNjA0MF9kZXYtPmRldiwKKwkJCWRldl9lcnIodHdsNjA0MC0+ZGV2LAogCQkJCSJmcmVxX291dCAlZCBub3Qgc3VwcG9ydGVkXG4iLCBmcmVxX291dCk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBwbGxfb3V0OwpAQCAtMzg5LDcgKzM5OCw3IEBACiAJCQkJICAgIFRXTDYwNDBfSFBMTEVOQTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZGV2X2VycigmdHdsNjA0MF9kZXYtPmRldiwKKwkJCWRldl9lcnIodHdsNjA0MC0+ZGV2LAogCQkJCSJmcmVxX2luICVkIG5vdCBzdXBwb3J0ZWRcbiIsIGZyZXFfaW4pOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gcGxsX291dDsKQEAgLTQwNiw3ICs0MTUsNyBAQAogCQl0d2w2MDQwX3JlZ193cml0ZSh0d2w2MDQwLCBUV0w2MDQwX1JFR19MUFBMTENUTCwgbHBwbGxjdGwpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKCZ0d2w2MDQwX2Rldi0+ZGV2LCAidW5rbm93biBwbGwgaWQgJWRcbiIsIHBsbF9pZCk7CisJCWRldl9lcnIodHdsNjA0MC0+ZGV2LCAidW5rbm93biBwbGwgaWQgJWRcbiIsIHBsbF9pZCk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gcGxsX291dDsKIAl9CkBAIC00MzUsNiArNDQ0LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MKHR3bDYwNDBfZ2V0X3N5c2Nsayk7CiAKKy8qIEdldCB0aGUgY29tYmluZWQgc3RhdHVzIG9mIHRoZSB2aWJyYSBjb250cm9sIHJlZ2lzdGVyICovCitpbnQgdHdsNjA0MF9nZXRfdmlicmFscl9zdGF0dXMoc3RydWN0IHR3bDYwNDAgKnR3bDYwNDApCit7CisJdTggc3RhdHVzOworCisJc3RhdHVzID0gdHdsNjA0MC0+dmlicmFfY3RybF9jYWNoZVswXSB8IHR3bDYwNDAtPnZpYnJhX2N0cmxfY2FjaGVbMV07CisJc3RhdHVzICY9IChUV0w2MDQwX1ZJQkVOQSB8IFRXTDYwNDBfVklCU0VMKTsKKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHR3bDYwNDBfZ2V0X3ZpYnJhbHJfc3RhdHVzKTsKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0d2w2MDQwX3ZpYnJhX3JzcmNbXSA9IHsKIAl7CiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLApAQCAtNDcxLDkgKzQ5Miw3IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0d2w2MDQwKTsKIAotCXR3bDYwNDBfZGV2ID0gcGRldjsKIAl0d2w2MDQwLT5kZXYgPSAmcGRldi0+ZGV2OwotCXR3bDYwNDAtPmF1ZHB3cm9uID0gcGRhdGEtPmF1ZHB3cm9uX2dwaW87CiAJdHdsNjA0MC0+aXJxID0gcGRhdGEtPm5hdWRpbnRfaXJxOwogCXR3bDYwNDAtPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOwogCkBAIC00ODMsNiArNTAyLDEyIEBACiAKIAl0d2w2MDQwLT5yZXYgPSB0d2w2MDQwX3JlZ19yZWFkKHR3bDYwNDAsIFRXTDYwNDBfUkVHX0FTSUNSRVYpOwogCisJLyogRVJSQVRBOiBBdXRvbWF0aWMgcG93ZXItdXAgaXMgbm90IHBvc3NpYmxlIGluIEVTMS4wICovCisJaWYgKHR3bDYwNDBfZ2V0X3JldmlkKHR3bDYwNDApID4gVFdMNjA0MF9SRVZfRVMxXzApCisJCXR3bDYwNDAtPmF1ZHB3cm9uID0gcGRhdGEtPmF1ZHB3cm9uX2dwaW87CisJZWxzZQorCQl0d2w2MDQwLT5hdWRwd3JvbiA9IC1FSU5WQUw7CisKIAlpZiAoZ3Bpb19pc192YWxpZCh0d2w2MDQwLT5hdWRwd3JvbikpIHsKIAkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHR3bDYwNDAtPmF1ZHB3cm9uLCAiYXVkcHdyb24iKTsKIAkJaWYgKHJldCkKQEAgLTQ5MywxMCArNTE4LDYgQEAKIAkJCWdvdG8gZ3BpbzJfZXJyOwogCX0KIAotCS8qIEVSUkFUQTogQXV0b21hdGljIHBvd2VyLXVwIGlzIG5vdCBwb3NzaWJsZSBpbiBFUzEuMCAqLwotCWlmICh0d2w2MDQwLT5yZXYgPT0gVFdMNjA0MF9SRVZfRVMxXzApCi0JCXR3bDYwNDAtPmF1ZHB3cm9uID0gLUVJTlZBTDsKLQogCS8qIGNvZGVjIGludGVycnVwdCAqLwogCXJldCA9IHR3bDYwNDBfaXJxX2luaXQodHdsNjA0MCk7CiAJaWYgKHJldCkKQEAgLTU2Niw3ICs1ODcsNiBAQAogZ3BpbzFfZXJyOgogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWtmcmVlKHR3bDYwNDApOwotCXR3bDYwNDBfZGV2ID0gTlVMTDsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01ODYsNyArNjA2LDYgQEAKIAltZmRfcmVtb3ZlX2RldmljZXMoJnBkZXYtPmRldik7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJa2ZyZWUodHdsNjA0MCk7Ci0JdHdsNjA0MF9kZXYgPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bDEyNzMtY29yZS5jIGIvZHJpdmVycy9tZmQvd2wxMjczLWNvcmUuYwppbmRleCBkOTdhODY5Li5mMzliNzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bDEyNzMtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3dsMTI3My1jb3JlLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21mZC93bDEyNzMtY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUklWRVJfREVTQyAiV0wxMjczIEZNIFJhZGlvIENvcmUiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYwppbmRleCBhZGExODM1Li5mNDc0N2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzMXgtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWlycS5jCkBAIC00MjAsMTIgKzQyMCwxOSBAQAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgogCQl3bTgzMXgtPmdwaW9fdXBkYXRlW2lycV0gPSAweDEwMDAwIHwgV004MzFYX0dQTl9JTlRfTU9ERTsKKwkJd204MzF4LT5ncGlvX2xldmVsW2lycV0gPSBmYWxzZTsKIAkJYnJlYWs7CiAJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKIAkJd204MzF4LT5ncGlvX3VwZGF0ZVtpcnFdID0gMHgxMDAwMCB8IFdNODMxWF9HUE5fUE9MOworCQl3bTgzMXgtPmdwaW9fbGV2ZWxbaXJxXSA9IGZhbHNlOwogCQlicmVhazsKIAljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKIAkJd204MzF4LT5ncGlvX3VwZGF0ZVtpcnFdID0gMHgxMDAwMDsKKwkJd204MzF4LT5ncGlvX2xldmVsW2lycV0gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQl3bTgzMXgtPmdwaW9fdXBkYXRlW2lycV0gPSAweDEwMDAwIHwgV004MzFYX0dQTl9QT0w7CisJCXdtODMxeC0+Z3Bpb19sZXZlbFtpcnFdID0gdHJ1ZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00NDksNyArNDU2LDcgQEAKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkYXRhOwogCXVuc2lnbmVkIGludCBpOwotCWludCBwcmltYXJ5LCBzdGF0dXNfYWRkcjsKKwlpbnQgcHJpbWFyeSwgc3RhdHVzX2FkZHIsIHJldDsKIAlpbnQgc3RhdHVzX3JlZ3NbV004MzFYX05VTV9JUlFfUkVHU10gPSB7IDAgfTsKIAlpbnQgcmVhZFtXTTgzMVhfTlVNX0lSUV9SRUdTXSA9IHsgMCB9OwogCWludCAqc3RhdHVzOwpAQCAtNTA3LDYgKzUxNCwxOSBAQAogCiAJCWlmICgqc3RhdHVzICYgd204MzF4X2lycXNbaV0ubWFzaykKIAkJCWhhbmRsZV9uZXN0ZWRfaXJxKHdtODMxeC0+aXJxX2Jhc2UgKyBpKTsKKworCQkvKiBTaW11bGF0ZSBhbiBlZGdlIHRyaWdnZXJlZCBJUlEgYnkgcG9sbGluZyB0aGUgaW5wdXQKKwkJICogc3RhdHVzLiAgVGhpcyBpcyBzdWNreSBidXQgaW1wcm92ZXMgaW50ZXJvcGVyYWJpbGl0eS4KKwkJICovCisJCWlmIChwcmltYXJ5ID09IFdNODMxWF9HUF9JTlQgJiYKKwkJICAgIHdtODMxeC0+Z3Bpb19sZXZlbFtpIC0gV004MzFYX0lSUV9HUElPXzFdKSB7CisJCQlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfR1BJT19MRVZFTCk7CisJCQl3aGlsZSAocmV0ICYgMSA8PCAoaSAtIFdNODMxWF9JUlFfR1BJT18xKSkgeworCQkJCWhhbmRsZV9uZXN0ZWRfaXJxKHdtODMxeC0+aXJxX2Jhc2UgKyBpKTsKKwkJCQlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LAorCQkJCQkJICAgICAgV004MzFYX0dQSU9fTEVWRUwpOworCQkJfQorCQl9CiAJfQogCiBvdXQ6CkBAIC01OTYsOCArNjE2LDYgQEAKIAkJCSAiTm8gaW50ZXJydXB0IHNwZWNpZmllZCAtIGZ1bmN0aW9uYWxpdHkgbGltaXRlZFxuIik7CiAJfQogCi0KLQogCS8qIEVuYWJsZSB0b3AgbGV2ZWwgaW50ZXJydXB0cywgd2UgbWFzayBhdCBzZWNvbmRhcnkgbGV2ZWwgKi8KIAl3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwgV004MzFYX1NZU1RFTV9JTlRFUlJVUFRTX01BU0ssIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTg0MDAtY29yZS5jIGIvZHJpdmVycy9tZmQvd204NDAwLWNvcmUuYwppbmRleCBlMDZiYTk0Li42MmI0NjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTg0MDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODQwMC1jb3JlLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMKaW5kZXggYmZkZTRlOC4uNWQ2YmExMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYworKysgYi9kcml2ZXJzL21mZC93bTg5OTQtY29yZS5jCkBAIC0xNjcsNiArMTY3LDE4IEBACiAgKiBhbmQgc2hvdWxkIGJlIGhhbmRsZWQgdmlhIHRoZSBzdGFuZGFyZCByZWd1bGF0b3IgQVBJIHN1cHBseQogICogbWFuYWdlbWVudC4KICAqLworc3RhdGljIGNvbnN0IGNoYXIgKndtMTgxMV9tYWluX3N1cHBsaWVzW10gPSB7CisJIkRCVkREMSIsCisJIkRCVkREMiIsCisJIkRCVkREMyIsCisJIkRDVkREIiwKKwkiQVZERDEiLAorCSJBVkREMiIsCisJIkNQVkREIiwKKwkiU1BLVkREMSIsCisJIlNQS1ZERDIiLAorfTsKKwogc3RhdGljIGNvbnN0IGNoYXIgKndtODk5NF9tYWluX3N1cHBsaWVzW10gPSB7CiAJIkRCVkREIiwKIAkiRENWREQiLApAQCAtMjA1LDYgKzIxNyw0NyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlyZXQgPSB3bTg5OTRfcmVnX3JlYWQod204OTk0LCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF80KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIHBvd2VyIHN0YXR1czogJWRcbiIsIHJldCk7CisJfSBlbHNlIGlmIChyZXQgJiAoV004OTk0X0FJRjJBRENMX0VOQSB8IFdNODk5NF9BSUYyQURDUl9FTkEgfAorCQkJICBXTTg5OTRfQUlGMUFEQzJMX0VOQSB8IFdNODk5NF9BSUYxQURDMlJfRU5BIHwKKwkJCSAgV004OTk0X0FJRjFBREMxTF9FTkEgfCBXTTg5OTRfQUlGMUFEQzFSX0VOQSkpIHsKKwkJZGV2X2RiZyhkZXYsICJDT0RFQyBzdGlsbCBhY3RpdmUsIGlnbm9yaW5nIHN1c3BlbmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSB3bTg5OTRfcmVnX3JlYWQod204OTk0LCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF81KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIHBvd2VyIHN0YXR1czogJWRcbiIsIHJldCk7CisJfSBlbHNlIGlmIChyZXQgJiAoV004OTk0X0FJRjJEQUNMX0VOQSB8IFdNODk5NF9BSUYyREFDUl9FTkEgfAorCQkJICBXTTg5OTRfQUlGMURBQzJMX0VOQSB8IFdNODk5NF9BSUYxREFDMlJfRU5BIHwKKwkJCSAgV004OTk0X0FJRjFEQUMxTF9FTkEgfCBXTTg5OTRfQUlGMURBQzFSX0VOQSkpIHsKKwkJZGV2X2RiZyhkZXYsICJDT0RFQyBzdGlsbCBhY3RpdmUsIGlnbm9yaW5nIHN1c3BlbmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHdtODk5NC0+dHlwZSkgeworCWNhc2UgV004OTU4OgorCQlyZXQgPSB3bTg5OTRfcmVnX3JlYWQod204OTk0LCBXTTg5NThfTUlDX0RFVEVDVF8xKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgcG93ZXIgc3RhdHVzOiAlZFxuIiwgcmV0KTsKKwkJfSBlbHNlIGlmIChyZXQgJiBXTTg5NThfTUlDRF9FTkEpIHsKKwkJCWRldl9kYmcoZGV2LCAiQ09ERUMgc3RpbGwgYWN0aXZlLCBpZ25vcmluZyBzdXNwZW5kXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIERpc2FibGUgTERPIHB1bGxkb3ducyB3aGlsZSB0aGUgZGV2aWNlIGlzIHN1c3BlbmRlZCBpZiB3ZQorCSAqIGRvbid0IGtub3cgdGhhdCBzb21ldGhpbmcgd2lsbCBiZSBkcml2aW5nIHRoZW0uICovCisJaWYgKCF3bTg5OTQtPmxkb19lbmFfYWx3YXlzX2RyaXZlbikKKwkJd204OTk0X3NldF9iaXRzKHdtODk5NCwgV004OTk0X1BVTExfQ09OVFJPTF8yLAorCQkJCVdNODk5NF9MRE8xRU5BX1BEIHwgV004OTk0X0xETzJFTkFfUEQsCisJCQkJV004OTk0X0xETzFFTkFfUEQgfCBXTTg5OTRfTERPMkVOQV9QRCk7CisKIAkvKiBHUElPIGNvbmZpZ3VyYXRpb24gc3RhdGUgaXMgc2F2ZWQgaGVyZSBzaW5jZSB3ZSBtYXkgYmUgY29uZmlndXJpbmcKIAkgKiB0aGUgR1BJTyBhbHRlcm5hdGUgZnVuY3Rpb25zIGV2ZW4gaWYgd2UncmUgbm90IHVzaW5nIHRoZSBncGlvbGliCiAJICogZHJpdmVyIGZvciB0aGVtLgpAQCAtMjc0LDYgKzMyNywxMSBAQAogCWlmIChyZXQgPCAwKQogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXN0b3JlIEdQSU8gcmVnaXN0ZXJzOiAlZFxuIiwgcmV0KTsKIAorCS8qIERpc2FibGUgTERPIHB1bGxkb3ducyB3aGlsZSB0aGUgZGV2aWNlIGlzIGFjdGl2ZSAqLworCXdtODk5NF9zZXRfYml0cyh3bTg5OTQsIFdNODk5NF9QVUxMX0NPTlRST0xfMiwKKwkJCVdNODk5NF9MRE8xRU5BX1BEIHwgV004OTk0X0xETzJFTkFfUEQsCisJCQkwKTsKKwogCXdtODk5NC0+c3VzcGVuZGVkID0gZmFsc2U7CiAKIAlyZXR1cm4gMDsKQEAgLTMyOSw2ICszODcsOSBAQAogCX0KIAogCXN3aXRjaCAod204OTk0LT50eXBlKSB7CisJY2FzZSBXTTE4MTE6CisJCXdtODk5NC0+bnVtX3N1cHBsaWVzID0gQVJSQVlfU0laRSh3bTE4MTFfbWFpbl9zdXBwbGllcyk7CisJCWJyZWFrOwogCWNhc2UgV004OTk0OgogCQl3bTg5OTQtPm51bV9zdXBwbGllcyA9IEFSUkFZX1NJWkUod204OTk0X21haW5fc3VwcGxpZXMpOwogCQlicmVhazsKQEAgLTM0OSw2ICs0MTAsMTAgQEAKIAl9CiAKIAlzd2l0Y2ggKHdtODk5NC0+dHlwZSkgeworCWNhc2UgV00xODExOgorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTE4MTFfbWFpbl9zdXBwbGllcyk7IGkrKykKKwkJCXdtODk5NC0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd20xODExX21haW5fc3VwcGxpZXNbaV07CisJCWJyZWFrOwogCWNhc2UgV004OTk0OgogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5OTRfbWFpbl9zdXBwbGllcyk7IGkrKykKIAkJCXdtODk5NC0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd204OTk0X21haW5fc3VwcGxpZXNbaV07CkBAIC0zODIsNiArNDQ3LDEzIEBACiAJCWdvdG8gZXJyX2VuYWJsZTsKIAl9CiAJc3dpdGNoIChyZXQpIHsKKwljYXNlIDB4MTgxMToKKwkJZGV2bmFtZSA9ICJXTTE4MTEiOworCQlpZiAod204OTk0LT50eXBlICE9IFdNMTgxMSkKKwkJCWRldl93YXJuKHdtODk5NC0+ZGV2LCAiRGV2aWNlIHJlZ2lzdGVyZWQgYXMgdHlwZSAlZFxuIiwKKwkJCQkgd204OTk0LT50eXBlKTsKKwkJd204OTk0LT50eXBlID0gV00xODExOworCQlicmVhazsKIAljYXNlIDB4ODk5NDoKIAkJZGV2bmFtZSA9ICJXTTg5OTQiOwogCQlpZiAod204OTk0LT50eXBlICE9IFdNODk5NCkKQEAgLTQ0MSw4ICs1MTMsMTUgQEAKIAkJCQkJCXBkYXRhLT5ncGlvX2RlZmF1bHRzW2ldKTsKIAkJCX0KIAkJfQorCisJCXdtODk5NC0+bGRvX2VuYV9hbHdheXNfZHJpdmVuID0gcGRhdGEtPmxkb19lbmFfYWx3YXlzX2RyaXZlbjsKIAl9CiAKKwkvKiBEaXNhYmxlIExETyBwdWxsZG93bnMgd2hpbGUgdGhlIGRldmljZSBpcyBhY3RpdmUgKi8KKwl3bTg5OTRfc2V0X2JpdHMod204OTk0LCBXTTg5OTRfUFVMTF9DT05UUk9MXzIsCisJCQlXTTg5OTRfTERPMUVOQV9QRCB8IFdNODk5NF9MRE8yRU5BX1BELAorCQkJMCk7CisKIAkvKiBJbiBzb21lIHN5c3RlbSBkZXNpZ25zIHdoZXJlIHRoZSByZWd1bGF0b3JzIGFyZSBub3QgaW4gdXNlLAogCSAqIHdlIGNhbiBhY2hpZXZlIGEgc21hbGwgcmVkdWN0aW9uIGluIGxlYWthZ2UgY3VycmVudHMgYnkKIAkgKiBmbG9hdGluZyBMRE8gb3V0cHV0cy4gIFRoaXMgYml0IG1ha2VzIG5vIGRpZmZlcmVuY2UgaWYgdGhlCkBAIC01MzksNiArNjE4LDcgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtODk5NF9pMmNfaWRbXSA9IHsKKwl7ICJ3bTE4MTEiLCBXTTE4MTEgfSwKIAl7ICJ3bTg5OTQiLCBXTTg5OTQgfSwKIAl7ICJ3bTg5NTgiLCBXTTg5NTggfSwKIAl7IH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggMmQ2NDIzYy4uZDU5Mzg3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTYzLDcgKzYzLDcgQEAKIAogY29uZmlnIEFUTUVMX1BXTQogCXRyaXN0YXRlICJBdG1lbCBBVDMyL0FUOTEgUFdNIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBVlIzMiB8fCBBUkNIX0FUOTFTQU05MjYzIHx8IEFSQ0hfQVQ5MVNBTTlSTCB8fCBBUkNIX0FUOTFDQVA5CisJZGVwZW5kcyBvbiBIQVZFX0NMSwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZGV2aWNlIGRyaXZlciBzdXBwb3J0IGZvciB0aGUgUFdNIGNoYW5uZWxzCiAJICBvbiBjZXJ0YWluIEF0bWVsIHByb2Nlc3NvcnMuICBQdWxzZSBXaWR0aCBNb2R1bGF0aW9uIGlzIHVzZWQgZm9yCkBAIC01MDYsNSArNTA2LDYgQEAKIHNvdXJjZSAiZHJpdmVycy9taXNjL3RpLXN0L0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9saXMzbHYwMmQvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9taXNjL2Nhcm1hL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvS2NvbmZpZyIKIAogZW5kaWYgIyBNSVNDX0RFVklDRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCA4ZjNlZmI2Li5iMjY0OTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC00NywzICs0Nyw0IEBACiBvYmoteQkJCQkrPSBsaXMzbHYwMmQvCiBvYmoteQkJCQkrPSBjYXJtYS8KIG9iai0kKENPTkZJR19VU0JfU1dJVENIX0ZTQTk0ODApICs9IGZzYTk0ODAubworb2JqLSQoQ09ORklHX0FMVEVSQV9TVEFQTCkJKz1hbHRlcmEtc3RhcGwvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYWI4NTAwLXB3bS5jIGIvZHJpdmVycy9taXNjL2FiODUwMC1wd20uYwppbmRleCAzNTkwMzE1Li4yMjA4YTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYWI4NTAwLXB3bS5jCisrKyBiL2RyaXZlcnMvbWlzYy9hYjg1MDAtcHdtLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wd20uaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvYWI4NTAwLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKgogICogUFdNIE91dCBnZW5lcmF0b3JzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYWQ1MjV4X2Rwb3QtaTJjLmMgYi9kcml2ZXJzL21pc2MvYWQ1MjV4X2Rwb3QtaTJjLmMKaW5kZXggNGZmNzNjMi4uYTM5ZTA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LWkyYy5jCisrKyBiL2RyaXZlcnMvbWlzYy9hZDUyNXhfZHBvdC1pMmMuYwpAQCAtOTgsNiArOTgsNyBAQAogCXsiYWQ1MjgyIiwgQUQ1MjgyX0lEfSwKIAl7ImFkbjI4NjAiLCBBRE4yODYwX0lEfSwKIAl7ImFkNTI3MyIsIEFENTI3M19JRH0sCisJeyJhZDUxNjEiLCBBRDUxNjFfSUR9LAogCXsiYWQ1MTcxIiwgQUQ1MTcxX0lEfSwKIAl7ImFkNTE3MCIsIEFENTE3MF9JRH0sCiAJeyJhZDUxNzIiLCBBRDUxNzJfSUR9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9LY29uZmlnIGIvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDFkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL0tjb25maWcKQEAgLTAsMCArMSw4IEBACitjb21tZW50ICJBbHRlcmEgRlBHQSBmaXJtd2FyZSBkb3dubG9hZCBtb2R1bGUiCisKK2NvbmZpZyBBTFRFUkFfU1RBUEwKKwl0cmlzdGF0ZSAiQWx0ZXJhIEZQR0EgZmlybXdhcmUgZG93bmxvYWQgbW9kdWxlIgorCWRlcGVuZHMgb24gSTJDCisJZGVmYXVsdCBuCisJaGVscAorCSAgQW4gQWx0ZXJhIEZQR0EgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyB0b29sLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1ZjYxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorYWx0ZXJhLXN0YXBsLW9ianMgPSBhbHRlcmEtbHB0Lm8gYWx0ZXJhLWp0YWcubyBhbHRlcmEtY29tcC5vIGFsdGVyYS5vCisKK29iai0kKENPTkZJR19BTFRFUkFfU1RBUEwpICs9IGFsdGVyYS1zdGFwbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1jb21wLmMgYi9kcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL2FsdGVyYS1jb21wLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWNvbXAuYwpyZW5hbWUgdG8gZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtY29tcC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1leHBydC5oIGIvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtZXhwcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtZXhwcnQuaApyZW5hbWUgdG8gZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtZXhwcnQuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jIGIvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YmYyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL2FsdGVyYS1qdGFnLmMKQEAgLTAsMCArMSwxMDIxIEBACisvKgorICogYWx0ZXJhLWp0YWcuYworICoKKyAqIGFsdGVyYSBGUEdBIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgQWx0ZXJhIENvcnBvcmF0aW9uIDE5OTgtMjAwMQorICogQ29weXJpZ2h0IChDKSAyMDEwIE5ldFVQIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBJZ29yIE0uIExpcGxpYW5pbiA8bGlwbGlhbmluQG5ldHVwLnJ1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxtaXNjL2FsdGVyYS5oPgorI2luY2x1ZGUgImFsdGVyYS1leHBydC5oIgorI2luY2x1ZGUgImFsdGVyYS1qdGFnLmgiCisKKyNkZWZpbmUJYWx0X2p0YWdfaW8oYSwgYiwgYylcCisJCWFzdGF0ZS0+Y29uZmlnLT5qdGFnX2lvKGFzdGF0ZS0+Y29uZmlnLT5kZXYsIGEsIGIsIGMpOworCisjZGVmaW5lCWFsdF9tYWxsb2MoYSkJa3phbGxvYyhhLCBHRlBfS0VSTkVMKTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIHNob3dzLCBmb3IgZWFjaCBKVEFHIHN0YXRlLCB3aGljaCBzdGF0ZSBpcyByZWFjaGVkIGFmdGVyCisgKiBhIHNpbmdsZSBUQ0sgY2xvY2sgY3ljbGUgd2l0aCBUTVMgaGlnaCBvciBUTVMgbG93LCByZXNwZWN0aXZlbHkuICBUaGlzCisgKiBkZXNjcmliZXMgYWxsIHBvc3NpYmxlIHN0YXRlIHRyYW5zaXRpb25zIGluIHRoZSBKVEFHIHN0YXRlIG1hY2hpbmUuCisgKi8KK3N0cnVjdCBhbHRlcmFfanRhZ19tYWNoaW5lIHsKKwllbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHRtc19oaWdoOworCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgdG1zX2xvdzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWx0ZXJhX2p0YWdfbWFjaGluZSBhbHRlcmFfdHJhbnNpdGlvbnNbXSA9IHsKKwkvKiBSRVNFVCAgICAgKi8JeyBSRVNFVCwJSURMRSB9LAorCS8qIElETEUgICAgICAqLwl7IERSU0VMRUNULAlJRExFIH0sCisJLyogRFJTRUxFQ1QgICovCXsgSVJTRUxFQ1QsCURSQ0FQVFVSRSB9LAorCS8qIERSQ0FQVFVSRSAqLwl7IERSRVhJVDEsCURSU0hJRlQgfSwKKwkvKiBEUlNISUZUICAgKi8JeyBEUkVYSVQxLAlEUlNISUZUIH0sCisJLyogRFJFWElUMSAgICovCXsgRFJVUERBVEUsCURSUEFVU0UgfSwKKwkvKiBEUlBBVVNFICAgKi8JeyBEUkVYSVQyLAlEUlBBVVNFIH0sCisJLyogRFJFWElUMiAgICovCXsgRFJVUERBVEUsCURSU0hJRlQgfSwKKwkvKiBEUlVQREFURSAgKi8JeyBEUlNFTEVDVCwJSURMRSB9LAorCS8qIElSU0VMRUNUICAqLwl7IFJFU0VULAlJUkNBUFRVUkUgfSwKKwkvKiBJUkNBUFRVUkUgKi8JeyBJUkVYSVQxLAlJUlNISUZUIH0sCisJLyogSVJTSElGVCAgICovCXsgSVJFWElUMSwJSVJTSElGVCB9LAorCS8qIElSRVhJVDEgICAqLwl7IElSVVBEQVRFLAlJUlBBVVNFIH0sCisJLyogSVJQQVVTRSAgICovCXsgSVJFWElUMiwJSVJQQVVTRSB9LAorCS8qIElSRVhJVDIgICAqLwl7IElSVVBEQVRFLAlJUlNISUZUIH0sCisJLyogSVJVUERBVEUgICovCXsgRFJTRUxFQ1QsCUlETEUgfQorfTsKKworLyoKKyAqIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIFRNUyB2YWx1ZSB0byBiZSB1c2VkIHRvIHRha2UgdGhlIE5FWFQgU1RFUCBvbgorICogdGhlIHBhdGggdG8gdGhlIGRlc2lyZWQgc3RhdGUuICBUaGUgYXJyYXkgaW5kZXggaXMgdGhlIGN1cnJlbnQgc3RhdGUsCisgKiBhbmQgdGhlIGJpdCBwb3NpdGlvbiBpcyB0aGUgZGVzaXJlZCBlbmRzdGF0ZS4gIFRvIGZpbmQgb3V0IHdoaWNoIHN0YXRlCisgKiBpcyB1c2VkIGFzIHRoZSBpbnRlcm1lZGlhdGUgc3RhdGUsIGxvb2sgdXAgdGhlIFRNUyB2YWx1ZSBpbiB0aGUKKyAqIGFsdGVyYV90cmFuc2l0aW9uc1tdIHRhYmxlLgorICovCitzdGF0aWMgY29uc3QgdTE2IGFsdGVyYV9qdGFnX3BhdGhfbWFwWzE2XSA9IHsKKwkvKiBSU1QJUlRJCVNEUlMJQ0RSCVNEUglFMURSCVBEUglFMkRSICovCisJMHgwMDAxLAkweEZGRkQsCTB4RkUwMSwJMHhGRkU3LAkweEZGRUYsCTB4RkYwRiwJMHhGRkJGLAkweEZGRkYsCisJLyogVURSCVNJUlMJQ0lSCVNJUglFMUlSCVBJUglFMklSCVVJUiAqLworCTB4RkVGRCwJMHgwMDAxLAkweEYzRkYsCTB4RjdGRiwJMHg4N0ZGLAkweERGRkYsCTB4RkZGRiwJMHg3RkZECit9OworCisvKiBGbGFnIGJpdHMgZm9yIGFsdF9qdGFnX2lvKCkgZnVuY3Rpb24gKi8KKyNkZWZpbmUgVE1TX0hJR0ggICAxCisjZGVmaW5lIFRNU19MT1cgICAgMAorI2RlZmluZSBURElfSElHSCAgIDEKKyNkZWZpbmUgVERJX0xPVyAgICAwCisjZGVmaW5lIFJFQURfVERPICAgMQorI2RlZmluZSBJR05PUkVfVERPIDAKKworaW50IGFsdGVyYV9qaW5pdChzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUpCit7CisJc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOworCisJLyogaW5pdGlhbCBKVEFHIHN0YXRlIGlzIHVua25vd24gKi8KKwlqcy0+anRhZ19zdGF0ZSA9IElMTEVHQUxfSlRBR19TVEFURTsKKworCS8qIGluaXRpYWxpemUgdG8gZGVmYXVsdCBzdGF0ZSAqLworCWpzLT5kcnN0b3Bfc3RhdGUgPSBJRExFOworCWpzLT5pcnN0b3Bfc3RhdGUgPSBJRExFOworCWpzLT5kcl9wcmUgID0gMDsKKwlqcy0+ZHJfcG9zdCA9IDA7CisJanMtPmlyX3ByZSAgPSAwOworCWpzLT5pcl9wb3N0ID0gMDsKKwlqcy0+ZHJfbGVuZ3RoICAgID0gMDsKKwlqcy0+aXJfbGVuZ3RoICAgID0gMDsKKworCWpzLT5kcl9wcmVfZGF0YSAgPSBOVUxMOworCWpzLT5kcl9wb3N0X2RhdGEgPSBOVUxMOworCWpzLT5pcl9wcmVfZGF0YSAgPSBOVUxMOworCWpzLT5pcl9wb3N0X2RhdGEgPSBOVUxMOworCWpzLT5kcl9idWZmZXIJID0gTlVMTDsKKwlqcy0+aXJfYnVmZmVyCSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFsdGVyYV9zZXRfZHJzdG9wKHN0cnVjdCBhbHRlcmFfanRhZyAqanMsIGVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgc3RhdGUpCit7CisJanMtPmRyc3RvcF9zdGF0ZSA9IHN0YXRlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBhbHRlcmFfc2V0X2lyc3RvcChzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzLCBlbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHN0YXRlKQoreworCWpzLT5pcnN0b3Bfc3RhdGUgPSBzdGF0ZTsKKworCXJldHVybiAwOworfQorCitpbnQgYWx0ZXJhX3NldF9kcl9wcmUoc3RydWN0IGFsdGVyYV9qdGFnICpqcywKKwkJCQl1MzIgY291bnQsIHUzMiBzdGFydF9pbmRleCwKKwkJCQl1OCAqcHJlYW1ibGVfZGF0YSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgaTsKKwl1MzIgajsKKworCWlmIChjb3VudCA+IGpzLT5kcl9wcmUpIHsKKwkJa2ZyZWUoanMtPmRyX3ByZV9kYXRhKTsKKwkJanMtPmRyX3ByZV9kYXRhID0gKHU4ICopYWx0X21hbGxvYygoY291bnQgKyA3KSA+PiAzKTsKKwkJaWYgKGpzLT5kcl9wcmVfZGF0YSA9PSBOVUxMKQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJZWxzZQorCQkJanMtPmRyX3ByZSA9IGNvdW50OworCX0gZWxzZQorCQlqcy0+ZHJfcHJlID0gY291bnQ7CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJCWogPSBpICsgc3RhcnRfaW5kZXg7CisKKwkJCWlmIChwcmVhbWJsZV9kYXRhID09IE5VTEwpCisJCQkJanMtPmRyX3ByZV9kYXRhW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7CisJCQllbHNlIHsKKwkJCQlpZiAocHJlYW1ibGVfZGF0YVtqID4+IDNdICYgKDEgPDwgKGogJiA3KSkpCisJCQkJCWpzLT5kcl9wcmVfZGF0YVtpID4+IDNdIHw9CisJCQkJCQkJKDEgPDwgKGkgJiA3KSk7CisJCQkJZWxzZQorCQkJCQlqcy0+ZHJfcHJlX2RhdGFbaSA+PiAzXSAmPQorCQkJCQkJCX4odTMyKSgxIDw8IChpICYgNykpOworCisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYWx0ZXJhX3NldF9pcl9wcmUoc3RydWN0IGFsdGVyYV9qdGFnICpqcywgdTMyIGNvdW50LCB1MzIgc3RhcnRfaW5kZXgsCisJCQkJCQkJdTggKnByZWFtYmxlX2RhdGEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGk7CisJdTMyIGo7CisKKwlpZiAoY291bnQgPiBqcy0+aXJfcHJlKSB7CisJCWtmcmVlKGpzLT5pcl9wcmVfZGF0YSk7CisJCWpzLT5pcl9wcmVfZGF0YSA9ICh1OCAqKWFsdF9tYWxsb2MoKGNvdW50ICsgNykgPj4gMyk7CisJCWlmIChqcy0+aXJfcHJlX2RhdGEgPT0gTlVMTCkKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCWVsc2UKKwkJCWpzLT5pcl9wcmUgPSBjb3VudDsKKworCX0gZWxzZQorCQlqcy0+aXJfcHJlID0gY291bnQ7CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJCWogPSBpICsgc3RhcnRfaW5kZXg7CisJCQlpZiAocHJlYW1ibGVfZGF0YSA9PSBOVUxMKQorCQkJCWpzLT5pcl9wcmVfZGF0YVtpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOworCQkJZWxzZSB7CisJCQkJaWYgKHByZWFtYmxlX2RhdGFbaiA+PiAzXSAmICgxIDw8IChqICYgNykpKQorCQkJCQlqcy0+aXJfcHJlX2RhdGFbaSA+PiAzXSB8PQorCQkJCQkJCSgxIDw8IChpICYgNykpOworCQkJCWVsc2UKKwkJCQkJanMtPmlyX3ByZV9kYXRhW2kgPj4gM10gJj0KKwkJCQkJCQl+KHUzMikoMSA8PCAoaSAmIDcpKTsKKworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGFsdGVyYV9zZXRfZHJfcG9zdChzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzLCB1MzIgY291bnQsIHUzMiBzdGFydF9pbmRleCwKKwkJCQkJCXU4ICpwb3N0YW1ibGVfZGF0YSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgaTsKKwl1MzIgajsKKworCWlmIChjb3VudCA+IGpzLT5kcl9wb3N0KSB7CisJCWtmcmVlKGpzLT5kcl9wb3N0X2RhdGEpOworCQlqcy0+ZHJfcG9zdF9kYXRhID0gKHU4ICopYWx0X21hbGxvYygoY291bnQgKyA3KSA+PiAzKTsKKworCQlpZiAoanMtPmRyX3Bvc3RfZGF0YSA9PSBOVUxMKQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJZWxzZQorCQkJanMtPmRyX3Bvc3QgPSBjb3VudDsKKworCX0gZWxzZQorCQlqcy0+ZHJfcG9zdCA9IGNvdW50OworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQlqID0gaSArIHN0YXJ0X2luZGV4OworCisJCQlpZiAocG9zdGFtYmxlX2RhdGEgPT0gTlVMTCkKKwkJCQlqcy0+ZHJfcG9zdF9kYXRhW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7CisJCQllbHNlIHsKKwkJCQlpZiAocG9zdGFtYmxlX2RhdGFbaiA+PiAzXSAmICgxIDw8IChqICYgNykpKQorCQkJCQlqcy0+ZHJfcG9zdF9kYXRhW2kgPj4gM10gfD0KKwkJCQkJCQkJKDEgPDwgKGkgJiA3KSk7CisJCQkJZWxzZQorCQkJCQlqcy0+ZHJfcG9zdF9kYXRhW2kgPj4gM10gJj0KKwkJCQkJICAgIH4odTMyKSgxIDw8IChpICYgNykpOworCisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYWx0ZXJhX3NldF9pcl9wb3N0KHN0cnVjdCBhbHRlcmFfanRhZyAqanMsIHUzMiBjb3VudCwgdTMyIHN0YXJ0X2luZGV4LAorCQkJCQkJdTggKnBvc3RhbWJsZV9kYXRhKQoreworCWludCBzdGF0dXMgPSAwOworCXUzMiBpOworCXUzMiBqOworCisJaWYgKGNvdW50ID4ganMtPmlyX3Bvc3QpIHsKKwkJa2ZyZWUoanMtPmlyX3Bvc3RfZGF0YSk7CisJCWpzLT5pcl9wb3N0X2RhdGEgPSAodTggKilhbHRfbWFsbG9jKChjb3VudCArIDcpID4+IDMpOworCQlpZiAoanMtPmlyX3Bvc3RfZGF0YSA9PSBOVUxMKQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJZWxzZQorCQkJanMtPmlyX3Bvc3QgPSBjb3VudDsKKworCX0gZWxzZQorCQlqcy0+aXJfcG9zdCA9IGNvdW50OworCisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJaiA9IGkgKyBzdGFydF9pbmRleDsKKworCQlpZiAocG9zdGFtYmxlX2RhdGEgPT0gTlVMTCkKKwkJCWpzLT5pcl9wb3N0X2RhdGFbaSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKKwkJZWxzZSB7CisJCQlpZiAocG9zdGFtYmxlX2RhdGFbaiA+PiAzXSAmICgxIDw8IChqICYgNykpKQorCQkJCWpzLT5pcl9wb3N0X2RhdGFbaSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKKwkJCWVsc2UKKwkJCQlqcy0+aXJfcG9zdF9kYXRhW2kgPj4gM10gJj0KKwkJCQkgICAgfih1MzIpKDEgPDwgKGkgJiA3KSk7CisKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGFsdGVyYV9qcmVzZXRfaWRsZShzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUpCit7CisJc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOworCWludCBpOworCS8qIEdvIHRvIFRlc3QgTG9naWMgUmVzZXQgKG5vIG1hdHRlciB3aGF0IHRoZSBzdGFydGluZyBzdGF0ZSBtYXkgYmUpICovCisJZm9yIChpID0gMDsgaSA8IDU7ICsraSkKKwkJYWx0X2p0YWdfaW8oVE1TX0hJR0gsIFRESV9MT1csIElHTk9SRV9URE8pOworCisJLyogTm93IHN0ZXAgdG8gUnVuIFRlc3QgLyBJZGxlICovCisJYWx0X2p0YWdfaW8oVE1TX0xPVywgVERJX0xPVywgSUdOT1JFX1RETyk7CisJanMtPmp0YWdfc3RhdGUgPSBJRExFOworfQorCitpbnQgYWx0ZXJhX2dvdG9fanN0YXRlKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKKwkJCQkJZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7CisJaW50IHRtczsKKwlpbnQgY291bnQgPSAwOworCWludCBzdGF0dXMgPSAwOworCisJaWYgKGpzLT5qdGFnX3N0YXRlID09IElMTEVHQUxfSlRBR19TVEFURSkKKwkJLyogaW5pdGlhbGl6ZSBKVEFHIGNoYWluIHRvIGtub3duIHN0YXRlICovCisJCWFsdGVyYV9qcmVzZXRfaWRsZShhc3RhdGUpOworCisJaWYgKGpzLT5qdGFnX3N0YXRlID09IHN0YXRlKSB7CisJCS8qCisJCSAqIFdlIGFyZSBhbHJlYWR5IGluIHRoZSBkZXNpcmVkIHN0YXRlLgorCQkgKiBJZiBpdCBpcyBhIHN0YWJsZSBzdGF0ZSwgbG9vcCBoZXJlLgorCQkgKiBPdGhlcndpc2UgZG8gbm90aGluZyAobm8gY2xvY2sgY3ljbGVzKS4KKwkJICovCisJCWlmICgoc3RhdGUgPT0gSURMRSkgfHwgKHN0YXRlID09IERSU0hJRlQpIHx8CisJCQkoc3RhdGUgPT0gRFJQQVVTRSkgfHwgKHN0YXRlID09IElSU0hJRlQpIHx8CisJCQkJKHN0YXRlID09IElSUEFVU0UpKSB7CisJCQlhbHRfanRhZ19pbyhUTVNfTE9XLCBURElfTE9XLCBJR05PUkVfVERPKTsKKwkJfSBlbHNlIGlmIChzdGF0ZSA9PSBSRVNFVCkKKwkJCWFsdF9qdGFnX2lvKFRNU19ISUdILCBURElfTE9XLCBJR05PUkVfVERPKTsKKworCX0gZWxzZSB7CisJCXdoaWxlICgoanMtPmp0YWdfc3RhdGUgIT0gc3RhdGUpICYmIChjb3VudCA8IDkpKSB7CisJCQkvKiBHZXQgVE1TIHZhbHVlIHRvIHRha2UgYSBzdGVwIHRvd2FyZCBkZXNpcmVkIHN0YXRlICovCisJCQl0bXMgPSAoYWx0ZXJhX2p0YWdfcGF0aF9tYXBbanMtPmp0YWdfc3RhdGVdICYKKwkJCQkJCQkoMSA8PCBzdGF0ZSkpCisJCQkJCQkJPyBUTVNfSElHSCA6IFRNU19MT1c7CisKKwkJCS8qIFRha2UgYSBzdGVwICovCisJCQlhbHRfanRhZ19pbyh0bXMsIFRESV9MT1csIElHTk9SRV9URE8pOworCisJCQlpZiAodG1zKQorCQkJCWpzLT5qdGFnX3N0YXRlID0KKwkJCQkJYWx0ZXJhX3RyYW5zaXRpb25zW2pzLT5qdGFnX3N0YXRlXS50bXNfaGlnaDsKKwkJCWVsc2UKKwkJCQlqcy0+anRhZ19zdGF0ZSA9CisJCQkJCWFsdGVyYV90cmFuc2l0aW9uc1tqcy0+anRhZ19zdGF0ZV0udG1zX2xvdzsKKworCQkJKytjb3VudDsKKwkJfQorCX0KKworCWlmIChqcy0+anRhZ19zdGF0ZSAhPSBzdGF0ZSkKKwkJc3RhdHVzID0gLUVSRU1PVEVJTzsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBhbHRlcmFfd2FpdF9jeWNsZXMoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAorCQkJCQlzMzIgY3ljbGVzLAorCQkJCQllbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHdhaXRfc3RhdGUpCit7CisJc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOworCWludCB0bXM7CisJczMyIGNvdW50OworCWludCBzdGF0dXMgPSAwOworCisJaWYgKGpzLT5qdGFnX3N0YXRlICE9IHdhaXRfc3RhdGUpCisJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIHdhaXRfc3RhdGUpOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCS8qCisJCSAqIFNldCBUTVMgaGlnaCB0byBsb29wIGluIFJFU0VUIHN0YXRlCisJCSAqIFNldCBUTVMgbG93IHRvIGxvb3AgaW4gYW55IG90aGVyIHN0YWJsZSBzdGF0ZQorCQkgKi8KKwkJdG1zID0gKHdhaXRfc3RhdGUgPT0gUkVTRVQpID8gVE1TX0hJR0ggOiBUTVNfTE9XOworCisJCWZvciAoY291bnQgPSAwTDsgY291bnQgPCBjeWNsZXM7IGNvdW50KyspCisJCQlhbHRfanRhZ19pbyh0bXMsIFRESV9MT1csIElHTk9SRV9URE8pOworCisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGFsdGVyYV93YWl0X21zZWNzKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKKwkJCXMzMiBtaWNyb3NlY29uZHMsIGVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgd2FpdF9zdGF0ZSkKKy8qCisgKiBDYXVzZXMgSlRBRyBoYXJkd2FyZSB0byBzaXQgaW4gdGhlIHNwZWNpZmllZCBzdGFibGUKKyAqIHN0YXRlIGZvciB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uIG9mIHJlYWwgdGltZS4gIElmCisgKiBubyBKVEFHIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHBlcmZvcm1lZCB5ZXQsIHRoZW4gb25seQorICogYSBkZWxheSBpcyBwZXJmb3JtZWQuICBUaGlzIHBlcm1pdHMgdGhlIFdBSVQgVVNFQ1MKKyAqIHN0YXRlbWVudCB0byBiZSB1c2VkIGluIFZFQ1RPUiBwcm9ncmFtcyB3aXRob3V0IGNhdXNpbmcKKyAqIGFueSBKVEFHIG9wZXJhdGlvbnMuCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIGVsc2UgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworeworCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICgoanMtPmp0YWdfc3RhdGUgIT0gSUxMRUdBTF9KVEFHX1NUQVRFKSAmJgorCSAgICAoanMtPmp0YWdfc3RhdGUgIT0gd2FpdF9zdGF0ZSkpCisJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIHdhaXRfc3RhdGUpOworCisJaWYgKHN0YXR1cyA9PSAwKQorCQkvKiBXYWl0IGZvciBzcGVjaWZpZWQgdGltZSBpbnRlcnZhbCAqLworCQl1ZGVsYXkobWljcm9zZWNvbmRzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGFsdGVyYV9jb25jYXRlbmF0ZV9kYXRhKHU4ICpidWZmZXIsCisJCQkJdTggKnByZWFtYmxlX2RhdGEsCisJCQkJdTMyIHByZWFtYmxlX2NvdW50LAorCQkJCXU4ICp0YXJnZXRfZGF0YSwKKwkJCQl1MzIgc3RhcnRfaW5kZXgsCisJCQkJdTMyIHRhcmdldF9jb3VudCwKKwkJCQl1OCAqcG9zdGFtYmxlX2RhdGEsCisJCQkJdTMyIHBvc3RhbWJsZV9jb3VudCkKKy8qCisgKiBDb3BpZXMgcHJlYW1ibGUgZGF0YSwgdGFyZ2V0IGRhdGEsIGFuZCBwb3N0YW1ibGUgZGF0YQorICogaW50byBvbmUgYnVmZmVyIGZvciBJUiBvciBEUiBzY2Fucy4KKyAqLworeworCXUzMiBpLCBqLCBrOworCisJZm9yIChpID0gMEw7IGkgPCBwcmVhbWJsZV9jb3VudDsgKytpKSB7CisJCWlmIChwcmVhbWJsZV9kYXRhW2kgPj4gM0xdICYgKDFMIDw8IChpICYgN0wpKSkKKwkJCWJ1ZmZlcltpID4+IDNMXSB8PSAoMUwgPDwgKGkgJiA3TCkpOworCQllbHNlCisJCQlidWZmZXJbaSA+PiAzTF0gJj0gfih1MzIpKDFMIDw8IChpICYgN0wpKTsKKworCX0KKworCWogPSBzdGFydF9pbmRleDsKKwlrID0gcHJlYW1ibGVfY291bnQgKyB0YXJnZXRfY291bnQ7CisJZm9yICg7IGkgPCBrOyArK2ksICsraikgeworCQlpZiAodGFyZ2V0X2RhdGFbaiA+PiAzTF0gJiAoMUwgPDwgKGogJiA3TCkpKQorCQkJYnVmZmVyW2kgPj4gM0xdIHw9ICgxTCA8PCAoaSAmIDdMKSk7CisJCWVsc2UKKwkJCWJ1ZmZlcltpID4+IDNMXSAmPSB+KHUzMikoMUwgPDwgKGkgJiA3TCkpOworCisJfQorCisJaiA9IDBMOworCWsgPSBwcmVhbWJsZV9jb3VudCArIHRhcmdldF9jb3VudCArIHBvc3RhbWJsZV9jb3VudDsKKwlmb3IgKDsgaSA8IGs7ICsraSwgKytqKSB7CisJCWlmIChwb3N0YW1ibGVfZGF0YVtqID4+IDNMXSAmICgxTCA8PCAoaiAmIDdMKSkpCisJCQlidWZmZXJbaSA+PiAzTF0gfD0gKDFMIDw8IChpICYgN0wpKTsKKwkJZWxzZQorCQkJYnVmZmVyW2kgPj4gM0xdICY9IH4odTMyKSgxTCA8PCAoaSAmIDdMKSk7CisKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWx0X2p0YWdfZHJzY2FuKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKKwkJCWludCBzdGFydF9zdGF0ZSwKKwkJCWludCBjb3VudCwKKwkJCXU4ICp0ZGksCisJCQl1OCAqdGRvKQoreworCWludCBpID0gMDsKKwlpbnQgdGRvX2JpdCA9IDA7CisJaW50IHN0YXR1cyA9IDE7CisKKwkvKiBGaXJzdCBnbyB0byBEUlNISUZUIHN0YXRlICovCisJc3dpdGNoIChzdGFydF9zdGF0ZSkgeworCWNhc2UgMDoJCQkJCQkvKiBJRExFICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlNFTEVDVCAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogRFJDQVBUVVJFICovCisJCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUlNISUZUICovCisJCWJyZWFrOworCisJY2FzZSAxOgkJCQkJCS8qIERSUEFVU0UgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSRVhJVDIgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSVVBEQVRFICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlNFTEVDVCAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogRFJDQVBUVVJFICovCisJCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUlNISUZUICovCisJCWJyZWFrOworCisJY2FzZSAyOgkJCQkJCS8qIElSUEFVU0UgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIElSRVhJVDIgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIElSVVBEQVRFICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlNFTEVDVCAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogRFJDQVBUVVJFICovCisJCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUlNISUZUICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gMDsKKwl9CisKKwlpZiAoc3RhdHVzKSB7CisJCS8qIGxvb3AgaW4gdGhlIFNISUZULURSIHN0YXRlICovCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQl0ZG9fYml0ID0gYWx0X2p0YWdfaW8oCisJCQkJCShpID09IGNvdW50IC0gMSksCisJCQkJCXRkaVtpID4+IDNdICYgKDEgPDwgKGkgJiA3KSksCisJCQkJCSh0ZG8gIT0gTlVMTCkpOworCisJCQlpZiAodGRvICE9IE5VTEwpIHsKKwkJCQlpZiAodGRvX2JpdCkKKwkJCQkJdGRvW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7CisJCQkJZWxzZQorCQkJCQl0ZG9baSA+PiAzXSAmPSB+KHUzMikoMSA8PCAoaSAmIDcpKTsKKworCQkJfQorCQl9CisKKwkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSUEFVU0UgKi8KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGFsdF9qdGFnX2lyc2NhbihzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCisJCSAgICBpbnQgc3RhcnRfc3RhdGUsCisJCSAgICBpbnQgY291bnQsCisJCSAgICB1OCAqdGRpLAorCQkgICAgdTggKnRkbykKK3sKKwlpbnQgaSA9IDA7CisJaW50IHRkb19iaXQgPSAwOworCWludCBzdGF0dXMgPSAxOworCisJLyogRmlyc3QgZ28gdG8gSVJTSElGVCBzdGF0ZSAqLworCXN3aXRjaCAoc3RhcnRfc3RhdGUpIHsKKwljYXNlIDA6CQkJCQkJLyogSURMRSAqLworCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJTRUxFQ1QgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIElSU0VMRUNUICovCisJCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUkNBUFRVUkUgKi8KKwkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIElSU0hJRlQgKi8KKwkJYnJlYWs7CisKKwljYXNlIDE6CQkJCQkJLyogRFJQQVVTRSAqLworCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJFWElUMiAqLworCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJVUERBVEUgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBJUlNFTEVDVCAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogSVJDQVBUVVJFICovCisJCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUlNISUZUICovCisJCWJyZWFrOworCisJY2FzZSAyOgkJCQkJCS8qIElSUEFVU0UgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIElSRVhJVDIgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIElSVVBEQVRFICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlNFTEVDVCAqLworCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJTRUxFQ1QgKi8KKwkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIElSQ0FQVFVSRSAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogSVJTSElGVCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IDA7CisJfQorCisJaWYgKHN0YXR1cykgeworCQkvKiBsb29wIGluIHRoZSBTSElGVC1JUiBzdGF0ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJdGRvX2JpdCA9IGFsdF9qdGFnX2lvKAorCQkJCSAgICAgIChpID09IGNvdW50IC0gMSksCisJCQkJICAgICAgdGRpW2kgPj4gM10gJiAoMSA8PCAoaSAmIDcpKSwKKwkJCQkgICAgICAodGRvICE9IE5VTEwpKTsKKwkJCWlmICh0ZG8gIT0gTlVMTCkgeworCQkJCWlmICh0ZG9fYml0KQorCQkJCQl0ZG9baSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKKwkJCQllbHNlCisJCQkJCXRkb1tpID4+IDNdICY9IH4odTMyKSgxIDw8IChpICYgNykpOworCisJCQl9CisJCX0KKworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogSVJQQVVTRSAqLworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGFsdGVyYV9leHRyYWN0X3RhcmdldF9kYXRhKHU4ICpidWZmZXIsCisJCQkJdTggKnRhcmdldF9kYXRhLAorCQkJCXUzMiBzdGFydF9pbmRleCwKKwkJCQl1MzIgcHJlYW1ibGVfY291bnQsCisJCQkJdTMyIHRhcmdldF9jb3VudCkKKy8qCisgKiBDb3BpZXMgdGFyZ2V0IGRhdGEgZnJvbSBzY2FuIGJ1ZmZlciwgZmlsdGVyaW5nIG91dAorICogcHJlYW1ibGUgYW5kIHBvc3RhbWJsZSBkYXRhLgorICovCit7CisJdTMyIGk7CisJdTMyIGo7CisJdTMyIGs7CisKKwlqID0gcHJlYW1ibGVfY291bnQ7CisJayA9IHN0YXJ0X2luZGV4ICsgdGFyZ2V0X2NvdW50OworCWZvciAoaSA9IHN0YXJ0X2luZGV4OyBpIDwgazsgKytpLCArK2opIHsKKwkJaWYgKGJ1ZmZlcltqID4+IDNdICYgKDEgPDwgKGogJiA3KSkpCisJCQl0YXJnZXRfZGF0YVtpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOworCQllbHNlCisJCQl0YXJnZXRfZGF0YVtpID4+IDNdICY9IH4odTMyKSgxIDw8IChpICYgNykpOworCisJfQorfQorCitpbnQgYWx0ZXJhX2lyc2NhbihzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCisJCQkJdTMyIGNvdW50LAorCQkJCXU4ICp0ZGlfZGF0YSwKKwkJCQl1MzIgc3RhcnRfaW5kZXgpCisvKiBTaGlmdHMgZGF0YSBpbnRvIGluc3RydWN0aW9uIHJlZ2lzdGVyICovCit7CisJc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOworCWludCBzdGFydF9jb2RlID0gMDsKKwl1MzIgYWxsb2NfY2hhcnMgPSAwOworCXUzMiBzaGlmdF9jb3VudCA9IGpzLT5pcl9wcmUgKyBjb3VudCArIGpzLT5pcl9wb3N0OworCWludCBzdGF0dXMgPSAwOworCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgc3RhcnRfc3RhdGUgPSBJTExFR0FMX0pUQUdfU1RBVEU7CisKKwlzd2l0Y2ggKGpzLT5qdGFnX3N0YXRlKSB7CisJY2FzZSBJTExFR0FMX0pUQUdfU1RBVEU6CisJY2FzZSBSRVNFVDoKKwljYXNlIElETEU6CisJCXN0YXJ0X2NvZGUgPSAwOworCQlzdGFydF9zdGF0ZSA9IElETEU7CisJCWJyZWFrOworCisJY2FzZSBEUlNFTEVDVDoKKwljYXNlIERSQ0FQVFVSRToKKwljYXNlIERSU0hJRlQ6CisJY2FzZSBEUkVYSVQxOgorCWNhc2UgRFJQQVVTRToKKwljYXNlIERSRVhJVDI6CisJY2FzZSBEUlVQREFURToKKwkJc3RhcnRfY29kZSA9IDE7CisJCXN0YXJ0X3N0YXRlID0gRFJQQVVTRTsKKwkJYnJlYWs7CisKKwljYXNlIElSU0VMRUNUOgorCWNhc2UgSVJDQVBUVVJFOgorCWNhc2UgSVJTSElGVDoKKwljYXNlIElSRVhJVDE6CisJY2FzZSBJUlBBVVNFOgorCWNhc2UgSVJFWElUMjoKKwljYXNlIElSVVBEQVRFOgorCQlzdGFydF9jb2RlID0gMjsKKwkJc3RhcnRfc3RhdGUgPSBJUlBBVVNFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FUkVNT1RFSU87CisJCWJyZWFrOworCX0KKworCWlmIChzdGF0dXMgPT0gMCkKKwkJaWYgKGpzLT5qdGFnX3N0YXRlICE9IHN0YXJ0X3N0YXRlKQorCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgc3RhcnRfc3RhdGUpOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWlmIChzaGlmdF9jb3VudCA+IGpzLT5pcl9sZW5ndGgpIHsKKwkJCWFsbG9jX2NoYXJzID0gKHNoaWZ0X2NvdW50ICsgNykgPj4gMzsKKwkJCWtmcmVlKGpzLT5pcl9idWZmZXIpOworCQkJanMtPmlyX2J1ZmZlciA9ICh1OCAqKWFsdF9tYWxsb2MoYWxsb2NfY2hhcnMpOworCQkJaWYgKGpzLT5pcl9idWZmZXIgPT0gTlVMTCkKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZWxzZQorCQkJCWpzLT5pcl9sZW5ndGggPSBhbGxvY19jaGFycyAqIDg7CisKKwkJfQorCX0KKworCWlmIChzdGF0dXMgPT0gMCkgeworCQkvKgorCQkgKiBDb3B5IHByZWFtYmxlIGRhdGEsIElSIGRhdGEsCisJCSAqIGFuZCBwb3N0YW1ibGUgZGF0YSBpbnRvIGEgYnVmZmVyCisJCSAqLworCQlhbHRlcmFfY29uY2F0ZW5hdGVfZGF0YShqcy0+aXJfYnVmZmVyLAorCQkJCQlqcy0+aXJfcHJlX2RhdGEsCisJCQkJCWpzLT5pcl9wcmUsCisJCQkJCXRkaV9kYXRhLAorCQkJCQlzdGFydF9pbmRleCwKKwkJCQkJY291bnQsCisJCQkJCWpzLT5pcl9wb3N0X2RhdGEsCisJCQkJCWpzLT5pcl9wb3N0KTsKKwkJLyogRG8gdGhlIElSU0NBTiAqLworCQlhbHRfanRhZ19pcnNjYW4oYXN0YXRlLAorCQkJCXN0YXJ0X2NvZGUsCisJCQkJc2hpZnRfY291bnQsCisJCQkJanMtPmlyX2J1ZmZlciwKKwkJCQlOVUxMKTsKKworCQkvKiBhbHRfanRhZ19pcnNjYW4oKSBhbHdheXMgZW5kcyBpbiBJUlBBVVNFIHN0YXRlICovCisJCWpzLT5qdGFnX3N0YXRlID0gSVJQQVVTRTsKKwl9CisKKwlpZiAoc3RhdHVzID09IDApCisJCWlmIChqcy0+aXJzdG9wX3N0YXRlICE9IElSUEFVU0UpCisJCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBqcy0+aXJzdG9wX3N0YXRlKTsKKworCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGFsdGVyYV9zd2FwX2lyKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKKwkJCSAgICB1MzIgY291bnQsCisJCQkgICAgdTggKmluX2RhdGEsCisJCQkgICAgdTMyIGluX2luZGV4LAorCQkJICAgIHU4ICpvdXRfZGF0YSwKKwkJCSAgICB1MzIgb3V0X2luZGV4KQorLyogU2hpZnRzIGRhdGEgaW50byBpbnN0cnVjdGlvbiByZWdpc3RlciwgY2FwdHVyaW5nIG91dHB1dCBkYXRhICovCit7CisJc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOworCWludCBzdGFydF9jb2RlID0gMDsKKwl1MzIgYWxsb2NfY2hhcnMgPSAwOworCXUzMiBzaGlmdF9jb3VudCA9IGpzLT5pcl9wcmUgKyBjb3VudCArIGpzLT5pcl9wb3N0OworCWludCBzdGF0dXMgPSAwOworCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgc3RhcnRfc3RhdGUgPSBJTExFR0FMX0pUQUdfU1RBVEU7CisKKwlzd2l0Y2ggKGpzLT5qdGFnX3N0YXRlKSB7CisJY2FzZSBJTExFR0FMX0pUQUdfU1RBVEU6CisJY2FzZSBSRVNFVDoKKwljYXNlIElETEU6CisJCXN0YXJ0X2NvZGUgPSAwOworCQlzdGFydF9zdGF0ZSA9IElETEU7CisJCWJyZWFrOworCisJY2FzZSBEUlNFTEVDVDoKKwljYXNlIERSQ0FQVFVSRToKKwljYXNlIERSU0hJRlQ6CisJY2FzZSBEUkVYSVQxOgorCWNhc2UgRFJQQVVTRToKKwljYXNlIERSRVhJVDI6CisJY2FzZSBEUlVQREFURToKKwkJc3RhcnRfY29kZSA9IDE7CisJCXN0YXJ0X3N0YXRlID0gRFJQQVVTRTsKKwkJYnJlYWs7CisKKwljYXNlIElSU0VMRUNUOgorCWNhc2UgSVJDQVBUVVJFOgorCWNhc2UgSVJTSElGVDoKKwljYXNlIElSRVhJVDE6CisJY2FzZSBJUlBBVVNFOgorCWNhc2UgSVJFWElUMjoKKwljYXNlIElSVVBEQVRFOgorCQlzdGFydF9jb2RlID0gMjsKKwkJc3RhcnRfc3RhdGUgPSBJUlBBVVNFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FUkVNT1RFSU87CisJCWJyZWFrOworCX0KKworCWlmIChzdGF0dXMgPT0gMCkKKwkJaWYgKGpzLT5qdGFnX3N0YXRlICE9IHN0YXJ0X3N0YXRlKQorCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgc3RhcnRfc3RhdGUpOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWlmIChzaGlmdF9jb3VudCA+IGpzLT5pcl9sZW5ndGgpIHsKKwkJCWFsbG9jX2NoYXJzID0gKHNoaWZ0X2NvdW50ICsgNykgPj4gMzsKKwkJCWtmcmVlKGpzLT5pcl9idWZmZXIpOworCQkJanMtPmlyX2J1ZmZlciA9ICh1OCAqKWFsdF9tYWxsb2MoYWxsb2NfY2hhcnMpOworCQkJaWYgKGpzLT5pcl9idWZmZXIgPT0gTlVMTCkKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZWxzZQorCQkJCWpzLT5pcl9sZW5ndGggPSBhbGxvY19jaGFycyAqIDg7CisKKwkJfQorCX0KKworCWlmIChzdGF0dXMgPT0gMCkgeworCQkvKgorCQkgKiBDb3B5IHByZWFtYmxlIGRhdGEsIElSIGRhdGEsCisJCSAqIGFuZCBwb3N0YW1ibGUgZGF0YSBpbnRvIGEgYnVmZmVyCisJCSAqLworCQlhbHRlcmFfY29uY2F0ZW5hdGVfZGF0YShqcy0+aXJfYnVmZmVyLAorCQkJCQlqcy0+aXJfcHJlX2RhdGEsCisJCQkJCWpzLT5pcl9wcmUsCisJCQkJCWluX2RhdGEsCisJCQkJCWluX2luZGV4LAorCQkJCQljb3VudCwKKwkJCQkJanMtPmlyX3Bvc3RfZGF0YSwKKwkJCQkJanMtPmlyX3Bvc3QpOworCisJCS8qIERvIHRoZSBJUlNDQU4gKi8KKwkJYWx0X2p0YWdfaXJzY2FuKGFzdGF0ZSwKKwkJCQlzdGFydF9jb2RlLAorCQkJCXNoaWZ0X2NvdW50LAorCQkJCWpzLT5pcl9idWZmZXIsCisJCQkJanMtPmlyX2J1ZmZlcik7CisKKwkJLyogYWx0X2p0YWdfaXJzY2FuKCkgYWx3YXlzIGVuZHMgaW4gSVJQQVVTRSBzdGF0ZSAqLworCQlqcy0+anRhZ19zdGF0ZSA9IElSUEFVU0U7CisJfQorCisJaWYgKHN0YXR1cyA9PSAwKQorCQlpZiAoanMtPmlyc3RvcF9zdGF0ZSAhPSBJUlBBVVNFKQorCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwganMtPmlyc3RvcF9zdGF0ZSk7CisKKworCWlmIChzdGF0dXMgPT0gMCkKKwkJLyogTm93IGV4dHJhY3QgdGhlIHJldHVybmVkIGRhdGEgZnJvbSB0aGUgYnVmZmVyICovCisJCWFsdGVyYV9leHRyYWN0X3RhcmdldF9kYXRhKGpzLT5pcl9idWZmZXIsCisJCQkJCW91dF9kYXRhLCBvdXRfaW5kZXgsCisJCQkJCWpzLT5pcl9wcmUsIGNvdW50KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBhbHRlcmFfZHJzY2FuKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKKwkJCQl1MzIgY291bnQsCisJCQkJdTggKnRkaV9kYXRhLAorCQkJCXUzMiBzdGFydF9pbmRleCkKKy8qIFNoaWZ0cyBkYXRhIGludG8gZGF0YSByZWdpc3RlciAoaWdub3Jpbmcgb3V0cHV0IGRhdGEpICovCit7CisJc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOworCWludCBzdGFydF9jb2RlID0gMDsKKwl1MzIgYWxsb2NfY2hhcnMgPSAwOworCXUzMiBzaGlmdF9jb3VudCA9IGpzLT5kcl9wcmUgKyBjb3VudCArIGpzLT5kcl9wb3N0OworCWludCBzdGF0dXMgPSAwOworCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgc3RhcnRfc3RhdGUgPSBJTExFR0FMX0pUQUdfU1RBVEU7CisKKwlzd2l0Y2ggKGpzLT5qdGFnX3N0YXRlKSB7CisJY2FzZSBJTExFR0FMX0pUQUdfU1RBVEU6CisJY2FzZSBSRVNFVDoKKwljYXNlIElETEU6CisJCXN0YXJ0X2NvZGUgPSAwOworCQlzdGFydF9zdGF0ZSA9IElETEU7CisJCWJyZWFrOworCisJY2FzZSBEUlNFTEVDVDoKKwljYXNlIERSQ0FQVFVSRToKKwljYXNlIERSU0hJRlQ6CisJY2FzZSBEUkVYSVQxOgorCWNhc2UgRFJQQVVTRToKKwljYXNlIERSRVhJVDI6CisJY2FzZSBEUlVQREFURToKKwkJc3RhcnRfY29kZSA9IDE7CisJCXN0YXJ0X3N0YXRlID0gRFJQQVVTRTsKKwkJYnJlYWs7CisKKwljYXNlIElSU0VMRUNUOgorCWNhc2UgSVJDQVBUVVJFOgorCWNhc2UgSVJTSElGVDoKKwljYXNlIElSRVhJVDE6CisJY2FzZSBJUlBBVVNFOgorCWNhc2UgSVJFWElUMjoKKwljYXNlIElSVVBEQVRFOgorCQlzdGFydF9jb2RlID0gMjsKKwkJc3RhcnRfc3RhdGUgPSBJUlBBVVNFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FUkVNT1RFSU87CisJCWJyZWFrOworCX0KKworCWlmIChzdGF0dXMgPT0gMCkKKwkJaWYgKGpzLT5qdGFnX3N0YXRlICE9IHN0YXJ0X3N0YXRlKQorCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgc3RhcnRfc3RhdGUpOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWlmIChzaGlmdF9jb3VudCA+IGpzLT5kcl9sZW5ndGgpIHsKKwkJCWFsbG9jX2NoYXJzID0gKHNoaWZ0X2NvdW50ICsgNykgPj4gMzsKKwkJCWtmcmVlKGpzLT5kcl9idWZmZXIpOworCQkJanMtPmRyX2J1ZmZlciA9ICh1OCAqKWFsdF9tYWxsb2MoYWxsb2NfY2hhcnMpOworCQkJaWYgKGpzLT5kcl9idWZmZXIgPT0gTlVMTCkKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZWxzZQorCQkJCWpzLT5kcl9sZW5ndGggPSBhbGxvY19jaGFycyAqIDg7CisKKwkJfQorCX0KKworCWlmIChzdGF0dXMgPT0gMCkgeworCQkvKgorCQkgKiBDb3B5IHByZWFtYmxlIGRhdGEsIERSIGRhdGEsCisJCSAqIGFuZCBwb3N0YW1ibGUgZGF0YSBpbnRvIGEgYnVmZmVyCisJCSAqLworCQlhbHRlcmFfY29uY2F0ZW5hdGVfZGF0YShqcy0+ZHJfYnVmZmVyLAorCQkJCQlqcy0+ZHJfcHJlX2RhdGEsCisJCQkJCWpzLT5kcl9wcmUsCisJCQkJCXRkaV9kYXRhLAorCQkJCQlzdGFydF9pbmRleCwKKwkJCQkJY291bnQsCisJCQkJCWpzLT5kcl9wb3N0X2RhdGEsCisJCQkJCWpzLT5kcl9wb3N0KTsKKwkJLyogRG8gdGhlIERSU0NBTiAqLworCQlhbHRfanRhZ19kcnNjYW4oYXN0YXRlLCBzdGFydF9jb2RlLCBzaGlmdF9jb3VudCwKKwkJCQlqcy0+ZHJfYnVmZmVyLCBOVUxMKTsKKwkJLyogYWx0X2p0YWdfZHJzY2FuKCkgYWx3YXlzIGVuZHMgaW4gRFJQQVVTRSBzdGF0ZSAqLworCQlqcy0+anRhZ19zdGF0ZSA9IERSUEFVU0U7CisJfQorCisJaWYgKHN0YXR1cyA9PSAwKQorCQlpZiAoanMtPmRyc3RvcF9zdGF0ZSAhPSBEUlBBVVNFKQorCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwganMtPmRyc3RvcF9zdGF0ZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYWx0ZXJhX3N3YXBfZHIoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLCB1MzIgY291bnQsCisJCQkJdTggKmluX2RhdGEsIHUzMiBpbl9pbmRleCwKKwkJCQl1OCAqb3V0X2RhdGEsIHUzMiBvdXRfaW5kZXgpCisvKiBTaGlmdHMgZGF0YSBpbnRvIGRhdGEgcmVnaXN0ZXIsIGNhcHR1cmluZyBvdXRwdXQgZGF0YSAqLworeworCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKKwlpbnQgc3RhcnRfY29kZSA9IDA7CisJdTMyIGFsbG9jX2NoYXJzID0gMDsKKwl1MzIgc2hpZnRfY291bnQgPSBqcy0+ZHJfcHJlICsgY291bnQgKyBqcy0+ZHJfcG9zdDsKKwlpbnQgc3RhdHVzID0gMDsKKwllbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHN0YXJ0X3N0YXRlID0gSUxMRUdBTF9KVEFHX1NUQVRFOworCisJc3dpdGNoIChqcy0+anRhZ19zdGF0ZSkgeworCWNhc2UgSUxMRUdBTF9KVEFHX1NUQVRFOgorCWNhc2UgUkVTRVQ6CisJY2FzZSBJRExFOgorCQlzdGFydF9jb2RlID0gMDsKKwkJc3RhcnRfc3RhdGUgPSBJRExFOworCQlicmVhazsKKworCWNhc2UgRFJTRUxFQ1Q6CisJY2FzZSBEUkNBUFRVUkU6CisJY2FzZSBEUlNISUZUOgorCWNhc2UgRFJFWElUMToKKwljYXNlIERSUEFVU0U6CisJY2FzZSBEUkVYSVQyOgorCWNhc2UgRFJVUERBVEU6CisJCXN0YXJ0X2NvZGUgPSAxOworCQlzdGFydF9zdGF0ZSA9IERSUEFVU0U7CisJCWJyZWFrOworCisJY2FzZSBJUlNFTEVDVDoKKwljYXNlIElSQ0FQVFVSRToKKwljYXNlIElSU0hJRlQ6CisJY2FzZSBJUkVYSVQxOgorCWNhc2UgSVJQQVVTRToKKwljYXNlIElSRVhJVDI6CisJY2FzZSBJUlVQREFURToKKwkJc3RhcnRfY29kZSA9IDI7CisJCXN0YXJ0X3N0YXRlID0gSVJQQVVTRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRVJFTU9URUlPOworCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzID09IDApCisJCWlmIChqcy0+anRhZ19zdGF0ZSAhPSBzdGFydF9zdGF0ZSkKKwkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIHN0YXJ0X3N0YXRlKTsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQlpZiAoc2hpZnRfY291bnQgPiBqcy0+ZHJfbGVuZ3RoKSB7CisJCQlhbGxvY19jaGFycyA9IChzaGlmdF9jb3VudCArIDcpID4+IDM7CisJCQlrZnJlZShqcy0+ZHJfYnVmZmVyKTsKKwkJCWpzLT5kcl9idWZmZXIgPSAodTggKilhbHRfbWFsbG9jKGFsbG9jX2NoYXJzKTsKKworCQkJaWYgKGpzLT5kcl9idWZmZXIgPT0gTlVMTCkKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZWxzZQorCQkJCWpzLT5kcl9sZW5ndGggPSBhbGxvY19jaGFycyAqIDg7CisKKwkJfQorCX0KKworCWlmIChzdGF0dXMgPT0gMCkgeworCQkvKgorCQkgKiBDb3B5IHByZWFtYmxlIGRhdGEsIERSIGRhdGEsCisJCSAqIGFuZCBwb3N0YW1ibGUgZGF0YSBpbnRvIGEgYnVmZmVyCisJCSAqLworCQlhbHRlcmFfY29uY2F0ZW5hdGVfZGF0YShqcy0+ZHJfYnVmZmVyLAorCQkJCWpzLT5kcl9wcmVfZGF0YSwKKwkJCQlqcy0+ZHJfcHJlLAorCQkJCWluX2RhdGEsCisJCQkJaW5faW5kZXgsCisJCQkJY291bnQsCisJCQkJanMtPmRyX3Bvc3RfZGF0YSwKKwkJCQlqcy0+ZHJfcG9zdCk7CisKKwkJLyogRG8gdGhlIERSU0NBTiAqLworCQlhbHRfanRhZ19kcnNjYW4oYXN0YXRlLAorCQkJCXN0YXJ0X2NvZGUsCisJCQkJc2hpZnRfY291bnQsCisJCQkJanMtPmRyX2J1ZmZlciwKKwkJCQlqcy0+ZHJfYnVmZmVyKTsKKworCQkvKiBhbHRfanRhZ19kcnNjYW4oKSBhbHdheXMgZW5kcyBpbiBEUlBBVVNFIHN0YXRlICovCisJCWpzLT5qdGFnX3N0YXRlID0gRFJQQVVTRTsKKwl9CisKKwlpZiAoc3RhdHVzID09IDApCisJCWlmIChqcy0+ZHJzdG9wX3N0YXRlICE9IERSUEFVU0UpCisJCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBqcy0+ZHJzdG9wX3N0YXRlKTsKKworCWlmIChzdGF0dXMgPT0gMCkKKwkJLyogTm93IGV4dHJhY3QgdGhlIHJldHVybmVkIGRhdGEgZnJvbSB0aGUgYnVmZmVyICovCisJCWFsdGVyYV9leHRyYWN0X3RhcmdldF9kYXRhKGpzLT5kcl9idWZmZXIsCisJCQkJCW91dF9kYXRhLAorCQkJCQlvdXRfaW5kZXgsCisJCQkJCWpzLT5kcl9wcmUsCisJCQkJCWNvdW50KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgYWx0ZXJhX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUpCit7CisJc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOworCS8qIElmIHRoZSBKVEFHIGludGVyZmFjZSB3YXMgdXNlZCwgcmVzZXQgaXQgdG8gVExSICovCisJaWYgKGpzLT5qdGFnX3N0YXRlICE9IElMTEVHQUxfSlRBR19TVEFURSkKKwkJYWx0ZXJhX2pyZXNldF9pZGxlKGFzdGF0ZSk7CisKKwlrZnJlZShqcy0+ZHJfcHJlX2RhdGEpOworCWpzLT5kcl9wcmVfZGF0YSA9IE5VTEw7CisKKwlrZnJlZShqcy0+ZHJfcG9zdF9kYXRhKTsKKwlqcy0+ZHJfcG9zdF9kYXRhID0gTlVMTDsKKworCWtmcmVlKGpzLT5kcl9idWZmZXIpOworCWpzLT5kcl9idWZmZXIgPSBOVUxMOworCisJa2ZyZWUoanMtPmlyX3ByZV9kYXRhKTsKKwlqcy0+aXJfcHJlX2RhdGEgPSBOVUxMOworCisJa2ZyZWUoanMtPmlyX3Bvc3RfZGF0YSk7CisJanMtPmlyX3Bvc3RfZGF0YSA9IE5VTEw7CisKKwlrZnJlZShqcy0+aXJfYnVmZmVyKTsKKwlqcy0+aXJfYnVmZmVyID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuaCBiL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5oCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL2FsdGVyYS1qdGFnLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWxwdC5jIGIvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtbHB0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWxwdC5jCnJlbmFtZSB0byBkcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL2FsdGVyYS1scHQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEuYyBiL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNzJlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMKQEAgLTAsMCArMSwyNTM3IEBACisvKgorICogYWx0ZXJhLmMKKyAqCisgKiBhbHRlcmEgRlBHQSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFsdGVyYSBDb3Jwb3JhdGlvbiAxOTk4LTIwMDEKKyAqIENvcHlyaWdodCAoQykgMjAxMCwyMDExIE5ldFVQIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMCwyMDExIElnb3IgTS4gTGlwbGlhbmluIDxsaXBsaWFuaW5AbmV0dXAucnU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxtaXNjL2FsdGVyYS5oPgorI2luY2x1ZGUgImFsdGVyYS1leHBydC5oIgorI2luY2x1ZGUgImFsdGVyYS1qdGFnLmgiCisKK3N0YXRpYyBpbnQgZGVidWcgPSAxOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImVuYWJsZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJhbHRlcmEgRlBHQSBrZXJuZWwgbW9kdWxlIik7CitNT0RVTEVfQVVUSE9SKCJJZ29yIE0uIExpcGxpYW5pbiAgPGxpcGxpYW5pbkBuZXR1cC5ydT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pIFwKKwlpZiAoZGVidWcpIHsgXAorCQlwcmludGsoS0VSTl9ERUJVRyBhcmdzKTsgXAorCX0KKworZW51bSBhbHRlcmFfZnBnYV9vcGNvZGUgeworCU9QX05PUCA9IDAsCisJT1BfRFVQLAorCU9QX1NXUCwKKwlPUF9BREQsCisJT1BfU1VCLAorCU9QX01VTFQsCisJT1BfRElWLAorCU9QX01PRCwKKwlPUF9TSEwsCisJT1BfU0hSLAorCU9QX05PVCwKKwlPUF9BTkQsCisJT1BfT1IsCisJT1BfWE9SLAorCU9QX0lOViwKKwlPUF9HVCwKKwlPUF9MVCwKKwlPUF9SRVQsCisJT1BfQ01QUywKKwlPUF9QSU5ULAorCU9QX1BSTlQsCisJT1BfRFNTLAorCU9QX0RTU0MsCisJT1BfSVNTLAorCU9QX0lTU0MsCisJT1BfRFBSID0gMHgxYywKKwlPUF9EUFJMLAorCU9QX0RQTywKKwlPUF9EUE9MLAorCU9QX0lQUiwKKwlPUF9JUFJMLAorCU9QX0lQTywKKwlPUF9JUE9MLAorCU9QX1BDSFIsCisJT1BfRVhJVCwKKwlPUF9FUVUsCisJT1BfUE9QVCwKKwlPUF9BQlMgPSAweDJjLAorCU9QX0JDSDAsCisJT1BfUFNIMCA9IDB4MmYsCisJT1BfUFNITCA9IDB4NDAsCisJT1BfUFNIViwKKwlPUF9KTVAsCisJT1BfQ0FMTCwKKwlPUF9ORVhULAorCU9QX1BTVFIsCisJT1BfU0lOVCA9IDB4NDcsCisJT1BfU1QsCisJT1BfSVNUUCwKKwlPUF9EU1RQLAorCU9QX1NXUE4sCisJT1BfRFVQTiwKKwlPUF9QT1BWLAorCU9QX1BPUEUsCisJT1BfUE9QQSwKKwlPUF9KTVBaLAorCU9QX0RTLAorCU9QX0lTLAorCU9QX0RQUkEsCisJT1BfRFBPQSwKKwlPUF9JUFJBLAorCU9QX0lQT0EsCisJT1BfRVhQVCwKKwlPUF9QU0hFLAorCU9QX1BTSEEsCisJT1BfRFlOQSwKKwlPUF9FWFBWID0gMHg1YywKKwlPUF9DT1BZID0gMHg4MCwKKwlPUF9SRVZBLAorCU9QX0RTQywKKwlPUF9JU0MsCisJT1BfV0FJVCwKKwlPUF9WUywKKwlPUF9DTVBBID0gMHhjMCwKKwlPUF9WU0MsCit9OworCitzdHJ1Y3QgYWx0ZXJhX3Byb2NpbmZvIHsKKwljaGFyCQkJKm5hbWU7CisJdTgJCQlhdHRyczsKKwlzdHJ1Y3QgYWx0ZXJhX3Byb2NpbmZvCSpuZXh0OworfTsKKworLyogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgZW5vdWdoIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgc3RhY2suICovCitzdGF0aWMgaW50IGFsdGVyYV9jaGVja19zdGFjayhpbnQgc3RhY2tfcHRyLCBpbnQgY291bnQsIGludCAqc3RhdHVzKQoreworCWlmIChzdGFja19wdHIgPCBjb3VudCkgeworCQkqc3RhdHVzID0gLUVPVkVSRkxPVzsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGFsdGVyYV9leHBvcnRfaW50KGNoYXIgKmtleSwgczMyIHZhbHVlKQoreworCWRwcmludGsoIkV4cG9ydDoga2V5ID0gXCIlc1wiLCB2YWx1ZSA9ICVkXG4iLCBrZXksIHZhbHVlKTsKK30KKworI2RlZmluZSBIRVhfTElORV9DSEFSUyA3MgorI2RlZmluZSBIRVhfTElORV9CSVRTIChIRVhfTElORV9DSEFSUyAqIDQpCisKK3N0YXRpYyB2b2lkIGFsdGVyYV9leHBvcnRfYm9vbF9hcnJheShjaGFyICprZXksIHU4ICpkYXRhLCBzMzIgY291bnQpCit7CisJY2hhciBzdHJpbmdbSEVYX0xJTkVfQ0hBUlMgKyAxXTsKKwlzMzIgaSwgb2Zmc2V0OworCXUzMiBzaXplLCBsaW5lLCBsaW5lcywgbGluZWJpdHMsIHZhbHVlLCBqLCBrOworCisJaWYgKGNvdW50ID4gSEVYX0xJTkVfQklUUykgeworCQlkcHJpbnRrKCJFeHBvcnQ6IGtleSA9IFwiJXNcIiwgJWQgYml0cywgdmFsdWUgPSBIRVhcbiIsCisJCQkJCQkJa2V5LCBjb3VudCk7CisJCWxpbmVzID0gKGNvdW50ICsgKEhFWF9MSU5FX0JJVFMgLSAxKSkgLyBIRVhfTElORV9CSVRTOworCisJCWZvciAobGluZSA9IDA7IGxpbmUgPCBsaW5lczsgKytsaW5lKSB7CisJCQlpZiAobGluZSA8IChsaW5lcyAtIDEpKSB7CisJCQkJbGluZWJpdHMgPSBIRVhfTElORV9CSVRTOworCQkJCXNpemUgPSBIRVhfTElORV9DSEFSUzsKKwkJCQlvZmZzZXQgPSBjb3VudCAtICgobGluZSArIDEpICogSEVYX0xJTkVfQklUUyk7CisJCQl9IGVsc2UgeworCQkJCWxpbmViaXRzID0KKwkJCQkJY291bnQgLSAoKGxpbmVzIC0gMSkgKiBIRVhfTElORV9CSVRTKTsKKwkJCQlzaXplID0gKGxpbmViaXRzICsgMykgLyA0OworCQkJCW9mZnNldCA9IDBMOworCQkJfQorCisJCQlzdHJpbmdbc2l6ZV0gPSAnXDAnOworCQkJaiA9IHNpemUgLSAxOworCQkJdmFsdWUgPSAwOworCisJCQlmb3IgKGsgPSAwOyBrIDwgbGluZWJpdHM7ICsraykgeworCQkJCWkgPSBrICsgb2Zmc2V0OworCQkJCWlmIChkYXRhW2kgPj4gM10gJiAoMSA8PCAoaSAmIDcpKSkKKwkJCQkJdmFsdWUgfD0gKDEgPDwgKGkgJiAzKSk7CisJCQkJaWYgKChpICYgMykgPT0gMykgeworCQkJCQlzcHJpbnRmKCZzdHJpbmdbal0sICIlMXgiLCB2YWx1ZSk7CisJCQkJCXZhbHVlID0gMDsKKwkJCQkJLS1qOworCQkJCX0KKwkJCX0KKwkJCWlmICgoayAmIDMpID4gMCkKKwkJCQlzcHJpbnRmKCZzdHJpbmdbal0sICIlMXgiLCB2YWx1ZSk7CisKKwkJCWRwcmludGsoIiVzXG4iLCBzdHJpbmcpOworCQl9CisKKwl9IGVsc2UgeworCQlzaXplID0gKGNvdW50ICsgMykgLyA0OworCQlzdHJpbmdbc2l6ZV0gPSAnXDAnOworCQlqID0gc2l6ZSAtIDE7CisJCXZhbHVlID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJaWYgKGRhdGFbaSA+PiAzXSAmICgxIDw8IChpICYgNykpKQorCQkJCXZhbHVlIHw9ICgxIDw8IChpICYgMykpOworCQkJaWYgKChpICYgMykgPT0gMykgeworCQkJCXNwcmludGYoJnN0cmluZ1tqXSwgIiUxeCIsIHZhbHVlKTsKKwkJCQl2YWx1ZSA9IDA7CisJCQkJLS1qOworCQkJfQorCQl9CisJCWlmICgoaSAmIDMpID4gMCkKKwkJCXNwcmludGYoJnN0cmluZ1tqXSwgIiUxeCIsIHZhbHVlKTsKKworCQlkcHJpbnRrKCJFeHBvcnQ6IGtleSA9IFwiJXNcIiwgJWQgYml0cywgdmFsdWUgPSBIRVggJXNcbiIsCisJCQlrZXksIGNvdW50LCBzdHJpbmcpOworCX0KK30KKworc3RhdGljIGludCBhbHRlcmFfZXhlY3V0ZShzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCisJCQkJdTggKnAsCisJCQkJczMyIHByb2dyYW1fc2l6ZSwKKwkJCQlzMzIgKmVycm9yX2FkZHJlc3MsCisJCQkJaW50ICpleGl0X2NvZGUsCisJCQkJaW50ICpmb3JtYXRfdmVyc2lvbikKK3sKKwlzdHJ1Y3QgYWx0ZXJhX2NvbmZpZyAqYWNvbmYgPSBhc3RhdGUtPmNvbmZpZzsKKwljaGFyICptc2dfYnVmZiA9IGFzdGF0ZS0+bXNnX2J1ZmY7CisJbG9uZyAqc3RhY2sgPSBhc3RhdGUtPnN0YWNrOworCWludCBzdGF0dXMgPSAwOworCXUzMiBmaXJzdF93b3JkID0gMEw7CisJdTMyIGFjdGlvbl90YWJsZSA9IDBMOworCXUzMiBwcm9jX3RhYmxlID0gMEw7CisJdTMyIHN0cl90YWJsZSA9IDBMOworCXUzMiBzeW1fdGFibGUgPSAwTDsKKwl1MzIgZGF0YV9zZWN0ID0gMEw7CisJdTMyIGNvZGVfc2VjdCA9IDBMOworCXUzMiBkZWJ1Z19zZWN0ID0gMEw7CisJdTMyIGFjdGlvbl9jb3VudCA9IDBMOworCXUzMiBwcm9jX2NvdW50ID0gMEw7CisJdTMyIHN5bV9jb3VudCA9IDBMOworCWxvbmcgKnZhcnMgPSBOVUxMOworCXMzMiAqdmFyX3NpemUgPSBOVUxMOworCWNoYXIgKmF0dHJzID0gTlVMTDsKKwl1OCAqcHJvY19hdHRyaWJ1dGVzID0gTlVMTDsKKwl1MzIgcGM7CisJdTMyIG9wY29kZV9hZGRyZXNzOworCXUzMiBhcmdzWzNdOworCXUzMiBvcGNvZGU7CisJdTMyIG5hbWVfaWQ7CisJdTggY2hhcmJ1Zls0XTsKKwlsb25nIGxvbmdfdG1wOworCXUzMiB2YXJpYWJsZV9pZDsKKwl1OCAqY2hhcnB0cl90bXA7CisJdTggKmNoYXJwdHJfdG1wMjsKKwlsb25nICpsb25ncHRyX3RtcDsKKwlpbnQgdmVyc2lvbiA9IDA7CisJaW50IGRlbHRhID0gMDsKKwlpbnQgc3RhY2tfcHRyID0gMDsKKwl1MzIgYXJnX2NvdW50OworCWludCBkb25lID0gMDsKKwlpbnQgYmFkX29wY29kZSA9IDA7CisJdTMyIGNvdW50OworCXUzMiBpbmRleDsKKwl1MzIgaW5kZXgyOworCXMzMiBsb25nX2NvdW50OworCXMzMiBsb25nX2lkeDsKKwlzMzIgbG9uZ19pZHgyOworCXUzMiBpOworCXUzMiBqOworCXUzMiB1bmNvbXBfc2l6ZTsKKwl1MzIgb2Zmc2V0OworCXUzMiB2YWx1ZTsKKwlpbnQgY3VycmVudF9wcm9jID0gMDsKKwlpbnQgcmV2ZXJzZTsKKworCWNoYXIgKm5hbWU7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogUmVhZCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KKwlpZiAocHJvZ3JhbV9zaXplID4gNTJMKSB7CisJCWZpcnN0X3dvcmQgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMF0pOworCQl2ZXJzaW9uID0gKGZpcnN0X3dvcmQgJiAxTCk7CisJCSpmb3JtYXRfdmVyc2lvbiA9IHZlcnNpb24gKyAxOworCQlkZWx0YSA9IHZlcnNpb24gKiA4OworCisJCWFjdGlvbl90YWJsZSAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNF0pOworCQlwcm9jX3RhYmxlICAgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzhdKTsKKwkJc3RyX3RhYmxlICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0ICsgZGVsdGFdKTsKKwkJc3ltX3RhYmxlICA9IGdldF91bmFsaWduZWRfYmUzMigmcFsxNiArIGRlbHRhXSk7CisJCWRhdGFfc2VjdCAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMjAgKyBkZWx0YV0pOworCQljb2RlX3NlY3QgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzI0ICsgZGVsdGFdKTsKKwkJZGVidWdfc2VjdCA9IGdldF91bmFsaWduZWRfYmUzMigmcFsyOCArIGRlbHRhXSk7CisJCWFjdGlvbl9jb3VudCAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNDAgKyBkZWx0YV0pOworCQlwcm9jX2NvdW50ICAgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzQ0ICsgZGVsdGFdKTsKKwkJc3ltX2NvdW50ICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0OCArICgyICogZGVsdGEpXSk7CisJfQorCisJaWYgKChmaXJzdF93b3JkICE9IDB4NEE0MTREMDBMKSAmJiAoZmlyc3Rfd29yZCAhPSAweDRBNDE0RDAxTCkpIHsKKwkJZG9uZSA9IDE7CisJCXN0YXR1cyA9IC1FSU87CisJCWdvdG8gZXhpdF9kb25lOworCX0KKworCWlmIChzeW1fY291bnQgPD0gMCkKKwkJZ290byBleGl0X2RvbmU7CisKKwl2YXJzID0ga3phbGxvYyhzeW1fY291bnQgKiBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOworCisJaWYgKHZhcnMgPT0gTlVMTCkKKwkJc3RhdHVzID0gLUVOT01FTTsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQl2YXJfc2l6ZSA9IGt6YWxsb2Moc3ltX2NvdW50ICogc2l6ZW9mKHMzMiksIEdGUF9LRVJORUwpOworCisJCWlmICh2YXJfc2l6ZSA9PSBOVUxMKQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwl9CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJYXR0cnMgPSBremFsbG9jKHN5bV9jb3VudCwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKGF0dHJzID09IE5VTEwpCisJCQlzdGF0dXMgPSAtRU5PTUVNOworCX0KKworCWlmICgoc3RhdHVzID09IDApICYmICh2ZXJzaW9uID4gMCkpIHsKKwkJcHJvY19hdHRyaWJ1dGVzID0ga3phbGxvYyhwcm9jX2NvdW50LCBHRlBfS0VSTkVMKTsKKworCQlpZiAocHJvY19hdHRyaWJ1dGVzID09IE5VTEwpCisJCQlzdGF0dXMgPSAtRU5PTUVNOworCX0KKworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBleGl0X2RvbmU7CisKKwlkZWx0YSA9IHZlcnNpb24gKiAyOworCisJZm9yIChpID0gMDsgaSA8IHN5bV9jb3VudDsgKytpKSB7CisJCW9mZnNldCA9IChzeW1fdGFibGUgKyAoKDExICsgZGVsdGEpICogaSkpOworCisJCXZhbHVlID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW29mZnNldCArIDMgKyBkZWx0YV0pOworCisJCWF0dHJzW2ldID0gcFtvZmZzZXRdOworCisJCS8qCisJCSAqIHVzZSBiaXQgNyBvZiBhdHRyaWJ1dGUgYnl0ZSB0byBpbmRpY2F0ZSB0aGF0CisJCSAqIHRoaXMgYnVmZmVyIHdhcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKwkJICogYW5kIHNob3VsZCBiZSBmcmVlZCBsYXRlcgorCQkgKi8KKwkJYXR0cnNbaV0gJj0gMHg3ZjsKKworCQl2YXJfc2l6ZVtpXSA9IGdldF91bmFsaWduZWRfYmUzMigmcFtvZmZzZXQgKyA3ICsgZGVsdGFdKTsKKworCQkvKgorCQkgKiBBdHRyaWJ1dGUgYml0czoKKwkJICogYml0IDA6IDAgPSByZWFkLW9ubHksIDEgPSByZWFkLXdyaXRlCisJCSAqIGJpdCAxOiAwID0gbm90IGNvbXByZXNzZWQsIDEgPSBjb21wcmVzc2VkCisJCSAqIGJpdCAyOiAwID0gbm90IGluaXRpYWxpemVkLCAxID0gaW5pdGlhbGl6ZWQKKwkJICogYml0IDM6IDAgPSBzY2FsYXIsIDEgPSBhcnJheQorCQkgKiBiaXQgNDogMCA9IEJvb2xlYW4sIDEgPSBpbnRlZ2VyCisJCSAqIGJpdCA1OiAwID0gZGVjbGFyZWQgdmFyaWFibGUsCisJCSAqCTEgPSBjb21waWxlciBjcmVhdGVkIHRlbXBvcmFyeSB2YXJpYWJsZQorCQkgKi8KKworCQlpZiAoKGF0dHJzW2ldICYgMHgwYykgPT0gMHgwNCkKKwkJCS8qIGluaXRpYWxpemVkIHNjYWxhciB2YXJpYWJsZSAqLworCQkJdmFyc1tpXSA9IHZhbHVlOworCQllbHNlIGlmICgoYXR0cnNbaV0gJiAweDFlKSA9PSAweDBlKSB7CisJCQkvKiBpbml0aWFsaXplZCBjb21wcmVzc2VkIEJvb2xlYW4gYXJyYXkgKi8KKwkJCXVuY29tcF9zaXplID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZwW2RhdGFfc2VjdCArIHZhbHVlXSk7CisKKwkJCS8qIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KKwkJCXZhcnNbaV0gPSAobG9uZylremFsbG9jKHVuY29tcF9zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWlmICh2YXJzW2ldID09IDBMKQorCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQllbHNlIHsKKwkJCQkvKiBzZXQgZmxhZyBzbyBidWZmZXIgd2lsbCBiZSBmcmVlZCBsYXRlciAqLworCQkJCWF0dHJzW2ldIHw9IDB4ODA7CisKKwkJCQkvKiB1bmNvbXByZXNzIHRoZSBkYXRhICovCisJCQkJaWYgKGFsdGVyYV9zaHJpbmsoJnBbZGF0YV9zZWN0ICsgdmFsdWVdLAorCQkJCQkJdmFyX3NpemVbaV0sCisJCQkJCQkodTggKil2YXJzW2ldLAorCQkJCQkJdW5jb21wX3NpemUsCisJCQkJCQl2ZXJzaW9uKSAhPSB1bmNvbXBfc2l6ZSkKKwkJCQkJLyogZGVjb21wcmVzc2lvbiBmYWlsZWQgKi8KKwkJCQkJc3RhdHVzID0gLUVJTzsKKwkJCQllbHNlCisJCQkJCXZhcl9zaXplW2ldID0gdW5jb21wX3NpemUgKiA4TDsKKworCQkJfQorCQl9IGVsc2UgaWYgKChhdHRyc1tpXSAmIDB4MWUpID09IDB4MGMpIHsKKwkJCS8qIGluaXRpYWxpemVkIEJvb2xlYW4gYXJyYXkgKi8KKwkJCXZhcnNbaV0gPSB2YWx1ZSArIGRhdGFfc2VjdCArIChsb25nKXA7CisJCX0gZWxzZSBpZiAoKGF0dHJzW2ldICYgMHgxYykgPT0gMHgxYykgeworCQkJLyogaW5pdGlhbGl6ZWQgaW50ZWdlciBhcnJheSAqLworCQkJdmFyc1tpXSA9IHZhbHVlICsgZGF0YV9zZWN0OworCQl9IGVsc2UgaWYgKChhdHRyc1tpXSAmIDB4MGMpID09IDB4MDgpIHsKKwkJCS8qIHVuaW5pdGlhbGl6ZWQgYXJyYXkgKi8KKworCQkJLyogZmxhZyBhdHRycyBzbyB0aGF0IG1lbW9yeSBpcyBmcmVlZCAqLworCQkJYXR0cnNbaV0gfD0gMHg4MDsKKworCQkJaWYgKHZhcl9zaXplW2ldID4gMCkgeworCQkJCXUzMiBzaXplOworCisJCQkJaWYgKGF0dHJzW2ldICYgMHgxMCkKKwkJCQkJLyogaW50ZWdlciBhcnJheSAqLworCQkJCQlzaXplID0gKHZhcl9zaXplW2ldICogc2l6ZW9mKHMzMikpOworCQkJCWVsc2UKKwkJCQkJLyogQm9vbGVhbiBhcnJheSAqLworCQkJCQlzaXplID0gKCh2YXJfc2l6ZVtpXSArIDdMKSAvIDhMKTsKKworCQkJCXZhcnNbaV0gPSAobG9uZylremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCisJCQkJaWYgKHZhcnNbaV0gPT0gMCkgeworCQkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIHplcm8gb3V0IG1lbW9yeSAqLworCQkJCQlmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKQorCQkJCQkJKCh1OCAqKSh2YXJzW2ldKSlbal0gPSAwOworCisJCQkJfQorCQkJfSBlbHNlCisJCQkJdmFyc1tpXSA9IDA7CisKKwkJfSBlbHNlCisJCQl2YXJzW2ldID0gMDsKKworCX0KKworZXhpdF9kb25lOgorCWlmIChzdGF0dXMgIT0gMCkKKwkJZG9uZSA9IDE7CisKKwlhbHRlcmFfamluaXQoYXN0YXRlKTsKKworCXBjID0gY29kZV9zZWN0OworCW1zZ19idWZmWzBdID0gJ1wwJzsKKworCS8qCisJICogRm9yIEpCQyB2ZXJzaW9uIDIsIHdlIHdpbGwgZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBjb3JyZXNwb25kaW5nIHRvCisJICogdGhlIHNlbGVjdGVkIEFDVElPTgorCSAqLworCWlmICh2ZXJzaW9uID4gMCkgeworCQlpZiAoYWNvbmYtPmFjdGlvbiA9PSBOVUxMKSB7CisJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJZG9uZSA9IDE7CisJCX0gZWxzZSB7CisJCQlpbnQgYWN0aW9uX2ZvdW5kID0gMDsKKwkJCWZvciAoaSA9IDA7IChpIDwgYWN0aW9uX2NvdW50KSAmJiAhYWN0aW9uX2ZvdW5kOyArK2kpIHsKKwkJCQluYW1lX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2FjdGlvbl90YWJsZSArCisJCQkJCQkJCSgxMiAqIGkpXSk7CisKKwkJCQluYW1lID0gJnBbc3RyX3RhYmxlICsgbmFtZV9pZF07CisKKwkJCQlpZiAoc3RybmljbXAoYWNvbmYtPmFjdGlvbiwgbmFtZSwgc3RybGVuKG5hbWUpKSA9PSAwKSB7CisJCQkJCWFjdGlvbl9mb3VuZCA9IDE7CisJCQkJCWN1cnJlbnRfcHJvYyA9CisJCQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoJnBbYWN0aW9uX3RhYmxlICsKKwkJCQkJCQkJKDEyICogaSkgKyA4XSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIWFjdGlvbl9mb3VuZCkgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZG9uZSA9IDE7CisJCQl9CisJCX0KKworCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCWludCBmaXJzdF90aW1lID0gMTsKKwkJCWkgPSBjdXJyZW50X3Byb2M7CisJCQl3aGlsZSAoKGkgIT0gMCkgfHwgZmlyc3RfdGltZSkgeworCQkJCWZpcnN0X3RpbWUgPSAwOworCQkJCS8qIGNoZWNrIHByb2NlZHVyZSBhdHRyaWJ1dGUgYnl0ZSAqLworCQkJCXByb2NfYXR0cmlidXRlc1tpXSA9CisJCQkJCQkocFtwcm9jX3RhYmxlICsKKwkJCQkJCQkJKDEzICogaSkgKyA4XSAmCisJCQkJCQkJCQkweDAzKTsKKworCQkJCS8qCisJCQkJICogQklUMCAtIE9QVElPTkFMCisJCQkJICogQklUMSAtIFJFQ09NTUVOREVECisJCQkJICogQklUNiAtIEZPUkNFRCBPRkYKKwkJCQkgKiBCSVQ3IC0gRk9SQ0VEIE9OCisJCQkJICovCisKKwkJCQlpID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW3Byb2NfdGFibGUgKworCQkJCQkJCSgxMyAqIGkpICsgNF0pOworCQkJfQorCisJCQkvKgorCQkJICogU2V0IGN1cnJlbnRfcHJvYyB0byB0aGUgZmlyc3QgcHJvY2VkdXJlCisJCQkgKiB0byBiZSBleGVjdXRlZAorCQkJICovCisJCQlpID0gY3VycmVudF9wcm9jOworCQkJd2hpbGUgKChpICE9IDApICYmCisJCQkJKChwcm9jX2F0dHJpYnV0ZXNbaV0gPT0gMSkgfHwKKwkJCQkoKHByb2NfYXR0cmlidXRlc1tpXSAmIDB4YzApID09IDB4NDApKSkgeworCQkJCWkgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbcHJvY190YWJsZSArCisJCQkJCQkJKDEzICogaSkgKyA0XSk7CisJCQl9CisKKwkJCWlmICgoaSAhPSAwKSB8fCAoKGkgPT0gMCkgJiYgKGN1cnJlbnRfcHJvYyA9PSAwKSAmJgorCQkJCSgocHJvY19hdHRyaWJ1dGVzWzBdICE9IDEpICYmCisJCQkJKChwcm9jX2F0dHJpYnV0ZXNbMF0gJiAweGMwKSAhPSAweDQwKSkpKSB7CisJCQkJY3VycmVudF9wcm9jID0gaTsKKwkJCQlwYyA9IGNvZGVfc2VjdCArCisJCQkJCWdldF91bmFsaWduZWRfYmUzMigmcFtwcm9jX3RhYmxlICsKKwkJCQkJCQkJKDEzICogaSkgKyA5XSk7CisJCQkJaWYgKChwYyA8IGNvZGVfc2VjdCkgfHwgKHBjID49IGRlYnVnX3NlY3QpKQorCQkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJfSBlbHNlCisJCQkJLyogdGhlcmUgYXJlIG5vIHByb2NlZHVyZXMgdG8gZXhlY3V0ZSEgKi8KKwkJCQlkb25lID0gMTsKKworCQl9CisJfQorCisJbXNnX2J1ZmZbMF0gPSAnXDAnOworCisJd2hpbGUgKCFkb25lKSB7CisJCW9wY29kZSA9IChwW3BjXSAmIDB4ZmYpOworCQlvcGNvZGVfYWRkcmVzcyA9IHBjOworCQkrK3BjOworCisJCWlmIChkZWJ1ZyA+IDEpCisJCQlwcmludGsoIm9wY29kZTogJTAyeFxuIiwgb3Bjb2RlKTsKKworCQlhcmdfY291bnQgPSAob3Bjb2RlID4+IDYpICYgMzsKKwkJZm9yIChpID0gMDsgaSA8IGFyZ19jb3VudDsgKytpKSB7CisJCQlhcmdzW2ldID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW3BjXSk7CisJCQlwYyArPSA0OworCQl9CisKKwkJc3dpdGNoIChvcGNvZGUpIHsKKwkJY2FzZSBPUF9OT1A6CisJCQlicmVhazsKKwkJY2FzZSBPUF9EVVA6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKKwkJCQlzdGFja1tzdGFja19wdHJdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQkJKytzdGFja19wdHI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9TV1A6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIDJdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDJdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX0FERDoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgeworCQkJCS0tc3RhY2tfcHRyOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdICs9IHN0YWNrW3N0YWNrX3B0cl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9TVUI6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQktLXN0YWNrX3B0cjsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSAtPSBzdGFja1tzdGFja19wdHJdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfTVVMVDoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgeworCQkJCS0tc3RhY2tfcHRyOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdICo9IHN0YWNrW3N0YWNrX3B0cl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9ESVY6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQktLXN0YWNrX3B0cjsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSAvPSBzdGFja1tzdGFja19wdHJdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfTU9EOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7CisJCQkJLS1zdGFja19wdHI7CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gJT0gc3RhY2tbc3RhY2tfcHRyXTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX1NITDoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgeworCQkJCS0tc3RhY2tfcHRyOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdIDw8PSBzdGFja1tzdGFja19wdHJdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfU0hSOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7CisJCQkJLS1zdGFja19wdHI7CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPj49IHN0YWNrW3N0YWNrX3B0cl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9OT1Q6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gXj0gKC0xTCk7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0FORDoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgeworCQkJCS0tc3RhY2tfcHRyOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdICY9IHN0YWNrW3N0YWNrX3B0cl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9PUjoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgeworCQkJCS0tc3RhY2tfcHRyOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdIHw9IHN0YWNrW3N0YWNrX3B0cl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9YT1I6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQktLXN0YWNrX3B0cjsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSBePSBzdGFja1tzdGFja19wdHJdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfSU5WOgorCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV0gPyAwTCA6IDFMOworCQkJYnJlYWs7CisJCWNhc2UgT1BfR1Q6CisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJLS1zdGFja19wdHI7CisJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9CisJCQkJKHN0YWNrW3N0YWNrX3B0ciAtIDFdID4gc3RhY2tbc3RhY2tfcHRyXSkgPworCQkJCQkJCQkJMUwgOiAwTDsKKworCQkJYnJlYWs7CisJCWNhc2UgT1BfTFQ6CisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJLS1zdGFja19wdHI7CisJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9CisJCQkJKHN0YWNrW3N0YWNrX3B0ciAtIDFdIDwgc3RhY2tbc3RhY2tfcHRyXSkgPworCQkJCQkJCQkJMUwgOiAwTDsKKworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVUOgorCQkJaWYgKCh2ZXJzaW9uID4gMCkgJiYgKHN0YWNrX3B0ciA9PSAwKSkgeworCQkJCS8qCisJCQkJICogV2UgY29tcGxldGVkIG9uZSBvZiB0aGUgbWFpbiBwcm9jZWR1cmVzCisJCQkJICogb2YgYW4gQUNUSU9OLgorCQkJCSAqIEZpbmQgdGhlIG5leHQgcHJvY2VkdXJlCisJCQkJICogdG8gYmUgZXhlY3V0ZWQgYW5kIGp1bXAgdG8gaXQuCisJCQkJICogSWYgdGhlcmUgYXJlIG5vIG1vcmUgcHJvY2VkdXJlcywgdGhlbiBFWElULgorCQkJCSAqLworCQkJCWkgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbcHJvY190YWJsZSArCisJCQkJCQkoMTMgKiBjdXJyZW50X3Byb2MpICsgNF0pOworCQkJCXdoaWxlICgoaSAhPSAwKSAmJgorCQkJCQkoKHByb2NfYXR0cmlidXRlc1tpXSA9PSAxKSB8fAorCQkJCQkoKHByb2NfYXR0cmlidXRlc1tpXSAmIDB4YzApID09IDB4NDApKSkKKwkJCQkJaSA9IGdldF91bmFsaWduZWRfYmUzMigmcFtwcm9jX3RhYmxlICsKKwkJCQkJCQkJKDEzICogaSkgKyA0XSk7CisKKwkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCS8qIG5vIHByb2NlZHVyZXMgdG8gZXhlY3V0ZSEgKi8KKwkJCQkJZG9uZSA9IDE7CisJCQkJCSpleGl0X2NvZGUgPSAwOwkvKiBzdWNjZXNzICovCisJCQkJfSBlbHNlIHsKKwkJCQkJY3VycmVudF9wcm9jID0gaTsKKwkJCQkJcGMgPSBjb2RlX3NlY3QgKyBnZXRfdW5hbGlnbmVkX2JlMzIoCisJCQkJCQkJCSZwW3Byb2NfdGFibGUgKworCQkJCQkJCQkoMTMgKiBpKSArIDldKTsKKwkJCQkJaWYgKChwYyA8IGNvZGVfc2VjdCkgfHwKKwkJCQkJICAgIChwYyA+PSBkZWJ1Z19zZWN0KSkKKwkJCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQkJfQorCisJCQl9IGVsc2UKKwkJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKKwkJCQkJcGMgPSBzdGFja1stLXN0YWNrX3B0cl0gKyBjb2RlX3NlY3Q7CisJCQkJCWlmICgocGMgPD0gY29kZV9zZWN0KSB8fAorCQkJCQkgICAgKHBjID49IGRlYnVnX3NlY3QpKQorCQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKKworCQkJCX0KKworCQkJYnJlYWs7CisJCWNhc2UgT1BfQ01QUzoKKwkJCS8qCisJCQkgKiBBcnJheSBzaG9ydCBjb21wYXJlCisJCQkgKiAuLi5zdGFjayAwIGlzIHNvdXJjZSAxIHZhbHVlCisJCQkgKiAuLi5zdGFjayAxIGlzIHNvdXJjZSAyIHZhbHVlCisJCQkgKiAuLi5zdGFjayAyIGlzIG1hc2sgdmFsdWUKKwkJCSAqIC4uLnN0YWNrIDMgaXMgY291bnQKKwkJCSAqLworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDQsICZzdGF0dXMpKSB7CisJCQkJczMyIGEgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQkJczMyIGIgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQkJY291bnQgPSBzdGFja1tzdGFja19wdHIgLSAxXTsKKworCQkJCWlmICgoY291bnQgPCAxKSB8fCAoY291bnQgPiAzMikpCisJCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQkJZWxzZSB7CisJCQkJCWxvbmdfdG1wICY9ICgoLTFMKSA+PiAoMzIgLSBjb3VudCkpOworCisJCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0KKwkJCQkJKChhICYgbG9uZ190bXApID09IChiICYgbG9uZ190bXApKQorCQkJCQkJCQk/IDFMIDogMEw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfUElOVDoKKwkJCS8qCisJCQkgKiBQUklOVCBhZGQgaW50ZWdlcgorCQkJICogLi4uc3RhY2sgMCBpcyBpbnRlZ2VyIHZhbHVlCisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlzcHJpbnRmKCZtc2dfYnVmZltzdHJsZW4obXNnX2J1ZmYpXSwKKwkJCQkJIiVsZCIsIHN0YWNrWy0tc3RhY2tfcHRyXSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9QUk5UOgorCQkJLyogUFJJTlQgZmluaXNoICovCisJCQlpZiAoZGVidWcpCisJCQkJcHJpbnRrKG1zZ19idWZmLCAiXG4iKTsKKworCQkJbXNnX2J1ZmZbMF0gPSAnXDAnOworCQkJYnJlYWs7CisJCWNhc2UgT1BfRFNTOgorCQkJLyoKKwkJCSAqIERSU0NBTiBzaG9ydAorCQkJICogLi4uc3RhY2sgMCBpcyBzY2FuIGRhdGEKKwkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlwdXRfdW5hbGlnbmVkX2xlMzIobG9uZ190bXAsICZjaGFyYnVmWzBdKTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9kcnNjYW4oYXN0YXRlLCBjb3VudCwgY2hhcmJ1ZiwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9EU1NDOgorCQkJLyoKKwkJCSAqIERSU0NBTiBzaG9ydCB3aXRoIGNhcHR1cmUKKwkJCSAqIC4uLnN0YWNrIDAgaXMgc2NhbiBkYXRhCisJCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWNvdW50ID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQlwdXRfdW5hbGlnbmVkX2xlMzIobG9uZ190bXAsICZjaGFyYnVmWzBdKTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9zd2FwX2RyKGFzdGF0ZSwgY291bnQsIGNoYXJidWYsCisJCQkJCQkJMCwgY2hhcmJ1ZiwgMCk7CisJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGdldF91bmFsaWduZWRfbGUzMigmY2hhcmJ1ZlswXSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9JU1M6CisJCQkvKgorCQkJICogSVJTQ0FOIHNob3J0CisJCQkgKiAuLi5zdGFjayAwIGlzIHNjYW4gZGF0YQorCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOworCQkJc3RhdHVzID0gYWx0ZXJhX2lyc2Nhbihhc3RhdGUsIGNvdW50LCBjaGFyYnVmLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0lTU0M6CisJCQkvKgorCQkJICogSVJTQ0FOIHNob3J0IHdpdGggY2FwdHVyZQorCQkJICogLi4uc3RhY2sgMCBpcyBzY2FuIGRhdGEKKwkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJY291bnQgPSBzdGFja1tzdGFja19wdHIgLSAxXTsKKwkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOworCQkJc3RhdHVzID0gYWx0ZXJhX3N3YXBfaXIoYXN0YXRlLCBjb3VudCwgY2hhcmJ1ZiwKKwkJCQkJCQkwLCBjaGFyYnVmLCAwKTsKKwkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZjaGFyYnVmWzBdKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0RQUjoKKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfZHJfcHJlKCZhc3RhdGUtPmpzLCBjb3VudCwgMCwgTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9EUFJMOgorCQkJLyoKKwkJCSAqIERSUFJFIHdpdGggbGl0ZXJhbCBkYXRhCisJCQkgKiAuLi5zdGFjayAwIGlzIGNvdW50CisJCQkgKiAuLi5zdGFjayAxIGlzIGxpdGVyYWwgZGF0YQorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOworCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9kcl9wcmUoJmFzdGF0ZS0+anMsIGNvdW50LCAwLAorCQkJCQkJY2hhcmJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSBPUF9EUE86CisJCQkvKgorCQkJICogRFJQT1NUCisJCQkgKiAuLi5zdGFjayAwIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgeworCQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfZHJfcG9zdCgmYXN0YXRlLT5qcywgY291bnQsCisJCQkJCQkJCTAsIE5VTEwpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfRFBPTDoKKwkJCS8qCisJCQkgKiBEUlBPU1Qgd2l0aCBsaXRlcmFsIGRhdGEKKwkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKKwkJCSAqIC4uLnN0YWNrIDEgaXMgbGl0ZXJhbCBkYXRhCisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7CisJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2RyX3Bvc3QoJmFzdGF0ZS0+anMsIGNvdW50LCAwLAorCQkJCQkJCWNoYXJidWYpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfSVBSOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKSB7CisJCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9pcl9wcmUoJmFzdGF0ZS0+anMsIGNvdW50LAorCQkJCQkJCQkwLCBOVUxMKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX0lQUkw6CisJCQkvKgorCQkJICogSVJQUkUgd2l0aCBsaXRlcmFsIGRhdGEKKwkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKKwkJCSAqIC4uLnN0YWNrIDEgaXMgbGl0ZXJhbCBkYXRhCisJCQkgKi8KKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgeworCQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOworCQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfaXJfcHJlKCZhc3RhdGUtPmpzLCBjb3VudCwKKwkJCQkJCQkwLCBjaGFyYnVmKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX0lQTzoKKwkJCS8qCisJCQkgKiBJUlBPU1QKKwkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKKwkJCSAqLworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKSB7CisJCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9pcl9wb3N0KCZhc3RhdGUtPmpzLCBjb3VudCwKKwkJCQkJCQkwLCBOVUxMKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX0lQT0w6CisJCQkvKgorCQkJICogSVJQT1NUIHdpdGggbGl0ZXJhbCBkYXRhCisJCQkgKiAuLi5zdGFjayAwIGlzIGNvdW50CisJCQkgKiAuLi5zdGFjayAxIGlzIGxpdGVyYWwgZGF0YQorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOworCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9pcl9wb3N0KCZhc3RhdGUtPmpzLCBjb3VudCwgMCwKKwkJCQkJCQljaGFyYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1BDSFI6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKKwkJCQl1OCBjaDsKKwkJCQljb3VudCA9IHN0cmxlbihtc2dfYnVmZik7CisJCQkJY2ggPSAoY2hhcikgc3RhY2tbLS1zdGFja19wdHJdOworCQkJCWlmICgoY2ggPCAxKSB8fCAoY2ggPiAxMjcpKSB7CisJCQkJCS8qCisJCQkJCSAqIGNoYXJhY3RlciBjb2RlIG91dCBvZiByYW5nZQorCQkJCQkgKiBpbnN0ZWFkIG9mIGZsYWdnaW5nIGFuIGVycm9yLAorCQkJCQkgKiBmb3JjZSB0aGUgdmFsdWUgdG8gMTI3CisJCQkJCSAqLworCQkJCQljaCA9IDEyNzsKKwkJCQl9CisJCQkJbXNnX2J1ZmZbY291bnRdID0gY2g7CisJCQkJbXNnX2J1ZmZbY291bnQgKyAxXSA9ICdcMCc7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9FWElUOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQorCQkJCSpleGl0X2NvZGUgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCWRvbmUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT1BfRVFVOgorCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCS0tc3RhY2tfcHRyOworCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPQorCQkJCShzdGFja1tzdGFja19wdHIgLSAxXSA9PSBzdGFja1tzdGFja19wdHJdKSA/CisJCQkJCQkJCQkxTCA6IDBMOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUE9QVDoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKKwkJCQktLXN0YWNrX3B0cjsKKworCQkJYnJlYWs7CisJCWNhc2UgT1BfQUJTOgorCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWlmIChzdGFja1tzdGFja19wdHIgLSAxXSA8IDApCisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSAwIC0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0JDSDA6CisJCQkvKgorCQkJICogQmF0Y2ggb3BlcmF0aW9uIDAKKwkJCSAqIFNXUAorCQkJICogU1dQTiA3CisJCQkgKiBTV1AKKwkJCSAqIFNXUE4gNgorCQkJICogRFVQTiA4CisJCQkgKiBTV1BOIDIKKwkJCSAqIFNXUAorCQkJICogRFVQTiA2CisJCQkgKiBEVVBOIDYKKwkJCSAqLworCisJCQkvKiBTV1AgICovCisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIDJdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDJdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKKwkJCX0KKworCQkJLyogU1dQTiA3ICovCisJCQlpbmRleCA9IDcgKyAxOworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgeworCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7CisJCQl9CisKKwkJCS8qIFNXUCAgKi8KKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgeworCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gMl07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMl0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOworCQkJfQorCisJCQkvKiBTV1BOIDYgKi8KKwkJCWluZGV4ID0gNiArIDE7CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7CisJCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKKwkJCX0KKworCQkJLyogRFVQTiA4ICovCisJCQlpbmRleCA9IDggKyAxOworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgeworCQkJCXN0YWNrW3N0YWNrX3B0cl0gPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07CisJCQkJKytzdGFja19wdHI7CisJCQl9CisKKwkJCS8qIFNXUE4gMiAqLworCQkJaW5kZXggPSAyICsgMTsKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKKwkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKKwkJCQlzdGFja1tzdGFja19wdHIgLSBpbmRleF0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOworCQkJfQorCisJCQkvKiBTV1AgICovCisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIDJdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDJdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKKwkJCX0KKworCQkJLyogRFVQTiA2ICovCisJCQlpbmRleCA9IDYgKyAxOworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgeworCQkJCXN0YWNrW3N0YWNrX3B0cl0gPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07CisJCQkJKytzdGFja19wdHI7CisJCQl9CisKKwkJCS8qIERVUE4gNiAqLworCQkJaW5kZXggPSA2ICsgMTsKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKKwkJCQlzdGFja1tzdGFja19wdHJdID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOworCQkJCSsrc3RhY2tfcHRyOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfUFNIMDoKKwkJCXN0YWNrW3N0YWNrX3B0cisrXSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBPUF9QU0hMOgorCQkJc3RhY2tbc3RhY2tfcHRyKytdID0gKHMzMikgYXJnc1swXTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1BTSFY6CisJCQlzdGFja1tzdGFja19wdHIrK10gPSB2YXJzW2FyZ3NbMF1dOworCQkJYnJlYWs7CisJCWNhc2UgT1BfSk1QOgorCQkJcGMgPSBhcmdzWzBdICsgY29kZV9zZWN0OworCQkJaWYgKChwYyA8IGNvZGVfc2VjdCkgfHwgKHBjID49IGRlYnVnX3NlY3QpKQorCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQlicmVhazsKKwkJY2FzZSBPUF9DQUxMOgorCQkJc3RhY2tbc3RhY2tfcHRyKytdID0gcGM7CisJCQlwYyA9IGFyZ3NbMF0gKyBjb2RlX3NlY3Q7CisJCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fCAocGMgPj0gZGVidWdfc2VjdCkpCisJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCWJyZWFrOworCQljYXNlIE9QX05FWFQ6CisJCQkvKgorCQkJICogUHJvY2VzcyBGT1IgLyBORVhUIGxvb3AKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgc3RlcCB2YWx1ZQorCQkJICogLi4uc3RhY2sgMSBpcyBlbmQgdmFsdWUKKwkJCSAqIC4uLnN0YWNrIDIgaXMgdG9wIGFkZHJlc3MKKwkJCSAqLworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDMsICZzdGF0dXMpKSB7CisJCQkJczMyIHN0ZXAgPSBzdGFja1tzdGFja19wdHIgLSAxXTsKKwkJCQlzMzIgZW5kID0gc3RhY2tbc3RhY2tfcHRyIC0gMl07CisJCQkJczMyIHRvcCA9IHN0YWNrW3N0YWNrX3B0ciAtIDNdOworCQkJCXMzMiBpdGVyYXRvciA9IHZhcnNbYXJnc1swXV07CisJCQkJaW50IGJyZWFrX291dCA9IDA7CisKKwkJCQlpZiAoc3RlcCA8IDApIHsKKwkJCQkJaWYgKGl0ZXJhdG9yIDw9IGVuZCkKKwkJCQkJCWJyZWFrX291dCA9IDE7CisJCQkJfSBlbHNlIGlmIChpdGVyYXRvciA+PSBlbmQpCisJCQkJCWJyZWFrX291dCA9IDE7CisKKwkJCQlpZiAoYnJlYWtfb3V0KSB7CisJCQkJCXN0YWNrX3B0ciAtPSAzOworCQkJCX0gZWxzZSB7CisJCQkJCXZhcnNbYXJnc1swXV0gPSBpdGVyYXRvciArIHN0ZXA7CisJCQkJCXBjID0gdG9wICsgY29kZV9zZWN0OworCQkJCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fAorCQkJCQkgICAgKHBjID49IGRlYnVnX3NlY3QpKQorCQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9QU1RSOgorCQkJLyoKKwkJCSAqIFBSSU5UIGFkZCBzdHJpbmcKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RyaW5nIElECisJCQkgKi8KKwkJCWNvdW50ID0gc3RybGVuKG1zZ19idWZmKTsKKwkJCXN0cmxjcHkoJm1zZ19idWZmW2NvdW50XSwKKwkJCQkmcFtzdHJfdGFibGUgKyBhcmdzWzBdXSwKKwkJCQlBTFRFUkFfTUVTU0FHRV9MRU5HVEggLSBjb3VudCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9TSU5UOgorCQkJLyoKKwkJCSAqIFNUQVRFIGludGVybWVkaWF0ZSBzdGF0ZQorCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdGF0ZSBjb2RlCisJCQkgKi8KKwkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIGFyZ3NbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfU1Q6CisJCQkvKgorCQkJICogU1RBVEUgZmluYWwgc3RhdGUKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RhdGUgY29kZQorCQkJICovCisJCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBhcmdzWzBdKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0lTVFA6CisJCQkvKgorCQkJICogSVJTVE9QIHN0YXRlCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHN0YXRlIGNvZGUKKwkJCSAqLworCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9pcnN0b3AoJmFzdGF0ZS0+anMsIGFyZ3NbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfRFNUUDoKKwkJCS8qCisJCQkgKiBEUlNUT1Agc3RhdGUKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RhdGUgY29kZQorCQkJICovCisJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2Ryc3RvcCgmYXN0YXRlLT5qcywgYXJnc1swXSk7CisJCQlicmVhazsKKworCQljYXNlIE9QX1NXUE46CisJCQkvKgorCQkJICogRXhjaGFuZ2UgdG9wIHdpdGggTnRoIHN0YWNrIHZhbHVlCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIDAtYmFzZWQgc3RhY2sgZW50cnkKKwkJCSAqIHRvIHN3YXAgd2l0aCB0b3AgZWxlbWVudAorCQkJICovCisJCQlpbmRleCA9IChhcmdzWzBdKSArIDE7CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7CisJCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX0RVUE46CisJCQkvKgorCQkJICogRHVwbGljYXRlIE50aCBzdGFjayB2YWx1ZQorCQkJICogLi4uYXJndW1lbnQgMCBpcyAwLWJhc2VkIHN0YWNrIGVudHJ5IHRvIGR1cGxpY2F0ZQorCQkJICovCisJCQlpbmRleCA9IChhcmdzWzBdKSArIDE7CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7CisJCQkJc3RhY2tbc3RhY2tfcHRyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKKwkJCQkrK3N0YWNrX3B0cjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX1BPUFY6CisJCQkvKgorCQkJICogUG9wIHN0YWNrIGludG8gc2NhbGFyIHZhcmlhYmxlCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIHZhbHVlCisJCQkgKi8KKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKKwkJCQl2YXJzW2FyZ3NbMF1dID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlicmVhazsKKwkJY2FzZSBPUF9QT1BFOgorCQkJLyoKKwkJCSAqIFBvcCBzdGFjayBpbnRvIGludGVnZXIgYXJyYXkgZWxlbWVudAorCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAorCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAorCQkJICogLi4uc3RhY2sgMSBpcyB2YWx1ZQorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJdmFyaWFibGVfaWQgPSBhcmdzWzBdOworCisJCQkvKgorCQkJICogSWYgdmFyaWFibGUgaXMgcmVhZC1vbmx5LAorCQkJICogY29udmVydCB0byB3cml0YWJsZSBhcnJheQorCQkJICovCisJCQlpZiAoKHZlcnNpb24gPiAwKSAmJgorCQkJCSgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHg5YykgPT0gMHgxYykpIHsKKwkJCQkvKiBBbGxvY2F0ZSBhIHdyaXRhYmxlIGJ1ZmZlciBmb3IgdGhpcyBhcnJheSAqLworCQkJCWNvdW50ID0gdmFyX3NpemVbdmFyaWFibGVfaWRdOworCQkJCWxvbmdfdG1wID0gdmFyc1t2YXJpYWJsZV9pZF07CisJCQkJbG9uZ3B0cl90bXAgPSBremFsbG9jKGNvdW50ICogc2l6ZW9mKGxvbmcpLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQl2YXJzW3ZhcmlhYmxlX2lkXSA9IChsb25nKWxvbmdwdHJfdG1wOworCisJCQkJaWYgKHZhcnNbdmFyaWFibGVfaWRdID09IDApIHsKKwkJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogY29weSBwcmV2aW91cyBjb250ZW50cyBpbnRvIGJ1ZmZlciAqLworCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQkJCWxvbmdwdHJfdG1wW2ldID0KKwkJCQkJCWdldF91bmFsaWduZWRfYmUzMigmcFtsb25nX3RtcF0pOworCQkJCQlsb25nX3RtcCArPSBzaXplb2YobG9uZyk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBzZXQgYml0IDcgLSBidWZmZXIgd2FzCisJCQkJICogZHluYW1pY2FsbHkgYWxsb2NhdGVkCisJCQkJICovCisJCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4ODA7CisKKwkJCQkvKiBjbGVhciBiaXQgMiAtIHZhcmlhYmxlIGlzIHdyaXRhYmxlICovCisJCQkJYXR0cnNbdmFyaWFibGVfaWRdICY9IH4weDA0OworCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDAxOworCisJCQl9CisKKwkJCS8qIGNoZWNrIHRoYXQgdmFyaWFibGUgaXMgYSB3cml0YWJsZSBpbnRlZ2VyIGFycmF5ICovCisJCQlpZiAoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4MWMpICE9IDB4MTgpCisJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCWVsc2UgeworCQkJCWxvbmdwdHJfdG1wID0gKGxvbmcgKil2YXJzW3ZhcmlhYmxlX2lkXTsKKworCQkJCS8qIHBvcCB0aGUgYXJyYXkgaW5kZXggKi8KKwkJCQlpbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKworCQkJCS8qIHBvcCB0aGUgdmFsdWUgYW5kIHN0b3JlIGl0IGludG8gdGhlIGFycmF5ICovCisJCQkJbG9uZ3B0cl90bXBbaW5kZXhdID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJfQorCisJCQlicmVhazsKKwkJY2FzZSBPUF9QT1BBOgorCQkJLyoKKwkJCSAqIFBvcCBzdGFjayBpbnRvIEJvb2xlYW4gYXJyYXkKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKKwkJCSAqIC4uLnN0YWNrIDEgaXMgYXJyYXkgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDIgaXMgdmFsdWUKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAzLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCXZhcmlhYmxlX2lkID0gYXJnc1swXTsKKworCQkJLyoKKwkJCSAqIElmIHZhcmlhYmxlIGlzIHJlYWQtb25seSwKKwkJCSAqIGNvbnZlcnQgdG8gd3JpdGFibGUgYXJyYXkKKwkJCSAqLworCQkJaWYgKCh2ZXJzaW9uID4gMCkgJiYKKwkJCQkoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4OWMpID09IDB4MGMpKSB7CisJCQkJLyogQWxsb2NhdGUgYSB3cml0YWJsZSBidWZmZXIgZm9yIHRoaXMgYXJyYXkgKi8KKwkJCQlsb25nX3RtcCA9CisJCQkJCSh2YXJfc2l6ZVt2YXJpYWJsZV9pZF0gKyA3TCkgPj4gM0w7CisJCQkJY2hhcnB0cl90bXAyID0gKHU4ICopdmFyc1t2YXJpYWJsZV9pZF07CisJCQkJY2hhcnB0cl90bXAgPQorCQkJCQlremFsbG9jKGxvbmdfdG1wLCBHRlBfS0VSTkVMKTsKKwkJCQl2YXJzW3ZhcmlhYmxlX2lkXSA9IChsb25nKWNoYXJwdHJfdG1wOworCisJCQkJaWYgKHZhcnNbdmFyaWFibGVfaWRdID09IDApIHsKKwkJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogemVybyB0aGUgYnVmZmVyICovCisJCQkJZm9yIChsb25nX2lkeCA9IDBMOworCQkJCQlsb25nX2lkeCA8IGxvbmdfdG1wOworCQkJCQkrK2xvbmdfaWR4KSB7CisJCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4XSA9IDA7CisJCQkJfQorCisJCQkJLyogY29weSBwcmV2aW91cyBjb250ZW50cyBpbnRvIGJ1ZmZlciAqLworCQkJCWZvciAobG9uZ19pZHggPSAwTDsKKwkJCQkJbG9uZ19pZHggPCB2YXJfc2l6ZVt2YXJpYWJsZV9pZF07CisJCQkJCSsrbG9uZ19pZHgpIHsKKwkJCQkJbG9uZ19pZHgyID0gbG9uZ19pZHg7CisKKwkJCQkJaWYgKGNoYXJwdHJfdG1wMltsb25nX2lkeDIgPj4gM10gJgorCQkJCQkJKDEgPDwgKGxvbmdfaWR4MiAmIDcpKSkgeworCQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHggPj4gM10gfD0KKwkJCQkJCQkoMSA8PCAobG9uZ19pZHggJiA3KSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIHNldCBiaXQgNyAtIGJ1ZmZlciB3YXMKKwkJCQkgKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKwkJCQkgKi8KKwkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHg4MDsKKworCQkJCS8qIGNsZWFyIGJpdCAyIC0gdmFyaWFibGUgaXMgd3JpdGFibGUgKi8KKwkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gJj0gfjB4MDQ7CisJCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4MDE7CisKKwkJCX0KKworCQkJLyoKKwkJCSAqIGNoZWNrIHRoYXQgdmFyaWFibGUgaXMKKwkJCSAqIGEgd3JpdGFibGUgQm9vbGVhbiBhcnJheQorCQkJICovCisJCQlpZiAoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4MWMpICE9IDB4MDgpIHsKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWJyZWFrOworCQkJfQorCisJCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbdmFyaWFibGVfaWRdOworCisJCQkvKiBwb3AgdGhlIGNvdW50IChudW1iZXIgb2YgYml0cyB0byBjb3B5KSAqLworCQkJbG9uZ19jb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKworCQkJLyogcG9wIHRoZSBhcnJheSBpbmRleCAqLworCQkJbG9uZ19pZHggPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCXJldmVyc2UgPSAwOworCisJCQlpZiAodmVyc2lvbiA+IDApIHsKKwkJCQkvKgorCQkJCSAqIHN0YWNrIDAgPSBhcnJheSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBhcnJheSBsZWZ0IGluZGV4CisJCQkJICovCisKKwkJCQlpZiAobG9uZ19pZHggPiBsb25nX2NvdW50KSB7CisJCQkJCXJldmVyc2UgPSAxOworCQkJCQlsb25nX3RtcCA9IGxvbmdfY291bnQ7CisJCQkJCWxvbmdfY291bnQgPSAxICsgbG9uZ19pZHggLQorCQkJCQkJCQlsb25nX2NvdW50OworCQkJCQlsb25nX2lkeCA9IGxvbmdfdG1wOworCisJCQkJCS8qIHJldmVyc2UgUE9QQSBpcyBub3Qgc3VwcG9ydGVkICovCisJCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZQorCQkJCQlsb25nX2NvdW50ID0gMSArIGxvbmdfY291bnQgLQorCQkJCQkJCQlsb25nX2lkeDsKKworCQkJfQorCisJCQkvKiBwb3AgdGhlIGRhdGEgKi8KKwkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlpZiAobG9uZ19jb3VudCA8IDEpIHsKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWJyZWFrOworCQkJfQorCisJCQlmb3IgKGkgPSAwOyBpIDwgbG9uZ19jb3VudDsgKytpKSB7CisJCQkJaWYgKGxvbmdfdG1wICYgKDFMIDw8IChzMzIpIGkpKQorCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeCA+PiAzTF0gfD0KKwkJCQkJCSgxTCA8PCAobG9uZ19pZHggJiA3TCkpOworCQkJCWVsc2UKKwkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHggPj4gM0xdICY9CisJCQkJCQl+KDFMIDw8IChsb25nX2lkeCAmIDdMKSk7CisKKwkJCQkrK2xvbmdfaWR4OworCQkJfQorCisJCQlicmVhazsKKwkJY2FzZSBPUF9KTVBaOgorCQkJLyoKKwkJCSAqIFBvcCBzdGFjayBhbmQgYnJhbmNoIGlmIHplcm8KKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgYWRkcmVzcworCQkJICogLi4uc3RhY2sgMCBpcyBjb25kaXRpb24gdmFsdWUKKwkJCSAqLworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKSB7CisJCQkJaWYgKHN0YWNrWy0tc3RhY2tfcHRyXSA9PSAwKSB7CisJCQkJCXBjID0gYXJnc1swXSArIGNvZGVfc2VjdDsKKwkJCQkJaWYgKChwYyA8IGNvZGVfc2VjdCkgfHwKKwkJCQkJICAgIChwYyA+PSBkZWJ1Z19zZWN0KSkKKwkJCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfRFM6CisJCWNhc2UgT1BfSVM6CisJCQkvKgorCQkJICogRFJTQ0FOCisJCQkgKiBJUlNDQU4KKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc2NhbiBkYXRhIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIGFycmF5IGluZGV4CisJCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlsb25nX2lkeCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWxvbmdfY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlyZXZlcnNlID0gMDsKKwkJCWlmICh2ZXJzaW9uID4gMCkgeworCQkJCS8qCisJCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4CisJCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKKwkJCQkgKiBzdGFjayAyID0gY291bnQKKwkJCQkgKi8KKwkJCQlsb25nX3RtcCA9IGxvbmdfY291bnQ7CisJCQkJbG9uZ19jb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKworCQkJCWlmIChsb25nX2lkeCA+IGxvbmdfdG1wKSB7CisJCQkJCXJldmVyc2UgPSAxOworCQkJCQlsb25nX2lkeCA9IGxvbmdfdG1wOworCQkJCX0KKwkJCX0KKworCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW2FyZ3NbMF1dOworCisJCQlpZiAocmV2ZXJzZSkgeworCQkJCS8qCisJCQkJICogYWxsb2NhdGUgYSBidWZmZXIKKwkJCQkgKiBhbmQgcmV2ZXJzZSB0aGUgZGF0YSBvcmRlcgorCQkJCSAqLworCQkJCWNoYXJwdHJfdG1wMiA9IGNoYXJwdHJfdG1wOworCQkJCWNoYXJwdHJfdG1wID0ga3phbGxvYygobG9uZ19jb3VudCA+PiAzKSArIDEsCisJCQkJCQkJCUdGUF9LRVJORUwpOworCQkJCWlmIChjaGFycHRyX3RtcCA9PSBOVUxMKSB7CisJCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWxvbmdfdG1wID0gbG9uZ19pZHggKyBsb25nX2NvdW50IC0gMTsKKwkJCQlsb25nX2lkeDIgPSAwOworCQkJCXdoaWxlIChsb25nX2lkeDIgPCBsb25nX2NvdW50KSB7CisJCQkJCWlmIChjaGFycHRyX3RtcDJbbG9uZ190bXAgPj4gM10gJgorCQkJCQkJCSgxIDw8IChsb25nX3RtcCAmIDcpKSkKKwkJCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4MiA+PiAzXSB8PQorCQkJCQkJCSgxIDw8IChsb25nX2lkeDIgJiA3KSk7CisJCQkJCWVsc2UKKwkJCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4MiA+PiAzXSAmPQorCQkJCQkJCX4oMSA8PCAobG9uZ19pZHgyICYgNykpOworCisJCQkJCS0tbG9uZ190bXA7CisJCQkJCSsrbG9uZ19pZHgyOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG9wY29kZSA9PSAweDUxKSAvKiBEUyAqLworCQkJCXN0YXR1cyA9IGFsdGVyYV9kcnNjYW4oYXN0YXRlLCBsb25nX2NvdW50LAorCQkJCQkJY2hhcnB0cl90bXAsIGxvbmdfaWR4KTsKKwkJCWVsc2UgLyogSVMgKi8KKwkJCQlzdGF0dXMgPSBhbHRlcmFfaXJzY2FuKGFzdGF0ZSwgbG9uZ19jb3VudCwKKwkJCQkJCWNoYXJwdHJfdG1wLCBsb25nX2lkeCk7CisKKwkJCWlmIChyZXZlcnNlKQorCQkJCWtmcmVlKGNoYXJwdHJfdG1wKTsKKworCQkJYnJlYWs7CisJCWNhc2UgT1BfRFBSQToKKwkJCS8qCisJCQkgKiBEUlBSRSB3aXRoIGFycmF5IGRhdGEKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgYXJyYXkgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWluZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCWlmICh2ZXJzaW9uID4gMCkKKwkJCQkvKgorCQkJCSAqIHN0YWNrIDAgPSBhcnJheSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBhcnJheSBsZWZ0IGluZGV4CisJCQkJICovCisJCQkJY291bnQgPSAxICsgY291bnQgLSBpbmRleDsKKworCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW2FyZ3NbMF1dOworCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9kcl9wcmUoJmFzdGF0ZS0+anMsIGNvdW50LCBpbmRleCwKKwkJCQkJCQljaGFycHRyX3RtcCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9EUE9BOgorCQkJLyoKKwkJCSAqIERSUE9TVCB3aXRoIGFycmF5IGRhdGEKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgYXJyYXkgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWluZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCWlmICh2ZXJzaW9uID4gMCkKKwkJCQkvKgorCQkJCSAqIHN0YWNrIDAgPSBhcnJheSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBhcnJheSBsZWZ0IGluZGV4CisJCQkJICovCisJCQkJY291bnQgPSAxICsgY291bnQgLSBpbmRleDsKKworCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW2FyZ3NbMF1dOworCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9kcl9wb3N0KCZhc3RhdGUtPmpzLCBjb3VudCwgaW5kZXgsCisJCQkJCQkJY2hhcnB0cl90bXApOworCQkJYnJlYWs7CisJCWNhc2UgT1BfSVBSQToKKwkJCS8qCisJCQkgKiBJUlBSRSB3aXRoIGFycmF5IGRhdGEKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgYXJyYXkgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWluZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCWlmICh2ZXJzaW9uID4gMCkKKwkJCQkvKgorCQkJCSAqIHN0YWNrIDAgPSBhcnJheSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBhcnJheSBsZWZ0IGluZGV4CisJCQkJICovCisJCQkJY291bnQgPSAxICsgY291bnQgLSBpbmRleDsKKworCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW2FyZ3NbMF1dOworCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9pcl9wcmUoJmFzdGF0ZS0+anMsIGNvdW50LCBpbmRleCwKKwkJCQkJCQljaGFycHRyX3RtcCk7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0lQT0E6CisJCQkvKgorCQkJICogSVJQT1NUIHdpdGggYXJyYXkgZGF0YQorCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAorCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAorCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKworCQkJaWYgKHZlcnNpb24gPiAwKQorCQkJCS8qCisJCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4CisJCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKKwkJCQkgKi8KKwkJCQljb3VudCA9IDEgKyBjb3VudCAtIGluZGV4OworCisJCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07CisJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3Bvc3QoJmFzdGF0ZS0+anMsIGNvdW50LCBpbmRleCwKKwkJCQkJCQljaGFycHRyX3RtcCk7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0VYUFQ6CisJCQkvKgorCQkJICogRVhQT1JUCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHN0cmluZyBJRAorCQkJICogLi4uc3RhY2sgMCBpcyBpbnRlZ2VyIGV4cHJlc3Npb24KKwkJCSAqLworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKSB7CisJCQkJbmFtZSA9ICZwW3N0cl90YWJsZSArIGFyZ3NbMF1dOworCQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCWFsdGVyYV9leHBvcnRfaW50KG5hbWUsIGxvbmdfdG1wKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX1BTSEU6CisJCQkvKgorCQkJICogUHVzaCBpbnRlZ2VyIGFycmF5IGVsZW1lbnQKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgYXJyYXkgaW5kZXgKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCXZhcmlhYmxlX2lkID0gYXJnc1swXTsKKwkJCWluZGV4ID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisKKwkJCS8qIGNoZWNrIHZhcmlhYmxlIHR5cGUgKi8KKwkJCWlmICgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxZikgPT0gMHgxOSkgeworCQkJCS8qIHdyaXRhYmxlIGludGVnZXIgYXJyYXkgKi8KKwkJCQlsb25ncHRyX3RtcCA9IChsb25nICopdmFyc1t2YXJpYWJsZV9pZF07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25ncHRyX3RtcFtpbmRleF07CisJCQl9IGVsc2UgaWYgKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDFmKSA9PSAweDFjKSB7CisJCQkJLyogcmVhZC1vbmx5IGludGVnZXIgYXJyYXkgKi8KKwkJCQlsb25nX3RtcCA9IHZhcnNbdmFyaWFibGVfaWRdICsKKwkJCQkJCShpbmRleCAqIHNpemVvZihsb25nKSk7CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPQorCQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoJnBbbG9uZ190bXBdKTsKKwkJCX0gZWxzZQorCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX1BTSEE6CisJCQkvKgorCQkJICogUHVzaCBCb29sZWFuIGFycmF5CisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIGNvdW50CisJCQkgKiAuLi5zdGFjayAxIGlzIGFycmF5IGluZGV4CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMF07CisKKwkJCS8qIGNoZWNrIHRoYXQgdmFyaWFibGUgaXMgYSBCb29sZWFuIGFycmF5ICovCisJCQlpZiAoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4MTgpICE9IDB4MDgpIHsKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWJyZWFrOworCQkJfQorCisJCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbdmFyaWFibGVfaWRdOworCisJCQkvKiBwb3AgdGhlIGNvdW50IChudW1iZXIgb2YgYml0cyB0byBjb3B5KSAqLworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCS8qIHBvcCB0aGUgYXJyYXkgaW5kZXggKi8KKwkJCWluZGV4ID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisKKwkJCWlmICh2ZXJzaW9uID4gMCkKKwkJCQkvKgorCQkJCSAqIHN0YWNrIDAgPSBhcnJheSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBhcnJheSBsZWZ0IGluZGV4CisJCQkJICovCisJCQkJY291bnQgPSAxICsgY291bnQgLSBpbmRleDsKKworCQkJaWYgKChjb3VudCA8IDEpIHx8IChjb3VudCA+IDMyKSkgeworCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxvbmdfdG1wID0gMEw7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQkJCWlmIChjaGFycHRyX3RtcFsoaSArIGluZGV4KSA+PiAzXSAmCisJCQkJCQkoMSA8PCAoKGkgKyBpbmRleCkgJiA3KSkpCisJCQkJCWxvbmdfdG1wIHw9ICgxTCA8PCBpKTsKKworCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKKworCQkJYnJlYWs7CisJCWNhc2UgT1BfRFlOQToKKwkJCS8qCisJCQkgKiBEeW5hbWljYWxseSBjaGFuZ2Ugc2l6ZSBvZiBhcnJheQorCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAorCQkJICogLi4uc3RhY2sgMCBpcyBuZXcgc2l6ZQorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJdmFyaWFibGVfaWQgPSBhcmdzWzBdOworCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCWlmIChsb25nX3RtcCA+IHZhcl9zaXplW3ZhcmlhYmxlX2lkXSkgeworCQkJCXZhcl9zaXplW3ZhcmlhYmxlX2lkXSA9IGxvbmdfdG1wOworCisJCQkJaWYgKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4MTApCisJCQkJCS8qIGFsbG9jYXRlIGludGVnZXIgYXJyYXkgKi8KKwkJCQkJbG9uZ190bXAgKj0gc2l6ZW9mKGxvbmcpOworCQkJCWVsc2UKKwkJCQkJLyogYWxsb2NhdGUgQm9vbGVhbiBhcnJheSAqLworCQkJCQlsb25nX3RtcCA9IChsb25nX3RtcCArIDcpID4+IDM7CisKKwkJCQkvKgorCQkJCSAqIElmIHRoZSBidWZmZXIgd2FzIHByZXZpb3VzbHkgYWxsb2NhdGVkLAorCQkJCSAqIGZyZWUgaXQKKwkJCQkgKi8KKwkJCQlpZiAoYXR0cnNbdmFyaWFibGVfaWRdICYgMHg4MCkgeworCQkJCQlrZnJlZSgodm9pZCAqKXZhcnNbdmFyaWFibGVfaWRdKTsKKwkJCQkJdmFyc1t2YXJpYWJsZV9pZF0gPSAwOworCQkJCX0KKworCQkJCS8qCisJCQkJICogQWxsb2NhdGUgYSBuZXcgYnVmZmVyCisJCQkJICogb2YgdGhlIHJlcXVlc3RlZCBzaXplCisJCQkJICovCisJCQkJdmFyc1t2YXJpYWJsZV9pZF0gPSAobG9uZykKKwkJCQkJa3phbGxvYyhsb25nX3RtcCwgR0ZQX0tFUk5FTCk7CisKKwkJCQlpZiAodmFyc1t2YXJpYWJsZV9pZF0gPT0gMCkgeworCQkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFNldCB0aGUgYXR0cmlidXRlIGJpdCB0byBpbmRpY2F0ZSB0aGF0CisJCQkJICogdGhpcyBidWZmZXIgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQKKwkJCQkgKiBzaG91bGQgYmUgZnJlZWQgbGF0ZXIKKwkJCQkgKi8KKwkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHg4MDsKKworCQkJCS8qIHplcm8gb3V0IG1lbW9yeSAqLworCQkJCWNvdW50ID0gKCh2YXJfc2l6ZVt2YXJpYWJsZV9pZF0gKyA3TCkgLworCQkJCQkJCQkJOEwpOworCQkJCWNoYXJwdHJfdG1wID0gKHU4ICopKHZhcnNbdmFyaWFibGVfaWRdKTsKKwkJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkKKwkJCQkJY2hhcnB0cl90bXBbaW5kZXhdID0gMDsKKworCQkJfQorCisJCQlicmVhazsKKwkJY2FzZSBPUF9FWFBWOgorCQkJLyoKKwkJCSAqIEV4cG9ydCBCb29sZWFuIGFycmF5CisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHN0cmluZyBJRAorCQkJICogLi4uc3RhY2sgMCBpcyB2YXJpYWJsZSBJRAorCQkJICogLi4uc3RhY2sgMSBpcyBhcnJheSByaWdodCBpbmRleAorCQkJICogLi4uc3RhY2sgMiBpcyBhcnJheSBsZWZ0IGluZGV4CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMywgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlpZiAodmVyc2lvbiA9PSAwKSB7CisJCQkJLyogRVhQViBpcyBub3Qgc3VwcG9ydGVkIGluIEpCQyAxLjAgKi8KKwkJCQliYWRfb3Bjb2RlID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5hbWUgPSAmcFtzdHJfdGFibGUgKyBhcmdzWzBdXTsKKwkJCXZhcmlhYmxlX2lkID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJbG9uZ19pZHggPSBzdGFja1stLXN0YWNrX3B0cl07LyogcmlnaHQgaW5keCAqLworCQkJbG9uZ19pZHgyID0gc3RhY2tbLS1zdGFja19wdHJdOy8qIGxlZnQgaW5keCAqLworCisJCQlpZiAobG9uZ19pZHggPiBsb25nX2lkeDIpIHsKKwkJCQkvKiByZXZlcnNlIGluZGljZXMgbm90IHN1cHBvcnRlZCAqLworCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxvbmdfY291bnQgPSAxICsgbG9uZ19pZHgyIC0gbG9uZ19pZHg7CisKKwkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1t2YXJpYWJsZV9pZF07CisJCQljaGFycHRyX3RtcDIgPSBOVUxMOworCisJCQlpZiAoKGxvbmdfaWR4ICYgN0wpICE9IDApIHsKKwkJCQlzMzIgayA9IGxvbmdfaWR4OworCQkJCWNoYXJwdHJfdG1wMiA9CisJCQkJCWt6YWxsb2MoKChsb25nX2NvdW50ICsgN0wpIC8gOEwpLAorCQkJCQkJCUdGUF9LRVJORUwpOworCQkJCWlmIChjaGFycHRyX3RtcDIgPT0gTlVMTCkgeworCQkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbG9uZ19jb3VudDsgKytpKSB7CisJCQkJCWlmIChjaGFycHRyX3RtcFtrID4+IDNdICYKKwkJCQkJCQkoMSA8PCAoayAmIDcpKSkKKwkJCQkJCWNoYXJwdHJfdG1wMltpID4+IDNdIHw9CisJCQkJCQkJCSgxIDw8IChpICYgNykpOworCQkJCQllbHNlCisJCQkJCQljaGFycHRyX3RtcDJbaSA+PiAzXSAmPQorCQkJCQkJCQl+KDEgPDwgKGkgJiA3KSk7CisKKwkJCQkJKytrOworCQkJCX0KKwkJCQljaGFycHRyX3RtcCA9IGNoYXJwdHJfdG1wMjsKKworCQkJfSBlbHNlIGlmIChsb25nX2lkeCAhPSAwKQorCQkJCWNoYXJwdHJfdG1wID0gJmNoYXJwdHJfdG1wW2xvbmdfaWR4ID4+IDNdOworCisJCQlhbHRlcmFfZXhwb3J0X2Jvb2xfYXJyYXkobmFtZSwgY2hhcnB0cl90bXAsCisJCQkJCQkJbG9uZ19jb3VudCk7CisKKwkJCS8qIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlciAqLworCQkJaWYgKChsb25nX2lkeCAmIDdMKSAhPSAwKQorCQkJCWtmcmVlKGNoYXJwdHJfdG1wMik7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0NPUFk6IHsKKwkJCS8qCisJCQkgKiBBcnJheSBjb3B5CisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIGRlc3QgSUQKKwkJCSAqIC4uLmFyZ3VtZW50IDEgaXMgc291cmNlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIGNvdW50CisJCQkgKiAuLi5zdGFjayAxIGlzIGRlc3QgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDIgaXMgc291cmNlIGluZGV4CisJCQkgKi8KKwkJCXMzMiBjb3B5X2NvdW50OworCQkJczMyIGNvcHlfaW5kZXg7CisJCQlzMzIgY29weV9pbmRleDI7CisJCQlzMzIgZGVzdGxlZnQ7CisJCQlzMzIgc3JjX2NvdW50OworCQkJczMyIGRlc3RfY291bnQ7CisJCQlpbnQgc3JjX3JldmVyc2UgPSAwOworCQkJaW50IGRlc3RfcmV2ZXJzZSA9IDA7CisKKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMywgJnN0YXR1cykpCisJCQkJYnJlYWs7CisKKwkJCWNvcHlfY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQljb3B5X2luZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJY29weV9pbmRleDIgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlyZXZlcnNlID0gMDsKKworCQkJaWYgKHZlcnNpb24gPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBzdGFjayAwID0gc291cmNlIHJpZ2h0IGluZGV4CisJCQkJICogc3RhY2sgMSA9IHNvdXJjZSBsZWZ0IGluZGV4CisJCQkJICogc3RhY2sgMiA9IGRlc3RpbmF0aW9uIHJpZ2h0IGluZGV4CisJCQkJICogc3RhY2sgMyA9IGRlc3RpbmF0aW9uIGxlZnQgaW5kZXgKKwkJCQkgKi8KKwkJCQlkZXN0bGVmdCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKworCQkJCWlmIChjb3B5X2NvdW50ID4gY29weV9pbmRleCkgeworCQkJCQlzcmNfcmV2ZXJzZSA9IDE7CisJCQkJCXJldmVyc2UgPSAxOworCQkJCQlzcmNfY291bnQgPSAxICsgY29weV9jb3VudCAtIGNvcHlfaW5kZXg7CisJCQkJCS8qIGNvcHlfaW5kZXggPSBzb3VyY2Ugc3RhcnQgaW5kZXggKi8KKwkJCQl9IGVsc2UgeworCQkJCQlzcmNfY291bnQgPSAxICsgY29weV9pbmRleCAtIGNvcHlfY291bnQ7CisJCQkJCS8qIHNvdXJjZSBzdGFydCBpbmRleCAqLworCQkJCQljb3B5X2luZGV4ID0gY29weV9jb3VudDsKKwkJCQl9CisKKwkJCQlpZiAoY29weV9pbmRleDIgPiBkZXN0bGVmdCkgeworCQkJCQlkZXN0X3JldmVyc2UgPSAxOworCQkJCQlyZXZlcnNlID0gIXJldmVyc2U7CisJCQkJCWRlc3RfY291bnQgPSAxICsgY29weV9pbmRleDIgLSBkZXN0bGVmdDsKKwkJCQkJLyogZGVzdGluYXRpb24gc3RhcnQgaW5kZXggKi8KKwkJCQkJY29weV9pbmRleDIgPSBkZXN0bGVmdDsKKwkJCQl9IGVsc2UKKwkJCQkJZGVzdF9jb3VudCA9IDEgKyBkZXN0bGVmdCAtIGNvcHlfaW5kZXgyOworCisJCQkJY29weV9jb3VudCA9IChzcmNfY291bnQgPCBkZXN0X2NvdW50KSA/CisJCQkJCQkJc3JjX2NvdW50IDogZGVzdF9jb3VudDsKKworCQkJCWlmICgoc3JjX3JldmVyc2UgfHwgZGVzdF9yZXZlcnNlKSAmJgorCQkJCQkoc3JjX2NvdW50ICE9IGRlc3RfY291bnQpKQorCQkJCQkvKgorCQkJCQkgKiBJZiBlaXRoZXIgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbgorCQkJCQkgKiBpcyByZXZlcnNlZCwgd2UgY2FuJ3QgdG9sZXJhdGUKKwkJCQkJICogYSBsZW5ndGggbWlzbWF0Y2gsIGJlY2F1c2Ugd2UKKwkJCQkJICogImxlZnQganVzdGlmeSIgYXJyYXlzIHdoZW4gY29weWluZy4KKwkJCQkJICogVGhpcyB3b24ndCB3b3JrIGNvcnJlY3RseQorCQkJCQkgKiB3aXRoIHJldmVyc2VkIGFycmF5cy4KKwkJCQkJICovCisJCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisKKwkJCX0KKworCQkJY291bnQgPSBjb3B5X2NvdW50OworCQkJaW5kZXggPSBjb3B5X2luZGV4OworCQkJaW5kZXgyID0gY29weV9pbmRleDI7CisKKwkJCS8qCisJCQkgKiBJZiBkZXN0aW5hdGlvbiBpcyBhIHJlYWQtb25seSBhcnJheSwKKwkJCSAqIGFsbG9jYXRlIGEgYnVmZmVyIGFuZCBjb252ZXJ0IGl0IHRvIGEgd3JpdGFibGUgYXJyYXkKKwkJCSAqLworCQkJdmFyaWFibGVfaWQgPSBhcmdzWzFdOworCQkJaWYgKCh2ZXJzaW9uID4gMCkgJiYKKwkJCQkoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4OWMpID09IDB4MGMpKSB7CisJCQkJLyogQWxsb2NhdGUgYSB3cml0YWJsZSBidWZmZXIgZm9yIHRoaXMgYXJyYXkgKi8KKwkJCQlsb25nX3RtcCA9CisJCQkJCSh2YXJfc2l6ZVt2YXJpYWJsZV9pZF0gKyA3TCkgPj4gM0w7CisJCQkJY2hhcnB0cl90bXAyID0gKHU4ICopdmFyc1t2YXJpYWJsZV9pZF07CisJCQkJY2hhcnB0cl90bXAgPQorCQkJCQlremFsbG9jKGxvbmdfdG1wLCBHRlBfS0VSTkVMKTsKKwkJCQl2YXJzW3ZhcmlhYmxlX2lkXSA9IChsb25nKWNoYXJwdHJfdG1wOworCisJCQkJaWYgKHZhcnNbdmFyaWFibGVfaWRdID09IDApIHsKKwkJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogemVybyB0aGUgYnVmZmVyICovCisJCQkJZm9yIChsb25nX2lkeCA9IDBMOyBsb25nX2lkeCA8IGxvbmdfdG1wOworCQkJCQkJCQkrK2xvbmdfaWR4KQorCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeF0gPSAwOworCisJCQkJLyogY29weSBwcmV2aW91cyBjb250ZW50cyBpbnRvIGJ1ZmZlciAqLworCQkJCWZvciAobG9uZ19pZHggPSAwTDsKKwkJCQkJbG9uZ19pZHggPCB2YXJfc2l6ZVt2YXJpYWJsZV9pZF07CisJCQkJCQkJCSsrbG9uZ19pZHgpIHsKKwkJCQkJbG9uZ19pZHgyID0gbG9uZ19pZHg7CisKKwkJCQkJaWYgKGNoYXJwdHJfdG1wMltsb25nX2lkeDIgPj4gM10gJgorCQkJCQkJKDEgPDwgKGxvbmdfaWR4MiAmIDcpKSkKKwkJCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4ID4+IDNdIHw9CisJCQkJCQkJKDEgPDwgKGxvbmdfaWR4ICYgNykpOworCisJCQkJfQorCisJCQkJLyoKKwkJCQlzZXQgYml0IDcgLSBidWZmZXIgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCAqLworCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDgwOworCisJCQkJLyogY2xlYXIgYml0IDIgLSB2YXJpYWJsZSBpcyB3cml0YWJsZSAqLworCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSAmPSB+MHgwNDsKKwkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHgwMTsKKwkJCX0KKworCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW2FyZ3NbMV1dOworCQkJY2hhcnB0cl90bXAyID0gKHU4ICopdmFyc1thcmdzWzBdXTsKKworCQkJLyogY2hlY2sgaWYgZGVzdGluYXRpb24gaXMgYSB3cml0YWJsZSBCb29sZWFuIGFycmF5ICovCisJCQlpZiAoKGF0dHJzW2FyZ3NbMV1dICYgMHgxYykgIT0gMHgwOCkgeworCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChjb3VudCA8IDEpIHsKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocmV2ZXJzZSkKKwkJCQlpbmRleDIgKz0gKGNvdW50IC0gMSk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQkJaWYgKGNoYXJwdHJfdG1wMltpbmRleCA+PiAzXSAmCisJCQkJCQkJKDEgPDwgKGluZGV4ICYgNykpKQorCQkJCQljaGFycHRyX3RtcFtpbmRleDIgPj4gM10gfD0KKwkJCQkJCQkoMSA8PCAoaW5kZXgyICYgNykpOworCQkJCWVsc2UKKwkJCQkJY2hhcnB0cl90bXBbaW5kZXgyID4+IDNdICY9CisJCQkJCQl+KDEgPDwgKGluZGV4MiAmIDcpKTsKKworCQkJCSsraW5kZXg7CisJCQkJaWYgKHJldmVyc2UpCisJCQkJCS0taW5kZXgyOworCQkJCWVsc2UKKwkJCQkJKytpbmRleDI7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT1BfRFNDOgorCQljYXNlIE9QX0lTQzogeworCQkJLyoKKwkJCSAqIERSU0NBTiB3aXRoIGNhcHR1cmUKKwkJCSAqIElSU0NBTiB3aXRoIGNhcHR1cmUKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc2NhbiBkYXRhIHZhcmlhYmxlIElECisJCQkgKiAuLi5hcmd1bWVudCAxIGlzIGNhcHR1cmUgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgY2FwdHVyZSBpbmRleAorCQkJICogLi4uc3RhY2sgMSBpcyBzY2FuIGRhdGEgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDIgaXMgY291bnQKKwkJCSAqLworCQkJczMyIHNjYW5fcmlnaHQsIHNjYW5fbGVmdDsKKwkJCXMzMiBjYXB0dXJlX2NvdW50ID0gMDsKKwkJCXMzMiBzY2FuX2NvdW50ID0gMDsKKwkJCXMzMiBjYXB0dXJlX2luZGV4OworCQkJczMyIHNjYW5faW5kZXg7CisKKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMywgJnN0YXR1cykpCisJCQkJYnJlYWs7CisKKwkJCWNhcHR1cmVfaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlzY2FuX2luZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlpZiAodmVyc2lvbiA+IDApIHsKKwkJCQkvKgorCQkJCSAqIHN0YWNrIDAgPSBjYXB0dXJlIHJpZ2h0IGluZGV4CisJCQkJICogc3RhY2sgMSA9IGNhcHR1cmUgbGVmdCBpbmRleAorCQkJCSAqIHN0YWNrIDIgPSBzY2FuIHJpZ2h0IGluZGV4CisJCQkJICogc3RhY2sgMyA9IHNjYW4gbGVmdCBpbmRleAorCQkJCSAqIHN0YWNrIDQgPSBjb3VudAorCQkJCSAqLworCQkJCXNjYW5fcmlnaHQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQkJc2Nhbl9sZWZ0ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCWNhcHR1cmVfY291bnQgPSAxICsgc2Nhbl9pbmRleCAtIGNhcHR1cmVfaW5kZXg7CisJCQkJc2Nhbl9jb3VudCA9IDEgKyBzY2FuX2xlZnQgLSBzY2FuX3JpZ2h0OworCQkJCXNjYW5faW5kZXggPSBzY2FuX3JpZ2h0OworCQkJfQorCisJCQlsb25nX2NvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJLyoKKwkJCSAqIElmIGNhcHR1cmUgYXJyYXkgaXMgcmVhZC1vbmx5LCBhbGxvY2F0ZSBhIGJ1ZmZlcgorCQkJICogYW5kIGNvbnZlcnQgaXQgdG8gYSB3cml0YWJsZSBhcnJheQorCQkJICovCisJCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMV07CisJCQlpZiAoKHZlcnNpb24gPiAwKSAmJgorCQkJCSgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHg5YykgPT0gMHgwYykpIHsKKwkJCQkvKiBBbGxvY2F0ZSBhIHdyaXRhYmxlIGJ1ZmZlciBmb3IgdGhpcyBhcnJheSAqLworCQkJCWxvbmdfdG1wID0KKwkJCQkJKHZhcl9zaXplW3ZhcmlhYmxlX2lkXSArIDdMKSA+PiAzTDsKKwkJCQljaGFycHRyX3RtcDIgPSAodTggKil2YXJzW3ZhcmlhYmxlX2lkXTsKKwkJCQljaGFycHRyX3RtcCA9CisJCQkJCWt6YWxsb2MobG9uZ190bXAsIEdGUF9LRVJORUwpOworCQkJCXZhcnNbdmFyaWFibGVfaWRdID0gKGxvbmcpY2hhcnB0cl90bXA7CisKKwkJCQlpZiAodmFyc1t2YXJpYWJsZV9pZF0gPT0gMCkgeworCQkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiB6ZXJvIHRoZSBidWZmZXIgKi8KKwkJCQlmb3IgKGxvbmdfaWR4ID0gMEw7IGxvbmdfaWR4IDwgbG9uZ190bXA7CisJCQkJCQkJCSsrbG9uZ19pZHgpCisJCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4XSA9IDA7CisKKwkJCQkvKiBjb3B5IHByZXZpb3VzIGNvbnRlbnRzIGludG8gYnVmZmVyICovCisJCQkJZm9yIChsb25nX2lkeCA9IDBMOworCQkJCQlsb25nX2lkeCA8IHZhcl9zaXplW3ZhcmlhYmxlX2lkXTsKKwkJCQkJCQkJKytsb25nX2lkeCkgeworCQkJCQlsb25nX2lkeDIgPSBsb25nX2lkeDsKKworCQkJCQlpZiAoY2hhcnB0cl90bXAyW2xvbmdfaWR4MiA+PiAzXSAmCisJCQkJCQkoMSA8PCAobG9uZ19pZHgyICYgNykpKQorCQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHggPj4gM10gfD0KKwkJCQkJCQkoMSA8PCAobG9uZ19pZHggJiA3KSk7CisKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIHNldCBiaXQgNyAtIGJ1ZmZlciB3YXMKKwkJCQkgKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKwkJCQkgKi8KKwkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHg4MDsKKworCQkJCS8qIGNsZWFyIGJpdCAyIC0gdmFyaWFibGUgaXMgd3JpdGFibGUgKi8KKwkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gJj0gfjB4MDQ7CisJCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4MDE7CisKKwkJCX0KKworCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW2FyZ3NbMF1dOworCQkJY2hhcnB0cl90bXAyID0gKHU4ICopdmFyc1thcmdzWzFdXTsKKworCQkJaWYgKCh2ZXJzaW9uID4gMCkgJiYKKwkJCQkJKChsb25nX2NvdW50ID4gY2FwdHVyZV9jb3VudCkgfHwKKwkJCQkJKGxvbmdfY291bnQgPiBzY2FuX2NvdW50KSkpIHsKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogY2hlY2sgdGhhdCBjYXB0dXJlIGFycmF5CisJCQkgKiBpcyBhIHdyaXRhYmxlIEJvb2xlYW4gYXJyYXkKKwkJCSAqLworCQkJaWYgKChhdHRyc1thcmdzWzFdXSAmIDB4MWMpICE9IDB4MDgpIHsKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCQlpZiAob3Bjb2RlID09IDB4ODIpIC8qIERTQyAqLworCQkJCQlzdGF0dXMgPSBhbHRlcmFfc3dhcF9kcihhc3RhdGUsCisJCQkJCQkJbG9uZ19jb3VudCwKKwkJCQkJCQljaGFycHRyX3RtcCwKKwkJCQkJCQlzY2FuX2luZGV4LAorCQkJCQkJCWNoYXJwdHJfdG1wMiwKKwkJCQkJCQljYXB0dXJlX2luZGV4KTsKKwkJCQllbHNlIC8qIElTQyAqLworCQkJCQlzdGF0dXMgPSBhbHRlcmFfc3dhcF9pcihhc3RhdGUsCisJCQkJCQkJbG9uZ19jb3VudCwKKwkJCQkJCQljaGFycHRyX3RtcCwKKwkJCQkJCQlzY2FuX2luZGV4LAorCQkJCQkJCWNoYXJwdHJfdG1wMiwKKwkJCQkJCQljYXB0dXJlX2luZGV4KTsKKworCQkJfQorCisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QX1dBSVQ6CisJCQkvKgorCQkJICogV0FJVAorCQkJICogLi4uYXJndW1lbnQgMCBpcyB3YWl0IHN0YXRlCisJCQkgKiAuLi5hcmd1bWVudCAxIGlzIGVuZCBzdGF0ZQorCQkJICogLi4uc3RhY2sgMCBpcyBjeWNsZXMKKwkJCSAqIC4uLnN0YWNrIDEgaXMgbWljcm9zZWNvbmRzCisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKworCQkJaWYgKGxvbmdfdG1wICE9IDBMKQorCQkJCXN0YXR1cyA9IGFsdGVyYV93YWl0X2N5Y2xlcyhhc3RhdGUsIGxvbmdfdG1wLAorCQkJCQkJCQlhcmdzWzBdKTsKKworCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCWlmICgoc3RhdHVzID09IDApICYmIChsb25nX3RtcCAhPSAwTCkpCisJCQkJc3RhdHVzID0gYWx0ZXJhX3dhaXRfbXNlY3MoYXN0YXRlLAorCQkJCQkJCQlsb25nX3RtcCwKKwkJCQkJCQkJYXJnc1swXSk7CisKKwkJCWlmICgoc3RhdHVzID09IDApICYmIChhcmdzWzFdICE9IGFyZ3NbMF0pKQorCQkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsCisJCQkJCQkJCWFyZ3NbMV0pOworCisJCQlpZiAodmVyc2lvbiA+IDApIHsKKwkJCQktLXN0YWNrX3B0cjsgLyogdGhyb3cgYXdheSBNQVggY3ljbGVzICovCisJCQkJLS1zdGFja19wdHI7IC8qIHRocm93IGF3YXkgTUFYIG1pY3Jvc2Vjb25kcyAqLworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfQ01QQTogeworCQkJLyoKKwkJCSAqIEFycmF5IGNvbXBhcmUKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc291cmNlIDEgSUQKKwkJCSAqIC4uLmFyZ3VtZW50IDEgaXMgc291cmNlIDIgSUQKKwkJCSAqIC4uLmFyZ3VtZW50IDIgaXMgbWFzayBJRAorCQkJICogLi4uc3RhY2sgMCBpcyBzb3VyY2UgMSBpbmRleAorCQkJICogLi4uc3RhY2sgMSBpcyBzb3VyY2UgMiBpbmRleAorCQkJICogLi4uc3RhY2sgMiBpcyBtYXNrIGluZGV4CisJCQkgKiAuLi5zdGFjayAzIGlzIGNvdW50CisJCQkgKi8KKwkJCXMzMiBhLCBiOworCQkJdTggKnNvdXJjZTEgPSAodTggKil2YXJzW2FyZ3NbMF1dOworCQkJdTggKnNvdXJjZTIgPSAodTggKil2YXJzW2FyZ3NbMV1dOworCQkJdTggKm1hc2sgPSAodTggKil2YXJzW2FyZ3NbMl1dOworCQkJdTMyIGluZGV4MTsKKwkJCXUzMiBpbmRleDI7CisJCQl1MzIgbWFza19pbmRleDsKKworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCA0LCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKworCQkJaW5kZXgxID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJaW5kZXgyID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJbWFza19pbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWxvbmdfY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCWlmICh2ZXJzaW9uID4gMCkgeworCQkJCS8qCisJCQkJICogc3RhY2sgMCA9IHNvdXJjZSAxIHJpZ2h0IGluZGV4CisJCQkJICogc3RhY2sgMSA9IHNvdXJjZSAxIGxlZnQgaW5kZXgKKwkJCQkgKiBzdGFjayAyID0gc291cmNlIDIgcmlnaHQgaW5kZXgKKwkJCQkgKiBzdGFjayAzID0gc291cmNlIDIgbGVmdCBpbmRleAorCQkJCSAqIHN0YWNrIDQgPSBtYXNrIHJpZ2h0IGluZGV4CisJCQkJICogc3RhY2sgNSA9IG1hc2sgbGVmdCBpbmRleAorCQkJCSAqLworCQkJCXMzMiBtYXNrX3JpZ2h0ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCXMzMiBtYXNrX2xlZnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQkJLyogc291cmNlIDEgY291bnQgKi8KKwkJCQlhID0gMSArIGluZGV4MiAtIGluZGV4MTsKKwkJCQkvKiBzb3VyY2UgMiBjb3VudCAqLworCQkJCWIgPSAxICsgbG9uZ19jb3VudCAtIG1hc2tfaW5kZXg7CisJCQkJYSA9IChhIDwgYikgPyBhIDogYjsKKwkJCQkvKiBtYXNrIGNvdW50ICovCisJCQkJYiA9IDEgKyBtYXNrX2xlZnQgLSBtYXNrX3JpZ2h0OworCQkJCWEgPSAoYSA8IGIpID8gYSA6IGI7CisJCQkJLyogc291cmNlIDIgc3RhcnQgaW5kZXggKi8KKwkJCQlpbmRleDIgPSBtYXNrX2luZGV4OworCQkJCS8qIG1hc2sgc3RhcnQgaW5kZXggKi8KKwkJCQltYXNrX2luZGV4ID0gbWFza19yaWdodDsKKwkJCQlsb25nX2NvdW50ID0gYTsKKwkJCX0KKworCQkJbG9uZ190bXAgPSAxTDsKKworCQkJaWYgKGxvbmdfY291bnQgPCAxKQorCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQllbHNlIHsKKwkJCQljb3VudCA9IGxvbmdfY291bnQ7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJCQlpZiAobWFza1ttYXNrX2luZGV4ID4+IDNdICYKKwkJCQkJCSgxIDw8IChtYXNrX2luZGV4ICYgNykpKSB7CisJCQkJCQlhID0gc291cmNlMVtpbmRleDEgPj4gM10gJgorCQkJCQkJCSgxIDw8IChpbmRleDEgJiA3KSkKKwkJCQkJCQkJPyAxIDogMDsKKwkJCQkJCWIgPSBzb3VyY2UyW2luZGV4MiA+PiAzXSAmCisJCQkJCQkJKDEgPDwgKGluZGV4MiAmIDcpKQorCQkJCQkJCQk/IDEgOiAwOworCisJCQkJCQlpZiAoYSAhPSBiKSAvKiBmYWlsdXJlICovCisJCQkJCQkJbG9uZ190bXAgPSAwTDsKKwkJCQkJfQorCQkJCQkrK2luZGV4MTsKKwkJCQkJKytpbmRleDI7CisJCQkJCSsrbWFza19pbmRleDsKKwkJCQl9CisJCQl9CisKKwkJCXN0YWNrW3N0YWNrX3B0cisrXSA9IGxvbmdfdG1wOworCisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJLyogVW5yZWNvZ25pemVkIG9wY29kZSAtLSBFUlJPUiEgKi8KKwkJCWJhZF9vcGNvZGUgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYmFkX29wY29kZSkKKwkJCXN0YXR1cyA9IC1FTk9TWVM7CisKKwkJaWYgKChzdGFja19wdHIgPCAwKSB8fCAoc3RhY2tfcHRyID49IEFMVEVSQV9TVEFDS19TSVpFKSkKKwkJCXN0YXR1cyA9IC1FT1ZFUkZMT1c7CisKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlkb25lID0gMTsKKwkJCSplcnJvcl9hZGRyZXNzID0gKHMzMikob3Bjb2RlX2FkZHJlc3MgLSBjb2RlX3NlY3QpOworCQl9CisJfQorCisJYWx0ZXJhX2ZyZWVfYnVmZmVycyhhc3RhdGUpOworCisJLyogRnJlZSBhbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFycmF5cyAqLworCWlmICgoYXR0cnMgIT0gTlVMTCkgJiYgKHZhcnMgIT0gTlVMTCkpCisJCWZvciAoaSA9IDA7IGkgPCBzeW1fY291bnQ7ICsraSkKKwkJCWlmIChhdHRyc1tpXSAmIDB4ODApCisJCQkJa2ZyZWUoKHZvaWQgKil2YXJzW2ldKTsKKworCWtmcmVlKHZhcnMpOworCWtmcmVlKHZhcl9zaXplKTsKKwlrZnJlZShhdHRycyk7CisJa2ZyZWUocHJvY19hdHRyaWJ1dGVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYWx0ZXJhX2dldF9ub3RlKHU4ICpwLCBzMzIgcHJvZ3JhbV9zaXplLAorCQkJczMyICpvZmZzZXQsIGNoYXIgKmtleSwgY2hhciAqdmFsdWUsIGludCBsZW5ndGgpCisvKgorICogR2V0cyBrZXkgYW5kIHZhbHVlIG9mIE5PVEUgZmllbGRzIGluIHRoZSBKQkMgZmlsZS4KKyAqIENhbiBiZSBjYWxsZWQgaW4gdHdvIG1vZGVzOiAgaWYgb2Zmc2V0IHBvaW50ZXIgaXMgTlVMTCwKKyAqIHRoZW4gdGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBub3RlIGZpZWxkcyB3aGljaCBtYXRjaAorICogdGhlIGtleSBzdHJpbmcgcHJvdmlkZWQuICBJZiBvZmZzZXQgaXMgbm90IE5VTEwsIHRoZW4KKyAqIHRoZSBmdW5jdGlvbiBmaW5kcyB0aGUgbmV4dCBub3RlIGZpZWxkIG9mIGFueSBrZXksCisgKiBzdGFydGluZyBhdCB0aGUgb2Zmc2V0IHNwZWNpZmllZCBieSB0aGUgb2Zmc2V0IHBvaW50ZXIuCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIGVsc2UgYXBwcm9wcmlhdGUgZXJyb3IgY29kZQorICovCit7CisJaW50IHN0YXR1cyA9IC1FTk9EQVRBOworCXUzMiBub3RlX3N0cmluZ3MgPSAwTDsKKwl1MzIgbm90ZV90YWJsZSA9IDBMOworCXUzMiBub3RlX2NvdW50ID0gMEw7CisJdTMyIGZpcnN0X3dvcmQgPSAwTDsKKwlpbnQgdmVyc2lvbiA9IDA7CisJaW50IGRlbHRhID0gMDsKKwljaGFyICprZXlfcHRyOworCWNoYXIgKnZhbHVlX3B0cjsKKwlpbnQgaTsKKworCS8qIFJlYWQgaGVhZGVyIGluZm9ybWF0aW9uICovCisJaWYgKHByb2dyYW1fc2l6ZSA+IDUyTCkgeworCQlmaXJzdF93b3JkICAgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzBdKTsKKwkJdmVyc2lvbiA9IChmaXJzdF93b3JkICYgMUwpOworCQlkZWx0YSA9IHZlcnNpb24gKiA4OworCisJCW5vdGVfc3RyaW5ncyAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbOCArIGRlbHRhXSk7CisJCW5vdGVfdGFibGUgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMTIgKyBkZWx0YV0pOworCQlub3RlX2NvdW50ICAgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzQ0ICsgKDIgKiBkZWx0YSldKTsKKwl9CisKKwlpZiAoKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMEwpICYmIChmaXJzdF93b3JkICE9IDB4NEE0MTREMDFMKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobm90ZV9jb3VudCA8PSAwTCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChvZmZzZXQgPT0gTlVMTCkgeworCQkvKgorCQkgKiBXZSB3aWxsIHNlYXJjaCBmb3IgdGhlIGZpcnN0IG5vdGUgd2l0aCBhIHNwZWNpZmljIGtleSwKKwkJICogYW5kIHJldHVybiBvbmx5IHRoZSB2YWx1ZQorCQkgKi8KKwkJZm9yIChpID0gMDsgKGkgPCBub3RlX2NvdW50KSAmJgorCQkJCQkJKHN0YXR1cyAhPSAwKTsgKytpKSB7CisJCQlrZXlfcHRyID0gJnBbbm90ZV9zdHJpbmdzICsKKwkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKAorCQkJCQkmcFtub3RlX3RhYmxlICsgKDggKiBpKV0pXTsKKwkJCWlmICgoc3RybmljbXAoa2V5LCBrZXlfcHRyLCBzdHJsZW4oa2V5X3B0cikpID09IDApICYmCisJCQkJCQkoa2V5ICE9IE5VTEwpKSB7CisJCQkJc3RhdHVzID0gMDsKKworCQkJCXZhbHVlX3B0ciA9ICZwW25vdGVfc3RyaW5ncyArCisJCQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoCisJCQkJCQkmcFtub3RlX3RhYmxlICsgKDggKiBpKSArIDRdKV07CisKKwkJCQlpZiAodmFsdWUgIT0gTlVMTCkKKwkJCQkJc3RybGNweSh2YWx1ZSwgdmFsdWVfcHRyLCBsZW5ndGgpOworCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSB3aWxsIHNlYXJjaCBmb3IgdGhlIG5leHQgbm90ZSwgcmVnYXJkbGVzcyBvZiB0aGUga2V5LAorCQkgKiBhbmQgcmV0dXJuIGJvdGggdGhlIHZhbHVlIGFuZCB0aGUga2V5CisJCSAqLworCisJCWkgPSAqb2Zmc2V0OworCisJCWlmICgoaSA+PSAwKSAmJiAoaSA8IG5vdGVfY291bnQpKSB7CisJCQlzdGF0dXMgPSAwOworCisJCQlpZiAoa2V5ICE9IE5VTEwpCisJCQkJc3RybGNweShrZXksICZwW25vdGVfc3RyaW5ncyArCisJCQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoCisJCQkJCQkmcFtub3RlX3RhYmxlICsgKDggKiBpKV0pXSwKKwkJCQkJbGVuZ3RoKTsKKworCQkJaWYgKHZhbHVlICE9IE5VTEwpCisJCQkJc3RybGNweSh2YWx1ZSwgJnBbbm90ZV9zdHJpbmdzICsKKwkJCQkJCWdldF91bmFsaWduZWRfYmUzMigKKwkJCQkJCSZwW25vdGVfdGFibGUgKyAoOCAqIGkpICsgNF0pXSwKKwkJCQkJbGVuZ3RoKTsKKworCQkJKm9mZnNldCA9IGkgKyAxOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhbHRlcmFfY2hlY2tfY3JjKHU4ICpwLCBzMzIgcHJvZ3JhbV9zaXplKQoreworCWludCBzdGF0dXMgPSAwOworCXUxNiBsb2NhbF9leHBlY3RlZCA9IDAsCisJICAgIGxvY2FsX2FjdHVhbCA9IDAsCisJICAgIHNoaWZ0X3JlZyA9IDB4ZmZmZjsKKwlpbnQgYml0LCBmZWVkYmFjazsKKwl1OCBkYXRhYnl0ZTsKKwl1MzIgaTsKKwl1MzIgY3JjX3NlY3Rpb24gPSAwTDsKKwl1MzIgZmlyc3Rfd29yZCA9IDBMOworCWludCB2ZXJzaW9uID0gMDsKKwlpbnQgZGVsdGEgPSAwOworCisJaWYgKHByb2dyYW1fc2l6ZSA+IDUyTCkgeworCQlmaXJzdF93b3JkICA9IGdldF91bmFsaWduZWRfYmUzMigmcFswXSk7CisJCXZlcnNpb24gPSAoZmlyc3Rfd29yZCAmIDFMKTsKKwkJZGVsdGEgPSB2ZXJzaW9uICogODsKKworCQljcmNfc2VjdGlvbiA9IGdldF91bmFsaWduZWRfYmUzMigmcFszMiArIGRlbHRhXSk7CisJfQorCisJaWYgKChmaXJzdF93b3JkICE9IDB4NEE0MTREMDBMKSAmJiAoZmlyc3Rfd29yZCAhPSAweDRBNDE0RDAxTCkpCisJCXN0YXR1cyA9IC1FSU87CisKKwlpZiAoY3JjX3NlY3Rpb24gPj0gcHJvZ3JhbV9zaXplKQorCQlzdGF0dXMgPSAtRUlPOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWxvY2FsX2V4cGVjdGVkID0gKHUxNilnZXRfdW5hbGlnbmVkX2JlMTYoJnBbY3JjX3NlY3Rpb25dKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY3JjX3NlY3Rpb247ICsraSkgeworCQkJZGF0YWJ5dGUgPSBwW2ldOworCQkJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgeworCQkJCWZlZWRiYWNrID0gKGRhdGFieXRlIF4gc2hpZnRfcmVnKSAmIDB4MDE7CisJCQkJc2hpZnRfcmVnID4+PSAxOworCQkJCWlmIChmZWVkYmFjaykKKwkJCQkJc2hpZnRfcmVnIF49IDB4ODQwODsKKworCQkJCWRhdGFieXRlID4+PSAxOworCQkJfQorCQl9CisKKwkJbG9jYWxfYWN0dWFsID0gKHUxNil+c2hpZnRfcmVnOworCisJCWlmIChsb2NhbF9leHBlY3RlZCAhPSBsb2NhbF9hY3R1YWwpCisJCQlzdGF0dXMgPSAtRUlMU0VROworCisJfQorCisJaWYgKGRlYnVnIHx8IHN0YXR1cykgeworCQlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIDA6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ1JDIG1hdGNoZWQ6ICUwNHhcbiIsIF9fZnVuY19fLAorCQkJCWxvY2FsX2FjdHVhbCk7CisJCQlicmVhazsKKwkJY2FzZSAtRUlMU0VROgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ1JDIG1pc21hdGNoOiBleHBlY3RlZCAlMDR4LCAiCisJCQkJImFjdHVhbCAlMDR4XG4iLCBfX2Z1bmNfXywgbG9jYWxfZXhwZWN0ZWQsCisJCQkJbG9jYWxfYWN0dWFsKTsKKwkJCWJyZWFrOworCQljYXNlIC1FTk9EQVRBOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXhwZWN0ZWQgQ1JDIG5vdCBmb3VuZCwgIgorCQkJCSJhY3R1YWwgQ1JDID0gJTA0eFxuIiwgX19mdW5jX18sCisJCQkJbG9jYWxfYWN0dWFsKTsKKwkJCWJyZWFrOworCQljYXNlIC1FSU86CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvcjogZm9ybWF0IGlzbid0ICIKKwkJCQkicmVjb2duaXplZC5cbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ1JDIGZ1bmN0aW9uIHJldHVybmVkIGVycm9yICIKKwkJCQkiY29kZSAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYWx0ZXJhX2dldF9maWxlX2luZm8odTggKnAsCisJCQkJCXMzMiBwcm9ncmFtX3NpemUsCisJCQkJCWludCAqZm9ybWF0X3ZlcnNpb24sCisJCQkJCWludCAqYWN0aW9uX2NvdW50LAorCQkJCQlpbnQgKnByb2NlZHVyZV9jb3VudCkKK3sKKwlpbnQgc3RhdHVzID0gLUVJTzsKKwl1MzIgZmlyc3Rfd29yZCA9IDA7CisJaW50IHZlcnNpb24gPSAwOworCisJaWYgKHByb2dyYW1fc2l6ZSA8PSA1MkwpCisJCXJldHVybiBzdGF0dXM7CisKKwlmaXJzdF93b3JkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzBdKTsKKworCWlmICgoZmlyc3Rfd29yZCA9PSAweDRBNDE0RDAwTCkgfHwgKGZpcnN0X3dvcmQgPT0gMHg0QTQxNEQwMUwpKSB7CisJCXN0YXR1cyA9IDA7CisKKwkJdmVyc2lvbiA9IChmaXJzdF93b3JkICYgMUwpOworCQkqZm9ybWF0X3ZlcnNpb24gPSB2ZXJzaW9uICsgMTsKKworCQlpZiAodmVyc2lvbiA+IDApIHsKKwkJCSphY3Rpb25fY291bnQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNDhdKTsKKwkJCSpwcm9jZWR1cmVfY291bnQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNTJdKTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYWx0ZXJhX2dldF9hY3RfaW5mbyh1OCAqcCwKKwkJCQkJczMyIHByb2dyYW1fc2l6ZSwKKwkJCQkJaW50IGluZGV4LAorCQkJCQljaGFyICoqbmFtZSwKKwkJCQkJY2hhciAqKmRlc2NyaXB0aW9uLAorCQkJCQlzdHJ1Y3QgYWx0ZXJhX3Byb2NpbmZvICoqcHJvY19saXN0KQoreworCWludCBzdGF0dXMgPSAtRUlPOworCXN0cnVjdCBhbHRlcmFfcHJvY2luZm8gKnByb2NwdHIgPSBOVUxMOworCXN0cnVjdCBhbHRlcmFfcHJvY2luZm8gKnRtcHB0ciA9IE5VTEw7CisJdTMyIGZpcnN0X3dvcmQgPSAwTDsKKwl1MzIgYWN0aW9uX3RhYmxlID0gMEw7CisJdTMyIHByb2NfdGFibGUgPSAwTDsKKwl1MzIgc3RyX3RhYmxlID0gMEw7CisJdTMyIG5vdGVfc3RyaW5ncyA9IDBMOworCXUzMiBhY3Rpb25fY291bnQgPSAwTDsKKwl1MzIgcHJvY19jb3VudCA9IDBMOworCXUzMiBhY3RfbmFtZV9pZCA9IDBMOworCXUzMiBhY3RfZGVzY19pZCA9IDBMOworCXUzMiBhY3RfcHJvY19pZCA9IDBMOworCXUzMiBhY3RfcHJvY19uYW1lID0gMEw7CisJdTggYWN0X3Byb2NfYXR0cmlidXRlID0gMDsKKworCWlmIChwcm9ncmFtX3NpemUgPD0gNTJMKQorCQlyZXR1cm4gc3RhdHVzOworCS8qIFJlYWQgaGVhZGVyIGluZm9ybWF0aW9uICovCisJZmlyc3Rfd29yZCA9IGdldF91bmFsaWduZWRfYmUzMigmcFswXSk7CisKKwlpZiAoZmlyc3Rfd29yZCAhPSAweDRBNDE0RDAxTCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWFjdGlvbl90YWJsZSA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0XSk7CisJcHJvY190YWJsZSAgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzhdKTsKKwlzdHJfdGFibGUgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMTJdKTsKKwlub3RlX3N0cmluZ3MgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMTZdKTsKKwlhY3Rpb25fY291bnQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNDhdKTsKKwlwcm9jX2NvdW50ICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNTJdKTsKKworCWlmIChpbmRleCA+PSBhY3Rpb25fY291bnQpCisJCXJldHVybiBzdGF0dXM7CisKKwlhY3RfbmFtZV9pZCA9IGdldF91bmFsaWduZWRfYmUzMigmcFthY3Rpb25fdGFibGUgKyAoMTIgKiBpbmRleCldKTsKKwlhY3RfZGVzY19pZCA9IGdldF91bmFsaWduZWRfYmUzMigmcFthY3Rpb25fdGFibGUgKyAoMTIgKiBpbmRleCkgKyA0XSk7CisJYWN0X3Byb2NfaWQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbYWN0aW9uX3RhYmxlICsgKDEyICogaW5kZXgpICsgOF0pOworCisJKm5hbWUgPSAmcFtzdHJfdGFibGUgKyBhY3RfbmFtZV9pZF07CisKKwlpZiAoYWN0X2Rlc2NfaWQgPCAobm90ZV9zdHJpbmdzIC0gc3RyX3RhYmxlKSkKKwkJKmRlc2NyaXB0aW9uID0gJnBbc3RyX3RhYmxlICsgYWN0X2Rlc2NfaWRdOworCisJZG8geworCQlhY3RfcHJvY19uYW1lID0gZ2V0X3VuYWxpZ25lZF9iZTMyKAorCQkJCQkmcFtwcm9jX3RhYmxlICsgKDEzICogYWN0X3Byb2NfaWQpXSk7CisJCWFjdF9wcm9jX2F0dHJpYnV0ZSA9CisJCQkocFtwcm9jX3RhYmxlICsgKDEzICogYWN0X3Byb2NfaWQpICsgOF0gJiAweDAzKTsKKworCQlwcm9jcHRyID0KKwkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgYWx0ZXJhX3Byb2NpbmZvKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisKKwkJaWYgKHByb2NwdHIgPT0gTlVMTCkKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCWVsc2UgeworCQkJcHJvY3B0ci0+bmFtZSA9ICZwW3N0cl90YWJsZSArIGFjdF9wcm9jX25hbWVdOworCQkJcHJvY3B0ci0+YXR0cnMgPSBhY3RfcHJvY19hdHRyaWJ1dGU7CisJCQlwcm9jcHRyLT5uZXh0ID0gTlVMTDsKKworCQkJLyogYWRkIHJlY29yZCB0byBlbmQgb2YgbGlua2VkIGxpc3QgKi8KKwkJCWlmICgqcHJvY19saXN0ID09IE5VTEwpCisJCQkJKnByb2NfbGlzdCA9IHByb2NwdHI7CisJCQllbHNlIHsKKwkJCQl0bXBwdHIgPSAqcHJvY19saXN0OworCQkJCXdoaWxlICh0bXBwdHItPm5leHQgIT0gTlVMTCkKKwkJCQkJdG1wcHRyID0gdG1wcHRyLT5uZXh0OworCQkJCXRtcHB0ci0+bmV4dCA9IHByb2NwdHI7CisJCQl9CisJCX0KKworCQlhY3RfcHJvY19pZCA9IGdldF91bmFsaWduZWRfYmUzMigKKwkJCQkmcFtwcm9jX3RhYmxlICsgKDEzICogYWN0X3Byb2NfaWQpICsgNF0pOworCX0gd2hpbGUgKChhY3RfcHJvY19pZCAhPSAwKSAmJiAoYWN0X3Byb2NfaWQgPCBwcm9jX2NvdW50KSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYWx0ZXJhX2luaXQoc3RydWN0IGFsdGVyYV9jb25maWcgKmNvbmZpZywgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3sKKwlzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUgPSBOVUxMOworCXN0cnVjdCBhbHRlcmFfcHJvY2luZm8gKnByb2NfbGlzdCA9IE5VTEw7CisJc3RydWN0IGFsdGVyYV9wcm9jaW5mbyAqcHJvY3B0ciA9IE5VTEw7CisJY2hhciAqa2V5ID0gTlVMTDsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisJY2hhciAqYWN0aW9uX25hbWUgPSBOVUxMOworCWNoYXIgKmRlc2NyaXB0aW9uID0gTlVMTDsKKwlpbnQgZXhlY19yZXN1bHQgPSAwOworCWludCBleGl0X2NvZGUgPSAwOworCWludCBmb3JtYXRfdmVyc2lvbiA9IDA7CisJaW50IGFjdGlvbl9jb3VudCA9IDA7CisJaW50IHByb2NlZHVyZV9jb3VudCA9IDA7CisJaW50IGluZGV4ID0gMDsKKwlzMzIgb2Zmc2V0ID0gMEw7CisJczMyIGVycm9yX2FkZHJlc3MgPSAwTDsKKwlpbnQgcmV0dmFsID0gMDsKKworCWtleSA9IGt6YWxsb2MoMzMsIEdGUF9LRVJORUwpOworCWlmICgha2V5KSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwl2YWx1ZSA9IGt6YWxsb2MoMjU3LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZhbHVlKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9rZXk7CisJfQorCWFzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbHRlcmFfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFzdGF0ZSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfdmFsdWU7CisJfQorCisJYXN0YXRlLT5jb25maWcgPSBjb25maWc7CisJaWYgKCFhc3RhdGUtPmNvbmZpZy0+anRhZ19pbykgeworCQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVzaW5nIGJ5dGVibGFzdGVyIVxuIiwgX19mdW5jX18pOworCQlhc3RhdGUtPmNvbmZpZy0+anRhZ19pbyA9IG5ldHVwX2p0YWdfaW9fbHB0OworCX0KKworCWFsdGVyYV9jaGVja19jcmMoKHU4ICopZnctPmRhdGEsIGZ3LT5zaXplKTsKKworCWlmIChkZWJ1ZykgeworCQlhbHRlcmFfZ2V0X2ZpbGVfaW5mbygodTggKilmdy0+ZGF0YSwgZnctPnNpemUsICZmb3JtYXRfdmVyc2lvbiwKKwkJCQkJJmFjdGlvbl9jb3VudCwgJnByb2NlZHVyZV9jb3VudCk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGaWxlIGZvcm1hdCBpcyAlcyBCeXRlQ29kZSBmb3JtYXRcbiIsCisJCQlfX2Z1bmNfXywgKGZvcm1hdF92ZXJzaW9uID09IDIpID8gIkphbSBTVEFQTCIgOgorCQkJCQkJInByZS1zdGFuZGFyZGl6ZWQgSmFtIDEuMSIpOworCQl3aGlsZSAoYWx0ZXJhX2dldF9ub3RlKCh1OCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSwKKwkJCQkJJm9mZnNldCwga2V5LCB2YWx1ZSwgMjU2KSA9PSAwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5PVEUgXCIlc1wiID0gXCIlc1wiXG4iLAorCQkJCQlfX2Z1bmNfXywga2V5LCB2YWx1ZSk7CisJfQorCisJaWYgKGRlYnVnICYmIChmb3JtYXRfdmVyc2lvbiA9PSAyKSAmJiAoYWN0aW9uX2NvdW50ID4gMCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFjdGlvbnMgYXZhaWxhYmxlOlxuIiwgX19mdW5jX18pOworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBhY3Rpb25fY291bnQ7ICsraW5kZXgpIHsKKwkJCWFsdGVyYV9nZXRfYWN0X2luZm8oKHU4ICopZnctPmRhdGEsIGZ3LT5zaXplLAorCQkJCQkJaW5kZXgsICZhY3Rpb25fbmFtZSwKKwkJCQkJCSZkZXNjcmlwdGlvbiwKKwkJCQkJCSZwcm9jX2xpc3QpOworCisJCQlpZiAoZGVzY3JpcHRpb24gPT0gTlVMTCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXNcbiIsCisJCQkJCQlfX2Z1bmNfXywKKwkJCQkJCWFjdGlvbl9uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgXCIlc1wiXG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQlhY3Rpb25fbmFtZSwKKwkJCQkJCWRlc2NyaXB0aW9uKTsKKworCQkJcHJvY3B0ciA9IHByb2NfbGlzdDsKKwkJCXdoaWxlIChwcm9jcHRyICE9IE5VTEwpIHsKKwkJCQlpZiAocHJvY3B0ci0+YXR0cnMgIT0gMCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICAgICVzICglcylcbiIsCisJCQkJCQlfX2Z1bmNfXywKKwkJCQkJCXByb2NwdHItPm5hbWUsCisJCQkJCQkocHJvY3B0ci0+YXR0cnMgPT0gMSkgPworCQkJCQkJIm9wdGlvbmFsIiA6ICJyZWNvbW1lbmRlZCIpOworCisJCQkJcHJvY19saXN0ID0gcHJvY3B0ci0+bmV4dDsKKwkJCQlrZnJlZShwcm9jcHRyKTsKKwkJCQlwcm9jcHRyID0gcHJvY19saXN0OworCQkJfQorCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKwl9CisKKwlleGVjX3Jlc3VsdCA9IGFsdGVyYV9leGVjdXRlKGFzdGF0ZSwgKHU4ICopZnctPmRhdGEsIGZ3LT5zaXplLAorCQkJCSZlcnJvcl9hZGRyZXNzLCAmZXhpdF9jb2RlLCAmZm9ybWF0X3ZlcnNpb24pOworCisJaWYgKGV4aXRfY29kZSkKKwkJZXhlY19yZXN1bHQgPSAtRVJFTU9URUlPOworCisJaWYgKChmb3JtYXRfdmVyc2lvbiA9PSAyKSAmJiAoZXhlY19yZXN1bHQgPT0gLUVJTlZBTCkpIHsKKwkJaWYgKGFzdGF0ZS0+Y29uZmlnLT5hY3Rpb24gPT0gTlVMTCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yOiBubyBhY3Rpb24gc3BlY2lmaWVkIGZvciAiCisJCQkJIkphbSBTVEFQTCBmaWxlLlxucHJvZ3JhbSB0ZXJtaW5hdGVkLlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yOiBhY3Rpb24gXCIlc1wiIgorCQkJCSIgaXMgbm90IHN1cHBvcnRlZCAiCisJCQkJImZvciB0aGlzIEphbSBTVEFQTCBmaWxlLlxuIgorCQkJCSJQcm9ncmFtIHRlcm1pbmF0ZWQuXG4iLCBfX2Z1bmNfXywKKwkJCQlhc3RhdGUtPmNvbmZpZy0+YWN0aW9uKTsKKworCX0gZWxzZSBpZiAoZXhlY19yZXN1bHQpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkXG4iLCBfX2Z1bmNfXywgZXhlY19yZXN1bHQpOworCisJa2ZyZWUoYXN0YXRlKTsKK2ZyZWVfdmFsdWU6CisJa2ZyZWUodmFsdWUpOworZnJlZV9rZXk6CisJa2ZyZWUoa2V5KTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTChhbHRlcmFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYXRtZWwtc3NjLmMgYi9kcml2ZXJzL21pc2MvYXRtZWwtc3NjLmMKaW5kZXggNzY5YTRlOC4uNWJiMTg3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2F0bWVsLXNzYy5jCisrKyBiL2RyaXZlcnMvbWlzYy9hdG1lbC1zc2MuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYXRtZWwtc3NjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHNzY19saXN0IGFuZCB1c2VyIGNvdW50ICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVzZXJfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYXRtZWxfdGNsaWIuYyBiL2RyaXZlcnMvbWlzYy9hdG1lbF90Y2xpYi5jCmluZGV4IGE4NDQ4MTAuLjRiY2ZjMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9hdG1lbF90Y2xpYi5jCisrKyBiL2RyaXZlcnMvbWlzYy9hdG1lbF90Y2xpYi5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlc2VydmUgZm9yIHRoZSBpb21lbSByZXNvdXJjZSAqLwogI2RlZmluZSBBVE1FTF9UQ19JT01FTV9TSVpFCTI1NgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2JoMTc4MGdsaS5jIGIvZHJpdmVycy9taXNjL2JoMTc4MGdsaS5jCmluZGV4IDgyZmUyZDAuLmJmZWVhOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9iaDE3ODBnbGkuYworKysgYi9kcml2ZXJzL21pc2MvYmgxNzgwZ2xpLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgQkgxNzgwX1JFR19DT05UUk9MCTB4ODAKICNkZWZpbmUgQkgxNzgwX1JFR19QQVJUSUQJMHg4QQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2ZzYTk0ODAuYyBiL2RyaXZlcnMvbWlzYy9mc2E5NDgwLmMKaW5kZXggMjdkYzBkMi4uZjY1ODZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2ZzYTk0ODAuYworKysgYi9kcml2ZXJzL21pc2MvZnNhOTQ4MC5jCkBAIC00MDAsNyArNDAwLDggQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlkZXZpY2VfaW5pdF93YWtldXAoJmNsaWVudC0+ZGV2LCBwZGF0YS0+d2FrZXVwKTsKKwkJaWYgKHBkYXRhKQorCQkJZGV2aWNlX2luaXRfd2FrZXVwKCZjbGllbnQtPmRldiwgcGRhdGEtPndha2V1cCk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mva2dkYnRzLmMgYi9kcml2ZXJzL21pc2Mva2dkYnRzLmMKaW5kZXggOGNlYmVjNS4uM2Y3YWQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2tnZGJ0cy5jCisrKyBiL2RyaXZlcnMvbWlzYy9rZ2RidHMuYwpAQCAtMTAyLDYgKzEwMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbm1pLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgdjFwcmludGsoYS4uLikgZG8geyBcCiAJaWYgKHZlcmJvc2UpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkLmMgYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5jCmluZGV4IDhiNTFjZDYuLjI5ZDEyYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkLmMKKysrIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmQuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJaW50IGk7CiAKIAlpZiAobGlzMy0+YmxrcmVhZCkgewotCQlpZiAobGlzM19kZXYud2hvYW1pID09IFdBSV8xMkIpIHsKKwkJaWYgKGxpczMtPndob2FtaSA9PSBXQUlfMTJCKSB7CiAJCQl1MTYgZGF0YVszXTsKIAkJCWxpczMtPmJsa3JlYWQobGlzMywgT1VUWF9MLCA2LCAodTggKilkYXRhKTsKIAkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCkBAIC0xOTUsMTggKzE5NSwzMCBAQAogc3RhdGljIGludCBsaXMzXzNkY19yYXRlc1sxNl0gPSB7MCwgMSwgMTAsIDI1LCA1MCwgMTAwLCAyMDAsIDQwMCwgMTYwMCwgNTAwMH07CiAKIC8qIE9EUiBpcyBPdXRwdXQgRGF0YSBSYXRlICovCi1zdGF0aWMgaW50IGxpczNsdjAyZF9nZXRfb2RyKHZvaWQpCitzdGF0aWMgaW50IGxpczNsdjAyZF9nZXRfb2RyKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMpCiB7CiAJdTggY3RybDsKIAlpbnQgc2hpZnQ7CiAKLQlsaXMzX2Rldi5yZWFkKCZsaXMzX2RldiwgQ1RSTF9SRUcxLCAmY3RybCk7Ci0JY3RybCAmPSBsaXMzX2Rldi5vZHJfbWFzazsKLQlzaGlmdCA9IGZmcyhsaXMzX2Rldi5vZHJfbWFzaykgLSAxOwotCXJldHVybiBsaXMzX2Rldi5vZHJzWyhjdHJsID4+IHNoaWZ0KV07CisJbGlzMy0+cmVhZChsaXMzLCBDVFJMX1JFRzEsICZjdHJsKTsKKwljdHJsICY9IGxpczMtPm9kcl9tYXNrOworCXNoaWZ0ID0gZmZzKGxpczMtPm9kcl9tYXNrKSAtIDE7CisJcmV0dXJuIGxpczMtPm9kcnNbKGN0cmwgPj4gc2hpZnQpXTsKIH0KIAotc3RhdGljIGludCBsaXMzbHYwMmRfc2V0X29kcihpbnQgcmF0ZSkKK3N0YXRpYyBpbnQgbGlzM2x2MDJkX2dldF9wd3Jvbl93YWl0KHN0cnVjdCBsaXMzbHYwMmQgKmxpczMpCit7CisJaW50IGRpdiA9IGxpczNsdjAyZF9nZXRfb2RyKGxpczMpOworCisJaWYgKFdBUk5fT05DRShkaXYgPT0gMCwgImRldmljZSByZXR1cm5lZCBzcHVyaW91cyBkYXRhIikpCisJCXJldHVybiAtRU5YSU87CisKKwkvKiBMSVMzIHBvd2VyIG9uIGRlbGF5IGlzIHF1aXRlIGxvbmcgKi8KKwltc2xlZXAobGlzMy0+cHdyb25fZGVsYXkgLyBkaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpczNsdjAyZF9zZXRfb2RyKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMsIGludCByYXRlKQogewogCXU4IGN0cmw7CiAJaW50IGksIGxlbiwgc2hpZnQ7CkBAIC0yMTQsMTQgKzIyNiwxNCBAQAogCWlmICghcmF0ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsaXMzX2Rldi5yZWFkKCZsaXMzX2RldiwgQ1RSTF9SRUcxLCAmY3RybCk7Ci0JY3RybCAmPSB+bGlzM19kZXYub2RyX21hc2s7Ci0JbGVuID0gMSA8PCBod2VpZ2h0X2xvbmcobGlzM19kZXYub2RyX21hc2spOyAvKiAjIG9mIHBvc3NpYmxlIHZhbHVlcyAqLwotCXNoaWZ0ID0gZmZzKGxpczNfZGV2Lm9kcl9tYXNrKSAtIDE7CisJbGlzMy0+cmVhZChsaXMzLCBDVFJMX1JFRzEsICZjdHJsKTsKKwljdHJsICY9IH5saXMzLT5vZHJfbWFzazsKKwlsZW4gPSAxIDw8IGh3ZWlnaHRfbG9uZyhsaXMzLT5vZHJfbWFzayk7IC8qICMgb2YgcG9zc2libGUgdmFsdWVzICovCisJc2hpZnQgPSBmZnMobGlzMy0+b2RyX21hc2spIC0gMTsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJaWYgKGxpczNfZGV2Lm9kcnNbaV0gPT0gcmF0ZSkgewotCQkJbGlzM19kZXYud3JpdGUoJmxpczNfZGV2LCBDVFJMX1JFRzEsCisJCWlmIChsaXMzLT5vZHJzW2ldID09IHJhdGUpIHsKKwkJCWxpczMtPndyaXRlKGxpczMsIENUUkxfUkVHMSwKIAkJCQkJY3RybCB8IChpIDw8IHNoaWZ0KSk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjQwLDEyICsyNTIsMTIgQEAKIAltdXRleF9sb2NrKCZsaXMzLT5tdXRleCk7CiAKIAlpcnFfY2ZnID0gbGlzMy0+aXJxX2NmZzsKLQlpZiAobGlzM19kZXYud2hvYW1pID09IFdBSV84QikgeworCWlmIChsaXMzLT53aG9hbWkgPT0gV0FJXzhCKSB7CiAJCWxpczMtPmRhdGFfcmVhZHlfY291bnRbSVJRX0xJTkUwXSA9IDA7CiAJCWxpczMtPmRhdGFfcmVhZHlfY291bnRbSVJRX0xJTkUxXSA9IDA7CiAKIAkJLyogQ2hhbmdlIGludGVycnVwdCBjZmcgdG8gZGF0YSByZWFkeSBmb3Igc2VsZnRlc3QgKi8KLQkJYXRvbWljX2luYygmbGlzM19kZXYud2FrZV90aHJlYWQpOworCQlhdG9taWNfaW5jKCZsaXMzLT53YWtlX3RocmVhZCk7CiAJCWxpczMtPmlycV9jZmcgPSBMSVMzX0lSUTFfREFUQV9SRUFEWSB8IExJUzNfSVJRMl9EQVRBX1JFQURZOwogCQlsaXMzLT5yZWFkKGxpczMsIENUUkxfUkVHMywgJmN0cmxfcmVnX2RhdGEpOwogCQlsaXMzLT53cml0ZShsaXMzLCBDVFJMX1JFRzMsIChjdHJsX3JlZ19kYXRhICYKQEAgLTI1MywxMiArMjY1LDEyIEBACiAJCQkJKExJUzNfSVJRMV9EQVRBX1JFQURZIHwgTElTM19JUlEyX0RBVEFfUkVBRFkpKTsKIAl9CiAKLQlpZiAobGlzM19kZXYud2hvYW1pID09IFdBSV8zREMpIHsKKwlpZiAobGlzMy0+d2hvYW1pID09IFdBSV8zREMpIHsKIAkJY3RscmVnID0gQ1RSTF9SRUc0OwogCQlzZWxmdGVzdCA9IENUUkw0X1NUMDsKIAl9IGVsc2UgewogCQljdGxyZWcgPSBDVFJMX1JFRzE7Ci0JCWlmIChsaXMzX2Rldi53aG9hbWkgPT0gV0FJXzEyQikKKwkJaWYgKGxpczMtPndob2FtaSA9PSBXQUlfMTJCKQogCQkJc2VsZnRlc3QgPSBDVFJMMV9TVDsKIAkJZWxzZQogCQkJc2VsZnRlc3QgPSBDVFJMMV9TVFA7CkBAIC0yNjYsNyArMjc4LDkgQEAKIAogCWxpczMtPnJlYWQobGlzMywgY3RscmVnLCAmcmVnKTsKIAlsaXMzLT53cml0ZShsaXMzLCBjdGxyZWcsIChyZWcgfCBzZWxmdGVzdCkpOwotCW1zbGVlcChsaXMzLT5wd3Jvbl9kZWxheSAvIGxpczNsdjAyZF9nZXRfb2RyKCkpOworCXJldCA9IGxpczNsdjAyZF9nZXRfcHdyb25fd2FpdChsaXMzKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CiAKIAkvKiBSZWFkIGRpcmVjdGx5IHRvIGF2b2lkIGF4aXMgcmVtYXAgKi8KIAl4ID0gbGlzMy0+cmVhZF9kYXRhKGxpczMsIE9VVFgpOwpAQCAtMjc1LDcgKzI4OSw5IEBACiAKIAkvKiBiYWNrIHRvIG5vcm1hbCBzZXR0aW5ncyAqLwogCWxpczMtPndyaXRlKGxpczMsIGN0bHJlZywgcmVnKTsKLQltc2xlZXAobGlzMy0+cHdyb25fZGVsYXkgLyBsaXMzbHYwMmRfZ2V0X29kcigpKTsKKwlyZXQgPSBsaXMzbHYwMmRfZ2V0X3B3cm9uX3dhaXQobGlzMyk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOwogCiAJcmVzdWx0c1swXSA9IHggLSBsaXMzLT5yZWFkX2RhdGEobGlzMywgT1VUWCk7CiAJcmVzdWx0c1sxXSA9IHkgLSBsaXMzLT5yZWFkX2RhdGEobGlzMywgT1VUWSk7CkBAIC0yODMsOSArMjk5LDkgQEAKIAogCXJldCA9IDA7CiAKLQlpZiAobGlzM19kZXYud2hvYW1pID09IFdBSV84QikgeworCWlmIChsaXMzLT53aG9hbWkgPT0gV0FJXzhCKSB7CiAJCS8qIFJlc3RvcmUgb3JpZ2luYWwgaW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gKi8KLQkJYXRvbWljX2RlYygmbGlzM19kZXYud2FrZV90aHJlYWQpOworCQlhdG9taWNfZGVjKCZsaXMzLT53YWtlX3RocmVhZCk7CiAJCWxpczMtPndyaXRlKGxpczMsIENUUkxfUkVHMywgY3RybF9yZWdfZGF0YSk7CiAJCWxpczMtPmlycV9jZmcgPSBpcnFfY2ZnOwogCkBAIC0zNjMsOCArMzc5LDkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxpczNsdjAyZF9wb3dlcm9mZik7CiAKLXZvaWQgbGlzM2x2MDJkX3Bvd2Vyb24oc3RydWN0IGxpczNsdjAyZCAqbGlzMykKK2ludCBsaXMzbHYwMmRfcG93ZXJvbihzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKQogeworCWludCBlcnI7CiAJdTggcmVnOwogCiAJbGlzMy0+aW5pdChsaXMzKTsKQEAgLTM4NCwzNSArNDAxLDQxIEBACiAJCWxpczMtPndyaXRlKGxpczMsIENUUkxfUkVHMiwgcmVnKTsKIAl9CiAKLQkvKiBMSVMzIHBvd2VyIG9uIGRlbGF5IGlzIHF1aXRlIGxvbmcgKi8KLQltc2xlZXAobGlzMy0+cHdyb25fZGVsYXkgLyBsaXMzbHYwMmRfZ2V0X29kcigpKTsKKwllcnIgPSBsaXMzbHYwMmRfZ2V0X3B3cm9uX3dhaXQobGlzMyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWlmIChsaXMzLT5yZWdfY3RybCkKIAkJbGlzM19jb250ZXh0X3Jlc3RvcmUobGlzMyk7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxpczNsdjAyZF9wb3dlcm9uKTsKIAogCiBzdGF0aWMgdm9pZCBsaXMzbHYwMmRfam95c3RpY2tfcG9sbChzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqcGlkZXYpCiB7CisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IHBpZGV2LT5wcml2YXRlOwogCWludCB4LCB5LCB6OwogCi0JbXV0ZXhfbG9jaygmbGlzM19kZXYubXV0ZXgpOwotCWxpczNsdjAyZF9nZXRfeHl6KCZsaXMzX2RldiwgJngsICZ5LCAmeik7CisJbXV0ZXhfbG9jaygmbGlzMy0+bXV0ZXgpOworCWxpczNsdjAyZF9nZXRfeHl6KGxpczMsICZ4LCAmeSwgJnopOwogCWlucHV0X3JlcG9ydF9hYnMocGlkZXYtPmlucHV0LCBBQlNfWCwgeCk7CiAJaW5wdXRfcmVwb3J0X2FicyhwaWRldi0+aW5wdXQsIEFCU19ZLCB5KTsKIAlpbnB1dF9yZXBvcnRfYWJzKHBpZGV2LT5pbnB1dCwgQUJTX1osIHopOwogCWlucHV0X3N5bmMocGlkZXYtPmlucHV0KTsKLQltdXRleF91bmxvY2soJmxpczNfZGV2Lm11dGV4KTsKKwltdXRleF91bmxvY2soJmxpczMtPm11dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgbGlzM2x2MDJkX2pveXN0aWNrX29wZW4oc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKnBpZGV2KQogewotCWlmIChsaXMzX2Rldi5wbV9kZXYpCi0JCXBtX3J1bnRpbWVfZ2V0X3N5bmMobGlzM19kZXYucG1fZGV2KTsKKwlzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzID0gcGlkZXYtPnByaXZhdGU7CiAKLQlpZiAobGlzM19kZXYucGRhdGEgJiYgbGlzM19kZXYud2hvYW1pID09IFdBSV84QiAmJiBsaXMzX2Rldi5pZGV2KQotCQlhdG9taWNfc2V0KCZsaXMzX2Rldi53YWtlX3RocmVhZCwgMSk7CisJaWYgKGxpczMtPnBtX2RldikKKwkJcG1fcnVudGltZV9nZXRfc3luYyhsaXMzLT5wbV9kZXYpOworCisJaWYgKGxpczMtPnBkYXRhICYmIGxpczMtPndob2FtaSA9PSBXQUlfOEIgJiYgbGlzMy0+aWRldikKKwkJYXRvbWljX3NldCgmbGlzMy0+d2FrZV90aHJlYWQsIDEpOwogCS8qCiAJICogVXBkYXRlIGNvb3JkaW5hdGVzIGZvciB0aGUgY2FzZSB3aGVyZSBwb2xsIGludGVydmFsIGlzIDAgYW5kCiAJICogdGhlIGNoaXAgaW4gcnVubmluZyBwdXJlbHkgdW5kZXIgaW50ZXJydXB0IGNvbnRyb2wKQEAgLTQyMiwxNCArNDQ1LDE4IEBACiAKIHN0YXRpYyB2b2lkIGxpczNsdjAyZF9qb3lzdGlja19jbG9zZShzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqcGlkZXYpCiB7Ci0JYXRvbWljX3NldCgmbGlzM19kZXYud2FrZV90aHJlYWQsIDApOwotCWlmIChsaXMzX2Rldi5wbV9kZXYpCi0JCXBtX3J1bnRpbWVfcHV0KGxpczNfZGV2LnBtX2Rldik7CisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IHBpZGV2LT5wcml2YXRlOworCisJYXRvbWljX3NldCgmbGlzMy0+d2FrZV90aHJlYWQsIDApOworCWlmIChsaXMzLT5wbV9kZXYpCisJCXBtX3J1bnRpbWVfcHV0KGxpczMtPnBtX2Rldik7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBsaXMzMDJkbF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbGlzMzAyZGxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCiB7Ci0JaWYgKCF0ZXN0X2JpdCgwLCAmbGlzM19kZXYubWlzY19vcGVuZWQpKQorCXN0cnVjdCBsaXMzbHYwMmQgKmxpczMgPSBkYXRhOworCisJaWYgKCF0ZXN0X2JpdCgwLCAmbGlzMy0+bWlzY19vcGVuZWQpKQogCQlnb3RvIG91dDsKIAogCS8qCkBAIC00MzcsMTIgKzQ2NCwxMiBAQAogCSAqIHRoZSBsaWQgaXMgY2xvc2VkLiBUaGlzIGxlYWRzIHRvIGludGVycnVwdHMgYXMgc29vbiBhcyBhIGxpdHRsZSBtb3ZlCiAJICogaXMgZG9uZS4KIAkgKi8KLQlhdG9taWNfaW5jKCZsaXMzX2Rldi5jb3VudCk7CisJYXRvbWljX2luYygmbGlzMy0+Y291bnQpOwogCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsaXMzX2Rldi5taXNjX3dhaXQpOwotCWtpbGxfZmFzeW5jKCZsaXMzX2Rldi5hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfSU4pOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbGlzMy0+bWlzY193YWl0KTsKKwlraWxsX2Zhc3luYygmbGlzMy0+YXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKIG91dDoKLQlpZiAoYXRvbWljX3JlYWQoJmxpczNfZGV2Lndha2VfdGhyZWFkKSkKKwlpZiAoYXRvbWljX3JlYWQoJmxpczMtPndha2VfdGhyZWFkKSkKIAkJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC01MTQsMjggKzU0MSwzNyBAQAogCiBzdGF0aWMgaW50IGxpczNsdjAyZF9taXNjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmxpczNfZGV2Lm1pc2Nfb3BlbmVkKSkKKwlzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzID0gY29udGFpbmVyX29mKGZpbGUtPnByaXZhdGVfZGF0YSwKKwkJCQkJICAgICAgc3RydWN0IGxpczNsdjAyZCwgbWlzY2Rldik7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmbGlzMy0+bWlzY19vcGVuZWQpKQogCQlyZXR1cm4gLUVCVVNZOyAvKiBhbHJlYWR5IG9wZW4gKi8KIAotCWlmIChsaXMzX2Rldi5wbV9kZXYpCi0JCXBtX3J1bnRpbWVfZ2V0X3N5bmMobGlzM19kZXYucG1fZGV2KTsKKwlpZiAobGlzMy0+cG1fZGV2KQorCQlwbV9ydW50aW1lX2dldF9zeW5jKGxpczMtPnBtX2Rldik7CiAKLQlhdG9taWNfc2V0KCZsaXMzX2Rldi5jb3VudCwgMCk7CisJYXRvbWljX3NldCgmbGlzMy0+Y291bnQsIDApOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGxpczNsdjAyZF9taXNjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JZmFzeW5jX2hlbHBlcigtMSwgZmlsZSwgMCwgJmxpczNfZGV2LmFzeW5jX3F1ZXVlKTsKLQljbGVhcl9iaXQoMCwgJmxpczNfZGV2Lm1pc2Nfb3BlbmVkKTsgLyogcmVsZWFzZSB0aGUgZGV2aWNlICovCi0JaWYgKGxpczNfZGV2LnBtX2RldikKLQkJcG1fcnVudGltZV9wdXQobGlzM19kZXYucG1fZGV2KTsKKwlzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzID0gY29udGFpbmVyX29mKGZpbGUtPnByaXZhdGVfZGF0YSwKKwkJCQkJICAgICAgc3RydWN0IGxpczNsdjAyZCwgbWlzY2Rldik7CisKKwlmYXN5bmNfaGVscGVyKC0xLCBmaWxlLCAwLCAmbGlzMy0+YXN5bmNfcXVldWUpOworCWNsZWFyX2JpdCgwLCAmbGlzMy0+bWlzY19vcGVuZWQpOyAvKiByZWxlYXNlIHRoZSBkZXZpY2UgKi8KKwlpZiAobGlzMy0+cG1fZGV2KQorCQlwbV9ydW50aW1lX3B1dChsaXMzLT5wbV9kZXYpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBsaXMzbHYwMmRfbWlzY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCiB7CisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IGNvbnRhaW5lcl9vZihmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJCSAgICAgIHN0cnVjdCBsaXMzbHYwMmQsIG1pc2NkZXYpOworCiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJdTMyIGRhdGE7CiAJdW5zaWduZWQgY2hhciBieXRlX2RhdGE7CkBAIC01NDQsMTAgKzU4MCwxMCBAQAogCWlmIChjb3VudCA8IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYWRkX3dhaXRfcXVldWUoJmxpczNfZGV2Lm1pc2Nfd2FpdCwgJndhaXQpOworCWFkZF93YWl0X3F1ZXVlKCZsaXMzLT5taXNjX3dhaXQsICZ3YWl0KTsKIAl3aGlsZSAodHJ1ZSkgewogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlkYXRhID0gYXRvbWljX3hjaGcoJmxpczNfZGV2LmNvdW50LCAwKTsKKwkJZGF0YSA9IGF0b21pY194Y2hnKCZsaXMzLT5jb3VudCwgMCk7CiAJCWlmIChkYXRhKQogCQkJYnJlYWs7CiAKQEAgLTU3NywyMiArNjEzLDI4IEBACiAKIG91dDoKIAlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmxpczNfZGV2Lm1pc2Nfd2FpdCwgJndhaXQpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZsaXMzLT5taXNjX3dhaXQsICZ3YWl0KTsKIAogCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGlzM2x2MDJkX21pc2NfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKLQlwb2xsX3dhaXQoZmlsZSwgJmxpczNfZGV2Lm1pc2Nfd2FpdCwgd2FpdCk7Ci0JaWYgKGF0b21pY19yZWFkKCZsaXMzX2Rldi5jb3VudCkpCisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IGNvbnRhaW5lcl9vZihmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJCSAgICAgIHN0cnVjdCBsaXMzbHYwMmQsIG1pc2NkZXYpOworCisJcG9sbF93YWl0KGZpbGUsICZsaXMzLT5taXNjX3dhaXQsIHdhaXQpOworCWlmIChhdG9taWNfcmVhZCgmbGlzMy0+Y291bnQpKQogCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBsaXMzbHYwMmRfbWlzY19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQogewotCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmxpczNfZGV2LmFzeW5jX3F1ZXVlKTsKKwlzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzID0gY29udGFpbmVyX29mKGZpbGUtPnByaXZhdGVfZGF0YSwKKwkJCQkJICAgICAgc3RydWN0IGxpczNsdjAyZCwgbWlzY2Rldik7CisKKwlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZsaXMzLT5hc3luY19xdWV1ZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpczNsdjAyZF9taXNjX2ZvcHMgPSB7CkBAIC02MDUsODUgKzY0Nyw4MCBAQAogCS5mYXN5bmMgID0gbGlzM2x2MDJkX21pc2NfZmFzeW5jLAogfTsKIAotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGxpczNsdjAyZF9taXNjX2RldmljZSA9IHsKLQkubWlub3IgICA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZSAgICA9ICJmcmVlZmFsbCIsCi0JLmZvcHMgICAgPSAmbGlzM2x2MDJkX21pc2NfZm9wcywKLX07Ci0KLWludCBsaXMzbHYwMmRfam95c3RpY2tfZW5hYmxlKHZvaWQpCitpbnQgbGlzM2x2MDJkX2pveXN0aWNrX2VuYWJsZShzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgZXJyOwogCWludCBtYXhfdmFsLCBmdXp6LCBmbGF0OwogCWludCBidG5zW10gPSB7QlROX1gsIEJUTl9ZLCBCVE5fWn07CiAKLQlpZiAobGlzM19kZXYuaWRldikKKwlpZiAobGlzMy0+aWRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsaXMzX2Rldi5pZGV2ID0gaW5wdXRfYWxsb2NhdGVfcG9sbGVkX2RldmljZSgpOwotCWlmICghbGlzM19kZXYuaWRldikKKwlsaXMzLT5pZGV2ID0gaW5wdXRfYWxsb2NhdGVfcG9sbGVkX2RldmljZSgpOworCWlmICghbGlzMy0+aWRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlsaXMzX2Rldi5pZGV2LT5wb2xsID0gbGlzM2x2MDJkX2pveXN0aWNrX3BvbGw7Ci0JbGlzM19kZXYuaWRldi0+b3BlbiA9IGxpczNsdjAyZF9qb3lzdGlja19vcGVuOwotCWxpczNfZGV2LmlkZXYtPmNsb3NlID0gbGlzM2x2MDJkX2pveXN0aWNrX2Nsb3NlOwotCWxpczNfZGV2LmlkZXYtPnBvbGxfaW50ZXJ2YWwgPSBNRFBTX1BPTExfSU5URVJWQUw7Ci0JbGlzM19kZXYuaWRldi0+cG9sbF9pbnRlcnZhbF9taW4gPSBNRFBTX1BPTExfTUlOOwotCWxpczNfZGV2LmlkZXYtPnBvbGxfaW50ZXJ2YWxfbWF4ID0gTURQU19QT0xMX01BWDsKLQlpbnB1dF9kZXYgPSBsaXMzX2Rldi5pZGV2LT5pbnB1dDsKKwlsaXMzLT5pZGV2LT5wb2xsID0gbGlzM2x2MDJkX2pveXN0aWNrX3BvbGw7CisJbGlzMy0+aWRldi0+b3BlbiA9IGxpczNsdjAyZF9qb3lzdGlja19vcGVuOworCWxpczMtPmlkZXYtPmNsb3NlID0gbGlzM2x2MDJkX2pveXN0aWNrX2Nsb3NlOworCWxpczMtPmlkZXYtPnBvbGxfaW50ZXJ2YWwgPSBNRFBTX1BPTExfSU5URVJWQUw7CisJbGlzMy0+aWRldi0+cG9sbF9pbnRlcnZhbF9taW4gPSBNRFBTX1BPTExfTUlOOworCWxpczMtPmlkZXYtPnBvbGxfaW50ZXJ2YWxfbWF4ID0gTURQU19QT0xMX01BWDsKKwlsaXMzLT5pZGV2LT5wcml2YXRlID0gbGlzMzsKKwlpbnB1dF9kZXYgPSBsaXMzLT5pZGV2LT5pbnB1dDsKIAogCWlucHV0X2Rldi0+bmFtZSAgICAgICA9ICJTVCBMSVMzTFYwMkRMIEFjY2VsZXJvbWV0ZXIiOwogCWlucHV0X2Rldi0+cGh5cyAgICAgICA9IERSSVZFUl9OQU1FICIvaW5wdXQwIjsKIAlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKIAlpbnB1dF9kZXYtPmlkLnZlbmRvciAgPSAwOwotCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZsaXMzX2Rldi5wZGV2LT5kZXY7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmxpczMtPnBkZXYtPmRldjsKIAogCXNldF9iaXQoRVZfQUJTLCBpbnB1dF9kZXYtPmV2Yml0KTsKLQltYXhfdmFsID0gKGxpczNfZGV2Lm1kcHNfbWF4X3ZhbCAqIGxpczNfZGV2LnNjYWxlKSAvIExJUzNfQUNDVVJBQ1k7Ci0JaWYgKGxpczNfZGV2Lndob2FtaSA9PSBXQUlfMTJCKSB7CisJbWF4X3ZhbCA9IChsaXMzLT5tZHBzX21heF92YWwgKiBsaXMzLT5zY2FsZSkgLyBMSVMzX0FDQ1VSQUNZOworCWlmIChsaXMzLT53aG9hbWkgPT0gV0FJXzEyQikgewogCQlmdXp6ID0gTElTM19ERUZBVUxUX0ZVWlpfMTJCOwogCQlmbGF0ID0gTElTM19ERUZBVUxUX0ZMQVRfMTJCOwogCX0gZWxzZSB7CiAJCWZ1enogPSBMSVMzX0RFRkFVTFRfRlVaWl84QjsKIAkJZmxhdCA9IExJUzNfREVGQVVMVF9GTEFUXzhCOwogCX0KLQlmdXp6ID0gKGZ1enogKiBsaXMzX2Rldi5zY2FsZSkgLyBMSVMzX0FDQ1VSQUNZOwotCWZsYXQgPSAoZmxhdCAqIGxpczNfZGV2LnNjYWxlKSAvIExJUzNfQUNDVVJBQ1k7CisJZnV6eiA9IChmdXp6ICogbGlzMy0+c2NhbGUpIC8gTElTM19BQ0NVUkFDWTsKKwlmbGF0ID0gKGZsYXQgKiBsaXMzLT5zY2FsZSkgLyBMSVMzX0FDQ1VSQUNZOwogCiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgLW1heF92YWwsIG1heF92YWwsIGZ1enosIGZsYXQpOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIC1tYXhfdmFsLCBtYXhfdmFsLCBmdXp6LCBmbGF0KTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19aLCAtbWF4X3ZhbCwgbWF4X3ZhbCwgZnV6eiwgZmxhdCk7CiAKLQlsaXMzX2Rldi5tYXBwZWRfYnRuc1swXSA9IGxpczNsdjAyZF9nZXRfYXhpcyhhYnMobGlzM19kZXYuYWMueCksIGJ0bnMpOwotCWxpczNfZGV2Lm1hcHBlZF9idG5zWzFdID0gbGlzM2x2MDJkX2dldF9heGlzKGFicyhsaXMzX2Rldi5hYy55KSwgYnRucyk7Ci0JbGlzM19kZXYubWFwcGVkX2J0bnNbMl0gPSBsaXMzbHYwMmRfZ2V0X2F4aXMoYWJzKGxpczNfZGV2LmFjLnopLCBidG5zKTsKKwlsaXMzLT5tYXBwZWRfYnRuc1swXSA9IGxpczNsdjAyZF9nZXRfYXhpcyhhYnMobGlzMy0+YWMueCksIGJ0bnMpOworCWxpczMtPm1hcHBlZF9idG5zWzFdID0gbGlzM2x2MDJkX2dldF9heGlzKGFicyhsaXMzLT5hYy55KSwgYnRucyk7CisJbGlzMy0+bWFwcGVkX2J0bnNbMl0gPSBsaXMzbHYwMmRfZ2V0X2F4aXMoYWJzKGxpczMtPmFjLnopLCBidG5zKTsKIAotCWVyciA9IGlucHV0X3JlZ2lzdGVyX3BvbGxlZF9kZXZpY2UobGlzM19kZXYuaWRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfcG9sbGVkX2RldmljZShsaXMzLT5pZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShsaXMzX2Rldi5pZGV2KTsKLQkJbGlzM19kZXYuaWRldiA9IE5VTEw7CisJCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShsaXMzLT5pZGV2KTsKKwkJbGlzMy0+aWRldiA9IE5VTEw7CiAJfQogCiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxpczNsdjAyZF9qb3lzdGlja19lbmFibGUpOwogCi12b2lkIGxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKHZvaWQpCit2b2lkIGxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMpCiB7Ci0JaWYgKGxpczNfZGV2LmlycSkKLQkJZnJlZV9pcnEobGlzM19kZXYuaXJxLCAmbGlzM19kZXYpOwotCWlmIChsaXMzX2Rldi5wZGF0YSAmJiBsaXMzX2Rldi5wZGF0YS0+aXJxMikKLQkJZnJlZV9pcnEobGlzM19kZXYucGRhdGEtPmlycTIsICZsaXMzX2Rldik7CisJaWYgKGxpczMtPmlycSkKKwkJZnJlZV9pcnEobGlzMy0+aXJxLCBsaXMzKTsKKwlpZiAobGlzMy0+cGRhdGEgJiYgbGlzMy0+cGRhdGEtPmlycTIpCisJCWZyZWVfaXJxKGxpczMtPnBkYXRhLT5pcnEyLCBsaXMzKTsKIAotCWlmICghbGlzM19kZXYuaWRldikKKwlpZiAoIWxpczMtPmlkZXYpCiAJCXJldHVybjsKIAotCWlmIChsaXMzX2Rldi5pcnEpCi0JCW1pc2NfZGVyZWdpc3RlcigmbGlzM2x2MDJkX21pc2NfZGV2aWNlKTsKLQlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UobGlzM19kZXYuaWRldik7Ci0JaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKGxpczNfZGV2LmlkZXYpOwotCWxpczNfZGV2LmlkZXYgPSBOVUxMOworCWlmIChsaXMzLT5pcnEpCisJCW1pc2NfZGVyZWdpc3RlcigmbGlzMy0+bWlzY2Rldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGxpczMtPmlkZXYpOworCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShsaXMzLT5pZGV2KTsKKwlsaXMzLT5pZGV2ID0gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKTsKIApAQCAtNzA4LDYgKzc0NSw3IEBACiBzdGF0aWMgc3NpemVfdCBsaXMzbHYwMmRfc2VsZnRlc3Rfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJczE2IHZhbHVlc1szXTsKIAogCXN0YXRpYyBjb25zdCBjaGFyIG9rW10gPSAiT0siOwpAQCAtNzE1LDggKzc1Myw4IEBACiAJc3RhdGljIGNvbnN0IGNoYXIgaXJxW10gPSAiRkFJTF9JUlEiOwogCWNvbnN0IGNoYXIgKnJlczsKIAotCWxpczNsdjAyZF9zeXNmc19wb3dlcm9uKCZsaXMzX2Rldik7Ci0Jc3dpdGNoIChsaXMzbHYwMmRfc2VsZnRlc3QoJmxpczNfZGV2LCB2YWx1ZXMpKSB7CisJbGlzM2x2MDJkX3N5c2ZzX3Bvd2Vyb24obGlzMyk7CisJc3dpdGNoIChsaXMzbHYwMmRfc2VsZnRlc3QobGlzMywgdmFsdWVzKSkgewogCWNhc2UgU0VMRlRFU1RfRkFJTDoKIAkJcmVzID0gZmFpbDsKIAkJYnJlYWs7CkBAIC03MzUsMzMgKzc3MywzNyBAQAogc3RhdGljIHNzaXplX3QgbGlzM2x2MDJkX3Bvc2l0aW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCB4LCB5LCB6OwogCi0JbGlzM2x2MDJkX3N5c2ZzX3Bvd2Vyb24oJmxpczNfZGV2KTsKLQltdXRleF9sb2NrKCZsaXMzX2Rldi5tdXRleCk7Ci0JbGlzM2x2MDJkX2dldF94eXooJmxpczNfZGV2LCAmeCwgJnksICZ6KTsKLQltdXRleF91bmxvY2soJmxpczNfZGV2Lm11dGV4KTsKKwlsaXMzbHYwMmRfc3lzZnNfcG93ZXJvbihsaXMzKTsKKwltdXRleF9sb2NrKCZsaXMzLT5tdXRleCk7CisJbGlzM2x2MDJkX2dldF94eXoobGlzMywgJngsICZ5LCAmeik7CisJbXV0ZXhfdW5sb2NrKCZsaXMzLT5tdXRleCk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiKCVkLCVkLCVkKVxuIiwgeCwgeSwgeik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxpczNsdjAyZF9yYXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlsaXMzbHYwMmRfc3lzZnNfcG93ZXJvbigmbGlzM19kZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBsaXMzbHYwMmRfZ2V0X29kcigpKTsKKwlzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlsaXMzbHYwMmRfc3lzZnNfcG93ZXJvbihsaXMzKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbGlzM2x2MDJkX2dldF9vZHIobGlzMykpOwogfQogCiBzdGF0aWMgc3NpemVfdCBsaXMzbHYwMmRfcmF0ZV9zZXQoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCiAJCQkJc2l6ZV90IGNvdW50KQogeworCXN0cnVjdCBsaXMzbHYwMmQgKmxpczMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBsb25nIHJhdGU7CiAKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmcmF0ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbGlzM2x2MDJkX3N5c2ZzX3Bvd2Vyb24oJmxpczNfZGV2KTsKLQlpZiAobGlzM2x2MDJkX3NldF9vZHIocmF0ZSkpCisJbGlzM2x2MDJkX3N5c2ZzX3Bvd2Vyb24obGlzMyk7CisJaWYgKGxpczNsdjAyZF9zZXRfb2RyKGxpczMsIHJhdGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBjb3VudDsKQEAgLTc5MCw2ICs4MzIsNyBAQAogCWlmIChJU19FUlIobGlzMy0+cGRldikpCiAJCXJldHVybiBQVFJfRVJSKGxpczMtPnBkZXYpOwogCisJcGxhdGZvcm1fc2V0X2RydmRhdGEobGlzMy0+cGRldiwgbGlzMyk7CiAJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmbGlzMy0+cGRldi0+ZGV2LmtvYmosICZsaXMzbHYwMmRfYXR0cmlidXRlX2dyb3VwKTsKIH0KIApAQCAtODAzLDcgKzg0Niw3IEBACiAKIAkJLyogU1lTRlMgbWF5IGhhdmUgbGVmdCBjaGlwIHJ1bm5pbmcuIFR1cm4gb2ZmIGlmIG5lY2Vzc2FyeSAqLwogCQlpZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGxpczMtPnBtX2RldikpCi0JCQlsaXMzbHYwMmRfcG93ZXJvZmYoJmxpczNfZGV2KTsKKwkJCWxpczNsdjAyZF9wb3dlcm9mZihsaXMzKTsKIAogCQlwbV9ydW50aW1lX2Rpc2FibGUobGlzMy0+cG1fZGV2KTsKIAkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGxpczMtPnBtX2Rldik7CkBAIC04MTMsMjQgKzg1NiwyNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobGlzM2x2MDJkX3JlbW92ZV9mcyk7CiAKLXN0YXRpYyB2b2lkIGxpczNsdjAyZF84Yl9jb25maWd1cmUoc3RydWN0IGxpczNsdjAyZCAqZGV2LAorc3RhdGljIHZvaWQgbGlzM2x2MDJkXzhiX2NvbmZpZ3VyZShzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzLAogCQkJCXN0cnVjdCBsaXMzbHYwMmRfcGxhdGZvcm1fZGF0YSAqcCkKIHsKIAlpbnQgZXJyOwogCWludCBjdHJsMiA9IHAtPmhpcGFzc19jdHJsOwogCiAJaWYgKHAtPmNsaWNrX2ZsYWdzKSB7Ci0JCWRldi0+d3JpdGUoZGV2LCBDTElDS19DRkcsIHAtPmNsaWNrX2ZsYWdzKTsKLQkJZGV2LT53cml0ZShkZXYsIENMSUNLX1RJTUVMSU1JVCwgcC0+Y2xpY2tfdGltZV9saW1pdCk7Ci0JCWRldi0+d3JpdGUoZGV2LCBDTElDS19MQVRFTkNZLCBwLT5jbGlja19sYXRlbmN5KTsKLQkJZGV2LT53cml0ZShkZXYsIENMSUNLX1dJTkRPVywgcC0+Y2xpY2tfd2luZG93KTsKLQkJZGV2LT53cml0ZShkZXYsIENMSUNLX1RIU1osIHAtPmNsaWNrX3RocmVzaF96ICYgMHhmKTsKLQkJZGV2LT53cml0ZShkZXYsIENMSUNLX1RIU1lfWCwKKwkJbGlzMy0+d3JpdGUobGlzMywgQ0xJQ0tfQ0ZHLCBwLT5jbGlja19mbGFncyk7CisJCWxpczMtPndyaXRlKGxpczMsIENMSUNLX1RJTUVMSU1JVCwgcC0+Y2xpY2tfdGltZV9saW1pdCk7CisJCWxpczMtPndyaXRlKGxpczMsIENMSUNLX0xBVEVOQ1ksIHAtPmNsaWNrX2xhdGVuY3kpOworCQlsaXMzLT53cml0ZShsaXMzLCBDTElDS19XSU5ET1csIHAtPmNsaWNrX3dpbmRvdyk7CisJCWxpczMtPndyaXRlKGxpczMsIENMSUNLX1RIU1osIHAtPmNsaWNrX3RocmVzaF96ICYgMHhmKTsKKwkJbGlzMy0+d3JpdGUobGlzMywgQ0xJQ0tfVEhTWV9YLAogCQkJKHAtPmNsaWNrX3RocmVzaF94ICYgMHhmKSB8CiAJCQkocC0+Y2xpY2tfdGhyZXNoX3kgPDwgNCkpOwogCi0JCWlmIChkZXYtPmlkZXYpIHsKLQkJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGxpczNfZGV2LmlkZXYtPmlucHV0OworCQlpZiAobGlzMy0+aWRldikgeworCQkJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gbGlzMy0+aWRldi0+aW5wdXQ7CiAJCQlpbnB1dF9zZXRfY2FwYWJpbGl0eShpbnB1dF9kZXYsIEVWX0tFWSwgQlROX1gpOwogCQkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9LRVksIEJUTl9ZKTsKIAkJCWlucHV0X3NldF9jYXBhYmlsaXR5KGlucHV0X2RldiwgRVZfS0VZLCBCVE5fWik7CkBAIC04MzgsMjIgKzg4MSwyMiBAQAogCX0KIAogCWlmIChwLT53YWtldXBfZmxhZ3MpIHsKLQkJZGV2LT53cml0ZShkZXYsIEZGX1dVX0NGR18xLCBwLT53YWtldXBfZmxhZ3MpOwotCQlkZXYtPndyaXRlKGRldiwgRkZfV1VfVEhTXzEsIHAtPndha2V1cF90aHJlc2ggJiAweDdmKTsKKwkJbGlzMy0+d3JpdGUobGlzMywgRkZfV1VfQ0ZHXzEsIHAtPndha2V1cF9mbGFncyk7CisJCWxpczMtPndyaXRlKGxpczMsIEZGX1dVX1RIU18xLCBwLT53YWtldXBfdGhyZXNoICYgMHg3Zik7CiAJCS8qIHBkYXRhIHZhbHVlICsgMSB0byBrZWVwIHRoaXMgYmFja3dhcmQgY29tcGF0aWJsZSovCi0JCWRldi0+d3JpdGUoZGV2LCBGRl9XVV9EVVJBVElPTl8xLCBwLT5kdXJhdGlvbjEgKyAxKTsKKwkJbGlzMy0+d3JpdGUobGlzMywgRkZfV1VfRFVSQVRJT05fMSwgcC0+ZHVyYXRpb24xICsgMSk7CiAJCWN0cmwyIF49IEhQX0ZGX1dVMTsgLyogWG9yIHRvIGtlZXAgY29tcGF0aWJsZSB3aXRoIG9sZCBwZGF0YSovCiAJfQogCiAJaWYgKHAtPndha2V1cF9mbGFnczIpIHsKLQkJZGV2LT53cml0ZShkZXYsIEZGX1dVX0NGR18yLCBwLT53YWtldXBfZmxhZ3MyKTsKLQkJZGV2LT53cml0ZShkZXYsIEZGX1dVX1RIU18yLCBwLT53YWtldXBfdGhyZXNoMiAmIDB4N2YpOworCQlsaXMzLT53cml0ZShsaXMzLCBGRl9XVV9DRkdfMiwgcC0+d2FrZXVwX2ZsYWdzMik7CisJCWxpczMtPndyaXRlKGxpczMsIEZGX1dVX1RIU18yLCBwLT53YWtldXBfdGhyZXNoMiAmIDB4N2YpOwogCQkvKiBwZGF0YSB2YWx1ZSArIDEgdG8ga2VlcCB0aGlzIGJhY2t3YXJkIGNvbXBhdGlibGUqLwotCQlkZXYtPndyaXRlKGRldiwgRkZfV1VfRFVSQVRJT05fMiwgcC0+ZHVyYXRpb24yICsgMSk7CisJCWxpczMtPndyaXRlKGxpczMsIEZGX1dVX0RVUkFUSU9OXzIsIHAtPmR1cmF0aW9uMiArIDEpOwogCQljdHJsMiBePSBIUF9GRl9XVTI7IC8qIFhvciB0byBrZWVwIGNvbXBhdGlibGUgd2l0aCBvbGQgcGRhdGEqLwogCX0KIAkvKiBDb25maWd1cmUgaGlwYXNzIGZpbHRlcnMgKi8KLQlkZXYtPndyaXRlKGRldiwgQ1RSTF9SRUcyLCBjdHJsMik7CisJbGlzMy0+d3JpdGUobGlzMywgQ1RSTF9SRUcyLCBjdHJsMik7CiAKIAlpZiAocC0+aXJxMikgewogCQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwLT5pcnEyLApAQCAtODYxLDcgKzkwNCw3IEBACiAJCQkJCWxpczMwMmRsX2ludGVycnVwdF90aHJlYWQyXzhiLAogCQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9PTkVTSE9UIHwKIAkJCQkJKHAtPmlycV9mbGFnczIgJiBJUlFGX1RSSUdHRVJfTUFTSyksCi0JCQkJCURSSVZFUl9OQU1FLCAmbGlzM19kZXYpOworCQkJCQlEUklWRVJfTkFNRSwgbGlzMyk7CiAJCWlmIChlcnIgPCAwKQogCQkJcHJfZXJyKCJObyBzZWNvbmQgSVJRLiBMaW1pdGVkIGZ1bmN0aW9uYWxpdHlcbiIpOwogCX0KQEAgLTg3MSw5MyArOTE0LDk3IEBACiAgKiBJbml0aWFsaXNlIHRoZSBhY2NlbGVyb21ldGVyIGFuZCB0aGUgdmFyaW91cyBzdWJzeXN0ZW1zLgogICogU2hvdWxkIGJlIHJhdGhlciBpbmRlcGVuZGVudCBvZiB0aGUgYnVzIHN5c3RlbS4KICAqLwotaW50IGxpczNsdjAyZF9pbml0X2RldmljZShzdHJ1Y3QgbGlzM2x2MDJkICpkZXYpCitpbnQgbGlzM2x2MDJkX2luaXRfZGV2aWNlKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMpCiB7CiAJaW50IGVycjsKIAlpcnFfaGFuZGxlcl90IHRocmVhZF9mbjsKIAlpbnQgaXJxX2ZsYWdzID0gMDsKIAotCWRldi0+d2hvYW1pID0gbGlzM2x2MDJkX3JlYWRfOChkZXYsIFdIT19BTV9JKTsKKwlsaXMzLT53aG9hbWkgPSBsaXMzbHYwMmRfcmVhZF84KGxpczMsIFdIT19BTV9JKTsKIAotCXN3aXRjaCAoZGV2LT53aG9hbWkpIHsKKwlzd2l0Y2ggKGxpczMtPndob2FtaSkgewogCWNhc2UgV0FJXzEyQjoKIAkJcHJfaW5mbygiMTIgYml0cyBzZW5zb3IgZm91bmRcbiIpOwotCQlkZXYtPnJlYWRfZGF0YSA9IGxpczNsdjAyZF9yZWFkXzEyOwotCQlkZXYtPm1kcHNfbWF4X3ZhbCA9IDIwNDg7Ci0JCWRldi0+cHdyb25fZGVsYXkgPSBMSVMzX1BXUk9OX0RFTEFZX1dBSV8xMkI7Ci0JCWRldi0+b2RycyA9IGxpczNfMTJfcmF0ZXM7Ci0JCWRldi0+b2RyX21hc2sgPSBDVFJMMV9ERjAgfCBDVFJMMV9ERjE7Ci0JCWRldi0+c2NhbGUgPSBMSVMzX1NFTlNJVElWSVRZXzEyQjsKLQkJZGV2LT5yZWdzID0gbGlzM193YWkxMl9yZWdzOwotCQlkZXYtPnJlZ3Nfc2l6ZSA9IEFSUkFZX1NJWkUobGlzM193YWkxMl9yZWdzKTsKKwkJbGlzMy0+cmVhZF9kYXRhID0gbGlzM2x2MDJkX3JlYWRfMTI7CisJCWxpczMtPm1kcHNfbWF4X3ZhbCA9IDIwNDg7CisJCWxpczMtPnB3cm9uX2RlbGF5ID0gTElTM19QV1JPTl9ERUxBWV9XQUlfMTJCOworCQlsaXMzLT5vZHJzID0gbGlzM18xMl9yYXRlczsKKwkJbGlzMy0+b2RyX21hc2sgPSBDVFJMMV9ERjAgfCBDVFJMMV9ERjE7CisJCWxpczMtPnNjYWxlID0gTElTM19TRU5TSVRJVklUWV8xMkI7CisJCWxpczMtPnJlZ3MgPSBsaXMzX3dhaTEyX3JlZ3M7CisJCWxpczMtPnJlZ3Nfc2l6ZSA9IEFSUkFZX1NJWkUobGlzM193YWkxMl9yZWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBXQUlfOEI6CiAJCXByX2luZm8oIjggYml0cyBzZW5zb3IgZm91bmRcbiIpOwotCQlkZXYtPnJlYWRfZGF0YSA9IGxpczNsdjAyZF9yZWFkXzg7Ci0JCWRldi0+bWRwc19tYXhfdmFsID0gMTI4OwotCQlkZXYtPnB3cm9uX2RlbGF5ID0gTElTM19QV1JPTl9ERUxBWV9XQUlfOEI7Ci0JCWRldi0+b2RycyA9IGxpczNfOF9yYXRlczsKLQkJZGV2LT5vZHJfbWFzayA9IENUUkwxX0RSOwotCQlkZXYtPnNjYWxlID0gTElTM19TRU5TSVRJVklUWV84QjsKLQkJZGV2LT5yZWdzID0gbGlzM193YWk4X3JlZ3M7Ci0JCWRldi0+cmVnc19zaXplID0gQVJSQVlfU0laRShsaXMzX3dhaThfcmVncyk7CisJCWxpczMtPnJlYWRfZGF0YSA9IGxpczNsdjAyZF9yZWFkXzg7CisJCWxpczMtPm1kcHNfbWF4X3ZhbCA9IDEyODsKKwkJbGlzMy0+cHdyb25fZGVsYXkgPSBMSVMzX1BXUk9OX0RFTEFZX1dBSV84QjsKKwkJbGlzMy0+b2RycyA9IGxpczNfOF9yYXRlczsKKwkJbGlzMy0+b2RyX21hc2sgPSBDVFJMMV9EUjsKKwkJbGlzMy0+c2NhbGUgPSBMSVMzX1NFTlNJVElWSVRZXzhCOworCQlsaXMzLT5yZWdzID0gbGlzM193YWk4X3JlZ3M7CisJCWxpczMtPnJlZ3Nfc2l6ZSA9IEFSUkFZX1NJWkUobGlzM193YWk4X3JlZ3MpOwogCQlicmVhazsKIAljYXNlIFdBSV8zREM6CiAJCXByX2luZm8oIjggYml0cyAzREMgc2Vuc29yIGZvdW5kXG4iKTsKLQkJZGV2LT5yZWFkX2RhdGEgPSBsaXMzbHYwMmRfcmVhZF84OwotCQlkZXYtPm1kcHNfbWF4X3ZhbCA9IDEyODsKLQkJZGV2LT5wd3Jvbl9kZWxheSA9IExJUzNfUFdST05fREVMQVlfV0FJXzhCOwotCQlkZXYtPm9kcnMgPSBsaXMzXzNkY19yYXRlczsKLQkJZGV2LT5vZHJfbWFzayA9IENUUkwxX09EUjB8Q1RSTDFfT0RSMXxDVFJMMV9PRFIyfENUUkwxX09EUjM7Ci0JCWRldi0+c2NhbGUgPSBMSVMzX1NFTlNJVElWSVRZXzhCOworCQlsaXMzLT5yZWFkX2RhdGEgPSBsaXMzbHYwMmRfcmVhZF84OworCQlsaXMzLT5tZHBzX21heF92YWwgPSAxMjg7CisJCWxpczMtPnB3cm9uX2RlbGF5ID0gTElTM19QV1JPTl9ERUxBWV9XQUlfOEI7CisJCWxpczMtPm9kcnMgPSBsaXMzXzNkY19yYXRlczsKKwkJbGlzMy0+b2RyX21hc2sgPSBDVFJMMV9PRFIwfENUUkwxX09EUjF8Q1RSTDFfT0RSMnxDVFJMMV9PRFIzOworCQlsaXMzLT5zY2FsZSA9IExJUzNfU0VOU0lUSVZJVFlfOEI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2VycigidW5rbm93biBzZW5zb3IgdHlwZSAweCVYXG4iLCBkZXYtPndob2FtaSk7CisJCXByX2VycigidW5rbm93biBzZW5zb3IgdHlwZSAweCVYXG4iLCBsaXMzLT53aG9hbWkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkZXYtPnJlZ19jYWNoZSA9IGt6YWxsb2MobWF4KHNpemVvZihsaXMzX3dhaThfcmVncyksCisJbGlzMy0+cmVnX2NhY2hlID0ga3phbGxvYyhtYXgoc2l6ZW9mKGxpczNfd2FpOF9yZWdzKSwKIAkJCQkgICAgIHNpemVvZihsaXMzX3dhaTEyX3JlZ3MpKSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAoZGV2LT5yZWdfY2FjaGUgPT0gTlVMTCkgeworCWlmIChsaXMzLT5yZWdfY2FjaGUgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKLQlhdG9taWNfc2V0KCZkZXYtPndha2VfdGhyZWFkLCAwKTsKKwltdXRleF9pbml0KCZsaXMzLT5tdXRleCk7CisJYXRvbWljX3NldCgmbGlzMy0+d2FrZV90aHJlYWQsIDApOwogCi0JbGlzM2x2MDJkX2FkZF9mcyhkZXYpOwotCWxpczNsdjAyZF9wb3dlcm9uKGRldik7Ci0KLQlpZiAoZGV2LT5wbV9kZXYpIHsKLQkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldi0+cG1fZGV2KTsKLQkJcG1fcnVudGltZV9lbmFibGUoZGV2LT5wbV9kZXYpOworCWxpczNsdjAyZF9hZGRfZnMobGlzMyk7CisJZXJyID0gbGlzM2x2MDJkX3Bvd2Vyb24obGlzMyk7CisJaWYgKGVycikgeworCQlsaXMzbHYwMmRfcmVtb3ZlX2ZzKGxpczMpOworCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmIChsaXMzbHYwMmRfam95c3RpY2tfZW5hYmxlKCkpCisJaWYgKGxpczMtPnBtX2RldikgeworCQlwbV9ydW50aW1lX3NldF9hY3RpdmUobGlzMy0+cG1fZGV2KTsKKwkJcG1fcnVudGltZV9lbmFibGUobGlzMy0+cG1fZGV2KTsKKwl9CisKKwlpZiAobGlzM2x2MDJkX2pveXN0aWNrX2VuYWJsZShsaXMzKSkKIAkJcHJfZXJyKCJqb3lzdGljayBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCiAJLyogcGFzc2luZyBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBkYXRhIGlzIHB1cmVseSBvcHRpb25hbCBhbmQgb25seQogCSAqIHVzZWQgYnkgdGhlIFNQSSB0cmFuc3BvcnQgbGF5ZXIgYXQgdGhlIG1vbWVudCAqLwotCWlmIChkZXYtPnBkYXRhKSB7Ci0JCXN0cnVjdCBsaXMzbHYwMmRfcGxhdGZvcm1fZGF0YSAqcCA9IGRldi0+cGRhdGE7CisJaWYgKGxpczMtPnBkYXRhKSB7CisJCXN0cnVjdCBsaXMzbHYwMmRfcGxhdGZvcm1fZGF0YSAqcCA9IGxpczMtPnBkYXRhOwogCi0JCWlmIChkZXYtPndob2FtaSA9PSBXQUlfOEIpCi0JCQlsaXMzbHYwMmRfOGJfY29uZmlndXJlKGRldiwgcCk7CisJCWlmIChsaXMzLT53aG9hbWkgPT0gV0FJXzhCKQorCQkJbGlzM2x2MDJkXzhiX2NvbmZpZ3VyZShsaXMzLCBwKTsKIAogCQlpcnFfZmxhZ3MgPSBwLT5pcnFfZmxhZ3MxICYgSVJRRl9UUklHR0VSX01BU0s7CiAKLQkJZGV2LT5pcnFfY2ZnID0gcC0+aXJxX2NmZzsKKwkJbGlzMy0+aXJxX2NmZyA9IHAtPmlycV9jZmc7CiAJCWlmIChwLT5pcnFfY2ZnKQotCQkJZGV2LT53cml0ZShkZXYsIENUUkxfUkVHMywgcC0+aXJxX2NmZyk7CisJCQlsaXMzLT53cml0ZShsaXMzLCBDVFJMX1JFRzMsIHAtPmlycV9jZmcpOwogCiAJCWlmIChwLT5kZWZhdWx0X3JhdGUpCi0JCQlsaXMzbHYwMmRfc2V0X29kcihwLT5kZWZhdWx0X3JhdGUpOworCQkJbGlzM2x2MDJkX3NldF9vZHIobGlzMywgcC0+ZGVmYXVsdF9yYXRlKTsKIAl9CiAKIAkvKiBiYWlsIGlmIHdlIGRpZCBub3QgZ2V0IGFuIElSUSBmcm9tIHRoZSBidXMgbGF5ZXIgKi8KLQlpZiAoIWRldi0+aXJxKSB7CisJaWYgKCFsaXMzLT5pcnEpIHsKIAkJcHJfZGVidWcoIk5vIElSUS4gRGlzYWJsaW5nIC9kZXYvZnJlZWZhbGxcbiIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC05NzMsMjMgKzEwMjAsMjcgQEAKIAkgKiBpby1hcGljIGlzIG5vdCBjb25maWd1cmFibGUgKGFuZCBnZW5lcmF0ZXMgYSB3YXJuaW5nKSBidXQgSSBrZWVwIGl0CiAJICogaW4gY2FzZSBvZiBzdXBwb3J0IGZvciBvdGhlciBoYXJkd2FyZS4KIAkgKi8KLQlpZiAoZGV2LT5wZGF0YSAmJiBkZXYtPndob2FtaSA9PSBXQUlfOEIpCisJaWYgKGxpczMtPnBkYXRhICYmIGxpczMtPndob2FtaSA9PSBXQUlfOEIpCiAJCXRocmVhZF9mbiA9IGxpczMwMmRsX2ludGVycnVwdF90aHJlYWQxXzhiOwogCWVsc2UKIAkJdGhyZWFkX2ZuID0gTlVMTDsKIAotCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+aXJxLCBsaXMzMDJkbF9pbnRlcnJ1cHQsCisJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEobGlzMy0+aXJxLCBsaXMzMDJkbF9pbnRlcnJ1cHQsCiAJCQkJdGhyZWFkX2ZuLAogCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX09ORVNIT1QgfAogCQkJCWlycV9mbGFncywKLQkJCQlEUklWRVJfTkFNRSwgJmxpczNfZGV2KTsKKwkJCQlEUklWRVJfTkFNRSwgbGlzMyk7CiAKIAlpZiAoZXJyIDwgMCkgewogCQlwcl9lcnIoIkNhbm5vdCBnZXQgSVJRXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKG1pc2NfcmVnaXN0ZXIoJmxpczNsdjAyZF9taXNjX2RldmljZSkpCisJbGlzMy0+bWlzY2Rldi5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUjsKKwlsaXMzLT5taXNjZGV2Lm5hbWUJPSAiZnJlZWZhbGwiOworCWxpczMtPm1pc2NkZXYuZm9wcwk9ICZsaXMzbHYwMmRfbWlzY19mb3BzOworCisJaWYgKG1pc2NfcmVnaXN0ZXIoJmxpczMtPm1pc2NkZXYpKQogCQlwcl9lcnIoIm1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKIG91dDoKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkLmggYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5oCmluZGV4IGExOTM5NTguLjJiMTQ4MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkLmgKKysrIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmQuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0LXBvbGxkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAKIC8qCiAgKiBUaGlzIGRyaXZlciB0cmllcyB0byBzdXBwb3J0IHRoZSAiZGlnaXRhbCIgYWNjZWxlcm9tZXRlciBjaGlwcyBmcm9tCkBAIC0yNzMsNiArMjc0LDggQEAKIAlzdHJ1Y3QgZmFzeW5jX3N0cnVjdAkqYXN5bmNfcXVldWU7IC8qIHF1ZXVlIGZvciB0aGUgbWlzYyBkZXZpY2UgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdAltaXNjX3dhaXQ7IC8qIFdhaXQgcXVldWUgZm9yIHRoZSBtaXNjIGRldmljZSAqLwogCXVuc2lnbmVkIGxvbmcJCW1pc2Nfb3BlbmVkOyAvKiBiaXQwOiB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgb3BlbiAqLworCXN0cnVjdCBtaXNjZGV2aWNlCW1pc2NkZXY7CisKIAlpbnQgICAgICAgICAgICAgICAgICAgICBkYXRhX3JlYWR5X2NvdW50WzJdOwogCWF0b21pY190CQl3YWtlX3RocmVhZDsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICBpcnFfY2ZnOwpAQCAtMjgyLDEwICsyODUsMTAgQEAKIH07CiAKIGludCBsaXMzbHYwMmRfaW5pdF9kZXZpY2Uoc3RydWN0IGxpczNsdjAyZCAqbGlzMyk7Ci1pbnQgbGlzM2x2MDJkX2pveXN0aWNrX2VuYWJsZSh2b2lkKTsKLXZvaWQgbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUodm9pZCk7CitpbnQgbGlzM2x2MDJkX2pveXN0aWNrX2VuYWJsZShzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKTsKK3ZvaWQgbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUoc3RydWN0IGxpczNsdjAyZCAqbGlzMyk7CiB2b2lkIGxpczNsdjAyZF9wb3dlcm9mZihzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKTsKLXZvaWQgbGlzM2x2MDJkX3Bvd2Vyb24oc3RydWN0IGxpczNsdjAyZCAqbGlzMyk7CitpbnQgbGlzM2x2MDJkX3Bvd2Vyb24oc3RydWN0IGxpczNsdjAyZCAqbGlzMyk7CiBpbnQgbGlzM2x2MDJkX3JlbW92ZV9mcyhzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKTsKIAogZXh0ZXJuIHN0cnVjdCBsaXMzbHYwMmQgbGlzM19kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9pMmMuYyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX2kyYy5jCmluZGV4IGIyMGRmYjQuLmMwMmZlYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX2kyYy5jCisrKyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX2kyYy5jCkBAIC03OSw4ICs3OSw3IEBACiAJdTggcmVnOwogCWludCByZXQ7CiAKLQlpZiAobGlzMy0+cmVnX2N0cmwpCi0JCWxpczNfcmVnX2N0cmwobGlzMywgTElTM19SRUdfT04pOworCWxpczNfcmVnX2N0cmwobGlzMywgTElTM19SRUdfT04pOwogCiAJbGlzMy0+cmVhZChsaXMzLCBXSE9fQU1fSSwgJnJlZyk7CiAJaWYgKHJlZyAhPSBsaXMzLT53aG9hbWkpCkBAIC0xMDYsMTAgKzEwNSw2IEBACiAJc3RydWN0IGxpczNsdjAyZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKIAlpZiAocGRhdGEpIHsKLQkJLyogUmVndWxhdG9yIGNvbnRyb2wgaXMgb3B0aW9uYWwgKi8KLQkJaWYgKHBkYXRhLT5kcml2ZXJfZmVhdHVyZXMgJiBMSVMzX1VTRV9SRUdVTEFUT1JfQ1RSTCkKLQkJCWxpczNfZGV2LnJlZ19jdHJsID0gbGlzM19yZWdfY3RybDsKLQogCQlpZiAoKHBkYXRhLT5kcml2ZXJfZmVhdHVyZXMgJiBMSVMzX1VTRV9CTE9DS19SRUFEKSAmJgogCQkJKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKIAkJCQkJCUkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSykpKQpAQCAtMTMxLDE1ICsxMjYsMTMgQEAKIAkJCWdvdG8gZmFpbDsKIAl9CiAKLQlpZiAobGlzM19kZXYucmVnX2N0cmwpIHsKLQkJbGlzM19kZXYucmVndWxhdG9yc1swXS5zdXBwbHkgPSByZWdfdmRkOwotCQlsaXMzX2Rldi5yZWd1bGF0b3JzWzFdLnN1cHBseSA9IHJlZ192ZGRfaW87Ci0JCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldCgmY2xpZW50LT5kZXYsCi0JCQkJCUFSUkFZX1NJWkUobGlzM19kZXYucmVndWxhdG9ycyksCi0JCQkJCWxpczNfZGV2LnJlZ3VsYXRvcnMpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZmFpbDsKLQl9CisJbGlzM19kZXYucmVndWxhdG9yc1swXS5zdXBwbHkgPSByZWdfdmRkOworCWxpczNfZGV2LnJlZ3VsYXRvcnNbMV0uc3VwcGx5ID0gcmVnX3ZkZF9pbzsKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoJmNsaWVudC0+ZGV2LAorCQkJCSBBUlJBWV9TSVpFKGxpczNfZGV2LnJlZ3VsYXRvcnMpLAorCQkJCSBsaXMzX2Rldi5yZWd1bGF0b3JzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOwogCiAJbGlzM19kZXYucGRhdGEJICA9IHBkYXRhOwogCWxpczNfZGV2LmJ1c19wcml2ID0gY2xpZW50OwpAQCAtMTUzLDE2ICsxNDYsMTkgQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCAmbGlzM19kZXYpOwogCiAJLyogUHJvdmlkZSBwb3dlciBvdmVyIHRoZSBpbml0IGNhbGwgKi8KLQlpZiAobGlzM19kZXYucmVnX2N0cmwpCi0JCWxpczNfcmVnX2N0cmwoJmxpczNfZGV2LCBMSVMzX1JFR19PTik7CisJbGlzM19yZWdfY3RybCgmbGlzM19kZXYsIExJUzNfUkVHX09OKTsKIAogCXJldCA9IGxpczNsdjAyZF9pbml0X2RldmljZSgmbGlzM19kZXYpOwogCi0JaWYgKGxpczNfZGV2LnJlZ19jdHJsKQotCQlsaXMzX3JlZ19jdHJsKCZsaXMzX2RldiwgTElTM19SRUdfT0ZGKTsKKwlsaXMzX3JlZ19jdHJsKCZsaXMzX2RldiwgTElTM19SRUdfT0ZGKTsKIAotCWlmIChyZXQgPT0gMCkKLQkJcmV0dXJuIDA7CisJaWYgKHJldCkKKwkJZ290byBmYWlsMjsKKwlyZXR1cm4gMDsKKworZmFpbDI6CisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKGxpczNfZGV2LnJlZ3VsYXRvcnMpLAorCQkJCWxpczNfZGV2LnJlZ3VsYXRvcnMpOwogZmFpbDoKIAlpZiAocGRhdGEgJiYgcGRhdGEtPnJlbGVhc2VfcmVzb3VyY2VzKQogCQlwZGF0YS0+cmVsZWFzZV9yZXNvdXJjZXMoKTsKQEAgLTE3NywxMiArMTczLDExIEBACiAJaWYgKHBkYXRhICYmIHBkYXRhLT5yZWxlYXNlX3Jlc291cmNlcykKIAkJcGRhdGEtPnJlbGVhc2VfcmVzb3VyY2VzKCk7CiAKLQlsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZSgpOworCWxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKGxpczMpOwogCWxpczNsdjAyZF9yZW1vdmVfZnMoJmxpczNfZGV2KTsKIAotCWlmIChsaXMzX2Rldi5yZWdfY3RybCkKLQkJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKGxpczMtPnJlZ3VsYXRvcnMpLAotCQkJCWxpczNfZGV2LnJlZ3VsYXRvcnMpOworCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShsaXMzLT5yZWd1bGF0b3JzKSwKKwkJCSAgICBsaXMzX2Rldi5yZWd1bGF0b3JzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfc3BpLmMgYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9zcGkuYwppbmRleCBjMWY4YThmLi5iMmMxYmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9zcGkuYworKysgYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9zcGkuYwpAQCAtODMsNyArODMsNyBAQAogc3RhdGljIGludCBfX2RldmV4aXQgbGlzMzAyZGxfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBsaXMzbHYwMmQgKmxpczMgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQlsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZSgpOworCWxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKGxpczMpOwogCWxpczNsdjAyZF9wb3dlcm9mZihsaXMzKTsKIAogCXJldHVybiBsaXMzbHYwMmRfcmVtb3ZlX2ZzKCZsaXMzX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVrc2VydmljZXMuYyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWtzZXJ2aWNlcy5jCmluZGV4IDllOWJkZGFhOS4uOTEzZGUwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1a3NlcnZpY2VzLmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1a3NlcnZpY2VzLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgogI2luY2x1ZGUgImdydS5oIgogI2luY2x1ZGUgImdydWxpYi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RpLXN0L3N0X2tpbS5jIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2tpbS5jCmluZGV4IDNhMzU4MDUuLjQzZWY4ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9raW0uYworKysgYi9kcml2ZXJzL21pc2MvdGktc3Qvc3Rfa2ltLmMKQEAgLTM1LDYgKzM1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpX3dpbGlua19zdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAKICNkZWZpbmUgTUFYX1NUX0RFVklDRVMJMwkvKiBJbWFnaW5lIDEgb24gZWFjaCBVQVJUIGZvciBub3cgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYyBiL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYwppbmRleCBhNmVmMTgyLi5iYTI0NzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMKKysrIGIvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90aWZtLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAidGlmbV83eHgxIgogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC44IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RpZm1fY29yZS5jIGIvZHJpdmVycy9taXNjL3RpZm1fY29yZS5jCmluZGV4IDQ0ZDQ0NzUuLjBiZDUzNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYworKysgYi9kcml2ZXJzL21pc2MvdGlmbV9jb3JlLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJ0aWZtX2NvcmUiCiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvdm13X2JhbGxvb24uYyBiL2RyaXZlcnMvbWlzYy92bXdfYmFsbG9vbi5jCmluZGV4IDA1M2QzNmMuLmNkNDFkNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy92bXdfYmFsbG9vbi5jCisrKyBiL2RyaXZlcnMvbWlzYy92bXdfYmFsbG9vbi5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIHN0cnVjdCB2bWJhbGxvb25fc3RhdHMgewogCXVuc2lnbmVkIGludCB0aW1lcjsKIAotCS8qIGFsbG9jYXRpb24gc3RhdHVzdGljcyAqLworCS8qIGFsbG9jYXRpb24gc3RhdGlzdGljcyAqLwogCXVuc2lnbmVkIGludCBhbGxvYzsKIAl1bnNpZ25lZCBpbnQgYWxsb2NfZmFpbDsKIAl1bnNpZ25lZCBpbnQgc2xlZXBfYWxsb2M7CkBAIC00MTIsNiArNDEyLDcgQEAKIAlnZnBfdCBmbGFnczsKIAl1bnNpZ25lZCBpbnQgaHZfc3RhdHVzOwogCWJvb2wgbG9ja2VkID0gZmFsc2U7CisJZmxhZ3MgPSBjYW5fc2xlZXAgPyBWTVdfUEFHRV9BTExPQ19DQU5TTEVFUCA6IFZNV19QQUdFX0FMTE9DX05PU0xFRVA7CiAKIAlkbyB7CiAJCWlmICghY2FuX3NsZWVwKQpAQCAtNDE5LDcgKzQyMCw2IEBACiAJCWVsc2UKIAkJCVNUQVRTX0lOQyhiLT5zdGF0cy5zbGVlcF9hbGxvYyk7CiAKLQkJZmxhZ3MgPSBjYW5fc2xlZXAgPyBWTVdfUEFHRV9BTExPQ19DQU5TTEVFUCA6IFZNV19QQUdFX0FMTE9DX05PU0xFRVA7CiAJCXBhZ2UgPSBhbGxvY19wYWdlKGZsYWdzKTsKIAkJaWYgKCFwYWdlKSB7CiAJCQlpZiAoIWNhbl9zbGVlcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwppbmRleCA0YzFhNjQ4Li5hMWNiMjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCkBAIC05NCw2ICs5NCwxMSBAQAogCXVuc2lnbmVkIGludAlyZWFkX29ubHk7CiAJdW5zaWduZWQgaW50CXBhcnRfdHlwZTsKIAl1bnNpZ25lZCBpbnQJbmFtZV9pZHg7CisJdW5zaWduZWQgaW50CXJlc2V0X2RvbmU7CisjZGVmaW5lIE1NQ19CTEtfUkVBRAkJQklUKDApCisjZGVmaW5lIE1NQ19CTEtfV1JJVEUJCUJJVCgxKQorI2RlZmluZSBNTUNfQkxLX0RJU0NBUkQJCUJJVCgyKQorI2RlZmluZSBNTUNfQkxLX1NFQ0RJU0NBUkQJQklUKDMpCiAKIAkvKgogCSAqIE9ubHkgc2V0IGluIG1haW4gbW1jX2Jsa19kYXRhIGFzc29jaWF0ZWQKQEAgLTEwOSwxMSArMTE0LDExIEBACiBlbnVtIG1tY19ibGtfc3RhdHVzIHsKIAlNTUNfQkxLX1NVQ0NFU1MgPSAwLAogCU1NQ19CTEtfUEFSVElBTCwKLQlNTUNfQkxLX1JFVFJZLAotCU1NQ19CTEtfUkVUUllfU0lOR0xFLAotCU1NQ19CTEtfREFUQV9FUlIsCiAJTU1DX0JMS19DTURfRVJSLAorCU1NQ19CTEtfUkVUUlksCiAJTU1DX0JMS19BQk9SVCwKKwlNTUNfQkxLX0RBVEFfRVJSLAorCU1NQ19CTEtfRUNDX0VSUiwKIH07CiAKIG1vZHVsZV9wYXJhbShwZXJkZXZfbWlub3JzLCBpbnQsIDA0NDQpOwpAQCAtMjkxLDcgKzI5Niw3IEBACiAJc3RydWN0IG1tY19jYXJkICpjYXJkOwogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CiAJc3RydWN0IG1tY19kYXRhIGRhdGEgPSB7MH07Ci0Jc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHswfTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0ge05VTEx9OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKIAlpbnQgZXJyOwogCkBAIC00NDIsMTkgKzQ0NywyNCBAQAogewogCWludCByZXQ7CiAJc3RydWN0IG1tY19ibGtfZGF0YSAqbWFpbl9tZCA9IG1tY19nZXRfZHJ2ZGF0YShjYXJkKTsKKwogCWlmIChtYWluX21kLT5wYXJ0X2N1cnIgPT0gbWQtPnBhcnRfdHlwZSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAobW1jX2NhcmRfbW1jKGNhcmQpKSB7Ci0JCWNhcmQtPmV4dF9jc2QucGFydF9jb25maWcgJj0gfkVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX01BU0s7Ci0JCWNhcmQtPmV4dF9jc2QucGFydF9jb25maWcgfD0gbWQtPnBhcnRfdHlwZTsKKwkJdTggcGFydF9jb25maWcgPSBjYXJkLT5leHRfY3NkLnBhcnRfY29uZmlnOworCisJCXBhcnRfY29uZmlnICY9IH5FWFRfQ1NEX1BBUlRfQ09ORklHX0FDQ19NQVNLOworCQlwYXJ0X2NvbmZpZyB8PSBtZC0+cGFydF90eXBlOwogCiAJCXJldCA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKLQkJCQkgRVhUX0NTRF9QQVJUX0NPTkZJRywgY2FyZC0+ZXh0X2NzZC5wYXJ0X2NvbmZpZywKKwkJCQkgRVhUX0NTRF9QQVJUX0NPTkZJRywgcGFydF9jb25maWcsCiAJCQkJIGNhcmQtPmV4dF9jc2QucGFydF90aW1lKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7Ci19CisKKwkJY2FyZC0+ZXh0X2NzZC5wYXJ0X2NvbmZpZyA9IHBhcnRfY29uZmlnOworCX0KIAogCW1haW5fbWQtPnBhcnRfY3VyciA9IG1kLT5wYXJ0X3R5cGU7CiAJcmV0dXJuIDA7CkBAIC00NjYsNyArNDc2LDcgQEAKIAl1MzIgcmVzdWx0OwogCV9fYmUzMiAqYmxvY2tzOwogCi0Jc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHswfTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0ge05VTEx9OwogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CiAJc3RydWN0IG1tY19kYXRhIGRhdGEgPSB7MH07CiAJdW5zaWduZWQgaW50IHRpbWVvdXRfdXM7CkBAIC02MTYsNyArNjI2LDcgQEAKICAqIE90aGVyd2lzZSB3ZSBkb24ndCB1bmRlcnN0YW5kIHdoYXQgaGFwcGVuZWQsIHNvIGFib3J0LgogICovCiBzdGF0aWMgaW50IG1tY19ibGtfY21kX3JlY292ZXJ5KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgc3RydWN0IHJlcXVlc3QgKnJlcSwKLQlzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0ICpicnEpCisJc3RydWN0IG1tY19ibGtfcmVxdWVzdCAqYnJxLCBpbnQgKmVjY19lcnIpCiB7CiAJYm9vbCBwcmV2X2NtZF9zdGF0dXNfdmFsaWQgPSB0cnVlOwogCXUzMiBzdGF0dXMsIHN0b3Bfc3RhdHVzID0gMDsKQEAgLTY0MSw2ICs2NTEsMTIgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gRVJSX0FCT1JUOwogCisJLyogRmxhZyBFQ0MgZXJyb3JzICovCisJaWYgKChzdGF0dXMgJiBSMV9DQVJEX0VDQ19GQUlMRUQpIHx8CisJICAgIChicnEtPnN0b3AucmVzcFswXSAmIFIxX0NBUkRfRUNDX0ZBSUxFRCkgfHwKKwkgICAgKGJycS0+Y21kLnJlc3BbMF0gJiBSMV9DQVJEX0VDQ19GQUlMRUQpKQorCQkqZWNjX2VyciA9IDE7CisKIAkvKgogCSAqIENoZWNrIHRoZSBjdXJyZW50IGNhcmQgc3RhdGUuICBJZiBpdCBpcyBpbiBzb21lIGRhdGEgdHJhbnNmZXIKIAkgKiBtb2RlLCB0ZWxsIGl0IHRvIHN0b3AgKGFuZCBob3BlZnVsbHkgdHJhbnNpdGlvbiBiYWNrIHRvIFRSQU4uKQpAQCAtNjU4LDYgKzY3NCw4IEBACiAJCSAqLwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIEVSUl9BQk9SVDsKKwkJaWYgKHN0b3Bfc3RhdHVzICYgUjFfQ0FSRF9FQ0NfRkFJTEVEKQorCQkJKmVjY19lcnIgPSAxOwogCX0KIAogCS8qIENoZWNrIGZvciBzZXQgYmxvY2sgY291bnQgZXJyb3JzICovCkBAIC02NzAsNiArNjg4LDEwIEBACiAJCXJldHVybiBtbWNfYmxrX2NtZF9lcnJvcihyZXEsICJyL3cgY21kIiwgYnJxLT5jbWQuZXJyb3IsCiAJCQkJcHJldl9jbWRfc3RhdHVzX3ZhbGlkLCBzdGF0dXMpOwogCisJLyogRGF0YSBlcnJvcnMgKi8KKwlpZiAoIWJycS0+c3RvcC5lcnJvcikKKwkJcmV0dXJuIEVSUl9DT05USU5VRTsKKwogCS8qIE5vdyBmb3Igc3RvcCBlcnJvcnMuICBUaGVzZSBhcmVuJ3QgZmF0YWwgdG8gdGhlIHRyYW5zZmVyLiAqLwogCXByX2VycigiJXM6IGVycm9yICVkIHNlbmRpbmcgc3RvcCBjb21tYW5kLCBvcmlnaW5hbCBjbWQgcmVzcG9uc2UgJSN4LCBjYXJkIHN0YXR1cyAlI3hcbiIsCiAJICAgICAgIHJlcS0+cnFfZGlzay0+ZGlza19uYW1lLCBicnEtPnN0b3AuZXJyb3IsCkBAIC02ODYsMTIgKzcwOCw0NSBAQAogCXJldHVybiBFUlJfQ09OVElOVUU7CiB9CiAKK3N0YXRpYyBpbnQgbW1jX2Jsa19yZXNldChzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCwgc3RydWN0IG1tY19ob3N0ICpob3N0LAorCQkJIGludCB0eXBlKQoreworCWludCBlcnI7CisKKwlpZiAobWQtPnJlc2V0X2RvbmUgJiB0eXBlKQorCQlyZXR1cm4gLUVFWElTVDsKKworCW1kLT5yZXNldF9kb25lIHw9IHR5cGU7CisJZXJyID0gbW1jX2h3X3Jlc2V0KGhvc3QpOworCS8qIEVuc3VyZSB3ZSBzd2l0Y2ggYmFjayB0byB0aGUgY29ycmVjdCBwYXJ0aXRpb24gKi8KKwlpZiAoZXJyICE9IC1FT1BOT1RTVVBQKSB7CisJCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1haW5fbWQgPSBtbWNfZ2V0X2RydmRhdGEoaG9zdC0+Y2FyZCk7CisJCWludCBwYXJ0X2VycjsKKworCQltYWluX21kLT5wYXJ0X2N1cnIgPSBtYWluX21kLT5wYXJ0X3R5cGU7CisJCXBhcnRfZXJyID0gbW1jX2Jsa19wYXJ0X3N3aXRjaChob3N0LT5jYXJkLCBtZCk7CisJCWlmIChwYXJ0X2VycikgeworCQkJLyoKKwkJCSAqIFdlIGhhdmUgZmFpbGVkIHRvIGdldCBiYWNrIGludG8gdGhlIGNvcnJlY3QKKwkJCSAqIHBhcnRpdGlvbiwgc28gd2UgbmVlZCB0byBhYm9ydCB0aGUgd2hvbGUgcmVxdWVzdC4KKwkJCSAqLworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1tY19ibGtfcmVzZXRfc3VjY2VzcyhzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCwgaW50IHR5cGUpCit7CisJbWQtPnJlc2V0X2RvbmUgJj0gfnR5cGU7Cit9CisKIHN0YXRpYyBpbnQgbW1jX2Jsa19pc3N1ZV9kaXNjYXJkX3JxKHN0cnVjdCBtbWNfcXVldWUgKm1xLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kID0gbXEtPmRhdGE7CiAJc3RydWN0IG1tY19jYXJkICpjYXJkID0gbWQtPnF1ZXVlLmNhcmQ7CiAJdW5zaWduZWQgaW50IGZyb20sIG5yLCBhcmc7Ci0JaW50IGVyciA9IDA7CisJaW50IGVyciA9IDAsIHR5cGUgPSBNTUNfQkxLX0RJU0NBUkQ7CiAKIAlpZiAoIW1tY19jYW5fZXJhc2UoY2FyZCkpIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CkBAIC03MDEsMTEgKzc1NiwxMyBAQAogCWZyb20gPSBibGtfcnFfcG9zKHJlcSk7CiAJbnIgPSBibGtfcnFfc2VjdG9ycyhyZXEpOwogCi0JaWYgKG1tY19jYW5fdHJpbShjYXJkKSkKKwlpZiAobW1jX2Nhbl9kaXNjYXJkKGNhcmQpKQorCQlhcmcgPSBNTUNfRElTQ0FSRF9BUkc7CisJZWxzZSBpZiAobW1jX2Nhbl90cmltKGNhcmQpKQogCQlhcmcgPSBNTUNfVFJJTV9BUkc7CiAJZWxzZQogCQlhcmcgPSBNTUNfRVJBU0VfQVJHOwotCityZXRyeToKIAlpZiAoY2FyZC0+cXVpcmtzICYgTU1DX1FVSVJLX0lOQU5EX0NNRDM4KSB7CiAJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKIAkJCQkgSU5BTkRfQ01EMzhfQVJHX0VYVF9DU0QsCkBAIC03MTgsNiArNzc1LDEwIEBACiAJfQogCWVyciA9IG1tY19lcmFzZShjYXJkLCBmcm9tLCBuciwgYXJnKTsKIG91dDoKKwlpZiAoZXJyID09IC1FSU8gJiYgIW1tY19ibGtfcmVzZXQobWQsIGNhcmQtPmhvc3QsIHR5cGUpKQorCQlnb3RvIHJldHJ5OworCWlmICghZXJyKQorCQltbWNfYmxrX3Jlc2V0X3N1Y2Nlc3MobWQsIHR5cGUpOwogCXNwaW5fbG9ja19pcnEoJm1kLT5sb2NrKTsKIAlfX2Jsa19lbmRfcmVxdWVzdChyZXEsIGVyciwgYmxrX3JxX2J5dGVzKHJlcSkpOwogCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOwpAQCAtNzMxLDEzICs3OTIsMjAgQEAKIAlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCA9IG1xLT5kYXRhOwogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IG1kLT5xdWV1ZS5jYXJkOwogCXVuc2lnbmVkIGludCBmcm9tLCBuciwgYXJnOwotCWludCBlcnIgPSAwOworCWludCBlcnIgPSAwLCB0eXBlID0gTU1DX0JMS19TRUNESVNDQVJEOwogCi0JaWYgKCFtbWNfY2FuX3NlY3VyZV9lcmFzZV90cmltKGNhcmQpKSB7CisJaWYgKCEobW1jX2Nhbl9zZWN1cmVfZXJhc2VfdHJpbShjYXJkKSB8fCBtbWNfY2FuX3Nhbml0aXplKGNhcmQpKSkgewogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBvdXQ7CiAJfQogCisJLyogVGhlIHNhbml0aXplIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgYXQgdjQuNSBvbmx5ICovCisJaWYgKG1tY19jYW5fc2FuaXRpemUoY2FyZCkpIHsKKwkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAorCQkJCUVYVF9DU0RfU0FOSVRJWkVfU1RBUlQsIDEsIDApOworCQlnb3RvIG91dDsKKwl9CisKIAlmcm9tID0gYmxrX3JxX3BvcyhyZXEpOwogCW5yID0gYmxrX3JxX3NlY3RvcnMocmVxKTsKIApAQCAtNzQ1LDcgKzgxMyw3IEBACiAJCWFyZyA9IE1NQ19TRUNVUkVfVFJJTTFfQVJHOwogCWVsc2UKIAkJYXJnID0gTU1DX1NFQ1VSRV9FUkFTRV9BUkc7Ci0KK3JldHJ5OgogCWlmIChjYXJkLT5xdWlya3MgJiBNTUNfUVVJUktfSU5BTkRfQ01EMzgpIHsKIAkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAogCQkJCSBJTkFORF9DTUQzOF9BUkdfRVhUX0NTRCwKQEAgLTc2OSw2ICs4MzcsMTAgQEAKIAkJZXJyID0gbW1jX2VyYXNlKGNhcmQsIGZyb20sIG5yLCBNTUNfU0VDVVJFX1RSSU0yX0FSRyk7CiAJfQogb3V0OgorCWlmIChlcnIgPT0gLUVJTyAmJiAhbW1jX2Jsa19yZXNldChtZCwgY2FyZC0+aG9zdCwgdHlwZSkpCisJCWdvdG8gcmV0cnk7CisJaWYgKCFlcnIpCisJCW1tY19ibGtfcmVzZXRfc3VjY2VzcyhtZCwgdHlwZSk7CiAJc3Bpbl9sb2NrX2lycSgmbWQtPmxvY2spOwogCV9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyLCBibGtfcnFfYnl0ZXMocmVxKSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZtZC0+bG9jayk7CkBAIC03NzksMTYgKzg1MSwxOCBAQAogc3RhdGljIGludCBtbWNfYmxrX2lzc3VlX2ZsdXNoKHN0cnVjdCBtbWNfcXVldWUgKm1xLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kID0gbXEtPmRhdGE7CisJc3RydWN0IG1tY19jYXJkICpjYXJkID0gbWQtPnF1ZXVlLmNhcmQ7CisJaW50IHJldCA9IDA7CiAKLQkvKgotCSAqIE5vLW9wLCBvbmx5IHNlcnZpY2UgdGhpcyBiZWNhdXNlIHdlIG5lZWQgUkVRX0ZVQSBmb3IgcmVsaWFibGUKLQkgKiB3cml0ZXMuCi0JICovCisJcmV0ID0gbW1jX2ZsdXNoX2NhY2hlKGNhcmQpOworCWlmIChyZXQpCisJCXJldCA9IC1FSU87CisKIAlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7Ci0JX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgMCk7CisJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgcmV0KTsKIAlzcGluX3VubG9ja19pcnEoJm1kLT5sb2NrKTsKIAotCXJldHVybiAxOworCXJldHVybiByZXQgPyAwIDogMTsKIH0KIAogLyoKQEAgLTgyNSwxMSArODk5LDExIEBACiBzdGF0aWMgaW50IG1tY19ibGtfZXJyX2NoZWNrKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwKIAkJCSAgICAgc3RydWN0IG1tY19hc3luY19yZXEgKmFyZXEpCiB7Ci0JZW51bSBtbWNfYmxrX3N0YXR1cyByZXQgPSBNTUNfQkxLX1NVQ0NFU1M7CiAJc3RydWN0IG1tY19xdWV1ZV9yZXEgKm1xX21ycSA9IGNvbnRhaW5lcl9vZihhcmVxLCBzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSwKIAkJCQkJCSAgICBtbWNfYWN0aXZlKTsKIAlzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0ICpicnEgPSAmbXFfbXJxLT5icnE7CiAJc3RydWN0IHJlcXVlc3QgKnJlcSA9IG1xX21ycS0+cmVxOworCWludCBlY2NfZXJyID0gMDsKIAogCS8qCiAJICogc2JjLmVycm9yIGluZGljYXRlcyBhIHByb2JsZW0gd2l0aCB0aGUgc2V0IGJsb2NrIGNvdW50CkBAIC04NDEsOCArOTE1LDkgQEAKIAkgKiBzdG9wLmVycm9yIGluZGljYXRlcyBhIHByb2JsZW0gd2l0aCB0aGUgc3RvcCBjb21tYW5kLiAgRGF0YQogCSAqIG1heSBoYXZlIGJlZW4gdHJhbnNmZXJyZWQsIG9yIG1heSBzdGlsbCBiZSB0cmFuc2ZlcnJpbmcuCiAJICovCi0JaWYgKGJycS0+c2JjLmVycm9yIHx8IGJycS0+Y21kLmVycm9yIHx8IGJycS0+c3RvcC5lcnJvcikgewotCQlzd2l0Y2ggKG1tY19ibGtfY21kX3JlY292ZXJ5KGNhcmQsIHJlcSwgYnJxKSkgeworCWlmIChicnEtPnNiYy5lcnJvciB8fCBicnEtPmNtZC5lcnJvciB8fCBicnEtPnN0b3AuZXJyb3IgfHwKKwkgICAgYnJxLT5kYXRhLmVycm9yKSB7CisJCXN3aXRjaCAobW1jX2Jsa19jbWRfcmVjb3ZlcnkoY2FyZCwgcmVxLCBicnEsICZlY2NfZXJyKSkgewogCQljYXNlIEVSUl9SRVRSWToKIAkJCXJldHVybiBNTUNfQkxLX1JFVFJZOwogCQljYXNlIEVSUl9BQk9SVDoKQEAgLTg3Myw3ICs5NDgsNyBAQAogCQlkbyB7CiAJCQlpbnQgZXJyID0gZ2V0X2NhcmRfc3RhdHVzKGNhcmQsICZzdGF0dXMsIDUpOwogCQkJaWYgKGVycikgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlcXVlc3Rpbmcgc3RhdHVzXG4iLAorCQkJCXByX2VycigiJXM6IGVycm9yICVkIHJlcXVlc3Rpbmcgc3RhdHVzXG4iLAogCQkJCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgZXJyKTsKIAkJCQlyZXR1cm4gTU1DX0JMS19DTURfRVJSOwogCQkJfQpAQCAtODk0LDIzICs5NjksMjEgQEAKIAkJICAgICAgIGJycS0+Y21kLnJlc3BbMF0sIGJycS0+c3RvcC5yZXNwWzBdKTsKIAogCQlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7Ci0JCQlpZiAoYnJxLT5kYXRhLmJsb2NrcyA+IDEpIHsKLQkJCQkvKiBSZWRvIHJlYWQgb25lIHNlY3RvciBhdCBhIHRpbWUgKi8KLQkJCQlwcl93YXJuaW5nKCIlczogcmV0cnlpbmcgdXNpbmcgc2luZ2xlIGJsb2NrIHJlYWRcbiIsCi0JCQkJCSAgIHJlcS0+cnFfZGlzay0+ZGlza19uYW1lKTsKLQkJCQlyZXR1cm4gTU1DX0JMS19SRVRSWV9TSU5HTEU7Ci0JCQl9CisJCQlpZiAoZWNjX2VycikKKwkJCQlyZXR1cm4gTU1DX0JMS19FQ0NfRVJSOwogCQkJcmV0dXJuIE1NQ19CTEtfREFUQV9FUlI7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gTU1DX0JMS19DTURfRVJSOwogCQl9CiAJfQogCi0JaWYgKHJldCA9PSBNTUNfQkxLX1NVQ0NFU1MgJiYKLQkgICAgYmxrX3JxX2J5dGVzKHJlcSkgIT0gYnJxLT5kYXRhLmJ5dGVzX3hmZXJlZCkKLQkJcmV0ID0gTU1DX0JMS19QQVJUSUFMOworCWlmICghYnJxLT5kYXRhLmJ5dGVzX3hmZXJlZCkKKwkJcmV0dXJuIE1NQ19CTEtfUkVUUlk7CiAKLQlyZXR1cm4gcmV0OworCWlmIChibGtfcnFfYnl0ZXMocmVxKSAhPSBicnEtPmRhdGEuYnl0ZXNfeGZlcmVkKQorCQlyZXR1cm4gTU1DX0JMS19QQVJUSUFMOworCisJcmV0dXJuIE1NQ19CTEtfU1VDQ0VTUzsKIH0KIAogc3RhdGljIHZvaWQgbW1jX2Jsa19yd19ycV9wcmVwKHN0cnVjdCBtbWNfcXVldWVfcmVxICptcXJxLApAQCAtOTU3LDEzICsxMDMwLDIwIEBACiAJaWYgKGJycS0+ZGF0YS5ibG9ja3MgPiBjYXJkLT5ob3N0LT5tYXhfYmxrX2NvdW50KQogCQlicnEtPmRhdGEuYmxvY2tzID0gY2FyZC0+aG9zdC0+bWF4X2Jsa19jb3VudDsKIAotCS8qCi0JICogQWZ0ZXIgYSByZWFkIGVycm9yLCB3ZSByZWRvIHRoZSByZXF1ZXN0IG9uZSBzZWN0b3IgYXQgYSB0aW1lCi0JICogaW4gb3JkZXIgdG8gYWNjdXJhdGVseSBkZXRlcm1pbmUgd2hpY2ggc2VjdG9ycyBjYW4gYmUgcmVhZAotCSAqIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlpZiAoZGlzYWJsZV9tdWx0aSAmJiBicnEtPmRhdGEuYmxvY2tzID4gMSkKLQkJYnJxLT5kYXRhLmJsb2NrcyA9IDE7CisJaWYgKGJycS0+ZGF0YS5ibG9ja3MgPiAxKSB7CisJCS8qCisJCSAqIEFmdGVyIGEgcmVhZCBlcnJvciwgd2UgcmVkbyB0aGUgcmVxdWVzdCBvbmUgc2VjdG9yCisJCSAqIGF0IGEgdGltZSBpbiBvcmRlciB0byBhY2N1cmF0ZWx5IGRldGVybWluZSB3aGljaAorCQkgKiBzZWN0b3JzIGNhbiBiZSByZWFkIHN1Y2Nlc3NmdWxseS4KKwkJICovCisJCWlmIChkaXNhYmxlX211bHRpKQorCQkJYnJxLT5kYXRhLmJsb2NrcyA9IDE7CisKKwkJLyogU29tZSBjb250cm9sbGVycyBjYW4ndCBkbyBtdWx0aWJsb2NrIHJlYWRzIGR1ZSB0byBodyBidWdzICovCisJCWlmIChjYXJkLT5ob3N0LT5jYXBzMiAmIE1NQ19DQVAyX05PX01VTFRJX1JFQUQgJiYKKwkJICAgIHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkKKwkJCWJycS0+ZGF0YS5ibG9ja3MgPSAxOworCX0KIAogCWlmIChicnEtPmRhdGEuYmxvY2tzID4gMSB8fCBkb19yZWxfd3IpIHsKIAkJLyogU1BJIG11bHRpYmxvY2sgd3JpdGVzIHRlcm1pbmF0ZSB1c2luZyBhIHNwZWNpYWwKQEAgLTEwNDksMTIgKzExMjksNDEgQEAKIAltbWNfcXVldWVfYm91bmNlX3ByZShtcXJxKTsKIH0KIAorc3RhdGljIGludCBtbWNfYmxrX2NtZF9lcnIoc3RydWN0IG1tY19ibGtfZGF0YSAqbWQsIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwKKwkJCSAgIHN0cnVjdCBtbWNfYmxrX3JlcXVlc3QgKmJycSwgc3RydWN0IHJlcXVlc3QgKnJlcSwKKwkJCSAgIGludCByZXQpCit7CisJLyoKKwkgKiBJZiB0aGlzIGlzIGFuIFNEIGNhcmQgYW5kIHdlJ3JlIHdyaXRpbmcsIHdlIGNhbiBmaXJzdAorCSAqIG1hcmsgdGhlIGtub3duIGdvb2Qgc2VjdG9ycyBhcyBvay4KKwkgKgorCSAqIElmIHRoZSBjYXJkIGlzIG5vdCBTRCwgd2UgY2FuIHN0aWxsIG9rIHdyaXR0ZW4gc2VjdG9ycworCSAqIGFzIHJlcG9ydGVkIGJ5IHRoZSBjb250cm9sbGVyICh3aGljaCBtaWdodCBiZSBsZXNzIHRoYW4KKwkgKiB0aGUgcmVhbCBudW1iZXIgb2Ygd3JpdHRlbiBzZWN0b3JzLCBidXQgbmV2ZXIgbW9yZSkuCisJICovCisJaWYgKG1tY19jYXJkX3NkKGNhcmQpKSB7CisJCXUzMiBibG9ja3M7CisKKwkJYmxvY2tzID0gbW1jX3NkX251bV93cl9ibG9ja3MoY2FyZCk7CisJCWlmIChibG9ja3MgIT0gKHUzMiktMSkgeworCQkJc3Bpbl9sb2NrX2lycSgmbWQtPmxvY2spOworCQkJcmV0ID0gX19ibGtfZW5kX3JlcXVlc3QocmVxLCAwLCBibG9ja3MgPDwgOSk7CisJCQlzcGluX3VubG9ja19pcnEoJm1kLT5sb2NrKTsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnEoJm1kLT5sb2NrKTsKKwkJcmV0ID0gX19ibGtfZW5kX3JlcXVlc3QocmVxLCAwLCBicnEtPmRhdGEuYnl0ZXNfeGZlcmVkKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtZC0+bG9jayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgbW1jX2Jsa19pc3N1ZV9yd19ycShzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IHJlcXVlc3QgKnJxYykKIHsKIAlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCA9IG1xLT5kYXRhOwogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IG1kLT5xdWV1ZS5jYXJkOwogCXN0cnVjdCBtbWNfYmxrX3JlcXVlc3QgKmJycSA9ICZtcS0+bXFycV9jdXItPmJycTsKLQlpbnQgcmV0ID0gMSwgZGlzYWJsZV9tdWx0aSA9IDAsIHJldHJ5ID0gMDsKKwlpbnQgcmV0ID0gMSwgZGlzYWJsZV9tdWx0aSA9IDAsIHJldHJ5ID0gMCwgdHlwZTsKIAllbnVtIG1tY19ibGtfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSAqbXFfcnE7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKQEAgLTEwNzYsNiArMTE4NSw3IEBACiAJCW1xX3JxID0gY29udGFpbmVyX29mKGFyZXEsIHN0cnVjdCBtbWNfcXVldWVfcmVxLCBtbWNfYWN0aXZlKTsKIAkJYnJxID0gJm1xX3JxLT5icnE7CiAJCXJlcSA9IG1xX3JxLT5yZXE7CisJCXR5cGUgPSBycV9kYXRhX2RpcihyZXEpID09IFJFQUQgPyBNTUNfQkxLX1JFQUQgOiBNTUNfQkxLX1dSSVRFOwogCQltbWNfcXVldWVfYm91bmNlX3Bvc3QobXFfcnEpOwogCiAJCXN3aXRjaCAoc3RhdHVzKSB7CkBAIC0xMDg0LDE4ICsxMTk0LDE4IEBACiAJCQkvKgogCQkJICogQSBibG9jayB3YXMgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkLgogCQkJICovCisJCQltbWNfYmxrX3Jlc2V0X3N1Y2Nlc3MobWQsIHR5cGUpOwogCQkJc3Bpbl9sb2NrX2lycSgmbWQtPmxvY2spOwogCQkJcmV0ID0gX19ibGtfZW5kX3JlcXVlc3QocmVxLCAwLAogCQkJCQkJYnJxLT5kYXRhLmJ5dGVzX3hmZXJlZCk7CiAJCQlzcGluX3VubG9ja19pcnEoJm1kLT5sb2NrKTsKKwkJCS8qCisJCQkgKiBJZiB0aGUgYmxrX2VuZF9yZXF1ZXN0IGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gZXZlbgorCQkJICogdGhvdWdoIGFsbCBkYXRhIGhhcyBiZWVuIHRyYW5zZmVycmVkIGFuZCBubyBlcnJvcnMKKwkJCSAqIHdlcmUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29udHJvbGxlciwgaXQncyBhIGJ1Zy4KKwkJCSAqLwogCQkJaWYgKHN0YXR1cyA9PSBNTUNfQkxLX1NVQ0NFU1MgJiYgcmV0KSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgYmxrX2VuZF9yZXF1ZXN0IGhhcyByZXR1cm5lZCBub24gemVybwotCQkJCSAqIGV2ZW4gdGhvdWdoIGFsbCBkYXRhIGlzIHRyYW5zZmVyZWQgYW5kIG5vCi0JCQkJICogZXJyb3MgcmV0dXJuZWQgYnkgaG9zdC4KLQkJCQkgKiBJZiB0aGlzIGhhcHBlbiBpdCdzIGEgYnVnLgotCQkJCSAqLwotCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgQlVHIHJxX3RvdCAlZCBkX3hmZXIgJWRcbiIsCisJCQkJcHJfZXJyKCIlcyBCVUcgcnFfdG90ICVkIGRfeGZlciAlZFxuIiwKIAkJCQkgICAgICAgX19mdW5jX18sIGJsa19ycV9ieXRlcyhyZXEpLAogCQkJCSAgICAgICBicnEtPmRhdGEuYnl0ZXNfeGZlcmVkKTsKIAkJCQlycWMgPSBOVUxMOwpAQCAtMTEwMywxNiArMTIxMywzNiBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgTU1DX0JMS19DTURfRVJSOgotCQkJZ290byBjbWRfZXJyOwotCQljYXNlIE1NQ19CTEtfUkVUUllfU0lOR0xFOgotCQkJZGlzYWJsZV9tdWx0aSA9IDE7Ci0JCQlicmVhazsKKwkJCXJldCA9IG1tY19ibGtfY21kX2VycihtZCwgY2FyZCwgYnJxLCByZXEsIHJldCk7CisJCQlpZiAoIW1tY19ibGtfcmVzZXQobWQsIGNhcmQtPmhvc3QsIHR5cGUpKQorCQkJCWJyZWFrOworCQkJZ290byBjbWRfYWJvcnQ7CiAJCWNhc2UgTU1DX0JMS19SRVRSWToKIAkJCWlmIChyZXRyeSsrIDwgNSkKIAkJCQlicmVhazsKKwkJCS8qIEZhbGwgdGhyb3VnaCAqLwogCQljYXNlIE1NQ19CTEtfQUJPUlQ6CisJCQlpZiAoIW1tY19ibGtfcmVzZXQobWQsIGNhcmQtPmhvc3QsIHR5cGUpKQorCQkJCWJyZWFrOwogCQkJZ290byBjbWRfYWJvcnQ7Ci0JCWNhc2UgTU1DX0JMS19EQVRBX0VSUjoKKwkJY2FzZSBNTUNfQkxLX0RBVEFfRVJSOiB7CisJCQlpbnQgZXJyOworCisJCQllcnIgPSBtbWNfYmxrX3Jlc2V0KG1kLCBjYXJkLT5ob3N0LCB0eXBlKTsKKwkJCWlmICghZXJyKQorCQkJCWJyZWFrOworCQkJaWYgKGVyciA9PSAtRU5PREVWKQorCQkJCWdvdG8gY21kX2Fib3J0OworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCX0KKwkJY2FzZSBNTUNfQkxLX0VDQ19FUlI6CisJCQlpZiAoYnJxLT5kYXRhLmJsb2NrcyA+IDEpIHsKKwkJCQkvKiBSZWRvIHJlYWQgb25lIHNlY3RvciBhdCBhIHRpbWUgKi8KKwkJCQlwcl93YXJuaW5nKCIlczogcmV0cnlpbmcgdXNpbmcgc2luZ2xlIGJsb2NrIHJlYWRcbiIsCisJCQkJCSAgIHJlcS0+cnFfZGlzay0+ZGlza19uYW1lKTsKKwkJCQlkaXNhYmxlX211bHRpID0gMTsKKwkJCQlicmVhazsKKwkJCX0KIAkJCS8qCiAJCQkgKiBBZnRlciBhbiBlcnJvciwgd2UgcmVkbyBJL08gb25lIHNlY3RvciBhdCBhCiAJCQkgKiB0aW1lLCBzbyB3ZSBvbmx5IHJlYWNoIGhlcmUgYWZ0ZXIgdHJ5aW5nIHRvCkBAIC0xMTI5LDcgKzEyNTksNyBAQAogCiAJCWlmIChyZXQpIHsKIAkJCS8qCi0JCQkgKiBJbiBjYXNlIG9mIGEgbm9uZSBjb21wbGV0ZSByZXF1ZXN0CisJCQkgKiBJbiBjYXNlIG9mIGEgaW5jb21wbGV0ZSByZXF1ZXN0CiAJCQkgKiBwcmVwYXJlIGl0IGFnYWluIGFuZCByZXNlbmQuCiAJCQkgKi8KIAkJCW1tY19ibGtfcndfcnFfcHJlcChtcV9ycSwgY2FyZCwgZGlzYWJsZV9tdWx0aSwgbXEpOwpAQCAtMTEzOSwzMCArMTI2OSw2IEBACiAKIAlyZXR1cm4gMTsKIAotIGNtZF9lcnI6Ci0gCS8qCi0gCSAqIElmIHRoaXMgaXMgYW4gU0QgY2FyZCBhbmQgd2UncmUgd3JpdGluZywgd2UgY2FuIGZpcnN0Ci0gCSAqIG1hcmsgdGhlIGtub3duIGdvb2Qgc2VjdG9ycyBhcyBvay4KLSAJICoKLQkgKiBJZiB0aGUgY2FyZCBpcyBub3QgU0QsIHdlIGNhbiBzdGlsbCBvayB3cml0dGVuIHNlY3RvcnMKLQkgKiBhcyByZXBvcnRlZCBieSB0aGUgY29udHJvbGxlciAod2hpY2ggbWlnaHQgYmUgbGVzcyB0aGFuCi0JICogdGhlIHJlYWwgbnVtYmVyIG9mIHdyaXR0ZW4gc2VjdG9ycywgYnV0IG5ldmVyIG1vcmUpLgotCSAqLwotCWlmIChtbWNfY2FyZF9zZChjYXJkKSkgewotCQl1MzIgYmxvY2tzOwotCi0JCWJsb2NrcyA9IG1tY19zZF9udW1fd3JfYmxvY2tzKGNhcmQpOwotCQlpZiAoYmxvY2tzICE9ICh1MzIpLTEpIHsKLQkJCXNwaW5fbG9ja19pcnEoJm1kLT5sb2NrKTsKLQkJCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgMCwgYmxvY2tzIDw8IDkpOwotCQkJc3Bpbl91bmxvY2tfaXJxKCZtZC0+bG9jayk7Ci0JCX0KLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7Ci0JCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgMCwgYnJxLT5kYXRhLmJ5dGVzX3hmZXJlZCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOwotCX0KLQogIGNtZF9hYm9ydDoKIAlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7CiAJd2hpbGUgKHJldCkKQEAgLTExOTAsNiArMTI5NiwxMSBAQAogCiAJcmV0ID0gbW1jX2Jsa19wYXJ0X3N3aXRjaChjYXJkLCBtZCk7CiAJaWYgKHJldCkgeworCQlpZiAocmVxKSB7CisJCQlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7CisJCQlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocmVxLCAtRUlPKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOworCQl9CiAJCXJldCA9IDA7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEzNzQsMzIgKzE0ODUsMzUgQEAKIAogCXN0cmluZ19nZXRfc2l6ZSgodTY0KWdldF9jYXBhY2l0eShwYXJ0X21kLT5kaXNrKSA8PCA5LCBTVFJJTkdfVU5JVFNfMiwKIAkJCWNhcF9zdHIsIHNpemVvZihjYXBfc3RyKSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzICVzIHBhcnRpdGlvbiAldSAlc1xuIiwKKwlwcl9pbmZvKCIlczogJXMgJXMgcGFydGl0aW9uICV1ICVzXG4iLAogCSAgICAgICBwYXJ0X21kLT5kaXNrLT5kaXNrX25hbWUsIG1tY19jYXJkX2lkKGNhcmQpLAogCSAgICAgICBtbWNfY2FyZF9uYW1lKGNhcmQpLCBwYXJ0X21kLT5wYXJ0X3R5cGUsIGNhcF9zdHIpOwogCXJldHVybiAwOwogfQogCisvKiBNTUMgUGh5c2ljYWwgcGFydGl0aW9ucyBjb25zaXN0IG9mIHR3byBib290IHBhcnRpdGlvbnMgYW5kCisgKiB1cCB0byBmb3VyIGdlbmVyYWwgcHVycG9zZSBwYXJ0aXRpb25zLgorICogRm9yIGVhY2ggcGFydGl0aW9uIGVuYWJsZWQgaW4gRVhUX0NTRCBhIGJsb2NrIGRldmljZSB3aWxsIGJlIGFsbG9jYXRlZGkKKyAqIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBwYXJ0aXRpb24uCisgKi8KKwogc3RhdGljIGludCBtbWNfYmxrX2FsbG9jX3BhcnRzKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgc3RydWN0IG1tY19ibGtfZGF0YSAqbWQpCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IGlkeCwgcmV0ID0gMDsKIAogCWlmICghbW1jX2NhcmRfbW1jKGNhcmQpKQogCQlyZXR1cm4gMDsKIAotCWlmIChjYXJkLT5leHRfY3NkLmJvb3Rfc2l6ZSkgewotCQlyZXQgPSBtbWNfYmxrX2FsbG9jX3BhcnQoY2FyZCwgbWQsIEVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0JPT1QwLAotCQkJCQkgY2FyZC0+ZXh0X2NzZC5ib290X3NpemUgPj4gOSwKLQkJCQkJIHRydWUsCi0JCQkJCSAiYm9vdDAiKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJldCA9IG1tY19ibGtfYWxsb2NfcGFydChjYXJkLCBtZCwgRVhUX0NTRF9QQVJUX0NPTkZJR19BQ0NfQk9PVDEsCi0JCQkJCSBjYXJkLT5leHRfY3NkLmJvb3Rfc2l6ZSA+PiA5LAotCQkJCQkgdHJ1ZSwKLQkJCQkJICJib290MSIpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNhcmQtPm5yX3BhcnRzOyBpZHgrKykgeworCQlpZiAoY2FyZC0+cGFydFtpZHhdLnNpemUpIHsKKwkJCXJldCA9IG1tY19ibGtfYWxsb2NfcGFydChjYXJkLCBtZCwKKwkJCQljYXJkLT5wYXJ0W2lkeF0ucGFydF9jZmcsCisJCQkJY2FyZC0+cGFydFtpZHhdLnNpemUgPj4gOSwKKwkJCQljYXJkLT5wYXJ0W2lkeF0uZm9yY2Vfcm8sCisJCQkJY2FyZC0+cGFydFtpZHhdLm5hbWUpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTE0MTUsNyArMTUyOSw3IEBACiAJbW1jX3JlbGVhc2VfaG9zdChjYXJkLT5ob3N0KTsKIAogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHNldCBibG9jayBzaXplIHRvIDUxMjogJWRcbiIsCisJCXByX2VycigiJXM6IHVuYWJsZSB0byBzZXQgYmxvY2sgc2l6ZSB0byA1MTI6ICVkXG4iLAogCQkJbWQtPmRpc2stPmRpc2tfbmFtZSwgZXJyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTUxNyw3ICsxNjMxLDcgQEAKIAogCXN0cmluZ19nZXRfc2l6ZSgodTY0KWdldF9jYXBhY2l0eShtZC0+ZGlzaykgPDwgOSwgU1RSSU5HX1VOSVRTXzIsCiAJCQljYXBfc3RyLCBzaXplb2YoY2FwX3N0cikpOwotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyAlcyAlcyAlc1xuIiwKKwlwcl9pbmZvKCIlczogJXMgJXMgJXMgJXNcbiIsCiAJCW1kLT5kaXNrLT5kaXNrX25hbWUsIG1tY19jYXJkX2lkKGNhcmQpLCBtbWNfY2FyZF9uYW1lKGNhcmQpLAogCQljYXBfc3RyLCBtZC0+cmVhZF9vbmx5ID8gIihybykiIDogIiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMgYi9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMKaW5kZXggMmJmMjI5YS4uYjAzOGM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9tbWNfdGVzdC5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvbW1jX3Rlc3QuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBSRVNVTFRfT0sJCTAKICNkZWZpbmUgUkVTVUxUX0ZBSUwJCTEKQEAgLTI1MCw3ICsyNTEsNyBAQAogCQlpZiAoIWJ1c3kgJiYgbW1jX3Rlc3RfYnVzeSgmY21kKSkgewogCQkJYnVzeSA9IDE7CiAJCQlpZiAodGVzdC0+Y2FyZC0+aG9zdC0+Y2FwcyAmIE1NQ19DQVBfV0FJVF9XSElMRV9CVVNZKQotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXYXJuaW5nOiBIb3N0IGRpZCBub3QgIgorCQkJCXByX2luZm8oIiVzOiBXYXJuaW5nOiBIb3N0IGRpZCBub3QgIgogCQkJCQkid2FpdCBmb3IgYnVzeSBzdGF0ZSB0byBlbmQuXG4iLAogCQkJCQltbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCkpOwogCQl9CkBAIC01NTIsNyArNTUzLDcgQEAKIAlyYXRlID0gbW1jX3Rlc3RfcmF0ZShieXRlcywgJnRzKTsKIAlpb3BzID0gbW1jX3Rlc3RfcmF0ZSgxMDAsICZ0cyk7IC8qIEkvTyBvcHMgcGVyIHNlYyB4IDEwMCAqLwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyYW5zZmVyIG9mICV1IHNlY3RvcnMgKCV1JXMgS2lCKSB0b29rICVsdS4lMDlsdSAiCisJcHJfaW5mbygiJXM6IFRyYW5zZmVyIG9mICV1IHNlY3RvcnMgKCV1JXMgS2lCKSB0b29rICVsdS4lMDlsdSAiCiAJCQkgInNlY29uZHMgKCV1IGtCL3MsICV1IEtpQi9zLCAldS4lMDJ1IElPUFMpXG4iLAogCQkJIG1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSwgc2VjdG9ycywgc2VjdG9ycyA+PiAxLAogCQkJIChzZWN0b3JzICYgMSA/ICIuNSIgOiAiIiksICh1bnNpZ25lZCBsb25nKXRzLnR2X3NlYywKQEAgLTU3OCw3ICs1NzksNyBAQAogCXJhdGUgPSBtbWNfdGVzdF9yYXRlKHRvdCwgJnRzKTsKIAlpb3BzID0gbW1jX3Rlc3RfcmF0ZShjb3VudCAqIDEwMCwgJnRzKTsgLyogSS9PIG9wcyBwZXIgc2VjIHggMTAwICovCiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogVHJhbnNmZXIgb2YgJXUgeCAldSBzZWN0b3JzICgldSB4ICV1JXMgS2lCKSB0b29rICIKKwlwcl9pbmZvKCIlczogVHJhbnNmZXIgb2YgJXUgeCAldSBzZWN0b3JzICgldSB4ICV1JXMgS2lCKSB0b29rICIKIAkJCSAiJWx1LiUwOWx1IHNlY29uZHMgKCV1IGtCL3MsICV1IEtpQi9zLCAiCiAJCQkgIiV1LiUwMnUgSU9QUywgc2dfbGVuICVkKVxuIiwKIAkJCSBtbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCksIGNvdW50LCBzZWN0b3JzLCBjb3VudCwKQEAgLTE0MDgsNyArMTQwOSw3IEBACiAKIHN0YXRpYyBpbnQgbW1jX3Rlc3Rfbm9faGlnaG1lbShzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICIlczogSGlnaG1lbSBub3QgY29uZmlndXJlZCAtIHRlc3Qgc2tpcHBlZFxuIiwKKwlwcl9pbmZvKCIlczogSGlnaG1lbSBub3QgY29uZmlndXJlZCAtIHRlc3Qgc2tpcHBlZFxuIiwKIAkgICAgICAgbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MzUsNyArMTQzNiw3IEBACiAJCQkJICAgICAgdC0+bWF4X3NlZ19zeiwgJnQtPnNnX2xlbiwgbWluX3NnX2xlbik7CiAJfQogCWlmIChlcnIpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gbWFwIHNnIGxpc3RcbiIsCisJCXByX2luZm8oIiVzOiBGYWlsZWQgdG8gbWFwIHNnIGxpc3RcbiIsCiAJCSAgICAgICBtbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCkpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yMTM1LDcgKzIxMzYsNyBAQAogCiAJcmV0dXJuIHJldDsKICBlcnI6Ci0JcHJpbnRrKEtFUk5fSU5GTyAiWyVzXSBlcnJvclxuIiwgX19mdW5jX18pOworCXByX2luZm8oIlslc10gZXJyb3JcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMTQ5LDcgKzIxNTAsNyBAQAogCiAJaWYgKHJ3LT5kb19ub25ibG9ja19yZXEgJiYKIAkgICAgKCghcHJlX3JlcSAmJiBwb3N0X3JlcSkgfHwgKHByZV9yZXEgJiYgIXBvc3RfcmVxKSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZXJyb3I6IG9ubHkgb25lIG9mIHByZS9wb3N0IGlzIGRlZmluZWRcbiIpOworCQlwcl9pbmZvKCJlcnJvcjogb25seSBvbmUgb2YgcHJlL3Bvc3QgaXMgZGVmaW5lZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjMyOCw2ICsyMzI5LDMxIEBACiAJcmV0dXJuIG1tY190ZXN0X3J3X211bHRpcGxlX3NnX2xlbih0ZXN0LCAmdGVzdF9kYXRhKTsKIH0KIAorLyoKKyAqIGVNTUMgaGFyZHdhcmUgcmVzZXQuCisgKi8KK3N0YXRpYyBpbnQgbW1jX3Rlc3RfaHdfcmVzZXQoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJc3RydWN0IG1tY19jYXJkICpjYXJkID0gdGVzdC0+Y2FyZDsKKwlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QgPSBjYXJkLT5ob3N0OworCWludCBlcnI7CisKKwllcnIgPSBtbWNfaHdfcmVzZXRfY2hlY2soaG9zdCk7CisJaWYgKCFlcnIpCisJCXJldHVybiBSRVNVTFRfT0s7CisKKwlpZiAoZXJyID09IC1FTk9TWVMpCisJCXJldHVybiBSRVNVTFRfRkFJTDsKKworCWlmIChlcnIgIT0gLUVPUE5PVFNVUFApCisJCXJldHVybiBlcnI7CisKKwlpZiAoIW1tY19jYW5fcmVzZXQoY2FyZCkpCisJCXJldHVybiBSRVNVTFRfVU5TVVBfQ0FSRDsKKworCXJldHVybiBSRVNVTFRfVU5TVVBfSE9TVDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfdGVzdF9jYXNlIG1tY190ZXN0X2Nhc2VzW10gPSB7CiAJewogCQkubmFtZSA9ICJCYXNpYyB3cml0ZSAobm8gZGF0YSB2ZXJpZmljYXRpb24pIiwKQEAgLTI2NTAsNiArMjY3NiwxMSBAQAogCQkucnVuID0gbW1jX3Rlc3RfcHJvZmlsZV9zZ2xlbl9yX25vbmJsb2NrX3BlcmYsCiAJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAogCX0sCisKKwl7CisJCS5uYW1lID0gImVNTUMgaGFyZHdhcmUgcmVzZXQiLAorCQkucnVuID0gbW1jX3Rlc3RfaHdfcmVzZXQsCisJfSwKIH07CiAKIHN0YXRpYyBERUZJTkVfTVVURVgobW1jX3Rlc3RfbG9jayk7CkBAIC0yNjYwLDcgKzI2OTEsNyBAQAogewogCWludCBpLCByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogU3RhcnRpbmcgdGVzdHMgb2YgY2FyZCAlcy4uLlxuIiwKKwlwcl9pbmZvKCIlczogU3RhcnRpbmcgdGVzdHMgb2YgY2FyZCAlcy4uLlxuIiwKIAkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpLCBtbWNfY2FyZF9pZCh0ZXN0LT5jYXJkKSk7CiAKIAltbWNfY2xhaW1faG9zdCh0ZXN0LT5jYXJkLT5ob3N0KTsKQEAgLTI2NzEsMTQgKzI3MDIsMTQgQEAKIAkJaWYgKHRlc3RjYXNlICYmICgoaSArIDEpICE9IHRlc3RjYXNlKSkKIAkJCWNvbnRpbnVlOwogCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBUZXN0IGNhc2UgJWQuICVzLi4uXG4iLAorCQlwcl9pbmZvKCIlczogVGVzdCBjYXNlICVkLiAlcy4uLlxuIiwKIAkJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSwgaSArIDEsCiAJCQltbWNfdGVzdF9jYXNlc1tpXS5uYW1lKTsKIAogCQlpZiAobW1jX3Rlc3RfY2FzZXNbaV0ucHJlcGFyZSkgewogCQkJcmV0ID0gbW1jX3Rlc3RfY2FzZXNbaV0ucHJlcGFyZSh0ZXN0KTsKIAkJCWlmIChyZXQpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVzdWx0OiBQcmVwYXJlICIKKwkJCQlwcl9pbmZvKCIlczogUmVzdWx0OiBQcmVwYXJlICIKIAkJCQkJInN0YWdlIGZhaWxlZCEgKCVkKVxuIiwKIAkJCQkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpLAogCQkJCQlyZXQpOwpAQCAtMjcwOCwyNSArMjczOSwyNSBAQAogCQlyZXQgPSBtbWNfdGVzdF9jYXNlc1tpXS5ydW4odGVzdCk7CiAJCXN3aXRjaCAocmV0KSB7CiAJCWNhc2UgUkVTVUxUX09LOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc3VsdDogT0tcbiIsCisJCQlwcl9pbmZvKCIlczogUmVzdWx0OiBPS1xuIiwKIAkJCQltbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCkpOwogCQkJYnJlYWs7CiAJCWNhc2UgUkVTVUxUX0ZBSUw6Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVzdWx0OiBGQUlMRURcbiIsCisJCQlwcl9pbmZvKCIlczogUmVzdWx0OiBGQUlMRURcbiIsCiAJCQkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpKTsKIAkJCWJyZWFrOwogCQljYXNlIFJFU1VMVF9VTlNVUF9IT1NUOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc3VsdDogVU5TVVBQT1JURUQgIgorCQkJcHJfaW5mbygiJXM6IFJlc3VsdDogVU5TVVBQT1JURUQgIgogCQkJCSIoYnkgaG9zdClcbiIsCiAJCQkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpKTsKIAkJCWJyZWFrOwogCQljYXNlIFJFU1VMVF9VTlNVUF9DQVJEOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc3VsdDogVU5TVVBQT1JURUQgIgorCQkJcHJfaW5mbygiJXM6IFJlc3VsdDogVU5TVVBQT1JURUQgIgogCQkJCSIoYnkgY2FyZClcbiIsCiAJCQkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc3VsdDogRVJST1IgKCVkKVxuIiwKKwkJCXByX2luZm8oIiVzOiBSZXN1bHQ6IEVSUk9SICglZClcbiIsCiAJCQkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpLCByZXQpOwogCQl9CiAKQEAgLTI3MzcsNyArMjc2OCw3IEBACiAJCWlmIChtbWNfdGVzdF9jYXNlc1tpXS5jbGVhbnVwKSB7CiAJCQlyZXQgPSBtbWNfdGVzdF9jYXNlc1tpXS5jbGVhbnVwKHRlc3QpOwogCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXYXJuaW5nOiBDbGVhbnVwICIKKwkJCQlwcl9pbmZvKCIlczogV2FybmluZzogQ2xlYW51cCAiCiAJCQkJCSJzdGFnZSBmYWlsZWQhICglZClcbiIsCiAJCQkJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSwKIAkJCQkJcmV0KTsKQEAgLTI3NDcsNyArMjc3OCw3IEBACiAKIAltbWNfcmVsZWFzZV9ob3N0KHRlc3QtPmNhcmQtPmhvc3QpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRlc3RzIGNvbXBsZXRlZC5cbiIsCisJcHJfaW5mbygiJXM6IFRlc3RzIGNvbXBsZXRlZC5cbiIsCiAJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYwppbmRleCA0NWZiMzYyLi5kY2FkNTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkJd2FrZV91cF9wcm9jZXNzKG1xLT50aHJlYWQpOwogfQogCi1zdHJ1Y3Qgc2NhdHRlcmxpc3QgKm1tY19hbGxvY19zZyhpbnQgc2dfbGVuLCBpbnQgKmVycikKK3N0YXRpYyBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKm1tY19hbGxvY19zZyhpbnQgc2dfbGVuLCBpbnQgKmVycikKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCkBAIC0xNDAsNyArMTQwLDcgQEAKIAkvKiBncmFudWxhcml0eSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gbWF4LiBkaXNjYXJkICovCiAJaWYgKGNhcmQtPnByZWZfZXJhc2UgPiBtYXhfZGlzY2FyZCkKIAkJcS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSAwOwotCWlmIChtbWNfY2FuX3NlY3VyZV9lcmFzZV90cmltKGNhcmQpKQorCWlmIChtbWNfY2FuX3NlY3VyZV9lcmFzZV90cmltKGNhcmQpIHx8IG1tY19jYW5fc2FuaXRpemUoY2FyZCkpCiAJCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfU0VDRElTQ0FSRCwgcSk7CiB9CiAKQEAgLTE5NywxMyArMTk3LDEzIEBACiAJCWlmIChib3VuY2VzeiA+IDUxMikgewogCQkJbXFycV9jdXItPmJvdW5jZV9idWYgPSBrbWFsbG9jKGJvdW5jZXN6LCBHRlBfS0VSTkVMKTsKIAkJCWlmICghbXFycV9jdXItPmJvdW5jZV9idWYpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvICIKKwkJCQlwcl93YXJuaW5nKCIlczogdW5hYmxlIHRvICIKIAkJCQkJImFsbG9jYXRlIGJvdW5jZSBjdXIgYnVmZmVyXG4iLAogCQkJCQltbWNfY2FyZF9uYW1lKGNhcmQpKTsKIAkJCX0KIAkJCW1xcnFfcHJldi0+Ym91bmNlX2J1ZiA9IGttYWxsb2MoYm91bmNlc3osIEdGUF9LRVJORUwpOwogCQkJaWYgKCFtcXJxX3ByZXYtPmJvdW5jZV9idWYpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvICIKKwkJCQlwcl93YXJuaW5nKCIlczogdW5hYmxlIHRvICIKIAkJCQkJImFsbG9jYXRlIGJvdW5jZSBwcmV2IGJ1ZmZlclxuIiwKIAkJCQkJbW1jX2NhcmRfbmFtZShjYXJkKSk7CiAJCQkJa2ZyZWUobXFycV9jdXItPmJvdW5jZV9idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9zZGlvX3VhcnQuYyBiL2RyaXZlcnMvbW1jL2NhcmQvc2Rpb191YXJ0LmMKaW5kZXggYzhjOWVkYi4uMmMxNTFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9zZGlvX3VhcnQuYworKysgYi9kcml2ZXJzL21tYy9jYXJkL3NkaW9fdWFydC5jCkBAIC0xMDgyLDcgKzEwODIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChmdW5jLT5jbGFzcyA9PSBTRElPX0NMQVNTX1VBUlQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5lZWQgaW5mbyBvbiBVQVJUIGNsYXNzIGJhc2ljIHNldHVwXG4iLAorCQlwcl93YXJuaW5nKCIlczogbmVlZCBpbmZvIG9uIFVBUlQgY2xhc3MgYmFzaWMgc2V0dXBcbiIsCiAJCSAgICAgICBzZGlvX2Z1bmNfaWQoZnVuYykpOwogCQlrZnJlZShwb3J0KTsKIAkJcmV0dXJuIC1FTk9TWVM7CkBAIC0xMTAxLDIzICsxMTAxLDIzIEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKCF0cGwpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCXByX3dhcm5pbmcoCiAgICAgICAgIiVzOiBjYW4ndCBmaW5kIHR1cGxlIDB4OTEgc3VidHVwbGUgMCAoU1VCVFBMX1NJT1JFRykgZm9yIEdQUyBjbGFzc1xuIiwKIAkJCSAgICAgICBzZGlvX2Z1bmNfaWQoZnVuYykpOwogCQkJa2ZyZWUocG9ydCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlZ2lzdGVyIElEID0gMHglMDJ4LCBFeHAgSUQgPSAweCUwMnhcbiIsCisJCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgSUQgPSAweCUwMngsIEV4cCBJRCA9IDB4JTAyeFxuIiwKIAkJICAgICAgIHNkaW9fZnVuY19pZChmdW5jKSwgdHBsLT5kYXRhWzJdLCB0cGwtPmRhdGFbM10pOwogCQlwb3J0LT5yZWdzX29mZnNldCA9ICh0cGwtPmRhdGFbNF0gPDwgMCkgfAogCQkJCSAgICAodHBsLT5kYXRhWzVdIDw8IDgpIHwKIAkJCQkgICAgKHRwbC0+ZGF0YVs2XSA8PCAxNik7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVncyBvZmZzZXQgPSAweCV4XG4iLAorCQlwcl9kZWJ1ZygiJXM6IHJlZ3Mgb2Zmc2V0ID0gMHgleFxuIiwKIAkJICAgICAgIHNkaW9fZnVuY19pZChmdW5jKSwgcG9ydC0+cmVnc19vZmZzZXQpOwogCQlwb3J0LT51YXJ0Y2xrID0gdHBsLT5kYXRhWzddICogMTE1MjAwOwogCQlpZiAocG9ydC0+dWFydGNsayA9PSAwKQogCQkJcG9ydC0+dWFydGNsayA9IDExNTIwMDsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjbGsgJWQgYmF1ZGNvZGUgJXUgNDgwMC1kaXYgJXVcbiIsCisJCXByX2RlYnVnKCIlczogY2xrICVkIGJhdWRjb2RlICV1IDQ4MDAtZGl2ICV1XG4iLAogCQkgICAgICAgc2Rpb19mdW5jX2lkKGZ1bmMpLCBwb3J0LT51YXJ0Y2xrLAogCQkgICAgICAgdHBsLT5kYXRhWzddLCB0cGwtPmRhdGFbOF0gfCAodHBsLT5kYXRhWzldIDw8IDgpKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9idXMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMKaW5kZXggMzkzZDgxNy4uNmJlNDkyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9idXMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2J1cy5jCkBAIC0xMSw5ICsxMSwxMSBAQAogICogIE1NQyBjYXJkIGJ1cyBkcml2ZXIgbW9kZWwKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgpAQCAtMjk1LDcgKzI5Nyw3IEBACiAJfQogCiAJaWYgKG1tY19ob3N0X2lzX3NwaShjYXJkLT5ob3N0KSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogbmV3ICVzJXMlcyBjYXJkIG9uIFNQSVxuIiwKKwkJcHJfaW5mbygiJXM6IG5ldyAlcyVzJXMgY2FyZCBvbiBTUElcbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCiAJCQltbWNfY2FyZF9oaWdoc3BlZWQoY2FyZCkgPyAiaGlnaCBzcGVlZCAiIDogIiIsCiAJCQltbWNfY2FyZF9kZHJfbW9kZShjYXJkKSA/ICJERFIgIiA6ICIiLApAQCAtMzM0LDEwICszMzYsMTAgQEAKIAogCWlmIChtbWNfY2FyZF9wcmVzZW50KGNhcmQpKSB7CiAJCWlmIChtbWNfaG9zdF9pc19zcGkoY2FyZC0+aG9zdCkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTUEkgY2FyZCByZW1vdmVkXG4iLAorCQkJcHJfaW5mbygiJXM6IFNQSSBjYXJkIHJlbW92ZWRcbiIsCiAJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjYXJkICUwNHggcmVtb3ZlZFxuIiwKKwkJCXByX2luZm8oIiVzOiBjYXJkICUwNHggcmVtb3ZlZFxuIiwKIAkJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNhcmQtPnJjYSk7CiAJCX0KIAkJZGV2aWNlX2RlbCgmY2FyZC0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKaW5kZXggYjI3Yjk0MC4uNTI3OGZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgpAQCAtODMsNiArODUsNDMgQEAKIAlmbHVzaF93b3JrcXVldWUod29ya3F1ZXVlKTsKIH0KIAorI2lmZGVmIENPTkZJR19GQUlMX01NQ19SRVFVRVNUCisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbi4gSW5qZWN0IHJhbmRvbSBkYXRhIGVycm9ycy4KKyAqIElmIG1tY19kYXRhIGlzIE5VTEwgbm8gZXJyb3JzIGFyZSBpbmplY3RlZC4KKyAqLworc3RhdGljIHZvaWQgbW1jX3Nob3VsZF9mYWlsX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0LAorCQkJCSAgICBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKK3sKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCA9IG1ycS0+Y21kOworCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSA9IG1ycS0+ZGF0YTsKKwlzdGF0aWMgY29uc3QgaW50IGRhdGFfZXJyb3JzW10gPSB7CisJCS1FVElNRURPVVQsCisJCS1FSUxTRVEsCisJCS1FSU8sCisJfTsKKworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKGNtZC0+ZXJyb3IgfHwgZGF0YS0+ZXJyb3IgfHwKKwkgICAgIXNob3VsZF9mYWlsKCZob3N0LT5mYWlsX21tY19yZXF1ZXN0LCBkYXRhLT5ibGtzeiAqIGRhdGEtPmJsb2NrcykpCisJCXJldHVybjsKKworCWRhdGEtPmVycm9yID0gZGF0YV9lcnJvcnNbcmFuZG9tMzIoKSAlIEFSUkFZX1NJWkUoZGF0YV9lcnJvcnMpXTsKKwlkYXRhLT5ieXRlc194ZmVyZWQgPSAocmFuZG9tMzIoKSAlIChkYXRhLT5ieXRlc194ZmVyZWQgPj4gOSkpIDw8IDk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19GQUlMX01NQ19SRVFVRVNUICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfc2hvdWxkX2ZhaWxfcmVxdWVzdChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsCisJCQkJCSAgIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0ZBSUxfTU1DX1JFUVVFU1QgKi8KKwogLyoqCiAgKgltbWNfcmVxdWVzdF9kb25lIC0gZmluaXNoIHByb2Nlc3NpbmcgYW4gTU1DIHJlcXVlc3QKICAqCUBob3N0OiBNTUMgaG9zdCB3aGljaCBjb21wbGV0ZWQgcmVxdWVzdApAQCAtMTAyLDEzICsxNDEsMTUgQEAKIAl9CiAKIAlpZiAoZXJyICYmIGNtZC0+cmV0cmllcykgewotCQlwcl9kZWJ1ZygiJXM6IHJlcSBmYWlsZWQgKENNRCV1KTogJWQsIHJldHJ5aW5nLi4uXG4iLAotCQkJbW1jX2hvc3RuYW1lKGhvc3QpLCBjbWQtPm9wY29kZSwgZXJyKTsKLQotCQljbWQtPnJldHJpZXMtLTsKLQkJY21kLT5lcnJvciA9IDA7Ci0JCWhvc3QtPm9wcy0+cmVxdWVzdChob3N0LCBtcnEpOworCQkvKgorCQkgKiBSZXF1ZXN0IHN0YXJ0ZXIgbXVzdCBoYW5kbGUgcmV0cmllcyAtIHNlZQorCQkgKiBtbWNfd2FpdF9mb3JfcmVxX2RvbmUoKS4KKwkJICovCisJCWlmIChtcnEtPmRvbmUpCisJCQltcnEtPmRvbmUobXJxKTsKIAl9IGVsc2UgeworCQltbWNfc2hvdWxkX2ZhaWxfcmVxdWVzdChob3N0LCBtcnEpOworCiAJCWxlZF90cmlnZ2VyX2V2ZW50KGhvc3QtPmxlZCwgTEVEX09GRik7CiAKIAkJcHJfZGVidWcoIiVzOiByZXEgZG9uZSAoQ01EJXUpOiAlZDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKQEAgLTIxMiw3ICsyNTMsMjEgQEAKIHN0YXRpYyB2b2lkIG1tY193YWl0X2Zvcl9yZXFfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsCiAJCQkJICBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKIHsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtcnEtPmNvbXBsZXRpb24pOworCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kOworCisJd2hpbGUgKDEpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmbXJxLT5jb21wbGV0aW9uKTsKKworCQljbWQgPSBtcnEtPmNtZDsKKwkJaWYgKCFjbWQtPmVycm9yIHx8ICFjbWQtPnJldHJpZXMpCisJCQlicmVhazsKKworCQlwcl9kZWJ1ZygiJXM6IHJlcSBmYWlsZWQgKENNRCV1KTogJWQsIHJldHJ5aW5nLi4uXG4iLAorCQkJIG1tY19ob3N0bmFtZShob3N0KSwgY21kLT5vcGNvZGUsIGNtZC0+ZXJyb3IpOworCQljbWQtPnJldHJpZXMtLTsKKwkJY21kLT5lcnJvciA9IDA7CisJCWhvc3QtPm9wcy0+cmVxdWVzdChob3N0LCBtcnEpOworCX0KIH0KIAogLyoqCkBAIC0yNzksOCArMzM0LDE0IEBACiAJCW1tY193YWl0X2Zvcl9yZXFfZG9uZShob3N0LCBob3N0LT5hcmVxLT5tcnEpOwogCQllcnIgPSBob3N0LT5hcmVxLT5lcnJfY2hlY2soaG9zdC0+Y2FyZCwgaG9zdC0+YXJlcSk7CiAJCWlmIChlcnIpIHsKKwkJCS8qIHBvc3QgcHJvY2VzcyB0aGUgY29tcGxldGVkIGZhaWxlZCByZXF1ZXN0ICovCiAJCQltbWNfcG9zdF9yZXEoaG9zdCwgaG9zdC0+YXJlcS0+bXJxLCAwKTsKIAkJCWlmIChhcmVxKQorCQkJCS8qCisJCQkJICogQ2FuY2VsIHRoZSBuZXcgcHJlcGFyZWQgcmVxdWVzdCwgYmVjYXVzZQorCQkJCSAqIGl0IGNhbid0IHJ1biB1bnRpbCB0aGUgZmFpbGVkCisJCQkJICogcmVxdWVzdCBoYXMgYmVlbiBwcm9wZXJseSBoYW5kbGVkLgorCQkJCSAqLwogCQkJCW1tY19wb3N0X3JlcShob3N0LCBhcmVxLT5tcnEsIC1FSU5WQUwpOwogCiAJCQlob3N0LT5hcmVxID0gTlVMTDsKQEAgLTMxOSw2ICszODAsNjMgQEAKIEVYUE9SVF9TWU1CT0wobW1jX3dhaXRfZm9yX3JlcSk7CiAKIC8qKgorICoJbW1jX2ludGVycnVwdF9ocGkgLSBJc3N1ZSBmb3IgSGlnaCBwcmlvcml0eSBJbnRlcnJ1cHQKKyAqCUBjYXJkOiB0aGUgTU1DIGNhcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBIUEkgdHJhbnNmZXIKKyAqCisgKglJc3N1ZWQgSGlnaCBQcmlvcml0eSBJbnRlcnJ1cHQsIGFuZCBjaGVjayBmb3IgY2FyZCBzdGF0dXMKKyAqCXV0aWwgb3V0LW9mIHByZy1zdGF0ZS4KKyAqLworaW50IG1tY19pbnRlcnJ1cHRfaHBpKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKK3sKKwlpbnQgZXJyOworCXUzMiBzdGF0dXM7CisKKwlCVUdfT04oIWNhcmQpOworCisJaWYgKCFjYXJkLT5leHRfY3NkLmhwaV9lbikgeworCQlwcl9pbmZvKCIlczogSFBJIGVuYWJsZSBiaXQgdW5zZXRcbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CisJCXJldHVybiAxOworCX0KKworCW1tY19jbGFpbV9ob3N0KGNhcmQtPmhvc3QpOworCWVyciA9IG1tY19zZW5kX3N0YXR1cyhjYXJkLCAmc3RhdHVzKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiJXM6IEdldCBjYXJkIHN0YXR1cyBmYWlsXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBjYXJkIHN0YXR1cyBpcyBpbiBQUkctc3RhdGUsIHdlIGNhbiBzZW5kIHRoZSBIUEkgY29tbWFuZC4KKwkgKi8KKwlpZiAoUjFfQ1VSUkVOVF9TVEFURShzdGF0dXMpID09IFIxX1NUQVRFX1BSRykgeworCQlkbyB7CisJCQkvKgorCQkJICogV2UgZG9uJ3Qga25vdyB3aGVuIHRoZSBIUEkgY29tbWFuZCB3aWxsIGZpbmlzaAorCQkJICogcHJvY2Vzc2luZywgc28gd2UgbmVlZCB0byByZXNlbmQgSFBJIHVudGlsIG91dAorCQkJICogb2YgcHJnLXN0YXRlLCBhbmQga2VlcCBjaGVja2luZyB0aGUgY2FyZCBzdGF0dXMKKwkJCSAqIHdpdGggU0VORF9TVEFUVVMuICBJZiBhIHRpbWVvdXQgZXJyb3Igb2NjdXJzIHdoZW4KKwkJCSAqIHNlbmRpbmcgdGhlIEhQSSBjb21tYW5kLCB3ZSBhcmUgYWxyZWFkeSBvdXQgb2YKKwkJCSAqIHByZy1zdGF0ZS4KKwkJCSAqLworCQkJZXJyID0gbW1jX3NlbmRfaHBpX2NtZChjYXJkLCAmc3RhdHVzKTsKKwkJCWlmIChlcnIpCisJCQkJcHJfZGVidWcoIiVzOiBhYm9ydCBIUEkgKCVkIGVycm9yKVxuIiwKKwkJCQkJIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgZXJyKTsKKworCQkJZXJyID0gbW1jX3NlbmRfc3RhdHVzKGNhcmQsICZzdGF0dXMpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoUjFfQ1VSUkVOVF9TVEFURShzdGF0dXMpID09IFIxX1NUQVRFX1BSRyk7CisJfSBlbHNlCisJCXByX2RlYnVnKCIlczogTGVmdCBwcmctc3RhdGVcbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CisKK291dDoKKwltbWNfcmVsZWFzZV9ob3N0KGNhcmQtPmhvc3QpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKG1tY19pbnRlcnJ1cHRfaHBpKTsKKworLyoqCiAgKgltbWNfd2FpdF9mb3JfY21kIC0gc3RhcnQgYSBjb21tYW5kIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uCiAgKglAaG9zdDogTU1DIGhvc3QgdG8gc3RhcnQgY29tbWFuZAogICoJQGNtZDogTU1DIGNvbW1hbmQgdG8gc3RhcnQKQEAgLTMzMCw3ICs0NDgsNyBAQAogICovCiBpbnQgbW1jX3dhaXRfZm9yX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfY29tbWFuZCAqY21kLCBpbnQgcmV0cmllcykKIHsKLQlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0gezB9OworCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7TlVMTH07CiAKIAlXQVJOX09OKCFob3N0LT5jbGFpbWVkKTsKIApAQCAtMTExOSwxMyArMTIzNywxMSBAQAogCQliaXQgPSBmbHMoaG9zdC0+b2NyX2F2YWlsKSAtIDE7CiAKIAlob3N0LT5pb3MudmRkID0gYml0OwotCWlmIChtbWNfaG9zdF9pc19zcGkoaG9zdCkpIHsKKwlpZiAobW1jX2hvc3RfaXNfc3BpKGhvc3QpKQogCQlob3N0LT5pb3MuY2hpcF9zZWxlY3QgPSBNTUNfQ1NfSElHSDsKLQkJaG9zdC0+aW9zLmJ1c19tb2RlID0gTU1DX0JVU01PREVfUFVTSFBVTEw7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWhvc3QtPmlvcy5jaGlwX3NlbGVjdCA9IE1NQ19DU19ET05UQ0FSRTsKLQkJaG9zdC0+aW9zLmJ1c19tb2RlID0gTU1DX0JVU01PREVfT1BFTkRSQUlOOwotCX0KKwlob3N0LT5pb3MuYnVzX21vZGUgPSBNTUNfQlVTTU9ERV9QVVNIUFVMTDsKIAlob3N0LT5pb3MucG93ZXJfbW9kZSA9IE1NQ19QT1dFUl9VUDsKIAlob3N0LT5pb3MuYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF8xOwogCWhvc3QtPmlvcy50aW1pbmcgPSBNTUNfVElNSU5HX0xFR0FDWTsKQEAgLTExNTEsMTMgKzEyNjcsNDUgQEAKIAltbWNfaG9zdF9jbGtfcmVsZWFzZShob3N0KTsKIH0KIAotc3RhdGljIHZvaWQgbW1jX3Bvd2VyX29mZihzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit2b2lkIG1tY19wb3dlcl9vZmYoc3RydWN0IG1tY19ob3N0ICpob3N0KQogeworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZDsKKwl1bnNpZ25lZCBpbnQgbm90aWZ5X3R5cGU7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7CisJaW50IGVycjsKKwogCW1tY19ob3N0X2Nsa19ob2xkKGhvc3QpOwogCisJY2FyZCA9IGhvc3QtPmNhcmQ7CiAJaG9zdC0+aW9zLmNsb2NrID0gMDsKIAlob3N0LT5pb3MudmRkID0gMDsKIAorCWlmIChjYXJkICYmIG1tY19jYXJkX21tYyhjYXJkKSAmJgorCSAgICAoY2FyZC0+cG93ZXJvZmZfbm90aWZ5X3N0YXRlID09IE1NQ19QT1dFUkVEX09OKSkgeworCisJCWlmIChob3N0LT5wb3dlcl9ub3RpZnlfdHlwZSA9PSBNTUNfSE9TVF9QV19OT1RJRllfU0hPUlQpIHsKKwkJCW5vdGlmeV90eXBlID0gRVhUX0NTRF9QT1dFUl9PRkZfU0hPUlQ7CisJCQl0aW1lb3V0ID0gY2FyZC0+ZXh0X2NzZC5nZW5lcmljX2NtZDZfdGltZTsKKwkJCWNhcmQtPnBvd2Vyb2ZmX25vdGlmeV9zdGF0ZSA9IE1NQ19QT1dFUk9GRl9TSE9SVDsKKwkJfSBlbHNlIHsKKwkJCW5vdGlmeV90eXBlID0gRVhUX0NTRF9QT1dFUl9PRkZfTE9ORzsKKwkJCXRpbWVvdXQgPSBjYXJkLT5leHRfY3NkLnBvd2VyX29mZl9sb25ndGltZTsKKwkJCWNhcmQtPnBvd2Vyb2ZmX25vdGlmeV9zdGF0ZSA9IE1NQ19QT1dFUk9GRl9MT05HOworCQl9CisKKwkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAorCQkJCSBFWFRfQ1NEX1BPV0VSX09GRl9OT1RJRklDQVRJT04sCisJCQkJIG5vdGlmeV90eXBlLCB0aW1lb3V0KTsKKworCQlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykKKwkJCXByX2VycigiRGV2aWNlIGZhaWxlZCB0byByZXNwb25kIHdpdGhpbiAlZCBwb3dlcm9mZiAiCisJCQkgICAgICAgInRpbWUuIEZvcmNlZnVsbHkgcG93ZXJpbmcgZG93biB0aGUgZGV2aWNlXG4iLAorCQkJICAgICAgIHRpbWVvdXQpOworCisJCS8qIFNldCB0aGUgY2FyZCBzdGF0ZSB0byBubyBub3RpZmljYXRpb24gYWZ0ZXIgdGhlIHBvd2Vyb2ZmICovCisJCWNhcmQtPnBvd2Vyb2ZmX25vdGlmeV9zdGF0ZSA9IE1NQ19OT19QT1dFUl9OT1RJRklDQVRJT047CisJfQorCiAJLyoKIAkgKiBSZXNldCBvY3IgbWFzayB0byBiZSB0aGUgaGlnaGVzdCBwb3NzaWJsZSB2b2x0YWdlIHN1cHBvcnRlZCBmb3IKIAkgKiB0aGlzIG1tYyBob3N0LiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhdCBuZXh0IHBvd2VyIHVwLgpAQCAtMTE3Myw2ICsxMzIxLDEzIEBACiAJaG9zdC0+aW9zLnRpbWluZyA9IE1NQ19USU1JTkdfTEVHQUNZOwogCW1tY19zZXRfaW9zKGhvc3QpOwogCisJLyoKKwkgKiBTb21lIGNvbmZpZ3VyYXRpb25zLCBzdWNoIGFzIHRoZSA4MDIuMTEgU0RJTyBjYXJkIGluIHRoZSBPTFBDCisJICogWE8tMS41LCByZXF1aXJlIGEgc2hvcnQgZGVsYXkgYWZ0ZXIgcG93ZXJvZmYgYmVmb3JlIHRoZSBjYXJkCisJICogY2FuIGJlIHN1Y2Nlc3NmdWxseSB0dXJuZWQgb24gYWdhaW4uCisJICovCisJbW1jX2RlbGF5KDEpOworCiAJbW1jX2hvc3RfY2xrX3JlbGVhc2UoaG9zdCk7CiB9CiAKQEAgLTEyNDEsOCArMTM5Niw3IEBACiB9CiAKIC8qCi0gKiBSZW1vdmUgdGhlIGN1cnJlbnQgYnVzIGhhbmRsZXIgZnJvbSBhIGhvc3QuIEFzc3VtZXMgdGhhdCB0aGVyZSBhcmUKLSAqIG5vIGludGVyZXN0aW5nIGNhcmRzIGxlZnQsIHNvIHRoZSBidXMgaXMgcG93ZXJlZCBkb3duLgorICogUmVtb3ZlIHRoZSBjdXJyZW50IGJ1cyBoYW5kbGVyIGZyb20gYSBob3N0LgogICovCiB2b2lkIG1tY19kZXRhY2hfYnVzKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKQEAgLTEyNTksOCArMTQxMyw2IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKLQltbWNfcG93ZXJfb2ZmKGhvc3QpOwotCiAJbW1jX2J1c19wdXQoaG9zdCk7CiB9CiAKQEAgLTE0NzgsOSArMTYzMCw5IEBACiAJY21kLmZsYWdzID0gTU1DX1JTUF9TUElfUjEgfCBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BQzsKIAllcnIgPSBtbWNfd2FpdF9mb3JfY21kKGNhcmQtPmhvc3QsICZjbWQsIDApOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtbWNfZXJhc2U6IGdyb3VwIHN0YXJ0IGVycm9yICVkLCAiCisJCXByX2VycigibW1jX2VyYXNlOiBncm91cCBzdGFydCBlcnJvciAlZCwgIgogCQkgICAgICAgInN0YXR1cyAlI3hcbiIsIGVyciwgY21kLnJlc3BbMF0pOwotCQllcnIgPSAtRUlOVkFMOworCQllcnIgPSAtRUlPOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE0OTMsOSArMTY0NSw5IEBACiAJY21kLmZsYWdzID0gTU1DX1JTUF9TUElfUjEgfCBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BQzsKIAllcnIgPSBtbWNfd2FpdF9mb3JfY21kKGNhcmQtPmhvc3QsICZjbWQsIDApOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtbWNfZXJhc2U6IGdyb3VwIGVuZCBlcnJvciAlZCwgc3RhdHVzICUjeFxuIiwKKwkJcHJfZXJyKCJtbWNfZXJhc2U6IGdyb3VwIGVuZCBlcnJvciAlZCwgc3RhdHVzICUjeFxuIiwKIAkJICAgICAgIGVyciwgY21kLnJlc3BbMF0pOwotCQllcnIgPSAtRUlOVkFMOworCQllcnIgPSAtRUlPOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE1MDYsNyArMTY1OCw3IEBACiAJY21kLmNtZF90aW1lb3V0X21zID0gbW1jX2VyYXNlX3RpbWVvdXQoY2FyZCwgYXJnLCBxdHkpOwogCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoY2FyZC0+aG9zdCwgJmNtZCwgMCk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIm1tY19lcmFzZTogZXJhc2UgZXJyb3IgJWQsIHN0YXR1cyAlI3hcbiIsCisJCXByX2VycigibW1jX2VyYXNlOiBlcmFzZSBlcnJvciAlZCwgc3RhdHVzICUjeFxuIiwKIAkJICAgICAgIGVyciwgY21kLnJlc3BbMF0pOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIG91dDsKQEAgLTE1MjMsNyArMTY3NSw3IEBACiAJCS8qIERvIG5vdCByZXRyeSBlbHNlIHdlIGNhbid0IHNlZSBlcnJvcnMgKi8KIAkJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChjYXJkLT5ob3N0LCAmY21kLCAwKTsKIAkJaWYgKGVyciB8fCAoY21kLnJlc3BbMF0gJiAweEZERjkyMDAwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciAlZCByZXF1ZXN0aW5nIHN0YXR1cyAlI3hcbiIsCisJCQlwcl9lcnIoImVycm9yICVkIHJlcXVlc3Rpbmcgc3RhdHVzICUjeFxuIiwKIAkJCQllcnIsIGNtZC5yZXNwWzBdKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIG91dDsKQEAgLTE2MTQsMTAgKzE3NjYsMzIgQEAKIHsKIAlpZiAoY2FyZC0+ZXh0X2NzZC5zZWNfZmVhdHVyZV9zdXBwb3J0ICYgRVhUX0NTRF9TRUNfR0JfQ0xfRU4pCiAJCXJldHVybiAxOworCWlmIChtbWNfY2FuX2Rpc2NhcmQoY2FyZCkpCisJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChtbWNfY2FuX3RyaW0pOwogCitpbnQgbW1jX2Nhbl9kaXNjYXJkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKK3sKKwkvKgorCSAqIEFzIHRoZXJlJ3Mgbm8gd2F5IHRvIGRldGVjdCB0aGUgZGlzY2FyZCBzdXBwb3J0IGJpdCBhdCB2NC41CisJICogdXNlIHRoZSBzL3cgZmVhdHVyZSBzdXBwb3J0IGZpbGVkLgorCSAqLworCWlmIChjYXJkLT5leHRfY3NkLmZlYXR1cmVfc3VwcG9ydCAmIE1NQ19ESVNDQVJEX0ZFQVRVUkUpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChtbWNfY2FuX2Rpc2NhcmQpOworCitpbnQgbW1jX2Nhbl9zYW5pdGl6ZShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJaWYgKGNhcmQtPmV4dF9jc2Quc2VjX2ZlYXR1cmVfc3VwcG9ydCAmIEVYVF9DU0RfU0VDX1NBTklUSVpFKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobW1jX2Nhbl9zYW5pdGl6ZSk7CisKIGludCBtbWNfY2FuX3NlY3VyZV9lcmFzZV90cmltKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKIHsKIAlpZiAoY2FyZC0+ZXh0X2NzZC5zZWNfZmVhdHVyZV9zdXBwb3J0ICYgRVhUX0NTRF9TRUNfRVJfRU4pCkBAIC0xNzI3LDYgKzE5MDEsOTQgQEAKIH0KIEVYUE9SVF9TWU1CT0wobW1jX3NldF9ibG9ja2xlbik7CiAKK3N0YXRpYyB2b2lkIG1tY19od19yZXNldF9mb3JfaW5pdChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJaWYgKCEoaG9zdC0+Y2FwcyAmIE1NQ19DQVBfSFdfUkVTRVQpIHx8ICFob3N0LT5vcHMtPmh3X3Jlc2V0KQorCQlyZXR1cm47CisJbW1jX2hvc3RfY2xrX2hvbGQoaG9zdCk7CisJaG9zdC0+b3BzLT5od19yZXNldChob3N0KTsKKwltbWNfaG9zdF9jbGtfcmVsZWFzZShob3N0KTsKK30KKworaW50IG1tY19jYW5fcmVzZXQoc3RydWN0IG1tY19jYXJkICpjYXJkKQoreworCXU4IHJzdF9uX2Z1bmN0aW9uOworCisJaWYgKCFtbWNfY2FyZF9tbWMoY2FyZCkpCisJCXJldHVybiAwOworCXJzdF9uX2Z1bmN0aW9uID0gY2FyZC0+ZXh0X2NzZC5yc3Rfbl9mdW5jdGlvbjsKKwlpZiAoKHJzdF9uX2Z1bmN0aW9uICYgRVhUX0NTRF9SU1RfTl9FTl9NQVNLKSAhPSBFWFRfQ1NEX1JTVF9OX0VOQUJMRUQpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChtbWNfY2FuX3Jlc2V0KTsKKworc3RhdGljIGludCBtbWNfZG9faHdfcmVzZXQoc3RydWN0IG1tY19ob3N0ICpob3N0LCBpbnQgY2hlY2spCit7CisJc3RydWN0IG1tY19jYXJkICpjYXJkID0gaG9zdC0+Y2FyZDsKKworCWlmICghaG9zdC0+YnVzX29wcy0+cG93ZXJfcmVzdG9yZSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEoaG9zdC0+Y2FwcyAmIE1NQ19DQVBfSFdfUkVTRVQpIHx8ICFob3N0LT5vcHMtPmh3X3Jlc2V0KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIWNhcmQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFtbWNfY2FuX3Jlc2V0KGNhcmQpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltbWNfaG9zdF9jbGtfaG9sZChob3N0KTsKKwltbWNfc2V0X2Nsb2NrKGhvc3QsIGhvc3QtPmZfaW5pdCk7CisKKwlob3N0LT5vcHMtPmh3X3Jlc2V0KGhvc3QpOworCisJLyogSWYgdGhlIHJlc2V0IGhhcyBoYXBwZW5lZCwgdGhlbiBhIHN0YXR1cyBjb21tYW5kIHdpbGwgZmFpbCAqLworCWlmIChjaGVjaykgeworCQlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OworCQlpbnQgZXJyOworCisJCWNtZC5vcGNvZGUgPSBNTUNfU0VORF9TVEFUVVM7CisJCWlmICghbW1jX2hvc3RfaXNfc3BpKGNhcmQtPmhvc3QpKQorCQkJY21kLmFyZyA9IGNhcmQtPnJjYSA8PCAxNjsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9TUElfUjIgfCBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BQzsKKwkJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChjYXJkLT5ob3N0LCAmY21kLCAwKTsKKwkJaWYgKCFlcnIpIHsKKwkJCW1tY19ob3N0X2Nsa19yZWxlYXNlKGhvc3QpOworCQkJcmV0dXJuIC1FTk9TWVM7CisJCX0KKwl9CisKKwlob3N0LT5jYXJkLT5zdGF0ZSAmPSB+KE1NQ19TVEFURV9ISUdIU1BFRUQgfCBNTUNfU1RBVEVfSElHSFNQRUVEX0REUik7CisJaWYgKG1tY19ob3N0X2lzX3NwaShob3N0KSkgeworCQlob3N0LT5pb3MuY2hpcF9zZWxlY3QgPSBNTUNfQ1NfSElHSDsKKwkJaG9zdC0+aW9zLmJ1c19tb2RlID0gTU1DX0JVU01PREVfUFVTSFBVTEw7CisJfSBlbHNlIHsKKwkJaG9zdC0+aW9zLmNoaXBfc2VsZWN0ID0gTU1DX0NTX0RPTlRDQVJFOworCQlob3N0LT5pb3MuYnVzX21vZGUgPSBNTUNfQlVTTU9ERV9PUEVORFJBSU47CisJfQorCWhvc3QtPmlvcy5idXNfd2lkdGggPSBNTUNfQlVTX1dJRFRIXzE7CisJaG9zdC0+aW9zLnRpbWluZyA9IE1NQ19USU1JTkdfTEVHQUNZOworCW1tY19zZXRfaW9zKGhvc3QpOworCisJbW1jX2hvc3RfY2xrX3JlbGVhc2UoaG9zdCk7CisKKwlyZXR1cm4gaG9zdC0+YnVzX29wcy0+cG93ZXJfcmVzdG9yZShob3N0KTsKK30KKworaW50IG1tY19od19yZXNldChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIG1tY19kb19od19yZXNldChob3N0LCAwKTsKK30KK0VYUE9SVF9TWU1CT0wobW1jX2h3X3Jlc2V0KTsKKworaW50IG1tY19od19yZXNldF9jaGVjayhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIG1tY19kb19od19yZXNldChob3N0LCAxKTsKK30KK0VYUE9SVF9TWU1CT0wobW1jX2h3X3Jlc2V0X2NoZWNrKTsKKwogc3RhdGljIGludCBtbWNfcmVzY2FuX3RyeV9mcmVxKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdW5zaWduZWQgZnJlcSkKIHsKIAlob3N0LT5mX2luaXQgPSBmcmVxOwpAQCAtMTczOCw2ICsyMDAwLDEyIEBACiAJbW1jX3Bvd2VyX3VwKGhvc3QpOwogCiAJLyoKKwkgKiBTb21lIGVNTUNzICh3aXRoIFZDQ1EgYWx3YXlzIG9uKSBtYXkgbm90IGJlIHJlc2V0IGFmdGVyIHBvd2VyIHVwLCBzbworCSAqIGRvIGEgaGFyZHdhcmUgcmVzZXQgaWYgcG9zc2libGUuCisJICovCisJbW1jX2h3X3Jlc2V0X2Zvcl9pbml0KGhvc3QpOworCisJLyoKIAkgKiBzZGlvX3Jlc2V0IHNlbmRzIENNRDUyIHRvIHJlc2V0IGNhcmQuICBTaW5jZSB3ZSBkbyBub3Qga25vdwogCSAqIGlmIHRoZSBjYXJkIGlzIGJlaW5nIHJlLWluaXRpYWxpemVkLCBqdXN0IHNlbmQgaXQuICBDTUQ1MgogCSAqIHNob3VsZCBiZSBpZ25vcmVkIGJ5IFNEL2VNTUMgY2FyZHMuCkBAIC0xODQ1LDYgKzIxMTMsNyBAQAogCiAJCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogCQltbWNfZGV0YWNoX2J1cyhob3N0KTsKKwkJbW1jX3Bvd2VyX29mZihob3N0KTsKIAkJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAkJbW1jX2J1c19wdXQoaG9zdCk7CiAJCXJldHVybjsKQEAgLTE5NDYsNiArMjIxNSw2NSBAQAogfQogRVhQT1JUX1NZTUJPTChtbWNfY2FyZF9jYW5fc2xlZXApOwogCisvKgorICogRmx1c2ggdGhlIGNhY2hlIHRvIHRoZSBub24tdm9sYXRpbGUgc3RvcmFnZS4KKyAqLworaW50IG1tY19mbHVzaF9jYWNoZShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gY2FyZC0+aG9zdDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghKGhvc3QtPmNhcHMyICYgTU1DX0NBUDJfQ0FDSEVfQ1RSTCkpCisJCXJldHVybiBlcnI7CisKKwlpZiAobW1jX2NhcmRfbW1jKGNhcmQpICYmCisJCQkoY2FyZC0+ZXh0X2NzZC5jYWNoZV9zaXplID4gMCkgJiYKKwkJCShjYXJkLT5leHRfY3NkLmNhY2hlX2N0cmwgJiAxKSkgeworCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCisJCQkJRVhUX0NTRF9GTFVTSF9DQUNIRSwgMSwgMCk7CisJCWlmIChlcnIpCisJCQlwcl9lcnIoIiVzOiBjYWNoZSBmbHVzaCBlcnJvciAlZFxuIiwKKwkJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBlcnIpOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKG1tY19mbHVzaF9jYWNoZSk7CisKKy8qCisgKiBUdXJuIHRoZSBjYWNoZSBPTi9PRkYuCisgKiBUdXJuaW5nIHRoZSBjYWNoZSBPRkYgc2hhbGwgdHJpZ2dlciBmbHVzaGluZyBvZiB0aGUgZGF0YQorICogdG8gdGhlIG5vbi12b2xhdGlsZSBzdG9yYWdlLgorICovCitpbnQgbW1jX2NhY2hlX2N0cmwoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1OCBlbmFibGUpCit7CisJc3RydWN0IG1tY19jYXJkICpjYXJkID0gaG9zdC0+Y2FyZDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghKGhvc3QtPmNhcHMyICYgTU1DX0NBUDJfQ0FDSEVfQ1RSTCkgfHwKKwkJCW1tY19jYXJkX2lzX3JlbW92YWJsZShob3N0KSkKKwkJcmV0dXJuIGVycjsKKworCWlmIChjYXJkICYmIG1tY19jYXJkX21tYyhjYXJkKSAmJgorCQkJKGNhcmQtPmV4dF9jc2QuY2FjaGVfc2l6ZSA+IDApKSB7CisJCWVuYWJsZSA9ICEhZW5hYmxlOworCisJCWlmIChjYXJkLT5leHRfY3NkLmNhY2hlX2N0cmwgXiBlbmFibGUpCisJCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCisJCQkJCUVYVF9DU0RfQ0FDSEVfQ1RSTCwgZW5hYmxlLCAwKTsKKwkJaWYgKGVycikKKwkJCXByX2VycigiJXM6IGNhY2hlICVzIGVycm9yICVkXG4iLAorCQkJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCisJCQkJCWVuYWJsZSA/ICJvbiIgOiAib2ZmIiwKKwkJCQkJZXJyKTsKKwkJZWxzZQorCQkJY2FyZC0+ZXh0X2NzZC5jYWNoZV9jdHJsID0gZW5hYmxlOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKG1tY19jYWNoZV9jdHJsKTsKKwogI2lmZGVmIENPTkZJR19QTQogCiAvKioKQEAgLTE5NjAsMjMgKzIyODgsMzkgQEAKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaG9zdC0+ZGlzYWJsZSk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaG9zdC0+ZGV0ZWN0KTsKIAltbWNfZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwllcnIgPSBtbWNfY2FjaGVfY3RybChob3N0LCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKIAogCW1tY19idXNfZ2V0KGhvc3QpOwogCWlmIChob3N0LT5idXNfb3BzICYmICFob3N0LT5idXNfZGVhZCkgewotCQlpZiAoaG9zdC0+YnVzX29wcy0+c3VzcGVuZCkKLQkJCWVyciA9IGhvc3QtPmJ1c19vcHMtPnN1c3BlbmQoaG9zdCk7Ci0JCWlmIChlcnIgPT0gLUVOT1NZUyB8fCAhaG9zdC0+YnVzX29wcy0+cmVzdW1lKSB7Ci0JCQkvKgotCQkJICogV2Ugc2ltcGx5ICJyZW1vdmUiIHRoZSBjYXJkIGluIHRoaXMgY2FzZS4KLQkJCSAqIEl0IHdpbGwgYmUgcmVkZXRlY3RlZCBvbiByZXN1bWUuCi0JCQkgKi8KLQkJCWlmIChob3N0LT5idXNfb3BzLT5yZW1vdmUpCi0JCQkJaG9zdC0+YnVzX29wcy0+cmVtb3ZlKGhvc3QpOwotCQkJbW1jX2NsYWltX2hvc3QoaG9zdCk7Ci0JCQltbWNfZGV0YWNoX2J1cyhob3N0KTsKLQkJCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7Ci0JCQlob3N0LT5wbV9mbGFncyA9IDA7Ci0JCQllcnIgPSAwOworCisJCS8qCisJCSAqIEEgbG9uZyByZXNwb25zZSB0aW1lIGlzIG5vdCBhY2NlcHRhYmxlIGZvciBkZXZpY2UgZHJpdmVycworCQkgKiB3aGVuIGRvaW5nIHN1c3BlbmQuIFByZXZlbnQgbW1jX2NsYWltX2hvc3QgaW4gdGhlIHN1c3BlbmQKKwkJICogc2VxdWVuY2UsIHRvIHBvdGVudGlhbGx5IHdhaXQgImZvcmV2ZXIiIGJ5IHRyeWluZyB0bworCQkgKiBwcmUtY2xhaW0gdGhlIGhvc3QuCisJCSAqLworCQlpZiAobW1jX3RyeV9jbGFpbV9ob3N0KGhvc3QpKSB7CisJCQlpZiAoaG9zdC0+YnVzX29wcy0+c3VzcGVuZCkKKwkJCQllcnIgPSBob3N0LT5idXNfb3BzLT5zdXNwZW5kKGhvc3QpOworCQkJaWYgKGVyciA9PSAtRU5PU1lTIHx8ICFob3N0LT5idXNfb3BzLT5yZXN1bWUpIHsKKwkJCQkvKgorCQkJCSAqIFdlIHNpbXBseSAicmVtb3ZlIiB0aGUgY2FyZCBpbiB0aGlzIGNhc2UuCisJCQkJICogSXQgd2lsbCBiZSByZWRldGVjdGVkIG9uIHJlc3VtZS4KKwkJCQkgKi8KKwkJCQlpZiAoaG9zdC0+YnVzX29wcy0+cmVtb3ZlKQorCQkJCQlob3N0LT5idXNfb3BzLT5yZW1vdmUoaG9zdCk7CisJCQkJbW1jX2NsYWltX2hvc3QoaG9zdCk7CisJCQkJbW1jX2RldGFjaF9idXMoaG9zdCk7CisJCQkJbW1jX3Bvd2VyX29mZihob3N0KTsKKwkJCQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOworCQkJCWhvc3QtPnBtX2ZsYWdzID0gMDsKKwkJCQllcnIgPSAwOworCQkJfQorCQkJbW1jX2RvX3JlbGVhc2VfaG9zdChob3N0KTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IC1FQlVTWTsKIAkJfQogCX0KIAltbWNfYnVzX3B1dChob3N0KTsKQEAgLTE5ODQsNiArMjMyOCw3IEBACiAJaWYgKCFlcnIgJiYgIW1tY19jYXJkX2tlZXBfcG93ZXIoaG9zdCkpCiAJCW1tY19wb3dlcl9vZmYoaG9zdCk7CiAKK291dDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMDE4LDcgKzIzNjMsNyBAQAogCQlCVUdfT04oIWhvc3QtPmJ1c19vcHMtPnJlc3VtZSk7CiAJCWVyciA9IGhvc3QtPmJ1c19vcHMtPnJlc3VtZShob3N0KTsKIAkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGVycm9yICVkIGR1cmluZyByZXN1bWUgIgorCQkJcHJfd2FybmluZygiJXM6IGVycm9yICVkIGR1cmluZyByZXN1bWUgIgogCQkJCQkgICAgIihjYXJkIHdhcyByZW1vdmVkPylcbiIsCiAJCQkJCSAgICBtbWNfaG9zdG5hbWUoaG9zdCksIGVycik7CiAJCQllcnIgPSAwOwpAQCAtMjA0OSw2ICsyMzk0LDcgQEAKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCQlob3N0LT5yZXNjYW5fZGlzYWJsZSA9IDE7CisJCWhvc3QtPnBvd2VyX25vdGlmeV90eXBlID0gTU1DX0hPU1RfUFdfTk9USUZZX1NIT1JUOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaG9zdC0+ZGV0ZWN0KTsKIApAQCAtMjA2MSw2ICsyNDA3LDcgQEAKIAkJCWhvc3QtPmJ1c19vcHMtPnJlbW92ZShob3N0KTsKIAogCQltbWNfZGV0YWNoX2J1cyhob3N0KTsKKwkJbW1jX3Bvd2VyX29mZihob3N0KTsKIAkJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAkJaG9zdC0+cG1fZmxhZ3MgPSAwOwogCQlicmVhazsKQEAgLTIwNzEsNiArMjQxOCw3IEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAkJaG9zdC0+cmVzY2FuX2Rpc2FibGUgPSAwOworCQlob3N0LT5wb3dlcl9ub3RpZnlfdHlwZSA9IE1NQ19IT1NUX1BXX05PVElGWV9MT05HOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaCBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5oCmluZGV4IGQ5NDExZWQuLjE0NjY0ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5oCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5oCkBAIC00Myw2ICs0Myw3IEBACiAJCQkgICBib29sIGNtZDExKTsKIHZvaWQgbW1jX3NldF90aW1pbmcoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgdGltaW5nKTsKIHZvaWQgbW1jX3NldF9kcml2ZXJfdHlwZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCBkcnZfdHlwZSk7Cit2b2lkIG1tY19wb3dlcl9vZmYoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKIAogc3RhdGljIGlubGluZSB2b2lkIG1tY19kZWxheSh1bnNpZ25lZCBpbnQgbXMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2RlYnVnZnMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvZGVidWdmcy5jCmluZGV4IDk5ODc5N2UuLjM5MjM4ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvZGVidWdmcy5jCkBAIC03LDExICs3LDE0IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KQEAgLTE5LDYgKzIyLDE0IEBACiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgIm1tY19vcHMuaCIKIAorI2lmZGVmIENPTkZJR19GQUlMX01NQ19SRVFVRVNUCisKK3N0YXRpYyBERUNMQVJFX0ZBVUxUX0FUVFIoZmFpbF9kZWZhdWx0X2F0dHIpOworc3RhdGljIGNoYXIgKmZhaWxfcmVxdWVzdDsKK21vZHVsZV9wYXJhbShmYWlsX3JlcXVlc3QsIGNoYXJwLCAwKTsKKworI2VuZGlmIC8qIENPTkZJR19GQUlMX01NQ19SRVFVRVNUICovCisKIC8qIFRoZSBkZWJ1Z2ZzIGZ1bmN0aW9ucyBhcmUgb3B0aW1pemVkIGF3YXkgd2hlbiBDT05GSUdfREVCVUdfRlMgaXNuJ3Qgc2V0LiAqLwogc3RhdGljIGludCBtbWNfaW9zX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpkYXRhKQogewpAQCAtMTEzLDYgKzEyNCwxNSBAQAogCWNhc2UgTU1DX1RJTUlOR19TRF9IUzoKIAkJc3RyID0gInNkIGhpZ2gtc3BlZWQiOwogCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfVUhTX1NEUjUwOgorCQlzdHIgPSAic2QgdWhzIFNEUjUwIjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1VIU19TRFIxMDQ6CisJCXN0ciA9ICJzZCB1aHMgU0RSMTA0IjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1VIU19ERFI1MDoKKwkJc3RyID0gInNkIHVocyBERFI1MCI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXN0ciA9ICJpbnZhbGlkIjsKIAkJYnJlYWs7CkBAIC0xODgsNiArMjA4LDE1IEBACiAJCQkJcm9vdCwgJmhvc3QtPmNsa19kZWxheSkpCiAJCWdvdG8gZXJyX25vZGU7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkFJTF9NTUNfUkVRVUVTVAorCWlmIChmYWlsX3JlcXVlc3QpCisJCXNldHVwX2ZhdWx0X2F0dHIoJmZhaWxfZGVmYXVsdF9hdHRyLCBmYWlsX3JlcXVlc3QpOworCWhvc3QtPmZhaWxfbW1jX3JlcXVlc3QgPSBmYWlsX2RlZmF1bHRfYXR0cjsKKwlpZiAoSVNfRVJSKGZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIoImZhaWxfbW1jX3JlcXVlc3QiLAorCQkJCQkgICAgIHJvb3QsCisJCQkJCSAgICAgJmhvc3QtPmZhaWxfbW1jX3JlcXVlc3QpKSkKKwkJZ290byBlcnJfbm9kZTsKKyNlbmRpZgogCXJldHVybjsKIAogZXJyX25vZGU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYyBiL2RyaXZlcnMvbW1jL2NvcmUvaG9zdC5jCmluZGV4IDc5M2QwYTAuLmU4YTVlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvaG9zdC5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvaG9zdC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgpAQCAtMzAxLDYgKzMwMiwxNyBAQAogCWhvc3QtPm1heF9ibGtfc2l6ZSA9IDUxMjsKIAlob3N0LT5tYXhfYmxrX2NvdW50ID0gUEFHRV9DQUNIRV9TSVpFIC8gNTEyOwogCisJLyoKKwkgKiBFbmFibGUgcnVudGltZSBwb3dlciBtYW5hZ2VtZW50IGJ5IGRlZmF1bHQuIFRoaXMgZmxhZyB3YXMgYWRkZWQgZHVlCisJICogdG8gcnVudGltZSBwb3dlciBtYW5hZ2VtZW50IGNhdXNpbmcgZGlzcnVwdGlvbiBmb3Igc29tZSB1c2VycywgYnV0CisJICogdGhlIHBvd2VyIG9uL29mZiBjb2RlIGhhcyBiZWVuIGltcHJvdmVkIHNpbmNlIHRoZW4uCisJICoKKwkgKiBXZSdsbCBlbmFibGUgdGhpcyBmbGFnIGJ5IGRlZmF1bHQgYXMgYW4gZXhwZXJpbWVudCwgYW5kIGlmIG5vCisJICogcHJvYmxlbXMgYXJlIHJlcG9ydGVkLCB3ZSB3aWxsIGZvbGxvdyB1cCBsYXRlciBhbmQgcmVtb3ZlIHRoZSBmbGFnCisJICogYWx0b2dldGhlci4KKwkgKi8KKwlob3N0LT5jYXBzID0gTU1DX0NBUF9QT1dFUl9PRkZfQ0FSRDsKKwogCXJldHVybiBob3N0OwogCiBmcmVlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKaW5kZXggNTcwMGIxYy4uZGJmNDIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgpAQCAtMTAxLDcgKzEwMiw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FyZCBoYXMgdW5rbm93biBNTUNBIHZlcnNpb24gJWRcbiIsCisJCXByX2VycigiJXM6IGNhcmQgaGFzIHVua25vd24gTU1DQSB2ZXJzaW9uICVkXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBjYXJkLT5jc2QubW1jYV92c24pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMzUsNyArMTM2LDcgQEAKIAkgKi8KIAljc2QtPnN0cnVjdHVyZSA9IFVOU1RVRkZfQklUUyhyZXNwLCAxMjYsIDIpOwogCWlmIChjc2QtPnN0cnVjdHVyZSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVucmVjb2duaXNlZCBDU0Qgc3RydWN0dXJlIHZlcnNpb24gJWRcbiIsCisJCXByX2VycigiJXM6IHVucmVjb2duaXNlZCBDU0Qgc3RydWN0dXJlIHZlcnNpb24gJWRcbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNzZC0+c3RydWN0dXJlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTk1LDcgKzE5Niw3IEBACiAJICovCiAJZXh0X2NzZCA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWV4dF9jc2QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVmZmVyIHRvICIKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVmZmVyIHRvICIKIAkJCSJyZWNlaXZlIHRoZSBleHRfY3NkLlxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjE3LDEyICsyMTgsMTIgQEAKIAkJICogc3RvcmVkIGluIHRoZWlyIENTRC4KIAkJICovCiAJCWlmIChjYXJkLT5jc2QuY2FwYWNpdHkgPT0gKDQwOTYgKiA1MTIpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVhZCBFWFRfQ1NEICIKKwkJCXByX2VycigiJXM6IHVuYWJsZSB0byByZWFkIEVYVF9DU0QgIgogCQkJCSJvbiBhIHBvc3NpYmxlIGhpZ2ggY2FwYWNpdHkgY2FyZC4gIgogCQkJCSJDYXJkIHdpbGwgYmUgaWdub3JlZC5cbiIsCiAJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gcmVhZCAiCisJCQlwcl93YXJuaW5nKCIlczogdW5hYmxlIHRvIHJlYWQgIgogCQkJCSJFWFRfQ1NELCBwZXJmb3JtYW5jZSBtaWdodCAiCiAJCQkJInN1ZmZlci5cbiIsCiAJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKQEAgLTIzOSw3ICsyNDAsOSBAQAogICovCiBzdGF0aWMgaW50IG1tY19yZWFkX2V4dF9jc2Qoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1OCAqZXh0X2NzZCkKIHsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyID0gMCwgaWR4OworCXVuc2lnbmVkIGludCBwYXJ0X3NpemU7CisJdTggaGNfZXJhc2VfZ3JwX3N6ID0gMCwgaGNfd3BfZ3JwX3N6ID0gMDsKIAogCUJVR19PTighY2FyZCk7CiAKQEAgLTI1MCw3ICsyNTMsNyBAQAogCWNhcmQtPmV4dF9jc2QucmF3X2V4dF9jc2Rfc3RydWN0dXJlID0gZXh0X2NzZFtFWFRfQ1NEX1NUUlVDVFVSRV07CiAJaWYgKGNhcmQtPmNzZC5zdHJ1Y3R1cmUgPT0gMykgewogCQlpZiAoY2FyZC0+ZXh0X2NzZC5yYXdfZXh0X2NzZF9zdHJ1Y3R1cmUgPiAyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bnJlY29nbmlzZWQgRVhUX0NTRCBzdHJ1Y3R1cmUgIgorCQkJcHJfZXJyKCIlczogdW5yZWNvZ25pc2VkIEVYVF9DU0Qgc3RydWN0dXJlICIKIAkJCQkidmVyc2lvbiAlZFxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAogCQkJCQljYXJkLT5leHRfY3NkLnJhd19leHRfY3NkX3N0cnVjdHVyZSk7CiAJCQllcnIgPSAtRUlOVkFMOwpAQCAtMjYwLDcgKzI2Myw3IEBACiAKIAljYXJkLT5leHRfY3NkLnJldiA9IGV4dF9jc2RbRVhUX0NTRF9SRVZdOwogCWlmIChjYXJkLT5leHRfY3NkLnJldiA+IDYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pc2VkIEVYVF9DU0QgcmV2aXNpb24gJWRcbiIsCisJCXByX2VycigiJXM6IHVucmVjb2duaXNlZCBFWFRfQ1NEIHJldmlzaW9uICVkXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBjYXJkLT5leHRfY3NkLnJldik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtMzA2LDcgKzMwOSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIE1NQyB2NCBzcGVjIHNheXMgdGhpcyBjYW5ub3QgaGFwcGVuICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYXJkIGlzIG1tYyB2NCBidXQgZG9lc24ndCAiCisJCXByX3dhcm5pbmcoIiVzOiBjYXJkIGlzIG1tYyB2NCBidXQgZG9lc24ndCAiCiAJCQkic3VwcG9ydCBhbnkgaGlnaC1zcGVlZCBtb2Rlcy5cbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCX0KQEAgLTM0MCw3ICszNDMsMTQgQEAKIAkJICogVGhlcmUgYXJlIHR3byBib290IHJlZ2lvbnMgb2YgZXF1YWwgc2l6ZSwgZGVmaW5lZCBpbgogCQkgKiBtdWx0aXBsZXMgb2YgMTI4Sy4KIAkJICovCi0JCWNhcmQtPmV4dF9jc2QuYm9vdF9zaXplID0gZXh0X2NzZFtFWFRfQ1NEX0JPT1RfTVVMVF0gPDwgMTc7CisJCWlmIChleHRfY3NkW0VYVF9DU0RfQk9PVF9NVUxUXSAmJiBtbWNfYm9vdF9wYXJ0aXRpb25fYWNjZXNzKGNhcmQtPmhvc3QpKSB7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IE1NQ19OVU1fQk9PVF9QQVJUSVRJT047IGlkeCsrKSB7CisJCQkJcGFydF9zaXplID0gZXh0X2NzZFtFWFRfQ1NEX0JPT1RfTVVMVF0gPDwgMTc7CisJCQkJbW1jX3BhcnRfYWRkKGNhcmQsIHBhcnRfc2l6ZSwKKwkJCQkJRVhUX0NTRF9QQVJUX0NPTkZJR19BQ0NfQk9PVDAgKyBpZHgsCisJCQkJCSJib290JWQiLCBpZHgsIHRydWUpOworCQkJfQorCQl9CiAJfQogCiAJY2FyZC0+ZXh0X2NzZC5yYXdfaGNfZXJhc2VfZ2FwX3NpemUgPQpAQCAtMzU5LDExICszNjksMTIgQEAKIAkJICogY2FyZCBoYXMgdGhlIEVuaGFuY2VkIGFyZWEgZW5hYmxlZC4gIElmIHNvLCBleHBvcnQgZW5oYW5jZWQKIAkJICogYXJlYSBvZmZzZXQgYW5kIHNpemUgdG8gdXNlciBieSBhZGRpbmcgc3lzZnMgaW50ZXJmYWNlLgogCQkgKi8KKwkJY2FyZC0+ZXh0X2NzZC5yYXdfcGFydGl0aW9uX3N1cHBvcnQgPSBleHRfY3NkW0VYVF9DU0RfUEFSVElUSU9OX1NVUFBPUlRdOwogCQlpZiAoKGV4dF9jc2RbRVhUX0NTRF9QQVJUSVRJT05fU1VQUE9SVF0gJiAweDIpICYmCiAJCSAgICAoZXh0X2NzZFtFWFRfQ1NEX1BBUlRJVElPTl9BVFRSSUJVVEVdICYgMHgxKSkgewotCQkJdTggaGNfZXJhc2VfZ3JwX3N6ID0KKwkJCWhjX2VyYXNlX2dycF9zeiA9CiAJCQkJZXh0X2NzZFtFWFRfQ1NEX0hDX0VSQVNFX0dSUF9TSVpFXTsKLQkJCXU4IGhjX3dwX2dycF9zeiA9CisJCQloY193cF9ncnBfc3ogPQogCQkJCWV4dF9jc2RbRVhUX0NTRF9IQ19XUF9HUlBfU0laRV07CiAKIAkJCWNhcmQtPmV4dF9jc2QuZW5oYW5jZWRfYXJlYV9lbiA9IDE7CkBAIC0zOTIsNiArNDAzLDQxIEBACiAJCQljYXJkLT5leHRfY3NkLmVuaGFuY2VkX2FyZWFfb2Zmc2V0ID0gLUVJTlZBTDsKIAkJCWNhcmQtPmV4dF9jc2QuZW5oYW5jZWRfYXJlYV9zaXplID0gLUVJTlZBTDsKIAkJfQorCisJCS8qCisJCSAqIEdlbmVyYWwgcHVycG9zZSBwYXJ0aXRpb24gZmVhdHVyZSBzdXBwb3J0IC0tCisJCSAqIElmIGV4dF9jc2QgaGFzIHRoZSBzaXplIG9mIGdlbmVyYWwgcHVycG9zZSBwYXJ0aXRpb25zLAorCQkgKiBzZXQgc2l6ZSwgcGFydF9jZmcsIHBhcnRpdGlvbiBuYW1lIGluIG1tY19wYXJ0LgorCQkgKi8KKwkJaWYgKGV4dF9jc2RbRVhUX0NTRF9QQVJUSVRJT05fU1VQUE9SVF0gJgorCQkJRVhUX0NTRF9QQVJUX1NVUFBPUlRfUEFSVF9FTikgeworCQkJaWYgKGNhcmQtPmV4dF9jc2QuZW5oYW5jZWRfYXJlYV9lbiAhPSAxKSB7CisJCQkJaGNfZXJhc2VfZ3JwX3N6ID0KKwkJCQkJZXh0X2NzZFtFWFRfQ1NEX0hDX0VSQVNFX0dSUF9TSVpFXTsKKwkJCQloY193cF9ncnBfc3ogPQorCQkJCQlleHRfY3NkW0VYVF9DU0RfSENfV1BfR1JQX1NJWkVdOworCisJCQkJY2FyZC0+ZXh0X2NzZC5lbmhhbmNlZF9hcmVhX2VuID0gMTsKKwkJCX0KKworCQkJZm9yIChpZHggPSAwOyBpZHggPCBNTUNfTlVNX0dQX1BBUlRJVElPTjsgaWR4KyspIHsKKwkJCQlpZiAoIWV4dF9jc2RbRVhUX0NTRF9HUF9TSVpFX01VTFQgKyBpZHggKiAzXSAmJgorCQkJCSFleHRfY3NkW0VYVF9DU0RfR1BfU0laRV9NVUxUICsgaWR4ICogMyArIDFdICYmCisJCQkJIWV4dF9jc2RbRVhUX0NTRF9HUF9TSVpFX01VTFQgKyBpZHggKiAzICsgMl0pCisJCQkJCWNvbnRpbnVlOworCQkJCXBhcnRfc2l6ZSA9CisJCQkJKGV4dF9jc2RbRVhUX0NTRF9HUF9TSVpFX01VTFQgKyBpZHggKiAzICsgMl0KKwkJCQkJPDwgMTYpICsKKwkJCQkoZXh0X2NzZFtFWFRfQ1NEX0dQX1NJWkVfTVVMVCArIGlkeCAqIDMgKyAxXQorCQkJCQk8PCA4KSArCisJCQkJZXh0X2NzZFtFWFRfQ1NEX0dQX1NJWkVfTVVMVCArIGlkeCAqIDNdOworCQkJCXBhcnRfc2l6ZSAqPSAoc2l6ZV90KShoY19lcmFzZV9ncnBfc3ogKgorCQkJCQloY193cF9ncnBfc3opOworCQkJCW1tY19wYXJ0X2FkZChjYXJkLCBwYXJ0X3NpemUgPDwgMTksCisJCQkJCUVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0dQMCArIGlkeCwKKwkJCQkJImdwJWQiLCBpZHgsIGZhbHNlKTsKKwkJCX0KKwkJfQogCQljYXJkLT5leHRfY3NkLnNlY190cmltX211bHQgPQogCQkJZXh0X2NzZFtFWFRfQ1NEX1NFQ19UUklNX01VTFRdOwogCQljYXJkLT5leHRfY3NkLnNlY19lcmFzZV9tdWx0ID0KQEAgLTQwMiwxNCArNDQ4LDQ4IEBACiAJCQlleHRfY3NkW0VYVF9DU0RfVFJJTV9NVUxUXTsKIAl9CiAKLQlpZiAoY2FyZC0+ZXh0X2NzZC5yZXYgPj0gNSkKLQkJY2FyZC0+ZXh0X2NzZC5yZWxfcGFyYW0gPSBleHRfY3NkW0VYVF9DU0RfV1JfUkVMX1BBUkFNXTsKKwlpZiAoY2FyZC0+ZXh0X2NzZC5yZXYgPj0gNSkgeworCQkvKiBjaGVjayB3aGV0aGVyIHRoZSBlTU1DIGNhcmQgc3VwcG9ydHMgSFBJICovCisJCWlmIChleHRfY3NkW0VYVF9DU0RfSFBJX0ZFQVRVUkVTXSAmIDB4MSkgeworCQkJY2FyZC0+ZXh0X2NzZC5ocGkgPSAxOworCQkJaWYgKGV4dF9jc2RbRVhUX0NTRF9IUElfRkVBVFVSRVNdICYgMHgyKQorCQkJCWNhcmQtPmV4dF9jc2QuaHBpX2NtZCA9CU1NQ19TVE9QX1RSQU5TTUlTU0lPTjsKKwkJCWVsc2UKKwkJCQljYXJkLT5leHRfY3NkLmhwaV9jbWQgPSBNTUNfU0VORF9TVEFUVVM7CisJCQkvKgorCQkJICogSW5kaWNhdGUgdGhlIG1heGltdW0gdGltZW91dCB0byBjbG9zZQorCQkJICogYSBjb21tYW5kIGludGVycnVwdGVkIGJ5IEhQSQorCQkJICovCisJCQljYXJkLT5leHRfY3NkLm91dF9vZl9pbnRfdGltZSA9CisJCQkJZXh0X2NzZFtFWFRfQ1NEX09VVF9PRl9JTlRFUlJVUFRfVElNRV0gKiAxMDsKKwkJfQogCisJCWNhcmQtPmV4dF9jc2QucmVsX3BhcmFtID0gZXh0X2NzZFtFWFRfQ1NEX1dSX1JFTF9QQVJBTV07CisJCWNhcmQtPmV4dF9jc2QucnN0X25fZnVuY3Rpb24gPSBleHRfY3NkW0VYVF9DU0RfUlNUX05fRlVOQ1RJT05dOworCX0KKworCWNhcmQtPmV4dF9jc2QucmF3X2VyYXNlZF9tZW1fY291bnQgPSBleHRfY3NkW0VYVF9DU0RfRVJBU0VEX01FTV9DT05UXTsKIAlpZiAoZXh0X2NzZFtFWFRfQ1NEX0VSQVNFRF9NRU1fQ09OVF0pCiAJCWNhcmQtPmVyYXNlZF9ieXRlID0gMHhGRjsKIAllbHNlCiAJCWNhcmQtPmVyYXNlZF9ieXRlID0gMHgwOwogCisJLyogZU1NQyB2NC41IG9yIGxhdGVyICovCisJaWYgKGNhcmQtPmV4dF9jc2QucmV2ID49IDYpIHsKKwkJY2FyZC0+ZXh0X2NzZC5mZWF0dXJlX3N1cHBvcnQgfD0gTU1DX0RJU0NBUkRfRkVBVFVSRTsKKworCQljYXJkLT5leHRfY3NkLmdlbmVyaWNfY21kNl90aW1lID0gMTAgKgorCQkJZXh0X2NzZFtFWFRfQ1NEX0dFTkVSSUNfQ01ENl9USU1FXTsKKwkJY2FyZC0+ZXh0X2NzZC5wb3dlcl9vZmZfbG9uZ3RpbWUgPSAxMCAqCisJCQlleHRfY3NkW0VYVF9DU0RfUE9XRVJfT0ZGX0xPTkdfVElNRV07CisKKwkJY2FyZC0+ZXh0X2NzZC5jYWNoZV9zaXplID0KKwkJCWV4dF9jc2RbRVhUX0NTRF9DQUNIRV9TSVpFICsgMF0gPDwgMCB8CisJCQlleHRfY3NkW0VYVF9DU0RfQ0FDSEVfU0laRSArIDFdIDw8IDggfAorCQkJZXh0X2NzZFtFWFRfQ1NEX0NBQ0hFX1NJWkUgKyAyXSA8PCAxNiB8CisJCQlleHRfY3NkW0VYVF9DU0RfQ0FDSEVfU0laRSArIDNdIDw8IDI0OworCX0KKwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC01MzAsNiArNjEwLDg2IEBACiB9OwogCiAvKgorICogU2VsZWN0IHRoZSBQb3dlckNsYXNzIGZvciB0aGUgY3VycmVudCBidXMgd2lkdGgKKyAqIElmIHBvd2VyIGNsYXNzIGlzIGRlZmluZWQgZm9yIDQvOCBiaXQgYnVzIGluIHRoZQorICogZXh0ZW5kZWQgQ1NEIHJlZ2lzdGVyLCBzZWxlY3QgaXQgYnkgZXhlY3V0aW5nIHRoZQorICogbW1jX3N3aXRjaCBjb21tYW5kLgorICovCitzdGF0aWMgaW50IG1tY19zZWxlY3RfcG93ZXJjbGFzcyhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCisJCXVuc2lnbmVkIGludCBidXNfd2lkdGgsIHU4ICpleHRfY3NkKQoreworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGludCBwd3JjbGFzc192YWw7CisJdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKwlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3Q7CisKKwlCVUdfT04oIWNhcmQpOworCisJaG9zdCA9IGNhcmQtPmhvc3Q7CisJQlVHX09OKCFob3N0KTsKKworCWlmIChleHRfY3NkID09IE5VTEwpCisJCXJldHVybiAwOworCisJLyogUG93ZXIgY2xhc3Mgc2VsZWN0aW9uIGlzIHN1cHBvcnRlZCBmb3IgdmVyc2lvbnMgPj0gNC4wICovCisJaWYgKGNhcmQtPmNzZC5tbWNhX3ZzbiA8IENTRF9TUEVDX1ZFUl80KQorCQlyZXR1cm4gMDsKKworCS8qIFBvd2VyIGNsYXNzIHZhbHVlcyBhcmUgZGVmaW5lZCBvbmx5IGZvciA0LzggYml0IGJ1cyAqLworCWlmIChidXNfd2lkdGggPT0gRVhUX0NTRF9CVVNfV0lEVEhfMSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKDEgPDwgaG9zdC0+aW9zLnZkZCkgeworCWNhc2UgTU1DX1ZERF8xNjVfMTk1OgorCQlpZiAoaG9zdC0+aW9zLmNsb2NrIDw9IDI2MDAwMDAwKQorCQkJaW5kZXggPSBFWFRfQ1NEX1BXUl9DTF8yNl8xOTU7CisJCWVsc2UgaWYJKGhvc3QtPmlvcy5jbG9jayA8PSA1MjAwMDAwMCkKKwkJCWluZGV4ID0gKGJ1c193aWR0aCA8PSBFWFRfQ1NEX0JVU19XSURUSF84KSA/CisJCQkJRVhUX0NTRF9QV1JfQ0xfNTJfMTk1IDoKKwkJCQlFWFRfQ1NEX1BXUl9DTF9ERFJfNTJfMTk1OworCQllbHNlIGlmIChob3N0LT5pb3MuY2xvY2sgPD0gMjAwMDAwMDAwKQorCQkJaW5kZXggPSBFWFRfQ1NEX1BXUl9DTF8yMDBfMTk1OworCQlicmVhazsKKwljYXNlIE1NQ19WRERfMzJfMzM6CisJY2FzZSBNTUNfVkREXzMzXzM0OgorCWNhc2UgTU1DX1ZERF8zNF8zNToKKwljYXNlIE1NQ19WRERfMzVfMzY6CisJCWlmIChob3N0LT5pb3MuY2xvY2sgPD0gMjYwMDAwMDApCisJCQlpbmRleCA9IEVYVF9DU0RfUFdSX0NMXzI2XzM2MDsKKwkJZWxzZSBpZgkoaG9zdC0+aW9zLmNsb2NrIDw9IDUyMDAwMDAwKQorCQkJaW5kZXggPSAoYnVzX3dpZHRoIDw9IEVYVF9DU0RfQlVTX1dJRFRIXzgpID8KKwkJCQlFWFRfQ1NEX1BXUl9DTF81Ml8zNjAgOgorCQkJCUVYVF9DU0RfUFdSX0NMX0REUl81Ml8zNjA7CisJCWVsc2UgaWYgKGhvc3QtPmlvcy5jbG9jayA8PSAyMDAwMDAwMDApCisJCQlpbmRleCA9IEVYVF9DU0RfUFdSX0NMXzIwMF8zNjA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX3dhcm5pbmcoIiVzOiBWb2x0YWdlIHJhbmdlIG5vdCBzdXBwb3J0ZWQgIgorCQkJICAgImZvciBwb3dlciBjbGFzcy5cbiIsIG1tY19ob3N0bmFtZShob3N0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXB3cmNsYXNzX3ZhbCA9IGV4dF9jc2RbaW5kZXhdOworCisJaWYgKGJ1c193aWR0aCAmIChFWFRfQ1NEX0JVU19XSURUSF84IHwgRVhUX0NTRF9ERFJfQlVTX1dJRFRIXzgpKQorCQlwd3JjbGFzc192YWwgPSAocHdyY2xhc3NfdmFsICYgRVhUX0NTRF9QV1JfQ0xfOEJJVF9NQVNLKSA+PgorCQkJCUVYVF9DU0RfUFdSX0NMXzhCSVRfU0hJRlQ7CisJZWxzZQorCQlwd3JjbGFzc192YWwgPSAocHdyY2xhc3NfdmFsICYgRVhUX0NTRF9QV1JfQ0xfNEJJVF9NQVNLKSA+PgorCQkJCUVYVF9DU0RfUFdSX0NMXzRCSVRfU0hJRlQ7CisKKwkvKiBJZiB0aGUgcG93ZXIgY2xhc3MgaXMgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgdmFsdWUgKi8KKwlpZiAocHdyY2xhc3NfdmFsID4gMCkgeworCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCisJCQkJIEVYVF9DU0RfUE9XRVJfQ0xBU1MsCisJCQkJIHB3cmNsYXNzX3ZhbCwKKwkJCQkgY2FyZC0+ZXh0X2NzZC5nZW5lcmljX2NtZDZfdGltZSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoKICAqIEhhbmRsZSB0aGUgZGV0ZWN0aW9uIGFuZCBpbml0aWFsaXNhdGlvbiBvZiBhIGNhcmQuCiAgKgogICogSW4gdGhlIGNhc2Ugb2YgYSByZXN1bWUsICJvbGRjYXJkIiB3aWxsIGNvbnRhaW4gdGhlIGNhcmQKQEAgLTU0OCwxMSArNzA4LDE2IEBACiAJQlVHX09OKCFob3N0KTsKIAlXQVJOX09OKCFob3N0LT5jbGFpbWVkKTsKIAorCS8qIFNldCBjb3JyZWN0IGJ1cyBtb2RlIGZvciBNTUMgYmVmb3JlIGF0dGVtcHRpbmcgaW5pdCAqLworCWlmICghbW1jX2hvc3RfaXNfc3BpKGhvc3QpKQorCQltbWNfc2V0X2J1c19tb2RlKGhvc3QsIE1NQ19CVVNNT0RFX09QRU5EUkFJTik7CisKIAkvKgogCSAqIFNpbmNlIHdlJ3JlIGNoYW5naW5nIHRoZSBPQ1IgdmFsdWUsIHdlIHNlZW0gdG8KIAkgKiBuZWVkIHRvIHRlbGwgc29tZSBjYXJkcyB0byBnbyBiYWNrIHRvIHRoZSBpZGxlCiAJICogc3RhdGUuICBXZSB3YWl0IDFtcyB0byBnaXZlIGNhcmRzIHRpbWUgdG8KIAkgKiByZXNwb25kLgorCSAqIG1tY19nb19pZGxlIGlzIG5lZWRlZCBmb3IgZU1NQyB0aGF0IGFyZSBhc2xlZXAKIAkgKi8KIAltbWNfZ29faWRsZShob3N0KTsKIApAQCAtNjY4LDcgKzgzMyw4IEBACiAJICovCiAJaWYgKGNhcmQtPmV4dF9jc2QuZW5oYW5jZWRfYXJlYV9lbikgewogCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCi0JCQkJIEVYVF9DU0RfRVJBU0VfR1JPVVBfREVGLCAxLCAwKTsKKwkJCQkgRVhUX0NTRF9FUkFTRV9HUk9VUF9ERUYsIDEsCisJCQkJIGNhcmQtPmV4dF9jc2QuZ2VuZXJpY19jbWQ2X3RpbWUpOwogCiAJCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQogCQkJZ290byBmcmVlX2NhcmQ7CkBAIC03MDYsMTcgKzg3MiwzNSBAQAogCX0KIAogCS8qCisJICogSWYgdGhlIGhvc3Qgc3VwcG9ydHMgdGhlIHBvd2VyX29mZl9ub3RpZnkgY2FwYWJpbGl0eSB0aGVuCisJICogc2V0IHRoZSBub3RpZmljYXRpb24gYnl0ZSBpbiB0aGUgZXh0X2NzZCByZWdpc3RlciBvZiBkZXZpY2UKKwkgKi8KKwlpZiAoKGhvc3QtPmNhcHMyICYgTU1DX0NBUDJfUE9XRVJPRkZfTk9USUZZKSAmJgorCSAgICAoY2FyZC0+cG93ZXJvZmZfbm90aWZ5X3N0YXRlID09IE1NQ19OT19QT1dFUl9OT1RJRklDQVRJT04pKSB7CisJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKKwkJCQkgRVhUX0NTRF9QT1dFUl9PRkZfTk9USUZJQ0FUSU9OLAorCQkJCSBFWFRfQ1NEX1BPV0VSX09OLAorCQkJCSBjYXJkLT5leHRfY3NkLmdlbmVyaWNfY21kNl90aW1lKTsKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCisJCQlnb3RvIGZyZWVfY2FyZDsKKwl9CisKKwlpZiAoIWVycikKKwkJY2FyZC0+cG93ZXJvZmZfbm90aWZ5X3N0YXRlID0gTU1DX1BPV0VSRURfT047CisKKwkvKgogCSAqIEFjdGl2YXRlIGhpZ2ggc3BlZWQgKGlmIHN1cHBvcnRlZCkKIAkgKi8KIAlpZiAoKGNhcmQtPmV4dF9jc2QuaHNfbWF4X2R0ciAhPSAwKSAmJgogCQkoaG9zdC0+Y2FwcyAmIE1NQ19DQVBfTU1DX0hJR0hTUEVFRCkpIHsKIAkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAotCQkJCSBFWFRfQ1NEX0hTX1RJTUlORywgMSwgMCk7CisJCQkJIEVYVF9DU0RfSFNfVElNSU5HLCAxLAorCQkJCSBjYXJkLT5leHRfY3NkLmdlbmVyaWNfY21kNl90aW1lKTsKIAkJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCiAJCQlnb3RvIGZyZWVfY2FyZDsKIAogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc3dpdGNoIHRvIGhpZ2hzcGVlZCBmYWlsZWRcbiIsCisJCQlwcl93YXJuaW5nKCIlczogc3dpdGNoIHRvIGhpZ2hzcGVlZCBmYWlsZWRcbiIsCiAJCQkgICAgICAgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJCWVyciA9IDA7CiAJCX0gZWxzZSB7CkBAIC03MjYsNiArOTEwLDIyIEBACiAJfQogCiAJLyoKKwkgKiBFbmFibGUgSFBJIGZlYXR1cmUgKGlmIHN1cHBvcnRlZCkKKwkgKi8KKwlpZiAoY2FyZC0+ZXh0X2NzZC5ocGkpIHsKKwkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAorCQkJRVhUX0NTRF9IUElfTUdNVCwgMSwgMCk7CisJCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQorCQkJZ290byBmcmVlX2NhcmQ7CisJCWlmIChlcnIpIHsKKwkJCXByX3dhcm5pbmcoIiVzOiBFbmFibGluZyBIUEkgZmFpbGVkXG4iLAorCQkJCSAgIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CisJCQllcnIgPSAwOworCQl9IGVsc2UKKwkJCWNhcmQtPmV4dF9jc2QuaHBpX2VuID0gMTsKKwl9CisKKwkvKgogCSAqIENvbXB1dGUgYnVzIHNwZWVkLgogCSAqLwogCW1heF9kdHIgPSAodW5zaWduZWQgaW50KS0xOwpAQCAtNzgwLDEwICs5ODAsMTggQEAKIAkJCWJ1c193aWR0aCA9IGJ1c193aWR0aHNbaWR4XTsKIAkJCWlmIChidXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF8xKQogCQkJCWRkciA9IDA7IC8qIG5vIEREUiBmb3IgMS1iaXQgd2lkdGggKi8KKwkJCWVyciA9IG1tY19zZWxlY3RfcG93ZXJjbGFzcyhjYXJkLCBleHRfY3NkX2JpdHNbaWR4XVswXSwKKwkJCQkJCSAgICBleHRfY3NkKTsKKwkJCWlmIChlcnIpCisJCQkJcHJfZXJyKCIlczogcG93ZXIgY2xhc3Mgc2VsZWN0aW9uIHRvICIKKwkJCQkgICAgICAgImJ1cyB3aWR0aCAlZCBmYWlsZWRcbiIsCisJCQkJICAgICAgIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwKKwkJCQkgICAgICAgMSA8PCBidXNfd2lkdGgpOworCiAJCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCiAJCQkJCSBFWFRfQ1NEX0JVU19XSURUSCwKIAkJCQkJIGV4dF9jc2RfYml0c1tpZHhdWzBdLAotCQkJCQkgMCk7CisJCQkJCSBjYXJkLT5leHRfY3NkLmdlbmVyaWNfY21kNl90aW1lKTsKIAkJCWlmICghZXJyKSB7CiAJCQkJbW1jX3NldF9idXNfd2lkdGgoY2FyZC0+aG9zdCwgYnVzX3dpZHRoKTsKIApAQCAtODAzLDEzICsxMDExLDIxIEBACiAJCX0KIAogCQlpZiAoIWVyciAmJiBkZHIpIHsKKwkJCWVyciA9IG1tY19zZWxlY3RfcG93ZXJjbGFzcyhjYXJkLCBleHRfY3NkX2JpdHNbaWR4XVsxXSwKKwkJCQkJCSAgICBleHRfY3NkKTsKKwkJCWlmIChlcnIpCisJCQkJcHJfZXJyKCIlczogcG93ZXIgY2xhc3Mgc2VsZWN0aW9uIHRvICIKKwkJCQkgICAgICAgImJ1cyB3aWR0aCAlZCBkZHIgJWQgZmFpbGVkXG4iLAorCQkJCSAgICAgICBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCisJCQkJICAgICAgIDEgPDwgYnVzX3dpZHRoLCBkZHIpOworCiAJCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCiAJCQkJCSBFWFRfQ1NEX0JVU19XSURUSCwKIAkJCQkJIGV4dF9jc2RfYml0c1tpZHhdWzFdLAotCQkJCQkgMCk7CisJCQkJCSBjYXJkLT5leHRfY3NkLmdlbmVyaWNfY21kNl90aW1lKTsKIAkJfQogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc3dpdGNoIHRvIGJ1cyB3aWR0aCAlZCBkZHIgJWQgIgorCQkJcHJfd2FybmluZygiJXM6IHN3aXRjaCB0byBidXMgd2lkdGggJWQgZGRyICVkICIKIAkJCQkiZmFpbGVkXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCiAJCQkJMSA8PCBidXNfd2lkdGgsIGRkcik7CiAJCQlnb3RvIGZyZWVfY2FyZDsKQEAgLTg0MCw2ICsxMDU2LDIzIEBACiAJCX0KIAl9CiAKKwkvKgorCSAqIElmIGNhY2hlIHNpemUgaXMgaGlnaGVyIHRoYW4gMCwgdGhpcyBpbmRpY2F0ZXMKKwkgKiB0aGUgZXhpc3RlbmNlIG9mIGNhY2hlIGFuZCBpdCBjYW4gYmUgdHVybmVkIG9uLgorCSAqLworCWlmICgoaG9zdC0+Y2FwczIgJiBNTUNfQ0FQMl9DQUNIRV9DVFJMKSAmJgorCQkJY2FyZC0+ZXh0X2NzZC5jYWNoZV9zaXplID4gMCkgeworCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCisJCQkJRVhUX0NTRF9DQUNIRV9DVFJMLCAxLCAwKTsKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCisJCQlnb3RvIGZyZWVfY2FyZDsKKworCQkvKgorCQkgKiBPbmx5IGlmIG5vIGVycm9yLCBjYWNoZSBpcyB0dXJuZWQgb24gc3VjY2Vzc2Z1bGx5LgorCQkgKi8KKwkJY2FyZC0+ZXh0X2NzZC5jYWNoZV9jdHJsID0gZXJyID8gMCA6IDE7CisJfQorCiAJaWYgKCFvbGRjYXJkKQogCQlob3N0LT5jYXJkID0gY2FyZDsKIApAQCAtODkxLDYgKzExMjQsNyBAQAogCiAJCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogCQltbWNfZGV0YWNoX2J1cyhob3N0KTsKKwkJbW1jX3Bvd2VyX29mZihob3N0KTsKIAkJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAl9CiB9CkBAIC05MDAsMTYgKzExMzQsMjAgQEAKICAqLwogc3RhdGljIGludCBtbWNfc3VzcGVuZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7CisJaW50IGVyciA9IDA7CisKIAlCVUdfT04oIWhvc3QpOwogCUJVR19PTighaG9zdC0+Y2FyZCk7CiAKIAltbWNfY2xhaW1faG9zdChob3N0KTsKLQlpZiAoIW1tY19ob3N0X2lzX3NwaShob3N0KSkKKwlpZiAobW1jX2NhcmRfY2FuX3NsZWVwKGhvc3QpKQorCQllcnIgPSBtbWNfY2FyZF9zbGVlcChob3N0KTsKKwllbHNlIGlmICghbW1jX2hvc3RfaXNfc3BpKGhvc3QpKQogCQltbWNfZGVzZWxlY3RfY2FyZHMoaG9zdCk7CiAJaG9zdC0+Y2FyZC0+c3RhdGUgJj0gfk1NQ19TVEFURV9ISUdIU1BFRUQ7CiAJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIC8qCkBAIC0xMDE2LDYgKzEyNTQsMTAgQEAKIAlCVUdfT04oIWhvc3QpOwogCVdBUk5fT04oIWhvc3QtPmNsYWltZWQpOwogCisJLyogU2V0IGNvcnJlY3QgYnVzIG1vZGUgZm9yIE1NQyBiZWZvcmUgYXR0ZW1wdGluZyBhdHRhY2ggKi8KKwlpZiAoIW1tY19ob3N0X2lzX3NwaShob3N0KSkKKwkJbW1jX3NldF9idXNfbW9kZShob3N0LCBNTUNfQlVTTU9ERV9PUEVORFJBSU4pOworCiAJZXJyID0gbW1jX3NlbmRfb3BfY29uZChob3N0LCAwLCAmb2NyKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMTAzOCw3ICsxMjgwLDcgQEAKIAkgKiBzdXBwb3J0LgogCSAqLwogCWlmIChvY3IgJiAweDdGKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYXJkIGNsYWltcyB0byBzdXBwb3J0IHZvbHRhZ2VzICIKKwkJcHJfd2FybmluZygiJXM6IGNhcmQgY2xhaW1zIHRvIHN1cHBvcnQgdm9sdGFnZXMgIgogCQkgICAgICAgImJlbG93IHRoZSBkZWZpbmVkIHJhbmdlLiBUaGVzZSB3aWxsIGJlIGlnbm9yZWQuXG4iLAogCQkgICAgICAgbW1jX2hvc3RuYW1lKGhvc3QpKTsKIAkJb2NyICY9IH4weDdGOwpAQCAtMTA3Nyw3ICsxMzE5LDcgQEAKIGVycjoKIAltbWNfZGV0YWNoX2J1cyhob3N0KTsKIAotCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHdoaWxzdCBpbml0aWFsaXNpbmcgTU1DIGNhcmRcbiIsCisJcHJfZXJyKCIlczogZXJyb3IgJWQgd2hpbHN0IGluaXRpYWxpc2luZyBNTUMgY2FyZFxuIiwKIAkJbW1jX2hvc3RuYW1lKGhvc3QpLCBlcnIpOwogCiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5jIGIvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmMKaW5kZXggNzcwYzNkMC4uNGQ0MWZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIApAQCAtMjMzLDcgKzIzNCw3IEBACiBtbWNfc2VuZF9jeGRfZGF0YShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwKIAkJdTMyIG9wY29kZSwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4pCiB7Ci0Jc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHswfTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0ge05VTEx9OwogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CiAJc3RydWN0IG1tY19kYXRhIGRhdGEgPSB7MH07CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpAQCAtNDE0LDcgKzQxNSw3IEBACiAJCQlyZXR1cm4gLUVCQURNU0c7CiAJfSBlbHNlIHsKIAkJaWYgKHN0YXR1cyAmIDB4RkRGRkEwMDApCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5leHBlY3RlZCBzdGF0dXMgJSN4IGFmdGVyICIKKwkJCXByX3dhcm5pbmcoIiVzOiB1bmV4cGVjdGVkIHN0YXR1cyAlI3ggYWZ0ZXIgIgogCQkJICAgICAgICJzd2l0Y2giLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIHN0YXR1cyk7CiAJCWlmIChzdGF0dXMgJiBSMV9TV0lUQ0hfRVJST1IpCiAJCQlyZXR1cm4gLUVCQURNU0c7CkBAIC00NTQsNyArNDU1LDcgQEAKIG1tY19zZW5kX2J1c190ZXN0KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgc3RydWN0IG1tY19ob3N0ICpob3N0LCB1OCBvcGNvZGUsCiAJCSAgdTggbGVuKQogewotCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHtOVUxMfTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCXN0cnVjdCBtbWNfZGF0YSBkYXRhID0gezB9OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKQEAgLTQ3Niw3ICs0NzcsNyBAQAogCWVsc2UgaWYgKGxlbiA9PSA0KQogCQl0ZXN0X2J1ZiA9IHRlc3RkYXRhXzRiaXQ7CiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgYnVzX3dpZHRoICVkXG4iLAorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGJ1c193aWR0aCAlZFxuIiwKIAkJICAgICAgIG1tY19ob3N0bmFtZShob3N0KSwgbGVuKTsKIAkJa2ZyZWUoZGF0YV9idWYpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU0NywzICs1NDgsMzQgQEAKIAllcnIgPSBtbWNfc2VuZF9idXNfdGVzdChjYXJkLCBjYXJkLT5ob3N0LCBNTUNfQlVTX1RFU1RfUiwgd2lkdGgpOwogCXJldHVybiBlcnI7CiB9CisKK2ludCBtbWNfc2VuZF9ocGlfY21kKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdTMyICpzdGF0dXMpCit7CisJc3RydWN0IG1tY19jb21tYW5kIGNtZCA9IHswfTsKKwl1bnNpZ25lZCBpbnQgb3Bjb2RlOworCXVuc2lnbmVkIGludCBmbGFnczsKKwlpbnQgZXJyOworCisJb3Bjb2RlID0gY2FyZC0+ZXh0X2NzZC5ocGlfY21kOworCWlmIChvcGNvZGUgPT0gTU1DX1NUT1BfVFJBTlNNSVNTSU9OKQorCQlmbGFncyA9IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FDOworCWVsc2UgaWYgKG9wY29kZSA9PSBNTUNfU0VORF9TVEFUVVMpCisJCWZsYWdzID0gTU1DX1JTUF9SMSB8IE1NQ19DTURfQUM7CisKKwljbWQub3Bjb2RlID0gb3Bjb2RlOworCWNtZC5hcmcgPSBjYXJkLT5yY2EgPDwgMTYgfCAxOworCWNtZC5mbGFncyA9IGZsYWdzOworCWNtZC5jbWRfdGltZW91dF9tcyA9IGNhcmQtPmV4dF9jc2Qub3V0X29mX2ludF90aW1lOworCisJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChjYXJkLT5ob3N0LCAmY21kLCAwKTsKKwlpZiAoZXJyKSB7CisJCXByX3dhcm4oIiVzOiBlcnJvciAlZCBpbnRlcnJ1cHRpbmcgb3BlcmF0aW9uLiAiCisJCQkiSFBJIGNvbW1hbmQgcmVzcG9uc2UgJSN4XG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCisJCQllcnIsIGNtZC5yZXNwWzBdKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHN0YXR1cykKKwkJKnN0YXR1cyA9IGNtZC5yZXNwWzBdOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuaCBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5oCmluZGV4IDkyNzY5NDYuLjNkZDg5NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5oCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5oCkBAIC0yNiw2ICsyNiw3IEBACiBpbnQgbW1jX3NwaV9zZXRfY3JjKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgaW50IHVzZV9jcmMpOwogaW50IG1tY19jYXJkX3NsZWVwYXdha2Uoc3RydWN0IG1tY19ob3N0ICpob3N0LCBpbnQgc2xlZXApOwogaW50IG1tY19idXNfdGVzdChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHU4IGJ1c193aWR0aCk7CitpbnQgbW1jX3NlbmRfaHBpX2NtZChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHUzMiAqc3RhdHVzKTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvcXVpcmtzLmMgYi9kcml2ZXJzL21tYy9jb3JlL3F1aXJrcy5jCmluZGV4IDNhNTk2MjEuLjA2ZWUxYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9xdWlya3MuYwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogCiAjaWZuZGVmIFNESU9fVkVORE9SX0lEX1RJCkBAIC0yMSw2ICsyMiwxNCBAQAogI2RlZmluZSBTRElPX0RFVklDRV9JRF9USV9XTDEyNzEJMHg0MDc2CiAjZW5kaWYKIAorI2lmbmRlZiBTRElPX1ZFTkRPUl9JRF9TVEUKKyNkZWZpbmUgU0RJT19WRU5ET1JfSURfU1RFCQkweDAwMjAKKyNlbmRpZgorCisjaWZuZGVmIFNESU9fREVWSUNFX0lEX1NURV9DVzEyMDAKKyNkZWZpbmUgU0RJT19ERVZJQ0VfSURfU1RFX0NXMTIwMAkweDIyODAKKyNlbmRpZgorCiAvKgogICogVGhpcyBob29rIGp1c3QgYWRkcyBhIHF1aXJrIGZvciBhbGwgc2RpbyBkZXZpY2VzCiAgKi8KQEAgLTQ2LDYgKzU1LDkgQEAKIAlTRElPX0ZJWFVQKFNESU9fVkVORE9SX0lEX1RJLCBTRElPX0RFVklDRV9JRF9USV9XTDEyNzEsCiAJCSAgIGFkZF9xdWlyaywgTU1DX1FVSVJLX0RJU0FCTEVfQ0QpLAogCisJU0RJT19GSVhVUChTRElPX1ZFTkRPUl9JRF9TVEUsIFNESU9fREVWSUNFX0lEX1NURV9DVzEyMDAsCisJCSAgIGFkZF9xdWlyaywgTU1DX1FVSVJLX0JST0tFTl9CWVRFX01PREVfNTEyKSwKKwogCUVORF9GSVhVUAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZC5jIGIvZHJpdmVycy9tbWMvY29yZS9zZC5jCmluZGV4IDAzNzBlMDMuLmYyYTA1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2QuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CkBAIC0xNjMsNyArMTY0LDcgQEAKIAkJY3NkLT5lcmFzZV9zaXplID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pc2VkIENTRCBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKKwkJcHJfZXJyKCIlczogdW5yZWNvZ25pc2VkIENTRCBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY3NkX3N0cnVjdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE4Nyw3ICsxODgsNyBAQAogCiAJc2NyX3N0cnVjdCA9IFVOU1RVRkZfQklUUyhyZXNwLCA2MCwgNCk7CiAJaWYgKHNjcl9zdHJ1Y3QgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bnJlY29nbmlzZWQgU0NSIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAorCQlwcl9lcnIoIiVzOiB1bnJlY29nbmlzZWQgU0NSIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBzY3Jfc3RydWN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjE4LDcgKzIxOSw3IEBACiAJdTMyICpzc3I7CiAKIAlpZiAoIShjYXJkLT5jc2QuY21kY2xhc3MgJiBDQ0NfQVBQX1NQRUMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYXJkIGxhY2tzIG1hbmRhdG9yeSBTRCBTdGF0dXMgIgorCQlwcl93YXJuaW5nKCIlczogY2FyZCBsYWNrcyBtYW5kYXRvcnkgU0QgU3RhdHVzICIKIAkJCSJmdW5jdGlvbi5cbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTIyOSw3ICsyMzAsNyBAQAogCiAJZXJyID0gbW1jX2FwcF9zZF9zdGF0dXMoY2FyZCwgc3NyKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwcm9ibGVtIHJlYWRpbmcgU0QgU3RhdHVzICIKKwkJcHJfd2FybmluZygiJXM6IHByb2JsZW0gcmVhZGluZyBTRCBTdGF0dXMgIgogCQkJInJlZ2lzdGVyLlxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJZXJyID0gMDsKIAkJZ290byBvdXQ7CkBAIC0yNTMsNyArMjU0LDcgQEAKIAkJCWNhcmQtPnNzci5lcmFzZV9vZmZzZXQgPSBlbyAqIDEwMDA7CiAJCX0KIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU0QgU3RhdHVzOiBJbnZhbGlkIEFsbG9jYXRpb24gVW5pdCAiCisJCXByX3dhcm5pbmcoIiVzOiBTRCBTdGF0dXM6IEludmFsaWQgQWxsb2NhdGlvbiBVbml0ICIKIAkJCSJzaXplLlxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAl9CiBvdXQ6CkBAIC0yNzMsNyArMjc0LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIShjYXJkLT5jc2QuY21kY2xhc3MgJiBDQ0NfU1dJVENIKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FyZCBsYWNrcyBtYW5kYXRvcnkgc3dpdGNoICIKKwkJcHJfd2FybmluZygiJXM6IGNhcmQgbGFja3MgbWFuZGF0b3J5IHN3aXRjaCAiCiAJCQkiZnVuY3Rpb24sIHBlcmZvcm1hbmNlIG1pZ2h0IHN1ZmZlci5cbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCQlyZXR1cm4gMDsKQEAgLTI4Myw3ICsyODQsNyBAQAogCiAJc3RhdHVzID0ga21hbGxvYyg2NCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVmZmVyIGZvciAiCisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgIgogCQkJInN3aXRjaCBjYXBhYmlsaXRpZXMuXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yOTksMTMgKzMwMCwxNiBAQAogCQlpZiAoZXJyICE9IC1FSU5WQUwgJiYgZXJyICE9IC1FTk9TWVMgJiYgZXJyICE9IC1FRkFVTFQpCiAJCQlnb3RvIG91dDsKIAotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcHJvYmxlbSByZWFkaW5nIEJ1cyBTcGVlZCBtb2Rlcy5cbiIsCisJCXByX3dhcm5pbmcoIiVzOiBwcm9ibGVtIHJlYWRpbmcgQnVzIFNwZWVkIG1vZGVzLlxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCWVyciA9IDA7CiAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKHN0YXR1c1sxM10gJiBVSFNfU0RSNTBfQlVTX1NQRUVEKQorCQljYXJkLT5zd19jYXBzLmhzX21heF9kdHIgPSA1MDAwMDAwMDsKKwogCWlmIChjYXJkLT5zY3Iuc2RhX3NwZWMzKSB7CiAJCWNhcmQtPnN3X2NhcHMuc2QzX2J1c19tb2RlID0gc3RhdHVzWzEzXTsKIApAQCAtMzE5LDcgKzMyMyw3IEBACiAJCQlpZiAoZXJyICE9IC1FSU5WQUwgJiYgZXJyICE9IC1FTk9TWVMgJiYgZXJyICE9IC1FRkFVTFQpCiAJCQkJZ290byBvdXQ7CiAKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwcm9ibGVtIHJlYWRpbmcgIgorCQkJcHJfd2FybmluZygiJXM6IHByb2JsZW0gcmVhZGluZyAiCiAJCQkJIkRyaXZlciBTdHJlbmd0aC5cbiIsCiAJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJCWVyciA9IDA7CkBAIC0zMzksNyArMzQzLDcgQEAKIAkJCWlmIChlcnIgIT0gLUVJTlZBTCAmJiBlcnIgIT0gLUVOT1NZUyAmJiBlcnIgIT0gLUVGQVVMVCkKIAkJCQlnb3RvIG91dDsKIAotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHByb2JsZW0gcmVhZGluZyAiCisJCQlwcl93YXJuaW5nKCIlczogcHJvYmxlbSByZWFkaW5nICIKIAkJCQkiQ3VycmVudCBMaW1pdC5cbiIsCiAJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJCWVyciA9IDA7CkBAIC0zNDgsOSArMzUyLDYgQEAKIAkJfQogCiAJCWNhcmQtPnN3X2NhcHMuc2QzX2N1cnJfbGltaXQgPSBzdGF0dXNbN107Ci0JfSBlbHNlIHsKLQkJaWYgKHN0YXR1c1sxM10gJiAweDAyKQotCQkJY2FyZC0+c3dfY2Fwcy5oc19tYXhfZHRyID0gNTAwMDAwMDA7CiAJfQogCiBvdXQ6CkBAIC0zODMsNyArMzg0LDcgQEAKIAogCXN0YXR1cyA9IGttYWxsb2MoNjQsIEdGUF9LRVJORUwpOwogCWlmICghc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgIgorCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yICIKIAkJCSJzd2l0Y2ggY2FwYWJpbGl0aWVzLlxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzkzLDcgKzM5NCw3IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKChzdGF0dXNbMTZdICYgMHhGKSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQcm9ibGVtIHN3aXRjaGluZyBjYXJkICIKKwkJcHJfd2FybmluZygiJXM6IFByb2JsZW0gc3dpdGNoaW5nIGNhcmQgIgogCQkJImludG8gaGlnaC1zcGVlZCBtb2RlIVxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCWVyciA9IDA7CkBAIC00NTksNyArNDYwLDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCWlmICgoc3RhdHVzWzE1XSAmIDB4RikgIT0gZHJpdmVfc3RyZW5ndGgpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFByb2JsZW0gc2V0dGluZyBkcml2ZSBzdHJlbmd0aCFcbiIsCisJCXByX3dhcm5pbmcoIiVzOiBQcm9ibGVtIHNldHRpbmcgZHJpdmUgc3RyZW5ndGghXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTM4LDcgKzUzOSw3IEBACiAJCXJldHVybiBlcnI7CiAKIAlpZiAoKHN0YXR1c1sxNl0gJiAweEYpICE9IGNhcmQtPnNkX2J1c19zcGVlZCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFByb2JsZW0gc2V0dGluZyBidXMgc3BlZWQgbW9kZSFcbiIsCisJCXByX3dhcm5pbmcoIiVzOiBQcm9ibGVtIHNldHRpbmcgYnVzIHNwZWVkIG1vZGUhXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAllbHNlIHsKIAkJbW1jX3NldF90aW1pbmcoY2FyZC0+aG9zdCwgdGltaW5nKTsKQEAgLTYwMCw3ICs2MDEsNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJaWYgKCgoc3RhdHVzWzE1XSA+PiA0KSAmIDB4MEYpICE9IGN1cnJlbnRfbGltaXQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQcm9ibGVtIHNldHRpbmcgY3VycmVudCBsaW1pdCFcbiIsCisJCXByX3dhcm5pbmcoIiVzOiBQcm9ibGVtIHNldHRpbmcgY3VycmVudCBsaW1pdCFcbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCiAJcmV0dXJuIDA7CkBAIC02MjIsNyArNjIzLDcgQEAKIAogCXN0YXR1cyA9IGttYWxsb2MoNjQsIEdGUF9LRVJORUwpOwogCWlmICghc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgIgorCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yICIKIAkJCSJzd2l0Y2ggY2FwYWJpbGl0aWVzLlxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtODUyLDcgKzg1Myw3IEBACiAJCQlybyA9IGhvc3QtPm9wcy0+Z2V0X3JvKGhvc3QpOwogCiAJCWlmIChybyA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBob3N0IGRvZXMgbm90ICIKKwkJCXByX3dhcm5pbmcoIiVzOiBob3N0IGRvZXMgbm90ICIKIAkJCQkic3VwcG9ydCByZWFkaW5nIHJlYWQtb25seSAiCiAJCQkJInN3aXRjaC4gYXNzdW1pbmcgd3JpdGUtZW5hYmxlLlxuIiwKIAkJCQltbWNfaG9zdG5hbWUoaG9zdCkpOwpAQCAtOTI5LDggKzkzMCw2IEBACiAJCWVyciA9IG1tY19zZW5kX3JlbGF0aXZlX2FkZHIoaG9zdCwgJmNhcmQtPnJjYSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCi0JCW1tY19zZXRfYnVzX21vZGUoaG9zdCwgTU1DX0JVU01PREVfUFVTSFBVTEwpOwogCX0KIAogCWlmICghb2xkY2FyZCkgewpAQCAtMTA0Myw2ICsxMDQyLDcgQEAKIAogCQltbWNfY2xhaW1faG9zdChob3N0KTsKIAkJbW1jX2RldGFjaF9idXMoaG9zdCk7CisJCW1tY19wb3dlcl9vZmYoaG9zdCk7CiAJCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJfQogfQpAQCAtMTE2Nyw3ICsxMTY3LDcgQEAKIAkgKiBzdXBwb3J0LgogCSAqLwogCWlmIChvY3IgJiAweDdGKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYXJkIGNsYWltcyB0byBzdXBwb3J0IHZvbHRhZ2VzICIKKwkJcHJfd2FybmluZygiJXM6IGNhcmQgY2xhaW1zIHRvIHN1cHBvcnQgdm9sdGFnZXMgIgogCQkgICAgICAgImJlbG93IHRoZSBkZWZpbmVkIHJhbmdlLiBUaGVzZSB3aWxsIGJlIGlnbm9yZWQuXG4iLAogCQkgICAgICAgbW1jX2hvc3RuYW1lKGhvc3QpKTsKIAkJb2NyICY9IH4weDdGOwpAQCAtMTE3NSw3ICsxMTc1LDcgQEAKIAogCWlmICgob2NyICYgTU1DX1ZERF8xNjVfMTk1KSAmJgogCSAgICAhKGhvc3QtPm9jcl9hdmFpbF9zZCAmIE1NQ19WRERfMTY1XzE5NSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNEIGNhcmQgY2xhaW1zIHRvIHN1cHBvcnQgdGhlICIKKwkJcHJfd2FybmluZygiJXM6IFNEIGNhcmQgY2xhaW1zIHRvIHN1cHBvcnQgdGhlICIKIAkJICAgICAgICJpbmNvbXBsZXRlbHkgZGVmaW5lZCAnbG93IHZvbHRhZ2UgcmFuZ2UnLiBUaGlzICIKIAkJICAgICAgICJ3aWxsIGJlIGlnbm9yZWQuXG4iLCBtbWNfaG9zdG5hbWUoaG9zdCkpOwogCQlvY3IgJj0gfk1NQ19WRERfMTY1XzE5NTsKQEAgLTEyMTQsNyArMTIxNCw3IEBACiBlcnI6CiAJbW1jX2RldGFjaF9idXMoaG9zdCk7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCB3aGlsc3QgaW5pdGlhbGlzaW5nIFNEIGNhcmRcbiIsCisJcHJfZXJyKCIlczogZXJyb3IgJWQgd2hpbHN0IGluaXRpYWxpc2luZyBTRCBjYXJkXG4iLAogCQltbWNfaG9zdG5hbWUoaG9zdCksIGVycik7CiAKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZF9vcHMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rfb3BzLmMKaW5kZXggMDIxZmVkMS4uMjc0ZWYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZF9vcHMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkX29wcy5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KQEAgLTY3LDcgKzY4LDcgQEAKIGludCBtbWNfd2FpdF9mb3JfYXBwX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCwgaW50IHJldHJpZXMpCiB7Ci0Jc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHswfTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0ge05VTEx9OwogCiAJaW50IGksIGVycjsKIApAQCAtMjQ0LDcgKzI0NSw3IEBACiBpbnQgbW1jX2FwcF9zZW5kX3NjcihzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHUzMiAqc2NyKQogewogCWludCBlcnI7Ci0Jc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHswfTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0ge05VTEx9OwogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CiAJc3RydWN0IG1tY19kYXRhIGRhdGEgPSB7MH07CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpAQCAtMzAzLDcgKzMwNCw3IEBACiBpbnQgbW1jX3NkX3N3aXRjaChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIGludCBtb2RlLCBpbnQgZ3JvdXAsCiAJdTggdmFsdWUsIHU4ICpyZXNwKQogewotCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHtOVUxMfTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCXN0cnVjdCBtbWNfZGF0YSBkYXRhID0gezB9OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKQEAgLTM0OCw3ICszNDksNyBAQAogaW50IG1tY19hcHBfc2Rfc3RhdHVzKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdm9pZCAqc3NyKQogewogCWludCBlcnI7Ci0Jc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHswfTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0ge05VTEx9OwogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CiAJc3RydWN0IG1tY19kYXRhIGRhdGEgPSB7MH07CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW8uYwppbmRleCAyNjJmZmYwLi4zYWI1NjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkaW8uYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW8uYwpAQCAtMTExLDggKzExMSw4IEBACiAKIAljY2NyX3ZzbiA9IGRhdGEgJiAweDBmOwogCi0JaWYgKGNjY3JfdnNuID4gU0RJT19DQ0NSX1JFVl8xXzIwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVucmVjb2duaXNlZCBDQ0NSIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAorCWlmIChjY2NyX3ZzbiA+IFNESU9fQ0NDUl9SRVZfM18wMCkgeworCQlwcl9lcnIoIiVzOiB1bnJlY29nbmlzZWQgQ0NDUiBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY2Njcl92c24pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00MDgsOCArNDA4LDYgQEAKIAkJICovCiAJCWlmIChvbGRjYXJkKQogCQkJb2xkY2FyZC0+cmNhID0gY2FyZC0+cmNhOwotCi0JCW1tY19zZXRfYnVzX21vZGUoaG9zdCwgTU1DX0JVU01PREVfUFVTSFBVTEwpOwogCX0KIAogCS8qCkBAIC01OTcsNiArNTk1LDcgQEAKIAogCQltbWNfY2xhaW1faG9zdChob3N0KTsKIAkJbW1jX2RldGFjaF9idXMoaG9zdCk7CisJCW1tY19wb3dlcl9vZmYoaG9zdCk7CiAJCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJfQogfQpAQCAtNzc4LDcgKzc3Nyw3IEBACiAJICogc3VwcG9ydC4KIAkgKi8KIAlpZiAob2NyICYgMHg3RikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FyZCBjbGFpbXMgdG8gc3VwcG9ydCB2b2x0YWdlcyAiCisJCXByX3dhcm5pbmcoIiVzOiBjYXJkIGNsYWltcyB0byBzdXBwb3J0IHZvbHRhZ2VzICIKIAkJICAgICAgICJiZWxvdyB0aGUgZGVmaW5lZCByYW5nZS4gVGhlc2Ugd2lsbCBiZSBpZ25vcmVkLlxuIiwKIAkJICAgICAgIG1tY19ob3N0bmFtZShob3N0KSk7CiAJCW9jciAmPSB+MHg3RjsKQEAgLTg3NSw3ICs4NzQsNyBAQAogZXJyOgogCW1tY19kZXRhY2hfYnVzKGhvc3QpOwogCi0JcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgd2hpbHN0IGluaXRpYWxpc2luZyBTRElPIGNhcmRcbiIsCisJcHJfZXJyKCIlczogZXJyb3IgJWQgd2hpbHN0IGluaXRpYWxpc2luZyBTRElPIGNhcmRcbiIsCiAJCW1tY19ob3N0bmFtZShob3N0KSwgZXJyKTsKIAogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMKaW5kZXggZTRlNjgyMi4uNDA5ODllNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIApAQCAtMTczLDcgKzE3NCw3IEBACiAJZHJ2LT5yZW1vdmUoZnVuYyk7CiAKIAlpZiAoZnVuYy0+aXJxX2hhbmRsZXIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV0FSTklORzogZHJpdmVyICVzIGRpZCBub3QgcmVtb3ZlICIKKwkJcHJfd2FybmluZygiV0FSTklORzogZHJpdmVyICVzIGRpZCBub3QgcmVtb3ZlICIKIAkJCSJpdHMgaW50ZXJydXB0IGhhbmRsZXIhXG4iLCBkcnYtPm5hbWUpOwogCQlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CiAJCXNkaW9fcmVsZWFzZV9pcnEoZnVuYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fY2lzLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fY2lzLmMKaW5kZXggNTQxYmRiOC4uZjFjN2VkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2Npcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19jaXMuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJCQlyZXQgPSAtRUlOVkFMOwogCQl9CiAJCWlmIChyZXQgJiYgcmV0ICE9IC1FSUxTRVEgJiYgcmV0ICE9IC1FTk9FTlQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCAlcyB0dXBsZSAweCUwMnggKCV1IGJ5dGVzKVxuIiwKKwkJCXByX2VycigiJXM6IGJhZCAlcyB0dXBsZSAweCUwMnggKCV1IGJ5dGVzKVxuIiwKIAkJCSAgICAgICBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIHRwbF9kZXNjciwgY29kZSwgc2l6ZSk7CiAJCX0KIAl9IGVsc2UgewpAQCAtMzEzLDcgKzMxMyw3IEBACiAKIAkJCWlmIChyZXQgPT0gLUVOT0VOVCkgewogCQkJCS8qIHdhcm4gYWJvdXQgdW5rbm93biB0dXBsZXMgKi8KLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcXVldWluZyB1bmtub3duIgorCQkJCXByX3dhcm5pbmcoIiVzOiBxdWV1aW5nIHVua25vd24iCiAJCQkJICAgICAgICIgQ0lTIHR1cGxlIDB4JTAyeCAoJXUgYnl0ZXMpXG4iLAogCQkJCSAgICAgICBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCiAJCQkJICAgICAgIHRwbF9jb2RlLCB0cGxfbGluayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9faW8uYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pby5jCmluZGV4IDBmNjg3Y2QuLmIxZjMxNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pby5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pby5jCkBAIC05LDYgKzksNyBAQAogICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3NkaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pcnEuYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pcnEuYwppbmRleCAwM2VhZDAyLi42OGY4MWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9faXJxLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lycS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKQEAgLTQ1LDcgKzQ2LDcgQEAKIAogCXJldCA9IG1tY19pb19yd19kaXJlY3QoY2FyZCwgMCwgMCwgU0RJT19DQ0NSX0lOVHgsIDAsICZwZW5kaW5nKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogZXJyb3IgJWQgcmVhZGluZyBTRElPX0NDQ1JfSU5UeFxuIiwKKwkJcHJfZGVidWcoIiVzOiBlcnJvciAlZCByZWFkaW5nIFNESU9fQ0NDUl9JTlR4XG4iLAogCQkgICAgICAgbW1jX2NhcmRfaWQoY2FyZCksIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNTUsNyArNTYsNyBAQAogCQlpZiAocGVuZGluZyAmICgxIDw8IGkpKSB7CiAJCQlmdW5jID0gY2FyZC0+c2Rpb19mdW5jW2kgLSAxXTsKIAkJCWlmICghZnVuYykgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwZW5kaW5nIElSUSBmb3IgIgorCQkJCXByX3dhcm5pbmcoIiVzOiBwZW5kaW5nIElSUSBmb3IgIgogCQkJCQkibm9uLWV4aXN0ZW50IGZ1bmN0aW9uXG4iLAogCQkJCQltbWNfY2FyZF9pZChjYXJkKSk7CiAJCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTYzLDcgKzY0LDcgQEAKIAkJCQlmdW5jLT5pcnFfaGFuZGxlcihmdW5jKTsKIAkJCQljb3VudCsrOwogCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcGVuZGluZyBJUlEgd2l0aCBubyBoYW5kbGVyXG4iLAorCQkJCXByX3dhcm5pbmcoIiVzOiBwZW5kaW5nIElSUSB3aXRoIG5vIGhhbmRsZXJcbiIsCiAJCQkJICAgICAgIHNkaW9fZnVuY19pZChmdW5jKSk7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19vcHMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19vcHMuYwppbmRleCBmMDg3ZDg3Li5iMDUxN2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fb3BzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX29wcy5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIGludCBtbWNfaW9fcndfZXh0ZW5kZWQoc3RydWN0IG1tY19jYXJkICpjYXJkLCBpbnQgd3JpdGUsIHVuc2lnbmVkIGZuLAogCXVuc2lnbmVkIGFkZHIsIGludCBpbmNyX2FkZHIsIHU4ICpidWYsIHVuc2lnbmVkIGJsb2NrcywgdW5zaWduZWQgYmxrc3opCiB7Ci0Jc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHswfTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0ge05VTEx9OwogCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CiAJc3RydWN0IG1tY19kYXRhIGRhdGEgPSB7MH07CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpAQCAtMTQ0LDggKzE0NCwxMSBAQAogCWNtZC5hcmcgfD0gZm4gPDwgMjg7CiAJY21kLmFyZyB8PSBpbmNyX2FkZHIgPyAweDA0MDAwMDAwIDogMHgwMDAwMDAwMDsKIAljbWQuYXJnIHw9IGFkZHIgPDwgOTsKLQlpZiAoYmxvY2tzID09IDEgJiYgYmxrc3ogPD0gNTEyKQotCQljbWQuYXJnIHw9IChibGtzeiA9PSA1MTIpID8gMCA6IGJsa3N6OwkvKiBieXRlIG1vZGUgKi8KKwlpZiAoYmxvY2tzID09IDEgJiYgYmxrc3ogPCA1MTIpCisJCWNtZC5hcmcgfD0gYmxrc3o7CQkJLyogYnl0ZSBtb2RlICovCisJZWxzZSBpZiAoYmxvY2tzID09IDEgJiYgYmxrc3ogPT0gNTEyICYmCisJCSAhKG1tY19jYXJkX2Jyb2tlbl9ieXRlX21vZGVfNTEyKGNhcmQpKSkKKwkJY21kLmFyZyB8PSAwOwkJCQkvKiBieXRlIG1vZGUsIDA9PTUxMiAqLwogCWVsc2UKIAkJY21kLmFyZyB8PSAweDA4MDAwMDAwIHwgYmxvY2tzOwkJLyogYmxvY2sgbW9kZSAqLwogCWNtZC5mbGFncyA9IE1NQ19SU1BfU1BJX1I1IHwgTU1DX1JTUF9SNSB8IE1NQ19DTURfQURUQzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwppbmRleCA4Yzg3MDk2Li5jZjQ0NGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCkBAIC0xMzAsMTMgKzEzMCwxMyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIE1NQ19TREhDSV9FU0RIQ19JTVgKLQl0cmlzdGF0ZSAiU0RIQ0kgcGxhdGZvcm0gc3VwcG9ydCBmb3IgdGhlIEZyZWVzY2FsZSBlU0RIQyBpLk1YIGNvbnRyb2xsZXIiCi0JZGVwZW5kcyBvbiBBUkNIX01YMjUgfHwgQVJDSF9NWDM1IHx8IEFSQ0hfTVg1CisJdHJpc3RhdGUgIlNESENJIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgZVNESEMvdVNESEMgaS5NWCBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJDSF9NWEMKIAlkZXBlbmRzIG9uIE1NQ19TREhDSV9QTFRGTQogCXNlbGVjdCBNTUNfU0RIQ0lfSU9fQUNDRVNTT1JTCiAJaGVscAotCSAgVGhpcyBzZWxlY3RzIHRoZSBGcmVlc2NhbGUgZVNESEMgY29udHJvbGxlciBzdXBwb3J0IG9uIHRoZSBwbGF0Zm9ybQotCSAgYnVzLCBmb3VuZCBvbiBwbGF0Zm9ybXMgbGlrZSBteDM1LzUxLgorCSAgVGhpcyBzZWxlY3RzIHRoZSBGcmVlc2NhbGUgZVNESEMvdVNESEMgY29udHJvbGxlciBzdXBwb3J0CisJICBmb3VuZCBvbiBpLk1YMjUsIGkuTVgzNSBpLk1YNXggYW5kIGkuTVg2eC4KIAogCSAgSWYgeW91IGhhdmUgYSBjb250cm9sbGVyIHdpdGggdGhpcyBpbnRlcmZhY2UsIHNheSBZIG9yIE0gaGVyZS4KIApAQCAtMjYzLDcgKzI2Myw3IEBACiAKIGNvbmZpZyBNTUNfQVUxWAogCXRyaXN0YXRlICJBbGNoZW15IEFVMVhYMCBNTUMgQ2FyZCBJbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNPQ19BVTEyMDAKKwlkZXBlbmRzIG9uIE1JUFNfQUxDSEVNWQogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgQU1EIEFsY2hlbXkoUikgTXVsdGltZWRpYSBjYXJkIGludGVyZmFjZS4KIAkgIElmIHlvdSBoYXZlIGEgQWxjaGVteSBwbGF0Zm9ybSB3aXRoIGEgTU1DIHNsb3QsIHNheSBZIG9yIE0gaGVyZS4KQEAgLTMyNiwxMSArMzI2LDExIEBACiAJICBzdXBwb3J0IGZvciBTRElPIGRldmljZXMuCiAKIGNvbmZpZyBNTUNfTVhDCi0JdHJpc3RhdGUgIkZyZWVzY2FsZSBpLk1YMi8zIE11bHRpbWVkaWEgQ2FyZCBJbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1BQ0hfTVgyMSB8fCBNQUNIX01YMjcgfHwgQVJDSF9NWDMxCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBpLk1YMjEvMjcvMzEgTXVsdGltZWRpYSBDYXJkIEludGVyZmFjZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9NWEMKIAloZWxwCi0JICBUaGlzIHNlbGVjdHMgdGhlIEZyZWVzY2FsZSBpLk1YMi8zIE11bHRpbWVkaWEgY2FyZCBJbnRlcmZhY2UuCi0JICBJZiB5b3UgaGF2ZSBhIGkuTVggcGxhdGZvcm0gd2l0aCBhIE11bHRpbWVkaWEgQ2FyZCBzbG90LAorCSAgVGhpcyBzZWxlY3RzIHRoZSBGcmVlc2NhbGUgaS5NWDIxLCBpLk1YMjcgYW5kIGkuTVgzMSBNdWx0aW1lZGlhIGNhcmQKKwkgIEludGVyZmFjZS4gSWYgeW91IGhhdmUgYSBpLk1YIHBsYXRmb3JtIHdpdGggYSBNdWx0aW1lZGlhIENhcmQgc2xvdCwKIAkgIHNheSBZIG9yIE0gaGVyZS4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuYwppbmRleCBhNGFhM2FmLi5hOGI0ZDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2F0OTFfbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9hdDkxX21jaS5jCkBAIC04NjksNyArODY5LDExIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MV9tbWNfZGV0X2lycShpbnQgaXJxLCB2b2lkICpfaG9zdCkKIHsKIAlzdHJ1Y3QgYXQ5MW1jaV9ob3N0ICpob3N0ID0gX2hvc3Q7Ci0JaW50IHByZXNlbnQgPSAhZ3Bpb19nZXRfdmFsdWUoaXJxX3RvX2dwaW8oaXJxKSk7CisJaW50IHByZXNlbnQ7CisKKwkvKiBlbnRlcmluZyB0aGlzIElTUiBtZWFucyB0aGF0IHdlIGhhdmUgY29uZmlndXJlZCBkZXRfcGluOgorCSAqIHdlIGNhbiB1c2UgaXRzIHZhbHVlIGluIGJvYXJkIHN0cnVjdHVyZSAqLworCXByZXNlbnQgPSAhZ3Bpb19nZXRfdmFsdWUoaG9zdC0+Ym9hcmQtPmRldF9waW4pOwogCiAJLyoKIAkgKiB3ZSBleHBlY3QgdGhpcyBpcnEgb24gYm90aCBpbnNlcnQgYW5kIHJlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLXJlZ3MuaCBiL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLXJlZ3MuaAppbmRleCBmYzhhMGZlLi4wMDBiM2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS1yZWdzLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2ktcmVncy5oCkBAIC0xNywxMTIgKzE3LDEyNiBAQAogI2RlZmluZSBfX0RSSVZFUlNfTU1DX0FUTUVMX01DSV9IX18KIAogLyogTUNJIFJlZ2lzdGVyIERlZmluaXRpb25zICovCi0jZGVmaW5lIE1DSV9DUgkJCTB4MDAwMAkvKiBDb250cm9sICovCi0jIGRlZmluZSBNQ0lfQ1JfTUNJRU4JCSggIDEgPDwgIDApCS8qIE1DSSBFbmFibGUgKi8KLSMgZGVmaW5lIE1DSV9DUl9NQ0lESVMJCSggIDEgPDwgIDEpCS8qIE1DSSBEaXNhYmxlICovCi0jIGRlZmluZSBNQ0lfQ1JfUFdTRU4JCSggIDEgPDwgIDIpCS8qIFBvd2VyIFNhdmUgRW5hYmxlICovCi0jIGRlZmluZSBNQ0lfQ1JfUFdTRElTCQkoICAxIDw8ICAzKQkvKiBQb3dlciBTYXZlIERpc2FibGUgKi8KLSMgZGVmaW5lIE1DSV9DUl9TV1JTVAkJKCAgMSA8PCAgNykJLyogU29mdHdhcmUgUmVzZXQgKi8KLSNkZWZpbmUgTUNJX01SCQkJMHgwMDA0CS8qIE1vZGUgKi8KLSMgZGVmaW5lIE1DSV9NUl9DTEtESVYoeCkJKCh4KSA8PCAgMCkJLyogQ2xvY2sgRGl2aWRlciAqLwotIyBkZWZpbmUgTUNJX01SX1BXU0RJVih4KQkoKHgpIDw8ICA4KQkvKiBQb3dlciBTYXZpbmcgRGl2aWRlciAqLwotIyBkZWZpbmUgTUNJX01SX1JEUFJPT0YJCSggIDEgPDwgMTEpCS8qIFJlYWQgUHJvb2YgKi8KLSMgZGVmaW5lIE1DSV9NUl9XUlBST09GCQkoICAxIDw8IDEyKQkvKiBXcml0ZSBQcm9vZiAqLwotIyBkZWZpbmUgTUNJX01SX1BEQ0ZCWVRFCSggIDEgPDwgMTMpCS8qIEZvcmNlIEJ5dGUgVHJhbnNmZXIgKi8KLSMgZGVmaW5lIE1DSV9NUl9QRENQQURWCQkoICAxIDw8IDE0KQkvKiBQYWRkaW5nIFZhbHVlICovCi0jIGRlZmluZSBNQ0lfTVJfUERDTU9ERQkJKCAgMSA8PCAxNSkJLyogUERDLW9yaWVudGVkIE1vZGUgKi8KLSNkZWZpbmUgTUNJX0RUT1IJCTB4MDAwOAkvKiBEYXRhIFRpbWVvdXQgKi8KLSMgZGVmaW5lIE1DSV9EVE9DWUMoeCkJCSgoeCkgPDwgIDApCS8qIERhdGEgVGltZW91dCBDeWNsZXMgKi8KLSMgZGVmaW5lIE1DSV9EVE9NVUwoeCkJCSgoeCkgPDwgIDQpCS8qIERhdGEgVGltZW91dCBNdWx0aXBsaWVyICovCi0jZGVmaW5lIE1DSV9TRENSCQkweDAwMGMJLyogU0QgQ2FyZCAvIFNESU8gKi8KLSMgZGVmaW5lIE1DSV9TRENTRUxfU0xPVF9BCSggIDAgPDwgIDApCS8qIFNlbGVjdCBTRCBzbG90IEEgKi8KLSMgZGVmaW5lIE1DSV9TRENTRUxfU0xPVF9CCSggIDEgPDwgIDApCS8qIFNlbGVjdCBTRCBzbG90IEEgKi8KLSMgZGVmaW5lIE1DSV9TRENTRUxfTUFTSwkoICAzIDw8ICAwKQotIyBkZWZpbmUgTUNJX1NEQ0JVU18xQklUCSggIDAgPDwgIDYpCS8qIDEtYml0IGRhdGEgYnVzICovCi0jIGRlZmluZSBNQ0lfU0RDQlVTXzRCSVQJKCAgMiA8PCAgNikJLyogNC1iaXQgZGF0YSBidXMgKi8KLSMgZGVmaW5lIE1DSV9TRENCVVNfOEJJVAkoICAzIDw8ICA2KQkvKiA4LWJpdCBkYXRhIGJ1c1syXSAqLwotIyBkZWZpbmUgTUNJX1NEQ0JVU19NQVNLCSggIDMgPDwgIDYpCi0jZGVmaW5lIE1DSV9BUkdSCQkweDAwMTAJLyogQ29tbWFuZCBBcmd1bWVudCAqLwotI2RlZmluZSBNQ0lfQ01EUgkJMHgwMDE0CS8qIENvbW1hbmQgKi8KLSMgZGVmaW5lIE1DSV9DTURSX0NNRE5CKHgpCSgoeCkgPDwgIDApCS8qIENvbW1hbmQgT3Bjb2RlICovCi0jIGRlZmluZSBNQ0lfQ01EUl9SU1BUWVBfTk9ORQkoICAwIDw8ICA2KQkvKiBObyByZXNwb25zZSAqLwotIyBkZWZpbmUgTUNJX0NNRFJfUlNQVFlQXzQ4QklUCSggIDEgPDwgIDYpCS8qIDQ4LWJpdCByZXNwb25zZSAqLwotIyBkZWZpbmUgTUNJX0NNRFJfUlNQVFlQXzEzNkJJVAkoICAyIDw8ICA2KQkvKiAxMzYtYml0IHJlc3BvbnNlICovCi0jIGRlZmluZSBNQ0lfQ01EUl9TUENNRF9JTklUCSggIDEgPDwgIDgpCS8qIEluaXRpYWxpemF0aW9uIGNvbW1hbmQgKi8KLSMgZGVmaW5lIE1DSV9DTURSX1NQQ01EX1NZTkMJKCAgMiA8PCAgOCkJLyogU3luY2hyb25pemVkIGNvbW1hbmQgKi8KLSMgZGVmaW5lIE1DSV9DTURSX1NQQ01EX0lOVAkoICA0IDw8ICA4KQkvKiBJbnRlcnJ1cHQgY29tbWFuZCAqLwotIyBkZWZpbmUgTUNJX0NNRFJfU1BDTURfSU5UUkVTUAkoICA1IDw8ICA4KQkvKiBJbnRlcnJ1cHQgcmVzcG9uc2UgKi8KLSMgZGVmaW5lIE1DSV9DTURSX09QRENNRAkoICAxIDw8IDExKQkvKiBPcGVuIERyYWluICovCi0jIGRlZmluZSBNQ0lfQ01EUl9NQVhMQVRfNUNZQwkoICAwIDw8IDEyKQkvKiBNYXggbGF0ZW5jeSA1IGN5Y2xlcyAqLwotIyBkZWZpbmUgTUNJX0NNRFJfTUFYTEFUXzY0Q1lDCSggIDEgPDwgMTIpCS8qIE1heCBsYXRlbmN5IDY0IGN5Y2xlcyAqLwotIyBkZWZpbmUgTUNJX0NNRFJfU1RBUlRfWEZFUgkoICAxIDw8IDE2KQkvKiBTdGFydCBkYXRhIHRyYW5zZmVyICovCi0jIGRlZmluZSBNQ0lfQ01EUl9TVE9QX1hGRVIJKCAgMiA8PCAxNikJLyogU3RvcCBkYXRhIHRyYW5zZmVyICovCi0jIGRlZmluZSBNQ0lfQ01EUl9UUkRJUl9XUklURQkoICAwIDw8IDE4KQkvKiBXcml0ZSBkYXRhICovCi0jIGRlZmluZSBNQ0lfQ01EUl9UUkRJUl9SRUFECSggIDEgPDwgMTgpCS8qIFJlYWQgZGF0YSAqLwotIyBkZWZpbmUgTUNJX0NNRFJfQkxPQ0sJCSggIDAgPDwgMTkpCS8qIFNpbmdsZS1ibG9jayB0cmFuc2ZlciAqLwotIyBkZWZpbmUgTUNJX0NNRFJfTVVMVElfQkxPQ0sJKCAgMSA8PCAxOSkJLyogTXVsdGktYmxvY2sgdHJhbnNmZXIgKi8KLSMgZGVmaW5lIE1DSV9DTURSX1NUUkVBTQkoICAyIDw8IDE5KQkvKiBNTUMgU3RyZWFtIHRyYW5zZmVyICovCi0jIGRlZmluZSBNQ0lfQ01EUl9TRElPX0JZVEUJKCAgNCA8PCAxOSkJLyogU0RJTyBCeXRlIHRyYW5zZmVyICovCi0jIGRlZmluZSBNQ0lfQ01EUl9TRElPX0JMT0NLCSggIDUgPDwgMTkpCS8qIFNESU8gQmxvY2sgdHJhbnNmZXIgKi8KLSMgZGVmaW5lIE1DSV9DTURSX1NESU9fU1VTUEVORAkoICAxIDw8IDI0KQkvKiBTRElPIFN1c3BlbmQgQ29tbWFuZCAqLwotIyBkZWZpbmUgTUNJX0NNRFJfU0RJT19SRVNVTUUJKCAgMiA8PCAyNCkJLyogU0RJTyBSZXN1bWUgQ29tbWFuZCAqLwotI2RlZmluZSBNQ0lfQkxLUgkJMHgwMDE4CS8qIEJsb2NrICovCi0jIGRlZmluZSBNQ0lfQkNOVCh4KQkJKCh4KSA8PCAgMCkJLyogRGF0YSBCbG9jayBDb3VudCAqLwotIyBkZWZpbmUgTUNJX0JMS0xFTih4KQkJKCh4KSA8PCAxNikJLyogRGF0YSBCbG9jayBMZW5ndGggKi8KLSNkZWZpbmUgTUNJX0NTVE9SCQkweDAwMWMJLyogQ29tcGxldGlvbiBTaWduYWwgVGltZW91dFsyXSAqLwotIyBkZWZpbmUgTUNJX0NTVE9DWUMoeCkJCSgoeCkgPDwgIDApCS8qIENTVCBjeWNsZXMgKi8KLSMgZGVmaW5lIE1DSV9DU1RPTVVMKHgpCQkoKHgpIDw8ICA0KQkvKiBDU1QgbXVsdGlwbGllciAqLwotI2RlZmluZSBNQ0lfUlNQUgkJMHgwMDIwCS8qIFJlc3BvbnNlIDAgKi8KLSNkZWZpbmUgTUNJX1JTUFIxCQkweDAwMjQJLyogUmVzcG9uc2UgMSAqLwotI2RlZmluZSBNQ0lfUlNQUjIJCTB4MDAyOAkvKiBSZXNwb25zZSAyICovCi0jZGVmaW5lIE1DSV9SU1BSMwkJMHgwMDJjCS8qIFJlc3BvbnNlIDMgKi8KLSNkZWZpbmUgTUNJX1JEUgkJCTB4MDAzMAkvKiBSZWNlaXZlIERhdGEgKi8KLSNkZWZpbmUgTUNJX1REUgkJCTB4MDAzNAkvKiBUcmFuc21pdCBEYXRhICovCi0jZGVmaW5lIE1DSV9TUgkJCTB4MDA0MAkvKiBTdGF0dXMgKi8KLSNkZWZpbmUgTUNJX0lFUgkJCTB4MDA0NAkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIE1DSV9JRFIJCQkweDAwNDgJLyogSW50ZXJydXB0IERpc2FibGUgKi8KLSNkZWZpbmUgTUNJX0lNUgkJCTB4MDA0YwkvKiBJbnRlcnJ1cHQgTWFzayAqLwotIyBkZWZpbmUgTUNJX0NNRFJEWQkJKCAgMSA8PCAgIDApCS8qIENvbW1hbmQgUmVhZHkgKi8KLSMgZGVmaW5lIE1DSV9SWFJEWQkJKCAgMSA8PCAgIDEpCS8qIFJlY2VpdmVyIFJlYWR5ICovCi0jIGRlZmluZSBNQ0lfVFhSRFkJCSggIDEgPDwgICAyKQkvKiBUcmFuc21pdHRlciBSZWFkeSAqLwotIyBkZWZpbmUgTUNJX0JMS0UJCSggIDEgPDwgICAzKQkvKiBEYXRhIEJsb2NrIEVuZGVkICovCi0jIGRlZmluZSBNQ0lfRFRJUAkJKCAgMSA8PCAgIDQpCS8qIERhdGEgVHJhbnNmZXIgSW4gUHJvZ3Jlc3MgKi8KLSMgZGVmaW5lIE1DSV9OT1RCVVNZCQkoICAxIDw8ICAgNSkJLyogRGF0YSBOb3QgQnVzeSAqLwotIyBkZWZpbmUgTUNJX1NESU9JUlFBCQkoICAxIDw8ICAgOCkJLyogU0RJTyBJUlEgaW4gc2xvdCBBICovCi0jIGRlZmluZSBNQ0lfU0RJT0lSUUIJCSggIDEgPDwgICA5KQkvKiBTRElPIElSUSBpbiBzbG90IEIgKi8KLSMgZGVmaW5lIE1DSV9SSU5ERQkJKCAgMSA8PCAgMTYpCS8qIFJlc3BvbnNlIEluZGV4IEVycm9yICovCi0jIGRlZmluZSBNQ0lfUkRJUkUJCSggIDEgPDwgIDE3KQkvKiBSZXNwb25zZSBEaXJlY3Rpb24gRXJyb3IgKi8KLSMgZGVmaW5lIE1DSV9SQ1JDRQkJKCAgMSA8PCAgMTgpCS8qIFJlc3BvbnNlIENSQyBFcnJvciAqLwotIyBkZWZpbmUgTUNJX1JFTkRFCQkoICAxIDw8ICAxOSkJLyogUmVzcG9uc2UgRW5kIEJpdCBFcnJvciAqLwotIyBkZWZpbmUgTUNJX1JUT0UJCSggIDEgPDwgIDIwKQkvKiBSZXNwb25zZSBUaW1lLU91dCBFcnJvciAqLwotIyBkZWZpbmUgTUNJX0RDUkNFCQkoICAxIDw8ICAyMSkJLyogRGF0YSBDUkMgRXJyb3IgKi8KLSMgZGVmaW5lIE1DSV9EVE9FCQkoICAxIDw8ICAyMikJLyogRGF0YSBUaW1lLU91dCBFcnJvciAqLwotIyBkZWZpbmUgTUNJX09WUkUJCSggIDEgPDwgIDMwKQkvKiBSWCBPdmVycnVuIEVycm9yICovCi0jIGRlZmluZSBNQ0lfVU5SRQkJKCAgMSA8PCAgMzEpCS8qIFRYIFVuZGVycnVuIEVycm9yICovCi0jZGVmaW5lIE1DSV9ETUEJCQkweDAwNTAJLyogRE1BIENvbmZpZ3VyYXRpb25bMl0gKi8KLSMgZGVmaW5lIE1DSV9ETUFfT0ZGU0VUKHgpCSgoeCkgPDwgIDApCS8qIERNQSBXcml0ZSBCdWZmZXIgT2Zmc2V0ICovCi0jIGRlZmluZSBNQ0lfRE1BX0NIS1NJWkUoeCkJKCh4KSA8PCAgNCkJLyogRE1BIENoYW5uZWwgUmVhZCBhbmQgV3JpdGUgQ2h1bmsgU2l6ZSAqLwotIyBkZWZpbmUgTUNJX0RNQUVOCQkoICAxIDw8ICA4KQkvKiBETUEgSGFyZHdhcmUgSGFuZHNoYWtpbmcgRW5hYmxlICovCi0jZGVmaW5lIE1DSV9DRkcJCQkweDAwNTQJLyogQ29uZmlndXJhdGlvblsyXSAqLwotIyBkZWZpbmUgTUNJX0NGR19GSUZPTU9ERV8xREFUQQkoICAxIDw8ICAwKQkvKiBNQ0kgSW50ZXJuYWwgRklGTyBjb250cm9sIG1vZGUgKi8KLSMgZGVmaW5lIE1DSV9DRkdfRkVSUkNUUkxfQ09SCSggIDEgPDwgIDQpCS8qIEZsb3cgRXJyb3IgZmxhZyByZXNldCBjb250cm9sIG1vZGUgKi8KLSMgZGVmaW5lIE1DSV9DRkdfSFNNT0RFCQkoICAxIDw8ICA4KQkvKiBIaWdoIFNwZWVkIE1vZGUgKi8KLSMgZGVmaW5lIE1DSV9DRkdfTFNZTkMJCSggIDEgPDwgMTIpCS8qIFN5bmNocm9uaXplIG9uIHRoZSBsYXN0IGJsb2NrICovCi0jZGVmaW5lIE1DSV9XUE1SCQkweDAwZTQJLyogV3JpdGUgUHJvdGVjdGlvbiBNb2RlWzJdICovCi0jIGRlZmluZSBNQ0lfV1BfRU4JCSggIDEgPDwgIDApCS8qIFdQIEVuYWJsZSAqLwotIyBkZWZpbmUgTUNJX1dQX0tFWQkJKDB4NGQ0MzQ5IDw8IDgpCS8qIFdQIEtleSAqLwotI2RlZmluZSBNQ0lfV1BTUgkJMHgwMGU4CS8qIFdyaXRlIFByb3RlY3Rpb24gU3RhdHVzWzJdICovCi0jIGRlZmluZSBNQ0lfR0VUX1dQX1ZTKHgpCSgoeCkgJiAweDBmKQotIyBkZWZpbmUgTUNJX0dFVF9XUF9WU1JDKHgpCSgoKHgpID4+IDgpICYgMHhmZmZmKQotI2RlZmluZSBNQ0lfRklGT19BUEVSVFVSRQkweDAyMDAJLyogRklGTyBBcGVydHVyZVsyXSAqLworI2RlZmluZSBBVE1DSV9DUgkJCTB4MDAwMAkvKiBDb250cm9sICovCisjIGRlZmluZSBBVE1DSV9DUl9NQ0lFTgkJCSggIDEgPDwgIDApCS8qIE1DSSBFbmFibGUgKi8KKyMgZGVmaW5lIEFUTUNJX0NSX01DSURJUwkJKCAgMSA8PCAgMSkJLyogTUNJIERpc2FibGUgKi8KKyMgZGVmaW5lIEFUTUNJX0NSX1BXU0VOCQkJKCAgMSA8PCAgMikJLyogUG93ZXIgU2F2ZSBFbmFibGUgKi8KKyMgZGVmaW5lIEFUTUNJX0NSX1BXU0RJUwkJKCAgMSA8PCAgMykJLyogUG93ZXIgU2F2ZSBEaXNhYmxlICovCisjIGRlZmluZSBBVE1DSV9DUl9TV1JTVAkJCSggIDEgPDwgIDcpCS8qIFNvZnR3YXJlIFJlc2V0ICovCisjZGVmaW5lIEFUTUNJX01SCQkJMHgwMDA0CS8qIE1vZGUgKi8KKyMgZGVmaW5lIEFUTUNJX01SX0NMS0RJVih4KQkJKCh4KSA8PCAgMCkJLyogQ2xvY2sgRGl2aWRlciAqLworIyBkZWZpbmUgQVRNQ0lfTVJfUFdTRElWKHgpCQkoKHgpIDw8ICA4KQkvKiBQb3dlciBTYXZpbmcgRGl2aWRlciAqLworIyBkZWZpbmUgQVRNQ0lfTVJfUkRQUk9PRgkJKCAgMSA8PCAxMSkJLyogUmVhZCBQcm9vZiAqLworIyBkZWZpbmUgQVRNQ0lfTVJfV1JQUk9PRgkJKCAgMSA8PCAxMikJLyogV3JpdGUgUHJvb2YgKi8KKyMgZGVmaW5lIEFUTUNJX01SX1BEQ0ZCWVRFCQkoICAxIDw8IDEzKQkvKiBGb3JjZSBCeXRlIFRyYW5zZmVyICovCisjIGRlZmluZSBBVE1DSV9NUl9QRENQQURWCQkoICAxIDw8IDE0KQkvKiBQYWRkaW5nIFZhbHVlICovCisjIGRlZmluZSBBVE1DSV9NUl9QRENNT0RFCQkoICAxIDw8IDE1KQkvKiBQREMtb3JpZW50ZWQgTW9kZSAqLworI2RlZmluZSBBVE1DSV9EVE9SCQkJMHgwMDA4CS8qIERhdGEgVGltZW91dCAqLworIyBkZWZpbmUgQVRNQ0lfRFRPQ1lDKHgpCQkoKHgpIDw8ICAwKQkvKiBEYXRhIFRpbWVvdXQgQ3ljbGVzICovCisjIGRlZmluZSBBVE1DSV9EVE9NVUwoeCkJCSgoeCkgPDwgIDQpCS8qIERhdGEgVGltZW91dCBNdWx0aXBsaWVyICovCisjZGVmaW5lIEFUTUNJX1NEQ1IJCQkweDAwMGMJLyogU0QgQ2FyZCAvIFNESU8gKi8KKyMgZGVmaW5lIEFUTUNJX1NEQ1NFTF9TTE9UX0EJCSggIDAgPDwgIDApCS8qIFNlbGVjdCBTRCBzbG90IEEgKi8KKyMgZGVmaW5lIEFUTUNJX1NEQ1NFTF9TTE9UX0IJCSggIDEgPDwgIDApCS8qIFNlbGVjdCBTRCBzbG90IEEgKi8KKyMgZGVmaW5lIEFUTUNJX1NEQ1NFTF9NQVNLCQkoICAzIDw8ICAwKQorIyBkZWZpbmUgQVRNQ0lfU0RDQlVTXzFCSVQJCSggIDAgPDwgIDYpCS8qIDEtYml0IGRhdGEgYnVzICovCisjIGRlZmluZSBBVE1DSV9TRENCVVNfNEJJVAkJKCAgMiA8PCAgNikJLyogNC1iaXQgZGF0YSBidXMgKi8KKyMgZGVmaW5lIEFUTUNJX1NEQ0JVU184QklUCQkoICAzIDw8ICA2KQkvKiA4LWJpdCBkYXRhIGJ1c1syXSAqLworIyBkZWZpbmUgQVRNQ0lfU0RDQlVTX01BU0sJCSggIDMgPDwgIDYpCisjZGVmaW5lIEFUTUNJX0FSR1IJCQkweDAwMTAJLyogQ29tbWFuZCBBcmd1bWVudCAqLworI2RlZmluZSBBVE1DSV9DTURSCQkJMHgwMDE0CS8qIENvbW1hbmQgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfQ01ETkIoeCkJCSgoeCkgPDwgIDApCS8qIENvbW1hbmQgT3Bjb2RlICovCisjIGRlZmluZSBBVE1DSV9DTURSX1JTUFRZUF9OT05FCQkoICAwIDw8ICA2KQkvKiBObyByZXNwb25zZSAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9SU1BUWVBfNDhCSVQJKCAgMSA8PCAgNikJLyogNDgtYml0IHJlc3BvbnNlICovCisjIGRlZmluZSBBVE1DSV9DTURSX1JTUFRZUF8xMzZCSVQJKCAgMiA8PCAgNikJLyogMTM2LWJpdCByZXNwb25zZSAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9TUENNRF9JTklUCQkoICAxIDw8ICA4KQkvKiBJbml0aWFsaXphdGlvbiBjb21tYW5kICovCisjIGRlZmluZSBBVE1DSV9DTURSX1NQQ01EX1NZTkMJCSggIDIgPDwgIDgpCS8qIFN5bmNocm9uaXplZCBjb21tYW5kICovCisjIGRlZmluZSBBVE1DSV9DTURSX1NQQ01EX0lOVAkJKCAgNCA8PCAgOCkJLyogSW50ZXJydXB0IGNvbW1hbmQgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfU1BDTURfSU5UUkVTUAkoICA1IDw8ICA4KQkvKiBJbnRlcnJ1cHQgcmVzcG9uc2UgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfT1BEQ01ECQkoICAxIDw8IDExKQkvKiBPcGVuIERyYWluICovCisjIGRlZmluZSBBVE1DSV9DTURSX01BWExBVF81Q1lDCQkoICAwIDw8IDEyKQkvKiBNYXggbGF0ZW5jeSA1IGN5Y2xlcyAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9NQVhMQVRfNjRDWUMJKCAgMSA8PCAxMikJLyogTWF4IGxhdGVuY3kgNjQgY3ljbGVzICovCisjIGRlZmluZSBBVE1DSV9DTURSX1NUQVJUX1hGRVIJCSggIDEgPDwgMTYpCS8qIFN0YXJ0IGRhdGEgdHJhbnNmZXIgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfU1RPUF9YRkVSCQkoICAyIDw8IDE2KQkvKiBTdG9wIGRhdGEgdHJhbnNmZXIgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfVFJESVJfV1JJVEUJCSggIDAgPDwgMTgpCS8qIFdyaXRlIGRhdGEgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfVFJESVJfUkVBRAkJKCAgMSA8PCAxOCkJLyogUmVhZCBkYXRhICovCisjIGRlZmluZSBBVE1DSV9DTURSX0JMT0NLCQkoICAwIDw8IDE5KQkvKiBTaW5nbGUtYmxvY2sgdHJhbnNmZXIgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfTVVMVElfQkxPQ0sJCSggIDEgPDwgMTkpCS8qIE11bHRpLWJsb2NrIHRyYW5zZmVyICovCisjIGRlZmluZSBBVE1DSV9DTURSX1NUUkVBTQkJKCAgMiA8PCAxOSkJLyogTU1DIFN0cmVhbSB0cmFuc2ZlciAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9TRElPX0JZVEUJCSggIDQgPDwgMTkpCS8qIFNESU8gQnl0ZSB0cmFuc2ZlciAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9TRElPX0JMT0NLCQkoICA1IDw8IDE5KQkvKiBTRElPIEJsb2NrIHRyYW5zZmVyICovCisjIGRlZmluZSBBVE1DSV9DTURSX1NESU9fU1VTUEVORAkoICAxIDw8IDI0KQkvKiBTRElPIFN1c3BlbmQgQ29tbWFuZCAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9TRElPX1JFU1VNRQkJKCAgMiA8PCAyNCkJLyogU0RJTyBSZXN1bWUgQ29tbWFuZCAqLworI2RlZmluZSBBVE1DSV9CTEtSCQkJMHgwMDE4CS8qIEJsb2NrICovCisjIGRlZmluZSBBVE1DSV9CQ05UKHgpCQkJKCh4KSA8PCAgMCkJLyogRGF0YSBCbG9jayBDb3VudCAqLworIyBkZWZpbmUgQVRNQ0lfQkxLTEVOKHgpCQkoKHgpIDw8IDE2KQkvKiBEYXRhIEJsb2NrIExlbmd0aCAqLworI2RlZmluZSBBVE1DSV9DU1RPUgkJCTB4MDAxYwkvKiBDb21wbGV0aW9uIFNpZ25hbCBUaW1lb3V0WzJdICovCisjIGRlZmluZSBBVE1DSV9DU1RPQ1lDKHgpCQkoKHgpIDw8ICAwKQkvKiBDU1QgY3ljbGVzICovCisjIGRlZmluZSBBVE1DSV9DU1RPTVVMKHgpCQkoKHgpIDw8ICA0KQkvKiBDU1QgbXVsdGlwbGllciAqLworI2RlZmluZSBBVE1DSV9SU1BSCQkJMHgwMDIwCS8qIFJlc3BvbnNlIDAgKi8KKyNkZWZpbmUgQVRNQ0lfUlNQUjEJCQkweDAwMjQJLyogUmVzcG9uc2UgMSAqLworI2RlZmluZSBBVE1DSV9SU1BSMgkJCTB4MDAyOAkvKiBSZXNwb25zZSAyICovCisjZGVmaW5lIEFUTUNJX1JTUFIzCQkJMHgwMDJjCS8qIFJlc3BvbnNlIDMgKi8KKyNkZWZpbmUgQVRNQ0lfUkRSCQkJMHgwMDMwCS8qIFJlY2VpdmUgRGF0YSAqLworI2RlZmluZSBBVE1DSV9URFIJCQkweDAwMzQJLyogVHJhbnNtaXQgRGF0YSAqLworI2RlZmluZSBBVE1DSV9TUgkJCTB4MDA0MAkvKiBTdGF0dXMgKi8KKyNkZWZpbmUgQVRNQ0lfSUVSCQkJMHgwMDQ0CS8qIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgQVRNQ0lfSURSCQkJMHgwMDQ4CS8qIEludGVycnVwdCBEaXNhYmxlICovCisjZGVmaW5lIEFUTUNJX0lNUgkJCTB4MDA0YwkvKiBJbnRlcnJ1cHQgTWFzayAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUkRZCQkJKCAgMSA8PCAgIDApCS8qIENvbW1hbmQgUmVhZHkgKi8KKyMgZGVmaW5lIEFUTUNJX1JYUkRZCQkJKCAgMSA8PCAgIDEpCS8qIFJlY2VpdmVyIFJlYWR5ICovCisjIGRlZmluZSBBVE1DSV9UWFJEWQkJCSggIDEgPDwgICAyKQkvKiBUcmFuc21pdHRlciBSZWFkeSAqLworIyBkZWZpbmUgQVRNQ0lfQkxLRQkJCSggIDEgPDwgICAzKQkvKiBEYXRhIEJsb2NrIEVuZGVkICovCisjIGRlZmluZSBBVE1DSV9EVElQCQkJKCAgMSA8PCAgIDQpCS8qIERhdGEgVHJhbnNmZXIgSW4gUHJvZ3Jlc3MgKi8KKyMgZGVmaW5lIEFUTUNJX05PVEJVU1kJCQkoICAxIDw8ICAgNSkJLyogRGF0YSBOb3QgQnVzeSAqLworIyBkZWZpbmUgQVRNQ0lfRU5EUlgJCQkoICAxIDw8ICAgNikgICAgLyogRW5kIG9mIFJYIEJ1ZmZlciAqLworIyBkZWZpbmUgQVRNQ0lfRU5EVFgJCQkoICAxIDw8ICAgNykgICAgLyogRW5kIG9mIFRYIEJ1ZmZlciAqLworIyBkZWZpbmUgQVRNQ0lfU0RJT0lSUUEJCQkoICAxIDw8ICAgOCkJLyogU0RJTyBJUlEgaW4gc2xvdCBBICovCisjIGRlZmluZSBBVE1DSV9TRElPSVJRQgkJCSggIDEgPDwgICA5KQkvKiBTRElPIElSUSBpbiBzbG90IEIgKi8KKyMgZGVmaW5lIEFUTUNJX1NESU9XQUlUCQkJKCAgMSA8PCAgMTIpICAgIC8qIFNESU8gUmVhZCBXYWl0IE9wZXJhdGlvbiBTdGF0dXMgKi8KKyMgZGVmaW5lIEFUTUNJX0NTUkNWCQkJKCAgMSA8PCAgMTMpICAgIC8qIENFLUFUQSBDb21wbGV0aW9uIFNpZ25hbCBSZWNlaXZlZCAqLworIyBkZWZpbmUgQVRNQ0lfUlhCVUZGCQkJKCAgMSA8PCAgMTQpICAgIC8qIFJYIEJ1ZmZlciBGdWxsICovCisjIGRlZmluZSBBVE1DSV9UWEJVRkUJCQkoICAxIDw8ICAxNSkgICAgLyogVFggQnVmZmVyIEVtcHR5ICovCisjIGRlZmluZSBBVE1DSV9SSU5ERQkJCSggIDEgPDwgIDE2KQkvKiBSZXNwb25zZSBJbmRleCBFcnJvciAqLworIyBkZWZpbmUgQVRNQ0lfUkRJUkUJCQkoICAxIDw8ICAxNykJLyogUmVzcG9uc2UgRGlyZWN0aW9uIEVycm9yICovCisjIGRlZmluZSBBVE1DSV9SQ1JDRQkJCSggIDEgPDwgIDE4KQkvKiBSZXNwb25zZSBDUkMgRXJyb3IgKi8KKyMgZGVmaW5lIEFUTUNJX1JFTkRFCQkJKCAgMSA8PCAgMTkpCS8qIFJlc3BvbnNlIEVuZCBCaXQgRXJyb3IgKi8KKyMgZGVmaW5lIEFUTUNJX1JUT0UJCQkoICAxIDw8ICAyMCkJLyogUmVzcG9uc2UgVGltZS1PdXQgRXJyb3IgKi8KKyMgZGVmaW5lIEFUTUNJX0RDUkNFCQkJKCAgMSA8PCAgMjEpCS8qIERhdGEgQ1JDIEVycm9yICovCisjIGRlZmluZSBBVE1DSV9EVE9FCQkJKCAgMSA8PCAgMjIpCS8qIERhdGEgVGltZS1PdXQgRXJyb3IgKi8KKyMgZGVmaW5lIEFUTUNJX0NTVE9FCQkJKCAgMSA8PCAgMjMpICAgIC8qIENvbXBsZXRpb24gU2lnbmFsIFRpbWUtb3V0IEVycm9yICovCisjIGRlZmluZSBBVE1DSV9CTEtPVlJFCQkJKCAgMSA8PCAgMjQpICAgIC8qIERNQSBCbG9jayBPdmVycnVuIEVycm9yICovCisjIGRlZmluZSBBVE1DSV9ETUFET05FCQkJKCAgMSA8PCAgMjUpICAgIC8qIERNQSBUcmFuc2ZlciBEb25lICovCisjIGRlZmluZSBBVE1DSV9GSUZPRU1QVFkJCSggIDEgPDwgIDI2KSAgICAvKiBGSUZPIEVtcHR5IEZsYWcgKi8KKyMgZGVmaW5lIEFUTUNJX1hGUkRPTkUJCQkoICAxIDw8ICAyNykgICAgLyogVHJhbnNmZXIgRG9uZSBGbGFnICovCisjIGRlZmluZSBBVE1DSV9BQ0tSQ1YJCQkoICAxIDw8ICAyOCkgICAgLyogQm9vdCBPcGVyYXRpb24gQWNrbm93bGVkZ2UgUmVjZWl2ZWQgKi8KKyMgZGVmaW5lIEFUTUNJX0FDS1JDVkUJCQkoICAxIDw8ICAyOSkgICAgLyogQm9vdCBPcGVyYXRpb24gQWNrbm93bGVkZ2UgRXJyb3IgKi8KKyMgZGVmaW5lIEFUTUNJX09WUkUJCQkoICAxIDw8ICAzMCkJLyogUlggT3ZlcnJ1biBFcnJvciAqLworIyBkZWZpbmUgQVRNQ0lfVU5SRQkJCSggIDEgPDwgIDMxKQkvKiBUWCBVbmRlcnJ1biBFcnJvciAqLworI2RlZmluZSBBVE1DSV9ETUEJCQkweDAwNTAJLyogRE1BIENvbmZpZ3VyYXRpb25bMl0gKi8KKyMgZGVmaW5lIEFUTUNJX0RNQV9PRkZTRVQoeCkJCSgoeCkgPDwgIDApCS8qIERNQSBXcml0ZSBCdWZmZXIgT2Zmc2V0ICovCisjIGRlZmluZSBBVE1DSV9ETUFfQ0hLU0laRSh4KQkJKCh4KSA8PCAgNCkJLyogRE1BIENoYW5uZWwgUmVhZCBhbmQgV3JpdGUgQ2h1bmsgU2l6ZSAqLworIyBkZWZpbmUgQVRNQ0lfRE1BRU4JCQkoICAxIDw8ICA4KQkvKiBETUEgSGFyZHdhcmUgSGFuZHNoYWtpbmcgRW5hYmxlICovCisjZGVmaW5lIEFUTUNJX0NGRwkJCTB4MDA1NAkvKiBDb25maWd1cmF0aW9uWzJdICovCisjIGRlZmluZSBBVE1DSV9DRkdfRklGT01PREVfMURBVEEJKCAgMSA8PCAgMCkJLyogTUNJIEludGVybmFsIEZJRk8gY29udHJvbCBtb2RlICovCisjIGRlZmluZSBBVE1DSV9DRkdfRkVSUkNUUkxfQ09SCQkoICAxIDw8ICA0KQkvKiBGbG93IEVycm9yIGZsYWcgcmVzZXQgY29udHJvbCBtb2RlICovCisjIGRlZmluZSBBVE1DSV9DRkdfSFNNT0RFCQkoICAxIDw8ICA4KQkvKiBIaWdoIFNwZWVkIE1vZGUgKi8KKyMgZGVmaW5lIEFUTUNJX0NGR19MU1lOQwkJKCAgMSA8PCAxMikJLyogU3luY2hyb25pemUgb24gdGhlIGxhc3QgYmxvY2sgKi8KKyNkZWZpbmUgQVRNQ0lfV1BNUgkJCTB4MDBlNAkvKiBXcml0ZSBQcm90ZWN0aW9uIE1vZGVbMl0gKi8KKyMgZGVmaW5lIEFUTUNJX1dQX0VOCQkJKCAgMSA8PCAgMCkJLyogV1AgRW5hYmxlICovCisjIGRlZmluZSBBVE1DSV9XUF9LRVkJCQkoMHg0ZDQzNDkgPDwgOCkJLyogV1AgS2V5ICovCisjZGVmaW5lIEFUTUNJX1dQU1IJCQkweDAwZTgJLyogV3JpdGUgUHJvdGVjdGlvbiBTdGF0dXNbMl0gKi8KKyMgZGVmaW5lIEFUTUNJX0dFVF9XUF9WUyh4KQkJKCh4KSAmIDB4MGYpCisjIGRlZmluZSBBVE1DSV9HRVRfV1BfVlNSQyh4KQkJKCgoeCkgPj4gOCkgJiAweGZmZmYpCisjZGVmaW5lIEFUTUNJX1ZFUlNJT04JCQkweDAwRkMgIC8qIFZlcnNpb24gKi8KKyNkZWZpbmUgQVRNQ0lfRklGT19BUEVSVFVSRQkJMHgwMjAwCS8qIEZJRk8gQXBlcnR1cmVbMl0gKi8KIAogLyogVGhpcyBpcyBub3QgaW5jbHVkaW5nIHRoZSBGSUZPIEFwZXJ0dXJlIG9uIE1DSTIgKi8KLSNkZWZpbmUgTUNJX1JFR1NfU0laRQkJMHgxMDAKKyNkZWZpbmUgQVRNQ0lfUkVHU19TSVpFCQkweDEwMAogCiAvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCi0jZGVmaW5lIG1jaV9yZWFkbChwb3J0LHJlZykJCQkJXAotCV9fcmF3X3JlYWRsKChwb3J0KS0+cmVncyArIE1DSV8jI3JlZykKLSNkZWZpbmUgbWNpX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkJCQlcCi0JX19yYXdfd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIE1DSV8jI3JlZykKKyNkZWZpbmUgYXRtY2lfcmVhZGwocG9ydCxyZWcpCQkJCVwKKwlfX3Jhd19yZWFkbCgocG9ydCktPnJlZ3MgKyByZWcpCisjZGVmaW5lIGF0bWNpX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkJCQlcCisJX19yYXdfd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIHJlZykKIAogI2VuZGlmIC8qIF9fRFJJVkVSU19NTUNfQVRNRUxfTUNJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKaW5kZXggZmE4Y2FlMS4uYTdlZTUwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2F0bWVsLW1jaS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsX3BkYy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgpAQCAtMzksNyArNDAsNyBAQAogCiAjaW5jbHVkZSAiYXRtZWwtbWNpLXJlZ3MuaCIKIAotI2RlZmluZSBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTCShNQ0lfRENSQ0UgfCBNQ0lfRFRPRSB8IE1DSV9PVlJFIHwgTUNJX1VOUkUpCisjZGVmaW5lIEFUTUNJX0RBVEFfRVJST1JfRkxBR1MJKEFUTUNJX0RDUkNFIHwgQVRNQ0lfRFRPRSB8IEFUTUNJX09WUkUgfCBBVE1DSV9VTlJFKQogI2RlZmluZSBBVE1DSV9ETUFfVEhSRVNIT0xECTE2CiAKIGVudW0gewpAQCAtNTgsMTggKzU5LDM1IEBACiAJU1RBVEVfREFUQV9FUlJPUiwKIH07CiAKK2VudW0gYXRtY2lfeGZlcl9kaXIgeworCVhGRVJfUkVDRUlWRSA9IDAsCisJWEZFUl9UUkFOU01JVCwKK307CisKK2VudW0gYXRtY2lfcGRjX2J1ZiB7CisJUERDX0ZJUlNUX0JVRiA9IDAsCisJUERDX1NFQ09ORF9CVUYsCit9OworCitzdHJ1Y3QgYXRtZWxfbWNpX2NhcHMgeworCWJvb2wgICAgaGFzX2RtYTsKKwlib29sICAgIGhhc19wZGM7CisJYm9vbCAgICBoYXNfY2ZnX3JlZzsKKwlib29sICAgIGhhc19jc3Rvcl9yZWc7CisJYm9vbCAgICBoYXNfaGlnaHNwZWVkOworCWJvb2wgICAgaGFzX3J3cHJvb2Y7Cit9OworCiBzdHJ1Y3QgYXRtZWxfbWNpX2RtYSB7Ci0jaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKIAlzdHJ1Y3QgZG1hX2NoYW4JCQkqY2hhbjsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKmRhdGFfZGVzYzsKLSNlbmRpZgogfTsKIAogLyoqCiAgKiBzdHJ1Y3QgYXRtZWxfbWNpIC0gTU1DIGNvbnRyb2xsZXIgc3RhdGUgc2hhcmVkIGJldHdlZW4gYWxsIHNsb3RzCiAgKiBAbG9jazogU3BpbmxvY2sgcHJvdGVjdGluZyB0aGUgcXVldWUgYW5kIGFzc29jaWF0ZWQgZGF0YS4KICAqIEByZWdzOiBQb2ludGVyIHRvIE1NSU8gcmVnaXN0ZXJzLgotICogQHNnOiBTY2F0dGVybGlzdCBlbnRyeSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIGJ5IFBJTyBjb2RlLCBpZiBhbnkuCisgKiBAc2c6IFNjYXR0ZXJsaXN0IGVudHJ5IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgYnkgUElPIG9yIFBEQyBjb2RlLgogICogQHBpb19vZmZzZXQ6IE9mZnNldCBpbnRvIHRoZSBjdXJyZW50IHNjYXR0ZXJsaXN0IGVudHJ5LgogICogQGN1cl9zbG90OiBUaGUgc2xvdCB3aGljaCBpcyBjdXJyZW50bHkgdXNpbmcgdGhlIGNvbnRyb2xsZXIuCiAgKiBAbXJxOiBUaGUgcmVxdWVzdCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIG9uIEBjdXJfc2xvdCwKQEAgLTc3LDYgKzk1LDcgQEAKICAqIEBjbWQ6IFRoZSBjb21tYW5kIGN1cnJlbnRseSBiZWluZyBzZW50IHRvIHRoZSBjYXJkLCBvciBOVUxMLgogICogQGRhdGE6IFRoZSBkYXRhIGN1cnJlbnRseSBiZWluZyB0cmFuc2ZlcnJlZCwgb3IgTlVMTCBpZiBubyBkYXRhCiAgKgl0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcy4KKyAqIEBkYXRhX3NpemU6IGp1c3QgZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3ouCiAgKiBAZG1hOiBETUEgY2xpZW50IHN0YXRlLgogICogQGRhdGFfY2hhbjogRE1BIGNoYW5uZWwgYmVpbmcgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZGF0YSB0cmFuc2Zlci4KICAqIEBjbWRfc3RhdHVzOiBTbmFwc2hvdCBvZiBTUiB0YWtlbiB1cG9uIGNvbXBsZXRpb24gb2YgdGhlIGN1cnJlbnQKQEAgLTEwMyw2ICsxMjIsMTMgQEAKICAqIEBtY2s6IFRoZSBwZXJpcGhlcmFsIGJ1cyBjbG9jayBob29rZWQgdXAgdG8gdGhlIE1NQyBjb250cm9sbGVyLgogICogQHBkZXY6IFBsYXRmb3JtIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIE1NQyBjb250cm9sbGVyLgogICogQHNsb3Q6IFNsb3RzIHNoYXJpbmcgdGhpcyBNTUMgY29udHJvbGxlci4KKyAqIEBjYXBzOiBNQ0kgY2FwYWJpbGl0aWVzIGRlcGVuZGluZyBvbiBNQ0kgdmVyc2lvbi4KKyAqIEBwcmVwYXJlX2RhdGE6IGZ1bmN0aW9uIHRvIHNldHVwIE1DSSBiZWZvcmUgZGF0YSB0cmFuc2ZlciB3aGljaAorICogZGVwZW5kcyBvbiBNQ0kgY2FwYWJpbGl0aWVzLgorICogQHN1Ym1pdF9kYXRhOiBmdW5jdGlvbiB0byBzdGFydCBkYXRhIHRyYW5zZmVyIHdoaWNoIGRlcGVuZHMgb24gTUNJCisgKiBjYXBhYmlsaXRpZXMuCisgKiBAc3RvcF90cmFuc2ZlcjogZnVuY3Rpb24gdG8gc3RvcCBkYXRhIHRyYW5zZmVyIHdoaWNoIGRlcGVuZHMgb24gTUNJCisgKiBjYXBhYmlsaXRpZXMuCiAgKgogICogTG9ja2luZwogICogPT09PT09PQpAQCAtMTQzLDYgKzE2OSw3IEBACiAJc3RydWN0IG1tY19yZXF1ZXN0CSptcnE7CiAJc3RydWN0IG1tY19jb21tYW5kCSpjbWQ7CiAJc3RydWN0IG1tY19kYXRhCQkqZGF0YTsKKwl1bnNpZ25lZCBpbnQJCWRhdGFfc2l6ZTsKIAogCXN0cnVjdCBhdG1lbF9tY2lfZG1hCWRtYTsKIAlzdHJ1Y3QgZG1hX2NoYW4JCSpkYXRhX2NoYW47CkBAIC0xNjYsNyArMTkzLDEzIEBACiAJc3RydWN0IGNsawkJKm1jazsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OwogCi0Jc3RydWN0IGF0bWVsX21jaV9zbG90CSpzbG90W0FUTUVMX01DSV9NQVhfTlJfU0xPVFNdOworCXN0cnVjdCBhdG1lbF9tY2lfc2xvdAkqc2xvdFtBVE1DSV9NQVhfTlJfU0xPVFNdOworCisJc3RydWN0IGF0bWVsX21jaV9jYXBzICAgY2FwczsKKworCXUzMiAoKnByZXBhcmVfZGF0YSkoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKTsKKwl2b2lkICgqc3VibWl0X2RhdGEpKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSk7CisJdm9pZCAoKnN0b3BfdHJhbnNmZXIpKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpOwogfTsKIAogLyoqCkBAIC0yMjAsMzEgKzI1Myw2IEBACiAJc2V0X2JpdChldmVudCwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKQogCiAvKgotICogRW5hYmxlIG9yIGRpc2FibGUgZmVhdHVyZXMvcmVnaXN0ZXJzIGJhc2VkIG9uCi0gKiB3aGV0aGVyIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlbQotICovCi1zdGF0aWMgYm9vbCBtY2lfaGFzX3J3cHJvb2Yodm9pZCkKLXsKLQlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFybTkyMDAoKSkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UKLQkJcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gKiBUaGUgbmV3IE1DSTIgbW9kdWxlIGlzbid0IDEwMCUgY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgTUNJIG1vZHVsZSwKLSAqIGFuZCBpdCBoYXMgYSBmZXcgbmljZSBmZWF0dXJlcyB3aGljaCB3ZSB3YW50IHRvIHVzZS4uLgotICovCi1zdGF0aWMgaW5saW5lIGJvb2wgYXRtY2lfaXNfbWNpMih2b2lkKQotewotCWlmIChjcHVfaXNfYXQ5MXNhbTlnNDUoKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyoKICAqIFRoZSBkZWJ1Z2ZzIHN0dWZmIGJlbG93IGlzIG1vc3RseSBvcHRpbWl6ZWQgYXdheSB3aGVuCiAgKiBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldC4KICAqLwpAQCAtMzUyLDcgKzM2MCw3IEBACiAJc3RydWN0IGF0bWVsX21jaQkqaG9zdCA9IHMtPnByaXZhdGU7CiAJdTMyCQkJKmJ1ZjsKIAotCWJ1ZiA9IGttYWxsb2MoTUNJX1JFR1NfU0laRSwgR0ZQX0tFUk5FTCk7CisJYnVmID0ga21hbGxvYyhBVE1DSV9SRUdTX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMzYzLDQ3ICszNzEsNTAgQEAKIAkgKi8KIAlzcGluX2xvY2tfYmgoJmhvc3QtPmxvY2spOwogCWNsa19lbmFibGUoaG9zdC0+bWNrKTsKLQltZW1jcHlfZnJvbWlvKGJ1ZiwgaG9zdC0+cmVncywgTUNJX1JFR1NfU0laRSk7CisJbWVtY3B5X2Zyb21pbyhidWYsIGhvc3QtPnJlZ3MsIEFUTUNJX1JFR1NfU0laRSk7CiAJY2xrX2Rpc2FibGUoaG9zdC0+bWNrKTsKIAlzcGluX3VubG9ja19iaCgmaG9zdC0+bG9jayk7CiAKIAlzZXFfcHJpbnRmKHMsICJNUjpcdDB4JTA4eCVzJXMgQ0xLRElWPSV1XG4iLAotCQkJYnVmW01DSV9NUiAvIDRdLAotCQkJYnVmW01DSV9NUiAvIDRdICYgTUNJX01SX1JEUFJPT0YgPyAiIFJEUFJPT0YiIDogIiIsCi0JCQlidWZbTUNJX01SIC8gNF0gJiBNQ0lfTVJfV1JQUk9PRiA/ICIgV1JQUk9PRiIgOiAiIiwKLQkJCWJ1ZltNQ0lfTVIgLyA0XSAmIDB4ZmYpOwotCXNlcV9wcmludGYocywgIkRUT1I6XHQweCUwOHhcbiIsIGJ1ZltNQ0lfRFRPUiAvIDRdKTsKLQlzZXFfcHJpbnRmKHMsICJTRENSOlx0MHglMDh4XG4iLCBidWZbTUNJX1NEQ1IgLyA0XSk7Ci0Jc2VxX3ByaW50ZihzLCAiQVJHUjpcdDB4JTA4eFxuIiwgYnVmW01DSV9BUkdSIC8gNF0pOworCQkJYnVmW0FUTUNJX01SIC8gNF0sCisJCQlidWZbQVRNQ0lfTVIgLyA0XSAmIEFUTUNJX01SX1JEUFJPT0YgPyAiIFJEUFJPT0YiIDogIiIsCisJCQlidWZbQVRNQ0lfTVIgLyA0XSAmIEFUTUNJX01SX1dSUFJPT0YgPyAiIFdSUFJPT0YiIDogIiIsCisJCQlidWZbQVRNQ0lfTVIgLyA0XSAmIDB4ZmYpOworCXNlcV9wcmludGYocywgIkRUT1I6XHQweCUwOHhcbiIsIGJ1ZltBVE1DSV9EVE9SIC8gNF0pOworCXNlcV9wcmludGYocywgIlNEQ1I6XHQweCUwOHhcbiIsIGJ1ZltBVE1DSV9TRENSIC8gNF0pOworCXNlcV9wcmludGYocywgIkFSR1I6XHQweCUwOHhcbiIsIGJ1ZltBVE1DSV9BUkdSIC8gNF0pOwogCXNlcV9wcmludGYocywgIkJMS1I6XHQweCUwOHggQkNOVD0ldSBCTEtMRU49JXVcbiIsCi0JCQlidWZbTUNJX0JMS1IgLyA0XSwKLQkJCWJ1ZltNQ0lfQkxLUiAvIDRdICYgMHhmZmZmLAotCQkJKGJ1ZltNQ0lfQkxLUiAvIDRdID4+IDE2KSAmIDB4ZmZmZik7Ci0JaWYgKGF0bWNpX2lzX21jaTIoKSkKLQkJc2VxX3ByaW50ZihzLCAiQ1NUT1I6XHQweCUwOHhcbiIsIGJ1ZltNQ0lfQ1NUT1IgLyA0XSk7CisJCQlidWZbQVRNQ0lfQkxLUiAvIDRdLAorCQkJYnVmW0FUTUNJX0JMS1IgLyA0XSAmIDB4ZmZmZiwKKwkJCShidWZbQVRNQ0lfQkxLUiAvIDRdID4+IDE2KSAmIDB4ZmZmZik7CisJaWYgKGhvc3QtPmNhcHMuaGFzX2NzdG9yX3JlZykKKwkJc2VxX3ByaW50ZihzLCAiQ1NUT1I6XHQweCUwOHhcbiIsIGJ1ZltBVE1DSV9DU1RPUiAvIDRdKTsKIAogCS8qIERvbid0IHJlYWQgUlNQUiBhbmQgUkRSOyBpdCB3aWxsIGNvbnN1bWUgdGhlIGRhdGEgdGhlcmUgKi8KIAotCWF0bWNpX3Nob3dfc3RhdHVzX3JlZyhzLCAiU1IiLCBidWZbTUNJX1NSIC8gNF0pOwotCWF0bWNpX3Nob3dfc3RhdHVzX3JlZyhzLCAiSU1SIiwgYnVmW01DSV9JTVIgLyA0XSk7CisJYXRtY2lfc2hvd19zdGF0dXNfcmVnKHMsICJTUiIsIGJ1ZltBVE1DSV9TUiAvIDRdKTsKKwlhdG1jaV9zaG93X3N0YXR1c19yZWcocywgIklNUiIsIGJ1ZltBVE1DSV9JTVIgLyA0XSk7CiAKLQlpZiAoYXRtY2lfaXNfbWNpMigpKSB7CisJaWYgKGhvc3QtPmNhcHMuaGFzX2RtYSkgewogCQl1MzIgdmFsOwogCi0JCXZhbCA9IGJ1ZltNQ0lfRE1BIC8gNF07CisJCXZhbCA9IGJ1ZltBVE1DSV9ETUEgLyA0XTsKIAkJc2VxX3ByaW50ZihzLCAiRE1BOlx0MHglMDh4IE9GRlNFVD0ldSBDSEtTSVpFPSV1JXNcbiIsCiAJCQkJdmFsLCB2YWwgJiAzLAogCQkJCSgodmFsID4+IDQpICYgMykgPwogCQkJCQkxIDw8ICgoKHZhbCA+PiA0KSAmIDMpICsgMSkgOiAxLAotCQkJCXZhbCAmIE1DSV9ETUFFTiA/ICIgRE1BRU4iIDogIiIpOworCQkJCXZhbCAmIEFUTUNJX0RNQUVOID8gIiBETUFFTiIgOiAiIik7CisJfQorCWlmIChob3N0LT5jYXBzLmhhc19jZmdfcmVnKSB7CisJCXUzMiB2YWw7CiAKLQkJdmFsID0gYnVmW01DSV9DRkcgLyA0XTsKKwkJdmFsID0gYnVmW0FUTUNJX0NGRyAvIDRdOwogCQlzZXFfcHJpbnRmKHMsICJDRkc6XHQweCUwOHglcyVzJXMlc1xuIiwKIAkJCQl2YWwsCi0JCQkJdmFsICYgTUNJX0NGR19GSUZPTU9ERV8xREFUQSA/ICIgRklGT01PREVfT05FX0RBVEEiIDogIiIsCi0JCQkJdmFsICYgTUNJX0NGR19GRVJSQ1RSTF9DT1IgPyAiIEZFUlJDVFJMX0NMRUFSX09OX1JFQUQiIDogIiIsCi0JCQkJdmFsICYgTUNJX0NGR19IU01PREUgPyAiIEhTTU9ERSIgOiAiIiwKLQkJCQl2YWwgJiBNQ0lfQ0ZHX0xTWU5DID8gIiBMU1lOQyIgOiAiIik7CisJCQkJdmFsICYgQVRNQ0lfQ0ZHX0ZJRk9NT0RFXzFEQVRBID8gIiBGSUZPTU9ERV9PTkVfREFUQSIgOiAiIiwKKwkJCQl2YWwgJiBBVE1DSV9DRkdfRkVSUkNUUkxfQ09SID8gIiBGRVJSQ1RSTF9DTEVBUl9PTl9SRUFEIiA6ICIiLAorCQkJCXZhbCAmIEFUTUNJX0NGR19IU01PREUgPyAiIEhTTU9ERSIgOiAiIiwKKwkJCQl2YWwgJiBBVE1DSV9DRkdfTFNZTkMgPyAiIExTWU5DIiA6ICIiKTsKIAl9CiAKIAlrZnJlZShidWYpOwpAQCAtNDY2LDcgKzQ3Nyw3IEBACiAJZGV2X2VycigmbW1jLT5jbGFzc19kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWJ1Z2ZzIGZvciBzbG90XG4iKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbnNfdG9fY2xvY2tzKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdG1jaV9uc190b19jbG9ja3Moc3RydWN0IGF0bWVsX21jaSAqaG9zdCwKIAkJCQkJdW5zaWduZWQgaW50IG5zKQogewogCXJldHVybiAobnMgKiAoaG9zdC0+YnVzX2h6IC8gMTAwMDAwMCkgKyA5OTkpIC8gMTAwMDsKQEAgLTQ4Miw3ICs0OTMsOCBAQAogCXVuc2lnbmVkCWR0b2N5YzsKIAl1bnNpZ25lZAlkdG9tdWw7CiAKLQl0aW1lb3V0ID0gbnNfdG9fY2xvY2tzKGhvc3QsIGRhdGEtPnRpbWVvdXRfbnMpICsgZGF0YS0+dGltZW91dF9jbGtzOworCXRpbWVvdXQgPSBhdG1jaV9uc190b19jbG9ja3MoaG9zdCwgZGF0YS0+dGltZW91dF9ucykKKwkJKyBkYXRhLT50aW1lb3V0X2Nsa3M7CiAKIAlmb3IgKGR0b211bCA9IDA7IGR0b211bCA8IDg7IGR0b211bCsrKSB7CiAJCXVuc2lnbmVkIHNoaWZ0ID0gZHRvbXVsX3RvX3NoaWZ0W2R0b211bF07CkBAIC00OTgsNyArNTEwLDcgQEAKIAogCWRldl92ZGJnKCZzbG90LT5tbWMtPmNsYXNzX2RldiwgInNldHRpbmcgdGltZW91dCB0byAldSBjeWNsZXNcbiIsCiAJCQlkdG9jeWMgPDwgZHRvbXVsX3RvX3NoaWZ0W2R0b211bF0pOwotCW1jaV93cml0ZWwoaG9zdCwgRFRPUiwgKE1DSV9EVE9NVUwoZHRvbXVsKSB8IE1DSV9EVE9DWUMoZHRvY3ljKSkpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9EVE9SLCAoQVRNQ0lfRFRPTVVMKGR0b211bCkgfCBBVE1DSV9EVE9DWUMoZHRvY3ljKSkpOwogfQogCiAvKgpAQCAtNTEyLDEzICs1MjQsMTMgQEAKIAogCWNtZC0+ZXJyb3IgPSAtRUlOUFJPR1JFU1M7CiAKLQljbWRyID0gTUNJX0NNRFJfQ01ETkIoY21kLT5vcGNvZGUpOworCWNtZHIgPSBBVE1DSV9DTURSX0NNRE5CKGNtZC0+b3Bjb2RlKTsKIAogCWlmIChjbWQtPmZsYWdzICYgTU1DX1JTUF9QUkVTRU5UKSB7CiAJCWlmIChjbWQtPmZsYWdzICYgTU1DX1JTUF8xMzYpCi0JCQljbWRyIHw9IE1DSV9DTURSX1JTUFRZUF8xMzZCSVQ7CisJCQljbWRyIHw9IEFUTUNJX0NNRFJfUlNQVFlQXzEzNkJJVDsKIAkJZWxzZQotCQkJY21kciB8PSBNQ0lfQ01EUl9SU1BUWVBfNDhCSVQ7CisJCQljbWRyIHw9IEFUTUNJX0NNRFJfUlNQVFlQXzQ4QklUOwogCX0KIAogCS8qCkBAIC01MjYsMzQgKzUzOCwzNCBAQAogCSAqIGl0J3MgdG9vIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGFuIEFDTUQgb3IKIAkgKiBub3QuIEJldHRlciBtYWtlIGl0IDY0LgogCSAqLwotCWNtZHIgfD0gTUNJX0NNRFJfTUFYTEFUXzY0Q1lDOworCWNtZHIgfD0gQVRNQ0lfQ01EUl9NQVhMQVRfNjRDWUM7CiAKIAlpZiAobW1jLT5pb3MuYnVzX21vZGUgPT0gTU1DX0JVU01PREVfT1BFTkRSQUlOKQotCQljbWRyIHw9IE1DSV9DTURSX09QRENNRDsKKwkJY21kciB8PSBBVE1DSV9DTURSX09QRENNRDsKIAogCWRhdGEgPSBjbWQtPmRhdGE7CiAJaWYgKGRhdGEpIHsKLQkJY21kciB8PSBNQ0lfQ01EUl9TVEFSVF9YRkVSOworCQljbWRyIHw9IEFUTUNJX0NNRFJfU1RBUlRfWEZFUjsKIAogCQlpZiAoY21kLT5vcGNvZGUgPT0gU0RfSU9fUldfRVhURU5ERUQpIHsKLQkJCWNtZHIgfD0gTUNJX0NNRFJfU0RJT19CTE9DSzsKKwkJCWNtZHIgfD0gQVRNQ0lfQ01EUl9TRElPX0JMT0NLOwogCQl9IGVsc2UgewogCQkJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfU1RSRUFNKQotCQkJCWNtZHIgfD0gTUNJX0NNRFJfU1RSRUFNOworCQkJCWNtZHIgfD0gQVRNQ0lfQ01EUl9TVFJFQU07CiAJCQllbHNlIGlmIChkYXRhLT5ibG9ja3MgPiAxKQotCQkJCWNtZHIgfD0gTUNJX0NNRFJfTVVMVElfQkxPQ0s7CisJCQkJY21kciB8PSBBVE1DSV9DTURSX01VTFRJX0JMT0NLOwogCQkJZWxzZQotCQkJCWNtZHIgfD0gTUNJX0NNRFJfQkxPQ0s7CisJCQkJY21kciB8PSBBVE1DSV9DTURSX0JMT0NLOwogCQl9CiAKIAkJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKLQkJCWNtZHIgfD0gTUNJX0NNRFJfVFJESVJfUkVBRDsKKwkJCWNtZHIgfD0gQVRNQ0lfQ01EUl9UUkRJUl9SRUFEOwogCX0KIAogCXJldHVybiBjbWRyOwogfQogCi1zdGF0aWMgdm9pZCBhdG1jaV9zdGFydF9jb21tYW5kKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCitzdGF0aWMgdm9pZCBhdG1jaV9zZW5kX2NvbW1hbmQoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwKIAkJc3RydWN0IG1tY19jb21tYW5kICpjbWQsIHUzMiBjbWRfZmxhZ3MpCiB7CiAJV0FSTl9PTihob3N0LT5jbWQpOwpAQCAtNTYzLDQzICs1NzUsMTE5IEBACiAJCQkic3RhcnQgY29tbWFuZDogQVJHUj0weCUwOHggQ01EUj0weCUwOHhcbiIsCiAJCQljbWQtPmFyZywgY21kX2ZsYWdzKTsKIAotCW1jaV93cml0ZWwoaG9zdCwgQVJHUiwgY21kLT5hcmcpOwotCW1jaV93cml0ZWwoaG9zdCwgQ01EUiwgY21kX2ZsYWdzKTsKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQVJHUiwgY21kLT5hcmcpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DTURSLCBjbWRfZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBzZW5kX3N0b3BfY21kKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3N0YXRpYyB2b2lkIGF0bWNpX3NlbmRfc3RvcF9jbWQoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQogewotCWF0bWNpX3N0YXJ0X2NvbW1hbmQoaG9zdCwgZGF0YS0+c3RvcCwgaG9zdC0+c3RvcF9jbWRyKTsKLQltY2lfd3JpdGVsKGhvc3QsIElFUiwgTUNJX0NNRFJEWSk7CisJYXRtY2lfc2VuZF9jb21tYW5kKGhvc3QsIGRhdGEtPnN0b3AsIGhvc3QtPnN0b3BfY21kcik7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfQ01EUkRZKTsKIH0KIAotI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCi1zdGF0aWMgdm9pZCBhdG1jaV9kbWFfY2xlYW51cChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQorLyoKKyAqIENvbmZpZ3VyZSBnaXZlbiBQREMgYnVmZmVyIHRha2luZyBjYXJlIG9mIGFsaWduZW1lbnQgaXNzdWVzLgorICogVXBkYXRlIGhvc3QtPmRhdGFfc2l6ZSBhbmQgaG9zdC0+c2cuCisgKi8KK3N0YXRpYyB2b2lkIGF0bWNpX3BkY19zZXRfc2luZ2xlX2J1ZihzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LAorCWVudW0gYXRtY2lfeGZlcl9kaXIgZGlyLCBlbnVtIGF0bWNpX3BkY19idWYgYnVmX25iKQogewotCXN0cnVjdCBtbWNfZGF0YQkJCSpkYXRhID0gaG9zdC0+ZGF0YTsKKwl1MzIgcG9pbnRlcl9yZWcsIGNvdW50ZXJfcmVnOwogCi0JaWYgKGRhdGEpCi0JCWRtYV91bm1hcF9zZyhob3N0LT5kbWEuY2hhbi0+ZGV2aWNlLT5kZXYsCi0JCQkgICAgIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sCi0JCQkgICAgICgoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9XUklURSkKLQkJCSAgICAgID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSkpOwotfQotCi1zdGF0aWMgdm9pZCBhdG1jaV9zdG9wX2RtYShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQotewotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IGhvc3QtPmRhdGFfY2hhbjsKLQotCWlmIChjaGFuKSB7Ci0JCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGNoYW4pOwotCQlhdG1jaV9kbWFfY2xlYW51cChob3N0KTsKKwlpZiAoZGlyID09IFhGRVJfUkVDRUlWRSkgeworCQlwb2ludGVyX3JlZyA9IEFUTUVMX1BEQ19SUFI7CisJCWNvdW50ZXJfcmVnID0gQVRNRUxfUERDX1JDUjsKIAl9IGVsc2UgewotCQkvKiBEYXRhIHRyYW5zZmVyIHdhcyBzdG9wcGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCQlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKLQkJbWNpX3dyaXRlbChob3N0LCBJRVIsIE1DSV9OT1RCVVNZKTsKKwkJcG9pbnRlcl9yZWcgPSBBVE1FTF9QRENfVFBSOworCQljb3VudGVyX3JlZyA9IEFUTUVMX1BEQ19UQ1I7CisJfQorCisJaWYgKGJ1Zl9uYiA9PSBQRENfU0VDT05EX0JVRikgeworCQlwb2ludGVyX3JlZyArPSBBVE1FTF9QRENfU0NORF9CVUZfT0ZGOworCQljb3VudGVyX3JlZyArPSBBVE1FTF9QRENfU0NORF9CVUZfT0ZGOworCX0KKworCWF0bWNpX3dyaXRlbChob3N0LCBwb2ludGVyX3JlZywgc2dfZG1hX2FkZHJlc3MoaG9zdC0+c2cpKTsKKwlpZiAoaG9zdC0+ZGF0YV9zaXplIDw9IHNnX2RtYV9sZW4oaG9zdC0+c2cpKSB7CisJCWlmIChob3N0LT5kYXRhX3NpemUgJiAweDMpIHsKKwkJCS8qIElmIHNpemUgaXMgZGlmZmVyZW50IGZyb20gbW9kdWxvIDQsIHRyYW5zZmVyIGJ5dGVzICovCisJCQlhdG1jaV93cml0ZWwoaG9zdCwgY291bnRlcl9yZWcsIGhvc3QtPmRhdGFfc2l6ZSk7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfTVIsIGhvc3QtPm1vZGVfcmVnIHwgQVRNQ0lfTVJfUERDRkJZVEUpOworCQl9IGVsc2UgeworCQkJLyogRWxzZSB0cmFuc2ZlciAzMi1iaXRzIHdvcmRzICovCisJCQlhdG1jaV93cml0ZWwoaG9zdCwgY291bnRlcl9yZWcsIGhvc3QtPmRhdGFfc2l6ZSAvIDQpOworCQl9CisJCWhvc3QtPmRhdGFfc2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkJLyogV2UgYXNzdW1lIHRoZSBzaXplIG9mIGEgcGFnZSBpcyAzMi1iaXRzIGFsaWduZWQgKi8KKwkJYXRtY2lfd3JpdGVsKGhvc3QsIGNvdW50ZXJfcmVnLCBzZ19kbWFfbGVuKGhvc3QtPnNnKSAvIDQpOworCQlob3N0LT5kYXRhX3NpemUgLT0gc2dfZG1hX2xlbihob3N0LT5zZyk7CisJCWlmIChob3N0LT5kYXRhX3NpemUpCisJCQlob3N0LT5zZyA9IHNnX25leHQoaG9zdC0+c2cpOwogCX0KIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIERNQSBkcml2ZXIgZnJvbSB0YXNrbGV0IGNvbnRleHQuICovCisvKgorICogQ29uZmlndXJlIFBEQyBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHNpemUgaWUgY29uZmlndXJpbmcgb25lIG9yIHR3bworICogYnVmZmVycy4gRG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24gaWYgeW91IHdhbnQgdG8gY29uZmlndXJlIG9ubHkgdGhlIHNlY29uZAorICogYnVmZmVyLiBJbiB0aGlzIGNhc2UsIHVzZSBhdG1jaV9wZGNfc2V0X3NpbmdsZV9idWYuCisgKi8KK3N0YXRpYyB2b2lkIGF0bWNpX3BkY19zZXRfYm90aF9idWYoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwgaW50IGRpcikKK3sKKwlhdG1jaV9wZGNfc2V0X3NpbmdsZV9idWYoaG9zdCwgZGlyLCBQRENfRklSU1RfQlVGKTsKKwlpZiAoaG9zdC0+ZGF0YV9zaXplKQorCQlhdG1jaV9wZGNfc2V0X3NpbmdsZV9idWYoaG9zdCwgZGlyLCBQRENfU0VDT05EX0JVRik7Cit9CisKKy8qCisgKiBVbm1hcCBzZyBsaXN0cywgY2FsbGVkIHdoZW4gdHJhbnNmZXIgaXMgZmluaXNoZWQuCisgKi8KK3N0YXRpYyB2b2lkIGF0bWNpX3BkY19jbGVhbnVwKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpCit7CisJc3RydWN0IG1tY19kYXRhICAgICAgICAgKmRhdGEgPSBob3N0LT5kYXRhOworCisJaWYgKGRhdGEpCisJCWRtYV91bm1hcF9zZygmaG9zdC0+cGRldi0+ZGV2LAorCQkJCWRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sCisJCQkJKChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQorCQkJCSA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpKTsKK30KKworLyoKKyAqIERpc2FibGUgUERDIHRyYW5zZmVycy4gVXBkYXRlIHBlbmRpbmcgZmxhZ3MgdG8gRVZFTlRfWEZFUl9DT01QTEVURSBhZnRlcgorICogaGF2aW5nIHJlY2VpdmVkIEFUTUNJX1RYQlVGRSBvciBBVE1DSV9SWEJVRkYgaW50ZXJydXB0LiBFbmFibGUgQVRNQ0lfTk9UQlVTWQorICogaW50ZXJydXB0IG5lZWRlZCBmb3IgYm90aCB0cmFuc2ZlciBkaXJlY3Rpb25zLgorICovCitzdGF0aWMgdm9pZCBhdG1jaV9wZGNfY29tcGxldGUoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKK3sKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNRUxfUERDX1BUQ1IsIEFUTUVMX1BEQ19SWFRESVMgfCBBVE1FTF9QRENfVFhURElTKTsKKwlhdG1jaV9wZGNfY2xlYW51cChob3N0KTsKKworCS8qCisJICogSWYgdGhlIGNhcmQgd2FzIHJlbW92ZWQsIGRhdGEgd2lsbCBiZSBOVUxMLiBObyBwb2ludCB0cnlpbmcKKwkgKiB0byBzZW5kIHRoZSBzdG9wIGNvbW1hbmQgb3Igd2FpdGluZyBmb3IgTkJVU1kgaW4gdGhpcyBjYXNlLgorCSAqLworCWlmIChob3N0LT5kYXRhKSB7CisJCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX1hGRVJfQ09NUExFVEUpOworCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfTk9UQlVTWSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdG1jaV9kbWFfY2xlYW51cChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQoreworCXN0cnVjdCBtbWNfZGF0YSAgICAgICAgICAgICAgICAgKmRhdGEgPSBob3N0LT5kYXRhOworCisJaWYgKGRhdGEpCisJCWRtYV91bm1hcF9zZyhob3N0LT5kbWEuY2hhbi0+ZGV2aWNlLT5kZXYsCisJCQkJZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwKKwkJCQkoKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfV1JJVEUpCisJCQkJID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSkpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIERNQSBkcml2ZXIgZnJvbSB0YXNrbGV0IGNvbnRleHQuCisgKi8KIHN0YXRpYyB2b2lkIGF0bWNpX2RtYV9jb21wbGV0ZSh2b2lkICphcmcpCiB7CiAJc3RydWN0IGF0bWVsX21jaQkqaG9zdCA9IGFyZzsKQEAgLTYwNyw5ICs2OTUsOSBAQAogCiAJZGV2X3ZkYmcoJmhvc3QtPnBkZXYtPmRldiwgIkRNQSBjb21wbGV0ZVxuIik7CiAKLQlpZiAoYXRtY2lfaXNfbWNpMigpKQorCWlmIChob3N0LT5jYXBzLmhhc19kbWEpCiAJCS8qIERpc2FibGUgRE1BIGhhcmR3YXJlIGhhbmRzaGFraW5nIG9uIE1DSSAqLwotCQltY2lfd3JpdGVsKGhvc3QsIERNQSwgbWNpX3JlYWRsKGhvc3QsIERNQSkgJiB+TUNJX0RNQUVOKTsKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0RNQSwgYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfRE1BKSAmIH5BVE1DSV9ETUFFTik7CiAKIAlhdG1jaV9kbWFfY2xlYW51cChob3N0KTsKIApAQCAtNjQxLDk5ICs3MjksMTAgQEAKIAkJICogY29tcGxldGlvbiBjYWxsYmFjayIgcnVsZSBvZiB0aGUgZG1hIGVuZ2luZQogCQkgKiBmcmFtZXdvcmsuCiAJCSAqLwotCQltY2lfd3JpdGVsKGhvc3QsIElFUiwgTUNJX05PVEJVU1kpOworCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBBVE1DSV9OT1RCVVNZKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQKLWF0bWNpX3ByZXBhcmVfZGF0YV9kbWEoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQotewotCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuOwotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgkqZGVzYzsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QJCSpzZzsKLQl1bnNpZ25lZCBpbnQJCQlpOwotCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uCQlkaXJlY3Rpb247Ci0JdW5zaWduZWQgaW50CQkJc2dsZW47Ci0KLQkvKgotCSAqIFdlIGRvbid0IGRvIERNQSBvbiAiY29tcGxleCIgdHJhbnNmZXJzLCBpLmUuIHdpdGgKLQkgKiBub24td29yZC1hbGlnbmVkIGJ1ZmZlcnMgb3IgbGVuZ3Rocy4gQWxzbywgd2UgZG9uJ3QgYm90aGVyCi0JICogd2l0aCBhbGwgdGhlIERNQSBzZXR1cCBvdmVyaGVhZCBmb3Igc2hvcnQgdHJhbnNmZXJzLgotCSAqLwotCWlmIChkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzeiA8IEFUTUNJX0RNQV9USFJFU0hPTEQpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChkYXRhLT5ibGtzeiAmIDMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yX2VhY2hfc2coZGF0YS0+c2csIHNnLCBkYXRhLT5zZ19sZW4sIGkpIHsKLQkJaWYgKHNnLT5vZmZzZXQgJiAzIHx8IHNnLT5sZW5ndGggJiAzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoYW5uZWwsIHdlIGNhbid0IGRvIERNQSAqLwotCWNoYW4gPSBob3N0LT5kbWEuY2hhbjsKLQlpZiAoY2hhbikKLQkJaG9zdC0+ZGF0YV9jaGFuID0gY2hhbjsKLQotCWlmICghY2hhbikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoYXRtY2lfaXNfbWNpMigpKQotCQltY2lfd3JpdGVsKGhvc3QsIERNQSwgTUNJX0RNQV9DSEtTSVpFKDMpIHwgTUNJX0RNQUVOKTsKLQotCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpCi0JCWRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKLQllbHNlCi0JCWRpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7Ci0KLQlzZ2xlbiA9IGRtYV9tYXBfc2coY2hhbi0+ZGV2aWNlLT5kZXYsIGRhdGEtPnNnLAotCQkJICAgZGF0YS0+c2dfbGVuLCBkaXJlY3Rpb24pOwotCi0JZGVzYyA9IGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbiwKLQkJCWRhdGEtPnNnLCBzZ2xlbiwgZGlyZWN0aW9uLAotCQkJRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKLQlpZiAoIWRlc2MpCi0JCWdvdG8gdW5tYXBfZXhpdDsKLQotCWhvc3QtPmRtYS5kYXRhX2Rlc2MgPSBkZXNjOwotCWRlc2MtPmNhbGxiYWNrID0gYXRtY2lfZG1hX2NvbXBsZXRlOwotCWRlc2MtPmNhbGxiYWNrX3BhcmFtID0gaG9zdDsKLQotCXJldHVybiAwOwotdW5tYXBfZXhpdDoKLQlkbWFfdW5tYXBfc2coY2hhbi0+ZGV2aWNlLT5kZXYsIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sIGRpcmVjdGlvbik7Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXN0YXRpYyB2b2lkIGF0bWNpX3N1Ym1pdF9kYXRhKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpCi17Ci0Jc3RydWN0IGRtYV9jaGFuCQkJKmNoYW4gPSBob3N0LT5kYXRhX2NoYW47Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCSpkZXNjID0gaG9zdC0+ZG1hLmRhdGFfZGVzYzsKLQotCWlmIChjaGFuKSB7Ci0JCWRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7Ci0JCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGNoYW4pOwotCX0KLX0KLQotI2Vsc2UgLyogQ09ORklHX01NQ19BVE1FTE1DSV9ETUEgKi8KLQotc3RhdGljIGludCBhdG1jaV9wcmVwYXJlX2RhdGFfZG1hKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIHZvaWQgYXRtY2lfc3VibWl0X2RhdGEoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkge30KLQotc3RhdGljIHZvaWQgYXRtY2lfc3RvcF9kbWEoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKLXsKLQkvKiBEYXRhIHRyYW5zZmVyIHdhcyBzdG9wcGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX1hGRVJfQ09NUExFVEUpOwotCW1jaV93cml0ZWwoaG9zdCwgSUVSLCBNQ0lfTk9UQlVTWSk7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfTU1DX0FUTUVMTUNJX0RNQSAqLwotCiAvKgogICogUmV0dXJucyBhIG1hc2sgb2YgaW50ZXJydXB0IGZsYWdzIHRvIGJlIGVuYWJsZWQgYWZ0ZXIgdGhlIHdob2xlCiAgKiByZXF1ZXN0IGhhcyBiZWVuIHByZXBhcmVkLgpAQCAtNzQ0LDM2ICs3NDMsMjEwIEBACiAKIAlkYXRhLT5lcnJvciA9IC1FSU5QUk9HUkVTUzsKIAorCWhvc3QtPnNnID0gZGF0YS0+c2c7CisJaG9zdC0+ZGF0YSA9IGRhdGE7CisJaG9zdC0+ZGF0YV9jaGFuID0gTlVMTDsKKworCWlmbGFncyA9IEFUTUNJX0RBVEFfRVJST1JfRkxBR1M7CisKKwkvKgorCSAqIEVycmF0YTogTU1DIGRhdGEgd3JpdGUgb3BlcmF0aW9uIHdpdGggbGVzcyB0aGFuIDEyCisJICogYnl0ZXMgaXMgaW1wb3NzaWJsZS4KKwkgKgorCSAqIEVycmF0YTogTUNJIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgKFREUikgRklGTworCSAqIGNvcnJ1cHRpb24gd2hlbiBsZW5ndGggaXMgbm90IG11bHRpcGxlIG9mIDQuCisJICovCisJaWYgKGRhdGEtPmJsb2NrcyAqIGRhdGEtPmJsa3N6IDwgMTIKKwkJCXx8IChkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzeikgJiAzKQorCQlob3N0LT5uZWVkX3Jlc2V0ID0gdHJ1ZTsKKworCWhvc3QtPnBpb19vZmZzZXQgPSAwOworCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpCisJCWlmbGFncyB8PSBBVE1DSV9SWFJEWTsKKwllbHNlCisJCWlmbGFncyB8PSBBVE1DSV9UWFJEWTsKKworCXJldHVybiBpZmxhZ3M7Cit9CisKKy8qCisgKiBTZXQgaW50ZXJydXB0IGZsYWdzIGFuZCBzZXQgYmxvY2sgbGVuZ3RoIGludG8gdGhlIE1DSSBtb2RlIHJlZ2lzdGVyIGV2ZW4KKyAqIGlmIHRoaXMgdmFsdWUgaXMgYWxzbyBhY2Nlc3NpYmxlIGluIHRoZSBNQ0kgYmxvY2sgcmVnaXN0ZXIuIEl0IHNlZW1zIHRvIGJlCisgKiBuZWNlc3NhcnkgYmVmb3JlIHRoZSBIaWdoIFNwZWVkIE1DSSB2ZXJzaW9uLiBJdCBhbHNvIG1hcCBzZyBhbmQgY29uZmlndXJlCisgKiBQREMgcmVnaXN0ZXJzLgorICovCitzdGF0aWMgdTMyCithdG1jaV9wcmVwYXJlX2RhdGFfcGRjKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwl1MzIgaWZsYWdzLCB0bXA7CisJdW5zaWduZWQgaW50IHNnX2xlbjsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7CisKKwlkYXRhLT5lcnJvciA9IC1FSU5QUk9HUkVTUzsKKworCWhvc3QtPmRhdGEgPSBkYXRhOworCWhvc3QtPnNnID0gZGF0YS0+c2c7CisJaWZsYWdzID0gQVRNQ0lfREFUQV9FUlJPUl9GTEFHUzsKKworCS8qIEVuYWJsZSBwZGMgbW9kZSAqLworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9NUiwgaG9zdC0+bW9kZV9yZWcgfCBBVE1DSV9NUl9QRENNT0RFKTsKKworCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpIHsKKwkJZGlyID0gRE1BX0ZST01fREVWSUNFOworCQlpZmxhZ3MgfD0gQVRNQ0lfRU5EUlggfCBBVE1DSV9SWEJVRkY7CisJfSBlbHNlIHsKKwkJZGlyID0gRE1BX1RPX0RFVklDRTsKKwkJaWZsYWdzIHw9IEFUTUNJX0VORFRYIHwgQVRNQ0lfVFhCVUZFOworCX0KKworCS8qIFNldCBCTEtMRU4gKi8KKwl0bXAgPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9NUik7CisJdG1wICY9IDB4MDAwMGZmZmY7CisJdG1wIHw9IEFUTUNJX0JMS0xFTihkYXRhLT5ibGtzeik7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX01SLCB0bXApOworCisJLyogQ29uZmlndXJlIFBEQyAqLworCWhvc3QtPmRhdGFfc2l6ZSA9IGRhdGEtPmJsb2NrcyAqIGRhdGEtPmJsa3N6OworCXNnX2xlbiA9IGRtYV9tYXBfc2coJmhvc3QtPnBkZXYtPmRldiwgZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwgZGlyKTsKKwlpZiAoaG9zdC0+ZGF0YV9zaXplKQorCQlhdG1jaV9wZGNfc2V0X2JvdGhfYnVmKGhvc3QsCisJCQkoKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpID8gWEZFUl9SRUNFSVZFIDogWEZFUl9UUkFOU01JVCkpOworCisJcmV0dXJuIGlmbGFnczsKK30KKworc3RhdGljIHUzMgorYXRtY2lfcHJlcGFyZV9kYXRhX2RtYShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGRtYV9jaGFuCQkJKmNoYW47CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCSpkZXNjOworCXN0cnVjdCBzY2F0dGVybGlzdAkJKnNnOworCXVuc2lnbmVkIGludAkJCWk7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24JCWRpcmVjdGlvbjsKKwl1bnNpZ25lZCBpbnQJCQlzZ2xlbjsKKwl1MzIgaWZsYWdzOworCisJZGF0YS0+ZXJyb3IgPSAtRUlOUFJPR1JFU1M7CisKIAlXQVJOX09OKGhvc3QtPmRhdGEpOwogCWhvc3QtPnNnID0gTlVMTDsKIAlob3N0LT5kYXRhID0gZGF0YTsKIAogCWlmbGFncyA9IEFUTUNJX0RBVEFfRVJST1JfRkxBR1M7Ci0JaWYgKGF0bWNpX3ByZXBhcmVfZGF0YV9kbWEoaG9zdCwgZGF0YSkpIHsKLQkJaG9zdC0+ZGF0YV9jaGFuID0gTlVMTDsKIAotCQkvKgotCQkgKiBFcnJhdGE6IE1NQyBkYXRhIHdyaXRlIG9wZXJhdGlvbiB3aXRoIGxlc3MgdGhhbiAxMgotCQkgKiBieXRlcyBpcyBpbXBvc3NpYmxlLgotCQkgKgotCQkgKiBFcnJhdGE6IE1DSSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIChURFIpIEZJRk8KLQkJICogY29ycnVwdGlvbiB3aGVuIGxlbmd0aCBpcyBub3QgbXVsdGlwbGUgb2YgNC4KLQkJICovCi0JCWlmIChkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzeiA8IDEyCi0JCQkJfHwgKGRhdGEtPmJsb2NrcyAqIGRhdGEtPmJsa3N6KSAmIDMpCi0JCQlob3N0LT5uZWVkX3Jlc2V0ID0gdHJ1ZTsKKwkvKgorCSAqIFdlIGRvbid0IGRvIERNQSBvbiAiY29tcGxleCIgdHJhbnNmZXJzLCBpLmUuIHdpdGgKKwkgKiBub24td29yZC1hbGlnbmVkIGJ1ZmZlcnMgb3IgbGVuZ3Rocy4gQWxzbywgd2UgZG9uJ3QgYm90aGVyCisJICogd2l0aCBhbGwgdGhlIERNQSBzZXR1cCBvdmVyaGVhZCBmb3Igc2hvcnQgdHJhbnNmZXJzLgorCSAqLworCWlmIChkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzeiA8IEFUTUNJX0RNQV9USFJFU0hPTEQpCisJCXJldHVybiBhdG1jaV9wcmVwYXJlX2RhdGEoaG9zdCwgZGF0YSk7CisJaWYgKGRhdGEtPmJsa3N6ICYgMykKKwkJcmV0dXJuIGF0bWNpX3ByZXBhcmVfZGF0YShob3N0LCBkYXRhKTsKIAotCQlob3N0LT5zZyA9IGRhdGEtPnNnOwotCQlob3N0LT5waW9fb2Zmc2V0ID0gMDsKLQkJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKLQkJCWlmbGFncyB8PSBNQ0lfUlhSRFk7Ci0JCWVsc2UKLQkJCWlmbGFncyB8PSBNQ0lfVFhSRFk7CisJZm9yX2VhY2hfc2coZGF0YS0+c2csIHNnLCBkYXRhLT5zZ19sZW4sIGkpIHsKKwkJaWYgKHNnLT5vZmZzZXQgJiAzIHx8IHNnLT5sZW5ndGggJiAzKQorCQkJcmV0dXJuIGF0bWNpX3ByZXBhcmVfZGF0YShob3N0LCBkYXRhKTsKIAl9CiAKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2hhbm5lbCwgd2UgY2FuJ3QgZG8gRE1BICovCisJY2hhbiA9IGhvc3QtPmRtYS5jaGFuOworCWlmIChjaGFuKQorCQlob3N0LT5kYXRhX2NoYW4gPSBjaGFuOworCisJaWYgKCFjaGFuKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChob3N0LT5jYXBzLmhhc19kbWEpCisJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9ETUEsIEFUTUNJX0RNQV9DSEtTSVpFKDMpIHwgQVRNQ0lfRE1BRU4pOworCisJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKKwkJZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCWVsc2UKKwkJZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKworCXNnbGVuID0gZG1hX21hcF9zZyhjaGFuLT5kZXZpY2UtPmRldiwgZGF0YS0+c2csCisJCQlkYXRhLT5zZ19sZW4sIGRpcmVjdGlvbik7CisKKwlkZXNjID0gY2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFuLAorCQkJZGF0YS0+c2csIHNnbGVuLCBkaXJlY3Rpb24sCisJCQlETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOworCWlmICghZGVzYykKKwkJZ290byB1bm1hcF9leGl0OworCisJaG9zdC0+ZG1hLmRhdGFfZGVzYyA9IGRlc2M7CisJZGVzYy0+Y2FsbGJhY2sgPSBhdG1jaV9kbWFfY29tcGxldGU7CisJZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBob3N0OworCiAJcmV0dXJuIGlmbGFnczsKK3VubWFwX2V4aXQ6CisJZG1hX3VubWFwX3NnKGNoYW4tPmRldmljZS0+ZGV2LCBkYXRhLT5zZywgZGF0YS0+c2dfbGVuLCBkaXJlY3Rpb24pOworCXJldHVybiAtRU5PTUVNOwogfQogCitzdGF0aWMgdm9pZAorYXRtY2lfc3VibWl0X2RhdGEoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQoreworCXJldHVybjsKK30KKworLyoKKyAqIFN0YXJ0IFBEQyBhY2NvcmRpbmcgdG8gdHJhbnNmZXIgZGlyZWN0aW9uLgorICovCitzdGF0aWMgdm9pZAorYXRtY2lfc3VibWl0X2RhdGFfcGRjKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQorCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNRUxfUERDX1BUQ1IsIEFUTUVMX1BEQ19SWFRFTik7CisJZWxzZQorCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNRUxfUERDX1BUQ1IsIEFUTUVMX1BEQ19UWFRFTik7Cit9CisKK3N0YXRpYyB2b2lkCithdG1jaV9zdWJtaXRfZGF0YV9kbWEoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQoreworCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuID0gaG9zdC0+ZGF0YV9jaGFuOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgkqZGVzYyA9IGhvc3QtPmRtYS5kYXRhX2Rlc2M7CisKKwlpZiAoY2hhbikgeworCQlkbWFlbmdpbmVfc3VibWl0KGRlc2MpOworCQlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhjaGFuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0bWNpX3N0b3BfdHJhbnNmZXIoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKK3sKKwlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBBVE1DSV9OT1RCVVNZKTsKK30KKworLyoKKyAqIFN0b3AgZGF0YSB0cmFuc2ZlciBiZWNhdXNlIGVycm9yKHMpIG9jY3VyZWQuCisgKi8KK3N0YXRpYyB2b2lkIGF0bWNpX3N0b3BfdHJhbnNmZXJfcGRjKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpCit7CisJYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgRVZFTlRfWEZFUl9DT01QTEVURSk7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfTk9UQlVTWSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWNpX3N0b3BfdHJhbnNmZXJfZG1hKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpCit7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gaG9zdC0+ZGF0YV9jaGFuOworCisJaWYgKGNoYW4pIHsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoY2hhbik7CisJCWF0bWNpX2RtYV9jbGVhbnVwKGhvc3QpOworCX0gZWxzZSB7CisJCS8qIERhdGEgdHJhbnNmZXIgd2FzIHN0b3BwZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX1hGRVJfQ09NUExFVEUpOworCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBBVE1DSV9OT1RCVVNZKTsKKwl9Cit9CisKKy8qCisgKiBTdGFydCBhIHJlcXVlc3Q6IHByZXBhcmUgZGF0YSBpZiBuZWVkZWQsIHByZXBhcmUgdGhlIGNvbW1hbmQgYW5kIGFjdGl2YXRlCisgKiBpbnRlcnJ1cHRzLgorICovCiBzdGF0aWMgdm9pZCBhdG1jaV9zdGFydF9yZXF1ZXN0KHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCiAJCXN0cnVjdCBhdG1lbF9tY2lfc2xvdCAqc2xvdCkKIHsKQEAgLTc5MiwyNCArOTY1LDI0IEBACiAJaG9zdC0+ZGF0YV9zdGF0dXMgPSAwOwogCiAJaWYgKGhvc3QtPm5lZWRfcmVzZXQpIHsKLQkJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX1NXUlNUKTsKLQkJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX01DSUVOKTsKLQkJbWNpX3dyaXRlbChob3N0LCBNUiwgaG9zdC0+bW9kZV9yZWcpOwotCQlpZiAoYXRtY2lfaXNfbWNpMigpKQotCQkJbWNpX3dyaXRlbChob3N0LCBDRkcsIGhvc3QtPmNmZ19yZWcpOworCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ1IsIEFUTUNJX0NSX1NXUlNUKTsKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NSLCBBVE1DSV9DUl9NQ0lFTik7CisJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9NUiwgaG9zdC0+bW9kZV9yZWcpOworCQlpZiAoaG9zdC0+Y2Fwcy5oYXNfY2ZnX3JlZykKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DRkcsIGhvc3QtPmNmZ19yZWcpOwogCQlob3N0LT5uZWVkX3Jlc2V0ID0gZmFsc2U7CiAJfQotCW1jaV93cml0ZWwoaG9zdCwgU0RDUiwgc2xvdC0+c2RjX3JlZyk7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX1NEQ1IsIHNsb3QtPnNkY19yZWcpOwogCi0JaWZsYWdzID0gbWNpX3JlYWRsKGhvc3QsIElNUik7Ci0JaWYgKGlmbGFncyAmIH4oTUNJX1NESU9JUlFBIHwgTUNJX1NESU9JUlFCKSkKKwlpZmxhZ3MgPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9JTVIpOworCWlmIChpZmxhZ3MgJiB+KEFUTUNJX1NESU9JUlFBIHwgQVRNQ0lfU0RJT0lSUUIpKQogCQlkZXZfd2Fybigmc2xvdC0+bW1jLT5jbGFzc19kZXYsICJXQVJOSU5HOiBJTVI9MHglMDh4XG4iLAogCQkJCWlmbGFncyk7CiAKIAlpZiAodW5saWtlbHkodGVzdF9hbmRfY2xlYXJfYml0KEFUTUNJX0NBUkRfTkVFRF9JTklULCAmc2xvdC0+ZmxhZ3MpKSkgewogCQkvKiBTZW5kIGluaXQgc2VxdWVuY2UgKDc0IGNsb2NrIGN5Y2xlcykgKi8KLQkJbWNpX3dyaXRlbChob3N0LCBDTURSLCBNQ0lfQ01EUl9TUENNRF9JTklUKTsKLQkJd2hpbGUgKCEobWNpX3JlYWRsKGhvc3QsIFNSKSAmIE1DSV9DTURSRFkpKQorCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ01EUiwgQVRNQ0lfQ01EUl9TUENNRF9JTklUKTsKKwkJd2hpbGUgKCEoYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfU1IpICYgQVRNQ0lfQ01EUkRZKSkKIAkJCWNwdV9yZWxheCgpOwogCX0KIAlpZmxhZ3MgPSAwOwpAQCAtODE4LDMxICs5OTEsMzEgQEAKIAkJYXRtY2lfc2V0X3RpbWVvdXQoaG9zdCwgc2xvdCwgZGF0YSk7CiAKIAkJLyogTXVzdCBzZXQgYmxvY2sgY291bnQvc2l6ZSBiZWZvcmUgc2VuZGluZyBjb21tYW5kICovCi0JCW1jaV93cml0ZWwoaG9zdCwgQkxLUiwgTUNJX0JDTlQoZGF0YS0+YmxvY2tzKQotCQkJCXwgTUNJX0JMS0xFTihkYXRhLT5ibGtzeikpOworCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQkxLUiwgQVRNQ0lfQkNOVChkYXRhLT5ibG9ja3MpCisJCQkJfCBBVE1DSV9CTEtMRU4oZGF0YS0+Ymxrc3opKTsKIAkJZGV2X3ZkYmcoJnNsb3QtPm1tYy0+Y2xhc3NfZGV2LCAiQkxLUj0weCUwOHhcbiIsCi0JCQlNQ0lfQkNOVChkYXRhLT5ibG9ja3MpIHwgTUNJX0JMS0xFTihkYXRhLT5ibGtzeikpOworCQkJQVRNQ0lfQkNOVChkYXRhLT5ibG9ja3MpIHwgQVRNQ0lfQkxLTEVOKGRhdGEtPmJsa3N6KSk7CiAKLQkJaWZsYWdzIHw9IGF0bWNpX3ByZXBhcmVfZGF0YShob3N0LCBkYXRhKTsKKwkJaWZsYWdzIHw9IGhvc3QtPnByZXBhcmVfZGF0YShob3N0LCBkYXRhKTsKIAl9CiAKLQlpZmxhZ3MgfD0gTUNJX0NNRFJEWTsKKwlpZmxhZ3MgfD0gQVRNQ0lfQ01EUkRZOwogCWNtZCA9IG1ycS0+Y21kOwogCWNtZGZsYWdzID0gYXRtY2lfcHJlcGFyZV9jb21tYW5kKHNsb3QtPm1tYywgY21kKTsKLQlhdG1jaV9zdGFydF9jb21tYW5kKGhvc3QsIGNtZCwgY21kZmxhZ3MpOworCWF0bWNpX3NlbmRfY29tbWFuZChob3N0LCBjbWQsIGNtZGZsYWdzKTsKIAogCWlmIChkYXRhKQotCQlhdG1jaV9zdWJtaXRfZGF0YShob3N0KTsKKwkJaG9zdC0+c3VibWl0X2RhdGEoaG9zdCwgZGF0YSk7CiAKIAlpZiAobXJxLT5zdG9wKSB7CiAJCWhvc3QtPnN0b3BfY21kciA9IGF0bWNpX3ByZXBhcmVfY29tbWFuZChzbG90LT5tbWMsIG1ycS0+c3RvcCk7Ci0JCWhvc3QtPnN0b3BfY21kciB8PSBNQ0lfQ01EUl9TVE9QX1hGRVI7CisJCWhvc3QtPnN0b3BfY21kciB8PSBBVE1DSV9DTURSX1NUT1BfWEZFUjsKIAkJaWYgKCEoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9XUklURSkpCi0JCQlob3N0LT5zdG9wX2NtZHIgfD0gTUNJX0NNRFJfVFJESVJfUkVBRDsKKwkJCWhvc3QtPnN0b3BfY21kciB8PSBBVE1DSV9DTURSX1RSRElSX1JFQUQ7CiAJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1NUUkVBTSkKLQkJCWhvc3QtPnN0b3BfY21kciB8PSBNQ0lfQ01EUl9TVFJFQU07CisJCQlob3N0LT5zdG9wX2NtZHIgfD0gQVRNQ0lfQ01EUl9TVFJFQU07CiAJCWVsc2UKLQkJCWhvc3QtPnN0b3BfY21kciB8PSBNQ0lfQ01EUl9NVUxUSV9CTE9DSzsKKwkJCWhvc3QtPnN0b3BfY21kciB8PSBBVE1DSV9DTURSX01VTFRJX0JMT0NLOwogCX0KIAogCS8qCkBAIC04NTEsNyArMTAyNCw3IEBACiAJICogY29uZGl0aW9ucyAoZS5nLiBjb21tYW5kIGFuZCBkYXRhIGNvbXBsZXRlLCBidXQgc3RvcCBub3QKIAkgKiBwcmVwYXJlZCB5ZXQuKQogCSAqLwotCW1jaV93cml0ZWwoaG9zdCwgSUVSLCBpZmxhZ3MpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIGlmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0bWNpX3F1ZXVlX3JlcXVlc3Qoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwKQEAgLTkwOSwxMyArMTA4MiwxMyBAQAogCXN0cnVjdCBhdG1lbF9tY2kJKmhvc3QgPSBzbG90LT5ob3N0OwogCXVuc2lnbmVkIGludAkJaTsKIAotCXNsb3QtPnNkY19yZWcgJj0gfk1DSV9TRENCVVNfTUFTSzsKKwlzbG90LT5zZGNfcmVnICY9IH5BVE1DSV9TRENCVVNfTUFTSzsKIAlzd2l0Y2ggKGlvcy0+YnVzX3dpZHRoKSB7CiAJY2FzZSBNTUNfQlVTX1dJRFRIXzE6Ci0JCXNsb3QtPnNkY19yZWcgfD0gTUNJX1NEQ0JVU18xQklUOworCQlzbG90LT5zZGNfcmVnIHw9IEFUTUNJX1NEQ0JVU18xQklUOwogCQlicmVhazsKIAljYXNlIE1NQ19CVVNfV0lEVEhfNDoKLQkJc2xvdC0+c2RjX3JlZyB8PSBNQ0lfU0RDQlVTXzRCSVQ7CisJCXNsb3QtPnNkY19yZWcgfD0gQVRNQ0lfU0RDQlVTXzRCSVQ7CiAJCWJyZWFrOwogCX0KIApAQCAtOTI2LDEwICsxMDk5LDEwIEBACiAJCXNwaW5fbG9ja19iaCgmaG9zdC0+bG9jayk7CiAJCWlmICghaG9zdC0+bW9kZV9yZWcpIHsKIAkJCWNsa19lbmFibGUoaG9zdC0+bWNrKTsKLQkJCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9TV1JTVCk7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIENSLCBNQ0lfQ1JfTUNJRU4pOwotCQkJaWYgKGF0bWNpX2lzX21jaTIoKSkKLQkJCQltY2lfd3JpdGVsKGhvc3QsIENGRywgaG9zdC0+Y2ZnX3JlZyk7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ1IsIEFUTUNJX0NSX1NXUlNUKTsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DUiwgQVRNQ0lfQ1JfTUNJRU4pOworCQkJaWYgKGhvc3QtPmNhcHMuaGFzX2NmZ19yZWcpCisJCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NGRywgaG9zdC0+Y2ZnX3JlZyk7CiAJCX0KIAogCQkvKgpAQCAtOTM3LDcgKzExMTAsNyBAQAogCQkgKiBjb3JlIGlvcyB1cGRhdGUgd2hlbiBmaW5kaW5nIHRoZSBtaW5pbXVtLgogCQkgKi8KIAkJc2xvdC0+Y2xvY2sgPSBpb3MtPmNsb2NrOwotCQlmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBVE1DSV9NQVhfTlJfU0xPVFM7IGkrKykgewogCQkJaWYgKGhvc3QtPnNsb3RbaV0gJiYgaG9zdC0+c2xvdFtpXS0+Y2xvY2sKIAkJCQkJJiYgaG9zdC0+c2xvdFtpXS0+Y2xvY2sgPCBjbG9ja19taW4pCiAJCQkJY2xvY2tfbWluID0gaG9zdC0+c2xvdFtpXS0+Y2xvY2s7CkBAIC05NTIsMjggKzExMjUsMjggQEAKIAkJCWNsa2RpdiA9IDI1NTsKIAkJfQogCi0JCWhvc3QtPm1vZGVfcmVnID0gTUNJX01SX0NMS0RJVihjbGtkaXYpOworCQlob3N0LT5tb2RlX3JlZyA9IEFUTUNJX01SX0NMS0RJVihjbGtkaXYpOwogCiAJCS8qCiAJCSAqIFdSUFJPT0YgYW5kIFJEUFJPT0YgcHJldmVudCBvdmVycnVucy91bmRlcnJ1bnMgYnkKIAkJICogc3RvcHBpbmcgdGhlIGNsb2NrIHdoZW4gdGhlIEZJRk8gaXMgZnVsbC9lbXB0eS4KIAkJICogVGhpcyBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQgdG8gbGFzdCBmb3IgbG9uZy4KIAkJICovCi0JCWlmIChtY2lfaGFzX3J3cHJvb2YoKSkKLQkJCWhvc3QtPm1vZGVfcmVnIHw9IChNQ0lfTVJfV1JQUk9PRiB8IE1DSV9NUl9SRFBST09GKTsKKwkJaWYgKGhvc3QtPmNhcHMuaGFzX3J3cHJvb2YpCisJCQlob3N0LT5tb2RlX3JlZyB8PSAoQVRNQ0lfTVJfV1JQUk9PRiB8IEFUTUNJX01SX1JEUFJPT0YpOwogCi0JCWlmIChhdG1jaV9pc19tY2kyKCkpIHsKKwkJaWYgKGhvc3QtPmNhcHMuaGFzX2NmZ19yZWcpIHsKIAkJCS8qIHNldHVwIEhpZ2ggU3BlZWQgbW9kZSBpbiByZWxhdGlvbiB3aXRoIGNhcmQgY2FwYWNpdHkgKi8KIAkJCWlmIChpb3MtPnRpbWluZyA9PSBNTUNfVElNSU5HX1NEX0hTKQotCQkJCWhvc3QtPmNmZ19yZWcgfD0gTUNJX0NGR19IU01PREU7CisJCQkJaG9zdC0+Y2ZnX3JlZyB8PSBBVE1DSV9DRkdfSFNNT0RFOwogCQkJZWxzZQotCQkJCWhvc3QtPmNmZ19yZWcgJj0gfk1DSV9DRkdfSFNNT0RFOworCQkJCWhvc3QtPmNmZ19yZWcgJj0gfkFUTUNJX0NGR19IU01PREU7CiAJCX0KIAogCQlpZiAobGlzdF9lbXB0eSgmaG9zdC0+cXVldWUpKSB7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIE1SLCBob3N0LT5tb2RlX3JlZyk7Ci0JCQlpZiAoYXRtY2lfaXNfbWNpMigpKQotCQkJCW1jaV93cml0ZWwoaG9zdCwgQ0ZHLCBob3N0LT5jZmdfcmVnKTsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9NUiwgaG9zdC0+bW9kZV9yZWcpOworCQkJaWYgKGhvc3QtPmNhcHMuaGFzX2NmZ19yZWcpCisJCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NGRywgaG9zdC0+Y2ZnX3JlZyk7CiAJCX0gZWxzZSB7CiAJCQlob3N0LT5uZWVkX2Nsb2NrX3VwZGF0ZSA9IHRydWU7CiAJCX0KQEAgLTk4NCwxNiArMTE1NywxNiBAQAogCiAJCXNwaW5fbG9ja19iaCgmaG9zdC0+bG9jayk7CiAJCXNsb3QtPmNsb2NrID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IEFUTUVMX01DSV9NQVhfTlJfU0xPVFM7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgQVRNQ0lfTUFYX05SX1NMT1RTOyBpKyspIHsKIAkJCWlmIChob3N0LT5zbG90W2ldICYmIGhvc3QtPnNsb3RbaV0tPmNsb2NrKSB7CiAJCQkJYW55X3Nsb3RfYWN0aXZlID0gdHJ1ZTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlpZiAoIWFueV9zbG90X2FjdGl2ZSkgewotCQkJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX01DSURJUyk7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ1IsIEFUTUNJX0NSX01DSURJUyk7CiAJCQlpZiAoaG9zdC0+bW9kZV9yZWcpIHsKLQkJCQltY2lfcmVhZGwoaG9zdCwgTVIpOworCQkJCWF0bWNpX3JlYWRsKGhvc3QsIEFUTUNJX01SKTsKIAkJCQljbGtfZGlzYWJsZShob3N0LT5tY2spOwogCQkJfQogCQkJaG9zdC0+bW9kZV9yZWcgPSAwOwpAQCAtMTA1Nyw5ICsxMjMwLDkgQEAKIAlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gc2xvdC0+aG9zdDsKIAogCWlmIChlbmFibGUpCi0JCW1jaV93cml0ZWwoaG9zdCwgSUVSLCBzbG90LT5zZGlvX2lycSk7CisJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIHNsb3QtPnNkaW9faXJxKTsKIAllbHNlCi0JCW1jaV93cml0ZWwoaG9zdCwgSURSLCBzbG90LT5zZGlvX2lycSk7CisJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIHNsb3QtPnNkaW9faXJxKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgYXRtY2lfb3BzID0gewpAQCAtMTA4Niw5ICsxMjU5LDkgQEAKIAkgKiBidXN5IHRyYW5zZmVycmluZyBkYXRhLgogCSAqLwogCWlmIChob3N0LT5uZWVkX2Nsb2NrX3VwZGF0ZSkgewotCQltY2lfd3JpdGVsKGhvc3QsIE1SLCBob3N0LT5tb2RlX3JlZyk7Ci0JCWlmIChhdG1jaV9pc19tY2kyKCkpCi0JCQltY2lfd3JpdGVsKGhvc3QsIENGRywgaG9zdC0+Y2ZnX3JlZyk7CisJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9NUiwgaG9zdC0+bW9kZV9yZWcpOworCQlpZiAoaG9zdC0+Y2Fwcy5oYXNfY2ZnX3JlZykKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DRkcsIGhvc3QtPmNmZ19yZWcpOwogCX0KIAogCWhvc3QtPmN1cl9zbG90LT5tcnEgPSBOVUxMOwpAQCAtMTExNywxNiArMTI5MCwxNiBAQAogCXUzMgkJc3RhdHVzID0gaG9zdC0+Y21kX3N0YXR1czsKIAogCS8qIFJlYWQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIGNhcmQgKHVwIHRvIDE2IGJ5dGVzKSAqLwotCWNtZC0+cmVzcFswXSA9IG1jaV9yZWFkbChob3N0LCBSU1BSKTsKLQljbWQtPnJlc3BbMV0gPSBtY2lfcmVhZGwoaG9zdCwgUlNQUik7Ci0JY21kLT5yZXNwWzJdID0gbWNpX3JlYWRsKGhvc3QsIFJTUFIpOwotCWNtZC0+cmVzcFszXSA9IG1jaV9yZWFkbChob3N0LCBSU1BSKTsKKwljbWQtPnJlc3BbMF0gPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9SU1BSKTsKKwljbWQtPnJlc3BbMV0gPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9SU1BSKTsKKwljbWQtPnJlc3BbMl0gPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9SU1BSKTsKKwljbWQtPnJlc3BbM10gPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9SU1BSKTsKIAotCWlmIChzdGF0dXMgJiBNQ0lfUlRPRSkKKwlpZiAoc3RhdHVzICYgQVRNQ0lfUlRPRSkKIAkJY21kLT5lcnJvciA9IC1FVElNRURPVVQ7Ci0JZWxzZSBpZiAoKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX0NSQykgJiYgKHN0YXR1cyAmIE1DSV9SQ1JDRSkpCisJZWxzZSBpZiAoKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX0NSQykgJiYgKHN0YXR1cyAmIEFUTUNJX1JDUkNFKSkKIAkJY21kLT5lcnJvciA9IC1FSUxTRVE7Ci0JZWxzZSBpZiAoc3RhdHVzICYgKE1DSV9SSU5ERSB8IE1DSV9SRElSRSB8IE1DSV9SRU5ERSkpCisJZWxzZSBpZiAoc3RhdHVzICYgKEFUTUNJX1JJTkRFIHwgQVRNQ0lfUkRJUkUgfCBBVE1DSV9SRU5ERSkpCiAJCWNtZC0+ZXJyb3IgPSAtRUlPOwogCWVsc2UKIAkJY21kLT5lcnJvciA9IDA7CkBAIC0xMTM2LDEwICsxMzA5LDEwIEBACiAJCQkiY29tbWFuZCBlcnJvcjogc3RhdHVzPTB4JTA4eFxuIiwgc3RhdHVzKTsKIAogCQlpZiAoY21kLT5kYXRhKSB7Ci0JCQlhdG1jaV9zdG9wX2RtYShob3N0KTsKKwkJCWhvc3QtPnN0b3BfdHJhbnNmZXIoaG9zdCk7CiAJCQlob3N0LT5kYXRhID0gTlVMTDsKLQkJCW1jaV93cml0ZWwoaG9zdCwgSURSLCBNQ0lfTk9UQlVTWQotCQkJCQl8IE1DSV9UWFJEWSB8IE1DSV9SWFJEWQorCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lEUiwgQVRNQ0lfTk9UQlVTWQorCQkJCQl8IEFUTUNJX1RYUkRZIHwgQVRNQ0lfUlhSRFkKIAkJCQkJfCBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTKTsKIAkJfQogCX0KQEAgLTExOTEsMTEgKzEzNjQsMTEgQEAKIAkJCQkgKiBSZXNldCBjb250cm9sbGVyIHRvIHRlcm1pbmF0ZSBhbnkgb25nb2luZwogCQkJCSAqIGNvbW1hbmRzIG9yIGRhdGEgdHJhbnNmZXJzLgogCQkJCSAqLwotCQkJCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9TV1JTVCk7Ci0JCQkJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX01DSUVOKTsKLQkJCQltY2lfd3JpdGVsKGhvc3QsIE1SLCBob3N0LT5tb2RlX3JlZyk7Ci0JCQkJaWYgKGF0bWNpX2lzX21jaTIoKSkKLQkJCQkJbWNpX3dyaXRlbChob3N0LCBDRkcsIGhvc3QtPmNmZ19yZWcpOworCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DUiwgQVRNQ0lfQ1JfU1dSU1QpOworCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DUiwgQVRNQ0lfQ1JfTUNJRU4pOworCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9NUiwgaG9zdC0+bW9kZV9yZWcpOworCQkJCWlmIChob3N0LT5jYXBzLmhhc19jZmdfcmVnKQorCQkJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ0ZHLCBob3N0LT5jZmdfcmVnKTsKIAogCQkJCWhvc3QtPmRhdGEgPSBOVUxMOwogCQkJCWhvc3QtPmNtZCA9IE5VTEw7CkBAIC0xMjEwLDcgKzEzODMsNyBAQAogCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJCQljYXNlIFNUQVRFX1NFTkRJTkdfREFUQToKIAkJCQkJbXJxLT5kYXRhLT5lcnJvciA9IC1FTk9NRURJVU07Ci0JCQkJCWF0bWNpX3N0b3BfZG1hKGhvc3QpOworCQkJCQlob3N0LT5zdG9wX3RyYW5zZmVyKGhvc3QpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIFNUQVRFX0RBVEFfQlVTWToKIAkJCQljYXNlIFNUQVRFX0RBVEFfRVJST1I6CkBAIC0xMjYxLDcgKzE0MzQsNyBAQAogCWRldl92ZGJnKCZob3N0LT5wZGV2LT5kZXYsCiAJCSJ0YXNrbGV0OiBzdGF0ZSAldSBwZW5kaW5nL2NvbXBsZXRlZC9tYXNrICVseC8lbHgvJXhcbiIsCiAJCXN0YXRlLCBob3N0LT5wZW5kaW5nX2V2ZW50cywgaG9zdC0+Y29tcGxldGVkX2V2ZW50cywKLQkJbWNpX3JlYWRsKGhvc3QsIElNUikpOworCQlhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9JTVIpKTsKIAogCWRvIHsKIAkJcHJldl9zdGF0ZSA9IHN0YXRlOwpAQCAtMTI4OSw5ICsxNDYyLDkgQEAKIAkJY2FzZSBTVEFURV9TRU5ESU5HX0RBVEE6CiAJCQlpZiAoYXRtY2lfdGVzdF9hbmRfY2xlYXJfcGVuZGluZyhob3N0LAogCQkJCQkJRVZFTlRfREFUQV9FUlJPUikpIHsKLQkJCQlhdG1jaV9zdG9wX2RtYShob3N0KTsKKwkJCQlob3N0LT5zdG9wX3RyYW5zZmVyKGhvc3QpOwogCQkJCWlmIChkYXRhLT5zdG9wKQotCQkJCQlzZW5kX3N0b3BfY21kKGhvc3QsIGRhdGEpOworCQkJCQlhdG1jaV9zZW5kX3N0b3BfY21kKGhvc3QsIGRhdGEpOwogCQkJCXN0YXRlID0gU1RBVEVfREFUQV9FUlJPUjsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTEzMTMsMTEgKzE0ODYsMTEgQEAKIAkJCWF0bWNpX3NldF9jb21wbGV0ZWQoaG9zdCwgRVZFTlRfREFUQV9DT01QTEVURSk7CiAJCQlzdGF0dXMgPSBob3N0LT5kYXRhX3N0YXR1czsKIAkJCWlmICh1bmxpa2VseShzdGF0dXMgJiBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTKSkgewotCQkJCWlmIChzdGF0dXMgJiBNQ0lfRFRPRSkgeworCQkJCWlmIChzdGF0dXMgJiBBVE1DSV9EVE9FKSB7CiAJCQkJCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwKIAkJCQkJCQkiZGF0YSB0aW1lb3V0IGVycm9yXG4iKTsKIAkJCQkJZGF0YS0+ZXJyb3IgPSAtRVRJTUVET1VUOwotCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgTUNJX0RDUkNFKSB7CisJCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBBVE1DSV9EQ1JDRSkgewogCQkJCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCiAJCQkJCQkJImRhdGEgQ1JDIGVycm9yXG4iKTsKIAkJCQkJZGF0YS0+ZXJyb3IgPSAtRUlMU0VROwpAQCAtMTMzMCw3ICsxNTAzLDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJZGF0YS0+Ynl0ZXNfeGZlcmVkID0gZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3o7CiAJCQkJZGF0YS0+ZXJyb3IgPSAwOwotCQkJCW1jaV93cml0ZWwoaG9zdCwgSURSLCBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTKTsKKwkJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTKTsKIAkJCX0KIAogCQkJaWYgKCFkYXRhLT5zdG9wKSB7CkBAIC0xMzQwLDcgKzE1MTMsNyBAQAogCiAJCQlwcmV2X3N0YXRlID0gc3RhdGUgPSBTVEFURV9TRU5ESU5HX1NUT1A7CiAJCQlpZiAoIWRhdGEtPmVycm9yKQotCQkJCXNlbmRfc3RvcF9jbWQoaG9zdCwgZGF0YSk7CisJCQkJYXRtY2lfc2VuZF9zdG9wX2NtZChob3N0LCBkYXRhKTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCiAJCWNhc2UgU1RBVEVfU0VORElOR19TVE9QOgpAQCAtMTM4MCw3ICsxNTUzLDcgQEAKIAl1bnNpZ25lZCBpbnQJCW5ieXRlcyA9IDA7CiAKIAlkbyB7Ci0JCXZhbHVlID0gbWNpX3JlYWRsKGhvc3QsIFJEUik7CisJCXZhbHVlID0gYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfUkRSKTsKIAkJaWYgKGxpa2VseShvZmZzZXQgKyA0IDw9IHNnLT5sZW5ndGgpKSB7CiAJCQlwdXRfdW5hbGlnbmVkKHZhbHVlLCAodTMyICopKGJ1ZiArIG9mZnNldCkpOwogCkBAIC0xNDEyLDkgKzE1ODUsOSBAQAogCQkJbmJ5dGVzICs9IG9mZnNldDsKIAkJfQogCi0JCXN0YXR1cyA9IG1jaV9yZWFkbChob3N0LCBTUik7CisJCXN0YXR1cyA9IGF0bWNpX3JlYWRsKGhvc3QsIEFUTUNJX1NSKTsKIAkJaWYgKHN0YXR1cyAmIEFUTUNJX0RBVEFfRVJST1JfRkxBR1MpIHsKLQkJCW1jaV93cml0ZWwoaG9zdCwgSURSLCAoTUNJX05PVEJVU1kgfCBNQ0lfUlhSRFkKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIChBVE1DSV9OT1RCVVNZIHwgQVRNQ0lfUlhSRFkKIAkJCQkJCXwgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUykpOwogCQkJaG9zdC0+ZGF0YV9zdGF0dXMgPSBzdGF0dXM7CiAJCQlkYXRhLT5ieXRlc194ZmVyZWQgKz0gbmJ5dGVzOwpAQCAtMTQyMyw3ICsxNTk2LDcgQEAKIAkJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPnRhc2tsZXQpOwogCQkJcmV0dXJuOwogCQl9Ci0JfSB3aGlsZSAoc3RhdHVzICYgTUNJX1JYUkRZKTsKKwl9IHdoaWxlIChzdGF0dXMgJiBBVE1DSV9SWFJEWSk7CiAKIAlob3N0LT5waW9fb2Zmc2V0ID0gb2Zmc2V0OwogCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7CkBAIC0xNDMxLDggKzE2MDQsOCBAQAogCXJldHVybjsKIAogZG9uZToKLQltY2lfd3JpdGVsKGhvc3QsIElEUiwgTUNJX1JYUkRZKTsKLQltY2lfd3JpdGVsKGhvc3QsIElFUiwgTUNJX05PVEJVU1kpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIEFUTUNJX1JYUkRZKTsKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBBVE1DSV9OT1RCVVNZKTsKIAlkYXRhLT5ieXRlc194ZmVyZWQgKz0gbmJ5dGVzOwogCXNtcF93bWIoKTsKIAlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKQEAgLTE0NTEsNyArMTYyNCw3IEBACiAJZG8gewogCQlpZiAobGlrZWx5KG9mZnNldCArIDQgPD0gc2ctPmxlbmd0aCkpIHsKIAkJCXZhbHVlID0gZ2V0X3VuYWxpZ25lZCgodTMyICopKGJ1ZiArIG9mZnNldCkpOwotCQkJbWNpX3dyaXRlbChob3N0LCBURFIsIHZhbHVlKTsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9URFIsIHZhbHVlKTsKIAogCQkJb2Zmc2V0ICs9IDQ7CiAJCQluYnl0ZXMgKz0gNDsKQEAgLTE0NzIsMjAgKzE2NDUsMjAgQEAKIAogCQkJaG9zdC0+c2cgPSBzZyA9IHNnX25leHQoc2cpOwogCQkJaWYgKCFzZykgewotCQkJCW1jaV93cml0ZWwoaG9zdCwgVERSLCB2YWx1ZSk7CisJCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX1REUiwgdmFsdWUpOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KIAogCQkJb2Zmc2V0ID0gNCAtIHJlbWFpbmluZzsKIAkJCWJ1ZiA9IHNnX3ZpcnQoc2cpOwogCQkJbWVtY3B5KCh1OCAqKSZ2YWx1ZSArIHJlbWFpbmluZywgYnVmLCBvZmZzZXQpOwotCQkJbWNpX3dyaXRlbChob3N0LCBURFIsIHZhbHVlKTsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9URFIsIHZhbHVlKTsKIAkJCW5ieXRlcyArPSBvZmZzZXQ7CiAJCX0KIAotCQlzdGF0dXMgPSBtY2lfcmVhZGwoaG9zdCwgU1IpOworCQlzdGF0dXMgPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9TUik7CiAJCWlmIChzdGF0dXMgJiBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTKSB7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIElEUiwgKE1DSV9OT1RCVVNZIHwgTUNJX1RYUkRZCisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCAoQVRNQ0lfTk9UQlVTWSB8IEFUTUNJX1RYUkRZCiAJCQkJCQl8IEFUTUNJX0RBVEFfRVJST1JfRkxBR1MpKTsKIAkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOwogCQkJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKQEAgLTE0OTQsNyArMTY2Nyw3IEBACiAJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKIAkJCXJldHVybjsKIAkJfQotCX0gd2hpbGUgKHN0YXR1cyAmIE1DSV9UWFJEWSk7CisJfSB3aGlsZSAoc3RhdHVzICYgQVRNQ0lfVFhSRFkpOwogCiAJaG9zdC0+cGlvX29mZnNldCA9IG9mZnNldDsKIAlkYXRhLT5ieXRlc194ZmVyZWQgKz0gbmJ5dGVzOwpAQCAtMTUwMiw4ICsxNjc1LDggQEAKIAlyZXR1cm47CiAKIGRvbmU6Ci0JbWNpX3dyaXRlbChob3N0LCBJRFIsIE1DSV9UWFJEWSk7Ci0JbWNpX3dyaXRlbChob3N0LCBJRVIsIE1DSV9OT1RCVVNZKTsKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBBVE1DSV9UWFJEWSk7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfTk9UQlVTWSk7CiAJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKIAlzbXBfd21iKCk7CiAJYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgRVZFTlRfWEZFUl9DT01QTEVURSk7CkBAIC0xNTExLDcgKzE2ODQsNyBAQAogCiBzdGF0aWMgdm9pZCBhdG1jaV9jbWRfaW50ZXJydXB0KHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHUzMiBzdGF0dXMpCiB7Ci0JbWNpX3dyaXRlbChob3N0LCBJRFIsIE1DSV9DTURSRFkpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIEFUTUNJX0NNRFJEWSk7CiAKIAlob3N0LT5jbWRfc3RhdHVzID0gc3RhdHVzOwogCXNtcF93bWIoKTsKQEAgLTE1MjMsNyArMTY5Niw3IEBACiB7CiAJaW50CWk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFUTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CiAJCXN0cnVjdCBhdG1lbF9tY2lfc2xvdCAqc2xvdCA9IGhvc3QtPnNsb3RbaV07CiAJCWlmIChzbG90ICYmIChzdGF0dXMgJiBzbG90LT5zZGlvX2lycSkpIHsKIAkJCW1tY19zaWduYWxfc2Rpb19pcnEoc2xvdC0+bW1jKTsKQEAgLTE1MzksNDAgKzE3MTIsOTIgQEAKIAl1bnNpZ25lZCBpbnQJCXBhc3NfY291bnQgPSAwOwogCiAJZG8gewotCQlzdGF0dXMgPSBtY2lfcmVhZGwoaG9zdCwgU1IpOwotCQltYXNrID0gbWNpX3JlYWRsKGhvc3QsIElNUik7CisJCXN0YXR1cyA9IGF0bWNpX3JlYWRsKGhvc3QsIEFUTUNJX1NSKTsKKwkJbWFzayA9IGF0bWNpX3JlYWRsKGhvc3QsIEFUTUNJX0lNUik7CiAJCXBlbmRpbmcgPSBzdGF0dXMgJiBtYXNrOwogCQlpZiAoIXBlbmRpbmcpCiAJCQlicmVhazsKIAogCQlpZiAocGVuZGluZyAmIEFUTUNJX0RBVEFfRVJST1JfRkxBR1MpIHsKLQkJCW1jaV93cml0ZWwoaG9zdCwgSURSLCBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTCi0JCQkJCXwgTUNJX1JYUkRZIHwgTUNJX1RYUkRZKTsKLQkJCXBlbmRpbmcgJj0gbWNpX3JlYWRsKGhvc3QsIElNUik7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTCisJCQkJCXwgQVRNQ0lfUlhSRFkgfCBBVE1DSV9UWFJEWSk7CisJCQlwZW5kaW5nICY9IGF0bWNpX3JlYWRsKGhvc3QsIEFUTUNJX0lNUik7CiAKIAkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOwogCQkJc21wX3dtYigpOwogCQkJYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgRVZFTlRfREFUQV9FUlJPUik7CiAJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKIAkJfQotCQlpZiAocGVuZGluZyAmIE1DSV9OT1RCVVNZKSB7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIElEUiwKLQkJCQkJQVRNQ0lfREFUQV9FUlJPUl9GTEFHUyB8IE1DSV9OT1RCVVNZKTsKKworCQlpZiAocGVuZGluZyAmIEFUTUNJX1RYQlVGRSkgeworCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lEUiwgQVRNQ0lfVFhCVUZFKTsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIEFUTUNJX0VORFRYKTsKKwkJCS8qCisJCQkgKiBXZSBjYW4gcmVjZWl2ZSB0aGlzIGludGVycnVwdGlvbiBiZWZvcmUgaGF2aW5nIGNvbmZpZ3VyZWQKKwkJCSAqIHRoZSBzZWNvbmQgcGRjIGJ1ZmZlciwgc28gd2UgbmVlZCB0byByZWNvbmZpZ3VyZSBmaXJzdCBhbmQKKwkJCSAqIHNlY29uZCBidWZmZXJzIGFnYWluCisJCQkgKi8KKwkJCWlmIChob3N0LT5kYXRhX3NpemUpIHsKKwkJCQlhdG1jaV9wZGNfc2V0X2JvdGhfYnVmKGhvc3QsIFhGRVJfVFJBTlNNSVQpOworCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIEFUTUNJX0VORFRYKTsKKwkJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBBVE1DSV9UWEJVRkUpOworCQkJfSBlbHNlIHsKKwkJCQlhdG1jaV9wZGNfY29tcGxldGUoaG9zdCk7CisJCQl9CisJCX0gZWxzZSBpZiAocGVuZGluZyAmIEFUTUNJX0VORFRYKSB7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBBVE1DSV9FTkRUWCk7CisKKwkJCWlmIChob3N0LT5kYXRhX3NpemUpIHsKKwkJCQlhdG1jaV9wZGNfc2V0X3NpbmdsZV9idWYoaG9zdCwKKwkJCQkJCVhGRVJfVFJBTlNNSVQsIFBEQ19TRUNPTkRfQlVGKTsKKwkJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBBVE1DSV9FTkRUWCk7CisJCQl9CisJCX0KKworCQlpZiAocGVuZGluZyAmIEFUTUNJX1JYQlVGRikgeworCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lEUiwgQVRNQ0lfUlhCVUZGKTsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIEFUTUNJX0VORFJYKTsKKwkJCS8qCisJCQkgKiBXZSBjYW4gcmVjZWl2ZSB0aGlzIGludGVycnVwdGlvbiBiZWZvcmUgaGF2aW5nIGNvbmZpZ3VyZWQKKwkJCSAqIHRoZSBzZWNvbmQgcGRjIGJ1ZmZlciwgc28gd2UgbmVlZCB0byByZWNvbmZpZ3VyZSBmaXJzdCBhbmQKKwkJCSAqIHNlY29uZCBidWZmZXJzIGFnYWluCisJCQkgKi8KKwkJCWlmIChob3N0LT5kYXRhX3NpemUpIHsKKwkJCQlhdG1jaV9wZGNfc2V0X2JvdGhfYnVmKGhvc3QsIFhGRVJfUkVDRUlWRSk7CisJCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfRU5EUlgpOworCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIEFUTUNJX1JYQlVGRik7CisJCQl9IGVsc2UgeworCQkJCWF0bWNpX3BkY19jb21wbGV0ZShob3N0KTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwZW5kaW5nICYgQVRNQ0lfRU5EUlgpIHsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIEFUTUNJX0VORFJYKTsKKworCQkJaWYgKGhvc3QtPmRhdGFfc2l6ZSkgeworCQkJCWF0bWNpX3BkY19zZXRfc2luZ2xlX2J1Zihob3N0LAorCQkJCQkJWEZFUl9SRUNFSVZFLCBQRENfU0VDT05EX0JVRik7CisJCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfRU5EUlgpOworCQkJfQorCQl9CisKKworCQlpZiAocGVuZGluZyAmIEFUTUNJX05PVEJVU1kpIHsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsCisJCQkJCUFUTUNJX0RBVEFfRVJST1JfRkxBR1MgfCBBVE1DSV9OT1RCVVNZKTsKIAkJCWlmICghaG9zdC0+ZGF0YV9zdGF0dXMpCiAJCQkJaG9zdC0+ZGF0YV9zdGF0dXMgPSBzdGF0dXM7CiAJCQlzbXBfd21iKCk7CiAJCQlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9EQVRBX0NPTVBMRVRFKTsKIAkJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPnRhc2tsZXQpOwogCQl9Ci0JCWlmIChwZW5kaW5nICYgTUNJX1JYUkRZKQorCQlpZiAocGVuZGluZyAmIEFUTUNJX1JYUkRZKQogCQkJYXRtY2lfcmVhZF9kYXRhX3Bpbyhob3N0KTsKLQkJaWYgKHBlbmRpbmcgJiBNQ0lfVFhSRFkpCisJCWlmIChwZW5kaW5nICYgQVRNQ0lfVFhSRFkpCiAJCQlhdG1jaV93cml0ZV9kYXRhX3Bpbyhob3N0KTsKIAotCQlpZiAocGVuZGluZyAmIE1DSV9DTURSRFkpCisJCWlmIChwZW5kaW5nICYgQVRNQ0lfQ01EUkRZKQogCQkJYXRtY2lfY21kX2ludGVycnVwdChob3N0LCBzdGF0dXMpOwogCi0JCWlmIChwZW5kaW5nICYgKE1DSV9TRElPSVJRQSB8IE1DSV9TRElPSVJRQikpCisJCWlmIChwZW5kaW5nICYgKEFUTUNJX1NESU9JUlFBIHwgQVRNQ0lfU0RJT0lSUUIpKQogCQkJYXRtY2lfc2Rpb19pbnRlcnJ1cHQoaG9zdCwgc3RhdHVzKTsKIAogCX0gd2hpbGUgKHBhc3NfY291bnQrKyA8IDUpOwpAQCAtMTYyMSw3ICsxODQ2LDcgQEAKIAltbWMtPm9jcl9hdmFpbAk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OwogCWlmIChzZGlvX2lycSkKIAkJbW1jLT5jYXBzIHw9IE1NQ19DQVBfU0RJT19JUlE7Ci0JaWYgKGF0bWNpX2lzX21jaTIoKSkKKwlpZiAoaG9zdC0+Y2Fwcy5oYXNfaGlnaHNwZWVkKQogCQltbWMtPmNhcHMgfD0gTU1DX0NBUF9TRF9ISUdIU1BFRUQ7CiAJaWYgKHNsb3RfZGF0YS0+YnVzX3dpZHRoID49IDQpCiAJCW1tYy0+Y2FwcyB8PSBNTUNfQ0FQXzRfQklUX0RBVEE7CkBAIC0xNzA0LDggKzE5MjksNyBAQAogCW1tY19mcmVlX2hvc3Qoc2xvdC0+bW1jKTsKIH0KIAotI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCi1zdGF0aWMgYm9vbCBmaWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpzbGF2ZSkKK3N0YXRpYyBib29sIGF0bWNpX2ZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnNsYXZlKQogewogCXN0cnVjdCBtY2lfZG1hX2RhdGEJKnNsID0gc2xhdmU7CiAKQEAgLTE3MzAsMTQgKzE5NTQsMTQgQEAKIAkJZG1hX2NhcF9tYXNrX3QgbWFzazsKIAogCQlzZXR1cF9kbWFfYWRkcihwZGF0YS0+ZG1hX3NsYXZlLAotCQkJICAgICAgIGhvc3QtPm1hcGJhc2UgKyBNQ0lfVERSLAotCQkJICAgICAgIGhvc3QtPm1hcGJhc2UgKyBNQ0lfUkRSKTsKKwkJCSAgICAgICBob3N0LT5tYXBiYXNlICsgQVRNQ0lfVERSLAorCQkJICAgICAgIGhvc3QtPm1hcGJhc2UgKyBBVE1DSV9SRFIpOwogCiAJCS8qIFRyeSB0byBncmFiIGEgRE1BIGNoYW5uZWwgKi8KIAkJZG1hX2NhcF96ZXJvKG1hc2spOwogCQlkbWFfY2FwX3NldChETUFfU0xBVkUsIG1hc2spOwogCQlob3N0LT5kbWEuY2hhbiA9Ci0JCQlkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGZpbHRlciwgcGRhdGEtPmRtYV9zbGF2ZSk7CisJCQlkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGF0bWNpX2ZpbHRlciwgcGRhdGEtPmRtYV9zbGF2ZSk7CiAJfQogCWlmICghaG9zdC0+ZG1hLmNoYW4pCiAJCWRldl9ub3RpY2UoJmhvc3QtPnBkZXYtPmRldiwgIkRNQSBub3QgYXZhaWxhYmxlLCB1c2luZyBQSU9cbiIpOwpAQCAtMTc0Niw5ICsxOTcwLDYwIEBACiAJCQkJCSJVc2luZyAlcyBmb3IgRE1BIHRyYW5zZmVyc1xuIiwKIAkJCQkJZG1hX2NoYW5fbmFtZShob3N0LT5kbWEuY2hhbikpOwogfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdG1jaV9nZXRfdmVyc2lvbihzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQoreworCXJldHVybiBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9WRVJTSU9OKSAmIDB4MDAwMDBmZmY7Cit9CisKKy8qCisgKiBIU01DSSAoSGlnaCBTcGVlZCBNQ0kpIG1vZHVsZSBpcyBub3QgZnVsbHkgY29tcGF0aWJsZSB3aXRoIE1DSSBtb2R1bGUuCisgKiBIU01DSSBwcm92aWRlcyBETUEgc3VwcG9ydCBhbmQgYSBuZXcgY29uZmlnIHJlZ2lzdGVyIGJ1dCBubyBtb3JlIHN1cHBvcnRzCisgKiBQREMuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBhdG1jaV9nZXRfY2FwKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpCit7CisJdW5zaWduZWQgaW50IHZlcnNpb247CisKKwl2ZXJzaW9uID0gYXRtY2lfZ2V0X3ZlcnNpb24oaG9zdCk7CisJZGV2X2luZm8oJmhvc3QtPnBkZXYtPmRldiwKKwkJCSJ2ZXJzaW9uOiAweCV4XG4iLCB2ZXJzaW9uKTsKKworCWhvc3QtPmNhcHMuaGFzX2RtYSA9IDA7CisJaG9zdC0+Y2Fwcy5oYXNfcGRjID0gMDsKKwlob3N0LT5jYXBzLmhhc19jZmdfcmVnID0gMDsKKwlob3N0LT5jYXBzLmhhc19jc3Rvcl9yZWcgPSAwOworCWhvc3QtPmNhcHMuaGFzX2hpZ2hzcGVlZCA9IDA7CisJaG9zdC0+Y2Fwcy5oYXNfcndwcm9vZiA9IDA7CisKKwkvKiBrZWVwIG9ubHkgbWFqb3IgdmVyc2lvbiBudW1iZXIgKi8KKwlzd2l0Y2ggKHZlcnNpb24gJiAweGYwMCkgeworCWNhc2UgMHgxMDA6CisJY2FzZSAweDIwMDoKKwkJaG9zdC0+Y2Fwcy5oYXNfcGRjID0gMTsKKwkJaG9zdC0+Y2Fwcy5oYXNfcndwcm9vZiA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgzMDA6CisJY2FzZSAweDQwMDoKKwljYXNlIDB4NTAwOgorI2lmZGVmIENPTkZJR19BVF9IRE1BQworCQlob3N0LT5jYXBzLmhhc19kbWEgPSAxOwogI2Vsc2UKLXN0YXRpYyB2b2lkIGF0bWNpX2NvbmZpZ3VyZV9kbWEoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkge30KKwkJaG9zdC0+Y2Fwcy5oYXNfZG1hID0gMDsKKwkJZGV2X2luZm8oJmhvc3QtPnBkZXYtPmRldiwKKwkJCSJoYXMgZG1hIGNhcGFiaWxpdHkgYnV0IGRtYSBlbmdpbmUgaXMgbm90IHNlbGVjdGVkLCB0aGVuIHVzZSBwaW9cbiIpOwogI2VuZGlmCisJCWhvc3QtPmNhcHMuaGFzX2NmZ19yZWcgPSAxOworCQlob3N0LT5jYXBzLmhhc19jc3Rvcl9yZWcgPSAxOworCQlob3N0LT5jYXBzLmhhc19oaWdoc3BlZWQgPSAxOworCQlob3N0LT5jYXBzLmhhc19yd3Byb29mID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmhvc3QtPnBkZXYtPmRldiwKKwkJCQkiVW5tYW5hZ2VkIG1jaSB2ZXJzaW9uLCBzZXQgbWluaW11bSBjYXBhYmlsaXRpZXNcbiIpOworCQlicmVhazsKKwl9Cit9CiAKIHN0YXRpYyBpbnQgX19pbml0IGF0bWNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC0xNzg5LDcgKzIwNjQsNyBAQAogCQlnb3RvIGVycl9pb3JlbWFwOwogCiAJY2xrX2VuYWJsZShob3N0LT5tY2spOwotCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9TV1JTVCk7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NSLCBBVE1DSV9DUl9TV1JTVCk7CiAJaG9zdC0+YnVzX2h6ID0gY2xrX2dldF9yYXRlKGhvc3QtPm1jayk7CiAJY2xrX2Rpc2FibGUoaG9zdC0+bWNrKTsKIApAQCAtMTgwMSw3ICsyMDc2LDI3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfcmVxdWVzdF9pcnE7CiAKLQlhdG1jaV9jb25maWd1cmVfZG1hKGhvc3QpOworCS8qIEdldCBNQ0kgY2FwYWJpbGl0aWVzIGFuZCBzZXQgb3BlcmF0aW9ucyBhY2NvcmRpbmcgdG8gaXQgKi8KKwlhdG1jaV9nZXRfY2FwKGhvc3QpOworCWlmIChob3N0LT5jYXBzLmhhc19kbWEpIHsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgInVzaW5nIERNQVxuIik7CisJCWhvc3QtPnByZXBhcmVfZGF0YSA9ICZhdG1jaV9wcmVwYXJlX2RhdGFfZG1hOworCQlob3N0LT5zdWJtaXRfZGF0YSA9ICZhdG1jaV9zdWJtaXRfZGF0YV9kbWE7CisJCWhvc3QtPnN0b3BfdHJhbnNmZXIgPSAmYXRtY2lfc3RvcF90cmFuc2Zlcl9kbWE7CisJfSBlbHNlIGlmIChob3N0LT5jYXBzLmhhc19wZGMpIHsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgInVzaW5nIFBEQ1xuIik7CisJCWhvc3QtPnByZXBhcmVfZGF0YSA9ICZhdG1jaV9wcmVwYXJlX2RhdGFfcGRjOworCQlob3N0LT5zdWJtaXRfZGF0YSA9ICZhdG1jaV9zdWJtaXRfZGF0YV9wZGM7CisJCWhvc3QtPnN0b3BfdHJhbnNmZXIgPSAmYXRtY2lfc3RvcF90cmFuc2Zlcl9wZGM7CisJfSBlbHNlIHsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm5vIERNQSwgbm8gUERDXG4iKTsKKwkJaG9zdC0+cHJlcGFyZV9kYXRhID0gJmF0bWNpX3ByZXBhcmVfZGF0YTsKKwkJaG9zdC0+c3VibWl0X2RhdGEgPSAmYXRtY2lfc3VibWl0X2RhdGE7CisJCWhvc3QtPnN0b3BfdHJhbnNmZXIgPSAmYXRtY2lfc3RvcF90cmFuc2ZlcjsKKwl9CisKKwlpZiAoaG9zdC0+Y2Fwcy5oYXNfZG1hKQorCQlhdG1jaV9jb25maWd1cmVfZG1hKGhvc3QpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CiAKQEAgLTE4MTAsMTMgKzIxMDUsMTMgQEAKIAlyZXQgPSAtRU5PREVWOwogCWlmIChwZGF0YS0+c2xvdFswXS5idXNfd2lkdGgpIHsKIAkJcmV0ID0gYXRtY2lfaW5pdF9zbG90KGhvc3QsICZwZGF0YS0+c2xvdFswXSwKLQkJCQkwLCBNQ0lfU0RDU0VMX1NMT1RfQSwgTUNJX1NESU9JUlFBKTsKKwkJCQkwLCBBVE1DSV9TRENTRUxfU0xPVF9BLCBBVE1DSV9TRElPSVJRQSk7CiAJCWlmICghcmV0KQogCQkJbnJfc2xvdHMrKzsKIAl9CiAJaWYgKHBkYXRhLT5zbG90WzFdLmJ1c193aWR0aCkgewogCQlyZXQgPSBhdG1jaV9pbml0X3Nsb3QoaG9zdCwgJnBkYXRhLT5zbG90WzFdLAotCQkJCTEsIE1DSV9TRENTRUxfU0xPVF9CLCBNQ0lfU0RJT0lSUUIpOworCQkJCTEsIEFUTUNJX1NEQ1NFTF9TTE9UX0IsIEFUTUNJX1NESU9JUlFCKTsKIAkJaWYgKCFyZXQpCiAJCQlucl9zbG90cysrOwogCX0KQEAgLTE4MzMsMTAgKzIxMjgsOCBAQAogCXJldHVybiAwOwogCiBlcnJfaW5pdF9zbG90OgotI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCiAJaWYgKGhvc3QtPmRtYS5jaGFuKQogCQlkbWFfcmVsZWFzZV9jaGFubmVsKGhvc3QtPmRtYS5jaGFuKTsKLSNlbmRpZgogCWZyZWVfaXJxKGlycSwgaG9zdCk7CiBlcnJfcmVxdWVzdF9pcnE6CiAJaW91bm1hcChob3N0LT5yZWdzKTsKQEAgLTE4NTQsMTUgKzIxNDcsMTUgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCi0JZm9yIChpID0gMDsgaSA8IEFUTUVMX01DSV9NQVhfTlJfU0xPVFM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBVE1DSV9NQVhfTlJfU0xPVFM7IGkrKykgewogCQlpZiAoaG9zdC0+c2xvdFtpXSkKIAkJCWF0bWNpX2NsZWFudXBfc2xvdChob3N0LT5zbG90W2ldLCBpKTsKIAl9CiAKIAljbGtfZW5hYmxlKGhvc3QtPm1jayk7Ci0JbWNpX3dyaXRlbChob3N0LCBJRFIsIH4wVUwpOwotCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9NQ0lESVMpOwotCW1jaV9yZWFkbChob3N0LCBTUik7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lEUiwgfjBVTCk7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NSLCBBVE1DSV9DUl9NQ0lESVMpOworCWF0bWNpX3JlYWRsKGhvc3QsIEFUTUNJX1NSKTsKIAljbGtfZGlzYWJsZShob3N0LT5tY2spOwogCiAjaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKQEAgLTE4ODUsNyArMjE3OCw3IEBACiAJc3RydWN0IGF0bWVsX21jaSAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBpOwogCi0JIGZvciAoaSA9IDA7IGkgPCBBVE1FTF9NQ0lfTUFYX05SX1NMT1RTOyBpKyspIHsKKwkgZm9yIChpID0gMDsgaSA8IEFUTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CiAJCXN0cnVjdCBhdG1lbF9tY2lfc2xvdCAqc2xvdCA9IGhvc3QtPnNsb3RbaV07CiAJCWludCByZXQ7CiAKQEAgLTE5MTYsNyArMjIwOSw3IEBACiAJaW50IGk7CiAJaW50IHJldCA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFUTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CiAJCXN0cnVjdCBhdG1lbF9tY2lfc2xvdCAqc2xvdCA9IGhvc3QtPnNsb3RbaV07CiAJCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9hdTF4bW1jLmMKaW5kZXggZWY3MmU4Ny4uNWQzYjlhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9hdTF4bW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9hdTF4bW1jLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIERCRyhmbXQsIGlkeCwgYXJncy4uLikJXAotCXByaW50ayhLRVJOX0RFQlVHICJhdTF4bW1jKCVkKTogREVCVUc6ICIgZm10LCBpZHgsICMjYXJncykKKwlwcl9kZWJ1ZygiYXUxeG1tYyglZCk6IERFQlVHOiAiIGZtdCwgaWR4LCAjI2FyZ3MpCiAjZWxzZQogI2RlZmluZSBEQkcoZm10LCBpZHgsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCkBAIC02NCwxMSArNjQsOCBAQAogI2RlZmluZSBBVTFYTU1DX0RFU0NSSVBUT1JfQ09VTlQgMQogCiAvKiBtYXggRE1BIHNlZyBzaXplOiA2NEtCIG9uIEF1MTEwMCwgNE1CIG9uIEF1MTIwMCAqLwotI2lmZGVmIENPTkZJR19TT0NfQVUxMTAwCi0jZGVmaW5lIEFVMVhNTUNfREVTQ1JJUFRPUl9TSVpFIDB4MDAwMGZmZmYKLSNlbHNlCS8qIEF1MTIwMCAqLwotI2RlZmluZSBBVTFYTU1DX0RFU0NSSVBUT1JfU0laRSAweDAwM2ZmZmZmCi0jZW5kaWYKKyNkZWZpbmUgQVUxMTAwX01NQ19ERVNDUklQVE9SX1NJWkUgMHgwMDAwZmZmZgorI2RlZmluZSBBVTEyMDBfTU1DX0RFU0NSSVBUT1JfU0laRSAweDAwM2ZmZmZmCiAKICNkZWZpbmUgQVUxWE1NQ19PQ1IgKE1NQ19WRERfMjdfMjggfCBNTUNfVkREXzI4XzI5IHwgTU1DX1ZERF8yOV8zMCB8IFwKIAkJICAgICBNTUNfVkREXzMwXzMxIHwgTU1DX1ZERF8zMV8zMiB8IE1NQ19WRERfMzJfMzMgfCBcCkBAIC0xMjcsNiArMTI0LDcgQEAKICNkZWZpbmUgSE9TVF9GX1hNSVQJMHgwMDAxCiAjZGVmaW5lIEhPU1RfRl9SRUNWCTB4MDAwMgogI2RlZmluZSBIT1NUX0ZfRE1BCTB4MDAxMAorI2RlZmluZSBIT1NUX0ZfREJETUEJMHgwMDIwCiAjZGVmaW5lIEhPU1RfRl9BQ1RJVkUJMHgwMTAwCiAjZGVmaW5lIEhPU1RfRl9TVE9QCTB4MTAwMAogCkBAIC0xNTEsNiArMTQ5LDE2IEBACiAjZGVmaW5lIERNQV9DSEFOTkVMKGgpCVwKIAkoKChoKS0+ZmxhZ3MgJiBIT1NUX0ZfWE1JVCkgPyAoaCktPnR4X2NoYW4gOiAoaCktPnJ4X2NoYW4pCiAKK3N0YXRpYyBpbmxpbmUgaW50IGhhc19kYmRtYSh2b2lkKQoreworCXN3aXRjaCAoYWxjaGVteV9nZXRfY3B1dHlwZSgpKSB7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTEyMDA6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKwogc3RhdGljIGlubGluZSB2b2lkIElSUV9PTihzdHJ1Y3QgYXUxeG1tY19ob3N0ICpob3N0LCB1MzIgbWFzaykKIHsKIAl1MzIgdmFsID0gYXVfcmVhZGwoSE9TVF9DT05GSUcoaG9zdCkpOwpAQCAtMjY4LDcgKzI3Niw3IEBACiAJCW1tY2NtZCB8PSBTRF9DTURfUlRfMzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYXUxeG1tYzogdW5oYW5kbGVkIHJlc3BvbnNlIHR5cGUgJTAyeFxuIiwKKwkJcHJfaW5mbygiYXUxeG1tYzogdW5oYW5kbGVkIHJlc3BvbnNlIHR5cGUgJTAyeFxuIiwKIAkJCW1tY19yZXNwX3R5cGUoY21kKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTM1MywxNCArMzYxLDEyIEBACiAJZGF0YS0+Ynl0ZXNfeGZlcmVkID0gMDsKIAogCWlmICghZGF0YS0+ZXJyb3IpIHsKLQkJaWYgKGhvc3QtPmZsYWdzICYgSE9TVF9GX0RNQSkgewotI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCS8qIERCRE1BICovCisJCWlmIChob3N0LT5mbGFncyAmIChIT1NUX0ZfRE1BIHwgSE9TVF9GX0RCRE1BKSkgewogCQkJdTMyIGNoYW4gPSBETUFfQ0hBTk5FTChob3N0KTsKIAogCQkJY2hhbl90YWJfdCAqYyA9ICooKGNoYW5fdGFiX3QgKiopY2hhbik7CiAJCQlhdTF4X2RtYV9jaGFuX3QgKmNwID0gYy0+Y2hhbl9wdHI7CiAJCQlkYXRhLT5ieXRlc194ZmVyZWQgPSBjcC0+ZGRtYV9ieXRlY250OwotI2VuZGlmCiAJCX0gZWxzZQogCQkJZGF0YS0+Ynl0ZXNfeGZlcmVkID0KIAkJCQkoZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3opIC0gaG9zdC0+cGlvLmxlbjsKQEAgLTU3MCwxMSArNTc2LDEwIEBACiAKIAlob3N0LT5zdGF0dXMgPSBIT1NUX1NfREFUQTsKIAotCWlmIChob3N0LT5mbGFncyAmIEhPU1RfRl9ETUEpIHsKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAkvKiBEQkRNQSAqLworCWlmICgoaG9zdC0+ZmxhZ3MgJiAoSE9TVF9GX0RNQSB8IEhPU1RfRl9EQkRNQSkpKSB7CiAJCXUzMiBjaGFubmVsID0gRE1BX0NIQU5ORUwoaG9zdCk7CiAKLQkJLyogU3RhcnQgdGhlIERNQSBhcyBzb29uIGFzIHRoZSBidWZmZXIgZ2V0cyBzb21ldGhpbmcgaW4gaXQgKi8KKwkJLyogU3RhcnQgdGhlIERCRE1BIGFzIHNvb24gYXMgdGhlIGJ1ZmZlciBnZXRzIHNvbWV0aGluZyBpbiBpdCAqLwogCiAJCWlmIChob3N0LT5mbGFncyAmIEhPU1RfRl9SRUNWKSB7CiAJCQl1MzIgbWFzayA9IFNEX1NUQVRVU19EQiB8IFNEX1NUQVRVU19ORTsKQEAgLTU4NCw3ICs1ODksNiBAQAogCQl9CiAKIAkJYXUxeHh4X2RiZG1hX3N0YXJ0KGNoYW5uZWwpOwotI2VuZGlmCiAJfQogfQogCkBAIC02MzMsOCArNjM3LDcgQEAKIAogCWF1X3dyaXRlbChkYXRhLT5ibGtzeiAtIDEsIEhPU1RfQkxLU0laRShob3N0KSk7CiAKLQlpZiAoaG9zdC0+ZmxhZ3MgJiBIT1NUX0ZfRE1BKSB7Ci0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAJLyogREJETUEgKi8KKwlpZiAoaG9zdC0+ZmxhZ3MgJiAoSE9TVF9GX0RNQSB8IEhPU1RfRl9EQkRNQSkpIHsKIAkJaW50IGk7CiAJCXUzMiBjaGFubmVsID0gRE1BX0NIQU5ORUwoaG9zdCk7CiAKQEAgLTY2Myw3ICs2NjYsNiBAQAogCiAJCQlkYXRhbGVuIC09IGxlbjsKIAkJfQotI2VuZGlmCiAJfSBlbHNlIHsKIAkJaG9zdC0+cGlvLmluZGV4ID0gMDsKIAkJaG9zdC0+cGlvLm9mZnNldCA9IDA7CkBAIC04MzgsNyArODQwLDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAogLyogOGJpdCBtZW1vcnkgRE1BIGRldmljZSAqLwogc3RhdGljIGRiZGV2X3RhYl90IGF1MXhtbWNfbWVtX2RiZGV2ID0gewogCS5kZXZfaWQJCT0gRFNDUl9DTUQwX0FMV0FZUywKQEAgLTkwNSw3ICs5MDYsNyBAQAogCWF1MXh4eF9kYmRtYV9yaW5nX2FsbG9jKGhvc3QtPnJ4X2NoYW4sIEFVMVhNTUNfREVTQ1JJUFRPUl9DT1VOVCk7CiAKIAkvKiBEQkRNQSBpcyBnb29kIHRvIGdvICovCi0JaG9zdC0+ZmxhZ3MgfD0gSE9TVF9GX0RNQTsKKwlob3N0LT5mbGFncyB8PSBIT1NUX0ZfRE1BIHwgSE9TVF9GX0RCRE1BOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MTgsNyArOTE5LDYgQEAKIAkJYXUxeHh4X2RiZG1hX2NoYW5fZnJlZShob3N0LT5yeF9jaGFuKTsKIAl9CiB9Ci0jZW5kaWYKIAogc3RhdGljIHZvaWQgYXUxeG1tY19lbmFibGVfc2Rpb19pcnEoc3RydWN0IG1tY19ob3N0ICptbWMsIGludCBlbikKIHsKQEAgLTk5Nyw4ICs5OTcsMTYgQEAKIAltbWMtPmZfbWluID0gICA0NTAwMDA7CiAJbW1jLT5mX21heCA9IDI0MDAwMDAwOwogCi0JbW1jLT5tYXhfc2VnX3NpemUgPSBBVTFYTU1DX0RFU0NSSVBUT1JfU0laRTsKLQltbWMtPm1heF9zZWdzID0gQVUxWE1NQ19ERVNDUklQVE9SX0NPVU5UOworCXN3aXRjaCAoYWxjaGVteV9nZXRfY3B1dHlwZSgpKSB7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTExMDA6CisJCW1tYy0+bWF4X3NlZ19zaXplID0gQVUxMTAwX01NQ19ERVNDUklQVE9SX1NJWkU7CisJCW1tYy0+bWF4X3NlZ3MgPSBBVTFYTU1DX0RFU0NSSVBUT1JfQ09VTlQ7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgorCQltbWMtPm1heF9zZWdfc2l6ZSA9IEFVMTIwMF9NTUNfREVTQ1JJUFRPUl9TSVpFOworCQltbWMtPm1heF9zZWdzID0gQVUxWE1NQ19ERVNDUklQVE9SX0NPVU5UOworCQlicmVhazsKKwl9CiAKIAltbWMtPm1heF9ibGtfc2l6ZSA9IDIwNDg7CiAJbW1jLT5tYXhfYmxrX2NvdW50ID0gNTEyOwpAQCAtMTAyOCwxMSArMTAzNiwxMSBAQAogCXRhc2tsZXRfaW5pdCgmaG9zdC0+ZmluaXNoX3Rhc2ssIGF1MXhtbWNfdGFza2xldF9maW5pc2gsCiAJCQkodW5zaWduZWQgbG9uZylob3N0KTsKIAotI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCi0JcmV0ID0gYXUxeG1tY19kYmRtYV9pbml0KGhvc3QpOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogREJETUEgaW5pdCBmYWlsZWQ7IHVzaW5nIFBJT1xuIik7Ci0jZW5kaWYKKwlpZiAoaGFzX2RiZG1hKCkpIHsKKwkJcmV0ID0gYXUxeG1tY19kYmRtYV9pbml0KGhvc3QpOworCQlpZiAocmV0KQorCQkJcHJfaW5mbyhEUklWRVJfTkFNRSAiOiBEQkRNQSBpbml0IGZhaWxlZDsgdXNpbmcgUElPXG4iKTsKKwl9CiAKICNpZmRlZiBDT05GSUdfTEVEU19DTEFTUwogCWlmIChob3N0LT5wbGF0ZGF0YSAmJiBob3N0LT5wbGF0ZGF0YS0+bGVkKSB7CkBAIC0xMDU2LDcgKzEwNjQsNyBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CiAKLQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IE1NQyBDb250cm9sbGVyICVkIHNldCB1cCBhdCAlOC44WCIKKwlwcl9pbmZvKERSSVZFUl9OQU1FICI6IE1NQyBDb250cm9sbGVyICVkIHNldCB1cCBhdCAlOC44WCIKIAkJIiAobW9kZT0lcylcbiIsIHBkZXYtPmlkLCBob3N0LT5pb2Jhc2UsCiAJCWhvc3QtPmZsYWdzICYgSE9TVF9GX0RNQSA/ICJkbWEiIDogInBpbyIpOwogCkBAIC0xMDczLDkgKzEwODEsOCBAQAogCWF1X3dyaXRlbCgwLCBIT1NUX0NPTkZJRzIoaG9zdCkpOwogCWF1X3N5bmMoKTsKIAotI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCi0JYXUxeG1tY19kYmRtYV9zaHV0ZG93bihob3N0KTsKLSNlbmRpZgorCWlmIChob3N0LT5mbGFncyAmIEhPU1RfRl9EQkRNQSkKKwkJYXUxeG1tY19kYmRtYV9zaHV0ZG93bihob3N0KTsKIAogCXRhc2tsZXRfa2lsbCgmaG9zdC0+ZGF0YV90YXNrKTsKIAl0YXNrbGV0X2tpbGwoJmhvc3QtPmZpbmlzaF90YXNrKTsKQEAgLTExMjAsOSArMTEyNyw5IEBACiAJCXRhc2tsZXRfa2lsbCgmaG9zdC0+ZGF0YV90YXNrKTsKIAkJdGFza2xldF9raWxsKCZob3N0LT5maW5pc2hfdGFzayk7CiAKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotCQlhdTF4bW1jX2RiZG1hX3NodXRkb3duKGhvc3QpOwotI2VuZGlmCisJCWlmIChob3N0LT5mbGFncyAmIEhPU1RfRl9EQkRNQSkKKwkJCWF1MXhtbWNfZGJkbWFfc2h1dGRvd24oaG9zdCk7CisKIAkJYXUxeG1tY19zZXRfcG93ZXIoaG9zdCwgMCk7CiAKIAkJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKQEAgLTExODEsMjQgKzExODgsMjMgQEAKIAogc3RhdGljIGludCBfX2luaXQgYXUxeG1tY19pbml0KHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLQkvKiBEU0NSX0NNRDBfQUxXQVlTIGhhcyBhIHN0cmlkZSBvZiAzMiBiaXRzLCB3ZSBuZWVkIGEgc3RyaWRlCi0JICogb2YgOCBiaXRzLiAgQW5kIHNpbmNlIGRldmljZXMgYXJlIHNoYXJlZCwgd2UgbmVlZCB0byBjcmVhdGUKLQkgKiBvdXIgb3duIHRvIGF2b2lkIGZyZWFraW5nIG91dCBvdGhlciBkZXZpY2VzLgotCSAqLwotCW1lbWlkID0gYXUxeHh4X2RkbWFfYWRkX2RldmljZSgmYXUxeG1tY19tZW1fZGJkZXYpOwotCWlmICghbWVtaWQpCi0JCXByaW50ayhLRVJOX0VSUiAiYXUxeG1tYzogY2Fubm90IGFkZCBtZW1vcnkgZGJkbWEgZGV2XG4iKTsKLSNlbmRpZgorCWlmIChoYXNfZGJkbWEoKSkgeworCQkvKiBEU0NSX0NNRDBfQUxXQVlTIGhhcyBhIHN0cmlkZSBvZiAzMiBiaXRzLCB3ZSBuZWVkIGEgc3RyaWRlCisJCSogb2YgOCBiaXRzLiAgQW5kIHNpbmNlIGRldmljZXMgYXJlIHNoYXJlZCwgd2UgbmVlZCB0byBjcmVhdGUKKwkJKiBvdXIgb3duIHRvIGF2b2lkIGZyZWFraW5nIG91dCBvdGhlciBkZXZpY2VzLgorCQkqLworCQltZW1pZCA9IGF1MXh4eF9kZG1hX2FkZF9kZXZpY2UoJmF1MXhtbWNfbWVtX2RiZGV2KTsKKwkJaWYgKCFtZW1pZCkKKwkJCXByX2VycigiYXUxeG1tYzogY2Fubm90IGFkZCBtZW1vcnkgZGJkbWFcbiIpOworCX0KIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdTF4bW1jX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhdTF4bW1jX2V4aXQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotCWlmIChtZW1pZCkKKwlpZiAoaGFzX2RiZG1hKCkgJiYgbWVtaWQpCiAJCWF1MXh4eF9kZG1hX2RlbF9kZXZpY2UobWVtaWQpOwotI2VuZGlmCisKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXUxeG1tY19kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMKaW5kZXggMDA3NmM3NC4uNjRhODMyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kYXZpbmNpX21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZGF2aW5jaV9tbWMuYwpAQCAtODA3LDEyICs4MDcsMjUgQEAKIHN0YXRpYyB2b2lkIG1tY19kYXZpbmNpX3NldF9pb3Moc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfaW9zICppb3MpCiB7CiAJc3RydWN0IG1tY19kYXZpbmNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UobW1jLT5wYXJlbnQpOworCXN0cnVjdCBkYXZpbmNpX21tY19jb25maWcgKmNvbmZpZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksCiAJCSJjbG9jayAlZEh6IGJ1c21vZGUgJWQgcG93ZXJtb2RlICVkIFZkZCAlMDR4XG4iLAogCQlpb3MtPmNsb2NrLCBpb3MtPmJ1c19tb2RlLCBpb3MtPnBvd2VyX21vZGUsCiAJCWlvcy0+dmRkKTsKIAorCXN3aXRjaCAoaW9zLT5wb3dlcl9tb2RlKSB7CisJY2FzZSBNTUNfUE9XRVJfT0ZGOgorCQlpZiAoY29uZmlnICYmIGNvbmZpZy0+c2V0X3Bvd2VyKQorCQkJY29uZmlnLT5zZXRfcG93ZXIocGRldi0+aWQsIGZhbHNlKTsKKwkJYnJlYWs7CisJY2FzZSBNTUNfUE9XRVJfVVA6CisJCWlmIChjb25maWcgJiYgY29uZmlnLT5zZXRfcG93ZXIpCisJCQljb25maWctPnNldF9wb3dlcihwZGV2LT5pZCwgdHJ1ZSk7CisJCWJyZWFrOworCX0KKwogCXN3aXRjaCAoaW9zLT5idXNfd2lkdGgpIHsKIAljYXNlIE1NQ19CVVNfV0lEVEhfODoKIAkJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJFbmFibGluZyA4IGJpdCBtb2RlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCmluZGV4IGZmMGY3MTQuLjNhYWViMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwpAQCAtNzY0LDExICs3NjQsMjkgQEAKIAlyZXR1cm4gcHJlc2VudDsKIH0KIAorc3RhdGljIHZvaWQgZHdfbWNpX2VuYWJsZV9zZGlvX2lycShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgaW50IGVuYikKK3sKKwlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBkd19tY2kgKmhvc3QgPSBzbG90LT5ob3N0OworCXUzMiBpbnRfbWFzazsKKworCS8qIEVuYWJsZS9kaXNhYmxlIFNsb3QgU3BlY2lmaWMgU0RJTyBpbnRlcnJ1cHQgKi8KKwlpbnRfbWFzayA9IG1jaV9yZWFkbChob3N0LCBJTlRNQVNLKTsKKwlpZiAoZW5iKSB7CisJCW1jaV93cml0ZWwoaG9zdCwgSU5UTUFTSywKKwkJCSAgIChpbnRfbWFzayB8ICgxIDw8IFNETU1DX0lOVF9TRElPKHNsb3QtPmlkKSkpKTsKKwl9IGVsc2UgeworCQltY2lfd3JpdGVsKGhvc3QsIElOVE1BU0ssCisJCQkgICAoaW50X21hc2sgJiB+KDEgPDwgU0RNTUNfSU5UX1NESU8oc2xvdC0+aWQpKSkpOworCX0KK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgZHdfbWNpX29wcyA9IHsKLQkucmVxdWVzdAk9IGR3X21jaV9yZXF1ZXN0LAotCS5zZXRfaW9zCT0gZHdfbWNpX3NldF9pb3MsCi0JLmdldF9ybwkJPSBkd19tY2lfZ2V0X3JvLAotCS5nZXRfY2QJCT0gZHdfbWNpX2dldF9jZCwKKwkucmVxdWVzdAkJPSBkd19tY2lfcmVxdWVzdCwKKwkuc2V0X2lvcwkJPSBkd19tY2lfc2V0X2lvcywKKwkuZ2V0X3JvCQkJPSBkd19tY2lfZ2V0X3JvLAorCS5nZXRfY2QJCQk9IGR3X21jaV9nZXRfY2QsCisJLmVuYWJsZV9zZGlvX2lycQk9IGR3X21jaV9lbmFibGVfc2Rpb19pcnEsCiB9OwogCiBzdGF0aWMgdm9pZCBkd19tY2lfcmVxdWVzdF9lbmQoc3RydWN0IGR3X21jaSAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCkBAIC0xMDI1LDcgKzEwNDMsOCBAQAogCQlidWYgKz0gbGVuOwogCQljbnQgLT0gbGVuOwogCQlpZiAoIXNnX25leHQoaG9zdC0+c2cpIHx8IGhvc3QtPnBhcnRfYnVmX2NvdW50ID09IDIpIHsKLQkJCW1jaV93cml0ZXcoaG9zdCwgREFUQSwgaG9zdC0+cGFydF9idWYxNik7CisJCQltY2lfd3JpdGV3KGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpLAorCQkJCQlob3N0LT5wYXJ0X2J1ZjE2KTsKIAkJCWhvc3QtPnBhcnRfYnVmX2NvdW50ID0gMDsKIAkJfQogCX0KQEAgLTEwNDIsMjEgKzEwNjEsMjMgQEAKIAkJCWNudCAtPSBsZW47CiAJCQkvKiBwdXNoIGRhdGEgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIGZpZm8gKi8KIAkJCWZvciAoaSA9IDA7IGkgPCBpdGVtczsgKytpKQotCQkJCW1jaV93cml0ZXcoaG9zdCwgREFUQSwgYWxpZ25lZF9idWZbaV0pOworCQkJCW1jaV93cml0ZXcoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksCisJCQkJCQlhbGlnbmVkX2J1ZltpXSk7CiAJCX0KIAl9IGVsc2UKICNlbmRpZgogCXsKIAkJdTE2ICpwZGF0YSA9IGJ1ZjsKIAkJZm9yICg7IGNudCA+PSAyOyBjbnQgLT0gMikKLQkJCW1jaV93cml0ZXcoaG9zdCwgREFUQSwgKnBkYXRhKyspOworCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwgKnBkYXRhKyspOwogCQlidWYgPSBwZGF0YTsKIAl9CiAJLyogcHV0IGFueXRoaW5nIHJlbWFpbmluZyBpbiB0aGUgcGFydF9idWYgKi8KIAlpZiAoY250KSB7CiAJCWR3X21jaV9zZXRfcGFydF9ieXRlcyhob3N0LCBidWYsIGNudCk7CiAJCWlmICghc2dfbmV4dChob3N0LT5zZykpCi0JCQltY2lfd3JpdGV3KGhvc3QsIERBVEEsIGhvc3QtPnBhcnRfYnVmMTYpOworCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKKwkJCQkJaG9zdC0+cGFydF9idWYxNik7CiAJfQogfQogCkBAIC0xMDcxLDcgKzEwOTIsOCBAQAogCQkJaW50IGl0ZW1zID0gbGVuID4+IDE7CiAJCQlpbnQgaTsKIAkJCWZvciAoaSA9IDA7IGkgPCBpdGVtczsgKytpKQotCQkJCWFsaWduZWRfYnVmW2ldID0gbWNpX3JlYWR3KGhvc3QsIERBVEEpOworCQkJCWFsaWduZWRfYnVmW2ldID0gbWNpX3JlYWR3KGhvc3QsCisJCQkJCQlEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CiAJCQkvKiBtZW1jcHkgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIG91dHB1dCBidWZmZXIgKi8KIAkJCW1lbWNweShidWYsIGFsaWduZWRfYnVmLCBsZW4pOwogCQkJYnVmICs9IGxlbjsKQEAgLTEwODIsMTEgKzExMDQsMTEgQEAKIAl7CiAJCXUxNiAqcGRhdGEgPSBidWY7CiAJCWZvciAoOyBjbnQgPj0gMjsgY250IC09IDIpCi0JCQkqcGRhdGErKyA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKTsKKwkJCSpwZGF0YSsrID0gbWNpX3JlYWR3KGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpKTsKIAkJYnVmID0gcGRhdGE7CiAJfQogCWlmIChjbnQpIHsKLQkJaG9zdC0+cGFydF9idWYxNiA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKTsKKwkJaG9zdC0+cGFydF9idWYxNiA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CiAJCWR3X21jaV9wdWxsX2ZpbmFsX2J5dGVzKGhvc3QsIGJ1ZiwgY250KTsKIAl9CiB9CkBAIC0xMDk5LDcgKzExMjEsOCBAQAogCQlidWYgKz0gbGVuOwogCQljbnQgLT0gbGVuOwogCQlpZiAoIXNnX25leHQoaG9zdC0+c2cpIHx8IGhvc3QtPnBhcnRfYnVmX2NvdW50ID09IDQpIHsKLQkJCW1jaV93cml0ZWwoaG9zdCwgREFUQSwgaG9zdC0+cGFydF9idWYzMik7CisJCQltY2lfd3JpdGVsKGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpLAorCQkJCQlob3N0LT5wYXJ0X2J1ZjMyKTsKIAkJCWhvc3QtPnBhcnRfYnVmX2NvdW50ID0gMDsKIAkJfQogCX0KQEAgLTExMTYsMjEgKzExMzksMjMgQEAKIAkJCWNudCAtPSBsZW47CiAJCQkvKiBwdXNoIGRhdGEgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIGZpZm8gKi8KIAkJCWZvciAoaSA9IDA7IGkgPCBpdGVtczsgKytpKQotCQkJCW1jaV93cml0ZWwoaG9zdCwgREFUQSwgYWxpZ25lZF9idWZbaV0pOworCQkJCW1jaV93cml0ZWwoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksCisJCQkJCQlhbGlnbmVkX2J1ZltpXSk7CiAJCX0KIAl9IGVsc2UKICNlbmRpZgogCXsKIAkJdTMyICpwZGF0YSA9IGJ1ZjsKIAkJZm9yICg7IGNudCA+PSA0OyBjbnQgLT0gNCkKLQkJCW1jaV93cml0ZWwoaG9zdCwgREFUQSwgKnBkYXRhKyspOworCQkJbWNpX3dyaXRlbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwgKnBkYXRhKyspOwogCQlidWYgPSBwZGF0YTsKIAl9CiAJLyogcHV0IGFueXRoaW5nIHJlbWFpbmluZyBpbiB0aGUgcGFydF9idWYgKi8KIAlpZiAoY250KSB7CiAJCWR3X21jaV9zZXRfcGFydF9ieXRlcyhob3N0LCBidWYsIGNudCk7CiAJCWlmICghc2dfbmV4dChob3N0LT5zZykpCi0JCQltY2lfd3JpdGVsKGhvc3QsIERBVEEsIGhvc3QtPnBhcnRfYnVmMzIpOworCQkJbWNpX3dyaXRlbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKKwkJCQkJCWhvc3QtPnBhcnRfYnVmMzIpOwogCX0KIH0KIApAQCAtMTE0NSw3ICsxMTcwLDggQEAKIAkJCWludCBpdGVtcyA9IGxlbiA+PiAyOwogCQkJaW50IGk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7ICsraSkKLQkJCQlhbGlnbmVkX2J1ZltpXSA9IG1jaV9yZWFkbChob3N0LCBEQVRBKTsKKwkJCQlhbGlnbmVkX2J1ZltpXSA9IG1jaV9yZWFkbChob3N0LAorCQkJCQkJREFUQShob3N0LT5kYXRhX29mZnNldCkpOwogCQkJLyogbWVtY3B5IGZyb20gYWxpZ25lZCBidWZmZXIgaW50byBvdXRwdXQgYnVmZmVyICovCiAJCQltZW1jcHkoYnVmLCBhbGlnbmVkX2J1ZiwgbGVuKTsKIAkJCWJ1ZiArPSBsZW47CkBAIC0xMTU2LDExICsxMTgyLDExIEBACiAJewogCQl1MzIgKnBkYXRhID0gYnVmOwogCQlmb3IgKDsgY250ID49IDQ7IGNudCAtPSA0KQotCQkJKnBkYXRhKysgPSBtY2lfcmVhZGwoaG9zdCwgREFUQSk7CisJCQkqcGRhdGErKyA9IG1jaV9yZWFkbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CiAJCWJ1ZiA9IHBkYXRhOwogCX0KIAlpZiAoY250KSB7Ci0JCWhvc3QtPnBhcnRfYnVmMzIgPSBtY2lfcmVhZGwoaG9zdCwgREFUQSk7CisJCWhvc3QtPnBhcnRfYnVmMzIgPSBtY2lfcmVhZGwoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCkpOwogCQlkd19tY2lfcHVsbF9maW5hbF9ieXRlcyhob3N0LCBidWYsIGNudCk7CiAJfQogfQpAQCAtMTE3Myw3ICsxMTk5LDggQEAKIAkJYnVmICs9IGxlbjsKIAkJY250IC09IGxlbjsKIAkJaWYgKCFzZ19uZXh0KGhvc3QtPnNnKSB8fCBob3N0LT5wYXJ0X2J1Zl9jb3VudCA9PSA4KSB7Ci0JCQltY2lfd3JpdGV3KGhvc3QsIERBVEEsIGhvc3QtPnBhcnRfYnVmKTsKKwkJCW1jaV93cml0ZXcoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksCisJCQkJCWhvc3QtPnBhcnRfYnVmKTsKIAkJCWhvc3QtPnBhcnRfYnVmX2NvdW50ID0gMDsKIAkJfQogCX0KQEAgLTExOTAsMjEgKzEyMTcsMjMgQEAKIAkJCWNudCAtPSBsZW47CiAJCQkvKiBwdXNoIGRhdGEgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIGZpZm8gKi8KIAkJCWZvciAoaSA9IDA7IGkgPCBpdGVtczsgKytpKQotCQkJCW1jaV93cml0ZXEoaG9zdCwgREFUQSwgYWxpZ25lZF9idWZbaV0pOworCQkJCW1jaV93cml0ZXEoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksCisJCQkJCQlhbGlnbmVkX2J1ZltpXSk7CiAJCX0KIAl9IGVsc2UKICNlbmRpZgogCXsKIAkJdTY0ICpwZGF0YSA9IGJ1ZjsKIAkJZm9yICg7IGNudCA+PSA4OyBjbnQgLT0gOCkKLQkJCW1jaV93cml0ZXEoaG9zdCwgREFUQSwgKnBkYXRhKyspOworCQkJbWNpX3dyaXRlcShob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwgKnBkYXRhKyspOwogCQlidWYgPSBwZGF0YTsKIAl9CiAJLyogcHV0IGFueXRoaW5nIHJlbWFpbmluZyBpbiB0aGUgcGFydF9idWYgKi8KIAlpZiAoY250KSB7CiAJCWR3X21jaV9zZXRfcGFydF9ieXRlcyhob3N0LCBidWYsIGNudCk7CiAJCWlmICghc2dfbmV4dChob3N0LT5zZykpCi0JCQltY2lfd3JpdGVxKGhvc3QsIERBVEEsIGhvc3QtPnBhcnRfYnVmKTsKKwkJCW1jaV93cml0ZXEoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksCisJCQkJCWhvc3QtPnBhcnRfYnVmKTsKIAl9CiB9CiAKQEAgLTEyMTksNyArMTI0OCw4IEBACiAJCQlpbnQgaXRlbXMgPSBsZW4gPj4gMzsKIAkJCWludCBpOwogCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zOyArK2kpCi0JCQkJYWxpZ25lZF9idWZbaV0gPSBtY2lfcmVhZHEoaG9zdCwgREFUQSk7CisJCQkJYWxpZ25lZF9idWZbaV0gPSBtY2lfcmVhZHEoaG9zdCwKKwkJCQkJCURBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpKTsKIAkJCS8qIG1lbWNweSBmcm9tIGFsaWduZWQgYnVmZmVyIGludG8gb3V0cHV0IGJ1ZmZlciAqLwogCQkJbWVtY3B5KGJ1ZiwgYWxpZ25lZF9idWYsIGxlbik7CiAJCQlidWYgKz0gbGVuOwpAQCAtMTIzMCwxMSArMTI2MCwxMSBAQAogCXsKIAkJdTY0ICpwZGF0YSA9IGJ1ZjsKIAkJZm9yICg7IGNudCA+PSA4OyBjbnQgLT0gOCkKLQkJCSpwZGF0YSsrID0gbWNpX3JlYWRxKGhvc3QsIERBVEEpOworCQkJKnBkYXRhKysgPSBtY2lfcmVhZHEoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCkpOwogCQlidWYgPSBwZGF0YTsKIAl9CiAJaWYgKGNudCkgewotCQlob3N0LT5wYXJ0X2J1ZiA9IG1jaV9yZWFkcShob3N0LCBEQVRBKTsKKwkJaG9zdC0+cGFydF9idWYgPSBtY2lfcmVhZHEoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCkpOwogCQlkd19tY2lfcHVsbF9maW5hbF9ieXRlcyhob3N0LCBidWYsIGNudCk7CiAJfQogfQpAQCAtMTQwNiw2ICsxNDM2LDcgQEAKIAlzdHJ1Y3QgZHdfbWNpICpob3N0ID0gZGV2X2lkOwogCXUzMiBzdGF0dXMsIHBlbmRpbmc7CiAJdW5zaWduZWQgaW50IHBhc3NfY291bnQgPSAwOworCWludCBpOwogCiAJZG8gewogCQlzdGF0dXMgPSBtY2lfcmVhZGwoaG9zdCwgUklOVFNUUyk7CkBAIC0xNDc3LDYgKzE1MDgsMTUgQEAKIAkJCXF1ZXVlX3dvcmsoZHdfbWNpX2NhcmRfd29ya3F1ZXVlLCAmaG9zdC0+Y2FyZF93b3JrKTsKIAkJfQogCisJCS8qIEhhbmRsZSBTRElPIEludGVycnVwdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGhvc3QtPm51bV9zbG90czsgaSsrKSB7CisJCQlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOworCQkJaWYgKHBlbmRpbmcgJiBTRE1NQ19JTlRfU0RJTyhpKSkgeworCQkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX1NESU8oaSkpOworCQkJCW1tY19zaWduYWxfc2Rpb19pcnEoc2xvdC0+bW1jKTsKKwkJCX0KKwkJfQorCiAJfSB3aGlsZSAocGFzc19jb3VudCsrIDwgNSk7CiAKICNpZmRlZiBDT05GSUdfTU1DX0RXX0lETUFDCkBAIC0xNjczLDcgKzE3MTMsNyBAQAogCiAJaG9zdC0+dm1tYyA9IHJlZ3VsYXRvcl9nZXQobW1jX2RldihtbWMpLCAidm1tYyIpOwogCWlmIChJU19FUlIoaG9zdC0+dm1tYykpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHZtbWMgcmVndWxhdG9yIGZvdW5kXG4iLCBtbWNfaG9zdG5hbWUobW1jKSk7CisJCXByX2luZm8oIiVzOiBubyB2bW1jIHJlZ3VsYXRvciBmb3VuZFxuIiwgbW1jX2hvc3RuYW1lKG1tYykpOwogCQlob3N0LT52bW1jID0gTlVMTDsKIAl9IGVsc2UKIAkJcmVndWxhdG9yX2VuYWJsZShob3N0LT52bW1jKTsKQEAgLTE5MjQsNiArMTk2NCwxOCBAQAogCX0KIAogCS8qCisJICogSW4gMi40MGEgc3BlYywgRGF0YSBvZmZzZXQgaXMgY2hhbmdlZC4KKwkgKiBOZWVkIHRvIGNoZWNrIHRoZSB2ZXJzaW9uLWlkIGFuZCBzZXQgZGF0YS1vZmZzZXQgZm9yIERBVEEgcmVnaXN0ZXIuCisJICovCisJaG9zdC0+dmVyaWQgPSBTRE1NQ19HRVRfVkVSSUQobWNpX3JlYWRsKGhvc3QsIFZFUklEKSk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlZlcnNpb24gSUQgaXMgJTA0eFxuIiwgaG9zdC0+dmVyaWQpOworCisJaWYgKGhvc3QtPnZlcmlkIDwgRFdfTU1DXzI0MEEpCisJCWhvc3QtPmRhdGFfb2Zmc2V0ID0gREFUQV9PRkZTRVQ7CisJZWxzZQorCQlob3N0LT5kYXRhX29mZnNldCA9IERBVEFfMjQwQV9PRkZTRVQ7CisKKwkvKgogCSAqIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBjb21tYW5kIGRvbmUsIGRhdGEgb3ZlciwgZGF0YSBlbXB0eSwgY2FyZCBkZXQsCiAJICogcmVjZWl2ZSByZWFkeSBhbmQgZXJyb3Igc3VjaCBhcyB0cmFuc21pdCwgcmVjZWl2ZSB0aW1lb3V0LCBjcmMgZXJyb3IKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmggYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCmluZGV4IDAyN2QzNzcuLjcyYzA3MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuaApAQCAtMTQsNiArMTQsOCBAQAogI2lmbmRlZiBfRFdfTU1DX0hfCiAjZGVmaW5lIF9EV19NTUNfSF8KIAorI2RlZmluZSBEV19NTUNfMjQwQQkJMHgyNDBhCisKICNkZWZpbmUgU0RNTUNfQ1RSTAkJMHgwMDAKICNkZWZpbmUgU0RNTUNfUFdSRU4JCTB4MDA0CiAjZGVmaW5lIFNETU1DX0NMS0RJVgkJMHgwMDgKQEAgLTUxLDcgKzUzLDE0IEBACiAjZGVmaW5lIFNETU1DX0lESU5URU4JCTB4MDkwCiAjZGVmaW5lIFNETU1DX0RTQ0FERFIJCTB4MDk0CiAjZGVmaW5lIFNETU1DX0JVRkFERFIJCTB4MDk4Ci0jZGVmaW5lIFNETU1DX0RBVEEJCTB4MTAwCisjZGVmaW5lIFNETU1DX0RBVEEoeCkJCSh4KQorCisvKgorICogRGF0YSBvZmZzZXQgaXMgZGlmZmVyZW5jZSBhY2NvcmRpbmcgdG8gVmVyc2lvbgorICogTG93ZXIgdGhhbiAyLjQwYSA6IGRhdGEgcmVnaXN0ZXIgb2ZmZXN0IGlzIDB4MTAwCisgKi8KKyNkZWZpbmUgREFUQV9PRkZTRVQJCTB4MTAwCisjZGVmaW5lIERBVEFfMjQwQV9PRkZTRVQJMHgyMDAKIAogLyogc2hpZnQgYml0IGZpZWxkICovCiAjZGVmaW5lIF9TQkYoZiwgdikJCSgodikgPDwgKGYpKQpAQCAtODIsNyArOTEsNyBAQAogI2RlZmluZSBTRE1NQ19DVFlQRV80QklUCQlCSVQoMCkKICNkZWZpbmUgU0RNTUNfQ1RZUEVfMUJJVAkJMAogLyogSW50ZXJydXB0IHN0YXR1cyAmIG1hc2sgcmVnaXN0ZXIgZGVmaW5lcyAqLwotI2RlZmluZSBTRE1NQ19JTlRfU0RJTwkJCUJJVCgxNikKKyNkZWZpbmUgU0RNTUNfSU5UX1NESU8obikJCUJJVCgxNiArIChuKSkKICNkZWZpbmUgU0RNTUNfSU5UX0VCRQkJCUJJVCgxNSkKICNkZWZpbmUgU0RNTUNfSU5UX0FDRAkJCUJJVCgxNCkKICNkZWZpbmUgU0RNTUNfSU5UX1NCRQkJCUJJVCgxMykKQEAgLTEzMCw2ICsxMzksOCBAQAogI2RlZmluZSBTRE1NQ19JRE1BQ19FTkFCTEUJCUJJVCg3KQogI2RlZmluZSBTRE1NQ19JRE1BQ19GQgkJCUJJVCgxKQogI2RlZmluZSBTRE1NQ19JRE1BQ19TV1JFU0VUCQlCSVQoMCkKKy8qIFZlcnNpb24gSUQgcmVnaXN0ZXIgZGVmaW5lICovCisjZGVmaW5lIFNETU1DX0dFVF9WRVJJRCh4KQkJKCh4KSAmIDB4RkZGRikKIAogLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwogI2RlZmluZSBtY2lfcmVhZGwoZGV2LCByZWcpCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9pbXhtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvaW14bW1jLmMKaW5kZXggODgxZjdiYS4uZWEwZjNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9pbXhtbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2lteG1tYy5jCkBAIC05NDIsNyArOTQyLDcgQEAKIAlpbnQgcmV0ID0gMCwgaXJxOwogCXUxNiByZXZfbm87CiAKLQlwcmludGsoS0VSTl9JTkZPICJpLk1YIG1tYyBkcml2ZXJcbiIpOworCXByX2luZm8oImkuTVggbW1jIGRyaXZlclxuIik7CiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMgYi9kcml2ZXJzL21tYy9ob3N0L21tY19zcGkuYwppbmRleCA3YzFlMTZhLi45Mjk0NmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21tY19zcGkuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21tY19zcGkuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L21tY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jCmluZGV4IDU2ZTlhNDE2Li41MGI1Zjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xNzAsNiArMTcxLDcgQEAKIAkgKiBiYWNrIGludG8gdGhlIGRyaXZlci4uLgogCSAqLwogCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKKwlwbV9ydW50aW1lX3B1dChtbWNfZGV2KGhvc3QtPm1tYykpOwogCW1tY19yZXF1ZXN0X2RvbmUoaG9zdC0+bW1jLCBtcnEpOwogCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CiB9CkBAIC00NjQsNyArNDY2LDcgQEAKIAlzdHJ1Y3QgbW1jaV9ob3N0X25leHQgKm5leHQgPSAmaG9zdC0+bmV4dF9kYXRhOwogCiAJaWYgKGRhdGEtPmhvc3RfY29va2llICYmIGRhdGEtPmhvc3RfY29va2llICE9IG5leHQtPmNvb2tpZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJbJXNdIGludmFsaWQgY29va2llOiBkYXRhLT5ob3N0X2Nvb2tpZSAlZCIKKwkJcHJfd2FybmluZygiWyVzXSBpbnZhbGlkIGNvb2tpZTogZGF0YS0+aG9zdF9jb29raWUgJWQiCiAJCSAgICAgICAiIGhvc3QtPm5leHRfZGF0YS5jb29raWUgJWRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgZGF0YS0+aG9zdF9jb29raWUsIGhvc3QtPm5leHRfZGF0YS5jb29raWUpOwogCQlkYXRhLT5ob3N0X2Nvb2tpZSA9IDA7CkBAIC01MjksNyArNTMxLDcgQEAKIAlpZiAoY2hhbikgewogCQlpZiAoZXJyKQogCQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoY2hhbik7Ci0JCWlmIChlcnIgfHwgZGF0YS0+aG9zdF9jb29raWUpCisJCWlmIChkYXRhLT5ob3N0X2Nvb2tpZSkKIAkJCWRtYV91bm1hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGRhdGEtPnNnLAogCQkJCSAgICAgZGF0YS0+c2dfbGVuLCBkaXIpOwogCQltcnEtPmRhdGEtPmhvc3RfY29va2llID0gMDsKQEAgLTk4NCw2ICs5ODYsOCBAQAogCQlyZXR1cm47CiAJfQogCisJcG1fcnVudGltZV9nZXRfc3luYyhtbWNfZGV2KG1tYykpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAogCWhvc3QtPm1ycSA9IG1ycTsKQEAgLTExNTYsMTAgKzExNjAsMTQgQEAKIAkJZ290byBob3N0X2ZyZWU7CiAJfQogCi0JcmV0ID0gY2xrX2VuYWJsZShob3N0LT5jbGspOworCXJldCA9IGNsa19wcmVwYXJlKGhvc3QtPmNsayk7CiAJaWYgKHJldCkKIAkJZ290byBjbGtfZnJlZTsKIAorCXJldCA9IGNsa19lbmFibGUoaG9zdC0+Y2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGNsa191bnByZXA7CisKIAlob3N0LT5wbGF0ID0gcGxhdDsKIAlob3N0LT52YXJpYW50ID0gdmFyaWFudDsKIAlob3N0LT5tY2xrID0gY2xrX2dldF9yYXRlKGhvc3QtPmNsayk7CkBAIC0xMzI3LDYgKzEzMzUsOCBAQAogCiAJbW1jaV9kbWFfc2V0dXAoaG9zdCk7CiAKKwlwbV9ydW50aW1lX3B1dCgmZGV2LT5kZXYpOworCiAJbW1jX2FkZF9ob3N0KG1tYyk7CiAKIAlyZXR1cm4gMDsKQEAgLTEzNDUsNiArMTM1NSw4IEBACiAJaW91bm1hcChob3N0LT5iYXNlKTsKICBjbGtfZGlzYWJsZToKIAljbGtfZGlzYWJsZShob3N0LT5jbGspOworIGNsa191bnByZXA6CisJY2xrX3VucHJlcGFyZShob3N0LT5jbGspOwogIGNsa19mcmVlOgogCWNsa19wdXQoaG9zdC0+Y2xrKTsKICBob3N0X2ZyZWU6CkBAIC0xMzY0LDYgKzEzNzYsMTIgQEAKIAlpZiAobW1jKSB7CiAJCXN0cnVjdCBtbWNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwogCisJCS8qCisJCSAqIFVuZG8gcG1fcnVudGltZV9wdXQoKSBpbiBwcm9iZS4gIFdlIHVzZSB0aGUgX3N5bmMKKwkJICogdmVyc2lvbiBoZXJlIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyB0aGUgcHJpbWVjZWxsLgorCQkgKi8KKwkJcG1fcnVudGltZV9nZXRfc3luYygmZGV2LT5kZXYpOworCiAJCW1tY19yZW1vdmVfaG9zdChtbWMpOwogCiAJCXdyaXRlbCgwLCBob3N0LT5iYXNlICsgTU1DSU1BU0swKTsKQEAgLTEzODYsNiArMTQwNCw3IEBACiAKIAkJaW91bm1hcChob3N0LT5iYXNlKTsKIAkJY2xrX2Rpc2FibGUoaG9zdC0+Y2xrKTsKKwkJY2xrX3VucHJlcGFyZShob3N0LT5jbGspOwogCQljbGtfcHV0KGhvc3QtPmNsayk7CiAKIAkJaWYgKGhvc3QtPnZjYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuYyBiL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuYwppbmRleCBhNGM4NjVhLi44MGQ4ZWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5jCkBAIC0yMTMsNyArMjEzLDggQEAKIAltc21zZGNjX3dyaXRlbChob3N0LCBob3N0LT5jbWRfdGltZW91dCwgTU1DSURBVEFUSU1FUik7CiAJbXNtc2RjY193cml0ZWwoaG9zdCwgKHVuc2lnbmVkIGludClob3N0LT5jdXJyLnhmZXJfc2l6ZSwKIAkJICAgICAgIE1NQ0lEQVRBTEVOR1RIKTsKLQltc21zZGNjX3dyaXRlbChob3N0LCBob3N0LT5jbWRfcGlvX2lycW1hc2ssIE1NQ0lNQVNLMSk7CisJbXNtc2RjY193cml0ZWwoaG9zdCwgKG1zbXNkY2NfcmVhZGwoaG9zdCwgTU1DSU1BU0swKSAmCisJCQkofk1DSV9JUlFfUElPKSkgfCBob3N0LT5jbWRfcGlvX2lycW1hc2ssIE1NQ0lNQVNLMCk7CiAJbXNtc2RjY193cml0ZWwoaG9zdCwgaG9zdC0+Y21kX2RhdGFjdHJsLCBNTUNJREFUQUNUUkwpOwogCiAJaWYgKGhvc3QtPmNtZF9jbWQpIHsKQEAgLTM4OCw3ICszODksNyBAQAogCW4gPSBkbWFfbWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgaG9zdC0+ZG1hLnNnLAogCQkJaG9zdC0+ZG1hLm51bV9lbnRzLCBob3N0LT5kbWEuZGlyKTsKIAlpZiAobiA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBtYXAgaW4gYWxsIHNnIGVsZW1lbnRzXG4iLAorCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gbWFwIGluIGFsbCBzZyBlbGVtZW50c1xuIiwKIAkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAkJaG9zdC0+ZG1hLnNnID0gTlVMTDsKIAkJaG9zdC0+ZG1hLm51bV9lbnRzID0gMDsKQEAgLTQ3NCw3ICs0NzUsNyBAQAogCQkqYyB8PSBNQ0lfQ1NQTV9NQ0lBQk9SVDsKIAogCWlmIChob3N0LT5jdXJyLmNtZCAhPSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IE92ZXJsYXBwaW5nIGNvbW1hbmQgcmVxdWVzdHNcbiIsCisJCXByX2VycigiJXM6IE92ZXJsYXBwaW5nIGNvbW1hbmQgcmVxdWVzdHNcbiIsCiAJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJfQogCWhvc3QtPmN1cnIuY21kID0gY21kOwpAQCAtNTQzLDcgKzU0NCw5IEBACiAKIAkJbXNtc2RjY193cml0ZWwoaG9zdCwgaG9zdC0+Y3Vyci54ZmVyX3NpemUsIE1NQ0lEQVRBTEVOR1RIKTsKIAotCQltc21zZGNjX3dyaXRlbChob3N0LCBwaW9faXJxbWFzaywgTU1DSU1BU0sxKTsKKwkJbXNtc2RjY193cml0ZWwoaG9zdCwgKG1zbXNkY2NfcmVhZGwoaG9zdCwgTU1DSU1BU0swKSAmCisJCQkJKH5NQ0lfSVJRX1BJTykpIHwgcGlvX2lycW1hc2ssIE1NQ0lNQVNLMCk7CisKIAkJbXNtc2RjY193cml0ZWwoaG9zdCwgZGF0YWN0cmwsIE1NQ0lEQVRBQ1RSTCk7CiAKIAkJaWYgKGNtZCkgewpAQCAtNjU5LDggKzY2MiwxMyBAQAogewogCXN0cnVjdCBtc21zZGNjX2hvc3QJKmhvc3QgPSBkZXZfaWQ7CiAJdWludDMyX3QJCXN0YXR1czsKKwl1MzIgbWNpX21hc2swOwogCiAJc3RhdHVzID0gbXNtc2RjY19yZWFkbChob3N0LCBNTUNJU1RBVFVTKTsKKwltY2lfbWFzazAgPSBtc21zZGNjX3JlYWRsKGhvc3QsIE1NQ0lNQVNLMCk7CisKKwlpZiAoKChtY2lfbWFzazAgJiBzdGF0dXMpICYgTUNJX0lSUV9QSU8pID09IDApCisJCXJldHVybiBJUlFfTk9ORTsKIAogCWRvIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTcxOSwxMCArNzI3LDEyIEBACiAJfSB3aGlsZSAoMSk7CiAKIAlpZiAoc3RhdHVzICYgTUNJX1JYQUNUSVZFICYmIGhvc3QtPmN1cnIueGZlcl9yZW1haW4gPCBNQ0lfRklGT1NJWkUpCi0JCW1zbXNkY2Nfd3JpdGVsKGhvc3QsIE1DSV9SWERBVEFBVkxCTE1BU0ssIE1NQ0lNQVNLMSk7CisJCW1zbXNkY2Nfd3JpdGVsKGhvc3QsIChtY2lfbWFzazAgJiAofk1DSV9JUlFfUElPKSkgfAorCQkJCQlNQ0lfUlhEQVRBQVZMQkxNQVNLLCBNTUNJTUFTSzApOwogCiAJaWYgKCFob3N0LT5jdXJyLnhmZXJfcmVtYWluKQotCQltc21zZGNjX3dyaXRlbChob3N0LCAwLCBNTUNJTUFTSzEpOworCQltc21zZGNjX3dyaXRlbChob3N0LCAobWNpX21hc2swICYgKH5NQ0lfSVJRX1BJTykpIHwgMCwKKwkJCQkJTU1DSU1BU0swKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTg1NCw2ICs4NjQsOCBAQAogCWRvIHsKIAkJc3RhdHVzID0gbXNtc2RjY19yZWFkbChob3N0LCBNTUNJU1RBVFVTKTsKIAkJc3RhdHVzICY9IG1zbXNkY2NfcmVhZGwoaG9zdCwgTU1DSU1BU0swKTsKKwkJaWYgKChzdGF0dXMgJiAofk1DSV9JUlFfUElPKSkgPT0gMCkKKwkJCWJyZWFrOwogCQltc21zZGNjX3dyaXRlbChob3N0LCBzdGF0dXMsIE1NQ0lDTEVBUik7CiAKIAkJaWYgKHN0YXR1cyAmIE1DSV9TRElPSU5UUikKQEAgLTkzOSw3ICs5NTEsNyBAQAogCXN0cnVjdCBtc21fbW1jX2dwaW9fZGF0YSAqY3VycjsKIAlpbnQgaSwgcmMgPSAwOwogCi0JaWYgKCFob3N0LT5wbGF0LT5ncGlvX2RhdGEgJiYgaG9zdC0+Z3Bpb19jb25maWdfc3RhdHVzID09IGVuYWJsZSkKKwlpZiAoIWhvc3QtPnBsYXQtPmdwaW9fZGF0YSB8fCBob3N0LT5ncGlvX2NvbmZpZ19zdGF0dXMgPT0gZW5hYmxlKQogCQlyZXR1cm47CiAKIAljdXJyID0gaG9zdC0+cGxhdC0+Z3Bpb19kYXRhOwpAQCAtMTA1MiwxMCArMTA2NCwxOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgbXNtc2RjY19pbml0X2NhcmQoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbXNtc2RjY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCWlmIChob3N0LT5wbGF0LT5pbml0X2NhcmQpCisJCWhvc3QtPnBsYXQtPmluaXRfY2FyZChjYXJkKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgbXNtc2RjY19vcHMgPSB7CiAJLnJlcXVlc3QJPSBtc21zZGNjX3JlcXVlc3QsCiAJLnNldF9pb3MJPSBtc21zZGNjX3NldF9pb3MsCiAJLmVuYWJsZV9zZGlvX2lycSA9IG1zbXNkY2NfZW5hYmxlX3NkaW9faXJxLAorCS5pbml0X2NhcmQJPSBtc21zZGNjX2luaXRfY2FyZCwKIH07CiAKIHN0YXRpYyB2b2lkCkBAIC0xMDkyLDcgKzExMTMsNyBAQAogewogCXN0cnVjdCBtc21zZGNjX2hvc3QgKmhvc3QgPSBkZXZfaWQ7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVkXG4iLCBfX2Z1bmNfXywgaXJxKTsKKwlwcl9kZWJ1ZygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgaXJxKTsKIAltc21zZGNjX2NoZWNrX3N0YXR1cygodW5zaWduZWQgbG9uZykgaG9zdCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMTEwMiw3ICsxMTIzLDcgQEAKIHsKIAlzdHJ1Y3QgbXNtc2RjY19ob3N0ICpob3N0ID0gZGV2X2lkOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjYXJkX3ByZXNlbnQgJWRcbiIsIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLAorCXByX2RlYnVnKCIlczogY2FyZF9wcmVzZW50ICVkXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwKIAkgICAgICAgY2FyZF9wcmVzZW50KTsKIAltc21zZGNjX2NoZWNrX3N0YXR1cygodW5zaWduZWQgbG9uZykgaG9zdCk7CiB9CkBAIC0xMTUwLDcgKzExNzEsNiBAQAogCXN0cnVjdCBtc21zZGNjX2hvc3QgKmhvc3Q7CiAJc3RydWN0IG1tY19ob3N0ICptbWM7CiAJc3RydWN0IHJlc291cmNlICpjbWRfaXJxcmVzID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnBpb19pcnFyZXMgPSBOVUxMOwogCXN0cnVjdCByZXNvdXJjZSAqc3RhdF9pcnFyZXMgPSBOVUxMOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtcmVzID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmRtYXJlcyA9IE5VTEw7CkBAIC0xMTc1LDEyICsxMTk1LDEwIEBACiAJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKIAljbWRfaXJxcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX0lSUSwKIAkJCQkJCSAgImNtZF9pcnEiKTsKLQlwaW9faXJxcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX0lSUSwKLQkJCQkJCSAgInBpb19pcnEiKTsKIAlzdGF0X2lycXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9JUlEsCiAJCQkJCQkgICAic3RhdHVzX2lycSIpOwogCi0JaWYgKCFjbWRfaXJxcmVzIHx8ICFwaW9faXJxcmVzIHx8ICFtZW1yZXMpIHsKKwlpZiAoIWNtZF9pcnFyZXMgfHwgIW1lbXJlcykgewogCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHJlc291cmNlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMTIwMCwxNyArMTIxOCwyMCBAQAogCWhvc3QtPnBsYXQgPSBwbGF0OwogCWhvc3QtPm1tYyA9IG1tYzsKIAlob3N0LT5jdXJyLmNtZCA9IE5VTEw7CisJaW5pdF90aW1lcigmaG9zdC0+YnVzY2xrX3RpbWVyKTsKKwlob3N0LT5idXNjbGtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBob3N0OworCWhvc3QtPmJ1c2Nsa190aW1lci5mdW5jdGlvbiA9IG1zbXNkY2NfYnVzY2xrX2V4cGlyZWQ7CisKIAogCWhvc3QtPmNtZHBvbGwgPSAxOwogCiAJaG9zdC0+YmFzZSA9IGlvcmVtYXAobWVtcmVzLT5zdGFydCwgUEFHRV9TSVpFKTsKIAlpZiAoIWhvc3QtPmJhc2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJCWdvdG8gaG9zdF9mcmVlOwogCX0KIAogCWhvc3QtPmNtZF9pcnFyZXMgPSBjbWRfaXJxcmVzOwotCWhvc3QtPnBpb19pcnFyZXMgPSBwaW9faXJxcmVzOwogCWhvc3QtPm1lbXJlcyA9IG1lbXJlczsKIAlob3N0LT5kbWFyZXMgPSBkbWFyZXM7CiAJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOwpAQCAtMTIyMSwxMyArMTI0MiwxOSBAQAogCS8qCiAJICogU2V0dXAgRE1BCiAJICovCi0JbXNtc2RjY19pbml0X2RtYShob3N0KTsKKwlpZiAoaG9zdC0+ZG1hcmVzKSB7CisJCXJldCA9IG1zbXNkY2NfaW5pdF9kbWEoaG9zdCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGlvcmVtYXBfZnJlZTsKKwl9IGVsc2UgeworCQlob3N0LT5kbWEuY2hhbm5lbCA9IC0xOworCX0KIAogCS8qIEdldCBvdXIgY2xvY2tzICovCiAJaG9zdC0+cGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInNkY19wY2xrIik7CiAJaWYgKElTX0VSUihob3N0LT5wY2xrKSkgewogCQlyZXQgPSBQVFJfRVJSKGhvc3QtPnBjbGspOwotCQlnb3RvIGhvc3RfZnJlZTsKKwkJZ290byBkbWFfZnJlZTsKIAl9CiAKIAlob3N0LT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJzZGNfY2xrIik7CkBAIC0xMjM2LDE3ICsxMjYzLDE3IEBACiAJCWdvdG8gcGNsa19wdXQ7CiAJfQogCisJcmV0ID0gY2xrX3NldF9yYXRlKGhvc3QtPmNsaywgbXNtc2RjY19mbWluKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IENsb2NrIHJhdGUgc2V0IGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBjbGtfcHV0OworCX0KKwogCS8qIEVuYWJsZSBjbG9ja3MgKi8KIAlyZXQgPSBtc21zZGNjX2VuYWJsZV9jbG9ja3MoaG9zdCk7CiAJaWYgKHJldCkKIAkJZ290byBjbGtfcHV0OwogCi0JcmV0ID0gY2xrX3NldF9yYXRlKGhvc3QtPmNsaywgbXNtc2RjY19mbWluKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IENsb2NrIHJhdGUgc2V0IGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBjbGtfZGlzYWJsZTsKLQl9Ci0KIAlob3N0LT5wY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoaG9zdC0+cGNsayk7CiAJaG9zdC0+Y2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoaG9zdC0+Y2xrKTsKIApAQCAtMTMxNiwxNiArMTM0MywxMiBAQAogCQlob3N0LT5lamVjdCA9ICFob3N0LT5vbGRzdGF0OwogCX0KIAotCWluaXRfdGltZXIoJmhvc3QtPmJ1c2Nsa190aW1lcik7Ci0JaG9zdC0+YnVzY2xrX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaG9zdDsKLQlob3N0LT5idXNjbGtfdGltZXIuZnVuY3Rpb24gPSBtc21zZGNjX2J1c2Nsa19leHBpcmVkOwotCiAJcmV0ID0gcmVxdWVzdF9pcnEoY21kX2lycXJlcy0+c3RhcnQsIG1zbXNkY2NfaXJxLCBJUlFGX1NIQVJFRCwKIAkJCSAgRFJJVkVSX05BTUUgIiAoY21kKSIsIGhvc3QpOwogCWlmIChyZXQpCiAJCWdvdG8gc3RhdF9pcnFfZnJlZTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHBpb19pcnFyZXMtPnN0YXJ0LCBtc21zZGNjX3Bpb19pcnEsIElSUUZfU0hBUkVELAorCXJldCA9IHJlcXVlc3RfaXJxKGNtZF9pcnFyZXMtPnN0YXJ0LCBtc21zZGNjX3Bpb19pcnEsIElSUUZfU0hBUkVELAogCQkJICBEUklWRVJfTkFNRSAiIChwaW8pIiwgaG9zdCk7CiAJaWYgKHJldCkKIAkJZ290byBjbWRfaXJxX2ZyZWU7CkBAIC0xMzY4LDYgKzEzOTEsMTMgQEAKIAljbGtfcHV0KGhvc3QtPmNsayk7CiAgcGNsa19wdXQ6CiAJY2xrX3B1dChob3N0LT5wY2xrKTsKK2RtYV9mcmVlOgorCWlmIChob3N0LT5kbWFyZXMpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNpemVvZihzdHJ1Y3QgbXNtc2RjY19uY19kbWFkYXRhKSwKKwkJCQkJaG9zdC0+ZG1hLm5jLCBob3N0LT5kbWEubmNfYnVzYWRkcik7Citpb3JlbWFwX2ZyZWU6CisJdGFza2xldF9raWxsKCZob3N0LT5kbWFfdGxldCk7CisJaW91bm1hcChob3N0LT5iYXNlKTsKICBob3N0X2ZyZWU6CiAJbW1jX2ZyZWVfaG9zdChtbWMpOwogIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuaCBiL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuaAppbmRleCA0MmQ3YmJjLi40MDIwMjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5oCkBAIC0xNDAsNiArMTQwLDExIEBACiAJTUNJX0RBVEFUSU1FT1VUTUFTS3xNQ0lfVFhVTkRFUlJVTk1BU0t8TUNJX1JYT1ZFUlJVTk1BU0t8CVwKIAlNQ0lfQ01EUkVTUEVORE1BU0t8TUNJX0NNRFNFTlRNQVNLfE1DSV9EQVRBRU5ETUFTS3xNQ0lfUFJPR0RPTkVNQVNLKQogCisjZGVmaW5lIE1DSV9JUlFfUElPIFwKKwkoTUNJX1JYREFUQUFWTEJMTUFTSyB8IE1DSV9UWERBVEFBVkxCTE1BU0sgfCBNQ0lfUlhGSUZPRU1QVFlNQVNLIHwgXAorCSBNQ0lfVFhGSUZPRU1QVFlNQVNLIHwgTUNJX1JYRklGT0ZVTExNQVNLIHwgTUNJX1RYRklGT0ZVTExNQVNLIHwgXAorCSBNQ0lfUlhGSUZPSEFMRkZVTExNQVNLIHwgTUNJX1RYRklGT0hBTEZFTVBUWU1BU0sgfCBcCisJIE1DSV9SWEFDVElWRU1BU0sgfCBNQ0lfVFhBQ1RJVkVNQVNLKQogLyoKICAqIFRoZSBzaXplIG9mIHRoZSBGSUZPIGluIGJ5dGVzLgogICovCkBAIC0yMDIsNyArMjA3LDYgQEAKIAogc3RydWN0IG1zbXNkY2NfaG9zdCB7CiAJc3RydWN0IHJlc291cmNlCQkqY21kX2lycXJlczsKLQlzdHJ1Y3QgcmVzb3VyY2UJCSpwaW9faXJxcmVzOwogCXN0cnVjdCByZXNvdXJjZQkJKm1lbXJlczsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSpkbWFyZXM7CiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXZzZGlvLmMgYi9kcml2ZXJzL21tYy9ob3N0L212c2Rpby5jCmluZGV4IGE1YmY2MGUuLjIxMWE0OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbXZzZGlvLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tdnNkaW8uYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJCWhvc3QtPnBpb19zaXplID0gZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3o7CiAJCWhvc3QtPnBpb19wdHIgPSBzZ192aXJ0KGRhdGEtPnNnKTsKIAkJaWYgKCFub2RtYSkKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFsbGJhY2sgdG8gUElPIGZvciBkYXRhICIKKwkJCXByX2RlYnVnKCIlczogZmFsbGJhY2sgdG8gUElPIGZvciBkYXRhICIKIAkJCQkJICAiYXQgMHglcCBzaXplICVkXG4iLAogCQkJCQkgIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLAogCQkJCQkgIGhvc3QtPnBpb19wdHIsIGhvc3QtPnBpb19zaXplKTsKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCQlpZiAobXJxLT5kYXRhKQogCQkJZXJyX3N0YXR1cyA9IG12c2RfZmluaXNoX2RhdGEoaG9zdCwgbXJxLT5kYXRhLCBlcnJfc3RhdHVzKTsKIAkJaWYgKGVycl9zdGF0dXMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuaGFuZGxlZCBlcnJvciBzdGF0dXMgJSMwNHhcbiIsCisJCQlwcl9lcnIoIiVzOiB1bmhhbmRsZWQgZXJyb3Igc3RhdHVzICUjMDR4XG4iLAogCQkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgZXJyX3N0YXR1cyk7CiAJCQljbWQtPmVycm9yID0gLUVOT01TRzsKIAkJfQpAQCAtNDg5LDcgKzQ4OSw3IEBACiAJaWYgKGlycV9oYW5kbGVkKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmhhbmRsZWQgaW50ZXJydXB0IHN0YXR1cz0weCUwNHggZW49MHglMDR4ICIKKwlwcl9lcnIoIiVzOiB1bmhhbmRsZWQgaW50ZXJydXB0IHN0YXR1cz0weCUwNHggZW49MHglMDR4ICIKIAkJCSJwaW89JWRcbiIsIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBpbnRyX3N0YXR1cywKIAkJCWhvc3QtPmludHJfZW4sIGhvc3QtPnBpb19zaXplKTsKIAlyZXR1cm4gSVJRX05PTkU7CkBAIC01MDUsOSArNTA1LDkgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCW1ycSA9IGhvc3QtPm1ycTsKIAlpZiAobXJxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFRpbWVvdXQgd2FpdGluZyBmb3IgaGFyZHdhcmUgaW50ZXJydXB0LlxuIiwKKwkJcHJfZXJyKCIlczogVGltZW91dCB3YWl0aW5nIGZvciBoYXJkd2FyZSBpbnRlcnJ1cHQuXG4iLAogCQkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogaHdfc3RhdGU9MHglMDR4LCBpbnRyX3N0YXR1cz0weCUwNHggIgorCQlwcl9lcnIoIiVzOiBod19zdGF0ZT0weCUwNHgsIGludHJfc3RhdHVzPTB4JTA0eCAiCiAJCQkJImludHJfZW49MHglMDR4XG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwKIAkJCQltdnNkX3JlYWQoTVZTRF9IV19TVEFURSksCiAJCQkJbXZzZF9yZWFkKE1WU0RfTk9SX0lOVFJfU1RBVFVTKSwKQEAgLTc2Miw3ICs3NjIsNyBAQAogCiAJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBtdnNkX2lycSwgMCwgRFJJVkVSX05BTUUsIGhvc3QpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsIERSSVZFUl9OQU1FLCBpcnEpOworCQlwcl9lcnIoIiVzOiBjYW5ub3QgYXNzaWduIGlycSAlZFxuIiwgRFJJVkVSX05BTUUsIGlycSk7CiAJCWdvdG8gb3V0OwogCX0gZWxzZQogCQlob3N0LT5pcnEgPSBpcnE7CkBAIC04MDIsNyArODAyLDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXByaW50ayhLRVJOX05PVElDRSAiJXM6ICVzIGRyaXZlciBpbml0aWFsaXplZCwgIiwKKwlwcl9ub3RpY2UoIiVzOiAlcyBkcml2ZXIgaW5pdGlhbGl6ZWQsICIsCiAJCQkgICBtbWNfaG9zdG5hbWUobW1jKSwgRFJJVkVSX05BTUUpOwogCWlmIChob3N0LT5ncGlvX2NhcmRfZGV0ZWN0KQogCQlwcmludGsoInVzaW5nIEdQSU8gJWQgZm9yIGNhcmQgZGV0ZWN0aW9uXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9teGNtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMKaW5kZXggMTRhYTIxMy4uMzI1ZWE2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9teGNtbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L214Y21tYy5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KIAogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJteGMtbW1jIgogCkBAIC04NDIsNyArODQzLDcgQEAKIAlpbnQgcmV0ID0gMCwgaXJxOwogCWRtYV9jYXBfbWFza190IG1hc2s7CiAKLQlwcmludGsoS0VSTl9JTkZPICJpLk1YIFNESEMgZHJpdmVyXG4iKTsKKwlwcl9pbmZvKCJpLk1YIFNESEMgZHJpdmVyXG4iKTsKIAogCWlvcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9teHMtbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L214cy1tbWMuYwppbmRleCBkNTEzZDQ3Li45OWI0NDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L214cy1tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L214cy1tbWMuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9teHMuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMgYi9kcml2ZXJzL21tYy9ob3N0L29tYXAuYwppbmRleCBhNmMzMjkwLi4yZGJhOTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L29tYXAuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L29tYXAuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogI2luY2x1ZGUgPHBsYXQvbW1jLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2RtYS5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCmluZGV4IDIxZTRhNzkuLjEwMWNkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCkBAIC00NTAsMTUgKzQ1MCwxNCBAQAogCQkqIGZyYW1ld29yayBpcyBmaXhlZCwgd2UgbmVlZCBhIHdvcmthcm91bmQgbGlrZSB0aGlzCiAJCSogKHdoaWNoIGlzIHNhZmUgZm9yIE1NQywgYnV0IG5vdCBpbiBnZW5lcmFsKS4KIAkJKi8KLQkJaWYgKHJlZ3VsYXRvcl9pc19lbmFibGVkKGhvc3QtPnZjYykgPiAwKSB7Ci0JCQlyZWd1bGF0b3JfZW5hYmxlKGhvc3QtPnZjYyk7Ci0JCQlyZWd1bGF0b3JfZGlzYWJsZShob3N0LT52Y2MpOwotCQl9Ci0JCWlmIChob3N0LT52Y2NfYXV4KSB7Ci0JCQlpZiAocmVndWxhdG9yX2lzX2VuYWJsZWQocmVnKSA+IDApIHsKLQkJCQlyZWd1bGF0b3JfZW5hYmxlKHJlZyk7Ci0JCQkJcmVndWxhdG9yX2Rpc2FibGUocmVnKTsKLQkJCX0KKwkJaWYgKHJlZ3VsYXRvcl9pc19lbmFibGVkKGhvc3QtPnZjYykgPiAwIHx8CisJCSAgICAoaG9zdC0+dmNjX2F1eCAmJiByZWd1bGF0b3JfaXNfZW5hYmxlZChob3N0LT52Y2NfYXV4KSkpIHsKKwkJCWludCB2ZGQgPSBmZnMobW1jX3Nsb3QoaG9zdCkub2NyX21hc2spIC0gMTsKKworCQkJbW1jX3Nsb3QoaG9zdCkuc2V0X3Bvd2VyKGhvc3QtPmRldiwgaG9zdC0+c2xvdF9pZCwKKwkJCQkJCSAxLCB2ZGQpOworCQkJbW1jX3Nsb3QoaG9zdCkuc2V0X3Bvd2VyKGhvc3QtPmRldiwgaG9zdC0+c2xvdF9pZCwKKwkJCQkJCSAwLCAwKTsKIAkJfQogCX0KIApAQCAtMTI2NCwxNCArMTI2MywxNCBAQAogCWhvc3QtPnJlcXNfYmxvY2tlZCA9IDA7CiAJaWYgKG1tY19zbG90KGhvc3QpLmdldF9jb3Zlcl9zdGF0ZShob3N0LT5kZXYsIGhvc3QtPnNsb3RfaWQpKSB7CiAJCWlmIChob3N0LT5wcm90ZWN0X2NhcmQpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb3ZlciBpcyBjbG9zZWQsICIKKwkJCXByX2luZm8oIiVzOiBjb3ZlciBpcyBjbG9zZWQsICIKIAkJCQkJICJjYXJkIGlzIG5vdyBhY2Nlc3NpYmxlXG4iLAogCQkJCQkgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCQkJaG9zdC0+cHJvdGVjdF9jYXJkID0gMDsKIAkJfQogCX0gZWxzZSB7CiAJCWlmICghaG9zdC0+cHJvdGVjdF9jYXJkKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogY292ZXIgaXMgb3BlbiwgIgorCQkJcHJfaW5mbygiJXM6IGNvdmVyIGlzIG9wZW4sICIKIAkJCQkJICJjYXJkIGlzIG5vdyBpbmFjY2Vzc2libGVcbiIsCiAJCQkJCSBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJCQlob3N0LT5wcm90ZWN0X2NhcmQgPSAxOwpAQCAtMTQyMiw3ICsxNDIxLDcgQEAKIAogCWlmICghbmV4dCAmJiBkYXRhLT5ob3N0X2Nvb2tpZSAmJgogCSAgICBkYXRhLT5ob3N0X2Nvb2tpZSAhPSBob3N0LT5uZXh0X2RhdGEuY29va2llKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlslc10gaW52YWxpZCBjb29raWU6IGRhdGEtPmhvc3RfY29va2llICVkIgorCQlwcl93YXJuaW5nKCJbJXNdIGludmFsaWQgY29va2llOiBkYXRhLT5ob3N0X2Nvb2tpZSAlZCIKIAkJICAgICAgICIgaG9zdC0+bmV4dF9kYXRhLmNvb2tpZSAlZFxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBkYXRhLT5ob3N0X2Nvb2tpZSwgaG9zdC0+bmV4dF9kYXRhLmNvb2tpZSk7CiAJCWRhdGEtPmhvc3RfY29va2llID0gMDsKQEAgLTE5NDMsNiArMTk0MiwxMCBAQAogCW9tYXBfaHNtbWNfY29udGV4dF9zYXZlKGhvc3QpOwogCiAJbW1jLT5jYXBzIHw9IE1NQ19DQVBfRElTQUJMRTsKKwlpZiAoaG9zdC0+cGRhdGEtPmNvbnRyb2xsZXJfZmxhZ3MgJiBPTUFQX0hTTU1DX0JST0tFTl9NVUxUSUJMT0NLX1JFQUQpIHsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm11bHRpYmxvY2sgcmVhZHMgZGlzYWJsZWQgZHVlIHRvIDM1eHggZXJyYXR1bSAyLjEuMS4xMjg7IE1NQyByZWFkIHBlcmZvcm1hbmNlIG1heSBzdWZmZXJcbiIpOworCQltbWMtPmNhcHMyIHw9IE1NQ19DQVAyX05PX01VTFRJX1JFQUQ7CisJfQogCiAJcG1fcnVudGltZV9lbmFibGUoaG9zdC0+ZGV2KTsKIAlwbV9ydW50aW1lX2dldF9zeW5jKGhvc3QtPmRldik7CkBAIC0yMDE1LDcgKzIwMTgsNyBAQAogCX0KIAogCS8qIFJlcXVlc3QgSVJRIGZvciBNTUMgb3BlcmF0aW9ucyAqLwotCXJldCA9IHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgb21hcF9oc21tY19pcnEsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBvbWFwX2hzbW1jX2lycSwgMCwKIAkJCW1tY19ob3N0bmFtZShtbWMpLCBob3N0KTsKIAlpZiAocmV0KSB7CiAJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiVW5hYmxlIHRvIGdyYWIgSFNNTUMgSVJRXG4iKTsKQEAgLTIwNDMsOCArMjA0Niw3IEBACiAJaWYgKChtbWNfc2xvdChob3N0KS5jYXJkX2RldGVjdF9pcnEpKSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKG1tY19zbG90KGhvc3QpLmNhcmRfZGV0ZWN0X2lycSwKIAkJCQkgIG9tYXBfaHNtbWNfY2RfaGFuZGxlciwKLQkJCQkgIElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORwotCQkJCQkgIHwgSVJRRl9ESVNBQkxFRCwKKwkJCQkgIElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKIAkJCQkgIG1tY19ob3N0bmFtZShtbWMpLCBob3N0KTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9weGFtY2kuYwppbmRleCA3MjU3NzM4Li5mYzQzNTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvcHhhbWNpLmMKQEAgLTU1OCw3ICs1NTgsNyBAQAogCWlmIChkY3NyICYgRENTUl9FTkRJTlRSKSB7CiAJCXdyaXRlbChCVUZfUEFSVF9GVUxMLCBob3N0LT5iYXNlICsgTU1DX1BSVEJVRik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BIGVycm9yIG9uIGNoYW5uZWwgJWQgKERDU1I9JSN4KVxuIiwKKwkJcHJfZXJyKCIlczogRE1BIGVycm9yIG9uIGNoYW5uZWwgJWQgKERDU1I9JSN4KVxuIiwKIAkJICAgICAgIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBkbWEsIGRjc3IpOwogCQlob3N0LT5kYXRhLT5lcnJvciA9IC1FSU87CiAJCXB4YW1jaV9kYXRhX2RvbmUoaG9zdCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3MzY21jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zM2NtY2kuYwppbmRleCBhMDRmODdkLi43MjBmOTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3MzY21jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvczNjbWNpLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogewogCWlmIChob3N0LT5zZGlvX2lycWVuKSB7CiAJCWlmIChncGlvX2dldF92YWx1ZShTM0MyNDEwX0dQRSg4KSkgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzaWduYWxsaW5nIGlycVxuIiwgX19mdW5jX18pOworCQkJcHJfZGVidWcoIiVzOiBzaWduYWxsaW5nIGlycVxuIiwgX19mdW5jX18pOwogCQkJbW1jX3NpZ25hbF9zZGlvX2lycShob3N0LT5tbWMpOwogCQl9CiAJfQpAQCAtMzQ0LDcgKzM0NCw3IEBACiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKLQkvL3ByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNmZXIgJWRcbiIsIF9fZnVuY19fLCB0cmFuc2Zlcik7CisJLyogcHJfZGVidWcoIiVzOiB0cmFuc2ZlciAlZFxuIiwgX19mdW5jX18sIHRyYW5zZmVyKTsgKi8KIAogCWhvc3QtPmlycV9kaXNhYmxlZCA9IHRyYW5zZmVyOwogCkBAIC05MTMsOSArOTEzLDkgQEAKIH0KIAogc3RhdGljIHZvaWQgczNjbWNpX2RtYV9zZXR1cChzdHJ1Y3QgczNjbWNpX2hvc3QgKmhvc3QsCi0JCQkgICAgIGVudW0gczNjMjQxMF9kbWFzcmMgc291cmNlKQorCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBzb3VyY2UpCiB7Ci0Jc3RhdGljIGVudW0gczNjMjQxMF9kbWFzcmMgbGFzdF9zb3VyY2UgPSAtMTsKKwlzdGF0aWMgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gbGFzdF9zb3VyY2UgPSAtMTsKIAlzdGF0aWMgaW50IHNldHVwX29rOwogCiAJaWYgKGxhc3Rfc291cmNlID09IHNvdXJjZSkKQEAgLTEwODcsNyArMTA4Nyw3IEBACiAKIAlCVUdfT04oKGRhdGEtPmZsYWdzICYgQk9USF9ESVIpID09IEJPVEhfRElSKTsKIAotCXMzY21jaV9kbWFfc2V0dXAoaG9zdCwgcncgPyBTM0MyNDEwX0RNQVNSQ19NRU0gOiBTM0MyNDEwX0RNQVNSQ19IVyk7CisJczNjbWNpX2RtYV9zZXR1cChob3N0LCBydyA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpOwogCXMzYzI0MTBfZG1hX2N0cmwoaG9zdC0+ZG1hLCBTM0MyNDEwX0RNQU9QX0ZMVVNIKTsKIAogCWRtYV9sZW4gPSBkbWFfbWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCmluZGV4IDRkYzAwMjguLjRiOTc2ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYwpAQCAtMzIsNiArMzIsMTYgQEAKIC8qIFZFTkRPUiBTUEVDIHJlZ2lzdGVyICovCiAjZGVmaW5lIFNESENJX1ZFTkRPUl9TUEVDCQkweEMwCiAjZGVmaW5lICBTREhDSV9WRU5ET1JfU1BFQ19TRElPX1FVSVJLCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0RIQ0lfV1RNS19MVkwJCQkweDQ0CisjZGVmaW5lIFNESENJX01JWF9DVFJMCQkJMHg0OAorCisvKgorICogVGhlcmUgaXMgYW4gSU5UIERNQSBFUlIgbWlzLW1hdGNoIGJldHdlZW4gZVNESEMgYW5kIFNURCBTREhDIFNQRUM6CisgKiBCaXQyNSBpcyB1c2VkIGluIFNURCBTUEVDLCBhbmQgaXMgcmVzZXJ2ZWQgaW4gZnNsIGVTREhDIGRlc2lnbiwKKyAqIGJ1dCBiaXQyOCBpcyB1c2VkIGFzIHRoZSBJTlQgRE1BIEVSUiBpbiBmc2wgZVNESEMgZGVzaWduLgorICogRGVmaW5lIHRoaXMgbWFjcm8gRE1BIGVycm9yIElOVCBmb3IgZnNsIGVTREhDCisgKi8KKyNkZWZpbmUgU0RIQ0lfSU5UX1ZFTkRPUl9TUEVDX0RNQV9FUlIJMHgxMDAwMDAwMAogCiAvKgogICogVGhlIENNRFRZUEUgb2YgdGhlIENNRCByZWdpc3RlciAob2Zmc2V0IDB4RSkgc2hvdWxkIGJlIHNldCB0bwpAQCAtNTEsNiArNjEsNyBAQAogCUlNWDM1X0VTREhDLAogCUlNWDUxX0VTREhDLAogCUlNWDUzX0VTREhDLAorCUlNWDZRX1VTREhDLAogfTsKIAogc3RydWN0IHBsdGZtX2lteF9kYXRhIHsKQEAgLTc0LDYgKzg1LDkgQEAKIAkJLm5hbWUgPSAic2RoY2ktZXNkaGMtaW14NTMiLAogCQkuZHJpdmVyX2RhdGEgPSBJTVg1M19FU0RIQywKIAl9LCB7CisJCS5uYW1lID0gInNkaGNpLXVzZGhjLWlteDZxIiwKKwkJLmRyaXZlcl9kYXRhID0gSU1YNlFfVVNESEMsCisJfSwgewogCQkvKiBzZW50aW5lbCAqLwogCX0KIH07CkBAIC04NCw2ICs5OCw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MzUtZXNkaGMiLCAuZGF0YSA9ICZpbXhfZXNkaGNfZGV2dHlwZVtJTVgzNV9FU0RIQ10sIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZXNkaGMiLCAuZGF0YSA9ICZpbXhfZXNkaGNfZGV2dHlwZVtJTVg1MV9FU0RIQ10sIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZXNkaGMiLCAuZGF0YSA9ICZpbXhfZXNkaGNfZGV2dHlwZVtJTVg1M19FU0RIQ10sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdXNkaGMiLCAuZGF0YSA9ICZpbXhfZXNkaGNfZGV2dHlwZVtJTVg2UV9VU0RIQ10sIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaW14X2VzZGhjX2R0X2lkcyk7CkBAIC0xMDgsNiArMTIzLDExIEBACiAJcmV0dXJuIGRhdGEtPmRldnR5cGUgPT0gSU1YNTNfRVNESEM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lteDZxX3VzZGhjKHN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gZGF0YS0+ZGV2dHlwZSA9PSBJTVg2UV9VU0RIQzsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGVzZGhjX2NscnNldF9sZShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTMyIG1hc2ssIHUzMiB2YWwsIGludCByZWcpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gaG9zdC0+aW9hZGRyICsgKHJlZyAmIH4weDMpOwpAQCAtMTM1LDYgKzE1NSwyNyBAQAogCQkJdmFsIHw9IFNESENJX0NBUkRfUFJFU0VOVDsKIAl9CiAKKwlpZiAodW5saWtlbHkocmVnID09IFNESENJX0NBUEFCSUxJVElFUykpIHsKKwkJLyogSW4gRlNMIGVzZGhjIElDIG1vZHVsZSwgb25seSBiaXQyMCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZQorCQkgKiBBRE1BMiBjYXBhYmlsaXR5IG9mIGVzZGhjLCBidXQgdGhpcyBiaXQgaXMgbWVzc2VkIHVwIG9uCisJCSAqIHNvbWUgU09DcyAoZS5nLiBvbiBNWDI1LCBNWDM1IHRoaXMgYml0IGlzIHNldCwgYnV0IHRoZXkKKwkJICogZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBBRE1BMikuIFNvIHNldCB0aGUgQlJPS0VOX0FETUEKKwkJICogdWlyayBvbiBNWDI1LzM1IHBsYXRmb3Jtcy4KKwkJICovCisKKwkJaWYgKHZhbCAmIFNESENJX0NBTl9ET19BRE1BMSkgeworCQkJdmFsICY9IH5TREhDSV9DQU5fRE9fQURNQTE7CisJCQl2YWwgfD0gU0RIQ0lfQ0FOX0RPX0FETUEyOworCQl9CisJfQorCisJaWYgKHVubGlrZWx5KHJlZyA9PSBTREhDSV9JTlRfU1RBVFVTKSkgeworCQlpZiAodmFsICYgU0RIQ0lfSU5UX1ZFTkRPUl9TUEVDX0RNQV9FUlIpIHsKKwkJCXZhbCAmPSB+U0RIQ0lfSU5UX1ZFTkRPUl9TUEVDX0RNQV9FUlI7CisJCQl2YWwgfD0gU0RIQ0lfSU5UX0FETUFfRVJST1I7CisJCX0KKwl9CisKIAlyZXR1cm4gdmFsOwogfQogCkBAIC0xNzksMTMgKzIyMCwyOCBAQAogCQkJd3JpdGVsKHYsIGhvc3QtPmlvYWRkciArIFNESENJX1ZFTkRPUl9TUEVDKTsKIAl9CiAKKwlpZiAodW5saWtlbHkocmVnID09IFNESENJX0lOVF9FTkFCTEUgfHwgcmVnID09IFNESENJX1NJR05BTF9FTkFCTEUpKSB7CisJCWlmICh2YWwgJiBTREhDSV9JTlRfQURNQV9FUlJPUikgeworCQkJdmFsICY9IH5TREhDSV9JTlRfQURNQV9FUlJPUjsKKwkJCXZhbCB8PSBTREhDSV9JTlRfVkVORE9SX1NQRUNfRE1BX0VSUjsKKwkJfQorCX0KKwogCXdyaXRlbCh2YWwsIGhvc3QtPmlvYWRkciArIHJlZyk7CiB9CiAKIHN0YXRpYyB1MTYgZXNkaGNfcmVhZHdfbGUoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCiB7Ci0JaWYgKHVubGlrZWx5KHJlZyA9PSBTREhDSV9IT1NUX1ZFUlNJT04pKQotCQlyZWcgXj0gMjsKKwlpZiAodW5saWtlbHkocmVnID09IFNESENJX0hPU1RfVkVSU0lPTikpIHsKKwkJdTE2IHZhbCA9IHJlYWR3KGhvc3QtPmlvYWRkciArIChyZWcgXiAyKSk7CisJCS8qCisJCSAqIHVTREhDIHN1cHBvcnRzIFNESENJIHYzLjAsIGJ1dCBpdCdzIGVuY29kZWQgYXMgdmFsdWUKKwkJICogMHgzIGluIGhvc3QgY29udHJvbGxlciB2ZXJzaW9uIHJlZ2lzdGVyLCB3aGljaCB2aW9sYXRlcworCQkgKiBTREhDSV9TUEVDXzMwMCBkZWZpbml0aW9uLiAgV29yayBpdCBhcm91bmQgaGVyZS4KKwkJICovCisJCWlmICgodmFsICYgU0RIQ0lfU1BFQ19WRVJfTUFTSykgPT0gMykKKwkJCXJldHVybiAtLXZhbDsKKwl9CiAKIAlyZXR1cm4gcmVhZHcoaG9zdC0+aW9hZGRyICsgcmVnKTsKIH0KQEAgLTIxNiw4ICsyNzIsMTcgQEAKIAkJaWYgKChob3N0LT5jbWQtPm9wY29kZSA9PSBNTUNfU1RPUF9UUkFOU01JU1NJT04pCiAJCQkmJiAoaW14X2RhdGEtPmZsYWdzICYgRVNESENfRkxBR19NVUxUSUJMS19OT19JTlQpKQogCQkJdmFsIHw9IFNESENJX0NNRF9BQk9SVENNRDsKLQkJd3JpdGVsKHZhbCA8PCAxNiB8IGlteF9kYXRhLT5zY3JhdGNocGFkLAotCQkJaG9zdC0+aW9hZGRyICsgU0RIQ0lfVFJBTlNGRVJfTU9ERSk7CisKKwkJaWYgKGlzX2lteDZxX3VzZGhjKGlteF9kYXRhKSkgeworCQkJdTMyIG0gPSByZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9NSVhfQ1RSTCk7CisJCQltID0gaW14X2RhdGEtPnNjcmF0Y2hwYWQgfCAobSAmIDB4ZmZmZjAwMDApOworCQkJd3JpdGVsKG0sIGhvc3QtPmlvYWRkciArIFNESENJX01JWF9DVFJMKTsKKwkJCXdyaXRlbCh2YWwgPDwgMTYsCisJCQkgICAgICAgaG9zdC0+aW9hZGRyICsgU0RIQ0lfVFJBTlNGRVJfTU9ERSk7CisJCX0gZWxzZSB7CisJCQl3cml0ZWwodmFsIDw8IDE2IHwgaW14X2RhdGEtPnNjcmF0Y2hwYWQsCisJCQkgICAgICAgaG9zdC0+aW9hZGRyICsgU0RIQ0lfVFJBTlNGRVJfTU9ERSk7CisJCX0KIAkJcmV0dXJuOwogCWNhc2UgU0RIQ0lfQkxPQ0tfU0laRToKIAkJdmFsICY9IH5TREhDSV9NQUtFX0JMS1NaKDB4NywgMCk7CkBAIC0zMTEsOSArMzc2LDEwIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfZXNkaGNfaW14X3BkYXRhID0gewotCS5xdWlya3MgPSBFU0RIQ19ERUZBVUxUX1FVSVJLUyB8IFNESENJX1FVSVJLX0JST0tFTl9BRE1BCisJLnF1aXJrcyA9IEVTREhDX0RFRkFVTFRfUVVJUktTIHwgU0RIQ0lfUVVJUktfTk9fSElTUERfQklUCisJCQl8IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQworCQkJfCBTREhDSV9RVUlSS19CUk9LRU5fQURNQV9aRVJPTEVOX0RFU0MKIAkJCXwgU0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OLAotCS8qIEFETUEgaGFzIGlzc3Vlcy4gTWlnaHQgYmUgZml4YWJsZSAqLwogCS5vcHMgPSAmc2RoY2lfZXNkaGNfb3BzLAogfTsKIApAQCAtNDA1LDExICs0NzEsMTkgQEAKIAogCWlmIChpc19pbXgyNV9lc2RoYyhpbXhfZGF0YSkgfHwgaXNfaW14MzVfZXNkaGMoaW14X2RhdGEpKQogCQkvKiBGaXggZXJyYXRhIEVOR2NtMDcyMDcgcHJlc2VudCBvbiBpLk1YMjUgYW5kIGkuTVgzNSAqLwotCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfTk9fTVVMVElCTE9DSzsKKwkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX05PX01VTFRJQkxPQ0sKKwkJCXwgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUE7CiAKIAlpZiAoaXNfaW14NTNfZXNkaGMoaW14X2RhdGEpKQogCQlpbXhfZGF0YS0+ZmxhZ3MgfD0gRVNESENfRkxBR19NVUxUSUJMS19OT19JTlQ7CiAKKwkvKgorCSAqIFRoZSBpbXg2cSBST00gY29kZSB3aWxsIGNoYW5nZSB0aGUgZGVmYXVsdCB3YXRlcm1hcmsgbGV2ZWwgc2V0dGluZworCSAqIHRvIHNvbWV0aGluZyBpbnNhbmUuICBDaGFuZ2UgaXQgYmFjayBoZXJlLgorCSAqLworCWlmIChpc19pbXg2cV91c2RoYyhpbXhfZGF0YSkpCisJCXdyaXRlbCgweDA4MTAwODEwLCBob3N0LT5pb2FkZHIgKyBTREhDSV9XVE1LX0xWTCk7CisKIAlib2FyZGRhdGEgPSAmaW14X2RhdGEtPmJvYXJkZGF0YTsKIAlpZiAoc2RoY2lfZXNkaGNfaW14X3Byb2JlX2R0KHBkZXYsIGJvYXJkZGF0YSkgPCAwKSB7CiAJCWlmICghaG9zdC0+bW1jLT5wYXJlbnQtPnBsYXRmb3JtX2RhdGEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYwppbmRleCBmZTYwNGRmLi41OWU5ZDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIEZyZWVzY2FsZSBlU0RIQyBjb250cm9sbGVyIGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgogICogQ29weXJpZ2h0IChjKSAyMDA5IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqCiAgKiBBdXRob3JzOiBYaWFvYm8gWGllIDxYLlhpZUBmcmVlc2NhbGUuY29tPgpAQCAtMTUsNiArMTUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKICNpbmNsdWRlICJzZGhjaS1lc2RoYy5oIgpAQCAtMjIsMTEgKzIzLDIxIEBACiBzdGF0aWMgdTE2IGVzZGhjX3JlYWR3KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQogewogCXUxNiByZXQ7CisJaW50IGJhc2UgPSByZWcgJiB+MHgzOworCWludCBzaGlmdCA9IChyZWcgJiAweDIpICogODsKIAogCWlmICh1bmxpa2VseShyZWcgPT0gU0RIQ0lfSE9TVF9WRVJTSU9OKSkKLQkJcmV0ID0gaW5fYmUxNihob3N0LT5pb2FkZHIgKyByZWcpOworCQlyZXQgPSBpbl9iZTMyKGhvc3QtPmlvYWRkciArIGJhc2UpICYgMHhmZmZmOwogCWVsc2UKLQkJcmV0ID0gc2RoY2lfYmUzMmJzX3JlYWR3KGhvc3QsIHJlZyk7CisJCXJldCA9IChpbl9iZTMyKGhvc3QtPmlvYWRkciArIGJhc2UpID4+IHNoaWZ0KSAmIDB4ZmZmZjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTggZXNkaGNfcmVhZGIoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCit7CisJaW50IGJhc2UgPSByZWcgJiB+MHgzOworCWludCBzaGlmdCA9IChyZWcgJiAweDMpICogODsKKwl1OCByZXQgPSAoaW5fYmUzMihob3N0LT5pb2FkZHIgKyBiYXNlKSA+PiBzaGlmdCkgJiAweGZmOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc0LDcgKzg1LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfb3BzIHNkaGNpX2VzZGhjX29wcyA9IHsKIAkucmVhZF9sID0gc2RoY2lfYmUzMmJzX3JlYWRsLAogCS5yZWFkX3cgPSBlc2RoY19yZWFkdywKLQkucmVhZF9iID0gc2RoY2lfYmUzMmJzX3JlYWRiLAorCS5yZWFkX2IgPSBlc2RoY19yZWFkYiwKIAkud3JpdGVfbCA9IHNkaGNpX2JlMzJic193cml0ZWwsCiAJLndyaXRlX3cgPSBlc2RoY193cml0ZXcsCiAJLndyaXRlX2IgPSBlc2RoY193cml0ZWIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtaGx3ZC5jCmluZGV4IDczNWJlMTMuLjliMGQ3OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtaGx3ZC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtaGx3ZC5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYwppbmRleCAyNmM1Mjg2Li5kODMzZDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjEsNiArMjIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlICJzZGhjaS5oIgogCkBAIC00Myw2ICs0Nyw3IEBACiAKIHN0cnVjdCBzZGhjaV9wY2lfZml4ZXMgewogCXVuc2lnbmVkIGludAkJcXVpcmtzOworCWJvb2wJCQlhbGxvd19ydW50aW1lX3BtOwogCiAJaW50CQkJKCpwcm9iZSkgKHN0cnVjdCBzZGhjaV9wY2lfY2hpcCAqKTsKIApAQCAtNTksMTIgKzY0LDE2IEBACiAJc3RydWN0IHNkaGNpX2hvc3QJKmhvc3Q7CiAKIAlpbnQJCQlwY2lfYmFyOworCWludAkJCXJzdF9uX2dwaW87CisJaW50CQkJY2RfZ3BpbzsKKwlpbnQJCQljZF9pcnE7CiB9OwogCiBzdHJ1Y3Qgc2RoY2lfcGNpX2NoaXAgewogCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKIAogCXVuc2lnbmVkIGludAkJcXVpcmtzOworCWJvb2wJCQlhbGxvd19ydW50aW1lX3BtOwogCWNvbnN0IHN0cnVjdCBzZGhjaV9wY2lfZml4ZXMgKmZpeGVzOwogCiAJaW50CQkJbnVtX3Nsb3RzOwkvKiBTbG90cyBvbiBjb250cm9sbGVyICovCkBAIC0xNjMsMTIgKzE3MiwxMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogTWVkZmllbGQgZU1NQyBoYXJkd2FyZSByZXNldCBHUElPcyAqLworc3RhdGljIGludCBtZmRfZW1tYzBfcnN0X2dwaW8gPSAtRUlOVkFMOworc3RhdGljIGludCBtZmRfZW1tYzFfcnN0X2dwaW8gPSAtRUlOVkFMOworCitzdGF0aWMgaW50IG1mZF9lbW1jX2dwaW9fcGFyc2Uoc3RydWN0IHNmaV90YWJsZV9oZWFkZXIgKnRhYmxlKQoreworCXN0cnVjdCBzZmlfdGFibGVfc2ltcGxlICpzYiA9IChzdHJ1Y3Qgc2ZpX3RhYmxlX3NpbXBsZSAqKXRhYmxlOworCXN0cnVjdCBzZmlfZ3Bpb190YWJsZV9lbnRyeSAqZW50cnk7CisJaW50IGksIG51bTsKKworCW51bSA9IFNGSV9HRVRfTlVNX0VOVFJJRVMoc2IsIHN0cnVjdCBzZmlfZ3Bpb190YWJsZV9lbnRyeSk7CisJZW50cnkgPSAoc3RydWN0IHNmaV9ncGlvX3RhYmxlX2VudHJ5ICopc2ItPnBlbnRyeTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKywgZW50cnkrKykgeworCQlpZiAoIXN0cm5jbXAoZW50cnktPnBpbl9uYW1lLCAiZW1tYzBfcnN0IiwgU0ZJX05BTUVfTEVOKSkKKwkJCW1mZF9lbW1jMF9yc3RfZ3BpbyA9IGVudHJ5LT5waW5fbm87CisJCWVsc2UgaWYgKCFzdHJuY21wKGVudHJ5LT5waW5fbmFtZSwgImVtbWMxX3JzdCIsIFNGSV9OQU1FX0xFTikpCisJCQltZmRfZW1tYzFfcnN0X2dwaW8gPSBlbnRyeS0+cGluX25vOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKworc3RhdGljIGlycXJldHVybl90IG1mZF9zZF9jZChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNkaGNpX3BjaV9zbG90ICpzbG90ID0gZGV2X2lkOworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gc2xvdC0+aG9zdDsKKworCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYywgbXNlY3NfdG9famlmZmllcygyMDApKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNkZWZpbmUgTUZMRF9TRF9DRF9QSU4gNjkKKworc3RhdGljIGludCBtZmRfc2RfcHJvYmVfc2xvdChzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKnNsb3QpCit7CisJaW50IGVyciwgaXJxLCBncGlvID0gTUZMRF9TRF9DRF9QSU47CisKKwlzbG90LT5jZF9ncGlvID0gLUVJTlZBTDsKKwlzbG90LT5jZF9pcnEgPSAtRUlOVkFMOworCisJZXJyID0gZ3Bpb19yZXF1ZXN0KGdwaW8sICJzZF9jZCIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJaXJxID0gZ3Bpb190b19pcnEoZ3Bpbyk7CisJaWYgKGlycSA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIG1mZF9zZF9jZCwgSVJRRl9UUklHR0VSX1JJU0lORyB8CisJCQkgIElSUUZfVFJJR0dFUl9GQUxMSU5HLCAic2RfY2QiLCBzbG90KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJc2xvdC0+Y2RfZ3BpbyA9IGdwaW87CisJc2xvdC0+Y2RfaXJxID0gaXJxOworCXNsb3QtPmhvc3QtPnF1aXJrczIgfD0gU0RIQ0lfUVVJUksyX09XTl9DQVJEX0RFVEVDVElPTjsKKworCXJldHVybiAwOworCitvdXRfZnJlZToKKwlncGlvX2ZyZWUoZ3Bpbyk7CitvdXQ6CisJZGV2X3dhcm4oJnNsb3QtPmNoaXAtPnBkZXYtPmRldiwgImZhaWxlZCB0byBzZXR1cCBjYXJkIGRldGVjdCB3YWtlIHVwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWZkX3NkX3JlbW92ZV9zbG90KHN0cnVjdCBzZGhjaV9wY2lfc2xvdCAqc2xvdCwgaW50IGRlYWQpCit7CisJaWYgKHNsb3QtPmNkX2lycSA+PSAwKQorCQlmcmVlX2lycShzbG90LT5jZF9pcnEsIHNsb3QpOworCWdwaW9fZnJlZShzbG90LT5jZF9ncGlvKTsKK30KKworI2Vsc2UKKworI2RlZmluZSBtZmRfc2RfcHJvYmVfc2xvdAlOVUxMCisjZGVmaW5lIG1mZF9zZF9yZW1vdmVfc2xvdAlOVUxMCisKKyNlbmRpZgorCiBzdGF0aWMgaW50IG1mZF9lbW1jX3Byb2JlX3Nsb3Qoc3RydWN0IHNkaGNpX3BjaV9zbG90ICpzbG90KQogewotCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQXzhfQklUX0RBVEE7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJaW50IGdwaW8gPSAtRUlOVkFMOworCisJc2ZpX3RhYmxlX3BhcnNlKFNGSV9TSUdfR1BJTywgTlVMTCwgTlVMTCwgbWZkX2VtbWNfZ3Bpb19wYXJzZSk7CisKKwlzd2l0Y2ggKHNsb3QtPmNoaXAtPnBkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9NRkRfRU1NQzA6CisJCWdwaW8gPSBtZmRfZW1tYzBfcnN0X2dwaW87CisJCW5hbWUgPSAiZU1NQzBfcmVzZXQiOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTUZEX0VNTUMxOgorCQlncGlvID0gbWZkX2VtbWMxX3JzdF9ncGlvOworCQluYW1lID0gImVNTUMxX3Jlc2V0IjsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFncGlvX3JlcXVlc3QoZ3BpbywgbmFtZSkpIHsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDEpOworCQlzbG90LT5yc3Rfbl9ncGlvID0gZ3BpbzsKKwkJc2xvdC0+aG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfSFdfUkVTRVQ7CisJfQorCisJc2xvdC0+aG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfOF9CSVRfREFUQSB8IE1NQ19DQVBfTk9OUkVNT1ZBQkxFOworCisJc2xvdC0+aG9zdC0+bW1jLT5jYXBzMiA9IE1NQ19DQVAyX0JPT1RQQVJUX05PQUNDOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG1mZF9lbW1jX3JlbW92ZV9zbG90KHN0cnVjdCBzZGhjaV9wY2lfc2xvdCAqc2xvdCwgaW50IGRlYWQpCit7CisJZ3Bpb19mcmVlKHNsb3QtPnJzdF9uX2dwaW8pOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyBzZGhjaV9pbnRlbF9tcnN0X2hjMCA9IHsKIAkucXVpcmtzCQk9IFNESENJX1FVSVJLX0JST0tFTl9BRE1BIHwgU0RIQ0lfUVVJUktfTk9fSElTUERfQklULAogCS5wcm9iZV9zbG90CT0gbXJzdF9oY19wcm9iZV9zbG90LApAQCAtMTgxLDE1ICszMDcsMjEgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9wY2lfZml4ZXMgc2RoY2lfaW50ZWxfbWZkX3NkID0gewogCS5xdWlya3MJCT0gU0RIQ0lfUVVJUktfTk9fRU5EQVRUUl9JTl9OT1BERVNDLAorCS5hbGxvd19ydW50aW1lX3BtID0gdHJ1ZSwKKwkucHJvYmVfc2xvdAk9IG1mZF9zZF9wcm9iZV9zbG90LAorCS5yZW1vdmVfc2xvdAk9IG1mZF9zZF9yZW1vdmVfc2xvdCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfcGNpX2ZpeGVzIHNkaGNpX2ludGVsX21mZF9zZGlvID0gewogCS5xdWlya3MJCT0gU0RIQ0lfUVVJUktfTk9fRU5EQVRUUl9JTl9OT1BERVNDLAorCS5hbGxvd19ydW50aW1lX3BtID0gdHJ1ZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfcGNpX2ZpeGVzIHNkaGNpX2ludGVsX21mZF9lbW1jID0gewogCS5xdWlya3MJCT0gU0RIQ0lfUVVJUktfTk9fRU5EQVRUUl9JTl9OT1BERVNDLAorCS5hbGxvd19ydW50aW1lX3BtID0gdHJ1ZSwKIAkucHJvYmVfc2xvdAk9IG1mZF9lbW1jX3Byb2JlX3Nsb3QsCisJLnJlbW92ZV9zbG90CT0gbWZkX2VtbWNfcmVtb3ZlX3Nsb3QsCiB9OwogCiAvKiBPMk1pY3JvIGV4dHJhIHJlZ2lzdGVycyAqLwpAQCAtODMyLDkgKzk2NCwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBzZGhjaV9wY2lfaHdfcmVzZXQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IHNkaGNpX3BjaV9zbG90ICpzbG90ID0gc2RoY2lfcHJpdihob3N0KTsKKwlpbnQgcnN0X25fZ3BpbyA9IHNsb3QtPnJzdF9uX2dwaW87CisKKwlpZiAoIWdwaW9faXNfdmFsaWQocnN0X25fZ3BpbykpCisJCXJldHVybjsKKwlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChyc3Rfbl9ncGlvLCAwKTsKKwkvKiBGb3IgZU1NQywgbWluaW11bSBpcyAxdXMgYnV0IGdpdmUgaXQgMTB1cyBmb3IgZ29vZCBtZWFzdXJlICovCisJdWRlbGF5KDEwKTsKKwlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChyc3Rfbl9ncGlvLCAxKTsKKwkvKiBGb3IgZU1NQywgbWluaW11bSBpcyAyMDB1cyBidXQgZ2l2ZSBpdCAzMDB1cyBmb3IgZ29vZCBtZWFzdXJlICovCisJdXNsZWVwX3JhbmdlKDMwMCwgMTAwMCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfb3BzIHNkaGNpX3BjaV9vcHMgPSB7CiAJLmVuYWJsZV9kbWEJPSBzZGhjaV9wY2lfZW5hYmxlX2RtYSwKIAkucGxhdGZvcm1fOGJpdF93aWR0aAk9IHNkaGNpX3BjaV84Yml0X3dpZHRoLAorCS5od19yZXNldAkJPSBzZGhjaV9wY2lfaHdfcmVzZXQsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCkBAIC05NDQsNiArMTA5Miw5NSBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorCitzdGF0aWMgaW50IHNkaGNpX3BjaV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldik7CisJc3RydWN0IHNkaGNpX3BjaV9jaGlwICpjaGlwOworCXN0cnVjdCBzZGhjaV9wY2lfc2xvdCAqc2xvdDsKKwlwbV9tZXNzYWdlX3Qgc3RhdGUgPSB7IC5ldmVudCA9IFBNX0VWRU5UX1NVU1BFTkQgfTsKKwlpbnQgaSwgcmV0OworCisJY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWNoaXApCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zbG90czsgaSsrKSB7CisJCXNsb3QgPSBjaGlwLT5zbG90c1tpXTsKKwkJaWYgKCFzbG90KQorCQkJY29udGludWU7CisKKwkJcmV0ID0gc2RoY2lfcnVudGltZV9zdXNwZW5kX2hvc3Qoc2xvdC0+aG9zdCk7CisKKwkJaWYgKHJldCkgeworCQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKQorCQkJCXNkaGNpX3J1bnRpbWVfcmVzdW1lX2hvc3QoY2hpcC0+c2xvdHNbaV0tPmhvc3QpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChjaGlwLT5maXhlcyAmJiBjaGlwLT5maXhlcy0+c3VzcGVuZCkgeworCQlyZXQgPSBjaGlwLT5maXhlcy0+c3VzcGVuZChjaGlwLCBzdGF0ZSk7CisJCWlmIChyZXQpIHsKKwkJCWZvciAoaSA9IGNoaXAtPm51bV9zbG90cyAtIDE7IGkgPj0gMDsgaS0tKQorCQkJCXNkaGNpX3J1bnRpbWVfcmVzdW1lX2hvc3QoY2hpcC0+c2xvdHNbaV0tPmhvc3QpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkaGNpX3BjaV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKKwlzdHJ1Y3Qgc2RoY2lfcGNpX2NoaXAgKmNoaXA7CisJc3RydWN0IHNkaGNpX3BjaV9zbG90ICpzbG90OworCWludCBpLCByZXQ7CisKKwljaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2hpcC0+Zml4ZXMgJiYgY2hpcC0+Zml4ZXMtPnJlc3VtZSkgeworCQlyZXQgPSBjaGlwLT5maXhlcy0+cmVzdW1lKGNoaXApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3Nsb3RzOyBpKyspIHsKKwkJc2xvdCA9IGNoaXAtPnNsb3RzW2ldOworCQlpZiAoIXNsb3QpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBzZGhjaV9ydW50aW1lX3Jlc3VtZV9ob3N0KHNsb3QtPmhvc3QpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZGhjaV9wY2lfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworI2RlZmluZSBzZGhjaV9wY2lfcnVudGltZV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc2RoY2lfcGNpX3J1bnRpbWVfcmVzdW1lCU5VTEwKKyNkZWZpbmUgc2RoY2lfcGNpX3J1bnRpbWVfaWRsZQkJTlVMTAorCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNkaGNpX3BjaV9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IHNkaGNpX3BjaV9ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lID0gc2RoY2lfcGNpX3J1bnRpbWVfcmVzdW1lLAorCS5ydW50aW1lX2lkbGUgPSBzZGhjaV9wY2lfcnVudGltZV9pZGxlLAorfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKiBEZXZpY2UgcHJvYmluZy9yZW1vdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKQEAgLTk4OCw2ICsxMjI1LDcgQEAKIAlzbG90LT5jaGlwID0gY2hpcDsKIAlzbG90LT5ob3N0ID0gaG9zdDsKIAlzbG90LT5wY2lfYmFyID0gYmFyOworCXNsb3QtPnJzdF9uX2dwaW8gPSAtRUlOVkFMOwogCiAJaG9zdC0+aHdfbmFtZSA9ICJQQ0kiOwogCWhvc3QtPm9wcyA9ICZzZGhjaV9wY2lfb3BzOwpAQCAtMTA1OCw2ICsxMjk2LDIxIEBACiAJc2RoY2lfZnJlZV9ob3N0KHNsb3QtPmhvc3QpOwogfQogCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2RoY2lfcGNpX3J1bnRpbWVfcG1fYWxsb3coc3RydWN0IGRldmljZSAqZGV2KQoreworCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCXBtX3J1bnRpbWVfYWxsb3coZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShkZXYsIDUwKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChkZXYpOworCXBtX3N1c3BlbmRfaWdub3JlX2NoaWxkcmVuKGRldiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzZGhjaV9wY2lfcnVudGltZV9wbV9mb3JiaWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXBtX3J1bnRpbWVfZm9yYmlkKGRldik7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgc2RoY2lfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTExMDcsOCArMTM2MCwxMCBAQAogCiAJY2hpcC0+cGRldiA9IHBkZXY7CiAJY2hpcC0+Zml4ZXMgPSAoY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyAqKWVudC0+ZHJpdmVyX2RhdGE7Ci0JaWYgKGNoaXAtPmZpeGVzKQorCWlmIChjaGlwLT5maXhlcykgewogCQljaGlwLT5xdWlya3MgPSBjaGlwLT5maXhlcy0+cXVpcmtzOworCQljaGlwLT5hbGxvd19ydW50aW1lX3BtID0gY2hpcC0+Zml4ZXMtPmFsbG93X3J1bnRpbWVfcG07CisJfQogCWNoaXAtPm51bV9zbG90cyA9IHNsb3RzOwogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNoaXApOwpAQCAtMTEzMyw2ICsxMzg4LDkgQEAKIAkJY2hpcC0+c2xvdHNbaV0gPSBzbG90OwogCX0KIAorCWlmIChjaGlwLT5hbGxvd19ydW50aW1lX3BtKQorCQlzZGhjaV9wY2lfcnVudGltZV9wbV9hbGxvdygmcGRldi0+ZGV2KTsKKwogCXJldHVybiAwOwogCiBmcmVlOgpAQCAtMTE1Miw2ICsxNDEwLDkgQEAKIAljaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJaWYgKGNoaXApIHsKKwkJaWYgKGNoaXAtPmFsbG93X3J1bnRpbWVfcG0pCisJCQlzZGhjaV9wY2lfcnVudGltZV9wbV9mb3JiaWQoJnBkZXYtPmRldik7CisKIAkJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zbG90czsgaSsrKQogCQkJc2RoY2lfcGNpX3JlbW92ZV9zbG90KGNoaXAtPnNsb3RzW2ldKTsKIApAQCAtMTE2OSw2ICsxNDMwLDkgQEAKIAkucmVtb3ZlID0JX19kZXZleGl0X3Aoc2RoY2lfcGNpX3JlbW92ZSksCiAJLnN1c3BlbmQgPQlzZGhjaV9wY2lfc3VzcGVuZCwKIAkucmVzdW1lCT0Jc2RoY2lfcGNpX3Jlc3VtZSwKKwkuZHJpdmVyID0JeworCQkucG0gPSAgICZzZGhjaV9wY2lfcG1fb3BzCisJfSwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwppbmRleCA2NDE0ZWZlLi5hOWUxMmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCkBAIC0yOSw2ICsyOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaWZkZWYgQ09ORklHX1BQQwogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYyLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYyLmMKaW5kZXggMzhmNTg5OS4uZDRiZjZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2Mi5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjIuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgpAQCAtNTksNyArNjAsNyBAQAogCQkgKiB0dW5lIHRpbWluZyBvZiByZWFkIGRhdGEvY29tbWFuZCB3aGVuIGNyYyBlcnJvciBoYXBwZW4KIAkJICogbm8gcGVyZm9ybWFuY2UgaW1wYWN0CiAJCSAqLwotCQlpZiAocGRhdGEtPmNsa19kZWxheV9zZWwgPT0gMSkgeworCQlpZiAocGRhdGEgJiYgcGRhdGEtPmNsa19kZWxheV9zZWwgPT0gMSkgewogCQkJdG1wID0gcmVhZHcoaG9zdC0+aW9hZGRyICsgU0RfQ0xPQ0tfQlVSU1RfU0laRV9TRVRVUCk7CiAKIAkJCXRtcCAmPSB+KFNEQ0xLX0RFTEFZX01BU0sgPDwgU0RDTEtfREVMQVlfU0hJRlQpOwpAQCAtNzEsNyArNzIsNyBAQAogCQkJd3JpdGV3KHRtcCwgaG9zdC0+aW9hZGRyICsgU0RfQ0xPQ0tfQlVSU1RfU0laRV9TRVRVUCk7CiAJCX0KIAotCQlpZiAocGRhdGEtPmZsYWdzICYgUFhBX0ZMQUdfRU5BQkxFX0NMT0NLX0dBVElORykgeworCQlpZiAocGRhdGEgJiYgKHBkYXRhLT5mbGFncyAmIFBYQV9GTEFHX0VOQUJMRV9DTE9DS19HQVRJTkcpKSB7CiAJCQl0bXAgPSByZWFkdyhob3N0LT5pb2FkZHIgKyBTRF9GSUZPX1BBUkFNKTsKIAkJCXRtcCAmPSB+Q0xLX0dBVEVfU0VUVElOR19CSVRTOwogCQkJd3JpdGV3KHRtcCwgaG9zdC0+aW9hZGRyICsgU0RfRklGT19QQVJBTSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYzLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYzLmMKaW5kZXggZmM3ZTRhNS4uY2ZmNGFkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2My5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjMuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvcHhhX3NkaGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAic2RoY2kuaCIKICNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXMzYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYwppbmRleCBmZTg4NmQ2Li4zZDAwZTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXMzYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktczNjLmMKQEAgLTIwMywxNyArMjAzLDIzIEBACiAJCXdyaXRlbChjdHJsLCBob3N0LT5pb2FkZHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwogCX0KIAotCS8qIHJlY29uZmlndXJlIHRoZSBoYXJkd2FyZSBmb3IgbmV3IGNsb2NrIHJhdGUgKi8KKwkvKiByZXByb2dyYW0gZGVmYXVsdCBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCisJd3JpdGVsKFMzQzY0WFhfU0RIQ0lfQ09OVFJPTDRfRFJJVkVfOW1BLAorCQlob3N0LT5pb2FkZHIgKyBTM0M2NFhYX1NESENJX0NPTlRST0w0KTsKIAotCXsKLQkJc3RydWN0IG1tY19pb3MgaW9zOworCWN0cmwgPSByZWFkbChob3N0LT5pb2FkZHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOworCWN0cmwgfD0gKFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5TVEFBU1lOQ0NMUiB8CisJCSAgUzNDNjRYWF9TREhDSV9DVFJMMl9FTkNNRENORk1TSyB8CisJCSAgUzNDX1NESENJX0NUUkwyX0VORkJDTEtSWCB8CisJCSAgUzNDX1NESENJX0NUUkwyX0RGQ05UX05PTkUgfAorCQkgIFMzQ19TREhDSV9DVFJMMl9FTkNMS09VVEhPTEQpOworCXdyaXRlbChjdHJsLCBob3N0LT5pb2FkZHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwogCi0JCWlvcy5jbG9jayA9IGNsb2NrOwotCi0JCWlmIChvdXJob3N0LT5wZGF0YS0+Y2ZnX2NhcmQpCi0JCQkob3VyaG9zdC0+cGRhdGEtPmNmZ19jYXJkKShvdXJob3N0LT5wZGV2LCBob3N0LT5pb2FkZHIsCi0JCQkJCQkgICAmaW9zLCBOVUxMKTsKLQl9CisJLyogcmVjb25maWd1cmUgdGhlIGNvbnRyb2xsZXIgZm9yIG5ldyBjbG9jayByYXRlICovCisJY3RybCA9IChTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwxIHwgUzNDX1NESENJX0NUUkwzX0ZDU0VMMCk7CisJaWYgKGNsb2NrIDwgMjUgKiAxMDAwMDAwKQorCQljdHJsIHw9IChTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwzIHwgUzNDX1NESENJX0NUUkwzX0ZDU0VMMik7CisJd3JpdGVsKGN0cmwsIGhvc3QtPmlvYWRkciArIFMzQ19TREhDSV9DT05UUk9MMyk7CiB9CiAKIC8qKgpAQCAtNTYxLDggKzU2NywxMCBAQAogCiAgZXJyX3JlcV9yZWdzOgogCWZvciAocHRyID0gMDsgcHRyIDwgTUFYX0JVU19DTEs7IHB0cisrKSB7Ci0JCWNsa19kaXNhYmxlKHNjLT5jbGtfYnVzW3B0cl0pOwotCQljbGtfcHV0KHNjLT5jbGtfYnVzW3B0cl0pOworCQlpZiAoc2MtPmNsa19idXNbcHRyXSkgeworCQkJY2xrX2Rpc2FibGUoc2MtPmNsa19idXNbcHRyXSk7CisJCQljbGtfcHV0KHNjLT5jbGtfYnVzW3B0cl0pOworCQl9CiAJfQogCiAgZXJyX25vX2J1c2Nsa3M6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXNwZWFyLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXNwZWFyLmMKaW5kZXggNjBhNGM5Ny4uNjNjYzhiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zcGVhci5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktc3BlYXIuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTE3Nyw4ICsxNzgsNiBAQAogCQkJCQlzZGhjaS0+ZGF0YS0+Y2FyZF9wb3dlcl9ncGlvKTsKIAkJCWdvdG8gZXJyX3BncGlvX2RpcmVjdGlvbjsKIAkJfQotCi0JCWdwaW9fc2V0X3ZhbHVlKHNkaGNpLT5kYXRhLT5jYXJkX3Bvd2VyX2dwaW8sIDEpOwogCX0KIAogCWlmIChzZGhjaS0+ZGF0YS0+Y2FyZF9pbnRfZ3BpbyA+PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMKaW5kZXggMThiMGJkMy4uODk2OTllOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYwpAQCAtMTMsMTUgKzEzLDIxIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorCisjaW5jbHVkZSA8bWFjaC9ncGlvLXRlZ3JhLmg+CiAjaW5jbHVkZSA8bWFjaC9zZGhjaS5oPgogCiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKQEAgLTczLDEwICs3OSw4IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdGVncmFfc2RoY2lfZ2V0X3JvKHN0cnVjdCBzZGhjaV9ob3N0ICpzZGhjaSkKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKG1tY19kZXYoc2RoY2ktPm1tYykpOwotCXN0cnVjdCB0ZWdyYV9zZGhjaV9wbGF0Zm9ybV9kYXRhICpwbGF0OwotCi0JcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihzZGhjaSk7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQgPSBwbHRmbV9ob3N0LT5wcml2OwogCiAJaWYgKCFncGlvX2lzX3ZhbGlkKHBsYXQtPndwX2dwaW8pKQogCQlyZXR1cm4gLTE7CkBAIC05NCwxMiArOTgsMTAgQEAKIAogc3RhdGljIGludCB0ZWdyYV9zZGhjaV84Yml0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgYnVzX3dpZHRoKQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UobW1jX2Rldihob3N0LT5tbWMpKTsKLQlzdHJ1Y3QgdGVncmFfc2RoY2lfcGxhdGZvcm1fZGF0YSAqcGxhdDsKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQgPSBwbHRmbV9ob3N0LT5wcml2OwogCXUzMiBjdHJsOwogCi0JcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCiAJY3RybCA9IHNkaGNpX3JlYWRiKGhvc3QsIFNESENJX0hPU1RfQ09OVFJPTCk7CiAJaWYgKHBsYXQtPmlzXzhiaXQgJiYgYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfOCkgewogCQljdHJsICY9IH5TREhDSV9DVFJMXzRCSVRCVVM7CkBAIC0xMzEsNiArMTMzLDM2IEBACiAJLm9wcyAgPSAmdGVncmFfc2RoY2lfb3BzLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RoY2lfdGVncmFfZHRfbWF0Y2hbXSBfX2RldmluaXRkYXRhID0geworCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtc2RoY2kiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2RoY2lfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCB0ZWdyYV9zZGhjaV9wbGF0Zm9ybV9kYXRhICogX19kZXZpbml0IHNkaGNpX3RlZ3JhX2R0X3BhcnNlX3BkYXRhKAorCQkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdGVncmFfc2RoY2lfcGxhdGZvcm1fZGF0YSAqcGxhdDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gTlVMTDsKKworCXBsYXQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwbGF0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbGF0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGFsbG9jYXRlIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwbGF0LT5jZF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJjZC1ncGlvcyIsIDApOworCXBsYXQtPndwX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgIndwLWdwaW9zIiwgMCk7CisJcGxhdC0+cG93ZXJfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAicG93ZXItZ3Bpb3MiLCAwKTsKKwlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgInN1cHBvcnQtOGJpdCIsIE5VTEwpKQorCQlwbGF0LT5pc184Yml0ID0gMTsKKworCXJldHVybiBwbGF0OworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzZGhjaV90ZWdyYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OwpAQCAtMTQ3LDEyICsxNzksMTcgQEAKIAogCXBsYXQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAorCWlmIChwbGF0ID09IE5VTEwpCisJCXBsYXQgPSBzZGhjaV90ZWdyYV9kdF9wYXJzZV9wZGF0YShwZGV2KTsKKwogCWlmIChwbGF0ID09IE5VTEwpIHsKIAkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlyYyA9IC1FTlhJTzsKIAkJZ290byBlcnJfbm9fcGxhdDsKIAl9CiAKKwlwbHRmbV9ob3N0LT5wcml2ID0gcGxhdDsKKwogCWlmIChncGlvX2lzX3ZhbGlkKHBsYXQtPnBvd2VyX2dwaW8pKSB7CiAJCXJjID0gZ3Bpb19yZXF1ZXN0KHBsYXQtPnBvd2VyX2dwaW8sICJzZGhjaV9wb3dlciIpOwogCQlpZiAocmMpIHsKQEAgLTI0NywxMyArMjg0LDExIEBACiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7Ci0Jc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQ7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQgPSBwbHRmbV9ob3N0LT5wcml2OwogCWludCBkZWFkID0gKHJlYWRsKGhvc3QtPmlvYWRkciArIFNESENJX0lOVF9TVEFUVVMpID09IDB4ZmZmZmZmZmYpOwogCiAJc2RoY2lfcmVtb3ZlX2hvc3QoaG9zdCwgZGVhZCk7CiAKLQlwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KIAlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT53cF9ncGlvKSkgewogCQl0ZWdyYV9ncGlvX2Rpc2FibGUocGxhdC0+d3BfZ3Bpbyk7CiAJCWdwaW9fZnJlZShwbGF0LT53cF9ncGlvKTsKQEAgLTI4Miw2ICszMTcsNyBAQAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJzZGhjaS10ZWdyYSIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzZGhjaV90ZWdyYV9kdF9tYXRjaCwKIAl9LAogCS5wcm9iZQkJPSBzZGhjaV90ZWdyYV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNkaGNpX3RlZ3JhX3JlbW92ZSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKaW5kZXggMGUwMmNjMS4uNmQ4ZWVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYwpAQCAtMTYsMTAgKzE2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KIApAQCAtNDEsNiArNDMsNyBAQAogI2RlZmluZSBNQVhfVFVOSU5HX0xPT1AgNDAKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1Z19xdWlya3MgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1Z19xdWlya3MyOwogCiBzdGF0aWMgdm9pZCBzZGhjaV9maW5pc2hfZGF0YShzdHJ1Y3Qgc2RoY2lfaG9zdCAqKTsKIApAQCAtNDksNTMgKzUyLDY3IEBACiBzdGF0aWMgaW50IHNkaGNpX2V4ZWN1dGVfdHVuaW5nKHN0cnVjdCBtbWNfaG9zdCAqbW1jKTsKIHN0YXRpYyB2b2lkIHNkaGNpX3R1bmluZ190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKK3N0YXRpYyBpbnQgc2RoY2lfcnVudGltZV9wbV9nZXQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOworc3RhdGljIGludCBzZGhjaV9ydW50aW1lX3BtX3B1dChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc2RoY2lfcnVudGltZV9wbV9nZXQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBzZGhjaV9ydW50aW1lX3BtX3B1dChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBzZGhjaV9kdW1wcmVncyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKIHsKLQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiA9PT09PT09PT09PSBSRUdJU1RFUiBEVU1QICglcyk9PT09PT09PT09PVxuIiwKKwlwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiA9PT09PT09PT09PSBSRUdJU1RFUiBEVU1QICglcyk9PT09PT09PT09PVxuIiwKIAkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogU3lzIGFkZHI6IDB4JTA4eCB8IFZlcnNpb246ICAweCUwOHhcbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogU3lzIGFkZHI6IDB4JTA4eCB8IFZlcnNpb246ICAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0RNQV9BRERSRVNTKSwKIAkJc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfSE9TVF9WRVJTSU9OKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQmxrIHNpemU6IDB4JTA4eCB8IEJsayBjbnQ6ICAweCUwOHhcbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogQmxrIHNpemU6IDB4JTA4eCB8IEJsayBjbnQ6ICAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0JMT0NLX1NJWkUpLAogCQlzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9CTE9DS19DT1VOVCkpOwotCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IEFyZ3VtZW50OiAweCUwOHggfCBUcm4gbW9kZTogMHglMDh4XG4iLAorCXByX2RlYnVnKERSSVZFUl9OQU1FICI6IEFyZ3VtZW50OiAweCUwOHggfCBUcm4gbW9kZTogMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkbChob3N0LCBTREhDSV9BUkdVTUVOVCksCiAJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX1RSQU5TRkVSX01PREUpKTsKLQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiBQcmVzZW50OiAgMHglMDh4IHwgSG9zdCBjdGw6IDB4JTA4eFxuIiwKKwlwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiBQcmVzZW50OiAgMHglMDh4IHwgSG9zdCBjdGw6IDB4JTA4eFxuIiwKIAkJc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfUFJFU0VOVF9TVEFURSksCiAJCXNkaGNpX3JlYWRiKGhvc3QsIFNESENJX0hPU1RfQ09OVFJPTCkpOwotCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IFBvd2VyOiAgICAweCUwOHggfCBCbGsgZ2FwOiAgMHglMDh4XG4iLAorCXByX2RlYnVnKERSSVZFUl9OQU1FICI6IFBvd2VyOiAgICAweCUwOHggfCBCbGsgZ2FwOiAgMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkYihob3N0LCBTREhDSV9QT1dFUl9DT05UUk9MKSwKIAkJc2RoY2lfcmVhZGIoaG9zdCwgU0RIQ0lfQkxPQ0tfR0FQX0NPTlRST0wpKTsKLQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiBXYWtlLXVwOiAgMHglMDh4IHwgQ2xvY2s6ICAgIDB4JTA4eFxuIiwKKwlwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiBXYWtlLXVwOiAgMHglMDh4IHwgQ2xvY2s6ICAgIDB4JTA4eFxuIiwKIAkJc2RoY2lfcmVhZGIoaG9zdCwgU0RIQ0lfV0FLRV9VUF9DT05UUk9MKSwKIAkJc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfQ0xPQ0tfQ09OVFJPTCkpOwotCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IFRpbWVvdXQ6ICAweCUwOHggfCBJbnQgc3RhdDogMHglMDh4XG4iLAorCXByX2RlYnVnKERSSVZFUl9OQU1FICI6IFRpbWVvdXQ6ICAweCUwOHggfCBJbnQgc3RhdDogMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkYihob3N0LCBTREhDSV9USU1FT1VUX0NPTlRST0wpLAogCQlzZGhjaV9yZWFkbChob3N0LCBTREhDSV9JTlRfU1RBVFVTKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogSW50IGVuYWI6IDB4JTA4eCB8IFNpZyBlbmFiOiAweCUwOHhcbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogSW50IGVuYWI6IDB4JTA4eCB8IFNpZyBlbmFiOiAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0lOVF9FTkFCTEUpLAogCQlzZGhjaV9yZWFkbChob3N0LCBTREhDSV9TSUdOQUxfRU5BQkxFKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQUMxMiBlcnI6IDB4JTA4eCB8IFNsb3QgaW50OiAweCUwOHhcbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogQUMxMiBlcnI6IDB4JTA4eCB8IFNsb3QgaW50OiAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0FDTUQxMl9FUlIpLAogCQlzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9TTE9UX0lOVF9TVEFUVVMpKTsKLQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiBDYXBzOiAgICAgMHglMDh4IHwgQ2Fwc18xOiAgIDB4JTA4eFxuIiwKKwlwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiBDYXBzOiAgICAgMHglMDh4IHwgQ2Fwc18xOiAgIDB4JTA4eFxuIiwKIAkJc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfQ0FQQUJJTElUSUVTKSwKIAkJc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfQ0FQQUJJTElUSUVTXzEpKTsKLQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiBDbWQ6ICAgICAgMHglMDh4IHwgTWF4IGN1cnI6IDB4JTA4eFxuIiwKKwlwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiBDbWQ6ICAgICAgMHglMDh4IHwgTWF4IGN1cnI6IDB4JTA4eFxuIiwKIAkJc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfQ09NTUFORCksCiAJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX01BWF9DVVJSRU5UKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogSG9zdCBjdGwyOiAweCUwOHhcbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogSG9zdCBjdGwyOiAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0hPU1RfQ09OVFJPTDIpKTsKIAogCWlmIChob3N0LT5mbGFncyAmIFNESENJX1VTRV9BRE1BKQotCQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiBBRE1BIEVycjogMHglMDh4IHwgQURNQSBQdHI6IDB4JTA4eFxuIiwKKwkJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogQURNQSBFcnI6IDB4JTA4eCB8IEFETUEgUHRyOiAweCUwOHhcbiIsCiAJCSAgICAgICByZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9BRE1BX0VSUk9SKSwKIAkJICAgICAgIHJlYWRsKGhvc3QtPmlvYWRkciArIFNESENJX0FETUFfQUREUkVTUykpOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKQEAgLTEzMiw2ICsxNDksOSBAQAogCWlmIChob3N0LT5xdWlya3MgJiBTREhDSV9RVUlSS19CUk9LRU5fQ0FSRF9ERVRFQ1RJT04pCiAJCXJldHVybjsKIAorCWlmIChob3N0LT5xdWlya3MyICYgU0RIQ0lfUVVJUksyX09XTl9DQVJEX0RFVEVDVElPTikKKwkJcmV0dXJuOworCiAJcHJlc2VudCA9IHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1BSRVNFTlRfU1RBVEUpICYKIAkJCSAgICAgIFNESENJX0NBUkRfUFJFU0VOVDsKIAlpcnFzID0gcHJlc2VudCA/IFNESENJX0lOVF9DQVJEX1JFTU9WRSA6IFNESENJX0lOVF9DQVJEX0lOU0VSVDsKQEAgLTE4MCw3ICsyMDAsNyBAQAogCS8qIGh3IGNsZWFycyB0aGUgYml0IHdoZW4gaXQncyBkb25lICovCiAJd2hpbGUgKHNkaGNpX3JlYWRiKGhvc3QsIFNESENJX1NPRlRXQVJFX1JFU0VUKSAmIG1hc2spIHsKIAkJaWYgKHRpbWVvdXQgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVzZXQgMHgleCBuZXZlciBjb21wbGV0ZWQuXG4iLAorCQkJcHJfZXJyKCIlczogUmVzZXQgMHgleCBuZXZlciBjb21wbGV0ZWQuXG4iLAogCQkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpLCAoaW50KW1hc2spOwogCQkJc2RoY2lfZHVtcHJlZ3MoaG9zdCk7CiAJCQlyZXR1cm47CkBAIC0yNTEsMTEgKzI3MSwxNCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAorCWlmIChob3N0LT5ydW50aW1lX3N1c3BlbmRlZCkKKwkJZ290byBvdXQ7CisKIAlpZiAoYnJpZ2h0bmVzcyA9PSBMRURfT0ZGKQogCQlzZGhjaV9kZWFjdGl2YXRlX2xlZChob3N0KTsKIAllbHNlCiAJCXNkaGNpX2FjdGl2YXRlX2xlZChob3N0KTsKLQorb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIH0KICNlbmRpZgpAQCAtNjU0LDcgKzY3Nyw3IEBACiAJfQogCiAJaWYgKGNvdW50ID49IDB4RikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIGxhcmdlIHRpbWVvdXQgcmVxdWVzdGVkIGZvciBDTUQlZCFcbiIsCisJCXByX3dhcm5pbmcoIiVzOiBUb28gbGFyZ2UgdGltZW91dCByZXF1ZXN0ZWQgZm9yIENNRCVkIVxuIiwKIAkJICAgICAgIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBjbWQtPm9wY29kZSk7CiAJCWNvdW50ID0gMHhFOwogCX0KQEAgLTk0OSw3ICs5NzIsNyBAQAogCiAJd2hpbGUgKHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1BSRVNFTlRfU1RBVEUpICYgbWFzaykgewogCQlpZiAodGltZW91dCA9PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb250cm9sbGVyIG5ldmVyIHJlbGVhc2VkICIKKwkJCXByX2VycigiJXM6IENvbnRyb2xsZXIgbmV2ZXIgcmVsZWFzZWQgIgogCQkJCSJpbmhpYml0IGJpdChzKS5cbiIsIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAkJCXNkaGNpX2R1bXByZWdzKGhvc3QpOwogCQkJY21kLT5lcnJvciA9IC1FSU87CkBAIC05NzEsNyArOTk0LDcgQEAKIAlzZGhjaV9zZXRfdHJhbnNmZXJfbW9kZShob3N0LCBjbWQpOwogCiAJaWYgKChjbWQtPmZsYWdzICYgTU1DX1JTUF8xMzYpICYmIChjbWQtPmZsYWdzICYgTU1DX1JTUF9CVVNZKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbnN1cHBvcnRlZCByZXNwb25zZSB0eXBlIVxuIiwKKwkJcHJfZXJyKCIlczogVW5zdXBwb3J0ZWQgcmVzcG9uc2UgdHlwZSFcbiIsCiAJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJCWNtZC0+ZXJyb3IgPSAtRUlOVkFMOwogCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT5maW5pc2hfdGFza2xldCk7CkBAIC0xMTIxLDcgKzExNDQsNyBAQAogCXdoaWxlICghKChjbGsgPSBzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9DTE9DS19DT05UUk9MKSkKIAkJJiBTREhDSV9DTE9DS19JTlRfU1RBQkxFKSkgewogCQlpZiAodGltZW91dCA9PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBjbG9jayBuZXZlciAiCisJCQlwcl9lcnIoIiVzOiBJbnRlcm5hbCBjbG9jayBuZXZlciAiCiAJCQkJInN0YWJpbGlzZWQuXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJCQlzZGhjaV9kdW1wcmVncyhob3N0KTsKIAkJCXJldHVybjsKQEAgLTEyMDksNiArMTIzMiw4IEBACiAKIAlob3N0ID0gbW1jX3ByaXYobW1jKTsKIAorCXNkaGNpX3J1bnRpbWVfcG1fZ2V0KGhvc3QpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAogCVdBUk5fT04oaG9zdC0+bXJxICE9IE5VTEwpOwpAQCAtMTI2OSwxNCArMTI5NCwxMSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgc2RoY2lfc2V0X2lvcyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19pb3MgKmlvcykKK3N0YXRpYyB2b2lkIHNkaGNpX2RvX3NldF9pb3Moc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfaW9zICppb3MpCiB7Ci0Jc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCBjdHJsOwogCi0JaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGhvc3QtPmZsYWdzICYgU0RIQ0lfREVWSUNFX0RFQUQpCkBAIC0xNDI2LDcgKzE0NDgsMTYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfcm8oc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCitzdGF0aWMgdm9pZCBzZGhjaV9zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQoreworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCXNkaGNpX3J1bnRpbWVfcG1fZ2V0KGhvc3QpOworCXNkaGNpX2RvX3NldF9pb3MoaG9zdCwgaW9zKTsKKwlzZGhjaV9ydW50aW1lX3BtX3B1dChob3N0KTsKK30KKworc3RhdGljIGludCBzZGhjaV9jaGVja19ybyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpc19yZWFkb25seTsKQEAgLTE0NTAsMTkgKzE0ODEsMTYgQEAKIAogI2RlZmluZSBTQU1QTEVfQ09VTlQJNQogCi1zdGF0aWMgaW50IHNkaGNpX2dldF9ybyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKK3N0YXRpYyBpbnQgc2RoY2lfZG9fZ2V0X3JvKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQogewotCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCWludCBpLCByb19jb3VudDsKIAotCWhvc3QgPSBtbWNfcHJpdihtbWMpOwotCiAJaWYgKCEoaG9zdC0+cXVpcmtzICYgU0RIQ0lfUVVJUktfVU5TVEFCTEVfUk9fREVURUNUKSkKLQkJcmV0dXJuIGNoZWNrX3JvKGhvc3QpOworCQlyZXR1cm4gc2RoY2lfY2hlY2tfcm8oaG9zdCk7CiAKIAlyb19jb3VudCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IFNBTVBMRV9DT1VOVDsgaSsrKSB7Ci0JCWlmIChjaGVja19ybyhob3N0KSkgeworCQlpZiAoc2RoY2lfY2hlY2tfcm8oaG9zdCkpIHsKIAkJCWlmICgrK3JvX2NvdW50ID4gU0FNUExFX0NPVU5UIC8gMikKIAkJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMTQ3MSwzOCArMTQ5OSw2NCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzZGhjaV9lbmFibGVfc2Rpb19pcnEoc3RydWN0IG1tY19ob3N0ICptbWMsIGludCBlbmFibGUpCitzdGF0aWMgdm9pZCBzZGhjaV9od19yZXNldChzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKIHsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAotCWhvc3QgPSBtbWNfcHJpdihtbWMpOworCWlmIChob3N0LT5vcHMgJiYgaG9zdC0+b3BzLT5od19yZXNldCkKKwkJaG9zdC0+b3BzLT5od19yZXNldChob3N0KTsKK30KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CitzdGF0aWMgaW50IHNkaGNpX2dldF9ybyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKK3sKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJaW50IHJldDsKIAorCXNkaGNpX3J1bnRpbWVfcG1fZ2V0KGhvc3QpOworCXJldCA9IHNkaGNpX2RvX2dldF9ybyhob3N0KTsKKwlzZGhjaV9ydW50aW1lX3BtX3B1dChob3N0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZGhjaV9lbmFibGVfc2Rpb19pcnFfbm9sb2NrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgZW5hYmxlKQorewogCWlmIChob3N0LT5mbGFncyAmIFNESENJX0RFVklDRV9ERUFEKQogCQlnb3RvIG91dDsKIAogCWlmIChlbmFibGUpCisJCWhvc3QtPmZsYWdzIHw9IFNESENJX1NESU9fSVJRX0VOQUJMRUQ7CisJZWxzZQorCQlob3N0LT5mbGFncyAmPSB+U0RIQ0lfU0RJT19JUlFfRU5BQkxFRDsKKworCS8qIFNESU8gSVJRIHdpbGwgYmUgZW5hYmxlZCBhcyBhcHByb3ByaWF0ZSBpbiBydW50aW1lIHJlc3VtZSAqLworCWlmIChob3N0LT5ydW50aW1lX3N1c3BlbmRlZCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZW5hYmxlKQogCQlzZGhjaV91bm1hc2tfaXJxcyhob3N0LCBTREhDSV9JTlRfQ0FSRF9JTlQpOwogCWVsc2UKIAkJc2RoY2lfbWFza19pcnFzKGhvc3QsIFNESENJX0lOVF9DQVJEX0lOVCk7CiBvdXQ6CiAJbW1pb3diKCk7Cit9CiAKK3N0YXRpYyB2b2lkIHNkaGNpX2VuYWJsZV9zZGlvX2lycShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CisJc2RoY2lfZW5hYmxlX3NkaW9faXJxX25vbG9jayhob3N0LCBlbmFibGUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBzZGhjaV9zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2goc3RydWN0IG1tY19ob3N0ICptbWMsCi0Jc3RydWN0IG1tY19pb3MgKmlvcykKK3N0YXRpYyBpbnQgc2RoY2lfZG9fc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAorCQkJCQkJc3RydWN0IG1tY19pb3MgKmlvcykKIHsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAl1OCBwd3I7CiAJdTE2IGNsaywgY3RybDsKIAl1MzIgcHJlc2VudF9zdGF0ZTsKIAotCWhvc3QgPSBtbWNfcHJpdihtbWMpOwotCiAJLyoKIAkgKiBTaWduYWwgVm9sdGFnZSBTd2l0Y2hpbmcgaXMgb25seSBhcHBsaWNhYmxlIGZvciBIb3N0IENvbnRyb2xsZXJzCiAJICogdjMuMDAgYW5kIGFib3ZlLgpAQCAtMTUyOCw3ICsxNTgyLDcgQEAKIAkJaWYgKCEoY3RybCAmIFNESENJX0NUUkxfVkREXzE4MCkpCiAJCQlyZXR1cm4gMDsKIAkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IFN3aXRjaGluZyB0byAzLjNWICIKKwkJCXByX2luZm8oRFJJVkVSX05BTUUgIjogU3dpdGNoaW5nIHRvIDMuM1YgIgogCQkJCSJzaWduYWxsaW5nIHZvbHRhZ2UgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0xNTg3LDcgKzE2NDEsNyBAQAogCQlwd3IgfD0gU0RIQ0lfUE9XRVJfT047CiAJCXNkaGNpX3dyaXRlYihob3N0LCBwd3IsIFNESENJX1BPV0VSX0NPTlRST0wpOwogCi0JCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogU3dpdGNoaW5nIHRvIDEuOFYgc2lnbmFsbGluZyAiCisJCXByX2luZm8oRFJJVkVSX05BTUUgIjogU3dpdGNoaW5nIHRvIDEuOFYgc2lnbmFsbGluZyAiCiAJCQkidm9sdGFnZSBmYWlsZWQsIHJldHJ5aW5nIHdpdGggUzE4UiBzZXQgdG8gMFxuIik7CiAJCXJldHVybiAtRUFHQUlOOwogCX0gZWxzZQpAQCAtMTU5NSw2ICsxNjQ5LDIwIEBACiAJCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNkaGNpX3N0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaChzdHJ1Y3QgbW1jX2hvc3QgKm1tYywKKwlzdHJ1Y3QgbW1jX2lvcyAqaW9zKQoreworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlpbnQgZXJyOworCisJaWYgKGhvc3QtPnZlcnNpb24gPCBTREhDSV9TUEVDXzMwMCkKKwkJcmV0dXJuIDA7CisJc2RoY2lfcnVudGltZV9wbV9nZXQoaG9zdCk7CisJZXJyID0gc2RoY2lfZG9fc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoKGhvc3QsIGlvcyk7CisJc2RoY2lfcnVudGltZV9wbV9wdXQoaG9zdCk7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBzZGhjaV9leGVjdXRlX3R1bmluZyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKIHsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKQEAgLTE2MDYsNiArMTY3NCw3IEBACiAKIAlob3N0ID0gbW1jX3ByaXYobW1jKTsKIAorCXNkaGNpX3J1bnRpbWVfcG1fZ2V0KGhvc3QpOwogCWRpc2FibGVfaXJxKGhvc3QtPmlycSk7CiAJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKIApAQCAtMTYyMyw2ICsxNjkyLDcgQEAKIAllbHNlIHsKIAkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogCQllbmFibGVfaXJxKGhvc3QtPmlycSk7CisJCXNkaGNpX3J1bnRpbWVfcG1fcHV0KGhvc3QpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE2NDgsNyArMTcxOCw3IEBACiAJdGltZW91dCA9IDE1MDsKIAlkbyB7CiAJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07Ci0JCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7TlVMTH07CiAKIAkJaWYgKCF0dW5pbmdfbG9vcF9jb3VudGVyICYmICF0aW1lb3V0KQogCQkJYnJlYWs7CkBAIC0xNjk0LDcgKzE3NjQsNyBAQAogCQlzcGluX2xvY2soJmhvc3QtPmxvY2spOwogCiAJCWlmICghaG9zdC0+dHVuaW5nX2RvbmUpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogVGltZW91dCB3YWl0aW5nIGZvciAiCisJCQlwcl9pbmZvKERSSVZFUl9OQU1FICI6IFRpbWVvdXQgd2FpdGluZyBmb3IgIgogCQkJCSJCdWZmZXIgUmVhZCBSZWFkeSBpbnRlcnJ1cHQgZHVyaW5nIHR1bmluZyAiCiAJCQkJInByb2NlZHVyZSwgZmFsbGluZyBiYWNrIHRvIGZpeGVkIHNhbXBsaW5nICIKIAkJCQkiY2xvY2tcbiIpOwpAQCAtMTcyNCw3ICsxNzk0LDcgQEAKIAkJc2RoY2lfd3JpdGV3KGhvc3QsIGN0cmwsIFNESENJX0hPU1RfQ09OVFJPTDIpOwogCX0gZWxzZSB7CiAJCWlmICghKGN0cmwgJiBTREhDSV9DVFJMX1RVTkVEX0NMSykpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogVHVuaW5nIHByb2NlZHVyZSIKKwkJCXByX2luZm8oRFJJVkVSX05BTUUgIjogVHVuaW5nIHByb2NlZHVyZSIKIAkJCQkiIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGZpeGVkIHNhbXBsaW5nIgogCQkJCSIgY2xvY2tcbiIpOwogCQkJZXJyID0gLUVJTzsKQEAgLTE3NjYsMTggKzE4MzYsMTYgQEAKIAlzZGhjaV9jbGVhcl9zZXRfaXJxcyhob3N0LCBTREhDSV9JTlRfREFUQV9BVkFJTCwgaWVyKTsKIAlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CiAJZW5hYmxlX2lycShob3N0LT5pcnEpOworCXNkaGNpX3J1bnRpbWVfcG1fcHV0KGhvc3QpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgc2RoY2lfZW5hYmxlX3ByZXNldF92YWx1ZShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgYm9vbCBlbmFibGUpCitzdGF0aWMgdm9pZCBzZGhjaV9kb19lbmFibGVfcHJlc2V0X3ZhbHVlKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBib29sIGVuYWJsZSkKIHsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAl1MTYgY3RybDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0KIAkvKiBIb3N0IENvbnRyb2xsZXIgdjMuMDAgZGVmaW5lcyBwcmVzZXQgdmFsdWUgcmVnaXN0ZXJzICovCiAJaWYgKGhvc3QtPnZlcnNpb24gPCBTREhDSV9TUEVDXzMwMCkKIAkJcmV0dXJuOwpAQCAtMTc5MywxOCArMTg2MSwzMCBAQAogCWlmIChlbmFibGUgJiYgIShjdHJsICYgU0RIQ0lfQ1RSTF9QUkVTRVRfVkFMX0VOQUJMRSkpIHsKIAkJY3RybCB8PSBTREhDSV9DVFJMX1BSRVNFVF9WQUxfRU5BQkxFOwogCQlzZGhjaV93cml0ZXcoaG9zdCwgY3RybCwgU0RIQ0lfSE9TVF9DT05UUk9MMik7CisJCWhvc3QtPmZsYWdzIHw9IFNESENJX1BWX0VOQUJMRUQ7CiAJfSBlbHNlIGlmICghZW5hYmxlICYmIChjdHJsICYgU0RIQ0lfQ1RSTF9QUkVTRVRfVkFMX0VOQUJMRSkpIHsKIAkJY3RybCAmPSB+U0RIQ0lfQ1RSTF9QUkVTRVRfVkFMX0VOQUJMRTsKIAkJc2RoY2lfd3JpdGV3KGhvc3QsIGN0cmwsIFNESENJX0hPU1RfQ09OVFJPTDIpOworCQlob3N0LT5mbGFncyAmPSB+U0RIQ0lfUFZfRU5BQkxFRDsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIHNkaGNpX2VuYWJsZV9wcmVzZXRfdmFsdWUoc3RydWN0IG1tY19ob3N0ICptbWMsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCXNkaGNpX3J1bnRpbWVfcG1fZ2V0KGhvc3QpOworCXNkaGNpX2RvX2VuYWJsZV9wcmVzZXRfdmFsdWUoaG9zdCwgZW5hYmxlKTsKKwlzZGhjaV9ydW50aW1lX3BtX3B1dChob3N0KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgc2RoY2lfb3BzID0gewogCS5yZXF1ZXN0CT0gc2RoY2lfcmVxdWVzdCwKIAkuc2V0X2lvcwk9IHNkaGNpX3NldF9pb3MsCiAJLmdldF9ybwkJPSBzZGhjaV9nZXRfcm8sCisJLmh3X3Jlc2V0CT0gc2RoY2lfaHdfcmVzZXQsCiAJLmVuYWJsZV9zZGlvX2lycSA9IHNkaGNpX2VuYWJsZV9zZGlvX2lycSwKIAkuc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoCT0gc2RoY2lfc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoLAogCS5leGVjdXRlX3R1bmluZwkJCT0gc2RoY2lfZXhlY3V0ZV90dW5pbmcsCkBAIC0xODI2LDE5ICsxOTA2LDE5IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKCEoc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfUFJFU0VOVF9TVEFURSkgJiBTREhDSV9DQVJEX1BSRVNFTlQpKSB7Ci0JCWlmIChob3N0LT5tcnEpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhcmQgcmVtb3ZlZCBkdXJpbmcgdHJhbnNmZXIhXG4iLAotCQkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlc2V0dGluZyBjb250cm9sbGVyLlxuIiwKLQkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CisJLyogQ2hlY2sgaG9zdC0+bXJxIGZpcnN0IGluIGNhc2Ugd2UgYXJlIHJ1bnRpbWUgc3VzcGVuZGVkICovCisJaWYgKGhvc3QtPm1ycSAmJgorCSAgICAhKHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1BSRVNFTlRfU1RBVEUpICYgU0RIQ0lfQ0FSRF9QUkVTRU5UKSkgeworCQlwcl9lcnIoIiVzOiBDYXJkIHJlbW92ZWQgZHVyaW5nIHRyYW5zZmVyIVxuIiwKKwkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKKwkJcHJfZXJyKCIlczogUmVzZXR0aW5nIGNvbnRyb2xsZXIuXG4iLAorCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCi0JCQlzZGhjaV9yZXNldChob3N0LCBTREhDSV9SRVNFVF9DTUQpOwotCQkJc2RoY2lfcmVzZXQoaG9zdCwgU0RIQ0lfUkVTRVRfREFUQSk7CisJCXNkaGNpX3Jlc2V0KGhvc3QsIFNESENJX1JFU0VUX0NNRCk7CisJCXNkaGNpX3Jlc2V0KGhvc3QsIFNESENJX1JFU0VUX0RBVEEpOwogCi0JCQlob3N0LT5tcnEtPmNtZC0+ZXJyb3IgPSAtRU5PTUVESVVNOwotCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+ZmluaXNoX3Rhc2tsZXQpOwotCQl9CisJCWhvc3QtPm1ycS0+Y21kLT5lcnJvciA9IC1FTk9NRURJVU07CisJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmZpbmlzaF90YXNrbGV0KTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CkBAIC0xODU0LDE0ICsxOTM0LDE2IEBACiAKIAlob3N0ID0gKHN0cnVjdCBzZGhjaV9ob3N0KilwYXJhbTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CisKICAgICAgICAgLyoKICAgICAgICAgICogSWYgdGhpcyB0YXNrbGV0IGdldHMgcmVzY2hlZHVsZWQgd2hpbGUgcnVubmluZywgaXQgd2lsbAogICAgICAgICAgKiBiZSBydW4gYWdhaW4gYWZ0ZXJ3YXJkcyBidXQgd2l0aG91dCBhbnkgYWN0aXZlIHJlcXVlc3QuCiAgICAgICAgICAqLwotCWlmICghaG9zdC0+bXJxKQorCWlmICghaG9zdC0+bXJxKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwl9CiAKIAlkZWxfdGltZXIoJmhvc3QtPnRpbWVyKTsKIApAQCAtMTkwNSw2ICsxOTg3LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKIAltbWNfcmVxdWVzdF9kb25lKGhvc3QtPm1tYywgbXJxKTsKKwlzZGhjaV9ydW50aW1lX3BtX3B1dChob3N0KTsKIH0KIAogc3RhdGljIHZvaWQgc2RoY2lfdGltZW91dF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCkBAIC0xOTE3LDcgKzIwMDAsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoaG9zdC0+bXJxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFRpbWVvdXQgd2FpdGluZyBmb3IgaGFyZHdhcmUgIgorCQlwcl9lcnIoIiVzOiBUaW1lb3V0IHdhaXRpbmcgZm9yIGhhcmR3YXJlICIKIAkJCSJpbnRlcnJ1cHQuXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJCXNkaGNpX2R1bXByZWdzKGhvc3QpOwogCkBAIC0xOTYzLDcgKzIwNDYsNyBAQAogCUJVR19PTihpbnRtYXNrID09IDApOwogCiAJaWYgKCFob3N0LT5jbWQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogR290IGNvbW1hbmQgaW50ZXJydXB0IDB4JTA4eCBldmVuICIKKwkJcHJfZXJyKCIlczogR290IGNvbW1hbmQgaW50ZXJydXB0IDB4JTA4eCBldmVuICIKIAkJCSJ0aG91Z2ggbm8gY29tbWFuZCBvcGVyYXRpb24gd2FzIGluIHByb2dyZXNzLlxuIiwKIAkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpLCAodW5zaWduZWQpaW50bWFzayk7CiAJCXNkaGNpX2R1bXByZWdzKGhvc3QpOwpAQCAtMjA2Myw3ICsyMTQ2LDcgQEAKIAkJCX0KIAkJfQogCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEdvdCBkYXRhIGludGVycnVwdCAweCUwOHggZXZlbiAiCisJCXByX2VycigiJXM6IEdvdCBkYXRhIGludGVycnVwdCAweCUwOHggZXZlbiAiCiAJCQkidGhvdWdoIG5vIGRhdGEgb3BlcmF0aW9uIHdhcyBpbiBwcm9ncmVzcy5cbiIsCiAJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgKHVuc2lnbmVkKWludG1hc2spOwogCQlzZGhjaV9kdW1wcmVncyhob3N0KTsKQEAgLTIwODAsNyArMjE2Myw3IEBACiAJCQkhPSBNTUNfQlVTX1RFU1RfUikKIAkJaG9zdC0+ZGF0YS0+ZXJyb3IgPSAtRUlMU0VROwogCWVsc2UgaWYgKGludG1hc2sgJiBTREhDSV9JTlRfQURNQV9FUlJPUikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBBRE1BIGVycm9yXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CisJCXByX2VycigiJXM6IEFETUEgZXJyb3JcbiIsIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAkJc2RoY2lfc2hvd19hZG1hX2Vycm9yKGhvc3QpOwogCQlob3N0LT5kYXRhLT5lcnJvciA9IC1FSU87CiAJfQpAQCAtMjEzNiwxMiArMjIxOSwxOSBAQAogc3RhdGljIGlycXJldHVybl90IHNkaGNpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJaXJxcmV0dXJuX3QgcmVzdWx0OwotCXN0cnVjdCBzZGhjaV9ob3N0KiBob3N0ID0gZGV2X2lkOworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gZGV2X2lkOwogCXUzMiBpbnRtYXNrOwogCWludCBjYXJkaW50ID0gMDsKIAogCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CiAKKwlpZiAoaG9zdC0+cnVudGltZV9zdXNwZW5kZWQpIHsKKwkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOworCQlwcl93YXJuaW5nKCIlczogZ290IGlycSB3aGlsZSBydW50aW1lIHN1c3BlbmRlZFxuIiwKKwkJICAgICAgIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwogCWludG1hc2sgPSBzZGhjaV9yZWFkbChob3N0LCBTREhDSV9JTlRfU1RBVFVTKTsKIAogCWlmICghaW50bWFzayB8fCBpbnRtYXNrID09IDB4ZmZmZmZmZmYpIHsKQEAgLTIxOTQsNyArMjI4NCw3IEBACiAJaW50bWFzayAmPSB+U0RIQ0lfSU5UX0VSUk9SOwogCiAJaWYgKGludG1hc2sgJiBTREhDSV9JTlRfQlVTX1BPV0VSKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENhcmQgaXMgY29uc3VtaW5nIHRvbyBtdWNoIHBvd2VyIVxuIiwKKwkJcHJfZXJyKCIlczogQ2FyZCBpcyBjb25zdW1pbmcgdG9vIG11Y2ggcG93ZXIhXG4iLAogCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCQlzZGhjaV93cml0ZWwoaG9zdCwgU0RIQ0lfSU5UX0JVU19QT1dFUiwgU0RIQ0lfSU5UX1NUQVRVUyk7CiAJfQpAQCAtMjIwNyw3ICsyMjk3LDcgQEAKIAlpbnRtYXNrICY9IH5TREhDSV9JTlRfQ0FSRF9JTlQ7CiAKIAlpZiAoaW50bWFzaykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmV4cGVjdGVkIGludGVycnVwdCAweCUwOHguXG4iLAorCQlwcl9lcnIoIiVzOiBVbmV4cGVjdGVkIGludGVycnVwdCAweCUwOHguXG4iLAogCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIGludG1hc2spOwogCQlzZGhjaV9kdW1wcmVncyhob3N0KTsKIApAQCAtMjI3NSw3ICsyMzY1LDYgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0KIAlpZiAoaG9zdC0+ZmxhZ3MgJiAoU0RIQ0lfVVNFX1NETUEgfCBTREhDSV9VU0VfQURNQSkpIHsKIAkJaWYgKGhvc3QtPm9wcy0+ZW5hYmxlX2RtYSkKIAkJCWhvc3QtPm9wcy0+ZW5hYmxlX2RtYShob3N0KTsKQEAgLTIzMTQsNiArMjQwMyw5MCBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorCitzdGF0aWMgaW50IHNkaGNpX3J1bnRpbWVfcG1fZ2V0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQoreworCXJldHVybiBwbV9ydW50aW1lX2dldF9zeW5jKGhvc3QtPm1tYy0+cGFyZW50KTsKK30KKworc3RhdGljIGludCBzZGhjaV9ydW50aW1lX3BtX3B1dChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3sKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGhvc3QtPm1tYy0+cGFyZW50KTsKKwlyZXR1cm4gcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoaG9zdC0+bW1jLT5wYXJlbnQpOworfQorCitpbnQgc2RoY2lfcnVudGltZV9zdXNwZW5kX2hvc3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgdHVuaW5nIHNpbmNlIHdlIGFyZSBzdXNwZW5kaW5nICovCisJaWYgKGhvc3QtPnZlcnNpb24gPj0gU0RIQ0lfU1BFQ18zMDAgJiYKKwkgICAgaG9zdC0+dHVuaW5nX21vZGUgPT0gU0RIQ0lfVFVOSU5HX01PREVfMSkgeworCQlkZWxfdGltZXJfc3luYygmaG9zdC0+dHVuaW5nX3RpbWVyKTsKKwkJaG9zdC0+ZmxhZ3MgJj0gflNESENJX05FRURTX1JFVFVOSU5HOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CisJc2RoY2lfbWFza19pcnFzKGhvc3QsIFNESENJX0lOVF9BTExfTUFTSyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCisJc3luY2hyb25pemVfaXJxKGhvc3QtPmlycSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCWhvc3QtPnJ1bnRpbWVfc3VzcGVuZGVkID0gdHJ1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2RoY2lfcnVudGltZV9zdXNwZW5kX2hvc3QpOworCitpbnQgc2RoY2lfcnVudGltZV9yZXN1bWVfaG9zdChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwLCBob3N0X2ZsYWdzID0gaG9zdC0+ZmxhZ3M7CisKKwlpZiAoaG9zdF9mbGFncyAmIChTREhDSV9VU0VfU0RNQSB8IFNESENJX1VTRV9BRE1BKSkgeworCQlpZiAoaG9zdC0+b3BzLT5lbmFibGVfZG1hKQorCQkJaG9zdC0+b3BzLT5lbmFibGVfZG1hKGhvc3QpOworCX0KKworCXNkaGNpX2luaXQoaG9zdCwgMCk7CisKKwkvKiBGb3JjZSBjbG9jayBhbmQgcG93ZXIgcmUtcHJvZ3JhbSAqLworCWhvc3QtPnB3ciA9IDA7CisJaG9zdC0+Y2xvY2sgPSAwOworCXNkaGNpX2RvX3NldF9pb3MoaG9zdCwgJmhvc3QtPm1tYy0+aW9zKTsKKworCXNkaGNpX2RvX3N0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaChob3N0LCAmaG9zdC0+bW1jLT5pb3MpOworCWlmIChob3N0X2ZsYWdzICYgU0RIQ0lfUFZfRU5BQkxFRCkKKwkJc2RoY2lfZG9fZW5hYmxlX3ByZXNldF92YWx1ZShob3N0LCB0cnVlKTsKKworCS8qIFNldCB0aGUgcmUtdHVuaW5nIGV4cGlyYXRpb24gZmxhZyAqLworCWlmICgoaG9zdC0+dmVyc2lvbiA+PSBTREhDSV9TUEVDXzMwMCkgJiYgaG9zdC0+dHVuaW5nX2NvdW50ICYmCisJICAgIChob3N0LT50dW5pbmdfbW9kZSA9PSBTREhDSV9UVU5JTkdfTU9ERV8xKSkKKwkJaG9zdC0+ZmxhZ3MgfD0gU0RIQ0lfTkVFRFNfUkVUVU5JTkc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCisJaG9zdC0+cnVudGltZV9zdXNwZW5kZWQgPSBmYWxzZTsKKworCS8qIEVuYWJsZSBTRElPIElSUSAqLworCWlmICgoaG9zdC0+ZmxhZ3MgJiBTREhDSV9TRElPX0lSUV9FTkFCTEVEKSkKKwkJc2RoY2lfZW5hYmxlX3NkaW9faXJxX25vbG9jayhob3N0LCB0cnVlKTsKKworCS8qIEVuYWJsZSBDYXJkIERldGVjdGlvbiAqLworCXNkaGNpX2VuYWJsZV9jYXJkX2RldGVjdGlvbihob3N0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzZGhjaV9ydW50aW1lX3Jlc3VtZV9ob3N0KTsKKworI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogRGV2aWNlIGFsbG9jYXRpb24vcmVnaXN0cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCkBAIC0yMzU2LDYgKzI1MjksOCBAQAogCiAJaWYgKGRlYnVnX3F1aXJrcykKIAkJaG9zdC0+cXVpcmtzID0gZGVidWdfcXVpcmtzOworCWlmIChkZWJ1Z19xdWlya3MyKQorCQlob3N0LT5xdWlya3MyID0gZGVidWdfcXVpcmtzMjsKIAogCXNkaGNpX3Jlc2V0KGhvc3QsIFNESENJX1JFU0VUX0FMTCk7CiAKQEAgLTIzNjMsNyArMjUzOCw3IEBACiAJaG9zdC0+dmVyc2lvbiA9IChob3N0LT52ZXJzaW9uICYgU0RIQ0lfU1BFQ19WRVJfTUFTSykKIAkJCQk+PiBTREhDSV9TUEVDX1ZFUl9TSElGVDsKIAlpZiAoaG9zdC0+dmVyc2lvbiA+IFNESENJX1NQRUNfMzAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVua25vd24gY29udHJvbGxlciB2ZXJzaW9uICglZCkuICIKKwkJcHJfZXJyKCIlczogVW5rbm93biBjb250cm9sbGVyIHZlcnNpb24gKCVkKS4gIgogCQkJIllvdSBtYXkgZXhwZXJpZW5jZSBwcm9ibGVtcy5cbiIsIG1tY19ob3N0bmFtZShtbWMpLAogCQkJaG9zdC0+dmVyc2lvbik7CiAJfQpAQCAtMjQwMCw3ICsyNTc1LDcgQEAKIAlpZiAoaG9zdC0+ZmxhZ3MgJiAoU0RIQ0lfVVNFX1NETUEgfCBTREhDSV9VU0VfQURNQSkpIHsKIAkJaWYgKGhvc3QtPm9wcy0+ZW5hYmxlX2RtYSkgewogCQkJaWYgKGhvc3QtPm9wcy0+ZW5hYmxlX2RtYShob3N0KSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyBzdWl0YWJsZSBETUEgIgorCQkJCXByX3dhcm5pbmcoIiVzOiBObyBzdWl0YWJsZSBETUEgIgogCQkJCQkiYXZhaWxhYmxlLiBGYWxsaW5nIGJhY2sgdG8gUElPLlxuIiwKIAkJCQkJbW1jX2hvc3RuYW1lKG1tYykpOwogCQkJCWhvc3QtPmZsYWdzICY9CkBAIC0yNDIwLDcgKzI1OTUsNyBAQAogCQlpZiAoIWhvc3QtPmFkbWFfZGVzYyB8fCAhaG9zdC0+YWxpZ25fYnVmZmVyKSB7CiAJCQlrZnJlZShob3N0LT5hZG1hX2Rlc2MpOwogCQkJa2ZyZWUoaG9zdC0+YWxpZ25fYnVmZmVyKTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgQURNQSAiCisJCQlwcl93YXJuaW5nKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIEFETUEgIgogCQkJCSJidWZmZXJzLiBGYWxsaW5nIGJhY2sgdG8gc3RhbmRhcmQgRE1BLlxuIiwKIAkJCQltbWNfaG9zdG5hbWUobW1jKSk7CiAJCQlob3N0LT5mbGFncyAmPSB+U0RIQ0lfVVNFX0FETUE7CkBAIC0yNDQ4LDggKzI2MjMsNyBAQAogCWlmIChob3N0LT5tYXhfY2xrID09IDAgfHwgaG9zdC0+cXVpcmtzICYKIAkJCVNESENJX1FVSVJLX0NBUF9DTE9DS19CQVNFX0JST0tFTikgewogCQlpZiAoIWhvc3QtPm9wcy0+Z2V0X21heF9jbG9jaykgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiBIYXJkd2FyZSBkb2Vzbid0IHNwZWNpZnkgYmFzZSBjbG9jayAiCisJCQlwcl9lcnIoIiVzOiBIYXJkd2FyZSBkb2Vzbid0IHNwZWNpZnkgYmFzZSBjbG9jayAiCiAJCQkgICAgICAgImZyZXF1ZW5jeS5cbiIsIG1tY19ob3N0bmFtZShtbWMpKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CkBAIC0yNDk1LDggKzI2NjksNyBAQAogCQkJaG9zdC0+dGltZW91dF9jbGsgPSBob3N0LT5vcHMtPmdldF90aW1lb3V0X2Nsb2NrKGhvc3QpOwogCQl9IGVsc2UgaWYgKCEoaG9zdC0+cXVpcmtzICYKIAkJCQlTREhDSV9RVUlSS19EQVRBX1RJTUVPVVRfVVNFU19TRENMSykpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogSGFyZHdhcmUgZG9lc24ndCBzcGVjaWZ5IHRpbWVvdXQgY2xvY2sgIgorCQkJcHJfZXJyKCIlczogSGFyZHdhcmUgZG9lc24ndCBzcGVjaWZ5IHRpbWVvdXQgY2xvY2sgIgogCQkJICAgICAgICJmcmVxdWVuY3kuXG4iLCBtbWNfaG9zdG5hbWUobW1jKSk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtMjU2Niw2ICsyNzM5LDE1IEBACiAJaWYgKGNhcHNbMV0gJiBTREhDSV9EUklWRVJfVFlQRV9EKQogCQltbWMtPmNhcHMgfD0gTU1DX0NBUF9EUklWRVJfVFlQRV9EOwogCisJLyoKKwkgKiBJZiBQb3dlciBPZmYgTm90aWZ5IGNhcGFiaWxpdHkgaXMgZW5hYmxlZCBieSB0aGUgaG9zdCwKKwkgKiBzZXQgbm90aWZ5IHRvIHNob3J0IHBvd2VyIG9mZiBub3RpZnkgdGltZW91dCB2YWx1ZS4KKwkgKi8KKwlpZiAobW1jLT5jYXBzMiAmIE1NQ19DQVAyX1BPV0VST0ZGX05PVElGWSkKKwkJbW1jLT5wb3dlcl9ub3RpZnlfdHlwZSA9IE1NQ19IT1NUX1BXX05PVElGWV9TSE9SVDsKKwllbHNlCisJCW1tYy0+cG93ZXJfbm90aWZ5X3R5cGUgPSBNTUNfSE9TVF9QV19OT1RJRllfTk9ORTsKKwogCS8qIEluaXRpYWwgdmFsdWUgZm9yIHJlLXR1bmluZyB0aW1lciBjb3VudCAqLwogCWhvc3QtPnR1bmluZ19jb3VudCA9IChjYXBzWzFdICYgU0RIQ0lfUkVUVU5JTkdfVElNRVJfQ09VTlRfTUFTSykgPj4KIAkJCSAgICAgIFNESENJX1JFVFVOSU5HX1RJTUVSX0NPVU5UX1NISUZUOwpAQCAtMjY1NSw3ICsyODM3LDcgQEAKIAkJbW1jLT5vY3JfYXZhaWxfbW1jICY9IGhvc3QtPm9jcl9hdmFpbF9tbWM7CiAKIAlpZiAobW1jLT5vY3JfYXZhaWwgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXJkd2FyZSBkb2Vzbid0IHJlcG9ydCBhbnkgIgorCQlwcl9lcnIoIiVzOiBIYXJkd2FyZSBkb2Vzbid0IHJlcG9ydCBhbnkgIgogCQkJInN1cHBvcnQgdm9sdGFnZXMuXG4iLCBtbWNfaG9zdG5hbWUobW1jKSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTI3MDMsNyArMjg4NSw3IEBACiAJCW1tYy0+bWF4X2Jsa19zaXplID0gKGNhcHNbMF0gJiBTREhDSV9NQVhfQkxPQ0tfTUFTSykgPj4KIAkJCQlTREhDSV9NQVhfQkxPQ0tfU0hJRlQ7CiAJCWlmIChtbWMtPm1heF9ibGtfc2l6ZSA+PSAzKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCBtYXhpbXVtIGJsb2NrIHNpemUsICIKKwkJCXByX3dhcm5pbmcoIiVzOiBJbnZhbGlkIG1heGltdW0gYmxvY2sgc2l6ZSwgIgogCQkJCSJhc3N1bWluZyA1MTIgYnl0ZXNcbiIsIG1tY19ob3N0bmFtZShtbWMpKTsKIAkJCW1tYy0+bWF4X2Jsa19zaXplID0gMDsKIAkJfQpAQCAtMjc0Miw3ICsyOTI0LDcgQEAKIAogCWhvc3QtPnZtbWMgPSByZWd1bGF0b3JfZ2V0KG1tY19kZXYobW1jKSwgInZtbWMiKTsKIAlpZiAoSVNfRVJSKGhvc3QtPnZtbWMpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyB2bW1jIHJlZ3VsYXRvciBmb3VuZFxuIiwgbW1jX2hvc3RuYW1lKG1tYykpOworCQlwcl9pbmZvKCIlczogbm8gdm1tYyByZWd1bGF0b3IgZm91bmRcbiIsIG1tY19ob3N0bmFtZShtbWMpKTsKIAkJaG9zdC0+dm1tYyA9IE5VTEw7CiAJfSBlbHNlIHsKIAkJcmVndWxhdG9yX2VuYWJsZShob3N0LT52bW1jKTsKQEAgLTI3NzEsNyArMjk1Myw3IEBACiAKIAltbWNfYWRkX2hvc3QobW1jKTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBTREhDSSBjb250cm9sbGVyIG9uICVzIFslc10gdXNpbmcgJXNcbiIsCisJcHJfaW5mbygiJXM6IFNESENJIGNvbnRyb2xsZXIgb24gJXMgWyVzXSB1c2luZyAlc1xuIiwKIAkJbW1jX2hvc3RuYW1lKG1tYyksIGhvc3QtPmh3X25hbWUsIGRldl9uYW1lKG1tY19kZXYobW1jKSksCiAJCShob3N0LT5mbGFncyAmIFNESENJX1VTRV9BRE1BKSA/ICJBRE1BIiA6CiAJCShob3N0LT5mbGFncyAmIFNESENJX1VTRV9TRE1BKSA/ICJETUEiIDogIlBJTyIpOwpAQCAtMjgwNCw3ICsyOTg2LDcgQEAKIAkJaG9zdC0+ZmxhZ3MgfD0gU0RIQ0lfREVWSUNFX0RFQUQ7CiAKIAkJaWYgKGhvc3QtPm1ycSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ29udHJvbGxlciByZW1vdmVkIGR1cmluZyAiCisJCQlwcl9lcnIoIiVzOiBDb250cm9sbGVyIHJlbW92ZWQgZHVyaW5nICIKIAkJCQkiIHRyYW5zZmVyIVxuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCiAJCQlob3N0LT5tcnEtPmNtZC0+ZXJyb3IgPSAtRU5PTUVESVVNOwpAQCAtMjg2Myw5ICszMDQ1LDkgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2RoY2lfZHJ2X2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FCisJcHJfaW5mbyhEUklWRVJfTkFNRQogCQkiOiBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGRyaXZlclxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBDb3B5cmlnaHQoYykgUGllcnJlIE9zc21hblxuIik7CisJcHJfaW5mbyhEUklWRVJfTkFNRSAiOiBDb3B5cmlnaHQoYykgUGllcnJlIE9zc21hblxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4NzgsOSArMzA2MCwxMSBAQAogbW9kdWxlX2V4aXQoc2RoY2lfZHJ2X2V4aXQpOwogCiBtb2R1bGVfcGFyYW0oZGVidWdfcXVpcmtzLCB1aW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShkZWJ1Z19xdWlya3MyLCB1aW50LCAwNDQ0KTsKIAogTU9EVUxFX0FVVEhPUigiUGllcnJlIE9zc21hbiA8cGllcnJlQG9zc21hbi5ldT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSBjb3JlIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX3F1aXJrcywgIkZvcmNlIGNlcnRhaW4gcXVpcmtzLiIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19xdWlya3MyLCAiRm9yY2UgY2VydGFpbiBvdGhlciBxdWlya3MuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmggYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKaW5kZXggNzQ1YzQyZi4uMGE1YjY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaApAQCAtMjczLDcgKzI3Myw3IEBACiAJdm9pZAkoKnBsYXRmb3JtX3Jlc2V0X2VudGVyKShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTggbWFzayk7CiAJdm9pZAkoKnBsYXRmb3JtX3Jlc2V0X2V4aXQpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1OCBtYXNrKTsKIAlpbnQJKCpzZXRfdWhzX3NpZ25hbGluZykoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB1aHMpOwotCisJdm9pZAkoKmh3X3Jlc2V0KShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiB9OwogCiAjaWZkZWYgQ09ORklHX01NQ19TREhDSV9JT19BQ0NFU1NPUlMKQEAgLTM3OSw0ICszNzksOSBAQAogZXh0ZXJuIHZvaWQgc2RoY2lfZW5hYmxlX2lycV93YWtldXBzKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKK2V4dGVybiBpbnQgc2RoY2lfcnVudGltZV9zdXNwZW5kX2hvc3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOworZXh0ZXJuIGludCBzZGhjaV9ydW50aW1lX3Jlc3VtZV9ob3N0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKKyNlbmRpZgorCiAjZW5kaWYgLyogX19TREhDSV9IV19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3Nkcmljb2hfY3MuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RyaWNvaF9jcy5jCmluZGV4IDQ5NmI3ZWYuLjcwMDlmMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RyaWNvaF9jcy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RyaWNvaF9jcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NoX21tY2lmLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NoX21tY2lmLmMKaW5kZXggNTU3ODg2Yi4uMzY5MzY2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zaF9tbWNpZi5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW1jaWYuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FCSJzaF9tbWNpZiIKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjIwMTAtMDQtMjgiCkBAIC0xNjUsNiArMTY2LDggQEAKIAlzdHJ1Y3QgbW1jX2hvc3QgKm1tYzsKIAlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGE7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGQ7CisJc3RydWN0IHNoX2RtYWVfc2xhdmUgZG1hX3NsYXZlX3R4OworCXN0cnVjdCBzaF9kbWFlX3NsYXZlIGRtYV9zbGF2ZV9yeDsKIAlzdHJ1Y3QgY2xrICpoY2xrOwogCXVuc2lnbmVkIGludCBjbGs7CiAJaW50IGJ1c193aWR0aDsKQEAgLTMyMywyNSArMzI2LDM1IEBACiBzdGF0aWMgdm9pZCBzaF9tbWNpZl9yZXF1ZXN0X2RtYShzdHJ1Y3Qgc2hfbW1jaWZfaG9zdCAqaG9zdCwKIAkJCQkgc3RydWN0IHNoX21tY2lmX3BsYXRfZGF0YSAqcGRhdGEpCiB7CisJc3RydWN0IHNoX2RtYWVfc2xhdmUgKnR4LCAqcng7CiAJaG9zdC0+ZG1hX2FjdGl2ZSA9IGZhbHNlOwogCiAJLyogV2UgY2FuIG9ubHkgZWl0aGVyIHVzZSBETUEgZm9yIGJvdGggVHggYW5kIFJ4IG9yIG5vdCB1c2UgaXQgYXQgYWxsICovCiAJaWYgKHBkYXRhLT5kbWEpIHsKKwkJZGV2X3dhcm4oJmhvc3QtPnBkLT5kZXYsCisJCQkgIlVwZGF0ZSB5b3VyIHBsYXRmb3JtIHRvIHVzZSBlbWJlZGRlZCBETUEgc2xhdmUgSURzXG4iKTsKKwkJdHggPSAmcGRhdGEtPmRtYS0+Y2hhbl9wcml2X3R4OworCQlyeCA9ICZwZGF0YS0+ZG1hLT5jaGFuX3ByaXZfcng7CisJfSBlbHNlIHsKKwkJdHggPSAmaG9zdC0+ZG1hX3NsYXZlX3R4OworCQl0eC0+c2xhdmVfaWQgPSBwZGF0YS0+c2xhdmVfaWRfdHg7CisJCXJ4ID0gJmhvc3QtPmRtYV9zbGF2ZV9yeDsKKwkJcngtPnNsYXZlX2lkID0gcGRhdGEtPnNsYXZlX2lkX3J4OworCX0KKwlpZiAodHgtPnNsYXZlX2lkID4gMCAmJiByeC0+c2xhdmVfaWQgPiAwKSB7CiAJCWRtYV9jYXBfbWFza190IG1hc2s7CiAKIAkJZG1hX2NhcF96ZXJvKG1hc2spOwogCQlkbWFfY2FwX3NldChETUFfU0xBVkUsIG1hc2spOwogCi0JCWhvc3QtPmNoYW5fdHggPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIHNoX21tY2lmX2ZpbHRlciwKLQkJCQkJCSAgICAmcGRhdGEtPmRtYS0+Y2hhbl9wcml2X3R4KTsKKwkJaG9zdC0+Y2hhbl90eCA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgc2hfbW1jaWZfZmlsdGVyLCB0eCk7CiAJCWRldl9kYmcoJmhvc3QtPnBkLT5kZXYsICIlczogVFg6IGdvdCBjaGFubmVsICVwXG4iLCBfX2Z1bmNfXywKIAkJCWhvc3QtPmNoYW5fdHgpOwogCiAJCWlmICghaG9zdC0+Y2hhbl90eCkKIAkJCXJldHVybjsKIAotCQlob3N0LT5jaGFuX3J4ID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBzaF9tbWNpZl9maWx0ZXIsCi0JCQkJCQkgICAgJnBkYXRhLT5kbWEtPmNoYW5fcHJpdl9yeCk7CisJCWhvc3QtPmNoYW5fcnggPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIHNoX21tY2lmX2ZpbHRlciwgcngpOwogCQlkZXZfZGJnKCZob3N0LT5wZC0+ZGV2LCAiJXM6IFJYOiBnb3QgY2hhbm5lbCAlcFxuIiwgX19mdW5jX18sCiAJCQlob3N0LT5jaGFuX3J4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jCmluZGV4IDBjNGE2NzIuLjQxYWU2NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaD4KQEAgLTk2LDcgKzk3LDggQEAKIAlzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyAqcCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0OwogCWNoYXIgY2xrX25hbWVbOF07Ci0JaW50IGksIGlycSwgcmV0OworCWludCBpcnEsIHJldCwgaSA9IDA7CisJYm9vbCBtdWx0aXBsZXhlZF9pc3IgPSB0cnVlOwogCiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaF9tb2JpbGVfc2RoaSksIEdGUF9LRVJORUwpOwogCWlmIChwcml2ID09IE5VTEwpIHsKQEAgLTE1MywyNyArMTU1LDYwIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXByb2JlOwogCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwotCQlpZiAoaXJxIDwgMCkgewotCQkJaWYgKGkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0ID0gaXJxOwotCQkJCWdvdG8gZWlycTsKLQkJCX0KLQkJfQotCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHRtaW9fbW1jX2lycSwgMCwKKwkvKgorCSAqIEFsbG93IG9uZSBvciBtb3JlIHNwZWNpZmljIChuYW1lZCkgSVNScyBvcgorCSAqIG9uZSBvciBtb3JlIG11bHRpcGxleGVkICh1bi1uYW1lZCkgSVNScy4KKwkgKi8KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIFNIX01PQklMRV9TREhJX0lSUV9DQVJEX0RFVEVDVCk7CisJaWYgKGlycSA+PSAwKSB7CisJCW11bHRpcGxleGVkX2lzciA9IGZhbHNlOworCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHRtaW9fbW1jX2NhcmRfZGV0ZWN0X2lycSwgMCwKIAkJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBob3N0KTsKLQkJaWYgKHJldCkgewotCQkJd2hpbGUgKGktLSkgewotCQkJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7Ci0JCQkJaWYgKGlycSA+PSAwKQotCQkJCQlmcmVlX2lycShpcnEsIGhvc3QpOwotCQkJfQotCQkJZ290byBlaXJxOwotCQl9CisJCWlmIChyZXQpCisJCQlnb3RvIGVpcnFfY2FyZF9kZXRlY3Q7CiAJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgU0hfTU9CSUxFX1NESElfSVJRX1NESU8pOworCWlmIChpcnEgPj0gMCkgeworCQltdWx0aXBsZXhlZF9pc3IgPSBmYWxzZTsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB0bWlvX21tY19zZGlvX2lycSwgMCwKKwkJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBob3N0KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZWlycV9zZGlvOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIFNIX01PQklMRV9TREhJX0lSUV9TRENBUkQpOworCWlmIChpcnEgPj0gMCkgeworCQltdWx0aXBsZXhlZF9pc3IgPSBmYWxzZTsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB0bWlvX21tY19zZGNhcmRfaXJxLCAwLAorCQkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIGhvc3QpOworCQlpZiAocmV0KQorCQkJZ290byBlaXJxX3NkY2FyZDsKKwl9IGVsc2UgaWYgKCFtdWx0aXBsZXhlZF9pc3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIlByaW5jaXBhbCBTRC1jYXJkIElSUSBpcyBtaXNzaW5nIGFtb25nIG5hbWVkIGludGVycnVwdHNcbiIpOworCQlyZXQgPSBpcnE7CisJCWdvdG8gZWlycV9zZGNhcmQ7CisJfQorCisJaWYgKG11bHRpcGxleGVkX2lzcikgeworCQl3aGlsZSAoMSkgeworCQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKKwkJCWlmIChpcnEgPCAwKQorCQkJCWJyZWFrOworCQkJaSsrOworCQkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB0bWlvX21tY19pcnEsIDAsCisJCQkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIGhvc3QpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVpcnFfbXVsdGlwbGV4ZWQ7CisJCX0KKworCQkvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBJUlEgc291cmNlICovCisJCWlmICghaSkKKwkJCWdvdG8gZWlycV9tdWx0aXBsZXhlZDsKKwl9CisKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgYmFzZSBhdCAweCUwOGx4IGNsb2NrIHJhdGUgJXUgTUh6XG4iLAogCQkgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksICh1bnNpZ25lZCBsb25nKQogCQkgKHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LElPUkVTT1VSQ0VfTUVNLCAwKS0+c3RhcnQpLApAQCAtMTgxLDcgKzIxNiwyMCBAQAogCiAJcmV0dXJuIHJldDsKIAotZWlycToKK2VpcnFfbXVsdGlwbGV4ZWQ6CisJd2hpbGUgKGktLSkgeworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOworCQlmcmVlX2lycShpcnEsIGhvc3QpOworCX0KK2VpcnFfc2RjYXJkOgorCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIFNIX01PQklMRV9TREhJX0lSUV9TRElPKTsKKwlpZiAoaXJxID49IDApCisJCWZyZWVfaXJxKGlycSwgaG9zdCk7CitlaXJxX3NkaW86CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgU0hfTU9CSUxFX1NESElfSVJRX0NBUkRfREVURUNUKTsKKwlpZiAoaXJxID49IDApCisJCWZyZWVfaXJxKGlycSwgaG9zdCk7CitlaXJxX2NhcmRfZGV0ZWN0OgogCXRtaW9fbW1jX2hvc3RfcmVtb3ZlKGhvc3QpOwogZXByb2JlOgogCWNsa19kaXNhYmxlKHByaXYtPmNsayk7CkBAIC0xOTcsMTYgKzI0NSwxNyBAQAogCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGkgKnByaXYgPSBjb250YWluZXJfb2YoaG9zdC0+cGRhdGEsIHN0cnVjdCBzaF9tb2JpbGVfc2RoaSwgbW1jX2RhdGEpOwogCXN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvICpwID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IGksIGlycTsKKwlpbnQgaSA9IDAsIGlycTsKIAogCXAtPnBkYXRhID0gTlVMTDsKIAogCXRtaW9fbW1jX2hvc3RfcmVtb3ZlKGhvc3QpOwogCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwotCQlpZiAoaXJxID49IDApCi0JCQlmcmVlX2lycShpcnEsIGhvc3QpOworCXdoaWxlICgxKSB7CisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSsrKTsKKwkJaWYgKGlycSA8IDApCisJCQlicmVhazsKKwkJZnJlZV9pcnEoaXJxLCBob3N0KTsKIAl9CiAKIAljbGtfZGlzYWJsZShwcml2LT5jbGspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90aWZtX3NkLmMgYi9kcml2ZXJzL21tYy9ob3N0L3RpZm1fc2QuYwppbmRleCA0NTdjMjZlLi5mNzBkMDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3RpZm1fc2QuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3RpZm1fc2QuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgInRpZm1fc2QiCkBAIC02MzEsNyArNjMyLDcgQEAKIAl9CiAKIAlpZiAoaG9zdC0+cmVxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgOiB1bmZpbmlzaGVkIHJlcXVlc3QgZGV0ZWN0ZWRcbiIsCisJCXByX2VycigiJXMgOiB1bmZpbmlzaGVkIHJlcXVlc3QgZGV0ZWN0ZWRcbiIsCiAJCSAgICAgICBkZXZfbmFtZSgmc29jay0+ZGV2KSk7CiAJCW1ycS0+Y21kLT5lcnJvciA9IC1FVElNRURPVVQ7CiAJCWdvdG8gZXJyX291dDsKQEAgLTY3MSw3ICs2NzIsNyBAQAogCQkJCQkgICAgcl9kYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFCiAJCQkJCSAgICA/IFBDSV9ETUFfVE9ERVZJQ0UKIAkJCQkJICAgIDogUENJX0RNQV9GUk9NREVWSUNFKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgOiBzY2F0dGVybGlzdCBtYXAgZmFpbGVkXG4iLAorCQkJCXByX2VycigiJXMgOiBzY2F0dGVybGlzdCBtYXAgZmFpbGVkXG4iLAogCQkJCSAgICAgICBkZXZfbmFtZSgmc29jay0+ZGV2KSk7CiAJCQkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FTTsKIAkJCQlnb3RvIGVycl9vdXQ7CkBAIC02ODMsNyArNjg0LDcgQEAKIAkJCQkJCSAgID8gUENJX0RNQV9UT0RFVklDRQogCQkJCQkJICAgOiBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJaWYgKGhvc3QtPnNnX2xlbiA8IDEpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIDogc2NhdHRlcmxpc3QgbWFwIGZhaWxlZFxuIiwKKwkJCQlwcl9lcnIoIiVzIDogc2NhdHRlcmxpc3QgbWFwIGZhaWxlZFxuIiwKIAkJCQkgICAgICAgZGV2X25hbWUoJnNvY2stPmRldikpOwogCQkJCXRpZm1fdW5tYXBfc2coc29jaywgJmhvc3QtPmJvdW5jZV9idWYsIDEsCiAJCQkJCSAgICAgIHJfZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9XUklURQpAQCAtNzQ3LDcgKzc0OCw3IEBACiAJaG9zdC0+cmVxID0gTlVMTDsKIAogCWlmICghbXJxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiICVzIDogbm8gcmVxdWVzdCB0byBjb21wbGV0ZT9cbiIsCisJCXByX2VycigiICVzIDogbm8gcmVxdWVzdCB0byBjb21wbGV0ZT9cbiIsCiAJCSAgICAgICBkZXZfbmFtZSgmc29jay0+ZGV2KSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvY2stPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwpAQCAtNzg2LDggKzc4Nyw3IEBACiB7CiAJc3RydWN0IHRpZm1fc2QgKmhvc3QgPSAoc3RydWN0IHRpZm1fc2QqKWRhdGE7CiAKLQlwcmludGsoS0VSTl9FUlIKLQkgICAgICAgIiVzIDogY2FyZCBmYWlsZWQgdG8gcmVzcG9uZCBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lICIKKwlwcl9lcnIoIiVzIDogY2FyZCBmYWlsZWQgdG8gcmVzcG9uZCBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lICIKIAkgICAgICAgIigleCwgJXgpXG4iLAogCSAgICAgICBkZXZfbmFtZSgmaG9zdC0+ZGV2LT5kZXYpLCBob3N0LT5yZXEtPmNtZC0+b3Bjb2RlLCBob3N0LT5jbWRfZmxhZ3MpOwogCkBAIC05MDUsNyArOTA1LDcgQEAKIAl9CiAKIAlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyA6IGNvbnRyb2xsZXIgZmFpbGVkIHRvIHJlc2V0XG4iLAorCQlwcl9lcnIoIiVzIDogY29udHJvbGxlciBmYWlsZWQgdG8gcmVzZXRcbiIsCiAJCSAgICAgICBkZXZfbmFtZSgmc29jay0+ZGV2KSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTkzMSw4ICs5MzEsNyBAQAogCX0KIAogCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICIlcyA6IGNhcmQgbm90IHJlYWR5IC0gcHJvYmUgZmFpbGVkIG9uIGluaXRpYWxpemF0aW9uXG4iLAorCQlwcl9lcnIoIiVzIDogY2FyZCBub3QgcmVhZHkgLSBwcm9iZSBmYWlsZWQgb24gaW5pdGlhbGl6YXRpb25cbiIsCiAJCSAgICAgICBkZXZfbmFtZSgmc29jay0+ZGV2KSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTk1Myw3ICs5NTIsNyBAQAogCiAJaWYgKCEoVElGTV9TT0NLX1NUQVRFX09DQ1VQSUVECiAJICAgICAgJiByZWFkbChzb2NrLT5hZGRyICsgU09DS19QUkVTRU5UX1NUQVRFKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgOiBjYXJkIGdvbmUsIHVuZXhwZWN0ZWRseVxuIiwKKwkJcHJfd2FybmluZygiJXMgOiBjYXJkIGdvbmUsIHVuZXhwZWN0ZWRseVxuIiwKIAkJICAgICAgIGRldl9uYW1lKCZzb2NrLT5kZXYpKTsKIAkJcmV0dXJuIHJjOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuYwppbmRleCA0NGE5NjY4Li5hNGVhMTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5jCkBAIC04OCw4ICs4OCw4IEBACiAJaWYgKHJldCkKIAkJZ290byBjZWxsX2Rpc2FibGU7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHRtaW9fbW1jX2lycSwgSVJRRl9ESVNBQkxFRCB8Ci0JCQkgIElSUUZfVFJJR0dFUl9GQUxMSU5HLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaG9zdCk7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB0bWlvX21tY19pcnEsIElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpLCBob3N0KTsKIAlpZiAocmV0KQogCQlnb3RvIGhvc3RfcmVtb3ZlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmggYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmgKaW5kZXggZWVhZjY0My4uMzAyMGY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuaApAQCAtNzksNiArNzksMTAgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCWRlbGF5ZWRfcmVzZXRfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJZG9uZTsKIAorCS8qIENhY2hlIElSUSBtYXNrICovCisJdTMyCQkJc2RjYXJkX2lycV9tYXNrOworCXUzMgkJCXNkaW9faXJxX21hc2s7CisKIAlzcGlubG9ja190CQlsb2NrOwkJLyogcHJvdGVjdCBob3N0IHByaXZhdGUgZGF0YSAqLwogCXVuc2lnbmVkIGxvbmcJCWxhc3RfcmVxX3RzOwogCXN0cnVjdCBtdXRleAkJaW9zX2xvY2s7CS8qIHByb3RlY3Qgc2V0X2lvcygpIGNvbnRleHQgKi8KQEAgLTkzLDYgKzk3LDkgQEAKIHZvaWQgdG1pb19tbWNfZW5hYmxlX21tY19pcnFzKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCB1MzIgaSk7CiB2b2lkIHRtaW9fbW1jX2Rpc2FibGVfbW1jX2lycXMoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIHUzMiBpKTsKIGlycXJldHVybl90IHRtaW9fbW1jX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCk7CitpcnFyZXR1cm5fdCB0bWlvX21tY19zZGNhcmRfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkKTsKK2lycXJldHVybl90IHRtaW9fbW1jX2NhcmRfZGV0ZWN0X2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCk7CitpcnFyZXR1cm5fdCB0bWlvX21tY19zZGlvX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCk7CiAKIHN0YXRpYyBpbmxpbmUgY2hhciAqdG1pb19tbWNfa21hcF9hdG9taWMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKIAkJCQkJIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKaW5kZXggMWYxNjM1Ny4uZDg1YTYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCkBAIC00OCwxNCArNDgsMTQgQEAKIAogdm9pZCB0bWlvX21tY19lbmFibGVfbW1jX2lycXMoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIHUzMiBpKQogewotCXUzMiBtYXNrID0gc2RfY3RybF9yZWFkMzIoaG9zdCwgQ1RMX0lSUV9NQVNLKSAmIH4oaSAmIFRNSU9fTUFTS19JUlEpOwotCXNkX2N0cmxfd3JpdGUzMihob3N0LCBDVExfSVJRX01BU0ssIG1hc2spOworCWhvc3QtPnNkY2FyZF9pcnFfbWFzayAmPSB+KGkgJiBUTUlPX01BU0tfSVJRKTsKKwlzZF9jdHJsX3dyaXRlMzIoaG9zdCwgQ1RMX0lSUV9NQVNLLCBob3N0LT5zZGNhcmRfaXJxX21hc2spOwogfQogCiB2b2lkIHRtaW9fbW1jX2Rpc2FibGVfbW1jX2lycXMoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIHUzMiBpKQogewotCXUzMiBtYXNrID0gc2RfY3RybF9yZWFkMzIoaG9zdCwgQ1RMX0lSUV9NQVNLKSB8IChpICYgVE1JT19NQVNLX0lSUSk7Ci0Jc2RfY3RybF93cml0ZTMyKGhvc3QsIENUTF9JUlFfTUFTSywgbWFzayk7CisJaG9zdC0+c2RjYXJkX2lycV9tYXNrIHw9IChpICYgVE1JT19NQVNLX0lSUSk7CisJc2RfY3RybF93cml0ZTMyKGhvc3QsIENUTF9JUlFfTUFTSywgaG9zdC0+c2RjYXJkX2lycV9tYXNrKTsKIH0KIAogc3RhdGljIHZvaWQgdG1pb19tbWNfYWNrX21tY19pcnFzKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCB1MzIgaSkKQEAgLTkyLDcgKzkyLDcgQEAKIHN0YXRpYyB2b2lkIHByX2RlYnVnX3N0YXR1cyh1MzIgc3RhdHVzKQogewogCWludCBpID0gMDsKLQlwcmludGsoS0VSTl9ERUJVRyAic3RhdHVzOiAlMDh4ID0gIiwgc3RhdHVzKTsKKwlwcl9kZWJ1Zygic3RhdHVzOiAlMDh4ID0gIiwgc3RhdHVzKTsKIAlTVEFUVVNfVE9fVEVYVChDQVJEX1JFTU9WRSwgc3RhdHVzLCBpKTsKIAlTVEFUVVNfVE9fVEVYVChDQVJEX0lOU0VSVCwgc3RhdHVzLCBpKTsKIAlTVEFUVVNfVE9fVEVYVChTSUdTVEFURSwgc3RhdHVzLCBpKTsKQEAgLTEyNywxMSArMTI3LDEzIEBACiAKIAlpZiAoZW5hYmxlKSB7CiAJCWhvc3QtPnNkaW9faXJxX2VuYWJsZWQgPSAxOworCQlob3N0LT5zZGlvX2lycV9tYXNrID0gVE1JT19TRElPX01BU0tfQUxMICYKKwkJCQkJflRNSU9fU0RJT19TVEFUX0lPSVJROwogCQlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1RSQU5TQUNUSU9OX0NUTCwgMHgwMDAxKTsKLQkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRElPX0lSUV9NQVNLLAotCQkJKFRNSU9fU0RJT19NQVNLX0FMTCAmIH5UTUlPX1NESU9fU1RBVF9JT0lSUSkpOworCQlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NESU9fSVJRX01BU0ssIGhvc3QtPnNkaW9faXJxX21hc2spOwogCX0gZWxzZSB7Ci0JCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RJT19JUlFfTUFTSywgVE1JT19TRElPX01BU0tfQUxMKTsKKwkJaG9zdC0+c2Rpb19pcnFfbWFzayA9IFRNSU9fU0RJT19NQVNLX0FMTDsKKwkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRElPX0lSUV9NQVNLLCBob3N0LT5zZGlvX2lycV9tYXNrKTsKIAkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9UUkFOU0FDVElPTl9DVEwsIDB4MDAwMCk7CiAJCWhvc3QtPnNkaW9faXJxX2VuYWJsZWQgPSAwOwogCX0KQEAgLTU0Myw0NSArNTQ1LDIwIEBACiAJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogfQogCi1pcnFyZXR1cm5fdCB0bWlvX21tY19pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCitzdGF0aWMgdm9pZCB0bWlvX21tY19jYXJkX2lycV9zdGF0dXMoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsCisJCQkJICAgICAgIGludCAqaXJlZywgaW50ICpzdGF0dXMpCiB7Ci0Jc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBkZXZpZDsKKwkqc3RhdHVzID0gc2RfY3RybF9yZWFkMzIoaG9zdCwgQ1RMX1NUQVRVUyk7CisJKmlyZWcgPSAqc3RhdHVzICYgVE1JT19NQVNLX0lSUSAmIH5ob3N0LT5zZGNhcmRfaXJxX21hc2s7CisKKwlwcl9kZWJ1Z19zdGF0dXMoKnN0YXR1cyk7CisJcHJfZGVidWdfc3RhdHVzKCppcmVnKTsKK30KKworc3RhdGljIGJvb2wgX190bWlvX21tY19jYXJkX2RldGVjdF9pcnEoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsCisJCQkJICAgICAgaW50IGlyZWcsIGludCBzdGF0dXMpCit7CiAJc3RydWN0IG1tY19ob3N0ICptbWMgPSBob3N0LT5tbWM7Ci0Jc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gaG9zdC0+cGRhdGE7Ci0JdW5zaWduZWQgaW50IGlyZWcsIGlycV9tYXNrLCBzdGF0dXM7Ci0JdW5zaWduZWQgaW50IHNkaW9faXJlZywgc2Rpb19pcnFfbWFzaywgc2Rpb19zdGF0dXM7Ci0KLQlwcl9kZWJ1ZygiTU1DIElSUSBiZWdpblxuIik7Ci0KLQlzdGF0dXMgPSBzZF9jdHJsX3JlYWQzMihob3N0LCBDVExfU1RBVFVTKTsKLQlpcnFfbWFzayA9IHNkX2N0cmxfcmVhZDMyKGhvc3QsIENUTF9JUlFfTUFTSyk7Ci0JaXJlZyA9IHN0YXR1cyAmIFRNSU9fTUFTS19JUlEgJiB+aXJxX21hc2s7Ci0KLQlzZGlvX2lyZWcgPSAwOwotCWlmICghaXJlZyAmJiBwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19TRElPX0lSUSkgewotCQlzZGlvX3N0YXR1cyA9IHNkX2N0cmxfcmVhZDE2KGhvc3QsIENUTF9TRElPX1NUQVRVUyk7Ci0JCXNkaW9faXJxX21hc2sgPSBzZF9jdHJsX3JlYWQxNihob3N0LCBDVExfU0RJT19JUlFfTUFTSyk7Ci0JCXNkaW9faXJlZyA9IHNkaW9fc3RhdHVzICYgVE1JT19TRElPX01BU0tfQUxMICYgfnNkaW9faXJxX21hc2s7Ci0KLQkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRElPX1NUQVRVUywgc2Rpb19zdGF0dXMgJiB+VE1JT19TRElPX01BU0tfQUxMKTsKLQotCQlpZiAoc2Rpb19pcmVnICYmICFob3N0LT5zZGlvX2lycV9lbmFibGVkKSB7Ci0JCQlwcl93YXJuaW5nKCJ0bWlvX21tYzogU3B1cmlvdXMgU0RJTyBJUlEsIGRpc2FibGluZyEgMHglMDR4IDB4JTA0eCAweCUwNHhcbiIsCi0JCQkJICAgc2Rpb19zdGF0dXMsIHNkaW9faXJxX21hc2ssIHNkaW9faXJlZyk7Ci0JCQl0bWlvX21tY19lbmFibGVfc2Rpb19pcnEobW1jLCAwKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKG1tYy0+Y2FwcyAmIE1NQ19DQVBfU0RJT19JUlEgJiYKLQkJCXNkaW9faXJlZyAmIFRNSU9fU0RJT19TVEFUX0lPSVJRKQotCQkJbW1jX3NpZ25hbF9zZGlvX2lycShtbWMpOwotCi0JCWlmIChzZGlvX2lyZWcpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlwcl9kZWJ1Z19zdGF0dXMoc3RhdHVzKTsKLQlwcl9kZWJ1Z19zdGF0dXMoaXJlZyk7CiAKIAkvKiBDYXJkIGluc2VydCAvIHJlbW92ZSBhdHRlbXB0cyAqLwogCWlmIChpcmVnICYgKFRNSU9fU1RBVF9DQVJEX0lOU0VSVCB8IFRNSU9fU1RBVF9DQVJEX1JFTU9WRSkpIHsKQEAgLTU5MSw0MyArNTY4LDEwMiBAQAogCQkgICAgICgoaXJlZyAmIFRNSU9fU1RBVF9DQVJEX0lOU0VSVCkgJiYgIW1tYy0+Y2FyZCkpICYmCiAJCSAgICAhd29ya19wZW5kaW5nKCZtbWMtPmRldGVjdC53b3JrKSkKIAkJCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYywgbXNlY3NfdG9famlmZmllcygxMDApKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiB0cnVlOwogCX0KIAotCS8qIENSQyBhbmQgb3RoZXIgZXJyb3JzICovCi0vKglpZiAoaXJlZyAmIFRNSU9fU1RBVF9FUlJfSVJRKQotICoJCWhhbmRsZWQgfD0gdG1pb19lcnJvcl9pcnEoaG9zdCwgaXJxLCBzdGF0KTsKLSAqLworCXJldHVybiBmYWxzZTsKK30KIAoraXJxcmV0dXJuX3QgdG1pb19tbWNfY2FyZF9kZXRlY3RfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXVuc2lnbmVkIGludCBpcmVnLCBzdGF0dXM7CisJc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBkZXZpZDsKKworCXRtaW9fbW1jX2NhcmRfaXJxX3N0YXR1cyhob3N0LCAmaXJlZywgJnN0YXR1cyk7CisJX190bWlvX21tY19jYXJkX2RldGVjdF9pcnEoaG9zdCwgaXJlZywgc3RhdHVzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KK0VYUE9SVF9TWU1CT0wodG1pb19tbWNfY2FyZF9kZXRlY3RfaXJxKTsKKworc3RhdGljIGJvb2wgX190bWlvX21tY19zZGNhcmRfaXJxKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LAorCQkJCSBpbnQgaXJlZywgaW50IHN0YXR1cykKK3sKIAkvKiBDb21tYW5kIGNvbXBsZXRpb24gKi8KIAlpZiAoaXJlZyAmIChUTUlPX1NUQVRfQ01EUkVTUEVORCB8IFRNSU9fU1RBVF9DTURUSU1FT1VUKSkgewogCQl0bWlvX21tY19hY2tfbW1jX2lycXMoaG9zdCwKIAkJCSAgICAgVE1JT19TVEFUX0NNRFJFU1BFTkQgfAogCQkJICAgICBUTUlPX1NUQVRfQ01EVElNRU9VVCk7CiAJCXRtaW9fbW1jX2NtZF9pcnEoaG9zdCwgc3RhdHVzKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiB0cnVlOwogCX0KIAogCS8qIERhdGEgdHJhbnNmZXIgKi8KIAlpZiAoaXJlZyAmIChUTUlPX1NUQVRfUlhSRFkgfCBUTUlPX1NUQVRfVFhSUSkpIHsKIAkJdG1pb19tbWNfYWNrX21tY19pcnFzKGhvc3QsIFRNSU9fU1RBVF9SWFJEWSB8IFRNSU9fU1RBVF9UWFJRKTsKIAkJdG1pb19tbWNfcGlvX2lycShob3N0KTsKLQkJZ290byBvdXQ7CisJCXJldHVybiB0cnVlOwogCX0KIAogCS8qIERhdGEgdHJhbnNmZXIgY29tcGxldGlvbiAqLwogCWlmIChpcmVnICYgVE1JT19TVEFUX0RBVEFFTkQpIHsKIAkJdG1pb19tbWNfYWNrX21tY19pcnFzKGhvc3QsIFRNSU9fU1RBVF9EQVRBRU5EKTsKIAkJdG1pb19tbWNfZGF0YV9pcnEoaG9zdCk7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcl93YXJuaW5nKCJ0bWlvX21tYzogU3B1cmlvdXMgaXJxLCBkaXNhYmxpbmchICIKLQkJIjB4JTA4eCAweCUwOHggMHglMDh4XG4iLCBzdGF0dXMsIGlycV9tYXNrLCBpcmVnKTsKLQlwcl9kZWJ1Z19zdGF0dXMoc3RhdHVzKTsKLQl0bWlvX21tY19kaXNhYmxlX21tY19pcnFzKGhvc3QsIHN0YXR1cyAmIH5pcnFfbWFzayk7CisJcmV0dXJuIGZhbHNlOworfQogCi1vdXQ6CitpcnFyZXR1cm5fdCB0bWlvX21tY19zZGNhcmRfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXVuc2lnbmVkIGludCBpcmVnLCBzdGF0dXM7CisJc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBkZXZpZDsKKworCXRtaW9fbW1jX2NhcmRfaXJxX3N0YXR1cyhob3N0LCAmaXJlZywgJnN0YXR1cyk7CisJX190bWlvX21tY19zZGNhcmRfaXJxKGhvc3QsIGlyZWcsIHN0YXR1cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CitFWFBPUlRfU1lNQk9MKHRtaW9fbW1jX3NkY2FyZF9pcnEpOworCitpcnFyZXR1cm5fdCB0bWlvX21tY19zZGlvX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IGRldmlkOworCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gaG9zdC0+bW1jOworCXN0cnVjdCB0bWlvX21tY19kYXRhICpwZGF0YSA9IGhvc3QtPnBkYXRhOworCXVuc2lnbmVkIGludCBpcmVnLCBzdGF0dXM7CisKKwlpZiAoIShwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19TRElPX0lSUSkpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXN0YXR1cyA9IHNkX2N0cmxfcmVhZDE2KGhvc3QsIENUTF9TRElPX1NUQVRVUyk7CisJaXJlZyA9IHN0YXR1cyAmIFRNSU9fU0RJT19NQVNLX0FMTCAmIH5ob3N0LT5zZGNhcmRfaXJxX21hc2s7CisKKwlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NESU9fU1RBVFVTLCBzdGF0dXMgJiB+VE1JT19TRElPX01BU0tfQUxMKTsKKworCWlmIChtbWMtPmNhcHMgJiBNTUNfQ0FQX1NESU9fSVJRICYmIGlyZWcgJiBUTUlPX1NESU9fU1RBVF9JT0lSUSkKKwkJbW1jX3NpZ25hbF9zZGlvX2lycShtbWMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorRVhQT1JUX1NZTUJPTCh0bWlvX21tY19zZGlvX2lycSk7CisKK2lycXJldHVybl90IHRtaW9fbW1jX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IGRldmlkOworCXVuc2lnbmVkIGludCBpcmVnLCBzdGF0dXM7CisKKwlwcl9kZWJ1ZygiTU1DIElSUSBiZWdpblxuIik7CisKKwl0bWlvX21tY19jYXJkX2lycV9zdGF0dXMoaG9zdCwgJmlyZWcsICZzdGF0dXMpOworCWlmIChfX3RtaW9fbW1jX2NhcmRfZGV0ZWN0X2lycShob3N0LCBpcmVnLCBzdGF0dXMpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJaWYgKF9fdG1pb19tbWNfc2RjYXJkX2lycShob3N0LCBpcmVnLCBzdGF0dXMpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwl0bWlvX21tY19zZGlvX2lycShpcnEsIGRldmlkKTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIEVYUE9SVF9TWU1CT0wodG1pb19tbWNfaXJxKTsKQEAgLTg4Miw2ICs5MTgsNyBAQAogCXRtaW9fbW1jX2Nsa19zdG9wKF9ob3N0KTsKIAl0bWlvX21tY19yZXNldChfaG9zdCk7CiAKKwlfaG9zdC0+c2RjYXJkX2lycV9tYXNrID0gc2RfY3RybF9yZWFkMzIoX2hvc3QsIENUTF9JUlFfTUFTSyk7CiAJdG1pb19tbWNfZGlzYWJsZV9tbWNfaXJxcyhfaG9zdCwgVE1JT19NQVNLX0FMTCk7CiAJaWYgKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX1NESU9fSVJRKQogCQl0bWlvX21tY19lbmFibGVfc2Rpb19pcnEobW1jLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvdmlhLXNkbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L3ZpYS1zZG1tYy5jCmluZGV4IDRkZmUyYzAuLjRiODNjNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdmlhLXNkbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC92aWEtc2RtbWMuYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTExOTEsNyArMTE5Miw3IEBACiAJbW1pb3diKCk7CiAKIAlpZiAoc2Rob3N0LT5tcnEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ29udHJvbGxlciByZW1vdmVkIGR1cmluZyAiCisJCXByX2VycigiJXM6IENvbnRyb2xsZXIgcmVtb3ZlZCBkdXJpbmcgIgogCQkJInRyYW5zZmVyXG4iLCBtbWNfaG9zdG5hbWUoc2Rob3N0LT5tbWMpKTsKIAogCQkvKiBtYWtlIHN1cmUgYWxsIERNQSBpcyBzdG9wcGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3dic2QuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5jCmluZGV4IDYyZTVhNGQuLjY0YWNkOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIHsKIAl1OCBzZXR1cDsKIAotCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlc2V0dGluZyBjaGlwXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CisJcHJfZXJyKCIlczogUmVzZXR0aW5nIGNoaXBcbiIsIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAogCS8qCiAJICogU29mdCByZXNldCBvZiBjaGlwIChTRC9NTUMgcGFydCkuCkBAIC03MjEsNyArNzIxLDcgQEAKIAkJICogQW55IGxlZnRvdmVyIGRhdGE/CiAJCSAqLwogCQlpZiAoY291bnQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEluY29tcGxldGUgRE1BIHRyYW5zZmVyLiAiCisJCQlwcl9lcnIoIiVzOiBJbmNvbXBsZXRlIERNQSB0cmFuc2Zlci4gIgogCQkJCSIlZCBieXRlcyBsZWZ0LlxuIiwKIAkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgY291bnQpOwogCkBAIC04MDMsNyArODAzLDcgQEAKIAogCQlkZWZhdWx0OgogI2lmZGVmIENPTkZJR19NTUNfREVCVUcKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBEYXRhIGNvbW1hbmQgJWQgaXMgbm90ICIKKwkJCXByX3dhcm5pbmcoIiVzOiBEYXRhIGNvbW1hbmQgJWQgaXMgbm90ICIKIAkJCQkic3VwcG9ydGVkIGJ5IHRoaXMgY29udHJvbGxlci5cbiIsCiAJCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIGNtZC0+b3Bjb2RlKTsKICNlbmRpZgpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAkJaG9zdC0+ZmxhZ3MgJj0gfldCU0RfRkNBUkRfUFJFU0VOVDsKIAogCQlpZiAoaG9zdC0+bXJxKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYXJkIHJlbW92ZWQgZHVyaW5nIHRyYW5zZmVyIVxuIiwKKwkJCXByX2VycigiJXM6IENhcmQgcmVtb3ZlZCBkdXJpbmcgdHJhbnNmZXIhXG4iLAogCQkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAkJCXdic2RfcmVzZXQoaG9zdCk7CiAKQEAgLTE0MjksNyArMTQyOSw3IEBACiAJZnJlZV9kbWEoZG1hKTsKIAogZXJyOgotCXByaW50ayhLRVJOX1dBUk5JTkcgRFJJVkVSX05BTUUgIjogVW5hYmxlIHRvIGFsbG9jYXRlIERNQSAlZC4gIgorCXByX3dhcm5pbmcoRFJJVkVSX05BTUUgIjogVW5hYmxlIHRvIGFsbG9jYXRlIERNQSAlZC4gIgogCQkiRmFsbGluZyBiYWNrIG9uIEZJRk8uXG4iLCBkbWEpOwogfQogCkBAIC0xNjY0LDcgKzE2NjQsNyBAQAogCXJldCA9IHdic2Rfc2Nhbihob3N0KTsKIAlpZiAocmV0KSB7CiAJCWlmIChwbnAgJiYgKHJldCA9PSAtRU5PREVWKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUklWRVJfTkFNRQorCQkJcHJfd2FybmluZyhEUklWRVJfTkFNRQogCQkJCSI6IFVuYWJsZSB0byBjb25maXJtIGRldmljZSBwcmVzZW5jZS4gWW91IG1heSAiCiAJCQkJImV4cGVyaWVuY2UgbG9jay11cHMuXG4iKTsKIAkJfSBlbHNlIHsKQEAgLTE2ODgsNyArMTY4OCw3IEBACiAJICovCiAJaWYgKHBucCkgewogCQlpZiAoKGhvc3QtPmNvbmZpZyAhPSAwKSAmJiAhd2JzZF9jaGlwX3ZhbGlkYXRlKGhvc3QpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FCisJCQlwcl93YXJuaW5nKERSSVZFUl9OQU1FCiAJCQkJIjogUG5QIGFjdGl2ZSBidXQgY2hpcCBub3QgY29uZmlndXJlZCEgIgogCQkJCSJZb3UgcHJvYmFibHkgaGF2ZSBhIGJ1Z2d5IEJJT1MuICIKIAkJCQkiQ29uZmlndXJpbmcgY2hpcCBtYW51YWxseS5cbiIpOwpAQCAtMTcyMCw3ICsxNzIwLDcgQEAKIAogCW1tY19hZGRfaG9zdChtbWMpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFc4M0w1MXhEIiwgbW1jX2hvc3RuYW1lKG1tYykpOworCXByX2luZm8oIiVzOiBXODNMNTF4RCIsIG1tY19ob3N0bmFtZShtbWMpKTsKIAlpZiAoaG9zdC0+Y2hpcF9pZCAhPSAwKQogCQlwcmludGsoIiBpZCAleCIsIChpbnQpaG9zdC0+Y2hpcF9pZCk7CiAJcHJpbnRrKCIgYXQgMHgleCBpcnEgJWQiLCAoaW50KWhvc3QtPmJhc2UsIChpbnQpaG9zdC0+aXJxKTsKQEAgLTE5MDksNyArMTkwOSw3IEBACiAJICovCiAJaWYgKGhvc3QtPmNvbmZpZyAhPSAwKSB7CiAJCWlmICghd2JzZF9jaGlwX3ZhbGlkYXRlKGhvc3QpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FCisJCQlwcl93YXJuaW5nKERSSVZFUl9OQU1FCiAJCQkJIjogUG5QIGFjdGl2ZSBidXQgY2hpcCBub3QgY29uZmlndXJlZCEgIgogCQkJCSJZb3UgcHJvYmFibHkgaGF2ZSBhIGJ1Z2d5IEJJT1MuICIKIAkJCQkiQ29uZmlndXJpbmcgY2hpcCBtYW51YWxseS5cbiIpOwpAQCAtMTk3Myw5ICsxOTczLDkgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRQorCXByX2luZm8oRFJJVkVSX05BTUUKIAkJIjogV2luYm9uZCBXODNMNTF4RCBTRC9NTUMgY2FyZCBpbnRlcmZhY2UgZHJpdmVyXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IENvcHlyaWdodChjKSBQaWVycmUgT3NzbWFuXG4iKTsKKwlwcl9pbmZvKERSSVZFUl9OQU1FICI6IENvcHlyaWdodChjKSBQaWVycmUgT3NzbWFuXG4iKTsKIAogI2lmZGVmIENPTkZJR19QTlAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL0tjb25maWcKaW5kZXggNjZiNjE2ZS4uMzE4YTg2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9LY29uZmlnCkBAIC0xMiwyNyArMTIsMTcgQEAKIAogaWYgTVRECiAKLWNvbmZpZyBNVERfREVCVUcKLQlib29sICJEZWJ1Z2dpbmciCi0JaGVscAotCSAgVGhpcyB0dXJucyBvbiBsb3ctbGV2ZWwgZGVidWdnaW5nIGZvciB0aGUgZW50aXJlIE1URCBzdWItc3lzdGVtLgotCSAgTm9ybWFsbHksIHlvdSBzaG91bGQgc2F5ICdOJy4KLQotY29uZmlnIE1URF9ERUJVR19WRVJCT1NFCi0JaW50ICJEZWJ1Z2dpbmcgdmVyYm9zaXR5ICgwID0gcXVpZXQsIDMgPSBub2lzeSkiCi0JZGVwZW5kcyBvbiBNVERfREVCVUcKLQlkZWZhdWx0ICIwIgotCWhlbHAKLQkgIERldGVybWluZXMgdGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgTVREIGRlYnVnZ2luZyBtZXNzYWdlcy4KLQogY29uZmlnIE1URF9URVNUUwotCXRyaXN0YXRlICJNVEQgdGVzdHMgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiTVREIHRlc3RzIHN1cHBvcnQgKERBTkdFUk9VUykiCiAJZGVwZW5kcyBvbiBtCiAJaGVscAogCSAgVGhpcyBvcHRpb24gaW5jbHVkZXMgdmFyaW91cyBNVEQgdGVzdHMgaW50byBjb21waWxhdGlvbi4gVGhlIHRlc3RzCiAJICBzaG91bGQgbm9ybWFsbHkgYmUgY29tcGlsZWQgYXMga2VybmVsIG1vZHVsZXMuIFRoZSBtb2R1bGVzIHBlcmZvcm0KIAkgIHZhcmlvdXMgY2hlY2tzIGFuZCB2ZXJpZmljYXRpb25zIHdoZW4gbG9hZGVkLgogCisJICBXQVJOSU5HOiBzb21lIG9mIHRoZSB0ZXN0cyB3aWxsIEVSQVNFIGVudGlyZSBNVEQgZGV2aWNlIHdoaWNoIHRoZXkKKwkgIHRlc3QuIERvIG5vdCB1c2UgdGhlc2UgdGVzdHMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBkby4KKwogY29uZmlnIE1URF9SRURCT09UX1BBUlRTCiAJdHJpc3RhdGUgIlJlZEJvb3QgcGFydGl0aW9uIHRhYmxlIHBhcnNpbmciCiAJLS0taGVscC0tLQpAQCAtMTM3LDcgKzEyNyw4IEBACiAJICAncGh5c21hcCcgbWFwIGRyaXZlciAoQ09ORklHX01URF9QSFlTTUFQKSBkb2VzIHRoaXMsIGZvciBleGFtcGxlLgogCiBjb25maWcgTVREX09GX1BBUlRTCi0JZGVmX2Jvb2wgeQorCXRyaXN0YXRlICJPcGVuRmlybXdhcmUgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uIHN1cHBvcnQiCisJZGVmYXVsdCBZCiAJZGVwZW5kcyBvbiBPRgogCWhlbHAKIAkgIFRoaXMgcHJvdmlkZXMgYSBwYXJ0aXRpb24gcGFyc2luZyBmdW5jdGlvbiB3aGljaCBkZXJpdmVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL01ha2VmaWxlCmluZGV4IDM5NjY0YzQuLjlhYWFjM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL01ha2VmaWxlCkBAIC01LDggKzUsOCBAQAogIyBDb3JlIGZ1bmN0aW9uYWxpdHkuCiBvYmotJChDT05GSUdfTVREKQkJKz0gbXRkLm8KIG10ZC15CQkJCTo9IG10ZGNvcmUubyBtdGRzdXBlci5vIG10ZGNvbmNhdC5vIG10ZHBhcnQubwotbXRkLSQoQ09ORklHX01URF9PRl9QQVJUUykJKz0gb2ZwYXJ0Lm8KIAorb2JqLSQoQ09ORklHX01URF9PRl9QQVJUUykJKz0gb2ZwYXJ0Lm8KIG9iai0kKENPTkZJR19NVERfUkVEQk9PVF9QQVJUUykgKz0gcmVkYm9vdC5vCiBvYmotJChDT05GSUdfTVREX0NNRExJTkVfUEFSVFMpICs9IGNtZGxpbmVwYXJ0Lm8KIG9iai0kKENPTkZJR19NVERfQUZTX1BBUlRTKQkrPSBhZnMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvYWZzLmMgYi9kcml2ZXJzL210ZC9hZnMuYwppbmRleCAzMDIzNzJjLi44OWEwMmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9hZnMuYworKysgYi9kcml2ZXJzL210ZC9hZnMuYwpAQCAtMTYyLDggKzE2Miw4IEBACiB9CiAKIHN0YXRpYyBpbnQgcGFyc2VfYWZzX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICptdGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvcmlnaW4pCisJCQkJc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsCisJCQkJc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhICpkYXRhKQogewogCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKIAl1X2ludCBtYXNrLCBvZmYsIGlkeCwgc3o7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9hcjdwYXJ0LmMgYi9kcml2ZXJzL210ZC9hcjdwYXJ0LmMKaW5kZXggNjY5N2ExZS4uZjQwZWE0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvYXI3cGFydC5jCisrKyBiL2RyaXZlcnMvbXRkL2FyN3BhcnQuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgQVI3X1BBUlRTCTQKICNkZWZpbmUgUk9PVF9PRkZTRVQJMHhlMDAwMApAQCAtNDYsNyArNDcsNyBAQAogCiBzdGF0aWMgaW50IGNyZWF0ZV9tdGRfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwKIAkJCQkgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsCi0JCQkJIHVuc2lnbmVkIGxvbmcgb3JpZ2luKQorCQkJCSBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IGFyN19iaW5fcmVjIGhlYWRlcjsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYwppbmRleCAyMzE3NWVkLi44ZDcwODk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYwpAQCAtMTQ1LDggKzE0NSw3IEBACiAJaWYgKCgobWFqb3IgPDwgOCkgfCBtaW5vcikgPCAweDMxMzEpIHsKIAkJLyogQ0ZJIHZlcnNpb24gMS4wID0+IGRvbid0IHRydXN0IGJvb3Rsb2MgKi8KIAotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLAotCQkJIiVzOiBKRURFQyBWZW5kb3IgSUQgaXMgMHglMDJYIERldmljZSBJRCBpcyAweCUwMlhcbiIsCisJCXByX2RlYnVnKCIlczogSkVERUMgVmVuZG9yIElEIGlzIDB4JTAyWCBEZXZpY2UgSUQgaXMgMHglMDJYXG4iLAogCQkJbWFwLT5uYW1lLCBjZmktPm1mciwgY2ZpLT5pZCk7CiAKIAkJLyogQUZBSUNTIGFsbCAyOUxWNDAwIHdpdGggYSBib3R0b20gYm9vdCBibG9jayBoYXZlIGEgZGV2aWNlIElECkBAIC0xNjYsOCArMTY1LDcgQEAKIAkJCSAqIHRoZSA4LWJpdCBkZXZpY2UgSUQuCiAJCQkgKi8KIAkJCShjZmktPm1mciA9PSBDRklfTUZSX01BQ1JPTklYKSkgewotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwKLQkJCQkiJXM6IE1hY3Jvbml4IE1YMjlMVjQwMEMgd2l0aCBib3R0b20gYm9vdCBibG9jayIKKwkJCXByX2RlYnVnKCIlczogTWFjcm9uaXggTVgyOUxWNDAwQyB3aXRoIGJvdHRvbSBib290IGJsb2NrIgogCQkJCSIgZGV0ZWN0ZWRcbiIsIG1hcC0+bmFtZSk7CiAJCQlleHRwLT5Ub3BCb3R0b20gPSAyOwkvKiBib3R0b20gYm9vdCAqLwogCQl9IGVsc2UKQEAgLTE3OCw4ICsxNzYsNyBAQAogCQkJZXh0cC0+VG9wQm90dG9tID0gMjsJLyogYm90dG9tIGJvb3QgKi8KIAkJfQogCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDEsCi0JCQkiJXM6IEFNRCBDRkkgUFJJIFYlYy4lYyBoYXMgbm8gYm9vdCBibG9jayBmaWVsZDsiCisJCXByX2RlYnVnKCIlczogQU1EIENGSSBQUkkgViVjLiVjIGhhcyBubyBib290IGJsb2NrIGZpZWxkOyIKIAkJCSIgZGVkdWNlZCAlcyBmcm9tIERldmljZSBJRFxuIiwgbWFwLT5uYW1lLCBtYWpvciwgbWlub3IsCiAJCQlleHRwLT5Ub3BCb3R0b20gPT0gMiA/ICJib3R0b20iIDogInRvcCIpOwogCX0KQEAgLTE5MSw3ICsxODgsNyBAQAogCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OwogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwogCWlmIChjZmktPmNmaXEtPkJ1ZldyaXRlVGltZW91dFR5cCkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiVXNpbmcgYnVmZmVyIHdyaXRlIG1ldGhvZFxuIiApOworCQlwcl9kZWJ1ZygiVXNpbmcgYnVmZmVyIHdyaXRlIG1ldGhvZFxuIiApOwogCQltdGQtPndyaXRlID0gY2ZpX2FtZHN0ZF93cml0ZV9idWZmZXJzOwogCX0KIH0KQEAgLTQ0Myw4ICs0NDAsOCBAQAogCW10ZC0+d3JpdGVzaXplID0gMTsKIAltdGQtPndyaXRlYnVmc2l6ZSA9IGNmaV9pbnRlcmxlYXZlKGNmaSkgPDwgY2ZpLT5jZmlxLT5NYXhCdWZXcml0ZVNpemU7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiTVREICVzKCk6IHdyaXRlIGJ1ZmZlciBzaXplICVkXG4iLAotCQlfX2Z1bmNfXywgbXRkLT53cml0ZWJ1ZnNpemUpOworCXByX2RlYnVnKCJNVEQgJXMoKTogd3JpdGUgYnVmZmVyIHNpemUgJWRcbiIsIF9fZnVuY19fLAorCQkJbXRkLT53cml0ZWJ1ZnNpemUpOwogCiAJbXRkLT5yZWJvb3Rfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGNmaV9hbWRzdGRfcmVib290OwogCkBAIC0xMTYzLDcgKzExNjAsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiTVREICVzKCk6IFdSSVRFIDB4JS44bHgoMHglLjhseClcbiIsCisJcHJfZGVidWcoIk1URCAlcygpOiBXUklURSAweCUuOGx4KDB4JS44bHgpXG4iLAogCSAgICAgICBfX2Z1bmNfXywgYWRyLCBkYXR1bS54WzBdICk7CiAKIAkvKgpAQCAtMTE3NCw3ICsxMTcxLDcgQEAKIAkgKi8KIAlvbGRkID0gbWFwX3JlYWQobWFwLCBhZHIpOwogCWlmIChtYXBfd29yZF9lcXVhbChtYXAsIG9sZGQsIGRhdHVtKSkgewotCQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBOT1BcbiIsCisJCXByX2RlYnVnKCJNVEQgJXMoKTogTk9QXG4iLAogCQkgICAgICAgX19mdW5jX18pOwogCQlnb3RvIG9wX2RvbmU7CiAJfQpAQCAtMTQwMCw3ICsxMzk3LDcgQEAKIAogCWRhdHVtID0gbWFwX3dvcmRfbG9hZChtYXAsIGJ1Zik7CiAKLQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBXUklURSAweCUuOGx4KDB4JS44bHgpXG4iLAorCXByX2RlYnVnKCJNVEQgJXMoKTogV1JJVEUgMHglLjhseCgweCUuOGx4KVxuIiwKIAkgICAgICAgX19mdW5jX18sIGFkciwgZGF0dW0ueFswXSApOwogCiAJWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbGVuKTsKQEAgLTE1ODcsNyArMTU4NCw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JREVCVUcoIE1URF9ERUJVR19MRVZFTDMsICJNVEQgJXMoKTogRVJBU0UgMHglLjhseFxuIiwKKwlwcl9kZWJ1ZygiTVREICVzKCk6IEVSQVNFIDB4JS44bHhcbiIsCiAJICAgICAgIF9fZnVuY19fLCBjaGlwLT5zdGFydCApOwogCiAJWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbWFwLT5zaXplKTsKQEAgLTE2NzUsNyArMTY3Miw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JREVCVUcoIE1URF9ERUJVR19MRVZFTDMsICJNVEQgJXMoKTogRVJBU0UgMHglLjhseFxuIiwKKwlwcl9kZWJ1ZygiTVREICVzKCk6IEVSQVNFIDB4JS44bHhcbiIsCiAJICAgICAgIF9fZnVuY19fLCBhZHIgKTsKIAogCVhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBhZHIsIGxlbik7CkBAIC0xODAxLDggKzE3OTgsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJY2hpcC0+c3RhdGUgPSBGTF9MT0NLSU5HOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBMT0NLIDB4JTA4bHggbGVuICVkXG4iLAotCSAgICAgIF9fZnVuY19fLCBhZHIsIGxlbik7CisJcHJfZGVidWcoIk1URCAlcygpOiBMT0NLIDB4JTA4bHggbGVuICVkXG4iLCBfX2Z1bmNfXywgYWRyLCBsZW4pOwogCiAJY2ZpX3NlbmRfZ2VuX2NtZCgweEFBLCBjZmktPmFkZHJfdW5sb2NrMSwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLAogCQkJIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwpAQCAtMTgzNyw4ICsxODMzLDcgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCWNoaXAtPnN0YXRlID0gRkxfVU5MT0NLSU5HOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBMT0NLIDB4JTA4bHggbGVuICVkXG4iLAotCSAgICAgIF9fZnVuY19fLCBhZHIsIGxlbik7CisJcHJfZGVidWcoIk1URCAlcygpOiBMT0NLIDB4JTA4bHggbGVuICVkXG4iLCBfX2Z1bmNfXywgYWRyLCBsZW4pOwogCiAJY2ZpX3NlbmRfZ2VuX2NtZCgweEFBLCBjZmktPmFkZHJfdW5sb2NrMSwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLAogCQkJIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvZndoX2xvY2suaCBiL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmgKaW5kZXggNWUzY2M4MC4uODljNjU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvZndoX2xvY2suaAorKysgYi9kcml2ZXJzL210ZC9jaGlwcy9md2hfbG9jay5oCkBAIC0zNCw4ICszNCw3IEBACiAKIAkvKiBSZWZ1c2UgdGhlIG9wZXJhdGlvbiBpZiB0aGUgd2UgY2Fubm90IGxvb2sgYmVoaW5kIHRoZSBjaGlwICovCiAJaWYgKGNoaXAtPnN0YXJ0IDwgMHg0MDAwMDApIHsKLQkJREVCVUcoIE1URF9ERUJVR19MRVZFTDMsCi0JCQkiTVREICVzKCk6IGNoaXAtPnN0YXJ0OiAlbHggd2FudGVkID49IDB4NDAwMDAwXG4iLAorCQlwcl9kZWJ1ZyggIk1URCAlcygpOiBjaGlwLT5zdGFydDogJWx4IHdhbnRlZCA+PSAweDQwMDAwMFxuIiwKIAkJCV9fZnVuY19fLCBjaGlwLT5zdGFydCApOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jIGIvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYwppbmRleCBlYTgzMmVhLi5jNDQzZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2plZGVjX3Byb2JlLmMKQEAgLTE5MTQsMTEgKzE5MTQsMTAgQEAKIAkgKiAob2ggYW5kIGluY2lkZW50YWx5IHRoZSBqZWRlYyBzcGVjIC0gMy41LjMuMykgdGhlIHJlc2V0CiAJICogc2VxdWVuY2UgaXMgKnN1cHBvc2VkKiB0byBiZSAweGFhIGF0IDB4NTU1NSwgMHg1NSBhdAogCSAqIDB4MmFhYSwgMHhGMCBhdCAweDU1NTUgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIEFNRCBjaGlwcwotCSAqIGFzIHRoZXkgd2lsbCBpZ25vcmUgdGhlIHdyaXRlcyBhbmQgZG9udCBjYXJlIHdoYXQgYWRkcmVzcworCSAqIGFzIHRoZXkgd2lsbCBpZ25vcmUgdGhlIHdyaXRlcyBhbmQgZG9uJ3QgY2FyZSB3aGF0IGFkZHJlc3MKIAkgKiB0aGUgRjAgaXMgd3JpdHRlbiB0byAqLwogCWlmIChjZmktPmFkZHJfdW5sb2NrMSkgewotCQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywKLQkJICAgICAgICJyZXNldCB1bmxvY2sgY2FsbGVkICV4ICV4IFxuIiwKKwkJcHJfZGVidWcoICJyZXNldCB1bmxvY2sgY2FsbGVkICV4ICV4IFxuIiwKIAkJICAgICAgIGNmaS0+YWRkcl91bmxvY2sxLGNmaS0+YWRkcl91bmxvY2syKTsKIAkJY2ZpX3NlbmRfZ2VuX2NtZCgweGFhLCBjZmktPmFkZHJfdW5sb2NrMSwgYmFzZSwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCQljZmlfc2VuZF9nZW5fY21kKDB4NTUsIGNmaS0+YWRkcl91bmxvY2syLCBiYXNlLCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CkBAIC0xOTQxLDcgKzE5NDAsNyBAQAogCXVpbnQ4X3QgdWFkZHI7CiAKIAlpZiAoIShqZWRlY190YWJsZVtpbmRleF0uZGV2dHlwZXMgJiBjZmktPmRldmljZV90eXBlKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiUmVqZWN0aW5nIHBvdGVudGlhbCAlcyB3aXRoIGluY29tcGF0aWJsZSAlZC1iaXQgZGV2aWNlIHR5cGVcbiIsCisJCXByX2RlYnVnKCJSZWplY3RpbmcgcG90ZW50aWFsICVzIHdpdGggaW5jb21wYXRpYmxlICVkLWJpdCBkZXZpY2UgdHlwZVxuIiwKIAkJICAgICAgamVkZWNfdGFibGVbaW5kZXhdLm5hbWUsIDQgKiAoMTw8Y2ZpLT5kZXZpY2VfdHlwZSkpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMDIxLDcgKzIwMjAsNyBAQAogCQkgKiB0aGVyZSBhcmVuJ3QuCiAJCSAqLwogCQlpZiAoZmluZm8tPmRldl9pZCA+IDB4ZmYpIHsKLQkJCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiJXMoKTogSUQgaXMgbm90IDhiaXRcbiIsCisJCQlwcl9kZWJ1ZygiJXMoKTogSUQgaXMgbm90IDhiaXRcbiIsCiAJCQkgICAgICAgX19mdW5jX18pOwogCQkJZ290byBtYXRjaF9kb25lOwogCQl9CkBAIC0yMDQ1LDEyICsyMDQ0LDEwIEBACiAJfQogCiAJLyogdGhlIHBhcnQgc2l6ZSBtdXN0IGZpdCBpbiB0aGUgbWVtb3J5IHdpbmRvdyAqLwotCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLAotCSAgICAgICAiTVREICVzKCk6IENoZWNrIGZpdCAweCUuOHggKyAweCUuOHggPSAweCUuOHhcbiIsCisJcHJfZGVidWcoIk1URCAlcygpOiBDaGVjayBmaXQgMHglLjh4ICsgMHglLjh4ID0gMHglLjh4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgYmFzZSwgMSA8PCBmaW5mby0+ZGV2X3NpemUsIGJhc2UgKyAoMSA8PCBmaW5mby0+ZGV2X3NpemUpICk7CiAJaWYgKCBiYXNlICsgY2ZpX2ludGVybGVhdmUoY2ZpKSAqICggMSA8PCBmaW5mby0+ZGV2X3NpemUgKSA+IG1hcC0+c2l6ZSApIHsKLQkJREVCVUcoIE1URF9ERUJVR19MRVZFTDMsCi0JCSAgICAgICAiTVREICVzKCk6IDB4JS40eCAweCUuNHggJWRLaUIgZG9lc24ndCBmaXRcbiIsCisJCXByX2RlYnVnKCJNVEQgJXMoKTogMHglLjR4IDB4JS40eCAlZEtpQiBkb2Vzbid0IGZpdFxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBmaW5mby0+bWZyX2lkLCBmaW5mby0+ZGV2X2lkLAogCQkgICAgICAgMSA8PCBmaW5mby0+ZGV2X3NpemUgKTsKIAkJZ290byBtYXRjaF9kb25lOwpAQCAtMjA2MSwxMyArMjA1OCwxMiBAQAogCiAJdWFkZHIgPSBmaW5mby0+dWFkZHI7CiAKLQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBjaGVjayB1bmxvY2sgYWRkcnMgMHglLjR4IDB4JS40eFxuIiwKKwlwcl9kZWJ1ZygiTVREICVzKCk6IGNoZWNrIHVubG9jayBhZGRycyAweCUuNHggMHglLjR4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgY2ZpLT5hZGRyX3VubG9jazEsIGNmaS0+YWRkcl91bmxvY2syICk7CiAJaWYgKCBNVERfVUFERFJfVU5ORUNFU1NBUlkgIT0gdWFkZHIgJiYgTVREX1VBRERSX0RPTlRfQ0FSRSAhPSB1YWRkcgogCSAgICAgJiYgKCB1bmxvY2tfYWRkcnNbdWFkZHJdLmFkZHIxIC8gY2ZpLT5kZXZpY2VfdHlwZSAhPSBjZmktPmFkZHJfdW5sb2NrMSB8fAogCQkgIHVubG9ja19hZGRyc1t1YWRkcl0uYWRkcjIgLyBjZmktPmRldmljZV90eXBlICE9IGNmaS0+YWRkcl91bmxvY2syICkgKSB7Ci0JCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLAotCQkJIk1URCAlcygpOiAweCUuNHggMHglLjR4IGRpZCBub3QgbWF0Y2hcbiIsCisJCXByX2RlYnVnKCJNVEQgJXMoKTogMHglLjR4IDB4JS40eCBkaWQgbm90IG1hdGNoXG4iLAogCQkJX19mdW5jX18sCiAJCQl1bmxvY2tfYWRkcnNbdWFkZHJdLmFkZHIxLAogCQkJdW5sb2NrX2FkZHJzW3VhZGRyXS5hZGRyMik7CkBAIC0yMDgzLDE1ICsyMDc5LDEzIEBACiAJICogRklYTUUgLSB3cml0ZSBhIGRyaXZlciB0aGF0IHRha2VzIGFsbCBvZiB0aGUgY2hpcCBpbmZvIGFzCiAJICogbW9kdWxlIHBhcmFtZXRlcnMsIGRvZXNuJ3QgcHJvYmUgYnV0IGZvcmNlcyBhIGxvYWQuCiAJICovCi0JREVCVUcoIE1URF9ERUJVR19MRVZFTDMsCi0JICAgICAgICJNVEQgJXMoKTogY2hlY2sgSUQncyBkaXNhcHBlYXIgd2hlbiBub3QgaW4gSUQgbW9kZVxuIiwKKwlwcl9kZWJ1ZygiTVREICVzKCk6IGNoZWNrIElEJ3MgZGlzYXBwZWFyIHdoZW4gbm90IGluIElEIG1vZGVcbiIsCiAJICAgICAgIF9fZnVuY19fICk7CiAJamVkZWNfcmVzZXQoIGJhc2UsIG1hcCwgY2ZpICk7CiAJbWZyID0gamVkZWNfcmVhZF9tZnIoIG1hcCwgYmFzZSwgY2ZpICk7CiAJaWQgPSBqZWRlY19yZWFkX2lkKCBtYXAsIGJhc2UsIGNmaSApOwogCWlmICggbWZyID09IGNmaS0+bWZyICYmIGlkID09IGNmaS0+aWQgKSB7Ci0JCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLAotCQkgICAgICAgIk1URCAlcygpOiBJRCAweCUuMng6MHglLjJ4IGRpZCBub3QgY2hhbmdlIGFmdGVyIHJlc2V0OlxuIgorCQlwcl9kZWJ1ZygiTVREICVzKCk6IElEIDB4JS4yeDoweCUuMnggZGlkIG5vdCBjaGFuZ2UgYWZ0ZXIgcmVzZXQ6XG4iCiAJCSAgICAgICAiWW91IG1pZ2h0IG5lZWQgdG8gbWFudWFsbHkgc3BlY2lmeSBKRURFQyBwYXJhbWV0ZXJzLlxuIiwKIAkJCV9fZnVuY19fLCBjZmktPm1mciwgY2ZpLT5pZCApOwogCQlnb3RvIG1hdGNoX2RvbmU7CkBAIC0yMTA0LDcgKzIwOTgsNyBAQAogCSAqIFB1dCB0aGUgZGV2aWNlIGJhY2sgaW4gSUQgbW9kZSAtIG9ubHkgbmVlZCB0byBkbyB0aGlzIGlmIHdlCiAJICogd2VyZSB0cnVseSBmcm9iYmluZyBhIHJlYWwgZGV2aWNlLgogCSAqLwotCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiTVREICVzKCk6IHJldHVybiB0byBJRCBtb2RlXG4iLCBfX2Z1bmNfXyApOworCXByX2RlYnVnKCJNVEQgJXMoKTogcmV0dXJuIHRvIElEIG1vZGVcbiIsIF9fZnVuY19fICk7CiAJaWYgKGNmaS0+YWRkcl91bmxvY2sxKSB7CiAJCWNmaV9zZW5kX2dlbl9jbWQoMHhhYSwgY2ZpLT5hZGRyX3VubG9jazEsIGJhc2UsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKIAkJY2ZpX3NlbmRfZ2VuX2NtZCgweDU1LCBjZmktPmFkZHJfdW5sb2NrMiwgYmFzZSwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwpAQCAtMjE2NywxMyArMjE2MSwxMSBAQAogCiAJCWNmaS0+bWZyID0gamVkZWNfcmVhZF9tZnIobWFwLCBiYXNlLCBjZmkpOwogCQljZmktPmlkID0gamVkZWNfcmVhZF9pZChtYXAsIGJhc2UsIGNmaSk7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDMsCi0JCSAgICAgICJTZWFyY2ggZm9yIGlkOiglMDJ4ICUwMngpIGludGVybGVhdmUoJWQpIHR5cGUoJWQpXG4iLAorCQlwcl9kZWJ1ZygiU2VhcmNoIGZvciBpZDooJTAyeCAlMDJ4KSBpbnRlcmxlYXZlKCVkKSB0eXBlKCVkKVxuIiwKIAkJCWNmaS0+bWZyLCBjZmktPmlkLCBjZmlfaW50ZXJsZWF2ZShjZmkpLCBjZmktPmRldmljZV90eXBlKTsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoamVkZWNfdGFibGUpOyBpKyspIHsKIAkJCWlmICggamVkZWNfbWF0Y2goIGJhc2UsIG1hcCwgY2ZpLCAmamVkZWNfdGFibGVbaV0gKSApIHsKLQkJCQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywKLQkJCQkgICAgICAgIk1URCAlcygpOiBtYXRjaGVkIGRldmljZSAweCV4LDB4JXggdW5sb2NrX2FkZHJzOiAweCUuNHggMHglLjR4XG4iLAorCQkJCXByX2RlYnVnKCJNVEQgJXMoKTogbWF0Y2hlZCBkZXZpY2UgMHgleCwweCV4IHVubG9ja19hZGRyczogMHglLjR4IDB4JS40eFxuIiwKIAkJCQkgICAgICAgX19mdW5jX18sIGNmaS0+bWZyLCBjZmktPmlkLAogCQkJCSAgICAgICBjZmktPmFkZHJfdW5sb2NrMSwgY2ZpLT5hZGRyX3VubG9jazIgKTsKIAkJCQlpZiAoIWNmaV9qZWRlY19zZXR1cChtYXAsIGNmaSwgaSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jIGIvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYwppbmRleCBlNzkwZjM4Li5kZGY5ZWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jCisrKyBiL2RyaXZlcnMvbXRkL2NtZGxpbmVwYXJ0LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIGVycm9yIG1lc3NhZ2UgcHJlZml4ICovCiAjZGVmaW5lIEVSUlAgIm10ZDogIgpAQCAtMTg4LDEwICsxODksNyBAQAogCQkJICAgICBleHRyYV9tZW1fc2l6ZTsKIAkJcGFydHMgPSBremFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIXBhcnRzKQotCQl7Ci0JCQlwcmludGsoS0VSTl9FUlIgRVJSUCAib3V0IG9mIG1lbW9yeVxuIik7CiAJCQlyZXR1cm4gTlVMTDsKLQkJfQogCQlleHRyYV9tZW0gPSAodW5zaWduZWQgY2hhciAqKShwYXJ0cyArICpudW1fcGFydHMpOwogCX0KIAkvKiBlbnRlciB0aGlzIHBhcnRpdGlvbiAob2Zmc2V0IHdpbGwgYmUgY2FsY3VsYXRlZCBsYXRlciBpZiBpdCBpcyB6ZXJvIGF0IHRoaXMgcG9pbnQpICovCkBAIC0zMTYsOCArMzE0LDggQEAKICAqIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGNoYWluIGlmIGEgTlVMTCBtdGRfaWQgaXMgcGFzc2VkIGluLgogICovCiBzdGF0aWMgaW50IHBhcnNlX2NtZGxpbmVfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb3JpZ2luKQorCQkJCSAgICBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywKKwkJCQkgICAgc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhICpkYXRhKQogewogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCWludCBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCmluZGV4IDM1MDgxY2UuLjI4M2Q4ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKQEAgLTI0OSw2ICsyNDksMTYgQEAKIAkgIHVuZGVyICJOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzIiAoY3VycmVudGx5IHRoYXQgZHJpdmVyIGRvZXMgbm90CiAJICBzdXBwb3J0IGFsbCBNaWxsZW5uaXVtIFBsdXMgZGV2aWNlcykuCiAKK2NvbmZpZyBNVERfRE9DRzMKKwl0cmlzdGF0ZSAiTS1TeXN0ZW1zIERpc2stT24tQ2hpcCBHMyIKKwktLS1oZWxwLS0tCisJICBUaGlzIHByb3ZpZGVzIGFuIE1URCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgTS1TeXN0ZW1zIERpc2tPbkNoaXAKKwkgIEczIGRldmljZXMuCisKKwkgIFRoZSBkcml2ZXIgcHJvdmlkZXMgYWNjZXNzIHRvIEczIERpc2tPbkNoaXAsIGRpc3RyaWJ1dGVkIGJ5CisJICBNLVN5c3RlbXMgYW5kIG5vdyBTYW5kaXNrLiBUaGUgc3VwcG9ydCBpcyB2ZXJ5IGV4cGVyaW1lbnRhbCwKKwkgIGFuZCBkb2Vzbid0IGdpdmUgYWNjZXNzIHRvIGFueSB3cml0ZSBvcGVyYXRpb25zLgorCiBjb25maWcgTVREX0RPQ1BST0JFCiAJdHJpc3RhdGUKIAlzZWxlY3QgTVREX0RPQ0VDQwpAQCAtMjY4LDggKzI3OCw3IEBACiBjb25maWcgTVREX0RPQ1BST0JFX0FERFJFU1MKIAloZXggIlBoeXNpY2FsIGFkZHJlc3Mgb2YgRGlza09uQ2hpcCIgaWYgTVREX0RPQ1BST0JFX0FEVkFOQ0VECiAJZGVwZW5kcyBvbiBNVERfRE9DUFJPQkUKLQlkZWZhdWx0ICIweDAwMDAiIGlmIE1URF9ET0NQUk9CRV9BRFZBTkNFRAotCWRlZmF1bHQgIjAiIGlmICFNVERfRE9DUFJPQkVfQURWQU5DRUQKKwlkZWZhdWx0ICIweDAiCiAJLS0taGVscC0tLQogCSAgQnkgZGVmYXVsdCwgdGhlIHByb2JlIGZvciBEaXNrT25DaGlwIGRldmljZXMgd2lsbCBsb29rIGZvciBhCiAJICBEaXNrT25DaGlwIGF0IGV2ZXJ5IG11bHRpcGxlIG9mIDB4MjAwMCBiZXR3ZWVuIDB4QzgwMDAgYW5kIDB4RUUwMDAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZQppbmRleCBmMzIyNmIxLi41NmM3Y2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUKQEAgLTUsNiArNSw3IEBACiBvYmotJChDT05GSUdfTVREX0RPQzIwMDApCSs9IGRvYzIwMDAubwogb2JqLSQoQ09ORklHX01URF9ET0MyMDAxKQkrPSBkb2MyMDAxLm8KIG9iai0kKENPTkZJR19NVERfRE9DMjAwMVBMVVMpCSs9IGRvYzIwMDFwbHVzLm8KK29iai0kKENPTkZJR19NVERfRE9DRzMpCQkrPSBkb2NnMy5vCiBvYmotJChDT05GSUdfTVREX0RPQ1BST0JFKQkrPSBkb2Nwcm9iZS5vCiBvYmotJChDT05GSUdfTVREX0RPQ0VDQykJKz0gZG9jZWNjLm8KIG9iai0kKENPTkZJR19NVERfU0xSQU0pCQkrPSBzbHJhbS5vCkBAIC0xNywzICsxOCw1IEBACiBvYmotJChDT05GSUdfTVREX0RBVEFGTEFTSCkJKz0gbXRkX2RhdGFmbGFzaC5vCiBvYmotJChDT05GSUdfTVREX00yNVA4MCkJKz0gbTI1cDgwLm8KIG9iai0kKENPTkZJR19NVERfU1NUMjVMKQkrPSBzc3QyNWwubworCitDRkxBR1NfZG9jZzMubwkJCSs9IC1JJChzcmMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDAuYwppbmRleCBmN2ZiZjYwLi5lOWZhZDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDAuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDAuYwpAQCAtODIsOCArODIsNyBAQAogCXZvaWQgX19pb21lbSAqZG9jcHRyID0gZG9jLT52aXJ0YWRyOwogCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBqaWZmaWVzICsgKEhaICogMTApOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywKLQkgICAgICAiX0RvQ19XYWl0UmVhZHkgY2FsbGVkIGZvciBvdXQtb2YtbGluZSB3YWl0XG4iKTsKKwlwcl9kZWJ1ZygiX0RvQ19XYWl0UmVhZHkgY2FsbGVkIGZvciBvdXQtb2YtbGluZSB3YWl0XG4iKTsKIAogCS8qIE91dC1vZi1saW5lIHJvdXRpbmUgdG8gd2FpdCBmb3IgY2hpcCByZXNwb25zZSAqLwogCXdoaWxlICghKFJlYWRET0MoZG9jcHRyLCBDRFNOQ29udHJvbCkgJiBDRFNOX0NUUkxfRlJfQikpIHsKQEAgLTkyLDcgKzkxLDcgQEAKIAkJRG9DX0RlbGF5KGRvYywgMik7CiAKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW8pKSB7Ci0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiX0RvQ19XYWl0UmVhZHkgdGltZWQgb3V0LlxuIik7CisJCQlwcl9kZWJ1ZygiX0RvQ19XYWl0UmVhZHkgdGltZWQgb3V0LlxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQl1ZGVsYXkoMSk7CkBAIC0zMjMsOCArMzIyLDcgQEAKIAogCS8qIFJlc2V0IHRoZSBjaGlwICovCiAJaWYgKERvQ19Db21tYW5kKGRvYywgTkFORF9DTURfUkVTRVQsIENEU05fQ1RSTF9XUCkpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwKLQkJICAgICAgIkRvQ19Db21tYW5kIChyZXNldCkgZm9yICVkLCVkIHJldHVybmVkIHRydWVcbiIsCisJCXByX2RlYnVnKCJEb0NfQ29tbWFuZCAocmVzZXQpIGZvciAlZCwlZCByZXR1cm5lZCB0cnVlXG4iLAogCQkgICAgICBmbG9vciwgY2hpcCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTMzMiw4ICszMzAsNyBAQAogCiAJLyogUmVhZCB0aGUgTkFORCBjaGlwIElEOiAxLiBTZW5kIFJlYWRJRCBjb21tYW5kICovCiAJaWYgKERvQ19Db21tYW5kKGRvYywgTkFORF9DTURfUkVBRElELCBDRFNOX0NUUkxfV1ApKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDIsCi0JCSAgICAgICJEb0NfQ29tbWFuZCAoUmVhZElEKSBmb3IgJWQsJWQgcmV0dXJuZWQgdHJ1ZVxuIiwKKwkJcHJfZGVidWcoIkRvQ19Db21tYW5kIChSZWFkSUQpIGZvciAlZCwlZCByZXR1cm5lZCB0cnVlXG4iLAogCQkgICAgICBmbG9vciwgY2hpcCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTY5OSw3ICs2OTYsNyBAQAogI2lmZGVmIEVDQ19ERUJVRwogCQkJcHJpbnRrKEtFUk5fRVJSICJEaXNrT25DaGlwIEVDQyBFcnJvcjogUmVhZCBhdCAlbHhcbiIsIChsb25nKWZyb20pOwogI2VuZGlmCi0JCQkvKiBSZWFkIHRoZSBFQ0Mgc3luZHJvbSB0aHJvdWdoIHRoZSBEaXNrT25DaGlwIEVDQworCQkJLyogUmVhZCB0aGUgRUNDIHN5bmRyb21lIHRocm91Z2ggdGhlIERpc2tPbkNoaXAgRUNDCiAJCQkgICBsb2dpYy4gIFRoZXNlIHN5bmRyb21lIHdpbGwgYmUgYWxsIFpFUk8gd2hlbiB0aGVyZQogCQkJICAgaXMgbm8gZXJyb3IgKi8KIAkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKQEAgLTkzMCw3ICs5MjcsNyBAQAogCXVpbnQ4X3QgKmJ1ZiA9IG9wcy0+b29iYnVmOwogCXNpemVfdCBsZW4gPSBvcHMtPmxlbjsKIAotCUJVR19PTihvcHMtPm1vZGUgIT0gTVREX09PQl9QTEFDRSk7CisJQlVHX09OKG9wcy0+bW9kZSAhPSBNVERfT1BTX1BMQUNFX09PQik7CiAKIAlvZnMgKz0gb3BzLT5vb2JvZmZzOwogCkBAIC0xMDk0LDcgKzEwOTEsNyBAQAogCXN0cnVjdCBEaXNrT25DaGlwICp0aGlzID0gbXRkLT5wcml2OwogCWludCByZXQ7CiAKLQlCVUdfT04ob3BzLT5tb2RlICE9IE1URF9PT0JfUExBQ0UpOworCUJVR19PTihvcHMtPm1vZGUgIT0gTVREX09QU19QTEFDRV9PT0IpOwogCiAJbXV0ZXhfbG9jaygmdGhpcy0+bG9jayk7CiAJcmV0ID0gZG9jX3dyaXRlX29vYl9ub2xvY2sobXRkLCBvZnMgKyBvcHMtPm9vYm9mZnMsIG9wcy0+bGVuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDEuYwppbmRleCAyNDExOTJmLi5hM2Y3YTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDEuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDEuYwpAQCAtNTUsMTUgKzU1LDE0IEBACiB7CiAJdW5zaWduZWQgc2hvcnQgYyA9IDB4ZmZmZjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsCi0JICAgICAgIl9Eb0NfV2FpdFJlYWR5IGNhbGxlZCBmb3Igb3V0LW9mLWxpbmUgd2FpdFxuIik7CisJcHJfZGVidWcoIl9Eb0NfV2FpdFJlYWR5IGNhbGxlZCBmb3Igb3V0LW9mLWxpbmUgd2FpdFxuIik7CiAKIAkvKiBPdXQtb2YtbGluZSByb3V0aW5lIHRvIHdhaXQgZm9yIGNoaXAgcmVzcG9uc2UgKi8KIAl3aGlsZSAoIShSZWFkRE9DKGRvY3B0ciwgQ0RTTkNvbnRyb2wpICYgQ0RTTl9DVFJMX0ZSX0IpICYmIC0tYykKIAkJOwogCiAJaWYgKGMgPT0gMCkKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIl9Eb0NfV2FpdFJlYWR5IHRpbWVkIG91dC5cbiIpOworCQlwcl9kZWJ1ZygiX0RvQ19XYWl0UmVhZHkgdGltZWQgb3V0LlxuIik7CiAKIAlyZXR1cm4gKGMgPT0gMCk7CiB9CkBAIC00NjQsNyArNDYzLDcgQEAKICNpZmRlZiBFQ0NfREVCVUcKIAkJcHJpbnRrKCJEaXNrT25DaGlwIEVDQyBFcnJvcjogUmVhZCBhdCAlbHhcbiIsIChsb25nKWZyb20pOwogI2VuZGlmCi0JCS8qIFJlYWQgdGhlIEVDQyBzeW5kcm9tIHRocm91Z2ggdGhlIERpc2tPbkNoaXAgRUNDIGxvZ2ljLgorCQkvKiBSZWFkIHRoZSBFQ0Mgc3luZHJvbWUgdGhyb3VnaCB0aGUgRGlza09uQ2hpcCBFQ0MgbG9naWMuCiAJCSAgIFRoZXNlIHN5bmRyb21lIHdpbGwgYmUgYWxsIFpFUk8gd2hlbiB0aGVyZSBpcyBubyBlcnJvciAqLwogCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAJCQlzeW5kcm9tZVtpXSA9IFJlYWRET0MoZG9jcHRyLCBFQ0NTeW5kcm9tZTAgKyBpKTsKQEAgLTYzMiw3ICs2MzEsNyBAQAogCXVpbnQ4X3QgKmJ1ZiA9IG9wcy0+b29iYnVmOwogCXNpemVfdCBsZW4gPSBvcHMtPmxlbjsKIAotCUJVR19PTihvcHMtPm1vZGUgIT0gTVREX09PQl9QTEFDRSk7CisJQlVHX09OKG9wcy0+bW9kZSAhPSBNVERfT1BTX1BMQUNFX09PQik7CiAKIAlvZnMgKz0gb3BzLT5vb2JvZmZzOwogCkBAIC02OTAsNyArNjg5LDcgQEAKIAl1aW50OF90ICpidWYgPSBvcHMtPm9vYmJ1ZjsKIAlzaXplX3QgbGVuID0gb3BzLT5sZW47CiAKLQlCVUdfT04ob3BzLT5tb2RlICE9IE1URF9PT0JfUExBQ0UpOworCUJVR19PTihvcHMtPm1vZGUgIT0gTVREX09QU19QTEFDRV9PT0IpOwogCiAJb2ZzICs9IG9wcy0+b29ib2ZmczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxcGx1cy5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxcGx1cy5jCmluZGV4IDA5YWUwYWQuLjk5MzUxYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMXBsdXMuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDFwbHVzLmMKQEAgLTYxLDE1ICs2MSwxNCBAQAogewogCXVuc2lnbmVkIGludCBjID0gMHhmZmZmOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywKLQkgICAgICAiX0RvQ19XYWl0UmVhZHkgY2FsbGVkIGZvciBvdXQtb2YtbGluZSB3YWl0XG4iKTsKKwlwcl9kZWJ1ZygiX0RvQ19XYWl0UmVhZHkgY2FsbGVkIGZvciBvdXQtb2YtbGluZSB3YWl0XG4iKTsKIAogCS8qIE91dC1vZi1saW5lIHJvdXRpbmUgdG8gd2FpdCBmb3IgY2hpcCByZXNwb25zZSAqLwogCXdoaWxlICgoKFJlYWRET0MoZG9jcHRyLCBNcGx1c19GbGFzaENvbnRyb2wpICYgQ0RTTl9DVFJMX0ZSX0JfTUFTSykgIT0gQ0RTTl9DVFJMX0ZSX0JfTUFTSykgJiYgLS1jKQogCQk7CiAKIAlpZiAoYyA9PSAwKQotCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiX0RvQ19XYWl0UmVhZHkgdGltZWQgb3V0LlxuIik7CisJCXByX2RlYnVnKCJfRG9DX1dhaXRSZWFkeSB0aW1lZCBvdXQuXG4iKTsKIAogCXJldHVybiAoYyA9PSAwKTsKIH0KQEAgLTY1NSw3ICs2NTQsNyBAQAogI2lmZGVmIEVDQ19ERUJVRwogCQlwcmludGsoIkRpc2tPbkNoaXAgRUNDIEVycm9yOiBSZWFkIGF0ICVseFxuIiwgKGxvbmcpZnJvbSk7CiAjZW5kaWYKLQkJLyogUmVhZCB0aGUgRUNDIHN5bmRyb20gdGhyb3VnaCB0aGUgRGlza09uQ2hpcCBFQ0MgbG9naWMuCisJCS8qIFJlYWQgdGhlIEVDQyBzeW5kcm9tZSB0aHJvdWdoIHRoZSBEaXNrT25DaGlwIEVDQyBsb2dpYy4KIAkJICAgVGhlc2Ugc3luZHJvbWUgd2lsbCBiZSBhbGwgWkVSTyB3aGVuIHRoZXJlIGlzIG5vIGVycm9yICovCiAJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCQlzeW5kcm9tZVtpXSA9IFJlYWRET0MoZG9jcHRyLCBNcGx1c19FQ0NTeW5kcm9tZTAgKyBpKTsKQEAgLTgzNSw3ICs4MzQsNyBAQAogCXVpbnQ4X3QgKmJ1ZiA9IG9wcy0+b29iYnVmOwogCXNpemVfdCBsZW4gPSBvcHMtPmxlbjsKIAotCUJVR19PTihvcHMtPm1vZGUgIT0gTVREX09PQl9QTEFDRSk7CisJQlVHX09OKG9wcy0+bW9kZSAhPSBNVERfT1BTX1BMQUNFX09PQik7CiAKIAlvZnMgKz0gb3BzLT5vb2JvZmZzOwogCkBAIC05MjAsNyArOTE5LDcgQEAKIAl1aW50OF90ICpidWYgPSBvcHMtPm9vYmJ1ZjsKIAlzaXplX3QgbGVuID0gb3BzLT5sZW47CiAKLQlCVUdfT04ob3BzLT5tb2RlICE9IE1URF9PT0JfUExBQ0UpOworCUJVR19PTihvcHMtPm1vZGUgIT0gTVREX09QU19QTEFDRV9PT0IpOwogCiAJb2ZzICs9IG9wcy0+b29ib2ZmczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2NlY2MuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jZWNjLmMKaW5kZXggMzdlZjI5YS4uNGExYzM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2NlY2MuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvY2VjYy5jCkBAIC0yLDcgKzIsNyBAQAogICogRUNDIGFsZ29yaXRobSBmb3IgTS1zeXN0ZW1zIGRpc2sgb24gY2hpcC4gV2UgdXNlIHRoZSBleGNlbGxlbnQgUmVlZAogICogU29sbW9uIGNvZGUgb2YgUGhpbCBLYXJuIChrYXJuQGthOXEuYW1wci5vcmcpIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIEdOVSBHUEwgTGljZW5zZS4gVGhlIHJlc3QgaXMgc2ltcGx5IHRvIGNvbnZlcnQgdGhlIGRpc2sgb24gY2hpcAotICogc3luZHJvbSBpbnRvIGEgc3RhbmRhcmQgc3luZG9tLgorICogc3luZHJvbWUgaW50byBhIHN0YW5kYXJkIHN5bmRvbWUuCiAgKgogICogQXV0aG9yOiBGYWJyaWNlIEJlbGxhcmQgKGZhYnJpY2UuYmVsbGFyZEBuZXRnZW0uY29tKQogICogQ29weXJpZ2h0IChDKSAyMDAwIE5ldGdlbSBTLkEuCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvY2czLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvY2czLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjZjVkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jZzMuYwpAQCAtMCwwICsxLDExMTQgQEAKKy8qCisgKiBIYW5kbGVzIHRoZSBNLVN5c3RlbXMgRGlza09uQ2hpcCBHMyBjaGlwCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJvYmVydCBKYXJ6bWlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgImRvY2czLmgiCisKKy8qCisgKiBUaGlzIGRyaXZlciBoYW5kbGVzIHRoZSBEaXNrT25DaGlwIEczIGZsYXNoIG1lbW9yeS4KKyAqCisgKiBBcyBubyBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSBmcm9tIE0tU3lzdGVtcy9TYW5kaXNrLCB0aGlzIGRyaXZlcnMgbGFja3MKKyAqIHNldmVyYWwgZnVuY3Rpb25zIGF2YWlsYWJsZSBvbiB0aGUgY2hpcCwgYXMgOgorICogIC0gYmxvY2sgZXJhc2UKKyAqICAtIHBhZ2Ugd3JpdGUKKyAqICAtIElQTCB3cml0ZQorICogIC0gRUNDIGZpeGluZyAobGFjayBvZiBCQ0ggYWxnb3JpdGggdW5kZXJzdGFuZGluZykKKyAqICAtIHBvd2VyZG93biAvIHBvd2VydXAKKyAqCisgKiBUaGUgYnVzIGRhdGEgd2lkdGggKDhiaXRzIHZlcnN1cyAxNmJpdHMpIGlzIG5vdCBoYW5kbGVkIChpZl9jZmcgZmxhZyksIGFuZAorICogdGhlIGRyaXZlciBhc3N1bWVzIGEgMTZiaXRzIGRhdGEgYnVzLgorICoKKyAqIERvY0czIHJlbGllcyBvbiAyIEVDQyBhbGdvcml0aG1zLCB3aGljaCBhcmUgaGFuZGxlZCBpbiBoYXJkd2FyZSA6CisgKiAgLSBhIDEgYnl0ZSBIYW1taW5nIGNvZGUgc3RvcmVkIGluIHRoZSBPT0IgZm9yIGVhY2ggcGFnZQorICogIC0gYSA3IGJ5dGVzIEJDSCBjb2RlIHN0b3JlZCBpbiB0aGUgT09CIGZvciBlYWNoIHBhZ2UKKyAqIFRoZSBCQ0ggcGFydCBpcyBvbmx5IHVzZWQgZm9yIGNoZWNrIHB1cnBvc2UsIG5vIGNvcnJlY3Rpb24gaXMgYXZhaWxhYmxlIGFzCisgKiBzb21lIGluZm9ybWF0aW9uIGlzIG1pc3NpbmcuIFdoYXQgaXMga25vd24gaXMgdGhhdCA6CisgKiAgLSBCQ0ggaXMgaW4gR0YoMl4xNCkKKyAqICAtIEJDSCBpcyBvdmVyIGRhdGEgb2YgNTIwIGJ5dGVzICg1MTIgcGFnZSArIDcgcGFnZV9pbmZvIGJ5dGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxIGhhbW1pbmcgYnl0ZSkKKyAqICAtIEJDSCBjYW4gY29ycmVjdCB1cCB0byA0IGJpdHMgKHQgPSA0KQorICogIC0gQkNIIHN5bmRyb21zIGFyZSBjYWxjdWxhdGVkIGluIGhhcmR3YXJlLCBhbmQgY2hlY2tlZCBpbiBoYXJkd2FyZSBhcyB3ZWxsCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgdTggZG9jX3JlYWRiKHN0cnVjdCBkb2NnMyAqZG9jZzMsIHUxNiByZWcpCit7CisJdTggdmFsID0gcmVhZGIoZG9jZzMtPmJhc2UgKyByZWcpOworCisJdHJhY2VfZG9jZzNfaW8oMCwgOCwgcmVnLCAoaW50KXZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MTYgZG9jX3JlYWR3KHN0cnVjdCBkb2NnMyAqZG9jZzMsIHUxNiByZWcpCit7CisJdTE2IHZhbCA9IHJlYWR3KGRvY2czLT5iYXNlICsgcmVnKTsKKworCXRyYWNlX2RvY2czX2lvKDAsIDE2LCByZWcsIChpbnQpdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG9jX3dyaXRlYihzdHJ1Y3QgZG9jZzMgKmRvY2czLCB1OCB2YWwsIHUxNiByZWcpCit7CisJd3JpdGViKHZhbCwgZG9jZzMtPmJhc2UgKyByZWcpOworCXRyYWNlX2RvY2czX2lvKDEsIDE2LCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb2Nfd3JpdGV3KHN0cnVjdCBkb2NnMyAqZG9jZzMsIHUxNiB2YWwsIHUxNiByZWcpCit7CisJd3JpdGV3KHZhbCwgZG9jZzMtPmJhc2UgKyByZWcpOworCXRyYWNlX2RvY2czX2lvKDEsIDE2LCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb2NfZmxhc2hfY29tbWFuZChzdHJ1Y3QgZG9jZzMgKmRvY2czLCB1OCBjbWQpCit7CisJZG9jX3dyaXRlYihkb2NnMywgY21kLCBET0NfRkxBU0hDT01NQU5EKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRvY19mbGFzaF9zZXF1ZW5jZShzdHJ1Y3QgZG9jZzMgKmRvY2czLCB1OCBzZXEpCit7CisJZG9jX3dyaXRlYihkb2NnMywgc2VxLCBET0NfRkxBU0hTRVFVRU5DRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb2NfZmxhc2hfYWRkcmVzcyhzdHJ1Y3QgZG9jZzMgKmRvY2czLCB1OCBhZGRyKQoreworCWRvY193cml0ZWIoZG9jZzMsIGFkZHIsIERPQ19GTEFTSEFERFJFU1MpOworfQorCitzdGF0aWMgY2hhciBjb25zdCAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgInNhZnRscGFydCIsIE5VTEwgfTsKKworc3RhdGljIGludCBkb2NfcmVnaXN0ZXJfcmVhZGIoc3RydWN0IGRvY2czICpkb2NnMywgaW50IHJlZykKK3sKKwl1OCB2YWw7CisKKwlkb2Nfd3JpdGV3KGRvY2czLCByZWcsIERPQ19SRUFEQUREUkVTUyk7CisJdmFsID0gZG9jX3JlYWRiKGRvY2czLCByZWcpOworCWRvY192ZGJnKCJSZWFkIHJlZ2lzdGVyICUwNHggOiAlMDJ4XG4iLCByZWcsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBkb2NfcmVnaXN0ZXJfcmVhZHcoc3RydWN0IGRvY2czICpkb2NnMywgaW50IHJlZykKK3sKKwl1MTYgdmFsOworCisJZG9jX3dyaXRldyhkb2NnMywgcmVnLCBET0NfUkVBREFERFJFU1MpOworCXZhbCA9IGRvY19yZWFkdyhkb2NnMywgcmVnKTsKKwlkb2NfdmRiZygiUmVhZCByZWdpc3RlciAlMDR4IDogJTA0eFxuIiwgcmVnLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKKy8qKgorICogZG9jX2RlbGF5IC0gZGVsYXkgZG9jZzMgb3BlcmF0aW9ucworICogQGRvY2czOiB0aGUgZGV2aWNlCisgKiBAbmJOT1BzOiB0aGUgbnVtYmVyIG9mIE5PUHMgdG8gaXNzdWUKKyAqCisgKiBBcyBubyBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZSwgdGhlIHJpZ2h0IHRpbWluZ3MgYmV0d2VlbiBjaGlwIGNvbW1hbmRzIGFyZQorICogdW5rbm93bi4gVGhlIG9ubHkgYXZhaWxhYmxlIHBpZWNlIG9mIGluZm9ybWF0aW9uIGFyZSB0aGUgb2JzZXJ2ZWQgbm9wcyBvbiBhCisgKiB3b3JraW5nIGRvY2czIGNoaXAuCisgKiBUaGVyZWZvcmUsIGRvY19kZWxheSByZWxpZXMgb24gYSBidXN5IGxvb3Agb2YgTk9QcywgaW5zdGVhZCBvZiBzY2hlZHVsZXIKKyAqIGZyaWVuZGxpZXIgbXNsZWVwKCkgZnVuY3Rpb25zIG9yIGJsb2NraW5nIG1kZWxheSgpLgorICovCitzdGF0aWMgdm9pZCBkb2NfZGVsYXkoc3RydWN0IGRvY2czICpkb2NnMywgaW50IG5iTk9QcykKK3sKKwlpbnQgaTsKKworCWRvY19kYmcoIk5PUCB4ICVkXG4iLCBuYk5PUHMpOworCWZvciAoaSA9IDA7IGkgPCBuYk5PUHM7IGkrKykKKwkJZG9jX3dyaXRlYihkb2NnMywgMCwgRE9DX05PUCk7Cit9CisKK3N0YXRpYyBpbnQgaXNfcHJvdF9zZXFfZXJyb3Ioc3RydWN0IGRvY2czICpkb2NnMykKK3sKKwlpbnQgY3RybDsKKworCWN0cmwgPSBkb2NfcmVnaXN0ZXJfcmVhZGIoZG9jZzMsIERPQ19GTEFTSENPTlRST0wpOworCXJldHVybiBjdHJsICYgKERPQ19DVFJMX1BST1RFQ1RJT05fRVJST1IgfCBET0NfQ1RSTF9TRVFVRU5DRV9FUlJPUik7Cit9CisKK3N0YXRpYyBpbnQgZG9jX2lzX3JlYWR5KHN0cnVjdCBkb2NnMyAqZG9jZzMpCit7CisJaW50IGN0cmw7CisKKwljdHJsID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRkxBU0hDT05UUk9MKTsKKwlyZXR1cm4gY3RybCAmIERPQ19DVFJMX0ZMQVNIUkVBRFk7Cit9CisKK3N0YXRpYyBpbnQgZG9jX3dhaXRfcmVhZHkoc3RydWN0IGRvY2czICpkb2NnMykKK3sKKwlpbnQgbWF4V2FpdEN5Y2xlcyA9IDEwMDsKKworCWRvIHsKKwkJZG9jX2RlbGF5KGRvY2czLCA0KTsKKwkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoIWRvY19pc19yZWFkeShkb2NnMykgJiYgbWF4V2FpdEN5Y2xlcy0tKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDIpOworCWlmIChtYXhXYWl0Q3ljbGVzID4gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBkb2NfcmVzZXRfc2VxKHN0cnVjdCBkb2NnMyAqZG9jZzMpCit7CisJaW50IHJldDsKKworCWRvY193cml0ZWIoZG9jZzMsIDB4MTAsIERPQ19GTEFTSENPTlRST0wpOworCWRvY19mbGFzaF9zZXF1ZW5jZShkb2NnMywgRE9DX1NFUV9SRVNFVCk7CisJZG9jX2ZsYXNoX2NvbW1hbmQoZG9jZzMsIERPQ19DTURfUkVTRVQpOworCWRvY19kZWxheShkb2NnMywgMik7CisJcmV0ID0gZG9jX3dhaXRfcmVhZHkoZG9jZzMpOworCisJZG9jX2RiZygiZG9jX3Jlc2V0X3NlcSgpIC0+IGlzUmVhZHk9JXNcbiIsIHJldCA/ICJmYWxzZSIgOiAidHJ1ZSIpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZG9jX3JlYWRfZGF0YV9hcmVhIC0gUmVhZCBkYXRhIGZyb20gZGF0YSBhcmVhCisgKiBAZG9jZzM6IHRoZSBkZXZpY2UKKyAqIEBidWY6IHRoZSBidWZmZXIgdG8gZmlsbCBpbgorICogQGxlbjogdGhlIGxlbmdodCB0byByZWFkCisgKiBAZmlyc3Q6IGZpcnN0IHRpbWUgcmVhZCwgRE9DX1JFQURBRERSRVNTIHNob3VsZCBiZSBzZXQKKyAqCisgKiBSZWFkcyBieXRlcyBmcm9tIGZsYXNoIGRhdGEuIEhhbmRsZXMgdGhlIHNpbmdsZSBieXRlIC8gZXZlbiBieXRlcyByZWFkcy4KKyAqLworc3RhdGljIHZvaWQgZG9jX3JlYWRfZGF0YV9hcmVhKHN0cnVjdCBkb2NnMyAqZG9jZzMsIHZvaWQgKmJ1ZiwgaW50IGxlbiwKKwkJCSAgICAgICBpbnQgZmlyc3QpCit7CisJaW50IGksIGNkciwgbGVuNDsKKwl1MTYgZGF0YTE2LCAqZHN0MTY7CisJdTggZGF0YTgsICpkc3Q4OworCisJZG9jX2RiZygiZG9jX3JlYWRfZGF0YV9hcmVhKGJ1Zj0lcCwgbGVuPSVkKVxuIiwgYnVmLCBsZW4pOworCWNkciA9IGxlbiAmIDB4MzsKKwlsZW40ID0gbGVuIC0gY2RyOworCisJaWYgKGZpcnN0KQorCQlkb2Nfd3JpdGV3KGRvY2czLCBET0NfSU9TUEFDRV9EQVRBLCBET0NfUkVBREFERFJFU1MpOworCWRzdDE2ID0gYnVmOworCWZvciAoaSA9IDA7IGkgPCBsZW40OyBpICs9IDIpIHsKKwkJZGF0YTE2ID0gZG9jX3JlYWR3KGRvY2czLCBET0NfSU9TUEFDRV9EQVRBKTsKKwkJKmRzdDE2ID0gZGF0YTE2OworCQlkc3QxNisrOworCX0KKworCWlmIChjZHIpIHsKKwkJZG9jX3dyaXRldyhkb2NnMywgRE9DX0lPU1BBQ0VfREFUQSB8IERPQ19SRUFEQUREUl9PTkVfQllURSwKKwkJCSAgIERPQ19SRUFEQUREUkVTUyk7CisJCWRvY19kZWxheShkb2NnMywgMSk7CisJCWRzdDggPSAodTggKilkc3QxNjsKKwkJZm9yIChpID0gMDsgaSA8IGNkcjsgaSsrKSB7CisJCQlkYXRhOCA9IGRvY19yZWFkYihkb2NnMywgRE9DX0lPU1BBQ0VfREFUQSk7CisJCQkqZHN0OCA9IGRhdGE4OworCQkJZHN0OCsrOworCQl9CisJfQorfQorCisvKioKKyAqIGRvY19zZXRfZGF0YV9tb2RlIC0gU2V0cyB0aGUgZmxhc2ggdG8gcmVsaWFibGUgZGF0YSBtb2RlCisgKiBAZG9jZzM6IHRoZSBkZXZpY2UKKyAqCisgKiBUaGUgcmVsaWFibGUgZGF0YSBtb2RlIGlzIGEgYml0IHNsb3dlciB0aGFuIHRoZSBmYXN0IG1vZGUsIGJ1dCBsZXNzIGVycm9ycworICogb2NjdXIuICBFbnRlcmluZyB0aGUgcmVsaWFibGUgbW9kZSBjYW5ub3QgYmUgZG9uZSB3aXRob3V0IGVudGVyaW5nIHRoZSBmYXN0CisgKiBtb2RlIGZpcnN0LgorICovCitzdGF0aWMgdm9pZCBkb2Nfc2V0X3JlbGlhYmxlX21vZGUoc3RydWN0IGRvY2czICpkb2NnMykKK3sKKwlkb2NfZGJnKCJkb2Nfc2V0X3JlbGlhYmxlX21vZGUoKVxuIik7CisJZG9jX2ZsYXNoX3NlcXVlbmNlKGRvY2czLCBET0NfU0VRX1NFVF9NT0RFKTsKKwlkb2NfZmxhc2hfY29tbWFuZChkb2NnMywgRE9DX0NNRF9GQVNUX01PREUpOworCWRvY19mbGFzaF9jb21tYW5kKGRvY2czLCBET0NfQ01EX1JFTElBQkxFX01PREUpOworCWRvY19kZWxheShkb2NnMywgMik7Cit9CisKKy8qKgorICogZG9jX3NldF9hc2ljX21vZGUgLSBTZXQgdGhlIEFTSUMgbW9kZQorICogQGRvY2czOiB0aGUgZGV2aWNlCisgKiBAbW9kZTogdGhlIG1vZGUKKyAqCisgKiBUaGUgQVNJQyBjYW4gd29yayBpbiAzIG1vZGVzIDoKKyAqICAtIFJFU0VUOiBhbGwgcmVnaXN0ZXJzIGFyZSB6ZXJvZWQKKyAqICAtIE5PUk1BTDogcmVjZWl2ZXMgYW5kIGhhbmRsZXMgY29tbWFuZHMKKyAqICAtIFBPV0VSRE9XTjogbWluaW1hbCBwb3dlcnVzZSwgZmxhc2ggcGFydHMgc2h1dCBvZmYKKyAqLworc3RhdGljIHZvaWQgZG9jX3NldF9hc2ljX21vZGUoc3RydWN0IGRvY2czICpkb2NnMywgdTggbW9kZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQorCQlkb2NfcmVhZGIoZG9jZzMsIERPQ19JT1NQQUNFX0lQTCk7CisKKwltb2RlIHw9IERPQ19BU0lDTU9ERV9NRFdSRU47CisJZG9jX2RiZygiZG9jX3NldF9hc2ljX21vZGUoJTAyeClcbiIsIG1vZGUpOworCWRvY193cml0ZWIoZG9jZzMsIG1vZGUsIERPQ19BU0lDTU9ERSk7CisJZG9jX3dyaXRlYihkb2NnMywgfm1vZGUsIERPQ19BU0lDTU9ERUNPTkZJUk0pOworCWRvY19kZWxheShkb2NnMywgMSk7Cit9CisKKy8qKgorICogZG9jX3NldF9kZXZpY2VfaWQgLSBTZXRzIHRoZSBkZXZpY2VzIGlkIGZvciBjYXNjYWRlZCBHMyBjaGlwcworICogQGRvY2czOiB0aGUgZGV2aWNlCisgKiBAaWQ6IHRoZSBjaGlwIHRvIHNlbGVjdCAoYW1vbmdzdCAwLCAxLCAyLCAzKQorICoKKyAqIFRoZXJlIGNhbiBiZSA0IGNhc2NhZGVkIEczIGNoaXBzLiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgdGhlIG9uZSB3aGljaCB3aWxsCisgKiBzaG91bGQgYmUgdGhlIGFjdGl2ZSBvbmUuCisgKi8KK3N0YXRpYyB2b2lkIGRvY19zZXRfZGV2aWNlX2lkKHN0cnVjdCBkb2NnMyAqZG9jZzMsIGludCBpZCkKK3sKKwl1OCBjdHJsOworCisJZG9jX2RiZygiZG9jX3NldF9kZXZpY2VfaWQoJWQpXG4iLCBpZCk7CisJZG9jX3dyaXRlYihkb2NnMywgaWQsIERPQ19ERVZJQ0VTRUxFQ1QpOworCWN0cmwgPSBkb2NfcmVnaXN0ZXJfcmVhZGIoZG9jZzMsIERPQ19GTEFTSENPTlRST0wpOworCisJY3RybCAmPSB+RE9DX0NUUkxfVklPTEFUSU9OOworCWN0cmwgfD0gRE9DX0NUUkxfQ0U7CisJZG9jX3dyaXRlYihkb2NnMywgY3RybCwgRE9DX0ZMQVNIQ09OVFJPTCk7Cit9CisKKy8qKgorICogZG9jX3NldF9leHRyYV9wYWdlX21vZGUgLSBDaGFuZ2UgZmxhc2ggcGFnZSBsYXlvdXQKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICoKKyAqIE5vcm1hbGx5LCB0aGUgZmxhc2ggcGFnZSBpcyBzcGxpdCBpbnRvIHRoZSBkYXRhICg1MTIgYnl0ZXMpIGFuZCB0aGUgb3V0IG9mCisgKiBiYW5kIGRhdGEgKDE2IGJ5dGVzKS4gRm9yIGVhY2gsIDQgbW9yZSBieXRlcyBjYW4gYmUgYWNjZXNzZWQsIHdoZXJlIHRoZSB3ZWFyCisgKiBsZXZlbGluZyBjb3VudGVycyBhcmUgc3RvcmVkLiAgVG8gYWNjZXNzIHRoaXMgbGFzdCBhcmVhIG9mIDQgYnl0ZXMsIGEgc3BlY2lhbAorICogbW9kZSBtdXN0IGJlIGlucHV0IHRvIHRoZSBmbGFzaCBBU0lDLgorICoKKyAqIFJldHVybnMgMCBpZiBubyBlcnJvciBvY2N1cmVkLCAtRUlPIGVsc2UuCisgKi8KK3N0YXRpYyBpbnQgZG9jX3NldF9leHRyYV9wYWdlX21vZGUoc3RydWN0IGRvY2czICpkb2NnMykKK3sKKwlpbnQgZmN0cmw7CisKKwlkb2NfZGJnKCJkb2Nfc2V0X2V4dHJhX3BhZ2VfbW9kZSgpXG4iKTsKKwlkb2NfZmxhc2hfc2VxdWVuY2UoZG9jZzMsIERPQ19TRVFfUEFHRV9TSVpFXzUzMik7CisJZG9jX2ZsYXNoX2NvbW1hbmQoZG9jZzMsIERPQ19DTURfUEFHRV9TSVpFXzUzMik7CisJZG9jX2RlbGF5KGRvY2czLCAyKTsKKworCWZjdHJsID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRkxBU0hDT05UUk9MKTsKKwlpZiAoZmN0cmwgJiAoRE9DX0NUUkxfUFJPVEVDVElPTl9FUlJPUiB8IERPQ19DVFJMX1NFUVVFTkNFX0VSUk9SKSkKKwkJcmV0dXJuIC1FSU87CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkb2Nfc2VlayAtIFNldCBib3RoIGZsYXNoIHBsYW5lcyB0byB0aGUgc3BlY2lmaWVkIGJsb2NrLCBwYWdlIGZvciByZWFkaW5nCisgKiBAZG9jZzM6IHRoZSBkZXZpY2UKKyAqIEBibG9jazA6IHRoZSBmaXJzdCBwbGFuZSBibG9jayBpbmRleAorICogQGJsb2NrMTogdGhlIHNlY29uZCBwbGFuZSBibG9jayBpbmRleAorICogQHBhZ2U6IHRoZSBwYWdlIGluZGV4IHdpdGhpbiB0aGUgYmxvY2sKKyAqIEB3ZWFyOiBpZiB0cnVlLCByZWFkIHdpbGwgb2NjdXIgb24gdGhlIDQgZXh0cmEgYnl0ZXMgb2YgdGhlIHdlYXIgYXJlYQorICogQG9mczogb2Zmc2V0IGluIHBhZ2UgdG8gcmVhZAorICoKKyAqIFByb2dyYW1zIHRoZSBmbGFzaCBldmVuIGFuZCBvZGQgcGxhbmVzIHRvIHRoZSBzcGVjaWZpYyBibG9jayBhbmQgcGFnZS4KKyAqIEFsdGVybmF0aXZlbHksIHByb2dyYW1zIHRoZSBmbGFzaCB0byB0aGUgd2VhciBhcmVhIG9mIHRoZSBzcGVjaWZpZWQgcGFnZS4KKyAqLworc3RhdGljIGludCBkb2NfcmVhZF9zZWVrKHN0cnVjdCBkb2NnMyAqZG9jZzMsIGludCBibG9jazAsIGludCBibG9jazEsIGludCBwYWdlLAorCQkJIGludCB3ZWFyLCBpbnQgb2ZzKQoreworCWludCBzZWN0b3IsIHJldCA9IDA7CisKKwlkb2NfZGJnKCJkb2Nfc2VlayhibG9ja3M9KCVkLCVkKSwgcGFnZT0lZCwgb2ZzPSVkLCB3ZWFyPSVkKVxuIiwKKwkJYmxvY2swLCBibG9jazEsIHBhZ2UsIG9mcywgd2Vhcik7CisKKwlpZiAoIXdlYXIgJiYgKG9mcyA8IDIgKiBET0NfTEFZT1VUX1BBR0VfU0laRSkpIHsKKwkJZG9jX2ZsYXNoX3NlcXVlbmNlKGRvY2czLCBET0NfU0VRX1NFVF9QTEFORTEpOworCQlkb2NfZmxhc2hfY29tbWFuZChkb2NnMywgRE9DX0NNRF9SRUFEX1BMQU5FMSk7CisJCWRvY19kZWxheShkb2NnMywgMik7CisJfSBlbHNlIHsKKwkJZG9jX2ZsYXNoX3NlcXVlbmNlKGRvY2czLCBET0NfU0VRX1NFVF9QTEFORTIpOworCQlkb2NfZmxhc2hfY29tbWFuZChkb2NnMywgRE9DX0NNRF9SRUFEX1BMQU5FMik7CisJCWRvY19kZWxheShkb2NnMywgMik7CisJfQorCisJZG9jX3NldF9yZWxpYWJsZV9tb2RlKGRvY2czKTsKKwlpZiAod2VhcikKKwkJcmV0ID0gZG9jX3NldF9leHRyYV9wYWdlX21vZGUoZG9jZzMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJc2VjdG9yID0gKGJsb2NrMCA8PCBET0NfQUREUl9CTE9DS19TSElGVCkgKyAocGFnZSAmIERPQ19BRERSX1BBR0VfTUFTSyk7CisJZG9jX2ZsYXNoX3NlcXVlbmNlKGRvY2czLCBET0NfU0VRX1JFQUQpOworCWRvY19mbGFzaF9jb21tYW5kKGRvY2czLCBET0NfQ01EX1BST0dfQkxPQ0tfQUREUik7CisJZG9jX2RlbGF5KGRvY2czLCAxKTsKKwlkb2NfZmxhc2hfYWRkcmVzcyhkb2NnMywgc2VjdG9yICYgMHhmZik7CisJZG9jX2ZsYXNoX2FkZHJlc3MoZG9jZzMsIChzZWN0b3IgPj4gOCkgJiAweGZmKTsKKwlkb2NfZmxhc2hfYWRkcmVzcyhkb2NnMywgKHNlY3RvciA+PiAxNikgJiAweGZmKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDEpOworCisJc2VjdG9yID0gKGJsb2NrMSA8PCBET0NfQUREUl9CTE9DS19TSElGVCkgKyAocGFnZSAmIERPQ19BRERSX1BBR0VfTUFTSyk7CisJZG9jX2ZsYXNoX2NvbW1hbmQoZG9jZzMsIERPQ19DTURfUFJPR19CTE9DS19BRERSKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDEpOworCWRvY19mbGFzaF9hZGRyZXNzKGRvY2czLCBzZWN0b3IgJiAweGZmKTsKKwlkb2NfZmxhc2hfYWRkcmVzcyhkb2NnMywgKHNlY3RvciA+PiA4KSAmIDB4ZmYpOworCWRvY19mbGFzaF9hZGRyZXNzKGRvY2czLCAoc2VjdG9yID4+IDE2KSAmIDB4ZmYpOworCWRvY19kZWxheShkb2NnMywgMik7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRvY19yZWFkX3BhZ2VfZWNjX2luaXQgLSBJbml0aWFsaXplIGhhcmR3YXJlIEVDQyBlbmdpbmUKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICogQGxlbjogdGhlIG51bWJlciBvZiBieXRlcyBjb3ZlcmVkIGJ5IHRoZSBFQ0MgKEJDSCBjb3ZlcmVkKQorICoKKyAqIFRoZSBmdW5jdGlvbiBkb2VzIGluaXRpYWxpemUgdGhlIGhhcmR3YXJlIEVDQyBlbmdpbmUgdG8gY29tcHV0ZSB0aGUgSGFtbWluZworICogRUNDIChvbiAxIGJ5dGUpIGFuZCB0aGUgQkNIIFN5bmRyb21zIChvbiA3IGJ5dGVzKS4KKyAqCisgKiBSZXR1cm4gMCBpZiBzdWNjZWVkZWQsIC1FSU8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBkb2NfcmVhZF9wYWdlX2VjY19pbml0KHN0cnVjdCBkb2NnMyAqZG9jZzMsIGludCBsZW4pCit7CisJZG9jX3dyaXRldyhkb2NnMywgRE9DX0VDQ0NPTkYwX1JFQURfTU9ERQorCQkgICB8IERPQ19FQ0NDT05GMF9CQ0hfRU5BQkxFIHwgRE9DX0VDQ0NPTkYwX0hBTU1JTkdfRU5BQkxFCisJCSAgIHwgKGxlbiAmIERPQ19FQ0NDT05GMF9EQVRBX0JZVEVTX01BU0spLAorCQkgICBET0NfRUNDQ09ORjApOworCWRvY19kZWxheShkb2NnMywgNCk7CisJZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRkxBU0hDT05UUk9MKTsKKwlyZXR1cm4gZG9jX3dhaXRfcmVhZHkoZG9jZzMpOworfQorCisvKioKKyAqIGRvY19yZWFkX3BhZ2VfcHJlcGFyZSAtIFByZXBhcmVzIHJlYWRpbmcgZGF0YSBmcm9tIGEgZmxhc2ggcGFnZQorICogQGRvY2czOiB0aGUgZGV2aWNlCisgKiBAYmxvY2swOiB0aGUgZmlyc3QgcGxhbmUgYmxvY2sgaW5kZXggb24gZmxhc2ggbWVtb3J5CisgKiBAYmxvY2sxOiB0aGUgc2Vjb25kIHBsYW5lIGJsb2NrIGluZGV4IG9uIGZsYXNoIG1lbW9yeQorICogQHBhZ2U6IHRoZSBwYWdlIGluZGV4IGluIHRoZSBibG9jaworICogQG9mZnNldDogdGhlIG9mZnNldCBpbiB0aGUgcGFnZSAobXVzdCBiZSBhIG11bHRpcGxlIG9mIDQpCisgKgorICogUHJlcGFyZXMgdGhlIHBhZ2UgdG8gYmUgcmVhZCBpbiB0aGUgZmxhc2ggbWVtb3J5IDoKKyAqICAgLSB0ZWxsIEFTSUMgdG8gbWFwIHRoZSBmbGFzaCBwYWdlcworICogICAtIHRlbGwgQVNJQyB0byBiZSBpbiByZWFkIG1vZGUKKyAqCisgKiBBZnRlciBhIGNhbGwgdG8gdGhpcyBtZXRob2QsIGEgY2FsbCB0byBkb2NfcmVhZF9wYWdlX2ZpbmlzaCBpcyBtYW5kYXRvcnksCisgKiB0byBlbmQgdGhlIHJlYWQgY3ljbGUgb2YgdGhlIGZsYXNoLgorICoKKyAqIFJlYWQgZGF0YSBmcm9tIGEgZmxhc2ggcGFnZS4gVGhlIGxlbmd0aCB0byBiZSByZWFkIG11c3QgYmUgYmV0d2VlbiAwIGFuZAorICogKHBhZ2Vfc2l6ZSArIG9vYl9zaXplICsgd2Vhcl9zaXplKSwgaWUuIDUzMiwgYW5kIGEgbXVsdGlwbGUgb2YgNCAoYmVjYXVzZQorICogdGhlIGV4dHJhIGJ5dGVzIHJlYWRpbmcgaXMgbm90IGltcGxlbWVudGVkKS4KKyAqCisgKiBBcyBwYWdlcyBhcmUgZ3JvdXBlZCBieSAyIChpbiAyIHBsYW5lcyksIHJlYWRpbmcgZnJvbSBhIHBhZ2UgbXVzdCBiZSBkb25lCisgKiBpbiB0d28gc3RlcHM6CisgKiAgLSBvbmUgcmVhZCBvZiA1MTIgYnl0ZXMgYXQgb2Zmc2V0IDAKKyAqICAtIG9uZSByZWFkIG9mIDUxMiBieXRlcyBhdCBvZmZzZXQgNTEyICsgMTYKKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLUVJTyBpZiBhIHJlYWQgZXJyb3Igb2NjdXJlZC4KKyAqLworc3RhdGljIGludCBkb2NfcmVhZF9wYWdlX3ByZXBhcmUoc3RydWN0IGRvY2czICpkb2NnMywgaW50IGJsb2NrMCwgaW50IGJsb2NrMSwKKwkJCQkgaW50IHBhZ2UsIGludCBvZmZzZXQpCit7CisJaW50IHdlYXJfYXJlYSA9IDAsIHJldCA9IDA7CisKKwlkb2NfZGJnKCJkb2NfcmVhZF9wYWdlX3ByZXBhcmUoYmxvY2tzPSglZCwlZCksIHBhZ2U9JWQsIG9mc0luUGFnZT0lZClcbiIsCisJCWJsb2NrMCwgYmxvY2sxLCBwYWdlLCBvZmZzZXQpOworCWlmIChvZmZzZXQgPj0gRE9DX0xBWU9VVF9XRUFSX09GRlNFVCkKKwkJd2Vhcl9hcmVhID0gMTsKKwlpZiAoIXdlYXJfYXJlYSAmJiBvZmZzZXQgPiAoRE9DX0xBWU9VVF9QQUdFX09PQl9TSVpFICogMikpCisJCXJldHVybiAtRUlOVkFMOworCisJZG9jX3NldF9kZXZpY2VfaWQoZG9jZzMsIGRvY2czLT5kZXZpY2VfaWQpOworCXJldCA9IGRvY19yZXNldF9zZXEoZG9jZzMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJLyogUHJvZ3JhbSB0aGUgZmxhc2ggYWRkcmVzcyBibG9jayBhbmQgcGFnZSAqLworCXJldCA9IGRvY19yZWFkX3NlZWsoZG9jZzMsIGJsb2NrMCwgYmxvY2sxLCBwYWdlLCB3ZWFyX2FyZWEsIG9mZnNldCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlkb2NfZmxhc2hfY29tbWFuZChkb2NnMywgRE9DX0NNRF9SRUFEX0FMTF9QTEFORVMpOworCWRvY19kZWxheShkb2NnMywgMik7CisJZG9jX3dhaXRfcmVhZHkoZG9jZzMpOworCisJZG9jX2ZsYXNoX2NvbW1hbmQoZG9jZzMsIERPQ19DTURfU0VUX0FERFJfUkVBRCk7CisJZG9jX2RlbGF5KGRvY2czLCAxKTsKKwlpZiAob2Zmc2V0ID49IERPQ19MQVlPVVRfUEFHRV9TSVpFICogMikKKwkJb2Zmc2V0IC09IDIgKiBET0NfTEFZT1VUX1BBR0VfU0laRTsKKwlkb2NfZmxhc2hfYWRkcmVzcyhkb2NnMywgb2Zmc2V0ID4+IDIpOworCWRvY19kZWxheShkb2NnMywgMSk7CisJZG9jX3dhaXRfcmVhZHkoZG9jZzMpOworCisJZG9jX2ZsYXNoX2NvbW1hbmQoZG9jZzMsIERPQ19DTURfUkVBRF9GTEFTSCk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkb2Nfd3JpdGViKGRvY2czLCAwLCBET0NfREFUQUVORCk7CisJZG9jX2RlbGF5KGRvY2czLCAyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoqCisgKiBkb2NfcmVhZF9wYWdlX2dldGJ5dGVzIC0gUmVhZHMgYnl0ZXMgZnJvbSBhIHByZXBhcmVkIHBhZ2UKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICogQGxlbjogdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkIChtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCkKKyAqIEBidWY6IHRoZSBidWZmZXIgdG8gYmUgZmlsbGVkIGluCisgKiBAZmlyc3Q6IDEgaWYgZmlyc3QgdGltZSByZWFkLCBET0NfUkVBREFERFJFU1Mgc2hvdWxkIGJlIHNldAorICoKKyAqLworc3RhdGljIGludCBkb2NfcmVhZF9wYWdlX2dldGJ5dGVzKHN0cnVjdCBkb2NnMyAqZG9jZzMsIGludCBsZW4sIHVfY2hhciAqYnVmLAorCQkJCSAgaW50IGZpcnN0KQoreworCWRvY19yZWFkX2RhdGFfYXJlYShkb2NnMywgYnVmLCBsZW4sIGZpcnN0KTsKKwlkb2NfZGVsYXkoZG9jZzMsIDIpOworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogZG9jX2dldF9od19iY2hfc3luZHJvbXMgLSBHZXQgaGFyZHdhcmUgY2FsY3VsYXRlZCBCQ0ggc3luZHJvbXMKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICogQHN5bnM6ICB0aGUgYXJyYXkgb2YgNyBpbnRlZ2VycyB3aGVyZSB0aGUgc3luZHJvbXMgd2lsbCBiZSBzdG9yZWQKKyAqLworc3RhdGljIHZvaWQgZG9jX2dldF9od19iY2hfc3luZHJvbXMoc3RydWN0IGRvY2czICpkb2NnMywgaW50ICpzeW5zKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IERPQ19FQ0NfQkNIX1NJWkU7IGkrKykKKwkJc3luc1tpXSA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0JDSF9TWU5EUk9NKGkpKTsKK30KKworLyoqCisgKiBkb2NfcmVhZF9wYWdlX2ZpbmlzaCAtIEVuZHMgcmVhZGluZyBvZiBhIGZsYXNoIHBhZ2UKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICoKKyAqIEFzIGEgc2lkZSBlZmZlY3QsIHJlc2V0cyB0aGUgY2hpcCBzZWxlY3RvciB0byAwLiBUaGlzIGVuc3VyZXMgdGhhdCBhZnRlciBlYWNoCisgKiByZWFkIG9wZXJhdGlvbiwgdGhlIGZsb29yIDAgaXMgc2VsZWN0ZWQuIFRoZXJlZm9yZSwgaWYgdGhlIHN5c3RlbXMgaGFsdHMsIHRoZQorICogcmVib290IHdpbGwgYm9vdCBvbiBmbG9vciAwLCB3aGVyZSB0aGUgSVBMIGlzLgorICovCitzdGF0aWMgdm9pZCBkb2NfcmVhZF9wYWdlX2ZpbmlzaChzdHJ1Y3QgZG9jZzMgKmRvY2czKQoreworCWRvY193cml0ZWIoZG9jZzMsIDAsIERPQ19EQVRBRU5EKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDIpOworCWRvY19zZXRfZGV2aWNlX2lkKGRvY2czLCAwKTsKK30KKworLyoqCisgKiBjYWxjX2Jsb2NrX3NlY3RvciAtIENhbGN1bGF0ZSBibG9ja3MsIHBhZ2VzIGFuZCBvZnMuCisKKyAqIEBmcm9tOiBvZmZzZXQgaW4gZmxhc2gKKyAqIEBibG9jazA6IGZpcnN0IHBsYW5lIGJsb2NrIGluZGV4IGNhbGN1bGF0ZWQKKyAqIEBibG9jazE6IHNlY29uZCBwbGFuZSBibG9jayBpbmRleCBjYWxjdWxhdGVkCisgKiBAcGFnZTogcGFnZSBjYWxjdWxhdGVkCisgKiBAb2ZzOiBvZmZzZXQgaW4gcGFnZQorICovCitzdGF0aWMgdm9pZCBjYWxjX2Jsb2NrX3NlY3Rvcihsb2ZmX3QgZnJvbSwgaW50ICpibG9jazAsIGludCAqYmxvY2sxLCBpbnQgKnBhZ2UsCisJCQkgICAgICBpbnQgKm9mcykKK3sKKwl1aW50IHNlY3RvcjsKKworCXNlY3RvciA9IGZyb20gLyBET0NfTEFZT1VUX1BBR0VfU0laRTsKKwkqYmxvY2swID0gc2VjdG9yIC8gKERPQ19MQVlPVVRfUEFHRVNfUEVSX0JMT0NLICogRE9DX0xBWU9VVF9OQlBMQU5FUykKKwkJKiBET0NfTEFZT1VUX05CUExBTkVTOworCSpibG9jazEgPSAqYmxvY2swICsgMTsKKwkqcGFnZSA9IHNlY3RvciAlIChET0NfTEFZT1VUX1BBR0VTX1BFUl9CTE9DSyAqIERPQ19MQVlPVVRfTkJQTEFORVMpOworCSpwYWdlIC89IERPQ19MQVlPVVRfTkJQTEFORVM7CisJaWYgKHNlY3RvciAlIDIpCisJCSpvZnMgPSBET0NfTEFZT1VUX1BBR0VfT09CX1NJWkU7CisJZWxzZQorCQkqb2ZzID0gMDsKK30KKworLyoqCisgKiBkb2NfcmVhZCAtIFJlYWQgYnl0ZXMgZnJvbSBmbGFzaAorICogQG10ZDogdGhlIGRldmljZQorICogQGZyb206IHRoZSBvZmZzZXQgZnJvbSBmaXJzdCBibG9jayBhbmQgZmlyc3QgcGFnZSwgaW4gYnl0ZXMsIGFsaWduZWQgb24gcGFnZQorICogICAgICAgIHNpemUKKyAqIEBsZW46IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAobXVzdCBiZSBhIG11bHRpcGxlIG9mIDQpCisgKiBAcmV0bGVuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQKKyAqIEBidWY6IHRoZSBmaWxsZWQgaW4gYnVmZmVyCisgKgorICogUmVhZHMgZmxhc2ggbWVtb3J5IHBhZ2VzLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlYWQgdGhlIE9PQiBjaHVuaywgYnV0IG9ubHkKKyAqIHRoZSBwYWdlIGRhdGEuCisgKgorICogUmV0dXJucyAwIGlmIHJlYWQgc3VjY2Vzc2Z1bGwsIG9mIC1FSU8sIC1FSU5WQUwgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitzdGF0aWMgaW50IGRvY19yZWFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkgICAgIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZG9jZzMgKmRvY2czID0gbXRkLT5wcml2OworCWludCBibG9jazAsIGJsb2NrMSwgcGFnZSwgcmVhZGxlbiwgcmV0LCBvZnMgPSAwOworCWludCBzeW5bRE9DX0VDQ19CQ0hfU0laRV0sIGVjY2NvbmYxOworCXU4IG9vYltET0NfTEFZT1VUX09PQl9TSVpFXTsKKworCXJldCA9IC1FSU5WQUw7CisJZG9jX2RiZygiZG9jX3JlYWQoZnJvbT0lbGxkLCBsZW49JXp1LCBidWY9JXApXG4iLCBmcm9tLCBsZW4sIGJ1Zik7CisJaWYgKGZyb20gJSBET0NfTEFZT1VUX1BBR0VfU0laRSkKKwkJZ290byBlcnI7CisJaWYgKGxlbiAlIDQpCisJCWdvdG8gZXJyOworCWNhbGNfYmxvY2tfc2VjdG9yKGZyb20sICZibG9jazAsICZibG9jazEsICZwYWdlLCAmb2ZzKTsKKwlpZiAoYmxvY2sxID4gZG9jZzMtPm1heF9ibG9jaykKKwkJZ290byBlcnI7CisKKwkqcmV0bGVuID0gMDsKKwlyZXQgPSAwOworCXJlYWRsZW4gPSBtaW5fdChzaXplX3QsIGxlbiwgKHNpemVfdClET0NfTEFZT1VUX1BBR0VfU0laRSk7CisJd2hpbGUgKCFyZXQgJiYgbGVuID4gMCkgeworCQlyZWFkbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIChzaXplX3QpRE9DX0xBWU9VVF9QQUdFX1NJWkUpOworCQlyZXQgPSBkb2NfcmVhZF9wYWdlX3ByZXBhcmUoZG9jZzMsIGJsb2NrMCwgYmxvY2sxLCBwYWdlLCBvZnMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyOworCQlyZXQgPSBkb2NfcmVhZF9wYWdlX2VjY19pbml0KGRvY2czLCBET0NfRUNDX0JDSF9DT1ZFUkVEX0JZVEVTKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycl9pbl9yZWFkOworCQlyZXQgPSBkb2NfcmVhZF9wYWdlX2dldGJ5dGVzKGRvY2czLCByZWFkbGVuLCBidWYsIDEpOworCQlpZiAocmV0IDwgcmVhZGxlbikKKwkJCWdvdG8gZXJyX2luX3JlYWQ7CisJCXJldCA9IGRvY19yZWFkX3BhZ2VfZ2V0Ynl0ZXMoZG9jZzMsIERPQ19MQVlPVVRfT09CX1NJWkUsCisJCQkJCSAgICAgb29iLCAwKTsKKwkJaWYgKHJldCA8IERPQ19MQVlPVVRfT09CX1NJWkUpCisJCQlnb3RvIGVycl9pbl9yZWFkOworCisJCSpyZXRsZW4gKz0gcmVhZGxlbjsKKwkJYnVmICs9IHJlYWRsZW47CisJCWxlbiAtPSByZWFkbGVuOworCisJCW9mcyBePSBET0NfTEFZT1VUX1BBR0VfT09CX1NJWkU7CisJCWlmIChvZnMgPT0gMCkKKwkJCXBhZ2UgKz0gMjsKKwkJaWYgKHBhZ2UgPiBET0NfQUREUl9QQUdFX01BU0spIHsKKwkJCXBhZ2UgPSAwOworCQkJYmxvY2swICs9IDI7CisJCQlibG9jazEgKz0gMjsKKwkJfQorCisJCS8qCisJCSAqIFRoZXJlIHNob3VsZCBiZSBhIEJDSCBiaXRzdHJlYW0gZml4aW5nIGFsZ29yaXRobSBoZXJlIC4uLgorCQkgKiBCeSBub3csIGEgcGFnZSByZWFkIGZhaWx1cmUgaXMgdHJpZ2dlcmVkIGJ5IEJDSCBlcnJvcgorCQkgKi8KKwkJZG9jX2dldF9od19iY2hfc3luZHJvbXMoZG9jZzMsIHN5bik7CisJCWVjY2NvbmYxID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRUNDQ09ORjEpOworCisJCWRvY19kYmcoIk9PQiAtIElORk86ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkgb29iWzBdLCBvb2JbMV0sIG9vYlsyXSwgb29iWzNdLCBvb2JbNF0sCisJCQkgb29iWzVdLCBvb2JbNl0pOworCQlkb2NfZGJnKCJPT0IgLSBIQU1NSU5HOiAlMDJ4XG4iLCBvb2JbN10pOworCQlkb2NfZGJnKCJPT0IgLSBCQ0hfRUNDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJIG9vYls4XSwgb29iWzldLCBvb2JbMTBdLCBvb2JbMTFdLCBvb2JbMTJdLAorCQkJIG9vYlsxM10sIG9vYlsxNF0pOworCQlkb2NfZGJnKCJPT0IgLSBVTlVTRUQ6ICUwMnhcbiIsIG9vYlsxNV0pOworCQlkb2NfZGJnKCJFQ0MgY2hlY2tzOiBFQ0NDb25mMT0leFxuIiwgZWNjY29uZjEpOworCQlkb2NfZGJnKCJFQ0MgQkNIIHN5bmRyb206ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlzeW5bMF0sIHN5blsxXSwgc3luWzJdLCBzeW5bM10sIHN5bls0XSwgc3luWzVdLCBzeW5bNl0pOworCisJCXJldCA9IC1FQkFETVNHOworCQlpZiAoYmxvY2swID49IERPQ19MQVlPVVRfQkxPQ0tfRklSU1RfREFUQSkgeworCQkJaWYgKGVjY2NvbmYxICYgRE9DX0VDQ0NPTkYxX0JDSF9TWU5EUk9NX0VSUikKKwkJCQlnb3RvIGVycl9pbl9yZWFkOworCQkJaWYgKGlzX3Byb3Rfc2VxX2Vycm9yKGRvY2czKSkKKwkJCQlnb3RvIGVycl9pbl9yZWFkOworCQl9CisJCWRvY19yZWFkX3BhZ2VfZmluaXNoKGRvY2czKTsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9pbl9yZWFkOgorCWRvY19yZWFkX3BhZ2VfZmluaXNoKGRvY2czKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRvY19yZWFkX29vYiAtIFJlYWQgb3V0IG9mIGJhbmQgYnl0ZXMgZnJvbSBmbGFzaAorICogQG10ZDogdGhlIGRldmljZQorICogQGZyb206IHRoZSBvZmZzZXQgZnJvbSBmaXJzdCBibG9jayBhbmQgZmlyc3QgcGFnZSwgaW4gYnl0ZXMsIGFsaWduZWQgb24gcGFnZQorICogICAgICAgIHNpemUKKyAqIEBvcHM6IHRoZSBtdGQgb29iIHN0cnVjdHVyZQorICoKKyAqIFJlYWRzIGZsYXNoIG1lbW9yeSBPT0IgYXJlYSBvZiBwYWdlcy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgcmVhZCBzdWNjZXNzZnVsbCwgb2YgLUVJTywgLUVJTlZBTCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK3N0YXRpYyBpbnQgZG9jX3JlYWRfb29iKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKKwkJCXN0cnVjdCBtdGRfb29iX29wcyAqb3BzKQoreworCXN0cnVjdCBkb2NnMyAqZG9jZzMgPSBtdGQtPnByaXY7CisJaW50IGJsb2NrMCwgYmxvY2sxLCBwYWdlLCBvZnMsIHJldDsKKwl1OCAqYnVmID0gb3BzLT5vb2JidWY7CisJc2l6ZV90IGxlbiA9IG9wcy0+b29ibGVuOworCisJZG9jX2RiZygiZG9jX3JlYWRfb29iKGZyb209JWxsZCwgYnVmPSVwLCBsZW49JXp1KVxuIiwgZnJvbSwgYnVmLCBsZW4pOworCWlmIChsZW4gIT0gRE9DX0xBWU9VVF9PT0JfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKG9wcy0+bW9kZSkgeworCWNhc2UgTVREX09QU19QTEFDRV9PT0I6CisJCWJ1ZiArPSBvcHMtPm9vYm9mZnM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWNhbGNfYmxvY2tfc2VjdG9yKGZyb20sICZibG9jazAsICZibG9jazEsICZwYWdlLCAmb2ZzKTsKKwlpZiAoYmxvY2sxID4gZG9jZzMtPm1heF9ibG9jaykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkb2NfcmVhZF9wYWdlX3ByZXBhcmUoZG9jZzMsIGJsb2NrMCwgYmxvY2sxLCBwYWdlLAorCQkJCSAgICBvZnMgKyBET0NfTEFZT1VUX1BBR0VfU0laRSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGRvY19yZWFkX3BhZ2VfZWNjX2luaXQoZG9jZzMsIERPQ19MQVlPVVRfT09CX1NJWkUpOworCWlmICghcmV0KQorCQlyZXQgPSBkb2NfcmVhZF9wYWdlX2dldGJ5dGVzKGRvY2czLCBET0NfTEFZT1VUX09PQl9TSVpFLAorCQkJCQkgICAgIGJ1ZiwgMSk7CisJZG9jX3JlYWRfcGFnZV9maW5pc2goZG9jZzMpOworCisJaWYgKHJldCA+IDApCisJCW9wcy0+b29icmV0bGVuID0gcmV0OworCWVsc2UKKwkJb3BzLT5vb2JyZXRsZW4gPSAwOworCXJldHVybiAocmV0ID4gMCkgPyAwIDogcmV0OworfQorCitzdGF0aWMgaW50IGRvY19yZWxvYWRfYmJ0KHN0cnVjdCBkb2NnMyAqZG9jZzMpCit7CisJaW50IGJsb2NrID0gRE9DX0xBWU9VVF9CTE9DS19CQlQ7CisJaW50IHJldCA9IDAsIG5icGFnZXMsIHBhZ2U7CisJdV9jaGFyICpidWYgPSBkb2NnMy0+YmJ0OworCisJbmJwYWdlcyA9IERJVl9ST1VORF9VUChkb2NnMy0+bWF4X2Jsb2NrICsgMSwgOCAqIERPQ19MQVlPVVRfUEFHRV9TSVpFKTsKKwlmb3IgKHBhZ2UgPSAwOyAhcmV0ICYmIChwYWdlIDwgbmJwYWdlcyk7IHBhZ2UrKykgeworCQlyZXQgPSBkb2NfcmVhZF9wYWdlX3ByZXBhcmUoZG9jZzMsIGJsb2NrLCBibG9jayArIDEsCisJCQkJCSAgICBwYWdlICsgRE9DX0xBWU9VVF9QQUdFX0JCVCwgMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZG9jX3JlYWRfcGFnZV9lY2NfaW5pdChkb2NnMywKKwkJCQkJCSAgICAgRE9DX0xBWU9VVF9QQUdFX1NJWkUpOworCQlpZiAoIXJldCkKKwkJCWRvY19yZWFkX3BhZ2VfZ2V0Ynl0ZXMoZG9jZzMsIERPQ19MQVlPVVRfUEFHRV9TSVpFLAorCQkJCQkgICAgICAgYnVmLCAxKTsKKwkJYnVmICs9IERPQ19MQVlPVVRfUEFHRV9TSVpFOworCX0KKwlkb2NfcmVhZF9wYWdlX2ZpbmlzaChkb2NnMyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkb2NfYmxvY2tfaXNiYWQgLSBDaGVja3Mgd2hldGhlciBhIGJsb2NrIGlzIGdvb2Qgb3Igbm90CisgKiBAbXRkOiB0aGUgZGV2aWNlCisgKiBAZnJvbTogdGhlIG9mZnNldCB0byBmaW5kIHRoZSBjb3JyZWN0IGJsb2NrCisgKgorICogUmV0dXJucyAxIGlmIGJsb2NrIGlzIGJhZCwgMCBpZiBibG9jayBpcyBnb29kCisgKi8KK3N0YXRpYyBpbnQgZG9jX2Jsb2NrX2lzYmFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSkKK3sKKwlzdHJ1Y3QgZG9jZzMgKmRvY2czID0gbXRkLT5wcml2OworCWludCBibG9jazAsIGJsb2NrMSwgcGFnZSwgb2ZzLCBpc19nb29kOworCisJY2FsY19ibG9ja19zZWN0b3IoZnJvbSwgJmJsb2NrMCwgJmJsb2NrMSwgJnBhZ2UsICZvZnMpOworCWRvY19kYmcoImRvY19ibG9ja19pc2JhZChmcm9tPSVsbGQpID0+IGJsb2NrPSglZCwlZCksIHBhZ2U9JWQsIG9mcz0lZFxuIiwKKwkJZnJvbSwgYmxvY2swLCBibG9jazEsIHBhZ2UsIG9mcyk7CisKKwlpZiAoYmxvY2swIDwgRE9DX0xBWU9VVF9CTE9DS19GSVJTVF9EQVRBKQorCQlyZXR1cm4gMDsKKwlpZiAoYmxvY2sxID4gZG9jZzMtPm1heF9ibG9jaykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpc19nb29kID0gZG9jZzMtPmJidFtibG9jazAgPj4gM10gJiAoMSA8PCAoYmxvY2swICYgMHg3KSk7CisJcmV0dXJuICFpc19nb29kOworfQorCisvKioKKyAqIGRvY19nZXRfZXJhc2VfY291bnQgLSBHZXQgYmxvY2sgZXJhc2UgY291bnQKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICogQGZyb206IHRoZSBvZmZzZXQgaW4gd2hpY2ggdGhlIGJsb2NrIGlzLgorICoKKyAqIEdldCB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgYmxvY2sgd2FzIGVyYXNlZC4gVGhlIG51bWJlciBpcyB0aGUgbWF4aW11bSBvZgorICogZXJhc2UgdGltZXMgYmV0d2VlbiBmaXJzdCBhbmQgc2Vjb25kIHBsYW5lICh3aGljaCBzaG91bGQgYmUgZXF1YWwgbm9ybWFsbHkpLgorICoKKyAqIFJldHVybnMgVGhlIG51bWJlciBvZiBlcmFzZXMsIG9yIC1FSU5WQUwgb3IgLUVJTyBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBkb2NfZ2V0X2VyYXNlX2NvdW50KHN0cnVjdCBkb2NnMyAqZG9jZzMsIGxvZmZfdCBmcm9tKQoreworCXU4IGJ1ZltET0NfTEFZT1VUX1dFQVJfU0laRV07CisJaW50IHJldCwgcGxhbmUxX2VyYXNlX2NvdW50LCBwbGFuZTJfZXJhc2VfY291bnQ7CisJaW50IGJsb2NrMCwgYmxvY2sxLCBwYWdlLCBvZnM7CisKKwlkb2NfZGJnKCJkb2NfZ2V0X2VyYXNlX2NvdW50KGZyb209JWxsZCwgYnVmPSVwKVxuIiwgZnJvbSwgYnVmKTsKKwlpZiAoZnJvbSAlIERPQ19MQVlPVVRfUEFHRV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwljYWxjX2Jsb2NrX3NlY3Rvcihmcm9tLCAmYmxvY2swLCAmYmxvY2sxLCAmcGFnZSwgJm9mcyk7CisJaWYgKGJsb2NrMSA+IGRvY2czLT5tYXhfYmxvY2spCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZG9jX3Jlc2V0X3NlcShkb2NnMyk7CisJaWYgKCFyZXQpCisJCXJldCA9IGRvY19yZWFkX3BhZ2VfcHJlcGFyZShkb2NnMywgYmxvY2swLCBibG9jazEsIHBhZ2UsCisJCQkJCSAgICBvZnMgKyBET0NfTEFZT1VUX1dFQVJfT0ZGU0VUKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZG9jX3JlYWRfcGFnZV9nZXRieXRlcyhkb2NnMywgRE9DX0xBWU9VVF9XRUFSX1NJWkUsCisJCQkJCSAgICAgYnVmLCAxKTsKKwlkb2NfcmVhZF9wYWdlX2ZpbmlzaChkb2NnMyk7CisKKwlpZiAocmV0IHx8IChidWZbMF0gIT0gRE9DX0VSQVNFX01BUkspIHx8IChidWZbMl0gIT0gRE9DX0VSQVNFX01BUkspKQorCQlyZXR1cm4gLUVJTzsKKwlwbGFuZTFfZXJhc2VfY291bnQgPSAodTgpKH5idWZbMV0pIHwgKCh1OCkofmJ1Zls0XSkgPDwgOCkKKwkJfCAoKHU4KSh+YnVmWzVdKSA8PCAxNik7CisJcGxhbmUyX2VyYXNlX2NvdW50ID0gKHU4KSh+YnVmWzNdKSB8ICgodTgpKH5idWZbNl0pIDw8IDgpCisJCXwgKCh1OCkofmJ1Zls3XSkgPDwgMTYpOworCisJcmV0dXJuIG1heChwbGFuZTFfZXJhc2VfY291bnQsIHBsYW5lMl9lcmFzZV9jb3VudCk7Cit9CisKKy8qCisgKiBEZWJ1ZyBzeXNmcyBlbnRyaWVzCisgKi8KK3N0YXRpYyBpbnQgZGJnX2ZsYXNoY3RybF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgZG9jZzMgKmRvY2czID0gKHN0cnVjdCBkb2NnMyAqKXMtPnByaXZhdGU7CisKKwlpbnQgcG9zID0gMDsKKwl1OCBmY3RybCA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0ZMQVNIQ09OVFJPTCk7CisKKwlwb3MgKz0gc2VxX3ByaW50ZihzLAorCQkgIkZsYXNoQ29udHJvbCA6IDB4JTAyeCAoJXMsQ0UjICVzLCVzLCVzLGZsYXNoICVzKVxuIiwKKwkJIGZjdHJsLAorCQkgZmN0cmwgJiBET0NfQ1RSTF9WSU9MQVRJT04gPyAicHJvdG9jb2wgdmlvbGF0aW9uIiA6ICItIiwKKwkJIGZjdHJsICYgRE9DX0NUUkxfQ0UgPyAiYWN0aXZlIiA6ICJpbmFjdGl2ZSIsCisJCSBmY3RybCAmIERPQ19DVFJMX1BST1RFQ1RJT05fRVJST1IgPyAicHJvdGVjdGlvbiBlcnJvciIgOiAiLSIsCisJCSBmY3RybCAmIERPQ19DVFJMX1NFUVVFTkNFX0VSUk9SID8gInNlcXVlbmNlIGVycm9yIiA6ICItIiwKKwkJIGZjdHJsICYgRE9DX0NUUkxfRkxBU0hSRUFEWSA/ICJyZWFkeSIgOiAibm90IHJlYWR5Iik7CisJcmV0dXJuIHBvczsKK30KK0RFQlVHRlNfUk9fQVRUUihmbGFzaGNvbnRyb2wsIGRiZ19mbGFzaGN0cmxfc2hvdyk7CisKK3N0YXRpYyBpbnQgZGJnX2FzaWNtb2RlX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQoreworCXN0cnVjdCBkb2NnMyAqZG9jZzMgPSAoc3RydWN0IGRvY2czICopcy0+cHJpdmF0ZTsKKworCWludCBwb3MgPSAwOworCWludCBwY3RybCA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0FTSUNNT0RFKTsKKwlpbnQgbW9kZSA9IHBjdHJsICYgMHgwMzsKKworCXBvcyArPSBzZXFfcHJpbnRmKHMsCisJCQkgIiUwNHggOiBSQU1fV0U9JWQsUlNUSU5fUkVTRVQ9JWQsQkRFVENUX1JFU0VUPSVkLFdSSVRFX0VOQUJMRT0lZCxQT1dFUkRPV049JWQsTU9ERT0lZCVkICgiLAorCQkJIHBjdHJsLAorCQkJIHBjdHJsICYgRE9DX0FTSUNNT0RFX1JBTV9XRSA/IDEgOiAwLAorCQkJIHBjdHJsICYgRE9DX0FTSUNNT0RFX1JTVElOX1JFU0VUID8gMSA6IDAsCisJCQkgcGN0cmwgJiBET0NfQVNJQ01PREVfQkRFVENUX1JFU0VUID8gMSA6IDAsCisJCQkgcGN0cmwgJiBET0NfQVNJQ01PREVfTURXUkVOID8gMSA6IDAsCisJCQkgcGN0cmwgJiBET0NfQVNJQ01PREVfUE9XRVJET1dOID8gMSA6IDAsCisJCQkgbW9kZSA+PiAxLCBtb2RlICYgMHgxKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgRE9DX0FTSUNNT0RFX1JFU0VUOgorCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAicmVzZXQiKTsKKwkJYnJlYWs7CisJY2FzZSBET0NfQVNJQ01PREVfTk9STUFMOgorCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAibm9ybWFsIik7CisJCWJyZWFrOworCWNhc2UgRE9DX0FTSUNNT0RFX1BPV0VSRE9XTjoKKwkJcG9zICs9IHNlcV9wcmludGYocywgInBvd2VyZG93biIpOworCQlicmVhazsKKwl9CisJcG9zICs9IHNlcV9wcmludGYocywgIilcbiIpOworCXJldHVybiBwb3M7Cit9CitERUJVR0ZTX1JPX0FUVFIoYXNpY19tb2RlLCBkYmdfYXNpY21vZGVfc2hvdyk7CisKK3N0YXRpYyBpbnQgZGJnX2RldmljZV9pZF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgZG9jZzMgKmRvY2czID0gKHN0cnVjdCBkb2NnMyAqKXMtPnByaXZhdGU7CisJaW50IHBvcyA9IDA7CisJaW50IGlkID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfREVWSUNFU0VMRUNUKTsKKworCXBvcyArPSBzZXFfcHJpbnRmKHMsICJEZXZpY2VJZCA9ICVkXG4iLCBpZCk7CisJcmV0dXJuIHBvczsKK30KK0RFQlVHRlNfUk9fQVRUUihkZXZpY2VfaWQsIGRiZ19kZXZpY2VfaWRfc2hvdyk7CisKK3N0YXRpYyBpbnQgZGJnX3Byb3RlY3Rpb25fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCit7CisJc3RydWN0IGRvY2czICpkb2NnMyA9IChzdHJ1Y3QgZG9jZzMgKilzLT5wcml2YXRlOworCWludCBwb3MgPSAwOworCWludCBwcm90ZWN0ID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfUFJPVEVDVElPTik7CisJaW50IGRwczAgPSBkb2NfcmVnaXN0ZXJfcmVhZGIoZG9jZzMsIERPQ19EUFMwX1NUQVRVUyk7CisJaW50IGRwczBfbG93ID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRFBTMF9BRERSTE9XKTsKKwlpbnQgZHBzMF9oaWdoID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRFBTMF9BRERSSElHSCk7CisJaW50IGRwczEgPSBkb2NfcmVnaXN0ZXJfcmVhZGIoZG9jZzMsIERPQ19EUFMxX1NUQVRVUyk7CisJaW50IGRwczFfbG93ID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRFBTMV9BRERSTE9XKTsKKwlpbnQgZHBzMV9oaWdoID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRFBTMV9BRERSSElHSCk7CisKKwlwb3MgKz0gc2VxX3ByaW50ZihzLCAiUHJvdGVjdGlvbiA9IDB4JTAyeCAoIiwKKwkJCSBwcm90ZWN0KTsKKwlpZiAocHJvdGVjdCAmIERPQ19QUk9URUNUX0ZPVU5EUllfT1RQX0xPQ0spCisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJGT1VORFJZX09UUF9MT0NLLCIpOworCWlmIChwcm90ZWN0ICYgRE9DX1BST1RFQ1RfQ1VTVE9NRVJfT1RQX0xPQ0spCisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJDVVNUT01FUl9PVFBfTE9DSywiKTsKKwlpZiAocHJvdGVjdCAmIERPQ19QUk9URUNUX0xPQ0tfSU5QVVQpCisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJMT0NLX0lOUFVULCIpOworCWlmIChwcm90ZWN0ICYgRE9DX1BST1RFQ1RfU1RJQ0tZX0xPQ0spCisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJTVElDS1lfTE9DSywiKTsKKwlpZiAocHJvdGVjdCAmIERPQ19QUk9URUNUX1BST1RFQ1RJT05fRU5BQkxFRCkKKwkJcG9zICs9IHNlcV9wcmludGYocywgIlBST1RFQ1RJT04gT04sIik7CisJaWYgKHByb3RlY3QgJiBET0NfUFJPVEVDVF9JUExfRE9XTkxPQURfTE9DSykKKwkJcG9zICs9IHNlcV9wcmludGYocywgIklQTF9ET1dOTE9BRF9MT0NLLCIpOworCWlmIChwcm90ZWN0ICYgRE9DX1BST1RFQ1RfUFJPVEVDVElPTl9FUlJPUikKKwkJcG9zICs9IHNlcV9wcmludGYocywgIlBST1RFQ1RfRVJSLCIpOworCWVsc2UKKwkJcG9zICs9IHNlcV9wcmludGYocywgIk5PX1BST1RFQ1RfRVJSIik7CisJcG9zICs9IHNlcV9wcmludGYocywgIilcbiIpOworCisJcG9zICs9IHNlcV9wcmludGYocywgIkRQUzAgPSAweCUwMnggOiAiCisJCQkgIlByb3RlY3RlZCBhcmVhIFsweCV4IC0gMHgleF0gOiBPVFA9JWQsIFJFQUQ9JWQsICIKKwkJCSAiV1JJVEU9JWQsIEhXX0xPQ0s9JWQsIEtFWV9PSz0lZFxuIiwKKwkJCSBkcHMwLCBkcHMwX2xvdywgZHBzMF9oaWdoLAorCQkJICEhKGRwczAgJiBET0NfRFBTX09UUF9QUk9URUNURUQpLAorCQkJICEhKGRwczAgJiBET0NfRFBTX1JFQURfUFJPVEVDVEVEKSwKKwkJCSAhIShkcHMwICYgRE9DX0RQU19XUklURV9QUk9URUNURUQpLAorCQkJICEhKGRwczAgJiBET0NfRFBTX0hXX0xPQ0tfRU5BQkxFRCksCisJCQkgISEoZHBzMCAmIERPQ19EUFNfS0VZX09LKSk7CisJcG9zICs9IHNlcV9wcmludGYocywgIkRQUzEgPSAweCUwMnggOiAiCisJCQkgIlByb3RlY3RlZCBhcmVhIFsweCV4IC0gMHgleF0gOiBPVFA9JWQsIFJFQUQ9JWQsICIKKwkJCSAiV1JJVEU9JWQsIEhXX0xPQ0s9JWQsIEtFWV9PSz0lZFxuIiwKKwkJCSBkcHMxLCBkcHMxX2xvdywgZHBzMV9oaWdoLAorCQkJICEhKGRwczEgJiBET0NfRFBTX09UUF9QUk9URUNURUQpLAorCQkJICEhKGRwczEgJiBET0NfRFBTX1JFQURfUFJPVEVDVEVEKSwKKwkJCSAhIShkcHMxICYgRE9DX0RQU19XUklURV9QUk9URUNURUQpLAorCQkJICEhKGRwczEgJiBET0NfRFBTX0hXX0xPQ0tfRU5BQkxFRCksCisJCQkgISEoZHBzMSAmIERPQ19EUFNfS0VZX09LKSk7CisJcmV0dXJuIHBvczsKK30KK0RFQlVHRlNfUk9fQVRUUihwcm90ZWN0aW9uLCBkYmdfcHJvdGVjdGlvbl9zaG93KTsKKworc3RhdGljIGludCBfX2luaXQgZG9jX2RiZ19yZWdpc3RlcihzdHJ1Y3QgZG9jZzMgKmRvY2czKQoreworCXN0cnVjdCBkZW50cnkgKnJvb3QsICplbnRyeTsKKworCXJvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRvY2czIiwgTlVMTCk7CisJaWYgKCFyb290KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZmxhc2hjb250cm9sIiwgU19JUlVTUiwgcm9vdCwgZG9jZzMsCisJCQkJICAmZmxhc2hjb250cm9sX2ZvcHMpOworCWlmIChlbnRyeSkKKwkJZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhc2ljX21vZGUiLCBTX0lSVVNSLCByb290LAorCQkJCQkgICAgZG9jZzMsICZhc2ljX21vZGVfZm9wcyk7CisJaWYgKGVudHJ5KQorCQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImRldmljZV9pZCIsIFNfSVJVU1IsIHJvb3QsCisJCQkJCSAgICBkb2NnMywgJmRldmljZV9pZF9mb3BzKTsKKwlpZiAoZW50cnkpCisJCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgicHJvdGVjdGlvbiIsIFNfSVJVU1IsIHJvb3QsCisJCQkJCSAgICBkb2NnMywgJnByb3RlY3Rpb25fZm9wcyk7CisJaWYgKGVudHJ5KSB7CisJCWRvY2czLT5kZWJ1Z2ZzX3Jvb3QgPSByb290OworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUocm9vdCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KK30KKworc3RhdGljIHZvaWQgX19leGl0IGRvY19kYmdfdW5yZWdpc3RlcihzdHJ1Y3QgZG9jZzMgKmRvY2czKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkb2NnMy0+ZGVidWdmc19yb290KTsKK30KKworLyoqCisgKiBkb2Nfc2V0X2RyaXZlcl9pbmZvIC0gRmlsbCB0aGUgbXRkX2luZm8gc3RydWN0dXJlIGFuZCBkb2NnMyBzdHJ1Y3R1cmUKKyAqIEBjaGlwX2lkOiBUaGUgY2hpcCBJRCBvZiB0aGUgc3VwcG9ydGVkIGNoaXAKKyAqIEBtdGQ6IFRoZSBzdHJ1Y3R1cmUgdG8gZmlsbAorICovCitzdGF0aWMgdm9pZCBfX2luaXQgZG9jX3NldF9kcml2ZXJfaW5mbyhpbnQgY2hpcF9pZCwgc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IGRvY2czICpkb2NnMyA9IG10ZC0+cHJpdjsKKwlpbnQgY2ZnOworCisJY2ZnID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfQ09ORklHVVJBVElPTik7CisJZG9jZzMtPmlmX2NmZyA9IChjZmcgJiBET0NfQ09ORl9JRl9DRkcgPyAxIDogMCk7CisKKwlzd2l0Y2ggKGNoaXBfaWQpIHsKKwljYXNlIERPQ19DSElQSURfRzM6CisJCW10ZC0+bmFtZSA9ICJEaXNrT25DaGlwIEczIjsKKwkJZG9jZzMtPm1heF9ibG9jayA9IDIwNDc7CisJCWJyZWFrOworCX0KKwltdGQtPnR5cGUgPSBNVERfTkFOREZMQVNIOworCS8qCisJICogT25jZSB3cml0ZSBtZXRob2RzIGFyZSBhZGRlZCwgdGhlIGNvcnJlY3QgZmxhZ3Mgd2lsbCBiZSBzZXQuCisJICogbXRkLT5mbGFncyA9IE1URF9DQVBfTkFOREZMQVNIOworCSAqLworCW10ZC0+ZmxhZ3MgPSBNVERfQ0FQX1JPTTsKKwltdGQtPnNpemUgPSAoZG9jZzMtPm1heF9ibG9jayArIDEpICogRE9DX0xBWU9VVF9CTE9DS19TSVpFOworCW10ZC0+ZXJhc2VzaXplID0gRE9DX0xBWU9VVF9CTE9DS19TSVpFICogRE9DX0xBWU9VVF9OQlBMQU5FUzsKKwltdGQtPndyaXRlc2l6ZSA9IERPQ19MQVlPVVRfUEFHRV9TSVpFOworCW10ZC0+b29ic2l6ZSA9IERPQ19MQVlPVVRfT09CX1NJWkU7CisJbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCW10ZC0+ZXJhc2UgPSBOVUxMOworCW10ZC0+cG9pbnQgPSBOVUxMOworCW10ZC0+dW5wb2ludCA9IE5VTEw7CisJbXRkLT5yZWFkID0gZG9jX3JlYWQ7CisJbXRkLT53cml0ZSA9IE5VTEw7CisJbXRkLT5yZWFkX29vYiA9IGRvY19yZWFkX29vYjsKKwltdGQtPndyaXRlX29vYiA9IE5VTEw7CisJbXRkLT5zeW5jID0gTlVMTDsKKwltdGQtPmJsb2NrX2lzYmFkID0gZG9jX2Jsb2NrX2lzYmFkOworfQorCisvKioKKyAqIGRvY19wcm9iZSAtIFByb2JlIHRoZSBJTyBzcGFjZSBmb3IgYSBEaXNrT25DaGlwIEczIGNoaXAKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UKKyAqCisgKiBQcm9iZXMgZm9yIGEgRzMgY2hpcCBhdCB0aGUgc3BlY2lmaWVkIElPIHNwYWNlIGluIHRoZSBwbGF0Zm9ybSBkYXRhCisgKiByZXNzb3VyY2VzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRU5PTUVNLCAtRU5YSU8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2luaXQgZG9jZzNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkb2NnMyAqZG9jZzM7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisJc3RydWN0IHJlc291cmNlICpyZXNzOworCWludCByZXQsIGJidF9uYnBhZ2VzOworCXUxNiBjaGlwX2lkLCBjaGlwX2lkX2ludjsKKworCXJldCA9IC1FTk9NRU07CisJZG9jZzMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG9jZzMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRvY2czKQorCQlnb3RvIG5vbWVtMTsKKwltdGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10ZCkKKwkJZ290byBub21lbTI7CisJbXRkLT5wcml2ID0gZG9jZzM7CisKKwlyZXQgPSAtRU5YSU87CisJcmVzcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXNzKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gSS9PIG1lbW9yeSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJZ290byBub3Jlc3M7CisJfQorCWRvY2czLT5iYXNlID0gaW9yZW1hcChyZXNzLT5zdGFydCwgRE9DX0lPU1BBQ0VfU0laRSk7CisKKwlkb2NnMy0+ZGV2ID0gJnBkZXYtPmRldjsKKwlkb2NnMy0+ZGV2aWNlX2lkID0gMDsKKwlkb2Nfc2V0X2RldmljZV9pZChkb2NnMywgZG9jZzMtPmRldmljZV9pZCk7CisJZG9jX3NldF9hc2ljX21vZGUoZG9jZzMsIERPQ19BU0lDTU9ERV9SRVNFVCk7CisJZG9jX3NldF9hc2ljX21vZGUoZG9jZzMsIERPQ19BU0lDTU9ERV9OT1JNQUwpOworCisJY2hpcF9pZCA9IGRvY19yZWdpc3Rlcl9yZWFkdyhkb2NnMywgRE9DX0NISVBJRCk7CisJY2hpcF9pZF9pbnYgPSBkb2NfcmVnaXN0ZXJfcmVhZHcoZG9jZzMsIERPQ19DSElQSURfSU5WKTsKKworCXJldCA9IC1FTk9ERVY7CisJaWYgKGNoaXBfaWQgIT0gKHUxNikofmNoaXBfaWRfaW52KSkgeworCQlkb2NfaW5mbygiTm8gZGV2aWNlIGZvdW5kIGF0IElPIGFkZHIgJXBcbiIsCisJCQkgKHZvaWQgKilyZXNzLT5zdGFydCk7CisJCWdvdG8gbm9jaGlwZm91bmQ7CisJfQorCisJc3dpdGNoIChjaGlwX2lkKSB7CisJY2FzZSBET0NfQ0hJUElEX0czOgorCQlkb2NfaW5mbygiRm91bmQgYSBHMyBEaXNrT25DaGlwIGF0IGFkZHIgJXBcbiIsCisJCQkgKHZvaWQgKilyZXNzLT5zdGFydCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRvY19lcnIoIkNoaXAgaWQgJTA0eCBpcyBub3QgYSBEaXNrT25DaGlwIEczIGNoaXBcbiIsIGNoaXBfaWQpOworCQlnb3RvIG5vY2hpcGZvdW5kOworCX0KKworCWRvY19zZXRfZHJpdmVyX2luZm8oY2hpcF9pZCwgbXRkKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtdGQpOworCisJcmV0ID0gLUVOT01FTTsKKwliYnRfbmJwYWdlcyA9IERJVl9ST1VORF9VUChkb2NnMy0+bWF4X2Jsb2NrICsgMSwKKwkJCQkgICA4ICogRE9DX0xBWU9VVF9QQUdFX1NJWkUpOworCWRvY2czLT5iYnQgPSBremFsbG9jKGJidF9uYnBhZ2VzICogRE9DX0xBWU9VVF9QQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZG9jZzMtPmJidCkKKwkJZ290byBub2NoaXBmb3VuZDsKKwlkb2NfcmVsb2FkX2JidChkb2NnMyk7CisKKwlyZXQgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKG10ZCwgcGFydF9wcm9iZXMsCisJCQkJCU5VTEwsIE5VTEwsIDApOworCWlmIChyZXQpCisJCWdvdG8gcmVnaXN0ZXJfZXJyb3I7CisKKwlkb2NfZGJnX3JlZ2lzdGVyKGRvY2czKTsKKwlyZXR1cm4gMDsKKworcmVnaXN0ZXJfZXJyb3I6CisJa2ZyZWUoZG9jZzMtPmJidCk7Citub2NoaXBmb3VuZDoKKwlpb3VubWFwKGRvY2czLT5iYXNlKTsKK25vcmVzczoKKwlrZnJlZShtdGQpOworbm9tZW0yOgorCWtmcmVlKGRvY2czKTsKK25vbWVtMToKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRvY2czX3JlbGVhc2UgLSBSZWxlYXNlIHRoZSBkcml2ZXIKKyAqIEBwZGV2OiB0aGUgcGxhdGZvcm0gZGV2aWNlCisgKgorICogUmV0dXJucyAwCisgKi8KK3N0YXRpYyBpbnQgX19leGl0IGRvY2czX3JlbGVhc2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkb2NnMyAqZG9jZzMgPSBtdGQtPnByaXY7CisKKwlkb2NfZGJnX3VucmVnaXN0ZXIoZG9jZzMpOworCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihtdGQpOworCWlvdW5tYXAoZG9jZzMtPmJhc2UpOworCWtmcmVlKGRvY2czLT5iYnQpOworCWtmcmVlKGRvY2czKTsKKwlrZnJlZShtdGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBnM19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImRvY2czIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGRvY2czX3JlbGVhc2UpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZG9jZzNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmczX2RyaXZlciwgZG9jZzNfcHJvYmUpOworfQorbW9kdWxlX2luaXQoZG9jZzNfaW5pdCk7CisKKworc3RhdGljIHZvaWQgX19leGl0IGRvY2czX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZzNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGRvY2czX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJSb2JlcnQgSmFyem1payA8cm9iZXJ0LmphcnptaWtAZnJlZS5mcj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVREIGRyaXZlciBmb3IgRGlza09uQ2hpcCBHMyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2NnMy5oIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2NnMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDA3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvY2czLmgKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBIYW5kbGVzIHRoZSBNLVN5c3RlbXMgRGlza09uQ2hpcCBHMyBjaGlwCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJvYmVydCBKYXJ6bWlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9NVERfRE9DRzNfSAorI2RlZmluZSBfTVREX0RPQ0czX0gKKworLyoKKyAqIEZsYXNoIG1lbW9yeSBhcmVhcyA6CisgKiAgIC0gMHgwMDAwIC4uIDB4MDdmZiA6IElQTAorICogICAtIDB4MDgwMCAuLiAweDBmZmYgOiBEYXRhIGFyZWEKKyAqICAgLSAweDEwMDAgLi4gMHgxN2ZmIDogUmVnaXN0ZXJzCisgKiAgIC0gMHgxODAwIC4uIDB4MWZmZiA6IFVua25vd24KKyAqLworI2RlZmluZSBET0NfSU9TUEFDRV9JUEwJCQkweDAwMDAKKyNkZWZpbmUgRE9DX0lPU1BBQ0VfREFUQQkJMHgwODAwCisjZGVmaW5lIERPQ19JT1NQQUNFX1NJWkUJCTB4MjAwMAorCisvKgorICogRE9DIEczIGxheW91dCBhbmQgYWRyZXNzaW5nIHNjaGVtZQorICogICBBIHBhZ2UgYWRkcmVzcyBmb3IgdGhlIGJsb2NrICJiIiwgcGxhbmUgIlAiIGFuZCBwYWdlICJwIjoKKyAqICAgYWRkcmVzcyA9IFtiYmJiIGJQcHAgcHBwcF0KKyAqLworCisjZGVmaW5lIERPQ19BRERSX1BBR0VfTUFTSwkJMHgzZgorI2RlZmluZSBET0NfQUREUl9CTE9DS19TSElGVAkJNgorI2RlZmluZSBET0NfTEFZT1VUX05CUExBTkVTCQkyCisjZGVmaW5lIERPQ19MQVlPVVRfUEFHRVNfUEVSX0JMT0NLCTY0CisjZGVmaW5lIERPQ19MQVlPVVRfUEFHRV9TSVpFCQk1MTIKKyNkZWZpbmUgRE9DX0xBWU9VVF9PT0JfU0laRQkJMTYKKyNkZWZpbmUgRE9DX0xBWU9VVF9XRUFSX1NJWkUJCTgKKyNkZWZpbmUgRE9DX0xBWU9VVF9QQUdFX09PQl9TSVpFCQkJCVwKKwkoRE9DX0xBWU9VVF9QQUdFX1NJWkUgKyBET0NfTEFZT1VUX09PQl9TSVpFKQorI2RlZmluZSBET0NfTEFZT1VUX1dFQVJfT0ZGU0VUCQkoRE9DX0xBWU9VVF9QQUdFX09PQl9TSVpFICogMikKKyNkZWZpbmUgRE9DX0xBWU9VVF9CTE9DS19TSVpFCQkJCQlcCisJKERPQ19MQVlPVVRfUEFHRVNfUEVSX0JMT0NLICogRE9DX0xBWU9VVF9QQUdFX1NJWkUpCisjZGVmaW5lIERPQ19FQ0NfQkNIX1NJWkUJCTcKKyNkZWZpbmUgRE9DX0VDQ19CQ0hfQ09WRVJFRF9CWVRFUwkJCQlcCisJKERPQ19MQVlPVVRfUEFHRV9TSVpFICsgRE9DX0xBWU9VVF9PT0JfUEFHRUlORk9fU1ogKwlcCisJIERPQ19MQVlPVVRfT09CX0hBTU1JTkdfU1ogKyBET0NfTEFZT1VUX09PQl9CQ0hfU1opCisKKy8qCisgKiBCbG9ja3MgZGlzdHJpYnV0aW9uCisgKi8KKyNkZWZpbmUgRE9DX0xBWU9VVF9CTE9DS19CQlQJCTAKKyNkZWZpbmUgRE9DX0xBWU9VVF9CTE9DS19PVFAJCTAKKyNkZWZpbmUgRE9DX0xBWU9VVF9CTE9DS19GSVJTVF9EQVRBCTYKKworI2RlZmluZSBET0NfTEFZT1VUX1BBR0VfQkJUCQk0CisKKy8qCisgKiBFeHRyYSBwYWdlIE9PQiAoMTYgYnl0ZXMgd2lkZSkgbGF5b3V0CisgKi8KKyNkZWZpbmUgRE9DX0xBWU9VVF9PT0JfUEFHRUlORk9fT0ZTCTAKKyNkZWZpbmUgRE9DX0xBWU9VVF9PT0JfSEFNTUlOR19PRlMJNworI2RlZmluZSBET0NfTEFZT1VUX09PQl9CQ0hfT0ZTCQk4CisjZGVmaW5lIERPQ19MQVlPVVRfT09CX1VOVVNFRF9PRlMJMTUKKyNkZWZpbmUgRE9DX0xBWU9VVF9PT0JfUEFHRUlORk9fU1oJNworI2RlZmluZSBET0NfTEFZT1VUX09PQl9IQU1NSU5HX1NaCTEKKyNkZWZpbmUgRE9DX0xBWU9VVF9PT0JfQkNIX1NaCQk3CisjZGVmaW5lIERPQ19MQVlPVVRfT09CX1VOVVNFRF9TWgkxCisKKworI2RlZmluZSBET0NfQ0hJUElEX0czCQkJMHgyMDAKKyNkZWZpbmUgRE9DX0VSQVNFX01BUksJCQkweGFhCisvKgorICogRmxhc2ggcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgRE9DX0NISVBJRAkJCTB4MTAwMAorI2RlZmluZSBET0NfVEVTVAkJCTB4MTAwNAorI2RlZmluZSBET0NfQlVTTE9DSwkJCTB4MTAwNgorI2RlZmluZSBET0NfRU5ESUFOQ09OVFJPTAkJMHgxMDA4CisjZGVmaW5lIERPQ19ERVZJQ0VTRUxFQ1QJCTB4MTAwYQorI2RlZmluZSBET0NfQVNJQ01PREUJCQkweDEwMGMKKyNkZWZpbmUgRE9DX0NPTkZJR1VSQVRJT04JCTB4MTAwZQorI2RlZmluZSBET0NfSU5URVJSVVBUQ09OVFJPTAkJMHgxMDEwCisjZGVmaW5lIERPQ19SRUFEQUREUkVTUwkJCTB4MTAxYQorI2RlZmluZSBET0NfREFUQUVORAkJCTB4MTAxZQorI2RlZmluZSBET0NfSU5URVJSVVBUU1RBVFVTCQkweDEwMjAKKworI2RlZmluZSBET0NfRkxBU0hTRVFVRU5DRQkJMHgxMDMyCisjZGVmaW5lIERPQ19GTEFTSENPTU1BTkQJCTB4MTAzNAorI2RlZmluZSBET0NfRkxBU0hBRERSRVNTCQkweDEwMzYKKyNkZWZpbmUgRE9DX0ZMQVNIQ09OVFJPTAkJMHgxMDM4CisjZGVmaW5lIERPQ19OT1AJCQkJMHgxMDNlCisKKyNkZWZpbmUgRE9DX0VDQ0NPTkYwCQkJMHgxMDQwCisjZGVmaW5lIERPQ19FQ0NDT05GMQkJCTB4MTA0MgorI2RlZmluZSBET0NfRUNDUFJFU0VUCQkJMHgxMDQ0CisjZGVmaW5lIERPQ19IQU1NSU5HUEFSSVRZCQkweDEwNDYKKyNkZWZpbmUgRE9DX0JDSF9TWU5EUk9NKGlkeCkJCSgweDEwNDggKyAoaWR4IDw8IDEpKQorCisjZGVmaW5lIERPQ19QUk9URUNUSU9OCQkJMHgxMDU2CisjZGVmaW5lIERPQ19EUFMwX0FERFJMT1cJCTB4MTA2MAorI2RlZmluZSBET0NfRFBTMF9BRERSSElHSAkJMHgxMDYyCisjZGVmaW5lIERPQ19EUFMxX0FERFJMT1cJCTB4MTA2NAorI2RlZmluZSBET0NfRFBTMV9BRERSSElHSAkJMHgxMDY2CisjZGVmaW5lIERPQ19EUFMwX1NUQVRVUwkJCTB4MTA2YworI2RlZmluZSBET0NfRFBTMV9TVEFUVVMJCQkweDEwNmUKKworI2RlZmluZSBET0NfQVNJQ01PREVDT05GSVJNCQkweDEwNzIKKyNkZWZpbmUgRE9DX0NISVBJRF9JTlYJCQkweDEwNzQKKworLyoKKyAqIEZsYXNoIHNlcXVlbmNlcworICogQSBzZXF1ZW5jZSBpcyBwcmVzZXQgYmVmb3JlIG9uZSBvciBtb3JlIGNvbW1hbmRzIGFyZSBpbnB1dCB0byB0aGUgY2hpcC4KKyAqLworI2RlZmluZSBET0NfU0VRX1JFU0VUCQkJMHgwMAorI2RlZmluZSBET0NfU0VRX1BBR0VfU0laRV81MzIJCTB4MDMKKyNkZWZpbmUgRE9DX1NFUV9TRVRfTU9ERQkJMHgwOQorI2RlZmluZSBET0NfU0VRX1JFQUQJCQkweDEyCisjZGVmaW5lIERPQ19TRVFfU0VUX1BMQU5FMQkJMHgwZQorI2RlZmluZSBET0NfU0VRX1NFVF9QTEFORTIJCTB4MTAKKyNkZWZpbmUgRE9DX1NFUV9QQUdFX1NFVFVQCQkweDFkCisKKy8qCisgKiBGbGFzaCBjb21tYW5kcworICovCisjZGVmaW5lIERPQ19DTURfUkVBRF9QTEFORTEJCTB4MDAKKyNkZWZpbmUgRE9DX0NNRF9TRVRfQUREUl9SRUFECQkweDA1CisjZGVmaW5lIERPQ19DTURfUkVBRF9BTExfUExBTkVTCQkweDMwCisjZGVmaW5lIERPQ19DTURfUkVBRF9QTEFORTIJCTB4NTAKKyNkZWZpbmUgRE9DX0NNRF9SRUFEX0ZMQVNICQkweGUwCisjZGVmaW5lIERPQ19DTURfUEFHRV9TSVpFXzUzMgkJMHgzYworCisjZGVmaW5lIERPQ19DTURfUFJPR19CTE9DS19BRERSCQkweDYwCisjZGVmaW5lIERPQ19DTURfUFJPR19DWUNMRTEJCTB4ODAKKyNkZWZpbmUgRE9DX0NNRF9QUk9HX0NZQ0xFMgkJMHgxMAorI2RlZmluZSBET0NfQ01EX0VSQVNFQ1lDTEUyCQkweGQwCisKKyNkZWZpbmUgRE9DX0NNRF9SRUxJQUJMRV9NT0RFCQkweDIyCisjZGVmaW5lIERPQ19DTURfRkFTVF9NT0RFCQkweGEyCisKKyNkZWZpbmUgRE9DX0NNRF9SRVNFVAkJCTB4ZmYKKworLyoKKyAqIEZsYXNoIHJlZ2lzdGVyIDogRE9DX0ZMQVNIQ09OVFJPTAorICovCisjZGVmaW5lIERPQ19DVFJMX1ZJT0xBVElPTgkJMHgyMAorI2RlZmluZSBET0NfQ1RSTF9DRQkJCTB4MTAKKyNkZWZpbmUgRE9DX0NUUkxfVU5LTk9XTl9CSVRTCQkweDA4CisjZGVmaW5lIERPQ19DVFJMX1BST1RFQ1RJT05fRVJST1IJMHgwNAorI2RlZmluZSBET0NfQ1RSTF9TRVFVRU5DRV9FUlJPUgkJMHgwMgorI2RlZmluZSBET0NfQ1RSTF9GTEFTSFJFQURZCQkweDAxCisKKy8qCisgKiBGbGFzaCByZWdpc3RlciA6IERPQ19BU0lDTU9ERQorICovCisjZGVmaW5lIERPQ19BU0lDTU9ERV9SRVNFVAkJMHgwMAorI2RlZmluZSBET0NfQVNJQ01PREVfTk9STUFMCQkweDAxCisjZGVmaW5lIERPQ19BU0lDTU9ERV9QT1dFUkRPV04JCTB4MDIKKyNkZWZpbmUgRE9DX0FTSUNNT0RFX01EV1JFTgkJMHgwNAorI2RlZmluZSBET0NfQVNJQ01PREVfQkRFVENUX1JFU0VUCTB4MDgKKyNkZWZpbmUgRE9DX0FTSUNNT0RFX1JTVElOX1JFU0VUCTB4MTAKKyNkZWZpbmUgRE9DX0FTSUNNT0RFX1JBTV9XRQkJMHgyMAorCisvKgorICogRmxhc2ggcmVnaXN0ZXIgOiBET0NfRUNDQ09ORjAKKyAqLworI2RlZmluZSBET0NfRUNDQ09ORjBfUkVBRF9NT0RFCQkweDgwMDAKKyNkZWZpbmUgRE9DX0VDQ0NPTkYwX0FVVE9fRUNDX0VOQUJMRQkweDQwMDAKKyNkZWZpbmUgRE9DX0VDQ0NPTkYwX0hBTU1JTkdfRU5BQkxFCTB4MTAwMAorI2RlZmluZSBET0NfRUNDQ09ORjBfQkNIX0VOQUJMRQkJMHgwODAwCisjZGVmaW5lIERPQ19FQ0NDT05GMF9EQVRBX0JZVEVTX01BU0sJMHgwN2ZmCisKKy8qCisgKiBGbGFzaCByZWdpc3RlciA6IERPQ19FQ0NDT05GMQorICovCisjZGVmaW5lIERPQ19FQ0NDT05GMV9CQ0hfU1lORFJPTV9FUlIJMHg4MAorI2RlZmluZSBET0NfRUNDQ09ORjFfVU5LT1dOMQkJMHg0MAorI2RlZmluZSBET0NfRUNDQ09ORjFfVU5LT1dOMgkJMHgyMAorI2RlZmluZSBET0NfRUNDQ09ORjFfVU5LT1dOMwkJMHgxMAorI2RlZmluZSBET0NfRUNDQ09ORjFfSEFNTUlOR19CSVRTX01BU0sJMHgwZgorCisvKgorICogRmxhc2ggcmVnaXN0ZXIgOiBET0NfUFJPVEVDVElPTgorICovCisjZGVmaW5lIERPQ19QUk9URUNUX0ZPVU5EUllfT1RQX0xPQ0sJMHgwMQorI2RlZmluZSBET0NfUFJPVEVDVF9DVVNUT01FUl9PVFBfTE9DSwkweDAyCisjZGVmaW5lIERPQ19QUk9URUNUX0xPQ0tfSU5QVVQJCTB4MDQKKyNkZWZpbmUgRE9DX1BST1RFQ1RfU1RJQ0tZX0xPQ0sJCTB4MDgKKyNkZWZpbmUgRE9DX1BST1RFQ1RfUFJPVEVDVElPTl9FTkFCTEVECTB4MTAKKyNkZWZpbmUgRE9DX1BST1RFQ1RfSVBMX0RPV05MT0FEX0xPQ0sJMHgyMAorI2RlZmluZSBET0NfUFJPVEVDVF9QUk9URUNUSU9OX0VSUk9SCTB4ODAKKworLyoKKyAqIEZsYXNoIHJlZ2lzdGVyIDogRE9DX0RQUzBfU1RBVFVTIGFuZCBET0NfRFBTMV9TVEFUVVMKKyAqLworI2RlZmluZSBET0NfRFBTX09UUF9QUk9URUNURUQJCTB4MDEKKyNkZWZpbmUgRE9DX0RQU19SRUFEX1BST1RFQ1RFRAkJMHgwMgorI2RlZmluZSBET0NfRFBTX1dSSVRFX1BST1RFQ1RFRAkJMHgwNAorI2RlZmluZSBET0NfRFBTX0hXX0xPQ0tfRU5BQkxFRAkJMHgwOAorI2RlZmluZSBET0NfRFBTX0tFWV9PSwkJCTB4ODAKKworLyoKKyAqIEZsYXNoIHJlZ2lzdGVyIDogRE9DX0NPTkZJR1VSQVRJT04KKyAqLworI2RlZmluZSBET0NfQ09ORl9JRl9DRkcJCQkweDgwCisjZGVmaW5lIERPQ19DT05GX01BWF9JRF9NQVNLCQkweDMwCisjZGVmaW5lIERPQ19DT05GX1ZDQ1FfM1YJCTB4MDEKKworLyoKKyAqIEZsYXNoIHJlZ2lzdGVyIDogRE9DX1JFQURBRERSRVNTCisgKi8KKyNkZWZpbmUgRE9DX1JFQURBRERSX0lOQwkJMHg4MDAwCisjZGVmaW5lIERPQ19SRUFEQUREUl9PTkVfQllURQkJMHg0MDAwCisjZGVmaW5lIERPQ19SRUFEQUREUl9BRERSX01BU0sJCTB4MWZmZgorCisvKioKKyAqIHN0cnVjdCBkb2NnMyAtIERpc2tPbkNoaXAgZHJpdmVyIHByaXZhdGUgZGF0YQorICogQGRldjogdGhlIGRldmljZSBjdXJyZW50bHkgdW5kZXIgY29udHJvbAorICogQGJhc2U6IG1hcHBlZCBJTyBzcGFjZQorICogQGRldmljZV9pZDogbnVtYmVyIG9mIHRoZSBjYXNjYWRlZCBEb0NHMyBkZXZpY2UgKDAsIDEsIDIgb3IgMykKKyAqIEBpZl9jZmc6IGlmIHRydWUsIHJlYWRzIGFyZSBvbiAxNmJpdHMsIGVsc2UgcmVhZHMgYXJlIG9uIDhiaXRzCisgKiBAYmJ0OiBiYWQgYmxvY2sgdGFibGUgY2FjaGUKKyAqIEBkZWJ1Z2ZzX3Jvb3Q6IGRlYnVnZnMgcm9vdCBub2RlCisgKi8KK3N0cnVjdCBkb2NnMyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2lkOjQ7CisJdW5zaWduZWQgaW50IGlmX2NmZzoxOworCWludCBtYXhfYmxvY2s7CisJdTggKmJidDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3Jvb3Q7Cit9OworCisjZGVmaW5lIGRvY19lcnIoZm10LCBhcmcuLi4pIGRldl9lcnIoZG9jZzMtPmRldiwgKGZtdCksICMjIGFyZykKKyNkZWZpbmUgZG9jX2luZm8oZm10LCBhcmcuLi4pIGRldl9pbmZvKGRvY2czLT5kZXYsIChmbXQpLCAjIyBhcmcpCisjZGVmaW5lIGRvY19kYmcoZm10LCBhcmcuLi4pIGRldl9kYmcoZG9jZzMtPmRldiwgKGZtdCksICMjIGFyZykKKyNkZWZpbmUgZG9jX3ZkYmcoZm10LCBhcmcuLi4pIGRldl92ZGJnKGRvY2czLT5kZXYsIChmbXQpLCAjIyBhcmcpCisKKyNkZWZpbmUgREVCVUdGU19ST19BVFRSKG5hbWUsIHNob3dfZmN0KSBcCisJc3RhdGljIGludCBuYW1lIyNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkgXAorCXsgcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfZmN0LCBpbm9kZS0+aV9wcml2YXRlKTsgfSAgICAgIFwKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuYW1lIyNfZm9wcyA9IHsgXAorCQkub3duZXIgPSBUSElTX01PRFVMRSwgXAorCQkub3BlbiA9IG5hbWUjI19vcGVuLCBcCisJCS5sbHNlZWsgPSBzZXFfbHNlZWssIFwKKwkJLnJlYWQgPSBzZXFfcmVhZCwgXAorCQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlIFwKKwl9OworI2VuZGlmCisKKy8qCisgKiBUcmFjZSBldmVudHMgcGFydAorICovCisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBkb2NnMworCisjaWYgIWRlZmluZWQoX01URF9ET0NHM19UUkFDRSkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX01URF9ET0NHM19UUkFDRQorCisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCitUUkFDRV9FVkVOVChkb2NnM19pbywKKwkgICAgVFBfUFJPVE8oaW50IG9wLCBpbnQgd2lkdGgsIHUxNiByZWcsIGludCB2YWwpLAorCSAgICBUUF9BUkdTKG9wLCB3aWR0aCwgcmVnLCB2YWwpLAorCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChpbnQsIG9wKQorCQkgICAgX19maWVsZCh1bnNpZ25lZCBjaGFyLCB3aWR0aCkKKwkJICAgIF9fZmllbGQodTE2LCByZWcpCisJCSAgICBfX2ZpZWxkKGludCwgdmFsKSksCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+b3AgPSBvcDsKKwkJICAgIF9fZW50cnktPndpZHRoID0gd2lkdGg7CisJCSAgICBfX2VudHJ5LT5yZWcgPSByZWc7CisJCSAgICBfX2VudHJ5LT52YWwgPSB2YWw7KSwKKwkgICAgVFBfcHJpbnRrKCJkb2NnMzogJXMlMDJkIHJlZz0lMDR4LCB2YWw9JTA0eCIsCisJCSAgICAgIF9fZW50cnktPm9wID8gIndyaXRlIiA6ICJyZWFkIiwgX19lbnRyeS0+d2lkdGgsCisJCSAgICAgIF9fZW50cnktPnJlZywgX19lbnRyeS0+dmFsKQorCSk7CisjZW5kaWYKKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjdW5kZWYgVFJBQ0VfSU5DTFVERV9GSUxFCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBkb2NnMworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2Nwcm9iZS5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2Nwcm9iZS5jCmluZGV4IGQzNzQ2MDMuLjQ1MTE2YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jcHJvYmUuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvY3Byb2JlLmMKQEAgLTUwLDExICs1MCw2IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvZG9jMjAwMC5oPgogCi0vKiBXaGVyZSB0byBsb29rIGZvciB0aGUgZGV2aWNlcz8gKi8KLSNpZm5kZWYgQ09ORklHX01URF9ET0NQUk9CRV9BRERSRVNTCi0jZGVmaW5lIENPTkZJR19NVERfRE9DUFJPQkVfQUREUkVTUyAwCi0jZW5kaWYKLQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkb2NfY29uZmlnX2xvY2F0aW9uID0gQ09ORklHX01URF9ET0NQUk9CRV9BRERSRVNTOwogbW9kdWxlX3BhcmFtKGRvY19jb25maWdfbG9jYXRpb24sIHVsb25nLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbGFydC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9sYXJ0LmMKaW5kZXggNzcyYTBmZi4uM2ExMWVhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9sYXJ0LmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9sYXJ0LmMKQEAgLTM0LDkgKzM0LDYgQEAKIC8qIGRlYnVnZ2luZyAqLwogLy8jZGVmaW5lIExBUlRfREVCVUcKIAotLyogcGFydGl0aW9uIHN1cHBvcnQgKi8KLSNkZWZpbmUgSEFWRV9QQVJUSVRJT05TCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNDQsOSArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2lmZGVmIEhBVkVfUEFSVElUSU9OUwogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0jZW5kaWYKIAogI2lmbmRlZiBDT05GSUdfU0ExMTAwX0xBUlQKICNlcnJvciBUaGlzIGlzIGZvciBMQVJUIGFyY2hpdGVjdHVyZSBvbmx5CkBAIC01OTgsNyArNTkzLDYgQEAKIAl9CiB9OwogCi0jaWZkZWYgSEFWRV9QQVJUSVRJT05TCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gbGFydF9wYXJ0aXRpb25zW10gPSB7CiAJLyogYmxvYiAqLwogCXsKQEAgLTYxOSw3ICs2MTMsNyBAQAogCQkuc2l6ZQk9IElOSVRSRF9MRU4sCQkvKiBNVERQQVJUX1NJWl9GVUxMICovCiAJfQogfTsKLSNlbmRpZgorI2RlZmluZSBOVU1fUEFSVElUSU9OUyBBUlJBWV9TSVpFKGxhcnRfcGFydGl0aW9ucykKIAogc3RhdGljIGludCBfX2luaXQgbGFydF9mbGFzaF9pbml0ICh2b2lkKQogewpAQCAtNjY4LDcgKzY2Miw2IEBACiAJCQkgICByZXN1bHQsbXRkLmVyYXNlcmVnaW9uc1tyZXN1bHRdLmVyYXNlc2l6ZSxtdGQuZXJhc2VyZWdpb25zW3Jlc3VsdF0uZXJhc2VzaXplIC8gMTAyNCwKIAkJCSAgIHJlc3VsdCxtdGQuZXJhc2VyZWdpb25zW3Jlc3VsdF0ubnVtYmxvY2tzKTsKIAotI2lmZGVmIEhBVkVfUEFSVElUSU9OUwogICAgcHJpbnRrICgiXG5wYXJ0aXRpb25zID0gJWRcbiIsIEFSUkFZX1NJWkUobGFydF9wYXJ0aXRpb25zKSk7CiAKICAgIGZvciAocmVzdWx0ID0gMDsgcmVzdWx0IDwgQVJSQVlfU0laRShsYXJ0X3BhcnRpdGlvbnMpOyByZXN1bHQrKykKQEAgLTY4MSwyNSArNjc0LDE2IEBACiAJCQkgcmVzdWx0LGxhcnRfcGFydGl0aW9uc1tyZXN1bHRdLm9mZnNldCwKIAkJCSByZXN1bHQsbGFydF9wYXJ0aXRpb25zW3Jlc3VsdF0uc2l6ZSxsYXJ0X3BhcnRpdGlvbnNbcmVzdWx0XS5zaXplIC8gMTAyNCk7CiAjZW5kaWYKLSNlbmRpZgogCi0jaWZuZGVmIEhBVkVfUEFSVElUSU9OUwotICAgcmVzdWx0ID0gbXRkX2RldmljZV9yZWdpc3RlcigmbXRkLCBOVUxMLCAwKTsKLSNlbHNlCiAgICByZXN1bHQgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZtdGQsIGxhcnRfcGFydGl0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShsYXJ0X3BhcnRpdGlvbnMpKTsKLSNlbmRpZgogCiAgICByZXR1cm4gKHJlc3VsdCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBsYXJ0X2ZsYXNoX2V4aXQgKHZvaWQpCiB7Ci0jaWZuZGVmIEhBVkVfUEFSVElUSU9OUwogICAgbXRkX2RldmljZV91bnJlZ2lzdGVyKCZtdGQpOwotI2Vsc2UKLSAgIG10ZF9kZXZpY2VfdW5yZWdpc3RlcigmbXRkKTsKLSNlbmRpZgogfQogCiBtb2R1bGVfaW5pdCAobGFydF9mbGFzaF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCmluZGV4IDM1MTgwZTQuLjg4NDkwNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9jZmkuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgpAQCAtODgsNyArODksNiBAQAogCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CiAJc3RydWN0IG11dGV4CQlsb2NrOwogCXN0cnVjdCBtdGRfaW5mbwkJbXRkOwotCXVuc2lnbmVkCQlwYXJ0aXRpb25lZDoxOwogCXUxNgkJCXBhZ2Vfc2l6ZTsKIAl1MTYJCQlhZGRyX3dpZHRoOwogCXU4CQkJZXJhc2Vfb3Bjb2RlOwpAQCAtMjA5LDkgKzIwOSw4IEBACiAgKi8KIHN0YXRpYyBpbnQgZXJhc2VfY2hpcChzdHJ1Y3QgbTI1cCAqZmxhc2gpCiB7Ci0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiAlcyAlbGxkS2lCXG4iLAotCSAgICAgIGRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLCBfX2Z1bmNfXywKLQkgICAgICAobG9uZyBsb25nKShmbGFzaC0+bXRkLnNpemUgPj4gMTApKTsKKwlwcl9kZWJ1ZygiJXM6ICVzICVsbGRLaUJcbiIsIGRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLCBfX2Z1bmNfXywKKwkJCShsb25nIGxvbmcpKGZsYXNoLT5tdGQuc2l6ZSA+PiAxMCkpOwogCiAJLyogV2FpdCB1bnRpbCBmaW5pc2hlZCBwcmV2aW91cyB3cml0ZSBjb21tYW5kLiAqLwogCWlmICh3YWl0X3RpbGxfcmVhZHkoZmxhc2gpKQpAQCAtMjUwLDkgKzI0OSw4IEBACiAgKi8KIHN0YXRpYyBpbnQgZXJhc2Vfc2VjdG9yKHN0cnVjdCBtMjVwICpmbGFzaCwgdTMyIG9mZnNldCkKIHsKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6ICVzICVkS2lCIGF0IDB4JTA4eFxuIiwKLQkJCWRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLCBfX2Z1bmNfXywKLQkJCWZsYXNoLT5tdGQuZXJhc2VzaXplIC8gMTAyNCwgb2Zmc2V0KTsKKwlwcl9kZWJ1ZygiJXM6ICVzICVkS2lCIGF0IDB4JTA4eFxuIiwgZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksCisJCQlfX2Z1bmNfXywgZmxhc2gtPm10ZC5lcmFzZXNpemUgLyAxMDI0LCBvZmZzZXQpOwogCiAJLyogV2FpdCB1bnRpbCBmaW5pc2hlZCBwcmV2aW91cyB3cml0ZSBjb21tYW5kLiAqLwogCWlmICh3YWl0X3RpbGxfcmVhZHkoZmxhc2gpKQpAQCAtMjg2LDkgKzI4NCw5IEBACiAJdTMyIGFkZHIsbGVuOwogCXVpbnQzMl90IHJlbTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglbGx4LCBsZW4gJWxsZFxuIiwKLQkgICAgICBkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sICJhdCIsCi0JICAgICAgKGxvbmcgbG9uZylpbnN0ci0+YWRkciwgKGxvbmcgbG9uZylpbnN0ci0+bGVuKTsKKwlwcl9kZWJ1ZygiJXM6ICVzIGF0IDB4JWxseCwgbGVuICVsbGRcbiIsIGRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLAorCQkJX19mdW5jX18sIChsb25nIGxvbmcpaW5zdHItPmFkZHIsCisJCQkobG9uZyBsb25nKWluc3RyLT5sZW4pOwogCiAJLyogc2FuaXR5IGNoZWNrcyAqLwogCWlmIChpbnN0ci0+YWRkciArIGluc3RyLT5sZW4gPiBmbGFzaC0+bXRkLnNpemUpCkBAIC0zNDgsOSArMzQ2LDggQEAKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRbMl07CiAJc3RydWN0IHNwaV9tZXNzYWdlIG07CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JTA4eCwgbGVuICV6ZFxuIiwKLQkJCWRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLCBfX2Z1bmNfXywgImZyb20iLAotCQkJKHUzMilmcm9tLCBsZW4pOworCXByX2RlYnVnKCIlczogJXMgZnJvbSAweCUwOHgsIGxlbiAlemRcbiIsIGRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLAorCQkJX19mdW5jX18sICh1MzIpZnJvbSwgbGVuKTsKIAogCS8qIHNhbml0eSBjaGVja3MgKi8KIAlpZiAoIWxlbikKQEAgLTQxNyw5ICs0MTQsOCBAQAogCXN0cnVjdCBzcGlfdHJhbnNmZXIgdFsyXTsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAotCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLCAidG8iLAotCQkJKHUzMil0bywgbGVuKTsKKwlwcl9kZWJ1ZygiJXM6ICVzIHRvIDB4JTA4eCwgbGVuICV6ZFxuIiwgZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksCisJCQlfX2Z1bmNfXywgKHUzMil0bywgbGVuKTsKIAogCSpyZXRsZW4gPSAwOwogCkBAIC01MTAsOSArNTA2LDggQEAKIAlzaXplX3QgYWN0dWFsOwogCWludCBjbWRfc3osIHJldDsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAotCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLCAidG8iLAotCQkJKHUzMil0bywgbGVuKTsKKwlwcl9kZWJ1ZygiJXM6ICVzIHRvIDB4JTA4eCwgbGVuICV6ZFxuIiwgZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksCisJCQlfX2Z1bmNfXywgKHUzMil0bywgbGVuKTsKIAogCSpyZXRsZW4gPSAwOwogCkBAIC02NjEsNiArNjU2LDcgQEAKIAl7ICJhdDI1ZnMwNDAiLCAgSU5GTygweDFmNjYwNCwgMCwgNjQgKiAxMDI0LCAgIDgsIFNFQ1RfNEspIH0sCiAKIAl7ICJhdDI1ZGYwNDFhIiwgSU5GTygweDFmNDQwMSwgMCwgNjQgKiAxMDI0LCAgIDgsIFNFQ1RfNEspIH0sCisJeyAiYXQyNWRmMzIxYSIsIElORk8oMHgxZjQ3MDEsIDAsIDY0ICogMTAyNCwgIDY0LCBTRUNUXzRLKSB9LAogCXsgImF0MjVkZjY0MSIsICBJTkZPKDB4MWY0ODAwLCAwLCA2NCAqIDEwMjQsIDEyOCwgU0VDVF80SykgfSwKIAogCXsgImF0MjZmMDA0IiwgICBJTkZPKDB4MWYwNDAwLCAwLCA2NCAqIDEwMjQsICA4LCBTRUNUXzRLKSB9LApAQCAtNjcxLDYgKzY2Nyw3IEBACiAJLyogRU9OIC0tIGVuMjV4eHggKi8KIAl7ICJlbjI1ZjMyIiwgSU5GTygweDFjMzExNiwgMCwgNjQgKiAxMDI0LCAgNjQsIFNFQ1RfNEspIH0sCiAJeyAiZW4yNXAzMiIsIElORk8oMHgxYzIwMTYsIDAsIDY0ICogMTAyNCwgIDY0LCAwKSB9LAorCXsgImVuMjVxMzJiIiwgSU5GTygweDFjMzAxNiwgMCwgNjQgKiAxMDI0LCAgNjQsIDApIH0sCiAJeyAiZW4yNXA2NCIsIElORk8oMHgxYzIwMTcsIDAsIDY0ICogMTAyNCwgMTI4LCAwKSB9LAogCiAJLyogSW50ZWwvTnVtb255eCAtLSB4eHhzMzNiICovCkBAIC03ODgsOCArNzg1LDggQEAKIAkgKi8KIAl0bXAgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgJmNvZGUsIDEsIGlkLCA1KTsKIAlpZiAodG1wIDwgMCkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IGVycm9yICVkIHJlYWRpbmcgSkVERUMgSURcbiIsCi0JCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCB0bXApOworCQlwcl9kZWJ1ZygiJXM6IGVycm9yICVkIHJlYWRpbmcgSkVERUMgSURcbiIsCisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgdG1wKTsKIAkJcmV0dXJuIEVSUl9QVFIodG1wKTsKIAl9CiAJamVkZWMgPSBpZFswXTsKQEAgLTgyNSw4ICs4MjIsMTIgQEAKIAlzdHJ1Y3QgbTI1cAkJCSpmbGFzaDsKIAlzdHJ1Y3QgZmxhc2hfaW5mbwkJKmluZm87CiAJdW5zaWduZWQJCQlpOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCQkqcGFydHMgPSBOVUxMOwotCWludAkJCQlucl9wYXJ0cyA9IDA7CisJc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhCXBwZGF0YTsKKworI2lmZGVmIENPTkZJR19NVERfT0ZfUEFSVFMKKwlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUoc3BpLT5kZXYub2Zfbm9kZSkpCisJCXJldHVybiAtRU5PREVWOworI2VuZGlmCiAKIAkvKiBQbGF0Zm9ybSBkYXRhIGhlbHBzIHNvcnQgb3V0IHdoaWNoIGNoaXAgdHlwZSB3ZSBoYXZlLCBhcwogCSAqIHdlbGwgYXMgaG93IHRoaXMgYm9hcmQgcGFydGl0aW9ucyBpdC4gIElmIHdlIGRvbid0IGhhdmUKQEAgLTkyOCw2ICs5MjksNyBAQAogCWlmIChpbmZvLT5mbGFncyAmIE0yNVBfTk9fRVJBU0UpCiAJCWZsYXNoLT5tdGQuZmxhZ3MgfD0gTVREX05PX0VSQVNFOwogCisJcHBkYXRhLm9mX25vZGUgPSBzcGktPmRldi5vZl9ub2RlOwogCWZsYXNoLT5tdGQuZGV2LnBhcmVudCA9ICZzcGktPmRldjsKIAlmbGFzaC0+cGFnZV9zaXplID0gaW5mby0+cGFnZV9zaXplOwogCkBAIC05NDUsOCArOTQ3LDcgQEAKIAlkZXZfaW5mbygmc3BpLT5kZXYsICIlcyAoJWxsZCBLYnl0ZXMpXG4iLCBpZC0+bmFtZSwKIAkJCShsb25nIGxvbmcpZmxhc2gtPm10ZC5zaXplID4+IDEwKTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDIsCi0JCSJtdGQgLm5hbWUgPSAlcywgLnNpemUgPSAweCVsbHggKCVsbGRNaUIpICIKKwlwcl9kZWJ1ZygibXRkIC5uYW1lID0gJXMsIC5zaXplID0gMHglbGx4ICglbGxkTWlCKSAiCiAJCQkiLmVyYXNlc2l6ZSA9IDB4JS44eCAoJXVLaUIpIC5udW1lcmFzZXJlZ2lvbnMgPSAlZFxuIiwKIAkJZmxhc2gtPm10ZC5uYW1lLAogCQkobG9uZyBsb25nKWZsYXNoLT5tdGQuc2l6ZSwgKGxvbmcgbG9uZykoZmxhc2gtPm10ZC5zaXplID4+IDIwKSwKQEAgLTk1NSw4ICs5NTYsNyBAQAogCiAJaWYgKGZsYXNoLT5tdGQubnVtZXJhc2VyZWdpb25zKQogCQlmb3IgKGkgPSAwOyBpIDwgZmxhc2gtPm10ZC5udW1lcmFzZXJlZ2lvbnM7IGkrKykKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDIsCi0JCQkJIm10ZC5lcmFzZXJlZ2lvbnNbJWRdID0geyAub2Zmc2V0ID0gMHglbGx4LCAiCisJCQlwcl9kZWJ1ZygibXRkLmVyYXNlcmVnaW9uc1slZF0gPSB7IC5vZmZzZXQgPSAweCVsbHgsICIKIAkJCQkiLmVyYXNlc2l6ZSA9IDB4JS44eCAoJXVLaUIpLCAiCiAJCQkJIi5udW1ibG9ja3MgPSAlZCB9XG4iLAogCQkJCWksIChsb25nIGxvbmcpZmxhc2gtPm10ZC5lcmFzZXJlZ2lvbnNbaV0ub2Zmc2V0LApAQCAtOTY4LDQxICs5NjgsOSBAQAogCS8qIHBhcnRpdGlvbnMgc2hvdWxkIG1hdGNoIHNlY3RvciBib3VuZGFyaWVzOyBhbmQgaXQgbWF5IGJlIGdvb2QgdG8KIAkgKiB1c2UgcmVhZG9ubHkgcGFydGl0aW9ucyBmb3Igd3JpdGVwcm90ZWN0ZWQgc2VjdG9ycyAoQlAyLi5CUDApLgogCSAqLwotCWlmIChtdGRfaGFzX2NtZGxpbmVwYXJ0KCkpIHsKLQkJc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10KLQkJCT0geyAiY21kbGluZXBhcnQiLCBOVUxMLCB9OwotCi0JCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQsCi0JCQkJCQlwYXJ0X3Byb2JlcywgJnBhcnRzLCAwKTsKLQl9Ci0KLQlpZiAobnJfcGFydHMgPD0gMCAmJiBkYXRhICYmIGRhdGEtPnBhcnRzKSB7Ci0JCXBhcnRzID0gZGF0YS0+cGFydHM7Ci0JCW5yX3BhcnRzID0gZGF0YS0+bnJfcGFydHM7Ci0JfQotCi0jaWZkZWYgQ09ORklHX01URF9PRl9QQVJUUwotCWlmIChucl9wYXJ0cyA8PSAwICYmIHNwaS0+ZGV2Lm9mX25vZGUpIHsKLQkJbnJfcGFydHMgPSBvZl9tdGRfcGFyc2VfcGFydGl0aW9ucygmc3BpLT5kZXYsCi0JCQkJCQkgICBzcGktPmRldi5vZl9ub2RlLCAmcGFydHMpOwotCX0KLSNlbmRpZgotCi0JaWYgKG5yX3BhcnRzID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFydHM7IGkrKykgewotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgInBhcnRpdGlvbnNbJWRdID0gIgotCQkJICAgICAgInsubmFtZSA9ICVzLCAub2Zmc2V0ID0gMHglbGx4LCAiCi0JCQkgICAgICAiLnNpemUgPSAweCVsbHggKCVsbGRLaUIpIH1cbiIsCi0JCQkgICAgICBpLCBwYXJ0c1tpXS5uYW1lLAotCQkJICAgICAgKGxvbmcgbG9uZylwYXJ0c1tpXS5vZmZzZXQsCi0JCQkgICAgICAobG9uZyBsb25nKXBhcnRzW2ldLnNpemUsCi0JCQkgICAgICAobG9uZyBsb25nKShwYXJ0c1tpXS5zaXplID4+IDEwKSk7Ci0JCX0KLQkJZmxhc2gtPnBhcnRpdGlvbmVkID0gMTsKLQl9Ci0KLQlyZXR1cm4gbXRkX2RldmljZV9yZWdpc3RlcigmZmxhc2gtPm10ZCwgcGFydHMsIG5yX3BhcnRzKSA9PSAxID8KLQkJLUVOT0RFViA6IDA7CisJcmV0dXJuIG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoJmZsYXNoLT5tdGQsIE5VTEwsICZwcGRhdGEsCisJCQlkYXRhID8gZGF0YS0+cGFydHMgOiBOVUxMLAorCQkJZGF0YSA/IGRhdGEtPm5yX3BhcnRzIDogMCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYwppbmRleCAxMzc0OWQ0Li5kNzVjN2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KQEAgLTI0LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KIAotCiAvKgogICogRGF0YUZsYXNoIGlzIGEga2luZCBvZiBTUEkgZmxhc2guICBNb3N0IEFUNDUgY2hpcHMgaGF2ZSB0d28gYnVmZmVycyBpbgogICogZWFjaCBjaGlwLCB3aGljaCBtYXkgYmUgdXNlZCBmb3IgZG91YmxlIGJ1ZmZlcmVkIEkvTzsgYnV0IHRoaXMgZHJpdmVyCkBAIC05OCw2ICs5OSwxNiBAQAogCXN0cnVjdCBtdGRfaW5mbwkJbXRkOwogfTsKIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZGF0YWZsYXNoX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiYXRtZWwsYXQ0NSIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxkYXRhZmxhc2giLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKyNlbHNlCisjZGVmaW5lIGRhdGFmbGFzaF9kdF9pZHMgTlVMTAorI2VuZGlmCisKIC8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KIAogLyoKQEAgLTEyMiw3ICsxMzMsNyBAQAogCWZvciAoOzspIHsKIAkJc3RhdHVzID0gZGF0YWZsYXNoX3N0YXR1cyhzcGkpOwogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgJWQ/XG4iLAorCQkJcHJfZGVidWcoIiVzOiBzdGF0dXMgJWQ/XG4iLAogCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBzdGF0dXMpOwogCQkJc3RhdHVzID0gMDsKIAkJfQpAQCAtMTQ5LDcgKzE2MCw3IEBACiAJdWludDhfdAkJCSpjb21tYW5kOwogCXVpbnQzMl90CQlyZW07CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IGVyYXNlIGFkZHI9MHglbGx4IGxlbiAweCVsbHhcbiIsCisJcHJfZGVidWcoIiVzOiBlcmFzZSBhZGRyPTB4JWxseCBsZW4gMHglbGx4XG4iLAogCSAgICAgIGRldl9uYW1lKCZzcGktPmRldiksIChsb25nIGxvbmcpaW5zdHItPmFkZHIsCiAJICAgICAgKGxvbmcgbG9uZylpbnN0ci0+bGVuKTsKIApAQCAtMTg3LDcgKzE5OCw3IEBACiAJCWNvbW1hbmRbMl0gPSAodWludDhfdCkocGFnZWFkZHIgPj4gOCk7CiAJCWNvbW1hbmRbM10gPSAwOwogCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJFUkFTRSAlczogKCV4KSAleCAleCAleCBbJWldXG4iLAorCQlwcl9kZWJ1ZygiRVJBU0UgJXM6ICgleCkgJXggJXggJXggWyVpXVxuIiwKIAkJCWRvX2Jsb2NrID8gImJsb2NrIiA6ICJwYWdlIiwKIAkJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10sCiAJCQlwYWdlYWRkcik7CkBAIC0yMzgsOCArMjQ5LDggQEAKIAl1aW50OF90CQkJKmNvbW1hbmQ7CiAJaW50CQkJc3RhdHVzOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiByZWFkIDB4JXguLjB4JXhcbiIsCi0JCWRldl9uYW1lKCZwcml2LT5zcGktPmRldiksICh1bnNpZ25lZClmcm9tLCAodW5zaWduZWQpKGZyb20gKyBsZW4pKTsKKwlwcl9kZWJ1ZygiJXM6IHJlYWQgMHgleC4uMHgleFxuIiwgZGV2X25hbWUoJnByaXYtPnNwaS0+ZGV2KSwKKwkJCSh1bnNpZ25lZClmcm9tLCAodW5zaWduZWQpKGZyb20gKyBsZW4pKTsKIAogCSpyZXRsZW4gPSAwOwogCkBAIC0yNTUsNyArMjY2LDcgQEAKIAogCWNvbW1hbmQgPSBwcml2LT5jb21tYW5kOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIlJFQUQ6ICgleCkgJXggJXggJXhcbiIsCisJcHJfZGVidWcoIlJFQUQ6ICgleCkgJXggJXggJXhcbiIsCiAJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10pOwogCiAJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKQEAgLTI4Nyw3ICsyOTgsNyBAQAogCQkqcmV0bGVuID0gbXNnLmFjdHVhbF9sZW5ndGggLSA4OwogCQlzdGF0dXMgPSAwOwogCX0gZWxzZQotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlYWQgJXguLiV4IC0tPiAlZFxuIiwKKwkJcHJfZGVidWcoIiVzOiByZWFkICV4Li4leCAtLT4gJWRcbiIsCiAJCQlkZXZfbmFtZSgmcHJpdi0+c3BpLT5kZXYpLAogCQkJKHVuc2lnbmVkKWZyb20sICh1bnNpZ25lZCkoZnJvbSArIGxlbiksCiAJCQlzdGF0dXMpOwpAQCAtMzE0LDcgKzMyNSw3IEBACiAJaW50CQkJc3RhdHVzID0gLUVJTlZBTDsKIAl1aW50OF90CQkJKmNvbW1hbmQ7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IHdyaXRlIDB4JXguLjB4JXhcbiIsCisJcHJfZGVidWcoIiVzOiB3cml0ZSAweCV4Li4weCV4XG4iLAogCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCAodW5zaWduZWQpdG8sICh1bnNpZ25lZCkodG8gKyBsZW4pKTsKIAogCSpyZXRsZW4gPSAwOwpAQCAtMzQwLDcgKzM1MSw3IEBACiAKIAltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKIAl3aGlsZSAocmVtYWluaW5nID4gMCkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAid3JpdGUgQCAlaTolaSBsZW49JWlcbiIsCisJCXByX2RlYnVnKCJ3cml0ZSBAICVpOiVpIGxlbj0laVxuIiwKIAkJCXBhZ2VhZGRyLCBvZmZzZXQsIHdyaXRlbGVuKTsKIAogCQkvKiBSRVZJU0lUOgpAQCAtMzY4LDEyICszNzksMTIgQEAKIAkJCWNvbW1hbmRbMl0gPSAoYWRkciAmIDB4MDAwMEZGMDApID4+IDg7CiAJCQljb21tYW5kWzNdID0gMDsKIAotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIlRSQU5TRkVSOiAoJXgpICV4ICV4ICV4XG4iLAorCQkJcHJfZGVidWcoIlRSQU5TRkVSOiAoJXgpICV4ICV4ICV4XG4iLAogCQkJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10pOwogCiAJCQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtc2cpOwogCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiB4ZmVyICV1IC0+ICVkIFxuIiwKKwkJCQlwcl9kZWJ1ZygiJXM6IHhmZXIgJXUgLT4gJWRcbiIsCiAJCQkJCWRldl9uYW1lKCZzcGktPmRldiksIGFkZHIsIHN0YXR1cyk7CiAKIAkJCSh2b2lkKSBkYXRhZmxhc2hfd2FpdHJlYWR5KHByaXYtPnNwaSk7CkBAIC0zODYsNyArMzk3LDcgQEAKIAkJY29tbWFuZFsyXSA9IChhZGRyICYgMHgwMDAwRkYwMCkgPj4gODsKIAkJY29tbWFuZFszXSA9IChhZGRyICYgMHgwMDAwMDBGRik7CiAKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIlBST0dSQU06ICgleCkgJXggJXggJXhcbiIsCisJCXByX2RlYnVnKCJQUk9HUkFNOiAoJXgpICV4ICV4ICV4XG4iLAogCQkJY29tbWFuZFswXSwgY29tbWFuZFsxXSwgY29tbWFuZFsyXSwgY29tbWFuZFszXSk7CiAKIAkJeFsxXS50eF9idWYgPSB3cml0ZWJ1ZjsKQEAgLTM5NSw3ICs0MDYsNyBAQAogCQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtc2cpOwogCQlzcGlfdHJhbnNmZXJfZGVsKHggKyAxKTsKIAkJaWYgKHN0YXR1cyA8IDApCi0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHBnbSAldS8ldSAtPiAlZCBcbiIsCisJCQlwcl9kZWJ1ZygiJXM6IHBnbSAldS8ldSAtPiAlZFxuIiwKIAkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBhZGRyLCB3cml0ZWxlbiwgc3RhdHVzKTsKIAogCQkodm9pZCkgZGF0YWZsYXNoX3dhaXRyZWFkeShwcml2LT5zcGkpOwpAQCAtNDEwLDEyICs0MjEsMTIgQEAKIAkJY29tbWFuZFsyXSA9IChhZGRyICYgMHgwMDAwRkYwMCkgPj4gODsKIAkJY29tbWFuZFszXSA9IDA7CiAKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIkNPTVBBUkU6ICgleCkgJXggJXggJXhcbiIsCisJCXByX2RlYnVnKCJDT01QQVJFOiAoJXgpICV4ICV4ICV4XG4iLAogCQkJY29tbWFuZFswXSwgY29tbWFuZFsxXSwgY29tbWFuZFsyXSwgY29tbWFuZFszXSk7CiAKIAkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKIAkJaWYgKHN0YXR1cyA8IDApCi0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IGNvbXBhcmUgJXUgLT4gJWQgXG4iLAorCQkJcHJfZGVidWcoIiVzOiBjb21wYXJlICV1IC0+ICVkXG4iLAogCQkJCWRldl9uYW1lKCZzcGktPmRldiksIGFkZHIsIHN0YXR1cyk7CiAKIAkJc3RhdHVzID0gZGF0YWZsYXNoX3dhaXRyZWFkeShwcml2LT5zcGkpOwpAQCAtNjM0LDExICs2NDUsMTAgQEAKIHsKIAlzdHJ1Y3QgZGF0YWZsYXNoCQkqcHJpdjsKIAlzdHJ1Y3QgbXRkX2luZm8JCQkqZGV2aWNlOworCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YQlwcGRhdGE7CiAJc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEJKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKIAljaGFyCQkJCSpvdHBfdGFnID0gIiI7CiAJaW50CQkJCWVyciA9IDA7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24JCSpwYXJ0czsKLQlpbnQJCQkJbnJfcGFydHMgPSAwOwogCiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCkBAIC02NzcsMjggKzY4NywxMSBAQAogCQkJcGFnZXNpemUsIG90cF90YWcpOwogCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHByaXYpOwogCi0JaWYgKG10ZF9oYXNfY21kbGluZXBhcnQoKSkgewotCQlzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCwgfTsKKwlwcGRhdGEub2Zfbm9kZSA9IHNwaS0+ZGV2Lm9mX25vZGU7CisJZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihkZXZpY2UsIE5VTEwsICZwcGRhdGEsCisJCQlwZGF0YSA/IHBkYXRhLT5wYXJ0cyA6IE5VTEwsCisJCQlwZGF0YSA/IHBkYXRhLT5ucl9wYXJ0cyA6IDApOwogCi0JCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoZGV2aWNlLCBwYXJ0X3Byb2JlcywgJnBhcnRzLAotCQkJCQkJMCk7Ci0JfQotCi0JaWYgKG5yX3BhcnRzIDw9IDAgJiYgcGRhdGEgJiYgcGRhdGEtPnBhcnRzKSB7Ci0JCXBhcnRzID0gcGRhdGEtPnBhcnRzOwotCQlucl9wYXJ0cyA9IHBkYXRhLT5ucl9wYXJ0czsKLQl9Ci0KLQlpZiAobnJfcGFydHMgPiAwKSB7Ci0JCXByaXYtPnBhcnRpdGlvbmVkID0gMTsKLQkJZXJyID0gbXRkX2RldmljZV9yZWdpc3RlcihkZXZpY2UsIHBhcnRzLCBucl9wYXJ0cyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChtdGRfZGV2aWNlX3JlZ2lzdGVyKGRldmljZSwgTlVMTCwgMCkgPT0gMSkKLQkJZXJyID0gLUVOT0RFVjsKLQotb3V0OgogCWlmICghZXJyKQogCQlyZXR1cm4gMDsKIApAQCAtNzg3LDcgKzc4MCw3IEBACiAJICovCiAJdG1wID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZjb2RlLCAxLCBpZCwgMyk7CiAJaWYgKHRtcCA8IDApIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBlcnJvciAlZCByZWFkaW5nIEpFREVDIElEXG4iLAorCQlwcl9kZWJ1ZygiJXM6IGVycm9yICVkIHJlYWRpbmcgSkVERUMgSURcbiIsCiAJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCB0bXApOwogCQlyZXR1cm4gRVJSX1BUUih0bXApOwogCX0KQEAgLTgwNCw3ICs3OTcsNyBAQAogCQkJdG1wIDwgQVJSQVlfU0laRShkYXRhZmxhc2hfZGF0YSk7CiAJCQl0bXArKywgaW5mbysrKSB7CiAJCWlmIChpbmZvLT5qZWRlY19pZCA9PSBqZWRlYykgewotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBPVFAsIHNlY3RvciBwcm90ZWN0JXNcbiIsCisJCQlwcl9kZWJ1ZygiJXM6IE9UUCwgc2VjdG9yIHByb3RlY3Qlc1xuIiwKIAkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLAogCQkJCShpbmZvLT5mbGFncyAmIFNVUF9QT1cyUFMpCiAJCQkJCT8gIiwgYmluYXJ5IHBhZ2VzaXplIiA6ICIiCkBAIC04MTIsOCArODA1LDcgQEAKIAkJCWlmIChpbmZvLT5mbGFncyAmIFNVUF9QT1cyUFMpIHsKIAkJCQlzdGF0dXMgPSBkYXRhZmxhc2hfc3RhdHVzKHNwaSk7CiAJCQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwKLQkJCQkJCSIlczogc3RhdHVzIGVycm9yICVkXG4iLAorCQkJCQlwcl9kZWJ1ZygiJXM6IHN0YXR1cyBlcnJvciAlZFxuIiwKIAkJCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCQkJCXJldHVybiBFUlJfUFRSKHN0YXR1cyk7CiAJCQkJfQpAQCAtODc4LDcgKzg3MCw3IEBACiAJICovCiAJc3RhdHVzID0gZGF0YWZsYXNoX3N0YXR1cyhzcGkpOwogCWlmIChzdGF0dXMgPD0gMCB8fCBzdGF0dXMgPT0gMHhmZikgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHN0YXR1cyBlcnJvciAlZFxuIiwKKwkJcHJfZGVidWcoIiVzOiBzdGF0dXMgZXJyb3IgJWRcbiIsCiAJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgc3RhdHVzKTsKIAkJaWYgKHN0YXR1cyA9PSAwIHx8IHN0YXR1cyA9PSAweGZmKQogCQkJc3RhdHVzID0gLUVOT0RFVjsKQEAgLTkxNCwxNCArOTA2LDE0IEBACiAJCWJyZWFrOwogCS8qIG9ic29sZXRlIEFUNDVEQjEyODIgbm90ICh5ZXQ/KSBzdXBwb3J0ZWQgKi8KIAlkZWZhdWx0OgotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAoJXgpXG4iLAotCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyAmIDB4M2MpOworCQlwcl9kZWJ1ZygiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAoJXgpXG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpLAorCQkJCXN0YXR1cyAmIDB4M2MpOwogCQlzdGF0dXMgPSAtRU5PREVWOwogCX0KIAogCWlmIChzdGF0dXMgPCAwKQotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IGFkZF9kYXRhZmxhc2ggLS0+ICVkXG4iLAotCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CisJCXByX2RlYnVnKCIlczogYWRkX2RhdGFmbGFzaCAtLT4gJWRcbiIsIGRldl9uYW1lKCZzcGktPmRldiksCisJCQkJc3RhdHVzKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC05MzEsNyArOTIzLDcgQEAKIAlzdHJ1Y3QgZGF0YWZsYXNoCSpmbGFzaCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOwogCWludAkJCXN0YXR1czsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogcmVtb3ZlXG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpKTsKKwlwcl9kZWJ1ZygiJXM6IHJlbW92ZVxuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CiAKIAlzdGF0dXMgPSBtdGRfZGV2aWNlX3VucmVnaXN0ZXIoJmZsYXNoLT5tdGQpOwogCWlmIChzdGF0dXMgPT0gMCkgewpAQCAtOTQ2LDYgKzkzOCw3IEBACiAJCS5uYW1lCQk9ICJtdGRfZGF0YWZsYXNoIiwKIAkJLmJ1cwkJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGRhdGFmbGFzaF9kdF9pZHMsCiAJfSwKIAogCS5wcm9iZQkJPSBkYXRhZmxhc2hfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL3NzdDI1bC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9zc3QyNWwuYwppbmRleCA4M2U4MGM2Li5kMzhlZjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL3NzdDI1bC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvc3N0MjVsLmMKQEAgLTUyLDggKzUyLDYgQEAKIAlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOwogCXN0cnVjdCBtdXRleAkJbG9jazsKIAlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKLQotCWludCAJCQlwYXJ0aXRpb25lZDsKIH07CiAKIHN0cnVjdCBmbGFzaF9pbmZvIHsKQEAgLTM4MSw4ICszNzksNiBAQAogCXN0cnVjdCBzc3QyNWxfZmxhc2ggKmZsYXNoOwogCXN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhICpkYXRhOwogCWludCByZXQsIGk7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzID0gTlVMTDsKLQlpbnQgbnJfcGFydHMgPSAwOwogCiAJZmxhc2hfaW5mbyA9IHNzdDI1bF9tYXRjaF9kZXZpY2Uoc3BpKTsKIAlpZiAoIWZsYXNoX2luZm8pCkBAIC00MTQsOCArNDEwLDcgQEAKIAlkZXZfaW5mbygmc3BpLT5kZXYsICIlcyAoJWxsZCBLaUIpXG4iLCBmbGFzaF9pbmZvLT5uYW1lLAogCQkgKGxvbmcgbG9uZylmbGFzaC0+bXRkLnNpemUgPj4gMTApOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwKLQkgICAgICAibXRkIC5uYW1lID0gJXMsIC5zaXplID0gMHglbGx4ICglbGxkTWlCKSAiCisJcHJfZGVidWcoIm10ZCAubmFtZSA9ICVzLCAuc2l6ZSA9IDB4JWxseCAoJWxsZE1pQikgIgogCSAgICAgICIuZXJhc2VzaXplID0gMHglLjh4ICgldUtpQikgLm51bWVyYXNlcmVnaW9ucyA9ICVkXG4iLAogCSAgICAgIGZsYXNoLT5tdGQubmFtZSwKIAkgICAgICAobG9uZyBsb25nKWZsYXNoLT5tdGQuc2l6ZSwgKGxvbmcgbG9uZykoZmxhc2gtPm10ZC5zaXplID4+IDIwKSwKQEAgLTQyMywzNyArNDE4LDEwIEBACiAJICAgICAgZmxhc2gtPm10ZC5udW1lcmFzZXJlZ2lvbnMpOwogCiAKLQlpZiAobXRkX2hhc19jbWRsaW5lcGFydCgpKSB7Ci0JCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyJjbWRsaW5lcGFydCIsIE5VTEx9OwotCi0JCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQsCi0JCQkJCQlwYXJ0X3Byb2JlcywKLQkJCQkJCSZwYXJ0cywgMCk7Ci0JfQotCi0JaWYgKG5yX3BhcnRzIDw9IDAgJiYgZGF0YSAmJiBkYXRhLT5wYXJ0cykgewotCQlwYXJ0cyA9IGRhdGEtPnBhcnRzOwotCQlucl9wYXJ0cyA9IGRhdGEtPm5yX3BhcnRzOwotCX0KLQotCWlmIChucl9wYXJ0cyA+IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IG5yX3BhcnRzOyBpKyspIHsKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICJwYXJ0aXRpb25zWyVkXSA9ICIKLQkJCSAgICAgICJ7Lm5hbWUgPSAlcywgLm9mZnNldCA9IDB4JWxseCwgIgotCQkJICAgICAgIi5zaXplID0gMHglbGx4ICglbGxkS2lCKSB9XG4iLAotCQkJICAgICAgaSwgcGFydHNbaV0ubmFtZSwKLQkJCSAgICAgIChsb25nIGxvbmcpcGFydHNbaV0ub2Zmc2V0LAotCQkJICAgICAgKGxvbmcgbG9uZylwYXJ0c1tpXS5zaXplLAotCQkJICAgICAgKGxvbmcgbG9uZykocGFydHNbaV0uc2l6ZSA+PiAxMCkpOwotCQl9Ci0KLQkJZmxhc2gtPnBhcnRpdGlvbmVkID0gMTsKLQkJcmV0dXJuIG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmZsYXNoLT5tdGQsIHBhcnRzLAotCQkJCQkgICBucl9wYXJ0cyk7Ci0JfQotCi0JcmV0ID0gbXRkX2RldmljZV9yZWdpc3RlcigmZmxhc2gtPm10ZCwgTlVMTCwgMCk7Ci0JaWYgKHJldCA9PSAxKSB7CisJcmV0ID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmZmxhc2gtPm10ZCwgTlVMTCwgMCwKKwkJCWRhdGEgPyBkYXRhLT5wYXJ0cyA6IE5VTEwsCisJCQlkYXRhID8gZGF0YS0+bnJfcGFydHMgOiAwKTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKGZsYXNoKTsKIAkJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZnRsLmMgYi9kcml2ZXJzL210ZC9mdGwuYwppbmRleCAwMzdiMzk5Li5jNzM4MmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9mdGwuYworKysgYi9kcml2ZXJzL210ZC9mdGwuYwpAQCAtMzM5LDcgKzMzOSw3IEBACiAgICAgc3RydWN0IGVyYXNlX2luZm8gKmVyYXNlOwogCiAgICAgeGZlciA9ICZwYXJ0LT5YZmVySW5mb1t4ZmVybnVtXTsKLSAgICBERUJVRygxLCAiZnRsX2NzOiBlcmFzaW5nIHhmZXIgdW5pdCBhdCAweCV4XG4iLCB4ZmVyLT5PZmZzZXQpOworICAgIHByX2RlYnVnKCJmdGxfY3M6IGVyYXNpbmcgeGZlciB1bml0IGF0IDB4JXhcbiIsIHhmZXItPk9mZnNldCk7CiAgICAgeGZlci0+c3RhdGUgPSBYRkVSX0VSQVNJTkc7CiAKICAgICAvKiBJcyB0aGVyZSBhIGZyZWUgZXJhc2Ugc2xvdD8gQWx3YXlzIGluIE1URC4gKi8KQEAgLTQxNSw3ICs0MTUsNyBAQAogICAgIHhmZXIgPSAmcGFydC0+WGZlckluZm9baV07CiAgICAgeGZlci0+c3RhdGUgPSBYRkVSX0ZBSUxFRDsKIAotICAgIERFQlVHKDEsICJmdGxfY3M6IHByZXBhcmluZyB4ZmVyIHVuaXQgYXQgMHgleFxuIiwgeGZlci0+T2Zmc2V0KTsKKyAgICBwcl9kZWJ1ZygiZnRsX2NzOiBwcmVwYXJpbmcgeGZlciB1bml0IGF0IDB4JXhcbiIsIHhmZXItPk9mZnNldCk7CiAKICAgICAvKiBXcml0ZSB0aGUgdHJhbnNmZXIgdW5pdCBoZWFkZXIgKi8KICAgICBoZWFkZXIgPSBwYXJ0LT5oZWFkZXI7CkBAIC00NzYsNyArNDc2LDcgQEAKIAogICAgIGV1biA9ICZwYXJ0LT5FVU5JbmZvW3NyY3VuaXRdOwogICAgIHhmZXIgPSAmcGFydC0+WGZlckluZm9beGZlcnVuaXRdOwotICAgIERFQlVHKDIsICJmdGxfY3M6IGNvcHlpbmcgYmxvY2sgMHgleCB0byAweCV4XG4iLAorICAgIHByX2RlYnVnKCJmdGxfY3M6IGNvcHlpbmcgYmxvY2sgMHgleCB0byAweCV4XG4iLAogCSAgZXVuLT5PZmZzZXQsIHhmZXItPk9mZnNldCk7CiAKIApAQCAtNTk4LDcgKzU5OCw3IEBACiAgICAgdW5pdCB3aXRoIHRoZSBmZXdlc3QgZXJhc2VzLCBhbmQgdXN1YWxseSBwaWNrIHRoZSBkYXRhIHVuaXQgd2l0aAogICAgIHRoZSBtb3N0IGRlbGV0ZWQgYmxvY2tzLiAgQnV0IHdpdGggYSBzbWFsbCBwcm9iYWJpbGl0eSwgcGljayB0aGUKICAgICBvbGRlc3QgZGF0YSB1bml0IGluc3RlYWQuICBUaGlzIG1lYW5zIHRoYXQgd2UgZ2VuZXJhbGx5IHBvc3Rwb25lCi0gICAgdGhlIG5leHQgcmVjbGFpbWF0aW9uIGFzIGxvbmcgYXMgcG9zc2libGUsIGJ1dCBzaHVmZmxlIHN0YXRpYworICAgIHRoZSBuZXh0IHJlY2xhbWF0aW9uIGFzIGxvbmcgYXMgcG9zc2libGUsIGJ1dCBzaHVmZmxlIHN0YXRpYwogICAgIHN0dWZmIGFyb3VuZCBhIGJpdCBmb3Igd2VhciBsZXZlbGluZy4KIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC02MDksOCArNjA5LDggQEAKICAgICB1aW50MzJfdCBiZXN0OwogICAgIGludCBxdWV1ZWQsIHJldDsKIAotICAgIERFQlVHKDAsICJmdGxfY3M6IHJlY2xhaW1pbmcgc3BhY2UuLi5cbiIpOwotICAgIERFQlVHKDMsICJOdW1UcmFuc2ZlclVuaXRzID09ICV4XG4iLCBwYXJ0LT5oZWFkZXIuTnVtVHJhbnNmZXJVbml0cyk7CisgICAgcHJfZGVidWcoImZ0bF9jczogcmVjbGFpbWluZyBzcGFjZS4uLlxuIik7CisgICAgcHJfZGVidWcoIk51bVRyYW5zZmVyVW5pdHMgPT0gJXhcbiIsIHBhcnQtPmhlYWRlci5OdW1UcmFuc2ZlclVuaXRzKTsKICAgICAvKiBQaWNrIHRoZSBsZWFzdCBlcmFzZWQgdHJhbnNmZXIgdW5pdCAqLwogICAgIGJlc3QgPSAweGZmZmZmZmZmOyB4ZmVyID0gMHhmZmZmOwogICAgIGRvIHsKQEAgLTYxOCwyMiArNjE4LDIyIEBACiAJZm9yIChpID0gMDsgaSA8IHBhcnQtPmhlYWRlci5OdW1UcmFuc2ZlclVuaXRzOyBpKyspIHsKIAkgICAgaW50IG49MDsKIAkgICAgaWYgKHBhcnQtPlhmZXJJbmZvW2ldLnN0YXRlID09IFhGRVJfVU5LTk9XTikgewotCQlERUJVRygzLCJYZmVySW5mb1slZF0uc3RhdGUgPT0gWEZFUl9VTktOT1dOXG4iLGkpOworCQlwcl9kZWJ1ZygiWGZlckluZm9bJWRdLnN0YXRlID09IFhGRVJfVU5LTk9XTlxuIixpKTsKIAkJbj0xOwogCQllcmFzZV94ZmVyKHBhcnQsIGkpOwogCSAgICB9CiAJICAgIGlmIChwYXJ0LT5YZmVySW5mb1tpXS5zdGF0ZSA9PSBYRkVSX0VSQVNJTkcpIHsKLQkJREVCVUcoMywiWGZlckluZm9bJWRdLnN0YXRlID09IFhGRVJfRVJBU0lOR1xuIixpKTsKKwkJcHJfZGVidWcoIlhmZXJJbmZvWyVkXS5zdGF0ZSA9PSBYRkVSX0VSQVNJTkdcbiIsaSk7CiAJCW49MTsKIAkJcXVldWVkID0gMTsKIAkgICAgfQogCSAgICBlbHNlIGlmIChwYXJ0LT5YZmVySW5mb1tpXS5zdGF0ZSA9PSBYRkVSX0VSQVNFRCkgewotCQlERUJVRygzLCJYZmVySW5mb1slZF0uc3RhdGUgPT0gWEZFUl9FUkFTRURcbiIsaSk7CisJCXByX2RlYnVnKCJYZmVySW5mb1slZF0uc3RhdGUgPT0gWEZFUl9FUkFTRURcbiIsaSk7CiAJCW49MTsKIAkJcHJlcGFyZV94ZmVyKHBhcnQsIGkpOwogCSAgICB9CiAJICAgIGlmIChwYXJ0LT5YZmVySW5mb1tpXS5zdGF0ZSA9PSBYRkVSX1BSRVBBUkVEKSB7Ci0JCURFQlVHKDMsIlhmZXJJbmZvWyVkXS5zdGF0ZSA9PSBYRkVSX1BSRVBBUkVEXG4iLGkpOworCQlwcl9kZWJ1ZygiWGZlckluZm9bJWRdLnN0YXRlID09IFhGRVJfUFJFUEFSRURcbiIsaSk7CiAJCW49MTsKIAkJaWYgKHBhcnQtPlhmZXJJbmZvW2ldLkVyYXNlQ291bnQgPD0gYmVzdCkgewogCQkgICAgYmVzdCA9IHBhcnQtPlhmZXJJbmZvW2ldLkVyYXNlQ291bnQ7CkBAIC02NDEsMTIgKzY0MSwxMiBAQAogCQl9CiAJICAgIH0KIAkJaWYgKCFuKQotCQkgICAgREVCVUcoMywiWGZlckluZm9bJWRdLnN0YXRlID09ICV4XG4iLGksIHBhcnQtPlhmZXJJbmZvW2ldLnN0YXRlKTsKKwkJICAgIHByX2RlYnVnKCJYZmVySW5mb1slZF0uc3RhdGUgPT0gJXhcbiIsaSwgcGFydC0+WGZlckluZm9baV0uc3RhdGUpOwogCiAJfQogCWlmICh4ZmVyID09IDB4ZmZmZikgewogCSAgICBpZiAocXVldWVkKSB7Ci0JCURFQlVHKDEsICJmdGxfY3M6IHdhaXRpbmcgZm9yIHRyYW5zZmVyICIKKwkJcHJfZGVidWcoImZ0bF9jczogd2FpdGluZyBmb3IgdHJhbnNmZXIgIgogCQkgICAgICAidW5pdCB0byBiZSBwcmVwYXJlZC4uLlxuIik7CiAJCWlmIChwYXJ0LT5tYmQubXRkLT5zeW5jKQogCQkJcGFydC0+bWJkLm10ZC0+c3luYyhwYXJ0LT5tYmQubXRkKTsKQEAgLTY1Niw3ICs2NTYsNyBAQAogCQkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJmdGxfY3M6IHJlY2xhaW0gZmFpbGVkOiBubyAiCiAJCQkgICAic3VpdGFibGUgdHJhbnNmZXIgdW5pdHMhXG4iKTsKIAkJZWxzZQotCQkgICAgREVCVUcoMSwgImZ0bF9jczogcmVjbGFpbSBmYWlsZWQ6IG5vICIKKwkJICAgIHByX2RlYnVnKCJmdGxfY3M6IHJlY2xhaW0gZmFpbGVkOiBubyAiCiAJCQkgICJzdWl0YWJsZSB0cmFuc2ZlciB1bml0cyFcbiIpOwogCiAJCXJldHVybiAtRUlPOwpAQCAtNjY2LDcgKzY2Niw3IEBACiAKICAgICBldW4gPSAwOwogICAgIGlmICgoamlmZmllcyAlIHNodWZmbGVfZnJlcSkgPT0gMCkgewotCURFQlVHKDEsICJmdGxfY3M6IHJlY3ljbGluZyBmcmVzaGVzdCBibG9jay4uLlxuIik7CisJcHJfZGVidWcoImZ0bF9jczogcmVjeWNsaW5nIGZyZXNoZXN0IGJsb2NrLi4uXG4iKTsKIAliZXN0ID0gMHhmZmZmZmZmZjsKIAlmb3IgKGkgPSAwOyBpIDwgcGFydC0+RGF0YVVuaXRzOyBpKyspCiAJICAgIGlmIChwYXJ0LT5FVU5JbmZvW2ldLkVyYXNlQ291bnQgPD0gYmVzdCkgewpAQCAtNjg2LDcgKzY4Niw3IEBACiAJCXByaW50ayhLRVJOX05PVElDRSAiZnRsX2NzOiByZWNsYWltIGZhaWxlZDogIgogCQkgICAgICAgIm5vIGZyZWUgYmxvY2tzIVxuIik7CiAJICAgIGVsc2UKLQkJREVCVUcoMSwiZnRsX2NzOiByZWNsYWltIGZhaWxlZDogIgorCQlwcl9kZWJ1ZygiZnRsX2NzOiByZWNsYWltIGZhaWxlZDogIgogCQkgICAgICAgIm5vIGZyZWUgYmxvY2tzIVxuIik7CiAKIAkgICAgcmV0dXJuIC1FSU87CkBAIC03NzEsNyArNzcxLDcgQEAKIAlwcmludGsoS0VSTl9OT1RJQ0UgImZ0bF9jczogYmFkIGZyZWUgbGlzdCFcbiIpOwogCXJldHVybiAwOwogICAgIH0KLSAgICBERUJVRygyLCAiZnRsX2NzOiBmb3VuZCBmcmVlIGJsb2NrIGF0ICVkIGluICVkXG4iLCBibGssIGV1bik7CisgICAgcHJfZGVidWcoImZ0bF9jczogZm91bmQgZnJlZSBibG9jayBhdCAlZCBpbiAlZFxuIiwgYmxrLCBldW4pOwogICAgIHJldHVybiBibGs7CiAKIH0gLyogZmluZF9mcmVlICovCkBAIC03OTEsNyArNzkxLDcgQEAKICAgICBpbnQgcmV0OwogICAgIHNpemVfdCBvZmZzZXQsIHJldGxlbjsKIAotICAgIERFQlVHKDIsICJmdGxfY3M6IGZ0bF9yZWFkKDB4JXAsIDB4JWx4LCAlbGQpXG4iLAorICAgIHByX2RlYnVnKCJmdGxfY3M6IGZ0bF9yZWFkKDB4JXAsIDB4JWx4LCAlbGQpXG4iLAogCSAgcGFydCwgc2VjdG9yLCBuYmxvY2tzKTsKICAgICBpZiAoIShwYXJ0LT5zdGF0ZSAmIEZUTF9GT1JNQVRURUQpKSB7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJmdGxfY3M6IGJhZCBwYXJ0aXRpb25cbiIpOwpAQCAtODQwLDcgKzg0MCw3IEBACiAgICAgaW50IHJldDsKICAgICBzaXplX3QgcmV0bGVuLCBvZmZzZXQ7CiAKLSAgICBERUJVRygyLCAiZnRsX2NzOiBzZXRfYmFtX2VudHJ5KDB4JXAsIDB4JXgsIDB4JXgpXG4iLAorICAgIHByX2RlYnVnKCJmdGxfY3M6IHNldF9iYW1fZW50cnkoMHglcCwgMHgleCwgMHgleClcbiIsCiAJICBwYXJ0LCBsb2dfYWRkciwgdmlydF9hZGRyKTsKICAgICBic2l6ZSA9IDEgPDwgcGFydC0+aGVhZGVyLkVyYXNlVW5pdFNpemU7CiAgICAgZXVuID0gbG9nX2FkZHIgLyBic2l6ZTsKQEAgLTkwNSw3ICs5MDUsNyBAQAogICAgIGludCByZXQ7CiAgICAgc2l6ZV90IHJldGxlbiwgb2Zmc2V0OwogCi0gICAgREVCVUcoMiwgImZ0bF9jczogZnRsX3dyaXRlKDB4JXAsICVsZCwgJWxkKVxuIiwKKyAgICBwcl9kZWJ1ZygiZnRsX2NzOiBmdGxfd3JpdGUoMHglcCwgJWxkLCAlbGQpXG4iLAogCSAgcGFydCwgc2VjdG9yLCBuYmxvY2tzKTsKICAgICBpZiAoIShwYXJ0LT5zdGF0ZSAmIEZUTF9GT1JNQVRURUQpKSB7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJmdGxfY3M6IGJhZCBwYXJ0aXRpb25cbiIpOwpAQCAtMTAxMSw3ICsxMDExLDcgQEAKIAlwYXJ0aXRpb25fdCAqcGFydCA9ICh2b2lkICopZGV2OwogCXVpbnQzMl90IGJzaXplID0gMSA8PCBwYXJ0LT5oZWFkZXIuRXJhc2VVbml0U2l6ZTsKIAotCURFQlVHKDEsICJGVEwgZXJhc2Ugc2VjdG9yICVsZCBmb3IgJWQgc2VjdG9yc1xuIiwKKwlwcl9kZWJ1ZygiRlRMIGVyYXNlIHNlY3RvciAlbGQgZm9yICVkIHNlY3RvcnNcbiIsCiAJICAgICAgc2VjdG9yLCBucl9zZWN0cyk7CiAKIAl3aGlsZSAobnJfc2VjdHMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2luZnRsY29yZS5jIGIvZHJpdmVycy9tdGQvaW5mdGxjb3JlLmMKaW5kZXggZDc1OTJlNi4uZGQwMzRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvaW5mdGxjb3JlLmMKKysrIGIvZHJpdmVycy9tdGQvaW5mdGxjb3JlLmMKQEAgLTYzLDE0ICs2MywxMiBAQAogCQlyZXR1cm47CiAJfQogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBhZGRfbXRkIGZvciAlc1xuIiwgbXRkLT5uYW1lKTsKKwlwcl9kZWJ1ZygiSU5GVEw6IGFkZF9tdGQgZm9yICVzXG4iLCBtdGQtPm5hbWUpOwogCiAJaW5mdGwgPSBremFsbG9jKHNpemVvZigqaW5mdGwpLCBHRlBfS0VSTkVMKTsKIAotCWlmICghaW5mdGwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSU5GVEw6IE91dCBvZiBtZW1vcnkgZm9yIGRhdGEgc3RydWN0dXJlc1xuIik7CisJaWYgKCFpbmZ0bCkKIAkJcmV0dXJuOwotCX0KIAogCWluZnRsLT5tYmQubXRkID0gbXRkOwogCWluZnRsLT5tYmQuZGV2bnVtID0gLTE7CkBAIC0xMzMsNyArMTMxLDcgQEAKIHsKIAlzdHJ1Y3QgSU5GVExyZWNvcmQgKmluZnRsID0gKHZvaWQgKilkZXY7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiSU5GVEw6IHJlbW92ZV9kZXYgKGk9JWQpXG4iLCBkZXYtPmRldm51bSk7CisJcHJfZGVidWcoIklORlRMOiByZW1vdmVfZGV2IChpPSVkKVxuIiwgZGV2LT5kZXZudW0pOwogCiAJZGVsX210ZF9ibGt0cmFuc19kZXYoZGV2KTsKIApAQCAtMTU0LDcgKzE1Miw3IEBACiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmVzOwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gTVREX09QU19QTEFDRV9PT0I7CiAJb3BzLm9vYm9mZnMgPSBvZmZzICYgKG10ZC0+d3JpdGVzaXplIC0gMSk7CiAJb3BzLm9vYmxlbiA9IGxlbjsKIAlvcHMub29iYnVmID0gYnVmOwpAQCAtMTc0LDcgKzE3Miw3IEBACiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmVzOwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gTVREX09QU19QTEFDRV9PT0I7CiAJb3BzLm9vYm9mZnMgPSBvZmZzICYgKG10ZC0+d3JpdGVzaXplIC0gMSk7CiAJb3BzLm9vYmxlbiA9IGxlbjsKIAlvcHMub29iYnVmID0gYnVmOwpAQCAtMTk0LDcgKzE5Miw3IEBACiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmVzOwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gTVREX09QU19QTEFDRV9PT0I7CiAJb3BzLm9vYm9mZnMgPSBvZmZzOwogCW9wcy5vb2JsZW4gPSBtdGQtPm9vYnNpemU7CiAJb3BzLm9vYmJ1ZiA9IG9vYjsKQEAgLTIxNSwxNiArMjEzLDE2IEBACiAJdTE2IHBvdCA9IGluZnRsLT5MYXN0RnJlZUVVTjsKIAlpbnQgc2lsbHkgPSBpbmZ0bC0+bmJfYmxvY2tzOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBJTkZUTF9maW5kZnJlZWJsb2NrKGluZnRsPSVwLCIKLQkJImRlc3BlcmF0ZT0lZClcbiIsIGluZnRsLCBkZXNwZXJhdGUpOworCXByX2RlYnVnKCJJTkZUTDogSU5GVExfZmluZGZyZWVibG9jayhpbmZ0bD0lcCxkZXNwZXJhdGU9JWQpXG4iLAorCQkJaW5mdGwsIGRlc3BlcmF0ZSk7CiAKIAkvKgogCSAqIE5vcm1hbGx5LCB3ZSBmb3JjZSBhIGZvbGQgdG8gaGFwcGVuIGJlZm9yZSB3ZSBydW4gb3V0IG9mIGZyZWUKIAkgKiBibG9ja3MgY29tcGxldGVseS4KIAkgKi8KIAlpZiAoIWRlc3BlcmF0ZSAmJiBpbmZ0bC0+bnVtZnJlZUVVTnMgPCAyKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJJTkZUTDogdGhlcmUgYXJlIHRvbyBmZXcgZnJlZSAiCi0JCQkiRVVOcyAoJWQpXG4iLCBpbmZ0bC0+bnVtZnJlZUVVTnMpOworCQlwcl9kZWJ1ZygiSU5GVEw6IHRoZXJlIGFyZSB0b28gZmV3IGZyZWUgRVVOcyAoJWQpXG4iLAorCQkJCWluZnRsLT5udW1mcmVlRVVOcyk7CiAJCXJldHVybiBCTE9DS19OSUw7CiAJfQogCkBAIC0yNTksOCArMjU3LDggQEAKIAlzdHJ1Y3QgaW5mdGxfb29iIG9vYjsKIAlzaXplX3QgcmV0bGVuOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBJTkZUTF9mb2xkY2hhaW4oaW5mdGw9JXAsdGhpc1ZVQz0lZCwiCi0JCSJwZW5kaW5nPSVkKVxuIiwgaW5mdGwsIHRoaXNWVUMsIHBlbmRpbmdibG9jayk7CisJcHJfZGVidWcoIklORlRMOiBJTkZUTF9mb2xkY2hhaW4oaW5mdGw9JXAsdGhpc1ZVQz0lZCxwZW5kaW5nPSVkKVxuIiwKKwkJCWluZnRsLCB0aGlzVlVDLCBwZW5kaW5nYmxvY2spOwogCiAJbWVtc2V0KEJsb2NrTWFwLCAweGZmLCBzaXplb2YoQmxvY2tNYXApKTsKIAltZW1zZXQoQmxvY2tEZWxldGVkLCAwLCBzaXplb2YoQmxvY2tEZWxldGVkKSk7CkBAIC0zMjMsOCArMzIxLDcgQEAKIAkgKiBDaGFpbiwgYW5kIHRoZSBFcmFzZSBVbml0IGludG8gd2hpY2ggd2UgYXJlIHN1cHBvc2VkIHRvIGJlIGNvcHlpbmcuCiAJICogR28gZm9yIGl0LgogCSAqLwotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJJTkZUTDogZm9sZGluZyBjaGFpbiAlZCBpbnRvIHVuaXQgJWRcbiIsCi0JCXRoaXNWVUMsIHRhcmdldEVVTik7CisJcHJfZGVidWcoIklORlRMOiBmb2xkaW5nIGNoYWluICVkIGludG8gdW5pdCAlZFxuIiwgdGhpc1ZVQywgdGFyZ2V0RVVOKTsKIAogCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IGluZnRsLT5FcmFzZVNpemUvU0VDVE9SU0laRSA7IGJsb2NrKyspIHsKIAkJdW5zaWduZWQgY2hhciBtb3ZlYnVmW1NFQ1RPUlNJWkVdOwpAQCAtMzQ5LDE0ICszNDYsMTMgQEAKIAkJcmV0ID0gbXRkLT5yZWFkKG10ZCwgKGluZnRsLT5FcmFzZVNpemUgKiBCbG9ja01hcFtibG9ja10pICsKIAkJCQkoYmxvY2sgKiBTRUNUT1JTSVpFKSwgU0VDVE9SU0laRSwgJnJldGxlbiwKIAkJCQltb3ZlYnVmKTsKLQkJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FVUNMRUFOKSB7CisJCWlmIChyZXQgPCAwICYmICFtdGRfaXNfYml0ZmxpcChyZXQpKSB7CiAJCQlyZXQgPSBtdGQtPnJlYWQobXRkLAogCQkJCQkoaW5mdGwtPkVyYXNlU2l6ZSAqIEJsb2NrTWFwW2Jsb2NrXSkgKwogCQkJCQkoYmxvY2sgKiBTRUNUT1JTSVpFKSwgU0VDVE9SU0laRSwKIAkJCQkJJnJldGxlbiwgbW92ZWJ1Zik7CiAJCQlpZiAocmV0ICE9IC1FSU8pCi0JCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIklORlRMOiBlcnJvciB3ZW50ICIKLQkJCQkgICAgICAiYXdheSBvbiByZXRyeT9cbiIpOworCQkJCXByX2RlYnVnKCJJTkZUTDogZXJyb3Igd2VudCBhd2F5IG9uIHJldHJ5P1xuIik7CiAJCX0KIAkJbWVtc2V0KCZvb2IsIDB4ZmYsIHNpemVvZihzdHJ1Y3QgaW5mdGxfb29iKSk7CiAJCW9vYi5iLlN0YXR1cyA9IG9vYi5iLlN0YXR1czEgPSBTRUNUT1JfVVNFRDsKQEAgLTM3Miw4ICszNjgsNyBAQAogCSAqIGlzIGltcG9ydGFudCwgYnkgZG9pbmcgb2xkZXN0IGZpcnN0IGlmIHdlIGNyYXNoL3JlYm9vdCB0aGVuIGl0CiAJICogaXQgaXMgcmVsYXRpdmVseSBzaW1wbGUgdG8gY2xlYW4gdXAgdGhlIG1lc3MpLgogCSAqLwotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJJTkZUTDogd2FudCB0byBlcmFzZSB2aXJ0dWFsIGNoYWluICVkXG4iLAotCQl0aGlzVlVDKTsKKwlwcl9kZWJ1ZygiSU5GVEw6IHdhbnQgdG8gZXJhc2UgdmlydHVhbCBjaGFpbiAlZFxuIiwgdGhpc1ZVQyk7CiAKIAlmb3IgKDs7KSB7CiAJCS8qIEZpbmQgb2xkZXN0IHVuaXQgaW4gY2hhaW4uICovCkBAIC00MjEsNyArNDE2LDcgQEAKIAl1MTYgQ2hhaW5MZW5ndGggPSAwLCB0aGlzbGVuOwogCXUxNiBjaGFpbiwgRVVOOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBJTkZUTF9tYWtlZnJlZWJsb2NrKGluZnRsPSVwLCIKKwlwcl9kZWJ1ZygiSU5GVEw6IElORlRMX21ha2VmcmVlYmxvY2soaW5mdGw9JXAsIgogCQkicGVuZGluZz0lZClcbiIsIGluZnRsLCBwZW5kaW5nYmxvY2spOwogCiAJZm9yIChjaGFpbiA9IDA7IGNoYWluIDwgaW5mdGwtPm5iX2Jsb2NrczsgY2hhaW4rKykgewpAQCAtNDg0LDggKzQ3OSw4IEBACiAJc2l6ZV90IHJldGxlbjsKIAlpbnQgc2lsbHksIHNpbGx5MiA9IDM7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiSU5GVEw6IElORlRMX2ZpbmR3cml0ZXVuaXQoaW5mdGw9JXAsIgotCQkiYmxvY2s9JWQpXG4iLCBpbmZ0bCwgYmxvY2spOworCXByX2RlYnVnKCJJTkZUTDogSU5GVExfZmluZHdyaXRldW5pdChpbmZ0bD0lcCxibG9jaz0lZClcbiIsCisJCQlpbmZ0bCwgYmxvY2spOwogCiAJZG8gewogCQkvKgpAQCAtNTAxLDggKzQ5Niw4IEBACiAJCQkJICAgICAgIGJsb2Nrb2ZzLCA4LCAmcmV0bGVuLCAoY2hhciAqKSZiY2kpOwogCiAJCQlzdGF0dXMgPSBiY2kuU3RhdHVzIHwgYmNpLlN0YXR1czE7Ci0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiSU5GVEw6IHN0YXR1cyBvZiBibG9jayAlZCBpbiAiCi0JCQkJIkVVTiAlZCBpcyAleFxuIiwgYmxvY2sgLCB3cml0ZUVVTiwgc3RhdHVzKTsKKwkJCXByX2RlYnVnKCJJTkZUTDogc3RhdHVzIG9mIGJsb2NrICVkIGluIEVVTiAlZCBpcyAleFxuIiwKKwkJCQkJYmxvY2sgLCB3cml0ZUVVTiwgc3RhdHVzKTsKIAogCQkJc3dpdGNoKHN0YXR1cykgewogCQkJY2FzZSBTRUNUT1JfRlJFRToKQEAgLTU1NSw5ICs1NTAsOSBAQAogCQkJICogSG9wZWZ1bGx5IHdlIGZyZWUgc29tZXRoaW5nLCBsZXRzIHRyeSBhZ2Fpbi4KIAkJCSAqIFRoaXMgdGltZSB3ZSBhcmUgZGVzcGVyYXRlLi4uCiAJCQkgKi8KLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJJTkZUTDogdXNpbmcgZGVzcGVyYXRlPT0xICIKLQkJCQkidG8gZmluZCBmcmVlIEVVTiB0byBhY2NvbW1vZGF0ZSB3cml0ZSB0byAiCi0JCQkJIlZVQyAlZFxuIiwgdGhpc1ZVQyk7CisJCQlwcl9kZWJ1ZygiSU5GVEw6IHVzaW5nIGRlc3BlcmF0ZT09MSB0byBmaW5kIGZyZWUgRVVOICIKKwkJCQkJInRvIGFjY29tbW9kYXRlIHdyaXRlIHRvIFZVQyAlZFxuIiwKKwkJCQkJdGhpc1ZVQyk7CiAJCQl3cml0ZUVVTiA9IElORlRMX2ZpbmRmcmVlYmxvY2soaW5mdGwsIDEpOwogCQkJaWYgKHdyaXRlRVVOID09IEJMT0NLX05JTCkgewogCQkJCS8qCkBAIC02NDcsNyArNjQyLDcgQEAKIAlzdHJ1Y3QgaW5mdGxfYmNpIGJjaTsKIAlzaXplX3QgcmV0bGVuOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBJTkZUTF90cnlkZWxldGVjaGFpbihpbmZ0bD0lcCwiCisJcHJfZGVidWcoIklORlRMOiBJTkZUTF90cnlkZWxldGVjaGFpbihpbmZ0bD0lcCwiCiAJCSJ0aGlzVlVDPSVkKVxuIiwgaW5mdGwsIHRoaXNWVUMpOwogCiAJbWVtc2V0KEJsb2NrVXNlZCwgMCwgc2l6ZW9mKEJsb2NrVXNlZCkpOwpAQCAtNzExLDcgKzcwNiw3IEBACiAJICogRm9yIGVhY2ggYmxvY2sgaW4gdGhlIGNoYWluIGZyZWUgaXQgYW5kIG1ha2UgaXQgYXZhaWxhYmxlCiAJICogZm9yIGZ1dHVyZSB1c2UuIEVyYXNlIGZyb20gdGhlIG9sZGVzdCB1bml0IGZpcnN0LgogCSAqLwotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJJTkZUTDogZGVsZXRpbmcgZW1wdHkgVlVDICVkXG4iLCB0aGlzVlVDKTsKKwlwcl9kZWJ1ZygiSU5GVEw6IGRlbGV0aW5nIGVtcHR5IFZVQyAlZFxuIiwgdGhpc1ZVQyk7CiAKIAlmb3IgKDs7KSB7CiAJCXUxNiAqcHJldkVVTiA9ICZpbmZ0bC0+VlV0YWJsZVt0aGlzVlVDXTsKQEAgLTcxOSw3ICs3MTQsNyBAQAogCiAJCS8qIElmIHRoZSBjaGFpbiBpcyBhbGwgZ29uZSBhbHJlYWR5LCB3ZSdyZSBkb25lICovCiAJCWlmICh0aGlzRVVOID09IEJMT0NLX05JTCkgewotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIklORlRMOiBFbXB0eSBWVUMgJWQgZm9yIGRlbGV0aW9uIHdhcyBhbHJlYWR5IGFic2VudFxuIiwgdGhpc0VVTik7CisJCQlwcl9kZWJ1ZygiSU5GVEw6IEVtcHR5IFZVQyAlZCBmb3IgZGVsZXRpb24gd2FzIGFscmVhZHkgYWJzZW50XG4iLCB0aGlzRVVOKTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC03MzEsNyArNzI2LDcgQEAKIAkJCXRoaXNFVU4gPSAqcHJldkVVTjsKIAkJfQogCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJEZWxldGluZyBFVU4gJWQgZnJvbSBWVUMgJWRcbiIsCisJCXByX2RlYnVnKCJEZWxldGluZyBFVU4gJWQgZnJvbSBWVUMgJWRcbiIsCiAJCSAgICAgIHRoaXNFVU4sIHRoaXNWVUMpOwogCiAJCWlmIChJTkZUTF9mb3JtYXRibG9jayhpbmZ0bCwgdGhpc0VVTikgPCAwKSB7CkBAIC03NjcsNyArNzYyLDcgQEAKIAlzaXplX3QgcmV0bGVuOwogCXN0cnVjdCBpbmZ0bF9iY2kgYmNpOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBJTkZUTF9kZWxldGVibG9jayhpbmZ0bD0lcCwiCisJcHJfZGVidWcoIklORlRMOiBJTkZUTF9kZWxldGVibG9jayhpbmZ0bD0lcCwiCiAJCSJibG9jaz0lZClcbiIsIGluZnRsLCBibG9jayk7CiAKIAl3aGlsZSAodGhpc0VVTiA8IGluZnRsLT5uYl9ibG9ja3MpIHsKQEAgLTgyNiw3ICs4MjEsNyBAQAogCXN0cnVjdCBpbmZ0bF9vb2Igb29iOwogCWNoYXIgKnAsICpwZW5kOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBpbmZ0bF93cml0ZWJsb2NrKGluZnRsPSVwLGJsb2NrPSVsZCwiCisJcHJfZGVidWcoIklORlRMOiBpbmZ0bF93cml0ZWJsb2NrKGluZnRsPSVwLGJsb2NrPSVsZCwiCiAJCSJidWZmZXI9JXApXG4iLCBpbmZ0bCwgYmxvY2ssIGJ1ZmZlcik7CiAKIAkvKiBJcyBibG9jayBhbGwgemVybz8gKi8KQEAgLTg3Niw3ICs4NzEsNyBAQAogCXN0cnVjdCBpbmZ0bF9iY2kgYmNpOwogCXNpemVfdCByZXRsZW47CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiSU5GVEw6IGluZnRsX3JlYWRibG9jayhpbmZ0bD0lcCxibG9jaz0lbGQsIgorCXByX2RlYnVnKCJJTkZUTDogaW5mdGxfcmVhZGJsb2NrKGluZnRsPSVwLGJsb2NrPSVsZCwiCiAJCSJidWZmZXI9JXApXG4iLCBpbmZ0bCwgYmxvY2ssIGJ1ZmZlcik7CiAKIAl3aGlsZSAodGhpc0VVTiA8IGluZnRsLT5uYl9ibG9ja3MpIHsKQEAgLTkyMiw3ICs5MTcsNyBAQAogCQlpbnQgcmV0ID0gbXRkLT5yZWFkKG10ZCwgcHRyLCBTRUNUT1JTSVpFLCAmcmV0bGVuLCBidWZmZXIpOwogCiAJCS8qIEhhbmRsZSBjb3JyZWN0ZWQgYml0IGZsaXBzIGdyYWNlZnVsbHkgKi8KLQkJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FVUNMRUFOKQorCQlpZiAocmV0IDwgMCAmJiAhbXRkX2lzX2JpdGZsaXAocmV0KSkKIAkJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2luZnRsbW91bnQuYyBiL2RyaXZlcnMvbXRkL2luZnRsbW91bnQuYwppbmRleCAxMDQwNTJlLi4yZmY2MDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9pbmZ0bG1vdW50LmMKKysrIGIvZHJpdmVycy9tdGQvaW5mdGxtb3VudC5jCkBAIC01Myw3ICs1Myw3IEBACiAJc3RydWN0IElORlRMUGFydGl0aW9uICppcDsKIAlzaXplX3QgcmV0bGVuOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBmaW5kX2Jvb3RfcmVjb3JkKGluZnRsPSVwKVxuIiwgaW5mdGwpOworCXByX2RlYnVnKCJJTkZUTDogZmluZF9ib290X3JlY29yZChpbmZ0bD0lcClcbiIsIGluZnRsKTsKIAogICAgICAgICAvKgogCSAqIEFzc3VtZSBsb2dpY2FsIEVyYXNlU2l6ZSA9PSBwaHlzaWNhbCBlcmFzZXNpemUgZm9yIHN0YXJ0aW5nIHRoZQpAQCAtMTM5LDI0ICsxMzksMjAgQEAKIAkJbWgtPkZvcm1hdEZsYWdzID0gbGUzMl90b19jcHUobWgtPkZvcm1hdEZsYWdzKTsKIAkJbWgtPlBlcmNlbnRVc2VkID0gbGUzMl90b19jcHUobWgtPlBlcmNlbnRVc2VkKTsKIAotI2lmZGVmIENPTkZJR19NVERfREVCVUdfVkVSQk9TRQotCQlpZiAoQ09ORklHX01URF9ERUJVR19WRVJCT1NFID49IDIpIHsKLQkJCXByaW50aygiSU5GVEw6IE1lZGlhIEhlYWRlciAtPlxuIgotCQkJCSIgICAgYm9vdFJlY29yZElEICAgICAgICAgID0gJXNcbiIKLQkJCQkiICAgIE5vT2ZCb290SW1hZ2VCbG9ja3MgICA9ICVkXG4iCi0JCQkJIiAgICBOb09mQmluYXJ5UGFydGl0aW9ucyAgPSAlZFxuIgotCQkJCSIgICAgTm9PZkJEVExQYXJ0aXRpb25zICAgID0gJWRcbiIKLQkJCQkiICAgIEJsb2NrTXVsdGlwbGVyQml0cyAgICA9ICVkXG4iCi0JCQkJIiAgICBGb3JtYXRGbGdzICAgICAgICAgICAgPSAlZFxuIgotCQkJCSIgICAgT3Nha1ZlcnNpb24gICAgICAgICAgID0gMHgleFxuIgotCQkJCSIgICAgUGVyY2VudFVzZWQgICAgICAgICAgID0gJWRcbiIsCi0JCQkJbWgtPmJvb3RSZWNvcmRJRCwgbWgtPk5vT2ZCb290SW1hZ2VCbG9ja3MsCi0JCQkJbWgtPk5vT2ZCaW5hcnlQYXJ0aXRpb25zLAotCQkJCW1oLT5Ob09mQkRUTFBhcnRpdGlvbnMsCi0JCQkJbWgtPkJsb2NrTXVsdGlwbGllckJpdHMsIG1oLT5Gb3JtYXRGbGFncywKLQkJCQltaC0+T3Nha1ZlcnNpb24sIG1oLT5QZXJjZW50VXNlZCk7Ci0JCX0KLSNlbmRpZgorCQlwcl9kZWJ1ZygiSU5GVEw6IE1lZGlhIEhlYWRlciAtPlxuIgorCQkJICIgICAgYm9vdFJlY29yZElEICAgICAgICAgID0gJXNcbiIKKwkJCSAiICAgIE5vT2ZCb290SW1hZ2VCbG9ja3MgICA9ICVkXG4iCisJCQkgIiAgICBOb09mQmluYXJ5UGFydGl0aW9ucyAgPSAlZFxuIgorCQkJICIgICAgTm9PZkJEVExQYXJ0aXRpb25zICAgID0gJWRcbiIKKwkJCSAiICAgIEJsb2NrTXVsdGlwbGVyQml0cyAgICA9ICVkXG4iCisJCQkgIiAgICBGb3JtYXRGbGdzICAgICAgICAgICAgPSAlZFxuIgorCQkJICIgICAgT3Nha1ZlcnNpb24gICAgICAgICAgID0gMHgleFxuIgorCQkJICIgICAgUGVyY2VudFVzZWQgICAgICAgICAgID0gJWRcbiIsCisJCQkgbWgtPmJvb3RSZWNvcmRJRCwgbWgtPk5vT2ZCb290SW1hZ2VCbG9ja3MsCisJCQkgbWgtPk5vT2ZCaW5hcnlQYXJ0aXRpb25zLAorCQkJIG1oLT5Ob09mQkRUTFBhcnRpdGlvbnMsCisJCQkgbWgtPkJsb2NrTXVsdGlwbGllckJpdHMsIG1oLT5Gb3JtYXRGbGFncywKKwkJCSBtaC0+T3Nha1ZlcnNpb24sIG1oLT5QZXJjZW50VXNlZCk7CiAKIAkJaWYgKG1oLT5Ob09mQkRUTFBhcnRpdGlvbnMgPT0gMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSU5GVEw6IE1lZGlhIEhlYWRlciBzYW5pdHkgY2hlY2sgIgpAQCAtMjAwLDE5ICsxOTYsMTUgQEAKIAkJCWlwLT5zcGFyZVVuaXRzID0gbGUzMl90b19jcHUoaXAtPnNwYXJlVW5pdHMpOwogCQkJaXAtPlJlc2VydmVkMCA9IGxlMzJfdG9fY3B1KGlwLT5SZXNlcnZlZDApOwogCi0jaWZkZWYgQ09ORklHX01URF9ERUJVR19WRVJCT1NFCi0JCQlpZiAoQ09ORklHX01URF9ERUJVR19WRVJCT1NFID49IDIpIHsKLQkJCQlwcmludGsoIiAgICBQQVJUSVRJT05bJWRdIC0+XG4iCi0JCQkJCSIgICAgICAgIHZpcnR1YWxVbml0cyAgICA9ICVkXG4iCi0JCQkJCSIgICAgICAgIGZpcnN0VW5pdCAgICAgICA9ICVkXG4iCi0JCQkJCSIgICAgICAgIGxhc3RVbml0ICAgICAgICA9ICVkXG4iCi0JCQkJCSIgICAgICAgIGZsYWdzICAgICAgICAgICA9IDB4JXhcbiIKLQkJCQkJIiAgICAgICAgc3BhcmVVbml0cyAgICAgID0gJWRcbiIsCi0JCQkJCWksIGlwLT52aXJ0dWFsVW5pdHMsIGlwLT5maXJzdFVuaXQsCi0JCQkJCWlwLT5sYXN0VW5pdCwgaXAtPmZsYWdzLAotCQkJCQlpcC0+c3BhcmVVbml0cyk7Ci0JCQl9Ci0jZW5kaWYKKwkJCXByX2RlYnVnKCIgICAgUEFSVElUSU9OWyVkXSAtPlxuIgorCQkJCSAiICAgICAgICB2aXJ0dWFsVW5pdHMgICAgPSAlZFxuIgorCQkJCSAiICAgICAgICBmaXJzdFVuaXQgICAgICAgPSAlZFxuIgorCQkJCSAiICAgICAgICBsYXN0VW5pdCAgICAgICAgPSAlZFxuIgorCQkJCSAiICAgICAgICBmbGFncyAgICAgICAgICAgPSAweCV4XG4iCisJCQkJICIgICAgICAgIHNwYXJlVW5pdHMgICAgICA9ICVkXG4iLAorCQkJCSBpLCBpcC0+dmlydHVhbFVuaXRzLCBpcC0+Zmlyc3RVbml0LAorCQkJCSBpcC0+bGFzdFVuaXQsIGlwLT5mbGFncywKKwkJCQkgaXAtPnNwYXJlVW5pdHMpOwogCiAJCQlpZiAoaXAtPlJlc2VydmVkMCAhPSBpcC0+Zmlyc3RVbml0KSB7CiAJCQkJc3RydWN0IGVyYXNlX2luZm8gKmluc3RyID0gJmluZnRsLT5pbnN0cjsKQEAgLTM3NSw3ICszNjcsNyBAQAogICoKICAqIFJldHVybjogMCB3aGVuIHN1Y2NlZWQsIC0xIG9uIGVycm9yLgogICoKLSAqIFRvRG86IDEuIElzIGl0IG5lY2VyZXNzYXJ5IHRvIGNoZWNrX2ZyZWVfc2VjdG9yIGFmdGVyIGVyYXNpbmcgPz8KKyAqIFRvRG86IDEuIElzIGl0IG5lY2Vzc2FyeSB0byBjaGVja19mcmVlX3NlY3RvciBhZnRlciBlcmFzaW5nID8/CiAgKi8KIGludCBJTkZUTF9mb3JtYXRibG9jayhzdHJ1Y3QgSU5GVExyZWNvcmQgKmluZnRsLCBpbnQgYmxvY2spCiB7CkBAIC0zODUsOCArMzc3LDcgQEAKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGluZnRsLT5tYmQubXRkOwogCWludCBwaHlzYmxvY2s7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiSU5GVEw6IElORlRMX2Zvcm1hdGJsb2NrKGluZnRsPSVwLCIKLQkJImJsb2NrPSVkKVxuIiwgaW5mdGwsIGJsb2NrKTsKKwlwcl9kZWJ1ZygiSU5GVEw6IElORlRMX2Zvcm1hdGJsb2NrKGluZnRsPSVwLGJsb2NrPSVkKVxuIiwgaW5mdGwsIGJsb2NrKTsKIAogCW1lbXNldChpbnN0ciwgMCwgc2l6ZW9mKHN0cnVjdCBlcmFzZV9pbmZvKSk7CiAKQEAgLTQ3NiwzMCArNDY3LDMwIEBACiB7CiAJaW50IGk7CiAKLQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJcHJfZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAotCXByaW50aygiVlV0YWJsZVslZF0gLT4iLCBzLT5uYl9ibG9ja3MpOworCXByX2RlYnVnKCJWVXRhYmxlWyVkXSAtPiIsIHMtPm5iX2Jsb2Nrcyk7CiAJZm9yIChpID0gMDsgaSA8IHMtPm5iX2Jsb2NrczsgaSsrKSB7CiAJCWlmICgoaSAlIDgpID09IDApCi0JCQlwcmludGsoIlxuJTA0eDogIiwgaSk7Ci0JCXByaW50aygiJTA0eCAiLCBzLT5WVXRhYmxlW2ldKTsKKwkJCXByX2RlYnVnKCJcbiUwNHg6ICIsIGkpOworCQlwcl9kZWJ1ZygiJTA0eCAiLCBzLT5WVXRhYmxlW2ldKTsKIAl9CiAKLQlwcmludGsoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlwcl9kZWJ1ZygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKLQlwcmludGsoIlBVdGFibGVbJWQtJWQ9JWRdIC0+Iiwgcy0+Zmlyc3RFVU4sIHMtPmxhc3RFVU4sIHMtPm5iX2Jsb2Nrcyk7CisJcHJfZGVidWcoIlBVdGFibGVbJWQtJWQ9JWRdIC0+Iiwgcy0+Zmlyc3RFVU4sIHMtPmxhc3RFVU4sIHMtPm5iX2Jsb2Nrcyk7CiAJZm9yIChpID0gMDsgaSA8PSBzLT5sYXN0RVVOOyBpKyspIHsKIAkJaWYgKChpICUgOCkgPT0gMCkKLQkJCXByaW50aygiXG4lMDR4OiAiLCBpKTsKLQkJcHJpbnRrKCIlMDR4ICIsIHMtPlBVdGFibGVbaV0pOworCQkJcHJfZGVidWcoIlxuJTA0eDogIiwgaSk7CisJCXByX2RlYnVnKCIlMDR4ICIsIHMtPlBVdGFibGVbaV0pOwogCX0KIAotCXByaW50aygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCXByX2RlYnVnKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAotCXByaW50aygiSU5GVEwgLT5cbiIKKwlwcl9kZWJ1ZygiSU5GVEwgLT5cbiIKIAkJIiAgRXJhc2VTaXplICAgICAgID0gJWRcbiIKIAkJIiAgaC9zL2MgICAgICAgICAgID0gJWQvJWQvJWRcbiIKIAkJIiAgbnVtdnVuaXRzICAgICAgID0gJWRcbiIKQEAgLTUxMyw3ICs1MDQsNyBAQAogCQlzLT5udW12dW5pdHMsIHMtPmZpcnN0RVVOLCBzLT5sYXN0RVVOLCBzLT5udW1mcmVlRVVOcywKIAkJcy0+TGFzdEZyZWVFVU4sIHMtPm5iX2Jsb2Nrcywgcy0+bmJfYm9vdF9ibG9ja3MpOwogCi0JcHJpbnRrKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJcHJfZGVidWcoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKIAkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogfQogCkBAIC01MjEsMjUgKzUxMiwyNSBAQAogewogCWludCBsb2dpY2FsLCBibG9jaywgaTsKIAotCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlwcl9kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKIAkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCi0JcHJpbnRrKCJJTkZUTCBWaXJ0dWFsIFVuaXQgQ2hhaW5zOlxuIik7CisJcHJfZGVidWcoIklORlRMIFZpcnR1YWwgVW5pdCBDaGFpbnM6XG4iKTsKIAlmb3IgKGxvZ2ljYWwgPSAwOyBsb2dpY2FsIDwgcy0+bmJfYmxvY2tzOyBsb2dpY2FsKyspIHsKIAkJYmxvY2sgPSBzLT5WVXRhYmxlW2xvZ2ljYWxdOwogCQlpZiAoYmxvY2sgPiBzLT5uYl9ibG9ja3MpCiAJCQljb250aW51ZTsKLQkJcHJpbnRrKCIgIExPR0lDQUwgJWQgLS0+ICVkICIsIGxvZ2ljYWwsIGJsb2NrKTsKKwkJcHJfZGVidWcoIiAgTE9HSUNBTCAlZCAtLT4gJWQgIiwgbG9naWNhbCwgYmxvY2spOwogCQlmb3IgKGkgPSAwOyBpIDwgcy0+bmJfYmxvY2tzOyBpKyspIHsKIAkJCWlmIChzLT5QVXRhYmxlW2Jsb2NrXSA9PSBCTE9DS19OSUwpCiAJCQkJYnJlYWs7CiAJCQlibG9jayA9IHMtPlBVdGFibGVbYmxvY2tdOwotCQkJcHJpbnRrKCIlZCAiLCBibG9jayk7CisJCQlwcl9kZWJ1ZygiJWQgIiwgYmxvY2spOwogCQl9Ci0JCXByaW50aygiXG4iKTsKKwkJcHJfZGVidWcoIlxuIik7CiAJfQogCi0JcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCXByX2RlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiB9CiAKQEAgLTU1NSw3ICs1NDYsNyBAQAogCWludCBpOwogCXU4ICpBTkFDdGFibGUsIEFOQUM7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiSU5GVEw6IElORlRMX21vdW50KGluZnRsPSVwKVxuIiwgcyk7CisJcHJfZGVidWcoIklORlRMOiBJTkZUTF9tb3VudChpbmZ0bD0lcClcbiIsIHMpOwogCiAJLyogU2VhcmNoIGZvciBJTkZUTCBNZWRpYUhlYWRlciBhbmQgU3BhcmUgSU5GVEwgTWVkaWEgSGVhZGVyICovCiAJaWYgKGZpbmRfYm9vdF9yZWNvcmQocykgPCAwKSB7CkBAIC01ODUsNyArNTc2LDcgQEAKIAkgKiBOT1RFWFBMT1JFRCBzdGF0ZS4gVGhlbiBhdCB0aGUgZW5kIHdlIHdpbGwgdHJ5IHRvIGZvcm1hdCBpdCBhbmQKIAkgKiBtYXJrIGl0IGFzIGZyZWUuCiAJICovCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBwYXNzIDEsIGV4cGxvcmUgZWFjaCB1bml0XG4iKTsKKwlwcl9kZWJ1ZygiSU5GVEw6IHBhc3MgMSwgZXhwbG9yZSBlYWNoIHVuaXRcbiIpOwogCWZvciAoZmlyc3RfYmxvY2sgPSBzLT5maXJzdEVVTjsgZmlyc3RfYmxvY2sgPD0gcy0+bGFzdEVVTjsgZmlyc3RfYmxvY2srKykgewogCQlpZiAocy0+UFV0YWJsZVtmaXJzdF9ibG9ja10gIT0gQkxPQ0tfTk9URVhQTE9SRUQpCiAJCQljb250aW51ZTsKQEAgLTcxNywxNyArNzA4LDE0IEBACiAJCWxvZ2ljYWxfYmxvY2sgPSBCTE9DS19OSUw7CiAJfQogCi0jaWZkZWYgQ09ORklHX01URF9ERUJVR19WRVJCT1NFCi0JaWYgKENPTkZJR19NVERfREVCVUdfVkVSQk9TRSA+PSAyKQotCQlJTkZUTF9kdW1wdGFibGVzKHMpOwotI2VuZGlmCisJSU5GVExfZHVtcHRhYmxlcyhzKTsKIAogCS8qCiAJICogU2Vjb25kIHBhc3MsIGNoZWNrIGZvciBpbmZpbml0ZSBsb29wcyBpbiBjaGFpbnMuIFRoZXNlIGFyZQogCSAqIHBvc3NpYmxlIGJlY2F1c2Ugd2UgZG9uJ3QgdXBkYXRlIHRoZSBwcmV2aW91cyBwb2ludGVycyB3aGVuCiAJICogd2UgZm9sZCBjaGFpbnMuIE5vIGJpZyBkZWFsLCBqdXN0IGZpeCB0aGVtIHVwIGluIFBVdGFibGUuCiAJICovCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBwYXNzIDIsIHZhbGlkYXRlIHZpcnR1YWwgY2hhaW5zXG4iKTsKKwlwcl9kZWJ1ZygiSU5GVEw6IHBhc3MgMiwgdmFsaWRhdGUgdmlydHVhbCBjaGFpbnNcbiIpOwogCWZvciAobG9naWNhbF9ibG9jayA9IDA7IGxvZ2ljYWxfYmxvY2sgPCBzLT5udW12dW5pdHM7IGxvZ2ljYWxfYmxvY2srKykgewogCQlibG9jayA9IHMtPlZVdGFibGVbbG9naWNhbF9ibG9ja107CiAJCWxhc3RfYmxvY2sgPSBCTE9DS19OSUw7CkBAIC03NzIsMTIgKzc2MCw4IEBACiAJCX0KIAl9CiAKLSNpZmRlZiBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UKLQlpZiAoQ09ORklHX01URF9ERUJVR19WRVJCT1NFID49IDIpCi0JCUlORlRMX2R1bXB0YWJsZXMocyk7Ci0JaWYgKENPTkZJR19NVERfREVCVUdfVkVSQk9TRSA+PSAyKQotCQlJTkZUTF9kdW1wVlVjaGFpbnMocyk7Ci0jZW5kaWYKKwlJTkZUTF9kdW1wdGFibGVzKHMpOworCUlORlRMX2R1bXBWVWNoYWlucyhzKTsKIAogCS8qCiAJICogVGhpcmQgcGFzcywgZm9ybWF0IHVucmVmZXJlbmNlZCBibG9ja3MgYW5kIGluaXQgZnJlZSBibG9jayBjb3VudC4KQEAgLTc4NSw3ICs3NjksNyBAQAogCXMtPm51bWZyZWVFVU5zID0gMDsKIAlzLT5MYXN0RnJlZUVVTiA9IEJMT0NLX05JTDsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogcGFzcyAzLCBmb3JtYXQgdW51c2VkIGJsb2Nrc1xuIik7CisJcHJfZGVidWcoIklORlRMOiBwYXNzIDMsIGZvcm1hdCB1bnVzZWQgYmxvY2tzXG4iKTsKIAlmb3IgKGJsb2NrID0gcy0+Zmlyc3RFVU47IGJsb2NrIDw9IHMtPmxhc3RFVU47IGJsb2NrKyspIHsKIAkJaWYgKHMtPlBVdGFibGVbYmxvY2tdID09IEJMT0NLX05PVEVYUExPUkVEKSB7CiAJCQlwcmludGsoIklORlRMOiB1bnJlZmVyZW5jZWQgYmxvY2sgJWQsIGZvcm1hdHRpbmcgaXRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9scGRkci9scGRkcl9jbWRzLmMgYi9kcml2ZXJzL210ZC9scGRkci9scGRkcl9jbWRzLmMKaW5kZXggNjU2NTVkZC4uMWRjYTMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbHBkZHIvbHBkZHJfY21kcy5jCisrKyBiL2RyaXZlcnMvbXRkL2xwZGRyL2xwZGRyX2NtZHMuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9wZm93Lmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3FpbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgaW50IGxwZGRyX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBhZHIsIHNpemVfdCBsZW4sCiAJCQkJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKaW5kZXggYzBjMzI4Yy4uOGUwYzRiZjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCkBAIC00MSw4ICs0MSw2IEBACiAJICBhcmUgbWFwcGVkIG9uIHlvdXIgcGFydGljdWxhciB0YXJnZXQgYm9hcmQuIFJlZmVyIHRvIHRoZQogCSAgbWVtb3J5IG1hcCB3aGljaCBzaG91bGQgaG9wZWZ1bGx5IGJlIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvcgogCSAgeW91ciBib2FyZC4KLQkgIElnbm9yZSB0aGlzIG9wdGlvbiBpZiB5b3UgdXNlIHJ1bi10aW1lIHBoeXNtYXAgY29uZmlndXJhdGlvbgotCSAgKGkuZS4sIHJ1bi10aW1lIGNhbGxpbmcgcGh5c21hcF9jb25maWd1cmUoKSkuCiAKIGNvbmZpZyBNVERfUEhZU01BUF9MRU4KIAloZXggIlBoeXNpY2FsIGxlbmd0aCBvZiBmbGFzaCBtYXBwaW5nIgpAQCAtNTUsOCArNTMsNiBAQAogCSAgdGhhbiB0aGUgdG90YWwgYW1vdW50IG9mIGZsYXNoIHByZXNlbnQuIFJlZmVyIHRvIHRoZSBtZW1vcnkKIAkgIG1hcCB3aGljaCBzaG91bGQgaG9wZWZ1bGx5IGJlIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciB5b3VyCiAJICBib2FyZC4KLQkgIElnbm9yZSB0aGlzIG9wdGlvbiBpZiB5b3UgdXNlIHJ1bi10aW1lIHBoeXNtYXAgY29uZmlndXJhdGlvbgotCSAgKGkuZS4sIHJ1bi10aW1lIGNhbGxpbmcgcGh5c21hcF9jb25maWd1cmUoKSkuCiAKIGNvbmZpZyBNVERfUEhZU01BUF9CQU5LV0lEVEgKIAlpbnQgIkJhbmsgd2lkdGggaW4gb2N0ZXRzIgpAQCAtNjcsOCArNjMsNiBAQAogCSAgaW4gb2N0ZXRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBkYXRhIGJ1cyB3aWR0aCBvZiAzMgogCSAgYml0cywgeW91IHdvdWxkIHNldCB0aGUgYnVzIHdpZHRoIG9jdGV0IHZhbHVlIHRvIDQuIFRoaXMgaXMKIAkgIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQ0ZJIGRyaXZlcnMuCi0JICBJZ25vcmUgdGhpcyBvcHRpb24gaWYgeW91IHVzZSBydW4tdGltZSBwaHlzbWFwIGNvbmZpZ3VyYXRpb24KLQkgIChpLmUuLCBydW4tdGltZSBjYWxsaW5nIHBoeXNtYXBfY29uZmlndXJlKCkpLgogCiBjb25maWcgTVREX1BIWVNNQVBfT0YKIAl0cmlzdGF0ZSAiRmxhc2ggZGV2aWNlIGluIHBoeXNpY2FsIG1lbW9yeSBtYXAgYmFzZWQgb24gT0YgZGVzY3JpcHRpb24iCkBAIC0yNjAsNyArMjU0LDYgQEAKIGNvbmZpZyBNVERfTEFOVElRCiAJdHJpc3RhdGUgIkxhbnRpcSBTb0MgTk9SIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBMQU5USVEKLQlzZWxlY3QgTVREX1BBUlRJVElPTlMKIAloZWxwCiAJICBTdXBwb3J0IGZvciBOT1IgZmxhc2ggYXR0YWNoZWQgdG8gdGhlIExhbnRpcSBTb0MncyBFeHRlcm5hbCBCdXMgVW5pdC4KIApAQCAtMzM5LDEwICszMzIsNiBAQAogCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgZmxhc2ggY2hpcHMgb24gdGhlIEhpdGFjaGkgU29sdXRpb25FbmdpbmUgYW5kCiAJICBzaW1pbGFyIGJvYXJkcy4gU2F5ICdZJyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBzdWNoIGEgYm9hcmQuCiAKLWNvbmZpZyBNVERfQVJNX0lOVEVHUkFUT1IKLQl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZSBtYXBwZWQgb24gQVJNIEludGVncmF0b3IvUDcyMFQiCi0JZGVwZW5kcyBvbiBBUk0gJiYgTVREX0NGSQotCiBjb25maWcgTVREX0NEQjg5NzEyCiAJdHJpc3RhdGUgIkNpcnJ1cyBDREI4OTcxMiBldmFsdWF0aW9uIGJvYXJkIG1hcHBpbmdzIgogCWRlcGVuZHMgb24gTVREX0NGSSAmJiBBUkNIX0NEQjg5NzEyCkBAIC0zOTgsMTMgKzM4Nyw2IEBACiAJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBOVi1SQU0gb24gYXV0cm9uaXggYXV0Y3B1MTIgYm9hcmQuCiAJICBJZiB5b3UgaGF2ZSBzdWNoIGEgYm9hcmQsIHNheSAnWScuCiAKLWNvbmZpZyBNVERfRURCNzMxMgotCXRyaXN0YXRlICJDRkkgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiBFREI3MzEyIgotCWRlcGVuZHMgb24gQVJDSF9FREI3MzEyICYmIE1URF9DRkkKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBDRkkgRmxhc2ggb24gdGhlIENvZ2VudCBFREI3MzEyIGJvYXJkLgotCSAgSWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLCBzYXkgJ1knIGhlcmUuCi0KIGNvbmZpZyBNVERfSU1QQTcKIAl0cmlzdGF0ZSAiSkVERUMgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiBpbXBBNyIKIAlkZXBlbmRzIG9uIEFSTSAmJiBNVERfSkVERUNQUk9CRQpAQCAtNDEyLDE0ICszOTQsNiBAQAogCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgTk9SIEZsYXNoIG9uIHRoZSBpbXBBNyBib2FyZCBvZgogCSAgaW1wbGVtZW50YSBHbWJILiBJZiB5b3UgaGF2ZSBzdWNoIGEgYm9hcmQsIHNheSAnWScgaGVyZS4KIAotY29uZmlnIE1URF9DRUlWQQotCXRyaXN0YXRlICJKRURFQyBGbGFzaCBkZXZpY2UgbWFwcGVkIG9uIENlaXZhL1BvbGFyb2lkIFBob3RvTWF4IERpZ2l0YWwgUGljdHVyZSBGcmFtZSIKLQlkZXBlbmRzIG9uIE1URF9KRURFQ1BST0JFICYmIEFSQ0hfQ0VJVkEKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBmbGFzaCBjaGlwcyBvbiB0aGUgQ2VpdmEvUG9sYXJvaWQKLQkgIFBob3RvTWF4IERpZ2l0YWwgUGljdHVyZSBGcmFtZS4KLQkgIElmIHlvdSBoYXZlIHN1Y2ggYSBkZXZpY2UsIHNheSAnWScuCi0KIGNvbmZpZyBNVERfSDcyMFgKIAl0cmlzdGF0ZSAiSHluaXggZXZhbHVhdGlvbiBib2FyZCBtYXBwaW5ncyIKIAlkZXBlbmRzIG9uIE1URF9DRkkgJiYgKCBBUkNIX0g3MjAxIHx8IEFSQ0hfSDcyMDIgKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKaW5kZXggY2I0OGIxMS4uNDVkY2I4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCkBAIC0xOSw3ICsxOSw2IEBACiBvYmotJChDT05GSUdfTVREX1RTVU5BTUkpCSs9IHRzdW5hbWlfZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9QWEEyWFgpCSs9IHB4YTJ4eC1mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX01CWDg2MCkJKz0gbWJ4ODYwLm8KLW9iai0kKENPTkZJR19NVERfQ0VJVkEpCQkrPSBjZWl2YS5vCiBvYmotJChDT05GSUdfTVREX09DVEFHT04pCSs9IG9jdGFnb24tNTA2Ni5vCiBvYmotJChDT05GSUdfTVREX1BIWVNNQVApCSs9IHBoeXNtYXAubwogb2JqLSQoQ09ORklHX01URF9QSFlTTUFQX09GKQkrPSBwaHlzbWFwX29mLm8KQEAgLTQwLDcgKzM5LDYgQEAKIG9iai0kKENPTkZJR19NVERfU09MVVRJT05FTkdJTkUpKz0gc29sdXRpb25lbmdpbmUubwogb2JqLSQoQ09ORklHX01URF9QQ0kpCQkrPSBwY2kubwogb2JqLSQoQ09ORklHX01URF9BVVRDUFUxMikJKz0gYXV0Y3B1MTItbnZyYW0ubwotb2JqLSQoQ09ORklHX01URF9FREI3MzEyKQkrPSBlZGI3MzEyLm8KIG9iai0kKENPTkZJR19NVERfSU1QQTcpCQkrPSBpbXBhNy5vCiBvYmotJChDT05GSUdfTVREX0ZPUlRVTkVUKQkrPSBmb3J0dW5ldC5vCiBvYmotJChDT05GSUdfTVREX1VDTElOVVgpCSs9IHVjbGludXgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9iY205NjN4eC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9iY205NjN4eC1mbGFzaC5jCmluZGV4IDYwODk2N2YuLjczNmNhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvYmNtOTYzeHgtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2JjbTk2M3h4LWZsYXNoLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvYmZpbi1hc3luYy1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9iZmluLWFzeW5jLWZsYXNoLmMKaW5kZXggNjc4MTVlZS4uNmQ2YjJiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9iZmluLWFzeW5jLWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9iZmluLWFzeW5jLWZsYXNoLmMKQEAgLTQxLDcgKzQxLDYgQEAKIAl1aW50MzJfdCBmbGFzaF9hbWJjdGwwLCBmbGFzaF9hbWJjdGwxOwogCXVpbnQzMl90IHNhdmVfYW1iY3RsMCwgc2F2ZV9hbWJjdGwxOwogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKIH07CiAKIHN0YXRpYyB2b2lkIHN3aXRjaF90b19mbGFzaChzdHJ1Y3QgYXN5bmNfc3RhdGUgKnN0YXRlKQpAQCAtMTY1LDE4ICsxNjQsOCBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCXJldCA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKHN0YXRlLT5tdGQsIHBhcnRfcHJvYmVfdHlwZXMsICZwZGF0YS0+cGFydHMsIDApOwotCWlmIChyZXQgPiAwKSB7Ci0JCXByX2RldmluaXQoS0VSTl9OT1RJQ0UgRFJJVkVSX05BTUUgIjogVXNpbmcgY29tbWFuZGxpbmUgcGFydGl0aW9uIGRlZmluaXRpb25cbiIpOwotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKHN0YXRlLT5tdGQsIHBkYXRhLT5wYXJ0cywgcmV0KTsKLQkJc3RhdGUtPnBhcnRzID0gcGRhdGEtPnBhcnRzOwotCX0gZWxzZSBpZiAocGRhdGEtPm5yX3BhcnRzKSB7Ci0JCXByX2RldmluaXQoS0VSTl9OT1RJQ0UgRFJJVkVSX05BTUUgIjogVXNpbmcgYm9hcmQgcGFydGl0aW9uIGRlZmluaXRpb25cbiIpOwotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKHN0YXRlLT5tdGQsIHBkYXRhLT5wYXJ0cywgcGRhdGEtPm5yX3BhcnRzKTsKLQl9IGVsc2UgewotCQlwcl9kZXZpbml0KEtFUk5fTk9USUNFIERSSVZFUl9OQU1FICI6IG5vIHBhcnRpdGlvbiBpbmZvIGF2YWlsYWJsZSwgcmVnaXN0ZXJpbmcgd2hvbGUgZmxhc2ggYXQgb25jZVxuIik7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoc3RhdGUtPm10ZCwgTlVMTCwgMCk7Ci0JfQorCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoc3RhdGUtPm10ZCwgcGFydF9wcm9iZV90eXBlcywgMCwKKwkJCXBkYXRhLT5wYXJ0cywgcGRhdGEtPm5yX3BhcnRzKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHN0YXRlKTsKIApAQCAtMTg4LDcgKzE3Nyw2IEBACiAJc3RydWN0IGFzeW5jX3N0YXRlICpzdGF0ZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCWdwaW9fZnJlZShzdGF0ZS0+ZW5ldF9mbGFzaF9waW4pOwogCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihzdGF0ZS0+bXRkKTsKLQlrZnJlZShzdGF0ZS0+cGFydHMpOwogCW1hcF9kZXN0cm95KHN0YXRlLT5tdGQpOwogCWtmcmVlKHN0YXRlKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvY2VpdmEuYyBiL2RyaXZlcnMvbXRkL21hcHMvY2VpdmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmOWM5OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2NlaXZhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyoKLSAqIENlaXZhIGZsYXNoIG1lbW9yeSBkcml2ZXIuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9iIFNjb3R0IDxyc2NvdHRAbXRyb2IuZmRucy5uZXQ+Ci0gKgotICogTm90ZTogdGhpcyBkcml2ZXIgc3VwcG9ydHMgamVkZWMgY29tcGF0aWJsZSBkZXZpY2VzLiBNb2RpZmljYXRpb24KLSAqIGZvciBDRkkgY29tcGF0aWJsZSBkZXZpY2VzIHNob3VsZCBiZSBzdHJhaWdodCBmb3J3YXJkOiBjaGFuZ2UKLSAqIGplZGVjX3Byb2JlIHRvIGNmaV9wcm9iZS4KLSAqCi0gKiBCYXNlZCBvbjogc2ExMTAwLWZsYXNoLmMsIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIGNvcHlyaWdodDoKLSAqIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gU0ExMXgwIGJhc2VkIGRldmljZXMKLSAqCi0gKiAoQykgMjAwMCBOaWNvbGFzIFBpdHJlIDxuaWNvQGZsdXhuaWMubmV0PgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9jb25jYXQuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotCi0vKgotICogVGhpcyBpc24ndCBjb21wbGV0ZSB5ZXQsIHNvLi4uCi0gKi8KLSNkZWZpbmUgQ09ORklHX01URF9DRUlWQV9TVEFUSUNNQVAKLQotI2lmZGVmIENPTkZJR19NVERfQ0VJVkFfU1RBVElDTUFQCi0vKgotICogU2VlIGluY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaCBmb3IgZGVmaW5pdGlvbiBvZiB0aGUgbXRkX3BhcnRpdGlvbgotICogc3RydWN0dXJlLgotICoKLSAqIFBsZWFzZSBub3RlOgotICogIDEuIFRoZSBmbGFzaCBzaXplIGdpdmVuIHNob3VsZCBiZSB0aGUgbGFyZ2VzdCBmbGFzaCBzaXplIHRoYXQgY2FuCi0gKiAgICAgYmUgYWNjb21tb2RhdGVkLgotICoKLSAqICAyLiBUaGUgYnVzIHdpZHRoIG11c3QgZGVmaW5lZCBpbiBjbHBzX3NldHVwX2ZsYXNoLgotICoKLSAqIFRoZSBNVEQgbGF5ZXIgd2lsbCBkZXRlY3QgZmxhc2ggY2hpcCBhbGlhc2luZyBhbmQgcmVkdWNlIHRoZSBzaXplIG9mCi0gKiB0aGUgbWFwIGFjY29yZGluZ2x5LgotICoKLSAqLwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfQ0VJVkEKLS8qIEZsYXNoIC8gUGFydGl0aW9uIHNpemluZyAqLwotLyogRm9yIHRoZSAyOEY4MDAzLCB3ZSB1c2UgdGhlIGJsb2NrIG1hcHBpbmcgdG8gY2FsY3VhdGUgdGhlIHNpemVzICovCi0jZGVmaW5lIE1BWF9TSVpFX0tpQiAgICAgICAgICAgICAgICAgICgxNiArIDggKyA4ICsgOTYgKyAoNyoxMjgpKQotI2RlZmluZSBCT09UX1BBUlRJVElPTl9TSVpFX0tpQiAgICAgICAoMTYpCi0jZGVmaW5lIFBBUkFNU19QQVJUSVRJT05fU0laRV9LaUIgICAgICg4KQotI2RlZmluZSBLRVJORUxfUEFSVElUSU9OX1NJWkVfS2lCICAgICAoNCoxMjgpCi0vKiBVc2UgYm90aCByZW1haW5pbmcgcG9ydGlvbiBvZiBmaXJzdCBmbGFzaCwgYW5kIGFsbCBvZiBzZWNvbmQgZmxhc2ggKi8KLSNkZWZpbmUgUk9PVF9QQVJUSVRJT05fU0laRV9LaUIgICAgICAgKDMqMTI4KSArICg4KjEyOCkKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGNlaXZhX3BhcnRpdGlvbnNbXSA9IHsKLQl7Ci0JCS5uYW1lID0gIkNlaXZhIEJPT1QgcGFydGl0aW9uIiwKLQkJLnNpemUgICA9IEJPT1RfUEFSVElUSU9OX1NJWkVfS2lCKjEwMjQsCi0JCS5vZmZzZXQgPSAwLAotCi0JfSx7Ci0JCS5uYW1lID0gIkNlaXZhIHBhcmFtZXRlcnMgcGFydGl0aW9uIiwKLQkJLnNpemUgICA9IFBBUkFNU19QQVJUSVRJT05fU0laRV9LaUIqMTAyNCwKLQkJLm9mZnNldCA9ICgxNiArIDgpICogMTAyNCwKLQl9LHsKLQkJLm5hbWUgPSAiQ2VpdmEga2VybmVsIHBhcnRpdGlvbiIsCi0JCS5zaXplID0gKEtFUk5FTF9QQVJUSVRJT05fU0laRV9LaUIpKjEwMjQsCi0JCS5vZmZzZXQgPSAweDIwMDAwLAotCi0JfSx7Ci0JCS5uYW1lID0gIkNlaXZhIHJvb3QgZmlsZXN5c3RlbSBwYXJ0aXRpb24iLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotCQkuc2l6ZSA9IChST09UX1BBUlRJVElPTl9TSVpFX0tpQikqMTAyNCwKLQl9Ci19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IGNscHNfc3RhdGljX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwYXJ0cykKLXsKLQlpbnQgbmJfcGFydHMgPSAwOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfQ0VJVkEKLQlpZiAobWFjaGluZV9pc19jZWl2YSgpKSB7Ci0JCSpwYXJ0cyAgICAgICA9IGNlaXZhX3BhcnRpdGlvbnM7Ci0JCW5iX3BhcnRzICAgICA9IEFSUkFZX1NJWkUoY2VpdmFfcGFydGl0aW9ucyk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIG5iX3BhcnRzOwotfQotI2VuZGlmCi0KLXN0cnVjdCBjbHBzX2luZm8gewotCXVuc2lnbmVkIGxvbmcgYmFzZTsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JaW50IHdpZHRoOwotCXZvaWQgKnZiYXNlOwotCXN0cnVjdCBtYXBfaW5mbyAqbWFwOwotCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotfTsKLQotI2RlZmluZSBOUl9TVUJNVEQgNAotCi1zdGF0aWMgc3RydWN0IGNscHNfaW5mbyBpbmZvW05SX1NVQk1URF07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNscHNfc2V0dXBfbXRkKHN0cnVjdCBjbHBzX2luZm8gKmNscHMsIGludCBuciwgc3RydWN0IG10ZF9pbmZvICoqcm10ZCkKLXsKLQlzdHJ1Y3QgbXRkX2luZm8gKnN1YmRldltucl07Ci0Jc3RydWN0IG1hcF9pbmZvICptYXBzOwotCWludCBpLCBmb3VuZCA9IDAsIHJldCA9IDA7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIHRoZSBtYXBfaW5mbyBzdHJ1Y3RzIGluIG9uZSBnby4KLQkgKi8KLQltYXBzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1hcF9pbmZvKSAqIG5yLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1hcHMpCi0JCXJldHVybiAtRU5PTUVNOwotCS8qCi0JICogQ2xhaW0gYW5kIHRoZW4gbWFwIHRoZSBtZW1vcnkgcmVnaW9ucy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgewotCQlpZiAoY2xwc1tpXS5iYXNlID09ICh1bnNpZ25lZCBsb25nKS0xKQotCQkJYnJlYWs7Ci0KLQkJY2xwc1tpXS5yZXMgPSByZXF1ZXN0X21lbV9yZWdpb24oY2xwc1tpXS5iYXNlLCBjbHBzW2ldLnNpemUsICJjbHBzIGZsYXNoIik7Ci0JCWlmICghY2xwc1tpXS5yZXMpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2xwc1tpXS5tYXAgPSBtYXBzICsgaTsKLQotCQljbHBzW2ldLm1hcC0+bmFtZSA9ICJjbHBzIGZsYXNoIjsKLQkJY2xwc1tpXS5tYXAtPnBoeXMgPSBjbHBzW2ldLmJhc2U7Ci0KLQkJY2xwc1tpXS52YmFzZSA9IGlvcmVtYXAoY2xwc1tpXS5iYXNlLCBjbHBzW2ldLnNpemUpOwotCQlpZiAoIWNscHNbaV0udmJhc2UpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCi0JCWNscHNbaV0ubWFwLT52aXJ0ID0gKHZvaWQgX19pb21lbSAqKWNscHNbaV0udmJhc2U7Ci0JCWNscHNbaV0ubWFwLT5iYW5rd2lkdGggPSBjbHBzW2ldLndpZHRoOwotCQljbHBzW2ldLm1hcC0+c2l6ZSA9IGNscHNbaV0uc2l6ZTsKLQotCQlzaW1wbGVfbWFwX2luaXQoJmNscHNbaV0ubWFwKTsKLQotCQljbHBzW2ldLm10ZCA9IGRvX21hcF9wcm9iZSgiamVkZWNfcHJvYmUiLCBjbHBzW2ldLm1hcCk7Ci0JCWlmIChjbHBzW2ldLm10ZCA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5YSU87Ci0JCQlicmVhazsKLQkJfQotCQljbHBzW2ldLm10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkJc3ViZGV2W2ldID0gY2xwc1tpXS5tdGQ7Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiY2xwcyBmbGFzaDogSkVERUMgZGV2aWNlIGF0IDB4JTA4bHgsICVkTWlCLCAiCi0JCQkiJWQtYml0XG4iLCBjbHBzW2ldLmJhc2UsIGNscHNbaV0ubXRkLT5zaXplID4+IDIwLAotCQkJY2xwc1tpXS53aWR0aCAqIDgpOwotCQlmb3VuZCArPSAxOwotCX0KLQotCS8qCi0JICogRU5YSU8gaXMgc3BlY2lhbC4gIEl0IG1lYW5zIHdlIGRpZG4ndCBmaW5kIGEgY2hpcCB3aGVuCi0JICogd2UgcHJvYmVkLiAgV2UgbmVlZCB0byB0ZWFyIGRvd24gdGhlIG1hcHBpbmcsIGZyZWUgdGhlCi0JICogcmVzb3VyY2UgYW5kIG1hcmsgaXQgYXMgc3VjaC4KLQkgKi8KLQlpZiAocmV0ID09IC1FTlhJTykgewotCQlpb3VubWFwKGNscHNbaV0udmJhc2UpOwotCQljbHBzW2ldLnZiYXNlID0gTlVMTDsKLQkJcmVsZWFzZV9yZXNvdXJjZShjbHBzW2ldLnJlcyk7Ci0JCWNscHNbaV0ucmVzID0gTlVMTDsKLQl9Ci0KLQkvKgotCSAqIElmIHdlIGZvdW5kIG9uZSBkZXZpY2UsIGRvbid0IGJvdGhlciB3aXRoIGNvbmNhdCBzdXBwb3J0LgotCSAqIElmIHdlIGZvdW5kIG11bHRpcGxlIGRldmljZXMsIHVzZSBjb25jYXQgaWYgd2UgaGF2ZSBpdAotCSAqIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhaWwuCi0JICovCi0JaWYgKHJldCA9PSAwIHx8IHJldCA9PSAtRU5YSU8pIHsKLQkJaWYgKGZvdW5kID09IDEpIHsKLQkJCSpybXRkID0gc3ViZGV2WzBdOwotCQkJcmV0ID0gMDsKLQkJfSBlbHNlIGlmIChmb3VuZCA+IDEpIHsKLQkJCS8qCi0JCQkgKiBXZSBkZXRlY3RlZCBtdWx0aXBsZSBkZXZpY2VzLiAgQ29uY2F0ZW5hdGUKLQkJCSAqIHRoZW0gdG9nZXRoZXIuCi0JCQkgKi8KLQkJCSpybXRkID0gbXRkX2NvbmNhdF9jcmVhdGUoc3ViZGV2LCBmb3VuZCwKLQkJCQkJCSAgImNscHMgZmxhc2giKTsKLQkJCWlmICgqcm10ZCA9PSBOVUxMKQotCQkJCXJldCA9IC1FTlhJTzsKLQkJfQotCX0KLQotCS8qCi0JICogSWYgd2UgZmFpbGVkLCBjbGVhbiB1cC4KLQkgKi8KLQlpZiAocmV0KSB7Ci0JCWRvIHsKLQkJCWlmIChjbHBzW2ldLm10ZCkKLQkJCQltYXBfZGVzdHJveShjbHBzW2ldLm10ZCk7Ci0JCQlpZiAoY2xwc1tpXS52YmFzZSkKLQkJCQlpb3VubWFwKGNscHNbaV0udmJhc2UpOwotCQkJaWYgKGNscHNbaV0ucmVzKQotCQkJCXJlbGVhc2VfcmVzb3VyY2UoY2xwc1tpXS5yZXMpOwotCQl9IHdoaWxlIChpLS0pOwotCi0JCWtmcmVlKG1hcHMpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbHBzX2Rlc3Ryb3lfbXRkKHN0cnVjdCBjbHBzX2luZm8gKmNscHMsIHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotCWludCBpOwotCi0JbXRkX2RldmljZV91bnJlZ2lzdGVyKG10ZCk7Ci0KLQlpZiAobXRkICE9IGNscHNbMF0ubXRkKQotCQltdGRfY29uY2F0X2Rlc3Ryb3kobXRkKTsKLQotCWZvciAoaSA9IE5SX1NVQk1URDsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKGNscHNbaV0ubXRkKQotCQkJbWFwX2Rlc3Ryb3koY2xwc1tpXS5tdGQpOwotCQlpZiAoY2xwc1tpXS52YmFzZSkKLQkJCWlvdW5tYXAoY2xwc1tpXS52YmFzZSk7Ci0JCWlmIChjbHBzW2ldLnJlcykKLQkJCXJlbGVhc2VfcmVzb3VyY2UoY2xwc1tpXS5yZXMpOwotCX0KLQlrZnJlZShjbHBzWzBdLm1hcCk7Ci19Ci0KLS8qCi0gKiBXZSBkZWZpbmUgdGhlIG1lbW9yeSBzcGFjZSwgc2l6ZSwgYW5kIHdpZHRoIGZvciB0aGUgZmxhc2ggbWVtb3J5Ci0gKiBzcGFjZSBoZXJlLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGNscHNfc2V0dXBfZmxhc2godm9pZCkKLXsKLQlpbnQgbnIgPSAwOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfQ0VJVkEKLQlpZiAobWFjaGluZV9pc19jZWl2YSgpKSB7Ci0JCWluZm9bMF0uYmFzZSA9IENTMF9QSFlTX0JBU0U7Ci0JCWluZm9bMF0uc2l6ZSA9IFNaXzMyTTsKLQkJaW5mb1swXS53aWR0aCA9IENFSVZBX0ZMQVNIX1dJRFRIOwotCQlpbmZvWzFdLmJhc2UgPSBDUzFfUEhZU19CQVNFOwotCQlpbmZvWzFdLnNpemUgPSBTWl8zMk07Ci0JCWluZm9bMV0ud2lkdGggPSBDRUlWQV9GTEFTSF9XSURUSDsKLQkJbnIgPSAyOwotCX0KLSNlbmRpZgotCXJldHVybiBucjsKLX0KLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJzZWRfcGFydHM7Ci1zdGF0aWMgY29uc3QgY2hhciAqcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsICJSZWRCb290IiwgTlVMTCB9OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgY2xwc19sb2NhdGVfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsKLQljb25zdCBjaGFyICpwYXJ0X3R5cGUgPSBOVUxMOwotCWludCBucl9wYXJ0cyA9IDA7Ci0JZG8gewotCQkvKgotCQkgKiBQYXJ0aXRpb24gc2VsZWN0aW9uIHN0dWZmLgotCQkgKi8KLQkJbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhtdGQsIHByb2JlcywgJnBhcnNlZF9wYXJ0cywgMCk7Ci0JCWlmIChucl9wYXJ0cyA+IDApIHsKLQkJCXBhcnRfdHlwZSA9ICJjb21tYW5kIGxpbmUiOwotCQkJYnJlYWs7Ci0JCX0KLSNpZmRlZiBDT05GSUdfTVREX0NFSVZBX1NUQVRJQ01BUAotCQlucl9wYXJ0cyA9IGNscHNfc3RhdGljX3BhcnRpdGlvbnMoJnBhcnNlZF9wYXJ0cyk7Ci0JCWlmIChucl9wYXJ0cyA+IDApIHsKLQkJCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJpbnRrKCJmb3VuZDogJWQgcGFydGl0aW9uc1xuIiwgbnJfcGFydHMpOwotI2VuZGlmCi0JfSB3aGlsZSAoMCk7Ci0KLQlpZiAobnJfcGFydHMgPT0gMCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgImNscHMgZmxhc2g6IG5vIHBhcnRpdGlvbiBpbmZvICIKLQkJCSJhdmFpbGFibGUsIHJlZ2lzdGVyaW5nIHdob2xlIGZsYXNoXG4iKTsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIE5VTEwsIDApOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiY2xwcyBmbGFzaDogdXNpbmcgJXMgcGFydGl0aW9uICIKLQkJCSJkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOwotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgcGFyc2VkX3BhcnRzLCBucl9wYXJ0cyk7Ci0JfQotCi0JLyogQWx3YXlzIHN1Y2NlZWRzLiAqLwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xwc19kZXN0cm95X3BhcnRpdGlvbnModm9pZCkKLXsKLQlrZnJlZShwYXJzZWRfcGFydHMpOwotfQotCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKLQotc3RhdGljIGludCBfX2luaXQgY2xwc19tdGRfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0JaW50IG5yOwotCi0JbnIgPSBjbHBzX3NldHVwX2ZsYXNoKCk7Ci0JaWYgKG5yIDwgMCkKLQkJcmV0dXJuIG5yOwotCi0JcmV0ID0gY2xwc19zZXR1cF9tdGQoaW5mbywgbnIsICZteW10ZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWNscHNfbG9jYXRlX3BhcnRpdGlvbnMobXltdGQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbHBzX210ZF9jbGVhbnVwKHZvaWQpCi17Ci0JY2xwc19kZXN0cm95X210ZChpbmZvLCBteW10ZCk7Ci0JY2xwc19kZXN0cm95X3BhcnRpdGlvbnMoKTsKLX0KLQotbW9kdWxlX2luaXQoY2xwc19tdGRfaW5pdCk7Ci1tb2R1bGVfZXhpdChjbHBzX210ZF9jbGVhbnVwKTsKLQotTU9EVUxFX0FVVEhPUigiUm9iIFNjb3R0Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNpcnJ1cyBMb2dpYyBKRURFQyBtYXAgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2RjMjEyODUuYyBiL2RyaXZlcnMvbXRkL21hcHMvZGMyMTI4NS5jCmluZGV4IDdhOWUxOTguLmY0M2IzNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvZGMyMTI4NS5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvZGMyMTI4NS5jCkBAIC0xNDUsMTQgKzE0NSwxMCBAQAogCiAKIC8qIFBhcnRpdGlvbiBzdHVmZiAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpkYzIxMjg1X3BhcnRzOwogc3RhdGljIGNvbnN0IGNoYXIgKnByb2Jlc1tdID0geyAiUmVkQm9vdCIsICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9kYzIxMjg1KHZvaWQpCiB7Ci0KLQlpbnQgbnJwYXJ0czsKLQogCS8qIERldGVybWluZSBiYW5rd2lkdGggKi8KIAlzd2l0Y2ggKCpDU1JfU0ExMTBfQ05UTCAmICgzPDwxNCkpIHsKIAkJY2FzZSBTQTExMF9DTlRMX1JPTVdJRFRIXzg6CkBAIC0yMDAsOCArMTk2LDcgQEAKIAogCWRjMjEyODVfbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JbnJwYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGRjMjEyODVfbXRkLCBwcm9iZXMsICZkYzIxMjg1X3BhcnRzLCAwKTsKLQltdGRfZGV2aWNlX3JlZ2lzdGVyKGRjMjEyODVfbXRkLCBkYzIxMjg1X3BhcnRzLCBucnBhcnRzKTsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGRjMjEyODVfbXRkLCBwcm9iZXMsIDAsIE5VTEwsIDApOwogCiAJaWYobWFjaGluZV9pc19lYnNhMjg1KCkpIHsKIAkJLyoKQEAgLTIyNCw4ICsyMTksNiBAQAogc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfZGMyMTI4NSh2b2lkKQogewogCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihkYzIxMjg1X210ZCk7Ci0JaWYgKGRjMjEyODVfcGFydHMpCi0JCWtmcmVlKGRjMjEyODVfcGFydHMpOwogCW1hcF9kZXN0cm95KGRjMjEyODVfbXRkKTsKIAlpb3VubWFwKGRjMjEyODVfbWFwLnZpcnQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9lZGI3MzEyLmMgYi9kcml2ZXJzL210ZC9tYXBzL2VkYjczMTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0MmEyMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2VkYjczMTIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogSGFuZGxlIG1hcHBpbmcgb2YgdGhlIE5PUiBmbGFzaCBvbiBDb2dlbnQgRURCNzMxMiBib2FyZHMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwMiBTWVNHTyBSZWFsLVRpbWUgU29sdXRpb25zIEdtYkgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNkZWZpbmUgV0lORE9XX0FERFIgMHgwMDAwMDAwMCAgICAgIC8qIHBoeXNpY2FsIHByb3BlcnRpZXMgb2YgZmxhc2ggKi8KLSNkZWZpbmUgV0lORE9XX1NJWkUgMHgwMTAwMDAwMAotI2RlZmluZSBCVVNXSURUSCAgICAyCi0jZGVmaW5lIEZMQVNIX0JMT0NLU0laRV9NQUlOCTB4MjAwMDAKLSNkZWZpbmUgRkxBU0hfTlVNQkxPQ0tTX01BSU4JMTI4Ci0vKiBjYW4gYmUgImNmaV9wcm9iZSIsICJqZWRlY19wcm9iZSIsICJtYXBfcm9tIiwgTlVMTCB9OyAqLwotI2RlZmluZSBQUk9CRVRZUEVTIHsgImNmaV9wcm9iZSIsIE5VTEwgfQotCi0jZGVmaW5lIE1TR19QUkVGSVggIkVEQjczMTItTk9SOiIgICAvKiBwcmVmaXggZm9yIG91ciBwcmludGsoKSdzICovCi0jZGVmaW5lIE1URElEICAgICAgImVkYjczMTItbm9yIiAgICAvKiBmb3IgbXRkcGFydHM9IHBhcnRpdGlvbmluZyAqLwotCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKLQotc3RydWN0IG1hcF9pbmZvIGVkYjczMTJub3JfbWFwID0gewotCS5uYW1lID0gIk5PUiBmbGFzaCBvbiBFREI3MzEyIiwKLQkuc2l6ZSA9IFdJTkRPV19TSVpFLAotCS5iYW5rd2lkdGggPSBCVVNXSURUSCwKLQkucGh5cyA9IFdJTkRPV19BRERSLAotfTsKLQotLyoKLSAqIE1URCBwYXJ0aXRpb25pbmcgc3R1ZmYKLSAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHN0YXRpY19wYXJ0aXRpb25zWzNdID0KLXsKLQl7Ci0JCS5uYW1lID0gIkFSTWJvb3QiLAotCQkuc2l6ZSA9IDB4NDAwMDAsCi0JCS5vZmZzZXQgPSAwCi0JfSwKLQl7Ci0JCS5uYW1lID0gIktlcm5lbCIsCi0JCS5zaXplID0gMHgyMDAwMDAsCi0JCS5vZmZzZXQgPSAweDQwMDAwCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlJvb3RGUyIsCi0JCS5zaXplID0gMHhEQzAwMDAsCi0JCS5vZmZzZXQgPSAweDI0MDAwMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqcHJvYmVzW10gPSB7ICJSZWRCb290IiwgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCi1zdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgIG10ZF9wYXJ0c19uYiA9IDA7Ci1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyAgICA9IDA7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfZWRiNzMxMm5vcih2b2lkKQotewotCXN0YXRpYyBjb25zdCBjaGFyICpyb21fcHJvYmVfdHlwZXNbXSA9IFBST0JFVFlQRVM7Ci0JY29uc3QgY2hhciAqKnR5cGU7Ci0JY29uc3QgY2hhciAqcGFydF90eXBlID0gMDsKLQotICAgICAgIAlwcmludGsoS0VSTl9OT1RJQ0UgTVNHX1BSRUZJWCAiMHglMDh4IGF0IDB4JTA4eFxuIiwKLQkgICAgICAgV0lORE9XX1NJWkUsIFdJTkRPV19BRERSKTsKLQllZGI3MzEybm9yX21hcC52aXJ0ID0gaW9yZW1hcChXSU5ET1dfQUREUiwgV0lORE9XX1NJWkUpOwotCi0JaWYgKCFlZGI3MzEybm9yX21hcC52aXJ0KSB7Ci0JCXByaW50ayhNU0dfUFJFRklYICJmYWlsZWQgdG8gaW9yZW1hcFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXNpbXBsZV9tYXBfaW5pdCgmZWRiNzMxMm5vcl9tYXApOwotCi0JbXltdGQgPSAwOwotCXR5cGUgPSByb21fcHJvYmVfdHlwZXM7Ci0JZm9yKDsgIW15bXRkICYmICp0eXBlOyB0eXBlKyspIHsKLQkJbXltdGQgPSBkb19tYXBfcHJvYmUoKnR5cGUsICZlZGI3MzEybm9yX21hcCk7Ci0JfQotCWlmIChteW10ZCkgewotCQlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCQltdGRfcGFydHNfbmIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhteW10ZCwgcHJvYmVzLCAmbXRkX3BhcnRzLCBNVERJRCk7Ci0JCWlmIChtdGRfcGFydHNfbmIgPiAwKQotCQkJcGFydF90eXBlID0gImRldGVjdGVkIjsKLQotCQlpZiAobXRkX3BhcnRzX25iID09IDApIHsKLQkJCW10ZF9wYXJ0cyA9IHN0YXRpY19wYXJ0aXRpb25zOwotCQkJbXRkX3BhcnRzX25iID0gQVJSQVlfU0laRShzdGF0aWNfcGFydGl0aW9ucyk7Ci0JCQlwYXJ0X3R5cGUgPSAic3RhdGljIjsKLQkJfQotCi0JCWlmIChtdGRfcGFydHNfbmIgPT0gMCkKLQkJCXByaW50ayhLRVJOX05PVElDRSBNU0dfUFJFRklYICJubyBwYXJ0aXRpb24gaW5mbyBhdmFpbGFibGVcbiIpOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgTVNHX1BSRUZJWAotCQkJICAgICAgICJ1c2luZyAlcyBwYXJ0aXRpb24gZGVmaW5pdGlvblxuIiwgcGFydF90eXBlKTsKLQkJLyogUmVnaXN0ZXIgdGhlIHdob2xlIGRldmljZSBmaXJzdC4gKi8KLQkJbXRkX2RldmljZV9yZWdpc3RlcihteW10ZCwgTlVMTCwgMCk7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXltdGQsIG10ZF9wYXJ0cywgbXRkX3BhcnRzX25iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaW91bm1hcCgodm9pZCAqKWVkYjczMTJub3JfbWFwLnZpcnQpOwotCXJldHVybiAtRU5YSU87Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2VkYjczMTJub3Iodm9pZCkKLXsKLQlpZiAobXltdGQpIHsKLQkJbXRkX2RldmljZV91bnJlZ2lzdGVyKG15bXRkKTsKLQkJbWFwX2Rlc3Ryb3kobXltdGQpOwotCX0KLQlpZiAoZWRiNzMxMm5vcl9tYXAudmlydCkgewotCQlpb3VubWFwKCh2b2lkICopZWRiNzMxMm5vcl9tYXAudmlydCk7Ci0JCWVkYjczMTJub3JfbWFwLnZpcnQgPSAwOwotCX0KLX0KLQotbW9kdWxlX2luaXQoaW5pdF9lZGI3MzEybm9yKTsKLW1vZHVsZV9leGl0KGNsZWFudXBfZWRiNzMxMm5vcik7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hcml1cyBHcm9lZ2VyIDxtYWdAc3lzZ28uZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgY29uZmlndXJhYmxlIE1URCBtYXAgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2dwaW8tYWRkci1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9ncGlvLWFkZHItZmxhc2guYwppbmRleCA3NTY4YzVmLi4xZWM2NmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2dwaW8tYWRkci1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvZ3Bpby1hZGRyLWZsYXNoLmMKQEAgLTE4Nyw3ICsxODcsNiBAQAogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX2ZsYXNoX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IG5yX3BhcnRzOwogCXNpemVfdCBpLCBhcnJfc2l6ZTsKIAlzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbW9yeTsKQEAgLTI1MiwyMCArMjUxLDkgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKHN0YXRlLT5tdGQsIHBhcnRfcHJvYmVfdHlwZXMsCi0JCQkJCSZwZGF0YS0+cGFydHMsIDApOwotCWlmIChucl9wYXJ0cyA+IDApIHsKLQkJcHJfZGV2aW5pdChLRVJOX05PVElDRSBQRlggIlVzaW5nIGNvbW1hbmRsaW5lIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iKTsKLQkJa2ZyZWUocGRhdGEtPnBhcnRzKTsKLQl9IGVsc2UgaWYgKHBkYXRhLT5ucl9wYXJ0cykgewotCQlwcl9kZXZpbml0KEtFUk5fTk9USUNFIFBGWCAiVXNpbmcgYm9hcmQgcGFydGl0aW9uIGRlZmluaXRpb25cbiIpOwotCQlucl9wYXJ0cyA9IHBkYXRhLT5ucl9wYXJ0czsKLQl9IGVsc2UgewotCQlwcl9kZXZpbml0KEtFUk5fTk9USUNFIFBGWCAibm8gcGFydGl0aW9uIGluZm8gYXZhaWxhYmxlLCByZWdpc3RlcmluZyB3aG9sZSBmbGFzaCBhdCBvbmNlXG4iKTsKLQkJbnJfcGFydHMgPSAwOwotCX0KIAotCW10ZF9kZXZpY2VfcmVnaXN0ZXIoc3RhdGUtPm10ZCwgcGRhdGEtPnBhcnRzLCBucl9wYXJ0cyk7CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihzdGF0ZS0+bXRkLCBwYXJ0X3Byb2JlX3R5cGVzLCAwLAorCQkJcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2g3MjB4LWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2g3MjB4LWZsYXNoLmMKaW5kZXggN2YwMzU4Ni4uNDljMTQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9oNzIweC1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaDcyMHgtZmxhc2guYwpAQCAtNTgsMTggKzU4LDExIEBACiAKICNkZWZpbmUgTlVNX1BBUlRJVElPTlMgQVJSQVlfU0laRShoNzIweF9wYXJ0aXRpb25zKQogCi1zdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgIG5yX210ZF9wYXJ0czsKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbXRkX3BhcnRzOwotc3RhdGljIGNvbnN0IGNoYXIgKnByb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0KIC8qCiAgKiBJbml0aWFsaXplIEZMQVNIIHN1cHBvcnQKICAqLwogc3RhdGljIGludCBfX2luaXQgaDcyMHhfbXRkX2luaXQodm9pZCkKIHsKLQotCWNoYXIJKnBhcnRfdHlwZSA9IE5VTEw7Ci0KIAloNzIweF9tYXAudmlydCA9IGlvcmVtYXAoaDcyMHhfbWFwLnBoeXMsIGg3MjB4X21hcC5zaXplKTsKIAogCWlmICghaDcyMHhfbWFwLnZpcnQpIHsKQEAgLTkyLDE2ICs4NSw4IEBACiAJaWYgKG15bXRkKSB7CiAJCW15bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JCW5yX210ZF9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG15bXRkLCBwcm9iZXMsICZtdGRfcGFydHMsIDApOwotCQlpZiAobnJfbXRkX3BhcnRzID4gMCkKLQkJCXBhcnRfdHlwZSA9ICJjb21tYW5kIGxpbmUiOwotCQlpZiAobnJfbXRkX3BhcnRzIDw9IDApIHsKLQkJCW10ZF9wYXJ0cyA9IGg3MjB4X3BhcnRpdGlvbnM7Ci0JCQlucl9tdGRfcGFydHMgPSBOVU1fUEFSVElUSU9OUzsKLQkJCXBhcnRfdHlwZSA9ICJidWlsdGluIjsKLQkJfQotCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyAlcyBwYXJ0aXRpb24gdGFibGVcbiIsIHBhcnRfdHlwZSk7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXltdGQsIG10ZF9wYXJ0cywgbnJfbXRkX3BhcnRzKTsKKwkJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihteW10ZCwgTlVMTCwgMCwKKwkJCQloNzIweF9wYXJ0aXRpb25zLCBOVU1fUEFSVElUSU9OUyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTIwLDEwICsxMDUsNiBAQAogCQltYXBfZGVzdHJveShteW10ZCk7CiAJfQogCi0JLyogRnJlZSBwYXJ0aXRpb24gaW5mbywgaWYgY29tbWFuZGxpbmUgcGFydGl0aW9uIHdhcyB1c2VkICovCi0JaWYgKG10ZF9wYXJ0cyAmJiAobXRkX3BhcnRzICE9IGg3MjB4X3BhcnRpdGlvbnMpKQotCQlrZnJlZSAobXRkX3BhcnRzKTsKLQogCWlmIChoNzIweF9tYXAudmlydCkgewogCQlpb3VubWFwKCh2b2lkICopaDcyMHhfbWFwLnZpcnQpOwogCQloNzIweF9tYXAudmlydCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2ltcGE3LmMgYi9kcml2ZXJzL210ZC9tYXBzL2ltcGE3LmMKaW5kZXggNDA0YTUwYy4uZjQ3YWVkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9pbXBhNy5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaW1wYTcuYwpAQCAtNDksNyArNDksNyBAQAogLyoKICAqIE1URCBwYXJ0aXRpb25pbmcgc3R1ZmYKICAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHN0YXRpY19wYXJ0aXRpb25zW10gPQorc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbnNbXSA9CiB7CiAJewogCQkubmFtZSA9ICJGaWxlU3lzdGVtIiwKQEAgLTU4LDE2ICs1OCwxMCBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IG10ZF9wYXJ0c19uYltOVU1fRkxBU0hCQU5LU107Ci1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0c1tOVU1fRkxBU0hCQU5LU107Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpwcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2ltcGE3KHZvaWQpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgKnJvbV9wcm9iZV90eXBlc1tdID0gUFJPQkVUWVBFUzsKIAljb25zdCBjaGFyICoqdHlwZTsKLQljb25zdCBjaGFyICpwYXJ0X3R5cGUgPSAwOwogCWludCBpOwogCXN0YXRpYyBzdHJ1Y3QgeyB1X2xvbmcgYWRkcjsgdV9sb25nIHNpemU7IH0gcHRbTlVNX0ZMQVNIQkFOS1NdID0gewogCSAgeyBXSU5ET1dfQUREUjAsIFdJTkRPV19TSVpFMCB9LApAQCAtOTcsMjMgKzkxLDkgQEAKIAkJaWYgKGltcGE3X210ZFtpXSkgewogCQkJaW1wYTdfbXRkW2ldLT5vd25lciA9IFRISVNfTU9EVUxFOwogCQkJZGV2aWNlc2ZvdW5kKys7Ci0JCQltdGRfcGFydHNfbmJbaV0gPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbXBhN19tdGRbaV0sCi0JCQkJCQkJICAgICAgIHByb2JlcywKLQkJCQkJCQkgICAgICAgJm10ZF9wYXJ0c1tpXSwKLQkJCQkJCQkgICAgICAgMCk7Ci0JCQlpZiAobXRkX3BhcnRzX25iW2ldID4gMCkgewotCQkJCXBhcnRfdHlwZSA9ICJjb21tYW5kIGxpbmUiOwotCQkJfSBlbHNlIHsKLQkJCQltdGRfcGFydHNbaV0gPSBzdGF0aWNfcGFydGl0aW9uczsKLQkJCQltdGRfcGFydHNfbmJbaV0gPSBBUlJBWV9TSVpFKHN0YXRpY19wYXJ0aXRpb25zKTsKLQkJCQlwYXJ0X3R5cGUgPSAic3RhdGljIjsKLQkJCX0KLQotCQkJcHJpbnRrKEtFUk5fTk9USUNFIE1TR19QUkVGSVgKLQkJCSAgICAgICAidXNpbmcgJXMgcGFydGl0aW9uIGRlZmluaXRpb25cbiIsCi0JCQkgICAgICAgcGFydF90eXBlKTsKLQkJCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW1wYTdfbXRkW2ldLAotCQkJCQkgICAgbXRkX3BhcnRzW2ldLCBtdGRfcGFydHNfbmJbaV0pOworCQkJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihpbXBhN19tdGRbaV0sIE5VTEwsIDAsCisJCQkJCQkgIHBhcnRpdGlvbnMsCisJCQkJCQkgIEFSUkFZX1NJWkUocGFydGl0aW9ucykpOwogCQl9CiAJCWVsc2UKIAkJCWlvdW5tYXAoKHZvaWQgKilpbXBhN19tYXBbaV0udmlydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2ludGVsX3ZyX25vci5jIGIvZHJpdmVycy9tdGQvbWFwcy9pbnRlbF92cl9ub3IuYwppbmRleCBkMmY0N2JlLi4wOGMyMzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2ludGVsX3ZyX25vci5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaW50ZWxfdnJfbm9yLmMKQEAgLTQ0LDcgKzQ0LDYgQEAKIAl2b2lkIF9faW9tZW0gKmNzcl9iYXNlOwogCXN0cnVjdCBtYXBfaW5mbyBtYXA7CiAJc3RydWN0IG10ZF9pbmZvICppbmZvOwotCWludCBucl9wYXJ0czsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogfTsKIApAQCAtNzEsMTMgKzcwLDkgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgdnJfbm9yX2luaXRfcGFydGl0aW9ucyhzdHJ1Y3QgdnJfbm9yX210ZCAqcCkKIHsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogCS8qIHJlZ2lzdGVyIHRoZSBmbGFzaCBiYW5rICovCiAJLyogcGFydGl0aW9uIHRoZSBmbGFzaCBiYW5rICovCi0JcC0+bnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhwLT5pbmZvLCBwYXJ0X3Byb2JlcywgJnBhcnRzLCAwKTsKLQlyZXR1cm4gbXRkX2RldmljZV9yZWdpc3RlcihwLT5pbmZvLCBwYXJ0cywgcC0+bnJfcGFydHMpOworCXJldHVybiBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKHAtPmluZm8sIE5VTEwsIDAsIE5VTEwsIDApOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgdnJfbm9yX2Rlc3Ryb3lfbXRkX3NldHVwKHN0cnVjdCB2cl9ub3JfbXRkICpwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwppbmRleCAxNTk0YTgwLi40MzdmY2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYwpAQCAtMzgsNyArMzgsNiBAQAogc3RydWN0IGl4cDIwMDBfZmxhc2hfaW5mbyB7CiAJc3RydWN0CQltdGRfaW5mbyAqbXRkOwogCXN0cnVjdAkJbWFwX2luZm8gbWFwOwotCXN0cnVjdAkJbXRkX3BhcnRpdGlvbiAqcGFydGl0aW9uczsKIAlzdHJ1Y3QJCXJlc291cmNlICpyZXM7CiB9OwogCkBAIC0xMjUsOCArMTI0LDYgQEAKIAlpZiAoaW5mby0+bWFwLm1hcF9wcml2XzEpCiAJCWlvdW5tYXAoKHZvaWQgKikgaW5mby0+bWFwLm1hcF9wcml2XzEpOwogCi0Ja2ZyZWUoaW5mby0+cGFydGl0aW9ucyk7Ci0KIAlpZiAoaW5mby0+cmVzKSB7CiAJCXJlbGVhc2VfcmVzb3VyY2UoaW5mby0+cmVzKTsKIAkJa2ZyZWUoaW5mby0+cmVzKTsKQEAgLTIyOSwxMyArMjI2LDcgQEAKIAl9CiAJaW5mby0+bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBwcm9iZXMsICZpbmZvLT5wYXJ0aXRpb25zLCAwKTsKLQlpZiAoZXJyID4gMCkgewotCQllcnIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgaW5mby0+cGFydGl0aW9ucywgZXJyKTsKLQkJaWYoZXJyKQotCQkJZGV2X2VycigmZGV2LT5kZXYsICJDb3VsZCBub3QgcGFyc2UgcGFydGl0aW9uc1xuIik7Ci0JfQotCisJZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihpbmZvLT5tdGQsIHByb2JlcywgMCwgTlVMTCwgMCk7CiAJaWYgKGVycikKIAkJZ290byBFcnJvcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMKaW5kZXggMTU1YjIxOS4uMzA0MDkwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jCkBAIC0xNDUsNyArMTQ1LDYgQEAKIHN0cnVjdCBpeHA0eHhfZmxhc2hfaW5mbyB7CiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAJc3RydWN0IG1hcF9pbmZvIG1hcDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydGl0aW9uczsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIH07CiAKQEAgLTE2OCw4ICsxNjcsNiBAQAogCWlmIChpbmZvLT5tYXAudmlydCkKIAkJaW91bm1hcChpbmZvLT5tYXAudmlydCk7CiAKLQlrZnJlZShpbmZvLT5wYXJ0aXRpb25zKTsKLQogCWlmIChpbmZvLT5yZXMpIHsKIAkJcmVsZWFzZV9yZXNvdXJjZShpbmZvLT5yZXMpOwogCQlrZnJlZShpbmZvLT5yZXMpOwpAQCAtMTg1LDggKzE4Miw2IEBACiB7CiAJc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgKnBsYXQgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBpeHA0eHhfZmxhc2hfaW5mbyAqaW5mbzsKLQljb25zdCBjaGFyICpwYXJ0X3R5cGUgPSBOVUxMOwotCWludCBucl9wYXJ0cyA9IDA7CiAJaW50IGVyciA9IC0xOwogCiAJaWYgKCFwbGF0KQpAQCAtMjUyLDI4ICsyNDcsMTIgQEAKIAkvKiBVc2UgdGhlIGZhc3QgdmVyc2lvbiAqLwogCWluZm8tPm1hcC53cml0ZSA9IGl4cDR4eF93cml0ZTE2OwogCi0JbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHByb2JlcywgJmluZm8tPnBhcnRpdGlvbnMsCi0JCQkJCWRldi0+cmVzb3VyY2UtPnN0YXJ0KTsKLQlpZiAobnJfcGFydHMgPiAwKSB7Ci0JCXBhcnRfdHlwZSA9ICJkeW5hbWljIjsKLQl9IGVsc2UgewotCQlpbmZvLT5wYXJ0aXRpb25zID0gcGxhdC0+cGFydHM7Ci0JCW5yX3BhcnRzID0gcGxhdC0+bnJfcGFydHM7Ci0JCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwotCX0KLQlpZiAobnJfcGFydHMgPT0gMCkKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJJWFA0eHggZmxhc2g6IG5vIHBhcnRpdGlvbiBpbmZvICIKLQkJCSJhdmFpbGFibGUsIHJlZ2lzdGVyaW5nIHdob2xlIGZsYXNoXG4iKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX05PVElDRSAiSVhQNHh4IGZsYXNoOiB1c2luZyAlcyBwYXJ0aXRpb24gIgotCQkJImRlZmluaXRpb25cbiIsIHBhcnRfdHlwZSk7Ci0KLQllcnIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgaW5mby0+cGFydGl0aW9ucywgbnJfcGFydHMpOwotCWlmIChlcnIpCisJZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihpbmZvLT5tdGQsIHByb2JlcywgZGV2LT5yZXNvdXJjZS0+c3RhcnQsCisJCQlwbGF0LT5wYXJ0cywgcGxhdC0+bnJfcGFydHMpOworCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcGFyc2UgcGFydGl0aW9uc1xuIik7Ci0KLQlpZiAoZXJyKQogCQlnb3RvIEVycm9yOworCX0KIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2xhbnRpcS1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9sYW50aXEtZmxhc2guYwppbmRleCBhOTBjYWJkLi40ZjEwZTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2xhbnRpcS1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvbGFudGlxLWZsYXNoLmMKQEAgLTEwNywxNiArMTA3LDEyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWJ1X2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgY29uc3QgKnBhcnRfcHJvYmVfdHlwZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCiBzdGF0aWMgaW50IF9faW5pdAogbHRxX210ZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgKmx0cV9tdGRfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IGx0cV9tdGQgKmx0cV9tdGQ7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCBucl9wYXJ0cyA9IDA7CiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmk7CiAJaW50IGVycjsKIApAQCAtMTcyLDE3ICsxNjgsOCBAQAogCWNmaS0+YWRkcl91bmxvY2sxIF49IDE7CiAJY2ZpLT5hZGRyX3VubG9jazIgXj0gMTsKIAotCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobHRxX210ZC0+bXRkLAotCQkJCXBhcnRfcHJvYmVfdHlwZXMsICZwYXJ0cywgMCk7Ci0JaWYgKG5yX3BhcnRzID4gMCkgewotCQlkZXZfaW5mbygmcGRldi0+ZGV2LAotCQkJInVzaW5nICVkIHBhcnRpdGlvbnMgZnJvbSBjbWRsaW5lIiwgbnJfcGFydHMpOwotCX0gZWxzZSB7Ci0JCW5yX3BhcnRzID0gbHRxX210ZF9kYXRhLT5ucl9wYXJ0czsKLQkJcGFydHMgPSBsdHFfbXRkX2RhdGEtPnBhcnRzOwotCX0KLQotCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhsdHFfbXRkLT5tdGQsIHBhcnRzLCBucl9wYXJ0cyk7CisJZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihsdHFfbXRkLT5tdGQsIE5VTEwsIDAsCisJCQlsdHFfbXRkX2RhdGEtPnBhcnRzLCBsdHFfbXRkX2RhdGEtPm5yX3BhcnRzKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhZGQgcGFydGl0aW9uc1xuIik7CiAJCWdvdG8gZXJyX2Rlc3Ryb3k7CkBAIC0yMDgsNyArMTk1LDcgQEAKIAogCWlmIChsdHFfbXRkKSB7CiAJCWlmIChsdHFfbXRkLT5tdGQpIHsKLQkJCWRlbF9tdGRfcGFydGl0aW9ucyhsdHFfbXRkLT5tdGQpOworCQkJbXRkX2RldmljZV91bnJlZ2lzdGVyKGx0cV9tdGQtPm10ZCk7CiAJCQltYXBfZGVzdHJveShsdHFfbXRkLT5tdGQpOwogCQl9CiAJCWlmIChsdHFfbXRkLT5tYXAtPnZpcnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2xhdGNoLWFkZHItZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvbGF0Y2gtYWRkci1mbGFzaC5jCmluZGV4IDU5MzZjNDYuLjExOWJhYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvbGF0Y2gtYWRkci1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvbGF0Y2gtYWRkci1mbGFzaC5jCkBAIC0zMyw5ICszMyw2IEBACiAJLyogY2FjaGU7IGNvdWxkIGJlIGZvdW5kIG91dCBvZiByZXMgKi8KIAl1bnNpZ25lZCBsb25nCQl3aW5fbWFzazsKIAotCWludAkJCW5yX3BhcnRzOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKLQogCXNwaW5sb2NrX3QJCWxvY2s7CiB9OwogCkBAIC05Nyw4ICs5NCw2IEBACiAKIHN0YXRpYyBjaGFyICpyb21fcHJvYmVfdHlwZXNbXSA9IHsgImNmaV9wcm9iZSIsIE5VTEwgfTsKIAotc3RhdGljIGNoYXIgKnBhcnRfcHJvYmVfdHlwZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCiBzdGF0aWMgaW50IGxhdGNoX2FkZHJfZmxhc2hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGF0Y2hfYWRkcl9mbGFzaF9pbmZvICppbmZvOwpAQCAtMTEyLDggKzEwNyw2IEBACiAJbGF0Y2hfYWRkcl9kYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCWlmIChpbmZvLT5tdGQgIT0gTlVMTCkgewotCQlpZiAoaW5mby0+bnJfcGFydHMpCi0JCQlrZnJlZShpbmZvLT5wYXJ0cyk7CiAJCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihpbmZvLT5tdGQpOwogCQltYXBfZGVzdHJveShpbmZvLT5tdGQpOwogCX0KQEAgLTIwNiwyMSArMTk5LDggQEAKIAl9CiAJaW5mby0+bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCAoY29uc3QgY2hhciAqKilwYXJ0X3Byb2JlX3R5cGVzLAotCQkJCSAgICZpbmZvLT5wYXJ0cywgMCk7Ci0JaWYgKGVyciA+IDApIHsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIGluZm8tPnBhcnRzLCBlcnIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGxhdGNoX2FkZHJfZGF0YS0+bnJfcGFydHMpIHsKLQkJcHJfbm90aWNlKCJVc2luZyBsYXRjaC1hZGRyLWZsYXNoIHBhcnRpdGlvbiBpbmZvcm1hdGlvblxuIik7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLAotCQkJCSAgICBsYXRjaF9hZGRyX2RhdGEtPnBhcnRzLAotCQkJCSAgICBsYXRjaF9hZGRyX2RhdGEtPm5yX3BhcnRzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIE5VTEwsIDApOworCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBOVUxMLCAwLAorCQkJbGF0Y2hfYWRkcl9kYXRhLT5wYXJ0cywgbGF0Y2hfYWRkcl9kYXRhLT5ucl9wYXJ0cyk7CiAJcmV0dXJuIDA7CiAKIGlvdW5tYXA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jIGIvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYwppbmRleCBiYmUxNjhiLi5lOGU5ZmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMKQEAgLTIyLDIyICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KIAotI2lmZGVmIENPTkZJR19NVERfREVCVUcKLXN0YXRpYyBpbnQgZGVidWcgPSBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0U7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiU2V0IERlYnVnIExldmVsIDA9cXVpZXQsIDU9bm9pc3kiKTsKLSN1bmRlZiBERUJVRwotI2RlZmluZSBERUJVRyhuLCBmb3JtYXQsIGFyZy4uLikgXAotCWlmIChuIDw9IGRlYnVnKSB7CSBcCi0JCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6JXMoKTogIiBmb3JtYXQgIlxuIiwgX19mdW5jX18gLCAjIyBhcmcpOyBcCi0JfQotCi0jZWxzZQotI3VuZGVmIERFQlVHCi0jZGVmaW5lIERFQlVHKG4sIGFyZy4uLikKLXN0YXRpYyBjb25zdCBpbnQgZGVidWcgPSAwOwotI2VuZGlmCi0KICNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAicGNtY2lhbXRkOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQogCiAjZGVmaW5lIERSSVZFUl9ERVNDCSJQQ01DSUEgRmxhc2ggbWVtb3J5IGNhcmQgZHJpdmVyIgpAQCAtMTA1LDEzICs4OSwxMyBAQAogCWludCByZXQ7CiAKIAlpZiAoIXBjbWNpYV9kZXZfcHJlc2VudChkZXYtPnBfZGV2KSkgewotCQlERUJVRygxLCAiZGV2aWNlIHJlbW92ZWQiKTsKKwkJcHJfZGVidWcoImRldmljZSByZW1vdmVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJb2Zmc2V0ID0gdG8gJiB+KGRldi0+d2luX3NpemUtMSk7CiAJaWYgKG9mZnNldCAhPSBkZXYtPm9mZnNldCkgewotCQlERUJVRygyLCAiUmVtYXBwaW5nIHdpbmRvdyBmcm9tIDB4JTguOHggdG8gMHglOC44eCIsCisJCXByX2RlYnVnKCJSZW1hcHBpbmcgd2luZG93IGZyb20gMHglOC44eCB0byAweCU4Ljh4XG4iLAogCQkgICAgICBkZXYtPm9mZnNldCwgb2Zmc2V0KTsKIAkJcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShkZXYtPnBfZGV2LCB3aW4sIG9mZnNldCk7CiAJCWlmIChyZXQgIT0gMCkKQEAgLTEzMiw3ICsxMTYsNyBAQAogCQlyZXR1cm4gZDsKIAogCWQueFswXSA9IHJlYWRiKGFkZHIpOwotCURFQlVHKDMsICJvZnMgPSAweCUwOGx4ICglcCkgZGF0YSA9IDB4JTAybHgiLCBvZnMsIGFkZHIsIGQueFswXSk7CisJcHJfZGVidWcoIm9mcyA9IDB4JTA4bHggKCVwKSBkYXRhID0gMHglMDJseFxuIiwgb2ZzLCBhZGRyLCBkLnhbMF0pOwogCXJldHVybiBkOwogfQogCkBAIC0xNDcsNyArMTMxLDcgQEAKIAkJcmV0dXJuIGQ7CiAKIAlkLnhbMF0gPSByZWFkdyhhZGRyKTsKLQlERUJVRygzLCAib2ZzID0gMHglMDhseCAoJXApIGRhdGEgPSAweCUwNGx4Iiwgb2ZzLCBhZGRyLCBkLnhbMF0pOworCXByX2RlYnVnKCJvZnMgPSAweCUwOGx4ICglcCkgZGF0YSA9IDB4JTA0bHhcbiIsIG9mcywgYWRkciwgZC54WzBdKTsKIAlyZXR1cm4gZDsKIH0KIApAQCAtMTU3LDcgKzE0MSw3IEBACiAJc3RydWN0IHBjbWNpYW10ZF9kZXYgKmRldiA9IChzdHJ1Y3QgcGNtY2lhbXRkX2RldiAqKW1hcC0+bWFwX3ByaXZfMTsKIAl1bnNpZ25lZCBsb25nIHdpbl9zaXplID0gZGV2LT53aW5fc2l6ZTsKIAotCURFQlVHKDMsICJ0byA9ICVwIGZyb20gPSAlbHUgbGVuID0gJXpkIiwgdG8sIGZyb20sIGxlbik7CisJcHJfZGVidWcoInRvID0gJXAgZnJvbSA9ICVsdSBsZW4gPSAlemRcbiIsIHRvLCBmcm9tLCBsZW4pOwogCXdoaWxlKGxlbikgewogCQlpbnQgdG9yZWFkID0gd2luX3NpemUgLSAoZnJvbSAmICh3aW5fc2l6ZS0xKSk7CiAJCWNhZGRyX3QgYWRkcjsKQEAgLTE2OSw3ICsxNTMsNyBAQAogCQlpZighYWRkcikKIAkJCXJldHVybjsKIAotCQlERUJVRyg0LCAibWVtY3B5IGZyb20gJXAgdG8gJXAgbGVuID0gJWQiLCBhZGRyLCB0bywgdG9yZWFkKTsKKwkJcHJfZGVidWcoIm1lbWNweSBmcm9tICVwIHRvICVwIGxlbiA9ICVkXG4iLCBhZGRyLCB0bywgdG9yZWFkKTsKIAkJbWVtY3B5X2Zyb21pbyh0bywgYWRkciwgdG9yZWFkKTsKIAkJbGVuIC09IHRvcmVhZDsKIAkJdG8gKz0gdG9yZWFkOwpAQCAtMTg1LDcgKzE2OSw3IEBACiAJaWYoIWFkZHIpCiAJCXJldHVybjsKIAotCURFQlVHKDMsICJhZHIgPSAweCUwOGx4ICglcCkgIGRhdGEgPSAweCUwMmx4IiwgYWRyLCBhZGRyLCBkLnhbMF0pOworCXByX2RlYnVnKCJhZHIgPSAweCUwOGx4ICglcCkgIGRhdGEgPSAweCUwMmx4XG4iLCBhZHIsIGFkZHIsIGQueFswXSk7CiAJd3JpdGViKGQueFswXSwgYWRkcik7CiB9CiAKQEAgLTE5Niw3ICsxODAsNyBAQAogCWlmKCFhZGRyKQogCQlyZXR1cm47CiAKLQlERUJVRygzLCAiYWRyID0gMHglMDhseCAoJXApICBkYXRhID0gMHglMDRseCIsIGFkciwgYWRkciwgZC54WzBdKTsKKwlwcl9kZWJ1ZygiYWRyID0gMHglMDhseCAoJXApICBkYXRhID0gMHglMDRseFxuIiwgYWRyLCBhZGRyLCBkLnhbMF0pOwogCXdyaXRldyhkLnhbMF0sIGFkZHIpOwogfQogCkBAIC0yMDYsNyArMTkwLDcgQEAKIAlzdHJ1Y3QgcGNtY2lhbXRkX2RldiAqZGV2ID0gKHN0cnVjdCBwY21jaWFtdGRfZGV2ICopbWFwLT5tYXBfcHJpdl8xOwogCXVuc2lnbmVkIGxvbmcgd2luX3NpemUgPSBkZXYtPndpbl9zaXplOwogCi0JREVCVUcoMywgInRvID0gJWx1IGZyb20gPSAlcCBsZW4gPSAlemQiLCB0bywgZnJvbSwgbGVuKTsKKwlwcl9kZWJ1ZygidG8gPSAlbHUgZnJvbSA9ICVwIGxlbiA9ICV6ZFxuIiwgdG8sIGZyb20sIGxlbik7CiAJd2hpbGUobGVuKSB7CiAJCWludCB0b3dyaXRlID0gd2luX3NpemUgLSAodG8gJiAod2luX3NpemUtMSkpOwogCQljYWRkcl90IGFkZHI7CkBAIC0yMTgsNyArMjAyLDcgQEAKIAkJaWYoIWFkZHIpCiAJCQlyZXR1cm47CiAKLQkJREVCVUcoNCwgIm1lbWNweSBmcm9tICVwIHRvICVwIGxlbiA9ICVkIiwgZnJvbSwgYWRkciwgdG93cml0ZSk7CisJCXByX2RlYnVnKCJtZW1jcHkgZnJvbSAlcCB0byAlcCBsZW4gPSAlZFxuIiwgZnJvbSwgYWRkciwgdG93cml0ZSk7CiAJCW1lbWNweV90b2lvKGFkZHIsIGZyb20sIHRvd3JpdGUpOwogCQlsZW4gLT0gdG93cml0ZTsKIAkJdG8gKz0gdG93cml0ZTsKQEAgLTI0MCw3ICsyMjQsNyBAQAogCQlyZXR1cm4gZDsKIAogCWQueFswXSA9IHJlYWRiKHdpbl9iYXNlICsgb2ZzKTsKLQlERUJVRygzLCAib2ZzID0gMHglMDhseCAoJXApIGRhdGEgPSAweCUwMmx4IiwKKwlwcl9kZWJ1Zygib2ZzID0gMHglMDhseCAoJXApIGRhdGEgPSAweCUwMmx4XG4iLAogCSAgICAgIG9mcywgd2luX2Jhc2UgKyBvZnMsIGQueFswXSk7CiAJcmV0dXJuIGQ7CiB9CkBAIC0yNTUsNyArMjM5LDcgQEAKIAkJcmV0dXJuIGQ7CiAKIAlkLnhbMF0gPSByZWFkdyh3aW5fYmFzZSArIG9mcyk7Ci0JREVCVUcoMywgIm9mcyA9IDB4JTA4bHggKCVwKSBkYXRhID0gMHglMDRseCIsCisJcHJfZGVidWcoIm9mcyA9IDB4JTA4bHggKCVwKSBkYXRhID0gMHglMDRseFxuIiwKIAkgICAgICBvZnMsIHdpbl9iYXNlICsgb2ZzLCBkLnhbMF0pOwogCXJldHVybiBkOwogfQpAQCAtMjY4LDcgKzI1Miw3IEBACiAJaWYoREVWX1JFTU9WRUQobWFwKSkKIAkJcmV0dXJuOwogCi0JREVCVUcoMywgInRvID0gJXAgZnJvbSA9ICVsdSBsZW4gPSAlemQiLCB0bywgZnJvbSwgbGVuKTsKKwlwcl9kZWJ1ZygidG8gPSAlcCBmcm9tID0gJWx1IGxlbiA9ICV6ZFxuIiwgdG8sIGZyb20sIGxlbik7CiAJbWVtY3B5X2Zyb21pbyh0bywgd2luX2Jhc2UgKyBmcm9tLCBsZW4pOwogfQogCkBAIC0yODAsNyArMjY0LDcgQEAKIAlpZihERVZfUkVNT1ZFRChtYXApKQogCQlyZXR1cm47CiAKLQlERUJVRygzLCAiYWRyID0gMHglMDhseCAoJXApICBkYXRhID0gMHglMDJseCIsCisJcHJfZGVidWcoImFkciA9IDB4JTA4bHggKCVwKSAgZGF0YSA9IDB4JTAybHhcbiIsCiAJICAgICAgYWRyLCB3aW5fYmFzZSArIGFkciwgZC54WzBdKTsKIAl3cml0ZWIoZC54WzBdLCB3aW5fYmFzZSArIGFkcik7CiB9CkBAIC0yOTMsNyArMjc3LDcgQEAKIAlpZihERVZfUkVNT1ZFRChtYXApKQogCQlyZXR1cm47CiAKLQlERUJVRygzLCAiYWRyID0gMHglMDhseCAoJXApICBkYXRhID0gMHglMDRseCIsCisJcHJfZGVidWcoImFkciA9IDB4JTA4bHggKCVwKSAgZGF0YSA9IDB4JTA0bHhcbiIsCiAJICAgICAgYWRyLCB3aW5fYmFzZSArIGFkciwgZC54WzBdKTsKIAl3cml0ZXcoZC54WzBdLCB3aW5fYmFzZSArIGFkcik7CiB9CkBAIC0zMDYsNyArMjkwLDcgQEAKIAlpZihERVZfUkVNT1ZFRChtYXApKQogCQlyZXR1cm47CiAKLQlERUJVRygzLCAidG8gPSAlbHUgZnJvbSA9ICVwIGxlbiA9ICV6ZCIsIHRvLCBmcm9tLCBsZW4pOworCXByX2RlYnVnKCJ0byA9ICVsdSBmcm9tID0gJXAgbGVuID0gJXpkXG4iLCB0bywgZnJvbSwgbGVuKTsKIAltZW1jcHlfdG9pbyh3aW5fYmFzZSArIHRvLCBmcm9tLCBsZW4pOwogfQogCkBAIC0zMTYsNyArMzAwLDcgQEAKIAlzdHJ1Y3QgcGNtY2lhbXRkX2RldiAqZGV2ID0gKHN0cnVjdCBwY21jaWFtdGRfZGV2ICopbWFwLT5tYXBfcHJpdl8xOwogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gZGV2LT5wX2RldjsKIAotCURFQlVHKDIsICJkZXYgPSAlcCBvbiA9ICVkIHZwcCA9ICVkXG4iLCBkZXYsIG9uLCBkZXYtPnZwcCk7CisJcHJfZGVidWcoImRldiA9ICVwIG9uID0gJWQgdnBwID0gJWRcblxuIiwgZGV2LCBvbiwgZGV2LT52cHApOwogCXBjbWNpYV9maXh1cF92cHAobGluaywgb24gPyBkZXYtPnZwcCA6IDApOwogfQogCkBAIC0zMjUsNyArMzA5LDcgQEAKIHsKIAlzdHJ1Y3QgcGNtY2lhbXRkX2RldiAqZGV2ID0gbGluay0+cHJpdjsKIAotCURFQlVHKDMsICJsaW5rID0gMHglcCIsIGxpbmspOworCXByX2RlYnVnKCJsaW5rID0gMHglcFxuIiwgbGluayk7CiAKIAlpZiAobGluay0+cmVzb3VyY2VbMl0tPmVuZCkgewogCQlpZihkZXYtPndpbl9iYXNlKSB7CkBAIC0zMzcsNyArMzIxLDYgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX01URF9ERUJVRwogc3RhdGljIGludCBwY21jaWFtdGRfY2lzdHBsX2Zvcm1hdChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCiAJCQkJdHVwbGVfdCAqdHVwbGUsCiAJCQkJdm9pZCAqcHJpdl9kYXRhKQpAQCAtMzQ3LDcgKzMzMCw3IEBACiAJaWYgKCFwY21jaWFfcGFyc2VfdHVwbGUodHVwbGUsICZwYXJzZSkpIHsKIAkJY2lzdHBsX2Zvcm1hdF90ICp0ID0gJnBhcnNlLmZvcm1hdDsKIAkJKHZvaWQpdDsgLyogU2h1dCB1cCwgZ2NjICovCi0JCURFQlVHKDIsICJGb3JtYXQgdHlwZTogJXUsIEVycm9yIERldGVjdGlvbjogJXUsIG9mZnNldCA9ICV1LCBsZW5ndGggPSV1IiwKKwkJcHJfZGVidWcoIkZvcm1hdCB0eXBlOiAldSwgRXJyb3IgRGV0ZWN0aW9uOiAldSwgb2Zmc2V0ID0gJXUsIGxlbmd0aCA9JXVcbiIsCiAJCQl0LT50eXBlLCB0LT5lZGMsIHQtPm9mZnNldCwgdC0+bGVuZ3RoKTsKIAl9CiAJcmV0dXJuIC1FTk9TUEM7CkBAIC0zNjMsMTIgKzM0NiwxMSBAQAogCWlmICghcGNtY2lhX3BhcnNlX3R1cGxlKHR1cGxlLCAmcGFyc2UpKSB7CiAJCWNpc3RwbF9qZWRlY190ICp0ID0gJnBhcnNlLmplZGVjOwogCQlmb3IgKGkgPSAwOyBpIDwgdC0+bmlkOyBpKyspCi0JCQlERUJVRygyLCAiSkVERUM6IDB4JTAyeCAweCUwMngiLAorCQkJcHJfZGVidWcoIkpFREVDOiAweCUwMnggMHglMDJ4XG4iLAogCQkJICAgICAgdC0+aWRbaV0ubWZyLCB0LT5pZFtpXS5pbmZvKTsKIAl9CiAJcmV0dXJuIC1FTk9TUEM7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGludCBwY21jaWFtdGRfY2lzdHBsX2RldmljZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCiAJCQkJdHVwbGVfdCAqdHVwbGUsCkBAIC0zODIsMTQgKzM2NCwxNCBAQAogCWlmIChwY21jaWFfcGFyc2VfdHVwbGUodHVwbGUsICZwYXJzZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JREVCVUcoMiwgIkNvbW1vbiBtZW1vcnk6Iik7CisJcHJfZGVidWcoIkNvbW1vbiBtZW1vcnk6XG4iKTsKIAlkZXYtPnBjbWNpYV9tYXAuc2l6ZSA9IHQtPmRldlswXS5zaXplOwogCS8qIGZyb20gaGVyZSBvbjogREVCVUcgb25seSAqLwogCWZvciAoaSA9IDA7IGkgPCB0LT5uZGV2OyBpKyspIHsKLQkJREVCVUcoMiwgIlJlZ2lvbiAlZCwgdHlwZSA9ICV1IiwgaSwgdC0+ZGV2W2ldLnR5cGUpOwotCQlERUJVRygyLCAiUmVnaW9uICVkLCB3cCA9ICV1IiwgaSwgdC0+ZGV2W2ldLndwKTsKLQkJREVCVUcoMiwgIlJlZ2lvbiAlZCwgc3BlZWQgPSAldSBucyIsIGksIHQtPmRldltpXS5zcGVlZCk7Ci0JCURFQlVHKDIsICJSZWdpb24gJWQsIHNpemUgPSAldSBieXRlcyIsIGksIHQtPmRldltpXS5zaXplKTsKKwkJcHJfZGVidWcoIlJlZ2lvbiAlZCwgdHlwZSA9ICV1XG4iLCBpLCB0LT5kZXZbaV0udHlwZSk7CisJCXByX2RlYnVnKCJSZWdpb24gJWQsIHdwID0gJXVcbiIsIGksIHQtPmRldltpXS53cCk7CisJCXByX2RlYnVnKCJSZWdpb24gJWQsIHNwZWVkID0gJXUgbnNcbiIsIGksIHQtPmRldltpXS5zcGVlZCk7CisJCXByX2RlYnVnKCJSZWdpb24gJWQsIHNpemUgPSAldSBieXRlc1xuIiwgaSwgdC0+ZGV2W2ldLnNpemUpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQwOSwxMiArMzkxLDEyIEBACiAJZGV2LT5wY21jaWFfbWFwLmJhbmt3aWR0aCA9IHQtPmdlb1swXS5idXN3aWR0aDsKIAkvKiBmcm9tIGhlcmUgb246IERFQlVHIG9ubHkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdC0+bmdlbzsgaSsrKSB7Ci0JCURFQlVHKDIsICJyZWdpb246ICVkIGJhbmt3aWR0aCA9ICV1IiwgaSwgdC0+Z2VvW2ldLmJ1c3dpZHRoKTsKLQkJREVCVUcoMiwgInJlZ2lvbjogJWQgZXJhc2VfYmxvY2sgPSAldSIsIGksIHQtPmdlb1tpXS5lcmFzZV9ibG9jayk7Ci0JCURFQlVHKDIsICJyZWdpb246ICVkIHJlYWRfYmxvY2sgPSAldSIsIGksIHQtPmdlb1tpXS5yZWFkX2Jsb2NrKTsKLQkJREVCVUcoMiwgInJlZ2lvbjogJWQgd3JpdGVfYmxvY2sgPSAldSIsIGksIHQtPmdlb1tpXS53cml0ZV9ibG9jayk7Ci0JCURFQlVHKDIsICJyZWdpb246ICVkIHBhcnRpdGlvbiA9ICV1IiwgaSwgdC0+Z2VvW2ldLnBhcnRpdGlvbik7Ci0JCURFQlVHKDIsICJyZWdpb246ICVkIGludGVybGVhdmUgPSAldSIsIGksIHQtPmdlb1tpXS5pbnRlcmxlYXZlKTsKKwkJcHJfZGVidWcoInJlZ2lvbjogJWQgYmFua3dpZHRoID0gJXVcbiIsIGksIHQtPmdlb1tpXS5idXN3aWR0aCk7CisJCXByX2RlYnVnKCJyZWdpb246ICVkIGVyYXNlX2Jsb2NrID0gJXVcbiIsIGksIHQtPmdlb1tpXS5lcmFzZV9ibG9jayk7CisJCXByX2RlYnVnKCJyZWdpb246ICVkIHJlYWRfYmxvY2sgPSAldVxuIiwgaSwgdC0+Z2VvW2ldLnJlYWRfYmxvY2spOworCQlwcl9kZWJ1ZygicmVnaW9uOiAlZCB3cml0ZV9ibG9jayA9ICV1XG4iLCBpLCB0LT5nZW9baV0ud3JpdGVfYmxvY2spOworCQlwcl9kZWJ1ZygicmVnaW9uOiAlZCBwYXJ0aXRpb24gPSAldVxuIiwgaSwgdC0+Z2VvW2ldLnBhcnRpdGlvbik7CisJCXByX2RlYnVnKCJyZWdpb246ICVkIGludGVybGVhdmUgPSAldVxuIiwgaSwgdC0+Z2VvW2ldLmludGVybGVhdmUpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQzMiwxMyArNDE0LDExIEBACiAJCQlpZiAocF9kZXYtPnByb2RfaWRbaV0pCiAJCQkJc3RyY2F0KGRldi0+bXRkX25hbWUsIHBfZGV2LT5wcm9kX2lkW2ldKTsKIAkJfQotCQlERUJVRygyLCAiRm91bmQgbmFtZTogJXMiLCBkZXYtPm10ZF9uYW1lKTsKKwkJcHJfZGVidWcoIkZvdW5kIG5hbWU6ICVzXG4iLCBkZXYtPm10ZF9uYW1lKTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfTVREX0RFQlVHCiAJcGNtY2lhX2xvb3BfdHVwbGUocF9kZXYsIENJU1RQTF9GT1JNQVQsIHBjbWNpYW10ZF9jaXN0cGxfZm9ybWF0LCBOVUxMKTsKIAlwY21jaWFfbG9vcF90dXBsZShwX2RldiwgQ0lTVFBMX0pFREVDX0MsIHBjbWNpYW10ZF9jaXN0cGxfamVkZWMsIE5VTEwpOwotI2VuZGlmCiAJcGNtY2lhX2xvb3BfdHVwbGUocF9kZXYsIENJU1RQTF9ERVZJQ0UsIHBjbWNpYW10ZF9jaXN0cGxfZGV2aWNlLCBkZXYpOwogCXBjbWNpYV9sb29wX3R1cGxlKHBfZGV2LCBDSVNUUExfREVWSUNFX0dFTywgcGNtY2lhbXRkX2Npc3RwbF9nZW8sIGRldik7CiAKQEAgLTQ1MCwxMiArNDMwLDEyIEBACiAKIAlpZihmb3JjZV9zaXplKSB7CiAJCWRldi0+cGNtY2lhX21hcC5zaXplID0gZm9yY2Vfc2l6ZSA8PCAyMDsKLQkJREVCVUcoMiwgInNpemUgZm9yY2VkIHRvICVkTSIsIGZvcmNlX3NpemUpOworCQlwcl9kZWJ1Zygic2l6ZSBmb3JjZWQgdG8gJWRNXG4iLCBmb3JjZV9zaXplKTsKIAl9CiAKIAlpZihiYW5rd2lkdGgpIHsKIAkJZGV2LT5wY21jaWFfbWFwLmJhbmt3aWR0aCA9IGJhbmt3aWR0aDsKLQkJREVCVUcoMiwgImJhbmt3aWR0aCBmb3JjZWQgdG8gJWQiLCBiYW5rd2lkdGgpOworCQlwcl9kZWJ1ZygiYmFua3dpZHRoIGZvcmNlZCB0byAlZFxuIiwgYmFua3dpZHRoKTsKIAl9CiAKIAlkZXYtPnBjbWNpYV9tYXAubmFtZSA9IGRldi0+bXRkX25hbWU7CkBAIC00NjQsNyArNDQ0LDcgQEAKIAkJKm5ld19uYW1lID0gMTsKIAl9CiAKLQlERUJVRygxLCAiRGV2aWNlOiBTaXplOiAlbHUgV2lkdGg6JWQgTmFtZTogJXMiLAorCXByX2RlYnVnKCJEZXZpY2U6IFNpemU6ICVsdSBXaWR0aDolZCBOYW1lOiAlc1xuIiwKIAkgICAgICBkZXYtPnBjbWNpYV9tYXAuc2l6ZSwKIAkgICAgICBkZXYtPnBjbWNpYV9tYXAuYmFua3dpZHRoIDw8IDMsIGRldi0+bXRkX25hbWUpOwogfQpAQCAtNDc5LDcgKzQ1OSw3IEBACiAJc3RhdGljIGNoYXIgKnByb2Jlc1tdID0geyAiamVkZWNfcHJvYmUiLCAiY2ZpX3Byb2JlIiB9OwogCWludCBuZXdfbmFtZSA9IDA7CiAKLQlERUJVRygzLCAibGluaz0weCVwIiwgbGluayk7CisJcHJfZGVidWcoImxpbms9MHglcFxuIiwgbGluayk7CiAKIAljYXJkX3NldHRpbmdzKGRldiwgbGluaywgJm5ld19uYW1lKTsKIApAQCAtNTEyLDExICs0OTIsMTEgQEAKIAogCWRvIHsKIAkJaW50IHJldDsKLQkJREVCVUcoMiwgInJlcXVlc3Rpbmcgd2luZG93IHdpdGggc2l6ZSA9ICVsdUtpQiBtZW1zcGVlZCA9ICVkIiwKKwkJcHJfZGVidWcoInJlcXVlc3Rpbmcgd2luZG93IHdpdGggc2l6ZSA9ICVsdUtpQiBtZW1zcGVlZCA9ICVkXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcpIHJlc291cmNlX3NpemUobGluay0+cmVzb3VyY2VbMl0pID4+IDEwLAogCQkJbWVtX3NwZWVkKTsKIAkJcmV0ID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KGxpbmssIGxpbmstPnJlc291cmNlWzJdLCBtZW1fc3BlZWQpOwotCQlERUJVRygyLCAicmV0ID0gJWQgZGV2LT53aW5fc2l6ZSA9ICVkIiwgcmV0LCBkZXYtPndpbl9zaXplKTsKKwkJcHJfZGVidWcoInJldCA9ICVkIGRldi0+d2luX3NpemUgPSAlZFxuIiwgcmV0LCBkZXYtPndpbl9zaXplKTsKIAkJaWYocmV0KSB7CiAJCQlqKys7CiAJCQlsaW5rLT5yZXNvdXJjZVsyXS0+c3RhcnQgPSAwOwpAQCAtNTI0LDIxICs1MDQsMjEgQEAKIAkJCQkJZm9yY2Vfc2l6ZSA8PCAyMCA6IE1BWF9QQ01DSUFfQUREUjsKIAkJCWxpbmstPnJlc291cmNlWzJdLT5lbmQgPj49IGo7CiAJCX0gZWxzZSB7Ci0JCQlERUJVRygyLCAiR290IHdpbmRvdyBvZiBzaXplICVsdUtpQiIsICh1bnNpZ25lZCBsb25nKQorCQkJcHJfZGVidWcoIkdvdCB3aW5kb3cgb2Ygc2l6ZSAlbHVLaUJcbiIsICh1bnNpZ25lZCBsb25nKQogCQkJCXJlc291cmNlX3NpemUobGluay0+cmVzb3VyY2VbMl0pID4+IDEwKTsKIAkJCWRldi0+d2luX3NpemUgPSByZXNvdXJjZV9zaXplKGxpbmstPnJlc291cmNlWzJdKTsKIAkJCWJyZWFrOwogCQl9CiAJfSB3aGlsZSAobGluay0+cmVzb3VyY2VbMl0tPmVuZCA+PSAweDEwMDApOwogCi0JREVCVUcoMiwgImRldi0+d2luX3NpemUgPSAlZCIsIGRldi0+d2luX3NpemUpOworCXByX2RlYnVnKCJkZXYtPndpbl9zaXplID0gJWRcbiIsIGRldi0+d2luX3NpemUpOwogCiAJaWYoIWRldi0+d2luX3NpemUpIHsKIAkJZGV2X2VycigmZGV2LT5wX2Rldi0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSB3aW5kb3dcbiIpOwogCQlwY21jaWFtdGRfcmVsZWFzZShsaW5rKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCURFQlVHKDEsICJBbGxvY2F0ZWQgYSB3aW5kb3cgb2YgJWRLaUIiLCBkZXYtPndpbl9zaXplID4+IDEwKTsKKwlwcl9kZWJ1ZygiQWxsb2NhdGVkIGEgd2luZG93IG9mICVkS2lCXG4iLCBkZXYtPndpbl9zaXplID4+IDEwKTsKIAogCS8qIEdldCB3cml0ZSBwcm90ZWN0IHN0YXR1cyAqLwogCWRldi0+d2luX2Jhc2UgPSBpb3JlbWFwKGxpbmstPnJlc291cmNlWzJdLT5zdGFydCwKQEAgLTU0OSw3ICs1MjksNyBAQAogCQlwY21jaWFtdGRfcmVsZWFzZShsaW5rKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCURFQlVHKDEsICJtYXBwZWQgd2luZG93IGRldiA9ICVwIEAgJXBSLCBiYXNlID0gJXAiLAorCXByX2RlYnVnKCJtYXBwZWQgd2luZG93IGRldiA9ICVwIEAgJXBSLCBiYXNlID0gJXBcbiIsCiAJICAgICAgZGV2LCBsaW5rLT5yZXNvdXJjZVsyXSwgZGV2LT53aW5fYmFzZSk7CiAKIAlkZXYtPm9mZnNldCA9IDA7CkBAIC01NjQsNyArNTQ0LDcgQEAKIAl9CiAKIAlsaW5rLT5jb25maWdfaW5kZXggPSAwOwotCURFQlVHKDIsICJTZXR0aW5nIENvbmZpZ3VyYXRpb24iKTsKKwlwcl9kZWJ1ZygiU2V0dGluZyBDb25maWd1cmF0aW9uXG4iKTsKIAlyZXQgPSBwY21jaWFfZW5hYmxlX2RldmljZShsaW5rKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJaWYgKGRldi0+d2luX2Jhc2UpIHsKQEAgLTU4MCwxNyArNTYwLDE3IEBACiAJCW10ZCA9IGRvX21hcF9wcm9iZSgibWFwX3JvbSIsICZkZXYtPnBjbWNpYV9tYXApOwogCX0gZWxzZSB7CiAJCWZvcihpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJvYmVzKTsgaSsrKSB7Ci0JCQlERUJVRygxLCAiVHJ5aW5nICVzIiwgcHJvYmVzW2ldKTsKKwkJCXByX2RlYnVnKCJUcnlpbmcgJXNcbiIsIHByb2Jlc1tpXSk7CiAJCQltdGQgPSBkb19tYXBfcHJvYmUocHJvYmVzW2ldLCAmZGV2LT5wY21jaWFfbWFwKTsKIAkJCWlmKG10ZCkKIAkJCQlicmVhazsKIAotCQkJREVCVUcoMSwgIkZBSUxFRDogJXMiLCBwcm9iZXNbaV0pOworCQkJcHJfZGVidWcoIkZBSUxFRDogJXNcbiIsIHByb2Jlc1tpXSk7CiAJCX0KIAl9CiAKIAlpZighbXRkKSB7Ci0JCURFQlVHKDEsICJDYW4gbm90IGZpbmQgYW4gTVREIik7CisJCXByX2RlYnVnKCJDYW4gbm90IGZpbmQgYW4gTVREXG4iKTsKIAkJcGNtY2lhbXRkX3JlbGVhc2UobGluayk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTYxNyw3ICs1OTcsNyBAQAogCS8qIElmIHRoZSBtZW1vcnkgZm91bmQgaXMgZml0cyBjb21wbGV0ZWx5IGludG8gdGhlIG1hcHBlZCBQQ01DSUEgd2luZG93LAogCSAgIHVzZSB0aGUgZmFzdGVyIG5vbi1yZW1hcHBpbmcgcmVhZC93cml0ZSBmdW5jdGlvbnMgKi8KIAlpZihtdGQtPnNpemUgPD0gZGV2LT53aW5fc2l6ZSkgewotCQlERUJVRygxLCAiVXNpbmcgbm9uIHJlbWFwcGluZyBtZW1vcnkgZnVuY3Rpb25zIik7CisJCXByX2RlYnVnKCJVc2luZyBub24gcmVtYXBwaW5nIG1lbW9yeSBmdW5jdGlvbnNcbiIpOwogCQlkZXYtPnBjbWNpYV9tYXAubWFwX3ByaXZfMiA9ICh1bnNpZ25lZCBsb25nKWRldi0+d2luX2Jhc2U7CiAJCWlmIChkZXYtPnBjbWNpYV9tYXAuYmFua3dpZHRoID09IDEpIHsKIAkJCWRldi0+cGNtY2lhX21hcC5yZWFkID0gcGNtY2lhX3JlYWQ4OwpAQCAtNjQ1LDcgKzYyNSw3IEBACiAKIHN0YXRpYyBpbnQgcGNtY2lhbXRkX3N1c3BlbmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmRldikKIHsKLQlERUJVRygyLCAiRVZFTlRfUE1fUkVTVU1FIik7CisJcHJfZGVidWcoIkVWRU5UX1BNX1JFU1VNRVxuIik7CiAKIAkvKiBnZXRfbG9jayhsaW5rKTsgKi8KIApAQCAtNjU0LDcgKzYzNCw3IEBACiAKIHN0YXRpYyBpbnQgcGNtY2lhbXRkX3Jlc3VtZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqZGV2KQogewotCURFQlVHKDIsICJFVkVOVF9QTV9TVVNQRU5EIik7CisJcHJfZGVidWcoIkVWRU5UX1BNX1NVU1BFTkRcbiIpOwogCiAJLyogZnJlZV9sb2NrKGxpbmspOyAqLwogCkBAIC02NjYsNyArNjQ2LDcgQEAKIHsKIAlzdHJ1Y3QgcGNtY2lhbXRkX2RldiAqZGV2ID0gbGluay0+cHJpdjsKIAotCURFQlVHKDMsICJsaW5rPTB4JXAiLCBsaW5rKTsKKwlwcl9kZWJ1ZygibGluaz0weCVwXG4iLCBsaW5rKTsKIAogCWlmKGRldi0+bXRkX2luZm8pIHsKIAkJbXRkX2RldmljZV91bnJlZ2lzdGVyKGRldi0+bXRkX2luZm8pOwpAQCAtNjg2LDcgKzY2Niw3IEBACiAJLyogQ3JlYXRlIG5ldyBtZW1vcnkgY2FyZCBkZXZpY2UgKi8KIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXYpIHJldHVybiAtRU5PTUVNOwotCURFQlVHKDEsICJkZXY9MHglcCIsIGRldik7CisJcHJfZGVidWcoImRldj0weCVwXG4iLCBkZXYpOwogCiAJZGV2LT5wX2RldiA9IGxpbms7CiAJbGluay0+cHJpdiA9IGRldjsKQEAgLTc1NSw3ICs3MzUsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9wY21jaWFtdGQodm9pZCkKIHsKLQlERUJVRygxLCBEUklWRVJfREVTQyAiIHVubG9hZGluZyIpOworCXByX2RlYnVnKERSSVZFUl9ERVNDICIgdW5sb2FkaW5nIik7CiAJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZwY21jaWFtdGRfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXAuYwppbmRleCBmNjRjZWU0Li42NmU4MjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXAuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXAuYwpAQCAtMjcsOCArMjcsNiBAQAogCXN0cnVjdCBtdGRfaW5mbwkJKm10ZFtNQVhfUkVTT1VSQ0VTXTsKIAlzdHJ1Y3QgbXRkX2luZm8JCSpjbXRkOwogCXN0cnVjdCBtYXBfaW5mbwkJbWFwW01BWF9SRVNPVVJDRVNdOwotCWludAkJCW5yX3BhcnRzOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKIH07CiAKIHN0YXRpYyBpbnQgcGh5c21hcF9mbGFzaF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpAQCAtNDYsOCArNDQsNiBAQAogCiAJaWYgKGluZm8tPmNtdGQpIHsKIAkJbXRkX2RldmljZV91bnJlZ2lzdGVyKGluZm8tPmNtdGQpOwotCQlpZiAoaW5mby0+bnJfcGFydHMpCi0JCQlrZnJlZShpbmZvLT5wYXJ0cyk7CiAJCWlmIChpbmZvLT5jbXRkICE9IGluZm8tPm10ZFswXSkKIAkJCW10ZF9jb25jYXRfZGVzdHJveShpbmZvLT5jbXRkKTsKIAl9CkBAIC0xNzUsMjMgKzE3MSw4IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0OwogCi0JZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+Y210ZCwgcGFydF9wcm9iZV90eXBlcywKLQkJCQkgICAmaW5mby0+cGFydHMsIDApOwotCWlmIChlcnIgPiAwKSB7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+Y210ZCwgaW5mby0+cGFydHMsIGVycik7Ci0JCWluZm8tPm5yX3BhcnRzID0gZXJyOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAocGh5c21hcF9kYXRhLT5ucl9wYXJ0cykgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nIHBoeXNtYXAgcGFydGl0aW9uIGluZm9ybWF0aW9uXG4iKTsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5jbXRkLCBwaHlzbWFwX2RhdGEtPnBhcnRzLAotCQkJCSAgICBwaHlzbWFwX2RhdGEtPm5yX3BhcnRzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5jbXRkLCBOVUxMLCAwKTsKLQorCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+Y210ZCwgcGFydF9wcm9iZV90eXBlcywgMCwKKwkJCQkgIHBoeXNtYXBfZGF0YS0+cGFydHMsIHBoeXNtYXBfZGF0YS0+bnJfcGFydHMpOwogCXJldHVybiAwOwogCiBlcnJfb3V0OgpAQCAtMjQ1LDIxICsyMjYsNiBAQAogCS5udW1fcmVzb3VyY2VzCT0gMSwKIAkucmVzb3VyY2UJPSAmcGh5c21hcF9mbGFzaF9yZXNvdXJjZSwKIH07Ci0KLXZvaWQgcGh5c21hcF9jb25maWd1cmUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCWludCBiYW5rd2lkdGgsIHZvaWQgKCpzZXRfdnBwKShzdHJ1Y3QgbWFwX2luZm8gKiwgaW50KSkKLXsKLQlwaHlzbWFwX2ZsYXNoX3Jlc291cmNlLnN0YXJ0ID0gYWRkcjsKLQlwaHlzbWFwX2ZsYXNoX3Jlc291cmNlLmVuZCA9IGFkZHIgKyBzaXplIC0gMTsKLQlwaHlzbWFwX2ZsYXNoX2RhdGEud2lkdGggPSBiYW5rd2lkdGg7Ci0JcGh5c21hcF9mbGFzaF9kYXRhLnNldF92cHAgPSBzZXRfdnBwOwotfQotCi12b2lkIHBoeXNtYXBfc2V0X3BhcnRpdGlvbnMoc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzLCBpbnQgbnVtX3BhcnRzKQotewotCXBoeXNtYXBfZmxhc2hfZGF0YS5ucl9wYXJ0cyA9IG51bV9wYXJ0czsKLQlwaHlzbWFwX2ZsYXNoX2RhdGEucGFydHMgPSBwYXJ0czsKLX0KICNlbmRpZgogCiBzdGF0aWMgaW50IF9faW5pdCBwaHlzbWFwX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcF9vZi5jIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwX29mLmMKaW5kZXggZDI1MWQxZC4uN2Q2NWY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwX29mLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwX29mLmMKQEAgLTM0LDU4ICszNCwxMCBAQAogCiBzdHJ1Y3Qgb2ZfZmxhc2ggewogCXN0cnVjdCBtdGRfaW5mbwkJKmNtdGQ7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRzOwogCWludCBsaXN0X3NpemU7IC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBvZl9mbGFzaF9saXN0ICovCiAJc3RydWN0IG9mX2ZsYXNoX2xpc3QJbGlzdFswXTsKIH07CiAKLSNkZWZpbmUgT0ZfRkxBU0hfUEFSVFMoaW5mbykJKChpbmZvKS0+cGFydHMpCi1zdGF0aWMgaW50IHBhcnNlX29ic29sZXRlX3BhcnRpdGlvbnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IG9mX2ZsYXNoICppbmZvLAotCQkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQlpbnQgaSwgcGxlbiwgbnJfcGFydHM7Ci0JY29uc3Qgc3RydWN0IHsKLQkJX19iZTMyIG9mZnNldCwgbGVuOwotCX0gKnBhcnQ7Ci0JY29uc3QgY2hhciAqbmFtZXM7Ci0KLQlwYXJ0ID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicGFydGl0aW9ucyIsICZwbGVuKTsKLQlpZiAoIXBhcnQpCi0JCXJldHVybiAwOyAvKiBObyBwYXJ0aXRpb25zIGZvdW5kICovCi0KLQlkZXZfd2FybigmZGV2LT5kZXYsICJEZXZpY2UgdHJlZSB1c2VzIG9ic29sZXRlIHBhcnRpdGlvbiBtYXAgYmluZGluZ1xuIik7Ci0KLQlucl9wYXJ0cyA9IHBsZW4gLyBzaXplb2YocGFydFswXSk7Ci0KLQlpbmZvLT5wYXJ0cyA9IGt6YWxsb2MobnJfcGFydHMgKiBzaXplb2YoKmluZm8tPnBhcnRzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvLT5wYXJ0cykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQluYW1lcyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInBhcnRpdGlvbi1uYW1lcyIsICZwbGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9wYXJ0czsgaSsrKSB7Ci0JCWluZm8tPnBhcnRzW2ldLm9mZnNldCA9IGJlMzJfdG9fY3B1KHBhcnQtPm9mZnNldCk7Ci0JCWluZm8tPnBhcnRzW2ldLnNpemUgICA9IGJlMzJfdG9fY3B1KHBhcnQtPmxlbikgJiB+MTsKLQkJaWYgKGJlMzJfdG9fY3B1KHBhcnQtPmxlbikgJiAxKSAvKiBiaXQgMCBzZXQgc2lnbmlmaWVzIHJlYWQgb25seSBwYXJ0aXRpb24gKi8KLQkJCWluZm8tPnBhcnRzW2ldLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFOwotCi0JCWlmIChuYW1lcyAmJiAocGxlbiA+IDApKSB7Ci0JCQlpbnQgbGVuID0gc3RybGVuKG5hbWVzKSArIDE7Ci0KLQkJCWluZm8tPnBhcnRzW2ldLm5hbWUgPSAoY2hhciAqKW5hbWVzOwotCQkJcGxlbiAtPSBsZW47Ci0JCQluYW1lcyArPSBsZW47Ci0JCX0gZWxzZSB7Ci0JCQlpbmZvLT5wYXJ0c1tpXS5uYW1lID0gInVubmFtZWQiOwotCQl9Ci0KLQkJcGFydCsrOwotCX0KLQotCXJldHVybiBucl9wYXJ0czsKLX0KLQogc3RhdGljIGludCBvZl9mbGFzaF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBvZl9mbGFzaCAqaW5mbzsKQEAgLTEwMSwxMSArNTMsOCBAQAogCQltdGRfY29uY2F0X2Rlc3Ryb3koaW5mby0+Y210ZCk7CiAJfQogCi0JaWYgKGluZm8tPmNtdGQpIHsKLQkJaWYgKE9GX0ZMQVNIX1BBUlRTKGluZm8pKQotCQkJa2ZyZWUoT0ZfRkxBU0hfUEFSVFMoaW5mbykpOworCWlmIChpbmZvLT5jbXRkKQogCQltdGRfZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+Y210ZCk7Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IGluZm8tPmxpc3Rfc2l6ZTsgaSsrKSB7CiAJCWlmIChpbmZvLT5saXN0W2ldLm10ZCkKQEAgLTE2NSw3ICsxMTQsOCBAQAogICAgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHBhcnRpdGlvbiBwcm9iZXJzIHRvIHVzZS4gSWYgbm9uZSBpcyBnaXZlbiB0aGVuIHRoZQogICAgZGVmYXVsdCBpcyB1c2UuIFRoZXNlIHRha2UgcHJlY2VkZW5jZSBvdmVyIG90aGVyIGRldmljZSB0cmVlCiAgICBpbmZvcm1hdGlvbi4gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2JlX3R5cGVzX2RlZltdID0geyAiY21kbGluZXBhcnQiLCAiUmVkQm9vdCIsIE5VTEwgfTsKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2JlX3R5cGVzX2RlZltdID0geyAiY21kbGluZXBhcnQiLCAiUmVkQm9vdCIsCisJCQkJCSJvZnBhcnQiLCAib2ZvbGRwYXJ0IiwgTlVMTCB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiogX19kZXZpbml0IG9mX2dldF9wcm9iZXMoc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKIAljb25zdCBjaGFyICpjcDsKQEAgLTIxOCw2ICsxNjgsNyBAQAogCWludCByZWdfdHVwbGVfc2l6ZTsKIAlzdHJ1Y3QgbXRkX2luZm8gKiptdGRfbGlzdCA9IE5VTEw7CiAJcmVzb3VyY2Vfc2l6ZV90IHJlc19zaXplOworCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSBwcGRhdGE7CiAKIAltYXRjaCA9IG9mX21hdGNoX2RldmljZShvZl9mbGFzaF9tYXRjaCwgJmRldi0+ZGV2KTsKIAlpZiAoIW1hdGNoKQpAQCAtMzMxLDI5ICsyODIsMTIgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9vdXQ7CiAKKwlwcGRhdGEub2Zfbm9kZSA9IGRwOwogCXBhcnRfcHJvYmVfdHlwZXMgPSBvZl9nZXRfcHJvYmVzKGRwKTsKLQllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5jbXRkLCBwYXJ0X3Byb2JlX3R5cGVzLAotCQkJCSAgICZpbmZvLT5wYXJ0cywgMCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJb2ZfZnJlZV9wcm9iZXMocGFydF9wcm9iZV90eXBlcyk7Ci0JCWdvdG8gZXJyX291dDsKLQl9CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihpbmZvLT5jbXRkLCBwYXJ0X3Byb2JlX3R5cGVzLCAmcHBkYXRhLAorCQkJTlVMTCwgMCk7CiAJb2ZfZnJlZV9wcm9iZXMocGFydF9wcm9iZV90eXBlcyk7CiAKLQlpZiAoZXJyID09IDApIHsKLQkJZXJyID0gb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMoJmRldi0+ZGV2LCBkcCwgJmluZm8tPnBhcnRzKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0JaWYgKGVyciA9PSAwKSB7Ci0JCWVyciA9IHBhcnNlX29ic29sZXRlX3BhcnRpdGlvbnMoZGV2LCBpbmZvLCBkcCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJfb3V0OwotCX0KLQotCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+Y210ZCwgaW5mby0+cGFydHMsIGVycik7Ci0KIAlrZnJlZShtdGRfbGlzdCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYyBiL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYwppbmRleCA5Y2ExZWNjLi45NGY1NTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BsYXQtcmFtLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jCkBAIC00NCw4ICs0NCw2IEBACiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgbXRkX2luZm8JCSptdGQ7CiAJc3RydWN0IG1hcF9pbmZvCQkgbWFwOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0aXRpb25zOwotCWJvb2wJCQlmcmVlX3BhcnRpdGlvbnM7CiAJc3RydWN0IHJlc291cmNlCQkqYXJlYTsKIAlzdHJ1Y3QgcGxhdGRhdGFfbXRkX3JhbQkqcGRhdGE7CiB9OwpAQCAtOTUsMTAgKzkzLDYgQEAKIAogCWlmIChpbmZvLT5tdGQpIHsKIAkJbXRkX2RldmljZV91bnJlZ2lzdGVyKGluZm8tPm10ZCk7Ci0JCWlmIChpbmZvLT5wYXJ0aXRpb25zKSB7Ci0JCQlpZiAoaW5mby0+ZnJlZV9wYXJ0aXRpb25zKQotCQkJCWtmcmVlKGluZm8tPnBhcnRpdGlvbnMpOwotCQl9CiAJCW1hcF9kZXN0cm95KGluZm8tPm10ZCk7CiAJfQogCkBAIC0yMjgsMjEgKzIyMiw4IEBACiAJLyogY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgYXZhaWxhYmxlIHBhcnRpdGlvbnMsIG9yIHdldGhlcgogCSAqIHRvIGFkZCB0aGlzIGRldmljZSB3aG9sZSAqLwogCi0JaWYgKCFwZGF0YS0+bnJfcGFydGl0aW9ucykgewotCQkvKiB0cnkgdG8gcHJvYmUgdXNpbmcgdGhlIHN1cHBsaWVkIHByb2JlIHR5cGUgKi8KLQkJaWYgKHBkYXRhLT5wcm9iZXMpIHsKLQkJCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcGRhdGEtPnByb2JlcywKLQkJCQkJICAgJmluZm8tPnBhcnRpdGlvbnMsIDApOwotCQkJaW5mby0+ZnJlZV9wYXJ0aXRpb25zID0gMTsKLQkJCWlmIChlcnIgPiAwKQotCQkJCWVyciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLAotCQkJCQlpbmZvLT5wYXJ0aXRpb25zLCBlcnIpOwotCQl9Ci0JfQotCS8qIHVzZSB0aGUgc3RhdGljIG1hcHBpbmcgKi8KLQllbHNlCi0JCWVyciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBwZGF0YS0+cGFydGl0aW9ucywKLQkJCQkJICBwZGF0YS0+bnJfcGFydGl0aW9ucyk7CisJZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihpbmZvLT5tdGQsIHBkYXRhLT5wcm9iZXMsIDAsCisJCQlwZGF0YS0+cGFydGl0aW9ucywgcGRhdGEtPm5yX3BhcnRpdGlvbnMpOwogCWlmICghZXJyKQogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAicmVnaXN0ZXJlZCBtdGQgZGV2aWNlXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9weGEyeHgtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvcHhhMnh4LWZsYXNoLmMKaW5kZXggN2FlMTM3ZC4uNDExYTE3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9weGEyeHgtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3B4YTJ4eC1mbGFzaC5jCkBAIC00MSw4ICs0MSw2IEBACiB9CiAKIHN0cnVjdCBweGEyeHhfZmxhc2hfaW5mbyB7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRzOwotCWludAkJCW5yX3BhcnRzOwogCXN0cnVjdCBtdGRfaW5mbwkJKm10ZDsKIAlzdHJ1Y3QgbWFwX2luZm8JCW1hcDsKIH07CkBAIC01NSw5ICs1Myw3IEBACiB7CiAJc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgKmZsYXNoID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHB4YTJ4eF9mbGFzaF9pbmZvICppbmZvOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgcmV0ID0gMDsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpCkBAIC03MSw4ICs2Nyw2IEBACiAJaW5mby0+bWFwLmJhbmt3aWR0aCA9IGZsYXNoLT53aWR0aDsKIAlpbmZvLT5tYXAucGh5cyA9IHJlcy0+c3RhcnQ7CiAJaW5mby0+bWFwLnNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7Ci0JaW5mby0+cGFydHMgPSBmbGFzaC0+cGFydHM7Ci0JaW5mby0+bnJfcGFydHMgPSBmbGFzaC0+bnJfcGFydHM7CiAKIAlpbmZvLT5tYXAudmlydCA9IGlvcmVtYXAoaW5mby0+bWFwLnBoeXMsIGluZm8tPm1hcC5zaXplKTsKIAlpZiAoIWluZm8tPm1hcC52aXJ0KSB7CkBAIC0xMDQsMTggKzk4LDcgQEAKIAl9CiAJaW5mby0+bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JcmV0ID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBwcm9iZXMsICZwYXJ0cywgMCk7Ci0KLQlpZiAocmV0ID4gMCkgewotCQlpbmZvLT5ucl9wYXJ0cyA9IHJldDsKLQkJaW5mby0+cGFydHMgPSBwYXJ0czsKLQl9Ci0KLQlpZiAoIWluZm8tPm5yX3BhcnRzKQotCQlwcmludGsoIlJlZ2lzdGVyaW5nICVzIGFzIHdob2xlIGRldmljZVxuIiwKLQkJICAgICAgIGluZm8tPm1hcC5uYW1lKTsKLQotCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBpbmZvLT5wYXJ0cywgaW5mby0+bnJfcGFydHMpOworCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBwcm9iZXMsIDAsIE5VTEwsIDApOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CiAJcmV0dXJuIDA7CkBAIC0xMzMsNyArMTE2LDYgQEAKIAlpb3VubWFwKGluZm8tPm1hcC52aXJ0KTsKIAlpZiAoaW5mby0+bWFwLmNhY2hlZCkKIAkJaW91bm1hcChpbmZvLT5tYXAuY2FjaGVkKTsKLQlrZnJlZShpbmZvLT5wYXJ0cyk7CiAJa2ZyZWUoaW5mbyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3JidHg0OTM5LWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3JidHg0OTM5LWZsYXNoLmMKaW5kZXggNzYxZmI0NS4uMDIzN2YxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9yYnR4NDkzOS1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvcmJ0eDQ5MzktZmxhc2guYwpAQCAtMjUsOCArMjUsNiBAQAogc3RydWN0IHJidHg0OTM5X2ZsYXNoX2luZm8gewogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCXN0cnVjdCBtYXBfaW5mbyBtYXA7Ci0JaW50IG5yX3BhcnRzOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKIH07CiAKIHN0YXRpYyBpbnQgcmJ0eDQ5MzlfZmxhc2hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKQEAgLTQxLDggKzM5LDYgQEAKIAlpZiAoaW5mby0+bXRkKSB7CiAJCXN0cnVjdCByYnR4NDkzOV9mbGFzaF9kYXRhICpwZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQkJaWYgKGluZm8tPm5yX3BhcnRzKQotCQkJa2ZyZWUoaW5mby0+cGFydHMpOwogCQltdGRfZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+bXRkKTsKIAkJbWFwX2Rlc3Ryb3koaW5mby0+bXRkKTsKIAl9CkBAIC01MCw3ICs0Niw2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpyb21fcHJvYmVfdHlwZXNbXSA9IHsgImNmaV9wcm9iZSIsICJqZWRlY19wcm9iZSIsIE5VTEwgfTsKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2JlX3R5cGVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKIAogc3RhdGljIGludCByYnR4NDkzOV9mbGFzaF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CkBAIC0xMDcsMjIgKzEwMiwxMSBAQAogCWluZm8tPm10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9vdXQ7CisJZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihpbmZvLT5tdGQsIE5VTEwsIDAsCisJCQlwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7CiAKLQllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHBhcnRfcHJvYmVfdHlwZXMsCi0JCQkJJmluZm8tPnBhcnRzLCAwKTsKLQlpZiAoZXJyID4gMCkgewotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgaW5mby0+cGFydHMsIGVycik7Ci0JCWluZm8tPm5yX3BhcnRzID0gZXJyOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAocGRhdGEtPm5yX3BhcnRzKSB7Ci0JCXByX25vdGljZSgiVXNpbmcgcmJ0eDQ5MzkgcGFydGl0aW9uIGluZm9ybWF0aW9uXG4iKTsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIHBkYXRhLT5wYXJ0cywgcGRhdGEtPm5yX3BhcnRzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIE5VTEwsIDApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDsKIAlyZXR1cm4gMDsKIAogZXJyX291dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvc2ExMTAwLWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3NhMTEwMC1mbGFzaC5jCmluZGV4IGE5YjVlMGUuLmZhOWMwYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvc2ExMTAwLWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9zYTExMDAtZmxhc2guYwpAQCAtMTMxLDEwICsxMzEsOCBAQAogfTsKIAogc3RydWN0IHNhX2luZm8gewotCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKIAlzdHJ1Y3QgbXRkX2luZm8JCSptdGQ7CiAJaW50CQkJbnVtX3N1YmRldjsKLQl1bnNpZ25lZCBpbnQJCW5yX3BhcnRzOwogCXN0cnVjdCBzYV9zdWJkZXZfaW5mbwlzdWJkZXZbMF07CiB9OwogCkBAIC0yMzEsOCArMjI5LDYgQEAKIAkJCW10ZF9jb25jYXRfZGVzdHJveShpbmZvLT5tdGQpOwogCX0KIAotCWtmcmVlKGluZm8tPnBhcnRzKTsKLQogCWZvciAoaSA9IGluZm8tPm51bV9zdWJkZXYgLSAxOyBpID49IDA7IGktLSkKIAkJc2ExMTAwX2Rlc3Ryb3lfc3ViZGV2KCZpbmZvLT5zdWJkZXZbaV0pOwogCWtmcmVlKGluZm8pOwpAQCAtMzQxLDEwICszMzcsOCBAQAogc3RhdGljIGludCBfX2RldmluaXQgc2ExMTAwX210ZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhICpwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCWNvbnN0IGNoYXIgKnBhcnRfdHlwZSA9IE5VTEw7CiAJc3RydWN0IHNhX2luZm8gKmluZm87Ci0JaW50IGVyciwgbnJfcGFydHMgPSAwOworCWludCBlcnI7CiAKIAlpZiAoIXBsYXQpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMzU4LDI2ICszNTIsOCBAQAogCS8qCiAJICogUGFydGl0aW9uIHNlbGVjdGlvbiBzdHVmZi4KIAkgKi8KLQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcGFydF9wcm9iZXMsICZwYXJ0cywgMCk7Ci0JaWYgKG5yX3BhcnRzID4gMCkgewotCQlpbmZvLT5wYXJ0cyA9IHBhcnRzOwotCQlwYXJ0X3R5cGUgPSAiZHluYW1pYyI7Ci0JfSBlbHNlIHsKLQkJcGFydHMgPSBwbGF0LT5wYXJ0czsKLQkJbnJfcGFydHMgPSBwbGF0LT5ucl9wYXJ0czsKLQkJcGFydF90eXBlID0gInN0YXRpYyI7Ci0JfQotCi0JaWYgKG5yX3BhcnRzID09IDApCi0JCXByaW50ayhLRVJOX05PVElDRSAiU0ExMTAwIGZsYXNoOiBubyBwYXJ0aXRpb24gaW5mbyAiCi0JCQkiYXZhaWxhYmxlLCByZWdpc3RlcmluZyB3aG9sZSBmbGFzaFxuIik7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNBMTEwMCBmbGFzaDogdXNpbmcgJXMgcGFydGl0aW9uICIKLQkJCSJkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOwotCi0JbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIHBhcnRzLCBucl9wYXJ0cyk7Ci0KLQlpbmZvLT5ucl9wYXJ0cyA9IG5yX3BhcnRzOworCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBwYXJ0X3Byb2JlcywgMCwKKwkJCXBsYXQtPnBhcnRzLCBwbGF0LT5ucl9wYXJ0cyk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKIAllcnIgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9zb2x1dGlvbmVuZ2luZS5jIGIvZHJpdmVycy9tdGQvbWFwcy9zb2x1dGlvbmVuZ2luZS5jCmluZGV4IGNiZjZiYWQuLjQ5NmM0MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvc29sdXRpb25lbmdpbmUuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3NvbHV0aW9uZW5naW5lLmMKQEAgLTE5LDggKzE5LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKmZsYXNoX210ZDsKIHN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKmVwcm9tX210ZDsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJzZWRfcGFydHM7Ci0KIHN0cnVjdCBtYXBfaW5mbyBzb2xlbmdfZXByb21fbWFwID0gewogCS5uYW1lID0gIlNvbHV0aW9uIEVuZ2luZSBFUFJPTSIsCiAJLnNpemUgPSAweDQwMDAwMCwKQEAgLTUxLDEyICs0OSwxNCBAQAogCQkuc2l6ZSA9IE1URFBBUlRfU0laX0ZVTEwsCiAJfQogfTsKKyNkZWZpbmUgTlVNX1BBUlRJVElPTlMgQVJSQVlfU0laRShzdXBlcmhfc2VfcGFydGl0aW9ucykKKyNlbHNlCisjZGVmaW5lIHN1cGVyaF9zZV9wYXJ0aXRpb25zIE5VTEwKKyNkZWZpbmUgTlVNX1BBUlRJVElPTlMgMAogI2VuZGlmIC8qIENPTkZJR19NVERfU1VQRVJIX1JFU0VSVkUgKi8KIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9zb2xlbmdfbWFwcyh2b2lkKQogewotCWludCBucl9wYXJ0cyA9IDA7Ci0KIAkvKiBGaXJzdCBwcm9iZSBhdCBvZmZzZXQgMCAqLwogCXNvbGVuZ19mbGFzaF9tYXAucGh5cyA9IDA7CiAJc29sZW5nX2ZsYXNoX21hcC52aXJ0ID0gKHZvaWQgX19pb21lbSAqKVAyU0VHQUREUigwKTsKQEAgLTkyLDIxICs5Miw4IEBACiAJCW10ZF9kZXZpY2VfcmVnaXN0ZXIoZXByb21fbXRkLCBOVUxMLCAwKTsKIAl9CiAKLQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGZsYXNoX210ZCwgcHJvYmVzLCAmcGFyc2VkX3BhcnRzLCAwKTsKLQotI2lmZGVmIENPTkZJR19NVERfU1VQRVJIX1JFU0VSVkUKLQlpZiAobnJfcGFydHMgPD0gMCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nIGNvbmZpZ3VyZWQgcGFydGl0aW9uIGF0IDB4JTA4eC5cbiIsCi0JCSAgICAgICBDT05GSUdfTVREX1NVUEVSSF9SRVNFUlZFKTsKLQkJcGFyc2VkX3BhcnRzID0gc3VwZXJoX3NlX3BhcnRpdGlvbnM7Ci0JCW5yX3BhcnRzID0gc2l6ZW9mKHN1cGVyaF9zZV9wYXJ0aXRpb25zKS9zaXplb2YoKnBhcnNlZF9wYXJ0cyk7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19NVERfU1VQRVJIX1JFU0VSVkUgKi8KLQotCWlmIChucl9wYXJ0cyA+IDApCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoZmxhc2hfbXRkLCBwYXJzZWRfcGFydHMsIG5yX3BhcnRzKTsKLQllbHNlCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoZmxhc2hfbXRkLCBOVUxMLCAwKTsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGZsYXNoX210ZCwgcHJvYmVzLCAwLAorCQkJc3VwZXJoX3NlX3BhcnRpdGlvbnMsIE5VTV9QQVJUSVRJT05TKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE4LDEwICsxMDUsNyBAQAogCQltYXBfZGVzdHJveShlcHJvbV9tdGQpOwogCX0KIAotCWlmIChwYXJzZWRfcGFydHMpCi0JCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihmbGFzaF9tdGQpOwotCWVsc2UKLQkJbXRkX2RldmljZV91bnJlZ2lzdGVyKGZsYXNoX210ZCk7CisJbXRkX2RldmljZV91bnJlZ2lzdGVyKGZsYXNoX210ZCk7CiAJbWFwX2Rlc3Ryb3koZmxhc2hfbXRkKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy93cl9zYmM4Mnh4X2ZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3dyX3NiYzgyeHhfZmxhc2guYwppbmRleCA5MDFjZTk2Li5hYTdlMGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3dyX3NiYzgyeHhfZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3dyX3NiYzgyeHhfZmxhc2guYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGFzbS9pbW1hcF9jcG0yLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKnNiY210ZFszXTsKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqc2JjbXRkX3BhcnRzWzNdOwogCiBzdHJ1Y3QgbWFwX2luZm8gc2JjODJ4eF9mbGFzaF9tYXBbM10gPSB7CiAJey5uYW1lID0gIkJvb3QgZmxhc2gifSwKQEAgLTEwMSw2ICsxMDAsNyBAQAogCWZvciAoaT0wOyBpPDM7IGkrKykgewogCQlpbnQ4X3QgZmxhc2hjc1szXSA9IHsgMCwgNiwgMSB9OwogCQlpbnQgbnJfcGFydHM7CisJCXN0cnVjdCBtdGRfcGFydGl0aW9uICpkZWZwYXJ0czsKIAogCQlwcmludGsoS0VSTl9OT1RJQ0UgIlBvd2VyUVVJQ0MgSUkgJXMgKCVsZCBNaUIgb24gQ1MlZCIsCiAJCSAgICAgICBzYmM4Mnh4X2ZsYXNoX21hcFtpXS5uYW1lLApAQCAtMTEzLDcgKzExMyw4IEBACiAJCX0KIAkJcHJpbnRrKCIgYXQgJTA4bHgpXG4iLCAgc2JjODJ4eF9mbGFzaF9tYXBbaV0ucGh5cyk7CiAKLQkJc2JjODJ4eF9mbGFzaF9tYXBbaV0udmlydCA9IGlvcmVtYXAoc2JjODJ4eF9mbGFzaF9tYXBbaV0ucGh5cywgc2JjODJ4eF9mbGFzaF9tYXBbaV0uc2l6ZSk7CisJCXNiYzgyeHhfZmxhc2hfbWFwW2ldLnZpcnQgPSBpb3JlbWFwKHNiYzgyeHhfZmxhc2hfbWFwW2ldLnBoeXMsCisJCQkJCQkgICAgc2JjODJ4eF9mbGFzaF9tYXBbaV0uc2l6ZSk7CiAKIAkJaWYgKCFzYmM4Mnh4X2ZsYXNoX21hcFtpXS52aXJ0KSB7CiAJCQlwcmludGsoIkZhaWxlZCB0byBpb3JlbWFwXG4iKTsKQEAgLTEyOSwyNCArMTMwLDIwIEBACiAKIAkJc2JjbXRkW2ldLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoc2JjbXRkW2ldLCBwYXJ0X3Byb2JlcywKLQkJCQkJCSZzYmNtdGRfcGFydHNbaV0sIDApOwotCQlpZiAobnJfcGFydHMgPiAwKSB7Ci0JCQltdGRfZGV2aWNlX3JlZ2lzdGVyKHNiY210ZFtpXSwgc2JjbXRkX3BhcnRzW2ldLAotCQkJCQkgICAgbnJfcGFydHMpOwotCQkJY29udGludWU7Ci0JCX0KLQogCQkvKiBObyBwYXJ0aXRpb25pbmcgZGV0ZWN0ZWQuIFVzZSBkZWZhdWx0ICovCiAJCWlmIChpID09IDIpIHsKLQkJCW10ZF9kZXZpY2VfcmVnaXN0ZXIoc2JjbXRkW2ldLCBOVUxMLCAwKTsKKwkJCWRlZnBhcnRzID0gTlVMTDsKKwkJCW5yX3BhcnRzID0gMDsKIAkJfSBlbHNlIGlmIChpID09IGJpZ2ZsYXNoKSB7Ci0JCQltdGRfZGV2aWNlX3JlZ2lzdGVyKHNiY210ZFtpXSwgYmlnZmxhc2hfcGFydHMsCi0JCQkJCSAgICBBUlJBWV9TSVpFKGJpZ2ZsYXNoX3BhcnRzKSk7CisJCQlkZWZwYXJ0cyA9IGJpZ2ZsYXNoX3BhcnRzOworCQkJbnJfcGFydHMgPSBBUlJBWV9TSVpFKGJpZ2ZsYXNoX3BhcnRzKTsKIAkJfSBlbHNlIHsKLQkJCW10ZF9kZXZpY2VfcmVnaXN0ZXIoc2JjbXRkW2ldLCBzbWFsbGZsYXNoX3BhcnRzLAotCQkJCQkgICAgQVJSQVlfU0laRShzbWFsbGZsYXNoX3BhcnRzKSk7CisJCQlkZWZwYXJ0cyA9IHNtYWxsZmxhc2hfcGFydHM7CisJCQlucl9wYXJ0cyA9IEFSUkFZX1NJWkUoc21hbGxmbGFzaF9wYXJ0cyk7CiAJCX0KKworCQltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKHNiY210ZFtpXSwgcGFydF9wcm9iZXMsIDAsCisJCQkJCSAgZGVmcGFydHMsIG5yX3BhcnRzKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNTksMTIgKzE1Niw4IEBACiAJCWlmICghc2JjbXRkW2ldKQogCQkJY29udGludWU7CiAKLQkJaWYgKGk8MiB8fCBzYmNtdGRfcGFydHNbaV0pCi0JCQltdGRfZGV2aWNlX3VucmVnaXN0ZXIoc2JjbXRkW2ldKTsKLQkJZWxzZQotCQkJbXRkX2RldmljZV91bnJlZ2lzdGVyKHNiY210ZFtpXSk7CisJCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihzYmNtdGRbaV0pOwogCi0JCWtmcmVlKHNiY210ZF9wYXJ0c1tpXSk7CiAJCW1hcF9kZXN0cm95KHNiY210ZFtpXSk7CiAKIAkJaW91bm1hcCgodm9pZCAqKXNiYzgyeHhfZmxhc2hfbWFwW2ldLnZpcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYyBiL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKaW5kZXggY2EzODU2OS4uZWQ4YjVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYworKysgYi9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCkBAIC00MjYsNiArNDI2LDggQEAKIAluZXctPnJxLT5xdWV1ZWRhdGEgPSBuZXc7CiAJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShuZXctPnJxLCB0ci0+Ymxrc2l6ZSk7CiAKKwlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX05PTlJPVCwgbmV3LT5ycSk7CisKIAlpZiAodHItPmRpc2NhcmQpIHsKIAkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELCBuZXctPnJxKTsKIAkJbmV3LT5ycS0+bGltaXRzLm1heF9kaXNjYXJkX3NlY3RvcnMgPSBVSU5UX01BWDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGJsb2NrLmMgYi9kcml2ZXJzL210ZC9tdGRibG9jay5jCmluZGV4IDMzMjY2MTUuLjdjMWRjOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZGJsb2NrLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkYmxvY2suYwpAQCAtNDQsNyArNDQsNyBAQAogCWVudW0geyBTVEFURV9FTVBUWSwgU1RBVEVfQ0xFQU4sIFNUQVRFX0RJUlRZIH0gY2FjaGVfc3RhdGU7CiB9OwogCi1zdGF0aWMgc3RydWN0IG11dGV4IG10ZGJsa3NfbG9jazsKK3N0YXRpYyBERUZJTkVfTVVURVgobXRkYmxrc19sb2NrKTsKIAogLyoKICAqIENhY2hlIHN0dWZmLi4uCkBAIC0xMTksNyArMTE5LDcgQEAKIAlpZiAobXRkYmxrLT5jYWNoZV9zdGF0ZSAhPSBTVEFURV9ESVJUWSkKIAkJcmV0dXJuIDA7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAibXRkYmxvY2s6IHdyaXRpbmcgY2FjaGVkIGRhdGEgZm9yIFwiJXNcIiAiCisJcHJfZGVidWcoIm10ZGJsb2NrOiB3cml0aW5nIGNhY2hlZCBkYXRhIGZvciBcIiVzXCIgIgogCQkJImF0IDB4JWx4LCBzaXplIDB4JXhcbiIsIG10ZC0+bmFtZSwKIAkJCW10ZGJsay0+Y2FjaGVfb2Zmc2V0LCBtdGRibGstPmNhY2hlX3NpemUpOwogCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlzaXplX3QgcmV0bGVuOwogCWludCByZXQ7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAibXRkYmxvY2s6IHdyaXRlIG9uIFwiJXNcIiBhdCAweCVseCwgc2l6ZSAweCV4XG4iLAorCXByX2RlYnVnKCJtdGRibG9jazogd3JpdGUgb24gXCIlc1wiIGF0IDB4JWx4LCBzaXplIDB4JXhcbiIsCiAJCW10ZC0+bmFtZSwgcG9zLCBsZW4pOwogCiAJaWYgKCFzZWN0X3NpemUpCkBAIC0yMTgsNyArMjE4LDcgQEAKIAlzaXplX3QgcmV0bGVuOwogCWludCByZXQ7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAibXRkYmxvY2s6IHJlYWQgb24gXCIlc1wiIGF0IDB4JWx4LCBzaXplIDB4JXhcbiIsCisJcHJfZGVidWcoIm10ZGJsb2NrOiByZWFkIG9uIFwiJXNcIiBhdCAweCVseCwgc2l6ZSAweCV4XG4iLAogCQkJbXRkLT5uYW1lLCBwb3MsIGxlbik7CiAKIAlpZiAoIXNlY3Rfc2l6ZSkKQEAgLTI4Myw3ICsyODMsNyBAQAogewogCXN0cnVjdCBtdGRibGtfZGV2ICptdGRibGsgPSBjb250YWluZXJfb2YobWJkLCBzdHJ1Y3QgbXRkYmxrX2RldiwgbWJkKTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsIm10ZGJsb2NrX29wZW5cbiIpOworCXByX2RlYnVnKCJtdGRibG9ja19vcGVuXG4iKTsKIAogCW11dGV4X2xvY2soJm10ZGJsa3NfbG9jayk7CiAJaWYgKG10ZGJsay0+Y291bnQpIHsKQEAgLTMwMyw3ICszMDMsNyBAQAogCiAJbXV0ZXhfdW5sb2NrKCZtdGRibGtzX2xvY2spOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIm9rXG4iKTsKKwlwcl9kZWJ1Zygib2tcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMTIsNyArMzEyLDcgQEAKIHsKIAlzdHJ1Y3QgbXRkYmxrX2RldiAqbXRkYmxrID0gY29udGFpbmVyX29mKG1iZCwgc3RydWN0IG10ZGJsa19kZXYsIG1iZCk7CiAKLSAgIAlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAibXRkYmxvY2tfcmVsZWFzZVxuIik7CisJcHJfZGVidWcoIm10ZGJsb2NrX3JlbGVhc2VcbiIpOwogCiAJbXV0ZXhfbG9jaygmbXRkYmxrc19sb2NrKTsKIApAQCAtMzI5LDcgKzMyOSw3IEBACiAKIAltdXRleF91bmxvY2soJm10ZGJsa3NfbG9jayk7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAib2tcbiIpOworCXByX2RlYnVnKCJva1xuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM4OSw4ICszODksNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X210ZGJsb2NrKHZvaWQpCiB7Ci0JbXV0ZXhfaW5pdCgmbXRkYmxrc19sb2NrKTsKLQogCXJldHVybiByZWdpc3Rlcl9tdGRfYmxrdHJhbnMoJm10ZGJsb2NrX3RyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkYmxvY2tfcm8uYyBiL2RyaXZlcnMvbXRkL210ZGJsb2NrX3JvLmMKaW5kZXggNzk1YThjMC4uMDQ3MGE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkYmxvY2tfcm8uYworKysgYi9kcml2ZXJzL210ZC9tdGRibG9ja19yby5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvYmxrdHJhbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIGludCBtdGRibG9ja19yZWFkc2VjdChzdHJ1Y3QgbXRkX2Jsa3RyYW5zX2RldiAqZGV2LAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBibG9jaywgY2hhciAqYnVmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkY2hhci5jIGIvZHJpdmVycy9tdGQvbXRkY2hhci5jCmluZGV4IGYxYWYyMjIuLmU3ZGM3MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZGNoYXIuYworKysgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAogLyoKICAqIERhdGEgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlIG10ZCBkZXZpY2UgYXMgd2VsbAotICogYXMgbW9kZSBpbmZvcm1hdGlvbiBvZnIgdmFyaW91cyB1c2UgY2FzZXMuCisgKiBhcyBtb2RlIGluZm9ybWF0aW9uIG9mIHZhcmlvdXMgdXNlIGNhc2VzLgogICovCiBzdHJ1Y3QgbXRkX2ZpbGVfaW5mbyB7CiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CkBAIC04Niw3ICs4Niw3IEBACiAJc3RydWN0IG10ZF9maWxlX2luZm8gKm1maTsKIAlzdHJ1Y3QgaW5vZGUgKm10ZF9pbm87CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiTVREX29wZW5cbiIpOworCXByX2RlYnVnKCJNVERfb3BlblxuIik7CiAKIAkvKiBZb3UgY2FuJ3Qgb3BlbiB0aGUgUk8gZGV2aWNlcyBSVyAqLwogCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChtaW5vciAmIDEpKQpAQCAtMTUxLDcgKzE1MSw3IEBACiAJc3RydWN0IG10ZF9maWxlX2luZm8gKm1maSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG1maS0+bXRkOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIk1URF9jbG9zZVxuIik7CisJcHJfZGVidWcoIk1URF9jbG9zZVxuIik7CiAKIAkvKiBPbmx5IHN5bmMgaWYgb3BlbmVkIFJXICovCiAJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgbXRkLT5zeW5jKQpAQCAtMTk1LDcgKzE5NSw3IEBACiAJc2l6ZV90IHNpemUgPSBjb3VudDsKIAljaGFyICprYnVmOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMCwiTVREX3JlYWRcbiIpOworCXByX2RlYnVnKCJNVERfcmVhZFxuIik7CiAKIAlpZiAoKnBwb3MgKyBjb3VudCA+IG10ZC0+c2l6ZSkKIAkJY291bnQgPSBtdGQtPnNpemUgLSAqcHBvczsKQEAgLTIxMSwxNyArMjExLDE3IEBACiAJCWxlbiA9IG1pbl90KHNpemVfdCwgY291bnQsIHNpemUpOwogCiAJCXN3aXRjaCAobWZpLT5tb2RlKSB7Ci0JCWNhc2UgTVREX01PREVfT1RQX0ZBQ1RPUlk6CisJCWNhc2UgTVREX0ZJTEVfTU9ERV9PVFBfRkFDVE9SWToKIAkJCXJldCA9IG10ZC0+cmVhZF9mYWN0X3Byb3RfcmVnKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CiAJCQlicmVhazsKLQkJY2FzZSBNVERfTU9ERV9PVFBfVVNFUjoKKwkJY2FzZSBNVERfRklMRV9NT0RFX09UUF9VU0VSOgogCQkJcmV0ID0gbXRkLT5yZWFkX3VzZXJfcHJvdF9yZWcobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKIAkJCWJyZWFrOwotCQljYXNlIE1URF9NT0RFX1JBVzoKKwkJY2FzZSBNVERfRklMRV9NT0RFX1JBVzoKIAkJewogCQkJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAotCQkJb3BzLm1vZGUgPSBNVERfT09CX1JBVzsKKwkJCW9wcy5tb2RlID0gTVREX09QU19SQVc7CiAJCQlvcHMuZGF0YnVmID0ga2J1ZjsKIAkJCW9wcy5vb2JidWYgPSBOVUxMOwogCQkJb3BzLmxlbiA9IGxlbjsKQEAgLTIzMywxNiArMjMzLDE2IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXQgPSBtdGQtPnJlYWQobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKIAkJfQotCQkvKiBOYW5kIHJldHVybnMgLUVCQURNU0cgb24gZWNjIGVycm9ycywgYnV0IGl0IHJldHVybnMKKwkJLyogTmFuZCByZXR1cm5zIC1FQkFETVNHIG9uIEVDQyBlcnJvcnMsIGJ1dCBpdCByZXR1cm5zCiAJCSAqIHRoZSBkYXRhLiBGb3Igb3VyIHVzZXJzcGFjZSB0b29scyBpdCBpcyBpbXBvcnRhbnQKLQkJICogdG8gZHVtcCBhcmVhcyB3aXRoIGVjYyBlcnJvcnMgIQorCQkgKiB0byBkdW1wIGFyZWFzIHdpdGggRUNDIGVycm9ycyEKIAkJICogRm9yIGtlcm5lbCBpbnRlcm5hbCB1c2FnZSBpdCBhbHNvIG1pZ2h0IHJldHVybiAtRVVDTEVBTgogCQkgKiB0byBzaWduYWwgdGhlIGNhbGxlciB0aGF0IGEgYml0ZmxpcCBoYXMgb2NjdXJyZWQgYW5kIGhhcwogCQkgKiBiZWVuIGNvcnJlY3RlZCBieSB0aGUgRUNDIGFsZ29yaXRobS4KIAkJICogVXNlcnNwYWNlIHNvZnR3YXJlIHdoaWNoIGFjY2Vzc2VzIE5BTkQgdGhpcyB3YXkKIAkJICogbXVzdCBiZSBhd2FyZSBvZiB0aGUgZmFjdCB0aGF0IGl0IGRlYWxzIHdpdGggTkFORAogCQkgKi8KLQkJaWYgKCFyZXQgfHwgKHJldCA9PSAtRVVDTEVBTikgfHwgKHJldCA9PSAtRUJBRE1TRykpIHsKKwkJaWYgKCFyZXQgfHwgbXRkX2lzX2JpdGZsaXBfb3JfZWNjZXJyKHJldCkpIHsKIAkJCSpwcG9zICs9IHJldGxlbjsKIAkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBrYnVmLCByZXRsZW4pKSB7CiAJCQkJa2ZyZWUoa2J1Zik7CkBAIC0yNzgsNyArMjc4LDcgQEAKIAlpbnQgcmV0PTA7CiAJaW50IGxlbjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDAsIk1URF93cml0ZVxuIik7CisJcHJfZGVidWcoIk1URF93cml0ZVxuIik7CiAKIAlpZiAoKnBwb3MgPT0gbXRkLT5zaXplKQogCQlyZXR1cm4gLUVOT1NQQzsKQEAgLTMwMiwxMCArMzAyLDEwIEBACiAJCX0KIAogCQlzd2l0Y2ggKG1maS0+bW9kZSkgewotCQljYXNlIE1URF9NT0RFX09UUF9GQUNUT1JZOgorCQljYXNlIE1URF9GSUxFX01PREVfT1RQX0ZBQ1RPUlk6CiAJCQlyZXQgPSAtRVJPRlM7CiAJCQlicmVhazsKLQkJY2FzZSBNVERfTU9ERV9PVFBfVVNFUjoKKwkJY2FzZSBNVERfRklMRV9NT0RFX09UUF9VU0VSOgogCQkJaWYgKCFtdGQtPndyaXRlX3VzZXJfcHJvdF9yZWcpIHsKIAkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAkJCQlicmVhazsKQEAgLTMxMywxMyArMzEzLDE0IEBACiAJCQlyZXQgPSBtdGQtPndyaXRlX3VzZXJfcHJvdF9yZWcobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgTVREX01PREVfUkFXOgorCQljYXNlIE1URF9GSUxFX01PREVfUkFXOgogCQl7CiAJCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCi0JCQlvcHMubW9kZSA9IE1URF9PT0JfUkFXOworCQkJb3BzLm1vZGUgPSBNVERfT1BTX1JBVzsKIAkJCW9wcy5kYXRidWYgPSBrYnVmOwogCQkJb3BzLm9vYmJ1ZiA9IE5VTEw7CisJCQlvcHMub29ib2ZmcyA9IDA7CiAJCQlvcHMubGVuID0gbGVuOwogCiAJCQlyZXQgPSBtdGQtPndyaXRlX29vYihtdGQsICpwcG9zLCAmb3BzKTsKQEAgLTM2NywxMyArMzY4LDEzIEBACiAJCWlmICghbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcpCiAJCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAkJZWxzZQotCQkJbWZpLT5tb2RlID0gTVREX01PREVfT1RQX0ZBQ1RPUlk7CisJCQltZmktPm1vZGUgPSBNVERfRklMRV9NT0RFX09UUF9GQUNUT1JZOwogCQlicmVhazsKIAljYXNlIE1URF9PVFBfVVNFUjoKIAkJaWYgKCFtdGQtPnJlYWRfZmFjdF9wcm90X3JlZykKIAkJCXJldCA9IC1FT1BOT1RTVVBQOwogCQllbHNlCi0JCQltZmktPm1vZGUgPSBNVERfTU9ERV9PVFBfVVNFUjsKKwkJCW1maS0+bW9kZSA9IE1URF9GSUxFX01PREVfT1RQX1VTRVI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0zOTAsNiArMzkxLDcgQEAKIAl1aW50NjRfdCBzdGFydCwgdWludDMyX3QgbGVuZ3RoLCB2b2lkIF9fdXNlciAqcHRyLAogCXVpbnQzMl90IF9fdXNlciAqcmV0cCkKIHsKKwlzdHJ1Y3QgbXRkX2ZpbGVfaW5mbyAqbWZpID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJdWludDMyX3QgcmV0bGVuOwogCWludCByZXQgPSAwOwpAQCAtNDA5LDkgKzQxMSwxMCBAQAogCQlyZXR1cm4gcmV0OwogCiAJb3BzLm9vYmxlbiA9IGxlbmd0aDsKLQlvcHMub29ib2ZmcyA9IHN0YXJ0ICYgKG10ZC0+b29ic2l6ZSAtIDEpOworCW9wcy5vb2JvZmZzID0gc3RhcnQgJiAobXRkLT53cml0ZXNpemUgLSAxKTsKIAlvcHMuZGF0YnVmID0gTlVMTDsKLQlvcHMubW9kZSA9IE1URF9PT0JfUExBQ0U7CisJb3BzLm1vZGUgPSAobWZpLT5tb2RlID09IE1URF9GSUxFX01PREVfUkFXKSA/IE1URF9PUFNfUkFXIDoKKwkJTVREX09QU19QTEFDRV9PT0I7CiAKIAlpZiAob3BzLm9vYm9mZnMgJiYgb3BzLm9vYmxlbiA+IChtdGQtPm9vYnNpemUgLSBvcHMub29ib2ZmcykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDIwLDcgKzQyMyw3IEBACiAJaWYgKElTX0VSUihvcHMub29iYnVmKSkKIAkJcmV0dXJuIFBUUl9FUlIob3BzLm9vYmJ1Zik7CiAKLQlzdGFydCAmPSB+KCh1aW50NjRfdCltdGQtPm9vYnNpemUgLSAxKTsKKwlzdGFydCAmPSB+KCh1aW50NjRfdCltdGQtPndyaXRlc2l6ZSAtIDEpOwogCXJldCA9IG10ZC0+d3JpdGVfb29iKG10ZCwgc3RhcnQsICZvcHMpOwogCiAJaWYgKG9wcy5vb2JyZXRsZW4gPiAweEZGRkZGRkZGVSkKQEAgLTQzMyw5ICs0MzYsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10ZF9kb19yZWFkb29iKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50NjRfdCBzdGFydCwKLQl1aW50MzJfdCBsZW5ndGgsIHZvaWQgX191c2VyICpwdHIsIHVpbnQzMl90IF9fdXNlciAqcmV0cCkKK3N0YXRpYyBpbnQgbXRkX2RvX3JlYWRvb2Ioc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCXVpbnQ2NF90IHN0YXJ0LCB1aW50MzJfdCBsZW5ndGgsIHZvaWQgX191c2VyICpwdHIsCisJdWludDMyX3QgX191c2VyICpyZXRwKQogeworCXN0cnVjdCBtdGRfZmlsZV9pbmZvICptZmkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmV0ID0gMDsKIApAQCAtNDUxLDkgKzQ1NiwxMCBAQAogCQlyZXR1cm4gcmV0OwogCiAJb3BzLm9vYmxlbiA9IGxlbmd0aDsKLQlvcHMub29ib2ZmcyA9IHN0YXJ0ICYgKG10ZC0+b29ic2l6ZSAtIDEpOworCW9wcy5vb2JvZmZzID0gc3RhcnQgJiAobXRkLT53cml0ZXNpemUgLSAxKTsKIAlvcHMuZGF0YnVmID0gTlVMTDsKLQlvcHMubW9kZSA9IE1URF9PT0JfUExBQ0U7CisJb3BzLm1vZGUgPSAobWZpLT5tb2RlID09IE1URF9GSUxFX01PREVfUkFXKSA/IE1URF9PUFNfUkFXIDoKKwkJTVREX09QU19QTEFDRV9PT0I7CiAKIAlpZiAob3BzLm9vYm9mZnMgJiYgb3BzLm9vYmxlbiA+IChtdGQtPm9vYnNpemUgLSBvcHMub29ib2ZmcykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDYyLDcgKzQ2OCw3IEBACiAJaWYgKCFvcHMub29iYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXN0YXJ0ICY9IH4oKHVpbnQ2NF90KW10ZC0+b29ic2l6ZSAtIDEpOworCXN0YXJ0ICY9IH4oKHVpbnQ2NF90KW10ZC0+d3JpdGVzaXplIC0gMSk7CiAJcmV0ID0gbXRkLT5yZWFkX29vYihtdGQsIHN0YXJ0LCAmb3BzKTsKIAogCWlmIChwdXRfdXNlcihvcHMub29icmV0bGVuLCByZXRwKSkKQEAgLTQ3MiwxMyArNDc4LDI5IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIAlrZnJlZShvcHMub29iYnVmKTsKKworCS8qCisJICogTkFORCByZXR1cm5zIC1FQkFETVNHIG9uIEVDQyBlcnJvcnMsIGJ1dCBpdCByZXR1cm5zIHRoZSBPT0IKKwkgKiBkYXRhLiBGb3Igb3VyIHVzZXJzcGFjZSB0b29scyBpdCBpcyBpbXBvcnRhbnQgdG8gZHVtcCBhcmVhcworCSAqIHdpdGggRUNDIGVycm9ycyEKKwkgKiBGb3Iga2VybmVsIGludGVybmFsIHVzYWdlIGl0IGFsc28gbWlnaHQgcmV0dXJuIC1FVUNMRUFOCisJICogdG8gc2lnbmFsIHRoZSBjYWxsZXIgdGhhdCBhIGJpdGZsaXAgaGFzIG9jY3VyZWQgYW5kIGhhcworCSAqIGJlZW4gY29ycmVjdGVkIGJ5IHRoZSBFQ0MgYWxnb3JpdGhtLgorCSAqCisJICogTm90ZTogY3VycmVudGx5IHRoZSBzdGFuZGFyZCBOQU5EIGZ1bmN0aW9uLCBuYW5kX3JlYWRfb29iX3N0ZCwKKwkgKiBkb2VzIG5vdCBjYWxjdWxhdGUgRUNDIGZvciB0aGUgT09CIGFyZWEsIHNvIGRvIG5vdCByZWx5IG9uCisJICogdGhpcyBiZWhhdmlvciB1bmxlc3MgeW91IGhhdmUgcmVwbGFjZWQgaXQgd2l0aCB5b3VyIG93bi4KKwkgKi8KKwlpZiAobXRkX2lzX2JpdGZsaXBfb3JfZWNjZXJyKHJldCkpCisJCXJldHVybiAwOworCiAJcmV0dXJuIHJldDsKIH0KIAogLyoKICAqIENvcGllcyAoYW5kIHRydW5jYXRlcywgaWYgbmVjZXNzYXJ5KSBkYXRhIGZyb20gdGhlIGxhcmdlciBzdHJ1Y3QsCiAgKiBuYW5kX2VjY2xheW91dCwgdG8gdGhlIHNtYWxsZXIsIGRlcHJlY2F0ZWQgbGF5b3V0IHN0cnVjdCwKLSAqIG5hbmRfZWNjbGF5b3V0X3VzZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgdG8gc3VwcHBvcnQgdGhlIGRlcHJlY2F0ZWQKKyAqIG5hbmRfZWNjbGF5b3V0X3VzZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgdG8gc3VwcG9ydCB0aGUgZGVwcmVjYXRlZAogICogQVBJIGlvY3RsIEVDQ0dFVExBWU9VVCB3aGlsZSBhbGxvd2luZyBhbGwgbmV3IGZ1bmN0aW9uYWxpdHkgdG8gdXNlCiAgKiBuYW5kX2VjY2xheW91dCBmbGV4aWJseSAoaS5lLiB0aGUgc3RydWN0IG1heSBjaGFuZ2Ugc2l6ZSBpbiBuZXcKICAqIHJlbGVhc2VzIHdpdGhvdXQgcmVxdWlyaW5nIG1ham9yIHJld3JpdGVzKS4KQEAgLTU0NCw2ICs1NjYsNTUgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgbXRkX3dyaXRlX2lvY3RsKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQlzdHJ1Y3QgbXRkX3dyaXRlX3JlcSBfX3VzZXIgKmFyZ3ApCit7CisJc3RydWN0IG10ZF93cml0ZV9yZXEgcmVxOworCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CisJdm9pZCBfX3VzZXIgKnVzcl9kYXRhLCAqdXNyX29vYjsKKwlpbnQgcmV0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZ3AsIHNpemVvZihyZXEpKSB8fAorCQkJIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgcmVxLnVzcl9kYXRhLCByZXEubGVuKSB8fAorCQkJIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgcmVxLnVzcl9vb2IsIHJlcS5vb2JsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIW10ZC0+d3JpdGVfb29iKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlvcHMubW9kZSA9IHJlcS5tb2RlOworCW9wcy5sZW4gPSAoc2l6ZV90KXJlcS5sZW47CisJb3BzLm9vYmxlbiA9IChzaXplX3QpcmVxLm9vYmxlbjsKKwlvcHMub29ib2ZmcyA9IDA7CisKKwl1c3JfZGF0YSA9ICh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3QpcmVxLnVzcl9kYXRhOworCXVzcl9vb2IgPSAodm9pZCBfX3VzZXIgKikodWludHB0cl90KXJlcS51c3Jfb29iOworCisJaWYgKHJlcS51c3JfZGF0YSkgeworCQlvcHMuZGF0YnVmID0gbWVtZHVwX3VzZXIodXNyX2RhdGEsIG9wcy5sZW4pOworCQlpZiAoSVNfRVJSKG9wcy5kYXRidWYpKQorCQkJcmV0dXJuIFBUUl9FUlIob3BzLmRhdGJ1Zik7CisJfSBlbHNlIHsKKwkJb3BzLmRhdGJ1ZiA9IE5VTEw7CisJfQorCisJaWYgKHJlcS51c3Jfb29iKSB7CisJCW9wcy5vb2JidWYgPSBtZW1kdXBfdXNlcih1c3Jfb29iLCBvcHMub29ibGVuKTsKKwkJaWYgKElTX0VSUihvcHMub29iYnVmKSkgeworCQkJa2ZyZWUob3BzLmRhdGJ1Zik7CisJCQlyZXR1cm4gUFRSX0VSUihvcHMub29iYnVmKTsKKwkJfQorCX0gZWxzZSB7CisJCW9wcy5vb2JidWYgPSBOVUxMOworCX0KKworCXJldCA9IG10ZC0+d3JpdGVfb29iKG10ZCwgKGxvZmZfdClyZXEuc3RhcnQsICZvcHMpOworCisJa2ZyZWUob3BzLmRhdGJ1Zik7CisJa2ZyZWUob3BzLm9vYmJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG10ZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQogewogCXN0cnVjdCBtdGRfZmlsZV9pbmZvICptZmkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CkBAIC01NTMsNyArNjI0LDcgQEAKIAl1X2xvbmcgc2l6ZTsKIAlzdHJ1Y3QgbXRkX2luZm9fdXNlciBpbmZvOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIk1URF9pb2N0bFxuIik7CisJcHJfZGVidWcoIk1URF9pb2N0bFxuIik7CiAKIAlzaXplID0gKGNtZCAmIElPQ1NJWkVfTUFTSykgPj4gSU9DU0laRV9TSElGVDsKIAlpZiAoY21kICYgSU9DX0lOKSB7CkBAIC02MDEsOCArNjcyLDggQEAKIAkJaW5mby5lcmFzZXNpemUJPSBtdGQtPmVyYXNlc2l6ZTsKIAkJaW5mby53cml0ZXNpemUJPSBtdGQtPndyaXRlc2l6ZTsKIAkJaW5mby5vb2JzaXplCT0gbXRkLT5vb2JzaXplOwotCQkvKiBUaGUgYmVsb3cgZmllbGRzIGFyZSBvYnNvbGV0ZSAqLwotCQlpbmZvLmVjY3R5cGUJPSAtMTsKKwkJLyogVGhlIGJlbG93IGZpZWxkIGlzIG9ic29sZXRlICovCisJCWluZm8ucGFkZGluZwk9IDA7CiAJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihzdHJ1Y3QgbXRkX2luZm9fdXNlcikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWJyZWFrOwpAQCAtNjk4LDcgKzc2OSw3IEBACiAJCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCBhcmdwLCBzaXplb2YoYnVmKSkpCiAJCQlyZXQgPSAtRUZBVUxUOwogCQllbHNlCi0JCQlyZXQgPSBtdGRfZG9fcmVhZG9vYihtdGQsIGJ1Zi5zdGFydCwgYnVmLmxlbmd0aCwKKwkJCXJldCA9IG10ZF9kb19yZWFkb29iKGZpbGUsIG10ZCwgYnVmLnN0YXJ0LCBidWYubGVuZ3RoLAogCQkJCWJ1Zi5wdHIsICZidWZfdXNlci0+c3RhcnQpOwogCQlicmVhazsKIAl9CkBAIC03MjUsMTIgKzc5NiwxOSBAQAogCQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgYXJncCwgc2l6ZW9mKGJ1ZikpKQogCQkJcmV0ID0gLUVGQVVMVDsKIAkJZWxzZQotCQkJcmV0ID0gbXRkX2RvX3JlYWRvb2IobXRkLCBidWYuc3RhcnQsIGJ1Zi5sZW5ndGgsCisJCQlyZXQgPSBtdGRfZG9fcmVhZG9vYihmaWxlLCBtdGQsIGJ1Zi5zdGFydCwgYnVmLmxlbmd0aCwKIAkJCQkodm9pZCBfX3VzZXIgKikodWludHB0cl90KWJ1Zi51c3JfcHRyLAogCQkJCSZidWZfdXNlci0+bGVuZ3RoKTsKIAkJYnJlYWs7CiAJfQogCisJY2FzZSBNRU1XUklURToKKwl7CisJCXJldCA9IG10ZF93cml0ZV9pb2N0bChtdGQsCisJCSAgICAgIChzdHJ1Y3QgbXRkX3dyaXRlX3JlcSBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKwl9CisKIAljYXNlIE1FTUxPQ0s6CiAJewogCQlzdHJ1Y3QgZXJhc2VfaW5mb191c2VyIGVpbmZvOwpAQCAtODI3LDcgKzkwNSw3IEBACiAJCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgYXJncCwgc2l6ZW9mKGludCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJbWZpLT5tb2RlID0gTVREX01PREVfTk9STUFMOworCQltZmktPm1vZGUgPSBNVERfRklMRV9NT0RFX05PUk1BTDsKIAogCQlyZXQgPSBvdHBfc2VsZWN0X2ZpbGVtb2RlKG1maSwgbW9kZSk7CiAKQEAgLTg0MywxMSArOTIxLDExIEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCXN3aXRjaCAobWZpLT5tb2RlKSB7Ci0JCWNhc2UgTVREX01PREVfT1RQX0ZBQ1RPUlk6CisJCWNhc2UgTVREX0ZJTEVfTU9ERV9PVFBfRkFDVE9SWToKIAkJCWlmIChtdGQtPmdldF9mYWN0X3Byb3RfaW5mbykKIAkJCQlyZXQgPSBtdGQtPmdldF9mYWN0X3Byb3RfaW5mbyhtdGQsIGJ1ZiwgNDA5Nik7CiAJCQlicmVhazsKLQkJY2FzZSBNVERfTU9ERV9PVFBfVVNFUjoKKwkJY2FzZSBNVERfRklMRV9NT0RFX09UUF9VU0VSOgogCQkJaWYgKG10ZC0+Z2V0X3VzZXJfcHJvdF9pbmZvKQogCQkJCXJldCA9IG10ZC0+Z2V0X3VzZXJfcHJvdF9pbmZvKG10ZCwgYnVmLCA0MDk2KTsKIAkJCWJyZWFrOwpAQCAtODcxLDcgKzk0OSw3IEBACiAJewogCQlzdHJ1Y3Qgb3RwX2luZm8gb2luZm87CiAKLQkJaWYgKG1maS0+bW9kZSAhPSBNVERfTU9ERV9PVFBfVVNFUikKKwkJaWYgKG1maS0+bW9kZSAhPSBNVERfRklMRV9NT0RFX09UUF9VU0VSKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmb2luZm8sIGFyZ3AsIHNpemVvZihvaW5mbykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC04ODIsNyArOTYwLDcgQEAKIAl9CiAjZW5kaWYKIAotCS8qIFRoaXMgaW9jdGwgaXMgYmVpbmcgZGVwcmVjYXRlZCAtIGl0IHRydW5jYXRlcyB0aGUgZWNjIGxheW91dCAqLworCS8qIFRoaXMgaW9jdGwgaXMgYmVpbmcgZGVwcmVjYXRlZCAtIGl0IHRydW5jYXRlcyB0aGUgRUNDIGxheW91dCAqLwogCWNhc2UgRUNDR0VUTEFZT1VUOgogCXsKIAkJc3RydWN0IG5hbmRfZWNjbGF5b3V0X3VzZXIgKnVzcmxheTsKQEAgLTkxNSwxNyArOTkzLDE3IEBACiAJCW1maS0+bW9kZSA9IDA7CiAKIAkJc3dpdGNoKGFyZykgewotCQljYXNlIE1URF9NT0RFX09UUF9GQUNUT1JZOgotCQljYXNlIE1URF9NT0RFX09UUF9VU0VSOgorCQljYXNlIE1URF9GSUxFX01PREVfT1RQX0ZBQ1RPUlk6CisJCWNhc2UgTVREX0ZJTEVfTU9ERV9PVFBfVVNFUjoKIAkJCXJldCA9IG90cF9zZWxlY3RfZmlsZW1vZGUobWZpLCBhcmcpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBNVERfTU9ERV9SQVc6CisJCWNhc2UgTVREX0ZJTEVfTU9ERV9SQVc6CiAJCQlpZiAoIW10ZC0+cmVhZF9vb2IgfHwgIW10ZC0+d3JpdGVfb29iKQogCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAkJCW1maS0+bW9kZSA9IGFyZzsKIAotCQljYXNlIE1URF9NT0RFX05PUk1BTDoKKwkJY2FzZSBNVERfRklMRV9NT0RFX05PUk1BTDoKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTEwMTEsNyArMTA4OSw3IEBACiAJCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCBhcmdwLCBzaXplb2YoYnVmKSkpCiAJCQlyZXQgPSAtRUZBVUxUOwogCQllbHNlCi0JCQlyZXQgPSBtdGRfZG9fcmVhZG9vYihtdGQsIGJ1Zi5zdGFydCwKKwkJCXJldCA9IG10ZF9kb19yZWFkb29iKGZpbGUsIG10ZCwgYnVmLnN0YXJ0LAogCQkJCWJ1Zi5sZW5ndGgsIGNvbXBhdF9wdHIoYnVmLnB0ciksCiAJCQkJJmJ1Zl91c2VyLT5zdGFydCk7CiAJCWJyZWFrOwpAQCAtMTE0NCw3ICsxMjIyLDcgQEAKIAogCWlmIChtdGRfaW5vKSB7CiAJCS8qIERlc3Ryb3kgdGhlIGlub2RlIGlmIGl0IGV4aXN0cyAqLwotCQltdGRfaW5vLT5pX25saW5rID0gMDsKKwkJY2xlYXJfbmxpbmsobXRkX2lubyk7CiAJCWlwdXQobXRkX2lubyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMgYi9kcml2ZXJzL210ZC9tdGRjb25jYXQuYwppbmRleCBlNjAxNjcyLi42ZGY0ZDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRjb25jYXQuYworKysgYi9kcml2ZXJzL210ZC9tdGRjb25jYXQuYwpAQCAtOTUsMTAgKzk1LDEwIEBACiAKIAkJLyogU2F2ZSBpbmZvcm1hdGlvbiBhYm91dCBiaXRmbGlwcyEgKi8KIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCWlmIChlcnIgPT0gLUVCQURNU0cpIHsKKwkJCWlmIChtdGRfaXNfZWNjZXJyKGVycikpIHsKIAkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKIAkJCQlyZXQgPSBlcnI7Ci0JCQl9IGVsc2UgaWYgKGVyciA9PSAtRVVDTEVBTikgeworCQkJfSBlbHNlIGlmIChtdGRfaXNfYml0ZmxpcChlcnIpKSB7CiAJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkKys7CiAJCQkJLyogRG8gbm90IG92ZXJ3cml0ZSAtRUJBRE1TRyAhISAqLwogCQkJCWlmICghcmV0KQpAQCAtMjc5LDEwICsyNzksMTAgQEAKIAogCQkvKiBTYXZlIGluZm9ybWF0aW9uIGFib3V0IGJpdGZsaXBzISAqLwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJaWYgKGVyciA9PSAtRUJBRE1TRykgeworCQkJaWYgKG10ZF9pc19lY2NlcnIoZXJyKSkgewogCQkJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCsrOwogCQkJCXJldCA9IGVycjsKLQkJCX0gZWxzZSBpZiAoZXJyID09IC1FVUNMRUFOKSB7CisJCQl9IGVsc2UgaWYgKG10ZF9pc19iaXRmbGlwKGVycikpIHsKIAkJCQltdGQtPmVjY19zdGF0cy5jb3JyZWN0ZWQrKzsKIAkJCQkvKiBEbyBub3Qgb3ZlcndyaXRlIC1FQkFETVNHICEhICovCiAJCQkJaWYgKCFyZXQpCkBAIC03NzAsNyArNzcwLDcgQEAKIAogCS8qCiAJICogU2V0IHVwIHRoZSBuZXcgInN1cGVyIiBkZXZpY2UncyBNVEQgb2JqZWN0IHN0cnVjdHVyZSwgY2hlY2sgZm9yCi0JICogaW5jb21wYXRpYmlsaXRlcyBiZXR3ZWVuIHRoZSBzdWJkZXZpY2VzLgorCSAqIGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gdGhlIHN1YmRldmljZXMuCiAJICovCiAJY29uY2F0LT5tdGQudHlwZSA9IHN1YmRldlswXS0+dHlwZTsKIAljb25jYXQtPm10ZC5mbGFncyA9IHN1YmRldlswXS0+ZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjb3JlLmMgYi9kcml2ZXJzL210ZC9tdGRjb3JlLmMKaW5kZXggYzUxMGFmZi4uYjAxOTkzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY29yZS5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNvcmUuYwpAQCAtMzYyLDcgKzM2Miw3IEBACiAJCQkgICAgICBNVERfREVWVChpKSArIDEsCiAJCQkgICAgICBOVUxMLCAibXRkJWRybyIsIGkpOwogCi0JREVCVUcoMCwgIm10ZDogR2l2aW5nIG91dCBkZXZpY2UgJWQgdG8gJXNcbiIsIGksIG10ZC0+bmFtZSk7CisJcHJfZGVidWcoIm10ZDogR2l2aW5nIG91dCBkZXZpY2UgJWQgdG8gJXNcbiIsIGksIG10ZC0+bmFtZSk7CiAJLyogTm8gbmVlZCB0byBnZXQgYSByZWZjb3VudCBvbiB0aGUgbW9kdWxlIGNvbnRhaW5pbmcKIAkgICB0aGUgbm90aWZpZXIsIHNpbmNlIHdlIGhvbGQgdGhlIG10ZF90YWJsZV9tdXRleCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkobm90LCAmbXRkX25vdGlmaWVycywgbGlzdCkKQEAgLTQyOSwyNyArNDI5LDYzIEBACiB9CiAKIC8qKgotICogbXRkX2RldmljZV9yZWdpc3RlciAtIHJlZ2lzdGVyIGFuIE1URCBkZXZpY2UuCisgKiBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyIC0gcGFyc2UgcGFydGl0aW9ucyBhbmQgcmVnaXN0ZXIgYW4gTVREIGRldmljZS4KICAqCi0gKiBAbWFzdGVyOiB0aGUgTVREIGRldmljZSB0byByZWdpc3RlcgotICogQHBhcnRzOiB0aGUgcGFydGl0aW9ucyB0byByZWdpc3RlciAtIG9ubHkgdmFsaWQgaWYgbnJfcGFydHMgPiAwCi0gKiBAbnJfcGFydHM6IHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyBpbiBwYXJ0cy4gIElmIHplcm8gdGhlbiB0aGUgZnVsbCBNVEQKLSAqICAgICAgICAgICAgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAqIEBtdGQ6IHRoZSBNVEQgZGV2aWNlIHRvIHJlZ2lzdGVyCisgKiBAdHlwZXM6IHRoZSBsaXN0IG9mIE1URCBwYXJ0aXRpb24gcHJvYmVzIHRvIHRyeSwgc2VlCisgKiAgICAgICAgICdwYXJzZV9tdGRfcGFydGl0aW9ucygpJyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICogQHBhcnNlcl9kYXRhOiBNVEQgcGFydGl0aW9uIHBhcnNlci1zcGVjaWZpYyBkYXRhCisgKiBAcGFydHM6IGZhbGxiYWNrIHBhcnRpdGlvbiBpbmZvcm1hdGlvbiB0byByZWdpc3RlciwgaWYgcGFyc2luZyBmYWlsczsKKyAqICAgICAgICAgb25seSB2YWxpZCBpZiAlbnJfcGFydHMgPiAlMAorICogQG5yX3BhcnRzOiB0aGUgbnVtYmVyIG9mIHBhcnRpdGlvbnMgaW4gcGFydHMsIGlmIHplcm8gdGhlbiB0aGUgZnVsbAorICogICAgICAgICAgICBNVEQgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgaWYgbm8gcGFydGl0aW9uIGluZm8gaXMgZm91bmQKICAqCi0gKiBSZWdpc3RlciBhbiBNVEQgZGV2aWNlIHdpdGggdGhlIHN5c3RlbSBhbmQgb3B0aW9uYWxseSwgYSBudW1iZXIgb2YKLSAqIHBhcnRpdGlvbnMuICBJZiBucl9wYXJ0cyBpcyAwIHRoZW4gdGhlIHdob2xlIGRldmljZSBpcyByZWdpc3RlcmVkLCBvdGhlcndpc2UKLSAqIG9ubHkgdGhlIHBhcnRpdGlvbnMgYXJlIHJlZ2lzdGVyZWQuICBUbyByZWdpc3RlciBib3RoIHRoZSBmdWxsIGRldmljZSAqYW5kKgotICogdGhlIHBhcnRpdGlvbnMsIGNhbGwgbXRkX2RldmljZV9yZWdpc3RlcigpIHR3aWNlLCBvbmNlIHdpdGggbnJfcGFydHMgPT0gMAotICogYW5kIG9uY2UgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zLgorICogVGhpcyBmdW5jdGlvbiBhZ2dyZWdhdGVzIE1URCBwYXJ0aXRpb25zIHBhcnNpbmcgKGRvbmUgYnkKKyAqICdwYXJzZV9tdGRfcGFydGl0aW9ucygpJykgYW5kIE1URCBkZXZpY2UgYW5kIHBhcnRpdGlvbnMgcmVnaXN0ZXJpbmcuIEl0CisgKiBiYXNpY2FsbHkgZm9sbG93cyB0aGUgbW9zdCBjb21tb24gcGF0dGVybiBmb3VuZCBpbiBtYW55IE1URCBkcml2ZXJzOgorICoKKyAqICogSXQgZmlyc3QgdHJpZXMgdG8gcHJvYmUgcGFydGl0aW9ucyBvbiBNVEQgZGV2aWNlIEBtdGQgdXNpbmcgcGFyc2VycworICogICBzcGVjaWZpZWQgaW4gQHR5cGVzIChpZiBAdHlwZXMgaXMgJU5VTEwsIHRoZW4gdGhlIGRlZmF1bHQgbGlzdCBvZiBwYXJzZXJzCisgKiAgIGlzIHVzZWQsIHNlZSAncGFyc2VfbXRkX3BhcnRpdGlvbnMoKScgZm9yIG1vcmUgaW5mb3JtYXRpb24pLiBJZiBub25lIGFyZQorICogICBmb3VuZCB0aGlzIGZ1bmN0aW9ucyB0cmllcyB0byBmYWxsYmFjayB0byBpbmZvcm1hdGlvbiBzcGVjaWZpZWQgaW4KKyAqICAgQHBhcnRzL0Bucl9wYXJ0cy4KKyAqICogSWYgYW55IHBhcnRpdGlvbmluZyBpbmZvIHdhcyBmb3VuZCwgdGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIGZvdW5kCisgKiAgIHBhcnRpdGlvbnMuCisgKiAqIElmIG5vIHBhcnRpdGlvbnMgd2VyZSBmb3VuZCB0aGlzIGZ1bmN0aW9uIGp1c3QgcmVnaXN0ZXJzIHRoZSBNVEQgZGV2aWNlCisgKiAgIEBtdGQgYW5kIGV4aXRzLgorICoKKyAqIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCiAgKi8KLWludCBtdGRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLAotCQkJY29uc3Qgc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzLAotCQkJaW50IG5yX3BhcnRzKQoraW50IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IGNoYXIgKip0eXBlcywKKwkJCSAgICAgIHN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSAqcGFyc2VyX2RhdGEsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHMsCisJCQkgICAgICBpbnQgbnJfcGFydHMpCiB7Ci0JcmV0dXJuIHBhcnRzID8gYWRkX210ZF9wYXJ0aXRpb25zKG1hc3RlciwgcGFydHMsIG5yX3BhcnRzKSA6Ci0JCWFkZF9tdGRfZGV2aWNlKG1hc3Rlcik7CisJaW50IGVycjsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcmVhbF9wYXJ0czsKKworCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgdHlwZXMsICZyZWFsX3BhcnRzLCBwYXJzZXJfZGF0YSk7CisJaWYgKGVyciA8PSAwICYmIG5yX3BhcnRzICYmIHBhcnRzKSB7CisJCXJlYWxfcGFydHMgPSBrbWVtZHVwKHBhcnRzLCBzaXplb2YoKnBhcnRzKSAqIG5yX3BhcnRzLAorCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVhbF9wYXJ0cykKKwkJCWVyciA9IC1FTk9NRU07CisJCWVsc2UKKwkJCWVyciA9IG5yX3BhcnRzOworCX0KKworCWlmIChlcnIgPiAwKSB7CisJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhtdGQsIHJlYWxfcGFydHMsIGVycik7CisJCWtmcmVlKHJlYWxfcGFydHMpOworCX0gZWxzZSBpZiAoZXJyID09IDApIHsKKwkJZXJyID0gYWRkX210ZF9kZXZpY2UobXRkKTsKKwkJaWYgKGVyciA9PSAxKQorCQkJZXJyID0gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTF9HUEwobXRkX2RldmljZV9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKTsKIAogLyoqCiAgKiBtdGRfZGV2aWNlX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIGFuIGV4aXN0aW5nIE1URCBkZXZpY2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjb3JlLmggYi9kcml2ZXJzL210ZC9tdGRjb3JlLmgKaW5kZXggMGVkNjEyNi4uOTYxYTM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY29yZS5oCisrKyBiL2RyaXZlcnMvbXRkL210ZGNvcmUuaApAQCAtMTUsNiArMTUsOSBAQAogZXh0ZXJuIGludCBhZGRfbXRkX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICosIGNvbnN0IHN0cnVjdCBtdGRfcGFydGl0aW9uICosCiAJCQkgICAgICBpbnQpOwogZXh0ZXJuIGludCBkZWxfbXRkX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICopOworZXh0ZXJuIGludCBwYXJzZV9tdGRfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwgY29uc3QgY2hhciAqKnR5cGVzLAorCQkJCXN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLAorCQkJCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSAqZGF0YSk7CiAKICNkZWZpbmUgbXRkX2Zvcl9lYWNoX2RldmljZShtdGQpCQkJXAogCWZvciAoKG10ZCkgPSBfX210ZF9uZXh0X2RldmljZSgwKTsJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZG9vcHMuYyBiL2RyaXZlcnMvbXRkL210ZG9vcHMuYwppbmRleCBlM2U0MGY0Li4xZTJmYTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRvb3BzLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkb29wcy5jCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkJcmV0ID0gbXRkLT5yZWFkKG10ZCwgcGFnZSAqIHJlY29yZF9zaXplLCBNVERPT1BTX0hFQURFUl9TSVpFLAogCQkJCSZyZXRsZW4sICh1X2NoYXIgKikgJmNvdW50WzBdKTsKIAkJaWYgKHJldGxlbiAhPSBNVERPT1BTX0hFQURFUl9TSVpFIHx8Ci0JCQkJKHJldCA8IDAgJiYgcmV0ICE9IC1FVUNMRUFOKSkgeworCQkJCShyZXQgPCAwICYmICFtdGRfaXNfYml0ZmxpcChyZXQpKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJtdGRvb3BzOiByZWFkIGZhaWx1cmUgYXQgJWxkICgldGQgb2YgJWQgcmVhZCksIGVyciAlZFxuIiwKIAkJCSAgICAgICBwYWdlICogcmVjb3JkX3NpemUsIHJldGxlbiwKIAkJCSAgICAgICBNVERPT1BTX0hFQURFUl9TSVpFLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkcGFydC5jIGIvZHJpdmVycy9tdGQvbXRkcGFydC5jCmluZGV4IDYzMGJlM2UuLmEwYmQyZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZHBhcnQuYworKysgYi9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKQEAgLTczLDkgKzczLDkgQEAKIAlyZXMgPSBwYXJ0LT5tYXN0ZXItPnJlYWQocGFydC0+bWFzdGVyLCBmcm9tICsgcGFydC0+b2Zmc2V0LAogCQkJCSAgIGxlbiwgcmV0bGVuLCBidWYpOwogCWlmICh1bmxpa2VseShyZXMpKSB7Ci0JCWlmIChyZXMgPT0gLUVVQ0xFQU4pCisJCWlmIChtdGRfaXNfYml0ZmxpcChyZXMpKQogCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHBhcnQtPm1hc3Rlci0+ZWNjX3N0YXRzLmNvcnJlY3RlZCAtIHN0YXRzLmNvcnJlY3RlZDsKLQkJaWYgKHJlcyA9PSAtRUJBRE1TRykKKwkJaWYgKG10ZF9pc19lY2NlcnIocmVzKSkKIAkJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCArPSBwYXJ0LT5tYXN0ZXItPmVjY19zdGF0cy5mYWlsZWQgLSBzdGF0cy5mYWlsZWQ7CiAJfQogCXJldHVybiByZXM7CkBAIC0xMzAsNyArMTMwLDcgQEAKIAlpZiAob3BzLT5vb2JidWYpIHsKIAkJc2l6ZV90IGxlbiwgcGFnZXM7CiAKLQkJaWYgKG9wcy0+bW9kZSA9PSBNVERfT09CX0FVVE8pCisJCWlmIChvcHMtPm1vZGUgPT0gTVREX09QU19BVVRPX09PQikKIAkJCWxlbiA9IG10ZC0+b29iYXZhaWw7CiAJCWVsc2UKIAkJCWxlbiA9IG10ZC0+b29ic2l6ZTsKQEAgLTE0Miw5ICsxNDIsOSBAQAogCiAJcmVzID0gcGFydC0+bWFzdGVyLT5yZWFkX29vYihwYXJ0LT5tYXN0ZXIsIGZyb20gKyBwYXJ0LT5vZmZzZXQsIG9wcyk7CiAJaWYgKHVubGlrZWx5KHJlcykpIHsKLQkJaWYgKHJlcyA9PSAtRVVDTEVBTikKKwkJaWYgKG10ZF9pc19iaXRmbGlwKHJlcykpCiAJCQltdGQtPmVjY19zdGF0cy5jb3JyZWN0ZWQrKzsKLQkJaWYgKHJlcyA9PSAtRUJBRE1TRykKKwkJaWYgKG10ZF9pc19lY2NlcnIocmVzKSkKIAkJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCsrOwogCX0KIAlyZXR1cm4gcmVzOwpAQCAtNDc5LDYgKzQ3OSwxOSBAQAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpY3VyX29mZnNldCwgKHVuc2lnbmVkIGxvbmcgbG9uZylzbGF2ZS0+b2Zmc2V0KTsKIAkJfQogCX0KKwlpZiAoc2xhdmUtPm9mZnNldCA9PSBNVERQQVJUX09GU19SRVRBSU4pIHsKKwkJc2xhdmUtPm9mZnNldCA9IGN1cl9vZmZzZXQ7CisJCWlmIChtYXN0ZXItPnNpemUgLSBzbGF2ZS0+b2Zmc2V0ID49IHNsYXZlLT5tdGQuc2l6ZSkgeworCQkJc2xhdmUtPm10ZC5zaXplID0gbWFzdGVyLT5zaXplIC0gc2xhdmUtPm9mZnNldAorCQkJCQkJCS0gc2xhdmUtPm10ZC5zaXplOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtdGQgcGFydGl0aW9uIFwiJXNcIiBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlOiAlI2xseCA8ICUjbGx4LCBkaXNhYmxlZFxuIiwKKwkJCQlwYXJ0LT5uYW1lLCBtYXN0ZXItPnNpemUgLSBzbGF2ZS0+b2Zmc2V0LAorCQkJCXNsYXZlLT5tdGQuc2l6ZSk7CisJCQkvKiByZWdpc3RlciB0byBwcmVzZXJ2ZSBvcmRlcmluZyAqLworCQkJZ290byBvdXRfcmVnaXN0ZXI7CisJCX0KKwl9CiAJaWYgKHNsYXZlLT5tdGQuc2l6ZSA9PSBNVERQQVJUX1NJWl9GVUxMKQogCQlzbGF2ZS0+bXRkLnNpemUgPSBtYXN0ZXItPnNpemUgLSBzbGF2ZS0+b2Zmc2V0OwogCkBAIC02OTMsNiArNzA2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCisjZGVmaW5lIHB1dF9wYXJ0aXRpb25fcGFyc2VyKHApIGRvIHsgbW9kdWxlX3B1dCgocCktPm93bmVyKTsgfSB3aGlsZSAoMCkKKwogaW50IHJlZ2lzdGVyX210ZF9wYXJzZXIoc3RydWN0IG10ZF9wYXJ0X3BhcnNlciAqcCkKIHsKIAlzcGluX2xvY2soJnBhcnRfcGFyc2VyX2xvY2spOwpAQCAtNzEyLDE5ICs3MjcsNTEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlcmVnaXN0ZXJfbXRkX3BhcnNlcik7CiAKKy8qCisgKiBEbyBub3QgZm9yZ2V0IHRvIHVwZGF0ZSAncGFyc2VfbXRkX3BhcnRpdGlvbnMoKScga2VybmVsZG9jIGNvbW1lbnQgaWYgeW91CisgKiBhcmUgY2hhbmdpbmcgdGhpcyBhcnJheSEKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRlZmF1bHRfbXRkX3BhcnRfdHlwZXNbXSA9IHsKKwkiY21kbGluZXBhcnQiLAorCSJvZnBhcnQiLAorCU5VTEwKK307CisKKy8qKgorICogcGFyc2VfbXRkX3BhcnRpdGlvbnMgLSBwYXJzZSBNVEQgcGFydGl0aW9ucworICogQG1hc3RlcjogdGhlIG1hc3RlciBwYXJ0aXRpb24gKGRlc2NyaWJlcyB3aG9sZSBNVEQgZGV2aWNlKQorICogQHR5cGVzOiBuYW1lcyBvZiBwYXJ0aXRpb24gcGFyc2VycyB0byB0cnkgb3IgJU5VTEwKKyAqIEBwcGFydHM6IGFycmF5IG9mIHBhcnRpdGlvbnMgZm91bmQgaXMgcmV0dXJuZWQgaGVyZQorICogQGRhdGE6IE1URCBwYXJ0aXRpb24gcGFyc2VyLXNwZWNpZmljIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGZpbmQgcGFydGl0aW9uIG9uIE1URCBkZXZpY2UgQG1hc3Rlci4gSXQgdXNlcyBNVEQKKyAqIHBhcnRpdGlvbiBwYXJzZXJzLCBzcGVjaWZpZWQgaW4gQHR5cGVzLiBIb3dldmVyLCBpZiBAdHlwZXMgaXMgJU5VTEwsIHRoZW4KKyAqIHRoZSBkZWZhdWx0IGxpc3Qgb2YgcGFyc2VycyBpcyB1c2VkLiBUaGUgZGVmYXVsdCBsaXN0IGNvbnRhaW5zIG9ubHkgdGhlCisgKiAiY21kbGluZXBhcnQiIGFuZCAib2ZwYXJ0IiBwYXJzZXJzIEFUTS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm46CisgKiBvIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqIG8gemVybyBpZiBubyBwYXJ0aXRpb25zIHdlcmUgZm91bmQKKyAqIG8gYSBwb3NpdGl2ZSBudW1iZXIgb2YgZm91bmQgcGFydGl0aW9ucywgaW4gd2hpY2ggY2FzZSBvbiBleGl0IEBwcGFydHMgd2lsbAorICogICBwb2ludCB0byBhbiBhcnJheSBjb250YWluaW5nIHRoaXMgbnVtYmVyIG9mICZzdHJ1Y3QgbXRkX2luZm8gb2JqZWN0cy4KKyAqLwogaW50IHBhcnNlX210ZF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLCBjb25zdCBjaGFyICoqdHlwZXMsCi0JCQkgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsIHVuc2lnbmVkIGxvbmcgb3JpZ2luKQorCQkJIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLAorCQkJIHN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSAqZGF0YSkKIHsKIAlzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyICpwYXJzZXI7CiAJaW50IHJldCA9IDA7CiAKKwlpZiAoIXR5cGVzKQorCQl0eXBlcyA9IGRlZmF1bHRfbXRkX3BhcnRfdHlwZXM7CisKIAlmb3IgKCA7IHJldCA8PSAwICYmICp0eXBlczsgdHlwZXMrKykgewogCQlwYXJzZXIgPSBnZXRfcGFydGl0aW9uX3BhcnNlcigqdHlwZXMpOwogCQlpZiAoIXBhcnNlciAmJiAhcmVxdWVzdF9tb2R1bGUoIiVzIiwgKnR5cGVzKSkKIAkJCQlwYXJzZXIgPSBnZXRfcGFydGl0aW9uX3BhcnNlcigqdHlwZXMpOwogCQlpZiAoIXBhcnNlcikKIAkJCWNvbnRpbnVlOwotCQlyZXQgPSAoKnBhcnNlci0+cGFyc2VfZm4pKG1hc3RlciwgcHBhcnRzLCBvcmlnaW4pOworCQlyZXQgPSAoKnBhcnNlci0+cGFyc2VfZm4pKG1hc3RlciwgcHBhcnRzLCBkYXRhKTsKIAkJaWYgKHJldCA+IDApIHsKIAkJCXByaW50ayhLRVJOX05PVElDRSAiJWQgJXMgcGFydGl0aW9ucyBmb3VuZCBvbiBNVEQgZGV2aWNlICVzXG4iLAogCQkJICAgICAgIHJldCwgcGFyc2VyLT5uYW1lLCBtYXN0ZXItPm5hbWUpOwpAQCAtNzMzLDcgKzc4MCw2IEBACiAJfQogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChwYXJzZV9tdGRfcGFydGl0aW9ucyk7CiAKIGludCBtdGRfaXNfcGFydGl0aW9uKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkc3VwZXIuYyBiL2RyaXZlcnMvbXRkL210ZHN1cGVyLmMKaW5kZXggMTZiMDJhMS4uYTkwYmZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkc3VwZXIuYworKysgYi9kcml2ZXJzL210ZC9tdGRzdXBlci5jCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tdGQvc3VwZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC0yNiwxMiArMjcsMTIgQEAKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IF9tdGQ7CiAKIAlpZiAoc2ItPnNfbXRkID09IG10ZCkgewotCQlERUJVRygyLCAiTVREU0I6IE1hdGNoIG9uIGRldmljZSAlZCAoXCIlc1wiKVxuIiwKKwkJcHJfZGVidWcoIk1URFNCOiBNYXRjaCBvbiBkZXZpY2UgJWQgKFwiJXNcIilcbiIsCiAJCSAgICAgIG10ZC0+aW5kZXgsIG10ZC0+bmFtZSk7CiAJCXJldHVybiAxOwogCX0KIAotCURFQlVHKDIsICJNVERTQjogTm8gbWF0Y2gsIGRldmljZSAlZCAoXCIlc1wiKSwgZGV2aWNlICVkIChcIiVzXCIpXG4iLAorCXByX2RlYnVnKCJNVERTQjogTm8gbWF0Y2gsIGRldmljZSAlZCAoXCIlc1wiKSwgZGV2aWNlICVkIChcIiVzXCIpXG4iLAogCSAgICAgIHNiLT5zX210ZC0+aW5kZXgsIHNiLT5zX210ZC0+bmFtZSwgbXRkLT5pbmRleCwgbXRkLT5uYW1lKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTcwLDcgKzcxLDcgQEAKIAkJZ290byBhbHJlYWR5X21vdW50ZWQ7CiAKIAkvKiBmcmVzaCBuZXcgc3VwZXJibG9jayAqLwotCURFQlVHKDEsICJNVERTQjogTmV3IHN1cGVyYmxvY2sgZm9yIGRldmljZSAlZCAoXCIlc1wiKVxuIiwKKwlwcl9kZWJ1ZygiTVREU0I6IE5ldyBzdXBlcmJsb2NrIGZvciBkZXZpY2UgJWQgKFwiJXNcIilcbiIsCiAJICAgICAgbXRkLT5pbmRleCwgbXRkLT5uYW1lKTsKIAogCXNiLT5zX2ZsYWdzID0gZmxhZ3M7CkBAIC04Nyw3ICs4OCw3IEBACiAKIAkvKiBuZXcgbW91bnRwb2ludCBmb3IgYW4gYWxyZWFkeSBtb3VudGVkIHN1cGVyYmxvY2sgKi8KIGFscmVhZHlfbW91bnRlZDoKLQlERUJVRygxLCAiTVREU0I6IERldmljZSAlZCAoXCIlc1wiKSBpcyBhbHJlYWR5IG1vdW50ZWRcbiIsCisJcHJfZGVidWcoIk1URFNCOiBEZXZpY2UgJWQgKFwiJXNcIikgaXMgYWxyZWFkeSBtb3VudGVkXG4iLAogCSAgICAgIG10ZC0+aW5kZXgsIG10ZC0+bmFtZSk7CiAJcHV0X210ZF9kZXZpY2UobXRkKTsKIAlyZXR1cm4gZGdldChzYi0+c19yb290KTsKQEAgLTEwOCw3ICsxMDksNyBAQAogCiAJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgbXRkbnIpOwogCWlmIChJU19FUlIobXRkKSkgewotCQlERUJVRygwLCAiTVREU0I6IERldmljZSAjJXUgZG9lc24ndCBhcHBlYXIgdG8gZXhpc3RcbiIsIG10ZG5yKTsKKwkJcHJfZGVidWcoIk1URFNCOiBEZXZpY2UgIyV1IGRvZXNuJ3QgYXBwZWFyIHRvIGV4aXN0XG4iLCBtdGRucik7CiAJCXJldHVybiBFUlJfQ0FTVChtdGQpOwogCX0KIApAQCAtMTMxLDcgKzEzMiw3IEBACiAJaWYgKCFkZXZfbmFtZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQlERUJVRygyLCAiTVREU0I6IGRldl9uYW1lIFwiJXNcIlxuIiwgZGV2X25hbWUpOworCXByX2RlYnVnKCJNVERTQjogZGV2X25hbWUgXCIlc1wiXG4iLCBkZXZfbmFtZSk7CiAKIAkvKiB0aGUgcHJlZmVycmVkIHdheSBvZiBtb3VudGluZyBpbiBmdXR1cmU7IGVzcGVjaWFsbHkgd2hlbgogCSAqIENPTkZJR19CTE9DSz1uIC0gd2Ugc3BlY2lmeSB0aGUgdW5kZXJseWluZyBNVEQgZGV2aWNlIGJ5IG51bWJlciBvcgpAQCAtMTQyLDcgKzE0Myw3IEBACiAJCQlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKIAogCQkJLyogbW91bnQgYnkgTVREIGRldmljZSBuYW1lICovCi0JCQlERUJVRygxLCAiTVREU0I6IG10ZDolJXMsIG5hbWUgXCIlc1wiXG4iLAorCQkJcHJfZGVidWcoIk1URFNCOiBtdGQ6JSVzLCBuYW1lIFwiJXNcIlxuIiwKIAkJCSAgICAgIGRldl9uYW1lICsgNCk7CiAKIAkJCW10ZCA9IGdldF9tdGRfZGV2aWNlX25tKGRldl9uYW1lICsgNCk7CkBAIC0xNjMsNyArMTY0LDcgQEAKIAkJCW10ZG5yID0gc2ltcGxlX3N0cnRvdWwoZGV2X25hbWUgKyAzLCAmZW5kcHRyLCAwKTsKIAkJCWlmICghKmVuZHB0cikgewogCQkJCS8qIEl0IHdhcyBhIHZhbGlkIG51bWJlciAqLwotCQkJCURFQlVHKDEsICJNVERTQjogbXRkJSVkLCBtdGRuciAlZFxuIiwKKwkJCQlwcl9kZWJ1ZygiTVREU0I6IG10ZCUlZCwgbXRkbnIgJWRcbiIsCiAJCQkJICAgICAgbXRkbnIpOwogCQkJCXJldHVybiBtb3VudF9tdGRfbnIoZnNfdHlwZSwgZmxhZ3MsCiAJCQkJCQkgICAgIGRldl9uYW1lLCBkYXRhLApAQCAtMTc5LDEwICsxODAsMTAgQEAKIAliZGV2ID0gbG9va3VwX2JkZXYoZGV2X25hbWUpOwogCWlmIChJU19FUlIoYmRldikpIHsKIAkJcmV0ID0gUFRSX0VSUihiZGV2KTsKLQkJREVCVUcoMSwgIk1URFNCOiBsb29rdXBfYmRldigpIHJldHVybmVkICVkXG4iLCByZXQpOworCQlwcl9kZWJ1ZygiTVREU0I6IGxvb2t1cF9iZGV2KCkgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQotCURFQlVHKDEsICJNVERTQjogbG9va3VwX2JkZXYoKSByZXR1cm5lZCAwXG4iKTsKKwlwcl9kZWJ1ZygiTVREU0I6IGxvb2t1cF9iZGV2KCkgcmV0dXJuZWQgMFxuIik7CiAKIAlyZXQgPSAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRzd2FwLmMgYi9kcml2ZXJzL210ZC9tdGRzd2FwLmMKaW5kZXggZmQ3ODg1My4uYmQ5NTkwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkc3dhcC5jCisrKyBiL2RyaXZlcnMvbXRkL210ZHN3YXAuYwpAQCAtODYsNyArODYsNyBAQAogCXVuc2lnbmVkIGludCBmbGFnczsKIAl1bnNpZ25lZCBpbnQgYWN0aXZlX2NvdW50OwogCXVuc2lnbmVkIGludCBlcmFzZV9jb3VudDsKLQl1bnNpZ25lZCBpbnQgcGFkOwkJLyogc3BlZWRzIHVwIHBvaW50ZXIgZGVjcmVtdG50ICovCisJdW5zaWduZWQgaW50IHBhZDsJCS8qIHNwZWVkcyB1cCBwb2ludGVyIGRlY3JlbWVudCAqLwogfTsKIAogI2RlZmluZSBNVERTV0FQX0VDTlRfTUlOKHJicm9vdCkgKHJiX2VudHJ5KHJiX2ZpcnN0KHJicm9vdCksIHN0cnVjdCBzd2FwX2ViLCBcCkBAIC0zMTQsNyArMzE0LDcgQEAKIHsKIAlpbnQgcmV0ID0gZC0+bXRkLT5yZWFkX29vYihkLT5tdGQsIGZyb20sIG9wcyk7CiAKLQlpZiAocmV0ID09IC1FVUNMRUFOKQorCWlmIChtdGRfaXNfYml0ZmxpcChyZXQpKQogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHJldCkgewpAQCAtMzUwLDExICszNTAsMTEgQEAKIAlvcHMub29iYnVmID0gZC0+b29iX2J1ZjsKIAlvcHMub29ib2ZmcyA9IDA7CiAJb3BzLmRhdGJ1ZiA9IE5VTEw7Ci0Jb3BzLm1vZGUgPSBNVERfT09CX0FVVE87CisJb3BzLm1vZGUgPSBNVERfT1BTX0FVVE9fT09COwogCiAJcmV0ID0gbXRkc3dhcF9yZWFkX29vYihkLCBvZmZzZXQsICZvcHMpOwogCi0JaWYgKHJldCAmJiByZXQgIT0gLUVVQ0xFQU4pCisJaWYgKHJldCAmJiAhbXRkX2lzX2JpdGZsaXAocmV0KSkKIAkJcmV0dXJuIHJldDsKIAogCWRhdGEgPSAoc3RydWN0IG10ZHN3YXBfb29iZGF0YSAqKWQtPm9vYl9idWY7CkBAIC0zNjMsNyArMzYzLDcgQEAKIAogCWlmIChsZTE2X3RvX2NwdShkYXRhLT5tYWdpYykgPT0gTVREU1dBUF9NQUdJQ19DTEVBTikgewogCQllYi0+ZXJhc2VfY291bnQgPSBsZTMyX3RvX2NwdShkYXRhLT5jb3VudCk7Ci0JCWlmIChyZXQgPT0gLUVVQ0xFQU4pCisJCWlmIChtdGRfaXNfYml0ZmxpcChyZXQpKQogCQkJcmV0ID0gTVREU1dBUF9TQ0FOTkVEX0JJVEZMSVA7CiAJCWVsc2UgewogCQkJaWYgKGxlMTZfdG9fY3B1KGRhdGEyLT5tYWdpYykgPT0gTVREU1dBUF9NQUdJQ19ESVJUWSkKQEAgLTM4OSw3ICszODksNyBAQAogCiAJb3BzLm9vYm9mZnMgPSAwOwogCW9wcy5vb2JidWYgPSAodWludDhfdCAqKSZuOwotCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlID0gTVREX09QU19BVVRPX09PQjsKIAlvcHMuZGF0YnVmID0gTlVMTDsKIAogCWlmIChtYXJrZXIgPT0gTVREU1dBUF9UWVBFX0NMRUFOKSB7CkBAIC00MDgsNyArNDA4LDcgQEAKIAlpZiAocmV0KSB7CiAJCWRldl93YXJuKGQtPmRldiwgIldyaXRlIE9PQiBmYWlsZWQgZm9yIGJsb2NrIGF0ICUwOGxseCAiCiAJCQkiZXJyb3IgJWRcbiIsIG9mZnNldCwgcmV0KTsKLQkJaWYgKHJldCA9PSAtRUlPIHx8IHJldCA9PSAtRUJBRE1TRykKKwkJaWYgKHJldCA9PSAtRUlPIHx8IG10ZF9pc19lY2NlcnIocmV0KSkKIAkJCW10ZHN3YXBfaGFuZGxlX3dyaXRlX2Vycm9yKGQsIGViKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC02MjgsNyArNjI4LDcgQEAKIAkJCVRSRUVfQ09VTlQoZCwgQ0xFQU4pLS07CiAKIAkJCXJldCA9IG10ZHN3YXBfd3JpdGVfbWFya2VyKGQsIGViLCBNVERTV0FQX1RZUEVfRElSVFkpOwotCQl9IHdoaWxlIChyZXQgPT0gLUVJTyB8fCByZXQgPT0gLUVCQURNU0cpOworCQl9IHdoaWxlIChyZXQgPT0gLUVJTyB8fCBtdGRfaXNfZWNjZXJyKHJldCkpOwogCiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJcmV0ID0gbXRkc3dhcF9tYXBfZnJlZV9ibG9jayhkLCBwYWdlLCBicCk7CiAJZWIgPSBkLT5lYl9kYXRhICsgKCpicCAvIGQtPnBhZ2VzX3Blcl9lYmxrKTsKIAotCWlmIChyZXQgPT0gLUVJTyB8fCByZXQgPT0gLUVCQURNU0cpIHsKKwlpZiAocmV0ID09IC1FSU8gfHwgbXRkX2lzX2VjY2VycihyZXQpKSB7CiAJCWQtPmN1cnJfd3JpdGUgPSBOVUxMOwogCQllYi0+YWN0aXZlX2NvdW50LS07CiAJCWQtPnJldm1hcFsqYnBdID0gUEFHRV9VTkRFRjsKQEAgLTY5MCw3ICs2OTAsNyBAQAogCiAJd3JpdGVwb3MgPSAobG9mZl90KSpicCA8PCBQQUdFX1NISUZUOwogCXJldCA9ICBtdGQtPndyaXRlKG10ZCwgd3JpdGVwb3MsIFBBR0VfU0laRSwgJnJldGxlbiwgYnVmKTsKLQlpZiAocmV0ID09IC1FSU8gfHwgcmV0ID09IC1FQkFETVNHKSB7CisJaWYgKHJldCA9PSAtRUlPIHx8IG10ZF9pc19lY2NlcnIocmV0KSkgewogCQlkLT5jdXJyX3dyaXRlX3Bvcy0tOwogCQllYi0+YWN0aXZlX2NvdW50LS07CiAJCWQtPnJldm1hcFsqYnBdID0gUEFHRV9VTkRFRjsKQEAgLTczOCw3ICs3MzgsNyBAQAogcmV0cnk6CiAJcmV0ID0gbXRkLT5yZWFkKG10ZCwgcmVhZHBvcywgUEFHRV9TSVpFLCAmcmV0bGVuLCBkLT5wYWdlX2J1Zik7CiAKLQlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVVQ0xFQU4pIHsKKwlpZiAocmV0IDwgMCAmJiAhbXRkX2lzX2JpdGZsaXAocmV0KSkgewogCQlvbGRlYiA9IGQtPmViX2RhdGEgKyBvbGRibG9jayAvIGQtPnBhZ2VzX3Blcl9lYmxrOwogCQlvbGRlYi0+ZmxhZ3MgfD0gRUJMT0NLX1JFQURFUlI7CiAKQEAgLTkzMSw3ICs5MzEsNyBAQAogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJldDsKIAotCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlID0gTVREX09QU19BVVRPX09PQjsKIAlvcHMubGVuID0gbXRkLT53cml0ZXNpemU7CiAJb3BzLm9vYmxlbiA9IG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKIAlvcHMub29ib2ZmcyA9IDA7CkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogCiAJaWYgKHJldCA9PSAwKQogCQltdGRzd2FwX3JiX2FkZChkLCBlYiwgTVREU1dBUF9DTEVBTik7Ci0JZWxzZSBpZiAocmV0ICE9IC1FSU8gJiYgcmV0ICE9IC1FQkFETVNHKQorCWVsc2UgaWYgKHJldCAhPSAtRUlPICYmICFtdGRfaXNfZWNjZXJyKHJldCkpCiAJCW10ZHN3YXBfcmJfYWRkKGQsIGViLCBNVERTV0FQX0RJUlRZKTsKIAogCXJldHVybiAwOwpAQCAtMTE2NCw3ICsxMTY0LDcgQEAKIAlyZXQgPSBtdGQtPnJlYWQobXRkLCByZWFkcG9zLCBQQUdFX1NJWkUsICZyZXRsZW4sIGJ1Zik7CiAKIAlkLT5tdGRfcmVhZF9jb3VudCsrOwotCWlmIChyZXQgPT0gLUVVQ0xFQU4pIHsKKwlpZiAobXRkX2lzX2JpdGZsaXAocmV0KSkgewogCQllYi0+ZmxhZ3MgfD0gRUJMT0NLX0JJVEZMSVA7CiAJCW10ZHN3YXBfcmJfYWRkKGQsIGViLCBNVERTV0FQX0JJVEZMSVApOwogCQlyZXQgPSAwOwpAQCAtMTM3NCwxMSArMTM3NCwxMCBAQAogCQlnb3RvIHJldm1hcF9mYWlsOwogCiAJZWJsa19ieXRlcyA9IHNpemVvZihzdHJ1Y3Qgc3dhcF9lYikqZC0+ZWJsa3M7Ci0JZC0+ZWJfZGF0YSA9IHZtYWxsb2MoZWJsa19ieXRlcyk7CisJZC0+ZWJfZGF0YSA9IHZ6YWxsb2MoZWJsa19ieXRlcyk7CiAJaWYgKCFkLT5lYl9kYXRhKQogCQlnb3RvIGViX2RhdGFfZmFpbDsKIAotCW1lbXNldChkLT5lYl9kYXRhLCAwLCBlYmxrX2J5dGVzKTsKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykKIAkJZC0+cGFnZV9kYXRhW2ldID0gQkxPQ0tfVU5ERUY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwppbmRleCA0YzM0MjUyLi5jY2U3YjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCkBAIC04MywxNiArODMsOSBAQAogICAgICAgICAgIHNjcmF0Y2ggcmVnaXN0ZXIgaGVyZSB0byBlbmFibGUgdGhpcyBmZWF0dXJlLiBPbiBJbnRlbCBNb29yZXN0b3duCiAgICAgICAgICAgYm9hcmRzLCB0aGUgc2NyYXRjaCByZWdpc3RlciBpcyBhdCAweEZGMTA4MDE4LgogCi1jb25maWcgTVREX05BTkRfRURCNzMxMgotCXRyaXN0YXRlICJTdXBwb3J0IGZvciBDaXJydXMgTG9naWMgRUJENzMxMiBldmFsdWF0aW9uIGJvYXJkIgotCWRlcGVuZHMgb24gQVJDSF9FREI3MzEyCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBDaXJydXMgTG9naWMgRUJENzMxMiBldmFsdWF0aW9uCi0JICBib2FyZCB0byBhY2Nlc3MgdGhlIG9uYm9hcmQgTkFORCBGbGFzaC4KLQogY29uZmlnIE1URF9OQU5EX0gxOTAwCiAJdHJpc3RhdGUgImlQQVEgSDE5MDAgZmxhc2giCi0JZGVwZW5kcyBvbiBBUkNIX1BYQQorCWRlcGVuZHMgb24gQVJDSF9QWEEgJiYgQlJPS0VOCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBpUEFRIGgxOTAwIGZsYXNoLgogCkBAIC0xMTYsMTAgKzEwOSwxMSBAQAogCSAgU3VwcG9ydCBmb3IgTkFORCBmbGFzaCBvbiBBbXN0cmFkIEUzIChEZWx0YSkuCiAKIGNvbmZpZyBNVERfTkFORF9PTUFQMgotCXRyaXN0YXRlICJOQU5EIEZsYXNoIGRldmljZSBvbiBPTUFQMiBhbmQgT01BUDMiCi0JZGVwZW5kcyBvbiBBUk0gJiYgKEFSQ0hfT01BUDIgfHwgQVJDSF9PTUFQMykKKwl0cmlzdGF0ZSAiTkFORCBGbGFzaCBkZXZpY2Ugb24gT01BUDIsIE9NQVAzIGFuZCBPTUFQNCIKKwlkZXBlbmRzIG9uIEFSTSAmJiAoQVJDSF9PTUFQMiB8fCBBUkNIX09NQVAzIHx8IEFSQ0hfT01BUDQpCiAJaGVscAotICAgICAgICAgIFN1cHBvcnQgZm9yIE5BTkQgZmxhc2ggb24gVGV4YXMgSW5zdHJ1bWVudHMgT01BUDIgYW5kIE9NQVAzIHBsYXRmb3Jtcy4KKyAgICAgICAgICBTdXBwb3J0IGZvciBOQU5EIGZsYXNoIG9uIFRleGFzIEluc3RydW1lbnRzIE9NQVAyLCBPTUFQMyBhbmQgT01BUDQKKwkgIHBsYXRmb3Jtcy4KIAogY29uZmlnIE1URF9OQU5EX0lEUwogCXRyaXN0YXRlCkBAIC0xMzgsNyArMTMyLDcgQEAKIAogY29uZmlnIE1URF9OQU5EX0FVMTU1MAogCXRyaXN0YXRlICJBdTE1NTAvMTIwMCBOQU5EIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT0NfQVUxMjAwIHx8IFNPQ19BVTE1NTAKKwlkZXBlbmRzIG9uIE1JUFNfQUxDSEVNWQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgTkFORCBmbGFzaCBjb250cm9sbGVyIG9uIHRoZQogCSAgQU1EL0FsY2hlbXkgMTU1MCBTT0MuCkBAIC00MjMsNiArNDE3LDE5IEBACiAJICBUaGUgc2ltdWxhdG9yIG1heSBzaW11bGF0ZSB2YXJpb3VzIE5BTkQgZmxhc2ggY2hpcHMgZm9yIHRoZQogCSAgTVREIG5hbmQgbGF5ZXIuCiAKK2NvbmZpZyBNVERfTkFORF9HUE1JX05BTkQKKyAgICAgICAgYm9vbCAiR1BNSSBOQU5EIEZsYXNoIENvbnRyb2xsZXIgZHJpdmVyIgorICAgICAgICBkZXBlbmRzIG9uIE1URF9OQU5EICYmIChTT0NfSU1YMjMgfHwgU09DX0lNWDI4KQorCXNlbGVjdCBNVERfUEFSVElUSU9OUworCXNlbGVjdCBNVERfQ01ETElORV9QQVJUUworICAgICAgICBoZWxwCisJIEVuYWJsZXMgTkFORCBGbGFzaCBzdXBwb3J0IGZvciBJTVgyMyBvciBJTVgyOC4KKwkgVGhlIEdQTUkgY29udHJvbGxlciBpcyB2ZXJ5IHBvd2VyZnVsLCB3aXRoIHRoZSBoZWxwIG9mIEJDSAorCSBtb2R1bGUsIGl0IGNhbiBkbyB0aGUgaGFyZHdhcmUgRUNDLiBUaGUgR1BNSSBzdXBwb3J0cyBzZXZlcmFsCisJIE5BTkQgZmxhc2hzIGF0IHRoZSBzYW1lIHRpbWUuIFRoZSBHUE1JIG1heSBjb25mbGljdHMgd2l0aCBvdGhlcgorCSBibG9jaywgc3VjaCBhcyBTRCBjYXJkLiBTbyBwYXkgYXR0ZW50aW9uIHRvIGl0IHdoZW4geW91IGVuYWJsZQorCSB0aGUgR1BNSS4KKwogY29uZmlnIE1URF9OQU5EX1BMQVRGT1JNCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIGdlbmVyaWMgcGxhdGZvcm0gTkFORCBkcml2ZXIiCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKaW5kZXggNTc0NWQ4My4uNjE4ZjRiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw2IEBACiBvYmotJChDT05GSUdfTVREX05BTkRfQU1TX0RFTFRBKQkrPSBhbXMtZGVsdGEubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0FVVENQVTEyKQkJKz0gYXV0Y3B1MTIubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0RFTkFMSSkJCSs9IGRlbmFsaS5vCi1vYmotJChDT05GSUdfTVREX05BTkRfRURCNzMxMikJCSs9IGVkYjczMTIubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0FVMTU1MCkJCSs9IGF1MTU1MG5kLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9CRjVYWCkJCSs9IGJmNXh4X25hbmQubwogb2JqLSQoQ09ORklHX01URF9OQU5EX1BQQ0hBTUVMRU9ORVZCKQkrPSBwcGNoYW1lbGVvbmV2Yi5vCkBAIC00OSw1ICs0OCw2IEBACiBvYmotJChDT05GSUdfTVREX05BTkRfTVBDNTEyMV9ORkMpCSs9IG1wYzUxMjFfbmZjLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9SSUNPSCkJCSs9IHI4NTIubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0paNDc0MCkJCSs9IGp6NDc0MF9uYW5kLm8KK29iai0kKENPTkZJR19NVERfTkFORF9HUE1JX05BTkQpCSs9IGdwbWktbmFuZC8KIAogbmFuZC1vYmpzIDo9IG5hbmRfYmFzZS5vIG5hbmRfYmJ0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvYW1zLWRlbHRhLmMgYi9kcml2ZXJzL210ZC9uYW5kL2Ftcy1kZWx0YS5jCmluZGV4IDc4MDE3ZWIuLjllNmI0OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvYW1zLWRlbHRhLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9hbXMtZGVsdGEuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQtYW1zLWRlbHRhLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvYXRtZWxfbmFuZC5jCmluZGV4IDU1ZGEyMGMuLjIzZTVkNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvYXRtZWxfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYXRtZWxfbmFuZC5jCkBAIC0xNjEsMzcgKzE2MSw2IEBACiAgICAgICAgICAgICAgICAgISFob3N0LT5ib2FyZC0+cmR5X3Bpbl9hY3RpdmVfbG93OwogfQogCi0vKgotICogTWluaW1hbC1vdmVyaGVhZCBQSU8gZm9yIGRhdGEgYWNjZXNzLgotICovCi1zdGF0aWMgdm9pZCBhdG1lbF9yZWFkX2J1Zjgoc3RydWN0IG10ZF9pbmZvICptdGQsIHU4ICpidWYsIGludCBsZW4pCi17Ci0Jc3RydWN0IG5hbmRfY2hpcAkqbmFuZF9jaGlwID0gbXRkLT5wcml2OwotCi0JX19yYXdfcmVhZHNiKG5hbmRfY2hpcC0+SU9fQUREUl9SLCBidWYsIGxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0bWVsX3JlYWRfYnVmMTYoc3RydWN0IG10ZF9pbmZvICptdGQsIHU4ICpidWYsIGludCBsZW4pCi17Ci0Jc3RydWN0IG5hbmRfY2hpcAkqbmFuZF9jaGlwID0gbXRkLT5wcml2OwotCi0JX19yYXdfcmVhZHN3KG5hbmRfY2hpcC0+SU9fQUREUl9SLCBidWYsIGxlbiAvIDIpOwotfQotCi1zdGF0aWMgdm9pZCBhdG1lbF93cml0ZV9idWY4KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQotewotCXN0cnVjdCBuYW5kX2NoaXAJKm5hbmRfY2hpcCA9IG10ZC0+cHJpdjsKLQotCV9fcmF3X3dyaXRlc2IobmFuZF9jaGlwLT5JT19BRERSX1csIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgYXRtZWxfd3JpdGVfYnVmMTYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pCi17Ci0Jc3RydWN0IG5hbmRfY2hpcAkqbmFuZF9jaGlwID0gbXRkLT5wcml2OwotCi0JX19yYXdfd3JpdGVzdyhuYW5kX2NoaXAtPklPX0FERFJfVywgYnVmLCBsZW4gLyAyKTsKLX0KLQogc3RhdGljIHZvaWQgZG1hX2NvbXBsZXRlX2Z1bmModm9pZCAqY29tcGxldGlvbikKIHsKIAljb21wbGV0ZShjb21wbGV0aW9uKTsKQEAgLTI2NiwzMyArMjM1LDI3IEBACiBzdGF0aWMgdm9pZCBhdG1lbF9yZWFkX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdTggKmJ1ZiwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwotCXN0cnVjdCBhdG1lbF9uYW5kX2hvc3QgKmhvc3QgPSBjaGlwLT5wcml2OwogCiAJaWYgKHVzZV9kbWEgJiYgbGVuID4gbXRkLT5vb2JzaXplKQogCQkvKiBvbmx5IHVzZSBETUEgZm9yIGJpZ2dlciB0aGFuIG9vYiBzaXplOiBiZXR0ZXIgcGVyZm9ybWFuY2VzICovCiAJCWlmIChhdG1lbF9uYW5kX2RtYV9vcChtdGQsIGJ1ZiwgbGVuLCAxKSA9PSAwKQogCQkJcmV0dXJuOwogCi0JaWYgKGhvc3QtPmJvYXJkLT5idXNfd2lkdGhfMTYpCi0JCWF0bWVsX3JlYWRfYnVmMTYobXRkLCBidWYsIGxlbik7Ci0JZWxzZQotCQlhdG1lbF9yZWFkX2J1ZjgobXRkLCBidWYsIGxlbik7CisJLyogaWYgbm8gRE1BIG9wZXJhdGlvbiBwb3NzaWJsZSwgdXNlIFBJTyAqLworCW1lbWNweV9mcm9taW8oYnVmLCBjaGlwLT5JT19BRERSX1IsIGxlbik7CiB9CiAKIHN0YXRpYyB2b2lkIGF0bWVsX3dyaXRlX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdTggKmJ1ZiwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwotCXN0cnVjdCBhdG1lbF9uYW5kX2hvc3QgKmhvc3QgPSBjaGlwLT5wcml2OwogCiAJaWYgKHVzZV9kbWEgJiYgbGVuID4gbXRkLT5vb2JzaXplKQogCQkvKiBvbmx5IHVzZSBETUEgZm9yIGJpZ2dlciB0aGFuIG9vYiBzaXplOiBiZXR0ZXIgcGVyZm9ybWFuY2VzICovCiAJCWlmIChhdG1lbF9uYW5kX2RtYV9vcChtdGQsICh2b2lkICopYnVmLCBsZW4sIDApID09IDApCiAJCQlyZXR1cm47CiAKLQlpZiAoaG9zdC0+Ym9hcmQtPmJ1c193aWR0aF8xNikKLQkJYXRtZWxfd3JpdGVfYnVmMTYobXRkLCBidWYsIGxlbik7Ci0JZWxzZQotCQlhdG1lbF93cml0ZV9idWY4KG10ZCwgYnVmLCBsZW4pOworCS8qIGlmIG5vIERNQSBvcGVyYXRpb24gcG9zc2libGUsIHVzZSBQSU8gKi8KKwltZW1jcHlfdG9pbyhjaGlwLT5JT19BRERSX1csIGJ1ZiwgbGVuKTsKIH0KIAogLyoKQEAgLTQ4MSwxMCArNDQ0LDYgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0jZW5kaWYKLQogLyoKICAqIFByb2JlIGZvciB0aGUgTkFORCBkZXZpY2UuCiAgKi8KQEAgLTQ5Niw4ICs0NTUsNiBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVnczsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAlpbnQgcmVzOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0aXRpb25zID0gTlVMTDsKLQlpbnQgbnVtX3BhcnRpdGlvbnMgPSAwOwogCiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIW1lbSkgewpAQCAtNTgzLDcgKzU0MCw3IEBACiAKIAlpZiAob25fZmxhc2hfYmJ0KSB7CiAJCXByaW50ayhLRVJOX0lORk8gImF0bWVsX25hbmQ6IFVzZSBPbiBGbGFzaCBCQlRcbiIpOwotCQluYW5kX2NoaXAtPm9wdGlvbnMgfD0gTkFORF9VU0VfRkxBU0hfQkJUOworCQluYW5kX2NoaXAtPmJidF9vcHRpb25zIHw9IE5BTkRfQkJUX1VTRV9GTEFTSDsKIAl9CiAKIAlpZiAoIWNwdV9oYXNfZG1hKCkpCkBAIC01OTQsNyArNTUxLDcgQEAKIAogCQlkbWFfY2FwX3plcm8obWFzayk7CiAJCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIG1hc2spOwotCQlob3N0LT5kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgMCwgTlVMTCk7CisJCWhvc3QtPmRtYV9jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBOVUxMLCBOVUxMKTsKIAkJaWYgKCFob3N0LT5kbWFfY2hhbikgewogCQkJZGV2X2Vycihob3N0LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBETUEgY2hhbm5lbFxuIik7CiAJCQl1c2VfZG1hID0gMDsKQEAgLTY1NSwyNyArNjEyLDEyIEBACiAJCWdvdG8gZXJyX3NjYW5fdGFpbDsKIAl9CiAKLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKIAltdGQtPm5hbWUgPSAiYXRtZWxfbmFuZCI7Ci0JbnVtX3BhcnRpdGlvbnMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhtdGQsIHBhcnRfcHJvYmVzLAotCQkJCQkgICAgICAmcGFydGl0aW9ucywgMCk7Ci0jZW5kaWYKLQlpZiAobnVtX3BhcnRpdGlvbnMgPD0gMCAmJiBob3N0LT5ib2FyZC0+cGFydGl0aW9uX2luZm8pCi0JCXBhcnRpdGlvbnMgPSBob3N0LT5ib2FyZC0+cGFydGl0aW9uX2luZm8obXRkLT5zaXplLAotCQkJCQkJCSAmbnVtX3BhcnRpdGlvbnMpOwotCi0JaWYgKCghcGFydGl0aW9ucykgfHwgKG51bV9wYXJ0aXRpb25zID09IDApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXRtZWxfbmFuZDogTm8gcGFydGl0aW9ucyBkZWZpbmVkLCBvciB1bnN1cHBvcnRlZCBkZXZpY2UuXG4iKTsKLQkJcmVzID0gLUVOWElPOwotCQlnb3RvIGVycl9ub19wYXJ0aXRpb25zOwotCX0KLQotCXJlcyA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBwYXJ0aXRpb25zLCBudW1fcGFydGl0aW9ucyk7CisJcmVzID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIE5VTEwsIDAsCisJCQlob3N0LT5ib2FyZC0+cGFydHMsIGhvc3QtPmJvYXJkLT5udW1fcGFydHMpOwogCWlmICghcmVzKQogCQlyZXR1cm4gcmVzOwogCi1lcnJfbm9fcGFydGl0aW9uczoKLQluYW5kX3JlbGVhc2UobXRkKTsKIGVycl9zY2FuX3RhaWw6CiBlcnJfc2Nhbl9pZGVudDoKIGVycl9ub19jYXJkOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9hdTE1NTBuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9hdTE1NTBuZC5jCmluZGV4IGU3NzY3ZWUuLjdkZDM3MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvYXUxNTUwbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2F1MTU1MG5kLmMKQEAgLTE5LDcgKzE5LDExIEBACiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHguaD4KKyNpZmRlZiBDT05GSUdfTUlQU19QQjE1NTAKKyNpbmNsdWRlIDxhc20vbWFjaC1wYjF4MDAvcGIxNTUwLmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTU1MCkKKyNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvZGIxeDAwLmg+CisjZW5kaWYKICNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgogCiAvKgpAQCAtNDgsNyArNTIsNyBAQAogICogYXVfcmVhZF9ieXRlIC0gIHJlYWQgb25lIGJ5dGUgZnJvbSB0aGUgY2hpcAogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiAgcmVhZCBmdW5jdGlvbiBmb3IgOGJpdCBidXN3aXRoCisgKiByZWFkIGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpZHRoCiAgKi8KIHN0YXRpYyB1X2NoYXIgYXVfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewpAQCAtNjMsNyArNjcsNyBAQAogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBieXRlOglwb2ludGVyIHRvIGRhdGEgYnl0ZSB0byB3cml0ZQogICoKLSAqICB3cml0ZSBmdW5jdGlvbiBmb3IgOGl0IGJ1c3dpdGgKKyAqIHdyaXRlIGZ1bmN0aW9uIGZvciA4aXQgYnVzd2lkdGgKICAqLwogc3RhdGljIHZvaWQgYXVfd3JpdGVfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyIGJ5dGUpCiB7CkBAIC03MywxMSArNzcsMTAgQEAKIH0KIAogLyoqCi0gKiBhdV9yZWFkX2J5dGUxNiAtICByZWFkIG9uZSBieXRlIGVuZGlhbmVzcyBhd2FyZSBmcm9tIHRoZSBjaGlwCisgKiBhdV9yZWFkX2J5dGUxNiAtICByZWFkIG9uZSBieXRlIGVuZGlhbm5lc3MgYXdhcmUgZnJvbSB0aGUgY2hpcAogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiAgcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aCB3aXRoCi0gKiBlbmRpYW5lc3MgY29udmVyc2lvbgorICogcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2lkdGggd2l0aCBlbmRpYW5uZXNzIGNvbnZlcnNpb24KICAqLwogc3RhdGljIHVfY2hhciBhdV9yZWFkX2J5dGUxNihzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKQEAgLTg4LDEyICs5MSwxMSBAQAogfQogCiAvKioKLSAqIGF1X3dyaXRlX2J5dGUxNiAtICB3cml0ZSBvbmUgYnl0ZSBlbmRpYW5lc3MgYXdhcmUgdG8gdGhlIGNoaXAKKyAqIGF1X3dyaXRlX2J5dGUxNiAtICB3cml0ZSBvbmUgYnl0ZSBlbmRpYW5uZXNzIGF3YXJlIHRvIHRoZSBjaGlwCiAgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQogICogQGJ5dGU6CXBvaW50ZXIgdG8gZGF0YSBieXRlIHRvIHdyaXRlCiAgKgotICogIHdyaXRlIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aXRoIHdpdGgKLSAqIGVuZGlhbmVzcyBjb252ZXJzaW9uCisgKiB3cml0ZSBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2lkdGggd2l0aCBlbmRpYW5uZXNzIGNvbnZlcnNpb24KICAqLwogc3RhdGljIHZvaWQgYXVfd3JpdGVfYnl0ZTE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgYnl0ZSkKIHsKQEAgLTEwNiw4ICsxMDgsNyBAQAogICogYXVfcmVhZF93b3JkIC0gIHJlYWQgb25lIHdvcmQgZnJvbSB0aGUgY2hpcAogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiAgcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aCB3aXRob3V0Ci0gKiBlbmRpYW5lc3MgY29udmVyc2lvbgorICogcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2lkdGggd2l0aG91dCBlbmRpYW5uZXNzIGNvbnZlcnNpb24KICAqLwogc3RhdGljIHUxNiBhdV9yZWFkX3dvcmQoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CkBAIC0xMjMsNyArMTI0LDcgQEAKICAqIEBidWY6CWRhdGEgYnVmZmVyCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAqCi0gKiAgd3JpdGUgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICogd3JpdGUgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2lkdGgKICAqLwogc3RhdGljIHZvaWQgYXVfd3JpdGVfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTE0Miw3ICsxNDMsNyBAQAogICogQGJ1ZjoJYnVmZmVyIHRvIHN0b3JlIGRhdGUKICAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byByZWFkCiAgKgotICogIHJlYWQgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICogcmVhZCBmdW5jdGlvbiBmb3IgOGJpdCBidXN3aWR0aAogICovCiBzdGF0aWMgdm9pZCBhdV9yZWFkX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpidWYsIGludCBsZW4pCiB7CkBAIC0xNjEsNyArMTYyLDcgQEAKICAqIEBidWY6CWJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGNvbXBhcmUKICAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byBjb21wYXJlCiAgKgotICogIHZlcmlmeSBmdW5jdGlvbiBmb3IgOGJpdCBidXN3aXRoCisgKiB2ZXJpZnkgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2lkdGgKICAqLwogc3RhdGljIGludCBhdV92ZXJpZnlfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTE4Myw3ICsxODQsNyBAQAogICogQGJ1ZjoJZGF0YSBidWZmZXIKICAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byB3cml0ZQogICoKLSAqICB3cml0ZSBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aAorICogd3JpdGUgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpZHRoCiAgKi8KIHN0YXRpYyB2b2lkIGF1X3dyaXRlX2J1ZjE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTIwNSw3ICsyMDYsNyBAQAogICogQGJ1ZjoJYnVmZmVyIHRvIHN0b3JlIGRhdGUKICAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byByZWFkCiAgKgotICogIHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGgKKyAqIHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpZHRoCiAgKi8KIHN0YXRpYyB2b2lkIGF1X3JlYWRfYnVmMTYoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqYnVmLCBpbnQgbGVuKQogewpAQCAtMjI2LDcgKzIyNyw3IEBACiAgKiBAYnVmOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb21wYXJlCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQogICoKLSAqICB2ZXJpZnkgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGgKKyAqIHZlcmlmeSBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2lkdGgKICAqLwogc3RhdGljIGludCBhdV92ZXJpZnlfYnVmMTYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9hdXRjcHUxMi5jIGIvZHJpdmVycy9tdGQvbmFuZC9hdXRjcHUxMi5jCmluZGV4IGVkZGM5YTIuLjJlNDJlYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvYXV0Y3B1MTIuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2F1dGNwdTEyLmMKQEAgLTE3Miw5ICsxNzIsOSBAQAogCiAJLyogRW5hYmxlIHRoZSBmb2xsb3dpbmcgZm9yIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlICovCiAJLyoKLQkgICB0aGlzLT5vcHRpb25zID0gTkFORF9VU0VfRkxBU0hfQkJUOworCSAgIHRoaXMtPmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIOwogCSAqLwotCXRoaXMtPm9wdGlvbnMgPSBOQU5EX1VTRV9GTEFTSF9CQlQ7CisJdGhpcy0+YmJ0X29wdGlvbnMgPSBOQU5EX0JCVF9VU0VfRkxBU0g7CiAKIAkvKiBTY2FuIHRvIGZpbmQgZXhpc3RlbmNlIG9mIHRoZSBkZXZpY2UgKi8KIAlpZiAobmFuZF9zY2FuKGF1dGNwdTEyX210ZCwgMSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvYmNtX3VtaV9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2JjbV91bWlfbmFuZC5jCmluZGV4IDhjNTY5ZTQuLjQ2YjU4ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvYmNtX3VtaV9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9iY21fdW1pX25hbmQuYwpAQCAtNTIsOCArNTIsNiBAQAogc3RhdGljIGNvbnN0IF9fZGV2aW5pdGNvbnN0IGNoYXIgZ0Jhbm5lcltdID0gS0VSTl9JTkZPIFwKIAkiQkNNIFVNSSBNVEQgTkFORCBEcml2ZXI6IDEuMDBcbiI7CiAKLWNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogI2lmIE5BTkRfRUNDX0JDSAogc3RhdGljIHVpbnQ4X3Qgc2Nhbl9mZl9wYXR0ZXJuW10gPSB7IDB4ZmYgfTsKIApAQCAtMzc2LDE2ICszNzQsMTggQEAKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCi0JaWYgKCFyKQotCQlyZXR1cm4gLUVOWElPOworCWlmICghcikgeworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gb3V0X2ZyZWU7CisJfQogCiAJLyogbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAliY21fdW1pX2lvX2Jhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKIAogCWlmICghYmNtX3VtaV9pb19iYXNlKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaW9yZW1hcCB0byBhY2Nlc3MgQkNNIFVNSSBOQU5EIGNoaXAgZmFpbGVkXG4iKTsKLQkJa2ZyZWUoYm9hcmRfbXRkKTsKLQkJcmV0dXJuIC1FSU87CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJLyogR2V0IHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhICovCkBAIC00MDEsOSArNDAxLDggQEAKIAkvKiBJbml0aWFsaXplIHRoZSBOQU5EIGhhcmR3YXJlLiAgKi8KIAlpZiAoYmNtX3VtaV9uYW5kX2luaXRodygpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkJDTSBVTUkgTkFORCBjaGlwIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZFxuIik7Ci0JCWlvdW5tYXAoYmNtX3VtaV9pb19iYXNlKTsKLQkJa2ZyZWUoYm9hcmRfbXRkKTsKLQkJcmV0dXJuIC1FSU87CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X3VubWFwOwogCX0KIAogCS8qIFNldCBhZGRyZXNzIG9mIE5BTkQgSU8gbGluZXMgKi8KQEAgLTQzNiw3ICs0MzUsNyBAQAogI2lmIFVTRV9ETUEKIAllcnIgPSBuYW5kX2RtYV9pbml0KCk7CiAJaWYgKGVyciAhPSAwKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIG91dF91bm1hcDsKICNlbmRpZgogCiAJLyogRmlndXJlIG91dCB0aGUgc2l6ZSBvZiB0aGUgZGV2aWNlIHRoYXQgd2UgaGF2ZS4KQEAgLTQ0Nyw5ICs0NDYsNyBAQAogCWVyciA9IG5hbmRfc2Nhbl9pZGVudChib2FyZF9tdGQsIDEsIE5VTEwpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJuYW5kX3NjYW4gZmFpbGVkOiAlZFxuIiwgZXJyKTsKLQkJaW91bm1hcChiY21fdW1pX2lvX2Jhc2UpOwotCQlrZnJlZShib2FyZF9tdGQpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIG91dF91bm1hcDsKIAl9CiAKIAkvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBuYW5kIHNpemUsIHdlIGNhbiBzZXR1cCB0aGUgRUNDIGxheW91dCAqLwpAQCAtNDY4LDEzICs0NjUsMTQgQEAKIAkJewogCQkJcHJpbnRrKEtFUk5fRVJSICJOQU5EIC0gVW5yZWNvZ25pemVkIHBhZ2VzaXplOiAlZFxuIiwKIAkJCQkJIGJvYXJkX210ZC0+d3JpdGVzaXplKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X3VubWFwOwogCQl9CiAJfQogCiAjaWYgTkFORF9FQ0NfQkNICiAJaWYgKGJvYXJkX210ZC0+d3JpdGVzaXplID4gNTEyKSB7Ci0JCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9VU0VfRkxBU0hfQkJUKQorCQlpZiAodGhpcy0+YmJ0X29wdGlvbnMgJiBOQU5EX0JCVF9VU0VfRkxBU0gpCiAJCQlsYXJnZXBhZ2VfYmJ0Lm9wdGlvbnMgPSBOQU5EX0JCVF9TQ0FOMk5EUEFHRTsKIAkJdGhpcy0+YmFkYmxvY2tfcGF0dGVybiA9ICZsYXJnZXBhZ2VfYmJ0OwogCX0KQEAgLTQ4NSwzMyArNDgzLDIwIEBACiAJZXJyID0gbmFuZF9zY2FuX3RhaWwoYm9hcmRfbXRkKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibmFuZF9zY2FuIGZhaWxlZDogJWRcbiIsIGVycik7Ci0JCWlvdW5tYXAoYmNtX3VtaV9pb19iYXNlKTsKLQkJa2ZyZWUoYm9hcmRfbXRkKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXRfdW5tYXA7CiAJfQogCiAJLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KLQl7Ci0JCWludCBucl9wYXJ0aXRpb25zOwotCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydGl0aW9uX2luZm87Ci0KLQkJYm9hcmRfbXRkLT5uYW1lID0gImJjbV91bWktbmFuZCI7Ci0JCW5yX3BhcnRpdGlvbnMgPQotCQkgICAgcGFyc2VfbXRkX3BhcnRpdGlvbnMoYm9hcmRfbXRkLCBwYXJ0X3Byb2JlcywKLQkJCQkJICZwYXJ0aXRpb25faW5mbywgMCk7Ci0KLQkJaWYgKG5yX3BhcnRpdGlvbnMgPD0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJCQ00gVU1JIE5BTkQ6IFRvbyBmZXcgcGFydGl0aW9ucyAtICVkXG4iLAotCQkJICAgICAgIG5yX3BhcnRpdGlvbnMpOwotCQkJaW91bm1hcChiY21fdW1pX2lvX2Jhc2UpOwotCQkJa2ZyZWUoYm9hcmRfbXRkKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoYm9hcmRfbXRkLCBwYXJ0aXRpb25faW5mbywgbnJfcGFydGl0aW9ucyk7Ci0JfQorCWJvYXJkX210ZC0+bmFtZSA9ICJiY21fdW1pLW5hbmQiOworCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoYm9hcmRfbXRkLCBOVUxMLCAwLCBOVUxMLCAwKTsKIAogCS8qIFJldHVybiBoYXBweSAqLwogCXJldHVybiAwOworb3V0X3VubWFwOgorCWlvdW5tYXAoYmNtX3VtaV9pb19iYXNlKTsKK291dF9mcmVlOgorCWtmcmVlKGJvYXJkX210ZCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBiY21fdW1pX25hbmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2NhZmVfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9jYWZlX25hbmQuYwppbmRleCA4N2ViYjRlLi43MmQzZjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2NhZmVfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvY2FmZV9uYW5kLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBDQUZFX05BTkRfQ1RSTDEJCTB4MDAKQEAgLTU3LDcgKzU4LDYgQEAKIAogc3RydWN0IGNhZmVfcHJpdiB7CiAJc3RydWN0IG5hbmRfY2hpcCBuYW5kOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAl2b2lkIF9faW9tZW0gKm1taW87CiAJc3RydWN0IHJzX2NvbnRyb2wgKnJzOwpAQCAtMzcxLDcgKzM3MSw3IEBACiAJcmV0dXJuIDE7CiB9CiAvKioKLSAqIGNhZmVfbmFuZF9yZWFkX3BhZ2Vfc3luZHJvbWUgLSB7UkVQTEFDQUJMRV0gaGFyZHdhcmUgZWNjIHN5bmRyb20gYmFzZWQgcGFnZSByZWFkCisgKiBjYWZlX25hbmRfcmVhZF9wYWdlX3N5bmRyb21lIC0gW1JFUExBQ0VBQkxFXSBoYXJkd2FyZSBlY2Mgc3luZHJvbWUgYmFzZWQgcGFnZSByZWFkCiAgKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKICAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKICAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKQEAgLTYzMCw4ICs2MzAsNiBAQAogCXN0cnVjdCBjYWZlX3ByaXYgKmNhZmU7CiAJdWludDMyX3QgY3RybDsKIAlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7Ci0JaW50IG5yX3BhcnRzOwogCiAJLyogVmVyeSBvbGQgdmVyc2lvbnMgc2hhcmVkIHRoZSBzYW1lIFBDSSBpZGVudCBmb3IgYWxsIHRocmVlCiAJICAgZnVuY3Rpb25zIG9uIHRoZSBjaGlwLiBWZXJpZnkgdGhlIGNsYXNzIHRvby4uLiAqLwpAQCAtNjg2LDcgKzY4NCw4IEBACiAJY2FmZS0+bmFuZC5jaGlwX2RlbGF5ID0gMDsKIAogCS8qIEVuYWJsZSB0aGUgZm9sbG93aW5nIGZvciBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSAqLwotCWNhZmUtPm5hbmQub3B0aW9ucyA9IE5BTkRfVVNFX0ZMQVNIX0JCVCB8IE5BTkRfTk9fQVVUT0lOQ1IgfCBOQU5EX09XTl9CVUZGRVJTOworCWNhZmUtPm5hbmQuYmJ0X29wdGlvbnMgPSBOQU5EX0JCVF9VU0VfRkxBU0g7CisJY2FmZS0+bmFuZC5vcHRpb25zID0gTkFORF9OT19BVVRPSU5DUiB8IE5BTkRfT1dOX0JVRkZFUlM7CiAKIAlpZiAoc2tpcGJidCkgewogCQljYWZlLT5uYW5kLm9wdGlvbnMgfD0gTkFORF9TS0lQX0JCVFNDQU47CkBAIC03OTksMTggKzc5OCw5IEBACiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgbXRkKTsKIAotCS8qIFdlIHJlZ2lzdGVyIHRoZSB3aG9sZSBkZXZpY2UgZmlyc3QsIHNlcGFyYXRlIGZyb20gdGhlIHBhcnRpdGlvbnMgKi8KLQltdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwgMCk7Ci0KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKIAltdGQtPm5hbWUgPSAiY2FmZV9uYW5kIjsKLSNlbmRpZgotCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0X3Byb2JlcywgJnBhcnRzLCAwKTsKLQlpZiAobnJfcGFydHMgPiAwKSB7Ci0JCWNhZmUtPnBhcnRzID0gcGFydHM7Ci0JCWRldl9pbmZvKCZjYWZlLT5wZGV2LT5kZXYsICIlZCBwYXJ0aXRpb25zIGZvdW5kXG4iLCBucl9wYXJ0cyk7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBwYXJ0cywgbnJfcGFydHMpOwotCX0KKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKG10ZCwgcGFydF9wcm9iZXMsIDAsIE5VTEwsIDApOworCiAJZ290byBvdXQ7CiAKICBvdXRfaXJxOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9jbXgyNzBfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9jbXgyNzBfbmFuZC5jCmluZGV4IDZmYzA0M2EuLjczN2VmOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvY214MjcwX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2NteDI3MF9uYW5kLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC01MCw4ICs1MSw2IEBACiB9OwogI2RlZmluZSBOVU1fUEFSVElUSU9OUyAoQVJSQVlfU0laRShwYXJ0aXRpb25faW5mbykpCiAKLWNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogc3RhdGljIHVfY2hhciBjbXgyNzBfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CkBAIC0xNTEsOSArMTUwLDYgQEAKIHN0YXRpYyBpbnQgX19pbml0IGNteDI3MF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpczsKLQljb25zdCBjaGFyICpwYXJ0X3R5cGU7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0czsKLQlpbnQgbXRkX3BhcnRzX25iID0gMDsKIAlpbnQgcmV0OwogCiAJaWYgKCEobWFjaGluZV9pc19hcm1jb3JlKCkgJiYgY3B1X2lzX3B4YTI3eCgpKSkKQEAgLTIyMiwyMyArMjE4LDkgQEAKIAkJZ290byBlcnJfc2NhbjsKIAl9CiAKLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLQltdGRfcGFydHNfbmIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhjbXgyNzBfbmFuZF9tdGQsIHBhcnRfcHJvYmVzLAotCQkJCQkgICAgJm10ZF9wYXJ0cywgMCk7Ci0JaWYgKG10ZF9wYXJ0c19uYiA+IDApCi0JCXBhcnRfdHlwZSA9ICJjb21tYW5kIGxpbmUiOwotCWVsc2UKLQkJbXRkX3BhcnRzX25iID0gMDsKLSNlbmRpZgotCWlmICghbXRkX3BhcnRzX25iKSB7Ci0JCW10ZF9wYXJ0cyA9IHBhcnRpdGlvbl9pbmZvOwotCQltdGRfcGFydHNfbmIgPSBOVU1fUEFSVElUSU9OUzsKLQkJcGFydF90eXBlID0gInN0YXRpYyI7Ci0JfQotCiAJLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KLQlwcl9ub3RpY2UoIlVzaW5nICVzIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOwotCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoY214MjcwX25hbmRfbXRkLCBtdGRfcGFydHMsIG10ZF9wYXJ0c19uYik7CisJcmV0ID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihjbXgyNzBfbmFuZF9tdGQsIE5VTEwsIDAsCisJCQkJCXBhcnRpdGlvbl9pbmZvLCBOVU1fUEFSVElUSU9OUyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfc2NhbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9jczU1M3hfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9jczU1M3hfbmFuZC5jCmluZGV4IGY1OWFkMWYuLjQxNGFmYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvY3M1NTN4X25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2NzNTUzeF9uYW5kLmMKQEAgLTIzOSw3ICsyMzksOCBAQAogCXRoaXMtPmVjYy5jb3JyZWN0ICA9IG5hbmRfY29ycmVjdF9kYXRhOwogCiAJLyogRW5hYmxlIHRoZSBmb2xsb3dpbmcgZm9yIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlICovCi0JdGhpcy0+b3B0aW9ucyA9IE5BTkRfVVNFX0ZMQVNIX0JCVCB8IE5BTkRfTk9fQVVUT0lOQ1I7CisJdGhpcy0+YmJ0X29wdGlvbnMgPSBOQU5EX0JCVF9VU0VfRkxBU0g7CisJdGhpcy0+b3B0aW9ucyA9IE5BTkRfTk9fQVVUT0lOQ1I7CiAKIAkvKiBTY2FuIHRvIGZpbmQgZXhpc3RlbmNlIG9mIHRoZSBkZXZpY2UgKi8KIAlpZiAobmFuZF9zY2FuKG5ld19tdGQsIDEpKSB7CkBAIC0yNzcsMTUgKzI3OCwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCiBzdGF0aWMgaW50IF9faW5pdCBjczU1M3hfaW5pdCh2b2lkKQogewogCWludCBlcnIgPSAtRU5YSU87CiAJaW50IGk7CiAJdWludDY0X3QgdmFsOwotCWludCBtdGRfcGFydHNfbmIgPSAwOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICptdGRfcGFydHMgPSBOVUxMOwogCiAJLyogSWYgdGhlIENQVSBpc24ndCBhIEdlb2RlIEdYIG9yIExYLCBhYm9ydCAqLwogCWlmICghaXNfZ2VvZGUoKSkKQEAgLTMxNSwxMyArMzEyLDkgQEAKIAkgICBkbyBtdGRjb25jYXQgZXRjLiBpZiB3ZSB3YW50IHRvLiAqLwogCWZvciAoaSA9IDA7IGkgPCBOUl9DUzU1M1hfQ09OVFJPTExFUlM7IGkrKykgewogCQlpZiAoY3M1NTN4X210ZFtpXSkgewotCiAJCQkvKiBJZiBhbnkgZGV2aWNlcyByZWdpc3RlcmVkLCByZXR1cm4gc3VjY2Vzcy4gRWxzZSB0aGUgbGFzdCBlcnJvci4gKi8KLQkJCW10ZF9wYXJ0c19uYiA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGNzNTUzeF9tdGRbaV0sIHBhcnRfcHJvYmVzLCAmbXRkX3BhcnRzLCAwKTsKLQkJCWlmIChtdGRfcGFydHNfbmIgPiAwKQotCQkJCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgY29tbWFuZCBsaW5lIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iKTsKLQkJCW10ZF9kZXZpY2VfcmVnaXN0ZXIoY3M1NTN4X210ZFtpXSwgbXRkX3BhcnRzLAotCQkJCQkgICAgbXRkX3BhcnRzX25iKTsKKwkJCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoY3M1NTN4X210ZFtpXSwgTlVMTCwgMCwKKwkJCQkJCSAgTlVMTCwgMCk7CiAJCQllcnIgPSAwOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9kYXZpbmNpX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvZGF2aW5jaV9uYW5kLmMKaW5kZXggMWYzNDk1MS4uYzE1M2UxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9kYXZpbmNpX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2RhdmluY2lfbmFuZC5jCkBAIC01Nyw3ICs1Nyw2IEBACiAKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCBjbGsJCSpjbGs7Ci0JYm9vbAkJCXBhcnRpdGlvbmVkOwogCiAJYm9vbAkJCWlzX3JlYWRtb2RlOwogCkBAIC01MzAsOCArNTI5LDYgQEAKIAlpbnQJCQkJcmV0OwogCXVpbnQzMl90CQkJdmFsOwogCW5hbmRfZWNjX21vZGVzX3QJCWVjY19tb2RlOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCQkqbXRkX3BhcnRzID0gTlVMTDsKLQlpbnQJCQkJbXRkX3BhcnRzX25iID0gMDsKIAogCS8qIGluc2lzdCBvbiBib2FyZC1zcGVjaWZpYyBjb25maWd1cmF0aW9uICovCiAJaWYgKCFwZGF0YSkKQEAgLTU4MSw3ICs1NzgsOSBAQAogCWluZm8tPmNoaXAuY2hpcF9kZWxheQk9IDA7CiAJaW5mby0+Y2hpcC5zZWxlY3RfY2hpcAk9IG5hbmRfZGF2aW5jaV9zZWxlY3RfY2hpcDsKIAotCS8qIG9wdGlvbnMgc3VjaCBhcyBOQU5EX1VTRV9GTEFTSF9CQlQgb3IgMTYtYml0IHdpZHRocyAqLworCS8qIG9wdGlvbnMgc3VjaCBhcyBOQU5EX0JCVF9VU0VfRkxBU0ggKi8KKwlpbmZvLT5jaGlwLmJidF9vcHRpb25zCT0gcGRhdGEtPmJidF9vcHRpb25zOworCS8qIG9wdGlvbnMgc3VjaCBhcyAxNi1iaXQgd2lkdGhzICovCiAJaW5mby0+Y2hpcC5vcHRpb25zCT0gcGRhdGEtPm9wdGlvbnM7CiAJaW5mby0+Y2hpcC5iYnRfdGQJPSBwZGF0YS0+YmJ0X3RkOwogCWluZm8tPmNoaXAuYmJ0X21kCT0gcGRhdGEtPmJidF9tZDsKQEAgLTc1MSwzMyArNzUwLDggQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfc2NhbjsKIAotCWlmIChtdGRfaGFzX2NtZGxpbmVwYXJ0KCkpIHsKLQkJc3RhdGljIGNvbnN0IGNoYXIgKnByb2Jlc1tdIF9faW5pdGNvbnN0ID0gewotCQkJImNtZGxpbmVwYXJ0IiwgTlVMTAotCQl9OwotCi0JCW10ZF9wYXJ0c19uYiA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZpbmZvLT5tdGQsIHByb2JlcywKLQkJCQkJCSAgICAmbXRkX3BhcnRzLCAwKTsKLQl9Ci0KLQlpZiAobXRkX3BhcnRzX25iIDw9IDApIHsKLQkJbXRkX3BhcnRzID0gcGRhdGEtPnBhcnRzOwotCQltdGRfcGFydHNfbmIgPSBwZGF0YS0+bnJfcGFydHM7Ci0JfQotCi0JLyogUmVnaXN0ZXIgYW55IHBhcnRpdGlvbnMgKi8KLQlpZiAobXRkX3BhcnRzX25iID4gMCkgewotCQlyZXQgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZpbmZvLT5tdGQsIG10ZF9wYXJ0cywKLQkJCQkJICBtdGRfcGFydHNfbmIpOwotCQlpZiAocmV0ID09IDApCi0JCQlpbmZvLT5wYXJ0aXRpb25lZCA9IHRydWU7Ci0JfQotCi0JLyogSWYgdGhlcmUncyBubyBwYXJ0aXRpb24gaW5mbywganVzdCBwYWNrYWdlIHRoZSB3aG9sZSBjaGlwCi0JICogYXMgYSBzaW5nbGUgTVREIGRldmljZS4KLQkgKi8KLQlpZiAoIWluZm8tPnBhcnRpdGlvbmVkKQotCQlyZXQgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZpbmZvLT5tdGQsIE5VTEwsIDApID8gLUVOT0RFViA6IDA7CisJcmV0ID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmaW5mby0+bXRkLCBOVUxMLCAwLAorCQkJcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOwogCiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX3NjYW47CkBAIC04MTYsOSArNzkwLDYgQEAKIHN0YXRpYyBpbnQgX19leGl0IG5hbmRfZGF2aW5jaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGF2aW5jaV9uYW5kX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gbXRkX2RldmljZV91bnJlZ2lzdGVyKCZpbmZvLT5tdGQpOwogCiAJc3Bpbl9sb2NrX2lycSgmZGF2aW5jaV9uYW5kX2xvY2spOwogCWlmIChpbmZvLT5jaGlwLmVjYy5tb2RlID09IE5BTkRfRUNDX0hXX1NZTkRST01FKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9kZW5hbGkuYyBiL2RyaXZlcnMvbXRkL25hbmQvZGVuYWxpLmMKaW5kZXggZDUyNzYyMS4uMzk4NGQ0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9kZW5hbGkuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2RlbmFsaS5jCkBAIC0xMzQ2LDYgKzEzNDYsNyBAQAogCSAqICovCiAJZGVuYWxpLT5iYnRza2lwYnl0ZXMgPSBpb3JlYWQzMihkZW5hbGktPmZsYXNoX3JlZyArCiAJCQkJCQlTUEFSRV9BUkVBX1NLSVBfQllURVMpOworCWRldGVjdF9tYXhfYmFua3MoZGVuYWxpKTsKIAlkZW5hbGlfbmFuZF9yZXNldChkZW5hbGkpOwogCWlvd3JpdGUzMigweDBGLCBkZW5hbGktPmZsYXNoX3JlZyArIFJCX1BJTl9FTkFCTEVEKTsKIAlpb3dyaXRlMzIoQ0hJUF9FTl9ET05UX0NBUkVfX0ZMQUcsCkBAIC0xMzU2LDcgKzEzNTcsNiBAQAogCS8qIFNob3VsZCBzZXQgdmFsdWUgZm9yIHRoZXNlIHJlZ2lzdGVycyB3aGVuIGluaXQgKi8KIAlpb3dyaXRlMzIoMCwgZGVuYWxpLT5mbGFzaF9yZWcgKyBUV09fUk9XX0FERFJfQ1lDTEVTKTsKIAlpb3dyaXRlMzIoMSwgZGVuYWxpLT5mbGFzaF9yZWcgKyBFQ0NfRU5BQkxFKTsKLQlkZXRlY3RfbWF4X2JhbmtzKGRlbmFsaSk7CiAJZGVuYWxpX25hbmRfdGltaW5nX3NldChkZW5hbGkpOwogCWRlbmFsaV9pcnFfaW5pdChkZW5hbGkpOwogfQpAQCAtMTU3Nyw3ICsxNTc3LDggQEAKIAlkZW5hbGktPm5hbmQuYmJ0X21kID0gJmJidF9taXJyb3JfZGVzY3I7CiAKIAkvKiBza2lwIHRoZSBzY2FuIGZvciBub3cgdW50aWwgd2UgaGF2ZSBPT0IgcmVhZCBhbmQgd3JpdGUgc3VwcG9ydCAqLwotCWRlbmFsaS0+bmFuZC5vcHRpb25zIHw9IE5BTkRfVVNFX0ZMQVNIX0JCVCB8IE5BTkRfU0tJUF9CQlRTQ0FOOworCWRlbmFsaS0+bmFuZC5iYnRfb3B0aW9ucyB8PSBOQU5EX0JCVF9VU0VfRkxBU0g7CisJZGVuYWxpLT5uYW5kLm9wdGlvbnMgfD0gTkFORF9TS0lQX0JCVFNDQU47CiAJZGVuYWxpLT5uYW5kLmVjYy5tb2RlID0gTkFORF9FQ0NfSFdfU1lORFJPTUU7CiAKIAkvKiBEZW5hbGkgQ29udHJvbGxlciBvbmx5IHN1cHBvcnQgMTViaXQgYW5kIDhiaXQgRUNDIGluIE1SU1QsCkBAIC0xNjc2LDcgKzE2NzcsNiBAQAogCXN0cnVjdCBkZW5hbGlfbmFuZF9pbmZvICpkZW5hbGkgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAogCW5hbmRfcmVsZWFzZSgmZGVuYWxpLT5tdGQpOwotCW10ZF9kZXZpY2VfdW5yZWdpc3RlcigmZGVuYWxpLT5tdGQpOwogCiAJZGVuYWxpX2lycV9jbGVhbnVwKGRldi0+aXJxLCBkZW5hbGkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYyBiL2RyaXZlcnMvbXRkL25hbmQvZGlza29uY2hpcC5jCmluZGV4IDc4Mzc3MjguLjU3ODBkYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZGlza29uY2hpcC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZGlza29uY2hpcC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL2RvYzIwMDAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9pbmZ0bC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBXaGVyZSB0byBsb29rIGZvciB0aGUgZGV2aWNlcz8gKi8KICNpZm5kZWYgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVBfUFJPQkVfQUREUkVTUwpAQCAtMTMyLDcgKzEzMyw3IEBACiAKIC8qCiAgKiBUaGUgSFcgZGVjb2RlciBpbiB0aGUgRG9DIEFTSUMncyBwcm92aWRlcyB1cyBhIGVycm9yIHN5bmRyb21lLAotICogd2hpY2ggd2UgbXVzdCBjb252ZXJ0IHRvIGEgc3RhbmRhcmQgc3luZHJvbSB1c2FibGUgYnkgdGhlIGdlbmVyaWMKKyAqIHdoaWNoIHdlIG11c3QgY29udmVydCB0byBhIHN0YW5kYXJkIHN5bmRyb21lIHVzYWJsZSBieSB0aGUgZ2VuZXJpYwogICogUmVlZC1Tb2xvbW9uIGxpYnJhcnkgY29kZS4KICAqCiAgKiBGYWJyaWNlIEJlbGxhcmQgZmlndXJlZCB0aGlzIG91dCBpbiB0aGUgb2xkIGRvY2VjYyBjb2RlLiBJIGFkZGVkCkBAIC0xNTMsNyArMTU0LDcgQEAKIAlkc1szXSA9ICgoZWNjWzNdICYgMHhjMCkgPj4gNikgfCAoKGVjY1swXSAmIDB4ZmYpIDw8IDIpOwogCXBhcml0eSA9IGVjY1sxXTsKIAotCS8qIEluaXRpYWxpemUgdGhlIHN5bmRyb20gYnVmZmVyICovCisJLyogSW5pdGlhbGl6ZSB0aGUgc3luZHJvbWUgYnVmZmVyICovCiAJZm9yIChpID0gMDsgaSA8IE5ST09UUzsgaSsrKQogCQlzW2ldID0gZHNbMF07CiAJLyoKQEAgLTEwMzEsNyArMTAzMiw3IEBACiAJCVdyaXRlRE9DKERPQ19FQ0NfRElTLCBkb2NwdHIsIE1wbHVzX0VDQ0NvbmYpOwogCWVsc2UKIAkJV3JpdGVET0MoRE9DX0VDQ19ESVMsIGRvY3B0ciwgRUNDQ29uZik7Ci0JaWYgKG5vX2VjY19mYWlsdXJlcyAmJiAocmV0ID09IC1FQkFETVNHKSkgeworCWlmIChub19lY2NfZmFpbHVyZXMgJiYgbXRkX2lzX2VjY2VycihyZXQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic3VwcHJlc3NpbmcgRUNDIGZhaWx1cmVcbiIpOwogCQlyZXQgPSAwOwogCX0KQEAgLTE2NTIsNyArMTY1Myw3IEBACiAJbmFuZC0+ZWNjLm1vZGUJCT0gTkFORF9FQ0NfSFdfU1lORFJPTUU7CiAJbmFuZC0+ZWNjLnNpemUJCT0gNTEyOwogCW5hbmQtPmVjYy5ieXRlcwkJPSA2OwotCW5hbmQtPm9wdGlvbnMJCT0gTkFORF9VU0VfRkxBU0hfQkJUOworCW5hbmQtPmJidF9vcHRpb25zCT0gTkFORF9CQlRfVVNFX0ZMQVNIOwogCiAJZG9jLT5waHlzYWRyCQk9IHBoeXNhZHI7CiAJZG9jLT52aXJ0YWRyCQk9IHZpcnRhZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2VkYjczMTIuYyBiL2RyaXZlcnMvbXRkL25hbmQvZWRiNzMxMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDAwZDBmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZWRiNzMxMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiAgZHJpdmVycy9tdGQvbmFuZC9lZGI3MzEyLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcml1cyBHcsO2Z2VyIChtYWdAc3lzZ28uZGUpCi0gKgotICogIERlcml2ZWQgZnJvbSBkcml2ZXJzL210ZC9uYW5kL2F1dGNwdTEyLmMKLSAqICAgICAgIENvcHlyaWdodCAoYykgMjAwMSBUaG9tYXMgR2xlaXhuZXIgKGdsZWl4bmVyQGF1dHJvbml4LmRlKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogIE92ZXJ2aWV3OgotICogICBUaGlzIGlzIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggZGV2aWNlIGZvdW5kIG9uIHRoZQotICogICBDTEVQNzMxMiBib2FyZCB3aGljaCB1dGlsaXplcyB0aGUgVG9zaGliYSBUQzU4VjY0QUZUIHBhcnQuIFRoaXMgaXMKLSAqICAgYSA2NE1pYml0ICg4TWlCIHggOCBiaXRzKSBOQU5EIGZsYXNoIGRldmljZS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4JLyogZm9yIENMUFM3MTExX1ZJUlRfQkFTRSAqLwotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgotCi0vKgotICogTVREIHN0cnVjdHVyZSBmb3IgRURCNzMxMiBib2FyZAotICovCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICplcDczMTJfbXRkID0gTlVMTDsKLQotLyoKLSAqIFZhbHVlcyBzcGVjaWZpYyB0byB0aGUgRURCNzMxMiBib2FyZCAodXNlZCB3aXRoIEVQNzMxMiBwcm9jZXNzb3IpCi0gKi8KLSNkZWZpbmUgRVA3MzEyX0ZJT19QQkFTRSAweDEwMDAwMDAwCS8qIFBoeXMgYWRkcmVzcyBvZiBmbGFzaCAqLwotI2RlZmluZSBFUDczMTJfUFhEUgkweDAwMDEJLyoKLQkJCQkgKiBJTyBvZmZzZXQgdG8gUG9ydCBCIGRhdGEgcmVnaXN0ZXIKLQkJCQkgKiB3aGVyZSB0aGUgQ0xFLCBBTEUgYW5kIE5DRSBwaW5zCi0JCQkJICogYXJlIHdpcmVkIHRvLgotCQkJCSAqLwotI2RlZmluZSBFUDczMTJfUFhERFIJMHgwMDQxCS8qCi0JCQkJICogSU8gb2Zmc2V0IHRvIFBvcnQgQiBkYXRhIGRpcmVjdGlvbgotCQkJCSAqIHJlZ2lzdGVyIHNvIHdlIGNhbiBjb250cm9sIHRoZSBJTwotCQkJCSAqIGxpbmVzLgotCQkJCSAqLwotCi0vKgotICogTW9kdWxlIHN0dWZmCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXA3MzEyX2Zpb19wYmFzZSA9IEVQNzMxMl9GSU9fUEJBU0U7Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICplcDczMTJfcHhkciA9ICh2b2lkIF9faW9tZW0gKilFUDczMTJfUFhEUjsKLXN0YXRpYyB2b2lkIF9faW9tZW0gKmVwNzMxMl9weGRkciA9ICh2b2lkIF9faW9tZW0gKilFUDczMTJfUFhERFI7Ci0KLS8qCi0gKiBEZWZpbmUgc3RhdGljIHBhcnRpdGlvbnMgZm9yIGZsYXNoIGRldmljZQotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bXSA9IHsKLQl7Lm5hbWUgPSAiRVA3MzEyIE5hbmQgRmxhc2giLAotCSAub2Zmc2V0ID0gMCwKLQkgLnNpemUgPSA4ICogMTAyNCAqIDEwMjR9Ci19OwotCi0jZGVmaW5lIE5VTV9QQVJUSVRJT05TIDEKLQotLyoKLSAqCWhhcmR3YXJlIHNwZWNpZmljIGFjY2VzcyB0byBjb250cm9sLWxpbmVzCi0gKgotICoJTkFORF9OQ0U6IGJpdCAwIC0+IGJpdCA2IChiaXQgNyA9IDEpCi0gKglOQU5EX0NMRTogYml0IDEgLT4gYml0IDQKLSAqCU5BTkRfQUxFOiBiaXQgMiAtPiBiaXQgNQotICovCi1zdGF0aWMgdm9pZCBlcDczMTJfaHdjb250cm9sKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgY3RybCkKLXsKLQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwotCi0JaWYgKGN0cmwgJiBOQU5EX0NUUkxfQ0hBTkdFKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYml0cyA9IDB4ODA7Ci0KLQkJYml0cyB8PSAoY3RybCAmIChOQU5EX0NMRSB8IE5BTkRfQUxFKSkgPDwgMzsKLQkJYml0cyB8PSAoY3RybCAmIE5BTkRfTkNFKSA/IDB4MDAgOiAweDQwOwotCi0JCWNscHNfd3JpdGViKChjbHBzX3JlYWRiKGVwNzMxMl9weGRyKSAgJiAweEYwKSB8IGJpdHMsCi0JCQkgICAgZXA3MzEyX3B4ZHIpOwotCX0KLQlpZiAoY21kICE9IE5BTkRfQ01EX05PTkUpCi0JCXdyaXRlYihjbWQsIGNoaXAtPklPX0FERFJfVyk7Ci19Ci0KLS8qCi0gKglyZWFkIGRldmljZSByZWFkeSBwaW4KLSAqLwotc3RhdGljIGludCBlcDczMTJfZGV2aWNlX3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotCXJldHVybiAxOwotfQotCi1jb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0KLS8qCi0gKiBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKLSAqLwotc3RhdGljIGludCBfX2luaXQgZXA3MzEyX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOwotCWNvbnN0IGNoYXIgKnBhcnRfdHlwZSA9IDA7Ci0JaW50IG10ZF9wYXJ0c19uYiA9IDA7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyA9IDA7Ci0Jdm9pZCBfX2lvbWVtICplcDczMTJfZmlvX2Jhc2U7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KLQllcDczMTJfbXRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlcDczMTJfbXRkKSB7Ci0JCXByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIEVEQjczMTIgTkFORCBNVEQgZGV2aWNlIHN0cnVjdHVyZS5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBtYXAgcGh5c2ljYWwgYWRkcmVzcyAqLwotCWVwNzMxMl9maW9fYmFzZSA9IGlvcmVtYXAoZXA3MzEyX2Zpb19wYmFzZSwgU1pfMUspOwotCWlmICghZXA3MzEyX2Zpb19iYXNlKSB7Ci0JCXByaW50aygiaW9yZW1hcCBFREI3MzEyIE5BTkQgZmxhc2ggZmFpbGVkXG4iKTsKLQkJa2ZyZWUoZXA3MzEyX210ZCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qIEdldCBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLwotCXRoaXMgPSAoc3RydWN0IG5hbmRfY2hpcCAqKSgmZXA3MzEyX210ZFsxXSk7Ci0KLQkvKiBJbml0aWFsaXplIHN0cnVjdHVyZXMgKi8KLQltZW1zZXQoZXA3MzEyX210ZCwgMCwgc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykpOwotCW1lbXNldCh0aGlzLCAwLCBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkpOwotCi0JLyogTGluayB0aGUgcHJpdmF0ZSBkYXRhIHdpdGggdGhlIE1URCBzdHJ1Y3R1cmUgKi8KLQllcDczMTJfbXRkLT5wcml2ID0gdGhpczsKLQllcDczMTJfbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JLyoKLQkgKiBTZXQgR1BJTyBQb3J0IEIgY29udHJvbCByZWdpc3RlciBzbyB0aGF0IHRoZSBwaW5zIGFyZSBjb25maWd1cmVkCi0JICogdG8gYmUgb3V0cHV0cyBmb3IgY29udHJvbGxpbmcgdGhlIE5BTkQgZmxhc2guCi0JICovCi0JY2xwc193cml0ZWIoMHhmMCwgZXA3MzEyX3B4ZGRyKTsKLQotCS8qIGluc2VydCBjYWxsYmFja3MgKi8KLQl0aGlzLT5JT19BRERSX1IgPSBlcDczMTJfZmlvX2Jhc2U7Ci0JdGhpcy0+SU9fQUREUl9XID0gZXA3MzEyX2Zpb19iYXNlOwotCXRoaXMtPmNtZF9jdHJsID0gZXA3MzEyX2h3Y29udHJvbDsKLQl0aGlzLT5kZXZfcmVhZHkgPSBlcDczMTJfZGV2aWNlX3JlYWR5OwotCS8qIDE1IHVzIGNvbW1hbmQgZGVsYXkgdGltZSAqLwotCXRoaXMtPmNoaXBfZGVsYXkgPSAxNTsKLQotCS8qIFNjYW4gdG8gZmluZCBleGlzdGVuY2Ugb2YgdGhlIGRldmljZSAqLwotCWlmIChuYW5kX3NjYW4oZXA3MzEyX210ZCwgMSkpIHsKLQkJaW91bm1hcCgodm9pZCAqKWVwNzMxMl9maW9fYmFzZSk7Ci0JCWtmcmVlKGVwNzMxMl9tdGQpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQllcDczMTJfbXRkLT5uYW1lID0gImVkYjczMTItbmFuZCI7Ci0JbXRkX3BhcnRzX25iID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoZXA3MzEyX210ZCwgcGFydF9wcm9iZXMsICZtdGRfcGFydHMsIDApOwotCWlmIChtdGRfcGFydHNfbmIgPiAwKQotCQlwYXJ0X3R5cGUgPSAiY29tbWFuZCBsaW5lIjsKLQllbHNlCi0JCW10ZF9wYXJ0c19uYiA9IDA7Ci0JaWYgKG10ZF9wYXJ0c19uYiA9PSAwKSB7Ci0JCW10ZF9wYXJ0cyA9IHBhcnRpdGlvbl9pbmZvOwotCQltdGRfcGFydHNfbmIgPSBOVU1fUEFSVElUSU9OUzsKLQkJcGFydF90eXBlID0gInN0YXRpYyI7Ci0JfQotCi0JLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KLQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nICVzIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOwotCW10ZF9kZXZpY2VfcmVnaXN0ZXIoZXA3MzEyX210ZCwgbXRkX3BhcnRzLCBtdGRfcGFydHNfbmIpOwotCi0JLyogUmV0dXJuIGhhcHB5ICovCi0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KGVwNzMxMl9pbml0KTsKLQotLyoKLSAqIENsZWFuIHVwIHJvdXRpbmUKLSAqLwotc3RhdGljIHZvaWQgX19leGl0IGVwNzMxMl9jbGVhbnVwKHZvaWQpCi17Ci0Jc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopJmVwNzMxMl9tdGRbMV07Ci0KLQkvKiBSZWxlYXNlIHJlc291cmNlcywgdW5yZWdpc3RlciBkZXZpY2UgKi8KLQluYW5kX3JlbGVhc2UoYXA3MzEyX210ZCk7Ci0KLQkvKiBSZWxlYXNlIGlvIHJlc291cmNlICovCi0JaW91bm1hcCh0aGlzLT5JT19BRERSX1IpOwotCi0JLyogRnJlZSB0aGUgTVREIGRldmljZSBzdHJ1Y3R1cmUgKi8KLQlrZnJlZShlcDczMTJfbXRkKTsKLX0KLQotbW9kdWxlX2V4aXQoZXA3MzEyX2NsZWFudXApOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJNYXJpdXMgR3JvZWdlciA8bWFnQHN5c2dvLmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgbWFwIGRyaXZlciBmb3IgQ29nZW50IEVEQjczMTIgYm9hcmQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMKaW5kZXggMzNkOGFhZC4uZWVkZDhlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMKQEAgLTc1LDcgKzc1LDYgQEAKIAl1bnNpZ25lZCBpbnQgdXNlX21kcjsgICAgLyogTm9uIHplcm8gaWYgdGhlIE1EUiBpcyB0byBiZSBzZXQgICAgICAqLwogCXVuc2lnbmVkIGludCBvb2I7ICAgICAgICAvKiBOb24gemVybyBpZiBvcGVyYXRpbmcgb24gT09CIGRhdGEgICAgICovCiAJdW5zaWduZWQgaW50IGNvdW50ZXI7CSAvKiBjb3VudGVyIGZvciB0aGUgaW5pdGlhbGl6YXRpb25zCSAgKi8KLQljaGFyICpvb2JfcG9pOyAgICAgICAgICAgLyogUGxhY2UgdG8gd3JpdGUgRUNDIGFmdGVyIHJlYWQgYmFjayAgICAqLwogfTsKIAogLyogVGhlc2UgbWFwIHRvIHRoZSBwb3NpdGlvbnMgdXNlZCBieSB0aGUgRkNNIGhhcmR3YXJlIEVDQyBnZW5lcmF0b3IgKi8KQEAgLTI0NCw2ICsyNDMsMjUgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCisJaWYgKGNoaXAtPmVjYy5tb2RlICE9IE5BTkRfRUNDX0hXKQorCQlyZXR1cm4gMDsKKworCWlmIChlbGJjX2ZjbV9jdHJsLT5yZWFkX2J5dGVzID09IG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKSB7CisJCXVpbnQzMl90IGx0ZWNjciA9IGluX2JlMzIoJmxiYy0+bHRlY2NyKTsKKwkJLyoKKwkJICogaWYgY29tbWFuZCB3YXMgYSBmdWxsIHBhZ2UgcmVhZCBhbmQgdGhlIEVMQkMKKwkJICogaGFzIHRoZSBMVEVDQ1IgcmVnaXN0ZXIsIHRoZW4gYml0cyAxMi0xNSAocHBjIG9yZGVyKSBvZgorCQkgKiBMVEVDQ1IgaW5kaWNhdGVzIHdoaWNoIDUxMiBieXRlIHN1Yi1wYWdlcyBoYWQgZml4ZWQgZXJyb3JzLgorCQkgKiBiaXRzIDI4LTMxIGFyZSB1bmNvcnJlY3RhYmxlIGVycm9ycywgbWFya2VkIGVsc2V3aGVyZS4KKwkJICogZm9yIHNtYWxsIHBhZ2UgbmFuZCBvbmx5IDEgYml0IGlzIHVzZWQuCisJCSAqIGlmIHRoZSBFTEJDIGRvZXNuJ3QgaGF2ZSB0aGUgbHRlY2NyIHJlZ2lzdGVyIGl0IHJlYWRzIDAKKwkJICovCisJCWlmIChsdGVjY3IgJiAweDAwMEYwMDBGKQorCQkJb3V0X2JlMzIoJmxiYy0+bHRlY2NyLCAweDAwMEYwMDBGKTsgLyogY2xlYXIgbHRlY2NyICovCisJCWlmIChsdGVjY3IgJiAweDAwMEYwMDAwKQorCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkKys7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQzNSw3ICs0NTMsNiBAQAogCiAJLyogUEFHRVBST0cgcmV1c2VzIGFsbCBvZiB0aGUgc2V0dXAgZnJvbSBTRVFJTiBhbmQgYWRkcyB0aGUgbGVuZ3RoICovCiAJY2FzZSBOQU5EX0NNRF9QQUdFUFJPRzogewotCQlpbnQgZnVsbF9wYWdlOwogCQlkZXZfdmRiZyhwcml2LT5kZXYsCiAJCSAgICAgICAgICJmc2xfZWxiY19jbWRmdW5jOiBOQU5EX0NNRF9QQUdFUFJPRyAiCiAJCQkgIndyaXRpbmcgJWQgYnl0ZXMuXG4iLCBlbGJjX2ZjbV9jdHJsLT5pbmRleCk7CkBAIC00NDUsMzQgKzQ2MiwxMiBAQAogCQkgKiB3cml0ZSBzbyB0aGUgSFcgZ2VuZXJhdGVzIHRoZSBFQ0MuCiAJCSAqLwogCQlpZiAoZWxiY19mY21fY3RybC0+b29iIHx8IGVsYmNfZmNtX2N0cmwtPmNvbHVtbiAhPSAwIHx8Ci0JCSAgICBlbGJjX2ZjbV9jdHJsLT5pbmRleCAhPSBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZSkgeworCQkgICAgZWxiY19mY21fY3RybC0+aW5kZXggIT0gbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpCiAJCQlvdXRfYmUzMigmbGJjLT5mYmNyLCBlbGJjX2ZjbV9jdHJsLT5pbmRleCk7Ci0JCQlmdWxsX3BhZ2UgPSAwOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQlvdXRfYmUzMigmbGJjLT5mYmNyLCAwKTsKLQkJCWZ1bGxfcGFnZSA9IDE7Ci0JCX0KIAogCQlmc2xfZWxiY19ydW5fY29tbWFuZChtdGQpOwotCi0JCS8qIFJlYWQgYmFjayB0aGUgcGFnZSBpbiBvcmRlciB0byBmaWxsIGluIHRoZSBFQ0MgZm9yIHRoZQotCQkgKiBjYWxsZXIuICBJcyB0aGlzIHJlYWxseSBuZWVkZWQ/Ci0JCSAqLwotCQlpZiAoZnVsbF9wYWdlICYmIGVsYmNfZmNtX2N0cmwtPm9vYl9wb2kpIHsKLQkJCW91dF9iZTMyKCZsYmMtPmZiY3IsIDMpOwotCQkJc2V0X2FkZHIobXRkLCA2LCBwYWdlX2FkZHIsIDEpOwotCi0JCQllbGJjX2ZjbV9jdHJsLT5yZWFkX2J5dGVzID0gbXRkLT53cml0ZXNpemUgKyA5OwotCi0JCQlmc2xfZWxiY19kb19yZWFkKGNoaXAsIDEpOwotCQkJZnNsX2VsYmNfcnVuX2NvbW1hbmQobXRkKTsKLQotCQkJbWVtY3B5X2Zyb21pbyhlbGJjX2ZjbV9jdHJsLT5vb2JfcG9pICsgNiwKLQkJCQkmZWxiY19mY21fY3RybC0+YWRkcltlbGJjX2ZjbV9jdHJsLT5pbmRleF0sIDMpOwotCQkJZWxiY19mY21fY3RybC0+aW5kZXggKz0gMzsKLQkJfQotCi0JCWVsYmNfZmNtX2N0cmwtPm9vYl9wb2kgPSBOVUxMOwogCQlyZXR1cm47CiAJfQogCkBAIC03NTIsMTMgKzc0Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZikKIHsKLQlzdHJ1Y3QgZnNsX2VsYmNfbXRkICpwcml2ID0gY2hpcC0+cHJpdjsKLQlzdHJ1Y3QgZnNsX2VsYmNfZmNtX2N0cmwgKmVsYmNfZmNtX2N0cmwgPSBwcml2LT5jdHJsLT5uYW5kOwotCiAJZnNsX2VsYmNfd3JpdGVfYnVmKG10ZCwgYnVmLCBtdGQtPndyaXRlc2l6ZSk7CiAJZnNsX2VsYmNfd3JpdGVfYnVmKG10ZCwgY2hpcC0+b29iX3BvaSwgbXRkLT5vb2JzaXplKTsKLQotCWVsYmNfZmNtX2N0cmwtPm9vYl9wb2kgPSBjaGlwLT5vb2JfcG9pOwogfQogCiBzdGF0aWMgaW50IGZzbF9lbGJjX2NoaXBfaW5pdChzdHJ1Y3QgZnNsX2VsYmNfbXRkICpwcml2KQpAQCAtNzkxLDggKzc4MSw4IEBACiAJY2hpcC0+YmJ0X21kID0gJmJidF9taXJyb3JfZGVzY3I7CiAKIAkvKiBzZXQgdXAgbmFuZCBvcHRpb25zICovCi0JY2hpcC0+b3B0aW9ucyA9IE5BTkRfTk9fUkVBRFJEWSB8IE5BTkRfTk9fQVVUT0lOQ1IgfAotCQkJTkFORF9VU0VfRkxBU0hfQkJUOworCWNoaXAtPm9wdGlvbnMgPSBOQU5EX05PX1JFQURSRFkgfCBOQU5EX05PX0FVVE9JTkNSOworCWNoaXAtPmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIOwogCiAJY2hpcC0+Y29udHJvbGxlciA9ICZlbGJjX2ZjbV9jdHJsLT5jb250cm9sbGVyOwogCWNoaXAtPnByaXYgPSBwcml2OwpAQCAtODI5LDcgKzgxOSw2IEBACiAKIAllbGJjX2ZjbV9jdHJsLT5jaGlwc1twcml2LT5iYW5rXSA9IE5VTEw7CiAJa2ZyZWUocHJpdik7Ci0Ja2ZyZWUoZWxiY19mY21fY3RybCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0MiwxMyArODMxLDE0IEBACiAJc3RydWN0IHJlc291cmNlIHJlczsKIAlzdHJ1Y3QgZnNsX2VsYmNfZmNtX2N0cmwgKmVsYmNfZmNtX2N0cmw7CiAJc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVfdHlwZXNbXQotCQk9IHsgImNtZGxpbmVwYXJ0IiwgIlJlZEJvb3QiLCBOVUxMIH07Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOworCQk9IHsgImNtZGxpbmVwYXJ0IiwgIlJlZEJvb3QiLCAib2ZwYXJ0IiwgTlVMTCB9OwogCWludCByZXQ7CiAJaW50IGJhbms7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSBwcGRhdGE7CiAKKwlwcGRhdGEub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCWlmICghZnNsX2xiY19jdHJsX2RldiB8fCAhZnNsX2xiY19jdHJsX2Rldi0+cmVncykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJbGJjID0gZnNsX2xiY19jdHJsX2Rldi0+cmVnczsKQEAgLTkzNCwxNyArOTI0LDggQEAKIAogCS8qIEZpcnN0IGxvb2sgZm9yIFJlZEJvb3QgdGFibGUgb3IgcGFydGl0aW9ucyBvbiB0aGUgY29tbWFuZAogCSAqIGxpbmUsIHRoZXNlIHRha2UgcHJlY2VkZW5jZSBvdmVyIGRldmljZSB0cmVlIGluZm9ybWF0aW9uICovCi0JcmV0ID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJnByaXYtPm10ZCwgcGFydF9wcm9iZV90eXBlcywgJnBhcnRzLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnI7Ci0KLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMocHJpdi0+ZGV2LCBub2RlLCAmcGFydHMpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyOwotCX0KLQotCW10ZF9kZXZpY2VfcmVnaXN0ZXIoJnByaXYtPm10ZCwgcGFydHMsIHJldCk7CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmcHJpdi0+bXRkLCBwYXJ0X3Byb2JlX3R5cGVzLCAmcHBkYXRhLAorCQkJCSAgTlVMTCwgMCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJlTEJDIE5BTkQgZGV2aWNlIGF0IDB4JWxseCwgYmFuayAlZFxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMuc3RhcnQsIHByaXYtPmJhbmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF91cG0uYwppbmRleCAyMzc1MmZkLi5iNGYzY2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF91cG0uYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF91cG0uYwpAQCAtMTU4LDcgKzE1OCw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmZsYXNoX25wOwotCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3R5cGVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwsIH07CisJc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhIHBwZGF0YTsKIAogCWZ1bi0+Y2hpcC5JT19BRERSX1IgPSBmdW4tPmlvX2Jhc2U7CiAJZnVuLT5jaGlwLklPX0FERFJfVyA9IGZ1bi0+aW9fYmFzZTsKQEAgLTE5MiwxOCArMTkyLDEyIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnI7CiAKLQlyZXQgPSBwYXJzZV9tdGRfcGFydGl0aW9ucygmZnVuLT5tdGQsIHBhcnRfdHlwZXMsICZmdW4tPnBhcnRzLCAwKTsKLQotI2lmZGVmIENPTkZJR19NVERfT0ZfUEFSVFMKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMoZnVuLT5kZXYsIGZsYXNoX25wLCAmZnVuLT5wYXJ0cyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnI7Ci0JfQotI2VuZGlmCi0JcmV0ID0gbXRkX2RldmljZV9yZWdpc3RlcigmZnVuLT5tdGQsIGZ1bi0+cGFydHMsIHJldCk7CisJcHBkYXRhLm9mX25vZGUgPSBmbGFzaF9ucDsKKwlyZXQgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKCZmdW4tPm10ZCwgTlVMTCwgJnBwZGF0YSwgTlVMTCwgMCk7CiBlcnI6CiAJb2Zfbm9kZV9wdXQoZmxhc2hfbnApOworCWlmIChyZXQpCisJCWtmcmVlKGZ1bi0+bXRkLm5hbWUpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZnNtY19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbWNfbmFuZC5jCmluZGV4IGU5YjI3NWEuLmU1M2I3NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZnNtY19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9mc21jX25hbmQuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJewogCQkubmFtZSA9ICJSb290IEZpbGUgU3lzdGVtIiwKIAkJLm9mZnNldCA9IDB4NDYwMDAwLAotCQkuc2l6ZSA9IDAsCisJCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKIAl9LAogfTsKIApAQCAtMTczLDEzICsxNzMsMTAgQEAKIAl7CiAJCS5uYW1lID0gIlJvb3QgRmlsZSBTeXN0ZW0iLAogCQkub2Zmc2V0ID0gMHg4MDAwMDAsCi0JCS5zaXplID0gMCwKKwkJLnNpemUgPSBNVERQQVJUX1NJWl9GVUxMLAogCX0sCiB9OwogCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi1jb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0jZW5kaWYKIAogLyoqCiAgKiBzdHJ1Y3QgZnNtY19uYW5kX2RhdGEgLSBzdHJ1Y3R1cmUgZm9yIEZTTUMgTkFORCBkZXZpY2Ugc3RhdGUKQEAgLTE4Nyw4ICsxODQsNiBAQAogICogQHBpZDoJCVBhcnQgSUQgb24gdGhlIEFNQkEgUHJpbWVDZWxsIGZvcm1hdAogICogQG10ZDoJCU1URCBpbmZvIGZvciBhIE5BTkQgZmxhc2guCiAgKiBAbmFuZDoJCUNoaXAgcmVsYXRlZCBpbmZvIGZvciBhIE5BTkQgZmxhc2guCi0gKiBAcGFydGl0aW9uczoJCVBhcnRpdGlvbiBpbmZvIGZvciBhIE5BTkQgRmxhc2guCi0gKiBAbnJfcGFydGl0aW9uczoJVG90YWwgbnVtYmVyIG9mIHBhcnRpdGlvbiBvZiBhIE5BTkQgZmxhc2guCiAgKgogICogQGVjY19wbGFjZToJCUVDQyBwbGFjaW5nIGxvY2F0aW9ucyBpbiBvb2JmcmVlIHR5cGUgZm9ybWF0LgogICogQGJhbms6CQlCYW5rIG51bWJlciBmb3IgcHJvYmVkIGRldmljZS4KQEAgLTIwMyw4ICsxOTgsNiBAQAogCXUzMgkJCXBpZDsKIAlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKIAlzdHJ1Y3QgbmFuZF9jaGlwCW5hbmQ7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRpdGlvbnM7Ci0JdW5zaWduZWQgaW50CQlucl9wYXJ0aXRpb25zOwogCiAJc3RydWN0IGZzbWNfZWNjcGxhY2UJKmVjY19wbGFjZTsKIAl1bnNpZ25lZCBpbnQJCWJhbms7CkBAIC03MTYsNjUgKzcwOSwxNyBAQAogCSAqIHBsYXRmb3JtIGRhdGEsCiAJICogZGVmYXVsdCBwYXJ0aXRpb24gaW5mb3JtYXRpb24gcHJlc2VudCBpbiBkcml2ZXIuCiAJICovCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCiAJLyoKLQkgKiBDaGVjayBpZiBwYXJ0aXRpb24gaW5mbyBwYXNzZWQgdmlhIGNvbW1hbmQgbGluZQorCSAqIENoZWNrIGZvciBwYXJ0aXRpb24gaW5mbyBwYXNzZWQKIAkgKi8KIAlob3N0LT5tdGQubmFtZSA9ICJuYW5kIjsKLQlob3N0LT5ucl9wYXJ0aXRpb25zID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmhvc3QtPm10ZCwgcGFydF9wcm9iZXMsCi0JCQkmaG9zdC0+cGFydGl0aW9ucywgMCk7Ci0JaWYgKGhvc3QtPm5yX3BhcnRpdGlvbnMgPD0gMCkgewotI2VuZGlmCi0JCS8qCi0JCSAqIENoZWNrIGlmIHBhcnRpdGlvbiBpbmZvIHBhc3NlZCB2aWEgY29tbWFuZCBsaW5lCi0JCSAqLwotCQlpZiAocGRhdGEtPnBhcnRpdGlvbnMpIHsKLQkJCWhvc3QtPnBhcnRpdGlvbnMgPSBwZGF0YS0+cGFydGl0aW9uczsKLQkJCWhvc3QtPm5yX3BhcnRpdGlvbnMgPSBwZGF0YS0+bnJfcGFydGl0aW9uczsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0aXRpb247Ci0JCQlpbnQgaTsKLQotCQkJLyogU2VsZWN0IHRoZSBkZWZhdWx0IHBhcnRpdGlvbnMgaW5mbyAqLwotCQkJc3dpdGNoIChob3N0LT5tdGQuc2l6ZSkgewotCQkJY2FzZSAweDAxMDAwMDAwOgotCQkJY2FzZSAweDAyMDAwMDAwOgotCQkJY2FzZSAweDA0MDAwMDAwOgotCQkJCWhvc3QtPnBhcnRpdGlvbnMgPSBwYXJ0aXRpb25faW5mb18xNktCX2JsazsKLQkJCQlob3N0LT5ucl9wYXJ0aXRpb25zID0KLQkJCQkJc2l6ZW9mKHBhcnRpdGlvbl9pbmZvXzE2S0JfYmxrKSAvCi0JCQkJCXNpemVvZihzdHJ1Y3QgbXRkX3BhcnRpdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MDgwMDAwMDA6Ci0JCQljYXNlIDB4MTAwMDAwMDA6Ci0JCQljYXNlIDB4MjAwMDAwMDA6Ci0JCQljYXNlIDB4NDAwMDAwMDA6Ci0JCQkJaG9zdC0+cGFydGl0aW9ucyA9IHBhcnRpdGlvbl9pbmZvXzEyOEtCX2JsazsKLQkJCQlob3N0LT5ucl9wYXJ0aXRpb25zID0KLQkJCQkJc2l6ZW9mKHBhcnRpdGlvbl9pbmZvXzEyOEtCX2JsaykgLwotCQkJCQlzaXplb2Yoc3RydWN0IG10ZF9wYXJ0aXRpb24pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXQgPSAtRU5YSU87Ci0JCQkJcHJfZXJyKCJVbnN1cHBvcnRlZCBOQU5EIHNpemVcbiIpOwotCQkJCWdvdG8gZXJyX3Byb2JlOwotCQkJfQotCi0JCQlwYXJ0aXRpb24gPSBob3N0LT5wYXJ0aXRpb25zOwotCQkJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5yX3BhcnRpdGlvbnM7IGkrKywgcGFydGl0aW9uKyspIHsKLQkJCQlpZiAocGFydGl0aW9uLT5zaXplID09IDApIHsKLQkJCQkJcGFydGl0aW9uLT5zaXplID0gaG9zdC0+bXRkLnNpemUgLQotCQkJCQkJcGFydGl0aW9uLT5vZmZzZXQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwotCX0KLSNlbmRpZgotCi0JcmV0ID0gbXRkX2RldmljZV9yZWdpc3RlcigmaG9zdC0+bXRkLCBob3N0LT5wYXJ0aXRpb25zLAotCQkJCSAgaG9zdC0+bnJfcGFydGl0aW9ucyk7CisJcmV0ID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmaG9zdC0+bXRkLCBOVUxMLCAwLAorCQkJaG9zdC0+bXRkLnNpemUgPD0gMHgwNDAwMDAwMCA/CisJCQkJcGFydGl0aW9uX2luZm9fMTZLQl9ibGsgOgorCQkJCXBhcnRpdGlvbl9pbmZvXzEyOEtCX2JsaywKKwkJCWhvc3QtPm10ZC5zaXplIDw9IDB4MDQwMDAwMDAgPworCQkJCUFSUkFZX1NJWkUocGFydGl0aW9uX2luZm9fMTZLQl9ibGspIDoKKwkJCQlBUlJBWV9TSVpFKHBhcnRpdGlvbl9pbmZvXzEyOEtCX2JsaykpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3Byb2JlOwogCkBAIC04MjIsNyArNzY3LDcgQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAogCWlmIChob3N0KSB7Ci0JCW10ZF9kZXZpY2VfdW5yZWdpc3RlcigmaG9zdC0+bXRkKTsKKwkJbmFuZF9yZWxlYXNlKCZob3N0LT5tdGQpOwogCQljbGtfZGlzYWJsZShob3N0LT5jbGspOwogCQljbGtfcHV0KGhvc3QtPmNsayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0NjI0OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX01URF9OQU5EX0dQTUlfTkFORCkgKz0gZ3BtaV9uYW5kLm8KK2dwbWlfbmFuZC1vYmpzICs9IGdwbWktbmFuZC5vCitncG1pX25hbmQtb2JqcyArPSBncG1pLWxpYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9iY2gtcmVncy5oIGIvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvYmNoLXJlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWZmYjhjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvYmNoLXJlZ3MuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogRnJlZXNjYWxlIEdQTUkgTkFORCBGbGFzaCBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwOC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBFbWJlZGRlZCBBbGxleSBTb2x1dGlvbnMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisjaWZuZGVmIF9fR1BNSV9OQU5EX0JDSF9SRUdTX0gKKyNkZWZpbmUgX19HUE1JX05BTkRfQkNIX1JFR1NfSAorCisjZGVmaW5lIEhXX0JDSF9DVFJMCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgSFdfQkNIX0NUUkxfU0VUCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSFdfQkNIX0NUUkxfQ0xSCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgSFdfQkNIX0NUUkxfVE9HCQkJCTB4MDAwMDAwMGMKKworI2RlZmluZSBCTV9CQ0hfQ1RSTF9DT01QTEVURV9JUlFfRU4JCSgxIDw8IDgpCisjZGVmaW5lIEJNX0JDSF9DVFJMX0NPTVBMRVRFX0lSUQkJKDEgPDwgMCkKKworI2RlZmluZSBIV19CQ0hfU1RBVFVTMAkJCQkweDAwMDAwMDEwCisjZGVmaW5lIEhXX0JDSF9NT0RFCQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgSFdfQkNIX0VOQ09ERVBUUgkJCTB4MDAwMDAwMzAKKyNkZWZpbmUgSFdfQkNIX0RBVEFQVFIJCQkJMHgwMDAwMDA0MAorI2RlZmluZSBIV19CQ0hfTUVUQVBUUgkJCQkweDAwMDAwMDUwCisjZGVmaW5lIEhXX0JDSF9MQVlPVVRTRUxFQ1QJCQkweDAwMDAwMDcwCisKKyNkZWZpbmUgSFdfQkNIX0ZMQVNIMExBWU9VVDAJCQkweDAwMDAwMDgwCisKKyNkZWZpbmUgQlBfQkNIX0ZMQVNIMExBWU9VVDBfTkJMT0NLUwkJMjQKKyNkZWZpbmUgQk1fQkNIX0ZMQVNIMExBWU9VVDBfTkJMT0NLUwkoMHhmZiA8PCBCUF9CQ0hfRkxBU0gwTEFZT1VUMF9OQkxPQ0tTKQorI2RlZmluZSBCRl9CQ0hfRkxBU0gwTEFZT1VUMF9OQkxPQ0tTKHYpCQlcCisJKCgodikgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDBfTkJMT0NLUykgJiBCTV9CQ0hfRkxBU0gwTEFZT1VUMF9OQkxPQ0tTKQorCisjZGVmaW5lIEJQX0JDSF9GTEFTSDBMQVlPVVQwX01FVEFfU0laRQkJMTYKKyNkZWZpbmUgQk1fQkNIX0ZMQVNIMExBWU9VVDBfTUVUQV9TSVpFCSgweGZmIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQwX01FVEFfU0laRSkKKyNkZWZpbmUgQkZfQkNIX0ZMQVNIMExBWU9VVDBfTUVUQV9TSVpFKHYpCVwKKwkoKCh2KSA8PCBCUF9CQ0hfRkxBU0gwTEFZT1VUMF9NRVRBX1NJWkUpXAorCQkJCQkgJiBCTV9CQ0hfRkxBU0gwTEFZT1VUMF9NRVRBX1NJWkUpCisKKyNkZWZpbmUgQlBfQkNIX0ZMQVNIMExBWU9VVDBfRUNDMAkJMTIKKyNkZWZpbmUgQk1fQkNIX0ZMQVNIMExBWU9VVDBfRUNDMAkoMHhmIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQwX0VDQzApCisjZGVmaW5lIEJGX0JDSF9GTEFTSDBMQVlPVVQwX0VDQzAodikJCVwKKwkoKCh2KSA8PCBCUF9CQ0hfRkxBU0gwTEFZT1VUMF9FQ0MwKSAmIEJNX0JDSF9GTEFTSDBMQVlPVVQwX0VDQzApCisKKyNkZWZpbmUgQlBfQkNIX0ZMQVNIMExBWU9VVDBfREFUQTBfU0laRQkJMAorI2RlZmluZSBCTV9CQ0hfRkxBU0gwTEFZT1VUMF9EQVRBMF9TSVpFCQlcCisJCQkoMHhmZmYgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDBfREFUQTBfU0laRSkKKyNkZWZpbmUgQkZfQkNIX0ZMQVNIMExBWU9VVDBfREFUQTBfU0laRSh2KQlcCisJKCgodikgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDBfREFUQTBfU0laRSlcCisJCQkJCSAmIEJNX0JDSF9GTEFTSDBMQVlPVVQwX0RBVEEwX1NJWkUpCisKKyNkZWZpbmUgSFdfQkNIX0ZMQVNIMExBWU9VVDEJCQkweDAwMDAwMDkwCisKKyNkZWZpbmUgQlBfQkNIX0ZMQVNIMExBWU9VVDFfUEFHRV9TSVpFCQkxNgorI2RlZmluZSBCTV9CQ0hfRkxBU0gwTEFZT1VUMV9QQUdFX1NJWkUJCVwKKwkJCSgweGZmZmYgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDFfUEFHRV9TSVpFKQorI2RlZmluZSBCRl9CQ0hfRkxBU0gwTEFZT1VUMV9QQUdFX1NJWkUodikJXAorCSgoKHYpIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQxX1BBR0VfU0laRSkgXAorCQkJCQkgJiBCTV9CQ0hfRkxBU0gwTEFZT1VUMV9QQUdFX1NJWkUpCisKKyNkZWZpbmUgQlBfQkNIX0ZMQVNIMExBWU9VVDFfRUNDTgkJMTIKKyNkZWZpbmUgQk1fQkNIX0ZMQVNIMExBWU9VVDFfRUNDTgkoMHhmIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQxX0VDQ04pCisjZGVmaW5lIEJGX0JDSF9GTEFTSDBMQVlPVVQxX0VDQ04odikJCVwKKwkoKCh2KSA8PCBCUF9CQ0hfRkxBU0gwTEFZT1VUMV9FQ0NOKSAmIEJNX0JDSF9GTEFTSDBMQVlPVVQxX0VDQ04pCisKKyNkZWZpbmUgQlBfQkNIX0ZMQVNIMExBWU9VVDFfREFUQU5fU0laRQkJMAorI2RlZmluZSBCTV9CQ0hfRkxBU0gwTEFZT1VUMV9EQVRBTl9TSVpFCQlcCisJCQkoMHhmZmYgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDFfREFUQU5fU0laRSkKKyNkZWZpbmUgQkZfQkNIX0ZMQVNIMExBWU9VVDFfREFUQU5fU0laRSh2KQlcCisJKCgodikgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDFfREFUQU5fU0laRSkgXAorCQkJCQkgJiBCTV9CQ0hfRkxBU0gwTEFZT1VUMV9EQVRBTl9TSVpFKQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLWxpYi5jIGIvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTRkYjc2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktbGliLmMKQEAgLTAsMCArMSwxMDU3IEBACisvKgorICogRnJlZXNjYWxlIEdQTUkgTkFORCBGbGFzaCBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEVtYmVkZGVkIEFsbGV5IFNvbHV0aW9ucywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tdGQvZ3BtaS1uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxtYWNoL214cy5oPgorCisjaW5jbHVkZSAiZ3BtaS1uYW5kLmgiCisjaW5jbHVkZSAiZ3BtaS1yZWdzLmgiCisjaW5jbHVkZSAiYmNoLXJlZ3MuaCIKKworc3RydWN0IHRpbWluZ190aHJlc2hvZCB0aW1pbmdfZGVmYXVsdF90aHJlc2hvbGQgPSB7CisJLm1heF9kYXRhX3NldHVwX2N5Y2xlcyAgICAgICA9IChCTV9HUE1JX1RJTUlORzBfREFUQV9TRVRVUCA+PgorCQkJCQkJQlBfR1BNSV9USU1JTkcwX0RBVEFfU0VUVVApLAorCS5pbnRlcm5hbF9kYXRhX3NldHVwX2luX25zICAgPSAwLAorCS5tYXhfc2FtcGxlX2RlbGF5X2ZhY3RvciAgICAgPSAoQk1fR1BNSV9DVFJMMV9SRE5fREVMQVkgPj4KKwkJCQkJCUJQX0dQTUlfQ1RSTDFfUkROX0RFTEFZKSwKKwkubWF4X2RsbF9jbG9ja19wZXJpb2RfaW5fbnMgID0gMzIsCisJLm1heF9kbGxfZGVsYXlfaW5fbnMgICAgICAgICA9IDE2LAorfTsKKworLyoKKyAqIENsZWFyIHRoZSBiaXQgYW5kIHBvbGwgaXQgY2xlYXJlZC4gIFRoaXMgaXMgdXN1YWxseSBjYWxsZWQgd2l0aAorICogYSByZXNldCBhZGRyZXNzIGFuZCBtYXNrIGJlaW5nIGVpdGhlciBTRlRSU1QoYml0IDMxKSBvciBDTEtHQVRFCisgKiAoYml0IDMwKS4KKyAqLworc3RhdGljIGludCBjbGVhcl9wb2xsX2JpdCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBtYXNrKQoreworCWludCB0aW1lb3V0ID0gMHg0MDA7CisKKwkvKiBjbGVhciB0aGUgYml0ICovCisJX19teHNfY2xybChtYXNrLCBhZGRyKTsKKworCS8qCisJICogU0ZUUlNUIG5lZWRzIDMgR1BNSSBjbG9ja3MgdG8gc2V0dGxlLCB0aGUgcmVmZXJlbmNlIG1hbnVhbAorCSAqIHJlY29tbWVuZHMgdG8gd2FpdCAxdXMuCisJICovCisJdWRlbGF5KDEpOworCisJLyogcG9sbCB0aGUgYml0IGJlY29taW5nIGNsZWFyICovCisJd2hpbGUgKChyZWFkbChhZGRyKSAmIG1hc2spICYmIC0tdGltZW91dCkKKwkJLyogbm90aGluZyAqLzsKKworCXJldHVybiAhdGltZW91dDsKK30KKworI2RlZmluZSBNT0RVTEVfQ0xLR0FURQkJKDEgPDwgMzApCisjZGVmaW5lIE1PRFVMRV9TRlRSU1QJCSgxIDw8IDMxKQorLyoKKyAqIFRoZSBjdXJyZW50IG14c19yZXNldF9ibG9jaygpIHdpbGwgZG8gdHdvIHRoaW5nczoKKyAqICBbMV0gZW5hYmxlIHRoZSBtb2R1bGUuCisgKiAgWzJdIHJlc2V0IHRoZSBtb2R1bGUuCisgKgorICogSW4gbW9zdCBvZiB0aGUgY2FzZXMsIGl0J3Mgb2suIEJ1dCB0aGVyZSBpcyBhIGhhcmR3YXJlIGJ1ZyBpbiB0aGUgQkNIIGJsb2NrLgorICogSWYgeW91IHRyeSB0byBzb2Z0IHJlc2V0IHRoZSBCQ0ggYmxvY2ssIGl0IGJlY29tZXMgdW51c2FibGUgdW50aWwKKyAqIHRoZSBuZXh0IGhhcmQgcmVzZXQuIFRoaXMgY2FzZSBvY2N1cnMgaW4gdGhlIE5BTkQgYm9vdCBtb2RlLiBXaGVuIHRoZSBib2FyZAorICogYm9vdHMgYnkgTkFORCwgdGhlIFJPTSBvZiB0aGUgY2hpcCB3aWxsIGluaXRpYWxpemUgdGhlIEJDSCBibG9ja3MgaXRzZWxmLgorICogU28gSWYgdGhlIGRyaXZlciB0cmllcyB0byByZXNldCB0aGUgQkNIIGFnYWluLCB0aGUgQkNIIHdpbGwgbm90IHdvcmsgYW55bW9yZS4KKyAqIFlvdSB3aWxsIHNlZSBhIERNQSB0aW1lb3V0IGluIHRoaXMgY2FzZS4KKyAqCisgKiBUbyBhdm9pZCB0aGlzIGJ1ZywganVzdCBhZGQgYSBuZXcgcGFyYW1ldGVyIGBqdXN0X2VuYWJsZWAgZm9yCisgKiB0aGUgbXhzX3Jlc2V0X2Jsb2NrKCksIGFuZCByZXdyaXRlIGl0IGhlcmUuCisgKi8KK2ludCBncG1pX3Jlc2V0X2Jsb2NrKHZvaWQgX19pb21lbSAqcmVzZXRfYWRkciwgYm9vbCBqdXN0X2VuYWJsZSkKK3sKKwlpbnQgcmV0OworCWludCB0aW1lb3V0ID0gMHg0MDA7CisKKwkvKiBjbGVhciBhbmQgcG9sbCBTRlRSU1QgKi8KKwlyZXQgPSBjbGVhcl9wb2xsX2JpdChyZXNldF9hZGRyLCBNT0RVTEVfU0ZUUlNUKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBlcnJvcjsKKworCS8qIGNsZWFyIENMS0dBVEUgKi8KKwlfX214c19jbHJsKE1PRFVMRV9DTEtHQVRFLCByZXNldF9hZGRyKTsKKworCWlmICghanVzdF9lbmFibGUpIHsKKwkJLyogc2V0IFNGVFJTVCB0byByZXNldCB0aGUgYmxvY2sgKi8KKwkJX19teHNfc2V0bChNT0RVTEVfU0ZUUlNULCByZXNldF9hZGRyKTsKKwkJdWRlbGF5KDEpOworCisJCS8qIHBvbGwgQ0xLR0FURSBiZWNvbWluZyBzZXQgKi8KKwkJd2hpbGUgKCghKHJlYWRsKHJlc2V0X2FkZHIpICYgTU9EVUxFX0NMS0dBVEUpKSAmJiAtLXRpbWVvdXQpCisJCQkvKiBub3RoaW5nICovOworCQlpZiAodW5saWtlbHkoIXRpbWVvdXQpKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBjbGVhciBhbmQgcG9sbCBTRlRSU1QgKi8KKwlyZXQgPSBjbGVhcl9wb2xsX2JpdChyZXNldF9hZGRyLCBNT0RVTEVfU0ZUUlNUKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBlcnJvcjsKKworCS8qIGNsZWFyIGFuZCBwb2xsIENMS0dBVEUgKi8KKwlyZXQgPSBjbGVhcl9wb2xsX2JpdChyZXNldF9hZGRyLCBNT0RVTEVfQ0xLR0FURSk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcHJfZXJyKCIlcyglcCk6IG1vZHVsZSByZXNldCB0aW1lb3V0XG4iLCBfX2Z1bmNfXywgcmVzZXRfYWRkcik7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK2ludCBncG1pX2luaXQoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCByZXNvdXJjZXMgKnIgPSAmdGhpcy0+cmVzb3VyY2VzOworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfZW5hYmxlKHItPmNsb2NrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXQ7CisJcmV0ID0gZ3BtaV9yZXNldF9ibG9jayhyLT5ncG1pX3JlZ3MsIGZhbHNlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKiBDaG9vc2UgTkFORCBtb2RlLiAqLworCXdyaXRlbChCTV9HUE1JX0NUUkwxX0dQTUlfTU9ERSwgci0+Z3BtaV9yZWdzICsgSFdfR1BNSV9DVFJMMV9DTFIpOworCisJLyogU2V0IHRoZSBJUlEgcG9sYXJpdHkuICovCisJd3JpdGVsKEJNX0dQTUlfQ1RSTDFfQVRBX0lSUVJEWV9QT0xBUklUWSwKKwkJCQlyLT5ncG1pX3JlZ3MgKyBIV19HUE1JX0NUUkwxX1NFVCk7CisKKwkvKiBEaXNhYmxlIFdyaXRlLVByb3RlY3Rpb24uICovCisJd3JpdGVsKEJNX0dQTUlfQ1RSTDFfREVWX1JFU0VULCByLT5ncG1pX3JlZ3MgKyBIV19HUE1JX0NUUkwxX1NFVCk7CisKKwkvKiBTZWxlY3QgQkNIIEVDQy4gKi8KKwl3cml0ZWwoQk1fR1BNSV9DVFJMMV9CQ0hfTU9ERSwgci0+Z3BtaV9yZWdzICsgSFdfR1BNSV9DVFJMMV9TRVQpOworCisJY2xrX2Rpc2FibGUoci0+Y2xvY2spOworCXJldHVybiAwOworZXJyX291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHZlcnkgdXNlZnVsLiBJdCBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSBidWcgb2NjdXIuICovCit2b2lkIGdwbWlfZHVtcF9pbmZvKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2VzICpyID0gJnRoaXMtPnJlc291cmNlczsKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpnZW8gPSAmdGhpcy0+YmNoX2dlb21ldHJ5OworCXUzMiByZWc7CisJaW50IGk7CisKKwlwcl9lcnIoIlNob3cgR1BNSSByZWdpc3RlcnMgOlxuIik7CisJZm9yIChpID0gMDsgaSA8PSBIV19HUE1JX0RFQlVHIC8gMHgxMCArIDE7IGkrKykgeworCQlyZWcgPSByZWFkbChyLT5ncG1pX3JlZ3MgKyBpICogMHgxMCk7CisJCXByX2Vycigib2Zmc2V0IDB4JS4zeCA6IDB4JS44eFxuIiwgaSAqIDB4MTAsIHJlZyk7CisJfQorCisJLyogc3RhcnQgdG8gcHJpbnQgb3V0IHRoZSBCQ0ggaW5mbyAqLworCXByX2VycigiQkNIIEdlb21ldHJ5IDpcbiIpOworCXByX2VycigiR0YgbGVuZ3RoICAgICAgICAgICAgICA6ICV1XG4iLCBnZW8tPmdmX2xlbik7CisJcHJfZXJyKCJFQ0MgU3RyZW5ndGggICAgICAgICAgIDogJXVcbiIsIGdlby0+ZWNjX3N0cmVuZ3RoKTsKKwlwcl9lcnIoIlBhZ2UgU2l6ZSBpbiBCeXRlcyAgICAgOiAldVxuIiwgZ2VvLT5wYWdlX3NpemUpOworCXByX2VycigiTWV0YWRhdGEgU2l6ZSBpbiBCeXRlcyA6ICV1XG4iLCBnZW8tPm1ldGFkYXRhX3NpemUpOworCXByX2VycigiRUNDIENodW5rIFNpemUgaW4gQnl0ZXM6ICV1XG4iLCBnZW8tPmVjY19jaHVua19zaXplKTsKKwlwcl9lcnIoIkVDQyBDaHVuayBDb3VudCAgICAgICAgOiAldVxuIiwgZ2VvLT5lY2NfY2h1bmtfY291bnQpOworCXByX2VycigiUGF5bG9hZCBTaXplIGluIEJ5dGVzICA6ICV1XG4iLCBnZW8tPnBheWxvYWRfc2l6ZSk7CisJcHJfZXJyKCJBdXhpbGlhcnkgU2l6ZSBpbiBCeXRlczogJXVcbiIsIGdlby0+YXV4aWxpYXJ5X3NpemUpOworCXByX2VycigiQXV4aWxpYXJ5IFN0YXR1cyBPZmZzZXQ6ICV1XG4iLCBnZW8tPmF1eGlsaWFyeV9zdGF0dXNfb2Zmc2V0KTsKKwlwcl9lcnIoIkJsb2NrIE1hcmsgQnl0ZSBPZmZzZXQgOiAldVxuIiwgZ2VvLT5ibG9ja19tYXJrX2J5dGVfb2Zmc2V0KTsKKwlwcl9lcnIoIkJsb2NrIE1hcmsgQml0IE9mZnNldCAgOiAldVxuIiwgZ2VvLT5ibG9ja19tYXJrX2JpdF9vZmZzZXQpOworfQorCisvKiBDb25maWd1cmVzIHRoZSBnZW9tZXRyeSBmb3IgQkNILiAgKi8KK2ludCBiY2hfc2V0X2dlb21ldHJ5KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2VzICpyID0gJnRoaXMtPnJlc291cmNlczsKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpiY2hfZ2VvID0gJnRoaXMtPmJjaF9nZW9tZXRyeTsKKwl1bnNpZ25lZCBpbnQgYmxvY2tfY291bnQ7CisJdW5zaWduZWQgaW50IGJsb2NrX3NpemU7CisJdW5zaWduZWQgaW50IG1ldGFkYXRhX3NpemU7CisJdW5zaWduZWQgaW50IGVjY19zdHJlbmd0aDsKKwl1bnNpZ25lZCBpbnQgcGFnZV9zaXplOworCWludCByZXQ7CisKKwlpZiAoY29tbW9uX25mY19zZXRfZ2VvbWV0cnkodGhpcykpCisJCXJldHVybiAhMDsKKworCWJsb2NrX2NvdW50ICAgPSBiY2hfZ2VvLT5lY2NfY2h1bmtfY291bnQgLSAxOworCWJsb2NrX3NpemUgICAgPSBiY2hfZ2VvLT5lY2NfY2h1bmtfc2l6ZTsKKwltZXRhZGF0YV9zaXplID0gYmNoX2dlby0+bWV0YWRhdGFfc2l6ZTsKKwllY2Nfc3RyZW5ndGggID0gYmNoX2dlby0+ZWNjX3N0cmVuZ3RoID4+IDE7CisJcGFnZV9zaXplICAgICA9IGJjaF9nZW8tPnBhZ2Vfc2l6ZTsKKworCXJldCA9IGNsa19lbmFibGUoci0+Y2xvY2spOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCXJldCA9IGdwbWlfcmVzZXRfYmxvY2soci0+YmNoX3JlZ3MsIHRydWUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCS8qIENvbmZpZ3VyZSBsYXlvdXQgMC4gKi8KKwl3cml0ZWwoQkZfQkNIX0ZMQVNIMExBWU9VVDBfTkJMT0NLUyhibG9ja19jb3VudCkKKwkJCXwgQkZfQkNIX0ZMQVNIMExBWU9VVDBfTUVUQV9TSVpFKG1ldGFkYXRhX3NpemUpCisJCQl8IEJGX0JDSF9GTEFTSDBMQVlPVVQwX0VDQzAoZWNjX3N0cmVuZ3RoKQorCQkJfCBCRl9CQ0hfRkxBU0gwTEFZT1VUMF9EQVRBMF9TSVpFKGJsb2NrX3NpemUpLAorCQkJci0+YmNoX3JlZ3MgKyBIV19CQ0hfRkxBU0gwTEFZT1VUMCk7CisKKwl3cml0ZWwoQkZfQkNIX0ZMQVNIMExBWU9VVDFfUEFHRV9TSVpFKHBhZ2Vfc2l6ZSkKKwkJCXwgQkZfQkNIX0ZMQVNIMExBWU9VVDFfRUNDTihlY2Nfc3RyZW5ndGgpCisJCQl8IEJGX0JDSF9GTEFTSDBMQVlPVVQxX0RBVEFOX1NJWkUoYmxvY2tfc2l6ZSksCisJCQlyLT5iY2hfcmVncyArIEhXX0JDSF9GTEFTSDBMQVlPVVQxKTsKKworCS8qIFNldCAqYWxsKiBjaGlwIHNlbGVjdHMgdG8gdXNlIGxheW91dCAwLiAqLworCXdyaXRlbCgwLCByLT5iY2hfcmVncyArIEhXX0JDSF9MQVlPVVRTRUxFQ1QpOworCisJLyogRW5hYmxlIGludGVycnVwdHMuICovCisJd3JpdGVsKEJNX0JDSF9DVFJMX0NPTVBMRVRFX0lSUV9FTiwKKwkJCQlyLT5iY2hfcmVncyArIEhXX0JDSF9DVFJMX1NFVCk7CisKKwljbGtfZGlzYWJsZShyLT5jbG9jayk7CisJcmV0dXJuIDA7CitlcnJfb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIENvbnZlcnRzIHRpbWUgaW4gbmFub3NlY29uZHMgdG8gY3ljbGVzLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBuc190b19jeWNsZXModW5zaWduZWQgaW50IHRpbWUsCisJCQl1bnNpZ25lZCBpbnQgcGVyaW9kLCB1bnNpZ25lZCBpbnQgbWluKQoreworCXVuc2lnbmVkIGludCBrOworCisJayA9ICh0aW1lICsgcGVyaW9kIC0gMSkgLyBwZXJpb2Q7CisJcmV0dXJuIG1heChrLCBtaW4pOworfQorCisvKiBBcHBseSB0aW1pbmcgdG8gY3VycmVudCBoYXJkd2FyZSBjb25kaXRpb25zLiAqLworc3RhdGljIGludCBncG1pX25mY19jb21wdXRlX2hhcmR3YXJlX3RpbWluZyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQkJCXN0cnVjdCBncG1pX25mY19oYXJkd2FyZV90aW1pbmcgKmh3KQoreworCXN0cnVjdCBncG1pX25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSB0aGlzLT5wZGF0YTsKKwlzdHJ1Y3QgdGltaW5nX3RocmVzaG9kICpuZmMgPSAmdGltaW5nX2RlZmF1bHRfdGhyZXNob2xkOworCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmQgPSAmdGhpcy0+bmFuZDsKKwlzdHJ1Y3QgbmFuZF90aW1pbmcgdGFyZ2V0ID0gdGhpcy0+dGltaW5nOworCWJvb2wgaW1wcm92ZWRfdGltaW5nX2lzX2F2YWlsYWJsZTsKKwl1bnNpZ25lZCBsb25nIGNsb2NrX2ZyZXF1ZW5jeV9pbl9oejsKKwl1bnNpZ25lZCBpbnQgY2xvY2tfcGVyaW9kX2luX25zOworCWJvb2wgZGxsX3VzZV9oYWxmX3BlcmlvZHM7CisJdW5zaWduZWQgaW50IGRsbF9kZWxheV9zaGlmdDsKKwl1bnNpZ25lZCBpbnQgbWF4X3NhbXBsZV9kZWxheV9pbl9uczsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzc19zZXR1cF9pbl9jeWNsZXM7CisJdW5zaWduZWQgaW50IGRhdGFfc2V0dXBfaW5fbnM7CisJdW5zaWduZWQgaW50IGRhdGFfc2V0dXBfaW5fY3ljbGVzOworCXVuc2lnbmVkIGludCBkYXRhX2hvbGRfaW5fY3ljbGVzOworCWludCBpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnM7CisJdW5zaWduZWQgaW50IHNhbXBsZV9kZWxheV9mYWN0b3I7CisJaW50IHRFWUU7CisJdW5zaWduZWQgaW50IG1pbl9wcm9wX2RlbGF5X2luX25zID0gcGRhdGEtPm1pbl9wcm9wX2RlbGF5X2luX25zOworCXVuc2lnbmVkIGludCBtYXhfcHJvcF9kZWxheV9pbl9ucyA9IHBkYXRhLT5tYXhfcHJvcF9kZWxheV9pbl9uczsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNoaXBzLCB3ZSBuZWVkIHRvIHJlbGF4IHRoZSB0aW1pbmdzIHRvIGFsbG93CisJICogZm9yIHNpZ25hbCBkaXN0b3J0aW9uIGR1ZSB0byBoaWdoZXIgY2FwYWNpdGFuY2UuCisJICovCisJaWYgKG5hbmQtPm51bWNoaXBzID4gMikgeworCQl0YXJnZXQuZGF0YV9zZXR1cF9pbl9ucyAgICArPSAxMDsKKwkJdGFyZ2V0LmRhdGFfaG9sZF9pbl9ucyAgICAgKz0gMTA7CisJCXRhcmdldC5hZGRyZXNzX3NldHVwX2luX25zICs9IDEwOworCX0gZWxzZSBpZiAobmFuZC0+bnVtY2hpcHMgPiAxKSB7CisJCXRhcmdldC5kYXRhX3NldHVwX2luX25zICAgICs9IDU7CisJCXRhcmdldC5kYXRhX2hvbGRfaW5fbnMgICAgICs9IDU7CisJCXRhcmdldC5hZGRyZXNzX3NldHVwX2luX25zICs9IDU7CisJfQorCisJLyogQ2hlY2sgaWYgaW1wcm92ZWQgdGltaW5nIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gKi8KKwlpbXByb3ZlZF90aW1pbmdfaXNfYXZhaWxhYmxlID0KKwkJKHRhcmdldC50UkVBX2luX25zICA+PSAwKSAmJgorCQkodGFyZ2V0LnRSTE9IX2luX25zID49IDApICYmCisJCSh0YXJnZXQudFJIT0hfaW5fbnMgPj0gMCkgOworCisJLyogSW5zcGVjdCB0aGUgY2xvY2suICovCisJY2xvY2tfZnJlcXVlbmN5X2luX2h6ID0gbmZjLT5jbG9ja19mcmVxdWVuY3lfaW5faHo7CisJY2xvY2tfcGVyaW9kX2luX25zICAgID0gMTAwMDAwMDAwMCAvIGNsb2NrX2ZyZXF1ZW5jeV9pbl9oejsKKworCS8qCisJICogVGhlIE5GQyBxdWFudGl6ZXMgc2V0dXAgYW5kIGhvbGQgcGFyYW1ldGVycyBpbiB0ZXJtcyBvZiBjbG9jayBjeWNsZXMuCisJICogSGVyZSwgd2UgcXVhbnRpemUgdGhlIHNldHVwIGFuZCBob2xkIHRpbWluZyBwYXJhbWV0ZXJzIHRvIHRoZQorCSAqIG5leHQtaGlnaGVzdCBjbG9jayBwZXJpb2QgdG8gbWFrZSBzdXJlIHdlIGFwcGx5IGF0IGxlYXN0IHRoZQorCSAqIHNwZWNpZmllZCB0aW1lcy4KKwkgKgorCSAqIEZvciBkYXRhIHNldHVwIGFuZCBkYXRhIGhvbGQsIHRoZSBoYXJkd2FyZSBpbnRlcnByZXRzIGEgdmFsdWUgb2YgemVybworCSAqIGFzIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGRlbGF5LiBUaGlzIGlzIG5vdCB3aGF0J3MgaW50ZW5kZWQgYnkgYSB6ZXJvCisJICogaW4gdGhlIGlucHV0IHBhcmFtZXRlciwgc28gd2UgaW1wb3NlIGEgbWluaW11bSBvZiBvbmUgY3ljbGUuCisJICovCisJZGF0YV9zZXR1cF9pbl9jeWNsZXMgICAgPSBuc190b19jeWNsZXModGFyZ2V0LmRhdGFfc2V0dXBfaW5fbnMsCisJCQkJCQkJY2xvY2tfcGVyaW9kX2luX25zLCAxKTsKKwlkYXRhX2hvbGRfaW5fY3ljbGVzICAgICA9IG5zX3RvX2N5Y2xlcyh0YXJnZXQuZGF0YV9ob2xkX2luX25zLAorCQkJCQkJCWNsb2NrX3BlcmlvZF9pbl9ucywgMSk7CisJYWRkcmVzc19zZXR1cF9pbl9jeWNsZXMgPSBuc190b19jeWNsZXModGFyZ2V0LmFkZHJlc3Nfc2V0dXBfaW5fbnMsCisJCQkJCQkJY2xvY2tfcGVyaW9kX2luX25zLCAwKTsKKworCS8qCisJICogVGhlIGNsb2NrJ3MgcGVyaW9kIGFmZmVjdHMgdGhlIHNhbXBsZSBkZWxheSBpbiBhIG51bWJlciBvZiB3YXlzOgorCSAqCisJICogKDEpIFRoZSBORkMgSEFMIHRlbGxzIHVzIHRoZSBtYXhpbXVtIGNsb2NrIHBlcmlvZCB0aGUgc2FtcGxlIGRlbGF5CisJICogICAgIERMTCBjYW4gdG9sZXJhdGUuIElmIHRoZSBjbG9jayBwZXJpb2QgaXMgZ3JlYXRlciB0aGFuIGhhbGYgdGhhdAorCSAqICAgICBtYXhpbXVtLCB3ZSBtdXN0IGNvbmZpZ3VyZSB0aGUgRExMIHRvIGJlIGRyaXZlbiBieSBoYWxmIHBlcmlvZHMuCisJICoKKwkgKiAoMikgV2UgbmVlZCB0byBjb252ZXJ0IGZyb20gYW4gaWRlYWwgc2FtcGxlIGRlbGF5LCBpbiBucywgdG8gYQorCSAqICAgICAic2FtcGxlIGRlbGF5IGZhY3RvciwiIHdoaWNoIHRoZSBORkMgdXNlcy4gVGhpcyBmYWN0b3IgZGVwZW5kcyBvbgorCSAqICAgICB3aGV0aGVyIHdlJ3JlIGRyaXZpbmcgdGhlIERMTCB3aXRoIGZ1bGwgb3IgaGFsZiBwZXJpb2RzLgorCSAqICAgICBQYXJhcGhyYXNpbmcgdGhlIHJlZmVyZW5jZSBtYW51YWw6CisJICoKKwkgKiAgICAgICAgIEFEID0gU0RGIHggMC4xMjUgeCBSUAorCSAqCisJICogd2hlcmU6CisJICoKKwkgKiAgICAgQUQgICBpcyB0aGUgYXBwbGllZCBkZWxheSwgaW4gbnMuCisJICogICAgIFNERiAgaXMgdGhlIHNhbXBsZSBkZWxheSBmYWN0b3IsIHdoaWNoIGlzIGRpbWVuc2lvbmxlc3MuCisJICogICAgIFJQICAgaXMgdGhlIHJlZmVyZW5jZSBwZXJpb2QsIGluIG5zLCB3aGljaCBpcyBhIGZ1bGwgY2xvY2sgcGVyaW9kCisJICogICAgICAgICAgaWYgdGhlIERMTCBpcyBiZWluZyBkcml2ZW4gYnkgZnVsbCBwZXJpb2RzLCBvciBoYWxmIHRoYXQgaWYKKwkgKiAgICAgICAgICB0aGUgRExMIGlzIGJlaW5nIGRyaXZlbiBieSBoYWxmIHBlcmlvZHMuCisJICoKKwkgKiBMZXQncyByZS1hcnJhbmdlIHRoaXMgaW4gYSB3YXkgdGhhdCdzIG1vcmUgdXNlZnVsIHRvIHVzOgorCSAqCisJICogICAgICAgICAgICAgICAgICAgICAgICA4CisJICogICAgICAgICBTREYgID0gIEFEIHggLS0tLQorCSAqICAgICAgICAgICAgICAgICAgICAgICBSUAorCSAqCisJICogVGhlIHJlZmVyZW5jZSBwZXJpb2QgaXMgZWl0aGVyIHRoZSBjbG9jayBwZXJpb2Qgb3IgaGFsZiB0aGF0LCBzbyB0aGlzCisJICogaXM6CisJICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIDggICAgICAgQUQgeCBEREYKKwkgKiAgICAgICAgIFNERiAgPSAgQUQgeCAtLS0tLSAgPSAgLS0tLS0tLS0KKwkgKiAgICAgICAgICAgICAgICAgICAgICBmIHggUCAgICAgICAgUAorCSAqCisJICogd2hlcmU6CisJICoKKwkgKiAgICAgICBmICBpcyAxIG9yIDEvMiwgZGVwZW5kaW5nIG9uIGhvdyB3ZSdyZSBkcml2aW5nIHRoZSBETEwuCisJICogICAgICAgUCAgaXMgdGhlIGNsb2NrIHBlcmlvZC4KKwkgKiAgICAgRERGICBpcyB0aGUgRExMIERlbGF5IEZhY3RvciwgYSBkaW1lbnNpb25sZXNzIHZhbHVlIHRoYXQKKwkgKiAgICAgICAgICBpbmNvcnBvcmF0ZXMgYWxsIHRoZSBjb25zdGFudHMgaW4gdGhlIGNvbnZlcnNpb24uCisJICoKKwkgKiBEREYgd2lsbCBiZSBlaXRoZXIgOCBvciAxNiwgYm90aCBvZiB3aGljaCBhcmUgcG93ZXJzIG9mIHR3by4gV2UgY2FuCisJICogcmVkdWNlIHRoZSBjb3N0IG9mIHRoaXMgY29udmVyc2lvbiBieSB1c2luZyBiaXQgc2hpZnRzIGluc3RlYWQgb2YKKwkgKiBtdWx0aXBsaWNhdGlvbiBvciBkaXZpc2lvbi4gVGh1czoKKwkgKgorCSAqICAgICAgICAgICAgICAgICBBRCA8PCBERFMKKwkgKiAgICAgICAgIFNERiAgPSAgLS0tLS0tLS0tCisJICogICAgICAgICAgICAgICAgICAgICBQCisJICoKKwkgKiAgICAgb3IKKwkgKgorCSAqICAgICAgICAgQUQgID0gIChTREYgPj4gRERTKSB4IFAKKwkgKgorCSAqIHdoZXJlOgorCSAqCisJICogICAgIEREUyAgaXMgdGhlIERMTCBEZWxheSBTaGlmdCwgdGhlIGxvZ2FyaXRobSB0byBiYXNlIDIgb2YgdGhlIERERi4KKwkgKi8KKwlpZiAoY2xvY2tfcGVyaW9kX2luX25zID4gKG5mYy0+bWF4X2RsbF9jbG9ja19wZXJpb2RfaW5fbnMgPj4gMSkpIHsKKwkJZGxsX3VzZV9oYWxmX3BlcmlvZHMgPSB0cnVlOworCQlkbGxfZGVsYXlfc2hpZnQgICAgICA9IDMgKyAxOworCX0gZWxzZSB7CisJCWRsbF91c2VfaGFsZl9wZXJpb2RzID0gZmFsc2U7CisJCWRsbF9kZWxheV9zaGlmdCAgICAgID0gMzsKKwl9CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIG1heGltdW0gc2FtcGxlIGRlbGF5IHRoZSBORkMgYWxsb3dzLCB1bmRlciBjdXJyZW50CisJICogY29uZGl0aW9ucy4gSWYgdGhlIGNsb2NrIGlzIHJ1bm5pbmcgdG9vIHNsb3dseSwgbm8gc2FtcGxlIGRlbGF5IGlzCisJICogcG9zc2libGUuCisJICovCisJaWYgKGNsb2NrX3BlcmlvZF9pbl9ucyA+IG5mYy0+bWF4X2RsbF9jbG9ja19wZXJpb2RfaW5fbnMpCisJCW1heF9zYW1wbGVfZGVsYXlfaW5fbnMgPSAwOworCWVsc2UgeworCQkvKgorCQkgKiBDb21wdXRlIHRoZSBkZWxheSBpbXBsaWVkIGJ5IHRoZSBsYXJnZXN0IHNhbXBsZSBkZWxheSBmYWN0b3IKKwkJICogdGhlIE5GQyBhbGxvd3MuCisJCSAqLworCQltYXhfc2FtcGxlX2RlbGF5X2luX25zID0KKwkJCShuZmMtPm1heF9zYW1wbGVfZGVsYXlfZmFjdG9yICogY2xvY2tfcGVyaW9kX2luX25zKSA+PgorCQkJCQkJCQlkbGxfZGVsYXlfc2hpZnQ7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIGltcGxpZWQgc2FtcGxlIGRlbGF5IGxhcmdlciB0aGFuIHRoZSBORkMKKwkJICogYWN0dWFsbHkgYWxsb3dzLgorCQkgKi8KKwkJaWYgKG1heF9zYW1wbGVfZGVsYXlfaW5fbnMgPiBuZmMtPm1heF9kbGxfZGVsYXlfaW5fbnMpCisJCQltYXhfc2FtcGxlX2RlbGF5X2luX25zID0gbmZjLT5tYXhfZGxsX2RlbGF5X2luX25zOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgaW1wcm92ZWQgdGltaW5nIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gSWYgbm90LCB3ZSBoYXZlIHRvCisJICogdXNlIGEgbGVzcy1zb3BoaXN0aWNhdGVkIGFsZ29yaXRobS4KKwkgKi8KKwlpZiAoIWltcHJvdmVkX3RpbWluZ19pc19hdmFpbGFibGUpIHsKKwkJLyoKKwkJICogRm9sZCB0aGUgcmVhZCBzZXR1cCB0aW1lIHJlcXVpcmVkIGJ5IHRoZSBORkMgaW50byB0aGUgaWRlYWwKKwkJICogc2FtcGxlIGRlbGF5LgorCQkgKi8KKwkJaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zID0gdGFyZ2V0LmdwbWlfc2FtcGxlX2RlbGF5X2luX25zICsKKwkJCQkJCW5mYy0+aW50ZXJuYWxfZGF0YV9zZXR1cF9pbl9uczsKKworCQkvKgorCQkgKiBUaGUgaWRlYWwgc2FtcGxlIGRlbGF5IG1heSBiZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0KKwkJICogYWxsb3dlZCBieSB0aGUgTkZDLiBJZiBzbywgd2UgY2FuIHRyYWRlIG9mZiBzYW1wbGUgZGVsYXkgdGltZQorCQkgKiBmb3IgbW9yZSBkYXRhIHNldHVwIHRpbWUuCisJCSAqCisJCSAqIEluIGVhY2ggaXRlcmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgbG9vcCwgd2UgYWRkIGEgY3ljbGUgdG8KKwkJICogdGhlIGRhdGEgc2V0dXAgdGltZSBhbmQgc3VidHJhY3QgYSBjb3JyZXNwb25kaW5nIGFtb3VudCBmcm9tCisJCSAqIHRoZSBzYW1wbGUgZGVsYXkgdW50aWwgd2UndmUgc2F0aXNpZmllZCB0aGUgY29uc3RyYWludHMgb3IKKwkJICogY2FuJ3QgZG8gYW55IGJldHRlci4KKwkJICovCisJCXdoaWxlICgoaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zID4gbWF4X3NhbXBsZV9kZWxheV9pbl9ucykgJiYKKwkJCShkYXRhX3NldHVwX2luX2N5Y2xlcyA8IG5mYy0+bWF4X2RhdGFfc2V0dXBfY3ljbGVzKSkgeworCisJCQlkYXRhX3NldHVwX2luX2N5Y2xlcysrOworCQkJaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zIC09IGNsb2NrX3BlcmlvZF9pbl9uczsKKworCQkJaWYgKGlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA8IDApCisJCQkJaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zID0gMDsKKworCQl9CisKKwkJLyoKKwkJICogQ29tcHV0ZSB0aGUgc2FtcGxlIGRlbGF5IGZhY3RvciB0aGF0IGNvcnJlc3BvbmRzIG1vc3QgY2xvc2VseQorCQkgKiB0byB0aGUgaWRlYWwgc2FtcGxlIGRlbGF5LiBJZiB0aGUgcmVzdWx0IGlzIHRvbyBsYXJnZSBmb3IgdGhlCisJCSAqIE5GQywgdXNlIHRoZSBtYXhpbXVtIHZhbHVlLgorCQkgKgorCQkgKiBOb3RpY2UgdGhhdCB3ZSB1c2UgdGhlIG5zX3RvX2N5Y2xlcyBmdW5jdGlvbiB0byBjb21wdXRlIHRoZQorCQkgKiBzYW1wbGUgZGVsYXkgZmFjdG9yLiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGZvcm0gb2YgdGhlCisJCSAqIGNvbXB1dGF0aW9uIGlzIHRoZSBzYW1lIGFzIHRoYXQgZm9yIGNhbGN1bGF0aW5nIGN5Y2xlcy4KKwkJICovCisJCXNhbXBsZV9kZWxheV9mYWN0b3IgPQorCQkJbnNfdG9fY3ljbGVzKAorCQkJCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA8PCBkbGxfZGVsYXlfc2hpZnQsCisJCQkJCQkJY2xvY2tfcGVyaW9kX2luX25zLCAwKTsKKworCQlpZiAoc2FtcGxlX2RlbGF5X2ZhY3RvciA+IG5mYy0+bWF4X3NhbXBsZV9kZWxheV9mYWN0b3IpCisJCQlzYW1wbGVfZGVsYXlfZmFjdG9yID0gbmZjLT5tYXhfc2FtcGxlX2RlbGF5X2ZhY3RvcjsKKworCQkvKiBTa2lwIHRvIHRoZSBwYXJ0IHdoZXJlIHdlIHJldHVybiBvdXIgcmVzdWx0cy4gKi8KKwkJZ290byByZXR1cm5fcmVzdWx0czsKKwl9CisKKwkvKgorCSAqIElmIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB3ZSBoYXZlIG1vcmUgZGV0YWlsZWQgdGltaW5nIGluZm9ybWF0aW9uLAorCSAqIHNvIHdlIGNhbiB1c2UgYSBiZXR0ZXIgYWxnb3JpdGhtLgorCSAqLworCisJLyoKKwkgKiBGb2xkIHRoZSByZWFkIHNldHVwIHRpbWUgcmVxdWlyZWQgYnkgdGhlIE5GQyBpbnRvIHRoZSBtYXhpbXVtCisJICogcHJvcGFnYXRpb24gZGVsYXkuCisJICovCisJbWF4X3Byb3BfZGVsYXlfaW5fbnMgKz0gbmZjLT5pbnRlcm5hbF9kYXRhX3NldHVwX2luX25zOworCisJLyoKKwkgKiBFYXJsaWVyLCB3ZSBjb21wdXRlZCB0aGUgbnVtYmVyIG9mIGNsb2NrIGN5Y2xlcyByZXF1aXJlZCB0byBzYXRpc2Z5CisJICogdGhlIGRhdGEgc2V0dXAgdGltZS4gTm93LCB3ZSBuZWVkIHRvIGtub3cgdGhlIGFjdHVhbCBuYW5vc2Vjb25kcy4KKwkgKi8KKwlkYXRhX3NldHVwX2luX25zID0gY2xvY2tfcGVyaW9kX2luX25zICogZGF0YV9zZXR1cF9pbl9jeWNsZXM7CisKKwkvKgorCSAqIENvbXB1dGUgdEVZRSwgdGhlIHdpZHRoIG9mIHRoZSBkYXRhIGV5ZSB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgTkFORAorCSAqIEZsYXNoLiBUaGUgZXllIHdpZHRoIGlzIGZ1bmRhbWVudGFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgZGF0YSBzZXR1cAorCSAqIHRpbWUsIHBlcnR1cmJlZCBieSBwcm9wYWdhdGlvbiBkZWxheXMgYW5kIHNvbWUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZQorCSAqIE5BTkQgRmxhc2ggZGV2aWNlLgorCSAqCisJICogc3RhcnQgb2YgdGhlIGV5ZSA9IG1heF9wcm9wX2RlbGF5ICsgdFJFQQorCSAqIGVuZCBvZiB0aGUgZXllICAgPSBtaW5fcHJvcF9kZWxheSArIHRSSE9IICsgZGF0YV9zZXR1cAorCSAqLworCXRFWUUgPSAoaW50KW1pbl9wcm9wX2RlbGF5X2luX25zICsgKGludCl0YXJnZXQudFJIT0hfaW5fbnMgKworCQkJCQkJCShpbnQpZGF0YV9zZXR1cF9pbl9uczsKKworCXRFWUUgLT0gKGludCltYXhfcHJvcF9kZWxheV9pbl9ucyArIChpbnQpdGFyZ2V0LnRSRUFfaW5fbnM7CisKKwkvKgorCSAqIFRoZSBleWUgbXVzdCBiZSBvcGVuLiBJZiBpdCdzIG5vdCwgd2UgY2FuIHRyeSB0byBvcGVuIGl0IGJ5CisJICogaW5jcmVhc2luZyBpdHMgbWFpbiBmb3JjZXIsIHRoZSBkYXRhIHNldHVwIHRpbWUuCisJICoKKwkgKiBJbiBlYWNoIGl0ZXJhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGxvb3AsIHdlIGluY3JlYXNlIHRoZSBkYXRhIHNldHVwCisJICogdGltZSBieSBhIHNpbmdsZSBjbG9jayBjeWNsZS4gV2UgZG8gdGhpcyB1bnRpbCBlaXRoZXIgdGhlIGV5ZSBpcworCSAqIG9wZW4gb3Igd2UgcnVuIGludG8gTkZDIGxpbWl0cy4KKwkgKi8KKwl3aGlsZSAoKHRFWUUgPD0gMCkgJiYKKwkJCShkYXRhX3NldHVwX2luX2N5Y2xlcyA8IG5mYy0+bWF4X2RhdGFfc2V0dXBfY3ljbGVzKSkgeworCQkvKiBHaXZlIGEgY3ljbGUgdG8gZGF0YSBzZXR1cC4gKi8KKwkJZGF0YV9zZXR1cF9pbl9jeWNsZXMrKzsKKwkJLyogU3luY2hyb25pemUgdGhlIGRhdGEgc2V0dXAgdGltZSB3aXRoIHRoZSBjeWNsZXMuICovCisJCWRhdGFfc2V0dXBfaW5fbnMgKz0gY2xvY2tfcGVyaW9kX2luX25zOworCQkvKiBBZGp1c3QgdEVZRSBhY2NvcmRpbmdseS4gKi8KKwkJdEVZRSArPSBjbG9ja19wZXJpb2RfaW5fbnM7CisJfQorCisJLyoKKwkgKiBXaGVuIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB0aGUgZXllIGlzIG9wZW4uIFRoZSBpZGVhbCB0aW1lIHRvIHNhbXBsZQorCSAqIHRoZSBkYXRhIGlzIGluIHRoZSBjZW50ZXIgb2YgdGhlIGV5ZToKKwkgKgorCSAqICAgICBlbmQgb2YgdGhlIGV5ZSArIHN0YXJ0IG9mIHRoZSBleWUKKwkgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtICBkYXRhX3NldHVwCisJICogICAgICAgICAgICAgICAgICAgIDIKKwkgKgorCSAqIEFmdGVyIHNvbWUgYWxnZWJyYSwgdGhpcyBzaW1wbGlmaWVzIHRvIHRoZSBjb2RlIGltbWVkaWF0ZWx5IGJlbG93LgorCSAqLworCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA9CisJCSgoaW50KW1heF9wcm9wX2RlbGF5X2luX25zICsKKwkJCShpbnQpdGFyZ2V0LnRSRUFfaW5fbnMgKworCQkJCShpbnQpbWluX3Byb3BfZGVsYXlfaW5fbnMgKworCQkJCQkoaW50KXRhcmdldC50UkhPSF9pbl9ucyAtCisJCQkJCQkoaW50KWRhdGFfc2V0dXBfaW5fbnMpID4+IDE7CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZmlndXJlIGlsbHVzdHJhdGVzIHNvbWUgYXNwZWN0cyBvZiBhIE5BTkQgRmxhc2ggcmVhZDoKKwkgKgorCSAqCisJICogICAgICAgICAgIF9fICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKwkgKiBSRE4gICAgICAgICBcX19fX19fX19fX19fX19fX18vCisJICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS0gdEVZRSAtLS0tLT4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLS0tLS0tLS0tLS0tLS0tLS1cCisJICogUmVhZCBEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08ICAgICAgICAgICAgICAgICAgID4tLS0tLS0tLS0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcLS0tLS0tLS0tLS0tLS0tLS0vCisJICogICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgXgorCSAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICB8PC0tRGF0YSBTZXR1cCAtLT58PC0tRGVsYXkgVGltZSAtLT58ICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8PC0tICAgUXVhbnRpemVkIERlbGF5IFRpbWUgICAtLT58CisJICogICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAqCisJICoKKwkgKiBXZSBoYXZlIHNvbWUgaXNzdWVzIHdlIG11c3Qgbm93IGFkZHJlc3M6CisJICoKKwkgKiAoMSkgVGhlICppZGVhbCogc2FtcGxlIGRlbGF5IHRpbWUgbXVzdCBub3QgYmUgbmVnYXRpdmUuIElmIGl0IGlzLCB3ZQorCSAqICAgICBqYW0gaXQgdG8gemVyby4KKwkgKgorCSAqICgyKSBUaGUgKmlkZWFsKiBzYW1wbGUgZGVsYXkgdGltZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhhdAorCSAqICAgICBhbGxvd2VkIGJ5IHRoZSBORkMuIElmIGl0IGlzLCB3ZSBjYW4gaW5jcmVhc2UgdGhlIGRhdGEgc2V0dXAKKwkgKiAgICAgdGltZSwgd2hpY2ggd2lsbCByZWR1Y2UgdGhlIGRlbGF5IGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgZGF0YQorCSAqICAgICBzZXR1cCBhbmQgdGhlIGNlbnRlciBvZiB0aGUgZXllLiBJdCB3aWxsIGFsc28gbWFrZSB0aGUgZXllCisJICogICAgIGxhcmdlciwgd2hpY2ggbWlnaHQgaGVscCB3aXRoIHRoZSBuZXh0IGlzc3VlLi4uCisJICoKKwkgKiAoMykgVGhlICpxdWFudGl6ZWQqIHNhbXBsZSBkZWxheSB0aW1lIG11c3Qgbm90IGZhbGwgZWl0aGVyIGJlZm9yZSB0aGUKKwkgKiAgICAgZXllIG9wZW5zIG9yIGFmdGVyIGl0IGNsb3NlcyAodGhlIGxhdHRlciBpcyB0aGUgcHJvYmxlbQorCSAqICAgICBpbGx1c3RyYXRlZCBpbiB0aGUgYWJvdmUgZmlndXJlKS4KKwkgKi8KKworCS8qIEphbSBhIG5lZ2F0aXZlIGlkZWFsIHNhbXBsZSBkZWxheSB0byB6ZXJvLiAqLworCWlmIChpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPCAwKQorCQlpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPSAwOworCisJLyoKKwkgKiBFeHRlbmQgdGhlIGRhdGEgc2V0dXAgYXMgbmVlZGVkIHRvIHJlZHVjZSB0aGUgaWRlYWwgc2FtcGxlIGRlbGF5CisJICogYmVsb3cgdGhlIG1heGltdW0gcGVybWl0dGVkIGJ5IHRoZSBORkMuCisJICovCisJd2hpbGUgKChpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPiBtYXhfc2FtcGxlX2RlbGF5X2luX25zKSAmJgorCQkJKGRhdGFfc2V0dXBfaW5fY3ljbGVzIDwgbmZjLT5tYXhfZGF0YV9zZXR1cF9jeWNsZXMpKSB7CisKKwkJLyogR2l2ZSBhIGN5Y2xlIHRvIGRhdGEgc2V0dXAuICovCisJCWRhdGFfc2V0dXBfaW5fY3ljbGVzKys7CisJCS8qIFN5bmNocm9uaXplIHRoZSBkYXRhIHNldHVwIHRpbWUgd2l0aCB0aGUgY3ljbGVzLiAqLworCQlkYXRhX3NldHVwX2luX25zICs9IGNsb2NrX3BlcmlvZF9pbl9uczsKKwkJLyogQWRqdXN0IHRFWUUgYWNjb3JkaW5nbHkuICovCisJCXRFWUUgKz0gY2xvY2tfcGVyaW9kX2luX25zOworCisJCS8qCisJCSAqIERlY3JlYXNlIHRoZSBpZGVhbCBzYW1wbGUgZGVsYXkgYnkgb25lIGhhbGYgY3ljbGUsIHRvIGtlZXAgaXQKKwkJICogaW4gdGhlIG1pZGRsZSBvZiB0aGUgZXllLgorCQkgKi8KKwkJaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zIC09IChjbG9ja19wZXJpb2RfaW5fbnMgPj4gMSk7CisKKwkJLyogSmFtIGEgbmVnYXRpdmUgaWRlYWwgc2FtcGxlIGRlbGF5IHRvIHplcm8uICovCisJCWlmIChpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPCAwKQorCQkJaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zID0gMDsKKwl9CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIHNhbXBsZSBkZWxheSBmYWN0b3IgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgaWRlYWwgc2FtcGxlCisJICogZGVsYXkuIElmIHRoZSByZXN1bHQgaXMgdG9vIGxhcmdlLCB0aGVuIHVzZSB0aGUgbWF4aW11bSBhbGxvd2VkCisJICogdmFsdWUuCisJICoKKwkgKiBOb3RpY2UgdGhhdCB3ZSB1c2UgdGhlIG5zX3RvX2N5Y2xlcyBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBzYW1wbGUKKwkgKiBkZWxheSBmYWN0b3IuIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgZm9ybSBvZiB0aGUgY29tcHV0YXRpb24gaXMgdGhlCisJICogc2FtZSBhcyB0aGF0IGZvciBjYWxjdWxhdGluZyBjeWNsZXMuCisJICovCisJc2FtcGxlX2RlbGF5X2ZhY3RvciA9CisJCW5zX3RvX2N5Y2xlcyhpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPDwgZGxsX2RlbGF5X3NoaWZ0LAorCQkJCQkJCWNsb2NrX3BlcmlvZF9pbl9ucywgMCk7CisKKwlpZiAoc2FtcGxlX2RlbGF5X2ZhY3RvciA+IG5mYy0+bWF4X3NhbXBsZV9kZWxheV9mYWN0b3IpCisJCXNhbXBsZV9kZWxheV9mYWN0b3IgPSBuZmMtPm1heF9zYW1wbGVfZGVsYXlfZmFjdG9yOworCisJLyoKKwkgKiBUaGVzZSBtYWNyb3MgY29udmVuaWVudGx5IGVuY2Fwc3VsYXRlIGEgY29tcHV0YXRpb24gd2UnbGwgdXNlIHRvCisJICogY29udGludW91c2x5IGV2YWx1YXRlIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRhIHNhbXBsZSBkZWxheSBpcyBpbnNpZGUKKwkgKiB0aGUgZXllLgorCSAqLworCSNkZWZpbmUgSURFQUxfREVMQVkgICgoaW50KSBpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMpCisKKwkjZGVmaW5lIFFVQU5USVpFRF9ERUxBWSAgXAorCQkoKGludCkgKChzYW1wbGVfZGVsYXlfZmFjdG9yICogY2xvY2tfcGVyaW9kX2luX25zKSA+PiBcCisJCQkJCQkJZGxsX2RlbGF5X3NoaWZ0KSkKKworCSNkZWZpbmUgREVMQVlfRVJST1IgIChhYnMoUVVBTlRJWkVEX0RFTEFZIC0gSURFQUxfREVMQVkpKQorCisJI2RlZmluZSBTQU1QTEVfSVNfTk9UX1dJVEhJTl9USEVfRVlFICAoREVMQVlfRVJST1IgPiAodEVZRSA+PiAxKSkKKworCS8qCisJICogV2hpbGUgdGhlIHF1YW50aXplZCBzYW1wbGUgdGltZSBmYWxscyBvdXRzaWRlIHRoZSBleWUsIHJlZHVjZSB0aGUKKwkgKiBzYW1wbGUgZGVsYXkgb3IgZXh0ZW5kIHRoZSBkYXRhIHNldHVwIHRvIG1vdmUgdGhlIHNhbXBsaW5nIHBvaW50IGJhY2sKKwkgKiB0b3dhcmQgdGhlIGV5ZS4gRG8gbm90IGFsbG93IHRoZSBudW1iZXIgb2YgZGF0YSBzZXR1cCBjeWNsZXMgdG8KKwkgKiBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgTkZDLgorCSAqLworCXdoaWxlIChTQU1QTEVfSVNfTk9UX1dJVEhJTl9USEVfRVlFICYmCisJCQkoZGF0YV9zZXR1cF9pbl9jeWNsZXMgPCBuZmMtPm1heF9kYXRhX3NldHVwX2N5Y2xlcykpIHsKKwkJLyoKKwkJICogSWYgY29udHJvbCBhcnJpdmVzIGhlcmUsIHRoZSBxdWFudGl6ZWQgc2FtcGxlIGRlbGF5IGZhbGxzCisJCSAqIG91dHNpZGUgdGhlIGV5ZS4gQ2hlY2sgaWYgaXQncyBiZWZvcmUgdGhlIGV5ZSBvcGVucywgb3IgYWZ0ZXIKKwkJICogdGhlIGV5ZSBjbG9zZXMuCisJCSAqLworCQlpZiAoUVVBTlRJWkVEX0RFTEFZID4gSURFQUxfREVMQVkpIHsKKwkJCS8qCisJCQkgKiBJZiBjb250cm9sIGFycml2ZXMgaGVyZSwgdGhlIHF1YW50aXplZCBzYW1wbGUgZGVsYXkKKwkJCSAqIGZhbGxzIGFmdGVyIHRoZSBleWUgY2xvc2VzLiBEZWNyZWFzZSB0aGUgcXVhbnRpemVkCisJCQkgKiBkZWxheSB0aW1lIGFuZCB0aGVuIGdvIGJhY2sgdG8gcmUtZXZhbHVhdGUuCisJCQkgKi8KKwkJCWlmIChzYW1wbGVfZGVsYXlfZmFjdG9yICE9IDApCisJCQkJc2FtcGxlX2RlbGF5X2ZhY3Rvci0tOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBJZiBjb250cm9sIGFycml2ZXMgaGVyZSwgdGhlIHF1YW50aXplZCBzYW1wbGUgZGVsYXkgZmFsbHMKKwkJICogYmVmb3JlIHRoZSBleWUgb3BlbnMuIFNoaWZ0IHRoZSBzYW1wbGUgcG9pbnQgYnkgaW5jcmVhc2luZworCQkgKiBkYXRhIHNldHVwIHRpbWUuIFRoaXMgd2lsbCBhbHNvIG1ha2UgdGhlIGV5ZSBsYXJnZXIuCisJCSAqLworCisJCS8qIEdpdmUgYSBjeWNsZSB0byBkYXRhIHNldHVwLiAqLworCQlkYXRhX3NldHVwX2luX2N5Y2xlcysrOworCQkvKiBTeW5jaHJvbml6ZSB0aGUgZGF0YSBzZXR1cCB0aW1lIHdpdGggdGhlIGN5Y2xlcy4gKi8KKwkJZGF0YV9zZXR1cF9pbl9ucyArPSBjbG9ja19wZXJpb2RfaW5fbnM7CisJCS8qIEFkanVzdCB0RVlFIGFjY29yZGluZ2x5LiAqLworCQl0RVlFICs9IGNsb2NrX3BlcmlvZF9pbl9uczsKKworCQkvKgorCQkgKiBEZWNyZWFzZSB0aGUgaWRlYWwgc2FtcGxlIGRlbGF5IGJ5IG9uZSBoYWxmIGN5Y2xlLCB0byBrZWVwIGl0CisJCSAqIGluIHRoZSBtaWRkbGUgb2YgdGhlIGV5ZS4KKwkJICovCisJCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyAtPSAoY2xvY2tfcGVyaW9kX2luX25zID4+IDEpOworCisJCS8qIC4uLmFuZCBvbmUgbGVzcyBwZXJpb2QgZm9yIHRoZSBkZWxheSB0aW1lLiAqLworCQlpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgLT0gY2xvY2tfcGVyaW9kX2luX25zOworCisJCS8qIEphbSBhIG5lZ2F0aXZlIGlkZWFsIHNhbXBsZSBkZWxheSB0byB6ZXJvLiAqLworCQlpZiAoaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zIDwgMCkKKwkJCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA9IDA7CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhIG5ldyBpZGVhbCBzYW1wbGUgZGVsYXksIHNvIHJlLWNvbXB1dGUgdGhlIHF1YW50aXplZAorCQkgKiBkZWxheS4KKwkJICovCisJCXNhbXBsZV9kZWxheV9mYWN0b3IgPQorCQkJbnNfdG9fY3ljbGVzKAorCQkJCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA8PCBkbGxfZGVsYXlfc2hpZnQsCisJCQkJCQkJY2xvY2tfcGVyaW9kX2luX25zLCAwKTsKKworCQlpZiAoc2FtcGxlX2RlbGF5X2ZhY3RvciA+IG5mYy0+bWF4X3NhbXBsZV9kZWxheV9mYWN0b3IpCisJCQlzYW1wbGVfZGVsYXlfZmFjdG9yID0gbmZjLT5tYXhfc2FtcGxlX2RlbGF5X2ZhY3RvcjsKKwl9CisKKwkvKiBDb250cm9sIGFycml2ZXMgaGVyZSB3aGVuIHdlJ3JlIHJlYWR5IHRvIHJldHVybiBvdXIgcmVzdWx0cy4gKi8KK3JldHVybl9yZXN1bHRzOgorCWh3LT5kYXRhX3NldHVwX2luX2N5Y2xlcyAgICA9IGRhdGFfc2V0dXBfaW5fY3ljbGVzOworCWh3LT5kYXRhX2hvbGRfaW5fY3ljbGVzICAgICA9IGRhdGFfaG9sZF9pbl9jeWNsZXM7CisJaHctPmFkZHJlc3Nfc2V0dXBfaW5fY3ljbGVzID0gYWRkcmVzc19zZXR1cF9pbl9jeWNsZXM7CisJaHctPnVzZV9oYWxmX3BlcmlvZHMgICAgICAgID0gZGxsX3VzZV9oYWxmX3BlcmlvZHM7CisJaHctPnNhbXBsZV9kZWxheV9mYWN0b3IgICAgID0gc2FtcGxlX2RlbGF5X2ZhY3RvcjsKKworCS8qIFJldHVybiBzdWNjZXNzLiAqLworCXJldHVybiAwOworfQorCisvKiBCZWdpbiB0aGUgSS9PICovCit2b2lkIGdwbWlfYmVnaW4oc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCByZXNvdXJjZXMgKnIgPSAmdGhpcy0+cmVzb3VyY2VzOworCXN0cnVjdCB0aW1pbmdfdGhyZXNob2QgKm5mYyA9ICZ0aW1pbmdfZGVmYXVsdF90aHJlc2hvbGQ7CisJdW5zaWduZWQgY2hhciAgKmdwbWlfcmVncyA9IHItPmdwbWlfcmVnczsKKwl1bnNpZ25lZCBpbnQgICBjbG9ja19wZXJpb2RfaW5fbnM7CisJdWludDMyX3QgICAgICAgcmVnOworCXVuc2lnbmVkIGludCAgIGRsbF93YWl0X3RpbWVfaW5fdXM7CisJc3RydWN0IGdwbWlfbmZjX2hhcmR3YXJlX3RpbWluZyAgaHc7CisJaW50IHJldDsKKworCS8qIEVuYWJsZSB0aGUgY2xvY2suICovCisJcmV0ID0gY2xrX2VuYWJsZShyLT5jbG9jayk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIldlIGZhaWxlZCBpbiBlbmFibGUgdGhlIGNsa1xuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBzZXQgcmVhZHkvYnVzeSB0aW1lb3V0ICovCisJd3JpdGVsKDB4NTAwIDw8IEJQX0dQTUlfVElNSU5HMV9CVVNZX1RJTUVPVVQsCisJCWdwbWlfcmVncyArIEhXX0dQTUlfVElNSU5HMSk7CisKKwkvKiBHZXQgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiB3ZSBuZWVkLiAqLworCW5mYy0+Y2xvY2tfZnJlcXVlbmN5X2luX2h6ID0gY2xrX2dldF9yYXRlKHItPmNsb2NrKTsKKwljbG9ja19wZXJpb2RfaW5fbnMgPSAxMDAwMDAwMDAwIC8gbmZjLT5jbG9ja19mcmVxdWVuY3lfaW5faHo7CisKKwlncG1pX25mY19jb21wdXRlX2hhcmR3YXJlX3RpbWluZyh0aGlzLCAmaHcpOworCisJLyogU2V0IHVwIGFsbCB0aGUgc2ltcGxlIHRpbWluZyBwYXJhbWV0ZXJzLiAqLworCXJlZyA9IEJGX0dQTUlfVElNSU5HMF9BRERSRVNTX1NFVFVQKGh3LmFkZHJlc3Nfc2V0dXBfaW5fY3ljbGVzKSB8CisJCUJGX0dQTUlfVElNSU5HMF9EQVRBX0hPTEQoaHcuZGF0YV9ob2xkX2luX2N5Y2xlcykgICAgICAgICB8CisJCUJGX0dQTUlfVElNSU5HMF9EQVRBX1NFVFVQKGh3LmRhdGFfc2V0dXBfaW5fY3ljbGVzKSAgICAgICA7CisKKwl3cml0ZWwocmVnLCBncG1pX3JlZ3MgKyBIV19HUE1JX1RJTUlORzApOworCisJLyoKKwkgKiBETExfRU5BQkxFIG11c3QgYmUgc2V0IHRvIDAgd2hlbiBzZXR0aW5nIFJETl9ERUxBWSBvciBIQUxGX1BFUklPRC4KKwkgKi8KKwl3cml0ZWwoQk1fR1BNSV9DVFJMMV9ETExfRU5BQkxFLCBncG1pX3JlZ3MgKyBIV19HUE1JX0NUUkwxX0NMUik7CisKKwkvKiBDbGVhciBvdXQgdGhlIERMTCBjb250cm9sIGZpZWxkcy4gKi8KKwl3cml0ZWwoQk1fR1BNSV9DVFJMMV9SRE5fREVMQVksICAgZ3BtaV9yZWdzICsgSFdfR1BNSV9DVFJMMV9DTFIpOworCXdyaXRlbChCTV9HUE1JX0NUUkwxX0hBTEZfUEVSSU9ELCBncG1pX3JlZ3MgKyBIV19HUE1JX0NUUkwxX0NMUik7CisKKwkvKiBJZiBubyBzYW1wbGUgZGVsYXkgaXMgY2FsbGVkIGZvciwgcmV0dXJuIGltbWVkaWF0ZWx5LiAqLworCWlmICghaHcuc2FtcGxlX2RlbGF5X2ZhY3RvcikKKwkJcmV0dXJuOworCisJLyogQ29uZmlndXJlIHRoZSBIQUxGX1BFUklPRCBmbGFnLiAqLworCWlmIChody51c2VfaGFsZl9wZXJpb2RzKQorCQl3cml0ZWwoQk1fR1BNSV9DVFJMMV9IQUxGX1BFUklPRCwKKwkJCQkJCWdwbWlfcmVncyArIEhXX0dQTUlfQ1RSTDFfU0VUKTsKKworCS8qIFNldCB0aGUgZGVsYXkgZmFjdG9yLiAqLworCXdyaXRlbChCRl9HUE1JX0NUUkwxX1JETl9ERUxBWShody5zYW1wbGVfZGVsYXlfZmFjdG9yKSwKKwkJCQkJCWdwbWlfcmVncyArIEhXX0dQTUlfQ1RSTDFfU0VUKTsKKworCS8qIEVuYWJsZSB0aGUgRExMLiAqLworCXdyaXRlbChCTV9HUE1JX0NUUkwxX0RMTF9FTkFCTEUsIGdwbWlfcmVncyArIEhXX0dQTUlfQ1RSTDFfU0VUKTsKKworCS8qCisJICogQWZ0ZXIgd2UgZW5hYmxlIHRoZSBHUE1JIERMTCwgd2UgaGF2ZSB0byB3YWl0IDY0IGNsb2NrIGN5Y2xlcyBiZWZvcmUKKwkgKiB3ZSBjYW4gdXNlIHRoZSBHUE1JLgorCSAqCisJICogQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgdGltZSB3ZSBuZWVkIHRvIHdhaXQsIGluIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwlkbGxfd2FpdF90aW1lX2luX3VzID0gKGNsb2NrX3BlcmlvZF9pbl9ucyAqIDY0KSAvIDEwMDA7CisKKwlpZiAoIWRsbF93YWl0X3RpbWVfaW5fdXMpCisJCWRsbF93YWl0X3RpbWVfaW5fdXMgPSAxOworCisJLyogV2FpdCBmb3IgdGhlIERMTCB0byBzZXR0bGUuICovCisJdWRlbGF5KGRsbF93YWl0X3RpbWVfaW5fdXMpOworCitlcnJfb3V0OgorCXJldHVybjsKK30KKwordm9pZCBncG1pX2VuZChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IHJlc291cmNlcyAqciA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJY2xrX2Rpc2FibGUoci0+Y2xvY2spOworfQorCisvKiBDbGVhcnMgYSBCQ0ggaW50ZXJydXB0LiAqLwordm9pZCBncG1pX2NsZWFyX2JjaChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IHJlc291cmNlcyAqciA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJd3JpdGVsKEJNX0JDSF9DVFJMX0NPTVBMRVRFX0lSUSwgci0+YmNoX3JlZ3MgKyBIV19CQ0hfQ1RSTF9DTFIpOworfQorCisvKiBSZXR1cm5zIHRoZSBSZWFkeS9CdXN5IHN0YXR1cyBvZiB0aGUgZ2l2ZW4gY2hpcC4gKi8KK2ludCBncG1pX2lzX3JlYWR5KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywgdW5zaWduZWQgY2hpcCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2VzICpyID0gJnRoaXMtPnJlc291cmNlczsKKwl1aW50MzJfdCBtYXNrID0gMDsKKwl1aW50MzJfdCByZWcgPSAwOworCisJaWYgKEdQTUlfSVNfTVgyMyh0aGlzKSkgeworCQltYXNrID0gTVgyM19CTV9HUE1JX0RFQlVHX1JFQURZMCA8PCBjaGlwOworCQlyZWcgPSByZWFkbChyLT5ncG1pX3JlZ3MgKyBIV19HUE1JX0RFQlVHKTsKKwl9IGVsc2UgaWYgKEdQTUlfSVNfTVgyOCh0aGlzKSkgeworCQltYXNrID0gTVgyOF9CRl9HUE1JX1NUQVRfUkVBRFlfQlVTWSgxIDw8IGNoaXApOworCQlyZWcgPSByZWFkbChyLT5ncG1pX3JlZ3MgKyBIV19HUE1JX1NUQVQpOworCX0gZWxzZQorCQlwcl9lcnIoInVua25vdyBhcmNoLlxuIik7CisJcmV0dXJuIHJlZyAmIG1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX3R5cGUoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJCQllbnVtIGRtYV9vcHNfdHlwZSB0eXBlKQoreworCXRoaXMtPmxhc3RfZG1hX3R5cGUgPSB0aGlzLT5kbWFfdHlwZTsKKwl0aGlzLT5kbWFfdHlwZSA9IHR5cGU7Cit9CisKK2ludCBncG1pX3NlbmRfY29tbWFuZChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IGRtYV9jaGFuICpjaGFubmVsID0gZ2V0X2RtYV9jaGFuKHRoaXMpOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbDsKKwlpbnQgY2hpcCA9IHRoaXMtPmN1cnJlbnRfY2hpcDsKKwl1MzIgcGlvWzNdOworCisJLyogWzFdIHNlbmQgb3V0IHRoZSBQSU8gd29yZHMgKi8KKwlwaW9bMF0gPSBCRl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERShCVl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERV9fV1JJVEUpCisJCXwgQk1fR1BNSV9DVFJMMF9XT1JEX0xFTkdUSAorCQl8IEJGX0dQTUlfQ1RSTDBfQ1MoY2hpcCwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0xPQ0tfQ1MoTE9DS19DU19FTkFCTEUsIHRoaXMpCisJCXwgQkZfR1BNSV9DVFJMMF9BRERSRVNTKEJWX0dQTUlfQ1RSTDBfQUREUkVTU19fTkFORF9DTEUpCisJCXwgQk1fR1BNSV9DVFJMMF9BRERSRVNTX0lOQ1JFTUVOVAorCQl8IEJGX0dQTUlfQ1RSTDBfWEZFUl9DT1VOVCh0aGlzLT5jb21tYW5kX2xlbmd0aCk7CisJcGlvWzFdID0gcGlvWzJdID0gMDsKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLAorCQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopcGlvLAorCQkJCQlBUlJBWV9TSVpFKHBpbyksIERNQV9OT05FLCAwKTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJzdGVwIDEgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogWzJdIHNlbmQgb3V0IHRoZSBDT01NQU5EICsgQUREUkVTUyBzdHJpbmcgc3RvcmVkIGluIEBidWZmZXIgKi8KKwlzZ2wgPSAmdGhpcy0+Y21kX3NnbDsKKworCXNnX2luaXRfb25lKHNnbCwgdGhpcy0+Y21kX2J1ZmZlciwgdGhpcy0+Y29tbWFuZF9sZW5ndGgpOworCWRtYV9tYXBfc2codGhpcy0+ZGV2LCBzZ2wsIDEsIERNQV9UT19ERVZJQ0UpOworCWRlc2MgPSBjaGFubmVsLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKGNoYW5uZWwsCisJCQkJCXNnbCwgMSwgRE1BX1RPX0RFVklDRSwgMSk7CisJaWYgKCFkZXNjKSB7CisJCXByX2Vycigic3RlcCAyIGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFszXSBzdWJtaXQgdGhlIERNQSAqLworCXNldF9kbWFfdHlwZSh0aGlzLCBETUFfRk9SX0NPTU1BTkQpOworCXJldHVybiBzdGFydF9kbWFfd2l0aG91dF9iY2hfaXJxKHRoaXMsIGRlc2MpOworfQorCitpbnQgZ3BtaV9zZW5kX2RhdGEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW5uZWwgPSBnZXRfZG1hX2NoYW4odGhpcyk7CisJaW50IGNoaXAgPSB0aGlzLT5jdXJyZW50X2NoaXA7CisJdWludDMyX3QgY29tbWFuZF9tb2RlOworCXVpbnQzMl90IGFkZHJlc3M7CisJdTMyIHBpb1syXTsKKworCS8qIFsxXSBQSU8gKi8KKwljb21tYW5kX21vZGUgPSBCVl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERV9fV1JJVEU7CisJYWRkcmVzcyAgICAgID0gQlZfR1BNSV9DVFJMMF9BRERSRVNTX19OQU5EX0RBVEE7CisKKwlwaW9bMF0gPSBCRl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERShjb21tYW5kX21vZGUpCisJCXwgQk1fR1BNSV9DVFJMMF9XT1JEX0xFTkdUSAorCQl8IEJGX0dQTUlfQ1RSTDBfQ1MoY2hpcCwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0xPQ0tfQ1MoTE9DS19DU19FTkFCTEUsIHRoaXMpCisJCXwgQkZfR1BNSV9DVFJMMF9BRERSRVNTKGFkZHJlc3MpCisJCXwgQkZfR1BNSV9DVFJMMF9YRkVSX0NPVU5UKHRoaXMtPnVwcGVyX2xlbik7CisJcGlvWzFdID0gMDsKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLAorCQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopcGlvLAorCQkJCQlBUlJBWV9TSVpFKHBpbyksIERNQV9OT05FLCAwKTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJzdGVwIDEgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogWzJdIHNlbmQgRE1BIHJlcXVlc3QgKi8KKwlwcmVwYXJlX2RhdGFfZG1hKHRoaXMsIERNQV9UT19ERVZJQ0UpOworCWRlc2MgPSBjaGFubmVsLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKGNoYW5uZWwsICZ0aGlzLT5kYXRhX3NnbCwKKwkJCQkJCTEsIERNQV9UT19ERVZJQ0UsIDEpOworCWlmICghZGVzYykgeworCQlwcl9lcnIoInN0ZXAgMiBlcnJvclxuIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogWzNdIHN1Ym1pdCB0aGUgRE1BICovCisJc2V0X2RtYV90eXBlKHRoaXMsIERNQV9GT1JfV1JJVEVfREFUQSk7CisJcmV0dXJuIHN0YXJ0X2RtYV93aXRob3V0X2JjaF9pcnEodGhpcywgZGVzYyk7Cit9CisKK2ludCBncG1pX3JlYWRfZGF0YShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbm5lbCA9IGdldF9kbWFfY2hhbih0aGlzKTsKKwlpbnQgY2hpcCA9IHRoaXMtPmN1cnJlbnRfY2hpcDsKKwl1MzIgcGlvWzJdOworCisJLyogWzFdIDogc2VuZCBQSU8gKi8KKwlwaW9bMF0gPSBCRl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERShCVl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERV9fUkVBRCkKKwkJfCBCTV9HUE1JX0NUUkwwX1dPUkRfTEVOR1RICisJCXwgQkZfR1BNSV9DVFJMMF9DUyhjaGlwLCB0aGlzKQorCQl8IEJGX0dQTUlfQ1RSTDBfTE9DS19DUyhMT0NLX0NTX0VOQUJMRSwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0FERFJFU1MoQlZfR1BNSV9DVFJMMF9BRERSRVNTX19OQU5EX0RBVEEpCisJCXwgQkZfR1BNSV9DVFJMMF9YRkVSX0NPVU5UKHRoaXMtPnVwcGVyX2xlbik7CisJcGlvWzFdID0gMDsKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLAorCQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopcGlvLAorCQkJCQlBUlJBWV9TSVpFKHBpbyksIERNQV9OT05FLCAwKTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJzdGVwIDEgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogWzJdIDogc2VuZCBETUEgcmVxdWVzdCAqLworCXByZXBhcmVfZGF0YV9kbWEodGhpcywgRE1BX0ZST01fREVWSUNFKTsKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLCAmdGhpcy0+ZGF0YV9zZ2wsCisJCQkJCQkxLCBETUFfRlJPTV9ERVZJQ0UsIDEpOworCWlmICghZGVzYykgeworCQlwcl9lcnIoInN0ZXAgMiBlcnJvclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBbM10gOiBzdWJtaXQgdGhlIERNQSAqLworCXNldF9kbWFfdHlwZSh0aGlzLCBETUFfRk9SX1JFQURfREFUQSk7CisJcmV0dXJuIHN0YXJ0X2RtYV93aXRob3V0X2JjaF9pcnEodGhpcywgZGVzYyk7Cit9CisKK2ludCBncG1pX3NlbmRfcGFnZShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQlkbWFfYWRkcl90IHBheWxvYWQsIGRtYV9hZGRyX3QgYXV4aWxpYXJ5KQoreworCXN0cnVjdCBiY2hfZ2VvbWV0cnkgKmdlbyA9ICZ0aGlzLT5iY2hfZ2VvbWV0cnk7CisJdWludDMyX3QgY29tbWFuZF9tb2RlOworCXVpbnQzMl90IGFkZHJlc3M7CisJdWludDMyX3QgZWNjX2NvbW1hbmQ7CisJdWludDMyX3QgYnVmZmVyX21hc2s7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbm5lbCA9IGdldF9kbWFfY2hhbih0aGlzKTsKKwlpbnQgY2hpcCA9IHRoaXMtPmN1cnJlbnRfY2hpcDsKKwl1MzIgcGlvWzZdOworCisJLyogQSBETUEgZGVzY3JpcHRvciB0aGF0IGRvZXMgYW4gRUNDIHBhZ2UgcmVhZC4gKi8KKwljb21tYW5kX21vZGUgPSBCVl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERV9fV1JJVEU7CisJYWRkcmVzcyAgICAgID0gQlZfR1BNSV9DVFJMMF9BRERSRVNTX19OQU5EX0RBVEE7CisJZWNjX2NvbW1hbmQgID0gQlZfR1BNSV9FQ0NDVFJMX0VDQ19DTURfX0JDSF9FTkNPREU7CisJYnVmZmVyX21hc2sgID0gQlZfR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLX19CQ0hfUEFHRSB8CisJCQkJQlZfR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLX19CQ0hfQVVYT05MWTsKKworCXBpb1swXSA9IEJGX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFKGNvbW1hbmRfbW9kZSkKKwkJfCBCTV9HUE1JX0NUUkwwX1dPUkRfTEVOR1RICisJCXwgQkZfR1BNSV9DVFJMMF9DUyhjaGlwLCB0aGlzKQorCQl8IEJGX0dQTUlfQ1RSTDBfTE9DS19DUyhMT0NLX0NTX0VOQUJMRSwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0FERFJFU1MoYWRkcmVzcykKKwkJfCBCRl9HUE1JX0NUUkwwX1hGRVJfQ09VTlQoMCk7CisJcGlvWzFdID0gMDsKKwlwaW9bMl0gPSBCTV9HUE1JX0VDQ0NUUkxfRU5BQkxFX0VDQworCQl8IEJGX0dQTUlfRUNDQ1RSTF9FQ0NfQ01EKGVjY19jb21tYW5kKQorCQl8IEJGX0dQTUlfRUNDQ1RSTF9CVUZGRVJfTUFTSyhidWZmZXJfbWFzayk7CisJcGlvWzNdID0gZ2VvLT5wYWdlX3NpemU7CisJcGlvWzRdID0gcGF5bG9hZDsKKwlwaW9bNV0gPSBhdXhpbGlhcnk7CisKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLAorCQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopcGlvLAorCQkJCQlBUlJBWV9TSVpFKHBpbyksIERNQV9OT05FLCAwKTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJzdGVwIDIgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXNldF9kbWFfdHlwZSh0aGlzLCBETUFfRk9SX1dSSVRFX0VDQ19QQUdFKTsKKwlyZXR1cm4gc3RhcnRfZG1hX3dpdGhfYmNoX2lycSh0aGlzLCBkZXNjKTsKK30KKworaW50IGdwbWlfcmVhZF9wYWdlKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywKKwkJCQlkbWFfYWRkcl90IHBheWxvYWQsIGRtYV9hZGRyX3QgYXV4aWxpYXJ5KQoreworCXN0cnVjdCBiY2hfZ2VvbWV0cnkgKmdlbyA9ICZ0aGlzLT5iY2hfZ2VvbWV0cnk7CisJdWludDMyX3QgY29tbWFuZF9tb2RlOworCXVpbnQzMl90IGFkZHJlc3M7CisJdWludDMyX3QgZWNjX2NvbW1hbmQ7CisJdWludDMyX3QgYnVmZmVyX21hc2s7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbm5lbCA9IGdldF9kbWFfY2hhbih0aGlzKTsKKwlpbnQgY2hpcCA9IHRoaXMtPmN1cnJlbnRfY2hpcDsKKwl1MzIgcGlvWzZdOworCisJLyogWzFdIFdhaXQgZm9yIHRoZSBjaGlwIHRvIHJlcG9ydCByZWFkeS4gKi8KKwljb21tYW5kX21vZGUgPSBCVl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERV9fV0FJVF9GT1JfUkVBRFk7CisJYWRkcmVzcyAgICAgID0gQlZfR1BNSV9DVFJMMF9BRERSRVNTX19OQU5EX0RBVEE7CisKKwlwaW9bMF0gPSAgQkZfR1BNSV9DVFJMMF9DT01NQU5EX01PREUoY29tbWFuZF9tb2RlKQorCQl8IEJNX0dQTUlfQ1RSTDBfV09SRF9MRU5HVEgKKwkJfCBCRl9HUE1JX0NUUkwwX0NTKGNoaXAsIHRoaXMpCisJCXwgQkZfR1BNSV9DVFJMMF9MT0NLX0NTKExPQ0tfQ1NfRU5BQkxFLCB0aGlzKQorCQl8IEJGX0dQTUlfQ1RSTDBfQUREUkVTUyhhZGRyZXNzKQorCQl8IEJGX0dQTUlfQ1RSTDBfWEZFUl9DT1VOVCgwKTsKKwlwaW9bMV0gPSAwOworCWRlc2MgPSBjaGFubmVsLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKGNoYW5uZWwsCisJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKXBpbywgMiwgRE1BX05PTkUsIDApOworCWlmICghZGVzYykgeworCQlwcl9lcnIoInN0ZXAgMSBlcnJvclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBbMl0gRW5hYmxlIHRoZSBCQ0ggYmxvY2sgYW5kIHJlYWQuICovCisJY29tbWFuZF9tb2RlID0gQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1JFQUQ7CisJYWRkcmVzcyAgICAgID0gQlZfR1BNSV9DVFJMMF9BRERSRVNTX19OQU5EX0RBVEE7CisJZWNjX2NvbW1hbmQgID0gQlZfR1BNSV9FQ0NDVFJMX0VDQ19DTURfX0JDSF9ERUNPREU7CisJYnVmZmVyX21hc2sgID0gQlZfR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLX19CQ0hfUEFHRQorCQkJfCBCVl9HUE1JX0VDQ0NUUkxfQlVGRkVSX01BU0tfX0JDSF9BVVhPTkxZOworCisJcGlvWzBdID0gIEJGX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFKGNvbW1hbmRfbW9kZSkKKwkJfCBCTV9HUE1JX0NUUkwwX1dPUkRfTEVOR1RICisJCXwgQkZfR1BNSV9DVFJMMF9DUyhjaGlwLCB0aGlzKQorCQl8IEJGX0dQTUlfQ1RSTDBfTE9DS19DUyhMT0NLX0NTX0VOQUJMRSwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0FERFJFU1MoYWRkcmVzcykKKwkJfCBCRl9HUE1JX0NUUkwwX1hGRVJfQ09VTlQoZ2VvLT5wYWdlX3NpemUpOworCisJcGlvWzFdID0gMDsKKwlwaW9bMl0gPSAgQk1fR1BNSV9FQ0NDVFJMX0VOQUJMRV9FQ0MKKwkJfCBCRl9HUE1JX0VDQ0NUUkxfRUNDX0NNRChlY2NfY29tbWFuZCkKKwkJfCBCRl9HUE1JX0VDQ0NUUkxfQlVGRkVSX01BU0soYnVmZmVyX21hc2spOworCXBpb1szXSA9IGdlby0+cGFnZV9zaXplOworCXBpb1s0XSA9IHBheWxvYWQ7CisJcGlvWzVdID0gYXV4aWxpYXJ5OworCWRlc2MgPSBjaGFubmVsLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKGNoYW5uZWwsCisJCQkJCShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilwaW8sCisJCQkJCUFSUkFZX1NJWkUocGlvKSwgRE1BX05PTkUsIDEpOworCWlmICghZGVzYykgeworCQlwcl9lcnIoInN0ZXAgMiBlcnJvclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBbM10gRGlzYWJsZSB0aGUgQkNIIGJsb2NrICovCisJY29tbWFuZF9tb2RlID0gQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1dBSVRfRk9SX1JFQURZOworCWFkZHJlc3MgICAgICA9IEJWX0dQTUlfQ1RSTDBfQUREUkVTU19fTkFORF9EQVRBOworCisJcGlvWzBdID0gQkZfR1BNSV9DVFJMMF9DT01NQU5EX01PREUoY29tbWFuZF9tb2RlKQorCQl8IEJNX0dQTUlfQ1RSTDBfV09SRF9MRU5HVEgKKwkJfCBCRl9HUE1JX0NUUkwwX0NTKGNoaXAsIHRoaXMpCisJCXwgQkZfR1BNSV9DVFJMMF9MT0NLX0NTKExPQ0tfQ1NfRU5BQkxFLCB0aGlzKQorCQl8IEJGX0dQTUlfQ1RSTDBfQUREUkVTUyhhZGRyZXNzKQorCQl8IEJGX0dQTUlfQ1RSTDBfWEZFUl9DT1VOVChnZW8tPnBhZ2Vfc2l6ZSk7CisJcGlvWzFdID0gMDsKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLAorCQkJCShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilwaW8sIDIsIERNQV9OT05FLCAxKTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJzdGVwIDMgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogWzRdIHN1Ym1pdCB0aGUgRE1BICovCisJc2V0X2RtYV90eXBlKHRoaXMsIERNQV9GT1JfUkVBRF9FQ0NfUEFHRSk7CisJcmV0dXJuIHN0YXJ0X2RtYV93aXRoX2JjaF9pcnEodGhpcywgZGVzYyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLW5hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktbmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MWI2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLW5hbmQuYwpAQCAtMCwwICsxLDE2MTkgQEAKKy8qCisgKiBGcmVlc2NhbGUgR1BNSSBOQU5EIEZsYXNoIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRW1iZWRkZWQgQWxsZXkgU29sdXRpb25zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvZ3BtaS1uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKworI2luY2x1ZGUgImdwbWktbmFuZC5oIgorCisvKiBhZGQgb3VyIG93bmVyIGJidCBkZXNjcmlwdG9yICovCitzdGF0aWMgdWludDhfdCBzY2FuX2ZmX3BhdHRlcm5bXSA9IHsgMHhmZiB9Oworc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBncG1pX2JidF9kZXNjciA9IHsKKwkub3B0aW9ucwk9IDAsCisJLm9mZnMJCT0gMCwKKwkubGVuCQk9IDEsCisJLnBhdHRlcm4JPSBzY2FuX2ZmX3BhdHRlcm4KK307CisKKy8qICBXZSB3aWxsIHVzZSBhbGwgdGhlIChwYWdlICsgT09CKS4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgZ3BtaV9od19lY2NsYXlvdXQgPSB7CisJLmVjY2J5dGVzID0gMCwKKwkuZWNjcG9zID0geyAwLCB9LAorCS5vb2JmcmVlID0geyB7Lm9mZnNldCA9IDAsIC5sZW5ndGggPSAwfSB9Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgYmNoX2lycShpbnQgaXJxLCB2b2lkICpjb29raWUpCit7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY29va2llOworCisJZ3BtaV9jbGVhcl9iY2godGhpcyk7CisJY29tcGxldGUoJnRoaXMtPmJjaF9kb25lKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiAgQ2FsY3VsYXRlIHRoZSBFQ0Mgc3RyZW5ndGggYnkgaGFuZDoKKyAqCUUgOiBUaGUgRUNDIHN0cmVuZ3RoLgorICoJRyA6IHRoZSBsZW5ndGggb2YgR2Fsb2lzIEZpZWxkLgorICoJTiA6IFRoZSBjaHVuayBjb3VudCBvZiBwZXIgcGFnZS4KKyAqCU8gOiB0aGUgb29ic2l6ZSBvZiB0aGUgTkFORCBjaGlwLgorICoJTSA6IHRoZSBtZXRhc2l6ZSBvZiBwZXIgcGFnZS4KKyAqCisgKglUaGUgZm9ybXVsYSBpcyA6CisgKgkJRSAqIEcgKiBOCisgKgkgICAgICAtLS0tLS0tLS0tLS0gPD0gKE8gLSBNKQorICogICAgICAgICAgICAgICAgICA4CisgKgorICogICAgICBTbywgd2UgZ2V0IEUgYnk6CisgKiAgICAgICAgICAgICAgICAgICAgKE8gLSBNKSAqIDgKKyAqICAgICAgICAgICAgICBFIDw9IC0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICBHICogTgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfZWNjX3N0cmVuZ3RoKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpnZW8gPSAmdGhpcy0+YmNoX2dlb21ldHJ5OworCXN0cnVjdCBtdGRfaW5mbwkqbXRkID0gJnRoaXMtPm10ZDsKKwlpbnQgZWNjX3N0cmVuZ3RoOworCisJZWNjX3N0cmVuZ3RoID0gKChtdGQtPm9vYnNpemUgLSBnZW8tPm1ldGFkYXRhX3NpemUpICogOCkKKwkJCS8gKGdlby0+Z2ZfbGVuICogZ2VvLT5lY2NfY2h1bmtfY291bnQpOworCisJLyogV2UgbmVlZCB0aGUgbWlub3IgZXZlbiBudW1iZXIuICovCisJcmV0dXJuIHJvdW5kX2Rvd24oZWNjX3N0cmVuZ3RoLCAyKTsKK30KKworaW50IGNvbW1vbl9uZmNfc2V0X2dlb21ldHJ5KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpnZW8gPSAmdGhpcy0+YmNoX2dlb21ldHJ5OworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gJnRoaXMtPm10ZDsKKwl1bnNpZ25lZCBpbnQgbWV0YWRhdGFfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzX3NpemU7CisJdW5zaWduZWQgaW50IGJsb2NrX21hcmtfYml0X29mZnNldDsKKworCS8qCisJICogVGhlIHNpemUgb2YgdGhlIG1ldGFkYXRhIGNhbiBiZSBjaGFuZ2VkLCB0aG91Z2ggd2Ugc2V0IGl0IHRvIDEwCisJICogYnl0ZXMgbm93LiBCdXQgaXQgY2FuJ3QgYmUgdG9vIGxhcmdlLCBiZWNhdXNlIHdlIGhhdmUgdG8gc2F2ZQorCSAqIGVub3VnaCBzcGFjZSBmb3IgQkNILgorCSAqLworCWdlby0+bWV0YWRhdGFfc2l6ZSA9IDEwOworCisJLyogVGhlIGRlZmF1bHQgZm9yIHRoZSBsZW5ndGggb2YgR2Fsb2lzIEZpZWxkLiAqLworCWdlby0+Z2ZfbGVuID0gMTM7CisKKwkvKiBUaGUgZGVmYXVsdCBmb3IgY2h1bmsgc2l6ZS4gVGhlcmUgaXMgbm8gb29ic2l6ZSBncmVhdGVyIHRoZW4gNTEyLiAqLworCWdlby0+ZWNjX2NodW5rX3NpemUgPSA1MTI7CisJd2hpbGUgKGdlby0+ZWNjX2NodW5rX3NpemUgPCBtdGQtPm9vYnNpemUpCisJCWdlby0+ZWNjX2NodW5rX3NpemUgKj0gMjsgLyoga2VlcCBDID49IE8gKi8KKworCWdlby0+ZWNjX2NodW5rX2NvdW50ID0gbXRkLT53cml0ZXNpemUgLyBnZW8tPmVjY19jaHVua19zaXplOworCisJLyogV2UgdXNlIHRoZSBzYW1lIEVDQyBzdHJlbmd0aCBmb3IgYWxsIGNodW5rcy4gKi8KKwlnZW8tPmVjY19zdHJlbmd0aCA9IGdldF9lY2Nfc3RyZW5ndGgodGhpcyk7CisJaWYgKCFnZW8tPmVjY19zdHJlbmd0aCkgeworCQlwcl9lcnIoIldlIGdldCBhIHdyb25nIEVDQyBzdHJlbmd0aC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlnZW8tPnBhZ2Vfc2l6ZSA9IG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplOworCWdlby0+cGF5bG9hZF9zaXplID0gbXRkLT53cml0ZXNpemU7CisKKwkvKgorCSAqIFRoZSBhdXhpbGlhcnkgYnVmZmVyIGNvbnRhaW5zIHRoZSBtZXRhZGF0YSBhbmQgdGhlIEVDQyBzdGF0dXMuIFRoZQorCSAqIG1ldGFkYXRhIGlzIHBhZGRlZCB0byB0aGUgbmVhcmVzdCAzMi1iaXQgYm91bmRhcnkuIFRoZSBFQ0Mgc3RhdHVzCisJICogY29udGFpbnMgb25lIGJ5dGUgZm9yIGV2ZXJ5IEVDQyBjaHVuaywgYW5kIGlzIGFsc28gcGFkZGVkIHRvIHRoZQorCSAqIG5lYXJlc3QgMzItYml0IGJvdW5kYXJ5LgorCSAqLworCW1ldGFkYXRhX3NpemUgPSBBTElHTihnZW8tPm1ldGFkYXRhX3NpemUsIDQpOworCXN0YXR1c19zaXplICAgPSBBTElHTihnZW8tPmVjY19jaHVua19jb3VudCwgNCk7CisKKwlnZW8tPmF1eGlsaWFyeV9zaXplID0gbWV0YWRhdGFfc2l6ZSArIHN0YXR1c19zaXplOworCWdlby0+YXV4aWxpYXJ5X3N0YXR1c19vZmZzZXQgPSBtZXRhZGF0YV9zaXplOworCisJaWYgKCF0aGlzLT5zd2FwX2Jsb2NrX21hcmspCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGJ5dGUgYW5kIGJpdCBvZmZzZXRzIG9mCisJICogdGhlIHBoeXNpY2FsIGJsb2NrIG1hcmsgd2l0aGluIHRoZSBFQ0MtYmFzZWQgdmlldyBvZiB0aGUgcGFnZS4KKwkgKgorCSAqIE5BTkQgY2hpcCB3aXRoIDJLIHBhZ2Ugc2hvd3MgYmVsb3c6CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQmxvY2sgTWFyaykKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBEICAgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfDwtLS0tPnwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgICAgICBWCisJICogICAgKy0tLSstLS0tLS0tLS0tKy0rLS0tLS0tLS0tLSstKy0tLS0tLS0tLS0rLSstLS0tLS0tLS0tKy0rCisJICogICAgfCBNIHwgICBkYXRhICAgfEV8ICAgZGF0YSAgIHxFfCAgIGRhdGEgICB8RXwgICBkYXRhICAgfEV8CisJICogICAgKy0tLSstLS0tLS0tLS0tKy0rLS0tLS0tLS0tLSstKy0tLS0tLS0tLS0rLSstLS0tLS0tLS0tKy0rCisJICoKKwkgKiBUaGUgcG9zaXRpb24gb2YgYmxvY2sgbWFyayBtb3ZlcyBmb3J3YXJkIGluIHRoZSBFQ0MtYmFzZWQgdmlldworCSAqIG9mIHBhZ2UsIGFuZCB0aGUgZGVsdGEgaXM6CisJICoKKwkgKiAgICAgICAgICAgICAgICAgICBFICogRyAqIChOIC0gMSkKKwkgKiAgICAgICAgICAgICBEID0gKC0tLS0tLS0tLS0tLS0tLS0gKyBNKQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICA4CisJICoKKwkgKiBXaXRoIHRoZSBmb3JtdWxhIHRvIGNvbXB1dGUgdGhlIEVDQyBzdHJlbmd0aCwgYW5kIHRoZSBjb25kaXRpb24KKwkgKiAgICAgICA6IEMgPj0gTyAgICAgICAgIChDIGlzIHRoZSBlY2MgY2h1bmsgc2l6ZSkKKwkgKgorCSAqIEl0J3MgZWFzeSB0byBkZWR1Y2UgdG8gdGhlIGZvbGxvd2luZyByZXN1bHQ6CisJICoKKwkgKiAgICAgICAgIEUgKiBHICAgICAgIChPIC0gTSkgICAgICBDIC0gTSAgICAgICAgIEMgLSBNCisJICogICAgICAtLS0tLS0tLS0tLSA8PSAtLS0tLS0tIDw9ICAtLS0tLS0tLSAgPCAgLS0tLS0tLS0tCisJICogICAgICAgICAgIDggICAgICAgICAgICBOICAgICAgICAgICBOICAgICAgICAgIChOIC0gMSkKKwkgKgorCSAqICBTbywgd2UgZ2V0OgorCSAqCisJICogICAgICAgICAgICAgICAgICAgRSAqIEcgKiAoTiAtIDEpCisJICogICAgICAgICAgICAgRCA9ICgtLS0tLS0tLS0tLS0tLS0tICsgTSkgPCBDCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIDgKKwkgKgorCSAqICBUaGUgYWJvdmUgaW5lcXVhbGl0eSBtZWFucyB0aGUgcG9zaXRpb24gb2YgYmxvY2sgbWFyaworCSAqICB3aXRoaW4gdGhlIEVDQy1iYXNlZCB2aWV3IG9mIHRoZSBwYWdlIGlzIHN0aWxsIGluIHRoZSBkYXRhIGNodW5rLAorCSAqICBhbmQgaXQncyBOT1QgaW4gdGhlIEVDQyBiaXRzIG9mIHRoZSBjaHVuay4KKwkgKgorCSAqICBVc2UgdGhlIGZvbGxvd2luZyB0byBjb21wdXRlIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhlCisJICogIHBoeXNpY2FsIGJsb2NrIG1hcmsgd2l0aGluIHRoZSBFQ0MtYmFzZWQgdmlldyBvZiB0aGUgcGFnZToKKwkgKiAgICAgICAgICAocGFnZV9zaXplIC0gRCkgKiA4CisJICoKKwkgKiAgLS1IdWFuZyBTaGlqaWUKKwkgKi8KKwlibG9ja19tYXJrX2JpdF9vZmZzZXQgPSBtdGQtPndyaXRlc2l6ZSAqIDggLQorCQkoZ2VvLT5lY2Nfc3RyZW5ndGggKiBnZW8tPmdmX2xlbiAqIChnZW8tPmVjY19jaHVua19jb3VudCAtIDEpCisJCQkJKyBnZW8tPm1ldGFkYXRhX3NpemUgKiA4KTsKKworCWdlby0+YmxvY2tfbWFya19ieXRlX29mZnNldCA9IGJsb2NrX21hcmtfYml0X29mZnNldCAvIDg7CisJZ2VvLT5ibG9ja19tYXJrX2JpdF9vZmZzZXQgID0gYmxvY2tfbWFya19iaXRfb2Zmc2V0ICUgODsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRtYV9jaGFuICpnZXRfZG1hX2NoYW4oc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCWludCBjaGlwbnIgPSB0aGlzLT5jdXJyZW50X2NoaXA7CisKKwlyZXR1cm4gdGhpcy0+ZG1hX2NoYW5zW2NoaXBucl07Cit9CisKKy8qIENhbiB3ZSB1c2UgdGhlIHVwcGVyJ3MgYnVmZmVyIGRpcmVjdGx5IGZvciBETUE/ICovCit2b2lkIHByZXBhcmVfZGF0YV9kbWEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkcikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCA9ICZ0aGlzLT5kYXRhX3NnbDsKKwlpbnQgcmV0OworCisJdGhpcy0+ZGlyZWN0X2RtYV9tYXBfb2sgPSB0cnVlOworCisJLyogZmlyc3QgdHJ5IHRvIG1hcCB0aGUgdXBwZXIgYnVmZmVyIGRpcmVjdGx5ICovCisJc2dfaW5pdF9vbmUoc2dsLCB0aGlzLT51cHBlcl9idWYsIHRoaXMtPnVwcGVyX2xlbik7CisJcmV0ID0gZG1hX21hcF9zZyh0aGlzLT5kZXYsIHNnbCwgMSwgZHIpOworCWlmIChyZXQgPT0gMCkgeworCQkvKiBXZSBoYXZlIHRvIHVzZSBvdXIgb3duIERNQSBidWZmZXIuICovCisJCXNnX2luaXRfb25lKHNnbCwgdGhpcy0+ZGF0YV9idWZmZXJfZG1hLCBQQUdFX1NJWkUpOworCisJCWlmIChkciA9PSBETUFfVE9fREVWSUNFKQorCQkJbWVtY3B5KHRoaXMtPmRhdGFfYnVmZmVyX2RtYSwgdGhpcy0+dXBwZXJfYnVmLAorCQkJCXRoaXMtPnVwcGVyX2xlbik7CisKKwkJcmV0ID0gZG1hX21hcF9zZyh0aGlzLT5kZXYsIHNnbCwgMSwgZHIpOworCQlpZiAocmV0ID09IDApCisJCQlwcl9lcnIoIm1hcCBmYWlsZWQuXG4iKTsKKworCQl0aGlzLT5kaXJlY3RfZG1hX21hcF9vayA9IGZhbHNlOworCX0KK30KKworLyogVGhpcyB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgRE1BIG9wZXJhdGlvbiBpcyBmaW5pc2hlZC4gKi8KK3N0YXRpYyB2b2lkIGRtYV9pcnFfY2FsbGJhY2sodm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gcGFyYW07CisJc3RydWN0IGNvbXBsZXRpb24gKmRtYV9jID0gJnRoaXMtPmRtYV9kb25lOworCisJY29tcGxldGUoZG1hX2MpOworCisJc3dpdGNoICh0aGlzLT5kbWFfdHlwZSkgeworCWNhc2UgRE1BX0ZPUl9DT01NQU5EOgorCQlkbWFfdW5tYXBfc2codGhpcy0+ZGV2LCAmdGhpcy0+Y21kX3NnbCwgMSwgRE1BX1RPX0RFVklDRSk7CisJCWJyZWFrOworCisJY2FzZSBETUFfRk9SX1JFQURfREFUQToKKwkJZG1hX3VubWFwX3NnKHRoaXMtPmRldiwgJnRoaXMtPmRhdGFfc2dsLCAxLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAodGhpcy0+ZGlyZWN0X2RtYV9tYXBfb2sgPT0gZmFsc2UpCisJCQltZW1jcHkodGhpcy0+dXBwZXJfYnVmLCB0aGlzLT5kYXRhX2J1ZmZlcl9kbWEsCisJCQkJdGhpcy0+dXBwZXJfbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIERNQV9GT1JfV1JJVEVfREFUQToKKwkJZG1hX3VubWFwX3NnKHRoaXMtPmRldiwgJnRoaXMtPmRhdGFfc2dsLCAxLCBETUFfVE9fREVWSUNFKTsKKwkJYnJlYWs7CisKKwljYXNlIERNQV9GT1JfUkVBRF9FQ0NfUEFHRToKKwljYXNlIERNQV9GT1JfV1JJVEVfRUNDX1BBR0U6CisJCS8qIFdlIGhhdmUgdG8gd2FpdCB0aGUgQkNIIGludGVycnVwdCB0byBmaW5pc2guICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfZXJyKCJpbiB3cm9uZyBETUEgb3BlcmF0aW9uLlxuIik7CisJfQorfQorCitpbnQgc3RhcnRfZG1hX3dpdGhvdXRfYmNoX2lycShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBjb21wbGV0aW9uICpkbWFfYyA9ICZ0aGlzLT5kbWFfZG9uZTsKKwlpbnQgZXJyOworCisJaW5pdF9jb21wbGV0aW9uKGRtYV9jKTsKKworCWRlc2MtPmNhbGxiYWNrCQk9IGRtYV9pcnFfY2FsbGJhY2s7CisJZGVzYy0+Y2FsbGJhY2tfcGFyYW0JPSB0aGlzOworCWRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7CisKKwkvKiBXYWl0IGZvciB0aGUgaW50ZXJydXB0IGZyb20gdGhlIERNQSBibG9jay4gKi8KKwllcnIgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoZG1hX2MsIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCWlmICghZXJyKSB7CisJCXByX2VycigiRE1BIHRpbWVvdXQsIGxhc3QgRE1BIDolZFxuIiwgdGhpcy0+bGFzdF9kbWFfdHlwZSk7CisJCWdwbWlfZHVtcF9pbmZvKHRoaXMpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gQkNIIHJlYWRpbmcgb3IgQkNIIHdyaXRpbmcgcGFnZXMuCisgKiBJdCB3aWxsIHdhaXQgZm9yIHRoZSBCQ0ggaW50ZXJydXB0IGFzIGxvbmcgYXMgT05FIHNlY29uZC4KKyAqIEFjdHVhbGx5LCB3ZSBtdXN0IHdhaXQgZm9yIHR3byBpbnRlcnJ1cHRzIDoKKyAqCVsxXSBmaXJzdGx5IHRoZSBETUEgaW50ZXJydXB0IGFuZAorICoJWzJdIHNlY29uZGx5IHRoZSBCQ0ggaW50ZXJydXB0LgorICovCitpbnQgc3RhcnRfZG1hX3dpdGhfYmNoX2lycShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJc3RydWN0IGNvbXBsZXRpb24gKmJjaF9jID0gJnRoaXMtPmJjaF9kb25lOworCWludCBlcnI7CisKKwkvKiBQcmVwYXJlIHRvIHJlY2VpdmUgYW4gaW50ZXJydXB0IGZyb20gdGhlIEJDSCBibG9jay4gKi8KKwlpbml0X2NvbXBsZXRpb24oYmNoX2MpOworCisJLyogc3RhcnQgdGhlIERNQSAqLworCXN0YXJ0X2RtYV93aXRob3V0X2JjaF9pcnEodGhpcywgZGVzYyk7CisKKwkvKiBXYWl0IGZvciB0aGUgaW50ZXJydXB0IGZyb20gdGhlIEJDSCBibG9jay4gKi8KKwllcnIgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoYmNoX2MsIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCWlmICghZXJyKSB7CisJCXByX2VycigiQkNIIHRpbWVvdXQsIGxhc3QgRE1BIDolZFxuIiwgdGhpcy0+bGFzdF9kbWFfdHlwZSk7CisJCWdwbWlfZHVtcF9pbmZvKHRoaXMpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CithY3F1aXJlX3JlZ2lzdGVyX2Jsb2NrKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywgY29uc3QgY2hhciAqcmVzX25hbWUpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRoaXMtPnBkZXY7CisJc3RydWN0IHJlc291cmNlcyAqcmVzID0gJnRoaXMtPnJlc291cmNlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJdm9pZCAqcDsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCByZXNfbmFtZSk7CisJaWYgKCFyKSB7CisJCXByX2VycigiQ2FuJ3QgZ2V0IHJlc291cmNlIGZvciAlc1xuIiwgcmVzX25hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXAgPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlpZiAoIXApIHsKKwkJcHJfZXJyKCJDYW4ndCByZW1hcCAlc1xuIiwgcmVzX25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoIXN0cmNtcChyZXNfbmFtZSwgR1BNSV9OQU5EX0dQTUlfUkVHU19BRERSX1JFU19OQU1FKSkKKwkJcmVzLT5ncG1pX3JlZ3MgPSBwOworCWVsc2UgaWYgKCFzdHJjbXAocmVzX25hbWUsIEdQTUlfTkFORF9CQ0hfUkVHU19BRERSX1JFU19OQU1FKSkKKwkJcmVzLT5iY2hfcmVncyA9IHA7CisJZWxzZQorCQlwcl9lcnIoInVua25vd24gcmVzb3VyY2UgbmFtZSA6ICVzXG4iLCByZXNfbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9yZWdpc3Rlcl9ibG9jayhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IHJlc291cmNlcyAqcmVzID0gJnRoaXMtPnJlc291cmNlczsKKwlpZiAocmVzLT5ncG1pX3JlZ3MpCisJCWlvdW5tYXAocmVzLT5ncG1pX3JlZ3MpOworCWlmIChyZXMtPmJjaF9yZWdzKQorCQlpb3VubWFwKHJlcy0+YmNoX3JlZ3MpOworCXJlcy0+Z3BtaV9yZWdzID0gTlVMTDsKKwlyZXMtPmJjaF9yZWdzID0gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK2FjcXVpcmVfYmNoX2lycShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsIGlycV9oYW5kbGVyX3QgaXJxX2gpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRoaXMtPnBkZXY7CisJc3RydWN0IHJlc291cmNlcyAqcmVzID0gJnRoaXMtPnJlc291cmNlczsKKwljb25zdCBjaGFyICpyZXNfbmFtZSA9IEdQTUlfTkFORF9CQ0hfSU5URVJSVVBUX1JFU19OQU1FOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlpbnQgZXJyOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9JUlEsIHJlc19uYW1lKTsKKwlpZiAoIXIpIHsKKwkJcHJfZXJyKCJDYW4ndCBnZXQgcmVzb3VyY2UgZm9yICVzXG4iLCByZXNfbmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZXJyID0gcmVxdWVzdF9pcnEoci0+c3RhcnQsIGlycV9oLCAwLCByZXNfbmFtZSwgdGhpcyk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIkNhbid0IG93biAlc1xuIiwgcmVzX25hbWUpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJlcy0+YmNoX2xvd19pbnRlcnJ1cHQgPSByLT5zdGFydDsKKwlyZXMtPmJjaF9oaWdoX2ludGVycnVwdCA9IHItPmVuZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9iY2hfaXJxKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2VzICpyZXMgPSAmdGhpcy0+cmVzb3VyY2VzOworCWludCBpID0gcmVzLT5iY2hfbG93X2ludGVycnVwdDsKKworCWZvciAoOyBpIDw9IHJlcy0+YmNoX2hpZ2hfaW50ZXJydXB0OyBpKyspCisJCWZyZWVfaXJxKGksIHRoaXMpOworfQorCitzdGF0aWMgYm9vbCBncG1pX2RtYV9maWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMgPSBwYXJhbTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSB0aGlzLT5wcml2YXRlOworCisJaWYgKCFteHNfZG1hX2lzX2FwYmgoY2hhbikpCisJCXJldHVybiBmYWxzZTsKKwkvKgorCSAqIG9ubHkgY2F0Y2ggdGhlIEdQTUkgZG1hIGNoYW5uZWxzIDoKKwkgKglmb3IgbXgyMyA6CU1YMjNfRE1BX0dQTUkwIH4gTVgyM19ETUFfR1BNSTMKKwkgKgkJKFRoZXNlIGZvdXIgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgSVJRISkKKwkgKgorCSAqCWZvciBteDI4IDoJTVgyOF9ETUFfR1BNSTAgfiBNWDI4X0RNQV9HUE1JNworCSAqCQkoVGhlc2UgZWlnaHQgY2hhbm5lbHMgc2hhcmUgdGhlIHNhbWUgSVJRISkKKwkgKi8KKwlpZiAoci0+c3RhcnQgPD0gY2hhbi0+Y2hhbl9pZCAmJiBjaGFuLT5jaGFuX2lkIDw9IHItPmVuZCkgeworCQljaGFuLT5wcml2YXRlID0gJnRoaXMtPmRtYV9kYXRhOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2RtYV9jaGFubmVscyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IERNQV9DSEFOUzsgaSsrKQorCQlpZiAodGhpcy0+ZG1hX2NoYW5zW2ldKSB7CisJCQlkbWFfcmVsZWFzZV9jaGFubmVsKHRoaXMtPmRtYV9jaGFuc1tpXSk7CisJCQl0aGlzLT5kbWFfY2hhbnNbaV0gPSBOVUxMOworCQl9Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFjcXVpcmVfZG1hX2NoYW5uZWxzKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdGhpcy0+cGRldjsKKwlzdHJ1Y3QgZ3BtaV9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdGhpcy0+cGRhdGE7CisJc3RydWN0IHJlc291cmNlcyAqcmVzID0gJnRoaXMtPnJlc291cmNlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIsICpyX2RtYTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfRE1BLAorCQkJCQlHUE1JX05BTkRfRE1BX0NIQU5ORUxTX1JFU19OQU1FKTsKKwlyX2RtYSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9JUlEsCisJCQkJCUdQTUlfTkFORF9ETUFfSU5URVJSVVBUX1JFU19OQU1FKTsKKwlpZiAoIXIgfHwgIXJfZG1hKSB7CisJCXByX2VycigiQ2FuJ3QgZ2V0IHJlc291cmNlIGZvciBETUFcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIHVzZWQgaW4gZ3BtaV9kbWFfZmlsdGVyKCkgKi8KKwl0aGlzLT5wcml2YXRlID0gcjsKKworCWZvciAoaSA9IHItPnN0YXJ0OyBpIDw9IHItPmVuZDsgaSsrKSB7CisJCXN0cnVjdCBkbWFfY2hhbiAqZG1hX2NoYW47CisJCWRtYV9jYXBfbWFza190IG1hc2s7CisKKwkJaWYgKGkgLSByLT5zdGFydCA+PSBwZGF0YS0+bWF4X2NoaXBfY291bnQpCisJCQlicmVhazsKKworCQlkbWFfY2FwX3plcm8obWFzayk7CisJCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7CisKKwkJLyogZ2V0IHRoZSBETUEgaW50ZXJydXB0ICovCisJCWlmIChyX2RtYS0+c3RhcnQgPT0gcl9kbWEtPmVuZCkgeworCQkJLyogb25seSByZWdpc3RlciB0aGUgZmlyc3QuICovCisJCQlpZiAoaSA9PSByLT5zdGFydCkKKwkJCQl0aGlzLT5kbWFfZGF0YS5jaGFuX2lycSA9IHJfZG1hLT5zdGFydDsKKwkJCWVsc2UKKwkJCQl0aGlzLT5kbWFfZGF0YS5jaGFuX2lycSA9IE5PX0lSUTsKKwkJfSBlbHNlCisJCQl0aGlzLT5kbWFfZGF0YS5jaGFuX2lycSA9IHJfZG1hLT5zdGFydCArIChpIC0gci0+c3RhcnQpOworCisJCWRtYV9jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBncG1pX2RtYV9maWx0ZXIsIHRoaXMpOworCQlpZiAoIWRtYV9jaGFuKQorCQkJZ290byBhY3F1aXJlX2VycjsKKworCQkvKiBmaWxsIHRoZSBmaXJzdCBlbXB0eSBpdGVtICovCisJCXRoaXMtPmRtYV9jaGFuc1tpIC0gci0+c3RhcnRdID0gZG1hX2NoYW47CisJfQorCisJcmVzLT5kbWFfbG93X2NoYW5uZWwgPSByLT5zdGFydDsKKwlyZXMtPmRtYV9oaWdoX2NoYW5uZWwgPSBpOworCXJldHVybiAwOworCithY3F1aXJlX2VycjoKKwlwcl9lcnIoIkNhbid0IGFjcXVpcmUgRE1BIGNoYW5uZWwgJXVcbiIsIGkpOworCXJlbGVhc2VfZG1hX2NoYW5uZWxzKHRoaXMpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhY3F1aXJlX3Jlc291cmNlcyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IHJlc291cmNlcyAqcmVzID0gJnRoaXMtPnJlc291cmNlczsKKwlpbnQgcmV0OworCisJcmV0ID0gYWNxdWlyZV9yZWdpc3Rlcl9ibG9jayh0aGlzLCBHUE1JX05BTkRfR1BNSV9SRUdTX0FERFJfUkVTX05BTUUpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9yZWdzOworCisJcmV0ID0gYWNxdWlyZV9yZWdpc3Rlcl9ibG9jayh0aGlzLCBHUE1JX05BTkRfQkNIX1JFR1NfQUREUl9SRVNfTkFNRSk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X3JlZ3M7CisKKwlyZXQgPSBhY3F1aXJlX2JjaF9pcnEodGhpcywgYmNoX2lycSk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X3JlZ3M7CisKKwlyZXQgPSBhY3F1aXJlX2RtYV9jaGFubmVscyh0aGlzKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfZG1hX2NoYW5uZWxzOworCisJcmVzLT5jbG9jayA9IGNsa19nZXQoJnRoaXMtPnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihyZXMtPmNsb2NrKSkgeworCQlwcl9lcnIoImNhbiBub3QgZ2V0IHRoZSBjbG9ja1xuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXhpdF9jbG9jazsKKwl9CisJcmV0dXJuIDA7CisKK2V4aXRfY2xvY2s6CisJcmVsZWFzZV9kbWFfY2hhbm5lbHModGhpcyk7CitleGl0X2RtYV9jaGFubmVsczoKKwlyZWxlYXNlX2JjaF9pcnEodGhpcyk7CitleGl0X3JlZ3M6CisJcmVsZWFzZV9yZWdpc3Rlcl9ibG9jayh0aGlzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IHJlc291cmNlcyAqciA9ICZ0aGlzLT5yZXNvdXJjZXM7CisKKwljbGtfcHV0KHItPmNsb2NrKTsKKwlyZWxlYXNlX3JlZ2lzdGVyX2Jsb2NrKHRoaXMpOworCXJlbGVhc2VfYmNoX2lycSh0aGlzKTsKKwlyZWxlYXNlX2RtYV9jaGFubmVscyh0aGlzKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9oYXJkd2FyZShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJaW50IHJldDsKKworCS8qCisJICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlICJzYWZlIiBHUE1JIHRpbWluZyB0aGF0IHNob3VsZCBzdWNjZWVkCisJICogd2l0aCBhbnkgTkFORCBGbGFzaCBkZXZpY2UKKwkgKiAoYWx0aG91Z2gsIHdpdGggbGVzcy10aGFuLW9wdGltYWwgcGVyZm9ybWFuY2UpLgorCSAqLworCXN0cnVjdCBuYW5kX3RpbWluZyAgc2FmZV90aW1pbmcgPSB7CisJCS5kYXRhX3NldHVwX2luX25zICAgICAgICA9IDgwLAorCQkuZGF0YV9ob2xkX2luX25zICAgICAgICAgPSA2MCwKKwkJLmFkZHJlc3Nfc2V0dXBfaW5fbnMgICAgID0gMjUsCisJCS5ncG1pX3NhbXBsZV9kZWxheV9pbl9ucyA9ICA2LAorCQkudFJFQV9pbl9ucyAgICAgICAgICAgICAgPSAtMSwKKwkJLnRSTE9IX2luX25zICAgICAgICAgICAgID0gLTEsCisJCS50UkhPSF9pbl9ucyAgICAgICAgICAgICA9IC0xLAorCX07CisKKwkvKiBJbml0aWFsaXplIHRoZSBoYXJkd2FyZXMuICovCisJcmV0ID0gZ3BtaV9pbml0KHRoaXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0aGlzLT50aW1pbmcgPSBzYWZlX3RpbWluZzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3BhZ2VfcHJlcGFyZShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQl2b2lkICpkZXN0aW5hdGlvbiwgdW5zaWduZWQgbGVuZ3RoLAorCQkJdm9pZCAqYWx0X3ZpcnQsIGRtYV9hZGRyX3QgYWx0X3BoeXMsIHVuc2lnbmVkIGFsdF9zaXplLAorCQkJdm9pZCAqKnVzZV92aXJ0LCBkbWFfYWRkcl90ICp1c2VfcGh5cykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0aGlzLT5kZXY7CisKKwlpZiAodmlydF9hZGRyX3ZhbGlkKGRlc3RpbmF0aW9uKSkgeworCQlkbWFfYWRkcl90IGRlc3RfcGh5czsKKworCQlkZXN0X3BoeXMgPSBkbWFfbWFwX3NpbmdsZShkZXYsIGRlc3RpbmF0aW9uLAorCQkJCQkJbGVuZ3RoLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBkZXN0X3BoeXMpKSB7CisJCQlpZiAoYWx0X3NpemUgPCBsZW5ndGgpIHsKKwkJCQlwcl9lcnIoIkFsdGVybmF0ZSBidWZmZXIgaXMgdG9vIHNtYWxsXG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWdvdG8gbWFwX2ZhaWxlZDsKKwkJfQorCQkqdXNlX3ZpcnQgPSBkZXN0aW5hdGlvbjsKKwkJKnVzZV9waHlzID0gZGVzdF9waHlzOworCQl0aGlzLT5kaXJlY3RfZG1hX21hcF9vayA9IHRydWU7CisJCXJldHVybiAwOworCX0KKworbWFwX2ZhaWxlZDoKKwkqdXNlX3ZpcnQgPSBhbHRfdmlydDsKKwkqdXNlX3BoeXMgPSBhbHRfcGh5czsKKwl0aGlzLT5kaXJlY3RfZG1hX21hcF9vayA9IGZhbHNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9wYWdlX2VuZChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQl2b2lkICpkZXN0aW5hdGlvbiwgdW5zaWduZWQgbGVuZ3RoLAorCQkJdm9pZCAqYWx0X3ZpcnQsIGRtYV9hZGRyX3QgYWx0X3BoeXMsIHVuc2lnbmVkIGFsdF9zaXplLAorCQkJdm9pZCAqdXNlZF92aXJ0LCBkbWFfYWRkcl90IHVzZWRfcGh5cykKK3sKKwlpZiAodGhpcy0+ZGlyZWN0X2RtYV9tYXBfb2spCisJCWRtYV91bm1hcF9zaW5nbGUodGhpcy0+ZGV2LCB1c2VkX3BoeXMsIGxlbmd0aCwgRE1BX0ZST01fREVWSUNFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlYWRfcGFnZV9zd2FwX2VuZChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQl2b2lkICpkZXN0aW5hdGlvbiwgdW5zaWduZWQgbGVuZ3RoLAorCQkJdm9pZCAqYWx0X3ZpcnQsIGRtYV9hZGRyX3QgYWx0X3BoeXMsIHVuc2lnbmVkIGFsdF9zaXplLAorCQkJdm9pZCAqdXNlZF92aXJ0LCBkbWFfYWRkcl90IHVzZWRfcGh5cykKK3sKKwlpZiAoIXRoaXMtPmRpcmVjdF9kbWFfbWFwX29rKQorCQltZW1jcHkoZGVzdGluYXRpb24sIGFsdF92aXJ0LCBsZW5ndGgpOworfQorCitzdGF0aWMgaW50IHNlbmRfcGFnZV9wcmVwYXJlKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywKKwkJCWNvbnN0IHZvaWQgKnNvdXJjZSwgdW5zaWduZWQgbGVuZ3RoLAorCQkJdm9pZCAqYWx0X3ZpcnQsIGRtYV9hZGRyX3QgYWx0X3BoeXMsIHVuc2lnbmVkIGFsdF9zaXplLAorCQkJY29uc3Qgdm9pZCAqKnVzZV92aXJ0LCBkbWFfYWRkcl90ICp1c2VfcGh5cykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0aGlzLT5kZXY7CisKKwlpZiAodmlydF9hZGRyX3ZhbGlkKHNvdXJjZSkpIHsKKwkJZG1hX2FkZHJfdCBzb3VyY2VfcGh5czsKKworCQlzb3VyY2VfcGh5cyA9IGRtYV9tYXBfc2luZ2xlKGRldiwgKHZvaWQgKilzb3VyY2UsIGxlbmd0aCwKKwkJCQkJCURNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBzb3VyY2VfcGh5cykpIHsKKwkJCWlmIChhbHRfc2l6ZSA8IGxlbmd0aCkgeworCQkJCXByX2VycigiQWx0ZXJuYXRlIGJ1ZmZlciBpcyB0b28gc21hbGxcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJZ290byBtYXBfZmFpbGVkOworCQl9CisJCSp1c2VfdmlydCA9IHNvdXJjZTsKKwkJKnVzZV9waHlzID0gc291cmNlX3BoeXM7CisJCXJldHVybiAwOworCX0KK21hcF9mYWlsZWQ6CisJLyoKKwkgKiBDb3B5IHRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGFsdGVybmF0ZQorCSAqIGJ1ZmZlciBhbmQgc2V0IHVwIHRoZSByZXR1cm4gdmFsdWVzIGFjY29yZGluZ2x5LgorCSAqLworCW1lbWNweShhbHRfdmlydCwgc291cmNlLCBsZW5ndGgpOworCisJKnVzZV92aXJ0ID0gYWx0X3ZpcnQ7CisJKnVzZV9waHlzID0gYWx0X3BoeXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfcGFnZV9lbmQoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJY29uc3Qgdm9pZCAqc291cmNlLCB1bnNpZ25lZCBsZW5ndGgsCisJCQl2b2lkICphbHRfdmlydCwgZG1hX2FkZHJfdCBhbHRfcGh5cywgdW5zaWduZWQgYWx0X3NpemUsCisJCQljb25zdCB2b2lkICp1c2VkX3ZpcnQsIGRtYV9hZGRyX3QgdXNlZF9waHlzKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRoaXMtPmRldjsKKwlpZiAodXNlZF92aXJ0ID09IHNvdXJjZSkKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIHVzZWRfcGh5cywgbGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKK30KKworc3RhdGljIHZvaWQgZ3BtaV9mcmVlX2RtYV9idWZmZXIoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRoaXMtPmRldjsKKworCWlmICh0aGlzLT5wYWdlX2J1ZmZlcl92aXJ0ICYmIHZpcnRfYWRkcl92YWxpZCh0aGlzLT5wYWdlX2J1ZmZlcl92aXJ0KSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCB0aGlzLT5wYWdlX2J1ZmZlcl9zaXplLAorCQkJCQl0aGlzLT5wYWdlX2J1ZmZlcl92aXJ0LAorCQkJCQl0aGlzLT5wYWdlX2J1ZmZlcl9waHlzKTsKKwlrZnJlZSh0aGlzLT5jbWRfYnVmZmVyKTsKKwlrZnJlZSh0aGlzLT5kYXRhX2J1ZmZlcl9kbWEpOworCisJdGhpcy0+Y21kX2J1ZmZlcgk9IE5VTEw7CisJdGhpcy0+ZGF0YV9idWZmZXJfZG1hCT0gTlVMTDsKKwl0aGlzLT5wYWdlX2J1ZmZlcl92aXJ0CT0gTlVMTDsKKwl0aGlzLT5wYWdlX2J1ZmZlcl9zaXplCT0gIDA7Cit9CisKKy8qIEFsbG9jYXRlIHRoZSBETUEgYnVmZmVycyAqLworc3RhdGljIGludCBncG1pX2FsbG9jX2RtYV9idWZmZXIoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCBiY2hfZ2VvbWV0cnkgKmdlbyA9ICZ0aGlzLT5iY2hfZ2VvbWV0cnk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdGhpcy0+ZGV2OworCisJLyogWzFdIEFsbG9jYXRlIGEgY29tbWFuZCBidWZmZXIuIFBBR0VfU0laRSBpcyBlbm91Z2guICovCisJdGhpcy0+Y21kX2J1ZmZlciA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfRE1BKTsKKwlpZiAodGhpcy0+Y21kX2J1ZmZlciA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2FsbG9jOworCisJLyogWzJdIEFsbG9jYXRlIGEgcmVhZC93cml0ZSBkYXRhIGJ1ZmZlci4gUEFHRV9TSVpFIGlzIGVub3VnaC4gKi8KKwl0aGlzLT5kYXRhX2J1ZmZlcl9kbWEgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0RNQSk7CisJaWYgKHRoaXMtPmRhdGFfYnVmZmVyX2RtYSA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2FsbG9jOworCisJLyoKKwkgKiBbM10gQWxsb2NhdGUgdGhlIHBhZ2UgYnVmZmVyLgorCSAqCisJICogQm90aCB0aGUgcGF5bG9hZCBidWZmZXIgYW5kIHRoZSBhdXhpbGlhcnkgYnVmZmVyIG11c3QgYXBwZWFyIG9uCisJICogMzItYml0IGJvdW5kYXJpZXMuIFdlIHByZXN1bWUgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQgYnVmZmVyIGlzIGEKKwkgKiBwb3dlciBvZiB0d28gYW5kIGlzIG11Y2ggbGFyZ2VyIHRoYW4gZm91ciwgd2hpY2ggZ3VhcmFudGVlcyB0aGUKKwkgKiBhdXhpbGlhcnkgYnVmZmVyIHdpbGwgYXBwZWFyIG9uIGEgMzItYml0IGJvdW5kYXJ5LgorCSAqLworCXRoaXMtPnBhZ2VfYnVmZmVyX3NpemUgPSBnZW8tPnBheWxvYWRfc2l6ZSArIGdlby0+YXV4aWxpYXJ5X3NpemU7CisJdGhpcy0+cGFnZV9idWZmZXJfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHRoaXMtPnBhZ2VfYnVmZmVyX3NpemUsCisJCQkJCSZ0aGlzLT5wYWdlX2J1ZmZlcl9waHlzLCBHRlBfRE1BKTsKKwlpZiAoIXRoaXMtPnBhZ2VfYnVmZmVyX3ZpcnQpCisJCWdvdG8gZXJyb3JfYWxsb2M7CisKKworCS8qIFNsaWNlIHVwIHRoZSBwYWdlIGJ1ZmZlci4gKi8KKwl0aGlzLT5wYXlsb2FkX3ZpcnQgPSB0aGlzLT5wYWdlX2J1ZmZlcl92aXJ0OworCXRoaXMtPnBheWxvYWRfcGh5cyA9IHRoaXMtPnBhZ2VfYnVmZmVyX3BoeXM7CisJdGhpcy0+YXV4aWxpYXJ5X3ZpcnQgPSB0aGlzLT5wYXlsb2FkX3ZpcnQgKyBnZW8tPnBheWxvYWRfc2l6ZTsKKwl0aGlzLT5hdXhpbGlhcnlfcGh5cyA9IHRoaXMtPnBheWxvYWRfcGh5cyArIGdlby0+cGF5bG9hZF9zaXplOworCXJldHVybiAwOworCitlcnJvcl9hbGxvYzoKKwlncG1pX2ZyZWVfZG1hX2J1ZmZlcih0aGlzKTsKKwlwcl9lcnIoImFsbG9jYXRlIERNQSBidWZmZXIgcmV0ISFcbiIpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBncG1pX2NtZF9jdHJsKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgZGF0YSwgdW5zaWduZWQgaW50IGN0cmwpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMgPSBjaGlwLT5wcml2OworCWludCByZXQ7CisKKwkvKgorCSAqIEV2ZXJ5IG9wZXJhdGlvbiBiZWdpbnMgd2l0aCBhIGNvbW1hbmQgYnl0ZSBhbmQgYSBzZXJpZXMgb2YgemVybyBvcgorCSAqIG1vcmUgYWRkcmVzcyBieXRlcy4gVGhlc2UgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgZWl0aGVyIHRoZSBBZGRyZXNzCisJICogTGF0Y2ggRW5hYmxlIChBTEUpIG9yIENvbW1hbmQgTGF0Y2ggRW5hYmxlIChDTEUpIHNpZ25hbHMgYmVpbmcKKwkgKiBhc3NlcnRlZC4gV2hlbiBNVEQgaXMgcmVhZHkgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCwgaXQgd2lsbCBkZWFzc2VydAorCSAqIGJvdGggbGF0Y2ggZW5hYmxlcy4KKwkgKgorCSAqIFJhdGhlciB0aGFuIHJ1biBhIHNlcGFyYXRlIERNQSBvcGVyYXRpb24gZm9yIGV2ZXJ5IHNpbmdsZSBieXRlLCB3ZQorCSAqIHF1ZXVlIHRoZW0gdXAgYW5kIHJ1biBhIHNpbmdsZSBETUEgb3BlcmF0aW9uIGZvciB0aGUgZW50aXJlIHNlcmllcworCSAqIG9mIGNvbW1hbmQgYW5kIGRhdGEgYnl0ZXMuIE5BTkRfQ01EX05PTkUgbWVhbnMgdGhlIEVORCBvZiB0aGUgcXVldWUuCisJICovCisJaWYgKChjdHJsICYgKE5BTkRfQUxFIHwgTkFORF9DTEUpKSkgeworCQlpZiAoZGF0YSAhPSBOQU5EX0NNRF9OT05FKQorCQkJdGhpcy0+Y21kX2J1ZmZlclt0aGlzLT5jb21tYW5kX2xlbmd0aCsrXSA9IGRhdGE7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXRoaXMtPmNvbW1hbmRfbGVuZ3RoKQorCQlyZXR1cm47CisKKwlyZXQgPSBncG1pX3NlbmRfY29tbWFuZCh0aGlzKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIkNoaXA6ICV1LCBFcnJvciAlZFxuIiwgdGhpcy0+Y3VycmVudF9jaGlwLCByZXQpOworCisJdGhpcy0+Y29tbWFuZF9sZW5ndGggPSAwOworfQorCitzdGF0aWMgaW50IGdwbWlfZGV2X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKworCXJldHVybiBncG1pX2lzX3JlYWR5KHRoaXMsIHRoaXMtPmN1cnJlbnRfY2hpcCk7Cit9CisKK3N0YXRpYyB2b2lkIGdwbWlfc2VsZWN0X2NoaXAoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjaGlwbnIpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMgPSBjaGlwLT5wcml2OworCisJaWYgKCh0aGlzLT5jdXJyZW50X2NoaXAgPCAwKSAmJiAoY2hpcG5yID49IDApKQorCQlncG1pX2JlZ2luKHRoaXMpOworCWVsc2UgaWYgKCh0aGlzLT5jdXJyZW50X2NoaXAgPj0gMCkgJiYgKGNoaXBuciA8IDApKQorCQlncG1pX2VuZCh0aGlzKTsKKworCXRoaXMtPmN1cnJlbnRfY2hpcCA9IGNoaXBucjsKK30KKworc3RhdGljIHZvaWQgZ3BtaV9yZWFkX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKworCXByX2RlYnVnKCJsZW4gaXMgJWRcbiIsIGxlbik7CisJdGhpcy0+dXBwZXJfYnVmCT0gYnVmOworCXRoaXMtPnVwcGVyX2xlbgk9IGxlbjsKKworCWdwbWlfcmVhZF9kYXRhKHRoaXMpOworfQorCitzdGF0aWMgdm9pZCBncG1pX3dyaXRlX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKworCXByX2RlYnVnKCJsZW4gaXMgJWRcbiIsIGxlbik7CisJdGhpcy0+dXBwZXJfYnVmCT0gKHVpbnQ4X3QgKilidWY7CisJdGhpcy0+dXBwZXJfbGVuCT0gbGVuOworCisJZ3BtaV9zZW5kX2RhdGEodGhpcyk7Cit9CisKK3N0YXRpYyB1aW50OF90IGdwbWlfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKwl1aW50OF90ICpidWYgPSB0aGlzLT5kYXRhX2J1ZmZlcl9kbWE7CisKKwlncG1pX3JlYWRfYnVmKG10ZCwgYnVmLCAxKTsKKwlyZXR1cm4gYnVmWzBdOworfQorCisvKgorICogSGFuZGxlcyBibG9jayBtYXJrIHN3YXBwaW5nLgorICogSXQgY2FuIGJlIGNhbGxlZCBpbiBzd2FwcGluZyB0aGUgYmxvY2sgbWFyaywgb3Igc3dhcHBpbmcgaXQgYmFjaywKKyAqIGJlY2F1c2UgdGhlIHRoZSBvcGVyYXRpb25zIGFyZSB0aGUgc2FtZS4KKyAqLworc3RhdGljIHZvaWQgYmxvY2tfbWFya19zd2FwcGluZyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQkJdm9pZCAqcGF5bG9hZCwgdm9pZCAqYXV4aWxpYXJ5KQoreworCXN0cnVjdCBiY2hfZ2VvbWV0cnkgKm5mY19nZW8gPSAmdGhpcy0+YmNoX2dlb21ldHJ5OworCXVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgY2hhciAqYTsKKwl1bnNpZ25lZCBpbnQgIGJpdDsKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CisJdW5zaWduZWQgY2hhciBmcm9tX2RhdGE7CisJdW5zaWduZWQgY2hhciBmcm9tX29vYjsKKworCWlmICghdGhpcy0+c3dhcF9ibG9ja19tYXJrKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB3ZSdyZSBzd2FwcGluZy4gTWFrZSBzb21lIGNvbnZlbmllbmNlCisJICogdmFyaWFibGVzLgorCSAqLworCWJpdCA9IG5mY19nZW8tPmJsb2NrX21hcmtfYml0X29mZnNldDsKKwlwICAgPSBwYXlsb2FkICsgbmZjX2dlby0+YmxvY2tfbWFya19ieXRlX29mZnNldDsKKwlhICAgPSBhdXhpbGlhcnk7CisKKwkvKgorCSAqIEdldCB0aGUgYnl0ZSBmcm9tIHRoZSBkYXRhIGFyZWEgdGhhdCBvdmVybGF5cyB0aGUgYmxvY2sgbWFyay4gU2luY2UKKwkgKiB0aGUgRUNDIGVuZ2luZSBhcHBsaWVzIGl0cyBvd24gdmlldyB0byB0aGUgYml0cyBpbiB0aGUgcGFnZSwgdGhlCisJICogcGh5c2ljYWwgYmxvY2sgbWFyayB3b24ndCAoaW4gZ2VuZXJhbCkgYXBwZWFyIG9uIGEgYnl0ZSBib3VuZGFyeSBpbgorCSAqIHRoZSBkYXRhLgorCSAqLworCWZyb21fZGF0YSA9IChwWzBdID4+IGJpdCkgfCAocFsxXSA8PCAoOCAtIGJpdCkpOworCisJLyogR2V0IHRoZSBieXRlIGZyb20gdGhlIE9PQi4gKi8KKwlmcm9tX29vYiA9IGFbMF07CisKKwkvKiBTd2FwIHRoZW0uICovCisJYVswXSA9IGZyb21fZGF0YTsKKworCW1hc2sgPSAoMHgxIDw8IGJpdCkgLSAxOworCXBbMF0gPSAocFswXSAmIG1hc2spIHwgKGZyb21fb29iIDw8IGJpdCk7CisKKwltYXNrID0gfjAgPDwgYml0OworCXBbMV0gPSAocFsxXSAmIG1hc2spIHwgKGZyb21fb29iID4+ICg4IC0gYml0KSk7Cit9CisKK3N0YXRpYyBpbnQgZ3BtaV9lY2NfcmVhZF9wYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAorCQkJCXVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UpCit7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpuZmNfZ2VvID0gJnRoaXMtPmJjaF9nZW9tZXRyeTsKKwl2b2lkICAgICAgICAgICpwYXlsb2FkX3ZpcnQ7CisJZG1hX2FkZHJfdCAgICBwYXlsb2FkX3BoeXM7CisJdm9pZCAgICAgICAgICAqYXV4aWxpYXJ5X3ZpcnQ7CisJZG1hX2FkZHJfdCAgICBhdXhpbGlhcnlfcGh5czsKKwl1bnNpZ25lZCBpbnQgIGk7CisJdW5zaWduZWQgY2hhciAqc3RhdHVzOworCXVuc2lnbmVkIGludCAgZmFpbGVkOworCXVuc2lnbmVkIGludCAgY29ycmVjdGVkOworCWludCAgICAgICAgICAgcmV0OworCisJcHJfZGVidWcoInBhZ2UgbnVtYmVyIGlzIDogJWRcbiIsIHBhZ2UpOworCXJldCA9IHJlYWRfcGFnZV9wcmVwYXJlKHRoaXMsIGJ1ZiwgbXRkLT53cml0ZXNpemUsCisJCQkJCXRoaXMtPnBheWxvYWRfdmlydCwgdGhpcy0+cGF5bG9hZF9waHlzLAorCQkJCQluZmNfZ2VvLT5wYXlsb2FkX3NpemUsCisJCQkJCSZwYXlsb2FkX3ZpcnQsICZwYXlsb2FkX3BoeXMpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJJbmFkZXF1YXRlIERNQSBidWZmZXJcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlyZXR1cm4gcmV0OworCX0KKwlhdXhpbGlhcnlfdmlydCA9IHRoaXMtPmF1eGlsaWFyeV92aXJ0OworCWF1eGlsaWFyeV9waHlzID0gdGhpcy0+YXV4aWxpYXJ5X3BoeXM7CisKKwkvKiBnbyEgKi8KKwlyZXQgPSBncG1pX3JlYWRfcGFnZSh0aGlzLCBwYXlsb2FkX3BoeXMsIGF1eGlsaWFyeV9waHlzKTsKKwlyZWFkX3BhZ2VfZW5kKHRoaXMsIGJ1ZiwgbXRkLT53cml0ZXNpemUsCisJCQl0aGlzLT5wYXlsb2FkX3ZpcnQsIHRoaXMtPnBheWxvYWRfcGh5cywKKwkJCW5mY19nZW8tPnBheWxvYWRfc2l6ZSwKKwkJCXBheWxvYWRfdmlydCwgcGF5bG9hZF9waHlzKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiRXJyb3IgaW4gRUNDLWJhc2VkIHJlYWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGV4aXRfbmZjOworCX0KKworCS8qIGhhbmRsZSB0aGUgYmxvY2sgbWFyayBzd2FwcGluZyAqLworCWJsb2NrX21hcmtfc3dhcHBpbmcodGhpcywgcGF5bG9hZF92aXJ0LCBhdXhpbGlhcnlfdmlydCk7CisKKwkvKiBMb29wIG92ZXIgc3RhdHVzIGJ5dGVzLCBhY2N1bXVsYXRpbmcgRUNDIHN0YXR1cy4gKi8KKwlmYWlsZWQJCT0gMDsKKwljb3JyZWN0ZWQJPSAwOworCXN0YXR1cwkJPSBhdXhpbGlhcnlfdmlydCArIG5mY19nZW8tPmF1eGlsaWFyeV9zdGF0dXNfb2Zmc2V0OworCisJZm9yIChpID0gMDsgaSA8IG5mY19nZW8tPmVjY19jaHVua19jb3VudDsgaSsrLCBzdGF0dXMrKykgeworCQlpZiAoKCpzdGF0dXMgPT0gU1RBVFVTX0dPT0QpIHx8ICgqc3RhdHVzID09IFNUQVRVU19FUkFTRUQpKQorCQkJY29udGludWU7CisKKwkJaWYgKCpzdGF0dXMgPT0gU1RBVFVTX1VOQ09SUkVDVEFCTEUpIHsKKwkJCWZhaWxlZCsrOworCQkJY29udGludWU7CisJCX0KKwkJY29ycmVjdGVkICs9ICpzdGF0dXM7CisJfQorCisJLyoKKwkgKiBQcm9wYWdhdGUgRUNDIHN0YXR1cyB0byB0aGUgb3duaW5nIE1URCBvbmx5IHdoZW4gZmFpbGVkIG9yCisJICogY29ycmVjdGVkIHRpbWVzIG5lYXJseSByZWFjaGVzIG91ciBFQ0MgY29ycmVjdGlvbiB0aHJlc2hvbGQuCisJICovCisJaWYgKGZhaWxlZCB8fCBjb3JyZWN0ZWQgPj0gKG5mY19nZW8tPmVjY19zdHJlbmd0aCAtIDEpKSB7CisJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCAgICArPSBmYWlsZWQ7CisJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSBjb3JyZWN0ZWQ7CisJfQorCisJLyoKKwkgKiBJdCdzIHRpbWUgdG8gZGVsaXZlciB0aGUgT09CIGJ5dGVzLiBTZWUgZ3BtaV9lY2NfcmVhZF9vb2IoKSBmb3IKKwkgKiBkZXRhaWxzIGFib3V0IG91ciBwb2xpY3kgZm9yIGRlbGl2ZXJpbmcgdGhlIE9PQi4KKwkgKgorCSAqIFdlIGZpbGwgdGhlIGNhbGxlcidzIGJ1ZmZlciB3aXRoIHNldCBiaXRzLCBhbmQgdGhlbiBjb3B5IHRoZSBibG9jaworCSAqIG1hcmsgdG8gdGggY2FsbGVyJ3MgYnVmZmVyLiBOb3RlIHRoYXQsIGlmIGJsb2NrIG1hcmsgc3dhcHBpbmcgd2FzCisJICogbmVjZXNzYXJ5LCBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNvIHdlIGNhbiByZWx5IG9uIHRoZSBmaXJzdAorCSAqIGJ5dGUgb2YgdGhlIGF1eGlsaWFyeSBidWZmZXIgdG8gY29udGFpbiB0aGUgYmxvY2sgbWFyay4KKwkgKi8KKwltZW1zZXQoY2hpcC0+b29iX3BvaSwgfjAsIG10ZC0+b29ic2l6ZSk7CisJY2hpcC0+b29iX3BvaVswXSA9ICgodWludDhfdCAqKSBhdXhpbGlhcnlfdmlydClbMF07CisKKwlyZWFkX3BhZ2Vfc3dhcF9lbmQodGhpcywgYnVmLCBtdGQtPndyaXRlc2l6ZSwKKwkJCXRoaXMtPnBheWxvYWRfdmlydCwgdGhpcy0+cGF5bG9hZF9waHlzLAorCQkJbmZjX2dlby0+cGF5bG9hZF9zaXplLAorCQkJcGF5bG9hZF92aXJ0LCBwYXlsb2FkX3BoeXMpOworZXhpdF9uZmM6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ3BtaV9lY2Nfd3JpdGVfcGFnZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBjb25zdCB1aW50OF90ICpidWYpCit7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpuZmNfZ2VvID0gJnRoaXMtPmJjaF9nZW9tZXRyeTsKKwljb25zdCB2b2lkICpwYXlsb2FkX3ZpcnQ7CisJZG1hX2FkZHJfdCBwYXlsb2FkX3BoeXM7CisJY29uc3Qgdm9pZCAqYXV4aWxpYXJ5X3ZpcnQ7CisJZG1hX2FkZHJfdCBhdXhpbGlhcnlfcGh5czsKKwlpbnQgICAgICAgIHJldDsKKworCXByX2RlYnVnKCJlY2Mgd3JpdGUgcGFnZS5cbiIpOworCWlmICh0aGlzLT5zd2FwX2Jsb2NrX21hcmspIHsKKwkJLyoKKwkJICogSWYgY29udHJvbCBhcnJpdmVzIGhlcmUsIHdlJ3JlIGRvaW5nIGJsb2NrIG1hcmsgc3dhcHBpbmcuCisJCSAqIFNpbmNlIHdlIGNhbid0IG1vZGlmeSB0aGUgY2FsbGVyJ3MgYnVmZmVycywgd2UgbXVzdCBjb3B5IHRoZW0KKwkJICogaW50byBvdXIgb3duLgorCQkgKi8KKwkJbWVtY3B5KHRoaXMtPnBheWxvYWRfdmlydCwgYnVmLCBtdGQtPndyaXRlc2l6ZSk7CisJCXBheWxvYWRfdmlydCA9IHRoaXMtPnBheWxvYWRfdmlydDsKKwkJcGF5bG9hZF9waHlzID0gdGhpcy0+cGF5bG9hZF9waHlzOworCisJCW1lbWNweSh0aGlzLT5hdXhpbGlhcnlfdmlydCwgY2hpcC0+b29iX3BvaSwKKwkJCQluZmNfZ2VvLT5hdXhpbGlhcnlfc2l6ZSk7CisJCWF1eGlsaWFyeV92aXJ0ID0gdGhpcy0+YXV4aWxpYXJ5X3ZpcnQ7CisJCWF1eGlsaWFyeV9waHlzID0gdGhpcy0+YXV4aWxpYXJ5X3BoeXM7CisKKwkJLyogSGFuZGxlIGJsb2NrIG1hcmsgc3dhcHBpbmcuICovCisJCWJsb2NrX21hcmtfc3dhcHBpbmcodGhpcywKKwkJCQkodm9pZCAqKSBwYXlsb2FkX3ZpcnQsICh2b2lkICopIGF1eGlsaWFyeV92aXJ0KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJZiBjb250cm9sIGFycml2ZXMgaGVyZSwgd2UncmUgbm90IGRvaW5nIGJsb2NrIG1hcmsgc3dhcHBpbmcsCisJCSAqIHNvIHdlIGNhbiB0byB0cnkgYW5kIHVzZSB0aGUgY2FsbGVyJ3MgYnVmZmVycy4KKwkJICovCisJCXJldCA9IHNlbmRfcGFnZV9wcmVwYXJlKHRoaXMsCisJCQkJYnVmLCBtdGQtPndyaXRlc2l6ZSwKKwkJCQl0aGlzLT5wYXlsb2FkX3ZpcnQsIHRoaXMtPnBheWxvYWRfcGh5cywKKwkJCQluZmNfZ2VvLT5wYXlsb2FkX3NpemUsCisJCQkJJnBheWxvYWRfdmlydCwgJnBheWxvYWRfcGh5cyk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiSW5hZGVxdWF0ZSBwYXlsb2FkIERNQSBidWZmZXJcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJcmV0ID0gc2VuZF9wYWdlX3ByZXBhcmUodGhpcywKKwkJCQljaGlwLT5vb2JfcG9pLCBtdGQtPm9vYnNpemUsCisJCQkJdGhpcy0+YXV4aWxpYXJ5X3ZpcnQsIHRoaXMtPmF1eGlsaWFyeV9waHlzLAorCQkJCW5mY19nZW8tPmF1eGlsaWFyeV9zaXplLAorCQkJCSZhdXhpbGlhcnlfdmlydCwgJmF1eGlsaWFyeV9waHlzKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJJbmFkZXF1YXRlIGF1eGlsaWFyeSBETUEgYnVmZmVyXG4iKTsKKwkJCWdvdG8gZXhpdF9hdXhpbGlhcnk7CisJCX0KKwl9CisKKwkvKiBBc2sgdGhlIE5GQy4gKi8KKwlyZXQgPSBncG1pX3NlbmRfcGFnZSh0aGlzLCBwYXlsb2FkX3BoeXMsIGF1eGlsaWFyeV9waHlzKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIkVycm9yIGluIEVDQy1iYXNlZCB3cml0ZTogJWRcbiIsIHJldCk7CisKKwlpZiAoIXRoaXMtPnN3YXBfYmxvY2tfbWFyaykgeworCQlzZW5kX3BhZ2VfZW5kKHRoaXMsIGNoaXAtPm9vYl9wb2ksIG10ZC0+b29ic2l6ZSwKKwkJCQl0aGlzLT5hdXhpbGlhcnlfdmlydCwgdGhpcy0+YXV4aWxpYXJ5X3BoeXMsCisJCQkJbmZjX2dlby0+YXV4aWxpYXJ5X3NpemUsCisJCQkJYXV4aWxpYXJ5X3ZpcnQsIGF1eGlsaWFyeV9waHlzKTsKK2V4aXRfYXV4aWxpYXJ5OgorCQlzZW5kX3BhZ2VfZW5kKHRoaXMsIGJ1ZiwgbXRkLT53cml0ZXNpemUsCisJCQkJdGhpcy0+cGF5bG9hZF92aXJ0LCB0aGlzLT5wYXlsb2FkX3BoeXMsCisJCQkJbmZjX2dlby0+cGF5bG9hZF9zaXplLAorCQkJCXBheWxvYWRfdmlydCwgcGF5bG9hZF9waHlzKTsKKwl9Cit9CisKKy8qCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCBwbGFjZXMgaW4gdGhpcyBkcml2ZXIgd2hlcmUgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIE9PQiBhbmQKKyAqIGJsb2NrIG1hcmtzLiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGluZ3MgYXJlIHRoZSBtb3N0IGNvbXBsaWNhdGVkLCBzbworICogdGhpcyBpcyB3aGVyZSB3ZSB0cnkgdG8gZXhwbGFpbiBpdCBhbGwuIEFsbCB0aGUgb3RoZXIgcGxhY2VzIHJlZmVyIGJhY2sgdG8KKyAqIGhlcmUuCisgKgorICogVGhlc2UgYXJlIHRoZSBydWxlcywgaW4gb3JkZXIgb2YgZGVjcmVhc2luZyBpbXBvcnRhbmNlOgorICoKKyAqIDEpIE5vdGhpbmcgdGhlIGNhbGxlciBkb2VzIGNhbiBiZSBhbGxvd2VkIHRvIGltcGVyaWwgdGhlIGJsb2NrIG1hcmsuCisgKgorICogMikgSW4gcmVhZCBvcGVyYXRpb25zLCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgT09CIHdlIHJldHVybiBtdXN0IHJlZmxlY3QgdGhlCisgKiAgICB0cnVlIHN0YXRlIG9mIHRoZSBibG9jayBtYXJrLCBubyBtYXR0ZXIgd2hlcmUgdGhhdCBibG9jayBtYXJrIGFwcGVhcnMgaW4KKyAqICAgIHRoZSBwaHlzaWNhbCBwYWdlLgorICoKKyAqIDMpIEVDQy1iYXNlZCByZWFkIG9wZXJhdGlvbnMgcmV0dXJuIGFuIE9PQiBmdWxsIG9mIHNldCBiaXRzIChzaW5jZSB3ZSBuZXZlcgorICogICAgYWxsb3cgRUNDLWJhc2VkIHdyaXRlcyB0byB0aGUgT09CLCBpdCBkb2Vzbid0IG1hdHRlciB3aGF0IEVDQy1iYXNlZCByZWFkcworICogICAgcmV0dXJuKS4KKyAqCisgKiA0KSAiUmF3IiByZWFkIG9wZXJhdGlvbnMgcmV0dXJuIGEgZGlyZWN0IHZpZXcgb2YgdGhlIHBoeXNpY2FsIGJ5dGVzIGluIHRoZQorICogICAgcGFnZSwgdXNpbmcgdGhlIGNvbnZlbnRpb25hbCBkZWZpbml0aW9uIG9mIHdoaWNoIGJ5dGVzIGFyZSBkYXRhIGFuZCB3aGljaAorICogICAgYXJlIE9PQi4gVGhpcyBnaXZlcyB0aGUgY2FsbGVyIGEgd2F5IHRvIHNlZSB0aGUgYWN0dWFsLCBwaHlzaWNhbCBieXRlcworICogICAgaW4gdGhlIHBhZ2UsIHdpdGhvdXQgdGhlIGRpc3RvcnRpb25zIGFwcGxpZWQgYnkgb3VyIEVDQyBlbmdpbmUuCisgKgorICoKKyAqIFdoYXQgd2UgZG8gZm9yIHRoaXMgc3BlY2lmaWMgcmVhZCBvcGVyYXRpb24gZGVwZW5kcyBvbiB0d28gcXVlc3Rpb25zOgorICoKKyAqIDEpIEFyZSB3ZSBkb2luZyBhICJyYXciIHJlYWQsIG9yIGFuIEVDQy1iYXNlZCByZWFkPworICoKKyAqIDIpIEFyZSB3ZSB1c2luZyBibG9jayBtYXJrIHN3YXBwaW5nIG9yIHRyYW5zY3JpcHRpb24/CisgKgorICogVGhlcmUgYXJlIGZvdXIgY2FzZXMsIGlsbHVzdHJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgS2FybmF1Z2ggbWFwOgorICoKKyAqICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICBSYXcgICAgICAgICAgIHwgICAgICAgICBFQ0MtYmFzZWQgICAgICAgfAorICogICAgICAgLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgICAgfCBSZWFkIHRoZSBjb252ZW50aW9uYWwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8IE9PQiBhdCB0aGUgZW5kIG9mIHRoZSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgU3dhcHBpbmcgICAgIHwgcGFnZSBhbmQgcmV0dXJuIGl0LiBJdCAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCBjb250YWlucyBleGFjdGx5IHdoYXQgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8IHdlIHdhbnQuICAgICAgICAgICAgICAgIHwgUmVhZCB0aGUgYmxvY2sgbWFyayBhbmQgfAorICogICAgICAgLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyByZXR1cm4gaXQgaW4gYSBidWZmZXIgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCBSZWFkIHRoZSBjb252ZW50aW9uYWwgICB8IGZ1bGwgb2Ygc2V0IGJpdHMuICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8IE9PQiBhdCB0aGUgZW5kIG9mIHRoZSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgIHwgcGFnZSBhbmQgYWxzbyB0aGUgYmxvY2sgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICBUcmFuc2NyaWJpbmcgfCBtYXJrIGluIHRoZSBtZXRhZGF0YS4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8IENvcHkgdGhlIGJsb2NrIG1hcmsgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgIHwgaW50byB0aGUgZmlyc3QgYnl0ZSBvZiAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCB0aGUgT09CLiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgIC0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIE5vdGUgdGhhdCB3ZSBicmVhayBydWxlICM0IGluIHRoZSBUcmFuc2NyaWJpbmcvUmF3IGNhc2UgYmVjYXVzZSB3ZSdyZSBub3QKKyAqIGdpdmluZyBhbiBhY2N1cmF0ZSB2aWV3IG9mIHRoZSBhY3R1YWwsIHBoeXNpY2FsIGJ5dGVzIGluIHRoZSBwYWdlICh3ZSdyZQorICogb3ZlcndyaXRpbmcgdGhlIGJsb2NrIG1hcmspLiBUaGF0J3MgT0sgYmVjYXVzZSBpdCdzIG1vcmUgaW1wb3J0YW50IHRvIGZvbGxvdworICogcnVsZSAjMi4KKyAqCisgKiBJdCB0dXJucyBvdXQgdGhhdCBrbm93aW5nIHdoZXRoZXIgd2Ugd2FudCBhbiAiRUNDLWJhc2VkIiBvciAicmF3IiByZWFkIGlzIG5vdAorICogZWFzeS4gV2hlbiByZWFkaW5nIGEgcGFnZSwgZm9yIGV4YW1wbGUsIHRoZSBOQU5EIEZsYXNoIE1URCBjb2RlIGNhbGxzIG91cgorICogZWNjLnJlYWRfcGFnZSBvciBlY2MucmVhZF9wYWdlX3JhdyBmdW5jdGlvbi4gVGh1cywgdGhlIGZhY3QgdGhhdCBNVEQgd2FudHMgYW4KKyAqIEVDQy1iYXNlZCBvciByYXcgdmlldyBvZiB0aGUgcGFnZSBpcyBpbXBsaWNpdCBpbiB3aGljaCBmdW5jdGlvbiBpdCBjYWxscworICogKHRoZXJlIGlzIGEgc2ltaWxhciBwYWlyIG9mIEVDQy1iYXNlZC9yYXcgZnVuY3Rpb25zIGZvciB3cml0aW5nKS4KKyAqCisgKiBTaW5jZSBNVEQgYXNzdW1lcyB0aGUgT09CIGlzIG5vdCBjb3ZlcmVkIGJ5IEVDQywgdGhlcmUgaXMgbm8gcGFpciBvZgorICogRUNDLWJhc2VkL3JhdyBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgb3Igb3Igd3JpdGluZyB0aGUgT09CLiBUaGUgZmFjdCB0aGF0IHRoZQorICogY2FsbGVyIHdhbnRzIGFuIEVDQy1iYXNlZCBvciByYXcgdmlldyBvZiB0aGUgcGFnZSBpcyBub3QgcHJvcGFnYXRlZCBkb3duIHRvCisgKiB0aGlzIGRyaXZlci4KKyAqLworc3RhdGljIGludCBncG1pX2VjY19yZWFkX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKKwkJCQlpbnQgcGFnZSwgaW50IHNuZGNtZCkKK3sKKwlzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMgPSBjaGlwLT5wcml2OworCisJcHJfZGVidWcoInBhZ2UgbnVtYmVyIGlzICVkXG4iLCBwYWdlKTsKKwkvKiBjbGVhciB0aGUgT09CIGJ1ZmZlciAqLworCW1lbXNldChjaGlwLT5vb2JfcG9pLCB+MCwgbXRkLT5vb2JzaXplKTsKKworCS8qIFJlYWQgb3V0IHRoZSBjb252ZW50aW9uYWwgT09CLiAqLworCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFEMCwgbXRkLT53cml0ZXNpemUsIHBhZ2UpOworCWNoaXAtPnJlYWRfYnVmKG10ZCwgY2hpcC0+b29iX3BvaSwgbXRkLT5vb2JzaXplKTsKKworCS8qCisJICogTm93LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgYmxvY2sgbWFyayBpcyBjb3JyZWN0LiBJbiB0aGUKKwkgKiBTd2FwcGluZy9SYXcgY2FzZSwgd2UgYWxyZWFkeSBoYXZlIGl0LiBPdGhlcndpc2UsIHdlIG5lZWQgdG8KKwkgKiBleHBsaWNpdGx5IHJlYWQgaXQuCisJICovCisJaWYgKCF0aGlzLT5zd2FwX2Jsb2NrX21hcmspIHsKKwkJLyogUmVhZCB0aGUgYmxvY2sgbWFyayBpbnRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBPT0IgYnVmZmVyLiAqLworCQljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVBRDAsIDAsIHBhZ2UpOworCQljaGlwLT5vb2JfcG9pWzBdID0gY2hpcC0+cmVhZF9ieXRlKG10ZCk7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gdHJ1ZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IHNlbmQKKwkgKiBhIGNvbW1hbmQuCisJICovCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQKK2dwbWlfZWNjX3dyaXRlX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IHBhZ2UpCit7CisJLyoKKwkgKiBUaGUgQkNIIHdpbGwgdXNlIGFsbCB0aGUgKHBhZ2UgKyBvb2IpLgorCSAqIE91ciBncG1pX2h3X2VjY2xheW91dCBjYW4gb25seSBwcm9oaWJpdCB0aGUgSkZGUzIgdG8gd3JpdGUgdGhlIG9vYi4KKwkgKiBCdXQgaXQgY2FuIG5vdCBzdG9wIHNvbWUgaW9jdGxzIHN1Y2ggTUVNV1JJVEVPT0Igd2hpY2ggdXNlcworCSAqIE1URF9PUFNfUExBQ0VfT09CLiBTbyBXZSBoYXZlIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIHRvIHByb2hpYml0CisJICogdGhlc2UgaW9jdGxzIHRvby4KKwkgKi8KKwlyZXR1cm4gLUVQRVJNOworfQorCitzdGF0aWMgaW50IGdwbWlfYmxvY2tfbWFya2JhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcykKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IGNoaXAtPnByaXY7CisJaW50IGJsb2NrLCByZXQgPSAwOworCXVpbnQ4X3QgKmJsb2NrX21hcms7CisJaW50IGNvbHVtbiwgcGFnZSwgc3RhdHVzLCBjaGlwbnI7CisKKwkvKiBHZXQgYmxvY2sgbnVtYmVyICovCisJYmxvY2sgPSAoaW50KShvZnMgPj4gY2hpcC0+YmJ0X2VyYXNlX3NoaWZ0KTsKKwlpZiAoY2hpcC0+YmJ0KQorCQljaGlwLT5iYnRbYmxvY2sgPj4gMl0gfD0gMHgwMSA8PCAoKGJsb2NrICYgMHgwMykgPDwgMSk7CisKKwkvKiBEbyB3ZSBoYXZlIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlID8gKi8KKwlpZiAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQkJUX1VTRV9GTEFTSCkKKwkJcmV0ID0gbmFuZF91cGRhdGVfYmJ0KG10ZCwgb2ZzKTsKKwllbHNlIHsKKwkJY2hpcG5yID0gKGludCkob2ZzID4+IGNoaXAtPmNoaXBfc2hpZnQpOworCQljaGlwLT5zZWxlY3RfY2hpcChtdGQsIGNoaXBucik7CisKKwkJY29sdW1uID0gdGhpcy0+c3dhcF9ibG9ja19tYXJrID8gbXRkLT53cml0ZXNpemUgOiAwOworCisJCS8qIFdyaXRlIHRoZSBibG9jayBtYXJrLiAqLworCQlibG9ja19tYXJrID0gdGhpcy0+ZGF0YV9idWZmZXJfZG1hOworCQlibG9ja19tYXJrWzBdID0gMDsgLyogYmFkIGJsb2NrIG1hcmtlciAqLworCisJCS8qIFNoaWZ0IHRvIGdldCBwYWdlICovCisJCXBhZ2UgPSAoaW50KShvZnMgPj4gY2hpcC0+cGFnZV9zaGlmdCk7CisKKwkJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1NFUUlOLCBjb2x1bW4sIHBhZ2UpOworCQljaGlwLT53cml0ZV9idWYobXRkLCBibG9ja19tYXJrLCAxKTsKKwkJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1BBR0VQUk9HLCAtMSwgLTEpOworCisJCXN0YXR1cyA9IGNoaXAtPndhaXRmdW5jKG10ZCwgY2hpcCk7CisJCWlmIChzdGF0dXMgJiBOQU5EX1NUQVRVU19GQUlMKQorCQkJcmV0ID0gLUVJTzsKKworCQljaGlwLT5zZWxlY3RfY2hpcChtdGQsIC0xKTsKKwl9CisJaWYgKCFyZXQpCisJCW10ZC0+ZWNjX3N0YXRzLmJhZGJsb2NrcysrOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbmFuZF9ib290X3NldF9nZW9tZXRyeShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IGJvb3Rfcm9tX2dlb21ldHJ5ICpnZW9tZXRyeSA9ICZ0aGlzLT5yb21fZ2VvbWV0cnk7CisKKwkvKgorCSAqIFNldCB0aGUgYm9vdCBibG9jayBzdHJpZGUgc2l6ZS4KKwkgKgorCSAqIEluIHByaW5jaXBsZSwgd2Ugc2hvdWxkIGJlIHJlYWRpbmcgdGhpcyBmcm9tIHRoZSBPVFAgYml0cywgc2luY2UKKwkgKiB0aGF0J3Mgd2hlcmUgdGhlIFJPTSBpcyBnb2luZyB0byBnZXQgaXQuIEluIGZhY3QsIHdlIGRvbid0IGhhdmUgYW55CisJICogd2F5IHRvIHJlYWQgdGhlIE9UUCBiaXRzLCBzbyB3ZSBnbyB3aXRoIHRoZSBkZWZhdWx0IGFuZCBob3BlIGZvciB0aGUKKwkgKiBiZXN0LgorCSAqLworCWdlb21ldHJ5LT5zdHJpZGVfc2l6ZV9pbl9wYWdlcyA9IDY0OworCisJLyoKKwkgKiBTZXQgdGhlIHNlYXJjaCBhcmVhIHN0cmlkZSBleHBvbmVudC4KKwkgKgorCSAqIEluIHByaW5jaXBsZSwgd2Ugc2hvdWxkIGJlIHJlYWRpbmcgdGhpcyBmcm9tIHRoZSBPVFAgYml0cywgc2luY2UKKwkgKiB0aGF0J3Mgd2hlcmUgdGhlIFJPTSBpcyBnb2luZyB0byBnZXQgaXQuIEluIGZhY3QsIHdlIGRvbid0IGhhdmUgYW55CisJICogd2F5IHRvIHJlYWQgdGhlIE9UUCBiaXRzLCBzbyB3ZSBnbyB3aXRoIHRoZSBkZWZhdWx0IGFuZCBob3BlIGZvciB0aGUKKwkgKiBiZXN0LgorCSAqLworCWdlb21ldHJ5LT5zZWFyY2hfYXJlYV9zdHJpZGVfZXhwb25lbnQgPSAyOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAgKmZpbmdlcnByaW50ID0gIlNUTVAiOworc3RhdGljIGludCBfX2RldmluaXQgbXgyM19jaGVja190cmFuc2NyaXB0aW9uX3N0YW1wKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgYm9vdF9yb21fZ2VvbWV0cnkgKnJvbV9nZW8gPSAmdGhpcy0+cm9tX2dlb21ldHJ5OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRoaXMtPmRldjsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9ICZ0aGlzLT5tdGQ7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9ICZ0aGlzLT5uYW5kOworCXVuc2lnbmVkIGludCBzZWFyY2hfYXJlYV9zaXplX2luX3N0cmlkZXM7CisJdW5zaWduZWQgaW50IHN0cmlkZTsKKwl1bnNpZ25lZCBpbnQgcGFnZTsKKwlsb2ZmX3QgYnl0ZTsKKwl1aW50OF90ICpidWZmZXIgPSBjaGlwLT5idWZmZXJzLT5kYXRhYnVmOworCWludCBzYXZlZF9jaGlwX251bWJlcjsKKwlpbnQgZm91bmRfYW5fbmNiX2ZpbmdlcnByaW50ID0gZmFsc2U7CisKKwkvKiBDb21wdXRlIHRoZSBudW1iZXIgb2Ygc3RyaWRlcyBpbiBhIHNlYXJjaCBhcmVhLiAqLworCXNlYXJjaF9hcmVhX3NpemVfaW5fc3RyaWRlcyA9IDEgPDwgcm9tX2dlby0+c2VhcmNoX2FyZWFfc3RyaWRlX2V4cG9uZW50OworCisJc2F2ZWRfY2hpcF9udW1iZXIgPSB0aGlzLT5jdXJyZW50X2NoaXA7CisJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCAwKTsKKworCS8qCisJICogTG9vcCB0aHJvdWdoIHRoZSBmaXJzdCBzZWFyY2ggYXJlYSwgbG9va2luZyBmb3IgdGhlIE5DQiBmaW5nZXJwcmludC4KKwkgKi8KKwlkZXZfZGJnKGRldiwgIlNjYW5uaW5nIGZvciBhbiBOQ0IgZmluZ2VycHJpbnQuLi5cbiIpOworCisJZm9yIChzdHJpZGUgPSAwOyBzdHJpZGUgPCBzZWFyY2hfYXJlYV9zaXplX2luX3N0cmlkZXM7IHN0cmlkZSsrKSB7CisJCS8qIENvbXB1dGUgdGhlIHBhZ2UgYW5kIGJ5dGUgYWRkcmVzc2VzLiAqLworCQlwYWdlID0gc3RyaWRlICogcm9tX2dlby0+c3RyaWRlX3NpemVfaW5fcGFnZXM7CisJCWJ5dGUgPSBwYWdlICAgKiBtdGQtPndyaXRlc2l6ZTsKKworCQlkZXZfZGJnKGRldiwgIkxvb2tpbmcgZm9yIGEgZmluZ2VycHJpbnQgaW4gcGFnZSAweCV4XG4iLCBwYWdlKTsKKworCQkvKgorCQkgKiBSZWFkIHRoZSBOQ0IgZmluZ2VycHJpbnQuIFRoZSBmaW5nZXJwcmludCBpcyBmb3VyIGJ5dGVzIGxvbmcKKwkJICogYW5kIHN0YXJ0cyBpbiB0aGUgMTJ0aCBieXRlIG9mIHRoZSBwYWdlLgorCQkgKi8KKwkJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1JFQUQwLCAxMiwgcGFnZSk7CisJCWNoaXAtPnJlYWRfYnVmKG10ZCwgYnVmZmVyLCBzdHJsZW4oZmluZ2VycHJpbnQpKTsKKworCQkvKiBMb29rIGZvciB0aGUgZmluZ2VycHJpbnQuICovCisJCWlmICghbWVtY21wKGJ1ZmZlciwgZmluZ2VycHJpbnQsIHN0cmxlbihmaW5nZXJwcmludCkpKSB7CisJCQlmb3VuZF9hbl9uY2JfZmluZ2VycHJpbnQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCX0KKworCWNoaXAtPnNlbGVjdF9jaGlwKG10ZCwgc2F2ZWRfY2hpcF9udW1iZXIpOworCisJaWYgKGZvdW5kX2FuX25jYl9maW5nZXJwcmludCkKKwkJZGV2X2RiZyhkZXYsICJcdEZvdW5kIGEgZmluZ2VycHJpbnRcbiIpOworCWVsc2UKKwkJZGV2X2RiZyhkZXYsICJcdE5vIGZpbmdlcnByaW50IGZvdW5kXG4iKTsKKwlyZXR1cm4gZm91bmRfYW5fbmNiX2ZpbmdlcnByaW50OworfQorCisvKiBXcml0ZXMgYSB0cmFuc2NyaXB0aW9uIHN0YW1wLiAqLworc3RhdGljIGludCBfX2RldmluaXQgbXgyM193cml0ZV90cmFuc2NyaXB0aW9uX3N0YW1wKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0aGlzLT5kZXY7CisJc3RydWN0IGJvb3Rfcm9tX2dlb21ldHJ5ICpyb21fZ2VvID0gJnRoaXMtPnJvbV9nZW9tZXRyeTsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9ICZ0aGlzLT5tdGQ7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9ICZ0aGlzLT5uYW5kOworCXVuc2lnbmVkIGludCBibG9ja19zaXplX2luX3BhZ2VzOworCXVuc2lnbmVkIGludCBzZWFyY2hfYXJlYV9zaXplX2luX3N0cmlkZXM7CisJdW5zaWduZWQgaW50IHNlYXJjaF9hcmVhX3NpemVfaW5fcGFnZXM7CisJdW5zaWduZWQgaW50IHNlYXJjaF9hcmVhX3NpemVfaW5fYmxvY2tzOworCXVuc2lnbmVkIGludCBibG9jazsKKwl1bnNpZ25lZCBpbnQgc3RyaWRlOworCXVuc2lnbmVkIGludCBwYWdlOworCWxvZmZfdCAgICAgICBieXRlOworCXVpbnQ4X3QgICAgICAqYnVmZmVyID0gY2hpcC0+YnVmZmVycy0+ZGF0YWJ1ZjsKKwlpbnQgc2F2ZWRfY2hpcF9udW1iZXI7CisJaW50IHN0YXR1czsKKworCS8qIENvbXB1dGUgdGhlIHNlYXJjaCBhcmVhIGdlb21ldHJ5LiAqLworCWJsb2NrX3NpemVfaW5fcGFnZXMgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXplOworCXNlYXJjaF9hcmVhX3NpemVfaW5fc3RyaWRlcyA9IDEgPDwgcm9tX2dlby0+c2VhcmNoX2FyZWFfc3RyaWRlX2V4cG9uZW50OworCXNlYXJjaF9hcmVhX3NpemVfaW5fcGFnZXMgPSBzZWFyY2hfYXJlYV9zaXplX2luX3N0cmlkZXMgKgorCQkJCQlyb21fZ2VvLT5zdHJpZGVfc2l6ZV9pbl9wYWdlczsKKwlzZWFyY2hfYXJlYV9zaXplX2luX2Jsb2NrcyA9CisJCSAgKHNlYXJjaF9hcmVhX3NpemVfaW5fcGFnZXMgKyAoYmxvY2tfc2l6ZV9pbl9wYWdlcyAtIDEpKSAvCisJCQkJICAgIGJsb2NrX3NpemVfaW5fcGFnZXM7CisKKwlkZXZfZGJnKGRldiwgIlNlYXJjaCBBcmVhIEdlb21ldHJ5IDpcbiIpOworCWRldl9kYmcoZGV2LCAiXHRpbiBCbG9ja3MgOiAldVxuIiwgc2VhcmNoX2FyZWFfc2l6ZV9pbl9ibG9ja3MpOworCWRldl9kYmcoZGV2LCAiXHRpbiBTdHJpZGVzOiAldVxuIiwgc2VhcmNoX2FyZWFfc2l6ZV9pbl9zdHJpZGVzKTsKKwlkZXZfZGJnKGRldiwgIlx0aW4gUGFnZXMgIDogJXVcbiIsIHNlYXJjaF9hcmVhX3NpemVfaW5fcGFnZXMpOworCisJLyogU2VsZWN0IGNoaXAgMC4gKi8KKwlzYXZlZF9jaGlwX251bWJlciA9IHRoaXMtPmN1cnJlbnRfY2hpcDsKKwljaGlwLT5zZWxlY3RfY2hpcChtdGQsIDApOworCisJLyogTG9vcCBvdmVyIGJsb2NrcyBpbiB0aGUgZmlyc3Qgc2VhcmNoIGFyZWEsIGVyYXNpbmcgdGhlbS4gKi8KKwlkZXZfZGJnKGRldiwgIkVyYXNpbmcgdGhlIHNlYXJjaCBhcmVhLi4uXG4iKTsKKworCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IHNlYXJjaF9hcmVhX3NpemVfaW5fYmxvY2tzOyBibG9jaysrKSB7CisJCS8qIENvbXB1dGUgdGhlIHBhZ2UgYWRkcmVzcy4gKi8KKwkJcGFnZSA9IGJsb2NrICogYmxvY2tfc2l6ZV9pbl9wYWdlczsKKworCQkvKiBFcmFzZSB0aGlzIGJsb2NrLiAqLworCQlkZXZfZGJnKGRldiwgIlx0RXJhc2luZyBibG9jayAweCV4XG4iLCBibG9jayk7CisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9FUkFTRTEsIC0xLCBwYWdlKTsKKwkJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX0VSQVNFMiwgLTEsIC0xKTsKKworCQkvKiBXYWl0IGZvciB0aGUgZXJhc2UgdG8gZmluaXNoLiAqLworCQlzdGF0dXMgPSBjaGlwLT53YWl0ZnVuYyhtdGQsIGNoaXApOworCQlpZiAoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkKKwkJCWRldl9lcnIoZGV2LCAiWyVzXSBFcmFzZSBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJLyogV3JpdGUgdGhlIE5DQiBmaW5nZXJwcmludCBpbnRvIHRoZSBwYWdlIGJ1ZmZlci4gKi8KKwltZW1zZXQoYnVmZmVyLCB+MCwgbXRkLT53cml0ZXNpemUpOworCW1lbXNldChjaGlwLT5vb2JfcG9pLCB+MCwgbXRkLT5vb2JzaXplKTsKKwltZW1jcHkoYnVmZmVyICsgMTIsIGZpbmdlcnByaW50LCBzdHJsZW4oZmluZ2VycHJpbnQpKTsKKworCS8qIExvb3AgdGhyb3VnaCB0aGUgZmlyc3Qgc2VhcmNoIGFyZWEsIHdyaXRpbmcgTkNCIGZpbmdlcnByaW50cy4gKi8KKwlkZXZfZGJnKGRldiwgIldyaXRpbmcgTkNCIGZpbmdlcnByaW50cy4uLlxuIik7CisJZm9yIChzdHJpZGUgPSAwOyBzdHJpZGUgPCBzZWFyY2hfYXJlYV9zaXplX2luX3N0cmlkZXM7IHN0cmlkZSsrKSB7CisJCS8qIENvbXB1dGUgdGhlIHBhZ2UgYW5kIGJ5dGUgYWRkcmVzc2VzLiAqLworCQlwYWdlID0gc3RyaWRlICogcm9tX2dlby0+c3RyaWRlX3NpemVfaW5fcGFnZXM7CisJCWJ5dGUgPSBwYWdlICAgKiBtdGQtPndyaXRlc2l6ZTsKKworCQkvKiBXcml0ZSB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgY3VycmVudCBzdHJpZGUuICovCisJCWRldl9kYmcoZGV2LCAiV3JpdGluZyBhbiBOQ0IgZmluZ2VycHJpbnQgaW4gcGFnZSAweCV4XG4iLCBwYWdlKTsKKwkJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1NFUUlOLCAweDAwLCBwYWdlKTsKKwkJY2hpcC0+ZWNjLndyaXRlX3BhZ2VfcmF3KG10ZCwgY2hpcCwgYnVmZmVyKTsKKwkJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1BBR0VQUk9HLCAtMSwgLTEpOworCisJCS8qIFdhaXQgZm9yIHRoZSB3cml0ZSB0byBmaW5pc2guICovCisJCXN0YXR1cyA9IGNoaXAtPndhaXRmdW5jKG10ZCwgY2hpcCk7CisJCWlmIChzdGF0dXMgJiBOQU5EX1NUQVRVU19GQUlMKQorCQkJZGV2X2VycihkZXYsICJbJXNdIFdyaXRlIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKKwl9CisKKwkvKiBEZXNlbGVjdCBjaGlwIDAuICovCisJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCBzYXZlZF9jaGlwX251bWJlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG14MjNfYm9vdF9pbml0KHN0cnVjdCBncG1pX25hbmRfZGF0YSAgKnRoaXMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdGhpcy0+ZGV2OworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmdGhpcy0+bmFuZDsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9ICZ0aGlzLT5tdGQ7CisJdW5zaWduZWQgaW50IGJsb2NrX2NvdW50OworCXVuc2lnbmVkIGludCBibG9jazsKKwlpbnQgICAgIGNoaXBucjsKKwlpbnQgICAgIHBhZ2U7CisJbG9mZl90ICBieXRlOworCXVpbnQ4X3QgYmxvY2tfbWFyazsKKwlpbnQgICAgIHJldCA9IDA7CisKKwkvKgorCSAqIElmIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB3ZSBjYW4ndCB1c2UgYmxvY2sgbWFyayBzd2FwcGluZywgd2hpY2gKKwkgKiBtZWFucyB3ZSdyZSBmb3JjZWQgdG8gdXNlIHRyYW5zY3JpcHRpb24uIEZpcnN0LCBzY2FuIGZvciB0aGUKKwkgKiB0cmFuc2NyaXB0aW9uIHN0YW1wLiBJZiB3ZSBmaW5kIGl0LCB0aGVuIHdlIGRvbid0IGhhdmUgdG8gZG8KKwkgKiBhbnl0aGluZyAtLSB0aGUgYmxvY2sgbWFya3MgYXJlIGFscmVhZHkgdHJhbnNjcmliZWQuCisJICovCisJaWYgKG14MjNfY2hlY2tfdHJhbnNjcmlwdGlvbl9zdGFtcCh0aGlzKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB3ZSBjb3VsZG4ndCBmaW5kIGEgdHJhbnNjcmlwdGlvbiBzdGFtcCwgc28KKwkgKiBzbyB3ZSBwcmVzdW1lIHRoZSBibG9jayBtYXJrcyBhcmUgaW4gdGhlIGNvbnZlbnRpb25hbCBsb2NhdGlvbi4KKwkgKi8KKwlkZXZfZGJnKGRldiwgIlRyYW5zY3JpYmluZyBiYWQgYmxvY2sgbWFya3MuLi5cbiIpOworCisJLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgZW50aXJlIG1lZGl1bS4gKi8KKwlibG9ja19jb3VudCA9IGNoaXAtPmNoaXBzaXplID4+IGNoaXAtPnBoeXNfZXJhc2Vfc2hpZnQ7CisKKwkvKgorCSAqIExvb3Agb3ZlciBhbGwgdGhlIGJsb2NrcyBpbiB0aGUgbWVkaXVtLCB0cmFuc2NyaWJpbmcgYmxvY2sgbWFya3MgYXMKKwkgKiB3ZSBnby4KKwkgKi8KKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBibG9ja19jb3VudDsgYmxvY2srKykgeworCQkvKgorCQkgKiBDb21wdXRlIHRoZSBjaGlwLCBwYWdlIGFuZCBieXRlIGFkZHJlc3NlcyBmb3IgdGhpcyBibG9jaydzCisJCSAqIGNvbnZlbnRpb25hbCBtYXJrLgorCQkgKi8KKwkJY2hpcG5yID0gYmxvY2sgPj4gKGNoaXAtPmNoaXBfc2hpZnQgLSBjaGlwLT5waHlzX2VyYXNlX3NoaWZ0KTsKKwkJcGFnZSA9IGJsb2NrIDw8IChjaGlwLT5waHlzX2VyYXNlX3NoaWZ0IC0gY2hpcC0+cGFnZV9zaGlmdCk7CisJCWJ5dGUgPSBibG9jayA8PCAgY2hpcC0+cGh5c19lcmFzZV9zaGlmdDsKKworCQkvKiBTZW5kIHRoZSBjb21tYW5kIHRvIHJlYWQgdGhlIGNvbnZlbnRpb25hbCBibG9jayBtYXJrLiAqLworCQljaGlwLT5zZWxlY3RfY2hpcChtdGQsIGNoaXBucik7CisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFEMCwgbXRkLT53cml0ZXNpemUsIHBhZ2UpOworCQlibG9ja19tYXJrID0gY2hpcC0+cmVhZF9ieXRlKG10ZCk7CisJCWNoaXAtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOworCisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSBibG9jayBpcyBtYXJrZWQgYmFkLiBJZiBzbywgd2UgbmVlZCB0byBtYXJrIGl0CisJCSAqIGFnYWluLCBidXQgdGhpcyB0aW1lIHRoZSByZXN1bHQgd2lsbCBiZSBhIG1hcmsgaW4gdGhlCisJCSAqIGxvY2F0aW9uIHdoZXJlIHdlIHRyYW5zY3JpYmUgYmxvY2sgbWFya3MuCisJCSAqLworCQlpZiAoYmxvY2tfbWFyayAhPSAweGZmKSB7CisJCQlkZXZfZGJnKGRldiwgIlRyYW5zY3JpYmluZyBtYXJrIGluIGJsb2NrICV1XG4iLCBibG9jayk7CisJCQlyZXQgPSBjaGlwLT5ibG9ja19tYXJrYmFkKG10ZCwgYnl0ZSk7CisJCQlpZiAocmV0KQorCQkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcmsgYmxvY2sgYmFkIHdpdGggIgorCQkJCQkJCSJyZXQgJWRcbiIsIHJldCk7CisJCX0KKwl9CisKKwkvKiBXcml0ZSB0aGUgc3RhbXAgdGhhdCBpbmRpY2F0ZXMgd2UndmUgdHJhbnNjcmliZWQgdGhlIGJsb2NrIG1hcmtzLiAqLworCW14MjNfd3JpdGVfdHJhbnNjcmlwdGlvbl9zdGFtcCh0aGlzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbmFuZF9ib290X2luaXQoc3RydWN0IGdwbWlfbmFuZF9kYXRhICAqdGhpcykKK3sKKwluYW5kX2Jvb3Rfc2V0X2dlb21ldHJ5KHRoaXMpOworCisJLyogVGhpcyBpcyBST00gYXJjaC1zcGVjaWZpYyBpbml0aWxpemF0aW9uIGJlZm9yZSB0aGUgQkJUIHNjYW5uaW5nLiAqLworCWlmIChHUE1JX0lTX01YMjModGhpcykpCisJCXJldHVybiBteDIzX2Jvb3RfaW5pdCh0aGlzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZ3BtaV9zZXRfZ2VvbWV0cnkoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCWludCByZXQ7CisKKwkvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgRE1BIG1lbW9yeSBmb3IgcmVhZGluZyBJRC4gKi8KKwlncG1pX2ZyZWVfZG1hX2J1ZmZlcih0aGlzKTsKKworCS8qIFNldCB1cCB0aGUgTkZDIGdlb21ldHJ5IHdoaWNoIGlzIHVzZWQgYnkgQkNILiAqLworCXJldCA9IGJjaF9zZXRfZ2VvbWV0cnkodGhpcyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInNldCBnZW9tZXRyeSByZXQgOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBBbGxvYyB0aGUgbmV3IERNQSBidWZmZXJzIGFjY29yZGluZyB0byB0aGUgcGFnZXNpemUgYW5kIG9vYnNpemUgKi8KKwlyZXR1cm4gZ3BtaV9hbGxvY19kbWFfYnVmZmVyKHRoaXMpOworfQorCitzdGF0aWMgaW50IGdwbWlfcHJlX2JidF9zY2FuKHN0cnVjdCBncG1pX25hbmRfZGF0YSAgKnRoaXMpCit7CisJaW50IHJldDsKKworCS8qIFNldCB1cCBzd2FwX2Jsb2NrX21hcmssIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgZ3BtaV9zZXRfZ2VvbWV0cnkoKSAqLworCWlmIChHUE1JX0lTX01YMjModGhpcykpCisJCXRoaXMtPnN3YXBfYmxvY2tfbWFyayA9IGZhbHNlOworCWVsc2UKKwkJdGhpcy0+c3dhcF9ibG9ja19tYXJrID0gdHJ1ZTsKKworCS8qIFNldCB1cCB0aGUgbWVkaXVtIGdlb21ldHJ5ICovCisJcmV0ID0gZ3BtaV9zZXRfZ2VvbWV0cnkodGhpcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE5BTkQgYm9vdCBpbml0LCBkZXBlbmRzIG9uIHRoZSBncG1pX3NldF9nZW9tZXRyeSgpLiAqLworCXJldHVybiBuYW5kX2Jvb3RfaW5pdCh0aGlzKTsKK30KKworc3RhdGljIGludCBncG1pX3NjYW5fYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKwlpbnQgcmV0OworCisJLyogUHJlcGFyZSBmb3IgdGhlIEJCVCBzY2FuLiAqLworCXJldCA9IGdwbWlfcHJlX2JidF9zY2FuKHRoaXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiB1c2UgdGhlIGRlZmF1bHQgQkJUIGltcGxlbWVudGF0aW9uICovCisJcmV0dXJuIG5hbmRfZGVmYXVsdF9iYnQobXRkKTsKK30KKwordm9pZCBncG1pX25mY19leGl0KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwluYW5kX3JlbGVhc2UoJnRoaXMtPm10ZCk7CisJZ3BtaV9mcmVlX2RtYV9idWZmZXIodGhpcyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwbWlfbmZjX2luaXQoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCBncG1pX25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSB0aGlzLT5wZGF0YTsKKwlzdHJ1Y3QgbXRkX2luZm8gICptdGQgPSAmdGhpcy0+bXRkOworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmdGhpcy0+bmFuZDsKKwlpbnQgcmV0OworCisJLyogaW5pdCBjdXJyZW50IGNoaXAgKi8KKwl0aGlzLT5jdXJyZW50X2NoaXAJPSAtMTsKKworCS8qIGluaXQgdGhlIE1URCBkYXRhIHN0cnVjdHVyZXMgKi8KKwltdGQtPnByaXYJCT0gY2hpcDsKKwltdGQtPm5hbWUJCT0gImdwbWktbmFuZCI7CisJbXRkLT5vd25lcgkJPSBUSElTX01PRFVMRTsKKworCS8qIGluaXQgdGhlIG5hbmRfY2hpcHt9LCB3ZSBkb24ndCBzdXBwb3J0IGEgMTYtYml0IE5BTkQgRmxhc2ggYnVzLiAqLworCWNoaXAtPnByaXYJCT0gdGhpczsKKwljaGlwLT5zZWxlY3RfY2hpcAk9IGdwbWlfc2VsZWN0X2NoaXA7CisJY2hpcC0+Y21kX2N0cmwJCT0gZ3BtaV9jbWRfY3RybDsKKwljaGlwLT5kZXZfcmVhZHkJCT0gZ3BtaV9kZXZfcmVhZHk7CisJY2hpcC0+cmVhZF9ieXRlCQk9IGdwbWlfcmVhZF9ieXRlOworCWNoaXAtPnJlYWRfYnVmCQk9IGdwbWlfcmVhZF9idWY7CisJY2hpcC0+d3JpdGVfYnVmCQk9IGdwbWlfd3JpdGVfYnVmOworCWNoaXAtPmVjYy5yZWFkX3BhZ2UJPSBncG1pX2VjY19yZWFkX3BhZ2U7CisJY2hpcC0+ZWNjLndyaXRlX3BhZ2UJPSBncG1pX2VjY193cml0ZV9wYWdlOworCWNoaXAtPmVjYy5yZWFkX29vYgk9IGdwbWlfZWNjX3JlYWRfb29iOworCWNoaXAtPmVjYy53cml0ZV9vb2IJPSBncG1pX2VjY193cml0ZV9vb2I7CisJY2hpcC0+c2Nhbl9iYnQJCT0gZ3BtaV9zY2FuX2JidDsKKwljaGlwLT5iYWRibG9ja19wYXR0ZXJuCT0gJmdwbWlfYmJ0X2Rlc2NyOworCWNoaXAtPmJsb2NrX21hcmtiYWQJPSBncG1pX2Jsb2NrX21hcmtiYWQ7CisJY2hpcC0+b3B0aW9ucwkJfD0gTkFORF9OT19TVUJQQUdFX1dSSVRFOworCWNoaXAtPmVjYy5tb2RlCQk9IE5BTkRfRUNDX0hXOworCWNoaXAtPmVjYy5zaXplCQk9IDE7CisJY2hpcC0+ZWNjLmxheW91dAk9ICZncG1pX2h3X2VjY2xheW91dDsKKworCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IERNQSBidWZmZXIgZm9yIHJlYWRpbmcgSUQgaW4gdGhlIG5hbmRfc2NhbigpICovCisJdGhpcy0+YmNoX2dlb21ldHJ5LnBheWxvYWRfc2l6ZSA9IDEwMjQ7CisJdGhpcy0+YmNoX2dlb21ldHJ5LmF1eGlsaWFyeV9zaXplID0gMTI4OworCXJldCA9IGdwbWlfYWxsb2NfZG1hX2J1ZmZlcih0aGlzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXQ7CisKKwlyZXQgPSBuYW5kX3NjYW4obXRkLCBwZGF0YS0+bWF4X2NoaXBfY291bnQpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJDaGlwIHNjYW4gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJldCA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIobXRkLCBOVUxMLCBOVUxMLAorCQkJcGRhdGEtPnBhcnRpdGlvbnMsIHBkYXRhLT5wYXJ0aXRpb25fY291bnQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlncG1pX25mY19leGl0KHRoaXMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwbWlfbmFuZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBncG1pX25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXM7CisJaW50IHJldDsKKworCXRoaXMgPSBremFsbG9jKHNpemVvZigqdGhpcyksIEdGUF9LRVJORUwpOworCWlmICghdGhpcykgeworCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBwZXItZGV2aWNlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRoaXMpOworCXRoaXMtPnBkZXYgID0gcGRldjsKKwl0aGlzLT5kZXYgICA9ICZwZGV2LT5kZXY7CisJdGhpcy0+cGRhdGEgPSBwZGF0YTsKKworCWlmIChwZGF0YS0+cGxhdGZvcm1faW5pdCkgeworCQlyZXQgPSBwZGF0YS0+cGxhdGZvcm1faW5pdCgpOworCQlpZiAocmV0KQorCQkJZ290byBwbGF0Zm9ybV9pbml0X2Vycm9yOworCX0KKworCXJldCA9IGFjcXVpcmVfcmVzb3VyY2VzKHRoaXMpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9hY3F1aXJlX3Jlc291cmNlczsKKworCXJldCA9IGluaXRfaGFyZHdhcmUodGhpcyk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X25mY19pbml0OworCisJcmV0ID0gZ3BtaV9uZmNfaW5pdCh0aGlzKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfbmZjX2luaXQ7CisKKwlyZXR1cm4gMDsKKworZXhpdF9uZmNfaW5pdDoKKwlyZWxlYXNlX3Jlc291cmNlcyh0aGlzKTsKK3BsYXRmb3JtX2luaXRfZXJyb3I6CitleGl0X2FjcXVpcmVfcmVzb3VyY2VzOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKHRoaXMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGdwbWlfbmFuZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWdwbWlfbmZjX2V4aXQodGhpcyk7CisJcmVsZWFzZV9yZXNvdXJjZXModGhpcyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUodGhpcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGdwbWlfaWRzW10gPSB7CisJeworCQkubmFtZSA9ICJpbXgyMy1ncG1pLW5hbmQiLAorCQkuZHJpdmVyX2RhdGEgPSBJU19NWDIzLAorCX0sIHsKKwkJLm5hbWUgPSAiaW14MjgtZ3BtaS1uYW5kIiwKKwkJLmRyaXZlcl9kYXRhID0gSVNfTVgyOCwKKwl9LCB7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwbWlfbmFuZF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiZ3BtaS1uYW5kIiwKKwl9LAorCS5wcm9iZSAgID0gZ3BtaV9uYW5kX3Byb2JlLAorCS5yZW1vdmUgID0gX19leGl0X3AoZ3BtaV9uYW5kX3JlbW92ZSksCisJLmlkX3RhYmxlID0gZ3BtaV9pZHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBncG1pX25hbmRfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdwbWlfbmFuZF9kcml2ZXIpOworCWlmIChlcnIgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiR1BNSSBOQU5EIGRyaXZlciByZWdpc3RlcmVkLiAoSU1YKVxuIik7CisJZWxzZQorCQlwcl9lcnIoImkuTVggR1BNSSBOQU5EIGRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ3BtaV9uYW5kX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ3BtaV9uYW5kX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGdwbWlfbmFuZF9pbml0KTsKK21vZHVsZV9leGl0KGdwbWlfbmFuZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaS5NWCBHUE1JIE5BTkQgRmxhc2ggQ29udHJvbGxlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktbmFuZC5oIGIvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1uYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyM2JjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktbmFuZC5oCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogRnJlZXNjYWxlIEdQTUkgTkFORCBGbGFzaCBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEVtYmVkZGVkIEFsbGV5IFNvbHV0aW9ucywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0RSSVZFUlNfTVREX05BTkRfR1BNSV9OQU5EX0gKKyNkZWZpbmUgX19EUklWRVJTX01URF9OQU5EX0dQTUlfTkFORF9ICisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKworc3RydWN0IHJlc291cmNlcyB7CisJdm9pZCAgICAgICAgICAqZ3BtaV9yZWdzOworCXZvaWQgICAgICAgICAgKmJjaF9yZWdzOworCXVuc2lnbmVkIGludCAgYmNoX2xvd19pbnRlcnJ1cHQ7CisJdW5zaWduZWQgaW50ICBiY2hfaGlnaF9pbnRlcnJ1cHQ7CisJdW5zaWduZWQgaW50ICBkbWFfbG93X2NoYW5uZWw7CisJdW5zaWduZWQgaW50ICBkbWFfaGlnaF9jaGFubmVsOworCXN0cnVjdCBjbGsgICAgKmNsb2NrOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYmNoX2dlb21ldHJ5IC0gQkNIIGdlb21ldHJ5IGRlc2NyaXB0aW9uLgorICogQGdmX2xlbjogICAgICAgICAgICAgICAgICAgVGhlIGxlbmd0aCBvZiBHYWxvaXMgRmllbGQuIChlLmcuLCAxMyBvciAxNCkKKyAqIEBlY2Nfc3RyZW5ndGg6ICAgICAgICAgICAgIEEgbnVtYmVyIHRoYXQgZGVzY3JpYmVzIHRoZSBzdHJlbmd0aCBvZiB0aGUgRUNDCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0uCisgKiBAcGFnZV9zaXplOiAgICAgICAgICAgICAgICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGEgcGh5c2ljYWwgcGFnZSwgaW5jbHVkaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoIGRhdGEgYW5kIE9PQi4KKyAqIEBtZXRhZGF0YV9zaXplOiAgICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIG1ldGFkYXRhLgorICogQGVjY19jaHVua19zaXplOiAgICAgICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhIHNpbmdsZSBFQ0MgY2h1bmsuIE5vdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBjaHVuayBpbiB0aGUgcGFnZSBpbmNsdWRlcyBib3RoIGRhdGEgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwgc28gaXQncyBhIGJpdCBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLgorICogQGVjY19jaHVua19jb3VudDogICAgICAgICAgVGhlIG51bWJlciBvZiBFQ0MgY2h1bmtzIGluIHRoZSBwYWdlLAorICogQHBheWxvYWRfc2l6ZTogICAgICAgICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgcGF5bG9hZCBidWZmZXIuCisgKiBAYXV4aWxpYXJ5X3NpemU6ICAgICAgICAgICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBhdXhpbGlhcnkgYnVmZmVyLgorICogQGF1eGlsaWFyeV9zdGF0dXNfb2Zmc2V0OiAgVGhlIG9mZnNldCBpbnRvIHRoZSBhdXhpbGlhcnkgYnVmZmVyIGF0IHdoaWNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgRUNDIHN0YXR1cyBhcHBlYXJzLgorICogQGJsb2NrX21hcmtfYnl0ZV9vZmZzZXQ6ICAgVGhlIGJ5dGUgb2Zmc2V0IGluIHRoZSBFQ0MtYmFzZWQgcGFnZSB2aWV3IGF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBibG9jayBtYXJrIGFwcGVhcnMuCisgKiBAYmxvY2tfbWFya19iaXRfb2Zmc2V0OiAgICBUaGUgYml0IG9mZnNldCBpbnRvIHRoZSBFQ0MtYmFzZWQgcGFnZSB2aWV3IGF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBibG9jayBtYXJrIGFwcGVhcnMuCisgKi8KK3N0cnVjdCBiY2hfZ2VvbWV0cnkgeworCXVuc2lnbmVkIGludCAgZ2ZfbGVuOworCXVuc2lnbmVkIGludCAgZWNjX3N0cmVuZ3RoOworCXVuc2lnbmVkIGludCAgcGFnZV9zaXplOworCXVuc2lnbmVkIGludCAgbWV0YWRhdGFfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgIGVjY19jaHVua19zaXplOworCXVuc2lnbmVkIGludCAgZWNjX2NodW5rX2NvdW50OworCXVuc2lnbmVkIGludCAgcGF5bG9hZF9zaXplOworCXVuc2lnbmVkIGludCAgYXV4aWxpYXJ5X3NpemU7CisJdW5zaWduZWQgaW50ICBhdXhpbGlhcnlfc3RhdHVzX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgIGJsb2NrX21hcmtfYnl0ZV9vZmZzZXQ7CisJdW5zaWduZWQgaW50ICBibG9ja19tYXJrX2JpdF9vZmZzZXQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBib290X3JvbV9nZW9tZXRyeSAtIEJvb3QgUk9NIGdlb21ldHJ5IGRlc2NyaXB0aW9uLgorICogQHN0cmlkZV9zaXplX2luX3BhZ2VzOiAgICAgICAgVGhlIHNpemUgb2YgYSBib290IGJsb2NrIHN0cmlkZSwgaW4gcGFnZXMuCisgKiBAc2VhcmNoX2FyZWFfc3RyaWRlX2V4cG9uZW50OiBUaGUgbG9nYXJpdGhtIHRvIGJhc2UgMiBvZiB0aGUgc2l6ZSBvZiBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2ggYXJlYSBpbiBib290IGJsb2NrIHN0cmlkZXMuCisgKi8KK3N0cnVjdCBib290X3JvbV9nZW9tZXRyeSB7CisJdW5zaWduZWQgaW50ICBzdHJpZGVfc2l6ZV9pbl9wYWdlczsKKwl1bnNpZ25lZCBpbnQgIHNlYXJjaF9hcmVhX3N0cmlkZV9leHBvbmVudDsKK307CisKKy8qIERNQSBvcGVyYXRpb25zIHR5cGVzICovCitlbnVtIGRtYV9vcHNfdHlwZSB7CisJRE1BX0ZPUl9DT01NQU5EID0gMSwKKwlETUFfRk9SX1JFQURfREFUQSwKKwlETUFfRk9SX1dSSVRFX0RBVEEsCisJRE1BX0ZPUl9SRUFEX0VDQ19QQUdFLAorCURNQV9GT1JfV1JJVEVfRUNDX1BBR0UKK307CisKKy8qKgorICogc3RydWN0IG5hbmRfdGltaW5nIC0gRnVuZGFtZW50YWwgdGltaW5nIGF0dHJpYnV0ZXMgZm9yIE5BTkQuCisgKiBAZGF0YV9zZXR1cF9pbl9uczogICAgICAgICBUaGUgZGF0YSBzZXR1cCB0aW1lLCBpbiBuYW5vc2Vjb25kcy4gVXN1YWxseSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0gb2YgdERTIGFuZCB0V1AuIEEgbmVnYXRpdmUgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGlzIGNoYXJhY3RlcmlzdGljIGlzbid0IGtub3duLgorICogQGRhdGFfaG9sZF9pbl9uczogICAgICAgICAgVGhlIGRhdGEgaG9sZCB0aW1lLCBpbiBuYW5vc2Vjb25kcy4gVXN1YWxseSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0gb2YgdERILCB0V0ggYW5kIHRSRUguIEEgbmVnYXRpdmUgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGlzIGNoYXJhY3RlcmlzdGljIGlzbid0IGtub3duLgorICogQGFkZHJlc3Nfc2V0dXBfaW5fbnM6ICAgICAgVGhlIGFkZHJlc3Mgc2V0dXAgdGltZSwgaW4gbmFub3NlY29uZHMuIFVzdWFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXhpbXVtIG9mIHRDTFMsIHRDUyBhbmQgdEFMUy4gQSBuZWdhdGl2ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5kaWNhdGVzIHRoaXMgY2hhcmFjdGVyaXN0aWMgaXNuJ3Qga25vd24uCisgKiBAZ3BtaV9zYW1wbGVfZGVsYXlfaW5fbnM6ICBBIEdQTUktc3BlY2lmaWMgdGltaW5nIHBhcmFtZXRlci4gQSBuZWdhdGl2ZSB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoaXMgY2hhcmFjdGVyaXN0aWMgaXNuJ3Qga25vd24uCisgKiBAdFJFQV9pbl9uczogICAgICAgICAgICAgICB0UkVBLCBpbiBuYW5vc2Vjb25kcywgZnJvbSB0aGUgZGF0YSBzaGVldC4gQQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoaXMgY2hhcmFjdGVyaXN0aWMgaXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duLgorICogQHRSTE9IX2luX25zOiAgICAgICAgICAgICAgdFJMT0gsIGluIG5hbm9zZWNvbmRzLCBmcm9tIHRoZSBkYXRhIHNoZWV0LiBBCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhpcyBjaGFyYWN0ZXJpc3RpYyBpc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd24uCisgKiBAdFJIT0hfaW5fbnM6ICAgICAgICAgICAgICB0UkhPSCwgaW4gbmFub3NlY29uZHMsIGZyb20gdGhlIGRhdGEgc2hlZXQuIEEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGlzIGNoYXJhY3RlcmlzdGljIGlzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93bi4KKyAqLworc3RydWN0IG5hbmRfdGltaW5nIHsKKwlpbnQ4X3QgIGRhdGFfc2V0dXBfaW5fbnM7CisJaW50OF90ICBkYXRhX2hvbGRfaW5fbnM7CisJaW50OF90ICBhZGRyZXNzX3NldHVwX2luX25zOworCWludDhfdCAgZ3BtaV9zYW1wbGVfZGVsYXlfaW5fbnM7CisJaW50OF90ICB0UkVBX2luX25zOworCWludDhfdCAgdFJMT0hfaW5fbnM7CisJaW50OF90ICB0UkhPSF9pbl9uczsKK307CisKK3N0cnVjdCBncG1pX25hbmRfZGF0YSB7CisJLyogU3lzdGVtIEludGVyZmFjZSAqLworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKKwlzdHJ1Y3QgZ3BtaV9uYW5kX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCisJLyogUmVzb3VyY2VzICovCisJc3RydWN0IHJlc291cmNlcwlyZXNvdXJjZXM7CisKKwkvKiBGbGFzaCBIYXJkd2FyZSAqLworCXN0cnVjdCBuYW5kX3RpbWluZwl0aW1pbmc7CisKKwkvKiBCQ0ggKi8KKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5CWJjaF9nZW9tZXRyeTsKKwlzdHJ1Y3QgY29tcGxldGlvbgliY2hfZG9uZTsKKworCS8qIE5BTkQgQm9vdCBpc3N1ZSAqLworCWJvb2wJCQlzd2FwX2Jsb2NrX21hcms7CisJc3RydWN0IGJvb3Rfcm9tX2dlb21ldHJ5IHJvbV9nZW9tZXRyeTsKKworCS8qIE1URCAvIE5BTkQgKi8KKwlzdHJ1Y3QgbmFuZF9jaGlwCW5hbmQ7CisJc3RydWN0IG10ZF9pbmZvCQltdGQ7CisKKwkvKiBHZW5lcmFsLXVzZSBWYXJpYWJsZXMgKi8KKwlpbnQJCQljdXJyZW50X2NoaXA7CisJdW5zaWduZWQgaW50CQljb21tYW5kX2xlbmd0aDsKKworCS8qIHBhc3NlZCBmcm9tIHVwcGVyIGxheWVyICovCisJdWludDhfdAkJCSp1cHBlcl9idWY7CisJaW50CQkJdXBwZXJfbGVuOworCisJLyogZm9yIERNQSBvcGVyYXRpb25zICovCisJYm9vbAkJCWRpcmVjdF9kbWFfbWFwX29rOworCisJc3RydWN0IHNjYXR0ZXJsaXN0CWNtZF9zZ2w7CisJY2hhcgkJCSpjbWRfYnVmZmVyOworCisJc3RydWN0IHNjYXR0ZXJsaXN0CWRhdGFfc2dsOworCWNoYXIJCQkqZGF0YV9idWZmZXJfZG1hOworCisJdm9pZAkJCSpwYWdlX2J1ZmZlcl92aXJ0OworCWRtYV9hZGRyX3QJCXBhZ2VfYnVmZmVyX3BoeXM7CisJdW5zaWduZWQgaW50CQlwYWdlX2J1ZmZlcl9zaXplOworCisJdm9pZAkJCSpwYXlsb2FkX3ZpcnQ7CisJZG1hX2FkZHJfdAkJcGF5bG9hZF9waHlzOworCisJdm9pZAkJCSphdXhpbGlhcnlfdmlydDsKKwlkbWFfYWRkcl90CQlhdXhpbGlhcnlfcGh5czsKKworCS8qIERNQSBjaGFubmVscyAqLworI2RlZmluZSBETUFfQ0hBTlMJCTgKKwlzdHJ1Y3QgZG1hX2NoYW4JCSpkbWFfY2hhbnNbRE1BX0NIQU5TXTsKKwlzdHJ1Y3QgbXhzX2RtYV9kYXRhCWRtYV9kYXRhOworCWVudW0gZG1hX29wc190eXBlCWxhc3RfZG1hX3R5cGU7CisJZW51bSBkbWFfb3BzX3R5cGUJZG1hX3R5cGU7CisJc3RydWN0IGNvbXBsZXRpb24JZG1hX2RvbmU7CisKKwkvKiBwcml2YXRlICovCisJdm9pZAkJCSpwcml2YXRlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZ3BtaV9uZmNfaGFyZHdhcmVfdGltaW5nIC0gR1BNSSBoYXJkd2FyZSB0aW1pbmcgcGFyYW1ldGVycy4KKyAqIEBkYXRhX3NldHVwX2luX2N5Y2xlczogICAgICBUaGUgZGF0YSBzZXR1cCB0aW1lLCBpbiBjeWNsZXMuCisgKiBAZGF0YV9ob2xkX2luX2N5Y2xlczogICAgICAgVGhlIGRhdGEgaG9sZCB0aW1lLCBpbiBjeWNsZXMuCisgKiBAYWRkcmVzc19zZXR1cF9pbl9jeWNsZXM6ICAgVGhlIGFkZHJlc3Mgc2V0dXAgdGltZSwgaW4gY3ljbGVzLgorICogQHVzZV9oYWxmX3BlcmlvZHM6ICAgICAgICAgIEluZGljYXRlcyB0aGUgY2xvY2sgaXMgcnVubmluZyBzbG93bHksIHNvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQyBETEwgc2hvdWxkIHVzZSBoYWxmLXBlcmlvZHMuCisgKiBAc2FtcGxlX2RlbGF5X2ZhY3RvcjogICAgICAgVGhlIHNhbXBsZSBkZWxheSBmYWN0b3IuCisgKi8KK3N0cnVjdCBncG1pX25mY19oYXJkd2FyZV90aW1pbmcgeworCXVpbnQ4X3QgIGRhdGFfc2V0dXBfaW5fY3ljbGVzOworCXVpbnQ4X3QgIGRhdGFfaG9sZF9pbl9jeWNsZXM7CisJdWludDhfdCAgYWRkcmVzc19zZXR1cF9pbl9jeWNsZXM7CisJYm9vbCAgICAgdXNlX2hhbGZfcGVyaW9kczsKKwl1aW50OF90ICBzYW1wbGVfZGVsYXlfZmFjdG9yOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdGltaW5nX3RocmVzaG9kIC0gVGltaW5nIHRocmVzaG9sZAorICogQG1heF9kYXRhX3NldHVwX2N5Y2xlczogICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGRhdGEgc2V0dXAgY3ljbGVzIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBleHByZXNzZWQgaW4gdGhlIGhhcmR3YXJlLgorICogQGludGVybmFsX2RhdGFfc2V0dXBfaW5fbnM6ICAgVGhlIHRpbWUsIGluIG5zLCB0aGF0IHRoZSBORkMgaGFyZHdhcmUgcmVxdWlyZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkYXRhIHJlYWQgaW50ZXJuYWwgc2V0dXAuIEluIHRoZSBSZWZlcmVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbnVhbCwgc2VlIHRoZSBjaGFwdGVyICJIaWdoLVNwZWVkIE5BTkQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWluZyIgZm9yIG1vcmUgZGV0YWlscy4KKyAqIEBtYXhfc2FtcGxlX2RlbGF5X2ZhY3RvcjogICAgIFRoZSBtYXhpbXVtIHNhbXBsZSBkZWxheSBmYWN0b3IgdGhhdCBjYW4gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0aGUgaGFyZHdhcmUuCisgKiBAbWF4X2RsbF9jbG9ja19wZXJpb2RfaW5fbnM6ICBUaGUgbWF4aW11bSBwZXJpb2Qgb2YgdGhlIEdQTUkgY2xvY2sgdGhhdCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSBkZWxheSBETEwgaGFyZHdhcmUgY2FuIHBvc3NpYmx5IHdvcmsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggKHRoZSBETEwgaXMgdW51c2FibGUgd2l0aCBsb25nZXIgcGVyaW9kcykuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgZnVsbC1jeWNsZSBwZXJpb2QgaXMgZ3JlYXRlciB0aGFuIEhBTEYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUsIHRoZSBETEwgbXVzdCBiZSBjb25maWd1cmVkIHRvIHVzZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsZi1wZXJpb2RzLgorICogQG1heF9kbGxfZGVsYXlfaW5fbnM6ICAgICAgICAgVGhlIG1heGltdW0gYW1vdW50IG9mIGRlbGF5LCBpbiBucywgdGhhdCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERMTCBjYW4gaW1wbGVtZW50LgorICogQGNsb2NrX2ZyZXF1ZW5jeV9pbl9oejogICAgICAgVGhlIGNsb2NrIGZyZXF1ZW5jeSwgaW4gSHosIGR1cmluZyB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS9PIHRyYW5zYWN0aW9uLiBJZiBubyBJL08gdHJhbnNhY3Rpb24gaXMgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLCB0aGlzIGlzIHRoZSBjbG9jayBmcmVxdWVuY3kgZHVyaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbW9zdCByZWNlbnQgSS9PIHRyYW5zYWN0aW9uLgorICovCitzdHJ1Y3QgdGltaW5nX3RocmVzaG9kIHsKKwljb25zdCB1bnNpZ25lZCBpbnQgICAgICBtYXhfY2hpcF9jb3VudDsKKwljb25zdCB1bnNpZ25lZCBpbnQgICAgICBtYXhfZGF0YV9zZXR1cF9jeWNsZXM7CisJY29uc3QgdW5zaWduZWQgaW50ICAgICAgaW50ZXJuYWxfZGF0YV9zZXR1cF9pbl9uczsKKwljb25zdCB1bnNpZ25lZCBpbnQgICAgICBtYXhfc2FtcGxlX2RlbGF5X2ZhY3RvcjsKKwljb25zdCB1bnNpZ25lZCBpbnQgICAgICBtYXhfZGxsX2Nsb2NrX3BlcmlvZF9pbl9uczsKKwljb25zdCB1bnNpZ25lZCBpbnQgICAgICBtYXhfZGxsX2RlbGF5X2luX25zOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNsb2NrX2ZyZXF1ZW5jeV9pbl9oejsKKworfTsKKworLyogQ29tbW9uIFNlcnZpY2VzICovCitleHRlcm4gaW50IGNvbW1vbl9uZmNfc2V0X2dlb21ldHJ5KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqKTsKK2V4dGVybiBzdHJ1Y3QgZG1hX2NoYW4gKmdldF9kbWFfY2hhbihzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gdm9pZCBwcmVwYXJlX2RhdGFfZG1hKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqLAorCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRyKTsKK2V4dGVybiBpbnQgc3RhcnRfZG1hX3dpdGhvdXRfYmNoX2lycShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKiwKKwkJCQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKik7CitleHRlcm4gaW50IHN0YXJ0X2RtYV93aXRoX2JjaF9pcnEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICosCisJCQkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICopOworCisvKiBHUE1JLU5BTkQgaGVscGVyIGZ1bmN0aW9uIGxpYnJhcnkgKi8KK2V4dGVybiBpbnQgZ3BtaV9pbml0KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqKTsKK2V4dGVybiB2b2lkIGdwbWlfY2xlYXJfYmNoKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqKTsKK2V4dGVybiB2b2lkIGdwbWlfZHVtcF9pbmZvKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqKTsKK2V4dGVybiBpbnQgYmNoX3NldF9nZW9tZXRyeShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gaW50IGdwbWlfaXNfcmVhZHkoc3RydWN0IGdwbWlfbmFuZF9kYXRhICosIHVuc2lnbmVkIGNoaXApOworZXh0ZXJuIGludCBncG1pX3NlbmRfY29tbWFuZChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gdm9pZCBncG1pX2JlZ2luKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqKTsKK2V4dGVybiB2b2lkIGdwbWlfZW5kKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqKTsKK2V4dGVybiBpbnQgZ3BtaV9yZWFkX2RhdGEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICopOworZXh0ZXJuIGludCBncG1pX3NlbmRfZGF0YShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gaW50IGdwbWlfc2VuZF9wYWdlKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqLAorCQkJZG1hX2FkZHJfdCBwYXlsb2FkLCBkbWFfYWRkcl90IGF1eGlsaWFyeSk7CitleHRlcm4gaW50IGdwbWlfcmVhZF9wYWdlKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqLAorCQkJZG1hX2FkZHJfdCBwYXlsb2FkLCBkbWFfYWRkcl90IGF1eGlsaWFyeSk7CisKKy8qIEJDSCA6IFN0YXR1cyBCbG9jayBDb21wbGV0aW9uIENvZGVzICovCisjZGVmaW5lIFNUQVRVU19HT09ECQkweDAwCisjZGVmaW5lIFNUQVRVU19FUkFTRUQJCTB4ZmYKKyNkZWZpbmUgU1RBVFVTX1VOQ09SUkVDVEFCTEUJMHhmZQorCisvKiBVc2UgdGhlIHBsYXRmb3JtX2lkIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBBcmNocy4gKi8KKyNkZWZpbmUgSVNfTVgyMwkJCTB4MQorI2RlZmluZSBJU19NWDI4CQkJMHgyCisjZGVmaW5lIEdQTUlfSVNfTVgyMyh4KQkJKCh4KS0+cGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhID09IElTX01YMjMpCisjZGVmaW5lIEdQTUlfSVNfTVgyOCh4KQkJKCh4KS0+cGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhID09IElTX01YMjgpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktcmVncy5oIGIvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0MzEyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktcmVncy5oCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogRnJlZXNjYWxlIEdQTUkgTkFORCBGbGFzaCBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwOC0yMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBFbWJlZGRlZCBBbGxleSBTb2x1dGlvbnMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisjaWZuZGVmIF9fR1BNSV9OQU5EX0dQTUlfUkVHU19ICisjZGVmaW5lIF9fR1BNSV9OQU5EX0dQTUlfUkVHU19ICisKKyNkZWZpbmUgSFdfR1BNSV9DVFJMMAkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBIV19HUE1JX0NUUkwwX1NFVAkJCQkweDAwMDAwMDA0CisjZGVmaW5lIEhXX0dQTUlfQ1RSTDBfQ0xSCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgSFdfR1BNSV9DVFJMMF9UT0cJCQkJMHgwMDAwMDAwYworCisjZGVmaW5lIEJQX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFCQkJMjQKKyNkZWZpbmUgQk1fR1BNSV9DVFJMMF9DT01NQU5EX01PREUJKDMgPDwgQlBfR1BNSV9DVFJMMF9DT01NQU5EX01PREUpCisjZGVmaW5lIEJGX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFKHYpCVwKKwkoKCh2KSA8PCBCUF9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERSkgJiBCTV9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERSkKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1dSSVRFCQkweDAKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1JFQUQJCTB4MQorI2RlZmluZSBCVl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERV9fUkVBRF9BTkRfQ09NUEFSRQkweDIKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1dBSVRfRk9SX1JFQURZCTB4MworCisjZGVmaW5lIEJNX0dQTUlfQ1RSTDBfV09SRF9MRU5HVEgJCQkoMSA8PCAyMykKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMF9XT1JEX0xFTkdUSF9fMTZfQklUCQkweDAKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMF9XT1JEX0xFTkdUSF9fOF9CSVQJCTB4MQorCisvKgorICogIERpZmZlcmVuY2UgaW4gTE9DS19DUyBiZXR3ZWVuIGlteDIzIGFuZCBpbXgyOCA6CisgKiAgVGhpcyBiaXQgbWF5IGltcGFjdCB0aGUgX1BPV0VSXyBjb25zdW1wdGlvbi4gU28gc29tZSBjaGlwcworICogIGRvIG5vdCBzZXQgaXQuCisgKi8KKyNkZWZpbmUgTVgyM19CUF9HUE1JX0NUUkwwX0xPQ0tfQ1MJCQkyMgorI2RlZmluZSBNWDI4X0JQX0dQTUlfQ1RSTDBfTE9DS19DUwkJCTI3CisjZGVmaW5lIExPQ0tfQ1NfRU5BQkxFCQkJCQkweDEKKyNkZWZpbmUgQkZfR1BNSV9DVFJMMF9MT0NLX0NTKHYsIHgpCQkJMHgwCisKKy8qIERpZmZlcmVuY2UgaW4gQ1MgYmV0d2VlbiBpbXgyMyBhbmQgaW14MjggKi8KKyNkZWZpbmUgQlBfR1BNSV9DVFJMMF9DUwkJCQkyMAorI2RlZmluZSBNWDIzX0JNX0dQTUlfQ1RSTDBfQ1MJCSgzIDw8IEJQX0dQTUlfQ1RSTDBfQ1MpCisjZGVmaW5lIE1YMjhfQk1fR1BNSV9DVFJMMF9DUwkJKDcgPDwgQlBfR1BNSV9DVFJMMF9DUykKKyNkZWZpbmUgQkZfR1BNSV9DVFJMMF9DUyh2LCB4KQkJKCgodikgPDwgQlBfR1BNSV9DVFJMMF9DUykgJiBcCisJCQkJCQkoR1BNSV9JU19NWDIzKCh4KSkgXAorCQkJCQkJPyBNWDIzX0JNX0dQTUlfQ1RSTDBfQ1MJXAorCQkJCQkJOiBNWDI4X0JNX0dQTUlfQ1RSTDBfQ1MpKQorCisjZGVmaW5lIEJQX0dQTUlfQ1RSTDBfQUREUkVTUwkJCQkxNworI2RlZmluZSBCTV9HUE1JX0NUUkwwX0FERFJFU1MJCSgzIDw8IEJQX0dQTUlfQ1RSTDBfQUREUkVTUykKKyNkZWZpbmUgQkZfR1BNSV9DVFJMMF9BRERSRVNTKHYpCVwKKwkJKCgodikgPDwgQlBfR1BNSV9DVFJMMF9BRERSRVNTKSAmIEJNX0dQTUlfQ1RSTDBfQUREUkVTUykKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMF9BRERSRVNTX19OQU5EX0RBVEEJCTB4MAorI2RlZmluZSBCVl9HUE1JX0NUUkwwX0FERFJFU1NfX05BTkRfQ0xFCQkJMHgxCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDBfQUREUkVTU19fTkFORF9BTEUJCQkweDIKKworI2RlZmluZSBCTV9HUE1JX0NUUkwwX0FERFJFU1NfSU5DUkVNRU5UCQkJKDEgPDwgMTYpCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDBfQUREUkVTU19JTkNSRU1FTlRfX0RJU0FCTEVECTB4MAorI2RlZmluZSBCVl9HUE1JX0NUUkwwX0FERFJFU1NfSU5DUkVNRU5UX19FTkFCTEVECTB4MQorCisjZGVmaW5lIEJQX0dQTUlfQ1RSTDBfWEZFUl9DT1VOVAkJCTAKKyNkZWZpbmUgQk1fR1BNSV9DVFJMMF9YRkVSX0NPVU5UCSgweGZmZmYgPDwgQlBfR1BNSV9DVFJMMF9YRkVSX0NPVU5UKQorI2RlZmluZSBCRl9HUE1JX0NUUkwwX1hGRVJfQ09VTlQodikJXAorCQkoKCh2KSA8PCBCUF9HUE1JX0NUUkwwX1hGRVJfQ09VTlQpICYgQk1fR1BNSV9DVFJMMF9YRkVSX0NPVU5UKQorCisjZGVmaW5lIEhXX0dQTUlfQ09NUEFSRQkJCQkJMHgwMDAwMDAxMAorCisjZGVmaW5lIEhXX0dQTUlfRUNDQ1RSTAkJCQkJMHgwMDAwMDAyMAorI2RlZmluZSBIV19HUE1JX0VDQ0NUUkxfU0VUCQkJCTB4MDAwMDAwMjQKKyNkZWZpbmUgSFdfR1BNSV9FQ0NDVFJMX0NMUgkJCQkweDAwMDAwMDI4CisjZGVmaW5lIEhXX0dQTUlfRUNDQ1RSTF9UT0cJCQkJMHgwMDAwMDAyYworCisjZGVmaW5lIEJQX0dQTUlfRUNDQ1RSTF9FQ0NfQ01ECQkJCTEzCisjZGVmaW5lIEJNX0dQTUlfRUNDQ1RSTF9FQ0NfQ01ECQkoMyA8PCBCUF9HUE1JX0VDQ0NUUkxfRUNDX0NNRCkKKyNkZWZpbmUgQkZfR1BNSV9FQ0NDVFJMX0VDQ19DTUQodikJXAorCQkoKCh2KSA8PCBCUF9HUE1JX0VDQ0NUUkxfRUNDX0NNRCkgJiBCTV9HUE1JX0VDQ0NUUkxfRUNDX0NNRCkKKyNkZWZpbmUgQlZfR1BNSV9FQ0NDVFJMX0VDQ19DTURfX0JDSF9ERUNPREUJCTB4MAorI2RlZmluZSBCVl9HUE1JX0VDQ0NUUkxfRUNDX0NNRF9fQkNIX0VOQ09ERQkJMHgxCisKKyNkZWZpbmUgQk1fR1BNSV9FQ0NDVFJMX0VOQUJMRV9FQ0MJCQkoMSA8PCAxMikKKyNkZWZpbmUgQlZfR1BNSV9FQ0NDVFJMX0VOQUJMRV9FQ0NfX0VOQUJMRQkJMHgxCisjZGVmaW5lIEJWX0dQTUlfRUNDQ1RSTF9FTkFCTEVfRUNDX19ESVNBQkxFCQkweDAKKworI2RlZmluZSBCUF9HUE1JX0VDQ0NUUkxfQlVGRkVSX01BU0sJCQkwCisjZGVmaW5lIEJNX0dQTUlfRUNDQ1RSTF9CVUZGRVJfTUFTSwkoMHgxZmYgPDwgQlBfR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLKQorI2RlZmluZSBCRl9HUE1JX0VDQ0NUUkxfQlVGRkVSX01BU0sodikJXAorCSgoKHYpIDw8IEJQX0dQTUlfRUNDQ1RSTF9CVUZGRVJfTUFTSykgJiBCTV9HUE1JX0VDQ0NUUkxfQlVGRkVSX01BU0spCisjZGVmaW5lIEJWX0dQTUlfRUNDQ1RSTF9CVUZGRVJfTUFTS19fQkNIX0FVWE9OTFkJMHgxMDAKKyNkZWZpbmUgQlZfR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLX19CQ0hfUEFHRQkJMHgxRkYKKworI2RlZmluZSBIV19HUE1JX0VDQ0NPVU5UCQkJCTB4MDAwMDAwMzAKKyNkZWZpbmUgSFdfR1BNSV9QQVlMT0FECQkJCQkweDAwMDAwMDQwCisjZGVmaW5lIEhXX0dQTUlfQVVYSUxJQVJZCQkJCTB4MDAwMDAwNTAKKyNkZWZpbmUgSFdfR1BNSV9DVFJMMQkJCQkJMHgwMDAwMDA2MAorI2RlZmluZSBIV19HUE1JX0NUUkwxX1NFVAkJCQkweDAwMDAwMDY0CisjZGVmaW5lIEhXX0dQTUlfQ1RSTDFfQ0xSCQkJCTB4MDAwMDAwNjgKKyNkZWZpbmUgSFdfR1BNSV9DVFJMMV9UT0cJCQkJMHgwMDAwMDA2YworCisjZGVmaW5lIEJNX0dQTUlfQ1RSTDFfQkNIX01PREUJCQkJKDEgPDwgMTgpCisKKyNkZWZpbmUgQlBfR1BNSV9DVFJMMV9ETExfRU5BQkxFCQkJMTcKKyNkZWZpbmUgQk1fR1BNSV9DVFJMMV9ETExfRU5BQkxFCSgxIDw8IEJQX0dQTUlfQ1RSTDFfRExMX0VOQUJMRSkKKworI2RlZmluZSBCUF9HUE1JX0NUUkwxX0hBTEZfUEVSSU9ECQkJMTYKKyNkZWZpbmUgQk1fR1BNSV9DVFJMMV9IQUxGX1BFUklPRAkoMSA8PCBCUF9HUE1JX0NUUkwxX0hBTEZfUEVSSU9EKQorCisjZGVmaW5lIEJQX0dQTUlfQ1RSTDFfUkROX0RFTEFZCQkJCTEyCisjZGVmaW5lIEJNX0dQTUlfQ1RSTDFfUkROX0RFTEFZCQkoMHhmIDw8IEJQX0dQTUlfQ1RSTDFfUkROX0RFTEFZKQorI2RlZmluZSBCRl9HUE1JX0NUUkwxX1JETl9ERUxBWSh2KQlcCisJCSgoKHYpIDw8IEJQX0dQTUlfQ1RSTDFfUkROX0RFTEFZKSAmIEJNX0dQTUlfQ1RSTDFfUkROX0RFTEFZKQorCisjZGVmaW5lIEJNX0dQTUlfQ1RSTDFfREVWX1JFU0VUCQkJCSgxIDw8IDMpCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDFfREVWX1JFU0VUX19FTkFCTEVECQkweDAKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMV9ERVZfUkVTRVRfX0RJU0FCTEVECQkweDEKKworI2RlZmluZSBCTV9HUE1JX0NUUkwxX0FUQV9JUlFSRFlfUE9MQVJJVFkJCSgxIDw8IDIpCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDFfQVRBX0lSUVJEWV9QT0xBUklUWV9fQUNUSVZFTE9XCTB4MAorI2RlZmluZSBCVl9HUE1JX0NUUkwxX0FUQV9JUlFSRFlfUE9MQVJJVFlfX0FDVElWRUhJR0gJMHgxCisKKyNkZWZpbmUgQk1fR1BNSV9DVFJMMV9DQU1FUkFfTU9ERQkJCSgxIDw8IDEpCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDFfR1BNSV9NT0RFX19OQU5ECQkJMHgwCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDFfR1BNSV9NT0RFX19BVEEJCQkweDEKKworI2RlZmluZSBCTV9HUE1JX0NUUkwxX0dQTUlfTU9ERQkJCQkoMSA8PCAwKQorCisjZGVmaW5lIEhXX0dQTUlfVElNSU5HMAkJCQkJMHgwMDAwMDA3MAorCisjZGVmaW5lIEJQX0dQTUlfVElNSU5HMF9BRERSRVNTX1NFVFVQCQkJMTYKKyNkZWZpbmUgQk1fR1BNSV9USU1JTkcwX0FERFJFU1NfU0VUVVAJKDB4ZmYgPDwgQlBfR1BNSV9USU1JTkcwX0FERFJFU1NfU0VUVVApCisjZGVmaW5lIEJGX0dQTUlfVElNSU5HMF9BRERSRVNTX1NFVFVQKHYpCVwKKwkoKCh2KSA8PCBCUF9HUE1JX1RJTUlORzBfQUREUkVTU19TRVRVUCkgJiBCTV9HUE1JX1RJTUlORzBfQUREUkVTU19TRVRVUCkKKworI2RlZmluZSBCUF9HUE1JX1RJTUlORzBfREFUQV9IT0xECQkJOAorI2RlZmluZSBCTV9HUE1JX1RJTUlORzBfREFUQV9IT0xECSgweGZmIDw8IEJQX0dQTUlfVElNSU5HMF9EQVRBX0hPTEQpCisjZGVmaW5lIEJGX0dQTUlfVElNSU5HMF9EQVRBX0hPTEQodikJCVwKKwkoKCh2KSA8PCBCUF9HUE1JX1RJTUlORzBfREFUQV9IT0xEKSAmIEJNX0dQTUlfVElNSU5HMF9EQVRBX0hPTEQpCisKKyNkZWZpbmUgQlBfR1BNSV9USU1JTkcwX0RBVEFfU0VUVVAJCQkwCisjZGVmaW5lIEJNX0dQTUlfVElNSU5HMF9EQVRBX1NFVFVQCSgweGZmIDw8IEJQX0dQTUlfVElNSU5HMF9EQVRBX1NFVFVQKQorI2RlZmluZSBCRl9HUE1JX1RJTUlORzBfREFUQV9TRVRVUCh2KQkJXAorCSgoKHYpIDw8IEJQX0dQTUlfVElNSU5HMF9EQVRBX1NFVFVQKSAmIEJNX0dQTUlfVElNSU5HMF9EQVRBX1NFVFVQKQorCisjZGVmaW5lIEhXX0dQTUlfVElNSU5HMQkJCQkJMHgwMDAwMDA4MAorI2RlZmluZSBCUF9HUE1JX1RJTUlORzFfQlVTWV9USU1FT1VUCQkJMTYKKworI2RlZmluZSBIV19HUE1JX1RJTUlORzIJCQkJCTB4MDAwMDAwOTAKKyNkZWZpbmUgSFdfR1BNSV9EQVRBCQkJCQkweDAwMDAwMGEwCisKKy8qIE1YMjggdXNlcyB0aGlzIHRvIGRldGVjdCBSRUFEWS4gKi8KKyNkZWZpbmUgSFdfR1BNSV9TVEFUCQkJCQkweDAwMDAwMGIwCisjZGVmaW5lIE1YMjhfQlBfR1BNSV9TVEFUX1JFQURZX0JVU1kJCQkyNAorI2RlZmluZSBNWDI4X0JNX0dQTUlfU1RBVF9SRUFEWV9CVVNZCSgweGZmIDw8IE1YMjhfQlBfR1BNSV9TVEFUX1JFQURZX0JVU1kpCisjZGVmaW5lIE1YMjhfQkZfR1BNSV9TVEFUX1JFQURZX0JVU1kodikJCVwKKwkoKCh2KSA8PCBNWDI4X0JQX0dQTUlfU1RBVF9SRUFEWV9CVVNZKSAmIE1YMjhfQk1fR1BNSV9TVEFUX1JFQURZX0JVU1kpCisKKy8qIE1YMjMgdXNlcyB0aGlzIHRvIGRldGVjdCBSRUFEWS4gKi8KKyNkZWZpbmUgSFdfR1BNSV9ERUJVRwkJCQkJMHgwMDAwMDBjMAorI2RlZmluZSBNWDIzX0JQX0dQTUlfREVCVUdfUkVBRFkwCQkJMjgKKyNkZWZpbmUgTVgyM19CTV9HUE1JX0RFQlVHX1JFQURZMAkoMSA8PCBNWDIzX0JQX0dQTUlfREVCVUdfUkVBRFkwKQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2gxOTEwLmMgYi9kcml2ZXJzL210ZC9uYW5kL2gxOTEwLmMKaW5kZXggMDJhMDNlNi4uNWRjNmYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9oMTkxMC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvaDE5MTAuYwpAQCAtODEsOSArODEsNiBAQAogc3RhdGljIGludCBfX2luaXQgaDE5MTBfaW5pdCh2b2lkKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7Ci0JY29uc3QgY2hhciAqcGFydF90eXBlID0gMDsKLQlpbnQgbXRkX3BhcnRzX25iID0gMDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbXRkX3BhcnRzID0gMDsKIAl2b2lkIF9faW9tZW0gKm5hbmRhZGRyOwogCiAJaWYgKCFtYWNoaW5lX2lzX2gxOTAwKCkpCkBAIC0xMzYsMjIgKzEzMywxMCBAQAogCQlpb3VubWFwKCh2b2lkICopbmFuZGFkZHIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLQltdGRfcGFydHNfbmIgPSBwYXJzZV9jbWRsaW5lX3BhcnRpdGlvbnMoaDE5MTBfbmFuZF9tdGQsICZtdGRfcGFydHMsICJoMTkxMC1uYW5kIik7Ci0JaWYgKG10ZF9wYXJ0c19uYiA+IDApCi0JCXBhcnRfdHlwZSA9ICJjb21tYW5kIGxpbmUiOwotCWVsc2UKLQkJbXRkX3BhcnRzX25iID0gMDsKLSNlbmRpZgotCWlmIChtdGRfcGFydHNfbmIgPT0gMCkgewotCQltdGRfcGFydHMgPSBwYXJ0aXRpb25faW5mbzsKLQkJbXRkX3BhcnRzX25iID0gTlVNX1BBUlRJVElPTlM7Ci0JCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwotCX0KIAogCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCi0JcHJpbnRrKEtFUk5fTk9USUNFICJVc2luZyAlcyBwYXJ0aXRpb24gZGVmaW5pdGlvblxuIiwgcGFydF90eXBlKTsKLQltdGRfZGV2aWNlX3JlZ2lzdGVyKGgxOTEwX25hbmRfbXRkLCBtdGRfcGFydHMsIG10ZF9wYXJ0c19uYik7CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihoMTkxMF9uYW5kX210ZCwgTlVMTCwgMCwKKwkJCXBhcnRpdGlvbl9pbmZvLCBOVU1fUEFSVElUSU9OUyk7CiAKIAkvKiBSZXR1cm4gaGFwcHkgKi8KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvano0NzQwX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvano0NzQwX25hbmQuYwppbmRleCA2ZTgxM2RhLi5lMjY2NDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2p6NDc0MF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9qejQ3NDBfbmFuZC5jCkBAIC0yNTEsMTAgKzI1MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyJjbWRsaW5lIiwgTlVMTH07Ci0jZW5kaWYKLQogc3RhdGljIGludCBqel9uYW5kX2lvcmVtYXBfcmVzb3VyY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcmVzb3VyY2UgKipyZXMsIHZvaWQgX19pb21lbSAqKmJhc2UpCiB7CkBAIC0yOTksOCArMjk1LDYgQEAKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwOwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCXN0cnVjdCBqel9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRpdGlvbl9pbmZvOwotCWludCBudW1fcGFydGl0aW9ucyA9IDA7CiAKIAluYW5kID0ga3phbGxvYyhzaXplb2YoKm5hbmQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5hbmQpIHsKQEAgLTM3MywxNSArMzY3LDkgQEAKIAkJZ290byBlcnJfZ3Bpb19mcmVlOwogCX0KIAotI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwotCW51bV9wYXJ0aXRpb25zID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0X3Byb2JlcywKLQkJCQkJCSZwYXJ0aXRpb25faW5mbywgMCk7Ci0jZW5kaWYKLQlpZiAobnVtX3BhcnRpdGlvbnMgPD0gMCAmJiBwZGF0YSkgewotCQludW1fcGFydGl0aW9ucyA9IHBkYXRhLT5udW1fcGFydGl0aW9uczsKLQkJcGFydGl0aW9uX2luZm8gPSBwZGF0YS0+cGFydGl0aW9uczsKLQl9Ci0JcmV0ID0gbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIHBhcnRpdGlvbl9pbmZvLCBudW1fcGFydGl0aW9ucyk7CisJcmV0ID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIE5VTEwsIDAsCisJCQlwZGF0YSA/IHBkYXRhLT5wYXJ0aXRpb25zIDogTlVMTCwKKwkJCXBkYXRhID8gcGRhdGEtPm51bV9wYXJ0aXRpb25zIDogMCk7CiAKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgbXRkIGRldmljZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL21wYzUxMjFfbmZjLmMgYi9kcml2ZXJzL210ZC9uYW5kL21wYzUxMjFfbmZjLmMKaW5kZXggZWIxZmJhYy4uNWVkZTY0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9tcGM1MTIxX25mYy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbXBjNTEyMV9uZmMuYwpAQCAtMTMxLDggKzEzMSw2IEBACiAKIHN0YXRpYyB2b2lkIG1wYzUxMjFfbmZjX2RvbmUoc3RydWN0IG10ZF9pbmZvICptdGQpOwogCi1zdGF0aWMgY29uc3QgY2hhciAqbXBjNTEyMV9uZmNfcHByb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0KIC8qIFJlYWQgTkZDIHJlZ2lzdGVyICovCiBzdGF0aWMgaW5saW5lIHUxNiBuZmNfcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludCByZWcpCiB7CkBAIC02NTYsMTMgKzY1NCwxMyBAQAogCXN0cnVjdCBtcGM1MTIxX25mY19wcnYgKnBydjsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwOwogCXVuc2lnbmVkIGxvbmcgcmVnc19wYWRkciwgcmVnc19zaXplOwogCWNvbnN0IF9fYmUzMiAqY2hpcHNfbm87CiAJaW50IHJlc2V0dGltZSA9IDA7CiAJaW50IHJldHZhbCA9IDA7CiAJaW50IHJldiwgbGVuOworCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSBwcGRhdGE7CiAKIAkvKgogCSAqIENoZWNrIFNvQyByZXZpc2lvbi4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgb25seSBORkMKQEAgLTcyNyw2ICs3MjUsNyBAQAogCX0KIAogCW10ZC0+bmFtZSA9ICJNUEM1MTIxIE5BTkQiOworCXBwZGF0YS5vZl9ub2RlID0gZG47CiAJY2hpcC0+ZGV2X3JlYWR5ID0gbXBjNTEyMV9uZmNfZGV2X3JlYWR5OwogCWNoaXAtPmNtZGZ1bmMgPSBtcGM1MTIxX25mY19jb21tYW5kOwogCWNoaXAtPnJlYWRfYnl0ZSA9IG1wYzUxMjFfbmZjX3JlYWRfYnl0ZTsKQEAgLTczNSw3ICs3MzQsOCBAQAogCWNoaXAtPndyaXRlX2J1ZiA9IG1wYzUxMjFfbmZjX3dyaXRlX2J1ZjsKIAljaGlwLT52ZXJpZnlfYnVmID0gbXBjNTEyMV9uZmNfdmVyaWZ5X2J1ZjsKIAljaGlwLT5zZWxlY3RfY2hpcCA9IG1wYzUxMjFfbmZjX3NlbGVjdF9jaGlwOwotCWNoaXAtPm9wdGlvbnMgPSBOQU5EX05PX0FVVE9JTkNSIHwgTkFORF9VU0VfRkxBU0hfQkJUOworCWNoaXAtPm9wdGlvbnMgPSBOQU5EX05PX0FVVE9JTkNSOworCWNoaXAtPmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIOwogCWNoaXAtPmVjYy5tb2RlID0gTkFORF9FQ0NfU09GVDsKIAogCS8qIFN1cHBvcnQgZXh0ZXJuYWwgY2hpcC1zZWxlY3QgbG9naWMgb24gQURTNTEyMSBib2FyZCAqLwpAQCAtODM3LDE5ICs4MzcsNyBAQAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG10ZCk7CiAKIAkvKiBSZWdpc3RlciBkZXZpY2UgaW4gTVREICovCi0JcmV0dmFsID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBtcGM1MTIxX25mY19wcHJvYmVzLCAmcGFydHMsIDApOwotI2lmZGVmIENPTkZJR19NVERfT0ZfUEFSVFMKLQlpZiAocmV0dmFsID09IDApCi0JCXJldHZhbCA9IG9mX210ZF9wYXJzZV9wYXJ0aXRpb25zKGRldiwgZG4sICZwYXJ0cyk7Ci0jZW5kaWYKLQlpZiAocmV0dmFsIDwgMCkgewotCQlkZXZfZXJyKGRldiwgIkVycm9yIHBhcnNpbmcgTVREIHBhcnRpdGlvbnMhXG4iKTsKLQkJZGV2bV9mcmVlX2lycShkZXYsIHBydi0+aXJxLCBtdGQpOwotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXJldHZhbCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBwYXJ0cywgcmV0dmFsKTsKKwlyZXR2YWwgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwgJnBwZGF0YSwgTlVMTCwgMCk7CiAJaWYgKHJldHZhbCkgewogCQlkZXZfZXJyKGRldiwgIkVycm9yIGFkZGluZyBNVEQgZGV2aWNlIVxuIik7CiAJCWRldm1fZnJlZV9pcnEoZGV2LCBwcnYtPmlycSwgbXRkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYwppbmRleCA5MGRmMzRjLi43NGE0M2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFuZC5jCkBAIC00MSw3ICs0MSw3IEBACiAKICNkZWZpbmUgbmZjX2lzX3YyMSgpCQkoY3B1X2lzX214MjUoKSB8fCBjcHVfaXNfbXgzNSgpKQogI2RlZmluZSBuZmNfaXNfdjEoKQkJKGNwdV9pc19teDMxKCkgfHwgY3B1X2lzX214MjcoKSB8fCBjcHVfaXNfbXgyMSgpKQotI2RlZmluZSBuZmNfaXNfdjNfMigpCQljcHVfaXNfbXg1MSgpCisjZGVmaW5lIG5mY19pc192M18yKCkJCShjcHVfaXNfbXg1MSgpIHx8IGNwdV9pc19teDUzKCkpCiAjZGVmaW5lIG5mY19pc192MygpCQluZmNfaXNfdjNfMigpCiAKIC8qIEFkZHJlc3NlcyBmb3IgTkZDIHJlZ2lzdGVycyAqLwpAQCAtMTQzLDcgKzE0Myw2IEBACiBzdHJ1Y3QgbXhjX25hbmRfaG9zdCB7CiAJc3RydWN0IG10ZF9pbmZvCQltdGQ7CiAJc3RydWN0IG5hbmRfY2hpcAluYW5kOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCiAJdm9pZAkJCSpzcGFyZTA7CkBAIC0zNTAsOCArMzQ5LDcgQEAKIAkJCXVkZWxheSgxKTsKIAkJfQogCQlpZiAobWF4X3JldHJpZXMgPCAwKQotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBJTlQgbm90IHNldFxuIiwKLQkJCSAgICAgIF9fZnVuY19fKTsKKwkJCXByX2RlYnVnKCIlczogSU5UIG5vdCBzZXRcbiIsIF9fZnVuY19fKTsKIAl9CiB9CiAKQEAgLTM3MSw3ICszNjksNyBAQAogICogd2FpdHMgZm9yIGNvbXBsZXRpb24uICovCiBzdGF0aWMgdm9pZCBzZW5kX2NtZF92MV92MihzdHJ1Y3QgbXhjX25hbmRfaG9zdCAqaG9zdCwgdWludDE2X3QgY21kLCBpbnQgdXNlaXJxKQogewotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJzZW5kX2NtZChob3N0LCAweCV4LCAlZClcbiIsIGNtZCwgdXNlaXJxKTsKKwlwcl9kZWJ1Zygic2VuZF9jbWQoaG9zdCwgMHgleCwgJWQpXG4iLCBjbWQsIHVzZWlycSk7CiAKIAl3cml0ZXcoY21kLCBORkNfVjFfVjJfRkxBU0hfQ01EKTsKIAl3cml0ZXcoTkZDX0NNRCwgTkZDX1YxX1YyX0NPTkZJRzIpOwpAQCAtMzg3LDggKzM4NSw3IEBACiAJCQl1ZGVsYXkoMSk7CiAJCX0KIAkJaWYgKG1heF9yZXRyaWVzIDwgMCkKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogUkVTRVQgZmFpbGVkXG4iLAotCQkJICAgICAgX19mdW5jX18pOworCQkJcHJfZGVidWcoIiVzOiBSRVNFVCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewogCQkvKiBXYWl0IGZvciBvcGVyYXRpb24gdG8gY29tcGxldGUgKi8KIAkJd2FpdF9vcF9kb25lKGhvc3QsIHVzZWlycSk7CkBAIC00MTEsNyArNDA4LDcgQEAKICAqIGEgTkFORCBjb21tYW5kLiAqLwogc3RhdGljIHZvaWQgc2VuZF9hZGRyX3YxX3YyKHN0cnVjdCBteGNfbmFuZF9ob3N0ICpob3N0LCB1aW50MTZfdCBhZGRyLCBpbnQgaXNsYXN0KQogewotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJzZW5kX2FkZHIoaG9zdCwgMHgleCAlZClcbiIsIGFkZHIsIGlzbGFzdCk7CisJcHJfZGVidWcoInNlbmRfYWRkcihob3N0LCAweCV4ICVkKVxuIiwgYWRkciwgaXNsYXN0KTsKIAogCXdyaXRldyhhZGRyLCBORkNfVjFfVjJfRkxBU0hfQUREUik7CiAJd3JpdGV3KE5GQ19BRERSLCBORkNfVjFfVjJfQ09ORklHMik7CkBAIC01NjEsOCArNTU4LDcgQEAKIAl1aW50MTZfdCBlY2Nfc3RhdHVzID0gcmVhZHcoTkZDX1YxX1YyX0VDQ19TVEFUVVNfUkVTVUxUKTsKIAogCWlmICgoKGVjY19zdGF0dXMgJiAweDMpID09IDIpIHx8ICgoZWNjX3N0YXR1cyA+PiAyKSA9PSAyKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLAotCQkgICAgICAiTVhDX05BTkQ6IEhXRUNDIHVuY29ycmVjdGFibGUgMi1iaXQgRUNDIGVycm9yXG4iKTsKKwkJcHJfZGVidWcoIk1YQ19OQU5EOiBIV0VDQyB1bmNvcnJlY3RhYmxlIDItYml0IEVDQyBlcnJvclxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTg0OSw3ICs4NDUsNyBAQAogCQl3cml0ZXcoMHhmZmZmLCBORkNfVjIxX1VOTE9DS0VORF9CTEtBRERSMyk7CiAJfSBlbHNlIGlmIChuZmNfaXNfdjEoKSkgewogCQl3cml0ZXcoMHgwLCBORkNfVjFfVU5MT0NLU1RBUlRfQkxLQUREUik7Ci0JCXdyaXRldygweDQwMDAsIE5GQ19WMV9VTkxPQ0tFTkRfQkxLQUREUik7CisJCXdyaXRldygweGZmZmYsIE5GQ19WMV9VTkxPQ0tFTkRfQkxLQUREUik7CiAJfSBlbHNlCiAJCUJVRygpOwogCkBAIC05MzIsOCArOTI4LDcgQEAKIAlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kX2NoaXAgPSBtdGQtPnByaXY7CiAJc3RydWN0IG14Y19uYW5kX2hvc3QgKmhvc3QgPSBuYW5kX2NoaXAtPnByaXY7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLAotCSAgICAgICJteGNfbmFuZF9jb21tYW5kIChjbWQgPSAweCV4LCBjb2wgPSAweCV4LCBwYWdlID0gMHgleClcbiIsCisJcHJfZGVidWcoIm14Y19uYW5kX2NvbW1hbmQgKGNtZCA9IDB4JXgsIGNvbCA9IDB4JXgsIHBhZ2UgPSAweCV4KVxuIiwKIAkgICAgICBjb21tYW5kLCBjb2x1bW4sIHBhZ2VfYWRkcik7CiAKIAkvKiBSZXNldCBjb21tYW5kIHN0YXRlIGluZm9ybWF0aW9uICovCkBAIC0xMDQ0LDcgKzEwMzksNyBAQAogCXN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBteGNfbmFuZF9ob3N0ICpob3N0OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCBlcnIgPSAwLCBfX21heWJlX3VudXNlZCBucl9wYXJ0cyA9IDA7CisJaW50IGVyciA9IDA7CiAJc3RydWN0IG5hbmRfZWNjbGF5b3V0ICpvb2Jfc21hbGxwYWdlLCAqb29iX2xhcmdlcGFnZTsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgTVREIGRldmljZSBzdHJ1Y3R1cmUgYW5kIHByaXZhdGUgZGF0YSAqLwpAQCAtMTE3OSw3ICsxMTc0LDcgQEAKIAkJdGhpcy0+YmJ0X3RkID0gJmJidF9tYWluX2Rlc2NyOwogCQl0aGlzLT5iYnRfbWQgPSAmYmJ0X21pcnJvcl9kZXNjcjsKIAkJLyogdXBkYXRlIGZsYXNoIGJhc2VkIGJidCAqLwotCQl0aGlzLT5vcHRpb25zIHw9IE5BTkRfVVNFX0ZMQVNIX0JCVDsKKwkJdGhpcy0+YmJ0X29wdGlvbnMgfD0gTkFORF9CQlRfVVNFX0ZMQVNIOwogCX0KIAogCWluaXRfY29tcGxldGlvbigmaG9zdC0+b3BfY29tcGxldGlvbik7CkBAIC0xMjMxLDE2ICsxMjI2LDggQEAKIAl9CiAKIAkvKiBSZWdpc3RlciB0aGUgcGFydGl0aW9ucyAqLwotCW5yX3BhcnRzID0KLQkgICAgcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0X3Byb2JlcywgJmhvc3QtPnBhcnRzLCAwKTsKLQlpZiAobnJfcGFydHMgPiAwKQotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgaG9zdC0+cGFydHMsIG5yX3BhcnRzKTsKLQllbHNlIGlmIChwZGF0YS0+cGFydHMpCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7Ci0JZWxzZSB7Ci0JCXByX2luZm8oIlJlZ2lzdGVyaW5nICVzIGFzIHdob2xlIGRldmljZVxuIiwgbXRkLT5uYW1lKTsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIE5VTEwsIDApOwotCX0KKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKG10ZCwgcGFydF9wcm9iZXMsIDAsCisJCQlwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBob3N0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKaW5kZXggYTQ2ZTliYi4uM2VkOWM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAgKiAgVE9ETzoKICAqCUVuYWJsZSBjYWNoZWQgcHJvZ3JhbW1pbmcgZm9yIDJrIHBhZ2Ugc2l6ZSBjaGlwcwogICoJQ2hlY2ssIGlmIG10ZC0+ZWNjdHlwZSBzaG91bGQgYmUgc2V0IHRvIE1URF9FQ0NfSFcKLSAqCWlmIHdlIGhhdmUgSFcgZWNjIHN1cHBvcnQuCisgKglpZiB3ZSBoYXZlIEhXIEVDQyBzdXBwb3J0LgogICoJVGhlIEFHLUFORCBjaGlwcyBoYXZlIG5pY2UgZmVhdHVyZXMgZm9yIHNwZWVkIGltcHJvdmVtZW50LAogICoJd2hpY2ggYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LiBSZWFkIC8gcHJvZ3JhbSA0IHBhZ2VzIGluIG9uZSBnby4KICAqCUJCVCB0YWJsZSBpcyBub3Qgc2VyaWFsaXplZCwgaGFzIHRvIGJlIGZpeGVkCkBAIC0xMTMsMjEgKzExMywxOSBAQAogCiAJLyogU3RhcnQgYWRkcmVzcyBtdXN0IGFsaWduIG9uIGJsb2NrIGJvdW5kYXJ5ICovCiAJaWYgKG9mcyAmICgoMSA8PCBjaGlwLT5waHlzX2VyYXNlX3NoaWZ0KSAtIDEpKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogVW5hbGlnbmVkIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiB1bmFsaWduZWQgYWRkcmVzc1xuIiwgX19mdW5jX18pOwogCQlyZXQgPSAtRUlOVkFMOwogCX0KIAogCS8qIExlbmd0aCBtdXN0IGFsaWduIG9uIGJsb2NrIGJvdW5kYXJ5ICovCiAJaWYgKGxlbiAmICgoMSA8PCBjaGlwLT5waHlzX2VyYXNlX3NoaWZ0KSAtIDEpKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogTGVuZ3RoIG5vdCBibG9jayBhbGlnbmVkXG4iLAotCQkJCQlfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogbGVuZ3RoIG5vdCBibG9jayBhbGlnbmVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCiAJLyogRG8gbm90IGFsbG93IHBhc3QgZW5kIG9mIGRldmljZSAqLwogCWlmIChvZnMgKyBsZW4gPiBtdGQtPnNpemUpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBQYXN0IGVuZCBvZiBkZXZpY2VcbiIsCi0JCQkJCV9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBwYXN0IGVuZCBvZiBkZXZpY2VcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAKQEAgLTEzNiw5ICsxMzQsOSBAQAogCiAvKioKICAqIG5hbmRfcmVsZWFzZV9kZXZpY2UgLSBbR0VORVJJQ10gcmVsZWFzZSBjaGlwCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiBEZXNlbGVjdCwgcmVsZWFzZSBjaGlwIGxvY2sgYW5kIHdha2UgdXAgYW55b25lIHdhaXRpbmcgb24gdGhlIGRldmljZQorICogRGVzZWxlY3QsIHJlbGVhc2UgY2hpcCBsb2NrIGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBkZXZpY2UuCiAgKi8KIHN0YXRpYyB2b2lkIG5hbmRfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CkBAIC0xNTcsOSArMTU1LDkgQEAKIAogLyoqCiAgKiBuYW5kX3JlYWRfYnl0ZSAtIFtERUZBVUxUXSByZWFkIG9uZSBieXRlIGZyb20gdGhlIGNoaXAKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgOGJpdCBidXN3aXRoCisgKiBEZWZhdWx0IHJlYWQgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2lkdGgKICAqLwogc3RhdGljIHVpbnQ4X3QgbmFuZF9yZWFkX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CkBAIC0xNjksMTAgKzE2NywxMSBAQAogCiAvKioKICAqIG5hbmRfcmVhZF9ieXRlMTYgLSBbREVGQVVMVF0gcmVhZCBvbmUgYnl0ZSBlbmRpYW5lc3MgYXdhcmUgZnJvbSB0aGUgY2hpcAotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIG5hbmRfcmVhZF9ieXRlMTYgLSBbREVGQVVMVF0gcmVhZCBvbmUgYnl0ZSBlbmRpYW5uZXNzIGF3YXJlIGZyb20gdGhlIGNoaXAKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogRGVmYXVsdCByZWFkIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aXRoIHdpdGgKLSAqIGVuZGlhbmVzcyBjb252ZXJzaW9uCisgKiBEZWZhdWx0IHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpZHRoIHdpdGggZW5kaWFubmVzcyBjb252ZXJzaW9uLgorICoKICAqLwogc3RhdGljIHVpbnQ4X3QgbmFuZF9yZWFkX2J5dGUxNihzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKQEAgLTE4MiwxMCArMTgxLDkgQEAKIAogLyoqCiAgKiBuYW5kX3JlYWRfd29yZCAtIFtERUZBVUxUXSByZWFkIG9uZSB3b3JkIGZyb20gdGhlIGNoaXAKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aCB3aXRob3V0Ci0gKiBlbmRpYW5lc3MgY29udmVyc2lvbgorICogRGVmYXVsdCByZWFkIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aWR0aCB3aXRob3V0IGVuZGlhbm5lc3MgY29udmVyc2lvbi4KICAqLwogc3RhdGljIHUxNiBuYW5kX3JlYWRfd29yZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKQEAgLTE5NSw4ICsxOTMsOCBAQAogCiAvKioKICAqIG5hbmRfc2VsZWN0X2NoaXAgLSBbREVGQVVMVF0gY29udHJvbCBDRSBsaW5lCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGNoaXBucjoJY2hpcG51bWJlciB0byBzZWxlY3QsIC0xIGZvciBkZXNlbGVjdAorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjaGlwbnI6IGNoaXBudW1iZXIgdG8gc2VsZWN0LCAtMSBmb3IgZGVzZWxlY3QKICAqCiAgKiBEZWZhdWx0IHNlbGVjdCBmdW5jdGlvbiBmb3IgMSBjaGlwIGRldmljZXMuCiAgKi8KQEAgLTIxOCwxMSArMjE2LDExIEBACiAKIC8qKgogICogbmFuZF93cml0ZV9idWYgLSBbREVGQVVMVF0gd3JpdGUgYnVmZmVyIHRvIGNoaXAKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYnVmOglkYXRhIGJ1ZmZlcgotICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjogZGF0YSBidWZmZXIKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQogICoKLSAqIERlZmF1bHQgd3JpdGUgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICogRGVmYXVsdCB3cml0ZSBmdW5jdGlvbiBmb3IgOGJpdCBidXN3aWR0aC4KICAqLwogc3RhdGljIHZvaWQgbmFuZF93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTIzNSwxMSArMjMzLDExIEBACiAKIC8qKgogICogbmFuZF9yZWFkX2J1ZiAtIFtERUZBVUxUXSByZWFkIGNoaXAgZGF0YSBpbnRvIGJ1ZmZlcgotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSBkYXRlCi0gKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IGJ1ZmZlciB0byBzdG9yZSBkYXRlCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAogICoKLSAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgOGJpdCBidXN3aXRoCisgKiBEZWZhdWx0IHJlYWQgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2lkdGguCiAgKi8KIHN0YXRpYyB2b2lkIG5hbmRfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTI1MiwxMSArMjUwLDExIEBACiAKIC8qKgogICogbmFuZF92ZXJpZnlfYnVmIC0gW0RFRkFVTFRdIFZlcmlmeSBjaGlwIGRhdGEgYWdhaW5zdCBidWZmZXIKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYnVmOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb21wYXJlCi0gKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGNvbXBhcmUKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byBjb21wYXJlCiAgKgotICogRGVmYXVsdCB2ZXJpZnkgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICogRGVmYXVsdCB2ZXJpZnkgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2lkdGguCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF92ZXJpZnlfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCiB7CkBAIC0yNzEsMTEgKzI2OSwxMSBAQAogCiAvKioKICAqIG5hbmRfd3JpdGVfYnVmMTYgLSBbREVGQVVMVF0gd3JpdGUgYnVmZmVyIHRvIGNoaXAKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYnVmOglkYXRhIGJ1ZmZlcgotICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjogZGF0YSBidWZmZXIKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQogICoKLSAqIERlZmF1bHQgd3JpdGUgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGgKKyAqIERlZmF1bHQgd3JpdGUgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpZHRoLgogICovCiBzdGF0aWMgdm9pZCBuYW5kX3dyaXRlX2J1ZjE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCiB7CkBAIC0yOTEsMTEgKzI4OSwxMSBAQAogCiAvKioKICAqIG5hbmRfcmVhZF9idWYxNiAtIFtERUZBVUxUXSByZWFkIGNoaXAgZGF0YSBpbnRvIGJ1ZmZlcgotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSBkYXRlCi0gKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IGJ1ZmZlciB0byBzdG9yZSBkYXRlCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAogICoKLSAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aAorICogRGVmYXVsdCByZWFkIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aWR0aC4KICAqLwogc3RhdGljIHZvaWQgbmFuZF9yZWFkX2J1ZjE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIGludCBsZW4pCiB7CkBAIC0zMTAsMTEgKzMwOCwxMSBAQAogCiAvKioKICAqIG5hbmRfdmVyaWZ5X2J1ZjE2IC0gW0RFRkFVTFRdIFZlcmlmeSBjaGlwIGRhdGEgYWdhaW5zdCBidWZmZXIKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYnVmOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb21wYXJlCi0gKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGNvbXBhcmUKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byBjb21wYXJlCiAgKgotICogRGVmYXVsdCB2ZXJpZnkgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGgKKyAqIERlZmF1bHQgdmVyaWZ5IGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aWR0aC4KICAqLwogc3RhdGljIGludCBuYW5kX3ZlcmlmeV9idWYxNihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQogewpAQCAtMzMyLDkgKzMzMCw5IEBACiAKIC8qKgogICogbmFuZF9ibG9ja19iYWQgLSBbREVGQVVMVF0gUmVhZCBiYWQgYmxvY2sgbWFya2VyIGZyb20gdGhlIGNoaXAKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAb2ZzOglvZmZzZXQgZnJvbSBkZXZpY2Ugc3RhcnQKLSAqIEBnZXRjaGlwOgkwLCBpZiB0aGUgY2hpcCBpcyBhbHJlYWR5IHNlbGVjdGVkCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mczogb2Zmc2V0IGZyb20gZGV2aWNlIHN0YXJ0CisgKiBAZ2V0Y2hpcDogMCwgaWYgdGhlIGNoaXAgaXMgYWxyZWFkeSBzZWxlY3RlZAogICoKICAqIENoZWNrLCBpZiB0aGUgYmxvY2sgaXMgYmFkLgogICovCkBAIC0zNDQsNyArMzQyLDcgQEAKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCXUxNiBiYWQ7CiAKLQlpZiAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5MQVNUUEFHRSkKKwlpZiAoY2hpcC0+YmJ0X29wdGlvbnMgJiBOQU5EX0JCVF9TQ0FOTEFTVFBBR0UpCiAJCW9mcyArPSBtdGQtPmVyYXNlc2l6ZSAtIG10ZC0+d3JpdGVzaXplOwogCiAJcGFnZSA9IChpbnQpKG9mcyA+PiBjaGlwLT5wYWdlX3NoaWZ0KSAmIGNoaXAtPnBhZ2VtYXNrOwpAQCAtMzg0LDExICszODIsMTEgQEAKIAogLyoqCiAgKiBuYW5kX2RlZmF1bHRfYmxvY2tfbWFya2JhZCAtIFtERUZBVUxUXSBtYXJrIGEgYmxvY2sgYmFkCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQG9mczoJb2Zmc2V0IGZyb20gZGV2aWNlIHN0YXJ0CisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mczogb2Zmc2V0IGZyb20gZGV2aWNlIHN0YXJ0CiAgKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYnkKLSAqIGEgaGFyZHdhcmUgc3BlY2lmaWMgZHJpdmVyLgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBoYXJkd2FyZQorICogc3BlY2lmaWMgZHJpdmVyLgogKi8KIHN0YXRpYyBpbnQgbmFuZF9kZWZhdWx0X2Jsb2NrX21hcmtiYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpCiB7CkBAIC0zOTYsNyArMzk0LDcgQEAKIAl1aW50OF90IGJ1ZlsyXSA9IHsgMCwgMCB9OwogCWludCBibG9jaywgcmV0LCBpID0gMDsKIAotCWlmIChjaGlwLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkxBU1RQQUdFKQorCWlmIChjaGlwLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5MQVNUUEFHRSkKIAkJb2ZzICs9IG10ZC0+ZXJhc2VzaXplIC0gbXRkLT53cml0ZXNpemU7CiAKIAkvKiBHZXQgYmxvY2sgbnVtYmVyICovCkBAIC00MDQsMzMgKzQwMiwzMSBAQAogCWlmIChjaGlwLT5iYnQpCiAJCWNoaXAtPmJidFtibG9jayA+PiAyXSB8PSAweDAxIDw8ICgoYmxvY2sgJiAweDAzKSA8PCAxKTsKIAotCS8qIERvIHdlIGhhdmUgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUgPyAqLwotCWlmIChjaGlwLT5vcHRpb25zICYgTkFORF9VU0VfRkxBU0hfQkJUKQorCS8qIERvIHdlIGhhdmUgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGU/ICovCisJaWYgKGNoaXAtPmJidF9vcHRpb25zICYgTkFORF9CQlRfVVNFX0ZMQVNIKQogCQlyZXQgPSBuYW5kX3VwZGF0ZV9iYnQobXRkLCBvZnMpOwogCWVsc2UgeworCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOworCiAJCW5hbmRfZ2V0X2RldmljZShjaGlwLCBtdGQsIEZMX1dSSVRJTkcpOwogCi0JCS8qIFdyaXRlIHRvIGZpcnN0IHR3byBwYWdlcyBhbmQgdG8gYnl0ZSAxIGFuZCA2IGlmIG5lY2Vzc2FyeS4KLQkJICogSWYgd2Ugd3JpdGUgdG8gbW9yZSB0aGFuIG9uZSBsb2NhdGlvbiwgdGhlIGZpcnN0IGVycm9yCi0JCSAqIGVuY291bnRlcmVkIHF1aXRzIHRoZSBwcm9jZWR1cmUuIFdlIHdyaXRlIHR3byBieXRlcyBwZXIKLQkJICogbG9jYXRpb24sIHNvIHdlIGRvbnQgaGF2ZSB0byBtZXNzIHdpdGggMTYgYml0IGFjY2Vzcy4KKwkJLyoKKwkJICogV3JpdGUgdG8gZmlyc3QgdHdvIHBhZ2VzIGlmIG5lY2Vzc2FyeS4gSWYgd2Ugd3JpdGUgdG8gbW9yZQorCQkgKiB0aGFuIG9uZSBsb2NhdGlvbiwgdGhlIGZpcnN0IGVycm9yIGVuY291bnRlcmVkIHF1aXRzIHRoZQorCQkgKiBwcm9jZWR1cmUuIFdlIHdyaXRlIHR3byBieXRlcyBwZXIgbG9jYXRpb24sIHNvIHdlIGRvbnQgaGF2ZQorCQkgKiB0byBtZXNzIHdpdGggMTYgYml0IGFjY2Vzcy4KIAkJICovCisJCW9wcy5sZW4gPSBvcHMub29ibGVuID0gMjsKKwkJb3BzLmRhdGJ1ZiA9IE5VTEw7CisJCW9wcy5vb2JidWYgPSBidWY7CisJCW9wcy5vb2JvZmZzID0gY2hpcC0+YmFkYmxvY2twb3MgJiB+MHgwMTsKKwkJb3BzLm1vZGUgPSBNVERfT1BTX1BMQUNFX09PQjsKIAkJZG8gewotCQkJY2hpcC0+b3BzLmxlbiA9IGNoaXAtPm9wcy5vb2JsZW4gPSAyOwotCQkJY2hpcC0+b3BzLmRhdGJ1ZiA9IE5VTEw7Ci0JCQljaGlwLT5vcHMub29iYnVmID0gYnVmOwotCQkJY2hpcC0+b3BzLm9vYm9mZnMgPSBjaGlwLT5iYWRibG9ja3BvcyAmIH4weDAxOworCQkJcmV0ID0gbmFuZF9kb193cml0ZV9vb2IobXRkLCBvZnMsICZvcHMpOwogCi0JCQlyZXQgPSBuYW5kX2RvX3dyaXRlX29vYihtdGQsIG9mcywgJmNoaXAtPm9wcyk7Ci0KLQkJCWlmICghcmV0ICYmIChjaGlwLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkJZVEUxQU5ENikpIHsKLQkJCQljaGlwLT5vcHMub29ib2ZmcyA9IE5BTkRfU01BTExfQkFEQkxPQ0tfUE9TCi0JCQkJCSYgfjB4MDE7Ci0JCQkJcmV0ID0gbmFuZF9kb193cml0ZV9vb2IobXRkLCBvZnMsICZjaGlwLT5vcHMpOwotCQkJfQogCQkJaSsrOwogCQkJb2ZzICs9IG10ZC0+d3JpdGVzaXplOwotCQl9IHdoaWxlICghcmV0ICYmIChjaGlwLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTjJORFBBR0UpICYmCisJCX0gd2hpbGUgKCFyZXQgJiYgKGNoaXAtPmJidF9vcHRpb25zICYgTkFORF9CQlRfU0NBTjJORFBBR0UpICYmCiAJCQkJaSA8IDIpOwogCiAJCW5hbmRfcmVsZWFzZV9kZXZpY2UobXRkKTsKQEAgLTQ0MywxNiArNDM5LDE2IEBACiAKIC8qKgogICogbmFuZF9jaGVja193cCAtIFtHRU5FUklDXSBjaGVjayBpZiB0aGUgY2hpcCBpcyB3cml0ZSBwcm90ZWN0ZWQKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBDaGVjaywgaWYgdGhlIGRldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogVGhlIGZ1bmN0aW9uIGV4cGVjdHMsIHRoYXQgdGhlIGRldmljZSBpcyBhbHJlYWR5IHNlbGVjdGVkCisgKiBDaGVjaywgaWYgdGhlIGRldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQuIFRoZSBmdW5jdGlvbiBleHBlY3RzLCB0aGF0IHRoZQorICogZGV2aWNlIGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9jaGVja193cChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCi0JLyogYnJva2VuIHhEIGNhcmRzIHJlcG9ydCBXUCBkZXNwaXRlIGJlaW5nIHdyaXRhYmxlICovCisJLyogQnJva2VuIHhEIGNhcmRzIHJlcG9ydCBXUCBkZXNwaXRlIGJlaW5nIHdyaXRhYmxlICovCiAJaWYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JST0tFTl9YRCkKIAkJcmV0dXJuIDA7CiAKQEAgLTQ2MywxMCArNDU5LDEwIEBACiAKIC8qKgogICogbmFuZF9ibG9ja19jaGVja2JhZCAtIFtHRU5FUklDXSBDaGVjayBpZiBhIGJsb2NrIGlzIG1hcmtlZCBiYWQKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAb2ZzOglvZmZzZXQgZnJvbSBkZXZpY2Ugc3RhcnQKLSAqIEBnZXRjaGlwOgkwLCBpZiB0aGUgY2hpcCBpcyBhbHJlYWR5IHNlbGVjdGVkCi0gKiBAYWxsb3diYnQ6CTEsIGlmIGl0cyBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgYmJ0IGFyZWEKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2ZzOiBvZmZzZXQgZnJvbSBkZXZpY2Ugc3RhcnQKKyAqIEBnZXRjaGlwOiAwLCBpZiB0aGUgY2hpcCBpcyBhbHJlYWR5IHNlbGVjdGVkCisgKiBAYWxsb3diYnQ6IDEsIGlmIGl0cyBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgYmJ0IGFyZWEKICAqCiAgKiBDaGVjaywgaWYgdGhlIGJsb2NrIGlzIGJhZC4gRWl0aGVyIGJ5IHJlYWRpbmcgdGhlIGJhZCBibG9jayB0YWJsZSBvcgogICogY2FsbGluZyBvZiB0aGUgc2NhbiBmdW5jdGlvbi4KQEAgLTQ4NSw4ICs0ODEsOCBAQAogCiAvKioKICAqIHBhbmljX25hbmRfd2FpdF9yZWFkeSAtIFtHRU5FUklDXSBXYWl0IGZvciB0aGUgcmVhZHkgcGluIGFmdGVyIGNvbW1hbmRzLgotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEB0aW1lbzoJVGltZW91dAorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0aW1lbzogVGltZW91dAogICoKICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbmFuZF93YWl0X3JlYWR5IHVzZWQgd2hlbiBuZWVkaW5nIHRvIHdhaXQgaW4gaW50ZXJydXB0CiAgKiBjb250ZXh0LgpAQCAtNTA1LDEwICs1MDEsNyBAQAogCX0KIH0KIAotLyoKLSAqIFdhaXQgZm9yIHRoZSByZWFkeSBwaW4sIGFmdGVyIGEgY29tbWFuZAotICogVGhlIHRpbWVvdXQgaXMgY2F0Y2hlZCBsYXRlci4KLSAqLworLyogV2FpdCBmb3IgdGhlIHJlYWR5IHBpbiwgYWZ0ZXIgYSBjb21tYW5kLiBUaGUgdGltZW91dCBpcyBjYXVnaHQgbGF0ZXIuICovCiB2b2lkIG5hbmRfd2FpdF9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwpAQCAtNTE5LDcgKzUxMiw3IEBACiAJCXJldHVybiBwYW5pY19uYW5kX3dhaXRfcmVhZHkobXRkLCA0MDApOwogCiAJbGVkX3RyaWdnZXJfZXZlbnQobmFuZF9sZWRfdHJpZ2dlciwgTEVEX0ZVTEwpOwotCS8qIHdhaXQgdW50aWwgY29tbWFuZCBpcyBwcm9jZXNzZWQgb3IgdGltZW91dCBvY2N1cmVzICovCisJLyogV2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCBvciB0aW1lb3V0IG9jY3VycyAqLwogCWRvIHsKIAkJaWYgKGNoaXAtPmRldl9yZWFkeShtdGQpKQogCQkJYnJlYWs7CkBAIC01MzEsMTMgKzUyNCwxMyBAQAogCiAvKioKICAqIG5hbmRfY29tbWFuZCAtIFtERUZBVUxUXSBTZW5kIGNvbW1hbmQgdG8gTkFORCBkZXZpY2UKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAY29tbWFuZDoJdGhlIGNvbW1hbmQgdG8gYmUgc2VudAotICogQGNvbHVtbjoJdGhlIGNvbHVtbiBhZGRyZXNzIGZvciB0aGlzIGNvbW1hbmQsIC0xIGlmIG5vbmUKLSAqIEBwYWdlX2FkZHI6CXRoZSBwYWdlIGFkZHJlc3MgZm9yIHRoaXMgY29tbWFuZCwgLTEgaWYgbm9uZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjb21tYW5kOiB0aGUgY29tbWFuZCB0byBiZSBzZW50CisgKiBAY29sdW1uOiB0aGUgY29sdW1uIGFkZHJlc3MgZm9yIHRoaXMgY29tbWFuZCwgLTEgaWYgbm9uZQorICogQHBhZ2VfYWRkcjogdGhlIHBhZ2UgYWRkcmVzcyBmb3IgdGhpcyBjb21tYW5kLCAtMSBpZiBub25lCiAgKgotICogU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNtYWxsIHBhZ2UKLSAqIGRldmljZXMgKDI1Ni81MTIgQnl0ZXMgcGVyIHBhZ2UpCisgKiBTZW5kIGNvbW1hbmQgdG8gTkFORCBkZXZpY2UuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igc21hbGwgcGFnZSBkZXZpY2VzCisgKiAoMjU2LzUxMiBCeXRlcyBwZXIgcGFnZSkuCiAgKi8KIHN0YXRpYyB2b2lkIG5hbmRfY29tbWFuZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgaW50IGNvbW1hbmQsCiAJCQkgaW50IGNvbHVtbiwgaW50IHBhZ2VfYWRkcikKQEAgLTU0NSw5ICs1MzgsNyBAQAogCXJlZ2lzdGVyIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CiAJaW50IGN0cmwgPSBOQU5EX0NUUkxfQ0xFIHwgTkFORF9DVFJMX0NIQU5HRTsKIAotCS8qCi0JICogV3JpdGUgb3V0IHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UuCi0JICovCisJLyogV3JpdGUgb3V0IHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UgKi8KIAlpZiAoY29tbWFuZCA9PSBOQU5EX0NNRF9TRVFJTikgewogCQlpbnQgcmVhZGNtZDsKIApAQCAtNTY3LDkgKzU1OCw3IEBACiAJfQogCWNoaXAtPmNtZF9jdHJsKG10ZCwgY29tbWFuZCwgY3RybCk7CiAKLQkvKgotCSAqIEFkZHJlc3MgY3ljbGUsIHdoZW4gbmVjZXNzYXJ5Ci0JICovCisJLyogQWRkcmVzcyBjeWNsZSwgd2hlbiBuZWNlc3NhcnkgKi8KIAljdHJsID0gTkFORF9DVFJMX0FMRSB8IE5BTkRfQ1RSTF9DSEFOR0U7CiAJLyogU2VyaWFsbHkgaW5wdXQgYWRkcmVzcyAqLwogCWlmIChjb2x1bW4gIT0gLTEpIHsKQEAgLTU5MCw4ICs1NzksOCBAQAogCWNoaXAtPmNtZF9jdHJsKG10ZCwgTkFORF9DTURfTk9ORSwgTkFORF9OQ0UgfCBOQU5EX0NUUkxfQ0hBTkdFKTsKIAogCS8qCi0JICogcHJvZ3JhbSBhbmQgZXJhc2UgaGF2ZSB0aGVpciBvd24gYnVzeSBoYW5kbGVycwotCSAqIHN0YXR1cyBhbmQgc2VxdWVudGlhbCBpbiBuZWVkcyBubyBkZWxheQorCSAqIFByb2dyYW0gYW5kIGVyYXNlIGhhdmUgdGhlaXIgb3duIGJ1c3kgaGFuZGxlcnMgc3RhdHVzIGFuZCBzZXF1ZW50aWFsCisJICogaW4gbmVlZHMgbm8gZGVsYXkKIAkgKi8KIAlzd2l0Y2ggKGNvbW1hbmQpIHsKIApAQCAtNjI1LDggKzYxNCwxMCBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotCS8qIEFwcGx5IHRoaXMgc2hvcnQgZGVsYXkgYWx3YXlzIHRvIGVuc3VyZSB0aGF0IHdlIGRvIHdhaXQgdFdCIGluCi0JICogYW55IGNhc2Ugb24gYW55IG1hY2hpbmUuICovCisJLyoKKwkgKiBBcHBseSB0aGlzIHNob3J0IGRlbGF5IGFsd2F5cyB0byBlbnN1cmUgdGhhdCB3ZSBkbyB3YWl0IHRXQiBpbgorCSAqIGFueSBjYXNlIG9uIGFueSBtYWNoaW5lLgorCSAqLwogCW5kZWxheSgxMDApOwogCiAJbmFuZF93YWl0X3JlYWR5KG10ZCk7CkBAIC02MzQsMTQgKzYyNSwxNCBAQAogCiAvKioKICAqIG5hbmRfY29tbWFuZF9scCAtIFtERUZBVUxUXSBTZW5kIGNvbW1hbmQgdG8gTkFORCBsYXJnZSBwYWdlIGRldmljZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBjb21tYW5kOgl0aGUgY29tbWFuZCB0byBiZSBzZW50Ci0gKiBAY29sdW1uOgl0aGUgY29sdW1uIGFkZHJlc3MgZm9yIHRoaXMgY29tbWFuZCwgLTEgaWYgbm9uZQotICogQHBhZ2VfYWRkcjoJdGhlIHBhZ2UgYWRkcmVzcyBmb3IgdGhpcyBjb21tYW5kLCAtMSBpZiBub25lCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGNvbW1hbmQ6IHRoZSBjb21tYW5kIHRvIGJlIHNlbnQKKyAqIEBjb2x1bW46IHRoZSBjb2x1bW4gYWRkcmVzcyBmb3IgdGhpcyBjb21tYW5kLCAtMSBpZiBub25lCisgKiBAcGFnZV9hZGRyOiB0aGUgcGFnZSBhZGRyZXNzIGZvciB0aGlzIGNvbW1hbmQsIC0xIGlmIG5vbmUKICAqCiAgKiBTZW5kIGNvbW1hbmQgdG8gTkFORCBkZXZpY2UuIFRoaXMgaXMgdGhlIHZlcnNpb24gZm9yIHRoZSBuZXcgbGFyZ2UgcGFnZQotICogZGV2aWNlcyBXZSBkb250IGhhdmUgdGhlIHNlcGFyYXRlIHJlZ2lvbnMgYXMgd2UgaGF2ZSBpbiB0aGUgc21hbGwgcGFnZQotICogZGV2aWNlcy4gIFdlIG11c3QgZW11bGF0ZSBOQU5EX0NNRF9SRUFET09CIHRvIGtlZXAgdGhlIGNvZGUgY29tcGF0aWJsZS4KKyAqIGRldmljZXMuIFdlIGRvbid0IGhhdmUgdGhlIHNlcGFyYXRlIHJlZ2lvbnMgYXMgd2UgaGF2ZSBpbiB0aGUgc21hbGwgcGFnZQorICogZGV2aWNlcy4gV2UgbXVzdCBlbXVsYXRlIE5BTkRfQ01EX1JFQURPT0IgdG8ga2VlcCB0aGUgY29kZSBjb21wYXRpYmxlLgogICovCiBzdGF0aWMgdm9pZCBuYW5kX2NvbW1hbmRfbHAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGludCBjb21tYW5kLAogCQkJICAgIGludCBjb2x1bW4sIGludCBwYWdlX2FkZHIpCkBAIC02ODMsOCArNjc0LDggQEAKIAljaGlwLT5jbWRfY3RybChtdGQsIE5BTkRfQ01EX05PTkUsIE5BTkRfTkNFIHwgTkFORF9DVFJMX0NIQU5HRSk7CiAKIAkvKgotCSAqIHByb2dyYW0gYW5kIGVyYXNlIGhhdmUgdGhlaXIgb3duIGJ1c3kgaGFuZGxlcnMKLQkgKiBzdGF0dXMsIHNlcXVlbnRpYWwgaW4sIGFuZCBkZXBsZXRlMSBuZWVkIG5vIGRlbGF5CisJICogUHJvZ3JhbSBhbmQgZXJhc2UgaGF2ZSB0aGVpciBvd24gYnVzeSBoYW5kbGVycyBzdGF0dXMsIHNlcXVlbnRpYWwKKwkgKiBpbiwgYW5kIGRlcGxldGUxIG5lZWQgbm8gZGVsYXkuCiAJICovCiAJc3dpdGNoIChjb21tYW5kKSB7CiAKQEAgLTY5OCwxNCArNjg5LDEyIEBACiAJY2FzZSBOQU5EX0NNRF9ERVBMRVRFMToKIAkJcmV0dXJuOwogCi0JCS8qCi0JCSAqIHJlYWQgZXJyb3Igc3RhdHVzIGNvbW1hbmRzIHJlcXVpcmUgb25seSBhIHNob3J0IGRlbGF5Ci0JCSAqLwogCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SOgogCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SMDoKIAljYXNlIE5BTkRfQ01EX1NUQVRVU19FUlJPUjE6CiAJY2FzZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IyOgogCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SMzoKKwkJLyogUmVhZCBlcnJvciBzdGF0dXMgY29tbWFuZHMgcmVxdWlyZSBvbmx5IGEgc2hvcnQgZGVsYXkgKi8KIAkJdWRlbGF5KGNoaXAtPmNoaXBfZGVsYXkpOwogCQlyZXR1cm47CiAKQEAgLTczOSw3ICs3MjgsNyBAQAogCWRlZmF1bHQ6CiAJCS8qCiAJCSAqIElmIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBidXN5IHBpbiwgd2UgYXBwbHkgdGhlIGdpdmVuCi0JCSAqIGNvbW1hbmQgZGVsYXkKKwkJICogY29tbWFuZCBkZWxheS4KIAkJICovCiAJCWlmICghY2hpcC0+ZGV2X3JlYWR5KSB7CiAJCQl1ZGVsYXkoY2hpcC0+Y2hpcF9kZWxheSk7CkBAIC03NDcsOCArNzM2LDEwIEBACiAJCX0KIAl9CiAKLQkvKiBBcHBseSB0aGlzIHNob3J0IGRlbGF5IGFsd2F5cyB0byBlbnN1cmUgdGhhdCB3ZSBkbyB3YWl0IHRXQiBpbgotCSAqIGFueSBjYXNlIG9uIGFueSBtYWNoaW5lLiAqLworCS8qCisJICogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KKwkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4KKwkgKi8KIAluZGVsYXkoMTAwKTsKIAogCW5hbmRfd2FpdF9yZWFkeShtdGQpOwpAQCAtNzU2LDI1ICs3NDcsMjUgQEAKIAogLyoqCiAgKiBwYW5pY19uYW5kX2dldF9kZXZpY2UgLSBbR0VORVJJQ10gR2V0IGNoaXAgZm9yIHNlbGVjdGVkIGFjY2VzcwotICogQGNoaXA6CXRoZSBuYW5kIGNoaXAgZGVzY3JpcHRvcgotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBuZXdfc3RhdGU6CXRoZSBzdGF0ZSB3aGljaCBpcyByZXF1ZXN0ZWQKKyAqIEBjaGlwOiB0aGUgbmFuZCBjaGlwIGRlc2NyaXB0b3IKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbmV3X3N0YXRlOiB0aGUgc3RhdGUgd2hpY2ggaXMgcmVxdWVzdGVkCiAgKgogICogVXNlZCB3aGVuIGluIHBhbmljLCBubyBsb2NrcyBhcmUgdGFrZW4uCiAgKi8KIHN0YXRpYyB2b2lkIHBhbmljX25hbmRfZ2V0X2RldmljZShzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkgICAgICBzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG5ld19zdGF0ZSkKIHsKLQkvKiBIYXJkd2FyZSBjb250cm9sbGVyIHNoYXJlZCBhbW9uZyBpbmRlcGVuZGVuZCBkZXZpY2VzICovCisJLyogSGFyZHdhcmUgY29udHJvbGxlciBzaGFyZWQgYW1vbmcgaW5kZXBlbmRlbnQgZGV2aWNlcyAqLwogCWNoaXAtPmNvbnRyb2xsZXItPmFjdGl2ZSA9IGNoaXA7CiAJY2hpcC0+c3RhdGUgPSBuZXdfc3RhdGU7CiB9CiAKIC8qKgogICogbmFuZF9nZXRfZGV2aWNlIC0gW0dFTkVSSUNdIEdldCBjaGlwIGZvciBzZWxlY3RlZCBhY2Nlc3MKLSAqIEBjaGlwOgl0aGUgbmFuZCBjaGlwIGRlc2NyaXB0b3IKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAbmV3X3N0YXRlOgl0aGUgc3RhdGUgd2hpY2ggaXMgcmVxdWVzdGVkCisgKiBAY2hpcDogdGhlIG5hbmQgY2hpcCBkZXNjcmlwdG9yCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG5ld19zdGF0ZTogdGhlIHN0YXRlIHdoaWNoIGlzIHJlcXVlc3RlZAogICoKICAqIEdldCB0aGUgZGV2aWNlIGFuZCBsb2NrIGl0IGZvciBleGNsdXNpdmUgYWNjZXNzCiAgKi8KQEAgLTgxMiwxMCArODAzLDEwIEBACiB9CiAKIC8qKgotICogcGFuaWNfbmFuZF93YWl0IC0gW0dFTkVSSUNdICB3YWl0IHVudGlsIHRoZSBjb21tYW5kIGlzIGRvbmUKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAY2hpcDoJTkFORCBjaGlwIHN0cnVjdHVyZQotICogQHRpbWVvOglUaW1lb3V0CisgKiBwYW5pY19uYW5kX3dhaXQgLSBbR0VORVJJQ10gd2FpdCB1bnRpbCB0aGUgY29tbWFuZCBpcyBkb25lCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGNoaXA6IE5BTkQgY2hpcCBzdHJ1Y3R1cmUKKyAqIEB0aW1lbzogdGltZW91dAogICoKICAqIFdhaXQgZm9yIGNvbW1hbmQgZG9uZS4gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgbmFuZF93YWl0IHVzZWQgd2hlbgogICogd2UgYXJlIGluIGludGVycnVwdCBjb250ZXh0LiBNYXkgaGFwcGVuIHdoZW4gaW4gcGFuaWMgYW5kIHRyeWluZyB0byB3cml0ZQpAQCAtODM4LDEzICs4MjksMTMgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3dhaXQgLSBbREVGQVVMVF0gIHdhaXQgdW50aWwgdGhlIGNvbW1hbmQgaXMgZG9uZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBjaGlwOglOQU5EIGNoaXAgc3RydWN0dXJlCisgKiBuYW5kX3dhaXQgLSBbREVGQVVMVF0gd2FpdCB1bnRpbCB0aGUgY29tbWFuZCBpcyBkb25lCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGNoaXA6IE5BTkQgY2hpcCBzdHJ1Y3R1cmUKICAqCi0gKiBXYWl0IGZvciBjb21tYW5kIGRvbmUuIFRoaXMgYXBwbGllcyB0byBlcmFzZSBhbmQgcHJvZ3JhbSBvbmx5Ci0gKiBFcmFzZSBjYW4gdGFrZSB1cCB0byA0MDBtcyBhbmQgcHJvZ3JhbSB1cCB0byAyMG1zIGFjY29yZGluZyB0bwotICogZ2VuZXJhbCBOQU5EIGFuZCBTbWFydE1lZGlhIHNwZWNzCisgKiBXYWl0IGZvciBjb21tYW5kIGRvbmUuIFRoaXMgYXBwbGllcyB0byBlcmFzZSBhbmQgcHJvZ3JhbSBvbmx5LiBFcmFzZSBjYW4KKyAqIHRha2UgdXAgdG8gNDAwbXMgYW5kIHByb2dyYW0gdXAgdG8gMjBtcyBhY2NvcmRpbmcgdG8gZ2VuZXJhbCBOQU5EIGFuZAorICogU21hcnRNZWRpYSBzcGVjcy4KICAqLwogc3RhdGljIGludCBuYW5kX3dhaXQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCiB7CkBAIC04NTksOCArODUwLDEwIEBACiAKIAlsZWRfdHJpZ2dlcl9ldmVudChuYW5kX2xlZF90cmlnZ2VyLCBMRURfRlVMTCk7CiAKLQkvKiBBcHBseSB0aGlzIHNob3J0IGRlbGF5IGFsd2F5cyB0byBlbnN1cmUgdGhhdCB3ZSBkbyB3YWl0IHRXQiBpbgotCSAqIGFueSBjYXNlIG9uIGFueSBtYWNoaW5lLiAqLworCS8qCisJICogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4gYW55CisJICogY2FzZSBvbiBhbnkgbWFjaGluZS4KKwkgKi8KIAluZGVsYXkoMTAwKTsKIAogCWlmICgoc3RhdGUgPT0gRkxfRVJBU0lORykgJiYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0lTX0FORCkpCkBAIC04OTAsMTYgKzg4MywxNSBAQAogCiAvKioKICAqIF9fbmFuZF91bmxvY2sgLSBbUkVQTEFDRUFCTEVdIHVubG9ja3Mgc3BlY2lmaWVkIGxvY2tlZCBibG9ja3MKLSAqCiAgKiBAbXRkOiBtdGQgaW5mbwogICogQG9mczogb2Zmc2V0IHRvIHN0YXJ0IHVubG9jayBmcm9tCiAgKiBAbGVuOiBsZW5ndGggdG8gdW5sb2NrCi0gKiBAaW52ZXJ0OiAgIHdoZW4gPSAwLCB1bmxvY2sgdGhlIHJhbmdlIG9mIGJsb2NrcyB3aXRoaW4gdGhlIGxvd2VyIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgdXBwZXIgYm91bmRhcnkgYWRkcmVzcwotICogICAgICAgICAgICB3aGVuID0gMSwgdW5sb2NrIHRoZSByYW5nZSBvZiBibG9ja3Mgb3V0c2lkZSB0aGUgYm91bmRhcmllcwotICogICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeSBhZGRyZXNzCisgKiBAaW52ZXJ0OiB3aGVuID0gMCwgdW5sb2NrIHRoZSByYW5nZSBvZiBibG9ja3Mgd2l0aGluIHRoZSBsb3dlciBhbmQKKyAqICAgICAgICAgICAgICAgICAgICB1cHBlciBib3VuZGFyeSBhZGRyZXNzCisgKiAgICAgICAgICB3aGVuID0gMSwgdW5sb2NrIHRoZSByYW5nZSBvZiBibG9ja3Mgb3V0c2lkZSB0aGUgYm91bmRhcmllcworICogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmRhcnkgYWRkcmVzcwogICoKLSAqIHJldHVybiAtIHVubG9jayBzdGF0dXMKKyAqIFJldHVycyB1bmxvY2sgc3RhdHVzLgogICovCiBzdGF0aWMgaW50IF9fbmFuZF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsCiAJCQkJCXVpbnQ2NF90IGxlbiwgaW50IGludmVydCkKQEAgLTkxOSwxMCArOTExLDkgQEAKIAogCS8qIENhbGwgd2FpdCByZWFkeSBmdW5jdGlvbiAqLwogCXN0YXR1cyA9IGNoaXAtPndhaXRmdW5jKG10ZCwgY2hpcCk7Ci0JdWRlbGF5KDEwMDApOwogCS8qIFNlZSBpZiBkZXZpY2UgdGhpbmtzIGl0IHN1Y2NlZWRlZCAqLwogCWlmIChzdGF0dXMgJiAweDAxKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogRXJyb3Igc3RhdHVzID0gMHglMDh4XG4iLAorCQlwcl9kZWJ1ZygiJXM6IGVycm9yIHN0YXR1cyA9IDB4JTA4eFxuIiwKIAkJCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldCA9IC1FSU87CiAJfQpAQCAtOTMyLDEyICs5MjMsMTEgQEAKIAogLyoqCiAgKiBuYW5kX3VubG9jayAtIFtSRVBMQUNFQUJMRV0gdW5sb2NrcyBzcGVjaWZpZWQgbG9ja2VkIGJsb2NrcwotICoKICAqIEBtdGQ6IG10ZCBpbmZvCiAgKiBAb2ZzOiBvZmZzZXQgdG8gc3RhcnQgdW5sb2NrIGZyb20KICAqIEBsZW46IGxlbmd0aCB0byB1bmxvY2sKICAqCi0gKiByZXR1cm4gLSB1bmxvY2sgc3RhdHVzCisgKiBSZXR1cm5zIHVubG9jayBzdGF0dXMuCiAgKi8KIGludCBuYW5kX3VubG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKQogewpAQCAtOTQ1LDcgKzkzNSw3IEBACiAJaW50IGNoaXBucjsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBzdGFydCA9IDB4JTAxMmxseCwgbGVuID0gJWxsdVxuIiwKKwlwcl9kZWJ1ZygiJXM6IHN0YXJ0ID0gMHglMDEybGx4LCBsZW4gPSAlbGx1XG4iLAogCQkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpb2ZzLCBsZW4pOwogCiAJaWYgKGNoZWNrX29mZnNfbGVuKG10ZCwgb2ZzLCBsZW4pKQpAQCAtOTY0LDcgKzk1NCw3IEBACiAKIAkvKiBDaGVjaywgaWYgaXQgaXMgd3JpdGUgcHJvdGVjdGVkICovCiAJaWYgKG5hbmRfY2hlY2tfd3AobXRkKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IERldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQhISFcbiIsCisJCXByX2RlYnVnKCIlczogZGV2aWNlIGlzIHdyaXRlIHByb3RlY3RlZCFcbiIsCiAJCQkJCV9fZnVuY19fKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CkBAIC05ODEsMTggKzk3MSwxNiBAQAogCiAvKioKICAqIG5hbmRfbG9jayAtIFtSRVBMQUNFQUJMRV0gbG9ja3MgYWxsIGJsb2NrcyBwcmVzZW50IGluIHRoZSBkZXZpY2UKLSAqCiAgKiBAbXRkOiBtdGQgaW5mbwogICogQG9mczogb2Zmc2V0IHRvIHN0YXJ0IHVubG9jayBmcm9tCiAgKiBAbGVuOiBsZW5ndGggdG8gdW5sb2NrCiAgKgotICogcmV0dXJuIC0gbG9jayBzdGF0dXMKKyAqIFRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGluIG1hbnkgTkFORCBwYXJ0cy4gJ01pY3JvbicgTkFORCBwYXJ0cyBkbworICogaGF2ZSB0aGlzIGZlYXR1cmUsIGJ1dCBpdCBhbGxvd3Mgb25seSB0byBsb2NrIGFsbCBibG9ja3MsIG5vdCBmb3Igc3BlY2lmaWVkCisgKiByYW5nZSBmb3IgYmxvY2suIEltcGxlbWVudGluZyAnbG9jaycgZmVhdHVyZSBieSBtYWtpbmcgdXNlIG9mICd1bmxvY2snLCBmb3IKKyAqIG5vdy4KICAqCi0gKiBUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBpbiBtYW55IE5BTkQgcGFydHMuICdNaWNyb24nIE5BTkQgcGFydHMKLSAqIGRvIGhhdmUgdGhpcyBmZWF0dXJlLCBidXQgaXQgYWxsb3dzIG9ubHkgdG8gbG9jayBhbGwgYmxvY2tzLCBub3QgZm9yCi0gKiBzcGVjaWZpZWQgcmFuZ2UgZm9yIGJsb2NrLgotICoKLSAqIEltcGxlbWVudGluZyAnbG9jaycgZmVhdHVyZSBieSBtYWtpbmcgdXNlIG9mICd1bmxvY2snLCBmb3Igbm93LgorICogUmV0dXJucyBsb2NrIHN0YXR1cy4KICAqLwogaW50IG5hbmRfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKQogewpAQCAtMTAwMCw3ICs5ODgsNyBAQAogCWludCBjaGlwbnIsIHN0YXR1cywgcGFnZTsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBzdGFydCA9IDB4JTAxMmxseCwgbGVuID0gJWxsdVxuIiwKKwlwcl9kZWJ1ZygiJXM6IHN0YXJ0ID0gMHglMDEybGx4LCBsZW4gPSAlbGx1XG4iLAogCQkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpb2ZzLCBsZW4pOwogCiAJaWYgKGNoZWNrX29mZnNfbGVuKG10ZCwgb2ZzLCBsZW4pKQpAQCAtMTAxNSw3ICsxMDAzLDcgQEAKIAogCS8qIENoZWNrLCBpZiBpdCBpcyB3cml0ZSBwcm90ZWN0ZWQgKi8KIAlpZiAobmFuZF9jaGVja193cChtdGQpKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogRGV2aWNlIGlzIHdyaXRlIHByb3RlY3RlZCEhIVxuIiwKKwkJcHJfZGVidWcoIiVzOiBkZXZpY2UgaXMgd3JpdGUgcHJvdGVjdGVkIVxuIiwKIAkJCQkJX19mdW5jX18pOwogCQlzdGF0dXMgPSBNVERfRVJBU0VfRkFJTEVEOwogCQlyZXQgPSAtRUlPOwpAQCAtMTAyOCwxMCArMTAxNiw5IEBACiAKIAkvKiBDYWxsIHdhaXQgcmVhZHkgZnVuY3Rpb24gKi8KIAlzdGF0dXMgPSBjaGlwLT53YWl0ZnVuYyhtdGQsIGNoaXApOwotCXVkZWxheSgxMDAwKTsKIAkvKiBTZWUgaWYgZGV2aWNlIHRoaW5rcyBpdCBzdWNjZWVkZWQgKi8KIAlpZiAoc3RhdHVzICYgMHgwMSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IEVycm9yIHN0YXR1cyA9IDB4JTA4eFxuIiwKKwkJcHJfZGVidWcoIiVzOiBlcnJvciBzdGF0dXMgPSAweCUwOHhcbiIsCiAJCQkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXQgPSAtRUlPOwogCQlnb3RvIG91dDsKQEAgLTEwNDcsMTMgKzEwMzQsMTMgQEAKIEVYUE9SVF9TWU1CT0wobmFuZF9sb2NrKTsKIAogLyoqCi0gKiBuYW5kX3JlYWRfcGFnZV9yYXcgLSBbSW50ZXJuXSByZWFkIHJhdyBwYWdlIGRhdGEgd2l0aG91dCBlY2MKLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGJ1ZjoJYnVmZmVyIHRvIHN0b3JlIHJlYWQgZGF0YQotICogQHBhZ2U6CXBhZ2UgbnVtYmVyIHRvIHJlYWQKKyAqIG5hbmRfcmVhZF9wYWdlX3JhdyAtIFtJTlRFUk5dIHJlYWQgcmF3IHBhZ2UgZGF0YSB3aXRob3V0IGVjYworICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gcmVhZAogICoKLSAqIE5vdCBmb3Igc3luZHJvbWUgY2FsY3VsYXRpbmcgZWNjIGNvbnRyb2xsZXJzLCB3aGljaCB1c2UgYSBzcGVjaWFsIG9vYiBsYXlvdXQKKyAqIE5vdCBmb3Igc3luZHJvbWUgY2FsY3VsYXRpbmcgRUNDIGNvbnRyb2xsZXJzLCB3aGljaCB1c2UgYSBzcGVjaWFsIG9vYiBsYXlvdXQuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2VfcmF3KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJICAgICAgdWludDhfdCAqYnVmLCBpbnQgcGFnZSkKQEAgLTEwNjQsMTEgKzEwNTEsMTEgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3JlYWRfcGFnZV9yYXdfc3luZHJvbWUgLSBbSW50ZXJuXSByZWFkIHJhdyBwYWdlIGRhdGEgd2l0aG91dCBlY2MKLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGJ1ZjoJYnVmZmVyIHRvIHN0b3JlIHJlYWQgZGF0YQotICogQHBhZ2U6CXBhZ2UgbnVtYmVyIHRvIHJlYWQKKyAqIG5hbmRfcmVhZF9wYWdlX3Jhd19zeW5kcm9tZSAtIFtJTlRFUk5dIHJlYWQgcmF3IHBhZ2UgZGF0YSB3aXRob3V0IGVjYworICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gcmVhZAogICoKICAqIFdlIG5lZWQgYSBzcGVjaWFsIG9vYiBsYXlvdXQgYW5kIGhhbmRsaW5nIGV2ZW4gd2hlbiBPT0IgaXNuJ3QgdXNlZC4KICAqLwpAQCAtMTEwNywxMSArMTA5NCwxMSBAQAogfQogCiAvKioKLSAqIG5hbmRfcmVhZF9wYWdlX3N3ZWNjIC0gW1JFUExBQ0FCTEVdIHNvZnR3YXJlIGVjYyBiYXNlZCBwYWdlIHJlYWQgZnVuY3Rpb24KLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGJ1ZjoJYnVmZmVyIHRvIHN0b3JlIHJlYWQgZGF0YQotICogQHBhZ2U6CXBhZ2UgbnVtYmVyIHRvIHJlYWQKKyAqIG5hbmRfcmVhZF9wYWdlX3N3ZWNjIC0gW1JFUExBQ0VBQkxFXSBzb2Z0d2FyZSBFQ0MgYmFzZWQgcGFnZSByZWFkIGZ1bmN0aW9uCisgKiBAbXRkOiBtdGQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBidWY6IGJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKKyAqIEBwYWdlOiBwYWdlIG51bWJlciB0byByZWFkCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2Vfc3dlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCiAJCQkJdWludDhfdCAqYnVmLCBpbnQgcGFnZSkKQEAgLTExNDgsMTIgKzExMzUsMTIgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3JlYWRfc3VicGFnZSAtIFtSRVBMQUNBQkxFXSBzb2Z0d2FyZSBlY2MgYmFzZWQgc3ViLXBhZ2UgcmVhZCBmdW5jdGlvbgotICogQG10ZDoJbXRkIGluZm8gc3RydWN0dXJlCi0gKiBAY2hpcDoJbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCi0gKiBAZGF0YV9vZmZzOglvZmZzZXQgb2YgcmVxdWVzdGVkIGRhdGEgd2l0aGluIHRoZSBwYWdlCi0gKiBAcmVhZGxlbjoJZGF0YSBsZW5ndGgKLSAqIEBidWZwb2k6CWJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKKyAqIG5hbmRfcmVhZF9zdWJwYWdlIC0gW1JFUExBQ0VBQkxFXSBzb2Z0d2FyZSBFQ0MgYmFzZWQgc3ViLXBhZ2UgcmVhZCBmdW5jdGlvbgorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAZGF0YV9vZmZzOiBvZmZzZXQgb2YgcmVxdWVzdGVkIGRhdGEgd2l0aGluIHRoZSBwYWdlCisgKiBAcmVhZGxlbjogZGF0YSBsZW5ndGgKKyAqIEBidWZwb2k6IGJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKICAqLwogc3RhdGljIGludCBuYW5kX3JlYWRfc3VicGFnZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCXVpbnQzMl90IGRhdGFfb2ZmcywgdWludDMyX3QgcmVhZGxlbiwgdWludDhfdCAqYnVmcG9pKQpAQCAtMTE2NiwxMiArMTE1MywxMiBAQAogCWludCBidXN3ID0gKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSA/IDIgOiAxOwogCWludCBpbmRleCA9IDA7CiAKLQkvKiBDb2x1bW4gYWRkcmVzcyB3aWhpbiB0aGUgcGFnZSBhbGlnbmVkIHRvIEVDQyBzaXplICgyNTZieXRlcykuICovCisJLyogQ29sdW1uIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIGFsaWduZWQgdG8gRUNDIHNpemUgKDI1NmJ5dGVzKSAqLwogCXN0YXJ0X3N0ZXAgPSBkYXRhX29mZnMgLyBjaGlwLT5lY2Muc2l6ZTsKIAllbmRfc3RlcCA9IChkYXRhX29mZnMgKyByZWFkbGVuIC0gMSkgLyBjaGlwLT5lY2Muc2l6ZTsKIAludW1fc3RlcHMgPSBlbmRfc3RlcCAtIHN0YXJ0X3N0ZXAgKyAxOwogCi0JLyogRGF0YSBzaXplIGFsaWduZWQgdG8gRUNDIGVjYy5zaXplKi8KKwkvKiBEYXRhIHNpemUgYWxpZ25lZCB0byBFQ0MgZWNjLnNpemUgKi8KIAlkYXRhZnJhZ19sZW4gPSBudW1fc3RlcHMgKiBjaGlwLT5lY2Muc2l6ZTsKIAllY2NmcmFnX2xlbiA9IG51bV9zdGVwcyAqIGNoaXAtPmVjYy5ieXRlczsKIApAQCAtMTE4MywxMyArMTE3MCwxNCBAQAogCXAgPSBidWZwb2kgKyBkYXRhX2NvbF9hZGRyOwogCWNoaXAtPnJlYWRfYnVmKG10ZCwgcCwgZGF0YWZyYWdfbGVuKTsKIAotCS8qIENhbGN1bGF0ZSAgRUNDICovCisJLyogQ2FsY3VsYXRlIEVDQyAqLwogCWZvciAoaSA9IDA7IGkgPCBlY2NmcmFnX2xlbiA7IGkgKz0gY2hpcC0+ZWNjLmJ5dGVzLCBwICs9IGNoaXAtPmVjYy5zaXplKQogCQljaGlwLT5lY2MuY2FsY3VsYXRlKG10ZCwgcCwgJmNoaXAtPmJ1ZmZlcnMtPmVjY2NhbGNbaV0pOwogCi0JLyogVGhlIHBlcmZvcm1hbmNlIGlzIGZhc3RlciBpZiB0byBwb3NpdGlvbiBvZmZzZXRzCi0JICAgYWNjb3JkaW5nIHRvIGVjYy5wb3MuIExldCBtYWtlIHN1cmUgaGVyZSB0aGF0Ci0JICAgdGhlcmUgYXJlIG5vIGdhcHMgaW4gZWNjIHBvc2l0aW9ucyAqLworCS8qCisJICogVGhlIHBlcmZvcm1hbmNlIGlzIGZhc3RlciBpZiB3ZSBwb3NpdGlvbiBvZmZzZXRzIGFjY29yZGluZyB0bworCSAqIGVjYy5wb3MuIExldCdzIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBnYXBzIGluIEVDQyBwb3NpdGlvbnMuCisJICovCiAJZm9yIChpID0gMDsgaSA8IGVjY2ZyYWdfbGVuIC0gMTsgaSsrKSB7CiAJCWlmIChlY2Nwb3NbaSArIHN0YXJ0X3N0ZXAgKiBjaGlwLT5lY2MuYnl0ZXNdICsgMSAhPQogCQkJZWNjcG9zW2kgKyBzdGFydF9zdGVwICogY2hpcC0+ZWNjLmJ5dGVzICsgMV0pIHsKQEAgLTEyMDEsOCArMTE4OSwxMCBAQAogCQljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUk5ET1VULCBtdGQtPndyaXRlc2l6ZSwgLTEpOwogCQljaGlwLT5yZWFkX2J1ZihtdGQsIGNoaXAtPm9vYl9wb2ksIG10ZC0+b29ic2l6ZSk7CiAJfSBlbHNlIHsKLQkJLyogc2VuZCB0aGUgY29tbWFuZCB0byByZWFkIHRoZSBwYXJ0aWN1bGFyIGVjYyBieXRlcyAqLwotCQkvKiB0YWtlIGNhcmUgYWJvdXQgYnVzd2lkdGggYWxpZ25tZW50IGluIHJlYWRfYnVmICovCisJCS8qCisJCSAqIFNlbmQgdGhlIGNvbW1hbmQgdG8gcmVhZCB0aGUgcGFydGljdWxhciBFQ0MgYnl0ZXMgdGFrZSBjYXJlCisJCSAqIGFib3V0IGJ1c3dpZHRoIGFsaWdubWVudCBpbiByZWFkX2J1Zi4KKwkJICovCiAJCWluZGV4ID0gc3RhcnRfc3RlcCAqIGNoaXAtPmVjYy5ieXRlczsKIAogCQlhbGlnbmVkX3BvcyA9IGVjY3Bvc1tpbmRleF0gJiB+KGJ1c3cgLSAxKTsKQEAgLTEyMzUsMTMgKzEyMjUsMTMgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3JlYWRfcGFnZV9od2VjYyAtIFtSRVBMQUNBQkxFXSBoYXJkd2FyZSBlY2MgYmFzZWQgcGFnZSByZWFkIGZ1bmN0aW9uCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKLSAqIEBwYWdlOglwYWdlIG51bWJlciB0byByZWFkCisgKiBuYW5kX3JlYWRfcGFnZV9od2VjYyAtIFtSRVBMQUNFQUJMRV0gaGFyZHdhcmUgRUNDIGJhc2VkIHBhZ2UgcmVhZCBmdW5jdGlvbgorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gcmVhZAogICoKLSAqIE5vdCBmb3Igc3luZHJvbWUgY2FsY3VsYXRpbmcgZWNjIGNvbnRyb2xsZXJzIHdoaWNoIG5lZWQgYSBzcGVjaWFsIG9vYiBsYXlvdXQKKyAqIE5vdCBmb3Igc3luZHJvbWUgY2FsY3VsYXRpbmcgRUNDIGNvbnRyb2xsZXJzIHdoaWNoIG5lZWQgYSBzcGVjaWFsIG9vYiBsYXlvdXQuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2VfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCiAJCQkJdWludDhfdCAqYnVmLCBpbnQgcGFnZSkKQEAgLTEyODAsMTggKzEyNzAsMTcgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3JlYWRfcGFnZV9od2VjY19vb2JfZmlyc3QgLSBbUkVQTEFDQUJMRV0gaHcgZWNjLCByZWFkIG9vYiBmaXJzdAotICogQG10ZDoJbXRkIGluZm8gc3RydWN0dXJlCi0gKiBAY2hpcDoJbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCi0gKiBAYnVmOglidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCi0gKiBAcGFnZToJcGFnZSBudW1iZXIgdG8gcmVhZAorICogbmFuZF9yZWFkX3BhZ2VfaHdlY2Nfb29iX2ZpcnN0IC0gW1JFUExBQ0VBQkxFXSBodyBlY2MsIHJlYWQgb29iIGZpcnN0CisgKiBAbXRkOiBtdGQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBidWY6IGJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKKyAqIEBwYWdlOiBwYWdlIG51bWJlciB0byByZWFkCiAgKgotICogSGFyZHdhcmUgRUNDIGZvciBsYXJnZSBwYWdlIGNoaXBzLCByZXF1aXJlIE9PQiB0byBiZSByZWFkIGZpcnN0LgotICogRm9yIHRoaXMgRUNDIG1vZGUsIHRoZSB3cml0ZV9wYWdlIG1ldGhvZCBpcyByZS11c2VkIGZyb20gRUNDX0hXLgotICogVGhlc2UgbWV0aG9kcyByZWFkL3dyaXRlIEVDQyBmcm9tIHRoZSBPT0IgYXJlYSwgdW5saWtlIHRoZQotICogRUNDX0hXX1NZTkRST01FIHN1cHBvcnQgd2l0aCBtdWx0aXBsZSBFQ0Mgc3RlcHMsIGZvbGxvd3MgdGhlCi0gKiAiaW5maXggRUNDIiBzY2hlbWUgYW5kIHJlYWRzL3dyaXRlcyBFQ0MgZnJvbSB0aGUgZGF0YSBhcmVhLCBieQotICogb3ZlcndyaXRpbmcgdGhlIE5BTkQgbWFudWZhY3R1cmVyIGJhZCBibG9jayBtYXJraW5ncy4KKyAqIEhhcmR3YXJlIEVDQyBmb3IgbGFyZ2UgcGFnZSBjaGlwcywgcmVxdWlyZSBPT0IgdG8gYmUgcmVhZCBmaXJzdC4gRm9yIHRoaXMKKyAqIEVDQyBtb2RlLCB0aGUgd3JpdGVfcGFnZSBtZXRob2QgaXMgcmUtdXNlZCBmcm9tIEVDQ19IVy4gVGhlc2UgbWV0aG9kcworICogcmVhZC93cml0ZSBFQ0MgZnJvbSB0aGUgT09CIGFyZWEsIHVubGlrZSB0aGUgRUNDX0hXX1NZTkRST01FIHN1cHBvcnQgd2l0aAorICogbXVsdGlwbGUgRUNDIHN0ZXBzLCBmb2xsb3dzIHRoZSAiaW5maXggRUNDIiBzY2hlbWUgYW5kIHJlYWRzL3dyaXRlcyBFQ0MgZnJvbQorICogdGhlIGRhdGEgYXJlYSwgYnkgb3ZlcndyaXRpbmcgdGhlIE5BTkQgbWFudWZhY3R1cmVyIGJhZCBibG9jayBtYXJraW5ncy4KICAqLwogc3RhdGljIGludCBuYW5kX3JlYWRfcGFnZV9od2VjY19vb2JfZmlyc3Qoc3RydWN0IG10ZF9pbmZvICptdGQsCiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdWludDhfdCAqYnVmLCBpbnQgcGFnZSkKQEAgLTEzMjksMTQgKzEzMTgsMTQgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3JlYWRfcGFnZV9zeW5kcm9tZSAtIFtSRVBMQUNBQkxFXSBoYXJkd2FyZSBlY2Mgc3luZHJvbSBiYXNlZCBwYWdlIHJlYWQKLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGJ1ZjoJYnVmZmVyIHRvIHN0b3JlIHJlYWQgZGF0YQotICogQHBhZ2U6CXBhZ2UgbnVtYmVyIHRvIHJlYWQKKyAqIG5hbmRfcmVhZF9wYWdlX3N5bmRyb21lIC0gW1JFUExBQ0VBQkxFXSBoYXJkd2FyZSBFQ0Mgc3luZHJvbWUgYmFzZWQgcGFnZSByZWFkCisgKiBAbXRkOiBtdGQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBidWY6IGJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKKyAqIEBwYWdlOiBwYWdlIG51bWJlciB0byByZWFkCiAgKgotICogVGhlIGh3IGdlbmVyYXRvciBjYWxjdWxhdGVzIHRoZSBlcnJvciBzeW5kcm9tZSBhdXRvbWF0aWNhbGx5LiBUaGVyZWZvcgotICogd2UgbmVlZCBhIHNwZWNpYWwgb29iIGxheW91dCBhbmQgaGFuZGxpbmcuCisgKiBUaGUgaHcgZ2VuZXJhdG9yIGNhbGN1bGF0ZXMgdGhlIGVycm9yIHN5bmRyb21lIGF1dG9tYXRpY2FsbHkuIFRoZXJlZm9yZSB3ZQorICogbmVlZCBhIHNwZWNpYWwgb29iIGxheW91dCBhbmQgaGFuZGxpbmcuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2Vfc3luZHJvbWUoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCiAJCQkJICAgdWludDhfdCAqYnVmLCBpbnQgcGFnZSkKQEAgLTEzODQsMjkgKzEzNzMsMjkgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3RyYW5zZmVyX29vYiAtIFtJbnRlcm5hbF0gVHJhbnNmZXIgb29iIHRvIGNsaWVudCBidWZmZXIKLSAqIEBjaGlwOgluYW5kIGNoaXAgc3RydWN0dXJlCi0gKiBAb29iOglvb2IgZGVzdGluYXRpb24gYWRkcmVzcwotICogQG9wczoJb29iIG9wcyBzdHJ1Y3R1cmUKLSAqIEBsZW46CXNpemUgb2Ygb29iIHRvIHRyYW5zZmVyCisgKiBuYW5kX3RyYW5zZmVyX29vYiAtIFtJTlRFUk5dIFRyYW5zZmVyIG9vYiB0byBjbGllbnQgYnVmZmVyCisgKiBAY2hpcDogbmFuZCBjaGlwIHN0cnVjdHVyZQorICogQG9vYjogb29iIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEBvcHM6IG9vYiBvcHMgc3RydWN0dXJlCisgKiBAbGVuOiBzaXplIG9mIG9vYiB0byB0cmFuc2ZlcgogICovCiBzdGF0aWMgdWludDhfdCAqbmFuZF90cmFuc2Zlcl9vb2Ioc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdWludDhfdCAqb29iLAogCQkJCSAgc3RydWN0IG10ZF9vb2Jfb3BzICpvcHMsIHNpemVfdCBsZW4pCiB7CiAJc3dpdGNoIChvcHMtPm1vZGUpIHsKIAotCWNhc2UgTVREX09PQl9QTEFDRToKLQljYXNlIE1URF9PT0JfUkFXOgorCWNhc2UgTVREX09QU19QTEFDRV9PT0I6CisJY2FzZSBNVERfT1BTX1JBVzoKIAkJbWVtY3B5KG9vYiwgY2hpcC0+b29iX3BvaSArIG9wcy0+b29ib2ZmcywgbGVuKTsKIAkJcmV0dXJuIG9vYiArIGxlbjsKIAotCWNhc2UgTVREX09PQl9BVVRPOiB7CisJY2FzZSBNVERfT1BTX0FVVE9fT09COiB7CiAJCXN0cnVjdCBuYW5kX29vYmZyZWUgKmZyZWUgPSBjaGlwLT5lY2MubGF5b3V0LT5vb2JmcmVlOwogCQl1aW50MzJfdCBib2ZmcyA9IDAsIHJvZmZzID0gb3BzLT5vb2JvZmZzOwogCQlzaXplX3QgYnl0ZXMgPSAwOwogCiAJCWZvciAoOyBmcmVlLT5sZW5ndGggJiYgbGVuOyBmcmVlKyssIGxlbiAtPSBieXRlcykgewotCQkJLyogUmVhZCByZXF1ZXN0IG5vdCBmcm9tIG9mZnNldCAwID8gKi8KKwkJCS8qIFJlYWQgcmVxdWVzdCBub3QgZnJvbSBvZmZzZXQgMD8gKi8KIAkJCWlmICh1bmxpa2VseShyb2ZmcykpIHsKIAkJCQlpZiAocm9mZnMgPj0gZnJlZS0+bGVuZ3RoKSB7CiAJCQkJCXJvZmZzIC09IGZyZWUtPmxlbmd0aDsKQEAgLTE0MzIsMTEgKzE0MjEsMTAgQEAKIH0KIAogLyoqCi0gKiBuYW5kX2RvX3JlYWRfb3BzIC0gW0ludGVybmFsXSBSZWFkIGRhdGEgd2l0aCBFQ0MKLSAqCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGZyb206CW9mZnNldCB0byByZWFkIGZyb20KLSAqIEBvcHM6CW9vYiBvcHMgc3RydWN0dXJlCisgKiBuYW5kX2RvX3JlYWRfb3BzIC0gW0lOVEVSTl0gUmVhZCBkYXRhIHdpdGggRUNDCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGZyb206IG9mZnNldCB0byByZWFkIGZyb20KKyAqIEBvcHM6IG9vYiBvcHMgc3RydWN0dXJlCiAgKgogICogSW50ZXJuYWwgZnVuY3Rpb24uIENhbGxlZCB3aXRoIGNoaXAgaGVsZC4KICAqLwpAQCAtMTQ1MSw3ICsxNDM5LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAl1aW50MzJfdCByZWFkbGVuID0gb3BzLT5sZW47CiAJdWludDMyX3Qgb29icmVhZGxlbiA9IG9wcy0+b29ibGVuOwotCXVpbnQzMl90IG1heF9vb2JzaXplID0gb3BzLT5tb2RlID09IE1URF9PT0JfQVVUTyA/CisJdWludDMyX3QgbWF4X29vYnNpemUgPSBvcHMtPm1vZGUgPT0gTVREX09QU19BVVRPX09PQiA/CiAJCW10ZC0+b29iYXZhaWwgOiBtdGQtPm9vYnNpemU7CiAKIAl1aW50OF90ICpidWZwb2ksICpvb2IsICpidWY7CkBAIC0xNDczLDcgKzE0NjEsNyBAQAogCQlieXRlcyA9IG1pbihtdGQtPndyaXRlc2l6ZSAtIGNvbCwgcmVhZGxlbik7CiAJCWFsaWduZWQgPSAoYnl0ZXMgPT0gbXRkLT53cml0ZXNpemUpOwogCi0JCS8qIElzIHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIGJ1ZmZlciA/ICovCisJCS8qIElzIHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIGJ1ZmZlcj8gKi8KIAkJaWYgKHJlYWxwYWdlICE9IGNoaXAtPnBhZ2VidWYgfHwgb29iKSB7CiAJCQlidWZwb2kgPSBhbGlnbmVkID8gYnVmIDogY2hpcC0+YnVmZmVycy0+ZGF0YWJ1ZjsKIApAQCAtMTQ4Myw3ICsxNDcxLDcgQEAKIAkJCX0KIAogCQkJLyogTm93IHJlYWQgdGhlIHBhZ2UgaW50byB0aGUgYnVmZmVyICovCi0JCQlpZiAodW5saWtlbHkob3BzLT5tb2RlID09IE1URF9PT0JfUkFXKSkKKwkJCWlmICh1bmxpa2VseShvcHMtPm1vZGUgPT0gTVREX09QU19SQVcpKQogCQkJCXJldCA9IGNoaXAtPmVjYy5yZWFkX3BhZ2VfcmF3KG10ZCwgY2hpcCwKIAkJCQkJCQkgICAgICBidWZwb2ksIHBhZ2UpOwogCQkJZWxzZSBpZiAoIWFsaWduZWQgJiYgTkFORF9TVUJQQUdFX1JFQUQoY2hpcCkgJiYgIW9vYikKQEAgLTE0OTIsMTQgKzE0ODAsMjIgQEAKIAkJCWVsc2UKIAkJCQlyZXQgPSBjaGlwLT5lY2MucmVhZF9wYWdlKG10ZCwgY2hpcCwgYnVmcG9pLAogCQkJCQkJCSAgcGFnZSk7Ci0JCQlpZiAocmV0IDwgMCkKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJaWYgKCFhbGlnbmVkKQorCQkJCQkvKiBJbnZhbGlkYXRlIHBhZ2UgY2FjaGUgKi8KKwkJCQkJY2hpcC0+cGFnZWJ1ZiA9IC0xOwogCQkJCWJyZWFrOworCQkJfQogCiAJCQkvKiBUcmFuc2ZlciBub3QgYWxpZ25lZCBkYXRhICovCiAJCQlpZiAoIWFsaWduZWQpIHsKIAkJCQlpZiAoIU5BTkRfU1VCUEFHRV9SRUFEKGNoaXApICYmICFvb2IgJiYKLQkJCQkgICAgIShtdGQtPmVjY19zdGF0cy5mYWlsZWQgLSBzdGF0cy5mYWlsZWQpKQorCQkJCSAgICAhKG10ZC0+ZWNjX3N0YXRzLmZhaWxlZCAtIHN0YXRzLmZhaWxlZCkgJiYKKwkJCQkgICAgKG9wcy0+bW9kZSAhPSBNVERfT1BTX1JBVykpCiAJCQkJCWNoaXAtPnBhZ2VidWYgPSByZWFscGFnZTsKKwkJCQllbHNlCisJCQkJCS8qIEludmFsaWRhdGUgcGFnZSBjYWNoZSAqLworCQkJCQljaGlwLT5wYWdlYnVmID0gLTE7CiAJCQkJbWVtY3B5KGJ1ZiwgY2hpcC0+YnVmZmVycy0+ZGF0YWJ1ZiArIGNvbCwgYnl0ZXMpOwogCQkJfQogCkBAIC0xNTM5LDcgKzE1MzUsNyBAQAogCQlpZiAoIXJlYWRsZW4pCiAJCQlicmVhazsKIAotCQkvKiBGb3Igc3Vic2VxdWVudCByZWFkcyBhbGlnbiB0byBwYWdlIGJvdW5kYXJ5LiAqLworCQkvKiBGb3Igc3Vic2VxdWVudCByZWFkcyBhbGlnbiB0byBwYWdlIGJvdW5kYXJ5ICovCiAJCWNvbCA9IDA7CiAJCS8qIEluY3JlbWVudCBwYWdlIGFkZHJlc3MgKi8KIAkJcmVhbHBhZ2UrKzsKQEAgLTE1NTIsOCArMTU0OCw5IEBACiAJCQljaGlwLT5zZWxlY3RfY2hpcChtdGQsIGNoaXBucik7CiAJCX0KIAotCQkvKiBDaGVjaywgaWYgdGhlIGNoaXAgc3VwcG9ydHMgYXV0byBwYWdlIGluY3JlbWVudAotCQkgKiBvciBpZiB3ZSBoYXZlIGhpdCBhIGJsb2NrIGJvdW5kYXJ5LgorCQkvKgorCQkgKiBDaGVjaywgaWYgdGhlIGNoaXAgc3VwcG9ydHMgYXV0byBwYWdlIGluY3JlbWVudCBvciBpZiB3ZQorCQkgKiBoYXZlIGhpdCBhIGJsb2NrIGJvdW5kYXJ5LgogCQkgKi8KIAkJaWYgKCFOQU5EX0NBTkFVVE9JTkNSKGNoaXApIHx8ICEocGFnZSAmIGJsa2NoZWNrKSkKIAkJCXNuZGNtZCA9IDE7CkBAIC0xNTc0LDE4ICsxNTcxLDE5IEBACiAKIC8qKgogICogbmFuZF9yZWFkIC0gW01URCBJbnRlcmZhY2VdIE1URCBjb21wYXRpYmlsaXR5IGZ1bmN0aW9uIGZvciBuYW5kX2RvX3JlYWRfZWNjCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGZyb206CW9mZnNldCB0byByZWFkIGZyb20KLSAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byByZWFkCi0gKiBAcmV0bGVuOglwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcwotICogQGJ1ZjoJdGhlIGRhdGFidWZmZXIgdG8gcHV0IGRhdGEKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZnJvbTogb2Zmc2V0IHRvIHJlYWQgZnJvbQorICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEByZXRsZW46IHBvaW50ZXIgdG8gdmFyaWFibGUgdG8gc3RvcmUgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzCisgKiBAYnVmOiB0aGUgZGF0YWJ1ZmZlciB0byBwdXQgZGF0YQogICoKLSAqIEdldCBob2xkIG9mIHRoZSBjaGlwIGFuZCBjYWxsIG5hbmRfZG9fcmVhZAorICogR2V0IGhvbGQgb2YgdGhlIGNoaXAgYW5kIGNhbGwgbmFuZF9kb19yZWFkLgogICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCiAJCSAgICAgc2l6ZV90ICpyZXRsZW4sIHVpbnQ4X3QgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJldDsKIAogCS8qIERvIG5vdCBhbGxvdyByZWFkcyBwYXN0IGVuZCBvZiBkZXZpY2UgKi8KQEAgLTE1OTYsMTMgKzE1OTQsMTQgQEAKIAogCW5hbmRfZ2V0X2RldmljZShjaGlwLCBtdGQsIEZMX1JFQURJTkcpOwogCi0JY2hpcC0+b3BzLmxlbiA9IGxlbjsKLQljaGlwLT5vcHMuZGF0YnVmID0gYnVmOwotCWNoaXAtPm9wcy5vb2JidWYgPSBOVUxMOworCW9wcy5sZW4gPSBsZW47CisJb3BzLmRhdGJ1ZiA9IGJ1ZjsKKwlvcHMub29iYnVmID0gTlVMTDsKKwlvcHMubW9kZSA9IDA7CiAKLQlyZXQgPSBuYW5kX2RvX3JlYWRfb3BzKG10ZCwgZnJvbSwgJmNoaXAtPm9wcyk7CisJcmV0ID0gbmFuZF9kb19yZWFkX29wcyhtdGQsIGZyb20sICZvcHMpOwogCi0JKnJldGxlbiA9IGNoaXAtPm9wcy5yZXRsZW47CisJKnJldGxlbiA9IG9wcy5yZXRsZW47CiAKIAluYW5kX3JlbGVhc2VfZGV2aWNlKG10ZCk7CiAKQEAgLTE2MTAsMTEgKzE2MDksMTEgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3JlYWRfb29iX3N0ZCAtIFtSRVBMQUNBQkxFXSB0aGUgbW9zdCBjb21tb24gT09CIGRhdGEgcmVhZCBmdW5jdGlvbgotICogQG10ZDoJbXRkIGluZm8gc3RydWN0dXJlCi0gKiBAY2hpcDoJbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCi0gKiBAcGFnZToJcGFnZSBudW1iZXIgdG8gcmVhZAotICogQHNuZGNtZDoJZmxhZyB3aGV0aGVyIHRvIGlzc3VlIHJlYWQgY29tbWFuZCBvciBub3QKKyAqIG5hbmRfcmVhZF9vb2Jfc3RkIC0gW1JFUExBQ0VBQkxFXSB0aGUgbW9zdCBjb21tb24gT09CIGRhdGEgcmVhZCBmdW5jdGlvbgorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gcmVhZAorICogQHNuZGNtZDogZmxhZyB3aGV0aGVyIHRvIGlzc3VlIHJlYWQgY29tbWFuZCBvciBub3QKICAqLwogc3RhdGljIGludCBuYW5kX3JlYWRfb29iX3N0ZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCSAgICAgaW50IHBhZ2UsIGludCBzbmRjbWQpCkBAIC0xNjI4LDEyICsxNjI3LDEyIEBACiB9CiAKIC8qKgotICogbmFuZF9yZWFkX29vYl9zeW5kcm9tZSAtIFtSRVBMQUNBQkxFXSBPT0IgZGF0YSByZWFkIGZ1bmN0aW9uIGZvciBIVyBFQ0MKKyAqIG5hbmRfcmVhZF9vb2Jfc3luZHJvbWUgLSBbUkVQTEFDRUFCTEVdIE9PQiBkYXRhIHJlYWQgZnVuY3Rpb24gZm9yIEhXIEVDQwogICoJCQkgICAgd2l0aCBzeW5kcm9tZXMKLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQHBhZ2U6CXBhZ2UgbnVtYmVyIHRvIHJlYWQKLSAqIEBzbmRjbWQ6CWZsYWcgd2hldGhlciB0byBpc3N1ZSByZWFkIGNvbW1hbmQgb3Igbm90CisgKiBAbXRkOiBtdGQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBwYWdlOiBwYWdlIG51bWJlciB0byByZWFkCisgKiBAc25kY21kOiBmbGFnIHdoZXRoZXIgdG8gaXNzdWUgcmVhZCBjb21tYW5kIG9yIG5vdAogICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2Jfc3luZHJvbWUoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCiAJCQkJICBpbnQgcGFnZSwgaW50IHNuZGNtZCkKQEAgLTE2NjcsMTAgKzE2NjYsMTAgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3dyaXRlX29vYl9zdGQgLSBbUkVQTEFDQUJMRV0gdGhlIG1vc3QgY29tbW9uIE9PQiBkYXRhIHdyaXRlIGZ1bmN0aW9uCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBwYWdlOglwYWdlIG51bWJlciB0byB3cml0ZQorICogbmFuZF93cml0ZV9vb2Jfc3RkIC0gW1JFUExBQ0VBQkxFXSB0aGUgbW9zdCBjb21tb24gT09CIGRhdGEgd3JpdGUgZnVuY3Rpb24KKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQHBhZ2U6IHBhZ2UgbnVtYmVyIHRvIHdyaXRlCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF93cml0ZV9vb2Jfc3RkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJICAgICAgaW50IHBhZ2UpCkBAIC0xNjkwLDExICsxNjg5LDExIEBACiB9CiAKIC8qKgotICogbmFuZF93cml0ZV9vb2Jfc3luZHJvbWUgLSBbUkVQTEFDQUJMRV0gT09CIGRhdGEgd3JpdGUgZnVuY3Rpb24gZm9yIEhXIEVDQwotICoJCQkgICAgIHdpdGggc3luZHJvbWUgLSBvbmx5IGZvciBsYXJnZSBwYWdlIGZsYXNoICEKLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQHBhZ2U6CXBhZ2UgbnVtYmVyIHRvIHdyaXRlCisgKiBuYW5kX3dyaXRlX29vYl9zeW5kcm9tZSAtIFtSRVBMQUNFQUJMRV0gT09CIGRhdGEgd3JpdGUgZnVuY3Rpb24gZm9yIEhXIEVDQworICoJCQkgICAgIHdpdGggc3luZHJvbWUgLSBvbmx5IGZvciBsYXJnZSBwYWdlIGZsYXNoCisgKiBAbXRkOiBtdGQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBwYWdlOiBwYWdlIG51bWJlciB0byB3cml0ZQogICovCiBzdGF0aWMgaW50IG5hbmRfd3JpdGVfb29iX3N5bmRyb21lKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAogCQkJCSAgIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBwYWdlKQpAQCAtMTc0OSwzNCArMTc0OCwzNyBAQAogfQogCiAvKioKLSAqIG5hbmRfZG9fcmVhZF9vb2IgLSBbSW50ZXJuXSBOQU5EIHJlYWQgb3V0LW9mLWJhbmQKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAZnJvbToJb2Zmc2V0IHRvIHJlYWQgZnJvbQotICogQG9wczoJb29iIG9wZXJhdGlvbnMgZGVzY3JpcHRpb24gc3RydWN0dXJlCisgKiBuYW5kX2RvX3JlYWRfb29iIC0gW0lOVEVSTl0gTkFORCByZWFkIG91dC1vZi1iYW5kCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGZyb206IG9mZnNldCB0byByZWFkIGZyb20KKyAqIEBvcHM6IG9vYiBvcGVyYXRpb25zIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQogICoKLSAqIE5BTkQgcmVhZCBvdXQtb2YtYmFuZCBkYXRhIGZyb20gdGhlIHNwYXJlIGFyZWEKKyAqIE5BTkQgcmVhZCBvdXQtb2YtYmFuZCBkYXRhIGZyb20gdGhlIHNwYXJlIGFyZWEuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9kb19yZWFkX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sCiAJCQkgICAgc3RydWN0IG10ZF9vb2Jfb3BzICpvcHMpCiB7CiAJaW50IHBhZ2UsIHJlYWxwYWdlLCBjaGlwbnIsIHNuZGNtZCA9IDE7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgbXRkX2VjY19zdGF0cyBzdGF0czsKIAlpbnQgYmxrY2hlY2sgPSAoMSA8PCAoY2hpcC0+cGh5c19lcmFzZV9zaGlmdCAtIGNoaXAtPnBhZ2Vfc2hpZnQpKSAtIDE7CiAJaW50IHJlYWRsZW4gPSBvcHMtPm9vYmxlbjsKIAlpbnQgbGVuOwogCXVpbnQ4X3QgKmJ1ZiA9IG9wcy0+b29iYnVmOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBmcm9tID0gMHglMDhMeCwgbGVuID0gJWlcbiIsCisJcHJfZGVidWcoIiVzOiBmcm9tID0gMHglMDhMeCwgbGVuID0gJWlcbiIsCiAJCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcgbG9uZylmcm9tLCByZWFkbGVuKTsKIAotCWlmIChvcHMtPm1vZGUgPT0gTVREX09PQl9BVVRPKQorCXN0YXRzID0gbXRkLT5lY2Nfc3RhdHM7CisKKwlpZiAob3BzLT5tb2RlID09IE1URF9PUFNfQVVUT19PT0IpCiAJCWxlbiA9IGNoaXAtPmVjYy5sYXlvdXQtPm9vYmF2YWlsOwogCWVsc2UKIAkJbGVuID0gbXRkLT5vb2JzaXplOwogCiAJaWYgKHVubGlrZWx5KG9wcy0+b29ib2ZmcyA+PSBsZW4pKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogQXR0ZW1wdCB0byBzdGFydCByZWFkICIKLQkJCQkJIm91dHNpZGUgb29iXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogYXR0ZW1wdCB0byBzdGFydCByZWFkIG91dHNpZGUgb29iXG4iLAorCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNzg0LDggKzE3ODYsOCBAQAogCWlmICh1bmxpa2VseShmcm9tID49IG10ZC0+c2l6ZSB8fAogCQkgICAgIG9wcy0+b29ib2ZmcyArIHJlYWRsZW4gPiAoKG10ZC0+c2l6ZSA+PiBjaGlwLT5wYWdlX3NoaWZ0KSAtCiAJCQkJCShmcm9tID4+IGNoaXAtPnBhZ2Vfc2hpZnQpKSAqIGxlbikpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBBdHRlbXB0IHJlYWQgYmV5b25kIGVuZCAiCi0JCQkJCSJvZiBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBhdHRlbXB0IHRvIHJlYWQgYmV5b25kIGVuZCBvZiBkZXZpY2VcbiIsCisJCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3OTcsNyArMTc5OSwxMCBAQAogCXBhZ2UgPSByZWFscGFnZSAmIGNoaXAtPnBhZ2VtYXNrOwogCiAJd2hpbGUgKDEpIHsKLQkJc25kY21kID0gY2hpcC0+ZWNjLnJlYWRfb29iKG10ZCwgY2hpcCwgcGFnZSwgc25kY21kKTsKKwkJaWYgKG9wcy0+bW9kZSA9PSBNVERfT1BTX1JBVykKKwkJCXNuZGNtZCA9IGNoaXAtPmVjYy5yZWFkX29vYl9yYXcobXRkLCBjaGlwLCBwYWdlLCBzbmRjbWQpOworCQllbHNlCisJCQlzbmRjbWQgPSBjaGlwLT5lY2MucmVhZF9vb2IobXRkLCBjaGlwLCBwYWdlLCBzbmRjbWQpOwogCiAJCWxlbiA9IG1pbihsZW4sIHJlYWRsZW4pOwogCQlidWYgPSBuYW5kX3RyYW5zZmVyX29vYihjaGlwLCBidWYsIG9wcywgbGVuKTsKQEAgLTE4MzAsMjQgKzE4MzUsMjkgQEAKIAkJCWNoaXAtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcG5yKTsKIAkJfQogCi0JCS8qIENoZWNrLCBpZiB0aGUgY2hpcCBzdXBwb3J0cyBhdXRvIHBhZ2UgaW5jcmVtZW50Ci0JCSAqIG9yIGlmIHdlIGhhdmUgaGl0IGEgYmxvY2sgYm91bmRhcnkuCisJCS8qCisJCSAqIENoZWNrLCBpZiB0aGUgY2hpcCBzdXBwb3J0cyBhdXRvIHBhZ2UgaW5jcmVtZW50IG9yIGlmIHdlCisJCSAqIGhhdmUgaGl0IGEgYmxvY2sgYm91bmRhcnkuCiAJCSAqLwogCQlpZiAoIU5BTkRfQ0FOQVVUT0lOQ1IoY2hpcCkgfHwgIShwYWdlICYgYmxrY2hlY2spKQogCQkJc25kY21kID0gMTsKIAl9CiAKIAlvcHMtPm9vYnJldGxlbiA9IG9wcy0+b29ibGVuOwotCXJldHVybiAwOworCisJaWYgKG10ZC0+ZWNjX3N0YXRzLmZhaWxlZCAtIHN0YXRzLmZhaWxlZCkKKwkJcmV0dXJuIC1FQkFETVNHOworCisJcmV0dXJuICBtdGQtPmVjY19zdGF0cy5jb3JyZWN0ZWQgLSBzdGF0cy5jb3JyZWN0ZWQgPyAtRVVDTEVBTiA6IDA7CiB9CiAKIC8qKgogICogbmFuZF9yZWFkX29vYiAtIFtNVEQgSW50ZXJmYWNlXSBOQU5EIHJlYWQgZGF0YSBhbmQvb3Igb3V0LW9mLWJhbmQKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAZnJvbToJb2Zmc2V0IHRvIHJlYWQgZnJvbQotICogQG9wczoJb29iIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZnJvbTogb2Zmc2V0IHRvIHJlYWQgZnJvbQorICogQG9wczogb29iIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKICAqCi0gKiBOQU5EIHJlYWQgZGF0YSBhbmQvb3Igb3V0LW9mLWJhbmQgZGF0YQorICogTkFORCByZWFkIGRhdGEgYW5kL29yIG91dC1vZi1iYW5kIGRhdGEuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9yZWFkX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sCiAJCQkgc3RydWN0IG10ZF9vb2Jfb3BzICpvcHMpCkBAIC0xODU5LDE3ICsxODY5LDE3IEBACiAKIAkvKiBEbyBub3QgYWxsb3cgcmVhZHMgcGFzdCBlbmQgb2YgZGV2aWNlICovCiAJaWYgKG9wcy0+ZGF0YnVmICYmIChmcm9tICsgb3BzLT5sZW4pID4gbXRkLT5zaXplKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogQXR0ZW1wdCByZWFkICIKLQkJCQkiYmV5b25kIGVuZCBvZiBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBhdHRlbXB0IHRvIHJlYWQgYmV5b25kIGVuZCBvZiBkZXZpY2VcbiIsCisJCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAluYW5kX2dldF9kZXZpY2UoY2hpcCwgbXRkLCBGTF9SRUFESU5HKTsKIAogCXN3aXRjaCAob3BzLT5tb2RlKSB7Ci0JY2FzZSBNVERfT09CX1BMQUNFOgotCWNhc2UgTVREX09PQl9BVVRPOgotCWNhc2UgTVREX09PQl9SQVc6CisJY2FzZSBNVERfT1BTX1BMQUNFX09PQjoKKwljYXNlIE1URF9PUFNfQVVUT19PT0I6CisJY2FzZSBNVERfT1BTX1JBVzoKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTg4OCwxMiArMTg5OCwxMiBAQAogCiAKIC8qKgotICogbmFuZF93cml0ZV9wYWdlX3JhdyAtIFtJbnRlcm5dIHJhdyBwYWdlIHdyaXRlIGZ1bmN0aW9uCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBidWY6CWRhdGEgYnVmZmVyCisgKiBuYW5kX3dyaXRlX3BhZ2VfcmF3IC0gW0lOVEVSTl0gcmF3IHBhZ2Ugd3JpdGUgZnVuY3Rpb24KKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQGJ1ZjogZGF0YSBidWZmZXIKICAqCi0gKiBOb3QgZm9yIHN5bmRyb21lIGNhbGN1bGF0aW5nIGVjYyBjb250cm9sbGVycywgd2hpY2ggdXNlIGEgc3BlY2lhbCBvb2IgbGF5b3V0CisgKiBOb3QgZm9yIHN5bmRyb21lIGNhbGN1bGF0aW5nIEVDQyBjb250cm9sbGVycywgd2hpY2ggdXNlIGEgc3BlY2lhbCBvb2IgbGF5b3V0LgogICovCiBzdGF0aWMgdm9pZCBuYW5kX3dyaXRlX3BhZ2VfcmF3KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJCWNvbnN0IHVpbnQ4X3QgKmJ1ZikKQEAgLTE5MDMsMTAgKzE5MTMsMTAgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3dyaXRlX3BhZ2VfcmF3X3N5bmRyb21lIC0gW0ludGVybl0gcmF3IHBhZ2Ugd3JpdGUgZnVuY3Rpb24KLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGJ1ZjoJZGF0YSBidWZmZXIKKyAqIG5hbmRfd3JpdGVfcGFnZV9yYXdfc3luZHJvbWUgLSBbSU5URVJOXSByYXcgcGFnZSB3cml0ZSBmdW5jdGlvbgorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAYnVmOiBkYXRhIGJ1ZmZlcgogICoKICAqIFdlIG5lZWQgYSBzcGVjaWFsIG9vYiBsYXlvdXQgYW5kIGhhbmRsaW5nIGV2ZW4gd2hlbiBFQ0MgaXNuJ3QgY2hlY2tlZC4KICAqLwpAQCAtMTk0MiwxMCArMTk1MiwxMCBAQAogCQljaGlwLT53cml0ZV9idWYobXRkLCBvb2IsIHNpemUpOwogfQogLyoqCi0gKiBuYW5kX3dyaXRlX3BhZ2Vfc3dlY2MgLSBbUkVQTEFDQUJMRV0gc29mdHdhcmUgZWNjIGJhc2VkIHBhZ2Ugd3JpdGUgZnVuY3Rpb24KLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGJ1ZjoJZGF0YSBidWZmZXIKKyAqIG5hbmRfd3JpdGVfcGFnZV9zd2VjYyAtIFtSRVBMQUNFQUJMRV0gc29mdHdhcmUgRUNDIGJhc2VkIHBhZ2Ugd3JpdGUgZnVuY3Rpb24KKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQGJ1ZjogZGF0YSBidWZmZXIKICAqLwogc3RhdGljIHZvaWQgbmFuZF93cml0ZV9wYWdlX3N3ZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJCSAgY29uc3QgdWludDhfdCAqYnVmKQpAQCAtMTk1Nyw3ICsxOTY3LDcgQEAKIAljb25zdCB1aW50OF90ICpwID0gYnVmOwogCXVpbnQzMl90ICplY2Nwb3MgPSBjaGlwLT5lY2MubGF5b3V0LT5lY2Nwb3M7CiAKLQkvKiBTb2Z0d2FyZSBlY2MgY2FsY3VsYXRpb24gKi8KKwkvKiBTb2Z0d2FyZSBFQ0MgY2FsY3VsYXRpb24gKi8KIAlmb3IgKGkgPSAwOyBlY2NzdGVwczsgZWNjc3RlcHMtLSwgaSArPSBlY2NieXRlcywgcCArPSBlY2NzaXplKQogCQljaGlwLT5lY2MuY2FsY3VsYXRlKG10ZCwgcCwgJmVjY19jYWxjW2ldKTsKIApAQCAtMTk2OCwxMCArMTk3OCwxMCBAQAogfQogCiAvKioKLSAqIG5hbmRfd3JpdGVfcGFnZV9od2VjYyAtIFtSRVBMQUNBQkxFXSBoYXJkd2FyZSBlY2MgYmFzZWQgcGFnZSB3cml0ZSBmdW5jdGlvbgotICogQG10ZDoJbXRkIGluZm8gc3RydWN0dXJlCi0gKiBAY2hpcDoJbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCi0gKiBAYnVmOglkYXRhIGJ1ZmZlcgorICogbmFuZF93cml0ZV9wYWdlX2h3ZWNjIC0gW1JFUExBQ0VBQkxFXSBoYXJkd2FyZSBFQ0MgYmFzZWQgcGFnZSB3cml0ZSBmdW5jdGlvbgorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAYnVmOiBkYXRhIGJ1ZmZlcgogICovCiBzdGF0aWMgdm9pZCBuYW5kX3dyaXRlX3BhZ2VfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCiAJCQkJICBjb25zdCB1aW50OF90ICpidWYpCkBAIC0xOTk2LDEzICsyMDA2LDEzIEBACiB9CiAKIC8qKgotICogbmFuZF93cml0ZV9wYWdlX3N5bmRyb21lIC0gW1JFUExBQ0FCTEVdIGhhcmR3YXJlIGVjYyBzeW5kcm9tIGJhc2VkIHBhZ2Ugd3JpdGUKLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGJ1ZjoJZGF0YSBidWZmZXIKKyAqIG5hbmRfd3JpdGVfcGFnZV9zeW5kcm9tZSAtIFtSRVBMQUNFQUJMRV0gaGFyZHdhcmUgRUNDIHN5bmRyb21lIGJhc2VkIHBhZ2Ugd3JpdGUKKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQGJ1ZjogZGF0YSBidWZmZXIKICAqCi0gKiBUaGUgaHcgZ2VuZXJhdG9yIGNhbGN1bGF0ZXMgdGhlIGVycm9yIHN5bmRyb21lIGF1dG9tYXRpY2FsbHkuIFRoZXJlZm9yCi0gKiB3ZSBuZWVkIGEgc3BlY2lhbCBvb2IgbGF5b3V0IGFuZCBoYW5kbGluZy4KKyAqIFRoZSBodyBnZW5lcmF0b3IgY2FsY3VsYXRlcyB0aGUgZXJyb3Igc3luZHJvbWUgYXV0b21hdGljYWxseS4gVGhlcmVmb3JlIHdlCisgKiBuZWVkIGEgc3BlY2lhbCBvb2IgbGF5b3V0IGFuZCBoYW5kbGluZy4KICAqLwogc3RhdGljIHZvaWQgbmFuZF93cml0ZV9wYWdlX3N5bmRyb21lKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAogCQkJCSAgICBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBjb25zdCB1aW50OF90ICpidWYpCkBAIC0yMDQxLDEyICsyMDUxLDEyIEBACiAKIC8qKgogICogbmFuZF93cml0ZV9wYWdlIC0gW1JFUExBQ0VBQkxFXSB3cml0ZSBvbmUgcGFnZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBjaGlwOglOQU5EIGNoaXAgZGVzY3JpcHRvcgotICogQGJ1ZjoJdGhlIGRhdGEgdG8gd3JpdGUKLSAqIEBwYWdlOglwYWdlIG51bWJlciB0byB3cml0ZQotICogQGNhY2hlZDoJY2FjaGVkIHByb2dyYW1taW5nCi0gKiBAcmF3Ogl1c2UgX3JhdyB2ZXJzaW9uIG9mIHdyaXRlX3BhZ2UKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAY2hpcDogTkFORCBjaGlwIGRlc2NyaXB0b3IKKyAqIEBidWY6IHRoZSBkYXRhIHRvIHdyaXRlCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gd3JpdGUKKyAqIEBjYWNoZWQ6IGNhY2hlZCBwcm9ncmFtbWluZworICogQHJhdzogdXNlIF9yYXcgdmVyc2lvbiBvZiB3cml0ZV9wYWdlCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF93cml0ZV9wYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgcGFnZSwgaW50IGNhY2hlZCwgaW50IHJhdykKQEAgLTIwNjEsOCArMjA3MSw4IEBACiAJCWNoaXAtPmVjYy53cml0ZV9wYWdlKG10ZCwgY2hpcCwgYnVmKTsKIAogCS8qCi0JICogQ2FjaGVkIHByb2dhbW1pbmcgZGlzYWJsZWQgZm9yIG5vdywgTm90IHN1cmUgaWYgaXRzIHdvcnRoIHRoZQotCSAqIHRyb3VibGUuIFRoZSBzcGVlZCBnYWluIGlzIG5vdCB2ZXJ5IGltcHJlc3NpdmUuICgyLjMtPjIuNk1pYi9zKQorCSAqIENhY2hlZCBwcm9nYW1taW5nIGRpc2FibGVkIGZvciBub3cuIE5vdCBzdXJlIGlmIGl0J3Mgd29ydGggdGhlCisJICogdHJvdWJsZS4gVGhlIHNwZWVkIGdhaW4gaXMgbm90IHZlcnkgaW1wcmVzc2l2ZS4gKDIuMy0+Mi42TWliL3MpLgogCSAqLwogCWNhY2hlZCA9IDA7CiAKQEAgLTIwNzIsNyArMjA4Miw3IEBACiAJCXN0YXR1cyA9IGNoaXAtPndhaXRmdW5jKG10ZCwgY2hpcCk7CiAJCS8qCiAJCSAqIFNlZSBpZiBvcGVyYXRpb24gZmFpbGVkIGFuZCBhZGRpdGlvbmFsIHN0YXR1cyBjaGVja3MgYXJlCi0JCSAqIGF2YWlsYWJsZQorCQkgKiBhdmFpbGFibGUuCiAJCSAqLwogCQlpZiAoKHN0YXR1cyAmIE5BTkRfU1RBVFVTX0ZBSUwpICYmIChjaGlwLT5lcnJzdGF0KSkKIAkJCXN0YXR1cyA9IGNoaXAtPmVycnN0YXQobXRkLCBjaGlwLCBGTF9XUklUSU5HLCBzdGF0dXMsCkBAIC0yMDk2LDI5ICsyMTA2LDM3IEBACiB9CiAKIC8qKgotICogbmFuZF9maWxsX29vYiAtIFtJbnRlcm5hbF0gVHJhbnNmZXIgY2xpZW50IGJ1ZmZlciB0byBvb2IKLSAqIEBjaGlwOgluYW5kIGNoaXAgc3RydWN0dXJlCi0gKiBAb29iOglvb2IgZGF0YSBidWZmZXIKLSAqIEBsZW46CW9vYiBkYXRhIHdyaXRlIGxlbmd0aAotICogQG9wczoJb29iIG9wcyBzdHJ1Y3R1cmUKKyAqIG5hbmRfZmlsbF9vb2IgLSBbSU5URVJOXSBUcmFuc2ZlciBjbGllbnQgYnVmZmVyIHRvIG9vYgorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvb2I6IG9vYiBkYXRhIGJ1ZmZlcgorICogQGxlbjogb29iIGRhdGEgd3JpdGUgbGVuZ3RoCisgKiBAb3BzOiBvb2Igb3BzIHN0cnVjdHVyZQogICovCi1zdGF0aWMgdWludDhfdCAqbmFuZF9maWxsX29vYihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCB1aW50OF90ICpvb2IsIHNpemVfdCBsZW4sCi0JCQkJCQlzdHJ1Y3QgbXRkX29vYl9vcHMgKm9wcykKK3N0YXRpYyB1aW50OF90ICpuYW5kX2ZpbGxfb29iKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpvb2IsIHNpemVfdCBsZW4sCisJCQkgICAgICBzdHJ1Y3QgbXRkX29vYl9vcHMgKm9wcykKIHsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCisJLyoKKwkgKiBJbml0aWFsaXNlIHRvIGFsbCAweEZGLCB0byBhdm9pZCB0aGUgcG9zc2liaWxpdHkgb2YgbGVmdCBvdmVyIE9PQgorCSAqIGRhdGEgZnJvbSBhIHByZXZpb3VzIE9PQiByZWFkLgorCSAqLworCW1lbXNldChjaGlwLT5vb2JfcG9pLCAweGZmLCBtdGQtPm9vYnNpemUpOworCiAJc3dpdGNoIChvcHMtPm1vZGUpIHsKIAotCWNhc2UgTVREX09PQl9QTEFDRToKLQljYXNlIE1URF9PT0JfUkFXOgorCWNhc2UgTVREX09QU19QTEFDRV9PT0I6CisJY2FzZSBNVERfT1BTX1JBVzoKIAkJbWVtY3B5KGNoaXAtPm9vYl9wb2kgKyBvcHMtPm9vYm9mZnMsIG9vYiwgbGVuKTsKIAkJcmV0dXJuIG9vYiArIGxlbjsKIAotCWNhc2UgTVREX09PQl9BVVRPOiB7CisJY2FzZSBNVERfT1BTX0FVVE9fT09COiB7CiAJCXN0cnVjdCBuYW5kX29vYmZyZWUgKmZyZWUgPSBjaGlwLT5lY2MubGF5b3V0LT5vb2JmcmVlOwogCQl1aW50MzJfdCBib2ZmcyA9IDAsIHdvZmZzID0gb3BzLT5vb2JvZmZzOwogCQlzaXplX3QgYnl0ZXMgPSAwOwogCiAJCWZvciAoOyBmcmVlLT5sZW5ndGggJiYgbGVuOyBmcmVlKyssIGxlbiAtPSBieXRlcykgewotCQkJLyogV3JpdGUgcmVxdWVzdCBub3QgZnJvbSBvZmZzZXQgMCA/ICovCisJCQkvKiBXcml0ZSByZXF1ZXN0IG5vdCBmcm9tIG9mZnNldCAwPyAqLwogCQkJaWYgKHVubGlrZWx5KHdvZmZzKSkgewogCQkJCWlmICh3b2ZmcyA+PSBmcmVlLT5sZW5ndGgpIHsKIAkJCQkJd29mZnMgLT0gZnJlZS0+bGVuZ3RoOwpAQCAtMjE0NiwxMiArMjE2NCwxMiBAQAogI2RlZmluZSBOT1RBTElHTkVEKHgpCSgoeCAmIChjaGlwLT5zdWJwYWdlc2l6ZSAtIDEpKSAhPSAwKQogCiAvKioKLSAqIG5hbmRfZG9fd3JpdGVfb3BzIC0gW0ludGVybmFsXSBOQU5EIHdyaXRlIHdpdGggRUNDCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQHRvOgkJb2Zmc2V0IHRvIHdyaXRlIHRvCi0gKiBAb3BzOglvb2Igb3BlcmF0aW9ucyBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKyAqIG5hbmRfZG9fd3JpdGVfb3BzIC0gW0lOVEVSTl0gTkFORCB3cml0ZSB3aXRoIEVDQworICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0bzogb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiBAb3BzOiBvb2Igb3BlcmF0aW9ucyBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKICAqCi0gKiBOQU5EIHdyaXRlIHdpdGggRUNDCisgKiBOQU5EIHdyaXRlIHdpdGggRUNDLgogICovCiBzdGF0aWMgaW50IG5hbmRfZG9fd3JpdGVfb3BzKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sCiAJCQkgICAgIHN0cnVjdCBtdGRfb29iX29wcyAqb3BzKQpAQCAtMjE2MSw3ICsyMTc5LDcgQEAKIAl1aW50MzJfdCB3cml0ZWxlbiA9IG9wcy0+bGVuOwogCiAJdWludDMyX3Qgb29id3JpdGVsZW4gPSBvcHMtPm9vYmxlbjsKLQl1aW50MzJfdCBvb2JtYXhsZW4gPSBvcHMtPm1vZGUgPT0gTVREX09PQl9BVVRPID8KKwl1aW50MzJfdCBvb2JtYXhsZW4gPSBvcHMtPm1vZGUgPT0gTVREX09QU19BVVRPX09PQiA/CiAJCQkJbXRkLT5vb2JhdmFpbCA6IG10ZC0+b29ic2l6ZTsKIAogCXVpbnQ4X3QgKm9vYiA9IG9wcy0+b29iYnVmOwpAQCAtMjE3MiwxMCArMjE5MCwxMCBAQAogCWlmICghd3JpdGVsZW4pCiAJCXJldHVybiAwOwogCi0JLyogcmVqZWN0IHdyaXRlcywgd2hpY2ggYXJlIG5vdCBwYWdlIGFsaWduZWQgKi8KKwkvKiBSZWplY3Qgd3JpdGVzLCB3aGljaCBhcmUgbm90IHBhZ2UgYWxpZ25lZCAqLwogCWlmIChOT1RBTElHTkVEKHRvKSB8fCBOT1RBTElHTkVEKG9wcy0+bGVuKSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBBdHRlbXB0IHRvIHdyaXRlIG5vdCAiCi0JCQkJInBhZ2UgYWxpZ25lZCBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXByX25vdGljZSgiJXM6IGF0dGVtcHQgdG8gd3JpdGUgbm9uIHBhZ2UgYWxpZ25lZCBkYXRhXG4iLAorCQkJICAgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIyMDEsMTAgKzIyMTksNiBAQAogCSAgICAoY2hpcC0+cGFnZWJ1ZiA8PCBjaGlwLT5wYWdlX3NoaWZ0KSA8ICh0byArIG9wcy0+bGVuKSkKIAkJY2hpcC0+cGFnZWJ1ZiA9IC0xOwogCi0JLyogSWYgd2UncmUgbm90IGdpdmVuIGV4cGxpY2l0IE9PQiBkYXRhLCBsZXQgaXQgYmUgMHhGRiAqLwotCWlmIChsaWtlbHkoIW9vYikpCi0JCW1lbXNldChjaGlwLT5vb2JfcG9pLCAweGZmLCBtdGQtPm9vYnNpemUpOwotCiAJLyogRG9uJ3QgYWxsb3cgbXVsdGlwYWdlIG9vYiB3cml0ZXMgd2l0aCBvZmZzZXQgKi8KIAlpZiAob29iICYmIG9wcy0+b29ib2ZmcyAmJiAob3BzLT5vb2JvZmZzICsgb3BzLT5vb2JsZW4gPiBvb2JtYXhsZW4pKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyMTQsNyArMjIyOCw3IEBACiAJCWludCBjYWNoZWQgPSB3cml0ZWxlbiA+IGJ5dGVzICYmIHBhZ2UgIT0gYmxvY2ttYXNrOwogCQl1aW50OF90ICp3YnVmID0gYnVmOwogCi0JCS8qIFBhcnRpYWwgcGFnZSB3cml0ZSA/ICovCisJCS8qIFBhcnRpYWwgcGFnZSB3cml0ZT8gKi8KIAkJaWYgKHVubGlrZWx5KGNvbHVtbiB8fCB3cml0ZWxlbiA8IChtdGQtPndyaXRlc2l6ZSAtIDEpKSkgewogCQkJY2FjaGVkID0gMDsKIAkJCWJ5dGVzID0gbWluX3QoaW50LCBieXRlcyAtIGNvbHVtbiwgKGludCkgd3JpdGVsZW4pOwpAQCAtMjIyNiwxMiArMjI0MCwxNSBAQAogCiAJCWlmICh1bmxpa2VseShvb2IpKSB7CiAJCQlzaXplX3QgbGVuID0gbWluKG9vYndyaXRlbGVuLCBvb2JtYXhsZW4pOwotCQkJb29iID0gbmFuZF9maWxsX29vYihjaGlwLCBvb2IsIGxlbiwgb3BzKTsKKwkJCW9vYiA9IG5hbmRfZmlsbF9vb2IobXRkLCBvb2IsIGxlbiwgb3BzKTsKIAkJCW9vYndyaXRlbGVuIC09IGxlbjsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIHN0aWxsIG5lZWQgdG8gZXJhc2UgbGVmdG92ZXIgT09CIGRhdGEgKi8KKwkJCW1lbXNldChjaGlwLT5vb2JfcG9pLCAweGZmLCBtdGQtPm9vYnNpemUpOwogCQl9CiAKIAkJcmV0ID0gY2hpcC0+d3JpdGVfcGFnZShtdGQsIGNoaXAsIHdidWYsIHBhZ2UsIGNhY2hlZCwKLQkJCQkgICAgICAgKG9wcy0+bW9kZSA9PSBNVERfT09CX1JBVykpOworCQkJCSAgICAgICAob3BzLT5tb2RlID09IE1URF9PUFNfUkFXKSk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIApAQCAtMjI2MCwxMSArMjI3NywxMSBAQAogCiAvKioKICAqIHBhbmljX25hbmRfd3JpdGUgLSBbTVREIEludGVyZmFjZV0gTkFORCB3cml0ZSB3aXRoIEVDQwotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEB0bzoJCW9mZnNldCB0byB3cml0ZSB0bwotICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCi0gKiBAcmV0bGVuOglwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcwotICogQGJ1ZjoJdGhlIGRhdGEgdG8gd3JpdGUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdG86IG9mZnNldCB0byB3cml0ZSB0bworICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKiBAcmV0bGVuOiBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcworICogQGJ1ZjogdGhlIGRhdGEgdG8gd3JpdGUKICAqCiAgKiBOQU5EIHdyaXRlIHdpdGggRUNDLiBVc2VkIHdoZW4gcGVyZm9ybWluZyB3cml0ZXMgaW4gaW50ZXJydXB0IGNvbnRleHQsIHRoaXMKICAqIG1heSBmb3IgZXhhbXBsZSBiZSBjYWxsZWQgYnkgbXRkb29wcyB3aGVuIHdyaXRpbmcgYW4gb29wcyB3aGlsZSBpbiBwYW5pYy4KQEAgLTIyNzMsNiArMjI5MCw3IEBACiAJCQkgICAgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVpbnQ4X3QgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJldDsKIAogCS8qIERvIG5vdCBhbGxvdyByZWFkcyBwYXN0IGVuZCBvZiBkZXZpY2UgKi8KQEAgLTIyODEsMzYgKzIyOTksMzggQEAKIAlpZiAoIWxlbikKIAkJcmV0dXJuIDA7CiAKLQkvKiBXYWl0IGZvciB0aGUgZGV2aWNlIHRvIGdldCByZWFkeS4gICovCisJLyogV2FpdCBmb3IgdGhlIGRldmljZSB0byBnZXQgcmVhZHkgKi8KIAlwYW5pY19uYW5kX3dhaXQobXRkLCBjaGlwLCA0MDApOwogCi0JLyogR3JhYiB0aGUgZGV2aWNlLiAgKi8KKwkvKiBHcmFiIHRoZSBkZXZpY2UgKi8KIAlwYW5pY19uYW5kX2dldF9kZXZpY2UoY2hpcCwgbXRkLCBGTF9XUklUSU5HKTsKIAotCWNoaXAtPm9wcy5sZW4gPSBsZW47Ci0JY2hpcC0+b3BzLmRhdGJ1ZiA9ICh1aW50OF90ICopYnVmOwotCWNoaXAtPm9wcy5vb2JidWYgPSBOVUxMOworCW9wcy5sZW4gPSBsZW47CisJb3BzLmRhdGJ1ZiA9ICh1aW50OF90ICopYnVmOworCW9wcy5vb2JidWYgPSBOVUxMOworCW9wcy5tb2RlID0gMDsKIAotCXJldCA9IG5hbmRfZG9fd3JpdGVfb3BzKG10ZCwgdG8sICZjaGlwLT5vcHMpOworCXJldCA9IG5hbmRfZG9fd3JpdGVfb3BzKG10ZCwgdG8sICZvcHMpOwogCi0JKnJldGxlbiA9IGNoaXAtPm9wcy5yZXRsZW47CisJKnJldGxlbiA9IG9wcy5yZXRsZW47CiAJcmV0dXJuIHJldDsKIH0KIAogLyoqCiAgKiBuYW5kX3dyaXRlIC0gW01URCBJbnRlcmZhY2VdIE5BTkQgd3JpdGUgd2l0aCBFQ0MKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAdG86CQlvZmZzZXQgdG8gd3JpdGUgdG8KLSAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byB3cml0ZQotICogQHJldGxlbjoJcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMKLSAqIEBidWY6CXRoZSBkYXRhIHRvIHdyaXRlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHRvOiBvZmZzZXQgdG8gd3JpdGUgdG8KKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICogQHJldGxlbjogcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMKKyAqIEBidWY6IHRoZSBkYXRhIHRvIHdyaXRlCiAgKgotICogTkFORCB3cml0ZSB3aXRoIEVDQworICogTkFORCB3cml0ZSB3aXRoIEVDQy4KICAqLwogc3RhdGljIGludCBuYW5kX3dyaXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCiAJCQkgIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1aW50OF90ICpidWYpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCWludCByZXQ7CiAKIAkvKiBEbyBub3QgYWxsb3cgcmVhZHMgcGFzdCBlbmQgb2YgZGV2aWNlICovCkBAIC0yMzIxLDEzICsyMzQxLDE0IEBACiAKIAluYW5kX2dldF9kZXZpY2UoY2hpcCwgbXRkLCBGTF9XUklUSU5HKTsKIAotCWNoaXAtPm9wcy5sZW4gPSBsZW47Ci0JY2hpcC0+b3BzLmRhdGJ1ZiA9ICh1aW50OF90ICopYnVmOwotCWNoaXAtPm9wcy5vb2JidWYgPSBOVUxMOworCW9wcy5sZW4gPSBsZW47CisJb3BzLmRhdGJ1ZiA9ICh1aW50OF90ICopYnVmOworCW9wcy5vb2JidWYgPSBOVUxMOworCW9wcy5tb2RlID0gMDsKIAotCXJldCA9IG5hbmRfZG9fd3JpdGVfb3BzKG10ZCwgdG8sICZjaGlwLT5vcHMpOworCXJldCA9IG5hbmRfZG9fd3JpdGVfb3BzKG10ZCwgdG8sICZvcHMpOwogCi0JKnJldGxlbiA9IGNoaXAtPm9wcy5yZXRsZW47CisJKnJldGxlbiA9IG9wcy5yZXRsZW47CiAKIAluYW5kX3JlbGVhc2VfZGV2aWNlKG10ZCk7CiAKQEAgLTIzMzYsMTEgKzIzNTcsMTEgQEAKIAogLyoqCiAgKiBuYW5kX2RvX3dyaXRlX29vYiAtIFtNVEQgSW50ZXJmYWNlXSBOQU5EIHdyaXRlIG91dC1vZi1iYW5kCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQHRvOgkJb2Zmc2V0IHRvIHdyaXRlIHRvCi0gKiBAb3BzOglvb2Igb3BlcmF0aW9uIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0bzogb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiBAb3BzOiBvb2Igb3BlcmF0aW9uIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQogICoKLSAqIE5BTkQgd3JpdGUgb3V0LW9mLWJhbmQKKyAqIE5BTkQgd3JpdGUgb3V0LW9mLWJhbmQuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9kb193cml0ZV9vb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywKIAkJCSAgICAgc3RydWN0IG10ZF9vb2Jfb3BzICpvcHMpCkBAIC0yMzQ4LDI0ICsyMzY5LDI0IEBACiAJaW50IGNoaXBuciwgcGFnZSwgc3RhdHVzLCBsZW47CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogdG8gPSAweCUwOHgsIGxlbiA9ICVpXG4iLAorCXByX2RlYnVnKCIlczogdG8gPSAweCUwOHgsIGxlbiA9ICVpXG4iLAogCQkJIF9fZnVuY19fLCAodW5zaWduZWQgaW50KXRvLCAoaW50KW9wcy0+b29ibGVuKTsKIAotCWlmIChvcHMtPm1vZGUgPT0gTVREX09PQl9BVVRPKQorCWlmIChvcHMtPm1vZGUgPT0gTVREX09QU19BVVRPX09PQikKIAkJbGVuID0gY2hpcC0+ZWNjLmxheW91dC0+b29iYXZhaWw7CiAJZWxzZQogCQlsZW4gPSBtdGQtPm9vYnNpemU7CiAKIAkvKiBEbyBub3QgYWxsb3cgd3JpdGUgcGFzdCBlbmQgb2YgcGFnZSAqLwogCWlmICgob3BzLT5vb2JvZmZzICsgb3BzLT5vb2JsZW4pID4gbGVuKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogQXR0ZW1wdCB0byB3cml0ZSAiCi0JCQkJInBhc3QgZW5kIG9mIHBhZ2VcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBhdHRlbXB0IHRvIHdyaXRlIHBhc3QgZW5kIG9mIHBhZ2VcbiIsCisJCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAodW5saWtlbHkob3BzLT5vb2JvZmZzID49IGxlbikpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBBdHRlbXB0IHRvIHN0YXJ0ICIKLQkJCQkid3JpdGUgb3V0c2lkZSBvb2JcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBhdHRlbXB0IHRvIHN0YXJ0IHdyaXRlIG91dHNpZGUgb29iXG4iLAorCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMzc0LDggKzIzOTUsOCBAQAogCQkgICAgIG9wcy0+b29ib2ZmcyArIG9wcy0+b29ibGVuID4KIAkJCSgobXRkLT5zaXplID4+IGNoaXAtPnBhZ2Vfc2hpZnQpIC0KIAkJCSAodG8gPj4gY2hpcC0+cGFnZV9zaGlmdCkpICogbGVuKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IEF0dGVtcHQgd3JpdGUgYmV5b25kICIKLQkJCQkiZW5kIG9mIGRldmljZVxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IGF0dGVtcHQgdG8gd3JpdGUgYmV5b25kIGVuZCBvZiBkZXZpY2VcbiIsCisJCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI0MDEsMTAgKzI0MjIsMTIgQEAKIAlpZiAocGFnZSA9PSBjaGlwLT5wYWdlYnVmKQogCQljaGlwLT5wYWdlYnVmID0gLTE7CiAKLQltZW1zZXQoY2hpcC0+b29iX3BvaSwgMHhmZiwgbXRkLT5vb2JzaXplKTsKLQluYW5kX2ZpbGxfb29iKGNoaXAsIG9wcy0+b29iYnVmLCBvcHMtPm9vYmxlbiwgb3BzKTsKLQlzdGF0dXMgPSBjaGlwLT5lY2Mud3JpdGVfb29iKG10ZCwgY2hpcCwgcGFnZSAmIGNoaXAtPnBhZ2VtYXNrKTsKLQltZW1zZXQoY2hpcC0+b29iX3BvaSwgMHhmZiwgbXRkLT5vb2JzaXplKTsKKwluYW5kX2ZpbGxfb29iKG10ZCwgb3BzLT5vb2JidWYsIG9wcy0+b29ibGVuLCBvcHMpOworCisJaWYgKG9wcy0+bW9kZSA9PSBNVERfT1BTX1JBVykKKwkJc3RhdHVzID0gY2hpcC0+ZWNjLndyaXRlX29vYl9yYXcobXRkLCBjaGlwLCBwYWdlICYgY2hpcC0+cGFnZW1hc2spOworCWVsc2UKKwkJc3RhdHVzID0gY2hpcC0+ZWNjLndyaXRlX29vYihtdGQsIGNoaXAsIHBhZ2UgJiBjaGlwLT5wYWdlbWFzayk7CiAKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwpAQCAtMjQxNiw5ICsyNDM5LDkgQEAKIAogLyoqCiAgKiBuYW5kX3dyaXRlX29vYiAtIFtNVEQgSW50ZXJmYWNlXSBOQU5EIHdyaXRlIGRhdGEgYW5kL29yIG91dC1vZi1iYW5kCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQHRvOgkJb2Zmc2V0IHRvIHdyaXRlIHRvCi0gKiBAb3BzOglvb2Igb3BlcmF0aW9uIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0bzogb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiBAb3BzOiBvb2Igb3BlcmF0aW9uIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQogICovCiBzdGF0aWMgaW50IG5hbmRfd3JpdGVfb29iKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sCiAJCQkgIHN0cnVjdCBtdGRfb29iX29wcyAqb3BzKQpAQCAtMjQzMCwxNyArMjQ1MywxNyBAQAogCiAJLyogRG8gbm90IGFsbG93IHdyaXRlcyBwYXN0IGVuZCBvZiBkZXZpY2UgKi8KIAlpZiAob3BzLT5kYXRidWYgJiYgKHRvICsgb3BzLT5sZW4pID4gbXRkLT5zaXplKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogQXR0ZW1wdCB3cml0ZSBiZXlvbmQgIgotCQkJCSJlbmQgb2YgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogYXR0ZW1wdCB0byB3cml0ZSBiZXlvbmQgZW5kIG9mIGRldmljZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCW5hbmRfZ2V0X2RldmljZShjaGlwLCBtdGQsIEZMX1dSSVRJTkcpOwogCiAJc3dpdGNoIChvcHMtPm1vZGUpIHsKLQljYXNlIE1URF9PT0JfUExBQ0U6Ci0JY2FzZSBNVERfT09CX0FVVE86Ci0JY2FzZSBNVERfT09CX1JBVzoKKwljYXNlIE1URF9PUFNfUExBQ0VfT09COgorCWNhc2UgTVREX09QU19BVVRPX09PQjoKKwljYXNlIE1URF9PUFNfUkFXOgogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0yNDU4LDExICsyNDgxLDExIEBACiB9CiAKIC8qKgotICogc2luZ2xlX2VyZWFzZV9jbWQgLSBbR0VORVJJQ10gTkFORCBzdGFuZGFyZCBibG9jayBlcmFzZSBjb21tYW5kIGZ1bmN0aW9uCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQHBhZ2U6CXRoZSBwYWdlIGFkZHJlc3Mgb2YgdGhlIGJsb2NrIHdoaWNoIHdpbGwgYmUgZXJhc2VkCisgKiBzaW5nbGVfZXJhc2VfY21kIC0gW0dFTkVSSUNdIE5BTkQgc3RhbmRhcmQgYmxvY2sgZXJhc2UgY29tbWFuZCBmdW5jdGlvbgorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYWdlOiB0aGUgcGFnZSBhZGRyZXNzIG9mIHRoZSBibG9jayB3aGljaCB3aWxsIGJlIGVyYXNlZAogICoKLSAqIFN0YW5kYXJkIGVyYXNlIGNvbW1hbmQgZm9yIE5BTkQgY2hpcHMKKyAqIFN0YW5kYXJkIGVyYXNlIGNvbW1hbmQgZm9yIE5BTkQgY2hpcHMuCiAgKi8KIHN0YXRpYyB2b2lkIHNpbmdsZV9lcmFzZV9jbWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBwYWdlKQogewpAQCAtMjQ3MywxMiArMjQ5NiwxMSBAQAogfQogCiAvKioKLSAqIG11bHRpX2VyZWFzZV9jbWQgLSBbR0VORVJJQ10gQU5EIHNwZWNpZmljIGJsb2NrIGVyYXNlIGNvbW1hbmQgZnVuY3Rpb24KLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAcGFnZToJdGhlIHBhZ2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgd2hpY2ggd2lsbCBiZSBlcmFzZWQKKyAqIG11bHRpX2VyYXNlX2NtZCAtIFtHRU5FUklDXSBBTkQgc3BlY2lmaWMgYmxvY2sgZXJhc2UgY29tbWFuZCBmdW5jdGlvbgorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYWdlOiB0aGUgcGFnZSBhZGRyZXNzIG9mIHRoZSBibG9jayB3aGljaCB3aWxsIGJlIGVyYXNlZAogICoKLSAqIEFORCBtdWx0aSBibG9jayBlcmFzZSBjb21tYW5kIGZ1bmN0aW9uCi0gKiBFcmFzZSA0IGNvbnNlY3V0aXZlIGJsb2NrcworICogQU5EIG11bHRpIGJsb2NrIGVyYXNlIGNvbW1hbmQgZnVuY3Rpb24uIEVyYXNlIDQgY29uc2VjdXRpdmUgYmxvY2tzLgogICovCiBzdGF0aWMgdm9pZCBtdWx0aV9lcmFzZV9jbWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBwYWdlKQogewpAQCAtMjQ5MywxMCArMjUxNSwxMCBAQAogCiAvKioKICAqIG5hbmRfZXJhc2UgLSBbTVREIEludGVyZmFjZV0gZXJhc2UgYmxvY2socykKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAaW5zdHI6CWVyYXNlIGluc3RydWN0aW9uCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGluc3RyOiBlcmFzZSBpbnN0cnVjdGlvbgogICoKLSAqIEVyYXNlIG9uZSBvcmUgbW9yZSBibG9ja3MKKyAqIEVyYXNlIG9uZSBvcmUgbW9yZSBibG9ja3MuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQogewpAQCAtMjUwNSwxMiArMjUyNywxMiBAQAogCiAjZGVmaW5lIEJCVF9QQUdFX01BU0sJMHhmZmZmZmYzZgogLyoqCi0gKiBuYW5kX2VyYXNlX25hbmQgLSBbSW50ZXJuYWxdIGVyYXNlIGJsb2NrKHMpCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGluc3RyOgllcmFzZSBpbnN0cnVjdGlvbgotICogQGFsbG93YmJ0OglhbGxvdyBlcmFzaW5nIHRoZSBiYnQgYXJlYQorICogbmFuZF9lcmFzZV9uYW5kIC0gW0lOVEVSTl0gZXJhc2UgYmxvY2socykKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaW5zdHI6IGVyYXNlIGluc3RydWN0aW9uCisgKiBAYWxsb3diYnQ6IGFsbG93IGVyYXNpbmcgdGhlIGJidCBhcmVhCiAgKgotICogRXJhc2Ugb25lIG9yZSBtb3JlIGJsb2NrcworICogRXJhc2Ugb25lIG9yZSBtb3JlIGJsb2Nrcy4KICAqLwogaW50IG5hbmRfZXJhc2VfbmFuZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyLAogCQkgICAgaW50IGFsbG93YmJ0KQpAQCAtMjUyMSw5ICsyNTQzLDkgQEAKIAl1bnNpZ25lZCBpbnQgYmJ0X21hc2tlZF9wYWdlID0gMHhmZmZmZmZmZjsKIAlsb2ZmX3QgbGVuOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBzdGFydCA9IDB4JTAxMmxseCwgbGVuID0gJWxsdVxuIiwKLQkJCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnN0ci0+YWRkciwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWluc3RyLT5sZW4pOworCXByX2RlYnVnKCIlczogc3RhcnQgPSAweCUwMTJsbHgsIGxlbiA9ICVsbHVcbiIsCisJCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnN0ci0+YWRkciwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5zdHItPmxlbik7CiAKIAlpZiAoY2hlY2tfb2Zmc19sZW4obXRkLCBpbnN0ci0+YWRkciwgaW5zdHItPmxlbikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjU0NSw4ICsyNTY3LDggQEAKIAogCS8qIENoZWNrLCBpZiBpdCBpcyB3cml0ZSBwcm90ZWN0ZWQgKi8KIAlpZiAobmFuZF9jaGVja193cChtdGQpKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogRGV2aWNlIGlzIHdyaXRlIHByb3RlY3RlZCEhIVxuIiwKLQkJCQkJX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IGRldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQhXG4iLAorCQkJCV9fZnVuY19fKTsKIAkJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0ZBSUxFRDsKIAkJZ290byBlcmFzZV9leGl0OwogCX0KQEAgLTI1NTUsNyArMjU3Nyw3IEBACiAJICogSWYgQkJUIHJlcXVpcmVzIHJlZnJlc2gsIHNldCB0aGUgQkJUIHBhZ2UgbWFzayB0byBzZWUgaWYgdGhlIEJCVAogCSAqIHNob3VsZCBiZSByZXdyaXR0ZW4uIE90aGVyd2lzZSB0aGUgbWFzayBpcyBzZXQgdG8gMHhmZmZmZmZmZiB3aGljaAogCSAqIGNhbiBub3QgYmUgbWF0Y2hlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2hlbiB0aGUgYmJ0IGlzIGFjdHVhbGx5Ci0JICogZXJhc2VkIHRvIGF2b2lkIHJlY3VzcnNpdmUgdXBkYXRlcworCSAqIGVyYXNlZCB0byBhdm9pZCByZWN1cnNpdmUgdXBkYXRlcy4KIAkgKi8KIAlpZiAoY2hpcC0+b3B0aW9ucyAmIEJCVF9BVVRPX1JFRlJFU0ggJiYgIWFsbG93YmJ0KQogCQliYnRfbWFza2VkX3BhZ2UgPSBjaGlwLT5iYnRfdGQtPnBhZ2VzW2NoaXBucl0gJiBCQlRfUEFHRV9NQVNLOwpAQCAtMjU2NiwyMCArMjU4OCwxOCBAQAogCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTSU5HOwogCiAJd2hpbGUgKGxlbikgewotCQkvKgotCQkgKiBoZWNrIGlmIHdlIGhhdmUgYSBiYWQgYmxvY2ssIHdlIGRvIG5vdCBlcmFzZSBiYWQgYmxvY2tzICEKLQkJICovCisJCS8qIEhlY2sgaWYgd2UgaGF2ZSBhIGJhZCBibG9jaywgd2UgZG8gbm90IGVyYXNlIGJhZCBibG9ja3MhICovCiAJCWlmIChuYW5kX2Jsb2NrX2NoZWNrYmFkKG10ZCwgKChsb2ZmX3QpIHBhZ2UpIDw8CiAJCQkJCWNoaXAtPnBhZ2Vfc2hpZnQsIDAsIGFsbG93YmJ0KSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGF0dGVtcHQgdG8gZXJhc2UgYSBiYWQgYmxvY2sgIgotCQkJCQkiYXQgcGFnZSAweCUwOHhcbiIsIF9fZnVuY19fLCBwYWdlKTsKKwkJCXByX3dhcm4oIiVzOiBhdHRlbXB0IHRvIGVyYXNlIGEgYmFkIGJsb2NrIGF0IHBhZ2UgMHglMDh4XG4iLAorCQkJCSAgICBfX2Z1bmNfXywgcGFnZSk7CiAJCQlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRkFJTEVEOwogCQkJZ290byBlcmFzZV9leGl0OwogCQl9CiAKIAkJLyoKIAkJICogSW52YWxpZGF0ZSB0aGUgcGFnZSBjYWNoZSwgaWYgd2UgZXJhc2UgdGhlIGJsb2NrIHdoaWNoCi0JCSAqIGNvbnRhaW5zIHRoZSBjdXJyZW50IGNhY2hlZCBwYWdlCisJCSAqIGNvbnRhaW5zIHRoZSBjdXJyZW50IGNhY2hlZCBwYWdlLgogCQkgKi8KIAkJaWYgKHBhZ2UgPD0gY2hpcC0+cGFnZWJ1ZiAmJiBjaGlwLT5wYWdlYnVmIDwKIAkJICAgIChwYWdlICsgcGFnZXNfcGVyX2Jsb2NrKSkKQEAgLTI1OTksOCArMjYxOSw4IEBACiAKIAkJLyogU2VlIGlmIGJsb2NrIGVyYXNlIHN1Y2NlZWRlZCAqLwogCQlpZiAoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkgewotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBGYWlsZWQgZXJhc2UsICIKLQkJCQkJInBhZ2UgMHglMDh4XG4iLCBfX2Z1bmNfXywgcGFnZSk7CisJCQlwcl9kZWJ1ZygiJXM6IGZhaWxlZCBlcmFzZSwgcGFnZSAweCUwOHhcbiIsCisJCQkJCV9fZnVuY19fLCBwYWdlKTsKIAkJCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9GQUlMRUQ7CiAJCQlpbnN0ci0+ZmFpbF9hZGRyID0KIAkJCQkoKGxvZmZfdClwYWdlIDw8IGNoaXAtPnBhZ2Vfc2hpZnQpOwpAQCAtMjYwOSw3ICsyNjI5LDcgQEAKIAogCQkvKgogCQkgKiBJZiBCQlQgcmVxdWlyZXMgcmVmcmVzaCwgc2V0IHRoZSBCQlQgcmV3cml0ZSBmbGFnIHRvIHRoZQotCQkgKiBwYWdlIGJlaW5nIGVyYXNlZAorCQkgKiBwYWdlIGJlaW5nIGVyYXNlZC4KIAkJICovCiAJCWlmIChiYnRfbWFza2VkX3BhZ2UgIT0gMHhmZmZmZmZmZiAmJgogCQkgICAgKHBhZ2UgJiBCQlRfUEFHRV9NQVNLKSA9PSBiYnRfbWFza2VkX3BhZ2UpCkBAIC0yNjI4LDcgKzI2NDgsNyBAQAogCiAJCQkvKgogCQkJICogSWYgQkJUIHJlcXVpcmVzIHJlZnJlc2ggYW5kIEJCVC1QRVJDSElQLCBzZXQgdGhlIEJCVAotCQkJICogcGFnZSBtYXNrIHRvIHNlZSBpZiB0aGlzIEJCVCBzaG91bGQgYmUgcmV3cml0dGVuCisJCQkgKiBwYWdlIG1hc2sgdG8gc2VlIGlmIHRoaXMgQkJUIHNob3VsZCBiZSByZXdyaXR0ZW4uCiAJCQkgKi8KIAkJCWlmIChiYnRfbWFza2VkX3BhZ2UgIT0gMHhmZmZmZmZmZiAmJgogCQkJICAgIChjaGlwLT5iYnRfdGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9QRVJDSElQKSkKQEAgLTI2NTEsNyArMjY3MSw3IEBACiAKIAkvKgogCSAqIElmIEJCVCByZXF1aXJlcyByZWZyZXNoIGFuZCBlcmFzZSB3YXMgc3VjY2Vzc2Z1bCwgcmV3cml0ZSBhbnkKLQkgKiBzZWxlY3RlZCBiYWQgYmxvY2sgdGFibGVzCisJICogc2VsZWN0ZWQgYmFkIGJsb2NrIHRhYmxlcy4KIAkgKi8KIAlpZiAoYmJ0X21hc2tlZF9wYWdlID09IDB4ZmZmZmZmZmYgfHwgcmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMjY1OSwxMCArMjY3OSwxMCBAQAogCWZvciAoY2hpcG5yID0gMDsgY2hpcG5yIDwgY2hpcC0+bnVtY2hpcHM7IGNoaXBucisrKSB7CiAJCWlmICghcmV3cml0ZV9iYnRbY2hpcG5yXSkKIAkJCWNvbnRpbnVlOwotCQkvKiB1cGRhdGUgdGhlIEJCVCBmb3IgY2hpcCAqLwotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IG5hbmRfdXBkYXRlX2JidCAiCi0JCQkiKCVkOjB4JTBsbHggMHglMHgpXG4iLCBfX2Z1bmNfXywgY2hpcG5yLAotCQkJcmV3cml0ZV9iYnRbY2hpcG5yXSwgY2hpcC0+YmJ0X3RkLT5wYWdlc1tjaGlwbnJdKTsKKwkJLyogVXBkYXRlIHRoZSBCQlQgZm9yIGNoaXAgKi8KKwkJcHJfZGVidWcoIiVzOiBuYW5kX3VwZGF0ZV9iYnQgKCVkOjB4JTBsbHggMHglMHgpXG4iLAorCQkJCV9fZnVuY19fLCBjaGlwbnIsIHJld3JpdGVfYmJ0W2NoaXBucl0sCisJCQkJY2hpcC0+YmJ0X3RkLT5wYWdlc1tjaGlwbnJdKTsKIAkJbmFuZF91cGRhdGVfYmJ0KG10ZCwgcmV3cml0ZV9iYnRbY2hpcG5yXSk7CiAJfQogCkBAIC0yNjcyLDE1ICsyNjkyLDE1IEBACiAKIC8qKgogICogbmFuZF9zeW5jIC0gW01URCBJbnRlcmZhY2VdIHN5bmMKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIFN5bmMgaXMgYWN0dWFsbHkgYSB3YWl0IGZvciBjaGlwIHJlYWR5IGZ1bmN0aW9uCisgKiBTeW5jIGlzIGFjdHVhbGx5IGEgd2FpdCBmb3IgY2hpcCByZWFkeSBmdW5jdGlvbi4KICAqLwogc3RhdGljIHZvaWQgbmFuZF9zeW5jKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOworCXByX2RlYnVnKCIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgKi8KIAluYW5kX2dldF9kZXZpY2UoY2hpcCwgbXRkLCBGTF9TWU5DSU5HKTsKQEAgLTI2OTAsOCArMjcxMCw4IEBACiAKIC8qKgogICogbmFuZF9ibG9ja19pc2JhZCAtIFtNVEQgSW50ZXJmYWNlXSBDaGVjayBpZiBibG9jayBhdCBvZmZzZXQgaXMgYmFkCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQG9mZnM6CW9mZnNldCByZWxhdGl2ZSB0byBtdGQgc3RhcnQKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2Zmczogb2Zmc2V0IHJlbGF0aXZlIHRvIG10ZCBzdGFydAogICovCiBzdGF0aWMgaW50IG5hbmRfYmxvY2tfaXNiYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzKQogewpAQCAtMjcwNCw4ICsyNzI0LDggQEAKIAogLyoqCiAgKiBuYW5kX2Jsb2NrX21hcmtiYWQgLSBbTVREIEludGVyZmFjZV0gTWFyayBibG9jayBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGFzIGJhZAotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBvZnM6CW9mZnNldCByZWxhdGl2ZSB0byBtdGQgc3RhcnQKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2ZzOiBvZmZzZXQgcmVsYXRpdmUgdG8gbXRkIHN0YXJ0CiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9ibG9ja19tYXJrYmFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKQogewpAQCAtMjcxNCw3ICsyNzM0LDcgQEAKIAogCXJldCA9IG5hbmRfYmxvY2tfaXNiYWQobXRkLCBvZnMpOwogCWlmIChyZXQpIHsKLQkJLyogSWYgaXQgd2FzIGJhZCBhbHJlYWR5LCByZXR1cm4gc3VjY2VzcyBhbmQgZG8gbm90aGluZy4gKi8KKwkJLyogSWYgaXQgd2FzIGJhZCBhbHJlYWR5LCByZXR1cm4gc3VjY2VzcyBhbmQgZG8gbm90aGluZyAqLwogCQlpZiAocmV0ID4gMCkKIAkJCXJldHVybiAwOwogCQlyZXR1cm4gcmV0OwpAQCAtMjcyNSw3ICsyNzQ1LDcgQEAKIAogLyoqCiAgKiBuYW5kX3N1c3BlbmQgLSBbTVREIEludGVyZmFjZV0gU3VzcGVuZCB0aGUgTkFORCBmbGFzaAotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9zdXNwZW5kKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewpAQCAtMjczNiw3ICsyNzU2LDcgQEAKIAogLyoqCiAgKiBuYW5kX3Jlc3VtZSAtIFtNVEQgSW50ZXJmYWNlXSBSZXN1bWUgdGhlIE5BTkQgZmxhc2gKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQogICovCiBzdGF0aWMgdm9pZCBuYW5kX3Jlc3VtZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKQEAgLTI3NDUsMTMgKzI3NjUsMTEgQEAKIAlpZiAoY2hpcC0+c3RhdGUgPT0gRkxfUE1fU1VTUEVOREVEKQogCQluYW5kX3JlbGVhc2VfZGV2aWNlKG10ZCk7CiAJZWxzZQotCQlwcmludGsoS0VSTl9FUlIgIiVzIGNhbGxlZCBmb3IgYSBjaGlwIHdoaWNoIGlzIG5vdCAiCi0JCSAgICAgICAiaW4gc3VzcGVuZGVkIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXMgY2FsbGVkIGZvciBhIGNoaXAgd2hpY2ggaXMgbm90IGluIHN1c3BlbmRlZCBzdGF0ZVxuIiwKKwkJCV9fZnVuY19fKTsKIH0KIAotLyoKLSAqIFNldCBkZWZhdWx0IGZ1bmN0aW9ucwotICovCisvKiBTZXQgZGVmYXVsdCBmdW5jdGlvbnMgKi8KIHN0YXRpYyB2b2lkIG5hbmRfc2V0X2RlZmF1bHRzKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBidXN3KQogewogCS8qIGNoZWNrIGZvciBwcm9wZXIgY2hpcF9kZWxheSBzZXR1cCwgc2V0IDIwdXMgaWYgbm90ICovCkBAIC0yNzkzLDIzICsyODExLDIxIEBACiAKIH0KIAotLyoKLSAqIHNhbml0aXplIE9ORkkgc3RyaW5ncyBzbyB3ZSBjYW4gc2FmZWx5IHByaW50IHRoZW0KLSAqLworLyogU2FuaXRpemUgT05GSSBzdHJpbmdzIHNvIHdlIGNhbiBzYWZlbHkgcHJpbnQgdGhlbSAqLwogc3RhdGljIHZvaWQgc2FuaXRpemVfc3RyaW5nKHVpbnQ4X3QgKnMsIHNpemVfdCBsZW4pCiB7CiAJc3NpemVfdCBpOwogCi0JLyogbnVsbCB0ZXJtaW5hdGUgKi8KKwkvKiBOdWxsIHRlcm1pbmF0ZSAqLwogCXNbbGVuIC0gMV0gPSAwOwogCi0JLyogcmVtb3ZlIG5vbiBwcmludGFibGUgY2hhcnMgKi8KKwkvKiBSZW1vdmUgbm9uIHByaW50YWJsZSBjaGFycyAqLwogCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspIHsKIAkJaWYgKHNbaV0gPCAnICcgfHwgc1tpXSA+IDEyNykKIAkJCXNbaV0gPSAnPyc7CiAJfQogCi0JLyogcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcyAqLworCS8qIFJlbW92ZSB0cmFpbGluZyBzcGFjZXMgKi8KIAlzdHJpbShzKTsKIH0KIApAQCAtMjgyNiwyOCArMjg0MiwyOCBAQAogfQogCiAvKgotICogQ2hlY2sgaWYgdGhlIE5BTkQgY2hpcCBpcyBPTkZJIGNvbXBsaWFudCwgcmV0dXJucyAxIGlmIGl0IGlzLCAwIG90aGVyd2lzZQorICogQ2hlY2sgaWYgdGhlIE5BTkQgY2hpcCBpcyBPTkZJIGNvbXBsaWFudCwgcmV0dXJucyAxIGlmIGl0IGlzLCAwIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGludCBuYW5kX2ZsYXNoX2RldGVjdF9vbmZpKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAotCQkJCQlpbnQgYnVzdykKKwkJCQkJaW50ICpidXN3KQogewogCXN0cnVjdCBuYW5kX29uZmlfcGFyYW1zICpwID0gJmNoaXAtPm9uZmlfcGFyYW1zOwogCWludCBpOwogCWludCB2YWw7CiAKLQkvKiB0cnkgT05GSSBmb3IgdW5rbm93IGNoaXAgb3IgTFAgKi8KKwkvKiBUcnkgT05GSSBmb3IgdW5rbm93biBjaGlwIG9yIExQICovCiAJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1JFQURJRCwgMHgyMCwgLTEpOwogCWlmIChjaGlwLT5yZWFkX2J5dGUobXRkKSAhPSAnTycgfHwgY2hpcC0+cmVhZF9ieXRlKG10ZCkgIT0gJ04nIHx8CiAJCWNoaXAtPnJlYWRfYnl0ZShtdGQpICE9ICdGJyB8fCBjaGlwLT5yZWFkX2J5dGUobXRkKSAhPSAnSScpCiAJCXJldHVybiAwOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiT05GSSBmbGFzaCBkZXRlY3RlZFxuIik7CisJcHJfaW5mbygiT05GSSBmbGFzaCBkZXRlY3RlZFxuIik7CiAJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1BBUkFNLCAwLCAtMSk7CiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQljaGlwLT5yZWFkX2J1ZihtdGQsICh1aW50OF90ICopcCwgc2l6ZW9mKCpwKSk7CiAJCWlmIChvbmZpX2NyYzE2KE9ORklfQ1JDX0JBU0UsICh1aW50OF90ICopcCwgMjU0KSA9PQogCQkJCWxlMTZfdG9fY3B1KHAtPmNyYykpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIk9ORkkgcGFyYW0gcGFnZSAlZCB2YWxpZFxuIiwgaSk7CisJCQlwcl9pbmZvKCJPTkZJIHBhcmFtIHBhZ2UgJWQgdmFsaWRcbiIsIGkpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0yODU1LDcgKzI4NzEsNyBAQAogCWlmIChpID09IDMpCiAJCXJldHVybiAwOwogCi0JLyogY2hlY2sgdmVyc2lvbiAqLworCS8qIENoZWNrIHZlcnNpb24gKi8KIAl2YWwgPSBsZTE2X3RvX2NwdShwLT5yZXZpc2lvbik7CiAJaWYgKHZhbCAmICgxIDw8IDUpKQogCQljaGlwLT5vbmZpX3ZlcnNpb24gPSAyMzsKQEAgLTI4NzEsOCArMjg4Nyw3IEBACiAJCWNoaXAtPm9uZmlfdmVyc2lvbiA9IDA7CiAKIAlpZiAoIWNoaXAtPm9uZmlfdmVyc2lvbikgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5zdXBwb3J0ZWQgT05GSSB2ZXJzaW9uOiAlZFxuIiwKLQkJCQkJCQkJX19mdW5jX18sIHZhbCk7CisJCXByX2luZm8oIiVzOiB1bnN1cHBvcnRlZCBPTkZJIHZlcnNpb246ICVkXG4iLCBfX2Z1bmNfXywgdmFsKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yODg0LDkgKzI4OTksOSBAQAogCW10ZC0+ZXJhc2VzaXplID0gbGUzMl90b19jcHUocC0+cGFnZXNfcGVyX2Jsb2NrKSAqIG10ZC0+d3JpdGVzaXplOwogCW10ZC0+b29ic2l6ZSA9IGxlMTZfdG9fY3B1KHAtPnNwYXJlX2J5dGVzX3Blcl9wYWdlKTsKIAljaGlwLT5jaGlwc2l6ZSA9ICh1aW50NjRfdClsZTMyX3RvX2NwdShwLT5ibG9ja3NfcGVyX2x1bikgKiBtdGQtPmVyYXNlc2l6ZTsKLQlidXN3ID0gMDsKKwkqYnVzdyA9IDA7CiAJaWYgKGxlMTZfdG9fY3B1KHAtPmZlYXR1cmVzKSAmIDEpCi0JCWJ1c3cgPSBOQU5EX0JVU1dJRFRIXzE2OworCQkqYnVzdyA9IE5BTkRfQlVTV0lEVEhfMTY7CiAKIAljaGlwLT5vcHRpb25zICY9IH5OQU5EX0NISVBPUFRJT05TX01TSzsKIAljaGlwLT5vcHRpb25zIHw9IChOQU5EX05PX1JFQURSRFkgfApAQCAtMjg5Niw3ICsyOTExLDcgQEAKIH0KIAogLyoKLSAqIEdldCB0aGUgZmxhc2ggYW5kIG1hbnVmYWN0dXJlciBpZCBhbmQgbG9va3VwIGlmIHRoZSB0eXBlIGlzIHN1cHBvcnRlZAorICogR2V0IHRoZSBmbGFzaCBhbmQgbWFudWZhY3R1cmVyIGlkIGFuZCBsb29rdXAgaWYgdGhlIHR5cGUgaXMgc3VwcG9ydGVkLgogICovCiBzdGF0aWMgc3RydWN0IG5hbmRfZmxhc2hfZGV2ICpuYW5kX2dldF9mbGFzaF90eXBlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAogCQkJCQkJICBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLApAQCAtMjkxMyw3ICsyOTI4LDcgQEAKIAogCS8qCiAJICogUmVzZXQgdGhlIGNoaXAsIHJlcXVpcmVkIGJ5IHNvbWUgY2hpcHMgKGUuZy4gTWljcm9uIE1UMjlGeEd4eHh4eCkKLQkgKiBhZnRlciBwb3dlci11cAorCSAqIGFmdGVyIHBvd2VyLXVwLgogCSAqLwogCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRVNFVCwgLTEsIC0xKTsKIApAQCAtMjkyNCw3ICsyOTM5LDggQEAKIAkqbWFmX2lkID0gY2hpcC0+cmVhZF9ieXRlKG10ZCk7CiAJKmRldl9pZCA9IGNoaXAtPnJlYWRfYnl0ZShtdGQpOwogCi0JLyogVHJ5IGFnYWluIHRvIG1ha2Ugc3VyZSwgYXMgc29tZSBzeXN0ZW1zIHRoZSBidXMtaG9sZCBvciBvdGhlcgorCS8qCisJICogVHJ5IGFnYWluIHRvIG1ha2Ugc3VyZSwgYXMgc29tZSBzeXN0ZW1zIHRoZSBidXMtaG9sZCBvciBvdGhlcgogCSAqIGludGVyZmFjZSBjb25jZXJucyBjYW4gY2F1c2UgcmFuZG9tIGRhdGEgd2hpY2ggbG9va3MgbGlrZSBhCiAJICogcG9zc2libHkgY3JlZGlibGUgTkFORCBmbGFzaCB0byBhcHBlYXIuIElmIHRoZSB0d28gcmVzdWx0cyBkbwogCSAqIG5vdCBtYXRjaCwgaWdub3JlIHRoZSBkZXZpY2UgY29tcGxldGVseS4KQEAgLTI5MzYsOSArMjk1Miw5IEBACiAJCWlkX2RhdGFbaV0gPSBjaGlwLT5yZWFkX2J5dGUobXRkKTsKIAogCWlmIChpZF9kYXRhWzBdICE9ICptYWZfaWQgfHwgaWRfZGF0YVsxXSAhPSAqZGV2X2lkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBzZWNvbmQgSUQgcmVhZCBkaWQgbm90IG1hdGNoICIKLQkJICAgICAgICIlMDJ4LCUwMnggYWdhaW5zdCAlMDJ4LCUwMnhcbiIsIF9fZnVuY19fLAotCQkgICAgICAgKm1hZl9pZCwgKmRldl9pZCwgaWRfZGF0YVswXSwgaWRfZGF0YVsxXSk7CisJCXByX2luZm8oIiVzOiBzZWNvbmQgSUQgcmVhZCBkaWQgbm90IG1hdGNoICIKKwkJCSIlMDJ4LCUwMnggYWdhaW5zdCAlMDJ4LCUwMnhcbiIsIF9fZnVuY19fLAorCQkJKm1hZl9pZCwgKmRldl9pZCwgaWRfZGF0YVswXSwgaWRfZGF0YVsxXSk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCX0KIApAQCAtMjk1Miw3ICsyOTY4LDcgQEAKIAljaGlwLT5vbmZpX3ZlcnNpb24gPSAwOwogCWlmICghdHlwZS0+bmFtZSB8fCAhdHlwZS0+cGFnZXNpemUpIHsKIAkJLyogQ2hlY2sgaXMgY2hpcCBpcyBPTkZJIGNvbXBsaWFudCAqLwotCQlyZXQgPSBuYW5kX2ZsYXNoX2RldGVjdF9vbmZpKG10ZCwgY2hpcCwgYnVzdyk7CisJCXJldCA9IG5hbmRfZmxhc2hfZGV0ZWN0X29uZmkobXRkLCBjaGlwLCAmYnVzdyk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGlkZW50X2RvbmU7CiAJfQpAQCAtMjk3Myw3ICsyOTg5LDcgQEAKIAljaGlwLT5jaGlwc2l6ZSA9ICh1aW50NjRfdCl0eXBlLT5jaGlwc2l6ZSA8PCAyMDsKIAogCWlmICghdHlwZS0+cGFnZXNpemUgJiYgY2hpcC0+aW5pdF9zaXplKSB7Ci0JCS8qIHNldCB0aGUgcGFnZXNpemUsIG9vYnNpemUsIGVyYXNlc2l6ZSBieSB0aGUgZHJpdmVyKi8KKwkJLyogU2V0IHRoZSBwYWdlc2l6ZSwgb29ic2l6ZSwgZXJhc2VzaXplIGJ5IHRoZSBkcml2ZXIgKi8KIAkJYnVzdyA9IGNoaXAtPmluaXRfc2l6ZShtdGQsIGNoaXAsIGlkX2RhdGEpOwogCX0gZWxzZSBpZiAoIXR5cGUtPnBhZ2VzaXplKSB7CiAJCWludCBleHRpZDsKQEAgLTMwMzMsNyArMzA0OSw3IEBACiAJCX0KIAl9IGVsc2UgewogCQkvKgotCQkgKiBPbGQgZGV2aWNlcyBoYXZlIGNoaXAgZGF0YSBoYXJkY29kZWQgaW4gdGhlIGRldmljZSBpZCB0YWJsZQorCQkgKiBPbGQgZGV2aWNlcyBoYXZlIGNoaXAgZGF0YSBoYXJkY29kZWQgaW4gdGhlIGRldmljZSBpZCB0YWJsZS4KIAkJICovCiAJCW10ZC0+ZXJhc2VzaXplID0gdHlwZS0+ZXJhc2VzaXplOwogCQltdGQtPndyaXRlc2l6ZSA9IHR5cGUtPnBhZ2VzaXplOwpAQCAtMzA0Myw3ICszMDU5LDcgQEAKIAkJLyoKIAkJICogQ2hlY2sgZm9yIFNwYW5zaW9uL0FNRCBJRCArIHJlcGVhdGluZyA1dGgsIDZ0aCBieXRlIHNpbmNlCiAJCSAqIHNvbWUgU3BhbnNpb24gY2hpcHMgaGF2ZSBlcmFzZXNpemUgdGhhdCBjb25mbGljdHMgd2l0aCBzaXplCi0JCSAqIGxpc3RlZCBpbiBuYW5kX2lkcyB0YWJsZQorCQkgKiBsaXN0ZWQgaW4gbmFuZF9pZHMgdGFibGUuCiAJCSAqIERhdGEgc2hlZXQgKDUgYnl0ZSBJRCk6IFNwYW5zaW9uIFMzME1MLVAgT1JOQU5EIChwLjM5KQogCQkgKi8KIAkJaWYgKCptYWZfaWQgPT0gTkFORF9NRlJfQU1EICYmIGlkX2RhdGFbNF0gIT0gMHgwMCAmJgpAQCAtMzA1NywxNSArMzA3MywxNiBAQAogCWNoaXAtPm9wdGlvbnMgJj0gfk5BTkRfQ0hJUE9QVElPTlNfTVNLOwogCWNoaXAtPm9wdGlvbnMgfD0gdHlwZS0+b3B0aW9ucyAmIE5BTkRfQ0hJUE9QVElPTlNfTVNLOwogCi0JLyogQ2hlY2sgaWYgY2hpcCBpcyBhIG5vdCBhIHNhbXN1bmcgZGV2aWNlLiBEbyBub3QgY2xlYXIgdGhlCi0JICogb3B0aW9ucyBmb3IgY2hpcHMgd2hpY2ggYXJlIG5vdCBoYXZpbmcgYW4gZXh0ZW5kZWQgaWQuCisJLyoKKwkgKiBDaGVjayBpZiBjaGlwIGlzIG5vdCBhIFNhbXN1bmcgZGV2aWNlLiBEbyBub3QgY2xlYXIgdGhlCisJICogb3B0aW9ucyBmb3IgY2hpcHMgd2hpY2ggZG8gbm90IGhhdmUgYW4gZXh0ZW5kZWQgaWQuCiAJICovCiAJaWYgKCptYWZfaWQgIT0gTkFORF9NRlJfU0FNU1VORyAmJiAhdHlwZS0+cGFnZXNpemUpCiAJCWNoaXAtPm9wdGlvbnMgJj0gfk5BTkRfU0FNU1VOR19MUF9PUFRJT05TOwogaWRlbnRfZG9uZToKIAogCS8qCi0JICogU2V0IGNoaXAgYXMgYSBkZWZhdWx0LiBCb2FyZCBkcml2ZXJzIGNhbiBvdmVycmlkZSBpdCwgaWYgbmVjZXNzYXJ5CisJICogU2V0IGNoaXAgYXMgYSBkZWZhdWx0LiBCb2FyZCBkcml2ZXJzIGNhbiBvdmVycmlkZSBpdCwgaWYgbmVjZXNzYXJ5LgogCSAqLwogCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9OT19BVVRPSU5DUjsKIApAQCAtMzA3NywyMSArMzA5NCwyMSBAQAogCiAJLyoKIAkgKiBDaGVjaywgaWYgYnVzd2lkdGggaXMgY29ycmVjdC4gSGFyZHdhcmUgZHJpdmVycyBzaG91bGQgc2V0Ci0JICogY2hpcCBjb3JyZWN0ICEKKwkgKiBjaGlwIGNvcnJlY3QhCiAJICovCiAJaWYgKGJ1c3cgIT0gKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSkgewotCQlwcmludGsoS0VSTl9JTkZPICJOQU5EIGRldmljZTogTWFudWZhY3R1cmVyIElEOiIKLQkJICAgICAgICIgMHglMDJ4LCBDaGlwIElEOiAweCUwMnggKCVzICVzKVxuIiwgKm1hZl9pZCwKLQkJICAgICAgICpkZXZfaWQsIG5hbmRfbWFudWZfaWRzW21hZl9pZHhdLm5hbWUsIG10ZC0+bmFtZSk7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk5BTkQgYnVzIHdpZHRoICVkIGluc3RlYWQgJWQgYml0XG4iLAotCQkgICAgICAgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSA/IDE2IDogOCwKLQkJICAgICAgIGJ1c3cgPyAxNiA6IDgpOworCQlwcl9pbmZvKCJOQU5EIGRldmljZTogTWFudWZhY3R1cmVyIElEOiIKKwkJCSIgMHglMDJ4LCBDaGlwIElEOiAweCUwMnggKCVzICVzKVxuIiwgKm1hZl9pZCwKKwkJCSpkZXZfaWQsIG5hbmRfbWFudWZfaWRzW21hZl9pZHhdLm5hbWUsIG10ZC0+bmFtZSk7CisJCXByX3dhcm4oIk5BTkQgYnVzIHdpZHRoICVkIGluc3RlYWQgJWQgYml0XG4iLAorCQkJICAgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSA/IDE2IDogOCwKKwkJCSAgIGJ1c3cgPyAxNiA6IDgpOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKIAkvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgc2hpZnQgZnJvbSB0aGUgcGFnZSBzaXplICovCiAJY2hpcC0+cGFnZV9zaGlmdCA9IGZmcyhtdGQtPndyaXRlc2l6ZSkgLSAxOwotCS8qIENvbnZlcnQgY2hpcHNpemUgdG8gbnVtYmVyIG9mIHBhZ2VzIHBlciBjaGlwIC0xLiAqLworCS8qIENvbnZlcnQgY2hpcHNpemUgdG8gbnVtYmVyIG9mIHBhZ2VzIHBlciBjaGlwIC0xICovCiAJY2hpcC0+cGFnZW1hc2sgPSAoY2hpcC0+Y2hpcHNpemUgPj4gY2hpcC0+cGFnZV9zaGlmdCkgLSAxOwogCiAJY2hpcC0+YmJ0X2VyYXNlX3NoaWZ0ID0gY2hpcC0+cGh5c19lcmFzZV9zaGlmdCA9CkBAIC0zMTIxLDcgKzMxMzgsNyBAQAogCWlmICgoY2hpcC0+Y2VsbGluZm8gJiBOQU5EX0NJX0NFTExUWVBFX01TSykgJiYKIAkJCSgqbWFmX2lkID09IE5BTkRfTUZSX1NBTVNVTkcgfHwKIAkJCSAqbWFmX2lkID09IE5BTkRfTUZSX0hZTklYKSkKLQkJY2hpcC0+b3B0aW9ucyB8PSBOQU5EX0JCVF9TQ0FOTEFTVFBBR0U7CisJCWNoaXAtPmJidF9vcHRpb25zIHw9IE5BTkRfQkJUX1NDQU5MQVNUUEFHRTsKIAllbHNlIGlmICgoIShjaGlwLT5jZWxsaW5mbyAmIE5BTkRfQ0lfQ0VMTFRZUEVfTVNLKSAmJgogCQkJCSgqbWFmX2lkID09IE5BTkRfTUZSX1NBTVNVTkcgfHwKIAkJCQkgKm1hZl9pZCA9PSBOQU5EX01GUl9IWU5JWCB8fApAQCAtMzEyOSwxNyArMzE0Niw3IEBACiAJCQkJICptYWZfaWQgPT0gTkFORF9NRlJfQU1EKSkgfHwKIAkJCShtdGQtPndyaXRlc2l6ZSA9PSAyMDQ4ICYmCiAJCQkgKm1hZl9pZCA9PSBOQU5EX01GUl9NSUNST04pKQotCQljaGlwLT5vcHRpb25zIHw9IE5BTkRfQkJUX1NDQU4yTkRQQUdFOwotCi0JLyoKLQkgKiBOdW1vbnl4L1NUIDJLIHBhZ2VzLCB4OCBidXMgdXNlIEJPVEggYnl0ZSAxIGFuZCA2Ci0JICovCi0JaWYgKCEoYnVzdyAmIE5BTkRfQlVTV0lEVEhfMTYpICYmCi0JCQkqbWFmX2lkID09IE5BTkRfTUZSX1NUTUlDUk8gJiYKLQkJCW10ZC0+d3JpdGVzaXplID09IDIwNDgpIHsKLQkJY2hpcC0+b3B0aW9ucyB8PSBOQU5EX0JCVF9TQ0FOQllURTFBTkQ2OwotCQljaGlwLT5iYWRibG9ja3BvcyA9IDA7Ci0JfQorCQljaGlwLT5iYnRfb3B0aW9ucyB8PSBOQU5EX0JCVF9TQ0FOMk5EUEFHRTsKIAogCS8qIENoZWNrIGZvciBBTkQgY2hpcHMgd2l0aCA0IHBhZ2UgcGxhbmVzICovCiAJaWYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EXzRQQUdFX0FSUkFZKQpAQCAtMzE0NywxMiArMzE1NCwxMSBAQAogCWVsc2UKIAkJY2hpcC0+ZXJhc2VfY21kID0gc2luZ2xlX2VyYXNlX2NtZDsKIAotCS8qIERvIG5vdCByZXBsYWNlIHVzZXIgc3VwcGxpZWQgY29tbWFuZCBmdW5jdGlvbiAhICovCisJLyogRG8gbm90IHJlcGxhY2UgdXNlciBzdXBwbGllZCBjb21tYW5kIGZ1bmN0aW9uISAqLwogCWlmIChtdGQtPndyaXRlc2l6ZSA+IDUxMiAmJiBjaGlwLT5jbWRmdW5jID09IG5hbmRfY29tbWFuZCkKIAkJY2hpcC0+Y21kZnVuYyA9IG5hbmRfY29tbWFuZF9scDsKIAotCS8qIFRPRE8gb25maSBmbGFzaCBuYW1lICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiTkFORCBkZXZpY2U6IE1hbnVmYWN0dXJlciBJRDoiCisJcHJfaW5mbygiTkFORCBkZXZpY2U6IE1hbnVmYWN0dXJlciBJRDoiCiAJCSIgMHglMDJ4LCBDaGlwIElEOiAweCUwMnggKCVzICVzKVxuIiwgKm1hZl9pZCwgKmRldl9pZCwKIAkJbmFuZF9tYW51Zl9pZHNbbWFmX2lkeF0ubmFtZSwKIAkJY2hpcC0+b25maV92ZXJzaW9uID8gY2hpcC0+b25maV9wYXJhbXMubW9kZWwgOiB0eXBlLT5uYW1lKTsKQEAgLTMxNjIsMTIgKzMxNjgsMTIgQEAKIAogLyoqCiAgKiBuYW5kX3NjYW5faWRlbnQgLSBbTkFORCBJbnRlcmZhY2VdIFNjYW4gZm9yIHRoZSBOQU5EIGRldmljZQotICogQG10ZDoJICAgICBNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQG1heGNoaXBzOgkgICAgIE51bWJlciBvZiBjaGlwcyB0byBzY2FuIGZvcgotICogQHRhYmxlOgkgICAgIEFsdGVybmF0aXZlIE5BTkQgSUQgdGFibGUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbWF4Y2hpcHM6IG51bWJlciBvZiBjaGlwcyB0byBzY2FuIGZvcgorICogQHRhYmxlOiBhbHRlcm5hdGl2ZSBOQU5EIElEIHRhYmxlCiAgKgotICogVGhpcyBpcyB0aGUgZmlyc3QgcGhhc2Ugb2YgdGhlIG5vcm1hbCBuYW5kX3NjYW4oKSBmdW5jdGlvbi4gSXQKLSAqIHJlYWRzIHRoZSBmbGFzaCBJRCBhbmQgc2V0cyB1cCBNVEQgZmllbGRzIGFjY29yZGluZ2x5LgorICogVGhpcyBpcyB0aGUgZmlyc3QgcGhhc2Ugb2YgdGhlIG5vcm1hbCBuYW5kX3NjYW4oKSBmdW5jdGlvbi4gSXQgcmVhZHMgdGhlCisgKiBmbGFzaCBJRCBhbmQgc2V0cyB1cCBNVEQgZmllbGRzIGFjY29yZGluZ2x5LgogICoKICAqIFRoZSBtdGQtPm93bmVyIGZpZWxkIG11c3QgYmUgc2V0IHRvIHRoZSBtb2R1bGUgb2YgdGhlIGNhbGxlci4KICAqLwpAQCAtMzE4OSw3ICszMTk1LDcgQEAKIAogCWlmIChJU19FUlIodHlwZSkpIHsKIAkJaWYgKCEoY2hpcC0+b3B0aW9ucyAmIE5BTkRfU0NBTl9TSUxFTlRfTk9ERVYpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gTkFORCBkZXZpY2UgZm91bmQuXG4iKTsKKwkJCXByX3dhcm4oIk5vIE5BTkQgZGV2aWNlIGZvdW5kXG4iKTsKIAkJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCAtMSk7CiAJCXJldHVybiBQVFJfRVJSKHR5cGUpOwogCX0KQEAgLTMyMDcsNyArMzIxMyw3IEBACiAJCQlicmVhazsKIAl9CiAJaWYgKGkgPiAxKQotCQlwcmludGsoS0VSTl9JTkZPICIlZCBOQU5EIGNoaXBzIGRldGVjdGVkXG4iLCBpKTsKKwkJcHJfaW5mbygiJWQgTkFORCBjaGlwcyBkZXRlY3RlZFxuIiwgaSk7CiAKIAkvKiBTdG9yZSB0aGUgbnVtYmVyIG9mIGNoaXBzIGFuZCBjYWxjIHRvdGFsIHNpemUgZm9yIG10ZCAqLwogCWNoaXAtPm51bWNoaXBzID0gaTsKQEAgLTMyMjAsMTEgKzMyMjYsMTEgQEAKIAogLyoqCiAgKiBuYW5kX3NjYW5fdGFpbCAtIFtOQU5EIEludGVyZmFjZV0gU2NhbiBmb3IgdGhlIE5BTkQgZGV2aWNlCi0gKiBAbXRkOgkgICAgTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogVGhpcyBpcyB0aGUgc2Vjb25kIHBoYXNlIG9mIHRoZSBub3JtYWwgbmFuZF9zY2FuKCkgZnVuY3Rpb24uIEl0Ci0gKiBmaWxscyBvdXQgYWxsIHRoZSB1bmluaXRpYWxpemVkIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggdGhlIGRlZmF1bHRzCi0gKiBhbmQgc2NhbnMgZm9yIGEgYmFkIGJsb2NrIHRhYmxlIGlmIGFwcHJvcHJpYXRlLgorICogVGhpcyBpcyB0aGUgc2Vjb25kIHBoYXNlIG9mIHRoZSBub3JtYWwgbmFuZF9zY2FuKCkgZnVuY3Rpb24uIEl0IGZpbGxzIG91dAorICogYWxsIHRoZSB1bmluaXRpYWxpemVkIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggdGhlIGRlZmF1bHRzIGFuZCBzY2FucyBmb3IgYQorICogYmFkIGJsb2NrIHRhYmxlIGlmIGFwcHJvcHJpYXRlLgogICovCiBpbnQgbmFuZF9zY2FuX3RhaWwoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CkBAIC0zMjQwLDcgKzMyNDYsNyBAQAogCWNoaXAtPm9vYl9wb2kgPSBjaGlwLT5idWZmZXJzLT5kYXRhYnVmICsgbXRkLT53cml0ZXNpemU7CiAKIAkvKgotCSAqIElmIG5vIGRlZmF1bHQgcGxhY2VtZW50IHNjaGVtZSBpcyBnaXZlbiwgc2VsZWN0IGFuIGFwcHJvcHJpYXRlIG9uZQorCSAqIElmIG5vIGRlZmF1bHQgcGxhY2VtZW50IHNjaGVtZSBpcyBnaXZlbiwgc2VsZWN0IGFuIGFwcHJvcHJpYXRlIG9uZS4KIAkgKi8KIAlpZiAoIWNoaXAtPmVjYy5sYXlvdXQgJiYgKGNoaXAtPmVjYy5tb2RlICE9IE5BTkRfRUNDX1NPRlRfQkNIKSkgewogCQlzd2l0Y2ggKG10ZC0+b29ic2l6ZSkgewpAQCAtMzI1Nyw4ICszMjYzLDggQEAKIAkJCWNoaXAtPmVjYy5sYXlvdXQgPSAmbmFuZF9vb2JfMTI4OwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBvb2Igc2NoZW1lIGRlZmluZWQgZm9yICIKLQkJCSAgICAgICAib29ic2l6ZSAlZFxuIiwgbXRkLT5vb2JzaXplKTsKKwkJCXByX3dhcm4oIk5vIG9vYiBzY2hlbWUgZGVmaW5lZCBmb3Igb29ic2l6ZSAlZFxuIiwKKwkJCQkgICBtdGQtPm9vYnNpemUpOwogCQkJQlVHKCk7CiAJCX0KIAl9CkBAIC0zMjY3LDcgKzMyNzMsNyBAQAogCQljaGlwLT53cml0ZV9wYWdlID0gbmFuZF93cml0ZV9wYWdlOwogCiAJLyoKLQkgKiBjaGVjayBFQ0MgbW9kZSwgZGVmYXVsdCB0byBzb2Z0d2FyZSBpZiAzYnl0ZS81MTJieXRlIGhhcmR3YXJlIEVDQyBpcworCSAqIENoZWNrIEVDQyBtb2RlLCBkZWZhdWx0IHRvIHNvZnR3YXJlIGlmIDNieXRlLzUxMmJ5dGUgaGFyZHdhcmUgRUNDIGlzCiAJICogc2VsZWN0ZWQgYW5kIHdlIGhhdmUgMjU2IGJ5dGUgcGFnZXNpemUgZmFsbGJhY2sgdG8gc29mdHdhcmUgRUNDCiAJICovCiAKQEAgLTMyNzYsMTUgKzMyODIsMTUgQEAKIAkJLyogU2ltaWxhciB0byBOQU5EX0VDQ19IVywgYnV0IGEgc2VwYXJhdGUgcmVhZF9wYWdlIGhhbmRsZSAqLwogCQlpZiAoIWNoaXAtPmVjYy5jYWxjdWxhdGUgfHwgIWNoaXAtPmVjYy5jb3JyZWN0IHx8CiAJCSAgICAgIWNoaXAtPmVjYy5od2N0bCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gRUNDIGZ1bmN0aW9ucyBzdXBwbGllZDsgIgotCQkJICAgICAgICJIYXJkd2FyZSBFQ0Mgbm90IHBvc3NpYmxlXG4iKTsKKwkJCXByX3dhcm4oIk5vIEVDQyBmdW5jdGlvbnMgc3VwcGxpZWQ7ICIKKwkJCQkgICAiaGFyZHdhcmUgRUNDIG5vdCBwb3NzaWJsZVxuIik7CiAJCQlCVUcoKTsKIAkJfQogCQlpZiAoIWNoaXAtPmVjYy5yZWFkX3BhZ2UpCiAJCQljaGlwLT5lY2MucmVhZF9wYWdlID0gbmFuZF9yZWFkX3BhZ2VfaHdlY2Nfb29iX2ZpcnN0OwogCiAJY2FzZSBOQU5EX0VDQ19IVzoKLQkJLyogVXNlIHN0YW5kYXJkIGh3ZWNjIHJlYWQgcGFnZSBmdW5jdGlvbiA/ICovCisJCS8qIFVzZSBzdGFuZGFyZCBod2VjYyByZWFkIHBhZ2UgZnVuY3Rpb24/ICovCiAJCWlmICghY2hpcC0+ZWNjLnJlYWRfcGFnZSkKIAkJCWNoaXAtPmVjYy5yZWFkX3BhZ2UgPSBuYW5kX3JlYWRfcGFnZV9od2VjYzsKIAkJaWYgKCFjaGlwLT5lY2Mud3JpdGVfcGFnZSkKQEAgLTMzMDUsMTEgKzMzMTEsMTEgQEAKIAkJICAgICBjaGlwLT5lY2MucmVhZF9wYWdlID09IG5hbmRfcmVhZF9wYWdlX2h3ZWNjIHx8CiAJCSAgICAgIWNoaXAtPmVjYy53cml0ZV9wYWdlIHx8CiAJCSAgICAgY2hpcC0+ZWNjLndyaXRlX3BhZ2UgPT0gbmFuZF93cml0ZV9wYWdlX2h3ZWNjKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gRUNDIGZ1bmN0aW9ucyBzdXBwbGllZDsgIgotCQkJICAgICAgICJIYXJkd2FyZSBFQ0Mgbm90IHBvc3NpYmxlXG4iKTsKKwkJCXByX3dhcm4oIk5vIEVDQyBmdW5jdGlvbnMgc3VwcGxpZWQ7ICIKKwkJCQkgICAiaGFyZHdhcmUgRUNDIG5vdCBwb3NzaWJsZVxuIik7CiAJCQlCVUcoKTsKIAkJfQotCQkvKiBVc2Ugc3RhbmRhcmQgc3luZHJvbWUgcmVhZC93cml0ZSBwYWdlIGZ1bmN0aW9uID8gKi8KKwkJLyogVXNlIHN0YW5kYXJkIHN5bmRyb21lIHJlYWQvd3JpdGUgcGFnZSBmdW5jdGlvbj8gKi8KIAkJaWYgKCFjaGlwLT5lY2MucmVhZF9wYWdlKQogCQkJY2hpcC0+ZWNjLnJlYWRfcGFnZSA9IG5hbmRfcmVhZF9wYWdlX3N5bmRyb21lOwogCQlpZiAoIWNoaXAtPmVjYy53cml0ZV9wYWdlKQpAQCAtMzMyNSw5ICszMzMxLDkgQEAKIAogCQlpZiAobXRkLT53cml0ZXNpemUgPj0gY2hpcC0+ZWNjLnNpemUpCiAJCQlicmVhazsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJWQgYnl0ZSBIVyBFQ0Mgbm90IHBvc3NpYmxlIG9uICIKLQkJICAgICAgICIlZCBieXRlIHBhZ2Ugc2l6ZSwgZmFsbGJhY2sgdG8gU1cgRUNDXG4iLAotCQkgICAgICAgY2hpcC0+ZWNjLnNpemUsIG10ZC0+d3JpdGVzaXplKTsKKwkJcHJfd2FybigiJWQgYnl0ZSBIVyBFQ0Mgbm90IHBvc3NpYmxlIG9uICIKKwkJCSAgICIlZCBieXRlIHBhZ2Ugc2l6ZSwgZmFsbGJhY2sgdG8gU1cgRUNDXG4iLAorCQkJICAgY2hpcC0+ZWNjLnNpemUsIG10ZC0+d3JpdGVzaXplKTsKIAkJY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19TT0ZUOwogCiAJY2FzZSBOQU5EX0VDQ19TT0ZUOgpAQCAtMzM0Nyw3ICszMzUzLDcgQEAKIAogCWNhc2UgTkFORF9FQ0NfU09GVF9CQ0g6CiAJCWlmICghbXRkX25hbmRfaGFzX2JjaCgpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJDT05GSUdfTVREX0VDQ19CQ0ggbm90IGVuYWJsZWRcbiIpOworCQkJcHJfd2FybigiQ09ORklHX01URF9FQ0NfQkNIIG5vdCBlbmFibGVkXG4iKTsKIAkJCUJVRygpOwogCQl9CiAJCWNoaXAtPmVjYy5jYWxjdWxhdGUgPSBuYW5kX2JjaF9jYWxjdWxhdGVfZWNjOwpAQCAtMzM2Miw4ICszMzY4LDggQEAKIAkJLyoKIAkJICogQm9hcmQgZHJpdmVyIHNob3VsZCBzdXBwbHkgZWNjLnNpemUgYW5kIGVjYy5ieXRlcyB2YWx1ZXMgdG8KIAkJICogc2VsZWN0IGhvdyBtYW55IGJpdHMgYXJlIGNvcnJlY3RhYmxlOyBzZWUgbmFuZF9iY2hfaW5pdCgpCi0JCSAqIGZvciBkZXRhaWxzLgotCQkgKiBPdGhlcndpc2UsIGRlZmF1bHQgdG8gNCBiaXRzIGZvciBsYXJnZSBwYWdlIGRldmljZXMKKwkJICogZm9yIGRldGFpbHMuIE90aGVyd2lzZSwgZGVmYXVsdCB0byA0IGJpdHMgZm9yIGxhcmdlIHBhZ2UKKwkJICogZGV2aWNlcy4KIAkJICovCiAJCWlmICghY2hpcC0+ZWNjLnNpemUgJiYgKG10ZC0+b29ic2l6ZSA+PSA2NCkpIHsKIAkJCWNoaXAtPmVjYy5zaXplID0gNTEyOwpAQCAtMzM3NCwxNCArMzM4MCwxNCBAQAogCQkJCQkgICAgICAgY2hpcC0+ZWNjLmJ5dGVzLAogCQkJCQkgICAgICAgJmNoaXAtPmVjYy5sYXlvdXQpOwogCQlpZiAoIWNoaXAtPmVjYy5wcml2KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJCQ0ggRUNDIGluaXRpYWxpemF0aW9uIGZhaWxlZCFcbiIpOworCQkJcHJfd2FybigiQkNIIEVDQyBpbml0aWFsaXphdGlvbiBmYWlsZWQhXG4iKTsKIAkJCUJVRygpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBOQU5EX0VDQ19OT05FOgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJOQU5EX0VDQ19OT05FIHNlbGVjdGVkIGJ5IGJvYXJkIGRyaXZlci4gIgotCQkgICAgICAgIlRoaXMgaXMgbm90IHJlY29tbWVuZGVkICEhXG4iKTsKKwkJcHJfd2FybigiTkFORF9FQ0NfTk9ORSBzZWxlY3RlZCBieSBib2FyZCBkcml2ZXIuICIKKwkJCSAgICJUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCFcbiIpOwogCQljaGlwLT5lY2MucmVhZF9wYWdlID0gbmFuZF9yZWFkX3BhZ2VfcmF3OwogCQljaGlwLT5lY2Mud3JpdGVfcGFnZSA9IG5hbmRfd3JpdGVfcGFnZV9yYXc7CiAJCWNoaXAtPmVjYy5yZWFkX29vYiA9IG5hbmRfcmVhZF9vb2Jfc3RkOwpAQCAtMzM5MywxNCArMzM5OSwxOSBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgTkFORF9FQ0NfTU9ERSAlZFxuIiwKLQkJICAgICAgIGNoaXAtPmVjYy5tb2RlKTsKKwkJcHJfd2FybigiSW52YWxpZCBOQU5EX0VDQ19NT0RFICVkXG4iLCBjaGlwLT5lY2MubW9kZSk7CiAJCUJVRygpOwogCX0KIAorCS8qIEZvciBtYW55IHN5c3RlbXMsIHRoZSBzdGFuZGFyZCBPT0Igd3JpdGUgYWxzbyB3b3JrcyBmb3IgcmF3ICovCisJaWYgKCFjaGlwLT5lY2MucmVhZF9vb2JfcmF3KQorCQljaGlwLT5lY2MucmVhZF9vb2JfcmF3ID0gY2hpcC0+ZWNjLnJlYWRfb29iOworCWlmICghY2hpcC0+ZWNjLndyaXRlX29vYl9yYXcpCisJCWNoaXAtPmVjYy53cml0ZV9vb2JfcmF3ID0gY2hpcC0+ZWNjLndyaXRlX29vYjsKKwogCS8qCiAJICogVGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIGEgY2xpZW50IHRvIHBsYWNlIGRhdGEgaW50bwotCSAqIHRoZSBvdXQgb2YgYmFuZCBhcmVhCisJICogdGhlIG91dCBvZiBiYW5kIGFyZWEuCiAJICovCiAJY2hpcC0+ZWNjLmxheW91dC0+b29iYXZhaWwgPSAwOwogCWZvciAoaSA9IDA7IGNoaXAtPmVjYy5sYXlvdXQtPm9vYmZyZWVbaV0ubGVuZ3RoCkBAIC0zNDExLDE5ICszNDIyLDE2IEBACiAKIAkvKgogCSAqIFNldCB0aGUgbnVtYmVyIG9mIHJlYWQgLyB3cml0ZSBzdGVwcyBmb3Igb25lIHBhZ2UgZGVwZW5kaW5nIG9uIEVDQwotCSAqIG1vZGUKKwkgKiBtb2RlLgogCSAqLwogCWNoaXAtPmVjYy5zdGVwcyA9IG10ZC0+d3JpdGVzaXplIC8gY2hpcC0+ZWNjLnNpemU7CiAJaWYgKGNoaXAtPmVjYy5zdGVwcyAqIGNoaXAtPmVjYy5zaXplICE9IG10ZC0+d3JpdGVzaXplKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgZWNjIHBhcmFtZXRlcnNcbiIpOworCQlwcl93YXJuKCJJbnZhbGlkIEVDQyBwYXJhbWV0ZXJzXG4iKTsKIAkJQlVHKCk7CiAJfQogCWNoaXAtPmVjYy50b3RhbCA9IGNoaXAtPmVjYy5zdGVwcyAqIGNoaXAtPmVjYy5ieXRlczsKIAotCS8qCi0JICogQWxsb3cgc3VicGFnZSB3cml0ZXMgdXAgdG8gZWNjLnN0ZXBzLiBOb3QgcG9zc2libGUgZm9yIE1MQwotCSAqIEZMQVNILgotCSAqLworCS8qIEFsbG93IHN1YnBhZ2Ugd3JpdGVzIHVwIHRvIGVjYy5zdGVwcy4gTm90IHBvc3NpYmxlIGZvciBNTEMgZmxhc2ggKi8KIAlpZiAoIShjaGlwLT5vcHRpb25zICYgTkFORF9OT19TVUJQQUdFX1dSSVRFKSAmJgogCSAgICAhKGNoaXAtPmNlbGxpbmZvICYgTkFORF9DSV9DRUxMVFlQRV9NU0spKSB7CiAJCXN3aXRjaCAoY2hpcC0+ZWNjLnN0ZXBzKSB7CkBAIC0zNDgxLDkgKzM0ODksMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0wobmFuZF9zY2FuX3RhaWwpOwogCi0vKiBpc19tb2R1bGVfdGV4dF9hZGRyZXNzKCkgaXNuJ3QgZXhwb3J0ZWQsIGFuZCBpdCdzIG1vc3RseSBhIHBvaW50bGVzcworLyoKKyAqIGlzX21vZHVsZV90ZXh0X2FkZHJlc3MoKSBpc24ndCBleHBvcnRlZCwgYW5kIGl0J3MgbW9zdGx5IGEgcG9pbnRsZXNzCiAgKiB0ZXN0IGlmIHRoaXMgaXMgYSBtb2R1bGUgX2FueXdheV8gLS0gdGhleSdkIGhhdmUgdG8gdHJ5IF9yZWFsbHlfIGhhcmQKLSAqIHRvIGNhbGwgdXMgZnJvbSBpbi1rZXJuZWwgY29kZSBpZiB0aGUgY29yZSBOQU5EIHN1cHBvcnQgaXMgbW9kdWxhci4gKi8KKyAqIHRvIGNhbGwgdXMgZnJvbSBpbi1rZXJuZWwgY29kZSBpZiB0aGUgY29yZSBOQU5EIHN1cHBvcnQgaXMgbW9kdWxhci4KKyAqLwogI2lmZGVmIE1PRFVMRQogI2RlZmluZSBjYWxsZXJfaXNfbW9kdWxlKCkgKDEpCiAjZWxzZQpAQCAtMzQ5MywxNSArMzUwMywxMyBAQAogCiAvKioKICAqIG5hbmRfc2NhbiAtIFtOQU5EIEludGVyZmFjZV0gU2NhbiBmb3IgdGhlIE5BTkQgZGV2aWNlCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQG1heGNoaXBzOglOdW1iZXIgb2YgY2hpcHMgdG8gc2NhbiBmb3IKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbWF4Y2hpcHM6IG51bWJlciBvZiBjaGlwcyB0byBzY2FuIGZvcgogICoKLSAqIFRoaXMgZmlsbHMgb3V0IGFsbCB0aGUgdW5pbml0aWFsaXplZCBmdW5jdGlvbiBwb2ludGVycwotICogd2l0aCB0aGUgZGVmYXVsdHMuCi0gKiBUaGUgZmxhc2ggSUQgaXMgcmVhZCBhbmQgdGhlIG10ZC9jaGlwIHN0cnVjdHVyZXMgYXJlCi0gKiBmaWxsZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLgotICogVGhlIG10ZC0+b3duZXIgZmllbGQgbXVzdCBiZSBzZXQgdG8gdGhlIG1vZHVsZSBvZiB0aGUgY2FsbGVyCi0gKgorICogVGhpcyBmaWxscyBvdXQgYWxsIHRoZSB1bmluaXRpYWxpemVkIGZ1bmN0aW9uIHBvaW50ZXJzIHdpdGggdGhlIGRlZmF1bHRzLgorICogVGhlIGZsYXNoIElEIGlzIHJlYWQgYW5kIHRoZSBtdGQvY2hpcCBzdHJ1Y3R1cmVzIGFyZSBmaWxsZWQgd2l0aCB0aGUKKyAqIGFwcHJvcHJpYXRlIHZhbHVlcy4gVGhlIG10ZC0+b3duZXIgZmllbGQgbXVzdCBiZSBzZXQgdG8gdGhlIG1vZHVsZSBvZiB0aGUKKyAqIGNhbGxlci4KICAqLwogaW50IG5hbmRfc2NhbihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1heGNoaXBzKQogewpAQCAtMzUwOSw4ICszNTE3LDcgQEAKIAogCS8qIE1hbnkgY2FsbGVycyBnb3QgdGhpcyB3cm9uZywgc28gY2hlY2sgZm9yIGl0IGZvciBhIHdoaWxlLi4uICovCiAJaWYgKCFtdGQtPm93bmVyICYmIGNhbGxlcl9pc19tb2R1bGUoKSkgewotCQlwcmludGsoS0VSTl9DUklUICIlcyBjYWxsZWQgd2l0aCBOVUxMIG10ZC0+b3duZXIhXG4iLAotCQkJCV9fZnVuY19fKTsKKwkJcHJfY3JpdCgiJXMgY2FsbGVkIHdpdGggTlVMTCBtdGQtPm93bmVyIVxuIiwgX19mdW5jX18pOwogCQlCVUcoKTsKIAl9CiAKQEAgLTM1MjMsOCArMzUzMCw4IEBACiAKIC8qKgogICogbmFuZF9yZWxlYXNlIC0gW05BTkQgSW50ZXJmYWNlXSBGcmVlIHJlc291cmNlcyBoZWxkIGJ5IHRoZSBOQU5EIGRldmljZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSovCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICovCiB2b2lkIG5hbmRfcmVsZWFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCmluZGV4IGNjYmVhYTEuLjY5MTQ4YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmJ0LmMKQEAgLTE0LDcgKzE0LDcgQEAKICAqCiAgKiBXaGVuIG5hbmRfc2Nhbl9iYnQgaXMgY2FsbGVkLCB0aGVuIGl0IHRyaWVzIHRvIGZpbmQgdGhlIGJhZCBibG9jayB0YWJsZQogICogZGVwZW5kaW5nIG9uIHRoZSBvcHRpb25zIGluIHRoZSBCQlQgZGVzY3JpcHRvcihzKS4gSWYgbm8gZmxhc2ggYmFzZWQgQkJUCi0gKiAoTkFORF9VU0VfRkxBU0hfQkJUKSBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZGV2aWNlIGlzIHNjYW5uZWQgZm9yIGZhY3RvcnkKKyAqIChOQU5EX0JCVF9VU0VfRkxBU0gpIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBkZXZpY2UgaXMgc2Nhbm5lZCBmb3IgZmFjdG9yeQogICogbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgbWVtb3J5IEJCVC4KICAqIE9uY2UgYSBuZXcgYmFkIGJsb2NrIGlzIGRpc2NvdmVyZWQgdGhlbiB0aGUgImZhY3RvcnkiIGluZm9ybWF0aW9uIGlzIHVwZGF0ZWQKICAqIG9uIHRoZSBkZXZpY2UuCkBAIC0zNiw5ICszNiw5IEBACiAgKiBUaGUgdGFibGUgaXMgbWFya2VkIGluIHRoZSBPT0IgYXJlYSB3aXRoIGFuIGlkZW50IHBhdHRlcm4gYW5kIGEgdmVyc2lvbgogICogbnVtYmVyIHdoaWNoIGluZGljYXRlcyB3aGljaCBvZiBib3RoIHRhYmxlcyBpcyBtb3JlIHVwIHRvIGRhdGUuIElmIHRoZSBOQU5ECiAgKiBjb250cm9sbGVyIG5lZWRzIHRoZSBjb21wbGV0ZSBPT0IgYXJlYSBmb3IgdGhlIEVDQyBpbmZvcm1hdGlvbiB0aGVuIHRoZQotICogb3B0aW9uIE5BTkRfVVNFX0ZMQVNIX0JCVF9OT19PT0Igc2hvdWxkIGJlIHVzZWQ6IGl0IG1vdmVzIHRoZSBpZGVudCBwYXR0ZXJuCi0gKiBhbmQgdGhlIHZlcnNpb24gYnl0ZSBpbnRvIHRoZSBkYXRhIGFyZWEgYW5kIHRoZSBPT0IgYXJlYSB3aWxsIHJlbWFpbgotICogdW50b3VjaGVkLgorICogb3B0aW9uIE5BTkRfQkJUX05PX09PQiBzaG91bGQgYmUgdXNlZCAoYWxvbmcgd2l0aCBOQU5EX0JCVF9VU0VfRkxBU0gsIG9mCisgKiBjb3Vyc2UpOiBpdCBtb3ZlcyB0aGUgaWRlbnQgcGF0dGVybiBhbmQgdGhlIHZlcnNpb24gYnl0ZSBpbnRvIHRoZSBkYXRhIGFyZWEKKyAqIGFuZCB0aGUgT09CIGFyZWEgd2lsbCByZW1haW4gdW50b3VjaGVkLgogICoKICAqIFRoZSB0YWJsZSB1c2VzIDIgYml0cyBwZXIgYmxvY2sKICAqIDExYjoJCWJsb2NrIGlzIGdvb2QKQEAgLTY3LDYgKzY3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIGludCBjaGVja19wYXR0ZXJuX25vX29vYih1aW50OF90ICpidWYsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQpCiB7CkBAIC04MCwxNyArODEsMTUgQEAKIAogLyoqCiAgKiBjaGVja19wYXR0ZXJuIC0gW0dFTkVSSUNdIGNoZWNrIGlmIGEgcGF0dGVybiBpcyBpbiB0aGUgYnVmZmVyCi0gKiBAYnVmOgl0aGUgYnVmZmVyIHRvIHNlYXJjaAotICogQGxlbjoJdGhlIGxlbmd0aCBvZiBidWZmZXIgdG8gc2VhcmNoCi0gKiBAcGFnbGVuOgl0aGUgcGFnZWxlbmd0aAotICogQHRkOgkJc2VhcmNoIHBhdHRlcm4gZGVzY3JpcHRvcgorICogQGJ1ZjogdGhlIGJ1ZmZlciB0byBzZWFyY2gKKyAqIEBsZW46IHRoZSBsZW5ndGggb2YgYnVmZmVyIHRvIHNlYXJjaAorICogQHBhZ2xlbjogdGhlIHBhZ2VsZW5ndGgKKyAqIEB0ZDogc2VhcmNoIHBhdHRlcm4gZGVzY3JpcHRvcgogICoKLSAqIENoZWNrIGZvciBhIHBhdHRlcm4gYXQgdGhlIGdpdmVuIHBsYWNlLiBVc2VkIHRvIHNlYXJjaCBiYWQgYmxvY2sKLSAqIHRhYmxlcyBhbmQgZ29vZCAvIGJhZCBibG9jayBpZGVudGlmaWVycy4KLSAqIElmIHRoZSBTQ0FOX0VNUFRZIG9wdGlvbiBpcyBzZXQgdGhlbiBjaGVjaywgaWYgYWxsIGJ5dGVzIGV4Y2VwdCB0aGUKLSAqIHBhdHRlcm4gYXJlYSBjb250YWluIDB4ZmYKLSAqCi0qLworICogQ2hlY2sgZm9yIGEgcGF0dGVybiBhdCB0aGUgZ2l2ZW4gcGxhY2UuIFVzZWQgdG8gc2VhcmNoIGJhZCBibG9jayB0YWJsZXMgYW5kCisgKiBnb29kIC8gYmFkIGJsb2NrIGlkZW50aWZpZXJzLiBJZiB0aGUgU0NBTl9FTVBUWSBvcHRpb24gaXMgc2V0IHRoZW4gY2hlY2ssIGlmCisgKiBhbGwgYnl0ZXMgZXhjZXB0IHRoZSBwYXR0ZXJuIGFyZWEgY29udGFpbiAweGZmLgorICovCiBzdGF0aWMgaW50IGNoZWNrX3BhdHRlcm4odWludDhfdCAqYnVmLCBpbnQgbGVuLCBpbnQgcGFnbGVuLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQogewogCWludCBpLCBlbmQgPSAwOwpAQCAtMTA5LDMyICsxMDgsOCBAQAogCXAgKz0gZW5kOwogCiAJLyogQ29tcGFyZSB0aGUgcGF0dGVybiAqLwotCWZvciAoaSA9IDA7IGkgPCB0ZC0+bGVuOyBpKyspIHsKLQkJaWYgKHBbaV0gIT0gdGQtPnBhdHRlcm5baV0pCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogQ2hlY2sgYm90aCBwb3NpdGlvbnMgMSBhbmQgNiBmb3IgcGF0dGVybj8gKi8KLQlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9TQ0FOQllURTFBTkQ2KSB7Ci0JCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5FTVBUWSkgewotCQkJcCArPSB0ZC0+bGVuOwotCQkJZW5kICs9IE5BTkRfU01BTExfQkFEQkxPQ0tfUE9TIC0gdGQtPm9mZnM7Ci0JCQkvKiBDaGVjayByZWdpb24gYmV0d2VlbiBwb3NpdGlvbnMgMSBhbmQgNiAqLwotCQkJZm9yIChpID0gMDsgaSA8IE5BTkRfU01BTExfQkFEQkxPQ0tfUE9TIC0gdGQtPm9mZnMgLSB0ZC0+bGVuOwotCQkJCQlpKyspIHsKLQkJCQlpZiAoKnArKyAhPSAweGZmKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwICs9IE5BTkRfU01BTExfQkFEQkxPQ0tfUE9TIC0gdGQtPm9mZnM7Ci0JCX0KLQkJLyogQ29tcGFyZSB0aGUgcGF0dGVybiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgdGQtPmxlbjsgaSsrKSB7Ci0JCQlpZiAocFtpXSAhPSB0ZC0+cGF0dGVybltpXSkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisJaWYgKG1lbWNtcChwLCB0ZC0+cGF0dGVybiwgdGQtPmxlbikpCisJCXJldHVybiAtMTsKIAogCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5FTVBUWSkgewogCQlwICs9IHRkLT5sZW47CkBAIC0xNDksMTQgKzEyNCwxMyBAQAogCiAvKioKICAqIGNoZWNrX3Nob3J0X3BhdHRlcm4gLSBbR0VORVJJQ10gY2hlY2sgaWYgYSBwYXR0ZXJuIGlzIGluIHRoZSBidWZmZXIKLSAqIEBidWY6CXRoZSBidWZmZXIgdG8gc2VhcmNoCi0gKiBAdGQ6CQlzZWFyY2ggcGF0dGVybiBkZXNjcmlwdG9yCisgKiBAYnVmOiB0aGUgYnVmZmVyIHRvIHNlYXJjaAorICogQHRkOglzZWFyY2ggcGF0dGVybiBkZXNjcmlwdG9yCiAgKgotICogQ2hlY2sgZm9yIGEgcGF0dGVybiBhdCB0aGUgZ2l2ZW4gcGxhY2UuIFVzZWQgdG8gc2VhcmNoIGJhZCBibG9jawotICogdGFibGVzIGFuZCBnb29kIC8gYmFkIGJsb2NrIGlkZW50aWZpZXJzLiBTYW1lIGFzIGNoZWNrX3BhdHRlcm4sIGJ1dAotICogbm8gb3B0aW9uYWwgZW1wdHkgY2hlY2sKLSAqCi0qLworICogQ2hlY2sgZm9yIGEgcGF0dGVybiBhdCB0aGUgZ2l2ZW4gcGxhY2UuIFVzZWQgdG8gc2VhcmNoIGJhZCBibG9jayB0YWJsZXMgYW5kCisgKiBnb29kIC8gYmFkIGJsb2NrIGlkZW50aWZpZXJzLiBTYW1lIGFzIGNoZWNrX3BhdHRlcm4sIGJ1dCBubyBvcHRpb25hbCBlbXB0eQorICogY2hlY2suCisgKi8KIHN0YXRpYyBpbnQgY2hlY2tfc2hvcnRfcGF0dGVybih1aW50OF90ICpidWYsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQpCiB7CiAJaW50IGk7CkBAIC0xNjcsMjEgKzE0MSwxNCBAQAogCQlpZiAocFt0ZC0+b2ZmcyArIGldICE9IHRkLT5wYXR0ZXJuW2ldKQogCQkJcmV0dXJuIC0xOwogCX0KLQkvKiBOZWVkIHRvIGNoZWNrIGxvY2F0aW9uIDEgQU5EIDY/ICovCi0JaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkJZVEUxQU5ENikgewotCQlmb3IgKGkgPSAwOyBpIDwgdGQtPmxlbjsgaSsrKSB7Ci0JCQlpZiAocFtOQU5EX1NNQUxMX0JBREJMT0NLX1BPUyArIGldICE9IHRkLT5wYXR0ZXJuW2ldKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KIAlyZXR1cm4gMDsKIH0KIAogLyoqCiAgKiBhZGRfbWFya2VyX2xlbiAtIGNvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgbWFya2VyIGluIGRhdGEgYXJlYQotICogQHRkOgkJQkJUIGRlc2NyaXB0b3IgdXNlZCBmb3IgY29tcHV0YXRpb24KKyAqIEB0ZDogQkJUIGRlc2NyaXB0b3IgdXNlZCBmb3IgY29tcHV0YXRpb24KICAqCi0gKiBUaGUgbGVuZ3RoIHdpbGwgYmUgMCBpZiB0aGUgbWFya2VyaXMgbG9jYXRlZCBpbiBPT0IgYXJlYS4KKyAqIFRoZSBsZW5ndGggd2lsbCBiZSAwIGlmIHRoZSBtYXJrZXIgaXMgbG9jYXRlZCBpbiBPT0IgYXJlYS4KICAqLwogc3RhdGljIHUzMiBhZGRfbWFya2VyX2xlbihzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQogewpAQCAtMTk4LDM0ICsxNjUsMzMgQEAKIAogLyoqCiAgKiByZWFkX2JidCAtIFtHRU5FUklDXSBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgc3RhcnRpbmcgZnJvbSBwYWdlCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJdGVtcG9yYXJ5IGJ1ZmZlcgotICogQHBhZ2U6CXRoZSBzdGFydGluZyBwYWdlCi0gKiBAbnVtOgl0aGUgbnVtYmVyIG9mIGJidCBkZXNjcmlwdG9ycyB0byByZWFkCi0gKiBAdGQ6CQl0aGUgYmJ0IGRlc2NyaWJ0aW9uIHRhYmxlCi0gKiBAb2ZmczoJb2Zmc2V0IGluIHRoZSBtZW1vcnkgdGFibGUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiB0ZW1wb3JhcnkgYnVmZmVyCisgKiBAcGFnZTogdGhlIHN0YXJ0aW5nIHBhZ2UKKyAqIEBudW06IHRoZSBudW1iZXIgb2YgYmJ0IGRlc2NyaXB0b3JzIHRvIHJlYWQKKyAqIEB0ZDogdGhlIGJidCBkZXNjcmlidGlvbiB0YWJsZQorICogQG9mZnM6IG9mZnNldCBpbiB0aGUgbWVtb3J5IHRhYmxlCiAgKgogICogUmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlIHN0YXJ0aW5nIGZyb20gcGFnZS4KLSAqCiAgKi8KIHN0YXRpYyBpbnQgcmVhZF9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UsIGludCBudW0sCiAJCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQsIGludCBvZmZzKQogewotCWludCByZXMsIGksIGosIGFjdCA9IDA7CisJaW50IHJlcywgcmV0ID0gMCwgaSwgaiwgYWN0ID0gMDsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCXNpemVfdCByZXRsZW4sIGxlbiwgdG90bGVuOwogCWxvZmZfdCBmcm9tOwogCWludCBiaXRzID0gdGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9OUkJJVFNfTVNLOwotCXVpbnQ4X3QgbXNrID0gKHVpbnQ4X3QpICgoMSA8PCBiaXRzKSAtIDEpOworCXVpbnQ4X3QgbXNrID0gKHVpbnQ4X3QpKCgxIDw8IGJpdHMpIC0gMSk7CiAJdTMyIG1hcmtlcl9sZW47CiAJaW50IHJlc2VydmVkX2Jsb2NrX2NvZGUgPSB0ZC0+cmVzZXJ2ZWRfYmxvY2tfY29kZTsKIAogCXRvdGxlbiA9IChudW0gKiBiaXRzKSA+PiAzOwogCW1hcmtlcl9sZW4gPSBhZGRfbWFya2VyX2xlbih0ZCk7Ci0JZnJvbSA9ICgobG9mZl90KSBwYWdlKSA8PCB0aGlzLT5wYWdlX3NoaWZ0OworCWZyb20gPSAoKGxvZmZfdClwYWdlKSA8PCB0aGlzLT5wYWdlX3NoaWZ0OwogCiAJd2hpbGUgKHRvdGxlbikgewotCQlsZW4gPSBtaW4odG90bGVuLCAoc2l6ZV90KSAoMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpKTsKKwkJbGVuID0gbWluKHRvdGxlbiwgKHNpemVfdCkoMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpKTsKIAkJaWYgKG1hcmtlcl9sZW4pIHsKIAkJCS8qCiAJCQkgKiBJbiBjYXNlIHRoZSBCQlQgbWFya2VyIGlzIG5vdCBpbiB0aGUgT09CIGFyZWEgaXQKQEAgLTIzNywxMSArMjAzLDE4IEBACiAJCX0KIAkJcmVzID0gbXRkLT5yZWFkKG10ZCwgZnJvbSwgbGVuLCAmcmV0bGVuLCBidWYpOwogCQlpZiAocmVzIDwgMCkgewotCQkJaWYgKHJldGxlbiAhPSBsZW4pIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJuYW5kX2JidDogRXJyb3IgcmVhZGluZyBiYWQgYmxvY2sgdGFibGVcbiIpOworCQkJaWYgKG10ZF9pc19lY2NlcnIocmVzKSkgeworCQkJCXByX2luZm8oIm5hbmRfYmJ0OiBFQ0MgZXJyb3IgaW4gQkJUIGF0ICIKKwkJCQkJIjB4JTAxMmxseFxuIiwgZnJvbSAmIH5tdGQtPndyaXRlc2l6ZSk7CisJCQkJcmV0dXJuIHJlczsKKwkJCX0gZWxzZSBpZiAobXRkX2lzX2JpdGZsaXAocmVzKSkgeworCQkJCXByX2luZm8oIm5hbmRfYmJ0OiBjb3JyZWN0ZWQgZXJyb3IgaW4gQkJUIGF0ICIKKwkJCQkJIjB4JTAxMmxseFxuIiwgZnJvbSAmIH5tdGQtPndyaXRlc2l6ZSk7CisJCQkJcmV0ID0gcmVzOworCQkJfSBlbHNlIHsKKwkJCQlwcl9pbmZvKCJuYW5kX2JidDogZXJyb3IgcmVhZGluZyBCQlRcbiIpOwogCQkJCXJldHVybiByZXM7CiAJCQl9Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJuYW5kX2JidDogRUNDIGVycm9yIHdoaWxlIHJlYWRpbmcgYmFkIGJsb2NrIHRhYmxlXG4iKTsKIAkJfQogCiAJCS8qIEFuYWx5c2UgZGF0YSAqLwpAQCAtMjUyLDE3ICsyMjUsMTkgQEAKIAkJCQlpZiAodG1wID09IG1zaykKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKHJlc2VydmVkX2Jsb2NrX2NvZGUgJiYgKHRtcCA9PSByZXNlcnZlZF9ibG9ja19jb2RlKSkgewotCQkJCQlwcmludGsoS0VSTl9ERUJVRyAibmFuZF9yZWFkX2JidDogUmVzZXJ2ZWQgYmxvY2sgYXQgMHglMDEybGx4XG4iLAotCQkJCQkgICAgICAgKGxvZmZfdCkoKG9mZnMgPDwgMikgKyAoYWN0ID4+IDEpKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOworCQkJCQlwcl9pbmZvKCJuYW5kX3JlYWRfYmJ0OiByZXNlcnZlZCBibG9jayBhdCAweCUwMTJsbHhcbiIsCisJCQkJCQkgKGxvZmZfdCkoKG9mZnMgPDwgMikgKyAoYWN0ID4+IDEpKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOwogCQkJCQl0aGlzLT5iYnRbb2ZmcyArIChhY3QgPj4gMyldIHw9IDB4MiA8PCAoYWN0ICYgMHgwNik7CiAJCQkJCW10ZC0+ZWNjX3N0YXRzLmJidGJsb2NrcysrOwogCQkJCQljb250aW51ZTsKIAkJCQl9Ci0JCQkJLyogTGVhdmUgaXQgZm9yIG5vdywgaWYgaXRzIG1hdHVyZWQgd2UgY2FuIG1vdmUgdGhpcwotCQkJCSAqIG1lc3NhZ2UgdG8gTVREX0RFQlVHX0xFVkVMMCAqLwotCQkJCXByaW50ayhLRVJOX0RFQlVHICJuYW5kX3JlYWRfYmJ0OiBCYWQgYmxvY2sgYXQgMHglMDEybGx4XG4iLAotCQkJCSAgICAgICAobG9mZl90KSgob2ZmcyA8PCAyKSArIChhY3QgPj4gMSkpIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7Ci0JCQkJLyogRmFjdG9yeSBtYXJrZWQgYmFkIG9yIHdvcm4gb3V0ID8gKi8KKwkJCQkvKgorCQkJCSAqIExlYXZlIGl0IGZvciBub3csIGlmIGl0J3MgbWF0dXJlZCB3ZSBjYW4KKwkJCQkgKiBtb3ZlIHRoaXMgbWVzc2FnZSB0byBwcl9kZWJ1Zy4KKwkJCQkgKi8KKwkJCQlwcl9pbmZvKCJuYW5kX3JlYWRfYmJ0OiBiYWQgYmxvY2sgYXQgMHglMDEybGx4XG4iLAorCQkJCQkgKGxvZmZfdCkoKG9mZnMgPDwgMikgKyAoYWN0ID4+IDEpKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOworCQkJCS8qIEZhY3RvcnkgbWFya2VkIGJhZCBvciB3b3JuIG91dD8gKi8KIAkJCQlpZiAodG1wID09IDApCiAJCQkJCXRoaXMtPmJidFtvZmZzICsgKGFjdCA+PiAzKV0gfD0gMHgzIDw8IChhY3QgJiAweDA2KTsKIAkJCQllbHNlCkBAIC0yNzMsMjAgKzI0OCwyMCBAQAogCQl0b3RsZW4gLT0gbGVuOwogCQlmcm9tICs9IGxlbjsKIAl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCiAgKiByZWFkX2Fic19iYnQgLSBbR0VORVJJQ10gUmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlIHN0YXJ0aW5nIGF0IGEgZ2l2ZW4gcGFnZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKLSAqIEB0ZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKLSAqIEBjaGlwOglyZWFkIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpYyBjaGlwLCAtMSByZWFkIGFsbCBjaGlwcy4KLSAqCQlBcHBsaWVzIG9ubHkgaWYgTkFORF9CQlRfUEVSQ0hJUCBvcHRpb24gaXMgc2V0CisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjogdGVtcG9yYXJ5IGJ1ZmZlcgorICogQHRkOiBkZXNjcmlwdG9yIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlCisgKiBAY2hpcDogcmVhZCB0aGUgdGFibGUgZm9yIGEgc3BlY2lmaWMgY2hpcCwgLTEgcmVhZCBhbGwgY2hpcHM7IGFwcGxpZXMgb25seSBpZgorICogICAgICAgIE5BTkRfQkJUX1BFUkNISVAgb3B0aW9uIGlzIHNldAogICoKLSAqIFJlYWQgdGhlIGJhZCBibG9jayB0YWJsZSBmb3IgYWxsIGNoaXBzIHN0YXJ0aW5nIGF0IGEgZ2l2ZW4gcGFnZQotICogV2UgYXNzdW1lIHRoYXQgdGhlIGJidCBiaXRzIGFyZSBpbiBjb25zZWN1dGl2ZSBvcmRlci4KLSovCisgKiBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgZm9yIGFsbCBjaGlwcyBzdGFydGluZyBhdCBhIGdpdmVuIHBhZ2UuIFdlIGFzc3VtZQorICogdGhhdCB0aGUgYmJ0IGJpdHMgYXJlIGluIGNvbnNlY3V0aXZlIG9yZGVyLgorICovCiBzdGF0aWMgaW50IHJlYWRfYWJzX2JidChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkLCBpbnQgY2hpcCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwpAQCAtMzEyLDkgKzI4Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBCQlQgbWFya2VyIGlzIGluIHRoZSBmaXJzdCBwYWdlLCBubyBPT0IuCi0gKi8KKy8qIEJCVCBtYXJrZXIgaXMgaW4gdGhlIGZpcnN0IHBhZ2UsIG5vIE9PQiAqLwogc3RhdGljIGludCBzY2FuX3JlYWRfcmF3X2RhdGEoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwgbG9mZl90IG9mZnMsCiAJCQkgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCkKIHsKQEAgLTMyOCwzNSArMzAxLDI2IEBACiAJcmV0dXJuIG10ZC0+cmVhZChtdGQsIG9mZnMsIGxlbiwgJnJldGxlbiwgYnVmKTsKIH0KIAotLyoKLSAqIFNjYW4gcmVhZCByYXcgZGF0YSBmcm9tIGZsYXNoCi0gKi8KKy8qIFNjYW4gcmVhZCByYXcgZGF0YSBmcm9tIGZsYXNoICovCiBzdGF0aWMgaW50IHNjYW5fcmVhZF9yYXdfb29iKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIGxvZmZfdCBvZmZzLAogCQkJIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmVzOwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX1JBVzsKKwlvcHMubW9kZSA9IE1URF9PUFNfUkFXOwogCW9wcy5vb2JvZmZzID0gMDsKIAlvcHMub29ibGVuID0gbXRkLT5vb2JzaXplOwogCi0KIAl3aGlsZSAobGVuID4gMCkgewotCQlpZiAobGVuIDw9IG10ZC0+d3JpdGVzaXplKSB7Ci0JCQlvcHMub29iYnVmID0gYnVmICsgbGVuOwotCQkJb3BzLmRhdGJ1ZiA9IGJ1ZjsKLQkJCW9wcy5sZW4gPSBsZW47Ci0JCQlyZXR1cm4gbXRkLT5yZWFkX29vYihtdGQsIG9mZnMsICZvcHMpOwotCQl9IGVsc2UgewotCQkJb3BzLm9vYmJ1ZiA9IGJ1ZiArIG10ZC0+d3JpdGVzaXplOwotCQkJb3BzLmRhdGJ1ZiA9IGJ1ZjsKLQkJCW9wcy5sZW4gPSBtdGQtPndyaXRlc2l6ZTsKLQkJCXJlcyA9IG10ZC0+cmVhZF9vb2IobXRkLCBvZmZzLCAmb3BzKTsKKwkJb3BzLmRhdGJ1ZiA9IGJ1ZjsKKwkJb3BzLmxlbiA9IG1pbihsZW4sIChzaXplX3QpbXRkLT53cml0ZXNpemUpOworCQlvcHMub29iYnVmID0gYnVmICsgb3BzLmxlbjsKIAotCQkJaWYgKHJlcykKLQkJCQlyZXR1cm4gcmVzOwotCQl9CisJCXJlcyA9IG10ZC0+cmVhZF9vb2IobXRkLCBvZmZzLCAmb3BzKTsKKworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKIAogCQlidWYgKz0gbXRkLT5vb2JzaXplICsgbXRkLT53cml0ZXNpemU7CiAJCWxlbiAtPSBtdGQtPndyaXRlc2l6ZTsKQEAgLTM3MywxNSArMzM3LDEzIEBACiAJCXJldHVybiBzY2FuX3JlYWRfcmF3X29vYihtdGQsIGJ1Ziwgb2ZmcywgbGVuKTsKIH0KIAotLyoKLSAqIFNjYW4gd3JpdGUgZGF0YSB3aXRoIG9vYiB0byBmbGFzaAotICovCisvKiBTY2FuIHdyaXRlIGRhdGEgd2l0aCBvb2IgdG8gZmxhc2ggKi8KIHN0YXRpYyBpbnQgc2Nhbl93cml0ZV9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzLCBzaXplX3QgbGVuLAogCQkJICB1aW50OF90ICpidWYsIHVpbnQ4X3QgKm9vYikKIHsKIAlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gTVREX09QU19QTEFDRV9PT0I7CiAJb3BzLm9vYm9mZnMgPSAwOwogCW9wcy5vb2JsZW4gPSBtdGQtPm9vYnNpemU7CiAJb3BzLmRhdGJ1ZiA9IGJ1ZjsKQEAgLTQwMiwxNSArMzY0LDE0IEBACiAKIC8qKgogICogcmVhZF9hYnNfYmJ0cyAtIFtHRU5FUklDXSBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUocykgZm9yIGFsbCBjaGlwcyBzdGFydGluZyBhdCBhIGdpdmVuIHBhZ2UKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYnVmOgl0ZW1wb3JhcnkgYnVmZmVyCi0gKiBAdGQ6CQlkZXNjcmlwdG9yIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlCi0gKiBAbWQ6CQlkZXNjcmlwdG9yIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlIG1pcnJvcgorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IHRlbXBvcmFyeSBidWZmZXIKKyAqIEB0ZDogZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQorICogQG1kOglkZXNjcmlwdG9yIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlIG1pcnJvcgogICoKLSAqIFJlYWQgdGhlIGJhZCBibG9jayB0YWJsZShzKSBmb3IgYWxsIGNoaXBzIHN0YXJ0aW5nIGF0IGEgZ2l2ZW4gcGFnZQotICogV2UgYXNzdW1lIHRoYXQgdGhlIGJidCBiaXRzIGFyZSBpbiBjb25zZWN1dGl2ZSBvcmRlci4KLSAqCi0qLworICogUmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlKHMpIGZvciBhbGwgY2hpcHMgc3RhcnRpbmcgYXQgYSBnaXZlbiBwYWdlLiBXZQorICogYXNzdW1lIHRoYXQgdGhlIGJidCBiaXRzIGFyZSBpbiBjb25zZWN1dGl2ZSBvcmRlci4KKyAqLwogc3RhdGljIGludCByZWFkX2Fic19iYnRzKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsCiAJCQkgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICptZCkKIHsKQEAgLTQyMSw4ICszODIsOCBAQAogCQlzY2FuX3JlYWRfcmF3KG10ZCwgYnVmLCAobG9mZl90KXRkLT5wYWdlc1swXSA8PCB0aGlzLT5wYWdlX3NoaWZ0LAogCQkJICAgICAgbXRkLT53cml0ZXNpemUsIHRkKTsKIAkJdGQtPnZlcnNpb25bMF0gPSBidWZbYmJ0X2dldF92ZXJfb2ZmcyhtdGQsIHRkKV07Ci0JCXByaW50ayhLRVJOX0RFQlVHICJCYWQgYmxvY2sgdGFibGUgYXQgcGFnZSAlZCwgdmVyc2lvbiAweCUwMlhcbiIsCi0JCSAgICAgICB0ZC0+cGFnZXNbMF0sIHRkLT52ZXJzaW9uWzBdKTsKKwkJcHJfaW5mbygiQmFkIGJsb2NrIHRhYmxlIGF0IHBhZ2UgJWQsIHZlcnNpb24gMHglMDJYXG4iLAorCQkJIHRkLT5wYWdlc1swXSwgdGQtPnZlcnNpb25bMF0pOwogCX0KIAogCS8qIFJlYWQgdGhlIG1pcnJvciB2ZXJzaW9uLCBpZiBhdmFpbGFibGUgKi8KQEAgLTQzMCwxNSArMzkxLDEzIEBACiAJCXNjYW5fcmVhZF9yYXcobXRkLCBidWYsIChsb2ZmX3QpbWQtPnBhZ2VzWzBdIDw8IHRoaXMtPnBhZ2Vfc2hpZnQsCiAJCQkgICAgICBtdGQtPndyaXRlc2l6ZSwgdGQpOwogCQltZC0+dmVyc2lvblswXSA9IGJ1ZltiYnRfZ2V0X3Zlcl9vZmZzKG10ZCwgbWQpXTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkJhZCBibG9jayB0YWJsZSBhdCBwYWdlICVkLCB2ZXJzaW9uIDB4JTAyWFxuIiwKLQkJICAgICAgIG1kLT5wYWdlc1swXSwgbWQtPnZlcnNpb25bMF0pOworCQlwcl9pbmZvKCJCYWQgYmxvY2sgdGFibGUgYXQgcGFnZSAlZCwgdmVyc2lvbiAweCUwMlhcbiIsCisJCQkgbWQtPnBhZ2VzWzBdLCBtZC0+dmVyc2lvblswXSk7CiAJfQogCXJldHVybiAxOwogfQogCi0vKgotICogU2NhbiBhIGdpdmVuIGJsb2NrIGZ1bGwKLSAqLworLyogU2NhbiBhIGdpdmVuIGJsb2NrIGZ1bGwgKi8KIHN0YXRpYyBpbnQgc2Nhbl9ibG9ja19mdWxsKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkLAogCQkJICAgbG9mZl90IG9mZnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHJlYWRsZW4sCiAJCQkgICBpbnQgc2NhbmxlbiwgaW50IGxlbikKQEAgLTQ0Niw3ICs0MDUsOCBAQAogCWludCByZXQsIGo7CiAKIAlyZXQgPSBzY2FuX3JlYWRfcmF3X29vYihtdGQsIGJ1Ziwgb2ZmcywgcmVhZGxlbik7Ci0JaWYgKHJldCkKKwkvKiBJZ25vcmUgRUNDIGVycm9ycyB3aGVuIGNoZWNraW5nIGZvciBCQk0gKi8KKwlpZiAocmV0ICYmICFtdGRfaXNfYml0ZmxpcF9vcl9lY2NlcnIocmV0KSkKIAkJcmV0dXJuIHJldDsKIAogCWZvciAoaiA9IDA7IGogPCBsZW47IGorKywgYnVmICs9IHNjYW5sZW4pIHsKQEAgLTQ1Niw5ICs0MTYsNyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2NhbiBhIGdpdmVuIGJsb2NrIHBhcnRpYWxseQotICovCisvKiBTY2FuIGEgZ2l2ZW4gYmxvY2sgcGFydGlhbGx5ICovCiBzdGF0aWMgaW50IHNjYW5fYmxvY2tfZmFzdChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCwKIAkJCSAgIGxvZmZfdCBvZmZzLCB1aW50OF90ICpidWYsIGludCBsZW4pCiB7CkBAIC00NjksMTYgKzQyNywxNiBAQAogCW9wcy5vb2JidWYgPSBidWY7CiAJb3BzLm9vYm9mZnMgPSAwOwogCW9wcy5kYXRidWYgPSBOVUxMOwotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCiAJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CiAJCS8qCi0JCSAqIFJlYWQgdGhlIGZ1bGwgb29iIHVudGlsIHJlYWRfb29iIGlzIGZpeGVkIHRvCi0JCSAqIGhhbmRsZSBzaW5nbGUgYnl0ZSByZWFkcyBmb3IgMTYgYml0Ci0JCSAqIGJ1c3dpZHRoCisJCSAqIFJlYWQgdGhlIGZ1bGwgb29iIHVudGlsIHJlYWRfb29iIGlzIGZpeGVkIHRvIGhhbmRsZSBzaW5nbGUKKwkJICogYnl0ZSByZWFkcyBmb3IgMTYgYml0IGJ1c3dpZHRoLgogCQkgKi8KIAkJcmV0ID0gbXRkLT5yZWFkX29vYihtdGQsIG9mZnMsICZvcHMpOwotCQlpZiAocmV0KQorCQkvKiBJZ25vcmUgRUNDIGVycm9ycyB3aGVuIGNoZWNraW5nIGZvciBCQk0gKi8KKwkJaWYgKHJldCAmJiAhbXRkX2lzX2JpdGZsaXBfb3JfZWNjZXJyKHJldCkpCiAJCQlyZXR1cm4gcmV0OwogCiAJCWlmIChjaGVja19zaG9ydF9wYXR0ZXJuKGJ1ZiwgYmQpKQpAQCAtNDkxLDE0ICs0NDksMTQgQEAKIAogLyoqCiAgKiBjcmVhdGVfYmJ0IC0gW0dFTkVSSUNdIENyZWF0ZSBhIGJhZCBibG9jayB0YWJsZSBieSBzY2FubmluZyB0aGUgZGV2aWNlCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJdGVtcG9yYXJ5IGJ1ZmZlcgotICogQGJkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGdvb2QvYmFkIGJsb2NrIHNlYXJjaCBwYXR0ZXJuCi0gKiBAY2hpcDoJY3JlYXRlIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpYyBjaGlwLCAtMSByZWFkIGFsbCBjaGlwcy4KLSAqCQlBcHBsaWVzIG9ubHkgaWYgTkFORF9CQlRfUEVSQ0hJUCBvcHRpb24gaXMgc2V0CisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjogdGVtcG9yYXJ5IGJ1ZmZlcgorICogQGJkOiBkZXNjcmlwdG9yIGZvciB0aGUgZ29vZC9iYWQgYmxvY2sgc2VhcmNoIHBhdHRlcm4KKyAqIEBjaGlwOiBjcmVhdGUgdGhlIHRhYmxlIGZvciBhIHNwZWNpZmljIGNoaXAsIC0xIHJlYWQgYWxsIGNoaXBzOyBhcHBsaWVzIG9ubHkKKyAqICAgICAgICBpZiBOQU5EX0JCVF9QRVJDSElQIG9wdGlvbiBpcyBzZXQKICAqCi0gKiBDcmVhdGUgYSBiYWQgYmxvY2sgdGFibGUgYnkgc2Nhbm5pbmcgdGhlIGRldmljZQotICogZm9yIHRoZSBnaXZlbiBnb29kL2JhZCBibG9jayBpZGVudGlmeSBwYXR0ZXJuCisgKiBDcmVhdGUgYSBiYWQgYmxvY2sgdGFibGUgYnkgc2Nhbm5pbmcgdGhlIGRldmljZSBmb3IgdGhlIGdpdmVuIGdvb2QvYmFkIGJsb2NrCisgKiBpZGVudGlmeSBwYXR0ZXJuLgogICovCiBzdGF0aWMgaW50IGNyZWF0ZV9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwKIAlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkLCBpbnQgY2hpcCkKQEAgLTUwOSw3ICs0NjcsNyBAQAogCWxvZmZfdCBmcm9tOwogCXNpemVfdCByZWFkbGVuOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU2Nhbm5pbmcgZGV2aWNlIGZvciBiYWQgYmxvY2tzXG4iKTsKKwlwcl9pbmZvKCJTY2FubmluZyBkZXZpY2UgZm9yIGJhZCBibG9ja3NcbiIpOwogCiAJaWYgKGJkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkFMTFBBR0VTKQogCQlsZW4gPSAxIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSB0aGlzLT5wYWdlX3NoaWZ0KTsKQEAgLTUyOSwxNCArNDg3LDE2IEBACiAJfQogCiAJaWYgKGNoaXAgPT0gLTEpIHsKLQkJLyogTm90ZSB0aGF0IG51bWJsb2NrcyBpcyAyICogKHJlYWwgbnVtYmxvY2tzKSBoZXJlLCBzZWUgaSs9MgotCQkgKiBiZWxvdyBhcyBpdCBtYWtlcyBzaGlmdGluZyBhbmQgbWFza2luZyBsZXNzIHBhaW5mdWwgKi8KKwkJLyoKKwkJICogTm90ZSB0aGF0IG51bWJsb2NrcyBpcyAyICogKHJlYWwgbnVtYmxvY2tzKSBoZXJlLCBzZWUgaSs9MgorCQkgKiBiZWxvdyBhcyBpdCBtYWtlcyBzaGlmdGluZyBhbmQgbWFza2luZyBsZXNzIHBhaW5mdWwKKwkJICovCiAJCW51bWJsb2NrcyA9IG10ZC0+c2l6ZSA+PiAodGhpcy0+YmJ0X2VyYXNlX3NoaWZ0IC0gMSk7CiAJCXN0YXJ0YmxvY2sgPSAwOwogCQlmcm9tID0gMDsKIAl9IGVsc2UgewogCQlpZiAoY2hpcCA+PSB0aGlzLT5udW1jaGlwcykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3JlYXRlX2JidCgpOiBjaGlwbnIgKCVkKSA+IGF2YWlsYWJsZSBjaGlwcyAoJWQpXG4iLAorCQkJcHJfd2FybigiY3JlYXRlX2JidCgpOiBjaGlwbnIgKCVkKSA+IGF2YWlsYWJsZSBjaGlwcyAoJWQpXG4iLAogCQkJICAgICAgIGNoaXAgKyAxLCB0aGlzLT5udW1jaGlwcyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNTQ2LDcgKzUwNiw3IEBACiAJCWZyb20gPSAobG9mZl90KXN0YXJ0YmxvY2sgPDwgKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIDEpOwogCX0KIAotCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkxBU1RQQUdFKQorCWlmICh0aGlzLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5MQVNUUEFHRSkKIAkJZnJvbSArPSBtdGQtPmVyYXNlc2l6ZSAtIChtdGQtPndyaXRlc2l6ZSAqIGxlbik7CiAKIAlmb3IgKGkgPSBzdGFydGJsb2NrOyBpIDwgbnVtYmxvY2tzOykgewpAQCAtNTY1LDggKzUyNSw4IEBACiAKIAkJaWYgKHJldCkgewogCQkJdGhpcy0+YmJ0W2kgPj4gM10gfD0gMHgwMyA8PCAoaSAmIDB4Nik7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJCYWQgZXJhc2VibG9jayAlZCBhdCAweCUwMTJsbHhcbiIsCi0JCQkgICAgICAgaSA+PiAxLCAodW5zaWduZWQgbG9uZyBsb25nKWZyb20pOworCQkJcHJfd2FybigiQmFkIGVyYXNlYmxvY2sgJWQgYXQgMHglMDEybGx4XG4iLAorCQkJCWkgPj4gMSwgKHVuc2lnbmVkIGxvbmcgbG9uZylmcm9tKTsKIAkJCW10ZC0+ZWNjX3N0YXRzLmJhZGJsb2NrcysrOwogCQl9CiAKQEAgLTU3OCwyMCArNTM4LDE4IEBACiAKIC8qKgogICogc2VhcmNoX2JidCAtIFtHRU5FUklDXSBzY2FuIHRoZSBkZXZpY2UgZm9yIGEgc3BlY2lmaWMgYmFkIGJsb2NrIHRhYmxlCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJdGVtcG9yYXJ5IGJ1ZmZlcgotICogQHRkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IHRlbXBvcmFyeSBidWZmZXIKKyAqIEB0ZDogZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQogICoKLSAqIFJlYWQgdGhlIGJhZCBibG9jayB0YWJsZSBieSBzZWFyY2hpbmcgZm9yIGEgZ2l2ZW4gaWRlbnQgcGF0dGVybi4KLSAqIFNlYXJjaCBpcyBwcmVmb3JtZWQgZWl0aGVyIGZyb20gdGhlIGJlZ2lubmluZyB1cCBvciBmcm9tIHRoZSBlbmQgb2YKLSAqIHRoZSBkZXZpY2UgZG93bndhcmRzLiBUaGUgc2VhcmNoIHN0YXJ0cyBhbHdheXMgYXQgdGhlIHN0YXJ0IG9mIGEKLSAqIGJsb2NrLgotICogSWYgdGhlIG9wdGlvbiBOQU5EX0JCVF9QRVJDSElQIGlzIGdpdmVuLCBlYWNoIGNoaXAgaXMgc2VhcmNoZWQKLSAqIGZvciBhIGJidCwgd2hpY2ggY29udGFpbnMgdGhlIGJhZCBibG9jayBpbmZvcm1hdGlvbiBvZiB0aGlzIGNoaXAuCi0gKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGNlcnRhaW4gRE9DIGRldmljZXMuCisgKiBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgYnkgc2VhcmNoaW5nIGZvciBhIGdpdmVuIGlkZW50IHBhdHRlcm4uIFNlYXJjaCBpcworICogcHJlZm9ybWVkIGVpdGhlciBmcm9tIHRoZSBiZWdpbm5pbmcgdXAgb3IgZnJvbSB0aGUgZW5kIG9mIHRoZSBkZXZpY2UKKyAqIGRvd253YXJkcy4gVGhlIHNlYXJjaCBzdGFydHMgYWx3YXlzIGF0IHRoZSBzdGFydCBvZiBhIGJsb2NrLiBJZiB0aGUgb3B0aW9uCisgKiBOQU5EX0JCVF9QRVJDSElQIGlzIGdpdmVuLCBlYWNoIGNoaXAgaXMgc2VhcmNoZWQgZm9yIGEgYmJ0LCB3aGljaCBjb250YWlucworICogdGhlIGJhZCBibG9jayBpbmZvcm1hdGlvbiBvZiB0aGlzIGNoaXAuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgc3VwcG9ydAorICogZm9yIGNlcnRhaW4gRE9DIGRldmljZXMuCiAgKgotICogVGhlIGJidCBpZGVudCBwYXR0ZXJuIHJlc2lkZXMgaW4gdGhlIG9vYiBhcmVhIG9mIHRoZSBmaXJzdCBwYWdlCi0gKiBpbiBhIGJsb2NrLgorICogVGhlIGJidCBpZGVudCBwYXR0ZXJuIHJlc2lkZXMgaW4gdGhlIG9vYiBhcmVhIG9mIHRoZSBmaXJzdCBwYWdlIGluIGEgYmxvY2suCiAgKi8KIHN0YXRpYyBpbnQgc2VhcmNoX2JidChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQogewpAQCAtNjAyLDcgKzU2MCw3IEBACiAJaW50IGJidGJsb2NrczsKIAlpbnQgYmxvY2t0b3BhZ2UgPSB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSB0aGlzLT5wYWdlX3NoaWZ0OwogCi0JLyogU2VhcmNoIGRpcmVjdGlvbiB0b3AgLT4gZG93biA/ICovCisJLyogU2VhcmNoIGRpcmVjdGlvbiB0b3AgLT4gZG93bj8gKi8KIAlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9MQVNUQkxPQ0spIHsKIAkJc3RhcnRibG9jayA9IChtdGQtPnNpemUgPj4gdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KSAtIDE7CiAJCWRpciA9IC0xOwpAQCAtNjExLDcgKzU2OSw3IEBACiAJCWRpciA9IDE7CiAJfQogCi0JLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcCA/ICovCisJLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcD8gKi8KIAlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9QRVJDSElQKSB7CiAJCWNoaXBzID0gdGhpcy0+bnVtY2hpcHM7CiAJCWJidGJsb2NrcyA9IHRoaXMtPmNoaXBzaXplID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdDsKQEAgLTY1MCwyMyArNjA4LDIzIEBACiAJLyogQ2hlY2ssIGlmIHdlIGZvdW5kIGEgYmJ0IGZvciBlYWNoIHJlcXVlc3RlZCBjaGlwICovCiAJZm9yIChpID0gMDsgaSA8IGNoaXBzOyBpKyspIHsKIAkJaWYgKHRkLT5wYWdlc1tpXSA9PSAtMSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJhZCBibG9jayB0YWJsZSBub3QgZm91bmQgZm9yIGNoaXAgJWRcbiIsIGkpOworCQkJcHJfd2FybigiQmFkIGJsb2NrIHRhYmxlIG5vdCBmb3VuZCBmb3IgY2hpcCAlZFxuIiwgaSk7CiAJCWVsc2UKLQkJCXByaW50ayhLRVJOX0RFQlVHICJCYWQgYmxvY2sgdGFibGUgZm91bmQgYXQgcGFnZSAlZCwgdmVyc2lvbiAweCUwMlhcbiIsIHRkLT5wYWdlc1tpXSwKLQkJCSAgICAgICB0ZC0+dmVyc2lvbltpXSk7CisJCQlwcl9pbmZvKCJCYWQgYmxvY2sgdGFibGUgZm91bmQgYXQgcGFnZSAlZCwgdmVyc2lvbiAiCisJCQkJICIweCUwMlhcbiIsIHRkLT5wYWdlc1tpXSwgdGQtPnZlcnNpb25baV0pOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogLyoqCiAgKiBzZWFyY2hfcmVhZF9iYnRzIC0gW0dFTkVSSUNdIHNjYW4gdGhlIGRldmljZSBmb3IgYmFkIGJsb2NrIHRhYmxlKHMpCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJdGVtcG9yYXJ5IGJ1ZmZlcgotICogQHRkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQotICogQG1kOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZSBtaXJyb3IKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiB0ZW1wb3JhcnkgYnVmZmVyCisgKiBAdGQ6IGRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKKyAqIEBtZDogZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZSBtaXJyb3IKICAqCi0gKiBTZWFyY2ggYW5kIHJlYWQgdGhlIGJhZCBibG9jayB0YWJsZShzKQotKi8KKyAqIFNlYXJjaCBhbmQgcmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlKHMpLgorICovCiBzdGF0aWMgaW50IHNlYXJjaF9yZWFkX2JidHMoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKiBidWYsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqbWQpCiB7CiAJLyogU2VhcmNoIHRoZSBwcmltYXJ5IHRhYmxlICovCkBAIC02ODIsMTYgKzY0MCwxNCBAQAogCiAvKioKICAqIHdyaXRlX2JidCAtIFtHRU5FUklDXSAoUmUpd3JpdGUgdGhlIGJhZCBibG9jayB0YWJsZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IHRlbXBvcmFyeSBidWZmZXIKKyAqIEB0ZDogZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQorICogQG1kOiBkZXNjcmlwdG9yIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlIG1pcnJvcgorICogQGNoaXBzZWw6IHNlbGVjdG9yIGZvciBhIHNwZWNpZmljIGNoaXAsIC0xIGZvciBhbGwKICAqCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJdGVtcG9yYXJ5IGJ1ZmZlcgotICogQHRkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQotICogQG1kOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZSBtaXJyb3IKLSAqIEBjaGlwc2VsOglzZWxlY3RvciBmb3IgYSBzcGVjaWZpYyBjaGlwLCAtMSBmb3IgYWxsCi0gKgotICogKFJlKXdyaXRlIHRoZSBiYWQgYmxvY2sgdGFibGUKLSAqCi0qLworICogKFJlKXdyaXRlIHRoZSBiYWQgYmxvY2sgdGFibGUuCisgKi8KIHN0YXRpYyBpbnQgd3JpdGVfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsCiAJCSAgICAgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICptZCwKIAkJICAgICBpbnQgY2hpcHNlbCkKQEAgLTcxMCwxNCArNjY2LDE0IEBACiAJb3BzLm9vYmxlbiA9IG10ZC0+b29ic2l6ZTsKIAlvcHMub29ib2ZmcyA9IDA7CiAJb3BzLmRhdGJ1ZiA9IE5VTEw7Ci0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gTVREX09QU19QTEFDRV9PT0I7CiAKIAlpZiAoIXJjb2RlKQogCQlyY29kZSA9IDB4ZmY7Ci0JLyogV3JpdGUgYmFkIGJsb2NrIHRhYmxlIHBlciBjaGlwIHJhdGhlciB0aGFuIHBlciBkZXZpY2UgPyAqLworCS8qIFdyaXRlIGJhZCBibG9jayB0YWJsZSBwZXIgY2hpcCByYXRoZXIgdGhhbiBwZXIgZGV2aWNlPyAqLwogCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1BFUkNISVApIHsKIAkJbnVtYmxvY2tzID0gKGludCkodGhpcy0+Y2hpcHNpemUgPj4gdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KTsKLQkJLyogRnVsbCBkZXZpY2Ugd3JpdGUgb3Igc3BlY2lmaWMgY2hpcCA/ICovCisJCS8qIEZ1bGwgZGV2aWNlIHdyaXRlIG9yIHNwZWNpZmljIGNoaXA/ICovCiAJCWlmIChjaGlwc2VsID09IC0xKSB7CiAJCQlucmNoaXBzID0gdGhpcy0+bnVtY2hpcHM7CiAJCX0gZWxzZSB7CkBAIC03MzEsOCArNjg3LDggQEAKIAogCS8qIExvb3AgdGhyb3VnaCB0aGUgY2hpcHMgKi8KIAlmb3IgKDsgY2hpcCA8IG5yY2hpcHM7IGNoaXArKykgewotCi0JCS8qIFRoZXJlIHdhcyBhbHJlYWR5IGEgdmVyc2lvbiBvZiB0aGUgdGFibGUsIHJldXNlIHRoZSBwYWdlCisJCS8qCisJCSAqIFRoZXJlIHdhcyBhbHJlYWR5IGEgdmVyc2lvbiBvZiB0aGUgdGFibGUsIHJldXNlIHRoZSBwYWdlCiAJCSAqIFRoaXMgYXBwbGllcyBmb3IgYWJzb2x1dGUgcGxhY2VtZW50IHRvbywgYXMgd2UgaGF2ZSB0aGUKIAkJICogcGFnZSBuci4gaW4gdGQtPnBhZ2VzLgogCQkgKi8KQEAgLTc0MSw4ICs2OTcsMTAgQEAKIAkJCWdvdG8gd3JpdGU7CiAJCX0KIAotCQkvKiBBdXRvbWF0aWMgcGxhY2VtZW50IG9mIHRoZSBiYWQgYmxvY2sgdGFibGUgKi8KLQkJLyogU2VhcmNoIGRpcmVjdGlvbiB0b3AgLT4gZG93biA/ICovCisJCS8qCisJCSAqIEF1dG9tYXRpYyBwbGFjZW1lbnQgb2YgdGhlIGJhZCBibG9jayB0YWJsZS4gU2VhcmNoIGRpcmVjdGlvbgorCQkgKiB0b3AgLT4gZG93bj8KKwkJICovCiAJCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX0xBU1RCTE9DSykgewogCQkJc3RhcnRibG9jayA9IG51bWJsb2NrcyAqIChjaGlwICsgMSkgLSAxOwogCQkJZGlyID0gLTE7CkBAIC03NjYsNyArNzI0LDcgQEAKIAkJCWlmICghbWQgfHwgbWQtPnBhZ2VzW2NoaXBdICE9IHBhZ2UpCiAJCQkJZ290byB3cml0ZTsKIAkJfQotCQlwcmludGsoS0VSTl9FUlIgIk5vIHNwYWNlIGxlZnQgdG8gd3JpdGUgYmFkIGJsb2NrIHRhYmxlXG4iKTsKKwkJcHJfZXJyKCJObyBzcGFjZSBsZWZ0IHRvIHdyaXRlIGJhZCBibG9jayB0YWJsZVxuIik7CiAJCXJldHVybiAtRU5PU1BDOwogCXdyaXRlOgogCkBAIC03OTEsMjQgKzc0OSwyMiBAQAogCiAJCWJidG9mZnMgPSBjaGlwICogKG51bWJsb2NrcyA+PiAyKTsKIAotCQl0byA9ICgobG9mZl90KSBwYWdlKSA8PCB0aGlzLT5wYWdlX3NoaWZ0OworCQl0byA9ICgobG9mZl90KXBhZ2UpIDw8IHRoaXMtPnBhZ2Vfc2hpZnQ7CiAKLQkJLyogTXVzdCB3ZSBzYXZlIHRoZSBibG9jayBjb250ZW50cyA/ICovCisJCS8qIE11c3Qgd2Ugc2F2ZSB0aGUgYmxvY2sgY29udGVudHM/ICovCiAJCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NBVkVDT05URU5UKSB7CiAJCQkvKiBNYWtlIGl0IGJsb2NrIGFsaWduZWQgKi8KLQkJCXRvICY9IH4oKGxvZmZfdCkgKCgxIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdCkgLSAxKSk7CisJCQl0byAmPSB+KChsb2ZmX3QpKCgxIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdCkgLSAxKSk7CiAJCQlsZW4gPSAxIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdDsKIAkJCXJlcyA9IG10ZC0+cmVhZChtdGQsIHRvLCBsZW4sICZyZXRsZW4sIGJ1Zik7CiAJCQlpZiAocmVzIDwgMCkgewogCQkJCWlmIChyZXRsZW4gIT0gbGVuKSB7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gIm5hbmRfYmJ0OiBFcnJvciAiCi0JCQkJCSAgICAgICAicmVhZGluZyBibG9jayBmb3Igd3JpdGluZyAiCi0JCQkJCSAgICAgICAidGhlIGJhZCBibG9jayB0YWJsZVxuIik7CisJCQkJCXByX2luZm8oIm5hbmRfYmJ0OiBlcnJvciByZWFkaW5nIGJsb2NrICIKKwkJCQkJCSJmb3Igd3JpdGluZyB0aGUgYmFkIGJsb2NrIHRhYmxlXG4iKTsKIAkJCQkJcmV0dXJuIHJlczsKIAkJCQl9Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibmFuZF9iYnQ6IEVDQyBlcnJvciAiCi0JCQkJICAgICAgICJ3aGlsZSByZWFkaW5nIGJsb2NrIGZvciB3cml0aW5nICIKLQkJCQkgICAgICAgImJhZCBibG9jayB0YWJsZVxuIik7CisJCQkJcHJfd2FybigibmFuZF9iYnQ6IEVDQyBlcnJvciB3aGlsZSByZWFkaW5nICIKKwkJCQkJImJsb2NrIGZvciB3cml0aW5nIGJhZCBibG9jayB0YWJsZVxuIik7CiAJCQl9CiAJCQkvKiBSZWFkIG9vYiBkYXRhICovCiAJCQlvcHMub29ibGVuID0gKGxlbiA+PiB0aGlzLT5wYWdlX3NoaWZ0KSAqIG10ZC0+b29ic2l6ZTsKQEAgLTgyMSwxOSArNzc3LDE5IEBACiAJCQlwYWdlb2ZmcyA9IHBhZ2UgLSAoaW50KSh0byA+PiB0aGlzLT5wYWdlX3NoaWZ0KTsKIAkJCW9mZnMgPSBwYWdlb2ZmcyA8PCB0aGlzLT5wYWdlX3NoaWZ0OwogCQkJLyogUHJlc2V0IHRoZSBiYnQgYXJlYSB3aXRoIDB4ZmYgKi8KLQkJCW1lbXNldCgmYnVmW29mZnNdLCAweGZmLCAoc2l6ZV90KSAobnVtYmxvY2tzID4+IHNmdCkpOworCQkJbWVtc2V0KCZidWZbb2Zmc10sIDB4ZmYsIChzaXplX3QpKG51bWJsb2NrcyA+PiBzZnQpKTsKIAkJCW9vYm9mZnMgPSBsZW4gKyAocGFnZW9mZnMgKiBtdGQtPm9vYnNpemUpOwogCiAJCX0gZWxzZSBpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9OT19PT0IpIHsKIAkJCW9vYm9mZnMgPSAwOwogCQkJb2ZmcyA9IHRkLT5sZW47Ci0JCQkvKiB0aGUgdmVyc2lvbiBieXRlICovCisJCQkvKiBUaGUgdmVyc2lvbiBieXRlICovCiAJCQlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9WRVJTSU9OKQogCQkJCW9mZnMrKzsKIAkJCS8qIENhbGMgbGVuZ3RoICovCi0JCQlsZW4gPSAoc2l6ZV90KSAobnVtYmxvY2tzID4+IHNmdCk7CisJCQlsZW4gPSAoc2l6ZV90KShudW1ibG9ja3MgPj4gc2Z0KTsKIAkJCWxlbiArPSBvZmZzOwotCQkJLyogTWFrZSBpdCBwYWdlIGFsaWduZWQgISAqLworCQkJLyogTWFrZSBpdCBwYWdlIGFsaWduZWQhICovCiAJCQlsZW4gPSBBTElHTihsZW4sIG10ZC0+d3JpdGVzaXplKTsKIAkJCS8qIFByZXNldCB0aGUgYnVmZmVyIHdpdGggMHhmZiAqLwogCQkJbWVtc2V0KGJ1ZiwgMHhmZiwgbGVuKTsKQEAgLTg0MSw4ICs3OTcsOCBAQAogCQkJbWVtY3B5KGJ1ZiwgdGQtPnBhdHRlcm4sIHRkLT5sZW4pOwogCQl9IGVsc2UgewogCQkJLyogQ2FsYyBsZW5ndGggKi8KLQkJCWxlbiA9IChzaXplX3QpIChudW1ibG9ja3MgPj4gc2Z0KTsKLQkJCS8qIE1ha2UgaXQgcGFnZSBhbGlnbmVkICEgKi8KKwkJCWxlbiA9IChzaXplX3QpKG51bWJsb2NrcyA+PiBzZnQpOworCQkJLyogTWFrZSBpdCBwYWdlIGFsaWduZWQhICovCiAJCQlsZW4gPSBBTElHTihsZW4sIG10ZC0+d3JpdGVzaXplKTsKIAkJCS8qIFByZXNldCB0aGUgYnVmZmVyIHdpdGggMHhmZiAqLwogCQkJbWVtc2V0KGJ1ZiwgMHhmZiwgbGVuICsKQEAgLTg1NiwxMyArODEyLDEzIEBACiAJCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1ZFUlNJT04pCiAJCQlidWZbb29ib2ZmcyArIHRkLT52ZXJvZmZzXSA9IHRkLT52ZXJzaW9uW2NoaXBdOwogCi0JCS8qIHdhbGsgdGhyb3VnaCB0aGUgbWVtb3J5IHRhYmxlICovCisJCS8qIFdhbGsgdGhyb3VnaCB0aGUgbWVtb3J5IHRhYmxlICovCiAJCWZvciAoaSA9IDA7IGkgPCBudW1ibG9ja3M7KSB7CiAJCQl1aW50OF90IGRhdDsKIAkJCWRhdCA9IHRoaXMtPmJidFtiYnRvZmZzICsgKGkgPj4gMildOwogCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKywgaSsrKSB7CiAJCQkJaW50IHNmdGNudCA9IChpIDw8ICgzIC0gc2Z0KSkgJiBzZnRtc2s7Ci0JCQkJLyogRG8gbm90IHN0b3JlIHRoZSByZXNlcnZlZCBiYnQgYmxvY2tzICEgKi8KKwkJCQkvKiBEbyBub3Qgc3RvcmUgdGhlIHJlc2VydmVkIGJidCBibG9ja3MhICovCiAJCQkJYnVmW29mZnMgKyAoaSA+PiBzZnQpXSAmPQogCQkJCQl+KG1za1tkYXQgJiAweDAzXSA8PCBzZnRjbnQpOwogCQkJCWRhdCA+Pj0gMjsKQEAgLTg4Myw4ICs4MzksOCBAQAogCQlpZiAocmVzIDwgMCkKIAkJCWdvdG8gb3V0ZXJyOwogCi0JCXByaW50ayhLRVJOX0RFQlVHICJCYWQgYmxvY2sgdGFibGUgd3JpdHRlbiB0byAweCUwMTJsbHgsIHZlcnNpb24gIgotCQkgICAgICAgIjB4JTAyWFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0bywgdGQtPnZlcnNpb25bY2hpcF0pOworCQlwcl9pbmZvKCJCYWQgYmxvY2sgdGFibGUgd3JpdHRlbiB0byAweCUwMTJsbHgsIHZlcnNpb24gMHglMDJYXG4iLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpdG8sIHRkLT52ZXJzaW9uW2NoaXBdKTsKIAogCQkvKiBNYXJrIGl0IGFzIHVzZWQgKi8KIAkJdGQtPnBhZ2VzW2NoaXBdID0gcGFnZTsKQEAgLTg5MiwxOSArODQ4LDE4IEBACiAJcmV0dXJuIDA7CiAKICBvdXRlcnI6Ci0JcHJpbnRrKEtFUk5fV0FSTklORwotCSAgICAgICAibmFuZF9iYnQ6IEVycm9yIHdoaWxlIHdyaXRpbmcgYmFkIGJsb2NrIHRhYmxlICVkXG4iLCByZXMpOworCXByX3dhcm4oIm5hbmRfYmJ0OiBlcnJvciB3aGlsZSB3cml0aW5nIGJhZCBibG9jayB0YWJsZSAlZFxuIiwgcmVzKTsKIAlyZXR1cm4gcmVzOwogfQogCiAvKioKICAqIG5hbmRfbWVtb3J5X2JidCAtIFtHRU5FUklDXSBjcmVhdGUgYSBtZW1vcnkgYmFzZWQgYmFkIGJsb2NrIHRhYmxlCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGdvb2QvYmFkIGJsb2NrIHNlYXJjaCBwYXR0ZXJuCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJkOiBkZXNjcmlwdG9yIGZvciB0aGUgZ29vZC9iYWQgYmxvY2sgc2VhcmNoIHBhdHRlcm4KICAqCi0gKiBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhIG1lbW9yeSBiYXNlZCBiYnQgYnkgc2Nhbm5pbmcgdGhlIGRldmljZQotICogZm9yIG1hbnVmYWN0dXJlciAvIHNvZnR3YXJlIG1hcmtlZCBnb29kIC8gYmFkIGJsb2NrcwotKi8KKyAqIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGEgbWVtb3J5IGJhc2VkIGJidCBieSBzY2FubmluZyB0aGUgZGV2aWNlIGZvcgorICogbWFudWZhY3R1cmVyIC8gc29mdHdhcmUgbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzLgorICovCiBzdGF0aWMgaW5saW5lIGludCBuYW5kX21lbW9yeV9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKQEAgLTkxNSwyNSArODcwLDI0IEBACiAKIC8qKgogICogY2hlY2tfY3JlYXRlIC0gW0dFTkVSSUNdIGNyZWF0ZSBhbmQgd3JpdGUgYmJ0KHMpIGlmIG5lY2Vzc2FyeQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKLSAqIEBiZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBnb29kL2JhZCBibG9jayBzZWFyY2ggcGF0dGVybgorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IHRlbXBvcmFyeSBidWZmZXIKKyAqIEBiZDogZGVzY3JpcHRvciBmb3IgdGhlIGdvb2QvYmFkIGJsb2NrIHNlYXJjaCBwYXR0ZXJuCiAgKgotICogVGhlIGZ1bmN0aW9uIGNoZWNrcyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgY2FsbCB0byByZWFkX2JidAotICogYW5kIGNyZWF0ZXMgLyB1cGRhdGVzIHRoZSBiYnQocykgaWYgbmVjZXNzYXJ5Ci0gKiBDcmVhdGlvbiBpcyBuZWNlc3NhcnkgaWYgbm8gYmJ0IHdhcyBmb3VuZCBmb3IgdGhlIGNoaXAvZGV2aWNlCi0gKiBVcGRhdGUgaXMgbmVjZXNzYXJ5IGlmIG9uZSBvZiB0aGUgdGFibGVzIGlzIG1pc3Npbmcgb3IgdGhlCi0gKiB2ZXJzaW9uIG5yLiBvZiBvbmUgdGFibGUgaXMgbGVzcyB0aGFuIHRoZSBvdGhlcgotKi8KKyAqIFRoZSBmdW5jdGlvbiBjaGVja3MgdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIGNhbGwgdG8gcmVhZF9iYnQgYW5kIGNyZWF0ZXMKKyAqIC8gdXBkYXRlcyB0aGUgYmJ0KHMpIGlmIG5lY2Vzc2FyeS4gQ3JlYXRpb24gaXMgbmVjZXNzYXJ5IGlmIG5vIGJidCB3YXMgZm91bmQKKyAqIGZvciB0aGUgY2hpcC9kZXZpY2UuIFVwZGF0ZSBpcyBuZWNlc3NhcnkgaWYgb25lIG9mIHRoZSB0YWJsZXMgaXMgbWlzc2luZyBvcgorICogdGhlIHZlcnNpb24gbnIuIG9mIG9uZSB0YWJsZSBpcyBsZXNzIHRoYW4gdGhlIG90aGVyLgorICovCiBzdGF0aWMgaW50IGNoZWNrX2NyZWF0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkKQogewotCWludCBpLCBjaGlwcywgd3JpdGVvcHMsIGNoaXBzZWwsIHJlczsKKwlpbnQgaSwgY2hpcHMsIHdyaXRlb3BzLCBjcmVhdGUsIGNoaXBzZWwsIHJlcywgcmVzMjsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQgPSB0aGlzLT5iYnRfdGQ7CiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICptZCA9IHRoaXMtPmJidF9tZDsKIAlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnJkLCAqcmQyOwogCi0JLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcCA/ICovCisJLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcD8gKi8KIAlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9QRVJDSElQKQogCQljaGlwcyA9IHRoaXMtPm51bWNoaXBzOwogCWVsc2UKQEAgLTk0MSw4NiArODk1LDk4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hpcHM7IGkrKykgewogCQl3cml0ZW9wcyA9IDA7CisJCWNyZWF0ZSA9IDA7CiAJCXJkID0gTlVMTDsKIAkJcmQyID0gTlVMTDsKLQkJLyogUGVyIGNoaXAgb3IgcGVyIGRldmljZSA/ICovCisJCXJlcyA9IHJlczIgPSAwOworCQkvKiBQZXIgY2hpcCBvciBwZXIgZGV2aWNlPyAqLwogCQljaGlwc2VsID0gKHRkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkgPyBpIDogLTE7Ci0JCS8qIE1pcnJvcmVkIHRhYmxlIGF2YWlsYWJsZSA/ICovCisJCS8qIE1pcnJvcmVkIHRhYmxlIGF2YWlsYWJsZT8gKi8KIAkJaWYgKG1kKSB7CiAJCQlpZiAodGQtPnBhZ2VzW2ldID09IC0xICYmIG1kLT5wYWdlc1tpXSA9PSAtMSkgeworCQkJCWNyZWF0ZSA9IDE7CiAJCQkJd3JpdGVvcHMgPSAweDAzOwotCQkJCWdvdG8gY3JlYXRlOwotCQkJfQotCi0JCQlpZiAodGQtPnBhZ2VzW2ldID09IC0xKSB7CisJCQl9IGVsc2UgaWYgKHRkLT5wYWdlc1tpXSA9PSAtMSkgewogCQkJCXJkID0gbWQ7Ci0JCQkJdGQtPnZlcnNpb25baV0gPSBtZC0+dmVyc2lvbltpXTsKLQkJCQl3cml0ZW9wcyA9IDE7Ci0JCQkJZ290byB3cml0ZWNoZWNrOwotCQkJfQotCi0JCQlpZiAobWQtPnBhZ2VzW2ldID09IC0xKSB7CisJCQkJd3JpdGVvcHMgPSAweDAxOworCQkJfSBlbHNlIGlmIChtZC0+cGFnZXNbaV0gPT0gLTEpIHsKIAkJCQlyZCA9IHRkOwotCQkJCW1kLT52ZXJzaW9uW2ldID0gdGQtPnZlcnNpb25baV07Ci0JCQkJd3JpdGVvcHMgPSAyOwotCQkJCWdvdG8gd3JpdGVjaGVjazsKLQkJCX0KLQotCQkJaWYgKHRkLT52ZXJzaW9uW2ldID09IG1kLT52ZXJzaW9uW2ldKSB7CisJCQkJd3JpdGVvcHMgPSAweDAyOworCQkJfSBlbHNlIGlmICh0ZC0+dmVyc2lvbltpXSA9PSBtZC0+dmVyc2lvbltpXSkgewogCQkJCXJkID0gdGQ7CiAJCQkJaWYgKCEodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9WRVJTSU9OKSkKIAkJCQkJcmQyID0gbWQ7Ci0JCQkJZ290byB3cml0ZWNoZWNrOwotCQkJfQotCi0JCQlpZiAoKChpbnQ4X3QpICh0ZC0+dmVyc2lvbltpXSAtIG1kLT52ZXJzaW9uW2ldKSkgPiAwKSB7CisJCQl9IGVsc2UgaWYgKCgoaW50OF90KSh0ZC0+dmVyc2lvbltpXSAtIG1kLT52ZXJzaW9uW2ldKSkgPiAwKSB7CiAJCQkJcmQgPSB0ZDsKLQkJCQltZC0+dmVyc2lvbltpXSA9IHRkLT52ZXJzaW9uW2ldOwotCQkJCXdyaXRlb3BzID0gMjsKKwkJCQl3cml0ZW9wcyA9IDB4MDI7CiAJCQl9IGVsc2UgewogCQkJCXJkID0gbWQ7Ci0JCQkJdGQtPnZlcnNpb25baV0gPSBtZC0+dmVyc2lvbltpXTsKLQkJCQl3cml0ZW9wcyA9IDE7CisJCQkJd3JpdGVvcHMgPSAweDAxOwogCQkJfQotCi0JCQlnb3RvIHdyaXRlY2hlY2s7Ci0KIAkJfSBlbHNlIHsKIAkJCWlmICh0ZC0+cGFnZXNbaV0gPT0gLTEpIHsKKwkJCQljcmVhdGUgPSAxOwogCQkJCXdyaXRlb3BzID0gMHgwMTsKLQkJCQlnb3RvIGNyZWF0ZTsKKwkJCX0gZWxzZSB7CisJCQkJcmQgPSB0ZDsKIAkJCX0KLQkJCXJkID0gdGQ7Ci0JCQlnb3RvIHdyaXRlY2hlY2s7CiAJCX0KLQljcmVhdGU6Ci0JCS8qIENyZWF0ZSB0aGUgYmFkIGJsb2NrIHRhYmxlIGJ5IHNjYW5uaW5nIHRoZSBkZXZpY2UgPyAqLwotCQlpZiAoISh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX0NSRUFURSkpCi0JCQljb250aW51ZTsKIAotCQkvKiBDcmVhdGUgdGhlIHRhYmxlIGluIG1lbW9yeSBieSBzY2FubmluZyB0aGUgY2hpcChzKSAqLwotCQlpZiAoISh0aGlzLT5vcHRpb25zICYgTkFORF9DUkVBVEVfRU1QVFlfQkJUKSkKLQkJCWNyZWF0ZV9iYnQobXRkLCBidWYsIGJkLCBjaGlwc2VsKTsKKwkJaWYgKGNyZWF0ZSkgeworCQkJLyogQ3JlYXRlIHRoZSBiYWQgYmxvY2sgdGFibGUgYnkgc2Nhbm5pbmcgdGhlIGRldmljZT8gKi8KKwkJCWlmICghKHRkLT5vcHRpb25zICYgTkFORF9CQlRfQ1JFQVRFKSkKKwkJCQljb250aW51ZTsKIAotCQl0ZC0+dmVyc2lvbltpXSA9IDE7Ci0JCWlmIChtZCkKLQkJCW1kLT52ZXJzaW9uW2ldID0gMTsKLQl3cml0ZWNoZWNrOgotCQkvKiByZWFkIGJhY2sgZmlyc3QgPyAqLwotCQlpZiAocmQpCi0JCQlyZWFkX2Fic19iYnQobXRkLCBidWYsIHJkLCBjaGlwc2VsKTsKLQkJLyogSWYgdGhleSB3ZXJlbid0IHZlcnNpb25lZCwgcmVhZCBib3RoLiAqLwotCQlpZiAocmQyKQotCQkJcmVhZF9hYnNfYmJ0KG10ZCwgYnVmLCByZDIsIGNoaXBzZWwpOworCQkJLyogQ3JlYXRlIHRoZSB0YWJsZSBpbiBtZW1vcnkgYnkgc2Nhbm5pbmcgdGhlIGNoaXAocykgKi8KKwkJCWlmICghKHRoaXMtPmJidF9vcHRpb25zICYgTkFORF9CQlRfQ1JFQVRFX0VNUFRZKSkKKwkJCQljcmVhdGVfYmJ0KG10ZCwgYnVmLCBiZCwgY2hpcHNlbCk7CiAKLQkJLyogV3JpdGUgdGhlIGJhZCBibG9jayB0YWJsZSB0byB0aGUgZGV2aWNlID8gKi8KKwkJCXRkLT52ZXJzaW9uW2ldID0gMTsKKwkJCWlmIChtZCkKKwkJCQltZC0+dmVyc2lvbltpXSA9IDE7CisJCX0KKworCQkvKiBSZWFkIGJhY2sgZmlyc3Q/ICovCisJCWlmIChyZCkgeworCQkJcmVzID0gcmVhZF9hYnNfYmJ0KG10ZCwgYnVmLCByZCwgY2hpcHNlbCk7CisJCQlpZiAobXRkX2lzX2VjY2VycihyZXMpKSB7CisJCQkJLyogTWFyayB0YWJsZSBhcyBpbnZhbGlkICovCisJCQkJcmQtPnBhZ2VzW2ldID0gLTE7CisJCQkJcmQtPnZlcnNpb25baV0gPSAwOworCQkJCWktLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQkvKiBJZiB0aGV5IHdlcmVuJ3QgdmVyc2lvbmVkLCByZWFkIGJvdGggKi8KKwkJaWYgKHJkMikgeworCQkJcmVzMiA9IHJlYWRfYWJzX2JidChtdGQsIGJ1ZiwgcmQyLCBjaGlwc2VsKTsKKwkJCWlmIChtdGRfaXNfZWNjZXJyKHJlczIpKSB7CisJCQkJLyogTWFyayB0YWJsZSBhcyBpbnZhbGlkICovCisJCQkJcmQyLT5wYWdlc1tpXSA9IC0xOworCQkJCXJkMi0+dmVyc2lvbltpXSA9IDA7CisJCQkJaS0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogU2NydWIgdGhlIGZsYXNoIHRhYmxlKHMpPyAqLworCQlpZiAobXRkX2lzX2JpdGZsaXAocmVzKSB8fCBtdGRfaXNfYml0ZmxpcChyZXMyKSkKKwkJCXdyaXRlb3BzID0gMHgwMzsKKworCQkvKiBVcGRhdGUgdmVyc2lvbiBudW1iZXJzIGJlZm9yZSB3cml0aW5nICovCisJCWlmIChtZCkgeworCQkJdGQtPnZlcnNpb25baV0gPSBtYXgodGQtPnZlcnNpb25baV0sIG1kLT52ZXJzaW9uW2ldKTsKKwkJCW1kLT52ZXJzaW9uW2ldID0gdGQtPnZlcnNpb25baV07CisJCX0KKworCQkvKiBXcml0ZSB0aGUgYmFkIGJsb2NrIHRhYmxlIHRvIHRoZSBkZXZpY2U/ICovCiAJCWlmICgod3JpdGVvcHMgJiAweDAxKSAmJiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9XUklURSkpIHsKIAkJCXJlcyA9IHdyaXRlX2JidChtdGQsIGJ1ZiwgdGQsIG1kLCBjaGlwc2VsKTsKIAkJCWlmIChyZXMgPCAwKQogCQkJCXJldHVybiByZXM7CiAJCX0KIAotCQkvKiBXcml0ZSB0aGUgbWlycm9yIGJhZCBibG9jayB0YWJsZSB0byB0aGUgZGV2aWNlID8gKi8KKwkJLyogV3JpdGUgdGhlIG1pcnJvciBiYWQgYmxvY2sgdGFibGUgdG8gdGhlIGRldmljZT8gKi8KIAkJaWYgKCh3cml0ZW9wcyAmIDB4MDIpICYmIG1kICYmIChtZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1dSSVRFKSkgewogCQkJcmVzID0gd3JpdGVfYmJ0KG10ZCwgYnVmLCBtZCwgdGQsIGNoaXBzZWwpOwogCQkJaWYgKHJlcyA8IDApCkBAIC0xMDMyLDIwICs5OTgsMTkgQEAKIAogLyoqCiAgKiBtYXJrX2JidF9yZWdpb25zIC0gW0dFTkVSSUNdIG1hcmsgdGhlIGJhZCBibG9jayB0YWJsZSByZWdpb25zCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQHRkOgkJYmFkIGJsb2NrIHRhYmxlIGRlc2NyaXB0b3IKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdGQ6IGJhZCBibG9jayB0YWJsZSBkZXNjcmlwdG9yCiAgKgotICogVGhlIGJhZCBibG9jayB0YWJsZSByZWdpb25zIGFyZSBtYXJrZWQgYXMgImJhZCIgdG8gcHJldmVudAotICogYWNjaWRlbnRhbCBlcmFzdXJlcyAvIHdyaXRlcy4gVGhlIHJlZ2lvbnMgYXJlIGlkZW50aWZpZWQgYnkKLSAqIHRoZSBtYXJrIDB4MDIuCi0qLworICogVGhlIGJhZCBibG9jayB0YWJsZSByZWdpb25zIGFyZSBtYXJrZWQgYXMgImJhZCIgdG8gcHJldmVudCBhY2NpZGVudGFsCisgKiBlcmFzdXJlcyAvIHdyaXRlcy4gVGhlIHJlZ2lvbnMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIG1hcmsgMHgwMi4KKyAqLwogc3RhdGljIHZvaWQgbWFya19iYnRfcmVnaW9uKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CiAJaW50IGksIGosIGNoaXBzLCBibG9jaywgbnJibG9ja3MsIHVwZGF0ZTsKIAl1aW50OF90IG9sZHZhbCwgbmV3dmFsOwogCi0JLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcCA/ICovCisJLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcD8gKi8KIAlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9QRVJDSElQKSB7CiAJCWNoaXBzID0gdGhpcy0+bnVtY2hpcHM7CiAJCW5yYmxvY2tzID0gKGludCkodGhpcy0+Y2hpcHNpemUgPj4gdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KTsKQEAgLTEwODIsOSArMTA0NywxMSBAQAogCQkJCXVwZGF0ZSA9IDE7CiAJCQlibG9jayArPSAyOwogCQl9Ci0JCS8qIElmIHdlIHdhbnQgcmVzZXJ2ZWQgYmxvY2tzIHRvIGJlIHJlY29yZGVkIHRvIGZsYXNoLCBhbmQgc29tZQotCQkgICBuZXcgb25lcyBoYXZlIGJlZW4gbWFya2VkLCB0aGVuIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzdG9yZWQKLQkJICAgYmJ0cy4gIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uY2UuICovCisJCS8qCisJCSAqIElmIHdlIHdhbnQgcmVzZXJ2ZWQgYmxvY2tzIHRvIGJlIHJlY29yZGVkIHRvIGZsYXNoLCBhbmQgc29tZQorCQkgKiBuZXcgb25lcyBoYXZlIGJlZW4gbWFya2VkLCB0aGVuIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzdG9yZWQKKwkJICogYmJ0cy4gIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uY2UuCisJCSAqLwogCQlpZiAodXBkYXRlICYmIHRkLT5yZXNlcnZlZF9ibG9ja19jb2RlKQogCQkJbmFuZF91cGRhdGVfYmJ0KG10ZCwgKGxvZmZfdCkoYmxvY2sgLSAyKSA8PCAodGhpcy0+YmJ0X2VyYXNlX3NoaWZ0IC0gMSkpOwogCX0KQEAgLTEwOTIsOCArMTA1OSw4IEBACiAKIC8qKgogICogdmVyaWZ5X2JidF9kZXNjciAtIHZlcmlmeSB0aGUgYmFkIGJsb2NrIGRlc2NyaXB0aW9uCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJkOgkJdGhlIHRhYmxlIHRvIHZlcmlmeQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBiZDogdGhlIHRhYmxlIHRvIHZlcmlmeQogICoKICAqIFRoaXMgZnVuY3Rpb25zIHBlcmZvcm1zIGEgZmV3IHNhbml0eSBjaGVja3Mgb24gdGhlIGJhZCBibG9jayBkZXNjcmlwdGlvbgogICogdGFibGUuCkBAIC0xMTExLDE2ICsxMDc4LDE2IEBACiAJcGF0dGVybl9sZW4gPSBiZC0+bGVuOwogCWJpdHMgPSBiZC0+b3B0aW9ucyAmIE5BTkRfQkJUX05SQklUU19NU0s7CiAKLQlCVUdfT04oKHRoaXMtPm9wdGlvbnMgJiBOQU5EX1VTRV9GTEFTSF9CQlRfTk9fT09CKSAmJgotCQkJISh0aGlzLT5vcHRpb25zICYgTkFORF9VU0VfRkxBU0hfQkJUKSk7CisJQlVHX09OKCh0aGlzLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX05PX09PQikgJiYKKwkJCSEodGhpcy0+YmJ0X29wdGlvbnMgJiBOQU5EX0JCVF9VU0VfRkxBU0gpKTsKIAlCVUdfT04oIWJpdHMpOwogCiAJaWYgKGJkLT5vcHRpb25zICYgTkFORF9CQlRfVkVSU0lPTikKIAkJcGF0dGVybl9sZW4rKzsKIAogCWlmIChiZC0+b3B0aW9ucyAmIE5BTkRfQkJUX05PX09PQikgewotCQlCVUdfT04oISh0aGlzLT5vcHRpb25zICYgTkFORF9VU0VfRkxBU0hfQkJUKSk7Ci0JCUJVR19PTighKHRoaXMtPm9wdGlvbnMgJiBOQU5EX1VTRV9GTEFTSF9CQlRfTk9fT09CKSk7CisJCUJVR19PTighKHRoaXMtPmJidF9vcHRpb25zICYgTkFORF9CQlRfVVNFX0ZMQVNIKSk7CisJCUJVR19PTighKHRoaXMtPmJidF9vcHRpb25zICYgTkFORF9CQlRfTk9fT09CKSk7CiAJCUJVR19PTihiZC0+b2Zmcyk7CiAJCWlmIChiZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1ZFUlNJT04pCiAJCQlCVUdfT04oYmQtPnZlcm9mZnMgIT0gYmQtPmxlbik7CkBAIC0xMTQwLDE4ICsxMTA3LDE2IEBACiAKIC8qKgogICogbmFuZF9zY2FuX2JidCAtIFtOQU5EIEludGVyZmFjZV0gc2NhbiwgZmluZCwgcmVhZCBhbmQgbWF5YmUgY3JlYXRlIGJhZCBibG9jayB0YWJsZShzKQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBiZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBnb29kL2JhZCBibG9jayBzZWFyY2ggcGF0dGVybgorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBiZDogZGVzY3JpcHRvciBmb3IgdGhlIGdvb2QvYmFkIGJsb2NrIHNlYXJjaCBwYXR0ZXJuCiAgKgotICogVGhlIGZ1bmN0aW9uIGNoZWNrcywgaWYgYSBiYWQgYmxvY2sgdGFibGUocykgaXMvYXJlIGFscmVhZHkKLSAqIGF2YWlsYWJsZS4gSWYgbm90IGl0IHNjYW5zIHRoZSBkZXZpY2UgZm9yIG1hbnVmYWN0dXJlcgotICogbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzIGFuZCB3cml0ZXMgdGhlIGJhZCBibG9jayB0YWJsZShzKSB0bwotICogdGhlIHNlbGVjdGVkIHBsYWNlLgorICogVGhlIGZ1bmN0aW9uIGNoZWNrcywgaWYgYSBiYWQgYmxvY2sgdGFibGUocykgaXMvYXJlIGFscmVhZHkgYXZhaWxhYmxlLiBJZgorICogbm90IGl0IHNjYW5zIHRoZSBkZXZpY2UgZm9yIG1hbnVmYWN0dXJlciBtYXJrZWQgZ29vZCAvIGJhZCBibG9ja3MgYW5kIHdyaXRlcworICogdGhlIGJhZCBibG9jayB0YWJsZShzKSB0byB0aGUgc2VsZWN0ZWQgcGxhY2UuCiAgKgotICogVGhlIGJhZCBibG9jayB0YWJsZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGhlcmUuIEl0IG11c3QgYmUgZnJlZWQKLSAqIGJ5IGNhbGxpbmcgdGhlIG5hbmRfZnJlZV9iYnQgZnVuY3Rpb24uCi0gKgotKi8KKyAqIFRoZSBiYWQgYmxvY2sgdGFibGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBoZXJlLiBJdCBtdXN0IGJlIGZyZWVkIGJ5IGNhbGxpbmcKKyAqIHRoZSBuYW5kX2ZyZWVfYmJ0IGZ1bmN0aW9uLgorICovCiBpbnQgbmFuZF9zY2FuX2JidChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwpAQCAtMTE2MSwxOSArMTEyNiwyMSBAQAogCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqbWQgPSB0aGlzLT5iYnRfbWQ7CiAKIAlsZW4gPSBtdGQtPnNpemUgPj4gKHRoaXMtPmJidF9lcmFzZV9zaGlmdCArIDIpOwotCS8qIEFsbG9jYXRlIG1lbW9yeSAoMmJpdCBwZXIgYmxvY2spIGFuZCBjbGVhciB0aGUgbWVtb3J5IGJhZCBibG9jayB0YWJsZSAqLworCS8qCisJICogQWxsb2NhdGUgbWVtb3J5ICgyYml0IHBlciBibG9jaykgYW5kIGNsZWFyIHRoZSBtZW1vcnkgYmFkIGJsb2NrCisJICogdGFibGUuCisJICovCiAJdGhpcy0+YmJ0ID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmICghdGhpcy0+YmJ0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibmFuZF9zY2FuX2JidDogT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCF0aGlzLT5iYnQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAotCS8qIElmIG5vIHByaW1hcnkgdGFibGUgZGVjcmlwdG9yIGlzIGdpdmVuLCBzY2FuIHRoZSBkZXZpY2UKLQkgKiB0byBidWlsZCBhIG1lbW9yeSBiYXNlZCBiYWQgYmxvY2sgdGFibGUKKwkvKgorCSAqIElmIG5vIHByaW1hcnkgdGFibGUgZGVjcmlwdG9yIGlzIGdpdmVuLCBzY2FuIHRoZSBkZXZpY2UgdG8gYnVpbGQgYQorCSAqIG1lbW9yeSBiYXNlZCBiYWQgYmxvY2sgdGFibGUuCiAJICovCiAJaWYgKCF0ZCkgewogCQlpZiAoKHJlcyA9IG5hbmRfbWVtb3J5X2JidChtdGQsIGJkKSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibmFuZF9iYnQ6IENhbid0IHNjYW4gZmxhc2ggYW5kIGJ1aWxkIHRoZSBSQU0tYmFzZWQgQkJUXG4iKTsKKwkJCXByX2VycigibmFuZF9iYnQ6IGNhbid0IHNjYW4gZmxhc2ggYW5kIGJ1aWxkIHRoZSBSQU0tYmFzZWQgQkJUXG4iKTsKIAkJCWtmcmVlKHRoaXMtPmJidCk7CiAJCQl0aGlzLT5iYnQgPSBOVUxMOwogCQl9CkBAIC0xMTg3LDEzICsxMTU0LDEyIEBACiAJbGVuICs9IChsZW4gPj4gdGhpcy0+cGFnZV9zaGlmdCkgKiBtdGQtPm9vYnNpemU7CiAJYnVmID0gdm1hbGxvYyhsZW4pOwogCWlmICghYnVmKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibmFuZF9iYnQ6IE91dCBvZiBtZW1vcnlcbiIpOwogCQlrZnJlZSh0aGlzLT5iYnQpOwogCQl0aGlzLT5iYnQgPSBOVUxMOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkvKiBJcyB0aGUgYmJ0IGF0IGEgZ2l2ZW4gcGFnZSA/ICovCisJLyogSXMgdGhlIGJidCBhdCBhIGdpdmVuIHBhZ2U/ICovCiAJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfQUJTUEFHRSkgewogCQlyZXMgPSByZWFkX2Fic19iYnRzKG10ZCwgYnVmLCB0ZCwgbWQpOwogCX0gZWxzZSB7CkBAIC0xMjE1LDE1ICsxMTgxLDE1IEBACiAKIC8qKgogICogbmFuZF91cGRhdGVfYmJ0IC0gW05BTkQgSW50ZXJmYWNlXSB1cGRhdGUgYmFkIGJsb2NrIHRhYmxlKHMpCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQG9mZnM6CXRoZSBvZmZzZXQgb2YgdGhlIG5ld2x5IG1hcmtlZCBibG9jaworICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZmZzOiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXdseSBtYXJrZWQgYmxvY2sKICAqCi0gKiBUaGUgZnVuY3Rpb24gdXBkYXRlcyB0aGUgYmFkIGJsb2NrIHRhYmxlKHMpCi0qLworICogVGhlIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGJhZCBibG9jayB0YWJsZShzKS4KKyAqLwogaW50IG5hbmRfdXBkYXRlX2JidChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mZnMpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQlpbnQgbGVuLCByZXMgPSAwLCB3cml0ZW9wcyA9IDA7CisJaW50IGxlbiwgcmVzID0gMDsKIAlpbnQgY2hpcCwgY2hpcHNlbDsKIAl1aW50OF90ICpidWY7CiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCA9IHRoaXMtPmJidF90ZDsKQEAgLTEyMzYsMTQgKzEyMDIsMTAgQEAKIAlsZW4gPSAoMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOwogCWxlbiArPSAobGVuID4+IHRoaXMtPnBhZ2Vfc2hpZnQpICogbXRkLT5vb2JzaXplOwogCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlwcmludGsoS0VSTl9FUlIgIm5hbmRfdXBkYXRlX2JidDogT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAotCXdyaXRlb3BzID0gbWQgIT0gTlVMTCA/IDB4MDMgOiAweDAxOwotCi0JLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcCA/ICovCisJLyogRG8gd2UgaGF2ZSBhIGJidCBwZXIgY2hpcD8gKi8KIAlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9QRVJDSElQKSB7CiAJCWNoaXAgPSAoaW50KShvZmZzID4+IHRoaXMtPmNoaXBfc2hpZnQpOwogCQljaGlwc2VsID0gY2hpcDsKQEAgLTEyNTYsMTQgKzEyMTgsMTQgQEAKIAlpZiAobWQpCiAJCW1kLT52ZXJzaW9uW2NoaXBdKys7CiAKLQkvKiBXcml0ZSB0aGUgYmFkIGJsb2NrIHRhYmxlIHRvIHRoZSBkZXZpY2UgPyAqLwotCWlmICgod3JpdGVvcHMgJiAweDAxKSAmJiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9XUklURSkpIHsKKwkvKiBXcml0ZSB0aGUgYmFkIGJsb2NrIHRhYmxlIHRvIHRoZSBkZXZpY2U/ICovCisJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfV1JJVEUpIHsKIAkJcmVzID0gd3JpdGVfYmJ0KG10ZCwgYnVmLCB0ZCwgbWQsIGNoaXBzZWwpOwogCQlpZiAocmVzIDwgMCkKIAkJCWdvdG8gb3V0OwogCX0KLQkvKiBXcml0ZSB0aGUgbWlycm9yIGJhZCBibG9jayB0YWJsZSB0byB0aGUgZGV2aWNlID8gKi8KLQlpZiAoKHdyaXRlb3BzICYgMHgwMikgJiYgbWQgJiYgKG1kLT5vcHRpb25zICYgTkFORF9CQlRfV1JJVEUpKSB7CisJLyogV3JpdGUgdGhlIG1pcnJvciBiYWQgYmxvY2sgdGFibGUgdG8gdGhlIGRldmljZT8gKi8KKwlpZiAobWQgJiYgKG1kLT5vcHRpb25zICYgTkFORF9CQlRfV1JJVEUpKSB7CiAJCXJlcyA9IHdyaXRlX2JidChtdGQsIGJ1ZiwgbWQsIHRkLCBjaGlwc2VsKTsKIAl9CiAKQEAgLTEyNzIsOCArMTIzNCwxMCBAQAogCXJldHVybiByZXM7CiB9CiAKLS8qIERlZmluZSBzb21lIGdlbmVyaWMgYmFkIC8gZ29vZCBibG9jayBzY2FuIHBhdHRlcm4gd2hpY2ggYXJlIHVzZWQKLSAqIHdoaWxlIHNjYW5uaW5nIGEgZGV2aWNlIGZvciBmYWN0b3J5IG1hcmtlZCBnb29kIC8gYmFkIGJsb2Nrcy4gKi8KKy8qCisgKiBEZWZpbmUgc29tZSBnZW5lcmljIGJhZCAvIGdvb2QgYmxvY2sgc2NhbiBwYXR0ZXJuIHdoaWNoIGFyZSB1c2VkCisgKiB3aGlsZSBzY2FubmluZyBhIGRldmljZSBmb3IgZmFjdG9yeSBtYXJrZWQgZ29vZCAvIGJhZCBibG9ja3MuCisgKi8KIHN0YXRpYyB1aW50OF90IHNjYW5fZmZfcGF0dGVybltdID0geyAweGZmLCAweGZmIH07CiAKIHN0YXRpYyB1aW50OF90IHNjYW5fYWdhbmRfcGF0dGVybltdID0geyAweDFDLCAweDcxLCAweEM3LCAweDFDLCAweDcxLCAweEM3IH07CkBAIC0xMjg1LDggKzEyNDksNyBAQAogCS5wYXR0ZXJuID0gc2Nhbl9hZ2FuZF9wYXR0ZXJuCiB9OwogCi0vKiBHZW5lcmljIGZsYXNoIGJidCBkZWNyaXB0b3JzCi0qLworLyogR2VuZXJpYyBmbGFzaCBiYnQgZGVzY3JpcHRvcnMgKi8KIHN0YXRpYyB1aW50OF90IGJidF9wYXR0ZXJuW10gPSB7J0InLCAnYicsICd0JywgJzAnIH07CiBzdGF0aWMgdWludDhfdCBtaXJyb3JfcGF0dGVybltdID0geycxJywgJ3QnLCAnYicsICdCJyB9OwogCkBAIC0xMzMwLDMxICsxMjkzLDI3IEBACiAJLnBhdHRlcm4gPSBtaXJyb3JfcGF0dGVybgogfTsKIAotI2RlZmluZSBCQlRfU0NBTl9PUFRJT05TIChOQU5EX0JCVF9TQ0FOTEFTVFBBR0UgfCBOQU5EX0JCVF9TQ0FOMk5EUEFHRSB8IFwKLQkJTkFORF9CQlRfU0NBTkJZVEUxQU5ENikKKyNkZWZpbmUgQkFEQkxPQ0tfU0NBTl9NQVNLICh+TkFORF9CQlRfTk9fT09CKQogLyoqCi0gKiBuYW5kX2NyZWF0ZV9kZWZhdWx0X2JidF9kZXNjciAtIFtJbnRlcm5hbF0gQ3JlYXRlcyBhIEJCVCBkZXNjcmlwdG9yIHN0cnVjdHVyZQotICogQHRoaXM6CU5BTkQgY2hpcCB0byBjcmVhdGUgZGVzY3JpcHRvciBmb3IKKyAqIG5hbmRfY3JlYXRlX2JhZGJsb2NrX3BhdHRlcm4gLSBbSU5URVJOXSBDcmVhdGVzIGEgQkJUIGRlc2NyaXB0b3Igc3RydWN0dXJlCisgKiBAdGhpczogTkFORCBjaGlwIHRvIGNyZWF0ZSBkZXNjcmlwdG9yIGZvcgogICoKICAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIG5hbmRfYmJ0X2Rlc2NyIGZvciBCQk0gZGV0ZWN0aW9uCi0gKiBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiAidGhpcyIuIFRoZSBuZXcgZGVzY3JpcHRvciBpcyBzdG9yZWQgaW4KKyAqIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIG9mIEB0aGlzLiBUaGUgbmV3IGRlc2NyaXB0b3IgaXMgc3RvcmVkIGluCiAgKiB0aGlzLT5iYWRibG9ja19wYXR0ZXJuLiBUaHVzLCB0aGlzLT5iYWRibG9ja19wYXR0ZXJuIHNob3VsZCBiZSBOVUxMIHdoZW4KICAqIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uLgotICoKICAqLwotc3RhdGljIGludCBuYW5kX2NyZWF0ZV9kZWZhdWx0X2JidF9kZXNjcihzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzKQorc3RhdGljIGludCBuYW5kX2NyZWF0ZV9iYWRibG9ja19wYXR0ZXJuKHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMpCiB7CiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZDsKIAlpZiAodGhpcy0+YmFkYmxvY2tfcGF0dGVybikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJCQlQgZGVzY3IgYWxyZWFkeSBhbGxvY2F0ZWQ7IG5vdCByZXBsYWNpbmcuXG4iKTsKKwkJcHJfd2FybigiQmFkIGJsb2NrIHBhdHRlcm4gYWxyZWFkeSBhbGxvY2F0ZWQ7IG5vdCByZXBsYWNpbmdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJYmQgPSBremFsbG9jKHNpemVvZigqYmQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibmFuZF9jcmVhdGVfZGVmYXVsdF9iYnRfZGVzY3I6IE91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYmQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KLQliZC0+b3B0aW9ucyA9IHRoaXMtPm9wdGlvbnMgJiBCQlRfU0NBTl9PUFRJT05TOworCWJkLT5vcHRpb25zID0gdGhpcy0+YmJ0X29wdGlvbnMgJiBCQURCTE9DS19TQ0FOX01BU0s7CiAJYmQtPm9mZnMgPSB0aGlzLT5iYWRibG9ja3BvczsKIAliZC0+bGVuID0gKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSA/IDIgOiAxOwogCWJkLT5wYXR0ZXJuID0gc2Nhbl9mZl9wYXR0ZXJuOwpAQCAtMTM2NSwyMiArMTMyNCwyMCBAQAogCiAvKioKICAqIG5hbmRfZGVmYXVsdF9iYnQgLSBbTkFORCBJbnRlcmZhY2VdIFNlbGVjdCBhIGRlZmF1bHQgYmFkIGJsb2NrIHRhYmxlIGZvciB0aGUgZGV2aWNlCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgdGhlIGRlZmF1bHQgYmFkIGJsb2NrIHRhYmxlCi0gKiBzdXBwb3J0IGZvciB0aGUgZGV2aWNlIGFuZCBjYWxscyB0aGUgbmFuZF9zY2FuX2JidCBmdW5jdGlvbgotICoKLSovCisgKiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgdGhlIGRlZmF1bHQgYmFkIGJsb2NrIHRhYmxlIHN1cHBvcnQgZm9yIHRoZSBkZXZpY2UgYW5kCisgKiBjYWxscyB0aGUgbmFuZF9zY2FuX2JidCBmdW5jdGlvbi4KKyAqLwogaW50IG5hbmRfZGVmYXVsdF9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKIAotCS8qIERlZmF1bHQgZm9yIEFHLUFORC4gV2UgbXVzdCB1c2UgYSBmbGFzaCBiYXNlZAotCSAqIGJhZCBibG9jayB0YWJsZSBhcyB0aGUgZGV2aWNlcyBoYXZlIGZhY3RvcnkgbWFya2VkCi0JICogX2dvb2RfIGJsb2Nrcy4gRXJhc2luZyB0aG9zZSBibG9ja3MgbGVhZHMgdG8gbG9zcwotCSAqIG9mIHRoZSBnb29kIC8gYmFkIGluZm9ybWF0aW9uLCBzbyB3ZSBfbXVzdF8gc3RvcmUKLQkgKiB0aGlzIGluZm9ybWF0aW9uIGluIGEgZ29vZCAvIGJhZCB0YWJsZSBkdXJpbmcKLQkgKiBzdGFydHVwCisJLyoKKwkgKiBEZWZhdWx0IGZvciBBRy1BTkQuIFdlIG11c3QgdXNlIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlIGFzIHRoZQorCSAqIGRldmljZXMgaGF2ZSBmYWN0b3J5IG1hcmtlZCBfZ29vZF8gYmxvY2tzLiBFcmFzaW5nIHRob3NlIGJsb2NrcworCSAqIGxlYWRzIHRvIGxvc3Mgb2YgdGhlIGdvb2QgLyBiYWQgaW5mb3JtYXRpb24sIHNvIHdlIF9tdXN0XyBzdG9yZSB0aGlzCisJICogaW5mb3JtYXRpb24gaW4gYSBnb29kIC8gYmFkIHRhYmxlIGR1cmluZyBzdGFydHVwLgogCSAqLwogCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9JU19BTkQpIHsKIAkJLyogVXNlIHRoZSBkZWZhdWx0IHBhdHRlcm4gZGVzY3JpcHRvcnMgKi8KQEAgLTEzODgsMTUgKzEzNDUsMTUgQEAKIAkJCXRoaXMtPmJidF90ZCA9ICZiYnRfbWFpbl9kZXNjcjsKIAkJCXRoaXMtPmJidF9tZCA9ICZiYnRfbWlycm9yX2Rlc2NyOwogCQl9Ci0JCXRoaXMtPm9wdGlvbnMgfD0gTkFORF9VU0VfRkxBU0hfQkJUOworCQl0aGlzLT5iYnRfb3B0aW9ucyB8PSBOQU5EX0JCVF9VU0VfRkxBU0g7CiAJCXJldHVybiBuYW5kX3NjYW5fYmJ0KG10ZCwgJmFnYW5kX2ZsYXNoYmFzZWQpOwogCX0KIAotCS8qIElzIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlIHJlcXVlc3RlZCA/ICovCi0JaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX1VTRV9GTEFTSF9CQlQpIHsKKwkvKiBJcyBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSByZXF1ZXN0ZWQ/ICovCisJaWYgKHRoaXMtPmJidF9vcHRpb25zICYgTkFORF9CQlRfVVNFX0ZMQVNIKSB7CiAJCS8qIFVzZSB0aGUgZGVmYXVsdCBwYXR0ZXJuIGRlc2NyaXB0b3JzICovCiAJCWlmICghdGhpcy0+YmJ0X3RkKSB7Ci0JCQlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfVVNFX0ZMQVNIX0JCVF9OT19PT0IpIHsKKwkJCWlmICh0aGlzLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX05PX09PQikgewogCQkJCXRoaXMtPmJidF90ZCA9ICZiYnRfbWFpbl9ub19iYnRfZGVzY3I7CiAJCQkJdGhpcy0+YmJ0X21kID0gJmJidF9taXJyb3Jfbm9fYmJ0X2Rlc2NyOwogCQkJfSBlbHNlIHsKQEAgLTE0MTAsMTggKzEzNjcsMTcgQEAKIAl9CiAKIAlpZiAoIXRoaXMtPmJhZGJsb2NrX3BhdHRlcm4pCi0JCW5hbmRfY3JlYXRlX2RlZmF1bHRfYmJ0X2Rlc2NyKHRoaXMpOworCQluYW5kX2NyZWF0ZV9iYWRibG9ja19wYXR0ZXJuKHRoaXMpOwogCiAJcmV0dXJuIG5hbmRfc2Nhbl9iYnQobXRkLCB0aGlzLT5iYWRibG9ja19wYXR0ZXJuKTsKIH0KIAogLyoqCiAgKiBuYW5kX2lzYmFkX2JidCAtIFtOQU5EIEludGVyZmFjZV0gQ2hlY2sgaWYgYSBibG9jayBpcyBiYWQKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAb2ZmczoJb2Zmc2V0IGluIHRoZSBkZXZpY2UKLSAqIEBhbGxvd2JidDoJYWxsb3cgYWNjZXNzIHRvIGJhZCBibG9jayB0YWJsZSByZWdpb24KLSAqCi0qLworICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZmZzOiBvZmZzZXQgaW4gdGhlIGRldmljZQorICogQGFsbG93YmJ0OiBhbGxvdyBhY2Nlc3MgdG8gYmFkIGJsb2NrIHRhYmxlIHJlZ2lvbgorICovCiBpbnQgbmFuZF9pc2JhZF9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzLCBpbnQgYWxsb3diYnQpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKQEAgLTE0MzIsOCArMTM4OCw5IEBACiAJYmxvY2sgPSAoaW50KShvZmZzID4+ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKSk7CiAJcmVzID0gKHRoaXMtPmJidFtibG9jayA+PiAzXSA+PiAoYmxvY2sgJiAweDA2KSkgJiAweDAzOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIm5hbmRfaXNiYWRfYmJ0KCk6IGJidCBpbmZvIGZvciBvZmZzIDB4JTA4eDogKGJsb2NrICVkKSAweCUwMnhcbiIsCi0JICAgICAgKHVuc2lnbmVkIGludClvZmZzLCBibG9jayA+PiAxLCByZXMpOworCXByX2RlYnVnKCJuYW5kX2lzYmFkX2JidCgpOiBiYnQgaW5mbyBmb3Igb2ZmcyAweCUwOHg6ICIKKwkJCSIoYmxvY2sgJWQpIDB4JTAyeFxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpb2ZmcywgYmxvY2sgPj4gMSwgcmVzKTsKIAogCXN3aXRjaCAoKGludClyZXMpIHsKIAljYXNlIDB4MDA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmNoLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmNoLmMKaW5kZXggMGY5MzFlNy4uMzgwM2UwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JjaC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iY2guYwpAQCAtOTMsOCArOTMsOCBAQAogCQkJCWJ1ZltlcnJsb2NbaV0gPj4gM10gXj0gKDEgPDwgKGVycmxvY1tpXSAmIDcpKTsKIAkJCS8qIGVsc2UgZXJyb3IgaW4gZWNjLCBubyBhY3Rpb24gbmVlZGVkICovCiAKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogY29ycmVjdGVkIGJpdGZsaXAgJXVcbiIsCi0JCQkgICAgICBfX2Z1bmNfXywgZXJybG9jW2ldKTsKKwkJCXByX2RlYnVnKCIlczogY29ycmVjdGVkIGJpdGZsaXAgJXVcbiIsIF9fZnVuY19fLAorCQkJCQllcnJsb2NbaV0pOwogCQl9CiAJfSBlbHNlIGlmIChjb3VudCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlY2MgdW5yZWNvdmVyYWJsZSBlcnJvclxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfZWNjLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfZWNjLmMKaW5kZXggMjcxYjhlNy4uYjdjZmUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2VjYy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9lY2MuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAKIC8qCiAgKiBhZGRyZXNzYml0cyBpcyBhIGxvb2t1cCB0YWJsZSB0byBmaWx0ZXIgb3V0IHRoZSBiaXRzIGZyb20gdGhlIHhvci1lZAotICogZWNjIGRhdGEgdGhhdCBpZGVudGlmeSB0aGUgZmF1bHR5IGxvY2F0aW9uLgorICogRUNDIGRhdGEgdGhhdCBpZGVudGlmeSB0aGUgZmF1bHR5IGxvY2F0aW9uLgogICogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlcGFpcmluZyBwYXJpdHkKICAqIHNlZSB0aGUgY29tbWVudHMgaW4gbmFuZF9jb3JyZWN0X2RhdGEgZm9yIG1vcmUgZGV0YWlscwogICovCkBAIC0xNTMsNyArMTUzLDcgQEAKICAqIF9fbmFuZF9jYWxjdWxhdGVfZWNjIC0gW05BTkQgSW50ZXJmYWNlXSBDYWxjdWxhdGUgMy1ieXRlIEVDQyBmb3IgMjU2LzUxMi1ieXRlCiAgKgkJCSBibG9jawogICogQGJ1ZjoJaW5wdXQgYnVmZmVyIHdpdGggcmF3IGRhdGEKLSAqIEBlY2NzaXplOglkYXRhIGJ5dGVzIHBlciBlY2Mgc3RlcCAoMjU2IG9yIDUxMikKKyAqIEBlY2NzaXplOglkYXRhIGJ5dGVzIHBlciBFQ0Mgc3RlcCAoMjU2IG9yIDUxMikKICAqIEBjb2RlOglvdXRwdXQgYnVmZmVyIHdpdGggRUNDCiAgKi8KIHZvaWQgX19uYW5kX2NhbGN1bGF0ZV9lY2MoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgZWNjc2l6ZSwKQEAgLTM0OCw3ICszNDgsNyBAQAogCQlycDE3ID0gKHBhciBeIHJwMTYpICYgMHhmZjsKIAogCS8qCi0JICogRmluYWxseSBjYWxjdWxhdGUgdGhlIGVjYyBiaXRzLgorCSAqIEZpbmFsbHkgY2FsY3VsYXRlIHRoZSBFQ0MgYml0cy4KIAkgKiBBZ2FpbiBoZXJlIGl0IG1pZ2h0IHNlZW0gdGhhdCB0aGVyZSBhcmUgcGVyZm9ybWFuY2Ugb3B0aW1pc2F0aW9ucwogCSAqIHBvc3NpYmxlLCBidXQgYmVuY2htYXJrcyBzaG93ZWQgdGhhdCBvbiB0aGUgc3lzdGVtIHRoaXMgaXMgZGV2ZWxvcGVkCiAJICogdGhlIGNvZGUgYmVsb3cgaXMgdGhlIGZhc3Rlc3QKQEAgLTQzNiw3ICs0MzYsNyBAQAogICogQGJ1ZjoJcmF3IGRhdGEgcmVhZCBmcm9tIHRoZSBjaGlwCiAgKiBAcmVhZF9lY2M6CUVDQyBmcm9tIHRoZSBjaGlwCiAgKiBAY2FsY19lY2M6CXRoZSBFQ0MgY2FsY3VsYXRlZCBmcm9tIHJhdyBkYXRhCi0gKiBAZWNjc2l6ZToJZGF0YSBieXRlcyBwZXIgZWNjIHN0ZXAgKDI1NiBvciA1MTIpCisgKiBAZWNjc2l6ZToJZGF0YSBieXRlcyBwZXIgRUNDIHN0ZXAgKDI1NiBvciA1MTIpCiAgKgogICogRGV0ZWN0IGFuZCBjb3JyZWN0IGEgMSBiaXQgZXJyb3IgZm9yIGVjY3NpemUgYnl0ZSBibG9jawogICovCkBAIC01MDUsNyArNTA1LDcgQEAKIAl9CiAJLyogY291bnQgbnIgb2YgYml0czsgdXNlIHRhYmxlIGxvb2t1cCwgZmFzdGVyIHRoYW4gY2FsY3VsYXRpbmcgaXQgKi8KIAlpZiAoKGJpdHNwZXJieXRlW2IwXSArIGJpdHNwZXJieXRlW2IxXSArIGJpdHNwZXJieXRlW2IyXSkgPT0gMSkKLQkJcmV0dXJuIDE7CS8qIGVycm9yIGluIGVjYyBkYXRhOyBubyBhY3Rpb24gbmVlZGVkICovCisJCXJldHVybiAxOwkvKiBlcnJvciBpbiBFQ0MgZGF0YTsgbm8gYWN0aW9uIG5lZWRlZCAqLwogCiAJcHJpbnRrKEtFUk5fRVJSICJ1bmNvcnJlY3RhYmxlIGVycm9yIDogIik7CiAJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYwppbmRleCAzNTdlOGM1Li4zNGMwM2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYwpAQCAtMjI3Myw5ICsyMjczLDkgQEAKIAogCXN3aXRjaCAoYmJ0KSB7CiAJY2FzZSAyOgotCQkgY2hpcC0+b3B0aW9ucyB8PSBOQU5EX1VTRV9GTEFTSF9CQlRfTk9fT09COworCQkgY2hpcC0+YmJ0X29wdGlvbnMgfD0gTkFORF9CQlRfTk9fT09COwogCWNhc2UgMToKLQkJIGNoaXAtPm9wdGlvbnMgfD0gTkFORF9VU0VfRkxBU0hfQkJUOworCQkgY2hpcC0+YmJ0X29wdGlvbnMgfD0gTkFORF9CQlRfVVNFX0ZMQVNIOwogCWNhc2UgMDoKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jIGIvZHJpdmVycy9tdGQvbmFuZC9uZGZjLmMKaW5kZXggZWEyZGVhOC4uZWUxNzEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uZGZjLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uZGZjLmMKQEAgLTQyLDcgKzQyLDYgQEAKIAlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7CiAJaW50IGNoaXBfc2VsZWN0OwogCXN0cnVjdCBuYW5kX2h3X2NvbnRyb2wgbmRmY19jb250cm9sOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmRmY19jb250cm9sbGVyIG5kZmNfY3RybFtOREZDX01BWF9DU107CkBAIC0xNTksMTMgKzE1OCw5IEBACiBzdGF0aWMgaW50IG5kZmNfY2hpcF9pbml0KHN0cnVjdCBuZGZjX2NvbnRyb2xsZXIgKm5kZmMsCiAJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLQlzdGF0aWMgY29uc3QgY2hhciAqcGFydF90eXBlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0jZWxzZQotCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3R5cGVzW10gPSB7IE5VTEwgfTsKLSNlbmRpZgogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZmxhc2hfbnA7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9ICZuZGZjLT5jaGlwOworCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSBwcGRhdGE7CiAJaW50IHJldDsKIAogCWNoaXAtPklPX0FERFJfUiA9IG5kZmMtPm5kZmNiYXNlICsgTkRGQ19EQVRBOwpAQCAtMTkzLDYgKzE4OCw3IEBACiAJaWYgKCFmbGFzaF9ucCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlwcGRhdGEtPm9mX25vZGUgPSBmbGFzaF9ucDsKIAluZGZjLT5tdGQubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMuJXMiLAogCQkJZGV2X25hbWUoJm5kZmMtPm9mZGV2LT5kZXYpLCBmbGFzaF9ucC0+bmFtZSk7CiAJaWYgKCFuZGZjLT5tdGQubmFtZSkgewpAQCAtMjA0LDE4ICsyMDAsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCi0JcmV0ID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJm5kZmMtPm10ZCwgcGFydF90eXBlcywgJm5kZmMtPnBhcnRzLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnI7Ci0KLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMoJm5kZmMtPm9mZGV2LT5kZXYsIGZsYXNoX25wLAotCQkJCQkgICAgICAmbmRmYy0+cGFydHMpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyOwotCX0KLQotCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJm5kZmMtPm10ZCwgbmRmYy0+cGFydHMsIHJldCk7CisJcmV0ID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmbmRmYy0+bXRkLCBOVUxMLCAmcHBkYXRhLCBOVUxMLCAwKTsKIAogZXJyOgogCW9mX25vZGVfcHV0KGZsYXNoX25wKTsKQEAgLTI4OCw2ICsyNzMsNyBAQAogCXN0cnVjdCBuZGZjX2NvbnRyb2xsZXIgKm5kZmMgPSBkZXZfZ2V0X2RydmRhdGEoJm9mZGV2LT5kZXYpOwogCiAJbmFuZF9yZWxlYXNlKCZuZGZjLT5tdGQpOworCWtmcmVlKG5kZmMtPm10ZC5uYW1lKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9ub21hZGlrX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbm9tYWRpa19uYW5kLmMKaW5kZXggYjZhNWM4Ni4uYjQ2M2VjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9ub21hZGlrX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25vbWFkaWtfbmFuZC5jCkBAIC0xODcsNiArMTg3LDcgQEAKIAkJcGRhdGEtPmV4aXQoKTsKIAogCWlmIChob3N0KSB7CisJCW5hbmRfcmVsZWFzZSgmaG9zdC0+bXRkKTsKIAkJaW91bm1hcChob3N0LT5jbWRfdmEpOwogCQlpb3VubWFwKGhvc3QtPmRhdGFfdmEpOwogCQlpb3VubWFwKGhvc3QtPmFkZHJfdmEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9udWM5MDBfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9udWM5MDBfbmFuZC5jCmluZGV4IDljMzBhMGIuLmZhOGZhZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbnVjOTAwX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL251YzkwMF9uYW5kLmMKQEAgLTMzOSw2ICszMzksNyBAQAogCXN0cnVjdCBudWM5MDBfbmFuZCAqbnVjOTAwX25hbmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAorCW5hbmRfcmVsZWFzZSgmbnVjOTAwX25hbmQtPm10ZCk7CiAJaW91bm1hcChudWM5MDBfbmFuZC0+cmVnKTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL29tYXAyLmMgYi9kcml2ZXJzL210ZC9uYW5kL29tYXAyLmMKaW5kZXggMGRiMmMwZS4uZjc0NWYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9vbWFwMi5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvb21hcDIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTk0LDggKzk1LDYgQEAKICNkZWZpbmUgUDRlX3MoYSkJKFRGKGEgJiBOQU5EX0VjY19QNGUpCQk8PCAwKQogI2RlZmluZSBQNG9fcyhhKQkoVEYoYSAmIE5BTkRfRWNjX1A0bykJCTw8IDEpCiAKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0KIC8qIG9vYiBpbmZvIGdlbmVyYXRlZCBydW50aW1lIGRlcGVuZGluZyBvbiBlY2MgYWxnb3JpdGhtIGFuZCBsYXlvdXQgc2VsZWN0ZWQgKi8KIHN0YXRpYyBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgb21hcF9vb2JpbmZvOwogLyogRGVmaW5lIHNvbWUgZ2VuZXJpYyBiYWQgLyBnb29kIGJsb2NrIHNjYW4gcGF0dGVybiB3aGljaCBhcmUgdXNlZApAQCAtMTE0LDcgKzExMyw2IEBACiAJc3RydWN0IG5hbmRfaHdfY29udHJvbAkJY29udHJvbGxlcjsKIAlzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEJKnBkYXRhOwogCXN0cnVjdCBtdGRfaW5mbwkJCW10ZDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkJKnBhcnRzOwogCXN0cnVjdCBuYW5kX2NoaXAJCW5hbmQ7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7CiAKQEAgLTc0NCwxMiArNzQyLDEyIEBACiAKIAljYXNlIDE6CiAJCS8qIFVuY29ycmVjdGFibGUgZXJyb3IgKi8KLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIkVDQyBVTkNPUlJFQ1RFRF9FUlJPUiAxXG4iKTsKKwkJcHJfZGVidWcoIkVDQyBVTkNPUlJFQ1RFRF9FUlJPUiAxXG4iKTsKIAkJcmV0dXJuIC0xOwogCiAJY2FzZSAxMToKIAkJLyogVU4tQ29ycmVjdGFibGUgZXJyb3IgKi8KLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIkVDQyBVTkNPUlJFQ1RFRF9FUlJPUiBCXG4iKTsKKwkJcHJfZGVidWcoIkVDQyBVTkNPUlJFQ1RFRF9FUlJPUiBCXG4iKTsKIAkJcmV0dXJuIC0xOwogCiAJY2FzZSAxMjoKQEAgLTc2Niw4ICs3NjQsOCBAQAogCiAJCWZpbmRfYml0ID0gKGVjY19iaXRbNV0gPDwgMikgKyAoZWNjX2JpdFszXSA8PCAxKSArIGVjY19iaXRbMV07CiAKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIkNvcnJlY3Rpbmcgc2luZ2xlIGJpdCBFQ0MgZXJyb3IgYXQgIgotCQkJCSJvZmZzZXQ6ICVkLCBiaXQ6ICVkXG4iLCBmaW5kX2J5dGUsIGZpbmRfYml0KTsKKwkJcHJfZGVidWcoIkNvcnJlY3Rpbmcgc2luZ2xlIGJpdCBFQ0MgZXJyb3IgYXQgb2Zmc2V0OiAiCisJCQkJIiVkLCBiaXQ6ICVkXG4iLCBmaW5kX2J5dGUsIGZpbmRfYml0KTsKIAogCQlwYWdlX2RhdGFbZmluZF9ieXRlXSBePSAoMSA8PCBmaW5kX2JpdCk7CiAKQEAgLTc3OSw3ICs3NzcsNyBAQAogCQkJICAgIGVjY19kYXRhMlsyXSA9PSAwKQogCQkJCXJldHVybiAwOwogCQl9Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICJVTkNPUlJFQ1RFRF9FUlJPUiBkZWZhdWx0XG4iKTsKKwkJcHJfZGVidWcoIlVOQ09SUkVDVEVEX0VSUk9SIGRlZmF1bHRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogfQpAQCAtMTEwMywxMyArMTEwMSw4IEBACiAJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKIAl9CiAKLQllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucygmaW5mby0+bXRkLCBwYXJ0X3Byb2JlcywgJmluZm8tPnBhcnRzLCAwKTsKLQlpZiAoZXJyID4gMCkKLQkJbXRkX2RldmljZV9yZWdpc3RlcigmaW5mby0+bXRkLCBpbmZvLT5wYXJ0cywgZXJyKTsKLQllbHNlIGlmIChwZGF0YS0+cGFydHMpCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoJmluZm8tPm10ZCwgcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOwotCWVsc2UKLQkJbXRkX2RldmljZV9yZWdpc3RlcigmaW5mby0+bXRkLCBOVUxMLCAwKTsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKCZpbmZvLT5tdGQsIE5VTEwsIDAsCisJCQlwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmaW5mby0+bXRkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9vcmlvbl9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL29yaW9uX25hbmQuYwppbmRleCA3Nzk0ZDA2Li4yOWY1MDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL29yaW9uX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL29yaW9uX25hbmQuYwpAQCAtMjEsOCArMjEsNiBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxwbGF0L29yaW9uX25hbmQuaD4KIAotc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogc3RhdGljIHZvaWQgb3Jpb25fbmFuZF9jbWRfY3RybChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCwgdW5zaWduZWQgaW50IGN0cmwpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqbmMgPSBtdGQtPnByaXY7CkBAIC04MSw4ICs3OSw2IEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJdm9pZCBfX2lvbWVtICppb19iYXNlOwogCWludCByZXQgPSAwOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0aXRpb25zID0gTlVMTDsKLQlpbnQgbnVtX3BhcnQgPSAwOwogCiAJbmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSArIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5jKSB7CkBAIC0xMzIsMTcgKzEyOCw5IEBACiAJCWdvdG8gbm9fZGV2OwogCX0KIAotI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwogCW10ZC0+bmFtZSA9ICJvcmlvbl9uYW5kIjsKLQludW1fcGFydCA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgcGFydF9wcm9iZXMsICZwYXJ0aXRpb25zLCAwKTsKLSNlbmRpZgotCS8qIElmIGNtZGxpbmUgcGFydGl0aW9ucyBoYXZlIGJlZW4gcGFzc2VkLCBsZXQgdGhlbSBiZSB1c2VkICovCi0JaWYgKG51bV9wYXJ0IDw9IDApIHsKLQkJbnVtX3BhcnQgPSBib2FyZC0+bnJfcGFydHM7Ci0JCXBhcnRpdGlvbnMgPSBib2FyZC0+cGFydHM7Ci0JfQotCi0JcmV0ID0gbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIHBhcnRpdGlvbnMsIG51bV9wYXJ0KTsKKwlyZXQgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwgMCwKKwkJCWJvYXJkLT5wYXJ0cywgYm9hcmQtPm5yX3BhcnRzKTsKIAlpZiAocmV0KSB7CiAJCW5hbmRfcmVsZWFzZShtdGQpOwogCQlnb3RvIG5vX2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcGFzZW1pX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcGFzZW1pX25hbmQuYwppbmRleCBiMWFhNDFiLi5hOTcyNjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3Bhc2VtaV9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9wYXNlbWlfbmFuZC5jCkBAIC0xNTUsNyArMTU1LDggQEAKIAljaGlwLT5lY2MubW9kZSA9IE5BTkRfRUNDX1NPRlQ7CiAKIAkvKiBFbmFibGUgdGhlIGZvbGxvd2luZyBmb3IgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUgKi8KLQljaGlwLT5vcHRpb25zID0gTkFORF9VU0VfRkxBU0hfQkJUIHwgTkFORF9OT19BVVRPSU5DUjsKKwljaGlwLT5vcHRpb25zID0gTkFORF9OT19BVVRPSU5DUjsKKwljaGlwLT5iYnRfb3B0aW9ucyA9IE5BTkRfQkJUX1VTRV9GTEFTSDsKIAogCS8qIFNjYW4gdG8gZmluZCBleGlzdGVuY2Ugb2YgdGhlIGRldmljZSAqLwogCWlmIChuYW5kX3NjYW4ocGFzZW1pX25hbmRfbXRkLCAxKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMKaW5kZXggNjMzYzA0Yi4uZWE4ZTEyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jCkBAIC0yMSw4ICsyMSw2IEBACiAJc3RydWN0IG5hbmRfY2hpcAljaGlwOwogCXN0cnVjdCBtdGRfaW5mbwkJbXRkOwogCXZvaWQgX19pb21lbQkJKmlvX2Jhc2U7Ci0JaW50CQkJbnJfcGFydHM7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRzOwogfTsKIAogLyoKQEAgLTc5LDYgKzc3LDcgQEAKIAlkYXRhLT5jaGlwLnJlYWRfYnVmID0gcGRhdGEtPmN0cmwucmVhZF9idWY7CiAJZGF0YS0+Y2hpcC5jaGlwX2RlbGF5ID0gcGRhdGEtPmNoaXAuY2hpcF9kZWxheTsKIAlkYXRhLT5jaGlwLm9wdGlvbnMgfD0gcGRhdGEtPmNoaXAub3B0aW9uczsKKwlkYXRhLT5jaGlwLmJidF9vcHRpb25zIHw9IHBkYXRhLT5jaGlwLmJidF9vcHRpb25zOwogCiAJZGF0YS0+Y2hpcC5lY2MuaHdjdGwgPSBwZGF0YS0+Y3RybC5od2NvbnRyb2w7CiAJZGF0YS0+Y2hpcC5lY2MubGF5b3V0ID0gcGRhdGEtPmNoaXAuZWNjbGF5b3V0OwpAQCAtOTksMjMgKzk4LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHBkYXRhLT5jaGlwLnBhcnRfcHJvYmVfdHlwZXMpIHsKLQkJZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmRhdGEtPm10ZCwKLQkJCQkJcGRhdGEtPmNoaXAucGFydF9wcm9iZV90eXBlcywKLQkJCQkJJmRhdGEtPnBhcnRzLCAwKTsKLQkJaWYgKGVyciA+IDApIHsKLQkJCW10ZF9kZXZpY2VfcmVnaXN0ZXIoJmRhdGEtPm10ZCwgZGF0YS0+cGFydHMsIGVycik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAocGRhdGEtPmNoaXAuc2V0X3BhcnRzKQotCQlwZGF0YS0+Y2hpcC5zZXRfcGFydHMoZGF0YS0+bXRkLnNpemUsICZwZGF0YS0+Y2hpcCk7Ci0JaWYgKHBkYXRhLT5jaGlwLnBhcnRpdGlvbnMpIHsKLQkJZGF0YS0+cGFydHMgPSBwZGF0YS0+Y2hpcC5wYXJ0aXRpb25zOwotCQllcnIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZkYXRhLT5tdGQsIGRhdGEtPnBhcnRzLAotCQkJcGRhdGEtPmNoaXAubnJfcGFydGl0aW9ucyk7Ci0JfSBlbHNlCi0JCWVyciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmRhdGEtPm10ZCwgTlVMTCwgMCk7CisJZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmZGF0YS0+bXRkLAorCQkJcGRhdGEtPmNoaXAucGFydF9wcm9iZV90eXBlcywgMCwKKwkJCXBkYXRhLT5jaGlwLnBhcnRpdGlvbnMsIHBkYXRhLT5jaGlwLm5yX3BhcnRpdGlvbnMpOwogCiAJaWYgKCFlcnIpCiAJCXJldHVybiBlcnI7CkBAIC0xNDUsOCArMTMwLDYgQEAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCiAJbmFuZF9yZWxlYXNlKCZkYXRhLT5tdGQpOwotCWlmIChkYXRhLT5wYXJ0cyAmJiBkYXRhLT5wYXJ0cyAhPSBwZGF0YS0+Y2hpcC5wYXJ0aXRpb25zKQotCQlrZnJlZShkYXRhLT5wYXJ0cyk7CiAJaWYgKHBkYXRhLT5jdHJsLnJlbW92ZSkKIAkJcGRhdGEtPmN0cmwucmVtb3ZlKHBkZXYpOwogCWlvdW5tYXAoZGF0YS0+aW9fYmFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3BwY2hhbWVsZW9uZXZiLmMgYi9kcml2ZXJzL210ZC9uYW5kL3BwY2hhbWVsZW9uZXZiLmMKaW5kZXggM2JiYjc5Ni4uN2U1MmFmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9wcGNoYW1lbGVvbmV2Yi5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcHBjaGFtZWxlb25ldmIuYwpAQCAtOTksOCArOTksNiBAQAogCiAjZGVmaW5lIE5VTV9QQVJUSVRJT05TIDEKIAotZXh0ZXJuIGludCBwYXJzZV9jbWRsaW5lX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICptYXN0ZXIsIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLCBjb25zdCBjaGFyICptdGRfaWQpOwotCiAvKgogICoJaGFyZHdhcmUgc3BlY2lmaWMgYWNjZXNzIHRvIGNvbnRyb2wtbGluZXMKICAqLwpAQCAtMTg3LDE4ICsxODUsMTIgQEAKIH0KICNlbmRpZgogCi1jb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci1jb25zdCBjaGFyICpwYXJ0X3Byb2Jlc19ldmJbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCiAvKgogICogTWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHBwY2hhbWVsZW9uZXZiX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOwotCWNvbnN0IGNoYXIgKnBhcnRfdHlwZSA9IDA7Ci0JaW50IG10ZF9wYXJ0c19uYiA9IDA7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyA9IDA7CiAJdm9pZCBfX2lvbWVtICpwcGNoYW1lbGVvbl9maW9fYmFzZTsKIAl2b2lkIF9faW9tZW0gKnBwY2hhbWVsZW9uZXZiX2Zpb19iYXNlOwogCkBAIC0yODEsMjQgKzI3MywxMyBAQAogI2VuZGlmCiAKIAlwcGNoYW1lbGVvbl9tdGQtPm5hbWUgPSAicHBjaGFtZWxlb24tbmFuZCI7Ci0JbXRkX3BhcnRzX25iID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMocHBjaGFtZWxlb25fbXRkLCBwYXJ0X3Byb2JlcywgJm10ZF9wYXJ0cywgMCk7Ci0JaWYgKG10ZF9wYXJ0c19uYiA+IDApCi0JCXBhcnRfdHlwZSA9ICJjb21tYW5kIGxpbmUiOwotCWVsc2UKLQkJbXRkX3BhcnRzX25iID0gMDsKLQotCWlmIChtdGRfcGFydHNfbmIgPT0gMCkgewotCQlpZiAocHBjaGFtZWxlb25fbXRkLT5zaXplID09IE5BTkRfU01BTExfU0laRSkKLQkJCW10ZF9wYXJ0cyA9IHBhcnRpdGlvbl9pbmZvX21lOwotCQllbHNlCi0JCQltdGRfcGFydHMgPSBwYXJ0aXRpb25faW5mb19oaTsKLQkJbXRkX3BhcnRzX25iID0gTlVNX1BBUlRJVElPTlM7Ci0JCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwotCX0KIAogCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCi0JcHJpbnRrKEtFUk5fTk9USUNFICJVc2luZyAlcyBwYXJ0aXRpb24gZGVmaW5pdGlvblxuIiwgcGFydF90eXBlKTsKLQltdGRfZGV2aWNlX3JlZ2lzdGVyKHBwY2hhbWVsZW9uX210ZCwgbXRkX3BhcnRzLCBtdGRfcGFydHNfbmIpOworCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIocHBjaGFtZWxlb25fbXRkLCBOVUxMLCAwLAorCQkJcHBjaGFtZWxlb25fbXRkLT5zaXplID09IE5BTkRfU01BTExfU0laRSA/CisJCQkJcGFydGl0aW9uX2luZm9fbWUgOgorCQkJCXBhcnRpdGlvbl9pbmZvX2hpLAorCQkJTlVNX1BBUlRJVElPTlMpOwogCiAgbmFuZF9ldmJfaW5pdDoKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzgyLDIxICszNjMsMTMgQEAKIAl9CiAKIAlwcGNoYW1lbGVvbmV2Yl9tdGQtPm5hbWUgPSBOQU5EX0VWQl9NVERfTkFNRTsKLQltdGRfcGFydHNfbmIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhwcGNoYW1lbGVvbmV2Yl9tdGQsIHBhcnRfcHJvYmVzX2V2YiwgJm10ZF9wYXJ0cywgMCk7Ci0JaWYgKG10ZF9wYXJ0c19uYiA+IDApCi0JCXBhcnRfdHlwZSA9ICJjb21tYW5kIGxpbmUiOwotCWVsc2UKLQkJbXRkX3BhcnRzX25iID0gMDsKLQotCWlmIChtdGRfcGFydHNfbmIgPT0gMCkgewotCQltdGRfcGFydHMgPSBwYXJ0aXRpb25faW5mb19ldmI7Ci0JCW10ZF9wYXJ0c19uYiA9IE5VTV9QQVJUSVRJT05TOwotCQlwYXJ0X3R5cGUgPSAic3RhdGljIjsKLQl9CiAKIAkvKiBSZWdpc3RlciB0aGUgcGFydGl0aW9ucyAqLwotCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgJXMgcGFydGl0aW9uIGRlZmluaXRpb25cbiIsIHBhcnRfdHlwZSk7Ci0JbXRkX2RldmljZV9yZWdpc3RlcihwcGNoYW1lbGVvbmV2Yl9tdGQsIG10ZF9wYXJ0cywgbXRkX3BhcnRzX25iKTsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKHBwY2hhbWVsZW9uZXZiX210ZCwgTlVMTCwgMCwKKwkJCXBwY2hhbWVsZW9uX210ZC0+c2l6ZSA9PSBOQU5EX1NNQUxMX1NJWkUgPworCQkJCXBhcnRpdGlvbl9pbmZvX21lIDoKKwkJCQlwYXJ0aXRpb25faW5mb19oaSwKKwkJCU5VTV9QQVJUSVRJT05TKTsKIAogCS8qIFJldHVybiBoYXBweSAqLwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9weGEzeHhfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9weGEzeHhfbmFuZC5jCmluZGV4IDFmYjNiM2EuLjllYjdmODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcHhhM3h4X25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3B4YTN4eF9uYW5kLmMKQEAgLTExMCw2ICsxMTAsNyBAQAogCiBlbnVtIHsKIAlTVEFURV9JRExFID0gMCwKKwlTVEFURV9QUkVQQVJFRCwKIAlTVEFURV9DTURfSEFORExFLAogCVNUQVRFX0RNQV9SRUFESU5HLAogCVNUQVRFX0RNQV9XUklUSU5HLApAQCAtMTIwLDIxICsxMjEsNDAgQEAKIAlTVEFURV9SRUFEWSwKIH07CiAKLXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvIHsKLQlzdHJ1Y3QgbmFuZF9jaGlwCW5hbmRfY2hpcDsKK3N0cnVjdCBweGEzeHhfbmFuZF9ob3N0IHsKKwlzdHJ1Y3QgbmFuZF9jaGlwCWNoaXA7CisJc3RydWN0IHB4YTN4eF9uYW5kX2NtZHNldCAqY21kc2V0OworCXN0cnVjdCBtdGRfaW5mbyAgICAgICAgICptdGQ7CisJdm9pZAkJCSppbmZvX2RhdGE7CiAKKwkvKiBwYWdlIHNpemUgb2YgYXR0YWNoZWQgY2hpcCAqLworCXVuc2lnbmVkIGludAkJcGFnZV9zaXplOworCWludAkJCXVzZV9lY2M7CisJaW50CQkJY3M7CisKKwkvKiBjYWxjdWxhdGVkIGZyb20gcHhhM3h4X25hbmRfZmxhc2ggZGF0YSAqLworCXVuc2lnbmVkIGludAkJY29sX2FkZHJfY3ljbGVzOworCXVuc2lnbmVkIGludAkJcm93X2FkZHJfY3ljbGVzOworCXNpemVfdAkJCXJlYWRfaWRfYnl0ZXM7CisKKwkvKiBjYWNoZWQgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1aW50MzJfdAkJcmVnX25kY3I7CisJdWludDMyX3QJCW5kdHIwY3MwOworCXVpbnQzMl90CQluZHRyMWNzMDsKK307CisKK3N0cnVjdCBweGEzeHhfbmFuZF9pbmZvIHsKIAlzdHJ1Y3QgbmFuZF9od19jb250cm9sCWNvbnRyb2xsZXI7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkgKnBkZXY7Ci0Jc3RydWN0IHB4YTN4eF9uYW5kX2NtZHNldCAqY21kc2V0OwogCiAJc3RydWN0IGNsawkJKmNsazsKIAl2b2lkIF9faW9tZW0JCSptbWlvX2Jhc2U7CiAJdW5zaWduZWQgbG9uZwkJbW1pb19waHlzOworCXN0cnVjdCBjb21wbGV0aW9uCWNtZF9jb21wbGV0ZTsKIAogCXVuc2lnbmVkIGludCAJCWJ1Zl9zdGFydDsKIAl1bnNpZ25lZCBpbnQJCWJ1Zl9jb3VudDsKIAotCXN0cnVjdCBtdGRfaW5mbyAgICAgICAgICptdGQ7CiAJLyogRE1BIGluZm9ybWF0aW9uICovCiAJaW50CQkJZHJjbXJfZGF0OwogCWludAkJCWRyY21yX2NtZDsKQEAgLTE0Miw0NCArMTYyLDI3IEBACiAJdW5zaWduZWQgY2hhcgkJKmRhdGFfYnVmZjsKIAl1bnNpZ25lZCBjaGFyCQkqb29iX2J1ZmY7CiAJZG1hX2FkZHJfdCAJCWRhdGFfYnVmZl9waHlzOwotCXNpemVfdAkJCWRhdGFfYnVmZl9zaXplOwogCWludCAJCQlkYXRhX2RtYV9jaDsKIAlzdHJ1Y3QgcHhhX2RtYV9kZXNjCSpkYXRhX2Rlc2M7CiAJZG1hX2FkZHJfdCAJCWRhdGFfZGVzY19hZGRyOwogCi0JdWludDMyX3QJCXJlZ19uZGNyOwotCi0JLyogc2F2ZWQgY29sdW1uL3BhZ2VfYWRkciBkdXJpbmcgQ01EX1NFUUlOICovCi0JaW50CQkJc2VxaW5fY29sdW1uOwotCWludAkJCXNlcWluX3BhZ2VfYWRkcjsKLQotCS8qIHJlbGF0ZSB0byB0aGUgY29tbWFuZCAqLworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0W05VTV9DSElQX1NFTEVDVF07CiAJdW5zaWduZWQgaW50CQlzdGF0ZTsKIAorCWludAkJCWNzOwogCWludAkJCXVzZV9lY2M7CS8qIHVzZSBIVyBFQ0MgPyAqLwogCWludAkJCXVzZV9kbWE7CS8qIHVzZSBETUEgPyAqLwogCWludAkJCWlzX3JlYWR5OwogCiAJdW5zaWduZWQgaW50CQlwYWdlX3NpemU7CS8qIHBhZ2Ugc2l6ZSBvZiBhdHRhY2hlZCBjaGlwICovCiAJdW5zaWduZWQgaW50CQlkYXRhX3NpemU7CS8qIGRhdGEgc2l6ZSBpbiBGSUZPICovCisJdW5zaWduZWQgaW50CQlvb2Jfc2l6ZTsKIAlpbnQgCQkJcmV0Y29kZTsKLQlzdHJ1Y3QgY29tcGxldGlvbiAJY21kX2NvbXBsZXRlOwogCiAJLyogZ2VuZXJhdGVkIE5EQ0J4IHJlZ2lzdGVyIHZhbHVlcyAqLwogCXVpbnQzMl90CQluZGNiMDsKIAl1aW50MzJfdAkJbmRjYjE7CiAJdWludDMyX3QJCW5kY2IyOwotCi0JLyogdGltaW5nIGNhbGN1dGVkIGZyb20gc2V0dGluZyAqLwotCXVpbnQzMl90CQluZHRyMGNzMDsKLQl1aW50MzJfdAkJbmR0cjFjczA7Ci0KLQkvKiBjYWxjdWxhdGVkIGZyb20gcHhhM3h4X25hbmRfZmxhc2ggZGF0YSAqLwotCXNpemVfdAkJb29iX3NpemU7Ci0Jc2l6ZV90CQlyZWFkX2lkX2J5dGVzOwotCi0JdW5zaWduZWQgaW50CWNvbF9hZGRyX2N5Y2xlczsKLQl1bnNpZ25lZCBpbnQJcm93X2FkZHJfY3ljbGVzOwogfTsKIAogc3RhdGljIGludCB1c2VfZG1hID0gMTsKQEAgLTIyNSw3ICsyMjgsNyBAQAogLyogRGVmaW5lIGEgZGVmYXVsdCBmbGFzaCB0eXBlIHNldHRpbmcgc2VydmUgYXMgZmxhc2ggZGV0ZWN0aW5nIG9ubHkgKi8KICNkZWZpbmUgREVGQVVMVF9GTEFTSF9UWVBFICgmYnVpbHRpbl9mbGFzaF90eXBlc1swXSkKIAotY29uc3QgY2hhciAqbXRkX25hbWVzW10gPSB7InB4YTN4eF9uYW5kLTAiLCBOVUxMfTsKK2NvbnN0IGNoYXIgKm10ZF9uYW1lc1tdID0geyJweGEzeHhfbmFuZC0wIiwgInB4YTN4eF9uYW5kLTEiLCBOVUxMfTsKIAogI2RlZmluZSBORFRSMF90Q0goYykJKG1pbigoYyksIDcpIDw8IDE5KQogI2RlZmluZSBORFRSMF90Q1MoYykJKG1pbigoYyksIDcpIDw8IDE2KQpAQCAtMjQxLDkgKzI0NCwxMCBAQAogLyogY29udmVydCBuYW5vLXNlY29uZHMgdG8gbmFuZCBmbGFzaCBjb250cm9sbGVyIGNsb2NrIGN5Y2xlcyAqLwogI2RlZmluZSBuczJjeWNsZShucywgY2xrKQkoaW50KSgobnMpICogKGNsayAvIDEwMDAwMDApIC8gMTAwMCkKIAotc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfc2V0X3RpbWluZyhzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbywKK3N0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX3NldF90aW1pbmcoc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QsCiAJCQkJICAgY29uc3Qgc3RydWN0IHB4YTN4eF9uYW5kX3RpbWluZyAqdCkKIHsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IGhvc3QtPmluZm9fZGF0YTsKIAl1bnNpZ25lZCBsb25nIG5hbmRfY2xrID0gY2xrX2dldF9yYXRlKGluZm8tPmNsayk7CiAJdWludDMyX3QgbmR0cjAsIG5kdHIxOwogCkBAIC0yNTgsMjMgKzI2MiwyNCBAQAogCQlORFRSMV90V0hSKG5zMmN5Y2xlKHQtPnRXSFIsIG5hbmRfY2xrKSkgfAogCQlORFRSMV90QVIobnMyY3ljbGUodC0+dEFSLCBuYW5kX2NsaykpOwogCi0JaW5mby0+bmR0cjBjczAgPSBuZHRyMDsKLQlpbmZvLT5uZHRyMWNzMCA9IG5kdHIxOworCWhvc3QtPm5kdHIwY3MwID0gbmR0cjA7CisJaG9zdC0+bmR0cjFjczAgPSBuZHRyMTsKIAluYW5kX3dyaXRlbChpbmZvLCBORFRSMENTMCwgbmR0cjApOwogCW5hbmRfd3JpdGVsKGluZm8sIE5EVFIxQ1MwLCBuZHRyMSk7CiB9CiAKIHN0YXRpYyB2b2lkIHB4YTN4eF9zZXRfZGF0YXNpemUoc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8pCiB7Ci0JaW50IG9vYl9lbmFibGUgPSBpbmZvLT5yZWdfbmRjciAmIE5EQ1JfU1BBUkVfRU47CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QgPSBpbmZvLT5ob3N0W2luZm8tPmNzXTsKKwlpbnQgb29iX2VuYWJsZSA9IGhvc3QtPnJlZ19uZGNyICYgTkRDUl9TUEFSRV9FTjsKIAotCWluZm8tPmRhdGFfc2l6ZSA9IGluZm8tPnBhZ2Vfc2l6ZTsKKwlpbmZvLT5kYXRhX3NpemUgPSBob3N0LT5wYWdlX3NpemU7CiAJaWYgKCFvb2JfZW5hYmxlKSB7CiAJCWluZm8tPm9vYl9zaXplID0gMDsKIAkJcmV0dXJuOwogCX0KIAotCXN3aXRjaCAoaW5mby0+cGFnZV9zaXplKSB7CisJc3dpdGNoIChob3N0LT5wYWdlX3NpemUpIHsKIAljYXNlIDIwNDg6CiAJCWluZm8tPm9vYl9zaXplID0gKGluZm8tPnVzZV9lY2MpID8gNDAgOiA2NDsKIAkJYnJlYWs7CkBAIC0yOTIsOSArMjk3LDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX3N0YXJ0KHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvKQogeworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0ID0gaW5mby0+aG9zdFtpbmZvLT5jc107CiAJdWludDMyX3QgbmRjcjsKIAotCW5kY3IgPSBpbmZvLT5yZWdfbmRjcjsKKwluZGNyID0gaG9zdC0+cmVnX25kY3I7CiAJbmRjciB8PSBpbmZvLT51c2VfZWNjID8gTkRDUl9FQ0NfRU4gOiAwOwogCW5kY3IgfD0gaW5mby0+dXNlX2RtYSA/IE5EQ1JfRE1BX0VOIDogMDsKIAluZGNyIHw9IE5EQ1JfTkRfUlVOOwpAQCAtMzU5LDcgKzM2NSw3IEBACiAJCQkJCURJVl9ST1VORF9VUChpbmZvLT5vb2Jfc2l6ZSwgNCkpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiJXM6IGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLAogCQkJCWluZm8tPnN0YXRlKTsKIAkJQlVHKCk7CiAJfQpAQCAtMzg1LDcgKzM5MSw3IEBACiAJCWRlc2MtPmRjbWQgfD0gRENNRF9JTkNUUkdBRERSIHwgRENNRF9GTE9XU1JDOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiJXM6IGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLAogCQkJCWluZm8tPnN0YXRlKTsKIAkJQlVHKCk7CiAJfQpAQCAtNDE2LDYgKzQyMiwxNSBAQAogewogCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gZGV2aWQ7CiAJdW5zaWduZWQgaW50IHN0YXR1cywgaXNfY29tcGxldGVkID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVhZHksIGNtZF9kb25lOworCisJaWYgKGluZm8tPmNzID09IDApIHsKKwkJcmVhZHkgICAgICAgICAgID0gTkRTUl9GTEFTSF9SRFk7CisJCWNtZF9kb25lICAgICAgICA9IE5EU1JfQ1MwX0NNREQ7CisJfSBlbHNlIHsKKwkJcmVhZHkgICAgICAgICAgID0gTkRTUl9SRFk7CisJCWNtZF9kb25lICAgICAgICA9IE5EU1JfQ1MxX0NNREQ7CisJfQogCiAJc3RhdHVzID0gbmFuZF9yZWFkbChpbmZvLCBORFNSKTsKIApAQCAtNDM3LDExICs0NTIsMTEgQEAKIAkJCWhhbmRsZV9kYXRhX3BpbyhpbmZvKTsKIAkJfQogCX0KLQlpZiAoc3RhdHVzICYgTkRTUl9DUzBfQ01ERCkgeworCWlmIChzdGF0dXMgJiBjbWRfZG9uZSkgewogCQlpbmZvLT5zdGF0ZSA9IFNUQVRFX0NNRF9ET05FOwogCQlpc19jb21wbGV0ZWQgPSAxOwogCX0KLQlpZiAoc3RhdHVzICYgTkRTUl9GTEFTSF9SRFkpIHsKKwlpZiAoc3RhdHVzICYgcmVhZHkpIHsKIAkJaW5mby0+aXNfcmVhZHkgPSAxOwogCQlpbmZvLT5zdGF0ZSA9IFNUQVRFX1JFQURZOwogCX0KQEAgLTQ2MywxMiArNDc4LDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgcHhhM3h4X25hbmRfZGV2X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OwotCXJldHVybiAobmFuZF9yZWFkbChpbmZvLCBORFNSKSAmIE5EU1JfUkRZKSA/IDEgOiAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBpc19idWZfYmxhbmsodWludDhfdCAqYnVmLCBzaXplX3QgbGVuKQogewogCWZvciAoOyBsZW4gPiAwOyBsZW4tLSkKQEAgLTQ4MSwxMCArNDkwLDEyIEBACiAJCXVpbnQxNl90IGNvbHVtbiwgaW50IHBhZ2VfYWRkcikKIHsKIAl1aW50MTZfdCBjbWQ7Ci0JaW50IGFkZHJfY3ljbGUsIGV4ZWNfY21kLCBuZGNiMDsKLQlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGluZm8tPm10ZDsKKwlpbnQgYWRkcl9jeWNsZSwgZXhlY19jbWQ7CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3Q7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAKLQluZGNiMCA9IDA7CisJaG9zdCA9IGluZm8tPmhvc3RbaW5mby0+Y3NdOworCW10ZCA9IGhvc3QtPm10ZDsKIAlhZGRyX2N5Y2xlID0gMDsKIAlleGVjX2NtZCA9IDE7CiAKQEAgLTQ5NSw2ICs1MDYsMTAgQEAKIAlpbmZvLT51c2VfZWNjCQk9IDA7CiAJaW5mby0+aXNfcmVhZHkJCT0gMDsKIAlpbmZvLT5yZXRjb2RlCQk9IEVSUl9OT05FOworCWlmIChpbmZvLT5jcyAhPSAwKQorCQlpbmZvLT5uZGNiMCA9IE5EQ0IwX0NTRUw7CisJZWxzZQorCQlpbmZvLT5uZGNiMCA9IDA7CiAKIAlzd2l0Y2ggKGNvbW1hbmQpIHsKIAljYXNlIE5BTkRfQ01EX1JFQUQwOgpAQCAtNTEyLDIwICs1MjcsMTkgQEAKIAkJYnJlYWs7CiAJfQogCi0JaW5mby0+bmRjYjAgPSBuZGNiMDsKLQlhZGRyX2N5Y2xlID0gTkRDQjBfQUREUl9DWUMoaW5mby0+cm93X2FkZHJfY3ljbGVzCi0JCQkJICAgICsgaW5mby0+Y29sX2FkZHJfY3ljbGVzKTsKKwlhZGRyX2N5Y2xlID0gTkRDQjBfQUREUl9DWUMoaG9zdC0+cm93X2FkZHJfY3ljbGVzCisJCQkJICAgICsgaG9zdC0+Y29sX2FkZHJfY3ljbGVzKTsKIAogCXN3aXRjaCAoY29tbWFuZCkgewogCWNhc2UgTkFORF9DTURfUkVBRE9PQjoKIAljYXNlIE5BTkRfQ01EX1JFQUQwOgotCQljbWQgPSBpbmZvLT5jbWRzZXQtPnJlYWQxOworCQljbWQgPSBob3N0LT5jbWRzZXQtPnJlYWQxOwogCQlpZiAoY29tbWFuZCA9PSBOQU5EX0NNRF9SRUFET09CKQogCQkJaW5mby0+YnVmX3N0YXJ0ID0gbXRkLT53cml0ZXNpemUgKyBjb2x1bW47CiAJCWVsc2UKIAkJCWluZm8tPmJ1Zl9zdGFydCA9IGNvbHVtbjsKIAotCQlpZiAodW5saWtlbHkoaW5mby0+cGFnZV9zaXplIDwgUEFHRV9DSFVOS19TSVpFKSkKKwkJaWYgKHVubGlrZWx5KGhvc3QtPnBhZ2Vfc2l6ZSA8IFBBR0VfQ0hVTktfU0laRSkpCiAJCQlpbmZvLT5uZGNiMCB8PSBORENCMF9DTURfVFlQRSgwKQogCQkJCQl8IGFkZHJfY3ljbGUKIAkJCQkJfCAoY21kICYgTkRDQjBfQ01EMV9NQVNLKTsKQEAgLTUzNyw3ICs1NTEsNyBAQAogCiAJY2FzZSBOQU5EX0NNRF9TRVFJTjoKIAkJLyogc21hbGwgcGFnZSBhZGRyIHNldHRpbmcgKi8KLQkJaWYgKHVubGlrZWx5KGluZm8tPnBhZ2Vfc2l6ZSA8IFBBR0VfQ0hVTktfU0laRSkpIHsKKwkJaWYgKHVubGlrZWx5KGhvc3QtPnBhZ2Vfc2l6ZSA8IFBBR0VfQ0hVTktfU0laRSkpIHsKIAkJCWluZm8tPm5kY2IxID0gKChwYWdlX2FkZHIgJiAweEZGRkZGRikgPDwgOCkKIAkJCQkJfCAoY29sdW1uICYgMHhGRik7CiAKQEAgLTU2NCw3ICs1NzgsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQljbWQgPSBpbmZvLT5jbWRzZXQtPnByb2dyYW07CisJCWNtZCA9IGhvc3QtPmNtZHNldC0+cHJvZ3JhbTsKIAkJaW5mby0+bmRjYjAgfD0gTkRDQjBfQ01EX1RZUEUoMHgxKQogCQkJCXwgTkRDQjBfQVVUT19SUwogCQkJCXwgTkRDQjBfU1RfUk9XX0VOCkBAIC01NzQsOCArNTg4LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIE5BTkRfQ01EX1JFQURJRDoKLQkJY21kID0gaW5mby0+Y21kc2V0LT5yZWFkX2lkOwotCQlpbmZvLT5idWZfY291bnQgPSBpbmZvLT5yZWFkX2lkX2J5dGVzOworCQljbWQgPSBob3N0LT5jbWRzZXQtPnJlYWRfaWQ7CisJCWluZm8tPmJ1Zl9jb3VudCA9IGhvc3QtPnJlYWRfaWRfYnl0ZXM7CiAJCWluZm8tPm5kY2IwIHw9IE5EQ0IwX0NNRF9UWVBFKDMpCiAJCQkJfCBORENCMF9BRERSX0NZQygxKQogCQkJCXwgY21kOwpAQCAtNTgzLDcgKzU5Nyw3IEBACiAJCWluZm8tPmRhdGFfc2l6ZSA9IDg7CiAJCWJyZWFrOwogCWNhc2UgTkFORF9DTURfU1RBVFVTOgotCQljbWQgPSBpbmZvLT5jbWRzZXQtPnJlYWRfc3RhdHVzOworCQljbWQgPSBob3N0LT5jbWRzZXQtPnJlYWRfc3RhdHVzOwogCQlpbmZvLT5idWZfY291bnQgPSAxOwogCQlpbmZvLT5uZGNiMCB8PSBORENCMF9DTURfVFlQRSg0KQogCQkJCXwgTkRDQjBfQUREUl9DWUMoMSkKQEAgLTU5Myw3ICs2MDcsNyBAQAogCQlicmVhazsKIAogCWNhc2UgTkFORF9DTURfRVJBU0UxOgotCQljbWQgPSBpbmZvLT5jbWRzZXQtPmVyYXNlOworCQljbWQgPSBob3N0LT5jbWRzZXQtPmVyYXNlOwogCQlpbmZvLT5uZGNiMCB8PSBORENCMF9DTURfVFlQRSgyKQogCQkJCXwgTkRDQjBfQVVUT19SUwogCQkJCXwgTkRDQjBfQUREUl9DWUMoMykKQEAgLTYwNCw3ICs2MTgsNyBAQAogCiAJCWJyZWFrOwogCWNhc2UgTkFORF9DTURfUkVTRVQ6Ci0JCWNtZCA9IGluZm8tPmNtZHNldC0+cmVzZXQ7CisJCWNtZCA9IGhvc3QtPmNtZHNldC0+cmVzZXQ7CiAJCWluZm8tPm5kY2IwIHw9IE5EQ0IwX0NNRF9UWVBFKDUpCiAJCQkJfCBjbWQ7CiAKQEAgLTYxNiw4ICs2MzAsOCBAQAogCiAJZGVmYXVsdDoKIAkJZXhlY19jbWQgPSAwOwotCQlwcmludGsoS0VSTl9FUlIgInB4YTN4eC1uYW5kOiBub24tc3VwcG9ydGVkIgotCQkJIiBjb21tYW5kICV4XG4iLCBjb21tYW5kKTsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAibm9uLXN1cHBvcnRlZCBjb21tYW5kICV4XG4iLAorCQkJCWNvbW1hbmQpOwogCQlicmVhazsKIAl9CiAKQEAgLTYyNyw3ICs2NDEsOCBAQAogc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfY21kZnVuYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgY29tbWFuZCwKIAkJCQlpbnQgY29sdW1uLCBpbnQgcGFnZV9hZGRyKQogewotCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0ID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gaG9zdC0+aW5mb19kYXRhOwogCWludCByZXQsIGV4ZWNfY21kOwogCiAJLyoKQEAgLTYzNSw5ICs2NTAsMjEgQEAKIAkgKiAiYnl0ZSIgYWRkcmVzcyBpbnRvIGEgIndvcmQiIGFkZHJlc3MgYXBwcm9wcmlhdGUKIAkgKiBmb3IgaW5kZXhpbmcgYSB3b3JkLW9yaWVudGVkIGRldmljZQogCSAqLwotCWlmIChpbmZvLT5yZWdfbmRjciAmIE5EQ1JfRFdJRFRIX00pCisJaWYgKGhvc3QtPnJlZ19uZGNyICYgTkRDUl9EV0lEVEhfTSkKIAkJY29sdW1uIC89IDI7CiAKKwkvKgorCSAqIFRoZXJlIG1heSBiZSBkaWZmZXJlbnQgTkFORCBjaGlwIGhvb2tlZCB0bworCSAqIGRpZmZlcmVudCBjaGlwIHNlbGVjdCwgc28gY2hlY2sgd2hldGhlcgorCSAqIGNoaXAgc2VsZWN0IGhhcyBiZWVuIGNoYW5nZWQsIGlmIHllcywgcmVzZXQgdGhlIHRpbWluZworCSAqLworCWlmIChpbmZvLT5jcyAhPSBob3N0LT5jcykgeworCQlpbmZvLT5jcyA9IGhvc3QtPmNzOworCQluYW5kX3dyaXRlbChpbmZvLCBORFRSMENTMCwgaG9zdC0+bmR0cjBjczApOworCQluYW5kX3dyaXRlbChpbmZvLCBORFRSMUNTMCwgaG9zdC0+bmR0cjFjczApOworCX0KKworCWluZm8tPnN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7CiAJZXhlY19jbWQgPSBwcmVwYXJlX2NvbW1hbmRfcG9vbChpbmZvLCBjb21tYW5kLCBjb2x1bW4sIHBhZ2VfYWRkcik7CiAJaWYgKGV4ZWNfY21kKSB7CiAJCWluaXRfY29tcGxldGlvbigmaW5mby0+Y21kX2NvbXBsZXRlKTsKQEAgLTY0NiwxMiArNjczLDEyIEBACiAJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW5mby0+Y21kX2NvbXBsZXRlLAogCQkJCUNISVBfREVMQVlfVElNRU9VVCk7CiAJCWlmICghcmV0KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIldhaXQgdGltZSBvdXQhISFcbiIpOworCQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiV2FpdCB0aW1lIG91dCEhIVxuIik7CiAJCQkvKiBTdG9wIFN0YXRlIE1hY2hpbmUgZm9yIG5leHQgY29tbWFuZCBjeWNsZSAqLwogCQkJcHhhM3h4X25hbmRfc3RvcChpbmZvKTsKIAkJfQotCQlpbmZvLT5zdGF0ZSA9IFNUQVRFX0lETEU7CiAJfQorCWluZm8tPnN0YXRlID0gU1RBVEVfSURMRTsKIH0KIAogc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfd3JpdGVfcGFnZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKQEAgLTY2NCw3ICs2OTEsOCBAQAogc3RhdGljIGludCBweGEzeHhfbmFuZF9yZWFkX3BhZ2VfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsCiAJCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UpCiB7Ci0Jc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QgPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBob3N0LT5pbmZvX2RhdGE7CiAKIAljaGlwLT5yZWFkX2J1ZihtdGQsIGJ1ZiwgbXRkLT53cml0ZXNpemUpOwogCWNoaXAtPnJlYWRfYnVmKG10ZCwgY2hpcC0+b29iX3BvaSwgbXRkLT5vb2JzaXplKTsKQEAgLTY4NSw2ICs3MTMsOCBAQAogCQkgKiBPT0IsIGlnbm9yZSBzdWNoIGRvdWJsZSBiaXQgZXJyb3JzCiAJCSAqLwogCQlpZiAoaXNfYnVmX2JsYW5rKGJ1ZiwgbXRkLT53cml0ZXNpemUpKQorCQkJaW5mby0+cmV0Y29kZSA9IEVSUl9OT05FOworCQllbHNlCiAJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKIAl9CiAKQEAgLTY5Myw3ICs3MjMsOCBAQAogCiBzdGF0aWMgdWludDhfdCBweGEzeHhfbmFuZF9yZWFkX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7Ci0Jc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QgPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBob3N0LT5pbmZvX2RhdGE7CiAJY2hhciByZXR2YWwgPSAweEZGOwogCiAJaWYgKGluZm8tPmJ1Zl9zdGFydCA8IGluZm8tPmJ1Zl9jb3VudCkKQEAgLTcwNSw3ICs3MzYsOCBAQAogCiBzdGF0aWMgdTE2IHB4YTN4eF9uYW5kX3JlYWRfd29yZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKLQlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqaG9zdCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IGhvc3QtPmluZm9fZGF0YTsKIAl1MTYgcmV0dmFsID0gMHhGRkZGOwogCiAJaWYgKCEoaW5mby0+YnVmX3N0YXJ0ICYgMHgwMSkgJiYgaW5mby0+YnVmX3N0YXJ0IDwgaW5mby0+YnVmX2NvdW50KSB7CkBAIC03MTcsNyArNzQ5LDggQEAKIAogc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKIHsKLQlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqaG9zdCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IGhvc3QtPmluZm9fZGF0YTsKIAlpbnQgcmVhbF9sZW4gPSBtaW5fdChzaXplX3QsIGxlbiwgaW5mby0+YnVmX2NvdW50IC0gaW5mby0+YnVmX3N0YXJ0KTsKIAogCW1lbWNweShidWYsIGluZm8tPmRhdGFfYnVmZiArIGluZm8tPmJ1Zl9zdGFydCwgcmVhbF9sZW4pOwpAQCAtNzI3LDcgKzc2MCw4IEBACiBzdGF0aWMgdm9pZCBweGEzeHhfbmFuZF93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsCiAJCWNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKIHsKLQlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqaG9zdCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IGhvc3QtPmluZm9fZGF0YTsKIAlpbnQgcmVhbF9sZW4gPSBtaW5fdChzaXplX3QsIGxlbiwgaW5mby0+YnVmX2NvdW50IC0gaW5mby0+YnVmX3N0YXJ0KTsKIAogCW1lbWNweShpbmZvLT5kYXRhX2J1ZmYgKyBpbmZvLT5idWZfc3RhcnQsIGJ1ZiwgcmVhbF9sZW4pOwpAQCAtNzQ3LDcgKzc4MSw4IEBACiAKIHN0YXRpYyBpbnQgcHhhM3h4X25hbmRfd2FpdGZ1bmMoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMpCiB7Ci0Jc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QgPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBob3N0LT5pbmZvX2RhdGE7CiAKIAkvKiBweGEzeHhfbmFuZF9zZW5kX2NvbW1hbmQgaGFzIHdhaXRlZCBmb3IgY29tbWFuZCBjb21wbGV0ZSAqLwogCWlmICh0aGlzLT5zdGF0ZSA9PSBGTF9XUklUSU5HIHx8IHRoaXMtPnN0YXRlID09IEZMX0VSQVNJTkcpIHsKQEAgLTc3MCw1NCArODA1LDcwIEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGluZm8tPnBkZXY7CiAJc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QgPSBpbmZvLT5ob3N0W2luZm8tPmNzXTsKIAl1aW50MzJfdCBuZGNyID0gMHgwOyAvKiBlbmFibGUgYWxsIGludGVycnVwdHMgKi8KIAotCWlmIChmLT5wYWdlX3NpemUgIT0gMjA0OCAmJiBmLT5wYWdlX3NpemUgIT0gNTEyKQorCWlmIChmLT5wYWdlX3NpemUgIT0gMjA0OCAmJiBmLT5wYWdlX3NpemUgIT0gNTEyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkN1cnJlbnQgb25seSBzdXBwb3J0IDIwNDggYW5kIDUxMiBzaXplXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JaWYgKGYtPmZsYXNoX3dpZHRoICE9IDE2ICYmIGYtPmZsYXNoX3dpZHRoICE9IDgpCisJaWYgKGYtPmZsYXNoX3dpZHRoICE9IDE2ICYmIGYtPmZsYXNoX3dpZHRoICE9IDgpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiT25seSBzdXBwb3J0IDhiaXQgYW5kIDE2IGJpdCFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKiBjYWxjdWxhdGUgZmxhc2ggaW5mb3JtYXRpb24gKi8KLQlpbmZvLT5jbWRzZXQgPSAmZGVmYXVsdF9jbWRzZXQ7Ci0JaW5mby0+cGFnZV9zaXplID0gZi0+cGFnZV9zaXplOwotCWluZm8tPnJlYWRfaWRfYnl0ZXMgPSAoZi0+cGFnZV9zaXplID09IDIwNDgpID8gNCA6IDI7CisJaG9zdC0+Y21kc2V0ID0gJmRlZmF1bHRfY21kc2V0OworCWhvc3QtPnBhZ2Vfc2l6ZSA9IGYtPnBhZ2Vfc2l6ZTsKKwlob3N0LT5yZWFkX2lkX2J5dGVzID0gKGYtPnBhZ2Vfc2l6ZSA9PSAyMDQ4KSA/IDQgOiAyOwogCiAJLyogY2FsY3VsYXRlIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gKi8KLQlpbmZvLT5jb2xfYWRkcl9jeWNsZXMgPSAoZi0+cGFnZV9zaXplID09IDIwNDgpID8gMiA6IDE7CisJaG9zdC0+Y29sX2FkZHJfY3ljbGVzID0gKGYtPnBhZ2Vfc2l6ZSA9PSAyMDQ4KSA/IDIgOiAxOwogCiAJaWYgKGYtPm51bV9ibG9ja3MgKiBmLT5wYWdlX3Blcl9ibG9jayA+IDY1NTM2KQotCQlpbmZvLT5yb3dfYWRkcl9jeWNsZXMgPSAzOworCQlob3N0LT5yb3dfYWRkcl9jeWNsZXMgPSAzOwogCWVsc2UKLQkJaW5mby0+cm93X2FkZHJfY3ljbGVzID0gMjsKKwkJaG9zdC0+cm93X2FkZHJfY3ljbGVzID0gMjsKIAogCW5kY3IgfD0gKHBkYXRhLT5lbmFibGVfYXJiaXRlcikgPyBORENSX05EX0FSQl9FTiA6IDA7Ci0JbmRjciB8PSAoaW5mby0+Y29sX2FkZHJfY3ljbGVzID09IDIpID8gTkRDUl9SQV9TVEFSVCA6IDA7CisJbmRjciB8PSAoaG9zdC0+Y29sX2FkZHJfY3ljbGVzID09IDIpID8gTkRDUl9SQV9TVEFSVCA6IDA7CiAJbmRjciB8PSAoZi0+cGFnZV9wZXJfYmxvY2sgPT0gNjQpID8gTkRDUl9QR19QRVJfQkxLIDogMDsKIAluZGNyIHw9IChmLT5wYWdlX3NpemUgPT0gMjA0OCkgPyBORENSX1BBR0VfU1ogOiAwOwogCW5kY3IgfD0gKGYtPmZsYXNoX3dpZHRoID09IDE2KSA/IE5EQ1JfRFdJRFRIX00gOiAwOwogCW5kY3IgfD0gKGYtPmRmY193aWR0aCA9PSAxNikgPyBORENSX0RXSURUSF9DIDogMDsKIAotCW5kY3IgfD0gTkRDUl9SRF9JRF9DTlQoaW5mby0+cmVhZF9pZF9ieXRlcyk7CisJbmRjciB8PSBORENSX1JEX0lEX0NOVChob3N0LT5yZWFkX2lkX2J5dGVzKTsKIAluZGNyIHw9IE5EQ1JfU1BBUkVfRU47IC8qIGVuYWJsZSBzcGFyZSBieSBkZWZhdWx0ICovCiAKLQlpbmZvLT5yZWdfbmRjciA9IG5kY3I7CisJaG9zdC0+cmVnX25kY3IgPSBuZGNyOwogCi0JcHhhM3h4X25hbmRfc2V0X3RpbWluZyhpbmZvLCBmLT50aW1pbmcpOworCXB4YTN4eF9uYW5kX3NldF90aW1pbmcoaG9zdCwgZi0+dGltaW5nKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBweGEzeHhfbmFuZF9kZXRlY3RfY29uZmlnKHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvKQogeworCS8qCisJICogV2Ugc2V0IDAgYnkgaGFyZCBjb2RpbmcgaGVyZSwgZm9yIHdlIGRvbid0IHN1cHBvcnQga2VlcF9jb25maWcKKwkgKiB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY2hpcCBhdHRhY2hlZCB0byB0aGUgY29udHJvbGxlcgorCSAqLworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0ID0gaW5mby0+aG9zdFswXTsKIAl1aW50MzJfdCBuZGNyID0gbmFuZF9yZWFkbChpbmZvLCBORENSKTsKLQlpbmZvLT5wYWdlX3NpemUgPSBuZGNyICYgTkRDUl9QQUdFX1NaID8gMjA0OCA6IDUxMjsKLQkvKiBzZXQgaW5mbyBmaWVsZHMgbmVlZGVkIHRvIHJlYWQgaWQgKi8KLQlpbmZvLT5yZWFkX2lkX2J5dGVzID0gKGluZm8tPnBhZ2Vfc2l6ZSA9PSAyMDQ4KSA/IDQgOiAyOwotCWluZm8tPnJlZ19uZGNyID0gbmRjcjsKLQlpbmZvLT5jbWRzZXQgPSAmZGVmYXVsdF9jbWRzZXQ7CiAKLQlpbmZvLT5uZHRyMGNzMCA9IG5hbmRfcmVhZGwoaW5mbywgTkRUUjBDUzApOwotCWluZm8tPm5kdHIxY3MwID0gbmFuZF9yZWFkbChpbmZvLCBORFRSMUNTMCk7CisJaWYgKG5kY3IgJiBORENSX1BBR0VfU1opIHsKKwkJaG9zdC0+cGFnZV9zaXplID0gMjA0ODsKKwkJaG9zdC0+cmVhZF9pZF9ieXRlcyA9IDQ7CisJfSBlbHNlIHsKKwkJaG9zdC0+cGFnZV9zaXplID0gNTEyOworCQlob3N0LT5yZWFkX2lkX2J5dGVzID0gMjsKKwl9CisKKwlob3N0LT5yZWdfbmRjciA9IG5kY3IgJiB+TkRDUl9JTlRfTUFTSzsKKwlob3N0LT5jbWRzZXQgPSAmZGVmYXVsdF9jbWRzZXQ7CisKKwlob3N0LT5uZHRyMGNzMCA9IG5hbmRfcmVhZGwoaW5mbywgTkRUUjBDUzApOworCWhvc3QtPm5kdHIxY3MwID0gbmFuZF9yZWFkbChpbmZvLCBORFRSMUNTMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg0Nyw3ICs4OTgsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpbmZvLT5kYXRhX2J1ZmZfc2l6ZSA9IE1BWF9CVUZGX1NJWkU7CiAJaW5mby0+ZGF0YV9kZXNjID0gKHZvaWQgKilpbmZvLT5kYXRhX2J1ZmYgKyBkYXRhX2Rlc2Nfb2Zmc2V0OwogCWluZm8tPmRhdGFfZGVzY19hZGRyID0gaW5mby0+ZGF0YV9idWZmX3BoeXMgKyBkYXRhX2Rlc2Nfb2Zmc2V0OwogCkBAIC04NTUsNyArOTA1LDcgQEAKIAkJCQlweGEzeHhfbmFuZF9kYXRhX2RtYV9pcnEsIGluZm8pOwogCWlmIChpbmZvLT5kYXRhX2RtYV9jaCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgZGF0YSBkbWFcbiIpOwotCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBpbmZvLT5kYXRhX2J1ZmZfc2l6ZSwKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgTUFYX0JVRkZfU0laRSwKIAkJCQlpbmZvLT5kYXRhX2J1ZmYsIGluZm8tPmRhdGFfYnVmZl9waHlzKTsKIAkJcmV0dXJuIGluZm8tPmRhdGFfZG1hX2NoOwogCX0KQEAgLTg2NSwyNCArOTE1LDI4IEBACiAKIHN0YXRpYyBpbnQgcHhhM3h4X25hbmRfc2Vuc2luZyhzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGluZm8tPm10ZDsKLQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwotCisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisJaW50IHJldDsKKwltdGQgPSBpbmZvLT5ob3N0W2luZm8tPmNzXS0+bXRkOwogCS8qIHVzZSB0aGUgY29tbW9uIHRpbWluZyB0byBtYWtlIGEgdHJ5ICovCi0JcHhhM3h4X25hbmRfY29uZmlnX2ZsYXNoKGluZm8sICZidWlsdGluX2ZsYXNoX3R5cGVzWzBdKTsKLQljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVTRVQsIDAsIDApOworCXJldCA9IHB4YTN4eF9uYW5kX2NvbmZpZ19mbGFzaChpbmZvLCAmYnVpbHRpbl9mbGFzaF90eXBlc1swXSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXB4YTN4eF9uYW5kX2NtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRVNFVCwgMCwgMCk7CiAJaWYgKGluZm8tPmlzX3JlYWR5KQotCQlyZXR1cm4gMTsKLQllbHNlCiAJCXJldHVybiAwOworCisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKIHN0YXRpYyBpbnQgcHhhM3h4X25hbmRfc2NhbihzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKLQlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqaG9zdCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IGhvc3QtPmluZm9fZGF0YTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gaW5mby0+cGRldjsKIAlzdHJ1Y3QgcHhhM3h4X25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbmFuZF9mbGFzaF9kZXYgcHhhM3h4X2ZsYXNoX2lkc1syXSA9IHsge05VTEwsfSwge05VTEwsfSB9OworCXN0cnVjdCBuYW5kX2ZsYXNoX2RldiBweGEzeHhfZmxhc2hfaWRzWzJdLCAqZGVmID0gTlVMTDsKIAljb25zdCBzdHJ1Y3QgcHhhM3h4X25hbmRfZmxhc2ggKmYgPSBOVUxMOwogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CiAJdWludDMyX3QgaWQgPSAtMTsKQEAgLTg5MywyMiArOTQ3LDIwIEBACiAJCWdvdG8gS0VFUF9DT05GSUc7CiAKIAlyZXQgPSBweGEzeHhfbmFuZF9zZW5zaW5nKGluZm8pOwotCWlmICghcmV0KSB7Ci0JCWtmcmVlKG10ZCk7Ci0JCWluZm8tPm10ZCA9IE5VTEw7Ci0JCXByaW50ayhLRVJOX0lORk8gIlRoZXJlIGlzIG5vIG5hbmQgY2hpcCBvbiBjcyAwIVxuIik7CisJaWYgKHJldCkgeworCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LCAiVGhlcmUgaXMgbm8gY2hpcCBvbiBjcyAlZCFcbiIsCisJCQkgaW5mby0+Y3MpOwogCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFESUQsIDAsIDApOwogCWlkID0gKigodWludDE2X3QgKikoaW5mby0+ZGF0YV9idWZmKSk7CiAJaWYgKGlkICE9IDApCi0JCXByaW50ayhLRVJOX0lORk8gIkRldGVjdCBhIGZsYXNoIGlkICV4XG4iLCBpZCk7CisJCWRldl9pbmZvKCZpbmZvLT5wZGV2LT5kZXYsICJEZXRlY3QgYSBmbGFzaCBpZCAleFxuIiwgaWQpOwogCWVsc2UgewotCQlrZnJlZShtdGQpOwotCQlpbmZvLT5tdGQgPSBOVUxMOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWFkIG91dCBJRCAwLCBwb3RlbnRpYWwgdGltaW5nIHNldCB3cm9uZyEhXG4iKTsKKwkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwKKwkJCSAiUmVhZCBvdXQgSUQgMCwgcG90ZW50aWFsIHRpbWluZyBzZXQgd3JvbmchIVxuIik7CiAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTI2LDE0ICs5NzgsMTcgQEAKIAl9CiAKIAlpZiAoaSA+PSAoQVJSQVlfU0laRShidWlsdGluX2ZsYXNoX3R5cGVzKSArIHBkYXRhLT5udW1fZmxhc2ggLSAxKSkgewotCQlrZnJlZShtdGQpOwotCQlpbmZvLT5tdGQgPSBOVUxMOwotCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SISEgZmxhc2ggbm90IGRlZmluZWQhISFcbiIpOworCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJFUlJPUiEhIGZsYXNoIG5vdCBkZWZpbmVkISEhXG4iKTsKIAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlweGEzeHhfbmFuZF9jb25maWdfZmxhc2goaW5mbywgZik7CisJcmV0ID0gcHhhM3h4X25hbmRfY29uZmlnX2ZsYXNoKGluZm8sIGYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiRVJST1IhIENvbmZpZ3VyZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXB4YTN4eF9mbGFzaF9pZHNbMF0ubmFtZSA9IGYtPm5hbWU7CiAJcHhhM3h4X2ZsYXNoX2lkc1swXS5pZCA9IChmLT5jaGlwX2lkID4+IDgpICYgMHhmZmZmOwogCXB4YTN4eF9mbGFzaF9pZHNbMF0ucGFnZXNpemUgPSBmLT5wYWdlX3NpemU7CkBAIC05NDIsNjIgKzk5Nyw3OCBAQAogCXB4YTN4eF9mbGFzaF9pZHNbMF0uZXJhc2VzaXplID0gZi0+cGFnZV9zaXplICogZi0+cGFnZV9wZXJfYmxvY2s7CiAJaWYgKGYtPmZsYXNoX3dpZHRoID09IDE2KQogCQlweGEzeHhfZmxhc2hfaWRzWzBdLm9wdGlvbnMgPSBOQU5EX0JVU1dJRFRIXzE2OworCXB4YTN4eF9mbGFzaF9pZHNbMV0ubmFtZSA9IE5VTEw7CisJZGVmID0gcHhhM3h4X2ZsYXNoX2lkczsKIEtFRVBfQ09ORklHOgotCWlmIChuYW5kX3NjYW5faWRlbnQobXRkLCAxLCBweGEzeHhfZmxhc2hfaWRzKSkKKwljaGlwLT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXOworCWNoaXAtPmVjYy5zaXplID0gaG9zdC0+cGFnZV9zaXplOworCisJY2hpcC0+b3B0aW9ucyA9IE5BTkRfTk9fQVVUT0lOQ1I7CisJY2hpcC0+b3B0aW9ucyB8PSBOQU5EX05PX1JFQURSRFk7CisJaWYgKGhvc3QtPnJlZ19uZGNyICYgTkRDUl9EV0lEVEhfTSkKKwkJY2hpcC0+b3B0aW9ucyB8PSBOQU5EX0JVU1dJRFRIXzE2OworCisJaWYgKG5hbmRfc2Nhbl9pZGVudChtdGQsIDEsIGRlZikpCiAJCXJldHVybiAtRU5PREVWOwogCS8qIGNhbGN1bGF0ZSBhZGRyZXNzaW5nIGluZm9ybWF0aW9uICovCi0JaW5mby0+Y29sX2FkZHJfY3ljbGVzID0gKG10ZC0+d3JpdGVzaXplID49IDIwNDgpID8gMiA6IDE7CisJaWYgKG10ZC0+d3JpdGVzaXplID49IDIwNDgpCisJCWhvc3QtPmNvbF9hZGRyX2N5Y2xlcyA9IDI7CisJZWxzZQorCQlob3N0LT5jb2xfYWRkcl9jeWNsZXMgPSAxOworCiAJaW5mby0+b29iX2J1ZmYgPSBpbmZvLT5kYXRhX2J1ZmYgKyBtdGQtPndyaXRlc2l6ZTsKIAlpZiAoKG10ZC0+c2l6ZSA+PiBjaGlwLT5wYWdlX3NoaWZ0KSA+IDY1NTM2KQotCQlpbmZvLT5yb3dfYWRkcl9jeWNsZXMgPSAzOworCQlob3N0LT5yb3dfYWRkcl9jeWNsZXMgPSAzOwogCWVsc2UKLQkJaW5mby0+cm93X2FkZHJfY3ljbGVzID0gMjsKKwkJaG9zdC0+cm93X2FkZHJfY3ljbGVzID0gMjsKKwogCW10ZC0+bmFtZSA9IG10ZF9uYW1lc1swXTsKLQljaGlwLT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXOwotCWNoaXAtPmVjYy5zaXplID0gZi0+cGFnZV9zaXplOwotCi0JY2hpcC0+b3B0aW9ucyA9IChmLT5mbGFzaF93aWR0aCA9PSAxNikgPyBOQU5EX0JVU1dJRFRIXzE2IDogMDsKLQljaGlwLT5vcHRpb25zIHw9IE5BTkRfTk9fQVVUT0lOQ1I7Ci0JY2hpcC0+b3B0aW9ucyB8PSBOQU5EX05PX1JFQURSRFk7Ci0KIAlyZXR1cm4gbmFuZF9zY2FuX3RhaWwobXRkKTsKIH0KIAotc3RhdGljCi1zdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqYWxsb2NfbmFuZF9yZXNvdXJjZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBhbGxvY19uYW5kX3Jlc291cmNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvOworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0OwogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXA7CiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAJc3RydWN0IHJlc291cmNlICpyOwotCWludCByZXQsIGlycTsKKwlpbnQgcmV0LCBpcnEsIGNzOwogCi0JbXRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIHNpemVvZihzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyksCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIW10ZCkgeworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSArIChzaXplb2YoKm10ZCkgKworCQkgICAgICAgc2l6ZW9mKCpob3N0KSkgKiBwZGF0YS0+bnVtX2NzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpbmZvID0gKHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICopKCZtdGRbMV0pOwotCWNoaXAgPSAoc3RydWN0IG5hbmRfY2hpcCAqKSgmbXRkWzFdKTsKIAlpbmZvLT5wZGV2ID0gcGRldjsKLQlpbmZvLT5tdGQgPSBtdGQ7Ci0JbXRkLT5wcml2ID0gaW5mbzsKLQltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CisJZm9yIChjcyA9IDA7IGNzIDwgcGRhdGEtPm51bV9jczsgY3MrKykgeworCQltdGQgPSAoc3RydWN0IG10ZF9pbmZvICopKCh1bnNpZ25lZCBpbnQpJmluZm9bMV0gKworCQkgICAgICAoc2l6ZW9mKCptdGQpICsgc2l6ZW9mKCpob3N0KSkgKiBjcyk7CisJCWNoaXAgPSAoc3RydWN0IG5hbmRfY2hpcCAqKSgmbXRkWzFdKTsKKwkJaG9zdCA9IChzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqKWNoaXA7CisJCWluZm8tPmhvc3RbY3NdID0gaG9zdDsKKwkJaG9zdC0+bXRkID0gbXRkOworCQlob3N0LT5jcyA9IGNzOworCQlob3N0LT5pbmZvX2RhdGEgPSBpbmZvOworCQltdGQtPnByaXYgPSBob3N0OworCQltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQljaGlwLT5lY2MucmVhZF9wYWdlCT0gcHhhM3h4X25hbmRfcmVhZF9wYWdlX2h3ZWNjOwotCWNoaXAtPmVjYy53cml0ZV9wYWdlCT0gcHhhM3h4X25hbmRfd3JpdGVfcGFnZV9od2VjYzsKLQljaGlwLT5jb250cm9sbGVyICAgICAgICA9ICZpbmZvLT5jb250cm9sbGVyOwotCWNoaXAtPndhaXRmdW5jCQk9IHB4YTN4eF9uYW5kX3dhaXRmdW5jOwotCWNoaXAtPnNlbGVjdF9jaGlwCT0gcHhhM3h4X25hbmRfc2VsZWN0X2NoaXA7Ci0JY2hpcC0+ZGV2X3JlYWR5CQk9IHB4YTN4eF9uYW5kX2Rldl9yZWFkeTsKLQljaGlwLT5jbWRmdW5jCQk9IHB4YTN4eF9uYW5kX2NtZGZ1bmM7Ci0JY2hpcC0+cmVhZF93b3JkCQk9IHB4YTN4eF9uYW5kX3JlYWRfd29yZDsKLQljaGlwLT5yZWFkX2J5dGUJCT0gcHhhM3h4X25hbmRfcmVhZF9ieXRlOwotCWNoaXAtPnJlYWRfYnVmCQk9IHB4YTN4eF9uYW5kX3JlYWRfYnVmOwotCWNoaXAtPndyaXRlX2J1ZgkJPSBweGEzeHhfbmFuZF93cml0ZV9idWY7Ci0JY2hpcC0+dmVyaWZ5X2J1Zgk9IHB4YTN4eF9uYW5kX3ZlcmlmeV9idWY7CisJCWNoaXAtPmVjYy5yZWFkX3BhZ2UJPSBweGEzeHhfbmFuZF9yZWFkX3BhZ2VfaHdlY2M7CisJCWNoaXAtPmVjYy53cml0ZV9wYWdlCT0gcHhhM3h4X25hbmRfd3JpdGVfcGFnZV9od2VjYzsKKwkJY2hpcC0+Y29udHJvbGxlciAgICAgICAgPSAmaW5mby0+Y29udHJvbGxlcjsKKwkJY2hpcC0+d2FpdGZ1bmMJCT0gcHhhM3h4X25hbmRfd2FpdGZ1bmM7CisJCWNoaXAtPnNlbGVjdF9jaGlwCT0gcHhhM3h4X25hbmRfc2VsZWN0X2NoaXA7CisJCWNoaXAtPmNtZGZ1bmMJCT0gcHhhM3h4X25hbmRfY21kZnVuYzsKKwkJY2hpcC0+cmVhZF93b3JkCQk9IHB4YTN4eF9uYW5kX3JlYWRfd29yZDsKKwkJY2hpcC0+cmVhZF9ieXRlCQk9IHB4YTN4eF9uYW5kX3JlYWRfYnl0ZTsKKwkJY2hpcC0+cmVhZF9idWYJCT0gcHhhM3h4X25hbmRfcmVhZF9idWY7CisJCWNoaXAtPndyaXRlX2J1ZgkJPSBweGEzeHhfbmFuZF93cml0ZV9idWY7CisJCWNoaXAtPnZlcmlmeV9idWYJPSBweGEzeHhfbmFuZF92ZXJpZnlfYnVmOworCX0KIAogCXNwaW5fbG9ja19pbml0KCZjaGlwLT5jb250cm9sbGVyLT5sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGlwLT5jb250cm9sbGVyLT53cSk7CkBAIC0xMDcwLDEzICsxMTQxLDEzIEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKIAotCXJldHVybiBpbmZvOworCXJldHVybiAwOwogCiBmYWlsX2ZyZWVfYnVmOgogCWZyZWVfaXJxKGlycSwgaW5mbyk7CiAJaWYgKHVzZV9kbWEpIHsKIAkJcHhhX2ZyZWVfZG1hKGluZm8tPmRhdGFfZG1hX2NoKTsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgaW5mby0+ZGF0YV9idWZmX3NpemUsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIE1BWF9CVUZGX1NJWkUsCiAJCQlpbmZvLT5kYXRhX2J1ZmYsIGluZm8tPmRhdGFfYnVmZl9waHlzKTsKIAl9IGVsc2UKIAkJa2ZyZWUoaW5mby0+ZGF0YV9idWZmKTsKQEAgLTEwODgsMTcgKzExNTksMjEgQEAKIAljbGtfZGlzYWJsZShpbmZvLT5jbGspOwogCWNsa19wdXQoaW5mby0+Y2xrKTsKIGZhaWxfZnJlZV9tdGQ6Ci0Ja2ZyZWUobXRkKTsKLQlyZXR1cm4gTlVMTDsKKwlrZnJlZShpbmZvKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGQgPSBpbmZvLT5tdGQ7CisJc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKLQlpbnQgaXJxOworCWludCBpcnEsIGNzOwogCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gMDsKKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwpAQCAtMTEwNiw3ICsxMTgxLDcgQEAKIAkJZnJlZV9pcnEoaXJxLCBpbmZvKTsKIAlpZiAodXNlX2RtYSkgewogCQlweGFfZnJlZV9kbWEoaW5mby0+ZGF0YV9kbWFfY2gpOwotCQlkbWFfZnJlZV93cml0ZWNvbWJpbmUoJnBkZXYtPmRldiwgaW5mby0+ZGF0YV9idWZmX3NpemUsCisJCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmcGRldi0+ZGV2LCBNQVhfQlVGRl9TSVpFLAogCQkJCWluZm8tPmRhdGFfYnVmZiwgaW5mby0+ZGF0YV9idWZmX3BoeXMpOwogCX0gZWxzZQogCQlrZnJlZShpbmZvLT5kYXRhX2J1ZmYpOwpAQCAtMTExOCwxMCArMTE5Myw5IEBACiAJY2xrX2Rpc2FibGUoaW5mby0+Y2xrKTsKIAljbGtfcHV0KGluZm8tPmNsayk7CiAKLQlpZiAobXRkKSB7Ci0JCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihtdGQpOwotCQlrZnJlZShtdGQpOwotCX0KKwlmb3IgKGNzID0gMDsgY3MgPCBwZGF0YS0+bnVtX2NzOyBjcysrKQorCQluYW5kX3JlbGVhc2UoaW5mby0+aG9zdFtjc10tPm10ZCk7CisJa2ZyZWUoaW5mbyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMjksNiArMTIwMyw3IEBACiB7CiAJc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvOworCWludCByZXQsIGNzLCBwcm9iZV9zdWNjZXNzOwogCiAJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpZiAoIXBkYXRhKSB7CkBAIC0xMTM2LDUyICsxMjExLDg4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWluZm8gPSBhbGxvY19uYW5kX3Jlc291cmNlKHBkZXYpOwotCWlmIChpbmZvID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCXJldCA9IGFsbG9jX25hbmRfcmVzb3VyY2UocGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhbGxvYyBuYW5kIHJlc291cmNlIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQogCi0JaWYgKHB4YTN4eF9uYW5kX3NjYW4oaW5mby0+bXRkKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc2NhbiBuYW5kXG4iKTsKKwlpbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJcHJvYmVfc3VjY2VzcyA9IDA7CisJZm9yIChjcyA9IDA7IGNzIDwgcGRhdGEtPm51bV9jczsgY3MrKykgeworCQlpbmZvLT5jcyA9IGNzOworCQlyZXQgPSBweGEzeHhfbmFuZF9zY2FuKGluZm8tPmhvc3RbY3NdLT5tdGQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNjYW4gbmFuZCBhdCBjcyAlZFxuIiwKKwkJCQljcyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+aG9zdFtjc10tPm10ZCwgTlVMTCwgMCwKKwkJCQlwZGF0YS0+cGFydHNbY3NdLCBwZGF0YS0+bnJfcGFydHNbY3NdKTsKKwkJaWYgKCFyZXQpCisJCQlwcm9iZV9zdWNjZXNzID0gMTsKKwl9CisKKwlpZiAoIXByb2JlX3N1Y2Nlc3MpIHsKIAkJcHhhM3h4X25hbmRfcmVtb3ZlKHBkZXYpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAobXRkX2hhc19jbWRsaW5lcGFydCgpKSB7Ci0JCWNvbnN0IGNoYXIgKnByb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0JCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKLQkJaW50IG5yX3BhcnRzOwotCi0JCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBwcm9iZXMsICZwYXJ0cywgMCk7Ci0KLQkJaWYgKG5yX3BhcnRzKQotCQkJcmV0dXJuIG10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBwYXJ0cywgbnJfcGFydHMpOwotCX0KLQotCXJldHVybiBtdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOworCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGQgPSBpbmZvLT5tdGQ7CisJc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCWludCBjczsKIAorCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaWYgKGluZm8tPnN0YXRlKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImRyaXZlciBidXN5LCBzdGF0ZSA9ICVkXG4iLCBpbmZvLT5zdGF0ZSk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAorCWZvciAoY3MgPSAwOyBjcyA8IHBkYXRhLT5udW1fY3M7IGNzKyspIHsKKwkJbXRkID0gaW5mby0+aG9zdFtjc10tPm10ZDsKKwkJbXRkLT5zdXNwZW5kKG10ZCk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcHhhM3h4X25hbmRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGluZm8tPm10ZDsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisJaW50IGNzOwogCi0JbmFuZF93cml0ZWwoaW5mbywgTkRUUjBDUzAsIGluZm8tPm5kdHIwY3MwKTsKLQluYW5kX3dyaXRlbChpbmZvLCBORFRSMUNTMCwgaW5mby0+bmR0cjFjczApOwotCWNsa19lbmFibGUoaW5mby0+Y2xrKTsKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCS8qIFdlIGRvbid0IHdhbnQgdG8gaGFuZGxlIGludGVycnVwdCB3aXRob3V0IGNhbGxpbmcgbXRkIHJvdXRpbmUgKi8KKwlkaXNhYmxlX2ludChpbmZvLCBORENSX0lOVF9NQVNLKTsKKworCS8qCisJICogRGlyZWN0bHkgc2V0IHRoZSBjaGlwIHNlbGVjdCB0byBhIGludmFsaWQgdmFsdWUsCisJICogdGhlbiB0aGUgZHJpdmVyIHdvdWxkIHJlc2V0IHRoZSB0aW1pbmcgYWNjb3JkaW5nCisJICogdG8gY3VycmVudCBjaGlwIHNlbGVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGNtZGZ1bmMKKwkgKi8KKwlpbmZvLT5jcyA9IDB4ZmY7CisKKwkvKgorCSAqIEFzIHRoZSBzcGVjIHNheXMsIHRoZSBORFNSIHdvdWxkIGJlIHVwZGF0ZWQgdG8gMHgxODAwIHdoZW4KKwkgKiBkb2luZyB0aGUgbmFuZF9jbGsgZGlzYWJsZS9lbmFibGUuCisJICogVG8gcHJldmVudCBpdCBkYW1hZ2luZyBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBkcml2ZXIsIGNsZWFyCisJICogYWxsIHN0YXR1cyBiZWZvcmUgcmVzdW1lCisJICovCisJbmFuZF93cml0ZWwoaW5mbywgTkRTUiwgTkRTUl9NQVNLKTsKKwlmb3IgKGNzID0gMDsgY3MgPCBwZGF0YS0+bnVtX2NzOyBjcysrKSB7CisJCW10ZCA9IGluZm8tPmhvc3RbY3NdLT5tdGQ7CisJCW10ZC0+cmVzdW1lKG10ZCk7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3I4NTIuYyBiL2RyaXZlcnMvbXRkL25hbmQvcjg1Mi5jCmluZGV4IGNhZTJlMDEuLmYyMGYzOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcjg1Mi5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcjg1Mi5jCkBAIC0xMDI3LDcgKzEwMjcsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1pbnQgcjg1Ml9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgcjg1Ml9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3Qgcjg1Ml9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldmljZSkpOwogCkBAIC0xMDQ4LDcgKzEwNDgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcjg1Ml9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCByODUyX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IHI4NTJfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXZpY2UpKTsKIApAQCAtMTA5Miw3ICsxMDkyLDcgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHI4NTJfcGNpX2lkX3RibCk7CiAKLVNJTVBMRV9ERVZfUE1fT1BTKHI4NTJfcG1fb3BzLCByODUyX3N1c3BlbmQsIHI4NTJfcmVzdW1lKTsKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhyODUyX3BtX29wcywgcjg1Ml9zdXNwZW5kLCByODUyX3Jlc3VtZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciByODUyX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gRFJWX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3J0Y19mcm9tNC5jIGIvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYwppbmRleCBjOWY5MTI3Li5mMzA5YWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3J0Y19mcm9tNC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcnRjX2Zyb200LmMKQEAgLTM1MSw3ICszNTEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBSZWFkIHRoZSBzeW5kcm9tIHBhdHRlcm4gZnJvbSB0aGUgRlBHQSBhbmQgY29ycmVjdCB0aGUgYml0b3JkZXIgKi8KKwkvKiBSZWFkIHRoZSBzeW5kcm9tZSBwYXR0ZXJuIGZyb20gdGhlIEZQR0EgYW5kIGNvcnJlY3QgdGhlIGJpdG9yZGVyICovCiAJcnNfZWNjID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKHJ0Y19mcm9tNF9maW9fYmFzZSArIFJUQ19GUk9NNF9SU19FQ0MpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJZWNjW2ldID0gYml0cmV2OCgqcnNfZWNjKTsKQEAgLTM4MCw3ICszODAsNyBAQAogCS8qIExldCB0aGUgbGlicmFyeSBjb2RlIGRvIGl0cyBtYWdpYy4gKi8KIAlyZXMgPSBkZWNvZGVfcnM4KHJzX2RlY29kZXIsICh1aW50OF90ICopIGJ1ZiwgcGFyLCA1MTIsIHN5biwgMCwgTlVMTCwgMHhmZiwgTlVMTCk7CiAJaWYgKHJlcyA+IDApIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgInJ0Y19mcm9tNF9jb3JyZWN0X2RhdGE6ICIgIkVDQyBjb3JyZWN0ZWQgJWQgZXJyb3JzIG9uIHJlYWRcbiIsIHJlcyk7CisJCXByX2RlYnVnKCJydGNfZnJvbTRfY29ycmVjdF9kYXRhOiAiICJFQ0MgY29ycmVjdGVkICVkIGVycm9ycyBvbiByZWFkXG4iLCByZXMpOwogCX0KIAlyZXR1cm4gcmVzOwogfQpAQCAtNDQ0LDcgKzQ0NCw2IEBACiAJCWxlbiA9IG10ZC0+d3JpdGVzaXplOwogCQlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghYnVmKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInJ0Y19mcm9tNF9lcnJzdGF0OiBPdXQgb2YgbWVtb3J5IVxuIik7CiAJCQllcl9zdGF0ID0gMTsKIAkJCWdvdG8gb3V0OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYyBiL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCmluZGV4IDQ0MDU0NjguLjg2ODY4NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCkBAIC03MjMsNyArNzIzLDcgQEAKIAogCS8qIGZyZWUgdGhlIGNvbW1vbiByZXNvdXJjZXMgKi8KIAotCWlmIChpbmZvLT5jbGsgIT0gTlVMTCAmJiAhSVNfRVJSKGluZm8tPmNsaykpIHsKKwlpZiAoIUlTX0VSUihpbmZvLT5jbGspKSB7CiAJCXMzYzI0MTBfbmFuZF9jbGtfc2V0X3N0YXRlKGluZm8sIENMT0NLX0RJU0FCTEUpOwogCQljbGtfcHV0KGluZm8tPmNsayk7CiAJfQpAQCAtNzQ0LDI2ICs3NDQsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9Owogc3RhdGljIGludCBzM2MyNDEwX25hbmRfYWRkX3BhcnRpdGlvbihzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8sCiAJCQkJICAgICAgc3RydWN0IHMzYzI0MTBfbmFuZF9tdGQgKm10ZCwKIAkJCQkgICAgICBzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCAqc2V0KQogewotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0X2luZm87Ci0JaW50IG5yX3BhcnQgPSAwOworCWlmIChzZXQpCisJCW10ZC0+bXRkLm5hbWUgPSBzZXQtPm5hbWU7CiAKLQlpZiAoc2V0ID09IE5VTEwpCi0JCXJldHVybiBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZtdGQtPm10ZCwgTlVMTCwgMCk7Ci0KLQltdGQtPm10ZC5uYW1lID0gc2V0LT5uYW1lOwotCW5yX3BhcnQgPSBwYXJzZV9tdGRfcGFydGl0aW9ucygmbXRkLT5tdGQsIHBhcnRfcHJvYmVzLCAmcGFydF9pbmZvLCAwKTsKLQotCWlmIChucl9wYXJ0IDw9IDAgJiYgc2V0LT5ucl9wYXJ0aXRpb25zID4gMCkgewotCQlucl9wYXJ0ID0gc2V0LT5ucl9wYXJ0aXRpb25zOwotCQlwYXJ0X2luZm8gPSBzZXQtPnBhcnRpdGlvbnM7Ci0JfQotCi0JcmV0dXJuIG10ZF9kZXZpY2VfcmVnaXN0ZXIoJm10ZC0+bXRkLCBwYXJ0X2luZm8sIG5yX3BhcnQpOworCXJldHVybiBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKCZtdGQtPm10ZCwgTlVMTCwgMCwKKwkJCXNldC0+cGFydGl0aW9ucywgc2V0LT5ucl9wYXJ0aXRpb25zKTsKIH0KIAogLyoqCkBAIC04ODAsOCArODY5LDEwIEBACiAJLyogSWYgeW91IHVzZSB1LWJvb3QgQkJUIGNyZWF0aW9uIGNvZGUsIHNwZWNpZnlpbmcgdGhpcyBmbGFnIHdpbGwKIAkgKiBsZXQgdGhlIGtlcm5lbCBmaXNoIG91dCB0aGUgQkJUIGZyb20gdGhlIE5BTkQsIGFuZCBhbHNvIHNraXAgdGhlCiAJICogZnVsbCBOQU5EIHNjYW4gdGhhdCBjYW4gdGFrZSAxLzJzIG9yIHNvLiBMaXR0bGUgdGhpbmdzLi4uICovCi0JaWYgKHNldC0+Zmxhc2hfYmJ0KQotCQljaGlwLT5vcHRpb25zIHw9IE5BTkRfVVNFX0ZMQVNIX0JCVCB8IE5BTkRfU0tJUF9CQlRTQ0FOOworCWlmIChzZXQtPmZsYXNoX2JidCkgeworCQljaGlwLT5iYnRfb3B0aW9ucyB8PSBOQU5EX0JCVF9VU0VfRkxBU0g7CisJCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9TS0lQX0JCVFNDQU47CisJfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvc2hhcnBzbC5jIGIvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMKaW5kZXggMTllMjRlZC4uNjE5ZDJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMKQEAgLTEwMywxNiArMTAzLDEyIEBACiAJcmV0dXJuIHJlYWRiKHNoYXJwc2wtPmlvICsgRUNDQ05UUikgIT0gMDsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogLyoKICAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzaGFycHNsX25hbmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpzaGFycHNsX3BhcnRpdGlvbl9pbmZvOwotCWludCBucl9wYXJ0aXRpb25zOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3Qgc2hhcnBzbF9uYW5kICpzaGFycHNsOwpAQCAtMTg0LDE0ICsxODAsOSBAQAogCiAJLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KIAlzaGFycHNsLT5tdGQubmFtZSA9ICJzaGFycHNsLW5hbmQiOwotCW5yX3BhcnRpdGlvbnMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucygmc2hhcnBzbC0+bXRkLCBwYXJ0X3Byb2JlcywgJnNoYXJwc2xfcGFydGl0aW9uX2luZm8sIDApOwotCWlmIChucl9wYXJ0aXRpb25zIDw9IDApIHsKLQkJbnJfcGFydGl0aW9ucyA9IGRhdGEtPm5yX3BhcnRpdGlvbnM7Ci0JCXNoYXJwc2xfcGFydGl0aW9uX2luZm8gPSBkYXRhLT5wYXJ0aXRpb25zOwotCX0KIAotCWVyciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJnNoYXJwc2wtPm10ZCwgc2hhcnBzbF9wYXJ0aXRpb25faW5mbywKLQkJCQkgIG5yX3BhcnRpdGlvbnMpOworCWVyciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoJnNoYXJwc2wtPm10ZCwgTlVMTCwgMCwKKwkJCWRhdGEtPnBhcnRpdGlvbnMsIGRhdGEtPm5yX3BhcnRpdGlvbnMpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2FkZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9zbV9jb21tb24uYyBiL2RyaXZlcnMvbXRkL25hbmQvc21fY29tbW9uLmMKaW5kZXggYjYzMzJlOC4uMzJhZTVhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9zbV9jb21tb24uYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3NtX2NvbW1vbi5jCkBAIC04LDYgKzgsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJzbV9jb21tb24uaCIKIAogc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBuYW5kX29vYl9zbSA9IHsKQEAgLTQ3LDcgKzQ4LDcgQEAKIAogCS8qIEFzIGxvbmcgYXMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXJhc2UgYmxvY2sgYm91bmRhcmllcwogCQlpdCB3aWxsIHdvcmsgY29ycmVjdGx5IGZvciAyNTYgYnl0ZSBuYW5kICovCi0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gTVREX09QU19QTEFDRV9PT0I7CiAJb3BzLm9vYm9mZnMgPSAwOwogCW9wcy5vb2JsZW4gPSBtdGQtPm9vYnNpemU7CiAJb3BzLm9vYmJ1ZiA9ICh2b2lkICopJm9vYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvc29jcmF0ZXNfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9zb2NyYXRlc19uYW5kLmMKaW5kZXggY2EyZDA1NS4uMGZiMjRmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9zb2NyYXRlc19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9zb2NyYXRlc19uYW5kLmMKQEAgLTE1NSw4ICsxNTUsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCiAvKgogICogUHJvYmUgZm9yIHRoZSBOQU5EIGRldmljZS4KICAqLwpAQCAtMTY2LDggKzE2NCw3IEBACiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9jaGlwOwogCWludCByZXM7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRpdGlvbnMgPSBOVUxMOwotCWludCBudW1fcGFydGl0aW9ucyA9IDA7CisJc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhIHBwZGF0YTsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRldmljZSBzdHJ1Y3R1cmUgKGFuZCB6ZXJvIGl0KSAqLwogCWhvc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc29jcmF0ZXNfbmFuZF9ob3N0KSwgR0ZQX0tFUk5FTCk7CkBAIC0xOTMsNiArMTkwLDcgQEAKIAltdGQtPm5hbWUgPSAic29jcmF0ZXNfbmFuZCI7CiAJbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwogCW10ZC0+ZGV2LnBhcmVudCA9ICZvZmRldi0+ZGV2OworCXBwZGF0YS5vZl9ub2RlID0gb2ZkZXYtPmRldi5vZl9ub2RlOwogCiAJLypzaG91bGQgbmV2ZXIgYmUgYWNjZXNzZWQgZGlyZWN0bHkgKi8KIAluYW5kX2NoaXAtPklPX0FERFJfUiA9ICh2b2lkICopMHhkZWFkYmVlZjsKQEAgLTIyNSwzMCArMjIzLDEwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwotCW51bV9wYXJ0aXRpb25zID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0X3Byb2JlcywKLQkJCQkJICAgICAgJnBhcnRpdGlvbnMsIDApOwotCWlmIChudW1fcGFydGl0aW9ucyA8IDApIHsKLQkJcmVzID0gbnVtX3BhcnRpdGlvbnM7Ci0JCWdvdG8gcmVsZWFzZTsKLQl9Ci0jZW5kaWYKLQotCWlmIChudW1fcGFydGl0aW9ucyA9PSAwKSB7Ci0JCW51bV9wYXJ0aXRpb25zID0gb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMoJm9mZGV2LT5kZXYsCi0JCQkJCQkJIG9mZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJCQkgJnBhcnRpdGlvbnMpOwotCQlpZiAobnVtX3BhcnRpdGlvbnMgPCAwKSB7Ci0JCQlyZXMgPSBudW1fcGFydGl0aW9uczsKLQkJCWdvdG8gcmVsZWFzZTsKLQkJfQotCX0KLQotCXJlcyA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBwYXJ0aXRpb25zLCBudW1fcGFydGl0aW9ucyk7CisJcmVzID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIE5VTEwsICZwcGRhdGEsIE5VTEwsIDApOwogCWlmICghcmVzKQogCQlyZXR1cm4gcmVzOwogCi1yZWxlYXNlOgogCW5hbmRfcmVsZWFzZShtdGQpOwogCiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3RtaW9fbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC90bWlvX25hbmQuYwppbmRleCAxMWU4MzcxLi5iZWViZDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3RtaW9fbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvdG1pb19uYW5kLmMKQEAgLTEyMSw5ICsxMjEsNiBAQAogCiAjZGVmaW5lIG10ZF90b190bWlvKG0pCQkJY29udGFpbmVyX29mKG0sIHN0cnVjdCB0bWlvX25hbmQsIG10ZCkKIAotI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwotc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLSNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMzgxLDggKzM3OCw2IEBACiAJc3RydWN0IHRtaW9fbmFuZCAqdG1pbzsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kX2NoaXA7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCWludCBuYnBhcnRzID0gMDsKIAlpbnQgcmV0dmFsOwogCiAJaWYgKGRhdGEgPT0gTlVMTCkKQEAgLTQ2MSwxNSArNDU2LDkgQEAKIAkJZ290byBlcnJfc2NhbjsKIAl9CiAJLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLQluYnBhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0X3Byb2JlcywgJnBhcnRzLCAwKTsKLSNlbmRpZgotCWlmIChuYnBhcnRzIDw9IDAgJiYgZGF0YSkgewotCQlwYXJ0cyA9IGRhdGEtPnBhcnRpdGlvbjsKLQkJbmJwYXJ0cyA9IGRhdGEtPm51bV9wYXJ0aXRpb25zOwotCX0KLQotCXJldHZhbCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBwYXJ0cywgbmJwYXJ0cyk7CisJcmV0dmFsID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIE5VTEwsIDAsCisJCQlkYXRhID8gZGF0YS0+cGFydGl0aW9uIDogTlVMTCwKKwkJCWRhdGEgPyBkYXRhLT5udW1fcGFydGl0aW9ucyA6IDApOwogCWlmICghcmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3R4eDluZGZtYy5jIGIvZHJpdmVycy9tdGQvbmFuZC90eHg5bmRmbWMuYwppbmRleCBiZmJhNGUzLi5hY2U0NmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3R4eDluZGZtYy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvdHh4OW5kZm1jLmMKQEAgLTc0LDcgKzc0LDYgQEAKIAl1bnNpZ25lZCBjaGFyIGhvbGQ7CS8qIGluIGdidXNjbG9jayAqLwogCXVuc2lnbmVkIGNoYXIgc3B3OwkvKiBpbiBnYnVzY2xvY2sgKi8KIAlzdHJ1Y3QgbmFuZF9od19jb250cm9sIGh3X2NvbnRyb2w7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzW01BWF9UWFg5TkRGTUNfREVWXTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptdGRfdG9fcGxhdGRldihzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKQEAgLTI4Nyw3ICsyODYsNiBAQAogc3RhdGljIGludCBfX2luaXQgdHh4OW5kZm1jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdHh4OW5kZm1jX3BsYXRmb3JtX2RhdGEgKnBsYXQgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0YXRpYyBjb25zdCBjaGFyICpwcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwogCWludCBob2xkLCBzcHc7CiAJaW50IGk7CiAJc3RydWN0IHR4eDluZGZtY19kcnZkYXRhICpkcnZkYXRhOwpAQCAtMzMzLDcgKzMzMSw2IEBACiAJCXN0cnVjdCB0eHg5bmRmbWNfcHJpdiAqdHh4OV9wcml2OwogCQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwOwogCQlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKLQkJaW50IG5yX3BhcnRzOwogCiAJCWlmICghKHBsYXQtPmNoX21hc2sgJiAoMSA8PCBpKSkpCiAJCQljb250aW51ZTsKQEAgLTM5Myw5ICszOTAsNyBAQAogCQl9CiAJCW10ZC0+bmFtZSA9IHR4eDlfcHJpdi0+bXRkbmFtZTsKIAotCQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgcHJvYmVzLAotCQkJCQkJJmRydmRhdGEtPnBhcnRzW2ldLCAwKTsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIGRydmRhdGEtPnBhcnRzW2ldLCBucl9wYXJ0cyk7CisJCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwLCBOVUxMLCAwKTsKIAkJZHJ2ZGF0YS0+bXRkc1tpXSA9IG10ZDsKIAl9CiAKQEAgLTQyMSw3ICs0MTYsNiBAQAogCQl0eHg5X3ByaXYgPSBjaGlwLT5wcml2OwogCiAJCW5hbmRfcmVsZWFzZShtdGQpOwotCQlrZnJlZShkcnZkYXRhLT5wYXJ0c1tpXSk7CiAJCWtmcmVlKHR4eDlfcHJpdi0+bXRkbmFtZSk7CiAJCWtmcmVlKHR4eDlfcHJpdik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmZ0bGNvcmUuYyBiL2RyaXZlcnMvbXRkL25mdGxjb3JlLmMKaW5kZXggYjE1NTY2Ni4uY2RhNzdiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmZ0bGNvcmUuYworKysgYi9kcml2ZXJzL210ZC9uZnRsY29yZS5jCkBAIC02MywxNCArNjMsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJORlRMOiBhZGRfbXRkIGZvciAlc1xuIiwgbXRkLT5uYW1lKTsKKwlwcl9kZWJ1ZygiTkZUTDogYWRkX210ZCBmb3IgJXNcbiIsIG10ZC0+bmFtZSk7CiAKIAluZnRsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IE5GVExyZWNvcmQpLCBHRlBfS0VSTkVMKTsKIAotCWlmICghbmZ0bCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlRMOiBvdXQgb2YgbWVtb3J5IGZvciBkYXRhIHN0cnVjdHVyZXNcbiIpOworCWlmICghbmZ0bCkKIAkJcmV0dXJuOwotCX0KIAogCW5mdGwtPm1iZC5tdGQgPSBtdGQ7CiAJbmZ0bC0+bWJkLmRldm51bSA9IC0xOwpAQCAtMTMyLDcgKzEzMCw3IEBACiB7CiAJc3RydWN0IE5GVExyZWNvcmQgKm5mdGwgPSAodm9pZCAqKWRldjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJORlRMOiByZW1vdmVfZGV2IChpPSVkKVxuIiwgZGV2LT5kZXZudW0pOworCXByX2RlYnVnKCJORlRMOiByZW1vdmVfZGV2IChpPSVkKVxuIiwgZGV2LT5kZXZudW0pOwogCiAJZGVsX210ZF9ibGt0cmFuc19kZXYoZGV2KTsKIAlrZnJlZShuZnRsLT5SZXBsVW5pdFRhYmxlKTsKQEAgLTE0OSw3ICsxNDcsNyBAQAogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJlczsKIAotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5vb2JvZmZzID0gb2ZmcyAmIG1hc2s7CiAJb3BzLm9vYmxlbiA9IGxlbjsKIAlvcHMub29iYnVmID0gYnVmOwpAQCAtMTcwLDcgKzE2OCw3IEBACiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmVzOwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gTVREX09QU19QTEFDRV9PT0I7CiAJb3BzLm9vYm9mZnMgPSBvZmZzICYgbWFzazsKIAlvcHMub29ibGVuID0gbGVuOwogCW9wcy5vb2JidWYgPSBidWY7CkBAIC0xOTMsNyArMTkxLDcgQEAKIAlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCWludCByZXM7CiAKLQlvcHMubW9kZSA9IE1URF9PT0JfUExBQ0U7CisJb3BzLm1vZGUgPSBNVERfT1BTX1BMQUNFX09PQjsKIAlvcHMub29ib2ZmcyA9IG9mZnMgJiBtYXNrOwogCW9wcy5vb2JsZW4gPSBtdGQtPm9vYnNpemU7CiAJb3BzLm9vYmJ1ZiA9IG9vYjsKQEAgLTIyMCw3ICsyMTgsNyBAQAogCiAJLyogTm9ybWFsbHksIHdlIGZvcmNlIGEgZm9sZCB0byBoYXBwZW4gYmVmb3JlIHdlIHJ1biBvdXQgb2YgZnJlZSBibG9ja3MgY29tcGxldGVseSAqLwogCWlmICghZGVzcGVyYXRlICYmIG5mdGwtPm51bWZyZWVFVU5zIDwgMikgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiTkZUTF9maW5kZnJlZWJsb2NrOiB0aGVyZSBhcmUgdG9vIGZldyBmcmVlIEVVTnNcbiIpOworCQlwcl9kZWJ1ZygiTkZUTF9maW5kZnJlZWJsb2NrOiB0aGVyZSBhcmUgdG9vIGZldyBmcmVlIEVVTnNcbiIpOwogCQlyZXR1cm4gQkxPQ0tfTklMOwogCX0KIApAQCAtMjkxLDggKzI4OSw3IEBACiAJCQlpZiAoYmxvY2sgPT0gMikgewogCQkJCWZvbGRtYXJrID0gb29iLnUuYy5Gb2xkTWFyayB8IG9vYi51LmMuRm9sZE1hcmsxOwogCQkJCWlmIChmb2xkbWFyayA9PSBGT0xEX01BUktfSU5fUFJPR1JFU1MpIHsKLQkJCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwKLQkJCQkJICAgICAgIldyaXRlIEluaGliaXRlZCBvbiBFVU4gJWRcbiIsIHRoaXNFVU4pOworCQkJCQlwcl9kZWJ1ZygiV3JpdGUgSW5oaWJpdGVkIG9uIEVVTiAlZFxuIiwgdGhpc0VVTik7CiAJCQkJCWlucGxhY2UgPSAwOwogCQkJCX0gZWxzZSB7CiAJCQkJCS8qIFRoZXJlJ3Mgbm8gb3RoZXIgcmVhc29uIG5vdCB0byBkbyBpbnBsYWNlLApAQCAtMzU3LDcgKzM1NCw3IEBACiAJCQlpZiAoQmxvY2tMYXN0U3RhdGVbYmxvY2tdICE9IFNFQ1RPUl9GUkVFICYmCiAJCQkgICAgQmxvY2tNYXBbYmxvY2tdICE9IEJMT0NLX05JTCAmJgogCQkJICAgIEJsb2NrTWFwW2Jsb2NrXSAhPSB0YXJnZXRFVU4pIHsKLQkJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiU2V0dGluZyBpbnBsYWNlIHRvIDAuIFZVQyAlZCwgIgorCQkJCXByX2RlYnVnKCJTZXR0aW5nIGlucGxhY2UgdG8gMC4gVlVDICVkLCAiCiAJCQkJICAgICAgImJsb2NrICVkIHdhcyAleCBsYXN0RVVOLCAiCiAJCQkJICAgICAgImFuZCBpcyBpbiBFVU4gJWQgKCVzKSAlZFxuIiwKIAkJCQkgICAgICB0aGlzVlVDLCBibG9jaywgQmxvY2tMYXN0U3RhdGVbYmxvY2tdLApAQCAtMzczLDE0ICszNzAsMTQgQEAKIAkJICAgIHBlbmRpbmdibG9jayA8ICgodGhpc1ZVQyArIDEpKiAobmZ0bC0+RXJhc2VTaXplIC8gNTEyKSkgJiYKIAkJICAgIEJsb2NrTGFzdFN0YXRlW3BlbmRpbmdibG9jayAtICh0aGlzVlVDICogKG5mdGwtPkVyYXNlU2l6ZSAvIDUxMikpXSAhPQogCQkgICAgU0VDVE9SX0ZSRUUpIHsKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJQZW5kaW5nIHdyaXRlIG5vdCBmcmVlIGluIEVVTiAlZC4gIgorCQkJcHJfZGVidWcoIlBlbmRpbmcgd3JpdGUgbm90IGZyZWUgaW4gRVVOICVkLiAiCiAJCQkgICAgICAiRm9sZGluZyBvdXQgb2YgcGxhY2UuXG4iLCB0YXJnZXRFVU4pOwogCQkJaW5wbGFjZSA9IDA7CiAJCX0KIAl9CiAKIAlpZiAoIWlucGxhY2UpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIkNhbm5vdCBmb2xkIFZpcnR1YWwgVW5pdCBDaGFpbiAlZCBpbiBwbGFjZS4gIgorCQlwcl9kZWJ1ZygiQ2Fubm90IGZvbGQgVmlydHVhbCBVbml0IENoYWluICVkIGluIHBsYWNlLiAiCiAJCSAgICAgICJUcnlpbmcgb3V0LW9mLXBsYWNlXG4iLCB0aGlzVlVDKTsKIAkJLyogV2UgbmVlZCB0byBmaW5kIGEgdGFyZ2V0RVVOIHRvIGZvbGQgaW50by4gKi8KIAkJdGFyZ2V0RVVOID0gTkZUTF9maW5kZnJlZWJsb2NrKG5mdGwsIDEpOwpAQCAtNDEwLDcgKzQwNyw3IEBACiAJICAgYW5kIHRoZSBFcmFzZSBVbml0IGludG8gd2hpY2ggd2UgYXJlIHN1cHBvc2VkIHRvIGJlIGNvcHlpbmcuCiAJICAgR28gZm9yIGl0LgogCSovCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMSwiRm9sZGluZyBjaGFpbiAlZCBpbnRvIHVuaXQgJWRcbiIsIHRoaXNWVUMsIHRhcmdldEVVTik7CisJcHJfZGVidWcoIkZvbGRpbmcgY2hhaW4gJWQgaW50byB1bml0ICVkXG4iLCB0aGlzVlVDLCB0YXJnZXRFVU4pOwogCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IG5mdGwtPkVyYXNlU2l6ZSAvIDUxMiA7IGJsb2NrKyspIHsKIAkJdW5zaWduZWQgY2hhciBtb3ZlYnVmWzUxMl07CiAJCWludCByZXQ7CkBAIC00MjgsNyArNDI1LDcgQEAKIAogCQlyZXQgPSBtdGQtPnJlYWQobXRkLCAobmZ0bC0+RXJhc2VTaXplICogQmxvY2tNYXBbYmxvY2tdKSArIChibG9jayAqIDUxMiksCiAJCQkJNTEyLCAmcmV0bGVuLCBtb3ZlYnVmKTsKLQkJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FVUNMRUFOKSB7CisJCWlmIChyZXQgPCAwICYmICFtdGRfaXNfYml0ZmxpcChyZXQpKSB7CiAJCQlyZXQgPSBtdGQtPnJlYWQobXRkLCAobmZ0bC0+RXJhc2VTaXplICogQmxvY2tNYXBbYmxvY2tdKQogCQkJCQkrIChibG9jayAqIDUxMiksIDUxMiwgJnJldGxlbiwKIAkJCQkJbW92ZWJ1Zik7CkBAIC00NTcsNyArNDU0LDcgQEAKIAkgICBoYXMgZHVwbGljYXRlIGNoYWlucywgd2UgbmVlZCB0byBmcmVlIG9uZSBvZiB0aGUgY2hhaW5zIGJlY2F1c2UgaXQncyBub3QgbmVjZXNzYXJ5IGFueSBtb3JlLgogCSovCiAJdGhpc0VVTiA9IG5mdGwtPkVVTnRhYmxlW3RoaXNWVUNdOwotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsIldhbnQgdG8gZXJhc2VcbiIpOworCXByX2RlYnVnKCJXYW50IHRvIGVyYXNlXG4iKTsKIAogCS8qIEZvciBlYWNoIGJsb2NrIGluIHRoZSBvbGQgY2hhaW4gKGV4Y2VwdCB0aGUgdGFyZ2V0RVVOIG9mIGNvdXJzZSksCiAJICAgZnJlZSBpdCBhbmQgbWFrZSBpdCBhdmFpbGFibGUgZm9yIGZ1dHVyZSB1c2UgKi8KQEAgLTU3MCw3ICs1NjcsNyBAQAogCQkJCSAgICAgICh3cml0ZUVVTiAqIG5mdGwtPkVyYXNlU2l6ZSkgKyBibG9ja29mcywKIAkJCQkgICAgICA4LCAmcmV0bGVuLCAoY2hhciAqKSZiY2kpOwogCi0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiU3RhdHVzIG9mIGJsb2NrICVkIGluIEVVTiAlZCBpcyAleFxuIiwKKwkJCXByX2RlYnVnKCJTdGF0dXMgb2YgYmxvY2sgJWQgaW4gRVVOICVkIGlzICV4XG4iLAogCQkJICAgICAgYmxvY2sgLCB3cml0ZUVVTiwgbGUxNl90b19jcHUoYmNpLlN0YXR1cykpOwogCiAJCQlzdGF0dXMgPSBiY2kuU3RhdHVzIHwgYmNpLlN0YXR1czE7CkBAIC02MjMsNyArNjIwLDcgQEAKIAkJCQkgICBidXQgdGhleSBhcmUgcmVzZXJ2ZWQgZm9yIHdoZW4gd2UncmUKIAkJCQkgICBkZXNwZXJhdGUuIFdlbGwsIG5vdyB3ZSdyZSBkZXNwZXJhdGUuCiAJCQkJKi8KLQkJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiVXNpbmcgZGVzcGVyYXRlPT0xIHRvIGZpbmQgZnJlZSBFVU4gdG8gYWNjb21tb2RhdGUgd3JpdGUgdG8gVlVDICVkXG4iLCB0aGlzVlVDKTsKKwkJCQlwcl9kZWJ1ZygiVXNpbmcgZGVzcGVyYXRlPT0xIHRvIGZpbmQgZnJlZSBFVU4gdG8gYWNjb21tb2RhdGUgd3JpdGUgdG8gVlVDICVkXG4iLCB0aGlzVlVDKTsKIAkJCQl3cml0ZUVVTiA9IE5GVExfZmluZGZyZWVibG9jayhuZnRsLCAxKTsKIAkJCX0KIAkJCWlmICh3cml0ZUVVTiA9PSBCTE9DS19OSUwpIHsKQEAgLTc3Niw3ICs3NzMsNyBAQAogCQlzaXplX3QgcmV0bGVuOwogCQlpbnQgcmVzID0gbXRkLT5yZWFkKG10ZCwgcHRyLCA1MTIsICZyZXRsZW4sIGJ1ZmZlcik7CiAKLQkJaWYgKHJlcyA8IDAgJiYgcmVzICE9IC1FVUNMRUFOKQorCQlpZiAocmVzIDwgMCAmJiAhbXRkX2lzX2JpdGZsaXAocmVzKSkKIAkJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25mdGxtb3VudC5jIGIvZHJpdmVycy9tdGQvbmZ0bG1vdW50LmMKaW5kZXggZTNjZDFmZi4uYWM0MDkyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmZ0bG1vdW50LmMKKysrIGIvZHJpdmVycy9tdGQvbmZ0bG1vdW50LmMKQEAgLTMyLDcgKzMyLDcgQEAKIAogLyogZmluZF9ib290X3JlY29yZDogRmluZCB0aGUgTkZUTCBNZWRpYSBIZWFkZXIgYW5kIGl0cyBTcGFyZSBjb3B5IHdoaWNoIGNvbnRhaW5zIHRoZQogICoJdmFyaW91cyBkZXZpY2UgaW5mb3JtYXRpb24gb2YgdGhlIE5GVEwgcGFydGl0aW9uIGFuZCBCYWQgVW5pdCBUYWJsZS4gVXBkYXRlCi0gKgl0aGUgUmVwbFVuaXRUYWJsZVtdIHRhYmxlIGFjY3JvZGluZyB0byB0aGUgQmFkIFVuaXQgVGFibGUuIFJlcGxVbml0VGFibGVbXQorICoJdGhlIFJlcGxVbml0VGFibGVbXSB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIEJhZCBVbml0IFRhYmxlLiBSZXBsVW5pdFRhYmxlW10KICAqCWlzIHVzZWQgZm9yIG1hbmFnZW1lbnQgb2YgRXJhc2UgVW5pdCBpbiBvdGhlciByb3V0aW5lcyBpbiBuZnRsLmMgYW5kIG5mdGxtb3VudC5jCiAgKi8KIHN0YXRpYyBpbnQgZmluZF9ib290X3JlY29yZChzdHJ1Y3QgTkZUTHJlY29yZCAqbmZ0bCkKQEAgLTI5Nyw3ICsyOTcsNyBAQAogICoKICAqIFJldHVybjogMCB3aGVuIHN1Y2NlZWQsIC0xIG9uIGVycm9yLgogICoKLSAqICBUb0RvOiAxLiBJcyBpdCBuZWNlcmVzc2FyeSB0byBjaGVja19mcmVlX3NlY3RvciBhZnRlciBlcmFzaW5nID8/CisgKiAgVG9EbzogMS4gSXMgaXQgbmVjZXNzYXJ5IHRvIGNoZWNrX2ZyZWVfc2VjdG9yIGFmdGVyIGVyYXNpbmcgPz8KICAqLwogaW50IE5GVExfZm9ybWF0YmxvY2soc3RydWN0IE5GVExyZWNvcmQgKm5mdGwsIGludCBibG9jaykKIHsKQEAgLTMzNyw3ICszMzcsNyBAQAogCQluYl9lcmFzZXMgPSBsZTMyX3RvX2NwdSh1Y2kuV2VhckluZm8pOwogCQluYl9lcmFzZXMrKzsKIAotCQkvKiB3cmFwIChhbG1vc3QgaW1wb3NzaWJsZSB3aXRoIGN1cnJlbnQgZmxhc2hzKSBvciBmcmVlIGJsb2NrICovCisJCS8qIHdyYXAgKGFsbW9zdCBpbXBvc3NpYmxlIHdpdGggY3VycmVudCBmbGFzaCkgb3IgZnJlZSBibG9jayAqLwogCQlpZiAobmJfZXJhc2VzID09IDApCiAJCQluYl9lcmFzZXMgPSAxOwogCkBAIC0zNjMsMTAgKzM2MywxMCBAQAogICoJTWFyayBhcyAnSUdOT1JFJyBlYWNoIGluY29ycmVjdCBzZWN0b3IuIFRoaXMgY2hlY2sgaXMgb25seSBkb25lIGlmIHRoZSBjaGFpbgogICoJd2FzIGJlaW5nIGZvbGRlZCB3aGVuIE5GVEwgd2FzIGludGVycnVwdGVkLgogICoKLSAqCVRoZSBjaGVja19mcmVlX3NlY3RvcnMgaW4gdGhpcyBmdW5jdGlvbiBpcyBuZWNlcmVzc2FyeS4gVGhlcmUgaXMgYSBwb3NzaWJsZQorICoJVGhlIGNoZWNrX2ZyZWVfc2VjdG9ycyBpbiB0aGlzIGZ1bmN0aW9uIGlzIG5lY2Vzc2FyeS4gVGhlcmUgaXMgYSBwb3NzaWJsZQogICoJc2l0dWF0aW9uIHRoYXQgYWZ0ZXIgd3JpdGluZyB0aGUgRGF0YSBhcmVhLCB0aGUgQmxvY2sgQ29udHJvbCBJbmZvcm1hdGlvbiBpcwogICoJbm90IHVwZGF0ZWQgYWNjb3JkaW5nIChkdWUgdG8gcG93ZXIgZmFpbHVyZSBvciBzb21ldGhpbmcpIHdoaWNoIGxlYXZlcyB0aGUgYmxvY2sKLSAqCWluIGFuIHVtY29uc2lzdGVudCBzdGF0ZS4gU28gd2UgaGF2ZSB0byBjaGVjayBpZiBhIGJsb2NrIGlzIHJlYWxseSBGUkVFIGluIHRoaXMKKyAqCWluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gU28gd2UgaGF2ZSB0byBjaGVjayBpZiBhIGJsb2NrIGlzIHJlYWxseSBGUkVFIGluIHRoaXMKICAqCWNhc2UuICovCiBzdGF0aWMgdm9pZCBjaGVja19zZWN0b3JzX2luX2NoYWluKHN0cnVjdCBORlRMcmVjb3JkICpuZnRsLCB1bnNpZ25lZCBpbnQgZmlyc3RfYmxvY2spCiB7CkBAIC00MjgsNyArNDI4LDcgQEAKIAogCWZvciAoOzspIHsKIAkJbGVuZ3RoKys7Ci0JCS8qIGF2b2lkIGluZmluaXRlIGxvb3BzLCBhbHRob3VnaCB0aGlzIGlzIGd1YXJhbnRlZCBub3QgdG8KKwkJLyogYXZvaWQgaW5maW5pdGUgbG9vcHMsIGFsdGhvdWdoIHRoaXMgaXMgZ3VhcmFudGVlZCBub3QgdG8KIAkJICAgaGFwcGVuIGJlY2F1c2Ugb2YgdGhlIHByZXZpb3VzIGNoZWNrcyAqLwogCQlpZiAobGVuZ3RoID49IG5mdGwtPm5iX2Jsb2NrcykgewogCQkJcHJpbnRrKCJuZnRsOiBsZW5ndGggdG9vIGxvbmcgJWQgIVxuIiwgbGVuZ3RoKTsKQEAgLTQ0NywxMSArNDQ3LDExIEBACiAvKiBmb3JtYXRfY2hhaW46IEZvcm1hdCBhbiBpbnZhbGlkIFZpcnR1YWwgVW5pdCBjaGFpbi4gSXQgZnJlZXMgYWxsIHRoZSBFcmFzZSBVbml0cyBpbiBhCiAgKglWaXJ0dWFsIFVuaXQgQ2hhaW4sIGkuZS4gYWxsIHRoZSB1bml0cyBhcmUgZGlzY29ubmVjdGVkLgogICoKLSAqCUl0IGlzIG5vdCBzdHJpY2x5IGNvcnJlY3QgdG8gYmVnaW4gZnJvbSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGNoYWluIGJlY2F1c2UKKyAqCUl0IGlzIG5vdCBzdHJpY3RseSBjb3JyZWN0IHRvIGJlZ2luIGZyb20gdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBjaGFpbiBiZWNhdXNlCiAgKglpZiB3ZSBzdG9wIHRoZSBjb2RlLCB3ZSBtYXkgc2VlIGFnYWluIGEgdmFsaWQgY2hhaW4gaWYgdGhlcmUgd2FzIGEgZmlyc3RfYmxvY2sKICAqCWZsYWcgaW4gYSBibG9jayBpbnNpZGUgaXQuIEJ1dCBpcyBpdCByZWFsbHkgYSBwcm9ibGVtID8KICAqCi0gKiBGaXhNZTogRmlndXJlIG91dCB3aGF0IHRoZSBsYXN0IHN0YXRlc21lbnQgbWVhbnMuIFdoYXQgaWYgcG93ZXIgZmFpbHVyZSB3aGVuIHdlIGFyZQorICogRml4TWU6IEZpZ3VyZSBvdXQgd2hhdCB0aGUgbGFzdCBzdGF0ZW1lbnQgbWVhbnMuIFdoYXQgaWYgcG93ZXIgZmFpbHVyZSB3aGVuIHdlIGFyZQogICoJaW4gdGhlIGZvciAoOzspIGxvb3AgZm9ybWF0dGluZyBibG9ja3MgPz8KICAqLwogc3RhdGljIHZvaWQgZm9ybWF0X2NoYWluKHN0cnVjdCBORlRMcmVjb3JkICpuZnRsLCB1bnNpZ25lZCBpbnQgZmlyc3RfYmxvY2spCkBAIC00ODUsNyArNDg1LDcgQEAKICAqCXRvdGFsbHkgZnJlZSAob25seSAweGZmKS4KICAqCiAgKiBEZWZpbml0aW9uOiBGcmVlIEVyYXNlIFVuaXQgLS0gQSBwcm9wZXJseSBlcmFzZWQvZm9ybWF0dGVkIEZyZWUgRXJhc2UgVW5pdCBzaG91bGQgaGF2ZSBtZWV0IHRoZQotICoJZm9sbG93aW5nIGNyaXRpYToKKyAqCWZvbGxvd2luZyBjcml0ZXJpYToKICAqCTEuICovCiBzdGF0aWMgaW50IGNoZWNrX2FuZF9tYXJrX2ZyZWVfYmxvY2soc3RydWN0IE5GVExyZWNvcmQgKm5mdGwsIGludCBibG9jaykKIHsKQEAgLTUwMiw3ICs1MDIsNyBAQAogCWVyYXNlX21hcmsgPSBsZTE2X3RvX2NwdSAoKGgxLkVyYXNlTWFyayB8IGgxLkVyYXNlTWFyazEpKTsKIAlpZiAoZXJhc2VfbWFyayAhPSBFUkFTRV9NQVJLKSB7CiAJCS8qIGlmIG5vIGVyYXNlIG1hcmssIHRoZSBibG9jayBtdXN0IGJlIHRvdGFsbHkgZnJlZS4gVGhpcyBpcwotCQkgICBwb3NzaWJsZSBpbiB0d28gY2FzZXMgOiBlbXB0eSBmaWxzeXN0ZW0gb3IgaW50ZXJydXB0ZWQgZXJhc2UgKHZlcnkgdW5saWtlbHkpICovCisJCSAgIHBvc3NpYmxlIGluIHR3byBjYXNlcyA6IGVtcHR5IGZpbGVzeXN0ZW0gb3IgaW50ZXJydXB0ZWQgZXJhc2UgKHZlcnkgdW5saWtlbHkpICovCiAJCWlmIChjaGVja19mcmVlX3NlY3RvcnMgKG5mdGwsIGJsb2NrICogbmZ0bC0+RXJhc2VTaXplLCBuZnRsLT5FcmFzZVNpemUsIDEpICE9IDApCiAJCQlyZXR1cm4gLTE7CiAKQEAgLTU0NCw3ICs1NDQsNyBAQAogLyogZ2V0X2ZvbGRfbWFyazogUmVhZCBmb2xkIG1hcmsgZnJvbSBVbml0IENvbnRyb2wgSW5mb3JtYXRpb24gIzIsIHdlIHVzZSBGT0xEX01BUktfSU5fUFJPR1JFU1MKICAqCXRvIGluZGljYXRlIHRoYXQgd2UgYXJlIGluIHRoZSBwcm9ncmVzc2lvbiBvZiBhIFZpcnR1YWwgVW5pdCBDaGFpbiBmb2xkaW5nLiBJZiB0aGUgVUNJICMyCiAgKglpcyBGT0xEX01BUktfSU5fUFJPR1JFU1Mgd2hlbiBtb3VudGluZyB0aGUgTkZUTCwgdGhlIChwcmV2aW91cykgZm9sZGluZyBwcm9jZXNzIGlzIGludGVycnVwdGVkCi0gKglmb3Igc29tZSByZWFzb24uIEEgY2xlYW4gdXAvY2hlY2sgb2YgdGhlIFZVQyBpcyBuZWNlcmVzc2FyeSBpbiB0aGlzIGNhc2UuCisgKglmb3Igc29tZSByZWFzb24uIEEgY2xlYW4gdXAvY2hlY2sgb2YgdGhlIFZVQyBpcyBuZWNlc3NhcnkgaW4gdGhpcyBjYXNlLgogICoKICAqIFdBUk5JTkc6IHJldHVybiAwIGlmIHJlYWQgZXJyb3IKICAqLwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAJCQkJCQlwcmludGsoIkJsb2NrICVkOiBpbmNvcnJlY3QgbG9naWNhbCBibG9jazogJWQgZXhwZWN0ZWQ6ICVkXG4iLAogCQkJCQkJICAgICAgIGJsb2NrLCBsb2dpY2FsX2Jsb2NrLCBmaXJzdF9sb2dpY2FsX2Jsb2NrKTsKIAkJCQkJCS8qIHRoZSBjaGFpbiBpcyBpbmNvcnJlY3QgOiB3ZSBtdXN0IGZvcm1hdCBpdCwKLQkJCQkJCSAgIGJ1dCB3ZSBuZWVkIHRvIHJlYWQgaXQgY29tcGxldGx5ICovCisJCQkJCQkgICBidXQgd2UgbmVlZCB0byByZWFkIGl0IGNvbXBsZXRlbHkgKi8KIAkJCQkJCWRvX2Zvcm1hdF9jaGFpbiA9IDE7CiAJCQkJCX0KIAkJCQkJaWYgKGlzX2ZpcnN0X2Jsb2NrKSB7CkBAIC02NjksNyArNjY5LDcgQEAKIAkJCQkJCQlwcmludGsoIkJsb2NrICVkOiBpbmNvcnJlY3RseSBtYXJrZWQgYXMgZmlyc3QgYmxvY2sgaW4gY2hhaW5cbiIsCiAJCQkJCQkJICAgICAgIGJsb2NrKTsKIAkJCQkJCQkvKiB0aGUgY2hhaW4gaXMgaW5jb3JyZWN0IDogd2UgbXVzdCBmb3JtYXQgaXQsCi0JCQkJCQkJICAgYnV0IHdlIG5lZWQgdG8gcmVhZCBpdCBjb21wbGV0bHkgKi8KKwkJCQkJCQkgICBidXQgd2UgbmVlZCB0byByZWFkIGl0IGNvbXBsZXRlbHkgKi8KIAkJCQkJCQlkb19mb3JtYXRfY2hhaW4gPSAxOwogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlwcmludGsoIkJsb2NrICVkOiBmb2xkaW5nIGluIHByb2dyZXNzIC0gaWdub3JpbmcgZmlyc3QgYmxvY2sgZmxhZ1xuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29mcGFydC5jIGIvZHJpdmVycy9tdGQvb2ZwYXJ0LmMKaW5kZXggYTk5NjcxOC4uNjRiZThmMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29mcGFydC5jCisrKyBiL2RyaXZlcnMvbXRkL29mcGFydC5jCkBAIC0yMCwxNCArMjAsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KIAotaW50IF9fZGV2aW5pdCBvZl9tdGRfcGFyc2VfcGFydGl0aW9ucyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMpCitzdGF0aWMgaW50IHBhcnNlX29mcGFydF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLAorCQkJCSAgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLAorCQkJCSAgIHN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSAqZGF0YSkKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiAJY29uc3QgY2hhciAqcGFydG5hbWU7CiAJc3RydWN0IGRldmljZV9ub2RlICpwcDsKIAlpbnQgbnJfcGFydHMsIGk7CiAKKworCWlmICghZGF0YSkKKwkJcmV0dXJuIDA7CisKKwlub2RlID0gZGF0YS0+b2Zfbm9kZTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAwOworCiAJLyogRmlyc3QgY291bnQgdGhlIHN1Ym5vZGVzICovCiAJcHAgPSBOVUxMOwogCW5yX3BhcnRzID0gMDsKQEAgLTY5LDcgKzc4LDcgQEAKIAogCWlmICghaSkgewogCQlvZl9ub2RlX3B1dChwcCk7Ci0JCWRldl9lcnIoZGV2LCAiTm8gdmFsaWQgcGFydGl0aW9uIGZvdW5kIG9uICVzXG4iLCBub2RlLT5mdWxsX25hbWUpOworCQlwcl9lcnIoIk5vIHZhbGlkIHBhcnRpdGlvbiBmb3VuZCBvbiAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKIAkJa2ZyZWUoKnBwYXJ0cyk7CiAJCSpwcGFydHMgPSBOVUxMOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc3LDYgKzg2LDk5IEBACiAKIAlyZXR1cm4gbnJfcGFydHM7CiB9Ci1FWFBPUlRfU1lNQk9MKG9mX210ZF9wYXJzZV9wYXJ0aXRpb25zKTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydF9wYXJzZXIgb2ZwYXJ0X3BhcnNlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucGFyc2VfZm4gPSBwYXJzZV9vZnBhcnRfcGFydGl0aW9ucywKKwkubmFtZSA9ICJvZnBhcnQiLAorfTsKKworc3RhdGljIGludCBwYXJzZV9vZm9sZHBhcnRfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwKKwkJCQkgICAgICBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywKKwkJCQkgICAgICBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwlpbnQgaSwgcGxlbiwgbnJfcGFydHM7CisJY29uc3Qgc3RydWN0IHsKKwkJX19iZTMyIG9mZnNldCwgbGVuOworCX0gKnBhcnQ7CisJY29uc3QgY2hhciAqbmFtZXM7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAwOworCisJZHAgPSBkYXRhLT5vZl9ub2RlOworCWlmICghZHApCisJCXJldHVybiAwOworCisJcGFydCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInBhcnRpdGlvbnMiLCAmcGxlbik7CisJaWYgKCFwYXJ0KQorCQlyZXR1cm4gMDsgLyogTm8gcGFydGl0aW9ucyBmb3VuZCAqLworCisJcHJfd2FybmluZygiRGV2aWNlIHRyZWUgdXNlcyBvYnNvbGV0ZSBwYXJ0aXRpb24gbWFwIGJpbmRpbmc6ICVzXG4iLAorCQkJZHAtPmZ1bGxfbmFtZSk7CisKKwlucl9wYXJ0cyA9IHBsZW4gLyBzaXplb2YocGFydFswXSk7CisKKwkqcHBhcnRzID0ga3phbGxvYyhucl9wYXJ0cyAqIHNpemVvZigqKCpwcGFydHMpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcGFydHMpCisJCXJldHVybiAtRU5PTUVNOworCisJbmFtZXMgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJwYXJ0aXRpb24tbmFtZXMiLCAmcGxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFydHM7IGkrKykgeworCQkoKnBwYXJ0cylbaV0ub2Zmc2V0ID0gYmUzMl90b19jcHUocGFydC0+b2Zmc2V0KTsKKwkJKCpwcGFydHMpW2ldLnNpemUgICA9IGJlMzJfdG9fY3B1KHBhcnQtPmxlbikgJiB+MTsKKwkJLyogYml0IDAgc2V0IHNpZ25pZmllcyByZWFkIG9ubHkgcGFydGl0aW9uICovCisJCWlmIChiZTMyX3RvX2NwdShwYXJ0LT5sZW4pICYgMSkKKwkJCSgqcHBhcnRzKVtpXS5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRTsKKworCQlpZiAobmFtZXMgJiYgKHBsZW4gPiAwKSkgeworCQkJaW50IGxlbiA9IHN0cmxlbihuYW1lcykgKyAxOworCisJCQkoKnBwYXJ0cylbaV0ubmFtZSA9IChjaGFyICopbmFtZXM7CisJCQlwbGVuIC09IGxlbjsKKwkJCW5hbWVzICs9IGxlbjsKKwkJfSBlbHNlIHsKKwkJCSgqcHBhcnRzKVtpXS5uYW1lID0gInVubmFtZWQiOworCQl9CisKKwkJcGFydCsrOworCX0KKworCXJldHVybiBucl9wYXJ0czsKK30KKworc3RhdGljIHN0cnVjdCBtdGRfcGFydF9wYXJzZXIgb2ZvbGRwYXJ0X3BhcnNlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucGFyc2VfZm4gPSBwYXJzZV9vZm9sZHBhcnRfcGFydGl0aW9ucywKKwkubmFtZSA9ICJvZm9sZHBhcnQiLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb2ZwYXJ0X3BhcnNlcl9pbml0KHZvaWQpCit7CisJaW50IHJjOworCXJjID0gcmVnaXN0ZXJfbXRkX3BhcnNlcigmb2ZwYXJ0X3BhcnNlcik7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCXJjID0gcmVnaXN0ZXJfbXRkX3BhcnNlcigmb2ZvbGRwYXJ0X3BhcnNlcik7CisJaWYgKCFyYykKKwkJcmV0dXJuIDA7CisKKwlkZXJlZ2lzdGVyX210ZF9wYXJzZXIoJm9mb2xkcGFydF9wYXJzZXIpOworb3V0OgorCXJldHVybiByYzsKK30KKworbW9kdWxlX2luaXQob2ZwYXJ0X3BhcnNlcl9pbml0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYXJzZXIgZm9yIE1URCBwYXJ0aXRpb25pbmcgaW5mb3JtYXRpb24gaW4gZGV2aWNlIHRyZWUiKTsKK01PRFVMRV9BVVRIT1IoIlZpdGFseSBXb29sLCBEYXZpZCBHaWJzb24iKTsKKy8qCisgKiBXaGVuIE1URCBjb3JlIGNhbm5vdCBmaW5kIHRoZSByZXF1ZXN0ZWQgcGFyc2VyLCBpdCB0cmllcyB0byBsb2FkIHRoZSBtb2R1bGUKKyAqIHdpdGggdGhlIHNhbWUgbmFtZS4gU2luY2Ugd2UgcHJvdmlkZSB0aGUgb2ZvbGRwYXJ0IHBhcnNlciwgd2Ugc2hvdWxkIGhhdmUKKyAqIHRoZSBjb3JyZXNwb25kaW5nIGFsaWFzLgorICovCitNT0RVTEVfQUxJQVMoIm9mb2xkcGFydCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL2dlbmVyaWMuYwppbmRleCAyZDcwZDM1Li43ODEzMDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9vbmVuYW5kL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL210ZC9vbmVuYW5kL2dlbmVyaWMuYwpAQCAtMzAsMTEgKzMwLDggQEAKICAqLwogI2RlZmluZSBEUklWRVJfTkFNRQkib25lbmFuZC1mbGFzaCIKIAotc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwsICB9OwotCiBzdHJ1Y3Qgb25lbmFuZF9pbmZvIHsKIAlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydHM7CiAJc3RydWN0IG9uZW5hbmRfY2hpcAlvbmVuYW5kOwogfTsKIApAQCAtNzMsMTMgKzcwLDkgQEAKIAkJZ290byBvdXRfaW91bm1hcDsKIAl9CiAKLQllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucygmaW5mby0+bXRkLCBwYXJ0X3Byb2JlcywgJmluZm8tPnBhcnRzLCAwKTsKLQlpZiAoZXJyID4gMCkKLQkJbXRkX2RldmljZV9yZWdpc3RlcigmaW5mby0+bXRkLCBpbmZvLT5wYXJ0cywgZXJyKTsKLQllbHNlIGlmIChlcnIgPD0gMCAmJiBwZGF0YSAmJiBwZGF0YS0+cGFydHMpCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoJmluZm8tPm10ZCwgcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOwotCWVsc2UKLQkJZXJyID0gbXRkX2RldmljZV9yZWdpc3RlcigmaW5mby0+bXRkLCBOVUxMLCAwKTsKKwllcnIgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKCZpbmZvLT5tdGQsIE5VTEwsIDAsCisJCQlwZGF0YSA/IHBkYXRhLT5wYXJ0cyA6IE5VTEwsCisJCQlwZGF0YSA/IHBkYXRhLT5ucl9wYXJ0cyA6IDApOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CiAKQEAgLTEwNCw3ICs5Nyw2IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAKIAlpZiAoaW5mbykgewotCQltdGRfZGV2aWNlX3VucmVnaXN0ZXIoJmluZm8tPm10ZCk7CiAJCW9uZW5hbmRfcmVsZWFzZSgmaW5mby0+bXRkKTsKIAkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHNpemUpOwogCQlpb3VubWFwKGluZm8tPm9uZW5hbmQuYmFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMKaW5kZXggYTkxNmRlYy4uN2U5ZWE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb21hcDIuYwpAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CiAjaW5jbHVkZSA8cGxhdC9vbmVuYW5kLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+CiAKQEAgLTU3LDcgKzU3LDYgQEAKIAl1bnNpZ25lZCBsb25nIHBoeXNfYmFzZTsKIAlpbnQgZ3Bpb19pcnE7CiAJc3RydWN0IG10ZF9pbmZvIG10ZDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CiAJc3RydWN0IG9uZW5hbmRfY2hpcCBvbmVuYW5kOwogCXN0cnVjdCBjb21wbGV0aW9uIGlycV9kb25lOwogCXN0cnVjdCBjb21wbGV0aW9uIGRtYV9kb25lOwpAQCAtNjcsOCArNjYsNiBAQAogCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcjsKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMLCAgfTsKLQogc3RhdGljIHZvaWQgb21hcDJfb25lbmFuZF9kbWFfY2IoaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgb21hcDJfb25lbmFuZCAqYyA9IGRhdGE7CkBAIC03NDEsNiArNzM4LDcgQEAKIAkJYy0+cmVndWxhdG9yID0gcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAidm9uZW5hbmQiKTsKIAkJaWYgKElTX0VSUihjLT5yZWd1bGF0b3IpKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICAiRmFpbGVkIHRvIGdldCByZWd1bGF0b3JcbiIpOworCQkJciA9IFBUUl9FUlIoYy0+cmVndWxhdG9yKTsKIAkJCWdvdG8gZXJyX3JlbGVhc2VfZG1hOwogCQl9CiAJCWMtPm9uZW5hbmQuZW5hYmxlID0gb21hcDJfb25lbmFuZF9lbmFibGU7CkBAIC03NTMsMTMgKzc1MSw5IEBACiAJaWYgKChyID0gb25lbmFuZF9zY2FuKCZjLT5tdGQsIDEpKSA8IDApCiAJCWdvdG8gZXJyX3JlbGVhc2VfcmVndWxhdG9yOwogCi0JciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZjLT5tdGQsIHBhcnRfcHJvYmVzLCAmYy0+cGFydHMsIDApOwotCWlmIChyID4gMCkKLQkJciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmMtPm10ZCwgYy0+cGFydHMsIHIpOwotCWVsc2UgaWYgKHBkYXRhLT5wYXJ0cyAhPSBOVUxMKQotCQlyID0gbXRkX2RldmljZV9yZWdpc3RlcigmYy0+bXRkLCBwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7Ci0JZWxzZQotCQlyID0gbXRkX2RldmljZV9yZWdpc3RlcigmYy0+bXRkLCBOVUxMLCAwKTsKKwlyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmYy0+bXRkLCBOVUxMLCAwLAorCQkJcGRhdGEgPyBwZGF0YS0+cGFydHMgOiBOVUxMLAorCQkJcGRhdGEgPyBwZGF0YS0+bnJfcGFydHMgOiAwKTsKIAlpZiAocikKIAkJZ290byBlcnJfcmVsZWFzZV9vbmVuYW5kOwogCkBAIC03ODYsNyArNzgwLDYgQEAKIGVycl9mcmVlX2NzOgogCWdwbWNfY3NfZnJlZShjLT5ncG1jX2NzKTsKIGVycl9rZnJlZToKLQlrZnJlZShjLT5wYXJ0cyk7CiAJa2ZyZWUoYyk7CiAKIAlyZXR1cm4gcjsKQEAgLTgwOSw3ICs4MDIsNiBAQAogCWlvdW5tYXAoYy0+b25lbmFuZC5iYXNlKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oYy0+cGh5c19iYXNlLCBPTkVOQU5EX0lPX1NJWkUpOwogCWdwbWNfY3NfZnJlZShjLT5ncG1jX2NzKTsKLQlrZnJlZShjLT5wYXJ0cyk7CiAJa2ZyZWUoYyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jCmluZGV4IGFjOWU5NTkuLmE4Mzk0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2Jhc2UuYwpAQCAtMTAxNSw3ICsxMDE1LDcgQEAKIH0KIAogLyoqCi0gKiBvbmVuYW5kX3RyYW5zZmVyX2F1dG9fb29iIC0gW0ludGVybmFsXSBvb2IgYXV0by1wbGFjZW1lbnQgdHJhbnNmZXIKKyAqIG9uZW5hbmRfdHJhbnNmZXJfYXV0b19vb2IgLSBbSU5URVJOXSBvb2IgYXV0by1wbGFjZW1lbnQgdHJhbnNmZXIKICAqIEBwYXJhbSBtdGQJCU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAcGFyYW0gYnVmCQlkZXN0aW5hdGlvbiBhZGRyZXNzCiAgKiBAcGFyYW0gY29sdW1uCW9vYiBvZmZzZXQgdG8gcmVhZCBmcm9tCkBAIC0xMDc5LDcgKzEwNzksNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCiAJLyogY2hlY2sgaWYgd2UgZmFpbGVkIGR1ZSB0byB1bmNvcnJlY3RhYmxlIGVycm9yICovCi0JaWYgKHN0YXR1cyAhPSAtRUJBRE1TRyAmJiBzdGF0dXMgIT0gT05FTkFORF9CQlRfUkVBRF9FQ0NfRVJST1IpCisJaWYgKCFtdGRfaXNfZWNjZXJyKHN0YXR1cykgJiYgc3RhdHVzICE9IE9ORU5BTkRfQkJUX1JFQURfRUNDX0VSUk9SKQogCQlyZXR1cm4gc3RhdHVzOwogCiAJLyogY2hlY2sgaWYgYWRkcmVzcyBsaWVzIGluIE1MQyByZWdpb24gKi8KQEAgLTExMjIsMTAgKzExMjIsMTAgQEAKIAlpbnQgcmV0ID0gMDsKIAlpbnQgd3JpdGVzaXplID0gdGhpcy0+d3JpdGVzaXplOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBmcm9tID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKLQkgICAgICBfX2Z1bmNfXywgKHVuc2lnbmVkIGludCkgZnJvbSwgKGludCkgbGVuKTsKKwlwcl9kZWJ1ZygiJXM6IGZyb20gPSAweCUwOHgsIGxlbiA9ICVpXG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGludClmcm9tLAorCQkJKGludClsZW4pOwogCi0JaWYgKG9wcy0+bW9kZSA9PSBNVERfT09CX0FVVE8pCisJaWYgKG9wcy0+bW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQlvb2JzaXplID0gdGhpcy0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKIAllbHNlCiAJCW9vYnNpemUgPSBtdGQtPm9vYnNpemU7CkBAIC0xMTU5LDcgKzExNTksNyBAQAogCQkJaWYgKHVubGlrZWx5KHJldCkpCiAJCQkJcmV0ID0gb25lbmFuZF9yZWNvdmVyX2xzYihtdGQsIGZyb20sIHJldCk7CiAJCQlvbmVuYW5kX3VwZGF0ZV9idWZmZXJyYW0obXRkLCBmcm9tLCAhcmV0KTsKLQkJCWlmIChyZXQgPT0gLUVCQURNU0cpCisJCQlpZiAobXRkX2lzX2VjY2VycihyZXQpKQogCQkJCXJldCA9IDA7CiAJCQlpZiAocmV0KQogCQkJCWJyZWFrOwpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKIAkJCXRoaXNvb2JsZW4gPSBvb2JzaXplIC0gb29iY29sdW1uOwogCQkJdGhpc29vYmxlbiA9IG1pbl90KGludCwgdGhpc29vYmxlbiwgb29ibGVuIC0gb29icmVhZCk7CiAKLQkJCWlmIChvcHMtPm1vZGUgPT0gTVREX09PQl9BVVRPKQorCQkJaWYgKG9wcy0+bW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQkJCW9uZW5hbmRfdHJhbnNmZXJfYXV0b19vb2IobXRkLCBvb2JidWYsIG9vYmNvbHVtbiwgdGhpc29vYmxlbik7CiAJCQllbHNlCiAJCQkJdGhpcy0+cmVhZF9idWZmZXJyYW0obXRkLCBPTkVOQU5EX1NQQVJFUkFNLCBvb2JidWYsIG9vYmNvbHVtbiwgdGhpc29vYmxlbik7CkBAIC0xMjI2LDEwICsxMjI2LDEwIEBACiAJaW50IHJldCA9IDAsIGJvdW5kYXJ5ID0gMDsKIAlpbnQgd3JpdGVzaXplID0gdGhpcy0+d3JpdGVzaXplOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBmcm9tID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKLQkJCV9fZnVuY19fLCAodW5zaWduZWQgaW50KSBmcm9tLCAoaW50KSBsZW4pOworCXByX2RlYnVnKCIlczogZnJvbSA9IDB4JTA4eCwgbGVuID0gJWlcbiIsIF9fZnVuY19fLCAodW5zaWduZWQgaW50KWZyb20sCisJCQkoaW50KWxlbik7CiAKLQlpZiAob3BzLT5tb2RlID09IE1URF9PT0JfQVVUTykKKwlpZiAob3BzLT5tb2RlID09IE1URF9PUFNfQVVUT19PT0IpCiAJCW9vYnNpemUgPSB0aGlzLT5lY2NsYXlvdXQtPm9vYmF2YWlsOwogCWVsc2UKIAkJb29ic2l6ZSA9IG10ZC0+b29ic2l6ZTsKQEAgLTEyNTUsNyArMTI1NSw3IEBACiAJCQl0aGlzLT5jb21tYW5kKG10ZCwgT05FTkFORF9DTURfUkVBRCwgZnJvbSwgd3JpdGVzaXplKTsKICAJCQlyZXQgPSB0aGlzLT53YWl0KG10ZCwgRkxfUkVBRElORyk7CiAgCQkJb25lbmFuZF91cGRhdGVfYnVmZmVycmFtKG10ZCwgZnJvbSwgIXJldCk7Ci0JCQlpZiAocmV0ID09IC1FQkFETVNHKQorCQkJaWYgKG10ZF9pc19lY2NlcnIocmV0KSkKIAkJCQlyZXQgPSAwOwogIAkJfQogIAl9CkBAIC0xMjkxLDcgKzEyOTEsNyBAQAogCQkJdGhpc29vYmxlbiA9IG9vYnNpemUgLSBvb2Jjb2x1bW47CiAJCQl0aGlzb29ibGVuID0gbWluX3QoaW50LCB0aGlzb29ibGVuLCBvb2JsZW4gLSBvb2JyZWFkKTsKIAotCQkJaWYgKG9wcy0+bW9kZSA9PSBNVERfT09CX0FVVE8pCisJCQlpZiAob3BzLT5tb2RlID09IE1URF9PUFNfQVVUT19PT0IpCiAJCQkJb25lbmFuZF90cmFuc2Zlcl9hdXRvX29vYihtdGQsIG9vYmJ1Ziwgb29iY29sdW1uLCB0aGlzb29ibGVuKTsKIAkJCWVsc2UKIAkJCQl0aGlzLT5yZWFkX2J1ZmZlcnJhbShtdGQsIE9ORU5BTkRfU1BBUkVSQU0sIG9vYmJ1Ziwgb29iY29sdW1uLCB0aGlzb29ibGVuKTsKQEAgLTEzMTUsNyArMTMxNSw3IEBACiAgCQkvKiBOb3cgd2FpdCBmb3IgbG9hZCAqLwogIAkJcmV0ID0gdGhpcy0+d2FpdChtdGQsIEZMX1JFQURJTkcpOwogIAkJb25lbmFuZF91cGRhdGVfYnVmZmVycmFtKG10ZCwgZnJvbSwgIXJldCk7Ci0JCWlmIChyZXQgPT0gLUVCQURNU0cpCisJCWlmIChtdGRfaXNfZWNjZXJyKHJldCkpCiAJCQlyZXQgPSAwOwogIAl9CiAKQEAgLTEzNTEsMTkgKzEzNTEsMTkgQEAKIAlzdHJ1Y3QgbXRkX2VjY19zdGF0cyBzdGF0czsKIAlpbnQgcmVhZCA9IDAsIHRoaXNsZW4sIGNvbHVtbiwgb29ic2l6ZTsKIAlzaXplX3QgbGVuID0gb3BzLT5vb2JsZW47Ci0JbXRkX29vYl9tb2RlX3QgbW9kZSA9IG9wcy0+bW9kZTsKKwl1bnNpZ25lZCBpbnQgbW9kZSA9IG9wcy0+bW9kZTsKIAl1X2NoYXIgKmJ1ZiA9IG9wcy0+b29iYnVmOwogCWludCByZXQgPSAwLCByZWFkY21kOwogCiAJZnJvbSArPSBvcHMtPm9vYm9mZnM7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6IGZyb20gPSAweCUwOHgsIGxlbiA9ICVpXG4iLAotCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGludCkgZnJvbSwgKGludCkgbGVuKTsKKwlwcl9kZWJ1ZygiJXM6IGZyb20gPSAweCUwOHgsIGxlbiA9ICVpXG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGludClmcm9tLAorCQkJKGludClsZW4pOwogCiAJLyogSW5pdGlhbGl6ZSByZXR1cm4gbGVuZ3RoIHZhbHVlICovCiAJb3BzLT5vb2JyZXRsZW4gPSAwOwogCi0JaWYgKG1vZGUgPT0gTVREX09PQl9BVVRPKQorCWlmIChtb2RlID09IE1URF9PUFNfQVVUT19PT0IpCiAJCW9vYnNpemUgPSB0aGlzLT5lY2NsYXlvdXQtPm9vYmF2YWlsOwogCWVsc2UKIAkJb29ic2l6ZSA9IG10ZC0+b29ic2l6ZTsKQEAgLTE0MDMsMTMgKzE0MDMsMTMgQEAKIAkJaWYgKHVubGlrZWx5KHJldCkpCiAJCQlyZXQgPSBvbmVuYW5kX3JlY292ZXJfbHNiKG10ZCwgZnJvbSwgcmV0KTsKIAotCQlpZiAocmV0ICYmIHJldCAhPSAtRUJBRE1TRykgeworCQlpZiAocmV0ICYmICFtdGRfaXNfZWNjZXJyKHJldCkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlYWQgZmFpbGVkID0gMHgleFxuIiwKIAkJCQlfX2Z1bmNfXywgcmV0KTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKG1vZGUgPT0gTVREX09PQl9BVVRPKQorCQlpZiAobW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQkJb25lbmFuZF90cmFuc2Zlcl9hdXRvX29vYihtdGQsIGJ1ZiwgY29sdW1uLCB0aGlzbGVuKTsKIAkJZWxzZQogCQkJdGhpcy0+cmVhZF9idWZmZXJyYW0obXRkLCBPTkVOQU5EX1NQQVJFUkFNLCBidWYsIGNvbHVtbiwgdGhpc2xlbik7CkBAIC0xNDg3LDEwICsxNDg3LDEwIEBACiAJaW50IHJldDsKIAogCXN3aXRjaCAob3BzLT5tb2RlKSB7Ci0JY2FzZSBNVERfT09CX1BMQUNFOgotCWNhc2UgTVREX09PQl9BVVRPOgorCWNhc2UgTVREX09QU19QTEFDRV9PT0I6CisJY2FzZSBNVERfT1BTX0FVVE9fT09COgogCQlicmVhazsKLQljYXNlIE1URF9PT0JfUkFXOgorCWNhc2UgTVREX09QU19SQVc6CiAJCS8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1NzYsOCArMTU3Niw4IEBACiAJc2l6ZV90IGxlbiA9IG9wcy0+b29ibGVuOwogCXVfY2hhciAqYnVmID0gb3BzLT5vb2JidWY7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6IGZyb20gPSAweCUwOHgsIGxlbiA9ICV6aVxuIiwKLQkJX19mdW5jX18sICh1bnNpZ25lZCBpbnQpIGZyb20sIGxlbik7CisJcHJfZGVidWcoIiVzOiBmcm9tID0gMHglMDh4LCBsZW4gPSAlemlcbiIsIF9fZnVuY19fLCAodW5zaWduZWQgaW50KWZyb20sCisJCQlsZW4pOwogCiAJLyogSW5pdGlhbGl6ZSByZXR1cm4gdmFsdWUgKi8KIAlvcHMtPm9vYnJldGxlbiA9IDA7CkBAIC0xNzUwLDggKzE3NTAsOCBAQAogCS8qIFdhaXQgZm9yIGFueSBleGlzdGluZyBvcGVyYXRpb24gdG8gY2xlYXIgKi8KIAlvbmVuYW5kX3BhbmljX3dhaXQobXRkKTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogdG8gPSAweCUwOHgsIGxlbiA9ICVpXG4iLAotCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGludCkgdG8sIChpbnQpIGxlbik7CisJcHJfZGVidWcoIiVzOiB0byA9IDB4JTA4eCwgbGVuID0gJWlcbiIsIF9fZnVuY19fLCAodW5zaWduZWQgaW50KXRvLAorCQkJKGludClsZW4pOwogCiAJLyogSW5pdGlhbGl6ZSByZXRsZW4sIGluIGNhc2Ugb2YgZWFybHkgZXhpdCAqLwogCSpyZXRsZW4gPSAwOwpAQCAtMTgyMSw3ICsxODIxLDcgQEAKIH0KIAogLyoqCi0gKiBvbmVuYW5kX2ZpbGxfYXV0b19vb2IgLSBbSW50ZXJuYWxdIG9vYiBhdXRvLXBsYWNlbWVudCB0cmFuc2ZlcgorICogb25lbmFuZF9maWxsX2F1dG9fb29iIC0gW0lOVEVSTl0gb29iIGF1dG8tcGxhY2VtZW50IHRyYW5zZmVyCiAgKiBAcGFyYW0gbXRkCQlNVEQgZGV2aWNlIHN0cnVjdHVyZQogICogQHBhcmFtIG9vYl9idWYJb29iIGJ1ZmZlcgogICogQHBhcmFtIGJ1ZgkJc291cmNlIGFkZHJlc3MKQEAgLTE4ODMsOCArMTg4Myw4IEBACiAJdV9jaGFyICpvb2JidWY7CiAJaW50IHJldCA9IDAsIGNtZDsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogdG8gPSAweCUwOHgsIGxlbiA9ICVpXG4iLAotCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGludCkgdG8sIChpbnQpIGxlbik7CisJcHJfZGVidWcoIiVzOiB0byA9IDB4JTA4eCwgbGVuID0gJWlcbiIsIF9fZnVuY19fLCAodW5zaWduZWQgaW50KXRvLAorCQkJKGludClsZW4pOwogCiAJLyogSW5pdGlhbGl6ZSByZXRsZW4sIGluIGNhc2Ugb2YgZWFybHkgZXhpdCAqLwogCW9wcy0+cmV0bGVuID0gMDsKQEAgLTE5MDgsNyArMTkwOCw3IEBACiAJaWYgKCFsZW4pCiAJCXJldHVybiAwOwogCi0JaWYgKG9wcy0+bW9kZSA9PSBNVERfT09CX0FVVE8pCisJaWYgKG9wcy0+bW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQlvb2JzaXplID0gdGhpcy0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKIAllbHNlCiAJCW9vYnNpemUgPSBtdGQtPm9vYnNpemU7CkBAIC0xOTQ1LDcgKzE5NDUsNyBAQAogCQkJCS8qIFdlIHNlbmQgZGF0YSB0byBzcGFyZSByYW0gd2l0aCBvb2JzaXplCiAJCQkJICogdG8gcHJldmVudCBieXRlIGFjY2VzcyAqLwogCQkJCW1lbXNldChvb2JidWYsIDB4ZmYsIG10ZC0+b29ic2l6ZSk7Ci0JCQkJaWYgKG9wcy0+bW9kZSA9PSBNVERfT09CX0FVVE8pCisJCQkJaWYgKG9wcy0+bW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQkJCQlvbmVuYW5kX2ZpbGxfYXV0b19vb2IobXRkLCBvb2JidWYsIG9vYiwgb29iY29sdW1uLCB0aGlzb29ibGVuKTsKIAkJCQllbHNlCiAJCQkJCW1lbWNweShvb2JidWYgKyBvb2Jjb2x1bW4sIG9vYiwgdGhpc29vYmxlbik7CkBAIC0yMDU1LDcgKzIwNTUsNyBAQAogCiAKIC8qKgotICogb25lbmFuZF93cml0ZV9vb2Jfbm9sb2NrIC0gW0ludGVybmFsXSBPbmVOQU5EIHdyaXRlIG91dC1vZi1iYW5kCisgKiBvbmVuYW5kX3dyaXRlX29vYl9ub2xvY2sgLSBbSU5URVJOXSBPbmVOQU5EIHdyaXRlIG91dC1vZi1iYW5kCiAgKiBAcGFyYW0gbXRkCQlNVEQgZGV2aWNlIHN0cnVjdHVyZQogICogQHBhcmFtIHRvCQlvZmZzZXQgdG8gd3JpdGUgdG8KICAqIEBwYXJhbSBsZW4JCW51bWJlciBvZiBieXRlcyB0byB3cml0ZQpAQCAtMjA3NCwxNyArMjA3NCwxNyBAQAogCXVfY2hhciAqb29iYnVmOwogCXNpemVfdCBsZW4gPSBvcHMtPm9vYmxlbjsKIAljb25zdCB1X2NoYXIgKmJ1ZiA9IG9wcy0+b29iYnVmOwotCW10ZF9vb2JfbW9kZV90IG1vZGUgPSBvcHMtPm1vZGU7CisJdW5zaWduZWQgaW50IG1vZGUgPSBvcHMtPm1vZGU7CiAKIAl0byArPSBvcHMtPm9vYm9mZnM7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6IHRvID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKLQkJX19mdW5jX18sICh1bnNpZ25lZCBpbnQpIHRvLCAoaW50KSBsZW4pOworCXByX2RlYnVnKCIlczogdG8gPSAweCUwOHgsIGxlbiA9ICVpXG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGludCl0bywKKwkJCShpbnQpbGVuKTsKIAogCS8qIEluaXRpYWxpemUgcmV0bGVuLCBpbiBjYXNlIG9mIGVhcmx5IGV4aXQgKi8KIAlvcHMtPm9vYnJldGxlbiA9IDA7CiAKLQlpZiAobW9kZSA9PSBNVERfT09CX0FVVE8pCisJaWYgKG1vZGUgPT0gTVREX09QU19BVVRPX09PQikKIAkJb29ic2l6ZSA9IHRoaXMtPmVjY2xheW91dC0+b29iYXZhaWw7CiAJZWxzZQogCQlvb2JzaXplID0gbXRkLT5vb2JzaXplOwpAQCAtMjEyOCw3ICsyMTI4LDcgQEAKIAkJLyogV2Ugc2VuZCBkYXRhIHRvIHNwYXJlIHJhbSB3aXRoIG9vYnNpemUKIAkJICogdG8gcHJldmVudCBieXRlIGFjY2VzcyAqLwogCQltZW1zZXQob29iYnVmLCAweGZmLCBtdGQtPm9vYnNpemUpOwotCQlpZiAobW9kZSA9PSBNVERfT09CX0FVVE8pCisJCWlmIChtb2RlID09IE1URF9PUFNfQVVUT19PT0IpCiAJCQlvbmVuYW5kX2ZpbGxfYXV0b19vb2IobXRkLCBvb2JidWYsIGJ1ZiwgY29sdW1uLCB0aGlzbGVuKTsKIAkJZWxzZQogCQkJbWVtY3B5KG9vYmJ1ZiArIGNvbHVtbiwgYnVmLCB0aGlzbGVuKTsKQEAgLTIyMTcsMTAgKzIyMTcsMTAgQEAKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChvcHMtPm1vZGUpIHsKLQljYXNlIE1URF9PT0JfUExBQ0U6Ci0JY2FzZSBNVERfT09CX0FVVE86CisJY2FzZSBNVERfT1BTX1BMQUNFX09PQjoKKwljYXNlIE1URF9PUFNfQVVUT19PT0I6CiAJCWJyZWFrOwotCWNhc2UgTVREX09PQl9SQVc6CisJY2FzZSBNVERfT1BTX1JBVzoKIAkJLyogTm90IGltcGxlbWVudGVkIHlldCAqLwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI4MSw3ICsyMjgxLDcgQEAKIH0KIAogLyoqCi0gKiBvbmVuYW5kX211bHRpYmxvY2tfZXJhc2UgLSBbSW50ZXJuYWxdIGVyYXNlIGJsb2NrKHMpIHVzaW5nIG11bHRpYmxvY2sgZXJhc2UKKyAqIG9uZW5hbmRfbXVsdGlibG9ja19lcmFzZSAtIFtJTlRFUk5dIGVyYXNlIGJsb2NrKHMpIHVzaW5nIG11bHRpYmxvY2sgZXJhc2UKICAqIEBwYXJhbSBtdGQJCU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAcGFyYW0gaW5zdHIJCWVyYXNlIGluc3RydWN0aW9uCiAgKiBAcGFyYW0gcmVnaW9uCWVyYXNlIHJlZ2lvbgpAQCAtMjM5Nyw3ICsyMzk3LDcgQEAKIAogCiAvKioKLSAqIG9uZW5hbmRfYmxvY2tfYnlfYmxvY2tfZXJhc2UgLSBbSW50ZXJuYWxdIGVyYXNlIGJsb2NrKHMpIHVzaW5nIHJlZ3VsYXIgZXJhc2UKKyAqIG9uZW5hbmRfYmxvY2tfYnlfYmxvY2tfZXJhc2UgLSBbSU5URVJOXSBlcmFzZSBibG9jayhzKSB1c2luZyByZWd1bGFyIGVyYXNlCiAgKiBAcGFyYW0gbXRkCQlNVEQgZGV2aWNlIHN0cnVjdHVyZQogICogQHBhcmFtIGluc3RyCQllcmFzZSBpbnN0cnVjdGlvbgogICogQHBhcmFtIHJlZ2lvbgllcmFzZSByZWdpb24KQEAgLTI0ODksOCArMjQ4OSw5IEBACiAJc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyAqcmVnaW9uID0gTlVMTDsKIAlsb2ZmX3QgcmVnaW9uX29mZnNldCA9IDA7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6IHN0YXJ0PTB4JTAxMmxseCwgbGVuPSVsbHVcbiIsIF9fZnVuY19fLAotCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGluc3RyLT5hZGRyLCAodW5zaWduZWQgbG9uZyBsb25nKSBpbnN0ci0+bGVuKTsKKwlwcl9kZWJ1ZygiJXM6IHN0YXJ0PTB4JTAxMmxseCwgbGVuPSVsbHVcbiIsIF9fZnVuY19fLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpbnN0ci0+YWRkciwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5zdHItPmxlbik7CiAKIAkvKiBEbyBub3QgYWxsb3cgZXJhc2UgcGFzdCBlbmQgb2YgZGV2aWNlICovCiAJaWYgKHVubGlrZWx5KChsZW4gKyBhZGRyKSA+IG10ZC0+c2l6ZSkpIHsKQEAgLTI1NTgsNyArMjU1OSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIG9uZW5hbmRfc3luYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOworCXByX2RlYnVnKCIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgKi8KIAlvbmVuYW5kX2dldF9kZXZpY2UobXRkLCBGTF9TWU5DSU5HKTsKQEAgLTI2MDIsNyArMjYwMyw3IEBACiAJc3RydWN0IGJibV9pbmZvICpiYm0gPSB0aGlzLT5iYm07CiAJdV9jaGFyIGJ1ZlsyXSA9IHswLCAwfTsKIAlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzID0gewotCQkubW9kZSA9IE1URF9PT0JfUExBQ0UsCisJCS5tb2RlID0gTVREX09QU19QTEFDRV9PT0IsCiAJCS5vb2JsZW4gPSAyLAogCQkub29iYnVmID0gYnVmLAogCQkub29ib2ZmcyA9IDAsCkBAIC0yOTIyLDcgKzI5MjMsNyBAQAogfQogCiAvKioKLSAqIG9uZW5hbmRfb3RwX3dyaXRlX29vYl9ub2xvY2sgLSBbSW50ZXJuYWxdIE9uZU5BTkQgd3JpdGUgb3V0LW9mLWJhbmQsIHNwZWNpZmljIHRvIE9UUAorICogb25lbmFuZF9vdHBfd3JpdGVfb29iX25vbG9jayAtIFtJTlRFUk5dIE9uZU5BTkQgd3JpdGUgb3V0LW9mLWJhbmQsIHNwZWNpZmljIHRvIE9UUAogICogQHBhcmFtIG10ZAkJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBwYXJhbSB0bwkJb2Zmc2V0IHRvIHdyaXRlIHRvCiAgKiBAcGFyYW0gbGVuCQludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKQEAgLTMxNzAsNyArMzE3MSw3IEBACiAJCXRoaXMtPmNvbW1hbmQobXRkLCBPTkVOQU5EX0NNRF9SRVNFVCwgMCwgMCk7CiAJCXRoaXMtPndhaXQobXRkLCBGTF9SRVNFVElORyk7CiAJfSBlbHNlIHsKLQkJb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCQlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCQlvcHMub29ibGVuID0gbGVuOwogCQlvcHMub29iYnVmID0gYnVmOwogCQlvcHMub29ib2ZmcyA9IDA7CkBAIC0zNDI5LDYgKzM0MzAsMTkgQEAKIAkJZWxzZSBpZiAobnVtYnVmcyA9PSAxKSB7CiAJCQl0aGlzLT5vcHRpb25zIHw9IE9ORU5BTkRfSEFTXzRLQl9QQUdFOwogCQkJdGhpcy0+b3B0aW9ucyB8PSBPTkVOQU5EX0hBU19DQUNIRV9QUk9HUkFNOworCQkJLyoKKwkJCSAqIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IDRLaUIgcGFnZXNpemUgY2hpcHMKKwkJCSAqIGFuZCBubyB3YXkgdG8gZGV0ZWN0IGl0IGJ5IEgvVyBjb25maWcgdmFsdWVzLgorCQkJICoKKwkJCSAqIFRvIGRldGVjdCB0aGUgY29ycmVjdCBOT1AgZm9yIGVhY2ggY2hpcHMsCisJCQkgKiBJdCBzaG91bGQgY2hlY2sgdGhlIHZlcnNpb24gSUQgYXMgd29ya2Fyb3VuZC4KKwkJCSAqCisJCQkgKiBOb3cgaXQgaGFzIGFzIGZvbGxvd2luZworCQkJICogS0ZNNEcxNlE0TSBoYXMgTk9QIDQgd2l0aCB2ZXJzaW9uIElEIDB4MDEzMQorCQkJICogS0ZNNEcxNlE1TSBoYXMgTk9QIDEgd2l0aCB2ZXJzb2luIElEIDB4MDEzZQorCQkJICovCisJCQlpZiAoKHRoaXMtPnZlcnNpb25faWQgJiAweGYpID09IDB4ZSkKKwkJCQl0aGlzLT5vcHRpb25zIHw9IE9ORU5BTkRfSEFTX05PUF8xOwogCQl9CiAKIAljYXNlIE9ORU5BTkRfREVWSUNFX0RFTlNJVFlfMkdiOgpAQCAtMzY2Myw3ICszNjc3LDcgQEAKIAlpbnQgaSwgcmV0OwogCWludCBibG9jazsKIAlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzID0gewotCQkubW9kZSA9IE1URF9PT0JfUExBQ0UsCisJCS5tb2RlID0gTVREX09QU19QTEFDRV9PT0IsCiAJCS5vb2JvZmZzID0gMCwKIAkJLm9vYmxlbgk9IG10ZC0+b29ic2l6ZSwKIAkJLmRhdGJ1Zgk9IE5VTEwsCkBAIC00MDU0LDYgKzQwNjgsOCBAQAogCQkJdGhpcy0+ZWNjbGF5b3V0ID0gJm9uZW5hbmRfb29iXzEyODsKIAkJCW10ZC0+c3VicGFnZV9zZnQgPSAyOwogCQl9CisJCWlmIChPTkVOQU5EX0lTX05PUF8xKHRoaXMpKQorCQkJbXRkLT5zdWJwYWdlX3NmdCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgNjQ6CiAJCXRoaXMtPmVjY2xheW91dCA9ICZvbmVuYW5kX29vYl82NDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYnQuYyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYnQuYwppbmRleCBmYzJjMTZhLi42NmZlM2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmJ0LmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2JidC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvb25lbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKioKICAqIGNoZWNrX3Nob3J0X3BhdHRlcm4gLSBbR0VORVJJQ10gY2hlY2sgaWYgYSBwYXR0ZXJuIGlzIGluIHRoZSBidWZmZXIKQEAgLTgwLDcgKzgxLDcgQEAKIAlzdGFydGJsb2NrID0gMDsKIAlmcm9tID0gMDsKIAotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5vb2JsZW4gPSByZWFkbGVuOwogCW9wcy5vb2JidWYgPSBidWY7CiAJb3BzLmxlbiA9IG9wcy5vb2JvZmZzID0gb3BzLnJldGxlbiA9IG9wcy5vb2JyZXRsZW4gPSAwOwpAQCAtMTUzLDcgKzE1NCw3IEBACiAJYmxvY2sgPSAoaW50KSAob25lbmFuZF9ibG9jayh0aGlzLCBvZmZzKSA8PCAxKTsKIAlyZXMgPSAoYmJtLT5iYnRbYmxvY2sgPj4gM10gPj4gKGJsb2NrICYgMHgwNikpICYgMHgwMzsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICJvbmVuYW5kX2lzYmFkX2JidDogYmJ0IGluZm8gZm9yIG9mZnMgMHglMDh4OiAoYmxvY2sgJWQpIDB4JTAyeFxuIiwKKwlwcl9kZWJ1Zygib25lbmFuZF9pc2JhZF9iYnQ6IGJidCBpbmZvIGZvciBvZmZzIDB4JTA4eDogKGJsb2NrICVkKSAweCUwMnhcbiIsCiAJCSh1bnNpZ25lZCBpbnQpIG9mZnMsIGJsb2NrID4+IDEsIHJlcyk7CiAKIAlzd2l0Y2ggKChpbnQpIHJlcykgewpAQCAtMTg4LDEwICsxODksOCBAQAogCWxlbiA9IHRoaXMtPmNoaXBzaXplID4+ICh0aGlzLT5lcmFzZV9zaGlmdCArIDIpOwogCS8qIEFsbG9jYXRlIG1lbW9yeSAoMmJpdCBwZXIgYmxvY2spIGFuZCBjbGVhciB0aGUgbWVtb3J5IGJhZCBibG9jayB0YWJsZSAqLwogCWJibS0+YmJ0ID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmICghYmJtLT5iYnQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJvbmVuYW5kX3NjYW5fYmJ0OiBPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJibS0+YmJ0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBTZXQgdGhlIGJhZCBibG9jayBwb3NpdGlvbiAqLwogCWJibS0+YmFkYmxvY2twb3MgPSBPTkVOQU5EX0JBREJMT0NLX1BPUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvc2Ftc3VuZy5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9zYW1zdW5nLmMKaW5kZXggMzMwNmI1Yi4uNTQ3NDU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9zYW1zdW5nLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9zYW1zdW5nLmMKQEAgLTE0Nyw3ICsxNDcsNiBAQAogCXN0cnVjdCByZXNvdXJjZSAqZG1hX3JlczsKIAl1bnNpZ25lZCBsb25nCXBoeXNfYmFzZTsKIAlzdHJ1Y3QgY29tcGxldGlvbgljb21wbGV0ZTsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CiB9OwogCiAjZGVmaW5lIENNRF9NQVBfMDAoZGV2LCBhZGRyKQkJKGRldi0+Y21kX21hcChNQVBfMDAsICgoYWRkcikgPDwgMSkpKQpAQCAtMTU3LDggKzE1Niw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgczNjX29uZW5hbmQgKm9uZW5hbmQ7CiAKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMLCB9OwotCiBzdGF0aWMgaW5saW5lIGludCBzM2NfcmVhZF9yZWcoaW50IG9mZnNldCkKIHsKIAlyZXR1cm4gcmVhZGwob25lbmFuZC0+YmFzZSArIG9mZnNldCk7CkBAIC0xMDE3LDEzICsxMDE0LDkgQEAKIAlpZiAoczNjX3JlYWRfcmVnKE1FTV9DRkdfT0ZGU0VUKSAmIE9ORU5BTkRfU1lTX0NGRzFfU1lOQ19SRUFEKQogCQlkZXZfaW5mbygmb25lbmFuZC0+cGRldi0+ZGV2LCAiT25lTkFORCBTeW5jLiBCdXJzdCBSZWFkIGVuYWJsZWRcbiIpOwogCi0JZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0X3Byb2JlcywgJm9uZW5hbmQtPnBhcnRzLCAwKTsKLQlpZiAoZXJyID4gMCkKLQkJbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIG9uZW5hbmQtPnBhcnRzLCBlcnIpOwotCWVsc2UgaWYgKGVyciA8PSAwICYmIHBkYXRhICYmIHBkYXRhLT5wYXJ0cykKLQkJbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIHBkYXRhLT5wYXJ0cywgcGRhdGEtPm5yX3BhcnRzKTsKLQllbHNlCi0JCWVyciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwKTsKKwllcnIgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwgMCwKKwkJCQkJcGRhdGEgPyBwZGF0YS0+cGFydHMgOiBOVUxMLAorCQkJCQlwZGF0YSA/IHBkYXRhLT5ucl9wYXJ0cyA6IDApOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbXRkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvcmVkYm9vdC5jIGIvZHJpdmVycy9tdGQvcmVkYm9vdC5jCmluZGV4IDdhODdkMDcuLmUzNjZiMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3JlZGJvb3QuYworKysgYi9kcml2ZXJzL210ZC9yZWRib290LmMKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdHJ1Y3QgZmlzX2ltYWdlX2Rlc2MgewogICAgIHVuc2lnbmVkIGNoYXIgbmFtZVsxNl07ICAgICAgLy8gTnVsbCB0ZXJtaW5hdGVkIG5hbWUKQEAgLTU2LDggKzU3LDggQEAKIH0KIAogc3RhdGljIGludCBwYXJzZV9yZWRib290X3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICptYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZpc19vcmlnaW4pCisJCQkJICAgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLAorCQkJCSAgICBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKmRhdGEpCiB7CiAJaW50IG5ycGFydHMgPSAwOwogCXN0cnVjdCBmaXNfaW1hZ2VfZGVzYyAqYnVmOwpAQCAtMTk3LDExICsxOTgsMTAgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCW5ld19mbC0+aW1nID0gJmJ1ZltpXTsKLSAgICAgICAgICAgICAgICBpZiAoZmlzX29yaWdpbikgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2ldLmZsYXNoX2Jhc2UgLT0gZmlzX29yaWdpbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2ldLmZsYXNoX2Jhc2UgJj0gbWFzdGVyLT5zaXplLTE7Ci0gICAgICAgICAgICAgICAgfQorCQlpZiAoZGF0YSAmJiBkYXRhLT5vcmlnaW4pCisJCQlidWZbaV0uZmxhc2hfYmFzZSAtPSBkYXRhLT5vcmlnaW47CisJCWVsc2UKKwkJCWJ1ZltpXS5mbGFzaF9iYXNlICY9IG1hc3Rlci0+c2l6ZS0xOwogCiAJCS8qIEknbSBzdXJlIHRoZSBKRkZTMiBjb2RlIGhhcyBkb25lIG1lIHBlcm1hbmVudCBkYW1hZ2UuCiAJCSAqIEkgbm93IHRoaW5rIHRoZSBmb2xsb3dpbmcgaXMgX25vcm1hbF8KQEAgLTI5Nyw2ICsyOTcsOSBAQAogCS5uYW1lID0gIlJlZEJvb3QiLAogfTsKIAorLyogbXRkIHBhcnNlcnMgd2lsbCByZXF1ZXN0IHRoZSBtb2R1bGUgYnkgcGFyc2VyIG5hbWUgKi8KK01PRFVMRV9BTElBUygiUmVkQm9vdCIpOworCiBzdGF0aWMgaW50IF9faW5pdCByZWRib290X3BhcnNlcl9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHJlZ2lzdGVyX210ZF9wYXJzZXIoJnJlZGJvb3RfcGFyc2VyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3JmZF9mdGwuYyBiL2RyaXZlcnMvbXRkL3JmZF9mdGwuYwppbmRleCBjYzRkMTgwLi43M2FlMjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9yZmRfZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvcmZkX2Z0bC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvc21fZnRsLmMgYi9kcml2ZXJzL210ZC9zbV9mdGwuYwppbmRleCBlZDNkNmNkLi5mZGRiNzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9zbV9mdGwuYworKysgYi9kcml2ZXJzL210ZC9zbV9mdGwuYwpAQCAtMzQsNyArMzQsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTIpIik7CiAKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBzeXNmcyBhdHRyaWJ1dHRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIHN5c2ZzIGF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RydWN0IHNtX3N5c2ZzX2F0dHJpYnV0ZSB7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7CiAJY2hhciAqZGF0YTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCWlmICgobGJhWzBdICYgMHhGOCkgIT0gMHgxMCkKIAkJcmV0dXJuIC0yOwogCi0JLyogY2hlY2sgcGFyaXR5IC0gZW5kaWFuZXNzIGRvZXNuJ3QgbWF0dGVyICovCisJLyogY2hlY2sgcGFyaXR5IC0gZW5kaWFubmVzcyBkb2Vzbid0IG1hdHRlciAqLwogCWlmIChod2VpZ2h0MTYoKih1aW50MTZfdCAqKWxiYSkgJiAxKQogCQlyZXR1cm4gLTI7CiAKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCiAKIC8qCi0gKiBSZWFkIExCQSBhc3Njb2NpYXRlZCB3aXRoIGJsb2NrCisgKiBSZWFkIExCQSBhc3NvY2lhdGVkIHdpdGggYmxvY2sKICAqIHJldHVybnMgLTEsIGlmIGJsb2NrIGlzIGVyYXNlZAogICogcmV0dXJucyAtMiBpZiBlcnJvciBoYXBwZW5zCiAgKi8KQEAgLTI1MiwxMSArMjUyLDExIEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIFVzZXIgbWlnaHQgbm90IG5lZWQgdGhlIG9vYiwgYnV0IHdlIGRvIGZvciBkYXRhIHZlcnRpZmljYXRpb24gKi8KKwkvKiBVc2VyIG1pZ2h0IG5vdCBuZWVkIHRoZSBvb2IsIGJ1dCB3ZSBkbyBmb3IgZGF0YSB2ZXJpZmljYXRpb24gKi8KIAlpZiAoIW9vYikKIAkJb29iID0gJnRtcF9vb2I7CiAKLQlvcHMubW9kZSA9IGZ0bC0+c21hbGxwYWdlbmFuZCA/IE1URF9PT0JfUkFXIDogTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IGZ0bC0+c21hbGxwYWdlbmFuZCA/IE1URF9PUFNfUkFXIDogTVREX09QU19QTEFDRV9PT0I7CiAJb3BzLm9vYm9mZnMgPSAwOwogCW9wcy5vb2JsZW4gPSBTTV9PT0JfU0laRTsKIAlvcHMub29iYnVmID0gKHZvaWQgKilvb2I7CkBAIC0yNzYsMTIgKzI3NiwxMiBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBVbmZvcnR1bmVsbHksIG9vYiByZWFkIHdpbGwgX2Fsd2F5c18gc3VjY2VlZCwKKwkvKiBVbmZvcnR1bmF0ZWx5LCBvb2IgcmVhZCB3aWxsIF9hbHdheXNfIHN1Y2NlZWQsCiAJCWRlc3BpdGUgY2FyZCByZW1vdmFsLi4uLi4gKi8KIAlyZXQgPSBtdGQtPnJlYWRfb29iKG10ZCwgc21fbWtvZmZzZXQoZnRsLCB6b25lLCBibG9jaywgYm9mZnNldCksICZvcHMpOwogCiAJLyogVGVzdCBmb3IgdW5rbm93biBlcnJvcnMgKi8KLQlpZiAocmV0ICE9IDAgJiYgcmV0ICE9IC1FVUNMRUFOICYmIHJldCAhPSAtRUJBRE1TRykgeworCWlmIChyZXQgIT0gMCAmJiAhbXRkX2lzX2JpdGZsaXBfb3JfZWNjZXJyKHJldCkpIHsKIAkJZGJnKCJyZWFkIG9mIGJsb2NrICVkIGF0IHpvbmUgJWQsIGZhaWxlZCBkdWUgdG8gZXJyb3IgKCVkKSIsCiAJCQlibG9jaywgem9uZSwgcmV0KTsKIAkJZ290byBhZ2FpbjsKQEAgLTMwNiw3ICszMDYsNyBAQAogCX0KIAogCS8qIFRlc3QgRUNDKi8KLQlpZiAocmV0ID09IC1FQkFETVNHIHx8CisJaWYgKG10ZF9pc19lY2NlcnIocmV0KSB8fAogCQkoZnRsLT5zbWFsbHBhZ2VuYW5kICYmIHNtX2NvcnJlY3Rfc2VjdG9yKGJ1ZmZlciwgb29iKSkpIHsKIAogCQlkYmcoInJlYWQgb2YgYmxvY2sgJWQgYXQgem9uZSAlZCwgZmFpbGVkIGR1ZSB0byBFQ0MgZXJyb3IiLApAQCAtMzM2LDcgKzMzNiw3IEBACiAJaWYgKGZ0bC0+dW5zdGFibGUpCiAJCXJldHVybiAtRUlPOwogCi0Jb3BzLm1vZGUgPSBmdGwtPnNtYWxscGFnZW5hbmQgPyBNVERfT09CX1JBVyA6IE1URF9PT0JfUExBQ0U7CisJb3BzLm1vZGUgPSBmdGwtPnNtYWxscGFnZW5hbmQgPyBNVERfT1BTX1JBVyA6IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5sZW4gPSBTTV9TRUNUT1JfU0laRTsKIAlvcHMuZGF0YnVmID0gYnVmZmVyOwogCW9wcy5vb2JvZmZzID0gMDsKQEAgLTQ0NywxNCArNDQ3LDE0IEBACiAKIAkvKiBXZSBhcmVuJ3QgY2hlY2tpbmcgdGhlIHJldHVybiB2YWx1ZSwgYmVjYXVzZSB3ZSBkb24ndCBjYXJlICovCiAJLyogVGhpcyBhbHNvIGZhaWxzIG9uIGZha2UgeEQgY2FyZHMsIGJ1dCBJIGd1ZXNzIHRoZXNlIHdvbid0IGV4cG9zZQotCQlhbnkgYmFkIGJsb2NrcyB0aWxsIGZhaWwgY29tcGxldGx5ICovCisJCWFueSBiYWQgYmxvY2tzIHRpbGwgZmFpbCBjb21wbGV0ZWx5ICovCiAJZm9yIChib2Zmc2V0ID0gMDsgYm9mZnNldCA8IGZ0bC0+YmxvY2tfc2l6ZTsgYm9mZnNldCArPSBTTV9TRUNUT1JfU0laRSkKIAkJc21fd3JpdGVfc2VjdG9yKGZ0bCwgem9uZSwgYmxvY2ssIGJvZmZzZXQsIE5VTEwsICZvb2IpOwogfQogCiAvKgogICogRXJhc2UgYSBibG9jayB3aXRoaW4gYSB6b25lCi0gKiBJZiBlcmFzZSBzdWNjZWRlcywgaXQgdXBkYXRlcyBmcmVlIGJsb2NrIGZpZm8sIG90aGVyd2lzZSBtYXJrcyBibG9jayBhcyBiYWQKKyAqIElmIGVyYXNlIHN1Y2NlZWRzLCBpdCB1cGRhdGVzIGZyZWUgYmxvY2sgZmlmbywgb3RoZXJ3aXNlIG1hcmtzIGJsb2NrIGFzIGJhZAogICovCiBzdGF0aWMgaW50IHNtX2VyYXNlX2Jsb2NrKHN0cnVjdCBzbV9mdGwgKmZ0bCwgaW50IHpvbmVfbnVtLCB1aW50MTZfdCBibG9jaywKIAkJCSAgaW50IHB1dF9mcmVlKQpAQCAtNTEwLDcgKzUxMCw3IEBACiAJY29tcGxldGUoJmZ0bC0+ZXJhc2VfY29tcGxldGlvbik7CiB9CiAKLS8qIFRocm91Z2h0bHkgdGVzdCB0aGF0IGJsb2NrIGlzIHZhbGlkLiAqLworLyogVGhvcm91Z2hseSB0ZXN0IHRoYXQgYmxvY2sgaXMgdmFsaWQuICovCiBzdGF0aWMgaW50IHNtX2NoZWNrX2Jsb2NrKHN0cnVjdCBzbV9mdGwgKmZ0bCwgaW50IHpvbmUsIGludCBibG9jaykKIHsKIAlpbnQgYm9mZnNldDsKQEAgLTUyNiw3ICs1MjYsNyBAQAogCWZvciAoYm9mZnNldCA9IDA7IGJvZmZzZXQgPCBmdGwtPmJsb2NrX3NpemU7CiAJCQkJCWJvZmZzZXQgKz0gU01fU0VDVE9SX1NJWkUpIHsKIAotCQkvKiBUaGlzIHNob3Vkbid0IGhhcHBlbiBhbnl3YXkgKi8KKwkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFueXdheSAqLwogCQlpZiAoc21fcmVhZF9zZWN0b3IoZnRsLCB6b25lLCBibG9jaywgYm9mZnNldCwgTlVMTCwgJm9vYikpCiAJCQlyZXR1cm4gLTI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3NzZmRjLmMgYi9kcml2ZXJzL210ZC9zc2ZkYy5jCmluZGV4IDVjZDE4OTcuLjk3NmUzZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3NzZmRjLmMKKysrIGIvZHJpdmVycy9tdGQvc3NmZGMuYwpAQCAtMTM1LDggKzEzNSw3IEBACiAJCQkJLyogRm91bmQgKi8KIAkJCQljaXNfc2VjdG9yID0gKGludCkob2Zmc2V0ID4+IFNFQ1RPUl9TSElGVCk7CiAJCQl9IGVsc2UgewotCQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsCi0JCQkJCSJTU0ZEQ19STzogQ0lTL0lESSBzZWN0b3Igbm90IGZvdW5kIgorCQkJCXByX2RlYnVnKCJTU0ZEQ19STzogQ0lTL0lESSBzZWN0b3Igbm90IGZvdW5kIgogCQkJCQkiIG9uICVzIChtdGQlZClcbiIsIG10ZC0+bmFtZSwKIAkJCQkJbXRkLT5pbmRleCk7CiAJCQl9CkBAIC0xNzAsNyArMTY5LDcgQEAKIAlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCWludCByZXQ7CiAKLQlvcHMubW9kZSA9IE1URF9PT0JfUkFXOworCW9wcy5tb2RlID0gTVREX09QU19SQVc7CiAJb3BzLm9vYm9mZnMgPSAwOwogCW9wcy5vb2JsZW4gPSBPT0JfU0laRTsKIAlvcHMub29iYnVmID0gYnVmOwpAQCAtMjIxLDggKzIyMCw3IEBACiAJCQlibG9ja19hZGRyZXNzID4+PSAxOwogCiAJCQlpZiAoZ2V0X3Bhcml0eShibG9ja19hZGRyZXNzLCAxMCkgIT0gcGFyaXR5KSB7Ci0JCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwKLQkJCQkJIlNTRkRDX1JPOiBsb2dpY2FsIGFkZHJlc3MgZmllbGQlZCIKKwkJCQlwcl9kZWJ1ZygiU1NGRENfUk86IGxvZ2ljYWwgYWRkcmVzcyBmaWVsZCVkIgogCQkJCQkicGFyaXR5IGVycm9yKDB4JTA0WClcbiIsIGorMSwKIAkJCQkJYmxvY2tfYWRkcmVzcyk7CiAJCQl9IGVsc2UgewpAQCAtMjM1LDcgKzIzMyw3IEBACiAJaWYgKCFvaykKIAkJYmxvY2tfYWRkcmVzcyA9IC0yOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIlNTRkRDX1JPOiBnZXRfbG9naWNhbF9hZGRyZXNzKCkgJWRcbiIsCisJcHJfZGVidWcoIlNTRkRDX1JPOiBnZXRfbG9naWNhbF9hZGRyZXNzKCkgJWRcbiIsCiAJCWJsb2NrX2FkZHJlc3MpOwogCiAJcmV0dXJuIGJsb2NrX2FkZHJlc3M7CkBAIC0yNDksNyArMjQ3LDcgQEAKIAlpbnQgcmV0LCBibG9ja19hZGRyZXNzLCBwaHlzX2Jsb2NrOwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gc3NmZGMtPm1iZC5tdGQ7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiU1NGRENfUk86IGJ1aWxkX2Jsb2NrX21hcCgpIG5ibGtzPSVkICglbHVLKVxuIiwKKwlwcl9kZWJ1ZygiU1NGRENfUk86IGJ1aWxkX2Jsb2NrX21hcCgpIG5ibGtzPSVkICglbHVLKVxuIiwKIAkgICAgICBzc2ZkYy0+bWFwX2xlbiwKIAkgICAgICAodW5zaWduZWQgbG9uZylzc2ZkYy0+bWFwX2xlbiAqIHNzZmRjLT5lcmFzZV9zaXplIC8gMTAyNCk7CiAKQEAgLTI2Miw4ICsyNjAsNyBAQAogCiAJCXJldCA9IHJlYWRfcmF3X29vYihtdGQsIG9mZnNldCwgb29iX2J1Zik7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLAotCQkJCSJTU0ZEQ19STzogbXRkIHJlYWRfb29iKCkgZmFpbGVkIGF0ICVsdVxuIiwKKwkJCXByX2RlYnVnKCJTU0ZEQ19STzogbXRkIHJlYWRfb29iKCkgZmFpbGVkIGF0ICVsdVxuIiwKIAkJCQlvZmZzZXQpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0yNzksOCArMjc2LDcgQEAKIAkJCXNzZmRjLT5sb2dpY19ibG9ja19tYXBbYmxvY2tfYWRkcmVzc10gPQogCQkJCSh1bnNpZ25lZCBzaG9ydClwaHlzX2Jsb2NrOwogCi0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLAotCQkJCSJTU0ZEQ19STzogYnVpbGRfYmxvY2tfbWFwKCkgcGh5c19ibG9jaz0lZCwiCisJCQlwcl9kZWJ1ZygiU1NGRENfUk86IGJ1aWxkX2Jsb2NrX21hcCgpIHBoeXNfYmxvY2s9JWQsIgogCQkJCSJsb2dpY19ibG9ja19hZGRyPSVkLCB6b25lPSVkXG4iLAogCQkJCXBoeXNfYmxvY2ssIGJsb2NrX2FkZHJlc3MsIHpvbmVfaW5kZXgpOwogCQl9CkBAIC0zMDQsMTEgKzMwMCw4IEBACiAJCXJldHVybjsKIAogCXNzZmRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNzZmRjcl9yZWNvcmQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNzZmRjKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSJTU0ZEQ19STzogb3V0IG9mIG1lbW9yeSBmb3IgZGF0YSBzdHJ1Y3R1cmVzXG4iKTsKKwlpZiAoIXNzZmRjKQogCQlyZXR1cm47Ci0JfQogCiAJc3NmZGMtPm1iZC5tdGQgPSBtdGQ7CiAJc3NmZGMtPm1iZC5kZXZudW0gPSAtMTsKQEAgLTMxOSw4ICszMTIsNyBAQAogCXNzZmRjLT5lcmFzZV9zaXplID0gbXRkLT5lcmFzZXNpemU7CiAJc3NmZGMtPm1hcF9sZW4gPSAodTMyKW10ZC0+c2l6ZSAvIG10ZC0+ZXJhc2VzaXplOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMSwKLQkJIlNTRkRDX1JPOiBjaXNfYmxvY2s9JWQsZXJhc2Vfc2l6ZT0lZCxtYXBfbGVuPSVkLG5fem9uZXM9JWRcbiIsCisJcHJfZGVidWcoIlNTRkRDX1JPOiBjaXNfYmxvY2s9JWQsZXJhc2Vfc2l6ZT0lZCxtYXBfbGVuPSVkLG5fem9uZXM9JWRcbiIsCiAJCXNzZmRjLT5jaXNfYmxvY2ssIHNzZmRjLT5lcmFzZV9zaXplLCBzc2ZkYy0+bWFwX2xlbiwKIAkJRElWX1JPVU5EX1VQKHNzZmRjLT5tYXBfbGVuLCBNQVhfUEhZU19CTEtfUEVSX1pPTkUpKTsKIApAQCAtMzMxLDcgKzMyMyw3IEBACiAJc3NmZGMtPmN5bGluZGVycyA9ICh1bnNpZ25lZCBzaG9ydCkoKCh1MzIpbXRkLT5zaXplID4+IFNFQ1RPUl9TSElGVCkgLwogCQkJKChsb25nKXNzZmRjLT5zZWN0b3JzICogKGxvbmcpc3NmZGMtPmhlYWRzKSk7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiU1NGRENfUk86IHVzaW5nIEM6JWQgSDolZCBTOiVkID09ICVsZCBzZWN0c1xuIiwKKwlwcl9kZWJ1ZygiU1NGRENfUk86IHVzaW5nIEM6JWQgSDolZCBTOiVkID09ICVsZCBzZWN0c1xuIiwKIAkJc3NmZGMtPmN5bGluZGVycywgc3NmZGMtPmhlYWRzICwgc3NmZGMtPnNlY3RvcnMsCiAJCShsb25nKXNzZmRjLT5jeWxpbmRlcnMgKiAobG9uZylzc2ZkYy0+aGVhZHMgKgogCQkobG9uZylzc2ZkYy0+c2VjdG9ycyk7CkBAIC0zNDIsMTEgKzMzNCw4IEBACiAJLyogQWxsb2NhdGUgbG9naWNhbCBibG9jayBtYXAgKi8KIAlzc2ZkYy0+bG9naWNfYmxvY2tfbWFwID0ga21hbGxvYyhzaXplb2Yoc3NmZGMtPmxvZ2ljX2Jsb2NrX21hcFswXSkgKgogCQkJCQkgc3NmZGMtPm1hcF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghc3NmZGMtPmxvZ2ljX2Jsb2NrX21hcCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiU1NGRENfUk86IG91dCBvZiBtZW1vcnkgZm9yIGRhdGEgc3RydWN0dXJlc1xuIik7CisJaWYgKCFzc2ZkYy0+bG9naWNfYmxvY2tfbWFwKQogCQlnb3RvIG91dF9lcnI7Ci0JfQogCW1lbXNldChzc2ZkYy0+bG9naWNfYmxvY2tfbWFwLCAweGZmLCBzaXplb2Yoc3NmZGMtPmxvZ2ljX2Jsb2NrX21hcFswXSkgKgogCQlzc2ZkYy0+bWFwX2xlbik7CiAKQEAgLTM3MSw3ICszNjAsNyBAQAogewogCXN0cnVjdCBzc2ZkY3JfcmVjb3JkICpzc2ZkYyA9IChzdHJ1Y3Qgc3NmZGNyX3JlY29yZCAqKWRldjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJTU0ZEQ19STzogcmVtb3ZlX2RldiAoaT0lZClcbiIsIGRldi0+ZGV2bnVtKTsKKwlwcl9kZWJ1ZygiU1NGRENfUk86IHJlbW92ZV9kZXYgKGk9JWQpXG4iLCBkZXYtPmRldm51bSk7CiAKIAlkZWxfbXRkX2Jsa3RyYW5zX2RldihkZXYpOwogCWtmcmVlKHNzZmRjLT5sb2dpY19ibG9ja19tYXApOwpAQCAtMzg3LDggKzM3Niw3IEBACiAJb2Zmc2V0ID0gKGludCkobG9naWNfc2VjdF9ubyAlIHNlY3RvcnNfcGVyX2Jsb2NrKTsKIAlibG9ja19hZGRyZXNzID0gKGludCkobG9naWNfc2VjdF9ubyAvIHNlY3RvcnNfcGVyX2Jsb2NrKTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsCi0JCSJTU0ZEQ19STzogc3NmZGNyX3JlYWRzZWN0KCVsdSkgc2VjX3Blcl9ibGs9JWQsIG9mc3Q9JWQsIgorCXByX2RlYnVnKCJTU0ZEQ19STzogc3NmZGNyX3JlYWRzZWN0KCVsdSkgc2VjX3Blcl9ibGs9JWQsIG9mc3Q9JWQsIgogCQkiIGJsb2NrX2FkZHI9JWRcbiIsIGxvZ2ljX3NlY3Rfbm8sIHNlY3RvcnNfcGVyX2Jsb2NrLCBvZmZzZXQsCiAJCWJsb2NrX2FkZHJlc3MpOwogCkBAIC0zOTcsOCArMzg1LDcgQEAKIAogCWJsb2NrX2FkZHJlc3MgPSBzc2ZkYy0+bG9naWNfYmxvY2tfbWFwW2Jsb2NrX2FkZHJlc3NdOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywKLQkJIlNTRkRDX1JPOiBzc2ZkY3JfcmVhZHNlY3QoKSBwaHlzX2Jsb2NrX2FkZHI9JWRcbiIsCisJcHJfZGVidWcoIlNTRkRDX1JPOiBzc2ZkY3JfcmVhZHNlY3QoKSBwaHlzX2Jsb2NrX2FkZHI9JWRcbiIsCiAJCWJsb2NrX2FkZHJlc3MpOwogCiAJaWYgKGJsb2NrX2FkZHJlc3MgPCAweGZmZmYpIHsKQEAgLTQwNyw4ICszOTQsNyBAQAogCQlzZWN0X25vID0gKHVuc2lnbmVkIGxvbmcpYmxvY2tfYWRkcmVzcyAqIHNlY3RvcnNfcGVyX2Jsb2NrICsKIAkJCQlvZmZzZXQ7CiAKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywKLQkJCSJTU0ZEQ19STzogc3NmZGNyX3JlYWRzZWN0KCkgcGh5c19zZWN0X25vPSVsdVxuIiwKKwkJcHJfZGVidWcoIlNTRkRDX1JPOiBzc2ZkY3JfcmVhZHNlY3QoKSBwaHlzX3NlY3Rfbm89JWx1XG4iLAogCQkJc2VjdF9ubyk7CiAKIAkJaWYgKHJlYWRfcGh5c2ljYWxfc2VjdG9yKHNzZmRjLT5tYmQubXRkLCBidWYsIHNlY3Rfbm8pIDwgMCkKQEAgLTQyNCw3ICs0MTAsNyBAQAogewogCXN0cnVjdCBzc2ZkY3JfcmVjb3JkICpzc2ZkYyA9IChzdHJ1Y3Qgc3NmZGNyX3JlY29yZCAqKWRldjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJTU0ZEQ19STzogc3NmZGNyX2dldGdlbygpIEM9JWQsIEg9JWQsIFM9JWRcbiIsCisJcHJfZGVidWcoIlNTRkRDX1JPOiBzc2ZkY3JfZ2V0Z2VvKCkgQz0lZCwgSD0lZCwgUz0lZFxuIiwKIAkJCXNzZmRjLT5jeWxpbmRlcnMsIHNzZmRjLT5oZWFkcywgc3NmZGMtPnNlY3RvcnMpOwogCiAJZ2VvLT5oZWFkcyA9IHNzZmRjLT5oZWFkczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9vb2J0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfb29idGVzdC5jCmluZGV4IGRlYzkyYWUuLjkzM2Y3ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9vb2J0ZXN0LmMKKysrIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX29vYnRlc3QuYwpAQCAtMzAsNyArMzAsNyBAQAogCiAjZGVmaW5lIFBSSU5UX1BSRUYgS0VSTl9JTkZPICJtdGRfb29idGVzdDogIgogCi1zdGF0aWMgaW50IGRldjsKK3N0YXRpYyBpbnQgZGV2ID0gLUVJTlZBTDsKIG1vZHVsZV9wYXJhbShkZXYsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGRldiwgIk1URCBkZXZpY2UgbnVtYmVyIHRvIHVzZSIpOwogCkBAIC0xMzEsNyArMTMxLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBwZ2NudDsgKytpLCBhZGRyICs9IG10ZC0+d3JpdGVzaXplKSB7CiAJCXNldF9yYW5kb21fZGF0YSh3cml0ZWJ1ZiwgdXNlX2xlbik7Ci0JCW9wcy5tb2RlICAgICAgPSBNVERfT09CX0FVVE87CisJCW9wcy5tb2RlICAgICAgPSBNVERfT1BTX0FVVE9fT09COwogCQlvcHMubGVuICAgICAgID0gMDsKIAkJb3BzLnJldGxlbiAgICA9IDA7CiAJCW9wcy5vb2JsZW4gICAgPSB1c2VfbGVuOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgcGdjbnQ7ICsraSwgYWRkciArPSBtdGQtPndyaXRlc2l6ZSkgewogCQlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIHVzZV9sZW4pOwotCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAkJb3BzLmxlbiAgICAgICA9IDA7CiAJCW9wcy5yZXRsZW4gICAgPSAwOwogCQlvcHMub29ibGVuICAgID0gdXNlX2xlbjsKQEAgLTIxMSw3ICsyMTEsNyBAQAogCQlpZiAodXNlX29mZnNldCAhPSAwIHx8IHVzZV9sZW4gPCBtdGQtPmVjY2xheW91dC0+b29iYXZhaWwpIHsKIAkJCWludCBrOwogCi0JCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQkJb3BzLm1vZGUgICAgICA9IE1URF9PUFNfQVVUT19PT0I7CiAJCQlvcHMubGVuICAgICAgID0gMDsKIAkJCW9wcy5yZXRsZW4gICAgPSAwOwogCQkJb3BzLm9vYmxlbiAgICA9IG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKQEAgLTI3Niw3ICsyNzYsNyBAQAogCXNpemVfdCBsZW4gPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWwgKiBwZ2NudDsKIAogCXNldF9yYW5kb21fZGF0YSh3cml0ZWJ1ZiwgbGVuKTsKLQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlICAgICAgPSBNVERfT1BTX0FVVE9fT09COwogCW9wcy5sZW4gICAgICAgPSAwOwogCW9wcy5yZXRsZW4gICAgPSAwOwogCW9wcy5vb2JsZW4gICAgPSBsZW47CkBAIC0zNjYsNiArMzY2LDEzIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKGRldiA8IDApIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbXRkLWRldmljZSB2aWEgbW9kdWxlIHBhcmFtdGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ0FSRUZVTDogVGhpcyB0ZXN0IHdpcGVzIGFsbCBkYXRhIG9uIHRoZSBzcGVjaWZpZWQgTVREIGRldmljZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlwcmludGsoUFJJTlRfUFJFRiAiTVREIGRldmljZTogJWRcbiIsIGRldik7CiAKIAltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBkZXYpOwpAQCAtNTA3LDcgKzUxNCw3IEBACiAJCWFkZHIwICs9IG10ZC0+ZXJhc2VzaXplOwogCiAJLyogQXR0ZW1wdCB0byB3cml0ZSBvZmYgZW5kIG9mIE9PQiAqLwotCW9wcy5tb2RlICAgICAgPSBNVERfT09CX0FVVE87CisJb3BzLm1vZGUgICAgICA9IE1URF9PUFNfQVVUT19PT0I7CiAJb3BzLmxlbiAgICAgICA9IDA7CiAJb3BzLnJldGxlbiAgICA9IDA7CiAJb3BzLm9vYmxlbiAgICA9IDE7CkBAIC01MjcsNyArNTM0LDcgQEAKIAl9CiAKIAkvKiBBdHRlbXB0IHRvIHJlYWQgb2ZmIGVuZCBvZiBPT0IgKi8KLQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlICAgICAgPSBNVERfT1BTX0FVVE9fT09COwogCW9wcy5sZW4gICAgICAgPSAwOwogCW9wcy5yZXRsZW4gICAgPSAwOwogCW9wcy5vb2JsZW4gICAgPSAxOwpAQCAtNTUxLDcgKzU1OCw3IEBACiAJCSAgICAgICAiYmxvY2sgaXMgYmFkXG4iKTsKIAllbHNlIHsKIAkJLyogQXR0ZW1wdCB0byB3cml0ZSBvZmYgZW5kIG9mIGRldmljZSAqLwotCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAkJb3BzLmxlbiAgICAgICA9IDA7CiAJCW9wcy5yZXRsZW4gICAgPSAwOwogCQlvcHMub29ibGVuICAgID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsICsgMTsKQEAgLTU3MSw3ICs1NzgsNyBAQAogCQl9CiAKIAkJLyogQXR0ZW1wdCB0byByZWFkIG9mZiBlbmQgb2YgZGV2aWNlICovCi0JCW9wcy5tb2RlICAgICAgPSBNVERfT09CX0FVVE87CisJCW9wcy5tb2RlICAgICAgPSBNVERfT1BTX0FVVE9fT09COwogCQlvcHMubGVuICAgICAgID0gMDsKIAkJb3BzLnJldGxlbiAgICA9IDA7CiAJCW9wcy5vb2JsZW4gICAgPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWwgKyAxOwpAQCAtNTk1LDcgKzYwMiw3IEBACiAJCQlnb3RvIG91dDsKIAogCQkvKiBBdHRlbXB0IHRvIHdyaXRlIG9mZiBlbmQgb2YgZGV2aWNlICovCi0JCW9wcy5tb2RlICAgICAgPSBNVERfT09CX0FVVE87CisJCW9wcy5tb2RlICAgICAgPSBNVERfT1BTX0FVVE9fT09COwogCQlvcHMubGVuICAgICAgID0gMDsKIAkJb3BzLnJldGxlbiAgICA9IDA7CiAJCW9wcy5vb2JsZW4gICAgPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWw7CkBAIC02MTUsNyArNjIyLDcgQEAKIAkJfQogCiAJCS8qIEF0dGVtcHQgdG8gcmVhZCBvZmYgZW5kIG9mIGRldmljZSAqLwotCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAkJb3BzLmxlbiAgICAgICA9IDA7CiAJCW9wcy5yZXRsZW4gICAgPSAwOwogCQlvcHMub29ibGVuICAgID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOwpAQCAtNjU1LDcgKzY2Miw3IEBACiAJCWFkZHIgPSAoaSArIDEpICogbXRkLT5lcmFzZXNpemUgLSBtdGQtPndyaXRlc2l6ZTsKIAkJZm9yIChwZyA9IDA7IHBnIDwgY250OyArK3BnKSB7CiAJCQlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIHN6KTsKLQkJCW9wcy5tb2RlICAgICAgPSBNVERfT09CX0FVVE87CisJCQlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAkJCW9wcy5sZW4gICAgICAgPSAwOwogCQkJb3BzLnJldGxlbiAgICA9IDA7CiAJCQlvcHMub29ibGVuICAgID0gc3o7CkBAIC02ODMsNyArNjkwLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbCAqIDIpOwogCQlhZGRyID0gKGkgKyAxKSAqIG10ZC0+ZXJhc2VzaXplIC0gbXRkLT53cml0ZXNpemU7Ci0JCW9wcy5tb2RlICAgICAgPSBNVERfT09CX0FVVE87CisJCW9wcy5tb2RlICAgICAgPSBNVERfT1BTX0FVVE9fT09COwogCQlvcHMubGVuICAgICAgID0gMDsKIAkJb3BzLnJldGxlbiAgICA9IDA7CiAJCW9wcy5vb2JsZW4gICAgPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWwgKiAyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3BhZ2V0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfcGFnZXRlc3QuYwppbmRleCAwMGI5MzdlLi5hZmFmYjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfcGFnZXRlc3QuYworKysgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfcGFnZXRlc3QuYwpAQCAtMzAsNyArMzAsNyBAQAogCiAjZGVmaW5lIFBSSU5UX1BSRUYgS0VSTl9JTkZPICJtdGRfcGFnZXRlc3Q6ICIKIAotc3RhdGljIGludCBkZXY7CitzdGF0aWMgaW50IGRldiA9IC1FSU5WQUw7CiBtb2R1bGVfcGFyYW0oZGV2LCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkZXYsICJNVEQgZGV2aWNlIG51bWJlciB0byB1c2UiKTsKIApAQCAtMTI4LDcgKzEyOCw3IEBACiAJZm9yIChqID0gMDsgaiA8IHBnY250IC0gMTsgKytqLCBhZGRyICs9IHBnc2l6ZSkgewogCQkvKiBEbyBhIHJlYWQgdG8gc2V0IHRoZSBpbnRlcm5hbCBkYXRhUkFNcyB0byBkaWZmZXJlbnQgZGF0YSAqLwogCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyMCwgYnVmc2l6ZSwgJnJlYWQsIHR3b3BhZ2VzKTsKLQkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCQllcnIgPSAwOwogCQlpZiAoZXJyIHx8IHJlYWQgIT0gYnVmc2l6ZSkgewogCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQkJcmV0dXJuIGVycjsKIAkJfQogCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRybiAtIGJ1ZnNpemUsIGJ1ZnNpemUsICZyZWFkLCB0d29wYWdlcyk7Ci0JCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQkJZXJyID0gMDsKIAkJaWYgKGVyciB8fCByZWFkICE9IGJ1ZnNpemUpIHsKIAkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJbWVtc2V0KHR3b3BhZ2VzLCAwLCBidWZzaXplKTsKIAkJcmVhZCA9IDA7CiAJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIGJ1ZnNpemUsICZyZWFkLCB0d29wYWdlcyk7Ci0JCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQkJZXJyID0gMDsKIAkJaWYgKGVyciB8fCByZWFkICE9IGJ1ZnNpemUpIHsKIAkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBvbGRuZXh0ID0gbmV4dDsKIAkJLyogRG8gYSByZWFkIHRvIHNldCB0aGUgaW50ZXJuYWwgZGF0YVJBTXMgdG8gZGlmZmVyZW50IGRhdGEgKi8KIAkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkcjAsIGJ1ZnNpemUsICZyZWFkLCB0d29wYWdlcyk7Ci0JCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQkJZXJyID0gMDsKIAkJaWYgKGVyciB8fCByZWFkICE9IGJ1ZnNpemUpIHsKIAkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0xNzIsNyArMTcyLDcgQEAKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkcm4gLSBidWZzaXplLCBidWZzaXplLCAmcmVhZCwgdHdvcGFnZXMpOwotCQlpZiAoZXJyID09IC1FVUNMRUFOKQorCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJCWVyciA9IDA7CiAJCWlmIChlcnIgfHwgcmVhZCAhPSBidWZzaXplKSB7CiAJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMTgyLDcgKzE4Miw3IEBACiAJCW1lbXNldCh0d29wYWdlcywgMCwgYnVmc2l6ZSk7CiAJCXJlYWQgPSAwOwogCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBidWZzaXplLCAmcmVhZCwgdHdvcGFnZXMpOwotCQlpZiAoZXJyID09IC1FVUNMRUFOKQorCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJCWVyciA9IDA7CiAJCWlmIChlcnIgfHwgcmVhZCAhPSBidWZzaXplKSB7CiAJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMjMxLDcgKzIzMSw3IEBACiAJcmVhZCA9IDA7CiAJYWRkciA9IGFkZHJuIC0gcGdzaXplIC0gcGdzaXplOwogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHBnc2l6ZSwgJnJlYWQsIHBwMSk7Ci0JaWYgKGVyciA9PSAtRVVDTEVBTikKKwlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJZXJyID0gMDsKIAlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CiAJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAlyZWFkID0gMDsKIAlhZGRyID0gYWRkcm4gLSBwZ3NpemUgLSBwZ3NpemUgLSBwZ3NpemU7CiAJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgcGdzaXplLCAmcmVhZCwgcHAxKTsKLQlpZiAoZXJyID09IC1FVUNMRUFOKQorCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQllcnIgPSAwOwogCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKIAkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKQEAgLTI1OCw3ICsyNTgsNyBAQAogCWFkZHIgPSBhZGRyMDsKIAlwcmludGsoUFJJTlRfUFJFRiAicmVhZGluZyBwYWdlIGF0ICUjbGx4XG4iLCAobG9uZyBsb25nKWFkZHIpOwogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHBnc2l6ZSwgJnJlYWQsIHBwMik7Ci0JaWYgKGVyciA9PSAtRVVDTEVBTikKKwlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJZXJyID0gMDsKIAlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CiAJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0yNzIsNyArMjcyLDcgQEAKIAlhZGRyID0gYWRkcm4gLSBwZ3NpemU7CiAJcHJpbnRrKFBSSU5UX1BSRUYgInJlYWRpbmcgcGFnZSBhdCAlI2xseFxuIiwgKGxvbmcgbG9uZylhZGRyKTsKIAllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBwZ3NpemUsICZyZWFkLCBwcDMpOwotCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCWVyciA9IDA7CiAJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgewogCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMjg2LDcgKzI4Niw3IEBACiAJYWRkciA9IGFkZHIwOwogCXByaW50ayhQUklOVF9QUkVGICJyZWFkaW5nIHBhZ2UgYXQgJSNsbHhcbiIsIChsb25nIGxvbmcpYWRkcik7CiAJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgcGdzaXplLCAmcmVhZCwgcHA0KTsKLQlpZiAoZXJyID09IC1FVUNMRUFOKQorCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQllcnIgPSAwOwogCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKIAkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKQEAgLTM0NSw3ICszNDUsNyBAQAogCXByaW50ayhQUklOVF9QUkVGICJyZWFkaW5nIDFzdCBwYWdlIG9mIGJsb2NrICVkXG4iLCBlYm51bSk7CiAJbWVtc2V0KHJlYWRidWYsIDAsIHBnc2l6ZSk7CiAJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkcjAsIHBnc2l6ZSwgJnJlYWQsIHJlYWRidWYpOwotCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCWVyciA9IDA7CiAJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgewogCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMzgzLDcgKzM4Myw3IEBACiAJcHJpbnRrKFBSSU5UX1BSRUYgInJlYWRpbmcgMXN0IHBhZ2Ugb2YgYmxvY2sgJWRcbiIsIGVibnVtKTsKIAltZW1zZXQocmVhZGJ1ZiwgMCwgcGdzaXplKTsKIAllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyMCwgcGdzaXplLCAmcmVhZCwgcmVhZGJ1Zik7Ci0JaWYgKGVyciA9PSAtRVVDTEVBTikKKwlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJZXJyID0gMDsKIAlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CiAJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC00MzksNyArNDM5LDcgQEAKIAogCXByaW50ayhQUklOVF9QUkVGICJyZWFkaW5nIDFzdCBwYWdlIG9mIGJsb2NrICVkXG4iLCBlYm51bSk7CiAJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkcjAsIHBnc2l6ZSwgJnJlYWQsIHR3b3BhZ2VzKTsKLQlpZiAoZXJyID09IC1FVUNMRUFOKQorCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQllcnIgPSAwOwogCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKIAkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKQEAgLTUwNCw2ICs1MDQsMTMgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIlxuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisKKwlpZiAoZGV2IDwgMCkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBtdGQtZGV2aWNlIHZpYSBtb2R1bGUgcGFyYW10ZXJcbiIpOworCQlwcmludGsoS0VSTl9DUklUICJDQVJFRlVMOiBUaGlzIHRlc3Qgd2lwZXMgYWxsIGRhdGEgb24gdGhlIHNwZWNpZmllZCBNVEQgZGV2aWNlIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXByaW50ayhQUklOVF9QUkVGICJNVEQgZGV2aWNlOiAlZFxuIiwgZGV2KTsKIAogCW10ZCA9IGdldF9tdGRfZGV2aWNlKE5VTEwsIGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfcmVhZHRlc3QuYyBiL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9yZWFkdGVzdC5jCmluZGV4IGFmZTcxYWEuLjU1MGZlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9yZWFkdGVzdC5jCisrKyBiL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9yZWFkdGVzdC5jCkBAIC0yOSw3ICsyOSw3IEBACiAKICNkZWZpbmUgUFJJTlRfUFJFRiBLRVJOX0lORk8gIm10ZF9yZWFkdGVzdDogIgogCi1zdGF0aWMgaW50IGRldjsKK3N0YXRpYyBpbnQgZGV2ID0gLUVJTlZBTDsKIG1vZHVsZV9wYXJhbShkZXYsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGRldiwgIk1URCBkZXZpY2UgbnVtYmVyIHRvIHVzZSIpOwogCkBAIC02Niw3ICs2Niw3IEBACiAJCWlmIChtdGQtPm9vYnNpemUpIHsKIAkJCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAKLQkJCW9wcy5tb2RlICAgICAgPSBNVERfT09CX1BMQUNFOworCQkJb3BzLm1vZGUgICAgICA9IE1URF9PUFNfUExBQ0VfT09COwogCQkJb3BzLmxlbiAgICAgICA9IDA7CiAJCQlvcHMucmV0bGVuICAgID0gMDsKIAkJCW9wcy5vb2JsZW4gICAgPSBtdGQtPm9vYnNpemU7CkBAIC03NSw3ICs3NSw4IEBACiAJCQlvcHMuZGF0YnVmICAgID0gTlVMTDsKIAkJCW9wcy5vb2JidWYgICAgPSBvb2JidWY7CiAJCQlyZXQgPSBtdGQtPnJlYWRfb29iKG10ZCwgYWRkciwgJm9wcyk7Ci0JCQlpZiAocmV0IHx8IG9wcy5vb2JyZXRsZW4gIT0gbXRkLT5vb2JzaXplKSB7CisJCQlpZiAoKHJldCAmJiAhbXRkX2lzX2JpdGZsaXAocmV0KSkgfHwKKwkJCQkJb3BzLm9vYnJldGxlbiAhPSBtdGQtPm9vYnNpemUpIHsKIAkJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgb29iIGZhaWxlZCBhdCAiCiAJCQkJCQkgICIlI2xseFxuIiwgKGxvbmcgbG9uZylhZGRyKTsKIAkJCQlpZiAoIWVycikKQEAgLTE2OSw2ICsxNzAsMTIgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIlxuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisKKwlpZiAoZGV2IDwgMCkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBtdGQtZGV2aWNlIHZpYSBtb2R1bGUgcGFyYW10ZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlwcmludGsoUFJJTlRfUFJFRiAiTVREIGRldmljZTogJWRcbiIsIGRldik7CiAKIAltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3NwZWVkdGVzdC5jIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3NwZWVkdGVzdC5jCmluZGV4IDYyN2Q0ZTIuLjQ5M2IzNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9zcGVlZHRlc3QuYworKysgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3BlZWR0ZXN0LmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogI2RlZmluZSBQUklOVF9QUkVGIEtFUk5fSU5GTyAibXRkX3NwZWVkdGVzdDogIgogCi1zdGF0aWMgaW50IGRldjsKK3N0YXRpYyBpbnQgZGV2ID0gLUVJTlZBTDsKIG1vZHVsZV9wYXJhbShkZXYsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGRldiwgIk1URCBkZXZpY2UgbnVtYmVyIHRvIHVzZSIpOwogCkBAIC0yMTYsNyArMjE2LDcgQEAKIAogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIG10ZC0+ZXJhc2VzaXplLCAmcmVhZCwgaW9idWYpOwogCS8qIElnbm9yZSBjb3JyZWN0ZWQgRUNDIGVycm9ycyAqLwotCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCWVyciA9IDA7CiAJaWYgKGVyciB8fCByZWFkICE9IG10ZC0+ZXJhc2VzaXplKSB7CiAJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsIGFkZHIpOwpAQCAtMjM3LDcgKzIzNyw3IEBACiAJZm9yIChpID0gMDsgaSA8IHBnY250OyBpKyspIHsKIAkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgcGdzaXplLCAmcmVhZCwgYnVmKTsKIAkJLyogSWdub3JlIGNvcnJlY3RlZCBFQ0MgZXJyb3JzICovCi0JCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQkJZXJyID0gMDsKIAkJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgewogCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKQEAgLTI2Myw3ICsyNjMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgc3osICZyZWFkLCBidWYpOwogCQkvKiBJZ25vcmUgY29ycmVjdGVkIEVDQyBlcnJvcnMgKi8KLQkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCQllcnIgPSAwOwogCQlpZiAoZXJyIHx8IHJlYWQgIT0gc3opIHsKIAkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0yNzgsNyArMjc4LDcgQEAKIAlpZiAocGdjbnQgJSAyKSB7CiAJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHBnc2l6ZSwgJnJlYWQsIGJ1Zik7CiAJCS8qIElnbm9yZSBjb3JyZWN0ZWQgRUNDIGVycm9ycyAqLwotCQlpZiAoZXJyID09IC1FVUNMRUFOKQorCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJCWVyciA9IDA7CiAJCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKIAkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0zNjEsNiArMzYxLDEzIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKGRldiA8IDApIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbXRkLWRldmljZSB2aWEgbW9kdWxlIHBhcmFtdGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ0FSRUZVTDogVGhpcyB0ZXN0IHdpcGVzIGFsbCBkYXRhIG9uIHRoZSBzcGVjaWZpZWQgTVREIGRldmljZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoY291bnQpCiAJCXByaW50ayhQUklOVF9QUkVGICJNVEQgZGV2aWNlOiAlZCAgICBjb3VudDogJWRcbiIsIGRldiwgY291bnQpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9zdHJlc3N0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3RyZXNzdGVzdC5jCmluZGV4IDUzMTYyNWYuLjUyZmZkOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9zdHJlc3N0ZXN0LmMKKysrIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3N0cmVzc3Rlc3QuYwpAQCAtMzAsNyArMzAsNyBAQAogCiAjZGVmaW5lIFBSSU5UX1BSRUYgS0VSTl9JTkZPICJtdGRfc3RyZXNzdGVzdDogIgogCi1zdGF0aWMgaW50IGRldjsKK3N0YXRpYyBpbnQgZGV2ID0gLUVJTlZBTDsKIG1vZHVsZV9wYXJhbShkZXYsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGRldiwgIk1URCBkZXZpY2UgbnVtYmVyIHRvIHVzZSIpOwogCkBAIC0xNTQsNyArMTU0LDcgQEAKIAl9CiAJYWRkciA9IGViICogbXRkLT5lcmFzZXNpemUgKyBvZmZzOwogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIGxlbiwgJnJlYWQsIHJlYWRidWYpOwotCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCWVyciA9IDA7CiAJaWYgKHVubGlrZWx5KGVyciB8fCByZWFkICE9IGxlbikpIHsKIAkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAweCVsbHhcbiIsCkBAIC0yNTAsNiArMjUwLDEzIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKGRldiA8IDApIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbXRkLWRldmljZSB2aWEgbW9kdWxlIHBhcmFtdGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ0FSRUZVTDogVGhpcyB0ZXN0IHdpcGVzIGFsbCBkYXRhIG9uIHRoZSBzcGVjaWZpZWQgTVREIGRldmljZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlwcmludGsoUFJJTlRfUFJFRiAiTVREIGRldmljZTogJWRcbiIsIGRldik7CiAKIAltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3N1YnBhZ2V0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3VicGFnZXRlc3QuYwppbmRleCAzMzRlYWU1Li4xYTA1YmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3VicGFnZXRlc3QuYworKysgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3VicGFnZXRlc3QuYwpAQCAtMjksNyArMjksNyBAQAogCiAjZGVmaW5lIFBSSU5UX1BSRUYgS0VSTl9JTkZPICJtdGRfc3VicGFnZXRlc3Q6ICIKIAotc3RhdGljIGludCBkZXY7CitzdGF0aWMgaW50IGRldiA9IC1FSU5WQUw7CiBtb2R1bGVfcGFyYW0oZGV2LCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkZXYsICJNVEQgZGV2aWNlIG51bWJlciB0byB1c2UiKTsKIApAQCAtMTk4LDcgKzE5OCw3IEBACiAJcmVhZCA9IDA7CiAJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgc3VicGdzaXplLCAmcmVhZCwgcmVhZGJ1Zik7CiAJaWYgKHVubGlrZWx5KGVyciB8fCByZWFkICE9IHN1YnBnc2l6ZSkpIHsKLQkJaWYgKGVyciA9PSAtRVVDTEVBTiAmJiByZWFkID09IHN1YnBnc2l6ZSkgeworCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSAmJiByZWFkID09IHN1YnBnc2l6ZSkgewogCQkJcHJpbnRrKFBSSU5UX1BSRUYgIkVDQyBjb3JyZWN0aW9uIGF0ICUjbGx4XG4iLAogCQkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CiAJCQllcnIgPSAwOwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJcmVhZCA9IDA7CiAJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgc3VicGdzaXplLCAmcmVhZCwgcmVhZGJ1Zik7CiAJaWYgKHVubGlrZWx5KGVyciB8fCByZWFkICE9IHN1YnBnc2l6ZSkpIHsKLQkJaWYgKGVyciA9PSAtRVVDTEVBTiAmJiByZWFkID09IHN1YnBnc2l6ZSkgeworCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSAmJiByZWFkID09IHN1YnBnc2l6ZSkgewogCQkJcHJpbnRrKFBSSU5UX1BSRUYgIkVDQyBjb3JyZWN0aW9uIGF0ICUjbGx4XG4iLAogCQkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CiAJCQllcnIgPSAwOwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJCXJlYWQgPSAwOwogCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBzdWJwZ3NpemUgKiBrLCAmcmVhZCwgcmVhZGJ1Zik7CiAJCWlmICh1bmxpa2VseShlcnIgfHwgcmVhZCAhPSBzdWJwZ3NpemUgKiBrKSkgewotCQkJaWYgKGVyciA9PSAtRVVDTEVBTiAmJiByZWFkID09IHN1YnBnc2l6ZSAqIGspIHsKKwkJCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpICYmIHJlYWQgPT0gc3VicGdzaXplICogaykgewogCQkJCXByaW50ayhQUklOVF9QUkVGICJFQ0MgY29ycmVjdGlvbiBhdCAlI2xseFxuIiwKIAkJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKIAkJCQllcnIgPSAwOwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJCXJlYWQgPSAwOwogCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBzdWJwZ3NpemUsICZyZWFkLCByZWFkYnVmKTsKIAkJaWYgKHVubGlrZWx5KGVyciB8fCByZWFkICE9IHN1YnBnc2l6ZSkpIHsKLQkJCWlmIChlcnIgPT0gLUVVQ0xFQU4gJiYgcmVhZCA9PSBzdWJwZ3NpemUpIHsKKwkJCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpICYmIHJlYWQgPT0gc3VicGdzaXplKSB7CiAJCQkJcHJpbnRrKFBSSU5UX1BSRUYgIkVDQyBjb3JyZWN0aW9uIGF0ICUjbGx4XG4iLAogCQkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOwogCQkJCWVyciA9IDA7CkBAIC0zNzksNiArMzc5LDEzIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKGRldiA8IDApIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbXRkLWRldmljZSB2aWEgbW9kdWxlIHBhcmFtdGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ0FSRUZVTDogVGhpcyB0ZXN0IHdpcGVzIGFsbCBkYXRhIG9uIHRoZSBzcGVjaWZpZWQgTVREIGRldmljZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlwcmludGsoUFJJTlRfUFJFRiAiTVREIGRldmljZTogJWRcbiIsIGRldik7CiAKIAltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3RvcnR1cmV0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfdG9ydHVyZXRlc3QuYwppbmRleCA1YzZjM2QyLi4wM2FiNjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfdG9ydHVyZXRlc3QuYworKysgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfdG9ydHVyZXRlc3QuYwpAQCAtNDYsNyArNDYsNyBAQAogbW9kdWxlX3BhcmFtKHBnY250LCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhwZ2NudCwgIm51bWJlciBvZiBwYWdlcyBwZXIgZXJhc2VibG9jayB0byB0b3J0dXJlICgwID0+IGFsbCkiKTsKIAotc3RhdGljIGludCBkZXY7CitzdGF0aWMgaW50IGRldiA9IC1FSU5WQUw7CiBtb2R1bGVfcGFyYW0oZGV2LCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkZXYsICJNVEQgZGV2aWNlIG51bWJlciB0byB1c2UiKTsKIApAQCAtMTM4LDcgKzEzOCw3IEBACiAKIHJldHJ5OgogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIGxlbiwgJnJlYWQsIGNoZWNrX2J1Zik7Ci0JaWYgKGVyciA9PSAtRVVDTEVBTikKKwlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJcHJpbnRrKFBSSU5UX1BSRUYgInNpbmdsZSBiaXQgZmxpcCBvY2N1cnJlZCBhdCBFQiAlZCAiCiAJCSAgICAgICAiTVREIHJlcG9ydGVkIHRoYXQgaXQgd2FzIGZpeGVkLlxuIiwgZWJudW0pOwogCWVsc2UgaWYgKGVycikgewpAQCAtMjEzLDYgKzIxMywxMyBAQAogCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCXByaW50ayhQUklOVF9QUkVGICJXYXJuaW5nOiB0aGlzIHByb2dyYW0gaXMgdHJ5aW5nIHRvIHdlYXIgb3V0IHlvdXIgIgogCSAgICAgICAiZmxhc2gsIHN0b3AgaXQgaWYgdGhpcyBpcyBub3Qgd2FudGVkLlxuIik7CisKKwlpZiAoZGV2IDwgMCkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBtdGQtZGV2aWNlIHZpYSBtb2R1bGUgcGFyYW10ZXJcbiIpOworCQlwcmludGsoS0VSTl9DUklUICJDQVJFRlVMOiBUaGlzIHRlc3Qgd2lwZXMgYWxsIGRhdGEgb24gdGhlIHNwZWNpZmllZCBNVEQgZGV2aWNlIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXByaW50ayhQUklOVF9QUkVGICJNVEQgZGV2aWNlOiAlZFxuIiwgZGV2KTsKIAlwcmludGsoUFJJTlRfUFJFRiAidG9ydHVyZSAlZCBlcmFzZWJsb2NrcyAoJWQtJWQpIG9mIG10ZCVkXG4iLAogCSAgICAgICBlYmNudCwgZWIsIGViICsgZWJjbnQgLSAxLCBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2ViYS5jIGIvZHJpdmVycy9tdGQvdWJpL2ViYS5jCmluZGV4IDRiZTY3MTgxLi5mYjdmMTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvZWJhLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2ViYS5jCkBAIC00NDMsNyArNDQzLDcgQEAKIAkJaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMpIHsKIAkJCXNjcnViID0gMTsKIAkJCWVyciA9IDA7Ci0JCX0gZWxzZSBpZiAoZXJyID09IC1FQkFETVNHKSB7CisJCX0gZWxzZSBpZiAobXRkX2lzX2VjY2VycihlcnIpKSB7CiAJCQlpZiAodm9sLT52b2xfdHlwZSA9PSBVQklfRFlOQU1JQ19WT0xVTUUpCiAJCQkJZ290byBvdXRfdW5sb2NrOwogCQkJc2NydWIgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2lvLmMgYi9kcml2ZXJzL210ZC91YmkvaW8uYwppbmRleCA2YmE1NWMyLi5mMjBiNmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvaW8uYworKysgYi9kcml2ZXJzL210ZC91YmkvaW8uYwpAQCAtMTcyLDkgKzE3Miw5IEBACiByZXRyeToKIAllcnIgPSB1YmktPm10ZC0+cmVhZCh1YmktPm10ZCwgYWRkciwgbGVuLCAmcmVhZCwgYnVmKTsKIAlpZiAoZXJyKSB7Ci0JCWNvbnN0IGNoYXIgKmVycnN0ciA9IChlcnIgPT0gLUVCQURNU0cpID8gIiAoRUNDIGVycm9yKSIgOiAiIjsKKwkJY29uc3QgY2hhciAqZXJyc3RyID0gbXRkX2lzX2VjY2VycihlcnIpID8gIiAoRUNDIGVycm9yKSIgOiAiIjsKIAotCQlpZiAoZXJyID09IC1FVUNMRUFOKSB7CisJCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKSB7CiAJCQkvKgogCQkJICogLUVVQ0xFQU4gaXMgcmVwb3J0ZWQgaWYgdGhlcmUgd2FzIGEgYml0LWZsaXAgd2hpY2gKIAkJCSAqIHdhcyBjb3JyZWN0ZWQsIHNvIHRoaXMgaXMgaGFybWxlc3MuCkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJICogYWxsIHRoZSByZXF1ZXN0ZWQgZGF0YS4gQnV0IHNvbWUgYnVnZ3kgZHJpdmVycyBtaWdodCBkbwogCQkgKiB0aGlzLCBzbyB3ZSBjaGFuZ2UgaXQgdG8gLUVJTy4KIAkJICovCi0JCWlmIChyZWFkICE9IGxlbiAmJiBlcnIgPT0gLUVCQURNU0cpIHsKKwkJaWYgKHJlYWQgIT0gbGVuICYmIG10ZF9pc19lY2NlcnIoZXJyKSkgewogCQkJdWJpX2Fzc2VydCgwKTsKIAkJCWVyciA9IC1FSU87CiAJCX0KQEAgLTQ2OSw3ICs0NjksNyBAQAogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ1YmktPmJ1Zl9tdXRleCk7Ci0JaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMgfHwgZXJyID09IC1FQkFETVNHKSB7CisJaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMgfHwgbXRkX2lzX2VjY2VycihlcnIpKSB7CiAJCS8qCiAJCSAqIElmIGEgYml0LWZsaXAgb3IgZGF0YSBpbnRlZ3JpdHkgZXJyb3Igd2FzIGRldGVjdGVkLCB0aGUgdGVzdAogCQkgKiBoYXMgbm90IHBhc3NlZCBiZWNhdXNlIGl0IGhhcHBlbmVkIG9uIGEgZnJlc2hseSBlcmFzZWQKQEAgLTc2MCw3ICs3NjAsNyBAQAogCiAJcmVhZF9lcnIgPSB1YmlfaW9fcmVhZCh1YmksIGVjX2hkciwgcG51bSwgMCwgVUJJX0VDX0hEUl9TSVpFKTsKIAlpZiAocmVhZF9lcnIpIHsKLQkJaWYgKHJlYWRfZXJyICE9IFVCSV9JT19CSVRGTElQUyAmJiByZWFkX2VyciAhPSAtRUJBRE1TRykKKwkJaWYgKHJlYWRfZXJyICE9IFVCSV9JT19CSVRGTElQUyAmJiAhbXRkX2lzX2VjY2VycihyZWFkX2VycikpCiAJCQlyZXR1cm4gcmVhZF9lcnI7CiAKIAkJLyoKQEAgLTc3Niw3ICs3NzYsNyBAQAogCiAJbWFnaWMgPSBiZTMyX3RvX2NwdShlY19oZHItPm1hZ2ljKTsKIAlpZiAobWFnaWMgIT0gVUJJX0VDX0hEUl9NQUdJQykgewotCQlpZiAocmVhZF9lcnIgPT0gLUVCQURNU0cpCisJCWlmIChtdGRfaXNfZWNjZXJyKHJlYWRfZXJyKSkKIAkJCXJldHVybiBVQklfSU9fQkFEX0hEUl9FQkFETVNHOwogCiAJCS8qCkBAIC0xMDMyLDEyICsxMDMyLDEyIEBACiAJcCA9IChjaGFyICopdmlkX2hkciAtIHViaS0+dmlkX2hkcl9zaGlmdDsKIAlyZWFkX2VyciA9IHViaV9pb19yZWFkKHViaSwgcCwgcG51bSwgdWJpLT52aWRfaGRyX2Fsb2Zmc2V0LAogCQkJICB1YmktPnZpZF9oZHJfYWxzaXplKTsKLQlpZiAocmVhZF9lcnIgJiYgcmVhZF9lcnIgIT0gVUJJX0lPX0JJVEZMSVBTICYmIHJlYWRfZXJyICE9IC1FQkFETVNHKQorCWlmIChyZWFkX2VyciAmJiByZWFkX2VyciAhPSBVQklfSU9fQklURkxJUFMgJiYgIW10ZF9pc19lY2NlcnIocmVhZF9lcnIpKQogCQlyZXR1cm4gcmVhZF9lcnI7CiAKIAltYWdpYyA9IGJlMzJfdG9fY3B1KHZpZF9oZHItPm1hZ2ljKTsKIAlpZiAobWFnaWMgIT0gVUJJX1ZJRF9IRFJfTUFHSUMpIHsKLQkJaWYgKHJlYWRfZXJyID09IC1FQkFETVNHKQorCQlpZiAobXRkX2lzX2VjY2VycihyZWFkX2VycikpCiAJCQlyZXR1cm4gVUJJX0lPX0JBRF9IRFJfRUJBRE1TRzsKIAogCQlpZiAodWJpX2NoZWNrX3BhdHRlcm4odmlkX2hkciwgMHhGRiwgVUJJX1ZJRF9IRFJfU0laRSkpIHsKQEAgLTEyMTksNyArMTIxOSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZXJyID0gdWJpX2lvX3JlYWQodWJpLCBlY19oZHIsIHBudW0sIDAsIFVCSV9FQ19IRFJfU0laRSk7Ci0JaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTICYmIGVyciAhPSAtRUJBRE1TRykKKwlpZiAoZXJyICYmIGVyciAhPSBVQklfSU9fQklURkxJUFMgJiYgIW10ZF9pc19lY2NlcnIoZXJyKSkKIAkJZ290byBleGl0OwogCiAJY3JjID0gY3JjMzIoVUJJX0NSQzMyX0lOSVQsIGVjX2hkciwgVUJJX0VDX0hEUl9TSVpFX0NSQyk7CkBAIC0xMzA2LDcgKzEzMDYsNyBAQAogCXAgPSAoY2hhciAqKXZpZF9oZHIgLSB1YmktPnZpZF9oZHJfc2hpZnQ7CiAJZXJyID0gdWJpX2lvX3JlYWQodWJpLCBwLCBwbnVtLCB1YmktPnZpZF9oZHJfYWxvZmZzZXQsCiAJCQkgIHViaS0+dmlkX2hkcl9hbHNpemUpOwotCWlmIChlcnIgJiYgZXJyICE9IFVCSV9JT19CSVRGTElQUyAmJiBlcnIgIT0gLUVCQURNU0cpCisJaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTICYmICFtdGRfaXNfZWNjZXJyKGVycikpCiAJCWdvdG8gZXhpdDsKIAogCWNyYyA9IGNyYzMyKFVCSV9DUkMzMl9JTklULCB2aWRfaGRyLCBVQklfRUNfSERSX1NJWkVfQ1JDKTsKQEAgLTEzNTgsNyArMTM1OCw3IEBACiAJfQogCiAJZXJyID0gdWJpLT5tdGQtPnJlYWQodWJpLT5tdGQsIGFkZHIsIGxlbiwgJnJlYWQsIGJ1ZjEpOwotCWlmIChlcnIgJiYgZXJyICE9IC1FVUNMRUFOKQorCWlmIChlcnIgJiYgIW10ZF9pc19iaXRmbGlwKGVycikpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTE0MjIsNyArMTQyMiw3IEBACiAJfQogCiAJZXJyID0gdWJpLT5tdGQtPnJlYWQodWJpLT5tdGQsIGFkZHIsIGxlbiwgJnJlYWQsIGJ1Zik7Ci0JaWYgKGVyciAmJiBlcnIgIT0gLUVVQ0xFQU4pIHsKKwlpZiAoZXJyICYmICFtdGRfaXNfYml0ZmxpcChlcnIpKSB7CiAJCXViaV9lcnIoImVycm9yICVkIHdoaWxlIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBQRUIgJWQ6JWQsICIKIAkJCSJyZWFkICV6ZCBieXRlcyIsIGVyciwgbGVuLCBwbnVtLCBvZmZzZXQsIHJlYWQpOwogCQlnb3RvIGVycm9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2thcGkuYyBiL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMKaW5kZXggZDM5NzE2ZS4uMWEzNWZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2thcGkuYworKysgYi9kcml2ZXJzL210ZC91Ymkva2FwaS5jCkBAIC00MTAsNyArNDEwLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAllcnIgPSB1YmlfZWJhX3JlYWRfbGViKHViaSwgdm9sLCBsbnVtLCBidWYsIG9mZnNldCwgbGVuLCBjaGVjayk7Ci0JaWYgKGVyciAmJiBlcnIgPT0gLUVCQURNU0cgJiYgdm9sLT52b2xfdHlwZSA9PSBVQklfU1RBVElDX1ZPTFVNRSkgeworCWlmIChlcnIgJiYgbXRkX2lzX2VjY2VycihlcnIpICYmIHZvbC0+dm9sX3R5cGUgPT0gVUJJX1NUQVRJQ19WT0xVTUUpIHsKIAkJdWJpX3dhcm4oIm1hcmsgdm9sdW1lICVkIGFzIGNvcnJ1cHRlZCIsIHZvbF9pZCk7CiAJCXZvbC0+Y29ycnVwdGVkID0gMTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvbWlzYy5jIGIvZHJpdmVycy9tdGQvdWJpL21pc2MuYwppbmRleCBmZjJhNjVjLi5mNmE3ZDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvbWlzYy5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9taXNjLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAogCQllcnIgPSB1YmlfZWJhX3JlYWRfbGViKHViaSwgdm9sLCBpLCBidWYsIDAsIHNpemUsIDEpOwogCQlpZiAoZXJyKSB7Ci0JCQlpZiAoZXJyID09IC1FQkFETVNHKQorCQkJaWYgKG10ZF9pc19lY2NlcnIoZXJyKSkKIAkJCQllcnIgPSAxOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMgYi9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCmluZGV4IGEzYTE5OGYuLjBjYjE3ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uYwpAQCAtMzk1LDcgKzM5NSw3IEBACiAJfQogCiAJZXJyID0gdWJpX2lvX3JlYWRfZGF0YSh1YmksIGJ1ZiwgcG51bSwgMCwgbGVuKTsKLQlpZiAoZXJyICYmIGVyciAhPSBVQklfSU9fQklURkxJUFMgJiYgZXJyICE9IC1FQkFETVNHKQorCWlmIChlcnIgJiYgZXJyICE9IFVCSV9JT19CSVRGTElQUyAmJiAhbXRkX2lzX2VjY2VycihlcnIpKQogCQlnb3RvIG91dF9mcmVlX2J1ZjsKIAogCWRhdGFfY3JjID0gYmUzMl90b19jcHUodmlkX2hkci0+ZGF0YV9jcmMpOwpAQCAtNzkzLDcgKzc5Myw3IEBACiAKIAllcnIgPSB1YmlfaW9fcmVhZCh1YmksIHViaS0+cGViX2J1ZjEsIHBudW0sIHViaS0+bGViX3N0YXJ0LAogCQkJICB1YmktPmxlYl9zaXplKTsKLQlpZiAoZXJyID09IFVCSV9JT19CSVRGTElQUyB8fCBlcnIgPT0gLUVCQURNU0cpIHsKKwlpZiAoZXJyID09IFVCSV9JT19CSVRGTElQUyB8fCBtdGRfaXNfZWNjZXJyKGVycikpIHsKIAkJLyoKIAkJICogQml0LWZsaXBzIG9yIGludGVncml0eSBlcnJvcnMgd2hpbGUgcmVhZGluZyB0aGUgZGF0YSBhcmVhLgogCQkgKiBJdCBpcyBkaWZmaWN1bHQgdG8gc2F5IGZvciBzdXJlIHdoYXQgdHlwZSBvZiBjb3JydXB0aW9uIGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvdm10LmMgYi9kcml2ZXJzL210ZC91Ymkvdm10LmMKaW5kZXggOTdlMDkzZC4uODYzODM1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3ZtdC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS92bXQuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ1YmkuaCIKIAogI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvdnRibC5jIGIvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYwppbmRleCA0YjUwYTMwLi45YWQxOGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvdnRibC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMKQEAgLTQyMyw3ICs0MjMsNyBAQAogCiAJCWVyciA9IHViaV9pb19yZWFkX2RhdGEodWJpLCBsZWJbc2ViLT5sbnVtXSwgc2ViLT5wbnVtLCAwLAogCQkJCSAgICAgICB1YmktPnZ0Ymxfc2l6ZSk7Ci0JCWlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTIHx8IGVyciA9PSAtRUJBRE1TRykKKwkJaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMgfHwgbXRkX2lzX2VjY2VycihlcnIpKQogCQkJLyoKIAkJCSAqIFNjcnViIHRoZSBQRUIgbGF0ZXIuIE5vdGUsIC1FQkFETVNHIGluZGljYXRlcyBhbgogCQkJICogdW5jb3JyZWN0YWJsZSBFQ0MgZXJyb3IsIGJ1dCB3ZSBoYXZlIG91ciBvd24gQ1JDIGFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggYzM0Y2MxZS4uYjBjNTc3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC01NTAsNyArNTUwLDcgQEAKIC8qCiAgKiBHZXQgbGluayBzcGVlZCBhbmQgZHVwbGV4IGZyb20gdGhlIHNsYXZlJ3MgYmFzZSBkcml2ZXIKICAqIHVzaW5nIGV0aHRvb2wuIElmIGZvciBzb21lIHJlYXNvbiB0aGUgY2FsbCBmYWlscyBvciB0aGUKLSAqIHZhbHVlcyBhcmUgaW52YWxpZCwgZmFrZSBzcGVlZCBhbmQgZHVwbGV4IHRvIDEwMC9GdWxsCisgKiB2YWx1ZXMgYXJlIGludmFsaWQsIHNldCBzcGVlZCBhbmQgZHVwbGV4IHRvIC0xLAogICogYW5kIHJldHVybiBlcnJvci4KICAqLwogc3RhdGljIGludCBib25kX3VwZGF0ZV9zcGVlZF9kdXBsZXgoc3RydWN0IHNsYXZlICpzbGF2ZSkKQEAgLTU2MCw5ICs1NjAsOCBAQAogCXUzMiBzbGF2ZV9zcGVlZDsKIAlpbnQgcmVzOwogCi0JLyogRmFrZSBzcGVlZCBhbmQgZHVwbGV4ICovCi0Jc2xhdmUtPnNwZWVkID0gU1BFRURfMTAwOwotCXNsYXZlLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwlzbGF2ZS0+c3BlZWQgPSBTUEVFRF9VTktOT1dOOworCXNsYXZlLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAogCXJlcyA9IF9fZXRodG9vbF9nZXRfc2V0dGluZ3Moc2xhdmVfZGV2LCAmZWNtZCk7CiAJaWYgKHJlcyA8IDApCkBAIC0xNzUxLDE2ICsxNzUwLDcgQEAKIAkJbmV3X3NsYXZlLT5saW5rICA9IEJPTkRfTElOS19ET1dOOwogCX0KIAotCWlmIChib25kX3VwZGF0ZV9zcGVlZF9kdXBsZXgobmV3X3NsYXZlKSAmJgotCSAgICAobmV3X3NsYXZlLT5saW5rICE9IEJPTkRfTElOS19ET1dOKSkgewotCQlwcl93YXJuaW5nKCIlczogV2FybmluZzogZmFpbGVkIHRvIGdldCBzcGVlZCBhbmQgZHVwbGV4IGZyb20gJXMsIGFzc3VtZWQgdG8gYmUgMTAwTWIvc2VjIGFuZCBGdWxsLlxuIiwKLQkJCSAgIGJvbmRfZGV2LT5uYW1lLCBuZXdfc2xhdmUtPmRldi0+bmFtZSk7Ci0KLQkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKLQkJCXByX3dhcm5pbmcoIiVzOiBXYXJuaW5nOiBPcGVyYXRpb24gb2YgODAyLjNhZCBtb2RlIHJlcXVpcmVzIEVUSFRPT0wgc3VwcG9ydCBpbiBiYXNlIGRyaXZlciBmb3IgcHJvcGVyIGFnZ3JlZ2F0b3Igc2VsZWN0aW9uLlxuIiwKLQkJCQkgICBib25kX2Rldi0+bmFtZSk7Ci0JCX0KLQl9CisJYm9uZF91cGRhdGVfc3BlZWRfZHVwbGV4KG5ld19zbGF2ZSk7CiAKIAlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSAmJiBib25kLT5wYXJhbXMucHJpbWFyeVswXSkgewogCQkvKiBpZiB0aGVyZSBpcyBhIHByaW1hcnkgc2xhdmUsIHJlbWVtYmVyIGl0ICovCkBAIC0zMjIwLDYgKzMyMTAsNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiA9IHNsYXZlX2Rldi0+bWFzdGVyOwogCXN0cnVjdCBib25kaW5nICpib25kID0gbmV0ZGV2X3ByaXYoYm9uZF9kZXYpOworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBOVUxMOwogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CkBAIC0zMjMwLDIwICszMjIxLDE2IEBACiAJCQkJYm9uZF9yZWxlYXNlKGJvbmRfZGV2LCBzbGF2ZV9kZXYpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgTkVUREVWX1VQOgogCWNhc2UgTkVUREVWX0NIQU5HRToKLQkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQgfHwgYm9uZF9pc19sYihib25kKSkgewotCQkJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwkJc2xhdmUgPSBib25kX2dldF9zbGF2ZV9ieV9kZXYoYm9uZCwgc2xhdmVfZGV2KTsKKwkJaWYgKHNsYXZlKSB7CisJCQl1MzIgb2xkX3NwZWVkID0gc2xhdmUtPnNwZWVkOworCQkJdTggIG9sZF9kdXBsZXggPSBzbGF2ZS0+ZHVwbGV4OwogCi0JCQlzbGF2ZSA9IGJvbmRfZ2V0X3NsYXZlX2J5X2Rldihib25kLCBzbGF2ZV9kZXYpOwotCQkJaWYgKHNsYXZlKSB7Ci0JCQkJdTMyIG9sZF9zcGVlZCA9IHNsYXZlLT5zcGVlZDsKLQkJCQl1OCAgb2xkX2R1cGxleCA9IHNsYXZlLT5kdXBsZXg7CisJCQlib25kX3VwZGF0ZV9zcGVlZF9kdXBsZXgoc2xhdmUpOwogCi0JCQkJYm9uZF91cGRhdGVfc3BlZWRfZHVwbGV4KHNsYXZlKTsKLQotCQkJCWlmIChib25kX2lzX2xiKGJvbmQpKQotCQkJCQlicmVhazsKLQorCQkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKIAkJCQlpZiAob2xkX3NwZWVkICE9IHNsYXZlLT5zcGVlZCkKIAkJCQkJYm9uZF8zYWRfYWRhcHRlcl9zcGVlZF9jaGFuZ2VkKHNsYXZlKTsKIAkJCQlpZiAob2xkX2R1cGxleCAhPSBzbGF2ZS0+ZHVwbGV4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3Byb2Nmcy5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3Byb2Nmcy5jCmluZGV4IDk1ZGU5M2IuLmFkMjg0YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9wcm9jZnMuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfcHJvY2ZzLmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KICNpbmNsdWRlICJib25kaW5nLmgiCkBAIC0xNTcsOCArMTU4LDE2IEBACiAJc2VxX3ByaW50ZihzZXEsICJcblNsYXZlIEludGVyZmFjZTogJXNcbiIsIHNsYXZlLT5kZXYtPm5hbWUpOwogCXNlcV9wcmludGYoc2VxLCAiTUlJIFN0YXR1czogJXNcbiIsCiAJCSAgIChzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVApID8gICJ1cCIgOiAiZG93biIpOwotCXNlcV9wcmludGYoc2VxLCAiU3BlZWQ6ICVkIE1icHNcbiIsIHNsYXZlLT5zcGVlZCk7Ci0Jc2VxX3ByaW50ZihzZXEsICJEdXBsZXg6ICVzXG4iLCBzbGF2ZS0+ZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwlpZiAoc2xhdmUtPnNwZWVkID09IFNQRUVEX1VOS05PV04pCisJCXNlcV9wcmludGYoc2VxLCAiU3BlZWQ6ICVzXG4iLCAiVW5rbm93biIpOworCWVsc2UKKwkJc2VxX3ByaW50ZihzZXEsICJTcGVlZDogJWQgTWJwc1xuIiwgc2xhdmUtPnNwZWVkKTsKKworCWlmIChzbGF2ZS0+ZHVwbGV4ID09IERVUExFWF9VTktOT1dOKQorCQlzZXFfcHJpbnRmKHNlcSwgIkR1cGxleDogJXNcbiIsICJVbmtub3duIik7CisJZWxzZQorCQlzZXFfcHJpbnRmKHNlcSwgIkR1cGxleDogJXNcbiIsIHNsYXZlLT5kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCiAJc2VxX3ByaW50ZihzZXEsICJMaW5rIEZhaWx1cmUgQ291bnQ6ICV1XG4iLAogCQkgICBzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcKaW5kZXggNmRmZjVhMC4uNTk3ZjRkNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvS2NvbmZpZwpAQCAtMTU5LDYgKzE1OSw3IEBACiAJICB3aWxsIGJlIGNhbGxlZCBzNmdtYWMuCiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvc2VlcS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9zaWxhbi9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L3NnaS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZQppbmRleCBjNTNhZDNhLi5iZTVkZGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZQpAQCAtNTgsNiArNTgsNyBAQAogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfUkRDKSArPSByZGMvCiBvYmotJChDT05GSUdfUzZHTUFDKSArPSBzNmdtYWMubwogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfU0VFUSkgKz0gc2VlcS8KK29iai0kKENPTkZJR19ORVRfVkVORE9SX1NJTEFOKSArPSBzaWxhbi8KIG9iai0kKENPTkZJR19ORVRfVkVORE9SX1NJUykgKz0gc2lzLwogb2JqLSQoQ09ORklHX1NGQykgKz0gc2ZjLwogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfU0dJKSArPSBzZ2kvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXUxMDAwX2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2F1MTAwMF9ldGguYwppbmRleCA4MjM4NjY3Li40ODY1ZmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXUxMDAwX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hdTEwMDBfZXRoLmMKQEAgLTU0MSwxOSArNTQxLDE3IEBACiAgKiB0aGVzZSBhcmUgbm90IGRlc2NyaXB0b3JzIHNpdHRpbmcgaW4gbWVtb3J5LgogICovCiBzdGF0aWMgdm9pZAotYXUxMDAwX3NldHVwX2h3X3JpbmdzKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwLCB1MzIgcnhfYmFzZSwgdTMyIHR4X2Jhc2UpCithdTEwMDBfc2V0dXBfaHdfcmluZ3Moc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAsIHZvaWQgX19pb21lbSAqdHhfYmFzZSkKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfRE1BOyBpKyspIHsKLQkJYXVwLT5yeF9kbWFfcmluZ1tpXSA9Ci0JCQkoc3RydWN0IHJ4X2RtYSAqKQotCQkJCQkocnhfYmFzZSArIHNpemVvZihzdHJ1Y3QgcnhfZG1hKSppKTsKKwkJYXVwLT5yeF9kbWFfcmluZ1tpXSA9IChzdHJ1Y3QgcnhfZG1hICopCisJCQkodHhfYmFzZSArIDB4MTAwICsgc2l6ZW9mKHN0cnVjdCByeF9kbWEpICogaSk7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfRE1BOyBpKyspIHsKLQkJYXVwLT50eF9kbWFfcmluZ1tpXSA9Ci0JCQkoc3RydWN0IHR4X2RtYSAqKQotCQkJCQkodHhfYmFzZSArIHNpemVvZihzdHJ1Y3QgdHhfZG1hKSppKTsKKwkJYXVwLT50eF9kbWFfcmluZ1tpXSA9IChzdHJ1Y3QgdHhfZG1hICopCisJCQkodHhfYmFzZSArIHNpemVvZihzdHJ1Y3QgdHhfZG1hKSAqIGkpOwogCX0KIH0KIApAQCAtMTAyNiw3ICsxMDI0LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgZGJfZGVzdCAqcERCLCAqcERCZnJlZTsKIAlpbnQgaXJxLCBpLCBlcnIgPSAwOwotCXN0cnVjdCByZXNvdXJjZSAqYmFzZSwgKm1hY2VuOworCXN0cnVjdCByZXNvdXJjZSAqYmFzZSwgKm1hY2VuLCAqbWFjZG1hOwogCiAJYmFzZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFiYXNlKSB7CkBAIC0xMDQ5LDYgKzEwNDcsMTMgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJbWFjZG1hID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAyKTsKKwlpZiAoIW1hY2RtYSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmV0cmlldmUgTUFDRE1BIHJlZ2lzdGVyc1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2UtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGJhc2UpLAogCQkJCQkJCXBkZXYtPm5hbWUpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IG1lbW9yeSByZWdpb24gZm9yIGJhc2UgcmVnaXN0ZXJzXG4iKTsKQEAgLTEwNjMsNiArMTA2OCwxMyBAQAogCQlnb3RvIGVycl9yZXF1ZXN0OwogCX0KIAorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1hY2RtYS0+c3RhcnQsIHJlc291cmNlX3NpemUobWFjZG1hKSwKKwkJCQkJCQlwZGV2LT5uYW1lKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBNQUNETUEgbWVtb3J5IHJlZ2lvblxuIik7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBlcnJfbWFjZG1hOworCX0KKwogCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUpKTsKIAlpZiAoIWRldikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhbGxvY19ldGhlcmRldiBmYWlsZWRcbiIpOwpAQCAtMTEwOSwxMCArMTEyMSwxNCBAQAogCX0KIAlhdXAtPm1hY19pZCA9IHBkZXYtPmlkOwogCi0JaWYgKHBkZXYtPmlkID09IDApCi0JCWF1MTAwMF9zZXR1cF9od19yaW5ncyhhdXAsIE1BQzBfUlhfRE1BX0FERFIsIE1BQzBfVFhfRE1BX0FERFIpOwotCWVsc2UgaWYgKHBkZXYtPmlkID09IDEpCi0JCWF1MTAwMF9zZXR1cF9od19yaW5ncyhhdXAsIE1BQzFfUlhfRE1BX0FERFIsIE1BQzFfVFhfRE1BX0FERFIpOworCWF1cC0+bWFjZG1hID0gaW9yZW1hcF9ub2NhY2hlKG1hY2RtYS0+c3RhcnQsIHJlc291cmNlX3NpemUobWFjZG1hKSk7CisJaWYgKCFhdXAtPm1hY2RtYSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW9yZW1hcCBNQUNETUEgcmVnaXN0ZXJzXG4iKTsKKwkJZXJyID0gLUVOWElPOworCQlnb3RvIGVycl9yZW1hcDM7CisJfQorCisJYXUxMDAwX3NldHVwX2h3X3JpbmdzKGF1cCwgYXVwLT5tYWNkbWEpOwogCiAJLyogc2V0IGEgcmFuZG9tIE1BQyBub3cgaW4gY2FzZSBwbGF0Zm9ybV9kYXRhIGRvZXNuJ3QgcHJvdmlkZSBvbmUgKi8KIAlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKQEAgLTEyNTIsNiArMTI2OCw4IEBACiBlcnJfbWRpb2J1c19yZWc6CiAJbWRpb2J1c19mcmVlKGF1cC0+bWlpX2J1cyk7CiBlcnJfbWRpb2J1c19hbGxvYzoKKwlpb3VubWFwKGF1cC0+bWFjZG1hKTsKK2Vycl9yZW1hcDM6CiAJaW91bm1hcChhdXAtPmVuYWJsZSk7CiBlcnJfcmVtYXAyOgogCWlvdW5tYXAoYXVwLT5tYWMpOwpAQCAtMTI2MSw2ICsxMjc5LDggQEAKIGVycl92YWRkcjoKIAlmcmVlX25ldGRldihkZXYpOwogZXJyX2FsbG9jOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtYWNkbWEtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1hY2RtYSkpOworZXJyX21hY2RtYToKIAlyZWxlYXNlX21lbV9yZWdpb24obWFjZW4tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1hY2VuKSk7CiBlcnJfcmVxdWVzdDoKIAlyZWxlYXNlX21lbV9yZWdpb24oYmFzZS0+c3RhcnQsIHJlc291cmNlX3NpemUoYmFzZSkpOwpAQCAtMTI5Myw5ICsxMzEzLDEzIEBACiAJCQkoTlVNX1RYX0JVRkZTICsgTlVNX1JYX0JVRkZTKSwKIAkJCSh2b2lkICopYXVwLT52YWRkciwgYXVwLT5kbWFfYWRkcik7CiAKKwlpb3VubWFwKGF1cC0+bWFjZG1hKTsKIAlpb3VubWFwKGF1cC0+bWFjKTsKIAlpb3VubWFwKGF1cC0+ZW5hYmxlKTsKIAorCWJhc2UgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDIpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihiYXNlLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShiYXNlKSk7CisKIAliYXNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oYmFzZS0+c3RhcnQsIHJlc291cmNlX3NpemUoYmFzZSkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXUxMDAwX2V0aC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2F1MTAwMF9ldGguaAppbmRleCA2MjI5Yzc3Li40YjdmN2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXUxMDAwX2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hdTEwMDBfZXRoLmgKQEAgLTEyNCw3ICsxMjQsNyBAQAogCSAqLwogCXN0cnVjdCBtYWNfcmVnICptYWM7ICAvKiBtYWMgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICovCiAJdTMyICplbmFibGU7ICAgICAvKiBhZGRyZXNzIG9mIE1BQyBFbmFibGUgUmVnaXN0ZXIgICAgICovCi0KKwl2b2lkIF9faW9tZW0gKm1hY2RtYTsJLyogYmFzZSBvZiBNQUMgRE1BIHBvcnQgKi8KIAl1MzIgdmFkZHI7ICAgICAgICAgICAgICAgIC8qIHZpcnR1YWwgYWRkcmVzcyBvZiByeC90eCBidWZmZXJzICAgKi8KIAlkbWFfYWRkcl90IGRtYV9hZGRyOyAgICAgIC8qIGRtYSBhZGRyZXNzIG9mIHJ4L3R4IGJ1ZmZlcnMgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL0tjb25maWcKaW5kZXggYTc1OWQ1NC4uMTM3NWUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9LY29uZmlnCkBAIC01MiwxOCArNTIsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgYm1hYy4KIAotY29uZmlnIE1BQzg5eDAKLQl0cmlzdGF0ZSAiTWFjaW50b3NoIENTODl4MCBiYXNlZCBldGhlcm5ldCBjYXJkcyIKLQlkZXBlbmRzIG9uIE1BQwotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnQgZm9yIENTODl4MCBjaGlwc2V0IGJhc2VkIEV0aGVybmV0IGNhcmRzLiAgSWYgeW91IGhhdmUgYQotCSAgTnVidXMgb3IgTEMtUERTIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kCi0JICByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KLQkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoaXMgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCBtYWM4OXgwLgotCiBjb25maWcgTUFDTUFDRQogCWJvb2wgIk1hY2ludG9zaCAoQVYpIG9uYm9hcmQgTUFDRSBldGhlcm5ldCIKIAlkZXBlbmRzIG9uIE1BQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9NYWtlZmlsZQppbmRleCAwZDNhNTkxLi44NmVhYTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9NYWtlZmlsZQpAQCAtNCw1ICs0LDQgQEAKIAogb2JqLSQoQ09ORklHX01BQ0UpICs9IG1hY2Uubwogb2JqLSQoQ09ORklHX0JNQUMpICs9IGJtYWMubwotb2JqLSQoQ09ORklHX01BQzg5eDApICs9IG1hYzg5eDAubwogb2JqLSQoQ09ORklHX01BQ01BQ0UpICs9IG1hY21hY2UubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYwppbmRleCAxNjFjYmJiLi5iZjQwNzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYwpAQCAtODksMTAgKzg5LDEwIEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkidGczIgogI2RlZmluZSBURzNfTUFKX05VTQkJCTMKLSNkZWZpbmUgVEczX01JTl9OVU0JCQkxMjAKKyNkZWZpbmUgVEczX01JTl9OVU0JCQkxMjEKICNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCVwKIAlfX3N0cmluZ2lmeShURzNfTUFKX05VTSkgIi4iIF9fc3RyaW5naWZ5KFRHM19NSU5fTlVNKQotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkF1Z3VzdCAxOCwgMjAxMSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJOb3ZlbWJlciAyLCAyMDExIgogCiAjZGVmaW5lIFJFU0VUX0tJTkRfU0hVVERPV04JMAogI2RlZmluZSBSRVNFVF9LSU5EX0lOSVQJCTEKQEAgLTYyOCwxOSArNjI4LDIzIEBACiAJCXJlZ2Jhc2UgPSBURzNfQVBFX1BFUl9MT0NLX0dSQU5UOwogCiAJLyogTWFrZSBzdXJlIHRoZSBkcml2ZXIgaGFzbid0IGFueSBzdGFsZSBsb2Nrcy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmIChpID09IFRHM19BUEVfTE9DS19HUElPKQotCQkJY29udGludWU7Ci0JCXRnM19hcGVfd3JpdGUzMih0cCwgcmVnYmFzZSArIDQgKiBpLCBBUEVfTE9DS19HUkFOVF9EUklWRVIpOworCWZvciAoaSA9IFRHM19BUEVfTE9DS19QSFkwOyBpIDw9IFRHM19BUEVfTE9DS19HUElPOyBpKyspIHsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgVEczX0FQRV9MT0NLX1BIWTA6CisJCWNhc2UgVEczX0FQRV9MT0NLX1BIWTE6CisJCWNhc2UgVEczX0FQRV9MT0NLX1BIWTI6CisJCWNhc2UgVEczX0FQRV9MT0NLX1BIWTM6CisJCQliaXQgPSBBUEVfTE9DS19HUkFOVF9EUklWRVI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICghdHAtPnBjaV9mbikKKwkJCQliaXQgPSBBUEVfTE9DS19HUkFOVF9EUklWRVI7CisJCQllbHNlCisJCQkJYml0ID0gMSA8PCB0cC0+cGNpX2ZuOworCQl9CisJCXRnM19hcGVfd3JpdGUzMih0cCwgcmVnYmFzZSArIDQgKiBpLCBiaXQpOwogCX0KIAotCS8qIENsZWFyIHRoZSBjb3JyZWN0IGJpdCBvZiB0aGUgR1BJTyBsb2NrIHRvby4gKi8KLQlpZiAoIXRwLT5wY2lfZm4pCi0JCWJpdCA9IEFQRV9MT0NLX0dSQU5UX0RSSVZFUjsKLQllbHNlCi0JCWJpdCA9IDEgPDwgdHAtPnBjaV9mbjsKLQotCXRnM19hcGVfd3JpdGUzMih0cCwgcmVnYmFzZSArIDQgKiBURzNfQVBFX0xPQ0tfR1BJTywgYml0KTsKIH0KIAogc3RhdGljIGludCB0ZzNfYXBlX2xvY2soc3RydWN0IHRnMyAqdHAsIGludCBsb2NrbnVtKQpAQCAtNjU4LDYgKzY2MiwxMCBAQAogCQkJcmV0dXJuIDA7CiAJY2FzZSBURzNfQVBFX0xPQ0tfR1JDOgogCWNhc2UgVEczX0FQRV9MT0NLX01FTToKKwkJaWYgKCF0cC0+cGNpX2ZuKQorCQkJYml0ID0gQVBFX0xPQ0tfUkVRX0RSSVZFUjsKKwkJZWxzZQorCQkJYml0ID0gMSA8PCB0cC0+cGNpX2ZuOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY3MywxMSArNjgxLDYgQEAKIAogCW9mZiA9IDQgKiBsb2NrbnVtOwogCi0JaWYgKGxvY2tudW0gIT0gVEczX0FQRV9MT0NLX0dQSU8gfHwgIXRwLT5wY2lfZm4pCi0JCWJpdCA9IEFQRV9MT0NLX1JFUV9EUklWRVI7Ci0JZWxzZQotCQliaXQgPSAxIDw8IHRwLT5wY2lfZm47Ci0KIAl0ZzNfYXBlX3dyaXRlMzIodHAsIHJlcSArIG9mZiwgYml0KTsKIAogCS8qIFdhaXQgZm9yIHVwIHRvIDEgbWlsbGlzZWNvbmQgdG8gYWNxdWlyZSBsb2NrLiAqLwpAQCAtNzEwLDYgKzcxMywxMCBAQAogCQkJcmV0dXJuOwogCWNhc2UgVEczX0FQRV9MT0NLX0dSQzoKIAljYXNlIFRHM19BUEVfTE9DS19NRU06CisJCWlmICghdHAtPnBjaV9mbikKKwkJCWJpdCA9IEFQRV9MT0NLX0dSQU5UX0RSSVZFUjsKKwkJZWxzZQorCQkJYml0ID0gMSA8PCB0cC0+cGNpX2ZuOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm47CkBAIC03MjAsMTEgKzcyNyw2IEBACiAJZWxzZQogCQlnbnQgPSBURzNfQVBFX1BFUl9MT0NLX0dSQU5UOwogCi0JaWYgKGxvY2tudW0gIT0gVEczX0FQRV9MT0NLX0dQSU8gfHwgIXRwLT5wY2lfZm4pCi0JCWJpdCA9IEFQRV9MT0NLX0dSQU5UX0RSSVZFUjsKLQllbHNlCi0JCWJpdCA9IDEgPDwgdHAtPnBjaV9mbjsKLQogCXRnM19hcGVfd3JpdGUzMih0cCwgZ250ICsgNCAqIGxvY2tudW0sIGJpdCk7CiB9CiAKQEAgLTU5MjcsNiArNTkyOSwxOCBAQAogCXJldHVybiB3b3JrX2RvbmU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZzNfcmVzZXRfdGFza19zY2hlZHVsZShzdHJ1Y3QgdGczICp0cCkKK3sKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoVEczX0ZMQUdfUkVTRVRfVEFTS19QRU5ESU5HLCB0cC0+dGczX2ZsYWdzKSkKKwkJc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGczX3Jlc2V0X3Rhc2tfY2FuY2VsKHN0cnVjdCB0ZzMgKnRwKQoreworCWNhbmNlbF93b3JrX3N5bmMoJnRwLT5yZXNldF90YXNrKTsKKwl0ZzNfZmxhZ19jbGVhcih0cCwgUkVTRVRfVEFTS19QRU5ESU5HKTsKK30KKwogc3RhdGljIGludCB0ZzNfcG9sbF9tc2l4KHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKIAlzdHJ1Y3QgdGczX25hcGkgKnRuYXBpID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCB0ZzNfbmFwaSwgbmFwaSk7CkBAIC01OTY3LDcgKzU5ODEsNyBAQAogdHhfcmVjb3Zlcnk6CiAJLyogd29ya19kb25lIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGVzcyB0aGFuIGJ1ZGdldC4gKi8KIAluYXBpX2NvbXBsZXRlKG5hcGkpOwotCXNjaGVkdWxlX3dvcmsoJnRwLT5yZXNldF90YXNrKTsKKwl0ZzNfcmVzZXRfdGFza19zY2hlZHVsZSh0cCk7CiAJcmV0dXJuIHdvcmtfZG9uZTsKIH0KIApAQCAtNjAwMiw3ICs2MDE2LDcgQEAKIAl0ZzNfZHVtcF9zdGF0ZSh0cCk7CiAKIAl0ZzNfZmxhZ19zZXQodHAsIEVSUk9SX1BST0NFU1NFRCk7Ci0Jc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOworCXRnM19yZXNldF90YXNrX3NjaGVkdWxlKHRwKTsKIH0KIAogc3RhdGljIGludCB0ZzNfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCkBAIC02MDQ5LDcgKzYwNjMsNyBAQAogdHhfcmVjb3Zlcnk6CiAJLyogd29ya19kb25lIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGVzcyB0aGFuIGJ1ZGdldC4gKi8KIAluYXBpX2NvbXBsZXRlKG5hcGkpOwotCXNjaGVkdWxlX3dvcmsoJnRwLT5yZXNldF90YXNrKTsKKwl0ZzNfcmVzZXRfdGFza19zY2hlZHVsZSh0cCk7CiAJcmV0dXJuIHdvcmtfZG9uZTsKIH0KIApAQCAtNjMzOCwxMSArNjM1MiwxMSBAQAogewogCXN0cnVjdCB0ZzMgKnRwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0ZzMsIHJlc2V0X3Rhc2spOwogCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IHJlc3RhcnRfdGltZXI7CiAKIAl0ZzNfZnVsbF9sb2NrKHRwLCAwKTsKIAogCWlmICghbmV0aWZfcnVubmluZyh0cC0+ZGV2KSkgeworCQl0ZzNfZmxhZ19jbGVhcih0cCwgUkVTRVRfVEFTS19QRU5ESU5HKTsKIAkJdGczX2Z1bGxfdW5sb2NrKHRwKTsKIAkJcmV0dXJuOwogCX0KQEAgLTYzNTUsOSArNjM2OSw2IEBACiAKIAl0ZzNfZnVsbF9sb2NrKHRwLCAxKTsKIAotCXJlc3RhcnRfdGltZXIgPSB0ZzNfZmxhZyh0cCwgUkVTVEFSVF9USU1FUik7Ci0JdGczX2ZsYWdfY2xlYXIodHAsIFJFU1RBUlRfVElNRVIpOwotCiAJaWYgKHRnM19mbGFnKHRwLCBUWF9SRUNPVkVSWV9QRU5ESU5HKSkgewogCQl0cC0+d3JpdGUzMl90eF9tYm94ID0gdGczX3dyaXRlMzJfdHhfbWJveDsKIAkJdHAtPndyaXRlMzJfcnhfbWJveCA9IHRnM193cml0ZV9mbHVzaF9yZWczMjsKQEAgLTYzNzIsMTQgKzYzODMsMTMgQEAKIAogCXRnM19uZXRpZl9zdGFydCh0cCk7CiAKLQlpZiAocmVzdGFydF90aW1lcikKLQkJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIGppZmZpZXMgKyAxKTsKLQogb3V0OgogCXRnM19mdWxsX3VubG9jayh0cCk7CiAKIAlpZiAoIWVycikKIAkJdGczX3BoeV9zdGFydCh0cCk7CisKKwl0ZzNfZmxhZ19jbGVhcih0cCwgUkVTRVRfVEFTS19QRU5ESU5HKTsKIH0KIAogc3RhdGljIHZvaWQgdGczX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTYzOTEsNyArNjQwMSw3IEBACiAJCXRnM19kdW1wX3N0YXRlKHRwKTsKIAl9CiAKLQlzY2hlZHVsZV93b3JrKCZ0cC0+cmVzZXRfdGFzayk7CisJdGczX3Jlc2V0X3Rhc2tfc2NoZWR1bGUodHApOwogfQogCiAvKiBUZXN0IGZvciBETUEgYnVmZmVycyBjcm9zc2luZyBhbnkgNEdCIGJvdW5kYXJpZXM6IDRHLCA4RywgZXRjICovCkBAIC02NDQyLDMxICs2NDUyLDI2IEBACiAJCWh3YnVnID0gMTsKIAogCWlmICh0ZzNfZmxhZyh0cCwgNEtfRklGT19MSU1JVCkpIHsKKwkJdTMyIHBydmlkeCA9ICplbnRyeTsKIAkJdTMyIHRtcF9mbGFnID0gZmxhZ3MgJiB+VFhEX0ZMQUdfRU5EOwotCQl3aGlsZSAobGVuID4gVEczX1RYX0JEX0RNQV9NQVgpIHsKKwkJd2hpbGUgKGxlbiA+IFRHM19UWF9CRF9ETUFfTUFYICYmICpidWRnZXQpIHsKIAkJCXUzMiBmcmFnX2xlbiA9IFRHM19UWF9CRF9ETUFfTUFYOwogCQkJbGVuIC09IFRHM19UWF9CRF9ETUFfTUFYOwogCi0JCQlpZiAobGVuKSB7Ci0JCQkJdG5hcGktPnR4X2J1ZmZlcnNbKmVudHJ5XS5mcmFnbWVudGVkID0gdHJ1ZTsKLQkJCQkvKiBBdm9pZCB0aGUgOGJ5dGUgRE1BIHByb2JsZW0gKi8KLQkJCQlpZiAobGVuIDw9IDgpIHsKLQkJCQkJbGVuICs9IFRHM19UWF9CRF9ETUFfTUFYIC8gMjsKLQkJCQkJZnJhZ19sZW4gPSBURzNfVFhfQkRfRE1BX01BWCAvIDI7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJdG1wX2ZsYWcgPSBmbGFnczsKLQotCQkJaWYgKCpidWRnZXQpIHsKLQkJCQl0ZzNfdHhfc2V0X2JkKCZ0bmFwaS0+dHhfcmluZ1sqZW50cnldLCBtYXAsCi0JCQkJCSAgICAgIGZyYWdfbGVuLCB0bXBfZmxhZywgbXNzLCB2bGFuKTsKLQkJCQkoKmJ1ZGdldCktLTsKLQkJCQkqZW50cnkgPSBORVhUX1RYKCplbnRyeSk7Ci0JCQl9IGVsc2UgewotCQkJCWh3YnVnID0gMTsKLQkJCQlicmVhazsKKwkJCS8qIEF2b2lkIHRoZSA4Ynl0ZSBETUEgcHJvYmxlbSAqLworCQkJaWYgKGxlbiA8PSA4KSB7CisJCQkJbGVuICs9IFRHM19UWF9CRF9ETUFfTUFYIC8gMjsKKwkJCQlmcmFnX2xlbiA9IFRHM19UWF9CRF9ETUFfTUFYIC8gMjsKIAkJCX0KIAorCQkJdG5hcGktPnR4X2J1ZmZlcnNbKmVudHJ5XS5mcmFnbWVudGVkID0gdHJ1ZTsKKworCQkJdGczX3R4X3NldF9iZCgmdG5hcGktPnR4X3JpbmdbKmVudHJ5XSwgbWFwLAorCQkJCSAgICAgIGZyYWdfbGVuLCB0bXBfZmxhZywgbXNzLCB2bGFuKTsKKwkJCSpidWRnZXQgLT0gMTsKKwkJCXBydmlkeCA9ICplbnRyeTsKKwkJCSplbnRyeSA9IE5FWFRfVFgoKmVudHJ5KTsKKwogCQkJbWFwICs9IGZyYWdfbGVuOwogCQl9CiAKQEAgLTY0NzQsMTAgKzY0NzksMTEgQEAKIAkJCWlmICgqYnVkZ2V0KSB7CiAJCQkJdGczX3R4X3NldF9iZCgmdG5hcGktPnR4X3JpbmdbKmVudHJ5XSwgbWFwLAogCQkJCQkgICAgICBsZW4sIGZsYWdzLCBtc3MsIHZsYW4pOwotCQkJCSgqYnVkZ2V0KS0tOworCQkJCSpidWRnZXQgLT0gMTsKIAkJCQkqZW50cnkgPSBORVhUX1RYKCplbnRyeSk7CiAJCQl9IGVsc2UgewogCQkJCWh3YnVnID0gMTsKKwkJCQl0bmFwaS0+dHhfYnVmZmVyc1twcnZpZHhdLmZyYWdtZW50ZWQgPSBmYWxzZTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CkBAIC02NTA5LDcgKzY1MTUsNyBAQAogCQl0eGIgPSAmdG5hcGktPnR4X2J1ZmZlcnNbZW50cnldOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBsYXN0OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgewogCQljb25zdCBza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CiAKIAkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKQEAgLTY1NTksNiArNjU2NSw4IEBACiAJCQlkZXZfa2ZyZWVfc2tiKG5ld19za2IpOwogCQkJcmV0ID0gLTE7CiAJCX0gZWxzZSB7CisJCQl1MzIgc2F2ZV9lbnRyeSA9ICplbnRyeTsKKwogCQkJYmFzZV9mbGFncyB8PSBUWERfRkxBR19FTkQ7CiAKIAkJCXRuYXBpLT50eF9idWZmZXJzWyplbnRyeV0uc2tiID0gbmV3X3NrYjsKQEAgLTY1NjgsNyArNjU3Niw3IEBACiAJCQlpZiAodGczX3R4X2ZyYWdfc2V0KHRuYXBpLCBlbnRyeSwgYnVkZ2V0LCBuZXdfYWRkciwKIAkJCQkJICAgIG5ld19za2ItPmxlbiwgYmFzZV9mbGFncywKIAkJCQkJICAgIG1zcywgdmxhbikpIHsKLQkJCQl0ZzNfdHhfc2tiX3VubWFwKHRuYXBpLCAqZW50cnksIDApOworCQkJCXRnM190eF9za2JfdW5tYXAodG5hcGksIHNhdmVfZW50cnksIC0xKTsKIAkJCQlkZXZfa2ZyZWVfc2tiKG5ld19za2IpOwogCQkJCXJldCA9IC0xOwogCQkJfQpAQCAtNjc1OCwxMSArNjc2NiwxMCBAQAogCiAJaWYgKHRnM190eF9mcmFnX3NldCh0bmFwaSwgJmVudHJ5LCAmYnVkZ2V0LCBtYXBwaW5nLCBsZW4sIGJhc2VfZmxhZ3MgfAogCQkJICAoKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPT0gMCkgPyBUWERfRkxBR19FTkQgOiAwKSwKLQkJCSAgICBtc3MsIHZsYW4pKQorCQkJICAgIG1zcywgdmxhbikpIHsKIAkJd291bGRfaGl0X2h3YnVnID0gMTsKLQogCS8qIE5vdyBsb29wIHRocm91Z2ggYWRkaXRpb25hbCBkYXRhIGZyYWdtZW50cywgYW5kIHF1ZXVlIHRoZW0uICovCi0JaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiAwKSB7CisJfSBlbHNlIGlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID4gMCkgewogCQl1MzIgdG1wX21zcyA9IG1zczsKIAogCQlpZiAoIXRnM19mbGFnKHRwLCBIV19UU09fMSkgJiYKQEAgLTY3ODQsMTEgKzY3OTEsMTQgQEAKIAkJCWlmIChkbWFfbWFwcGluZ19lcnJvcigmdHAtPnBkZXYtPmRldiwgbWFwcGluZykpCiAJCQkJZ290byBkbWFfZXJyb3I7CiAKLQkJCWlmICh0ZzNfdHhfZnJhZ19zZXQodG5hcGksICZlbnRyeSwgJmJ1ZGdldCwgbWFwcGluZywKKwkJCWlmICghYnVkZ2V0IHx8CisJCQkgICAgdGczX3R4X2ZyYWdfc2V0KHRuYXBpLCAmZW50cnksICZidWRnZXQsIG1hcHBpbmcsCiAJCQkJCSAgICBsZW4sIGJhc2VfZmxhZ3MgfAogCQkJCQkgICAgKChpID09IGxhc3QpID8gVFhEX0ZMQUdfRU5EIDogMCksCi0JCQkJCSAgICB0bXBfbXNzLCB2bGFuKSkKKwkJCQkJICAgIHRtcF9tc3MsIHZsYW4pKSB7CiAJCQkJd291bGRfaGl0X2h3YnVnID0gMTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQogCX0KIApAQCAtNjgyOCw3ICs2ODM4LDcgQEAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCiBkbWFfZXJyb3I6Ci0JdGczX3R4X3NrYl91bm1hcCh0bmFwaSwgdG5hcGktPnR4X3Byb2QsIGkpOworCXRnM190eF9za2JfdW5tYXAodG5hcGksIHRuYXBpLT50eF9wcm9kLCAtLWkpOwogCXRuYXBpLT50eF9idWZmZXJzW3RuYXBpLT50eF9wcm9kXS5za2IgPSBOVUxMOwogZHJvcDoKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC03MjgxLDcgKzcyOTEsOCBAQAogCQkJaWYgKCFza2IpCiAJCQkJY29udGludWU7CiAKLQkJCXRnM190eF9za2JfdW5tYXAodG5hcGksIGksIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpOworCQkJdGczX3R4X3NrYl91bm1hcCh0bmFwaSwgaSwKKwkJCQkJIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgLSAxKTsKIAogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJfQpAQCAtOTIwMCw3ICs5MjExLDcgQEAKIHsKIAlzdHJ1Y3QgdGczICp0cCA9IChzdHJ1Y3QgdGczICopIF9fb3BhcXVlOwogCi0JaWYgKHRwLT5pcnFfc3luYykKKwlpZiAodHAtPmlycV9zeW5jIHx8IHRnM19mbGFnKHRwLCBSRVNFVF9UQVNLX1BFTkRJTkcpKQogCQlnb3RvIHJlc3RhcnRfdGltZXI7CiAKIAlzcGluX2xvY2soJnRwLT5sb2NrKTsKQEAgLTkyMjMsMTAgKzkyMzQsOSBAQAogCQl9CiAKIAkJaWYgKCEodHIzMihXRE1BQ19NT0RFKSAmIFdETUFDX01PREVfRU5BQkxFKSkgewotCQkJdGczX2ZsYWdfc2V0KHRwLCBSRVNUQVJUX1RJTUVSKTsKIAkJCXNwaW5fdW5sb2NrKCZ0cC0+bG9jayk7Ci0JCQlzY2hlZHVsZV93b3JrKCZ0cC0+cmVzZXRfdGFzayk7Ci0JCQlyZXR1cm47CisJCQl0ZzNfcmVzZXRfdGFza19zY2hlZHVsZSh0cCk7CisJCQlnb3RvIHJlc3RhcnRfdGltZXI7CiAJCX0KIAl9CiAKQEAgLTk2NzQsMTUgKzk2ODQsMTQgQEAKIAkJc3RydWN0IHRnM19uYXBpICp0bmFwaSA9ICZ0cC0+bmFwaVtpXTsKIAkJZXJyID0gdGczX3JlcXVlc3RfaXJxKHRwLCBpKTsKIAkJaWYgKGVycikgewotCQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKQorCQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7CisJCQkJdG5hcGkgPSAmdHAtPm5hcGlbaV07CiAJCQkJZnJlZV9pcnEodG5hcGktPmlycV92ZWMsIHRuYXBpKTsKLQkJCWJyZWFrOworCQkJfQorCQkJZ290byBlcnJfb3V0MjsKIAkJfQogCX0KIAotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dDI7Ci0KIAl0ZzNfZnVsbF9sb2NrKHRwLCAwKTsKIAogCWVyciA9IHRnM19pbml0X2h3KHRwLCAxKTsKQEAgLTk3ODMsNyArOTc5Miw3IEBACiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJdGczX25hcGlfZGlzYWJsZSh0cCk7Ci0JY2FuY2VsX3dvcmtfc3luYygmdHAtPnJlc2V0X3Rhc2spOworCXRnM19yZXNldF90YXNrX2NhbmNlbCh0cCk7CiAKIAluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoZGV2KTsKIApAQCAtMTE1MjAsNyArMTE1MjksNyBAQAogCQkJYnJlYWs7CiAJfQogCi0JdGczX3R4X3NrYl91bm1hcCh0bmFwaSwgdG5hcGktPnR4X3Byb2QgLSAxLCAwKTsKKwl0ZzNfdHhfc2tiX3VubWFwKHRuYXBpLCB0bmFwaS0+dHhfcHJvZCAtIDEsIC0xKTsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlpZiAodHhfaWR4ICE9IHRuYXBpLT50eF9wcm9kKQpAQCAtMTQyMjgsMTIgKzE0MjM3LDMwIEBACiAJdmFsID0gdHIzMihNRU1BUkJfTU9ERSk7CiAJdHczMihNRU1BUkJfTU9ERSwgdmFsIHwgTUVNQVJCX01PREVfRU5BQkxFKTsKIAotCWlmICh0ZzNfZmxhZyh0cCwgUENJWF9NT0RFKSkgewotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsCi0JCQkJICAgICAgdHAtPnBjaXhfY2FwICsgUENJX1hfU1RBVFVTLCAmdmFsKTsKLQkJdHAtPnBjaV9mbiA9IHZhbCAmIDB4NzsKLQl9IGVsc2UgewotCQl0cC0+cGNpX2ZuID0gUENJX0ZVTkModHAtPnBkZXYtPmRldmZuKSAmIDM7CisJdHAtPnBjaV9mbiA9IFBDSV9GVU5DKHRwLT5wZGV2LT5kZXZmbikgJiAzOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCB8fAorCSAgICB0ZzNfZmxhZyh0cCwgNTc4MF9DTEFTUykpIHsKKwkJaWYgKHRnM19mbGFnKHRwLCBQQ0lYX01PREUpKSB7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsCisJCQkJCSAgICAgIHRwLT5wY2l4X2NhcCArIFBDSV9YX1NUQVRVUywKKwkJCQkJICAgICAgJnZhbCk7CisJCQl0cC0+cGNpX2ZuID0gdmFsICYgMHg3OworCQl9CisJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNykgeworCQl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0NQTVVfU1RBVFVTLCAmdmFsKTsKKwkJaWYgKCh2YWwgJiBOSUNfU1JBTV9DUE1VU1RBVF9TSUdfTVNLKSA9PQorCQkgICAgTklDX1NSQU1fQ1BNVVNUQVRfU0lHKSB7CisJCQl0cC0+cGNpX2ZuID0gdmFsICYgVEczX0NQTVVfU1RBVFVTX0ZNU0tfNTcxNzsKKwkJCXRwLT5wY2lfZm4gPSB0cC0+cGNpX2ZuID8gMSA6IDA7CisJCX0KKwl9IGVsc2UgaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE5IHx8CisJCSAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzIwKSB7CisJCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fQ1BNVV9TVEFUVVMsICZ2YWwpOworCQlpZiAoKHZhbCAmIE5JQ19TUkFNX0NQTVVTVEFUX1NJR19NU0spID09CisJCSAgICBOSUNfU1JBTV9DUE1VU1RBVF9TSUcpIHsKKwkJCXRwLT5wY2lfZm4gPSAodmFsICYgVEczX0NQTVVfU1RBVFVTX0ZNU0tfNTcxOSkgPj4KKwkJCQkgICAgIFRHM19DUE1VX1NUQVRVU19GU0hGVF81NzE5OworCQl9CiAJfQogCiAJLyogR2V0IGVlcHJvbSBodyBjb25maWcgYmVmb3JlIGNhbGxpbmcgdGczX3NldF9wb3dlcl9zdGF0ZSgpLgpAQCAtMTU2NjUsNyArMTU2OTIsNyBAQAogCQlpZiAodHAtPmZ3KQogCQkJcmVsZWFzZV9maXJtd2FyZSh0cC0+ZncpOwogCi0JCWNhbmNlbF93b3JrX3N5bmMoJnRwLT5yZXNldF90YXNrKTsKKwkJdGczX3Jlc2V0X3Rhc2tfY2FuY2VsKHRwKTsKIAogCQlpZiAodGczX2ZsYWcodHAsIFVTRV9QSFlMSUIpKSB7CiAJCQl0ZzNfcGh5X2ZpbmkodHApOwpAQCAtMTU2OTksNyArMTU3MjYsNyBAQAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gMDsKIAotCWZsdXNoX3dvcmtfc3luYygmdHAtPnJlc2V0X3Rhc2spOworCXRnM19yZXNldF90YXNrX2NhbmNlbCh0cCk7CiAJdGczX3BoeV9zdG9wKHRwKTsKIAl0ZzNfbmV0aWZfc3RvcCh0cCk7CiAKQEAgLTE1ODEyLDEyICsxNTgzOSwxMCBAQAogCXRnM19uZXRpZl9zdG9wKHRwKTsKIAogCWRlbF90aW1lcl9zeW5jKCZ0cC0+dGltZXIpOwotCXRnM19mbGFnX2NsZWFyKHRwLCBSRVNUQVJUX1RJTUVSKTsKIAogCS8qIFdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlc2V0IHRhc2sgZG9lc24ndCBydW4gKi8KLQljYW5jZWxfd29ya19zeW5jKCZ0cC0+cmVzZXRfdGFzayk7CisJdGczX3Jlc2V0X3Rhc2tfY2FuY2VsKHRwKTsKIAl0ZzNfZmxhZ19jbGVhcih0cCwgVFhfUkVDT1ZFUllfUEVORElORyk7Ci0JdGczX2ZsYWdfY2xlYXIodHAsIFJFU1RBUlRfVElNRVIpOwogCiAJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5oCmluZGV4IGYzMmYyODguLjk0YjRiZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5oCkBAIC0xMDk1LDYgKzEwOTUsMTEgQEAKICNkZWZpbmUgVEczX0NQTVVfQ0xDS19PUklERQkJMHgwMDAwMzYyNAogI2RlZmluZSAgQ1BNVV9DTENLX09SSURFX01BQ19PUklERV9FTgkgMHg4MDAwMDAwMAogCisjZGVmaW5lIFRHM19DUE1VX1NUQVRVUwkJCTB4MDAwMDM2MmMKKyNkZWZpbmUgIFRHM19DUE1VX1NUQVRVU19GTVNLXzU3MTcJIDB4MjAwMDAwMDAKKyNkZWZpbmUgIFRHM19DUE1VX1NUQVRVU19GTVNLXzU3MTkJIDB4YzAwMDAwMDAKKyNkZWZpbmUgIFRHM19DUE1VX1NUQVRVU19GU0hGVF81NzE5CSAzMAorCiAjZGVmaW5lIFRHM19DUE1VX0NMQ0tfU1RBVAkJMHgwMDAwMzYzMAogI2RlZmluZSAgQ1BNVV9DTENLX1NUQVRfTUFDX0NMQ0tfTUFTSwkgMHgwMDFmMDAwMAogI2RlZmluZSAgQ1BNVV9DTENLX1NUQVRfTUFDX0NMQ0tfNjJfNQkgMHgwMDAwMDAwMApAQCAtMjEyOCw2ICsyMTMzLDEwIEBACiAjZGVmaW5lICBOSUNfU1JBTV9SR01JSV9FWFRfSUJORF9SWF9FTgkgMHgwMDAwMDAwOAogI2RlZmluZSAgTklDX1NSQU1fUkdNSUlfRVhUX0lCTkRfVFhfRU4JIDB4MDAwMDAwMTAKIAorI2RlZmluZSBOSUNfU1JBTV9DUE1VX1NUQVRVUwkJMHgwMDAwMGUwMAorI2RlZmluZSAgTklDX1NSQU1fQ1BNVVNUQVRfU0lHCQkweDAwMDAzNjJjCisjZGVmaW5lICBOSUNfU1JBTV9DUE1VU1RBVF9TSUdfTVNLCTB4MDAwMGZmZmYKKwogI2RlZmluZSBOSUNfU1JBTV9SWF9NSU5JX0JVRkZFUl9ERVNDCTB4MDAwMDEwMDAKIAogI2RlZmluZSBOSUNfU1JBTV9ETUFfREVTQ19QT09MX0JBU0UJMHgwMDAwMjAwMApAQCAtMjM0NCw5ICsyMzUzLDEzIEBACiAjZGVmaW5lICBBUEVfUEVSX0xPQ0tfR1JBTlRfRFJJVkVSCSAweDAwMDAxMDAwCiAKIC8qIEFQRSBjb252ZW5pZW5jZSBlbnVtZXJhdGlvbnMuICovCi0jZGVmaW5lIFRHM19BUEVfTE9DS19HUkMgICAgICAgICAgICAgICAgMQotI2RlZmluZSBURzNfQVBFX0xPQ0tfTUVNICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVEczX0FQRV9MT0NLX0dQSU8gICAgICAgICAgICAgICA3CisjZGVmaW5lIFRHM19BUEVfTE9DS19QSFkwCQkwCisjZGVmaW5lIFRHM19BUEVfTE9DS19HUkMJCTEKKyNkZWZpbmUgVEczX0FQRV9MT0NLX1BIWTEJCTIKKyNkZWZpbmUgVEczX0FQRV9MT0NLX1BIWTIJCTMKKyNkZWZpbmUgVEczX0FQRV9MT0NLX01FTQkJNAorI2RlZmluZSBURzNfQVBFX0xPQ0tfUEhZMwkJNQorI2RlZmluZSBURzNfQVBFX0xPQ0tfR1BJTwkJNwogCiAjZGVmaW5lIFRHM19FRVBST01fU0JfRjFSMl9NQkFfT0ZGCTB4MTAKIApAQCAtMjg2Niw3ICsyODc5LDYgQEAKIAlURzNfRkxBR19KVU1CT19DQVBBQkxFLAogCVRHM19GTEFHX0NISVBfUkVTRVRUSU5HLAogCVRHM19GTEFHX0lOSVRfQ09NUExFVEUsCi0JVEczX0ZMQUdfUkVTVEFSVF9USU1FUiwKIAlURzNfRkxBR19UU09fQlVHLAogCVRHM19GTEFHX0lTXzU3ODgsCiAJVEczX0ZMQUdfTUFYX1JYUEVORF82NCwKQEAgLTI5MDksNiArMjkyMSw3IEBACiAJVEczX0ZMQUdfQVBFX0hBU19OQ1NJLAogCVRHM19GTEFHXzU3MTdfUExVUywKIAlURzNfRkxBR180S19GSUZPX0xJTUlULAorCVRHM19GTEFHX1JFU0VUX1RBU0tfUEVORElORywKIAogCS8qIEFkZCBuZXcgZmxhZ3MgYmVmb3JlIHRoaXMgY29tbWVudCBhbmQgVEczX0ZMQUdfTlVNQkVSX09GX0ZMQUdTICovCiAJVEczX0ZMQUdfTlVNQkVSX09GX0ZMQUdTLAkvKiBMYXN0IGVudHJ5IGluIGVudW0gVEczX0ZMQUdTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmMKaW5kZXggNWQ3ODcyZS4uN2YzMDkxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiYm5hZC5oIgogI2luY2x1ZGUgImJuYS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9hdDkxX2V0aGVyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL2F0OTFfZXRoZXIuYwppbmRleCAxYjBiYThjLi41NjYyNGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL2F0OTFfZXRoZXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL2F0OTFfZXRoZXIuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDBfZW1hYy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogCiAjaW5jbHVkZSAiYXQ5MV9ldGhlci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19vZmZsb2FkLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX29mZmxvYWQuYwppbmRleCBkYTVhNWQ5Li45MGZmMTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX29mZmxvYWQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX29mZmxvYWQuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJyZWdzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2wydC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9sMnQuYwppbmRleCA0MTU0MDk3Li43MGZlYzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2wydC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvbDJ0LmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogI2luY2x1ZGUgInQzY2Rldi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9sMnQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvbDJ0LmMKaW5kZXggYTJkMzIzYy4uNmFjNzdhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9sMnQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2wydC5jCkBAIC0zNyw2ICszNyw5IEBACiAjaW5jbHVkZSA8bGludXgvaWYuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CiAjaW5jbHVkZSAiY3hnYjQuaCIKICNpbmNsdWRlICJsMnQuaCIKQEAgLTUwMywxMCArNTA2LDYgQEAKIAlyZXR1cm4gZDsKIH0KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCiBzdGF0aWMgaW5saW5lIHZvaWQgKmwydF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQogewogCXN0cnVjdCBsMnRfZW50cnkgKmwydGFiID0gc2VxLT5wcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMKaW5kZXggZGRjMTY5OC4uMTQwMjU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlICJjeGdiNC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lycnVzL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXJydXMvS2NvbmZpZwppbmRleCA2Y2JiODFjLi4xZjg2NDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXJydXMvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXJydXMvS2NvbmZpZwpAQCAtNiw3ICs2LDcgQEAKIAlib29sICJDaXJydXMgZGV2aWNlcyIKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIElTQSB8fCBFSVNBIHx8IE1BQ0hfSVhEUDIzNTEgfHwgQVJDSF9JWERQMlgwMSBcCi0JCXx8IE1BQ0hfTVgzMUFEUyB8fCBNQUNIX1FRMjQ0MCB8fCAoQVJNICYmIEFSQ0hfRVA5M1hYKQorCQl8fCBNQUNIX01YMzFBRFMgfHwgTUFDSF9RUTI0NDAgfHwgKEFSTSAmJiBBUkNIX0VQOTNYWCkgfHwgTUFDCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcywgc2F5IFkKIAkgIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KQEAgLTQ3LDQgKzQ3LDE2IEBACiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgZXRoZXJuZXQgaGFyZHdhcmUgaW5jbHVkZWQgaW4gRVA5M3h4IENQVXMuCiAJICBTYXkgWSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBFUDkzeHggYmFzZWQgZGV2aWNlcy4KIAorY29uZmlnIE1BQzg5eDAKKwl0cmlzdGF0ZSAiTWFjaW50b3NoIENTODl4MCBiYXNlZCBldGhlcm5ldCBjYXJkcyIKKwlkZXBlbmRzIG9uIE1BQworCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIENTODl4MCBjaGlwc2V0IGJhc2VkIEV0aGVybmV0IGNhcmRzLiAgSWYgeW91IGhhdmUgYQorCSAgTnVidXMgb3IgTEMtUERTIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kCisJICByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoaXMgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtYWM4OXgwLgorCiBlbmRpZiAjIE5FVF9WRU5ET1JfQ0lSUlVTCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXJydXMvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXJydXMvTWFrZWZpbGUKaW5kZXggMTRiZDc3ZS4uY2EyNDVlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lycnVzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NpcnJ1cy9NYWtlZmlsZQpAQCAtNCwzICs0LDQgQEAKIAogb2JqLSQoQ09ORklHX0NTODl4MCkgKz0gY3M4OXgwLm8KIG9iai0kKENPTkZJR19FUDkzWFhfRVRIKSArPSBlcDkzeHhfZXRoLm8KK29iai0kKENPTkZJR19NQUM4OXgwKSArPSBtYWM4OXgwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL21hYzg5eDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NpcnJ1cy9tYWM4OXgwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL21hYzg5eDAuYwpyZW5hbWUgdG8gZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lycnVzL21hYzg5eDAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMKaW5kZXggODI0YjhlNi4uMmM3YjM2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jCkBAIC0zMTgsOCArMzE4LDcgQEAKIAogCQlpZiAobXNlY3MgPiA0MDAwKSB7CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJtYm94IHBvbGwgdGltZWQgb3V0XG4iKTsKLQkJCWlmICghbGFuY2VyX2NoaXAoYWRhcHRlcikpCi0JCQkJYmVfZGV0ZWN0X2R1bXBfdWUoYWRhcHRlcik7CisJCQliZV9kZXRlY3RfZHVtcF91ZShhZGFwdGVyKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCkBAIC0xNTQwLDcgKzE1MzksMTQgQEAKIAogCQlyZXEtPmlmX2ZsYWdzX21hc2sgPSByZXEtPmlmX2ZsYWdzID0KIAkJCQljcHVfdG9fbGUzMihCRV9JRl9GTEFHU19NVUxUSUNBU1QpOwotCQlyZXEtPm1jYXN0X251bSA9IGNwdV90b19sZTE2KG5ldGRldl9tY19jb3VudChhZGFwdGVyLT5uZXRkZXYpKTsKKworCQkvKiBSZXNldCBtY2FzdCBwcm9taXNjIG1vZGUgaWYgYWxyZWFkeSBzZXQgYnkgc2V0dGluZyBtYXNrCisJCSAqIGFuZCBub3Qgc2V0dGluZyBmbGFncyBmaWVsZAorCQkgKi8KKwkJcmVxLT5pZl9mbGFnc19tYXNrIHw9CisJCQkJY3B1X3RvX2xlMzIoQkVfSUZfRkxBR1NfTUNBU1RfUFJPTUlTQ1VPVVMpOworCisJCXJlcS0+bWNhc3RfbnVtID0gY3B1X3RvX2xlMzIobmV0ZGV2X21jX2NvdW50KGFkYXB0ZXItPm5ldGRldikpOwogCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgYWRhcHRlci0+bmV0ZGV2KQogCQkJbWVtY3B5KHJlcS0+bWNhc3RfbWFjW2krK10uYnl0ZSwgaGEtPmFkZHIsIEVUSF9BTEVOKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ody5oCmluZGV4IGZiYzhhOTEuLmYyYzg5ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ody5oCkBAIC00OCw2ICs0OCw4IEBACiAvKiBMYW5jZXIgU0xJUE9SVF9DT05UUk9MIFNMSVBPUlRfU1RBVFVTIHJlZ2lzdGVycyAqLwogI2RlZmluZSBTTElQT1JUX1NUQVRVU19PRkZTRVQJCTB4NDA0CiAjZGVmaW5lIFNMSVBPUlRfQ09OVFJPTF9PRkZTRVQJCTB4NDA4CisjZGVmaW5lIFNMSVBPUlRfRVJST1IxX09GRlNFVAkJMHg0MEMKKyNkZWZpbmUgU0xJUE9SVF9FUlJPUjJfT0ZGU0VUCQkweDQxMAogCiAjZGVmaW5lIFNMSVBPUlRfU1RBVFVTX0VSUl9NQVNLCQkweDgwMDAwMDAwCiAjZGVmaW5lIFNMSVBPUlRfU1RBVFVTX1JOX01BU0sJCTB4MDEwMDAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jCmluZGV4IDIxODA0OTcuLmJmMjY2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImJlLmgiCiAjaW5jbHVkZSAiYmVfY21kcy5oIgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgpAQCAtMTkwNSw2ICsxOTA2LDggQEAKIAkJYmVfcnhfc3RhdHNfdXBkYXRlKHJ4bywgcnhjcCk7CiAJfQogCisJYmVfY3Ffbm90aWZ5KGFkYXB0ZXIsIHJ4X2NxLT5pZCwgZmFsc2UsIHdvcmtfZG9uZSk7CisKIAkvKiBSZWZpbGwgdGhlIHF1ZXVlICovCiAJaWYgKHdvcmtfZG9uZSAmJiBhdG9taWNfcmVhZCgmcnhvLT5xLnVzZWQpIDwgUlhfRlJBR1NfUkVGSUxMX1dNKQogCQliZV9wb3N0X3J4X2ZyYWdzKHJ4bywgR0ZQX0FUT01JQyk7CkBAIC0xOTEyLDEwICsxOTE1LDggQEAKIAkvKiBBbGwgY29uc3VtZWQgKi8KIAlpZiAod29ya19kb25lIDwgYnVkZ2V0KSB7CiAJCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JCWJlX2NxX25vdGlmeShhZGFwdGVyLCByeF9jcS0+aWQsIHRydWUsIHdvcmtfZG9uZSk7Ci0JfSBlbHNlIHsKLQkJLyogTW9yZSB0byBiZSBjb25zdW1lZDsgY29udGludWUgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICovCi0JCWJlX2NxX25vdGlmeShhZGFwdGVyLCByeF9jcS0+aWQsIGZhbHNlLCB3b3JrX2RvbmUpOworCQkvKiBBcm0gQ1EgKi8KKwkJYmVfY3Ffbm90aWZ5KGFkYXB0ZXIsIHJ4X2NxLT5pZCwgdHJ1ZSwgMCk7CiAJfQogCXJldHVybiB3b3JrX2RvbmU7CiB9CkBAIC0xOTc3LDQyICsxOTc4LDYyIEBACiAKIHZvaWQgYmVfZGV0ZWN0X2R1bXBfdWUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JdTMyIHVlX3N0YXR1c19sbywgdWVfc3RhdHVzX2hpLCB1ZV9zdGF0dXNfbG9fbWFzaywgdWVfc3RhdHVzX2hpX21hc2s7CisJdTMyIHVlX2xvID0gMCwgdWVfaGkgPSAwLCB1ZV9sb19tYXNrID0gMCwgdWVfaGlfbWFzayA9IDA7CisJdTMyIHNsaXBvcnRfc3RhdHVzID0gMCwgc2xpcG9ydF9lcnIxID0gMCwgc2xpcG9ydF9lcnIyID0gMDsKIAl1MzIgaTsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAotCQkJCVBDSUNGR19VRV9TVEFUVVNfTE9XLCAmdWVfc3RhdHVzX2xvKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKLQkJCQlQQ0lDRkdfVUVfU1RBVFVTX0hJR0gsICZ1ZV9zdGF0dXNfaGkpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAotCQkJCVBDSUNGR19VRV9TVEFUVVNfTE9XX01BU0ssICZ1ZV9zdGF0dXNfbG9fbWFzayk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsCi0JCQkJUENJQ0ZHX1VFX1NUQVRVU19ISV9NQVNLLCAmdWVfc3RhdHVzX2hpX21hc2spOworCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkgeworCQlzbGlwb3J0X3N0YXR1cyA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsgU0xJUE9SVF9TVEFUVVNfT0ZGU0VUKTsKKwkJaWYgKHNsaXBvcnRfc3RhdHVzICYgU0xJUE9SVF9TVEFUVVNfRVJSX01BU0spIHsKKwkJCXNsaXBvcnRfZXJyMSA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsKKwkJCQkJU0xJUE9SVF9FUlJPUjFfT0ZGU0VUKTsKKwkJCXNsaXBvcnRfZXJyMiA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsKKwkJCQkJU0xJUE9SVF9FUlJPUjJfT0ZGU0VUKTsKKwkJfQorCX0gZWxzZSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAorCQkJCVBDSUNGR19VRV9TVEFUVVNfTE9XLCAmdWVfbG8pOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKKwkJCQlQQ0lDRkdfVUVfU1RBVFVTX0hJR0gsICZ1ZV9oaSk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAorCQkJCVBDSUNGR19VRV9TVEFUVVNfTE9XX01BU0ssICZ1ZV9sb19tYXNrKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsCisJCQkJUENJQ0ZHX1VFX1NUQVRVU19ISV9NQVNLLCAmdWVfaGlfbWFzayk7CiAKLQl1ZV9zdGF0dXNfbG8gPSAodWVfc3RhdHVzX2xvICYgKH51ZV9zdGF0dXNfbG9fbWFzaykpOwotCXVlX3N0YXR1c19oaSA9ICh1ZV9zdGF0dXNfaGkgJiAofnVlX3N0YXR1c19oaV9tYXNrKSk7CisJCXVlX2xvID0gKHVlX2xvICYgKH51ZV9sb19tYXNrKSk7CisJCXVlX2hpID0gKHVlX2hpICYgKH51ZV9oaV9tYXNrKSk7CisJfQogCi0JaWYgKHVlX3N0YXR1c19sbyB8fCB1ZV9zdGF0dXNfaGkpIHsKKwlpZiAodWVfbG8gfHwgdWVfaGkgfHwKKwkJc2xpcG9ydF9zdGF0dXMgJiBTTElQT1JUX1NUQVRVU19FUlJfTUFTSykgewogCQlhZGFwdGVyLT51ZV9kZXRlY3RlZCA9IHRydWU7CiAJCWFkYXB0ZXItPmVlaF9lcnIgPSB0cnVlOwogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJVRSBEZXRlY3RlZCEhXG4iKTsKIAl9CiAKLQlpZiAodWVfc3RhdHVzX2xvKSB7Ci0JCWZvciAoaSA9IDA7IHVlX3N0YXR1c19sbzsgdWVfc3RhdHVzX2xvID4+PSAxLCBpKyspIHsKLQkJCWlmICh1ZV9zdGF0dXNfbG8gJiAxKQorCWlmICh1ZV9sbykgeworCQlmb3IgKGkgPSAwOyB1ZV9sbzsgdWVfbG8gPj49IDEsIGkrKykgeworCQkJaWYgKHVlX2xvICYgMSkKIAkJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJIlVFOiAlcyBiaXQgc2V0XG4iLCB1ZV9zdGF0dXNfbG93X2Rlc2NbaV0pOwogCQl9CiAJfQotCWlmICh1ZV9zdGF0dXNfaGkpIHsKLQkJZm9yIChpID0gMDsgdWVfc3RhdHVzX2hpOyB1ZV9zdGF0dXNfaGkgPj49IDEsIGkrKykgewotCQkJaWYgKHVlX3N0YXR1c19oaSAmIDEpCisJaWYgKHVlX2hpKSB7CisJCWZvciAoaSA9IDA7IHVlX2hpOyB1ZV9oaSA+Pj0gMSwgaSsrKSB7CisJCQlpZiAodWVfaGkgJiAxKQogCQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCQkiVUU6ICVzIGJpdCBzZXRcbiIsIHVlX3N0YXR1c19oaV9kZXNjW2ldKTsKIAkJfQogCX0KIAorCWlmIChzbGlwb3J0X3N0YXR1cyAmIFNMSVBPUlRfU1RBVFVTX0VSUl9NQVNLKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJzbGlwb3J0IHN0YXR1cyAweCV4XG4iLCBzbGlwb3J0X3N0YXR1cyk7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJzbGlwb3J0IGVycm9yMSAweCV4XG4iLCBzbGlwb3J0X2VycjEpOworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkic2xpcG9ydCBlcnJvcjIgMHgleFxuIiwgc2xpcG9ydF9lcnIyKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGJlX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yMDIyLDcgKzIwNDMsNyBAQAogCXN0cnVjdCBiZV9yeF9vYmogKnJ4bzsKIAlpbnQgaTsKIAotCWlmICghYWRhcHRlci0+dWVfZGV0ZWN0ZWQgJiYgIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKQorCWlmICghYWRhcHRlci0+dWVfZGV0ZWN0ZWQpCiAJCWJlX2RldGVjdF9kdW1wX3VlKGFkYXB0ZXIpOwogCiAJLyogd2hlbiBpbnRlcnJ1cHRzIGFyZSBub3QgeWV0IGVuYWJsZWQsIGp1c3QgcmVhcCBhbnkgcGVuZGluZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZXRob2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2V0aG9jLmMKaW5kZXggYmRiMzQ4YS4uMjUxYjYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZXRob2MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9ldGhvYy5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvZXRob2MuaD4KIAogc3RhdGljIGludCBidWZmZXJfc2l6ZSA9IDB4ODAwMDsgLyogMzIgS0J5dGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9LY29uZmlnCmluZGV4IDFjZjY3MTYuLmM1MjBjZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9LY29uZmlnCkBAIC03LDggKzcsNyBAQAogCWRlZmF1bHQgeQogCWRlcGVuZHMgb24gRlNMX1NPQyB8fCBRVUlDQ19FTkdJTkUgfHwgQ1BNMSB8fCBDUE0yIHx8IFBQQ19NUEM1MTJ4IHx8IFwKIAkJICAgTTUyM3ggfHwgTTUyN3ggfHwgTTUyNzIgfHwgTTUyOHggfHwgTTUyMHggfHwgTTUzMnggfHwgXAotCQkgICBBUkNIX01YQyB8fCBBUkNIX01YUyB8fCBcCi0JCSAgIChQUENfTVBDNTJ4eCAmJiBQUENfQkVTVENPTU0pCisJCSAgIEFSQ0hfTVhDIHx8IEFSQ0hfTVhTIHx8IChQUENfTVBDNTJ4eCAmJiBQUENfQkVTVENPTU0pCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcywgc2F5IFkKIAkgIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMKaW5kZXggNDZkNjkwYS4uYjVkYzAyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaTgyNXh4LzNjNTA1LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvM2M1MDUuYwppbmRleCA0MGUxYTE3Li5iYTgyYTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvM2M1MDUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvM2M1MDUuYwpAQCAtMTI2LDE1ICsxMjYsMTMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIGZpbGVuYW1lIF9fRklMRV9fCi0KICNkZWZpbmUgdGltZW91dF9tc2cgIioqKiB0aW1lb3V0IGF0ICVzOiVzIChsaW5lICVkKSAqKipcbiIKICNkZWZpbmUgVElNRU9VVF9NU0cobGluZW5vKSBcCi0JcHJfbm90aWNlKHRpbWVvdXRfbXNnLCBmaWxlbmFtZSwgX19mdW5jX18sIChsaW5lbm8pKQorCXByX25vdGljZSh0aW1lb3V0X21zZywgX19GSUxFX18sIF9fZnVuY19fLCAobGluZW5vKSkKIAogI2RlZmluZSBpbnZhbGlkX3BjYl9tc2cgIioqKiBpbnZhbGlkIHBjYiBsZW5ndGggJWQgYXQgJXM6JXMgKGxpbmUgJWQpICoqKlxuIgogI2RlZmluZSBJTlZBTElEX1BDQl9NU0cobGVuKSBcCi0JcHJfbm90aWNlKGludmFsaWRfcGNiX21zZywgKGxlbiksIGZpbGVuYW1lLCBfX2Z1bmNfXywgX19MSU5FX18pCisJcHJfbm90aWNlKGludmFsaWRfcGNiX21zZywgKGxlbiksIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pCiAKICNkZWZpbmUgc2VhcmNoX21zZyAiJXM6IExvb2tpbmcgZm9yIDNjNTA1IGFkYXB0ZXIgYXQgYWRkcmVzcyAlI3guLi4iCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9LY29uZmlnCmluZGV4IDYxMDI5ZGMuLjc2MjEzMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvS2NvbmZpZwpAQCAtNSw3ICs1LDExIEBACiBjb25maWcgTkVUX1ZFTkRPUl9JTlRFTAogCWJvb2wgIkludGVsIGRldmljZXMiCiAJZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBQQ0kgfHwgUENJX01TSQorCWRlcGVuZHMgb24gUENJIHx8IFBDSV9NU0kgfHwgSVNBIHx8IElTQV9ETUFfQVBJIHx8IEFSTSB8fCBcCisJCSAgIEFSQ0hfQUNPUk4gfHwgTUNBIHx8IE1DQV9MRUdBQ1kgfHwgU05JX1JNIHx8IFNVTjMgfHwgXAorCQkgICBHU0MgfHwgQlZNRTYwMDAgfHwgTVZNRTE2eCB8fCBBUkNIX0VOUDI2MTEgfHwgXAorCQkgICAoQVJNICYmIEFSQ0hfSVhQNFhYICYmIElYUDRYWF9OUEUgJiYgSVhQNFhYX1FNR1IpIHx8IFwKKwkJICAgRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcywgc2F5IFkKIAkgIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAuYwppbmRleCBhZTE3Y2QxLi41YTJmZGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMC5jCkBAIC0yODEwLDYgKzI4MTAsMTAgQEAKIAogCWUxMDBfZ2V0X2RlZmF1bHRzKG5pYyk7CiAKKwkvKiBEMTAwIE1BQyBkb2Vzbid0IGFsbG93IHJ4IG9mIHZsYW4gcGFja2V0cyB3aXRoIG5vcm1hbCBNVFUgKi8KKwlpZiAobmljLT5tYWMgPCBtYWNfODI1NThfRDEwMV9BNCkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRDsKKwogCS8qIGxvY2tzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgaHdfcmVzZXQgKi8KIAlzcGluX2xvY2tfaW5pdCgmbmljLT5jYl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmbmljLT5jbWRfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2ljaDhsYW4uYwppbmRleCA2YTE3YzYyLi5lMmE4MGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9pY2g4bGFuLmMKQEAgLTg2Niw4ICs4NjYsNyBAQAogCiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoX19FMTAwMF9BQ0NFU1NfU0hBUkVEX1JFU09VUkNFLAogCQkJICAgICAmaHctPmFkYXB0ZXItPnN0YXRlKSkgewotCQlXQVJOKDEsICJlMTAwMGU6ICVzOiBjb250ZW50aW9uIGZvciBQaHkgYWNjZXNzXG4iLAotCQkgICAgIGh3LT5hZGFwdGVyLT5uZXRkZXYtPm5hbWUpOworCQllX2RiZygiY29udGVudGlvbiBmb3IgUGh5IGFjY2Vzc1xuIik7CiAJCXJldHVybiAtRTEwMDBfRVJSX1BIWTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9wYXJhbS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3BhcmFtLmMKaW5kZXggNGRkOWI2My4uMjBlOTNiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3BhcmFtLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3BhcmFtLmMKQEAgLTI3LDYgKzI3LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgImUxMDAwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfcGh5LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfcGh5LmMKaW5kZXggN2VkZjMxZS4uYjE3ZDdjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9waHkuYwpAQCAtMTY4Nyw3ICsxNjg3LDcgQEAKIAkJaWYgKHJldF92YWwpCiAJCQlnb3RvIG91dDsKIAotCQlpc19jbSA9ICEocGh5X2RhdGEgJiBJMzQ3QVQ0X1BDRENfQ0FCTEVfTEVOR1RIX1VOSVQpOworCQlpc19jbSA9ICEocGh5X2RhdGEyICYgSTM0N0FUNF9QQ0RDX0NBQkxFX0xFTkdUSF9VTklUKTsKIAogCQkvKiBQb3B1bGF0ZSB0aGUgcGh5IHN0cnVjdHVyZSB3aXRoIGNhYmxlIGxlbmd0aCBpbiBtZXRlcnMgKi8KIAkJcGh5LT5taW5fY2FibGVfbGVuZ3RoID0gcGh5X2RhdGEgLyAoaXNfY20gPyAxMDAgOiAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKaW5kZXggODM0ZjA0NC4uZjEzNjVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKQEAgLTMzNDQsNyArMzM0NCw3IEBACiBzdGF0aWMgczMyIGl4Z2JlX2hvc3RfaW50ZXJmYWNlX2NvbW1hbmQoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyICpidWZmZXIsCiAJCQkJCXUzMiBsZW5ndGgpCiB7Ci0JdTMyIGhpY3IsIGk7CisJdTMyIGhpY3IsIGksIGJpOwogCXUzMiBoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXhnYmVfaGljX2hkcik7CiAJdTggYnVmX2xlbiwgZHdvcmRfbGVuOwogCkBAIC0zMzk4LDkgKzMzOTgsOSBAQAogCWR3b3JkX2xlbiA9IGhkcl9zaXplID4+IDI7CiAKIAkvKiBmaXJzdCBwdWxsIGluIHRoZSBoZWFkZXIgc28gd2Uga25vdyB0aGUgYnVmZmVyIGxlbmd0aCAqLwotCWZvciAoaSA9IDA7IGkgPCBkd29yZF9sZW47IGkrKykgewotCQlidWZmZXJbaV0gPSBJWEdCRV9SRUFEX1JFR19BUlJBWShodywgSVhHQkVfRkxFWF9NTkcsIGkpOwotCQlsZTMyX3RvX2NwdXMoJmJ1ZmZlcltpXSk7CisJZm9yIChiaSA9IDA7IGJpIDwgZHdvcmRfbGVuOyBiaSsrKSB7CisJCWJ1ZmZlcltiaV0gPSBJWEdCRV9SRUFEX1JFR19BUlJBWShodywgSVhHQkVfRkxFWF9NTkcsIGJpKTsKKwkJbGUzMl90b19jcHVzKCZidWZmZXJbYmldKTsKIAl9CiAKIAkvKiBJZiB0aGVyZSBpcyBhbnkgdGhpbmcgaW4gZGF0YSBwb3NpdGlvbiBwdWxsIGl0IGluICovCkBAIC0zNDE0LDEyICszNDE0LDE0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qIENhbGN1bGF0ZSBsZW5ndGggaW4gRFdPUkRzLCBhZGQgb25lIGZvciBvZGQgbGVuZ3RocyAqLwotCWR3b3JkX2xlbiA9IChidWZfbGVuICsgMSkgPj4gMjsKKwkvKiBDYWxjdWxhdGUgbGVuZ3RoIGluIERXT1JEcywgYWRkIDMgZm9yIG9kZCBsZW5ndGhzICovCisJZHdvcmRfbGVuID0gKGJ1Zl9sZW4gKyAzKSA+PiAyOwogCi0JLyogUHVsbCBpbiB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIChpIGlzIHdoZXJlIHdlIGxlZnQgb2ZmKSovCi0JZm9yICg7IGkgPCBidWZfbGVuOyBpKyspCi0JCWJ1ZmZlcltpXSA9IElYR0JFX1JFQURfUkVHX0FSUkFZKGh3LCBJWEdCRV9GTEVYX01ORywgaSk7CisJLyogUHVsbCBpbiB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyIChiaSBpcyB3aGVyZSB3ZSBsZWZ0IG9mZikqLworCWZvciAoOyBiaSA8PSBkd29yZF9sZW47IGJpKyspIHsKKwkJYnVmZmVyW2JpXSA9IElYR0JFX1JFQURfUkVHX0FSUkFZKGh3LCBJWEdCRV9GTEVYX01ORywgYmkpOworCQlsZTMyX3RvX2NwdXMoJmJ1ZmZlcltiaV0pOworCX0KIAogb3V0OgogCXJldHVybiByZXRfdmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiX25sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfbmwuYwppbmRleCAzNjMxZDYzLi4zM2I5M2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfbmwuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfbmwuYwpAQCAtNTYxLDExICs1NjEsMTIgQEAKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGllZWVfZXRzICpteV9ldHMgPSBhZGFwdGVyLT5peGdiZV9pZWVlX2V0czsKIAorCWV0cy0+ZXRzX2NhcCA9IGFkYXB0ZXItPmRjYl9jZmcubnVtX3Rjcy5wZ190Y3M7CisKIAkvKiBObyBJRUVFIFBGQyBzZXR0aW5ncyBhdmFpbGFibGUgKi8KIAlpZiAoIW15X2V0cykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCi0JZXRzLT5ldHNfY2FwID0gYWRhcHRlci0+ZGNiX2NmZy5udW1fdGNzLnBnX3RjczsKIAlldHMtPmNicyA9IG15X2V0cy0+Y2JzOwogCW1lbWNweShldHMtPnRjX3R4X2J3LCBteV9ldHMtPnRjX3R4X2J3LCBzaXplb2YoZXRzLT50Y190eF9idykpOwogCW1lbWNweShldHMtPnRjX3J4X2J3LCBteV9ldHMtPnRjX3J4X2J3LCBzaXplb2YoZXRzLT50Y19yeF9idykpOwpAQCAtNjIxLDExICs2MjIsMTIgQEAKIAlzdHJ1Y3QgaWVlZV9wZmMgKm15X3BmYyA9IGFkYXB0ZXItPml4Z2JlX2llZWVfcGZjOwogCWludCBpOwogCisJcGZjLT5wZmNfY2FwID0gYWRhcHRlci0+ZGNiX2NmZy5udW1fdGNzLnBmY190Y3M7CisKIAkvKiBObyBJRUVFIFBGQyBzZXR0aW5ncyBhdmFpbGFibGUgKi8KIAlpZiAoIW15X3BmYykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCi0JcGZjLT5wZmNfY2FwID0gYWRhcHRlci0+ZGNiX2NmZy5udW1fdGNzLnBmY190Y3M7CiAJcGZjLT5wZmNfZW4gPSBteV9wZmMtPnBmY19lbjsKIAlwZmMtPm1iYyA9IG15X3BmYy0+bWJjOwogCXBmYy0+ZGVsYXkgPSBteV9wZmMtPmRlbGF5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWFpbi5jCmluZGV4IDA5YjhlODguLjhlZjkyZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMKQEAgLTMzNDUsMzQgKzMzNDUsMjUgQEAKIAogCWh3LT5tYWMub3BzLnNldF92ZnRhKCZhZGFwdGVyLT5odywgMCwgMCwgdHJ1ZSk7CiAKKyNpZmRlZiBJWEdCRV9GQ09FCisJaWYgKGFkYXB0ZXItPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0ZDT0VfTVRVKQorCQltYXhfZnJhbWUgPSBtYXgobWF4X2ZyYW1lLCBJWEdCRV9GQ09FX0pVTUJPX0ZSQU1FX1NJWkUpOworI2VuZGlmCisKIAkvKiByZWNvbmZpZ3VyZSB0aGUgaGFyZHdhcmUgKi8KIAlpZiAoYWRhcHRlci0+ZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkgewotI2lmZGVmIElYR0JFX0ZDT0UKLQkJaWYgKGFkYXB0ZXItPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0ZDT0VfTVRVKQotCQkJbWF4X2ZyYW1lID0gbWF4KG1heF9mcmFtZSwgSVhHQkVfRkNPRV9KVU1CT19GUkFNRV9TSVpFKTsKLSNlbmRpZgogCQlpeGdiZV9kY2JfY2FsY3VsYXRlX3RjX2NyZWRpdHMoaHcsICZhZGFwdGVyLT5kY2JfY2ZnLCBtYXhfZnJhbWUsCiAJCQkJCQlEQ0JfVFhfQ09ORklHKTsKIAkJaXhnYmVfZGNiX2NhbGN1bGF0ZV90Y19jcmVkaXRzKGh3LCAmYWRhcHRlci0+ZGNiX2NmZywgbWF4X2ZyYW1lLAogCQkJCQkJRENCX1JYX0NPTkZJRyk7CiAJCWl4Z2JlX2RjYl9od19jb25maWcoaHcsICZhZGFwdGVyLT5kY2JfY2ZnKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCi0JCWlmIChhZGFwdGVyLT5peGdiZV9pZWVlX2V0cykgewotCQkJc3RydWN0IGllZWVfZXRzICpldHMgPSBhZGFwdGVyLT5peGdiZV9pZWVlX2V0czsKLQkJCWludCBtYXhfZnJhbWUgPSBkZXYtPm10dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU47Ci0KLQkJCWl4Z2JlX2RjYl9od19ldHMoJmFkYXB0ZXItPmh3LCBldHMsIG1heF9mcmFtZSk7Ci0JCX0KLQotCQlpZiAoYWRhcHRlci0+aXhnYmVfaWVlZV9wZmMpIHsKLQkJCXN0cnVjdCBpZWVlX3BmYyAqcGZjID0gYWRhcHRlci0+aXhnYmVfaWVlZV9wZmM7Ci0JCQl1OCAqcHJpb190YyA9IGFkYXB0ZXItPml4Z2JlX2llZWVfZXRzLT5wcmlvX3RjOwotCi0JCQlpeGdiZV9kY2JfaHdfcGZjX2NvbmZpZygmYWRhcHRlci0+aHcsIHBmYy0+cGZjX2VuLAotCQkJCQkJcHJpb190Yyk7Ci0JCX0KKwl9IGVsc2UgaWYgKGFkYXB0ZXItPml4Z2JlX2llZWVfZXRzICYmIGFkYXB0ZXItPml4Z2JlX2llZWVfcGZjKSB7CisJCWl4Z2JlX2RjYl9od19ldHMoJmFkYXB0ZXItPmh3LAorCQkJCSBhZGFwdGVyLT5peGdiZV9pZWVlX2V0cywKKwkJCQkgbWF4X2ZyYW1lKTsKKwkJaXhnYmVfZGNiX2h3X3BmY19jb25maWcoJmFkYXB0ZXItPmh3LAorCQkJCQlhZGFwdGVyLT5peGdiZV9pZWVlX3BmYy0+cGZjX2VuLAorCQkJCQlhZGFwdGVyLT5peGdiZV9pZWVlX2V0cy0+cHJpb190Yyk7CiAJfQogCiAJLyogRW5hYmxlIFJTUyBIYXNoIHBlciBUQyAqLwpAQCAtNjEyNSw3ICs2MTE2LDYgQEAKIAlhdXRvbmVnID0gaHctPnBoeS5hdXRvbmVnX2FkdmVydGlzZWQ7CiAJaWYgKCghYXV0b25lZykgJiYgKGh3LT5tYWMub3BzLmdldF9saW5rX2NhcGFiaWxpdGllcykpCiAJCWh3LT5tYWMub3BzLmdldF9saW5rX2NhcGFiaWxpdGllcyhodywgJmF1dG9uZWcsICZuZWdvdGlhdGlvbik7Ci0JaHctPm1hYy5hdXRvdHJ5X3Jlc3RhcnQgPSBmYWxzZTsKIAlpZiAoaHctPm1hYy5vcHMuc2V0dXBfbGluaykKIAkJaHctPm1hYy5vcHMuc2V0dXBfbGluayhodywgYXV0b25lZywgbmVnb3RpYXRpb24sIHRydWUpOwogCkBAIC03NTg5LDEzICs3NTc5LDYgQEAKIAkJZ290byBlcnJfZWVwcm9tOwogCX0KIAotCS8qIHBvd2VyIGRvd24gdGhlIG9wdGljcyBmb3IgbXVsdGlzcGVlZCBmaWJlciBhbmQgODI1OTkgU0ZQKyBmaWJlciAqLwotCWlmIChody0+bWFjLm9wcy5kaXNhYmxlX3R4X2xhc2VyICYmCi0JICAgICgoaHctPnBoeS5tdWx0aXNwZWVkX2ZpYmVyKSB8fAotCSAgICAgKChody0+bWFjLm9wcy5nZXRfbWVkaWFfdHlwZShodykgPT0gaXhnYmVfbWVkaWFfdHlwZV9maWJlcikgJiYKLQkgICAgICAoaHctPm1hYy50eXBlID09IGl4Z2JlX21hY184MjU5OUVCKSkpKQotCQlody0+bWFjLm9wcy5kaXNhYmxlX3R4X2xhc2VyKGh3KTsKLQogCXNldHVwX3RpbWVyKCZhZGFwdGVyLT5zZXJ2aWNlX3RpbWVyLCAmaXhnYmVfc2VydmljZV90aW1lciwKIAkgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRhcHRlcik7CiAKQEAgLTc2OTMsNiArNzY3NiwxMyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3JlZ2lzdGVyOwogCisJLyogcG93ZXIgZG93biB0aGUgb3B0aWNzIGZvciBtdWx0aXNwZWVkIGZpYmVyIGFuZCA4MjU5OSBTRlArIGZpYmVyICovCisJaWYgKGh3LT5tYWMub3BzLmRpc2FibGVfdHhfbGFzZXIgJiYKKwkgICAgKChody0+cGh5Lm11bHRpc3BlZWRfZmliZXIpIHx8CisJICAgICAoKGh3LT5tYWMub3BzLmdldF9tZWRpYV90eXBlKGh3KSA9PSBpeGdiZV9tZWRpYV90eXBlX2ZpYmVyKSAmJgorCSAgICAgIChody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjXzgyNTk5RUIpKSkpCisJCWh3LT5tYWMub3BzLmRpc2FibGVfdHhfbGFzZXIoaHcpOworCiAJLyogY2FycmllciBvZmYgcmVwb3J0aW5nIGlzIGltcG9ydGFudCB0byBldGh0b29sIGV2ZW4gQkVGT1JFIG9wZW4gKi8KIAluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYwppbmRleCBkYjk1NzMxLi4wMGZjZDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMKQEAgLTQ0MiwxMiArNDQyLDE0IEBACiAKIGludCBpeGdiZV9jaGVja192Zl9hc3NpZ25tZW50KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogeworI2lmZGVmIENPTkZJR19QQ0lfSU9WCiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV92ZnM7IGkrKykgewogCQlpZiAoYWRhcHRlci0+dmZpbmZvW2ldLnZmZGV2LT5kZXZfZmxhZ3MgJgogCQkJCVBDSV9ERVZfRkxBR1NfQVNTSUdORUQpCiAJCQlyZXR1cm4gdHJ1ZTsKIAl9CisjZW5kaWYKIAlyZXR1cm4gZmFsc2U7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oCmluZGV4IDVhN2UxZWIuLmRmMDRmMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaApAQCAtNDMsOSArNDMsMTEgQEAKIAkJCSAgICBpbnQgdmYsIHN0cnVjdCBpZmxhX3ZmX2luZm8gKml2aSk7CiB2b2lkIGl4Z2JlX2NoZWNrX3ZmX3JhdGVfbGltaXQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBpeGdiZV9kaXNhYmxlX3NyaW92KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBpeGdiZV9jaGVja192Zl9hc3NpZ25tZW50KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKKyNpZmRlZiBDT05GSUdfUENJX0lPVgogdm9pZCBpeGdiZV9lbmFibGVfc3Jpb3Yoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQljb25zdCBzdHJ1Y3QgaXhnYmVfaW5mbyAqaWkpOwotaW50IGl4Z2JlX2NoZWNrX3ZmX2Fzc2lnbm1lbnQoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOworI2VuZGlmCiAKIAogI2VuZGlmIC8qIF9JWEdCRV9TUklPVl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKaW5kZXggNWU5MmNjMi4uNGM4ZTE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCkBAIC01NCw3ICs1NCw3IEBACiBzdGF0aWMgY29uc3QgY2hhciBpeGdiZXZmX2RyaXZlcl9zdHJpbmdbXSA9CiAJIkludGVsKFIpIDEwIEdpZ2FiaXQgUENJIEV4cHJlc3MgVmlydHVhbCBGdW5jdGlvbiBOZXR3b3JrIERyaXZlciI7CiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjIuMS4wLWsiCisjZGVmaW5lIERSVl9WRVJTSU9OICIyLjIuMC1rIgogY29uc3QgY2hhciBpeGdiZXZmX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIHN0YXRpYyBjaGFyIGl4Z2JldmZfY29weXJpZ2h0W10gPQogCSJDb3B5cmlnaHQgKGMpIDIwMDkgLSAyMDEwIEludGVsIENvcnBvcmF0aW9uLiI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCmluZGV4IGNiZDAyNmYuLmZkYzZjMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCkBAIC0zNjYsMTcgKzM2Niw2IEBACiAJCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9GRV9TUEVDXzIsIHNwZWMpOwogCQkJfQogCQl9IGVsc2UgewotCQkJaWYgKGh3LT5jaGlwX2lkID49IENISVBfSURfWVVLT05fT1BUKSB7Ci0JCQkJdTE2IGN0cmwyID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMXzIpOwotCi0JCQkJLyogZW5hYmxlIFBIWSBSZXZlcnNlIEF1dG8tTmVnb3RpYXRpb24gKi8KLQkJCQljdHJsMiB8PSAxdSA8PCAxMzsKLQotCQkJCS8qIFdyaXRlIFBIWSBjaGFuZ2VzIChTVy1yZXNldCBtdXN0IGZvbGxvdykgKi8KLQkJCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMXzIsIGN0cmwyKTsKLQkJCX0KLQotCiAJCQkvKiBkaXNhYmxlIGVuZXJneSBkZXRlY3QgKi8KIAkJCWN0cmwgJj0gflBIWV9NX1BDX0VOX0RFVF9NU0s7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvYWxsb2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvYWxsb2MuYwppbmRleCAxMTZjYWUzLi44YmUyMGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2FsbG9jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9hbGxvYy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY2F0YXMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY2F0YXMuYwppbmRleCAzMmY5NDcxLi40NWFlYTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NhdGFzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jYXRhcy5jCkBAIC0zMiw2ICszMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAibWx4NC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NtZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jbWQuYwppbmRleCAyM2NlZTdiLi43OGY1YTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY3EuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY3EuYwppbmRleCBiZDhlZjlmLi40OTlhNTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jcS5jCkBAIC0zNSw2ICszNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21seDQvY21kLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3R4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3R4LmMKaW5kZXggOTBmMmNkMi4uZDkwMWI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fdHguYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAogI2luY2x1ZGUgIm1seDRfZW4uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lcS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lcS5jCmluZGV4IDFhZDFmNjAuLjI0ZWU5NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKQEAgLTQ4NCw3ICs0ODUsNyBAQAogCiAJbWx4NF9tdHRfY2xlYW51cChkZXYsICZlcS0+bXR0KTsKIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgUEFHRV9TSVpFLAogCQkJCSAgICBlcS0+cGFnZV9saXN0W2ldLmJ1ZiwKIAkJCQkgICAgZXEtPnBhZ2VfbGlzdFtpXS5tYXApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMKaW5kZXggZWQ0NTJkZC4uNDM1Y2E2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuYwpAQCAtMzMsNiArMzMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAKICNpbmNsdWRlICJmdy5oIgpAQCAtMjA1LDYgKzIwNiw4IEBACiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTUFYX01DR19PRkZTRVQJCTB4NjMKICNkZWZpbmUgUVVFUllfREVWX0NBUF9SU1ZEX1BEX09GRlNFVAkJMHg2NAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX01BWF9QRF9PRkZTRVQJCTB4NjUKKyNkZWZpbmUgUVVFUllfREVWX0NBUF9SU1ZEX1hSQ19PRkZTRVQJCTB4NjYKKyNkZWZpbmUgUVVFUllfREVWX0NBUF9NQVhfWFJDX09GRlNFVAkJMHg2NwogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX01BWF9DT1VOVEVSU19PRkZTRVQJMHg2OAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1JETUFSQ19FTlRSWV9TWl9PRkZTRVQJMHg4MAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1FQQ19FTlRSWV9TWl9PRkZTRVQJMHg4MgpAQCAtMzE5LDYgKzMyMiwxMCBAQAogCWRldl9jYXAtPnJlc2VydmVkX3BkcyA9IGZpZWxkID4+IDQ7CiAJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9NQVhfUERfT0ZGU0VUKTsKIAlkZXZfY2FwLT5tYXhfcGRzID0gMSA8PCAoZmllbGQgJiAweDNmKTsKKwlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX1JTVkRfWFJDX09GRlNFVCk7CisJZGV2X2NhcC0+cmVzZXJ2ZWRfeHJjZHMgPSBmaWVsZCA+PiA0OworCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfTUFYX1BEX09GRlNFVCk7CisJZGV2X2NhcC0+bWF4X3hyY2RzID0gMSA8PCAoZmllbGQgJiAweDFmKTsKIAogCU1MWDRfR0VUKHNpemUsIG91dGJveCwgUVVFUllfREVWX0NBUF9SRE1BUkNfRU5UUllfU1pfT0ZGU0VUKTsKIAlkZXZfY2FwLT5yZG1hcmNfZW50cnlfc3ogPSBzaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5oCmluZGV4IDFlOGVjYzMuLmJmNWVjMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmgKQEAgLTkzLDYgKzkzLDggQEAKIAlpbnQgbWF4X21jZ3M7CiAJaW50IHJlc2VydmVkX3BkczsKIAlpbnQgbWF4X3BkczsKKwlpbnQgcmVzZXJ2ZWRfeHJjZHM7CisJaW50IG1heF94cmNkczsKIAlpbnQgcXBjX2VudHJ5X3N6OwogCWludCByZG1hcmNfZW50cnlfc3o7CiAJaW50IGFsdGNfZW50cnlfc3o7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ludGYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvaW50Zi5jCmluZGV4IDczYzk0ZmMuLmNhNmZlYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvaW50Zi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvaW50Zi5jCkBAIC0zMiw2ICszMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIm1seDQuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwppbmRleCBmMGVlMzVkLi45NGJiYzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwpAQCAtOTYsNiArOTYsOCBAQAogc3RhdGljIGludCBsb2dfbnVtX3ZsYW47CiBtb2R1bGVfcGFyYW1fbmFtZWQobG9nX251bV92bGFuLCBsb2dfbnVtX3ZsYW4sIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxvZ19udW1fdmxhbiwgIkxvZzIgbWF4IG51bWJlciBvZiBWTEFOcyBwZXIgRVRIIHBvcnQgKDAtNykiKTsKKy8qIExvZzIgbWF4IG51bWJlciBvZiBWTEFOcyBwZXIgRVRIIHBvcnQgKDAtNykgKi8KKyNkZWZpbmUgTUxYNF9MT0dfTlVNX1ZMQU5TIDcKIAogc3RhdGljIGludCB1c2VfcHJpbzsKIG1vZHVsZV9wYXJhbV9uYW1lZCh1c2VfcHJpbywgdXNlX3ByaW8sIGJvb2wsIDA0NDQpOwpAQCAtMjIwLDYgKzIyMiwxMCBAQAogCWRldi0+Y2Fwcy5yZXNlcnZlZF9tcndzCSAgICAgPSBkZXZfY2FwLT5yZXNlcnZlZF9tcndzOwogCWRldi0+Y2Fwcy5yZXNlcnZlZF91YXJzCSAgICAgPSBkZXZfY2FwLT5yZXNlcnZlZF91YXJzOwogCWRldi0+Y2Fwcy5yZXNlcnZlZF9wZHMJICAgICA9IGRldl9jYXAtPnJlc2VydmVkX3BkczsKKwlkZXYtPmNhcHMucmVzZXJ2ZWRfeHJjZHMgICAgID0gKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1hSQykgPworCQkJCQlkZXZfY2FwLT5yZXNlcnZlZF94cmNkcyA6IDA7CisJZGV2LT5jYXBzLm1heF94cmNkcyAgICAgICAgICA9IChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19YUkMpID8KKwkJCQkJZGV2X2NhcC0+bWF4X3hyY2RzIDogMDsKIAlkZXYtPmNhcHMubXR0X2VudHJ5X3N6CSAgICAgPSBkZXYtPmNhcHMubXR0c19wZXJfc2VnICogZGV2X2NhcC0+bXR0X2VudHJ5X3N6OwogCWRldi0+Y2Fwcy5tYXhfbXNnX3N6ICAgICAgICAgPSBkZXZfY2FwLT5tYXhfbXNnX3N6OwogCWRldi0+Y2Fwcy5wYWdlX3NpemVfY2FwCSAgICAgPSB+KHUzMikgKGRldl9jYXAtPm1pbl9wYWdlX3N6IC0gMSk7CkBAIC0yMzAsNyArMjM2LDcgQEAKIAlkZXYtPmNhcHMubWF4X2dzb19zegkgICAgID0gZGV2X2NhcC0+bWF4X2dzb19zejsKIAogCWRldi0+Y2Fwcy5sb2dfbnVtX21hY3MgID0gbG9nX251bV9tYWM7Ci0JZGV2LT5jYXBzLmxvZ19udW1fdmxhbnMgPSBsb2dfbnVtX3ZsYW47CisJZGV2LT5jYXBzLmxvZ19udW1fdmxhbnMgPSBNTFg0X0xPR19OVU1fVkxBTlM7CiAJZGV2LT5jYXBzLmxvZ19udW1fcHJpb3MgPSB1c2VfcHJpbyA/IDMgOiAwOwogCiAJZm9yIChpID0gMTsgaSA8PSBkZXYtPmNhcHMubnVtX3BvcnRzOyArK2kpIHsKQEAgLTkxMiwxMSArOTE4LDE4IEBACiAJCWdvdG8gZXJyX2thcl91bm1hcDsKIAl9CiAKKwllcnIgPSBtbHg0X2luaXRfeHJjZF90YWJsZShkZXYpOworCWlmIChlcnIpIHsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgIgorCQkJICJyZWxpYWJsZSBjb25uZWN0aW9uIGRvbWFpbiB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfcGRfdGFibGVfZnJlZTsKKwl9CisKIAllcnIgPSBtbHg0X2luaXRfbXJfdGFibGUoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplICIKIAkJCSAibWVtb3J5IHJlZ2lvbiB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfcGRfdGFibGVfZnJlZTsKKwkJZ290byBlcnJfeHJjZF90YWJsZV9mcmVlOwogCX0KIAogCWVyciA9IG1seDRfaW5pdF9lcV90YWJsZShkZXYpOwpAQCAtOTk4LDYgKzEwMTEsMTMgQEAKIAkJCQkgICJpYiBjYXBhYmlsaXRpZXMgKCVkKS4gQ29udGludWluZyB3aXRoICIKIAkJCQkgICJjYXBzID0gMFxuIiwgcG9ydCwgZXJyKTsKIAkJZGV2LT5jYXBzLmliX3BvcnRfZGVmX2NhcFtwb3J0XSA9IGliX3BvcnRfZGVmYXVsdF9jYXBzOworCisJCWVyciA9IG1seDRfY2hlY2tfZXh0X3BvcnRfY2FwcyhkZXYsIHBvcnQpOworCQlpZiAoZXJyKQorCQkJbWx4NF93YXJuKGRldiwgImZhaWxlZCB0byBnZXQgcG9ydCAlZCBleHRlbmRlZCAiCisJCQkJICAicG9ydCBjYXBhYmlsaXRpZXMgc3VwcG9ydCBpbmZvICglZCkuIgorCQkJCSAgIiBBc3N1bWluZyBub3Qgc3VwcG9ydGVkXG4iLCBwb3J0LCBlcnIpOworCiAJCWVyciA9IG1seDRfU0VUX1BPUlQoZGV2LCBwb3J0KTsKIAkJaWYgKGVycikgewogCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBwb3J0ICVkLCBhYm9ydGluZ1xuIiwKQEAgLTEwMzMsNiArMTA1Myw5IEBACiBlcnJfbXJfdGFibGVfZnJlZToKIAltbHg0X2NsZWFudXBfbXJfdGFibGUoZGV2KTsKIAorZXJyX3hyY2RfdGFibGVfZnJlZToKKwltbHg0X2NsZWFudXBfeHJjZF90YWJsZShkZXYpOworCiBlcnJfcGRfdGFibGVfZnJlZToKIAltbHg0X2NsZWFudXBfcGRfdGFibGUoZGV2KTsKIApAQCAtMTM1NSw2ICsxMzc4LDcgQEAKIAltbHg0X2NtZF91c2VfcG9sbGluZyhkZXYpOwogCW1seDRfY2xlYW51cF9lcV90YWJsZShkZXYpOwogCW1seDRfY2xlYW51cF9tcl90YWJsZShkZXYpOworCW1seDRfY2xlYW51cF94cmNkX3RhYmxlKGRldik7CiAJbWx4NF9jbGVhbnVwX3BkX3RhYmxlKGRldik7CiAJbWx4NF9jbGVhbnVwX3Vhcl90YWJsZShkZXYpOwogCkBAIC0xNDE2LDYgKzE0NDAsNyBAQAogCQltbHg0X2NtZF91c2VfcG9sbGluZyhkZXYpOwogCQltbHg0X2NsZWFudXBfZXFfdGFibGUoZGV2KTsKIAkJbWx4NF9jbGVhbnVwX21yX3RhYmxlKGRldik7CisJCW1seDRfY2xlYW51cF94cmNkX3RhYmxlKGRldik7CiAJCW1seDRfY2xlYW51cF9wZF90YWJsZShkZXYpOwogCiAJCWlvdW5tYXAocHJpdi0+a2FyKTsKQEAgLTE0ODksMTAgKzE1MTQsOSBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKChsb2dfbnVtX3ZsYW4gPCAwKSB8fCAobG9nX251bV92bGFuID4gNykpIHsKLQkJcHJfd2FybmluZygibWx4NF9jb3JlOiBiYWQgbnVtX3ZsYW46ICVkXG4iLCBsb2dfbnVtX3ZsYW4pOwotCQlyZXR1cm4gLTE7Ci0JfQorCWlmIChsb2dfbnVtX3ZsYW4gIT0gMCkKKwkJcHJfd2FybmluZygibWx4NF9jb3JlOiBsb2dfbnVtX3ZsYW4gLSBvYnNvbGV0ZSBtb2R1bGUgcGFyYW0sIHVzaW5nICVkXG4iLAorCQkJICAgTUxYNF9MT0dfTlVNX1ZMQU5TKTsKIAogCWlmICgobG9nX210dHNfcGVyX3NlZyA8IDEpIHx8IChsb2dfbXR0c19wZXJfc2VnID4gNykpIHsKIAkJcHJfd2FybmluZygibWx4NF9jb3JlOiBiYWQgbG9nX210dHNfcGVyX3NlZzogJWRcbiIsIGxvZ19tdHRzX3Blcl9zZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tY2cuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWNnLmMKaW5kZXggY2QxNzg0NS4uOTc4Njg4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tY2cuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21jZy5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21seDQvY21kLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJtbHg0LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmgKaW5kZXggYTJmY2Q4NC4uNWRmYTY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmgKQEAgLTMzNSw2ICszMzUsNyBAQAogCXN0cnVjdCBtbHg0X2NtZAkJY21kOwogCiAJc3RydWN0IG1seDRfYml0bWFwCXBkX2JpdG1hcDsKKwlzdHJ1Y3QgbWx4NF9iaXRtYXAJeHJjZF9iaXRtYXA7CiAJc3RydWN0IG1seDRfdWFyX3RhYmxlCXVhcl90YWJsZTsKIAlzdHJ1Y3QgbWx4NF9tcl90YWJsZQltcl90YWJsZTsKIAlzdHJ1Y3QgbWx4NF9jcV90YWJsZQljcV90YWJsZTsKQEAgLTM4NCw2ICszODUsNyBAQAogdm9pZCBtbHg0X2ZyZWVfZXFfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpOwogCiBpbnQgbWx4NF9pbml0X3BkX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKK2ludCBtbHg0X2luaXRfeHJjZF90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CiBpbnQgbWx4NF9pbml0X3Vhcl90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CiBpbnQgbWx4NF9pbml0X21yX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKIGludCBtbHg0X2luaXRfZXFfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpOwpAQCAtMzkzLDYgKzM5NSw3IEBACiBpbnQgbWx4NF9pbml0X21jZ190YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CiAKIHZvaWQgbWx4NF9jbGVhbnVwX3BkX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKK3ZvaWQgbWx4NF9jbGVhbnVwX3hyY2RfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpOwogdm9pZCBtbHg0X2NsZWFudXBfdWFyX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKIHZvaWQgbWx4NF9jbGVhbnVwX21yX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKIHZvaWQgbWx4NF9jbGVhbnVwX2VxX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKQEAgLTQ1MCw2ICs0NTMsNyBAQAogCiBpbnQgbWx4NF9TRVRfUE9SVChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCk7CiBpbnQgbWx4NF9nZXRfcG9ydF9pYl9jYXBzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCBfX2JlMzIgKmNhcHMpOworaW50IG1seDRfY2hlY2tfZXh0X3BvcnRfY2FwcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCk7CiAKIGludCBtbHg0X3FwX2RldGFjaF9jb21tb24oc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3FwICpxcCwgdTggZ2lkWzE2XSwKIAkJCSAgZW51bSBtbHg0X3Byb3RvY29sIHByb3QsIGVudW0gbWx4NF9zdGVlcl90eXBlIHN0ZWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0X2VuLmgKaW5kZXggZmNhNjYxNi4uOGZkYTMzMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCkBAIC01ODEsOCArNTgxLDkgQEAKICAqIHByaW50ayAvIGxvZ2dpbmcgZnVuY3Rpb25zCiAgKi8KIAorX19wcmludGYoMywgNCkKIGludCBlbl9wcmludChjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiwKLQkgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CisJICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CiAKICNkZWZpbmUgZW5fZGJnKG1sZXZlbCwgcHJpdiwgZm9ybWF0LCBhcmcuLi4pCQkJXAogZG8gewkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tci5jCmluZGV4IDljMTg4YmQuLmVmYTNlNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21yLmMKQEAgLTMzLDYgKzMzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgpAQCAtMTM5LDcgKzE0MCw3IEBACiAKIAlidWRkeS0+Yml0cyA9IGt6YWxsb2MoKGJ1ZGR5LT5tYXhfb3JkZXIgKyAxKSAqIHNpemVvZiAobG9uZyAqKSwKIAkJCSAgICAgIEdGUF9LRVJORUwpOwotCWJ1ZGR5LT5udW1fZnJlZSA9IGt6YWxsb2MoKGJ1ZGR5LT5tYXhfb3JkZXIgKyAxKSAqIHNpemVvZiAoaW50ICopLAorCWJ1ZGR5LT5udW1fZnJlZSA9IGtjYWxsb2MoKGJ1ZGR5LT5tYXhfb3JkZXIgKyAxKSwgc2l6ZW9mICpidWRkeS0+bnVtX2ZyZWUsCiAJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZGR5LT5iaXRzIHx8ICFidWRkeS0+bnVtX2ZyZWUpCiAJCWdvdG8gZXJyX291dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcGQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcGQuYwppbmRleCAxMjg2Yjg4Li4yNjBlZDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BkLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wZC5jCkBAIC0zMiw2ICszMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8tbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTYxLDYgKzYyLDI0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X3BkX2ZyZWUpOwogCitpbnQgbWx4NF94cmNkX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgKnhyY2RuKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKworCSp4cmNkbiA9IG1seDRfYml0bWFwX2FsbG9jKCZwcml2LT54cmNkX2JpdG1hcCk7CisJaWYgKCp4cmNkbiA9PSAtMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfeHJjZF9hbGxvYyk7CisKK3ZvaWQgbWx4NF94cmNkX2ZyZWUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiB4cmNkbikKK3sKKwltbHg0X2JpdG1hcF9mcmVlKCZtbHg0X3ByaXYoZGV2KS0+eHJjZF9iaXRtYXAsIHhyY2RuKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfeHJjZF9mcmVlKTsKKwogaW50IG1seDRfaW5pdF9wZF90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CkBAIC03NCw2ICs5MywxOCBAQAogCW1seDRfYml0bWFwX2NsZWFudXAoJm1seDRfcHJpdihkZXYpLT5wZF9iaXRtYXApOwogfQogCitpbnQgbWx4NF9pbml0X3hyY2RfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCisJcmV0dXJuIG1seDRfYml0bWFwX2luaXQoJnByaXYtPnhyY2RfYml0bWFwLCAoMSA8PCAxNiksCisJCQkJKDEgPDwgMTYpIC0gMSwgZGV2LT5jYXBzLnJlc2VydmVkX3hyY2RzICsgMSwgMCk7Cit9CisKK3ZvaWQgbWx4NF9jbGVhbnVwX3hyY2RfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJbWx4NF9iaXRtYXBfY2xlYW51cCgmbWx4NF9wcml2KGRldiktPnhyY2RfYml0bWFwKTsKK30KIAogaW50IG1seDRfdWFyX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF91YXIgKnVhcikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wb3J0LmMKaW5kZXggMTYzYTMxNC4uZDk0MmFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wb3J0LmMKQEAgLTMyLDYgKzMyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21seDQvY21kLmg+CiAKQEAgLTE0OCwyMiArMTQ5LDI2IEBACiAKIAlpZiAoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX1VDX1NURUVSKSB7CiAJCWVyciA9IG1seDRfdWNfc3RlZXJfYWRkKGRldiwgcG9ydCwgbWFjLCBxcG4sIDEpOwotCQlpZiAoIWVycikgewotCQkJZW50cnkgPSBrbWFsbG9jKHNpemVvZiAqZW50cnksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFlbnRyeSkgewotCQkJCW1seDRfdWNfc3RlZXJfcmVsZWFzZShkZXYsIHBvcnQsIG1hYywgKnFwbiwgMSk7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCQllbnRyeS0+bWFjID0gbWFjOwotCQkJZXJyID0gcmFkaXhfdHJlZV9pbnNlcnQoJmluZm8tPm1hY190cmVlLCAqcXBuLCBlbnRyeSk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJbWx4NF91Y19zdGVlcl9yZWxlYXNlKGRldiwgcG9ydCwgbWFjLCAqcXBuLCAxKTsKLQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQl9IGVsc2UKKwkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CisKKwkJZW50cnkgPSBrbWFsbG9jKHNpemVvZiAqZW50cnksIEdGUF9LRVJORUwpOworCQlpZiAoIWVudHJ5KSB7CisJCQltbHg0X3VjX3N0ZWVyX3JlbGVhc2UoZGV2LCBwb3J0LCBtYWMsICpxcG4sIDEpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQllbnRyeS0+bWFjID0gbWFjOworCQllcnIgPSByYWRpeF90cmVlX2luc2VydCgmaW5mby0+bWFjX3RyZWUsICpxcG4sIGVudHJ5KTsKKwkJaWYgKGVycikgeworCQkJa2ZyZWUoZW50cnkpOworCQkJbWx4NF91Y19zdGVlcl9yZWxlYXNlKGRldiwgcG9ydCwgbWFjLCAqcXBuLCAxKTsKKwkJCXJldHVybiBlcnI7CisJCX0KIAl9CisKIAltbHg0X2RiZyhkZXYsICJSZWdpc3RlcmluZyBNQUM6IDB4JWxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgbWFjKTsKKwogCW11dGV4X2xvY2soJnRhYmxlLT5tdXRleCk7CiAJZm9yIChpID0gMDsgaSA8IE1MWDRfTUFYX01BQ19OVU0gLSAxOyBpKyspIHsKIAkJaWYgKGZyZWUgPCAwICYmICF0YWJsZS0+cmVmc1tpXSkgewpAQCAtNDY1LDYgKzQ3MCw0OCBAQAogCXJldHVybiBlcnI7CiB9CiAKK2ludCBtbHg0X2NoZWNrX2V4dF9wb3J0X2NhcHMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQpCit7CisJc3RydWN0IG1seDRfY21kX21haWxib3ggKmlubWFpbGJveCwgKm91dG1haWxib3g7CisJdTggKmluYnVmLCAqb3V0YnVmOworCWludCBlcnIsIHBhY2tldF9lcnJvcjsKKworCWlubWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKKwlpZiAoSVNfRVJSKGlubWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKGlubWFpbGJveCk7CisKKwlvdXRtYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCWlmIChJU19FUlIob3V0bWFpbGJveCkpIHsKKwkJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgaW5tYWlsYm94KTsKKwkJcmV0dXJuIFBUUl9FUlIob3V0bWFpbGJveCk7CisJfQorCisJaW5idWYgPSBpbm1haWxib3gtPmJ1ZjsKKwlvdXRidWYgPSBvdXRtYWlsYm94LT5idWY7CisJbWVtc2V0KGluYnVmLCAwLCAyNTYpOworCW1lbXNldChvdXRidWYsIDAsIDI1Nik7CisJaW5idWZbMF0gPSAxOworCWluYnVmWzFdID0gMTsKKwlpbmJ1ZlsyXSA9IDE7CisJaW5idWZbM10gPSAxOworCisJKihfX2JlMTYgKikgKCZpbmJ1ZlsxNl0pID0gTUxYNF9BVFRSX0VYVEVOREVEX1BPUlRfSU5GTzsKKwkqKF9fYmUzMiAqKSAoJmluYnVmWzIwXSkgPSBjcHVfdG9fYmUzMihwb3J0KTsKKworCWVyciA9IG1seDRfY21kX2JveChkZXYsIGlubWFpbGJveC0+ZG1hLCBvdXRtYWlsYm94LT5kbWEsIHBvcnQsIDMsCisJCQkgICBNTFg0X0NNRF9NQURfSUZDLCBNTFg0X0NNRF9USU1FX0NMQVNTX0MpOworCisJcGFja2V0X2Vycm9yID0gYmUxNl90b19jcHUoKihfX2JlMTYgKikgKG91dGJ1ZiArIDQpKTsKKworCWRldi0+Y2Fwcy5leHRfcG9ydF9jYXBbcG9ydF0gPSAoIWVyciAmJiAhcGFja2V0X2Vycm9yKSA/CisJCQkJICAgICAgIE1MWF9FWFRfUE9SVF9DQVBfRkxBR19FWFRFTkRFRF9QT1JUX0lORk8KKwkJCQkgICAgICAgOiAwOworCisJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgaW5tYWlsYm94KTsKKwltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBvdXRtYWlsYm94KTsKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgbWx4NF9TRVRfUE9SVChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCkKIHsKIAlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcXAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcXAuYwppbmRleCBlYzkzNTBlLi4xNWY4NzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3FwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9xcC5jCkBAIC0zNCw2ICszNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21seDQvY21kLmg+CiAjaW5jbHVkZSA8bGludXgvbWx4NC9xcC5oPgogCkBAIC0yODAsNiArMjgxLDkgQEAKIAkgKiBXZSByZXNlcnZlIDIgZXh0cmEgUVBzIHBlciBwb3J0IGZvciB0aGUgc3BlY2lhbCBRUHMuICBUaGUKIAkgKiBibG9jayBvZiBzcGVjaWFsIFFQcyBtdXN0IGJlIGFsaWduZWQgdG8gYSBtdWx0aXBsZSBvZiA4LCBzbwogCSAqIHJvdW5kIHVwLgorCSAqCisJICogV2UgYWxzbyByZXNlcnZlIHRoZSBNU0Igb2YgdGhlIDI0LWJpdCBRUCBudW1iZXIgdG8gaW5kaWNhdGUKKwkgKiB0aGF0IGEgUVAgaXMgYW4gWFJDIFFQLgogCSAqLwogCWRldi0+Y2Fwcy5zcXBfc3RhcnQgPQogCQlBTElHTihkZXYtPmNhcHMucmVzZXJ2ZWRfcXBzX2NudFtNTFg0X1FQX1JFR0lPTl9GV10sIDgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zcnEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvc3JxLmMKaW5kZXggM2IwN2I4MC4uOWNiZjNmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zcnEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3NycS5jCkBAIC0zMiw2ICszMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21seDQvY21kLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAKICNpbmNsdWRlICJtbHg0LmgiCkBAIC00MCwyMCArNDEsMjAgQEAKIHN0cnVjdCBtbHg0X3NycV9jb250ZXh0IHsKIAlfX2JlMzIJCQlzdGF0ZV9sb2dzaXplX3NycW47CiAJdTgJCQlsb2dzdHJpZGU7Ci0JdTgJCQlyZXNlcnZlZDFbM107Ci0JdTgJCQlwZ19vZmZzZXQ7Ci0JdTgJCQlyZXNlcnZlZDJbM107Ci0JdTMyCQkJcmVzZXJ2ZWQzOworCXU4CQkJcmVzZXJ2ZWQxOworCV9fYmUxNgkJCXhyY2Q7CisJX19iZTMyCQkJcGdfb2Zmc2V0X2NxbjsKKwl1MzIJCQlyZXNlcnZlZDI7CiAJdTgJCQlsb2dfcGFnZV9zaXplOwotCXU4CQkJcmVzZXJ2ZWQ0WzJdOworCXU4CQkJcmVzZXJ2ZWQzWzJdOwogCXU4CQkJbXR0X2Jhc2VfYWRkcl9oOwogCV9fYmUzMgkJCW10dF9iYXNlX2FkZHJfbDsKIAlfX2JlMzIJCQlwZDsKIAlfX2JlMTYJCQlsaW1pdF93YXRlcm1hcms7CiAJX19iZTE2CQkJd3FlX2NudDsKLQl1MTYJCQlyZXNlcnZlZDU7CisJdTE2CQkJcmVzZXJ2ZWQ0OwogCV9fYmUxNgkJCXdxZV9jb3VudGVyOwotCXUzMgkJCXJlc2VydmVkNjsKKwl1MzIJCQlyZXNlcnZlZDU7CiAJX19iZTY0CQkJZGJfcmVjX2FkZHI7CiB9OwogCkBAIC0xMDksOCArMTEwLDggQEAKIAkJCSAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EpOwogfQogCi1pbnQgbWx4NF9zcnFfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBwZG4sIHN0cnVjdCBtbHg0X210dCAqbXR0LAotCQkgICB1NjQgZGJfcmVjLCBzdHJ1Y3QgbWx4NF9zcnEgKnNycSkKK2ludCBtbHg0X3NycV9hbGxvYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIHBkbiwgdTMyIGNxbiwgdTE2IHhyY2QsCisJCSAgIHN0cnVjdCBtbHg0X210dCAqbXR0LCB1NjQgZGJfcmVjLCBzdHJ1Y3QgbWx4NF9zcnEgKnNycSkKIHsKIAlzdHJ1Y3QgbWx4NF9zcnFfdGFibGUgKnNycV90YWJsZSA9ICZtbHg0X3ByaXYoZGV2KS0+c3JxX3RhYmxlOwogCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OwpAQCAtMTQ4LDYgKzE0OSw4IEBACiAJc3JxX2NvbnRleHQtPnN0YXRlX2xvZ3NpemVfc3JxbiA9IGNwdV90b19iZTMyKChpbG9nMihzcnEtPm1heCkgPDwgMjQpIHwKIAkJCQkJCSAgICAgIHNycS0+c3Jxbik7CiAJc3JxX2NvbnRleHQtPmxvZ3N0cmlkZSAgICAgICAgICA9IHNycS0+d3FlX3NoaWZ0IC0gNDsKKwlzcnFfY29udGV4dC0+eHJjZAkJPSBjcHVfdG9fYmUxNih4cmNkKTsKKwlzcnFfY29udGV4dC0+cGdfb2Zmc2V0X2Nxbgk9IGNwdV90b19iZTMyKGNxbiAmIDB4ZmZmZmZmKTsKIAlzcnFfY29udGV4dC0+bG9nX3BhZ2Vfc2l6ZSAgICAgID0gbXR0LT5wYWdlX3NoaWZ0IC0gTUxYNF9JQ01fUEFHRV9TSElGVDsKIAogCW10dF9hZGRyID0gbWx4NF9tdHRfYWRkcihkZXYsIG10dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL0tjb25maWcKaW5kZXggNGE2YjlmZC4uZWI4MzZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvS2NvbmZpZwpAQCAtNSw3ICs1LDEwIEBACiBjb25maWcgTkVUX1ZFTkRPUl9OQVRTRU1JCiAJYm9vbCAiTmF0aW9uYWwgU2VtaS1jb25kdWN0b3IgZGV2aWNlcyIKIAlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIE1DQSB8fCBNQUMgfHwgTUFDSF9KQVpaIHx8IFBDSSB8fCBYVEVOU0FfUExBVEZPUk1fWFQyMDAwCisJZGVwZW5kcyBvbiBBTUlHQV9QQ01DSUEgfHwgQVJNIHx8IEVJU0EgfHwgRVhQRVJJTUVOVEFMIHx8IEg4MzAwIHx8IFwKKwkJICAgSVNBIHx8IE0zMlIgfHwgTUFDIHx8IE1BQ0hfSkFaWiB8fCBNQUNIX1RYNDlYWCB8fCBNQ0EgfHwgXAorCQkgICBNQ0FfTEVHQUNZIHx8IE1JUFMgfHwgUENJIHx8IFBDTUNJQSB8fCBTVVBFUkggfHwgXAorCQkgICBYVEVOU0FfUExBVEZPUk1fWFQyMDAwIHx8IFpPUlJPCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcywgc2F5IFkKIAkgIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtbWFpbi5jCmluZGV4IDY3MWUxNjYuLmE4MzE5N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLW1haW4uYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0X3RzdGFtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAidnhnZS1tYWluLmgiCiAjaW5jbHVkZSAidnhnZS1yZWcuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnZpZGlhL2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnZpZGlhL2ZvcmNlZGV0aC5jCmluZGV4IDFlMzdlYjkuLjFkY2E1NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L252aWRpYS9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9udmlkaWEvZm9yY2VkZXRoLmMKQEAgLTE2ODIsNiArMTY4Miw3IEBACiAJCW5wLT5lc3RhdHMudHhfcGF1c2UgKz0gcmVhZGwoYmFzZSArIE52UmVnVHhQYXVzZSk7CiAJCW5wLT5lc3RhdHMucnhfcGF1c2UgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhQYXVzZSk7CiAJCW5wLT5lc3RhdHMucnhfZHJvcF9mcmFtZSArPSByZWFkbChiYXNlICsgTnZSZWdSeERyb3BGcmFtZSk7CisJCW5wLT5lc3RhdHMucnhfZXJyb3JzX3RvdGFsICs9IG5wLT5lc3RhdHMucnhfZHJvcF9mcmFtZTsKIAl9CiAKIAlpZiAobnAtPmRyaXZlcl9kYXRhICYgREVWX0hBU19TVEFUSVNUSUNTX1YzKSB7CkBAIC0xNzA2LDExICsxNzA3LDE0IEBACiAJCW52X2dldF9od19zdGF0cyhkZXYpOwogCiAJCS8qIGNvcHkgdG8gbmV0X2RldmljZSBzdGF0cyAqLworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMgPSBucC0+ZXN0YXRzLnR4X3BhY2tldHM7CisJCWRldi0+c3RhdHMucnhfYnl0ZXMgPSBucC0+ZXN0YXRzLnJ4X2J5dGVzOwogCQlkZXYtPnN0YXRzLnR4X2J5dGVzID0gbnAtPmVzdGF0cy50eF9ieXRlczsKIAkJZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IG5wLT5lc3RhdHMudHhfZmlmb19lcnJvcnM7CiAJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSBucC0+ZXN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOwogCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSBucC0+ZXN0YXRzLnJ4X2NyY19lcnJvcnM7CiAJCWRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBucC0+ZXN0YXRzLnJ4X292ZXJfZXJyb3JzOworCQlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gbnAtPmVzdGF0cy5yeF9kcm9wX2ZyYW1lOwogCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycyA9IG5wLT5lc3RhdHMucnhfZXJyb3JzX3RvdGFsOwogCQlkZXYtPnN0YXRzLnR4X2Vycm9ycyA9IG5wLT5lc3RhdHMudHhfZXJyb3JzX3RvdGFsOwogCX0KQEAgLTIwOTksMTAgKzIxMDMsMTAgQEAKIAogCS8qIGFkZCBmcmFnbWVudHMgdG8gZW50cmllcyBjb3VudCAqLwogCWZvciAoaSA9IDA7IGkgPCBmcmFnbWVudHM7IGkrKykgewotCQl1MzIgc2l6ZSA9IHNrYl9mcmFnX3NpemUoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0pOworCQl1MzIgZnJhZ19zaXplID0gc2tiX2ZyYWdfc2l6ZSgmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSk7CiAKLQkJZW50cmllcyArPSAoc2l6ZSA+PiBOVl9UWDJfVFNPX01BWF9TSElGVCkgKwotCQkJICAgKChzaXplICYgKE5WX1RYMl9UU09fTUFYX1NJWkUtMSkpID8gMSA6IDApOworCQllbnRyaWVzICs9IChmcmFnX3NpemUgPj4gTlZfVFgyX1RTT19NQVhfU0hJRlQpICsKKwkJCSAgICgoZnJhZ19zaXplICYgKE5WX1RYMl9UU09fTUFYX1NJWkUtMSkpID8gMSA6IDApOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOwpAQCAtMjE0MSwxMyArMjE0NSwxMyBAQAogCS8qIHNldHVwIHRoZSBmcmFnbWVudHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZnJhZ21lbnRzOyBpKyspIHsKIAkJY29uc3Qgc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwotCQl1MzIgc2l6ZSA9IHNrYl9mcmFnX3NpemUoZnJhZyk7CisJCXUzMiBmcmFnX3NpemUgPSBza2JfZnJhZ19zaXplKGZyYWcpOwogCQlvZmZzZXQgPSAwOwogCiAJCWRvIHsKIAkJCXByZXZfdHggPSBwdXRfdHg7CiAJCQlwcmV2X3R4X2N0eCA9IG5wLT5wdXRfdHhfY3R4OwotCQkJYmNudCA9IChzaXplID4gTlZfVFgyX1RTT19NQVhfU0laRSkgPyBOVl9UWDJfVFNPX01BWF9TSVpFIDogc2l6ZTsKKwkJCWJjbnQgPSAoZnJhZ19zaXplID4gTlZfVFgyX1RTT19NQVhfU0laRSkgPyBOVl9UWDJfVFNPX01BWF9TSVpFIDogZnJhZ19zaXplOwogCQkJbnAtPnB1dF90eF9jdHgtPmRtYSA9IHNrYl9mcmFnX2RtYV9tYXAoCiAJCQkJCQkJJm5wLT5wY2lfZGV2LT5kZXYsCiAJCQkJCQkJZnJhZywgb2Zmc2V0LApAQCAtMjE1OSwxMiArMjE2MywxMiBAQAogCQkJcHV0X3R4LT5mbGFnbGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CiAKIAkJCW9mZnNldCArPSBiY250OwotCQkJc2l6ZSAtPSBiY250OworCQkJZnJhZ19zaXplIC09IGJjbnQ7CiAJCQlpZiAodW5saWtlbHkocHV0X3R4KysgPT0gbnAtPmxhc3RfdHgub3JpZykpCiAJCQkJcHV0X3R4ID0gbnAtPmZpcnN0X3R4Lm9yaWc7CiAJCQlpZiAodW5saWtlbHkobnAtPnB1dF90eF9jdHgrKyA9PSBucC0+bGFzdF90eF9jdHgpKQogCQkJCW5wLT5wdXRfdHhfY3R4ID0gbnAtPmZpcnN0X3R4X2N0eDsKLQkJfSB3aGlsZSAoc2l6ZSk7CisJCX0gd2hpbGUgKGZyYWdfc2l6ZSk7CiAJfQogCiAJLyogc2V0IGxhc3QgZnJhZ21lbnQgZmxhZyAgKi8KQEAgLTIyMTMsMTAgKzIyMTcsMTAgQEAKIAogCS8qIGFkZCBmcmFnbWVudHMgdG8gZW50cmllcyBjb3VudCAqLwogCWZvciAoaSA9IDA7IGkgPCBmcmFnbWVudHM7IGkrKykgewotCQl1MzIgc2l6ZSA9IHNrYl9mcmFnX3NpemUoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0pOworCQl1MzIgZnJhZ19zaXplID0gc2tiX2ZyYWdfc2l6ZSgmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSk7CiAKLQkJZW50cmllcyArPSAoc2l6ZSA+PiBOVl9UWDJfVFNPX01BWF9TSElGVCkgKwotCQkJICAgKChzaXplICYgKE5WX1RYMl9UU09fTUFYX1NJWkUtMSkpID8gMSA6IDApOworCQllbnRyaWVzICs9IChmcmFnX3NpemUgPj4gTlZfVFgyX1RTT19NQVhfU0hJRlQpICsKKwkJCSAgICgoZnJhZ19zaXplICYgKE5WX1RYMl9UU09fTUFYX1NJWkUtMSkpID8gMSA6IDApOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOwpAQCAtMjI1NywxMyArMjI2MSwxMyBAQAogCS8qIHNldHVwIHRoZSBmcmFnbWVudHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZnJhZ21lbnRzOyBpKyspIHsKIAkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwotCQl1MzIgc2l6ZSA9IHNrYl9mcmFnX3NpemUoZnJhZyk7CisJCXUzMiBmcmFnX3NpemUgPSBza2JfZnJhZ19zaXplKGZyYWcpOwogCQlvZmZzZXQgPSAwOwogCiAJCWRvIHsKIAkJCXByZXZfdHggPSBwdXRfdHg7CiAJCQlwcmV2X3R4X2N0eCA9IG5wLT5wdXRfdHhfY3R4OwotCQkJYmNudCA9IChzaXplID4gTlZfVFgyX1RTT19NQVhfU0laRSkgPyBOVl9UWDJfVFNPX01BWF9TSVpFIDogc2l6ZTsKKwkJCWJjbnQgPSAoZnJhZ19zaXplID4gTlZfVFgyX1RTT19NQVhfU0laRSkgPyBOVl9UWDJfVFNPX01BWF9TSVpFIDogZnJhZ19zaXplOwogCQkJbnAtPnB1dF90eF9jdHgtPmRtYSA9IHNrYl9mcmFnX2RtYV9tYXAoCiAJCQkJCQkJJm5wLT5wY2lfZGV2LT5kZXYsCiAJCQkJCQkJZnJhZywgb2Zmc2V0LApAQCAtMjI3NiwxMiArMjI4MCwxMiBAQAogCQkJcHV0X3R4LT5mbGFnbGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CiAKIAkJCW9mZnNldCArPSBiY250OwotCQkJc2l6ZSAtPSBiY250OworCQkJZnJhZ19zaXplIC09IGJjbnQ7CiAJCQlpZiAodW5saWtlbHkocHV0X3R4KysgPT0gbnAtPmxhc3RfdHguZXgpKQogCQkJCXB1dF90eCA9IG5wLT5maXJzdF90eC5leDsKIAkJCWlmICh1bmxpa2VseShucC0+cHV0X3R4X2N0eCsrID09IG5wLT5sYXN0X3R4X2N0eCkpCiAJCQkJbnAtPnB1dF90eF9jdHggPSBucC0+Zmlyc3RfdHhfY3R4OwotCQl9IHdoaWxlIChzaXplKTsKKwkJfSB3aGlsZSAoZnJhZ19zaXplKTsKIAl9CiAKIAkvKiBzZXQgbGFzdCBmcmFnbWVudCBmbGFnICAqLwpAQCAtMjM3NCwxNiArMjM3OCw4IEBACiAJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSkgewogCQkJaWYgKGZsYWdzICYgTlZfVFhfTEFTVFBBQ0tFVCkgewogCQkJCWlmIChmbGFncyAmIE5WX1RYX0VSUk9SKSB7Ci0JCQkJCWlmIChmbGFncyAmIE5WX1RYX1VOREVSRkxPVykKLQkJCQkJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKLQkJCQkJaWYgKGZsYWdzICYgTlZfVFhfQ0FSUklFUkxPU1QpCi0JCQkJCQlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CiAJCQkJCWlmICgoZmxhZ3MgJiBOVl9UWF9SRVRSWUVSUk9SKSAmJiAhKGZsYWdzICYgTlZfVFhfUkVUUllDT1VOVF9NQVNLKSkKIAkJCQkJCW52X2xlZ2FjeWJhY2tvZmZfcmVzZWVkKGRldik7Ci0JCQkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbnAtPmdldF90eF9jdHgtPnNrYi0+bGVuOwogCQkJCX0KIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShucC0+Z2V0X3R4X2N0eC0+c2tiKTsKIAkJCQlucC0+Z2V0X3R4X2N0eC0+c2tiID0gTlVMTDsKQEAgLTIzOTIsMTYgKzIzODgsOCBAQAogCQl9IGVsc2UgewogCQkJaWYgKGZsYWdzICYgTlZfVFgyX0xBU1RQQUNLRVQpIHsKIAkJCQlpZiAoZmxhZ3MgJiBOVl9UWDJfRVJST1IpIHsKLQkJCQkJaWYgKGZsYWdzICYgTlZfVFgyX1VOREVSRkxPVykKLQkJCQkJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKLQkJCQkJaWYgKGZsYWdzICYgTlZfVFgyX0NBUlJJRVJMT1NUKQotCQkJCQkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwogCQkJCQlpZiAoKGZsYWdzICYgTlZfVFgyX1JFVFJZRVJST1IpICYmICEoZmxhZ3MgJiBOVl9UWDJfUkVUUllDT1VOVF9NQVNLKSkKIAkJCQkJCW52X2xlZ2FjeWJhY2tvZmZfcmVzZWVkKGRldik7Ci0JCQkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbnAtPmdldF90eF9jdHgtPnNrYi0+bGVuOwogCQkJCX0KIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShucC0+Z2V0X3R4X2N0eC0+c2tiKTsKIAkJCQlucC0+Z2V0X3R4X2N0eC0+c2tiID0gTlVMTDsKQEAgLTI0MzQsOSArMjQyMiw3IEBACiAJCW52X3VubWFwX3R4c2tiKG5wLCBucC0+Z2V0X3R4X2N0eCk7CiAKIAkJaWYgKGZsYWdzICYgTlZfVFgyX0xBU1RQQUNLRVQpIHsKLQkJCWlmICghKGZsYWdzICYgTlZfVFgyX0VSUk9SKSkKLQkJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCWVsc2UgeworCQkJaWYgKGZsYWdzICYgTlZfVFgyX0VSUk9SKSB7CiAJCQkJaWYgKChmbGFncyAmIE5WX1RYMl9SRVRSWUVSUk9SKSAmJiAhKGZsYWdzICYgTlZfVFgyX1JFVFJZQ09VTlRfTUFTSykpIHsKIAkJCQkJaWYgKG5wLT5kcml2ZXJfZGF0YSAmIERFVl9IQVNfR0VBUl9NT0RFKQogCQkJCQkJbnZfZ2Vhcl9iYWNrb2ZmX3Jlc2VlZChkZXYpOwpAQCAtMjYzNiw3ICsyNjIyLDYgQEAKIAkJCQkJaWYgKChmbGFncyAmIE5WX1JYX0VSUk9SX01BU0spID09IE5WX1JYX0VSUk9SNCkgewogCQkJCQkJbGVuID0gbnZfZ2V0bGVuKGRldiwgc2tiLT5kYXRhLCBsZW4pOwogCQkJCQkJaWYgKGxlbiA8IDApIHsKLQkJCQkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCQkJCQlnb3RvIG5leHRfcGt0OwogCQkJCQkJfQpAQCAtMjY1MCwxMSArMjYzNSw2IEBACiAJCQkJCWVsc2UgewogCQkJCQkJaWYgKGZsYWdzICYgTlZfUlhfTUlTU0VERlJBTUUpCiAJCQkJCQkJZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7Ci0JCQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9DUkNFUlIpCi0JCQkJCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7Ci0JCQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9PVkVSRkxPVykKLQkJCQkJCQlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7Ci0JCQkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJCQkJZ290byBuZXh0X3BrdDsKIAkJCQkJfQpAQCAtMjY3MCw3ICsyNjUwLDYgQEAKIAkJCQkJaWYgKChmbGFncyAmIE5WX1JYMl9FUlJPUl9NQVNLKSA9PSBOVl9SWDJfRVJST1I0KSB7CiAJCQkJCQlsZW4gPSBudl9nZXRsZW4oZGV2LCBza2ItPmRhdGEsIGxlbik7CiAJCQkJCQlpZiAobGVuIDwgMCkgewotCQkJCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJCQkJCWdvdG8gbmV4dF9wa3Q7CiAJCQkJCQl9CkBAIC0yNjgyLDExICsyNjYxLDYgQEAKIAkJCQkJfQogCQkJCQkvKiB0aGUgcmVzdCBhcmUgaGFyZCBlcnJvcnMgKi8KIAkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoZmxhZ3MgJiBOVl9SWDJfQ1JDRVJSKQotCQkJCQkJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwotCQkJCQkJaWYgKGZsYWdzICYgTlZfUlgyX09WRVJGTE9XKQotCQkJCQkJCWRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKLQkJCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQkJCQlnb3RvIG5leHRfcGt0OwogCQkJCQl9CkBAIC0yNzA0LDcgKzI2NzgsNiBAQAogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQluYXBpX2dyb19yZWNlaXZlKCZucC0+bmFwaSwgc2tiKTsKIAkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogbmV4dF9wa3Q6CiAJCWlmICh1bmxpa2VseShucC0+Z2V0X3J4Lm9yaWcrKyA9PSBucC0+bGFzdF9yeC5vcmlnKSkKIAkJCW5wLT5nZXRfcngub3JpZyA9IG5wLT5maXJzdF9yeC5vcmlnOwpAQCAtMjc4Nyw5ICsyNzYwLDcgQEAKIAkJCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmlkKTsKIAkJCX0KIAkJCW5hcGlfZ3JvX3JlY2VpdmUoJm5wLT5uYXBpLCBza2IpOwotCiAJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCQl9IGVsc2UgewogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQl9CkBAIC0yOTYyLDExICsyOTMzLDExIEBACiAJCQkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKIAogCQkJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLQkJCQkJdW5zaWduZWQgY2hhciAqYWRkciA9IGhhLT5hZGRyOworCQkJCQl1bnNpZ25lZCBjaGFyICpod19hZGRyID0gaGEtPmFkZHI7CiAJCQkJCXUzMiBhLCBiOwogCi0JCQkJCWEgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKSBhZGRyKTsKLQkJCQkJYiA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopICgmYWRkcls0XSkpOworCQkJCQlhID0gbGUzMl90b19jcHUoKihfX2xlMzIgKikgaHdfYWRkcik7CisJCQkJCWIgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSAoJmh3X2FkZHJbNF0pKTsKIAkJCQkJYWx3YXlzT25bMF0gJj0gYTsKIAkJCQkJYWx3YXlzT2ZmWzBdICY9IH5hOwogCQkJCQlhbHdheXNPblsxXSAmPSBiOwpAQCAtMzM5OCw3ICszMzY5LDggQEAKIAogCWZvciAoaSA9IDA7OyBpKyspIHsKIAkJZXZlbnRzID0gcmVhZGwoYmFzZSArIE52UmVnTVNJWElycVN0YXR1cykgJiBOVlJFR19JUlFfVFhfQUxMOwotCQl3cml0ZWwoTlZSRUdfSVJRX1RYX0FMTCwgYmFzZSArIE52UmVnTVNJWElycVN0YXR1cyk7CisJCXdyaXRlbChldmVudHMsIGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpOworCQluZXRkZXZfZGJnKGRldiwgInR4IGlycSBldmVudHM6ICUwOHhcbiIsIGV2ZW50cyk7CiAJCWlmICghKGV2ZW50cyAmIG5wLT5pcnFtYXNrKSkKIAkJCWJyZWFrOwogCkBAIC0zNTA5LDcgKzM0ODEsOCBAQAogCiAJZm9yIChpID0gMDs7IGkrKykgewogCQlldmVudHMgPSByZWFkbChiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKSAmIE5WUkVHX0lSUV9SWF9BTEw7Ci0JCXdyaXRlbChOVlJFR19JUlFfUlhfQUxMLCBiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKTsKKwkJd3JpdGVsKGV2ZW50cywgYmFzZSArIE52UmVnTVNJWElycVN0YXR1cyk7CisJCW5ldGRldl9kYmcoZGV2LCAicnggaXJxIGV2ZW50czogJTA4eFxuIiwgZXZlbnRzKTsKIAkJaWYgKCEoZXZlbnRzICYgbnAtPmlycW1hc2spKQogCQkJYnJlYWs7CiAKQEAgLTM1NTMsNyArMzUyNiw4IEBACiAKIAlmb3IgKGkgPSAwOzsgaSsrKSB7CiAJCWV2ZW50cyA9IHJlYWRsKGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpICYgTlZSRUdfSVJRX09USEVSOwotCQl3cml0ZWwoTlZSRUdfSVJRX09USEVSLCBiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKTsKKwkJd3JpdGVsKGV2ZW50cywgYmFzZSArIE52UmVnTVNJWElycVN0YXR1cyk7CisJCW5ldGRldl9kYmcoZGV2LCAiaXJxIGV2ZW50czogJTA4eFxuIiwgZXZlbnRzKTsKIAkJaWYgKCEoZXZlbnRzICYgbnAtPmlycW1hc2spKQogCQkJYnJlYWs7CiAKQEAgLTM2MTcsMTAgKzM1OTEsMTAgQEAKIAogCWlmICghKG5wLT5tc2lfZmxhZ3MgJiBOVl9NU0lfWF9FTkFCTEVEKSkgewogCQlldmVudHMgPSByZWFkbChiYXNlICsgTnZSZWdJcnFTdGF0dXMpICYgTlZSRUdfSVJRU1RBVF9NQVNLOwotCQl3cml0ZWwoTlZSRUdfSVJRX1RJTUVSLCBiYXNlICsgTnZSZWdJcnFTdGF0dXMpOworCQl3cml0ZWwoZXZlbnRzICYgTlZSRUdfSVJRX1RJTUVSLCBiYXNlICsgTnZSZWdJcnFTdGF0dXMpOwogCX0gZWxzZSB7CiAJCWV2ZW50cyA9IHJlYWRsKGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpICYgTlZSRUdfSVJRU1RBVF9NQVNLOwotCQl3cml0ZWwoTlZSRUdfSVJRX1RJTUVSLCBiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKTsKKwkJd3JpdGVsKGV2ZW50cyAmIE5WUkVHX0lSUV9USU1FUiwgYmFzZSArIE52UmVnTVNJWElycVN0YXR1cyk7CiAJfQogCXBjaV9wdXNoKGJhc2UpOwogCWlmICghKGV2ZW50cyAmIE5WUkVHX0lSUV9USU1FUikpCkBAIC00NTY2LDcgKzQ1NDAsNyBAQAogCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CiAKIAkvKiB1cGRhdGUgc3RhdHMgKi8KLQludl9kb19zdGF0c19wb2xsKCh1bnNpZ25lZCBsb25nKWRldik7CisJbnZfZ2V0X2h3X3N0YXRzKGRldik7CiAKIAltZW1jcHkoYnVmZmVyLCAmbnAtPmVzdGF0cywgbnZfZ2V0X3NzZXRfY291bnQoZGV2LCBFVEhfU1NfU1RBVFMpKnNpemVvZih1NjQpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L29jdGVvbi9vY3Rlb25fbWdtdC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2N0ZW9uL29jdGVvbl9tZ210LmMKaW5kZXggYmMxZDk0Ni4uMjEyZjQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2N0ZW9uL29jdGVvbl9tZ210LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2N0ZW9uL29jdGVvbl9tZ210LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9wY2hfZ2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9tYWluLmMKaW5kZXggYjg5ZjNhNi4uNDg0MDZjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9wY2hfZ2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfbWFpbi5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJwY2hfZ2JlLmgiCiAjaW5jbHVkZSAicGNoX2diZV9hcGkuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAgICAgIjEuMDAiCiBjb25zdCBjaGFyIHBjaF9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfcGFyYW0uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9wYXJhbS5jCmluZGV4IDViNWQ5MGEuLjljMDc1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9wYXJhbS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9wYXJhbS5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogZm9yIF9fTU9EVUxFX1NUUklORyAqLwogI2luY2x1ZGUgInBjaF9nYmUuaCIKIAogI2RlZmluZSBPUFRJT05fVU5TRVQgICAtMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9LY29uZmlnCmluZGV4IDg0MDgzZWMuLjA1Nzg4NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrL0tjb25maWcKQEAgLTExNSwxNiArMTE1LDQgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHI4MTY5LiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KIAotY29uZmlnIFNDOTIwMzEKLQl0cmlzdGF0ZSAiU2lsYW4gU0M5MjAzMSBQQ0kgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIGRyaXZlciAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgQ1JDMzIKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgRmFzdCBFdGhlcm5ldCBQQ0kgbmV0d29yayBjYXJkcyBiYXNlZCBvbgotCSAgdGhlIFNpbGFuIFNDOTIwMzEgY2hpcCAoc29tZXRpbWVzIGFsc28gY2FsbGVkIFJzbHRlayA4MTM5RCkuIElmIHlvdQotCSAgaGF2ZSBvbmUgb2YgdGhlc2UsIHNheSBZIGhlcmUuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNjOTIwMzEuICBUaGlzIGlzIHJlY29tbWVuZGVkLgotCiBlbmRpZiAjIE5FVF9WRU5ET1JfUkVBTFRFSwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvTWFrZWZpbGUKaW5kZXggZTQ4Y2ZiNi4uNzFiMWRhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrL01ha2VmaWxlCkBAIC02LDQgKzYsMyBAQAogb2JqLSQoQ09ORklHXzgxMzlUT08pICs9IDgxMzl0b28ubwogb2JqLSQoQ09ORklHX0FUUCkgKz0gYXRwLm8KIG9iai0kKENPTkZJR19SODE2OSkgKz0gcjgxNjkubwotb2JqLSQoQ09ORklHX1NDOTIwMzEpICs9IHNjOTIwMzEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jCmluZGV4IGRlOWFmZWIuLmQ1NzMxZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMKQEAgLTIyMjksMTMgKzIyMjksMTUgQEAKIAogLyogUENJIGRldmljZSBJRCB0YWJsZSAqLwogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGVmeF9wY2lfdGFibGUpID0gewotCXtQQ0lfREVWSUNFKEVGWF9WRU5ESURfU0ZDLCBGQUxDT05fQV9QX0RFVklEKSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NPTEFSRkxBUkUsCisJCSAgICBQQ0lfREVWSUNFX0lEX1NPTEFSRkxBUkVfU0ZDNDAwMEFfMCksCiAJIC5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmZmFsY29uX2ExX25pY190eXBlfSwKLQl7UENJX0RFVklDRShFRlhfVkVORElEX1NGQywgRkFMQ09OX0JfUF9ERVZJRCksCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFLAorCQkgICAgUENJX0RFVklDRV9JRF9TT0xBUkZMQVJFX1NGQzQwMDBCKSwKIAkgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZmYWxjb25fYjBfbmljX3R5cGV9LAotCXtQQ0lfREVWSUNFKEVGWF9WRU5ESURfU0ZDLCBCRVRIUEFHRV9BX1BfREVWSUQpLAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU09MQVJGTEFSRSwgQkVUSFBBR0VfQV9QX0RFVklEKSwKIAkgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZzaWVuYV9hMF9uaWNfdHlwZX0sCi0Je1BDSV9ERVZJQ0UoRUZYX1ZFTkRJRF9TRkMsIFNJRU5BX0FfUF9ERVZJRCksCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFLCBTSUVOQV9BX1BfREVWSUQpLAogCSAuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykgJnNpZW5hX2EwX25pY190eXBlfSwKIAl7MH0JCQkvKiBlbmQgb2YgbGlzdCAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguaAppbmRleCA0NDJmNGQwLi40NzY0NzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5oCkBAIC0xNSwxMCArMTUsNiBAQAogI2luY2x1ZGUgImZpbHRlci5oIgogCiAvKiBQQ0kgSURzICovCi0jZGVmaW5lIEVGWF9WRU5ESURfU0ZDCSAgICAgICAgMHgxOTI0Ci0jZGVmaW5lIEZBTENPTl9BX1BfREVWSUQJMHgwNzAzCi0jZGVmaW5lIEZBTENPTl9BX1NfREVWSUQgICAgICAgIDB4NjcwMwotI2RlZmluZSBGQUxDT05fQl9QX0RFVklEICAgICAgICAweDA3MTAKICNkZWZpbmUgQkVUSFBBR0VfQV9QX0RFVklEICAgICAgMHgwODAzCiAjZGVmaW5lIFNJRU5BX0FfUF9ERVZJRCAgICAgICAgIDB4MDgxMwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uLmMKaW5kZXggNGRkMTc0OC4uOTdiNjA2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb24uYwpAQCAtMTQyNiw3ICsxNDI2LDggQEAKIAkJfQogCiAJCWRldiA9IHBjaV9kZXZfZ2V0KGVmeC0+cGNpX2Rldik7Ci0JCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoRUZYX1ZFTkRJRF9TRkMsIEZBTENPTl9BX1NfREVWSUQsCisJCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFLAorCQkJCQkgICAgIFBDSV9ERVZJQ0VfSURfU09MQVJGTEFSRV9TRkM0MDAwQV8xLAogCQkJCQkgICAgIGRldikpKSB7CiAJCQlpZiAoZGV2LT5idXMgPT0gZWZ4LT5wY2lfZGV2LT5idXMgJiYKIAkJCSAgICBkZXYtPmRldmZuID09IGVmeC0+cGNpX2Rldi0+ZGV2Zm4gKyAxKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uX2JvYXJkcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbl9ib2FyZHMuYwppbmRleCBiOWNjODQ2Li42Y2MxNmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uX2JvYXJkcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb25fYm9hcmRzLmMKQEAgLTc2NCw3ICs3NjQsOCBAQAogCiAJaWYgKGJvYXJkLT50eXBlKSB7CiAJCW5ldGlmX2luZm8oZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LCAiYm9hcmQgaXMgJXMgcmV2ICVjJWRcbiIsCi0JCQkgKGVmeC0+cGNpX2Rldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBFRlhfVkVORElEX1NGQykKKwkJCSAoZWZ4LT5wY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09CisJCQkgIFBDSV9WRU5ET1JfSURfU09MQVJGTEFSRSkKIAkJCSA/IGJvYXJkLT50eXBlLT5yZWZfbW9kZWwgOiBib2FyZC0+dHlwZS0+Z2VuX3R5cGUsCiAJCQkgJ0EnICsgYm9hcmQtPm1ham9yLCBib2FyZC0+bWlub3IpOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9yeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3J4LmMKaW5kZXggYWRiZGExOC4uNzUyZDUyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3J4LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSAibmV0X2RyaXZlci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lsYW4vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NpbGFuL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxY2UxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NpbGFuL0tjb25maWcKQEAgLTAsMCArMSwzMyBAQAorIworIyBTaWxhbiBkZXZpY2UgY29uZmlndXJhdGlvbgorIworCitjb25maWcgTkVUX1ZFTkRPUl9TSUxBTgorCWJvb2wgIlNpbGFuIGRldmljZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcywgc2F5IFkKKwkgIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gZG9lc24ndCBkaXJlY3RseSBhZmZlY3QgdGhlCisJICBrZXJuZWw6IHNheWluZyBOIHdpbGwganVzdCBjYXVzZSB0aGUgY29uZmlndXJhdG9yIHRvIHNraXAgYWxsCisJICB0aGUgcXVlc3Rpb25zIGFib3V0IFNpbGFuIGRldmljZXMuIElmIHlvdSBzYXkgWSwgeW91IHdpbGwgYmUgYXNrZWQgZm9yCisJICB5b3VyIHNwZWNpZmljIGNhcmQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCisKK2lmIE5FVF9WRU5ET1JfU0lMQU4KKworY29uZmlnIFNDOTIwMzEKKwl0cmlzdGF0ZSAiU2lsYW4gU0M5MjAzMSBQQ0kgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIGRyaXZlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgRmFzdCBFdGhlcm5ldCBQQ0kgbmV0d29yayBjYXJkcyBiYXNlZCBvbgorCSAgdGhlIFNpbGFuIFNDOTIwMzEgY2hpcCAoc29tZXRpbWVzIGFsc28gY2FsbGVkIFJzbHRlayA4MTM5RCkuIElmIHlvdQorCSAgaGF2ZSBvbmUgb2YgdGhlc2UsIHNheSBZIGhlcmUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNjOTIwMzEuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitlbmRpZiAjIE5FVF9WRU5ET1JfU0lMQU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NpbGFuL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lsYW4vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkMzUyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NpbGFuL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIFNpbGFuIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19TQzkyMDMxKSArPSBzYzkyMDMxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvc2M5MjAzMS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lsYW4vc2M5MjAzMS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrL3NjOTIwMzEuYwpyZW5hbWUgdG8gZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lsYW4vc2M5MjAzMS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5NDIwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5NDIwLmMKaW5kZXggNGYxNTY4MC4uZWRiMjRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTQyMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzk0MjAuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgInNtc2M5NDIwLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9LY29uZmlnCmluZGV4IGFjNmYxOTAuLjIyNzQ1ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvS2NvbmZpZwpAQCAtMjksMTUgKzI5LDYgQEAKIAkgIEJ5IGRlZmF1bHQsIHRoZSBETUEgYXJiaXRyYXRpb24gc2NoZW1lIGlzIGJhc2VkIG9uIFJvdW5kLXJvYmluCiAJICAocng6dHggcHJpb3JpdHkgaXMgMToxKS4KIAotY29uZmlnIFNUTU1BQ19EVUFMX01BQwotCWJvb2wgIlNUTU1BQzogZHVhbCBtYWMgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZWZhdWx0IG4KLSAgICAgICAgZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgU1RNTUFDX0VUSCAmJiAhU1RNTUFDX1RJTUVSCi0JLS0taGVscC0tLQotCSAgU29tZSBTVCBTb0NzIChmb3IgZXhhbXBsZSB0aGUgc3R4NzE0MSBhbmQgc3R4NzIwMGMyKSBoYXZlIHR3bwotCSAgRXRoZXJuZXQgQ29udHJvbGxlcnMuIFRoaXMgb3B0aW9uIHR1cm5zIG9uIHRoZSBzZWNvbmQgRXRoZXJuZXQKLQkgIGRldmljZSBvbiB0aGlzIGtpbmQgb2YgcGxhdGZvcm1zLgotCiBjb25maWcgU1RNTUFDX1RJTUVSCiAJYm9vbCAiU1RNTUFDIFRpbWVyIG9wdGltaXNhdGlvbiIKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMKaW5kZXggZGRiMzNjZi4uN2JmMWUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMKQEAgLTE2NzQsNiArMTY3NCw5IEBACiAJaW50IHJlc3VsdDsKIAogCXByX2RlYnVnKCIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwl1ZGJnX3NodXRkb3duX3BzM2dlbGljKCk7CisKIAlyZXN1bHQgPSBwczNfb3Blbl9odl9kZXZpY2UoZGV2KTsKIAogCWlmIChyZXN1bHQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmgKaW5kZXggZDNmYWRmYi4uYTkzZGY2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmgKQEAgLTM1OSw2ICszNTksMTIgQEAKIAlyZXR1cm4gcG9ydC0+cHJpdjsKIH0KIAorI2lmZGVmIENPTkZJR19QUENfRUFSTFlfREVCVUdfUFMzR0VMSUMKK2V4dGVybiB2b2lkIHVkYmdfc2h1dGRvd25fcHMzZ2VsaWModm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHVkYmdfc2h1dGRvd25fcHMzZ2VsaWModm9pZCkge30KKyNlbmRpZgorCiBleHRlcm4gaW50IGdlbGljX2NhcmRfc2V0X2lycV9tYXNrKHN0cnVjdCBnZWxpY19jYXJkICpjYXJkLCB1NjQgbWFzayk7CiAvKiBzaGFyZWQgbmV0ZGV2IG9wcyAqLwogZXh0ZXJuIHZvaWQgZ2VsaWNfY2FyZF91cChzdHJ1Y3QgZ2VsaWNfY2FyZCAqY2FyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvbGxfdGVtYWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L2xsX3RlbWFjX21haW4uYwppbmRleCA0ZDE2NThlLi5jYWYzNjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvbGxfdGVtYWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9sbF90ZW1hY19tYWluLmMKQEAgLTcxNiw4ICs3MTYsOCBAQAogCQljdXJfcCA9ICZscC0+dHhfYmRfdltscC0+dHhfYmRfdGFpbF07CiAJCWN1cl9wLT5waHlzID0gZG1hX21hcF9zaW5nbGUobmRldi0+ZGV2LnBhcmVudCwKIAkJCQkJICAgICBza2JfZnJhZ19hZGRyZXNzKGZyYWcpLAotCQkJCQkgICAgIGZyYWdfc2l6ZShmcmFnKSwgRE1BX1RPX0RFVklDRSk7Ci0JCWN1cl9wLT5sZW4gPSBmcmFnX3NpemUoZnJhZyk7CisJCQkJCSAgICAgc2tiX2ZyYWdfc2l6ZShmcmFnKSwgRE1BX1RPX0RFVklDRSk7CisJCWN1cl9wLT5sZW4gPSBza2JfZnJhZ19zaXplKGZyYWcpOwogCQljdXJfcC0+YXBwMCA9IDA7CiAJCWZyYWcrKzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94c2NhbGUvaXhwNHh4X2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveHNjYWxlL2l4cDR4eF9ldGguYwppbmRleCBlYzk2ZDkxLi5mNDVjODVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94c2NhbGUvaXhwNHh4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hzY2FsZS9peHA0eHhfZXRoLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wdHBfY2xhc3NpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWFjaC9peHA0NnhfdHMuaD4KICNpbmNsdWRlIDxtYWNoL25wZS5oPgogI2luY2x1ZGUgPG1hY2gvcW1nci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnIGIvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnCmluZGV4IGE0MGZhYjQuLmQ0MjNkMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9pcmRhL0tjb25maWcKQEAgLTMxNCw3ICszMTQsNyBAQAogCiBjb25maWcgQVUxMDAwX0ZJUgogCXRyaXN0YXRlICJBbGNoZW15IEF1MTAwMCBTSVIvRklSIgotCWRlcGVuZHMgb24gU09DX0FVMTAwMCAmJiBJUkRBCisJZGVwZW5kcyBvbiBJUkRBICYmIE1JUFNfQUxDSEVNWQogCiBjb25maWcgU01DX0lSQ0NfRklSCiAJdHJpc3RhdGUgIlNNU0MgSXJDQyAoRVhQRVJJTUVOVEFMKSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY3ZsYW4uYyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwppbmRleCBhM2NlM2Q0Li43NDEzNDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjdmxhbi5jCkBAIC0xOTIsNiArMTkyLDEzIEBACiAJCQkgKi8KIAkJCW1hY3ZsYW5fYnJvYWRjYXN0KHNrYiwgcG9ydCwgc3JjLT5kZXYsCiAJCQkJCSAgTUFDVkxBTl9NT0RFX1ZFUEEpOworCQllbHNlIHsKKwkJCS8qIGZvcndhcmQgdG8gb3JpZ2luYWwgcG9ydC4gKi8KKwkJCXZsYW4gPSBzcmM7CisJCQlyZXQgPSBtYWN2bGFuX2Jyb2FkY2FzdF9vbmUoc2tiLCB2bGFuLCBldGgsIDApOworCQkJZ290byBvdXQ7CisJCX0KKwogCQlyZXR1cm4gUlhfSEFORExFUl9QQVNTOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3JlYWx0ZWsuYyBiL2RyaXZlcnMvbmV0L3BoeS9yZWFsdGVrLmMKaW5kZXggYTRlYWU3NS4uZjQxNGZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3JlYWx0ZWsuYworKysgYi9kcml2ZXJzL25ldC9waHkvcmVhbHRlay5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKgogICovCiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgUlRMODIxeF9QSFlTUgkJMHgxMQogI2RlZmluZSBSVEw4MjF4X1BIWVNSX0RVUExFWAkweDIwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Jpb25ldC5jIGIvZHJpdmVycy9uZXQvcmlvbmV0LmMKaW5kZXggM2JiMTMxMS4uNzE0NTcxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcmlvbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvcmlvbmV0LmMKQEAgLTg4LDggKzg4LDggQEAKICNkZWZpbmUgZGV2X3Jpb25ldF9jYXBhYmxlKGRldikgXAogCWlzX3Jpb25ldF9jYXBhYmxlKGRldi0+c3JjX29wcywgZGV2LT5kc3Rfb3BzKQogCi0jZGVmaW5lIFJJT05FVF9NQUNfTUFUQ0goeCkJKCoodTMyICopeCA9PSAweDAwMDEwMDAxKQotI2RlZmluZSBSSU9ORVRfR0VUX0RFU1RJRCh4KQkoKih1MTYgKikoeCArIDQpKQorI2RlZmluZSBSSU9ORVRfTUFDX01BVENIKHgpCSghbWVtY21wKCh4KSwgIlwwMFwwMVwwMFwwMSIsIDQpKQorI2RlZmluZSBSSU9ORVRfR0VUX0RFU1RJRCh4KQkoKCooKHU4ICopeCArIDQpIDw8IDgpIHwgKigodTggKil4ICsgNSkpCiAKIHN0YXRpYyBpbnQgcmlvbmV0X3J4X2NsZWFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2xnLXZsNjAwLmMgYi9kcml2ZXJzL25ldC91c2IvbGctdmw2MDAuYwppbmRleCAxZTcyMjE5Li5kNDNkYjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvbGctdmw2MDAuYworKysgYi9kcml2ZXJzL25ldC91c2IvbGctdmw2MDAuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKgogICogVGhlIGRldmljZSBoYXMgYSBDREMgQUNNIHBvcnQgZm9yIG1vZGVtIGNvbnRyb2wgKGl0IGNsYWltcyB0byBiZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jIGIvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCmluZGV4IDdkNjA4MjEuLmZhZTBmYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYworKysgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKQEAgLTEwNTcsNyArMTA1Nyw4IEBACiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJaW50IHJldHZhbDsKIAotCXNrYl90eF90aW1lc3RhbXAoc2tiKTsKKwlpZiAoc2tiKQorCQlza2JfdHhfdGltZXN0YW1wKHNrYik7CiAKIAkvLyBzb21lIGRldmljZXMgd2FudCBmdW5reSBVU0ItbGV2ZWwgZnJhbWluZywgZm9yCiAJLy8gd2luMzIgZHJpdmVyICh1c3VhbGx5KSBhbmQvb3IgaGFyZHdhcmUgcXVpcmtzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92ZXRoLmMgYi9kcml2ZXJzL25ldC92ZXRoLmMKaW5kZXggNWIyMzc2Ny4uZWY4ODNlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3ZldGguYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPG5ldC9kc3QuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZldGguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkidmV0aCIKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCA5MTAzOWFiLi42ZWU4NDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC05MjUsMTIgKzkyNSwxMCBAQAogewogCXUxNiB2OwogCi0JaWYgKCF2aXJ0aW9faGFzX2ZlYXR1cmUodmktPnZkZXYsIFZJUlRJT19ORVRfRl9TVEFUVVMpKQotCQlyZXR1cm47Ci0KLQl2aS0+dmRldi0+Y29uZmlnLT5nZXQodmktPnZkZXYsCisJaWYgKHZpcnRpb19jb25maWdfdmFsKHZpLT52ZGV2LCBWSVJUSU9fTkVUX0ZfU1RBVFVTLAogCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHZpcnRpb19uZXRfY29uZmlnLCBzdGF0dXMpLAotCQkJICAgICAgJnYsIHNpemVvZih2KSk7CisJCQkgICAgICAmdikgPCAwKQorCQlyZXR1cm47CiAKIAkvKiBJZ25vcmUgdW5rbm93biAoZnV0dXJlKSBzdGF0dXMgYml0cyAqLwogCXYgJj0gVklSVElPX05FVF9TX0xJTktfVVA7CkBAIC0xMDA2LDExICsxMDA0LDkgQEAKIAl9CiAKIAkvKiBDb25maWd1cmF0aW9uIG1heSBzcGVjaWZ5IHdoYXQgTUFDIHRvIHVzZS4gIE90aGVyd2lzZSByYW5kb20uICovCi0JaWYgKHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJUSU9fTkVUX0ZfTUFDKSkgewotCQl2ZGV2LT5jb25maWctPmdldCh2ZGV2LAorCWlmICh2aXJ0aW9fY29uZmlnX3ZhbF9sZW4odmRldiwgVklSVElPX05FVF9GX01BQywKIAkJCQkgIG9mZnNldG9mKHN0cnVjdCB2aXJ0aW9fbmV0X2NvbmZpZywgbWFjKSwKLQkJCQkgIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOwotCX0gZWxzZQorCQkJCSAgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbikgPCAwKQogCQlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKIAogCS8qIFNldCB1cCBvdXIgZGV2aWNlLXNwZWNpZmljIGluZm9ybWF0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKaW5kZXggYjc3MWViYS4uZDk2YmZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYwpAQCAtMjQsNiArMjQsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogCiAjaW5jbHVkZSAidm14bmV0M19pbnQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vY29udHJvbC5jCmluZGV4IDcyN2Q3MjguLjJmZWEwMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2NvbnRyb2wuYwpAQCAtNzgsNiArNzgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93aW1heC9pMjQwMG0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAKICNkZWZpbmUgRF9TVUJNT0RVTEUgY29udHJvbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kZWJ1Z2ZzLmMKaW5kZXggOWM3MGI1Zi4uMTI5YmEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWdmcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImkyNDAwbS5oIgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2Z3LmMKaW5kZXggODVkYWRkNS4uN2NiZDdkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2Z3LmMKQEAgLTE1OCw2ICsxNTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImkyNDAwbS5oIgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9uZXRkZXYuYwppbmRleCAyZWRkOGZlLi42NGExMTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL25ldGRldi5jCkBAIC03Niw2ICs3Niw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJpMjQwMG0uaCIKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vcnguYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9yeC5jCmluZGV4IDJmOTRhODcuLjM3YmVjZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9yeC5jCkBAIC0xNDksNiArMTQ5LDggQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgImkyNDAwbS5oIgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby5jCmluZGV4IGJlNDI4Y2EuLjIxYTllZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8uYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KICNpbmNsdWRlICJpMjQwMG0tc2Rpby5oIgogI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2kyNDAwbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERfU1VCTU9EVUxFIG1haW4KICNpbmNsdWRlICJzZGlvLWRlYnVnLWxldmVscy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdHguYwppbmRleCA0YjMwZWQxLi40YjllY2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdHguYworKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdHguYwpAQCAtMjQ1LDYgKzI0NSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaTI0MDBtLmgiCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jCmluZGV4IDlhNjQ0ZDAuLjJjMWI4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2IuYworKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMKQEAgLTY3LDYgKzY3LDcgQEAKICNpbmNsdWRlIDxsaW51eC93aW1heC9pMjQwMG0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAKICNkZWZpbmUgRF9TVUJNT0RVTEUgdXNiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCmluZGV4IDBhMzA0YjAuLjk4ZGI3NjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQpAQCAtNDIsNyArNDIsNyBAQAogb2JqLSQoQ09ORklHX01XTDhLKQkrPSBtd2w4ay5vCiAKIG9iai0kKENPTkZJR19JV0xXSUZJKQkrPSBpd2x3aWZpLwotb2JqLSQoQ09ORklHX0lXTFdJRklfTEVHQUNZKQkrPSBpd2xlZ2FjeS8KK29iai0kKENPTkZJR19JV0xFR0FDWSkJKz0gaXdsZWdhY3kvCiBvYmotJChDT05GSUdfUlQyWDAwKQkrPSBydDJ4MDAvCiAKIG9iai0kKENPTkZJR19QNTRfQ09NTU9OKQkrPSBwNTQvCkBAIC01OCw2ICs1OCw2IEBACiBvYmotJChDT05GSUdfSVdNKQkrPSBpd21jMzIwMHdpZmkvCiAKIG9iai0kKENPTkZJR19NV0lGSUVYKQkrPSBtd2lmaWV4Lwotb2JqLSQoQ09ORklHX0JSQ01GTUFDKSArPSBicmNtODAyMTEvCi1vYmotJChDT05GSUdfQlJDTVVNQUMpICs9IGJyY204MDIxMS8KLW9iai0kKENPTkZJR19CUkNNU01BQykgKz0gYnJjbTgwMjExLworCitvYmotJChDT05GSUdfQlJDTUZNQUMpCSs9IGJyY204MDIxMS8KK29iai0kKENPTkZJR19CUkNNU01BQykJKz0gYnJjbTgwMjExLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5jCmluZGV4IDNiNzUyZDkuLmY1Y2U1NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FkbTgyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hZG04MjExLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvZWVwcm9tXzkzY3g2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJhZG04MjExLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdDc2YzUweC11c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jCmluZGV4IDM5MzIyZDQuLjQwNDVlNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAkJZ290byBleGl0OwogCiAJd2hpbGUgKGxlbi0tKSB7Ci0JCW9idWYgPSBwYWNrX2hleF9ieXRlKG9idWYsICppYnVmKyspOworCQlvYnVmID0gaGV4X2J5dGVfcGFjayhvYnVmLCAqaWJ1ZisrKTsKIAkJKm9idWYrKyA9ICctJzsKIAl9CiAJb2J1Zi0tOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvS2NvbmZpZwppbmRleCAwNzM1NDg4Li4wOTYwMjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIG1lbnVjb25maWcgQVRIX0NPTU1PTgogCXRyaXN0YXRlICJBdGhlcm9zIFdpcmVsZXNzIENhcmRzIgotCWRlcGVuZHMgb24gQ0ZHODAyMTEKKwlkZXBlbmRzIG9uIENGRzgwMjExICYmICghVU1MIHx8IEJST0tFTikKIAktLS1oZWxwLS0tCiAJICBUaGlzIHdpbGwgZW5hYmxlIHRoZSBzdXBwb3J0IGZvciB0aGUgQXRoZXJvcyB3aXJlbGVzcyBkcml2ZXJzLgogCSAgYXRoNWssIGF0aDlrLCBhdGg5a19odGMgYW5kIGFyOTE3MCBkcml2ZXJzIHNoYXJlIHNvbWUgY29tbW9uIGNvZGUsIHRoaXMgb3B0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmgKaW5kZXggOTA4ZmRiYy4uNDU5NmMzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGguaApAQCAtMTczLDggKzE3Myw3IEBACiB2b2lkIGF0aF9od19jeWNsZV9jb3VudGVyc191cGRhdGUoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbik7CiBpbnQzMl90IGF0aF9od19nZXRfbGlzdGVuX3RpbWUoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbik7CiAKLWV4dGVybiBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKQotdm9pZCBhdGhfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykgdm9pZCBhdGhfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKICNkZWZpbmUgX2F0aF9wcmludGsobGV2ZWwsIGNvbW1vbiwgZm10LCAuLi4pCQkJXAogZG8gewkJCQkJCQkJXApAQCAtMjQwLDYgKzIzOSw3IEBACiAJQVRIX0RCR19CVENPRVgJCT0gMHgwMDAwMjAwMCwKIAlBVEhfREJHX1dNSQkJPSAweDAwMDA0MDAwLAogCUFUSF9EQkdfQlNUVUNLCQk9IDB4MDAwMDgwMDAsCisJQVRIX0RCR19NQ0kJCT0gMHgwMDAxMDAwMCwKIAlBVEhfREJHX0FOWQkJPSAweGZmZmZmZmZmCiB9OwogCkBAIC0yNTgsNyArMjU4LDcgQEAKIAogI2Vsc2UKIAotc3RhdGljIGlubGluZSAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKK3N0YXRpYyBpbmxpbmUgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQogdm9pZCBhdGhfZGJnKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sIGVudW0gQVRIX0RFQlVHIGRiZ19tYXNrLAogCSAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMKaW5kZXggZTViZTdlNzAuLmVlN2VhNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9haGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMKQEAgLTE2Niw3ICsxNjYsOSBAQAogCQlpZiAodG9fcGxhdGZvcm1fZGV2aWNlKGFoLT5kZXYpLT5pZCA9PSAwICYmCiAJCSAgICAoYmNmZy0+Y29uZmlnLT5mbGFncyAmIChCRF9XTEFOMCB8IEJEX1dMQU4xKSkgPT0KIAkJICAgICAoQkRfV0xBTjEgfCBCRF9XTEFOMCkpCi0JCQlfX3NldF9iaXQoQVRIX1NUQVRfMkdfRElTQUJMRUQsIGFoLT5zdGF0dXMpOworCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbmVlZHNfMkdIel9vdnIgPSB0cnVlOworCQllbHNlCisJCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9uZWVkc18yR0h6X292ciA9IGZhbHNlOwogCX0KIAogCXJldCA9IGF0aDVrX2luaXRfYWgoYWgsICZhdGhfYWhiX2J1c19vcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jCmluZGV4IGJlYTkwZTYuLmJmNjc0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hbmkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmMKQEAgLTI3LDE1ICsyNywyMSBAQAogICogb3IgcmVkdWNpbmcgc2Vuc2l0aXZpdHkgYXMgbmVjZXNzYXJ5LgogICoKICAqIFRoZSBwYXJhbWV0ZXJzIGFyZToKKyAqCiAgKiAgIC0gIm5vaXNlIGltbXVuaXR5IgorICoKICAqICAgLSAic3B1ciBpbW11bml0eSIKKyAqCiAgKiAgIC0gImZpcnN0ZXAgbGV2ZWwiCisgKgogICogICAtICJPRkRNIHdlYWsgc2lnbmFsIGRldGVjdGlvbiIKKyAqCiAgKiAgIC0gIkNDSyB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24iCiAgKgogICogQmFzaWNhbGx5IHdlIGxvb2sgYXQgdGhlIGFtb3VudCBvZiBPREZNIGFuZCBDQ0sgdGltaW5nIGVycm9ycyB3ZSBnZXQgYW5kIHRoZW4KICAqIHJhaXNlIG9yIGxvd2VyIGltbXVuaXR5IGFjY29yZGluZ2x5IGJ5IHNldHRpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UKICAqIHBhcmFtZXRlcnMuCisgKgogICogTmV3ZXIgY2hpcHNldHMgaGF2ZSBQSFkgZXJyb3IgY291bnRlcnMgaW4gaGFyZHdhcmUgd2hpY2ggd2lsbCBnZW5lcmF0ZSBhIE1JQgogICogaW50ZXJydXB0IHdoZW4gdGhleSBvdmVyZmxvdy4gT2xkZXIgaGFyZHdhcmUgaGFzIHRvbyBlbmFibGUgUEhZIGVycm9yIGZyYW1lcwogICogYnkgc2V0dGluZyBhIFJYIGZsYWcgYW5kIHRoZW4gY291bnQgZXZlcnkgc2luZ2xlIFBIWSBlcnJvci4gV2hlbiBhIHNwZWNpZmllZApAQCAtNDUsMTEgKzUxLDEzIEBACiAgKi8KIAogCi0vKioqIEFOSSBwYXJhbWV0ZXIgY29udHJvbCAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKipcCisqIEFOSSBwYXJhbWV0ZXIgY29udHJvbCAqCitcKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKgogICogYXRoNWtfYW5pX3NldF9ub2lzZV9pbW11bml0eV9sZXZlbCgpIC0gU2V0IG5vaXNlIGltbXVuaXR5IGxldmVsCi0gKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGxldmVsOiBsZXZlbCBiZXR3ZWVuIDAgYW5kIEBBVEg1S19BTklfTUFYX05PSVNFX0lNTV9MVkwKICAqLwogdm9pZApAQCAtOTEsMTIgKzk5LDExIEBACiAJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0FOSSwgIm5ldyBsZXZlbCAlZCIsIGxldmVsKTsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbCgpIC0gU2V0IHNwdXIgaW1tdW5pdHkgbGV2ZWwKLSAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAbGV2ZWw6IGxldmVsIGJldHdlZW4gMCBhbmQgQG1heF9zcHVyX2xldmVsICh0aGUgbWF4aW11bSBsZXZlbCBpcyBkZXBlbmRlbnQKLSAqCW9uIHRoZSBjaGlwIHJldmlzaW9uKS4KKyAqIG9uIHRoZSBjaGlwIHJldmlzaW9uKS4KICAqLwogdm9pZAogYXRoNWtfYW5pX3NldF9zcHVyX2ltbXVuaXR5X2xldmVsKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBsZXZlbCkKQEAgLTExNywxMCArMTI0LDkgQEAKIAlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLCAibmV3IGxldmVsICVkIiwgbGV2ZWwpOwogfQogCi0KIC8qKgogICogYXRoNWtfYW5pX3NldF9maXJzdGVwX2xldmVsKCkgLSBTZXQgImZpcnN0ZXAiIGxldmVsCi0gKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGxldmVsOiBsZXZlbCBiZXR3ZWVuIDAgYW5kIEBBVEg1S19BTklfTUFYX0ZJUlNURVBfTFZMCiAgKi8KIHZvaWQKQEAgLTE0MCwxMSArMTQ2LDkgQEAKIAlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLCAibmV3IGxldmVsICVkIiwgbGV2ZWwpOwogfQogCi0KIC8qKgotICogYXRoNWtfYW5pX3NldF9vZmRtX3dlYWtfc2lnbmFsX2RldGVjdGlvbigpIC0gQ29udHJvbCBPRkRNIHdlYWsgc2lnbmFsCi0gKgkJCQkJCWRldGVjdGlvbgotICoKKyAqIGF0aDVrX2FuaV9zZXRfb2ZkbV93ZWFrX3NpZ25hbF9kZXRlY3Rpb24oKSAtIFNldCBPRkRNIHdlYWsgc2lnbmFsIGRldGVjdGlvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQG9uOiB0dXJuIG9uIG9yIG9mZgogICovCiB2b2lkCkBAIC0xODIsMTAgKzE4Niw5IEBACiAJCQkgIG9uID8gIm9uIiA6ICJvZmYiKTsKIH0KIAotCiAvKioKLSAqIGF0aDVrX2FuaV9zZXRfY2NrX3dlYWtfc2lnbmFsX2RldGVjdGlvbigpIC0gY29udHJvbCBDQ0sgd2VhayBzaWduYWwgZGV0ZWN0aW9uCi0gKgorICogYXRoNWtfYW5pX3NldF9jY2tfd2Vha19zaWduYWxfZGV0ZWN0aW9uKCkgLSBTZXQgQ0NLIHdlYWsgc2lnbmFsIGRldGVjdGlvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQG9uOiB0dXJuIG9uIG9yIG9mZgogICovCiB2b2lkCkBAIC0yMDAsMTMgKzIwMywxNiBAQAogfQogCiAKLS8qKiogQU5JIGFsZ29yaXRobSAqKiovCisvKioqKioqKioqKioqKioqXAorKiBBTkkgYWxnb3JpdGhtICoKK1wqKioqKioqKioqKioqKiovCiAKIC8qKgogICogYXRoNWtfYW5pX3JhaXNlX2ltbXVuaXR5KCkgLSBJbmNyZWFzZSBub2lzZSBpbW11bml0eQotICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhczogVGhlICZzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlCiAgKiBAb2ZkbV90cmlnZ2VyOiBJZiB0aGlzIGlzIHRydWUgd2UgYXJlIGNhbGxlZCBiZWNhdXNlIG9mIHRvbyBtYW55IE9GRE0gZXJyb3JzLAotICoJdGhlIGFsZ29yaXRobSB3aWxsIHR1bmUgbW9yZSBwYXJhbWV0ZXJzIHRoZW4uCisgKiB0aGUgYWxnb3JpdGhtIHdpbGwgdHVuZSBtb3JlIHBhcmFtZXRlcnMgdGhlbi4KICAqCiAgKiBUcnkgdG8gcmFpc2Ugbm9pc2UgaW1tdW5pdHkgKD1kZWNyZWFzZSBzZW5zaXRpdml0eSkgaW4gc2V2ZXJhbCBzdGVwcwogICogZGVwZW5kaW5nIG9uIHRoZSBhdmVyYWdlIFJTU0kgb2YgdGhlIGJlYWNvbnMgd2UgcmVjZWl2ZWQuCkBAIC0yOTAsOSArMjk2LDEwIEBACiAJKi8KIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9sb3dlcl9pbW11bml0eSgpIC0gRGVjcmVhc2Ugbm9pc2UgaW1tdW5pdHkKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhczogVGhlICZzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlCiAgKgogICogVHJ5IHRvIGxvd2VyIG5vaXNlIGltbXVuaXR5ICg9aW5jcmVhc2Ugc2Vuc2l0aXZpdHkpIGluIHNldmVyYWwgc3RlcHMKICAqIGRlcGVuZGluZyBvbiB0aGUgYXZlcmFnZSBSU1NJIG9mIHRoZSBiZWFjb25zIHdlIHJlY2VpdmVkLgpAQCAtMzUyLDkgKzM1OSwxMCBAQAogCX0KIH0KIAotCiAvKioKICAqIGF0aDVrX2h3X2FuaV9nZXRfbGlzdGVuX3RpbWUoKSAtIFVwZGF0ZSBjb3VudGVycyBhbmQgcmV0dXJuIGxpc3RlbmluZyB0aW1lCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAYXM6IFRoZSAmc3RydWN0IGF0aDVrX2FuaV9zdGF0ZQogICoKICAqIFJldHVybiBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSB0aW1lIHNwZW50ICJsaXN0ZW5pbmciIGluIG1pbGxpc2Vjb25kcyAobXMpCiAgKiBzaW5jZSB0aGUgbGFzdCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uCkBAIC0zNzksOSArMzg3LDEwIEBACiAJcmV0dXJuIGxpc3RlbjsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9zYXZlX2FuZF9jbGVhcl9waHlfZXJyb3JzKCkgLSBDbGVhciBhbmQgc2F2ZSBQSFkgZXJyb3IgY291bnRlcnMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhczogVGhlICZzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlCiAgKgogICogQ2xlYXIgdGhlIFBIWSBlcnJvciBjb3VudGVycyBhcyBzb29uIGFzIHBvc3NpYmxlLCBzaW5jZSB0aGlzIG1pZ2h0IGJlIGNhbGxlZAogICogZnJvbSBhIE1JQiBpbnRlcnJ1cHQgYW5kIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGdldCBpbnRlcnJ1cHRlZCBhZ2Fpbi4KQEAgLTQyOSwxNCArNDM4LDE0IEBACiAJcmV0dXJuIDE7CiB9CiAKLQogLyoqCiAgKiBhdGg1a19hbmlfcGVyaW9kX3Jlc3RhcnQoKSAtIFJlc3RhcnQgQU5JIHBlcmlvZAorICogQGFzOiBUaGUgJnN0cnVjdCBhdGg1a19hbmlfc3RhdGUKICAqCiAgKiBKdXN0IHJlc2V0IGNvdW50ZXJzLCBzbyB0aGV5IGFyZSBjbGVhciBmb3IgdGhlIG5leHQgImFuaSBwZXJpb2QiLgogICovCiBzdGF0aWMgdm9pZAotYXRoNWtfYW5pX3BlcmlvZF9yZXN0YXJ0KHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzKQorYXRoNWtfYW5pX3BlcmlvZF9yZXN0YXJ0KHN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzKQogewogCS8qIGtlZXAgbGFzdCB2YWx1ZXMgZm9yIGRlYnVnZ2luZyAqLwogCWFzLT5sYXN0X29mZG1fZXJyb3JzID0gYXMtPm9mZG1fZXJyb3JzOwpAQCAtNDQ4LDkgKzQ1Nyw5IEBACiAJYXMtPmxpc3Rlbl90aW1lID0gMDsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9jYWxpYnJhdGlvbigpIC0gVGhlIG1haW4gQU5JIGNhbGlicmF0aW9uIGZ1bmN0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogV2UgY291bnQgT0ZETSBhbmQgQ0NLIGVycm9ycyByZWxhdGl2ZSB0byB0aGUgdGltZSB3aGVyZSB3ZSBkaWQgbm90IHNlbmQgb3IKICAqIHJlY2VpdmUgKCJsaXN0ZW4iIHRpbWUpIGFuZCByYWlzZSBvciBsb3dlciBpbW11bml0eSBhY2NvcmRpbmdseS4KQEAgLTQ5Miw3ICs1MDEsNyBAQAogCQkvKiB0b28gbWFueSBQSFkgZXJyb3JzIC0gd2UgaGF2ZSB0byByYWlzZSBpbW11bml0eSAqLwogCQlib29sIG9mZG1fZmxhZyA9IGFzLT5vZmRtX2Vycm9ycyA+IG9mZG1faGlnaCA/IHRydWUgOiBmYWxzZTsKIAkJYXRoNWtfYW5pX3JhaXNlX2ltbXVuaXR5KGFoLCBhcywgb2ZkbV9mbGFnKTsKLQkJYXRoNWtfYW5pX3BlcmlvZF9yZXN0YXJ0KGFoLCBhcyk7CisJCWF0aDVrX2FuaV9wZXJpb2RfcmVzdGFydChhcyk7CiAKIAl9IGVsc2UgaWYgKGFzLT5saXN0ZW5fdGltZSA+IDUgKiBBVEg1S19BTklfTElTVEVOX1BFUklPRCkgewogCQkvKiBJZiBtb3JlIHRoYW4gNSAoVE9ETzogd2h5IDU/KSBwZXJpb2RzIGhhdmUgcGFzc2VkIGFuZCB3ZSBnb3QKQEAgLTUwNCwxNSArNTEzLDE4IEBACiAJCWlmIChhcy0+b2ZkbV9lcnJvcnMgPD0gb2ZkbV9sb3cgJiYgYXMtPmNja19lcnJvcnMgPD0gY2NrX2xvdykKIAkJCWF0aDVrX2FuaV9sb3dlcl9pbW11bml0eShhaCwgYXMpOwogCi0JCWF0aDVrX2FuaV9wZXJpb2RfcmVzdGFydChhaCwgYXMpOworCQlhdGg1a19hbmlfcGVyaW9kX3Jlc3RhcnQoYXMpOwogCX0KIH0KIAogCi0vKioqIElOVEVSUlVQVCBIQU5ETEVSICoqKi8KKy8qKioqKioqKioqKioqKioqKioqXAorKiBJbnRlcnJ1cHQgaGFuZGxlciAqCitcKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCiAgKiBhdGg1a19hbmlfbWliX2ludHIoKSAtIEludGVycnVwdCBoYW5kbGVyIGZvciBBTkkgTUlCIGNvdW50ZXJzCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogSnVzdCByZWFkICYgcmVzZXQgdGhlIHJlZ2lzdGVycyBxdWlja2x5LCBzbyB0aGV5IGRvbid0IGdlbmVyYXRlIG1vcmUKICAqIGludGVycnVwdHMsIHNhdmUgdGhlIGNvdW50ZXJzIGFuZCBzY2hlZHVsZSB0aGUgdGFza2xldCB0byBkZWNpZGUgd2hldGhlcgpAQCAtNTQ5LDkgKzU2MSwxMSBAQAogCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YW5pX3Rhc2tsZXQpOwogfQogCi0KIC8qKgotICogYXRoNWtfYW5pX3BoeV9lcnJvcl9yZXBvcnQoKSAtIFVzZWQgYnkgb2xkZXIgSFcgdG8gcmVwb3J0IFBIWSBlcnJvcnMKKyAqIGF0aDVrX2FuaV9waHlfZXJyb3JfcmVwb3J0IC0gVXNlZCBieSBvbGRlciBIVyB0byByZXBvcnQgUEhZIGVycm9ycworICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBwaHllcnI6IE9uZSBvZiBlbnVtIGF0aDVrX3BoeV9lcnJvcl9jb2RlCiAgKgogICogVGhpcyBpcyB1c2VkIGJ5IGhhcmR3YXJlIHdpdGhvdXQgUEhZIGVycm9yIGNvdW50ZXJzIHRvIHJlcG9ydCBQSFkgZXJyb3JzCiAgKiBvbiBhIGZyYW1lLWJ5LWZyYW1lIGJhc2lzLCBpbnN0ZWFkIG9mIHRoZSBpbnRlcnJ1cHQuCkBAIC01NzQsMTAgKzU4OCwxMyBAQAogfQogCiAKLS8qKiogSU5JVCAqKiovCisvKioqKioqKioqKioqKioqKlwKKyogSW5pdGlhbGl6YXRpb24gKgorXCoqKioqKioqKioqKioqKiovCiAKIC8qKgogICogYXRoNWtfZW5hYmxlX3BoeV9lcnJfY291bnRlcnMoKSAtIEVuYWJsZSBQSFkgZXJyb3IgY291bnRlcnMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBFbmFibGUgUEhZIGVycm9yIGNvdW50ZXJzIGZvciBPRkRNIGFuZCBDQ0sgdGltaW5nIGVycm9ycy4KICAqLwpAQCAtNTk2LDkgKzYxMyw5IEBACiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX0NDS19GSUxfQ05UKTsKIH0KIAotCiAvKioKICAqIGF0aDVrX2Rpc2FibGVfcGh5X2Vycl9jb3VudGVycygpIC0gRGlzYWJsZSBQSFkgZXJyb3IgY291bnRlcnMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBEaXNhYmxlIFBIWSBlcnJvciBjb3VudGVycyBmb3IgT0ZETSBhbmQgQ0NLIHRpbWluZyBlcnJvcnMuCiAgKi8KQEAgLTYxNSwxMCArNjMyLDEwIEBACiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX0NDS19GSUxfQ05UKTsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9pbml0KCkgLSBJbml0aWFsaXplIEFOSQotICogQG1vZGU6IFdoaWNoIG1vZGUgdG8gdXNlIChhdXRvLCBtYW51YWwgaGlnaCwgbWFudWFsIGxvdywgb2ZmKQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2FuaV9tb2RlCiAgKgogICogSW5pdGlhbGl6ZSBBTkkgYWNjb3JkaW5nIHRvIG1vZGUuCiAgKi8KQEAgLTY5NSwxMCArNzEyLDE4IEBACiB9CiAKIAotLyoqKiBERUJVRyAqKiovCisvKioqKioqKioqKioqKipcCisqIERlYnVnIG91dHB1dCAqCitcKioqKioqKioqKioqKiovCiAKICNpZmRlZiBDT05GSUdfQVRINUtfREVCVUcKIAorLyoqCisgKiBhdGg1a19hbmlfcHJpbnRfY291bnRlcnMoKSAtIFByaW50IEFOSSBjb3VudGVycworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIFVzZWQgZm9yIGRlYnVnZ2luZyBBTkkKKyAqLwogdm9pZAogYXRoNWtfYW5pX3ByaW50X2NvdW50ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmgKaW5kZXggNzM1OGI2Yy4uMjFhYTM1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hbmkuaApAQCAtNDAsMTMgKzQwLDEzIEBACiAgKiBlbnVtIGF0aDVrX2FuaV9tb2RlIC0gbW9kZSBmb3IgQU5JIC8gbm9pc2Ugc2Vuc2l0aXZpdHkKICAqCiAgKiBAQVRINUtfQU5JX01PREVfT0ZGOiBUdXJuIEFOSSBvZmYuIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byBqdXN0IHN0b3AgdGhlIEFOSQotICoJYWxnb3JpdGhtIGFmdGVyIGl0IGhhcyBiZWVuIG9uIGF1dG8gbW9kZS4KLSAqIEFUSDVLX0FOSV9NT0RFX01BTlVBTF9MT1c6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBsb3csCi0gKgltYXhpbWl6aW5nIHNlbnNpdGl2aXR5LiBBTkkgd2lsbCBub3QgcnVuLgotICogQVRINUtfQU5JX01PREVfTUFOVUFMX0hJR0g6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBoaWdoLAotICoJbWluaW1pemluZyBzZW5zaXRpdml0eS4gQU5JIHdpbGwgbm90IHJ1bi4KLSAqIEFUSDVLX0FOSV9NT0RFX0FVVE86IEF1dG9tYXRpY2FsbHkgY29udHJvbCBpbW11bml0eSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZQotICoJYW1vdW50IG9mIE9GRE0gYW5kIENDSyBmcmFtZSBlcnJvcnMgKGRlZmF1bHQpLgorICoJCQlhbGdvcml0aG0gYWZ0ZXIgaXQgaGFzIGJlZW4gb24gYXV0byBtb2RlLgorICogQEFUSDVLX0FOSV9NT0RFX01BTlVBTF9MT1c6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBsb3csCisgKgkJCW1heGltaXppbmcgc2Vuc2l0aXZpdHkuIEFOSSB3aWxsIG5vdCBydW4uCisgKiBAQVRINUtfQU5JX01PREVfTUFOVUFMX0hJR0g6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBoaWdoLAorICoJCQltaW5pbWl6aW5nIHNlbnNpdGl2aXR5LiBBTkkgd2lsbCBub3QgcnVuLgorICogQEFUSDVLX0FOSV9NT0RFX0FVVE86IEF1dG9tYXRpY2FsbHkgY29udHJvbCBpbW11bml0eSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZQorICoJCQlhbW91bnQgb2YgT0ZETSBhbmQgQ0NLIGZyYW1lIGVycm9ycyAoZGVmYXVsdCkuCiAgKi8KIGVudW0gYXRoNWtfYW5pX21vZGUgewogCUFUSDVLX0FOSV9NT0RFX09GRgkJPSAwLApAQCAtNTgsOCArNTgsMjIgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlIC0gQU5JIHN0YXRlIGFuZCBhc3NvY2lhdGVkIGNvdW50ZXJzCi0gKgotICogQG1heF9zcHVyX2xldmVsOiB0aGUgbWF4aW11bSBzcHVyIGxldmVsIGlzIGNoaXAgZGVwZW5kZW50CisgKiBAYW5pX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2FuaV9tb2RlCisgKiBAbm9pc2VfaW1tX2xldmVsOiBOb2lzZSBpbW11bml0eSBsZXZlbAorICogQHNwdXJfbGV2ZWw6IFNwdXIgaW1tdW5pdHkgbGV2ZWwKKyAqIEBmaXJzdGVwX2xldmVsOiBGSVJzdGVwIGxldmVsCisgKiBAb2ZkbV93ZWFrX3NpZzogT0ZETSB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gc3RhdGUgKG9uL29mZikKKyAqIEBjY2tfd2Vha19zaWc6IENDSyB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gc3RhdGUgKG9uL29mZikKKyAqIEBtYXhfc3B1cl9sZXZlbDogTWF4IHNwdXIgaW1tdW5pdHkgbGV2ZWwgKGNoaXAgc3BlY2lmaWMpCisgKiBAbGlzdGVuX3RpbWU6IExpc3RlbiB0aW1lCisgKiBAb2ZkbV9lcnJvcnM6IE9GRE0gdGltaW5nIGVycm9yIGNvdW50CisgKiBAY2NrX2Vycm9yczogQ0NLIHRpbWluZyBlcnJvciBjb3VudAorICogQGxhc3RfY2M6IFRoZSAmc3RydWN0IGF0aF9jeWNsZV9jb3VudGVycyAoZm9yIHN0YXRzKQorICogQGxhc3RfbGlzdGVuOiBMaXN0ZW4gdGltZSBmcm9tIHByZXZpb3VzIHJ1biAoZm9yIHN0YXRzKQorICogQGxhc3Rfb2ZkbV9lcnJvcnM6IE9GRE0gdGltaW5nIGVycm9yIGNvdW50IGZyb20gcHJldmlvdXMgcnVuIChmb3IgdGF0cykKKyAqIEBsYXN0X2Nja19lcnJvcnM6IENDSyB0aW1pbmcgZXJyb3IgY291bnQgZnJvbSBwcmV2aW91cyBydW4gKGZvciBzdGF0cykKKyAqIEBzdW1fb2ZkbV9lcnJvcnM6IFN1bSBvZiBPRkRNIHRpbWluZyBlcnJvcnMgKGZvciBzdGF0cykKKyAqIEBzdW1fY2NrX2Vycm9yczogU3VtIG9mIGFsbCBDQ0sgdGltaW5nIGVycm9ycyAoZm9yIHN0YXRzKQogICovCiBzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlIHsKIAllbnVtIGF0aDVrX2FuaV9tb2RlCWFuaV9tb2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0aDVrLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAppbmRleCBmZWNiY2Q5Li5lNTY0ZTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaApAQCAtMTg3LDEwICsxODcsOSBAQAogI2RlZmluZSBBUjVLX1RVTkVfTUFYX1RYUE9XRVIJCQk2MwogI2RlZmluZSBBUjVLX1RVTkVfREVGQVVMVF9UWFBPV0VSCQkyNQogI2RlZmluZSBBUjVLX1RVTkVfVFBDX1RYUE9XRVIJCQlmYWxzZQotI2RlZmluZSBBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0ZVTEwgICAgMTAwMDAgICAvKiAxMCBzZWMgKi8KKyNkZWZpbmUgQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9GVUxMICAgIDYwMDAwICAgLyogNjAgc2VjICovCisjZGVmaW5lCUFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfU0hPUlQJMTAwMDAJLyogMTAgc2VjICovCiAjZGVmaW5lIEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfQU5JCTEwMDAJLyogMSBzZWMgKi8KLSNkZWZpbmUgQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9ORgk2MDAwMAkvKiA2MCBzZWMgKi8KLQogI2RlZmluZSBBVEg1S19UWF9DT01QTEVURV9QT0xMX0lOVAkJMzAwMAkvKiAzIHNlYyAqLwogCiAjZGVmaW5lIEFSNUtfSU5JVF9DQVJSX1NFTlNFX0VOCQkJMQpAQCAtMjYyLDE2ICsyNjEsMzQgQEAKICNkZWZpbmUJQVI1S19BR0NfU0VUVExJTkdfVFVSQk8JCQkzNwogCiAKLS8qIEdFTkVSSUMgQ0hJUFNFVCBERUZJTklUSU9OUyAqLwogCi0vKiBNQUMgQ2hpcHMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogR0VORVJJQyBDSElQU0VUIERFRklOSVRJT05TICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBlbnVtIGF0aDVrX3ZlcnNpb24gLSBNQUMgQ2hpcHMKKyAqIEBBUjVLX0FSNTIxMDogQVI1MjEwIChDcmV0ZSkKKyAqIEBBUjVLX0FSNTIxMTogQVI1MjExIChPYWh1L01hdWkpCisgKiBAQVI1S19BUjUyMTI6IEFSNTIxMiAoVmVuaWNlKSBhbmQgbmV3ZXIKKyAqLwogZW51bSBhdGg1a192ZXJzaW9uIHsKIAlBUjVLX0FSNTIxMAk9IDAsCiAJQVI1S19BUjUyMTEJPSAxLAogCUFSNUtfQVI1MjEyCT0gMiwKIH07CiAKLS8qIFBIWSBDaGlwcyAqLworLyoqCisgKiBlbnVtIGF0aDVrX3JhZGlvIC0gUEhZIENoaXBzCisgKiBAQVI1S19SRjUxMTA6IFJGNTExMCAoRmV6KQorICogQEFSNUtfUkY1MTExOiBSRjUxMTEgKFNvbWJyZXJvKQorICogQEFSNUtfUkY1MTEyOiBSRjIxMTIvNTExMihBKSAoRGVyYnkvRGVyYnkyKQorICogQEFSNUtfUkYyNDEzOiBSRjI0MTMvMjQxNCAoR3JpZmZpbi9HcmlmZmluLUxpdGUpCisgKiBAQVI1S19SRjU0MTM6IFJGNTQxMy81NDE0LzU0MjQgKEVhZ2xlL0NvbmRvcikKKyAqIEBBUjVLX1JGMjMxNjogUkYyMzE1LzIzMTYgKENvYnJhIFNvQykKKyAqIEBBUjVLX1JGMjMxNzogUkYyMzE3IChTcGlkZXIgU29DKQorICogQEFSNUtfUkYyNDI1OiBSRjI0MjUvMjQxNyAoU3dhbi9OYWxsYSkKKyAqLwogZW51bSBhdGg1a19yYWRpbyB7CiAJQVI1S19SRjUxMTAJPSAwLAogCUFSNUtfUkY1MTExCT0gMSwKQEAgLTMwMywxMSArMzIwLDExIEBACiAjZGVmaW5lIEFSNUtfU1JFVl9BUjUyMTNBCTB4NTkgLyogSGFpbmFuICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjI0MTMJMHg3OCAvKiBHcmlmZmluIGxpdGUgKi8KICNkZWZpbmUgQVI1S19TUkVWX0FSMjQxNAkweDcwIC8qIEdyaWZmaW4gKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxNV9SNiAweDg2IC8qIEFQNTEtTGlnaHQgKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxNV9SNyAweDg3IC8qIEFQNTEtRnVsbCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE1X1I2CTB4ODYgLyogQVA1MS1MaWdodCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE1X1I3CTB4ODcgLyogQVA1MS1GdWxsICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MjQJMHg5MCAvKiBDb25kb3IgKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxN19SMSAweDkwIC8qIEFQNjEtTGlnaHQgKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxN19SMiAweDkxIC8qIEFQNjEtRnVsbCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE3X1IxCTB4OTAgLyogQVA2MS1MaWdodCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE3X1IyCTB4OTEgLyogQVA2MS1GdWxsICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MTMJMHhhNCAvKiBFYWdsZSBsaXRlICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MTQJMHhhMCAvKiBFYWdsZSAqLwogI2RlZmluZSBBUjVLX1NSRVZfQVIyNDE1CTB4YjAgLyogVGFsb24gKi8KQEAgLTM0NCwzMiArMzYxLDQwIEBACiAKIC8qIFRPRE8gYWRkIHN1cHBvcnQgdG8gbWFjODAyMTEgZm9yIHZlbmRvci1zcGVjaWZpYyByYXRlcyBhbmQgbW9kZXMgKi8KIAotLyoKKy8qKgorICogRE9DOiBBdGhlcm9zIFhSCisgKgogICogU29tZSBvZiB0aGlzIGluZm9ybWF0aW9uIGlzIGJhc2VkIG9uIERvY3VtZW50YXRpb24gZnJvbToKICAqCiAgKiBodHRwOi8vbWFkd2lmaS1wcm9qZWN0Lm9yZy93aWtpL0NoaXBzZXRGZWF0dXJlcy9TdXBlckFHCiAgKgotICogTW9kdWxhdGlvbiBmb3IgQXRoZXJvcycgZVh0ZW5kZWQgUmFuZ2UgLSByYW5nZSBlbmhhbmNpbmcgZXh0ZW5zaW9uIHRoYXQgaXMKLSAqIHN1cHBvc2VkIHRvIGRvdWJsZSB0aGUgZGlzdGFuY2UgYW4gQXRoZXJvcyBjbGllbnQgZGV2aWNlIGNhbiBrZWVwIGEKLSAqIGNvbm5lY3Rpb24gd2l0aCBhbiBBdGhlcm9zIGFjY2VzcyBwb2ludC4gVGhpcyBpcyBhY2hpZXZlZCBieSBpbmNyZWFzaW5nCi0gKiB0aGUgcmVjZWl2ZXIgc2Vuc2l0aXZpdHkgdXAgdG8sIC0xMDVkQm0sIHdoaWNoIGlzIGFib3V0IDIwZEIgYWJvdmUgd2hhdAotICogdGhlIDgwMi4xMSBzcGVjaWZpY2F0aW9ucyBkZW1hbmQuIEluIGFkZGl0aW9uLCBuZXcgKHByb3ByaWV0YXJ5KSBkYXRhIHJhdGVzCi0gKiBhcmUgaW50cm9kdWNlZDogMywgMiwgMSwgMC41IGFuZCAwLjI1IE1CaXQvcy4KKyAqIEF0aGVyb3MnIGVYdGVuZGVkIFJhbmdlIC0gcmFuZ2UgZW5oYW5jaW5nIGV4dGVuc2lvbiBpcyBhIG1vZHVsYXRpb24gc2NoZW1lCisgKiB0aGF0IGlzIHN1cHBvc2VkIHRvIGRvdWJsZSB0aGUgbGluayBkaXN0YW5jZSBiZXR3ZWVuIGFuIEF0aGVyb3MgWFItZW5hYmxlZAorICogY2xpZW50IGRldmljZSB3aXRoIGFuIEF0aGVyb3MgWFItZW5hYmxlZCBhY2Nlc3MgcG9pbnQuIFRoaXMgaXMgYWNoaWV2ZWQKKyAqIGJ5IGluY3JlYXNpbmcgdGhlIHJlY2VpdmVyIHNlbnNpdGl2aXR5IHVwIHRvLCAtMTA1ZEJtLCB3aGljaCBpcyBhYm91dCAyMGRCCisgKiBhYm92ZSB3aGF0IHRoZSA4MDIuMTEgc3BlY2lmaWNhdGlvbnMgZGVtYW5kLiBJbiBhZGRpdGlvbiwgbmV3IChwcm9wcmlldGFyeSkKKyAqIGRhdGEgcmF0ZXMgYXJlIGludHJvZHVjZWQ6IDMsIDIsIDEsIDAuNSBhbmQgMC4yNSBNQml0L3MuCiAgKgogICogUGxlYXNlIG5vdGUgdGhhdCBjYW4geW91IGVpdGhlciB1c2UgWFIgb3IgVFVSQk8gYnV0IHlvdSBjYW5ub3QgdXNlIGJvdGgsCiAgKiB0aGV5IGFyZSBleGNsdXNpdmUuCiAgKgorICogQWxzbyBub3RlIHRoYXQgd2UgZG8gbm90IHBsYW4gdG8gc3VwcG9ydCBYUiBtb2RlIGF0IGxlYXN0IGZvciBub3cuIFlvdSBjYW4KKyAqIGdldCBhIG1vZGUgc2ltaWxhciB0byBYUiBieSB1c2luZyA1TUh6IGJ3bW9kZS4KICAqLwotI2RlZmluZSBNT0RVTEFUSU9OX1hSCQkweDAwMDAwMjAwCi0vKgotICogTW9kdWxhdGlvbiBmb3IgQXRoZXJvcycgVHVyYm8gRyBhbmQgVHVyYm8gQSwgaXRzIHN1cHBvc2VkIHRvIHByb3ZpZGUgYQotICogdGhyb3VnaHB1dCB0cmFuc21pc3Npb24gc3BlZWQgdXAgdG8gNDBNYml0L3MtNjBNYml0L3MgYXQgYSAxMDhNYml0L3MKLSAqIHNpZ25hbGluZyByYXRlIGFjaGlldmVkIHRocm91Z2ggdGhlIGJvbmRpbmcgb2YgdHdvIDU0TWJpdC9zIDgwMi4xMWcKLSAqIGNoYW5uZWxzLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdXIgQWNjZXNzIFBvaW50IG11c3QgYWxzbyBzdXBwb3J0IGl0LgorCisKKy8qKgorICogRE9DOiBBdGhlcm9zIFN1cGVyQUcKKyAqCisgKiBJbiBhZGRpdGlvbiB0byBYUiB3ZSBoYXZlIGFub3RoZXIgbW9kdWxhdGlvbiBzY2hlbWUgY2FsbGVkIFRVUkJPIG1vZGUKKyAqIHRoYXQgaXMgc3VwcG9zZWQgdG8gcHJvdmlkZSBhIHRocm91Z2hwdXQgdHJhbnNtaXNzaW9uIHNwZWVkIHVwIHRvIDQwTWJpdC9zCisgKiAtNjBNYml0L3MgYXQgYSAxMDhNYml0L3Mgc2lnbmFsaW5nIHJhdGUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgYm9uZGluZyBvZiB0d28KKyAqIDU0TWJpdC9zIDgwMi4xMWcgY2hhbm5lbHMuIFRvIHVzZSB0aGlzIGZlYXR1cmUgYm90aCBlbmRzIG11c3Qgc3VwcG9ydCBpdC4KICAqIFRoZXJlIGlzIGFsc28gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuICJzdGF0aWMiIGFuZCAiZHluYW1pYyIgdHVyYm8gbW9kZXM6CiAgKgogICogLSBTdGF0aWM6IGlzIHRoZSBkdW1iIHZlcnNpb246IGRldmljZXMgc2V0IHRvIHRoaXMgbW9kZSBzdGljayB0byBpdCB1bnRpbAogICogICAgIHRoZSBtb2RlIGlzIHR1cm5lZCBvZmYuCisgKgogICogLSBEeW5hbWljOiBpcyB0aGUgaW50ZWxsaWdlbnQgdmVyc2lvbiwgdGhlIG5ldHdvcmsgZGVjaWRlcyBpdHNlbGYgaWYgaXQKICAqICAgICBpcyBvayB0byB1c2UgdHVyYm8uIEFzIHNvb24gYXMgdHJhZmZpYyBpcyBkZXRlY3RlZCBvbiBhZGphY2VudCBjaGFubmVscwogICogICAgICh3aGljaCB3b3VsZCBnZXQgdXNlZCBpbiB0dXJibyBtb2RlKSwgb3Igd2hlbiBhIG5vbi10dXJibyBzdGF0aW9uIGpvaW5zCkBAIC0zODMsMjQgKzQwOCwzOSBAQAogICoKICAqIGh0dHA6Ly93d3cucGN3b3JsZC5jb20vYXJ0aWNsZS9pZCwxMTM0MjgtcGFnZSwxL2FydGljbGUuaHRtbAogICoKLSAqIFRoZSBjaGFubmVsIGJvbmRpbmcgc2VlbXMgdG8gYmUgZHJpdmVyIHNwZWNpZmljIHRob3VnaC4gSW4gYWRkaXRpb24gdG8KLSAqIGRlY2lkaW5nIHdoYXQgY2hhbm5lbHMgd2lsbCBiZSB1c2VkLCB0aGVzZSAiVHVyYm8iIG1vZGVzIGFyZSBhY2NvbXBsaXNoZWQKLSAqIGJ5IGFsc28gZW5hYmxpbmcgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKyAqIFRoZSBjaGFubmVsIGJvbmRpbmcgc2VlbXMgdG8gYmUgZHJpdmVyIHNwZWNpZmljIHRob3VnaC4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byBUVVJCTyBtb2RlcyB3ZSBhbHNvIGhhdmUgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyBmb3IgZXZlbgorICogZ3JlYXRlciBzcGVlZC11cDoKICAqCiAgKiAtIEJ1cnN0aW5nOiBhbGxvd3MgbXVsdGlwbGUgZnJhbWVzIHRvIGJlIHNlbnQgYXQgb25jZSwgcmF0aGVyIHRoYW4gcGF1c2luZwogICogICAgIGFmdGVyIGVhY2ggZnJhbWUuIEJ1cnN0aW5nIGlzIGEgc3RhbmRhcmRzLWNvbXBsaWFudCBmZWF0dXJlIHRoYXQgY2FuIGJlCiAgKiAgICAgdXNlZCB3aXRoIGFueSBBY2Nlc3MgUG9pbnQuCisgKgogICogLSBGYXN0IGZyYW1lczogaW5jcmVhc2VzIHRoZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgc2VudCBwZXIKICAqICAgICBmcmFtZSwgYWxzbyByZXN1bHRpbmcgaW4gYSByZWR1Y3Rpb24gb2YgdHJhbnNtaXNzaW9uIG92ZXJoZWFkLiBJdCBpcyBhCiAgKiAgICAgcHJvcHJpZXRhcnkgZmVhdHVyZSB0aGF0IG5lZWRzIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUgQWNjZXNzIFBvaW50LgorICoKICAqIC0gQ29tcHJlc3Npb246IGRhdGEgZnJhbWVzIGFyZSBjb21wcmVzc2VkIGluIHJlYWwgdGltZSB1c2luZyBhIExlbXBlbCBaaXYKICAqICAgICBhbGdvcml0aG0uIFRoaXMgaXMgZG9uZSB0cmFuc3BhcmVudGx5LiBPbmNlIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLAogICogICAgIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIHRha2VzIHBsYWNlIGluc2lkZSB0aGUgY2hpcHNldCwgd2l0aG91dAogICogICAgIHB1dHRpbmcgYWRkaXRpb25hbCBsb2FkIG9uIHRoZSBob3N0IENQVS4KICAqCisgKiBBcyB3aXRoIFhSIHdlIGFsc28gZG9uJ3QgcGxhbiB0byBzdXBwb3J0IFN1cGVyQUcgZmVhdHVyZXMgZm9yIG5vdy4gWW91IGNhbgorICogZ2V0IGEgbW9kZSBzaW1pbGFyIHRvIFRVUkJPIGJ5IHVzaW5nIDQwTUh6IGJ3bW9kZS4KICAqLwotI2RlZmluZSBNT0RVTEFUSU9OX1RVUkJPCTB4MDAwMDAwODAKIAorCisvKioKKyAqIGVudW0gYXRoNWtfZHJpdmVyX21vZGUgLSBQSFkgb3BlcmF0aW9uIG1vZGUKKyAqIEBBUjVLX01PREVfMTFBOiA4MDIuMTFhCisgKiBAQVI1S19NT0RFXzExQjogODAyLjExYgorICogQEFSNUtfTU9ERV8xMUc6IDgwMS4xMWcKKyAqIEBBUjVLX01PREVfTUFYOiBVc2VkIGZvciBib3VuZGFyeSBjaGVja3MKKyAqCisgKiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBoZXJlLCB3ZSB1c2UgdGhlc2UgYXMKKyAqIGFycmF5IGluZGljZXMgYW5kIGl0IGFsc28gbWFwcyBFRVBST00gc3RydWN0dXJlcy4KKyAqLwogZW51bSBhdGg1a19kcml2ZXJfbW9kZSB7CiAJQVI1S19NT0RFXzExQQkJPQkwLAogCUFSNUtfTU9ERV8xMUIJCT0JMSwKQEAgLTQwOCwzMCArNDQ4LDY0IEBACiAJQVI1S19NT0RFX01BWAkJPQkzCiB9OwogCisvKioKKyAqIGVudW0gYXRoNWtfYW50X21vZGUgLSBBbnRlbm5hIG9wZXJhdGlvbiBtb2RlCisgKiBAQVI1S19BTlRNT0RFX0RFRkFVTFQ6IERlZmF1bHQgYW50ZW5uYSBzZXR1cAorICogQEFSNUtfQU5UTU9ERV9GSVhFRF9BOiBPbmx5IGFudGVubmEgQSBpcyBwcmVzZW50CisgKiBAQVI1S19BTlRNT0RFX0ZJWEVEX0I6IE9ubHkgYW50ZW5uYSBCIGlzIHByZXNlbnQKKyAqIEBBUjVLX0FOVE1PREVfU0lOR0xFX0FQOiBTVEEgbG9ja2VkIG9uIGEgc2luZ2xlIGFwCisgKiBAQVI1S19BTlRNT0RFX1NFQ1RPUl9BUDogQVAgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjCisgKiBAQVI1S19BTlRNT0RFX1NFQ1RPUl9TVEE6IFNUQSB3aXRoIHR4IGFudGVubmEgc2V0IG9uIHR4IGRlc2MKKyAqIEBBUjVLX0FOVE1PREVfREVCVUc6IERlYnVnIG1vZGUgLUEgLT4gUngsIEItPiBUeC0KKyAqIEBBUjVLX0FOVE1PREVfTUFYOiBVc2VkIGZvciBib3VuZGFyeSBjaGVja3MKKyAqCisgKiBGb3IgbW9yZSBpbmZvcyBvbiBhbnRlbm5hIGNvbnRyb2wgY2hlY2sgb3V0IHBoeS5jCisgKi8KIGVudW0gYXRoNWtfYW50X21vZGUgewotCUFSNUtfQU5UTU9ERV9ERUZBVUxUCT0gMCwJLyogZGVmYXVsdCBhbnRlbm5hIHNldHVwICovCi0JQVI1S19BTlRNT0RFX0ZJWEVEX0EJPSAxLAkvKiBvbmx5IGFudGVubmEgQSBpcyBwcmVzZW50ICovCi0JQVI1S19BTlRNT0RFX0ZJWEVEX0IJPSAyLAkvKiBvbmx5IGFudGVubmEgQiBpcyBwcmVzZW50ICovCi0JQVI1S19BTlRNT0RFX1NJTkdMRV9BUAk9IDMsCS8qIHN0YSBsb2NrZWQgb24gYSBzaW5nbGUgYXAgKi8KLQlBUjVLX0FOVE1PREVfU0VDVE9SX0FQCT0gNCwJLyogQVAgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjICovCi0JQVI1S19BTlRNT0RFX1NFQ1RPUl9TVEEJPSA1LAkvKiBTVEEgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjICovCi0JQVI1S19BTlRNT0RFX0RFQlVHCT0gNiwJLyogRGVidWcgbW9kZSAtQSAtPiBSeCwgQi0+IFR4LSAqLworCUFSNUtfQU5UTU9ERV9ERUZBVUxUCT0gMCwKKwlBUjVLX0FOVE1PREVfRklYRURfQQk9IDEsCisJQVI1S19BTlRNT0RFX0ZJWEVEX0IJPSAyLAorCUFSNUtfQU5UTU9ERV9TSU5HTEVfQVAJPSAzLAorCUFSNUtfQU5UTU9ERV9TRUNUT1JfQVAJPSA0LAorCUFSNUtfQU5UTU9ERV9TRUNUT1JfU1RBCT0gNSwKKwlBUjVLX0FOVE1PREVfREVCVUcJPSA2LAogCUFSNUtfQU5UTU9ERV9NQVgsCiB9OwogCisvKioKKyAqIGVudW0gYXRoNWtfYndfbW9kZSAtIEJhbmR3aWR0aCBvcGVyYXRpb24gbW9kZQorICogQEFSNUtfQldNT0RFX0RFRkFVTFQ6IDIwTUh6LCBkZWZhdWx0IG9wZXJhdGlvbgorICogQEFSNUtfQldNT0RFXzVNSFo6IFF1YXJ0ZXIgcmF0ZQorICogQEFSNUtfQldNT0RFXzEwTUhaOiBIYWxmIHJhdGUKKyAqIEBBUjVLX0JXTU9ERV80ME1IWjogVHVyYm8KKyAqLwogZW51bSBhdGg1a19id19tb2RlIHsKLQlBUjVLX0JXTU9ERV9ERUZBVUxUCT0gMCwJLyogMjBNSHosIGRlZmF1bHQgb3BlcmF0aW9uICovCi0JQVI1S19CV01PREVfNU1IWgk9IDEsCS8qIFF1YXJ0ZXIgcmF0ZSAqLwotCUFSNUtfQldNT0RFXzEwTUhaCT0gMiwJLyogSGFsZiByYXRlICovCi0JQVI1S19CV01PREVfNDBNSFoJPSAzCS8qIFR1cmJvICovCisJQVI1S19CV01PREVfREVGQVVMVAk9IDAsCisJQVI1S19CV01PREVfNU1IWgk9IDEsCisJQVI1S19CV01PREVfMTBNSFoJPSAyLAorCUFSNUtfQldNT0RFXzQwTUhaCT0gMwogfTsKIAorCisKIC8qKioqKioqKioqKioqKioqXAogICBUWCBERUZJTklUSU9OUwogXCoqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBUWCBTdGF0dXMgZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfdHhfc3RhdHVzIC0gVFggU3RhdHVzIGRlc2NyaXB0b3IKKyAqIEB0c19zZXFudW06IFNlcXVlbmNlIG51bWJlcgorICogQHRzX3RzdGFtcDogVGltZXN0YW1wCisgKiBAdHNfc3RhdHVzOiBTdGF0dXMgY29kZQorICogQHRzX2ZpbmFsX2lkeDogRmluYWwgdHJhbnNtaXNzaW9uIHNlcmllcyBpbmRleAorICogQHRzX2ZpbmFsX3JldHJ5OiBGaW5hbCByZXRyeSBjb3VudAorICogQHRzX3Jzc2k6IFJTU0kgZm9yIHJlY2VpdmVkIEFDSworICogQHRzX3Nob3J0cmV0cnk6IFNob3J0IHJldHJ5IGNvdW50CisgKiBAdHNfdmlydGNvbDogVmlydHVhbCBjb2xsaXNpb24gY291bnQKKyAqIEB0c19hbnRlbm5hOiBBbnRlbm5hIHVzZWQKKyAqCisgKiBUWCBzdGF0dXMgZGVzY3JpcHRvciBnZXRzIGZpbGxlZCBieSB0aGUgaHcKKyAqIG9uIGVhY2ggdHJhbnNtaXNzaW9uIGF0dGVtcHQuCiAgKi8KIHN0cnVjdCBhdGg1a190eF9zdGF0dXMgewogCXUxNgl0c19zZXFudW07CkBAIC00NTQsNyArNTI4LDYgQEAKICAqIGVudW0gYXRoNWtfdHhfcXVldWUgLSBRdWV1ZSB0eXBlcyB1c2VkIHRvIGNsYXNzaWZ5IHR4IHF1ZXVlcy4KICAqIEBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFOiBxIGlzIHVudXNlZCAtLSBzZWUgYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZQogICogQEFSNUtfVFhfUVVFVUVfREFUQTogQSBub3JtYWwgZGF0YSBxdWV1ZQotICogQEFSNUtfVFhfUVVFVUVfWFJfREFUQTogQW4gWFItZGF0YSBxdWV1ZQogICogQEFSNUtfVFhfUVVFVUVfQkVBQ09OOiBUaGUgYmVhY29uIHF1ZXVlCiAgKiBAQVI1S19UWF9RVUVVRV9DQUI6IFRoZSBhZnRlci1iZWFjb24gcXVldWUKICAqIEBBUjVLX1RYX1FVRVVFX1VBUFNEOiBVbnNjaGVkdWxlZCBBdXRvbWF0aWMgUG93ZXIgU2F2ZSBEZWxpdmVyeSBxdWV1ZQpAQCAtNDYyLDcgKzUzNSw2IEBACiBlbnVtIGF0aDVrX3R4X3F1ZXVlIHsKIAlBUjVLX1RYX1FVRVVFX0lOQUNUSVZFID0gMCwKIAlBUjVLX1RYX1FVRVVFX0RBVEEsCi0JQVI1S19UWF9RVUVVRV9YUl9EQVRBLAogCUFSNUtfVFhfUVVFVUVfQkVBQ09OLAogCUFSNUtfVFhfUVVFVUVfQ0FCLAogCUFSNUtfVFhfUVVFVUVfVUFQU0QsCkBAIC00NzEsMzYgKzU0Myw0NiBAQAogI2RlZmluZQlBUjVLX05VTV9UWF9RVUVVRVMJCTEwCiAjZGVmaW5lCUFSNUtfTlVNX1RYX1FVRVVFU19OT1FDVQkyCiAKLS8qCi0gKiBRdWV1ZSBzeWItdHlwZXMgdG8gY2xhc3NpZnkgbm9ybWFsIGRhdGEgcXVldWVzLgorLyoqCisgKiBlbnVtIGF0aDVrX3R4X3F1ZXVlX3N1YnR5cGUgLSBRdWV1ZSBzdWItdHlwZXMgdG8gY2xhc3NpZnkgbm9ybWFsIGRhdGEgcXVldWVzCisgKiBAQVI1S19XTUVfQUNfQks6IEJhY2tncm91bmQgdHJhZmZpYworICogQEFSNUtfV01FX0FDX0JFOiBCZXN0LWVmZm9ydCAobm9ybWFsKSB0cmFmZmljCisgKiBAQVI1S19XTUVfQUNfVkk6IFZpZGVvIHRyYWZmaWMKKyAqIEBBUjVLX1dNRV9BQ19WTzogVm9pY2UgdHJhZmZpYworICoKICAqIFRoZXNlIGFyZSB0aGUgNCBBY2Nlc3MgQ2F0ZWdvcmllcyBhcyBkZWZpbmVkIGluCiAgKiBXTUUgc3BlYy4gMCBpcyB0aGUgbG93ZXN0IHByaW9yaXR5IGFuZCA0IGlzIHRoZQogICogaGlnaGVzdC4gTm9ybWFsIGRhdGEgdGhhdCBoYXNuJ3QgYmVlbiBjbGFzc2lmaWVkCiAgKiBnb2VzIHRvIHRoZSBCZXN0IEVmZm9ydCBBQy4KICAqLwogZW51bSBhdGg1a190eF9xdWV1ZV9zdWJ0eXBlIHsKLQlBUjVLX1dNRV9BQ19CSyA9IDAsCS8qQmFja2dyb3VuZCB0cmFmZmljKi8KLQlBUjVLX1dNRV9BQ19CRSwJCS8qQmVzdC1lZmZvcnQgKG5vcm1hbCkgdHJhZmZpYyovCi0JQVI1S19XTUVfQUNfVkksCQkvKlZpZGVvIHRyYWZmaWMqLwotCUFSNUtfV01FX0FDX1ZPLAkJLypWb2ljZSB0cmFmZmljKi8KKwlBUjVLX1dNRV9BQ19CSyA9IDAsCisJQVI1S19XTUVfQUNfQkUsCisJQVI1S19XTUVfQUNfVkksCisJQVI1S19XTUVfQUNfVk8sCiB9OwogCi0vKgotICogUXVldWUgSUQgbnVtYmVycyBhcyByZXR1cm5lZCBieSB0aGUgaHcgZnVuY3Rpb25zLCBlYWNoIG51bWJlcgotICogcmVwcmVzZW50cyBhIGh3IHF1ZXVlLiBJZiBodyBkb2VzIG5vdCBzdXBwb3J0IGh3IHF1ZXVlcwotICogKGVnIDUyMTApIGFsbCBkYXRhIGdvZXMgaW4gb25lIHF1ZXVlLiBUaGVzZSBtYXRjaAotICogZDgwMjExIGRlZmluaXRpb25zIChuZXQ4MDIxMS9NYWRXaUZpIGRvbid0IHVzZSB0aGVtKS4KKy8qKgorICogZW51bSBhdGg1a190eF9xdWV1ZV9pZCAtIFF1ZXVlIElEIG51bWJlcnMgYXMgcmV0dXJuZWQgYnkgdGhlIGh3IGZ1bmN0aW9ucworICogQEFSNUtfVFhfUVVFVUVfSURfTk9RQ1VfREFUQTogRGF0YSBxdWV1ZSBvbiBBUjUyMTAgKG5vIFFDVSBhdmFpbGFibGUpCisgKiBAQVI1S19UWF9RVUVVRV9JRF9OT1FDVV9CRUFDT046IEJlYWNvbiBxdWV1ZSBvbiBBUjUyMTAgKG5vIFFDVSBhdmFpbGFibGUpCisgKiBAQVI1S19UWF9RVUVVRV9JRF9EQVRBX01JTjogRGF0YSBxdWV1ZSBtaW4gaW5kZXgKKyAqIEBBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUFYOiBEYXRhIHF1ZXVlIG1heCBpbmRleAorICogQEFSNUtfVFhfUVVFVUVfSURfQ0FCOiBDb250ZW50IGFmdGVyIGJlYWNvbiBxdWV1ZQorICogQEFSNUtfVFhfUVVFVUVfSURfQkVBQ09OOiBCZWFjb24gcXVldWUKKyAqIEBBUjVLX1RYX1FVRVVFX0lEX1VBUFNEOiBVcmdlbnQgQXV0b21hdGljIFBvd2VyIFNhdmUgRGVsaXZlcnksCisgKgorICogRWFjaCBudW1iZXIgcmVwcmVzZW50cyBhIGh3IHF1ZXVlLiBJZiBodyBkb2VzIG5vdCBzdXBwb3J0IGh3IHF1ZXVlcworICogKGVnIDUyMTApIGFsbCBkYXRhIGdvZXMgaW4gb25lIHF1ZXVlLgogICovCiBlbnVtIGF0aDVrX3R4X3F1ZXVlX2lkIHsKIAlBUjVLX1RYX1FVRVVFX0lEX05PUUNVX0RBVEEJPSAwLAogCUFSNUtfVFhfUVVFVUVfSURfTk9RQ1VfQkVBQ09OCT0gMSwKLQlBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUlOCT0gMCwgLypJRUVFODAyMTFfVFhfUVVFVUVfREFUQTAqLwotCUFSNUtfVFhfUVVFVUVfSURfREFUQV9NQVgJPSAzLCAvKklFRUU4MDIxMV9UWF9RVUVVRV9EQVRBMyovCi0JQVI1S19UWF9RVUVVRV9JRF9EQVRBX1NWUAk9IDUsIC8qSUVFRTgwMjExX1RYX1FVRVVFX1NWUCAtIFNwZWN0cmFsaW5rIFZvaWNlIFByb3RvY29sKi8KLQlBUjVLX1RYX1FVRVVFX0lEX0NBQgkJPSA2LCAvKklFRUU4MDIxMV9UWF9RVUVVRV9BRlRFUl9CRUFDT04qLwotCUFSNUtfVFhfUVVFVUVfSURfQkVBQ09OCQk9IDcsIC8qSUVFRTgwMjExX1RYX1FVRVVFX0JFQUNPTiovCi0JQVI1S19UWF9RVUVVRV9JRF9VQVBTRAkJPSA4LAotCUFSNUtfVFhfUVVFVUVfSURfWFJfREFUQQk9IDksCisJQVI1S19UWF9RVUVVRV9JRF9EQVRBX01JTgk9IDAsCisJQVI1S19UWF9RVUVVRV9JRF9EQVRBX01BWAk9IDMsCisJQVI1S19UWF9RVUVVRV9JRF9VQVBTRAkJPSA3LAorCUFSNUtfVFhfUVVFVUVfSURfQ0FCCQk9IDgsCisJQVI1S19UWF9RVUVVRV9JRF9CRUFDT04JCT0gOSwKIH07CiAKIC8qCkBAIC01MjEsNDYgKzYwMyw3MCBAQAogI2RlZmluZSBBUjVLX1RYUV9GTEFHX1BPU1RfRlJfQktPRkZfRElTCQkweDEwMDAJLyogRGlzYWJsZSBiYWNrb2ZmIHdoaWxlIGJ1cnN0aW5nICovCiAjZGVmaW5lIEFSNUtfVFhRX0ZMQUdfQ09NUFJFU1NJT05fRU5BQkxFCTB4MjAwMAkvKiBFbmFibGUgaHcgY29tcHJlc3Npb24gLW5vdCBpbXBsZW1lbnRlZC0qLwogCi0vKgotICogRGF0YSB0cmFuc21pdCBxdWV1ZSBzdGF0ZS4gIE9uZSBvZiB0aGVzZSBleGlzdHMgZm9yIGVhY2gKLSAqIGhhcmR3YXJlIHRyYW5zbWl0IHF1ZXVlLiAgUGFja2V0cyBzZW50IHRvIHVzIGZyb20gYWJvdmUKLSAqIGFyZSBhc3NpZ25lZCB0byBxdWV1ZXMgYmFzZWQgb24gdGhlaXIgcHJpb3JpdHkuICBOb3QgYWxsCi0gKiBkZXZpY2VzIHN1cHBvcnQgYSBjb21wbGV0ZSBzZXQgb2YgaGFyZHdhcmUgdHJhbnNtaXQgcXVldWVzLgotICogRm9yIHRob3NlIGRldmljZXMgdGhlIGFycmF5IHNjX2FjMnEgd2lsbCBtYXAgbXVsdGlwbGUKLSAqIHByaW9yaXRpZXMgdG8gZmV3ZXIgaGFyZHdhcmUgcXVldWVzICh0eXBpY2FsbHkgYWxsIHRvIG9uZQotICogaGFyZHdhcmUgcXVldWUpLgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfdHhxIC0gVHJhbnNtaXQgcXVldWUgc3RhdGUKKyAqIEBxbnVtOiBIYXJkd2FyZSBxIG51bWJlcgorICogQGxpbms6IExpbmsgcHRyIGluIGxhc3QgVFggZGVzYworICogQHE6IFRyYW5zbWl0IHF1ZXVlICgmc3RydWN0IGxpc3RfaGVhZCkKKyAqIEBsb2NrOiBMb2NrIG9uIHEgYW5kIGxpbmsKKyAqIEBzZXR1cDogSXMgdGhlIHF1ZXVlIGNvbmZpZ3VyZWQKKyAqIEB0eHFfbGVuOk51bWJlciBvZiBxdWV1ZWQgYnVmZmVycworICogQHR4cV9tYXg6IE1heCBhbGxvd2VkIG51bSBvZiBxdWV1ZWQgYnVmZmVycworICogQHR4cV9wb2xsX21hcms6IFVzZWQgdG8gY2hlY2sgaWYgcXVldWUgZ290IHN0dWNrCisgKiBAdHhxX3N0dWNrOiBRdWV1ZSBzdHVjayBjb3VudGVyCisgKgorICogT25lIG9mIHRoZXNlIGV4aXN0cyBmb3IgZWFjaCBoYXJkd2FyZSB0cmFuc21pdCBxdWV1ZS4KKyAqIFBhY2tldHMgc2VudCB0byB1cyBmcm9tIGFib3ZlIGFyZSBhc3NpZ25lZCB0byBxdWV1ZXMgYmFzZWQKKyAqIG9uIHRoZWlyIHByaW9yaXR5LiAgTm90IGFsbCBkZXZpY2VzIHN1cHBvcnQgYSBjb21wbGV0ZSBzZXQKKyAqIG9mIGhhcmR3YXJlIHRyYW5zbWl0IHF1ZXVlcy4gRm9yIHRob3NlIGRldmljZXMgdGhlIGFycmF5CisgKiBzY19hYzJxIHdpbGwgbWFwIG11bHRpcGxlIHByaW9yaXRpZXMgdG8gZmV3ZXIgaGFyZHdhcmUgcXVldWVzCisgKiAodHlwaWNhbGx5IGFsbCB0byBvbmUgaGFyZHdhcmUgcXVldWUpLgogICovCiBzdHJ1Y3QgYXRoNWtfdHhxIHsKLQl1bnNpZ25lZCBpbnQJCXFudW07CS8qIGhhcmR3YXJlIHEgbnVtYmVyICovCi0JdTMyCQkJKmxpbms7CS8qIGxpbmsgcHRyIGluIGxhc3QgVFggZGVzYyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcTsJLyogdHJhbnNtaXQgcXVldWUgKi8KLQlzcGlubG9ja190CQlsb2NrOwkvKiBsb2NrIG9uIHEgYW5kIGxpbmsgKi8KKwl1bnNpZ25lZCBpbnQJCXFudW07CisJdTMyCQkJKmxpbms7CisJc3RydWN0IGxpc3RfaGVhZAlxOworCXNwaW5sb2NrX3QJCWxvY2s7CiAJYm9vbAkJCXNldHVwOwotCWludAkJCXR4cV9sZW47IC8qIG51bWJlciBvZiBxdWV1ZWQgYnVmZmVycyAqLwotCWludAkJCXR4cV9tYXg7IC8qIG1heCBhbGxvd2VkIG51bSBvZiBxdWV1ZWQgYnVmZmVycyAqLworCWludAkJCXR4cV9sZW47CisJaW50CQkJdHhxX21heDsKIAlib29sCQkJdHhxX3BvbGxfbWFyazsKLQl1bnNpZ25lZCBpbnQJCXR4cV9zdHVjazsJLyogaW5mb3JtYXRpb25hbCBjb3VudGVyICovCisJdW5zaWduZWQgaW50CQl0eHFfc3R1Y2s7CiB9OwogCi0vKgotICogQSBzdHJ1Y3QgdG8gaG9sZCB0eCBxdWV1ZSdzIHBhcmFtZXRlcnMKKy8qKgorICogc3RydWN0IGF0aDVrX3R4cV9pbmZvIC0gQSBzdHJ1Y3QgdG8gaG9sZCBUWCBxdWV1ZSdzIHBhcmFtZXRlcnMKKyAqIEB0cWlfdHlwZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWUKKyAqIEB0cWlfc3VidHlwZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWVfc3VidHlwZQorICogQHRxaV9mbGFnczogVFggcXVldWUgZmxhZ3MgKHNlZSBhYm92ZSkKKyAqIEB0cWlfYWlmczogQXJiaXRyYXRlZCBJbnRlci1mcmFtZSBTcGFjZQorICogQHRxaV9jd19taW46IE1pbmltdW0gQ29udGVudGlvbiBXaW5kb3cKKyAqIEB0cWlfY3dfbWF4OiBNYXhpbXVtIENvbnRlbnRpb24gV2luZG93CisgKiBAdHFpX2Nicl9wZXJpb2Q6IENvbnN0YW50IGJpdCByYXRlIHBlcmlvZAorICogQHRxaV9yZWFkeV90aW1lOiBUaW1lIHF1ZXVlIHdhaXRzIGFmdGVyIGFuIGV2ZW50IHdoZW4gUkRZVElNRSBpcyBlbmFibGVkCiAgKi8KIHN0cnVjdCBhdGg1a190eHFfaW5mbyB7CiAJZW51bSBhdGg1a190eF9xdWV1ZSB0cWlfdHlwZTsKIAllbnVtIGF0aDVrX3R4X3F1ZXVlX3N1YnR5cGUgdHFpX3N1YnR5cGU7Ci0JdTE2CXRxaV9mbGFnczsJLyogVHggcXVldWUgZmxhZ3MgKHNlZSBhYm92ZSkgKi8KLQl1OAl0cWlfYWlmczsJLyogQXJiaXRyYXRlZCBJbnRlcmZyYW1lIFNwYWNlICovCi0JdTE2CXRxaV9jd19taW47CS8qIE1pbmltdW0gQ29udGVudGlvbiBXaW5kb3cgKi8KLQl1MTYJdHFpX2N3X21heDsJLyogTWF4aW11bSBDb250ZW50aW9uIFdpbmRvdyAqLwotCXUzMgl0cWlfY2JyX3BlcmlvZDsgLyogQ29uc3RhbnQgYml0IHJhdGUgcGVyaW9kICovCisJdTE2CXRxaV9mbGFnczsKKwl1OAl0cWlfYWlmczsKKwl1MTYJdHFpX2N3X21pbjsKKwl1MTYJdHFpX2N3X21heDsKKwl1MzIJdHFpX2Nicl9wZXJpb2Q7CiAJdTMyCXRxaV9jYnJfb3ZlcmZsb3dfbGltaXQ7CiAJdTMyCXRxaV9idXJzdF90aW1lOwotCXUzMgl0cWlfcmVhZHlfdGltZTsgLyogVGltZSBxdWV1ZSB3YWl0cyBhZnRlciBhbiBldmVudCAqLworCXUzMgl0cWlfcmVhZHlfdGltZTsKIH07CiAKLS8qCi0gKiBUcmFuc21pdCBwYWNrZXQgdHlwZXMuCi0gKiB1c2VkIG9uIHR4IGNvbnRyb2wgZGVzY3JpcHRvcgorLyoqCisgKiBlbnVtIGF0aDVrX3BrdF90eXBlIC0gVHJhbnNtaXQgcGFja2V0IHR5cGVzCisgKiBAQVI1S19QS1RfVFlQRV9OT1JNQUw6IE5vcm1hbCBkYXRhCisgKiBAQVI1S19QS1RfVFlQRV9BVElNOiBBVElNCisgKiBAQVI1S19QS1RfVFlQRV9QU1BPTEw6IFBTLVBvbGwKKyAqIEBBUjVLX1BLVF9UWVBFX0JFQUNPTjogQmVhY29uCisgKiBAQVI1S19QS1RfVFlQRV9QUk9CRV9SRVNQOiBQcm9iZSByZXNwb25zZQorICogQEFSNUtfUEtUX1RZUEVfUElGUzogUElGUworICogVXNlZCBvbiB0eCBjb250cm9sIGRlc2NyaXB0b3IKICAqLwogZW51bSBhdGg1a19wa3RfdHlwZSB7CiAJQVI1S19QS1RfVFlQRV9OT1JNQUwJCT0gMCwKQEAgLTU4MywyNyArNjg5LDIzIEBACiAJKGFoLT5haF90eHBvd2VyLnR4cF9yYXRlc19wb3dlcl90YWJsZVsoX3IpXSAmIDB4M2YpIDw8IChfdikJXAogKQogCi0vKgotICogRE1BIHNpemUgZGVmaW5pdGlvbnMgKDJeKG4rMikpCi0gKi8KLWVudW0gYXRoNWtfZG1hc2l6ZSB7Ci0JQVI1S19ETUFTSVpFXzRCCT0gMCwKLQlBUjVLX0RNQVNJWkVfOEIsCi0JQVI1S19ETUFTSVpFXzE2QiwKLQlBUjVLX0RNQVNJWkVfMzJCLAotCUFSNUtfRE1BU0laRV82NEIsCi0JQVI1S19ETUFTSVpFXzEyOEIsCi0JQVI1S19ETUFTSVpFXzI1NkIsCi0JQVI1S19ETUFTSVpFXzUxMkIKLX07CiAKIAogLyoqKioqKioqKioqKioqKipcCiAgIFJYIERFRklOSVRJT05TCiBcKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFJYIFN0YXR1cyBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgLSBSWCBTdGF0dXMgZGVzY3JpcHRvcgorICogQHJzX2RhdGFsZW46IERhdGEgbGVuZ3RoCisgKiBAcnNfdHN0YW1wOiBUaW1lc3RhbXAKKyAqIEByc19zdGF0dXM6IFN0YXR1cyBjb2RlCisgKiBAcnNfcGh5ZXJyOiBQSFkgZXJyb3IgbWFzaworICogQHJzX3Jzc2k6IFJTU0kgaW4gMC41ZGJtIHVuaXRzCisgKiBAcnNfa2V5aXg6IEluZGV4IHRvIHRoZSBrZXkgdXNlZCBmb3IgZGVjcnlwdGluZworICogQHJzX3JhdGU6IFJhdGUgdXNlZCB0byBkZWNvZGUgdGhlIGZyYW1lCisgKiBAcnNfYW50ZW5uYTogQW50ZW5uYSB1c2VkIHRvIHJlY2VpdmUgdGhlIGZyYW1lCisgKiBAcnNfbW9yZTogSW5kaWNhdGVzIHRoaXMgaXMgYSBmcmFtZSBmcmFnbWVudCAoRmFzdCBmcmFtZXMpCiAgKi8KIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgewogCXUxNglyc19kYXRhbGVuOwpAQCAtNjQ1LDEwICs3NDcsMTggQEAKICNkZWZpbmUgVFNGX1RPX1RVKF90c2YpICh1MzIpKChfdHNmKSA+PiAxMCkKIAogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAogICBHQUlOIE9QVElNSVpBVElPTiBERUZJTklUSU9OUwogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qKgorICogZW51bSBhdGg1a19yZmdhaW4gLSBSRiBHYWluIG9wdGltaXphdGlvbiBlbmdpbmUgc3RhdGUKKyAqIEBBUjVLX1JGR0FJTl9JTkFDVElWRTogRW5naW5lIGRpc2FibGVkCisgKiBAQVI1S19SRkdBSU5fQUNUSVZFOiBQcm9iZSBhY3RpdmUKKyAqIEBBUjVLX1JGR0FJTl9SRUFEX1JFUVVFU1RFRDogUHJvYmUgcmVxdWVzdGVkCisgKiBAQVI1S19SRkdBSU5fTkVFRF9DSEFOR0U6IEdhaW5fRiBuZWVkcyBjaGFuZ2UKKyAqLwogZW51bSBhdGg1a19yZmdhaW4gewogCUFSNUtfUkZHQUlOX0lOQUNUSVZFID0gMCwKIAlBUjVLX1JGR0FJTl9BQ1RJVkUsCkBAIC02NTYsNiArNzY2LDE2IEBACiAJQVI1S19SRkdBSU5fTkVFRF9DSEFOR0UsCiB9OwogCisvKioKKyAqIHN0cnVjdCBhdGg1a19nYWluIC0gUkYgR2FpbiBvcHRpbWl6YXRpb24gZW5naW5lIHN0YXRlIGRhdGEKKyAqIEBnX3N0ZXBfaWR4OiBDdXJyZW50IHN0ZXAgaW5kZXgKKyAqIEBnX2N1cnJlbnQ6IEN1cnJlbnQgZ2FpbgorICogQGdfdGFyZ2V0OiBUYXJnZXQgZ2FpbgorICogQGdfbG93OiBMb3cgZ2FpbiBib3VuZGFyeQorICogQGdfaGlnaDogSGlnaCBnYWluIGJvdW5kYXJ5CisgKiBAZ19mX2NvcnI6IEdhaW5fRiBjb3JyZWN0aW9uCisgKiBAZ19zdGF0ZTogT25lIG9mIGVudW0gYXRoNWtfcmZnYWluCisgKi8KIHN0cnVjdCBhdGg1a19nYWluIHsKIAl1OAkJCWdfc3RlcF9pZHg7CiAJdTgJCQlnX2N1cnJlbnQ7CkBAIC02NjYsNiArNzg2LDggQEAKIAl1OAkJCWdfc3RhdGU7CiB9OwogCisKKwogLyoqKioqKioqKioqKioqKioqKioqXAogICBDT01NT04gREVGSU5JVElPTlMKIFwqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY3NCw5ICs3OTYsMTQgQEAKICNkZWZpbmUgQVI1S19TTE9UX1RJTUVfMjAJODgwCiAjZGVmaW5lIEFSNUtfU0xPVF9USU1FX01BWAkweGZmZmYKIAotLyoKLSAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFwIDJHSHogY2hhbm5lbHMgdG8KLSAqIDVHSHogQXRoZXJvcyBjaGFubmVscy4KKy8qKgorICogc3RydWN0IGF0aDVrX2F0aGNoYW5fMmdoeiAtIDJHSHogdG8gNUdIWiBtYXAgZm9yIFJGNTExMQorICogQGEyX2ZsYWdzOiBDaGFubmVsIGZsYWdzIChpbnRlcm5hbCkKKyAqIEBhMl9hdGhjaGFuOiBIVyBjaGFubmVsIG51bWJlciAoaW50ZXJuYWwpCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgMkdIeiBjaGFubmVscyB0bworICogNUdIeiBBdGhlcm9zIGNoYW5uZWxzIG9uIDIxMTEgZnJlcXVlbmN5IGNvbnZlcnRlcgorICogdGhhdCBjb21lcyB0b2dldGhlciB3aXRoIFJGNTExMQogICogVE9ETzogQ2xlYW4gdXAKICAqLwogc3RydWN0IGF0aDVrX2F0aGNoYW5fMmdoeiB7CkBAIC02ODQsMzYgKzgxMSw4MCBAQAogCXUxNglhMl9hdGhjaGFuOwogfTsKIAorLyoqCisgKiBlbnVtIGF0aDVrX2RtYXNpemUgLSAgRE1BIHNpemUgZGVmaW5pdGlvbnMgKDJeKG4rMikpCisgKiBAQVI1S19ETUFTSVpFXzRCOiA0Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfOEI6IDhCeXRlcworICogQEFSNUtfRE1BU0laRV8xNkI6IDE2Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfMzJCOiAzMkJ5dGVzCisgKiBAQVI1S19ETUFTSVpFXzY0QjogNjRCeXRlcyAoRGVmYXVsdCkKKyAqIEBBUjVLX0RNQVNJWkVfMTI4QjogMTI4Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfMjU2QjogMjU2Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfNTEyQjogNTEyQnl0ZXMKKyAqCisgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgRE1BIGJ1cnN0IHNpemUgb24gaHcKKyAqCisgKiBOb3RlOiBTb21lIHBsYXRmb3JtcyBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIDRCeXRlcworICogYmUgY2FyZWZ1bCBvbiBlbWJlZGRlZCBib2FyZHMuCisgKi8KK2VudW0gYXRoNWtfZG1hc2l6ZSB7CisJQVI1S19ETUFTSVpFXzRCCT0gMCwKKwlBUjVLX0RNQVNJWkVfOEIsCisJQVI1S19ETUFTSVpFXzE2QiwKKwlBUjVLX0RNQVNJWkVfMzJCLAorCUFSNUtfRE1BU0laRV82NEIsCisJQVI1S19ETUFTSVpFXzEyOEIsCisJQVI1S19ETUFTSVpFXzI1NkIsCisJQVI1S19ETUFTSVpFXzUxMkIKK307CisKKwogCiAvKioqKioqKioqKioqKioqKioqXAogICBSQVRFIERFRklOSVRJT05TCiBcKioqKioqKioqKioqKioqKioqLwogCiAvKioKKyAqIERPQzogUmF0ZSBjb2RlcworICoKICAqIFNlZW1zIHRoZSBhcjV4eHggaGFyZHdhcmUgc3VwcG9ydHMgdXAgdG8gMzIgcmF0ZXMsIGluZGV4ZWQgYnkgMS0zMi4KICAqCiAgKiBUaGUgcmF0ZSBjb2RlIGlzIHVzZWQgdG8gZ2V0IHRoZSBSWCByYXRlIG9yIHNldCB0aGUgVFggcmF0ZSBvbiB0aGUKICAqIGhhcmR3YXJlIGRlc2NyaXB0b3JzLiBJdCBpcyBhbHNvIHVzZWQgZm9yIGludGVybmFsIG1vZHVsYXRpb24gY29udHJvbAogICogYW5kIHNldHRpbmdzLgogICoKLSAqIFRoaXMgaXMgdGhlIGhhcmR3YXJlIHJhdGUgbWFwIHdlIGFyZSBhd2FyZSBvZjoKKyAqIFRoaXMgaXMgdGhlIGhhcmR3YXJlIHJhdGUgbWFwIHdlIGFyZSBhd2FyZSBvZiAoaHRtbCB1bmZyaWVuZGx5KToKICAqCi0gKiByYXRlX2NvZGUgICAweDAxICAgIDB4MDIgICAgMHgwMyAgICAweDA0ICAgIDB4MDUgICAgMHgwNiAgICAweDA3ICAgIDB4MDgKLSAqIHJhdGVfa2JwcyAgIDMwMDAgICAgMTAwMCAgICA/ICAgICAgID8gICAgICAgPyAgICAgICAyMDAwICAgIDUwMCAgICAgNDgwMDAKKyAqIFJhdGUgY29kZQlSYXRlIChLYnBzKQorICogLS0tLS0tLS0tCS0tLS0tLS0tLS0tCisgKiAweDAxCQkgMzAwMCAoWFIpCisgKiAweDAyCQkgMTAwMCAoWFIpCisgKiAweDAzCQkgIDI1MCAoWFIpCisgKiAweDA0IC0gMDUJLVJlc2VydmVkLQorICogMHgwNgkJIDIwMDAgKFhSKQorICogMHgwNwkJICA1MDAgKFhSKQorICogMHgwOAkJNDgwMDAgKE9GRE0pCisgKiAweDA5CQkyNDAwMCAoT0ZETSkKKyAqIDB4MEEJCTEyMDAwIChPRkRNKQorICogMHgwQgkJIDYwMDAgKE9GRE0pCisgKiAweDBDCQk1NDAwMCAoT0ZETSkKKyAqIDB4MEQJCTM2MDAwIChPRkRNKQorICogMHgwRQkJMTgwMDAgKE9GRE0pCisgKiAweDBGCQkgOTAwMCAoT0ZETSkKKyAqIDB4MTAgLSAxNwktUmVzZXJ2ZWQtCisgKiAweDE4CQkxMTAwMEwgKENDSykKKyAqIDB4MTkJCSA1NTAwTCAoQ0NLKQorICogMHgxQQkJIDIwMDBMIChDQ0spCisgKiAweDFCCQkgMTAwMEwgKENDSykKKyAqIDB4MUMJCTExMDAwUyAoQ0NLKQorICogMHgxRAkJIDU1MDBTIChDQ0spCisgKiAweDFFCQkgMjAwMFMgKENDSykKKyAqIDB4MUYJCS1SZXNlcnZlZC0KICAqCi0gKiByYXRlX2NvZGUgICAweDA5ICAgIDB4MEEgICAgMHgwQiAgICAweDBDICAgIDB4MEQgICAgMHgwRSAgICAweDBGICAgIDB4MTAKLSAqIHJhdGVfa2JwcyAgIDI0MDAwICAgMTIwMDAgICA2MDAwICAgIDU0MDAwICAgMzYwMDAgICAxODAwMCAgIDkwMDAgICAgPwotICoKLSAqIHJhdGVfY29kZSAgIDE3ICAgICAgMTggICAgICAxOSAgICAgIDIwICAgICAgMjEgICAgICAyMiAgICAgIDIzICAgICAgMjQKLSAqIHJhdGVfa2JwcyAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgMTEwMDAKLSAqCi0gKiByYXRlX2NvZGUgICAyNSAgICAgIDI2ICAgICAgMjcgICAgICAyOCAgICAgIDI5ICAgICAgMzAgICAgICAzMSAgICAgIDMyCi0gKiByYXRlX2ticHMgICA1NTAwICAgIDIwMDAgICAgMTAwMCAgICAxMTAwMFMgIDU1MDBTICAgMjAwMFMgICA/ICAgICAgID8KLSAqCi0gKiAiUyIgaW5kaWNhdGVzIENDSyByYXRlcyB3aXRoIHNob3J0IHByZWFtYmxlLgorICogIlMiIGluZGljYXRlcyBDQ0sgcmF0ZXMgd2l0aCBzaG9ydCBwcmVhbWJsZSBhbmQgIkwiIHdpdGggbG9uZyBwcmVhbWJsZS4KICAqCiAgKiBBUjUyMTEgaGFzIGRpZmZlcmVudCByYXRlIGNvZGVzIGZvciBDQ0sgKDgwMi4xMUIpIHJhdGVzLiBJdCBvbmx5IHVzZXMgdGhlCi0gKiBsb3dlc3QgNCBiaXRzLCBzbyB0aGV5IGFyZSB0aGUgc2FtZSBhcyBiZWxvdyB3aXRoIGEgMHhGIG1hc2suCisgKiBsb3dlc3QgNCBiaXRzLCBzbyB0aGV5IGFyZSB0aGUgc2FtZSBhcyBhYm92ZSB3aXRoIGEgMHhGIG1hc2suCiAgKiAoMHhCLCAweEEsIDB4OSBhbmQgMHg4IGZvciAxTSwgMk0sIDUuNU0gYW5kIDExTSkuCiAgKiBXZSBoYW5kbGUgdGhpcyBpbiBhdGg1a19zZXR1cF9iYW5kcygpLgogICovCkBAIC03MzMsMTMgKzkwNCw5IEBACiAjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV8zNk0JMHgwRAogI2RlZmluZSBBVEg1S19SQVRFX0NPREVfNDhNCTB4MDgKICNkZWZpbmUgQVRINUtfUkFURV9DT0RFXzU0TQkweDBDCi0vKiBYUiAqLwotI2RlZmluZSBBVEg1S19SQVRFX0NPREVfWFJfNTAwSwkweDA3Ci0jZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8xTQkweDAyCi0jZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8yTQkweDA2Ci0jZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8zTQkweDAxCiAKLS8qIGFkZGluZyB0aGlzIGZsYWcgdG8gcmF0ZV9jb2RlIGVuYWJsZXMgc2hvcnQgcHJlYW1ibGUgKi8KKy8qIEFkZGluZyB0aGlzIGZsYWcgdG8gcmF0ZV9jb2RlIG9uIEIgcmF0ZXMKKyAqIGVuYWJsZXMgc2hvcnQgcHJlYW1ibGUgKi8KICNkZWZpbmUgQVI1S19TRVRfU0hPUlRfUFJFQU1CTEUgMHgwNAogCiAvKgpAQCAtNzY5LDQ5ICs5MzYsNjUgQEAKIAogLyoqCiAgKiBlbnVtIGF0aDVrX2ludCAtIEhhcmR3YXJlIGludGVycnVwdCBtYXNrcyBoZWxwZXJzCisgKiBAQVI1S19JTlRfUlhPSzogRnJhbWUgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkCisgKiBAQVI1S19JTlRfUlhERVNDOiBSZXF1ZXN0IFJYIGRlc2NyaXB0b3IvUmVhZCBSWCBkZXNjcmlwdG9yCisgKiBAQVI1S19JTlRfUlhFUlI6IEZyYW1lIHJlY2VwdGlvbiBmYWlsZWQKKyAqIEBBUjVLX0lOVF9SWE5PRlJNOiBObyBmcmFtZSByZWNlaXZlZCB3aXRoaW4gYSBzcGVjaWZpZWQgdGltZSBwZXJpb2QKKyAqIEBBUjVLX0lOVF9SWEVPTDogUmVhY2hlZCAiRW5kIE9mIExpc3QiLCBtZWFucyB3ZSBuZWVkIG1vcmUgUlggZGVzY3JpcHRvcnMKKyAqIEBBUjVLX0lOVF9SWE9STjogSW5kaWNhdGVzIHdlIGdvdCBSWCBGSUZPIG92ZXJydW4uIE5vdGUgdGhhdCBSeCBvdmVycnVuIGlzCisgKgkJbm90IGFsd2F5cyBmYXRhbCwgb24gc29tZSBjaGlwcyB3ZSBjYW4gY29udGludWUgb3BlcmF0aW9uCisgKgkJd2l0aG91dCByZXNldHRpbmcgdGhlIGNhcmQsIHRoYXQncyB3aHkgJUFSNUtfSU5UX0ZBVEFMIGlzIG5vdAorICoJCWNvbW1vbiBmb3IgYWxsIGNoaXBzLgorICogQEFSNUtfSU5UX1JYX0FMTDogTWFzayB0byBpZGVudGlmeSBhbGwgUlggcmVsYXRlZCBpbnRlcnJ1cHRzCiAgKgotICogQEFSNUtfSU5UX1JYOiBtYXNrIHRvIGlkZW50aWZ5IHJlY2VpdmVkIGZyYW1lIGludGVycnVwdHMsIG9mIHR5cGUKLSAqCUFSNUtfSVNSX1JYT0sgb3IgQVI1S19JU1JfUlhFUlIKLSAqIEBBUjVLX0lOVF9SWERFU0M6IFJlcXVlc3QgUlggZGVzY3JpcHRvci9SZWFkIFJYIGRlc2NyaXB0b3IgKD8pCi0gKiBAQVI1S19JTlRfUlhOT0ZSTTogTm8gZnJhbWUgcmVjZWl2ZWQgKD8pCi0gKiBAQVI1S19JTlRfUlhFT0w6IHJlY2VpdmVkIEVuZCBPZiBMaXN0IGZvciBWRU9MIChWaXJ0dWFsIEVuZCBPZiBMaXN0KS4gVGhlCi0gKglRdWV1ZSBDb250cm9sIFVuaXQgKFFDVSkgc2lnbmFscyBhbiBFT0wgaW50ZXJydXB0IG9ubHkgaWYgYSBkZXNjcmlwdG9yJ3MKLSAqCUxpbmtQdHIgaXMgTlVMTC4gRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG86Ci0gKglodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS8yMDAzMDIyNTczOS5odG1sCi0gKiBAQVI1S19JTlRfUlhPUk46IEluZGljYXRlcyB3ZSBnb3QgUlggb3ZlcnJ1biAoZWcuIG5vIG1vcmUgZGVzY3JpcHRvcnMpLgotICoJTm90ZSB0aGF0IFJ4IG92ZXJydW4gaXMgbm90IGFsd2F5cyBmYXRhbCwgb24gc29tZSBjaGlwcyB3ZSBjYW4gY29udGludWUKLSAqCW9wZXJhdGlvbiB3aXRob3V0IHJlc2V0dGluZyB0aGUgY2FyZCwgdGhhdCdzIHdoeSBpbnRfZmF0YWwgaXMgbm90Ci0gKgljb21tb24gZm9yIGFsbCBjaGlwcy4KLSAqIEBBUjVLX0lOVF9UWDogbWFzayB0byBpZGVudGlmeSByZWNlaXZlZCBmcmFtZSBpbnRlcnJ1cHRzLCBvZiB0eXBlCi0gKglBUjVLX0lTUl9UWE9LIG9yIEFSNUtfSVNSX1RYRVJSCi0gKiBAQVI1S19JTlRfVFhERVNDOiBSZXF1ZXN0IFRYIGRlc2NyaXB0b3IvUmVhZCBUWCBzdGF0dXMgZGVzY3JpcHRvciAoPykKLSAqIEBBUjVLX0lOVF9UWFVSTjogcmVjZWl2ZWQgd2hlbiB3ZSBzaG91bGQgaW5jcmVhc2UgdGhlIFRYIHRyaWdnZXIgdGhyZXNob2xkCi0gKglXZSBjdXJyZW50bHkgZG8gaW5jcmVtZW50cyBvbiBpbnRlcnJ1cHQgYnkKLSAqCShBUjVLX1RVTkVfTUFYX1RYX0ZJRk9fVEhSRVMgLSBjdXJyZW50X3RyaWdnZXJfbGV2ZWwpIC8gMgorICogQEFSNUtfSU5UX1RYT0s6IEZyYW1lIHRyYW5zbWlzc2lvbiBzdWNjZXNzCisgKiBAQVI1S19JTlRfVFhERVNDOiBSZXF1ZXN0IFRYIGRlc2NyaXB0b3IvUmVhZCBUWCBzdGF0dXMgZGVzY3JpcHRvcgorICogQEFSNUtfSU5UX1RYRVJSOiBGcmFtZSB0cmFuc21pc3Npb24gZmFpbHVyZQorICogQEFSNUtfSU5UX1RYRU9MOiBSZWNlaXZlZCBFbmQgT2YgTGlzdCBmb3IgVkVPTCAoVmlydHVhbCBFbmQgT2YgTGlzdCkuIFRoZQorICoJCVF1ZXVlIENvbnRyb2wgVW5pdCAoUUNVKSBzaWduYWxzIGFuIEVPTCBpbnRlcnJ1cHQgb25seSBpZiBhCisgKgkJZGVzY3JpcHRvcidzIExpbmtQdHIgaXMgTlVMTC4gRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG86CisgKgkJImh0dHA6Ly93d3cuZnJlZXBhdGVudHNvbmxpbmUuY29tLzIwMDMwMjI1NzM5Lmh0bWwiCisgKiBAQVI1S19JTlRfVFhOT0ZSTTogTm8gZnJhbWUgd2FzIHRyYW5zbWl0dGVkIHdpdGhpbiBhIHNwZWNpZmllZCB0aW1lIHBlcmlvZAorICogQEFSNUtfSU5UX1RYVVJOOiBJbmRpY2F0ZXMgd2UgZ290IFRYIEZJRk8gdW5kZXJydW4uIEluIHN1Y2ggY2FzZSB3ZSBzaG91bGQKKyAqCQlpbmNyZWFzZSB0aGUgVFggdHJpZ2dlciB0aHJlc2hvbGQuCisgKiBAQVI1S19JTlRfVFhfQUxMOiBNYXNrIHRvIGlkZW50aWZ5IGFsbCBUWCByZWxhdGVkIGludGVycnVwdHMKKyAqCiAgKiBAQVI1S19JTlRfTUlCOiBJbmRpY2F0ZXMgdGhlIGVpdGhlciBNYW5hZ2VtZW50IEluZm9ybWF0aW9uIEJhc2UgY291bnRlcnMgb3IKLSAqCW9uZSBvZiB0aGUgUEhZIGVycm9yIGNvdW50ZXJzIHJlYWNoZWQgdGhlIG1heGltdW0gdmFsdWUgYW5kIHNob3VsZCBiZQotICoJcmVhZCBhbmQgY2xlYXJlZC4KKyAqCQlvbmUgb2YgdGhlIFBIWSBlcnJvciBjb3VudGVycyByZWFjaGVkIHRoZSBtYXhpbXVtIHZhbHVlIGFuZAorICoJCXNob3VsZCBiZSByZWFkIGFuZCBjbGVhcmVkLgorICogQEFSNUtfSU5UX1NXSTogU29mdHdhcmUgdHJpZ2dlcmVkIGludGVycnVwdC4KICAqIEBBUjVLX0lOVF9SWFBIWTogUlggUEhZIEVycm9yCiAgKiBAQVI1S19JTlRfUlhLQ006IFJYIEtleSBjYWNoZSBtaXNzCiAgKiBAQVI1S19JTlRfU1dCQTogU29mdFdhcmUgQmVhY29uIEFsZXJ0IC0gaW5kaWNhdGVzIGl0cyB0aW1lIHRvIHNlbmQgYQotICoJYmVhY29uIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGluIHNvZnR3YXJlLiBUaGUgYWx0ZXJuYXRpdmUgaXMgaWYgeW91Ci0gKgloYXZlIFZFT0wgc3VwcG9ydCwgaW4gdGhhdCBjYXNlIHlvdSBsZXQgdGhlIGhhcmR3YXJlIGRlYWwgd2l0aCB0aGluZ3MuCisgKgkJYmVhY29uIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGluIHNvZnR3YXJlLiBUaGUgYWx0ZXJuYXRpdmUgaXMgaWYKKyAqCQl5b3UgaGF2ZSBWRU9MIHN1cHBvcnQsIGluIHRoYXQgY2FzZSB5b3UgbGV0IHRoZSBoYXJkd2FyZSBkZWFsCisgKgkJd2l0aCB0aGluZ3MuCisgKiBAQVI1S19JTlRfQlJTU0k6IEJlYWNvbiByZWNlaXZlZCB3aXRoIGFuIFJTU0kgdmFsdWUgYmVsb3cgb3VyIHRocmVzaG9sZAogICogQEFSNUtfSU5UX0JNSVNTOiBJZiBpbiBTVEEgbW9kZSB0aGlzIGluZGljYXRlcyB3ZSBoYXZlIHN0b3BwZWQgc2VlaW5nCi0gKgliZWFjb25zIGZyb20gdGhlIEFQIGhhdmUgYXNzb2NpYXRlZCB3aXRoLCB3ZSBzaG91bGQgcHJvYmFibHkgdHJ5IHRvCi0gKglyZWFzc29jaWF0ZS4gV2hlbiBpbiBJQlNTIG1vZGUgdGhpcyBtaWdodCBtZWFuIHdlIGhhdmUgbm90IHJlY2VpdmVkCi0gKglhbnkgYmVhY29ucyBmcm9tIGFueSBsb2NhbCBzdGF0aW9ucy4gTm90ZSB0aGF0IGV2ZXJ5IHN0YXRpb24gaW4gYW4KLSAqCUlCU1Mgc2NoZWR1bGVzIHRvIHNlbmQgYmVhY29ucyBhdCB0aGUgVGFyZ2V0IEJlYWNvbiBUcmFuc21pc3Npb24gVGltZQotICoJKFRCVFQpIHdpdGggYSByYW5kb20gYmFja29mZi4KLSAqIEBBUjVLX0lOVF9CTlI6IEJlYWNvbiBOb3QgUmVhZHkgaW50ZXJydXB0IC0gPz8KLSAqIEBBUjVLX0lOVF9HUElPOiBHUElPIGludGVycnVwdCBpcyB1c2VkIGZvciBSRiBLaWxsLCBkaXNhYmxlZCBmb3Igbm93Ci0gKgl1bnRpbCBwcm9wZXJseSBoYW5kbGVkCi0gKiBAQVI1S19JTlRfRkFUQUw6IEZhdGFsIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkLCB0eXBpY2FsbHkgY2F1c2VkIGJ5IERNQQotICoJZXJyb3JzLiBUaGVzZSB0eXBlcyBvZiBlcnJvcnMgd2UgY2FuIGVuYWJsZSBzZWVtIHRvIGJlIG9mIHR5cGUKLSAqCUFSNUtfU0lNUjJfTUNBQlQsIEFSNUtfU0lNUjJfU1NFUlIgYW5kIEFSNUtfU0lNUjJfRFBFUlIuCisgKgkJYmVhY29ucyBmcm9tIHRoZSBBUCBoYXZlIGFzc29jaWF0ZWQgd2l0aCwgd2Ugc2hvdWxkIHByb2JhYmx5CisgKgkJdHJ5IHRvIHJlYXNzb2NpYXRlLiBXaGVuIGluIElCU1MgbW9kZSB0aGlzIG1pZ2h0IG1lYW4gd2UgaGF2ZQorICoJCW5vdCByZWNlaXZlZCBhbnkgYmVhY29ucyBmcm9tIGFueSBsb2NhbCBzdGF0aW9ucy4gTm90ZSB0aGF0CisgKgkJZXZlcnkgc3RhdGlvbiBpbiBhbiBJQlNTIHNjaGVkdWxlcyB0byBzZW5kIGJlYWNvbnMgYXQgdGhlCisgKgkJVGFyZ2V0IEJlYWNvbiBUcmFuc21pc3Npb24gVGltZSAoVEJUVCkgd2l0aCBhIHJhbmRvbSBiYWNrb2ZmLgorICogQEFSNUtfSU5UX0JOUjogQmVhY29uIHF1ZXVlIGdvdCB0cmlnZ2VyZWQgKERNQSBiZWFjb24gYWxlcnQpIHdoaWxlIGVtcHR5LgorICogQEFSNUtfSU5UX1RJTTogQmVhY29uIHdpdGggbG9jYWwgc3RhdGlvbidzIFRJTSBiaXQgc2V0CisgKiBAQVI1S19JTlRfRFRJTTogQmVhY29uIHdpdGggRFRJTSBiaXQgYW5kIHplcm8gRFRJTSBjb3VudCByZWNlaXZlZAorICogQEFSNUtfSU5UX0RUSU1fU1lOQzogRFRJTSBzeW5jIGxvc3QKKyAqIEBBUjVLX0lOVF9HUElPOiBHUElPIGludGVycnVwdCBpcyB1c2VkIGZvciBSRiBLaWxsIHN3aXRjaGVzIGNvbm5lY3RlZCB0bworICoJCW91ciBHUElPIHBpbnMuCisgKiBAQVI1S19JTlRfQkNOX1RJTUVPVVQ6IEJlYWNvbiB0aW1lb3V0LCB3ZSB3YWl0ZWQgYWZ0ZXIgVEJUVCBidXQgZ290IG5vdGluZworICogQEFSNUtfSU5UX0NBQl9USU1FT1VUOiBXZSB3YWl0ZWQgZm9yIENBQiB0cmFmZmljIGFmdGVyIHRoZSBiZWFjb24gYnV0IGdvdAorICoJCW5vdGhpbmcgb3IgYW4gaW5jb21wbGV0ZSBDQUIgZnJhbWUgc2VxdWVuY2UuCisgKiBAQVI1S19JTlRfUUNCUk9STjogQSBxdWV1ZSBnb3QgaXQncyBDQlIgY291bnRlciBleHBpcmVkCisgKiBAQVI1S19JTlRfUUNCUlVSTjogQSBxdWV1ZSBnb3QgdHJpZ2dlcmVkIHdpbGUgZW1wdHkKKyAqIEBBUjVLX0lOVF9RVFJJRzogQSBxdWV1ZSBnb3QgdHJpZ2dlcmVkCisgKgorICogQEFSNUtfSU5UX0ZBVEFMOiBGYXRhbCBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZCwgdHlwaWNhbGx5IGNhdXNlZCBieSBidXMvRE1BCisgKgkJZXJyb3JzLiBJbmRpY2F0ZXMgd2UgbmVlZCB0byByZXNldCB0aGUgY2FyZC4KICAqIEBBUjVLX0lOVF9HTE9CQUw6IFVzZWQgdG8gY2xlYXIgYW5kIHNldCB0aGUgSUVSCi0gKiBAQVI1S19JTlRfTk9DQVJEOiBzaWduYWxzIHRoZSBjYXJkIGhhcyBiZWVuIHJlbW92ZWQKLSAqIEBBUjVLX0lOVF9DT01NT046IGNvbW1vbiBpbnRlcnJ1cHRzIHNoYXJlZCBhbW9uZyBNQUNzIHdpdGggdGhlIHNhbWUKLSAqCWJpdCB2YWx1ZQorICogQEFSNUtfSU5UX05PQ0FSRDogU2lnbmFscyB0aGUgY2FyZCBoYXMgYmVlbiByZW1vdmVkCisgKiBAQVI1S19JTlRfQ09NTU9OOiBDb21tb24gaW50ZXJydXB0cyBzaGFyZWQgYW1vbmcgTUFDcyB3aXRoIHRoZSBzYW1lCisgKgkJYml0IHZhbHVlCiAgKgogICogVGhlc2UgYXJlIG1hcHBlZCB0byB0YWtlIGFkdmFudGFnZSBvZiBzb21lIGNvbW1vbiBiaXRzCiAgKiBiZXR3ZWVuIHRoZSBNQUNzLCB0byBiZSBhYmxlIHRvIHNldCBpbnRyIHByb3BlcnRpZXMKQEAgLTg0NywxNSArMTAzMCwxNSBAQAogCUFSNUtfSU5UX0dQSU8JPQkweDAxMDAwMDAwLAogCUFSNUtfSU5UX0JDTl9USU1FT1VUID0JMHgwMjAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLwogCUFSNUtfSU5UX0NBQl9USU1FT1VUID0JMHgwNDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLwotCUFSNUtfSU5UX1JYX0RPUFBMRVIgPQkweDA4MDAwMDAwLCAvKiBOb24gY29tbW9uICovCi0JQVI1S19JTlRfUUNCUk9STiA9CTB4MTAwMDAwMDAsIC8qIE5vbiBjb21tb24gKi8KLQlBUjVLX0lOVF9RQ0JSVVJOID0JMHgyMDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLwotCUFSNUtfSU5UX1FUUklHCT0JMHg0MDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLworCUFSNUtfSU5UX1FDQlJPUk4gPQkweDA4MDAwMDAwLCAvKiBOb24gY29tbW9uICovCisJQVI1S19JTlRfUUNCUlVSTiA9CTB4MTAwMDAwMDAsIC8qIE5vbiBjb21tb24gKi8KKwlBUjVLX0lOVF9RVFJJRwk9CTB4MjAwMDAwMDAsIC8qIE5vbiBjb21tb24gKi8KIAlBUjVLX0lOVF9HTE9CQUwgPQkweDgwMDAwMDAwLAogCiAJQVI1S19JTlRfVFhfQUxMID0gQVI1S19JTlRfVFhPSwogCQl8IEFSNUtfSU5UX1RYREVTQwogCQl8IEFSNUtfSU5UX1RYRVJSCisJCXwgQVI1S19JTlRfVFhOT0ZSTQogCQl8IEFSNUtfSU5UX1RYRU9MCiAJCXwgQVI1S19JTlRfVFhVUk4sCiAKQEAgLTg5MSwxNSArMTA3NCwzMiBAQAogCUFSNUtfSU5UX05PQ0FSRAk9IDB4ZmZmZmZmZmYKIH07CiAKLS8qIG1hc2sgd2hpY2ggY2FsaWJyYXRpb24gaXMgYWN0aXZlIGF0IHRoZSBtb21lbnQgKi8KKy8qKgorICogZW51bSBhdGg1a19jYWxpYnJhdGlvbl9tYXNrIC0gTWFzayB3aGljaCBjYWxpYnJhdGlvbiBpcyBhY3RpdmUgYXQgdGhlIG1vbWVudAorICogQEFSNUtfQ0FMSUJSQVRJT05fRlVMTDogRnVsbCBjYWxpYnJhdGlvbiAoQUdDICsgU0hPUlQpCisgKiBAQVI1S19DQUxJQlJBVElPTl9TSE9SVDogU2hvcnQgY2FsaWJyYXRpb24gKE5GICsgSS9RKQorICogQEFSNUtfQ0FMSUJSQVRJT05fTkY6IE5vaXNlIEZsb29yIGNhbGlicmF0aW9uCisgKiBAQVI1S19DQUxJQlJBVElPTl9BTkk6IEFkYXB0aXZlIE5vaXNlIEltbXVuaXR5CisgKi8KIGVudW0gYXRoNWtfY2FsaWJyYXRpb25fbWFzayB7CiAJQVI1S19DQUxJQlJBVElPTl9GVUxMID0gMHgwMSwKIAlBUjVLX0NBTElCUkFUSU9OX1NIT1JUID0gMHgwMiwKLQlBUjVLX0NBTElCUkFUSU9OX0FOSSA9IDB4MDQsCisJQVI1S19DQUxJQlJBVElPTl9ORiA9IDB4MDQsCisJQVI1S19DQUxJQlJBVElPTl9BTkkgPSAweDA4LAogfTsKIAotLyoKLSAqIFBvd2VyIG1hbmFnZW1lbnQKKy8qKgorICogZW51bSBhdGg1a19wb3dlcl9tb2RlIC0gUG93ZXIgbWFuYWdlbWVudCBtb2RlcworICogQEFSNUtfUE1fVU5ERUZJTkVEOiBVbmRlZmluZWQKKyAqIEBBUjVLX1BNX0FVVE86IEFsbG93IGNhcmQgdG8gc2xlZXAgaWYgcG9zc2libGUKKyAqIEBBUjVLX1BNX0FXQUtFOiBGb3JjZSBjYXJkIHRvIHdha2UgdXAKKyAqIEBBUjVLX1BNX0ZVTExfU0xFRVA6IEZvcmNlIGNhcmQgdG8gZnVsbCBzbGVlcCAoREFOR0VST1VTKQorICogQEFSNUtfUE1fTkVUV09SS19TTEVFUDogQWxsb3cgdG8gc2xlZXAgZm9yIGEgc3BlY2lmaWVkIGR1cmF0aW9uCisgKgorICogQ3VycmVudGx5IG9ubHkgUE1fQVdBS0UgaXMgdXNlZCwgRlVMTF9TTEVFUCBhbmQgTkVUV09SS19TTEVFUC9BVVRPCisgKiBhcmUgYWxzbyBrbm93biB0byBoYXZlIHByb2JsZW1zIG9uIHNvbWUgY2FyZHMuIFRoaXMgaXMgbm90IGEgYmlnCisgKiBwcm9ibGVtIHRob3VnaCBiZWNhdXNlIHdlIGNhbiBoYXZlIGFsbW9zdCB0aGUgc2FtZSBlZmZlY3QgYXMKKyAqIEZVTExfU0xFRVAgYnkgcHV0dGluZyBjYXJkIG9uIHdhcm0gcmVzZXQgKGl0J3MgYWxtb3N0IHBvd2VyZWQgZG93bikuCiAgKi8KIGVudW0gYXRoNWtfcG93ZXJfbW9kZSB7CiAJQVI1S19QTV9VTkRFRklORUQgPSAwLApAQCAtOTU3LDYgKzExNTcsOCBAQAogCX0gY2FwX3F1ZXVlczsKIAogCWJvb2wgY2FwX2hhc19waHllcnJfY291bnRlcnM7CisJYm9vbCBjYXBfaGFzX21ycl9zdXBwb3J0OworCWJvb2wgY2FwX25lZWRzXzJHSHpfb3ZyOwogfTsKIAogLyogc2l6ZSBvZiBub2lzZSBmbG9vciBoaXN0b3J5IChrZWVwIGl0IGEgcG93ZXIgb2YgdHdvKSAqLwpAQCAtMTA3MiwxMyArMTI3NCwxMSBAQAogCWRtYV9hZGRyX3QJCWRlc2NfZGFkZHI7CS8qIERNQSAocGh5c2ljYWwpIGFkZHJlc3MgKi8KIAlzaXplX3QJCQlkZXNjX2xlbjsJLyogc2l6ZSBvZiBUWC9SWCBkZXNjcmlwdG9ycyAqLwogCi0JREVDTEFSRV9CSVRNQVAoc3RhdHVzLCA2KTsKKwlERUNMQVJFX0JJVE1BUChzdGF0dXMsIDQpOwogI2RlZmluZSBBVEhfU1RBVF9JTlZBTElECTAJCS8qIGRpc2FibGUgaGFyZHdhcmUgYWNjZXNzZXMgKi8KLSNkZWZpbmUgQVRIX1NUQVRfTVJSRVRSWQkxCQkvKiBtdWx0aS1yYXRlIHJldHJ5IHN1cHBvcnQgKi8KLSNkZWZpbmUgQVRIX1NUQVRfUFJPTUlTQwkyCi0jZGVmaW5lIEFUSF9TVEFUX0xFRFNPRlQJMwkJLyogZW5hYmxlIExFRCBncGlvIHN0YXR1cyAqLwotI2RlZmluZSBBVEhfU1RBVF9TVEFSVEVECTQJCS8qIG9wZW5lZCAmIGlycXMgZW5hYmxlZCAqLwotI2RlZmluZSBBVEhfU1RBVF8yR19ESVNBQkxFRAk1CQkvKiBtdWx0aWJhbmQgcmFkaW8gd2l0aG91dCAyRyAqLworI2RlZmluZSBBVEhfU1RBVF9QUk9NSVNDCTEKKyNkZWZpbmUgQVRIX1NUQVRfTEVEU09GVAkyCQkvKiBlbmFibGUgTEVEIGdwaW8gc3RhdHVzICovCisjZGVmaW5lIEFUSF9TVEFUX1NUQVJURUQJMwkJLyogb3BlbmVkICYgaXJxcyBlbmFibGVkICovCiAKIAl1bnNpZ25lZCBpbnQJCWZpbHRlcl9mbGFnczsJLyogSFcgZmxhZ3MsIEFSNUtfUlhfRklMVEVSXyogKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmN1cmNoYW47CS8qIGN1cnJlbnQgaC93IGNoYW5uZWwgKi8KQEAgLTEwOTcsNiArMTI5Nyw3IEBACiAJCQkJbGVkX29uOwkJLyogcGluIHNldHRpbmcgZm9yIExFRCBvbiAqLwogCiAJc3RydWN0IHdvcmtfc3RydWN0CXJlc2V0X3dvcms7CS8qIGRlZmVycmVkIGNoaXAgcmVzZXQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJY2FsaWJfd29yazsJLyogZGVmZXJyZWQgcGh5IGNhbGlicmF0aW9uICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJ4YnVmOwkJLyogcmVjZWl2ZSBidWZmZXIgKi8KIAlzcGlubG9ja190CQlyeGJ1ZmxvY2s7CkBAIC0xMTEzLDggKzEzMTQsNiBAQAogCiAJc3RydWN0IGF0aDVrX3Jma2lsbAlyZl9raWxsOwogCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CWNhbGliOwkJLyogY2FsaWJyYXRpb24gdGFza2xldCAqLwotCiAJc3BpbmxvY2tfdAkJYmxvY2s7CQkvKiBwcm90ZWN0cyBiZWFjb24gKi8KIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJYmVhY29udHE7CS8qIGJlYWNvbiBpbnRyIHRhc2tsZXQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWJjYnVmOwkJLyogYmVhY29uIGJ1ZmZlciAqLwpAQCAtMTE0NCw3ICsxMzQzLDcgQEAKIAllbnVtIGF0aDVrX2ludAkJYWhfaW1yOwogCiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICphaF9jdXJyZW50X2NoYW5uZWw7Ci0JYm9vbAkJCWFoX2NhbGlicmF0aW9uOworCWJvb2wJCQlhaF9pcV9jYWxfbmVlZGVkOwogCWJvb2wJCQlhaF9zaW5nbGVfY2hpcDsKIAogCWVudW0gYXRoNWtfdmVyc2lvbglhaF92ZXJzaW9uOwpAQCAtMTE4Nyw3ICsxMzg2LDEzIEBACiAJdTMyCQkJYWhfdHhxX2ltcl9jYnJ1cm47CiAJdTMyCQkJYWhfdHhxX2ltcl9xdHJpZzsKIAl1MzIJCQlhaF90eHFfaW1yX25vZnJtOwotCXUzMgkJCWFoX3R4cV9pc3I7CisKKwl1MzIJCQlhaF90eHFfaXNyX3R4b2tfYWxsOworCXUzMgkJCWFoX3R4cV9pc3JfdHh1cm47CisJdTMyCQkJYWhfdHhxX2lzcl9xY2Jvcm47CisJdTMyCQkJYWhfdHhxX2lzcl9xY2J1cm47CisJdTMyCQkJYWhfdHhxX2lzcl9xdHJpZzsKKwogCXUzMgkJCSphaF9yZl9iYW5rczsKIAlzaXplX3QJCQlhaF9yZl9iYW5rc19zaXplOwogCXNpemVfdAkJCWFoX3JmX3JlZ3NfY291bnQ7CkBAIC0xMjI4LDggKzE0MzMsOCBAQAogCiAJLyogQ2FsaWJyYXRpb24gdGltZXN0YW1wICovCiAJdW5zaWduZWQgbG9uZwkJYWhfY2FsX25leHRfZnVsbDsKKwl1bnNpZ25lZCBsb25nCQlhaF9jYWxfbmV4dF9zaG9ydDsKIAl1bnNpZ25lZCBsb25nCQlhaF9jYWxfbmV4dF9hbmk7Ci0JdW5zaWduZWQgbG9uZwkJYWhfY2FsX25leHRfbmY7CiAKIAkvKiBDYWxpYnJhdGlvbiBtYXNrICovCiAJdTgJCQlhaF9jYWxfbWFzazsKQEAgLTEzMzgsMTEgKzE1NDMsMTEgQEAKIHU2NCBhdGg1a19od19nZXRfdHNmNjQoc3RydWN0IGF0aDVrX2h3ICphaCk7CiB2b2lkIGF0aDVrX2h3X3NldF90c2Y2NChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1NjQgdHNmNjQpOwogdm9pZCBhdGg1a19od19yZXNldF90c2Yoc3RydWN0IGF0aDVrX2h3ICphaCk7Ci12b2lkIGF0aDVrX2h3X2luaXRfYmVhY29uKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBuZXh0X2JlYWNvbiwgdTMyIGludGVydmFsKTsKK3ZvaWQgYXRoNWtfaHdfaW5pdF9iZWFjb25fdGltZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBuZXh0X2JlYWNvbiwKKwkJCQkJCQl1MzIgaW50ZXJ2YWwpOwogYm9vbCBhdGg1a19od19jaGVja19iZWFjb25fdGltZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBpbnR2YWwpOwogLyogSW5pdCBmdW5jdGlvbiAqLwotdm9pZCBhdGg1a19od19wY3VfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGUsCi0JCQkJCQkJCXU4IG1vZGUpOwordm9pZCBhdGg1a19od19wY3VfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGUpOwogCiAvKiBRdWV1ZSBDb250cm9sIFVuaXQsIERGUyBDb250cm9sIFVuaXQgRnVuY3Rpb25zICovCiBpbnQgYXRoNWtfaHdfZ2V0X3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IHF1ZXVlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0dGFjaC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0dGFjaC5jCmluZGV4IDkxNjI3ZGQuLmQ3MTE0YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hdHRhY2guYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXR0YWNoLmMKQEAgLTI3LDggKzI3LDcgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKioKLSAqIGF0aDVrX2h3X3Bvc3QgLSBQb3dlciBPbiBTZWxmIFRlc3QgaGVscGVyIGZ1bmN0aW9uCi0gKgorICogYXRoNWtfaHdfcG9zdCgpIC0gUG93ZXIgT24gU2VsZiBUZXN0IGhlbHBlciBmdW5jdGlvbgogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICovCiBzdGF0aWMgaW50IGF0aDVrX2h3X3Bvc3Qoc3RydWN0IGF0aDVrX2h3ICphaCkKQEAgLTkyLDggKzkxLDcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19pbml0IC0gQ2hlY2sgaWYgaHcgaXMgc3VwcG9ydGVkIGFuZCBpbml0IHRoZSBuZWVkZWQgc3RydWN0cwotICoKKyAqIGF0aDVrX2h3X2luaXQoKSAtIENoZWNrIGlmIGh3IGlzIHN1cHBvcnRlZCBhbmQgaW5pdCB0aGUgbmVlZGVkIHN0cnVjdHMKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UKICAqCiAgKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCwgcGVyZm9ybSBhIFBPU1QgYW5kIGluaXRpYWxpemUgdGhlIG5lZWRlZApAQCAtMjk4LDcgKzI5Niw3IEBACiAKIAkJLyogUmVzZXQgU0VSREVTIHRvIGxvYWQgbmV3IHNldHRpbmdzICovCiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMDAwMCwgQVI1S19QQ0lFX1NFUkRFU19SRVNFVCk7Ci0JCW1kZWxheSgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCX0KIAogCS8qIEdldCBtaXNjIGNhcGFiaWxpdGllcyAqLwpAQCAtMzA4LDExICszMDYsNiBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlpZiAodGVzdF9iaXQoQVRIX1NUQVRfMkdfRElTQUJMRUQsIGFoLT5zdGF0dXMpKSB7Ci0JCV9fY2xlYXJfYml0KEFSNUtfTU9ERV8xMUIsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOwotCQlfX2NsZWFyX2JpdChBUjVLX01PREVfMTFHLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKTsKLQl9Ci0KIAkvKiBDcnlwdG8gc2V0dGluZ3MgKi8KIAljb21tb24tPmtleW1heCA9IChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/CiAJCQkgIEFSNUtfS0VZVEFCTEVfU0laRV81MjEwIDogQVI1S19LRVlUQUJMRV9TSVpFXzUyMTEpOwpAQCAtMzQ5LDggKzM0Miw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfZGVpbml0IC0gRnJlZSB0aGUgYXRoNWtfaHcgc3RydWN0Ci0gKgorICogYXRoNWtfaHdfZGVpbml0KCkgLSBGcmVlIHRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKi8KIHZvaWQgYXRoNWtfaHdfZGVpbml0KHN0cnVjdCBhdGg1a19odyAqYWgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYwppbmRleCBiMzQ2ZDA0Li4xNzhhNGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMKQEAgLTgwLDYgKzgwLDExIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoZmFzdGNoYW5zd2l0Y2gsIG1vZHBhcmFtX2Zhc3RjaGFuc3dpdGNoLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmFzdGNoYW5zd2l0Y2gsICJFbmFibGUgZmFzdCBjaGFubmVsIHN3aXRjaGluZyBmb3IgQVIyNDEzL0FSNTQxMyByYWRpb3MuIik7CiAKK3N0YXRpYyBpbnQgYXRoNWtfbW9kcGFyYW1fbm9faHdfcmZraWxsX3N3aXRjaDsKK21vZHVsZV9wYXJhbV9uYW1lZChub19od19yZmtpbGxfc3dpdGNoLCBhdGg1a19tb2RwYXJhbV9ub19od19yZmtpbGxfc3dpdGNoLAorCQkJCQkJCQlib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9faHdfcmZraWxsX3N3aXRjaCwgIklnbm9yZSB0aGUgR1BJTyBSRktpbGwgc3dpdGNoIHN0YXRlIik7CisKIAogLyogTW9kdWxlIGluZm8gKi8KIE1PRFVMRV9BVVRIT1IoIkppcmkgU2xhYnkiKTsKQEAgLTE4Myw3ICsxODgsNiBAQAogCXsgLmJpdHJhdGUgPSA1NDAsCiAJICAuaHdfdmFsdWUgPSBBVEg1S19SQVRFX0NPREVfNTRNLAogCSAgLmZsYWdzID0gMCB9LAotCS8qIFhSIG1pc3NpbmcgKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgdTY0IGF0aDVrX2V4dGVuZF90c2Yoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHJzdGFtcCkKQEAgLTcyMSwyMiArNzI1LDI1IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfdW5tYXA7CiAKLQltZW1zZXQobXJyX3JhdGUsIDAsIHNpemVvZihtcnJfcmF0ZSkpOwotCW1lbXNldChtcnJfdHJpZXMsIDAsIHNpemVvZihtcnJfdHJpZXMpKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXJhdGUgPSBpZWVlODAyMTFfZ2V0X2FsdF9yZXRyeV9yYXRlKGFoLT5odywgaW5mbywgaSk7Ci0JCWlmICghcmF0ZSkKLQkJCWJyZWFrOworCS8qIFNldCB1cCBNUlIgZGVzY3JpcHRvciAqLworCWlmIChhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9oYXNfbXJyX3N1cHBvcnQpIHsKKwkJbWVtc2V0KG1ycl9yYXRlLCAwLCBzaXplb2YobXJyX3JhdGUpKTsKKwkJbWVtc2V0KG1ycl90cmllcywgMCwgc2l6ZW9mKG1ycl90cmllcykpOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlyYXRlID0gaWVlZTgwMjExX2dldF9hbHRfcmV0cnlfcmF0ZShhaC0+aHcsIGluZm8sIGkpOworCQkJaWYgKCFyYXRlKQorCQkJCWJyZWFrOwogCi0JCW1ycl9yYXRlW2ldID0gcmF0ZS0+aHdfdmFsdWU7Ci0JCW1ycl90cmllc1tpXSA9IGluZm8tPmNvbnRyb2wucmF0ZXNbaSArIDFdLmNvdW50OworCQkJbXJyX3JhdGVbaV0gPSByYXRlLT5od192YWx1ZTsKKwkJCW1ycl90cmllc1tpXSA9IGluZm8tPmNvbnRyb2wucmF0ZXNbaSArIDFdLmNvdW50OworCQl9CisKKwkJYXRoNWtfaHdfc2V0dXBfbXJyX3R4X2Rlc2MoYWgsIGRzLAorCQkJbXJyX3JhdGVbMF0sIG1ycl90cmllc1swXSwKKwkJCW1ycl9yYXRlWzFdLCBtcnJfdHJpZXNbMV0sCisJCQltcnJfcmF0ZVsyXSwgbXJyX3RyaWVzWzJdKTsKIAl9CiAKLQlhdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYyhhaCwgZHMsCi0JCW1ycl9yYXRlWzBdLCBtcnJfdHJpZXNbMF0sCi0JCW1ycl9yYXRlWzFdLCBtcnJfdHJpZXNbMV0sCi0JCW1ycl9yYXRlWzJdLCBtcnJfdHJpZXNbMl0pOwotCiAJZHMtPmRzX2xpbmsgPSAwOwogCWRzLT5kc19kYXRhID0gYmYtPnNrYmFkZHI7CiAKQEAgLTE2ODksNyArMTY5Niw3IEBACiAJc3RydWN0IGF0aDVrX2h3ICphaCA9ICh2b2lkICopZGF0YTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUjVLX05VTV9UWF9RVUVVRVM7IGkrKykKLQkJaWYgKGFoLT50eHFzW2ldLnNldHVwICYmIChhaC0+YWhfdHhxX2lzciAmIEJJVChpKSkpCisJCWlmIChhaC0+dHhxc1tpXS5zZXR1cCAmJiAoYWgtPmFoX3R4cV9pc3JfdHhva19hbGwgJiBCSVQoaSkpKQogCQkJYXRoNWtfdHhfcHJvY2Vzc3EoYWgsICZhaC0+dHhxc1tpXSk7CiAKIAlhaC0+dHhfcGVuZGluZyA9IGZhbHNlOwpAQCAtMjAwNSw3ICsyMDEyLDcgQEAKIAlhaC0+bmV4dHRidHQgPSBuZXh0dGJ0dDsKIAogCWludHZhbCB8PSBBUjVLX0JFQUNPTl9FTkE7Ci0JYXRoNWtfaHdfaW5pdF9iZWFjb24oYWgsIG5leHR0YnR0LCBpbnR2YWwpOworCWF0aDVrX2h3X2luaXRfYmVhY29uX3RpbWVycyhhaCwgbmV4dHRidHQsIGludHZhbCk7CiAKIAkvKgogCSAqIGRlYnVnZ2luZyBvdXRwdXQgbGFzdCBpbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgdGltZSBjcml0aWNhbCBhc3BlY3QKQEAgLTIxMTIsMTYgKzIxMTksMjkgQEAKIGF0aDVrX2ludHJfY2FsaWJyYXRpb25fcG9sbChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9hbmkpICYmCi0JICAgICEoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSkgewotCQkvKiBydW4gQU5JIG9ubHkgd2hlbiBmdWxsIGNhbGlicmF0aW9uIGlzIG5vdCBhY3RpdmUgKi8KKwkgICAhKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fRlVMTCkgJiYKKwkgICAhKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fU0hPUlQpKSB7CisKKwkJLyogUnVuIEFOSSBvbmx5IHdoZW4gY2FsaWJyYXRpb24gaXMgbm90IGFjdGl2ZSAqLworCiAJCWFoLT5haF9jYWxfbmV4dF9hbmkgPSBqaWZmaWVzICsKIAkJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9BTkkpOwogCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YW5pX3Rhc2tsZXQpOwogCi0JfSBlbHNlIGlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9mdWxsKSkgewotCQlhaC0+YWhfY2FsX25leHRfZnVsbCA9IGppZmZpZXMgKwotCQkJbXNlY3NfdG9famlmZmllcyhBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0ZVTEwpOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+Y2FsaWIpOworCX0gZWxzZSBpZiAodGltZV9pc19iZWZvcmVfZXFfamlmZmllcyhhaC0+YWhfY2FsX25leHRfc2hvcnQpICYmCisJCSEoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSAmJgorCQkhKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fU0hPUlQpKSB7CisKKwkJLyogUnVuIGNhbGlicmF0aW9uIG9ubHkgd2hlbiBhbm90aGVyIGNhbGlicmF0aW9uCisJCSAqIGlzIG5vdCBydW5uaW5nLgorCQkgKgorCQkgKiBOb3RlOiBUaGlzIGlzIGZvciBib3RoIGZ1bGwvc2hvcnQgY2FsaWJyYXRpb24sCisJCSAqIGlmIGl0J3MgdGltZSBmb3IgYSBmdWxsIG9uZSwgYXRoNWtfY2FsaWJyYXRlX3dvcmsgd2lsbCBkZWFsCisJCSAqIHdpdGggaXQuICovCisKKwkJYWgtPmFoX2NhbF9uZXh0X3Nob3J0ID0gamlmZmllcyArCisJCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfU0hPUlQpOworCQlpZWVlODAyMTFfcXVldWVfd29yayhhaC0+aHcsICZhaC0+Y2FsaWJfd29yayk7CiAJfQogCS8qIHdlIGNvdWxkIHVzZSBTV0kgdG8gZ2VuZXJhdGUgZW5vdWdoIGludGVycnVwdHMgdG8gbWVldCBvdXIKIAkgKiBjYWxpYnJhdGlvbiBpbnRlcnZhbCByZXF1aXJlbWVudHMsIGlmIG5lY2Vzc2FyeToKQEAgLTIxNDksNjkgKzIxNjksMTEwIEBACiAJZW51bSBhdGg1a19pbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBjb3VudGVyID0gMTAwMDsKIAorCisJLyoKKwkgKiBJZiBodyBpcyBub3QgcmVhZHkgKG9yIGRldGFjaGVkKSBhbmQgd2UgZ2V0IGFuCisJICogaW50ZXJydXB0LCBvciBpZiB3ZSBoYXZlIG5vIGludGVycnVwdHMgcGVuZGluZworCSAqICh0aGF0IG1lYW5zIGl0J3Mgbm90IGZvciB1cykgc2tpcCBpdC4KKwkgKgorCSAqIE5PVEU6IEdyb3VwIDAvMSBQQ0kgaW50ZXJmYWNlIHJlZ2lzdGVycyBhcmUgbm90CisJICogc3VwcG9ydGVkIG9uIFdpU09Dcywgc28gd2UgY2FuJ3QgY2hlY2sgZm9yIHBlbmRpbmcKKwkgKiBpbnRlcnJ1cHRzIChJU1IgYmVsb25ncyB0byBhbm90aGVyIHJlZ2lzdGVyIGdyb3VwCisJICogc28gd2UgYXJlIG9rKS4KKwkgKi8KIAlpZiAodW5saWtlbHkodGVzdF9iaXQoQVRIX1NUQVRfSU5WQUxJRCwgYWgtPnN0YXR1cykgfHwKLQkJKChhdGg1a19nZXRfYnVzX3R5cGUoYWgpICE9IEFUSF9BSEIpICYmCi0JCQkJIWF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhhaCkpKSkKKwkJCSgoYXRoNWtfZ2V0X2J1c190eXBlKGFoKSAhPSBBVEhfQUhCKSAmJgorCQkJIWF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhhaCkpKSkKIAkJcmV0dXJuIElSUV9OT05FOwogCisJLyoqIE1haW4gbG9vcCAqKi8KIAlkbyB7Ci0JCWF0aDVrX2h3X2dldF9pc3IoYWgsICZzdGF0dXMpOwkJLyogTkI6IGNsZWFycyBJUlEgdG9vICovCisJCWF0aDVrX2h3X2dldF9pc3IoYWgsICZzdGF0dXMpOwkvKiBOQjogY2xlYXJzIElSUSB0b28gKi8KKwogCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0lOVFIsICJzdGF0dXMgMHgleC8weCV4XG4iLAogCQkJCXN0YXR1cywgYWgtPmltYXNrKTsKKworCQkvKgorCQkgKiBGYXRhbCBodyBlcnJvciAtPiBMb2cgYW5kIHJlc2V0CisJCSAqCisJCSAqIEZhdGFsIGVycm9ycyBhcmUgdW5yZWNvdmVyYWJsZSBzbyB3ZSBoYXZlIHRvCisJCSAqIHJlc2V0IHRoZSBjYXJkLiBUaGVzZSBlcnJvcnMgaW5jbHVkZSBidXMgYW5kCisJCSAqIGRtYSBlcnJvcnMuCisJCSAqLwogCQlpZiAodW5saWtlbHkoc3RhdHVzICYgQVI1S19JTlRfRkFUQUwpKSB7Ci0JCQkvKgotCQkJICogRmF0YWwgZXJyb3JzIGFyZSB1bnJlY292ZXJhYmxlLgotCQkJICogVHlwaWNhbGx5IHRoZXNlIGFyZSBjYXVzZWQgYnkgRE1BIGVycm9ycy4KLQkJCSAqLworCiAJCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1JFU0VULAogCQkJCSAgImZhdGFsIGludCwgcmVzZXR0aW5nXG4iKTsKIAkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKGFoLT5odywgJmFoLT5yZXNldF93b3JrKTsKKworCQkvKgorCQkgKiBSWCBPdmVycnVuIC0+IENvdW50IGFuZCByZXNldCBpZiBuZWVkZWQKKwkJICoKKwkJICogUmVjZWl2ZSBidWZmZXJzIGFyZSBmdWxsLiBFaXRoZXIgdGhlIGJ1cyBpcyBidXN5IG9yCisJCSAqIHRoZSBDUFUgaXMgbm90IGZhc3QgZW5vdWdoIHRvIHByb2Nlc3MgYWxsIHJlY2VpdmVkCisJCSAqIGZyYW1lcy4KKwkJICovCiAJCX0gZWxzZSBpZiAodW5saWtlbHkoc3RhdHVzICYgQVI1S19JTlRfUlhPUk4pKSB7CisKIAkJCS8qCi0JCQkgKiBSZWNlaXZlIGJ1ZmZlcnMgYXJlIGZ1bGwuIEVpdGhlciB0aGUgYnVzIGlzIGJ1c3kgb3IKLQkJCSAqIHRoZSBDUFUgaXMgbm90IGZhc3QgZW5vdWdoIHRvIHByb2Nlc3MgYWxsIHJlY2VpdmVkCi0JCQkgKiBmcmFtZXMuCiAJCQkgKiBPbGRlciBjaGlwc2V0cyBuZWVkIGEgcmVzZXQgdG8gY29tZSBvdXQgb2YgdGhpcwogCQkJICogY29uZGl0aW9uLCBidXQgd2UgdHJlYXQgaXQgYXMgUlggZm9yIG5ld2VyIGNoaXBzLgotCQkJICogV2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoaWNoIHZlcnNpb25zIG5lZWQgYSByZXNldCAtCisJCQkgKiBXZSBkb24ndCBrbm93IGV4YWN0bHkgd2hpY2ggdmVyc2lvbnMgbmVlZCBhIHJlc2V0CiAJCQkgKiB0aGlzIGd1ZXNzIGlzIGNvcGllZCBmcm9tIHRoZSBIQUwuCiAJCQkgKi8KIAkJCWFoLT5zdGF0cy5yeG9ybl9pbnRyKys7CisKIAkJCWlmIChhaC0+YWhfbWFjX3NyZXYgPCBBUjVLX1NSRVZfQVI1MjEyKSB7CiAJCQkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19SRVNFVCwKIAkJCQkJICAicnggb3ZlcnJ1biwgcmVzZXR0aW5nXG4iKTsKIAkJCQlpZWVlODAyMTFfcXVldWVfd29yayhhaC0+aHcsICZhaC0+cmVzZXRfd29yayk7CiAJCQl9IGVsc2UKIAkJCQlhdGg1a19zY2hlZHVsZV9yeChhaCk7CisKIAkJfSBlbHNlIHsKKworCQkJLyogU29mdHdhcmUgQmVhY29uIEFsZXJ0IC0+IFNjaGVkdWxlIGJlYWNvbiB0YXNrbGV0ICovCiAJCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfU1dCQSkKIAkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZhaC0+YmVhY29udHEpOwogCi0JCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfUlhFT0wpIHsKLQkJCQkvKgotCQkJCSogTkI6IHRoZSBoYXJkd2FyZSBzaG91bGQgcmUtcmVhZCB0aGUgbGluayB3aGVuCi0JCQkJKiAgICAgUlhFIGJpdCBpcyB3cml0dGVuLCBidXQgaXQgZG9lc24ndCB3b3JrIGF0Ci0JCQkJKiAgICAgbGVhc3Qgb24gb2xkZXIgaGFyZHdhcmUgcmV2cy4KLQkJCQkqLworCQkJLyoKKwkJCSAqIE5vIG1vcmUgUlggZGVzY3JpcHRvcnMgLT4gSnVzdCBjb3VudAorCQkJICoKKwkJCSAqIE5COiB0aGUgaGFyZHdhcmUgc2hvdWxkIHJlLXJlYWQgdGhlIGxpbmsgd2hlbgorCQkJICogICAgIFJYRSBiaXQgaXMgd3JpdHRlbiwgYnV0IGl0IGRvZXNuJ3Qgd29yayBhdAorCQkJICogICAgIGxlYXN0IG9uIG9sZGVyIGhhcmR3YXJlIHJldnMuCisJCQkgKi8KKwkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9SWEVPTCkKIAkJCQlhaC0+c3RhdHMucnhlb2xfaW50cisrOwotCQkJfQotCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX1RYVVJOKSB7Ci0JCQkJLyogYnVtcCB0eCB0cmlnZ2VyIGxldmVsICovCisKKworCQkJLyogVFggVW5kZXJydW4gLT4gQnVtcCB0eCB0cmlnZ2VyIGxldmVsICovCisJCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfVFhVUk4pCiAJCQkJYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbChhaCwgdHJ1ZSk7Ci0JCQl9CisKKwkJCS8qIFJYIC0+IFNjaGVkdWxlIHJ4IHRhc2tsZXQgKi8KIAkJCWlmIChzdGF0dXMgJiAoQVI1S19JTlRfUlhPSyB8IEFSNUtfSU5UX1JYRVJSKSkKIAkJCQlhdGg1a19zY2hlZHVsZV9yeChhaCk7Ci0JCQlpZiAoc3RhdHVzICYgKEFSNUtfSU5UX1RYT0sgfCBBUjVLX0lOVF9UWERFU0MKLQkJCQkJfCBBUjVLX0lOVF9UWEVSUiB8IEFSNUtfSU5UX1RYRU9MKSkKKworCQkJLyogVFggLT4gU2NoZWR1bGUgdHggdGFza2xldCAqLworCQkJaWYgKHN0YXR1cyAmIChBUjVLX0lOVF9UWE9LCisJCQkJCXwgQVI1S19JTlRfVFhERVNDCisJCQkJCXwgQVI1S19JTlRfVFhFUlIKKwkJCQkJfCBBUjVLX0lOVF9UWEVPTCkpCiAJCQkJYXRoNWtfc2NoZWR1bGVfdHgoYWgpOwotCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX0JNSVNTKSB7Ci0JCQkJLyogVE9ETyAqLwotCQkJfQorCisJCQkvKiBNaXNzZWQgYmVhY29uIC0+IFRPRE8KKwkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9CTUlTUykKKwkJCSovCisKKwkJCS8qIE1JQiBldmVudCAtPiBVcGRhdGUgY291bnRlcnMgYW5kIG5vdGlmeSBBTkkgKi8KIAkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9NSUIpIHsKIAkJCQlhaC0+c3RhdHMubWliX2ludHIrKzsKIAkJCQlhdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzKGFoKTsKIAkJCQlhdGg1a19hbmlfbWliX2ludHIoYWgpOwogCQkJfQorCisJCQkvKiBHUElPIC0+IE5vdGlmeSBSRktpbGwgbGF5ZXIgKi8KIAkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9HUElPKQogCQkJCXRhc2tsZXRfc2NoZWR1bGUoJmFoLT5yZl9raWxsLnRvZ2dsZXEpOwogCkBAIC0yMjIyLDEyICsyMjgzLDE5IEBACiAKIAl9IHdoaWxlIChhdGg1a19od19pc19pbnRyX3BlbmRpbmcoYWgpICYmIC0tY291bnRlciA+IDApOwogCisJLyoKKwkgKiBVbnRpbCB3ZSBoYW5kbGUgcngvdHggaW50ZXJydXB0cyBtYXNrIHRoZW0gb24gSU1SCisJICoKKwkgKiBOT1RFOiBhaC0+KHJ4L3R4KV9wZW5kaW5nIGFyZSBzZXQgd2hlbiBzY2hlZHVsaW5nIHRoZSB0YXNrbGV0cworCSAqIGFuZCB1bnNldCBhZnRlciB3ZSAndmUgaGFuZGxlZCB0aGUgaW50ZXJydXB0cy4KKwkgKi8KIAlpZiAoYWgtPnJ4X3BlbmRpbmcgfHwgYWgtPnR4X3BlbmRpbmcpCiAJCWF0aDVrX3NldF9jdXJyZW50X2ltYXNrKGFoKTsKIAogCWlmICh1bmxpa2VseSghY291bnRlcikpCiAJCUFUSDVLX1dBUk4oYWgsICJ0b28gbWFueSBpbnRlcnJ1cHRzLCBnaXZpbmcgdXAgZm9yIG5vd1xuIik7CiAKKwkvKiBGaXJlIHVwIGNhbGlicmF0aW9uIHBvbGwgKi8KIAlhdGg1a19pbnRyX2NhbGlicmF0aW9uX3BvbGwoYWgpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMjIzOCw0MSArMjMwNiw1OCBAQAogICogZm9yIHRlbXBlcmF0dXJlL2Vudmlyb25tZW50IGNoYW5nZXMuCiAgKi8KIHN0YXRpYyB2b2lkCi1hdGg1a190YXNrbGV0X2NhbGlicmF0ZSh1bnNpZ25lZCBsb25nIGRhdGEpCithdGg1a19jYWxpYnJhdGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9ICh2b2lkICopZGF0YTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGg1a19odywKKwkJY2FsaWJfd29yayk7CiAKLQkvKiBPbmx5IGZ1bGwgY2FsaWJyYXRpb24gZm9yIG5vdyAqLwotCWFoLT5haF9jYWxfbWFzayB8PSBBUjVLX0NBTElCUkFUSU9OX0ZVTEw7CisJLyogU2hvdWxkIHdlIHJ1biBhIGZ1bGwgY2FsaWJyYXRpb24gPyAqLworCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9mdWxsKSkgeworCisJCWFoLT5haF9jYWxfbmV4dF9mdWxsID0gamlmZmllcyArCisJCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfRlVMTCk7CisJCWFoLT5haF9jYWxfbWFzayB8PSBBUjVLX0NBTElCUkFUSU9OX0ZVTEw7CisKKwkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsCisJCQkJInJ1bm5pbmcgZnVsbCBjYWxpYnJhdGlvblxuIik7CisKKwkJaWYgKGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShhaCkgPT0gQVI1S19SRkdBSU5fTkVFRF9DSEFOR0UpIHsKKwkJCS8qCisJCQkgKiBSZmdhaW4gaXMgb3V0IG9mIGJvdW5kcywgcmVzZXQgdGhlIGNoaXAKKwkJCSAqIHRvIGxvYWQgbmV3IGdhaW4gdmFsdWVzLgorCQkJICovCisJCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1JFU0VULAorCQkJCQkiZ290IG5ldyByZmdhaW4sIHJlc2V0dGluZ1xuIik7CisJCQlpZWVlODAyMTFfcXVldWVfd29yayhhaC0+aHcsICZhaC0+cmVzZXRfd29yayk7CisJCX0KKworCQkvKiBUT0RPOiBPbiBmdWxsIGNhbGlicmF0aW9uIHdlIHNob3VsZCBzdG9wIFRYIGhlcmUsCisJCSAqIHNvIHRoYXQgaXQgZG9lc24ndCBpbnRlcmZlcmUgKG1vc3RseSBkdWUgdG8gZ2Fpbl9mCisJCSAqIGNhbGlicmF0aW9uIHRoYXQgbWVzc2VzIHdpdGggdHggcGFja2V0cyAtc2VlIHBoeS5jKS4KKwkJICoKKwkJICogTk9URTogU3RvcHBpbmcgdGhlIHF1ZXVlcyBmcm9tIGFib3ZlIGlzIG5vdCBlbm91Z2gKKwkJICogdG8gc3RvcCBUWCBidXQgc2F2ZXMgdXMgZnJvbSBkaXNjb25lY3RpbmcgKGF0IGxlYXN0CisJCSAqIHdlIGRvbid0IGxvc2UgcGFja2V0cykuICovCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhhaC0+aHcpOworCX0gZWxzZQorCQlhaC0+YWhfY2FsX21hc2sgfD0gQVI1S19DQUxJQlJBVElPTl9TSE9SVDsKKwogCiAJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsICJjaGFubmVsICV1LyV4XG4iLAogCQlpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoYWgtPmN1cmNoYW4tPmNlbnRlcl9mcmVxKSwKIAkJYWgtPmN1cmNoYW4tPmh3X3ZhbHVlKTsKIAotCWlmIChhdGg1a19od19nYWluZl9jYWxpYnJhdGUoYWgpID09IEFSNUtfUkZHQUlOX05FRURfQ0hBTkdFKSB7Ci0JCS8qCi0JCSAqIFJmZ2FpbiBpcyBvdXQgb2YgYm91bmRzLCByZXNldCB0aGUgY2hpcAotCQkgKiB0byBsb2FkIG5ldyBnYWluIHZhbHVlcy4KLQkJICovCi0JCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsICJjYWxpYnJhdGlvbiwgcmVzZXR0aW5nXG4iKTsKLQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoYWgtPmh3LCAmYWgtPnJlc2V0X3dvcmspOwotCX0KIAlpZiAoYXRoNWtfaHdfcGh5X2NhbGlicmF0ZShhaCwgYWgtPmN1cmNoYW4pKQogCQlBVEg1S19FUlIoYWgsICJjYWxpYnJhdGlvbiBvZiBjaGFubmVsICV1IGZhaWxlZFxuIiwKIAkJCWllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbCgKIAkJCQlhaC0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXEpKTsKIAotCS8qIE5vaXNlIGZsb29yIGNhbGlicmF0aW9uIGludGVycnVwdHMgcngvdHggcGF0aCB3aGlsZSBJL1EgY2FsaWJyYXRpb24KLQkgKiBkb2Vzbid0LgotCSAqIFRPRE86IFdlIHNob3VsZCBzdG9wIFRYIGhlcmUsIHNvIHRoYXQgaXQgZG9lc24ndCBpbnRlcmZlcmUuCi0JICogTm90ZSB0aGF0IHN0b3BwaW5nIHRoZSBxdWV1ZXMgaXMgbm90IGVub3VnaCB0byBzdG9wIFRYISAqLwotCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9uZikpIHsKLQkJYWgtPmFoX2NhbF9uZXh0X25mID0gamlmZmllcyArCi0JCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfTkYpOwotCQlhdGg1a19od191cGRhdGVfbm9pc2VfZmxvb3IoYWgpOwotCX0KLQotCWFoLT5haF9jYWxfbWFzayAmPSB+QVI1S19DQUxJQlJBVElPTl9GVUxMOworCS8qIENsZWFyIGNhbGlicmF0aW9uIGZsYWdzICovCisJaWYgKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fRlVMTCkgeworCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMoYWgtPmh3KTsKKwkJYWgtPmFoX2NhbF9tYXNrICY9IH5BUjVLX0NBTElCUkFUSU9OX0ZVTEw7CisJfSBlbHNlIGlmIChhaC0+YWhfY2FsX21hc2sgJiBBUjVLX0NBTElCUkFUSU9OX1NIT1JUKQorCQlhaC0+YWhfY2FsX21hc2sgJj0gfkFSNUtfQ0FMSUJSQVRJT05fU0hPUlQ7CiB9CiAKIApAQCAtMjQwNyw4ICsyNDkyLDggQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9pcnE7CiAKLQkvKiBzZXQgdXAgbXVsdGktcmF0ZSByZXRyeSBjYXBhYmlsaXRpZXMgKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkvKiBTZXQgdXAgbXVsdGktcmF0ZSByZXRyeSBjYXBhYmlsaXRpZXMgKi8KKwlpZiAoYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfaGFzX21ycl9zdXBwb3J0KSB7CiAJCWh3LT5tYXhfcmF0ZXMgPSA0OwogCQlody0+bWF4X3JhdGVfdHJpZXMgPSBtYXgoQVI1S19JTklUX1JFVFJZX1NIT1JULAogCQkJCQkgQVI1S19JTklUX1JFVFJZX0xPTkcpOwpAQCAtMjU0NCwxNSArMjYyOSwyMiBAQAogCSAqIGFuZCB0aGVuIHNldHVwIG9mIHRoZSBpbnRlcnJ1cHQgbWFzay4KIAkgKi8KIAlhaC0+Y3VyY2hhbiA9IGFoLT5ody0+Y29uZi5jaGFubmVsOwotCWFoLT5pbWFzayA9IEFSNUtfSU5UX1JYT0sgfCBBUjVLX0lOVF9SWEVSUiB8IEFSNUtfSU5UX1JYRU9MIHwKLQkJQVI1S19JTlRfUlhPUk4gfCBBUjVLX0lOVF9UWERFU0MgfCBBUjVLX0lOVF9UWEVPTCB8Ci0JCUFSNUtfSU5UX0ZBVEFMIHwgQVI1S19JTlRfR0xPQkFMIHwgQVI1S19JTlRfTUlCOworCWFoLT5pbWFzayA9IEFSNUtfSU5UX1JYT0sKKwkJfCBBUjVLX0lOVF9SWEVSUgorCQl8IEFSNUtfSU5UX1JYRU9MCisJCXwgQVI1S19JTlRfUlhPUk4KKwkJfCBBUjVLX0lOVF9UWERFU0MKKwkJfCBBUjVLX0lOVF9UWEVPTAorCQl8IEFSNUtfSU5UX0ZBVEFMCisJCXwgQVI1S19JTlRfR0xPQkFMCisJCXwgQVI1S19JTlRfTUlCOwogCiAJcmV0ID0gYXRoNWtfcmVzZXQoYWgsIE5VTEwsIGZhbHNlKTsKIAlpZiAocmV0KQogCQlnb3RvIGRvbmU7CiAKLQlhdGg1a19yZmtpbGxfaHdfc3RhcnQoYWgpOworCWlmICghYXRoNWtfbW9kcGFyYW1fbm9faHdfcmZraWxsX3N3aXRjaCkKKwkJYXRoNWtfcmZraWxsX2h3X3N0YXJ0KGFoKTsKIAogCS8qCiAJICogUmVzZXQgdGhlIGtleSBjYWNoZSBzaW5jZSBzb21lIHBhcnRzIGRvIG5vdCByZXNldCB0aGUKQEAgLTI1ODUsNyArMjY3Nyw2IEBACiAJYWgtPnR4X3BlbmRpbmcgPSBmYWxzZTsKIAl0YXNrbGV0X2tpbGwoJmFoLT5yeHRxKTsKIAl0YXNrbGV0X2tpbGwoJmFoLT50eHRxKTsKLQl0YXNrbGV0X2tpbGwoJmFoLT5jYWxpYik7CiAJdGFza2xldF9raWxsKCZhaC0+YmVhY29udHEpOwogCXRhc2tsZXRfa2lsbCgmYWgtPmFuaV90YXNrbGV0KTsKIH0KQEAgLTI2MzcsNyArMjcyOCw4IEBACiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmFoLT50eF9jb21wbGV0ZV93b3JrKTsKIAotCWF0aDVrX3Jma2lsbF9od19zdG9wKGFoKTsKKwlpZiAoIWF0aDVrX21vZHBhcmFtX25vX2h3X3Jma2lsbF9zd2l0Y2gpCisJCWF0aDVrX3Jma2lsbF9od19zdG9wKGFoKTsKIH0KIAogLyoKQEAgLTI2ODksOSArMjc4MSwyNCBAQAogCiAJYXRoNWtfYW5pX2luaXQoYWgsIGFuaV9tb2RlKTsKIAotCWFoLT5haF9jYWxfbmV4dF9mdWxsID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKLQlhaC0+YWhfY2FsX25leHRfYW5pID0gamlmZmllczsKLQlhaC0+YWhfY2FsX25leHRfbmYgPSBqaWZmaWVzOworCS8qCisJICogU2V0IGNhbGlicmF0aW9uIGludGVydmFscworCSAqCisJICogTm90ZTogV2UgZG9uJ3QgbmVlZCB0byBydW4gY2FsaWJyYXRpb24gaW1lZGlhdGVseQorCSAqIHNpbmNlIHNvbWUgaW5pdGlhbCBjYWxpYnJhdGlvbiBpcyBkb25lIG9uIHJlc2V0CisJICogZXZlbiBmb3IgZmFzdCBjaGFubmVsIHN3aXRjaGluZy4gQWxzbyBvbiBzY2FubmluZworCSAqIHRoaXMgd2lsbCBnZXQgc2V0IGFnYWluIGFuZCBhZ2FpbiBhbmQgaXQgd29uJ3QgZ2V0CisJICogZXhlY3V0ZWQgdW5sZXNzIHdlIGNvbm5lY3Qgc29tZXdoZXJlIGFuZCBzcGVuZCBzb21lCisJICogdGltZSBvbiB0aGUgY2hhbm5lbCAodGhhdCdzIHdoYXQgY2FsaWJyYXRpb24gbmVlZHMKKwkgKiBhbnl3YXkgdG8gYmUgYWNjdXJhdGUpLgorCSAqLworCWFoLT5haF9jYWxfbmV4dF9mdWxsID0gamlmZmllcyArCisJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9GVUxMKTsKKwlhaC0+YWhfY2FsX25leHRfYW5pID0gamlmZmllcyArCisJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9BTkkpOworCWFoLT5haF9jYWxfbmV4dF9zaG9ydCA9IGppZmZpZXMgKworCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfU0hPUlQpOworCiAJZXdtYV9pbml0KCZhaC0+YWhfYmVhY29uX3Jzc2lfYXZnLCAxMDI0LCA4KTsKIAogCS8qIGNsZWFyIHN1cnZleSBkYXRhIGFuZCBjeWNsZSBjb3VudGVycyAqLwpAQCAtMjc0NSwyMCArMjg1Miw2IEBACiAKIAogCS8qCi0JICogQ2hlY2sgaWYgdGhlIE1BQyBoYXMgbXVsdGktcmF0ZSByZXRyeSBzdXBwb3J0LgotCSAqIFdlIGRvIHRoaXMgYnkgdHJ5aW5nIHRvIHNldHVwIGEgZmFrZSBleHRlbmRlZAotCSAqIGRlc2NyaXB0b3IuICBNQUNzIHRoYXQgZG9uJ3QgaGF2ZSBzdXBwb3J0IHdpbGwKLQkgKiByZXR1cm4gZmFsc2Ugdy9vIGRvaW5nIGFueXRoaW5nLiAgTUFDcyB0aGF0IGRvCi0JICogc3VwcG9ydCBpdCB3aWxsIHJldHVybiB0cnVlIHcvbyBkb2luZyBhbnl0aGluZy4KLQkgKi8KLQlyZXQgPSBhdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYyhhaCwgTlVMTCwgMCwgMCwgMCwgMCwgMCwgMCk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnI7Ci0JaWYgKHJldCA+IDApCi0JCV9fc2V0X2JpdChBVEhfU1RBVF9NUlJFVFJZLCBhaC0+c3RhdHVzKTsKLQotCS8qCiAJICogQ29sbGVjdCB0aGUgY2hhbm5lbCBsaXN0LiAgVGhlIDgwMi4xMSBsYXllcgogCSAqIGlzIHJlc3BvbnNpYmxlIGZvciBmaWx0ZXJpbmcgdGhpcyBsaXN0IGJhc2VkCiAJICogb24gc2V0dGluZ3MgbGlrZSB0aGUgcGh5IG1vZGUgYW5kIHJlZ3VsYXRvcnkKQEAgLTI4NDEsMTEgKzI5MzQsMTEgQEAKIAogCXRhc2tsZXRfaW5pdCgmYWgtPnJ4dHEsIGF0aDVrX3Rhc2tsZXRfcngsICh1bnNpZ25lZCBsb25nKWFoKTsKIAl0YXNrbGV0X2luaXQoJmFoLT50eHRxLCBhdGg1a190YXNrbGV0X3R4LCAodW5zaWduZWQgbG9uZylhaCk7Ci0JdGFza2xldF9pbml0KCZhaC0+Y2FsaWIsIGF0aDVrX3Rhc2tsZXRfY2FsaWJyYXRlLCAodW5zaWduZWQgbG9uZylhaCk7CiAJdGFza2xldF9pbml0KCZhaC0+YmVhY29udHEsIGF0aDVrX3Rhc2tsZXRfYmVhY29uLCAodW5zaWduZWQgbG9uZylhaCk7CiAJdGFza2xldF9pbml0KCZhaC0+YW5pX3Rhc2tsZXQsIGF0aDVrX3Rhc2tsZXRfYW5pLCAodW5zaWduZWQgbG9uZylhaCk7CiAKIAlJTklUX1dPUksoJmFoLT5yZXNldF93b3JrLCBhdGg1a19yZXNldF93b3JrKTsKKwlJTklUX1dPUksoJmFoLT5jYWxpYl93b3JrLCBhdGg1a19jYWxpYnJhdGVfd29yayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmFoLT50eF9jb21wbGV0ZV93b3JrLCBhdGg1a190eF9jb21wbGV0ZV9wb2xsX3dvcmspOwogCiAJcmV0ID0gYXRoNWtfaHdfY29tbW9uKGFoKS0+YnVzX29wcy0+ZWVwcm9tX3JlYWRfbWFjKGFoLCBtYWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2NhcHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9jYXBzLmMKaW5kZXggODEwZmJhOS4uOTk0MTY5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2NhcHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvY2Fwcy5jCkBAIC04NSwxMiArODUsMTkgQEAKIAkJCWNhcHMtPmNhcF9yYW5nZS5yYW5nZV8yZ2h6X21pbiA9IDI0MTI7CiAJCQljYXBzLT5jYXBfcmFuZ2UucmFuZ2VfMmdoel9tYXggPSAyNzMyOwogCi0JCQlpZiAoQVI1S19FRVBST01fSERSXzExQihlZV9oZWFkZXIpKQotCQkJCV9fc2V0X2JpdChBUjVLX01PREVfMTFCLCBjYXBzLT5jYXBfbW9kZSk7CisJCQkvKiBPdmVycmlkZSAyR0h6IG1vZGVzIG9uIFNvQ3MgdGhhdCBuZWVkIGl0CisJCQkgKiBOT1RFOiBjYXBfbmVlZHNfMkdIel9vdnIgZ2V0cyBzZXQgZnJvbQorCQkJICogYXRoX2FoYl9wcm9iZSAqLworCQkJaWYgKCFjYXBzLT5jYXBfbmVlZHNfMkdIel9vdnIpIHsKKwkJCQlpZiAoQVI1S19FRVBST01fSERSXzExQihlZV9oZWFkZXIpKQorCQkJCQlfX3NldF9iaXQoQVI1S19NT0RFXzExQiwKKwkJCQkJCQljYXBzLT5jYXBfbW9kZSk7CiAKLQkJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFHKGVlX2hlYWRlcikgJiYKLQkJCSAgICBhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMSkKLQkJCQlfX3NldF9iaXQoQVI1S19NT0RFXzExRywgY2Fwcy0+Y2FwX21vZGUpOworCQkJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFHKGVlX2hlYWRlcikgJiYKKwkJCQlhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMSkKKwkJCQkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUcsCisJCQkJCQkJY2Fwcy0+Y2FwX21vZGUpOworCQkJfQogCQl9CiAJfQogCkBAIC0xMDMsMTIgKzExMCwxOCBAQAogCWVsc2UKIAkJY2Fwcy0+Y2FwX3F1ZXVlcy5xX3R4X251bSA9IEFSNUtfTlVNX1RYX1FVRVVFUzsKIAotCS8qIG5ld2VyIGhhcmR3YXJlIGhhcyBQSFkgZXJyb3IgY291bnRlcnMgKi8KKwkvKiBOZXdlciBoYXJkd2FyZSBoYXMgUEhZIGVycm9yIGNvdW50ZXJzICovCiAJaWYgKGFoLT5haF9tYWNfc3JldiA+PSBBUjVLX1NSRVZfQVI1MjEzQSkKIAkJY2Fwcy0+Y2FwX2hhc19waHllcnJfY291bnRlcnMgPSB0cnVlOwogCWVsc2UKIAkJY2Fwcy0+Y2FwX2hhc19waHllcnJfY291bnRlcnMgPSBmYWxzZTsKIAorCS8qIE1BQ3Mgc2luY2UgQVI1MjEyIGhhdmUgTVJSIHN1cHBvcnQgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCisJCWNhcHMtPmNhcF9oYXNfbXJyX3N1cHBvcnQgPSB0cnVlOworCWVsc2UKKwkJY2Fwcy0+Y2FwX2hhc19tcnJfc3VwcG9ydCA9IGZhbHNlOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKaW5kZXggZmNlOGM5MC4uOGM1Y2U4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKQEAgLTU3LDggKzU3LDkgQEAKICAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKICAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSAiZGVidWcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmgKaW5kZXggN2YzN2RmMy4uMGEzZjkxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmgKQEAgLTE0MSwxMCArMTQxLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpCitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDMsIDQpIHZvaWQKIEFUSDVLX0RCRyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgbSwgY29uc3QgY2hhciAqZm10LCAuLi4pIHt9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMywgNCkgdm9pZAogQVRINUtfREJHX1VOTElNSVQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IG0sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoge30KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmMKaW5kZXggN2U4OGRkYS4uZjhiZmEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5jCkBAIC0yNiwyMCArMjYsNjEgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKKy8qKgorICogRE9DOiBIYXJkd2FyZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucworICoKKyAqIEhlcmUgd2UgaGFuZGxlIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBsb3ctbGV2ZWwgaHcgZGVzY3JpcHRvcnMKKyAqIHRoYXQgaHcgcmVhZHMgYW5kIHdyaXRlcyB2aWEgRE1BIGZvciBlYWNoIFRYIGFuZCBSWCBhdHRlbXB0ICh0aGF0IG1lYW5zCisgKiB3ZSBjYW4gYWxzbyBoYXZlIGRlc2NyaXB0b3JzIGZvciBmYWlsZWQgVFgvUlggdHJpZXMpLiBXZSBoYXZlIHR3byBraW5kIG9mCisgKiBkZXNjcmlwdG9ycyBmb3IgUlggYW5kIFRYLCBjb250cm9sIGRlc2NyaXB0b3JzIHRlbGwgdGhlIGh3IGhvdyB0byBzZW5kIG9yCisgKiByZWNlaXZlIGEgcGFja2V0IHdoZXJlIHRvIHJlYWQvd3JpdGUgaXQgZnJvbS90byBldGMgYW5kIHN0YXR1cyBkZXNjcmlwdG9ycworICogdGhhdCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgcGFja2V0IHdhcyBzZW50IG9yIHJlY2VpdmVkIChlcnJvcnMKKyAqIGluY2x1ZGVkKS4KKyAqCisgKiBEZXNjcmlwdG9yIGZvcm1hdCBpcyBub3QgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCBNQUMgY2hpcCB2ZXJzaW9uIHNvIHdlCisgKiBoYXZlIGZ1bmN0aW9uIHBvaW50ZXJzIG9uICZzdHJ1Y3QgYXRoNWtfaHcgd2UgaW5pdGlhbGl6ZSBhdCBydW50aW1lIGJhc2VkIG9uCisgKiB0aGUgY2hpcCB1c2VkLgorICovCisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKlwKICogVFggQ29udHJvbCBkZXNjcmlwdG9ycyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgMi13b3JkIHR4IGNvbnRyb2wgZGVzY3JpcHRvciBvbiA1MjEwLzUyMTEKKy8qKgorICogYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYygpIC0gSW5pdGlhbGl6ZSBhIDItd29yZCB0eCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAcGt0X2xlbjogRnJhbWUgbGVuZ3RoIGluIGJ5dGVzCisgKiBAaGRyX2xlbjogSGVhZGVyIGxlbmd0aCBpbiBieXRlcyAob25seSB1c2VkIG9uIEFSNTIxMCkKKyAqIEBwYWRzaXplOiBBbnkgcGFkZGluZyB3ZSd2ZSBhZGRlZCB0byB0aGUgZnJhbWUgbGVuZ3RoCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcGt0X3R5cGUKKyAqIEB0eF9wb3dlcjogVHggcG93ZXIgaW4gMC41ZEIgc3RlcHMKKyAqIEB0eF9yYXRlMDogSFcgaWR4IGZvciB0cmFuc21pc3Npb24gcmF0ZQorICogQHR4X3RyaWVzMDogTWF4IG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMKKyAqIEBrZXlfaW5kZXg6IEluZGV4IG9uIGtleSB0YWJsZSB0byB1c2UgZm9yIGVuY3J5cHRpb24KKyAqIEBhbnRlbm5hX21vZGU6IFdoaWNoIGFudGVubmEgdG8gdXNlICgwIGZvciBhdXRvKQorICogQGZsYWdzOiBPbmUgb2YgQVI1S19UWERFU0NfKiBmbGFncyAoZGVzYy5oKQorICogQHJ0c2N0c19yYXRlOiBIVyBpZHggZm9yIFJUUy9DVFMgdHJhbnNtaXNzaW9uIHJhdGUKKyAqIEBydHNjdHNfZHVyYXRpb246IFdoYXQgdG8gcHV0IG9uIGR1cmF0aW9uIGZpZWxkIG9uIHRoZSBoZWFkZXIgb2YgUlRTL0NUUworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSAyLVdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisgKiBmb3VuZCBvbiBBUjUyMTAgYW5kIEFSNTIxMSBNQUNzIGNoaXBzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZmFsc2UgaW5wdXQKICAqLwogc3RhdGljIGludAotYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKLQl1bnNpZ25lZCBpbnQgcGt0X2xlbiwgdW5zaWduZWQgaW50IGhkcl9sZW4sIGludCBwYWRzaXplLAotCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwKLQl1bnNpZ25lZCBpbnQgdHhfcG93ZXIsIHVuc2lnbmVkIGludCB0eF9yYXRlMCwgdW5zaWduZWQgaW50IHR4X3RyaWVzMCwKLQl1bnNpZ25lZCBpbnQga2V5X2luZGV4LCB1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLCB1bnNpZ25lZCBpbnQgcnRzY3RzX2R1cmF0aW9uKQorYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJCQl1bnNpZ25lZCBpbnQgcGt0X2xlbiwgdW5zaWduZWQgaW50IGhkcl9sZW4sCisJCQlpbnQgcGFkc2l6ZSwKKwkJCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwKKwkJCXVuc2lnbmVkIGludCB0eF9wb3dlciwKKwkJCXVuc2lnbmVkIGludCB0eF9yYXRlMCwgdW5zaWduZWQgaW50IHR4X3RyaWVzMCwKKwkJCXVuc2lnbmVkIGludCBrZXlfaW5kZXgsCisJCQl1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLAorCQkJdW5zaWduZWQgaW50IGZsYWdzLAorCQkJdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLCB1bnNpZ25lZCBpbnQgcnRzY3RzX2R1cmF0aW9uKQogewogCXUzMiBmcmFtZV90eXBlOwogCXN0cnVjdCBhdGg1a19od18yd190eF9jdGwgKnR4X2N0bDsKQEAgLTE3MiwxNyArMjEzLDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBJbml0aWFsaXplIHRoZSA0LXdvcmQgdHggY29udHJvbCBkZXNjcmlwdG9yIG9uIDUyMTIKKy8qKgorICogYXRoNWtfaHdfc2V0dXBfNHdvcmRfdHhfZGVzYygpIC0gSW5pdGlhbGl6ZSBhIDQtd29yZCB0eCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAcGt0X2xlbjogRnJhbWUgbGVuZ3RoIGluIGJ5dGVzCisgKiBAaGRyX2xlbjogSGVhZGVyIGxlbmd0aCBpbiBieXRlcyAob25seSB1c2VkIG9uIEFSNTIxMCkKKyAqIEBwYWRzaXplOiBBbnkgcGFkZGluZyB3ZSd2ZSBhZGRlZCB0byB0aGUgZnJhbWUgbGVuZ3RoCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcGt0X3R5cGUKKyAqIEB0eF9wb3dlcjogVHggcG93ZXIgaW4gMC41ZEIgc3RlcHMKKyAqIEB0eF9yYXRlMDogSFcgaWR4IGZvciB0cmFuc21pc3Npb24gcmF0ZQorICogQHR4X3RyaWVzMDogTWF4IG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMKKyAqIEBrZXlfaW5kZXg6IEluZGV4IG9uIGtleSB0YWJsZSB0byB1c2UgZm9yIGVuY3J5cHRpb24KKyAqIEBhbnRlbm5hX21vZGU6IFdoaWNoIGFudGVubmEgdG8gdXNlICgwIGZvciBhdXRvKQorICogQGZsYWdzOiBPbmUgb2YgQVI1S19UWERFU0NfKiBmbGFncyAoZGVzYy5oKQorICogQHJ0c2N0c19yYXRlOiBIVyBpZHggZm9yIFJUUy9DVFMgdHJhbnNtaXNzaW9uIHJhdGUKKyAqIEBydHNjdHNfZHVyYXRpb246IFdoYXQgdG8gcHV0IG9uIGR1cmF0aW9uIGZpZWxkIG9uIHRoZSBoZWFkZXIgb2YgUlRTL0NUUworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSA0LVdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisgKiBmb3VuZCBvbiBBUjUyMTIgYW5kIGxhdGVyIE1BQ3MgY2hpcHMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBmYWxzZSBpbnB1dAogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3NldHVwXzR3b3JkX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwKLQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IHBrdF9sZW4sIHVuc2lnbmVkIGludCBoZHJfbGVuLAotCWludCBwYWRzaXplLAotCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwgdW5zaWduZWQgaW50IHR4X3Bvd2VyLCB1bnNpZ25lZCBpbnQgdHhfcmF0ZTAsCi0JdW5zaWduZWQgaW50IHR4X3RyaWVzMCwgdW5zaWduZWQgaW50IGtleV9pbmRleCwKLQl1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLAotCXVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCitzdGF0aWMgaW50CithdGg1a19od19zZXR1cF80d29yZF90eF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCXVuc2lnbmVkIGludCBwa3RfbGVuLCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwKKwkJCWludCBwYWRzaXplLAorCQkJZW51bSBhdGg1a19wa3RfdHlwZSB0eXBlLAorCQkJdW5zaWduZWQgaW50IHR4X3Bvd2VyLAorCQkJdW5zaWduZWQgaW50IHR4X3JhdGUwLCB1bnNpZ25lZCBpbnQgdHhfdHJpZXMwLAorCQkJdW5zaWduZWQgaW50IGtleV9pbmRleCwKKwkJCXVuc2lnbmVkIGludCBhbnRlbm5hX21vZGUsCisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQl1bnNpZ25lZCBpbnQgcnRzY3RzX3JhdGUsIHVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCiB7CiAJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOwogCXVuc2lnbmVkIGludCBmcmFtZV9sZW47CkBAIC0yOTIsMTMgKzM1NiwyOSBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogSW5pdGlhbGl6ZSBhIDQtd29yZCBtdWx0aSByYXRlIHJldHJ5IHR4IGNvbnRyb2wgZGVzY3JpcHRvciBvbiA1MjEyCisvKioKKyAqIGF0aDVrX2h3X3NldHVwX21ycl90eF9kZXNjKCkgLSBJbml0aWFsaXplIGFuIE1SUiB0eCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAdHhfcmF0ZTE6IEhXIGlkeCBmb3IgcmF0ZSB1c2VkIG9uIHRyYW5zbWlzc2lvbiBzZXJpZXMgMQorICogQHR4X3RyaWVzMTogTWF4IG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgZm9yIHRyYW5zbWlzc2lvbiBzZXJpZXMgMQorICogQHR4X3JhdGUyOiBIVyBpZHggZm9yIHJhdGUgdXNlZCBvbiB0cmFuc21pc3Npb24gc2VyaWVzIDIKKyAqIEB0eF90cmllczI6IE1heCBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGZvciB0cmFuc21pc3Npb24gc2VyaWVzIDIKKyAqIEB0eF9yYXRlMzogSFcgaWR4IGZvciByYXRlIHVzZWQgb24gdHJhbnNtaXNzaW9uIHNlcmllcyAzCisgKiBAdHhfdHJpZXMzOiBNYXggbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBmb3IgdHJhbnNtaXNzaW9uIHNlcmllcyAzCisgKgorICogTXVsdGkgcmF0ZSByZXRyeSAoTVJSKSB0eCBjb250cm9sIGRlc2NyaXB0b3JzIGFyZSBhdmFpbGFibGUgb25seSBvbiBBUjUyMTIKKyAqIE1BQ3MsIHRoZXkgYXJlIHBhcnQgb2YgdGhlIG5vcm1hbCA0LXdvcmQgdHggY29udHJvbCBkZXNjcmlwdG9yIChzZWUgYWJvdmUpCisgKiBidXQgd2UgaGFuZGxlIHRoZW0gdGhyb3VnaCBhIHNlcGFyYXRlIGZ1bmN0aW9uIGZvciBiZXR0ZXIgYWJzdHJhY3Rpb24uCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBpbnZhbGlkIGlucHV0CiAgKi8KIGludAotYXRoNWtfaHdfc2V0dXBfbXJyX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JdW5zaWduZWQgaW50IHR4X3JhdGUxLCB1X2ludCB0eF90cmllczEsIHVfaW50IHR4X3JhdGUyLAotCXVfaW50IHR4X3RyaWVzMiwgdW5zaWduZWQgaW50IHR4X3JhdGUzLCB1X2ludCB0eF90cmllczMpCithdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJCQl1X2ludCB0eF9yYXRlMSwgdV9pbnQgdHhfdHJpZXMxLAorCQkJdV9pbnQgdHhfcmF0ZTIsIHVfaW50IHR4X3RyaWVzMiwKKwkJCXVfaW50IHR4X3JhdGUzLCB1X2ludCB0eF90cmllczMpCiB7CiAJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOwogCkBAIC0zNTAsMTEgKzQzMCwxNiBAQAogKiBUWCBTdGF0dXMgZGVzY3JpcHRvcnMgKgogXCoqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogUHJvY2VzcyB0aGUgdHggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC81MjExCisvKioKKyAqIGF0aDVrX2h3X3Byb2NfMndvcmRfdHhfc3RhdHVzKCkgLSBQcm9jZXNzIGEgdHggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC8xCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZGVzYzogVGhlICZzdHJ1Y3QgYXRoNWtfZGVzYworICogQHRzOiBUaGUgJnN0cnVjdCBhdGg1a190eF9zdGF0dXMKICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCitzdGF0aWMgaW50CithdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAorCQkJCXN0cnVjdCBhdGg1a190eF9zdGF0dXMgKnRzKQogewogCXN0cnVjdCBhdGg1a19od18yd190eF9jdGwgKnR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzICp0eF9zdGF0dXM7CkBAIC0zOTksMTEgKzQ4NCwxNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUHJvY2VzcyBhIHR4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTIKKy8qKgorICogYXRoNWtfaHdfcHJvY180d29yZF90eF9zdGF0dXMoKSAtIFByb2Nlc3MgYSB0eCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZGVzYzogVGhlICZzdHJ1Y3QgYXRoNWtfZGVzYworICogQHRzOiBUaGUgJnN0cnVjdCBhdGg1a190eF9zdGF0dXMKICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCitzdGF0aWMgaW50CithdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAorCQkJCXN0cnVjdCBhdGg1a190eF9zdGF0dXMgKnRzKQogewogCXN0cnVjdCBhdGg1a19od180d190eF9jdGwgKnR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzICp0eF9zdGF0dXM7CkBAIC00NjAsMTEgKzU1MCwxNyBAQAogKiBSWCBEZXNjcmlwdG9ycyAqCiBcKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIEluaXRpYWxpemUgYW4gcnggY29udHJvbCBkZXNjcmlwdG9yCisvKioKKyAqIGF0aDVrX2h3X3NldHVwX3J4X2Rlc2MoKSAtIEluaXRpYWxpemUgYW4gcnggY29udHJvbCBkZXNjcmlwdG9yCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZGVzYzogVGhlICZzdHJ1Y3QgYXRoNWtfZGVzYworICogQHNpemU6IFJYIGJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMKKyAqIEBmbGFnczogT25lIG9mIEFSNUtfUlhERVNDXyogZmxhZ3MKICAqLwotaW50IGF0aDVrX2h3X3NldHVwX3J4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JCQkgICB1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzKQoraW50CithdGg1a19od19zZXR1cF9yeF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCXUzMiBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGF0aDVrX2h3X3J4X2N0bCAqcnhfY3RsOwogCkBAIC00OTEsMTEgKzU4NywyMiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUHJvY2VzcyB0aGUgcnggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC81MjExCisvKioKKyAqIGF0aDVrX2h3X3Byb2NfNTIxMF9yeF9zdGF0dXMoKSAtIFByb2Nlc3MgdGhlIHJ4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTAvMQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGRlc2M6IFRoZSAmc3RydWN0IGF0aDVrX2Rlc2MKKyAqIEByczogVGhlICZzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzCisgKgorICogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB0byBwcm9jZXNzIGFuIFJYIHN0YXR1cyBkZXNjcmlwdG9yCisgKiBvbiBBUjUyMTAvNTIxMSBNQUMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlBST0dSRVNTIGluIGNhc2Ugd2UgaGF2ZW4ndCByZWNlaXZlZCB0aGUgd2hvO2UKKyAqIGZyYW1lIHlldC4KICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzUyMTBfcnhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLCBzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3Byb2NfNTIxMF9yeF9zdGF0dXMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKIHsKIAlzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzICpyeF9zdGF0dXM7CiAKQEAgLTU3NCwxMiArNjgxLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBQcm9jZXNzIHRoZSByeCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEyCisvKioKKyAqIGF0aDVrX2h3X3Byb2NfNTIxMl9yeF9zdGF0dXMoKSAtIFByb2Nlc3MgdGhlIHJ4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAcnM6IFRoZSAmc3RydWN0IGF0aDVrX3J4X3N0YXR1cworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gcHJvY2VzcyBhbiBSWCBzdGF0dXMgZGVzY3JpcHRvcgorICogb24gQVI1MjEyIGFuZCBsYXRlciBNQUMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlBST0dSRVNTIGluIGNhc2Ugd2UgaGF2ZW4ndCByZWNlaXZlZCB0aGUgd2hvO2UKKyAqIGZyYW1lIHlldC4KICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzUyMTJfcnhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCQkJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAotCQkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3Byb2NfNTIxMl9yeF9zdGF0dXMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKIHsKIAlzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzICpyeF9zdGF0dXM7CiAJdTMyIHJ4c3RhdDAsIHJ4c3RhdDE7CkBAIC02NDYsMTAgKzc2MywxNiBAQAogKiBBdHRhY2ggKgogXCoqKioqKioqLwogCi0vKgotICogSW5pdCBmdW5jdGlvbiBwb2ludGVycyBpbnNpZGUgYXRoNWtfaHcgc3RydWN0CisvKioKKyAqIGF0aDVrX2h3X2luaXRfZGVzY19mdW5jdGlvbnMoKSAtIEluaXQgZnVuY3Rpb24gcG9pbnRlcnMgaW5zaWRlIGFoCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogTWFwcyB0aGUgaW50ZXJuYWwgZGVzY3JpcHRvciBmdW5jdGlvbnMgdG8gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIG9uIGFoLCB1c2VkCisgKiBmcm9tIGFib3ZlLiBUaGlzIGlzIHVzZWQgYXMgYW4gYWJzdHJhY3Rpb24gbGF5ZXIgdG8gaGFuZGxlIHRoZSB2YXJpb3VzIGNoaXBzCisgKiB0aGUgc2FtZSB3YXkuCiAgKi8KLWludCBhdGg1a19od19pbml0X2Rlc2NfZnVuY3Rpb25zKHN0cnVjdCBhdGg1a19odyAqYWgpCitpbnQKK2F0aDVrX2h3X2luaXRfZGVzY19mdW5jdGlvbnMoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKIAkJYWgtPmFoX3NldHVwX3R4X2Rlc2MgPSBhdGg1a19od19zZXR1cF80d29yZF90eF9kZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmgKaW5kZXggY2ZkNTI5YjUuLjhkNmMwMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuaApAQCAtMjAsMjUgKzIwLDMwIEBACiAgKiBSWC9UWCBkZXNjcmlwdG9yIHN0cnVjdHVyZXMKICAqLwogCi0vKgotICogQ29tbW9uIGhhcmR3YXJlIFJYIGNvbnRyb2wgZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsIC0gQ29tbW9uIGhhcmR3YXJlIFJYIGNvbnRyb2wgZGVzY3JpcHRvcgorICogQHJ4X2NvbnRyb2xfMDogUlggY29udHJvbCB3b3JkIDAKKyAqIEByeF9jb250cm9sXzE6IFJYIGNvbnRyb2wgd29yZCAxCiAgKi8KIHN0cnVjdCBhdGg1a19od19yeF9jdGwgewotCXUzMglyeF9jb250cm9sXzA7IC8qIFJYIGNvbnRyb2wgd29yZCAwICovCi0JdTMyCXJ4X2NvbnRyb2xfMTsgLyogUlggY29udHJvbCB3b3JkIDEgKi8KKwl1MzIJcnhfY29udHJvbF8wOworCXUzMglyeF9jb250cm9sXzE7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogLyogUlggY29udHJvbCB3b3JkIDEgZmllbGRzL2ZsYWdzICovCiAjZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwxX0JVRl9MRU4JCTB4MDAwMDBmZmYgLyogZGF0YSBidWZmZXIgbGVuZ3RoICovCiAjZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwxX0lOVFJFUQkJMHgwMDAwMjAwMCAvKiBSWCBpbnRlcnJ1cHQgcmVxdWVzdCAqLwogCi0vKgotICogQ29tbW9uIGhhcmR3YXJlIFJYIHN0YXR1cyBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgLSBDb21tb24gaGFyZHdhcmUgUlggc3RhdHVzIGRlc2NyaXB0b3IKKyAqIEByeF9zdGF0dXNfMDogUlggc3RhdHVzIHdvcmQgMAorICogQHJ4X3N0YXR1c18xOiBSWCBzdGF0dXMgd29yZCAxCisgKgogICogNTIxMCwgNTIxMSBhbmQgNTIxMiBkaWZmZXIgb25seSBpbiB0aGUgZmllbGRzIGFuZCBmbGFncyBkZWZpbmVkIGJlbG93CiAgKi8KIHN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgewotCXUzMglyeF9zdGF0dXNfMDsgLyogUlggc3RhdHVzIHdvcmQgMCAqLwotCXUzMglyeF9zdGF0dXNfMTsgLyogUlggc3RhdHVzIHdvcmQgMSAqLworCXUzMglyeF9zdGF0dXNfMDsKKwl1MzIJcnhfc3RhdHVzXzE7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogLyogNTIxMC81MjExICovCkBAIC05OCwxNyArMTAzLDM2IEBACiAKIC8qKgogICogZW51bSBhdGg1a19waHlfZXJyb3JfY29kZSAtIFBIWSBFcnJvciBjb2RlcworICogQEFSNUtfUlhfUEhZX0VSUk9SX1VOREVSUlVOOiBUcmFuc21pdCB1bmRlcnJ1biwgWzUyMTBdIE5vIGVycm9yCisgKiBAQVI1S19SWF9QSFlfRVJST1JfVElNSU5HOiBUaW1pbmcgZXJyb3IKKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9QQVJJVFk6IElsbGVnYWwgcGFyaXR5CisgKiBAQVI1S19SWF9QSFlfRVJST1JfUkFURTogSWxsZWdhbCByYXRlCisgKiBAQVI1S19SWF9QSFlfRVJST1JfTEVOR1RIOiBJbGxlZ2FsIGxlbmd0aAorICogQEFSNUtfUlhfUEhZX0VSUk9SX1JBREFSOiBSYWRhciBkZXRlY3QsIFs1MjEwXSA2NCBRQU0gcmF0ZQorICogQEFSNUtfUlhfUEhZX0VSUk9SX1NFUlZJQ0U6IElsbGVnYWwgc2VydmljZQorICogQEFSNUtfUlhfUEhZX0VSUk9SX1RPUjogVHJhbnNtaXQgb3ZlcnJpZGUgcmVjZWl2ZQorICogQEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fVElNSU5HOiBPRkRNIFRpbWluZyBlcnJvciBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9TSUdOQUxfUEFSSVRZOiBPRkRNIFNpZ25hbCBwYXJpdHkgZXJyb3IgWzUyMTIrXQorICogQEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fUkFURV9JTExFR0FMOiBPRkRNIElsbGVnYWwgcmF0ZSBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9MRU5HVEhfSUxMRUdBTDogT0ZETSBJbGxlZ2FsIGxlbmd0aCBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9QT1dFUl9EUk9QOiBPRkRNIFBvd2VyIGRyb3AgWzUyMTIrXQorICogQEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fU0VSVklDRTogT0ZETSBTZXJ2aWNlICg/KSBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9SRVNUQVJUOiBPRkRNIFJlc3RhcnQgKD8pIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfVElNSU5HOiBDQ0sgVGltaW5nIGVycm9yIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfSEVBREVSX0NSQzogSGVhZGVyIENSQyBlcnJvciBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfQ0NLX1JBVEVfSUxMRUdBTDogSWxsZWdhbCByYXRlIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfU0VSVklDRTogQ0NLIFNlcnZpY2UgKD8pIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfUkVTVEFSVDogQ0NLIFJlc3RhcnQgKD8pIFs1MjEyK10KICAqLwogZW51bSBhdGg1a19waHlfZXJyb3JfY29kZSB7Ci0JQVI1S19SWF9QSFlfRVJST1JfVU5ERVJSVU4JCT0gMCwJLyogVHJhbnNtaXQgdW5kZXJydW4sIFs1MjEwXSBObyBlcnJvciAqLwotCUFSNUtfUlhfUEhZX0VSUk9SX1RJTUlORwkJPSAxLAkvKiBUaW1pbmcgZXJyb3IgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9QQVJJVFkJCT0gMiwJLyogSWxsZWdhbCBwYXJpdHkgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9SQVRFCQkJPSAzLAkvKiBJbGxlZ2FsIHJhdGUgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9MRU5HVEgJCT0gNCwJLyogSWxsZWdhbCBsZW5ndGggKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9SQURBUgkJCT0gNSwJLyogUmFkYXIgZGV0ZWN0LCBbNTIxMF0gNjQgUUFNIHJhdGUgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9TRVJWSUNFCQk9IDYsCS8qIElsbGVnYWwgc2VydmljZSAqLwotCUFSNUtfUlhfUEhZX0VSUk9SX1RPUgkJCT0gNywJLyogVHJhbnNtaXQgb3ZlcnJpZGUgcmVjZWl2ZSAqLwotCS8qIHRoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgNTIxMiAqLworCUFSNUtfUlhfUEhZX0VSUk9SX1VOREVSUlVOCQk9IDAsCisJQVI1S19SWF9QSFlfRVJST1JfVElNSU5HCQk9IDEsCisJQVI1S19SWF9QSFlfRVJST1JfUEFSSVRZCQk9IDIsCisJQVI1S19SWF9QSFlfRVJST1JfUkFURQkJCT0gMywKKwlBUjVLX1JYX1BIWV9FUlJPUl9MRU5HVEgJCT0gNCwKKwlBUjVLX1JYX1BIWV9FUlJPUl9SQURBUgkJCT0gNSwKKwlBUjVLX1JYX1BIWV9FUlJPUl9TRVJWSUNFCQk9IDYsCisJQVI1S19SWF9QSFlfRVJST1JfVE9SCQkJPSA3LAogCUFSNUtfUlhfUEhZX0VSUk9SX09GRE1fVElNSU5HCQk9IDE3LAogCUFSNUtfUlhfUEhZX0VSUk9SX09GRE1fU0lHTkFMX1BBUklUWQk9IDE4LAogCUFSNUtfUlhfUEhZX0VSUk9SX09GRE1fUkFURV9JTExFR0FMCT0gMTksCkBAIC0xMjMsMTIgKzE0NywxNCBAQAogCUFSNUtfUlhfUEhZX0VSUk9SX0NDS19SRVNUQVJUCQk9IDMxLAogfTsKIAotLyoKLSAqIDUyMTAvNTIxMSBoYXJkd2FyZSAyLXdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od18yd190eF9jdGwgIC0gNTIxMC81MjExIGhhcmR3YXJlIDItd29yZCBUWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEB0eF9jb250cm9sXzA6IFRYIGNvbnRyb2wgd29yZCAwCisgKiBAdHhfY29udHJvbF8xOiBUWCBjb250cm9sIHdvcmQgMQogICovCiBzdHJ1Y3QgYXRoNWtfaHdfMndfdHhfY3RsIHsKLQl1MzIJdHhfY29udHJvbF8wOyAvKiBUWCBjb250cm9sIHdvcmQgMCAqLwotCXUzMgl0eF9jb250cm9sXzE7IC8qIFRYIGNvbnRyb2wgd29yZCAxICovCisJdTMyCXR4X2NvbnRyb2xfMDsKKwl1MzIJdHhfY29udHJvbF8xOwogfSBfX3BhY2tlZCBfX2FsaWduZWQoNCk7CiAKIC8qIFRYIGNvbnRyb2wgd29yZCAwIGZpZWxkcy9mbGFncyAqLwpAQCAtMTc3LDE0ICsyMDMsMTggQEAKICNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BJRlMJNAogI2RlZmluZSBBUjVLX0FSNTIxMV9UWF9ERVNDX0ZSQU1FX1RZUEVfUFJFU1AJNAogCi0vKgotICogNTIxMiBoYXJkd2FyZSA0LXdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od180d190eF9jdGwgLSA1MjEyIGhhcmR3YXJlIDQtd29yZCBUWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEB0eF9jb250cm9sXzA6IFRYIGNvbnRyb2wgd29yZCAwCisgKiBAdHhfY29udHJvbF8xOiBUWCBjb250cm9sIHdvcmQgMQorICogQHR4X2NvbnRyb2xfMjogVFggY29udHJvbCB3b3JkIDIKKyAqIEB0eF9jb250cm9sXzM6IFRYIGNvbnRyb2wgd29yZCAzCiAgKi8KIHN0cnVjdCBhdGg1a19od180d190eF9jdGwgewotCXUzMgl0eF9jb250cm9sXzA7IC8qIFRYIGNvbnRyb2wgd29yZCAwICovCi0JdTMyCXR4X2NvbnRyb2xfMTsgLyogVFggY29udHJvbCB3b3JkIDEgKi8KLQl1MzIJdHhfY29udHJvbF8yOyAvKiBUWCBjb250cm9sIHdvcmQgMiAqLwotCXUzMgl0eF9jb250cm9sXzM7IC8qIFRYIGNvbnRyb2wgd29yZCAzICovCisJdTMyCXR4X2NvbnRyb2xfMDsKKwl1MzIJdHhfY29udHJvbF8xOworCXUzMgl0eF9jb250cm9sXzI7CisJdTMyCXR4X2NvbnRyb2xfMzsKIH0gX19wYWNrZWQgX19hbGlnbmVkKDQpOwogCiAvKiBUWCBjb250cm9sIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KQEAgLTIzOCwxMiArMjY4LDE0IEBACiAjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1JUU19DVFNfUkFURQkweDAxZjAwMDAwIC8qIFJUUyBvciBDVFMgcmF0ZSAqLwogI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19SVFNfQ1RTX1JBVEVfUwkyMAogCi0vKgotICogQ29tbW9uIFRYIHN0YXR1cyBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od190eF9zdGF0dXMgLSBDb21tb24gVFggc3RhdHVzIGRlc2NyaXB0b3IKKyAqIEB0eF9zdGF0dXNfMDogVFggc3RhdHVzIHdvcmQgMAorICogQHR4X3N0YXR1c18xOiBUWCBzdGF0dXMgd29yZCAxCiAgKi8KIHN0cnVjdCBhdGg1a19od190eF9zdGF0dXMgewotCXUzMgl0eF9zdGF0dXNfMDsgLyogVFggc3RhdHVzIHdvcmQgMCAqLwotCXUzMgl0eF9zdGF0dXNfMTsgLyogVFggc3RhdHVzIHdvcmQgMSAqLworCXUzMgl0eF9zdGF0dXNfMDsKKwl1MzIJdHhfc3RhdHVzXzE7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogLyogVFggc3RhdHVzIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KQEAgLTI3NiwzNyArMzA4LDQ3IEBACiAjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0NPTVBfU1VDQ0VTU181MjEyCTB4MDA4MDAwMDAgLyogWzUyMTJdIGNvbXByZXNzaW9uIHN0YXR1cyAqLwogI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9YTUlUX0FOVEVOTkFfNTIxMgkweDAxMDAwMDAwIC8qIFs1MjEyXSB0cmFuc21pdCBhbnRlbm5hICovCiAKLS8qCi0gKiA1MjEwLzUyMTEgaGFyZHdhcmUgVFggZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfNTIxMF90eF9kZXNjIC0gNTIxMC81MjExIGhhcmR3YXJlIFRYIGRlc2NyaXB0b3IKKyAqIEB0eF9jdGw6IFRoZSAmc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bAorICogQHR4X3N0YXQ6IFRoZSAmc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwogICovCiBzdHJ1Y3QgYXRoNWtfaHdfNTIxMF90eF9kZXNjIHsKIAlzdHJ1Y3QgYXRoNWtfaHdfMndfdHhfY3RsCXR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzCXR4X3N0YXQ7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAotLyoKLSAqIDUyMTIgaGFyZHdhcmUgVFggZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfNTIxMl90eF9kZXNjIC0gNTIxMiBoYXJkd2FyZSBUWCBkZXNjcmlwdG9yCisgKiBAdHhfY3RsOiBUaGUgJnN0cnVjdCBhdGg1a19od180d190eF9jdGwKKyAqIEB0eF9zdGF0OiBUaGUgJnN0cnVjdCBhdGg1a19od190eF9zdGF0dXMKICAqLwogc3RydWN0IGF0aDVrX2h3XzUyMTJfdHhfZGVzYyB7CiAJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bAl0eF9jdGw7CiAJc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwl0eF9zdGF0OwogfSBfX3BhY2tlZCBfX2FsaWduZWQoNCk7CiAKLS8qCi0gKiBDb21tb24gaGFyZHdhcmUgUlggZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfYWxsX3J4X2Rlc2MgLSBDb21tb24gaGFyZHdhcmUgUlggZGVzY3JpcHRvcgorICogQHJ4X2N0bDogVGhlICZzdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsCisgKiBAcnhfc3RhdDogVGhlICZzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzCiAgKi8KIHN0cnVjdCBhdGg1a19od19hbGxfcnhfZGVzYyB7CiAJc3RydWN0IGF0aDVrX2h3X3J4X2N0bAkJcnhfY3RsOwogCXN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMJcnhfc3RhdDsKIH0gX19wYWNrZWQgX19hbGlnbmVkKDQpOwogCi0vKgotICogQXRoZXJvcyBoYXJkd2FyZSBETUEgZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfZGVzYyAtIEF0aGVyb3MgaGFyZHdhcmUgRE1BIGRlc2NyaXB0b3IKKyAqIEBkc19saW5rOiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBuZXh0IGRlc2NyaXB0b3IKKyAqIEBkc19kYXRhOiBQaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIChza2IpCisgKiBAdWQ6IFVuaW9uIGNvbnRhaW5pbmcgaHdfNXh4eF90eF9kZXNjIHN0cnVjdHMgYW5kIGh3X2FsbF9yeF9kZXNjCisgKgogICogVGhpcyBpcyByZWFkIGFuZCB3cml0dGVuIHRvIGJ5IHRoZSBoYXJkd2FyZQogICovCiBzdHJ1Y3QgYXRoNWtfZGVzYyB7Ci0JdTMyCWRzX2xpbms7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG5leHQgZGVzY3JpcHRvciAqLwotCXUzMglkc19kYXRhOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIChza2IpICovCisJdTMyCWRzX2xpbms7CisJdTMyCWRzX2RhdGE7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCBhdGg1a19od181MjEwX3R4X2Rlc2MJZHNfdHg1MjEwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RtYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RtYS5jCmluZGV4IDI0ODFmOWMuLjVjYzlhYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kbWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZG1hLmMKQEAgLTIwLDE2ICsyMCwxMyBAQAogKiBETUEgYW5kIGludGVycnVwdCBtYXNraW5nIGZ1bmN0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIGRtYS5jIC0gRE1BIGFuZCBpbnRlcnJ1cHQgbWFza2luZyBmdW5jdGlvbnMKKy8qKgorICogRE9DOiBETUEgYW5kIGludGVycnVwdCBtYXNraW5nIGZ1bmN0aW9ucwogICoKICAqIEhlcmUgd2Ugc2V0dXAgZGVzY3JpcHRvciBwb2ludGVycyAocnhkcC90eGRwKSBzdGFydC9zdG9wIGRtYSBlbmdpbmUgYW5kCiAgKiBoYW5kbGUgcXVldWUgc2V0dXAgZm9yIDUyMTAgY2hpcHNldCAocmVzdCBhcmUgaGFuZGxlZCBvbiBxY3UuYykuCiAgKiBBbHNvIHdlIHNldHVwIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIChJTVIpIGFuZCByZWFkIHRoZSB2YXJpb3VzIGludGVycnVwdAogICogc3RhdHVzIHJlZ2lzdGVycyAoSVNSKS4KLSAqCi0gKiBUT0RPOiBIYW5kbGUgU0lTUiBvbiA1MjExKyBhbmQgaW50cm9kdWNlIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBxdWV1ZQotICogbnVtYmVyIHRoYXQgcmVzdWx0ZWQgdGhlIGludGVycnVwdC4KICAqLwogCiAjaW5jbHVkZSAiYXRoNWsuaCIKQEAgLTQyLDIyICszOSwyMiBAQAogXCoqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19zdGFydF9yeF9kbWEgLSBTdGFydCBETUEgcmVjZWl2ZQotICoKKyAqIGF0aDVrX2h3X3N0YXJ0X3J4X2RtYSgpIC0gU3RhcnQgRE1BIHJlY2VpdmUKICAqIEBhaDoJVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqLwotdm9pZCBhdGg1a19od19zdGFydF9yeF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCkKK3ZvaWQKK2F0aDVrX2h3X3N0YXJ0X3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19DUl9SWEUsIEFSNUtfQ1IpOwogCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0NSKTsKIH0KIAogLyoqCi0gKiBhdGg1a19od19zdG9wX3J4X2RtYSAtIFN0b3AgRE1BIHJlY2VpdmUKLSAqCisgKiBhdGg1a19od19zdG9wX3J4X2RtYSgpIC0gU3RvcCBETUEgcmVjZWl2ZQogICogQGFoOglUaGUgJnN0cnVjdCBhdGg1a19odwogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3N0b3BfcnhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgpCitzdGF0aWMgaW50CithdGg1a19od19zdG9wX3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC03OSwyNCArNzYsMjQgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfcnhkcCAtIEdldCBSWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcwotICoKKyAqIGF0aDVrX2h3X2dldF9yeGRwKCkgLSBHZXQgUlggRGVzY3JpcHRvcidzIGFkZHJlc3MKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqLwotdTMyIGF0aDVrX2h3X2dldF9yeGRwKHN0cnVjdCBhdGg1a19odyAqYWgpCit1MzIKK2F0aDVrX2h3X2dldF9yeGRwKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JYRFApOwogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF9yeGRwIC0gU2V0IFJYIERlc2NyaXB0b3IncyBhZGRyZXNzCi0gKgorICogYXRoNWtfaHdfc2V0X3J4ZHAoKSAtIFNldCBSWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcwogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQHBoeXNfYWRkcjogUlggZGVzY3JpcHRvciBhZGRyZXNzCiAgKgogICogUmV0dXJucyAtRUlPIGlmIHJ4IGlzIGFjdGl2ZQogICovCi1pbnQgYXRoNWtfaHdfc2V0X3J4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHBoeXNfYWRkcikKK2ludAorYXRoNWtfaHdfc2V0X3J4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHBoeXNfYWRkcikKIHsKIAlpZiAoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQ1IpICYgQVI1S19DUl9SWEUpIHsKIAkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19ETUEsCkBAIC0xMTQsOCArMTExLDcgQEAKIFwqKioqKioqKioqLwogCiAvKioKLSAqIGF0aDVrX2h3X3N0YXJ0X3R4X2RtYSAtIFN0YXJ0IERNQSB0cmFuc21pdCBmb3IgYSBzcGVjaWZpYyBxdWV1ZQotICoKKyAqIGF0aDVrX2h3X3N0YXJ0X3R4X2RtYSgpIC0gU3RhcnQgRE1BIHRyYW5zbWl0IGZvciBhIHNwZWNpZmljIHF1ZXVlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKICAqCkBAIC0xMjgsNyArMTI0LDggQEAKICAqIE5PVEU6IE11c3QgYmUgY2FsbGVkIGFmdGVyIHNldHRpbmcgdXAgdHggY29udHJvbCBkZXNjcmlwdG9yIGZvciB0aGF0CiAgKiBxdWV1ZSAoc2VlIGJlbG93KS4KICAqLwotaW50IGF0aDVrX2h3X3N0YXJ0X3R4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCitpbnQKK2F0aDVrX2h3X3N0YXJ0X3R4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCiB7CiAJdTMyIHR4X3F1ZXVlOwogCkBAIC0xNzcsMTcgKzE3NCwxNiBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3N0b3BfdHhfZG1hIC0gU3RvcCBETUEgdHJhbnNtaXQgb24gYSBzcGVjaWZpYyBxdWV1ZQotICoKKyAqIGF0aDVrX2h3X3N0b3BfdHhfZG1hKCkgLSBTdG9wIERNQSB0cmFuc21pdCBvbiBhIHNwZWNpZmljIHF1ZXVlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKICAqCiAgKiBTdG9wIERNQSB0cmFuc21pdCBvbiBhIHNwZWNpZmljIGh3IHF1ZXVlIGFuZCBkcmFpbiBxdWV1ZSBzbyB3ZSBkb24ndAogICogaGF2ZSBhbnkgcGVuZGluZyBmcmFtZXMuIFJldHVybnMgLUVCVVNZIGlmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBmcmFtZXMsCiAgKiAtRUlOVkFMIGlmIHF1ZXVlIG51bWJlciBpcyBvdXQgb2YgcmFuZ2Ugb3IgaW5hY3RpdmUuCi0gKgogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3N0b3BfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3N0b3BfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAl1bnNpZ25lZCBpbnQgaSA9IDQwOwogCXUzMiB0eF9xdWV1ZSwgcGVuZGluZzsKQEAgLTMyMCwxNCArMzE2LDE0IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc3RvcF9iZWFjb25fcXVldWUgLSBTdG9wIGJlYWNvbiBxdWV1ZQotICoKLSAqIEBhaCBUaGUgJnN0cnVjdCBhdGg1a19odwotICogQHF1ZXVlIFRoZSBxdWV1ZSBudW1iZXIKKyAqIGF0aDVrX2h3X3N0b3BfYmVhY29uX3F1ZXVlKCkgLSBTdG9wIGJlYWNvbiBxdWV1ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlOiBUaGUgcXVldWUgbnVtYmVyCiAgKgogICogUmV0dXJucyAtRUlPIGlmIHF1ZXVlIGRpZG4ndCBzdG9wCiAgKi8KLWludCBhdGg1a19od19zdG9wX2JlYWNvbl9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCitpbnQKK2F0aDVrX2h3X3N0b3BfYmVhY29uX3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAlpbnQgcmV0OwogCXJldCA9IGF0aDVrX2h3X3N0b3BfdHhfZG1hKGFoLCBxdWV1ZSk7CkBAIC0zNDAsOCArMzM2LDcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfdHhkcCAtIEdldCBUWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZQotICoKKyAqIGF0aDVrX2h3X2dldF90eGRwKCkgLSBHZXQgVFggRGVzY3JpcHRvcidzIGFkZHJlc3MgZm9yIGEgc3BlY2lmaWMgcXVldWUKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBxdWV1ZTogVGhlIGh3IHF1ZXVlIG51bWJlcgogICoKQEAgLTM1Miw3ICszNDcsOCBAQAogICoKICAqIFhYWDogSXMgVFhEUCByZWFkIGFuZCBjbGVhciA/CiAgKi8KLXUzMiBhdGg1a19od19nZXRfdHhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCit1MzIKK2F0aDVrX2h3X2dldF90eGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAl1MTYgdHhfcmVnOwogCkBAIC0zODIsMTAgKzM3OCwxMCBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF90eGRwIC0gU2V0IFRYIERlc2NyaXB0b3IncyBhZGRyZXNzIGZvciBhIHNwZWNpZmljIHF1ZXVlCi0gKgorICogYXRoNWtfaHdfc2V0X3R4ZHAoKSAtIFNldCBUWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQHF1ZXVlOiBUaGUgaHcgcXVldWUgbnVtYmVyCisgKiBAcGh5c19hZGRyOiBUaGUgcGh5c2ljYWwgYWRkcmVzcwogICoKICAqIFNldCBUWCBkZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZS4gRm9yIDUyMTAgd2UgaWdub3JlCiAgKiB0aGUgcXVldWUgbnVtYmVyIGFuZCB3ZSB1c2UgdHggcXVldWUgdHlwZSBzaW5jZSB3ZSBvbmx5IGhhdmUgMiBxdWV1ZXMKQEAgLTM5NCw3ICszOTAsOCBAQAogICogUmV0dXJucyAtRUlOVkFMIGlmIHF1ZXVlIHR5cGUgaXMgaW52YWxpZCBmb3IgNTIxMCBhbmQgLUVJTyBpZiBxdWV1ZSBpcyBzdGlsbAogICogYWN0aXZlLgogICovCi1pbnQgYXRoNWtfaHdfc2V0X3R4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlLCB1MzIgcGh5c19hZGRyKQoraW50CithdGg1a19od19zZXRfdHhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUsIHUzMiBwaHlzX2FkZHIpCiB7CiAJdTE2IHR4X3JlZzsKIApAQCAtNDM1LDggKzQzMiw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbCAtIFVwZGF0ZSB0eCB0cmlnZ2VyIGxldmVsCi0gKgorICogYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbCgpIC0gVXBkYXRlIHR4IHRyaWdnZXIgbGV2ZWwKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBpbmNyZWFzZTogRmxhZyB0byBmb3JjZSBpbmNyZWFzZSBvZiB0cmlnZ2VyIGxldmVsCiAgKgpAQCAtNDQ0LDE1ICs0NDAsMTUgQEAKICAqIGJ1ZmZlciAoYWthIEZJRk8gdGhyZXNob2xkKSB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hlbiBQQ1UgZmx1c2hlcwogICogdGhlIGJ1ZmZlciBhbmQgdHJhbnNtaXRzIGl0cyBkYXRhLiBMb3dlcmluZyB0aGlzIHJlc3VsdHMgc2VuZGluZyBzbWFsbAogICogZnJhbWVzIG1vcmUgcXVpY2tseSBidXQgY2FuIGxlYWQgdG8gdHggdW5kZXJydW5zLCByYWlzaW5nIGl0IGEgbG90IGNhbgotICogcmVzdWx0IG90aGVyIHByb2JsZW1zIChpIHRoaW5rIGJtaXNzIGlzIHJlbGF0ZWQpLiBSaWdodCBub3cgd2Ugc3RhcnQgd2l0aAotICogdGhlIGxvd2VzdCBwb3NzaWJsZSAoNjRCeXRlcykgYW5kIGlmIHdlIGdldCB0eCB1bmRlcnJ1biB3ZSBpbmNyZWFzZSBpdCB1c2luZwotICogdGhlIGluY3JlYXNlIGZsYWcuIFJldHVybnMgLUVJTyBpZiB3ZSBoYXZlIHJlYWNoZWQgbWF4aW11bS9taW5pbXVtLgorICogcmVzdWx0IG90aGVyIHByb2JsZW1zLiBSaWdodCBub3cgd2Ugc3RhcnQgd2l0aCB0aGUgbG93ZXN0IHBvc3NpYmxlCisgKiAoNjRCeXRlcykgYW5kIGlmIHdlIGdldCB0eCB1bmRlcnJ1biB3ZSBpbmNyZWFzZSBpdCB1c2luZyB0aGUgaW5jcmVhc2UKKyAqIGZsYWcuIFJldHVybnMgLUVJTyBpZiB3ZSBoYXZlIHJlYWNoZWQgbWF4aW11bS9taW5pbXVtLgogICoKICAqIFhYWDogTGluayB0aGlzIHdpdGggdHggRE1BIHNpemUgPwotICogWFhYOiBVc2UgaXQgdG8gc2F2ZSBpbnRlcnJ1cHRzID8KLSAqIFRPRE86IE5lZWRzIHRlc3RpbmcsIGkgdGhpbmsgaXQncyByZWxhdGVkIHRvIGJtaXNzLi4uCisgKiBYWFgyOiBVc2UgaXQgdG8gc2F2ZSBpbnRlcnJ1cHRzID8KICAqLwotaW50IGF0aDVrX2h3X3VwZGF0ZV90eF90cmlnbGV2ZWwoc3RydWN0IGF0aDVrX2h3ICphaCwgYm9vbCBpbmNyZWFzZSkKK2ludAorYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBib29sIGluY3JlYXNlKQogewogCXUzMiB0cmlnZ2VyX2xldmVsLCBpbXI7CiAJaW50IHJldCA9IC1FSU87CkBAIC00OTgsMjEgKzQ5NCwyMCBAQAogXCoqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nIC0gQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGludGVycnVwdHMKLSAqCisgKiBhdGg1a19od19pc19pbnRyX3BlbmRpbmcoKSAtIENoZWNrIGlmIHdlIGhhdmUgcGVuZGluZyBpbnRlcnJ1cHRzCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGludGVycnVwdHMgdG8gcHJvY2Vzcy4gUmV0dXJucyAxIGlmIHdlCiAgKiBoYXZlIHBlbmRpbmcgaW50ZXJydXB0cyBhbmQgMCBpZiB3ZSBoYXZlbid0LgogICovCi1ib29sIGF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorYm9vbAorYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0lOVFBFTkQpID09IDEgPyAxIDogMDsKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfaXNyIC0gR2V0IGludGVycnVwdCBzdGF0dXMKLSAqCisgKiBhdGg1a19od19nZXRfaXNyKCkgLSBHZXQgaW50ZXJydXB0IHN0YXR1cwogICogQGFoOiBUaGUgQHN0cnVjdCBhdGg1a19odwogICogQGludGVycnVwdF9tYXNrOiBEcml2ZXIncyBpbnRlcnJ1cHQgbWFzayB1c2VkIHRvIGZpbHRlciBvdXQKICAqIGludGVycnVwdHMgaW4gc3cuCkBAIC01MjMsNjIgKzUxOCwxNjIgQEAKICAqIGJlaW5nIG1hcHBlZCBvbiBzb21lIHN0YW5kYXJkIG5vbiBody1zcGVjaWZpYyBwb3NpdGlvbnMKICAqIChjaGVjayBvdXQgJmF0aDVrX2ludCkuCiAgKgotICogTk9URTogV2UgdXNlIHJlYWQtYW5kLWNsZWFyIHJlZ2lzdGVyLCBzbyBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBJU1IKLSAqIGlzIHplcm9lZC4KKyAqIE5PVEU6IFdlIGRvIHdyaXRlLXRvLWNsZWFyLCBzbyB0aGUgYWN0aXZlIFBJU1IvU0lTUiBiaXRzIGF0IHRoZSB0aW1lIHRoaXMKKyAqIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGFyZSBjbGVhcmVkIG9uIHJldHVybi4KICAqLwotaW50IGF0aDVrX2h3X2dldF9pc3Ioc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgKmludGVycnVwdF9tYXNrKQoraW50CithdGg1a19od19nZXRfaXNyKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50ICppbnRlcnJ1cHRfbWFzaykKIHsKLQl1MzIgZGF0YTsKKwl1MzIgZGF0YSA9IDA7CiAKIAkvKgotCSAqIFJlYWQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIHRoZSBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyCi0JICogb24gNTIxMAorCSAqIFJlYWQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIFByaW1hcnkgSW50ZXJydXB0CisJICogUmVnaXN0ZXIuCisJICoKKwkgKiBOb3RlOiBQSVNSL1NJU1IgTm90IGF2YWlsYWJsZSBvbiA1MjEwCiAJICovCiAJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCWRhdGEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19JU1IpOwotCQlpZiAodW5saWtlbHkoZGF0YSA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7Ci0JCQkqaW50ZXJydXB0X21hc2sgPSBkYXRhOworCQl1MzIgaXNyID0gMDsKKwkJaXNyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfSVNSKTsKKwkJaWYgKHVubGlrZWx5KGlzciA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7CisJCQkqaW50ZXJydXB0X21hc2sgPSBpc3I7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCX0gZWxzZSB7CisKIAkJLyoKLQkJICogUmVhZCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gSW50ZXJydXB0Ci0JCSAqIFN0YXR1cyBSZWdpc3RlciBzaGFkb3cgY29weSAoUmVhZCBBbmQgQ2xlYXIpCi0JCSAqCi0JCSAqIE5vdGU6IFBJU1IvU0lTUiBOb3QgYXZhaWxhYmxlIG9uIDUyMTAKKwkJICogRmlsdGVyIG91dCB0aGUgbm9uLWNvbW1vbiBiaXRzIGZyb20gdGhlIGludGVycnVwdAorCQkgKiBzdGF0dXMuCiAJCSAqLwotCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1BJU1IpOwotCQlpZiAodW5saWtlbHkoZGF0YSA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7Ci0JCQkqaW50ZXJydXB0X21hc2sgPSBkYXRhOworCQkqaW50ZXJydXB0X21hc2sgPSAoaXNyICYgQVI1S19JTlRfQ09NTU9OKSAmIGFoLT5haF9pbXI7CisKKwkJLyogSGFubGRlIElOVF9GQVRBTCAqLworCQlpZiAodW5saWtlbHkoaXNyICYgKEFSNUtfSVNSX1NTRVJSIHwgQVI1S19JU1JfTUNBQlQKKwkJCQkJCXwgQVI1S19JU1JfRFBFUlIpKSkKKwkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9GQVRBTDsKKworCQkvKgorCQkgKiBYWFg6IEJNSVNTIGludGVycnVwdHMgbWF5IG9jY3VyIGFmdGVyIGFzc29jaWF0aW9uLgorCQkgKiBJIGZvdW5kIHRoaXMgb24gNTIxMCBjb2RlIGJ1dCBpdCBuZWVkcyB0ZXN0aW5nLiBJZiB0aGlzIGlzCisJCSAqIHRydWUgd2Ugc2hvdWxkIGRpc2FibGUgdGhlbSBiZWZvcmUgYXNzb2MgYW5kIHJlLWVuYWJsZSB0aGVtCisJCSAqIGFmdGVyIGEgc3VjY2Vzc2Z1bCBhc3NvYyArIHNvbWUgamlmZmllcy4KKwkJCWludGVycnVwdF9tYXNrICY9IH5BUjVLX0lOVF9CTUlTUzsKKwkJICovCisKKwkJZGF0YSA9IGlzcjsKKwl9IGVsc2UgeworCQl1MzIgcGlzciA9IDA7CisJCXUzMiBwaXNyX2NsZWFyID0gMDsKKwkJdTMyIHNpc3IwID0gMDsKKwkJdTMyIHNpc3IxID0gMDsKKwkJdTMyIHNpc3IyID0gMDsKKwkJdTMyIHNpc3IzID0gMDsKKwkJdTMyIHNpc3I0ID0gMDsKKworCQkvKiBSZWFkIFBJU1IgYW5kIFNJU1JzLi4uICovCisJCXBpc3IgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSVNSKTsKKwkJaWYgKHVubGlrZWx5KHBpc3IgPT0gQVI1S19JTlRfTk9DQVJEKSkgeworCQkJKmludGVycnVwdF9tYXNrID0gcGlzcjsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JfQogCi0JLyoKLQkgKiBHZXQgYWJzdHJhY3QgaW50ZXJydXB0IG1hc2sgKGRyaXZlci1jb21wYXRpYmxlKQotCSAqLwotCSppbnRlcnJ1cHRfbWFzayA9IChkYXRhICYgQVI1S19JTlRfQ09NTU9OKSAmIGFoLT5haF9pbXI7CisJCXNpc3IwID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU0lTUjApOworCQlzaXNyMSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NJU1IxKTsKKwkJc2lzcjIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19TSVNSMik7CisJCXNpc3IzID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU0lTUjMpOworCQlzaXNyNCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NJU1I0KTsKIAotCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgewotCQl1MzIgc2lzcjIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjIpOworCQkvKgorCQkgKiBQSVNSIGhvbGRzIHRoZSBsb2dpY2FsIE9SIG9mIGludGVycnVwdCBiaXRzCisJCSAqIGZyb20gU0lTUiByZWdpc3RlcnM6CisJCSAqCisJCSAqIFRYT0sgYW5kIFRYREVTQyAgLT4gTG9naWNhbCBPUiBvZiBUWE9LIGFuZCBUWERFU0MKKwkJICoJCQlwZXItcXVldWUgYml0cyBvbiBTSVNSMAorCQkgKgorCQkgKiBUWEVSUiBhbmQgVFhFT0wgLT4gTG9naWNhbCBPUiBvZiBUWEVSUiBhbmQgVFhFT0wKKwkJICoJCQlwZXItcXVldWUgYml0cyBvbiBTSVNSMQorCQkgKgorCQkgKiBUWFVSTiAtPiBMb2dpY2FsIE9SIG9mIFRYVVJOIHBlci1xdWV1ZSBiaXRzIG9uIFNJU1IyCisJCSAqCisJCSAqIEhJVUVSUiAtPiBMb2dpY2FsIE9SIG9mIE1DQUJULCBTU0VSUiBhbmQgRFBFUiBiaXRzIG9uIFNJU1IyCisJCSAqCisJCSAqIEJDTk1JU0MgLT4gTG9naWNhbCBPUiBvZiBUSU0sIENBQl9FTkQsIERUSU1fU1lOQworCQkgKgkJQkNOX1RJTUVPVVQsIENBQl9USU1FT1VUIGFuZCBEVElNCisJCSAqCQkoYW5kIFRTRk9PUiA/KSBiaXRzIG9uIFNJU1IyCisJCSAqCisJCSAqIFFDQlJPUk4gYW5kIFFDQlJVUk4gLT4gTG9naWNhbCBPUiBvZiBRQ0JST1JOIGFuZAorCQkgKgkJCVFDQlJVUk4gcGVyLXF1ZXVlIGJpdHMgb24gU0lTUjMKKwkJICogUVRSSUcgLT4gTG9naWNhbCBPUiBvZiBRVFJJRyBwZXItcXVldWUgYml0cyBvbiBTSVNSNAorCQkgKgorCQkgKiBJZiB3ZSBjbGVhbiB0aGVzZSBiaXRzIG9uIFBJU1Igd2UgJ2xsIGFsc28gY2xlYXIgYWxsCisJCSAqIHJlbGF0ZWQgYml0cyBmcm9tIFNJU1JzLCBlLmcuIGlmIHdlIHdyaXRlIHRoZSBUWE9LIGJpdCBvbgorCQkgKiBQSVNSIHdlICdsbCBjbGVhbiBhbGwgVFhPSyBiaXRzIGZyb20gU0lTUjAgc28gaWYgYSBuZXcgVFhPSworCQkgKiBpbnRlcnJ1cHQgZ290IGZpcmVkIGZvciBhbm90aGVyIHF1ZXVlIHdoaWxlIHdlIHdlcmUgcmVhZGluZworCQkgKiB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyBhbmQgd2Ugd3JpdGUgYmFjayB0aGUgVFhPSyBiaXQgb24KKwkJICogUElTUiB3ZSAnbGwgbG9zZSBpdC4gU28gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3Qgd3JpdGUgYmFjaworCQkgKiBvbiBQSVNSIGFueSBiaXRzIHRoYXQgY29tZSBmcm9tIFNJU1JzLiBDbGVhcmluZyB0aGVtIGZyb20KKwkJICogU0lTUnMgd2lsbCBhbHNvIGNsZWFyIFBJU1Igc28gbm8gbmVlZCB0byB3b3JyeSBoZXJlLgorCQkgKi8KIAotCQkvKkhJVSA9IEhvc3QgSW50ZXJmYWNlIFVuaXQgKFBDSSBldGMpKi8KLQkJaWYgKHVubGlrZWx5KGRhdGEgJiAoQVI1S19JU1JfSElVRVJSKSkpCi0JCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisJCXBpc3JfY2xlYXIgPSBwaXNyICYgfkFSNUtfSVNSX0JJVFNfRlJPTV9TSVNSUzsKIAotCQkvKkJlYWNvbiBOb3QgUmVhZHkqLwotCQlpZiAodW5saWtlbHkoZGF0YSAmIChBUjVLX0lTUl9CTlIpKSkKLQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9CTlI7CisJCS8qCisJCSAqIFdyaXRlIHRvIGNsZWFyIHRoZW0uLi4KKwkJICogTm90ZTogVGhpcyBtZWFucyB0aGF0IGVhY2ggYml0IHdlIHdyaXRlIGJhY2sKKwkJICogdG8gdGhlIHJlZ2lzdGVycyB3aWxsIGdldCBjbGVhcmVkLCBsZWF2aW5nIHRoZQorCQkgKiByZXN0IHVuYWZmZWN0ZWQuIFNvIHRoaXMgd29uJ3QgYWZmZWN0IG5ldyBpbnRlcnJ1cHRzCisJCSAqIHdlIGRpZG4ndCBjYXRjaCB3aGlsZSByZWFkaW5nL3Byb2Nlc3NpbmcsIHdlICdsbCBnZXQKKwkJICogdGhlbSBuZXh0IHRpbWUgZ2V0X2lzciBnZXRzIGNhbGxlZC4KKwkJICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2lzcjAsIEFSNUtfU0lTUjApOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNpc3IxLCBBUjVLX1NJU1IxKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzaXNyMiwgQVI1S19TSVNSMik7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2lzcjMsIEFSNUtfU0lTUjMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNpc3I0LCBBUjVLX1NJU1I0KTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBwaXNyX2NsZWFyLCBBUjVLX1BJU1IpOworCQkvKiBGbHVzaCBwcmV2aW91cyB3cml0ZSAqLworCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSVNSKTsKIAotCQlpZiAodW5saWtlbHkoc2lzcjIgJiAoQVI1S19TSVNSMl9TU0VSUiB8Ci0JCQkJCUFSNUtfU0lTUjJfRFBFUlIgfAotCQkJCQlBUjVLX1NJU1IyX01DQUJUKSkpCi0JCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisJCS8qCisJCSAqIEZpbHRlciBvdXQgdGhlIG5vbi1jb21tb24gYml0cyBmcm9tIHRoZSBpbnRlcnJ1cHQKKwkJICogc3RhdHVzLgorCQkgKi8KKwkJKmludGVycnVwdF9tYXNrID0gKHBpc3IgJiBBUjVLX0lOVF9DT01NT04pICYgYWgtPmFoX2ltcjsKIAotCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RJTSkKKworCQkvKiBXZSB0cmVhdCBUWE9LLFRYREVTQywgVFhFUlIgYW5kIFRYRU9MCisJCSAqIHRoZSBzYW1lIHdheSAoc2NoZWR1bGUgdGhlIHR4IHRhc2tsZXQpCisJCSAqIHNvIHdlIHRyYWNrIHRoZW0gYWxsIHRvZ2V0aGVyIHBlciBxdWV1ZSAqLworCQlpZiAocGlzciAmIEFSNUtfSVNSX1RYT0spCisJCQlhaC0+YWhfdHhxX2lzcl90eG9rX2FsbCB8PSBBUjVLX1JFR19NUyhzaXNyMCwKKwkJCQkJCUFSNUtfU0lTUjBfUUNVX1RYT0spOworCisJCWlmIChwaXNyICYgQVI1S19JU1JfVFhERVNDKQorCQkJYWgtPmFoX3R4cV9pc3JfdHhva19hbGwgfD0gQVI1S19SRUdfTVMoc2lzcjAsCisJCQkJCQlBUjVLX1NJU1IwX1FDVV9UWERFU0MpOworCisJCWlmIChwaXNyICYgQVI1S19JU1JfVFhFUlIpCisJCQlhaC0+YWhfdHhxX2lzcl90eG9rX2FsbCB8PSBBUjVLX1JFR19NUyhzaXNyMSwKKwkJCQkJCUFSNUtfU0lTUjFfUUNVX1RYRVJSKTsKKworCQlpZiAocGlzciAmIEFSNUtfSVNSX1RYRU9MKQorCQkJYWgtPmFoX3R4cV9pc3JfdHhva19hbGwgfD0gQVI1S19SRUdfTVMoc2lzcjEsCisJCQkJCQlBUjVLX1NJU1IxX1FDVV9UWEVPTCk7CisKKwkJLyogQ3VycmVudGx5IHRoaXMgaXMgbm90IG11Y2ggdXNlZnVsbCBzaW5jZSB3ZSB0cmVhdAorCQkgKiBhbGwgcXVldWVzIHRoZSBzYW1lIHdheSBpZiB3ZSBnZXQgYSBUWFVSTiAodXBkYXRlCisJCSAqIHR4IHRyaWdnZXIgbGV2ZWwpIGJ1dCB3ZSBtaWdodCBuZWVkIGl0IGxhdGVyIG9uKi8KKwkJaWYgKHBpc3IgJiBBUjVLX0lTUl9UWFVSTikKKwkJCWFoLT5haF90eHFfaXNyX3R4dXJuIHw9IEFSNUtfUkVHX01TKHNpc3IyLAorCQkJCQkJQVI1S19TSVNSMl9RQ1VfVFhVUk4pOworCisJCS8qIE1pc2MgQmVhY29uIHJlbGF0ZWQgaW50ZXJydXB0cyAqLworCisJCS8qIEZvciBBUjUyMTEgKi8KKwkJaWYgKHBpc3IgJiBBUjVLX0lTUl9USU0pCiAJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfVElNOwogCi0JCWlmIChkYXRhICYgQVI1S19JU1JfQkNOTUlTQykgeworCQkvKiBGb3IgQVI1MjEyKyAqLworCQlpZiAocGlzciAmIEFSNUtfSVNSX0JDTk1JU0MpIHsKIAkJCWlmIChzaXNyMiAmIEFSNUtfU0lTUjJfVElNKQogCQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9USU07CiAJCQlpZiAoc2lzcjIgJiBBUjVLX1NJU1IyX0RUSU0pCkBAIC01OTEsNjMgKzY4NiwzOSBAQAogCQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9DQUJfVElNRU9VVDsKIAkJfQogCi0JCWlmIChkYXRhICYgQVI1S19JU1JfUlhET1BQTEVSKQotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1JYX0RPUFBMRVI7Ci0JCWlmIChkYXRhICYgQVI1S19JU1JfUUNCUk9STikgewotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJPUk47Ci0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IzKSwKLQkJCQkJQVI1S19TSVNSM19RQ0JST1JOKTsKLQkJfQotCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1FDQlJVUk4pIHsKLQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9RQ0JSVVJOOwotCQkJYWgtPmFoX3R4cV9pc3IgfD0gQVI1S19SRUdfTVMoCi0JCQkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSMyksCi0JCQkJCUFSNUtfU0lTUjNfUUNCUlVSTik7Ci0JCX0KLQkJaWYgKGRhdGEgJiBBUjVLX0lTUl9RVFJJRykgewotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FUUklHOwotCQkJYWgtPmFoX3R4cV9pc3IgfD0gQVI1S19SRUdfTVMoCi0JCQkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSNCksCi0JCQkJCUFSNUtfU0lTUjRfUVRSSUcpOwotCQl9CisJCS8qIEJlbG93IGludGVycnVwdHMgYXJlIHVubGlrZWx5IHRvIGhhcHBlbiAqLwogCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhPSykKLQkJCWFoLT5haF90eHFfaXNyIHw9IEFSNUtfUkVHX01TKAotCQkJCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjApLAotCQkJCQlBUjVLX1NJU1IwX1FDVV9UWE9LKTsKLQotCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RYREVTQykKLQkJCWFoLT5haF90eHFfaXNyIHw9IEFSNUtfUkVHX01TKAotCQkJCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjApLAotCQkJCQlBUjVLX1NJU1IwX1FDVV9UWERFU0MpOwotCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhFUlIpCi0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IxKSwKLQkJCQkJQVI1S19TSVNSMV9RQ1VfVFhFUlIpOwotCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhFT0wpCi0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IxKSwKLQkJCQkJQVI1S19TSVNSMV9RQ1VfVFhFT0wpOwotCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhVUk4pCi0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IyKSwKLQkJCQkJQVI1S19TSVNSMl9RQ1VfVFhVUk4pOwotCX0gZWxzZSB7Ci0JCWlmICh1bmxpa2VseShkYXRhICYgKEFSNUtfSVNSX1NTRVJSIHwgQVI1S19JU1JfTUNBQlQKLQkJCQl8IEFSNUtfSVNSX0hJVUVSUiB8IEFSNUtfSVNSX0RQRVJSKSkpCisJCS8qIEhJVSA9IEhvc3QgSW50ZXJmYWNlIFVuaXQgKFBDSSBldGMpCisJCSAqIENhbiBiZSBvbmUgb2YgTUNBQlQsIFNTRVJSLCBEUEVSUiBmcm9tIFNJU1IyICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX0hJVUVSUikpKQogCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX0ZBVEFMOwogCi0JCS8qCi0JCSAqIFhYWDogQk1JU1MgaW50ZXJydXB0cyBtYXkgb2NjdXIgYWZ0ZXIgYXNzb2NpYXRpb24uCi0JCSAqIEkgZm91bmQgdGhpcyBvbiA1MjEwIGNvZGUgYnV0IGl0IG5lZWRzIHRlc3RpbmcuIElmIHRoaXMgaXMKLQkJICogdHJ1ZSB3ZSBzaG91bGQgZGlzYWJsZSB0aGVtIGJlZm9yZSBhc3NvYyBhbmQgcmUtZW5hYmxlIHRoZW0KLQkJICogYWZ0ZXIgYSBzdWNjZXNzZnVsIGFzc29jICsgc29tZSBqaWZmaWVzLgotCQkJaW50ZXJydXB0X21hc2sgJj0gfkFSNUtfSU5UX0JNSVNTOwotCQkgKi8KKwkJLypCZWFjb24gTm90IFJlYWR5Ki8KKwkJaWYgKHVubGlrZWx5KHBpc3IgJiAoQVI1S19JU1JfQk5SKSkpCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfQk5SOworCisJCS8qIEEgcXVldWUgZ290IENCUiBvdmVycnVuICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX1FDQlJPUk4pKSkgeworCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJPUk47CisJCQlhaC0+YWhfdHhxX2lzcl9xY2Jvcm4gfD0gQVI1S19SRUdfTVMoc2lzcjMsCisJCQkJCQlBUjVLX1NJU1IzX1FDQlJPUk4pOworCQl9CisKKwkJLyogQSBxdWV1ZSBnb3QgQ0JSIHVuZGVycnVuICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX1FDQlJVUk4pKSkgeworCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJVUk47CisJCQlhaC0+YWhfdHhxX2lzcl9xY2J1cm4gfD0gQVI1S19SRUdfTVMoc2lzcjMsCisJCQkJCQlBUjVLX1NJU1IzX1FDQlJVUk4pOworCQl9CisKKwkJLyogQSBxdWV1ZSBnb3QgdHJpZ2dlcmVkICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX1FUUklHKSkpIHsKKwkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9RVFJJRzsKKwkJCWFoLT5haF90eHFfaXNyX3F0cmlnIHw9IEFSNUtfUkVHX01TKHNpc3I0LAorCQkJCQkJQVI1S19TSVNSNF9RVFJJRyk7CisJCX0KKworCQlkYXRhID0gcGlzcjsKIAl9CiAKIAkvKgpAQCAtNjYxLDggKzczMiw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2ltciAtIFNldCBpbnRlcnJ1cHQgbWFzawotICoKKyAqIGF0aDVrX2h3X3NldF9pbXIoKSAtIFNldCBpbnRlcnJ1cHQgbWFzawogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQG5ld19tYXNrOiBUaGUgbmV3IGludGVycnVwdCBtYXNrIHRvIGJlIHNldAogICoKQEAgLTY3MCw3ICs3NDAsOCBAQAogICogYXRoNWtfaW50IGJpdHMgdG8gaHctc3BlY2lmaWMgYml0cyB0byByZW1vdmUgYWJzdHJhY3Rpb24gYW5kIHdyaXRpbmcKICAqIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLgogICovCi1lbnVtIGF0aDVrX2ludCBhdGg1a19od19zZXRfaW1yKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50IG5ld19tYXNrKQorZW51bSBhdGg1a19pbnQKK2F0aDVrX2h3X3NldF9pbXIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgbmV3X21hc2spCiB7CiAJZW51bSBhdGg1a19pbnQgb2xkX21hc2ssIGludF9tYXNrOwogCkBAIC02OTcsMTYgKzc2OCwxNCBAQAogCQl1MzIgc2ltcjIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19TSU1SMikKIAkJCQkmIEFSNUtfU0lNUjJfUUNVX1RYVVJOOwogCisJCS8qIEZhdGFsIGludGVycnVwdCBhYnN0cmFjdGlvbiBmb3IgNTIxMSsgKi8KIAkJaWYgKG5ld19tYXNrICYgQVI1S19JTlRfRkFUQUwpIHsKIAkJCWludF9tYXNrIHw9IEFSNUtfSU1SX0hJVUVSUjsKIAkJCXNpbXIyIHw9IChBUjVLX1NJTVIyX01DQUJUIHwgQVI1S19TSU1SMl9TU0VSUgogCQkJCXwgQVI1S19TSU1SMl9EUEVSUik7CiAJCX0KIAotCQkvKkJlYWNvbiBOb3QgUmVhZHkqLwotCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9CTlIpCi0JCQlpbnRfbWFzayB8PSBBUjVLX0lOVF9CTlI7Ci0KKwkJLyogTWlzYyBiZWFjb24gcmVsYXRlZCBpbnRlcnJ1cHRzICovCiAJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX1RJTSkKIAkJCWludF9tYXNrIHw9IEFSNUtfSU1SX1RJTTsKIApAQCAtNzIxLDggKzc5MCw5IEBACiAJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX0NBQl9USU1FT1VUKQogCQkJc2ltcjIgfD0gQVI1S19TSVNSMl9DQUJfVElNRU9VVDsKIAotCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9SWF9ET1BQTEVSKQotCQkJaW50X21hc2sgfD0gQVI1S19JTVJfUlhET1BQTEVSOworCQkvKkJlYWNvbiBOb3QgUmVhZHkqLworCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9CTlIpCisJCQlpbnRfbWFzayB8PSBBUjVLX0lOVF9CTlI7CiAKIAkJLyogTm90ZTogUGVyIHF1ZXVlIGludGVycnVwdCBtYXNrcwogCQkgKiBhcmUgc2V0IHZpYSBhdGg1a19od19yZXNldF90eF9xdWV1ZSgpIChxY3UuYykgKi8KQEAgLTczMCwxMCArODAwLDEyIEBACiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2ltcjIsIEFSNUtfU0lNUjIpOwogCiAJfSBlbHNlIHsKKwkJLyogRmF0YWwgaW50ZXJydXB0IGFic3RyYWN0aW9uIGZvciA1MjEwICovCiAJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX0ZBVEFMKQogCQkJaW50X21hc2sgfD0gKEFSNUtfSU1SX1NTRVJSIHwgQVI1S19JTVJfTUNBQlQKIAkJCQl8IEFSNUtfSU1SX0hJVUVSUiB8IEFSNUtfSU1SX0RQRVJSKTsKIAorCQkvKiBPbmx5IGNvbW1vbiBpbnRlcnJ1cHRzIGxlZnQgZm9yIDUyMTAgKG5vIFNJTVJzKSAqLwogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGludF9tYXNrLCBBUjVLX0lNUik7CiAJfQogCkBAIC03NjAsOCArODMyLDcgQEAKIFwqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19kbWFfaW5pdCAtIEluaXRpYWxpemUgRE1BIHVuaXQKLSAqCisgKiBhdGg1a19od19kbWFfaW5pdCgpIC0gSW5pdGlhbGl6ZSBETUEgdW5pdAogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFNldCBETUEgc2l6ZSBhbmQgcHJlLWVuYWJsZSBpbnRlcnJ1cHRzCkBAIC03NzAsNyArODQxLDggQEAKICAqCiAgKiBYWFg6IFNhdmUvcmVzdG9yZSBSWERQL1RYRFAgcmVnaXN0ZXJzID8KICAqLwotdm9pZCBhdGg1a19od19kbWFfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZAorYXRoNWtfaHdfZG1hX2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAkvKgogCSAqIFNldCBSeC9UeCBETUEgQ29uZmlndXJhdGlvbgpAQCAtNzk5LDggKzg3MSw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfZG1hX3N0b3AgLSBzdG9wIERNQSB1bml0Ci0gKgorICogYXRoNWtfaHdfZG1hX3N0b3AoKSAtIHN0b3AgRE1BIHVuaXQKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBTdG9wIHR4L3J4IERNQSBhbmQgaW50ZXJydXB0cy4gUmV0dXJucwpAQCAtODEwLDcgKzg4MSw4IEBACiAgKiBzdHVjayBmcmFtZXMgb24gdHggcXVldWVzLCBvbmx5IGEgcmVzZXQKICAqIGNhbiBmaXggdGhhdC4KICAqLwotaW50IGF0aDVrX2h3X2RtYV9zdG9wKHN0cnVjdCBhdGg1a19odyAqYWgpCitpbnQKK2F0aDVrX2h3X2RtYV9zdG9wKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJaW50IGksIHFtYXgsIGVycjsKIAllcnIgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2dwaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9ncGlvLmMKaW5kZXggODU5Mjk3OC4uNzNkM2RkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2dwaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZ3Bpby5jCkBAIC0yNCwxMCArMjQsMzMgQEAKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi0vKgotICogU2V0IGxlZCBzdGF0ZQorCisvKioKKyAqIERPQzogR1BJTy9MRUQgZnVuY3Rpb25zCisgKgorICogSGVyZSB3ZSBjb250cm9sIHRoZSA2IGJpZGlyZWN0aW9uYWwgR1BJTyBwaW5zIHByb3ZpZGVkIGJ5IHRoZSBody4KKyAqIFdlIGNhbiBzZXQgYSBHUElPIHBpbiB0byBiZSBhbiBpbnB1dCBvciBhbiBvdXRwdXQgcGluIG9uIEdQSU8gY29udHJvbAorICogcmVnaXN0ZXIgYW5kIHRoZW4gcmVhZCBvciBzZXQgaXRzIHN0YXR1cyBmcm9tIEdQSU8gZGF0YSBpbnB1dC9vdXRwdXQKKyAqIHJlZ2lzdGVycy4KKyAqCisgKiBXZSBhbHNvIGNvbnRyb2wgdGhlIHR3byBMRUQgcGlucyBwcm92aWRlZCBieSB0aGUgaHcsIExFRF8wIGlzIG91cgorICogInBvd2VyIiBMRUQgYW5kIExFRF8xIGlzIG91ciAibmV0d29yayBhY3Rpdml0eSIgTEVEIGJ1dCBtYW55IHNjZW5hcmlvcworICogYXJlIGF2YWlsYWJsZSBmcm9tIGh3LiBWZW5kb3JzIG1pZ2h0IGFsc28gcHJvdmlkZSBMRURzIGNvbm5lY3RlZCB0byB0aGUKKyAqIEdQSU8gcGlucywgd2UgaGFuZGxlIHRoZW0gdGhyb3VnaCB0aGUgTEVEIHN1YnN5c3RlbSBvbiBsZWQuYwogICovCi12b2lkIGF0aDVrX2h3X3NldF9sZWRzdGF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgc3RhdGUpCisKKworLyoqCisgKiBhdGg1a19od19zZXRfbGVkc3RhdGUoKSAtIFNldCBsZWQgc3RhdGUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBzdGF0ZTogT25lIG9mIEFSNUtfTEVEXyoKKyAqCisgKiBVc2VkIHRvIHNldCB0aGUgTEVEIGJsaW5raW5nIHN0YXRlLiBUaGlzIG9ubHkKKyAqIHdvcmtzIGZvciB0aGUgTEVEIGNvbm5lY3RlZCB0byB0aGUgTEVEXzAsIExFRF8xIHBpbnMsCisgKiBub3QgdGhlIEdQSU8gYmFzZWQuCisgKi8KK3ZvaWQKK2F0aDVrX2h3X3NldF9sZWRzdGF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgc3RhdGUpCiB7CiAJdTMyIGxlZDsKIAkvKjUyMTAgaGFzIGRpZmZlcmVudCBsZWQgbW9kZSBoYW5kbGluZyovCkBAIC03NCwxMCArOTcsMTMgQEAKIAkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUENJQ0ZHLCBsZWRfNTIxMCk7CiB9CiAKLS8qCi0gKiBTZXQgR1BJTyBpbnB1dHMKKy8qKgorICogYXRoNWtfaHdfc2V0X2dwaW9faW5wdXQoKSAtIFNldCBHUElPIGlucHV0cworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGdwaW86IEdQSU8gcGluIHRvIHNldCBhcyBpbnB1dAogICovCi1pbnQgYXRoNWtfaHdfc2V0X2dwaW9faW5wdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pCitpbnQKK2F0aDVrX2h3X3NldF9ncGlvX2lucHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQogewogCWlmIChncGlvID49IEFSNUtfTlVNX0dQSU8pCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODksMTAgKzExNSwxMyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IEdQSU8gb3V0cHV0cworLyoqCisgKiBhdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoKSAtIFNldCBHUElPIG91dHB1dHMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBncGlvOiBUaGUgR1BJTyBwaW4gdG8gc2V0IGFzIG91dHB1dAogICovCi1pbnQgYXRoNWtfaHdfc2V0X2dwaW9fb3V0cHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQoraW50CithdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pCiB7CiAJaWYgKGdwaW8gPj0gQVI1S19OVU1fR1BJTykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDQsMTAgKzEzMywxMyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogR2V0IEdQSU8gc3RhdGUKKy8qKgorICogYXRoNWtfaHdfZ2V0X2dwaW8oKSAtIEdldCBHUElPIHN0YXRlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZ3BpbzogVGhlIEdQSU8gcGluIHRvIHJlYWQKICAqLwotdTMyIGF0aDVrX2h3X2dldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQordTMyCithdGg1a19od19nZXRfZ3BpbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbykKIHsKIAlpZiAoZ3BpbyA+PSBBUjVLX05VTV9HUElPKQogCQlyZXR1cm4gMHhmZmZmZmZmZjsKQEAgLTExNywxMCArMTQ5LDE0IEBACiAJCTB4MTsKIH0KIAotLyoKLSAqIFNldCBHUElPIHN0YXRlCisvKioKKyAqIGF0aDVrX2h3X3NldF9ncGlvKCkgLSBTZXQgR1BJTyBzdGF0ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGdwaW86IFRoZSBHUElPIHBpbiB0byBzZXQKKyAqIEB2YWw6IFZhbHVlIHRvIHNldCAoYm9vbGVhbikKICAqLwotaW50IGF0aDVrX2h3X3NldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvLCB1MzIgdmFsKQoraW50CithdGg1a19od19zZXRfZ3BpbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbywgdTMyIHZhbCkKIHsKIAl1MzIgZGF0YTsKIApAQCAtMTM4LDEwICsxNzQsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEluaXRpYWxpemUgdGhlIEdQSU8gaW50ZXJydXB0IChSRktpbGwgc3dpdGNoKQorLyoqCisgKiBhdGg1a19od19zZXRfZ3Bpb19pbnRyKCkgLSBJbml0aWFsaXplIHRoZSBHUElPIGludGVycnVwdCAoUkZLaWxsIHN3aXRjaCkKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBncGlvOiBUaGUgR1BJTyBwaW4gdG8gdXNlCisgKiBAaW50ZXJydXB0X2xldmVsOiBUcnVlIHRvIGdlbmVyYXRlIGludGVycnVwdCBvbiBhY3RpdmUgcGluIChoaWdoKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdXAgdGhlIEdQSU8gaW50ZXJydXB0IGZvciB0aGUgaHcgUkZLaWxsIHN3aXRjaC4KKyAqIFRoYXQgc3dpdGNoIGlzIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluIGFuZCBpdCdzIG51bWJlciBpcyBzdG9yZWQgb24gRUVQUk9NLgorICogSXQgY2FuIGVpdGhlciBvcGVuIG9yIGNsb3NlIHRoZSBjaXJjdWl0IHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIGRpc2FibGUKKyAqIFJGL1dpcmVsZXNzIHRvIHNhdmUgcG93ZXIgKHdlIGFsc28gZ2V0IHRoYXQgZnJvbSBFRVBST00pLgogICovCi12b2lkIGF0aDVrX2h3X3NldF9ncGlvX2ludHIoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IGdwaW8sCit2b2lkCithdGg1a19od19zZXRfZ3Bpb19pbnRyKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBncGlvLAogCQl1MzIgaW50ZXJydXB0X2xldmVsKQogewogCXUzMiBkYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2luaXR2YWxzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYwppbmRleCAxZmZlY2MwLi5hMWVhNzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYwpAQCAtMjMsMjQgKzIzLDI3IEBACiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotLyoKLSAqIE1vZGUtaW5kZXBlbmRlbnQgaW5pdGlhbCByZWdpc3RlciB3cml0ZXMKKy8qKgorICogc3RydWN0IGF0aDVrX2luaSAtIE1vZGUtaW5kZXBlbmRlbnQgaW5pdGlhbCByZWdpc3RlciB3cml0ZXMKKyAqIEBpbmlfcmVnaXN0ZXI6IFJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBpbmlfdmFsdWU6IERlZmF1bHQgdmFsdWUKKyAqIEBpbmlfbW9kZTogMCB0byB3cml0ZSAxIHRvIHJlYWQgKGFuZCBjbGVhcikKICAqLwotCiBzdHJ1Y3QgYXRoNWtfaW5pIHsKIAl1MTYJaW5pX3JlZ2lzdGVyOwogCXUzMglpbmlfdmFsdWU7CiAKIAllbnVtIHsKIAkJQVI1S19JTklfV1JJVEUgPSAwLAkvKiBEZWZhdWx0ICovCi0JCUFSNUtfSU5JX1JFQUQgPSAxLAkvKiBDbGVhcmVkIG9uIHJlYWQgKi8KKwkJQVI1S19JTklfUkVBRCA9IDEsCiAJfSBpbmlfbW9kZTsKIH07CiAKLS8qCi0gKiBNb2RlIHNwZWNpZmljIGluaXRpYWwgcmVnaXN0ZXIgdmFsdWVzCisvKioKKyAqIHN0cnVjdCBhdGg1a19pbmlfbW9kZSAtIE1vZGUgc3BlY2lmaWMgaW5pdGlhbCByZWdpc3RlciB2YWx1ZXMKKyAqIEBtb2RlX3JlZ2lzdGVyOiBSZWdpc3RlciBhZGRyZXNzCisgKiBAbW9kZV92YWx1ZTogU2V0IG9mIHZhbHVlcyBmb3IgZWFjaCBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCiAgKi8KLQogc3RydWN0IGF0aDVrX2luaV9tb2RlIHsKIAl1MTYJbW9kZV9yZWdpc3RlcjsKIAl1MzIJbW9kZV92YWx1ZVszXTsKQEAgLTM4NiwxMSArMzg5LDEwIEBACiAKIC8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjExCiAgKiA1MjExIHN1cHBvcnRzIE9GRE0tb25seSBnIChkcmFmdCBnKSBidXQgd2UKLSAqIG5lZWQgdG8gdGVzdCBpdCAhCi0gKi8KKyAqIG5lZWQgdG8gdGVzdCBpdCAhICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIGFyNTIxMV9pbmlfbW9kZVtdID0gewogCXsgQVI1S19UWENGRywKLQkvKglBL1hSICAgICAgICAgIEIgICAgICAgICAgIEcgICAgICAgKi8KKwkvKglBICAgICAgICAgIEIgICAgICAgICAgIEcgICAgICAgKi8KIAkgICB7IDB4MDAwMDAwMTUsIDB4MDAwMDAwMWQsIDB4MDAwMDAwMTUgfSB9LAogCXsgQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKDApLAogCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiB9IH0sCkBAIC00NjAsNyArNDYyLDcgQEAKIAkgICB7IDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAgfSB9LAogfTsKIAotLyogSW5pdGlhbCByZWdpc3RlciBzZXR0aW5ncyBmb3IgQVI1MjEyICovCisvKiBJbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzIGZvciBBUjUyMTIgYW5kIG5ld2VyIGNoaXBzICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaSBhcjUyMTJfaW5pX2NvbW1vbl9zdGFydFtdID0gewogCXsgQVI1S19SWERQLAkJMHgwMDAwMDAwMCB9LAogCXsgQVI1S19SWENGRywJCTB4MDAwMDAwMDUgfSwKQEAgLTcyNCw3ICs3MjYsOCBAQAogCSAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDEwOCB9IH0sCiB9OwogCi0vKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIEFSNTIxMiArIFJGNTExMSAoV3JpdHRlbiBhZnRlciBhcjUyMTJfaW5pKSAqLworLyogSW5pdGlhbCBtb2RlLXNwZWNpZmljIHNldHRpbmdzIGZvciBBUjUyMTIgKyBSRjUxMTEKKyAqIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIHJmNTExMV9pbmlfbW9kZV9lbmRbXSA9IHsKIAl7IEFSNUtfVFhDRkcsCiAJLyoJQS9YUiAgICAgICAgICBCICAgICAgICAgICBHICAgICAgICovCkBAIC03NTcsNiArNzYwLDcgQEAKIAkgICB7IDB4MTg4MzgwMGEsIDB4MTg3MzgwMGEsIDB4MTg4MzgwMGEgfSB9LAogfTsKIAorLyogQ29tbW9uIGZvciBhbGwgbW9kZXMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pIHJmNTExMV9pbmlfY29tbW9uX2VuZFtdID0gewogCXsgQVI1S19EQ1VfRlAsCQkweDAwMDAwMDAwIH0sCiAJeyBBUjVLX1BIWV9BR0MsCQkweDAwMDAwMDAwIH0sCkBAIC03NzQsNyArNzc4LDkgQEAKIAl7IDB4YTIzYywJCTB4MTNjODg5YWYgfSwKIH07CiAKLS8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjEyICsgUkY1MTEyIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjEyICsgUkY1MTEyCisgKiAoV3JpdHRlbiBhZnRlciBhcjUyMTJfaW5pKSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfbW9kZSByZjUxMTJfaW5pX21vZGVfZW5kW10gPSB7CiAJeyBBUjVLX1RYQ0ZHLAogCS8qCUEvWFIgICAgICAgICAgQiAgICAgICAgICAgRyAgICAgICAqLwpAQCAtODI1LDcgKzgzMSw5IEBACiAJeyAweGEyM2MsCQkweDEzYzg4OWFmIH0sCiB9OwogCi0vKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIFJGNTQxMy81NDE0IChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgUkY1NDEzLzU0MTQKKyAqIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIHJmNTQxM19pbmlfbW9kZV9lbmRbXSA9IHsKIAl7IEFSNUtfVFhDRkcsCiAJLyoJQS9YUiAgICAgICAgICBCICAgICAgICAgICBHICAgICAgICovCkBAIC05NjMsNyArOTcxLDggQEAKIAl7IDB4YTM4NCwgMHhmMzMwN2ZmMCB9LAogfTsKIAotLyogSW5pdGlhbCBtb2RlLXNwZWNpZmljIHNldHRpbmdzIGZvciBSRjI0MTMvMjQxNCAoV3JpdHRlbiBhZnRlciBhcjUyMTJfaW5pKSAqLworLyogSW5pdGlhbCBtb2RlLXNwZWNpZmljIHNldHRpbmdzIGZvciBSRjI0MTMvMjQxNAorICogKFdyaXR0ZW4gYWZ0ZXIgYXI1MjEyX2luaSkgKi8KIC8qIFhYWDogYSBtb2RlID8gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgcmYyNDEzX2luaV9tb2RlX2VuZFtdID0gewogCXsgQVI1S19UWENGRywKQEAgLTEwODUsNyArMTA5NCw4IEBACiAJeyAweGEzODQsIDB4ZjMzMDdmZjAgfSwKIH07CiAKLS8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgUkYyNDI1IChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisvKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIFJGMjQyNQorICogKFdyaXR0ZW4gYWZ0ZXIgYXI1MjEyX2luaSkgKi8KIC8qIFhYWDogYSBtb2RlID8gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgcmYyNDI1X2luaV9tb2RlX2VuZFtdID0gewogCXsgQVI1S19UWENGRywKQEAgLTEzNTcsMTAgKzEzNjcsMTUgQEAKIH07CiAKIAotLyoKLSAqIFdyaXRlIGluaXRpYWwgcmVnaXN0ZXIgZHVtcAorLyoqCisgKiBhdGg1a19od19pbmlfcmVnaXN0ZXJzKCkgLSBXcml0ZSBpbml0aWFsIHJlZ2lzdGVyIGR1bXAgY29tbW9uIGZvciBhbGwgbW9kZXMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBzaXplOiBEdW1wIHNpemUKKyAqIEBpbmlfcmVnczogVGhlIGFycmF5IG9mICZzdHJ1Y3QgYXRoNWtfaW5pCisgKiBAc2tpcF9wY3U6IFNraXAgUENVIHJlZ2lzdGVycwogICovCi1zdGF0aWMgdm9pZCBhdGg1a19od19pbmlfcmVnaXN0ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBzaXplLAorc3RhdGljIHZvaWQKK2F0aDVrX2h3X2luaV9yZWdpc3RlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHNpemUsCiAJCWNvbnN0IHN0cnVjdCBhdGg1a19pbmkgKmluaV9yZWdzLCBib29sIHNraXBfcGN1KQogewogCXVuc2lnbmVkIGludCBpOwpAQCAtMTM4OCw3ICsxNDAzLDE1IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGg1a19od19pbmlfbW9kZV9yZWdpc3RlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwKKy8qKgorICogYXRoNWtfaHdfaW5pX21vZGVfcmVnaXN0ZXJzKCkgLSBXcml0ZSBpbml0aWFsIG1vZGUtc3BlY2lmaWMgcmVnaXN0ZXIgZHVtcAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHNpemU6IER1bXAgc2l6ZQorICogQGluaV9tb2RlOiBUaGUgYXJyYXkgb2YgJnN0cnVjdCBhdGg1a19pbmlfbW9kZQorICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKi8KK3N0YXRpYyB2b2lkCithdGg1a19od19pbmlfbW9kZV9yZWdpc3RlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJdW5zaWduZWQgaW50IHNpemUsIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfbW9kZSAqaW5pX21vZGUsCiAJCXU4IG1vZGUpCiB7CkBAIC0xNDAyLDcgKzE0MjUsMTcgQEAKIAogfQogCi1pbnQgYXRoNWtfaHdfd3JpdGVfaW5pdHZhbHMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggbW9kZSwgYm9vbCBza2lwX3BjdSkKKy8qKgorICogYXRoNWtfaHdfd3JpdGVfaW5pdHZhbHMoKSAtIFdyaXRlIGluaXRpYWwgY2hpcC1zcGVjaWZpYyByZWdpc3RlciBkdW1wCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqIEBza2lwX3BjdTogU2tpcCBQQ1UgcmVnaXN0ZXJzCisgKgorICogV3JpdGUgaW5pdGlhbCBjaGlwLXNwZWNpZmljIHJlZ2lzdGVyIGR1bXAsIHRvIGdldCB0aGUgY2hpcHNldCBvbiBhCisgKiBjbGVhbiBhbmQgcmVhZHktdG8td29yayBzdGF0ZSBhZnRlciB3YXJtIHJlc2V0LgorICovCitpbnQKK2F0aDVrX2h3X3dyaXRlX2luaXR2YWxzKHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IG1vZGUsIGJvb2wgc2tpcF9wY3UpCiB7CiAJLyoKIAkgKiBXcml0ZSBpbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMKaW5kZXggYzFkZmYyYy4uODQ5ZmEwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY2kuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICIuLi9hdGguaCIKICNpbmNsdWRlICJhdGg1ay5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC05Nyw3ICs5OCw3IEBACiAJCQkJCTB4ZmZmZik7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQl1ZGVsYXkoMTUpOworCQl1c2xlZXBfcmFuZ2UoMTUsIDIwKTsKIAl9CiAKIAlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGN1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGN1LmMKaW5kZXggYTdlYWZhMy4uY2ViZmQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY3UuYwpAQCAtMzAsMTEgKzMwLDQ3IEBACiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotLyoKKy8qKgorICogRE9DOiBQcm90b2NvbCBDb250cm9sIFVuaXQgKFBDVSkgZnVuY3Rpb25zCisgKgorICogUHJvdG9jb2wgY29udHJvbCB1bml0IGlzIHJlc3BvbnNpYmxlIHRvIG1haW50YWluIHZhcmlvdXMgcHJvdG9jb2wKKyAqIHByb3BlcnRpZXMgYmVmb3JlIGEgZnJhbWUgaXMgc2VuZCBhbmQgYWZ0ZXIgYSBmcmFtZSBpcyByZWNlaXZlZCB0by9mcm9tCisgKiBiYXNlYmFuZC4gVG8gYmUgbW9yZSBzcGVjaWZpYywgUENVIGhhbmRsZXM6CisgKgorICogLSBCdWZmZXJpbmcgb2YgUlggYW5kIFRYIGZyYW1lcyAoYWZ0ZXIgUUNVL0RDVXMpCisgKgorICogLSBFbmNyeXB0aW5nIGFuZCBkZWNyeXB0aW5nICh1c2luZyB0aGUgYnVpbHQtaW4gZW5naW5lKQorICoKKyAqIC0gR2VuZXJhdGluZyBBQ0tzLCBSVFMvQ1RTIGZyYW1lcworICoKKyAqIC0gTWFpbnRhaW5pbmcgVFNGCisgKgorICogLSBGQ1MKKyAqCisgKiAtIFVwZGF0aW5nIGJlYWNvbiBkYXRhICh3aXRoIFRTRiBldGMpCisgKgorICogLSBHZW5lcmF0aW5nIHZpcnR1YWwgQ0NBCisgKgorICogLSBSWC9NdWx0aWNhc3QgZmlsdGVyaW5nCisgKgorICogLSBCU1NJRCBmaWx0ZXJpbmcKKyAqCisgKiAtIFZhcmlvdXMgc3RhdGlzdGljcworICoKKyAqIC1EaWZmZXJlbnQgb3BlcmF0aW5nIG1vZGVzOiBBUCwgU1RBLCBJQlNTCisgKgorICogTm90ZTogTW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIHR3ZWFrZWQvYnlwYXNzZWQgc28geW91IGNhbiBkbworICogdGhlbSBvbiBzdyBhYm92ZSBmb3IgZGVidWdnaW5nIG9yIHJlc2VhcmNoLiBGb3IgbW9yZSBpbmZvcyBjaGVjayBvdXQgUENVCisgKiByZWdpc3RlcnMgb24gcmVnLmguCisgKi8KKworLyoqCisgKiBET0M6IEFDSyByYXRlcworICoKICAqIEFSNTIxMisgY2FuIHVzZSBoaWdoZXIgcmF0ZXMgZm9yIGFjayB0cmFuc21pc3Npb24KICAqIGJhc2VkIG9uIGN1cnJlbnQgdHggcmF0ZSBpbnN0ZWFkIG9mIHRoZSBiYXNlIHJhdGUuCiAgKiBJdCBkb2VzIHRoaXMgdG8gYmV0dGVyIHV0aWxpemUgY2hhbm5lbCB1c2FnZS4KLSAqIFRoaXMgaXMgYSBtYXBwaW5nIGJldHdlZW4gRyByYXRlcyAodGhhdCBjb3ZlciBib3RoCisgKiBUaGVyZSBpcyBhIG1hcHBpbmcgYmV0d2VlbiBHIHJhdGVzICh0aGF0IGNvdmVyIGJvdGgKICAqIENDSyBhbmQgT0ZETSkgYW5kIGFjayByYXRlcyB0aGF0IHdlIHVzZSB3aGVuIHNldHRpbmcKICAqIHJhdGUgLT4gZHVyYXRpb24gdGFibGUuIFRoaXMgbWFwcGluZyBpcyBody1iYXNlZCBzbwogICogZG9uJ3QgY2hhbmdlIGFueXRoaW5nLgpAQCAtNjMsMTcgKzk5LDE4IEBACiBcKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19nZXRfZnJhbWVfZHVyYXRpb24gLSBHZXQgdHggdGltZSBvZiBhIGZyYW1lCi0gKgorICogYXRoNWtfaHdfZ2V0X2ZyYW1lX2R1cmF0aW9uKCkgLSBHZXQgdHggdGltZSBvZiBhIGZyYW1lCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAbGVuOiBGcmFtZSdzIGxlbmd0aCBpbiBieXRlcwogICogQHJhdGU6IFRoZSBAc3RydWN0IGllZWU4MDIxMV9yYXRlCisgKiBAc2hvcnRwcmU6IEluZGljYXRlIHNob3J0IHByZWFtcGxlCiAgKgogICogQ2FsY3VsYXRlIHR4IGR1cmF0aW9uIG9mIGEgZnJhbWUgZ2l2ZW4gaXQncyByYXRlIGFuZCBsZW5ndGgKICAqIEl0IGV4dGVuZHMgaWVlZTgwMjExX2dlbmVyaWNfZnJhbWVfZHVyYXRpb24gZm9yIG5vbiBzdGFuZGFyZAogICogYndtb2Rlcy4KICAqLwotaW50IGF0aDVrX2h3X2dldF9mcmFtZV9kdXJhdGlvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLAoraW50CithdGg1a19od19nZXRfZnJhbWVfZHVyYXRpb24oc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJaW50IGxlbiwgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlLCBib29sIHNob3J0cHJlKQogewogCWludCBzaWZzLCBwcmVhbWJsZSwgcGxjcF9iaXRzLCBzeW1fdGltZTsKQEAgLTEyOSwxMSArMTY2LDExIEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2xvdHRpbWUgLSBHZXQgdGhlIGRlZmF1bHQgc2xvdCB0aW1lIGZvciBjdXJyZW50IG1vZGUKLSAqCisgKiBhdGg1a19od19nZXRfZGVmYXVsdF9zbG90dGltZSgpIC0gR2V0IHRoZSBkZWZhdWx0IHNsb3QgdGltZSBmb3IgY3VycmVudCBtb2RlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKi8KLXVuc2lnbmVkIGludCBhdGg1a19od19nZXRfZGVmYXVsdF9zbG90dGltZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordW5zaWduZWQgaW50CithdGg1a19od19nZXRfZGVmYXVsdF9zbG90dGltZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGFoLT5haF9jdXJyZW50X2NoYW5uZWw7CiAJdW5zaWduZWQgaW50IHNsb3RfdGltZTsKQEAgLTE2MCwxMSArMTk3LDExIEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2lmcyAtIEdldCB0aGUgZGVmYXVsdCBTSUZTIGZvciBjdXJyZW50IG1vZGUKLSAqCisgKiBhdGg1a19od19nZXRfZGVmYXVsdF9zaWZzKCkgLSBHZXQgdGhlIGRlZmF1bHQgU0lGUyBmb3IgY3VycmVudCBtb2RlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKi8KLXVuc2lnbmVkIGludCBhdGg1a19od19nZXRfZGVmYXVsdF9zaWZzKHN0cnVjdCBhdGg1a19odyAqYWgpCit1bnNpZ25lZCBpbnQKK2F0aDVrX2h3X2dldF9kZWZhdWx0X3NpZnMoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBhaC0+YWhfY3VycmVudF9jaGFubmVsOwogCXVuc2lnbmVkIGludCBzaWZzOwpAQCAtMTkxLDE3ICsyMjgsMTcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzIC0gVXBkYXRlIE1JQiBjb3VudGVycyAobWFjIGxheWVyIHN0YXRpc3RpY3MpCi0gKgorICogYXRoNWtfaHdfdXBkYXRlX21pYl9jb3VudGVycygpIC0gVXBkYXRlIE1JQiBjb3VudGVycyAobWFjIGxheWVyIHN0YXRpc3RpY3MpCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogUmVhZHMgTUlCIGNvdW50ZXJzIGZyb20gUENVIGFuZCB1cGRhdGVzIHN3IHN0YXRpc3RpY3MuIElzIGNhbGxlZCBhZnRlciBhCiAgKiBNSUIgaW50ZXJydXB0LCBiZWNhdXNlIG9uZSBvZiB0aGVzZSBjb3VudGVycyBtaWdodCBoYXZlIHJlYWNoZWQgdGhlaXIgbWF4aW11bQogICogYW5kIHRyaWdnZXJlZCB0aGUgTUlCIGludGVycnVwdCwgdG8gbGV0IHVzIHJlYWQgYW5kIGNsZWFyIHRoZSBjb3VudGVyLgogICoKLSAqIElzIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCEKKyAqIE5PVEU6IElzIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCEKICAqLwotdm9pZCBhdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgpCit2b2lkCithdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJc3RydWN0IGF0aDVrX3N0YXRpc3RpY3MgKnN0YXRzID0gJmFoLT5zdGF0czsKIApAQCAtMjE5LDEwICsyNTYsOCBAQAogXCoqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uIC0gZmlsbCByYXRlIGNvZGUgdG8gZHVyYXRpb24gdGFibGUKLSAqCi0gKiBAYWg6IHRoZSAmc3RydWN0IGF0aDVrX2h3Ci0gKiBAbW9kZTogb25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqIGF0aDVrX2h3X3dyaXRlX3JhdGVfZHVyYXRpb24oKSAtIEZpbGwgcmF0ZSBjb2RlIHRvIGR1cmF0aW9uIHRhYmxlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogV3JpdGUgdGhlIHJhdGUgY29kZSB0byBkdXJhdGlvbiB0YWJsZSB1cG9uIGh3IHJlc2V0LiBUaGlzIGlzIGEgaGVscGVyIGZvcgogICogYXRoNWtfaHdfcGN1X2luaXQoKS4gSXQgc2VlbXMgYWxsIHRoaXMgaXMgZG9pbmcgaXMgc2V0dGluZyBhbiBBQ0sgdGltZW91dCBvbgpAQCAtMjM2LDcgKzI3MSw4IEBACiAgKiB0aGF0IGluY2x1ZGUgYWxsIE9GRE0gYW5kIENDSyByYXRlcy4KICAqCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uKHN0cnVjdCBhdGg1a19odyAqYWgpCitzdGF0aWMgaW5saW5lIHZvaWQKK2F0aDVrX2h3X3dyaXRlX3JhdGVfZHVyYXRpb24oc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGU7CiAJdW5zaWduZWQgaW50IGk7CkBAIC0yODAsMTIgKzMxNiwxMiBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF9hY2tfdGltZW91dCAtIFNldCBBQ0sgdGltZW91dCBvbiBQQ1UKLSAqCisgKiBhdGg1a19od19zZXRfYWNrX3RpbWVvdXQoKSAtIFNldCBBQ0sgdGltZW91dCBvbiBQQ1UKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEB0aW1lb3V0OiBUaW1lb3V0IGluIHVzZWMKICAqLwotc3RhdGljIGludCBhdGg1a19od19zZXRfYWNrX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50CithdGg1a19od19zZXRfYWNrX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHRpbWVvdXQpCiB7CiAJaWYgKGF0aDVrX2h3X2Nsb2NrdG9oKGFoLCBBUjVLX1JFR19NUygweGZmZmZmZmZmLCBBUjVLX1RJTUVfT1VUX0FDSykpCiAJCQk8PSB0aW1lb3V0KQpAQCAtMjk4LDEyICszMzQsMTIgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19zZXRfY3RzX3RpbWVvdXQgLSBTZXQgQ1RTIHRpbWVvdXQgb24gUENVCi0gKgorICogYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0KCkgLSBTZXQgQ1RTIHRpbWVvdXQgb24gUENVCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAdGltZW91dDogVGltZW91dCBpbiB1c2VjCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludAorYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQogewogCWlmIChhdGg1a19od19jbG9ja3RvaChhaCwgQVI1S19SRUdfTVMoMHhmZmZmZmZmZiwgQVI1S19USU1FX09VVF9DVFMpKQogCQkJPD0gdGltZW91dCkKQEAgLTMyMSwxNCArMzU3LDE0IEBACiBcKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19zZXRfbGxhZGRyIC0gU2V0IHN0YXRpb24gaWQKLSAqCisgKiBhdGg1a19od19zZXRfbGxhZGRyKCkgLSBTZXQgc3RhdGlvbiBpZAogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwotICogQG1hYzogVGhlIGNhcmQncyBtYWMgYWRkcmVzcworICogQG1hYzogVGhlIGNhcmQncyBtYWMgYWRkcmVzcyAoYXJyYXkgb2Ygb2N0ZXRzKQogICoKICAqIFNldCBzdGF0aW9uIGlkIG9uIGh3IHVzaW5nIHRoZSBwcm92aWRlZCBtYWMgYWRkcmVzcwogICovCi1pbnQgYXRoNWtfaHdfc2V0X2xsYWRkcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBjb25zdCB1OCAqbWFjKQoraW50CithdGg1a19od19zZXRfbGxhZGRyKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICptYWMpCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJdTMyIGxvd19pZCwgaGlnaF9pZDsKQEAgLTM0OSwxNCArMzg1LDE0IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2Jzc2lkIC0gU2V0IGN1cnJlbnQgQlNTSUQgb24gaHcKLSAqCisgKiBhdGg1a19od19zZXRfYnNzaWQoKSAtIFNldCBjdXJyZW50IEJTU0lEIG9uIGh3CiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogU2V0cyB0aGUgY3VycmVudCBCU1NJRCBhbmQgQlNTSUQgbWFzayB3ZSBoYXZlIGZyb20gdGhlCiAgKiBjb21tb24gc3RydWN0IGludG8gdGhlIGhhcmR3YXJlCiAgKi8KLXZvaWQgYXRoNWtfaHdfc2V0X2Jzc2lkKHN0cnVjdCBhdGg1a19odyAqYWgpCit2b2lkCithdGg1a19od19zZXRfYnNzaWQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAl1MTYgdGltX29mZnNldCA9IDA7CkBAIC0zODksNyArNDI1LDIzIEBACiAJYXRoNWtfaHdfZW5hYmxlX3BzcG9sbChhaCwgTlVMTCwgMCk7CiB9CiAKLXZvaWQgYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2soc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKm1hc2spCisvKioKKyAqIGF0aDVrX2h3X3NldF9ic3NpZF9tYXNrKCkgLSBGaWx0ZXIgb3V0IGJzc2lkcyB3ZSBsaXN0ZW4KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBtYXNrOiBUaGUgQlNTSUQgbWFzayB0byBzZXQgKGFycmF5IG9mIG9jdGV0cykKKyAqCisgKiBCU1NJRCBtYXNraW5nIGlzIGEgbWV0aG9kIHVzZWQgYnkgQVI1MjEyIGFuZCBuZXdlciBoYXJkd2FyZSB0byBpbmZvcm0gUENVCisgKiB3aGljaCBiaXRzIG9mIHRoZSBpbnRlcmZhY2UncyBNQUMgYWRkcmVzcyBzaG91bGQgYmUgbG9va2VkIGF0IHdoZW4gdHJ5aW5nCisgKiB0byBkZWNpZGUgd2hpY2ggcGFja2V0cyB0byBBQ0suIEluIHN0YXRpb24gbW9kZSBhbmQgQVAgbW9kZSB3aXRoIGEgc2luZ2xlCisgKiBCU1MgZXZlcnkgYml0IG1hdHRlcnMgc2luY2Ugd2UgbG9jayB0byBvbmx5IG9uZSBCU1MuIEluIEFQIG1vZGUgd2l0aAorICogbXVsdGlwbGUgQlNTZXMgKHZpcnR1YWwgaW50ZXJmYWNlcykgbm90IGV2ZXJ5IGJpdCBtYXR0ZXJzIGJlY2F1c2UgaHcgbXVzdAorICogYWNjZXB0IGZyYW1lcyBmb3IgYWxsIEJTU2VzIGFuZCBzbyB3ZSB0d2VhayBzb21lIGJpdHMgb2Ygb3VyIG1hYyBhZGRyZXNzCisgKiBpbiBvcmRlciB0byBoYXZlIG11bHRpcGxlIEJTU2VzLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGNoZWNrIG91dCAuLi9ody5jIG9mIHRoZSBjb21tb24gYXRoIG1vZHVsZS4KKyAqLwordm9pZAorYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2soc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKm1hc2spCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAKQEAgLTQwMCwxOCArNDUyLDIxIEBACiAJCWF0aF9od19zZXRic3NpZG1hc2soY29tbW9uKTsKIH0KIAotLyoKLSAqIFNldCBtdWx0aWNhc3QgZmlsdGVyCisvKioKKyAqIGF0aDVrX2h3X3NldF9tY2FzdF9maWx0ZXIoKSAtIFNldCBtdWx0aWNhc3QgZmlsdGVyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZmlsdGVyMDogTG93ZXIgMzJiaXRzIG9mIG11dGljYXN0IGZpbHRlcgorICogQGZpbHRlcjE6IEhpZ2hlciAxNmJpdHMgb2YgbXVsdGljYXN0IGZpbHRlcgogICovCi12b2lkIGF0aDVrX2h3X3NldF9tY2FzdF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGZpbHRlcjAsIHUzMiBmaWx0ZXIxKQordm9pZAorYXRoNWtfaHdfc2V0X21jYXN0X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZmlsdGVyMCwgdTMyIGZpbHRlcjEpCiB7CiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBmaWx0ZXIwLCBBUjVLX01DQVNUX0ZJTFRFUjApOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZmlsdGVyMSwgQVI1S19NQ0FTVF9GSUxURVIxKTsKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfcnhfZmlsdGVyIC0gR2V0IGN1cnJlbnQgcnggZmlsdGVyCi0gKgorICogYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlcigpIC0gR2V0IGN1cnJlbnQgcnggZmlsdGVyCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogUmV0dXJucyB0aGUgUlggZmlsdGVyIGJ5IHJlYWRpbmcgcnggZmlsdGVyIGFuZApAQCAtNDIwLDcgKzQ3NSw4IEBACiAgKiBhbmQgcGFzcyB0byB0aGUgZHJpdmVyLiBGb3IgYSBsaXN0IG9mIGZyYW1lIHR5cGVzCiAgKiBjaGVjayBvdXQgcmVnLmguCiAgKi8KLXUzMiBhdGg1a19od19nZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgpCit1MzIKK2F0aDVrX2h3X2dldF9yeF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAl1MzIgZGF0YSwgZmlsdGVyID0gMDsKIApAQCAtNDQwLDggKzQ5Niw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X3J4X2ZpbHRlciAtIFNldCByeCBmaWx0ZXIKLSAqCisgKiBhdGg1a19od19zZXRfcnhfZmlsdGVyKCkgLSBTZXQgcnggZmlsdGVyCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAZmlsdGVyOiBSWCBmaWx0ZXIgbWFzayAoc2VlIHJlZy5oKQogICoKQEAgLTQ0OSw3ICs1MDQsOCBAQAogICogcmVnaXN0ZXIgb24gNTIxMiBhbmQgbmV3ZXIgY2hpcHMgc28gdGhhdCB3ZSBoYXZlIHByb3BlciBQSFkKICAqIGVycm9yIHJlcG9ydGluZy4KICAqLwotdm9pZCBhdGg1a19od19zZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIpCit2b2lkCithdGg1a19od19zZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIpCiB7CiAJdTMyIGRhdGEgPSAwOwogCkBAIC00OTMsMTMgKzU0OSwxMyBAQAogI2RlZmluZSBBVEg1S19NQVhfVFNGX1JFQUQgMTAKIAogLyoqCi0gKiBhdGg1a19od19nZXRfdHNmNjQgLSBHZXQgdGhlIGZ1bGwgNjRiaXQgVFNGCi0gKgorICogYXRoNWtfaHdfZ2V0X3RzZjY0KCkgLSBHZXQgdGhlIGZ1bGwgNjRiaXQgVFNGCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogUmV0dXJucyB0aGUgY3VycmVudCBUU0YKICAqLwotdTY0IGF0aDVrX2h3X2dldF90c2Y2NChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordTY0CithdGg1a19od19nZXRfdHNmNjQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAl1MzIgdHNmX2xvd2VyLCB0c2ZfdXBwZXIxLCB0c2ZfdXBwZXIyOwogCWludCBpOwpAQCAtNTM2LDI4ICs1OTIsMzAgQEAKIAlyZXR1cm4gKCh1NjQpdHNmX3VwcGVyMSA8PCAzMikgfCB0c2ZfbG93ZXI7CiB9CiAKKyN1bmRlZiBBVEg1S19NQVhfVFNGX1JFQUQKKwogLyoqCi0gKiBhdGg1a19od19zZXRfdHNmNjQgLSBTZXQgYSBuZXcgNjRiaXQgVFNGCi0gKgorICogYXRoNWtfaHdfc2V0X3RzZjY0KCkgLSBTZXQgYSBuZXcgNjRiaXQgVFNGCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAdHNmNjQ6IFRoZSBuZXcgNjRiaXQgVFNGCiAgKgogICogU2V0cyB0aGUgbmV3IFRTRgogICovCi12b2lkIGF0aDVrX2h3X3NldF90c2Y2NChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1NjQgdHNmNjQpCit2b2lkCithdGg1a19od19zZXRfdHNmNjQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTY0IHRzZjY0KQogewogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdHNmNjQgJiAweGZmZmZmZmZmLCBBUjVLX1RTRl9MMzIpOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKHRzZjY0ID4+IDMyKSAmIDB4ZmZmZmZmZmYsIEFSNUtfVFNGX1UzMik7CiB9CiAKIC8qKgotICogYXRoNWtfaHdfcmVzZXRfdHNmIC0gRm9yY2UgYSBUU0YgcmVzZXQKLSAqCisgKiBhdGg1a19od19yZXNldF90c2YoKSAtIEZvcmNlIGEgVFNGIHJlc2V0CiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogRm9yY2VzIGEgVFNGIHJlc2V0IG9uIFBDVQogICovCi12b2lkIGF0aDVrX2h3X3Jlc2V0X3RzZihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZAorYXRoNWtfaHdfcmVzZXRfdHNmKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJdTMyIHZhbDsKIApAQCAtNTczLDEwICs2MzEsMTcgQEAKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIHZhbCwgQVI1S19CRUFDT04pOwogfQogCi0vKgotICogSW5pdGlhbGl6ZSBiZWFjb24gdGltZXJzCisvKioKKyAqIGF0aDVrX2h3X2luaXRfYmVhY29uX3RpbWVycygpIC0gSW5pdGlhbGl6ZSBiZWFjb24gdGltZXJzCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbmV4dF9iZWFjb246IE5leHQgVEJUVAorICogQGludGVydmFsOiBDdXJyZW50IGJlYWNvbiBpbnRlcnZhbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIGJlYWNvbiB0aW1lcnMgYmFzZWQgb24gY3VycmVudAorICogb3BlcmF0aW9uIG1vZGUgYW5kIHNldHRpbmdzLgogICovCi12b2lkIGF0aDVrX2h3X2luaXRfYmVhY29uKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBuZXh0X2JlYWNvbiwgdTMyIGludGVydmFsKQordm9pZAorYXRoNWtfaHdfaW5pdF9iZWFjb25fdGltZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBuZXh0X2JlYWNvbiwgdTMyIGludGVydmFsKQogewogCXUzMiB0aW1lcjEsIHRpbWVyMiwgdGltZXIzOwogCkBAIC02NTUsOCArNzIwLDcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19jaGVja190aW1lcl93aW4gLSBDaGVjayBpZiB0aW1lciBCIGlzIHRpbWVyIEEgKyB3aW5kb3cKLSAqCisgKiBhdGg1a19jaGVja190aW1lcl93aW4oKSAtIENoZWNrIGlmIHRpbWVyIEIgaXMgdGltZXIgQSArIHdpbmRvdwogICogQGE6IHRpbWVyIGEgKGJlZm9yZSBiKQogICogQGI6IHRpbWVyIGIgKGFmdGVyIGEpCiAgKiBAd2luZG93OiBkaWZmZXJlbmNlIGJldHdlZW4gYSBhbmQgYgpAQCAtNjg2LDEyICs3NTAsMTEgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19jaGVja19iZWFjb25fdGltZXJzIC0gQ2hlY2sgaWYgdGhlIGJlYWNvbiB0aW1lcnMgYXJlIGNvcnJlY3QKLSAqCisgKiBhdGg1a19od19jaGVja19iZWFjb25fdGltZXJzKCkgLSBDaGVjayBpZiB0aGUgYmVhY29uIHRpbWVycyBhcmUgY29ycmVjdAogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGludHZhbDogYmVhY29uIGludGVydmFsCiAgKgotICogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIElCU1MgbW9kZToKKyAqIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBJQlNTIG1vZGUKICAqCiAgKiBUaGUgbmVlZCBmb3IgdGhpcyBmdW5jdGlvbiBhcmlzZXMgZnJvbSB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgNCBzZXBhcmF0ZQogICogSFcgdGltZXIgcmVnaXN0ZXJzIChUSU1FUjAgLSBUSU1FUjMpLCB3aGljaCBhcmUgY2xvc2VseSByZWxhdGVkIHRvIHRoZQpAQCAtNzQ2LDE0ICs4MDksMTQgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19zZXRfY292ZXJhZ2VfY2xhc3MgLSBTZXQgSUVFRSA4MDIuMTEgY292ZXJhZ2UgY2xhc3MKLSAqCisgKiBhdGg1a19od19zZXRfY292ZXJhZ2VfY2xhc3MoKSAtIFNldCBJRUVFIDgwMi4xMSBjb3ZlcmFnZSBjbGFzcwogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGNvdmVyYWdlX2NsYXNzOiBJRUVFIDgwMi4xMSBjb3ZlcmFnZSBjbGFzcyBudW1iZXIKICAqCiAgKiBTZXRzIElGUyBpbnRlcnZhbHMgYW5kIEFDSy9DVFMgdGltZW91dHMgZm9yIGdpdmVuIGNvdmVyYWdlIGNsYXNzLgogICovCi12b2lkIGF0aDVrX2h3X3NldF9jb3ZlcmFnZV9jbGFzcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBjb3ZlcmFnZV9jbGFzcykKK3ZvaWQKK2F0aDVrX2h3X3NldF9jb3ZlcmFnZV9jbGFzcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBjb3ZlcmFnZV9jbGFzcykKIHsKIAkvKiBBcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExLTIwMDcgMTcuMy44LjYgKi8KIAlpbnQgc2xvdF90aW1lID0gYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2xvdHRpbWUoYWgpICsgMyAqIGNvdmVyYWdlX2NsYXNzOwpAQCAtNzcyLDggKzgzNSw3IEBACiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKLSAqIGF0aDVrX2h3X3N0YXJ0X3J4X3BjdSAtIFN0YXJ0IFJYIGVuZ2luZQotICoKKyAqIGF0aDVrX2h3X3N0YXJ0X3J4X3BjdSgpIC0gU3RhcnQgUlggZW5naW5lCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogU3RhcnRzIFJYIGVuZ2luZSBvbiBQQ1Ugc28gdGhhdCBodyBjYW4gcHJvY2VzcyBSWGVkIGZyYW1lcwpAQCAtNzgxLDMyICs4NDMsMzMgQEAKICAqCiAgKiBOT1RFOiBSWCBETUEgc2hvdWxkIGJlIGFscmVhZHkgZW5hYmxlZCB1c2luZyBhdGg1a19od19zdGFydF9yeF9kbWEKICAqLwotdm9pZCBhdGg1a19od19zdGFydF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCkKK3ZvaWQKK2F0aDVrX2h3X3N0YXJ0X3J4X3BjdShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19ESUFHX1NXLCBBUjVLX0RJQUdfU1dfRElTX1JYKTsKIH0KIAogLyoqCi0gKiBhdDVrX2h3X3N0b3BfcnhfcGN1IC0gU3RvcCBSWCBlbmdpbmUKLSAqCisgKiBhdDVrX2h3X3N0b3BfcnhfcGN1KCkgLSBTdG9wIFJYIGVuZ2luZQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFN0b3BzIFJYIGVuZ2luZSBvbiBQQ1UKICAqLwotdm9pZCBhdGg1a19od19zdG9wX3J4X3BjdShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZAorYXRoNWtfaHdfc3RvcF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19ESUFHX1NXLCBBUjVLX0RJQUdfU1dfRElTX1JYKTsKIH0KIAogLyoqCi0gKiBhdGg1a19od19zZXRfb3Btb2RlIC0gU2V0IFBDVSBvcGVyYXRpbmcgbW9kZQotICoKKyAqIGF0aDVrX2h3X3NldF9vcG1vZGUoKSAtIFNldCBQQ1Ugb3BlcmF0aW5nIG1vZGUKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKLSAqIEBvcF9tb2RlOiAmZW51bSBubDgwMjExX2lmdHlwZSBvcGVyYXRpbmcgbW9kZQorICogQG9wX21vZGU6IE9uZSBvZiBlbnVtIG5sODAyMTFfaWZ0eXBlCiAgKgogICogQ29uZmlndXJlIFBDVSBmb3IgdGhlIHZhcmlvdXMgb3BlcmF0aW5nIG1vZGVzIChBUC9TVEEgZXRjKQogICovCi1pbnQgYXRoNWtfaHdfc2V0X29wbW9kZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGUpCitpbnQKK2F0aDVrX2h3X3NldF9vcG1vZGUoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBubDgwMjExX2lmdHlwZSBvcF9tb2RlKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwogCXUzMiBwY3VfcmVnLCBiZWFjb25fcmVnLCBsb3dfaWQsIGhpZ2hfaWQ7CkBAIC04NzMsOCArOTM2LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXRoNWtfaHdfcGN1X2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBubDgwMjExX2lmdHlwZSBvcF9tb2RlLAotCQkJCQkJCQl1OCBtb2RlKQorLyoqCisgKiBhdGg1a19od19wY3VfaW5pdCgpIC0gSW5pdGlhbGl6ZSBQQ1UKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBvcF9tb2RlOiBPbmUgb2YgZW51bSBubDgwMjExX2lmdHlwZQorICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgUENVIGJ5IHNldHRpbmcgY3VycmVudAorICogb3BlcmF0aW9uIG1vZGUgYW5kIHZhcmlvdXMgb3RoZXIgc2V0dGluZ3MuCisgKi8KK3ZvaWQKK2F0aDVrX2h3X3BjdV9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSkKIHsKIAkvKiBTZXQgYnNzaWQgYW5kIGJzc2lkIG1hc2sgKi8KIAlhdGg1a19od19zZXRfYnNzaWQoYWgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jCmluZGV4IDAxY2I3MmQuLmUxZjg2MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGh5LmMKQEAgLTEsNiArMSw0IEBACiAvKgotICogUEhZIGZ1bmN0aW9ucwotICoKICAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA3IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KICAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KICAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CkBAIC0yMCw2ICsxOCwxMCBAQAogICoKICAqLwogCisvKioqKioqKioqKioqKioqKioqKioqKipcCisqIFBIWSByZWxhdGVkIGZ1bmN0aW9ucyAqCitcKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CkBAIC0zMSwxNCArMzMsNTMgQEAKICNpbmNsdWRlICIuLi9yZWdkLmgiCiAKIAorLyoqCisgKiBET0M6IFBIWSByZWxhdGVkIGZ1bmN0aW9ucworICoKKyAqIEhlcmUgd2UgaGFuZGxlIHRoZSBsb3ctbGV2ZWwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gYmFzZWJhbmQKKyAqIGFuZCBhbmFsb2cgZnJvbnRlbmQgKFJGKSBwYXJ0cy4gVGhpcyBpcyBieSBmYXIgdGhlIG1vc3QgY29tcGxleAorICogcGFydCBvZiB0aGUgaHcgY29kZSBzbyBtYWtlIHN1cmUgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorICoKKyAqIEhlcmUgaXMgYSBsaXN0IG9mIHdoYXQgdGhpcyBpcyBhbGwgYWJvdXQ6CisgKgorICogLSBDaGFubmVsIHNldHRpbmcvc3dpdGNoaW5nCisgKgorICogLSBBdXRvbWF0aWMgR2FpbiBDb250cm9sIChBR0MpIGNhbGlicmF0aW9uCisgKgorICogLSBOb2lzZSBGbG9vciBjYWxpYnJhdGlvbgorICoKKyAqIC0gSS9RIGltYmFsYW5jZSBjYWxpYnJhdGlvbiAoUUFNIGNvcnJlY3Rpb24pCisgKgorICogLSBDYWxpYnJhdGlvbiBkdWUgdG8gdGhlcm1hbCBjaGFuZ2VzIChnYWluX0YpCisgKgorICogLSBTcHVyIG5vaXNlIG1pdGlnYXRpb24KKyAqCisgKiAtIFJGL1BIWSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHZhcmlvdXMgb3BlcmF0aW5nIG1vZGVzIGFuZCBid21vZGVzCisgKgorICogLSBBbnRlbm5hIGNvbnRyb2wKKyAqCisgKiAtIFRYIHBvd2VyIGNvbnRyb2wgcGVyIGNoYW5uZWwvcmF0ZS9wYWNrZXQgdHlwZQorICoKKyAqIEFsc28gaGF2ZSBpbiBtaW5kIHdlIG5ldmVyIGdvdCBkb2N1bWVudGF0aW9uIGZvciBtb3N0IG9mIHRoZXNlCisgKiBmdW5jdGlvbnMsIHdoYXQgd2UgaGF2ZSBjb21lcyBtb3N0bHkgZnJvbSBBdGhlcm9zJ3MgY29kZSwgcmV2ZXJzZQorICogZW5naW5lZXJpbmcgYW5kIHBhdGVudCBkb2NzL3ByZXNlbnRhdGlvbnMgZXRjLgorICovCisKKwogLyoqKioqKioqKioqKioqKioqKlwKICogSGVscGVyIGZ1bmN0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogR2V0IHRoZSBQSFkgQ2hpcCByZXZpc2lvbgorLyoqCisgKiBhdGg1a19od19yYWRpb19yZXZpc2lvbigpIC0gR2V0IHRoZSBQSFkgQ2hpcCByZXZpc2lvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGJhbmQ6IE9uZSBvZiBlbnVtIGllZWU4MDIxMV9iYW5kCisgKgorICogUmV0dXJucyB0aGUgcmV2aXNpb24gbnVtYmVyIG9mIGEgMkdIeiwgNUdIeiBvciBzaW5nbGUgY2hpcAorICogcmFkaW8uCiAgKi8KLXUxNiBhdGg1a19od19yYWRpb19yZXZpc2lvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCit1MTYKK2F0aDVrX2h3X3JhZGlvX3JldmlzaW9uKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgc3JldjsKQEAgLTU4LDcgKzk5LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JbWRlbGF5KDIpOworCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKIAogCS8qIC4uLndhaXQgdW50aWwgUEhZIGlzIHJlYWR5IGFuZCByZWFkIHRoZSBzZWxlY3RlZCByYWRpbyByZXZpc2lvbiAqLwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMWMxNiwgQVI1S19QSFkoMHgzNCkpOwpAQCAtODEsMTAgKzEyMiwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBDaGVjayBpZiBhIGNoYW5uZWwgaXMgc3VwcG9ydGVkCisvKioKKyAqIGF0aDVrX2NoYW5uZWxfb2soKSAtIENoZWNrIGlmIGEgY2hhbm5lbCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGh3CisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBOb3RlOiBXZSBkb24ndCBkbyBhbnkgcmVndWxhdG9yeSBkb21haW4gY2hlY2tzIGhlcmUsIGl0J3MganVzdAorICogYSBzYW5pdHkgY2hlY2suCiAgKi8KLWJvb2wgYXRoNWtfY2hhbm5lbF9vayhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCitib29sCithdGg1a19jaGFubmVsX29rKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAl1MTYgZnJlcSA9IGNoYW5uZWwtPmNlbnRlcl9mcmVxOwogCkBAIC0xMDEsNyArMTQ4LDEzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIGF0aDVrX2h3X2NoYW5faGFzX3NwdXJfbm9pc2Uoc3RydWN0IGF0aDVrX2h3ICphaCwKKy8qKgorICogYXRoNWtfaHdfY2hhbl9oYXNfc3B1cl9ub2lzZSgpIC0gQ2hlY2sgaWYgY2hhbm5lbCBpcyBzZW5zaXRpdmUgdG8gc3B1ciBub2lzZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKi8KK2Jvb2wKK2F0aDVrX2h3X2NoYW5faGFzX3NwdXJfbm9pc2Uoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTggcmVmY2xrX2ZyZXE7CkBAIC0xMjIsMTEgKzE3NSwyMCBAQAogCQlyZXR1cm4gZmFsc2U7CiB9CiAKLS8qCi0gKiBVc2VkIHRvIG1vZGlmeSBSRiBCYW5rcyBiZWZvcmUgd3JpdGluZyB0aGVtIHRvIEFSNUtfUkZfQlVGRkVSCisvKioKKyAqIGF0aDVrX2h3X3JmYl9vcCgpIC0gUGVyZm9ybSBhbiBvcGVyYXRpb24gb24gdGhlIGdpdmVuIFJGIEJ1ZmZlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHJmX3JlZ3M6IFRoZSBzdHJ1Y3QgYXRoNWtfcmZfcmVnCisgKiBAdmFsOiBOZXcgdmFsdWUKKyAqIEByZWdfaWQ6IFJGIHJlZ2lzdGVyIElECisgKiBAc2V0OiBJbmRpY2F0ZSB3ZSBuZWVkIHRvIHN3YXAgZGF0YQorICoKKyAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB0byBtb2RpZnkgUkYgQmFua3MgYmVmb3JlCisgKiB3cml0aW5nIHRoZW0gdG8gQVI1S19SRl9CVUZGRVIuIENoZWNrIG91dCByZmJ1ZmZlci5oIGZvciBtb3JlCisgKiBpbmZvcy4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhdGg1a19od19yZmJfb3Aoc3RydWN0IGF0aDVrX2h3ICphaCwKLQkJCQkJY29uc3Qgc3RydWN0IGF0aDVrX3JmX3JlZyAqcmZfcmVncywKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2F0aDVrX2h3X3JmYl9vcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBjb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnICpyZl9yZWdzLAogCQkJCQl1MzIgdmFsLCB1OCByZWdfaWQsIGJvb2wgc2V0KQogewogCWNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgKnJmcmVnID0gTlVMTDsKQEAgLTIwNCw4ICsyNjYsNyBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncyAtIHNldCBPRkRNIHRpbWluZ3Mgb24gQVI1MjEyCi0gKgorICogYXRoNWtfaHdfd3JpdGVfb2ZkbV90aW1pbmdzKCkgLSBzZXQgT0ZETSB0aW1pbmdzIG9uIEFSNTIxMgogICogQGFoOiB0aGUgJnN0cnVjdCBhdGg1a19odwogICogQGNoYW5uZWw6IHRoZSBjdXJyZW50bHkgc2V0IGNoYW5uZWwgdXBvbiByZXNldAogICoKQEAgLTIxNiwxMCArMjc3LDExIEBACiAgKiBtYW50aXNzYSBhbmQgcHJvdmlkZSB0aGVzZSB2YWx1ZXMgb24gaHcuCiAgKgogICogRm9yIG1vcmUgaW5mb3MgaSB0aGluayB0aGlzIHBhdGVudCBpcyByZWxhdGVkCi0gKiBodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS83MTg0NDk1Lmh0bWwKKyAqICJodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS83MTg0NDk1Lmh0bWwiCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKK3N0YXRpYyBpbmxpbmUgaW50CithdGg1a19od193cml0ZV9vZmRtX3RpbWluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJLyogR2V0IGV4cG9uZW50IGFuZCBtYW50aXNzYSBhbmQgc2V0IGl0ICovCiAJdTMyIGNvZWZfc2NhbGVkLCBjb2VmX2V4cCwgY29lZl9tYW4sCkBAIC0yNzgsNiArMzQwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogYXRoNWtfaHdfcGh5X2Rpc2FibGUoKSAtIERpc2FibGUgUEhZCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKi8KIGludCBhdGg1a19od19waHlfZGlzYWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCS8qSnVzdCBhIHRyeSBNLkYuKi8KQEAgLTI4NiwxMCArMzUyLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBXYWl0IGZvciBzeW50aCB0byBzZXR0bGUKKy8qKgorICogYXRoNWtfaHdfd2FpdF9mb3Jfc3ludGgoKSAtIFdhaXQgZm9yIHN5bnRoIHRvIHNldHRsZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCiAgKi8KLXN0YXRpYyB2b2lkIGF0aDVrX2h3X3dhaXRfZm9yX3N5bnRoKHN0cnVjdCBhdGg1a19odyAqYWgsCitzdGF0aWMgdm9pZAorYXRoNWtfaHdfd2FpdF9mb3Jfc3ludGgoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAkvKgpAQCAtMzA4LDkgKzM3Nyw5IEBACiAJCQlkZWxheSA9IGRlbGF5IDw8IDI7CiAJCS8qIFhYWDogLzIgb24gdHVyYm8gPyBMZXQncyBiZSBzYWZlCiAJCSAqIGZvciBub3cgKi8KLQkJdWRlbGF5KDEwMCArIGRlbGF5KTsKKwkJdXNsZWVwX3JhbmdlKDEwMCArIGRlbGF5LCAxMDAgKyAoMiAqIGRlbGF5KSk7CiAJfSBlbHNlIHsKLQkJbWRlbGF5KDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CiAJfQogfQogCkBAIC0zMTksNyArMzg4LDkgQEAKICogUkYgR2FpbiBvcHRpbWl6YXRpb24gKgogXCoqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCisvKioKKyAqIERPQzogUkYgR2FpbiBvcHRpbWl6YXRpb24KKyAqCiAgKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBvcHRpbWl6ZSBSRiBnYWluIG9uIGRpZmZlcmVudCBlbnZpcm9ubWVudHMKICAqICh0ZW1wZXJhdHVyZSBtb3N0bHkpIGJhc2VkIG9uIGZlZWRiYWNrIGZyb20gYSBwb3dlciBkZXRlY3Rvci4KICAqCkBAIC0zMjgsMjIgKzM5OSwyMiBAQAogICogbm8gZ2FpbiBvcHRpbWl6YXRpb24gbGFkZGVyLS4KICAqCiAgKiBGb3IgbW9yZSBpbmZvcyBjaGVjayBvdXQgdGhpcyBwYXRlbnQgZG9jCi0gKiBodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS83NDAwNjkxLmh0bWwKKyAqICJodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS83NDAwNjkxLmh0bWwiCiAgKgogICogVGhpcyBwYXBlciBkZXNjcmliZXMgcG93ZXIgZHJvcHMgYXMgc2VlbiBvbiB0aGUgcmVjZWl2ZXIgZHVlIHRvCiAgKiBwcm9iZSBwYWNrZXRzCi0gKiBodHRwOi8vd3d3LmNucmkuZGl0LmllL3B1YmxpY2F0aW9ucy9JQ1QwOCUyMC0lMjBQcmFjdGljYWwlMjBJc3N1ZXMKLSAqICUyMG9mJTIwUG93ZXIlMjBDb250cm9sLnBkZgorICogImh0dHA6Ly93d3cuY25yaS5kaXQuaWUvcHVibGljYXRpb25zL0lDVDA4JTIwLSUyMFByYWN0aWNhbCUyMElzc3VlcworICogJTIwb2YlMjBQb3dlciUyMENvbnRyb2wucGRmIgogICoKICAqIEFuZCB0aGlzIGlzIHRoZSBNYWRXaUZpIGJ1ZyBlbnRyeSByZWxhdGVkIHRvIHRoZSBhYm92ZQotICogaHR0cDovL21hZHdpZmktcHJvamVjdC5vcmcvdGlja2V0LzE2NTkKKyAqICJodHRwOi8vbWFkd2lmaS1wcm9qZWN0Lm9yZy90aWNrZXQvMTY1OSIKICAqIHdpdGggdmFyaW91cyBtZWFzdXJlbWVudHMgYW5kIGRpYWdyYW1zCi0gKgotICogVE9ETzogRGVhbCB3aXRoIHBvd2VyIGRyb3BzIGR1ZSB0byBwcm9iZXMgYnkgc2V0dGluZyBhbiBhcHByb3ByaWF0ZQotICogdHggcG93ZXIgb24gdGhlIHByb2JlIHBhY2tldHMgISBNYWtlIHRoaXMgcGFydCBvZiB0aGUgY2FsaWJyYXRpb24gcHJvY2Vzcy4KICAqLwogCi0vKiBJbml0aWFsaXplIGFoX2dhaW4gZHVyaW5nIGF0dGFjaCAqLworLyoqCisgKiBhdGg1a19od19yZmdhaW5fb3B0X2luaXQoKSAtIEluaXRpYWxpemUgYWhfZ2FpbiBkdXJpbmcgYXR0YWNoCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKi8KIGludCBhdGg1a19od19yZmdhaW5fb3B0X2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAkvKiBJbml0aWFsaXplIHRoZSBnYWluIG9wdGltaXphdGlvbiB2YWx1ZXMgKi8KQEAgLTM2NywxNyArNDM4LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFNjaGVkdWxlIGEgZ2FpbiBwcm9iZSBjaGVjayBvbiB0aGUgbmV4dCB0cmFuc21pdHRlZCBwYWNrZXQuCisvKioKKyAqIGF0aDVrX2h3X3JlcXVlc3RfcmZnYWluX3Byb2JlKCkgLSBSZXF1ZXN0IGEgUEFQRCBwcm9iZSBwYWNrZXQKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBTY2hlZHVsZXMgYSBnYWluIHByb2JlIGNoZWNrIG9uIHRoZSBuZXh0IHRyYW5zbWl0dGVkIHBhY2tldC4KICAqIFRoYXQgbWVhbnMgb3VyIG5leHQgcGFja2V0IGlzIGdvaW5nIHRvIGJlIHNlbnQgd2l0aCBsb3dlcgogICogdHggcG93ZXIgYW5kIGEgUGVhayB0byBBdmVyYWdlIFBvd2VyIERldGVjdG9yIChQQVBEKSB3aWxsIHRyeQogICogdG8gbWVhc3VyZSB0aGUgZ2Fpbi4KICAqCi0gKiBYWFg6ICBIb3cgYWJvdXQgZm9yY2luZyBhIHR4IHBhY2tldCAoYnlwYXNzaW5nIFBDVSBhcmJpdHJhdG9yIGV0YykKKyAqIFRPRE86IEZvcmNlIGEgdHggcGFja2V0IChieXBhc3NpbmcgUENVIGFyYml0cmF0b3IgZXRjKQogICoganVzdCBhZnRlciB3ZSBlbmFibGUgdGhlIHByb2JlIHNvIHRoYXQgd2UgZG9uJ3QgbWVzcyB3aXRoCi0gKiBzdGFuZGFyZCB0cmFmZmljID8gTWF5YmUgaXQncyB0aW1lIHRvIHVzZSBzdyBpbnRlcnJ1cHRzIGFuZAotICogYSBwcm9iZSB0YXNrbGV0ICEhIQorICogc3RhbmRhcmQgdHJhZmZpYy4KICAqLwotc3RhdGljIHZvaWQgYXRoNWtfaHdfcmVxdWVzdF9yZmdhaW5fcHJvYmUoc3RydWN0IGF0aDVrX2h3ICphaCkKK3N0YXRpYyB2b2lkCithdGg1a19od19yZXF1ZXN0X3JmZ2Fpbl9wcm9iZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCiAJLyogU2tpcCBpZiBnYWluIGNhbGlicmF0aW9uIGlzIGluYWN0aXZlIG9yCkBAIC0zOTUsOSArNDcwLDE1IEBACiAKIH0KIAotLyogQ2FsY3VsYXRlIGdhaW5fRiBtZWFzdXJlbWVudCBjb3JyZWN0aW9uCi0gKiBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGVwIGZvciBSRjUxMTIgcmV2LiAyICovCi1zdGF0aWMgdTMyIGF0aDVrX2h3X3JmX2dhaW5mX2NvcnIoc3RydWN0IGF0aDVrX2h3ICphaCkKKy8qKgorICogYXRoNWtfaHdfcmZfZ2FpbmZfY29ycigpIC0gQ2FsY3VsYXRlIEdhaW5fRiBtZWFzdXJlbWVudCBjb3JyZWN0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogQ2FsY3VsYXRlIEdhaW5fRiBtZWFzdXJlbWVudCBjb3JyZWN0aW9uCisgKiBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGVwIGZvciBSRjUxMTIgcmV2LiAyCisgKi8KK3N0YXRpYyB1MzIKK2F0aDVrX2h3X3JmX2dhaW5mX2NvcnIoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAl1MzIgbWl4LCBzdGVwOwogCXUzMiAqcmY7CkBAIC00NTAsMTEgKzUzMSwxOSBAQAogCXJldHVybiBhaC0+YWhfZ2Fpbi5nX2ZfY29ycjsKIH0KIAotLyogQ2hlY2sgaWYgY3VycmVudCBnYWluX0YgbWVhc3VyZW1lbnQgaXMgaW4gdGhlIHJhbmdlIG9mIG91cgorLyoqCisgKiBhdGg1a19od19yZl9jaGVja19nYWluZl9yZWFkYmFjaygpIC0gVmFsaWRhdGUgR2Fpbl9GIGZlZWRiYWNrIGZyb20gZGV0ZWN0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBDaGVjayBpZiBjdXJyZW50IGdhaW5fRiBtZWFzdXJlbWVudCBpcyBpbiB0aGUgcmFuZ2Ugb2Ygb3VyCiAgKiBwb3dlciBkZXRlY3RvciB3aW5kb3dzLiBJZiB3ZSBnZXQgYSBtZWFzdXJlbWVudCBvdXRzaWRlIHJhbmdlCiAgKiB3ZSBrbm93IGl0J3Mgbm90IGFjY3VyYXRlIChkZXRlY3RvcnMgY2FuJ3QgbWVhc3VyZSBhbnl0aGluZyBvdXRzaWRlCi0gKiB0aGVpciBkZXRlY3Rpb24gd2luZG93KSBzbyB3ZSBtdXN0IGlnbm9yZSBpdCAqLwotc3RhdGljIGJvb2wgYXRoNWtfaHdfcmZfY2hlY2tfZ2FpbmZfcmVhZGJhY2soc3RydWN0IGF0aDVrX2h3ICphaCkKKyAqIHRoZWlyIGRldGVjdGlvbiB3aW5kb3cpIHNvIHdlIG11c3QgaWdub3JlIGl0LgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiByZWFkYmFjayB3YXMgTy5LLiBvciBmYWxzZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBib29sCithdGg1a19od19yZl9jaGVja19nYWluZl9yZWFkYmFjayhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCWNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgKnJmX3JlZ3M7CiAJdTMyIHN0ZXAsIG1peF9vdnIsIGxldmVsWzRdOwpAQCAtNTA2LDkgKzU5NSwxNSBAQAogCQkJYWgtPmFoX2dhaW4uZ19jdXJyZW50IDw9IGxldmVsWzNdKTsKIH0KIAotLyogUGVyZm9ybSBnYWluX0YgYWRqdXN0bWVudCBieSBjaG9vc2luZyB0aGUgcmlnaHQgc2V0Ci0gKiBvZiBwYXJhbWV0ZXJzIGZyb20gUkYgZ2FpbiBvcHRpbWl6YXRpb24gbGFkZGVyICovCi1zdGF0aWMgczggYXRoNWtfaHdfcmZfZ2FpbmZfYWRqdXN0KHN0cnVjdCBhdGg1a19odyAqYWgpCisvKioKKyAqIGF0aDVrX2h3X3JmX2dhaW5mX2FkanVzdCgpIC0gUGVyZm9ybSBHYWluX0YgYWRqdXN0bWVudAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIENob29zZSB0aGUgcmlnaHQgdGFyZ2V0IGdhaW4gYmFzZWQgb24gY3VycmVudCBnYWluCisgKiBhbmQgUkYgZ2FpbiBvcHRpbWl6YXRpb24gbGFkZGVyCisgKi8KK3N0YXRpYyBzOAorYXRoNWtfaHdfcmZfZ2FpbmZfYWRqdXN0KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0ICpnbzsKIAljb25zdCBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcCAqZ19zdGVwOwpAQCAtNTcyLDEzICs2NjcsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBNYWluIGNhbGxiYWNrIGZvciB0aGVybWFsIFJGIGdhaW4gY2FsaWJyYXRpb24gZW5naW5lCisvKioKKyAqIGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZSgpIC0gRG8gYSBnYWluX0YgY2FsaWJyYXRpb24KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBNYWluIGNhbGxiYWNrIGZvciB0aGVybWFsIFJGIGdhaW4gY2FsaWJyYXRpb24gZW5naW5lCiAgKiBDaGVjayBmb3IgYSBuZXcgZ2FpbiByZWFkaW5nIGFuZCBzY2hlZHVsZSBhbiBhZGp1c3RtZW50CiAgKiBpZiBuZWVkZWQuCiAgKgotICogVE9ETzogVXNlIHN3IGludGVycnVwdCB0byBzY2hlZHVsZSByZXNldCBpZiBnYWluX0YgbmVlZHMKLSAqIGFkanVzdG1lbnQgKi8KLWVudW0gYXRoNWtfcmZnYWluIGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorICogUmV0dXJucyBvbmUgb2YgZW51bSBhdGg1a19yZmdhaW4gY29kZXMKKyAqLworZW51bSBhdGg1a19yZmdhaW4KK2F0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXUzMiBkYXRhLCB0eXBlOwogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwpAQCAtNjM4LDEwICs3MzgsMTggQEAKIAlyZXR1cm4gYWgtPmFoX2dhaW4uZ19zdGF0ZTsKIH0KIAotLyogV3JpdGUgaW5pdGlhbCBSRiBnYWluIHRhYmxlIHRvIHNldCB0aGUgUkYgc2Vuc2l0aXZpdHkKLSAqIHRoaXMgb25lIHdvcmtzIG9uIGFsbCBSRiBjaGlwcyBhbmQgaGFzIG5vdGhpbmcgdG8gZG8KLSAqIHdpdGggZ2Fpbl9GIGNhbGlicmF0aW9uICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmZ2Fpbl9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKKy8qKgorICogYXRoNWtfaHdfcmZnYWluX2luaXQoKSAtIFdyaXRlIGluaXRpYWwgUkYgZ2FpbiBzZXR0aW5ncyB0byBodworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGJhbmQ6IE9uZSBvZiBlbnVtIGllZWU4MDIxMV9iYW5kCisgKgorICogV3JpdGUgaW5pdGlhbCBSRiBnYWluIHRhYmxlIHRvIHNldCB0aGUgUkYgc2Vuc2l0aXZpdHkuCisgKgorICogTk9URTogVGhpcyBvbmUgd29ya3Mgb24gYWxsIFJGIGNoaXBzIGFuZCBoYXMgbm90aGluZyB0byBkbworICogd2l0aCBHYWluX0YgY2FsaWJyYXRpb24KKyAqLworc3RhdGljIGludAorYXRoNWtfaHdfcmZnYWluX2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQogewogCWNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZnYWluICphdGg1a19yZmc7CiAJdW5zaWduZWQgaW50IGksIHNpemUsIGluZGV4OwpAQCAtNjg4LDE2ICs3OTYsMjMgQEAKIH0KIAogCi0KIC8qKioqKioqKioqKioqKioqKioqKlwKICogUkYgUmVnaXN0ZXJzIHNldHVwICoKIFwqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFNldHVwIFJGIHJlZ2lzdGVycyBieSB3cml0aW5nIFJGIGJ1ZmZlciBvbiBodworLyoqCisgKiBhdGg1a19od19yZnJlZ3NfaW5pdCgpIC0gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciBzZXR0aW5ncworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqCisgKiBTZXR1cCBSRiByZWdpc3RlcnMgYnkgd3JpdGluZyBSRiBidWZmZXIgb24gaHcuIEZvcgorICogbW9yZSBpbmZvcyBvbiB0aGlzLCBjaGVjayBvdXQgcmZidWZmZXIuaAogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmcmVnc19pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsCi0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3JmcmVnc19pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCisJCQl1bnNpZ25lZCBpbnQgbW9kZSkKIHsKIAljb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnICpyZl9yZWdzOwogCWNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZidWZmZXIgKmluaV9yZmI7CkBAIC0xMDU1LDE5ICsxMTcwLDE4IEBACiAgIFBIWS9SRiBjaGFubmVsIGZ1bmN0aW9ucwogXCoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogQ29udmVyc2lvbiBuZWVkZWQgZm9yIFJGNTExMAorLyoqCisgKiBhdGg1a19od19yZjUxMTBfY2hhbjJhdGhjaGFuKCkgLSBDb252ZXJ0IGNoYW5uZWwgZnJlcSBvbiBSRjUxMTAKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIE1hcCBjaGFubmVsIGZyZXF1ZW5jeSB0byBJRUVFIGNoYW5uZWwgbnVtYmVyIGFuZCBjb252ZXJ0IGl0CisgKiB0byBhbiBpbnRlcm5hbCBjaGFubmVsIHZhbHVlIHVzZWQgYnkgdGhlIFJGNTExMCBjaGlwc2V0LgogICovCi1zdGF0aWMgdTMyIGF0aDVrX2h3X3JmNTExMF9jaGFuMmF0aGNoYW4oc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQorc3RhdGljIHUzMgorYXRoNWtfaHdfcmY1MTEwX2NoYW4yYXRoY2hhbihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTMyIGF0aGNoYW47CiAKLQkvKgotCSAqIENvbnZlcnQgSUVFRSBjaGFubmVsL01IeiB0byBhbiBpbnRlcm5hbCBjaGFubmVsIHZhbHVlIHVzZWQKLQkgKiBieSB0aGUgQVI1MjEwIGNoaXBzZXQuIFRoaXMgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIHdpdGgKLQkgKiBuZXdlciBjaGlwc2V0cyBsaWtlIHRoZSBBUjUyMTJBIHdobyBoYXZlIGEgY29tcGxldGVseQotCSAqIGRpZmZlcmVudCBSRi9QSFkgcGFydC4KLQkgKi8KIAlhdGhjaGFuID0gKGF0aDVrX2h3X2JpdHN3YXAoCiAJCQkoaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKAogCQkJCWNoYW5uZWwtPmNlbnRlcl9mcmVxKSAtIDI0KSAvIDIsIDUpCkBAIC0xMDc1LDEwICsxMTg5LDEzIEBACiAJcmV0dXJuIGF0aGNoYW47CiB9CiAKLS8qCi0gKiBTZXQgY2hhbm5lbCBvbiBSRjUxMTAKKy8qKgorICogYXRoNWtfaHdfcmY1MTEwX2NoYW5uZWwoKSAtIFNldCBjaGFubmVsIGZyZXF1ZW5jeSBvbiBSRjUxMTAKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMF9jaGFubmVsKHN0cnVjdCBhdGg1a19odyAqYWgsCitzdGF0aWMgaW50CithdGg1a19od19yZjUxMTBfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTMyIGRhdGE7CkBAIC0xMDg5LDE1ICsxMjA2LDIzIEBACiAJZGF0YSA9IGF0aDVrX2h3X3JmNTExMF9jaGFuMmF0aGNoYW4oY2hhbm5lbCk7CiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBkYXRhLCBBUjVLX1JGX0JVRkZFUik7CiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX1JGX0JVRkZFUl9DT05UUk9MXzApOwotCW1kZWxheSgxKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIENvbnZlcnNpb24gbmVlZGVkIGZvciA1MTExCisvKioKKyAqIGF0aDVrX2h3X3JmNTExMV9jaGFuMmF0aGNoYW4oKSAtIEhhbmRsZSAyR0h6IGNoYW5uZWxzIG9uIFJGNTExMS8yMTExCisgKiBAaWVlZTogSUVFRSBjaGFubmVsIG51bWJlcgorICogQGF0aGNoYW46IFRoZSAmc3RydWN0IGF0aDVrX2F0aGNoYW5fMmdoegorICoKKyAqIEluIG9yZGVyIHRvIGVuYWJsZSB0aGUgUkYyMTExIGZyZXF1ZW5jeSBjb252ZXJ0ZXIgb24gUkY1MTExLzIxMTEgc2V0dXBzCisgKiB3ZSBuZWVkIHRvIGFkZCBzb21lIG9mZnNldHMgYW5kIGV4dHJhIGZsYWdzIHRvIHRoZSBkYXRhIHZhbHVlcyB3ZSBwYXNzCisgKiBvbiB0byB0aGUgUEhZLiBTbyBmb3IgZXZlcnkgMkdIeiBjaGFubmVsIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQKKyAqIHRvIGRvIHRoZSBjb252ZXJzaW9uLgogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMV9jaGFuMmF0aGNoYW4odW5zaWduZWQgaW50IGllZWUsCitzdGF0aWMgaW50CithdGg1a19od19yZjUxMTFfY2hhbjJhdGhjaGFuKHVuc2lnbmVkIGludCBpZWVlLAogCQlzdHJ1Y3QgYXRoNWtfYXRoY2hhbl8yZ2h6ICphdGhjaGFuKQogewogCWludCBjaGFubmVsOwpAQCAtMTEyMywxMCArMTI0OCwxMyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IGNoYW5uZWwgb24gNTExMQorLyoqCisgKiBhdGg1a19od19yZjUxMTFfY2hhbm5lbCgpIC0gU2V0IGNoYW5uZWwgZnJlcXVlbmN5IG9uIFJGNTExMS8yMTExCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKICAqLwotc3RhdGljIGludCBhdGg1a19od19yZjUxMTFfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIGludAorYXRoNWtfaHdfcmY1MTExX2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCXN0cnVjdCBhdGg1a19hdGhjaGFuXzJnaHogYXRoNWtfY2hhbm5lbF8yZ2h6OwpAQCAtMTE3MSwxMCArMTI5OSwyMCBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IGNoYW5uZWwgb24gNTExMiBhbmQgbmV3ZXIKKy8qKgorICogYXRoNWtfaHdfcmY1MTEyX2NoYW5uZWwoKSAtIFNldCBjaGFubmVsIGZyZXF1ZW5jeSBvbiA1MTEyIGFuZCBuZXdlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKgorICogT24gUkY1MTEyLzIxMTIgYW5kIG5ld2VyIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IGNvbnZlcnNpb24uCisgKiBXZSBwYXNzIHRoZSBmcmVxdWVuY3kgdmFsdWUgYWZ0ZXIgYSBmZXcgbW9kaWZpY2F0aW9ucyB0byB0aGUKKyAqIGNoaXAgZGlyZWN0bHkuCisgKgorICogTk9URTogTWFrZSBzdXJlIGNoYW5uZWwgZnJlcXVlbmN5IGdpdmVuIGlzIHdpdGhpbiBvdXIgcmFuZ2Ugb3IgZWxzZQorICogd2UgbWlnaHQgZGFtYWdlIHRoZSBjaGlwICEgVXNlIGF0aDVrX2NoYW5uZWxfb2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBvbmUuCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcmY1MTEyX2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3JmNTExMl9jaGFubmVsKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAl1MzIgZGF0YSwgZGF0YTAsIGRhdGExLCBkYXRhMjsKQEAgLTExODMsMTcgKzEzMjEsMzcgQEAKIAlkYXRhID0gZGF0YTAgPSBkYXRhMSA9IGRhdGEyID0gMDsKIAljID0gY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CiAKKwkvKiBNeSBndWVzcyBiYXNlZCBvbiBjb2RlOgorCSAqIDJHSHogUkYgaGFzIDIgc3ludGggbW9kZXMsIG9uZSB3aXRoIGEgTG9jYWwgT3NjaWxsYXRvcgorCSAqIGF0IDIyMjRIeiBhbmQgb25lIHdpdGggYSBMTyBhdCAyMTkySHouIElGIGlzIDE1MjBIegorCSAqICgzMDQwLzIpLiBkYXRhMCBpcyB1c2VkIHRvIHNldCB0aGUgUExMIGRpdmlkZXIgYW5kIGRhdGExCisJICogc2VsZWN0cyBzeW50aCBtb2RlLiAqLwogCWlmIChjIDwgNDgwMCkgeworCQkvKiBDaGFubmVsIDE0IGFuZCBhbGwgZnJlcXVlbmNpZXMgd2l0aCAySHogc3BhY2luZworCQkgKiBiZWxvdy9hYm92ZSAobm9uLXN0YW5kYXJkIGNoYW5uZWxzKSAqLwogCQlpZiAoISgoYyAtIDIyMjQpICUgNSkpIHsKKwkJCS8qIFNhbWUgYXMgKGMgLSAyMjI0KSAvIDUgKi8KIAkJCWRhdGEwID0gKCgyICogKGMgLSA3MDQpKSAtIDMwNDApIC8gMTA7CiAJCQlkYXRhMSA9IDE7CisJCS8qIENoYW5uZWwgMSBhbmQgYWxsIGZyZXF1ZW5jaWVzIHdpdGggNUh6IHNwYWNpbmcKKwkJICogYmVsb3cvYWJvdmUgKHN0YW5kYXJkIGNoYW5uZWxzIHdpdGhvdXQgY2hhbm5lbCAxNCkgKi8KIAkJfSBlbHNlIGlmICghKChjIC0gMjE5MikgJSA1KSkgeworCQkJLyogU2FtZSBhcyAoYyAtIDIxOTIpIC8gNSAqLwogCQkJZGF0YTAgPSAoKDIgKiAoYyAtIDY3MikpIC0gMzA0MCkgLyAxMDsKIAkJCWRhdGExID0gMDsKIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlkYXRhMCA9IGF0aDVrX2h3X2JpdHN3YXAoKGRhdGEwIDw8IDIpICYgMHhmZiwgOCk7CisJLyogVGhpcyBpcyBtb3JlIGNvbXBsZXgsIHdlIGhhdmUgYSBzaW5nbGUgc3ludGhlc2l6ZXIgd2l0aAorCSAqIDQgcmVmZXJlbmNlIGNsb2NrIHNldHRpbmdzICg/KSBiYXNlZCBvbiBmcmVxdWVuY3kgc3BhY2luZworCSAqIGFuZCBzZXQgdXNpbmcgZGF0YTIuIExPIGlzIGF0IDQ4MDBIeiBhbmQgZGF0YTAgaXMgYWdhaW4gdXNlZAorCSAqIHRvIHNldCBzb21lIGRpdmlkZXIuCisJICoKKwkgKiBOT1RFOiBUaGVyZSBpcyBhbiBvbGQgYXRoZXJvcyBwcmVzZW50YXRpb24gYXQgU3RhbmZvcmQKKwkgKiB0aGF0IG1lbnRpb25zIGEgbWV0aG9kIGNhbGxlZCBkdWFsIGRpcmVjdCBjb252ZXJzaW9uCisJICogd2l0aCAxR0h6IHNsaWRpbmcgSUYgZm9yIFJGNTExMC4gTWF5YmUgdGhhdCdzIHdoYXQgd2UKKwkgKiBoYXZlIGhlcmUsIG9yIGFuIHVwZGF0ZWQgdmVyc2lvbi4gKi8KIAl9IGVsc2UgaWYgKChjICUgNSkgIT0gMiB8fCBjID4gNTQzNSkgewogCQlpZiAoIShjICUgMjApICYmIGMgPj0gNTEyMCkgewogCQkJZGF0YTAgPSBhdGg1a19od19iaXRzd2FwKCgoYyAtIDQ4MDApIC8gMjAgPDwgMiksIDgpOwpAQCAtMTIxOSwxMCArMTM3NywxNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IHRoZSBjaGFubmVsIG9uIHRoZSBSRjI0MjUKKy8qKgorICogYXRoNWtfaHdfcmYyNDI1X2NoYW5uZWwoKSAtIFNldCBjaGFubmVsIGZyZXF1ZW5jeSBvbiBSRjI0MjUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIEFSMjQyNS8yNDE3IGhhdmUgYSBkaWZmZXJlbnQgMkdIeiBSRiBzbyBjb2RlIGNoYW5nZXMKKyAqIGEgbGl0dGxlIGJpdCBmcm9tIFJGNTExMi4KICAqLwotc3RhdGljIGludCBhdGg1a19od19yZjI0MjVfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIGludAorYXRoNWtfaHdfcmYyNDI1X2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCXUzMiBkYXRhLCBkYXRhMCwgZGF0YTI7CkBAIC0xMjU4LDEwICsxNDIyLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBTZXQgYSBjaGFubmVsIG9uIHRoZSByYWRpbyBjaGlwCisvKioKKyAqIGF0aDVrX2h3X2NoYW5uZWwoKSAtIFNldCBhIGNoYW5uZWwgb24gdGhlIHJhZGlvIGNoaXAKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gY2FsbGVkIHRvIHNldCBhIGNoYW5uZWwgb24gdGhlCisgKiByYWRpbyBjaGlwIGJhc2VkIG9uIHRoZSByYWRpbyBjaGlwIHZlcnNpb24uCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIGludAorYXRoNWtfaHdfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJaW50IHJldDsKQEAgLTEzMTMsMTEgKzE0ODMsNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorCiAvKioqKioqKioqKioqKioqKipcCiAgIFBIWSBjYWxpYnJhdGlvbgogXCoqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgczMyIGF0aDVrX2h3X3JlYWRfbWVhc3VyZWRfbm9pc2VfZmxvb3Ioc3RydWN0IGF0aDVrX2h3ICphaCkKKy8qKgorICogRE9DOiBQSFkgQ2FsaWJyYXRpb24gcm91dGluZXMKKyAqCisgKiBOb2lzZSBmbG9vciBjYWxpYnJhdGlvbjogV2hlbiB3ZSB0ZWxsIHRoZSBoYXJkd2FyZSB0bworICogcGVyZm9ybSBhIG5vaXNlIGZsb29yIGNhbGlicmF0aW9uIGJ5IHNldHRpbmcgdGhlCisgKiBBUjVLX1BIWV9BR0NDVExfTkYgYml0IG9uIEFSNUtfUEhZX0FHQ0NUTCwgaXQgd2lsbCBwZXJpb2RpY2FsbHkKKyAqIHNhbXBsZS1hbmQtaG9sZCB0aGUgbWluaW11bSBub2lzZSBsZXZlbCBzZWVuIGF0IHRoZSBhbnRlbm5hcy4KKyAqIFRoaXMgdmFsdWUgaXMgdGhlbiBzdG9yZWQgaW4gYSByaW5nIGJ1ZmZlciBvZiByZWNlbnRseSBtZWFzdXJlZAorICogbm9pc2UgZmxvb3IgdmFsdWVzIHNvIHdlIGhhdmUgYSBtb3Zpbmcgd2luZG93IG9mIHRoZSBsYXN0IGZldworICogc2FtcGxlcy4gVGhlIG1lZGlhbiBvZiB0aGUgdmFsdWVzIGluIHRoZSBoaXN0b3J5IGlzIHRoZW4gbG9hZGVkCisgKiBpbnRvIHRoZSBoYXJkd2FyZSBmb3IgaXRzIG93biB1c2UgZm9yIFJTU0kgYW5kIENDQSBtZWFzdXJlbWVudHMuCisgKiBUaGlzIHR5cGUgb2YgY2FsaWJyYXRpb24gZG9lc24ndCBpbnRlcmZlcmUgd2l0aCB0cmFmZmljLgorICoKKyAqIEFHQyBjYWxpYnJhdGlvbjogV2hlbiB3ZSB0ZWxsIHRoZSBoYXJkd2FyZSB0byBwZXJmb3JtCisgKiBhbiBBR0MgKEF1dG9tYXRpYyBHYWluIENvbnRyb2wpIGNhbGlicmF0aW9uIGJ5IHNldHRpbmcgdGhlCisgKiBBUjVLX1BIWV9BR0NDVExfQ0FMLCBodyBkaXNjb25uZWN0cyB0aGUgYW50ZW5uYXMgYW5kIGRvZXMKKyAqIGEgY2FsaWJyYXRpb24gb24gdGhlIERDIG9mZnNldHMgb2YgQURDcy4gRHVyaW5nIHRoaXMgcGVyaW9kCisgKiByeC90eCBnZXRzIGRpc2FibGVkIHNvIHdlIGhhdmUgdG8gZGVhbCB3aXRoIGl0IG9uIHRoZSBkcml2ZXIKKyAqIHBhcnQuCisgKgorICogSS9RIGNhbGlicmF0aW9uOiBXaGVuIHdlIHRlbGwgdGhlIGhhcmR3YXJlIHRvIHBlcmZvcm0KKyAqIGFuIEkvUSBjYWxpYnJhdGlvbiwgaXQgdHJpZXMgdG8gY29ycmVjdCBJL1EgaW1iYWxhbmNlIGFuZAorICogZml4IFFBTSBjb25zdGVsbGF0aW9uIGJ5IHNhbXBsaW5nIGRhdGEgZnJvbSByeGVkIGZyYW1lcy4KKyAqIEl0IGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGggdHJhZmZpYy4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcyBvbiBBR0MgYW5kIEkvUSBjYWxpYnJhdGlvbiBjaGVjayBvdXQgcGF0ZW50IGRvYworICogIzAzLzA5NDQ2My4KKyAqLworCisvKioKKyAqIGF0aDVrX2h3X3JlYWRfbWVhc3VyZWRfbm9pc2VfZmxvb3IoKSAtIFJlYWQgbWVhc3VyZWQgTkYgZnJvbSBodworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCitzdGF0aWMgczMyCithdGg1a19od19yZWFkX21lYXN1cmVkX25vaXNlX2Zsb29yKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJczMyIHZhbDsKIApAQCAtMTMyNSw3ICsxNTMwLDEyIEBACiAJcmV0dXJuIHNpZ25fZXh0ZW5kMzIoQVI1S19SRUdfTVModmFsLCBBUjVLX1BIWV9ORl9NSU5DQ0FfUFdSKSwgOCk7CiB9CiAKLXZvaWQgYXRoNWtfaHdfaW5pdF9uZmNhbF9oaXN0KHN0cnVjdCBhdGg1a19odyAqYWgpCisvKioKKyAqIGF0aDVrX2h3X2luaXRfbmZjYWxfaGlzdCgpIC0gSW5pdGlhbGl6ZSBORiBjYWxpYnJhdGlvbiBoaXN0b3J5IGJ1ZmZlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCit2b2lkCithdGg1a19od19pbml0X25mY2FsX2hpc3Qoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlpbnQgaTsKIApAQCAtMTMzNCw2ICsxNTQ0LDExIEBACiAJCWFoLT5haF9uZmNhbF9oaXN0Lm5mdmFsW2ldID0gQVI1S19UVU5FX0NDQV9NQVhfR09PRF9WQUxVRTsKIH0KIAorLyoqCisgKiBhdGg1a19od191cGRhdGVfbmZjYWxfaGlzdCgpIC0gVXBkYXRlIE5GIGNhbGlicmF0aW9uIGhpc3RvcnkgYnVmZmVyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbm9pc2VfZmxvb3I6IFRoZSBORiB3ZSBnb3QgZnJvbSBodworICovCiBzdGF0aWMgdm9pZCBhdGg1a19od191cGRhdGVfbmZjYWxfaGlzdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzMTYgbm9pc2VfZmxvb3IpCiB7CiAJc3RydWN0IGF0aDVrX25mY2FsX2hpc3QgKmhpc3QgPSAmYWgtPmFoX25mY2FsX2hpc3Q7CkBAIC0xMzQxLDcgKzE1NTYsMTIgQEAKIAloaXN0LT5uZnZhbFtoaXN0LT5pbmRleF0gPSBub2lzZV9mbG9vcjsKIH0KIAotc3RhdGljIHMxNiBhdGg1a19od19nZXRfbWVkaWFuX25vaXNlX2Zsb29yKHN0cnVjdCBhdGg1a19odyAqYWgpCisvKioKKyAqIGF0aDVrX2h3X2dldF9tZWRpYW5fbm9pc2VfZmxvb3IoKSAtIEdldCBtZWRpYW4gTkYgZnJvbSBoaXN0b3J5IGJ1ZmZlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCitzdGF0aWMgczE2CithdGg1a19od19nZXRfbWVkaWFuX25vaXNlX2Zsb29yKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJczE2IHNvcnRbQVRINUtfTkZfQ0FMX0hJU1RfTUFYXTsKIAlzMTYgdG1wOwpAQCAtMTM2NCwxOCArMTU4NCwxNiBAQAogCXJldHVybiBzb3J0WyhBVEg1S19ORl9DQUxfSElTVF9NQVggLSAxKSAvIDJdOwogfQogCi0vKgotICogV2hlbiB3ZSB0ZWxsIHRoZSBoYXJkd2FyZSB0byBwZXJmb3JtIGEgbm9pc2UgZmxvb3IgY2FsaWJyYXRpb24KLSAqIGJ5IHNldHRpbmcgdGhlIEFSNUtfUEhZX0FHQ0NUTF9ORiBiaXQsIGl0IHdpbGwgcGVyaW9kaWNhbGx5Ci0gKiBzYW1wbGUtYW5kLWhvbGQgdGhlIG1pbmltdW0gbm9pc2UgbGV2ZWwgc2VlbiBhdCB0aGUgYW50ZW5uYXMuCi0gKiBUaGlzIHZhbHVlIGlzIHRoZW4gc3RvcmVkIGluIGEgcmluZyBidWZmZXIgb2YgcmVjZW50bHkgbWVhc3VyZWQKLSAqIG5vaXNlIGZsb29yIHZhbHVlcyBzbyB3ZSBoYXZlIGEgbW92aW5nIHdpbmRvdyBvZiB0aGUgbGFzdCBmZXcKLSAqIHNhbXBsZXMuCisvKioKKyAqIGF0aDVrX2h3X3VwZGF0ZV9ub2lzZV9mbG9vcigpIC0gVXBkYXRlIE5GIG9uIGhhcmR3YXJlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgotICogVGhlIG1lZGlhbiBvZiB0aGUgdmFsdWVzIGluIHRoZSBoaXN0b3J5IGlzIHRoZW4gbG9hZGVkIGludG8gdGhlCi0gKiBoYXJkd2FyZSBmb3IgaXRzIG93biB1c2UgZm9yIFJTU0kgYW5kIENDQSBtZWFzdXJlbWVudHMuCisgKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHdlIGNhbGwgdG8gcGVyZm9ybSBhIE5GIGNhbGlicmF0aW9uLAorICogaXQgcmVhZHMgTkYgZnJvbSBoYXJkd2FyZSwgY2FsY3VsYXRlcyB0aGUgbWVkaWFuIGFuZCB1cGRhdGVzCisgKiBORiBvbiBody4KICAqLwotdm9pZCBhdGg1a19od191cGRhdGVfbm9pc2VfZmxvb3Ioc3RydWN0IGF0aDVrX2h3ICphaCkKK3ZvaWQKK2F0aDVrX2h3X3VwZGF0ZV9ub2lzZV9mbG9vcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwogCXUzMiB2YWw7CkBAIC0xMzkwLDYgKzE2MDgsOCBAQAogCQlyZXR1cm47CiAJfQogCisJYWgtPmFoX2NhbF9tYXNrIHw9IEFSNUtfQ0FMSUJSQVRJT05fTkY7CisKIAllZV9tb2RlID0gYXRoNWtfZWVwcm9tX21vZGVfZnJvbV9jaGFubmVsKGFoLT5haF9jdXJyZW50X2NoYW5uZWwpOwogCiAJLyogY29tcGxldGVkIE5GIGNhbGlicmF0aW9uLCB0ZXN0IHRocmVzaG9sZCAqLwpAQCAtMTQzNCwyMCArMTY1NCwyOSBAQAogCiAJYWgtPmFoX25vaXNlX2Zsb29yID0gbmY7CiAKKwlhaC0+YWhfY2FsX21hc2sgJj0gfkFSNUtfQ0FMSUJSQVRJT05fTkY7CisKIAlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwKIAkJIm5vaXNlIGZsb29yIGNhbGlicmF0ZWQ6ICVkXG4iLCBuZik7CiB9CiAKLS8qCi0gKiBQZXJmb3JtIGEgUEhZIGNhbGlicmF0aW9uIG9uIFJGNTExMAotICogLUZpeCBCUFNLL1FBTSBDb25zdGVsbGF0aW9uIChJL1EgY29ycmVjdGlvbikKKy8qKgorICogYXRoNWtfaHdfcmY1MTEwX2NhbGlicmF0ZSgpIC0gUGVyZm9ybSBhIFBIWSBjYWxpYnJhdGlvbiBvbiBSRjUxMTAKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIERvIGEgY29tcGxldGUgUEhZIGNhbGlicmF0aW9uIChBR0MgKyBORiArIEkvUSkgb24gUkY1MTEwCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcmY1MTEwX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIGludAorYXRoNWtfaHdfcmY1MTEwX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTMyIHBoeV9zaWcsIHBoeV9hZ2MsIHBoeV9zYXQsIGJlYWNvbjsKIAlpbnQgcmV0OwogCisJaWYgKCEoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSkKKwkJcmV0dXJuIDA7CisKIAkvKgogCSAqIERpc2FibGUgYmVhY29ucyBhbmQgUlgvVFggcXVldWVzLCB3YWl0CiAJICovCkBAIC0xNDU2LDcgKzE2ODUsNyBAQAogCWJlYWNvbiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0JFQUNPTl81MjEwKTsKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIGJlYWNvbiAmIH5BUjVLX0JFQUNPTl9FTkFCTEUsIEFSNUtfQkVBQ09OXzUyMTApOwogCi0JbWRlbGF5KDIpOworCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKIAogCS8qCiAJICogU2V0IHRoZSBjaGFubmVsICh3aXRoIEFHQyB0dXJuZWQgb2ZmKQpAQCAtMTQ2OSw3ICsxNjk4LDcgQEAKIAkgKiBBY3RpdmF0ZSBQSFkgYW5kIHdhaXQKIAkgKi8KIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX0FDVF9FTkFCTEUsIEFSNUtfUEhZX0FDVCk7Ci0JbWRlbGF5KDEpOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKIAogCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19QSFlfQUdDLCBBUjVLX1BIWV9BR0NfRElTQUJMRSk7CiAKQEAgLTE1MDYsNyArMTczNSw3IEBACiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9SRlNUR19ESVNBQkxFLCBBUjVLX1BIWV9SRlNURyk7CiAJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1BIWV9BR0MsIEFSNUtfUEhZX0FHQ19ESVNBQkxFKTsKIAotCW1kZWxheSgxKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CiAKIAkvKgogCSAqIEVuYWJsZSBjYWxpYnJhdGlvbiBhbmQgd2FpdCB1bnRpbCBjb21wbGV0aW9uCkBAIC0xNTM3LDggKzE3NjYsOSBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUGVyZm9ybSBJL1EgY2FsaWJyYXRpb24gb24gUkY1MTExLzUxMTIgYW5kIG5ld2VyIGNoaXBzCisvKioKKyAqIGF0aDVrX2h3X3JmNTExeF9pcV9jYWxpYnJhdGUoKSAtIFBlcmZvcm0gSS9RIGNhbGlicmF0aW9uIG9uIFJGNTExMSBhbmQgbmV3ZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqLwogc3RhdGljIGludAogYXRoNWtfaHdfcmY1MTF4X2lxX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQpAQCAtMTU0NywxMiArMTc3NywxOSBAQAogCXMzMiBpcV9jb3JyLCBpX2NvZmYsIGlfY29mZmQsIHFfY29mZiwgcV9jb2ZmZDsKIAlpbnQgaTsKIAotCWlmICghYWgtPmFoX2NhbGlicmF0aW9uIHx8Ci0JCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9JUSkgJiBBUjVLX1BIWV9JUV9SVU4pCi0JCXJldHVybiAwOworCS8qIFNraXAgaWYgSS9RIGNhbGlicmF0aW9uIGlzIG5vdCBuZWVkZWQgb3IgaWYgaXQncyBzdGlsbCBydW5uaW5nICovCisJaWYgKCFhaC0+YWhfaXFfY2FsX25lZWRlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0lRKSAmIEFSNUtfUEhZX0lRX1JVTikgeworCQlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQ0FMSUJSQVRFLAorCQkJCSJJL1EgY2FsaWJyYXRpb24gc3RpbGwgcnVubmluZyIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCS8qIENhbGlicmF0aW9uIGhhcyBmaW5pc2hlZCwgZ2V0IHRoZSByZXN1bHRzIGFuZCByZS1ydW4gKi8KLQkvKiB3b3JrIGFyb3VuZCBlbXB0eSByZXN1bHRzIHdoaWNoIGNhbiBhcHBhcmVudGx5IGhhcHBlbiBvbiA1MjEyICovCisKKwkvKiBXb3JrIGFyb3VuZCBmb3IgZW1wdHkgcmVzdWx0cyB3aGljaCBjYW4gYXBwYXJlbnRseSBoYXBwZW4gb24gNTIxMjoKKwkgKiBSZWFkIHJlZ2lzdGVycyB1cCB0byAxMCB0aW1lcyB1bnRpbCB3ZSBnZXQgYm90aCBpX3ByIGFuZCBxX3B3ciAqLwogCWZvciAoaSA9IDA7IGkgPD0gMTA7IGkrKykgewogCQlpcV9jb3JyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0lRUkVTX0NBTF9DT1JSKTsKIAkJaV9wd3IgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfSVFSRVNfQ0FMX1BXUl9JKTsKQEAgLTE1NzAsOSArMTgwNywxMyBAQAogCWVsc2UKIAkJcV9jb2ZmZCA9IHFfcHdyID4+IDc7CiAKLQkvKiBwcm90ZWN0IGFnYWluc3QgZGl2aWRlIGJ5IDAgYW5kIGxvc3Mgb2Ygc2lnbiBiaXRzICovCisJLyogSW4gY2FzZSBpX2NvZmZkIGJlY2FtZSB6ZXJvLCBjYW5jZWwgY2FsaWJyYXRpb24KKwkgKiBub3Qgb25seSBpdCdzIHRvbyBzbWFsbCwgaXQnbGwgYWxzbyByZXN1bHQgYSBkaXZpZGUKKwkgKiBieSB6ZXJvIGxhdGVyIG9uLiAqLwogCWlmIChpX2NvZmZkID09IDAgfHwgcV9jb2ZmZCA8IDIpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVDQU5DRUxFRDsKKworCS8qIFByb3RlY3QgYWdhaW5zdCBsb3NzIG9mIHNpZ24gYml0cyAqLwogCiAJaV9jb2ZmID0gKC1pcV9jb3JyKSAvIGlfY29mZmQ7CiAJaV9jb2ZmID0gY2xhbXAoaV9jb2ZmLCAtMzIsIDMxKTsgLyogc2lnbmVkIDYgYml0ICovCkBAIC0xNjAxLDEwICsxODQyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBQZXJmb3JtIGEgUEhZIGNhbGlicmF0aW9uCisvKioKKyAqIGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUoKSAtIFBlcmZvcm0gYSBQSFkgY2FsaWJyYXRpb24KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIFRoZSBtYWluIGZ1bmN0aW9uIHdlIGNhbGwgZnJvbSBhYm92ZSB0byBwZXJmb3JtCisgKiBhIHNob3J0IG9yIGZ1bGwgUEhZIGNhbGlicmF0aW9uIGJhc2VkIG9uIFJGIGNoaXAKKyAqIGFuZCBjdXJyZW50IGNoYW5uZWwKICAqLwotaW50IGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwKK2ludAorYXRoNWtfaHdfcGh5X2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJaW50IHJldDsKQEAgLTE2MTMsMTAgKzE4NjEsNDMgQEAKIAkJcmV0dXJuIGF0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoYWgsIGNoYW5uZWwpOwogCiAJcmV0ID0gYXRoNWtfaHdfcmY1MTF4X2lxX2NhbGlicmF0ZShhaCk7CisJaWYgKHJldCkgeworCQlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQ0FMSUJSQVRFLAorCQkJIk5vIEkvUSBjb3JyZWN0aW9uIHBlcmZvcm1lZCAoJXVNSHopXG4iLAorCQkJY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOwogCi0JaWYgKChhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTEgfHwgYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTEyKSAmJgotCSAgICAoY2hhbm5lbC0+aHdfdmFsdWUgIT0gQVI1S19NT0RFXzExQikpCi0JCWF0aDVrX2h3X3JlcXVlc3RfcmZnYWluX3Byb2JlKGFoKTsKKwkJLyogSGFwcGVucyBhbGwgdGhlIHRpbWUgaWYgdGhlcmUgaXMgbm90IG11Y2gKKwkJICogdHJhZmZpYywgY29uc2lkZXIgaXQgbm9ybWFsIGJlaGF2aW91ci4gKi8KKwkJcmV0ID0gMDsKKwl9CisKKwkvKiBPbiBmdWxsIGNhbGlicmF0aW9uIGRvIGFuIEFHQyBjYWxpYnJhdGlvbiBhbmQKKwkgKiByZXF1ZXN0IGEgUEFQRCBwcm9iZSBmb3IgZ2FpbmYgY2FsaWJyYXRpb24gaWYKKwkgKiBuZWVkZWQgKi8KKwlpZiAoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSB7CisKKwkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0FHQ0NUTCwKKwkJCQkJQVI1S19QSFlfQUdDQ1RMX0NBTCk7CisKKwkJcmV0ID0gYXRoNWtfaHdfcmVnaXN0ZXJfdGltZW91dChhaCwgQVI1S19QSFlfQUdDQ1RMLAorCQkJQVI1S19QSFlfQUdDQ1RMX0NBTCB8IEFSNUtfUEhZX0FHQ0NUTF9ORiwKKwkJCTAsIGZhbHNlKTsKKwkJaWYgKHJldCkgeworCQkJQVRINUtfRVJSKGFoLAorCQkJCSJnYWluIGNhbGlicmF0aW9uIHRpbWVvdXQgKCV1TUh6KVxuIiwKKwkJCQljaGFubmVsLT5jZW50ZXJfZnJlcSk7CisJCX0KKworCQlpZiAoKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMSB8fAorCQkJYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTEyKQorCQkJJiYgKGNoYW5uZWwtPmh3X3ZhbHVlICE9IEFSNUtfTU9ERV8xMUIpKQorCQkJYXRoNWtfaHdfcmVxdWVzdF9yZmdhaW5fcHJvYmUoYWgpOworCX0KKworCS8qIFVwZGF0ZSBub2lzZSBmbG9vcgorCSAqIFhYWDogT25seSBkbyB0aGlzIGFmdGVyIEFHQyBjYWxpYnJhdGlvbiAqLworCWlmICghKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fTkYpKQorCQlhdGg1a19od191cGRhdGVfbm9pc2VfZmxvb3IoYWgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MjYsNiArMTkwNywxNiBAQAogKiBTcHVyIG1pdGlnYXRpb24gZnVuY3Rpb25zICoKIFwqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qKgorICogYXRoNWtfaHdfc2V0X3NwdXJfbWl0aWdhdGlvbl9maWx0ZXIoKSAtIENvbmZpZ3VyZSBTUFVSIGZpbHRlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBkdXJpbmcgUEhZIGluaXRpYWxpemF0aW9uIHRvCisgKiBjb25maWd1cmUgdGhlIHNwdXIgZmlsdGVyIGZvciB0aGUgZ2l2ZW4gY2hhbm5lbC4gU3B1ciBpcyBub2lzZQorICogZ2VuZXJhdGVkIGR1ZSB0byAicmVmbGVjdGlvbiIgZWZmZWN0cywgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcworICogbWV0aG9kIGNoZWNrIG91dCBwYXRlbnQgVVM3NjQzODEwCisgKi8KIHN0YXRpYyB2b2lkCiBhdGg1a19od19zZXRfc3B1cl9taXRpZ2F0aW9uX2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKQEAgLTE4NjUsMTUgKzIxNTYsNzMgQEAKICogQW50ZW5uYSBjb250cm9sICoKIFwqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgLypUT0RPOkJvdW5kYXJ5IGNoZWNrKi8KKy8qKgorICogRE9DOiBBbnRlbm5hIGNvbnRyb2wKKyAqCisgKiBIdyBzdXBwb3J0cyB1cCB0byAxNCBhbnRlbm5hcyAhIEkgaGF2ZW4ndCBmb3VuZCBhbnkgY2FyZCB0aGF0IGltcGxlbWVudHMKKyAqIHRoYXQuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhbnRlbm5hcyBJJ3ZlIHNlZW4gaXMgdXAgdG8gNCAoMiBmb3IgMkdIeiBhbmQgMgorICogZm9yIDVHSHopLiBBbnRlbm5hIDEgKE1BSU4pIHNob3VsZCBiZSBvbW5pZGlyZWN0aW9uYWwsIDIgKEFVWCkKKyAqIG9tbmlkaXJlY3Rpb25hbCBvciBzZWN0b3JpYWwgYW5kIGFudGVubmFzIDMtMTQgc2VjdG9yaWFsIChvciBkaXJlY3Rpb25hbCkuCisgKgorICogV2UgY2FuIGhhdmUgYSBzaW5nbGUgYW50ZW5uYSBmb3IgUlggYW5kIG11bHRpcGxlIGFudGVubmFzIGZvciBUWC4KKyAqIFJYIGFudGVubmEgaXMgb3VyICJkZWZhdWx0IiBhbnRlbm5hICh1c3VhbGx5IGFudGVubmEgMSkgc2V0IG9uCisgKiBERUZBVUxUX0FOVEVOTkEgcmVnaXN0ZXIgYW5kIFRYIGFudGVubmEgaXMgc2V0IG9uIGVhY2ggVFggY29udHJvbCBkZXNjcmlwdG9yCisgKiAoMCBmb3IgYXV0b21hdGljIHNlbGVjdGlvbiwgMSAtIDE0IGFudGVubmEgbnVtYmVyKS4KKyAqCisgKiBXZSBjYW4gbGV0IGh3IGRvIGFsbCB0aGUgd29yayBkb2luZyBmYXN0IGFudGVubmEgZGl2ZXJzaXR5IGZvciBib3RoCisgKiB0eCBhbmQgcnggb3Igd2UgY2FuIGRvIHRoaW5ncyBtYW51YWxseS4gSGVyZSBhcmUgdGhlIG9wdGlvbnMgd2UgaGF2ZQorICogKGFsbCBhcmUgYml0cyBvZiBTVEFfSUQxIHJlZ2lzdGVyKToKKyAqCisgKiBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BIC0+IFdoZW4gMCBpcyBzZXQgYXMgdGhlIFRYIGFudGVubmEgb24gVFgKKyAqIGNvbnRyb2wgZGVzY3JpcHRvciwgdXNlIHRoZSBkZWZhdWx0IGFudGVubmEgdG8gdHJhbnNtaXQgb3IgZWxzZSB1c2UgdGhlIGxhc3QKKyAqIGFudGVubmEgb24gd2hpY2ggd2UgcmVjZWl2ZWQgYW4gQUNLLgorICoKKyAqIEFSNUtfU1RBX0lEMV9ERVNDX0FOVEVOTkEgLT4gVXBkYXRlIGRlZmF1bHQgYW50ZW5uYSBhZnRlciBlYWNoIFRYIGZyYW1lIHRvCisgKiB0aGUgYW50ZW5uYSBvbiB3aGljaCB3ZSBnb3QgdGhlIEFDSyBmb3IgdGhhdCBmcmFtZS4KKyAqCisgKiBBUjVLX1NUQV9JRDFfUlRTX0RFRl9BTlRFTk5BIC0+IFVzZSBkZWZhdWx0IGFudGVubmEgZm9yIFJUUyBvciBlbHNlIHVzZSB0aGUKKyAqIG9uZSBvbiB0aGUgVFggZGVzY3JpcHRvci4KKyAqCisgKiBBUjVLX1NUQV9JRDFfU0VMRkdFTl9ERUZfQU5UIC0+IFVzZSBkZWZhdWx0IGFudGVubmEgZm9yIHNlbGYgZ2VuZXJhdGVkIGZyYW1lcworICogKEFDS3MgZXRjKSwgb3IgZWxzZSB1c2UgY3VycmVudCBhbnRlbm5hICh0aGUgb25lIHdlIGp1c3QgdXNlZCBmb3IgVFgpLgorICoKKyAqIFVzaW5nIHRoZSBhYm92ZSB3ZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgc2NlbmFyaW9zOgorICoKKyAqIEFSNUtfQU5UTU9ERV9ERUZBVUxUIC0+IEh3IGhhbmRsZXMgYW50ZW5uYSBkaXZlcnNpdHkgZXRjIGF1dG9tYXRpY2FsbHkKKyAqCisgKiBBUjVLX0FOVE1PREVfRklYRURfQQktPiBPbmx5IGFudGVubmEgQSAoTUFJTikgaXMgcHJlc2VudAorICoKKyAqIEFSNUtfQU5UTU9ERV9GSVhFRF9CCS0+IE9ubHkgYW50ZW5uYSBCIChBVVgpIGlzIHByZXNlbnQKKyAqCisgKiBBUjVLX0FOVE1PREVfU0lOR0xFX0FQIC0+IFN0YSBsb2NrZWQgb24gYSBzaW5nbGUgYXAKKyAqCisgKiBBUjVLX0FOVE1PREVfU0VDVE9SX0FQIC0+IEFQIHdpdGggdHggYW50ZW5uYSBzZXQgb24gdHggZGVzYworICoKKyAqIEFSNUtfQU5UTU9ERV9TRUNUT1JfU1RBIC0+IFNUQSB3aXRoIHR4IGFudGVubmEgc2V0IG9uIHR4IGRlc2MKKyAqCisgKiBBUjVLX0FOVE1PREVfREVCVUcgRGVidWcgbW9kZSAtQSAtPiBSeCwgQi0+IFR4LQorICoKKyAqIEFsc28gbm90ZSB0aGF0IHdoZW4gc2V0dGluZyBhbnRlbm5hIHRvIEYgb24gdHggZGVzY3JpcHRvciBjYXJkIGludmVydHMKKyAqIGN1cnJlbnQgdHggYW50ZW5uYS4KKyAqLworCisvKioKKyAqIGF0aDVrX2h3X3NldF9kZWZfYW50ZW5uYSgpIC0gU2V0IGRlZmF1bHQgcnggYW50ZW5uYSBvbiBBUjUyMTEvNTIxMiBhbmQgbmV3ZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhbnQ6IEFudGVubmEgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCiBhdGg1a19od19zZXRfZGVmX2FudGVubmEoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggYW50KQogewogCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkKIAkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhbnQgJiAweDcsIEFSNUtfREVGQVVMVF9BTlRFTk5BKTsKIH0KIAotLyoKLSAqIEVuYWJsZS9kaXNhYmxlIGZhc3QgcnggYW50ZW5uYSBkaXZlcnNpdHkKKy8qKgorICogYXRoNWtfaHdfc2V0X2Zhc3RfZGl2KCkgLSAgRW5hYmxlL2Rpc2FibGUgZmFzdCByeCBhbnRlbm5hIGRpdmVyc2l0eQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGVlX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKiBAZW5hYmxlOiBUcnVlIHRvIGVuYWJsZSwgZmFsc2UgdG8gZGlzYWJsZQogICovCiBzdGF0aWMgdm9pZAogYXRoNWtfaHdfc2V0X2Zhc3RfZGl2KHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IGVlX21vZGUsIGJvb2wgZW5hYmxlKQpAQCAtMTkxMyw2ICsyMjYyLDE0IEBACiAJfQogfQogCisvKioKKyAqIGF0aDVrX2h3X3NldF9hbnRlbm5hX3N3aXRjaCgpIC0gU2V0IHVwIGFudGVubmEgc3dpdGNoIHRhYmxlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZWVfbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqCisgKiBTd2l0Y2ggdGFibGUgY29tZXMgZnJvbSBFRVBST00gYW5kIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIGNvbnRyb2xsaW5nCisgKiB0aGUgMiBhbnRlbm5hIFJYIGF0dGVudWF0b3JzCisgKi8KIHZvaWQKIGF0aDVrX2h3X3NldF9hbnRlbm5hX3N3aXRjaChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBlZV9tb2RlKQogewpAQCAtMTk0NCw4ICsyMzAxLDEwIEBACiAJCUFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEVfMSk7CiB9CiAKLS8qCi0gKiBTZXQgYW50ZW5uYSBvcGVyYXRpbmcgbW9kZQorLyoqCisgKiBhdGg1a19od19zZXRfYW50ZW5uYV9tb2RlKCkgLSAgU2V0IGFudGVubmEgb3BlcmF0aW5nIG1vZGUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhbnRfbW9kZTogT25lIG9mIGVudW0gYXRoNWtfYW50X21vZGUKICAqLwogdm9pZAogYXRoNWtfaHdfc2V0X2FudGVubmFfbW9kZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBhbnRfbW9kZSkKQEAgLTIwNjgsOCArMjQyNywxMyBAQAogICogSGVscGVyIGZ1bmN0aW9ucwogICovCiAKLS8qCi0gKiBEbyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBnaXZlbiAoeCwgeSkgcG9pbnRzCisvKioKKyAqIGF0aDVrX2dldF9pbnRlcnBvbGF0ZWRfdmFsdWUoKSAtIEdldCBpbnRlcnBvbGF0ZWQgWSB2YWwgYmV0d2VlbiB0d28gcG9pbnRzCisgKiBAdGFyZ2V0OiBYIHZhbHVlIG9mIHRoZSBtaWRkbGUgcG9pbnQKKyAqIEB4X2xlZnQ6IFggdmFsdWUgb2YgdGhlIGxlZnQgcG9pbnQKKyAqIEB4X3JpZ2h0OiBYIHZhbHVlIG9mIHRoZSByaWdodCBwb2ludAorICogQHlfbGVmdDogWSB2YWx1ZSBvZiB0aGUgbGVmdCBwb2ludAorICogQHlfcmlnaHQ6IFkgdmFsdWUgb2YgdGhlIHJpZ2h0IHBvaW50CiAgKi8KIHN0YXRpYyBzMTYKIGF0aDVrX2dldF9pbnRlcnBvbGF0ZWRfdmFsdWUoczE2IHRhcmdldCwgczE2IHhfbGVmdCwgczE2IHhfcmlnaHQsCkBAIC0yMDk2LDEzICsyNDYwLDE4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotLyoKLSAqIEZpbmQgdmVydGljYWwgYm91bmRhcnkgKG1pbiBwd3IpIGZvciB0aGUgbGluZWFyIFBDREFDIGN1cnZlLgorLyoqCisgKiBhdGg1a19nZXRfbGluZWFyX3BjZGFjX21pbigpIC0gRmluZCB2ZXJ0aWNhbCBib3VuZGFyeSAobWluIHB3cikgZm9yIHRoZQorICogbGluZWFyIFBDREFDIGN1cnZlCisgKiBAc3RlcEw6IExlZnQgYXJyYXkgd2l0aCB5IHZhbHVlcyAocGNkYWMgc3RlcHMpCisgKiBAc3RlcFI6IFJpZ2h0IGFycmF5IHdpdGggeSB2YWx1ZXMgKHBjZGFjIHN0ZXBzKQorICogQHB3ckw6IExlZnQgYXJyYXkgd2l0aCB4IHZhbHVlcyAocG93ZXIgc3RlcHMpCisgKiBAcHdyUjogUmlnaHQgYXJyYXkgd2l0aCB4IHZhbHVlcyAocG93ZXIgc3RlcHMpCiAgKgogICogU2luY2Ugd2UgaGF2ZSB0aGUgdG9wIG9mIHRoZSBjdXJ2ZSBhbmQgd2UgZHJhdyB0aGUgbGluZSBiZWxvdwogICogdW50aWwgd2UgcmVhY2ggMSAoMSBwY2RhYyBzdGVwKSB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggcG9pbnQKLSAqICh4IHZhbHVlKSB0aGF0IGlzIHNvIHRoYXQgd2UgZG9uJ3QgZ28gYmVsb3cgeSBheGlzIGFuZCBoYXZlIG5lZ2F0aXZlCi0gKiBwY2RhYyB2YWx1ZXMgd2hlbiBjcmVhdGluZyB0aGUgY3VydmUsIG9yIGZpbGwgdGhlIHRhYmxlIHdpdGggemVyb2VzLgorICogKHggdmFsdWUpIHRoYXQgaXMgc28gdGhhdCB3ZSBkb24ndCBnbyBiZWxvdyB4IGF4aXMgYW5kIGhhdmUgbmVnYXRpdmUKKyAqIHBjZGFjIHZhbHVlcyB3aGVuIGNyZWF0aW5nIHRoZSBjdXJ2ZSwgb3IgZmlsbCB0aGUgdGFibGUgd2l0aCB6ZXJvcy4KICAqLwogc3RhdGljIHMxNgogYXRoNWtfZ2V0X2xpbmVhcl9wY2RhY19taW4oY29uc3QgdTggKnN0ZXBMLCBjb25zdCB1OCAqc3RlcFIsCkBAIC0yMTQ4LDcgKzI1MTcsMTYgQEAKIAlyZXR1cm4gbWF4KG1pbl9wd3JMLCBtaW5fcHdyUik7CiB9CiAKLS8qCisvKioKKyAqIGF0aDVrX2NyZWF0ZV9wb3dlcl9jdXJ2ZSgpIC0gQ3JlYXRlIGEgUG93ZXIgdG8gUERBREMgb3IgUENEQUMgY3VydmUKKyAqIEBwbWluOiBNaW5pbXVtIHBvd2VyIHZhbHVlICh4bWluKQorICogQHBtYXg6IE1heGltdW0gcG93ZXIgdmFsdWUgKHhtYXgpCisgKiBAcHdyOiBBcnJheSBvZiBwb3dlciBzdGVwcyAoeCB2YWx1ZXMpCisgKiBAdnBkOiBBcnJheSBvZiBtYXRjaGluZyBQQ0RBQy9QREFEQyBzdGVwcyAoeSB2YWx1ZXMpCisgKiBAbnVtX3BvaW50czogTnVtYmVyIG9mIHByb3ZpZGVkIHBvaW50cworICogQHZwZF90YWJsZTogQXJyYXkgdG8gZmlsbCB3aXRoIHRoZSBmdWxsIFBDREFDL1BEQURDIHZhbHVlcyAoeSB2YWx1ZXMpCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcG93ZXJ0YWJsZV90eXBlIChlZXByb20uaCkKKyAqCiAgKiBJbnRlcnBvbGF0ZSAocHdyLHZwZCkgcG9pbnRzIHRvIGNyZWF0ZSBhIFBvd2VyIHRvIFBEQURDIG9yIGEKICAqIFBvd2VyIHRvIFBDREFDIGN1cnZlLgogICoKQEAgLTIyMDYsNyArMjU4NCwxNCBAQAogCX0KIH0KIAotLyoKKy8qKgorICogYXRoNWtfZ2V0X2NoYW5fcGNhbF9zdXJyb3VuZGluZ19waWVycygpIC0gR2V0IHN1cnJvdW5kaW5nIGNhbGlicmF0aW9uIHBpZXJzCisgKiBmb3IgYSBnaXZlbiBjaGFubmVsLgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAcGNpbmZvX2w6IFRoZSAmc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvIHRvIHB1dCB0aGUgbGVmdCBjYWwuIHBpZXIKKyAqIEBwY2luZm9fcjogVGhlICZzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8gdG8gcHV0IHRoZSByaWdodCBjYWwuIHBpZXIKKyAqCiAgKiBHZXQgdGhlIHN1cnJvdW5kaW5nIHBlci1jaGFubmVsIHBvd2VyIGNhbGlicmF0aW9uIHBpZXJzCiAgKiBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgc28gdGhhdCB3ZSBjYW4gaW50ZXJwb2xhdGUgYmV0d2VlbgogICogdGhlbSBhbmQgY29tZSB1cCB3aXRoIGFuIGFwcHJvcHJpYXRlIGRhdGFzZXQgZm9yIG91ciBjdXJyZW50CkBAIC0yMjg5LDExICsyNjc0LDE3IEBACiAJKnBjaW5mb19yID0gJnBjaW5mb1tpZHhfcl07CiB9CiAKLS8qCisvKioKKyAqIGF0aDVrX2dldF9yYXRlX3BjYWxfZGF0YSgpIC0gR2V0IHRoZSBpbnRlcnBvbGF0ZWQgcGVyLXJhdGUgcG93ZXIKKyAqIGNhbGlicmF0aW9uIGRhdGEKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAcmF0ZXM6IFRoZSAmc3RydWN0IGF0aDVrX3JhdGVfcGNhbF9pbmZvIHRvIGZpbGwKKyAqCiAgKiBHZXQgdGhlIHN1cnJvdW5kaW5nIHBlci1yYXRlIHBvd2VyIGNhbGlicmF0aW9uIGRhdGEKICAqIGZvciBhIGdpdmVuIGZyZXF1ZW5jeSBhbmQgaW50ZXJwb2xhdGUgYmV0d2VlbiBwb3dlcgogICogdmFsdWVzIHRvIHNldCBtYXggdGFyZ2V0IHBvd2VyIHN1cHBvcnRlZCBieSBodyBmb3IKLSAqIGVhY2ggcmF0ZS4KKyAqIGVhY2ggcmF0ZSBvbiB0aGlzIGZyZXF1ZW5jeS4KICAqLwogc3RhdGljIHZvaWQKIGF0aDVrX2dldF9yYXRlX3BjYWxfZGF0YShzdHJ1Y3QgYXRoNWtfaHcgKmFoLApAQCAtMjM4MSw3ICsyNzcyLDExIEBACiAJCQkJCXJwaW5mb1tpZHhfcl0udGFyZ2V0X3Bvd2VyXzU0KTsKIH0KIAotLyoKKy8qKgorICogYXRoNWtfZ2V0X21heF9jdGxfcG93ZXIoKSAtIEdldCBtYXggZWRnZSBwb3dlciBmb3IgYSBnaXZlbiBmcmVxdWVuY3kKKyAqIEBhaDogdGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKICAqIEdldCB0aGUgbWF4IGVkZ2UgcG93ZXIgZm9yIHRoaXMgY2hhbm5lbCBpZgogICogd2UgaGF2ZSBzdWNoIGRhdGEgZnJvbSBFRVBST00ncyBDb25mb3JtYW5jZSBUZXN0CiAgKiBMaW1pdHMgKENUTCksIGFuZCBsaW1pdCBtYXggcG93ZXIgaWYgbmVlZGVkLgpAQCAtMjQ2MSw4ICsyODU2LDM5IEBACiAgKiBQb3dlciB0byBQQ0RBQyB0YWJsZSBmdW5jdGlvbnMKICAqLwogCi0vKgotICogRmlsbCBQb3dlciB0byBQQ0RBQyB0YWJsZSBvbiBSRjUxMTEKKy8qKgorICogRE9DOiBQb3dlciB0byBQQ0RBQyB0YWJsZSBmdW5jdGlvbnMKKyAqCisgKiBGb3IgUkY1MTExIHdlIGhhdmUgYW4gWFBEIC1lWHRlcm5hbCBQb3dlciBEZXRlY3Rvci0gY3VydmUKKyAqIGZvciBlYWNoIGNhbGlicmF0ZWQgY2hhbm5lbC4gRWFjaCBjdXJ2ZSBoYXMgMCw1ZEIgUG93ZXIgc3RlcHMKKyAqIG9uIHggYXhpcyBhbmQgUENEQUMgc3RlcHMgKG9mZnNldHMpIG9uIHkgYXhpcyBhbmQgbG9va3MgbGlrZSBhbgorICogZXhwb25lbnRpYWwgZnVuY3Rpb24uIFRvIHJlY3JlYXRlIHRoZSBjdXJ2ZSB3ZSByZWFkIDExIHBvaW50cworICogZnJvbSBlZXByb20gKGVlcHJvbS5jKSBhbmQgaW50ZXJwb2xhdGUgaGVyZS4KKyAqCisgKiBGb3IgUkY1MTEyIHdlIGhhdmUgNCBYUEQgLWVYdGVybmFsIFBvd2VyIERldGVjdG9yLSBjdXJ2ZXMKKyAqIGZvciBlYWNoIGNhbGlicmF0ZWQgY2hhbm5lbCBvbiAwLCAtNiwgLTEyIGFuZCAtMThkQm0gYnV0IHdlIG9ubHkKKyAqIHVzZSB0aGUgaGlnaGVyICgzKSBhbmQgdGhlIGxvd2VyICgwKSBjdXJ2ZXMuIEVhY2ggY3VydmUgYWdhaW4gaGFzIDAuNWRCCisgKiBwb3dlciBzdGVwcyBvbiB4IGF4aXMgYW5kIFBDREFDIHN0ZXBzIG9uIHkgYXhpcyBhbmQgbG9va3MgbGlrZSBhCisgKiBsaW5lYXIgZnVuY3Rpb24uIFRvIHJlY3JlYXRlIHRoZSBjdXJ2ZSBhbmQgcGFzcyB0aGUgcG93ZXIgdmFsdWVzCisgKiBvbiBodywgd2UgZ2V0IDQgcG9pbnRzIGZvciB4cGQgMCAobG93ZXIgZ2FpbiAtPiBtYXggcG93ZXIpCisgKiBhbmQgMyBwb2ludHMgZm9yIHhwZCAzIChoaWdoZXIgZ2FpbiAtPiBsb3dlciBwb3dlcikgZnJvbSBlZXByb20gKGVlcHJvbS5jKQorICogYW5kIGludGVycG9sYXRlIGhlcmUuCisgKgorICogRm9yIGEgZ2l2ZW4gY2hhbm5lbCB3ZSBnZXQgdGhlIGNhbGlicmF0ZWQgcG9pbnRzIChwaWVycykgZm9yIGl0IG9yCisgKiAtaWYgd2UgZG9uJ3QgaGF2ZSBjYWxpYnJhdGlvbiBkYXRhIGZvciB0aGlzIHNwZWNpZmljIGNoYW5uZWwtIGZyb20gdGhlCisgKiBhdmFpbGFibGUgc3Vycm91bmRpbmcgY2hhbm5lbHMgd2UgaGF2ZSBjYWxpYnJhdGlvbiBkYXRhIGZvciwgYWZ0ZXIgd2UgZG8gYQorICogbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGVtLiBUaGVuIHNpbmNlIHdlIGhhdmUgb3VyIGNhbGlicmF0ZWQgcG9pbnRzCisgKiBmb3IgdGhpcyBjaGFubmVsLCB3ZSBkbyBhZ2FpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlbSB0byBnZXQgdGhlCisgKiB3aG9sZSBjdXJ2ZS4KKyAqCisgKiBXZSBmaW5hbGx5IHdyaXRlIHRoZSBZIHZhbHVlcyBvZiB0aGUgY3VydmUocykgKHRoZSBQQ0RBQyB2YWx1ZXMpIG9uIGh3CisgKi8KKworLyoqCisgKiBhdGg1a19maWxsX3B3cl90b19wY2RhY190YWJsZSgpIC0gRmlsbCBQb3dlciB0byBQQ0RBQyB0YWJsZSBvbiBSRjUxMTEKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEB0YWJsZV9taW46IE1pbmltdW0gcG93ZXIgKHggbWluKQorICogQHRhYmxlX21heDogTWF4aW11bSBwb3dlciAoeCBtYXgpCiAgKgogICogTm8gZnVydGhlciBwcm9jZXNzaW5nIGlzIG5lZWRlZCBmb3IgUkY1MTExLCB0aGUgb25seSB0aGluZyB3ZSBoYXZlIHRvCiAgKiBkbyBpcyBmaWxsIHRoZSB2YWx1ZXMgYmVsb3cgYW5kIGFib3ZlIGNhbGlicmF0aW9uIHJhbmdlIHNpbmNlIGVlcHJvbSBkYXRhCkBAIC0yNTAzLDEwICsyOTI5LDE0IEBACiAKIH0KIAotLyoKLSAqIENvbWJpbmUgYXZhaWxhYmxlIFhQRCBDdXJ2ZXMgYW5kIGZpbGwgTGluZWFyIFBvd2VyIHRvIFBDREFDIHRhYmxlCi0gKiBvbiBSRjUxMTIKKy8qKgorICogYXRoNWtfY29tYmluZV9saW5lYXJfcGNkYWNfY3VydmVzKCkgLSBDb21iaW5lIGF2YWlsYWJsZSBQQ0RBQyBDdXJ2ZXMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEB0YWJsZV9taW46IE1pbmltdW0gcG93ZXIgKHggbWluKQorICogQHRhYmxlX21heDogTWF4aW11bSBwb3dlciAoeCBtYXgpCisgKiBAcGRjdXJ2ZXM6IE51bWJlciBvZiBwZCBjdXJ2ZXMKICAqCisgKiBDb21iaW5lIGF2YWlsYWJsZSBYUEQgQ3VydmVzIGFuZCBmaWxsIExpbmVhciBQb3dlciB0byBQQ0RBQyB0YWJsZSBvbiBSRjUxMTIKICAqIFJGWDExMiBjYW4gaGF2ZSB1cCB0byAyIGN1cnZlcyAob25lIGZvciBsb3cgdHhwb3dlciByYW5nZSBhbmQgb25lIGZvcgogICogaGlnaGVyIHR4cG93ZXIgcmFuZ2UpLiBXZSBuZWVkIHRvIHB1dCB0aGVtIGJvdGggb24gcGNkYWNfb3V0IGFuZCBwbGFjZQogICogdGhlbSBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4gSW4gY2FzZSB3ZSBvbmx5IGhhdmUgb25lIGN1cnZlIGF2YWlsYWJsZQpAQCAtMjYwOCw3ICszMDM4LDEwIEBACiAJfQogfQogCi0vKiBXcml0ZSBQQ0RBQyB2YWx1ZXMgb24gaHcgKi8KKy8qKgorICogYXRoNWtfd3JpdGVfcGNkYWNfdGFibGUoKSAtIFdyaXRlIHRoZSBQQ0RBQyB2YWx1ZXMgb24gaHcKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqLwogc3RhdGljIHZvaWQKIGF0aDVrX3dyaXRlX3BjZGFjX3RhYmxlKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CkBAIC0yNjMxLDkgKzMwNjQsMzIgQEAKICAqIFBvd2VyIHRvIFBEQURDIHRhYmxlIGZ1bmN0aW9ucwogICovCiAKLS8qCi0gKiBTZXQgdGhlIGdhaW4gYm91bmRhcmllcyBhbmQgY3JlYXRlIGZpbmFsIFBvd2VyIHRvIFBEQURDIHRhYmxlCisvKioKKyAqIERPQzogUG93ZXIgdG8gUERBREMgdGFibGUgZnVuY3Rpb25zCiAgKgorICogRm9yIFJGMjQxMyBhbmQgbGF0ZXIgd2UgaGF2ZSBhIFBvd2VyIHRvIFBEQURDIHRhYmxlIChQb3dlciBEZXRlY3RvcikKKyAqIGluc3RlYWQgb2YgYSBQQ0RBQyAoUG93ZXIgQ29udHJvbCkgYW5kIDQgcGQgZ2FpbiBjdXJ2ZXMgZm9yIGVhY2gKKyAqIGNhbGlicmF0ZWQgY2hhbm5lbC4gRWFjaCBjdXJ2ZSBoYXMgcG93ZXIgb24geCBheGlzIGluIDAuNSBkYiBzdGVwcyBhbmQKKyAqIFBEQURDIHN0ZXBzIG9uIHkgYXhpcyBhbmQgbG9va3MgbGlrZSBhbiBleHBvbmVudGlhbCBmdW5jdGlvbiBsaWtlIHRoZQorICogUkY1MTExIGN1cnZlLgorICoKKyAqIFRvIHJlY3JlYXRlIHRoZSBjdXJ2ZXMgd2UgcmVhZCB0aGUgcG9pbnRzIGZyb20gZWVwcm9tIChlZXByb20uYykKKyAqIGFuZCBpbnRlcnBvbGF0ZSBoZXJlLiBOb3RlIHRoYXQgaW4gbW9zdCBjYXNlcyBvbmx5IDIgKGhpZ2hlciBhbmQgbG93ZXIpCisgKiBjdXJ2ZXMgYXJlIHVzZWQgKGxpa2UgUkY1MTEyKSBidXQgdmVuZG9ycyBoYXZlIHRoZSBvcHBvcnR1bml0eSB0byBpbmNsdWRlCisgKiBhbGwgNCBjdXJ2ZXMgb24gZWVwcm9tLiBUaGUgZmluYWwgY3VydmUgKGhpZ2hlciBwb3dlcikgaGFzIGFuIGV4dHJhCisgKiBwb2ludCBmb3IgYmV0dGVyIGFjY3VyYWN5IGxpa2UgUkY1MTEyLgorICoKKyAqIFRoZSBwcm9jZXNzIGlzIHNpbWlsYXIgdG8gd2hhdCB3ZSBkbyBhYm92ZSBmb3IgUkY1MTExLzUxMTIKKyAqLworCisvKioKKyAqIGF0aDVrX2NvbWJpbmVfcHdyX3RvX3BkYWRjX2N1cnZlcygpIC0gQ29tYmluZSB0aGUgdmFyaW91cyBQREFEQyBjdXJ2ZXMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBwd3JfbWluOiBNaW5pbXVtIHBvd2VyICh4IG1pbikKKyAqIEBwd3JfbWF4OiBNYXhpbXVtIHBvd2VyICh4IG1heCkKKyAqIEBwZGN1cnZlczogTnVtYmVyIG9mIGF2YWlsYWJsZSBjdXJ2ZXMKKyAqCisgKiBDb21iaW5lIHRoZSB2YXJpb3VzIHBkIGN1cnZlcyBhbmQgY3JlYXRlIHRoZSBmaW5hbCBQb3dlciB0byBQREFEQyB0YWJsZQogICogV2UgY2FuIGhhdmUgdXAgdG8gNCBwZCBjdXJ2ZXMsIHdlIG5lZWQgdG8gZG8gYSBzaW1pbGFyIHByb2Nlc3MKICAqIGFzIHdlIGRvIGZvciBSRjUxMTIuIFRoaXMgdGltZSB3ZSBkb24ndCBoYXZlIGFuIGVkZ2VfZmxhZyBidXQgd2UKICAqIHNldCB0aGUgZ2FpbiBib3VuZGFyaWVzIG9uIGEgc2VwYXJhdGUgcmVnaXN0ZXIuCkBAIC0yNzU3LDcgKzMyMTMsMTEgQEAKIAogfQogCi0vKiBXcml0ZSBQREFEQyB2YWx1ZXMgb24gaHcgKi8KKy8qKgorICogYXRoNWtfd3JpdGVfcHdyX3RvX3BkYWRjX3RhYmxlKCkgLSBXcml0ZSB0aGUgUERBREMgdmFsdWVzIG9uIGh3CisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZWVfbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqLwogc3RhdGljIHZvaWQKIGF0aDVrX3dyaXRlX3B3cl90b19wZGFkY190YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBlZV9tb2RlKQogewpAQCAtMjgxNCw3ICszMjc0LDEzIEBACiAgKiBDb21tb24gY29kZSBmb3IgUENEQUMvUERBREMgdGFibGVzCiAgKi8KIAotLyoKKy8qKgorICogYXRoNWtfc2V0dXBfY2hhbm5lbF9wb3dlcnRhYmxlKCkgLSBTZXQgdXAgcG93ZXIgdGFibGUgZm9yIHRoaXMgY2hhbm5lbAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAZWVfbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqIEB0eXBlOiBPbmUgb2YgZW51bSBhdGg1a19wb3dlcnRhYmxlX3R5cGUgKGVlcHJvbS5oKQorICoKICAqIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdGhhdCB1c2VzIGFsbCBvZiB0aGUgYWJvdmUKICAqIHRvIHNldCBQQ0RBQy9QREFEQyB0YWJsZSBvbiBodyBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbC4KICAqIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgdHggcG93ZXIgY2FsaWJyYXRpb24gb24gdGhlIGJhc2ViYW5kLApAQCAtMzAxMiw3ICszNDc4LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFdyaXRlIHBvd2VyIHRhYmxlIGZvciBjdXJyZW50IGNoYW5uZWwgdG8gaHcgKi8KKy8qKgorICogYXRoNWtfd3JpdGVfY2hhbm5lbF9wb3dlcnRhYmxlKCkgLSBTZXQgcG93ZXIgdGFibGUgZm9yIGN1cnJlbnQgY2hhbm5lbCBvbiBodworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGVlX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcG93ZXJ0YWJsZV90eXBlIChlZXByb20uaCkKKyAqLwogc3RhdGljIHZvaWQKIGF0aDVrX3dyaXRlX2NoYW5uZWxfcG93ZXJ0YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBlZV9tb2RlLCB1OCB0eXBlKQogewpAQCAtMzAyMiwyOCArMzQ5MywzNiBAQAogCQlhdGg1a193cml0ZV9wY2RhY190YWJsZShhaCk7CiB9CiAKLS8qCi0gKiBQZXItcmF0ZSB0eCBwb3dlciBzZXR0aW5nCi0gKgotICogVGhpcyBpcyB0aGUgY29kZSB0aGF0IHNldHMgdGhlIGRlc2lyZWQgdHggcG93ZXIgKGJlbG93Ci0gKiBtYXhpbXVtKSBvbiBodyBmb3IgZWFjaCByYXRlICh3ZSBhbHNvIGhhdmUgVFBDIHRoYXQgc2V0cwotICogcG93ZXIgcGVyIHBhY2tldCkuIFdlIGRvIHRoYXQgYnkgcHJvdmlkaW5nIGFuIGluZGV4IG9uIHRoZQotICogUENEQUMvUERBREMgdGFibGUgd2Ugc2V0IHVwLgotICovCiAKLS8qCi0gKiBTZXQgcmF0ZSBwb3dlciB0YWJsZQorLyoqCisgKiBET0M6IFBlci1yYXRlIHR4IHBvd2VyIHNldHRpbmcKKyAqCisgKiBUaGlzIGlzIHRoZSBjb2RlIHRoYXQgc2V0cyB0aGUgZGVzaXJlZCB0eCBwb3dlciBsaW1pdCAoYmVsb3cKKyAqIG1heGltdW0pIG9uIGh3IGZvciBlYWNoIHJhdGUgKHdlIGFsc28gaGF2ZSBUUEMgdGhhdCBzZXRzCisgKiBwb3dlciBwZXIgcGFja2V0IHR5cGUpLiBXZSBkbyB0aGF0IGJ5IHByb3ZpZGluZyBhbiBpbmRleCBvbiB0aGUKKyAqIFBDREFDL1BEQURDIHRhYmxlIHdlIHNldCB1cCBhYm92ZSwgZm9yIGVhY2ggcmF0ZS4KICAqCiAgKiBGb3Igbm93IHdlIG9ubHkgbGltaXQgdHhwb3dlciBiYXNlZCBvbiBtYXhpbXVtIHR4IHBvd2VyCi0gKiBzdXBwb3J0ZWQgYnkgaHcgKHdoYXQncyBpbnNpZGUgcmF0ZV9pbmZvKS4gV2UgbmVlZCB0byBsaW1pdAotICogdGhpcyBldmVuIG1vcmUsIGJhc2VkIG9uIHJlZ3VsYXRvcnkgZG9tYWluIGV0Yy4KKyAqIHN1cHBvcnRlZCBieSBodyAod2hhdCdzIGluc2lkZSByYXRlX2luZm8pICsgY29uZm9ybWFuY2UgdGVzdAorICogbGltaXRzLiBXZSBuZWVkIHRvIGxpbWl0IHRoaXMgZXZlbiBtb3JlLCBiYXNlZCBvbiByZWd1bGF0b3J5IGRvbWFpbgorICogZXRjIHRvIGJlIHNhZmUuIE5vcm1hbGx5IHRoaXMgaXMgZG9uZSBmcm9tIGFib3ZlIHNvIHdlIGRvbid0IGNhcmUKKyAqIGhlcmUsIGFsbCB3ZSBjYXJlIGlzIHRoYXQgdGhlIHR4IHBvd2VyIHdlIHNldCB3aWxsIGJlIE8uSy4KKyAqIGZvciB0aGUgaHcgKGUuZy4gd29uJ3QgY3JlYXRlIG5vaXNlIG9uIFBBIGV0YykuCiAgKgotICogUmF0ZSBwb3dlciB0YWJsZSBjb250YWlucyBpbmRpY2VzIHRvIFBDREFDL1BEQURDIHRhYmxlICgwLjVkQiBzdGVwcykKLSAqIGFuZCBpcyBpbmRleGVkIGFzIGZvbGxvd3M6CisgKiBSYXRlIHBvd2VyIHRhYmxlIGNvbnRhaW5zIGluZGljZXMgdG8gUENEQUMvUERBREMgdGFibGUgKDAuNWRCIHN0ZXBzIC0KKyAqIHggdmFsdWVzKSBhbmQgaXMgaW5kZXhlZCBhcyBmb2xsb3dzOgogICogcmF0ZXNbMF0gLSByYXRlc1s3XSAtPiBPRkRNIHJhdGVzCiAgKiByYXRlc1s4XSAtIHJhdGVzWzE0XSAtPiBDQ0sgcmF0ZXMKICAqIHJhdGVzWzE1XSAtPiBYUiByYXRlcyAodGhleSBhbGwgaGF2ZSB0aGUgc2FtZSBwb3dlcikKICAqLworCisvKioKKyAqIGF0aDVrX3NldHVwX3JhdGVfcG93ZXJ0YWJsZSgpIC0gU2V0IHVwIHJhdGUgcG93ZXIgdGFibGUgZm9yIGEgZ2l2ZW4gdHggcG93ZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBtYXhfcHdyOiBUaGUgbWF4aW11bSB0eCBwb3dlciByZXF1ZXN0ZWQgaW4gMC41ZEIgc3RlcHMKKyAqIEByYXRlX2luZm86IFRoZSAmc3RydWN0IGF0aDVrX3JhdGVfcGNhbF9pbmZvIHRvIGZpbGwKKyAqIEBlZV9tb2RlOiBPbmUgb2YgZW51bSBhdGg1a19kcml2ZXJfbW9kZQorICovCiBzdGF0aWMgdm9pZAogYXRoNWtfc2V0dXBfcmF0ZV9wb3dlcnRhYmxlKHN0cnVjdCBhdGg1a19odyAqYWgsIHUxNiBtYXhfcHdyLAogCQkJc3RydWN0IGF0aDVrX3JhdGVfcGNhbF9pbmZvICpyYXRlX2luZm8sCkBAIC0zMTE0LDggKzM1OTMsMTQgQEAKIH0KIAogCi0vKgotICogU2V0IHRyYW5zbWlzc2lvbiBwb3dlcgorLyoqCisgKiBhdGg1a19od190eHBvd2VyKCkgLSBTZXQgdHJhbnNtaXNzaW9uIHBvd2VyIGxpbWl0IGZvciBhIGdpdmVuIGNoYW5uZWwKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICogQHR4cG93ZXI6IFJlcXVlc3RlZCB0eCBwb3dlciBpbiAwLjVkQiBzdGVwcworICoKKyAqIENvbWJpbmVzIGFsbCBvZiB0aGUgYWJvdmUgdG8gc2V0IHRoZSByZXF1ZXN0ZWQgdHggcG93ZXIgbGltaXQKKyAqIG9uIGh3LgogICovCiBzdGF0aWMgaW50CiBhdGg1a19od190eHBvd2VyKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKQEAgLTMyMzMsNyArMzcxOCwxNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggdHhwb3dlcikKKy8qKgorICogYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoKSAtIFNldCB0eHBvd2VyIGxpbWl0IGZvciB0aGUgY3VycmVudCBjaGFubmVsCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAdHhwb3dlcjogVGhlIHJlcXVlc3RlZCB0eCBwb3dlciBsaW1pdCBpbiAwLjVkQiBzdGVwcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYWNjZXNzIHRvIGF0aDVrX2h3X3R4cG93ZXIgdG8gdGhlIGRyaXZlciBpbgorICogY2FzZSB1c2VyIG9yIGFuIGFwcGxpY2F0aW9uIGNoYW5nZXMgaXQgd2hpbGUgUEhZIGlzIHJ1bm5pbmcuCisgKi8KK2ludAorYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggdHhwb3dlcikKIHsKIAlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1RYUE9XRVIsCiAJCSJjaGFuZ2luZyB0eHBvd2VyIHRvICVkXG4iLCB0eHBvd2VyKTsKQEAgLTMyNDEsMTEgKzM3MzUsMjYgQEAKIAlyZXR1cm4gYXRoNWtfaHdfdHhwb3dlcihhaCwgYWgtPmFoX2N1cnJlbnRfY2hhbm5lbCwgdHhwb3dlcik7CiB9CiAKKwogLyoqKioqKioqKioqKipcCiAgSW5pdCBmdW5jdGlvbgogXCoqKioqKioqKioqKiovCiAKLWludCBhdGg1a19od19waHlfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCisvKioKKyAqIGF0aDVrX2h3X3BoeV9pbml0KCkgLSBJbml0aWFsaXplIFBIWQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSBAc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqIEBmYXN0OiBUcnkgYSBmYXN0IGNoYW5uZWwgc3dpdGNoIGluc3RlYWQKKyAqCisgKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHVzZWQgZHVyaW5nIHJlc2V0IHRvIGluaXRpYWxpemUgUEhZCisgKiBvciBkbyBhIGZhc3QgY2hhbm5lbCBjaGFuZ2UgaWYgcG9zc2libGUuCisgKgorICogTk9URTogRG8gbm90IGNhbGwgdGhpcyBvbmUgZnJvbSB0aGUgZHJpdmVyLCBpdCBhc3N1bWVzIFBIWSBpcyBpbiBhCisgKiB3YXJtIHJlc2V0IHN0YXRlICEKKyAqLworaW50CithdGg1a19od19waHlfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCiAJCSAgICAgIHU4IG1vZGUsIGJvb2wgZmFzdCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmN1cnJfY2hhbm5lbDsKQEAgLTMzNTUsNyArMzg2NCw3IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCW1kZWxheSgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCiAJCS8qCiAJCSAqIFdyaXRlIFJGIGJ1ZmZlcgpAQCAtMzM3NiwxMCArMzg4NSwxMCBAQAogCQl9CiAKIAl9IGVsc2UgaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCW1kZWxheSgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCQkvKiBEaXNhYmxlIHBoeSBhbmQgd2FpdCAqLwogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX0FDVF9ESVNBQkxFLCBBUjVLX1BIWV9BQ1QpOwotCQltZGVsYXkoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKIAl9CiAKIAkvKiBTZXQgY2hhbm5lbCBvbiBQSFkgKi8KQEAgLTM0MDUsNyArMzkxNCw3IEBACiAJZm9yIChpID0gMDsgaSA8PSAyMDsgaSsrKSB7CiAJCWlmICghKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9BRENfVEVTVCkgJiAweDEwKSkKIAkJCWJyZWFrOwotCQl1ZGVsYXkoMjAwKTsKKwkJdXNsZWVwX3JhbmdlKDIwMCwgMjUwKTsKIAl9CiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBwaHlfdHN0MSwgQVI1S19QSFlfVFNUMSk7CiAKQEAgLTM0MzMsOSArMzk0Miw5IEBACiAKIAkvKiBBdCB0aGUgc2FtZSB0aW1lIHN0YXJ0IEkvUSBjYWxpYnJhdGlvbiBmb3IgUUFNIGNvbnN0ZWxsYXRpb24KIAkgKiAtbm8gbmVlZCBmb3IgQ0NLLSAqLwotCWFoLT5haF9jYWxpYnJhdGlvbiA9IGZhbHNlOworCWFoLT5haF9pcV9jYWxfbmVlZGVkID0gZmFsc2U7CiAJaWYgKCEobW9kZSA9PSBBUjVLX01PREVfMTFCKSkgewotCQlhaC0+YWhfY2FsaWJyYXRpb24gPSB0cnVlOworCQlhaC0+YWhfaXFfY2FsX25lZWRlZCA9IHRydWU7CiAJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX0lRLAogCQkJCUFSNUtfUEhZX0lRX0NBTF9OVU1fTE9HX01BWCwgMTUpOwogCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfSVEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcWN1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcWN1LmMKaW5kZXggNzc2NjU0Mi4uMzBiNTBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3FjdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9xY3UuYwpAQCAtMTcsMjMgKzE3LDQ4IEBACiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotUXVldWUgQ29udHJvbCBVbml0LCBERlMgQ29udHJvbCBVbml0IEZ1bmN0aW9ucworUXVldWUgQ29udHJvbCBVbml0LCBEQ0YgQ29udHJvbCBVbml0IEZ1bmN0aW9ucwogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYXRoNWsuaCIKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKworLyoqCisgKiBET0M6IFF1ZXVlIENvbnRyb2wgVW5pdCAoUUNVKS9EQ0YgQ29udHJvbCBVbml0IChEQ1UpIGZ1bmN0aW9ucworICoKKyAqIEhlcmUgd2Ugc2V0dXAgcGFyYW1ldGVycyBmb3IgdGhlIDEyIGF2YWlsYWJsZSBUWCBxdWV1ZXMuIE5vdGUgdGhhdAorICogb24gdGhlIHZhcmlvdXMgcmVnaXN0ZXJzIHdlIGNhbiB1c3VhbGx5IG9ubHkgbWFwIHRoZSBmaXJzdCAxMCBvZiB0aGVtIHNvCisgKiBiYXNpY2FsbHkgd2UgaGF2ZSAxMCBxdWV1ZXMgdG8gcGxheSB3aXRoLiBFYWNoIHF1ZXVlIGhhcyBhIG1hdGNoaW5nCisgKiBRQ1UgdGhhdCBjb250cm9scyB3aGVuIHRoZSBxdWV1ZSB3aWxsIGdldCB0cmlnZ2VyZWQgYW5kIG11bHRpcGxlIFFDVXMKKyAqIGNhbiBiZSBtYXBwZWQgdG8gYSBzaW5nbGUgRENVIHRoYXQgY29udHJvbHMgdGhlIHZhcmlvdXMgREZTIHBhcmFtZXRlcnMKKyAqIGZvciB0aGUgdmFyaW91cyBxdWV1ZXMuIEluIG91ciBzZXR1cCB3ZSBoYXZlIGEgMToxIG1hcHBpbmcgYmV0d2VlbiBRQ1VzCisgKiBhbmQgRENVcyBhbGxvd2luZyB1cyB0byBoYXZlIGRpZmZlcmVudCBERlMgc2V0dGluZ3MgZm9yIGVhY2ggcXVldWUuCisgKgorICogV2hlbiBhIGZyYW1lIGdvZXMgaW50byBhIFRYIHF1ZXVlLCBRQ1UgZGVjaWRlcyB3aGVuIGl0J2xsIHRyaWdnZXIgYQorICogdHJhbnNtaXNzaW9uIGJhc2VkIG9uIHZhcmlvdXMgY3JpdGVyaWEgKHN1Y2ggYXMgaG93IG1hbnkgZGF0YSB3ZSBoYXZlIGluc2lkZQorICogaXQncyBidWZmZXIgb3IgLWlmIGl0J3MgYSBiZWFjb24gcXVldWUtIGlmIGl0J3MgdGltZSB0byBmaXJlIHVwIHRoZSBxdWV1ZQorICogYmFzZWQgb24gVFNGIGV0YyksIERDVSBhZGRzIGJhY2tvZmYsIElGU2VzIGV0YyBhbmQgdGhlbiBhIHNjaGVkdWxlcgorICogKGFyYml0cmF0b3IpIGRlY2lkZXMgdGhlIHByaW9yaXR5IG9mIGVhY2ggUUNVIGJhc2VkIG9uIGl0J3MgY29uZmlndXJhdGlvbgorICogKGUuZy4gYmVhY29ucyBhcmUgYWx3YXlzIHRyYW5zbWl0dGVkIHdoZW4gdGhleSBsZWF2ZSBEQ1UgYnlwYXNzaW5nIGFsbCBvdGhlcgorICogZnJhbWVzIGZyb20gb3RoZXIgcXVldWVzIHdhaXRpbmcgdG8gYmUgdHJhbnNtaXR0ZWQpLiBBZnRlciBhIGZyYW1lIGxlYXZlcworICogdGhlIERDVSBpdCBnb2VzIHRvIFBDVSBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGFuZCB0aGVuIHRvIFBIWSBmb3IKKyAqIHRoZSBhY3R1YWwgdHJhbnNtaXNzaW9uLgorICovCiAKIAogLyoqKioqKioqKioqKioqKioqKlwKICogSGVscGVyIGZ1bmN0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogR2V0IG51bWJlciBvZiBwZW5kaW5nIGZyYW1lcwotICogZm9yIGEgc3BlY2lmaWMgcXVldWUgWzUyMTErXQorLyoqCisgKiBhdGg1a19od19udW1fdHhfcGVuZGluZygpIC0gR2V0IG51bWJlciBvZiBwZW5kaW5nIGZyYW1lcyBmb3IgYSAgZ2l2ZW4gcXVldWUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBxdWV1ZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWVfaWQKICAqLwotdTMyIGF0aDVrX2h3X251bV90eF9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKK3UzMgorYXRoNWtfaHdfbnVtX3R4X3BlbmRpbmcoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQogewogCXUzMiBwZW5kaW5nOwogCUFSNUtfQVNTRVJUX0VOVFJZKHF1ZXVlLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pOwpAQCAtNTgsMTAgKzgzLDEzIEBACiAJcmV0dXJuIHBlbmRpbmc7CiB9CiAKLS8qCi0gKiBTZXQgYSB0cmFuc21pdCBxdWV1ZSBpbmFjdGl2ZQorLyoqCisgKiBhdGg1a19od19yZWxlYXNlX3R4X3F1ZXVlKCkgLSBTZXQgYSB0cmFuc21pdCBxdWV1ZSBpbmFjdGl2ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlOiBPbmUgb2YgZW51bSBhdGg1a190eF9xdWV1ZV9pZAogICovCi12b2lkIGF0aDVrX2h3X3JlbGVhc2VfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQordm9pZAorYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCiB7CiAJaWYgKFdBUk5fT04ocXVldWUgPj0gYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKSkKIAkJcmV0dXJuOwpAQCAtNzIsMzQgKzEwMCw1NiBAQAogCUFSNUtfUV9ESVNBQkxFX0JJVFMoYWgtPmFoX3R4cV9zdGF0dXMsIHF1ZXVlKTsKIH0KIAotLyoKKy8qKgorICogYXRoNWtfY3dfdmFsaWRhdGUoKSAtIE1ha2Ugc3VyZSB0aGUgZ2l2ZW4gY3cgaXMgdmFsaWQKKyAqIEBjd19yZXE6IFRoZSBjb250ZW50aW9uIHdpbmRvdyB2YWx1ZSB0byBjaGVjaworICoKICAqIE1ha2Ugc3VyZSBjdyBpcyBhIHBvd2VyIG9mIDIgbWludXMgMSBhbmQgc21hbGxlciB0aGFuIDEwMjQKICAqLwotc3RhdGljIHUxNiBhdGg1a19jd192YWxpZGF0ZSh1MTYgY3dfcmVxKQorc3RhdGljIHUxNgorYXRoNWtfY3dfdmFsaWRhdGUodTE2IGN3X3JlcSkKIHsKLQl1MzIgY3cgPSAxOwogCWN3X3JlcSA9IG1pbihjd19yZXEsICh1MTYpMTAyMyk7CiAKLQl3aGlsZSAoY3cgPCBjd19yZXEpCi0JCWN3ID0gKGN3IDw8IDEpIHwgMTsKKwkvKiBDaGVjayBpZiBjd19yZXEgKyAxIGEgcG93ZXIgb2YgMiAqLworCWlmIChpc19wb3dlcl9vZl8yKGN3X3JlcSArIDEpKQorCQlyZXR1cm4gY3dfcmVxOwogCi0JcmV0dXJuIGN3OworCS8qIENoZWNrIGlmIGN3X3JlcSBpcyBhIHBvd2VyIG9mIDIgKi8KKwlpZiAoaXNfcG93ZXJfb2ZfMihjd19yZXEpKQorCQlyZXR1cm4gY3dfcmVxIC0gMTsKKworCS8qIElmIG5vbmUgb2YgdGhlIGFib3ZlIGlzIGNvcnJlY3QKKwkgKiBmaW5kIHRoZSBjbG9zZXN0IHBvd2VyIG9mIDIgKi8KKwljd19yZXEgPSAodTE2KSByb3VuZHVwX3Bvd19vZl90d28oY3dfcmVxKSAtIDE7CisKKwlyZXR1cm4gY3dfcmVxOwogfQogCi0vKgotICogR2V0IHByb3BlcnRpZXMgZm9yIGEgdHJhbnNtaXQgcXVldWUKKy8qKgorICogYXRoNWtfaHdfZ2V0X3R4X3F1ZXVlcHJvcHMoKSAtIEdldCBwcm9wZXJ0aWVzIGZvciBhIHRyYW5zbWl0IHF1ZXVlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IE9uZSBvZiBlbnVtIGF0aDVrX3R4X3F1ZXVlX2lkCisgKiBAcXVldWVfaW5mbzogVGhlICZzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gdG8gZmlsbAogICovCi1pbnQgYXRoNWtfaHdfZ2V0X3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IHF1ZXVlLAoraW50CithdGg1a19od19nZXRfdHhfcXVldWVwcm9wcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgcXVldWUsCiAJCXN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbykKIHsKIAltZW1jcHkocXVldWVfaW5mbywgJmFoLT5haF90eHFbcXVldWVdLCBzaXplb2Yoc3RydWN0IGF0aDVrX3R4cV9pbmZvKSk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBTZXQgcHJvcGVydGllcyBmb3IgYSB0cmFuc21pdCBxdWV1ZQorLyoqCisgKiBhdGg1a19od19zZXRfdHhfcXVldWVwcm9wcygpIC0gU2V0IHByb3BlcnRpZXMgZm9yIGEgdHJhbnNtaXQgcXVldWUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBxdWV1ZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWVfaWQKKyAqIEBxaW5mbzogVGhlICZzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gdG8gdXNlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTyBpZiBxdWV1ZSBpcyBpbmFjdGl2ZQogICovCi1pbnQgYXRoNWtfaHdfc2V0X3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IHF1ZXVlLAoraW50CithdGg1a19od19zZXRfdHhfcXVldWVwcm9wcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgcXVldWUsCiAJCQkJY29uc3Qgc3RydWN0IGF0aDVrX3R4cV9pbmZvICpxaW5mbykKIHsKIAlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnFpOwpAQCAtMTM5LDEwICsxODksMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEluaXRpYWxpemUgYSB0cmFuc21pdCBxdWV1ZQorLyoqCisgKiBhdGg1a19od19zZXR1cF90eF9xdWV1ZSgpIC0gSW5pdGlhbGl6ZSBhIHRyYW5zbWl0IHF1ZXVlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWVfdHlwZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWUKKyAqIEBxdWV1ZV9pbmZvOiBUaGUgJnN0cnVjdCBhdGg1a190eHFfaW5mbyB0byB1c2UKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBpbnZhbGlkIGFyZ3VtZW50cwogICovCi1pbnQgYXRoNWtfaHdfc2V0dXBfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a190eF9xdWV1ZSBxdWV1ZV90eXBlLAoraW50CithdGg1a19od19zZXR1cF90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX3R4X3F1ZXVlIHF1ZXVlX3R5cGUsCiAJCXN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbykKIHsKIAl1bnNpZ25lZCBpbnQgcXVldWU7CkBAIC0yMTcsMTAgKzI3MywxNiBAQAogKiBTaW5nbGUgUUNVL0RDVSBpbml0aWFsaXphdGlvbiAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFNldCB0eCByZXRyeSBsaW1pdHMgb24gRENVCisvKioKKyAqIGF0aDVrX2h3X3NldF90eF9yZXRyeV9saW1pdHMoKSAtIFNldCB0eCByZXRyeSBsaW1pdHMgb24gRENVCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IE9uZSBvZiBlbnVtIGF0aDVrX3R4X3F1ZXVlX2lkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIGEgcXVldWUsIHRvIHNldAorICogcmV0cnkgbGltaXRzIGJhc2VkIG9uIGFoLT5haF9yZXRyeV8qIGFuZCB0aGUgY2hpcHNldCB1c2VkLgogICovCi12b2lkIGF0aDVrX2h3X3NldF90eF9yZXRyeV9saW1pdHMoc3RydWN0IGF0aDVrX2h3ICphaCwKK3ZvaWQKK2F0aDVrX2h3X3NldF90eF9yZXRyeV9saW1pdHMoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCQkgIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAkvKiBTaW5nbGUgZGF0YSBxdWV1ZSBvbiBBUjUyMTAgKi8KQEAgLTI1NSwxNSArMzE3LDE1IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfcmVzZXRfdHhfcXVldWUgLSBJbml0aWFsaXplIGEgc2luZ2xlIGh3IHF1ZXVlCisgKiBhdGg1a19od19yZXNldF90eF9xdWV1ZSgpIC0gSW5pdGlhbGl6ZSBhIHNpbmdsZSBodyBxdWV1ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlOiBPbmUgb2YgZW51bSBhdGg1a190eF9xdWV1ZV9pZAogICoKLSAqIEBhaCBUaGUgJnN0cnVjdCBhdGg1a19odwotICogQHF1ZXVlIFRoZSBodyBxdWV1ZSBudW1iZXIKLSAqCi0gKiBTZXQgREZTIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiB0cmFuc21pdCBxdWV1ZSBvbiBEQ1UKKyAqIFNldCBEQ0YgcHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIHRyYW5zbWl0IHF1ZXVlIG9uIERDVQogICogYW5kIGNvbmZpZ3VyZXMgYWxsIHF1ZXVlLXNwZWNpZmljIHBhcmFtZXRlcnMuCiAgKi8KLWludCBhdGg1a19od19yZXNldF90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCitpbnQKK2F0aDVrX2h3X3Jlc2V0X3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnRxID0gJmFoLT5haF90eHFbcXVldWVdOwogCkBAIC00OTEsMTAgKzU1Myw5IEBACiBcKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2lmc19pbnRlcnZhbHMgIC0gU2V0IGdsb2JhbCBpbnRlci1mcmFtZSBzcGFjZXMgb24gRENVCi0gKgotICogQGFoIFRoZSAmc3RydWN0IGF0aDVrX2h3Ci0gKiBAc2xvdF90aW1lIFNsb3QgdGltZSBpbiB1cworICogYXRoNWtfaHdfc2V0X2lmc19pbnRlcnZhbHMoKSAgLSBTZXQgZ2xvYmFsIGludGVyLWZyYW1lIHNwYWNlcyBvbiBEQ1UKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBzbG90X3RpbWU6IFNsb3QgdGltZSBpbiB1cwogICoKICAqIFNldHMgdGhlIGdsb2JhbCBJRlMgaW50ZXJ2YWxzIG9uIERDVSAoYWxzbyB3b3JrcyBvbiBBUjUyMTApIGZvcgogICogdGhlIGdpdmVuIHNsb3QgdGltZSBhbmQgdGhlIGN1cnJlbnQgYndtb2RlLgpAQCAtNTk3LDcgKzY1OCwxNSBAQAogfQogCiAKLWludCBhdGg1a19od19pbml0X3F1ZXVlcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorLyoqCisgKiBhdGg1a19od19pbml0X3F1ZXVlcygpIC0gSW5pdGlhbGl6ZSB0eCBxdWV1ZXMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBJbml0aWFsaXplcyBhbGwgdHggcXVldWVzIGJhc2VkIG9uIGluZm9ybWF0aW9uIG9uCisgKiBhaC0+YWhfdHhxKiBzZXQgYnkgdGhlIGRyaXZlcgorICovCitpbnQKK2F0aDVrX2h3X2luaXRfcXVldWVzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJaW50IGksIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JlZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JlZy5oCmluZGV4IGY1YzEwMDAuLjBlYTE2MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVnLmgKQEAgLTI4MCw2ICsyODAsMTAgQEAKICAqIDUyMTEvNTIxMiB3ZSBoYXZlIG9uZSBwcmltYXJ5IGFuZCA0IHNlY29uZGFyeSByZWdpc3RlcnMuCiAgKiBTbyB3ZSBoYXZlIEFSNUtfSVNSIGZvciA1MjEwIGFuZCBBUjVLX1BJU1IgL1NJU1J4IGZvciA1MjExLzUyMTIuCiAgKiBNb3N0IG9mIHRoZXNlIGJpdHMgYXJlIGNvbW1vbiBmb3IgYWxsIGNoaXBzZXRzLgorICoKKyAqIE5PVEU6IE9uIDUyMTErIFRYT0ssIFRYREVTQywgVFhFUlIsIFRYRU9MIGFuZCBUWFVSTiBjb250YWluCisgKiB0aGUgbG9naWNhbCBPUiBmcm9tIHBlci1xdWV1ZSBpbnRlcnJ1cHQgYml0cyBmb3VuZCBvbiBTSVNSIHJlZ2lzdGVycworICogKHNlZSBiZWxvdykuCiAgKi8KICNkZWZpbmUgQVI1S19JU1IJCTB4MDAxYwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTBdICovCiAjZGVmaW5lIEFSNUtfUElTUgkJMHgwMDgwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCkBAIC0yOTIsNyArMjk2LDEwIEBACiAjZGVmaW5lIEFSNUtfSVNSX1RYT0sJCTB4MDAwMDAwNDAJLyogRnJhbWUgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkICovCiAjZGVmaW5lIEFSNUtfSVNSX1RYREVTQwkJMHgwMDAwMDA4MAkvKiBUWCBkZXNjcmlwdG9yIHJlcXVlc3QgKi8KICNkZWZpbmUgQVI1S19JU1JfVFhFUlIJCTB4MDAwMDAxMDAJLyogVHJhbnNtaXQgZXJyb3IgKi8KLSNkZWZpbmUgQVI1S19JU1JfVFhOT0ZSTQkweDAwMDAwMjAwCS8qIE5vIGZyYW1lIHRyYW5zbWl0dGVkICh0cmFuc21pdCB0aW1lb3V0KSAqLworI2RlZmluZSBBUjVLX0lTUl9UWE5PRlJNCTB4MDAwMDAyMDAJLyogTm8gZnJhbWUgdHJhbnNtaXR0ZWQgKHRyYW5zbWl0IHRpbWVvdXQpCisJCQkJCQkgKiBOT1RFOiBXZSBkb24ndCBoYXZlIHBlci1xdWV1ZSBpbmZvIGZvciB0aGlzCisJCQkJCQkgKiBvbmUsIGJ1dCB3ZSBjYW4gZW5hYmxlIGl0IHBlci1xdWV1ZSB0aHJvdWdoCisJCQkJCQkgKiBUWE5PRlJNX1FDVSBmaWVsZCBvbiBUWE5PRlJNIHJlZ2lzdGVyICovCiAjZGVmaW5lIEFSNUtfSVNSX1RYRU9MCQkweDAwMDAwNDAwCS8qIEVtcHR5IFRYIGRlc2NyaXB0b3IgKi8KICNkZWZpbmUgQVI1S19JU1JfVFhVUk4JCTB4MDAwMDA4MDAJLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biAqLwogI2RlZmluZSBBUjVLX0lTUl9NSUIJCTB4MDAwMDEwMDAJLyogVXBkYXRlIE1JQiBjb3VudGVycyAqLwpAQCAtMzAyLDIxICszMDksMjkgQEAKICNkZWZpbmUgQVI1S19JU1JfU1dCQQkJMHgwMDAxMDAwMAkvKiBTb2Z0d2FyZSBiZWFjb24gYWxlcnQgKi8KICNkZWZpbmUgQVI1S19JU1JfQlJTU0kJCTB4MDAwMjAwMDAJLyogQmVhY29uIHJzc2kgYmVsb3cgdGhyZXNob2xkICg/KSAqLwogI2RlZmluZSBBUjVLX0lTUl9CTUlTUwkJMHgwMDA0MDAwMAkvKiBCZWFjb24gbWlzc2VkICovCi0jZGVmaW5lIEFSNUtfSVNSX0hJVUVSUgkJMHgwMDA4MDAwMAkvKiBIb3N0IEludGVyZmFjZSBVbml0IGVycm9yIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19JU1JfSElVRVJSCQkweDAwMDgwMDAwCS8qIEhvc3QgSW50ZXJmYWNlIFVuaXQgZXJyb3IgWzUyMTErXQorCQkJCQkJICogJ29yJyBvZiBNQ0FCVCwgU1NFUlIsIERQRVJSIGZyb20gU0lTUjIgKi8KICNkZWZpbmUgQVI1S19JU1JfQk5SCQkweDAwMTAwMDAwCS8qIEJlYWNvbiBub3QgcmVhZHkgWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX0lTUl9NQ0FCVAkJMHgwMDEwMDAwMAkvKiBNYXN0ZXIgQ3ljbGUgQWJvcnQgWzUyMTBdICovCiAjZGVmaW5lIEFSNUtfSVNSX1JYQ0hJUlAJMHgwMDIwMDAwMAkvKiBDSElSUCBSZWNlaXZlZCBbNTIxMitdICovCiAjZGVmaW5lIEFSNUtfSVNSX1NTRVJSCQkweDAwMjAwMDAwCS8qIFNpZ25hbGVkIFN5c3RlbSBFcnJvciBbNTIxMF0gKi8KLSNkZWZpbmUgQVI1S19JU1JfRFBFUlIJCTB4MDA0MDAwMDAJLyogRGV0IHBhciBFcnJvciAoPykgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfSVNSX0RQRVJSCQkweDAwNDAwMDAwCS8qIEJ1cyBwYXJpdHkgZXJyb3IgWzUyMTBdICovCiAjZGVmaW5lIEFSNUtfSVNSX1JYRE9QUExFUgkweDAwNDAwMDAwCS8qIERvcHBsZXIgY2hpcnAgcmVjZWl2ZWQgWzUyMTIrXSAqLwogI2RlZmluZSBBUjVLX0lTUl9USU0JCTB4MDA4MDAwMDAJLyogWzUyMTErXSAqLwotI2RlZmluZSBBUjVLX0lTUl9CQ05NSVNDCTB4MDA4MDAwMDAJLyogJ29yJyBvZiBUSU0sIENBQl9FTkQsIERUSU1fU1lOQywgQkNOX1RJTUVPVVQsCi0JCQkJCQlDQUJfVElNRU9VVCBhbmQgRFRJTSBiaXRzIGZyb20gU0lTUjIgWzUyMTIrXSAqLworI2RlZmluZSBBUjVLX0lTUl9CQ05NSVNDCTB4MDA4MDAwMDAJLyogTWlzYyBiZWFjb24gcmVsYXRlZCBpbnRlcnJ1cHQKKwkJCQkJCSAqICdvcicgb2YgVElNLCBDQUJfRU5ELCBEVElNX1NZTkMsIEJDTl9USU1FT1VULAorCQkJCQkJICogQ0FCX1RJTUVPVVQgYW5kIERUSU0gYml0cyBmcm9tIFNJU1IyIFs1MjEyK10gKi8KICNkZWZpbmUgQVI1S19JU1JfR1BJTwkJMHgwMTAwMDAwMAkvKiBHUElPIChyZiBraWxsKSAqLwogI2RlZmluZSBBUjVLX0lTUl9RQ0JST1JOCTB4MDIwMDAwMDAJLyogUUNVIENCUiBvdmVycnVuIFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19JU1JfUUNCUlVSTgkweDA0MDAwMDAwCS8qIFFDVSBDQlIgdW5kZXJydW4gWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX0lTUl9RVFJJRwkJMHgwODAwMDAwMAkvKiBRQ1Ugc2NoZWR1bGluZyB0cmlnZ2VyIFs1MjExK10gKi8KIAorI2RlZmluZQlBUjVLX0lTUl9CSVRTX0ZST01fU0lTUlMJKEFSNUtfSVNSX1RYT0sgfCBBUjVLX0lTUl9UWERFU0MgfFwKKwkJCQkJQVI1S19JU1JfVFhFUlIgfCBBUjVLX0lTUl9UWEVPTCB8XAorCQkJCQlBUjVLX0lTUl9UWFVSTiB8IEFSNUtfSVNSX0hJVUVSUiB8XAorCQkJCQlBUjVLX0lTUl9CQ05NSVNDIHwgQVI1S19JU1JfUUNCUk9STiB8XAorCQkJCQlBUjVLX0lTUl9RQ0JSVVJOIHwgQVI1S19JU1JfUVRSSUcpCisKIC8qCiAgKiBTZWNvbmRhcnkgc3RhdHVzIHJlZ2lzdGVycyBbNTIxMStdICgwIC0gNCkKICAqCkBAIC0zNDcsNyArMzYyLDcgQEAKICNkZWZpbmUJQVI1S19TSVNSMl9CQ05fVElNRU9VVAkweDA4MDAwMDAwCS8qIEJlYWNvbiBUaW1lb3V0IFs1MjEyK10gKi8KICNkZWZpbmUJQVI1S19TSVNSMl9DQUJfVElNRU9VVAkweDEwMDAwMDAwCS8qIENBQiBUaW1lb3V0IFs1MjEyK10gKi8KICNkZWZpbmUJQVI1S19TSVNSMl9EVElNCQkweDIwMDAwMDAwCS8qIFs1MjEyK10gKi8KLSNkZWZpbmUJQVI1S19TSVNSMl9UU0ZPT1IJMHg4MDAwMDAwMAkvKiBUU0YgT09SICg/KSAqLworI2RlZmluZQlBUjVLX1NJU1IyX1RTRk9PUgkweDgwMDAwMDAwCS8qIFRTRiBPdXQgb2YgcmFuZ2UgKi8KIAogI2RlZmluZSBBUjVLX1NJU1IzCQkweDAwOTAJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19TSVNSM19RQ0JST1JOCTB4MDAwMDAzZmYJLyogTWFzayBmb3IgUUNCUk9STiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jlc2V0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYwppbmRleCAyYWJhYzI1Li40YWVkM2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYwpAQCAtMTksOSArMTksOSBAQAogICoKICAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gIFJlc2V0IGZ1bmN0aW9ucyBhbmQgaGVscGVycwotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIFJlc2V0IGZ1bmN0aW9uIGFuZCBoZWxwZXJzCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApAQCAtMzMsMTQgKzMzLDM2IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCisvKioKKyAqIERPQzogUmVzZXQgZnVuY3Rpb24gYW5kIGhlbHBlcnMKKyAqCisgKiBIZXJlIHdlIGltcGxlbWVudCB0aGUgbWFpbiByZXNldCByb3V0aW5lLCB1c2VkIHRvIGJyaW5nIHRoZSBjYXJkCisgKiB0byBhIHdvcmtpbmcgc3RhdGUgYW5kIHJlYWR5IHRvIHJlY2VpdmUuIFdlIGFsc28gaGFuZGxlIHJvdXRpbmVzCisgKiB0aGF0IGRvbid0IGZpdCBvbiBvdGhlciBwbGFjZXMgc3VjaCBhcyBjbG9jaywgc2xlZXAgYW5kIHBvd2VyIGNvbnRyb2wKKyAqLworCisKIC8qKioqKioqKioqKioqKioqKipcCiAqIEhlbHBlciBmdW5jdGlvbnMgKgogXCoqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIENoZWNrIGlmIGEgcmVnaXN0ZXIgd3JpdGUgaGFzIGJlZW4gY29tcGxldGVkCisvKioKKyAqIGF0aDVrX2h3X3JlZ2lzdGVyX3RpbWVvdXQoKSAtIFBvbGwgYSByZWdpc3RlciBmb3IgYSBmbGFnL2ZpZWxkIGNoYW5nZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHJlZzogVGhlIHJlZ2lzdGVyIHRvIHJlYWQKKyAqIEBmbGFnOiBUaGUgZmxhZy9maWVsZCB0byBjaGVjayBvbiB0aGUgcmVnaXN0ZXIKKyAqIEB2YWw6IFRoZSBmaWVsZCB2YWx1ZSB3ZSBleHBlY3QgKGlmIHdlIGNoZWNrIGEgZmllbGQpCisgKiBAaXNfc2V0OiBJbnN0ZWFkIG9mIGNoZWNraW5nIGlmIHRoZSBmbGFnIGdvdCBjbGVhcmVkLCBjaGVjayBpZiBpdCBnb3Qgc2V0CisgKgorICogU29tZSByZWdpc3RlcnMgY29udGFpbiBmbGFncyB0aGF0IGluZGljYXRlIHRoYXQgYW4gb3BlcmF0aW9uIGlzCisgKiBydW5uaW5nLiBXZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBwb2xsIHRoZXNlIHJlZ2lzdGVycyBhbmQgY2hlY2sKKyAqIGlmIHRoZXNlIGZsYWdzIGdldCBjbGVhcmVkLiBXZSBhbHNvIHVzZSBpdCB0byBwb2xsIGEgcmVnaXN0ZXIKKyAqIGZpZWxkIChjb250YWluaW5nIG11bHRpcGxlIGZsYWdzKSB1bnRpbCBpdCBnZXRzIGEgc3BlY2lmaWMgdmFsdWUuCisgKgorICogUmV0dXJucyAtRUFHQUlOIGlmIHdlIGV4Y2VlZGVkIEFSNUtfVFVORV9SRUdJU1RFUl9USU1FT1VUICogMTV1cyBvciAwCiAgKi8KLWludCBhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiByZWcsIHUzMiBmbGFnLCB1MzIgdmFsLAoraW50CithdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiByZWcsIHUzMiBmbGFnLCB1MzIgdmFsLAogCQkJICAgICAgYm9vbCBpc19zZXQpCiB7CiAJaW50IGk7CkBAIC02NCwzNSArODYsNDggQEAKIFwqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKLSAqIGF0aDVrX2h3X2h0b2Nsb2NrIC0gVHJhbnNsYXRlIHVzZWMgdG8gaHcgY2xvY2sgdW5pdHMKLSAqCisgKiBhdGg1a19od19odG9jbG9jaygpIC0gVHJhbnNsYXRlIHVzZWMgdG8gaHcgY2xvY2sgdW5pdHMKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEB1c2VjOiB2YWx1ZSBpbiBtaWNyb3NlY29uZHMKKyAqCisgKiBUcmFuc2xhdGUgdXNlY3MgdG8gaHcgY2xvY2sgdW5pdHMgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAqIGh3IGNsb2NrIHJhdGUuCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgY2xvY2sgdW5pdHMKICAqLwotdW5zaWduZWQgaW50IGF0aDVrX2h3X2h0b2Nsb2NrKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB1c2VjKQordW5zaWduZWQgaW50CithdGg1a19od19odG9jbG9jayhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgdXNlYykKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAlyZXR1cm4gdXNlYyAqIGNvbW1vbi0+Y2xvY2tyYXRlOwogfQogCiAvKioKLSAqIGF0aDVrX2h3X2Nsb2NrdG9oIC0gVHJhbnNsYXRlIGh3IGNsb2NrIHVuaXRzIHRvIHVzZWMKKyAqIGF0aDVrX2h3X2Nsb2NrdG9oKCkgLSBUcmFuc2xhdGUgaHcgY2xvY2sgdW5pdHMgdG8gdXNlYworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGNsb2NrOiB2YWx1ZSBpbiBodyBjbG9jayB1bml0cworICoKKyAqIFRyYW5zbGF0ZSBodyBjbG9jayB1bml0cyB0byB1c2VjcyBiYXNlZCBvbiB0aGUgY3VycmVudAorICogaHcgY2xvY2sgcmF0ZS4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiB1c2VjcwogICovCi11bnNpZ25lZCBpbnQgYXRoNWtfaHdfY2xvY2t0b2goc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IGNsb2NrKQordW5zaWduZWQgaW50CithdGg1a19od19jbG9ja3RvaChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgY2xvY2spCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJcmV0dXJuIGNsb2NrIC8gY29tbW9uLT5jbG9ja3JhdGU7CiB9CiAKIC8qKgotICogYXRoNWtfaHdfaW5pdF9jb3JlX2Nsb2NrIC0gSW5pdGlhbGl6ZSBjb3JlIGNsb2NrCisgKiBhdGg1a19od19pbml0X2NvcmVfY2xvY2soKSAtIEluaXRpYWxpemUgY29yZSBjbG9jaworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKLSAqIEBhaCBUaGUgJnN0cnVjdCBhdGg1a19odwotICoKLSAqIEluaXRpYWxpemUgY29yZSBjbG9jayBwYXJhbWV0ZXJzICh1c2VjLCB1c2VjMzIsIGxhdGVuY2llcyBldGMpLgorICogSW5pdGlhbGl6ZSBjb3JlIGNsb2NrIHBhcmFtZXRlcnMgKHVzZWMsIHVzZWMzMiwgbGF0ZW5jaWVzIGV0YyksCisgKiBiYXNlZCBvbiBjdXJyZW50IGJ3bW9kZSBhbmQgY2hpcHNldCBwcm9wZXJ0aWVzLgogICovCi1zdGF0aWMgdm9pZCBhdGg1a19od19pbml0X2NvcmVfY2xvY2soc3RydWN0IGF0aDVrX2h3ICphaCkKK3N0YXRpYyB2b2lkCithdGg1a19od19pbml0X2NvcmVfY2xvY2soc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBhaC0+YWhfY3VycmVudF9jaGFubmVsOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwpAQCAtMjI3LDE2ICsyNjIsMjEgQEAKIAl9CiB9CiAKLS8qCisvKioKKyAqIGF0aDVrX2h3X3NldF9zbGVlcF9jbG9jaygpIC0gU2V0dXAgc2xlZXAgY2xvY2sgb3BlcmF0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZW5hYmxlOiBFbmFibGUgc2xlZXAgY2xvY2sgb3BlcmF0aW9uIChmYWxzZSB0byBkaXNhYmxlKQorICoKICAqIElmIHRoZXJlIGlzIGFuIGV4dGVybmFsIDMyS0h6IGNyeXN0YWwgYXZhaWxhYmxlLCB1c2UgaXQKICAqIGFzIHJlZi4gY2xvY2sgaW5zdGVhZCBvZiAzMi80ME1IeiBjbG9jayBhbmQgYmFzZWJhbmQgY2xvY2tzCiAgKiB0byBzYXZlIHBvd2VyIGR1cmluZyBzbGVlcCBvciByZXN0b3JlIG5vcm1hbCAzMi80ME1IegogICogb3BlcmF0aW9uLgogICoKLSAqIFhYWDogV2hlbiBvcGVyYXRpbmcgb24gMzJLSHogY2VydGFpbiBQSFkgcmVnaXN0ZXJzICgyNyAtIDMxLAotICoJMTIzIC0gMTI3KSByZXF1aXJlIGRlbGF5IG9uIGFjY2Vzcy4KKyAqIE5PVEU6IFdoZW4gb3BlcmF0aW5nIG9uIDMyS0h6IGNlcnRhaW4gUEhZIHJlZ2lzdGVycyAoMjcgLSAzMSwKKyAqIDEyMyAtIDEyNykgcmVxdWlyZSBkZWxheSBvbiBhY2Nlc3MuCiAgKi8KLXN0YXRpYyB2b2lkIGF0aDVrX2h3X3NldF9zbGVlcF9jbG9jayhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBib29sIGVuYWJsZSkKK3N0YXRpYyB2b2lkCithdGg1a19od19zZXRfc2xlZXBfY2xvY2soc3RydWN0IGF0aDVrX2h3ICphaCwgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CiAJdTMyIHNjYWwsIHNwZW5kaW5nLCBzY2xvY2s7CkBAIC0zNDAsMTAgKzM4MCwxOSBAQAogKiBSZXNldC9TbGVlcCBjb250cm9sICoKIFwqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBSZXNldCBjaGlwc2V0CisvKioKKyAqIGF0aDVrX2h3X25pY19yZXNldCgpIC0gUmVzZXQgdGhlIHZhcmlvdXMgY2hpcHNldCB1bml0cworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHZhbDogTWFzayB0byBpbmRpY2F0ZSB3aGF0IHVuaXRzIHRvIHJlc2V0CisgKgorICogVG8gcmVzZXQgdGhlIHZhcmlvdXMgY2hpcHNldCB1bml0cyB3ZSBuZWVkIHRvIHdyaXRlCisgKiB0aGUgbWFzayB0byBBUjVLX1JFU0VUX0NUTCBhbmQgcG9sbCB0aGUgcmVnaXN0ZXIgdW50aWwKKyAqIGFsbCBmbGFncyBhcmUgY2xlYXJlZC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgd2UgYXJlIE8uSy4gb3IgLUVBR0FJTiAoZnJvbSBhdGhrNV9od19yZWdpc3Rlcl90aW1lb3V0KQogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X25pY19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgdmFsKQorc3RhdGljIGludAorYXRoNWtfaHdfbmljX3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiB2YWwpCiB7CiAJaW50IHJldDsKIAl1MzIgbWFzayA9IHZhbCA/IHZhbCA6IH4wVTsKQEAgLTM1Nyw3ICs0MDYsNyBAQAogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdmFsLCBBUjVLX1JFU0VUX0NUTCk7CiAKIAkvKiBXYWl0IGF0IGxlYXN0IDEyOCBQQ0kgY2xvY2tzICovCi0JdWRlbGF5KDE1KTsKKwl1c2xlZXBfcmFuZ2UoMTUsIDIwKTsKIAogCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewogCQl2YWwgJj0gQVI1S19SRVNFVF9DVExfUENVIHwgQVI1S19SRVNFVF9DVExfRE1BCkBAIC0zODIsMTIgKzQzMSwxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBSZXNldCBBSEIgY2hpcHNldAotICogQVI1S19SRVNFVF9DVExfUENVIGZsYWcgcmVzZXRzIFdNQUMKLSAqIEFSNUtfUkVTRVRfQ1RMX0JBU0VCQU5EIGZsYWcgcmVzZXRzIFdCQgorLyoqCisgKiBhdGg1a19od193aXNvY19yZXNldCgpIC0gIFJlc2V0IEFIQiBjaGlwc2V0CisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZmxhZ3M6IE1hc2sgdG8gaW5kaWNhdGUgd2hhdCB1bml0cyB0byByZXNldAorICoKKyAqIFNhbWUgYXMgYXRoNWtfaHdfbmljX3Jlc2V0IGJ1dCBmb3IgQUhCIGJhc2VkIGRldmljZXMKKyAqCisgKiBSZXR1cm5zIDAgaWYgd2UgYXJlIE8uSy4gb3IgLUVBR0FJTiAoZnJvbSBhdGhrNV9od19yZWdpc3Rlcl90aW1lb3V0KQogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3dpc29jX3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmbGFncykKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3dpc29jX3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmbGFncykKIHsKIAl1MzIgbWFzayA9IGZsYWdzID8gZmxhZ3MgOiB+MFU7CiAJdTMyIF9faW9tZW0gKnJlZzsKQEAgLTQyMiw3ICs0NzYsNyBAQAogCXJlZ3ZhbCA9IF9fcmF3X3JlYWRsKHJlZyk7CiAJX19yYXdfd3JpdGVsKHJlZ3ZhbCB8IHZhbCwgcmVnKTsKIAlyZWd2YWwgPSBfX3Jhd19yZWFkbChyZWcpOwotCXVkZWxheSgxMDApOworCXVzbGVlcF9yYW5nZSgxMDAsIDE1MCk7CiAKIAkvKiBCcmluZyBCQi9NQUMgb3V0IG9mIHJlc2V0ICovCiAJX19yYXdfd3JpdGVsKHJlZ3ZhbCAmIH52YWwsIHJlZyk7CkBAIC00MzksMTEgKzQ5MywyMyBAQAogCXJldHVybiAwOwogfQogCi0KLS8qCi0gKiBTbGVlcCBjb250cm9sCisvKioKKyAqIGF0aDVrX2h3X3NldF9wb3dlcl9tb2RlKCkgLSBTZXQgcG93ZXIgbW9kZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX3Bvd2VyX21vZGUKKyAqIEBzZXRfY2hpcDogU2V0IHRvIHRydWUgdG8gd3JpdGUgc2xlZXAgY29udHJvbCByZWdpc3RlcgorICogQHNsZWVwX2R1cmF0aW9uOiBIb3cgbXVjaCB0aW1lIHRoZSBkZXZpY2UgaXMgYWxsb3dlZCB0byBzbGVlcAorICogd2hlbiBzbGVlcCBsb2dpYyBpcyBlbmFibGVkIChpbiAxMjggbWljcm9zZWNvbmQgaW5jcmVtZW50cykuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBzbGVlcCBwb2xpY3kgYW5kIGFsbG93ZWQKKyAqIHNsZWVwIG1vZGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBjaGVjayBvdXQgdGhlIHNsZWVwIGNvbnRyb2wKKyAqIHJlZ2lzdGVyIG9uIHJlZy5oIGFuZCBTVEFfSUQxLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlPIGlmIGNoaXAgZGlkbid0IHdha2UgdXAgb3IgLUVJTlZBTCBpZiBhbiBpbnZhbGlkCisgKiBtb2RlIGlzIHJlcXVlc3RlZC4KICAqLwotc3RhdGljIGludCBhdGg1a19od19zZXRfcG93ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19wb3dlcl9tb2RlIG1vZGUsCitzdGF0aWMgaW50CithdGg1a19od19zZXRfcG93ZXJfbW9kZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX3Bvd2VyX21vZGUgbW9kZSwKIAkJCSAgICAgIGJvb2wgc2V0X2NoaXAsIHUxNiBzbGVlcF9kdXJhdGlvbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTQ5Myw3ICs1NTksNyBAQAogCiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSB8IEFSNUtfU0xFRVBfQ1RMX1NMRV9XQUtFLAogCQkJCQkJCUFSNUtfU0xFRVBfQ1RMKTsKLQkJdWRlbGF5KDE1KTsKKwkJdXNsZWVwX3JhbmdlKDE1LCAyMCk7CiAKIAkJZm9yIChpID0gMjAwOyBpID4gMDsgaS0tKSB7CiAJCQkvKiBDaGVjayBpZiB0aGUgY2hpcCBkaWQgd2FrZSB1cCAqLwpAQCAtNTAyLDcgKzU2OCw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCS8qIFdhaXQgYSBiaXQgYW5kIHJldHJ5ICovCi0JCQl1ZGVsYXkoNTApOworCQkJdXNsZWVwX3JhbmdlKDUwLCA3NSk7CiAJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEgfCBBUjVLX1NMRUVQX0NUTF9TTEVfV0FLRSwKIAkJCQkJCQlBUjVLX1NMRUVQX0NUTCk7CiAJCX0KQEAgLTUyMywxNyArNTg5LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBQdXQgZGV2aWNlIG9uIGhvbGQKKy8qKgorICogYXRoNWtfaHdfb25faG9sZCgpIC0gUHV0IGRldmljZSBvbiBob2xkCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgotICogUHV0IE1BQyBhbmQgQmFzZWJhbmQgb24gd2FybSByZXNldCBhbmQKLSAqIGtlZXAgdGhhdCBzdGF0ZSAoZG9uJ3QgY2xlYW4gc2xlZXAgY29udHJvbAotICogcmVnaXN0ZXIpLiBBZnRlciB0aGlzIE1BQyBhbmQgQmFzZWJhbmQgYXJlCi0gKiBkaXNhYmxlZCBhbmQgYSBmdWxsIHJlc2V0IGlzIG5lZWRlZCB0byBjb21lCi0gKiBiYWNrLiBUaGlzIHdheSB3ZSBzYXZlIGFzIG11Y2ggcG93ZXIgYXMgcG9zc2libGUKKyAqIFB1dCBNQUMgYW5kIEJhc2ViYW5kIG9uIHdhcm0gcmVzZXQgYW5kIGtlZXAgdGhhdCBzdGF0ZQorICogKGRvbid0IGNsZWFuIHNsZWVwIGNvbnRyb2wgcmVnaXN0ZXIpLiBBZnRlciB0aGlzIE1BQworICogYW5kIEJhc2ViYW5kIGFyZSBkaXNhYmxlZCBhbmQgYSBmdWxsIHJlc2V0IGlzIG5lZWRlZAorICogdG8gY29tZSBiYWNrLiBUaGlzIHdheSB3ZSBzYXZlIGFzIG11Y2ggcG93ZXIgYXMgcG9zc2libGUKICAqIHdpdGhvdXQgcHV0dGluZyB0aGUgY2FyZCBvbiBmdWxsIHNsZWVwLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU8gb24gZXJyb3IKICAqLwotaW50IGF0aDVrX2h3X29uX2hvbGQoc3RydWN0IGF0aDVrX2h3ICphaCkKK2ludAorYXRoNWtfaHdfb25faG9sZChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWgtPnBkZXY7CiAJdTMyIGJ1c19mbGFnczsKQEAgLTU0Myw3ICs2MTIsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIE1ha2Ugc3VyZSBkZXZpY2UgaXMgYXdha2UgKi8KLQlyZXQgPSBhdGg1a19od19zZXRfcG93ZXIoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOworCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcl9tb2RlKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAlpZiAocmV0KSB7CiAJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byB3YWtldXAgdGhlIE1BQyBDaGlwXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTU2Myw3ICs2MzIsNyBAQAogCQlyZXQgPSBhdGg1a19od19uaWNfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8CiAJCQlBUjVLX1JFU0VUX0NUTF9NQUMgfCBBUjVLX1JFU0VUX0NUTF9ETUEgfAogCQkJQVI1S19SRVNFVF9DVExfUEhZIHwgQVI1S19SRVNFVF9DVExfUENJKTsKLQkJCW1kZWxheSgyKTsKKwkJCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKIAl9IGVsc2UgewogCQlyZXQgPSBhdGg1a19od19uaWNfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8CiAJCQlBUjVLX1JFU0VUX0NUTF9CQVNFQkFORCB8IGJ1c19mbGFncyk7CkBAIC01NzUsNyArNjQ0LDcgQEAKIAl9CiAKIAkvKiAuLi53YWtldXAgYWdhaW4hKi8KLQlyZXQgPSBhdGg1a19od19zZXRfcG93ZXIoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOworCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcl9tb2RlKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAlpZiAocmV0KSB7CiAJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byBwdXQgZGV2aWNlIG9uIGhvbGRcbiIpOwogCQlyZXR1cm4gcmV0OwpAQCAtNTg0LDExICs2NTMsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgorLyoqCisgKiBhdGg1a19od19uaWNfd2FrZXVwKCkgLSBGb3JjZSBjYXJkIG91dCBvZiBzbGVlcAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKgogICogQnJpbmcgdXAgTUFDICsgUEhZIENoaXBzIGFuZCBwcm9ncmFtIFBMTAotICogQ2hhbm5lbCBpcyBOVUxMIGZvciB0aGUgaW5pdGlhbCB3YWtldXAuCisgKiBOT1RFOiBDaGFubmVsIGlzIE5VTEwgZm9yIHRoZSBpbml0aWFsIHdha2V1cC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTyBvbiBodyBmYWlsdXJlIG9yIC1FSU5WQUwgZm9yIGZhbHNlIGNoYW5uZWwgaW5mb3MKICAqLwotaW50IGF0aDVrX2h3X25pY193YWtldXAoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQoraW50CithdGg1a19od19uaWNfd2FrZXVwKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFoLT5wZGV2OwogCXUzMiB0dXJibywgbW9kZSwgY2xvY2ssIGJ1c19mbGFnczsKQEAgLTYwMCw3ICs2NzYsNyBAQAogCiAJaWYgKChhdGg1a19nZXRfYnVzX3R5cGUoYWgpICE9IEFUSF9BSEIpIHx8IGNoYW5uZWwpIHsKIAkJLyogV2FrZXVwIHRoZSBkZXZpY2UgKi8KLQkJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKKwkJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyX21vZGUoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOwogCQlpZiAocmV0KSB7CiAJCQlBVEg1S19FUlIoYWgsICJmYWlsZWQgdG8gd2FrZXVwIHRoZSBNQUMgQ2hpcFxuIik7CiAJCQlyZXR1cm4gcmV0OwpAQCAtNjIxLDcgKzY5Nyw3IEBACiAJCXJldCA9IGF0aDVrX2h3X25pY19yZXNldChhaCwgQVI1S19SRVNFVF9DVExfUENVIHwKIAkJCUFSNUtfUkVTRVRfQ1RMX01BQyB8IEFSNUtfUkVTRVRfQ1RMX0RNQSB8CiAJCQlBUjVLX1JFU0VUX0NUTF9QSFkgfCBBUjVLX1JFU0VUX0NUTF9QQ0kpOwotCQkJbWRlbGF5KDIpOworCQkJdXNsZWVwX3JhbmdlKDIwMDAsIDI1MDApOwogCX0gZWxzZSB7CiAJCWlmIChhdGg1a19nZXRfYnVzX3R5cGUoYWgpID09IEFUSF9BSEIpCiAJCQlyZXQgPSBhdGg1a19od193aXNvY19yZXNldChhaCwgQVI1S19SRVNFVF9DVExfUENVIHwKQEAgLTYzNyw3ICs3MTMsNyBAQAogCX0KIAogCS8qIC4uLndha2V1cCBhZ2FpbiEuLi4qLwotCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcihhaCwgQVI1S19QTV9BV0FLRSwgdHJ1ZSwgMCk7CisJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyX21vZGUoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOwogCWlmIChyZXQpIHsKIAkJQVRINUtfRVJSKGFoLCAiZmFpbGVkIHRvIHJlc3VtZSB0aGUgTUFDIENoaXBcbiIpOwogCQlyZXR1cm4gcmV0OwpAQCAtNzM5LDcgKzgxNSw3IEBACiAJCS8qIC4uLnVwZGF0ZSBQTEwgaWYgbmVlZGVkICovCiAJCWlmIChhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfUExMKSAhPSBjbG9jaykgewogCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBjbG9jaywgQVI1S19QSFlfUExMKTsKLQkJCXVkZWxheSgzMDApOworCQkJdXNsZWVwX3JhbmdlKDMwMCwgMzUwKTsKIAkJfQogCiAJCS8qIC4uLnNldCB0aGUgUEhZIG9wZXJhdGluZyBtb2RlICovCkBAIC03NTUsOCArODMxLDE5IEBACiAqIFBvc3QtaW5pdHZhbHMgcmVnaXN0ZXIgbW9kaWZpY2F0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIFRPRE86IEhhbGYvUXVhcnRlciByYXRlICovCi1zdGF0aWMgdm9pZCBhdGg1a19od190d2Vha19pbml0dmFsX3NldHRpbmdzKHN0cnVjdCBhdGg1a19odyAqYWgsCisvKioKKyAqIGF0aDVrX2h3X3R3ZWFrX2luaXR2YWxfc2V0dGluZ3MoKSAtIFR3ZWFrIGluaXRpYWwgc2V0dGluZ3MKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIFNvbWUgc2V0dGluZ3MgYXJlIG5vdCBoYW5kbGVkIG9uIGluaXR2YWxzLCBlLmcuIGJ3bW9kZQorICogc2V0dGluZ3MsIHNvbWUgcGh5IHNldHRpbmdzLCB3b3JrYXJvdW5kcyBldGMgdGhhdCBpbiBnZW5lcmFsCisgKiBkb24ndCBmaXQgYW55d2hlcmUgZWxzZSBvciBhcmUgdG9vIHNtYWxsIHRvIGludHJvZHVjZSBhIHNlcGFyYXRlCisgKiBmdW5jdGlvbiBmb3IgZWFjaCBvbmUuIFNvIHdlIGhhdmUgdGhpcyBmdW5jdGlvbiB0byBoYW5kbGUKKyAqIHRoZW0gYWxsIGR1cmluZyByZXNldCBhbmQgY29tcGxldGUgY2FyZCdzIGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgdm9pZAorYXRoNWtfaHdfdHdlYWtfaW5pdHZhbF9zZXR0aW5ncyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIgJiYKQEAgLTg3NSw3ICs5NjIsMTYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDVrX2h3X2NvbW1pdF9lZXByb21fc2V0dGluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKKy8qKgorICogYXRoNWtfaHdfY29tbWl0X2VlcHJvbV9zZXR0aW5ncygpIC0gQ29tbWl0IHNldHRpbmdzIGZyb20gRUVQUk9NCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBVc2Ugc2V0dGluZ3Mgc3RvcmVkIG9uIEVFUFJPTSB0byBwcm9wZXJseSBpbml0aWFsaXplIHRoZSBjYXJkCisgKiBiYXNlZCBvbiB2YXJpb3VzIGluZm9zIGFuZCBwZXItbW9kZSBjYWxpYnJhdGlvbiBkYXRhLgorICovCitzdGF0aWMgdm9pZAorYXRoNWtfaHdfY29tbWl0X2VlcHJvbV9zZXR0aW5ncyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CkBAIC0xMDI5LDcgKzExMjUsMjMgQEAKICogTWFpbiByZXNldCBmdW5jdGlvbiAqCiBcKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgYXRoNWtfaHdfcmVzZXQoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBubDgwMjExX2lmdHlwZSBvcF9tb2RlLAorLyoqCisgKiBhdGg1a19od19yZXNldCgpIC0gVGhlIG1haW4gcmVzZXQgZnVuY3Rpb24KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBvcF9tb2RlOiBPbmUgb2YgZW51bSBubDgwMjExX2lmdHlwZQorICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAZmFzdDogRW5hYmxlIGZhc3QgY2hhbm5lbCBzd2l0Y2hpbmcKKyAqIEBza2lwX3BjdTogU2tpcCBwY3UgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB3ZSBjYWxsIGVhY2ggdGltZSB3ZSB3YW50IHRvIChyZSlpbml0aWFsaXplIHRoZQorICogY2FyZCBhbmQgcGFzcyBuZXcgc2V0dGluZ3MgdG8gaHcuIFdlIGFsc28gY2FsbCBpdCB3aGVuIGh3IHJ1bnMgaW50bworICogdHJvdWJsZSB0byBtYWtlIGl0IGNvbWUgYmFjayB0byBhIHdvcmtpbmcgc3RhdGUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gZmFsc2Ugb3BfbW9kZSBvciBjaGFubmVsIGluZm9zLCBvciAtRUlPCisgKiBvbiBmYWlsdXJlLgorICovCitpbnQKK2F0aDVrX2h3X3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCBib29sIGZhc3QsIGJvb2wgc2tpcF9wY3UpCiB7CiAJdTMyIHNfc2VxWzEwXSwgc19sZWRbM10sIHRzZl91cCwgdHNmX2xvOwpAQCAtMTI0Miw3ICsxMzU0LDcgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgUENVCiAJICovCi0JYXRoNWtfaHdfcGN1X2luaXQoYWgsIG9wX21vZGUsIG1vZGUpOworCWF0aDVrX2h3X3BjdV9pbml0KGFoLCBvcF9tb2RlKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBQSFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmJ1ZmZlci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmgKaW5kZXggNWQxMWMyMy4uYWVkMzRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmgKQEAgLTE4LDcgKzE4LDkgQEAKICAqLwogCiAKLS8qCisvKioKKyAqIERPQzogUkYgQnVmZmVyIHJlZ2lzdGVycworICoKICAqIFRoZXJlIGFyZSBzb21lIHNwZWNpYWwgcmVnaXN0ZXJzIG9uIHRoZSBSRiBjaGlwCiAgKiB0aGF0IGNvbnRyb2wgdmFyaW91cyBvcGVyYXRpb24gc2V0dGluZ3MgcmVsYXRlZCBtb3N0bHkgdG8KICAqIHRoZSBhbmFsb2cgcGFydHMgKGNoYW5uZWwsIGdhaW4gYWRqdXN0bWVudCBldGMpLgpAQCAtNDQsNDAgKzQ2LDYzIEBACiAgKi8KIAogCi0vKgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaW5pX3JmYnVmZmVyIC0gSW5pdGlhbCBSRiBCdWZmZXIgc2V0dGluZ3MKKyAqIEByZmJfYmFuazogUkYgQmFuayBudW1iZXIKKyAqIEByZmJfY3RybF9yZWdpc3RlcjogUkYgQnVmZmVyIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIEByZmJfbW9kZV9kYXRhOiBSRiBCdWZmZXIgZGF0YSBmb3IgZWFjaCBtb2RlCisgKgogICogU3RydWN0IHRvIGhvbGQgZGVmYXVsdCBtb2RlIHNwZWNpZmljIFJGCi0gKiByZWdpc3RlciB2YWx1ZXMgKFJGIEJhbmtzKQorICogcmVnaXN0ZXIgdmFsdWVzIChSRiBCYW5rcykgZm9yIGVhY2ggY2hpcC4KICAqLwogc3RydWN0IGF0aDVrX2luaV9yZmJ1ZmZlciB7Ci0JdTgJcmZiX2Jhbms7CQkvKiBSRiBCYW5rIG51bWJlciAqLwotCXUxNglyZmJfY3RybF9yZWdpc3RlcjsJLyogUkYgQnVmZmVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQl1MzIJcmZiX21vZGVfZGF0YVszXTsJLyogUkYgQnVmZmVyIGRhdGEgZm9yIGVhY2ggbW9kZSAqLworCXU4CXJmYl9iYW5rOworCXUxNglyZmJfY3RybF9yZWdpc3RlcjsKKwl1MzIJcmZiX21vZGVfZGF0YVszXTsKIH07CiAKLS8qCisvKioKKyAqIHN0cnVjdCBhdGg1a19yZmJfZmllbGQgLSBBbiBSRiBCdWZmZXIgZmllbGQgKHJlZ2lzdGVyL3ZhbHVlKQorICogQGxlbjogRmllbGQgbGVuZ3RoCisgKiBAcG9zOiBPZmZzZXQgb24gdGhlIHJhdyBwYWNrZXQKKyAqIEBjb2w6IFVzZWQgZm9yIHNoaWZ0aW5nCisgKgogICogU3RydWN0IHRvIGhvbGQgUkYgQnVmZmVyIGZpZWxkCiAgKiBpbmZvcyB1c2VkIHRvIGFjY2VzcyBjZXJ0YWluIFJGCiAgKiBhbmFsb2cgcmVnaXN0ZXJzCiAgKi8KIHN0cnVjdCBhdGg1a19yZmJfZmllbGQgewotCXU4CWxlbjsJLyogRmllbGQgbGVuZ3RoICovCi0JdTE2CXBvczsJLyogT2Zmc2V0IG9uIHRoZSByYXcgcGFja2V0ICovCi0JdTgJY29sOwkvKiBDb2x1bW4gLXVzZWQgZm9yIHNoaWZ0aW5nICovCisJdTgJbGVuOworCXUxNglwb3M7CisJdTgJY29sOwogfTsKIAotLyoKLSAqIFJGIGFuYWxvZyByZWdpc3RlciBkZWZpbml0aW9uCisvKioKKyAqIHN0cnVjdCBhdGg1a19yZl9yZWcgLSBSRiBhbmFsb2cgcmVnaXN0ZXIgZGVmaW5pdGlvbgorICogQGJhbms6IFJGIEJ1ZmZlciBCYW5rIG51bWJlcgorICogQGluZGV4OiBSZWdpc3RlcidzIGluZGV4IG9uIGF0aDVrX3JmX3JlZ3hfaWR4CisgKiBAZmllbGQ6IFRoZSAmc3RydWN0IGF0aDVrX3JmYl9maWVsZAorICoKKyAqIFdlIHVzZSB0aGlzIHN0cnVjdCB0byBkZWZpbmUgdGhlIHNldCBvZiBSRiByZWdpc3RlcnMKKyAqIG9uIGVhY2ggY2hpcCB0aGF0IHdlIHdhbnQgdG8gdHdlYWsuIFNvbWUgUkYgcmVnaXN0ZXJzCisgKiBhcmUgY29tbW9uIGJldHdlZW4gZGlmZmVyZW50IGNoaXAgdmVyc2lvbnMgc28gdGhpcyBzYXZlcworICogdXMgc3BhY2UgYW5kIGNvbXBsZXhpdHkgYmVjYXVzZSB3ZSBjYW4gcmVmZXIgdG8gYW4gcmYKKyAqIHJlZ2lzdGVyIGJ5IGl0J3MgaW5kZXggbm8gbWF0dGVyIHdoYXQgY2hpcCB3ZSB3b3JrIHdpdGgKKyAqIGFzIGxvbmcgYXMgaXQgaGFzIHRoYXQgcmVnaXN0ZXIuCiAgKi8KIHN0cnVjdCBhdGg1a19yZl9yZWcgewotCXU4CQkJYmFuazsJLyogUkYgQnVmZmVyIEJhbmsgbnVtYmVyICovCi0JdTgJCQlpbmRleDsJLyogUmVnaXN0ZXIncyBpbmRleCBvbiByZl9yZWdzX2lkeCAqLwotCXN0cnVjdCBhdGg1a19yZmJfZmllbGQJZmllbGQ7CS8qIFJGIEJ1ZmZlciBmaWVsZCBmb3IgdGhpcyByZWdpc3RlciAqLworCXU4CQkJYmFuazsKKwl1OAkJCWluZGV4OworCXN0cnVjdCBhdGg1a19yZmJfZmllbGQJZmllbGQ7CiB9OwogCi0vKiBNYXAgUkYgcmVnaXN0ZXJzIHRvIGluZGV4ZXMKKy8qKgorICogZW51bSBhdGg1a19yZl9yZWdzX2lkeCAtIE1hcCBSRiByZWdpc3RlcnMgdG8gaW5kZXhlcworICoKICAqIFdlIGRvIHRoaXMgdG8gaGFuZGxlIGNvbW1vbiBiaXRzIGFuZCBtYWtlIG91cgogICogbGlmZSBlYXNpZXIgYnkgdXNpbmcgYW4gaW5kZXggZm9yIGVhY2ggcmVnaXN0ZXIKLSAqIGluc3RlYWQgb2YgYSBmdWxsIHJmYl9maWVsZCAqLworICogaW5zdGVhZCBvZiBhIGZ1bGwgcmZiX2ZpZWxkCisgKi8KIGVudW0gYXRoNWtfcmZfcmVnc19pZHggewogCS8qIEJBTksgMiAqLwogCUFSNUtfUkZfVFVSQk8gPSAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmZ2Fpbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmZ2Fpbi5oCmluZGV4IGViZmFlMDUuLjRkMjFkZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmdhaW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmZnYWluLmgKQEAgLTE4LDEzICsxOCwxNyBAQAogICoKICAqLwogCi0vKgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaW5pX3JmZ2FpbiAtIFJGIEdhaW4gdGFibGUKKyAqIEByZmdfcmVnaXN0ZXI6IFJGIEdhaW4gcmVnaXN0ZXIgYWRkcmVzcworICogQHJmZ192YWx1ZTogUmVnaXN0ZXIgdmFsdWUgZm9yIDUgYW5kIDJHSHoKKyAqCiAgKiBNb2RlLXNwZWNpZmljIFJGIEdhaW4gdGFibGUgKDY0Ynl0ZXMpIGZvciBSRjUxMTEvNTExMgogICogKFJGNTExMCBvbmx5IGNvbWVzIHdpdGggQVI1MjEwIGFuZCBvbmx5IHN1cHBvcnRzIGEvdHVyYm8gYSBtb2RlIHNvIGluaXRpYWwKICAqIFJGIEdhaW4gdmFsdWVzIGFyZSBpbmNsdWRlZCBpbiBBUjVLX0FSNTIxMF9JTkkpCiAgKi8KIHN0cnVjdCBhdGg1a19pbmlfcmZnYWluIHsKLQl1MTYJcmZnX3JlZ2lzdGVyOwkvKiBSRiBHYWluIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwl1MTYJcmZnX3JlZ2lzdGVyOwogCXUzMglyZmdfdmFsdWVbMl07CS8qIFtmcmVxIChzZWUgYmVsb3cpXSAqLwogfTsKIApAQCAtNDU1LDE4ICs0NTksMzEgQEAKICNkZWZpbmUgQVI1S19HQUlOX0NIRUNLX0FESlVTVChfZykJCVwKIAkoKF9nKS0+Z19jdXJyZW50IDw9IChfZyktPmdfbG93IHx8IChfZyktPmdfY3VycmVudCA+PSAoX2cpLT5nX2hpZ2gpCiAKKy8qKgorICogc3RydWN0IGF0aDVrX2dhaW5fb3B0X3N0ZXAgLSBBbiBSRiBnYWluIG9wdGltaXphdGlvbiBzdGVwCisgKiBAZ29zX3BhcmFtOiBTZXQgb2YgcGFyYW1ldGVycworICogQGdvc19nYWluOiBHYWluCisgKi8KIHN0cnVjdCBhdGg1a19nYWluX29wdF9zdGVwIHsKIAlzOAkJCQlnb3NfcGFyYW1bQVI1S19HQUlOX0NSTl9NQVhfRklYX0JJVFNdOwogCXM4CQkJCWdvc19nYWluOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHQgLSBSRiBHYWluIG9wdGltaXphdGlvbiBsYWRkZXIKKyAqIEBnb19kZWZhdWx0OiBUaGUgZGVmYXVsdCBzdGVwCisgKiBAZ29fc3RlcHNfY291bnQ6IEhvdyBtYW55IG9wdGltaXphdGlvbiBzdGVwcworICogQGdvX3N0ZXA6IEFycmF5IG9mICZzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcAorICovCiBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHQgewogCXU4CQkJCWdvX2RlZmF1bHQ7CiAJdTgJCQkJZ29fc3RlcHNfY291bnQ7CiAJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0X3N0ZXAJZ29fc3RlcFtBUjVLX0dBSU5fU1RFUF9DT1VOVF07CiB9OwogCisKIC8qCisgKiBSRjUxMTEKICAqIFBhcmFtZXRlcnMgb24gZ29zX3BhcmFtOgogICogMSkgVHggY2xpcCBQSFkgcmVnaXN0ZXIKICAqIDIpIFBXRCA5MCBSRiByZWdpc3RlcgpAQCAtNDkwLDYgKzUwNyw3IEBACiB9OwogCiAvKgorICogUkY1MTEyCiAgKiBQYXJhbWV0ZXJzIG9uIGdvc19wYXJhbToKICAqIDEpIE1peGdhaW4gb3ZyIFJGIHJlZ2lzdGVyCiAgKiAyKSBQV0QgMTM4IFJGIHJlZ2lzdGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9NYWtlZmlsZQppbmRleCA4ZjdhMGQxLi43MDcwNjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvTWFrZWZpbGUKQEAgLTIzLDcgKzIzLDcgQEAKIAogb2JqLSQoQ09ORklHX0FUSDZLTCkgOj0gYXRoNmtsLm8KIGF0aDZrbC15ICs9IGRlYnVnLm8KLWF0aDZrbC15ICs9IGh0Y19oaWYubworYXRoNmtsLXkgKz0gaGlmLm8KIGF0aDZrbC15ICs9IGh0Yy5vCiBhdGg2a2wteSArPSBibWkubwogYXRoNmtsLXkgKz0gY2ZnODAyMTEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9ibWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvYm1pLmMKaW5kZXggYzVkMTFjYy4uYTk2MmZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9ibWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2JtaS5jCkBAIC0xOTYsOCArMTk2LDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlhdGg2a2xfYm1pX2NsZWFudXAoYXIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY3Miw2ICs2NzAsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCit2b2lkIGF0aDZrbF9ibWlfcmVzZXQoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJYXItPmJtaS5kb25lX3NlbnQgPSBmYWxzZTsKK30KKwogaW50IGF0aDZrbF9ibWlfaW5pdChzdHJ1Y3QgYXRoNmtsICphcikKIHsKIAlhci0+Ym1pLmNtZF9idWYgPSBremFsbG9jKE1BWF9CTUlfQ01EQlVGX1NaLCBHRlBfQVRPTUlDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvYm1pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2JtaS5oCmluZGV4IDk2ODUxZDUuLjAwOWU4ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvYm1pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9ibWkuaApAQCAtMjMwLDYgKzIzMCw4IEBACiAKIGludCBhdGg2a2xfYm1pX2luaXQoc3RydWN0IGF0aDZrbCAqYXIpOwogdm9pZCBhdGg2a2xfYm1pX2NsZWFudXAoc3RydWN0IGF0aDZrbCAqYXIpOwordm9pZCBhdGg2a2xfYm1pX3Jlc2V0KHN0cnVjdCBhdGg2a2wgKmFyKTsKKwogaW50IGF0aDZrbF9ibWlfZG9uZShzdHJ1Y3QgYXRoNmtsICphcik7CiBpbnQgYXRoNmtsX2JtaV9nZXRfdGFyZ2V0X2luZm8oc3RydWN0IGF0aDZrbCAqYXIsCiAJCQkgICAgICAgc3RydWN0IGF0aDZrbF9ibWlfdGFyZ2V0X2luZm8gKnRhcmdfaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMKaW5kZXggM2FmZjM2Yi4uMDI1MjYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYwpAQCAtMTQsNiArMTQsOCBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKwogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJjZmc4MDIxMS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC0yMSw4ICsyMywxMCBAQAogI2luY2x1ZGUgInRlc3Rtb2RlLmgiCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXRoNmtsX3AycDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXVsdGlfbm9ybV9pZl9zdXBwb3J0OwogCiBtb2R1bGVfcGFyYW0oYXRoNmtsX3AycCwgdWludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0obXVsdGlfbm9ybV9pZl9zdXBwb3J0LCB1aW50LCAwNjQ0KTsKIAogI2RlZmluZSBSQVRFVEFCX0VOVChfcmF0ZSwgX3JhdGVpZCwgX2ZsYWdzKSB7ICAgXAogCS5iaXRyYXRlICAgID0gKF9yYXRlKSwgICAgICAgICAgICAgICAgICBcCkBAIC0xMjEsMTcgKzEyNSwxOSBAQAogCS5iaXRyYXRlcyA9IGF0aDZrbF9hX3JhdGVzLAogfTsKIAotc3RhdGljIGludCBhdGg2a2xfc2V0X3dwYV92ZXJzaW9uKHN0cnVjdCBhdGg2a2wgKmFyLAorI2RlZmluZSBDQ0tNX0tSS19DSVBIRVJfU1VJVEUgMHgwMDQwOTZmZiAvKiB1c2UgZm9yIEtSSyAqLworCitzdGF0aWMgaW50IGF0aDZrbF9zZXRfd3BhX3ZlcnNpb24oc3RydWN0IGF0aDZrbF92aWYgKnZpZiwKIAkJCQkgIGVudW0gbmw4MDIxMV93cGFfdmVyc2lvbnMgd3BhX3ZlcnNpb24pCiB7CiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6ICV1XG4iLCBfX2Z1bmNfXywgd3BhX3ZlcnNpb24pOwogCiAJaWYgKCF3cGFfdmVyc2lvbikgewotCQlhci0+YXV0aF9tb2RlID0gTk9ORV9BVVRIOworCQl2aWYtPmF1dGhfbW9kZSA9IE5PTkVfQVVUSDsKIAl9IGVsc2UgaWYgKHdwYV92ZXJzaW9uICYgTkw4MDIxMV9XUEFfVkVSU0lPTl8yKSB7Ci0JCWFyLT5hdXRoX21vZGUgPSBXUEEyX0FVVEg7CisJCXZpZi0+YXV0aF9tb2RlID0gV1BBMl9BVVRIOwogCX0gZWxzZSBpZiAod3BhX3ZlcnNpb24gJiBOTDgwMjExX1dQQV9WRVJTSU9OXzEpIHsKLQkJYXItPmF1dGhfbW9kZSA9IFdQQV9BVVRIOworCQl2aWYtPmF1dGhfbW9kZSA9IFdQQV9BVVRIOwogCX0gZWxzZSB7CiAJCWF0aDZrbF9lcnIoIiVzOiAldSBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgd3BhX3ZlcnNpb24pOwogCQlyZXR1cm4gLUVOT1RTVVBQOwpAQCAtMTQwLDI1ICsxNDYsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2V0X2F1dGhfdHlwZShzdHJ1Y3QgYXRoNmtsICphciwKK3N0YXRpYyBpbnQgYXRoNmtsX3NldF9hdXRoX3R5cGUoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwKIAkJCQllbnVtIG5sODAyMTFfYXV0aF90eXBlIGF1dGhfdHlwZSkKIHsKLQogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiAweCV4XG4iLCBfX2Z1bmNfXywgYXV0aF90eXBlKTsKIAogCXN3aXRjaCAoYXV0aF90eXBlKSB7CiAJY2FzZSBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNOgotCQlhci0+ZG90MTFfYXV0aF9tb2RlID0gT1BFTl9BVVRIOworCQl2aWYtPmRvdDExX2F1dGhfbW9kZSA9IE9QRU5fQVVUSDsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0FVVEhUWVBFX1NIQVJFRF9LRVk6Ci0JCWFyLT5kb3QxMV9hdXRoX21vZGUgPSBTSEFSRURfQVVUSDsKKwkJdmlmLT5kb3QxMV9hdXRoX21vZGUgPSBTSEFSRURfQVVUSDsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0FVVEhUWVBFX05FVFdPUktfRUFQOgotCQlhci0+ZG90MTFfYXV0aF9tb2RlID0gTEVBUF9BVVRIOworCQl2aWYtPmRvdDExX2F1dGhfbW9kZSA9IExFQVBfQVVUSDsKIAkJYnJlYWs7CiAKIAljYXNlIE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDOgotCQlhci0+ZG90MTFfYXV0aF9tb2RlID0gT1BFTl9BVVRIIHwgU0hBUkVEX0FVVEg7CisJCXZpZi0+ZG90MTFfYXV0aF9tb2RlID0gT1BFTl9BVVRIIHwgU0hBUkVEX0FVVEg7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTE2OSwxMSArMTc0LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3NldF9jaXBoZXIoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBjaXBoZXIsIGJvb2wgdWNhc3QpCitzdGF0aWMgaW50IGF0aDZrbF9zZXRfY2lwaGVyKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHUzMiBjaXBoZXIsIGJvb2wgdWNhc3QpCiB7Ci0JdTggKmFyX2NpcGhlciA9IHVjYXN0ID8gJmFyLT5wcndpc2VfY3J5cHRvIDogJmFyLT5ncnBfY3J5cHRvOwotCXU4ICphcl9jaXBoZXJfbGVuID0gdWNhc3QgPyAmYXItPnByd2lzZV9jcnlwdG9fbGVuIDoKLQkJJmFyLT5ncnBfY3J5cHRvX2xlbjsKKwl1OCAqYXJfY2lwaGVyID0gdWNhc3QgPyAmdmlmLT5wcndpc2VfY3J5cHRvIDogJnZpZi0+Z3JwX2NyeXB0bzsKKwl1OCAqYXJfY2lwaGVyX2xlbiA9IHVjYXN0ID8gJnZpZi0+cHJ3aXNlX2NyeXB0b19sZW4gOgorCQkmdmlmLT5ncnBfY3J5cHRvX2xlbjsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBjaXBoZXIgMHgleCwgdWNhc3QgJXVcbiIsCiAJCSAgIF9fZnVuY19fLCBjaXBoZXIsIHVjYXN0KTsKQEAgLTIwOCwyOCArMjEzLDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDZrbF9zZXRfa2V5X21nbXQoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBrZXlfbWdtdCkKK3N0YXRpYyB2b2lkIGF0aDZrbF9zZXRfa2V5X21nbXQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTMyIGtleV9tZ210KQogewogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiAweCV4XG4iLCBfX2Z1bmNfXywga2V5X21nbXQpOwogCiAJaWYgKGtleV9tZ210ID09IFdMQU5fQUtNX1NVSVRFX1BTSykgewotCQlpZiAoYXItPmF1dGhfbW9kZSA9PSBXUEFfQVVUSCkKLQkJCWFyLT5hdXRoX21vZGUgPSBXUEFfUFNLX0FVVEg7Ci0JCWVsc2UgaWYgKGFyLT5hdXRoX21vZGUgPT0gV1BBMl9BVVRIKQotCQkJYXItPmF1dGhfbW9kZSA9IFdQQTJfUFNLX0FVVEg7CisJCWlmICh2aWYtPmF1dGhfbW9kZSA9PSBXUEFfQVVUSCkKKwkJCXZpZi0+YXV0aF9tb2RlID0gV1BBX1BTS19BVVRIOworCQllbHNlIGlmICh2aWYtPmF1dGhfbW9kZSA9PSBXUEEyX0FVVEgpCisJCQl2aWYtPmF1dGhfbW9kZSA9IFdQQTJfUFNLX0FVVEg7CisJfSBlbHNlIGlmIChrZXlfbWdtdCA9PSAweDAwNDA5NjAwKSB7CisJCWlmICh2aWYtPmF1dGhfbW9kZSA9PSBXUEFfQVVUSCkKKwkJCXZpZi0+YXV0aF9tb2RlID0gV1BBX0FVVEhfQ0NLTTsKKwkJZWxzZSBpZiAodmlmLT5hdXRoX21vZGUgPT0gV1BBMl9BVVRIKQorCQkJdmlmLT5hdXRoX21vZGUgPSBXUEEyX0FVVEhfQ0NLTTsKIAl9IGVsc2UgaWYgKGtleV9tZ210ICE9IFdMQU5fQUtNX1NVSVRFXzgwMjFYKSB7Ci0JCWFyLT5hdXRoX21vZGUgPSBOT05FX0FVVEg7CisJCXZpZi0+YXV0aF9tb2RlID0gTk9ORV9BVVRIOwogCX0KIH0KIAotc3RhdGljIGJvb2wgYXRoNmtsX2NmZzgwMjExX3JlYWR5KHN0cnVjdCBhdGg2a2wgKmFyKQorc3RhdGljIGJvb2wgYXRoNmtsX2NmZzgwMjExX3JlYWR5KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOworCiAJaWYgKCF0ZXN0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZykpIHsKIAkJYXRoNmtsX2Vycigid21pIGlzIG5vdCByZWFkeVxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlpZiAoIXRlc3RfYml0KFdMQU5fRU5BQkxFRCwgJmFyLT5mbGFnKSkgeworCWlmICghdGVzdF9iaXQoV0xBTl9FTkFCTEVELCAmdmlmLT5mbGFncykpIHsKIAkJYXRoNmtsX2Vycigid2xhbiBkaXNhYmxlZFxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0yMzcsMTUgKzI0OSwxNDMgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGJvb2wgYXRoNmtsX2lzX3dwYV9pZShjb25zdCB1OCAqcG9zKQoreworCXJldHVybiBwb3NbMF0gPT0gV0xBTl9FSURfV1BBICYmIHBvc1sxXSA+PSA0ICYmCisJCXBvc1syXSA9PSAweDAwICYmIHBvc1szXSA9PSAweDUwICYmCisJCXBvc1s0XSA9PSAweGYyICYmIHBvc1s1XSA9PSAweDAxOworfQorCitzdGF0aWMgYm9vbCBhdGg2a2xfaXNfcnNuX2llKGNvbnN0IHU4ICpwb3MpCit7CisJcmV0dXJuIHBvc1swXSA9PSBXTEFOX0VJRF9SU047Cit9CisKK3N0YXRpYyBib29sIGF0aDZrbF9pc193cHNfaWUoY29uc3QgdTggKnBvcykKK3sKKwlyZXR1cm4gKHBvc1swXSA9PSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMgJiYKKwkJcG9zWzFdID49IDQgJiYKKwkJcG9zWzJdID09IDB4MDAgJiYgcG9zWzNdID09IDB4NTAgJiYgcG9zWzRdID09IDB4ZjIgJiYKKwkJcG9zWzVdID09IDB4MDQpOworfQorCitzdGF0aWMgaW50IGF0aDZrbF9zZXRfYXNzb2NfcmVxX2llcyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBjb25zdCB1OCAqaWVzLAorCQkJCSAgICBzaXplX3QgaWVzX2xlbikKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CisJY29uc3QgdTggKnBvczsKKwl1OCAqYnVmID0gTlVMTDsKKwlzaXplX3QgbGVuID0gMDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBDbGVhciBwcmV2aW91c2x5IHNldCBmbGFnCisJICovCisKKwlhci0+Y29ubmVjdF9jdHJsX2ZsYWdzICY9IH5DT05ORUNUX1dQU19GTEFHOworCisJLyoKKwkgKiBGaWx0ZXIgb3V0IFJTTi9XUEEgSUUocykKKwkgKi8KKworCWlmIChpZXMgJiYgaWVzX2xlbikgeworCQlidWYgPSBrbWFsbG9jKGllc19sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcG9zID0gaWVzOworCisJCXdoaWxlIChwb3MgKyAxIDwgaWVzICsgaWVzX2xlbikgeworCQkJaWYgKHBvcyArIDIgKyBwb3NbMV0gPiBpZXMgKyBpZXNfbGVuKQorCQkJCWJyZWFrOworCQkJaWYgKCEoYXRoNmtsX2lzX3dwYV9pZShwb3MpIHx8IGF0aDZrbF9pc19yc25faWUocG9zKSkpIHsKKwkJCQltZW1jcHkoYnVmICsgbGVuLCBwb3MsIDIgKyBwb3NbMV0pOworCQkJCWxlbiArPSAyICsgcG9zWzFdOworCQkJfQorCisJCQlpZiAoYXRoNmtsX2lzX3dwc19pZShwb3MpKQorCQkJCWFyLT5jb25uZWN0X2N0cmxfZmxhZ3MgfD0gQ09OTkVDVF9XUFNfRkxBRzsKKworCQkJcG9zICs9IDIgKyBwb3NbMV07CisJCX0KKwl9CisKKwlyZXQgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCSAgICAgICBXTUlfRlJBTUVfQVNTT0NfUkVRLCBidWYsIGxlbik7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDZrbF9ubGlmdHlwZV90b19kcnZfaWZ0eXBlKGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTggKm53X3R5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQkqbndfdHlwZSA9IElORlJBX05FVFdPUks7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCSpud190eXBlID0gQURIT0NfTkVUV09SSzsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwkJKm53X3R5cGUgPSBBUF9ORVRXT1JLOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CisJCSpud190eXBlID0gSU5GUkFfTkVUV09SSzsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CisJCSpud190eXBlID0gQVBfTkVUV09SSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXRoNmtsX2VycigiaW52YWxpZCBpbnRlcmZhY2UgdHlwZSAldVxuIiwgdHlwZSk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGF0aDZrbF9pc192YWxpZF9pZnR5cGUoc3RydWN0IGF0aDZrbCAqYXIsIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKKwkJCQkgICB1OCAqaWZfaWR4LCB1OCAqbndfdHlwZSkKK3sKKwlpbnQgaTsKKworCWlmIChhdGg2a2xfbmxpZnR5cGVfdG9fZHJ2X2lmdHlwZSh0eXBlLCBud190eXBlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGFyLT5pYnNzX2lmX2FjdGl2ZSB8fCAoKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpICYmCisJICAgIGFyLT5udW1fdmlmKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCSAgICB0eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8IHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVklGOyBpKyspIHsKKwkJCWlmICgoYXItPmF2YWlsX2lkeF9tYXAgPj4gaSkgJiBCSVQoMCkpIHsKKwkJCQkqaWZfaWR4ID0gaTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCWlmICh0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQgfHwKKwkgICAgdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfR08pIHsKKwkJZm9yIChpID0gYXItPm1heF9ub3JtX2lmYWNlOyBpIDwgTUFYX05VTV9WSUY7IGkrKykgeworCQkJaWYgKChhci0+YXZhaWxfaWR4X21hcCA+PiBpKSAmIEJJVCgwKSkgeworCQkJCSppZl9pZHggPSBpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgaW50IGF0aDZrbF9jZmc4MDIxMV9jb25uZWN0KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBzdGF0dXM7CiAKLQlhci0+c21lX3N0YXRlID0gU01FX0NPTk5FQ1RJTkc7CisJdmlmLT5zbWVfc3RhdGUgPSBTTUVfQ09OTkVDVElORzsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAogCWlmICh0ZXN0X2JpdChERVNUUk9ZX0lOX1BST0dSRVNTLCAmYXItPmZsYWcpKSB7CkBAIC0yODUsMTIgKzQyNSwxOSBAQAogCQl9CiAJfQogCi0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSAmJgotCSAgICBhci0+c3NpZF9sZW4gPT0gc21lLT5zc2lkX2xlbiAmJgotCSAgICAhbWVtY21wKGFyLT5zc2lkLCBzbWUtPnNzaWQsIGFyLT5zc2lkX2xlbikpIHsKLQkJYXItPnJlY29ubmVjdF9mbGFnID0gdHJ1ZTsKLQkJc3RhdHVzID0gYXRoNmtsX3dtaV9yZWNvbm5lY3RfY21kKGFyLT53bWksIGFyLT5yZXFfYnNzaWQsCi0JCQkJCQkgIGFyLT5jaF9oaW50KTsKKwlpZiAoc21lLT5pZSAmJiAoc21lLT5pZV9sZW4gPiAwKSkgeworCQlzdGF0dXMgPSBhdGg2a2xfc2V0X2Fzc29jX3JlcV9pZXModmlmLCBzbWUtPmllLCBzbWUtPmllX2xlbik7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSAmJgorCSAgICB2aWYtPnNzaWRfbGVuID09IHNtZS0+c3NpZF9sZW4gJiYKKwkgICAgIW1lbWNtcCh2aWYtPnNzaWQsIHNtZS0+c3NpZCwgdmlmLT5zc2lkX2xlbikpIHsKKwkJdmlmLT5yZWNvbm5lY3RfZmxhZyA9IHRydWU7CisJCXN0YXR1cyA9IGF0aDZrbF93bWlfcmVjb25uZWN0X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgIHZpZi0+cmVxX2Jzc2lkLAorCQkJCQkJICB2aWYtPmNoX2hpbnQpOwogCiAJCXVwKCZhci0+c2VtKTsKIAkJaWYgKHN0YXR1cykgewpAQCAtMjk4LDQyICs0NDUsNDMgQEAKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCXJldHVybiAwOwotCX0gZWxzZSBpZiAoYXItPnNzaWRfbGVuID09IHNtZS0+c3NpZF9sZW4gJiYKLQkJICAgIW1lbWNtcChhci0+c3NpZCwgc21lLT5zc2lkLCBhci0+c3NpZF9sZW4pKSB7Ci0JCWF0aDZrbF9kaXNjb25uZWN0KGFyKTsKKwl9IGVsc2UgaWYgKHZpZi0+c3NpZF9sZW4gPT0gc21lLT5zc2lkX2xlbiAmJgorCQkgICAhbWVtY21wKHZpZi0+c3NpZCwgc21lLT5zc2lkLCB2aWYtPnNzaWRfbGVuKSkgeworCQlhdGg2a2xfZGlzY29ubmVjdCh2aWYpOwogCX0KIAotCW1lbXNldChhci0+c3NpZCwgMCwgc2l6ZW9mKGFyLT5zc2lkKSk7Ci0JYXItPnNzaWRfbGVuID0gc21lLT5zc2lkX2xlbjsKLQltZW1jcHkoYXItPnNzaWQsIHNtZS0+c3NpZCwgc21lLT5zc2lkX2xlbik7CisJbWVtc2V0KHZpZi0+c3NpZCwgMCwgc2l6ZW9mKHZpZi0+c3NpZCkpOworCXZpZi0+c3NpZF9sZW4gPSBzbWUtPnNzaWRfbGVuOworCW1lbWNweSh2aWYtPnNzaWQsIHNtZS0+c3NpZCwgc21lLT5zc2lkX2xlbik7CiAKIAlpZiAoc21lLT5jaGFubmVsKQotCQlhci0+Y2hfaGludCA9IHNtZS0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisJCXZpZi0+Y2hfaGludCA9IHNtZS0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXE7CiAKLQltZW1zZXQoYXItPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKGFyLT5yZXFfYnNzaWQpKTsKKwltZW1zZXQodmlmLT5yZXFfYnNzaWQsIDAsIHNpemVvZih2aWYtPnJlcV9ic3NpZCkpOwogCWlmIChzbWUtPmJzc2lkICYmICFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihzbWUtPmJzc2lkKSkKLQkJbWVtY3B5KGFyLT5yZXFfYnNzaWQsIHNtZS0+YnNzaWQsIHNpemVvZihhci0+cmVxX2Jzc2lkKSk7CisJCW1lbWNweSh2aWYtPnJlcV9ic3NpZCwgc21lLT5ic3NpZCwgc2l6ZW9mKHZpZi0+cmVxX2Jzc2lkKSk7CiAKLQlhdGg2a2xfc2V0X3dwYV92ZXJzaW9uKGFyLCBzbWUtPmNyeXB0by53cGFfdmVyc2lvbnMpOworCWF0aDZrbF9zZXRfd3BhX3ZlcnNpb24odmlmLCBzbWUtPmNyeXB0by53cGFfdmVyc2lvbnMpOwogCi0Jc3RhdHVzID0gYXRoNmtsX3NldF9hdXRoX3R5cGUoYXIsIHNtZS0+YXV0aF90eXBlKTsKKwlzdGF0dXMgPSBhdGg2a2xfc2V0X2F1dGhfdHlwZSh2aWYsIHNtZS0+YXV0aF90eXBlKTsKIAlpZiAoc3RhdHVzKSB7CiAJCXVwKCZhci0+c2VtKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKIAlpZiAoc21lLT5jcnlwdG8ubl9jaXBoZXJzX3BhaXJ3aXNlKQotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgc21lLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSwgdHJ1ZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgc21lLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSwgdHJ1ZSk7CiAJZWxzZQotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgMCwgdHJ1ZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgMCwgdHJ1ZSk7CiAKLQlhdGg2a2xfc2V0X2NpcGhlcihhciwgc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwLCBmYWxzZSk7CisJYXRoNmtsX3NldF9jaXBoZXIodmlmLCBzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXAsIGZhbHNlKTsKIAogCWlmIChzbWUtPmNyeXB0by5uX2FrbV9zdWl0ZXMpCi0JCWF0aDZrbF9zZXRfa2V5X21nbXQoYXIsIHNtZS0+Y3J5cHRvLmFrbV9zdWl0ZXNbMF0pOworCQlhdGg2a2xfc2V0X2tleV9tZ210KHZpZiwgc21lLT5jcnlwdG8uYWttX3N1aXRlc1swXSk7CiAKIAlpZiAoKHNtZS0+a2V5X2xlbikgJiYKLQkgICAgKGFyLT5hdXRoX21vZGUgPT0gTk9ORV9BVVRIKSAmJiAoYXItPnByd2lzZV9jcnlwdG8gPT0gV0VQX0NSWVBUKSkgeworCSAgICAodmlmLT5hdXRoX21vZGUgPT0gTk9ORV9BVVRIKSAmJgorCSAgICAodmlmLT5wcndpc2VfY3J5cHRvID09IFdFUF9DUllQVCkpIHsKIAkJc3RydWN0IGF0aDZrbF9rZXkgKmtleSA9IE5VTEw7CiAKIAkJaWYgKHNtZS0+a2V5X2lkeCA8IFdNSV9NSU5fS0VZX0lOREVYIHx8CkBAIC0zNDQsNTYgKzQ5Miw1NyBAQAogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KIAotCQlrZXkgPSAmYXItPmtleXNbc21lLT5rZXlfaWR4XTsKKwkJa2V5ID0gJnZpZi0+a2V5c1tzbWUtPmtleV9pZHhdOwogCQlrZXktPmtleV9sZW4gPSBzbWUtPmtleV9sZW47CiAJCW1lbWNweShrZXktPmtleSwgc21lLT5rZXksIGtleS0+a2V5X2xlbik7Ci0JCWtleS0+Y2lwaGVyID0gYXItPnByd2lzZV9jcnlwdG87Ci0JCWFyLT5kZWZfdHhrZXlfaW5kZXggPSBzbWUtPmtleV9pZHg7CisJCWtleS0+Y2lwaGVyID0gdmlmLT5wcndpc2VfY3J5cHRvOworCQl2aWYtPmRlZl90eGtleV9pbmRleCA9IHNtZS0+a2V5X2lkeDsKIAotCQlhdGg2a2xfd21pX2FkZGtleV9jbWQoYXItPndtaSwgc21lLT5rZXlfaWR4LAotCQkJCSAgICAgIGFyLT5wcndpc2VfY3J5cHRvLAorCQlhdGg2a2xfd21pX2FkZGtleV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCBzbWUtPmtleV9pZHgsCisJCQkJICAgICAgdmlmLT5wcndpc2VfY3J5cHRvLAogCQkJCSAgICAgIEdST1VQX1VTQUdFIHwgVFhfVVNBR0UsCiAJCQkJICAgICAga2V5LT5rZXlfbGVuLAotCQkJCSAgICAgIE5VTEwsCisJCQkJICAgICAgTlVMTCwgMCwKIAkJCQkgICAgICBrZXktPmtleSwgS0VZX09QX0lOSVRfVkFMLCBOVUxMLAogCQkJCSAgICAgIE5PX1NZTkNfV01JRkxBRyk7CiAJfQogCiAJaWYgKCFhci0+dXNyX2Jzc19maWx0ZXIpIHsKLQkJY2xlYXJfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZhci0+ZmxhZyk7Ci0JCWlmIChhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgQUxMX0JTU19GSUxURVIsIDApICE9IDApIHsKKwkJY2xlYXJfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZ2aWYtPmZsYWdzKTsKKwkJaWYgKGF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCSAgICBBTExfQlNTX0ZJTFRFUiwgMCkgIT0gMCkgewogCQkJYXRoNmtsX2VycigiY291bGRuJ3Qgc2V0IGJzcyBmaWx0ZXJpbmdcbiIpOwogCQkJdXAoJmFyLT5zZW0pOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CiAKLQlhci0+bndfdHlwZSA9IGFyLT5uZXh0X21vZGU7CisJdmlmLT5ud190eXBlID0gdmlmLT5uZXh0X21vZGU7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsCiAJCSAgICIlczogY29ubmVjdCBjYWxsZWQgd2l0aCBhdXRobW9kZSAlZCBkb3QxMSBhdXRoICVkIgogCQkgICAiIFBXIGNyeXB0byAlZCBQVyBjcnlwdG8gbGVuICVkIEdSUCBjcnlwdG8gJWQiCiAJCSAgICIgR1JQIGNyeXB0byBsZW4gJWQgY2hhbm5lbCBoaW50ICV1XG4iLAogCQkgICBfX2Z1bmNfXywKLQkJICAgYXItPmF1dGhfbW9kZSwgYXItPmRvdDExX2F1dGhfbW9kZSwgYXItPnByd2lzZV9jcnlwdG8sCi0JCSAgIGFyLT5wcndpc2VfY3J5cHRvX2xlbiwgYXItPmdycF9jcnlwdG8sCi0JCSAgIGFyLT5ncnBfY3J5cHRvX2xlbiwgYXItPmNoX2hpbnQpOworCQkgICB2aWYtPmF1dGhfbW9kZSwgdmlmLT5kb3QxMV9hdXRoX21vZGUsIHZpZi0+cHJ3aXNlX2NyeXB0bywKKwkJICAgdmlmLT5wcndpc2VfY3J5cHRvX2xlbiwgdmlmLT5ncnBfY3J5cHRvLAorCQkgICB2aWYtPmdycF9jcnlwdG9fbGVuLCB2aWYtPmNoX2hpbnQpOwogCi0JYXItPnJlY29ubmVjdF9mbGFnID0gMDsKLQlzdGF0dXMgPSBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKGFyLT53bWksIGFyLT5ud190eXBlLAotCQkJCQlhci0+ZG90MTFfYXV0aF9tb2RlLCBhci0+YXV0aF9tb2RlLAotCQkJCQlhci0+cHJ3aXNlX2NyeXB0bywKLQkJCQkJYXItPnByd2lzZV9jcnlwdG9fbGVuLAotCQkJCQlhci0+Z3JwX2NyeXB0bywgYXItPmdycF9jcnlwdG9fbGVuLAotCQkJCQlhci0+c3NpZF9sZW4sIGFyLT5zc2lkLAotCQkJCQlhci0+cmVxX2Jzc2lkLCBhci0+Y2hfaGludCwKKwl2aWYtPnJlY29ubmVjdF9mbGFnID0gMDsKKwlzdGF0dXMgPSBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgdmlmLT5ud190eXBlLAorCQkJCQl2aWYtPmRvdDExX2F1dGhfbW9kZSwgdmlmLT5hdXRoX21vZGUsCisJCQkJCXZpZi0+cHJ3aXNlX2NyeXB0bywKKwkJCQkJdmlmLT5wcndpc2VfY3J5cHRvX2xlbiwKKwkJCQkJdmlmLT5ncnBfY3J5cHRvLCB2aWYtPmdycF9jcnlwdG9fbGVuLAorCQkJCQl2aWYtPnNzaWRfbGVuLCB2aWYtPnNzaWQsCisJCQkJCXZpZi0+cmVxX2Jzc2lkLCB2aWYtPmNoX2hpbnQsCiAJCQkJCWFyLT5jb25uZWN0X2N0cmxfZmxhZ3MpOwogCiAJdXAoJmFyLT5zZW0pOwogCiAJaWYgKHN0YXR1cyA9PSAtRUlOVkFMKSB7Ci0JCW1lbXNldChhci0+c3NpZCwgMCwgc2l6ZW9mKGFyLT5zc2lkKSk7Ci0JCWFyLT5zc2lkX2xlbiA9IDA7CisJCW1lbXNldCh2aWYtPnNzaWQsIDAsIHNpemVvZih2aWYtPnNzaWQpKTsKKwkJdmlmLT5zc2lkX2xlbiA9IDA7CiAJCWF0aDZrbF9lcnIoImludmFsaWQgcmVxdWVzdFxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0gZWxzZSBpZiAoc3RhdHVzKSB7CkBAIC00MDIsMjcgKzU1MSwyOCBAQAogCX0KIAogCWlmICgoIShhci0+Y29ubmVjdF9jdHJsX2ZsYWdzICYgQ09OTkVDVF9ET19XUEFfT0ZGTE9BRCkpICYmCi0JICAgICgoYXItPmF1dGhfbW9kZSA9PSBXUEFfUFNLX0FVVEgpCi0JICAgICB8fCAoYXItPmF1dGhfbW9kZSA9PSBXUEEyX1BTS19BVVRIKSkpIHsKLQkJbW9kX3RpbWVyKCZhci0+ZGlzY29ubmVjdF90aW1lciwKKwkgICAgKCh2aWYtPmF1dGhfbW9kZSA9PSBXUEFfUFNLX0FVVEgpCisJICAgICB8fCAodmlmLT5hdXRoX21vZGUgPT0gV1BBMl9QU0tfQVVUSCkpKSB7CisJCW1vZF90aW1lcigmdmlmLT5kaXNjb25uZWN0X3RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhESVNDT05fVElNRVJfSU5UVkFMKSk7CiAJfQogCiAJYXItPmNvbm5lY3RfY3RybF9mbGFncyAmPSB+Q09OTkVDVF9ET19XUEFfT0ZGTE9BRDsKLQlzZXRfYml0KENPTk5FQ1RfUEVORCwgJmFyLT5mbGFnKTsKKwlzZXRfYml0KENPTk5FQ1RfUEVORCwgJnZpZi0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX2FkZF9ic3NfaWZfbmVlZGVkKHN0cnVjdCBhdGg2a2wgKmFyLCBjb25zdCB1OCAqYnNzaWQsCitzdGF0aWMgaW50IGF0aDZrbF9hZGRfYnNzX2lmX25lZWRlZChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBjb25zdCB1OCAqYnNzaWQsCiAJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKIAkJCQkgICAgY29uc3QgdTggKmJlYWNvbl9pZSwgc2l6ZV90IGJlYWNvbl9pZV9sZW4pCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAl1OCAqaWU7CiAKLQlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKGFyLT53ZGV2LT53aXBoeSwgY2hhbiwgYnNzaWQsCi0JCQkgICAgICAgYXItPnNzaWQsIGFyLT5zc2lkX2xlbiwgV0xBTl9DQVBBQklMSVRZX0VTUywKKwlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKGFyLT53aXBoeSwgY2hhbiwgYnNzaWQsCisJCQkgICAgICAgdmlmLT5zc2lkLCB2aWYtPnNzaWRfbGVuLCBXTEFOX0NBUEFCSUxJVFlfRVNTLAogCQkJICAgICAgIFdMQU5fQ0FQQUJJTElUWV9FU1MpOwogCWlmIChic3MgPT0gTlVMTCkgewogCQkvKgpAQCAtNDMzLDE2ICs1ODMsMTYgQEAKIAkJICogUHJlcGVuZCBTU0lEIGVsZW1lbnQgc2luY2UgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBCZWFjb24KIAkJICogSUVzIGZyb20gdGhlIHRhcmdldC4KIAkJICovCi0JCWllID0ga21hbGxvYygyICsgYXItPnNzaWRfbGVuICsgYmVhY29uX2llX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWllID0ga21hbGxvYygyICsgdmlmLT5zc2lkX2xlbiArIGJlYWNvbl9pZV9sZW4sIEdGUF9LRVJORUwpOwogCQlpZiAoaWUgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpZVswXSA9IFdMQU5fRUlEX1NTSUQ7Ci0JCWllWzFdID0gYXItPnNzaWRfbGVuOwotCQltZW1jcHkoaWUgKyAyLCBhci0+c3NpZCwgYXItPnNzaWRfbGVuKTsKLQkJbWVtY3B5KGllICsgMiArIGFyLT5zc2lkX2xlbiwgYmVhY29uX2llLCBiZWFjb25faWVfbGVuKTsKLQkJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyhhci0+d2Rldi0+d2lwaHksIGNoYW4sCisJCWllWzFdID0gdmlmLT5zc2lkX2xlbjsKKwkJbWVtY3B5KGllICsgMiwgdmlmLT5zc2lkLCB2aWYtPnNzaWRfbGVuKTsKKwkJbWVtY3B5KGllICsgMiArIHZpZi0+c3NpZF9sZW4sIGJlYWNvbl9pZSwgYmVhY29uX2llX2xlbik7CisJCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3MoYXItPndpcGh5LCBjaGFuLAogCQkJCQkgIGJzc2lkLCAwLCBXTEFOX0NBUEFCSUxJVFlfRVNTLCAxMDAsCi0JCQkJCSAgaWUsIDIgKyBhci0+c3NpZF9sZW4gKyBiZWFjb25faWVfbGVuLAorCQkJCQkgIGllLCAyICsgdmlmLT5zc2lkX2xlbiArIGJlYWNvbl9pZV9sZW4sCiAJCQkJCSAgMCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChic3MpCiAJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICJhZGRlZCBkdW1teSBic3MgZm9yICIKQEAgLTQ2MSw3ICs2MTEsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1MTYgY2hhbm5lbCwKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwsCiAJCQkJICAgdTggKmJzc2lkLCB1MTYgbGlzdGVuX2ludHZsLAogCQkJCSAgIHUxNiBiZWFjb25faW50dmwsCiAJCQkJICAgZW51bSBuZXR3b3JrX3R5cGUgbndfdHlwZSwKQEAgLTQ2OSw2ICs2MTksNyBAQAogCQkJCSAgIHU4IGFzc29jX3Jlc3BfbGVuLCB1OCAqYXNzb2NfaW5mbykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCiAJLyogY2FwaW5mbyArIGxpc3RlbiBpbnRlcnZhbCAqLwogCXU4IGFzc29jX3JlcV9pZV9vZmZzZXQgPSBzaXplb2YodTE2KSArIHNpemVvZih1MTYpOwpAQCAtNDg3LDExICs2MzgsMTEgQEAKIAkgKiBTdG9yZSBCZWFjb24gaW50ZXJ2YWwgaGVyZTsgRFRJTSBwZXJpb2Qgd2lsbCBiZSBhdmFpbGFibGUgb25seSBvbmNlCiAJICogYSBCZWFjb24gZnJhbWUgZnJvbSB0aGUgQVAgaXMgc2Vlbi4KIAkgKi8KLQlhci0+YXNzb2NfYnNzX2JlYWNvbl9pbnQgPSBiZWFjb25faW50dmw7Ci0JY2xlYXJfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmYXItPmZsYWcpOworCXZpZi0+YXNzb2NfYnNzX2JlYWNvbl9pbnQgPSBiZWFjb25faW50dmw7CisJY2xlYXJfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmdmlmLT5mbGFncyk7CiAKIAlpZiAobndfdHlwZSAmIEFESE9DX05FVFdPUkspIHsKLQkJaWYgKGFyLT53ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJaWYgKHZpZi0+d2Rldi5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCQkgICAiJXM6IGF0aDZrIG5vdCBpbiBpYnNzIG1vZGVcbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKQEAgLTQ5OSwzOSArNjUwLDM5IEBACiAJfQogCiAJaWYgKG53X3R5cGUgJiBJTkZSQV9ORVRXT1JLKSB7Ci0JCWlmIChhci0+d2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKLQkJICAgIGFyLT53ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgeworCQlpZiAodmlmLT53ZGV2LmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCisJCSAgICB2aWYtPndkZXYuaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCQkgICAiJXM6IGF0aDZrIG5vdCBpbiBzdGF0aW9uIG1vZGVcbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAotCWNoYW4gPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoYXItPndkZXYtPndpcGh5LCAoaW50KSBjaGFubmVsKTsKKwljaGFuID0gaWVlZTgwMjExX2dldF9jaGFubmVsKGFyLT53aXBoeSwgKGludCkgY2hhbm5lbCk7CiAKIAogCWlmIChud190eXBlICYgQURIT0NfTkVUV09SSykgewotCQljZmc4MDIxMV9pYnNzX2pvaW5lZChhci0+bmV0X2RldiwgYnNzaWQsIEdGUF9LRVJORUwpOworCQljZmc4MDIxMV9pYnNzX2pvaW5lZCh2aWYtPm5kZXYsIGJzc2lkLCBHRlBfS0VSTkVMKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChhdGg2a2xfYWRkX2Jzc19pZl9uZWVkZWQoYXIsIGJzc2lkLCBjaGFuLCBhc3NvY19pbmZvLAorCWlmIChhdGg2a2xfYWRkX2Jzc19pZl9uZWVkZWQodmlmLCBic3NpZCwgY2hhbiwgYXNzb2NfaW5mbywKIAkJCQkgICAgIGJlYWNvbl9pZV9sZW4pIDwgMCkgewogCQlhdGg2a2xfZXJyKCJjb3VsZCBub3QgYWRkIGNmZzgwMjExIGJzcyBlbnRyeSBmb3IgIgogCQkJICAgImNvbm5lY3Qvcm9hbWVkIG5vdGlmaWNhdGlvblxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoYXItPnNtZV9zdGF0ZSA9PSBTTUVfQ09OTkVDVElORykgeworCWlmICh2aWYtPnNtZV9zdGF0ZSA9PSBTTUVfQ09OTkVDVElORykgewogCQkvKiBpbmZvcm0gY29ubmVjdCByZXN1bHQgdG8gY2ZnODAyMTEgKi8KLQkJYXItPnNtZV9zdGF0ZSA9IFNNRV9DT05ORUNURUQ7Ci0JCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KGFyLT5uZXRfZGV2LCBic3NpZCwKKwkJdmlmLT5zbWVfc3RhdGUgPSBTTUVfQ09OTkVDVEVEOworCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdCh2aWYtPm5kZXYsIGJzc2lkLAogCQkJCQlhc3NvY19yZXFfaWUsIGFzc29jX3JlcV9sZW4sCiAJCQkJCWFzc29jX3Jlc3BfaWUsIGFzc29jX3Jlc3BfbGVuLAogCQkJCQlXTEFOX1NUQVRVU19TVUNDRVNTLCBHRlBfS0VSTkVMKTsKLQl9IGVsc2UgaWYgKGFyLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RFRCkgeworCX0gZWxzZSBpZiAodmlmLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RFRCkgewogCQkvKiBpbmZvcm0gcm9hbSBldmVudCB0byBjZmc4MDIxMSAqLwotCQljZmc4MDIxMV9yb2FtZWQoYXItPm5ldF9kZXYsIGNoYW4sIGJzc2lkLAorCQljZmc4MDIxMV9yb2FtZWQodmlmLT5uZGV2LCBjaGFuLCBic3NpZCwKIAkJCQlhc3NvY19yZXFfaWUsIGFzc29jX3JlcV9sZW4sCiAJCQkJYXNzb2NfcmVzcF9pZSwgYXNzb2NfcmVzcF9sZW4sIEdGUF9LRVJORUwpOwogCX0KQEAgLTU0MSwxMSArNjkyLDEyIEBACiAJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJlYXNvbl9jb2RlKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKilhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IHJlYXNvbj0ldVxuIiwgX19mdW5jX18sCiAJCSAgIHJlYXNvbl9jb2RlKTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAogCWlmICh0ZXN0X2JpdChERVNUUk9ZX0lOX1BST0dSRVNTLCAmYXItPmZsYWcpKSB7CkBAIC01NTgsNDQgKzcxMCw0NiBAQAogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAotCWFyLT5yZWNvbm5lY3RfZmxhZyA9IDA7Ci0JYXRoNmtsX2Rpc2Nvbm5lY3QoYXIpOwotCW1lbXNldChhci0+c3NpZCwgMCwgc2l6ZW9mKGFyLT5zc2lkKSk7Ci0JYXItPnNzaWRfbGVuID0gMDsKKwl2aWYtPnJlY29ubmVjdF9mbGFnID0gMDsKKwlhdGg2a2xfZGlzY29ubmVjdCh2aWYpOworCW1lbXNldCh2aWYtPnNzaWQsIDAsIHNpemVvZih2aWYtPnNzaWQpKTsKKwl2aWYtPnNzaWRfbGVuID0gMDsKIAogCWlmICghdGVzdF9iaXQoU0tJUF9TQ0FOLCAmYXItPmZsYWcpKQotCQltZW1zZXQoYXItPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKGFyLT5yZXFfYnNzaWQpKTsKKwkJbWVtc2V0KHZpZi0+cmVxX2Jzc2lkLCAwLCBzaXplb2YodmlmLT5yZXFfYnNzaWQpKTsKIAogCXVwKCZhci0+c2VtKTsKIAotCWFyLT5zbWVfc3RhdGUgPSBTTUVfRElTQ09OTkVDVEVEOworCXZpZi0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKIAogCXJldHVybiAwOwogfQogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCByZWFzb24sCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHJlYXNvbiwKIAkJCQkgICAgICB1OCAqYnNzaWQsIHU4IGFzc29jX3Jlc3BfbGVuLAogCQkJCSAgICAgIHU4ICphc3NvY19pbmZvLCB1MTYgcHJvdG9fcmVhc29uKQogewotCWlmIChhci0+c2Nhbl9yZXEpIHsKLQkJY2ZnODAyMTFfc2Nhbl9kb25lKGFyLT5zY2FuX3JlcSwgdHJ1ZSk7Ci0JCWFyLT5zY2FuX3JlcSA9IE5VTEw7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOworCisJaWYgKHZpZi0+c2Nhbl9yZXEpIHsKKwkJY2ZnODAyMTFfc2Nhbl9kb25lKHZpZi0+c2Nhbl9yZXEsIHRydWUpOworCQl2aWYtPnNjYW5fcmVxID0gTlVMTDsKIAl9CiAKLQlpZiAoYXItPm53X3R5cGUgJiBBREhPQ19ORVRXT1JLKSB7Ci0JCWlmIChhci0+d2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJaWYgKHZpZi0+bndfdHlwZSAmIEFESE9DX05FVFdPUkspIHsKKwkJaWYgKHZpZi0+d2Rldi5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCQkgICAiJXM6IGF0aDZrIG5vdCBpbiBpYnNzIG1vZGVcbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCQltZW1zZXQoYnNzaWQsIDAsIEVUSF9BTEVOKTsKLQkJY2ZnODAyMTFfaWJzc19qb2luZWQoYXItPm5ldF9kZXYsIGJzc2lkLCBHRlBfS0VSTkVMKTsKKwkJY2ZnODAyMTFfaWJzc19qb2luZWQodmlmLT5uZGV2LCBic3NpZCwgR0ZQX0tFUk5FTCk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoYXItPm53X3R5cGUgJiBJTkZSQV9ORVRXT1JLKSB7Ci0JCWlmIChhci0+d2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKLQkJICAgIGFyLT53ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgeworCWlmICh2aWYtPm53X3R5cGUgJiBJTkZSQV9ORVRXT1JLKSB7CisJCWlmICh2aWYtPndkZXYuaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkJICAgIHZpZi0+d2Rldi5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgewogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLAogCQkJCSAgICIlczogYXRoNmsgbm90IGluIHN0YXRpb24gbW9kZVxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwpAQCAtNjEyLDQyICs3NjYsNDQgQEAKIAkgKi8KIAogCWlmIChyZWFzb24gIT0gRElTQ09OTkVDVF9DTUQpIHsKLQkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChhci0+d21pKTsKKwkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgpOwogCQlyZXR1cm47CiAJfQogCi0JY2xlYXJfYml0KENPTk5FQ1RfUEVORCwgJmFyLT5mbGFnKTsKKwljbGVhcl9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CiAKLQlpZiAoYXItPnNtZV9zdGF0ZSA9PSBTTUVfQ09OTkVDVElORykgewotCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChhci0+bmV0X2RldiwKKwlpZiAodmlmLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RJTkcpIHsKKwkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQodmlmLT5uZGV2LAogCQkJCWJzc2lkLCBOVUxMLCAwLAogCQkJCU5VTEwsIDAsCiAJCQkJV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSwKIAkJCQlHRlBfS0VSTkVMKTsKLQl9IGVsc2UgaWYgKGFyLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RFRCkgewotCQljZmc4MDIxMV9kaXNjb25uZWN0ZWQoYXItPm5ldF9kZXYsIHJlYXNvbiwKKwl9IGVsc2UgaWYgKHZpZi0+c21lX3N0YXRlID09IFNNRV9DT05ORUNURUQpIHsKKwkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKHZpZi0+bmRldiwgcmVhc29uLAogCQkJCU5VTEwsIDAsIEdGUF9LRVJORUwpOwogCX0KIAotCWFyLT5zbWVfc3RhdGUgPSBTTUVfRElTQ09OTkVDVEVEOworCXZpZi0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfc2NhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKIAkJCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0KQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKilhdGg2a2xfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYobmRldik7CiAJczggbl9jaGFubmVscyA9IDA7CiAJdTE2ICpjaGFubmVscyA9IE5VTEw7CiAJaW50IHJldCA9IDA7CisJdTMyIGZvcmNlX2ZnX3NjYW4gPSAwOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKCFhci0+dXNyX2Jzc19maWx0ZXIpIHsKLQkJY2xlYXJfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZhci0+ZmxhZyk7CisJCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmdmlmLT5mbGFncyk7CiAJCXJldCA9IGF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZCgKLQkJCWFyLT53bWksCi0JCQkodGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpID8KKwkJCWFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCSh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSA/CiAJCQkgQUxMX0JVVF9CU1NfRklMVEVSIDogQUxMX0JTU19GSUxURVIpLCAwKTsKIAkJaWYgKHJldCkgewogCQkJYXRoNmtsX2VycigiY291bGRuJ3Qgc2V0IGJzcyBmaWx0ZXJpbmdcbiIpOwpAQCAtNjYyLDE0ICs4MTgsMTUgQEAKIAkJCXJlcXVlc3QtPm5fc3NpZHMgPSBNQVhfUFJPQkVEX1NTSURfSU5ERVggLSAxOwogCiAJCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0LT5uX3NzaWRzOyBpKyspCi0JCQlhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKGFyLT53bWksIGkgKyAxLAotCQkJCQkJICBTUEVDSUZJQ19TU0lEX0ZMQUcsCisJCQlhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCSAgaSArIDEsIFNQRUNJRklDX1NTSURfRkxBRywKIAkJCQkJCSAgcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4sCiAJCQkJCQkgIHJlcXVlc3QtPnNzaWRzW2ldLnNzaWQpOwogCX0KIAogCWlmIChyZXF1ZXN0LT5pZSkgewotCQlyZXQgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgV01JX0ZSQU1FX1BST0JFX1JFUSwKKwkJcmV0ID0gYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICAgIFdNSV9GUkFNRV9QUk9CRV9SRVEsCiAJCQkJCSAgICAgICByZXF1ZXN0LT5pZSwgcmVxdWVzdC0+aWVfbGVuKTsKIAkJaWYgKHJldCkgewogCQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIHNldCBQcm9iZSBSZXF1ZXN0IGFwcGllIGZvciAiCkBAIC03MDAsNDQgKzg1Nyw0NyBAQAogCQkJY2hhbm5lbHNbaV0gPSByZXF1ZXN0LT5jaGFubmVsc1tpXS0+Y2VudGVyX2ZyZXE7CiAJfQogCi0JcmV0ID0gYXRoNmtsX3dtaV9zdGFydHNjYW5fY21kKGFyLT53bWksIFdNSV9MT05HX1NDQU4sIDAsCi0JCQkJICAgICAgIGZhbHNlLCAwLCAwLCBuX2NoYW5uZWxzLCBjaGFubmVscyk7CisJaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKQorCQlmb3JjZV9mZ19zY2FuID0gMTsKKworCXJldCA9IGF0aDZrbF93bWlfc3RhcnRzY2FuX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIFdNSV9MT05HX1NDQU4sCisJCQkJICAgICAgIGZvcmNlX2ZnX3NjYW4sIGZhbHNlLCAwLCAwLCBuX2NoYW5uZWxzLAorCQkJCSAgICAgICBjaGFubmVscyk7CiAJaWYgKHJldCkKIAkJYXRoNmtsX2Vycigid21pX3N0YXJ0c2Nhbl9jbWQgZmFpbGVkXG4iKTsKIAllbHNlCi0JCWFyLT5zY2FuX3JlcSA9IHJlcXVlc3Q7CisJCXZpZi0+c2Nhbl9yZXEgPSByZXF1ZXN0OwogCiAJa2ZyZWUoY2hhbm5lbHMpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgaW50IHN0YXR1cykKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX3NjYW5fY29tcGxldGVfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgYm9vbCBhYm9ydGVkKQogeworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAlpbnQgaTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBzdGF0dXMlc1xuIiwgX19mdW5jX18sCisJCSAgIGFib3J0ZWQgPyAiIGFib3J0ZWQiIDogIiIpOwogCi0JaWYgKCFhci0+c2Nhbl9yZXEpCisJaWYgKCF2aWYtPnNjYW5fcmVxKQogCQlyZXR1cm47CiAKLQlpZiAoKHN0YXR1cyA9PSAtRUNBTkNFTEVEKSB8fCAoc3RhdHVzID09IC1FQlVTWSkpIHsKLQkJY2ZnODAyMTFfc2Nhbl9kb25lKGFyLT5zY2FuX3JlcSwgdHJ1ZSk7CisJaWYgKGFib3J0ZWQpCiAJCWdvdG8gb3V0OwotCX0KIAotCWNmZzgwMjExX3NjYW5fZG9uZShhci0+c2Nhbl9yZXEsIGZhbHNlKTsKLQotCWlmIChhci0+c2Nhbl9yZXEtPm5fc3NpZHMgJiYgYXItPnNjYW5fcmVxLT5zc2lkc1swXS5zc2lkX2xlbikgewotCQlmb3IgKGkgPSAwOyBpIDwgYXItPnNjYW5fcmVxLT5uX3NzaWRzOyBpKyspIHsKLQkJCWF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoYXItPndtaSwgaSArIDEsCi0JCQkJCQkgIERJU0FCTEVfU1NJRF9GTEFHLAorCWlmICh2aWYtPnNjYW5fcmVxLT5uX3NzaWRzICYmIHZpZi0+c2Nhbl9yZXEtPnNzaWRzWzBdLnNzaWRfbGVuKSB7CisJCWZvciAoaSA9IDA7IGkgPCB2aWYtPnNjYW5fcmVxLT5uX3NzaWRzOyBpKyspIHsKKwkJCWF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJICBpICsgMSwgRElTQUJMRV9TU0lEX0ZMQUcsCiAJCQkJCQkgIDAsIE5VTEwpOwogCQl9CiAJfQogCiBvdXQ6Ci0JYXItPnNjYW5fcmVxID0gTlVMTDsKKwljZmc4MDIxMV9zY2FuX2RvbmUodmlmLT5zY2FuX3JlcSwgYWJvcnRlZCk7CisJdmlmLT5zY2FuX3JlcSA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2FkZF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCkBAIC03NDYsMTQgKzkwNiwyMSBAQAogCQkJCSAgIHN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSAoc3RydWN0IGF0aDZrbCAqKWF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgYXRoNmtsX2tleSAqa2V5ID0gTlVMTDsKIAl1OCBrZXlfdXNhZ2U7CiAJdTgga2V5X3R5cGU7Ci0JaW50IHN0YXR1cyA9IDA7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKKwlpZiAocGFyYW1zLT5jaXBoZXIgPT0gQ0NLTV9LUktfQ0lQSEVSX1NVSVRFKSB7CisJCWlmIChwYXJhbXMtPmtleV9sZW4gIT0gV01JX0tSS19MRU4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGF0aDZrbF93bWlfYWRkX2tya19jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgICBwYXJhbXMtPmtleSk7CisJfQorCiAJaWYgKGtleV9pbmRleCA8IFdNSV9NSU5fS0VZX0lOREVYIHx8IGtleV9pbmRleCA+IFdNSV9NQVhfS0VZX0lOREVYKSB7CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCSAgICIlczoga2V5IGluZGV4ICVkIG91dCBvZiBib3VuZHNcbiIsIF9fZnVuY19fLApAQCAtNzYxLDcgKzkyOCw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWtleSA9ICZhci0+a2V5c1trZXlfaW5kZXhdOworCWtleSA9ICZ2aWYtPmtleXNba2V5X2luZGV4XTsKIAltZW1zZXQoa2V5LCAwLCBzaXplb2Yoc3RydWN0IGF0aDZrbF9rZXkpKTsKIAogCWlmIChwYWlyd2lzZSkKQEAgLTc5OSwyNiArOTY2LDI2IEBACiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCi0JaWYgKCgoYXItPmF1dGhfbW9kZSA9PSBXUEFfUFNLX0FVVEgpCi0JICAgICB8fCAoYXItPmF1dGhfbW9kZSA9PSBXUEEyX1BTS19BVVRIKSkKKwlpZiAoKCh2aWYtPmF1dGhfbW9kZSA9PSBXUEFfUFNLX0FVVEgpCisJICAgICB8fCAodmlmLT5hdXRoX21vZGUgPT0gV1BBMl9QU0tfQVVUSCkpCiAJICAgICYmIChrZXlfdXNhZ2UgJiBHUk9VUF9VU0FHRSkpCi0JCWRlbF90aW1lcigmYXItPmRpc2Nvbm5lY3RfdGltZXIpOworCQlkZWxfdGltZXIoJnZpZi0+ZGlzY29ubmVjdF90aW1lcik7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsCiAJCSAgICIlczogaW5kZXggJWQsIGtleV9sZW4gJWQsIGtleV90eXBlIDB4JXgsIGtleV91c2FnZSAweCV4LCBzZXFfbGVuICVkXG4iLAogCQkgICBfX2Z1bmNfXywga2V5X2luZGV4LCBrZXktPmtleV9sZW4sIGtleV90eXBlLAogCQkgICBrZXlfdXNhZ2UsIGtleS0+c2VxX2xlbik7CiAKLQlhci0+ZGVmX3R4a2V5X2luZGV4ID0ga2V5X2luZGV4OworCXZpZi0+ZGVmX3R4a2V5X2luZGV4ID0ga2V5X2luZGV4OwogCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUksgJiYgIXBhaXJ3aXNlICYmCisJaWYgKHZpZi0+bndfdHlwZSA9PSBBUF9ORVRXT1JLICYmICFwYWlyd2lzZSAmJgogCSAgICAoa2V5X3R5cGUgPT0gVEtJUF9DUllQVCB8fCBrZXlfdHlwZSA9PSBBRVNfQ1JZUFQpICYmIHBhcmFtcykgewogCQlhci0+YXBfbW9kZV9ia2V5LnZhbGlkID0gdHJ1ZTsKIAkJYXItPmFwX21vZGVfYmtleS5rZXlfaW5kZXggPSBrZXlfaW5kZXg7CiAJCWFyLT5hcF9tb2RlX2JrZXkua2V5X3R5cGUgPSBrZXlfdHlwZTsKIAkJYXItPmFwX21vZGVfYmtleS5rZXlfbGVuID0ga2V5LT5rZXlfbGVuOwogCQltZW1jcHkoYXItPmFwX21vZGVfYmtleS5rZXksIGtleS0+a2V5LCBrZXktPmtleV9sZW4pOwotCQlpZiAoIXRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSkgeworCQlpZiAoIXRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKSB7CiAJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICJEZWxheSBpbml0aWFsIGdyb3VwICIKIAkJCQkgICAia2V5IGNvbmZpZ3VyYXRpb24gdW50aWwgQVAgbW9kZSBoYXMgYmVlbiAiCiAJCQkJICAgInN0YXJ0ZWRcbiIpOwpAQCAtODMwLDggKzk5Nyw4IEBACiAJCX0KIAl9CiAKLQlpZiAoYXItPm5leHRfbW9kZSA9PSBBUF9ORVRXT1JLICYmIGtleV90eXBlID09IFdFUF9DUllQVCAmJgotCSAgICAhdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKSB7CisJaWYgKHZpZi0+bmV4dF9tb2RlID09IEFQX05FVFdPUksgJiYga2V5X3R5cGUgPT0gV0VQX0NSWVBUICYmCisJICAgICF0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewogCQkvKgogCQkgKiBTdG9yZSB0aGUga2V5IGxvY2FsbHkgc28gdGhhdCBpdCBjYW4gYmUgcmUtY29uZmlndXJlZCBhZnRlcgogCQkgKiB0aGUgQVAgbW9kZSBoYXMgcHJvcGVybHkgc3RhcnRlZApAQCAtODM5LDIwICsxMDA2LDE4IEBACiAJCSAqLwogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICJEZWxheSBXRVAga2V5IGNvbmZpZ3VyYXRpb24gIgogCQkJICAgInVudGlsIEFQIG1vZGUgaGFzIGJlZW4gc3RhcnRlZFxuIik7Ci0JCWFyLT53ZXBfa2V5X2xpc3Rba2V5X2luZGV4XS5rZXlfbGVuID0ga2V5LT5rZXlfbGVuOwotCQltZW1jcHkoYXItPndlcF9rZXlfbGlzdFtrZXlfaW5kZXhdLmtleSwga2V5LT5rZXksIGtleS0+a2V5X2xlbik7CisJCXZpZi0+d2VwX2tleV9saXN0W2tleV9pbmRleF0ua2V5X2xlbiA9IGtleS0+a2V5X2xlbjsKKwkJbWVtY3B5KHZpZi0+d2VwX2tleV9saXN0W2tleV9pbmRleF0ua2V5LCBrZXktPmtleSwKKwkJICAgICAgIGtleS0+a2V5X2xlbik7CiAJCXJldHVybiAwOwogCX0KIAotCXN0YXR1cyA9IGF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLCBhci0+ZGVmX3R4a2V5X2luZGV4LAotCQkJCSAgICAgICBrZXlfdHlwZSwga2V5X3VzYWdlLCBrZXktPmtleV9sZW4sCi0JCQkJICAgICAgIGtleS0+c2VxLCBrZXktPmtleSwgS0VZX09QX0lOSVRfVkFMLAotCQkJCSAgICAgICAodTggKikgbWFjX2FkZHIsIFNZTkNfQk9USF9XTUlGTEFHKTsKLQotCWlmIChzdGF0dXMpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJICAgICB2aWYtPmRlZl90eGtleV9pbmRleCwKKwkJCQkgICAgIGtleV90eXBlLCBrZXlfdXNhZ2UsIGtleS0+a2V5X2xlbiwKKwkJCQkgICAgIGtleS0+c2VxLCBrZXktPnNlcV9sZW4sIGtleS0+a2V5LAorCQkJCSAgICAgS0VZX09QX0lOSVRfVkFMLAorCQkJCSAgICAgKHU4ICopIG1hY19hZGRyLCBTWU5DX0JPVEhfV01JRkxBRyk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2RlbF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCkBAIC04NjAsMTAgKzEwMjUsMTEgQEAKIAkJCQkgICBjb25zdCB1OCAqbWFjX2FkZHIpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSAoc3RydWN0IGF0aDZrbCAqKWF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBpbmRleCAlZFxuIiwgX19mdW5jX18sIGtleV9pbmRleCk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoa2V5X2luZGV4IDwgV01JX01JTl9LRVlfSU5ERVggfHwga2V5X2luZGV4ID4gV01JX01BWF9LRVlfSU5ERVgpIHsKQEAgLTg3MywxNSArMTAzOSwxNSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlpZiAoIWFyLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbikgeworCWlmICghdmlmLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbikgewogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsCiAJCQkgICAiJXM6IGluZGV4ICVkIGlzIGVtcHR5XG4iLCBfX2Z1bmNfXywga2V5X2luZGV4KTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JYXItPmtleXNba2V5X2luZGV4XS5rZXlfbGVuID0gMDsKKwl2aWYtPmtleXNba2V5X2luZGV4XS5rZXlfbGVuID0gMDsKIAotCXJldHVybiBhdGg2a2xfd21pX2RlbGV0ZWtleV9jbWQoYXItPndtaSwga2V5X2luZGV4KTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9kZWxldGVrZXlfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwga2V5X2luZGV4KTsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfZ2V0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKQEAgLTg5MCwxMyArMTA1NiwxMyBAQAogCQkJCSAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmNvb2tpZSwKIAkJCQkJCSAgICAgc3RydWN0IGtleV9wYXJhbXMgKikpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSAoc3RydWN0IGF0aDZrbCAqKWF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgYXRoNmtsX2tleSAqa2V5ID0gTlVMTDsKIAlzdHJ1Y3Qga2V5X3BhcmFtcyBwYXJhbXM7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogaW5kZXggJWRcbiIsIF9fZnVuY19fLCBrZXlfaW5kZXgpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGtleV9pbmRleCA8IFdNSV9NSU5fS0VZX0lOREVYIHx8IGtleV9pbmRleCA+IFdNSV9NQVhfS0VZX0lOREVYKSB7CkBAIC05MDYsNyArMTA3Miw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWtleSA9ICZhci0+a2V5c1trZXlfaW5kZXhdOworCWtleSA9ICZ2aWYtPmtleXNba2V5X2luZGV4XTsKIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwogCXBhcmFtcy5jaXBoZXIgPSBrZXktPmNpcGhlcjsKIAlwYXJhbXMua2V5X2xlbiA9IGtleS0+a2V5X2xlbjsKQEAgLTkyNSwxNCArMTA5MSwxNCBAQAogCQkJCQkgICBib29sIG11bHRpY2FzdCkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IChzdHJ1Y3QgYXRoNmtsICopYXRoNmtsX3ByaXYobmRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBhdGg2a2xfa2V5ICprZXkgPSBOVUxMOwotCWludCBzdGF0dXMgPSAwOwogCXU4IGtleV91c2FnZTsKIAllbnVtIGNyeXB0b190eXBlIGtleV90eXBlID0gTk9ORV9DUllQVDsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBpbmRleCAlZFxuIiwgX19mdW5jX18sIGtleV9pbmRleCk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoa2V5X2luZGV4IDwgV01JX01JTl9LRVlfSU5ERVggfHwga2V5X2luZGV4ID4gV01JX01BWF9LRVlfSU5ERVgpIHsKQEAgLTk0Miw0MyArMTEwOCw0MSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlpZiAoIWFyLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbikgeworCWlmICghdmlmLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbikgewogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogaW52YWxpZCBrZXkgaW5kZXggJWRcbiIsCiAJCQkgICBfX2Z1bmNfXywga2V5X2luZGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JYXItPmRlZl90eGtleV9pbmRleCA9IGtleV9pbmRleDsKLQlrZXkgPSAmYXItPmtleXNbYXItPmRlZl90eGtleV9pbmRleF07CisJdmlmLT5kZWZfdHhrZXlfaW5kZXggPSBrZXlfaW5kZXg7CisJa2V5ID0gJnZpZi0+a2V5c1t2aWYtPmRlZl90eGtleV9pbmRleF07CiAJa2V5X3VzYWdlID0gR1JPVVBfVVNBR0U7Ci0JaWYgKGFyLT5wcndpc2VfY3J5cHRvID09IFdFUF9DUllQVCkKKwlpZiAodmlmLT5wcndpc2VfY3J5cHRvID09IFdFUF9DUllQVCkKIAkJa2V5X3VzYWdlIHw9IFRYX1VTQUdFOwogCWlmICh1bmljYXN0KQotCQlrZXlfdHlwZSA9IGFyLT5wcndpc2VfY3J5cHRvOworCQlrZXlfdHlwZSA9IHZpZi0+cHJ3aXNlX2NyeXB0bzsKIAlpZiAobXVsdGljYXN0KQotCQlrZXlfdHlwZSA9IGFyLT5ncnBfY3J5cHRvOworCQlrZXlfdHlwZSA9IHZpZi0+Z3JwX2NyeXB0bzsKIAotCWlmIChhci0+bmV4dF9tb2RlID09IEFQX05FVFdPUksgJiYgIXRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSkKKwlpZiAodmlmLT5uZXh0X21vZGUgPT0gQVBfTkVUV09SSyAmJiAhdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpCiAJCXJldHVybiAwOyAvKiBEZWxheSB1bnRpbCBBUCBtb2RlIGhhcyBiZWVuIHN0YXJ0ZWQgKi8KIAotCXN0YXR1cyA9IGF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLCBhci0+ZGVmX3R4a2V5X2luZGV4LAotCQkJCSAgICAgICBrZXlfdHlwZSwga2V5X3VzYWdlLAotCQkJCSAgICAgICBrZXktPmtleV9sZW4sIGtleS0+c2VxLCBrZXktPmtleSwKLQkJCQkgICAgICAgS0VZX09QX0lOSVRfVkFMLCBOVUxMLAotCQkJCSAgICAgICBTWU5DX0JPVEhfV01JRkxBRyk7Ci0JaWYgKHN0YXR1cykKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXRoNmtsX3dtaV9hZGRrZXlfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkgICAgIHZpZi0+ZGVmX3R4a2V5X2luZGV4LAorCQkJCSAgICAga2V5X3R5cGUsIGtleV91c2FnZSwKKwkJCQkgICAgIGtleS0+a2V5X2xlbiwga2V5LT5zZXEsIGtleS0+c2VxX2xlbiwKKwkJCQkgICAgIGtleS0+a2V5LAorCQkJCSAgICAgS0VZX09QX0lOSVRfVkFMLCBOVUxMLAorCQkJCSAgICAgU1lOQ19CT1RIX1dNSUZMQUcpOwogfQogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV90a2lwX21pY2Vycl9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTgga2V5aWQsCit2b2lkIGF0aDZrbF9jZmc4MDIxMV90a2lwX21pY2Vycl9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCBrZXlpZCwKIAkJCQkgICAgICAgYm9vbCBpc21jYXN0KQogewogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJICAgIiVzOiBrZXlpZCAlZCwgaXNtY2FzdCAlZFxuIiwgX19mdW5jX18sIGtleWlkLCBpc21jYXN0KTsKIAotCWNmZzgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoYXItPm5ldF9kZXYsIGFyLT5ic3NpZCwKKwljZmc4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHZpZi0+bmRldiwgdmlmLT5ic3NpZCwKIAkJCQkgICAgIChpc21jYXN0ID8gTkw4MDIxMV9LRVlUWVBFX0dST1VQIDoKIAkJCQkgICAgICBOTDgwMjExX0tFWVRZUEVfUEFJUldJU0UpLCBrZXlpZCwgTlVMTCwKIAkJCQkgICAgIEdGUF9LRVJORUwpOwpAQCAtOTg3LDEyICsxMTUxLDE3IEBACiBzdGF0aWMgaW50IGF0aDZrbF9jZmc4MDIxMV9zZXRfd2lwaHlfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksIHUzMiBjaGFuZ2VkKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKil3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOwogCWludCByZXQ7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogY2hhbmdlZCAweCV4XG4iLCBfX2Z1bmNfXywKIAkJICAgY2hhbmdlZCk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoY2hhbmdlZCAmIFdJUEhZX1BBUkFNX1JUU19USFJFU0hPTEQpIHsKQEAgLTEwMTUsMTIgKzExODQsMTcgQEAKIAkJCQkgICAgICAgaW50IGRibSkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IChzdHJ1Y3QgYXRoNmtsICopd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAl1OCBhdGg2a2xfZGJtOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IHR5cGUgMHgleCwgZGJtICVkXG4iLCBfX2Z1bmNfXywKIAkJICAgdHlwZSwgZGJtKTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwl2aWYgPSBhdGg2a2xfdmlmX2ZpcnN0KGFyKTsKKwlpZiAoIXZpZikKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAogCXN3aXRjaCAodHlwZSkgewpAQCAtMTAzNSw3ICsxMjA5LDcgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCWF0aDZrbF93bWlfc2V0X3R4X3B3cl9jbWQoYXItPndtaSwgYXRoNmtsX2RibSk7CisJYXRoNmtsX3dtaV9zZXRfdHhfcHdyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIGF0aDZrbF9kYm0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDQzLDE0ICsxMjE3LDE5IEBACiBzdGF0aWMgaW50IGF0aDZrbF9jZmc4MDIxMV9nZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBpbnQgKmRibSkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IChzdHJ1Y3QgYXRoNmtsICopd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwl2aWYgPSBhdGg2a2xfdmlmX2ZpcnN0KGFyKTsKKwlpZiAoIXZpZikKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKSB7CisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpIHsKIAkJYXItPnR4X3B3ciA9IDA7CiAKLQkJaWYgKGF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQoYXItPndtaSkgIT0gMCkgeworCQlpZiAoYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgpICE9IDApIHsKIAkJCWF0aDZrbF9lcnIoImF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0xMDc0LDExICsxMjUzLDEyIEBACiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOwogCXN0cnVjdCB3bWlfcG93ZXJfbW9kZV9jbWQgbW9kZTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBwbWdtdCAlZCwgdGltZW91dCAlZFxuIiwKIAkJICAgX19mdW5jX18sIHBtZ210LCB0aW1lb3V0KTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAogCWlmIChwbWdtdCkgewpAQCAtMTA4OSw3ICsxMjY5LDggQEAKIAkJbW9kZS5wd3JfbW9kZSA9IE1BWF9QRVJGX1BPV0VSOwogCX0KIAotCWlmIChhdGg2a2xfd21pX3Bvd2VybW9kZV9jbWQoYXItPndtaSwgbW9kZS5wd3JfbW9kZSkgIT0gMCkgeworCWlmIChhdGg2a2xfd21pX3Bvd2VybW9kZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCSAgICAgbW9kZS5wd3JfbW9kZSkgIT0gMCkgewogCQlhdGg2a2xfZXJyKCJ3bWlfcG93ZXJtb2RlX2NtZCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMDk3LDQxICsxMjc4LDg2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYXRoNmtsX2NmZzgwMjExX2FkZF9pZmFjZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJICAgIGNoYXIgKm5hbWUsCisJCQkJCQkgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAorCQkJCQkJICAgIHUzMiAqZmxhZ3MsCisJCQkJCQkgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXU4IGlmX2lkeCwgbndfdHlwZTsKKworCWlmIChhci0+bnVtX3ZpZiA9PSBNQVhfTlVNX1ZJRikgeworCQlhdGg2a2xfZXJyKCJSZWFjaGVkIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCB2aWZcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlpZiAoIWF0aDZrbF9pc192YWxpZF9pZnR5cGUoYXIsIHR5cGUsICZpZl9pZHgsICZud190eXBlKSkgeworCQlhdGg2a2xfZXJyKCJOb3QgYSBzdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGVcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwluZGV2ID0gYXRoNmtsX2ludGVyZmFjZV9hZGQoYXIsIG5hbWUsIHR5cGUsIGlmX2lkeCwgbndfdHlwZSk7CisJaWYgKCFuZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWFyLT5udW1fdmlmKys7CisKKwlyZXR1cm4gbmRldjsKK30KKworc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfZGVsX2lmYWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCXNwaW5fbG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJbGlzdF9kZWwoJnZpZi0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCisJYXRoNmtsX2NsZWFudXBfdmlmKHZpZiwgdGVzdF9iaXQoV01JX1JFQURZLCAmYXItPmZsYWcpKTsKKworCWF0aDZrbF9kZWluaXRfaWZfZGF0YSh2aWYpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2NoYW5nZV9pZmFjZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKIAkJCQkJZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1MzIgKmZsYWdzLAogCQkJCQlzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYobmRldik7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGFyLT53ZGV2OworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiB0eXBlICV1XG4iLCBfX2Z1bmNfXywgdHlwZSk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCWFyLT5uZXh0X21vZGUgPSBJTkZSQV9ORVRXT1JLOworCQl2aWYtPm5leHRfbW9kZSA9IElORlJBX05FVFdPUks7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCWFyLT5uZXh0X21vZGUgPSBBREhPQ19ORVRXT1JLOworCQl2aWYtPm5leHRfbW9kZSA9IEFESE9DX05FVFdPUks7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6Ci0JCWFyLT5uZXh0X21vZGUgPSBBUF9ORVRXT1JLOworCQl2aWYtPm5leHRfbW9kZSA9IEFQX05FVFdPUks7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKLQkJYXItPm5leHRfbW9kZSA9IElORlJBX05FVFdPUks7CisJCXZpZi0+bmV4dF9tb2RlID0gSU5GUkFfTkVUV09SSzsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086Ci0JCWFyLT5uZXh0X21vZGUgPSBBUF9ORVRXT1JLOworCQl2aWYtPm5leHRfbW9kZSA9IEFQX05FVFdPUks7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWF0aDZrbF9lcnIoImludmFsaWQgaW50ZXJmYWNlIHR5cGUgJXVcbiIsIHR5cGUpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0Jd2Rldi0+aWZ0eXBlID0gdHlwZTsKKwl2aWYtPndkZXYuaWZ0eXBlID0gdHlwZTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE0MSwxNiArMTM2NywxNyBAQAogCQkJCSAgICAgc3RydWN0IGNmZzgwMjExX2lic3NfcGFyYW1zICppYnNzX3BhcmFtKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgc3RhdHVzOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCi0JYXItPnNzaWRfbGVuID0gaWJzc19wYXJhbS0+c3NpZF9sZW47Ci0JbWVtY3B5KGFyLT5zc2lkLCBpYnNzX3BhcmFtLT5zc2lkLCBhci0+c3NpZF9sZW4pOworCXZpZi0+c3NpZF9sZW4gPSBpYnNzX3BhcmFtLT5zc2lkX2xlbjsKKwltZW1jcHkodmlmLT5zc2lkLCBpYnNzX3BhcmFtLT5zc2lkLCB2aWYtPnNzaWRfbGVuKTsKIAogCWlmIChpYnNzX3BhcmFtLT5jaGFubmVsKQotCQlhci0+Y2hfaGludCA9IGlic3NfcGFyYW0tPmNoYW5uZWwtPmNlbnRlcl9mcmVxOworCQl2aWYtPmNoX2hpbnQgPSBpYnNzX3BhcmFtLT5jaGFubmVsLT5jZW50ZXJfZnJlcTsKIAogCWlmIChpYnNzX3BhcmFtLT5jaGFubmVsX2ZpeGVkKSB7CiAJCS8qCkBAIC0xMTYyLDQ0ICsxMzg5LDQ1IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQltZW1zZXQoYXItPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKGFyLT5yZXFfYnNzaWQpKTsKKwltZW1zZXQodmlmLT5yZXFfYnNzaWQsIDAsIHNpemVvZih2aWYtPnJlcV9ic3NpZCkpOwogCWlmIChpYnNzX3BhcmFtLT5ic3NpZCAmJiAhaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaWJzc19wYXJhbS0+YnNzaWQpKQotCQltZW1jcHkoYXItPnJlcV9ic3NpZCwgaWJzc19wYXJhbS0+YnNzaWQsIHNpemVvZihhci0+cmVxX2Jzc2lkKSk7CisJCW1lbWNweSh2aWYtPnJlcV9ic3NpZCwgaWJzc19wYXJhbS0+YnNzaWQsCisJCSAgICAgICBzaXplb2YodmlmLT5yZXFfYnNzaWQpKTsKIAotCWF0aDZrbF9zZXRfd3BhX3ZlcnNpb24oYXIsIDApOworCWF0aDZrbF9zZXRfd3BhX3ZlcnNpb24odmlmLCAwKTsKIAotCXN0YXR1cyA9IGF0aDZrbF9zZXRfYXV0aF90eXBlKGFyLCBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNKTsKKwlzdGF0dXMgPSBhdGg2a2xfc2V0X2F1dGhfdHlwZSh2aWYsIE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU0pOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CiAKIAlpZiAoaWJzc19wYXJhbS0+cHJpdmFjeSkgewotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAsIHRydWUpOwotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAsIGZhbHNlKTsKKwkJYXRoNmtsX3NldF9jaXBoZXIodmlmLCBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCwgdHJ1ZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAsIGZhbHNlKTsKIAl9IGVsc2UgewotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgMCwgdHJ1ZSk7Ci0JCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCAwLCBmYWxzZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgMCwgdHJ1ZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgMCwgZmFsc2UpOwogCX0KIAotCWFyLT5ud190eXBlID0gYXItPm5leHRfbW9kZTsKKwl2aWYtPm53X3R5cGUgPSB2aWYtPm5leHRfbW9kZTsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJICAgIiVzOiBjb25uZWN0IGNhbGxlZCB3aXRoIGF1dGhtb2RlICVkIGRvdDExIGF1dGggJWQiCiAJCSAgICIgUFcgY3J5cHRvICVkIFBXIGNyeXB0byBsZW4gJWQgR1JQIGNyeXB0byAlZCIKIAkJICAgIiBHUlAgY3J5cHRvIGxlbiAlZCBjaGFubmVsIGhpbnQgJXVcbiIsCiAJCSAgIF9fZnVuY19fLAotCQkgICBhci0+YXV0aF9tb2RlLCBhci0+ZG90MTFfYXV0aF9tb2RlLCBhci0+cHJ3aXNlX2NyeXB0bywKLQkJICAgYXItPnByd2lzZV9jcnlwdG9fbGVuLCBhci0+Z3JwX2NyeXB0bywKLQkJICAgYXItPmdycF9jcnlwdG9fbGVuLCBhci0+Y2hfaGludCk7CisJCSAgIHZpZi0+YXV0aF9tb2RlLCB2aWYtPmRvdDExX2F1dGhfbW9kZSwgdmlmLT5wcndpc2VfY3J5cHRvLAorCQkgICB2aWYtPnByd2lzZV9jcnlwdG9fbGVuLCB2aWYtPmdycF9jcnlwdG8sCisJCSAgIHZpZi0+Z3JwX2NyeXB0b19sZW4sIHZpZi0+Y2hfaGludCk7CiAKLQlzdGF0dXMgPSBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKGFyLT53bWksIGFyLT5ud190eXBlLAotCQkJCQlhci0+ZG90MTFfYXV0aF9tb2RlLCBhci0+YXV0aF9tb2RlLAotCQkJCQlhci0+cHJ3aXNlX2NyeXB0bywKLQkJCQkJYXItPnByd2lzZV9jcnlwdG9fbGVuLAotCQkJCQlhci0+Z3JwX2NyeXB0bywgYXItPmdycF9jcnlwdG9fbGVuLAotCQkJCQlhci0+c3NpZF9sZW4sIGFyLT5zc2lkLAotCQkJCQlhci0+cmVxX2Jzc2lkLCBhci0+Y2hfaGludCwKKwlzdGF0dXMgPSBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgdmlmLT5ud190eXBlLAorCQkJCQl2aWYtPmRvdDExX2F1dGhfbW9kZSwgdmlmLT5hdXRoX21vZGUsCisJCQkJCXZpZi0+cHJ3aXNlX2NyeXB0bywKKwkJCQkJdmlmLT5wcndpc2VfY3J5cHRvX2xlbiwKKwkJCQkJdmlmLT5ncnBfY3J5cHRvLCB2aWYtPmdycF9jcnlwdG9fbGVuLAorCQkJCQl2aWYtPnNzaWRfbGVuLCB2aWYtPnNzaWQsCisJCQkJCXZpZi0+cmVxX2Jzc2lkLCB2aWYtPmNoX2hpbnQsCiAJCQkJCWFyLT5jb25uZWN0X2N0cmxfZmxhZ3MpOwotCXNldF9iaXQoQ09OTkVDVF9QRU5ELCAmYXItPmZsYWcpOworCXNldF9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMDcsMTQgKzE0MzUsMTQgQEAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2xlYXZlX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKilhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCi0JYXRoNmtsX2Rpc2Nvbm5lY3QoYXIpOwotCW1lbXNldChhci0+c3NpZCwgMCwgc2l6ZW9mKGFyLT5zc2lkKSk7Ci0JYXItPnNzaWRfbGVuID0gMDsKKwlhdGg2a2xfZGlzY29ubmVjdCh2aWYpOworCW1lbXNldCh2aWYtPnNzaWQsIDAsIHNpemVvZih2aWYtPnNzaWQpKTsKKwl2aWYtPnNzaWRfbGVuID0gMDsKIAogCXJldHVybiAwOwogfQpAQCAtMTIyNCw2ICsxNDUyLDcgQEAKIAlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQsCiAJV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCwKIAlXTEFOX0NJUEhFUl9TVUlURV9DQ01QLAorCUNDS01fS1JLX0NJUEhFUl9TVUlURSwKIH07CiAKIHN0YXRpYyBib29sIGlzX3JhdGVfbGVnYWN5KHMzMiByYXRlKQpAQCAtMTI5MSwyMSArMTUyMCwyMiBAQAogCQkJICAgICAgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWxvbmcgbGVmdDsKIAlib29sIHNnaTsKIAlzMzIgcmF0ZTsKIAlpbnQgcmV0OwogCXU4IG1jczsKIAotCWlmIChtZW1jbXAobWFjLCBhci0+YnNzaWQsIEVUSF9BTEVOKSAhPSAwKQorCWlmIChtZW1jbXAobWFjLCB2aWYtPmJzc2lkLCBFVEhfQUxFTikgIT0gMCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhci0+c2VtKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCXNldF9iaXQoU1RBVFNfVVBEQVRFX1BFTkQsICZhci0+ZmxhZyk7CisJc2V0X2JpdChTVEFUU19VUERBVEVfUEVORCwgJnZpZi0+ZmxhZ3MpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9nZXRfc3RhdHNfY21kKGFyLT53bWkpOworCXJldCA9IGF0aDZrbF93bWlfZ2V0X3N0YXRzX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgpOwogCiAJaWYgKHJldCAhPSAwKSB7CiAJCXVwKCZhci0+c2VtKTsKQEAgLTEzMTQsNyArMTU0NCw3IEBACiAKIAlsZWZ0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXItPmV2ZW50X3dxLAogCQkJCQkJIXRlc3RfYml0KFNUQVRTX1VQREFURV9QRU5ELAotCQkJCQkJCSAgJmFyLT5mbGFnKSwKKwkJCQkJCQkgICZ2aWYtPmZsYWdzKSwKIAkJCQkJCVdNSV9USU1FT1VUKTsKIAogCXVwKCZhci0+c2VtKTsKQEAgLTEzMjQsMjQgKzE1NTQsMjQgQEAKIAllbHNlIGlmIChsZWZ0IDwgMCkKIAkJcmV0dXJuIGxlZnQ7CiAKLQlpZiAoYXItPnRhcmdldF9zdGF0cy5yeF9ieXRlKSB7Ci0JCXNpbmZvLT5yeF9ieXRlcyA9IGFyLT50YXJnZXRfc3RhdHMucnhfYnl0ZTsKKwlpZiAodmlmLT50YXJnZXRfc3RhdHMucnhfYnl0ZSkgeworCQlzaW5mby0+cnhfYnl0ZXMgPSB2aWYtPnRhcmdldF9zdGF0cy5yeF9ieXRlOwogCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19SWF9CWVRFUzsKLQkJc2luZm8tPnJ4X3BhY2tldHMgPSBhci0+dGFyZ2V0X3N0YXRzLnJ4X3BrdDsKKwkJc2luZm8tPnJ4X3BhY2tldHMgPSB2aWYtPnRhcmdldF9zdGF0cy5yeF9wa3Q7CiAJCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1JYX1BBQ0tFVFM7CiAJfQogCi0JaWYgKGFyLT50YXJnZXRfc3RhdHMudHhfYnl0ZSkgewotCQlzaW5mby0+dHhfYnl0ZXMgPSBhci0+dGFyZ2V0X3N0YXRzLnR4X2J5dGU7CisJaWYgKHZpZi0+dGFyZ2V0X3N0YXRzLnR4X2J5dGUpIHsKKwkJc2luZm8tPnR4X2J5dGVzID0gdmlmLT50YXJnZXRfc3RhdHMudHhfYnl0ZTsKIAkJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fVFhfQllURVM7Ci0JCXNpbmZvLT50eF9wYWNrZXRzID0gYXItPnRhcmdldF9zdGF0cy50eF9wa3Q7CisJCXNpbmZvLT50eF9wYWNrZXRzID0gdmlmLT50YXJnZXRfc3RhdHMudHhfcGt0OwogCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19UWF9QQUNLRVRTOwogCX0KIAotCXNpbmZvLT5zaWduYWwgPSBhci0+dGFyZ2V0X3N0YXRzLmNzX3Jzc2k7CisJc2luZm8tPnNpZ25hbCA9IHZpZi0+dGFyZ2V0X3N0YXRzLmNzX3Jzc2k7CiAJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fU0lHTkFMOwogCi0JcmF0ZSA9IGFyLT50YXJnZXRfc3RhdHMudHhfdWNhc3RfcmF0ZTsKKwlyYXRlID0gdmlmLT50YXJnZXRfc3RhdHMudHhfdWNhc3RfcmF0ZTsKIAogCWlmIChpc19yYXRlX2xlZ2FjeShyYXRlKSkgewogCQlzaW5mby0+dHhyYXRlLmxlZ2FjeSA9IHJhdGUgLyAxMDA7CkBAIC0xMzczLDEzICsxNjAzLDEzIEBACiAKIAlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19UWF9CSVRSQVRFOwogCi0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSAmJgotCSAgICB0ZXN0X2JpdChEVElNX1BFUklPRF9BVkFJTCwgJmFyLT5mbGFnKSAmJgotCSAgICBhci0+bndfdHlwZSA9PSBJTkZSQV9ORVRXT1JLKSB7CisJaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpICYmCisJICAgIHRlc3RfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmdmlmLT5mbGFncykgJiYKKwkgICAgdmlmLT5ud190eXBlID09IElORlJBX05FVFdPUkspIHsKIAkJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fQlNTX1BBUkFNOwogCQlzaW5mby0+YnNzX3BhcmFtLmZsYWdzID0gMDsKLQkJc2luZm8tPmJzc19wYXJhbS5kdGltX3BlcmlvZCA9IGFyLT5hc3NvY19ic3NfZHRpbV9wZXJpb2Q7Ci0JCXNpbmZvLT5ic3NfcGFyYW0uYmVhY29uX2ludGVydmFsID0gYXItPmFzc29jX2Jzc19iZWFjb25faW50OworCQlzaW5mby0+YnNzX3BhcmFtLmR0aW1fcGVyaW9kID0gdmlmLT5hc3NvY19ic3NfZHRpbV9wZXJpb2Q7CisJCXNpbmZvLT5ic3NfcGFyYW0uYmVhY29uX2ludGVydmFsID0gdmlmLT5hc3NvY19ic3NfYmVhY29uX2ludDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEzODksNyArMTYxOSw5IEBACiAJCQkgICAgc3RydWN0IGNmZzgwMjExX3Bta3NhICpwbWtzYSkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KG5ldGRldik7Ci0JcmV0dXJuIGF0aDZrbF93bWlfc2V0cG1raWRfY21kKGFyLT53bWksIHBta3NhLT5ic3NpZCwKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBhdGg2a2xfd21pX3NldHBta2lkX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIHBta3NhLT5ic3NpZCwKIAkJCQkgICAgICAgcG1rc2EtPnBta2lkLCB0cnVlKTsKIH0KIApAQCAtMTM5NywyNSArMTYyOSwyOTIgQEAKIAkJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfcG1rc2EgKnBta3NhKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYobmV0ZGV2KTsKLQlyZXR1cm4gYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoYXItPndtaSwgcG1rc2EtPmJzc2lkLAorCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcmV0dXJuIGF0aDZrbF93bWlfc2V0cG1raWRfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgcG1rc2EtPmJzc2lkLAogCQkJCSAgICAgICBwbWtzYS0+cG1raWQsIGZhbHNlKTsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfZmx1c2hfcG1rc2Eoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KG5ldGRldik7Ci0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSkKLQkJcmV0dXJuIGF0aDZrbF93bWlfc2V0cG1raWRfY21kKGFyLT53bWksIGFyLT5ic3NpZCwgTlVMTCwgZmFsc2UpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKQorCQlyZXR1cm4gYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgICAgdmlmLT5ic3NpZCwgTlVMTCwgZmFsc2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDZrbF93b3dfc3VzcGVuZChzdHJ1Y3QgYXRoNmtsICphciwgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KQoreworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CisJaW50IHJldCwgcG9zLCBsZWZ0OworCXUzMiBmaWx0ZXIgPSAwOworCXUxNiBpOworCXU4IG1hc2tbV09XX01BU0tfU0laRV07CisKKwl2aWYgPSBhdGg2a2xfdmlmX2ZpcnN0KGFyKTsKKwlpZiAoIXZpZikKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2xlYXIgZXhpc3RpbmcgV09XIHBhdHRlcm5zICovCisJZm9yIChpID0gMDsgaSA8IFdPV19NQVhfRklMVEVSU19QRVJfTElTVDsgaSsrKQorCQlhdGg2a2xfd21pX2RlbF93b3dfcGF0dGVybl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgICAgV09XX0xJU1RfSUQsIGkpOworCS8qIENvbmZpZ3VyZSBuZXcgV09XIHBhdHRlcm5zICovCisJZm9yIChpID0gMDsgaSA8IHdvdy0+bl9wYXR0ZXJuczsgaSsrKSB7CisKKwkJLyoKKwkJICogQ29udmVydCBnaXZlbiBubDgwMjExIHNwZWNpZmljIG1hc2sgdmFsdWUgdG8gZXF1aXZhbGVudAorCQkgKiBkcml2ZXIgc3BlY2lmaWMgbWFzayB2YWx1ZSBhbmQgc2VuZCBpdCB0byB0aGUgY2hpcCBhbG9uZworCQkgKiB3aXRoIHBhdHRlcm5zLiBGb3IgZXhhbXBsZSwgSWYgdGhlIG1hc2sgdmFsdWUgZGVmaW5lZCBpbgorCQkgKiBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuIGlzIDB4QSAoZXF1aXZhbGVudCBiaW5hcnkgaXMgMTAxMCksCisJCSAqIHRoZW4gZXF1aXZhbGVudCBkcml2ZXIgc3BlY2lmaWMgbWFzayB2YWx1ZSBpcworCQkgKiAiMHhGRiAweDAwIDB4RkYgMHgwMCIuCisJCSAqLworCQltZW1zZXQoJm1hc2ssIDAsIHNpemVvZihtYXNrKSk7CisJCWZvciAocG9zID0gMDsgcG9zIDwgd293LT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX2xlbjsgcG9zKyspIHsKKwkJCWlmICh3b3ctPnBhdHRlcm5zW2ldLm1hc2tbcG9zIC8gOF0gJiAoMHgxIDw8IChwb3MgJSA4KSkpCisJCQkJbWFza1twb3NdID0gMHhGRjsKKwkJfQorCQkvKgorCQkgKiBOb3RlOiBQYXR0ZXJuJ3Mgb2Zmc2V0IGlzIG5vdCBwYXNzZWQgYXMgcGFydCBvZiB3b3dsYW4KKwkJICogcGFyYW1ldGVyIGZyb20gQ0ZHIGxheWVyLiBTbyBpdCdzIGFsd2F5cyBwYXNzZWQgYXMgWkVSTworCQkgKiB0byB0aGUgZmlybXdhcmUuIEl0IG1lYW5zLCBnaXZlbiBXT1cgcGF0dGVybnMgYXJlIGFsd2F5cworCQkgKiBtYXRjaGVkIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YgcmVjZWl2ZWQgcGt0IGluIHRoZSBmaXJtd2FyZS4KKwkJICovCisJCXJldCA9IGF0aDZrbF93bWlfYWRkX3dvd19wYXR0ZXJuX2NtZChhci0+d21pLAorCQkJCQl2aWYtPmZ3X3ZpZl9pZHgsIFdPV19MSVNUX0lELAorCQkJCQl3b3ctPnBhdHRlcm5zW2ldLnBhdHRlcm5fbGVuLAorCQkJCQkwIC8qIHBhdHRlcm4gb2Zmc2V0ICovLAorCQkJCQl3b3ctPnBhdHRlcm5zW2ldLnBhdHRlcm4sIG1hc2spOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAod293LT5kaXNjb25uZWN0KQorCQlmaWx0ZXIgfD0gV09XX0ZJTFRFUl9PUFRJT05fTldLX0RJU0FTU09DOworCisJaWYgKHdvdy0+bWFnaWNfcGt0KQorCQlmaWx0ZXIgfD0gV09XX0ZJTFRFUl9PUFRJT05fTUFHSUNfUEFDS0VUOworCisJaWYgKHdvdy0+Z3RrX3Jla2V5X2ZhaWx1cmUpCisJCWZpbHRlciB8PSBXT1dfRklMVEVSX09QVElPTl9HVEtfRVJST1I7CisKKwlpZiAod293LT5lYXBfaWRlbnRpdHlfcmVxKQorCQlmaWx0ZXIgfD0gV09XX0ZJTFRFUl9PUFRJT05fRUFQX1JFUTsKKworCWlmICh3b3ctPmZvdXJfd2F5X2hhbmRzaGFrZSkKKwkJZmlsdGVyIHw9IFdPV19GSUxURVJfT1BUSU9OXzgwMjFYXzRXQVlIUzsKKworCXJldCA9IGF0aDZrbF93bWlfc2V0X3dvd19tb2RlX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgQVRINktMX1dPV19NT0RFX0VOQUJMRSwKKwkJCQkJICBmaWx0ZXIsCisJCQkJCSAgV09XX0hPU1RfUkVRX0RFTEFZKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYXRoNmtsX3dtaV9zZXRfaG9zdF9zbGVlcF9tb2RlX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgQVRINktMX0hPU1RfTU9ERV9BU0xFRVApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYXItPnR4X3BlbmRpbmdbYXItPmN0cmxfZXBdKSB7CisJCWxlZnQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhci0+ZXZlbnRfd3EsCisJCQkJYXItPnR4X3BlbmRpbmdbYXItPmN0cmxfZXBdID09IDAsIFdNSV9USU1FT1VUKTsKKwkJaWYgKGxlZnQgPT0gMCkgeworCQkJYXRoNmtsX3dhcm4oImNsZWFyIHdtaSBjdHJsIGRhdGEgdGltZW91dFxuIik7CisJCQlyZXQgPSAtRVRJTUVET1VUOworCQl9IGVsc2UgaWYgKGxlZnQgPCAwKSB7CisJCQlhdGg2a2xfd2FybigiY2xlYXIgd21pIGN0cmwgZGF0YSBmYWlsZWQ6ICVkXG4iLCBsZWZ0KTsKKwkJCXJldCA9IGxlZnQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDZrbF93b3dfcmVzdW1lKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CisJaW50IHJldDsKKworCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGF0aDZrbF93bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJIEFUSDZLTF9IT1NUX01PREVfQVdBS0UpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhdGg2a2xfY2ZnODAyMTFfc3VzcGVuZChzdHJ1Y3QgYXRoNmtsICphciwKKwkJCSAgICBlbnVtIGF0aDZrbF9jZmdfc3VzcGVuZF9tb2RlIG1vZGUsCisJCQkgICAgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEFUSDZLTF9DRkdfU1VTUEVORF9XT1c6CisKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NVU1BFTkQsICJ3b3cgbW9kZSBzdXNwZW5kXG4iKTsKKworCQkvKiBGbHVzaCBhbGwgbm9uIGNvbnRyb2wgcGt0cyBpbiBUWCBwYXRoICovCisJCWF0aDZrbF90eF9kYXRhX2NsZWFudXAoYXIpOworCisJCXJldCA9IGF0aDZrbF93b3dfc3VzcGVuZChhciwgd293KTsKKwkJaWYgKHJldCkgeworCQkJYXRoNmtsX2Vycigid293IHN1c3BlbmQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX1dPVzsKKwkJYnJlYWs7CisKKwljYXNlIEFUSDZLTF9DRkdfU1VTUEVORF9ERUVQU0xFRVA6CisKKwkJYXRoNmtsX2NmZzgwMjExX3N0b3AoYXIpOworCisJCS8qIHNhdmUgdGhlIGN1cnJlbnQgcG93ZXIgbW9kZSBiZWZvcmUgZW5hYmxpbmcgcG93ZXIgc2F2ZSAqLworCQlhci0+d21pLT5zYXZlZF9wd3JfbW9kZSA9IGFyLT53bWktPnB3cl9tb2RlOworCisJCXJldCA9IGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChhci0+d21pLCAwLCBSRUNfUE9XRVIpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfd2Fybigid21pIHBvd2VybW9kZSBjb21tYW5kIGZhaWxlZCBkdXJpbmcgc3VzcGVuZDogJWRcbiIsCisJCQkJICAgIHJldCk7CisJCX0KKworCQlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfREVFUFNMRUVQOworCisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfQ0ZHX1NVU1BFTkRfQ1VUUE9XRVI6CisKKwkJYXRoNmtsX2NmZzgwMjExX3N0b3AoYXIpOworCisJCWlmIChhci0+c3RhdGUgPT0gQVRINktMX1NUQVRFX09GRikgeworCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NVU1BFTkQsCisJCQkJICAgInN1c3BlbmQgaHcgb2ZmLCBubyBhY3Rpb24gZm9yIGN1dHBvd2VyXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NVU1BFTkQsICJzdXNwZW5kIGN1dHRpbmcgcG93ZXJcbiIpOworCisJCXJldCA9IGF0aDZrbF9pbml0X2h3X3N0b3AoYXIpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIHN0b3AgaHcgZHVyaW5nIHN1c3BlbmQ6ICVkXG4iLAorCQkJCSAgICByZXQpOworCQl9CisKKwkJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX0NVVFBPV0VSOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBhdGg2a2xfY2ZnODAyMTFfcmVzdW1lKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKGFyLT5zdGF0ZSkgeworCWNhc2UgIEFUSDZLTF9TVEFURV9XT1c6CisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19TVVNQRU5ELCAid293IG1vZGUgcmVzdW1lXG4iKTsKKworCQlyZXQgPSBhdGg2a2xfd293X3Jlc3VtZShhcik7CisJCWlmIChyZXQpIHsKKwkJCWF0aDZrbF93YXJuKCJ3b3cgbW9kZSByZXN1bWUgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfT047CisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfU1RBVEVfREVFUFNMRUVQOgorCQlpZiAoYXItPndtaS0+cHdyX21vZGUgIT0gYXItPndtaS0+c2F2ZWRfcHdyX21vZGUpIHsKKwkJCXJldCA9IGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChhci0+d21pLCAwLAorCQkJCQkJICAgICAgIGFyLT53bWktPnNhdmVkX3B3cl9tb2RlKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlhdGg2a2xfd2Fybigid21pIHBvd2VybW9kZSBjb21tYW5kIGZhaWxlZCBkdXJpbmcgcmVzdW1lOiAlZFxuIiwKKwkJCQkJICAgIHJldCk7CisJCQl9CisJCX0KKworCQlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfT047CisKKwkJYnJlYWs7CisKKwljYXNlIEFUSDZLTF9TVEFURV9DVVRQT1dFUjoKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NVU1BFTkQsICJyZXN1bWUgcmVzdG9yaW5nIHBvd2VyXG4iKTsKKworCQlyZXQgPSBhdGg2a2xfaW5pdF9od19zdGFydChhcik7CisJCWlmIChyZXQpIHsKKwkJCWF0aDZrbF93YXJuKCJGYWlsZWQgdG8gYm9vdCBodyBpbiByZXN1bWU6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGFyNmtfY2ZnODAyMTFfc3VzcGVuZChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCisvKiBoaWYgbGF5ZXIgZGVjaWRlcyB3aGF0IHN1c3BlbmQgbW9kZSB0byB1c2UgKi8KK3N0YXRpYyBpbnQgX19hdGg2a2xfY2ZnODAyMTFfc3VzcGVuZChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSB3aXBoeV9wcml2KHdpcGh5KTsKIAotCXJldHVybiBhdGg2a2xfaGlmX3N1c3BlbmQoYXIpOworCXJldHVybiBhdGg2a2xfaGlmX3N1c3BlbmQoYXIsIHdvdyk7Cit9CisKK3N0YXRpYyBpbnQgX19hdGg2a2xfY2ZnODAyMTFfcmVzdW1lKHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB3aXBoeV9wcml2KHdpcGh5KTsKKworCXJldHVybiBhdGg2a2xfaGlmX3Jlc3VtZShhcik7Cit9CisKKy8qCisgKiBGSVhNRTogV09XIHN1c3BlbmQgbW9kZSBpcyBzZWxlY3RlZCBpZiB0aGUgaG9zdCBzZGlvIGNvbnRyb2xsZXIgc3VwcG9ydHMKKyAqIGJvdGggc2RpbyBpcnEgd2FrZSB1cCBhbmQga2VlcCBwb3dlci4gVGhlIHRhcmdldCBwdWxscyBzZGlvIGRhdGEgbGluZSB0bworICogd2FrZSB1cCB0aGUgaG9zdCB3aGVuIFdPVyBwYXR0ZXJuIG1hdGNoZXMuIFRoaXMgY2F1c2VzIHNkaW8gaXJxIGhhbmRsZXIKKyAqIGlzIGJlaW5nIGNhbGxlZCBpbiB0aGUgaG9zdCBzaWRlIHdoaWNoIGludGVybmFsbHkgaGl0cyBhdGg2a2wncyBSWCBwYXRoLgorICoKKyAqIFNpbmNlIHNkaW8gaW50ZXJydXB0IGlzIG5vdCBkaXNhYmxlZCwgUlggcGF0aCBleGVjdXRlcyBldmVuIGJlZm9yZQorICogdGhlIGhvc3QgZXhlY3V0ZXMgdGhlIGFjdHVhbCByZXN1bWUgb3BlcmF0aW9uIGZyb20gUE0gbW9kdWxlLgorICoKKyAqIEluIHRoZSBjdXJyZW50IHNjZW5hcmlvLCBXT1cgcmVzdW1lIHNob3VsZCBoYXBwZW4gYmVmb3JlIHN0YXJ0IHByb2Nlc3NpbmcKKyAqIGFueSBkYXRhIGZyb20gdGhlIHRhcmdldC4gU28gSXQncyByZXF1aXJlZCB0byBwZXJmb3JtIFdPVyByZXN1bWUgaW4gUlggcGF0aC4KKyAqIElkZWFsbHkgd2Ugc2hvdWxkIHBlcmZvcm0gV09XIHJlc3VtZSBvbmx5IGluIHRoZSBhY3R1YWwgcGxhdGZvcm0KKyAqIHJlc3VtZSBwYXRoLiBUaGlzIGFyZWEgbmVlZHMgYml0IHJld29yayB0byBhdm9pZCBXT1cgcmVzdW1lIGluIFJYIHBhdGguCisgKgorICogYXRoNmtsX2NoZWNrX3dvd19zdGF0dXMoKSBpcyBjYWxsZWQgZnJvbSBhdGg2a2xfcngoKS4KKyAqLwordm9pZCBhdGg2a2xfY2hlY2tfd293X3N0YXR1cyhzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlpZiAoYXItPnN0YXRlID09IEFUSDZLTF9TVEFURV9XT1cpCisJCWF0aDZrbF9jZmc4MDIxMV9yZXN1bWUoYXIpOworfQorCisjZWxzZQorCit2b2lkIGF0aDZrbF9jaGVja193b3dfc3RhdHVzKHN0cnVjdCBhdGg2a2wgKmFyKQorewogfQogI2VuZGlmCiAKQEAgLTE0MjMsMTQgKzE5MjIsMTQgQEAKIAkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKIAkJCSAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlKQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBjZW50ZXJfZnJlcT0ldSBod192YWx1ZT0ldVxuIiwKIAkJICAgX19mdW5jX18sIGNoYW4tPmNlbnRlcl9mcmVxLCBjaGFuLT5od192YWx1ZSk7Ci0JYXItPm5leHRfY2hhbiA9IGNoYW4tPmNlbnRlcl9mcmVxOworCXZpZi0+bmV4dF9jaGFuID0gY2hhbi0+Y2VudGVyX2ZyZXE7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NDIsOSArMTk0MSwxMCBAQAogCQlwb3NbNF0gPT0gMHg5YSAmJiBwb3NbNV0gPT0gMHgwOTsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2V0X2FwX3Byb2JlX3Jlc3BfaWVzKHN0cnVjdCBhdGg2a2wgKmFyLCBjb25zdCB1OCAqaWVzLAotCQkJCQlzaXplX3QgaWVzX2xlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3NldF9hcF9wcm9iZV9yZXNwX2llcyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLAorCQkJCQljb25zdCB1OCAqaWVzLCBzaXplX3QgaWVzX2xlbikKIHsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJY29uc3QgdTggKnBvczsKIAl1OCAqYnVmID0gTlVMTDsKIAlzaXplX3QgbGVuID0gMDsKQEAgLTE0NzEsOCArMTk3MSw4IEBACiAJCX0KIAl9CiAKLQlyZXQgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgV01JX0ZSQU1FX1BST0JFX1JFU1AsCi0JCQkJICAgICAgIGJ1ZiwgbGVuKTsKKwlyZXQgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCSAgICAgICBXTUlfRlJBTUVfUFJPQkVfUkVTUCwgYnVmLCBsZW4pOwogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0ODEsNiArMTk4MSw3IEBACiAJCQkgICAgc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzICppbmZvLCBib29sIGFkZCkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCXU4ICppZXM7CiAJaW50IGllc19sZW47CkBAIC0xNDkwLDI3ICsxOTkxLDI5IEBACiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogYWRkPSVkXG4iLCBfX2Z1bmNfXywgYWRkKTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAotCWlmIChhci0+bmV4dF9tb2RlICE9IEFQX05FVFdPUkspCisJaWYgKHZpZi0+bmV4dF9tb2RlICE9IEFQX05FVFdPUkspCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmIChpbmZvLT5iZWFjb25faWVzKSB7Ci0JCXJlcyA9IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChhci0+d21pLCBXTUlfRlJBTUVfQkVBQ09OLAorCQlyZXMgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgICAgV01JX0ZSQU1FX0JFQUNPTiwKIAkJCQkJICAgICAgIGluZm8tPmJlYWNvbl9pZXMsCiAJCQkJCSAgICAgICBpbmZvLT5iZWFjb25faWVzX2xlbik7CiAJCWlmIChyZXMpCiAJCQlyZXR1cm4gcmVzOwogCX0KIAlpZiAoaW5mby0+cHJvYmVyZXNwX2llcykgewotCQlyZXMgPSBhdGg2a2xfc2V0X2FwX3Byb2JlX3Jlc3BfaWVzKGFyLCBpbmZvLT5wcm9iZXJlc3BfaWVzLAorCQlyZXMgPSBhdGg2a2xfc2V0X2FwX3Byb2JlX3Jlc3BfaWVzKHZpZiwgaW5mby0+cHJvYmVyZXNwX2llcywKIAkJCQkJCSAgIGluZm8tPnByb2JlcmVzcF9pZXNfbGVuKTsKIAkJaWYgKHJlcykKIAkJCXJldHVybiByZXM7CiAJfQogCWlmIChpbmZvLT5hc3NvY3Jlc3BfaWVzKSB7Ci0JCXJlcyA9IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChhci0+d21pLCBXTUlfRlJBTUVfQVNTT0NfUkVTUCwKKwkJcmVzID0gYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICAgIFdNSV9GUkFNRV9BU1NPQ19SRVNQLAogCQkJCQkgICAgICAgaW5mby0+YXNzb2NyZXNwX2llcywKIAkJCQkJICAgICAgIGluZm8tPmFzc29jcmVzcF9pZXNfbGVuKTsKIAkJaWYgKHJlcykKQEAgLTE1MzcsMTIgKzIwNDAsMTIgQEAKIAogCWlmIChpbmZvLT5zc2lkID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwotCW1lbWNweShhci0+c3NpZCwgaW5mby0+c3NpZCwgaW5mby0+c3NpZF9sZW4pOwotCWFyLT5zc2lkX2xlbiA9IGluZm8tPnNzaWRfbGVuOworCW1lbWNweSh2aWYtPnNzaWQsIGluZm8tPnNzaWQsIGluZm8tPnNzaWRfbGVuKTsKKwl2aWYtPnNzaWRfbGVuID0gaW5mby0+c3NpZF9sZW47CiAJaWYgKGluZm8tPmhpZGRlbl9zc2lkICE9IE5MODAyMTFfSElEREVOX1NTSURfTk9UX0lOX1VTRSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOyAvKiBUT0RPICovCiAKLQlhci0+ZG90MTFfYXV0aF9tb2RlID0gT1BFTl9BVVRIOworCXZpZi0+ZG90MTFfYXV0aF9tb2RlID0gT1BFTl9BVVRIOwogCiAJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOwogCkBAIC0xNTY0LDcgKzIwNjcsNyBAQAogCX0KIAlpZiAocC5hdXRoX21vZGUgPT0gMCkKIAkJcC5hdXRoX21vZGUgPSBOT05FX0FVVEg7Ci0JYXItPmF1dGhfbW9kZSA9IHAuYXV0aF9tb2RlOworCXZpZi0+YXV0aF9tb2RlID0gcC5hdXRoX21vZGU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5mby0+Y3J5cHRvLm5fY2lwaGVyc19wYWlyd2lzZTsgaSsrKSB7CiAJCXN3aXRjaCAoaW5mby0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbaV0pIHsKQEAgLTE1ODIsOSArMjA4NSw5IEBACiAJfQogCWlmIChwLnByd2lzZV9jcnlwdG9fdHlwZSA9PSAwKSB7CiAJCXAucHJ3aXNlX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKLQkJYXRoNmtsX3NldF9jaXBoZXIoYXIsIDAsIHRydWUpOworCQlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIDAsIHRydWUpOwogCX0gZWxzZSBpZiAoaW5mby0+Y3J5cHRvLm5fY2lwaGVyc19wYWlyd2lzZSA9PSAxKQotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgaW5mby0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0sIHRydWUpOworCQlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIGluZm8tPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdLCB0cnVlKTsKIAogCXN3aXRjaCAoaW5mby0+Y3J5cHRvLmNpcGhlcl9ncm91cCkgewogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CkBAIC0xNjAxLDE3ICsyMTA0LDE3IEBACiAJCXAuZ3JwX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKIAkJYnJlYWs7CiAJfQotCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCBpbmZvLT5jcnlwdG8uY2lwaGVyX2dyb3VwLCBmYWxzZSk7CisJYXRoNmtsX3NldF9jaXBoZXIodmlmLCBpbmZvLT5jcnlwdG8uY2lwaGVyX2dyb3VwLCBmYWxzZSk7CiAKIAlwLm53X3R5cGUgPSBBUF9ORVRXT1JLOwotCWFyLT5ud190eXBlID0gYXItPm5leHRfbW9kZTsKKwl2aWYtPm53X3R5cGUgPSB2aWYtPm5leHRfbW9kZTsKIAotCXAuc3NpZF9sZW4gPSBhci0+c3NpZF9sZW47Ci0JbWVtY3B5KHAuc3NpZCwgYXItPnNzaWQsIGFyLT5zc2lkX2xlbik7Ci0JcC5kb3QxMV9hdXRoX21vZGUgPSBhci0+ZG90MTFfYXV0aF9tb2RlOwotCXAuY2ggPSBjcHVfdG9fbGUxNihhci0+bmV4dF9jaGFuKTsKKwlwLnNzaWRfbGVuID0gdmlmLT5zc2lkX2xlbjsKKwltZW1jcHkocC5zc2lkLCB2aWYtPnNzaWQsIHZpZi0+c3NpZF9sZW4pOworCXAuZG90MTFfYXV0aF9tb2RlID0gdmlmLT5kb3QxMV9hdXRoX21vZGU7CisJcC5jaCA9IGNwdV90b19sZTE2KHZpZi0+bmV4dF9jaGFuKTsKIAotCXJlcyA9IGF0aDZrbF93bWlfYXBfcHJvZmlsZV9jb21taXQoYXItPndtaSwgJnApOworCXJlcyA9IGF0aDZrbF93bWlfYXBfcHJvZmlsZV9jb21taXQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCAmcCk7CiAJaWYgKHJlcyA8IDApCiAJCXJldHVybiByZXM7CiAKQEAgLTE2MzMsMTQgKzIxMzYsMTUgQEAKIHN0YXRpYyBpbnQgYXRoNmtsX2RlbF9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoYXItPm53X3R5cGUgIT0gQVBfTkVUV09SSykKKwlpZiAodmlmLT5ud190eXBlICE9IEFQX05FVFdPUkspCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQlpZiAoIXRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSkKKwlpZiAoIXRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCi0JYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChhci0+d21pKTsKLQljbGVhcl9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpOworCWF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4KTsKKwljbGVhcl9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2NDksOCArMjE1Myw5IEBACiAJCQkJIHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoYXItPm53X3R5cGUgIT0gQVBfTkVUV09SSykKKwlpZiAodmlmLT5ud190eXBlICE9IEFQX05FVFdPUkspCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCS8qIFVzZSB0aGlzIG9ubHkgZm9yIGF1dGhvcml6aW5nL3VuYXV0aG9yaXppbmcgYSBzdGF0aW9uICovCkBAIC0xNjU4LDEwICsyMTYzLDEwIEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmIChwYXJhbXMtPnN0YV9mbGFnc19zZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKSkKLQkJcmV0dXJuIGF0aDZrbF93bWlfYXBfc2V0X21sbWUoYXItPndtaSwgV01JX0FQX01MTUVfQVVUSE9SSVpFLAotCQkJCQkgICAgICBtYWMsIDApOwotCXJldHVybiBhdGg2a2xfd21pX2FwX3NldF9tbG1lKGFyLT53bWksIFdNSV9BUF9NTE1FX1VOQVVUSE9SSVpFLCBtYWMsCi0JCQkJICAgICAgMCk7CisJCXJldHVybiBhdGg2a2xfd21pX2FwX3NldF9tbG1lKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICAgV01JX0FQX01MTUVfQVVUSE9SSVpFLCBtYWMsIDApOworCXJldHVybiBhdGg2a2xfd21pX2FwX3NldF9tbG1lKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkgICAgICBXTUlfQVBfTUxNRV9VTkFVVEhPUklaRSwgbWFjLCAwKTsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKQEAgLTE2NzIsMTMgKzIxNzcsMjAgQEAKIAkJCQkgICAgdTY0ICpjb29raWUpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBpZDsKIAogCS8qIFRPRE86IGlmIGFscmVhZHkgcGVuZGluZyBvciBvbmdvaW5nIHJlbWFpbi1vbi1jaGFubmVsLAogCSAqIHJldHVybiAtRUJVU1kgKi8KLQkqY29va2llID0gMTsgLyogb25seSBhIHNpbmdsZSBwZW5kaW5nIHJlcXVlc3QgaXMgc3VwcG9ydGVkICovCisJaWQgPSArK3ZpZi0+bGFzdF9yb2NfaWQ7CisJaWYgKGlkID09IDApIHsKKwkJLyogRG8gbm90IHVzZSAwIGFzIHRoZSBjb29raWUgdmFsdWUgKi8KKwkJaWQgPSArK3ZpZi0+bGFzdF9yb2NfaWQ7CisJfQorCSpjb29raWUgPSBpZDsKIAotCXJldHVybiBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2NtZChhci0+d21pLCBjaGFuLT5jZW50ZXJfZnJlcSwKLQkJCQkJICAgICBkdXJhdGlvbik7CisJcmV0dXJuIGF0aDZrbF93bWlfcmVtYWluX29uX2NobmxfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICBjaGFuLT5jZW50ZXJfZnJlcSwgZHVyYXRpb24pOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSwKQEAgLTE2ODYsMTYgKzIxOTgsMjAgQEAKIAkJCQkJICAgdTY0IGNvb2tpZSkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoY29va2llICE9IDEpCisJaWYgKGNvb2tpZSAhPSB2aWYtPmxhc3Rfcm9jX2lkKQogCQlyZXR1cm4gLUVOT0VOVDsKKwl2aWYtPmxhc3RfY2FuY2VsX3JvY19pZCA9IGNvb2tpZTsKIAotCXJldHVybiBhdGg2a2xfd21pX2NhbmNlbF9yZW1haW5fb25fY2hubF9jbWQoYXItPndtaSk7CisJcmV0dXJuIGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgpOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF9zZW5kX2dvX3Byb2JlX3Jlc3Aoc3RydWN0IGF0aDZrbCAqYXIsIGNvbnN0IHU4ICpidWYsCi0JCQkJICAgICBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZnJlcSkKK3N0YXRpYyBpbnQgYXRoNmtsX3NlbmRfZ29fcHJvYmVfcmVzcChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLAorCQkJCSAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBmcmVxKQogeworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAljb25zdCB1OCAqcG9zOwogCXU4ICpwMnA7CiAJaW50IHAycF9sZW47CkBAIC0xNzIyLDggKzIyMzgsOCBAQAogCQlwb3MgKz0gMiArIHBvc1sxXTsKIAl9CiAKLQlyZXQgPSBhdGg2a2xfd21pX3NlbmRfcHJvYmVfcmVzcG9uc2VfY21kKGFyLT53bWksIGZyZXEsIG1nbXQtPmRhLAotCQkJCQkJIHAycCwgcDJwX2xlbik7CisJcmV0ID0gYXRoNmtsX3dtaV9zZW5kX3Byb2JlX3Jlc3BvbnNlX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIGZyZXEsCisJCQkJCQkgbWdtdC0+ZGEsIHAycCwgcDJwX2xlbik7CiAJa2ZyZWUocDJwKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTczMiwzNiArMjI0OCwzOSBAQAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sIGJvb2wgb2ZmY2hhbiwKIAkJCSAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCiAJCQkgIGJvb2wgY2hhbm5lbF90eXBlX3ZhbGlkLCB1bnNpZ25lZCBpbnQgd2FpdCwKLQkJCSAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBub19jY2ssIHU2NCAqY29va2llKQorCQkJICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBib29sIG5vX2NjaywKKwkJCSAgYm9vbCBkb250X3dhaXRfZm9yX2FjaywgdTY0ICpjb29raWUpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiBpZDsKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7CiAKIAltZ210ID0gKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBidWY7CiAJaWYgKGJ1ZiArIGxlbiA+PSBtZ210LT51LnByb2JlX3Jlc3AudmFyaWFibGUgJiYKLQkgICAgYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSyAmJiB0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykgJiYKKwkgICAgdmlmLT5ud190eXBlID09IEFQX05FVFdPUksgJiYgdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykgJiYKIAkgICAgaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AobWdtdC0+ZnJhbWVfY29udHJvbCkpIHsKIAkJLyoKIAkJICogU2VuZCBQcm9iZSBSZXNwb25zZSBmcmFtZSBpbiBBUCBtb2RlIHVzaW5nIGEgc2VwYXJhdGUgV01JCiAJCSAqIGNvbW1hbmQgdG8gYWxsb3cgdGhlIHRhcmdldCB0byBmaWxsIGluIHRoZSBnZW5lcmljIElFcy4KIAkJICovCiAJCSpjb29raWUgPSAwOyAvKiBUWCBzdGF0dXMgbm90IHN1cHBvcnRlZCAqLwotCQlyZXR1cm4gYXRoNmtsX3NlbmRfZ29fcHJvYmVfcmVzcChhciwgYnVmLCBsZW4sCisJCXJldHVybiBhdGg2a2xfc2VuZF9nb19wcm9iZV9yZXNwKHZpZiwgYnVmLCBsZW4sCiAJCQkJCQkgY2hhbi0+Y2VudGVyX2ZyZXEpOwogCX0KIAotCWlkID0gYXItPnNlbmRfYWN0aW9uX2lkKys7CisJaWQgPSB2aWYtPnNlbmRfYWN0aW9uX2lkKys7CiAJaWYgKGlkID09IDApIHsKIAkJLyoKIAkJICogMCBpcyBhIHJlc2VydmVkIHZhbHVlIGluIHRoZSBXTUkgY29tbWFuZCBhbmQgc2hhbGwgbm90IGJlCiAJCSAqIHVzZWQgZm9yIHRoZSBjb21tYW5kLgogCQkgKi8KLQkJaWQgPSBhci0+c2VuZF9hY3Rpb25faWQrKzsKKwkJaWQgPSB2aWYtPnNlbmRfYWN0aW9uX2lkKys7CiAJfQogCiAJKmNvb2tpZSA9IGlkOwotCXJldHVybiBhdGg2a2xfd21pX3NlbmRfYWN0aW9uX2NtZChhci0+d21pLCBpZCwgY2hhbi0+Y2VudGVyX2ZyZXEsIHdhaXQsCisJcmV0dXJuIGF0aDZrbF93bWlfc2VuZF9hY3Rpb25fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgaWQsCisJCQkJCSAgY2hhbi0+Y2VudGVyX2ZyZXEsIHdhaXQsCiAJCQkJCSAgYnVmLCBsZW4pOwogfQogCkBAIC0xNzY5LDcgKzIyODgsNyBAQAogCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICAgICB1MTYgZnJhbWVfdHlwZSwgYm9vbCByZWcpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IGZyYW1lX3R5cGU9MHgleCByZWc9JWRcbiIsCiAJCSAgIF9fZnVuY19fLCBmcmFtZV90eXBlLCByZWcpOwpAQCAtMTc3OSw3ICsyMjk4LDcgQEAKIAkJICogd2UgY2Fubm90IHNlbmQgV01JX1BST0JFX1JFUV9SRVBPUlRfQ01EIGhlcmUuIEluc3RlYWQsIHdlCiAJCSAqIGhhcmRjb2RlIHRhcmdldCB0byByZXBvcnQgUHJvYmUgUmVxdWVzdCBmcmFtZXMgYWxsIHRoZSB0aW1lLgogCQkgKi8KLQkJYXItPnByb2JlX3JlcV9yZXBvcnQgPSByZWc7CisJCXZpZi0+cHJvYmVfcmVxX3JlcG9ydCA9IHJlZzsKIAl9CiB9CiAKQEAgLTE4MDYsNiArMjMyNSw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNmZzgwMjExX29wcyBhdGg2a2xfY2ZnODAyMTFfb3BzID0geworCS5hZGRfdmlydHVhbF9pbnRmID0gYXRoNmtsX2NmZzgwMjExX2FkZF9pZmFjZSwKKwkuZGVsX3ZpcnR1YWxfaW50ZiA9IGF0aDZrbF9jZmc4MDIxMV9kZWxfaWZhY2UsCiAJLmNoYW5nZV92aXJ0dWFsX2ludGYgPSBhdGg2a2xfY2ZnODAyMTFfY2hhbmdlX2lmYWNlLAogCS5zY2FuID0gYXRoNmtsX2NmZzgwMjExX3NjYW4sCiAJLmNvbm5lY3QgPSBhdGg2a2xfY2ZnODAyMTFfY29ubmVjdCwKQEAgLTE4MjYsNyArMjM0Nyw4IEBACiAJLmZsdXNoX3Bta3NhID0gYXRoNmtsX2ZsdXNoX3Bta3NhLAogCUNGRzgwMjExX1RFU1RNT0RFX0NNRChhdGg2a2xfdG1fY21kKQogI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kID0gYXI2a19jZmc4MDIxMV9zdXNwZW5kLAorCS5zdXNwZW5kID0gX19hdGg2a2xfY2ZnODAyMTFfc3VzcGVuZCwKKwkucmVzdW1lID0gX19hdGg2a2xfY2ZnODAyMTFfcmVzdW1lLAogI2VuZGlmCiAJLnNldF9jaGFubmVsID0gYXRoNmtsX3NldF9jaGFubmVsLAogCS5hZGRfYmVhY29uID0gYXRoNmtsX2FkZF9iZWFjb24sCkBAIC0xODM5LDc2ICsyMzYxLDI2OSBAQAogCS5tZ210X2ZyYW1lX3JlZ2lzdGVyID0gYXRoNmtsX21nbXRfZnJhbWVfcmVnaXN0ZXIsCiB9OwogCi1zdHJ1Y3Qgd2lyZWxlc3NfZGV2ICphdGg2a2xfY2ZnODAyMTFfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKQogewotCWludCByZXQgPSAwOwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7Ci0Jc3RydWN0IGF0aDZrbCAqYXI7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAotCXdkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2lyZWxlc3NfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3ZGV2KSB7Ci0JCWF0aDZrbF9lcnIoImNvdWxkbid0IGFsbG9jYXRlIHdpcmVsZXNzIGRldmljZVxuIik7Ci0JCXJldHVybiBOVUxMOworCS8qIEZJWE1FOiBmb3IgbXVsdGkgdmlmICovCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpIHsKKwkJLyogc2F2ZSB0aGUgY3VycmVudCBwb3dlciBtb2RlIGJlZm9yZSBlbmFibGluZyBwb3dlciBzYXZlICovCisJCWFyLT53bWktPnNhdmVkX3B3cl9tb2RlID0gYXItPndtaS0+cHdyX21vZGU7CisKKwkJaWYgKGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChhci0+d21pLCAwLCBSRUNfUE9XRVIpICE9IDApCisJCQlhdGg2a2xfd2FybigiYXRoNmtsX2RlZXBfc2xlZXBfZW5hYmxlOiAiCisJCQkJICAgICJ3bWlfcG93ZXJtb2RlX2NtZCBmYWlsZWRcbiIpOworCQlyZXR1cm47CiAJfQogCi0JLyogY3JlYXRlIGEgbmV3IHdpcGh5IGZvciB1c2Ugd2l0aCBjZmc4MDIxMSAqLwotCXdkZXYtPndpcGh5ID0gd2lwaHlfbmV3KCZhdGg2a2xfY2ZnODAyMTFfb3BzLCBzaXplb2Yoc3RydWN0IGF0aDZrbCkpOwotCWlmICghd2Rldi0+d2lwaHkpIHsKLQkJYXRoNmtsX2VycigiY291bGRuJ3QgYWxsb2NhdGUgd2lwaHkgZGV2aWNlXG4iKTsKLQkJa2ZyZWUod2Rldik7Ci0JCXJldHVybiBOVUxMOworCXN3aXRjaCAodmlmLT5zbWVfc3RhdGUpIHsKKwljYXNlIFNNRV9DT05ORUNUSU5HOgorCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdCh2aWYtPm5kZXYsIHZpZi0+YnNzaWQsIE5VTEwsIDAsCisJCQkJCU5VTEwsIDAsCisJCQkJCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUsCisJCQkJCUdGUF9LRVJORUwpOworCQlicmVhazsKKwljYXNlIFNNRV9DT05ORUNURUQ6CisJZGVmYXVsdDoKKwkJLyoKKwkJICogRklYTUU6IG9kZGx5IGVub3VnaCBzbWVTdGF0ZSBpcyBpbiBESVNDT05ORUNURUQgZHVyaW5nCisJCSAqIHN1c3BlbmQsIHdoeT8gTmVlZCB0byBzZW5kIGRpc2Nvbm5lY3RlZCBldmVudCBpbiB0aGF0CisJCSAqIHN0YXRlLgorCQkgKi8KKwkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKHZpZi0+bmRldiwgMCwgTlVMTCwgMCwgR0ZQX0tFUk5FTCk7CisJCWJyZWFrOwogCX0KIAotCWFyID0gd2lwaHlfcHJpdih3ZGV2LT53aXBoeSk7Ci0JYXItPnAycCA9ICEhYXRoNmtsX3AycDsKKwlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncykpCisJCWF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4KTsKIAotCXdkZXYtPndpcGh5LT5tZ210X3N0eXBlcyA9IGF0aDZrbF9tZ210X3N0eXBlczsKKwl2aWYtPnNtZV9zdGF0ZSA9IFNNRV9ESVNDT05ORUNURUQ7CisJY2xlYXJfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpOworCWNsZWFyX2JpdChDT05ORUNUX1BFTkQsICZ2aWYtPmZsYWdzKTsKIAotCXdkZXYtPndpcGh5LT5tYXhfcmVtYWluX29uX2NoYW5uZWxfZHVyYXRpb24gPSA1MDAwOworCS8qIGRpc2FibGUgc2Nhbm5pbmcgKi8KKwlpZiAoYXRoNmtsX3dtaV9zY2FucGFyYW1zX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIDB4RkZGRiwgMCwgMCwKKwkJCQkgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwKSAhPSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGg2a2w6IGZhaWxlZCB0byBkaXNhYmxlIHNjYW4gIgorCQkgICAgICAgImR1cmluZyBzdXNwZW5kXG4iKTsKIAotCS8qIHNldCBkZXZpY2UgcG9pbnRlciBmb3Igd2lwaHkgKi8KLQlzZXRfd2lwaHlfZGV2KHdkZXYtPndpcGh5LCBkZXYpOwotCi0Jd2Rldi0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8Ci0JCUJJVChOTDgwMjExX0lGVFlQRV9BREhPQykgfCBCSVQoTkw4MDIxMV9JRlRZUEVfQVApOwotCWlmIChhci0+cDJwKSB7Ci0JCXdkZXYtPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gQklUKE5MODAyMTFfSUZUWVBFX1AyUF9HTykgfAotCQkJQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpOwotCX0KLQkvKiBtYXggbnVtIG9mIHNzaWRzIHRoYXQgY2FuIGJlIHByb2JlZCBkdXJpbmcgc2Nhbm5pbmcgKi8KLQl3ZGV2LT53aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSBNQVhfUFJPQkVEX1NTSURfSU5ERVg7Ci0Jd2Rldi0+d2lwaHktPm1heF9zY2FuX2llX2xlbiA9IDEwMDA7IC8qIEZJWDogd2hhdCBpcyBjb3JyZWN0IGxpbWl0PyAqLwotCXdkZXYtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZhdGg2a2xfYmFuZF8yZ2h6OwotCXdkZXYtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9ICZhdGg2a2xfYmFuZF81Z2h6OwotCXdkZXYtPndpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKLQotCXdkZXYtPndpcGh5LT5jaXBoZXJfc3VpdGVzID0gY2lwaGVyX3N1aXRlczsKLQl3ZGV2LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzID0gQVJSQVlfU0laRShjaXBoZXJfc3VpdGVzKTsKLQotCXJldCA9IHdpcGh5X3JlZ2lzdGVyKHdkZXYtPndpcGh5KTsKLQlpZiAocmV0IDwgMCkgewotCQlhdGg2a2xfZXJyKCJjb3VsZG4ndCByZWdpc3RlciB3aXBoeSBkZXZpY2VcbiIpOwotCQl3aXBoeV9mcmVlKHdkZXYtPndpcGh5KTsKLQkJa2ZyZWUod2Rldik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiB3ZGV2OworCWF0aDZrbF9jZmc4MDIxMV9zY2FuX2NvbXBsZXRlX2V2ZW50KHZpZiwgdHJ1ZSk7CiB9CiAKLXZvaWQgYXRoNmtsX2NmZzgwMjExX2RlaW5pdChzdHJ1Y3QgYXRoNmtsICphcikKK3N0cnVjdCBhdGg2a2wgKmF0aDZrbF9jb3JlX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gYXItPndkZXY7CisJc3RydWN0IGF0aDZrbCAqYXI7CisJc3RydWN0IHdpcGh5ICp3aXBoeTsKKwl1OCBjdHI7CiAKLQlpZiAoYXItPnNjYW5fcmVxKSB7Ci0JCWNmZzgwMjExX3NjYW5fZG9uZShhci0+c2Nhbl9yZXEsIHRydWUpOwotCQlhci0+c2Nhbl9yZXEgPSBOVUxMOworCS8qIGNyZWF0ZSBhIG5ldyB3aXBoeSBmb3IgdXNlIHdpdGggY2ZnODAyMTEgKi8KKwl3aXBoeSA9IHdpcGh5X25ldygmYXRoNmtsX2NmZzgwMjExX29wcywgc2l6ZW9mKHN0cnVjdCBhdGg2a2wpKTsKKworCWlmICghd2lwaHkpIHsKKwkJYXRoNmtsX2VycigiY291bGRuJ3QgYWxsb2NhdGUgd2lwaHkgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKCF3ZGV2KQotCQlyZXR1cm47CisJYXIgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlpZiAoIW11bHRpX25vcm1faWZfc3VwcG9ydCkKKwkJYXItPnAycCA9ICEhYXRoNmtsX3AycDsKKwlhci0+d2lwaHkgPSB3aXBoeTsKKwlhci0+ZGV2ID0gZGV2OwogCi0Jd2lwaHlfdW5yZWdpc3Rlcih3ZGV2LT53aXBoeSk7Ci0Jd2lwaHlfZnJlZSh3ZGV2LT53aXBoeSk7Ci0Ja2ZyZWUod2Rldik7CisJaWYgKG11bHRpX25vcm1faWZfc3VwcG9ydCkKKwkJYXItPm1heF9ub3JtX2lmYWNlID0gMjsKKwllbHNlCisJCWFyLT5tYXhfbm9ybV9pZmFjZSA9IDE7CisKKwkvKiBGSVhNRTogUmVtb3ZlIHRoaXMgb25jZSB0aGUgbXVsdGl2aWYgc3VwcG9ydCBpcyBlbmFibGVkICovCisJYXItPm1heF9ub3JtX2lmYWNlID0gMTsKKworCXNwaW5fbG9ja19pbml0KCZhci0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFyLT5tY2FzdHBzcV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYXItPmxpc3RfbG9jayk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhci0+ZXZlbnRfd3EpOworCXNlbWFfaW5pdCgmYXItPnNlbSwgMSk7CisKKwlJTklUX0xJU1RfSEVBRCgmYXItPmFtc2R1X3J4X2J1ZmZlcl9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmFyLT52aWZfbGlzdCk7CisKKwljbGVhcl9iaXQoV01JX0VOQUJMRUQsICZhci0+ZmxhZyk7CisJY2xlYXJfYml0KFNLSVBfU0NBTiwgJmFyLT5mbGFnKTsKKwljbGVhcl9iaXQoREVTVFJPWV9JTl9QUk9HUkVTUywgJmFyLT5mbGFnKTsKKworCWFyLT5saXN0ZW5faW50dmxfdCA9IEFfREVGQVVMVF9MSVNURU5fSU5URVJWQUw7CisJYXItPmxpc3Rlbl9pbnR2bF9iID0gMDsKKwlhci0+dHhfcHdyID0gMDsKKworCWFyLT5pbnRyYV9ic3MgPSAxOworCW1lbXNldCgmYXItPnNjX3BhcmFtcywgMCwgc2l6ZW9mKGFyLT5zY19wYXJhbXMpKTsKKwlhci0+c2NfcGFyYW1zLnNob3J0X3NjYW5fcmF0aW8gPSBXTUlfU0hPUlRTQ0FOUkFUSU9fREVGQVVMVDsKKwlhci0+c2NfcGFyYW1zLnNjYW5fY3RybF9mbGFncyA9IERFRkFVTFRfU0NBTl9DVFJMX0ZMQUdTOworCWFyLT5scnNzaV9yb2FtX3RocmVzaG9sZCA9IERFRl9MUlNTSV9ST0FNX1RIUkVTSE9MRDsKKworCWFyLT5zdGF0ZSA9IEFUSDZLTF9TVEFURV9PRkY7CisKKwltZW1zZXQoKHU4ICopYXItPnN0YV9saXN0LCAwLAorCSAgICAgICBBUF9NQVhfTlVNX1NUQSAqIHNpemVvZihzdHJ1Y3QgYXRoNmtsX3N0YSkpOworCisJLyogSW5pdCB0aGUgUFMgcXVldWVzICovCisJZm9yIChjdHIgPSAwOyBjdHIgPCBBUF9NQVhfTlVNX1NUQTsgY3RyKyspIHsKKwkJc3Bpbl9sb2NrX2luaXQoJmFyLT5zdGFfbGlzdFtjdHJdLnBzcV9sb2NrKTsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXItPnN0YV9saXN0W2N0cl0ucHNxKTsKKwl9CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZhci0+bWNhc3Rwc3EpOworCisJbWVtY3B5KGFyLT5hcF9jb3VudHJ5X2NvZGUsIERFRl9BUF9DT1VOVFJZX0NPREUsIDMpOworCisJcmV0dXJuIGFyOworfQorCitpbnQgYXRoNmtsX3JlZ2lzdGVyX2llZWU4MDIxMV9odyhzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gYXItPndpcGh5OworCWludCByZXQ7CisKKwl3aXBoeS0+bWdtdF9zdHlwZXMgPSBhdGg2a2xfbWdtdF9zdHlwZXM7CisKKwl3aXBoeS0+bWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uID0gNTAwMDsKKworCS8qIHNldCBkZXZpY2UgcG9pbnRlciBmb3Igd2lwaHkgKi8KKwlzZXRfd2lwaHlfZGV2KHdpcGh5LCBhci0+ZGV2KTsKKworCXdpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAorCQkJCSBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpIHwKKwkJCQkgQklUKE5MODAyMTFfSUZUWVBFX0FQKTsKKwlpZiAoYXItPnAycCkgeworCQl3aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKKwkJCQkJICBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCk7CisJfQorCisJLyogbWF4IG51bSBvZiBzc2lkcyB0aGF0IGNhbiBiZSBwcm9iZWQgZHVyaW5nIHNjYW5uaW5nICovCisJd2lwaHktPm1heF9zY2FuX3NzaWRzID0gTUFYX1BST0JFRF9TU0lEX0lOREVYOworCXdpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSAxMDAwOyAvKiBGSVg6IHdoYXQgaXMgY29ycmVjdCBsaW1pdD8gKi8KKwl3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmYXRoNmtsX2JhbmRfMmdoejsKKwl3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSAmYXRoNmtsX2JhbmRfNWdoejsKKwl3aXBoeS0+c2lnbmFsX3R5cGUgPSBDRkc4MDIxMV9TSUdOQUxfVFlQRV9NQk07CisKKwl3aXBoeS0+Y2lwaGVyX3N1aXRlcyA9IGNpcGhlcl9zdWl0ZXM7CisJd2lwaHktPm5fY2lwaGVyX3N1aXRlcyA9IEFSUkFZX1NJWkUoY2lwaGVyX3N1aXRlcyk7CisKKwl3aXBoeS0+d293bGFuLmZsYWdzID0gV0lQSFlfV09XTEFOX01BR0lDX1BLVCB8CisJCQkgICAgICBXSVBIWV9XT1dMQU5fRElTQ09OTkVDVCB8CisJCQkgICAgICBXSVBIWV9XT1dMQU5fR1RLX1JFS0VZX0ZBSUxVUkUgIHwKKwkJCSAgICAgIFdJUEhZX1dPV0xBTl9TVVBQT1JUU19HVEtfUkVLRVkgfAorCQkJICAgICAgV0lQSFlfV09XTEFOX0VBUF9JREVOVElUWV9SRVEgICB8CisJCQkgICAgICBXSVBIWV9XT1dMQU5fNFdBWV9IQU5EU0hBS0U7CisJd2lwaHktPndvd2xhbi5uX3BhdHRlcm5zID0gV09XX01BWF9GSUxURVJTX1BFUl9MSVNUOworCXdpcGh5LT53b3dsYW4ucGF0dGVybl9taW5fbGVuID0gMTsKKwl3aXBoeS0+d293bGFuLnBhdHRlcm5fbWF4X2xlbiA9IFdPV19QQVRURVJOX1NJWkU7CisKKwlyZXQgPSB3aXBoeV9yZWdpc3Rlcih3aXBoeSk7CisJaWYgKHJldCA8IDApIHsKKwkJYXRoNmtsX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgd2lwaHkgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg2a2xfaW5pdF9pZl9kYXRhKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCit7CisJdmlmLT5hZ2dyX2NudHh0ID0gYWdncl9pbml0KHZpZi0+bmRldik7CisJaWYgKCF2aWYtPmFnZ3JfY250eHQpIHsKKwkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgYWdnclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNldHVwX3RpbWVyKCZ2aWYtPmRpc2Nvbm5lY3RfdGltZXIsIGRpc2Nvbm5lY3RfdGltZXJfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB2aWYtPm5kZXYpOworCXNldF9iaXQoV01NX0VOQUJMRUQsICZ2aWYtPmZsYWdzKTsKKwlzcGluX2xvY2tfaW5pdCgmdmlmLT5pZl9sb2NrKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGF0aDZrbF9kZWluaXRfaWZfZGF0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKKworCWFnZ3JfbW9kdWxlX2Rlc3Ryb3kodmlmLT5hZ2dyX2NudHh0KTsKKworCWFyLT5hdmFpbF9pZHhfbWFwIHw9IEJJVCh2aWYtPmZ3X3ZpZl9pZHgpOworCisJaWYgKHZpZi0+bndfdHlwZSA9PSBBREhPQ19ORVRXT1JLKQorCQlhci0+aWJzc19pZl9hY3RpdmUgPSBmYWxzZTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHZpZi0+bmRldik7CisKKwlhci0+bnVtX3ZpZi0tOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqYXRoNmtsX2ludGVyZmFjZV9hZGQoc3RydWN0IGF0aDZrbCAqYXIsIGNoYXIgKm5hbWUsCisJCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTggZndfdmlmX2lkeCwKKwkJCQkJdTggbndfdHlwZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOworCisJbmRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnZpZiksIG5hbWUsIGV0aGVyX3NldHVwKTsKKwlpZiAoIW5kZXYpCisJCXJldHVybiBOVUxMOworCisJdmlmID0gbmV0ZGV2X3ByaXYobmRldik7CisJbmRldi0+aWVlZTgwMjExX3B0ciA9ICZ2aWYtPndkZXY7CisJdmlmLT53ZGV2LndpcGh5ID0gYXItPndpcGh5OworCXZpZi0+YXIgPSBhcjsKKwl2aWYtPm5kZXYgPSBuZGV2OworCVNFVF9ORVRERVZfREVWKG5kZXYsIHdpcGh5X2Rldih2aWYtPndkZXYud2lwaHkpKTsKKwl2aWYtPndkZXYubmV0ZGV2ID0gbmRldjsKKwl2aWYtPndkZXYuaWZ0eXBlID0gdHlwZTsKKwl2aWYtPmZ3X3ZpZl9pZHggPSBmd192aWZfaWR4OworCXZpZi0+bndfdHlwZSA9IHZpZi0+bmV4dF9tb2RlID0gbndfdHlwZTsKKworCW1lbWNweShuZGV2LT5kZXZfYWRkciwgYXItPm1hY19hZGRyLCBFVEhfQUxFTik7CisJaWYgKGZ3X3ZpZl9pZHggIT0gMCkKKwkJbmRldi0+ZGV2X2FkZHJbMF0gPSAobmRldi0+ZGV2X2FkZHJbMF0gXiAoMSA8PCBmd192aWZfaWR4KSkgfAorCQkJCSAgICAgMHgyOworCisJaW5pdF9uZXRkZXYobmRldik7CisKKwlhdGg2a2xfaW5pdF9jb250cm9sX2luZm8odmlmKTsKKworCS8qIFRPRE86IFBhc3MgaW50ZXJmYWNlIHNwZWNpZmljIHBvaW50ZXIgaW5zdGVhZCBvZiBhciAqLworCWlmIChhdGg2a2xfaW5pdF9pZl9kYXRhKHZpZikpCisJCWdvdG8gZXJyOworCisJaWYgKHJlZ2lzdGVyX25ldGRldmljZShuZGV2KSkKKwkJZ290byBlcnI7CisKKwlhci0+YXZhaWxfaWR4X21hcCAmPSB+QklUKGZ3X3ZpZl9pZHgpOworCXZpZi0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKKwlzZXRfYml0KFdMQU5fRU5BQkxFRCwgJnZpZi0+ZmxhZ3MpOworCWFyLT53bGFuX3B3cl9zdGF0ZSA9IFdMQU5fUE9XRVJfU1RBVEVfT047CisJc2V0X2JpdChORVRERVZfUkVHSVNURVJFRCwgJnZpZi0+ZmxhZ3MpOworCisJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCWFyLT5pYnNzX2lmX2FjdGl2ZSA9IHRydWU7CisKKwlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnZpZi0+bGlzdCwgJmFyLT52aWZfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCisJcmV0dXJuIG5kZXY7CisKK2VycjoKKwlhZ2dyX21vZHVsZV9kZXN0cm95KHZpZi0+YWdncl9jbnR4dCk7CisJZnJlZV9uZXRkZXYobmRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgYXRoNmtsX2RlaW5pdF9pZWVlODAyMTFfaHcoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJd2lwaHlfdW5yZWdpc3Rlcihhci0+d2lwaHkpOworCXdpcGh5X2ZyZWUoYXItPndpcGh5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuaAppbmRleCBhODRhZGMyLi41OWZhOWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5oCkBAIC0xNywyMyArMTcsNDEgQEAKICNpZm5kZWYgQVRINktMX0NGRzgwMjExX0gKICNkZWZpbmUgQVRINktMX0NGRzgwMjExX0gKIAotc3RydWN0IHdpcmVsZXNzX2RldiAqYXRoNmtsX2NmZzgwMjExX2luaXQoc3RydWN0IGRldmljZSAqZGV2KTsKLXZvaWQgYXRoNmtsX2NmZzgwMjExX2RlaW5pdChzdHJ1Y3QgYXRoNmtsICphcik7CitlbnVtIGF0aDZrbF9jZmdfc3VzcGVuZF9tb2RlIHsKKwlBVEg2S0xfQ0ZHX1NVU1BFTkRfREVFUFNMRUVQLAorCUFUSDZLTF9DRkdfU1VTUEVORF9DVVRQT1dFUiwKKwlBVEg2S0xfQ0ZHX1NVU1BFTkRfV09XCit9OwogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9zY2FuX2NvbXBsZXRlX2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCBpbnQgc3RhdHVzKTsKK3N0cnVjdCBuZXRfZGV2aWNlICphdGg2a2xfaW50ZXJmYWNlX2FkZChzdHJ1Y3QgYXRoNmtsICphciwgY2hhciAqbmFtZSwKKwkJCQkJZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAorCQkJCQl1OCBmd192aWZfaWR4LCB1OCBud190eXBlKTsKK2ludCBhdGg2a2xfcmVnaXN0ZXJfaWVlZTgwMjExX2h3KHN0cnVjdCBhdGg2a2wgKmFyKTsKK3N0cnVjdCBhdGg2a2wgKmF0aDZrbF9jb3JlX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldik7Cit2b2lkIGF0aDZrbF9kZWluaXRfaWVlZTgwMjExX2h3KHN0cnVjdCBhdGg2a2wgKmFyKTsKIAotdm9pZCBhdGg2a2xfY2ZnODAyMTFfY29ubmVjdF9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTE2IGNoYW5uZWwsCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9zY2FuX2NvbXBsZXRlX2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIGJvb2wgYWJvcnRlZCk7CisKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwsCiAJCQkJICAgdTggKmJzc2lkLCB1MTYgbGlzdGVuX2ludHZsLAogCQkJCSAgIHUxNiBiZWFjb25faW50dmwsCiAJCQkJICAgZW51bSBuZXR3b3JrX3R5cGUgbndfdHlwZSwKIAkJCQkgICB1OCBiZWFjb25faWVfbGVuLCB1OCBhc3NvY19yZXFfbGVuLAogCQkJCSAgIHU4IGFzc29jX3Jlc3BfbGVuLCB1OCAqYXNzb2NfaW5mbyk7CiAKLXZvaWQgYXRoNmtsX2NmZzgwMjExX2Rpc2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHJlYXNvbiwKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX2Rpc2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggcmVhc29uLAogCQkJCSAgICAgIHU4ICpic3NpZCwgdTggYXNzb2NfcmVzcF9sZW4sCiAJCQkJICAgICAgdTggKmFzc29jX2luZm8sIHUxNiBwcm90b19yZWFzb24pOwogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV90a2lwX21pY2Vycl9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTgga2V5aWQsCit2b2lkIGF0aDZrbF9jZmc4MDIxMV90a2lwX21pY2Vycl9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCBrZXlpZCwKIAkJCQkgICAgIGJvb2wgaXNtY2FzdCk7CiAKK2ludCBhdGg2a2xfY2ZnODAyMTFfc3VzcGVuZChzdHJ1Y3QgYXRoNmtsICphciwKKwkJCSAgICBlbnVtIGF0aDZrbF9jZmdfc3VzcGVuZF9tb2RlIG1vZGUsCisJCQkgICAgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KTsKKworaW50IGF0aDZrbF9jZmc4MDIxMV9yZXN1bWUoc3RydWN0IGF0aDZrbCAqYXIpOworCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKTsKKwogI2VuZGlmIC8qIEFUSDZLTF9DRkc4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jb21tb24uaAppbmRleCBiOTJmMGU1Li40MWU0NjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29tbW9uLmgKQEAgLTIzLDggKzIzLDYgQEAKIAogZXh0ZXJuIGludCBhdGg2a2xfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKLSNkZWZpbmUgQV9DQUNIRV9MSU5FX1BBRCAgICAgICAgICAgIDEyOAotCiAvKgogICogUmVmbGVjdHMgdGhlIHZlcnNpb24gb2YgYmluYXJ5IGludGVyZmFjZSBleHBvc2VkIGJ5IEFUSDZLTCB0YXJnZXQKICAqIGZpcm13YXJlLiBOZWVkcyB0byBiZSBpbmNyZW1lbnRlZCBieSAxIGZvciBhbnkgY2hhbmdlIGluIHRoZSBmaXJtd2FyZQpAQCAtNzgsMjAgKzc2LDEwIEBACiBzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0Owogc3RydWN0IGF0aDZrbDsKIGVudW0gaHRjX2NyZWRpdF9kaXN0X3JlYXNvbjsKLXN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm87CitzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbzsKIAotaW50IGF0aDZrX3NldHVwX2NyZWRpdF9kaXN0KHZvaWQgKmh0Y19oYW5kbGUsCi0JCQkgICAgc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvKTsKLXZvaWQgYXRoNmtfY3JlZGl0X2Rpc3RyaWJ1dGUoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmYsCi0JCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwZGlzdF9saXN0LAotCQkJICAgICBlbnVtIGh0Y19jcmVkaXRfZGlzdF9yZWFzb24gcmVhc29uKTsKLXZvaWQgYXRoNmtfY3JlZGl0X2luaXQoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmYsCi0JCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplcF9saXN0LAotCQkgICAgICAgaW50IHRvdF9jcmVkaXRzKTsKLXZvaWQgYXRoNmtfc2Vla19jcmVkaXRzKHN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmNyZWRfaW5mLAotCQkJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCk7CiBzdHJ1Y3QgYXRoNmtsICphdGg2a2xfY29yZV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpzZGV2KTsKIGludCBhdGg2a2xfY29yZV9pbml0KHN0cnVjdCBhdGg2a2wgKmFyKTsKLWludCBhdGg2a2xfdW5hdmFpbF9ldihzdHJ1Y3QgYXRoNmtsICphcik7Cit2b2lkIGF0aDZrbF9jb3JlX2NsZWFudXAoc3RydWN0IGF0aDZrbCAqYXIpOwogc3RydWN0IHNrX2J1ZmYgKmF0aDZrbF9idWZfYWxsb2MoaW50IHNpemUpOwogI2VuZGlmIC8qIENPTU1PTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvcmUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5oCmluZGV4IDZkOGE0ODQuLmU3ZTA5NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5oCkBAIC0xNjYsNiArMTY2LDcgQEAKICNkZWZpbmUgQVRINktMX0NPTkZfSUdOT1JFX1BTX0ZBSUxfRVZUX0lOX1NDQU4gIEJJVCgxKQogI2RlZmluZSBBVEg2S0xfQ09ORl9FTkFCTEVfMTFOCQkJQklUKDIpCiAjZGVmaW5lIEFUSDZLTF9DT05GX0VOQUJMRV9UWF9CVVJTVAkJQklUKDMpCisjZGVmaW5lIEFUSDZLTF9DT05GX1NVU1BFTkRfQ1VUUE9XRVIJCUJJVCg0KQogCiBlbnVtIHdsYW5fbG93X3B3cl9zdGF0ZSB7CiAJV0xBTl9QT1dFUl9TVEFURV9PTiwKQEAgLTM4MCw0MCArMzgxLDMzIEBACiAJdTgga2V5X2xlbjsKIH07CiAKLS8qIEZsYWcgaW5mbyAqLwotI2RlZmluZSBXTUlfRU5BQkxFRAkwCi0jZGVmaW5lIFdNSV9SRUFEWQkxCi0jZGVmaW5lIENPTk5FQ1RFRAkyCi0jZGVmaW5lIFNUQVRTX1VQREFURV9QRU5EIDMKLSNkZWZpbmUgQ09OTkVDVF9QRU5ECSAgNAotI2RlZmluZSBXTU1fRU5BQkxFRAkgIDUKLSNkZWZpbmUgTkVUUV9TVE9QUEVECSAgNgotI2RlZmluZSBXTUlfQ1RSTF9FUF9GVUxMICA3Ci0jZGVmaW5lIERUSU1fRVhQSVJFRAkgIDgKLSNkZWZpbmUgREVTVFJPWV9JTl9QUk9HUkVTUyAgOQotI2RlZmluZSBORVRERVZfUkVHSVNURVJFRCAgICAxMAotI2RlZmluZSBTS0lQX1NDQU4JICAgICAxMQotI2RlZmluZSBXTEFOX0VOQUJMRUQJICAgICAxMgotI2RlZmluZSBURVNUTU9ERQkgICAgIDEzCi0jZGVmaW5lIENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04gMTQKLSNkZWZpbmUgRFRJTV9QRVJJT0RfQVZBSUwgICAgMTUKKyNkZWZpbmUgTUFYX05VTV9WSUYJMQogCi1zdHJ1Y3QgYXRoNmtsIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7Ci0Jc3RydWN0IGF0aDZrbF9ibWkgYm1pOwotCWNvbnN0IHN0cnVjdCBhdGg2a2xfaGlmX29wcyAqaGlmX29wczsKLQlzdHJ1Y3Qgd21pICp3bWk7Ci0JaW50IHR4X3BlbmRpbmdbRU5EUE9JTlRfTUFYXTsKLQlpbnQgdG90YWxfdHhfZGF0YV9wZW5kOwotCXN0cnVjdCBodGNfdGFyZ2V0ICpodGNfdGFyZ2V0OwotCXZvaWQgKmhpZl9wcml2OwotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKy8qIHZpZiBmbGFncyBpbmZvICovCitlbnVtIGF0aDZrbF92aWZfc3RhdGUgeworCUNPTk5FQ1RFRCwKKwlDT05ORUNUX1BFTkQsCisJV01NX0VOQUJMRUQsCisJTkVUUV9TVE9QUEVELAorCURUSU1fRVhQSVJFRCwKKwlORVRERVZfUkVHSVNURVJFRCwKKwlDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLAorCURUSU1fUEVSSU9EX0FWQUlMLAorCVdMQU5fRU5BQkxFRCwKKwlTVEFUU19VUERBVEVfUEVORCwKK307CisKK3N0cnVjdCBhdGg2a2xfdmlmIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHdpcmVsZXNzX2RldiB3ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBhdGg2a2wgKmFyOworCS8qIExvY2sgdG8gcHJvdGVjdCB2aWYgc3BlY2lmaWMgbmV0X3N0YXRzIGFuZCBmbGFncyAqLworCXNwaW5sb2NrX3QgaWZfbG9jazsKKwl1OCBmd192aWZfaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHNzaWRfbGVuOwogCXU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07Ci0JdTggbmV4dF9tb2RlOwotCXU4IG53X3R5cGU7CiAJdTggZG90MTFfYXV0aF9tb2RlOwogCXU4IGF1dGhfbW9kZTsKIAl1OCBwcndpc2VfY3J5cHRvOwpAQCAtNDIxLDIxICs0MTUsODMgQEAKIAl1OCBncnBfY3J5cHRvOwogCXU4IGdycF9jcnlwdG9fbGVuOwogCXU4IGRlZl90eGtleV9pbmRleDsKLQlzdHJ1Y3QgYXRoNmtsX3dlcF9rZXkgd2VwX2tleV9saXN0W1dNSV9NQVhfS0VZX0lOREVYICsgMV07CisJdTggbmV4dF9tb2RlOworCXU4IG53X3R5cGU7CiAJdTggYnNzaWRbRVRIX0FMRU5dOwogCXU4IHJlcV9ic3NpZFtFVEhfQUxFTl07CiAJdTE2IGNoX2hpbnQ7CiAJdTE2IGJzc19jaDsKKwlzdHJ1Y3QgYXRoNmtsX3dlcF9rZXkgd2VwX2tleV9saXN0W1dNSV9NQVhfS0VZX0lOREVYICsgMV07CisJc3RydWN0IGF0aDZrbF9rZXkga2V5c1tXTUlfTUFYX0tFWV9JTkRFWCArIDFdOworCXN0cnVjdCBhZ2dyX2luZm8gKmFnZ3JfY250eHQ7CisJc3RydWN0IHRpbWVyX2xpc3QgZGlzY29ubmVjdF90aW1lcjsKKwlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcTsKKwllbnVtIHNtZV9zdGF0ZSBzbWVfc3RhdGU7CisJaW50IHJlY29ubmVjdF9mbGFnOworCXUzMiBsYXN0X3JvY19pZDsKKwl1MzIgbGFzdF9jYW5jZWxfcm9jX2lkOworCXUzMiBzZW5kX2FjdGlvbl9pZDsKKwlib29sIHByb2JlX3JlcV9yZXBvcnQ7CisJdTE2IG5leHRfY2hhbjsKKwl1MTYgYXNzb2NfYnNzX2JlYWNvbl9pbnQ7CisJdTggYXNzb2NfYnNzX2R0aW1fcGVyaW9kOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKwlzdHJ1Y3QgdGFyZ2V0X3N0YXRzIHRhcmdldF9zdGF0czsKK307CisKKyNkZWZpbmUgV09XX0xJU1RfSUQJCTAKKyNkZWZpbmUgV09XX0hPU1RfUkVRX0RFTEFZCTUwMCAvKiBtcyAqLworCisvKiBGbGFnIGluZm8gKi8KK2VudW0gYXRoNmtsX2Rldl9zdGF0ZSB7CisJV01JX0VOQUJMRUQsCisJV01JX1JFQURZLAorCVdNSV9DVFJMX0VQX0ZVTEwsCisJVEVTVE1PREUsCisJREVTVFJPWV9JTl9QUk9HUkVTUywKKwlTS0lQX1NDQU4sCisJUk9BTV9UQkxfUEVORCwKKwlGSVJTVF9CT09ULAorfTsKKworZW51bSBhdGg2a2xfc3RhdGUgeworCUFUSDZLTF9TVEFURV9PRkYsCisJQVRINktMX1NUQVRFX09OLAorCUFUSDZLTF9TVEFURV9ERUVQU0xFRVAsCisJQVRINktMX1NUQVRFX0NVVFBPV0VSLAorCUFUSDZLTF9TVEFURV9XT1csCit9OworCitzdHJ1Y3QgYXRoNmtsIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHdpcGh5ICp3aXBoeTsKKworCWVudW0gYXRoNmtsX3N0YXRlIHN0YXRlOworCisJc3RydWN0IGF0aDZrbF9ibWkgYm1pOworCWNvbnN0IHN0cnVjdCBhdGg2a2xfaGlmX29wcyAqaGlmX29wczsKKwlzdHJ1Y3Qgd21pICp3bWk7CisJaW50IHR4X3BlbmRpbmdbRU5EUE9JTlRfTUFYXTsKKwlpbnQgdG90YWxfdHhfZGF0YV9wZW5kOworCXN0cnVjdCBodGNfdGFyZ2V0ICpodGNfdGFyZ2V0OworCXZvaWQgKmhpZl9wcml2OworCXN0cnVjdCBsaXN0X2hlYWQgdmlmX2xpc3Q7CisJLyogTG9jayB0byBhdm9pZCByYWNlIGluIHZpZl9saXN0IGVudHJpZXMgYW1vbmcgYWRkL2RlbC90cmF2ZXJzZSAqLworCXNwaW5sb2NrX3QgbGlzdF9sb2NrOworCXU4IG51bV92aWY7CisJdTggbWF4X25vcm1faWZhY2U7CisJdTggYXZhaWxfaWR4X21hcDsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CiAJdTE2IGxpc3Rlbl9pbnR2bF9iOwogCXUxNiBsaXN0ZW5faW50dmxfdDsKIAl1OCBscnNzaV9yb2FtX3RocmVzaG9sZDsKIAlzdHJ1Y3QgYXRoNmtsX3ZlcnNpb24gdmVyc2lvbjsKIAl1MzIgdGFyZ2V0X3R5cGU7CiAJdTggdHhfcHdyOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKLQlzdHJ1Y3QgdGFyZ2V0X3N0YXRzIHRhcmdldF9zdGF0czsKIAlzdHJ1Y3QgYXRoNmtsX25vZGVfbWFwcGluZyBub2RlX21hcFtNQVhfTk9ERV9OVU1dOwogCXU4IGlic3NfcHNfZW5hYmxlOworCWJvb2wgaWJzc19pZl9hY3RpdmU7CiAJdTggbm9kZV9udW07CiAJdTggbmV4dF9lcF9pZDsKIAlzdHJ1Y3QgYXRoNmtsX2Nvb2tpZSAqY29va2llX2xpc3Q7CkBAIC00NDYsNyArNTAyLDcgQEAKIAl1OCBoaWFjX3N0cmVhbV9hY3RpdmVfcHJpOwogCXU4IGVwMmFjX21hcFtFTkRQT0lOVF9NQVhdOwogCWVudW0gaHRjX2VuZHBvaW50X2lkIGN0cmxfZXA7Ci0Jc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyBjcmVkaXRfc3RhdGVfaW5mbzsKKwlzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyBjcmVkaXRfc3RhdGVfaW5mbzsKIAl1MzIgY29ubmVjdF9jdHJsX2ZsYWdzOwogCXUzMiB1c2VyX2tleV9jdHJsOwogCXU4IHVzcl9ic3NfZmlsdGVyOwpAQCAtNDU2LDE4ICs1MTIsMTMgQEAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIG1jYXN0cHNxOwogCXNwaW5sb2NrX3QgbWNhc3Rwc3FfbG9jazsKIAl1OCBpbnRyYV9ic3M7Ci0Jc3RydWN0IGFnZ3JfaW5mbyAqYWdncl9jbnR4dDsKIAlzdHJ1Y3Qgd21pX2FwX21vZGVfc3RhdCBhcF9zdGF0czsKIAl1OCBhcF9jb3VudHJ5X2NvZGVbM107CiAJc3RydWN0IGxpc3RfaGVhZCBhbXNkdV9yeF9idWZmZXJfcXVldWU7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgZGlzY29ubmVjdF90aW1lcjsKIAl1OCByeF9tZXRhX3ZlcjsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnNjYW5fcmVxOwotCXN0cnVjdCBhdGg2a2xfa2V5IGtleXNbV01JX01BWF9LRVlfSU5ERVggKyAxXTsKLQllbnVtIHNtZV9zdGF0ZSBzbWVfc3RhdGU7CiAJZW51bSB3bGFuX2xvd19wd3Jfc3RhdGUgd2xhbl9wd3Jfc3RhdGU7CiAJc3RydWN0IHdtaV9zY2FuX3BhcmFtc19jbWQgc2NfcGFyYW1zOworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKICNkZWZpbmUgQVJfTUNBU1RfRklMVEVSX01BQ19BRERSX1NJWkUgIDQKIAlzdHJ1Y3QgewogCQl2b2lkICpyeF9yZXBvcnQ7CkBAIC00ODcsNyArNTM4LDYgQEAKIAlzdHJ1Y3QgYXRoNmtsX21ib3hfaW5mbyBtYm94X2luZm87CiAKIAlzdHJ1Y3QgYXRoNmtsX2Nvb2tpZSBjb29raWVfbWVtW01BWF9DT09LSUVfTlVNXTsKLQlpbnQgcmVjb25uZWN0X2ZsYWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJdTggKmZ3X2JvYXJkOwpAQCAtNTA4LDEzICs1NTgsNyBAQAogCiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19waHk7CiAKLQl1MzIgc2VuZF9hY3Rpb25faWQ7Ci0JYm9vbCBwcm9iZV9yZXFfcmVwb3J0OwotCXUxNiBuZXh0X2NoYW47Ci0KIAlib29sIHAycDsKLQl1MTYgYXNzb2NfYnNzX2JlYWNvbl9pbnQ7Ci0JdTggYXNzb2NfYnNzX2R0aW1fcGVyaW9kOwogCiAjaWZkZWYgQ09ORklHX0FUSDZLTF9ERUJVRwogCXN0cnVjdCB7CkBAIC01MjksMjMgKzU3MywxOSBAQAogCQlzdHJ1Y3QgewogCQkJdW5zaWduZWQgaW50IGludmFsaWRfcmF0ZTsKIAkJfSB3YXJfc3RhdHM7CisKKwkJdTggKnJvYW1fdGJsOworCQl1bnNpZ25lZCBpbnQgcm9hbV90YmxfbGVuOworCisJCXU4IGtlZXBhbGl2ZTsKKwkJdTggZGlzY190aW1lb3V0OwogCX0gZGVidWc7CiAjZW5kaWYgLyogQ09ORklHX0FUSDZLTF9ERUJVRyAqLwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkICphdGg2a2xfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0aDZrbF9kZXBvc2l0X2NyZWRpdF90b19lcChzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvCi0JCQkJCSAgICAgICAqY3JlZF9pbmZvLAotCQkJCQkgICAgICAgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdAotCQkJCQkgICAgICAgKmVwX2Rpc3QsIGludCBjcmVkaXRzKQotewotCWVwX2Rpc3QtPmNyZWRpdHMgKz0gY3JlZGl0czsKLQllcF9kaXN0LT5jcmVkX2Fzc25nZCArPSBjcmVkaXRzOwotCWNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyAtPSBjcmVkaXRzOworCXJldHVybiAoKHN0cnVjdCBhdGg2a2xfdmlmICopIG5ldGRldl9wcml2KGRldikpLT5hcjsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgYXRoNmtsX2dldF9oaV9pdGVtX2FkZHIoc3RydWN0IGF0aDZrbCAqYXIsCkBAIC01NjEsNyArNjAxLDYgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotdm9pZCBhdGg2a2xfZGVzdHJveShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdW5yZWdpc3Rlcik7CiBpbnQgYXRoNmtsX2NvbmZpZ3VyZV90YXJnZXQoc3RydWN0IGF0aDZrbCAqYXIpOwogdm9pZCBhdGg2a2xfZGV0ZWN0X2Vycm9yKHVuc2lnbmVkIGxvbmcgcHRyKTsKIHZvaWQgZGlzY29ubmVjdF90aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgcHRyKTsKQEAgLTU3OSwxMCArNjE4LDggQEAKIGludCBhdGg2a2xfZGlhZ19yZWFkMzIoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLCB1MzIgKnZhbHVlKTsKIGludCBhdGg2a2xfZGlhZ19yZWFkKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgYWRkcmVzcywgdm9pZCAqZGF0YSwgdTMyIGxlbmd0aCk7CiBpbnQgYXRoNmtsX3JlYWRfZndsb2dzKHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKHN0cnVjdCBhdGg2a2wgKmFyKTsKK3ZvaWQgYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpOwogdm9pZCBhdGg2a2xfdHhfZGF0YV9jbGVhbnVwKHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYXRoNmtsX3N0b3BfZW5kcG9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBrZWVwX3Byb2ZpbGUsCi0JCQkgIGJvb2wgZ2V0X2RiZ2xvZ3MpOwogCiBzdHJ1Y3QgYXRoNmtsX2Nvb2tpZSAqYXRoNmtsX2FsbG9jX2Nvb2tpZShzdHJ1Y3QgYXRoNmtsICphcik7CiB2b2lkIGF0aDZrbF9mcmVlX2Nvb2tpZShzdHJ1Y3QgYXRoNmtsICphciwgc3RydWN0IGF0aDZrbF9jb29raWUgKmNvb2tpZSk7CkBAIC01OTgsNDAgKzYzNSw0OSBAQAogdm9pZCBhZ2dyX21vZHVsZV9kZXN0cm95KHN0cnVjdCBhZ2dyX2luZm8gKmFnZ3JfaW5mbyk7CiB2b2lkIGFnZ3JfcmVzZXRfc3RhdGUoc3RydWN0IGFnZ3JfaW5mbyAqYWdncl9pbmZvKTsKIAotc3RydWN0IGF0aDZrbF9zdGEgKmF0aDZrbF9maW5kX3N0YShzdHJ1Y3QgYXRoNmtsICphciwgdTggKiBub2RlX2FkZHIpOworc3RydWN0IGF0aDZrbF9zdGEgKmF0aDZrbF9maW5kX3N0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCAqIG5vZGVfYWRkcik7CiBzdHJ1Y3QgYXRoNmtsX3N0YSAqYXRoNmtsX2ZpbmRfc3RhX2J5X2FpZChzdHJ1Y3QgYXRoNmtsICphciwgdTggYWlkKTsKIAogdm9pZCBhdGg2a2xfcmVhZHlfZXZlbnQodm9pZCAqZGV2dCwgdTggKiBkYXRhcCwgdTMyIHN3X3ZlciwgdTMyIGFiaV92ZXIpOwogaW50IGF0aDZrbF9jb250cm9sX3R4KHZvaWQgKmRldnQsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgIGVudW0gaHRjX2VuZHBvaW50X2lkIGVpZCk7Ci12b2lkIGF0aDZrbF9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1MTYgY2hhbm5lbCwKK3ZvaWQgYXRoNmtsX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwsCiAJCQkgIHU4ICpic3NpZCwgdTE2IGxpc3Rlbl9pbnQsCiAJCQkgIHUxNiBiZWFjb25faW50LCBlbnVtIG5ldHdvcmtfdHlwZSBuZXRfdHlwZSwKIAkJCSAgdTggYmVhY29uX2llX2xlbiwgdTggYXNzb2NfcmVxX2xlbiwKIAkJCSAgdTggYXNzb2NfcmVzcF9sZW4sIHU4ICphc3NvY19pbmZvKTsKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9ic3Moc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBjaGFubmVsKTsKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9zdGEoc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBhaWQsIHU4ICptYWNfYWRkciwKK3ZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9ic3Moc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwpOwordm9pZCBhdGg2a2xfY29ubmVjdF9hcF9tb2RlX3N0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MTYgYWlkLCB1OCAqbWFjX2FkZHIsCiAJCQkJdTgga2V5bWdtdCwgdTggdWNpcGhlciwgdTggYXV0aCwKIAkJCQl1OCBhc3NvY19yZXFfbGVuLCB1OCAqYXNzb2NfaW5mbyk7Ci12b2lkIGF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCByZWFzb24sCit2b2lkIGF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHJlYXNvbiwKIAkJCSAgICAgdTggKmJzc2lkLCB1OCBhc3NvY19yZXNwX2xlbiwKIAkJCSAgICAgdTggKmFzc29jX2luZm8sIHUxNiBwcm90X3JlYXNvbl9zdGF0dXMpOwotdm9pZCBhdGg2a2xfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtleWlkLCBib29sIGlzbWNhc3QpOwordm9pZCBhdGg2a2xfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTgga2V5aWQsIGJvb2wgaXNtY2FzdCk7CiB2b2lkIGF0aDZrbF90eHB3cl9yeF9ldnQodm9pZCAqZGV2dCwgdTggdHhfcHdyKTsKLXZvaWQgYXRoNmtsX3NjYW5fY29tcGxldGVfZXZ0KHN0cnVjdCBhdGg2a2wgKmFyLCBpbnQgc3RhdHVzKTsKLXZvaWQgYXRoNmtsX3RndF9zdGF0c19ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTggKnB0ciwgdTMyIGxlbik7Cit2b2lkIGF0aDZrbF9zY2FuX2NvbXBsZXRlX2V2dChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBpbnQgc3RhdHVzKTsKK3ZvaWQgYXRoNmtsX3RndF9zdGF0c19ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCAqcHRyLCB1MzIgbGVuKTsKIHZvaWQgYXRoNmtsX2luZGljYXRlX3R4X2FjdGl2aXR5KHZvaWQgKmRldnQsIHU4IHRyYWZmaWNfY2xhc3MsIGJvb2wgYWN0aXZlKTsKIGVudW0gaHRjX2VuZHBvaW50X2lkIGF0aDZrbF9hYzJfZW5kcG9pbnRfaWQodm9pZCAqZGV2dCwgdTggYWMpOwogCi12b2lkIGF0aDZrbF9wc3BvbGxfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGFpZCk7Cit2b2lkIGF0aDZrbF9wc3BvbGxfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggYWlkKTsKIAotdm9pZCBhdGg2a2xfZHRpbWV4cGlyeV9ldmVudChzdHJ1Y3QgYXRoNmtsICphcik7Ci12b2lkIGF0aDZrbF9kaXNjb25uZWN0KHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYXRoNmtsX2RlZXBfc2xlZXBfZW5hYmxlKHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpZCk7Ci12b2lkIGFnZ3JfcmVjdl9hZGRiYV9yZXFfZXZ0KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCB0aWQsIHUxNiBzZXFfbm8sCit2b2lkIGF0aDZrbF9kdGltZXhwaXJ5X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpOwordm9pZCBhdGg2a2xfZGlzY29ubmVjdChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKTsKK3ZvaWQgYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggdGlkKTsKK3ZvaWQgYWdncl9yZWN2X2FkZGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggdGlkLCB1MTYgc2VxX25vLAogCQkJICAgICB1OCB3aW5fc3opOwogdm9pZCBhdGg2a2xfd2FrZXVwX2V2ZW50KHZvaWQgKmRldik7Ci12b2lkIGF0aDZrbF90YXJnZXRfZmFpbHVyZShzdHJ1Y3QgYXRoNmtsICphcik7CisKK3ZvaWQgYXRoNmtsX3Jlc2V0X2RldmljZShzdHJ1Y3QgYXRoNmtsICphciwgdTMyIHRhcmdldF90eXBlLAorCQkJIGJvb2wgd2FpdF9mb3RfY29tcGx0biwgYm9vbCBjb2xkX3Jlc2V0KTsKK3ZvaWQgYXRoNmtsX2luaXRfY29udHJvbF9pbmZvKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpOwordm9pZCBhdGg2a2xfZGVpbml0X2lmX2RhdGEoc3RydWN0IGF0aDZrbF92aWYgKnZpZik7Cit2b2lkIGF0aDZrbF9jb3JlX2ZyZWUoc3RydWN0IGF0aDZrbCAqYXIpOworc3RydWN0IGF0aDZrbF92aWYgKmF0aDZrbF92aWZfZmlyc3Qoc3RydWN0IGF0aDZrbCAqYXIpOwordm9pZCBhdGg2a2xfY2xlYW51cF92aWYoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgYm9vbCB3bWlfcmVhZHkpOworaW50IGF0aDZrbF9pbml0X2h3X3N0YXJ0KHN0cnVjdCBhdGg2a2wgKmFyKTsKK2ludCBhdGg2a2xfaW5pdF9od19zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKTsKK3ZvaWQgYXRoNmtsX2NoZWNrX3dvd19zdGF0dXMoc3RydWN0IGF0aDZrbCAqYXIpOwogCiAjZW5kaWYgLyogQ09SRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmMKaW5kZXggYmEzZjIzZC4uOWVmZjBkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvZGVidWcuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInRhcmdldC5oIgpAQCAtMTQyLDQ5ICsxNDMsNDggQEAKIAogc3RhdGljIHZvaWQgZHVtcF9jcmVkX2Rpc3Qoc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCkKIHsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsCiAJCSAgICItLS0gZW5kcG9pbnQ6ICVkICBzdmNfaWQ6IDB4JVggLS0tXG4iLAogCQkgICBlcF9kaXN0LT5lbmRwb2ludCwgZXBfZGlzdC0+c3ZjX2lkKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLCAiIGRpc3RfZmxhZ3MgICAgIDogMHglWFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULCAiIGRpc3RfZmxhZ3MgICAgIDogMHglWFxuIiwKIAkJICAgZXBfZGlzdC0+ZGlzdF9mbGFncyk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX25vcm0gICAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9ub3JtICAgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9ub3JtKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLCAiIGNyZWRfbWluICAgICAgIDogJWRcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgIiBjcmVkX21pbiAgICAgICA6ICVkXG4iLAogCQkgICBlcF9kaXN0LT5jcmVkX21pbik7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkaXRzICAgICAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZGl0cyAgICAgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZGl0cyk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX2Fzc25nZCAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9hc3NuZ2QgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9hc3NuZ2QpOwotCWF0aDZrbF9kYmcoQVRINktMX0RCR19BTlksICIgc2Vla19jcmVkICAgICAgOiAlZFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULCAiIHNlZWtfY3JlZCAgICAgIDogJWRcbiIsCiAJCSAgIGVwX2Rpc3QtPnNlZWtfY3JlZCk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX3N6ICAgICAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9zeiAgICAgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9zeik7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX3Blcl9tc2cgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9wZXJfbXNnICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9wZXJfbXNnKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLCAiIGNyZWRfdG9fZGlzdCAgIDogJWRcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgIiBjcmVkX3RvX2Rpc3QgICA6ICVkXG4iLAogCQkgICBlcF9kaXN0LT5jcmVkX3RvX2Rpc3QpOwotCWF0aDZrbF9kYmcoQVRINktMX0RCR19BTlksICIgdHhxX2RlcHRoICAgICAgOiAlZFxuIiwKLQkJICAgZ2V0X3F1ZXVlX2RlcHRoKCYoKHN0cnVjdCBodGNfZW5kcG9pbnQgKikKLQkJCQkgICAgIGVwX2Rpc3QtPmh0Y19yc3ZkKS0+dHhxKSk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULCAiIHR4cV9kZXB0aCAgICAgIDogJWRcbiIsCisJCSAgIGdldF9xdWV1ZV9kZXB0aCgmZXBfZGlzdC0+aHRjX2VwLT50eHEpKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULAogCQkgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiB9CiAKKy8qIEZJWE1FOiBtb3ZlIHRvIGh0Yy5jICovCiB2b2lkIGR1bXBfY3JlZF9kaXN0X3N0YXRzKHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpCiB7CiAJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfbGlzdDsKIAotCWlmICghQVJfREJHX0xWTF9DSEVDSyhBVEg2S0xfREJHX1RSQykpCisJaWYgKCFBUl9EQkdfTFZMX0NIRUNLKEFUSDZLTF9EQkdfQ1JFRElUKSkKIAkJcmV0dXJuOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlcF9saXN0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwgbGlzdCkKIAkJZHVtcF9jcmVkX2Rpc3QoZXBfbGlzdCk7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICJjdHh0OiVwIGRpc3Q6JXBcbiIsCi0JCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCBOVUxMKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiY3JlZGl0IGRpc3RyaWJ1dGlvbiwgdG90YWwgOiAlZCwgZnJlZSA6ICVkXG4iLAotCQkgICB0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dC0+dG90YWxfYXZhaWxfY3JlZGl0cywKLQkJICAgdGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQtPmN1cl9mcmVlX2NyZWRpdHMpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsCisJCSAgICJjcmVkaXQgZGlzdHJpYnV0aW9uIHRvdGFsICVkIGZyZWUgJWRcbiIsCisJCSAgIHRhcmdldC0+Y3JlZGl0X2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMsCisJCSAgIHRhcmdldC0+Y3JlZGl0X2luZm8tPmN1cl9mcmVlX2NyZWRpdHMpOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF9kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0zOTYsMTMgKzM5NiwyMCBAQAogCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB0YXJnZXRfc3RhdHMgKnRndF9zdGF0cyA9ICZhci0+dGFyZ2V0X3N0YXRzOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CisJc3RydWN0IHRhcmdldF9zdGF0cyAqdGd0X3N0YXRzOwogCWNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBpbnQgbGVuID0gMCwgYnVmX2xlbiA9IDE1MDA7CiAJaW50IGk7CiAJbG9uZyBsZWZ0OwogCXNzaXplX3QgcmV0X2NudDsKIAorCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCXRndF9zdGF0cyA9ICZ2aWYtPnRhcmdldF9zdGF0czsKKwogCWJ1ZiA9IGt6YWxsb2MoYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNDEyLDkgKzQxOSw5IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0Jc2V0X2JpdChTVEFUU19VUERBVEVfUEVORCwgJmFyLT5mbGFnKTsKKwlzZXRfYml0KFNUQVRTX1VQREFURV9QRU5ELCAmdmlmLT5mbGFncyk7CiAKLQlpZiAoYXRoNmtsX3dtaV9nZXRfc3RhdHNfY21kKGFyLT53bWkpKSB7CisJaWYgKGF0aDZrbF93bWlfZ2V0X3N0YXRzX2NtZChhci0+d21pLCAwKSkgewogCQl1cCgmYXItPnNlbSk7CiAJCWtmcmVlKGJ1Zik7CiAJCXJldHVybiAtRUlPOwpAQCAtNDIyLDcgKzQyOSw3IEBACiAKIAlsZWZ0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXItPmV2ZW50X3dxLAogCQkJCQkJIXRlc3RfYml0KFNUQVRTX1VQREFURV9QRU5ELAotCQkJCQkJJmFyLT5mbGFnKSwgV01JX1RJTUVPVVQpOworCQkJCQkJJnZpZi0+ZmxhZ3MpLCBXTUlfVElNRU9VVCk7CiAKIAl1cCgmYXItPnNlbSk7CiAKQEAgLTU1NCwxMCArNTYxLDEwIEBACiAKIAlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUyNXMlNWRcbiIsCiAJCQkgIlRvdGFsIEF2YWlsIENyZWRpdHM6ICIsCi0JCQkgdGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQtPnRvdGFsX2F2YWlsX2NyZWRpdHMpOworCQkJIHRhcmdldC0+Y3JlZGl0X2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMpOwogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTI1cyU1ZFxuIiwKIAkJCSAiRnJlZSBjcmVkaXRzIDoiLAotCQkJIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LT5jdXJfZnJlZV9jcmVkaXRzKTsKKwkJCSB0YXJnZXQtPmNyZWRpdF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzKTsKIAogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLAogCQkJICIgRXBpZCAgRmxhZ3MgICAgQ3JlZF9ub3JtICBDcmVkX21pbiAgQ3JlZGl0cyAgQ3JlZF9hc3NuZ2QiCkBAIC01NzYsOCArNTgzLDcgQEAKIAkJcHJpbnRfY3JlZGl0X2luZm8oIiU5ZCIsIGNyZWRfcGVyX21zZyk7CiAJCXByaW50X2NyZWRpdF9pbmZvKCIlMTRkIiwgY3JlZF90b19kaXN0KTsKIAkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlMTJkXG4iLAotCQkJCSBnZXRfcXVldWVfZGVwdGgoJigoc3RydWN0IGh0Y19lbmRwb2ludCAqKQotCQkJCQkJIGVwX2xpc3QtPmh0Y19yc3ZkKS0+dHhxKSk7CisJCQkJIGdldF9xdWV1ZV9kZXB0aCgmZXBfbGlzdC0+aHRjX2VwLT50eHEpKTsKIAl9CiAKIAlpZiAobGVuID4gYnVmX2xlbikKQEAgLTU5NSw2ICs2MDEsMTA3IEBACiAJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAogfTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBwcmludF9lbmRwb2ludF9zdGF0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsIGNoYXIgKmJ1ZiwKKwkJCQkJdW5zaWduZWQgaW50IGJ1Zl9sZW4sIHVuc2lnbmVkIGludCBsZW4sCisJCQkJCWludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisJc3RydWN0IGh0Y19lbmRwb2ludF9zdGF0cyAqZXBfc3Q7CisJdTMyICpjb3VudGVyOworCisJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlczoiLCBuYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgRU5EUE9JTlRfTUFYOyBpKyspIHsKKwkJZXBfc3QgPSAmdGFyZ2V0LT5lbmRwb2ludFtpXS5lcF9zdDsKKwkJY291bnRlciA9ICgodTMyICopIGVwX3N0KSArIChvZmZzZXQgLyA0KTsKKwkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIgJXUiLCAqY291bnRlcik7CisJfQorCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9lbmRwb2ludF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0ID0gYXItPmh0Y190YXJnZXQ7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBidWZfbGVuLCBsZW4gPSAwOworCXNzaXplX3QgcmV0X2NudDsKKworCWJ1Zl9sZW4gPSBzaXplb2Yoc3RydWN0IGh0Y19lbmRwb2ludF9zdGF0cykgLyBzaXplb2YodTMyKSAqCisJCSgyNSArIEVORFBPSU5UX01BWCAqIDExKTsKKwlidWYgPSBrbWFsbG9jKGJ1Zl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworI2RlZmluZSBFUFNUQVQobmFtZSkJCQkJCQkJXAorCWxlbiA9IHByaW50X2VuZHBvaW50X3N0YXQodGFyZ2V0LCBidWYsIGJ1Zl9sZW4sIGxlbiwJCVwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBodGNfZW5kcG9pbnRfc3RhdHMsIG5hbWUpLCBcCisJCQkJICAjbmFtZSkKKwlFUFNUQVQoY3JlZF9sb3dfaW5kaWNhdGUpOworCUVQU1RBVCh0eF9pc3N1ZWQpOworCUVQU1RBVCh0eF9wa3RfYnVuZGxlZCk7CisJRVBTVEFUKHR4X2J1bmRsZXMpOworCUVQU1RBVCh0eF9kcm9wcGVkKTsKKwlFUFNUQVQodHhfY3JlZF9ycHQpOworCUVQU1RBVChjcmVkX3JwdF9mcm9tX3J4KTsKKwlFUFNUQVQoY3JlZF9ycHRfZnJvbV9vdGhlcik7CisJRVBTVEFUKGNyZWRfcnB0X2VwMCk7CisJRVBTVEFUKGNyZWRfZnJvbV9yeCk7CisJRVBTVEFUKGNyZWRfZnJvbV9vdGhlcik7CisJRVBTVEFUKGNyZWRfZnJvbV9lcDApOworCUVQU1RBVChjcmVkX2Nvc3VtZCk7CisJRVBTVEFUKGNyZWRfcmV0bmQpOworCUVQU1RBVChyeF9wa3RzKTsKKwlFUFNUQVQocnhfbGthaGRzKTsKKwlFUFNUQVQocnhfYnVuZGwpOworCUVQU1RBVChyeF9idW5kbGVfbGthaGQpOworCUVQU1RBVChyeF9idW5kbGVfZnJvbV9oZHIpOworCUVQU1RBVChyeF9hbGxvY190aHJlc2hfaGl0KTsKKwlFUFNUQVQocnhhbGxvY190aHJlc2hfYnl0ZSk7CisjdW5kZWYgRVBTVEFUCisKKwlpZiAobGVuID4gYnVmX2xlbikKKwkJbGVuID0gYnVmX2xlbjsKKworCXJldF9jbnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXRfY250OworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfZW5kcG9pbnRfc3RhdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCA9IGFyLT5odGNfdGFyZ2V0OworCWludCByZXQsIGk7CisJdTMyIHZhbDsKKwlzdHJ1Y3QgaHRjX2VuZHBvaW50X3N0YXRzICplcF9zdDsKKworCXJldCA9IGtzdHJ0b3UzMl9mcm9tX3VzZXIodXNlcl9idWYsIGNvdW50LCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgRU5EUE9JTlRfTUFYOyBpKyspIHsKKwkJCWVwX3N0ID0gJnRhcmdldC0+ZW5kcG9pbnRbaV0uZXBfc3Q7CisJCQltZW1zZXQoZXBfc3QsIDAsIHNpemVvZigqZXBfc3QpKTsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19lbmRwb2ludF9zdGF0cyA9IHsKKwkub3BlbiA9IGF0aDZrbF9kZWJ1Z2ZzX29wZW4sCisJLnJlYWQgPSBhdGg2a2xfZW5kcG9pbnRfc3RhdHNfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfZW5kcG9pbnRfc3RhdHNfd3JpdGUsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgYXRoNmtsX2dldF9udW1fcmVnKHZvaWQpCiB7CiAJaW50IGk7CkBAIC04NjcsNiArOTc0LDY2MCBAQAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKK2ludCBhdGg2a2xfZGVidWdfcm9hbV90YmxfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuKQoreworCWNvbnN0IHN0cnVjdCB3bWlfdGFyZ2V0X3JvYW1fdGJsICp0Ymw7CisJdTE2IG51bV9lbnRyaWVzOworCisJaWYgKGxlbiA8IHNpemVvZigqdGJsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YmwgPSAoY29uc3Qgc3RydWN0IHdtaV90YXJnZXRfcm9hbV90YmwgKikgYnVmOworCW51bV9lbnRyaWVzID0gbGUxNl90b19jcHUodGJsLT5udW1fZW50cmllcyk7CisJaWYgKHNpemVvZigqdGJsKSArIG51bV9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB3bWlfYnNzX3JvYW1faW5mbykgPgorCSAgICBsZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFyLT5kZWJ1Zy5yb2FtX3RibCA9PSBOVUxMIHx8CisJICAgIGFyLT5kZWJ1Zy5yb2FtX3RibF9sZW4gPCAodW5zaWduZWQgaW50KSBsZW4pIHsKKwkJa2ZyZWUoYXItPmRlYnVnLnJvYW1fdGJsKTsKKwkJYXItPmRlYnVnLnJvYW1fdGJsID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoYXItPmRlYnVnLnJvYW1fdGJsID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkoYXItPmRlYnVnLnJvYW1fdGJsLCBidWYsIGxlbik7CisJYXItPmRlYnVnLnJvYW1fdGJsX2xlbiA9IGxlbjsKKworCWlmICh0ZXN0X2JpdChST0FNX1RCTF9QRU5ELCAmYXItPmZsYWcpKSB7CisJCWNsZWFyX2JpdChST0FNX1RCTF9QRU5ELCAmYXItPmZsYWcpOworCQl3YWtlX3VwKCZhci0+ZXZlbnRfd3EpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfcm9hbV90YWJsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKwlsb25nIGxlZnQ7CisJc3RydWN0IHdtaV90YXJnZXRfcm9hbV90YmwgKnRibDsKKwl1MTYgbnVtX2VudHJpZXMsIGk7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBsZW4sIGJ1Zl9sZW47CisJc3NpemVfdCByZXRfY250OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXItPnNlbSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlzZXRfYml0KFJPQU1fVEJMX1BFTkQsICZhci0+ZmxhZyk7CisKKwlyZXQgPSBhdGg2a2xfd21pX2dldF9yb2FtX3RibF9jbWQoYXItPndtaSk7CisJaWYgKHJldCkgeworCQl1cCgmYXItPnNlbSk7CisJCXJldHVybiByZXQ7CisJfQorCisJbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQlhci0+ZXZlbnRfd3EsICF0ZXN0X2JpdChST0FNX1RCTF9QRU5ELCAmYXItPmZsYWcpLCBXTUlfVElNRU9VVCk7CisJdXAoJmFyLT5zZW0pOworCisJaWYgKGxlZnQgPD0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAoYXItPmRlYnVnLnJvYW1fdGJsID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdGJsID0gKHN0cnVjdCB3bWlfdGFyZ2V0X3JvYW1fdGJsICopIGFyLT5kZWJ1Zy5yb2FtX3RibDsKKwludW1fZW50cmllcyA9IGxlMTZfdG9fY3B1KHRibC0+bnVtX2VudHJpZXMpOworCisJYnVmX2xlbiA9IDEwMCArIG51bV9lbnRyaWVzICogMTAwOworCWJ1ZiA9IGt6YWxsb2MoYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlsZW4gPSAwOworCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLAorCQkJICJyb2FtX21vZGU9JXVcblxuIgorCQkJICIjIHJvYW1fdXRpbCBic3NpZCByc3NpIHJzc2lkdCBsYXN0X3Jzc2kgdXRpbCBiaWFzXG4iLAorCQkJIGxlMTZfdG9fY3B1KHRibC0+cm9hbV9tb2RlKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworCQlzdHJ1Y3Qgd21pX2Jzc19yb2FtX2luZm8gKmluZm8gPSAmdGJsLT5pbmZvW2ldOworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwKKwkJCQkgIiVkICVwTSAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJCQkgYV9zbGUzMl90b19jcHUoaW5mby0+cm9hbV91dGlsKSwgaW5mby0+YnNzaWQsCisJCQkJIGluZm8tPnJzc2ksIGluZm8tPnJzc2lkdCwgaW5mby0+bGFzdF9yc3NpLAorCQkJCSBpbmZvLT51dGlsLCBpbmZvLT5iaWFzKTsKKwl9CisKKwlpZiAobGVuID4gYnVmX2xlbikKKwkJbGVuID0gYnVmX2xlbjsKKworCXJldF9jbnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKKworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldF9jbnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcm9hbV90YWJsZSA9IHsKKwkucmVhZCA9IGF0aDZrbF9yb2FtX3RhYmxlX3JlYWQsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9mb3JjZV9yb2FtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisJY2hhciBidWZbMjBdOworCXNpemVfdCBsZW47CisJdTggYnNzaWRbRVRIX0FMRU5dOworCWludCBpOworCWludCBhZGRyW0VUSF9BTEVOXTsKKworCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2xlbl0gPSAnXDAnOworCisJaWYgKHNzY2FuZihidWYsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCSAgICZhZGRyWzBdLCAmYWRkclsxXSwgJmFkZHJbMl0sICZhZGRyWzNdLCAmYWRkcls0XSwgJmFkZHJbNV0pCisJICAgICE9IEVUSF9BTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJYnNzaWRbaV0gPSBhZGRyW2ldOworCisJcmV0ID0gYXRoNmtsX3dtaV9mb3JjZV9yb2FtX2NtZChhci0+d21pLCBic3NpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19mb3JjZV9yb2FtID0geworCS53cml0ZSA9IGF0aDZrbF9mb3JjZV9yb2FtX3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfcm9hbV9tb2RlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCWNoYXIgYnVmWzIwXTsKKwlzaXplX3QgbGVuOworCWVudW0gd21pX3JvYW1fbW9kZSBtb2RlOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbbGVuXSA9ICdcMCc7CisJaWYgKGxlbiA+IDAgJiYgYnVmW2xlbiAtIDFdID09ICdcbicpCisJCWJ1ZltsZW4gLSAxXSA9ICdcMCc7CisKKwlpZiAoc3RyY2FzZWNtcChidWYsICJkZWZhdWx0IikgPT0gMCkKKwkJbW9kZSA9IFdNSV9ERUZBVUxUX1JPQU1fTU9ERTsKKwllbHNlIGlmIChzdHJjYXNlY21wKGJ1ZiwgImJzc2JpYXMiKSA9PSAwKQorCQltb2RlID0gV01JX0hPU1RfQklBU19ST0FNX01PREU7CisJZWxzZSBpZiAoc3RyY2FzZWNtcChidWYsICJsb2NrIikgPT0gMCkKKwkJbW9kZSA9IFdNSV9MT0NLX0JTU19NT0RFOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhdGg2a2xfd21pX3NldF9yb2FtX21vZGVfY21kKGFyLT53bWksIG1vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcm9hbV9tb2RlID0geworCS53cml0ZSA9IGF0aDZrbF9yb2FtX21vZGVfd3JpdGUsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3ZvaWQgYXRoNmtsX2RlYnVnX3NldF9rZWVwYWxpdmUoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtlZXBhbGl2ZSkKK3sKKwlhci0+ZGVidWcua2VlcGFsaXZlID0ga2VlcGFsaXZlOworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfa2VlcGFsaXZlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzE2XTsKKwlpbnQgbGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1XG4iLCBhci0+ZGVidWcua2VlcGFsaXZlKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYXRoNmtsX2tlZXBhbGl2ZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwlyZXQgPSBrc3RydG91OF9mcm9tX3VzZXIodXNlcl9idWYsIGNvdW50LCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYXRoNmtsX3dtaV9zZXRfa2VlcGFsaXZlX2NtZChhci0+d21pLCAwLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfa2VlcGFsaXZlID0geworCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkucmVhZCA9IGF0aDZrbF9rZWVwYWxpdmVfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfa2VlcGFsaXZlX3dyaXRlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3ZvaWQgYXRoNmtsX2RlYnVnX3NldF9kaXNjb25uZWN0X3RpbWVvdXQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpbWVvdXQpCit7CisJYXItPmRlYnVnLmRpc2NfdGltZW91dCA9IHRpbWVvdXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9kaXNjb25uZWN0X3RpbWVvdXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1ZlsxNl07CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldVxuIiwgYXItPmRlYnVnLmRpc2NfdGltZW91dCk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9kaXNjb25uZWN0X3RpbWVvdXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCXU4IHZhbDsKKworCXJldCA9IGtzdHJ0b3U4X2Zyb21fdXNlcih1c2VyX2J1ZiwgY291bnQsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChhci0+d21pLCAwLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfZGlzY29ubmVjdF90aW1lb3V0ID0geworCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkucmVhZCA9IGF0aDZrbF9kaXNjb25uZWN0X3RpbWVvdXRfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfZGlzY29ubmVjdF90aW1lb3V0X3dyaXRlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9jcmVhdGVfcW9zX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOworCWNoYXIgYnVmWzIwMF07CisJc3NpemVfdCBsZW47CisJY2hhciAqc3B0ciwgKnRva2VuOworCXN0cnVjdCB3bWlfY3JlYXRlX3BzdHJlYW1fY21kIHBzdHJlYW07CisJdTMyIHZhbDMyOworCXUxNiB2YWwxNjsKKworCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2xlbl0gPSAnXDAnOworCXNwdHIgPSBidWY7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwc3RyZWFtLnVzZXJfcHJpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwc3RyZWFtLnRyYWZmaWNfZGlyZWMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnBzdHJlYW0udHJhZmZpY19jbGFzcykpCisJCXJldHVybiAtRUlOVkFMOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3U4KHRva2VuLCAwLCAmcHN0cmVhbS50cmFmZmljX3R5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnBzdHJlYW0udm9pY2VfcHNjX2NhcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5taW5fc2VydmljZV9pbnQgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLm1heF9zZXJ2aWNlX2ludCA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0uaW5hY3Rpdml0eV9pbnQgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLnN1c3BlbnNpb25faW50ID0gY3B1X3RvX2xlMzIodmFsMzIpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5zZXJ2aWNlX3N0YXJ0X3RpbWUgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwc3RyZWFtLnRzaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MTYodG9rZW4sIDAsICZ2YWwxNikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0ubm9taW5hbF9tc2R1ID0gY3B1X3RvX2xlMTYodmFsMTYpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UxNih0b2tlbiwgMCwgJnZhbDE2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5tYXhfbXNkdSA9IGNwdV90b19sZTE2KHZhbDE2KTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0ubWluX2RhdGFfcmF0ZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0ubWVhbl9kYXRhX3JhdGUgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLnBlYWtfZGF0YV9yYXRlID0gY3B1X3RvX2xlMzIodmFsMzIpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5tYXhfYnVyc3Rfc2l6ZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0uZGVsYXlfYm91bmQgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLm1pbl9waHlfcmF0ZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0uc2JhID0gY3B1X3RvX2xlMzIodmFsMzIpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5tZWRpdW1fdGltZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCWF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgJnBzdHJlYW0pOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2NyZWF0ZV9xb3MgPSB7CisJLndyaXRlID0gYXRoNmtsX2NyZWF0ZV9xb3Nfd3JpdGUsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9kZWxldGVfcW9zX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CisJY2hhciBidWZbMTAwXTsKKwlzc2l6ZV90IGxlbjsKKwljaGFyICpzcHRyLCAqdG9rZW47CisJdTggdHJhZmZpY19jbGFzczsKKwl1OCB0c2lkOworCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpCisJCXJldHVybiAtRUlPOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbbGVuXSA9ICdcMCc7CisJc3B0ciA9IGJ1ZjsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnRyYWZmaWNfY2xhc3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnRzaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkgICAgICB0cmFmZmljX2NsYXNzLCB0c2lkKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19kZWxldGVfcW9zID0geworCS53cml0ZSA9IGF0aDZrbF9kZWxldGVfcW9zX3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfYmdzY2FuX2ludF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdTE2IGJnc2Nhbl9pbnQ7CisJY2hhciBidWZbMzJdOworCXNzaXplX3QgbGVuOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZltsZW5dID0gJ1wwJzsKKwlpZiAoa3N0cnRvdTE2KGJ1ZiwgMCwgJmJnc2Nhbl9pbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChiZ3NjYW5faW50ID09IDApCisJCWJnc2Nhbl9pbnQgPSAweGZmZmY7CisKKwlhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKGFyLT53bWksIDAsIDAsIDAsIGJnc2Nhbl9pbnQsIDAsIDAsIDAsIDMsCisJCQkJICAwLCAwLCAwKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19iZ3NjYW5faW50ID0geworCS53cml0ZSA9IGF0aDZrbF9iZ3NjYW5faW50X3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfbGlzdGVuX2ludF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXUxNiBsaXN0ZW5faW50X3QsIGxpc3Rlbl9pbnRfYjsKKwljaGFyIGJ1ZlszMl07CisJY2hhciAqc3B0ciwgKnRva2VuOworCXNzaXplX3QgbGVuOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZltsZW5dID0gJ1wwJzsKKwlzcHRyID0gYnVmOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmbGlzdGVuX2ludF90KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoa3N0cnRvdTE2KHNwdHIsIDAsICZsaXN0ZW5faW50X2IpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgobGlzdGVuX2ludF90IDwgMTUpIHx8IChsaXN0ZW5faW50X3QgPiA1MDAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGxpc3Rlbl9pbnRfYiA8IDEpIHx8IChsaXN0ZW5faW50X2IgPiA1MCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYXItPmxpc3Rlbl9pbnR2bF90ID0gbGlzdGVuX2ludF90OworCWFyLT5saXN0ZW5faW50dmxfYiA9IGxpc3Rlbl9pbnRfYjsKKworCWF0aDZrbF93bWlfbGlzdGVuaW50ZXJ2YWxfY21kKGFyLT53bWksIDAsIGFyLT5saXN0ZW5faW50dmxfdCwKKwkJCQkgICAgICBhci0+bGlzdGVuX2ludHZsX2IpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfbGlzdGVuX2ludF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbMTZdOworCWludCBsZW47CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUgJXVcbiIsIGFyLT5saXN0ZW5faW50dmxfdCwKKwkJCQkJYXItPmxpc3Rlbl9pbnR2bF9iKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19saXN0ZW5faW50ID0geworCS5yZWFkID0gYXRoNmtsX2xpc3Rlbl9pbnRfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfbGlzdGVuX2ludF93cml0ZSwKKwkub3BlbiA9IGF0aDZrbF9kZWJ1Z2ZzX29wZW4sCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKworc3RhdGljIHNzaXplX3QgYXRoNmtsX3Bvd2VyX3BhcmFtc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXU4IGJ1ZlsxMDBdOworCXVuc2lnbmVkIGludCBsZW4gPSAwOworCWNoYXIgKnNwdHIsICp0b2tlbjsKKwl1MTYgaWRsZV9wZXJpb2QsIHBzX3BvbGxfbnVtLCBkdGltLAorCQl0eF93YWtldXAsIG51bV90eDsKKworCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2xlbl0gPSAnXDAnOworCXNwdHIgPSBidWY7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmaWRsZV9wZXJpb2QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MTYodG9rZW4sIDAsICZwc19wb2xsX251bSkpCisJCXJldHVybiAtRUlOVkFMOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UxNih0b2tlbiwgMCwgJmR0aW0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MTYodG9rZW4sIDAsICZ0eF93YWtldXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MTYodG9rZW4sIDAsICZudW1fdHgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF0aDZrbF93bWlfcG1wYXJhbXNfY21kKGFyLT53bWksIDAsIGlkbGVfcGVyaW9kLCBwc19wb2xsX251bSwKKwkJCQlkdGltLCB0eF93YWtldXAsIG51bV90eCwgMCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcG93ZXJfcGFyYW1zID0geworCS53cml0ZSA9IGF0aDZrbF9wb3dlcl9wYXJhbXNfd3JpdGUsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKIGludCBhdGg2a2xfZGVidWdfaW5pdChzdHJ1Y3QgYXRoNmtsICphcikKIHsKIAlhci0+ZGVidWcuZndsb2dfYnVmLmJ1ZiA9IHZtYWxsb2MoQVRINktMX0ZXTE9HX1NJWkUpOwpAQCAtODg4LDcgKzE2NDksNyBAQAogCWFyLT5kZWJ1Zy5md2xvZ19tYXNrID0gMDsKIAogCWFyLT5kZWJ1Z2ZzX3BoeSA9IGRlYnVnZnNfY3JlYXRlX2RpcigiYXRoNmtsIiwKLQkJCQkJICAgICBhci0+d2Rldi0+d2lwaHktPmRlYnVnZnNkaXIpOworCQkJCQkgICAgIGFyLT53aXBoeS0+ZGVidWdmc2Rpcik7CiAJaWYgKCFhci0+ZGVidWdmc19waHkpIHsKIAkJdmZyZWUoYXItPmRlYnVnLmZ3bG9nX2J1Zi5idWYpOwogCQlrZnJlZShhci0+ZGVidWcuZndsb2dfdG1wKTsKQEAgLTkwMSw2ICsxNjYyLDkgQEAKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjcmVkaXRfZGlzdF9zdGF0cyIsIFNfSVJVU1IsIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsCiAJCQkgICAgJmZvcHNfY3JlZGl0X2Rpc3Rfc3RhdHMpOwogCisJZGVidWdmc19jcmVhdGVfZmlsZSgiZW5kcG9pbnRfc3RhdHMiLCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCSAgICBhci0+ZGVidWdmc19waHksIGFyLCAmZm9wc19lbmRwb2ludF9zdGF0cyk7CisKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmd2xvZyIsIFNfSVJVU1IsIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsCiAJCQkgICAgJmZvcHNfZndsb2cpOwogCkBAIC05MjIsNiArMTY4NiwzMyBAQAogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoIndhcl9zdGF0cyIsIFNfSVJVU1IsIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsCiAJCQkgICAgJmZvcHNfd2FyX3N0YXRzKTsKIAorCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInJvYW1fdGFibGUiLCBTX0lSVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAorCQkJICAgICZmb3BzX3JvYW1fdGFibGUpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgiZm9yY2Vfcm9hbSIsIFNfSVdVU1IsIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsCisJCQkgICAgJmZvcHNfZm9yY2Vfcm9hbSk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyb2FtX21vZGUiLCBTX0lXVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAorCQkJICAgICZmb3BzX3JvYW1fbW9kZSk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJrZWVwYWxpdmUiLCBTX0lSVVNSIHwgU19JV1VTUiwgYXItPmRlYnVnZnNfcGh5LCBhciwKKwkJCSAgICAmZm9wc19rZWVwYWxpdmUpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgiZGlzY29ubmVjdF90aW1lb3V0IiwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkgICAgYXItPmRlYnVnZnNfcGh5LCBhciwgJmZvcHNfZGlzY29ubmVjdF90aW1lb3V0KTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImNyZWF0ZV9xb3MiLCBTX0lXVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAorCQkJCSZmb3BzX2NyZWF0ZV9xb3MpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgiZGVsZXRlX3FvcyIsIFNfSVdVU1IsIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsCisJCQkJJmZvcHNfZGVsZXRlX3Fvcyk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJiZ3NjYW5faW50ZXJ2YWwiLCBTX0lXVVNSLAorCQkJCWFyLT5kZWJ1Z2ZzX3BoeSwgYXIsICZmb3BzX2Jnc2Nhbl9pbnQpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgicG93ZXJfcGFyYW1zIiwgU19JV1VTUiwgYXItPmRlYnVnZnNfcGh5LCBhciwKKwkJCQkJCSZmb3BzX3Bvd2VyX3BhcmFtcyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTI5LDYgKzE3MjAsNyBAQAogewogCXZmcmVlKGFyLT5kZWJ1Zy5md2xvZ19idWYuYnVmKTsKIAlrZnJlZShhci0+ZGVidWcuZndsb2dfdG1wKTsKKwlrZnJlZShhci0+ZGVidWcucm9hbV90YmwpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvZGVidWcuaAppbmRleCA5Mjg4YTNjLi45ODUzYzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9kZWJ1Zy5oCkBAIC0xNywxOSArMTcsMTkgQEAKICNpZm5kZWYgREVCVUdfSAogI2RlZmluZSBERUJVR19ICiAKLSNpbmNsdWRlICJodGNfaGlmLmgiCisjaW5jbHVkZSAiaGlmLmgiCiAKIGVudW0gQVRINktfREVCVUdfTUFTSyB7Ci0JQVRINktMX0RCR19XTEFOX0NPTk5FQ1QgPSBCSVQoMCksICAgICAvKiB3bGFuIGNvbm5lY3QgKi8KLQlBVEg2S0xfREJHX1dMQU5fU0NBTiAgICA9IEJJVCgxKSwgICAgIC8qIHdsYW4gc2NhbiAqLworCUFUSDZLTF9EQkdfQ1JFRElUCT0gQklUKDApLAorCS8qIGhvbGUgKi8KIAlBVEg2S0xfREJHX1dMQU5fVFggICAgICA9IEJJVCgyKSwgICAgIC8qIHdsYW4gdHggKi8KIAlBVEg2S0xfREJHX1dMQU5fUlggICAgICA9IEJJVCgzKSwgICAgIC8qIHdsYW4gcnggKi8KIAlBVEg2S0xfREJHX0JNSQkJPSBCSVQoNCksICAgICAvKiBibWkgdHJhY2luZyAqLwotCUFUSDZLTF9EQkdfSFRDX1NFTkQgICAgID0gQklUKDUpLCAgICAgLyogaHRjIHNlbmQgKi8KLQlBVEg2S0xfREJHX0hUQ19SRUNWICAgICA9IEJJVCg2KSwgICAgIC8qIGh0YyByZWN2ICovCisJQVRINktMX0RCR19IVEMJCT0gQklUKDUpLAorCUFUSDZLTF9EQkdfSElGCQk9IEJJVCg2KSwKIAlBVEg2S0xfREJHX0lSUQkJPSBCSVQoNyksICAgICAvKiBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLwotCUFUSDZLTF9EQkdfUE0gICAgICAgICAgID0gQklUKDgpLCAgICAgLyogcG93ZXIgbWFuYWdlbWVudCAqLwotCUFUSDZLTF9EQkdfV0xBTl9OT0RFICAgID0gQklUKDkpLCAgICAgLyogZ2VuZXJhbCB3bGFuIG5vZGUgdHJhY2luZyAqLworCS8qIGhvbGUgKi8KKwkvKiBob2xlICovCiAJQVRINktMX0RCR19XTUkgICAgICAgICAgPSBCSVQoMTApLCAgICAvKiB3bWkgdHJhY2luZyAqLwogCUFUSDZLTF9EQkdfVFJDCSAgICAgICAgPSBCSVQoMTEpLCAgICAvKiBnZW5lcmljIGZ1bmMgdHJhY2luZyAqLwogCUFUSDZLTF9EQkdfU0NBVFRFUgk9IEJJVCgxMiksICAgIC8qIGhpZiBzY2F0dGVyIHRyYWNpbmcgKi8KQEAgLTQwLDEyICs0MCwxMyBAQAogCUFUSDZLTF9EQkdfU0RJT19EVU1QCT0gQklUKDE3KSwKIAlBVEg2S0xfREJHX0JPT1QJCT0gQklUKDE4KSwgICAgLyogZHJpdmVyIGluaXQgYW5kIGZ3IGJvb3QgKi8KIAlBVEg2S0xfREJHX1dNSV9EVU1QCT0gQklUKDE5KSwKKwlBVEg2S0xfREJHX1NVU1BFTkQJPSBCSVQoMjApLAogCUFUSDZLTF9EQkdfQU5ZCSAgICAgICAgPSAweGZmZmZmZmZmICAvKiBlbmFibGUgYWxsIGxvZ3MgKi8KIH07CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgZGVidWdfbWFzazsKLWV4dGVybiBpbnQgYXRoNmtsX3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgYXRoNmtsX3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAjZGVmaW5lIGF0aDZrbF9pbmZvKGZtdCwgLi4uKQkJCQlcCiAJYXRoNmtsX3ByaW50ayhLRVJOX0lORk8sIGZtdCwgIyNfX1ZBX0FSR1NfXykKQEAgLTkwLDYgKzkxLDEwIEBACiB2b2lkIGR1bXBfY3JlZF9kaXN0X3N0YXRzKHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpOwogdm9pZCBhdGg2a2xfZGVidWdfZndsb2dfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CiB2b2lkIGF0aDZrbF9kZWJ1Z193YXIoc3RydWN0IGF0aDZrbCAqYXIsIGVudW0gYXRoNmtsX3dhciB3YXIpOworaW50IGF0aDZrbF9kZWJ1Z19yb2FtX3RibF9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgY29uc3Qgdm9pZCAqYnVmLAorCQkJCXNpemVfdCBsZW4pOwordm9pZCBhdGg2a2xfZGVidWdfc2V0X2tlZXBhbGl2ZShzdHJ1Y3QgYXRoNmtsICphciwgdTgga2VlcGFsaXZlKTsKK3ZvaWQgYXRoNmtsX2RlYnVnX3NldF9kaXNjb25uZWN0X3RpbWVvdXQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpbWVvdXQpOwogaW50IGF0aDZrbF9kZWJ1Z19pbml0KHN0cnVjdCBhdGg2a2wgKmFyKTsKIHZvaWQgYXRoNmtsX2RlYnVnX2NsZWFudXAoc3RydWN0IGF0aDZrbCAqYXIpOwogCkBAIC0xMjUsNiArMTMwLDIxIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9kZWJ1Z19yb2FtX3RibF9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwKKwkJCQkJICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNmtsX2RlYnVnX3NldF9rZWVwYWxpdmUoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtlZXBhbGl2ZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0aDZrbF9kZWJ1Z19zZXRfZGlzY29ubmVjdF90aW1lb3V0KHN0cnVjdCBhdGg2a2wgKmFyLAorCQkJCQkJICAgICAgIHU4IHRpbWVvdXQpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9kZWJ1Z19pbml0KHN0cnVjdCBhdGg2a2wgKmFyKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYtb3BzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi1vcHMuaAppbmRleCBkNmM4OThmLi5lZWQyMjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi1vcHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi1vcHMuaApAQCAtMTgsMTAgKzE4LDE2IEBACiAjZGVmaW5lIEhJRl9PUFNfSAogCiAjaW5jbHVkZSAiaGlmLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogc3RhdGljIGlubGluZSBpbnQgaGlmX3JlYWRfd3JpdGVfc3luYyhzdHJ1Y3QgYXRoNmtsICphciwgdTMyIGFkZHIsIHU4ICpidWYsCiAJCQkJICAgICAgdTMyIGxlbiwgdTMyIHJlcXVlc3QpCiB7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwKKwkJICAgImhpZiAlcyBzeW5jIGFkZHIgMHgleCBidWYgMHglcCBsZW4gJWQgcmVxdWVzdCAweCV4XG4iLAorCQkgICAocmVxdWVzdCAmIEhJRl9XUklURSkgPyAid3JpdGUiIDogInJlYWQiLAorCQkgICBhZGRyLCBidWYsIGxlbiwgcmVxdWVzdCk7CisKIAlyZXR1cm4gYXItPmhpZl9vcHMtPnJlYWRfd3JpdGVfc3luYyhhciwgYWRkciwgYnVmLCBsZW4sIHJlcXVlc3QpOwogfQogCkBAIC0yOSwxNiArMzUsMjQgQEAKIAkJCQkgIHUzMiBsZW5ndGgsIHUzMiByZXF1ZXN0LAogCQkJCSAgc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCkKIHsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLAorCQkgICAiaGlmIHdyaXRlIGFzeW5jIGFkZHIgMHgleCBidWYgMHglcCBsZW4gJWQgcmVxdWVzdCAweCV4XG4iLAorCQkgICBhZGRyZXNzLCBidWZmZXIsIGxlbmd0aCwgcmVxdWVzdCk7CisKIAlyZXR1cm4gYXItPmhpZl9vcHMtPndyaXRlX2FzeW5jKGFyLCBhZGRyZXNzLCBidWZmZXIsIGxlbmd0aCwKIAkJCQkJcmVxdWVzdCwgcGFja2V0KTsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGg2a2xfaGlmX2lycV9lbmFibGUoc3RydWN0IGF0aDZrbCAqYXIpCiB7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiBpcnEgZW5hYmxlXG4iKTsKKwogCXJldHVybiBhci0+aGlmX29wcy0+aXJxX2VuYWJsZShhcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGg2a2xfaGlmX2lycV9kaXNhYmxlKHN0cnVjdCBhdGg2a2wgKmFyKQogeworCWF0aDZrbF9kYmcoQVRINktMX0RCR19ISUYsICJoaWYgaXJxIGRpc2FibGVcbiIpOworCiAJcmV0dXJuIGFyLT5oaWZfb3BzLT5pcnFfZGlzYWJsZShhcik7CiB9CiAKQEAgLTY5LDkgKzgzLDQwIEBACiAJcmV0dXJuIGFyLT5oaWZfb3BzLT5jbGVhbnVwX3NjYXR0ZXIoYXIpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBhdGg2a2xfaGlmX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIpCitzdGF0aWMgaW5saW5lIGludCBhdGg2a2xfaGlmX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIsCisJCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpCiB7Ci0JcmV0dXJuIGFyLT5oaWZfb3BzLT5zdXNwZW5kKGFyKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIHN1c3BlbmRcbiIpOworCisJcmV0dXJuIGFyLT5oaWZfb3BzLT5zdXNwZW5kKGFyLCB3b3cpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdGg2a2xfaGlmX3Jlc3VtZShzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIHJlc3VtZVxuIik7CisKKwlyZXR1cm4gYXItPmhpZl9vcHMtPnJlc3VtZShhcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9oaWZfcG93ZXJfb24oc3RydWN0IGF0aDZrbCAqYXIpCit7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiBwb3dlciBvblxuIik7CisKKwlyZXR1cm4gYXItPmhpZl9vcHMtPnBvd2VyX29uKGFyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRoNmtsX2hpZl9wb3dlcl9vZmYoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiBwb3dlciBvZmZcbiIpOworCisJcmV0dXJuIGFyLT5oaWZfb3BzLT5wb3dlcl9vZmYoYXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNmtsX2hpZl9zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCWF0aDZrbF9kYmcoQVRINktMX0RCR19ISUYsICJoaWYgc3RvcFxuIik7CisKKwlhci0+aGlmX29wcy0+c3RvcChhcik7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3ZGEzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKQEAgLTAsMCArMSw2OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImhpZi5oIgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImhpZi1vcHMuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisjZGVmaW5lIE1BSUxCT1hfRk9SX0JMT0NLX1NJWkUgICAgICAgICAgMQorCisjZGVmaW5lIEFUSDZLTF9USU1FX1FVQU5UVU0JMTAgIC8qIGluIG1zICovCisKK3N0YXRpYyBpbnQgYXRoNmtsX2hpZl9jcF9zY2F0X2RtYV9idWYoc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqcmVxLAorCQkJCSAgICAgIGJvb2wgZnJvbV9kbWEpCit7CisJdTggKmJ1ZjsKKwlpbnQgaTsKKworCWJ1ZiA9IHJlcS0+dmlydF9kbWFfYnVmOworCisJZm9yIChpID0gMDsgaSA8IHJlcS0+c2NhdF9lbnRyaWVzOyBpKyspIHsKKworCQlpZiAoZnJvbV9kbWEpCisJCQltZW1jcHkocmVxLT5zY2F0X2xpc3RbaV0uYnVmLCBidWYsCisJCQkgICAgICAgcmVxLT5zY2F0X2xpc3RbaV0ubGVuKTsKKwkJZWxzZQorCQkJbWVtY3B5KGJ1ZiwgcmVxLT5zY2F0X2xpc3RbaV0uYnVmLAorCQkJICAgICAgIHJlcS0+c2NhdF9saXN0W2ldLmxlbik7CisKKwkJYnVmICs9IHJlcS0+c2NhdF9saXN0W2ldLmxlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGF0aDZrbF9oaWZfcndfY29tcF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCA9IGNvbnRleHQ7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIHJ3IGNvbXBsZXRpb24gcGt0IDB4JXAgc3RhdHVzICVkXG4iLAorCQkgICBwYWNrZXQsIHN0YXR1cyk7CisKKwlwYWNrZXQtPnN0YXR1cyA9IHN0YXR1czsKKwlwYWNrZXQtPmNvbXBsZXRpb24ocGFja2V0LT5jb250ZXh0LCBwYWNrZXQpOworCisJcmV0dXJuIDA7Cit9CisjZGVmaW5lIFJFR19EVU1QX0NPVU5UX0FSNjAwMyAgIDYwCisjZGVmaW5lIFJFR0lTVEVSX0RVTVBfTEVOX01BWCAgIDYwCisKK3N0YXRpYyB2b2lkIGF0aDZrbF9oaWZfZHVtcF9md19jcmFzaChzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlfX2xlMzIgcmVnZHVtcF92YWxbUkVHSVNURVJfRFVNUF9MRU5fTUFYXTsKKwl1MzIgaSwgYWRkcmVzcywgcmVnZHVtcF9hZGRyID0gMDsKKwlpbnQgcmV0OworCisJaWYgKGFyLT50YXJnZXRfdHlwZSAhPSBUQVJHRVRfVFlQRV9BUjYwMDMpCisJCXJldHVybjsKKworCS8qIHRoZSByZWcgZHVtcCBwb2ludGVyIGlzIGNvcGllZCB0byB0aGUgaG9zdCBpbnRlcmVzdCBhcmVhICovCisJYWRkcmVzcyA9IGF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLCBISV9JVEVNKGhpX2ZhaWx1cmVfc3RhdGUpKTsKKwlhZGRyZXNzID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgYWRkcmVzcyk7CisKKwkvKiByZWFkIFJBTSBsb2NhdGlvbiB0aHJvdWdoIGRpYWdub3N0aWMgd2luZG93ICovCisJcmV0ID0gYXRoNmtsX2RpYWdfcmVhZDMyKGFyLCBhZGRyZXNzLCAmcmVnZHVtcF9hZGRyKTsKKworCWlmIChyZXQgfHwgIXJlZ2R1bXBfYWRkcikgeworCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIGdldCBwdHIgdG8gcmVnaXN0ZXIgZHVtcCBhcmVhOiAlZFxuIiwKKwkJCSAgICByZXQpOworCQlyZXR1cm47CisJfQorCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgInJlZ2lzdGVyIGR1bXAgZGF0YSBhZGRyZXNzIDB4JXhcbiIsCisJCXJlZ2R1bXBfYWRkcik7CisJcmVnZHVtcF9hZGRyID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgcmVnZHVtcF9hZGRyKTsKKworCS8qIGZldGNoIHJlZ2lzdGVyIGR1bXAgZGF0YSAqLworCXJldCA9IGF0aDZrbF9kaWFnX3JlYWQoYXIsIHJlZ2R1bXBfYWRkciwgKHU4ICopJnJlZ2R1bXBfdmFsWzBdLAorCQkJCSAgUkVHX0RVTVBfQ09VTlRfQVI2MDAzICogKHNpemVvZih1MzIpKSk7CisJaWYgKHJldCkgeworCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIGdldCByZWdpc3RlciBkdW1wOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCWF0aDZrbF9pbmZvKCJjcmFzaCBkdW1wOlxuIik7CisJYXRoNmtsX2luZm8oImh3IDB4JXggZncgJXNcbiIsIGFyLT53aXBoeS0+aHdfdmVyc2lvbiwKKwkJICAgIGFyLT53aXBoeS0+ZndfdmVyc2lvbik7CisKKwlCVUlMRF9CVUdfT04oUkVHX0RVTVBfQ09VTlRfQVI2MDAzICUgNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkVHX0RVTVBfQ09VTlRfQVI2MDAzIC8gNDsgaSsrKSB7CisJCWF0aDZrbF9pbmZvKCIlZDogMHglOC44eCAweCU4Ljh4IDB4JTguOHggMHglOC44eFxuIiwKKwkJCSAgICA0ICogaSwKKwkJCSAgICBsZTMyX3RvX2NwdShyZWdkdW1wX3ZhbFtpXSksCisJCQkgICAgbGUzMl90b19jcHUocmVnZHVtcF92YWxbaSArIDFdKSwKKwkJCSAgICBsZTMyX3RvX2NwdShyZWdkdW1wX3ZhbFtpICsgMl0pLAorCQkJICAgIGxlMzJfdG9fY3B1KHJlZ2R1bXBfdmFsW2kgKyAzXSkpOworCX0KKworfQorCitzdGF0aWMgaW50IGF0aDZrbF9oaWZfcHJvY19kYmdfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQoreworCXUzMiBkdW1teTsKKwlpbnQgcmV0OworCisJYXRoNmtsX3dhcm4oImZpcm13YXJlIGNyYXNoZWRcbiIpOworCisJLyoKKwkgKiByZWFkIGNvdW50ZXIgdG8gY2xlYXIgdGhlIGludGVycnVwdCwgdGhlIGRlYnVnIGVycm9yIGludGVycnVwdCBpcworCSAqIGNvdW50ZXIgMC4KKwkgKi8KKwlyZXQgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIENPVU5UX0RFQ19BRERSRVNTLAorCQkJCSAgICAgKHU4ICopJmR1bW15LCA0LCBISUZfUkRfU1lOQ19CWVRFX0lOQyk7CisJaWYgKHJldCkKKwkJYXRoNmtsX3dhcm4oIkZhaWxlZCB0byBjbGVhciBkZWJ1ZyBpbnRlcnJ1cHQ6ICVkXG4iLCByZXQpOworCisJYXRoNmtsX2hpZl9kdW1wX2Z3X2NyYXNoKGRldi0+YXIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogbWFpbGJveCByZWN2IG1lc3NhZ2UgcG9sbGluZyAqLworaW50IGF0aDZrbF9oaWZfcG9sbF9tYm94bXNnX3J4KHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsIHUzMiAqbGtfYWhkLAorCQkJICAgICAgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IGF0aDZrbF9pcnFfcHJvY19yZWdpc3RlcnMgKnJnOworCWludCBzdGF0dXMgPSAwLCBpOworCXU4IGh0Y19tYm94ID0gMSA8PCBIVENfTUFJTEJPWDsKKworCWZvciAoaSA9IHRpbWVvdXQgLyBBVEg2S0xfVElNRV9RVUFOVFVNOyBpID4gMDsgaS0tKSB7CisJCS8qIHRoaXMgaXMgdGhlIHN0YW5kYXJkIEhJRiB3YXksIGxvYWQgdGhlIHJlZyB0YWJsZSAqLworCQlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIEhPU1RfSU5UX1NUQVRVU19BRERSRVNTLAorCQkJCQkgICAgICh1OCAqKSAmZGV2LT5pcnFfcHJvY19yZWcsCisJCQkJCSAgICAgc2l6ZW9mKGRldi0+aXJxX3Byb2NfcmVnKSwKKwkJCQkJICAgICBISUZfUkRfU1lOQ19CWVRFX0lOQyk7CisKKwkJaWYgKHN0YXR1cykgeworCQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIHJlYWQgcmVnIHRhYmxlXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQkvKiBjaGVjayBmb3IgTUJPWCBkYXRhIGFuZCB2YWxpZCBsb29rYWhlYWQgKi8KKwkJaWYgKGRldi0+aXJxX3Byb2NfcmVnLmhvc3RfaW50X3N0YXR1cyAmIGh0Y19tYm94KSB7CisJCQlpZiAoZGV2LT5pcnFfcHJvY19yZWcucnhfbGthaGRfdmFsaWQgJgorCQkJICAgIGh0Y19tYm94KSB7CisJCQkJLyoKKwkJCQkgKiBNYWlsYm94IGhhcyBhIG1lc3NhZ2UgYW5kIHRoZSBsb29rIGFoZWFkCisJCQkJICogaXMgdmFsaWQuCisJCQkJICovCisJCQkJcmcgPSAmZGV2LT5pcnFfcHJvY19yZWc7CisJCQkJKmxrX2FoZCA9CisJCQkJCWxlMzJfdG9fY3B1KHJnLT5yeF9sa2FoZFtIVENfTUFJTEJPWF0pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogZGVsYXkgYSBsaXR0bGUgICovCisJCW1kZWxheShBVEg2S0xfVElNRV9RVUFOVFVNKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiByZXRyeSBtYm94IHBvbGwgdHJ5ICVkXG4iLCBpKTsKKwl9CisKKwlpZiAoaSA9PSAwKSB7CisJCWF0aDZrbF9lcnIoInRpbWVvdXQgd2FpdGluZyBmb3IgcmVjdiBtZXNzYWdlXG4iKTsKKwkJc3RhdHVzID0gLUVUSU1FOworCQkvKiBjaGVjayBpZiB0aGUgdGFyZ2V0IGFzc2VydGVkICovCisJCWlmIChkZXYtPmlycV9wcm9jX3JlZy5jb3VudGVyX2ludF9zdGF0dXMgJgorCQkgICAgQVRINktMX1RBUkdFVF9ERUJVR19JTlRSX01BU0spCisJCQkvKgorCQkJICogVGFyZ2V0IGZhaWx1cmUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBpbiBjYXNlIG9mCisJCQkgKiBhbiBhc3NlcnQuCisJCQkgKi8KKwkJCWF0aDZrbF9oaWZfcHJvY19kYmdfaW50cihkZXYpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEaXNhYmxlIHBhY2tldCByZWNlcHRpb24gKHVzZWQgaW4gY2FzZSB0aGUgaG9zdCBydW5zIG91dCBvZiBidWZmZXJzKQorICogdXNpbmcgdGhlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXJzIHRocm91Z2ggdGhlIGhvc3QgSS9GCisgKi8KK2ludCBhdGg2a2xfaGlmX3J4X2NvbnRyb2woc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVfcngpCit7CisJc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyByZWdzOworCWludCBzdGF0dXMgPSAwOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiByeCAlc1xuIiwKKwkJICAgZW5hYmxlX3J4ID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJLyogdGFrZSB0aGUgbG9jayB0byBwcm90ZWN0IGludGVycnVwdCBlbmFibGUgc2hhZG93cyAqLworCXNwaW5fbG9ja19iaCgmZGV2LT5sb2NrKTsKKworCWlmIChlbmFibGVfcngpCisJCWRldi0+aXJxX2VuX3JlZy5pbnRfc3RhdHVzX2VuIHw9CisJCQlTTShJTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEEsIDB4MDEpOworCWVsc2UKKwkJZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4gJj0KKwkJICAgIH5TTShJTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEEsIDB4MDEpOworCisJbWVtY3B5KCZyZWdzLCAmZGV2LT5pcnFfZW5fcmVnLCBzaXplb2YocmVncykpOworCisJc3Bpbl91bmxvY2tfYmgoJmRldi0+bG9jayk7CisKKwlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIElOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MsCisJCQkJICAgICAmcmVncy5pbnRfc3RhdHVzX2VuLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhdGg2a2xfaXJxX2VuYWJsZV9yZWcpLAorCQkJCSAgICAgSElGX1dSX1NZTkNfQllURV9JTkMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGF0aDZrbF9oaWZfc3VibWl0X3NjYXRfcmVxKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpzY2F0X3JlcSwgYm9vbCByZWFkKQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKHJlYWQpIHsKKwkJc2NhdF9yZXEtPnJlcSA9IEhJRl9SRF9TWU5DX0JMT0NLX0ZJWDsKKwkJc2NhdF9yZXEtPmFkZHIgPSBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHI7CisJfSBlbHNlIHsKKwkJc2NhdF9yZXEtPnJlcSA9IEhJRl9XUl9BU1lOQ19CTE9DS19JTkM7CisKKwkJc2NhdF9yZXEtPmFkZHIgPQorCQkJKHNjYXRfcmVxLT5sZW4gPiBISUZfTUJPWF9XSURUSCkgPworCQkJZGV2LT5hci0+bWJveF9pbmZvLmh0Y19leHRfYWRkciA6CisJCQlkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHI7CisJfQorCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwKKwkJICAgImhpZiBzdWJtaXQgc2NhdHRlciByZXF1ZXN0IGVudHJpZXMgJWQgbGVuICVkIG1ib3ggMHgleCAlcyAlc1xuIiwKKwkJICAgc2NhdF9yZXEtPnNjYXRfZW50cmllcywgc2NhdF9yZXEtPmxlbiwKKwkJICAgc2NhdF9yZXEtPmFkZHIsICFyZWFkID8gImFzeW5jIiA6ICJzeW5jIiwKKwkJICAgKHJlYWQpID8gInJkIiA6ICJ3ciIpOworCisJaWYgKCFyZWFkICYmIHNjYXRfcmVxLT52aXJ0X3NjYXQpIHsKKwkJc3RhdHVzID0gYXRoNmtsX2hpZl9jcF9zY2F0X2RtYV9idWYoc2NhdF9yZXEsIGZhbHNlKTsKKwkJaWYgKHN0YXR1cykgeworCQkJc2NhdF9yZXEtPnN0YXR1cyA9IHN0YXR1czsKKwkJCXNjYXRfcmVxLT5jb21wbGV0ZShkZXYtPmFyLT5odGNfdGFyZ2V0LCBzY2F0X3JlcSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXN0YXR1cyA9IGF0aDZrbF9oaWZfc2NhdF9yZXFfcncoZGV2LT5hciwgc2NhdF9yZXEpOworCisJaWYgKHJlYWQpIHsKKwkJLyogaW4gc3luYyBtb2RlLCB3ZSBjYW4gdG91Y2ggdGhlIHNjYXR0ZXIgcmVxdWVzdCAqLworCQlzY2F0X3JlcS0+c3RhdHVzID0gc3RhdHVzOworCQlpZiAoIXN0YXR1cyAmJiBzY2F0X3JlcS0+dmlydF9zY2F0KQorCQkJc2NhdF9yZXEtPnN0YXR1cyA9CisJCQkJYXRoNmtsX2hpZl9jcF9zY2F0X2RtYV9idWYoc2NhdF9yZXEsIHRydWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX2hpZl9wcm9jX2NvdW50ZXJfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQoreworCXU4IGNvdW50ZXJfaW50X3N0YXR1czsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsICJjb3VudGVyIGludGVycnVwdFxuIik7CisKKwljb3VudGVyX2ludF9zdGF0dXMgPSBkZXYtPmlycV9wcm9jX3JlZy5jb3VudGVyX2ludF9zdGF0dXMgJgorCQkJICAgICBkZXYtPmlycV9lbl9yZWcuY250cl9pbnRfc3RhdHVzX2VuOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwKKwkJInZhbGlkIGludGVycnVwdCBzb3VyY2UocykgaW4gQ09VTlRFUl9JTlRfU1RBVFVTOiAweCV4XG4iLAorCQljb3VudGVyX2ludF9zdGF0dXMpOworCisJLyoKKwkgKiBOT1RFOiBvdGhlciBtb2R1bGVzIGxpa2UgR01CT1ggbWF5IHVzZSB0aGUgY291bnRlciBpbnRlcnJ1cHQgZm9yCisJICogY3JlZGl0IGZsb3cgY29udHJvbCBvbiBvdGhlciBjb3VudGVycywgd2Ugb25seSBuZWVkIHRvIGNoZWNrIGZvcgorCSAqIHRoZSBkZWJ1ZyBhc3NlcnRpb24gY291bnRlciBpbnRlcnJ1cHQuCisJICovCisJaWYgKGNvdW50ZXJfaW50X3N0YXR1cyAmIEFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLKQorCQlyZXR1cm4gYXRoNmtsX2hpZl9wcm9jX2RiZ19pbnRyKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg2a2xfaGlmX3Byb2NfZXJyX2ludHIoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCXU4IGVycm9yX2ludF9zdGF0dXM7CisJdTggcmVnX2J1Zls0XTsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsICJlcnJvciBpbnRlcnJ1cHRcbiIpOworCisJZXJyb3JfaW50X3N0YXR1cyA9IGRldi0+aXJxX3Byb2NfcmVnLmVycm9yX2ludF9zdGF0dXMgJiAweDBGOworCWlmICghZXJyb3JfaW50X3N0YXR1cykgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkgICAidmFsaWQgaW50ZXJydXB0IHNvdXJjZShzKSBpbiBFUlJPUl9JTlRfU1RBVFVTOiAweCV4XG4iLAorCQkgICBlcnJvcl9pbnRfc3RhdHVzKTsKKworCWlmIChNUyhFUlJPUl9JTlRfU1RBVFVTX1dBS0VVUCwgZXJyb3JfaW50X3N0YXR1cykpCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsICJlcnJvciA6IHdha2V1cFxuIik7CisKKwlpZiAoTVMoRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1csIGVycm9yX2ludF9zdGF0dXMpKQorCQlhdGg2a2xfZXJyKCJyeCB1bmRlcmZsb3dcbiIpOworCisJaWYgKE1TKEVSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1csIGVycm9yX2ludF9zdGF0dXMpKQorCQlhdGg2a2xfZXJyKCJ0eCBvdmVyZmxvd1xuIik7CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0ICovCisJZGV2LT5pcnFfcHJvY19yZWcuZXJyb3JfaW50X3N0YXR1cyAmPSB+ZXJyb3JfaW50X3N0YXR1czsKKworCS8qIHNldCBXMUMgdmFsdWUgdG8gY2xlYXIgdGhlIGludGVycnVwdCwgdGhpcyBoaXRzIHRoZSByZWdpc3RlciBmaXJzdCAqLworCXJlZ19idWZbMF0gPSBlcnJvcl9pbnRfc3RhdHVzOworCXJlZ19idWZbMV0gPSAwOworCXJlZ19idWZbMl0gPSAwOworCXJlZ19idWZbM10gPSAwOworCisJc3RhdHVzID0gaGlmX3JlYWRfd3JpdGVfc3luYyhkZXYtPmFyLCBFUlJPUl9JTlRfU1RBVFVTX0FERFJFU1MsCisJCQkJICAgICByZWdfYnVmLCA0LCBISUZfV1JfU1lOQ19CWVRFX0ZJWCk7CisKKwlpZiAoc3RhdHVzKQorCQlXQVJOX09OKDEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhdGg2a2xfaGlmX3Byb2NfY3B1X2ludHIoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCXU4IGNwdV9pbnRfc3RhdHVzOworCXU4IHJlZ19idWZbNF07CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLCAiY3B1IGludGVycnVwdFxuIik7CisKKwljcHVfaW50X3N0YXR1cyA9IGRldi0+aXJxX3Byb2NfcmVnLmNwdV9pbnRfc3RhdHVzICYKKwkJCSBkZXYtPmlycV9lbl9yZWcuY3B1X2ludF9zdGF0dXNfZW47CisJaWYgKCFjcHVfaW50X3N0YXR1cykgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkidmFsaWQgaW50ZXJydXB0IHNvdXJjZShzKSBpbiBDUFVfSU5UX1NUQVRVUzogMHgleFxuIiwKKwkJY3B1X2ludF9zdGF0dXMpOworCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLworCWRldi0+aXJxX3Byb2NfcmVnLmNwdV9pbnRfc3RhdHVzICY9IH5jcHVfaW50X3N0YXR1czsKKworCS8qCisJICogU2V0IHVwIHRoZSByZWdpc3RlciB0cmFuc2ZlciBidWZmZXIgdG8gaGl0IHRoZSByZWdpc3RlciA0IHRpbWVzICwKKwkgKiB0aGlzIGlzIGRvbmUgdG8gbWFrZSB0aGUgYWNjZXNzIDQtYnl0ZSBhbGlnbmVkIHRvIG1pdGlnYXRlIGlzc3VlcworCSAqIHdpdGggaG9zdCBidXMgaW50ZXJjb25uZWN0cyB0aGF0IHJlc3RyaWN0IGJ1cyB0cmFuc2ZlciBsZW5ndGhzIHRvCisJICogYmUgYSBtdWx0aXBsZSBvZiA0LWJ5dGVzLgorCSAqLworCisJLyogc2V0IFcxQyB2YWx1ZSB0byBjbGVhciB0aGUgaW50ZXJydXB0LCB0aGlzIGhpdHMgdGhlIHJlZ2lzdGVyIGZpcnN0ICovCisJcmVnX2J1ZlswXSA9IGNwdV9pbnRfc3RhdHVzOworCS8qIHRoZSByZW1haW5pbmcgYXJlIHNldCB0byB6ZXJvIHdoaWNoIGhhdmUgbm8tZWZmZWN0ICAqLworCXJlZ19idWZbMV0gPSAwOworCXJlZ19idWZbMl0gPSAwOworCXJlZ19idWZbM10gPSAwOworCisJc3RhdHVzID0gaGlmX3JlYWRfd3JpdGVfc3luYyhkZXYtPmFyLCBDUFVfSU5UX1NUQVRVU19BRERSRVNTLAorCQkJCSAgICAgcmVnX2J1ZiwgNCwgSElGX1dSX1NZTkNfQllURV9GSVgpOworCisJaWYgKHN0YXR1cykKKwkJV0FSTl9PTigxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIHByb2Nlc3MgcGVuZGluZyBpbnRlcnJ1cHRzIHN5bmNocm9ub3VzbHkgKi8KK3N0YXRpYyBpbnQgcHJvY19wZW5kaW5nX2lycXMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgYm9vbCAqZG9uZSkKK3sKKwlzdHJ1Y3QgYXRoNmtsX2lycV9wcm9jX3JlZ2lzdGVycyAqcmc7CisJaW50IHN0YXR1cyA9IDA7CisJdTggaG9zdF9pbnRfc3RhdHVzID0gMDsKKwl1MzIgbGtfYWhkID0gMDsKKwl1OCBodGNfbWJveCA9IDEgPDwgSFRDX01BSUxCT1g7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLCAicHJvY19wZW5kaW5nX2lycXM6IChkZXY6IDB4JXApXG4iLCBkZXYpOworCisJLyoKKwkgKiBOT1RFOiBISUYgaW1wbGVtZW50YXRpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBjb250ZXh0IG9mIHRoaXMKKwkgKiBjYWxsIGFsbG93cyB1cyB0byBwZXJmb3JtIFNZTkNIUk9OT1VTIEkvTywgdGhhdCBpcyB3ZSBjYW4gYmxvY2ssCisJICogc2xlZXAgb3IgY2FsbCBhbnkgQVBJIHRoYXQgY2FuIGJsb2NrIG9yIHN3aXRjaCB0aHJlYWQvdGFzaworCSAqIGNvbnRleHRzLiBUaGlzIGlzIGEgZnVsbHkgc2NoZWR1bGFibGUgY29udGV4dC4KKwkgKi8KKworCS8qCisJICogUHJvY2VzcyBwZW5kaW5nIGludHIgb25seSB3aGVuIGludF9zdGF0dXNfZW4gaXMgY2xlYXIsIGl0IG1heQorCSAqIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBidXMgdHJhbnNhY3Rpb24gb3RoZXJ3aXNlLiBUYXJnZXQgbWF5IGJlCisJICogdW5yZXNwb25zaXZlIGF0IHRoZSB0aW1lLgorCSAqLworCWlmIChkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbikgeworCQkvKgorCQkgKiBSZWFkIHRoZSBmaXJzdCAyOCBieXRlcyBvZiB0aGUgSFRDIHJlZ2lzdGVyIHRhYmxlLiBUaGlzCisJCSAqIHdpbGwgeWllbGQgdXMgdGhlIHZhbHVlIG9mIGRpZmZlcmVudCBpbnQgc3RhdHVzCisJCSAqIHJlZ2lzdGVycyBhbmQgdGhlIGxvb2thaGVhZCByZWdpc3RlcnMuCisJCSAqCisJCSAqICAgIGxlbmd0aCA9IHNpemVvZihpbnRfc3RhdHVzKSArIHNpemVvZihjcHVfaW50X3N0YXR1cykKKwkJICogICAgICAgICAgICAgKyBzaXplb2YoZXJyb3JfaW50X3N0YXR1cykgKworCQkgKiAgICAgICAgICAgICBzaXplb2YoY291bnRlcl9pbnRfc3RhdHVzKSArCisJCSAqICAgICAgICAgICAgIHNpemVvZihtYm94X2ZyYW1lKSArIHNpemVvZihyeF9sa2FoZF92YWxpZCkKKwkJICogICAgICAgICAgICAgKyBzaXplb2YoaG9sZSkgKyBzaXplb2YocnhfbGthaGQpICsKKwkJICogICAgICAgICAgICAgc2l6ZW9mKGludF9zdGF0dXNfZW4pICsKKwkJICogICAgICAgICAgICAgc2l6ZW9mKGNwdV9pbnRfc3RhdHVzX2VuKSArCisJCSAqICAgICAgICAgICAgIHNpemVvZihlcnJfaW50X3N0YXR1c19lbikgKworCQkgKiAgICAgICAgICAgICBzaXplb2YoY250cl9pbnRfc3RhdHVzX2VuKTsKKwkJICovCisJCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSE9TVF9JTlRfU1RBVFVTX0FERFJFU1MsCisJCQkJCSAgICAgKHU4ICopICZkZXYtPmlycV9wcm9jX3JlZywKKwkJCQkJICAgICBzaXplb2YoZGV2LT5pcnFfcHJvY19yZWcpLAorCQkJCQkgICAgIEhJRl9SRF9TWU5DX0JZVEVfSU5DKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gb3V0OworCisJCWlmIChBUl9EQkdfTFZMX0NIRUNLKEFUSDZLTF9EQkdfSVJRKSkKKwkJCWF0aDZrbF9kdW1wX3JlZ2lzdGVycyhkZXYsICZkZXYtPmlycV9wcm9jX3JlZywKKwkJCQkJICZkZXYtPmlycV9lbl9yZWcpOworCisJCS8qIFVwZGF0ZSBvbmx5IHRob3NlIHJlZ2lzdGVycyB0aGF0IGFyZSBlbmFibGVkICovCisJCWhvc3RfaW50X3N0YXR1cyA9IGRldi0+aXJxX3Byb2NfcmVnLmhvc3RfaW50X3N0YXR1cyAmCisJCQkJICBkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbjsKKworCQkvKiBMb29rIGF0IG1ib3ggc3RhdHVzICovCisJCWlmIChob3N0X2ludF9zdGF0dXMgJiBodGNfbWJveCkgeworCQkJLyoKKwkJCSAqIE1hc2sgb3V0IHBlbmRpbmcgbWJveCB2YWx1ZSwgd2UgdXNlICJsb29rQWhlYWQgYXMKKwkJCSAqIHRoZSByZWFsIGZsYWcgZm9yIG1ib3ggcHJvY2Vzc2luZy4KKwkJCSAqLworCQkJaG9zdF9pbnRfc3RhdHVzICY9IH5odGNfbWJveDsKKwkJCWlmIChkZXYtPmlycV9wcm9jX3JlZy5yeF9sa2FoZF92YWxpZCAmCisJCQkgICAgaHRjX21ib3gpIHsKKwkJCQlyZyA9ICZkZXYtPmlycV9wcm9jX3JlZzsKKwkJCQlsa19haGQgPSBsZTMyX3RvX2NwdShyZy0+cnhfbGthaGRbSFRDX01BSUxCT1hdKTsKKwkJCQlpZiAoIWxrX2FoZCkKKwkJCQkJYXRoNmtsX2VycigibG9va0FoZWFkIGlzIHplcm8hXG4iKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghaG9zdF9pbnRfc3RhdHVzICYmICFsa19haGQpIHsKKwkJKmRvbmUgPSB0cnVlOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobGtfYWhkKSB7CisJCWludCBmZXRjaGVkID0gMDsKKworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkJICAgInBlbmRpbmcgbWFpbGJveCBtc2csIGxrX2FoZDogMHglWFxuIiwgbGtfYWhkKTsKKwkJLyoKKwkJICogTWFpbGJveCBJbnRlcnJ1cHQsIHRoZSBIVEMgbGF5ZXIgbWF5IGlzc3VlIGFzeW5jCisJCSAqIHJlcXVlc3RzIHRvIGVtcHR5IHRoZSBtYWlsYm94LiBXaGVuIGVtcHR5aW5nIHRoZSByZWN2CisJCSAqIG1haWxib3ggd2UgdXNlIHRoZSBhc3luYyBoYW5kbGVyIGFib3ZlIGNhbGxlZCBmcm9tIHRoZQorCQkgKiBjb21wbGV0aW9uIHJvdXRpbmUgb2YgdGhlIGNhbGxlcnMgcmVhZCByZXF1ZXN0LiBUaGlzIGNhbgorCQkgKiBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ5IHJlZHVjaW5nIGNvbnRleHQgc3dpdGNoaW5nIHdoZW4KKwkJICogd2UgcmFwaWRseSBwdWxsIHBhY2tldHMuCisJCSAqLworCQlzdGF0dXMgPSBhdGg2a2xfaHRjX3J4bXNnX3BlbmRpbmdfaGFuZGxlcihkZXYtPmh0Y19jbnh0LAorCQkJCQkJCSAgbGtfYWhkLCAmZmV0Y2hlZCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKworCQlpZiAoIWZldGNoZWQpCisJCQkvKgorCQkJICogSFRDIGNvdWxkIG5vdCBwdWxsIGFueSBtZXNzYWdlcyBvdXQgZHVlIHRvIGxhY2sKKwkJCSAqIG9mIHJlc291cmNlcy4KKwkJCSAqLworCQkJZGV2LT5odGNfY254dC0+Y2hrX2lycV9zdGF0dXNfY250ID0gMDsKKwl9CisKKwkvKiBub3cgaGFuZGxlIHRoZSByZXN0IG9mIHRoZW0gKi8KKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkgICAidmFsaWQgaW50ZXJydXB0IHNvdXJjZShzKSBmb3Igb3RoZXIgaW50ZXJydXB0czogMHgleFxuIiwKKwkJICAgaG9zdF9pbnRfc3RhdHVzKTsKKworCWlmIChNUyhIT1NUX0lOVF9TVEFUVVNfQ1BVLCBob3N0X2ludF9zdGF0dXMpKSB7CisJCS8qIENQVSBJbnRlcnJ1cHQgKi8KKwkJc3RhdHVzID0gYXRoNmtsX2hpZl9wcm9jX2NwdV9pbnRyKGRldik7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoTVMoSE9TVF9JTlRfU1RBVFVTX0VSUk9SLCBob3N0X2ludF9zdGF0dXMpKSB7CisJCS8qIEVycm9yIEludGVycnVwdCAqLworCQlzdGF0dXMgPSBhdGg2a2xfaGlmX3Byb2NfZXJyX2ludHIoZGV2KTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChNUyhIT1NUX0lOVF9TVEFUVVNfQ09VTlRFUiwgaG9zdF9pbnRfc3RhdHVzKSkKKwkJLyogQ291bnRlciBJbnRlcnJ1cHQgKi8KKwkJc3RhdHVzID0gYXRoNmtsX2hpZl9wcm9jX2NvdW50ZXJfaW50cihkZXYpOworCitvdXQ6CisJLyoKKwkgKiBBbiBvcHRpbWl6YXRpb24gdG8gYnlwYXNzIHJlYWRpbmcgdGhlIElSUSBzdGF0dXMgcmVnaXN0ZXJzCisJICogdW5lY2Vzc2FyaWx5IHdoaWNoIGNhbiByZS13YWtlIHRoZSB0YXJnZXQsIGlmIHVwcGVyIGxheWVycworCSAqIGRldGVybWluZSB0aGF0IHdlIGFyZSBpbiBhIGxvdy10aHJvdWdocHV0IG1vZGUsIHdlIGNhbiByZWx5IG9uCisJICogdGFraW5nIGFub3RoZXIgaW50ZXJydXB0IHJhdGhlciB0aGFuIHJlLWNoZWNraW5nIHRoZSBzdGF0dXMKKwkgKiByZWdpc3RlcnMgd2hpY2ggY2FuIHJlLXdha2UgdGhlIHRhcmdldC4KKwkgKgorCSAqIE5PVEUgOiBmb3IgaG9zdCBpbnRlcmZhY2VzIHRoYXQgbWFrZXMgdXNlIG9mIGRldGVjdGluZyBwZW5kaW5nCisJICogbWJveCBtZXNzYWdlcyBhdCBoaWYgY2FuIG5vdCB1c2UgdGhpcyBvcHRpbWl6YXRpb24gZHVlIHRvCisJICogcG9zc2libGUgc2lkZSBlZmZlY3RzLCBTUEkgcmVxdWlyZXMgdGhlIGhvc3QgdG8gZHJhaW4gYWxsCisJICogbWVzc2FnZXMgZnJvbSB0aGUgbWFpbGJveCBiZWZvcmUgZXhpdGluZyB0aGUgSVNSIHJvdXRpbmUuCisJICovCisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkgICAiYnlwYXNzaW5nIGlycSBzdGF0dXMgcmUtY2hlY2ssIGZvcmNpbmcgZG9uZVxuIik7CisKKwlpZiAoIWRldi0+aHRjX2NueHQtPmNoa19pcnFfc3RhdHVzX2NudCkKKwkJKmRvbmUgPSB0cnVlOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwKKwkJICAgInByb2NfcGVuZGluZ19pcnFzOiAoZG9uZTolZCwgc3RhdHVzPSVkXG4iLCAqZG9uZSwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIGludGVycnVwdCBoYW5kbGVyLCBraWNrcyBvZmYgYWxsIGludGVycnVwdCBwcm9jZXNzaW5nICovCitpbnQgYXRoNmtsX2hpZl9pbnRyX2JoX2hhbmRsZXIoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiA9IGFyLT5odGNfdGFyZ2V0LT5kZXY7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBzdGF0dXMgPSAwOworCWJvb2wgZG9uZSA9IGZhbHNlOworCisJLyoKKwkgKiBSZXNldCBjb3VudGVyIHVzZWQgdG8gZmxhZyBhIHJlLXNjYW4gb2YgSVJRIHN0YXR1cyByZWdpc3RlcnMgb24KKwkgKiB0aGUgdGFyZ2V0LgorCSAqLworCWRldi0+aHRjX2NueHQtPmNoa19pcnFfc3RhdHVzX2NudCA9IDA7CisKKwkvKgorCSAqIElSUSBwcm9jZXNzaW5nIGlzIHN5bmNocm9ub3VzLCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycyBjYW4gYmUKKwkgKiByZS1yZWFkLgorCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhBVEg2S0xfSElGX0NPTU1VTklDQVRJT05fVElNRU9VVCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICFkb25lKSB7CisJCXN0YXR1cyA9IHByb2NfcGVuZGluZ19pcnFzKGRldiwgJmRvbmUpOworCQlpZiAoc3RhdHVzKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhdGg2a2xfaGlmX2VuYWJsZV9pbnRycyhzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGg2a2xfaXJxX2VuYWJsZV9yZWcgcmVnczsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2JoKCZkZXYtPmxvY2spOworCisJLyogRW5hYmxlIGFsbCBidXQgQVRINktMIENQVSBpbnRlcnJ1cHRzICovCisJZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4gPQorCQkJU00oSU5UX1NUQVRVU19FTkFCTEVfRVJST1IsIDB4MDEpIHwKKwkJCVNNKElOVF9TVEFUVVNfRU5BQkxFX0NQVSwgMHgwMSkgfAorCQkJU00oSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUiwgMHgwMSk7CisKKwkvKgorCSAqIE5PVEU6IFRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIEhJRiBjYW4gZG8gZGV0ZWN0aW9uIG9mCisJICogcGVuZGluZyBtYm94IG1lc3NhZ2VzIHdoaWNoIGlzIGRpc2FibGVkIG5vdy4KKwkgKi8KKwlkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbiB8PSBTTShJTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEEsIDB4MDEpOworCisJLyogU2V0IHVwIHRoZSBDUFUgSW50ZXJydXB0IHN0YXR1cyBSZWdpc3RlciAqLworCWRldi0+aXJxX2VuX3JlZy5jcHVfaW50X3N0YXR1c19lbiA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIEVycm9yIEludGVycnVwdCBzdGF0dXMgUmVnaXN0ZXIgKi8KKwlkZXYtPmlycV9lbl9yZWcuZXJyX2ludF9zdGF0dXNfZW4gPQorCQlTTShFUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPVywgMHgwMSkgfAorCQlTTShFUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XLCAweDEpOworCisJLyoKKwkgKiBFbmFibGUgQ291bnRlciBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHRvIGdldCBmYXRhbCBlcnJvcnMgZm9yCisJICogZGVidWdnaW5nLgorCSAqLworCWRldi0+aXJxX2VuX3JlZy5jbnRyX2ludF9zdGF0dXNfZW4gPSBTTShDT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVCwKKwkJCQkJCUFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLKTsKKwltZW1jcHkoJnJlZ3MsICZkZXYtPmlycV9lbl9yZWcsIHNpemVvZihyZWdzKSk7CisKKwlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrKTsKKworCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKKwkJCQkgICAgICZyZWdzLmludF9zdGF0dXNfZW4sIHNpemVvZihyZWdzKSwKKwkJCQkgICAgIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKKworCWlmIChzdGF0dXMpCisJCWF0aDZrbF9lcnIoImZhaWxlZCB0byB1cGRhdGUgaW50ZXJydXB0IGN0bCByZWcgZXJyOiAlZFxuIiwKKwkJCSAgIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYXRoNmtsX2hpZl9kaXNhYmxlX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyByZWdzOworCisJc3Bpbl9sb2NrX2JoKCZkZXYtPmxvY2spOworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbiA9IDA7CisJZGV2LT5pcnFfZW5fcmVnLmNwdV9pbnRfc3RhdHVzX2VuID0gMDsKKwlkZXYtPmlycV9lbl9yZWcuZXJyX2ludF9zdGF0dXNfZW4gPSAwOworCWRldi0+aXJxX2VuX3JlZy5jbnRyX2ludF9zdGF0dXNfZW4gPSAwOworCW1lbWNweSgmcmVncywgJmRldi0+aXJxX2VuX3JlZywgc2l6ZW9mKHJlZ3MpKTsKKwlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrKTsKKworCXJldHVybiBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIElOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MsCisJCQkJICAgJnJlZ3MuaW50X3N0YXR1c19lbiwgc2l6ZW9mKHJlZ3MpLAorCQkJCSAgIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKK30KKworLyogZW5hYmxlIGRldmljZSBpbnRlcnJ1cHRzICovCitpbnQgYXRoNmtsX2hpZl91bm1hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCS8qCisJICogTWFrZSBzdXJlIGludGVycnVwdCBhcmUgZGlzYWJsZWQgYmVmb3JlIHVubWFza2luZyBhdCB0aGUgSElGCisJICogbGF5ZXIuIFRoZSByYXRpb25hbGUgaGVyZSBpcyB0aGF0IGJldHdlZW4gZGV2aWNlIGluc2VydGlvbgorCSAqICh3aGVyZSB3ZSBjbGVhciB0aGUgaW50ZXJydXB0cyB0aGUgZmlyc3QgdGltZSkgYW5kIHdoZW4gSFRDCisJICogaXMgZmluYWxseSByZWFkeSB0byBoYW5kbGUgaW50ZXJydXB0cywgb3RoZXIgc29mdHdhcmUgY2FuIHBlcmZvcm0KKwkgKiB0YXJnZXQgInNvZnQiIHJlc2V0cy4gVGhlIEFUSDZLTCBpbnRlcnJ1cHQgZW5hYmxlcyByZXNldCBiYWNrIHRvIGFuCisJICogImVuYWJsZWQiIHN0YXRlIHdoZW4gdGhpcyBoYXBwZW5zLgorCSAqLworCWF0aDZrbF9oaWZfZGlzYWJsZV9pbnRycyhkZXYpOworCisJLyogdW5tYXNrIHRoZSBob3N0IGNvbnRyb2xsZXIgaW50ZXJydXB0cyAqLworCWF0aDZrbF9oaWZfaXJxX2VuYWJsZShkZXYtPmFyKTsKKwlzdGF0dXMgPSBhdGg2a2xfaGlmX2VuYWJsZV9pbnRycyhkZXYpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogZGlzYWJsZSBhbGwgZGV2aWNlIGludGVycnVwdHMgKi8KK2ludCBhdGg2a2xfaGlmX21hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIE1hc2sgdGhlIGludGVycnVwdCBhdCB0aGUgSElGIGxheWVyIHRvIGF2b2lkIGFueSBzdHJheSBpbnRlcnJ1cHQKKwkgKiB0YWtlbiB3aGlsZSB3ZSB6ZXJvIG91dCBvdXIgc2hhZG93IHJlZ2lzdGVycyBpbgorCSAqIGF0aDZrbF9oaWZfZGlzYWJsZV9pbnRycygpLgorCSAqLworCWF0aDZrbF9oaWZfaXJxX2Rpc2FibGUoZGV2LT5hcik7CisKKwlyZXR1cm4gYXRoNmtsX2hpZl9kaXNhYmxlX2ludHJzKGRldik7Cit9CisKK2ludCBhdGg2a2xfaGlmX3NldHVwKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKKworCS8qCisJICogTk9URTogd2UgYWN0dWFsbHkgZ2V0IHRoZSBibG9jayBzaXplIG9mIGEgbWFpbGJveCBvdGhlciB0aGFuIDAsCisJICogZm9yIFNESU8gdGhlIGJsb2NrIHNpemUgb24gbWFpbGJveCAwIGlzIGFydGlmaWNpYWxseSBzZXQgdG8gMS4KKwkgKiBTbyB3ZSB1c2UgdGhlIGJsb2NrIHNpemUgdGhhdCBpcyBzZXQgZm9yIHRoZSBvdGhlciAzIG1haWxib3hlcy4KKwkgKi8KKwlkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiA9IGRldi0+YXItPm1ib3hfaW5mby5ibG9ja19zaXplOworCisJLyogbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KKwlpZiAoKGRldi0+aHRjX2NueHQtPmJsb2NrX3N6ICYgKGRldi0+aHRjX2NueHQtPmJsb2NrX3N6IC0gMSkpICE9IDApIHsKKwkJV0FSTl9PTigxKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX3NldHVwOworCX0KKworCS8qIGFzc2VtYmxlIG1hc2ssIHVzZWQgZm9yIHBhZGRpbmcgdG8gYSBibG9jayAqLworCWRldi0+aHRjX2NueHQtPmJsb2NrX21hc2sgPSBkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiAtIDE7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIGJsb2NrIHNpemUgJWQgbWJveCBhZGRyIDB4JXhcbiIsCisJCSAgIGRldi0+aHRjX2NueHQtPmJsb2NrX3N6LCBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIpOworCisJc3RhdHVzID0gYXRoNmtsX2hpZl9kaXNhYmxlX2ludHJzKGRldik7CisKK2ZhaWxfc2V0dXA6CisJcmV0dXJuIHN0YXR1czsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmgKaW5kZXggNzk3ZTJkMS4uZjJkYzNiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5oCkBAIC01OSw2ICs1OSwxOCBAQAogLyogbW9kZSB0byBlbmFibGUgc3BlY2lhbCA0LWJpdCBpbnRlcnJ1cHQgYXNzZXJ0aW9uIHdpdGhvdXQgY2xvY2sgKi8KICNkZWZpbmUgU0RJT19JUlFfTU9ERV9BU1lOQ180QklUX0lSUSAgICgxIDw8IDApCiAKKy8qIEhUQyBydW5zIG92ZXIgbWFpbGJveCAwICovCisjZGVmaW5lIEhUQ19NQUlMQk9YCTAKKworI2RlZmluZSBBVEg2S0xfVEFSR0VUX0RFQlVHX0lOVFJfTUFTSyAgICAgMHgwMQorCisvKiBGSVhNRTogYXJlIHRoZXNlIGR1cGxpY2F0ZXMgd2l0aCBNQVhfU0NBVFRFUl8gdmFsdWVzIGluIGhpZi5oPyAqLworI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEgICAgICAgICAgICAxNgorI2RlZmluZSBBVEg2S0xfTUFYX1RSQU5TRkVSX1NJWkVfUEVSX1NDQVRURVIgICAgICAoMTYgKiAxMDI0KQorI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9SRVFTICAgICAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgQVRINktMX0hJRl9DT01NVU5JQ0FUSU9OX1RJTUVPVVQJMTAwMAorCiBzdHJ1Y3QgYnVzX3JlcXVlc3QgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIApAQCAtMTg2LDYgKzE5OCwzNCBAQAogCXN0cnVjdCBoaWZfc2NhdHRlcl9pdGVtIHNjYXRfbGlzdFsxXTsKIH07CiAKK3N0cnVjdCBhdGg2a2xfaXJxX3Byb2NfcmVnaXN0ZXJzIHsKKwl1OCBob3N0X2ludF9zdGF0dXM7CisJdTggY3B1X2ludF9zdGF0dXM7CisJdTggZXJyb3JfaW50X3N0YXR1czsKKwl1OCBjb3VudGVyX2ludF9zdGF0dXM7CisJdTggbWJveF9mcmFtZTsKKwl1OCByeF9sa2FoZF92YWxpZDsKKwl1OCBob3N0X2ludF9zdGF0dXMyOworCXU4IGdtYm94X3J4X2F2YWlsOworCV9fbGUzMiByeF9sa2FoZFsyXTsKKwlfX2xlMzIgcnhfZ21ib3hfbGthaGRfYWxpYXNbMl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHsKKwl1OCBpbnRfc3RhdHVzX2VuOworCXU4IGNwdV9pbnRfc3RhdHVzX2VuOworCXU4IGVycl9pbnRfc3RhdHVzX2VuOworCXU4IGNudHJfaW50X3N0YXR1c19lbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdGg2a2xfZGV2aWNlIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGF0aDZrbF9pcnFfcHJvY19yZWdpc3RlcnMgaXJxX3Byb2NfcmVnOworCXN0cnVjdCBhdGg2a2xfaXJxX2VuYWJsZV9yZWcgaXJxX2VuX3JlZzsKKwlzdHJ1Y3QgaHRjX3RhcmdldCAqaHRjX2NueHQ7CisJc3RydWN0IGF0aDZrbCAqYXI7Cit9OworCiBzdHJ1Y3QgYXRoNmtsX2hpZl9vcHMgewogCWludCAoKnJlYWRfd3JpdGVfc3luYykoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyLCB1OCAqYnVmLAogCQkJICAgICAgIHUzMiBsZW4sIHUzMiByZXF1ZXN0KTsKQEAgLTIwMiw3ICsyNDIsMjYgQEAKIAlpbnQgKCpzY2F0X3JlcV9ydykgKHN0cnVjdCBhdGg2a2wgKmFyLAogCQkJICAgIHN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKnNjYXRfcmVxKTsKIAl2b2lkICgqY2xlYW51cF9zY2F0dGVyKShzdHJ1Y3QgYXRoNmtsICphcik7Ci0JaW50ICgqc3VzcGVuZCkoc3RydWN0IGF0aDZrbCAqYXIpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBhdGg2a2wgKmFyLCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpOworCWludCAoKnJlc3VtZSkoc3RydWN0IGF0aDZrbCAqYXIpOworCWludCAoKnBvd2VyX29uKShzdHJ1Y3QgYXRoNmtsICphcik7CisJaW50ICgqcG93ZXJfb2ZmKShzdHJ1Y3QgYXRoNmtsICphcik7CisJdm9pZCAoKnN0b3ApKHN0cnVjdCBhdGg2a2wgKmFyKTsKIH07CiAKK2ludCBhdGg2a2xfaGlmX3NldHVwKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpOworaW50IGF0aDZrbF9oaWZfdW5tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpOworaW50IGF0aDZrbF9oaWZfbWFza19pbnRycyhzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KTsKK2ludCBhdGg2a2xfaGlmX3BvbGxfbWJveG1zZ19yeChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LAorCQkJICAgICAgIHUzMiAqbGtfYWhkLCBpbnQgdGltZW91dCk7CitpbnQgYXRoNmtsX2hpZl9yeF9jb250cm9sKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlX3J4KTsKK2ludCBhdGg2a2xfaGlmX2Rpc2FibGVfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7CisKK2ludCBhdGg2a2xfaGlmX3J3X2NvbXBfaGFuZGxlcih2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzKTsKK2ludCBhdGg2a2xfaGlmX2ludHJfYmhfaGFuZGxlcihzdHJ1Y3QgYXRoNmtsICphcik7CisKKy8qIFNjYXR0ZXIgRnVuY3Rpb24gYW5kIERlZmluaXRpb25zICovCitpbnQgYXRoNmtsX2hpZl9zdWJtaXRfc2NhdF9yZXEoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpzY2F0X3JlcSwgYm9vbCByZWFkKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Yy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGMuYwppbmRleCBmODhhN2M5Li5mM2I2M2NhMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGMuYwpAQCAtMTUsMTMgKzE1LDMyMSBAQAogICovCiAKICNpbmNsdWRlICJjb3JlLmgiCi0jaW5jbHVkZSAiaHRjX2hpZi5oIgorI2luY2x1ZGUgImhpZi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiaGlmLW9wcy5oIgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2RlZmluZSBDQUxDX1RYUlhfUEFEREVEX0xFTihkZXYsIGxlbikgIChfX0FMSUdOX01BU0soKGxlbiksIChkZXYpLT5ibG9ja19tYXNrKSkKIAorLyogRnVuY3Rpb25zIGZvciBUeCBjcmVkaXQgaGFuZGxpbmcgKi8KK3N0YXRpYyB2b2lkIGF0aDZrbF9jcmVkaXRfZGVwb3NpdChzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyAqY3JlZF9pbmZvLAorCQkJCSAgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCwKKwkJCQkgIGludCBjcmVkaXRzKQoreworCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICJjcmVkaXQgZGVwb3NpdCBlcCAlZCBjcmVkaXRzICVkXG4iLAorCQkgICBlcF9kaXN0LT5lbmRwb2ludCwgY3JlZGl0cyk7CisKKwllcF9kaXN0LT5jcmVkaXRzICs9IGNyZWRpdHM7CisJZXBfZGlzdC0+Y3JlZF9hc3NuZ2QgKz0gY3JlZGl0czsKKwljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgLT0gY3JlZGl0czsKK30KKworc3RhdGljIHZvaWQgYXRoNmtsX2NyZWRpdF9pbml0KHN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvICpjcmVkX2luZm8sCisJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZXBfbGlzdCwKKwkJCSAgICAgICBpbnQgdG90X2NyZWRpdHMpCit7CisJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyX2VwX2Rpc3Q7CisJaW50IGNvdW50OworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgImNyZWRpdCBpbml0IHRvdGFsICVkXG4iLCB0b3RfY3JlZGl0cyk7CisKKwljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKKwljcmVkX2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2VwX2Rpc3QsIGVwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN1cl9lcF9kaXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQorCQkJY29udGludWU7CisKKwkJY3VyX2VwX2Rpc3QtPmNyZWRfbWluID0gY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZzsKKworCQlpZiAodG90X2NyZWRpdHMgPiA0KSB7CisJCQlpZiAoKGN1cl9lcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfQktfU1ZDKSB8fAorCQkJICAgIChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JFX1NWQykpIHsKKwkJCQlhdGg2a2xfY3JlZGl0X2RlcG9zaXQoY3JlZF9pbmZvLAorCQkJCQkJICAgICAgY3VyX2VwX2Rpc3QsCisJCQkJCQkgICAgICBjdXJfZXBfZGlzdC0+Y3JlZF9taW4pOworCQkJCWN1cl9lcF9kaXN0LT5kaXN0X2ZsYWdzIHw9IEhUQ19FUF9BQ1RJVkU7CisJCQl9CisJCX0KKworCQlpZiAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfQ09OVFJPTF9TVkMpIHsKKwkJCWF0aDZrbF9jcmVkaXRfZGVwb3NpdChjcmVkX2luZm8sIGN1cl9lcF9kaXN0LAorCQkJCQkgICAgICBjdXJfZXBfZGlzdC0+Y3JlZF9taW4pOworCQkJLyoKKwkJCSAqIENvbnRyb2wgc2VydmljZSBpcyBhbHdheXMgbWFya2VkIGFjdGl2ZSwgaXQKKwkJCSAqIG5ldmVyIGdvZXMgaW5hY3RpdmUgRVZFUi4KKwkJCSAqLworCQkJY3VyX2VwX2Rpc3QtPmRpc3RfZmxhZ3MgfD0gSFRDX0VQX0FDVElWRTsKKwkJfSBlbHNlIGlmIChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JLX1NWQykKKwkJCS8qIHRoaXMgaXMgdGhlIGxvd2VzdCBwcmlvcml0eSBkYXRhIGVuZHBvaW50ICovCisJCQkvKiBGSVhNRTogdGhpcyBsb29rcyBmaXNoeSwgY2hlY2sgKi8KKwkJCWNyZWRfaW5mby0+bG93ZXN0cHJpX2VwX2Rpc3QgPSBjdXJfZXBfZGlzdC0+bGlzdDsKKworCQkvKgorCQkgKiBTdHJlYW1zIGhhdmUgdG8gYmUgY3JlYXRlZCAoZXhwbGljaXQgfCBpbXBsaWNpdCkgZm9yIGFsbAorCQkgKiBraW5kcyBvZiB0cmFmZmljLiBCRSBlbmRwb2ludHMgYXJlIGFsc28gaW5hY3RpdmUgaW4gdGhlCisJCSAqIGJlZ2lubmluZy4gV2hlbiBCRSB0cmFmZmljIHN0YXJ0cyBpdCBjcmVhdGVzIGltcGxpY2l0CisJCSAqIHN0cmVhbXMgdGhhdCByZWRpc3RyaWJ1dGVzIGNyZWRpdHMuCisJCSAqCisJCSAqIE5vdGU6IGFsbCBvdGhlciBlbmRwb2ludHMgaGF2ZSBtaW5pbXVtcyBzZXQgYnV0IGFyZQorCQkgKiBpbml0aWFsbHkgZ2l2ZW4gTk8gY3JlZGl0cy4gY3JlZGl0cyB3aWxsIGJlIGRpc3RyaWJ1dGVkCisJCSAqIGFzIHRyYWZmaWMgYWN0aXZpdHkgZGVtYW5kcworCQkgKi8KKwl9CisKKwlXQVJOX09OKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA8PSAwKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2VwX2Rpc3QsIGVwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN1cl9lcF9kaXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQorCQkJY29udGludWU7CisKKwkJaWYgKGN1cl9lcF9kaXN0LT5zdmNfaWQgPT0gV01JX0NPTlRST0xfU1ZDKQorCQkJY3VyX2VwX2Rpc3QtPmNyZWRfbm9ybSA9IGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIEZvciB0aGUgcmVtYWluaW5nIGRhdGEgZW5kcG9pbnRzLCB3ZSBhc3N1bWUgdGhhdAorCQkJICogZWFjaCBjcmVkX3Blcl9tc2cgYXJlIHRoZSBzYW1lLiBXZSB1c2UgYSBzaW1wbGUKKwkJCSAqIGNhbGN1bGF0aW9uIGhlcmUsIHdlIHRha2UgdGhlIHJlbWFpbmluZyBjcmVkaXRzCisJCQkgKiBhbmQgZGV0ZXJtaW5lIGhvdyBtYW55IG1heCBtZXNzYWdlcyB0aGlzIGNhbgorCQkJICogY292ZXIgYW5kIHRoZW4gc2V0IGVhY2ggZW5kcG9pbnQncyBub3JtYWwgdmFsdWUKKwkJCSAqIGVxdWFsIHRvIDMvNCB0aGlzIGFtb3VudC4KKwkJCSAqLworCQkJY291bnQgPSAoY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzIC8KKwkJCQkgY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZykKKwkJCQkqIGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7CisJCQljb3VudCA9IChjb3VudCAqIDMpID4+IDI7CisJCQljb3VudCA9IG1heChjb3VudCwgY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZyk7CisJCQljdXJfZXBfZGlzdC0+Y3JlZF9ub3JtID0gY291bnQ7CisKKwkJfQorCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsCisJCQkgICAiY3JlZGl0IGVwICVkIHN2Y19pZCAlZCBjcmVkaXRzICVkIHBlcl9tc2cgJWQgbm9ybSAlZCBtaW4gJWRcbiIsCisJCQkgICBjdXJfZXBfZGlzdC0+ZW5kcG9pbnQsCisJCQkgICBjdXJfZXBfZGlzdC0+c3ZjX2lkLAorCQkJICAgY3VyX2VwX2Rpc3QtPmNyZWRpdHMsCisJCQkgICBjdXJfZXBfZGlzdC0+Y3JlZF9wZXJfbXNnLAorCQkJICAgY3VyX2VwX2Rpc3QtPmNyZWRfbm9ybSwKKwkJCSAgIGN1cl9lcF9kaXN0LT5jcmVkX21pbik7CisJfQorfQorCisvKiBpbml0aWFsaXplIGFuZCBzZXR1cCBjcmVkaXQgZGlzdHJpYnV0aW9uICovCitpbnQgYXRoNmtsX2NyZWRpdF9zZXR1cCh2b2lkICpodGNfaGFuZGxlLAorCQkJc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbykKK3sKKwl1MTYgc2VydmljZXByaW9yaXR5WzVdOworCisJbWVtc2V0KGNyZWRfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvKSk7CisKKwlzZXJ2aWNlcHJpb3JpdHlbMF0gPSBXTUlfQ09OVFJPTF9TVkM7ICAvKiBoaWdoZXN0ICovCisJc2VydmljZXByaW9yaXR5WzFdID0gV01JX0RBVEFfVk9fU1ZDOworCXNlcnZpY2Vwcmlvcml0eVsyXSA9IFdNSV9EQVRBX1ZJX1NWQzsKKwlzZXJ2aWNlcHJpb3JpdHlbM10gPSBXTUlfREFUQV9CRV9TVkM7CisJc2VydmljZXByaW9yaXR5WzRdID0gV01JX0RBVEFfQktfU1ZDOyAvKiBsb3dlc3QgKi8KKworCS8qIHNldCBwcmlvcml0eSBsaXN0ICovCisJYXRoNmtsX2h0Y19zZXRfY3JlZGl0X2Rpc3QoaHRjX2hhbmRsZSwgY3JlZF9pbmZvLCBzZXJ2aWNlcHJpb3JpdHksIDUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlZHVjZSBhbiBlcCdzIGNyZWRpdHMgYmFjayB0byBhIHNldCBsaW1pdCAqLworc3RhdGljIHZvaWQgYXRoNmtsX2NyZWRpdF9yZWR1Y2Uoc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbywKKwkJCQkgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCwKKwkJCQkgaW50IGxpbWl0KQoreworCWludCBjcmVkaXRzOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgImNyZWRpdCByZWR1Y2UgZXAgJWQgbGltaXQgJWRcbiIsCisJCSAgIGVwX2Rpc3QtPmVuZHBvaW50LCBsaW1pdCk7CisKKwllcF9kaXN0LT5jcmVkX2Fzc25nZCA9IGxpbWl0OworCisJaWYgKGVwX2Rpc3QtPmNyZWRpdHMgPD0gbGltaXQpCisJCXJldHVybjsKKworCWNyZWRpdHMgPSBlcF9kaXN0LT5jcmVkaXRzIC0gbGltaXQ7CisJZXBfZGlzdC0+Y3JlZGl0cyAtPSBjcmVkaXRzOworCWNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyArPSBjcmVkaXRzOworfQorCitzdGF0aWMgdm9pZCBhdGg2a2xfY3JlZGl0X3VwZGF0ZShzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyAqY3JlZF9pbmZvLAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICplcGRpc3RfbGlzdCkKK3sKKwlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICpjdXJfZGlzdF9saXN0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJfZGlzdF9saXN0LCBlcGRpc3RfbGlzdCwgbGlzdCkgeworCQlpZiAoY3VyX2Rpc3RfbGlzdC0+ZW5kcG9pbnQgPT0gRU5EUE9JTlRfMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjdXJfZGlzdF9saXN0LT5jcmVkX3RvX2Rpc3QgPiAwKSB7CisJCQljdXJfZGlzdF9saXN0LT5jcmVkaXRzICs9CisJCQkJCWN1cl9kaXN0X2xpc3QtPmNyZWRfdG9fZGlzdDsKKwkJCWN1cl9kaXN0X2xpc3QtPmNyZWRfdG9fZGlzdCA9IDA7CisJCQlpZiAoY3VyX2Rpc3RfbGlzdC0+Y3JlZGl0cyA+CisJCQkgICAgY3VyX2Rpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QpCisJCQkJYXRoNmtsX2NyZWRpdF9yZWR1Y2UoY3JlZF9pbmZvLAorCQkJCQkJY3VyX2Rpc3RfbGlzdCwKKwkJCQkJCWN1cl9kaXN0X2xpc3QtPmNyZWRfYXNzbmdkKTsKKworCQkJaWYgKGN1cl9kaXN0X2xpc3QtPmNyZWRpdHMgPgorCQkJICAgIGN1cl9kaXN0X2xpc3QtPmNyZWRfbm9ybSkKKwkJCQlhdGg2a2xfY3JlZGl0X3JlZHVjZShjcmVkX2luZm8sIGN1cl9kaXN0X2xpc3QsCisJCQkJCQkgICAgIGN1cl9kaXN0X2xpc3QtPmNyZWRfbm9ybSk7CisKKwkJCWlmICghKGN1cl9kaXN0X2xpc3QtPmRpc3RfZmxhZ3MgJiBIVENfRVBfQUNUSVZFKSkgeworCQkJCWlmIChjdXJfZGlzdF9saXN0LT50eHFfZGVwdGggPT0gMCkKKwkJCQkJYXRoNmtsX2NyZWRpdF9yZWR1Y2UoY3JlZF9pbmZvLAorCQkJCQkJCSAgICAgY3VyX2Rpc3RfbGlzdCwgMCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBIVEMgaGFzIGFuIGVuZHBvaW50IHRoYXQgbmVlZHMgY3JlZGl0cywgZXBfZGlzdCBpcyB0aGUgZW5kcG9pbnQgaW4KKyAqIHF1ZXN0aW9uLgorICovCitzdGF0aWMgdm9pZCBhdGg2a2xfY3JlZGl0X3NlZWsoc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbywKKwkJCQlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICplcF9kaXN0KQoreworCXN0cnVjdCBodGNfZW5kcG9pbnRfY3JlZGl0X2Rpc3QgKmN1cmRpc3RfbGlzdDsKKwlpbnQgY3JlZGl0cyA9IDA7CisJaW50IG5lZWQ7CisKKwlpZiAoZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9DT05UUk9MX1NWQykKKwkJZ290byBvdXQ7CisKKwlpZiAoKGVwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9WSV9TVkMpIHx8CisJICAgIChlcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfVk9fU1ZDKSkKKwkJaWYgKChlcF9kaXN0LT5jcmVkX2Fzc25nZCA+PSBlcF9kaXN0LT5jcmVkX25vcm0pKQorCQkJZ290byBvdXQ7CisKKwkvKgorCSAqIEZvciBhbGwgb3RoZXIgc2VydmljZXMsIHdlIGZvbGxvdyBhIHNpbXBsZSBhbGdvcml0aG0gb2Y6CisJICoKKwkgKiAxLiBjaGVja2luZyB0aGUgZnJlZSBwb29sIGZvciBjcmVkaXRzCisJICogMi4gY2hlY2tpbmcgbG93ZXIgcHJpb3JpdHkgZW5kcG9pbnRzIGZvciBjcmVkaXRzIHRvIHRha2UKKwkgKi8KKworCWNyZWRpdHMgPSBtaW4oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzLCBlcF9kaXN0LT5zZWVrX2NyZWQpOworCisJaWYgKGNyZWRpdHMgPj0gZXBfZGlzdC0+c2Vla19jcmVkKQorCQlnb3RvIG91dDsKKworCS8qCisJICogV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW4gdGhlIGZyZWUgcG9vbCwgdHJ5IHRha2luZyBhd2F5IGZyb20KKwkgKiBsb3dlciBwcmlvcml0eSBzZXJ2aWNlcyBUaGUgcnVsZSBmb3IgdGFraW5nIGF3YXkgY3JlZGl0czoKKwkgKgorCSAqICAgMS4gT25seSB0YWtlIGZyb20gbG93ZXIgcHJpb3JpdHkgZW5kcG9pbnRzCisJICogICAyLiBPbmx5IHRha2Ugd2hhdCBpcyBhbGxvY2F0ZWQgYWJvdmUgdGhlIG1pbmltdW0gKG5ldmVyCisJICogICAgICBzdGFydmUgYW4gZW5kcG9pbnQgY29tcGxldGVseSkKKwkgKiAgIDMuIE9ubHkgdGFrZSB3aGF0IHlvdSBuZWVkLgorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGN1cmRpc3RfbGlzdCwKKwkJCQkgICAgJmNyZWRfaW5mby0+bG93ZXN0cHJpX2VwX2Rpc3QsCisJCQkJICAgIGxpc3QpIHsKKwkJaWYgKGN1cmRpc3RfbGlzdCA9PSBlcF9kaXN0KQorCQkJYnJlYWs7CisKKwkJbmVlZCA9IGVwX2Rpc3QtPnNlZWtfY3JlZCAtIGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0czsKKworCQlpZiAoKGN1cmRpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QgLSBuZWVkKSA+PQorCQkgICAgIGN1cmRpc3RfbGlzdC0+Y3JlZF9taW4pIHsKKwkJCS8qCisJCQkgKiBUaGUgY3VycmVudCBvbmUgaGFzIGJlZW4gYWxsb2NhdGVkIG1vcmUgdGhhbgorCQkJICogaXQncyBtaW5pbXVtIGFuZCBpdCBoYXMgZW5vdWdoIGNyZWRpdHMgYXNzaWduZWQKKwkJCSAqIGFib3ZlIGl0J3MgbWluaW11bSB0byBmdWxmaWxsIG91ciBuZWVkIHRyeSB0bworCQkJICogdGFrZSBhd2F5IGp1c3QgZW5vdWdoIHRvIGZ1bGZpbGwgb3VyIG5lZWQuCisJCQkgKi8KKwkJCWF0aDZrbF9jcmVkaXRfcmVkdWNlKGNyZWRfaW5mbywgY3VyZGlzdF9saXN0LAorCQkJCQkgICAgIGN1cmRpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QgLSBuZWVkKTsKKworCQkJaWYgKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA+PQorCQkJICAgIGVwX2Rpc3QtPnNlZWtfY3JlZCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjdXJkaXN0X2xpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCisJCQlicmVhazsKKwl9CisKKwljcmVkaXRzID0gbWluKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cywgZXBfZGlzdC0+c2Vla19jcmVkKTsKKworb3V0OgorCS8qIGRpZCB3ZSBmaW5kIHNvbWUgY3JlZGl0cz8gKi8KKwlpZiAoY3JlZGl0cykKKwkJYXRoNmtsX2NyZWRpdF9kZXBvc2l0KGNyZWRfaW5mbywgZXBfZGlzdCwgY3JlZGl0cyk7CisKKwllcF9kaXN0LT5zZWVrX2NyZWQgPSAwOworfQorCisvKiByZWRpc3RyaWJ1dGUgY3JlZGl0cyBiYXNlZCBvbiBhY3Rpdml0eSBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIGF0aDZrbF9jcmVkaXRfcmVkaXN0cmlidXRlKHN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvICppbmZvLAorCQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplcF9kaXN0X2xpc3QpCit7CisJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyZGlzdF9saXN0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJkaXN0X2xpc3QsIGVwX2Rpc3RfbGlzdCwgbGlzdCkgeworCQlpZiAoY3VyZGlzdF9saXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQorCQkJY29udGludWU7CisKKwkJaWYgKChjdXJkaXN0X2xpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CS19TVkMpICB8fAorCQkgICAgKGN1cmRpc3RfbGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JFX1NWQykpCisJCQljdXJkaXN0X2xpc3QtPmRpc3RfZmxhZ3MgfD0gSFRDX0VQX0FDVElWRTsKKworCQlpZiAoKGN1cmRpc3RfbGlzdC0+c3ZjX2lkICE9IFdNSV9DT05UUk9MX1NWQykgJiYKKwkJICAgICEoY3VyZGlzdF9saXN0LT5kaXN0X2ZsYWdzICYgSFRDX0VQX0FDVElWRSkpIHsKKwkJCWlmIChjdXJkaXN0X2xpc3QtPnR4cV9kZXB0aCA9PSAwKQorCQkJCWF0aDZrbF9jcmVkaXRfcmVkdWNlKGluZm8sIGN1cmRpc3RfbGlzdCwgMCk7CisJCQllbHNlCisJCQkJYXRoNmtsX2NyZWRpdF9yZWR1Y2UoaW5mbywKKwkJCQkJCSAgICAgY3VyZGlzdF9saXN0LAorCQkJCQkJICAgICBjdXJkaXN0X2xpc3QtPmNyZWRfbWluKTsKKwkJfQorCX0KK30KKworLyoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2hlbmV2ZXIgZW5kcG9pbnRzIHJlcXVpcmUgY3JlZGl0CisgKiBkaXN0cmlidXRpb25zLiBBIGxvY2sgaXMgaGVsZCB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQsIHRoaXMKKyAqIGZ1bmN0aW9uIHNoYWxsIE5PVCBibG9jay4gVGhlIGVwX2Rpc3RfbGlzdCBpcyBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9uCisgKiBzdHJ1Y3R1cmVzIGluIHByaW9yaXRpemVkIG9yZGVyIGFzIGRlZmluZWQgYnkgdGhlIGNhbGwgdG8gdGhlCisgKiBodGNfc2V0X2NyZWRpdF9kaXN0KCkgYXBpLgorICovCitzdGF0aWMgdm9pZCBhdGg2a2xfY3JlZGl0X2Rpc3RyaWJ1dGUoc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbywKKwkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwX2Rpc3RfbGlzdCwKKwkJCSAgICAgIGVudW0gaHRjX2NyZWRpdF9kaXN0X3JlYXNvbiByZWFzb24pCit7CisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIEhUQ19DUkVESVRfRElTVF9TRU5EX0NPTVBMRVRFOgorCQlhdGg2a2xfY3JlZGl0X3VwZGF0ZShjcmVkX2luZm8sIGVwX2Rpc3RfbGlzdCk7CisJCWJyZWFrOworCWNhc2UgSFRDX0NSRURJVF9ESVNUX0FDVElWSVRZX0NIQU5HRToKKwkJYXRoNmtsX2NyZWRpdF9yZWRpc3RyaWJ1dGUoY3JlZF9pbmZvLCBlcF9kaXN0X2xpc3QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlXQVJOX09OKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA+IGNyZWRfaW5mby0+dG90YWxfYXZhaWxfY3JlZGl0cyk7CisJV0FSTl9PTihjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPCAwKTsKK30KKwogc3RhdGljIHZvaWQgYXRoNmtsX2h0Y190eF9idWZfYWxpZ24odTggKipidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXU4ICphbGlnbl9hZGRyOwpAQCAtMTAyLDEyICs0MTAsMTIgQEAKIAkJCQlwYWNrZXQtPmluZm8udHguY3JlZF91c2VkOwogCWVuZHBvaW50LT5jcmVkX2Rpc3QudHhxX2RlcHRoID0gZ2V0X3F1ZXVlX2RlcHRoKCZlbmRwb2ludC0+dHhxKTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImN0eHQ6MHglcCBkaXN0OjB4JXBcbiIsCi0JCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyB0eCBjdHh0IDB4JXAgZGlzdCAweCVwXG4iLAorCQkgICB0YXJnZXQtPmNyZWRpdF9pbmZvLCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCk7CiAKLQlhdGg2a19jcmVkaXRfZGlzdHJpYnV0ZSh0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwKLQkJCQkmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwKLQkJCQlIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CisJYXRoNmtsX2NyZWRpdF9kaXN0cmlidXRlKHRhcmdldC0+Y3JlZGl0X2luZm8sCisJCQkJICZ0YXJnZXQtPmNyZWRfZGlzdF9saXN0LAorCQkJCSBIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CiAKIAlzcGluX3VubG9ja19iaCgmdGFyZ2V0LT50eF9sb2NrKTsKIH0KQEAgLTExOCw4ICs0MjYsOCBAQAogCWlmIChsaXN0X2VtcHR5KHR4cSkpCiAJCXJldHVybjsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJICAgInNlbmQgY29tcGxldGUgZXAgJWQsICglZCBwa3RzKVxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkgICAiaHRjIHR4IGNvbXBsZXRlIGVwICVkIHBrdHMgJWRcbiIsCiAJCSAgIGVuZHBvaW50LT5laWQsIGdldF9xdWV1ZV9kZXB0aCh0eHEpKTsKIAogCWF0aDZrbF90eF9jb21wbGV0ZShlbmRwb2ludC0+dGFyZ2V0LT5kZXYtPmFyLCB0eHEpOwpAQCAtMTMxLDYgKzQzOSw5IEBACiAJc3RydWN0IGh0Y19lbmRwb2ludCAqZW5kcG9pbnQgPSAmdGFyZ2V0LT5lbmRwb2ludFtwYWNrZXQtPmVuZHBvaW50XTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvbnRhaW5lcjsKIAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsICJodGMgdHggY29tcGxldGUgc2Vxbm8gJWRcbiIsCisJCSAgIHBhY2tldC0+aW5mby50eC5zZXFubyk7CisKIAlodGNfdHhfY29tcF91cGRhdGUodGFyZ2V0LCBlbmRwb2ludCwgcGFja2V0KTsKIAlJTklUX0xJU1RfSEVBRCgmY29udGFpbmVyKTsKIAlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3QsICZjb250YWluZXIpOwpAQCAtMTQ4LDggKzQ1OSw4IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmdHhfY29tcHEpOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkiaHRjX2FzeW5jX3R4X3NjYXRfY29tcGxldGUgIHRvdGFsIGxlbjogJWQgIGVudHJpZXM6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCSJodGMgdHggc2NhdCBjb21wbGV0ZSBsZW4gJWQgZW50cmllcyAlZFxuIiwKIAkJc2NhdF9yZXEtPmxlbiwgc2NhdF9yZXEtPnNjYXRfZW50cmllcyk7CiAKIAlpZiAoc2NhdF9yZXEtPnN0YXR1cykKQEAgLTE5MCwxNiArNTAxLDEzIEBACiAKIAlzZW5kX2xlbiA9IHBhY2tldC0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAiJXM6IHRyYW5zbWl0IGxlbiA6ICVkICglcylcbiIsCi0JCSAgIF9fZnVuY19fLCBzZW5kX2xlbiwgc3luYyA/ICJzeW5jIiA6ICJhc3luYyIpOwotCiAJcGFkZGVkX2xlbiA9IENBTENfVFhSWF9QQURERURfTEVOKHRhcmdldCwgc2VuZF9sZW4pOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkiRGV2U2VuZFBhY2tldCwgcGFkZGVkIGxlbjogJWQgbWJveDoweCVYIChtb2RlOiVzKVxuIiwKLQkJcGFkZGVkX2xlbiwKLQkJdGFyZ2V0LT5kZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsCi0JCXN5bmMgPyAic3luYyIgOiAiYXN5bmMiKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkgICAiaHRjIHR4IGlzc3VlIGxlbiAlZCBzZXFubyAlZCBwYWRkZWRfbGVuICVkIG1ib3ggMHglWCAlc1xuIiwKKwkJICAgc2VuZF9sZW4sIHBhY2tldC0+aW5mby50eC5zZXFubywgcGFkZGVkX2xlbiwKKwkJICAgdGFyZ2V0LT5kZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsCisJCSAgIHN5bmMgPyAic3luYyIgOiAiYXN5bmMiKTsKIAogCWlmIChzeW5jKSB7CiAJCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmModGFyZ2V0LT5kZXYtPmFyLApAQCAtMjI3LDcgKzUzNSw3IEBACiAJKnJlcV9jcmVkID0gKGxlbiA+IHRhcmdldC0+dGd0X2NyZWRfc3opID8KIAkJICAgICBESVZfUk9VTkRfVVAobGVuLCB0YXJnZXQtPnRndF9jcmVkX3N6KSA6IDE7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICJjcmVkcyByZXF1aXJlZDolZCBnb3Q6JWRcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgImNyZWRpdCBjaGVjayBuZWVkICVkIGdvdCAlZFxuIiwKIAkJICAgKnJlcV9jcmVkLCBlcC0+Y3JlZF9kaXN0LmNyZWRpdHMpOwogCiAJaWYgKGVwLT5jcmVkX2Rpc3QuY3JlZGl0cyA8ICpyZXFfY3JlZCkgewpAQCAtMjM3LDE2ICs1NDUsMTMgQEAKIAkJLyogU2VlayBtb3JlIGNyZWRpdHMgKi8KIAkJZXAtPmNyZWRfZGlzdC5zZWVrX2NyZWQgPSAqcmVxX2NyZWQgLSBlcC0+Y3JlZF9kaXN0LmNyZWRpdHM7CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAiY3R4dDoweCVwIGRpc3Q6MHglcFxuIiwKLQkJCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmZXAtPmNyZWRfZGlzdCk7Ci0KLQkJYXRoNmtfc2Vla19jcmVkaXRzKHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmZXAtPmNyZWRfZGlzdCk7CisJCWF0aDZrbF9jcmVkaXRfc2Vlayh0YXJnZXQtPmNyZWRpdF9pbmZvLCAmZXAtPmNyZWRfZGlzdCk7CiAKIAkJZXAtPmNyZWRfZGlzdC5zZWVrX2NyZWQgPSAwOwogCiAJCWlmIChlcC0+Y3JlZF9kaXN0LmNyZWRpdHMgPCAqcmVxX2NyZWQpIHsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCQkgICAibm90IGVub3VnaCBjcmVkaXRzIGZvciBlcCAlZCAtIGxlYXZpbmcgcGFja2V0IGluIHF1ZXVlXG4iLAorCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwKKwkJCQkgICAiY3JlZGl0IG5vdCBmb3VuZCBmb3IgZXAgJWRcbiIsCiAJCQkJICAgZWlkKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0yNjAsMTcgKzU2NSwxNSBAQAogCQllcC0+Y3JlZF9kaXN0LnNlZWtfY3JlZCA9CiAJCWVwLT5jcmVkX2Rpc3QuY3JlZF9wZXJfbXNnIC0gZXAtPmNyZWRfZGlzdC5jcmVkaXRzOwogCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImN0eHQ6MHglcCBkaXN0OjB4JXBcbiIsCi0JCQkgICB0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJmVwLT5jcmVkX2Rpc3QpOwotCi0JCWF0aDZrX3NlZWtfY3JlZGl0cyh0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJmVwLT5jcmVkX2Rpc3QpOworCQlhdGg2a2xfY3JlZGl0X3NlZWsodGFyZ2V0LT5jcmVkaXRfaW5mbywgJmVwLT5jcmVkX2Rpc3QpOwogCiAJCS8qIHNlZSBpZiB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgaW4gZ2V0dGluZyBtb3JlICovCiAJCWlmIChlcC0+Y3JlZF9kaXN0LmNyZWRpdHMgPCBlcC0+Y3JlZF9kaXN0LmNyZWRfcGVyX21zZykgewogCQkJLyogdGVsbCB0aGUgdGFyZ2V0IHdlIG5lZWQgY3JlZGl0cyBBU0FQISAqLwogCQkJKmZsYWdzIHw9IEhUQ19GTEFHU19ORUVEX0NSRURJVF9VUERBVEU7CiAJCQllcC0+ZXBfc3QuY3JlZF9sb3dfaW5kaWNhdGUgKz0gMTsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImhvc3QgbmVlZHMgY3JlZGl0c1xuIik7CisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULAorCQkJCSAgICJjcmVkaXQgd2UgbmVlZCBjcmVkaXRzIGFzYXBcbiIpOwogCQl9CiAJfQogCkBAIC0yOTUsOCArNTk4LDggQEAKIAkJcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgmZW5kcG9pbnQtPnR4cSwgc3RydWN0IGh0Y19wYWNrZXQsCiAJCQkJCSAgbGlzdCk7CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkJImdvdCBoZWFkIHBrdDoweCVwICwgcXVldWUgZGVwdGg6ICVkXG4iLAorCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJImh0YyB0eCBnb3QgcGFja2V0IDB4JXAgcXVldWUgZGVwdGggJWRcbiIsCiAJCQlwYWNrZXQsIGdldF9xdWV1ZV9kZXB0aCgmZW5kcG9pbnQtPnR4cSkpOwogCiAJCWxlbiA9IENBTENfVFhSWF9QQURERURfTEVOKHRhcmdldCwKQEAgLTQwNCw5ICs3MDcsOSBAQAogCiAJCXNjYXRfcmVxLT5sZW4gKz0gbGVuOwogCQlzY2F0X3JlcS0+c2NhdF9lbnRyaWVzKys7Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCSAgICIlZCwgYWRkaW5nIHBrdCA6IDB4JXAgbGVuOiVkIChyZW1haW5pbmcgc3BhY2U6JWQpXG4iLAotCQkJICAgaSwgcGFja2V0LCBsZW4sIHJlbV9zY2F0KTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSAgICJodGMgdHggYWRkaW5nICglZCkgcGt0IDB4JXAgc2Vxbm8gJWQgbGVuICVkIHJlbWFpbmluZyAlZFxuIiwKKwkJCSAgIGksIHBhY2tldCwgcGFja2V0LT5pbmZvLnR4LnNlcW5vLCBsZW4sIHJlbV9zY2F0KTsKIAl9CiAKIAkvKiBSb2xsIGJhY2sgc2NhdHRlciBzZXR1cCBpbiBjYXNlIG9mIGFueSBmYWlsdXJlICovCkBAIC00NTUsMTIgKzc1OCwxMiBAQAogCiAJCWlmICghc2NhdF9yZXEpIHsKIAkJCS8qIG5vIHNjYXR0ZXIgcmVzb3VyY2VzICAqLwotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkJCSJubyBtb3JlIHNjYXR0ZXIgcmVzb3VyY2VzXG4iKTsKKwkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCQkJImh0YyB0eCBubyBtb3JlIHNjYXR0ZXIgcmVzb3VyY2VzXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAicGt0cyB0byBzY2F0dGVyOiAlZFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyB0eCBwa3RzIHRvIHNjYXR0ZXI6ICVkXG4iLAogCQkJICAgbl9zY2F0KTsKIAogCQlzY2F0X3JlcS0+bGVuID0gMDsKQEAgLTQ3OSwxMCArNzgyLDEwIEBACiAJCW5fc2VudF9idW5kbGUrKzsKIAkJdG90X3BrdHNfYnVuZGxlICs9IHNjYXRfcmVxLT5zY2F0X2VudHJpZXM7CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkJICAgInNlbmQgc2NhdHRlciB0b3RhbCBieXRlczogJWQgLCBlbnRyaWVzOiAlZFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSAgICJodGMgdHggc2NhdHRlciBieXRlcyAlZCBlbnRyaWVzICVkXG4iLAogCQkJICAgc2NhdF9yZXEtPmxlbiwgc2NhdF9yZXEtPnNjYXRfZW50cmllcyk7Ci0JCWF0aDZrbGRldl9zdWJtaXRfc2NhdF9yZXEodGFyZ2V0LT5kZXYsIHNjYXRfcmVxLCBmYWxzZSk7CisJCWF0aDZrbF9oaWZfc3VibWl0X3NjYXRfcmVxKHRhcmdldC0+ZGV2LCBzY2F0X3JlcSwgZmFsc2UpOwogCiAJCWlmIChzdGF0dXMpCiAJCQlicmVhazsKQEAgLTQ5MCw4ICs3OTMsOCBAQAogCiAJKnNlbnRfYnVuZGxlID0gbl9zZW50X2J1bmRsZTsKIAkqbl9idW5kbGVfcGt0cyA9IHRvdF9wa3RzX2J1bmRsZTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICIlcyAoc2VudDolZClcbiIsCi0JCSAgIF9fZnVuY19fLCBuX3NlbnRfYnVuZGxlKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLCAiaHRjIHR4IGJ1bmRsZSBzZW50ICVkIHBrdHNcbiIsCisJCSAgIG5fc2VudF9idW5kbGUpOwogCiAJcmV0dXJuOwogfQpAQCAtNTEwLDcgKzgxMyw3IEBACiAJaWYgKGVuZHBvaW50LT50eF9wcm9jX2NudCA+IDEpIHsKIAkJZW5kcG9pbnQtPnR4X3Byb2NfY250LS07CiAJCXNwaW5fdW5sb2NrX2JoKCZ0YXJnZXQtPnR4X2xvY2spOwotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICJodGNfdHJ5X3NlbmQgKGJ1c3kpXG4iKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyB0eCBidXN5XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTg4LDE1ICs4OTEsMTIgQEAKIAkJb3ZlcmZsb3cgPSB0cnVlOwogCiAJaWYgKG92ZXJmbG93KQotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsCi0JCQkgICAiZXAgJWQsIHR4IHF1ZXVlIHdpbGwgb3ZlcmZsb3cgOiVkICwgdHggZGVwdGg6JWQsIG1heDolZFxuIiwKLQkJCSAgIGVuZHBvaW50LT5laWQsIG92ZXJmbG93LCB0eHFfZGVwdGgsCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCQkgICAiaHRjIHR4IG92ZXJmbG93IGVwICVkIGRlcHRoICVkIG1heCAlZFxuIiwKKwkJCSAgIGVuZHBvaW50LT5laWQsIHR4cV9kZXB0aCwKIAkJCSAgIGVuZHBvaW50LT5tYXhfdHhxX2RlcHRoKTsKIAogCWlmIChvdmVyZmxvdyAmJiBlcF9jYi50eF9mdWxsKSB7Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCSAgICJpbmRpY2F0aW5nIG92ZXJmbG93ZWQgdHggcGFja2V0OiAweCVwXG4iLCB0eF9wa3QpOwotCiAJCWlmIChlcF9jYi50eF9mdWxsKGVuZHBvaW50LT50YXJnZXQsIHR4X3BrdCkgPT0KIAkJICAgIEhUQ19TRU5EX0ZVTExfRFJPUCkgewogCQkJZW5kcG9pbnQtPmVwX3N0LnR4X2Ryb3BwZWQgKz0gMTsKQEAgLTYyNSwxMiArOTI1LDEyIEBACiAJICogYXJlIG5vdCBtb2RpZnlpbmcgYW55IHN0YXRlLgogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3JlZF9kaXN0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwgbGlzdCkgewotCQllbmRwb2ludCA9IChzdHJ1Y3QgaHRjX2VuZHBvaW50ICopY3JlZF9kaXN0LT5odGNfcnN2ZDsKKwkJZW5kcG9pbnQgPSBjcmVkX2Rpc3QtPmh0Y19lcDsKIAogCQlzcGluX2xvY2tfYmgoJnRhcmdldC0+dHhfbG9jayk7CiAJCWlmICghbGlzdF9lbXB0eSgmZW5kcG9pbnQtPnR4cSkpIHsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCQkgICAiZXAgJWQgaGFzICVkIGNyZWRpdHMgYW5kICVkIHBhY2tldHMgaW4gdHggcXVldWVcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSAgICJodGMgY3JlZHMgZXAgJWQgY3JlZGl0cyAlZCBwa3RzICVkXG4iLAogCQkJCSAgIGNyZWRfZGlzdC0+ZW5kcG9pbnQsCiAJCQkJICAgZW5kcG9pbnQtPmNyZWRfZGlzdC5jcmVkaXRzLAogCQkJCSAgIGdldF9xdWV1ZV9kZXB0aCgmZW5kcG9pbnQtPnR4cSkpOwpAQCAtNzA0LDEzICsxMDA0LDEzIEBACiB9CiAKIHZvaWQgYXRoNmtsX2h0Y19zZXRfY3JlZGl0X2Rpc3Qoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCwKLQkJCQlzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvICpjcmVkX2Rpc3RfY250eHQsCisJCQkJc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRpdF9pbmZvLAogCQkJCXUxNiBzcnZjX3ByaV9vcmRlcltdLCBpbnQgbGlzdF9sZW4pCiB7CiAJc3RydWN0IGh0Y19lbmRwb2ludCAqZW5kcG9pbnQ7CiAJaW50IGksIGVwOwogCi0JdGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQgPSBjcmVkX2Rpc3RfY250eHQ7CisJdGFyZ2V0LT5jcmVkaXRfaW5mbyA9IGNyZWRpdF9pbmZvOwogCiAJbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5lbmRwb2ludFtFTkRQT0lOVF8wXS5jcmVkX2Rpc3QubGlzdCwKIAkJICAgICAgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOwpAQCAtNzM2LDggKzEwMzYsOCBAQAogCXN0cnVjdCBodGNfZW5kcG9pbnQgKmVuZHBvaW50OwogCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsCi0JCSAgICJodGNfdHg6IGVwIGlkOiAlZCwgYnVmOiAweCVwLCBsZW46ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCSAgICJodGMgdHggZXAgaWQgJWQgYnVmIDB4JXAgbGVuICVkXG4iLAogCQkgICBwYWNrZXQtPmVuZHBvaW50LCBwYWNrZXQtPmJ1ZiwgcGFja2V0LT5hY3RfbGVuKTsKIAogCWlmIChwYWNrZXQtPmVuZHBvaW50ID49IEVORFBPSU5UX01BWCkgewpAQCAtNzg3LDggKzEwODcsOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXQsIHRtcF9wa3QsICZkaXNjYXJkX3EsIGxpc3QpIHsKIAkJcGFja2V0LT5zdGF0dXMgPSAtRUNBTkNFTEVEOwogCQlsaXN0X2RlbCgmcGFja2V0LT5saXN0KTsKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywKLQkJCSJmbHVzaGluZyB0eCBwa3Q6MHglcCwgbGVuOiVkLCBlcDolZCB0YWc6MHglWFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSJodGMgdHggZmx1c2hpbmcgcGt0IDB4JXAgbGVuICVkICBlcCAlZCB0YWcgMHgleFxuIiwKIAkJCXBhY2tldCwgcGFja2V0LT5hY3RfbGVuLAogCQkJcGFja2V0LT5lbmRwb2ludCwgcGFja2V0LT5pbmZvLnR4LnRhZyk7CiAKQEAgLTg0NCwxMiArMTE0NCwxMyBAQAogCQllbmRwb2ludC0+Y3JlZF9kaXN0LnR4cV9kZXB0aCA9CiAJCQlnZXRfcXVldWVfZGVwdGgoJmVuZHBvaW50LT50eHEpOwogCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImN0eHQ6MHglcCBkaXN0OjB4JXBcbiIsCi0JCQkgICB0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJICAgImh0YyB0eCBhY3Rpdml0eSBjdHh0IDB4JXAgZGlzdCAweCVwXG4iLAorCQkJICAgdGFyZ2V0LT5jcmVkaXRfaW5mbywgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOwogCi0JCWF0aDZrX2NyZWRpdF9kaXN0cmlidXRlKHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LAotCQkJCQkmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwKLQkJCQkJSFRDX0NSRURJVF9ESVNUX0FDVElWSVRZX0NIQU5HRSk7CisJCWF0aDZrbF9jcmVkaXRfZGlzdHJpYnV0ZSh0YXJnZXQtPmNyZWRpdF9pbmZvLAorCQkJCQkgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCisJCQkJCSBIVENfQ1JFRElUX0RJU1RfQUNUSVZJVFlfQ0hBTkdFKTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmdGFyZ2V0LT50eF9sb2NrKTsKQEAgLTkxOSwxNSArMTIyMCwxNSBAQAogCXBhZGRlZF9sZW4gPSBDQUxDX1RYUlhfUEFEREVEX0xFTih0YXJnZXQsIHJ4X2xlbik7CiAKIAlpZiAocGFkZGVkX2xlbiA+IHBhY2tldC0+YnVmX2xlbikgewotCQlhdGg2a2xfZXJyKCJub3QgZW5vdWdoIHJlY2VpdmUgc3BhY2UgZm9yIHBhY2tldCAtIHBhZGxlbjolZCByZWN2bGVuOiVkIGJ1ZmZlcmxlbjolZFxuIiwKKwkJYXRoNmtsX2Vycigibm90IGVub3VnaCByZWNlaXZlIHNwYWNlIGZvciBwYWNrZXQgLSBwYWRsZW4gJWQgcmVjdmxlbiAlZCBidWZmZXJsZW4gJWRcbiIsCiAJCQkgICBwYWRkZWRfbGVuLCByeF9sZW4sIHBhY2tldC0+YnVmX2xlbik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwKLQkJICAgImRldl9yeF9wa3QgKDB4JXAgOiBoZHI6MHglWCkgcGFkZGVkIGxlbjogJWQgbWJveDoweCVYIChtb2RlOiVzKVxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkgICAiaHRjIHJ4IDB4JXAgaGRyIHgleCBsZW4gJWQgbWJveCAweCV4XG4iLAogCQkgICBwYWNrZXQsIHBhY2tldC0+aW5mby5yeC5leHBfaGRyLAotCQkgICBwYWRkZWRfbGVuLCBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsICJzeW5jIik7CisJCSAgIHBhZGRlZF9sZW4sIGRldi0+YXItPm1ib3hfaW5mby5odGNfYWRkcik7CiAKIAlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsCiAJCQkJICAgICBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsCkBAIC0xMTM3LDggKzE0MzgsOCBAQAogCQkJfQogCiAJCQllbmRwb2ludC0+ZXBfc3QucnhfYnVuZGxlX2Zyb21faGRyICs9IDE7Ci0JCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCQkJICAgImh0YyBoZHIgaW5kaWNhdGVzIDolZCBtc2cgY2FuIGJlIGZldGNoZWQgYXMgYSBidW5kbGVcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSAgICJodGMgcnggYnVuZGxlIHBrdHMgJWRcbiIsCiAJCQkJICAgbl9tc2cpOwogCQl9IGVsc2UKIAkJCS8qIEhUQyBoZWFkZXIgb25seSBpbmRpY2F0ZXMgMSBtZXNzYWdlIHRvIGZldGNoICovCkBAIC0xMTkxLDggKzE0OTIsOCBAQAogCQlhdGg2a2xfZXJyKCJodGNfY3RybF9yeCwgZ290IG1lc3NhZ2Ugd2l0aCBsZW46JXp1XG4iLAogCQkJcGFja2V0cy0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIKTsKIAotCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsCi0JCQkJIlVuZXhwZWN0ZWQgRU5EUE9JTlQgMCBNZXNzYWdlIiwgIiIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywKKwkJCQkiaHRjIHJ4IHVuZXhwZWN0ZWQgZW5kcG9pbnQgMCBtZXNzYWdlIiwgIiIsCiAJCQkJcGFja2V0cy0+YnVmIC0gSFRDX0hEUl9MRU5HVEgsCiAJCQkJcGFja2V0cy0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIKTsKIAl9CkBAIC0xMjA5LDkgKzE1MTAsNiBAQAogCWludCB0b3RfY3JlZGl0cyA9IDAsIGk7CiAJYm9vbCBkaXN0ID0gZmFsc2U7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsCi0JCSAgICJodGNfcHJvY19jcmVkX3JwdCwgY3JlZGl0IHJlcG9ydCBlbnRyaWVzOiVkXG4iLCBuX2VudHJpZXMpOwotCiAJc3Bpbl9sb2NrX2JoKCZ0YXJnZXQtPnR4X2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IG5fZW50cmllczsgaSsrLCBycHQrKykgewpAQCAtMTIyMyw4ICsxNTIxLDkgQEAKIAogCQllbmRwb2ludCA9ICZ0YXJnZXQtPmVuZHBvaW50W3JwdC0+ZWlkXTsKIAotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICIgZXAgJWQgZ290ICVkIGNyZWRpdHNcbiIsCi0JCQlycHQtPmVpZCwgcnB0LT5jcmVkaXRzKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwKKwkJCSAgICJjcmVkaXQgcmVwb3J0IGVwICVkIGNyZWRpdHMgJWRcbiIsCisJCQkgICBycHQtPmVpZCwgcnB0LT5jcmVkaXRzKTsKIAogCQllbmRwb2ludC0+ZXBfc3QudHhfY3JlZF9ycHQgKz0gMTsKIAkJZW5kcG9pbnQtPmVwX3N0LmNyZWRfcmV0bmQgKz0gcnB0LT5jcmVkaXRzOwpAQCAtMTI2NCwyMSArMTU2MywxNCBAQAogCQl0b3RfY3JlZGl0cyArPSBycHQtPmNyZWRpdHM7CiAJfQogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkgICAicmVwb3J0IGluZGljYXRlZCAlZCBjcmVkaXRzIHRvIGRpc3RyaWJ1dGVcbiIsCi0JCSAgIHRvdF9jcmVkaXRzKTsKLQogCWlmIChkaXN0KSB7CiAJCS8qCiAJCSAqIFRoaXMgd2FzIGEgY3JlZGl0IHJldHVybiBiYXNlZCBvbiBhIGNvbXBsZXRlZCBzZW5kCiAJCSAqIG9wZXJhdGlvbnMgbm90ZSwgdGhpcyBpcyBkb25lIHdpdGggdGhlIGxvY2sgaGVsZAogCQkgKi8KLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAiY3R4dDoweCVwIGRpc3Q6MHglcFxuIiwKLQkJCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCk7Ci0KLQkJYXRoNmtfY3JlZGl0X2Rpc3RyaWJ1dGUodGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQsCi0JCQkJCSZ0YXJnZXQtPmNyZWRfZGlzdF9saXN0LAotCQkJCQlIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CisJCWF0aDZrbF9jcmVkaXRfZGlzdHJpYnV0ZSh0YXJnZXQtPmNyZWRpdF9pbmZvLAorCQkJCQkgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCisJCQkJCSBIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnRhcmdldC0+dHhfbG9jayk7CkBAIC0xMzIwLDE0ICsxNjEyLDE1IEBACiAJCWlmICgobGtfYWhkLT5wcmVfdmFsaWQgPT0gKCh+bGtfYWhkLT5wb3N0X3ZhbGlkKSAmIDB4RkYpKQogCQkgICAgJiYgbmV4dF9sa19haGRzKSB7CiAKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwKLQkJCQkgICAibGtfYWhkIHJlcG9ydCBmb3VuZCAocHJlIHZhbGlkOjB4JVgsIHBvc3QgdmFsaWQ6MHglWClcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSAgICJodGMgcnggbGtfYWhkIGZvdW5kIHByZV92YWxpZCAweCV4IHBvc3RfdmFsaWQgMHgleFxuIiwKIAkJCQkgICBsa19haGQtPnByZV92YWxpZCwgbGtfYWhkLT5wb3N0X3ZhbGlkKTsKIAogCQkJLyogbG9vayBhaGVhZCBieXRlcyBhcmUgdmFsaWQsIGNvcHkgdGhlbSBvdmVyICovCiAJCQltZW1jcHkoKHU4ICopJm5leHRfbGtfYWhkc1swXSwgbGtfYWhkLT5sa19haGQsIDQpOwogCi0JCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsICJOZXh0IExvb2sgQWhlYWQiLAorCQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfSFRDLAorCQkJCQkiaHRjIHJ4IG5leHQgbG9vayBhaGVhZCIsCiAJCQkJCSIiLCBuZXh0X2xrX2FoZHMsIDQpOwogCiAJCQkqbl9sa19haGRzID0gMTsKQEAgLTEzNDYsNyArMTYzOSw3IEBACiAJCQlidW5kbGVfbGthaGRfcnB0ID0KIAkJCQkoc3RydWN0IGh0Y19idW5kbGVfbGthaGRfcnB0ICopIHJlY29yZF9idWY7CiAKLQkJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX1JBV19CWVRFUywgIkJ1bmRsZSBsa19haGQiLAorCQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfSFRDLCAiaHRjIHJ4IGJ1bmRsZSBsa19haGQiLAogCQkJCQkiIiwgcmVjb3JkX2J1ZiwgcmVjb3JkLT5sZW4pOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTEzNzgsMTAgKzE2NzEsOCBAQAogCXU4ICpyZWNvcmRfYnVmOwogCXU4ICpvcmlnX2J1ZjsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwgIitodGNfcHJvY190cmFpbGVyIChsZW46JWQpXG4iLCBsZW4pOwotCi0JYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCAiUmVjdiBUcmFpbGVyIiwgIiIsCi0JCQlidWYsIGxlbik7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyByeCB0cmFpbGVyIGxlbiAlZFxuIiwgbGVuKTsKKwlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19IVEMsIE5VTEwsICIiLCBidWYsIGxlbik7CiAKIAlvcmlnX2J1ZiA9IGJ1ZjsKIAlvcmlnX2xlbiA9IGxlbjsKQEAgLTE0MTgsNyArMTcwOSw3IEBACiAJfQogCiAJaWYgKHN0YXR1cykKLQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCAiQkFEIFJlY3YgVHJhaWxlciIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywgImh0YyByeCBiYWQgdHJhaWxlciIsCiAJCQkJIiIsIG9yaWdfYnVmLCBvcmlnX2xlbik7CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTQzNiw5ICsxNzI3LDYgQEAKIAlpZiAobl9sa2FoZHMgIT0gTlVMTCkKIAkJKm5fbGthaGRzID0gMDsKIAotCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX1JBV19CWVRFUywgIkhUQyBSZWN2IFBLVCIsICJodGMgIiwKLQkJCXBhY2tldC0+YnVmLCBwYWNrZXQtPmFjdF9sZW4pOwotCiAJLyoKIAkgKiBOT1RFOiB3ZSBjYW5ub3QgYXNzdW1lIHRoZSBhbGlnbm1lbnQgb2YgYnVmLCBzbyB3ZSB1c2UgdGhlIHNhZmUKIAkgKiBtYWNyb3MgdG8gcmV0cmlldmUgMTYgYml0IGZpZWxkcy4KQEAgLTE0ODAsOSArMTc2OCw5IEBACiAJaWYgKGxrX2FoZCAhPSBwYWNrZXQtPmluZm8ucnguZXhwX2hkcikgewogCQlhdGg2a2xfZXJyKCIlcygpOiBsa19haGQgbWlzbWF0Y2ghIChwUGt0OjB4JXAgZmxhZ3M6MHglWClcbiIsCiAJCQkgICBfX2Z1bmNfXywgcGFja2V0LCBwYWNrZXQtPmluZm8ucngucnhfZmxhZ3MpOwotCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsICJFeHBlY3RlZCBNZXNzYWdlIGxrX2FoZCIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywgImh0YyByeCBleHBlY3RlZCBsa19haGQiLAogCQkJCSIiLCAmcGFja2V0LT5pbmZvLnJ4LmV4cF9oZHIsIDQpOwotCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsICJDdXJyZW50IEZyYW1lIEhlYWRlciIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywgImh0YyByeCBjdXJyZW50IGhlYWRlciIsCiAJCQkJIiIsICh1OCAqKSZsa19haGQsIHNpemVvZihsa19haGQpKTsKIAkJc3RhdHVzID0gLUVOT01FTTsKIAkJZ290byBmYWlsX3J4OwpAQCAtMTUxOCwxNSArMTgwNiw4IEBACiAKIGZhaWxfcng6CiAJaWYgKHN0YXR1cykKLQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCAiQkFEIEhUQyBSZWN2IFBLVCIsCi0JCQkJIiIsIHBhY2tldC0+YnVmLAotCQkJCXBhY2tldC0+YWN0X2xlbiA8IDI1NiA/IHBhY2tldC0+YWN0X2xlbiA6IDI1Nik7Ci0JZWxzZSB7Ci0JCWlmIChwYWNrZXQtPmFjdF9sZW4gPiAwKQotCQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLAotCQkJCQkiSFRDIC0gQXBwbGljYXRpb24gTXNnIiwgIiIsCi0JCQkJCXBhY2tldC0+YnVmLCBwYWNrZXQtPmFjdF9sZW4pOwotCX0KKwkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfSFRDLCAiaHRjIHJ4IGJhZCBwYWNrZXQiLAorCQkJCSIiLCBwYWNrZXQtPmJ1ZiwgcGFja2V0LT5hY3RfbGVuKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNTM0LDggKzE4MTUsOCBAQAogc3RhdGljIHZvaWQgYXRoNmtsX2h0Y19yeF9jb21wbGV0ZShzdHJ1Y3QgaHRjX2VuZHBvaW50ICplbmRwb2ludCwKIAkJCQkgICBzdHJ1Y3QgaHRjX3BhY2tldCAqcGFja2V0KQogewotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCQkgICAiaHRjIGNhbGxpbmcgZXAgJWQgcmVjdiBjYWxsYmFjayBvbiBwYWNrZXQgMHglcFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSAgICJodGMgcnggY29tcGxldGUgZXAgJWQgcGFja2V0IDB4JXBcbiIsCiAJCQkgICBlbmRwb2ludC0+ZWlkLCBwYWNrZXQpOwogCQllbmRwb2ludC0+ZXBfY2IucngoZW5kcG9pbnQtPnRhcmdldCwgcGFja2V0KTsKIH0KQEAgLTE1NzEsOSArMTg1Miw5IEBACiAKIAlsZW4gPSAwOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19SRUNWLAotCQkgICAiJXMoKTogKG51bXBhY2tldHM6ICVkICwgYWN0dWFsIDogJWQpXG4iLAotCQkgICBfX2Z1bmNfXywgZ2V0X3F1ZXVlX2RlcHRoKHJ4cSksIG5fc2NhdF9wa3QpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCSAgICJodGMgcnggYnVuZGxlIGRlcHRoICVkIHBrdHMgJWRcbiIsCisJCSAgIGdldF9xdWV1ZV9kZXB0aChyeHEpLCBuX3NjYXRfcGt0KTsKIAogCXNjYXRfcmVxID0gaGlmX3NjYXR0ZXJfcmVxX2dldCh0YXJnZXQtPmRldi0+YXIpOwogCkBAIC0xNjIwLDcgKzE5MDEsNyBAQAogCXNjYXRfcmVxLT5sZW4gPSBsZW47CiAJc2NhdF9yZXEtPnNjYXRfZW50cmllcyA9IGk7CiAKLQlzdGF0dXMgPSBhdGg2a2xkZXZfc3VibWl0X3NjYXRfcmVxKHRhcmdldC0+ZGV2LCBzY2F0X3JlcSwgdHJ1ZSk7CisJc3RhdHVzID0gYXRoNmtsX2hpZl9zdWJtaXRfc2NhdF9yZXEodGFyZ2V0LT5kZXYsIHNjYXRfcmVxLCB0cnVlKTsKIAogCWlmICghc3RhdHVzKQogCQkqbl9wa3RfZmV0Y2hlZCA9IGk7CkBAIC0xNjQzLDcgKzE5MjQsNiBAQAogCWludCBzdGF0dXMgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgdG1wX3BrdCwgY29tcF9wa3RxLCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOwogCQllcCA9ICZ0YXJnZXQtPmVuZHBvaW50W3BhY2tldC0+ZW5kcG9pbnRdOwogCiAJCS8qIHByb2Nlc3MgaGVhZGVyIGZvciBlYWNoIG9mIHRoZSByZWN2IHBhY2tldCAqLwpAQCAtMTY1Miw2ICsxOTMyLDggQEAKIAkJaWYgKHN0YXR1cykKIAkJCXJldHVybiBzdGF0dXM7CiAKKwkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdCk7CisKIAkJaWYgKGxpc3RfZW1wdHkoY29tcF9wa3RxKSkgewogCQkJLyoKIAkJCSAqIExhc3QgcGFja2V0J3MgbW9yZSBwYWNrZXQgZmxhZyBpcyBzZXQKQEAgLTE2ODYsMTEgKzE5NjgsMTUgQEAKIAlpbnQgZmV0Y2hlZF9wa3RzOwogCWJvb2wgcGFydF9idW5kbGUgPSBmYWxzZTsKIAlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcF9yeHE7CisJc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCwgKnRtcF9wa3Q7CiAKIAkvKiBub3cgZ28gZmV0Y2ggdGhlIGxpc3Qgb2YgSFRDIHBhY2tldHMgKi8KIAl3aGlsZSAoIWxpc3RfZW1wdHkocnhfcGt0cSkpIHsKIAkJZmV0Y2hlZF9wa3RzID0gMDsKIAorCQlJTklUX0xJU1RfSEVBRCgmdG1wX3J4cSk7CisKIAkJaWYgKHRhcmdldC0+cnhfYm5kbF9lbmFibGUgJiYgKGdldF9xdWV1ZV9kZXB0aChyeF9wa3RxKSA+IDEpKSB7CiAJCQkvKgogCQkJICogVGhlcmUgYXJlIGVub3VnaCBwYWNrZXRzIHRvIGF0dGVtcHQgYQpAQCAtMTY5OCwyOCArMTk4NCwyNyBAQAogCQkJICogYWxsb3dlZC4KIAkJCSAqLwogCQkJc3RhdHVzID0gYXRoNmtsX2h0Y19yeF9idW5kbGUodGFyZ2V0LCByeF9wa3RxLAotCQkJCQkJICAgICAgY29tcF9wa3RxLAorCQkJCQkJICAgICAgJnRtcF9yeHEsCiAJCQkJCQkgICAgICAmZmV0Y2hlZF9wa3RzLAogCQkJCQkJICAgICAgcGFydF9idW5kbGUpOwogCQkJaWYgKHN0YXR1cykKLQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCWdvdG8gZmFpbF9yeDsKIAogCQkJaWYgKCFsaXN0X2VtcHR5KHJ4X3BrdHEpKQogCQkJCXBhcnRfYnVuZGxlID0gdHJ1ZTsKKworCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ0bXBfcnhxLCBjb21wX3BrdHEpOwogCQl9CiAKIAkJaWYgKCFmZXRjaGVkX3BrdHMpIHsKLQkJCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQ7CiAKIAkJCXBhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkocnhfcGt0cSwgc3RydWN0IGh0Y19wYWNrZXQsCiAJCQkJCQkgICBsaXN0KTsKIAotCQkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdCk7Ci0KIAkJCS8qIGZ1bGx5IHN5bmNocm9ub3VzICovCiAJCQlwYWNrZXQtPmNvbXBsZXRpb24gPSBOVUxMOwogCi0JCQlpZiAoIWxpc3RfZW1wdHkocnhfcGt0cSkpCisJCQlpZiAoIWxpc3RfaXNfc2luZ3VsYXIocnhfcGt0cSkpCiAJCQkJLyoKIAkJCQkgKiBsb29rX2FoZWFkcyBpbiBhbGwgcGFja2V0CiAJCQkJICogZXhjZXB0IHRoZSBsYXN0IG9uZSBpbiB0aGUKQEAgLTE3MzEsMTggKzIwMTYsNDIgQEAKIAkJCS8qIGdvIGZldGNoIHRoZSBwYWNrZXQgKi8KIAkJCXN0YXR1cyA9IGF0aDZrbF9odGNfcnhfcGFja2V0KHRhcmdldCwgcGFja2V0LAogCQkJCQkJICAgICAgcGFja2V0LT5hY3RfbGVuKTsKLQkJCWlmIChzdGF0dXMpCi0JCQkJcmV0dXJuIHN0YXR1czsKIAotCQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCBjb21wX3BrdHEpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnBhY2tldC0+bGlzdCwgJnRtcF9yeHEpOworCisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gZmFpbF9yeDsKKworCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ0bXBfcnhxLCBjb21wX3BrdHEpOwogCQl9CiAJfQogCisJcmV0dXJuIDA7CisKK2ZhaWxfcng6CisKKwkvKgorCSAqIENsZWFudXAgYW55IHBhY2tldHMgd2UgYWxsb2NhdGVkIGJ1dCBkaWRuJ3QgdXNlIHRvCisJICogYWN0dWFsbHkgZmV0Y2ggYW55IHBhY2tldHMuCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0LCB0bXBfcGt0LCByeF9wa3RxLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOworCQlodGNfcmVjbGFpbV9yeGJ1Zih0YXJnZXQsIHBhY2tldCwKKwkJCQkmdGFyZ2V0LT5lbmRwb2ludFtwYWNrZXQtPmVuZHBvaW50XSk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgdG1wX3BrdCwgJnRtcF9yeHEsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdCk7CisJCWh0Y19yZWNsYWltX3J4YnVmKHRhcmdldCwgcGFja2V0LAorCQkJCSZ0YXJnZXQtPmVuZHBvaW50W3BhY2tldC0+ZW5kcG9pbnRdKTsKKwl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBpbnQgYXRoNmtsX2h0Y19yeG1zZ19wZW5kaW5nX2hhbmRsZXIoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCwKLQkJCQkgICAgIHUzMiBtc2dfbG9va19haGVhZFtdLCBpbnQgKm51bV9wa3RzKQorCQkJCSAgICAgdTMyIG1zZ19sb29rX2FoZWFkLCBpbnQgKm51bV9wa3RzKQogewogCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXRzLCAqdG1wX3BrdDsKIAlzdHJ1Y3QgaHRjX2VuZHBvaW50ICplbmRwb2ludDsKQEAgLTE3NTksNyArMjA2OCw3IEBACiAJICogT24gZmlyc3QgZW50cnkgY29weSB0aGUgbG9va19haGVhZHMgaW50byBvdXIgdGVtcCBhcnJheSBmb3IKIAkgKiBwcm9jZXNzaW5nCiAJICovCi0JbWVtY3B5KGxvb2tfYWhlYWRzLCBtc2dfbG9va19haGVhZCwgc2l6ZW9mKGxvb2tfYWhlYWRzKSk7CisJbG9va19haGVhZHNbMF0gPSBtc2dfbG9va19haGVhZDsKIAogCXdoaWxlICh0cnVlKSB7CiAKQEAgLTE4MjcsMTUgKzIxMzYsNiBAQAogCWlmIChzdGF0dXMpIHsKIAkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGdldCBwZW5kaW5nIHJlY3YgbWVzc2FnZXM6ICVkXG4iLAogCQkJICAgc3RhdHVzKTsKLQkJLyoKLQkJICogQ2xlYW51cCBhbnkgcGFja2V0cyB3ZSBhbGxvY2F0ZWQgYnV0IGRpZG4ndCB1c2UgdG8KLQkJICogYWN0dWFsbHkgZmV0Y2ggYW55IHBhY2tldHMuCi0JCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0cywgdG1wX3BrdCwgJnJ4X3BrdHEsIGxpc3QpIHsKLQkJCWxpc3RfZGVsKCZwYWNrZXRzLT5saXN0KTsKLQkJCWh0Y19yZWNsYWltX3J4YnVmKHRhcmdldCwgcGFja2V0cywKLQkJCQkJJnRhcmdldC0+ZW5kcG9pbnRbcGFja2V0cy0+ZW5kcG9pbnRdKTsKLQkJfQogCiAJCS8qIGNsZWFudXAgYW55IHBhY2tldHMgaW4gc3luYyBjb21wbGV0aW9uIHF1ZXVlICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXRzLCB0bXBfcGt0LCAmY29tcF9wa3RxLCBsaXN0KSB7CkBAIC0xODQ2LDcgKzIxNDYsNyBAQAogCiAJCWlmICh0YXJnZXQtPmh0Y19mbGFncyAmIEhUQ19PUF9TVEFURV9TVE9QUElORykgewogCQkJYXRoNmtsX3dhcm4oImhvc3QgaXMgZ29pbmcgdG8gc3RvcCBibG9ja2luZyByZWNlaXZlciBmb3IgaHRjX3N0b3BcbiIpOwotCQkJYXRoNmtsZGV2X3J4X2NvbnRyb2wodGFyZ2V0LT5kZXYsIGZhbHNlKTsKKwkJCWF0aDZrbF9oaWZfcnhfY29udHJvbCh0YXJnZXQtPmRldiwgZmFsc2UpOwogCQl9CiAJfQogCkBAIC0xODU2LDcgKzIxNTYsNyBAQAogCSAqLwogCWlmICh0YXJnZXQtPnJ4X3N0X2ZsYWdzICYgSFRDX1JFQ1ZfV0FJVF9CVUZGRVJTKSB7CiAJCWF0aDZrbF93YXJuKCJob3N0IGhhcyBubyByeCBidWZmZXJzIGJsb2NraW5nIHJlY2VpdmVyIHRvIHByZXZlbnQgb3ZlcnJ1blxuIik7Ci0JCWF0aDZrbGRldl9yeF9jb250cm9sKHRhcmdldC0+ZGV2LCBmYWxzZSk7CisJCWF0aDZrbF9oaWZfcnhfY29udHJvbCh0YXJnZXQtPmRldiwgZmFsc2UpOwogCX0KIAkqbnVtX3BrdHMgPSBuX2ZldGNoZWQ7CiAKQEAgLTE4NzQsMTIgKzIxNzQsMTIgQEAKIAlzdHJ1Y3QgaHRjX2ZyYW1lX2hkciAqaHRjX2hkcjsKIAl1MzIgbG9va19haGVhZDsKIAotCWlmIChhdGg2a2xkZXZfcG9sbF9tYm94bXNnX3J4KHRhcmdldC0+ZGV2LCAmbG9va19haGVhZCwKKwlpZiAoYXRoNmtsX2hpZl9wb2xsX21ib3htc2dfcngodGFyZ2V0LT5kZXYsICZsb29rX2FoZWFkLAogCQkJICAgICAgIEhUQ19UQVJHRVRfUkVTUE9OU0VfVElNRU9VVCkpCiAJCXJldHVybiBOVUxMOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19SRUNWLAotCQkiaHRjX3dhaXRfZm9yX2N0cmxfbXNnOiBsb29rX2FoZWFkIDogMHglWFxuIiwgbG9va19haGVhZCk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJImh0YyByeCB3YWl0IGN0cmwgbG9va19haGVhZCAweCVYXG4iLCBsb29rX2FoZWFkKTsKIAogCWh0Y19oZHIgPSAoc3RydWN0IGh0Y19mcmFtZV9oZHIgKikmbG9va19haGVhZDsKIApAQCAtMTk0Myw4ICsyMjQzLDggQEAKIAogCWRlcHRoID0gZ2V0X3F1ZXVlX2RlcHRoKHBrdF9xdWV1ZSk7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCSJodGNfYWRkX3J4YnVmX211bHRpcGxlOiBlcCBpZDogJWQsIGNudDolZCwgbGVuOiAlZFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkiaHRjIHJ4IGFkZCBtdWx0aXBsZSBlcCBpZCAlZCBjbnQgJWQgbGVuICVkXG4iLAogCQlmaXJzdF9wa3QtPmVuZHBvaW50LCBkZXB0aCwgZmlyc3RfcGt0LT5idWZfbGVuKTsKIAogCWVuZHBvaW50ID0gJnRhcmdldC0+ZW5kcG9pbnRbZmlyc3RfcGt0LT5lbmRwb2ludF07CkBAIC0xOTY5LDggKzIyNjksOCBAQAogCS8qIGNoZWNrIGlmIHdlIGFyZSBibG9ja2VkIHdhaXRpbmcgZm9yIGEgbmV3IGJ1ZmZlciAqLwogCWlmICh0YXJnZXQtPnJ4X3N0X2ZsYWdzICYgSFRDX1JFQ1ZfV0FJVF9CVUZGRVJTKSB7CiAJCWlmICh0YXJnZXQtPmVwX3dhaXRpbmcgPT0gZmlyc3RfcGt0LT5lbmRwb2ludCkgewotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19SRUNWLAotCQkJCSJyZWNlaXZlciB3YXMgYmxvY2tlZCBvbiBlcDolZCwgdW5ibG9ja2luZy5cbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSJodGMgcnggYmxvY2tlZCBvbiBlcCAlZCwgdW5ibG9ja2luZ1xuIiwKIAkJCQl0YXJnZXQtPmVwX3dhaXRpbmcpOwogCQkJdGFyZ2V0LT5yeF9zdF9mbGFncyAmPSB+SFRDX1JFQ1ZfV0FJVF9CVUZGRVJTOwogCQkJdGFyZ2V0LT5lcF93YWl0aW5nID0gRU5EUE9JTlRfTUFYOwpAQCAtMTk4Miw3ICsyMjgyLDcgQEAKIAogCWlmIChyeF91bmJsb2NrICYmICEodGFyZ2V0LT5odGNfZmxhZ3MgJiBIVENfT1BfU1RBVEVfU1RPUFBJTkcpKQogCQkvKiBUT0RPIDogaW1wbGVtZW50IGEgYnVmZmVyIHRocmVzaG9sZCBjb3VudD8gKi8KLQkJYXRoNmtsZGV2X3J4X2NvbnRyb2wodGFyZ2V0LT5kZXYsIHRydWUpOworCQlhdGg2a2xfaGlmX3J4X2NvbnRyb2wodGFyZ2V0LT5kZXYsIHRydWUpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTIwMDQsOCArMjMwNCw4IEBACiAJCQkJCSAmZW5kcG9pbnQtPnJ4X2J1ZnEsIGxpc3QpIHsKIAkJCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnRhcmdldC0+cnhfbG9jayk7Ci0JCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCQkJICAgImZsdXNoaW5nIHJ4IHBrdDoweCVwLCBsZW46JWQsIGVwOiVkXG4iLAorCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCQkgICAiaHRjIHJ4IGZsdXNoIHBrdCAweCVwICBsZW4gJWQgIGVwICVkXG4iLAogCQkJCSAgIHBhY2tldCwgcGFja2V0LT5idWZfbGVuLAogCQkJCSAgIHBhY2tldC0+ZW5kcG9pbnQpOwogCQkJZGV2X2tmcmVlX3NrYihwYWNrZXQtPnBrdF9jbnR4dCk7CkBAIC0yMDI4LDggKzIzMjgsOCBAQAogCXVuc2lnbmVkIGludCBtYXhfbXNnX3N6ID0gMDsKIAlpbnQgc3RhdHVzID0gMDsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsCi0JCSAgICJodGNfY29ubl9zZXJ2aWNlLCB0YXJnZXQ6MHglcCBzZXJ2aWNlIGlkOjB4JVhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJICAgImh0YyBjb25uZWN0IHNlcnZpY2UgdGFyZ2V0IDB4JXAgc2VydmljZSBpZCAweCV4XG4iLAogCQkgICB0YXJnZXQsIGNvbm5fcmVxLT5zdmNfaWQpOwogCiAJaWYgKGNvbm5fcmVxLT5zdmNfaWQgPT0gSFRDX0NUUkxfUlNWRF9TVkMpIHsKQEAgLTIxMTUsNyArMjQxNSw3IEBACiAJZW5kcG9pbnQtPmxlbl9tYXggPSBtYXhfbXNnX3N6OwogCWVuZHBvaW50LT5lcF9jYiA9IGNvbm5fcmVxLT5lcF9jYjsKIAllbmRwb2ludC0+Y3JlZF9kaXN0LnN2Y19pZCA9IGNvbm5fcmVxLT5zdmNfaWQ7Ci0JZW5kcG9pbnQtPmNyZWRfZGlzdC5odGNfcnN2ZCA9IGVuZHBvaW50OworCWVuZHBvaW50LT5jcmVkX2Rpc3QuaHRjX2VwID0gZW5kcG9pbnQ7CiAJZW5kcG9pbnQtPmNyZWRfZGlzdC5lbmRwb2ludCA9IGFzc2lnbmVkX2VwOwogCWVuZHBvaW50LT5jcmVkX2Rpc3QuY3JlZF9zeiA9IHRhcmdldC0+dGd0X2NyZWRfc3o7CiAKQEAgLTIxNzIsNiArMjQ3Miw3IEBACiAJfQogCiAJLyogcmVzZXQgZGlzdHJpYnV0aW9uIGxpc3QgKi8KKwkvKiBGSVhNRTogZnJlZSBleGlzdGluZyBlbnRyaWVzICovCiAJSU5JVF9MSVNUX0hFQUQoJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOwogfQogCkBAIC0yMjAxLDggKzI1MDIsOCBAQAogCXRhcmdldC0+bXNnX3Blcl9ibmRsX21heCA9IG1pbih0YXJnZXQtPm1heF9zY2F0X2VudHJpZXMsCiAJCQkJICAgICAgIHRhcmdldC0+bXNnX3Blcl9ibmRsX21heCk7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLAotCQkgICAiaHRjIGJ1bmRsaW5nIGFsbG93ZWQuIG1heCBtc2cgcGVyIGh0YyBidW5kbGU6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkgICAiaHRjIGJ1bmRsaW5nIGFsbG93ZWQgbXNnX3Blcl9ibmRsX21heCAlZFxuIiwKIAkJICAgdGFyZ2V0LT5tc2dfcGVyX2JuZGxfbWF4KTsKIAogCS8qIE1heCByeCBidW5kbGUgc2l6ZSBpcyBsaW1pdGVkIGJ5IHRoZSBtYXggdHggYnVuZGxlIHNpemUgKi8KQEAgLTIyMTEsNyArMjUxMiw3IEBACiAJdGFyZ2V0LT5tYXhfdHhfYm5kbF9zeiA9IG1pbihISUZfTUJPWDBfRVhUX1dJRFRILAogCQkJCSAgICAgdGFyZ2V0LT5tYXhfeGZlcl9zenBlcl9zY2F0cmVxKTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19BTlksICJtYXggcmVjdjogJWQgbWF4IHNlbmQ6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiaHRjIG1heF9yeF9ibmRsX3N6ICVkIG1heF90eF9ibmRsX3N6ICVkXG4iLAogCQkgICB0YXJnZXQtPm1heF9yeF9ibmRsX3N6LCB0YXJnZXQtPm1heF90eF9ibmRsX3N6KTsKIAogCWlmICh0YXJnZXQtPm1heF90eF9ibmRsX3N6KQpAQCAtMjI2NSw4ICsyNTY2LDggQEAKIAl0YXJnZXQtPnRndF9jcmVkcyA9IGxlMTZfdG9fY3B1KHJkeV9tc2ctPnZlcjJfMF9pbmZvLmNyZWRfY250KTsKIAl0YXJnZXQtPnRndF9jcmVkX3N6ID0gbGUxNl90b19jcHUocmR5X21zZy0+dmVyMl8wX2luZm8uY3JlZF9zeik7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCSAgICJ0YXJnZXQgcmVhZHk6IGNyZWRpdHM6ICVkIGNyZWRpdCBzaXplOiAlZFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwKKwkJICAgImh0YyB0YXJnZXQgcmVhZHkgY3JlZGl0cyAlZCBzaXplICVkXG4iLAogCQkgICB0YXJnZXQtPnRndF9jcmVkcywgdGFyZ2V0LT50Z3RfY3JlZF9zeik7CiAKIAkvKiBjaGVjayBpZiB0aGlzIGlzIGFuIGV4dGVuZGVkIHJlYWR5IG1lc3NhZ2UgKi8KQEAgLTIyODAsNyArMjU4MSw3IEBACiAJCXRhcmdldC0+bXNnX3Blcl9ibmRsX21heCA9IDA7CiAJfQogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgInVzaW5nIGh0YyBwcm90b2NvbCB2ZXJzaW9uIDogJXMgKCVkKVxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImh0YyB1c2luZyBwcm90b2NvbCAlcyAoJWQpXG4iLAogCQkgICh0YXJnZXQtPmh0Y190Z3RfdmVyID09IEhUQ19WRVJTSU9OXzJQMCkgPyAiMi4wIiA6ICI+PSAyLjEiLAogCQkgIHRhcmdldC0+aHRjX3RndF92ZXIpOwogCkBAIC0yMzAwLDYgKzI2MDEsMTAgQEAKIAlzdGF0dXMgPSBhdGg2a2xfaHRjX2Nvbm5fc2VydmljZSgodm9pZCAqKXRhcmdldCwgJmNvbm5lY3QsICZyZXNwKTsKIAogCWlmIChzdGF0dXMpCisJCS8qCisJCSAqIEZJWE1FOiB0aGlzIGNhbGwgZG9lc24ndCBtYWtlIHNlbnNlLCB0aGUgY2FsbGVyIHNob3VsZAorCQkgKiBjYWxsIGF0aDZrbF9odGNfY2xlYW51cCgpIHdoZW4gaXQgd2FudHMgcmVtb3ZlIGh0YworCQkgKi8KIAkJYXRoNmtsX2hpZl9jbGVhbnVwX3NjYXR0ZXIodGFyZ2V0LT5kZXYtPmFyKTsKIAogZmFpbF93YWl0X3RhcmdldDoKQEAgLTIzMjAsOCArMjYyNSwxMSBAQAogCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQ7CiAJaW50IHN0YXR1czsKIAorCW1lbXNldCgmdGFyZ2V0LT5kZXYtPmlycV9wcm9jX3JlZywgMCwKKwkgICAgICAgc2l6ZW9mKHRhcmdldC0+ZGV2LT5pcnFfcHJvY19yZWcpKTsKKwogCS8qIERpc2FibGUgaW50ZXJydXB0cyBhdCB0aGUgY2hpcCBsZXZlbCAqLwotCWF0aDZrbGRldl9kaXNhYmxlX2ludHJzKHRhcmdldC0+ZGV2KTsKKwlhdGg2a2xfaGlmX2Rpc2FibGVfaW50cnModGFyZ2V0LT5kZXYpOwogCiAJdGFyZ2V0LT5odGNfZmxhZ3MgPSAwOwogCXRhcmdldC0+cnhfc3RfZmxhZ3MgPSAwOwpAQCAtMjMzNCw4ICsyNjQyLDggQEAKIAl9CiAKIAkvKiBOT1RFOiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGRpc3RyaWJ1dGlvbiBsaXN0IGlzIEVORFBPSU5UXzAgKi8KLQlhdGg2a19jcmVkaXRfaW5pdCh0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCi0JCQkgIHRhcmdldC0+dGd0X2NyZWRzKTsKKwlhdGg2a2xfY3JlZGl0X2luaXQodGFyZ2V0LT5jcmVkaXRfaW5mbywgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCisJCQkgICB0YXJnZXQtPnRndF9jcmVkcyk7CiAKIAlkdW1wX2NyZWRfZGlzdF9zdGF0cyh0YXJnZXQpOwogCkBAIC0yMzQ2LDcgKzI2NTQsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCiAJLyogdW5tYXNrIGludGVycnVwdHMgKi8KLQlzdGF0dXMgPSBhdGg2a2xkZXZfdW5tYXNrX2ludHJzKHRhcmdldC0+ZGV2KTsKKwlzdGF0dXMgPSBhdGg2a2xfaGlmX3VubWFza19pbnRycyh0YXJnZXQtPmRldik7CiAKIAlpZiAoc3RhdHVzKQogCQlhdGg2a2xfaHRjX3N0b3AodGFyZ2V0KTsKQEAgLTIzNTQsNiArMjY2Miw0NCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgYXRoNmtsX2h0Y19yZXNldChzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0KQoreworCXUzMiBibG9ja19zaXplLCBjdHJsX2J1ZnN6OworCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQ7CisJaW50IGk7CisKKwlyZXNldF9lcF9zdGF0ZSh0YXJnZXQpOworCisJYmxvY2tfc2l6ZSA9IHRhcmdldC0+ZGV2LT5hci0+bWJveF9pbmZvLmJsb2NrX3NpemU7CisKKwljdHJsX2J1ZnN6ID0gKGJsb2NrX3NpemUgPiBIVENfTUFYX0NUUkxfTVNHX0xFTikgPworCQkgICAgICAoYmxvY2tfc2l6ZSArIEhUQ19IRFJfTEVOR1RIKSA6CisJCSAgICAgIChIVENfTUFYX0NUUkxfTVNHX0xFTiArIEhUQ19IRFJfTEVOR1RIKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09OVFJPTF9CVUZGRVJTOyBpKyspIHsKKwkJcGFja2V0ID0ga3phbGxvYyhzaXplb2YoKnBhY2tldCksIEdGUF9LRVJORUwpOworCQlpZiAoIXBhY2tldCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXBhY2tldC0+YnVmX3N0YXJ0ID0ga3phbGxvYyhjdHJsX2J1ZnN6LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwYWNrZXQtPmJ1Zl9zdGFydCkgeworCQkJa2ZyZWUocGFja2V0KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcGFja2V0LT5idWZfbGVuID0gY3RybF9idWZzejsKKwkJaWYgKGkgPCBOVU1fQ09OVFJPTF9SWF9CVUZGRVJTKSB7CisJCQlwYWNrZXQtPmFjdF9sZW4gPSAwOworCQkJcGFja2V0LT5idWYgPSBwYWNrZXQtPmJ1Zl9zdGFydDsKKwkJCXBhY2tldC0+ZW5kcG9pbnQgPSBFTkRQT0lOVF8wOworCQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCAmdGFyZ2V0LT5mcmVlX2N0cmxfcnhidWYpOworCQl9IGVsc2UKKwkJCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+bGlzdCwgJnRhcmdldC0+ZnJlZV9jdHJsX3R4YnVmKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyogaHRjX3N0b3A6IHN0b3AgaW50ZXJydXB0IHJlY2VwdGlvbiwgYW5kIGZsdXNoIGFsbCBxdWV1ZWQgYnVmZmVycyAqLwogdm9pZCBhdGg2a2xfaHRjX3N0b3Aoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCkKIHsKQEAgLTIzNjYsMjEgKzI3MTIsMTkgQEAKIAkgKiBmdW5jdGlvbiByZXR1cm5zIGFsbCBwZW5kaW5nIEhJRiBJL08gaGFzIGNvbXBsZXRlZCwgd2UgY2FuCiAJICogc2FmZWx5IGZsdXNoIHRoZSBxdWV1ZXMuCiAJICovCi0JYXRoNmtsZGV2X21hc2tfaW50cnModGFyZ2V0LT5kZXYpOworCWF0aDZrbF9oaWZfbWFza19pbnRycyh0YXJnZXQtPmRldik7CiAKIAlhdGg2a2xfaHRjX2ZsdXNoX3R4ZXBfYWxsKHRhcmdldCk7CiAKIAlhdGg2a2xfaHRjX2ZsdXNoX3J4X2J1Zih0YXJnZXQpOwogCi0JcmVzZXRfZXBfc3RhdGUodGFyZ2V0KTsKKwlhdGg2a2xfaHRjX3Jlc2V0KHRhcmdldCk7CiB9CiAKIHZvaWQgKmF0aDZrbF9odGNfY3JlYXRlKHN0cnVjdCBhdGg2a2wgKmFyKQogewogCXN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQgPSBOVUxMOwotCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQ7Ci0JaW50IHN0YXR1cyA9IDAsIGkgPSAwOwotCXUzMiBibG9ja19zaXplLCBjdHJsX2J1ZnN6OworCWludCBzdGF0dXMgPSAwOwogCiAJdGFyZ2V0ID0ga3phbGxvYyhzaXplb2YoKnRhcmdldCksIEdGUF9LRVJORUwpOwogCWlmICghdGFyZ2V0KSB7CkBAIC0yMzkyLDcgKzI3MzYsNyBAQAogCWlmICghdGFyZ2V0LT5kZXYpIHsKIAkJYXRoNmtsX2VycigidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CiAJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9jcmVhdGVfaHRjOworCQlnb3RvIGVycl9odGNfY2xlYW51cDsKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmdGFyZ2V0LT5odGNfbG9jayk7CkBAIC0yNDA3LDQ5ICsyNzUxLDIwIEBACiAJdGFyZ2V0LT5kZXYtPmh0Y19jbnh0ID0gdGFyZ2V0OwogCXRhcmdldC0+ZXBfd2FpdGluZyA9IEVORFBPSU5UX01BWDsKIAotCXJlc2V0X2VwX3N0YXRlKHRhcmdldCk7Ci0KLQlzdGF0dXMgPSBhdGg2a2xkZXZfc2V0dXAodGFyZ2V0LT5kZXYpOwotCisJc3RhdHVzID0gYXRoNmtsX2hpZl9zZXR1cCh0YXJnZXQtPmRldik7CiAJaWYgKHN0YXR1cykKLQkJZ290byBmYWlsX2NyZWF0ZV9odGM7CisJCWdvdG8gZXJyX2h0Y19jbGVhbnVwOwogCi0JYmxvY2tfc2l6ZSA9IGFyLT5tYm94X2luZm8uYmxvY2tfc2l6ZTsKLQotCWN0cmxfYnVmc3ogPSAoYmxvY2tfc2l6ZSA+IEhUQ19NQVhfQ1RSTF9NU0dfTEVOKSA/Ci0JCSAgICAgIChibG9ja19zaXplICsgSFRDX0hEUl9MRU5HVEgpIDoKLQkJICAgICAgKEhUQ19NQVhfQ1RSTF9NU0dfTEVOICsgSFRDX0hEUl9MRU5HVEgpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9DT05UUk9MX0JVRkZFUlM7IGkrKykgewotCQlwYWNrZXQgPSBremFsbG9jKHNpemVvZigqcGFja2V0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFja2V0KQotCQkJYnJlYWs7Ci0KLQkJcGFja2V0LT5idWZfc3RhcnQgPSBremFsbG9jKGN0cmxfYnVmc3osIEdGUF9LRVJORUwpOwotCQlpZiAoIXBhY2tldC0+YnVmX3N0YXJ0KSB7Ci0JCQlrZnJlZShwYWNrZXQpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwYWNrZXQtPmJ1Zl9sZW4gPSBjdHJsX2J1ZnN6OwotCQlpZiAoaSA8IE5VTV9DT05UUk9MX1JYX0JVRkZFUlMpIHsKLQkJCXBhY2tldC0+YWN0X2xlbiA9IDA7Ci0JCQlwYWNrZXQtPmJ1ZiA9IHBhY2tldC0+YnVmX3N0YXJ0OwotCQkJcGFja2V0LT5lbmRwb2ludCA9IEVORFBPSU5UXzA7Ci0JCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3QsICZ0YXJnZXQtPmZyZWVfY3RybF9yeGJ1Zik7Ci0JCX0gZWxzZQotCQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCAmdGFyZ2V0LT5mcmVlX2N0cmxfdHhidWYpOwotCX0KLQotZmFpbF9jcmVhdGVfaHRjOgotCWlmIChpICE9IE5VTV9DT05UUk9MX0JVRkZFUlMgfHwgc3RhdHVzKSB7Ci0JCWlmICh0YXJnZXQpIHsKLQkJCWF0aDZrbF9odGNfY2xlYW51cCh0YXJnZXQpOwotCQkJdGFyZ2V0ID0gTlVMTDsKLQkJfQotCX0KKwlzdGF0dXMgPSBhdGg2a2xfaHRjX3Jlc2V0KHRhcmdldCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnJfaHRjX2NsZWFudXA7CiAKIAlyZXR1cm4gdGFyZ2V0OworCitlcnJfaHRjX2NsZWFudXA6CisJYXRoNmtsX2h0Y19jbGVhbnVwKHRhcmdldCk7CisKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyogY2xlYW51cCB0aGUgSFRDIGluc3RhbmNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Yy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGMuaAppbmRleCA4Y2UwYzJjLi41NzY3MmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Yy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjLmgKQEAgLTM5Myw3ICszOTMsNyBAQAogCWludCBjcmVkX3Blcl9tc2c7CiAKIAkvKiByZXNlcnZlZCBmb3IgSFRDIHVzZSAqLwotCXZvaWQgKmh0Y19yc3ZkOworCXN0cnVjdCBodGNfZW5kcG9pbnQgKmh0Y19lcDsKIAogCS8qCiAJICogY3VycmVudCBkZXB0aCBvZiBUWCBxdWV1ZSAsIGkuZS4gbWVzc2FnZXMgd2FpdGluZyBmb3IgY3JlZGl0cwpAQCAtNDE0LDkgKzQxNCwxMSBAQAogCUhUQ19DUkVESVRfRElTVF9TRUVLX0NSRURJVFMsCiB9OwogCi1zdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvIHsKK3N0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvIHsKIAlpbnQgdG90YWxfYXZhaWxfY3JlZGl0czsKIAlpbnQgY3VyX2ZyZWVfY3JlZGl0czsKKworCS8qIGxpc3Qgb2YgbG93ZXN0IHByaW9yaXR5IGVuZHBvaW50cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbG93ZXN0cHJpX2VwX2Rpc3Q7CiB9OwogCkBAIC01MDgsMTAgKzUxMCwxMyBAQAogLyogb3VyIEhUQyB0YXJnZXQgc3RhdGUgKi8KIHN0cnVjdCBodGNfdGFyZ2V0IHsKIAlzdHJ1Y3QgaHRjX2VuZHBvaW50IGVuZHBvaW50W0VORFBPSU5UX01BWF07CisKKwkvKiBjb250YWlucyBzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBjcmVkX2Rpc3RfbGlzdDsKKwogCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9jdHJsX3R4YnVmOwogCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9jdHJsX3J4YnVmOwotCXN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmNyZWRfZGlzdF9jbnR4dDsKKwlzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyAqY3JlZGl0X2luZm87CiAJaW50IHRndF9jcmVkczsKIAl1bnNpZ25lZCBpbnQgdGd0X2NyZWRfc3o7CiAJc3BpbmxvY2tfdCBodGNfbG9jazsKQEAgLTU0Miw3ICs1NDcsNyBAQAogCiB2b2lkICphdGg2a2xfaHRjX2NyZWF0ZShzdHJ1Y3QgYXRoNmtsICphcik7CiB2b2lkIGF0aDZrbF9odGNfc2V0X2NyZWRpdF9kaXN0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsCi0JCQkJc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAorCQkJCXN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvICpjcmVkX2luZm8sCiAJCQkJdTE2IHN2Y19wcmlfb3JkZXJbXSwgaW50IGxlbik7CiBpbnQgYXRoNmtsX2h0Y193YWl0X3RhcmdldChzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0KTsKIGludCBhdGg2a2xfaHRjX3N0YXJ0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpOwpAQCAtNTYzLDcgKzU2OCwxMCBAQAogaW50IGF0aDZrbF9odGNfYWRkX3J4YnVmX211bHRpcGxlKHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsCiAJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpwa3RxKTsKIGludCBhdGg2a2xfaHRjX3J4bXNnX3BlbmRpbmdfaGFuZGxlcihzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0LAotCQkJCSAgICAgdTMyIG1zZ19sb29rX2FoZWFkW10sIGludCAqbl9wa3RzKTsKKwkJCQkgICAgIHUzMiBtc2dfbG9va19haGVhZCwgaW50ICpuX3BrdHMpOworCitpbnQgYXRoNmtsX2NyZWRpdF9zZXR1cCh2b2lkICpodGNfaGFuZGxlLAorCQkJc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaHRjX3BrdF9pbmZvKHN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQsIHZvaWQgKmNvbnRleHQsCiAJCQkJICAgIHU4ICpidWYsIHVuc2lnbmVkIGludCBsZW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Y19oaWYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX2hpZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmIxY2M3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX2hpZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiY29yZS5oIgotI2luY2x1ZGUgInRhcmdldC5oIgotI2luY2x1ZGUgImhpZi1vcHMuaCIKLSNpbmNsdWRlICJodGNfaGlmLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLQotI2RlZmluZSBNQUlMQk9YX0ZPUl9CTE9DS19TSVpFICAgICAgICAgIDEKLQotI2RlZmluZSBBVEg2S0xfVElNRV9RVUFOVFVNCTEwICAvKiBpbiBtcyAqLwotCi1zdGF0aWMgaW50IGF0aDZrbGRldl9jcF9zY2F0X2RtYV9idWYoc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqcmVxLCBib29sIGZyb21fZG1hKQotewotCXU4ICpidWY7Ci0JaW50IGk7Ci0KLQlidWYgPSByZXEtPnZpcnRfZG1hX2J1ZjsKLQotCWZvciAoaSA9IDA7IGkgPCByZXEtPnNjYXRfZW50cmllczsgaSsrKSB7Ci0KLQkJaWYgKGZyb21fZG1hKQotCQkJbWVtY3B5KHJlcS0+c2NhdF9saXN0W2ldLmJ1ZiwgYnVmLAotCQkJICAgICAgIHJlcS0+c2NhdF9saXN0W2ldLmxlbik7Ci0JCWVsc2UKLQkJCW1lbWNweShidWYsIHJlcS0+c2NhdF9saXN0W2ldLmJ1ZiwKLQkJCSAgICAgICByZXEtPnNjYXRfbGlzdFtpXS5sZW4pOwotCi0JCWJ1ZiArPSByZXEtPnNjYXRfbGlzdFtpXS5sZW47Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBhdGg2a2xkZXZfcndfY29tcF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpCi17Ci0Jc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCA9IGNvbnRleHQ7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCSAgICJhdGg2a2xkZXZfcndfY29tcF9oYW5kbGVyIChwa3Q6MHglcCAsIHN0YXR1czogJWRcbiIsCi0JCSAgIHBhY2tldCwgc3RhdHVzKTsKLQotCXBhY2tldC0+c3RhdHVzID0gc3RhdHVzOwotCXBhY2tldC0+Y29tcGxldGlvbihwYWNrZXQtPmNvbnRleHQsIHBhY2tldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdGg2a2xkZXZfcHJvY19kYmdfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQotewotCXUzMiBkdW1teTsKLQlpbnQgc3RhdHVzOwotCi0JYXRoNmtsX2VycigidGFyZ2V0IGRlYnVnIGludGVycnVwdFxuIik7Ci0KLQlhdGg2a2xfdGFyZ2V0X2ZhaWx1cmUoZGV2LT5hcik7Ci0KLQkvKgotCSAqIHJlYWQgY291bnRlciB0byBjbGVhciB0aGUgaW50ZXJydXB0LCB0aGUgZGVidWcgZXJyb3IgaW50ZXJydXB0IGlzCi0JICogY291bnRlciAwLgotCSAqLwotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgQ09VTlRfREVDX0FERFJFU1MsCi0JCQkJICAgICAodTggKikmZHVtbXksIDQsIEhJRl9SRF9TWU5DX0JZVEVfSU5DKTsKLQlpZiAoc3RhdHVzKQotCQlXQVJOX09OKDEpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogbWFpbGJveCByZWN2IG1lc3NhZ2UgcG9sbGluZyAqLwotaW50IGF0aDZrbGRldl9wb2xsX21ib3htc2dfcngoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgdTMyICpsa19haGQsCi0JCQkgICAgICBpbnQgdGltZW91dCkKLXsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9wcm9jX3JlZ2lzdGVycyAqcmc7Ci0JaW50IHN0YXR1cyA9IDAsIGk7Ci0JdTggaHRjX21ib3ggPSAxIDw8IEhUQ19NQUlMQk9YOwotCi0JZm9yIChpID0gdGltZW91dCAvIEFUSDZLTF9USU1FX1FVQU5UVU07IGkgPiAwOyBpLS0pIHsKLQkJLyogdGhpcyBpcyB0aGUgc3RhbmRhcmQgSElGIHdheSwgbG9hZCB0aGUgcmVnIHRhYmxlICovCi0JCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSE9TVF9JTlRfU1RBVFVTX0FERFJFU1MsCi0JCQkJCSAgICAgKHU4ICopICZkZXYtPmlycV9wcm9jX3JlZywKLQkJCQkJICAgICBzaXplb2YoZGV2LT5pcnFfcHJvY19yZWcpLAotCQkJCQkgICAgIEhJRl9SRF9TWU5DX0JZVEVfSU5DKTsKLQotCQlpZiAoc3RhdHVzKSB7Ci0JCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gcmVhZCByZWcgdGFibGVcbiIpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCS8qIGNoZWNrIGZvciBNQk9YIGRhdGEgYW5kIHZhbGlkIGxvb2thaGVhZCAqLwotCQlpZiAoZGV2LT5pcnFfcHJvY19yZWcuaG9zdF9pbnRfc3RhdHVzICYgaHRjX21ib3gpIHsKLQkJCWlmIChkZXYtPmlycV9wcm9jX3JlZy5yeF9sa2FoZF92YWxpZCAmCi0JCQkgICAgaHRjX21ib3gpIHsKLQkJCQkvKgotCQkJCSAqIE1haWxib3ggaGFzIGEgbWVzc2FnZSBhbmQgdGhlIGxvb2sgYWhlYWQKLQkJCQkgKiBpcyB2YWxpZC4KLQkJCQkgKi8KLQkJCQlyZyA9ICZkZXYtPmlycV9wcm9jX3JlZzsKLQkJCQkqbGtfYWhkID0KLQkJCQkJbGUzMl90b19jcHUocmctPnJ4X2xrYWhkW0hUQ19NQUlMQk9YXSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBkZWxheSBhIGxpdHRsZSAgKi8KLQkJbWRlbGF5KEFUSDZLTF9USU1FX1FVQU5UVU0pOwotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsICJyZXRyeSBtYm94IHBvbGwgOiAlZFxuIiwgaSk7Ci0JfQotCi0JaWYgKGkgPT0gMCkgewotCQlhdGg2a2xfZXJyKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIHJlY3YgbWVzc2FnZVxuIik7Ci0JCXN0YXR1cyA9IC1FVElNRTsKLQkJLyogY2hlY2sgaWYgdGhlIHRhcmdldCBhc3NlcnRlZCAqLwotCQlpZiAoZGV2LT5pcnFfcHJvY19yZWcuY291bnRlcl9pbnRfc3RhdHVzICYKLQkJICAgIEFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLKQotCQkJLyoKLQkJCSAqIFRhcmdldCBmYWlsdXJlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgaW4gY2FzZSBvZgotCQkJICogYW4gYXNzZXJ0LgotCQkJICovCi0JCQlhdGg2a2xkZXZfcHJvY19kYmdfaW50cihkZXYpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBEaXNhYmxlIHBhY2tldCByZWNlcHRpb24gKHVzZWQgaW4gY2FzZSB0aGUgaG9zdCBydW5zIG91dCBvZiBidWZmZXJzKQotICogdXNpbmcgdGhlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXJzIHRocm91Z2ggdGhlIGhvc3QgSS9GCi0gKi8KLWludCBhdGg2a2xkZXZfcnhfY29udHJvbChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LCBib29sIGVuYWJsZV9yeCkKLXsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHJlZ3M7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQkvKiB0YWtlIHRoZSBsb2NrIHRvIHByb3RlY3QgaW50ZXJydXB0IGVuYWJsZSBzaGFkb3dzICovCi0Jc3Bpbl9sb2NrX2JoKCZkZXYtPmxvY2spOwotCi0JaWYgKGVuYWJsZV9yeCkKLQkJZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4gfD0KLQkJCVNNKElOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQSwgMHgwMSk7Ci0JZWxzZQotCQlkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbiAmPQotCQkgICAgflNNKElOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQSwgMHgwMSk7Ci0KLQltZW1jcHkoJnJlZ3MsICZkZXYtPmlycV9lbl9yZWcsIHNpemVvZihyZWdzKSk7Ci0KLQlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrKTsKLQotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKLQkJCQkgICAgICZyZWdzLmludF9zdGF0dXNfZW4sCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyksCi0JCQkJICAgICBISUZfV1JfU1lOQ19CWVRFX0lOQyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYXRoNmtsZGV2X3N1Ym1pdF9zY2F0X3JlcShzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqc2NhdF9yZXEsIGJvb2wgcmVhZCkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotCWlmIChyZWFkKSB7Ci0JCXNjYXRfcmVxLT5yZXEgPSBISUZfUkRfU1lOQ19CTE9DS19GSVg7Ci0JCXNjYXRfcmVxLT5hZGRyID0gZGV2LT5hci0+bWJveF9pbmZvLmh0Y19hZGRyOwotCX0gZWxzZSB7Ci0JCXNjYXRfcmVxLT5yZXEgPSBISUZfV1JfQVNZTkNfQkxPQ0tfSU5DOwotCi0JCXNjYXRfcmVxLT5hZGRyID0KLQkJCShzY2F0X3JlcS0+bGVuID4gSElGX01CT1hfV0lEVEgpID8KLQkJCWRldi0+YXItPm1ib3hfaW5mby5odGNfZXh0X2FkZHIgOgotCQkJZGV2LT5hci0+bWJveF9pbmZvLmh0Y19hZGRyOwotCX0KLQotCWF0aDZrbF9kYmcoKEFUSDZLTF9EQkdfSFRDX1JFQ1YgfCBBVEg2S0xfREJHX0hUQ19TRU5EKSwKLQkJICAgImF0aDZrbGRldl9zdWJtaXRfc2NhdF9yZXEsIGVudHJpZXM6ICVkLCB0b3RhbCBsZW46ICVkIG1ib3g6MHglWCAobW9kZTogJXMgOiAlcylcbiIsCi0JCSAgIHNjYXRfcmVxLT5zY2F0X2VudHJpZXMsIHNjYXRfcmVxLT5sZW4sCi0JCSAgIHNjYXRfcmVxLT5hZGRyLCAhcmVhZCA/ICJhc3luYyIgOiAic3luYyIsCi0JCSAgIChyZWFkKSA/ICJyZCIgOiAid3IiKTsKLQotCWlmICghcmVhZCAmJiBzY2F0X3JlcS0+dmlydF9zY2F0KSB7Ci0JCXN0YXR1cyA9IGF0aDZrbGRldl9jcF9zY2F0X2RtYV9idWYoc2NhdF9yZXEsIGZhbHNlKTsKLQkJaWYgKHN0YXR1cykgewotCQkJc2NhdF9yZXEtPnN0YXR1cyA9IHN0YXR1czsKLQkJCXNjYXRfcmVxLT5jb21wbGV0ZShkZXYtPmFyLT5odGNfdGFyZ2V0LCBzY2F0X3JlcSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXN0YXR1cyA9IGF0aDZrbF9oaWZfc2NhdF9yZXFfcncoZGV2LT5hciwgc2NhdF9yZXEpOwotCi0JaWYgKHJlYWQpIHsKLQkJLyogaW4gc3luYyBtb2RlLCB3ZSBjYW4gdG91Y2ggdGhlIHNjYXR0ZXIgcmVxdWVzdCAqLwotCQlzY2F0X3JlcS0+c3RhdHVzID0gc3RhdHVzOwotCQlpZiAoIXN0YXR1cyAmJiBzY2F0X3JlcS0+dmlydF9zY2F0KQotCQkJc2NhdF9yZXEtPnN0YXR1cyA9Ci0JCQkJYXRoNmtsZGV2X2NwX3NjYXRfZG1hX2J1ZihzY2F0X3JlcSwgdHJ1ZSk7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBhdGg2a2xkZXZfcHJvY19jb3VudGVyX2ludHIoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKLXsKLQl1OCBjb3VudGVyX2ludF9zdGF0dXM7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLCAiY291bnRlciBpbnRlcnJ1cHRcbiIpOwotCi0JY291bnRlcl9pbnRfc3RhdHVzID0gZGV2LT5pcnFfcHJvY19yZWcuY291bnRlcl9pbnRfc3RhdHVzICYKLQkJCSAgICAgZGV2LT5pcnFfZW5fcmVnLmNudHJfaW50X3N0YXR1c19lbjsKLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsCi0JCSJ2YWxpZCBpbnRlcnJ1cHQgc291cmNlKHMpIGluIENPVU5URVJfSU5UX1NUQVRVUzogMHgleFxuIiwKLQkJY291bnRlcl9pbnRfc3RhdHVzKTsKLQotCS8qCi0JICogTk9URTogb3RoZXIgbW9kdWxlcyBsaWtlIEdNQk9YIG1heSB1c2UgdGhlIGNvdW50ZXIgaW50ZXJydXB0IGZvcgotCSAqIGNyZWRpdCBmbG93IGNvbnRyb2wgb24gb3RoZXIgY291bnRlcnMsIHdlIG9ubHkgbmVlZCB0byBjaGVjayBmb3IKLQkgKiB0aGUgZGVidWcgYXNzZXJ0aW9uIGNvdW50ZXIgaW50ZXJydXB0LgotCSAqLwotCWlmIChjb3VudGVyX2ludF9zdGF0dXMgJiBBVEg2S0xfVEFSR0VUX0RFQlVHX0lOVFJfTUFTSykKLQkJcmV0dXJuIGF0aDZrbGRldl9wcm9jX2RiZ19pbnRyKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdGg2a2xkZXZfcHJvY19lcnJfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQotewotCWludCBzdGF0dXM7Ci0JdTggZXJyb3JfaW50X3N0YXR1czsKLQl1OCByZWdfYnVmWzRdOwotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgImVycm9yIGludGVycnVwdFxuIik7Ci0KLQllcnJvcl9pbnRfc3RhdHVzID0gZGV2LT5pcnFfcHJvY19yZWcuZXJyb3JfaW50X3N0YXR1cyAmIDB4MEY7Ci0JaWYgKCFlcnJvcl9pbnRfc3RhdHVzKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsCi0JCSAgICJ2YWxpZCBpbnRlcnJ1cHQgc291cmNlKHMpIGluIEVSUk9SX0lOVF9TVEFUVVM6IDB4JXhcbiIsCi0JCSAgIGVycm9yX2ludF9zdGF0dXMpOwotCi0JaWYgKE1TKEVSUk9SX0lOVF9TVEFUVVNfV0FLRVVQLCBlcnJvcl9pbnRfc3RhdHVzKSkKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgImVycm9yIDogd2FrZXVwXG4iKTsKLQotCWlmIChNUyhFUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPVywgZXJyb3JfaW50X3N0YXR1cykpCi0JCWF0aDZrbF9lcnIoInJ4IHVuZGVyZmxvd1xuIik7Ci0KLQlpZiAoTVMoRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPVywgZXJyb3JfaW50X3N0YXR1cykpCi0JCWF0aDZrbF9lcnIoInR4IG92ZXJmbG93XG4iKTsKLQotCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KLQlkZXYtPmlycV9wcm9jX3JlZy5lcnJvcl9pbnRfc3RhdHVzICY9IH5lcnJvcl9pbnRfc3RhdHVzOwotCi0JLyogc2V0IFcxQyB2YWx1ZSB0byBjbGVhciB0aGUgaW50ZXJydXB0LCB0aGlzIGhpdHMgdGhlIHJlZ2lzdGVyIGZpcnN0ICovCi0JcmVnX2J1ZlswXSA9IGVycm9yX2ludF9zdGF0dXM7Ci0JcmVnX2J1ZlsxXSA9IDA7Ci0JcmVnX2J1ZlsyXSA9IDA7Ci0JcmVnX2J1ZlszXSA9IDA7Ci0KLQlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIEVSUk9SX0lOVF9TVEFUVVNfQUREUkVTUywKLQkJCQkgICAgIHJlZ19idWYsIDQsIEhJRl9XUl9TWU5DX0JZVEVfRklYKTsKLQotCWlmIChzdGF0dXMpCi0JCVdBUk5fT04oMSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGF0aDZrbGRldl9wcm9jX2NwdV9pbnRyKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCi17Ci0JaW50IHN0YXR1czsKLQl1OCBjcHVfaW50X3N0YXR1czsKLQl1OCByZWdfYnVmWzRdOwotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgImNwdSBpbnRlcnJ1cHRcbiIpOwotCi0JY3B1X2ludF9zdGF0dXMgPSBkZXYtPmlycV9wcm9jX3JlZy5jcHVfaW50X3N0YXR1cyAmCi0JCQkgZGV2LT5pcnFfZW5fcmVnLmNwdV9pbnRfc3RhdHVzX2VuOwotCWlmICghY3B1X2ludF9zdGF0dXMpIHsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwKLQkJInZhbGlkIGludGVycnVwdCBzb3VyY2UocykgaW4gQ1BVX0lOVF9TVEFUVVM6IDB4JXhcbiIsCi0JCWNwdV9pbnRfc3RhdHVzKTsKLQotCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KLQlkZXYtPmlycV9wcm9jX3JlZy5jcHVfaW50X3N0YXR1cyAmPSB+Y3B1X2ludF9zdGF0dXM7Ci0KLQkvKgotCSAqIFNldCB1cCB0aGUgcmVnaXN0ZXIgdHJhbnNmZXIgYnVmZmVyIHRvIGhpdCB0aGUgcmVnaXN0ZXIgNCB0aW1lcyAsCi0JICogdGhpcyBpcyBkb25lIHRvIG1ha2UgdGhlIGFjY2VzcyA0LWJ5dGUgYWxpZ25lZCB0byBtaXRpZ2F0ZSBpc3N1ZXMKLQkgKiB3aXRoIGhvc3QgYnVzIGludGVyY29ubmVjdHMgdGhhdCByZXN0cmljdCBidXMgdHJhbnNmZXIgbGVuZ3RocyB0bwotCSAqIGJlIGEgbXVsdGlwbGUgb2YgNC1ieXRlcy4KLQkgKi8KLQotCS8qIHNldCBXMUMgdmFsdWUgdG8gY2xlYXIgdGhlIGludGVycnVwdCwgdGhpcyBoaXRzIHRoZSByZWdpc3RlciBmaXJzdCAqLwotCXJlZ19idWZbMF0gPSBjcHVfaW50X3N0YXR1czsKLQkvKiB0aGUgcmVtYWluaW5nIGFyZSBzZXQgdG8gemVybyB3aGljaCBoYXZlIG5vLWVmZmVjdCAgKi8KLQlyZWdfYnVmWzFdID0gMDsKLQlyZWdfYnVmWzJdID0gMDsKLQlyZWdfYnVmWzNdID0gMDsKLQotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgQ1BVX0lOVF9TVEFUVVNfQUREUkVTUywKLQkJCQkgICAgIHJlZ19idWYsIDQsIEhJRl9XUl9TWU5DX0JZVEVfRklYKTsKLQotCWlmIChzdGF0dXMpCi0JCVdBUk5fT04oMSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiBwcm9jZXNzIHBlbmRpbmcgaW50ZXJydXB0cyBzeW5jaHJvbm91c2x5ICovCi1zdGF0aWMgaW50IHByb2NfcGVuZGluZ19pcnFzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsIGJvb2wgKmRvbmUpCi17Ci0Jc3RydWN0IGF0aDZrbF9pcnFfcHJvY19yZWdpc3RlcnMgKnJnOwotCWludCBzdGF0dXMgPSAwOwotCXU4IGhvc3RfaW50X3N0YXR1cyA9IDA7Ci0JdTMyIGxrX2FoZCA9IDA7Ci0JdTggaHRjX21ib3ggPSAxIDw8IEhUQ19NQUlMQk9YOwotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgInByb2NfcGVuZGluZ19pcnFzOiAoZGV2OiAweCVwKVxuIiwgZGV2KTsKLQotCS8qCi0JICogTk9URTogSElGIGltcGxlbWVudGF0aW9uIGd1YXJhbnRlZXMgdGhhdCB0aGUgY29udGV4dCBvZiB0aGlzCi0JICogY2FsbCBhbGxvd3MgdXMgdG8gcGVyZm9ybSBTWU5DSFJPTk9VUyBJL08sIHRoYXQgaXMgd2UgY2FuIGJsb2NrLAotCSAqIHNsZWVwIG9yIGNhbGwgYW55IEFQSSB0aGF0IGNhbiBibG9jayBvciBzd2l0Y2ggdGhyZWFkL3Rhc2sKLQkgKiBjb250ZXh0cy4gVGhpcyBpcyBhIGZ1bGx5IHNjaGVkdWxhYmxlIGNvbnRleHQuCi0JICovCi0KLQkvKgotCSAqIFByb2Nlc3MgcGVuZGluZyBpbnRyIG9ubHkgd2hlbiBpbnRfc3RhdHVzX2VuIGlzIGNsZWFyLCBpdCBtYXkKLQkgKiByZXN1bHQgaW4gdW5uZWNlc3NhcnkgYnVzIHRyYW5zYWN0aW9uIG90aGVyd2lzZS4gVGFyZ2V0IG1heSBiZQotCSAqIHVucmVzcG9uc2l2ZSBhdCB0aGUgdGltZS4KLQkgKi8KLQlpZiAoZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4pIHsKLQkJLyoKLQkJICogUmVhZCB0aGUgZmlyc3QgMjggYnl0ZXMgb2YgdGhlIEhUQyByZWdpc3RlciB0YWJsZS4gVGhpcwotCQkgKiB3aWxsIHlpZWxkIHVzIHRoZSB2YWx1ZSBvZiBkaWZmZXJlbnQgaW50IHN0YXR1cwotCQkgKiByZWdpc3RlcnMgYW5kIHRoZSBsb29rYWhlYWQgcmVnaXN0ZXJzLgotCQkgKgotCQkgKiAgICBsZW5ndGggPSBzaXplb2YoaW50X3N0YXR1cykgKyBzaXplb2YoY3B1X2ludF9zdGF0dXMpCi0JCSAqICAgICAgICAgICAgICsgc2l6ZW9mKGVycm9yX2ludF9zdGF0dXMpICsKLQkJICogICAgICAgICAgICAgc2l6ZW9mKGNvdW50ZXJfaW50X3N0YXR1cykgKwotCQkgKiAgICAgICAgICAgICBzaXplb2YobWJveF9mcmFtZSkgKyBzaXplb2YocnhfbGthaGRfdmFsaWQpCi0JCSAqICAgICAgICAgICAgICsgc2l6ZW9mKGhvbGUpICsgc2l6ZW9mKHJ4X2xrYWhkKSArCi0JCSAqICAgICAgICAgICAgIHNpemVvZihpbnRfc3RhdHVzX2VuKSArCi0JCSAqICAgICAgICAgICAgIHNpemVvZihjcHVfaW50X3N0YXR1c19lbikgKwotCQkgKiAgICAgICAgICAgICBzaXplb2YoZXJyX2ludF9zdGF0dXNfZW4pICsKLQkJICogICAgICAgICAgICAgc2l6ZW9mKGNudHJfaW50X3N0YXR1c19lbik7Ci0JCSAqLwotCQlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIEhPU1RfSU5UX1NUQVRVU19BRERSRVNTLAotCQkJCQkgICAgICh1OCAqKSAmZGV2LT5pcnFfcHJvY19yZWcsCi0JCQkJCSAgICAgc2l6ZW9mKGRldi0+aXJxX3Byb2NfcmVnKSwKLQkJCQkJICAgICBISUZfUkRfU1lOQ19CWVRFX0lOQyk7Ci0JCWlmIChzdGF0dXMpCi0JCQlnb3RvIG91dDsKLQotCQlpZiAoQVJfREJHX0xWTF9DSEVDSyhBVEg2S0xfREJHX0lSUSkpCi0JCQlhdGg2a2xfZHVtcF9yZWdpc3RlcnMoZGV2LCAmZGV2LT5pcnFfcHJvY19yZWcsCi0JCQkJCSAmZGV2LT5pcnFfZW5fcmVnKTsKLQotCQkvKiBVcGRhdGUgb25seSB0aG9zZSByZWdpc3RlcnMgdGhhdCBhcmUgZW5hYmxlZCAqLwotCQlob3N0X2ludF9zdGF0dXMgPSBkZXYtPmlycV9wcm9jX3JlZy5ob3N0X2ludF9zdGF0dXMgJgotCQkJCSAgZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW47Ci0KLQkJLyogTG9vayBhdCBtYm94IHN0YXR1cyAqLwotCQlpZiAoaG9zdF9pbnRfc3RhdHVzICYgaHRjX21ib3gpIHsKLQkJCS8qCi0JCQkgKiBNYXNrIG91dCBwZW5kaW5nIG1ib3ggdmFsdWUsIHdlIHVzZSAibG9va0FoZWFkIGFzCi0JCQkgKiB0aGUgcmVhbCBmbGFnIGZvciBtYm94IHByb2Nlc3NpbmcuCi0JCQkgKi8KLQkJCWhvc3RfaW50X3N0YXR1cyAmPSB+aHRjX21ib3g7Ci0JCQlpZiAoZGV2LT5pcnFfcHJvY19yZWcucnhfbGthaGRfdmFsaWQgJgotCQkJICAgIGh0Y19tYm94KSB7Ci0JCQkJcmcgPSAmZGV2LT5pcnFfcHJvY19yZWc7Ci0JCQkJbGtfYWhkID0gbGUzMl90b19jcHUocmctPnJ4X2xrYWhkW0hUQ19NQUlMQk9YXSk7Ci0JCQkJaWYgKCFsa19haGQpCi0JCQkJCWF0aDZrbF9lcnIoImxvb2tBaGVhZCBpcyB6ZXJvIVxuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIWhvc3RfaW50X3N0YXR1cyAmJiAhbGtfYWhkKSB7Ci0JCSpkb25lID0gdHJ1ZTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGxrX2FoZCkgewotCQlpbnQgZmV0Y2hlZCA9IDA7Ci0KLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwKLQkJCSAgICJwZW5kaW5nIG1haWxib3ggbXNnLCBsa19haGQ6IDB4JVhcbiIsIGxrX2FoZCk7Ci0JCS8qCi0JCSAqIE1haWxib3ggSW50ZXJydXB0LCB0aGUgSFRDIGxheWVyIG1heSBpc3N1ZSBhc3luYwotCQkgKiByZXF1ZXN0cyB0byBlbXB0eSB0aGUgbWFpbGJveC4gV2hlbiBlbXB0eWluZyB0aGUgcmVjdgotCQkgKiBtYWlsYm94IHdlIHVzZSB0aGUgYXN5bmMgaGFuZGxlciBhYm92ZSBjYWxsZWQgZnJvbSB0aGUKLQkJICogY29tcGxldGlvbiByb3V0aW5lIG9mIHRoZSBjYWxsZXJzIHJlYWQgcmVxdWVzdC4gVGhpcyBjYW4KLQkJICogaW1wcm92ZSBwZXJmb3JtYW5jZSBieSByZWR1Y2luZyBjb250ZXh0IHN3aXRjaGluZyB3aGVuCi0JCSAqIHdlIHJhcGlkbHkgcHVsbCBwYWNrZXRzLgotCQkgKi8KLQkJc3RhdHVzID0gYXRoNmtsX2h0Y19yeG1zZ19wZW5kaW5nX2hhbmRsZXIoZGV2LT5odGNfY254dCwKLQkJCQkJCQkgICZsa19haGQsICZmZXRjaGVkKTsKLQkJaWYgKHN0YXR1cykKLQkJCWdvdG8gb3V0OwotCi0JCWlmICghZmV0Y2hlZCkKLQkJCS8qCi0JCQkgKiBIVEMgY291bGQgbm90IHB1bGwgYW55IG1lc3NhZ2VzIG91dCBkdWUgdG8gbGFjawotCQkJICogb2YgcmVzb3VyY2VzLgotCQkJICovCi0JCQlkZXYtPmh0Y19jbnh0LT5jaGtfaXJxX3N0YXR1c19jbnQgPSAwOwotCX0KLQotCS8qIG5vdyBoYW5kbGUgdGhlIHJlc3Qgb2YgdGhlbSAqLwotCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsCi0JCSAgICJ2YWxpZCBpbnRlcnJ1cHQgc291cmNlKHMpIGZvciBvdGhlciBpbnRlcnJ1cHRzOiAweCV4XG4iLAotCQkgICBob3N0X2ludF9zdGF0dXMpOwotCi0JaWYgKE1TKEhPU1RfSU5UX1NUQVRVU19DUFUsIGhvc3RfaW50X3N0YXR1cykpIHsKLQkJLyogQ1BVIEludGVycnVwdCAqLwotCQlzdGF0dXMgPSBhdGg2a2xkZXZfcHJvY19jcHVfaW50cihkZXYpOwotCQlpZiAoc3RhdHVzKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKE1TKEhPU1RfSU5UX1NUQVRVU19FUlJPUiwgaG9zdF9pbnRfc3RhdHVzKSkgewotCQkvKiBFcnJvciBJbnRlcnJ1cHQgKi8KLQkJc3RhdHVzID0gYXRoNmtsZGV2X3Byb2NfZXJyX2ludHIoZGV2KTsKLQkJaWYgKHN0YXR1cykKLQkJCWdvdG8gb3V0OwotCX0KLQotCWlmIChNUyhIT1NUX0lOVF9TVEFUVVNfQ09VTlRFUiwgaG9zdF9pbnRfc3RhdHVzKSkKLQkJLyogQ291bnRlciBJbnRlcnJ1cHQgKi8KLQkJc3RhdHVzID0gYXRoNmtsZGV2X3Byb2NfY291bnRlcl9pbnRyKGRldik7Ci0KLW91dDoKLQkvKgotCSAqIEFuIG9wdGltaXphdGlvbiB0byBieXBhc3MgcmVhZGluZyB0aGUgSVJRIHN0YXR1cyByZWdpc3RlcnMKLQkgKiB1bmVjZXNzYXJpbHkgd2hpY2ggY2FuIHJlLXdha2UgdGhlIHRhcmdldCwgaWYgdXBwZXIgbGF5ZXJzCi0JICogZGV0ZXJtaW5lIHRoYXQgd2UgYXJlIGluIGEgbG93LXRocm91Z2hwdXQgbW9kZSwgd2UgY2FuIHJlbHkgb24KLQkgKiB0YWtpbmcgYW5vdGhlciBpbnRlcnJ1cHQgcmF0aGVyIHRoYW4gcmUtY2hlY2tpbmcgdGhlIHN0YXR1cwotCSAqIHJlZ2lzdGVycyB3aGljaCBjYW4gcmUtd2FrZSB0aGUgdGFyZ2V0LgotCSAqCi0JICogTk9URSA6IGZvciBob3N0IGludGVyZmFjZXMgdGhhdCBtYWtlcyB1c2Ugb2YgZGV0ZWN0aW5nIHBlbmRpbmcKLQkgKiBtYm94IG1lc3NhZ2VzIGF0IGhpZiBjYW4gbm90IHVzZSB0aGlzIG9wdGltaXphdGlvbiBkdWUgdG8KLQkgKiBwb3NzaWJsZSBzaWRlIGVmZmVjdHMsIFNQSSByZXF1aXJlcyB0aGUgaG9zdCB0byBkcmFpbiBhbGwKLQkgKiBtZXNzYWdlcyBmcm9tIHRoZSBtYWlsYm94IGJlZm9yZSBleGl0aW5nIHRoZSBJU1Igcm91dGluZS4KLQkgKi8KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsCi0JCSAgICJieXBhc3NpbmcgaXJxIHN0YXR1cyByZS1jaGVjaywgZm9yY2luZyBkb25lXG4iKTsKLQotCWlmICghZGV2LT5odGNfY254dC0+Y2hrX2lycV9zdGF0dXNfY250KQotCQkqZG9uZSA9IHRydWU7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAotCQkgICAicHJvY19wZW5kaW5nX2lycXM6IChkb25lOiVkLCBzdGF0dXM9JWRcbiIsICpkb25lLCBzdGF0dXMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogaW50ZXJydXB0IGhhbmRsZXIsIGtpY2tzIG9mZiBhbGwgaW50ZXJydXB0IHByb2Nlc3NpbmcgKi8KLWludCBhdGg2a2xkZXZfaW50cl9iaF9oYW5kbGVyKHN0cnVjdCBhdGg2a2wgKmFyKQotewotCXN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYgPSBhci0+aHRjX3RhcmdldC0+ZGV2OwotCWludCBzdGF0dXMgPSAwOwotCWJvb2wgZG9uZSA9IGZhbHNlOwotCi0JLyoKLQkgKiBSZXNldCBjb3VudGVyIHVzZWQgdG8gZmxhZyBhIHJlLXNjYW4gb2YgSVJRIHN0YXR1cyByZWdpc3RlcnMgb24KLQkgKiB0aGUgdGFyZ2V0LgotCSAqLwotCWRldi0+aHRjX2NueHQtPmNoa19pcnFfc3RhdHVzX2NudCA9IDA7Ci0KLQkvKgotCSAqIElSUSBwcm9jZXNzaW5nIGlzIHN5bmNocm9ub3VzLCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycyBjYW4gYmUKLQkgKiByZS1yZWFkLgotCSAqLwotCXdoaWxlICghZG9uZSkgewotCQlzdGF0dXMgPSBwcm9jX3BlbmRpbmdfaXJxcyhkZXYsICZkb25lKTsKLQkJaWYgKHN0YXR1cykKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgYXRoNmtsZGV2X2VuYWJsZV9pbnRycyhzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBhdGg2a2xfaXJxX2VuYWJsZV9yZWcgcmVnczsKLQlpbnQgc3RhdHVzOwotCi0Jc3Bpbl9sb2NrX2JoKCZkZXYtPmxvY2spOwotCi0JLyogRW5hYmxlIGFsbCBidXQgQVRINktMIENQVSBpbnRlcnJ1cHRzICovCi0JZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4gPQotCQkJU00oSU5UX1NUQVRVU19FTkFCTEVfRVJST1IsIDB4MDEpIHwKLQkJCVNNKElOVF9TVEFUVVNfRU5BQkxFX0NQVSwgMHgwMSkgfAotCQkJU00oSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUiwgMHgwMSk7Ci0KLQkvKgotCSAqIE5PVEU6IFRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIEhJRiBjYW4gZG8gZGV0ZWN0aW9uIG9mCi0JICogcGVuZGluZyBtYm94IG1lc3NhZ2VzIHdoaWNoIGlzIGRpc2FibGVkIG5vdy4KLQkgKi8KLQlkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbiB8PSBTTShJTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEEsIDB4MDEpOwotCi0JLyogU2V0IHVwIHRoZSBDUFUgSW50ZXJydXB0IHN0YXR1cyBSZWdpc3RlciAqLwotCWRldi0+aXJxX2VuX3JlZy5jcHVfaW50X3N0YXR1c19lbiA9IDA7Ci0KLQkvKiBTZXQgdXAgdGhlIEVycm9yIEludGVycnVwdCBzdGF0dXMgUmVnaXN0ZXIgKi8KLQlkZXYtPmlycV9lbl9yZWcuZXJyX2ludF9zdGF0dXNfZW4gPQotCQlTTShFUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPVywgMHgwMSkgfAotCQlTTShFUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XLCAweDEpOwotCi0JLyoKLQkgKiBFbmFibGUgQ291bnRlciBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHRvIGdldCBmYXRhbCBlcnJvcnMgZm9yCi0JICogZGVidWdnaW5nLgotCSAqLwotCWRldi0+aXJxX2VuX3JlZy5jbnRyX2ludF9zdGF0dXNfZW4gPSBTTShDT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVCwKLQkJCQkJCUFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLKTsKLQltZW1jcHkoJnJlZ3MsICZkZXYtPmlycV9lbl9yZWcsIHNpemVvZihyZWdzKSk7Ci0KLQlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrKTsKLQotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKLQkJCQkgICAgICZyZWdzLmludF9zdGF0dXNfZW4sIHNpemVvZihyZWdzKSwKLQkJCQkgICAgIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKLQotCWlmIChzdGF0dXMpCi0JCWF0aDZrbF9lcnIoImZhaWxlZCB0byB1cGRhdGUgaW50ZXJydXB0IGN0bCByZWcgZXJyOiAlZFxuIiwKLQkJCSAgIHN0YXR1cyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYXRoNmtsZGV2X2Rpc2FibGVfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHJlZ3M7Ci0KLQlzcGluX2xvY2tfYmgoJmRldi0+bG9jayk7Ci0JLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwotCWRldi0+aXJxX2VuX3JlZy5pbnRfc3RhdHVzX2VuID0gMDsKLQlkZXYtPmlycV9lbl9yZWcuY3B1X2ludF9zdGF0dXNfZW4gPSAwOwotCWRldi0+aXJxX2VuX3JlZy5lcnJfaW50X3N0YXR1c19lbiA9IDA7Ci0JZGV2LT5pcnFfZW5fcmVnLmNudHJfaW50X3N0YXR1c19lbiA9IDA7Ci0JbWVtY3B5KCZyZWdzLCAmZGV2LT5pcnFfZW5fcmVnLCBzaXplb2YocmVncykpOwotCXNwaW5fdW5sb2NrX2JoKCZkZXYtPmxvY2spOwotCi0JcmV0dXJuIGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKLQkJCQkgICAmcmVncy5pbnRfc3RhdHVzX2VuLCBzaXplb2YocmVncyksCi0JCQkJICAgSElGX1dSX1NZTkNfQllURV9JTkMpOwotfQotCi0vKiBlbmFibGUgZGV2aWNlIGludGVycnVwdHMgKi8KLWludCBhdGg2a2xkZXZfdW5tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBpbnRlcnJ1cHQgYXJlIGRpc2FibGVkIGJlZm9yZSB1bm1hc2tpbmcgYXQgdGhlIEhJRgotCSAqIGxheWVyLiBUaGUgcmF0aW9uYWxlIGhlcmUgaXMgdGhhdCBiZXR3ZWVuIGRldmljZSBpbnNlcnRpb24KLQkgKiAod2hlcmUgd2UgY2xlYXIgdGhlIGludGVycnVwdHMgdGhlIGZpcnN0IHRpbWUpIGFuZCB3aGVuIEhUQwotCSAqIGlzIGZpbmFsbHkgcmVhZHkgdG8gaGFuZGxlIGludGVycnVwdHMsIG90aGVyIHNvZnR3YXJlIGNhbiBwZXJmb3JtCi0JICogdGFyZ2V0ICJzb2Z0IiByZXNldHMuIFRoZSBBVEg2S0wgaW50ZXJydXB0IGVuYWJsZXMgcmVzZXQgYmFjayB0byBhbgotCSAqICJlbmFibGVkIiBzdGF0ZSB3aGVuIHRoaXMgaGFwcGVucy4KLQkgKi8KLQlhdGg2a2xkZXZfZGlzYWJsZV9pbnRycyhkZXYpOwotCi0JLyogdW5tYXNrIHRoZSBob3N0IGNvbnRyb2xsZXIgaW50ZXJydXB0cyAqLwotCWF0aDZrbF9oaWZfaXJxX2VuYWJsZShkZXYtPmFyKTsKLQlzdGF0dXMgPSBhdGg2a2xkZXZfZW5hYmxlX2ludHJzKGRldik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiBkaXNhYmxlIGFsbCBkZXZpY2UgaW50ZXJydXB0cyAqLwotaW50IGF0aDZrbGRldl9tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCi17Ci0JLyoKLQkgKiBNYXNrIHRoZSBpbnRlcnJ1cHQgYXQgdGhlIEhJRiBsYXllciB0byBhdm9pZCBhbnkgc3RyYXkgaW50ZXJydXB0Ci0JICogdGFrZW4gd2hpbGUgd2UgemVybyBvdXQgb3VyIHNoYWRvdyByZWdpc3RlcnMgaW4KLQkgKiBhdGg2a2xkZXZfZGlzYWJsZV9pbnRycygpLgotCSAqLwotCWF0aDZrbF9oaWZfaXJxX2Rpc2FibGUoZGV2LT5hcik7Ci0KLQlyZXR1cm4gYXRoNmtsZGV2X2Rpc2FibGVfaW50cnMoZGV2KTsKLX0KLQotaW50IGF0aDZrbGRldl9zZXR1cChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQotewotCWludCBzdGF0dXMgPSAwOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7Ci0KLQkvKgotCSAqIE5PVEU6IHdlIGFjdHVhbGx5IGdldCB0aGUgYmxvY2sgc2l6ZSBvZiBhIG1haWxib3ggb3RoZXIgdGhhbiAwLAotCSAqIGZvciBTRElPIHRoZSBibG9jayBzaXplIG9uIG1haWxib3ggMCBpcyBhcnRpZmljaWFsbHkgc2V0IHRvIDEuCi0JICogU28gd2UgdXNlIHRoZSBibG9jayBzaXplIHRoYXQgaXMgc2V0IGZvciB0aGUgb3RoZXIgMyBtYWlsYm94ZXMuCi0JICovCi0JZGV2LT5odGNfY254dC0+YmxvY2tfc3ogPSBkZXYtPmFyLT5tYm94X2luZm8uYmxvY2tfc2l6ZTsKLQotCS8qIG11c3QgYmUgYSBwb3dlciBvZiAyICovCi0JaWYgKChkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiAmIChkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiAtIDEpKSAhPSAwKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCWdvdG8gZmFpbF9zZXR1cDsKLQl9Ci0KLQkvKiBhc3NlbWJsZSBtYXNrLCB1c2VkIGZvciBwYWRkaW5nIHRvIGEgYmxvY2sgKi8KLQlkZXYtPmh0Y19jbnh0LT5ibG9ja19tYXNrID0gZGV2LT5odGNfY254dC0+YmxvY2tfc3ogLSAxOwotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgImJsb2NrIHNpemU6ICVkLCBtYm94IGFkZHI6MHglWFxuIiwKLQkJICAgZGV2LT5odGNfY254dC0+YmxvY2tfc3osIGRldi0+YXItPm1ib3hfaW5mby5odGNfYWRkcik7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLAotCQkgICAiaGlmIGludGVycnVwdCBwcm9jZXNzaW5nIGlzIHN5bmMgb25seVxuIik7Ci0KLQlzdGF0dXMgPSBhdGg2a2xkZXZfZGlzYWJsZV9pbnRycyhkZXYpOwotCi1mYWlsX3NldHVwOgotCXJldHVybiBzdGF0dXM7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX2hpZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGNfaGlmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MWFkNjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGNfaGlmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBIVENfSElGX0gKLSNkZWZpbmUgSFRDX0hJRl9ICi0KLSNpbmNsdWRlICJodGMuaCIKLSNpbmNsdWRlICJoaWYuaCIKLQotI2RlZmluZSBBVEg2S0xfTUFJTEJPWEVTCTQKLQotLyogSFRDIHJ1bnMgb3ZlciBtYWlsYm94IDAgKi8KLSNkZWZpbmUgSFRDX01BSUxCT1gJMAotCi0jZGVmaW5lIEFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLICAgICAweDAxCi0KLSNkZWZpbmUgT1RIRVJfSU5UU19FTkFCTEVECQkoSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSyB8CVwKLQkJCQkJSU5UX1NUQVRVU19FTkFCTEVfQ1BVX01BU0sgICB8CVwKLQkJCQkJSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLKQotCi0jZGVmaW5lIEFUSDZLTF9SRUdfSU9fQlVGRkVSX1NJWkUJCQkzMgotI2RlZmluZSBBVEg2S0xfTUFYX1JFR19JT19CVUZGRVJTCQkJOAotI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEgICAgICAgICAgICAxNgotI2RlZmluZSBBVEg2S0xfTUFYX1RSQU5TRkVSX1NJWkVfUEVSX1NDQVRURVIgICAgICAoMTYgKiAxMDI0KQotI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9SRVFTICAgICAgICAgICAgICAgICAgICAgICA0Ci0KLSNpZm5kZWYgQV9DQUNIRV9MSU5FX1BBRAotI2RlZmluZSBBX0NBQ0hFX0xJTkVfUEFEICAgICAgICAgICAgICAgICAgICAgICAgMTI4Ci0jZW5kaWYKLSNkZWZpbmUgQVRINktMX01JTl9TQ0FUVEVSX0VOVFJJRVNfUEVSX1JFUSAgICAgICAgMgotI2RlZmluZSBBVEg2S0xfTUlOX1RSQU5TRkVSX1NJWkVfUEVSX1NDQVRURVIgICAgICAoNCAqIDEwMjQpCi0KLXN0cnVjdCBhdGg2a2xfaXJxX3Byb2NfcmVnaXN0ZXJzIHsKLQl1OCBob3N0X2ludF9zdGF0dXM7Ci0JdTggY3B1X2ludF9zdGF0dXM7Ci0JdTggZXJyb3JfaW50X3N0YXR1czsKLQl1OCBjb3VudGVyX2ludF9zdGF0dXM7Ci0JdTggbWJveF9mcmFtZTsKLQl1OCByeF9sa2FoZF92YWxpZDsKLQl1OCBob3N0X2ludF9zdGF0dXMyOwotCXU4IGdtYm94X3J4X2F2YWlsOwotCV9fbGUzMiByeF9sa2FoZFsyXTsKLQlfX2xlMzIgcnhfZ21ib3hfbGthaGRfYWxpYXNbMl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHsKLQl1OCBpbnRfc3RhdHVzX2VuOwotCXU4IGNwdV9pbnRfc3RhdHVzX2VuOwotCXU4IGVycl9pbnRfc3RhdHVzX2VuOwotCXU4IGNudHJfaW50X3N0YXR1c19lbjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhdGg2a2xfZGV2aWNlIHsKLQlzcGlubG9ja190IGxvY2s7Ci0JdTggcGFkMVtBX0NBQ0hFX0xJTkVfUEFEXTsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9wcm9jX3JlZ2lzdGVycyBpcnFfcHJvY19yZWc7Ci0JdTggcGFkMltBX0NBQ0hFX0xJTkVfUEFEXTsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIGlycV9lbl9yZWc7Ci0JdTggcGFkM1tBX0NBQ0hFX0xJTkVfUEFEXTsKLQlzdHJ1Y3QgaHRjX3RhcmdldCAqaHRjX2NueHQ7Ci0Jc3RydWN0IGF0aDZrbCAqYXI7Ci19OwotCi1pbnQgYXRoNmtsZGV2X3NldHVwKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpOwotaW50IGF0aDZrbGRldl91bm1hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7Ci1pbnQgYXRoNmtsZGV2X21hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7Ci1pbnQgYXRoNmtsZGV2X3BvbGxfbWJveG1zZ19yeChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LAotCQkJICAgICAgdTMyICpsa19haGQsIGludCB0aW1lb3V0KTsKLWludCBhdGg2a2xkZXZfcnhfY29udHJvbChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LCBib29sIGVuYWJsZV9yeCk7Ci1pbnQgYXRoNmtsZGV2X2Rpc2FibGVfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7Ci0KLWludCBhdGg2a2xkZXZfcndfY29tcF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpOwotaW50IGF0aDZrbGRldl9pbnRyX2JoX2hhbmRsZXIoc3RydWN0IGF0aDZrbCAqYXIpOwotCi0vKiBTY2F0dGVyIEZ1bmN0aW9uIGFuZCBEZWZpbml0aW9ucyAqLwotaW50IGF0aDZrbGRldl9zdWJtaXRfc2NhdF9yZXEoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpzY2F0X3JlcSwgYm9vbCByZWFkKTsKLQotI2VuZGlmIC8qQVRINktMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaW5pdC5jCmluZGV4IGMxZDIzNjYuLjMwMDUwYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaW5pdC5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KICNpbmNsdWRlICJjb3JlLmgiCkBAIC0yNiw5ICsyNywxMSBAQAogCiB1bnNpZ25lZCBpbnQgZGVidWdfbWFzazsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdGVzdG1vZGU7CitzdGF0aWMgYm9vbCBzdXNwZW5kX2N1dHBvd2VyOwogCiBtb2R1bGVfcGFyYW0oZGVidWdfbWFzaywgdWludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0odGVzdG1vZGUsIHVpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKHN1c3BlbmRfY3V0cG93ZXIsIGJvb2wsIDA0NDQpOwogCiAvKgogICogSW5jbHVkZSBkZWZpbml0aW9ucyBoZXJlIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHVuZSB0aGUgV0xBTiBtb2R1bGUKQEAgLTczLDM3ICs3NiwyMSBAQAogCXJldHVybiBza2I7CiB9CiAKLXZvaWQgYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKHN0cnVjdCBhdGg2a2wgKmFyKQordm9pZCBhdGg2a2xfaW5pdF9wcm9maWxlX2luZm8oc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKLQlhci0+c3NpZF9sZW4gPSAwOwotCW1lbXNldChhci0+c3NpZCwgMCwgc2l6ZW9mKGFyLT5zc2lkKSk7CisJdmlmLT5zc2lkX2xlbiA9IDA7CisJbWVtc2V0KHZpZi0+c3NpZCwgMCwgc2l6ZW9mKHZpZi0+c3NpZCkpOwogCi0JYXItPmRvdDExX2F1dGhfbW9kZSA9IE9QRU5fQVVUSDsKLQlhci0+YXV0aF9tb2RlID0gTk9ORV9BVVRIOwotCWFyLT5wcndpc2VfY3J5cHRvID0gTk9ORV9DUllQVDsKLQlhci0+cHJ3aXNlX2NyeXB0b19sZW4gPSAwOwotCWFyLT5ncnBfY3J5cHRvID0gTk9ORV9DUllQVDsKLQlhci0+Z3JwX2NyeXB0b19sZW4gPSAwOwotCW1lbXNldChhci0+d2VwX2tleV9saXN0LCAwLCBzaXplb2YoYXItPndlcF9rZXlfbGlzdCkpOwotCW1lbXNldChhci0+cmVxX2Jzc2lkLCAwLCBzaXplb2YoYXItPnJlcV9ic3NpZCkpOwotCW1lbXNldChhci0+YnNzaWQsIDAsIHNpemVvZihhci0+YnNzaWQpKTsKLQlhci0+YnNzX2NoID0gMDsKLQlhci0+bndfdHlwZSA9IGFyLT5uZXh0X21vZGUgPSBJTkZSQV9ORVRXT1JLOwotfQotCi1zdGF0aWMgdTggYXRoNmtsX2dldF9md19pZnR5cGUoc3RydWN0IGF0aDZrbCAqYXIpCi17Ci0Jc3dpdGNoIChhci0+bndfdHlwZSkgewotCWNhc2UgSU5GUkFfTkVUV09SSzoKLQkJcmV0dXJuIEhJX09QVElPTl9GV19NT0RFX0JTU19TVEE7Ci0JY2FzZSBBREhPQ19ORVRXT1JLOgotCQlyZXR1cm4gSElfT1BUSU9OX0ZXX01PREVfSUJTUzsKLQljYXNlIEFQX05FVFdPUks6Ci0JCXJldHVybiBISV9PUFRJT05fRldfTU9ERV9BUDsKLQlkZWZhdWx0OgotCQlhdGg2a2xfZXJyKCJVbnN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZSA6JWRcbiIsIGFyLT5ud190eXBlKTsKLQkJcmV0dXJuIDB4ZmY7Ci0JfQorCXZpZi0+ZG90MTFfYXV0aF9tb2RlID0gT1BFTl9BVVRIOworCXZpZi0+YXV0aF9tb2RlID0gTk9ORV9BVVRIOworCXZpZi0+cHJ3aXNlX2NyeXB0byA9IE5PTkVfQ1JZUFQ7CisJdmlmLT5wcndpc2VfY3J5cHRvX2xlbiA9IDA7CisJdmlmLT5ncnBfY3J5cHRvID0gTk9ORV9DUllQVDsKKwl2aWYtPmdycF9jcnlwdG9fbGVuID0gMDsKKwltZW1zZXQodmlmLT53ZXBfa2V5X2xpc3QsIDAsIHNpemVvZih2aWYtPndlcF9rZXlfbGlzdCkpOworCW1lbXNldCh2aWYtPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKHZpZi0+cmVxX2Jzc2lkKSk7CisJbWVtc2V0KHZpZi0+YnNzaWQsIDAsIHNpemVvZih2aWYtPmJzc2lkKSk7CisJdmlmLT5ic3NfY2ggPSAwOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF9zZXRfaG9zdF9hcHBfYXJlYShzdHJ1Y3QgYXRoNmtsICphcikKQEAgLTEyMCw3ICsxMDcsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWFkZHJlc3MgPSBUQVJHX1ZUT1AoYXItPnRhcmdldF90eXBlLCBkYXRhKTsKLQlob3N0X2FwcF9hcmVhLndtaV9wcm90b2NvbF92ZXIgPSBXTUlfUFJPVE9DT0xfVkVSU0lPTjsKKwlob3N0X2FwcF9hcmVhLndtaV9wcm90b2NvbF92ZXIgPSBjcHVfdG9fbGUzMihXTUlfUFJPVE9DT0xfVkVSU0lPTik7CiAJaWYgKGF0aDZrbF9kaWFnX3dyaXRlKGFyLCBhZGRyZXNzLCAodTggKikgJmhvc3RfYXBwX2FyZWEsCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IGhvc3RfYXBwX2FyZWEpKSkKIAkJcmV0dXJuIC1FSU87CkBAIC0yNTgsNDAgKzI0NSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhdGg2a2xfaW5pdF9jb250cm9sX2luZm8oc3RydWN0IGF0aDZrbCAqYXIpCit2b2lkIGF0aDZrbF9pbml0X2NvbnRyb2xfaW5mbyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewotCXU4IGN0cjsKLQotCWNsZWFyX2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQlhdGg2a2xfaW5pdF9wcm9maWxlX2luZm8oYXIpOwotCWFyLT5kZWZfdHhrZXlfaW5kZXggPSAwOwotCW1lbXNldChhci0+d2VwX2tleV9saXN0LCAwLCBzaXplb2YoYXItPndlcF9rZXlfbGlzdCkpOwotCWFyLT5jaF9oaW50ID0gMDsKLQlhci0+bGlzdGVuX2ludHZsX3QgPSBBX0RFRkFVTFRfTElTVEVOX0lOVEVSVkFMOwotCWFyLT5saXN0ZW5faW50dmxfYiA9IDA7Ci0JYXItPnR4X3B3ciA9IDA7Ci0JY2xlYXJfYml0KFNLSVBfU0NBTiwgJmFyLT5mbGFnKTsKLQlzZXRfYml0KFdNTV9FTkFCTEVELCAmYXItPmZsYWcpOwotCWFyLT5pbnRyYV9ic3MgPSAxOwotCW1lbXNldCgmYXItPnNjX3BhcmFtcywgMCwgc2l6ZW9mKGFyLT5zY19wYXJhbXMpKTsKLQlhci0+c2NfcGFyYW1zLnNob3J0X3NjYW5fcmF0aW8gPSBXTUlfU0hPUlRTQ0FOUkFUSU9fREVGQVVMVDsKLQlhci0+c2NfcGFyYW1zLnNjYW5fY3RybF9mbGFncyA9IERFRkFVTFRfU0NBTl9DVFJMX0ZMQUdTOwotCWFyLT5scnNzaV9yb2FtX3RocmVzaG9sZCA9IERFRl9MUlNTSV9ST0FNX1RIUkVTSE9MRDsKLQotCW1lbXNldCgodTggKilhci0+c3RhX2xpc3QsIDAsCi0JICAgICAgIEFQX01BWF9OVU1fU1RBICogc2l6ZW9mKHN0cnVjdCBhdGg2a2xfc3RhKSk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYXItPm1jYXN0cHNxX2xvY2spOwotCi0JLyogSW5pdCB0aGUgUFMgcXVldWVzICovCi0JZm9yIChjdHIgPSAwOyBjdHIgPCBBUF9NQVhfTlVNX1NUQTsgY3RyKyspIHsKLQkJc3Bpbl9sb2NrX2luaXQoJmFyLT5zdGFfbGlzdFtjdHJdLnBzcV9sb2NrKTsKLQkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXItPnN0YV9saXN0W2N0cl0ucHNxKTsKLQl9Ci0KLQlza2JfcXVldWVfaGVhZF9pbml0KCZhci0+bWNhc3Rwc3EpOwotCi0JbWVtY3B5KGFyLT5hcF9jb3VudHJ5X2NvZGUsIERFRl9BUF9DT1VOVFJZX0NPREUsIDMpOworCWF0aDZrbF9pbml0X3Byb2ZpbGVfaW5mbyh2aWYpOworCXZpZi0+ZGVmX3R4a2V5X2luZGV4ID0gMDsKKwltZW1zZXQodmlmLT53ZXBfa2V5X2xpc3QsIDAsIHNpemVvZih2aWYtPndlcF9rZXlfbGlzdCkpOworCXZpZi0+Y2hfaGludCA9IDA7CiB9CiAKIC8qCkBAIC0zNDEsNjIgKzMwMCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotI2RlZmluZSBSRUdfRFVNUF9DT1VOVF9BUjYwMDMgICA2MAotI2RlZmluZSBSRUdJU1RFUl9EVU1QX0xFTl9NQVggICA2MAotCi1zdGF0aWMgdm9pZCBhdGg2a2xfZHVtcF90YXJnZXRfYXNzZXJ0X2luZm8oc3RydWN0IGF0aDZrbCAqYXIpCi17Ci0JdTMyIGFkZHJlc3M7Ci0JdTMyIHJlZ2R1bXBfbG9jID0gMDsKLQlpbnQgc3RhdHVzOwotCXUzMiByZWdkdW1wX3ZhbFtSRUdJU1RFUl9EVU1QX0xFTl9NQVhdOwotCXUzMiBpOwotCi0JaWYgKGFyLT50YXJnZXRfdHlwZSAhPSBUQVJHRVRfVFlQRV9BUjYwMDMpCi0JCXJldHVybjsKLQotCS8qIHRoZSByZWcgZHVtcCBwb2ludGVyIGlzIGNvcGllZCB0byB0aGUgaG9zdCBpbnRlcmVzdCBhcmVhICovCi0JYWRkcmVzcyA9IGF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLCBISV9JVEVNKGhpX2ZhaWx1cmVfc3RhdGUpKTsKLQlhZGRyZXNzID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgYWRkcmVzcyk7Ci0KLQkvKiByZWFkIFJBTSBsb2NhdGlvbiB0aHJvdWdoIGRpYWdub3N0aWMgd2luZG93ICovCi0Jc3RhdHVzID0gYXRoNmtsX2RpYWdfcmVhZDMyKGFyLCBhZGRyZXNzLCAmcmVnZHVtcF9sb2MpOwotCi0JaWYgKHN0YXR1cyB8fCAhcmVnZHVtcF9sb2MpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGdldCBwdHIgdG8gcmVnaXN0ZXIgZHVtcCBhcmVhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICJsb2NhdGlvbiBvZiByZWdpc3RlciBkdW1wIGRhdGE6IDB4JVhcbiIsCi0JCXJlZ2R1bXBfbG9jKTsKLQlyZWdkdW1wX2xvYyA9IFRBUkdfVlRPUChhci0+dGFyZ2V0X3R5cGUsIHJlZ2R1bXBfbG9jKTsKLQotCS8qIGZldGNoIHJlZ2lzdGVyIGR1bXAgZGF0YSAqLwotCXN0YXR1cyA9IGF0aDZrbF9kaWFnX3JlYWQoYXIsIHJlZ2R1bXBfbG9jLCAodTggKikmcmVnZHVtcF92YWxbMF0sCi0JCQkJICBSRUdfRFVNUF9DT1VOVF9BUjYwMDMgKiAoc2l6ZW9mKHUzMikpKTsKLQotCWlmIChzdGF0dXMpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGdldCByZWdpc3RlciBkdW1wXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiUmVnaXN0ZXIgRHVtcDpcbiIpOwotCi0JZm9yIChpID0gMDsgaSA8IFJFR19EVU1QX0NPVU5UX0FSNjAwMzsgaSsrKQotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiICVkIDogIDB4JTguOFhcbiIsCi0JCQkgICBpLCByZWdkdW1wX3ZhbFtpXSk7Ci0KLX0KLQotdm9pZCBhdGg2a2xfdGFyZ2V0X2ZhaWx1cmUoc3RydWN0IGF0aDZrbCAqYXIpCi17Ci0JYXRoNmtsX2VycigidGFyZ2V0IGFzc2VydGVkXG4iKTsKLQotCS8qIHRyeSBkdW1waW5nIHRhcmdldCBhc3NlcnRpb24gaW5mb3JtYXRpb24gKGlmIGFueSkgKi8KLQlhdGg2a2xfZHVtcF90YXJnZXRfYXNzZXJ0X2luZm8oYXIpOwotCi19Ci0KLXN0YXRpYyBpbnQgYXRoNmtsX3RhcmdldF9jb25maWdfd2xhbl9wYXJhbXMoc3RydWN0IGF0aDZrbCAqYXIpCitzdGF0aWMgaW50IGF0aDZrbF90YXJnZXRfY29uZmlnX3dsYW5fcGFyYW1zKHN0cnVjdCBhdGg2a2wgKmFyLCBpbnQgaWR4KQogewogCWludCBzdGF0dXMgPSAwOwogCWludCByZXQ7CkBAIC00MDYsNDYgKzMxMCw1MCBAQAogCSAqIGRlZmF1bHQgdmFsdWVzLiBSZXF1aXJlZCBpZiBjaGVja3N1bSBvZmZsb2FkIGlzIG5lZWRlZC4gU2V0CiAJICogUnhNZXRhVmVyc2lvbiB0byAyLgogCSAqLwotCWlmIChhdGg2a2xfd21pX3NldF9yeF9mcmFtZV9mb3JtYXRfY21kKGFyLT53bWksCisJaWYgKGF0aDZrbF93bWlfc2V0X3J4X2ZyYW1lX2Zvcm1hdF9jbWQoYXItPndtaSwgaWR4LAogCQkJCQkgICAgICAgYXItPnJ4X21ldGFfdmVyLCAwLCAwKSkgewogCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2V0IHRoZSByeCBmcmFtZSBmb3JtYXRcbiIpOwogCQlzdGF0dXMgPSAtRUlPOwogCX0KIAogCWlmIChhci0+Y29uZl9mbGFncyAmIEFUSDZLTF9DT05GX0lHTk9SRV9QU19GQUlMX0VWVF9JTl9TQ0FOKQotCQlpZiAoKGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKGFyLT53bWksIDAsIDEsIDAsIDAsIDEsCisJCWlmICgoYXRoNmtsX3dtaV9wbXBhcmFtc19jbWQoYXItPndtaSwgaWR4LCAwLCAxLCAwLCAwLCAxLAogCQkgICAgIElHTk9SRV9QT1dFUl9TQVZFX0ZBSUxfRVZFTlRfRFVSSU5HX1NDQU4pKSAhPSAwKSB7CiAJCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2V0IHBvd2VyIHNhdmUgZmFpbCBldmVudCBwb2xpY3lcbiIpOwogCQkJc3RhdHVzID0gLUVJTzsKIAkJfQogCiAJaWYgKCEoYXItPmNvbmZfZmxhZ3MgJiBBVEg2S0xfQ09ORl9JR05PUkVfRVJQX0JBUktFUikpCi0JCWlmICgoYXRoNmtsX3dtaV9zZXRfbHByZWFtYmxlX2NtZChhci0+d21pLCAwLAorCQlpZiAoKGF0aDZrbF93bWlfc2V0X2xwcmVhbWJsZV9jbWQoYXItPndtaSwgaWR4LCAwLAogCQkgICAgIFdNSV9ET05PVF9JR05PUkVfQkFSS0VSX0lOX0VSUCkpICE9IDApIHsKIAkJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgYmFya2VyIHByZWFtYmxlIHBvbGljeVxuIik7CiAJCQlzdGF0dXMgPSAtRUlPOwogCQl9CiAKLQlpZiAoYXRoNmtsX3dtaV9zZXRfa2VlcGFsaXZlX2NtZChhci0+d21pLAorCWlmIChhdGg2a2xfd21pX3NldF9rZWVwYWxpdmVfY21kKGFyLT53bWksIGlkeCwKIAkJCVdMQU5fQ09ORklHX0tFRVBfQUxJVkVfSU5URVJWQUwpKSB7CiAJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQga2VlcCBhbGl2ZSBpbnRlcnZhbFxuIik7CiAJCXN0YXR1cyA9IC1FSU87CiAJfQogCi0JaWYgKGF0aDZrbF93bWlfZGlzY3RpbWVvdXRfY21kKGFyLT53bWksCisJaWYgKGF0aDZrbF93bWlfZGlzY3RpbWVvdXRfY21kKGFyLT53bWksIGlkeCwKIAkJCVdMQU5fQ09ORklHX0RJU0NPTk5FQ1RfVElNRU9VVCkpIHsKIAkJYXRoNmtsX2VycigidW5hYmxlIHRvIHNldCBkaXNjb25uZWN0IHRpbWVvdXRcbiIpOwogCQlzdGF0dXMgPSAtRUlPOwogCX0KIAogCWlmICghKGFyLT5jb25mX2ZsYWdzICYgQVRINktMX0NPTkZfRU5BQkxFX1RYX0JVUlNUKSkKLQkJaWYgKGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKGFyLT53bWksIFdNSV9UWE9QX0RJU0FCTEVEKSkgeworCQlpZiAoYXRoNmtsX3dtaV9zZXRfd21tX3R4b3AoYXItPndtaSwgaWR4LCBXTUlfVFhPUF9ESVNBQkxFRCkpIHsKIAkJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgdHhvcCBidXJzdGluZ1xuIik7CiAJCQlzdGF0dXMgPSAtRUlPOwogCQl9CiAKKwkvKgorCSAqIEZJWE1FOiBNYWtlIHN1cmUgcDJwIGNvbmZpZ3VyYXRpb25zIGFyZSBub3QgYXBwbGllZCB0bworCSAqIG5vbi1wMnAgY2FwYWJsZSBpbnRlcmZhY2VzIHdoZW4gbXVsdGl2aWYgc3VwcG9ydCBpcyBlbmFibGVkLgorCSAqLwogCWlmIChhci0+cDJwKSB7Ci0JCXJldCA9IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKGFyLT53bWksCisJCXJldCA9IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKGFyLT53bWksIGlkeCwKIAkJCQkJICAgICAgUDJQX0ZMQUdfQ0FQQUJJTElUSUVTX1JFUSB8CiAJCQkJCSAgICAgIFAyUF9GTEFHX01BQ0FERFJfUkVRIHwKIAkJCQkJICAgICAgUDJQX0ZMQUdfSE1PREVMX1JFUSk7CkBAIC00NTcsOSArMzY1LDEzIEBACiAJCX0KIAl9CiAKKwkvKgorCSAqIEZJWE1FOiBNYWtlIHN1cmUgcDJwIGNvbmZpZ3VyYXRpb25zIGFyZSBub3QgYXBwbGllZCB0bworCSAqIG5vbi1wMnAgY2FwYWJsZSBpbnRlcmZhY2VzIHdoZW4gbXVsdGl2aWYgc3VwcG9ydCBpcyBlbmFibGVkLgorCSAqLwogCWlmIChhci0+cDJwKSB7CiAJCS8qIEVuYWJsZSBQcm9iZSBSZXF1ZXN0IHJlcG9ydGluZyBmb3IgUDJQICovCi0JCXJldCA9IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoYXItPndtaSwgdHJ1ZSk7CisJCXJldCA9IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoYXItPndtaSwgaWR4LCB0cnVlKTsKIAkJaWYgKHJldCkgewogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgImZhaWxlZCB0byBlbmFibGUgUHJvYmUgIgogCQkJCSAgICJSZXF1ZXN0IHJlcG9ydGluZyAoJWQpXG4iLCByZXQpOwpAQCAtNDcyLDEzICszODQsNDQgQEAKIGludCBhdGg2a2xfY29uZmlndXJlX3RhcmdldChzdHJ1Y3QgYXRoNmtsICphcikKIHsKIAl1MzIgcGFyYW0sIHJhbV9yZXNlcnZlZF9zaXplOwotCXU4IGZ3X2lmdHlwZTsKKwl1OCBmd19pZnR5cGUsIGZ3X21vZGUgPSAwLCBmd19zdWJtb2RlID0gMDsKKwlpbnQgaTsKIAotCWZ3X2lmdHlwZSA9IGF0aDZrbF9nZXRfZndfaWZ0eXBlKGFyKTsKLQlpZiAoZndfaWZ0eXBlID09IDB4ZmYpCi0JCXJldHVybiAtRUlOVkFMOworCS8qCisJICogTm90ZTogRXZlbiB0aG91Z2ggdGhlIGZpcm13YXJlIGludGVyZmFjZSB0eXBlIGlzCisJICogY2hvc2VuIGFzIEJTU19TVEEgZm9yIGFsbCB0aHJlZSBpbnRlcmZhY2VzLCBjYW4KKwkgKiBiZSBjb25maWd1cmVkIHRvIElCU1MvQVAgYXMgbG9uZyBhcyB0aGUgZncgc3VibW9kZQorCSAqIHJlbWFpbnMgbm9ybWFsIG1vZGUgKDAgLSBBUCwgU1RBIGFuZCBJQlNTKS4gQnV0CisJICogZHVlIHRvIGFuIHRhcmdldCBhc3NlcnQgaW4gZmlybXdhcmUgb25seSBvbmUgaW50ZXJmYWNlIGlzCisJICogY29uZmlndXJlZCBmb3Igbm93LgorCSAqLworCWZ3X2lmdHlwZSA9IEhJX09QVElPTl9GV19NT0RFX0JTU19TVEE7CiAKLQkvKiBUZWxsIHRhcmdldCB3aGljaCBIVEMgdmVyc2lvbiBpdCBpcyB1c2VkKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9WSUY7IGkrKykKKwkJZndfbW9kZSB8PSBmd19pZnR5cGUgPDwgKGkgKiBISV9PUFRJT05fRldfTU9ERV9CSVRTKTsKKworCS8qCisJICogQnkgZGVmYXVsdCwgc3VibW9kZXMgOgorCSAqCQl2aWZbMF0gLSBBUC9TVEEvSUJTUworCSAqCQl2aWZbMV0gLSAiUDJQIGRldiIvIlAyUCBHTyIvIlAyUCBDbGllbnQiCisJICoJCXZpZlsyXSAtICJQMlAgZGV2Ii8iUDJQIEdPIi8iUDJQIENsaWVudCIKKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBhci0+bWF4X25vcm1faWZhY2U7IGkrKykKKwkJZndfc3VibW9kZSB8PSBISV9PUFRJT05fRldfU1VCTU9ERV9OT05FIDw8CisJCQkgICAgICAoaSAqIEhJX09QVElPTl9GV19TVUJNT0RFX0JJVFMpOworCisJZm9yIChpID0gYXItPm1heF9ub3JtX2lmYWNlOyBpIDwgTUFYX05VTV9WSUY7IGkrKykKKwkJZndfc3VibW9kZSB8PSBISV9PUFRJT05fRldfU1VCTU9ERV9QMlBERVYgPDwKKwkJCSAgICAgIChpICogSElfT1BUSU9OX0ZXX1NVQk1PREVfQklUUyk7CisKKwkvKgorCSAqIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGJlIHJlbW92ZWQgb25jZSB0aGUgbXVsdGl2aWYKKwkgKiBzdXBwb3J0IGlzIGVuYWJsZWQuCisJICovCisJaWYgKGFyLT5wMnApCisJCWZ3X3N1Ym1vZGUgPSBISV9PUFRJT05fRldfU1VCTU9ERV9QMlBERVY7CisKIAlwYXJhbSA9IEhUQ19QUk9UT0NPTF9WRVJTSU9OOwogCWlmIChhdGg2a2xfYm1pX3dyaXRlKGFyLAogCQkJICAgICBhdGg2a2xfZ2V0X2hpX2l0ZW1fYWRkcihhciwKQEAgLTQ5OSwxMiArNDQyLDEwIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCXBhcmFtIHw9ICgxIDw8IEhJX09QVElPTl9OVU1fREVWX1NISUZUKTsKLQlwYXJhbSB8PSAoZndfaWZ0eXBlIDw8IEhJX09QVElPTl9GV19NT0RFX1NISUZUKTsKLQlpZiAoYXItPnAycCAmJiBmd19pZnR5cGUgPT0gSElfT1BUSU9OX0ZXX01PREVfQlNTX1NUQSkgewotCQlwYXJhbSB8PSBISV9PUFRJT05fRldfU1VCTU9ERV9QMlBERVYgPDwKLQkJCUhJX09QVElPTl9GV19TVUJNT0RFX1NISUZUOwotCX0KKwlwYXJhbSB8PSAoTUFYX05VTV9WSUYgPDwgSElfT1BUSU9OX05VTV9ERVZfU0hJRlQpOworCXBhcmFtIHw9IGZ3X21vZGUgPDwgSElfT1BUSU9OX0ZXX01PREVfU0hJRlQ7CisJcGFyYW0gfD0gZndfc3VibW9kZSA8PCBISV9PUFRJT05fRldfU1VCTU9ERV9TSElGVDsKKwogCXBhcmFtIHw9ICgwIDw8IEhJX09QVElPTl9NQUNfQUREUl9NRVRIT0RfU0hJRlQpOwogCXBhcmFtIHw9ICgwIDw8IEhJX09QVElPTl9GV19CUklER0VfU0hJRlQpOwogCkBAIC01NTMsNjggKzQ5NCwzNCBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgYXRoNmtsICphdGg2a2xfY29yZV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpzZGV2KQordm9pZCBhdGg2a2xfY29yZV9mcmVlKHN0cnVjdCBhdGg2a2wgKmFyKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGF0aDZrbCAqYXI7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKLQotCXdkZXYgPSBhdGg2a2xfY2ZnODAyMTFfaW5pdChzZGV2KTsKLQlpZiAoIXdkZXYpIHsKLQkJYXRoNmtsX2VycigiYXRoNmtsX2NmZzgwMjExX2luaXQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JYXIgPSB3ZGV2X3ByaXYod2Rldik7Ci0JYXItPmRldiA9IHNkZXY7Ci0JYXItPndkZXYgPSB3ZGV2OwotCXdkZXYtPmlmdHlwZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0KLQlpZiAoYXRoNmtsX2RlYnVnX2luaXQoYXIpKSB7Ci0JCWF0aDZrbF9lcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIGRlYnVnZnNcbiIpOwotCQlhdGg2a2xfY2ZnODAyMTFfZGVpbml0KGFyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JZGV2ID0gYWxsb2NfbmV0ZGV2KDAsICJ3bGFuJWQiLCBldGhlcl9zZXR1cCk7Ci0JaWYgKCFkZXYpIHsKLQkJYXRoNmtsX2Vycigibm8gbWVtb3J5IGZvciBuZXR3b3JrIGRldmljZSBpbnN0YW5jZVxuIik7Ci0JCWF0aDZrbF9jZmc4MDIxMV9kZWluaXQoYXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlkZXYtPmllZWU4MDIxMV9wdHIgPSB3ZGV2OwotCVNFVF9ORVRERVZfREVWKGRldiwgd2lwaHlfZGV2KHdkZXYtPndpcGh5KSk7Ci0Jd2Rldi0+bmV0ZGV2ID0gZGV2OwotCWFyLT5zbWVfc3RhdGUgPSBTTUVfRElTQ09OTkVDVEVEOwotCi0JaW5pdF9uZXRkZXYoZGV2KTsKLQotCWFyLT5uZXRfZGV2ID0gZGV2OwotCXNldF9iaXQoV0xBTl9FTkFCTEVELCAmYXItPmZsYWcpOwotCi0JYXItPndsYW5fcHdyX3N0YXRlID0gV0xBTl9QT1dFUl9TVEFURV9PTjsKLQotCXNwaW5fbG9ja19pbml0KCZhci0+bG9jayk7Ci0KLQlhdGg2a2xfaW5pdF9jb250cm9sX2luZm8oYXIpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFyLT5ldmVudF93cSk7Ci0Jc2VtYV9pbml0KCZhci0+c2VtLCAxKTsKLQljbGVhcl9iaXQoREVTVFJPWV9JTl9QUk9HUkVTUywgJmFyLT5mbGFnKTsKLQotCUlOSVRfTElTVF9IRUFEKCZhci0+YW1zZHVfcnhfYnVmZmVyX3F1ZXVlKTsKLQotCXNldHVwX3RpbWVyKCZhci0+ZGlzY29ubmVjdF90aW1lciwgZGlzY29ubmVjdF90aW1lcl9oYW5kbGVyLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIGRldik7Ci0KLQlyZXR1cm4gYXI7CisJd2lwaHlfZnJlZShhci0+d2lwaHkpOwogfQogCi1pbnQgYXRoNmtsX3VuYXZhaWxfZXYoc3RydWN0IGF0aDZrbCAqYXIpCit2b2lkIGF0aDZrbF9jb3JlX2NsZWFudXAoc3RydWN0IGF0aDZrbCAqYXIpCiB7Ci0JYXRoNmtsX2Rlc3Ryb3koYXItPm5ldF9kZXYsIDEpOworCWF0aDZrbF9oaWZfcG93ZXJfb2ZmKGFyKTsKIAotCXJldHVybiAwOworCWRlc3Ryb3lfd29ya3F1ZXVlKGFyLT5hdGg2a2xfd3EpOworCisJaWYgKGFyLT5odGNfdGFyZ2V0KQorCQlhdGg2a2xfaHRjX2NsZWFudXAoYXItPmh0Y190YXJnZXQpOworCisJYXRoNmtsX2Nvb2tpZV9jbGVhbnVwKGFyKTsKKworCWF0aDZrbF9jbGVhbnVwX2Ftc2R1X3J4YnVmcyhhcik7CisKKwlhdGg2a2xfYm1pX2NsZWFudXAoYXIpOworCisJYXRoNmtsX2RlYnVnX2NsZWFudXAoYXIpOworCisJa2ZyZWUoYXItPmZ3X2JvYXJkKTsKKwlrZnJlZShhci0+Zndfb3RwKTsKKwlrZnJlZShhci0+ZncpOworCWtmcmVlKGFyLT5md19wYXRjaCk7CisKKwlhdGg2a2xfZGVpbml0X2llZWU4MDIxMV9odyhhcik7CiB9CiAKIC8qIGZpcm13YXJlIHVwbG9hZCAqLwpAQCAtMTE4Miw2ICsxMDg5LDcgQEAKIHN0YXRpYyBpbnQgYXRoNmtsX3VwbG9hZF9vdHAoc3RydWN0IGF0aDZrbCAqYXIpCiB7CiAJdTMyIGFkZHJlc3MsIHBhcmFtOworCWJvb2wgZnJvbV9odyA9IGZhbHNlOwogCWludCByZXQ7CiAKIAlpZiAoV0FSTl9PTihhci0+Zndfb3RwID09IE5VTEwpKQpAQCAtMTIxMCwxNSArMTExOCwyMCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWFyLT5ody5hcHBfc3RhcnRfb3ZlcnJpZGVfYWRkciA9IGFkZHJlc3M7CisJaWYgKGFyLT5ody5hcHBfc3RhcnRfb3ZlcnJpZGVfYWRkciA9PSAwKSB7CisJCWFyLT5ody5hcHBfc3RhcnRfb3ZlcnJpZGVfYWRkciA9IGFkZHJlc3M7CisJCWZyb21faHcgPSB0cnVlOworCX0KIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIgMHgleFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImFwcF9zdGFydF9vdmVycmlkZV9hZGRyJXMgMHgleFxuIiwKKwkJICAgZnJvbV9odyA/ICIgKGZyb20gaHcpIiA6ICIiLAogCQkgICBhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIpOwogCiAJLyogZXhlY3V0ZSB0aGUgT1RQIGNvZGUgKi8KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImV4ZWN1dGluZyBPVFAgYXQgMHgleFxuIiwgYWRkcmVzcyk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsICJleGVjdXRpbmcgT1RQIGF0IDB4JXhcbiIsCisJCSAgIGFyLT5ody5hcHBfc3RhcnRfb3ZlcnJpZGVfYWRkcik7CiAJcGFyYW0gPSAwOwotCWF0aDZrbF9ibWlfZXhlY3V0ZShhciwgYWRkcmVzcywgJnBhcmFtKTsKKwlhdGg2a2xfYm1pX2V4ZWN1dGUoYXIsIGFyLT5ody5hcHBfc3RhcnRfb3ZlcnJpZGVfYWRkciwgJnBhcmFtKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNDIwLDYgKzEzMzMsMTAgQEAKIAkJYXItPmh3LmFwcF9sb2FkX2FkZHIgPSBBUjYwMDNfUkVWMl9BUFBfTE9BRF9BRERSRVNTOwogCQlhci0+aHcuYm9hcmRfZXh0X2RhdGFfYWRkciA9IEFSNjAwM19SRVYyX0JPQVJEX0VYVF9EQVRBX0FERFJFU1M7CiAJCWFyLT5ody5yZXNlcnZlZF9yYW1fc2l6ZSA9IEFSNjAwM19SRVYyX1JBTV9SRVNFUlZFX1NJWkU7CisKKwkJLyogaHcyLjAgbmVlZHMgb3ZlcnJpZGUgYWRkcmVzcyBoYXJkY29kZWQgKi8KKwkJYXItPmh3LmFwcF9zdGFydF9vdmVycmlkZV9hZGRyID0gMHg5NDRDMDA7CisKIAkJYnJlYWs7CiAJY2FzZSBBUjYwMDNfUkVWM19WRVJTSU9OOgogCQlhci0+aHcuZGF0YXNldF9wYXRjaF9hZGRyID0gQVI2MDAzX1JFVjNfREFUQVNFVF9QQVRDSF9BRERSRVNTOwpAQCAtMTQ1MSw0NyArMTM2OCwyMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoraW50IGF0aDZrbF9pbml0X2h3X3N0YXJ0KHN0cnVjdCBhdGg2a2wgKmFyKQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKLQlpbnQgc3RhdHVzID0gMDsKLQlzMzIgdGltZWxlZnQ7CisJbG9uZyB0aW1lbGVmdDsKKwlpbnQgcmV0LCBpOwogCi0JaWYgKCFhcikKLQkJcmV0dXJuIC1FSU87CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsICJodyBzdGFydFxuIik7CisKKwlyZXQgPSBhdGg2a2xfaGlmX3Bvd2VyX29uKGFyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYXRoNmtsX2NvbmZpZ3VyZV90YXJnZXQoYXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKworCXJldCA9IGF0aDZrbF9pbml0X3VwbG9hZChhcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcG93ZXJfb2ZmOwogCiAJLyogRG8gd2UgbmVlZCB0byBmaW5pc2ggdGhlIEJNSSBwaGFzZSAqLworCS8qIEZJWE1FOiByZXR1cm4gZXJyb3IgZnJvbSBhdGg2a2xfYm1pX2RvbmUoKSAqLwogCWlmIChhdGg2a2xfYm1pX2RvbmUoYXIpKSB7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gYXRoNmtsX2luaXRfZG9uZTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfcG93ZXJfb2ZmOwogCX0KIAotCS8qIEluZGljYXRlIHRoYXQgV01JIGlzIGVuYWJsZWQgKGFsdGhvdWdoIG5vdCByZWFkeSB5ZXQpICovCi0Jc2V0X2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQlhci0+d21pID0gYXRoNmtsX3dtaV9pbml0KGFyKTsKLQlpZiAoIWFyLT53bWkpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgd21pXG4iKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBhdGg2a2xfaW5pdF9kb25lOwotCX0KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICIlczogZ290IHdtaSBAIDB4JXAuXG4iLCBfX2Z1bmNfXywgYXItPndtaSk7Ci0KIAkvKgogCSAqIFRoZSByZWFzb24gd2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgdGFyZ2V0IGhlcmUgaXMgdGhhdCB0aGUKIAkgKiBkcml2ZXIgbGF5ZXIgaGFzIHRvIGluaXQgQk1JIGluIG9yZGVyIHRvIHNldCB0aGUgaG9zdCBibG9jawogCSAqIHNpemUuCiAJICovCiAJaWYgKGF0aDZrbF9odGNfd2FpdF90YXJnZXQoYXItPmh0Y190YXJnZXQpKSB7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gZXJyX25vZGVfY2xlYW51cDsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfcG93ZXJfb2ZmOwogCX0KIAogCWlmIChhdGg2a2xfaW5pdF9zZXJ2aWNlX2VwKGFyKSkgewotCQlzdGF0dXMgPSAtRUlPOworCQlyZXQgPSAtRUlPOwogCQlnb3RvIGVycl9jbGVhbnVwX3NjYXR0ZXI7CiAJfQogCisJLyogc2V0dXAgY3JlZGl0IGRpc3RyaWJ1dGlvbiAqLworCWF0aDZrbF9jcmVkaXRfc2V0dXAoYXItPmh0Y190YXJnZXQsICZhci0+Y3JlZGl0X3N0YXRlX2luZm8pOworCisJLyogc3RhcnQgSFRDICovCisJcmV0ID0gYXRoNmtsX2h0Y19zdGFydChhci0+aHRjX3RhcmdldCk7CisJaWYgKHJldCkgeworCQkvKiBGSVhNRTogY2FsbCB0aGlzICovCisJCWF0aDZrbF9jb29raWVfY2xlYW51cChhcik7CisJCWdvdG8gZXJyX2NsZWFudXBfc2NhdHRlcjsKKwl9CisKKwkvKiBXYWl0IGZvciBXbWkgZXZlbnQgdG8gYmUgcmVhZHkgKi8KKwl0aW1lbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFyLT5ldmVudF93cSwKKwkJCQkJCSAgICB0ZXN0X2JpdChXTUlfUkVBRFksCisJCQkJCQkJICAgICAmYXItPmZsYWcpLAorCQkJCQkJICAgIFdNSV9USU1FT1VUKTsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiZmlybXdhcmUgYm9vdGVkXG4iKTsKKworCWlmIChhci0+dmVyc2lvbi5hYmlfdmVyICE9IEFUSDZLTF9BQklfVkVSU0lPTikgeworCQlhdGg2a2xfZXJyKCJhYmkgdmVyc2lvbiBtaXNtYXRjaDogaG9zdCgweCV4KSwgdGFyZ2V0KDB4JXgpXG4iLAorCQkJICAgQVRINktMX0FCSV9WRVJTSU9OLCBhci0+dmVyc2lvbi5hYmlfdmVyKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfaHRjX3N0b3A7CisJfQorCisJaWYgKCF0aW1lbGVmdCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlhdGg2a2xfZXJyKCJ3bWkgaXMgbm90IHJlYWR5IG9yIHdhaXQgd2FzIGludGVycnVwdGVkXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfaHRjX3N0b3A7CisJfQorCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIiVzOiB3bWkgaXMgcmVhZHlcbiIsIF9fZnVuY19fKTsKKworCS8qIGNvbW11bmljYXRlIHRoZSB3bWkgcHJvdG9jb2wgdmVyaXNpb24gdG8gdGhlIHRhcmdldCAqLworCS8qIEZJWE1FOiByZXR1cm4gZXJyb3IgKi8KKwlpZiAoKGF0aDZrbF9zZXRfaG9zdF9hcHBfYXJlYShhcikpICE9IDApCisJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgdGhlIGhvc3QgYXBwIGFyZWFcbiIpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVklGOyBpKyspIHsKKwkJcmV0ID0gYXRoNmtsX3RhcmdldF9jb25maWdfd2xhbl9wYXJhbXMoYXIsIGkpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfaHRjX3N0b3A7CisJfQorCisJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX09OOworCisJcmV0dXJuIDA7CisKK2Vycl9odGNfc3RvcDoKKwlhdGg2a2xfaHRjX3N0b3AoYXItPmh0Y190YXJnZXQpOworZXJyX2NsZWFudXBfc2NhdHRlcjoKKwlhdGg2a2xfaGlmX2NsZWFudXBfc2NhdHRlcihhcik7CitlcnJfcG93ZXJfb2ZmOgorCWF0aDZrbF9oaWZfcG93ZXJfb2ZmKGFyKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhdGg2a2xfaW5pdF9od19zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCWludCByZXQ7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImh3IHN0b3BcbiIpOworCisJYXRoNmtsX2h0Y19zdG9wKGFyLT5odGNfdGFyZ2V0KTsKKworCWF0aDZrbF9oaWZfc3RvcChhcik7CisKKwlhdGg2a2xfYm1pX3Jlc2V0KGFyKTsKKworCXJldCA9IGF0aDZrbF9oaWZfcG93ZXJfb2ZmKGFyKTsKKwlpZiAocmV0KQorCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIHBvd2VyIG9mZiBoaWY6ICVkXG4iLCByZXQpOworCisJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX09GRjsKKworCXJldHVybiAwOworfQorCitpbnQgYXRoNmtsX2NvcmVfaW5pdChzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlzdHJ1Y3QgYXRoNmtsX2JtaV90YXJnZXRfaW5mbyB0YXJnX2luZm87CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJaW50IHJldCA9IDAsIGk7CisKKwlhci0+YXRoNmtsX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImF0aDZrbCIpOworCWlmICghYXItPmF0aDZrbF93cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBhdGg2a2xfYm1pX2luaXQoYXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3dxOworCisJLyoKKwkgKiBUdXJuIG9uIHBvd2VyIHRvIGdldCBoYXJkd2FyZSAodGFyZ2V0KSB2ZXJzaW9uIGFuZCBsZWF2ZSBwb3dlcgorCSAqIG9uIGRlbGlicmF0ZWx5IGFzIHdlIHdpbGwgYm9vdCB0aGUgaGFyZHdhcmUgYW55d2F5IHdpdGhpbiBmZXcKKwkgKiBzZWNvbmRzLgorCSAqLworCXJldCA9IGF0aDZrbF9oaWZfcG93ZXJfb24oYXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2JtaV9jbGVhbnVwOworCisJcmV0ID0gYXRoNmtsX2JtaV9nZXRfdGFyZ2V0X2luZm8oYXIsICZ0YXJnX2luZm8pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKworCWFyLT52ZXJzaW9uLnRhcmdldF92ZXIgPSBsZTMyX3RvX2NwdSh0YXJnX2luZm8udmVyc2lvbik7CisJYXItPnRhcmdldF90eXBlID0gbGUzMl90b19jcHUodGFyZ19pbmZvLnR5cGUpOworCWFyLT53aXBoeS0+aHdfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KHRhcmdfaW5mby52ZXJzaW9uKTsKKworCXJldCA9IGF0aDZrbF9pbml0X2h3X3BhcmFtcyhhcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcG93ZXJfb2ZmOworCisJYXItPmh0Y190YXJnZXQgPSBhdGg2a2xfaHRjX2NyZWF0ZShhcik7CisKKwlpZiAoIWFyLT5odGNfdGFyZ2V0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKwl9CisKKwlyZXQgPSBhdGg2a2xfZmV0Y2hfZmlybXdhcmVzKGFyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9odGNfY2xlYW51cDsKKworCS8qIEZJWE1FOiB3ZSBzaG91bGQgZnJlZSBhbGwgZmlybXdhcmVzIGluIHRoZSBlcnJvciBjYXNlcyBiZWxvdyAqLworCisJLyogSW5kaWNhdGUgdGhhdCBXTUkgaXMgZW5hYmxlZCAoYWx0aG91Z2ggbm90IHJlYWR5IHlldCkgKi8KKwlzZXRfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpOworCWFyLT53bWkgPSBhdGg2a2xfd21pX2luaXQoYXIpOworCWlmICghYXItPndtaSkgeworCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB3bWlcbiIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9odGNfY2xlYW51cDsKKwl9CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IGdvdCB3bWkgQCAweCVwLlxuIiwgX19mdW5jX18sIGFyLT53bWkpOworCisJcmV0ID0gYXRoNmtsX3JlZ2lzdGVyX2llZWU4MDIxMV9odyhhcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbm9kZV9jbGVhbnVwOworCisJcmV0ID0gYXRoNmtsX2RlYnVnX2luaXQoYXIpOworCWlmIChyZXQpIHsKKwkJd2lwaHlfdW5yZWdpc3Rlcihhci0+d2lwaHkpOworCQlnb3RvIGVycl9ub2RlX2NsZWFudXA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVklGOyBpKyspCisJCWFyLT5hdmFpbF9pZHhfbWFwIHw9IEJJVChpKTsKKworCXJ0bmxfbG9jaygpOworCisJLyogQWRkIGFuIGluaXRpYWwgc3RhdGlvbiBpbnRlcmZhY2UgKi8KKwluZGV2ID0gYXRoNmtsX2ludGVyZmFjZV9hZGQoYXIsICJ3bGFuJWQiLCBOTDgwMjExX0lGVFlQRV9TVEFUSU9OLCAwLAorCQkJCSAgICBJTkZSQV9ORVRXT1JLKTsKKworCXJ0bmxfdW5sb2NrKCk7CisKKwlpZiAoIW5kZXYpIHsKKwkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGEgbmV0d29yayBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQl3aXBoeV91bnJlZ2lzdGVyKGFyLT53aXBoeSk7CisJCWdvdG8gZXJyX2RlYnVnX2luaXQ7CisJfQorCisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IG5hbWU9JXMgZGV2PTB4JXAsIGFyPTB4JXBcbiIsCisJCQlfX2Z1bmNfXywgbmRldi0+bmFtZSwgbmRldiwgYXIpOworCiAJLyogc2V0dXAgYWNjZXNzIGNsYXNzIHByaW9yaXR5IG1hcHBpbmdzICovCiAJYXItPmFjX3N0cmVhbV9wcmlfbWFwW1dNTV9BQ19CS10gPSAwOyAvKiBsb3dlc3QgICovCiAJYXItPmFjX3N0cmVhbV9wcmlfbWFwW1dNTV9BQ19CRV0gPSAxOwpAQCAtMTUwNSwxNTYgKzE1OTMsOTAgQEAKIAkvKiBhbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgdGhhdCBoYW5kbGUgbGFyZ2VyIEFNU0RVIGZyYW1lcyAqLwogCWF0aDZrbF9yZWZpbGxfYW1zZHVfcnhidWZzKGFyLCBBVEg2S0xfTUFYX0FNU0RVX1JYX0JVRkZFUlMpOwogCi0JLyogc2V0dXAgY3JlZGl0IGRpc3RyaWJ1dGlvbiAqLwotCWF0aDZrX3NldHVwX2NyZWRpdF9kaXN0KGFyLT5odGNfdGFyZ2V0LCAmYXItPmNyZWRpdF9zdGF0ZV9pbmZvKTsKLQogCWF0aDZrbF9jb29raWVfaW5pdChhcik7CiAKLQkvKiBzdGFydCBIVEMgKi8KLQlzdGF0dXMgPSBhdGg2a2xfaHRjX3N0YXJ0KGFyLT5odGNfdGFyZ2V0KTsKLQotCWlmIChzdGF0dXMpIHsKLQkJYXRoNmtsX2Nvb2tpZV9jbGVhbnVwKGFyKTsKLQkJZ290byBlcnJfcnhidWZfY2xlYW51cDsKLQl9Ci0KLQkvKiBXYWl0IGZvciBXbWkgZXZlbnQgdG8gYmUgcmVhZHkgKi8KLQl0aW1lbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFyLT5ldmVudF93cSwKLQkJCQkJCSAgICB0ZXN0X2JpdChXTUlfUkVBRFksCi0JCQkJCQkJICAgICAmYXItPmZsYWcpLAotCQkJCQkJICAgIFdNSV9USU1FT1VUKTsKLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiZmlybXdhcmUgYm9vdGVkXG4iKTsKLQotCWlmIChhci0+dmVyc2lvbi5hYmlfdmVyICE9IEFUSDZLTF9BQklfVkVSU0lPTikgewotCQlhdGg2a2xfZXJyKCJhYmkgdmVyc2lvbiBtaXNtYXRjaDogaG9zdCgweCV4KSwgdGFyZ2V0KDB4JXgpXG4iLAotCQkJICAgQVRINktMX0FCSV9WRVJTSU9OLCBhci0+dmVyc2lvbi5hYmlfdmVyKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBlcnJfaHRjX3N0b3A7Ci0JfQotCi0JaWYgKCF0aW1lbGVmdCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlhdGg2a2xfZXJyKCJ3bWkgaXMgbm90IHJlYWR5IG9yIHdhaXQgd2FzIGludGVycnVwdGVkXG4iKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBlcnJfaHRjX3N0b3A7Ci0JfQotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIiVzOiB3bWkgaXMgcmVhZHlcbiIsIF9fZnVuY19fKTsKLQotCS8qIGNvbW11bmljYXRlIHRoZSB3bWkgcHJvdG9jb2wgdmVyaXNpb24gdG8gdGhlIHRhcmdldCAqLwotCWlmICgoYXRoNmtsX3NldF9ob3N0X2FwcF9hcmVhKGFyKSkgIT0gMCkKLQkJYXRoNmtsX2VycigidW5hYmxlIHRvIHNldCB0aGUgaG9zdCBhcHAgYXJlYVxuIik7Ci0KIAlhci0+Y29uZl9mbGFncyA9IEFUSDZLTF9DT05GX0lHTk9SRV9FUlBfQkFSS0VSIHwKIAkJCSBBVEg2S0xfQ09ORl9FTkFCTEVfMTFOIHwgQVRINktMX0NPTkZfRU5BQkxFX1RYX0JVUlNUOwogCi0JYXItPndkZXYtPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX1NVUFBPUlRTX0ZXX1JPQU07CisJaWYgKHN1c3BlbmRfY3V0cG93ZXIpCisJCWFyLT5jb25mX2ZsYWdzIHw9IEFUSDZLTF9DT05GX1NVU1BFTkRfQ1VUUE9XRVI7CiAKLQlzdGF0dXMgPSBhdGg2a2xfdGFyZ2V0X2NvbmZpZ193bGFuX3BhcmFtcyhhcik7Ci0JaWYgKCFzdGF0dXMpCi0JCWdvdG8gYXRoNmtsX2luaXRfZG9uZTsKKwlhci0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfU1VQUE9SVFNfRldfUk9BTSB8CisJCQkgICAgV0lQSFlfRkxBR19IQVZFX0FQX1NNRSB8CisJCQkgICAgV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUw7CiAKLWVycl9odGNfc3RvcDoKLQlhdGg2a2xfaHRjX3N0b3AoYXItPmh0Y190YXJnZXQpOworCXNldF9iaXQoRklSU1RfQk9PVCwgJmFyLT5mbGFnKTsKKworCXJldCA9IGF0aDZrbF9pbml0X2h3X3N0YXJ0KGFyKTsKKwlpZiAocmV0KSB7CisJCWF0aDZrbF9lcnIoIkZhaWxlZCB0byBzdGFydCBoYXJkd2FyZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3J4YnVmX2NsZWFudXA7CisJfQorCisJLyoKKwkgKiBTZXQgbWFjIGFkZHJlc3Mgd2hpY2ggaXMgcmVjZWl2ZWQgaW4gcmVhZHkgZXZlbnQKKwkgKiBGSVhNRTogTW92ZSB0byBhdGg2a2xfaW50ZXJmYWNlX2FkZCgpCisJICovCisJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBhci0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKKworCXJldHVybiByZXQ7CisKIGVycl9yeGJ1Zl9jbGVhbnVwOgogCWF0aDZrbF9odGNfZmx1c2hfcnhfYnVmKGFyLT5odGNfdGFyZ2V0KTsKIAlhdGg2a2xfY2xlYW51cF9hbXNkdV9yeGJ1ZnMoYXIpOwotZXJyX2NsZWFudXBfc2NhdHRlcjoKLQlhdGg2a2xfaGlmX2NsZWFudXBfc2NhdHRlcihhcik7CisJcnRubF9sb2NrKCk7CisJYXRoNmtsX2RlaW5pdF9pZl9kYXRhKG5ldGRldl9wcml2KG5kZXYpKTsKKwlydG5sX3VubG9jaygpOworCXdpcGh5X3VucmVnaXN0ZXIoYXItPndpcGh5KTsKK2Vycl9kZWJ1Z19pbml0OgorCWF0aDZrbF9kZWJ1Z19jbGVhbnVwKGFyKTsKIGVycl9ub2RlX2NsZWFudXA6CiAJYXRoNmtsX3dtaV9zaHV0ZG93bihhci0+d21pKTsKIAljbGVhcl9iaXQoV01JX0VOQUJMRUQsICZhci0+ZmxhZyk7CiAJYXItPndtaSA9IE5VTEw7Ci0KLWF0aDZrbF9pbml0X2RvbmU6Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IGF0aDZrbF9jb3JlX2luaXQoc3RydWN0IGF0aDZrbCAqYXIpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGF0aDZrbF9ibWlfdGFyZ2V0X2luZm8gdGFyZ19pbmZvOwotCi0JYXItPmF0aDZrbF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJhdGg2a2wiKTsKLQlpZiAoIWFyLT5hdGg2a2xfd3EpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gYXRoNmtsX2JtaV9pbml0KGFyKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl93cTsKLQotCXJldCA9IGF0aDZrbF9ibWlfZ2V0X3RhcmdldF9pbmZvKGFyLCAmdGFyZ19pbmZvKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9ibWlfY2xlYW51cDsKLQotCWFyLT52ZXJzaW9uLnRhcmdldF92ZXIgPSBsZTMyX3RvX2NwdSh0YXJnX2luZm8udmVyc2lvbik7Ci0JYXItPnRhcmdldF90eXBlID0gbGUzMl90b19jcHUodGFyZ19pbmZvLnR5cGUpOwotCWFyLT53ZGV2LT53aXBoeS0+aHdfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KHRhcmdfaW5mby52ZXJzaW9uKTsKLQotCXJldCA9IGF0aDZrbF9pbml0X2h3X3BhcmFtcyhhcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfYm1pX2NsZWFudXA7Ci0KLQlyZXQgPSBhdGg2a2xfY29uZmlndXJlX3RhcmdldChhcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfYm1pX2NsZWFudXA7Ci0KLQlhci0+aHRjX3RhcmdldCA9IGF0aDZrbF9odGNfY3JlYXRlKGFyKTsKLQotCWlmICghYXItPmh0Y190YXJnZXQpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYm1pX2NsZWFudXA7Ci0JfQotCi0JYXItPmFnZ3JfY250eHQgPSBhZ2dyX2luaXQoYXItPm5ldF9kZXYpOwotCWlmICghYXItPmFnZ3JfY250eHQpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgYWdnclxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2h0Y19jbGVhbnVwOwotCX0KLQotCXJldCA9IGF0aDZrbF9mZXRjaF9maXJtd2FyZXMoYXIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2h0Y19jbGVhbnVwOwotCi0JcmV0ID0gYXRoNmtsX2luaXRfdXBsb2FkKGFyKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9odGNfY2xlYW51cDsKLQotCXJldCA9IGF0aDZrbF9pbml0KGFyLT5uZXRfZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9odGNfY2xlYW51cDsKLQotCS8qIFRoaXMgcnVucyB0aGUgaW5pdCBmdW5jdGlvbiBpZiByZWdpc3RlcmVkICovCi0JcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGFyLT5uZXRfZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWF0aDZrbF9lcnIoInJlZ2lzdGVyX25ldGRldiBmYWlsZWRcbiIpOwotCQlhdGg2a2xfZGVzdHJveShhci0+bmV0X2RldiwgMCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc2V0X2JpdChORVRERVZfUkVHSVNURVJFRCwgJmFyLT5mbGFnKTsKLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICIlczogbmFtZT0lcyBkZXY9MHglcCwgYXI9MHglcFxuIiwKLQkJCV9fZnVuY19fLCBhci0+bmV0X2Rldi0+bmFtZSwgYXItPm5ldF9kZXYsIGFyKTsKLQotCXJldHVybiByZXQ7Ci0KIGVycl9odGNfY2xlYW51cDoKIAlhdGg2a2xfaHRjX2NsZWFudXAoYXItPmh0Y190YXJnZXQpOworZXJyX3Bvd2VyX29mZjoKKwlhdGg2a2xfaGlmX3Bvd2VyX29mZihhcik7CiBlcnJfYm1pX2NsZWFudXA6CiAJYXRoNmtsX2JtaV9jbGVhbnVwKGFyKTsKIGVycl93cToKIAlkZXN0cm95X3dvcmtxdWV1ZShhci0+YXRoNmtsX3dxKTsKKwogCXJldHVybiByZXQ7CiB9CiAKK3ZvaWQgYXRoNmtsX2NsZWFudXBfdmlmKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIGJvb2wgd21pX3JlYWR5KQoreworCXN0YXRpYyB1OCBiY2FzdF9tYWNbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKwlib29sIGRpc2Nvbl9pc3N1ZWQ7CisKKwluZXRpZl9zdG9wX3F1ZXVlKHZpZi0+bmRldik7CisKKwljbGVhcl9iaXQoV0xBTl9FTkFCTEVELCAmdmlmLT5mbGFncyk7CisKKwlpZiAod21pX3JlYWR5KSB7CisJCWRpc2Nvbl9pc3N1ZWQgPSB0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSB8fAorCQkJCXRlc3RfYml0KENPTk5FQ1RfUEVORCwgJnZpZi0+ZmxhZ3MpOworCQlhdGg2a2xfZGlzY29ubmVjdCh2aWYpOworCQlkZWxfdGltZXIoJnZpZi0+ZGlzY29ubmVjdF90aW1lcik7CisKKwkJaWYgKGRpc2Nvbl9pc3N1ZWQpCisJCQlhdGg2a2xfZGlzY29ubmVjdF9ldmVudCh2aWYsIERJU0NPTk5FQ1RfQ01ELAorCQkJCQkJKHZpZi0+bndfdHlwZSAmIEFQX05FVFdPUkspID8KKwkJCQkJCWJjYXN0X21hYyA6IHZpZi0+YnNzaWQsCisJCQkJCQkwLCBOVUxMLCAwKTsKKwl9CisKKwlpZiAodmlmLT5zY2FuX3JlcSkgeworCQljZmc4MDIxMV9zY2FuX2RvbmUodmlmLT5zY2FuX3JlcSwgdHJ1ZSk7CisJCXZpZi0+c2Nhbl9yZXEgPSBOVUxMOworCX0KK30KKwogdm9pZCBhdGg2a2xfc3RvcF90eHJ4KHN0cnVjdCBhdGg2a2wgKmFyKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gYXItPm5ldF9kZXY7Ci0KLQlpZiAoIW5kZXYpCi0JCXJldHVybjsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCAqdG1wX3ZpZjsKIAogCXNldF9iaXQoREVTVFJPWV9JTl9QUk9HUkVTUywgJmFyLT5mbGFnKTsKIApAQCAtMTY2Myw2NSArMTY4NSw0NCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGFyLT53bGFuX3B3cl9zdGF0ZSAhPSBXTEFOX1BPV0VSX1NUQVRFX0NVVF9QV1IpCi0JCWF0aDZrbF9zdG9wX2VuZHBvaW50KG5kZXYsIGZhbHNlLCB0cnVlKTsKKwlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2aWYsIHRtcF92aWYsICZhci0+dmlmX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJnZpZi0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwkJYXRoNmtsX2NsZWFudXBfdmlmKHZpZiwgdGVzdF9iaXQoV01JX1JFQURZLCAmYXItPmZsYWcpKTsKKwkJcnRubF9sb2NrKCk7CisJCWF0aDZrbF9kZWluaXRfaWZfZGF0YSh2aWYpOworCQlydG5sX3VubG9jaygpOworCQlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisKKwljbGVhcl9iaXQoV01JX1JFQURZLCAmYXItPmZsYWcpOworCisJLyoKKwkgKiBBZnRlciB3bWlfc2h1ZG93biBhbGwgV01JIGV2ZW50cyB3aWxsIGJlIGRyb3BwZWQuIFdlCisJICogbmVlZCB0byBjbGVhbnVwIHRoZSBidWZmZXJzIGFsbG9jYXRlZCBpbiBBUCBtb2RlIGFuZAorCSAqIGdpdmUgZGlzY29ubmVjdCBub3RpZmljYXRpb24gdG8gc3RhY2ssIHdoaWNoIHVzdWFsbHkKKwkgKiBoYXBwZW5zIGluIHRoZSBkaXNjb25uZWN0X2V2ZW50LiBTaW11bGF0ZSB0aGUgZGlzY29ubmVjdAorCSAqIGV2ZW50IGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGRpcmVjdGx5LiBTb21ldGltZXMKKwkgKiBkaXNjb25uZWN0X2V2ZW50IHdpbGwgYmUgcmVjZWl2ZWQgd2hlbiB0aGUgZGVidWcgbG9ncworCSAqIGFyZSBjb2xsZWN0ZWQuCisJICovCisJYXRoNmtsX3dtaV9zaHV0ZG93bihhci0+d21pKTsKKworCWNsZWFyX2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKTsKKwlpZiAoYXItPmh0Y190YXJnZXQpIHsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIiVzOiBzaHV0IGRvd24gaHRjXG4iLCBfX2Z1bmNfXyk7CisJCWF0aDZrbF9odGNfc3RvcChhci0+aHRjX3RhcmdldCk7CisJfQorCisJLyoKKwkgKiBUcnkgdG8gcmVzZXQgdGhlIGRldmljZSBpZiB3ZSBjYW4uIFRoZSBkcml2ZXIgbWF5IGhhdmUgYmVlbgorCSAqIGNvbmZpZ3VyZSBOT1QgdG8gcmVzZXQgdGhlIHRhcmdldCBkdXJpbmcgYSBkZWJ1ZyBzZXNzaW9uLgorCSAqLworCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsCisJCQkiYXR0ZW1wdGluZyB0byByZXNldCB0YXJnZXQgb24gaW5zdGFuY2UgZGVzdHJveVxuIik7CisJYXRoNmtsX3Jlc2V0X2RldmljZShhciwgYXItPnRhcmdldF90eXBlLCB0cnVlLCB0cnVlKTsKIAogCWNsZWFyX2JpdChXTEFOX0VOQUJMRUQsICZhci0+ZmxhZyk7CiB9Ci0KLS8qCi0gKiBXZSBuZWVkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgc3VycHJpc2UgYW5kIHBsYW5uZWQgcmVtb3ZhbCBvZiB0aGUKLSAqIGRldmljZSBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgY29uc2lkZXJhdGlvbjoKLSAqCi0gKiAtIEluIGNhc2Ugb2Ygc3VycHJpc2UgcmVtb3ZhbCwgdGhlIGhjZCBhbHJlYWR5IGZyZWVzIHVwIHRoZSBwZW5kaW5nCi0gKiAgIGZvciB0aGUgZGV2aWNlIGFuZCBoZW5jZSB0aGVyZSBpcyBubyBuZWVkIHRvIHVucmVnaXN0ZXIgdGhlIGZ1bmN0aW9uCi0gKiAgIGRyaXZlciBpbm9yZGVyIHRvIGdldCB0aGVzZSByZXF1ZXN0cy4gRm9yIHBsYW5uZWQgcmVtb3ZhbCwgdGhlIGZ1bmN0aW9uCi0gKiAgIGRyaXZlciBoYXMgdG8gZXhwbGljaXRseSB1bnJlZ2lzdGVyIGl0c2VsZiB0byBoYXZlIHRoZSBoY2QgcmV0dXJuIGFsbCB0aGUKLSAqICAgcGVuZGluZyByZXF1ZXN0cyBiZWZvcmUgdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGRldmljZXMgYXJlIGZyZWVkIHVwLgotICogICBOb3RlIHRoYXQgYXMgcGVyIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgZnVuY3Rpb24gZHJpdmVyIHdpbGwKLSAqICAgZW5kIHVwIHJlbGVhc2luZyBhbGwgdGhlIGRldmljZXMgc2luY2UgdGhlcmUgaXMgbm8gQVBJIHRvIHNlbGVjdGl2ZWx5Ci0gKiAgIHJlbGVhc2UgYSBwYXJ0aWN1bGFyIGRldmljZS4KLSAqCi0gKiAtIENlcnRhaW4gY29tbWFuZHMgaXNzdWVkIHRvIHRoZSB0YXJnZXQgY2FuIGJlIHNraXBwZWQgZm9yIHN1cnByaXNlCi0gKiAgIHJlbW92YWwgc2luY2UgdGhleSB3aWxsIGFueXdheSBub3QgZ28gdGhyb3VnaC4KLSAqLwotdm9pZCBhdGg2a2xfZGVzdHJveShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdW5yZWdpc3RlcikKLXsKLQlzdHJ1Y3QgYXRoNmtsICphcjsKLQotCWlmICghZGV2IHx8ICFhdGg2a2xfcHJpdihkZXYpKSB7Ci0JCWF0aDZrbF9lcnIoImZhaWxlZCB0byBnZXQgZGV2aWNlIHN0cnVjdHVyZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlhciA9IGF0aDZrbF9wcml2KGRldik7Ci0KLQlkZXN0cm95X3dvcmtxdWV1ZShhci0+YXRoNmtsX3dxKTsKLQotCWlmIChhci0+aHRjX3RhcmdldCkKLQkJYXRoNmtsX2h0Y19jbGVhbnVwKGFyLT5odGNfdGFyZ2V0KTsKLQotCWFnZ3JfbW9kdWxlX2Rlc3Ryb3koYXItPmFnZ3JfY250eHQpOwotCi0JYXRoNmtsX2Nvb2tpZV9jbGVhbnVwKGFyKTsKLQotCWF0aDZrbF9jbGVhbnVwX2Ftc2R1X3J4YnVmcyhhcik7Ci0KLQlhdGg2a2xfYm1pX2NsZWFudXAoYXIpOwotCi0JYXRoNmtsX2RlYnVnX2NsZWFudXAoYXIpOwotCi0JaWYgKHVucmVnaXN0ZXIgJiYgdGVzdF9iaXQoTkVUREVWX1JFR0lTVEVSRUQsICZhci0+ZmxhZykpIHsKLQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQkJY2xlYXJfYml0KE5FVERFVl9SRUdJU1RFUkVELCAmYXItPmZsYWcpOwotCX0KLQotCWZyZWVfbmV0ZGV2KGRldik7Ci0KLQlrZnJlZShhci0+ZndfYm9hcmQpOwotCWtmcmVlKGFyLT5md19vdHApOwotCWtmcmVlKGFyLT5mdyk7Ci0Ja2ZyZWUoYXItPmZ3X3BhdGNoKTsKLQotCWF0aDZrbF9jZmc4MDIxMV9kZWluaXQoYXIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL21haW4uYwppbmRleCAzMGI1YTUzLi41ZTVmNGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL21haW4uYwpAQCAtMjAsMTIgKzIwLDEzIEBACiAjaW5jbHVkZSAidGFyZ2V0LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotc3RydWN0IGF0aDZrbF9zdGEgKmF0aDZrbF9maW5kX3N0YShzdHJ1Y3QgYXRoNmtsICphciwgdTggKm5vZGVfYWRkcikKK3N0cnVjdCBhdGg2a2xfc3RhICphdGg2a2xfZmluZF9zdGEoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggKm5vZGVfYWRkcikKIHsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJc3RydWN0IGF0aDZrbF9zdGEgKmNvbm4gPSBOVUxMOwogCXU4IGksIG1heF9jb25uOwogCi0JbWF4X2Nvbm4gPSAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgPyBBUF9NQVhfTlVNX1NUQSA6IDA7CisJbWF4X2Nvbm4gPSAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspID8gQVBfTUFYX05VTV9TVEEgOiAwOwogCiAJZm9yIChpID0gMDsgaSA8IG1heF9jb25uOyBpKyspIHsKIAkJaWYgKG1lbWNtcChub2RlX2FkZHIsIGFyLT5zdGFfbGlzdFtpXS5tYWMsIEVUSF9BTEVOKSA9PSAwKSB7CkBAIC0zOTMsOCArMzk0LDggQEAKICNkZWZpbmUgQVI2MDAzX1JFU0VUX0NPTlRST0xfQUREUkVTUyAweDAwMDA0MDAwCiAjZGVmaW5lIEFSNjAwNF9SRVNFVF9DT05UUk9MX0FERFJFU1MgMHgwMDAwNDAwMAogCi1zdGF0aWMgdm9pZCBhdGg2a2xfcmVzZXRfZGV2aWNlKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgdGFyZ2V0X3R5cGUsCi0JCQkJYm9vbCB3YWl0X2ZvdF9jb21wbHRuLCBib29sIGNvbGRfcmVzZXQpCit2b2lkIGF0aDZrbF9yZXNldF9kZXZpY2Uoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiB0YXJnZXRfdHlwZSwKKwkJCSBib29sIHdhaXRfZm90X2NvbXBsdG4sIGJvb2wgY29sZF9yZXNldCkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAl1MzIgYWRkcmVzczsKQEAgLTQyNSwxMDIgKzQyNiwzMyBAQAogCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gcmVzZXQgdGFyZ2V0XG4iKTsKIH0KIAotdm9pZCBhdGg2a2xfc3RvcF9lbmRwb2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIGtlZXBfcHJvZmlsZSwKLQkJCSAgYm9vbCBnZXRfZGJnbG9ncykKLXsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7Ci0Jc3RhdGljIHU4IGJjYXN0X21hY1tdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCWJvb2wgZGlzY29uX2lzc3VlZDsKLQotCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQotCS8qIGRpc2FibGUgdGhlIHRhcmdldCBhbmQgdGhlIGludGVycnVwdHMgYXNzb2NpYXRlZCB3aXRoIGl0ICovCi0JaWYgKHRlc3RfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKSkgewotCQlkaXNjb25faXNzdWVkID0gKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSB8fAotCQkJCSB0ZXN0X2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZykpOwotCQlhdGg2a2xfZGlzY29ubmVjdChhcik7Ci0JCWlmICgha2VlcF9wcm9maWxlKQotCQkJYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKGFyKTsKLQotCQlkZWxfdGltZXIoJmFyLT5kaXNjb25uZWN0X3RpbWVyKTsKLQotCQljbGVhcl9iaXQoV01JX1JFQURZLCAmYXItPmZsYWcpOwotCQlhdGg2a2xfd21pX3NodXRkb3duKGFyLT53bWkpOwotCQljbGVhcl9iaXQoV01JX0VOQUJMRUQsICZhci0+ZmxhZyk7Ci0JCWFyLT53bWkgPSBOVUxMOwotCi0JCS8qCi0JCSAqIEFmdGVyIHdtaV9zaHVkb3duIGFsbCBXTUkgZXZlbnRzIHdpbGwgYmUgZHJvcHBlZC4gV2UKLQkJICogbmVlZCB0byBjbGVhbnVwIHRoZSBidWZmZXJzIGFsbG9jYXRlZCBpbiBBUCBtb2RlIGFuZAotCQkgKiBnaXZlIGRpc2Nvbm5lY3Qgbm90aWZpY2F0aW9uIHRvIHN0YWNrLCB3aGljaCB1c3VhbGx5Ci0JCSAqIGhhcHBlbnMgaW4gdGhlIGRpc2Nvbm5lY3RfZXZlbnQuIFNpbXVsYXRlIHRoZSBkaXNjb25uZWN0Ci0JCSAqIGV2ZW50IGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGRpcmVjdGx5LiBTb21ldGltZXMKLQkJICogZGlzY29ubmVjdF9ldmVudCB3aWxsIGJlIHJlY2VpdmVkIHdoZW4gdGhlIGRlYnVnIGxvZ3MKLQkJICogYXJlIGNvbGxlY3RlZC4KLQkJICovCi0JCWlmIChkaXNjb25faXNzdWVkKQotCQkJYXRoNmtsX2Rpc2Nvbm5lY3RfZXZlbnQoYXIsIERJU0NPTk5FQ1RfQ01ELAotCQkJCQkJKGFyLT5ud190eXBlICYgQVBfTkVUV09SSykgPwotCQkJCQkJYmNhc3RfbWFjIDogYXItPmJzc2lkLAotCQkJCQkJMCwgTlVMTCwgMCk7Ci0KLQkJYXItPnVzZXJfa2V5X2N0cmwgPSAwOwotCi0JfSBlbHNlIHsKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywKLQkJCSAgICIlczogd21pIGlzIG5vdCByZWFkeSAweCVwIDB4JXBcbiIsCi0JCQkgICBfX2Z1bmNfXywgYXIsIGFyLT53bWkpOwotCi0JCS8qIFNodXQgZG93biBXTUkgaWYgd2UgaGF2ZSBzdGFydGVkIGl0ICovCi0JCWlmICh0ZXN0X2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKSkgewotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywKLQkJCQkgICAiJXM6IHNodXQgZG93biB3bWlcbiIsIF9fZnVuY19fKTsKLQkJCWF0aDZrbF93bWlfc2h1dGRvd24oYXItPndtaSk7Ci0JCQljbGVhcl9iaXQoV01JX0VOQUJMRUQsICZhci0+ZmxhZyk7Ci0JCQlhci0+d21pID0gTlVMTDsKLQkJfQotCX0KLQotCWlmIChhci0+aHRjX3RhcmdldCkgewotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IHNodXQgZG93biBodGNcbiIsIF9fZnVuY19fKTsKLQkJYXRoNmtsX2h0Y19zdG9wKGFyLT5odGNfdGFyZ2V0KTsKLQl9Ci0KLQkvKgotCSAqIFRyeSB0byByZXNldCB0aGUgZGV2aWNlIGlmIHdlIGNhbi4gVGhlIGRyaXZlciBtYXkgaGF2ZSBiZWVuCi0JICogY29uZmlndXJlIE5PVCB0byByZXNldCB0aGUgdGFyZ2V0IGR1cmluZyBhIGRlYnVnIHNlc3Npb24uCi0JICovCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywKLQkJICAgImF0dGVtcHRpbmcgdG8gcmVzZXQgdGFyZ2V0IG9uIGluc3RhbmNlIGRlc3Ryb3lcbiIpOwotCWF0aDZrbF9yZXNldF9kZXZpY2UoYXIsIGFyLT50YXJnZXRfdHlwZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0aDZrbF9pbnN0YWxsX3N0YXRpY193ZXBfa2V5cyhzdHJ1Y3QgYXRoNmtsICphcikKK3N0YXRpYyB2b2lkIGF0aDZrbF9pbnN0YWxsX3N0YXRpY193ZXBfa2V5cyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXU4IGluZGV4OwogCXU4IGtleXVzYWdlOwogCiAJZm9yIChpbmRleCA9IFdNSV9NSU5fS0VZX0lOREVYOyBpbmRleCA8PSBXTUlfTUFYX0tFWV9JTkRFWDsgaW5kZXgrKykgewotCQlpZiAoYXItPndlcF9rZXlfbGlzdFtpbmRleF0ua2V5X2xlbikgeworCQlpZiAodmlmLT53ZXBfa2V5X2xpc3RbaW5kZXhdLmtleV9sZW4pIHsKIAkJCWtleXVzYWdlID0gR1JPVVBfVVNBR0U7Ci0JCQlpZiAoaW5kZXggPT0gYXItPmRlZl90eGtleV9pbmRleCkKKwkJCWlmIChpbmRleCA9PSB2aWYtPmRlZl90eGtleV9pbmRleCkKIAkJCQlrZXl1c2FnZSB8PSBUWF9VU0FHRTsKIAotCQkJYXRoNmtsX3dtaV9hZGRrZXlfY21kKGFyLT53bWksCisJCQlhdGg2a2xfd21pX2FkZGtleV9jbWQodmlmLT5hci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCiAJCQkJCSAgICAgIGluZGV4LAogCQkJCQkgICAgICBXRVBfQ1JZUFQsCiAJCQkJCSAgICAgIGtleXVzYWdlLAotCQkJCQkgICAgICBhci0+d2VwX2tleV9saXN0W2luZGV4XS5rZXlfbGVuLAotCQkJCQkgICAgICBOVUxMLAotCQkJCQkgICAgICBhci0+d2VwX2tleV9saXN0W2luZGV4XS5rZXksCisJCQkJCSAgICAgIHZpZi0+d2VwX2tleV9saXN0W2luZGV4XS5rZXlfbGVuLAorCQkJCQkgICAgICBOVUxMLCAwLAorCQkJCQkgICAgICB2aWYtPndlcF9rZXlfbGlzdFtpbmRleF0ua2V5LAogCQkJCQkgICAgICBLRVlfT1BfSU5JVF9WQUwsIE5VTEwsCiAJCQkJCSAgICAgIE5PX1NZTkNfV01JRkxBRyk7CiAJCX0KIAl9CiB9CiAKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9ic3Moc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBjaGFubmVsKQordm9pZCBhdGg2a2xfY29ubmVjdF9hcF9tb2RlX2JzcyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MTYgY2hhbm5lbCkKIHsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJc3RydWN0IGF0aDZrbF9yZXFfa2V5ICppazsKIAlpbnQgcmVzOwogCXU4IGtleV9yc2NbQVRINktMX0tFWV9TRVFfTEVOXTsKQEAgLTUyOSwxMCArNDYxLDEwIEBACiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICJBUCBtb2RlIHN0YXJ0ZWQgb24gJXUgTUh6XG4iLCBjaGFubmVsKTsKIAotCXN3aXRjaCAoYXItPmF1dGhfbW9kZSkgeworCXN3aXRjaCAodmlmLT5hdXRoX21vZGUpIHsKIAljYXNlIE5PTkVfQVVUSDoKLQkJaWYgKGFyLT5wcndpc2VfY3J5cHRvID09IFdFUF9DUllQVCkKLQkJCWF0aDZrbF9pbnN0YWxsX3N0YXRpY193ZXBfa2V5cyhhcik7CisJCWlmICh2aWYtPnByd2lzZV9jcnlwdG8gPT0gV0VQX0NSWVBUKQorCQkJYXRoNmtsX2luc3RhbGxfc3RhdGljX3dlcF9rZXlzKHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV1BBX1BTS19BVVRIOgogCWNhc2UgV1BBMl9QU0tfQVVUSDoKQEAgLTU0NCw4ICs0NzYsOSBAQAogCQkJICAgInRoZSBpbml0aWFsIGdyb3VwIGtleSBmb3IgQVAgbW9kZVxuIik7CiAJCW1lbXNldChrZXlfcnNjLCAwLCBzaXplb2Yoa2V5X3JzYykpOwogCQlyZXMgPSBhdGg2a2xfd21pX2FkZGtleV9jbWQoCi0JCQlhci0+d21pLCBpay0+a2V5X2luZGV4LCBpay0+a2V5X3R5cGUsCi0JCQlHUk9VUF9VU0FHRSwgaWstPmtleV9sZW4sIGtleV9yc2MsIGlrLT5rZXksCisJCQlhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIGlrLT5rZXlfaW5kZXgsIGlrLT5rZXlfdHlwZSwKKwkJCUdST1VQX1VTQUdFLCBpay0+a2V5X2xlbiwga2V5X3JzYywgQVRINktMX0tFWV9TRVFfTEVOLAorCQkJaWstPmtleSwKIAkJCUtFWV9PUF9JTklUX1ZBTCwgTlVMTCwgU1lOQ19CT1RIX1dNSUZMQUcpOwogCQlpZiAocmVzKSB7CiAJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICJEZWxheWVkICIKQEAgLTU1NCwxNSArNDg3LDE2IEBACiAJCWJyZWFrOwogCX0KIAotCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCBOT05FX0JTU19GSUxURVIsIDApOwotCXNldF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpOwotCW5ldGlmX2NhcnJpZXJfb24oYXItPm5ldF9kZXYpOworCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIE5PTkVfQlNTX0ZJTFRFUiwgMCk7CisJc2V0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKKwluZXRpZl9jYXJyaWVyX29uKHZpZi0+bmRldik7CiB9CiAKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9zdGEoc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBhaWQsIHU4ICptYWNfYWRkciwKK3ZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9zdGEoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGFpZCwgdTggKm1hY19hZGRyLAogCQkJCXU4IGtleW1nbXQsIHU4IHVjaXBoZXIsIHU4IGF1dGgsCiAJCQkJdTggYXNzb2NfcmVxX2xlbiwgdTggKmFzc29jX2luZm8pCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCXU4ICppZXMgPSBOVUxMLCAqd3BhX2llID0gTlVMTCwgKnBvczsKIAlzaXplX3QgaWVzX2xlbiA9IDA7CiAJc3RydWN0IHN0YXRpb25faW5mbyBzaW5mbzsKQEAgLTYxNywzNTAgKzU1MSwzNCBAQAogCXNpbmZvLmFzc29jX3JlcV9pZXNfbGVuID0gaWVzX2xlbjsKIAlzaW5mby5maWxsZWQgfD0gU1RBVElPTl9JTkZPX0FTU09DX1JFUV9JRVM7CiAKLQljZmc4MDIxMV9uZXdfc3RhKGFyLT5uZXRfZGV2LCBtYWNfYWRkciwgJnNpbmZvLCBHRlBfS0VSTkVMKTsKKwljZmc4MDIxMV9uZXdfc3RhKHZpZi0+bmRldiwgbWFjX2FkZHIsICZzaW5mbywgR0ZQX0tFUk5FTCk7CiAKLQluZXRpZl93YWtlX3F1ZXVlKGFyLT5uZXRfZGV2KTsKLX0KLQotLyogRnVuY3Rpb25zIGZvciBUeCBjcmVkaXQgaGFuZGxpbmcgKi8KLXZvaWQgYXRoNmtfY3JlZGl0X2luaXQoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAotCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZXBfbGlzdCwKLQkJICAgICAgIGludCB0b3RfY3JlZGl0cykKLXsKLQlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICpjdXJfZXBfZGlzdDsKLQlpbnQgY291bnQ7Ci0KLQljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKLQljcmVkX2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2VwX2Rpc3QsIGVwX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGN1cl9lcF9kaXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQotCQkJY29udGludWU7Ci0KLQkJY3VyX2VwX2Rpc3QtPmNyZWRfbWluID0gY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZzsKLQotCQlpZiAodG90X2NyZWRpdHMgPiA0KQotCQkJaWYgKChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JLX1NWQykgfHwKLQkJCSAgICAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CRV9TVkMpKSB7Ci0JCQkJYXRoNmtsX2RlcG9zaXRfY3JlZGl0X3RvX2VwKGNyZWRfaW5mbywKLQkJCQkJCWN1cl9lcF9kaXN0LAotCQkJCQkJY3VyX2VwX2Rpc3QtPmNyZWRfbWluKTsKLQkJCQljdXJfZXBfZGlzdC0+ZGlzdF9mbGFncyB8PSBIVENfRVBfQUNUSVZFOwotCQkJfQotCi0JCWlmIChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9DT05UUk9MX1NWQykgewotCQkJYXRoNmtsX2RlcG9zaXRfY3JlZGl0X3RvX2VwKGNyZWRfaW5mbywgY3VyX2VwX2Rpc3QsCi0JCQkJCQkgICAgY3VyX2VwX2Rpc3QtPmNyZWRfbWluKTsKLQkJCS8qCi0JCQkgKiBDb250cm9sIHNlcnZpY2UgaXMgYWx3YXlzIG1hcmtlZCBhY3RpdmUsIGl0Ci0JCQkgKiBuZXZlciBnb2VzIGluYWN0aXZlIEVWRVIuCi0JCQkgKi8KLQkJCWN1cl9lcF9kaXN0LT5kaXN0X2ZsYWdzIHw9IEhUQ19FUF9BQ1RJVkU7Ci0JCX0gZWxzZSBpZiAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CS19TVkMpCi0JCQkvKiB0aGlzIGlzIHRoZSBsb3dlc3QgcHJpb3JpdHkgZGF0YSBlbmRwb2ludCAqLwotCQkJY3JlZF9pbmZvLT5sb3dlc3RwcmlfZXBfZGlzdCA9IGN1cl9lcF9kaXN0LT5saXN0OwotCi0JCS8qCi0JCSAqIFN0cmVhbXMgaGF2ZSB0byBiZSBjcmVhdGVkIChleHBsaWNpdCB8IGltcGxpY2l0KSBmb3IgYWxsCi0JCSAqIGtpbmRzIG9mIHRyYWZmaWMuIEJFIGVuZHBvaW50cyBhcmUgYWxzbyBpbmFjdGl2ZSBpbiB0aGUKLQkJICogYmVnaW5uaW5nLiBXaGVuIEJFIHRyYWZmaWMgc3RhcnRzIGl0IGNyZWF0ZXMgaW1wbGljaXQKLQkJICogc3RyZWFtcyB0aGF0IHJlZGlzdHJpYnV0ZXMgY3JlZGl0cy4KLQkJICoKLQkJICogTm90ZTogYWxsIG90aGVyIGVuZHBvaW50cyBoYXZlIG1pbmltdW1zIHNldCBidXQgYXJlCi0JCSAqIGluaXRpYWxseSBnaXZlbiBOTyBjcmVkaXRzLiBjcmVkaXRzIHdpbGwgYmUgZGlzdHJpYnV0ZWQKLQkJICogYXMgdHJhZmZpYyBhY3Rpdml0eSBkZW1hbmRzCi0JCSAqLwotCX0KLQotCVdBUk5fT04oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzIDw9IDApOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJfZXBfZGlzdCwgZXBfbGlzdCwgbGlzdCkgewotCQlpZiAoY3VyX2VwX2Rpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCi0JCQljb250aW51ZTsKLQotCQlpZiAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfQ09OVFJPTF9TVkMpCi0JCQljdXJfZXBfZGlzdC0+Y3JlZF9ub3JtID0gY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZzsKLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogRm9yIHRoZSByZW1haW5pbmcgZGF0YSBlbmRwb2ludHMsIHdlIGFzc3VtZSB0aGF0Ci0JCQkgKiBlYWNoIGNyZWRfcGVyX21zZyBhcmUgdGhlIHNhbWUuIFdlIHVzZSBhIHNpbXBsZQotCQkJICogY2FsY3VsYXRpb24gaGVyZSwgd2UgdGFrZSB0aGUgcmVtYWluaW5nIGNyZWRpdHMKLQkJCSAqIGFuZCBkZXRlcm1pbmUgaG93IG1hbnkgbWF4IG1lc3NhZ2VzIHRoaXMgY2FuCi0JCQkgKiBjb3ZlciBhbmQgdGhlbiBzZXQgZWFjaCBlbmRwb2ludCdzIG5vcm1hbCB2YWx1ZQotCQkJICogZXF1YWwgdG8gMy80IHRoaXMgYW1vdW50LgotCQkJICovCi0JCQljb3VudCA9IChjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgLwotCQkJCSBjdXJfZXBfZGlzdC0+Y3JlZF9wZXJfbXNnKQotCQkJCSogY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZzsKLQkJCWNvdW50ID0gKGNvdW50ICogMykgPj4gMjsKLQkJCWNvdW50ID0gbWF4KGNvdW50LCBjdXJfZXBfZGlzdC0+Y3JlZF9wZXJfbXNnKTsKLQkJCWN1cl9lcF9kaXN0LT5jcmVkX25vcm0gPSBjb3VudDsKLQotCQl9Ci0JfQotfQotCi0vKiBpbml0aWFsaXplIGFuZCBzZXR1cCBjcmVkaXQgZGlzdHJpYnV0aW9uICovCi1pbnQgYXRoNmtfc2V0dXBfY3JlZGl0X2Rpc3Qodm9pZCAqaHRjX2hhbmRsZSwKLQkJCSAgICBzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvICpjcmVkX2luZm8pCi17Ci0JdTE2IHNlcnZpY2Vwcmlvcml0eVs1XTsKLQotCW1lbXNldChjcmVkX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvKSk7Ci0KLQlzZXJ2aWNlcHJpb3JpdHlbMF0gPSBXTUlfQ09OVFJPTF9TVkM7ICAvKiBoaWdoZXN0ICovCi0Jc2VydmljZXByaW9yaXR5WzFdID0gV01JX0RBVEFfVk9fU1ZDOwotCXNlcnZpY2Vwcmlvcml0eVsyXSA9IFdNSV9EQVRBX1ZJX1NWQzsKLQlzZXJ2aWNlcHJpb3JpdHlbM10gPSBXTUlfREFUQV9CRV9TVkM7Ci0Jc2VydmljZXByaW9yaXR5WzRdID0gV01JX0RBVEFfQktfU1ZDOyAvKiBsb3dlc3QgKi8KLQotCS8qIHNldCBwcmlvcml0eSBsaXN0ICovCi0JYXRoNmtsX2h0Y19zZXRfY3JlZGl0X2Rpc3QoaHRjX2hhbmRsZSwgY3JlZF9pbmZvLCBzZXJ2aWNlcHJpb3JpdHksIDUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHJlZHVjZSBhbiBlcCdzIGNyZWRpdHMgYmFjayB0byBhIHNldCBsaW1pdCAqLwotc3RhdGljIHZvaWQgYXRoNmtfcmVkdWNlX2NyZWRpdHMoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAotCQkJCSBzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICAqZXBfZGlzdCwKLQkJCQkgaW50IGxpbWl0KQotewotCWludCBjcmVkaXRzOwotCi0JZXBfZGlzdC0+Y3JlZF9hc3NuZ2QgPSBsaW1pdDsKLQotCWlmIChlcF9kaXN0LT5jcmVkaXRzIDw9IGxpbWl0KQotCQlyZXR1cm47Ci0KLQljcmVkaXRzID0gZXBfZGlzdC0+Y3JlZGl0cyAtIGxpbWl0OwotCWVwX2Rpc3QtPmNyZWRpdHMgLT0gY3JlZGl0czsKLQljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgKz0gY3JlZGl0czsKLX0KLQotc3RhdGljIHZvaWQgYXRoNmtfY3JlZGl0X3VwZGF0ZShzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvICpjcmVkX2luZm8sCi0JCQkJc3RydWN0IGxpc3RfaGVhZCAqZXBkaXN0X2xpc3QpCi17Ci0Jc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyX2Rpc3RfbGlzdDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2Rpc3RfbGlzdCwgZXBkaXN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGN1cl9kaXN0X2xpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCi0JCQljb250aW51ZTsKLQotCQlpZiAoY3VyX2Rpc3RfbGlzdC0+Y3JlZF90b19kaXN0ID4gMCkgewotCQkJY3VyX2Rpc3RfbGlzdC0+Y3JlZGl0cyArPQotCQkJCQljdXJfZGlzdF9saXN0LT5jcmVkX3RvX2Rpc3Q7Ci0JCQljdXJfZGlzdF9saXN0LT5jcmVkX3RvX2Rpc3QgPSAwOwotCQkJaWYgKGN1cl9kaXN0X2xpc3QtPmNyZWRpdHMgPgotCQkJICAgIGN1cl9kaXN0X2xpc3QtPmNyZWRfYXNzbmdkKQotCQkJCWF0aDZrX3JlZHVjZV9jcmVkaXRzKGNyZWRfaW5mbywKLQkJCQkJCWN1cl9kaXN0X2xpc3QsCi0JCQkJCQljdXJfZGlzdF9saXN0LT5jcmVkX2Fzc25nZCk7Ci0KLQkJCWlmIChjdXJfZGlzdF9saXN0LT5jcmVkaXRzID4KLQkJCSAgICBjdXJfZGlzdF9saXN0LT5jcmVkX25vcm0pCi0JCQkJYXRoNmtfcmVkdWNlX2NyZWRpdHMoY3JlZF9pbmZvLCBjdXJfZGlzdF9saXN0LAotCQkJCQkJICAgICBjdXJfZGlzdF9saXN0LT5jcmVkX25vcm0pOwotCi0JCQlpZiAoIShjdXJfZGlzdF9saXN0LT5kaXN0X2ZsYWdzICYgSFRDX0VQX0FDVElWRSkpIHsKLQkJCQlpZiAoY3VyX2Rpc3RfbGlzdC0+dHhxX2RlcHRoID09IDApCi0JCQkJCWF0aDZrX3JlZHVjZV9jcmVkaXRzKGNyZWRfaW5mbywKLQkJCQkJCQkgICAgIGN1cl9kaXN0X2xpc3QsIDApOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICogSFRDIGhhcyBhbiBlbmRwb2ludCB0aGF0IG5lZWRzIGNyZWRpdHMsIGVwX2Rpc3QgaXMgdGhlIGVuZHBvaW50IGluCi0gKiBxdWVzdGlvbi4KLSAqLwotdm9pZCBhdGg2a19zZWVrX2NyZWRpdHMoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAotCQkJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCkKLXsKLQlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICpjdXJkaXN0X2xpc3Q7Ci0JaW50IGNyZWRpdHMgPSAwOwotCWludCBuZWVkOwotCi0JaWYgKGVwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfQ09OVFJPTF9TVkMpCi0JCWdvdG8gb3V0OwotCi0JaWYgKChlcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfVklfU1ZDKSB8fAotCSAgICAoZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX1ZPX1NWQykpCi0JCWlmICgoZXBfZGlzdC0+Y3JlZF9hc3NuZ2QgPj0gZXBfZGlzdC0+Y3JlZF9ub3JtKSkKLQkJCWdvdG8gb3V0OwotCi0JLyoKLQkgKiBGb3IgYWxsIG90aGVyIHNlcnZpY2VzLCB3ZSBmb2xsb3cgYSBzaW1wbGUgYWxnb3JpdGhtIG9mOgotCSAqCi0JICogMS4gY2hlY2tpbmcgdGhlIGZyZWUgcG9vbCBmb3IgY3JlZGl0cwotCSAqIDIuIGNoZWNraW5nIGxvd2VyIHByaW9yaXR5IGVuZHBvaW50cyBmb3IgY3JlZGl0cyB0byB0YWtlCi0JICovCi0KLQljcmVkaXRzID0gbWluKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cywgZXBfZGlzdC0+c2Vla19jcmVkKTsKLQotCWlmIChjcmVkaXRzID49IGVwX2Rpc3QtPnNlZWtfY3JlZCkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqIFdlIGRvbid0IGhhdmUgZW5vdWdoIGluIHRoZSBmcmVlIHBvb2wsIHRyeSB0YWtpbmcgYXdheSBmcm9tCi0JICogbG93ZXIgcHJpb3JpdHkgc2VydmljZXMgVGhlIHJ1bGUgZm9yIHRha2luZyBhd2F5IGNyZWRpdHM6Ci0JICoKLQkgKiAgIDEuIE9ubHkgdGFrZSBmcm9tIGxvd2VyIHByaW9yaXR5IGVuZHBvaW50cwotCSAqICAgMi4gT25seSB0YWtlIHdoYXQgaXMgYWxsb2NhdGVkIGFib3ZlIHRoZSBtaW5pbXVtIChuZXZlcgotCSAqICAgICAgc3RhcnZlIGFuIGVuZHBvaW50IGNvbXBsZXRlbHkpCi0JICogICAzLiBPbmx5IHRha2Ugd2hhdCB5b3UgbmVlZC4KLQkgKi8KLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShjdXJkaXN0X2xpc3QsCi0JCQkJICAgICZjcmVkX2luZm8tPmxvd2VzdHByaV9lcF9kaXN0LAotCQkJCSAgICBsaXN0KSB7Ci0JCWlmIChjdXJkaXN0X2xpc3QgPT0gZXBfZGlzdCkKLQkJCWJyZWFrOwotCi0JCW5lZWQgPSBlcF9kaXN0LT5zZWVrX2NyZWQgLSBjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHM7Ci0KLQkJaWYgKChjdXJkaXN0X2xpc3QtPmNyZWRfYXNzbmdkIC0gbmVlZCkgPj0KLQkJICAgICBjdXJkaXN0X2xpc3QtPmNyZWRfbWluKSB7Ci0JCQkvKgotCQkJICogVGhlIGN1cnJlbnQgb25lIGhhcyBiZWVuIGFsbG9jYXRlZCBtb3JlIHRoYW4KLQkJCSAqIGl0J3MgbWluaW11bSBhbmQgaXQgaGFzIGVub3VnaCBjcmVkaXRzIGFzc2lnbmVkCi0JCQkgKiBhYm92ZSBpdCdzIG1pbmltdW0gdG8gZnVsZmlsbCBvdXIgbmVlZCB0cnkgdG8KLQkJCSAqIHRha2UgYXdheSBqdXN0IGVub3VnaCB0byBmdWxmaWxsIG91ciBuZWVkLgotCQkJICovCi0JCQlhdGg2a19yZWR1Y2VfY3JlZGl0cyhjcmVkX2luZm8sIGN1cmRpc3RfbGlzdCwKLQkJCQkJY3VyZGlzdF9saXN0LT5jcmVkX2Fzc25nZCAtIG5lZWQpOwotCi0JCQlpZiAoY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzID49Ci0JCQkgICAgZXBfZGlzdC0+c2Vla19jcmVkKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGN1cmRpc3RfbGlzdC0+ZW5kcG9pbnQgPT0gRU5EUE9JTlRfMCkKLQkJCWJyZWFrOwotCX0KLQotCWNyZWRpdHMgPSBtaW4oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzLCBlcF9kaXN0LT5zZWVrX2NyZWQpOwotCi1vdXQ6Ci0JLyogZGlkIHdlIGZpbmQgc29tZSBjcmVkaXRzPyAqLwotCWlmIChjcmVkaXRzKQotCQlhdGg2a2xfZGVwb3NpdF9jcmVkaXRfdG9fZXAoY3JlZF9pbmZvLCBlcF9kaXN0LCBjcmVkaXRzKTsKLQotCWVwX2Rpc3QtPnNlZWtfY3JlZCA9IDA7Ci19Ci0KLS8qIHJlZGlzdHJpYnV0ZSBjcmVkaXRzIGJhc2VkIG9uIGFjdGl2aXR5IGNoYW5nZSAqLwotc3RhdGljIHZvaWQgYXRoNmtfcmVkaXN0cmlidXRlX2NyZWRpdHMoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqaW5mbywKLQkJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZXBfZGlzdF9saXN0KQotewotCXN0cnVjdCBodGNfZW5kcG9pbnRfY3JlZGl0X2Rpc3QgKmN1cmRpc3RfbGlzdDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyZGlzdF9saXN0LCBlcF9kaXN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGN1cmRpc3RfbGlzdC0+ZW5kcG9pbnQgPT0gRU5EUE9JTlRfMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgoY3VyZGlzdF9saXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfQktfU1ZDKSAgfHwKLQkJICAgIChjdXJkaXN0X2xpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CRV9TVkMpKQotCQkJY3VyZGlzdF9saXN0LT5kaXN0X2ZsYWdzIHw9IEhUQ19FUF9BQ1RJVkU7Ci0KLQkJaWYgKChjdXJkaXN0X2xpc3QtPnN2Y19pZCAhPSBXTUlfQ09OVFJPTF9TVkMpICYmCi0JCSAgICAhKGN1cmRpc3RfbGlzdC0+ZGlzdF9mbGFncyAmIEhUQ19FUF9BQ1RJVkUpKSB7Ci0JCQlpZiAoY3VyZGlzdF9saXN0LT50eHFfZGVwdGggPT0gMCkKLQkJCQlhdGg2a19yZWR1Y2VfY3JlZGl0cyhpbmZvLAotCQkJCQkJY3VyZGlzdF9saXN0LCAwKTsKLQkJCWVsc2UKLQkJCQlhdGg2a19yZWR1Y2VfY3JlZGl0cyhpbmZvLAotCQkJCQkJY3VyZGlzdF9saXN0LAotCQkJCQkJY3VyZGlzdF9saXN0LT5jcmVkX21pbik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW5ldmVyIGVuZHBvaW50cyByZXF1aXJlIGNyZWRpdAotICogZGlzdHJpYnV0aW9ucy4gQSBsb2NrIGlzIGhlbGQgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkLCB0aGlzCi0gKiBmdW5jdGlvbiBzaGFsbCBOT1QgYmxvY2suIFRoZSBlcF9kaXN0X2xpc3QgaXMgYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbgotICogc3RydWN0dXJlcyBpbiBwcmlvcml0aXplZCBvcmRlciBhcyBkZWZpbmVkIGJ5IHRoZSBjYWxsIHRvIHRoZQotICogaHRjX3NldF9jcmVkaXRfZGlzdCgpIGFwaS4KLSAqLwotdm9pZCBhdGg2a19jcmVkaXRfZGlzdHJpYnV0ZShzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvICpjcmVkX2luZm8sCi0JCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwX2Rpc3RfbGlzdCwKLQkJCSAgICAgZW51bSBodGNfY3JlZGl0X2Rpc3RfcmVhc29uIHJlYXNvbikKLXsKLQlzd2l0Y2ggKHJlYXNvbikgewotCWNhc2UgSFRDX0NSRURJVF9ESVNUX1NFTkRfQ09NUExFVEU6Ci0JCWF0aDZrX2NyZWRpdF91cGRhdGUoY3JlZF9pbmZvLCBlcF9kaXN0X2xpc3QpOwotCQlicmVhazsKLQljYXNlIEhUQ19DUkVESVRfRElTVF9BQ1RJVklUWV9DSEFOR0U6Ci0JCWF0aDZrX3JlZGlzdHJpYnV0ZV9jcmVkaXRzKGNyZWRfaW5mbywgZXBfZGlzdF9saXN0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JV0FSTl9PTihjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPiBjcmVkX2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMpOwotCVdBUk5fT04oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzIDwgMCk7CisJbmV0aWZfd2FrZV9xdWV1ZSh2aWYtPm5kZXYpOwogfQogCiB2b2lkIGRpc2Nvbm5lY3RfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIHB0cikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHRyOwotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWF0aDZrbF9pbml0X3Byb2ZpbGVfaW5mbyhhcik7Ci0JYXRoNmtsX2Rpc2Nvbm5lY3QoYXIpOworCWF0aDZrbF9pbml0X3Byb2ZpbGVfaW5mbyh2aWYpOworCWF0aDZrbF9kaXNjb25uZWN0KHZpZik7CiB9CiAKLXZvaWQgYXRoNmtsX2Rpc2Nvbm5lY3Qoc3RydWN0IGF0aDZrbCAqYXIpCit2b2lkIGF0aDZrbF9kaXNjb25uZWN0KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7Ci0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSB8fAotCSAgICB0ZXN0X2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZykpIHsKLQkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChhci0+d21pKTsKKwlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncykpIHsKKwkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZCh2aWYtPmFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCk7CiAJCS8qCiAJCSAqIERpc2Nvbm5lY3QgY29tbWFuZCBpcyBpc3N1ZWQsIGNsZWFyIHRoZSBjb25uZWN0IHBlbmRpbmcKIAkJICogZmxhZy4gVGhlIGNvbm5lY3RlZCBmbGFnIHdpbGwgYmUgY2xlYXJlZCBpbgogCQkgKiBkaXNjb25uZWN0IGV2ZW50IG5vdGlmaWNhdGlvbi4KIAkJICovCi0JCWNsZWFyX2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZyk7CisJCWNsZWFyX2JpdChDT05ORUNUX1BFTkQsICZ2aWYtPmZsYWdzKTsKIAl9CiB9CiAKLXZvaWQgYXRoNmtsX2RlZXBfc2xlZXBfZW5hYmxlKHN0cnVjdCBhdGg2a2wgKmFyKQotewotCXN3aXRjaCAoYXItPnNtZV9zdGF0ZSkgewotCWNhc2UgU01FX0NPTk5FQ1RJTkc6Ci0JCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KGFyLT5uZXRfZGV2LCBhci0+YnNzaWQsIE5VTEwsIDAsCi0JCQkJCU5VTEwsIDAsCi0JCQkJCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUsCi0JCQkJCUdGUF9LRVJORUwpOwotCQlicmVhazsKLQljYXNlIFNNRV9DT05ORUNURUQ6Ci0JZGVmYXVsdDoKLQkJLyoKLQkJICogRklYTUU6IG9kZGx5IGVub3VnaCBzbWVTdGF0ZSBpcyBpbiBESVNDT05ORUNURUQgZHVyaW5nCi0JCSAqIHN1c3BlbmQsIHdoeT8gTmVlZCB0byBzZW5kIGRpc2Nvbm5lY3RlZCBldmVudCBpbiB0aGF0Ci0JCSAqIHN0YXRlLgotCQkgKi8KLQkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKGFyLT5uZXRfZGV2LCAwLCBOVUxMLCAwLCBHRlBfS0VSTkVMKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSB8fAotCSAgICB0ZXN0X2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZykpCi0JCWF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoYXItPndtaSk7Ci0KLQlhci0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKLQotCS8qIGRpc2FibGUgc2Nhbm5pbmcgKi8KLQlpZiAoYXRoNmtsX3dtaV9zY2FucGFyYW1zX2NtZChhci0+d21pLCAweEZGRkYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JCQkJICAgICAgMCwgMCkgIT0gMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRoNmtsOiBmYWlsZWQgdG8gZGlzYWJsZSBzY2FuICIKLQkJICAgICAgICJkdXJpbmcgc3VzcGVuZFxuIik7Ci0KLQlhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChhciwgLUVDQU5DRUxFRCk7Ci19Ci0KIC8qIFdNSSBFdmVudCBoYW5kbGVycyAqLwogCiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2h3X2lkX3N0cmluZyh1MzIgaWQpCkBAIC05ODAsMTcgKzU5OCwxNiBAQAogdm9pZCBhdGg2a2xfcmVhZHlfZXZlbnQodm9pZCAqZGV2dCwgdTggKmRhdGFwLCB1MzIgc3dfdmVyLCB1MzIgYWJpX3ZlcikKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGRldnQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFyLT5uZXRfZGV2OwogCi0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGRhdGFwLCBFVEhfQUxFTik7CisJbWVtY3B5KGFyLT5tYWNfYWRkciwgZGF0YXAsIEVUSF9BTEVOKTsKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IG1hYyBhZGRyID0gJXBNXG4iLAotCQkgICBfX2Z1bmNfXywgZGV2LT5kZXZfYWRkcik7CisJCSAgIF9fZnVuY19fLCBhci0+bWFjX2FkZHIpOwogCiAJYXItPnZlcnNpb24ud2xhbl92ZXIgPSBzd192ZXI7CiAJYXItPnZlcnNpb24uYWJpX3ZlciA9IGFiaV92ZXI7CiAKLQlzbnByaW50Zihhci0+d2Rldi0+d2lwaHktPmZ3X3ZlcnNpb24sCi0JCSBzaXplb2YoYXItPndkZXYtPndpcGh5LT5md192ZXJzaW9uKSwKKwlzbnByaW50Zihhci0+d2lwaHktPmZ3X3ZlcnNpb24sCisJCSBzaXplb2YoYXItPndpcGh5LT5md192ZXJzaW9uKSwKIAkJICIldS4ldS4ldS4ldSIsCiAJCSAoYXItPnZlcnNpb24ud2xhbl92ZXIgJiAweGYwMDAwMDAwKSA+PiAyOCwKIAkJIChhci0+dmVyc2lvbi53bGFuX3ZlciAmIDB4MGYwMDAwMDApID4+IDI0LApAQCAtMTAwMSw3OCArNjE4LDkxIEBACiAJc2V0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZyk7CiAJd2FrZV91cCgmYXItPmV2ZW50X3dxKTsKIAotCWF0aDZrbF9pbmZvKCJodyAlcyBmdyAlcyVzXG4iLAotCQkgICAgZ2V0X2h3X2lkX3N0cmluZyhhci0+d2Rldi0+d2lwaHktPmh3X3ZlcnNpb24pLAotCQkgICAgYXItPndkZXYtPndpcGh5LT5md192ZXJzaW9uLAotCQkgICAgdGVzdF9iaXQoVEVTVE1PREUsICZhci0+ZmxhZykgPyAiIHRlc3Rtb2RlIiA6ICIiKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZJUlNUX0JPT1QsICZhci0+ZmxhZykpIHsKKwkJYXRoNmtsX2luZm8oImh3ICVzIGZ3ICVzJXNcbiIsCisJCQkgICAgZ2V0X2h3X2lkX3N0cmluZyhhci0+d2lwaHktPmh3X3ZlcnNpb24pLAorCQkJICAgIGFyLT53aXBoeS0+ZndfdmVyc2lvbiwKKwkJCSAgICB0ZXN0X2JpdChURVNUTU9ERSwgJmFyLT5mbGFnKSA/ICIgdGVzdG1vZGUiIDogIiIpOworCX0KIH0KIAotdm9pZCBhdGg2a2xfc2Nhbl9jb21wbGV0ZV9ldnQoc3RydWN0IGF0aDZrbCAqYXIsIGludCBzdGF0dXMpCit2b2lkIGF0aDZrbF9zY2FuX2NvbXBsZXRlX2V2dChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBpbnQgc3RhdHVzKQogewotCWF0aDZrbF9jZmc4MDIxMV9zY2FuX2NvbXBsZXRlX2V2ZW50KGFyLCBzdGF0dXMpOworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKKwlib29sIGFib3J0ZWQgPSBmYWxzZTsKKworCWlmIChzdGF0dXMgIT0gV01JX1NDQU5fU1RBVFVTX1NVQ0NFU1MpCisJCWFib3J0ZWQgPSB0cnVlOworCisJYXRoNmtsX2NmZzgwMjExX3NjYW5fY29tcGxldGVfZXZlbnQodmlmLCBhYm9ydGVkKTsKIAogCWlmICghYXItPnVzcl9ic3NfZmlsdGVyKSB7Ci0JCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmYXItPmZsYWcpOwotCQlhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgTk9ORV9CU1NfRklMVEVSLCAwKTsKKwkJY2xlYXJfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZ2aWYtPmZsYWdzKTsKKwkJYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJIE5PTkVfQlNTX0ZJTFRFUiwgMCk7CiAJfQogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fU0NBTiwgInNjYW4gY29tcGxldGU6ICVkXG4iLCBzdGF0dXMpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgInNjYW4gY29tcGxldGU6ICVkXG4iLCBzdGF0dXMpOwogfQogCi12b2lkIGF0aDZrbF9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1MTYgY2hhbm5lbCwgdTggKmJzc2lkLAordm9pZCBhdGg2a2xfY29ubmVjdF9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MTYgY2hhbm5lbCwgdTggKmJzc2lkLAogCQkJICB1MTYgbGlzdGVuX2ludCwgdTE2IGJlYWNvbl9pbnQsCiAJCQkgIGVudW0gbmV0d29ya190eXBlIG5ldF90eXBlLCB1OCBiZWFjb25faWVfbGVuLAogCQkJICB1OCBhc3NvY19yZXFfbGVuLCB1OCBhc3NvY19yZXNwX2xlbiwKIAkJCSAgdTggKmFzc29jX2luZm8pCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAKLQlhdGg2a2xfY2ZnODAyMTFfY29ubmVjdF9ldmVudChhciwgY2hhbm5lbCwgYnNzaWQsCisJYXRoNmtsX2NmZzgwMjExX2Nvbm5lY3RfZXZlbnQodmlmLCBjaGFubmVsLCBic3NpZCwKIAkJCQkgICAgICBsaXN0ZW5faW50LCBiZWFjb25faW50LAogCQkJCSAgICAgIG5ldF90eXBlLCBiZWFjb25faWVfbGVuLAogCQkJCSAgICAgIGFzc29jX3JlcV9sZW4sIGFzc29jX3Jlc3BfbGVuLAogCQkJCSAgICAgIGFzc29jX2luZm8pOwogCi0JbWVtY3B5KGFyLT5ic3NpZCwgYnNzaWQsIHNpemVvZihhci0+YnNzaWQpKTsKLQlhci0+YnNzX2NoID0gY2hhbm5lbDsKKwltZW1jcHkodmlmLT5ic3NpZCwgYnNzaWQsIHNpemVvZih2aWYtPmJzc2lkKSk7CisJdmlmLT5ic3NfY2ggPSBjaGFubmVsOwogCi0JaWYgKChhci0+bndfdHlwZSA9PSBJTkZSQV9ORVRXT1JLKSkKLQkJYXRoNmtsX3dtaV9saXN0ZW5pbnRlcnZhbF9jbWQoYXItPndtaSwgYXItPmxpc3Rlbl9pbnR2bF90LAorCWlmICgodmlmLT5ud190eXBlID09IElORlJBX05FVFdPUkspKQorCQlhdGg2a2xfd21pX2xpc3RlbmludGVydmFsX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgIGFyLT5saXN0ZW5faW50dmxfdCwKIAkJCQkJICAgICAgYXItPmxpc3Rlbl9pbnR2bF9iKTsKIAotCW5ldGlmX3dha2VfcXVldWUoYXItPm5ldF9kZXYpOworCW5ldGlmX3dha2VfcXVldWUodmlmLT5uZGV2KTsKIAogCS8qIFVwZGF0ZSBjb25uZWN0ICYgbGluayBzdGF0dXMgYXRvbWljYWxseSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZhci0+bG9jaywgZmxhZ3MpOwotCXNldF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpOwotCWNsZWFyX2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZyk7Ci0JbmV0aWZfY2Fycmllcl9vbihhci0+bmV0X2Rldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJnZpZi0+aWZfbG9jayk7CisJc2V0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKKwljbGVhcl9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CisJbmV0aWZfY2Fycmllcl9vbih2aWYtPm5kZXYpOworCXNwaW5fdW5sb2NrX2JoKCZ2aWYtPmlmX2xvY2spOwogCi0JYWdncl9yZXNldF9zdGF0ZShhci0+YWdncl9jbnR4dCk7Ci0JYXItPnJlY29ubmVjdF9mbGFnID0gMDsKKwlhZ2dyX3Jlc2V0X3N0YXRlKHZpZi0+YWdncl9jbnR4dCk7CisJdmlmLT5yZWNvbm5lY3RfZmxhZyA9IDA7CiAKLQlpZiAoKGFyLT5ud190eXBlID09IEFESE9DX05FVFdPUkspICYmIGFyLT5pYnNzX3BzX2VuYWJsZSkgeworCWlmICgodmlmLT5ud190eXBlID09IEFESE9DX05FVFdPUkspICYmIGFyLT5pYnNzX3BzX2VuYWJsZSkgewogCQltZW1zZXQoYXItPm5vZGVfbWFwLCAwLCBzaXplb2YoYXItPm5vZGVfbWFwKSk7CiAJCWFyLT5ub2RlX251bSA9IDA7CiAJCWFyLT5uZXh0X2VwX2lkID0gRU5EUE9JTlRfMjsKIAl9CiAKIAlpZiAoIWFyLT51c3JfYnNzX2ZpbHRlcikgewotCQlzZXRfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZhci0+ZmxhZyk7Ci0JCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCBDVVJSRU5UX0JTU19GSUxURVIsIDApOworCQlzZXRfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZ2aWYtPmZsYWdzKTsKKwkJYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJIENVUlJFTlRfQlNTX0ZJTFRFUiwgMCk7CiAJfQogfQogCi12b2lkIGF0aDZrbF90a2lwX21pY2Vycl9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTgga2V5aWQsIGJvb2wgaXNtY2FzdCkKK3ZvaWQgYXRoNmtsX3RraXBfbWljZXJyX2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IGtleWlkLCBib29sIGlzbWNhc3QpCiB7CiAJc3RydWN0IGF0aDZrbF9zdGEgKnN0YTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJdTggdHNjWzZdOworCiAJLyoKIAkgKiBGb3IgQVAgY2FzZSwga2V5aWQgd2lsbCBoYXZlIGFpZCBvZiBTVEEgd2hpY2ggc2VudCBwa3Qgd2l0aAogCSAqIE1JQyBlcnJvci4gVXNlIHRoaXMgYWlkIHRvIGdldCBNQUMgJiBzZW5kIGl0IHRvIGhvc3RhcGQuCiAJICovCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKIAkJc3RhID0gYXRoNmtsX2ZpbmRfc3RhX2J5X2FpZChhciwgKGtleWlkID4+IDIpKTsKIAkJaWYgKCFzdGEpCiAJCQlyZXR1cm47CkBAIC0xMDgxLDE5ICs3MTEsMjAgQEAKIAkJCSAgICJhcCB0a2lwIG1pYyBlcnJvciByZWNlaXZlZCBmcm9tIGFpZD0lZFxuIiwga2V5aWQpOwogCiAJCW1lbXNldCh0c2MsIDAsIHNpemVvZih0c2MpKTsgLyogRklYOiBnZXQgY29ycmVjdCBUU0MgKi8KLQkJY2ZnODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShhci0+bmV0X2Rldiwgc3RhLT5tYWMsCisJCWNmZzgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUodmlmLT5uZGV2LCBzdGEtPm1hYywKIAkJCQkJICAgICBOTDgwMjExX0tFWVRZUEVfUEFJUldJU0UsIGtleWlkLAogCQkJCQkgICAgIHRzYywgR0ZQX0tFUk5FTCk7CiAJfSBlbHNlCi0JCWF0aDZrbF9jZmc4MDIxMV90a2lwX21pY2Vycl9ldmVudChhciwga2V5aWQsIGlzbWNhc3QpOworCQlhdGg2a2xfY2ZnODAyMTFfdGtpcF9taWNlcnJfZXZlbnQodmlmLCBrZXlpZCwgaXNtY2FzdCk7CiAKIH0KIAotc3RhdGljIHZvaWQgYXRoNmtsX3VwZGF0ZV90YXJnZXRfc3RhdHMoc3RydWN0IGF0aDZrbCAqYXIsIHU4ICpwdHIsIHUzMiBsZW4pCitzdGF0aWMgdm9pZCBhdGg2a2xfdXBkYXRlX3RhcmdldF9zdGF0cyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCAqcHRyLCB1MzIgbGVuKQogewogCXN0cnVjdCB3bWlfdGFyZ2V0X3N0YXRzICp0Z3Rfc3RhdHMgPQogCQkoc3RydWN0IHdtaV90YXJnZXRfc3RhdHMgKikgcHRyOwotCXN0cnVjdCB0YXJnZXRfc3RhdHMgKnN0YXRzID0gJmFyLT50YXJnZXRfc3RhdHM7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOworCXN0cnVjdCB0YXJnZXRfc3RhdHMgKnN0YXRzID0gJnZpZi0+dGFyZ2V0X3N0YXRzOwogCXN0cnVjdCB0a2lwX2NjbXBfc3RhdHMgKmNjbXBfc3RhdHM7CiAJdTggYWM7CiAKQEAgLTExODksOCArODIwLDggQEAKIAlzdGF0cy0+d293X2V2dF9kaXNjYXJkZWQgKz0KIAkJbGUxNl90b19jcHUodGd0X3N0YXRzLT53b3dfc3RhdHMud293X2V2dF9kaXNjYXJkZWQpOwogCi0JaWYgKHRlc3RfYml0KFNUQVRTX1VQREFURV9QRU5ELCAmYXItPmZsYWcpKSB7Ci0JCWNsZWFyX2JpdChTVEFUU19VUERBVEVfUEVORCwgJmFyLT5mbGFnKTsKKwlpZiAodGVzdF9iaXQoU1RBVFNfVVBEQVRFX1BFTkQsICZ2aWYtPmZsYWdzKSkgeworCQljbGVhcl9iaXQoU1RBVFNfVVBEQVRFX1BFTkQsICZ2aWYtPmZsYWdzKTsKIAkJd2FrZV91cCgmYXItPmV2ZW50X3dxKTsKIAl9CiB9CkBAIC0xMjAwLDE0ICs4MzEsMTUgQEAKIAkqdmFyID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKnZhcikgKyBsZTMyX3RvX2NwdSh2YWwpKTsKIH0KIAotdm9pZCBhdGg2a2xfdGd0X3N0YXRzX2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqcHRyLCB1MzIgbGVuKQordm9pZCBhdGg2a2xfdGd0X3N0YXRzX2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4ICpwdHIsIHUzMiBsZW4pCiB7CiAJc3RydWN0IHdtaV9hcF9tb2RlX3N0YXQgKnAgPSAoc3RydWN0IHdtaV9hcF9tb2RlX3N0YXQgKikgcHRyOworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAlzdHJ1Y3Qgd21pX2FwX21vZGVfc3RhdCAqYXAgPSAmYXItPmFwX3N0YXRzOwogCXN0cnVjdCB3bWlfcGVyX3N0YV9zdGF0ICpzdF9hcCwgKnN0X3A7CiAJdTggYWM7CiAKLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgeworCWlmICh2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSykgewogCQlpZiAobGVuIDwgc2l6ZW9mKCpwKSkKIAkJCXJldHVybjsKIApAQCAtMTIyNiw3ICs4NTgsNyBAQAogCQl9CiAKIAl9IGVsc2UgewotCQlhdGg2a2xfdXBkYXRlX3RhcmdldF9zdGF0cyhhciwgcHRyLCBsZW4pOworCQlhdGg2a2xfdXBkYXRlX3RhcmdldF9zdGF0cyh2aWYsIHB0ciwgbGVuKTsKIAl9CiB9CiAKQEAgLTEyNDUsMTEgKzg3NywxMiBAQAogCXdha2VfdXAoJmFyLT5ldmVudF93cSk7CiB9CiAKLXZvaWQgYXRoNmtsX3BzcG9sbF9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTggYWlkKQordm9pZCBhdGg2a2xfcHNwb2xsX2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IGFpZCkKIHsKIAlzdHJ1Y3QgYXRoNmtsX3N0YSAqY29ubjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWJvb2wgcHNxX2VtcHR5ID0gZmFsc2U7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCiAJY29ubiA9IGF0aDZrbF9maW5kX3N0YV9ieV9haWQoYXIsIGFpZCk7CiAKQEAgLTEyNzIsNyArOTA1LDcgQEAKIAlzcGluX3VubG9ja19iaCgmY29ubi0+cHNxX2xvY2spOwogCiAJY29ubi0+c3RhX2ZsYWdzIHw9IFNUQV9QU19QT0xMRUQ7Ci0JYXRoNmtsX2RhdGFfdHgoc2tiLCBhci0+bmV0X2Rldik7CisJYXRoNmtsX2RhdGFfdHgoc2tiLCB2aWYtPm5kZXYpOwogCWNvbm4tPnN0YV9mbGFncyAmPSB+U1RBX1BTX1BPTExFRDsKIAogCXNwaW5fbG9ja19iaCgmY29ubi0+cHNxX2xvY2spOwpAQCAtMTI4MCwxMyArOTEzLDE0IEBACiAJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnBzcV9sb2NrKTsKIAogCWlmIChwc3FfZW1wdHkpCi0JCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwgY29ubi0+YWlkLCAwKTsKKwkJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIGNvbm4tPmFpZCwgMCk7CiB9CiAKLXZvaWQgYXRoNmtsX2R0aW1leHBpcnlfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIpCit2b2lkIGF0aDZrbF9kdGltZXhwaXJ5X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJYm9vbCBtY2FzdHFfZW1wdHkgPSBmYWxzZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAogCS8qCiAJICogSWYgdGhlcmUgYXJlIG5vIGFzc29jaWF0ZWQgU1RBcywgaWdub3JlIHRoZSBEVElNIGV4cGlyeSBldmVudC4KQEAgLTEzMDgsMzEgKzk0MiwzMSBAQAogCQlyZXR1cm47CiAKIAkvKiBzZXQgdGhlIFNUQSBmbGFnIHRvIGR0aW1fZXhwaXJlZCBmb3IgdGhlIGZyYW1lIHRvIGdvIG91dCAqLwotCXNldF9iaXQoRFRJTV9FWFBJUkVELCAmYXItPmZsYWcpOworCXNldF9iaXQoRFRJTV9FWFBJUkVELCAmdmlmLT5mbGFncyk7CiAKIAlzcGluX2xvY2tfYmgoJmFyLT5tY2FzdHBzcV9sb2NrKTsKIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZhci0+bWNhc3Rwc3EpKSAhPSBOVUxMKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZhci0+bWNhc3Rwc3FfbG9jayk7CiAKLQkJYXRoNmtsX2RhdGFfdHgoc2tiLCBhci0+bmV0X2Rldik7CisJCWF0aDZrbF9kYXRhX3R4KHNrYiwgdmlmLT5uZGV2KTsKIAogCQlzcGluX2xvY2tfYmgoJmFyLT5tY2FzdHBzcV9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5tY2FzdHBzcV9sb2NrKTsKIAotCWNsZWFyX2JpdChEVElNX0VYUElSRUQsICZhci0+ZmxhZyk7CisJY2xlYXJfYml0KERUSU1fRVhQSVJFRCwgJnZpZi0+ZmxhZ3MpOwogCiAJLyogY2xlYXIgdGhlIExTQiBvZiB0aGUgQml0TWFwQ3RsIGZpZWxkIG9mIHRoZSBUSU0gSUUgKi8KLQlhdGg2a2xfd21pX3NldF9wdmJfY21kKGFyLT53bWksIE1DQVNUX0FJRCwgMCk7CisJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIE1DQVNUX0FJRCwgMCk7CiB9CiAKLXZvaWQgYXRoNmtsX2Rpc2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHJlYXNvbiwgdTggKmJzc2lkLAordm9pZCBhdGg2a2xfZGlzY29ubmVjdF9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCByZWFzb24sIHU4ICpic3NpZCwKIAkJCSAgICAgdTggYXNzb2NfcmVzcF9sZW4sIHU4ICphc3NvY19pbmZvLAogCQkJICAgICB1MTYgcHJvdF9yZWFzb25fc3RhdHVzKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKIAkJaWYgKCFhdGg2a2xfcmVtb3ZlX3N0YShhciwgYnNzaWQsIHByb3RfcmVhc29uX3N0YXR1cykpCiAJCQlyZXR1cm47CiAKQEAgLTEzNDQsMzEgKzk3OCwzMSBAQAogCiAJCQkvKiBjbGVhciB0aGUgTFNCIG9mIHRoZSBUSU0gSUUncyBCaXRNYXBDdGwgZmllbGQgKi8KIAkJCWlmICh0ZXN0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZykpCi0JCQkJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCBNQ0FTVF9BSUQsIDApOworCQkJCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJICAgICAgIE1DQVNUX0FJRCwgMCk7CiAJCX0KIAogCQlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGJzc2lkKSkgewogCQkJLyogc2VuZCBldmVudCB0byBhcHBsaWNhdGlvbiAqLwotCQkJY2ZnODAyMTFfZGVsX3N0YShhci0+bmV0X2RldiwgYnNzaWQsIEdGUF9LRVJORUwpOworCQkJY2ZnODAyMTFfZGVsX3N0YSh2aWYtPm5kZXYsIGJzc2lkLCBHRlBfS0VSTkVMKTsKIAkJfQogCi0JCWlmIChtZW1jbXAoYXItPm5ldF9kZXYtPmRldl9hZGRyLCBic3NpZCwgRVRIX0FMRU4pID09IDApIHsKLQkJCW1lbXNldChhci0+d2VwX2tleV9saXN0LCAwLCBzaXplb2YoYXItPndlcF9rZXlfbGlzdCkpOwotCQkJY2xlYXJfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKTsKKwkJaWYgKG1lbWNtcCh2aWYtPm5kZXYtPmRldl9hZGRyLCBic3NpZCwgRVRIX0FMRU4pID09IDApIHsKKwkJCW1lbXNldCh2aWYtPndlcF9rZXlfbGlzdCwgMCwgc2l6ZW9mKHZpZi0+d2VwX2tleV9saXN0KSk7CisJCQljbGVhcl9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncyk7CiAJCX0KIAkJcmV0dXJuOwogCX0KIAotCWF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KGFyLCByZWFzb24sIGJzc2lkLAorCWF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHZpZiwgcmVhc29uLCBic3NpZCwKIAkJCQkgICAgICAgYXNzb2NfcmVzcF9sZW4sIGFzc29jX2luZm8sCiAJCQkJICAgICAgIHByb3RfcmVhc29uX3N0YXR1cyk7CiAKLQlhZ2dyX3Jlc2V0X3N0YXRlKGFyLT5hZ2dyX2NudHh0KTsKKwlhZ2dyX3Jlc2V0X3N0YXRlKHZpZi0+YWdncl9jbnR4dCk7CiAKLQlkZWxfdGltZXIoJmFyLT5kaXNjb25uZWN0X3RpbWVyKTsKKwlkZWxfdGltZXIoJnZpZi0+ZGlzY29ubmVjdF90aW1lcik7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DT05ORUNULAotCQkgICAiZGlzY29ubmVjdCByZWFzb24gaXMgJWRcbiIsIHJlYXNvbik7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiZGlzY29ubmVjdCByZWFzb24gaXMgJWRcbiIsIHJlYXNvbik7CiAKIAkvKgogCSAqIElmIHRoZSBldmVudCBpcyBkdWUgdG8gZGlzY29ubmVjdCBjbWQgZnJvbSB0aGUgaG9zdCwgb25seSB0aGV5CkBAIC0xMzc3LDgzICsxMDExLDk4IEBACiAJICovCiAJaWYgKHJlYXNvbiA9PSBESVNDT05ORUNUX0NNRCkgewogCQlpZiAoIWFyLT51c3JfYnNzX2ZpbHRlciAmJiB0ZXN0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZykpCi0JCQlhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgTk9ORV9CU1NfRklMVEVSLCAwKTsKKwkJCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgTk9ORV9CU1NfRklMVEVSLCAwKTsKIAl9IGVsc2UgewotCQlzZXRfYml0KENPTk5FQ1RfUEVORCwgJmFyLT5mbGFnKTsKKwkJc2V0X2JpdChDT05ORUNUX1BFTkQsICZ2aWYtPmZsYWdzKTsKIAkJaWYgKCgocmVhc29uID09IEFTU09DX0ZBSUxFRCkgJiYKIAkJICAgIChwcm90X3JlYXNvbl9zdGF0dXMgPT0gMHgxMSkpIHx8CiAJCSAgICAoKHJlYXNvbiA9PSBBU1NPQ19GQUlMRUQpICYmIChwcm90X3JlYXNvbl9zdGF0dXMgPT0gMHgwKQotCQkgICAgICYmIChhci0+cmVjb25uZWN0X2ZsYWcgPT0gMSkpKSB7Ci0JCQlzZXRfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKTsKKwkJICAgICAmJiAodmlmLT5yZWNvbm5lY3RfZmxhZyA9PSAxKSkpIHsKKwkJCXNldF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKIAkvKiB1cGRhdGUgY29ubmVjdCAmIGxpbmsgc3RhdHVzIGF0b21pY2FsbHkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXItPmxvY2ssIGZsYWdzKTsKLQljbGVhcl9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpOwotCW5ldGlmX2NhcnJpZXJfb2ZmKGFyLT5uZXRfZGV2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhci0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19iaCgmdmlmLT5pZl9sb2NrKTsKKwljbGVhcl9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncyk7CisJbmV0aWZfY2Fycmllcl9vZmYodmlmLT5uZGV2KTsKKwlzcGluX3VubG9ja19iaCgmdmlmLT5pZl9sb2NrKTsKIAotCWlmICgocmVhc29uICE9IENTRVJWX0RJU0NPTk5FQ1QpIHx8IChhci0+cmVjb25uZWN0X2ZsYWcgIT0gMSkpCi0JCWFyLT5yZWNvbm5lY3RfZmxhZyA9IDA7CisJaWYgKChyZWFzb24gIT0gQ1NFUlZfRElTQ09OTkVDVCkgfHwgKHZpZi0+cmVjb25uZWN0X2ZsYWcgIT0gMSkpCisJCXZpZi0+cmVjb25uZWN0X2ZsYWcgPSAwOwogCiAJaWYgKHJlYXNvbiAhPSBDU0VSVl9ESVNDT05ORUNUKQogCQlhci0+dXNlcl9rZXlfY3RybCA9IDA7CiAKLQluZXRpZl9zdG9wX3F1ZXVlKGFyLT5uZXRfZGV2KTsKLQltZW1zZXQoYXItPmJzc2lkLCAwLCBzaXplb2YoYXItPmJzc2lkKSk7Ci0JYXItPmJzc19jaCA9IDA7CisJbmV0aWZfc3RvcF9xdWV1ZSh2aWYtPm5kZXYpOworCW1lbXNldCh2aWYtPmJzc2lkLCAwLCBzaXplb2YodmlmLT5ic3NpZCkpOworCXZpZi0+YnNzX2NoID0gMDsKIAogCWF0aDZrbF90eF9kYXRhX2NsZWFudXAoYXIpOwogfQogCitzdHJ1Y3QgYXRoNmtsX3ZpZiAqYXRoNmtsX3ZpZl9maXJzdChzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOworCisJc3Bpbl9sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmYXItPnZpZl9saXN0KSkgeworCQlzcGluX3VubG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXZpZiA9IGxpc3RfZmlyc3RfZW50cnkoJmFyLT52aWZfbGlzdCwgc3RydWN0IGF0aDZrbF92aWYsIGxpc3QpOworCisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCisJcmV0dXJuIHZpZjsKK30KKwogc3RhdGljIGludCBhdGg2a2xfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFyLT5sb2NrLCBmbGFncyk7CisJc2V0X2JpdChXTEFOX0VOQUJMRUQsICZ2aWYtPmZsYWdzKTsKIAotCXNldF9iaXQoV0xBTl9FTkFCTEVELCAmYXItPmZsYWcpOwotCi0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSkgeworCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewogCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAl9IGVsc2UKIAkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyLT5sb2NrLCBmbGFncyk7Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKLQlhdGg2a2xfZGlzY29ubmVjdChhcik7CisJYXRoNmtsX2Rpc2Nvbm5lY3QodmlmKTsKIAogCWlmICh0ZXN0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZykpIHsKLQkJaWYgKGF0aDZrbF93bWlfc2NhbnBhcmFtc19jbWQoYXItPndtaSwgMHhGRkZGLCAwLCAwLCAwLCAwLCAwLCAwLAotCQkJCQkgICAgICAwLCAwLCAwKSkKKwkJaWYgKGF0aDZrbF93bWlfc2NhbnBhcmFtc19jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCAweEZGRkYsCisJCQkJCSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQogCQkJcmV0dXJuIC1FSU87CiAKLQkJY2xlYXJfYml0KFdMQU5fRU5BQkxFRCwgJmFyLT5mbGFnKTsKIAl9CiAKLQlhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChhciwgLUVDQU5DRUxFRCk7CisJYXRoNmtsX2NmZzgwMjExX3NjYW5fY29tcGxldGVfZXZlbnQodmlmLCB0cnVlKTsKKworCWNsZWFyX2JpdChXTEFOX0VOQUJMRUQsICZ2aWYtPmZsYWdzKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF0aDZrbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlyZXR1cm4gJmFyLT5uZXRfc3RhdHM7CisJcmV0dXJuICZ2aWYtPm5ldF9zdGF0czsKIH0KIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBhdGg2a2xfbmV0ZGV2X29wcyA9IHsKQEAgLTE0NjYsNiArMTExNSw3IEBACiB2b2lkIGluaXRfbmV0ZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJZGV2LT5uZXRkZXZfb3BzID0gJmF0aDZrbF9uZXRkZXZfb3BzOworCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBBVEg2S0xfVFhfVElNRU9VVDsKIAogCWRldi0+bmVlZGVkX2hlYWRyb29tID0gRVRIX0hMRU47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvc2Rpby5jCmluZGV4IGYxZGMzMTEuLmU2OWNhNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvc2Rpby5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9tbWMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgpAQCAtMjEsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3NkLmg+Ci0jaW5jbHVkZSAiaHRjX2hpZi5oIgorI2luY2x1ZGUgImhpZi5oIgogI2luY2x1ZGUgImhpZi1vcHMuaCIKICNpbmNsdWRlICJ0YXJnZXQuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtNDUsNiArNDYsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgc2NhdF9yZXE7CiAKIAlzcGlubG9ja190IHNjYXRfbG9jazsKKwlib29sIHNjYXR0ZXJfZW5hYmxlZDsKKwogCWJvb2wgaXNfZGlzYWJsZWQ7CiAJYXRvbWljX3QgaXJxX2hhbmRsaW5nOwogCWNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQ7CkBAIC0xMzQsNiArMTM3LDggQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAorCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwogCWlmIChyZXF1ZXN0ICYgSElGX1dSSVRFKSB7CiAJCS8qIEZJWE1FOiBsb29rcyBsaWtlIHVnbHkgd29ya2Fyb3VuZCBmb3Igc29tZXRoaW5nICovCiAJCWlmIChhZGRyID49IEhJRl9NQk9YX0JBU0VfQUREUiAmJgpAQCAtMTU1LDYgKzE2MCw4IEBACiAJCQlyZXQgPSBzZGlvX21lbWNweV9mcm9taW8oZnVuYywgYnVmLCBhZGRyLCBsZW4pOwogCX0KIAorCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NESU8sICIlcyBhZGRyIDB4JXglcyBidWYgMHglcCBsZW4gJWRcbiIsCiAJCSAgIHJlcXVlc3QgJiBISUZfV1JJVEUgPyAid3IiIDogInJkIiwgYWRkciwKIAkJICAgcmVxdWVzdCAmIEhJRl9GSVhFRF9BRERSRVNTID8gIiAoZml4ZWQpIiA6ICIiLCBidWYsIGxlbik7CkBAIC0xNjYsMTIgKzE3MywxMSBAQAogc3RhdGljIHN0cnVjdCBidXNfcmVxdWVzdCAqYXRoNmtsX3NkaW9fYWxsb2NfYnVzcmVxKHN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbykKIHsKIAlzdHJ1Y3QgYnVzX3JlcXVlc3QgKmJ1c19yZXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFyX3NkaW8tPmxvY2ssIGZsYWcpOworCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+bG9jayk7CiAKIAlpZiAobGlzdF9lbXB0eSgmYXJfc2Rpby0+YnVzX3JlcV9mcmVlcSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+bG9jaywgZmxhZyk7CisJCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT5sb2NrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xNzksNyArMTg1LDcgQEAKIAkJCQkgICBzdHJ1Y3QgYnVzX3JlcXVlc3QsIGxpc3QpOwogCWxpc3RfZGVsKCZidXNfcmVxLT5saXN0KTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPmxvY2ssIGZsYWcpOworCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT5sb2NrKTsKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU0NBVFRFUiwgIiVzOiBidXMgcmVxdWVzdCAweCVwXG4iLAogCQkgICBfX2Z1bmNfXywgYnVzX3JlcSk7CiAKQEAgLTE4OSwxNCArMTk1LDEyIEBACiBzdGF0aWMgdm9pZCBhdGg2a2xfc2Rpb19mcmVlX2J1c19yZXEoc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvLAogCQkJCSAgICAgc3RydWN0IGJ1c19yZXF1ZXN0ICpidXNfcmVxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZzsKLQogCWF0aDZrbF9kYmcoQVRINktMX0RCR19TQ0FUVEVSLCAiJXM6IGJ1cyByZXF1ZXN0IDB4JXBcbiIsCiAJCSAgIF9fZnVuY19fLCBidXNfcmVxKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT5sb2NrLCBmbGFnKTsKKwlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPmxvY2spOwogCWxpc3RfYWRkX3RhaWwoJmJ1c19yZXEtPmxpc3QsICZhcl9zZGlvLT5idXNfcmVxX2ZyZWVxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT5sb2NrLCBmbGFnKTsKKwlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+bG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDZrbF9zZGlvX3NldHVwX3NjYXRfZGF0YShzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpzY2F0X3JlcSwKQEAgLTI5MCwxMCArMjk0LDE0IEBACiAJbW1jX3JlcS5jbWQgPSAmY21kOwogCW1tY19yZXEuZGF0YSA9ICZkYXRhOwogCisJc2Rpb19jbGFpbV9ob3N0KGFyX3NkaW8tPmZ1bmMpOworCiAJbW1jX3NldF9kYXRhX3RpbWVvdXQoJmRhdGEsIGFyX3NkaW8tPmZ1bmMtPmNhcmQpOwogCS8qIHN5bmNocm9ub3VzIGNhbGwgdG8gcHJvY2VzcyByZXF1ZXN0ICovCiAJbW1jX3dhaXRfZm9yX3JlcShhcl9zZGlvLT5mdW5jLT5jYXJkLT5ob3N0LCAmbW1jX3JlcSk7CiAKKwlzZGlvX3JlbGVhc2VfaG9zdChhcl9zZGlvLT5mdW5jKTsKKwogCXN0YXR1cyA9IGNtZC5lcnJvciA/IGNtZC5lcnJvciA6IGRhdGEuZXJyb3I7CiAKIHNjYXRfY29tcGxldGU6CkBAIC0zOTQsMTEgKzQwMiw5IEBACiAJfSBlbHNlCiAJCXRidWYgPSBidWY7CiAKLQlzZGlvX2NsYWltX2hvc3QoYXJfc2Rpby0+ZnVuYyk7CiAJcmV0ID0gYXRoNmtsX3NkaW9faW8oYXJfc2Rpby0+ZnVuYywgcmVxdWVzdCwgYWRkciwgdGJ1ZiwgbGVuKTsKIAlpZiAoKHJlcXVlc3QgJiBISUZfUkVBRCkgJiYgYm91bmNlZCkKIAkJbWVtY3B5KGJ1ZiwgdGJ1ZiwgbGVuKTsKLQlzZGlvX3JlbGVhc2VfaG9zdChhcl9zZGlvLT5mdW5jKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00MTcsMjkgKzQyMywyNSBAQAogCQkJCQkJICAgICByZXEtPnJlcXVlc3QpOwogCQljb250ZXh0ID0gcmVxLT5wYWNrZXQ7CiAJCWF0aDZrbF9zZGlvX2ZyZWVfYnVzX3JlcShhcl9zZGlvLCByZXEpOwotCQlhdGg2a2xkZXZfcndfY29tcF9oYW5kbGVyKGNvbnRleHQsIHN0YXR1cyk7CisJCWF0aDZrbF9oaWZfcndfY29tcF9oYW5kbGVyKGNvbnRleHQsIHN0YXR1cyk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBhdGg2a2xfc2Rpb193cml0ZV9hc3luY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW87Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgYnVzX3JlcXVlc3QgKnJlcSwgKnRtcF9yZXE7CiAKIAlhcl9zZGlvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGg2a2xfc2Rpbywgd3JfYXN5bmNfd29yayk7Ci0Jc2Rpb19jbGFpbV9ob3N0KGFyX3NkaW8tPmZ1bmMpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcF9yZXEsICZhcl9zZGlvLT53cl9hc3luY3EsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJnJlcS0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCQlfX2F0aDZrbF9zZGlvX3dyaXRlX2FzeW5jKGFyX3NkaW8sIHJlcSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2ssIGZsYWdzKTsKLQotCXNkaW9fcmVsZWFzZV9ob3N0KGFyX3NkaW8tPmZ1bmMpOworCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoNmtsX3NkaW9faXJxX2hhbmRsZXIoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKQEAgLTQ1OCwyMCArNDYwLDIzIEBACiAJICovCiAJc2Rpb19yZWxlYXNlX2hvc3QoYXJfc2Rpby0+ZnVuYyk7CiAKLQlzdGF0dXMgPSBhdGg2a2xkZXZfaW50cl9iaF9oYW5kbGVyKGFyX3NkaW8tPmFyKTsKKwlzdGF0dXMgPSBhdGg2a2xfaGlmX2ludHJfYmhfaGFuZGxlcihhcl9zZGlvLT5hcik7CiAJc2Rpb19jbGFpbV9ob3N0KGFyX3NkaW8tPmZ1bmMpOwogCWF0b21pY19zZXQoJmFyX3NkaW8tPmlycV9oYW5kbGluZywgMCk7CiAJV0FSTl9PTihzdGF0dXMgJiYgc3RhdHVzICE9IC1FQ0FOQ0VMRUQpOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF9zZGlvX3Bvd2VyX29uKHN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbykKK3N0YXRpYyBpbnQgYXRoNmtsX3NkaW9fcG93ZXJfb24oc3RydWN0IGF0aDZrbCAqYXIpCiB7CisJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7CiAJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGFyX3NkaW8tPmZ1bmM7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIWFyX3NkaW8tPmlzX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKIAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAic2RpbyBwb3dlciBvblxuIik7CisKIAlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CiAKIAlyZXQgPSBzZGlvX2VuYWJsZV9mdW5jKGZ1bmMpOwpAQCAtNDk0LDEzICs0OTksMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF9zZGlvX3Bvd2VyX29mZihzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8pCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX3Bvd2VyX29mZihzdHJ1Y3QgYXRoNmtsICphcikKIHsKKwlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAlpbnQgcmV0OwogCiAJaWYgKGFyX3NkaW8tPmlzX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKIAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAic2RpbyBwb3dlciBvZmZcbiIpOworCiAJLyogRGlzYWJsZSB0aGUgY2FyZCAqLwogCXNkaW9fY2xhaW1faG9zdChhcl9zZGlvLT5mdW5jKTsKIAlyZXQgPSBzZGlvX2Rpc2FibGVfZnVuYyhhcl9zZGlvLT5mdW5jKTsKQEAgLTUyMCw3ICs1MjgsNiBAQAogewogCXN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbyA9IGF0aDZrbF9zZGlvX3ByaXYoYXIpOwogCXN0cnVjdCBidXNfcmVxdWVzdCAqYnVzX3JlcTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJYnVzX3JlcSA9IGF0aDZrbF9zZGlvX2FsbG9jX2J1c3JlcShhcl9zZGlvKTsKIApAQCAtNTMzLDkgKzU0MCw5IEBACiAJYnVzX3JlcS0+cmVxdWVzdCA9IHJlcXVlc3Q7CiAJYnVzX3JlcS0+cGFja2V0ID0gcGFja2V0OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJmJ1c19yZXEtPmxpc3QsICZhcl9zZGlvLT53cl9hc3luY3EpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jayk7CiAJcXVldWVfd29yayhhci0+YXRoNmtsX3dxLCAmYXJfc2Rpby0+d3JfYXN5bmNfd29yayk7CiAKIAlyZXR1cm4gMDsKQEAgLTU4MSw5ICs1ODgsOCBAQAogewogCXN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbyA9IGF0aDZrbF9zZGlvX3ByaXYoYXIpOwogCXN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKm5vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT5zY2F0X2xvY2ssIGZsYWcpOworCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAogCWlmICghbGlzdF9lbXB0eSgmYXJfc2Rpby0+c2NhdF9yZXEpKSB7CiAJCW5vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhcl9zZGlvLT5zY2F0X3JlcSwKQEAgLTU5MSw3ICs1OTcsNyBAQAogCQlsaXN0X2RlbCgmbm9kZS0+bGlzdCk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAogCXJldHVybiBub2RlOwogfQpAQCAtNjAwLDEzICs2MDYsMTIgQEAKIAkJCQkJc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqc19yZXEpCiB7CiAJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFyX3NkaW8tPnNjYXRfbG9jaywgZmxhZyk7CisJc3Bpbl9sb2NrX2JoKCZhcl9zZGlvLT5zY2F0X2xvY2spOwogCiAJbGlzdF9hZGRfdGFpbCgmc19yZXEtPmxpc3QsICZhcl9zZGlvLT5zY2F0X3JlcSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT5zY2F0X2xvY2ssIGZsYWcpOworCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT5zY2F0X2xvY2spOwogCiB9CiAKQEAgLTYxNyw3ICs2MjIsNiBAQAogCXN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbyA9IGF0aDZrbF9zZGlvX3ByaXYoYXIpOwogCXUzMiByZXF1ZXN0ID0gc2NhdF9yZXEtPnJlcTsKIAlpbnQgc3RhdHVzID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFzY2F0X3JlcS0+bGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYyNiwxNCArNjMwLDEyIEBACiAJCSJoaWYtc2NhdHRlcjogdG90YWwgbGVuOiAlZCBzY2F0dGVyIGVudHJpZXM6ICVkXG4iLAogCQlzY2F0X3JlcS0+bGVuLCBzY2F0X3JlcS0+c2NhdF9lbnRyaWVzKTsKIAotCWlmIChyZXF1ZXN0ICYgSElGX1NZTkNIUk9OT1VTKSB7Ci0JCXNkaW9fY2xhaW1faG9zdChhcl9zZGlvLT5mdW5jKTsKKwlpZiAocmVxdWVzdCAmIEhJRl9TWU5DSFJPTk9VUykKIAkJc3RhdHVzID0gYXRoNmtsX3NkaW9fc2NhdF9ydyhhcl9zZGlvLCBzY2F0X3JlcS0+YnVzcmVxdWVzdCk7Ci0JCXNkaW9fcmVsZWFzZV9ob3N0KGFyX3NkaW8tPmZ1bmMpOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJZWxzZSB7CisJCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jayk7CiAJCWxpc3RfYWRkX3RhaWwoJnNjYXRfcmVxLT5idXNyZXF1ZXN0LT5saXN0LCAmYXJfc2Rpby0+d3JfYXN5bmNxKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jayk7CiAJCXF1ZXVlX3dvcmsoYXItPmF0aDZrbF93cSwgJmFyX3NkaW8tPndyX2FzeW5jX3dvcmspOwogCX0KIApAQCAtNjQ1LDIzICs2NDcsMjcgQEAKIHsKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAlzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpzX3JlcSwgKnRtcF9yZXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJLyogZW1wdHkgdGhlIGZyZWUgbGlzdCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT5zY2F0X2xvY2ssIGZsYWcpOworCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc19yZXEsIHRtcF9yZXEsICZhcl9zZGlvLT5zY2F0X3JlcSwgbGlzdCkgewogCQlsaXN0X2RlbCgmc19yZXEtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT5zY2F0X2xvY2ssIGZsYWcpOworCQlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAorCQkvKgorCQkgKiBGSVhNRTogc2hvdWxkIHdlIGFsc28gY2FsbCBjb21wbGV0aW9uIGhhbmRsZXIgd2l0aAorCQkgKiBhdGg2a2xfaGlmX3J3X2NvbXBfaGFuZGxlcigpIHdpdGggc3RhdHVzIC1FQ0FOQ0VMRUQgc28KKwkJICogdGhhdCB0aGUgcGFja2V0IGlzIHByb3Blcmx5IGZyZWVkPworCQkgKi8KIAkJaWYgKHNfcmVxLT5idXNyZXF1ZXN0KQogCQkJYXRoNmtsX3NkaW9fZnJlZV9idXNfcmVxKGFyX3NkaW8sIHNfcmVxLT5idXNyZXF1ZXN0KTsKIAkJa2ZyZWUoc19yZXEtPnZpcnRfZG1hX2J1Zik7CiAJCWtmcmVlKHNfcmVxLT5zZ2VudHJpZXMpOwogCQlrZnJlZShzX3JlcSk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFyX3NkaW8tPnNjYXRfbG9jaywgZmxhZyk7CisJCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIH0KIAogLyogc2V0dXAgb2YgSElGIHNjYXR0ZXIgcmVzb3VyY2VzICovCkBAIC02NzIsNiArNjc4LDExIEBACiAJaW50IHJldDsKIAlib29sIHZpcnRfc2NhdCA9IGZhbHNlOwogCisJaWYgKGFyX3NkaW8tPnNjYXR0ZXJfZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlhcl9zZGlvLT5zY2F0dGVyX2VuYWJsZWQgPSB0cnVlOworCiAJLyogY2hlY2sgaWYgaG9zdCBzdXBwb3J0cyBzY2F0dGVyIGFuZCBpdCBtZWV0cyBvdXIgcmVxdWlyZW1lbnRzICovCiAJaWYgKGFyX3NkaW8tPmZ1bmMtPmNhcmQtPmhvc3QtPm1heF9zZWdzIDwgTUFYX1NDQVRURVJfRU5UUklFU19QRVJfUkVRKSB7CiAJCWF0aDZrbF9lcnIoImhvc3Qgb25seSBzdXBwb3J0cyBzY2F0dGVyIG9mIDolZCBlbnRyaWVzLCBuZWVkOiAlZFxuIiwKQEAgLTY4Niw4ICs2OTcsOCBAQAogCQkJCU1BWF9TQ0FUVEVSX1JFUVVFU1RTLCB2aXJ0X3NjYXQpOwogCiAJCWlmICghcmV0KSB7Ci0JCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU0NBVFRFUiwKLQkJCQkgICAiaGlmLXNjYXR0ZXIgZW5hYmxlZDogbWF4IHNjYXR0ZXIgcmVxIDogJWQgZW50cmllczogJWRcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwKKwkJCQkgICAiaGlmLXNjYXR0ZXIgZW5hYmxlZCByZXF1ZXN0cyAlZCBlbnRyaWVzICVkXG4iLAogCQkJCSAgIE1BWF9TQ0FUVEVSX1JFUVVFU1RTLAogCQkJCSAgIE1BWF9TQ0FUVEVSX0VOVFJJRVNfUEVSX1JFUSk7CiAKQEAgLTcxMSw4ICs3MjIsOCBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19TQ0FUVEVSLAotCQkJICAgIlZpdHVhbCBzY2F0dGVyIGVuYWJsZWQsIG1heF9zY2F0X3JlcTolZCwgZW50cmllczolZFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCQkgICAidmlydHVhbCBzY2F0dGVyIGVuYWJsZWQgcmVxdWVzdHMgJWQgZW50cmllcyAlZFxuIiwKIAkJCSAgIEFUSDZLTF9TQ0FUVEVSX1JFUVMsIEFUSDZLTF9TQ0FUVEVSX0VOVFJJRVNfUEVSX1JFUSk7CiAKIAkJdGFyZ2V0LT5tYXhfc2NhdF9lbnRyaWVzID0gQVRINktMX1NDQVRURVJfRU5UUklFU19QRVJfUkVROwpAQCAtNzIzLDcgKzczNCw0NyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF9zZGlvX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIpCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX2NvbmZpZyhzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gYXJfc2Rpby0+ZnVuYzsKKwlpbnQgcmV0OworCisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCisJaWYgKChhcl9zZGlvLT5pZC0+ZGV2aWNlICYgTUFOVUZBQ1RVUkVSX0lEX0FUSDZLTF9CQVNFX01BU0spID49CisJICAgIE1BTlVGQUNUVVJFUl9JRF9BUjYwMDNfQkFTRSkgeworCQkvKiBlbmFibGUgNC1iaXQgQVNZTkMgaW50ZXJydXB0IG9uIEFSNjAwMyBvciBsYXRlciAqLworCQlyZXQgPSBhdGg2a2xfc2Rpb19mdW5jMF9jbWQ1Ml93cl9ieXRlKGZ1bmMtPmNhcmQsCisJCQkJCQlDQ0NSX1NESU9fSVJRX01PREVfUkVHLAorCQkJCQkJU0RJT19JUlFfTU9ERV9BU1lOQ180QklUX0lSUSk7CisJCWlmIChyZXQpIHsKKwkJCWF0aDZrbF9lcnIoIkZhaWxlZCB0byBlbmFibGUgNC1iaXQgYXN5bmMgaXJxIG1vZGUgJWRcbiIsCisJCQkJICAgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsICI0LWJpdCBhc3luYyBpcnEgbW9kZSBlbmFibGVkXG4iKTsKKwl9CisKKwkvKiBnaXZlIHVzIHNvbWUgdGltZSB0byBlbmFibGUsIGluIG1zICovCisJZnVuYy0+ZW5hYmxlX3RpbWVvdXQgPSAxMDA7CisKKwlyZXQgPSBzZGlvX3NldF9ibG9ja19zaXplKGZ1bmMsIEhJRl9NQk9YX0JMT0NLX1NJWkUpOworCWlmIChyZXQpIHsKKwkJYXRoNmtsX2VycigiU2V0IHNkaW8gYmxvY2sgc2l6ZSAlZCBmYWlsZWQ6ICVkKVxuIiwKKwkJCSAgIEhJRl9NQk9YX0JMT0NLX1NJWkUsIHJldCk7CisJCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3NkaW9fc3VzcGVuZChzdHJ1Y3QgYXRoNmtsICphciwgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KQogewogCXN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbyA9IGF0aDZrbF9zZGlvX3ByaXYoYXIpOwogCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBhcl9zZGlvLT5mdW5jOwpAQCAtNzMyLDEyICs3ODMsMTQgQEAKIAogCWZsYWdzID0gc2Rpb19nZXRfaG9zdF9wbV9jYXBzKGZ1bmMpOwogCi0JaWYgKCEoZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikpCi0JCS8qIGFzIGhvc3QgZG9lc24ndCBzdXBwb3J0IGtlZXAgcG93ZXIgd2UgbmVlZCB0byBiYWlsIG91dCAqLwotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU0RJTywKLQkJCSAgICJmdW5jICVkIGRvZXNuJ3Qgc3VwcG9ydCBNTUNfUE1fS0VFUF9QT1dFUlxuIiwKLQkJCSAgIGZ1bmMtPm51bSk7Ci0JCXJldHVybiAtRUlOVkFMOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19TVVNQRU5ELCAic2RpbyBzdXNwZW5kIHBtX2NhcHMgMHgleFxuIiwgZmxhZ3MpOworCisJaWYgKCEoZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikgfHwKKwkgICAgKGFyLT5jb25mX2ZsYWdzICYgQVRINktMX0NPTkZfU1VTUEVORF9DVVRQT1dFUikpIHsKKwkJLyogYXMgaG9zdCBkb2Vzbid0IHN1cHBvcnQga2VlcCBwb3dlciB3ZSBuZWVkIHRvIGN1dCBwb3dlciAqLworCQlyZXR1cm4gYXRoNmtsX2NmZzgwMjExX3N1c3BlbmQoYXIsIEFUSDZLTF9DRkdfU1VTUEVORF9DVVRQT1dFUiwKKwkJCQkJICAgICAgIE5VTEwpOworCX0KIAogCXJldCA9IHNkaW9fc2V0X2hvc3RfcG1fZmxhZ3MoZnVuYywgTU1DX1BNX0tFRVBfUE9XRVIpOwogCWlmIChyZXQpIHsKQEAgLTc0NiwxMSArNzk5LDg1IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JYXRoNmtsX2RlZXBfc2xlZXBfZW5hYmxlKGFyKTsKKwlpZiAoKGZsYWdzICYgTU1DX1BNX1dBS0VfU0RJT19JUlEpICYmIHdvdykgeworCQkvKgorCQkgKiBUaGUgaG9zdCBzZGlvIGNvbnRyb2xsZXIgaXMgY2FwYWJsZSBvZiBrZWVwIHBvd2VyIGFuZAorCQkgKiBzZGlvIGlycSB3YWtlIHVwIGF0IHRoaXMgcG9pbnQuIEl0J3MgZmluZSB0byBjb250aW51ZQorCQkgKiB3b3cgc3VzcGVuZCBvcGVyYXRpb24uCisJCSAqLworCQlyZXQgPSBhdGg2a2xfY2ZnODAyMTFfc3VzcGVuZChhciwgQVRINktMX0NGR19TVVNQRU5EX1dPVywgd293KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc2Rpb19zZXRfaG9zdF9wbV9mbGFncyhmdW5jLCBNTUNfUE1fV0FLRV9TRElPX0lSUSk7CisJCWlmIChyZXQpCisJCQlhdGg2a2xfZXJyKCJzZXQgc2RpbyB3YWtlIGlycSBmbGFnIGZhaWxlZDogJWRcbiIsIHJldCk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gYXRoNmtsX2NmZzgwMjExX3N1c3BlbmQoYXIsIEFUSDZLTF9DRkdfU1VTUEVORF9ERUVQU0xFRVAsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX3Jlc3VtZShzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlzd2l0Y2ggKGFyLT5zdGF0ZSkgeworCWNhc2UgQVRINktMX1NUQVRFX09GRjoKKwljYXNlIEFUSDZLTF9TVEFURV9DVVRQT1dFUjoKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NVU1BFTkQsCisJCQkgICAic2RpbyByZXN1bWUgY29uZmlndXJpbmcgc2Rpb1xuIik7CisKKwkJLyogbmVlZCB0byBzZXQgc2RpbyBzZXR0aW5ncyBhZnRlciBwb3dlciBpcyBjdXQgZnJvbSBzZGlvICovCisJCWF0aDZrbF9zZGlvX2NvbmZpZyhhcik7CisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfU1RBVEVfT046CisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfU1RBVEVfREVFUFNMRUVQOgorCQlicmVhazsKKworCWNhc2UgQVRINktMX1NUQVRFX1dPVzoKKwkJYnJlYWs7CisJfQorCisJYXRoNmtsX2NmZzgwMjExX3Jlc3VtZShhcik7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYXRoNmtsX3NkaW9fc3RvcChzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKKwlzdHJ1Y3QgYnVzX3JlcXVlc3QgKnJlcSwgKnRtcF9yZXE7CisJdm9pZCAqY29udGV4dDsKKworCS8qIEZJWE1FOiBtYWtlIHN1cmUgdGhhdCB3cSBpcyBub3QgcXVldWVkIGFnYWluICovCisKKwljYW5jZWxfd29ya19zeW5jKCZhcl9zZGlvLT53cl9hc3luY193b3JrKTsKKworCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0bXBfcmVxLCAmYXJfc2Rpby0+d3JfYXN5bmNxLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOworCisJCWlmIChyZXEtPnNjYXRfcmVxKSB7CisJCQkvKiB0aGlzIGlzIGEgc2NhdHRlciBnYXRoZXIgcmVxdWVzdCAqLworCQkJcmVxLT5zY2F0X3JlcS0+c3RhdHVzID0gLUVDQU5DRUxFRDsKKwkJCXJlcS0+c2NhdF9yZXEtPmNvbXBsZXRlKGFyX3NkaW8tPmFyLT5odGNfdGFyZ2V0LAorCQkJCQkJcmVxLT5zY2F0X3JlcSk7CisJCX0gZWxzZSB7CisJCQljb250ZXh0ID0gcmVxLT5wYWNrZXQ7CisJCQlhdGg2a2xfc2Rpb19mcmVlX2J1c19yZXEoYXJfc2RpbywgcmVxKTsKKwkJCWF0aDZrbF9oaWZfcndfY29tcF9oYW5kbGVyKGNvbnRleHQsIC1FQ0FOQ0VMRUQpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOworCisJV0FSTl9PTihnZXRfcXVldWVfZGVwdGgoJmFyX3NkaW8tPnNjYXRfcmVxKSAhPSA0KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg2a2xfaGlmX29wcyBhdGg2a2xfc2Rpb19vcHMgPSB7CiAJLnJlYWRfd3JpdGVfc3luYyA9IGF0aDZrbF9zZGlvX3JlYWRfd3JpdGVfc3luYywKIAkud3JpdGVfYXN5bmMgPSBhdGg2a2xfc2Rpb193cml0ZV9hc3luYywKQEAgLTc2Miw4ICs4ODksNDMgQEAKIAkuc2NhdF9yZXFfcncgPSBhdGg2a2xfc2Rpb19hc3luY19yd19zY2F0dGVyLAogCS5jbGVhbnVwX3NjYXR0ZXIgPSBhdGg2a2xfc2Rpb19jbGVhbnVwX3NjYXR0ZXIsCiAJLnN1c3BlbmQgPSBhdGg2a2xfc2Rpb19zdXNwZW5kLAorCS5yZXN1bWUgPSBhdGg2a2xfc2Rpb19yZXN1bWUsCisJLnBvd2VyX29uID0gYXRoNmtsX3NkaW9fcG93ZXJfb24sCisJLnBvd2VyX29mZiA9IGF0aDZrbF9zZGlvX3Bvd2VyX29mZiwKKwkuc3RvcCA9IGF0aDZrbF9zZGlvX3N0b3AsCiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisKKy8qCisgKiBFbXB0eSBoYW5kbGVycyBzbyB0aGF0IG1tYyBzdWJzeXN0ZW0gZG9lc24ndCByZW1vdmUgdXMgZW50aXJlbHkgZHVyaW5nCisgKiBzdXNwZW5kLiBXZSBpbnN0ZWFkIGZvbGxvdyBjZmc4MDIxMSBzdXNwZW5kL3Jlc3VtZSBoYW5kbGVycy4KKyAqLworc3RhdGljIGludCBhdGg2a2xfc2Rpb19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwgInNkaW8gcG0gc3VzcGVuZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2Rpb19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWF0aDZrbF9kYmcoQVRINktMX0RCR19TVVNQRU5ELCAic2RpbyBwbSByZXN1bWVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhdGg2a2xfc2Rpb19wbV9vcHMsIGF0aDZrbF9zZGlvX3BtX3N1c3BlbmQsCisJCQkgYXRoNmtsX3NkaW9fcG1fcmVzdW1lKTsKKworI2RlZmluZSBBVEg2S0xfU0RJT19QTV9PUFMgKCZhdGg2a2xfc2Rpb19wbV9vcHMpCisKKyNlbHNlCisKKyNkZWZpbmUgQVRINktMX1NESU9fUE1fT1BTIE5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCiBzdGF0aWMgaW50IGF0aDZrbF9zZGlvX3Byb2JlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCiB7CkBAIC03NzIsOCArOTM0LDggQEAKIAlzdHJ1Y3QgYXRoNmtsICphcjsKIAlpbnQgY291bnQ7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU0RJTywKLQkJICAgIm5ldyBmdW5jICVkIHZlbmRvciAweCV4IGRldmljZSAweCV4IGJsb2NrIDB4JXgvMHgleFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwKKwkJICAgInNkaW8gbmV3IGZ1bmMgJWQgdmVuZG9yIDB4JXggZGV2aWNlIDB4JXggYmxvY2sgMHgleC8weCV4XG4iLAogCQkgICBmdW5jLT5udW0sIGZ1bmMtPnZlbmRvciwgZnVuYy0+ZGV2aWNlLAogCQkgICBmdW5jLT5tYXhfYmxrc2l6ZSwgZnVuYy0+Y3VyX2Jsa3NpemUpOwogCkBAIC04MTksNTcgKzk4MSwyMiBAQAogCiAJYXRoNmtsX3NkaW9fc2V0X21ib3hfaW5mbyhhcik7CiAKLQlzZGlvX2NsYWltX2hvc3QoZnVuYyk7Ci0KLQlpZiAoKGFyX3NkaW8tPmlkLT5kZXZpY2UgJiBNQU5VRkFDVFVSRVJfSURfQVRINktMX0JBU0VfTUFTSykgPj0KLQkgICAgTUFOVUZBQ1RVUkVSX0lEX0FSNjAwM19CQVNFKSB7Ci0JCS8qIGVuYWJsZSA0LWJpdCBBU1lOQyBpbnRlcnJ1cHQgb24gQVI2MDAzIG9yIGxhdGVyICovCi0JCXJldCA9IGF0aDZrbF9zZGlvX2Z1bmMwX2NtZDUyX3dyX2J5dGUoZnVuYy0+Y2FyZCwKLQkJCQkJCUNDQ1JfU0RJT19JUlFfTU9ERV9SRUcsCi0JCQkJCQlTRElPX0lSUV9NT0RFX0FTWU5DXzRCSVRfSVJRKTsKLQkJaWYgKHJldCkgewotCQkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGVuYWJsZSA0LWJpdCBhc3luYyBpcnEgbW9kZSAlZFxuIiwKLQkJCQkgICByZXQpOwotCQkJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7Ci0JCQlnb3RvIGVycl9jZmc4MDIxMTsKLQkJfQotCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19TRElPLCAiNC1iaXQgYXN5bmMgaXJxIG1vZGUgZW5hYmxlZFxuIik7Ci0JfQotCi0JLyogZ2l2ZSB1cyBzb21lIHRpbWUgdG8gZW5hYmxlLCBpbiBtcyAqLwotCWZ1bmMtPmVuYWJsZV90aW1lb3V0ID0gMTAwOwotCi0Jc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7Ci0KLQlyZXQgPSBhdGg2a2xfc2Rpb19wb3dlcl9vbihhcl9zZGlvKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9jZmc4MDIxMTsKLQotCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKLQotCXJldCA9IHNkaW9fc2V0X2Jsb2NrX3NpemUoZnVuYywgSElGX01CT1hfQkxPQ0tfU0laRSk7CisJcmV0ID0gYXRoNmtsX3NkaW9fY29uZmlnKGFyKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDZrbF9lcnIoIlNldCBzZGlvIGJsb2NrIHNpemUgJWQgZmFpbGVkOiAlZClcbiIsCi0JCQkgICBISUZfTUJPWF9CTE9DS19TSVpFLCByZXQpOwotCQlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKLQkJZ290byBlcnJfb2ZmOworCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gY29uZmlnIHNkaW86ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9jb3JlX2FsbG9jOwogCX0KIAotCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwotCiAJcmV0ID0gYXRoNmtsX2NvcmVfaW5pdChhcik7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gaW5pdCBhdGg2a2wgY29yZVxuIik7Ci0JCWdvdG8gZXJyX29mZjsKKwkJZ290byBlcnJfY29yZV9hbGxvYzsKIAl9CiAKIAlyZXR1cm4gcmV0OwogCi1lcnJfb2ZmOgotCWF0aDZrbF9zZGlvX3Bvd2VyX29mZihhcl9zZGlvKTsKLWVycl9jZmc4MDIxMToKLQlhdGg2a2xfY2ZnODAyMTFfZGVpbml0KGFyX3NkaW8tPmFyKTsKK2Vycl9jb3JlX2FsbG9jOgorCWF0aDZrbF9jb3JlX2ZyZWUoYXJfc2Rpby0+YXIpOwogZXJyX2RtYToKIAlrZnJlZShhcl9zZGlvLT5kbWFfYnVmZmVyKTsKIGVycl9oaWY6CkBAIC04ODIsOCArMTAwOSw4IEBACiB7CiAJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NESU8sCi0JCSAgICJyZW1vdmVkIGZ1bmMgJWQgdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCSAgICJzZGlvIHJlbW92ZWQgZnVuYyAlZCB2ZW5kb3IgMHgleCBkZXZpY2UgMHgleFxuIiwKIAkJICAgZnVuYy0+bnVtLCBmdW5jLT52ZW5kb3IsIGZ1bmMtPmRldmljZSk7CiAKIAlhcl9zZGlvID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKQEAgLTg5MSw5ICsxMDE4LDcgQEAKIAlhdGg2a2xfc3RvcF90eHJ4KGFyX3NkaW8tPmFyKTsKIAljYW5jZWxfd29ya19zeW5jKCZhcl9zZGlvLT53cl9hc3luY193b3JrKTsKIAotCWF0aDZrbF91bmF2YWlsX2V2KGFyX3NkaW8tPmFyKTsKLQotCWF0aDZrbF9zZGlvX3Bvd2VyX29mZihhcl9zZGlvKTsKKwlhdGg2a2xfY29yZV9jbGVhbnVwKGFyX3NkaW8tPmFyKTsKIAogCWtmcmVlKGFyX3NkaW8tPmRtYV9idWZmZXIpOwogCWtmcmVlKGFyX3NkaW8pOwpAQCAtOTA4LDEwICsxMDMzLDExIEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHNkaW8sIGF0aDZrbF9zZGlvX2RldmljZXMpOwogCiBzdGF0aWMgc3RydWN0IHNkaW9fZHJpdmVyIGF0aDZrbF9zZGlvX2RyaXZlciA9IHsKLQkubmFtZSA9ICJhdGg2a2xfc2RpbyIsCisJLm5hbWUgPSAiYXRoNmtsIiwKIAkuaWRfdGFibGUgPSBhdGg2a2xfc2Rpb19kZXZpY2VzLAogCS5wcm9iZSA9IGF0aDZrbF9zZGlvX3Byb2JlLAogCS5yZW1vdmUgPSBhdGg2a2xfc2Rpb19yZW1vdmUsCisJLmRydi5wbSA9IEFUSDZLTF9TRElPX1BNX09QUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGF0aDZrbF9zZGlvX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdGFyZ2V0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3RhcmdldC5oCmluZGV4IGM5YTc2MDUuLjY4N2UyYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdGFyZ2V0LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC90YXJnZXQuaApAQCAtMzIwLDcgKzMyMCwxMCBAQAogfCAgICgyKSAgIHwgICAoMikgICB8ICAgKDIpICAgfCAgICgyKSAgIHwgICAoMikgICB8ICAgKDIpICAgfCAgICgyKSAgIHwgICAoMikKIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CiAqLworI2RlZmluZSBISV9PUFRJT05fRldfTU9ERV9CSVRTCSAgICAgICAweDIKICNkZWZpbmUgSElfT1BUSU9OX0ZXX01PREVfU0hJRlQgICAgICAgIDB4QworCisjZGVmaW5lIEhJX09QVElPTl9GV19TVUJNT0RFX0JJVFMgICAgICAweDIKICNkZWZpbmUgSElfT1BUSU9OX0ZXX1NVQk1PREVfU0hJRlQgICAgIDB4MTQKIAogLyogQ29udmVydCBhIFRhcmdldCB2aXJ0dWFsIGFkZHJlc3MgaW50byBhIFRhcmdldCBwaHlzaWNhbCBhZGRyZXNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdHhyeC5jCmluZGV4IGE3MTE3MDcuLmQ5Y2ZmMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdHhyeC5jCkBAIC03NywxMiArNzcsMTMgQEAKIAlyZXR1cm4gYXItPm5vZGVfbWFwW2VwX21hcF0uZXBfaWQ7CiB9CiAKLXN0YXRpYyBib29sIGF0aDZrbF9wb3dlcnNhdmVfYXAoc3RydWN0IGF0aDZrbCAqYXIsIHN0cnVjdCBza19idWZmICpza2IsCitzdGF0aWMgYm9vbCBhdGg2a2xfcG93ZXJzYXZlX2FwKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJYm9vbCAqbW9yZV9kYXRhKQogewogCXN0cnVjdCBldGhoZHIgKmRhdGFwID0gKHN0cnVjdCBldGhoZHIgKikgc2tiLT5kYXRhOwogCXN0cnVjdCBhdGg2a2xfc3RhICpjb25uID0gTlVMTDsKIAlib29sIHBzX3F1ZXVlZCA9IGZhbHNlLCBpc19wc3FfZW1wdHkgPSBmYWxzZTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGF0YXAtPmhfZGVzdCkpIHsKIAkJdTggY3RyID0gMDsKQEAgLTEwMCw3ICsxMDEsNyBAQAogCQkJICogSWYgdGhpcyB0cmFuc21pdCBpcyBub3QgYmVjYXVzZSBvZiBhIER0aW0gRXhwaXJ5CiAJCQkgKiBxIGl0LgogCQkJICovCi0JCQlpZiAoIXRlc3RfYml0KERUSU1fRVhQSVJFRCwgJmFyLT5mbGFnKSkgeworCQkJaWYgKCF0ZXN0X2JpdChEVElNX0VYUElSRUQsICZ2aWYtPmZsYWdzKSkgewogCQkJCWJvb2wgaXNfbWNhc3RxX2VtcHR5ID0gZmFsc2U7CiAKIAkJCQlzcGluX2xvY2tfYmgoJmFyLT5tY2FzdHBzcV9sb2NrKTsKQEAgLTExNiw2ICsxMTcsNyBAQAogCQkJCSAqLwogCQkJCWlmIChpc19tY2FzdHFfZW1wdHkpCiAJCQkJCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwKKwkJCQkJCQkgICAgICAgdmlmLT5md192aWZfaWR4LAogCQkJCQkJCSAgICAgICBNQ0FTVF9BSUQsIDEpOwogCiAJCQkJcHNfcXVldWVkID0gdHJ1ZTsKQEAgLTEzMSw3ICsxMzMsNyBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJY29ubiA9IGF0aDZrbF9maW5kX3N0YShhciwgZGF0YXAtPmhfZGVzdCk7CisJCWNvbm4gPSBhdGg2a2xfZmluZF9zdGEodmlmLCBkYXRhcC0+aF9kZXN0KTsKIAkJaWYgKCFjb25uKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKQEAgLTE1NCw2ICsxNTYsNyBAQAogCQkJCSAqLwogCQkJCWlmIChpc19wc3FfZW1wdHkpCiAJCQkJCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwKKwkJCQkJCQkgICAgICAgdmlmLT5md192aWZfaWR4LAogCQkJCQkJCSAgICAgICBjb25uLT5haWQsIDEpOwogCiAJCQkJcHNfcXVldWVkID0gdHJ1ZTsKQEAgLTIzNSw2ICsyMzgsNyBAQAogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgYXRoNmtsX2Nvb2tpZSAqY29va2llID0gTlVMTDsKIAllbnVtIGh0Y19lbmRwb2ludF9pZCBlaWQgPSBFTkRQT0lOVF9VTlVTRUQ7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIG1hcF9ubyA9IDA7CiAJdTE2IGh0Y190YWcgPSBBVEg2S0xfREFUQV9QS1RfVEFHOwogCXU4IGFjID0gOTkgOyAvKiBpbml0aWFsaXplIHRvIHVubWFwcGVkIGFjICovCkBAIC0yNDYsNyArMjUwLDcgQEAKIAkJICAgc2tiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAogCS8qIElmIHRhcmdldCBpcyBub3QgYXNzb2NpYXRlZCAqLwotCWlmICghdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKSB7CisJaWYgKCF0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAwOwogCX0KQEAgLTI1NSwxNSArMjU5LDIxIEBACiAJCWdvdG8gZmFpbF90eDsKIAogCS8qIEFQIG1vZGUgUG93ZXIgc2F2aW5nIHByb2Nlc3NpbmcgKi8KLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgewotCQlpZiAoYXRoNmtsX3Bvd2Vyc2F2ZV9hcChhciwgc2tiLCAmbW9yZV9kYXRhKSkKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwkJaWYgKGF0aDZrbF9wb3dlcnNhdmVfYXAodmlmLCBza2IsICZtb3JlX2RhdGEpKQogCQkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHRlc3RfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpKSB7CiAJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGRldi0+bmVlZGVkX2hlYWRyb29tKSB7Ci0JCQlXQVJOX09OKDEpOwotCQkJZ290byBmYWlsX3R4OworCQkJc3RydWN0IHNrX2J1ZmYgKnRtcF9za2IgPSBza2I7CisKKwkJCXNrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgZGV2LT5uZWVkZWRfaGVhZHJvb20pOworCQkJa2ZyZWVfc2tiKHRtcF9za2IpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJdmlmLT5uZXRfc3RhdHMudHhfZHJvcHBlZCsrOworCQkJCXJldHVybiAwOworCQkJfQogCQl9CiAKIAkJaWYgKGF0aDZrbF93bWlfZGl4XzJfZG90Myhhci0+d21pLCBza2IpKSB7CkBAIC0yNzIsMTggKzI4MiwyMCBAQAogCQl9CiAKIAkJaWYgKGF0aDZrbF93bWlfZGF0YV9oZHJfYWRkKGFyLT53bWksIHNrYiwgREFUQV9NU0dUWVBFLAotCQkJCQkgICAgbW9yZV9kYXRhLCAwLCAwLCBOVUxMKSkgeworCQkJCQkgICAgbW9yZV9kYXRhLCAwLCAwLCBOVUxMLAorCQkJCQkgICAgdmlmLT5md192aWZfaWR4KSkgewogCQkJYXRoNmtsX2Vycigid21pX2RhdGFfaGRyX2FkZCBmYWlsZWRcbiIpOwogCQkJZ290byBmYWlsX3R4OwogCQl9CiAKLQkJaWYgKChhci0+bndfdHlwZSA9PSBBREhPQ19ORVRXT1JLKSAmJgotCQkgICAgIGFyLT5pYnNzX3BzX2VuYWJsZSAmJiB0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpCisJCWlmICgodmlmLT5ud190eXBlID09IEFESE9DX05FVFdPUkspICYmCisJCSAgICAgYXItPmlic3NfcHNfZW5hYmxlICYmIHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKQogCQkJY2hrX2FkaG9jX3BzX21hcHBpbmcgPSB0cnVlOwogCQllbHNlIHsKIAkJCS8qIGdldCB0aGUgc3RyZWFtIG1hcHBpbmcgKi8KLQkJCXJldCA9IGF0aDZrbF93bWlfaW1wbGljaXRfY3JlYXRlX3BzdHJlYW0oYXItPndtaSwgc2tiLAotCQkJCSAgICAwLCB0ZXN0X2JpdChXTU1fRU5BQkxFRCwgJmFyLT5mbGFnKSwgJmFjKTsKKwkJCXJldCA9IGF0aDZrbF93bWlfaW1wbGljaXRfY3JlYXRlX3BzdHJlYW0oYXItPndtaSwKKwkJCQkgICAgdmlmLT5md192aWZfaWR4LCBza2IsCisJCQkJICAgIDAsIHRlc3RfYml0KFdNTV9FTkFCTEVELCAmdmlmLT5mbGFncyksICZhYyk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZmFpbF90eDsKIAkJfQpAQCAtMzU0LDggKzM2Niw4IEBACiBmYWlsX3R4OgogCWRldl9rZnJlZV9za2Ioc2tiKTsKIAotCWFyLT5uZXRfc3RhdHMudHhfZHJvcHBlZCsrOwotCWFyLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwl2aWYtPm5ldF9zdGF0cy50eF9kcm9wcGVkKys7CisJdmlmLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKIAogCXJldHVybiAwOwogfQpAQCAtNDI2LDcgKzQzOCw5IEBACiAJCQkJCSAgICAgICBzdHJ1Y3QgaHRjX3BhY2tldCAqcGFja2V0KQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gdGFyZ2V0LT5kZXYtPmFyOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CiAJZW51bSBodGNfZW5kcG9pbnRfaWQgZW5kcG9pbnQgPSBwYWNrZXQtPmVuZHBvaW50OworCWVudW0gaHRjX3NlbmRfZnVsbF9hY3Rpb24gYWN0aW9uID0gSFRDX1NFTkRfRlVMTF9LRUVQOwogCiAJaWYgKGVuZHBvaW50ID09IGFyLT5jdHJsX2VwKSB7CiAJCS8qCkBAIC00MzksMTkgKzQ1MywxMSBAQAogCQlzZXRfYml0KFdNSV9DVFJMX0VQX0ZVTEwsICZhci0+ZmxhZyk7CiAJCXNwaW5fdW5sb2NrX2JoKCZhci0+bG9jayk7CiAJCWF0aDZrbF9lcnIoIndtaSBjdHJsIGVwIGlzIGZ1bGxcbiIpOwotCQlyZXR1cm4gSFRDX1NFTkRfRlVMTF9LRUVQOworCQlnb3RvIHN0b3BfYWRob2NfbmV0cTsKIAl9CiAKIAlpZiAocGFja2V0LT5pbmZvLnR4LnRhZyA9PSBBVEg2S0xfQ09OVFJPTF9QS1RfVEFHKQotCQlyZXR1cm4gSFRDX1NFTkRfRlVMTF9LRUVQOwotCi0JaWYgKGFyLT5ud190eXBlID09IEFESE9DX05FVFdPUkspCi0JCS8qCi0JCSAqIEluIGFkaG9jIG1vZGUsIHdlIGNhbm5vdCBkaWZmZXJlbnRpYXRlIHRyYWZmaWMKLQkJICogcHJpb3JpdGllcyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnRpbnVlLCBob3dldmVyIHdlCi0JCSAqIHNob3VsZCBzdG9wIHRoZSBuZXR3b3JrLgotCQkgKi8KLQkJZ290byBzdG9wX25ldF9xdWV1ZXM7CisJCWdvdG8gc3RvcF9hZGhvY19uZXRxOwogCiAJLyoKIAkgKiBUaGUgbGFzdCBNQVhfSElfQ09PS0lFX05VTSAiYmF0Y2giIG9mIGNvb2tpZXMgYXJlIHJlc2VydmVkIGZvcgpAQCAtNDU5LDI5ICs0NjUsNDMgQEAKIAkgKi8KIAlpZiAoYXItPmFjX3N0cmVhbV9wcmlfbWFwW2FyLT5lcDJhY19tYXBbZW5kcG9pbnRdXSA8CiAJICAgIGFyLT5oaWFjX3N0cmVhbV9hY3RpdmVfcHJpICYmCi0JICAgIGFyLT5jb29raWVfY291bnQgPD0gTUFYX0hJX0NPT0tJRV9OVU0pCisJICAgIGFyLT5jb29raWVfY291bnQgPD0gTUFYX0hJX0NPT0tJRV9OVU0pIHsKIAkJLyoKIAkJICogR2l2ZSBwcmVmZXJlbmNlIHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IHN0cmVhbSBieQogCQkgKiBkcm9wcGluZyB0aGUgcGFja2V0cyB3aGljaCBvdmVyZmxvd2VkLgogCQkgKi8KLQkJcmV0dXJuIEhUQ19TRU5EX0ZVTExfRFJPUDsKKwkJYWN0aW9uID0gSFRDX1NFTkRfRlVMTF9EUk9QOworCQlnb3RvIHN0b3BfYWRob2NfbmV0cTsKKwl9CiAKLXN0b3BfbmV0X3F1ZXVlczoKLQlzcGluX2xvY2tfYmgoJmFyLT5sb2NrKTsKLQlzZXRfYml0KE5FVFFfU1RPUFBFRCwgJmFyLT5mbGFnKTsKLQlzcGluX3VubG9ja19iaCgmYXItPmxvY2spOwotCW5ldGlmX3N0b3BfcXVldWUoYXItPm5ldF9kZXYpOworc3RvcF9hZGhvY19uZXRxOgorCS8qIEZJWE1FOiBMb2NraW5nICovCisJc3Bpbl9sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZpZiwgJmFyLT52aWZfbGlzdCwgbGlzdCkgeworCQlpZiAodmlmLT5ud190eXBlID09IEFESE9DX05FVFdPUkspIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKIAotCXJldHVybiBIVENfU0VORF9GVUxMX0tFRVA7CisJCQlzcGluX2xvY2tfYmgoJnZpZi0+aWZfbG9jayk7CisJCQlzZXRfYml0KE5FVFFfU1RPUFBFRCwgJnZpZi0+ZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfYmgoJnZpZi0+aWZfbG9jayk7CisJCQluZXRpZl9zdG9wX3F1ZXVlKHZpZi0+bmRldik7CisKKwkJCXJldHVybiBhY3Rpb247CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCisJcmV0dXJuIGFjdGlvbjsKIH0KIAogLyogVE9ETyB0aGlzIG5lZWRzIHRvIGJlIGxvb2tlZCBhdCAqLwotc3RhdGljIHZvaWQgYXRoNmtsX3R4X2NsZWFyX25vZGVfbWFwKHN0cnVjdCBhdGg2a2wgKmFyLAorc3RhdGljIHZvaWQgYXRoNmtsX3R4X2NsZWFyX25vZGVfbWFwKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsCiAJCQkJICAgICBlbnVtIGh0Y19lbmRwb2ludF9pZCBlaWQsIHUzMiBtYXBfbm8pCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCXUzMiBpOwogCi0JaWYgKGFyLT5ud190eXBlICE9IEFESE9DX05FVFdPUkspCisJaWYgKHZpZi0+bndfdHlwZSAhPSBBREhPQ19ORVRXT1JLKQogCQlyZXR1cm47CiAKIAlpZiAoIWFyLT5pYnNzX3BzX2VuYWJsZSkKQEAgLTUyMyw3ICs1NDMsOSBAQAogCWludCBzdGF0dXM7CiAJZW51bSBodGNfZW5kcG9pbnRfaWQgZWlkOwogCWJvb2wgd2FrZV9ldmVudCA9IGZhbHNlOwotCWJvb2wgZmx1c2hpbmcgPSBmYWxzZTsKKwlib29sIGZsdXNoaW5nW01BWF9OVU1fVklGXSA9IHtmYWxzZX07CisJdTggaWZfaWR4OworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CiAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZza2JfcXVldWUpOwogCkBAIC01NjksMTUgKzU5MSwzMCBAQAogCQkJCXdha2VfZXZlbnQgPSB0cnVlOwogCQl9CiAKKwkJaWYgKGVpZCA9PSBhci0+Y3RybF9lcCkgeworCQkJaWZfaWR4ID0gd21pX2NtZF9oZHJfZ2V0X2lmX2lkeCgKKwkJCQkoc3RydWN0IHdtaV9jbWRfaGRyICopIHNrYi0+ZGF0YSk7CisJCX0gZWxzZSB7CisJCQlpZl9pZHggPSB3bWlfZGF0YV9oZHJfZ2V0X2lmX2lkeCgKKwkJCQkoc3RydWN0IHdtaV9kYXRhX2hkciAqKSBza2ItPmRhdGEpOworCQl9CisKKwkJdmlmID0gYXRoNmtsX2dldF92aWZfYnlfaW5kZXgoYXIsIGlmX2lkeCk7CisJCWlmICghdmlmKSB7CisJCQlhdGg2a2xfZnJlZV9jb29raWUoYXIsIGF0aDZrbF9jb29raWUpOworCQkJY29udGludWU7CisJCX0KKwogCQlpZiAoc3RhdHVzKSB7CiAJCQlpZiAoc3RhdHVzID09IC1FQ0FOQ0VMRUQpCiAJCQkJLyogYSBwYWNrZXQgd2FzIGZsdXNoZWQgICovCi0JCQkJZmx1c2hpbmcgPSB0cnVlOworCQkJCWZsdXNoaW5nW2lmX2lkeF0gPSB0cnVlOwogCi0JCQlhci0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQkJdmlmLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CiAKLQkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKLQkJCQlhdGg2a2xfZXJyKCJ0eCBlcnJvciwgc3RhdHVzOiAweCV4XG4iLCBzdGF0dXMpOworCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDICYmIHN0YXR1cyAhPSAtRUNBTkNFTEVEKQorCQkJCWF0aDZrbF93YXJuKCJ0eCBjb21wbGV0ZSBlcnJvcjogJWRcbiIsIHN0YXR1cyk7CisKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX1RYLAogCQkJCSAgICIlczogc2tiPTB4JXAgZGF0YT0weCVwIGxlbj0weCV4IGVpZD0lZCAlc1xuIiwKIAkJCQkgICBfX2Z1bmNfXywgc2tiLCBwYWNrZXQtPmJ1ZiwgcGFja2V0LT5hY3RfbGVuLApAQCAtNTg4LDI3ICs2MjUsMzQgQEAKIAkJCQkgICBfX2Z1bmNfXywgc2tiLCBwYWNrZXQtPmJ1ZiwgcGFja2V0LT5hY3RfbGVuLAogCQkJCSAgIGVpZCwgIk9LIik7CiAKLQkJCWZsdXNoaW5nID0gZmFsc2U7Ci0JCQlhci0+bmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKLQkJCWFyLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlmbHVzaGluZ1tpZl9pZHhdID0gZmFsc2U7CisJCQl2aWYtPm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJCQl2aWYtPm5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAkJfQogCi0JCWF0aDZrbF90eF9jbGVhcl9ub2RlX21hcChhciwgZWlkLCBtYXBfbm8pOworCQlhdGg2a2xfdHhfY2xlYXJfbm9kZV9tYXAodmlmLCBlaWQsIG1hcF9ubyk7CiAKIAkJYXRoNmtsX2ZyZWVfY29va2llKGFyLCBhdGg2a2xfY29va2llKTsKIAotCQlpZiAodGVzdF9iaXQoTkVUUV9TVE9QUEVELCAmYXItPmZsYWcpKQotCQkJY2xlYXJfYml0KE5FVFFfU1RPUFBFRCwgJmFyLT5mbGFnKTsKKwkJaWYgKHRlc3RfYml0KE5FVFFfU1RPUFBFRCwgJnZpZi0+ZmxhZ3MpKQorCQkJY2xlYXJfYml0KE5FVFFfU1RPUFBFRCwgJnZpZi0+ZmxhZ3MpOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZhci0+bG9jayk7CiAKIAlfX3NrYl9xdWV1ZV9wdXJnZSgmc2tiX3F1ZXVlKTsKIAotCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpIHsKLQkJaWYgKCFmbHVzaGluZykKLQkJCW5ldGlmX3dha2VfcXVldWUoYXItPm5ldF9kZXYpOworCS8qIEZJWE1FOiBMb2NraW5nICovCisJc3Bpbl9sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZpZiwgJmFyLT52aWZfbGlzdCwgbGlzdCkgeworCQlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykgJiYKKwkJICAgICFmbHVzaGluZ1t2aWYtPmZ3X3ZpZl9pZHhdKSB7CisJCQlzcGluX3VubG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJCQluZXRpZl93YWtlX3F1ZXVlKHZpZi0+bmRldik7CisJCQlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCQl9CiAJfQorCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKIAogCWlmICh3YWtlX2V2ZW50KQogCQl3YWtlX3VwKCZhci0+ZXZlbnRfd3EpOwpAQCAtMTA0MSw4ICsxMDg1LDkgQEAKIAlzdHJ1Y3QgYXRoNmtsX3N0YSAqY29ubiA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjEgPSBOVUxMOwogCXN0cnVjdCBldGhoZHIgKmRhdGFwID0gTlVMTDsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOwogCXUxNiBzZXFfbm8sIG9mZnNldDsKLQl1OCB0aWQ7CisJdTggdGlkLCBpZl9pZHg7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9SWCwKIAkJICAgIiVzOiBhcj0weCVwIGVpZD0lZCwgc2tiPTB4JXAsIGRhdGE9MHglcCwgbGVuPTB4JXggc3RhdHVzOiVkIiwKQEAgLTEwNTAsNyArMTA5NSwyMyBAQAogCQkgICBwYWNrZXQtPmFjdF9sZW4sIHN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzIHx8ICEoc2tiLT5kYXRhICsgSFRDX0hEUl9MRU5HVEgpKSB7Ci0JCWFyLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9wdXQoc2tiLCBwYWNrZXQtPmFjdF9sZW4gKyBIVENfSERSX0xFTkdUSCk7CisJc2tiX3B1bGwoc2tiLCBIVENfSERSX0xFTkdUSCk7CisKKwlpZiAoZXB0ID09IGFyLT5jdHJsX2VwKSB7CisJCWlmX2lkeCA9CisJCXdtaV9jbWRfaGRyX2dldF9pZl9pZHgoKHN0cnVjdCB3bWlfY21kX2hkciAqKSBza2ItPmRhdGEpOworCX0gZWxzZSB7CisJCWlmX2lkeCA9CisJCXdtaV9kYXRhX2hkcl9nZXRfaWZfaWR4KChzdHJ1Y3Qgd21pX2RhdGFfaGRyICopIHNrYi0+ZGF0YSk7CisJfQorCisJdmlmID0gYXRoNmtsX2dldF92aWZfYnlfaW5kZXgoYXIsIGlmX2lkeCk7CisJaWYgKCF2aWYpIHsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQpAQCAtMTA1OSwyOCArMTEyMCwyOCBAQAogCSAqIFRha2UgbG9jayB0byBwcm90ZWN0IGJ1ZmZlciBjb3VudHMgYW5kIGFkYXB0aXZlIHBvd2VyIHRocm91Z2hwdXQKIAkgKiBzdGF0ZS4KIAkgKi8KLQlzcGluX2xvY2tfYmgoJmFyLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnZpZi0+aWZfbG9jayk7CiAKLQlhci0+bmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKLQlhci0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IHBhY2tldC0+YWN0X2xlbjsKKwl2aWYtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJdmlmLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gcGFja2V0LT5hY3RfbGVuOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmFyLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmdmlmLT5pZl9sb2NrKTsKIAotCXNrYl9wdXQoc2tiLCBwYWNrZXQtPmFjdF9sZW4gKyBIVENfSERSX0xFTkdUSCk7Ci0Jc2tiX3B1bGwoc2tiLCBIVENfSERSX0xFTkdUSCk7CiAKIAlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsIF9fZnVuY19fLCAicnggIiwKIAkJCXNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCi0Jc2tiLT5kZXYgPSBhci0+bmV0X2RldjsKKwlza2ItPmRldiA9IHZpZi0+bmRldjsKIAogCWlmICghdGVzdF9iaXQoV01JX0VOQUJMRUQsICZhci0+ZmxhZykpIHsKIAkJaWYgKEVQUElOR19BTElHTk1FTlRfUEFEID4gMCkKIAkJCXNrYl9wdWxsKHNrYiwgRVBQSU5HX0FMSUdOTUVOVF9QQUQpOwotCQlhdGg2a2xfZGVsaXZlcl9mcmFtZXNfdG9fbndfc3RhY2soYXItPm5ldF9kZXYsIHNrYik7CisJCWF0aDZrbF9kZWxpdmVyX2ZyYW1lc190b19ud19zdGFjayh2aWYtPm5kZXYsIHNrYik7CiAJCXJldHVybjsKIAl9CiAKKwlhdGg2a2xfY2hlY2tfd293X3N0YXR1cyhhcik7CisKIAlpZiAoZXB0ID09IGFyLT5jdHJsX2VwKSB7CiAJCWF0aDZrbF93bWlfY29udHJvbF9yeChhci0+d21pLCBza2IpOwogCQlyZXR1cm47CkBAIC0xMDk2LDE4ICsxMTU3LDE4IEBACiAJICogdGhhdCBkbyBub3QgaGF2ZSBMTEMgaGRyLiBUaGV5IGFyZSAxNiBieXRlcyBpbiBzaXplLgogCSAqIEFsbG93IHRoZXNlIGZyYW1lcyBpbiB0aGUgQVAgbW9kZS4KIAkgKi8KLQlpZiAoYXItPm53X3R5cGUgIT0gQVBfTkVUV09SSyAmJgorCWlmICh2aWYtPm53X3R5cGUgIT0gQVBfTkVUV09SSyAmJgogCSAgICAoKHBhY2tldC0+YWN0X2xlbiA8IG1pbl9oZHJfbGVuKSB8fAogCSAgICAgKHBhY2tldC0+YWN0X2xlbiA+IFdNSV9NQVhfQU1TRFVfUlhfREFUQV9GUkFNRV9MRU5HVEgpKSkgewogCQlhdGg2a2xfaW5mbygiZnJhbWUgbGVuIGlzIHRvbyBzaG9ydCBvciB0b28gbG9uZ1xuIik7Ci0JCWFyLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7Ci0JCWFyLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl2aWYtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJdmlmLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBHZXQgdGhlIFBvd2VyIHNhdmUgc3RhdGUgb2YgdGhlIFNUQSAqLwotCWlmIChhci0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKSB7CisJaWYgKHZpZi0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKSB7CiAJCW1ldGFfdHlwZSA9IHdtaV9kYXRhX2hkcl9nZXRfbWV0YShkaGRyKTsKIAogCQlwc19zdGF0ZSA9ICEhKChkaGRyLT5pbmZvID4+IFdNSV9EQVRBX0hEUl9QU19TSElGVCkgJgpAQCAtMTEyOSw3ICsxMTkwLDcgQEAKIAkJfQogCiAJCWRhdGFwID0gKHN0cnVjdCBldGhoZHIgKikgKHNrYi0+ZGF0YSArIG9mZnNldCk7Ci0JCWNvbm4gPSBhdGg2a2xfZmluZF9zdGEoYXIsIGRhdGFwLT5oX3NvdXJjZSk7CisJCWNvbm4gPSBhdGg2a2xfZmluZF9zdGEodmlmLCBkYXRhcC0+aF9zb3VyY2UpOwogCiAJCWlmICghY29ubikgewogCQkJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMTE2MCwxMiArMTIyMSwxMyBAQAogCQkJCXdoaWxlICgoc2tidWZmID0gc2tiX2RlcXVldWUoJmNvbm4tPnBzcSkpCiAJCQkJICAgICAgICE9IE5VTEwpIHsKIAkJCQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnBzcV9sb2NrKTsKLQkJCQkJYXRoNmtsX2RhdGFfdHgoc2tidWZmLCBhci0+bmV0X2Rldik7CisJCQkJCWF0aDZrbF9kYXRhX3R4KHNrYnVmZiwgdmlmLT5uZGV2KTsKIAkJCQkJc3Bpbl9sb2NrX2JoKCZjb25uLT5wc3FfbG9jayk7CiAJCQkJfQogCQkJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5wc3FfbG9jayk7CiAJCQkJLyogQ2xlYXIgdGhlIFBWQiBmb3IgdGhpcyBTVEEgKi8KLQkJCQlhdGg2a2xfd21pX3NldF9wdmJfY21kKGFyLT53bWksIGNvbm4tPmFpZCwgMCk7CisJCQkJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgICAgICAgY29ubi0+YWlkLCAwKTsKIAkJCX0KIAkJfQogCkBAIC0xMjE1LDEyICsxMjc3LDEyIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIShhci0+bmV0X2Rldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CisJaWYgKCEodmlmLT5uZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKIAkJZGF0YXAgPSAoc3RydWN0IGV0aGhkciAqKSBza2ItPmRhdGE7CiAJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkYXRhcC0+aF9kZXN0KSkKIAkJCS8qCkBAIC0xMjM1LDggKzEyOTcsNyBAQAogCQkJICogZnJhbWUgdG8gaXQgb24gdGhlIGFpciBlbHNlIHNlbmQgdGhlCiAJCQkgKiBmcmFtZSB1cCB0aGUgc3RhY2suCiAJCQkgKi8KLQkJCXN0cnVjdCBhdGg2a2xfc3RhICpjb25uID0gTlVMTDsKLQkJCWNvbm4gPSBhdGg2a2xfZmluZF9zdGEoYXIsIGRhdGFwLT5oX2Rlc3QpOworCQkJY29ubiA9IGF0aDZrbF9maW5kX3N0YSh2aWYsIGRhdGFwLT5oX2Rlc3QpOwogCiAJCQlpZiAoY29ubiAmJiBhci0+aW50cmFfYnNzKSB7CiAJCQkJc2tiMSA9IHNrYjsKQEAgLTEyNDcsMTggKzEzMDgsMjMgQEAKIAkJCX0KIAkJfQogCQlpZiAoc2tiMSkKLQkJCWF0aDZrbF9kYXRhX3R4KHNrYjEsIGFyLT5uZXRfZGV2KTsKKwkJCWF0aDZrbF9kYXRhX3R4KHNrYjEsIHZpZi0+bmRldik7CisKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkvKiBub3RoaW5nIHRvIGRlbGl2ZXIgdXAgdGhlIHN0YWNrICovCisJCQlyZXR1cm47CisJCX0KIAl9CiAKIAlkYXRhcCA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYi0+ZGF0YTsKIAogCWlmIChpc191bmljYXN0X2V0aGVyX2FkZHIoZGF0YXAtPmhfZGVzdCkgJiYKLQkgICAgYWdncl9wcm9jZXNzX3JlY3ZfZnJtKGFyLT5hZ2dyX2NudHh0LCB0aWQsIHNlcV9ubywKKwkgICAgYWdncl9wcm9jZXNzX3JlY3ZfZnJtKHZpZi0+YWdncl9jbnR4dCwgdGlkLCBzZXFfbm8sCiAJCQkJICBpc19hbXNkdSwgc2tiKSkKIAkJLyogYWdncmVnYXRpb24gY29kZSB3aWxsIGhhbmRsZSB0aGUgc2tiICovCiAJCXJldHVybjsKIAotCWF0aDZrbF9kZWxpdmVyX2ZyYW1lc190b19ud19zdGFjayhhci0+bmV0X2Rldiwgc2tiKTsKKwlhdGg2a2xfZGVsaXZlcl9mcmFtZXNfdG9fbndfc3RhY2sodmlmLT5uZGV2LCBza2IpOwogfQogCiBzdGF0aWMgdm9pZCBhZ2dyX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCkBAIC0xMzM2LDkgKzE0MDIsMTAgQEAKIAltZW1zZXQoc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3Qgcnh0aWRfc3RhdHMpKTsKIH0KIAotdm9pZCBhZ2dyX3JlY3ZfYWRkYmFfcmVxX2V2dChzdHJ1Y3QgYXRoNmtsICphciwgdTggdGlkLCB1MTYgc2VxX25vLCB1OCB3aW5fc3opCit2b2lkIGFnZ3JfcmVjdl9hZGRiYV9yZXFfZXZ0KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHRpZCwgdTE2IHNlcV9ubywKKwkJCSAgICAgdTggd2luX3N6KQogewotCXN0cnVjdCBhZ2dyX2luZm8gKnBfYWdnciA9IGFyLT5hZ2dyX2NudHh0OworCXN0cnVjdCBhZ2dyX2luZm8gKnBfYWdnciA9IHZpZi0+YWdncl9jbnR4dDsKIAlzdHJ1Y3Qgcnh0aWQgKnJ4dGlkOwogCXN0cnVjdCByeHRpZF9zdGF0cyAqc3RhdHM7CiAJdTE2IGhvbGRfcV9zaXplOwpAQCAtMTQwNSw5ICsxNDcyLDkgQEAKIAlyZXR1cm4gcF9hZ2dyOwogfQogCi12b2lkIGFnZ3JfcmVjdl9kZWxiYV9yZXFfZXZ0KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCB0aWQpCit2b2lkIGFnZ3JfcmVjdl9kZWxiYV9yZXFfZXZ0KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHRpZCkKIHsKLQlzdHJ1Y3QgYWdncl9pbmZvICpwX2FnZ3IgPSBhci0+YWdncl9jbnR4dDsKKwlzdHJ1Y3QgYWdncl9pbmZvICpwX2FnZ3IgPSB2aWYtPmFnZ3JfY250eHQ7CiAJc3RydWN0IHJ4dGlkICpyeHRpZDsKIAogCWlmICghcF9hZ2dyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMKaW5kZXggYTdkZTIzYy4uOTIyMzQ0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSAiLi4vcmVnZC5oIgogI2luY2x1ZGUgIi4uL3JlZ2RfY29tbW9uLmgiCiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9zeW5jX3BvaW50KHN0cnVjdCB3bWkgKndtaSk7CitzdGF0aWMgaW50IGF0aDZrbF93bWlfc3luY19wb2ludChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCk7CiAKIHN0YXRpYyBjb25zdCBzMzIgd21pX3JhdGVfdGJsW11bMl0gPSB7CiAJLyoge1cvTyBTR0ksIHdpdGggU0dJfSAqLwpAQCAtODEsNiArODEsMjYgQEAKIAlyZXR1cm4gd21pLT5lcF9pZDsKIH0KIAorc3RydWN0IGF0aDZrbF92aWYgKmF0aDZrbF9nZXRfdmlmX2J5X2luZGV4KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCBpZl9pZHgpCit7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgKmZvdW5kID0gTlVMTDsKKworCWlmIChXQVJOX09OKGlmX2lkeCA+IChNQVhfTlVNX1ZJRiAtIDEpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBGSVhNRTogTG9ja2luZyAqLworCXNwaW5fbG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2aWYsICZhci0+dmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHZpZi0+ZndfdmlmX2lkeCA9PSBpZl9pZHgpIHsKKwkJCWZvdW5kID0gdmlmOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCisJcmV0dXJuIGZvdW5kOworfQorCiAvKiAgUGVyZm9ybXMgRElYIHRvIDgwMi4zIGVuY2Fwc3VsYXRpb24gZm9yIHRyYW5zbWl0IHBhY2tldHMuCiAgKiAgQXNzdW1lcyB0aGUgZW50aXJlIERJWCBoZWFkZXIgaXMgY29udGlnb3VzIGFuZCB0aGF0IHRoZXJlIGlzCiAgKiAgZW5vdWdoIHJvb20gaW4gdGhlIGJ1ZmZlciBmb3IgYSA4MDIuMyBtYWMgaGVhZGVyIGFuZCBMTEMrU05BUCBoZWFkZXJzLgpAQCAtMTYyLDEyICsxODIsMTIgQEAKIGludCBhdGg2a2xfd21pX2RhdGFfaGRyX2FkZChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgdTggbXNnX3R5cGUsIGJvb2wgbW9yZV9kYXRhLAogCQkJICAgIGVudW0gd21pX2RhdGFfaGRyX2RhdGFfdHlwZSBkYXRhX3R5cGUsCi0JCQkgICAgdTggbWV0YV92ZXIsIHZvaWQgKnR4X21ldGFfaW5mbykKKwkJCSAgICB1OCBtZXRhX3Zlciwgdm9pZCAqdHhfbWV0YV9pbmZvLCB1OCBpZl9pZHgpCiB7CiAJc3RydWN0IHdtaV9kYXRhX2hkciAqZGF0YV9oZHI7CiAJaW50IHJldDsKIAotCWlmIChXQVJOX09OKHNrYiA9PSBOVUxMKSkKKwlpZiAoV0FSTl9PTihza2IgPT0gTlVMTCB8fCAoaWZfaWR4ID4gTUFYX05VTV9WSUYgLSAxKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHR4X21ldGFfaW5mbykgewpAQCAtMTg5LDcgKzIwOSw3IEBACiAJCSAgICBXTUlfREFUQV9IRFJfTU9SRV9NQVNLIDw8IFdNSV9EQVRBX0hEUl9NT1JFX1NISUZUOwogCiAJZGF0YV9oZHItPmluZm8yID0gY3B1X3RvX2xlMTYobWV0YV92ZXIgPDwgV01JX0RBVEFfSERSX01FVEFfU0hJRlQpOwotCWRhdGFfaGRyLT5pbmZvMyA9IDA7CisJZGF0YV9oZHItPmluZm8zID0gY3B1X3RvX2xlMTYoaWZfaWR4ICYgV01JX0RBVEFfSERSX0lGX0lEWF9NQVNLKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjE2LDcgKzIzNiw4IEBACiAJCXJldHVybiBpcF9wcmk7CiB9CiAKLWludCBhdGg2a2xfd21pX2ltcGxpY2l0X2NyZWF0ZV9wc3RyZWFtKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2ludCBhdGg2a2xfd21pX2ltcGxpY2l0X2NyZWF0ZV9wc3RyZWFtKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgICB1MzIgbGF5ZXIyX3ByaW9yaXR5LCBib29sIHdtbV9lbmFibGVkLAogCQkJCSAgICAgICB1OCAqYWMpCiB7CkBAIC0yNjIsNyArMjgzLDEyIEBACiAJCQl1c3JfcHJpID0gbGF5ZXIyX3ByaW9yaXR5ICYgMHg3OwogCX0KIAotCS8qIHdvcmthcm91bmQgZm9yIFdNTSBTNSAqLworCS8qCisJICogd29ya2Fyb3VuZCBmb3IgV01NIFM1CisJICoKKwkgKiBGSVhNRTogd21pLT50cmFmZmljX2NsYXNzIGlzIGFsd2F5cyAxMDAgc28gdGhpcyB0ZXN0IGRvZXNuJ3QKKwkgKiBtYWtlIHNlbnNlCisJICovCiAJaWYgKCh3bWktPnRyYWZmaWNfY2xhc3MgPT0gV01NX0FDX1ZJKSAmJgogCSAgICAoKHVzcl9wcmkgPT0gNSkgfHwgKHVzcl9wcmkgPT0gNCkpKQogCQl1c3JfcHJpID0gMTsKQEAgLTI4NCw3ICszMTAsNyBAQAogCQkJY3B1X3RvX2xlMzIoV01JX0lNUExJQ0lUX1BTVFJFQU1fSU5BQ1RJVklUWV9JTlQpOwogCQkvKiBJbXBsaWNpdCBzdHJlYW1zIGFyZSBjcmVhdGVkIHdpdGggVFNJRCAweEZGICovCiAJCWNtZC50c2lkID0gV01JX0lNUExJQ0lUX1BTVFJFQU07Ci0JCWF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKHdtaSwgJmNtZCk7CisJCWF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKHdtaSwgaWZfaWR4LCAmY21kKTsKIAl9CiAKIAkqYWMgPSB0cmFmZmljX2NsYXNzOwpAQCAtNDEwLDEzICs0MzYsMTQgQEAKIH0KIAogc3RhdGljIGludCBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLAotCQkJCQkgICAgICBpbnQgbGVuKQorCQkJCQkgICAgICBpbnQgbGVuLCBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfcmVtYWluX29uX2NobmxfZXZlbnQgKmV2OwogCXUzMiBmcmVxOwogCXUzMiBkdXI7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwogCXN0cnVjdCBhdGg2a2wgKmFyID0gd21pLT5wYXJlbnRfZGV2OworCXUzMiBpZDsKIAogCWlmIChsZW4gPCBzaXplb2YoKmV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MjYsMjYgKzQ1MywyOSBAQAogCWR1ciA9IGxlMzJfdG9fY3B1KGV2LT5kdXJhdGlvbik7CiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgInJlbWFpbl9vbl9jaG5sOiBmcmVxPSV1IGR1cj0ldVxuIiwKIAkJICAgZnJlcSwgZHVyKTsKLQljaGFuID0gaWVlZTgwMjExX2dldF9jaGFubmVsKGFyLT53ZGV2LT53aXBoeSwgZnJlcSk7CisJY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChhci0+d2lwaHksIGZyZXEpOwogCWlmICghY2hhbikgewogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAicmVtYWluX29uX2Nobmw6IFVua25vd24gY2hhbm5lbCAiCiAJCQkgICAiKGZyZXE9JXUpXG4iLCBmcmVxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWNmZzgwMjExX3JlYWR5X29uX2NoYW5uZWwoYXItPm5ldF9kZXYsIDEsIGNoYW4sIE5MODAyMTFfQ0hBTl9OT19IVCwKKwlpZCA9IHZpZi0+bGFzdF9yb2NfaWQ7CisJY2ZnODAyMTFfcmVhZHlfb25fY2hhbm5lbCh2aWYtPm5kZXYsIGlkLCBjaGFuLCBOTDgwMjExX0NIQU5fTk9fSFQsCiAJCQkJICBkdXIsIEdGUF9BVE9NSUMpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX3dtaV9jYW5jZWxfcmVtYWluX29uX2NobmxfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLAotCQkJCQkJICAgICB1OCAqZGF0YXAsIGludCBsZW4pCisJCQkJCQkgICAgIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkJCSAgICAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX2NhbmNlbF9yZW1haW5fb25fY2hubF9ldmVudCAqZXY7CiAJdTMyIGZyZXE7CiAJdTMyIGR1cjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAJc3RydWN0IGF0aDZrbCAqYXIgPSB3bWktPnBhcmVudF9kZXY7CisJdTMyIGlkOwogCiAJaWYgKGxlbiA8IHNpemVvZigqZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ1NSwyMyArNDg1LDI5IEBACiAJZHVyID0gbGUzMl90b19jcHUoZXYtPmR1cmF0aW9uKTsKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiY2FuY2VsX3JlbWFpbl9vbl9jaG5sOiBmcmVxPSV1IGR1cj0ldSAiCiAJCSAgICJzdGF0dXM9JXVcbiIsIGZyZXEsIGR1ciwgZXYtPnN0YXR1cyk7Ci0JY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChhci0+d2Rldi0+d2lwaHksIGZyZXEpOworCWNoYW4gPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoYXItPndpcGh5LCBmcmVxKTsKIAlpZiAoIWNoYW4pIHsKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgImNhbmNlbF9yZW1haW5fb25fY2hubDogVW5rbm93biAiCiAJCQkgICAiY2hhbm5lbCAoZnJlcT0ldSlcbiIsIGZyZXEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWxfZXhwaXJlZChhci0+bmV0X2RldiwgMSwgY2hhbiwKKwlpZiAodmlmLT5sYXN0X2NhbmNlbF9yb2NfaWQgJiYKKwkgICAgdmlmLT5sYXN0X2NhbmNlbF9yb2NfaWQgKyAxID09IHZpZi0+bGFzdF9yb2NfaWQpCisJCWlkID0gdmlmLT5sYXN0X2NhbmNlbF9yb2NfaWQ7IC8qIGV2ZW50IGZvciBjYW5jZWwgY29tbWFuZCAqLworCWVsc2UKKwkJaWQgPSB2aWYtPmxhc3Rfcm9jX2lkOyAvKiB0aW1lb3V0IG9uIHVuY2FuY2VsZWQgci1vLWMgKi8KKwl2aWYtPmxhc3RfY2FuY2VsX3JvY19pZCA9IDA7CisJY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWxfZXhwaXJlZCh2aWYtPm5kZXYsIGlkLCBjaGFuLAogCQkJCQkgICBOTDgwMjExX0NIQU5fTk9fSFQsIEdGUF9BVE9NSUMpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV90eF9zdGF0dXNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfdHhfc3RhdHVzX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX3R4X3N0YXR1c19ldmVudCAqZXY7CiAJdTMyIGlkOwotCXN0cnVjdCBhdGg2a2wgKmFyID0gd21pLT5wYXJlbnRfZGV2OwogCiAJaWYgKGxlbiA8IHNpemVvZigqZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ4MSw3ICs1MTcsNyBAQAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJ0eF9zdGF0dXM6IGlkPSV4IGFja19zdGF0dXM9JXVcbiIsCiAJCSAgIGlkLCBldi0+YWNrX3N0YXR1cyk7CiAJaWYgKHdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lKSB7Ci0JCWNmZzgwMjExX21nbXRfdHhfc3RhdHVzKGFyLT5uZXRfZGV2LCBpZCwKKwkJY2ZnODAyMTFfbWdtdF90eF9zdGF0dXModmlmLT5uZGV2LCBpZCwKIAkJCQkJd21pLT5sYXN0X21nbXRfdHhfZnJhbWUsCiAJCQkJCXdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lX2xlbiwKIAkJCQkJISFldi0+YWNrX3N0YXR1cywgR0ZQX0FUT01JQyk7CkBAIC00OTMsMTIgKzUyOSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfcnhfcHJvYmVfcmVxX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX3J4X3Byb2JlX3JlcV9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkJICAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9wMnBfcnhfcHJvYmVfcmVxX2V2ZW50ICpldjsKIAl1MzIgZnJlcTsKIAl1MTYgZGxlbjsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IHdtaS0+cGFyZW50X2RldjsKIAogCWlmIChsZW4gPCBzaXplb2YoKmV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01MTMsMTAgKzU0OSwxMCBAQAogCX0KIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAicnhfcHJvYmVfcmVxOiBsZW49JXUgZnJlcT0ldSAiCiAJCSAgICJwcm9iZV9yZXFfcmVwb3J0PSVkXG4iLAotCQkgICBkbGVuLCBmcmVxLCBhci0+cHJvYmVfcmVxX3JlcG9ydCk7CisJCSAgIGRsZW4sIGZyZXEsIHZpZi0+cHJvYmVfcmVxX3JlcG9ydCk7CiAKLQlpZiAoYXItPnByb2JlX3JlcV9yZXBvcnQgfHwgYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykKLQkJY2ZnODAyMTFfcnhfbWdtdChhci0+bmV0X2RldiwgZnJlcSwgZXYtPmRhdGEsIGRsZW4sIEdGUF9BVE9NSUMpOworCWlmICh2aWYtPnByb2JlX3JlcV9yZXBvcnQgfHwgdmlmLT5ud190eXBlID09IEFQX05FVFdPUkspCisJCWNmZzgwMjExX3J4X21nbXQodmlmLT5uZGV2LCBmcmVxLCBldi0+ZGF0YSwgZGxlbiwgR0ZQX0FUT01JQyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUzNiwxMiArNTcyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9yeF9hY3Rpb25fZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfcnhfYWN0aW9uX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX3J4X2FjdGlvbl9ldmVudCAqZXY7CiAJdTMyIGZyZXE7CiAJdTE2IGRsZW47Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSB3bWktPnBhcmVudF9kZXY7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKCpldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTU1LDcgKzU5MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAicnhfYWN0aW9uOiBsZW49JXUgZnJlcT0ldVxuIiwgZGxlbiwgZnJlcSk7Ci0JY2ZnODAyMTFfcnhfbWdtdChhci0+bmV0X2RldiwgZnJlcSwgZXYtPmRhdGEsIGRsZW4sIEdGUF9BVE9NSUMpOworCWNmZzgwMjExX3J4X21nbXQodmlmLT5uZGV2LCBmcmVxLCBldi0+ZGF0YSwgZGxlbiwgR0ZQX0FUT01JQyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYyMCw3ICs2NTYsOCBAQAogfQogCiAvKiBTZW5kIGEgInNpbXBsZSIgd21pIGNvbW1hbmQgLS0gb25lIHdpdGggbm8gYXJndW1lbnRzICovCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfc2ltcGxlX2NtZChzdHJ1Y3Qgd21pICp3bWksIGVudW0gd21pX2NtZF9pZCBjbWRfaWQpCitzdGF0aWMgaW50IGF0aDZrbF93bWlfc2ltcGxlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgZW51bSB3bWlfY21kX2lkIGNtZF9pZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByZXQ7CkBAIC02MjksNyArNjY2LDcgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBjbWRfaWQsIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBjbWRfaWQsIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjQxLDcgKzY3OCw2IEBACiAJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3Qgd21pX3JlYWR5X2V2ZW50XzIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXdtaS0+cmVhZHkgPSB0cnVlOwogCWF0aDZrbF9yZWFkeV9ldmVudCh3bWktPnBhcmVudF9kZXYsIGV2LT5tYWNfYWRkciwKIAkJCSAgIGxlMzJfdG9fY3B1KGV2LT5zd192ZXJzaW9uKSwKIAkJCSAgIGxlMzJfdG9fY3B1KGV2LT5hYmlfdmVyc2lvbikpOwpAQCAtNjczLDMyICs3MDksNzMgQEAKIAljbWQtPmluZm8ucGFyYW1zLnJvYW1fcnNzaV9mbG9vciA9IERFRl9MUlNTSV9ST0FNX0ZMT09SOwogCWNtZC0+cm9hbV9jdHJsID0gV01JX1NFVF9MUlNTSV9TQ0FOX1BBUkFNUzsKIAotCWF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUk9BTV9DVFJMX0NNRElELCBOT19TWU5DX1dNSUZMQUcpOworCWF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9TRVRfUk9BTV9DVFJMX0NNRElELAorCQkJICAgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX2Nvbm5lY3RfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitpbnQgYXRoNmtsX3dtaV9mb3JjZV9yb2FtX2NtZChzdHJ1Y3Qgd21pICp3bWksIGNvbnN0IHU4ICpic3NpZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCByb2FtX2N0cmxfY21kICpjbWQ7CisKKwlza2IgPSBhdGg2a2xfd21pX2dldF9uZXdfYnVmKHNpemVvZigqY21kKSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kID0gKHN0cnVjdCByb2FtX2N0cmxfY21kICopIHNrYi0+ZGF0YTsKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCisJbWVtY3B5KGNtZC0+aW5mby5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKKwljbWQtPnJvYW1fY3RybCA9IFdNSV9GT1JDRV9ST0FNOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgImZvcmNlIHJvYW0gdG8gJXBNXG4iLCBic3NpZCk7CisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9TRVRfUk9BTV9DVFJMX0NNRElELAorCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7Cit9CisKK2ludCBhdGg2a2xfd21pX3NldF9yb2FtX21vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgZW51bSB3bWlfcm9hbV9tb2RlIG1vZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgcm9hbV9jdHJsX2NtZCAqY21kOworCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9IChzdHJ1Y3Qgcm9hbV9jdHJsX2NtZCAqKSBza2ItPmRhdGE7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKworCWNtZC0+aW5mby5yb2FtX21vZGUgPSBtb2RlOworCWNtZC0+cm9hbV9jdHJsID0gV01JX1NFVF9ST0FNX01PREU7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAic2V0IHJvYW0gbW9kZSAlZFxuIiwgbW9kZSk7CisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9TRVRfUk9BTV9DVFJMX0NNRElELAorCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9jb25uZWN0X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCSAgICAgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfY29ubmVjdF9ldmVudCAqZXY7CiAJdTggKnBpZSwgKnBlaWU7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSB3bWktPnBhcmVudF9kZXY7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCB3bWlfY29ubmVjdF9ldmVudCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZXYgPSAoc3RydWN0IHdtaV9jb25uZWN0X2V2ZW50ICopIGRhdGFwOwogCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKIAkJLyogQVAgbW9kZSBzdGFydC9TVEEgY29ubmVjdGVkIGV2ZW50ICovCi0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhci0+bmV0X2RldjsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZpZi0+bmRldjsKIAkJaWYgKG1lbWNtcChkZXYtPmRldl9hZGRyLCBldi0+dS5hcF9ic3MuYnNzaWQsIEVUSF9BTEVOKSA9PSAwKSB7CiAJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiJXM6IGZyZXEgJWQgYnNzaWQgJXBNICIKIAkJCQkgICAiKEFQIHN0YXJ0ZWQpXG4iLAogCQkJCSAgIF9fZnVuY19fLCBsZTE2X3RvX2NwdShldi0+dS5hcF9ic3MuY2gpLAogCQkJCSAgIGV2LT51LmFwX2Jzcy5ic3NpZCk7CiAJCQlhdGg2a2xfY29ubmVjdF9hcF9tb2RlX2JzcygKLQkJCQlhciwgbGUxNl90b19jcHUoZXYtPnUuYXBfYnNzLmNoKSk7CisJCQkJdmlmLCBsZTE2X3RvX2NwdShldi0+dS5hcF9ic3MuY2gpKTsKIAkJfSBlbHNlIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICIlczogYWlkICV1IG1hY19hZGRyICVwTSAiCiAJCQkJICAgImF1dGg9JXUga2V5bWdtdD0ldSBjaXBoZXI9JXUgYXBzZF9pbmZvPSV1ICIKQEAgLTcxMCw3ICs3ODcsNyBAQAogCQkJCSAgIGxlMTZfdG9fY3B1KGV2LT51LmFwX3N0YS5jaXBoZXIpLAogCQkJCSAgIGV2LT51LmFwX3N0YS5hcHNkX2luZm8pOwogCQkJYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9zdGEoCi0JCQkJYXIsIGV2LT51LmFwX3N0YS5haWQsIGV2LT51LmFwX3N0YS5tYWNfYWRkciwKKwkJCQl2aWYsIGV2LT51LmFwX3N0YS5haWQsIGV2LT51LmFwX3N0YS5tYWNfYWRkciwKIAkJCQlldi0+dS5hcF9zdGEua2V5bWdtdCwKIAkJCQlsZTE2X3RvX2NwdShldi0+dS5hcF9zdGEuY2lwaGVyKSwKIAkJCQlldi0+dS5hcF9zdGEuYXV0aCwgZXYtPmFzc29jX3JlcV9sZW4sCkBAIC03NTUsNyArODMyLDcgQEAKIAkJcGllICs9IHBpZVsxXSArIDI7CiAJfQogCi0JYXRoNmtsX2Nvbm5lY3RfZXZlbnQod21pLT5wYXJlbnRfZGV2LCBsZTE2X3RvX2NwdShldi0+dS5zdGEuY2gpLAorCWF0aDZrbF9jb25uZWN0X2V2ZW50KHZpZiwgbGUxNl90b19jcHUoZXYtPnUuc3RhLmNoKSwKIAkJCSAgICAgZXYtPnUuc3RhLmJzc2lkLAogCQkJICAgICBsZTE2X3RvX2NwdShldi0+dS5zdGEubGlzdGVuX2ludHZsKSwKIAkJCSAgICAgbGUxNl90b19jcHUoZXYtPnUuc3RhLmJlYWNvbl9pbnR2bCksCkBAIC04MzQsMTQgKzkxMSwxNSBAQAogCQlhbHBoYTJbMF0gPSBjb3VudHJ5LT5pc29OYW1lWzBdOwogCQlhbHBoYTJbMV0gPSBjb3VudHJ5LT5pc29OYW1lWzFdOwogCi0JCXJlZ3VsYXRvcnlfaGludCh3bWktPnBhcmVudF9kZXYtPndkZXYtPndpcGh5LCBhbHBoYTIpOworCQlyZWd1bGF0b3J5X2hpbnQod21pLT5wYXJlbnRfZGV2LT53aXBoeSwgYWxwaGEyKTsKIAogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiQ291bnRyeSBhbHBoYTIgYmVpbmcgdXNlZDogJWMlY1xuIiwKIAkJCQlhbHBoYTJbMF0sIGFscGhhMlsxXSk7CiAJfQogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfZGlzY29ubmVjdF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9kaXNjb25uZWN0X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9kaXNjb25uZWN0X2V2ZW50ICpldjsKIAl3bWktPnRyYWZmaWNfY2xhc3MgPSAxMDA7CkBAIC04NTcsMTAgKzkzNSw4IEBACiAJCSAgIGV2LT5kaXNjb25uX3JlYXNvbiwgZXYtPmFzc29jX3Jlc3BfbGVuKTsKIAogCXdtaS0+aXNfd21tX2VuYWJsZWQgPSBmYWxzZTsKLQl3bWktPnBhaXJfY3J5cHRvX3R5cGUgPSBOT05FX0NSWVBUOwotCXdtaS0+Z3JwX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKIAotCWF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHdtaS0+cGFyZW50X2RldiwgZXYtPmRpc2Nvbm5fcmVhc29uLAorCWF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHZpZiwgZXYtPmRpc2Nvbm5fcmVhc29uLAogCQkJCWV2LT5ic3NpZCwgZXYtPmFzc29jX3Jlc3BfbGVuLCBldi0+YXNzb2NfaW5mbywKIAkJCQlsZTE2X3RvX2NwdShldi0+cHJvdG9fcmVhc29uX3N0YXR1cykpOwogCkBAIC04ODYsNyArOTYyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX3RraXBfbWljZXJyX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX3RraXBfbWljZXJyX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfdGtpcF9taWNlcnJfZXZlbnQgKmV2OwogCkBAIC04OTUsMTIgKzk3MiwxMyBAQAogCiAJZXYgPSAoc3RydWN0IHdtaV90a2lwX21pY2Vycl9ldmVudCAqKSBkYXRhcDsKIAotCWF0aDZrbF90a2lwX21pY2Vycl9ldmVudCh3bWktPnBhcmVudF9kZXYsIGV2LT5rZXlfaWQsIGV2LT5pc19tY2FzdCk7CisJYXRoNmtsX3RraXBfbWljZXJyX2V2ZW50KHZpZiwgZXYtPmtleV9pZCwgZXYtPmlzX21jYXN0KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfYnNzaW5mb19ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9ic3NpbmZvX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCSAgICAgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfYnNzX2luZm9faGRyMiAqYmloOwogCXU4ICpidWY7CkBAIC05MjcsMjYgKzEwMDUsMjcgQEAKIAkJcmV0dXJuIDA7IC8qIE9ubHkgdXBkYXRlIEJTUyB0YWJsZSBmb3Igbm93ICovCiAKIAlpZiAoYmloLT5mcmFtZV90eXBlID09IEJFQUNPTl9GVFlQRSAmJgotCSAgICB0ZXN0X2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmYXItPmZsYWcpKSB7Ci0JCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmYXItPmZsYWcpOwotCQlhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgTk9ORV9CU1NfRklMVEVSLCAwKTsKKwkgICAgdGVzdF9iaXQoQ0xFQVJfQlNTRklMVEVSX09OX0JFQUNPTiwgJnZpZi0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmdmlmLT5mbGFncyk7CisJCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSBOT05FX0JTU19GSUxURVIsIDApOwogCX0KIAotCWNoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoYXItPndkZXYtPndpcGh5LCBsZTE2X3RvX2NwdShiaWgtPmNoKSk7CisJY2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChhci0+d2lwaHksIGxlMTZfdG9fY3B1KGJpaC0+Y2gpKTsKIAlpZiAoY2hhbm5lbCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChsZW4gPCA4ICsgMiArIDIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGJpaC0+ZnJhbWVfdHlwZSA9PSBCRUFDT05fRlRZUEUgJiYgdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpICYmCi0JICAgIG1lbWNtcChiaWgtPmJzc2lkLCBhci0+YnNzaWQsIEVUSF9BTEVOKSA9PSAwKSB7CisJaWYgKGJpaC0+ZnJhbWVfdHlwZSA9PSBCRUFDT05fRlRZUEUgJiYgdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykKKwkgICAgJiYgbWVtY21wKGJpaC0+YnNzaWQsIHZpZi0+YnNzaWQsIEVUSF9BTEVOKSA9PSAwKSB7CiAJCWNvbnN0IHU4ICp0aW07CiAJCXRpbSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfVElNLCBidWYgKyA4ICsgMiArIDIsCiAJCQkJICAgICAgIGxlbiAtIDggLSAyIC0gMik7CiAJCWlmICh0aW0gJiYgdGltWzFdID49IDIpIHsKLQkJCWFyLT5hc3NvY19ic3NfZHRpbV9wZXJpb2QgPSB0aW1bM107Ci0JCQlzZXRfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmYXItPmZsYWcpOworCQkJdmlmLT5hc3NvY19ic3NfZHRpbV9wZXJpb2QgPSB0aW1bM107CisJCQlzZXRfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmdmlmLT5mbGFncyk7CiAJCX0KIAl9CiAKQEAgLTk2Niw3ICsxMDQ1LDcgQEAKIAkJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7CiAJCW1lbXNldChtZ210LT5kYSwgMHhmZiwgRVRIX0FMRU4pOwogCX0gZWxzZSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhci0+bmV0X2RldjsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZpZi0+bmRldjsKIAogCQltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAogCQkJCQkJICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7CkBAIC05NzksNyArMTA1OCw3IEBACiAKIAltZW1jcHkoJm1nbXQtPnUuYmVhY29uLCBidWYsIGxlbik7CiAKLQlic3MgPSBjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lKGFyLT53ZGV2LT53aXBoeSwgY2hhbm5lbCwgbWdtdCwKKwlic3MgPSBjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lKGFyLT53aXBoeSwgY2hhbm5lbCwgbWdtdCwKIAkJCQkJMjQgKyBsZW4sIChiaWgtPnNuciAtIDk1KSAqIDEwMCwKIAkJCQkJR0ZQX0FUT01JQyk7CiAJa2ZyZWUobWdtdCk7CkBAIC0xMDk0LDIwICsxMTczLDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9zY2FuX2NvbXBsZXRlX3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX3NjYW5fY29tcGxldGVfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJICAgICAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9zY2FuX2NvbXBsZXRlX2V2ZW50ICpldjsKIAogCWV2ID0gKHN0cnVjdCB3bWlfc2Nhbl9jb21wbGV0ZV9ldmVudCAqKSBkYXRhcDsKIAotCWF0aDZrbF9zY2FuX2NvbXBsZXRlX2V2dCh3bWktPnBhcmVudF9kZXYsIGFfc2xlMzJfdG9fY3B1KGV2LT5zdGF0dXMpKTsKKwlhdGg2a2xfc2Nhbl9jb21wbGV0ZV9ldnQodmlmLCBhX3NsZTMyX3RvX2NwdShldi0+c3RhdHVzKSk7CiAJd21pLT5pc19wcm9iZV9zc2lkID0gZmFsc2U7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfd21pX25laWdoYm9yX3JlcG9ydF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwKLQkJCQkJICAgICAgIGludCBsZW4pCisJCQkJCSAgICAgICBpbnQgbGVuLCBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfbmVpZ2hib3JfcmVwb3J0X2V2ZW50ICpldjsKIAl1OCBpOwpAQCAtMTEyNSw3ICsxMjA1LDcgQEAKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIm5laWdoYm9yICVkLyVkIC0gJXBNIDB4JXhcbiIsCiAJCQkgICBpICsgMSwgZXYtPm51bV9uZWlnaGJvcnMsIGV2LT5uZWlnaGJvcltpXS5ic3NpZCwKIAkJCSAgIGV2LT5uZWlnaGJvcltpXS5ic3NfZmxhZ3MpOwotCQljZmc4MDIxMV9wbWtzYV9jYW5kaWRhdGVfbm90aWZ5KHdtaS0+cGFyZW50X2Rldi0+bmV0X2RldiwgaSwKKwkJY2ZnODAyMTFfcG1rc2FfY2FuZGlkYXRlX25vdGlmeSh2aWYtPm5kZXYsIGksCiAJCQkJCQlldi0+bmVpZ2hib3JbaV0uYnNzaWQsCiAJCQkJCQkhIShldi0+bmVpZ2hib3JbaV0uYnNzX2ZsYWdzICYKIAkJCQkJCSAgIFdNSV9QUkVBVVRIX0NBUEFCTEVfQlNTKSwKQEAgLTExNjYsOSArMTI0NiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfc3RhdHNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfc3RhdHNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJICAgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewotCWF0aDZrbF90Z3Rfc3RhdHNfZXZlbnQod21pLT5wYXJlbnRfZGV2LCBkYXRhcCwgbGVuKTsKKwlhdGg2a2xfdGd0X3N0YXRzX2V2ZW50KHZpZiwgZGF0YXAsIGxlbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMjIsNyArMTMwMyw3IEBACiAJY21kID0gKHN0cnVjdCB3bWlfcnNzaV90aHJlc2hvbGRfcGFyYW1zX2NtZCAqKSBza2ItPmRhdGE7CiAJbWVtY3B5KGNtZCwgcnNzaV9jbWQsIHNpemVvZihzdHJ1Y3Qgd21pX3Jzc2lfdGhyZXNob2xkX3BhcmFtc19jbWQpKTsKIAotCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfUlNTSV9USFJFU0hPTERfUEFSQU1TX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfUlNTSV9USFJFU0hPTERfUEFSQU1TX0NNRElELAogCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7CiB9CiAKQEAgLTEzMjIsNyArMTQwMyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9jYWNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfY2FjX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCSAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9jYWNfZXZlbnQgKnJlcGx5OwogCXN0cnVjdCBpZWVlODAyMTFfdHNwZWNfaWUgKnRzOwpAQCAtMTM0Myw3ICsxNDI1LDggQEAKIAkJdHNpZCA9ICh0c2luZm8gPj4gSUVFRTgwMjExX1dNTV9JRV9UU1BFQ19USURfU0hJRlQpICYKIAkJCUlFRUU4MDIxMV9XTU1fSUVfVFNQRUNfVElEX01BU0s7CiAKLQkJYXRoNmtsX3dtaV9kZWxldGVfcHN0cmVhbV9jbWQod21pLCByZXBseS0+YWMsIHRzaWQpOworCQlhdGg2a2xfd21pX2RlbGV0ZV9wc3RyZWFtX2NtZCh3bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICAgcmVwbHktPmFjLCB0c2lkKTsKIAl9IGVsc2UgaWYgKHJlcGx5LT5jYWNfaW5kaWNhdGlvbiA9PSBDQUNfSU5ESUNBVElPTl9OT19SRVNQKSB7CiAJCS8qCiAJCSAqIEZvbGxvd2luZyBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgb3V0c3RhbmRpbmcKQEAgLTEzNTgsNyArMTQ0MSw4IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGluZGV4IDwgKHNpemVvZihhY3RpdmVfdHNpZHMpICogOCkpCi0JCQlhdGg2a2xfd21pX2RlbGV0ZV9wc3RyZWFtX2NtZCh3bWksIHJlcGx5LT5hYywgaW5kZXgpOworCQkJYXRoNmtsX3dtaV9kZWxldGVfcHN0cmVhbV9jbWQod21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgICAgICByZXBseS0+YWMsIGluZGV4KTsKIAl9CiAKIAkvKgpAQCAtMTQwMyw3ICsxNDg3LDcgQEAKIAljbWQgPSAoc3RydWN0IHdtaV9zbnJfdGhyZXNob2xkX3BhcmFtc19jbWQgKikgc2tiLT5kYXRhOwogCW1lbWNweShjbWQsIHNucl9jbWQsIHNpemVvZihzdHJ1Y3Qgd21pX3Nucl90aHJlc2hvbGRfcGFyYW1zX2NtZCkpOwogCi0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TTlJfVEhSRVNIT0xEX1BBUkFNU19DTURJRCwKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIDAsIHNrYiwgV01JX1NOUl9USFJFU0hPTERfUEFSQU1TX0NNRElELAogCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7CiB9CiAKQEAgLTE1MjgsMTQgKzE2MTIsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGF0aDZrbF93bWlfY21kX3NlbmQoc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGF0aDZrbF93bWlfY21kX3NlbmQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQllbnVtIHdtaV9jbWRfaWQgY21kX2lkLCBlbnVtIHdtaV9zeW5jX2ZsYWcgc3luY19mbGFnKQogewogCXN0cnVjdCB3bWlfY21kX2hkciAqY21kX2hkcjsKIAllbnVtIGh0Y19lbmRwb2ludF9pZCBlcF9pZCA9IHdtaS0+ZXBfaWQ7CiAJaW50IHJldDsKKwl1MTYgaW5mbzE7CiAKLQlpZiAoV0FSTl9PTihza2IgPT0gTlVMTCkpCisJaWYgKFdBUk5fT04oc2tiID09IE5VTEwgfHwgKGlmX2lkeCA+IChNQVhfTlVNX1ZJRiAtIDEpKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIndtaSB0eCBpZCAlZCBsZW4gJWQgZmxhZyAlZFxuIiwKQEAgLTE1NTQsMTkgKzE2MzksMjAgQEAKIAkJICogTWFrZSBzdXJlIGFsbCBkYXRhIGN1cnJlbnRseSBxdWV1ZWQgaXMgdHJhbnNtaXR0ZWQgYmVmb3JlCiAJCSAqIHRoZSBjbWQgZXhlY3V0aW9uLiAgRXN0YWJsaXNoIGEgbmV3IHN5bmMgcG9pbnQuCiAJCSAqLwotCQlhdGg2a2xfd21pX3N5bmNfcG9pbnQod21pKTsKKwkJYXRoNmtsX3dtaV9zeW5jX3BvaW50KHdtaSwgaWZfaWR4KTsKIAl9CiAKIAlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3Qgd21pX2NtZF9oZHIpKTsKIAogCWNtZF9oZHIgPSAoc3RydWN0IHdtaV9jbWRfaGRyICopIHNrYi0+ZGF0YTsKIAljbWRfaGRyLT5jbWRfaWQgPSBjcHVfdG9fbGUxNihjbWRfaWQpOwotCWNtZF9oZHItPmluZm8xID0gMDsJLyogYWRkZWQgZm9yIHZpcnR1YWwgaW50ZXJmYWNlICovCisJaW5mbzEgPSBpZl9pZHggJiBXTUlfQ01EX0hEUl9JRl9JRF9NQVNLOworCWNtZF9oZHItPmluZm8xID0gY3B1X3RvX2xlMTYoaW5mbzEpOwogCiAJLyogT25seSBmb3IgT1BUX1RYX0NNRCwgdXNlIEJFIGVuZHBvaW50LiAqLwogCWlmIChjbWRfaWQgPT0gV01JX09QVF9UWF9GUkFNRV9DTURJRCkgewogCQlyZXQgPSBhdGg2a2xfd21pX2RhdGFfaGRyX2FkZCh3bWksIHNrYiwgT1BUX01TR1RZUEUsCi0JCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgMCwgTlVMTCk7CisJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgMCwgTlVMTCwgaWZfaWR4KTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIHJldDsKQEAgLTE1ODIsMTMgKzE2NjgsMTQgQEAKIAkJICogTWFrZSBzdXJlIGFsbCBuZXcgZGF0YSBxdWV1ZWQgd2FpdHMgZm9yIHRoZSBjb21tYW5kIHRvCiAJCSAqIGV4ZWN1dGUuIEVzdGFibGlzaCBhIG5ldyBzeW5jIHBvaW50LgogCQkgKi8KLQkJYXRoNmtsX3dtaV9zeW5jX3BvaW50KHdtaSk7CisJCWF0aDZrbF93bWlfc3luY19wb2ludCh3bWksIGlmX2lkeCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgZW51bSBuZXR3b3JrX3R5cGUgbndfdHlwZSwKK2ludCBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJICAgZW51bSBuZXR3b3JrX3R5cGUgbndfdHlwZSwKIAkJCSAgIGVudW0gZG90MTFfYXV0aF9tb2RlIGRvdDExX2F1dGhfbW9kZSwKIAkJCSAgIGVudW0gYXV0aF9tb2RlIGF1dGhfbW9kZSwKIAkJCSAgIGVudW0gY3J5cHRvX3R5cGUgcGFpcndpc2VfY3J5cHRvLApAQCAtMTYzOSwxNSArMTcyNiwxNCBAQAogCWlmIChic3NpZCAhPSBOVUxMKQogCQltZW1jcHkoY2MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwogCi0Jd21pLT5wYWlyX2NyeXB0b190eXBlID0gcGFpcndpc2VfY3J5cHRvOwotCXdtaS0+Z3JwX2NyeXB0b190eXBlID0gZ3JvdXBfY3J5cHRvOwotCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0NPTk5FQ1RfQ01ESUQsIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQ09OTkVDVF9DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9yZWNvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggKmJzc2lkLCB1MTYgY2hhbm5lbCkKK2ludCBhdGg2a2xfd21pX3JlY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4ICpic3NpZCwKKwkJCSAgICAgdTE2IGNoYW5uZWwpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3JlY29ubmVjdF9jbWQgKmNjOwpAQCAtMTY2OCwxMyArMTc1NCwxMyBAQAogCWlmIChic3NpZCAhPSBOVUxMKQogCQltZW1jcHkoY2MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1JFQ09OTkVDVF9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9SRUNPTk5FQ1RfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pKQoraW50IGF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpCiB7CiAJaW50IHJldDsKIApAQCAtMTY4MywxMiArMTc2OSwxMyBAQAogCXdtaS0+dHJhZmZpY19jbGFzcyA9IDEwMDsKIAogCS8qIERpc2Nvbm5lY3QgY29tbWFuZCBkb2VzIG5vdCBuZWVkIHRvIGRvIGEgU1lOQyBiZWZvcmUuICovCi0JcmV0ID0gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgV01JX0RJU0NPTk5FQ1RfQ01ESUQpOworCXJldCA9IGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIGlmX2lkeCwgV01JX0RJU0NPTk5FQ1RfQ01ESUQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc3RhcnRzY2FuX2NtZChzdHJ1Y3Qgd21pICp3bWksIGVudW0gd21pX3NjYW5fdHlwZSBzY2FuX3R5cGUsCitpbnQgYXRoNmtsX3dtaV9zdGFydHNjYW5fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJICAgICBlbnVtIHdtaV9zY2FuX3R5cGUgc2Nhbl90eXBlLAogCQkJICAgICB1MzIgZm9yY2VfZmdzY2FuLCB1MzIgaXNfbGVnYWN5LAogCQkJICAgICB1MzIgaG9tZV9kd2VsbF90aW1lLCB1MzIgZm9yY2Vfc2Nhbl9pbnRlcnZhbCwKIAkJCSAgICAgczggbnVtX2NoYW4sIHUxNiAqY2hfbGlzdCkKQEAgLTE3MjQsMTMgKzE4MTEsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoYW47IGkrKykKIAkJc2MtPmNoX2xpc3RbaV0gPSBjcHVfdG9fbGUxNihjaF9saXN0W2ldKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TVEFSVF9TQ0FOX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NUQVJUX1NDQU5fQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2NhbnBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgZmdfc3RhcnRfc2VjLAoraW50IGF0aDZrbF93bWlfc2NhbnBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkgICAgICB1MTYgZmdfc3RhcnRfc2VjLAogCQkJICAgICAgdTE2IGZnX2VuZF9zZWMsIHUxNiBiZ19zZWMsCiAJCQkgICAgICB1MTYgbWluYWN0X2NoZHdfbXNlYywgdTE2IG1heGFjdF9jaGR3X21zZWMsCiAJCQkgICAgICB1MTYgcGFzX2NoZHdfbXNlYywgdTggc2hvcnRfc2Nhbl9yYXRpbywKQEAgLTE3NTcsMTIgKzE4NDUsMTIgQEAKIAlzYy0+bWF4X2Rmc2NoX2FjdF90aW1lID0gY3B1X3RvX2xlMzIobWF4X2Rmc2NoX2FjdF90aW1lKTsKIAlzYy0+bWF4YWN0X3NjYW5fcGVyX3NzaWQgPSBjcHVfdG9fbGUxNihtYXhhY3Rfc2Nhbl9wZXJfc3NpZCk7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX1NDQU5fUEFSQU1TX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9TQ0FOX1BBUkFNU19DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGZpbHRlciwgdTMyIGllX21hc2spCitpbnQgYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBmaWx0ZXIsIHUzMiBpZV9tYXNrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9ic3NfZmlsdGVyX2NtZCAqY21kOwpAQCAtMTc3OSwxMiArMTg2NywxMiBAQAogCWNtZC0+YnNzX2ZpbHRlciA9IGZpbHRlcjsKIAljbWQtPmllX21hc2sgPSBjcHVfdG9fbGUzMihpZV9tYXNrKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfQlNTX0ZJTFRFUl9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfQlNTX0ZJTFRFUl9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpbmRleCwgdTggZmxhZywKK2ludCBhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBpbmRleCwgdTggZmxhZywKIAkJCSAgICAgIHU4IHNzaWRfbGVuLCB1OCAqc3NpZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTgxNiwxMiArMTkwNCwxMyBAQAogCWNtZC0+c3NpZF9sZW4gPSBzc2lkX2xlbjsKIAltZW1jcHkoY21kLT5zc2lkLCBzc2lkLCBzc2lkX2xlbik7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX1BST0JFRF9TU0lEX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9QUk9CRURfU1NJRF9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfbGlzdGVuaW50ZXJ2YWxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTE2IGxpc3Rlbl9pbnRlcnZhbCwKK2ludCBhdGg2a2xfd21pX2xpc3RlbmludGVydmFsX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgIHUxNiBsaXN0ZW5faW50ZXJ2YWwsCiAJCQkJICB1MTYgbGlzdGVuX2JlYWNvbnMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTE4MzYsMTIgKzE5MjUsMTIgQEAKIAljbWQtPmxpc3Rlbl9pbnR2bCA9IGNwdV90b19sZTE2KGxpc3Rlbl9pbnRlcnZhbCk7CiAJY21kLT5udW1fYmVhY29ucyA9IGNwdV90b19sZTE2KGxpc3Rlbl9iZWFjb25zKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfTElTVEVOX0lOVF9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfTElTVEVOX0lOVF9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHB3cl9tb2RlKQoraW50IGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggcHdyX21vZGUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3Bvd2VyX21vZGVfY21kICpjbWQ7CkBAIC0xODU1LDEyICsxOTQ0LDEyIEBACiAJY21kLT5wd3JfbW9kZSA9IHB3cl9tb2RlOwogCXdtaS0+cHdyX21vZGUgPSBwd3JfbW9kZTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUE9XRVJfTU9ERV9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfUE9XRVJfTU9ERV9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTE2IGlkbGVfcGVyaW9kLAoraW50IGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MTYgaWRsZV9wZXJpb2QsCiAJCQkgICAgdTE2IHBzX3BvbGxfbnVtLCB1MTYgZHRpbV9wb2xpY3ksCiAJCQkgICAgdTE2IHR4X3dha2V1cF9wb2xpY3ksIHUxNiBudW1fdHhfdG9fd2FrZXVwLAogCQkJICAgIHUxNiBwc19mYWlsX2V2ZW50X3BvbGljeSkKQEAgLTE4ODEsMTIgKzE5NzAsMTIgQEAKIAlwbS0+bnVtX3R4X3RvX3dha2V1cCA9IGNwdV90b19sZTE2KG51bV90eF90b193YWtldXApOwogCXBtLT5wc19mYWlsX2V2ZW50X3BvbGljeSA9IGNwdV90b19sZTE2KHBzX2ZhaWxfZXZlbnRfcG9saWN5KTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUE9XRVJfUEFSQU1TX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9QT1dFUl9QQVJBTVNfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHRpbWVvdXQpCitpbnQgYXRoNmtsX3dtaV9kaXNjdGltZW91dF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IHRpbWVvdXQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2Rpc2NfdGltZW91dF9jbWQgKmNtZDsKQEAgLTE4OTksMTUgKzE5ODgsMjAgQEAKIAljbWQgPSAoc3RydWN0IHdtaV9kaXNjX3RpbWVvdXRfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPmRpc2Nvbl90aW1lb3V0ID0gdGltZW91dDsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfRElTQ19USU1FT1VUX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9ESVNDX1RJTUVPVVRfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOworCisJaWYgKHJldCA9PSAwKQorCQlhdGg2a2xfZGVidWdfc2V0X2Rpc2Nvbm5lY3RfdGltZW91dCh3bWktPnBhcmVudF9kZXYsIHRpbWVvdXQpOworCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfYWRka2V5X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGtleV9pbmRleCwKK2ludCBhdGg2a2xfd21pX2FkZGtleV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGtleV9pbmRleCwKIAkJCSAgZW51bSBjcnlwdG9fdHlwZSBrZXlfdHlwZSwKIAkJCSAgdTgga2V5X3VzYWdlLCB1OCBrZXlfbGVuLAotCQkJICB1OCAqa2V5X3JzYywgdTggKmtleV9tYXRlcmlhbCwKKwkJCSAgdTggKmtleV9yc2MsIHVuc2lnbmVkIGludCBrZXlfcnNjX2xlbiwKKwkJCSAgdTggKmtleV9tYXRlcmlhbCwKIAkJCSAgdTgga2V5X29wX2N0cmwsIHU4ICptYWNfYWRkciwKIAkJCSAgZW51bSB3bWlfc3luY19mbGFnIHN5bmNfZmxhZykKIHsKQEAgLTE5MjAsNyArMjAxNCw3IEBACiAJCSAgIGtleV9pbmRleCwga2V5X3R5cGUsIGtleV91c2FnZSwga2V5X2xlbiwga2V5X29wX2N0cmwpOwogCiAJaWYgKChrZXlfaW5kZXggPiBXTUlfTUFYX0tFWV9JTkRFWCkgfHwgKGtleV9sZW4gPiBXTUlfTUFYX0tFWV9MRU4pIHx8Ci0JICAgIChrZXlfbWF0ZXJpYWwgPT0gTlVMTCkpCisJICAgIChrZXlfbWF0ZXJpYWwgPT0gTlVMTCkgfHwga2V5X3JzY19sZW4gPiA4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICgoV0VQX0NSWVBUICE9IGtleV90eXBlKSAmJiAoTlVMTCA9PSBrZXlfcnNjKSkKQEAgLTE5MzgsMjAgKzIwMzIsMjAgQEAKIAltZW1jcHkoY21kLT5rZXksIGtleV9tYXRlcmlhbCwga2V5X2xlbik7CiAKIAlpZiAoa2V5X3JzYyAhPSBOVUxMKQotCQltZW1jcHkoY21kLT5rZXlfcnNjLCBrZXlfcnNjLCBzaXplb2YoY21kLT5rZXlfcnNjKSk7CisJCW1lbWNweShjbWQtPmtleV9yc2MsIGtleV9yc2MsIGtleV9yc2NfbGVuKTsKIAogCWNtZC0+a2V5X29wX2N0cmwgPSBrZXlfb3BfY3RybDsKIAogCWlmIChtYWNfYWRkcikKIAkJbWVtY3B5KGNtZC0+a2V5X21hY19hZGRyLCBtYWNfYWRkciwgRVRIX0FMRU4pOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0FERF9DSVBIRVJfS0VZX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0FERF9DSVBIRVJfS0VZX0NNRElELAogCQkJCSAgc3luY19mbGFnKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2FkZF9rcmtfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggKmtyaykKK2ludCBhdGg2a2xfd21pX2FkZF9rcmtfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCAqa3JrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9hZGRfa3JrX2NtZCAqY21kOwpAQCAtMTk2NCwxMiArMjA1OCwxMyBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX2FkZF9rcmtfY21kICopIHNrYi0+ZGF0YTsKIAltZW1jcHkoY21kLT5rcmssIGtyaywgV01JX0tSS19MRU4pOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0FERF9LUktfQ01ESUQsIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQUREX0tSS19DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9kZWxldGVrZXlfY21kKHN0cnVjdCB3bWkgKndtaSwgdTgga2V5X2luZGV4KQoraW50IGF0aDZrbF93bWlfZGVsZXRla2V5X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTgga2V5X2luZGV4KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9kZWxldGVfY2lwaGVyX2tleV9jbWQgKmNtZDsKQEAgLTE5ODUsMTMgKzIwODAsMTMgQEAKIAljbWQgPSAoc3RydWN0IHdtaV9kZWxldGVfY2lwaGVyX2tleV9jbWQgKikgc2tiLT5kYXRhOwogCWNtZC0+a2V5X2luZGV4ID0ga2V5X2luZGV4OwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0RFTEVURV9DSVBIRVJfS0VZX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0RFTEVURV9DSVBIRVJfS0VZX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX3NldHBta2lkX2NtZChzdHJ1Y3Qgd21pICp3bWksIGNvbnN0IHU4ICpic3NpZCwKK2ludCBhdGg2a2xfd21pX3NldHBta2lkX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgY29uc3QgdTggKmJzc2lkLAogCQkJICAgIGNvbnN0IHU4ICpwbWtpZCwgYm9vbCBzZXQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTIwMTgsMTQgKzIxMTMsMTQgQEAKIAkJY21kLT5lbmFibGUgPSBQTUtJRF9ESVNBQkxFOwogCX0KIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUE1LSURfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VUX1BNS0lEX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX3dtaV9kYXRhX3N5bmNfc2VuZChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICBlbnVtIGh0Y19lbmRwb2ludF9pZCBlcF9pZCkKKwkJCSAgICAgIGVudW0gaHRjX2VuZHBvaW50X2lkIGVwX2lkLCB1OCBpZl9pZHgpCiB7CiAJc3RydWN0IHdtaV9kYXRhX2hkciAqZGF0YV9oZHI7CiAJaW50IHJldDsKQEAgLTIwMzcsMTQgKzIxMzIsMTQgQEAKIAogCWRhdGFfaGRyID0gKHN0cnVjdCB3bWlfZGF0YV9oZHIgKikgc2tiLT5kYXRhOwogCWRhdGFfaGRyLT5pbmZvID0gU1lOQ19NU0dUWVBFIDw8IFdNSV9EQVRBX0hEUl9NU0dfVFlQRV9TSElGVDsKLQlkYXRhX2hkci0+aW5mbzMgPSAwOworCWRhdGFfaGRyLT5pbmZvMyA9IGNwdV90b19sZTE2KGlmX2lkeCAmIFdNSV9EQVRBX0hEUl9JRl9JRFhfTUFTSyk7CiAKIAlyZXQgPSBhdGg2a2xfY29udHJvbF90eCh3bWktPnBhcmVudF9kZXYsIHNrYiwgZXBfaWQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX3N5bmNfcG9pbnQoc3RydWN0IHdtaSAqd21pKQorc3RhdGljIGludCBhdGg2a2xfd21pX3N5bmNfcG9pbnQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3N5bmNfY21kICpjbWQ7CkBAIC0yMTAwLDcgKzIxOTUsNyBAQAogCSAqIFNlbmQgc3luYyBjbWQgZm9sbG93ZWQgYnkgc3luYyBkYXRhIG1lc3NhZ2VzIG9uIGFsbAogCSAqIGVuZHBvaW50cyBiZWluZyB1c2VkCiAJICovCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NZTkNIUk9OSVpFX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NZTkNIUk9OSVpFX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAogCWlmIChyZXQpCkBAIC0yMTE5LDcgKzIyMTQsNyBAQAogCQkJCQkgICAgICAgdHJhZmZpY19jbGFzcyk7CiAJCXJldCA9CiAJCSAgICBhdGg2a2xfd21pX2RhdGFfc3luY19zZW5kKHdtaSwgZGF0YV9zeW5jX2J1ZnNbaW5kZXhdLnNrYiwKLQkJCQkJICAgICAgZXBfaWQpOworCQkJCQkgICAgICBlcF9pZCwgaWZfaWR4KTsKIAogCQlpZiAocmV0KQogCQkJYnJlYWs7CkBAIC0yMTQyLDcgKzIyMzcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2NyZWF0ZV9wc3RyZWFtX2NtZChzdHJ1Y3Qgd21pICp3bWksCitpbnQgYXRoNmtsX3dtaV9jcmVhdGVfcHN0cmVhbV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCiAJCQkJICBzdHJ1Y3Qgd21pX2NyZWF0ZV9wc3RyZWFtX2NtZCAqcGFyYW1zKQogewogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0yMjMxLDEyICsyMzI2LDEzIEBACiAJCWF0aDZrbF9pbmRpY2F0ZV90eF9hY3Rpdml0eSh3bWktPnBhcmVudF9kZXYsCiAJCQkJCSAgICBwYXJhbXMtPnRyYWZmaWNfY2xhc3MsIHRydWUpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0NSRUFURV9QU1RSRUFNX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0NSRUFURV9QU1RSRUFNX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9kZWxldGVfcHN0cmVhbV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCB0cmFmZmljX2NsYXNzLCB1OCB0c2lkKQoraW50IGF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCB0cmFmZmljX2NsYXNzLAorCQkJCSAgdTggdHNpZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfZGVsZXRlX3BzdHJlYW1fY21kICpjbWQ7CkBAIC0yMjcyLDcgKzIzNjgsNyBAQAogCQkgICAic2VuZGluZyBkZWxldGVfcHN0cmVhbV9jbWQ6IHRyYWZmaWMgY2xhc3M6ICVkIHRzaWQ9JWRcbiIsCiAJCSAgIHRyYWZmaWNfY2xhc3MsIHRzaWQpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0RFTEVURV9QU1RSRUFNX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0RFTEVURV9QU1RSRUFNX0NNRElELAogCQkJCSAgU1lOQ19CRUZPUkVfV01JRkxBRyk7CiAKIAlzcGluX2xvY2tfYmgoJndtaS0+bG9jayk7CkBAIC0yMzExLDE3ICsyNDA3LDE3MyBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF9pcF9jbWQgKikgc2tiLT5kYXRhOwogCW1lbWNweShjbWQsIGlwX2NtZCwgc2l6ZW9mKHN0cnVjdCB3bWlfc2V0X2lwX2NtZCkpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9JUF9DTURJRCwgTk9fU1lOQ19XTUlGTEFHKTsKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfU0VUX0lQX0NNRElELAorCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfZ2V0X3dvd19saXN0X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKiBkYXRhcCwKLQkJCQkJICAgIGludCBsZW4pCitzdGF0aWMgdm9pZCBhdGg2a2xfd21pX3JlbGlucXVpc2hfaW1wbGljaXRfcHN0cmVhbV9jcmVkaXRzKHN0cnVjdCB3bWkgKndtaSkKIHsKLQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCB3bWlfZ2V0X3dvd19saXN0X3JlcGx5KSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJdTE2IGFjdGl2ZV90c2lkczsKKwl1OCBzdHJlYW1fZXhpc3Q7CisJaW50IGk7CiAKLQlyZXR1cm4gMDsKKwkvKgorCSAqIFJlbGlucXVpc2ggY3JlZGl0cyBmcm9tIGFsbCBpbXBsaWNpdGx5IGNyZWF0ZWQgcHN0cmVhbXMKKwkgKiBzaW5jZSB3aGVuIHdlIGdvIHRvIHNsZWVwLiBJZiB1c2VyIGNyZWF0ZWQgZXhwbGljaXQKKwkgKiB0aGluc3RyZWFtcyBleGlzdHMgd2l0aCBpbiBhIGZhdHBpcGUgbGVhdmUgdGhlbSBpbnRhY3QKKwkgKiBmb3IgdGhlIHVzZXIgdG8gZGVsZXRlLgorCSAqLworCXNwaW5fbG9ja19iaCgmd21pLT5sb2NrKTsKKwlzdHJlYW1fZXhpc3QgPSB3bWktPmZhdF9waXBlX2V4aXN0OworCXNwaW5fdW5sb2NrX2JoKCZ3bWktPmxvY2spOworCisJZm9yIChpID0gMDsgaSA8IFdNTV9OVU1fQUM7IGkrKykgeworCQlpZiAoc3RyZWFtX2V4aXN0ICYgKDEgPDwgaSkpIHsKKworCQkJLyoKKwkJCSAqIEZJWE1FOiBJcyB0aGlzIGxvY2sgJiB1bmxvY2sgaW5zaWRlCisJCQkgKiBmb3IgbG9vcCBjb3JyZWN0PyBtYXkgbmVlZCByZXdvcmsuCisJCQkgKi8KKwkJCXNwaW5fbG9ja19iaCgmd21pLT5sb2NrKTsKKwkJCWFjdGl2ZV90c2lkcyA9IHdtaS0+c3RyZWFtX2V4aXN0X2Zvcl9hY1tpXTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZ3bWktPmxvY2spOworCisJCQkvKgorCQkJICogSWYgdGhlcmUgYXJlIG5vIHVzZXIgY3JlYXRlZCB0aGluIHN0cmVhbXMKKwkJCSAqIGRlbGV0ZSB0aGUgZmF0cGlwZQorCQkJICovCisJCQlpZiAoIWFjdGl2ZV90c2lkcykgeworCQkJCXN0cmVhbV9leGlzdCAmPSB+KDEgPDwgaSk7CisJCQkJLyoKKwkJCQkgKiBJbmRpY2F0ZSBpbmFjdGl2aXR5IHRvIGRyaXZlciBsYXllciBmb3IKKwkJCQkgKiB0aGlzIGZhdHBpcGUgKHBzdHJlYW0pCisJCQkJICovCisJCQkJYXRoNmtsX2luZGljYXRlX3R4X2FjdGl2aXR5KHdtaS0+cGFyZW50X2RldiwKKwkJCQkJCQkgICAgaSwgZmFsc2UpOworCQkJfQorCQl9CisJfQorCisJLyogRklYTUU6IENhbiB3ZSBkbyB0aGlzIGFzc2lnbm1lbnQgd2l0aG91dCBsb2NraW5nID8gKi8KKwlzcGluX2xvY2tfYmgoJndtaS0+bG9jayk7CisJd21pLT5mYXRfcGlwZV9leGlzdCA9IHN0cmVhbV9leGlzdDsKKwlzcGluX3VubG9ja19iaCgmd21pLT5sb2NrKTsKK30KKworaW50IGF0aDZrbF93bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgICAgIGVudW0gYXRoNmtsX2hvc3RfbW9kZSBob3N0X21vZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kICpjbWQ7CisJaW50IHJldDsKKworCWlmICgoaG9zdF9tb2RlICE9IEFUSDZLTF9IT1NUX01PREVfQVNMRUVQKSAmJgorCSAgICAoaG9zdF9tb2RlICE9IEFUSDZLTF9IT1NUX01PREVfQVdBS0UpKSB7CisJCWF0aDZrbF9lcnIoImludmFsaWQgaG9zdCBzbGVlcCBtb2RlOiAlZFxuIiwgaG9zdF9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kICopIHNrYi0+ZGF0YTsKKworCWlmIChob3N0X21vZGUgPT0gQVRINktMX0hPU1RfTU9ERV9BU0xFRVApIHsKKwkJYXRoNmtsX3dtaV9yZWxpbnF1aXNoX2ltcGxpY2l0X3BzdHJlYW1fY3JlZGl0cyh3bWkpOworCQljbWQtPmFzbGVlcCA9IGNwdV90b19sZTMyKDEpOworCX0gZWxzZQorCQljbWQtPmF3YWtlID0gY3B1X3RvX2xlMzIoMSk7CisKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsCisJCQkJICBXTUlfU0VUX0hPU1RfU0xFRVBfTU9ERV9DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGF0aDZrbF93bWlfc2V0X3dvd19tb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQllbnVtIGF0aDZrbF93b3dfbW9kZSB3b3dfbW9kZSwKKwkJCQl1MzIgZmlsdGVyLCB1MTYgaG9zdF9yZXFfZGVsYXkpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd21pX3NldF93b3dfbW9kZV9jbWQgKmNtZDsKKwlpbnQgcmV0OworCisJaWYgKCh3b3dfbW9kZSAhPSBBVEg2S0xfV09XX01PREVfRU5BQkxFKSAmJgorCSAgICAgd293X21vZGUgIT0gQVRINktMX1dPV19NT0RFX0RJU0FCTEUpIHsKKwkJYXRoNmtsX2VycigiaW52YWxpZCB3b3cgbW9kZTogJWRcbiIsIHdvd19tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF93b3dfbW9kZV9jbWQgKikgc2tiLT5kYXRhOworCWNtZC0+ZW5hYmxlX3dvdyA9IGNwdV90b19sZTMyKHdvd19tb2RlKTsKKwljbWQtPmZpbHRlciA9IGNwdV90b19sZTMyKGZpbHRlcik7CisJY21kLT5ob3N0X3JlcV9kZWxheSA9IGNwdV90b19sZTE2KGhvc3RfcmVxX2RlbGF5KTsKKworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9XT1dfTU9ERV9DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGF0aDZrbF93bWlfYWRkX3dvd19wYXR0ZXJuX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICB1OCBsaXN0X2lkLCB1OCBmaWx0ZXJfc2l6ZSwKKwkJCQkgICB1OCBmaWx0ZXJfb2Zmc2V0LCB1OCAqZmlsdGVyLCB1OCAqbWFzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bWlfYWRkX3dvd19wYXR0ZXJuX2NtZCAqY21kOworCXUxNiBzaXplOworCXU4ICpmaWx0ZXJfbWFzazsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBBbGxvY2F0ZSBhZGRpdGlvbmFsIG1lbW9yeSBpbiB0aGUgYnVmZmVyIHRvIGhvbGQKKwkgKiBmaWx0ZXIgYW5kIG1hc2sgdmFsdWUsIHdoaWNoIGlzIHR3aWNlIG9mIGZpbHRlcl9zaXplLgorCSAqLworCXNpemUgPSBzaXplb2YoKmNtZCkgKyAoMiAqIGZpbHRlcl9zaXplKTsKKworCXNrYiA9IGF0aDZrbF93bWlfZ2V0X25ld19idWYoc2l6ZSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kID0gKHN0cnVjdCB3bWlfYWRkX3dvd19wYXR0ZXJuX2NtZCAqKSBza2ItPmRhdGE7CisJY21kLT5maWx0ZXJfbGlzdF9pZCA9IGxpc3RfaWQ7CisJY21kLT5maWx0ZXJfc2l6ZSA9IGZpbHRlcl9zaXplOworCWNtZC0+ZmlsdGVyX29mZnNldCA9IGZpbHRlcl9vZmZzZXQ7CisKKwltZW1jcHkoY21kLT5maWx0ZXIsIGZpbHRlciwgZmlsdGVyX3NpemUpOworCisJZmlsdGVyX21hc2sgPSAodTggKikgKGNtZC0+ZmlsdGVyICsgZmlsdGVyX3NpemUpOworCW1lbWNweShmaWx0ZXJfbWFzaywgbWFzaywgZmlsdGVyX3NpemUpOworCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQUREX1dPV19QQVRURVJOX0NNRElELAorCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhdGg2a2xfd21pX2RlbF93b3dfcGF0dGVybl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgdTE2IGxpc3RfaWQsIHUxNiBmaWx0ZXJfaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd21pX2RlbF93b3dfcGF0dGVybl9jbWQgKmNtZDsKKwlpbnQgcmV0OworCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9IChzdHJ1Y3Qgd21pX2RlbF93b3dfcGF0dGVybl9jbWQgKikgc2tiLT5kYXRhOworCWNtZC0+ZmlsdGVyX2xpc3RfaWQgPSBjcHVfdG9fbGUxNihsaXN0X2lkKTsKKwljbWQtPmZpbHRlcl9pZCA9IGNwdV90b19sZTE2KGZpbHRlcl9pZCk7CisKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9ERUxfV09XX1BBVFRFUk5fQ01ESUQsCisJCQkJICBOT19TWU5DX1dNSUZMQUcpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX3dtaV9jbWRfc2VuZF94dG5kKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTIzMzYsNyArMjU4OCw3IEBACiAJY21kX2hkciA9IChzdHJ1Y3Qgd21peF9jbWRfaGRyICopIHNrYi0+ZGF0YTsKIAljbWRfaGRyLT5jbWRfaWQgPSBjcHVfdG9fbGUzMihjbWRfaWQpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0VYVEVOU0lPTl9DTURJRCwgc3luY19mbGFnKTsKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfRVhURU5TSU9OX0NNRElELCBzeW5jX2ZsYWcpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIzNzksMTIgKzI2MzEsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9nZXRfc3RhdHNfY21kKHN0cnVjdCB3bWkgKndtaSkKK2ludCBhdGg2a2xfd21pX2dldF9zdGF0c19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpCiB7Ci0JcmV0dXJuIGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIFdNSV9HRVRfU1RBVElTVElDU19DTURJRCk7CisJcmV0dXJuIGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIGlmX2lkeCwgV01JX0dFVF9TVEFUSVNUSUNTX0NNRElEKTsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X3R4X3B3cl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBkYk0pCitpbnQgYXRoNmtsX3dtaV9zZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggZGJNKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9zZXRfdHhfcHdyX2NtZCAqY21kOwpAQCAtMjM5NywxOCArMjY0OSwyNCBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF90eF9wd3JfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPmRiTSA9IGRiTTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfVFhfUFdSX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9UWF9QV1JfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQoc3RydWN0IHdtaSAqd21pKQoraW50IGF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpCiB7Ci0JcmV0dXJuIGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIFdNSV9HRVRfVFhfUFdSX0NNRElEKTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgaWZfaWR4LCBXTUlfR0VUX1RYX1BXUl9DTURJRCk7CiB9CiAKLWludCBhdGg2a2xfd21pX3NldF9scHJlYW1ibGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggc3RhdHVzLCB1OCBwcmVhbWJsZV9wb2xpY3kpCitpbnQgYXRoNmtsX3dtaV9nZXRfcm9hbV90YmxfY21kKHN0cnVjdCB3bWkgKndtaSkKK3sKKwlyZXR1cm4gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgMCwgV01JX0dFVF9ST0FNX1RCTF9DTURJRCk7Cit9CisKK2ludCBhdGg2a2xfd21pX3NldF9scHJlYW1ibGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBzdGF0dXMsCisJCQkJIHU4IHByZWFtYmxlX3BvbGljeSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfc2V0X2xwcmVhbWJsZV9jbWQgKmNtZDsKQEAgLTI0MjIsNyArMjY4MCw3IEBACiAJY21kLT5zdGF0dXMgPSBzdGF0dXM7CiAJY21kLT5wcmVhbWJsZV9wb2xpY3kgPSBwcmVhbWJsZV9wb2xpY3k7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX0xQUkVBTUJMRV9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfTFBSRUFNQkxFX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjQ0MCwxMSArMjY5OCwxMiBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF9ydHNfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPnRocmVzaG9sZCA9IGNwdV90b19sZTE2KHRocmVzaG9sZCk7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX1JUU19DTURJRCwgTk9fU1lOQ19XTUlGTEFHKTsKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfU0VUX1JUU19DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKHN0cnVjdCB3bWkgKndtaSwgZW51bSB3bWlfdHhvcF9jZmcgY2ZnKQoraW50IGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBlbnVtIHdtaV90eG9wX2NmZyBjZmcpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3NldF93bW1fdHhvcF9jbWQgKmNtZDsKQEAgLTI0NjAsMTIgKzI3MTksMTMgQEAKIAljbWQgPSAoc3RydWN0IHdtaV9zZXRfd21tX3R4b3BfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPnR4b3BfZW5hYmxlID0gY2ZnOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9XTU1fVFhPUF9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfV01NX1RYT1BfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX3NldF9rZWVwYWxpdmVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTgga2VlcF9hbGl2ZV9pbnR2bCkKK2ludCBhdGg2a2xfd21pX3NldF9rZWVwYWxpdmVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSB1OCBrZWVwX2FsaXZlX2ludHZsKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9zZXRfa2VlcGFsaXZlX2NtZCAqY21kOwpAQCAtMjQ3NywxMCArMjczNywxMyBAQAogCiAJY21kID0gKHN0cnVjdCB3bWlfc2V0X2tlZXBhbGl2ZV9jbWQgKikgc2tiLT5kYXRhOwogCWNtZC0+a2VlcF9hbGl2ZV9pbnR2bCA9IGtlZXBfYWxpdmVfaW50dmw7Ci0Jd21pLT5rZWVwX2FsaXZlX2ludHZsID0ga2VlcF9hbGl2ZV9pbnR2bDsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfS0VFUEFMSVZFX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9LRUVQQUxJVkVfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOworCisJaWYgKHJldCA9PSAwKQorCQlhdGg2a2xfZGVidWdfc2V0X2tlZXBhbGl2ZSh3bWktPnBhcmVudF9kZXYsIGtlZXBfYWxpdmVfaW50dmwpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjQ5NSw3ICsyNzU4LDcgQEAKIAogCW1lbWNweShza2ItPmRhdGEsIGJ1ZiwgbGVuKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9URVNUX0NNRElELCBOT19TWU5DX1dNSUZMQUcpOworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9URVNUX0NNRElELCBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI1MjgsMjggKzI3OTEsMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX2FkZGJhX3JlcV9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9hZGRiYV9yZXFfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfYWRkYmFfcmVxX2V2ZW50ICpjbWQgPSAoc3RydWN0IHdtaV9hZGRiYV9yZXFfZXZlbnQgKikgZGF0YXA7CiAKLQlhZ2dyX3JlY3ZfYWRkYmFfcmVxX2V2dCh3bWktPnBhcmVudF9kZXYsIGNtZC0+dGlkLAorCWFnZ3JfcmVjdl9hZGRiYV9yZXFfZXZ0KHZpZiwgY21kLT50aWQsCiAJCQkJbGUxNl90b19jcHUoY21kLT5zdF9zZXFfbm8pLCBjbWQtPndpbl9zeik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX2RlbGJhX3JlcV9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9kZWxiYV9yZXFfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfZGVsYmFfZXZlbnQgKmNtZCA9IChzdHJ1Y3Qgd21pX2RlbGJhX2V2ZW50ICopIGRhdGFwOwogCi0JYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQod21pLT5wYXJlbnRfZGV2LCBjbWQtPnRpZCk7CisJYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQodmlmLCBjbWQtPnRpZCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyogIEFQIG1vZGUgZnVuY3Rpb25zICovCiAKLWludCBhdGg2a2xfd21pX2FwX3Byb2ZpbGVfY29tbWl0KHN0cnVjdCB3bWkgKndtaXAsIHN0cnVjdCB3bWlfY29ubmVjdF9jbWQgKnApCitpbnQgYXRoNmtsX3dtaV9hcF9wcm9maWxlX2NvbW1pdChzdHJ1Y3Qgd21pICp3bWlwLCB1OCBpZl9pZHgsCisJCQkJIHN0cnVjdCB3bWlfY29ubmVjdF9jbWQgKnApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2Nvbm5lY3RfY21kICpjbTsKQEAgLTI1NjIsNyArMjgyOCw3IEBACiAJY20gPSAoc3RydWN0IHdtaV9jb25uZWN0X2NtZCAqKSBza2ItPmRhdGE7CiAJbWVtY3B5KGNtLCBwLCBzaXplb2YoKmNtKSk7CiAKLQlyZXMgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaXAsIHNrYiwgV01JX0FQX0NPTkZJR19DT01NSVRfQ01ESUQsCisJcmVzID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWlwLCBpZl9pZHgsIHNrYiwgV01JX0FQX0NPTkZJR19DT01NSVRfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICIlczogbndfdHlwZT0ldSBhdXRoX21vZGU9JXUgY2g9JXUgIgogCQkgICAiY3RybF9mbGFncz0weCV4LT4gcmVzPSVkXG4iLApAQCAtMjU3MSw3ICsyODM3LDggQEAKIAlyZXR1cm4gcmVzOwogfQogCi1pbnQgYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShzdHJ1Y3Qgd21pICp3bWlwLCB1OCBjbWQsIGNvbnN0IHU4ICptYWMsIHUxNiByZWFzb24pCitpbnQgYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShzdHJ1Y3Qgd21pICp3bWlwLCB1OCBpZl9pZHgsIHU4IGNtZCwgY29uc3QgdTggKm1hYywKKwkJCSAgIHUxNiByZWFzb24pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2FwX3NldF9tbG1lX2NtZCAqY207CkBAIC0yNTg1LDExICsyODUyLDEyIEBACiAJY20tPnJlYXNvbiA9IGNwdV90b19sZTE2KHJlYXNvbik7CiAJY20tPmNtZCA9IGNtZDsKIAotCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaXAsIHNrYiwgV01JX0FQX1NFVF9NTE1FX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaXAsIGlmX2lkeCwgc2tiLCBXTUlfQVBfU0VUX01MTUVfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX3BzcG9sbF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9wc3BvbGxfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJICAgICAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX3BzcG9sbF9ldmVudCAqZXY7CiAKQEAgLTI1OTgsMTkgKzI4NjYsMjEgQEAKIAogCWV2ID0gKHN0cnVjdCB3bWlfcHNwb2xsX2V2ZW50ICopIGRhdGFwOwogCi0JYXRoNmtsX3BzcG9sbF9ldmVudCh3bWktPnBhcmVudF9kZXYsIGxlMTZfdG9fY3B1KGV2LT5haWQpKTsKKwlhdGg2a2xfcHNwb2xsX2V2ZW50KHZpZiwgbGUxNl90b19jcHUoZXYtPmFpZCkpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9kdGltZXhwaXJ5X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX2R0aW1leHBpcnlfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKLQlhdGg2a2xfZHRpbWV4cGlyeV9ldmVudCh3bWktPnBhcmVudF9kZXYpOworCWF0aDZrbF9kdGltZXhwaXJ5X2V2ZW50KHZpZik7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgYWlkLCBib29sIGZsYWcpCitpbnQgYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTE2IGFpZCwKKwkJCSAgIGJvb2wgZmxhZykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfYXBfc2V0X3B2Yl9jbWQgKmNtZDsKQEAgLTI2MjUsMTMgKzI4OTUsMTQgQEAKIAljbWQtPnJzdmQgPSBjcHVfdG9fbGUxNigwKTsKIAljbWQtPmZsYWcgPSBjcHVfdG9fbGUzMihmbGFnKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9BUF9TRVRfUFZCX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0FQX1NFVF9QVkJfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBhdGg2a2xfd21pX3NldF9yeF9mcmFtZV9mb3JtYXRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggcnhfbWV0YV92ZXIsCitpbnQgYXRoNmtsX3dtaV9zZXRfcnhfZnJhbWVfZm9ybWF0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICAgICAgdTggcnhfbWV0YV92ZXIsCiAJCQkJICAgICAgIGJvb2wgcnhfZG90MTFfaGRyLCBib29sIGRlZnJhZ19vbl9ob3N0KQogewogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0yNjQ4LDE0ICsyOTE5LDE0IEBACiAJY21kLT5tZXRhX3ZlciA9IHJ4X21ldGFfdmVyOwogCiAJLyogRGVsZXRlIHRoZSBsb2NhbCBhZ2dyIHN0YXRlLCBvbiBob3N0ICovCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1JYX0ZSQU1FX0ZPUk1BVF9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9SWF9GUkFNRV9GT1JNQVRfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IG1nbXRfZnJtX3R5cGUsIGNvbnN0IHU4ICppZSwKLQkJCSAgICAgdTggaWVfbGVuKQoraW50IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggbWdtdF9mcm1fdHlwZSwKKwkJCSAgICAgY29uc3QgdTggKmllLCB1OCBpZV9sZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3NldF9hcHBpZV9jbWQgKnA7CkBAIC0yNjcwLDcgKzI5NDEsNyBAQAogCXAtPm1nbXRfZnJtX3R5cGUgPSBtZ210X2ZybV90eXBlOwogCXAtPmllX2xlbiA9IGllX2xlbjsKIAltZW1jcHkocC0+aWVfaW5mbywgaWUsIGllX2xlbik7Ci0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfQVBQSUVfQ01ESUQsCisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9BUFBJRV9DTURJRCwKIAkJCQkgICBOT19TWU5DX1dNSUZMQUcpOwogfQogCkBAIC0yNjg4LDExICsyOTU5LDExIEBACiAJY21kID0gKHN0cnVjdCB3bWlfZGlzYWJsZV8xMWJfcmF0ZXNfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPmRpc2FibGUgPSBkaXNhYmxlID8gMSA6IDA7CiAKLQlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0RJU0FCTEVfMTFCX1JBVEVTX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfRElTQUJMRV8xMUJfUkFURVNfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfcmVtYWluX29uX2NobmxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGZyZXEsIHUzMiBkdXIpCitpbnQgYXRoNmtsX3dtaV9yZW1haW5fb25fY2hubF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUzMiBmcmVxLCB1MzIgZHVyKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9yZW1haW5fb25fY2hubF9jbWQgKnA7CkBAIC0yNzA2LDEyICsyOTc3LDEyIEBACiAJcCA9IChzdHJ1Y3Qgd21pX3JlbWFpbl9vbl9jaG5sX2NtZCAqKSBza2ItPmRhdGE7CiAJcC0+ZnJlcSA9IGNwdV90b19sZTMyKGZyZXEpOwogCXAtPmR1cmF0aW9uID0gY3B1X3RvX2xlMzIoZHVyKTsKLQlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1JFTUFJTl9PTl9DSE5MX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9SRU1BSU5fT05fQ0hOTF9DTURJRCwKIAkJCQkgICBOT19TWU5DX1dNSUZMQUcpOwogfQogCi1pbnQgYXRoNmtsX3dtaV9zZW5kX2FjdGlvbl9jbWQoc3RydWN0IHdtaSAqd21pLCB1MzIgaWQsIHUzMiBmcmVxLCB1MzIgd2FpdCwKLQkJCSAgICAgICBjb25zdCB1OCAqZGF0YSwgdTE2IGRhdGFfbGVuKQoraW50IGF0aDZrbF93bWlfc2VuZF9hY3Rpb25fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgaWQsIHUzMiBmcmVxLAorCQkJICAgICAgIHUzMiB3YWl0LCBjb25zdCB1OCAqZGF0YSwgdTE2IGRhdGFfbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9zZW5kX2FjdGlvbl9jbWQgKnA7CkBAIC0yNzMxLDYgKzMwMDIsNyBAQAogCX0KIAogCWtmcmVlKHdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lKTsKKwltZW1jcHkoYnVmLCBkYXRhLCBkYXRhX2xlbik7CiAJd21pLT5sYXN0X21nbXRfdHhfZnJhbWUgPSBidWY7CiAJd21pLT5sYXN0X21nbXRfdHhfZnJhbWVfbGVuID0gZGF0YV9sZW47CiAKQEAgLTI3NDIsMTMgKzMwMTQsMTMgQEAKIAlwLT53YWl0ID0gY3B1X3RvX2xlMzIod2FpdCk7CiAJcC0+bGVuID0gY3B1X3RvX2xlMTYoZGF0YV9sZW4pOwogCW1lbWNweShwLT5kYXRhLCBkYXRhLCBkYXRhX2xlbik7Ci0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRU5EX0FDVElPTl9DTURJRCwKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VORF9BQ1RJT05fQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfc2VuZF9wcm9iZV9yZXNwb25zZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1MzIgZnJlcSwKLQkJCQkgICAgICAgY29uc3QgdTggKmRzdCwKLQkJCQkgICAgICAgY29uc3QgdTggKmRhdGEsIHUxNiBkYXRhX2xlbikKK2ludCBhdGg2a2xfd21pX3NlbmRfcHJvYmVfcmVzcG9uc2VfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgZnJlcSwKKwkJCQkgICAgICAgY29uc3QgdTggKmRzdCwgY29uc3QgdTggKmRhdGEsCisJCQkJICAgICAgIHUxNiBkYXRhX2xlbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfcDJwX3Byb2JlX3Jlc3BvbnNlX2NtZCAqcDsKQEAgLTI3NjQsMTEgKzMwMzYsMTIgQEAKIAltZW1jcHkocC0+ZGVzdGluYXRpb25fYWRkciwgZHN0LCBFVEhfQUxFTik7CiAJcC0+bGVuID0gY3B1X3RvX2xlMTYoZGF0YV9sZW4pOwogCW1lbWNweShwLT5kYXRhLCBkYXRhLCBkYXRhX2xlbik7Ci0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRU5EX1BST0JFX1JFU1BPTlNFX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsCisJCQkJICAgV01JX1NFTkRfUFJPQkVfUkVTUE9OU0VfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoc3RydWN0IHdtaSAqd21pLCBib29sIGVuYWJsZSkKK2ludCBhdGg2a2xfd21pX3Byb2JlX3JlcG9ydF9yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBib29sIGVuYWJsZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfcHJvYmVfcmVxX3JlcG9ydF9jbWQgKnA7CkBAIC0yNzgxLDExICszMDU0LDExIEBACiAJCSAgIGVuYWJsZSk7CiAJcCA9IChzdHJ1Y3Qgd21pX3Byb2JlX3JlcV9yZXBvcnRfY21kICopIHNrYi0+ZGF0YTsKIAlwLT5lbmFibGUgPSBlbmFibGUgPyAxIDogMDsKLQlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1BST0JFX1JFUV9SRVBPUlRfQ01ESUQsCisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1BST0JFX1JFUV9SRVBPUlRfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGluZm9fcmVxX2ZsYWdzKQoraW50IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgaW5mb19yZXFfZmxhZ3MpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2dldF9wMnBfaW5mbyAqcDsKQEAgLTI3OTgsMTQgKzMwNzEsMTUgQEAKIAkJICAgaW5mb19yZXFfZmxhZ3MpOwogCXAgPSAoc3RydWN0IHdtaV9nZXRfcDJwX2luZm8gKikgc2tiLT5kYXRhOwogCXAtPmluZm9fcmVxX2ZsYWdzID0gY3B1X3RvX2xlMzIoaW5mb19yZXFfZmxhZ3MpOwotCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfR0VUX1AyUF9JTkZPX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9HRVRfUDJQX0lORk9fQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWkpCitpbnQgYXRoNmtsX3dtaV9jYW5jZWxfcmVtYWluX29uX2NobmxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4KQogewogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJjYW5jZWxfcmVtYWluX29uX2NobmxfY21kXG4iKTsKLQlyZXR1cm4gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgV01JX0NBTkNFTF9SRU1BSU5fT05fQ0hOTF9DTURJRCk7CisJcmV0dXJuIGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIGlmX2lkeCwKKwkJCQkgICAgIFdNSV9DQU5DRUxfUkVNQUlOX09OX0NITkxfQ01ESUQpOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF93bWlfY29udHJvbF9yeF94dG5kKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTI4MTgsNyArMzA5Miw2IEBACiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHdtaXhfY21kX2hkcikpIHsKIAkJYXRoNmtsX2VycigiYmFkIHBhY2tldCAxXG4iKTsKLQkJd21pLT5zdGF0LmNtZF9sZW5fZXJyKys7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjg0MCw3ICszMTEzLDYgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYXRoNmtsX3dhcm4oInVua25vd24gY21kIGlkIDB4JXhcbiIsIGlkKTsKLQkJd21pLT5zdGF0LmNtZF9pZF9lcnIrKzsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQpAQCAtMjg0OCwxMiArMzEyMCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9yb2FtX3RibF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3sKKwlyZXR1cm4gYXRoNmtsX2RlYnVnX3JvYW1fdGJsX2V2ZW50KHdtaS0+cGFyZW50X2RldiwgZGF0YXAsIGxlbik7Cit9CisKIC8qIENvbnRyb2wgUGF0aCAqLwogaW50IGF0aDZrbF93bWlfY29udHJvbF9yeChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHdtaV9jbWRfaGRyICpjbWQ7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAl1MzIgbGVuOwogCXUxNiBpZDsKKwl1OCBpZl9pZHg7CiAJdTggKmRhdGFwOwogCWludCByZXQgPSAwOwogCkBAIC0yODYzLDEyICszMTQyLDEyIEBACiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCB3bWlfY21kX2hkcikpIHsKIAkJYXRoNmtsX2VycigiYmFkIHBhY2tldCAxXG4iKTsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwotCQl3bWktPnN0YXQuY21kX2xlbl9lcnIrKzsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJY21kID0gKHN0cnVjdCB3bWlfY21kX2hkciAqKSBza2ItPmRhdGE7CiAJaWQgPSBsZTE2X3RvX2NwdShjbWQtPmNtZF9pZCk7CisJaWZfaWR4ID0gbGUxNl90b19jcHUoY21kLT5pbmZvMSkgJiBXTUlfQ01EX0hEUl9JRl9JRF9NQVNLOwogCiAJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHdtaV9jbWRfaGRyKSk7CiAKQEAgLTI4NzksNiArMzE1OCwxNSBAQAogCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX1dNSV9EVU1QLCBOVUxMLCAid21pIHJ4ICIsCiAJCQlkYXRhcCwgbGVuKTsKIAorCXZpZiA9IGF0aDZrbF9nZXRfdmlmX2J5X2luZGV4KHdtaS0+cGFyZW50X2RldiwgaWZfaWR4KTsKKwlpZiAoIXZpZikgeworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLAorCQkJICAgIldtaSBldmVudCBmb3IgdW5hdmFpbGFibGUgdmlmLCB2aWZfaW5kZXg6JWRcbiIsCisJCQkgICAgaWZfaWR4KTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzd2l0Y2ggKGlkKSB7CiAJY2FzZSBXTUlfR0VUX0JJVFJBVEVfQ01ESUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfR0VUX0JJVFJBVEVfQ01ESURcbiIpOwpAQCAtMjg5OCwxMSArMzE4NiwxMSBAQAogCQlicmVhazsKIAljYXNlIFdNSV9DT05ORUNUX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfQ09OTkVDVF9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9jb25uZWN0X2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfY29ubmVjdF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0RJU0NPTk5FQ1RfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9ESVNDT05ORUNUX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9kaXNjb25uZWN0X2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUEVFUl9OT0RFX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUEVFUl9OT0RFX0VWRU5USURcbiIpOwpAQCAtMjkxMCwxMSArMzE5OCwxMSBAQAogCQlicmVhazsKIAljYXNlIFdNSV9US0lQX01JQ0VSUl9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1RLSVBfTUlDRVJSX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3RraXBfbWljZXJyX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfdGtpcF9taWNlcnJfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9CU1NJTkZPX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfQlNTSU5GT19FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9ic3NpbmZvX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfYnNzaW5mb19ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX1JFR0RPTUFJTl9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1JFR0RPTUFJTl9FVkVOVElEXG4iKTsKQEAgLTI5MjYsMTEgKzMyMTQsMTIgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfTkVJR0hCT1JfUkVQT1JUX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfTkVJR0hCT1JfUkVQT1JUX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX25laWdoYm9yX3JlcG9ydF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX25laWdoYm9yX3JlcG9ydF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sCisJCQkJCQkJICB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9TQ0FOX0NPTVBMRVRFX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfU0NBTl9DT01QTEVURV9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9zY2FuX2NvbXBsZXRlX3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfc2Nhbl9jb21wbGV0ZV9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0NNREVSUk9SX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfQ01ERVJST1JfRVZFTlRJRFxuIik7CkBAIC0yOTM4LDcgKzMyMjcsNyBAQAogCQlicmVhazsKIAljYXNlIFdNSV9SRVBPUlRfU1RBVElTVElDU19FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1JFUE9SVF9TVEFUSVNUSUNTX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3N0YXRzX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfc3RhdHNfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9SU1NJX1RIUkVTSE9MRF9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1JTU0lfVEhSRVNIT0xEX0VWRU5USURcbiIpOwpAQCAtMjk1Myw2ICszMjQyLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUkVQT1JUX1JPQU1fVEJMX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUkVQT1JUX1JPQU1fVEJMX0VWRU5USURcbiIpOworCQlyZXQgPSBhdGg2a2xfd21pX3JvYW1fdGJsX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0VYVEVOU0lPTl9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0VYVEVOU0lPTl9FVkVOVElEXG4iKTsKQEAgLTI5NjAsNyArMzI1MCw3IEBACiAJCWJyZWFrOwogCWNhc2UgV01JX0NBQ19FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0NBQ19FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9jYWNfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9jYWNfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9DSEFOTkVMX0NIQU5HRV9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0NIQU5ORUxfQ0hBTkdFX0VWRU5USURcbiIpOwpAQCAtMjk5Niw3ICszMjg2LDYgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfR0VUX1dPV19MSVNUX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfR0VUX1dPV19MSVNUX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX2dldF93b3dfbGlzdF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOwogCQlicmVhazsKIAljYXNlIFdNSV9HRVRfUE1LSURfTElTVF9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0dFVF9QTUtJRF9MSVNUX0VWRU5USURcbiIpOwpAQCAtMzAwNCwyNSArMzI5MywyNSBAQAogCQlicmVhazsKIAljYXNlIFdNSV9QU1BPTExfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9QU1BPTExfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfcHNwb2xsX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfcHNwb2xsX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfRFRJTUVYUElSWV9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0RUSU1FWFBJUllfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfZHRpbWV4cGlyeV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX2R0aW1leHBpcnlfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9TRVRfUEFSQU1TX1JFUExZX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfU0VUX1BBUkFNU19SRVBMWV9FVkVOVElEXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfQUREQkFfUkVRX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfQUREQkFfUkVRX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX2FkZGJhX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX2FkZGJhX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0FEREJBX1JFU1BfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9BRERCQV9SRVNQX0VWRU5USURcbiIpOwogCQlicmVhazsKIAljYXNlIFdNSV9ERUxCQV9SRVFfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9ERUxCQV9SRVFfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfZGVsYmFfcmVxX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfZGVsYmFfcmVxX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUkVQT1JUX0JUQ09FWF9DT05GSUdfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwKQEAgLTMwMzgsMjEgKzMzMjcsMjEgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUkVNQUlOX09OX0NITkxfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9SRU1BSU5fT05fQ0hOTF9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9yZW1haW5fb25fY2hubF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfQ0FOQ0VMX1JFTUFJTl9PTl9DSE5MX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksCiAJCQkgICAiV01JX0NBTkNFTF9SRU1BSU5fT05fQ0hOTF9FVkVOVElEXG4iKTsKIAkJcmV0ID0gYXRoNmtsX3dtaV9jYW5jZWxfcmVtYWluX29uX2NobmxfZXZlbnRfcngod21pLCBkYXRhcCwKLQkJCQkJCQkJbGVuKTsKKwkJCQkJCQkJbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9UWF9TVEFUVVNfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9UWF9TVEFUVVNfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfdHhfc3RhdHVzX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfdHhfc3RhdHVzX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUlhfUFJPQkVfUkVRX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUlhfUFJPQkVfUkVRX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3J4X3Byb2JlX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3J4X3Byb2JlX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX1AyUF9DQVBBQklMSVRJRVNfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9QMlBfQ0FQQUJJTElUSUVTX0VWRU5USURcbiIpOwpAQCAtMzA2MCw3ICszMzQ5LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUlhfQUNUSU9OX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUlhfQUNUSU9OX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3J4X2FjdGlvbl9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3J4X2FjdGlvbl9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX1AyUF9JTkZPX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUDJQX0lORk9fRVZFTlRJRFxuIik7CkBAIC0zMDY4LDcgKzMzNTcsNiBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAidW5rbm93biBjbWQgaWQgMHgleFxuIiwgaWQpOwotCQl3bWktPnN0YXQuY21kX2lkX2VycisrOwogCQlyZXQgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CkBAIC0zMDc4LDExICszMzY2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBhdGg2a2xfd21pX3Fvc19zdGF0ZV9pbml0KHN0cnVjdCB3bWkgKndtaSkKK3ZvaWQgYXRoNmtsX3dtaV9yZXNldChzdHJ1Y3Qgd21pICp3bWkpCiB7Ci0JaWYgKCF3bWkpCi0JCXJldHVybjsKLQogCXNwaW5fbG9ja19iaCgmd21pLT5sb2NrKTsKIAogCXdtaS0+ZmF0X3BpcGVfZXhpc3QgPSAwOwpAQCAtMzEwMywxNiArMzM4OCw5IEBACiAKIAl3bWktPnBhcmVudF9kZXYgPSBkZXY7CiAKLQlhdGg2a2xfd21pX3Fvc19zdGF0ZV9pbml0KHdtaSk7Ci0KIAl3bWktPnB3cl9tb2RlID0gUkVDX1BPV0VSOwotCXdtaS0+cGh5X21vZGUgPSBXTUlfMTFHX01PREU7CiAKLQl3bWktPnBhaXJfY3J5cHRvX3R5cGUgPSBOT05FX0NSWVBUOwotCXdtaS0+Z3JwX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKLQotCXdtaS0+aHRfYWxsb3dlZFtBX0JBTkRfMjRHSFpdID0gMTsKLQl3bWktPmh0X2FsbG93ZWRbQV9CQU5EXzVHSFpdID0gMTsKKwlhdGg2a2xfd21pX3Jlc2V0KHdtaSk7CiAKIAlyZXR1cm4gd21pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmgKaW5kZXggZjhlNjQ0ZC4uNzYzNDJkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5oCkBAIC05MywxMSArOTMsNiBAQAogCXU4IGxhc3RfcnNzaV9wb2xsX2V2ZW50OwogfTsKIAotc3RydWN0IHdtaV9zdGF0cyB7Ci0JdTMyIGNtZF9sZW5fZXJyOwotCXUzMiBjbWRfaWRfZXJyOwotfTsKLQogc3RydWN0IHdtaV9kYXRhX3N5bmNfYnVmcyB7CiAJdTggdHJhZmZpY19jbGFzczsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTExLDMyICsxMDYsMjYgQEAKICNkZWZpbmUgV01NX0FDX1ZPICAgMwkJLyogdm9pY2UgKi8KIAogc3RydWN0IHdtaSB7Ci0JYm9vbCByZWFkeTsKIAl1MTYgc3RyZWFtX2V4aXN0X2Zvcl9hY1tXTU1fTlVNX0FDXTsKIAl1OCBmYXRfcGlwZV9leGlzdDsKIAlzdHJ1Y3QgYXRoNmtsICpwYXJlbnRfZGV2OwotCXN0cnVjdCB3bWlfc3RhdHMgc3RhdDsKIAl1OCBwd3JfbW9kZTsKLQl1OCBwaHlfbW9kZTsKLQl1OCBrZWVwX2FsaXZlX2ludHZsOwogCXNwaW5sb2NrX3QgbG9jazsKIAllbnVtIGh0Y19lbmRwb2ludF9pZCBlcF9pZDsKIAlzdHJ1Y3Qgc3FfdGhyZXNob2xkX3BhcmFtcwogCSAgICBzcV90aHJlc2hsZFtTSUdOQUxfUVVBTElUWV9NRVRSSUNTX05VTV9NQVhdOwotCWVudW0gY3J5cHRvX3R5cGUgcGFpcl9jcnlwdG9fdHlwZTsKLQllbnVtIGNyeXB0b190eXBlIGdycF9jcnlwdG9fdHlwZTsKIAlib29sIGlzX3dtbV9lbmFibGVkOwotCXU4IGh0X2FsbG93ZWRbQV9OVU1fQkFORFNdOwogCXU4IHRyYWZmaWNfY2xhc3M7CiAJYm9vbCBpc19wcm9iZV9zc2lkOwogCiAJdTggKmxhc3RfbWdtdF90eF9mcmFtZTsKIAlzaXplX3QgbGFzdF9tZ210X3R4X2ZyYW1lX2xlbjsKKwl1OCBzYXZlZF9wd3JfbW9kZTsKIH07CiAKIHN0cnVjdCBob3N0X2FwcF9hcmVhIHsKLQl1MzIgd21pX3Byb3RvY29sX3ZlcjsKLX07CisJX19sZTMyIHdtaV9wcm90b2NvbF92ZXI7Cit9IF9fcGFja2VkOwogCiBlbnVtIHdtaV9tc2dfdHlwZSB7CiAJREFUQV9NU0dUWVBFID0gMHgwLApAQCAtMTg0LDYgKzE3Myw4IEBACiAjZGVmaW5lIFdNSV9EQVRBX0hEUl9NRVRBX01BU0sgICAgICAweDcKICNkZWZpbmUgV01JX0RBVEFfSERSX01FVEFfU0hJRlQgICAgIDEzCiAKKyNkZWZpbmUgV01JX0RBVEFfSERSX0lGX0lEWF9NQVNLICAgIDB4RgorCiBzdHJ1Y3Qgd21pX2RhdGFfaGRyIHsKIAlzOCByc3NpOwogCkBAIC0yMDgsNiArMTk5LDEyIEBACiAJICogYjE1OmIxMyAgICAgIC0gTUVUQV9EQVRBX1ZFUlNJT04gMCAtIDcKIAkgKi8KIAlfX2xlMTYgaW5mbzI7CisKKwkvKgorCSAqIHVzYWdlIG9mIGluZm8zLCAxNi1iaXQ6CisJICogYjM6YjAJLSBJbnRlcmZhY2UgaW5kZXgKKwkgKiBiMTU6YjQJLSBSZXNlcnZlZAorCSAqLwogCV9fbGUxNiBpbmZvMzsKIH0gX19wYWNrZWQ7CiAKQEAgLTI1MCw2ICsyNDcsMTEgQEAKIAkJCSAgICAgICBXTUlfREFUQV9IRFJfTUVUQV9NQVNLOwogfQogCitzdGF0aWMgaW5saW5lIHU4IHdtaV9kYXRhX2hkcl9nZXRfaWZfaWR4KHN0cnVjdCB3bWlfZGF0YV9oZHIgKmRoZHIpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGRoZHItPmluZm8zKSAmIFdNSV9EQVRBX0hEUl9JRl9JRFhfTUFTSzsKK30KKwogLyogVHggbWV0YSB2ZXJzaW9uIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFdNSV9NQVhfVFhfTUVUQV9TWgkxMgogI2RlZmluZSBXTUlfTUVUQV9WRVJTSU9OXzEJMHgwMQpAQCAtMjk5LDYgKzMwMSw4IEBACiAJdTggY3N1bV9mbGFnczsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgV01JX0NNRF9IRFJfSUZfSURfTUFTSyAweEYKKwogLyogQ29udHJvbCBQYXRoICovCiBzdHJ1Y3Qgd21pX2NtZF9oZHIgewogCV9fbGUxNiBjbWRfaWQ7CkBAIC0zMTIsNiArMzE2LDExIEBACiAJX19sZTE2IHJlc2VydmVkOwogfSBfX3BhY2tlZDsKIAorc3RhdGljIGlubGluZSB1OCB3bWlfY21kX2hkcl9nZXRfaWZfaWR4KHN0cnVjdCB3bWlfY21kX2hkciAqY2hkcikKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoY2hkci0+aW5mbzEpICYgV01JX0NNRF9IRFJfSUZfSURfTUFTSzsKK30KKwogLyogTGlzdCBvZiBXTUkgY29tbWFuZHMgKi8KIGVudW0gd21pX2NtZF9pZCB7CiAJV01JX0NPTk5FQ1RfQ01ESUQgPSAweDAwMDEsCkBAIC01NzYsOSArNTg1LDYgQEAKIAlXUEEyX0FVVEhfQ0NLTSA9IDB4NDAsCiB9OwogCi0jZGVmaW5lIFdNSV9NSU5fQ1JZUFRPX1RZUEUgTk9ORV9DUllQVAotI2RlZmluZSBXTUlfTUFYX0NSWVBUT19UWVBFIChBRVNfQ1JZUFQgKyAxKQotCiAjZGVmaW5lIFdNSV9NSU5fS0VZX0lOREVYICAgMAogI2RlZmluZSBXTUlfTUFYX0tFWV9JTkRFWCAgIDMKIApAQCAtNjE3LDYgKzYyMyw3IEBACiAJQ09OTkVDVF9DU0FfRk9MTE9XX0JTUyA9IDB4MDAyMCwKIAlDT05ORUNUX0RPX1dQQV9PRkZMT0FEID0gMHgwMDQwLAogCUNPTk5FQ1RfRE9fTk9UX0RFQVVUSCA9IDB4MDA4MCwKKwlDT05ORUNUX1dQU19GTEFHID0gMHgwMTAwLAogfTsKIAogc3RydWN0IHdtaV9jb25uZWN0X2NtZCB7CkBAIC0xMzY1LDE0ICsxMzcyLDIwIEBACiAJV01JX1NFVF9MUlNTSV9TQ0FOX1BBUkFNUywKIH07CiAKK2VudW0gd21pX3JvYW1fbW9kZSB7CisJV01JX0RFRkFVTFRfUk9BTV9NT0RFID0gMSwgLyogUlNTSSBiYXNlZCByb2FtICovCisJV01JX0hPU1RfQklBU19ST0FNX01PREUgPSAyLCAvKiBIb3N0IGJpYXMgYmFzZWQgcm9hbSAqLworCVdNSV9MT0NLX0JTU19NT0RFID0gMywgLyogTG9jayB0byB0aGUgY3VycmVudCBCU1MgKi8KK307CisKIHN0cnVjdCBic3NfYmlhcyB7CiAJdTggYnNzaWRbRVRIX0FMRU5dOwotCXU4ICBiaWFzOworCXM4IGJpYXM7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYnNzX2JpYXNfaW5mbyB7CiAJdTggbnVtX2JzczsKLQlzdHJ1Y3QgYnNzX2JpYXMgYnNzX2JpYXNbMV07CisJc3RydWN0IGJzc19iaWFzIGJzc19iaWFzWzBdOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IGxvd19yc3NpX3NjYW5fcGFyYW1zIHsKQEAgLTEzODUsMTAgKzEzOTgsMTEgQEAKIAogc3RydWN0IHJvYW1fY3RybF9jbWQgewogCXVuaW9uIHsKLQkJdTggYnNzaWRbRVRIX0FMRU5dOwotCQl1OCByb2FtX21vZGU7Ci0JCXN0cnVjdCBic3NfYmlhc19pbmZvIGJzczsKLQkJc3RydWN0IGxvd19yc3NpX3NjYW5fcGFyYW1zIHBhcmFtczsKKwkJdTggYnNzaWRbRVRIX0FMRU5dOyAvKiBXTUlfRk9SQ0VfUk9BTSAqLworCQl1OCByb2FtX21vZGU7IC8qIFdNSV9TRVRfUk9BTV9NT0RFICovCisJCXN0cnVjdCBic3NfYmlhc19pbmZvIGJzczsgLyogV01JX1NFVF9IT1NUX0JJQVMgKi8KKwkJc3RydWN0IGxvd19yc3NpX3NjYW5fcGFyYW1zIHBhcmFtczsgLyogV01JX1NFVF9MUlNTSV9TQ0FOX1BBUkFNUworCQkJCQkJICAgICAqLwogCX0gX19wYWNrZWQgaW5mbzsKIAl1OCByb2FtX2N0cmw7CiB9IF9fcGFja2VkOwpAQCAtMTQ1NSw2ICsxNDY5LDEwIEBACiAJdTggaXNfbWNhc3Q7CiB9IF9fcGFja2VkOwogCitlbnVtIHdtaV9zY2FuX3N0YXR1cyB7CisJV01JX1NDQU5fU1RBVFVTX1NVQ0NFU1MgPSAwLAorfTsKKwogLyogV01JX1NDQU5fQ09NUExFVEVfRVZFTlRJRCAqLwogc3RydWN0IHdtaV9zY2FuX2NvbXBsZXRlX2V2ZW50IHsKIAlhX3NsZTMyIHN0YXR1czsKQEAgLTE2MzUsNiArMTY1MywxMiBAQAogCXU4IHJlc2VydmVkOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IHdtaV90YXJnZXRfcm9hbV90YmwgeworCV9fbGUxNiByb2FtX21vZGU7CisJX19sZTE2IG51bV9lbnRyaWVzOworCXN0cnVjdCB3bWlfYnNzX3JvYW1faW5mbyBpbmZvW107Cit9IF9fcGFja2VkOworCiAvKiBXTUlfQ0FDX0VWRU5USUQgKi8KIGVudW0gY2FjX2luZGljYXRpb24gewogCUNBQ19JTkRJQ0FUSU9OX0FETUlTU0lPTiA9IDB4MDAsCkBAIC0xNzcxLDcgKzE3OTUsNiBAQAogI2RlZmluZSBXU0NfUkVHX0FDVElWRSAgICAgMQogI2RlZmluZSBXU0NfUkVHX0lOQUNUSVZFICAgMAogCi0jZGVmaW5lIFdPV19NQVhfRklMVEVSX0xJU1RTCSAxCiAjZGVmaW5lIFdPV19NQVhfRklMVEVSU19QRVJfTElTVCA0CiAjZGVmaW5lIFdPV19QQVRURVJOX1NJWkUJIDY0CiAjZGVmaW5lIFdPV19NQVNLX1NJWkUJCSA2NApAQCAtMTc5NCwxNyArMTgxNyw1MiBAQAogCV9fbGUzMiBpcHNbTUFYX0lQX0FERFJTXTsKIH0gX19wYWNrZWQ7CiAKLS8qIFdNSV9HRVRfV09XX0xJU1RfQ01EIHJlcGx5ICAqLwotc3RydWN0IHdtaV9nZXRfd293X2xpc3RfcmVwbHkgewotCS8qIG51bWJlciBvZiBwYXR0ZXJucyBpbiByZXBseSAqLwotCXU4IG51bV9maWx0ZXJzOworZW51bSBhdGg2a2xfd293X2ZpbHRlcnMgeworCVdPV19GSUxURVJfU1NJRAkJCT0gQklUKDApLAorCVdPV19GSUxURVJfT1BUSU9OX01BR0lDX1BBQ0tFVCAgPSBCSVQoMiksCisJV09XX0ZJTFRFUl9PUFRJT05fRUFQX1JFUQk9IEJJVCgzKSwKKwlXT1dfRklMVEVSX09QVElPTl9QQVRURVJOUwk9IEJJVCg0KSwKKwlXT1dfRklMVEVSX09QVElPTl9PRkZMT0FEX0FSUAk9IEJJVCg1KSwKKwlXT1dfRklMVEVSX09QVElPTl9PRkZMT0FEX05TCT0gQklUKDYpLAorCVdPV19GSUxURVJfT1BUSU9OX09GRkxPQURfR1RLCT0gQklUKDcpLAorCVdPV19GSUxURVJfT1BUSU9OXzgwMjFYXzRXQVlIUwk9IEJJVCg4KSwKKwlXT1dfRklMVEVSX09QVElPTl9OTE9fRElTQ1ZSWQk9IEJJVCg5KSwKKwlXT1dfRklMVEVSX09QVElPTl9OV0tfRElTQVNTT0MJPSBCSVQoMTApLAorCVdPV19GSUxURVJfT1BUSU9OX0dUS19FUlJPUgk9IEJJVCgxMSksCisJV09XX0ZJTFRFUl9PUFRJT05fVEVTVF9NT0RFCT0gQklUKDE1KSwKK307CiAKLQkvKiB0aGlzIGlzIGZpbHRlciAjIHggb2YgdG90YWwgbnVtX2ZpbHRlcnMgKi8KLQl1OCB0aGlzX2ZpbHRlcl9udW07CitlbnVtIGF0aDZrbF9ob3N0X21vZGUgeworCUFUSDZLTF9IT1NUX01PREVfQVdBS0UsCisJQVRINktMX0hPU1RfTU9ERV9BU0xFRVAsCit9OwogCi0JdTggd293X21vZGU7Ci0JdTggaG9zdF9tb2RlOwotCXN0cnVjdCB3b3dfZmlsdGVyIHdvd19maWx0ZXJzWzFdOworc3RydWN0IHdtaV9zZXRfaG9zdF9zbGVlcF9tb2RlX2NtZCB7CisJX19sZTMyIGF3YWtlOworCV9fbGUzMiBhc2xlZXA7Cit9IF9fcGFja2VkOworCitlbnVtIGF0aDZrbF93b3dfbW9kZSB7CisJQVRINktMX1dPV19NT0RFX0RJU0FCTEUsCisJQVRINktMX1dPV19NT0RFX0VOQUJMRSwKK307CisKK3N0cnVjdCB3bWlfc2V0X3dvd19tb2RlX2NtZCB7CisJX19sZTMyIGVuYWJsZV93b3c7CisJX19sZTMyIGZpbHRlcjsKKwlfX2xlMTYgaG9zdF9yZXFfZGVsYXk7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd21pX2FkZF93b3dfcGF0dGVybl9jbWQgeworCXU4IGZpbHRlcl9saXN0X2lkOworCXU4IGZpbHRlcl9zaXplOworCXU4IGZpbHRlcl9vZmZzZXQ7CisJdTggZmlsdGVyWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHdtaV9kZWxfd293X3BhdHRlcm5fY21kIHsKKwlfX2xlMTYgZmlsdGVyX2xpc3RfaWQ7CisJX19sZTE2IGZpbHRlcl9pZDsKIH0gX19wYWNrZWQ7CiAKIC8qIFdNSV9TRVRfQUtNUF9QQVJBTVNfQ01EICovCkBAIC0yMTYzLDIwICsyMjIxLDIxIEBACiBpbnQgYXRoNmtsX3dtaV9kYXRhX2hkcl9hZGQoc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgIHU4IG1zZ190eXBlLCBib29sIG1vcmVfZGF0YSwKIAkJCSAgICBlbnVtIHdtaV9kYXRhX2hkcl9kYXRhX3R5cGUgZGF0YV90eXBlLAotCQkJICAgIHU4IG1ldGFfdmVyLCB2b2lkICp0eF9tZXRhX2luZm8pOworCQkJICAgIHU4IG1ldGFfdmVyLCB2b2lkICp0eF9tZXRhX2luZm8sIHU4IGlmX2lkeCk7CiAKIGludCBhdGg2a2xfd21pX2RvdDExX2hkcl9yZW1vdmUoc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBhdGg2a2xfd21pX2RvdDNfMl9kaXgoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgYXRoNmtsX3dtaV9pbXBsaWNpdF9jcmVhdGVfcHN0cmVhbShzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIHUzMiBsYXllcjJfcHJpb3JpdHksIGJvb2wgd21tX2VuYWJsZWQsCi0JCQkJICAgICAgIHU4ICphYyk7CitpbnQgYXRoNmtsX3dtaV9pbXBsaWNpdF9jcmVhdGVfcHN0cmVhbShzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGxheWVyMl9wcmlvcml0eSwKKwkJCQkgICAgICAgYm9vbCB3bW1fZW5hYmxlZCwgdTggKmFjKTsKIAogaW50IGF0aDZrbF93bWlfY29udHJvbF9yeChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IpOwogCi1pbnQgYXRoNmtsX3dtaV9jbWRfc2VuZChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IsCitpbnQgYXRoNmtsX3dtaV9jbWRfc2VuZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCWVudW0gd21pX2NtZF9pZCBjbWRfaWQsIGVudW0gd21pX3N5bmNfZmxhZyBzeW5jX2ZsYWcpOwogCi1pbnQgYXRoNmtsX3dtaV9jb25uZWN0X2NtZChzdHJ1Y3Qgd21pICp3bWksIGVudW0gbmV0d29ya190eXBlIG53X3R5cGUsCitpbnQgYXRoNmtsX3dtaV9jb25uZWN0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCSAgIGVudW0gbmV0d29ya190eXBlIG53X3R5cGUsCiAJCQkgICBlbnVtIGRvdDExX2F1dGhfbW9kZSBkb3QxMV9hdXRoX21vZGUsCiAJCQkgICBlbnVtIGF1dGhfbW9kZSBhdXRoX21vZGUsCiAJCQkgICBlbnVtIGNyeXB0b190eXBlIHBhaXJ3aXNlX2NyeXB0bywKQEAgLTIxODUsOTggKzIyNDQsMTI0IEBACiAJCQkgICB1OCBncm91cF9jcnlwdG9fbGVuLCBpbnQgc3NpZF9sZW4sIHU4ICpzc2lkLAogCQkJICAgdTggKmJzc2lkLCB1MTYgY2hhbm5lbCwgdTMyIGN0cmxfZmxhZ3MpOwogCi1pbnQgYXRoNmtsX3dtaV9yZWNvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggKmJzc2lkLCB1MTYgY2hhbm5lbCk7Ci1pbnQgYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChzdHJ1Y3Qgd21pICp3bWkpOwotaW50IGF0aDZrbF93bWlfc3RhcnRzY2FuX2NtZChzdHJ1Y3Qgd21pICp3bWksIGVudW0gd21pX3NjYW5fdHlwZSBzY2FuX3R5cGUsCitpbnQgYXRoNmtsX3dtaV9yZWNvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCAqYnNzaWQsCisJCQkgICAgIHUxNiBjaGFubmVsKTsKK2ludCBhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4KTsKK2ludCBhdGg2a2xfd21pX3N0YXJ0c2Nhbl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkgICAgIGVudW0gd21pX3NjYW5fdHlwZSBzY2FuX3R5cGUsCiAJCQkgICAgIHUzMiBmb3JjZV9mZ3NjYW4sIHUzMiBpc19sZWdhY3ksCiAJCQkgICAgIHUzMiBob21lX2R3ZWxsX3RpbWUsIHUzMiBmb3JjZV9zY2FuX2ludGVydmFsLAogCQkJICAgICBzOCBudW1fY2hhbiwgdTE2ICpjaF9saXN0KTsKLWludCBhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTE2IGZnX3N0YXJ0X3NlYywKK2ludCBhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MTYgZmdfc3RhcnRfc2VjLAogCQkJICAgICAgdTE2IGZnX2VuZF9zZWMsIHUxNiBiZ19zZWMsCiAJCQkgICAgICB1MTYgbWluYWN0X2NoZHdfbXNlYywgdTE2IG1heGFjdF9jaGR3X21zZWMsCiAJCQkgICAgICB1MTYgcGFzX2NoZHdfbXNlYywgdTggc2hvcnRfc2Nhbl9yYXRpbywKIAkJCSAgICAgIHU4IHNjYW5fY3RybF9mbGFnLCB1MzIgbWF4X2Rmc2NoX2FjdF90aW1lLAogCQkJICAgICAgdTE2IG1heGFjdF9zY2FuX3Blcl9zc2lkKTsKLWludCBhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBmaWx0ZXIsIHUzMiBpZV9tYXNrKTsKLWludCBhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaW5kZXgsIHU4IGZsYWcsCitpbnQgYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBmaWx0ZXIsCisJCQkgICAgIHUzMiBpZV9tYXNrKTsKK2ludCBhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBpbmRleCwgdTggZmxhZywKIAkJCSAgICAgIHU4IHNzaWRfbGVuLCB1OCAqc3NpZCk7Ci1pbnQgYXRoNmtsX3dtaV9saXN0ZW5pbnRlcnZhbF9jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgbGlzdGVuX2ludGVydmFsLAoraW50IGF0aDZrbF93bWlfbGlzdGVuaW50ZXJ2YWxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgdTE2IGxpc3Rlbl9pbnRlcnZhbCwKIAkJCQkgIHUxNiBsaXN0ZW5fYmVhY29ucyk7Ci1pbnQgYXRoNmtsX3dtaV9wb3dlcm1vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggcHdyX21vZGUpOwotaW50IGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTE2IGlkbGVfcGVyaW9kLAoraW50IGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggcHdyX21vZGUpOworaW50IGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MTYgaWRsZV9wZXJpb2QsCiAJCQkgICAgdTE2IHBzX3BvbGxfbnVtLCB1MTYgZHRpbV9wb2xpY3ksCiAJCQkgICAgdTE2IHR4X3dha3VwX3BvbGljeSwgdTE2IG51bV90eF90b193YWtldXAsCiAJCQkgICAgdTE2IHBzX2ZhaWxfZXZlbnRfcG9saWN5KTsKLWludCBhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHRpbWVvdXQpOwotaW50IGF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKHN0cnVjdCB3bWkgKndtaSwKK2ludCBhdGg2a2xfd21pX2NyZWF0ZV9wc3RyZWFtX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKIAkJCQkgIHN0cnVjdCB3bWlfY3JlYXRlX3BzdHJlYW1fY21kICpwc3RyZWFtKTsKLWludCBhdGg2a2xfd21pX2RlbGV0ZV9wc3RyZWFtX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHRyYWZmaWNfY2xhc3MsIHU4IHRzaWQpOworaW50IGF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCB0cmFmZmljX2NsYXNzLAorCQkJCSAgdTggdHNpZCk7CitpbnQgYXRoNmtsX3dtaV9kaXNjdGltZW91dF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IHRpbWVvdXQpOwogCiBpbnQgYXRoNmtsX3dtaV9zZXRfcnRzX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUxNiB0aHJlc2hvbGQpOwotaW50IGF0aDZrbF93bWlfc2V0X2xwcmVhbWJsZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBzdGF0dXMsCitpbnQgYXRoNmtsX3dtaV9zZXRfbHByZWFtYmxlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggc3RhdHVzLAogCQkJCSB1OCBwcmVhbWJsZV9wb2xpY3kpOwogCiBpbnQgYXRoNmtsX3dtaV9nZXRfY2hhbGxlbmdlX3Jlc3BfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGNvb2tpZSwgdTMyIHNvdXJjZSk7CiBpbnQgYXRoNmtsX3dtaV9jb25maWdfZGVidWdfbW9kdWxlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUzMiB2YWxpZCwgdTMyIGNvbmZpZyk7CiAKLWludCBhdGg2a2xfd21pX2dldF9zdGF0c19jbWQoc3RydWN0IHdtaSAqd21pKTsKLWludCBhdGg2a2xfd21pX2FkZGtleV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBrZXlfaW5kZXgsCitpbnQgYXRoNmtsX3dtaV9nZXRfc3RhdHNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4KTsKK2ludCBhdGg2a2xfd21pX2FkZGtleV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGtleV9pbmRleCwKIAkJCSAgZW51bSBjcnlwdG9fdHlwZSBrZXlfdHlwZSwKIAkJCSAgdTgga2V5X3VzYWdlLCB1OCBrZXlfbGVuLAotCQkJICB1OCAqa2V5X3JzYywgdTggKmtleV9tYXRlcmlhbCwKKwkJCSAgdTggKmtleV9yc2MsIHVuc2lnbmVkIGludCBrZXlfcnNjX2xlbiwKKwkJCSAgdTggKmtleV9tYXRlcmlhbCwKIAkJCSAgdTgga2V5X29wX2N0cmwsIHU4ICptYWNfYWRkciwKIAkJCSAgZW51bSB3bWlfc3luY19mbGFnIHN5bmNfZmxhZyk7Ci1pbnQgYXRoNmtsX3dtaV9hZGRfa3JrX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4ICprcmspOwotaW50IGF0aDZrbF93bWlfZGVsZXRla2V5X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGtleV9pbmRleCk7Ci1pbnQgYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoc3RydWN0IHdtaSAqd21pLCBjb25zdCB1OCAqYnNzaWQsCitpbnQgYXRoNmtsX3dtaV9hZGRfa3JrX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggKmtyayk7CitpbnQgYXRoNmtsX3dtaV9kZWxldGVrZXlfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBrZXlfaW5kZXgpOworaW50IGF0aDZrbF93bWlfc2V0cG1raWRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBjb25zdCB1OCAqYnNzaWQsCiAJCQkgICAgY29uc3QgdTggKnBta2lkLCBib29sIHNldCk7Ci1pbnQgYXRoNmtsX3dtaV9zZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGRiTSk7Ci1pbnQgYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWkpOworaW50IGF0aDZrbF93bWlfc2V0X3R4X3B3cl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGRiTSk7CitpbnQgYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCk7CitpbnQgYXRoNmtsX3dtaV9nZXRfcm9hbV90YmxfY21kKHN0cnVjdCB3bWkgKndtaSk7CiAKLWludCBhdGg2a2xfd21pX3NldF93bW1fdHhvcChzdHJ1Y3Qgd21pICp3bWksIGVudW0gd21pX3R4b3BfY2ZnIGNmZyk7Ci1pbnQgYXRoNmtsX3dtaV9zZXRfa2VlcGFsaXZlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGtlZXBfYWxpdmVfaW50dmwpOworaW50IGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBlbnVtIHdtaV90eG9wX2NmZyBjZmcpOworaW50IGF0aDZrbF93bWlfc2V0X2tlZXBhbGl2ZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJIHU4IGtlZXBfYWxpdmVfaW50dmwpOwogaW50IGF0aDZrbF93bWlfdGVzdF9jbWQoc3RydWN0IHdtaSAqd21pLCB2b2lkICpidWYsIHNpemVfdCBsZW4pOwogCiBzMzIgYXRoNmtsX3dtaV9nZXRfcmF0ZShzOCByYXRlX2luZGV4KTsKIAogaW50IGF0aDZrbF93bWlfc2V0X2lwX2NtZChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCB3bWlfc2V0X2lwX2NtZCAqaXBfY21kKTsKK2ludCBhdGg2a2xfd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgICAgICBlbnVtIGF0aDZrbF9ob3N0X21vZGUgaG9zdF9tb2RlKTsKK2ludCBhdGg2a2xfd21pX3NldF93b3dfbW9kZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJZW51bSBhdGg2a2xfd293X21vZGUgd293X21vZGUsCisJCQkJdTMyIGZpbHRlciwgdTE2IGhvc3RfcmVxX2RlbGF5KTsKK2ludCBhdGg2a2xfd21pX2FkZF93b3dfcGF0dGVybl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgdTggbGlzdF9pZCwgdTggZmlsdGVyX3NpemUsCisJCQkJICAgdTggZmlsdGVyX29mZnNldCwgdTggKmZpbHRlciwgdTggKm1hc2spOworaW50IGF0aDZrbF93bWlfZGVsX3dvd19wYXR0ZXJuX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICB1MTYgbGlzdF9pZCwgdTE2IGZpbHRlcl9pZCk7CiBpbnQgYXRoNmtsX3dtaV9zZXRfcm9hbV9scnNzaV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBscnNzaSk7CitpbnQgYXRoNmtsX3dtaV9mb3JjZV9yb2FtX2NtZChzdHJ1Y3Qgd21pICp3bWksIGNvbnN0IHU4ICpic3NpZCk7CitpbnQgYXRoNmtsX3dtaV9zZXRfcm9hbV9tb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIGVudW0gd21pX3JvYW1fbW9kZSBtb2RlKTsKIAogLyogQVAgbW9kZSAqLwotaW50IGF0aDZrbF93bWlfYXBfcHJvZmlsZV9jb21taXQoc3RydWN0IHdtaSAqd21pcCwgc3RydWN0IHdtaV9jb25uZWN0X2NtZCAqcCk7CitpbnQgYXRoNmtsX3dtaV9hcF9wcm9maWxlX2NvbW1pdChzdHJ1Y3Qgd21pICp3bWlwLCB1OCBpZl9pZHgsCisJCQkJIHN0cnVjdCB3bWlfY29ubmVjdF9jbWQgKnApOwogCi1pbnQgYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShzdHJ1Y3Qgd21pICp3bWlwLCB1OCBjbWQsIGNvbnN0IHU4ICptYWMsIHUxNiByZWFzb24pOworaW50IGF0aDZrbF93bWlfYXBfc2V0X21sbWUoc3RydWN0IHdtaSAqd21pcCwgdTggaWZfaWR4LCB1OCBjbWQsCisJCQkgICBjb25zdCB1OCAqbWFjLCB1MTYgcmVhc29uKTsKIAotaW50IGF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgYWlkLCBib29sIGZsYWcpOworaW50IGF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUxNiBhaWQsIGJvb2wgZmxhZyk7CiAKLWludCBhdGg2a2xfd21pX3NldF9yeF9mcmFtZV9mb3JtYXRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggcnhfbWV0YV92ZXJzaW9uLAoraW50IGF0aDZrbF93bWlfc2V0X3J4X2ZyYW1lX2Zvcm1hdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgICAgIHU4IHJ4X21ldGFfdmVyc2lvbiwKIAkJCQkgICAgICAgYm9vbCByeF9kb3QxMV9oZHIsIGJvb2wgZGVmcmFnX29uX2hvc3QpOwogCi1pbnQgYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggbWdtdF9mcm1fdHlwZSwgY29uc3QgdTggKmllLAotCQkJICAgICB1OCBpZV9sZW4pOworaW50IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggbWdtdF9mcm1fdHlwZSwKKwkJCSAgICAgY29uc3QgdTggKmllLCB1OCBpZV9sZW4pOwogCiAvKiBQMlAgKi8KIGludCBhdGg2a2xfd21pX2Rpc2FibGVfMTFiX3JhdGVzX2NtZChzdHJ1Y3Qgd21pICp3bWksIGJvb2wgZGlzYWJsZSk7CiAKLWludCBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUzMiBmcmVxLCB1MzIgZHVyKTsKK2ludCBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTMyIGZyZXEsCisJCQkJICB1MzIgZHVyKTsKIAotaW50IGF0aDZrbF93bWlfc2VuZF9hY3Rpb25fY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGlkLCB1MzIgZnJlcSwgdTMyIHdhaXQsCi0JCQkgICAgICAgY29uc3QgdTggKmRhdGEsIHUxNiBkYXRhX2xlbik7CitpbnQgYXRoNmtsX3dtaV9zZW5kX2FjdGlvbl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUzMiBpZCwgdTMyIGZyZXEsCisJCQkgICAgICAgdTMyIHdhaXQsIGNvbnN0IHU4ICpkYXRhLCB1MTYgZGF0YV9sZW4pOwogCi1pbnQgYXRoNmtsX3dtaV9zZW5kX3Byb2JlX3Jlc3BvbnNlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUzMiBmcmVxLAotCQkJCSAgICAgICBjb25zdCB1OCAqZHN0LAotCQkJCSAgICAgICBjb25zdCB1OCAqZGF0YSwgdTE2IGRhdGFfbGVuKTsKK2ludCBhdGg2a2xfd21pX3NlbmRfcHJvYmVfcmVzcG9uc2VfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgZnJlcSwKKwkJCQkgICAgICAgY29uc3QgdTggKmRzdCwgY29uc3QgdTggKmRhdGEsCisJCQkJICAgICAgIHUxNiBkYXRhX2xlbik7CiAKLWludCBhdGg2a2xfd21pX3Byb2JlX3JlcG9ydF9yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgYm9vbCBlbmFibGUpOworaW50IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIGJvb2wgZW5hYmxlKTsKIAotaW50IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGluZm9fcmVxX2ZsYWdzKTsKK2ludCBhdGg2a2xfd21pX2luZm9fcmVxX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTMyIGluZm9fcmVxX2ZsYWdzKTsKIAotaW50IGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWkpOworaW50IGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCk7CiAKLWludCBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBtZ210X2ZybV90eXBlLCBjb25zdCB1OCAqaWUsCi0JCQkgICAgIHU4IGllX2xlbik7CitpbnQgYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBtZ210X2ZybV90eXBlLAorCQkJICAgICBjb25zdCB1OCAqaWUsIHU4IGllX2xlbik7CiAKK3N0cnVjdCBhdGg2a2xfdmlmICphdGg2a2xfZ2V0X3ZpZl9ieV9pbmRleChzdHJ1Y3QgYXRoNmtsICphciwgdTggaWZfaWR4KTsKIHZvaWQgKmF0aDZrbF93bWlfaW5pdChzdHJ1Y3QgYXRoNmtsICpkZXZ0KTsKIHZvaWQgYXRoNmtsX3dtaV9zaHV0ZG93bihzdHJ1Y3Qgd21pICp3bWkpOwordm9pZCBhdGg2a2xfd21pX3Jlc2V0KHN0cnVjdCB3bWkgKndtaSk7CiAKICNlbmRpZiAvKiBXTUlfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZwppbmRleCBkOWMwOGM2Li43YjRjMDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZwpAQCAtMjUsNiArMjUsNyBAQAogCiBjb25maWcgQVRIOUtfUENJCiAJYm9vbCAiQXRoZXJvcyBhdGg5ayBQQ0kvUENJZSBidXMgc3VwcG9ydCIKKwlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIEFUSDlLICYmIFBDSQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIFBDSSBidXMgc3VwcG9ydCBpbiBhdGg5ay4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9NYWtlZmlsZQppbmRleCAzNmVkM2M0Li4zOTA3OTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCQltYWluLm8gXAogCQlyZWN2Lm8gXAogCQl4bWl0Lm8gXAorCQltY2kubyBcCiAKIGF0aDlrLSQoQ09ORklHX0FUSDlLX1JBVEVfQ09OVFJPTCkgKz0gcmMubwogYXRoOWstJChDT05GSUdfQVRIOUtfUENJKSArPSBwY2kubwpAQCAtMzMsNyArMzQsOCBAQAogCQlhcjkwMDJfbWFjLm8gXAogCQlhcjkwMDNfbWFjLm8gXAogCQlhcjkwMDNfZWVwcm9tLm8gXAotCQlhcjkwMDNfcGFwcmQubworCQlhcjkwMDNfcGFwcmQubyBcCisJCWFyOTAwM19tY2kubwogCiBvYmotJChDT05GSUdfQVRIOUtfSFcpICs9IGF0aDlrX2h3Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FoYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FoYi5jCmluZGV4IDg1YTU0Y2QuLjVlNDdjYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9haGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYWhiLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ubDgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRoOWtfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJhdGg5ay5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBhdGg5a19wbGF0Zm9ybV9pZF90YWJsZVtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5jCmluZGV4IDI3NzZjM2MuLmE2MzliOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hbmkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYW5pLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJody1vcHMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9ody5jCmluZGV4IDYyNmQ1NDcuLjExZjE5MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2h3LmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjUwMDhfaW5pdHZhbHMuaCIKICNpbmNsdWRlICJhcjkwMDFfaW5pdHZhbHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX21hYy5jCmluZGV4IGY3ZDhlNTEuLmI1OTIwMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9tYWMuYwpAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlICJody5oIgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjZGVmaW5lIEFSX0J1ZkxlbiAgICAgICAgICAgMHgwMDAwMGZmZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2NhbGliLmMKaW5kZXggMTJhNzMwZC4uZGRlYmE4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19jYWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfY2FsaWIuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgImh3LW9wcy5oIgogI2luY2x1ZGUgImFyOTAwM19waHkuaCIKICNpbmNsdWRlICJhcjkwMDNfcnR0LmgiCisjaW5jbHVkZSAiYXI5MDAzX21jaS5oIgogCiAjZGVmaW5lIE1BWF9NRUFTVVJFTUVOVAlNQVhfSVFDQUxfTUVBU1VSRU1FTlQKICNkZWZpbmUgTUFYX01BR19ERUxUQQkxMQpAQCAtODI0LDcgKzgyNSw3IEBACiAJCQkJCQljaGFuX2luZm9fdGFiW2ldICsgb2Zmc2V0KTsKIAogCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCQkJIklRIFJFU1slZF09MHgleCIKKwkJCQkJIklRX1JFU1slZF09MHgleCAiCiAJCQkJCSJJUV9SRVNbJWRdPTB4JXhcbiIsCiAJCQkJCWlkeCwgaXFfcmVzW2lkeF0sIGlkeCArIDEsCiAJCQkJCWlxX3Jlc1tpZHggKyAxXSk7CkBAIC05MzQsMTAgKzkzNSwxMiBAQAogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXN0cnVjdCBhdGg5a19od19jYWxfZGF0YSAqY2FsZGF0YSA9IGFoLT5jYWxkYXRhOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaV9odyA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKIAlib29sIHR4aXFjYWxfZG9uZSA9IGZhbHNlLCB0eGNsY2FsX2RvbmUgPSBmYWxzZTsKIAlib29sIGlzX3JldXNhYmxlID0gdHJ1ZSwgc3RhdHVzID0gdHJ1ZTsKIAlib29sIHJ1bl9ydHRfY2FsID0gZmFsc2UsIHJ1bl9hZ2NfY2FsOwogCWJvb2wgcnR0ID0gISEoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9SVFQpOworCWJvb2wgbWNpID0gISEoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpOwogCXUzMiBhZ2NfY3RybCA9IDAsIGFnY19zdXBwX2NhbHMgPSBBUl9QSFlfQUdDX0NPTlRST0xfT0ZGU0VUX0NBTCB8CiAJCQkJCSAgQVJfUEhZX0FHQ19DT05UUk9MX0ZMVFJfQ0FMICAgfAogCQkJCQkgIEFSX1BIWV9BR0NfQ09OVFJPTF9QS0RFVF9DQUw7CkBAIC0xMDA1LDYgKzEwMDgsMzEgQEAKIAl9IGVsc2UgaWYgKGNhbGRhdGEgJiYgIWNhbGRhdGEtPmRvbmVfdHhpcWNhbF9vbmNlKQogCQlydW5fYWdjX2NhbCA9IHRydWU7CiAKKwlpZiAobWNpICYmIElTX0NIQU5fMkdIWihjaGFuKSAmJgorCSAgICAobWNpX2h3LT5idF9zdGF0ZSAgPT0gTUNJX0JUX0FXQUtFKSAmJgorCSAgICBydW5fYWdjX2NhbCAmJgorCSAgICAhKG1jaV9ody0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfRElTQUJMRV9NQ0lfQ0FMKSkgeworCisJCXUzMiBwbGRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJLyogc2VuZCBDQUxfUkVRIG9ubHkgd2hlbiBCVCBpcyBBV0FLRS4gKi8KKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIHNlbmQgV0xBTl9DQUxfUkVRIDB4JXhcbiIsCisJCQltY2lfaHctPndsYW5fY2FsX3NlcSk7CisJCU1DSV9HUE1fU0VUX0NBTF9UWVBFKHBsZCwgTUNJX0dQTV9XTEFOX0NBTF9SRVEpOworCQlwbGRbTUNJX0dQTV9XTEFOX0NBTF9XX1NFUVVFTkNFXSA9IG1jaV9ody0+d2xhbl9jYWxfc2VxKys7CisJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwbGQsIDE2LCB0cnVlLCBmYWxzZSk7CisKKwkJLyogV2FpdCBCVF9DQUxfR1JBTlQgZm9yIDUwbXMgKi8KKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIHdhaXQgZm9yIEJUX0NBTF9HUkFOVCIpOworCisJCWlmIChhcjkwMDNfbWNpX3dhaXRfZm9yX2dwbShhaCwgTUNJX0dQTV9CVF9DQUxfR1JBTlQsIDAsIDUwMDAwKSkKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBnb3QgQlRfQ0FMX0dSQU5UIik7CisJCWVsc2UgeworCQkJaXNfcmV1c2FibGUgPSBmYWxzZTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIlxuTUNJIEJUIGlzIG5vdCByZXNwb25kaW5nIik7CisJCX0KKwl9CisKIAl0eGlxY2FsX2RvbmUgPSBhcjkwMDNfaHdfdHhfaXFfY2FsX3J1bihhaCk7CiAJUkVHX1dSSVRFKGFoLCBBUl9QSFlfQUNUSVZFLCBBUl9QSFlfQUNUSVZFX0RJUyk7CiAJdWRlbGF5KDUpOwpAQCAtMTAyMiw2ICsxMDUwLDIxIEBACiAJCQkJICAgICAgIEFSX1BIWV9BR0NfQ09OVFJPTF9DQUwsCiAJCQkJICAgICAgIDAsIEFIX1dBSVRfVElNRU9VVCk7CiAJfQorCisJaWYgKG1jaSAmJiBJU19DSEFOXzJHSFooY2hhbikgJiYKKwkgICAgKG1jaV9ody0+YnRfc3RhdGUgID09IE1DSV9CVF9BV0FLRSkJJiYKKwkgICAgcnVuX2FnY19jYWwJJiYKKwkgICAgIShtY2lfaHctPmNvbmZpZyAmIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfTUNJX0NBTCkpIHsKKworCQl1MzIgcGxkWzRdID0gezAsIDAsIDAsIDB9OworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIFdMQU5fQ0FMX0RPTkUgMHgleFxuIiwKKwkJCW1jaV9ody0+d2xhbl9jYWxfZG9uZSk7CisJCU1DSV9HUE1fU0VUX0NBTF9UWVBFKHBsZCwgTUNJX0dQTV9XTEFOX0NBTF9ET05FKTsKKwkJcGxkW01DSV9HUE1fV0xBTl9DQUxfV19TRVFVRU5DRV0gPSBtY2lfaHctPndsYW5fY2FsX2RvbmUrKzsKKwkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBsZCwgMTYsIHRydWUsIGZhbHNlKTsKKwl9CisKIAlpZiAocnR0ICYmICFydW5fcnR0X2NhbCkgewogCQlhZ2NfY3RybCB8PSBhZ2Nfc3VwcF9jYWxzOwogCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCwgYWdjX2N0cmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKaW5kZXggM2IyNjJiYTYuLjRiYTZmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYwpAQCAtMTIxLDEwICsxMjEsOCBAQAogCQkgKiBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluCiAJCSAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezEsIDEsIDF9LC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHsxLCAxLCAxfSwgLyogMyBjaGFpbiAgKi8KLQkJLmRiX3N0YWdlMyA9IHswLCAwLCAwfSwKLQkJLmRiX3N0YWdlNCA9IHswLCAwLCAwfSwKKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTE0NCw3ICsxNDIsNyBAQAogCSB9LAogCS5iYXNlX2V4dDEgPSB7CiAJCS5hbnRfZGl2X2NvbnRyb2wgPSAwLAotCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIAl9LAogCS5jYWxGcmVxUGllcjJHID0gewogCQlGUkVRMkZCSU4oMjQxMiwgMSksCkBAIC0zMjMsMTAgKzMyMSw4IEBACiAJCS5zcHVyQ2hhbnMgPSB7MCwgMCwgMCwgMCwgMH0sCiAJCS8qIG5vaXNlRmxvb3JUaHJlc2hDaCBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UzID0gezMsIDMsIDN9LCAvKiBkb2Vzbid0IGV4aXN0IGZvciAyRyAqLwotCQkuZGJfc3RhZ2U0ID0gezMsIDMsIDN9LAkgLyogZG9uJ3QgZXhpc3QgZm9yIDJHICovCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDAsCiAJCS50eEZyYW1lVG9EYXRhU3RhcnQgPSAweDBlLAogCQkudHhGcmFtZVRvUGFPbiA9IDB4MGUsCkBAIC02OTgsMTAgKzY5NCw4IEBACiAJCSAqIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4KIAkJICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MSwgMSwgMX0sLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezEsIDEsIDF9LCAvKiAzIGNoYWluICAqLwotCQkuZGJfc3RhZ2UzID0gezAsIDAsIDB9LAotCQkuZGJfc3RhZ2U0ID0gezAsIDAsIDB9LAorCQkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisJCS5xdWlja19kcm9wID0gMCwKIAkJLnhwYUJpYXNMdmwgPSAwLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLApAQCAtNzIxLDcgKzcxNSw3IEBACiAJIH0sCiAJIC5iYXNlX2V4dDEgPSB7CiAJCS5hbnRfZGl2X2NvbnRyb2wgPSAwLAotCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIAkgfSwKIAkuY2FsRnJlcVBpZXIyRyA9IHsKIAkJRlJFUTJGQklOKDI0MTIsIDEpLApAQCAtOTAwLDEwICs4OTQsOCBAQAogCQkuc3B1ckNoYW5zID0ge0ZSRVEyRkJJTig1NTAwLCAwKSwgMCwgMCwgMCwgMH0sCiAJCS8qIG5vaXNlRmxvb3JUaHJlc2hDaCBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UzID0gezMsIDMsIDN9LCAvKiBkb2Vzbid0IGV4aXN0IGZvciAyRyAqLwotCQkuZGJfc3RhZ2U0ID0gezMsIDMsIDN9LAkgLyogZG9uJ3QgZXhpc3QgZm9yIDJHICovCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDB4ZiwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTEyNzYsMTAgKzEyNjgsOCBAQAogCQkgKiBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluCiAJCSAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezEsIDEsIDF9LC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHsxLCAxLCAxfSwgLyogMyBjaGFpbiAgKi8KLQkJLmRiX3N0YWdlMyA9IHswLCAwLCAwfSwKLQkJLmRiX3N0YWdlNCA9IHswLCAwLCAwfSwKKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTEyOTEsMjAgKzEyODEsMjAgQEAKIAkJLnR4RW5kVG9SeE9uID0gMHgyLAogCQkudHhGcmFtZVRvWHBhT24gPSAweGUsCiAJCS50aHJlc2g2MiA9IDI4LAotCQkucGFwZFJhdGVNYXNrSHQyMCA9IExFMzIoMHg4MGMwODApLAotCQkucGFwZFJhdGVNYXNrSHQ0MCA9IExFMzIoMHg4MGMwODApLAorCQkucGFwZFJhdGVNYXNrSHQyMCA9IExFMzIoMHgwYzgwYzA4MCksCisJCS5wYXBkUmF0ZU1hc2tIdDQwID0gTEUzMigweDAwODBjMDgwKSwKIAkJLmZ1dHVyZU1vZGFsID0gewogCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIAkJfSwKIAl9LAogCS5iYXNlX2V4dDEgPSB7CiAJCS5hbnRfZGl2X2NvbnRyb2wgPSAwLAotCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIAl9LAogCS5jYWxGcmVxUGllcjJHID0gewogCQlGUkVRMkZCSU4oMjQxMiwgMSksCiAJCUZSRVEyRkJJTigyNDM3LCAxKSwKLQkJRlJFUTJGQklOKDI0NzIsIDEpLAorCQlGUkVRMkZCSU4oMjQ2MiwgMSksCiAJfSwKIAkvKiBhcjkzMDBfY2FsX2RhdGFfcGVyX2ZyZXFfb3BfbG9vcCAyZyAqLwogCS5jYWxQaWVyRGF0YTJHID0gewpAQCAtMTMxNCw3ICsxMzA0LDcgQEAKIAl9LAogCS5jYWxUYXJnZXRfZnJlcWJpbl9DY2sgPSB7CiAJCUZSRVEyRkJJTigyNDEyLCAxKSwKLQkJRlJFUTJGQklOKDI0ODQsIDEpLAorCQlGUkVRMkZCSU4oMjQ3MiwgMSksCiAJfSwKIAkuY2FsVGFyZ2V0X2ZyZXFiaW5fMkcgPSB7CiAJCUZSRVEyRkJJTigyNDEyLCAxKSwKQEAgLTE0NzgsMTAgKzE0NjgsOCBAQAogCQkuc3B1ckNoYW5zID0gezAsIDAsIDAsIDAsIDB9LAogCQkvKiBub2lzZUZsb29yVGhyZXNoQ2ggQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGlzIHBlciBjaGFpbiAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezMsIDMsIDN9LCAvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTIgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMyA9IHszLCAzLCAzfSwgLyogZG9lc24ndCBleGlzdCBmb3IgMkcgKi8KLQkJLmRiX3N0YWdlNCA9IHszLCAzLCAzfSwJIC8qIGRvbid0IGV4aXN0IGZvciAyRyAqLworCQkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisJCS5xdWlja19kcm9wID0gMCwKIAkJLnhwYUJpYXNMdmwgPSAwLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLApAQCAtMTUxNSw3ICsxNTAzLDcgQEAKIAkJRlJFUTJGQklOKDU1MDAsIDApLAogCQlGUkVRMkZCSU4oNTYwMCwgMCksCiAJCUZSRVEyRkJJTig1NzAwLCAwKSwKLQkJRlJFUTJGQklOKDU4MjUsIDApCisJCUZSRVEyRkJJTig1Nzg1LCAwKQogCX0sCiAJLmNhbFBpZXJEYXRhNUcgPSB7CiAJCXsKQEAgLTE4NTQsMTAgKzE4NDIsOCBAQAogCQkgKiBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluCiAJCSAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezEsIDEsIDF9LC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHsxLCAxLCAxfSwgLyogMyBjaGFpbiAgKi8KLQkJLmRiX3N0YWdlMyA9IHswLCAwLCAwfSwKLQkJLmRiX3N0YWdlNCA9IHswLCAwLCAwfSwKKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTE4NzcsNyArMTg2Myw3IEBACiAJfSwKIAkuYmFzZV9leHQxID0gewogCQkuYW50X2Rpdl9jb250cm9sID0gMCwKLQkJLmZ1dHVyZSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQorCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CiAJfSwKIAkuY2FsRnJlcVBpZXIyRyA9IHsKIAkJRlJFUTJGQklOKDI0MTIsIDEpLApAQCAtMjA1NiwxMCArMjA0Miw4IEBACiAJCS5zcHVyQ2hhbnMgPSB7MCwgMCwgMCwgMCwgMH0sCiAJCS8qIG5vaXNlRmxvb3JUaHJlc2hjaCBjaGVjayBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UzID0gezMsIDMsIDN9LCAvKiBkb2Vzbid0IGV4aXN0IGZvciAyRyAqLwotCQkuZGJfc3RhZ2U0ID0gezMsIDMsIDN9LAkgLyogZG9uJ3QgZXhpc3QgZm9yIDJHICovCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDAsCiAJCS50eEZyYW1lVG9EYXRhU3RhcnQgPSAweDBlLAogCQkudHhGcmFtZVRvUGFPbiA9IDB4MGUsCkBAIC0yNDMxLDEwICsyNDE1LDggQEAKIAkJICogaWYgdGhlIHJlZ2lzdGVyIGlzIHBlciBjaGFpbgogCQkgKi8KIAkJLm5vaXNlRmxvb3JUaHJlc2hDaCA9IHstMSwgMCwgMH0sCi0JCS5vYiA9IHsxLCAxLCAxfSwvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTIgPSB7MSwgMSwgMX0sIC8qIDMgY2hhaW4gICovCi0JCS5kYl9zdGFnZTMgPSB7MCwgMCwgMH0sCi0JCS5kYl9zdGFnZTQgPSB7MCwgMCwgMH0sCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDAsCiAJCS50eEZyYW1lVG9EYXRhU3RhcnQgPSAweDBlLAogCQkudHhGcmFtZVRvUGFPbiA9IDB4MGUsCkBAIC0yNDU0LDEyICsyNDM2LDEyIEBACiAJIH0sCiAJIC5iYXNlX2V4dDEgPSB7CiAJCS5hbnRfZGl2X2NvbnRyb2wgPSAwLAotCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIAkgfSwKIAkuY2FsRnJlcVBpZXIyRyA9IHsKIAkJRlJFUTJGQklOKDI0MTIsIDEpLAogCQlGUkVRMkZCSU4oMjQzNywgMSksCi0JCUZSRVEyRkJJTigyNDcyLCAxKSwKKwkJRlJFUTJGQklOKDI0NjIsIDEpLAogCSB9LAogCS8qIGFyOTMwMF9jYWxfZGF0YV9wZXJfZnJlcV9vcF9sb29wIDJnICovCiAJLmNhbFBpZXJEYXRhMkcgPSB7CkBAIC0yNjMzLDEwICsyNjE1LDggQEAKIAkJLnNwdXJDaGFucyA9IHswLCAwLCAwLCAwLCAwfSwKIAkJLyogbm9pc2VGbG9vclRocmVzaENoIENoZWNrIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4gKi8KIAkJLm5vaXNlRmxvb3JUaHJlc2hDaCA9IHstMSwgMCwgMH0sCi0JCS5vYiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezMsIDMsIDN9LCAvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTMgPSB7MywgMywgM30sIC8qIGRvZXNuJ3QgZXhpc3QgZm9yIDJHICovCi0JCS5kYl9zdGFnZTQgPSB7MywgMywgM30sCSAvKiBkb24ndCBleGlzdCBmb3IgMkcgKi8KKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTI2NjMsNyArMjY0Myw3IEBACiAJCS54YXR0ZW4xTWFyZ2luSGlnaCA9IHswLCAwLCAwfQogCSB9LAogCS5jYWxGcmVxUGllcjVHID0gewotCQlGUkVRMkZCSU4oNTE4MCwgMCksCisJCUZSRVEyRkJJTig1MTYwLCAwKSwKIAkJRlJFUTJGQklOKDUyMjAsIDApLAogCQlGUkVRMkZCSU4oNTMyMCwgMCksCiAJCUZSRVEyRkJJTig1NDAwLCAwKSwKQEAgLTMwMjMsNiArMzAwMyw4IEBACiAJCXJldHVybiBlZXAtPm1vZGFsSGVhZGVyNUcuYW50ZW5uYUdhaW47CiAJY2FzZSBFRVBfQU5URU5OQV9HQUlOXzJHOgogCQlyZXR1cm4gZWVwLT5tb2RhbEhlYWRlcjJHLmFudGVubmFHYWluOworCWNhc2UgRUVQX1FVSUNLX0RST1A6CisJCXJldHVybiBwQmFzZS0+bWlzY0NvbmZpZ3VyYXRpb24gJiBCSVQoMSk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMzQyOCwyNSArMzQxMCwxNCBAQAogCVBSX0VFUCgiQ2hhaW4wIE5GIFRocmVzaG9sZCIsIG1vZGFsX2hkci0+bm9pc2VGbG9vclRocmVzaENoWzBdKTsKIAlQUl9FRVAoIkNoYWluMSBORiBUaHJlc2hvbGQiLCBtb2RhbF9oZHItPm5vaXNlRmxvb3JUaHJlc2hDaFsxXSk7CiAJUFJfRUVQKCJDaGFpbjIgTkYgVGhyZXNob2xkIiwgbW9kYWxfaGRyLT5ub2lzZUZsb29yVGhyZXNoQ2hbMl0pOworCVBSX0VFUCgiUXVpY2sgRHJvcCIsIG1vZGFsX2hkci0+cXVpY2tfZHJvcCk7CisJUFJfRUVQKCJ0eEVuZFRvWHBhT2ZmIiwgbW9kYWxfaGRyLT50eEVuZFRvWHBhT2ZmKTsKIAlQUl9FRVAoInhQQSBCaWFzIExldmVsIiwgbW9kYWxfaGRyLT54cGFCaWFzTHZsKTsKIAlQUl9FRVAoInR4RnJhbWVUb0RhdGFTdGFydCIsIG1vZGFsX2hkci0+dHhGcmFtZVRvRGF0YVN0YXJ0KTsKIAlQUl9FRVAoInR4RnJhbWVUb1BhT24iLCBtb2RhbF9oZHItPnR4RnJhbWVUb1BhT24pOwogCVBSX0VFUCgidHhGcmFtZVRvWHBhT24iLCBtb2RhbF9oZHItPnR4RnJhbWVUb1hwYU9uKTsKIAlQUl9FRVAoInR4Q2xpcCIsIG1vZGFsX2hkci0+dHhDbGlwKTsKIAlQUl9FRVAoIkFEQyBEZXNpcmVkIHNpemUiLCBtb2RhbF9oZHItPmFkY0Rlc2lyZWRTaXplKTsKLQlQUl9FRVAoIkNoYWluMCBvYiIsIG1vZGFsX2hkci0+b2JbMF0pOwotCVBSX0VFUCgiQ2hhaW4xIG9iIiwgbW9kYWxfaGRyLT5vYlsxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgb2IiLCBtb2RhbF9oZHItPm9iWzJdKTsKLQotCVBSX0VFUCgiQ2hhaW4wIGRiX3N0YWdlMiIsIG1vZGFsX2hkci0+ZGJfc3RhZ2UyWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBkYl9zdGFnZTIiLCBtb2RhbF9oZHItPmRiX3N0YWdlMlsxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgZGJfc3RhZ2UyIiwgbW9kYWxfaGRyLT5kYl9zdGFnZTJbMl0pOwotCVBSX0VFUCgiQ2hhaW4wIGRiX3N0YWdlMyIsIG1vZGFsX2hkci0+ZGJfc3RhZ2UzWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBkYl9zdGFnZTMiLCBtb2RhbF9oZHItPmRiX3N0YWdlM1sxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgZGJfc3RhZ2UzIiwgbW9kYWxfaGRyLT5kYl9zdGFnZTNbMl0pOwotCVBSX0VFUCgiQ2hhaW4wIGRiX3N0YWdlNCIsIG1vZGFsX2hkci0+ZGJfc3RhZ2U0WzBdKTsKLQlQUl9FRVAoIkNoYWluMSBkYl9zdGFnZTQiLCBtb2RhbF9oZHItPmRiX3N0YWdlNFsxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgZGJfc3RhZ2U0IiwgbW9kYWxfaGRyLT5kYl9zdGFnZTRbMl0pOwogCiAJcmV0dXJuIGxlbjsKIH0KQEAgLTM1MDMsNiArMzQ3NCw3IEBACiAJUFJfRUVQKCJJbnRlcm5hbCByZWd1bGF0b3IiLCAhIShwQmFzZS0+ZmVhdHVyZUVuYWJsZSAmIEJJVCg0KSkpOwogCVBSX0VFUCgiRW5hYmxlIFBhcHJkIiwgISEocEJhc2UtPmZlYXR1cmVFbmFibGUgJiBCSVQoNSkpKTsKIAlQUl9FRVAoIkRyaXZlciBTdHJlbmd0aCIsICEhKHBCYXNlLT5taXNjQ29uZmlndXJhdGlvbiAmIEJJVCgwKSkpOworCVBSX0VFUCgiUXVpY2sgRHJvcCIsICEhKHBCYXNlLT5taXNjQ29uZmlndXJhdGlvbiAmIEJJVCgxKSkpOwogCVBSX0VFUCgiQ2hhaW4gbWFzayBSZWR1Y2UiLCAocEJhc2UtPm1pc2NDb25maWd1cmF0aW9uID4+IDB4MykgJiAweDEpOwogCVBSX0VFUCgiV3JpdGUgZW5hYmxlIEdwaW8iLCBwQmFzZS0+ZWVwcm9tV3JpdGVFbmFibGVHcGlvKTsKIAlQUl9FRVAoIldMQU4gRGlzYWJsZSBHcGlvIiwgcEJhc2UtPndsYW5EaXNhYmxlR3Bpbyk7CkBAIC0zOTY1LDYgKzM5MzcsNDAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGFyOTAwM19od19xdWlja19kcm9wX2FwcGx5KHN0cnVjdCBhdGhfaHcgKmFoLCB1MTYgZnJlcSkKK3sKKwlzdHJ1Y3QgYXI5MzAwX2VlcHJvbSAqZWVwID0gJmFoLT5lZXByb20uYXI5MzAwX2VlcDsKKwlpbnQgcXVpY2tfZHJvcCA9IGF0aDlrX2h3X2FyOTMwMF9nZXRfZWVwcm9tKGFoLCBFRVBfUVVJQ0tfRFJPUCk7CisJczMyIHRbM10sIGZbM10gPSB7NTE4MCwgNTUwMCwgNTc4NX07CisKKwlpZiAoIXF1aWNrX2Ryb3ApCisJCXJldHVybjsKKworCWlmIChmcmVxIDwgNDAwMCkKKwkJcXVpY2tfZHJvcCA9IGVlcC0+bW9kYWxIZWFkZXIyRy5xdWlja19kcm9wOworCWVsc2UgeworCQl0WzBdID0gZWVwLT5iYXNlX2V4dDEucXVpY2tfZHJvcF9sb3c7CisJCXRbMV0gPSBlZXAtPm1vZGFsSGVhZGVyNUcucXVpY2tfZHJvcDsKKwkJdFsyXSA9IGVlcC0+YmFzZV9leHQxLnF1aWNrX2Ryb3BfaGlnaDsKKwkJcXVpY2tfZHJvcCA9IGFyOTAwM19od19wb3dlcl9pbnRlcnBvbGF0ZShmcmVxLCBmLCB0LCAzKTsKKwl9CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX0FHQywgQVJfUEhZX0FHQ19RVUlDS19EUk9QLCBxdWlja19kcm9wKTsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX2h3X3R4ZW5kX3RvX3hwYV9vZmZfYXBwbHkoc3RydWN0IGF0aF9odyAqYWgsIHUxNiBmcmVxKQoreworCXN0cnVjdCBhcjkzMDBfZWVwcm9tICplZXAgPSAmYWgtPmVlcHJvbS5hcjkzMDBfZWVwOworCXUzMiB2YWx1ZTsKKworCXZhbHVlID0gKGZyZXEgPCA0MDAwKSA/IGVlcC0+bW9kYWxIZWFkZXIyRy50eEVuZFRvWHBhT2ZmIDoKKwkJCQllZXAtPm1vZGFsSGVhZGVyNUcudHhFbmRUb1hwYU9mZjsKKworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9YUEFfVElNSU5HX0NUTCwKKwkJICAgICAgQVJfUEhZX1hQQV9USU1JTkdfQ1RMX1RYX0VORF9YUEFCX09GRiwgdmFsdWUpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9YUEFfVElNSU5HX0NUTCwKKwkJICAgICAgQVJfUEhZX1hQQV9USU1JTkdfQ1RMX1RYX0VORF9YUEFBX09GRiwgdmFsdWUpOworfQorCiBzdGF0aWMgdm9pZCBhdGg5a19od19hcjkzMDBfc2V0X2JvYXJkX3ZhbHVlcyhzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkJICAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKIHsKQEAgLTM5NzIsMTAgKzM5NzgsMTIgQEAKIAlhcjkwMDNfaHdfYW50X2N0cmxfYXBwbHkoYWgsIElTX0NIQU5fMkdIWihjaGFuKSk7CiAJYXI5MDAzX2h3X2RyaXZlX3N0cmVuZ3RoX2FwcGx5KGFoKTsKIAlhcjkwMDNfaHdfYXR0ZW5fYXBwbHkoYWgsIGNoYW4pOworCWFyOTAwM19od19xdWlja19kcm9wX2FwcGx5KGFoLCBjaGFuLT5jaGFubmVsKTsKIAlpZiAoIUFSX1NSRVZfOTMzMChhaCkgJiYgIUFSX1NSRVZfOTM0MChhaCkpCiAJCWFyOTAwM19od19pbnRlcm5hbF9yZWd1bGF0b3JfYXBwbHkoYWgpOwogCWlmIChBUl9TUkVWXzk0ODUoYWgpIHx8IEFSX1NSRVZfOTMzMChhaCkgfHwgQVJfU1JFVl85MzQwKGFoKSkKIAkJYXI5MDAzX2h3X2FwcGx5X3R1bmluZ19jYXBzKGFoKTsKKwlhcjkwMDNfaHdfdHhlbmRfdG9feHBhX29mZl9hcHBseShhaCwgY2hhbi0+Y2hhbm5lbCk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDlrX2h3X2FyOTMwMF9zZXRfYWRkYWMoc3RydWN0IGF0aF9odyAqYWgsCkBAIC00NzcxLDcgKzQ3NzksNyBAQAogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXN0cnVjdCBhcjkzMDBfZWVwcm9tICpwRWVwRGF0YSA9ICZhaC0+ZWVwcm9tLmFyOTMwMF9lZXA7Ci0JdTE2IHR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CisJdTE2IHR3aWNlTWF4RWRnZVBvd2VyOwogCWludCBpOwogCXUxNiBzY2FsZWRQb3dlciA9IDAsIG1pbkN0bFBvd2VyOwogCXN0YXRpYyBjb25zdCB1MTYgY3RsTW9kZXNGb3IxMWFbXSA9IHsKQEAgLTQ4NzIsNiArNDg4MCw3IEBACiAJCQljdGxOdW0gPSBBUjkzMDBfTlVNX0NUTFNfNUc7CiAJCX0KIAorCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOwogCQlmb3IgKGkgPSAwOyAoaSA8IGN0bE51bSkgJiYgY3RsSW5kZXhbaV07IGkrKykgewogCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUkVHVUxBVE9SWSwKIAkJCQkiTE9PUC1DdGxpZHggJWQ6IGNmZ0N0bCAweCUyLjJ4IHBDdGxNb2RlIDB4JTIuMnggY3RsSW5kZXggMHglMi4yeCBjaGFuICVkXG4iLApAQCAtNTA1MSw2ICs1MDYwLDggQEAKIAkJCXJlZ3VsYXRvcnktPm1heF9wb3dlcl9sZXZlbCA9IHRhcmdldFBvd2VyVmFsVDJbaV07CiAJfQogCisJYXRoOWtfaHdfdXBkYXRlX3JlZ3VsYXRvcnlfbWF4cG93ZXIoYWgpOworCiAJaWYgKHRlc3QpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmgKaW5kZXggNjMzNWE4Ni4uYmIyMjNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5oCkBAIC0yMTYsMTAgKzIxNiw4IEBACiAJdTggc3B1ckNoYW5zW0FSX0VFUFJPTV9NT0RBTF9TUFVSU107CiAJLyogMyAgQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGlzIHBlciBjaGFpbiAqLwogCWludDhfdCBub2lzZUZsb29yVGhyZXNoQ2hbQVI5MzAwX01BWF9DSEFJTlNdOwotCXU4IG9iW0FSOTMwMF9NQVhfQ0hBSU5TXTsKLQl1OCBkYl9zdGFnZTJbQVI5MzAwX01BWF9DSEFJTlNdOwotCXU4IGRiX3N0YWdlM1tBUjkzMDBfTUFYX0NIQUlOU107Ci0JdTggZGJfc3RhZ2U0W0FSOTMwMF9NQVhfQ0hBSU5TXTsKKwl1OCByZXNlcnZlZFsxMV07CisJaW50OF90IHF1aWNrX2Ryb3A7CiAJdTggeHBhQmlhc0x2bDsKIAl1OCB0eEZyYW1lVG9EYXRhU3RhcnQ7CiAJdTggdHhGcmFtZVRvUGFPbjsKQEAgLTI2OSw3ICsyNjcsOSBAQAogCiBzdHJ1Y3QgYXI5MzAwX0Jhc2VFeHRlbnNpb25fMSB7CiAJdTggYW50X2Rpdl9jb250cm9sOwotCXU4IGZ1dHVyZVsxM107CisJdTggZnV0dXJlWzExXTsKKwlpbnQ4X3QgcXVpY2tfZHJvcF9sb3c7CisJaW50OF90IHF1aWNrX2Ryb3BfaGlnaDsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBhcjkzMDBfQmFzZUV4dGVuc2lvbl8yIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21hYy5jCmluZGV4IGIzNjNjYzAuLjk1NTg3ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tYWMuYwpAQCAtMTMsNiArMTMsNyBAQAogICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKICAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJody5oIgogI2luY2x1ZGUgImFyOTAwM19tYWMuaCIKIApAQCAtMTc0LDE1ICsxNzUsNDcgQEAKIAl1MzIgaXNyID0gMDsKIAl1MzIgbWFzazIgPSAwOwogCXN0cnVjdCBhdGg5a19od19jYXBhYmlsaXRpZXMgKnBDYXAgPSAmYWgtPmNhcHM7Ci0JdTMyIHN5bmNfY2F1c2UgPSAwOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgc3luY19jYXVzZSA9IDAsIGFzeW5jX2NhdXNlOwogCi0JaWYgKFJFR19SRUFEKGFoLCBBUl9JTlRSX0FTWU5DX0NBVVNFKSAmIEFSX0lOVFJfTUFDX0lSUSkgeworCWFzeW5jX2NhdXNlID0gUkVHX1JFQUQoYWgsIEFSX0lOVFJfQVNZTkNfQ0FVU0UpOworCisJaWYgKGFzeW5jX2NhdXNlICYgKEFSX0lOVFJfTUFDX0lSUSB8IEFSX0lOVFJfQVNZTkNfTUFTS19NQ0kpKSB7CiAJCWlmICgoUkVHX1JFQUQoYWgsIEFSX1JUQ19TVEFUVVMpICYgQVJfUlRDX1NUQVRVU19NKQogCQkJCT09IEFSX1JUQ19TVEFUVVNfT04pCiAJCQlpc3IgPSBSRUdfUkVBRChhaCwgQVJfSVNSKTsKIAl9CiAKKwlpZiAoYXN5bmNfY2F1c2UgJiBBUl9JTlRSX0FTWU5DX01BU0tfTUNJKSB7CisJCXUzMiByYXdfaW50ciwgcnhfbXNnX2ludHI7CisKKwkJcnhfbXNnX2ludHIgPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXKTsKKwkJcmF3X2ludHIgPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcpOworCisJCWlmICgocmF3X2ludHIgPT0gMHhkZWFkYmVlZikgfHwgKHJ4X21zZ19pbnRyID09IDB4ZGVhZGJlZWYpKQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgZ2V0cyAweGRlYWRiZWVmIGR1cmluZyBNQ0kgaW50IHByb2Nlc3NpbmciCisJCQkJIm5ldyByYXdfaW50cj0weCUwOHgsIG5ldyByeF9tc2dfcmF3PTB4JTA4eCwgIgorCQkJCSJyYXdfaW50cj0weCUwOHgsIHJ4X21zZ19yYXc9MHglMDh4XG4iLAorCQkJCXJhd19pbnRyLCByeF9tc2dfaW50ciwgbWNpLT5yYXdfaW50ciwKKwkJCQltY2ktPnJ4X21zZ19pbnRyKTsKKwkJZWxzZSB7CisJCQltY2ktPnJ4X21zZ19pbnRyIHw9IHJ4X21zZ19pbnRyOworCQkJbWNpLT5yYXdfaW50ciB8PSByYXdfaW50cjsKKwkJCSptYXNrZWQgfD0gQVRIOUtfSU5UX01DSTsKKworCQkJaWYgKHJ4X21zZ19pbnRyICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9JTkZPKQorCQkJCW1jaS0+Y29udF9zdGF0dXMgPQorCQkJCQlSRUdfUkVBRChhaCwgQVJfTUNJX0NPTlRfU1RBVFVTKTsKKworCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsIHJ4X21zZ19pbnRyKTsKKwkJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsIHJhd19pbnRyKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIkFSX0lOVFJfU1lOQ19NQ0lcbiIpOworCisJCX0KKwl9CisKIAlzeW5jX2NhdXNlID0gUkVHX1JFQUQoYWgsIEFSX0lOVFJfU1lOQ19DQVVTRSkgJiBBUl9JTlRSX1NZTkNfREVGQVVMVDsKIAogCSptYXNrZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5OTgyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21jaS5jCkBAIC0wLDAgKzEsMTQ2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDExIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlICJody5oIgorI2luY2x1ZGUgImFyOTAwM19waHkuaCIKKyNpbmNsdWRlICJhcjkwMDNfbWNpLmgiCisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfcmVzZXRfcmVxX3dha2V1cChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlpZiAoIUFSX1NSRVZfOTQ2Ml8yMChhaCkpCisJCXJldHVybjsKKworCVJFR19STVdfRklFTEQoYWgsIEFSX01DSV9DT01NQU5EMiwKKwkJICAgICAgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JFUV9XQUtFVVAsIDEpOworCXVkZWxheSgxKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfQ09NTUFORDIsCisJCSAgICAgIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SRVFfV0FLRVVQLCAwKTsKK30KKworc3RhdGljIGludCBhcjkwMDNfbWNpX3dhaXRfZm9yX2ludGVycnVwdChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGFkZHJlc3MsCisJCQkJCXUzMiBiaXRfcG9zaXRpb24sIGludCB0aW1lX291dCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKworCXdoaWxlICh0aW1lX291dCkgeworCisJCWlmIChSRUdfUkVBRChhaCwgYWRkcmVzcykgJiBiaXRfcG9zaXRpb24pIHsKKworCQkJUkVHX1dSSVRFKGFoLCBhZGRyZXNzLCBiaXRfcG9zaXRpb24pOworCisJCQlpZiAoYWRkcmVzcyA9PSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcpIHsKKworCQkJCWlmIChiaXRfcG9zaXRpb24gJgorCQkJCSAgICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRSkKKwkJCQkJYXI5MDAzX21jaV9yZXNldF9yZXFfd2FrZXVwKGFoKTsKKworCQkJCWlmIChiaXRfcG9zaXRpb24gJgorCQkJCSAgICAoQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1NMRUVQSU5HIHwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkcpKQorCQkJCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfUkFXLAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1JFTU9URV9TTEVFUF9VUERBVEUpOworCisJCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywKKwkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TRyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCXVkZWxheSgxMCk7CisJCXRpbWVfb3V0IC09IDEwOworCisJCWlmICh0aW1lX291dCA8IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAodGltZV9vdXQgPD0gMCkgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFdhaXQgZm9yIFJlZyAweCUwOHggPSAweCUwOHggdGltZW91dC5cbiIsCisJCQlhZGRyZXNzLCBiaXRfcG9zaXRpb24pOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIElOVF9SQVcgPSAweCUwOHgsIFJYX01TR19SQVcgPSAweCUwOHgiLAorCQkJUkVHX1JFQUQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUkFXKSwKKwkJCVJFR19SRUFEKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcpKTsKKwkJdGltZV9vdXQgPSAwOworCX0KKworCXJldHVybiB0aW1lX291dDsKK30KKwordm9pZCBhcjkwMDNfbWNpX3JlbW90ZV9yZXNldChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJdTMyIHBheWxvYWRbNF0gPSB7IDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmMDB9OworCisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9SRU1PVEVfUkVTRVQsIDAsIHBheWxvYWQsIDE2LAorCQkJCXdhaXRfZG9uZSwgZmFsc2UpOworCXVkZWxheSg1KTsKK30KKwordm9pZCBhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwl1MzIgcGF5bG9hZCA9IDB4MDAwMDAwMDA7CisKKwlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX0xOQV9UUkFOUywgMCwgJnBheWxvYWQsIDEsCisJCQkJd2FpdF9kb25lLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc2VuZF9yZXFfd2FrZShzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9SRVFfV0FLRSwgTUNJX0ZMQUdfRElTQUJMRV9USU1FU1RBTVAsCisJCQkJTlVMTCwgMCwgd2FpdF9kb25lLCBmYWxzZSk7CisJdWRlbGF5KDUpOworfQorCit2b2lkIGFyOTAwM19tY2lfc2VuZF9zeXNfd2FraW5nKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX1NZU19XQUtJTkcsIE1DSV9GTEFHX0RJU0FCTEVfVElNRVNUQU1QLAorCQkJCU5VTEwsIDAsIHdhaXRfZG9uZSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3NlbmRfbG5hX3Rha2Uoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgd2FpdF9kb25lKQoreworCXUzMiBwYXlsb2FkID0gMHg3MDAwMDAwMDsKKworCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfTE5BX1RBS0UsIDAsICZwYXlsb2FkLCAxLAorCQkJCXdhaXRfZG9uZSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3NlbmRfc3lzX3NsZWVwaW5nKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX1NZU19TTEVFUElORywKKwkJCQlNQ0lfRkxBR19ESVNBQkxFX1RJTUVTVEFNUCwKKwkJCQlOVUxMLCAwLCB3YWl0X2RvbmUsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9zZW5kX2NvZXhfdmVyc2lvbl9xdWVyeShzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJICAgICAgIGJvb2wgd2FpdF9kb25lKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgcGF5bG9hZFs0XSA9IHswLCAwLCAwLCAwfTsKKworCWlmICghbWNpLT5idF92ZXJzaW9uX2tub3duICYmCisJCQkobWNpLT5idF9zdGF0ZSAhPSBNQ0lfQlRfU0xFRVApKSB7CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIENvZXggdmVyc2lvbiBxdWVyeVxuIik7CisJCU1DSV9HUE1fU0VUX1RZUEVfT1BDT0RFKHBheWxvYWQsCisJCQkJTUNJX0dQTV9DT0VYX0FHRU5ULCBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9RVUVSWSk7CisJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwKKwkJCQl3YWl0X2RvbmUsIHRydWUpOworCX0KK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9zZW5kX2NvZXhfdmVyc2lvbl9yZXNwb25zZShzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJCSAgICAgYm9vbCB3YWl0X2RvbmUpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiBwYXlsb2FkWzRdID0gezAsIDAsIDAsIDB9OworCisJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIFNlbmQgQ29leCB2ZXJzaW9uIHJlc3BvbnNlXG4iKTsKKwlNQ0lfR1BNX1NFVF9UWVBFX09QQ09ERShwYXlsb2FkLCBNQ0lfR1BNX0NPRVhfQUdFTlQsCisJCQlNQ0lfR1BNX0NPRVhfVkVSU0lPTl9SRVNQT05TRSk7CisJKigoKHU4ICopcGF5bG9hZCkgKyBNQ0lfR1BNX0NPRVhfQl9NQUpPUl9WRVJTSU9OKSA9CisJCW1jaS0+d2xhbl92ZXJfbWFqb3I7CisJKigoKHU4ICopcGF5bG9hZCkgKyBNQ0lfR1BNX0NPRVhfQl9NSU5PUl9WRVJTSU9OKSA9CisJCW1jaS0+d2xhbl92ZXJfbWlub3I7CisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBheWxvYWQsIDE2LCB3YWl0X2RvbmUsIHRydWUpOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3NlbmRfY29leF93bGFuX2NoYW5uZWxzKHN0cnVjdCBhdGhfaHcgKmFoLAorCQkJCQkJICBib29sIHdhaXRfZG9uZSkKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyICpwYXlsb2FkID0gJm1jaS0+d2xhbl9jaGFubmVsc1swXTsKKworCWlmICgobWNpLT53bGFuX2NoYW5uZWxzX3VwZGF0ZSA9PSB0cnVlKSAmJgorCQkJKG1jaS0+YnRfc3RhdGUgIT0gTUNJX0JUX1NMRUVQKSkgeworCQlNQ0lfR1BNX1NFVF9UWVBFX09QQ09ERShwYXlsb2FkLAorCQlNQ0lfR1BNX0NPRVhfQUdFTlQsIE1DSV9HUE1fQ09FWF9XTEFOX0NIQU5ORUxTKTsKKwkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBheWxvYWQsIDE2LAorCQkJCQl3YWl0X2RvbmUsIHRydWUpOworCQlNQ0lfR1BNX1NFVF9UWVBFX09QQ09ERShwYXlsb2FkLCAweGZmLCAweGZmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc2VuZF9jb2V4X2J0X3N0YXR1c19xdWVyeShzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJCWJvb2wgd2FpdF9kb25lLCB1OCBxdWVyeV90eXBlKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgcGF5bG9hZFs0XSA9IHswLCAwLCAwLCAwfTsKKwlib29sIHF1ZXJ5X2J0aW5mbyA9ICEhKHF1ZXJ5X3R5cGUgJiAoTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0FMTF9JTkZPIHwKKwkJCQkJICAgICBNQ0lfR1BNX0NPRVhfUVVFUllfQlRfVE9QT0xPR1kpKTsKKworCWlmIChtY2ktPmJ0X3N0YXRlICE9IE1DSV9CVF9TTEVFUCkgeworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgU2VuZCBDb2V4IEJUIFN0YXR1cyBRdWVyeSAweCUwMlhcbiIsIHF1ZXJ5X3R5cGUpOworCisJCU1DSV9HUE1fU0VUX1RZUEVfT1BDT0RFKHBheWxvYWQsCisJCQkJTUNJX0dQTV9DT0VYX0FHRU5ULCBNQ0lfR1BNX0NPRVhfU1RBVFVTX1FVRVJZKTsKKworCQkqKCgodTggKilwYXlsb2FkKSArIE1DSV9HUE1fQ09FWF9CX0JUX0JJVE1BUCkgPSBxdWVyeV90eXBlOworCQkvKgorCQkgKiBJZiBidF9zdGF0dXNfcXVlcnkgbWVzc2FnZSBpcyAgbm90IHNlbnQgc3VjY2Vzc2Z1bGx5LAorCQkgKiB0aGVuIG5lZWRfZmx1c2hfYnRpbmZvIHNob3VsZCBiZSBzZXQgYWdhaW4uCisJCSAqLworCQlpZiAoIWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwKKwkJCQkJICAgICB3YWl0X2RvbmUsIHRydWUpKSB7CisJCQlpZiAocXVlcnlfYnRpbmZvKSB7CisJCQkJbWNpLT5uZWVkX2ZsdXNoX2J0aW5mbyA9IHRydWU7CisKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgc2VuZCBidF9zdGF0dXNfcXVlcnkgZmFpbCwgIgorCQkJCQkic2V0IGZsdXNoIGZsYWcgYWdhaW5cbiIpOworCQkJfQorCQl9CisKKwkJaWYgKHF1ZXJ5X2J0aW5mbykKKwkJCW1jaS0+cXVlcnlfYnQgPSBmYWxzZTsKKwl9Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9zZW5kX2NvZXhfaGFsdF9idF9ncG0oc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgaGFsdCwKKwkJCQkgICAgICBib29sIHdhaXRfZG9uZSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIHBheWxvYWRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgU2VuZCBDb2V4ICVzIEJUIEdQTS5cbiIsCisJCShoYWx0KSA/ICJoYWx0IiA6ICJ1bmhhbHQiKTsKKworCU1DSV9HUE1fU0VUX1RZUEVfT1BDT0RFKHBheWxvYWQsCisJCQkJTUNJX0dQTV9DT0VYX0FHRU5ULCBNQ0lfR1BNX0NPRVhfSEFMVF9CVF9HUE0pOworCisJaWYgKGhhbHQpIHsKKwkJbWNpLT5xdWVyeV9idCA9IHRydWU7CisJCS8qIFNlbmQgbmV4dCB1bmhhbHQgbm8gbWF0dGVyIGhhbHQgc2VudCBvciBub3QgKi8KKwkJbWNpLT51bmhhbHRfYnRfZ3BtID0gdHJ1ZTsKKwkJbWNpLT5uZWVkX2ZsdXNoX2J0aW5mbyA9IHRydWU7CisJCSooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfSEFMVF9TVEFURSkgPQorCQkJTUNJX0dQTV9DT0VYX0JUX0dQTV9IQUxUOworCX0gZWxzZQorCQkqKCgodTggKilwYXlsb2FkKSArIE1DSV9HUE1fQ09FWF9CX0hBTFRfU1RBVEUpID0KKwkJCU1DSV9HUE1fQ09FWF9CVF9HUE1fVU5IQUxUOworCisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBheWxvYWQsIDE2LCB3YWl0X2RvbmUsIHRydWUpOworfQorCisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfcHJlcF9pbnRlcmZhY2Uoc3RydWN0IGF0aF9odyAqYWgpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiBzYXZlZF9tY2lfaW50X2VuOworCXUzMiBtY2lfdGltZW91dCA9IDE1MDsKKworCW1jaS0+YnRfc3RhdGUgPSBNQ0lfQlRfU0xFRVA7CisJc2F2ZWRfbWNpX2ludF9lbiA9IFJFR19SRUFEKGFoLCBBUl9NQ0lfSU5URVJSVVBUX0VOKTsKKworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTiwgMCk7CisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCSAgUkVHX1JFQUQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVykpOworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsCisJCSAgUkVHX1JFQUQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUkFXKSk7CisKKwkvKiBSZW1vdGUgUmVzZXQgKi8KKwlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgUmVzZXQgc2VxdWVuY2Ugc3RhcnRcbiIpOworCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBzZW5kIFJFTU9URV9SRVNFVFxuIik7CisJYXI5MDAzX21jaV9yZW1vdGVfcmVzZXQoYWgsIHRydWUpOworCisJLyoKKwkgKiBUaGlzIGRlbGF5IGlzIHJlcXVpcmVkIGZvciB0aGUgcmVzZXQgZGVsYXkgd29yc3QgY2FzZSB2YWx1ZSAyNTUgaW4KKwkgKiBNQ0lfQ09NTUFORDIgcmVnaXN0ZXIKKwkgKi8KKworCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpKQorCQl1ZGVsYXkoMjUyKTsKKworCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIFJFUV9XQUtFIHRvIHJlbW90ZXIoQlQpXG4iKTsKKwlhcjkwMDNfbWNpX3NlbmRfcmVxX3dha2UoYWgsIHRydWUpOworCisJaWYgKGFyOTAwM19tY2lfd2FpdF9mb3JfaW50ZXJydXB0KGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lORywgNTAwKSkgeworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIFNZU19XQUtJTkcgZnJvbSByZW1vdGUoQlQpXG4iKTsKKwkJbWNpLT5idF9zdGF0ZSA9IE1DSV9CVF9BV0FLRTsKKworCQlpZiAoQVJfU1JFVl85NDYyXzEwKGFoKSkKKwkJCXVkZWxheSgxMCk7CisJCS8qCisJCSAqIHdlIGRvbid0IG5lZWQgdG8gc2VuZCBtb3JlIHJlbW90ZV9yZXNldCBhdCB0aGlzIG1vbWVudC4KKwkJICogSWYgQlQgcmVjZWl2ZSBmaXJzdCByZW1vdGVfcmVzZXQsIHRoZW4gQlQgSFcgd2lsbAorCQkgKiBiZSBjbGVhbmVkIHVwIGFuZCB3aWxsIGJlIGFibGUgdG8gcmVjZWl2ZSByZXFfd2FrZQorCQkgKiBhbmQgQlQgSFcgd2lsbCByZXNwb25kIHN5c193YWtpbmcuCisJCSAqIEluIHRoaXMgY2FzZSwgV0xBTiB3aWxsIHJlY2VpdmUgQlQncyBIVyBzeXNfd2FraW5nLgorCQkgKiBPdGhlcndpc2UsIGlmIEJUIFNXIG1pc3NlZCBpbml0aWFsIHJlbW90ZV9yZXNldCwKKwkJICogdGhhdCByZW1vdGVfcmVzZXQgd2lsbCBzdGlsbCBjbGVhbiB1cCBCVCBNQ0kgUlgsCisJCSAqIGFuZCB0aGUgcmVxX3dha2Ugd2lsbCB3YWtlIEJUIHVwLAorCQkgKiBhbmQgQlQgU1cgd2lsbCByZXNwb25kIHRoaXMgcmVxX3dha2Ugd2l0aCBhIHJlbW90ZV9yZXNldCBhbmQKKwkJICogc3lzX3dha2luZy4gSW4gdGhpcyBjYXNlLCBXTEFOIHdpbGwgcmVjZWl2ZSBCVCdzIFNXCisJCSAqIHN5c193YWtpbmcuIEluIGVpdGhlciBjYXNlLCBCVCdzIFJYIGlzIGNsZWFuZWQgdXAuIFNvIHdlCisJCSAqIGRvbid0IG5lZWQgdG8gcmVwbHkgQlQncyByZW1vdGVfcmVzZXQgbm93LCBpZiBhbnkuCisJCSAqIFNpbWlsYXJseSwgaWYgaW4gYW55IGNhc2UsIFdMQU4gY2FuIHJlY2VpdmUgQlQncyBzeXNfd2FraW5nLAorCQkgKiB0aGF0IG1lYW5zIFdMQU4ncyBSWCBpcyBhbHNvIGZpbmUuCisJCSAqLworCisJCS8qIFNlbmQgU1lTX1dBS0lORyB0byBCVCAqLworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgc2VuZCBTVyBTWVNfV0FLSU5HIHRvIHJlbW90ZSBCVFxuIik7CisKKwkJYXI5MDAzX21jaV9zZW5kX3N5c193YWtpbmcoYWgsIHRydWUpOworCQl1ZGVsYXkoMTApOworCisJCS8qCisJCSAqIFNldCBCVCBwcmlvcml0eSBpbnRlcnJ1cHQgdmFsdWUgdG8gYmUgMHhmZiB0bworCQkgKiBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgQlQgUFJJT1JJVFkgaW50ZXJydXB0cy4KKwkJICovCisKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQlRfUFJJMCwgMHhGRkZGRkZGRik7CisJCVJFR19XUklURShhaCwgQVJfTUNJX0JUX1BSSTEsIDB4RkZGRkZGRkYpOworCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9CVF9QUkkyLCAweEZGRkZGRkZGKTsKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQlRfUFJJMywgMHhGRkZGRkZGRik7CisJCVJFR19XUklURShhaCwgQVJfTUNJX0JUX1BSSSwgMFgwMDAwMDBGRik7CisKKwkJLyoKKwkJICogQSBjb250ZW50aW9uIHJlc2V0IHdpbGwgYmUgcmVjZWl2ZWQgYWZ0ZXIgc2VuZCBvdXQKKwkJICogc3lzX3dha2luZy4gQWxzbyBCVCBwcmlvcml0eSBpbnRlcnJ1cHQgYml0cyB3aWxsIGJlIHNldC4KKwkJICogQ2xlYXIgdGhvc2UgYml0cyBiZWZvcmUgdGhlIG5leHQgc3RlcC4KKwkJICovCisKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUKTsKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywKKwkJCSAgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUkkpOworCisJCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpIHx8IG1jaS0+aXNfMmcpIHsKKwkJCS8qIFNlbmQgTE5BX1RSQU5TICovCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBzZW5kIExOQV9UUkFOUyB0byBCVFxuIik7CisJCQlhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKGFoLCB0cnVlKTsKKwkJCXVkZWxheSg1KTsKKwkJfQorCisJCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpIHx8IChtY2ktPmlzXzJnICYmCisJCQkJCSAgICAhbWNpLT51cGRhdGVfMmc1ZykpIHsKKwkJCWlmIChhcjkwMDNfbWNpX3dhaXRfZm9yX2ludGVycnVwdChhaCwKKwkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0lORk8sCisJCQkJbWNpX3RpbWVvdXQpKQorCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSBXTEFOIGhhcyBjb250cm9sIG92ZXIgdGhlIExOQSAmICIKKwkJCQkJIkJUIG9iZXlzIGl0XG4iKTsKKwkJCWVsc2UKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgQlQgZGlkbid0IHJlc3BvbmQgdG8iCisJCQkJCSJMTkFfVFJBTlNcbiIpOworCQl9CisKKwkJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkpIHsKKwkJCS8qIFNlbmQgYW5vdGhlciByZW1vdGVfcmVzZXQgdG8gZGVhc3NlcnQgQlQgY2xrX3JlcS4gKi8KKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIGFub3RoZXIgcmVtb3RlX3Jlc2V0IHRvICIKKwkJCQkiZGVhc3NlcnQgY2xrX3JlcVxuIik7CisJCQlhcjkwMDNfbWNpX3JlbW90ZV9yZXNldChhaCwgdHJ1ZSk7CisJCQl1ZGVsYXkoMjUyKTsKKwkJfQorCX0KKworCS8qIENsZWFyIHRoZSBleHRyYSByZWR1bmRhbnQgU1lTX1dBS0lORyBmcm9tIEJUICovCisJaWYgKChtY2ktPmJ0X3N0YXRlID09IE1DSV9CVF9BV0FLRSkgJiYKKwkJKFJFR19SRUFEX0ZJRUxEKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lORykpICYmCisJCShSRUdfUkVBRF9GSUVMRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXLAorCQkJCUFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElORykgPT0gMCkpIHsKKworCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HKTsKKwkJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsCisJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JFTU9URV9TTEVFUF9VUERBVEUpOworCX0KKworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTiwgc2F2ZWRfbWNpX2ludF9lbik7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfRU4sIDApOworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfRU4sIDApOworfQorCit2b2lkIGFyOTAwM19tY2lfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTiwgQVJfTUNJX0lOVEVSUlVQVF9ERUZBVUxUKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0VOLAorCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0RFRkFVTFQpOworfQorCitib29sIGFyOTAwM19tY2lfY2hlY2tfaW50KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgaW50cykKK3sKKwl1MzIgaW50cjsKKworCWludHIgPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXKTsKKwlyZXR1cm4gKChpbnRyICYgaW50cykgPT0gaW50cyk7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9nZXRfaW50ZXJydXB0KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgKnJhd19pbnRyLAorCQkJICAgICAgdTMyICpyeF9tc2dfaW50cikKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJKnJhd19pbnRyID0gbWNpLT5yYXdfaW50cjsKKwkqcnhfbXNnX2ludHIgPSBtY2ktPnJ4X21zZ19pbnRyOworCisJLyogQ2xlYW4gaW50IGJpdHMgYWZ0ZXIgdGhlIHZhbHVlcyBhcmUgcmVhZC4gKi8KKwltY2ktPnJhd19pbnRyID0gMDsKKwltY2ktPnJ4X21zZ19pbnRyID0gMDsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX21jaV9nZXRfaW50ZXJydXB0KTsKKwordm9pZCBhcjkwMDNfbWNpXzJnNWdfY2hhbmdlZChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBpc18yZykKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisKKwlpZiAoIW1jaS0+dXBkYXRlXzJnNWcgJiYKKwkgICAgKG1jaS0+aXNfMmcgIT0gaXNfMmcpKQorCQltY2ktPnVwZGF0ZV8yZzVnID0gdHJ1ZTsKKworCW1jaS0+aXNfMmcgPSBpc18yZzsKK30KKworc3RhdGljIGJvb2wgYXI5MDAzX21jaV9pc19ncG1fdmFsaWQoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBtc2dfaW5kZXgpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiAqcGF5bG9hZDsKKwl1MzIgcmVjdl90eXBlLCBvZmZzZXQ7CisKKwlpZiAobXNnX2luZGV4ID09IE1DSV9HUE1fSU5WQUxJRCkKKwkJcmV0dXJuIGZhbHNlOworCisJb2Zmc2V0ID0gbXNnX2luZGV4IDw8IDQ7CisKKwlwYXlsb2FkID0gKHUzMiAqKShtY2ktPmdwbV9idWYgKyBvZmZzZXQpOworCXJlY3ZfdHlwZSA9IE1DSV9HUE1fVFlQRShwYXlsb2FkKTsKKworCWlmIChyZWN2X3R5cGUgPT0gTUNJX0dQTV9SU1ZEX1BBVFRFUk4pIHsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIFNraXAgUlNWRCBHUE1cbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfb2JzZXJ2YXRpb25fc2V0X3VwKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwlpZiAobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01DSSkgeworCisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDMsCisJCQkJCUFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfV0xBTl9EQVRBKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMiwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9XTEFOX0NMSyk7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDEsIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfQlRfREFUQSk7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDAsIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfQlRfQ0xLKTsKKworCX0gZWxzZSBpZiAobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX1RYUlgpIHsKKworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAzLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfV0xfSU5fVFgpOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAyLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfV0xfSU5fUlgpOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAxLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfQlRfSU5fVFgpOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAwLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfQlRfSU5fUlgpOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCA1LCBBUl9HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVUKTsKKworCX0gZWxzZSBpZiAobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0JUKSB7CisKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMywgQVJfR1BJT19PVVRQVVRfTVVYX0FTX0JUX0lOX1RYKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMiwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX0JUX0lOX1JYKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMSwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9CVF9EQVRBKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMCwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9CVF9DTEspOworCisJfSBlbHNlCisJCXJldHVybjsKKworCVJFR19TRVRfQklUKGFoLCBBUl9HUElPX0lOUFVUX0VOX1ZBTCwgQVJfR1BJT19KVEFHX0RJU0FCTEUpOworCisJaWYgKEFSX1NSRVZfOTQ2Ml8yMF9PUl9MQVRFUihhaCkpIHsKKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX0dMQl9DT05UUk9MLAorCQkJICAgICAgQVJfR0xCX0RTX0pUQUdfRElTQUJMRSwgMSk7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9HTEJfQ09OVFJPTCwKKwkJCSAgICAgIEFSX0dMQl9XTEFOX1VBUlRfSU5URl9FTiwgMCk7CisJCVJFR19TRVRfQklUKGFoLCBBUl9HTEJfR1BJT19DT05UUk9MLAorCQkJICAgIEFUSF9NQ0lfQ09ORklHX01DSV9PQlNfR1BJTyk7CisJfQorCisJUkVHX1JNV19GSUVMRChhaCwgQVJfQlRDT0VYX0NUUkwyLCBBUl9CVENPRVhfQ1RSTDJfR1BJT19PQlNfU0VMLCAwKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9CVENPRVhfQ1RSTDIsIEFSX0JUQ09FWF9DVFJMMl9NQUNfQkJfT0JTX1NFTCwgMSk7CisJUkVHX1dSSVRFKGFoLCBBUl9PQlMsIDB4NGIpOworCVJFR19STVdfRklFTEQoYWgsIEFSX0RJQUdfU1csIEFSX0RJQUdfT0JTX1BUX1NFTDEsIDB4MDMpOworCVJFR19STVdfRklFTEQoYWgsIEFSX0RJQUdfU1csIEFSX0RJQUdfT0JTX1BUX1NFTDIsIDB4MDEpOworCVJFR19STVdfRklFTEQoYWgsIEFSX01BQ01JU0MsIEFSX01BQ01JU0NfTUlTQ19PQlNfQlVTX0xTQiwgMHgwMik7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfTUFDTUlTQywgQVJfTUFDTUlTQ19NSVNDX09CU19CVVNfTVNCLCAweDAzKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfVEVTVF9DVExfU1RBVFVTLAorCQkgICAgICBBUl9QSFlfVEVTVF9DVExfREVCVUdQT1JUX1NFTCwgMHgwNyk7Cit9CisKK3N0YXRpYyBib29sIGFyOTAwM19tY2lfc2VuZF9jb2V4X2J0X2ZsYWdzKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSwKKwkJCQkJCXU4IG9wY29kZSwgdTMyIGJ0X2ZsYWdzKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXUzMiBwbGRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwlNQ0lfR1BNX1NFVF9UWVBFX09QQ09ERShwbGQsCisJCQlNQ0lfR1BNX0NPRVhfQUdFTlQsIE1DSV9HUE1fQ09FWF9CVF9VUERBVEVfRkxBR1MpOworCisJKigoKHU4ICopcGxkKSArIE1DSV9HUE1fQ09FWF9CX0JUX0ZMQUdTX09QKSAgPSBvcGNvZGU7CisJKigoKHU4ICopcGxkKSArIE1DSV9HUE1fQ09FWF9XX0JUX0ZMQUdTICsgMCkgPSBidF9mbGFncyAmIDB4RkY7CisJKigoKHU4ICopcGxkKSArIE1DSV9HUE1fQ09FWF9XX0JUX0ZMQUdTICsgMSkgPSAoYnRfZmxhZ3MgPj4gOCkgJiAweEZGOworCSooKCh1OCAqKXBsZCkgKyBNQ0lfR1BNX0NPRVhfV19CVF9GTEFHUyArIDIpID0gKGJ0X2ZsYWdzID4+IDE2KSAmIDB4RkY7CisJKigoKHU4ICopcGxkKSArIE1DSV9HUE1fQ09FWF9XX0JUX0ZMQUdTICsgMykgPSAoYnRfZmxhZ3MgPj4gMjQpICYgMHhGRjsKKworCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJIk1DSSBCVF9NQ0lfRkxBR1M6IFNlbmQgQ29leCBCVCBVcGRhdGUgRmxhZ3MgJXMgMHglMDh4XG4iLAorCQkob3Bjb2RlID09IE1DSV9HUE1fQ09FWF9CVF9GTEFHU19SRUFEKSA/ICJSRUFEIiA6CisJCSgob3Bjb2RlID09IE1DSV9HUE1fQ09FWF9CVF9GTEFHU19TRVQpID8gIlNFVCIgOiAiQ0xFQVIiKSwKKwkJCQkJCQkJYnRfZmxhZ3MpOworCisJcmV0dXJuIGFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwbGQsIDE2LAorCQkJCQkJCXdhaXRfZG9uZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9yZXNldChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBlbl9pbnQsIGJvb2wgaXNfMmcsCisJCSAgICAgIGJvb2wgaXNfZnVsbF9zbGVlcCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIHJlZ3ZhbCwgdGhyZXNoOworCisJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIGZ1bGxfc2xlZXAgPSAlZCwgaXNfMmcgPSAlZFxuIiwKKwkJaXNfZnVsbF9zbGVlcCwgaXNfMmcpOworCisJLyoKKwkgKiBHUE0gYnVmZmVyIGFuZCBzY2hlZHVsaW5nIG1lc3NhZ2UgYnVmZmVyIGFyZSBub3QgYWxsb2NhdGVkCisJICovCisKKwlpZiAoIW1jaS0+Z3BtX2FkZHIgJiYgIW1jaS0+c2NoZWRfYWRkcikgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIEdQTSBhbmQgc2NoZWR1bGUgYnVmZmVycyBhcmUgbm90IGFsbG9jYXRlZCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKFJFR19SRUFEKGFoLCBBUl9CVENPRVhfQ1RSTCkgPT0gMHhkZWFkYmVlZikgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIGl0J3MgZGVhZGJlZWYsIHF1aXQgbWNpX3Jlc2V0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFByb2dyYW0gTUNJIERNQSByZWxhdGVkIHJlZ2lzdGVycyAqLworCVJFR19XUklURShhaCwgQVJfTUNJX0dQTV8wLCBtY2ktPmdwbV9hZGRyKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9HUE1fMSwgbWNpLT5ncG1fbGVuKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9TQ0hEX1RBQkxFXzAsIG1jaS0+c2NoZWRfYWRkcik7CisKKwkvKgorCSogVG8gYXZvaWQgTUNJIHN0YXRlIG1hY2hpbmUgYmUgYWZmZWN0ZWQgYnkgaW5jb21pbmcgcmVtb3RlIE1DSSBtc2dzLAorCSogTUNJIG1vZGUgd2lsbCBiZSBlbmFibGVkIGxhdGVyLCByaWdodCBiZWZvcmUgcmVzZXQgdGhlIE1DSSBUWCBhbmQgUlguCisJKi8KKworCXJlZ3ZhbCA9IFNNKDEsIEFSX0JUQ09FWF9DVFJMX0FSOTQ2Ml9NT0RFKSB8CisJCSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9XQlRJTUVSX0VOKSB8CisJCSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9QQV9TSEFSRUQpIHwKKwkJIFNNKDEsIEFSX0JUQ09FWF9DVFJMX0xOQV9TSEFSRUQpIHwKKwkJIFNNKDIsIEFSX0JUQ09FWF9DVFJMX05VTV9BTlRFTk5BUykgfAorCQkgU00oMywgQVJfQlRDT0VYX0NUUkxfUlhfQ0hBSU5fTUFTSykgfAorCQkgU00oMCwgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9BQ0spIHwKKwkJIFNNKDAsIEFSX0JUQ09FWF9DVFJMXzFfQ0hBSU5fQkNOKSB8CisJCSBTTSgwLCBBUl9CVENPRVhfQ1RSTF9PTkVfU1RFUF9MT09LX0FIRUFEX0VOKTsKKworCWlmIChpc18yZyAmJiAoQVJfU1JFVl85NDYyXzIwKGFoKSkgJiYKKwkJIShtY2ktPmNvbmZpZyAmIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfT1NMQSkpIHsKKworCQlyZWd2YWwgfD0gU00oMSwgQVJfQlRDT0VYX0NUUkxfT05FX1NURVBfTE9PS19BSEVBRF9FTik7CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIHNjaGVkIG9uZSBzdGVwIGxvb2sgYWhlYWRcbiIpOworCisJCWlmICghKG1jaS0+Y29uZmlnICYKKwkJICAgICAgQVRIX01DSV9DT05GSUdfRElTQUJMRV9BR0dSX1RIUkVTSCkpIHsKKworCQkJdGhyZXNoID0gTVMobWNpLT5jb25maWcsCisJCQkJICAgIEFUSF9NQ0lfQ09ORklHX0FHR1JfVEhSRVNIKTsKKwkJCXRocmVzaCAmPSA3OworCQkJcmVndmFsIHw9IFNNKDEsCisJCQkJICAgICBBUl9CVENPRVhfQ1RSTF9USU1FX1RPX05FWFRfQlRfVEhSRVNIX0VOKTsKKwkJCXJlZ3ZhbCB8PSBTTSh0aHJlc2gsIEFSX0JUQ09FWF9DVFJMX0FHR1JfVEhSRVNIKTsKKworCQkJUkVHX1JNV19GSUVMRChhaCwgQVJfTUNJX1NDSERfVEFCTEVfMiwKKwkJCQkgICAgICBBUl9NQ0lfU0NIRF9UQUJMRV8yX0hXX0JBU0VELCAxKTsKKwkJCVJFR19STVdfRklFTEQoYWgsIEFSX01DSV9TQ0hEX1RBQkxFXzIsCisJCQkJICAgICAgQVJfTUNJX1NDSERfVEFCTEVfMl9NRU1fQkFTRUQsIDEpOworCisJCX0gZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgc2NoZWQgYWdnciB0aHJlc2g6IG9mZlxuIik7CisJfSBlbHNlCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgU0NIRUQgb25lIHN0ZXAgbG9vayBhaGVhZCBvZmZcbiIpOworCisJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkpCisJCXJlZ3ZhbCB8PSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRV8xMCk7CisKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9DVFJMLCByZWd2YWwpOworCisJaWYgKEFSX1NSRVZfOTQ2Ml8yMChhaCkpIHsKKwkJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9HTEJfQ09OVFJPTCwKKwkJCSAgICBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRSk7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX0JUQ09FWF9DVFJMMywKKwkJCSAgICAgIEFSX0JUQ09FWF9DVFJMM19DT05UX0lORk9fVElNRU9VVCwgMjApOworCX0KKworCVJFR19STVdfRklFTEQoYWgsIEFSX0JUQ09FWF9DVFJMMiwgQVJfQlRDT0VYX0NUUkwyX1JYX0RFV0VJR0hULCAxKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QQ1VfTUlTQywgQVJfUENVX0JUX0FOVF9QUkVWRU5UX1JYLCAwKTsKKworCXRocmVzaCA9IE1TKG1jaS0+Y29uZmlnLCBBVEhfTUNJX0NPTkZJR19DTEtfRElWKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfVFhfQ1RSTCwgQVJfTUNJX1RYX0NUUkxfQ0xLX0RJViwgdGhyZXNoKTsKKwlSRUdfU0VUX0JJVChhaCwgQVJfQlRDT0VYX0NUUkwsIEFSX0JUQ09FWF9DVFJMX01DSV9NT0RFX0VOKTsKKworCS8qIFJlc2V0dGluZyB0aGUgUnggYW5kIFR4IHBhdGhzIG9mIE1DSSAqLworCXJlZ3ZhbCA9IFJFR19SRUFEKGFoLCBBUl9NQ0lfQ09NTUFORDIpOworCXJlZ3ZhbCB8PSBTTSgxLCBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFgpOworCVJFR19XUklURShhaCwgQVJfTUNJX0NPTU1BTkQyLCByZWd2YWwpOworCisJdWRlbGF5KDEpOworCisJcmVndmFsICY9IH5TTSgxLCBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFgpOworCVJFR19XUklURShhaCwgQVJfTUNJX0NPTU1BTkQyLCByZWd2YWwpOworCisJaWYgKGlzX2Z1bGxfc2xlZXApIHsKKwkJYXI5MDAzX21jaV9tdXRlX2J0KGFoKTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCisJcmVndmFsIHw9IFNNKDEsIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWCk7CisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQ09NTUFORDIsIHJlZ3ZhbCk7CisJdWRlbGF5KDEpOworCXJlZ3ZhbCAmPSB+U00oMSwgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JYKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9DT01NQU5EMiwgcmVndmFsKTsKKworCWFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9JTklUX0dQTV9PRkZTRVQsIE5VTEwpOworCVJFR19XUklURShhaCwgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFLAorCQkgIChTTSgweGU4MDEsIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9JTlZBTElEX0hEUikgfAorCQkgICBTTSgweDAwMDAsIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9DSEVDS1NVTSkpKTsKKworCVJFR19DTFJfQklUKGFoLCBBUl9NQ0lfVFhfQ1RSTCwKKwkJCUFSX01DSV9UWF9DVFJMX0RJU0FCTEVfTE5BX1VQREFURSk7CisKKwlpZiAoQVJfU1JFVl85NDYyXzIwX09SX0xBVEVSKGFoKSkKKwkJYXI5MDAzX21jaV9vYnNlcnZhdGlvbl9zZXRfdXAoYWgpOworCisJbWNpLT5yZWFkeSA9IHRydWU7CisJYXI5MDAzX21jaV9wcmVwX2ludGVyZmFjZShhaCk7CisKKwlpZiAoZW5faW50KQorCQlhcjkwMDNfbWNpX2VuYWJsZV9pbnRlcnJ1cHQoYWgpOworfQorCit2b2lkIGFyOTAwM19tY2lfbXV0ZV9idChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKworCS8qIGRpc2FibGUgYWxsIE1DSSBtZXNzYWdlcyAqLworCVJFR19XUklURShhaCwgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFLCAweGZmZmYwMDAwKTsKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9XTF9XRUlHSFRTMCwgMHhmZmZmZmZmZik7CisJUkVHX1dSSVRFKGFoLCBBUl9CVENPRVhfV0xfV0VJR0hUUzEsIDB4ZmZmZmZmZmYpOworCVJFR19XUklURShhaCwgQVJfQlRDT0VYX1dMX1dFSUdIVFMyLCAweGZmZmZmZmZmKTsKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9XTF9XRUlHSFRTMywgMHhmZmZmZmZmZik7CisJUkVHX1NFVF9CSVQoYWgsIEFSX01DSV9UWF9DVFJMLCBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEUpOworCisJLyogd2FpdCBwZW5kaW5nIEhXIG1lc3NhZ2VzIHRvIGZsdXNoIG91dCAqLworCXVkZWxheSgxMCk7CisKKwkvKgorCSAqIFNlbmQgTE5BX1RBS0UgYW5kIFNZU19TTEVFUElORyB3aGVuCisJICogMS4gcmVzZXQgbm90IGFmdGVyIHJlc3VtaW5nIGZyb20gZnVsbCBzbGVlcAorCSAqIDIuIGJlZm9yZSByZXNldCBNQ0kgUlgsIHRvIHF1aWV0IEJUIGFuZCBhdm9pZCBNQ0kgUlggbWlzYWxpZ25tZW50CisJICovCisKKwlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgU2VuZCBMTkEgdGFrZVxuIik7CisJYXI5MDAzX21jaV9zZW5kX2xuYV90YWtlKGFoLCB0cnVlKTsKKworCXVkZWxheSg1KTsKKworCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIHN5cyBzbGVlcGluZ1xuIik7CisJYXI5MDAzX21jaV9zZW5kX3N5c19zbGVlcGluZyhhaCwgdHJ1ZSk7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9zeW5jX2J0X3N0YXRlKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgY3VyX2J0X3N0YXRlOworCisJY3VyX2J0X3N0YXRlID0gYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX1JFTU9URV9TTEVFUCwgTlVMTCk7CisKKwlpZiAobWNpLT5idF9zdGF0ZSAhPSBjdXJfYnRfc3RhdGUpIHsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBCVCBzdGF0ZSBtaXNtYXRjaGVzLiBvbGQ6ICVkLCBuZXc6ICVkXG4iLAorCQkJbWNpLT5idF9zdGF0ZSwgY3VyX2J0X3N0YXRlKTsKKwkJbWNpLT5idF9zdGF0ZSA9IGN1cl9idF9zdGF0ZTsKKwl9CisKKwlpZiAobWNpLT5idF9zdGF0ZSAhPSBNQ0lfQlRfU0xFRVApIHsKKworCQlhcjkwMDNfbWNpX3NlbmRfY29leF92ZXJzaW9uX3F1ZXJ5KGFoLCB0cnVlKTsKKwkJYXI5MDAzX21jaV9zZW5kX2NvZXhfd2xhbl9jaGFubmVscyhhaCwgdHJ1ZSk7CisKKwkJaWYgKG1jaS0+dW5oYWx0X2J0X2dwbSA9PSB0cnVlKSB7CisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgdW5oYWx0IEJUIEdQTSIpOworCQkJYXI5MDAzX21jaV9zZW5kX2NvZXhfaGFsdF9idF9ncG0oYWgsIGZhbHNlLCB0cnVlKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9zZW5kXzJnNWdfc3RhdHVzKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIG5ld19mbGFncywgdG9fc2V0LCB0b19jbGVhcjsKKworCWlmIChBUl9TUkVWXzk0NjJfMjAoYWgpICYmCisJICAgIG1jaS0+dXBkYXRlXzJnNWcgJiYKKwkgICAgKG1jaS0+YnRfc3RhdGUgIT0gTUNJX0JUX1NMRUVQKSkgeworCisJCWlmIChtY2ktPmlzXzJnKSB7CisJCQluZXdfZmxhZ3MgPSBNQ0lfMkdfRkxBR1M7CisJCQl0b19jbGVhciA9IE1DSV8yR19GTEFHU19DTEVBUl9NQVNLOworCQkJdG9fc2V0ID0gTUNJXzJHX0ZMQUdTX1NFVF9NQVNLOworCQl9IGVsc2UgeworCQkJbmV3X2ZsYWdzID0gTUNJXzVHX0ZMQUdTOworCQkJdG9fY2xlYXIgPSBNQ0lfNUdfRkxBR1NfQ0xFQVJfTUFTSzsKKwkJCXRvX3NldCA9IE1DSV81R19GTEFHU19TRVRfTUFTSzsKKwkJfQorCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgQlRfTUNJX0ZMQUdTOiAlcyAweCUwOHggY2xyPTB4JTA4eCwgc2V0PTB4JTA4eFxuIiwKKwkJbWNpLT5pc18yZyA/ICIyRyIgOiAiNUciLCBuZXdfZmxhZ3MsIHRvX2NsZWFyLCB0b19zZXQpOworCisJCWlmICh0b19jbGVhcikKKwkJCWFyOTAwM19tY2lfc2VuZF9jb2V4X2J0X2ZsYWdzKGFoLCB3YWl0X2RvbmUsCisJCQkJCU1DSV9HUE1fQ09FWF9CVF9GTEFHU19DTEVBUiwgdG9fY2xlYXIpOworCisJCWlmICh0b19zZXQpCisJCQlhcjkwMDNfbWNpX3NlbmRfY29leF9idF9mbGFncyhhaCwgd2FpdF9kb25lLAorCQkJCQlNQ0lfR1BNX0NPRVhfQlRfRkxBR1NfU0VULCB0b19zZXQpOworCX0KKworCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpICYmIChtY2ktPmJ0X3N0YXRlICE9IE1DSV9CVF9TTEVFUCkpCisJCW1jaS0+dXBkYXRlXzJnNWcgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9xdWV1ZV91bnNlbnRfZ3BtKHN0cnVjdCBhdGhfaHcgKmFoLCB1OCBoZWFkZXIsCisJCQkJCXUzMiAqcGF5bG9hZCwgYm9vbCBxdWV1ZSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTggdHlwZSwgb3Bjb2RlOworCisJaWYgKHF1ZXVlKSB7CisKKwkJaWYgKHBheWxvYWQpCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBFUlJPUjogU2VuZCBmYWlsOiAlMDJ4OiAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQloZWFkZXIsCisJCQkJKigoKHU4ICopcGF5bG9hZCkgKyA0KSwKKwkJCQkqKCgodTggKilwYXlsb2FkKSArIDUpLAorCQkJCSooKCh1OCAqKXBheWxvYWQpICsgNikpOworCQllbHNlCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBFUlJPUjogU2VuZCBmYWlsOiAlMDJ4XG4iLCBoZWFkZXIpOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBtZXNzYWdlIGlzIHRvIGJlIHF1ZXVlZCAqLworCWlmIChoZWFkZXIgIT0gTUNJX0dQTSkKKwkJcmV0dXJuOworCisJdHlwZSA9IE1DSV9HUE1fVFlQRShwYXlsb2FkKTsKKwlvcGNvZGUgPSBNQ0lfR1BNX09QQ09ERShwYXlsb2FkKTsKKworCWlmICh0eXBlICE9IE1DSV9HUE1fQ09FWF9BR0VOVCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIE1DSV9HUE1fQ09FWF9CVF9VUERBVEVfRkxBR1M6CisKKwkJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkpCisJCQlicmVhazsKKworCQlpZiAoKigoKHU4ICopcGF5bG9hZCkgKyBNQ0lfR1BNX0NPRVhfQl9CVF9GTEFHU19PUCkgPT0KKwkJCQlNQ0lfR1BNX0NPRVhfQlRfRkxBR1NfUkVBRCkKKwkJCWJyZWFrOworCisJCW1jaS0+dXBkYXRlXzJnNWcgPSBxdWV1ZTsKKworCQlpZiAocXVldWUpCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBCVF9NQ0lfRkxBR1M6IDJHNUcgc3RhdHVzIDxxdWV1ZWQ+ICVzLlxuIiwKKwkJCQltY2ktPmlzXzJnID8gIjJHIiA6ICI1RyIpOworCQllbHNlCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBCVF9NQ0lfRkxBR1M6IDJHNUcgc3RhdHVzIDxzZW50PiAlcy5cbiIsCisJCQkJbWNpLT5pc18yZyA/ICIyRyIgOiAiNUciKTsKKworCQlicmVhazsKKworCWNhc2UgTUNJX0dQTV9DT0VYX1dMQU5fQ0hBTk5FTFM6CisKKwkJbWNpLT53bGFuX2NoYW5uZWxzX3VwZGF0ZSA9IHF1ZXVlOworCQlpZiAocXVldWUpCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBXTEFOIGNoYW5uZWwgbWFwIDxxdWV1ZWQ+XG4iKTsKKwkJZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgV0xBTiBjaGFubmVsIG1hcCA8c2VudD5cbiIpOworCQlicmVhazsKKworCWNhc2UgTUNJX0dQTV9DT0VYX0hBTFRfQlRfR1BNOgorCisJCWlmICgqKCgodTggKilwYXlsb2FkKSArIE1DSV9HUE1fQ09FWF9CX0hBTFRfU1RBVEUpID09CisJCQkJTUNJX0dQTV9DT0VYX0JUX0dQTV9VTkhBTFQpIHsKKworCQkJbWNpLT51bmhhbHRfYnRfZ3BtID0gcXVldWU7CisKKwkJCWlmIChxdWV1ZSkKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgVU5IQUxUIEJUIEdQTSA8cXVldWVkPlxuIik7CisJCQllbHNlIHsKKwkJCQltY2ktPmhhbHRlZF9idF9ncG0gPSBmYWxzZTsKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgVU5IQUxUIEJUIEdQTSA8c2VudD5cbiIpOworCQkJfQorCQl9CisKKwkJaWYgKCooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfSEFMVF9TVEFURSkgPT0KKwkJCQlNQ0lfR1BNX0NPRVhfQlRfR1BNX0hBTFQpIHsKKworCQkJbWNpLT5oYWx0ZWRfYnRfZ3BtID0gIXF1ZXVlOworCisJCQlpZiAocXVldWUpCisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkiTUNJIEhBTFQgQlQgR1BNIDxub3Qgc2VudD5cbiIpOworCQkJZWxzZQorCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSBVTkhBTFQgQlQgR1BNIDxzZW50PlxuIik7CisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgYXI5MDAzX21jaV8yZzVnX3N3aXRjaChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCisJaWYgKG1jaS0+dXBkYXRlXzJnNWcpIHsKKwkJaWYgKG1jaS0+aXNfMmcpIHsKKworCQkJYXI5MDAzX21jaV9zZW5kXzJnNWdfc3RhdHVzKGFoLCB0cnVlKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIExOQSB0cmFuc1xuIik7CisJCQlhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKGFoLCB0cnVlKTsKKwkJCXVkZWxheSg1KTsKKworCQkJUkVHX0NMUl9CSVQoYWgsIEFSX01DSV9UWF9DVFJMLAorCQkJCSAgICBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEUpOworCisJCQlpZiAoQVJfU1JFVl85NDYyXzIwKGFoKSkgeworCQkJCVJFR19DTFJfQklUKGFoLCBBUl9QSFlfR0xCX0NPTlRST0wsCisJCQkJCSAgICBBUl9CVENPRVhfQ1RSTF9CVF9PV05fU1BEVF9DVFJMKTsKKwkJCQlpZiAoIShtY2ktPmNvbmZpZyAmCisJCQkJICAgICAgQVRIX01DSV9DT05GSUdfRElTQUJMRV9PU0xBKSkgeworCQkJCQlSRUdfU0VUX0JJVChhaCwgQVJfQlRDT0VYX0NUUkwsCisJCQkJCUFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU4pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIExOQSB0YWtlXG4iKTsKKwkJCWFyOTAwM19tY2lfc2VuZF9sbmFfdGFrZShhaCwgdHJ1ZSk7CisJCQl1ZGVsYXkoNSk7CisKKwkJCVJFR19TRVRfQklUKGFoLCBBUl9NQ0lfVFhfQ1RSTCwKKwkJCQkgICAgQVJfTUNJX1RYX0NUUkxfRElTQUJMRV9MTkFfVVBEQVRFKTsKKworCQkJaWYgKEFSX1NSRVZfOTQ2Ml8yMChhaCkpIHsKKwkJCQlSRUdfU0VUX0JJVChhaCwgQVJfUEhZX0dMQl9DT05UUk9MLAorCQkJCQkgICAgQVJfQlRDT0VYX0NUUkxfQlRfT1dOX1NQRFRfQ1RSTCk7CisJCQkJUkVHX0NMUl9CSVQoYWgsIEFSX0JUQ09FWF9DVFJMLAorCQkJCQlBUl9CVENPRVhfQ1RSTF9PTkVfU1RFUF9MT09LX0FIRUFEX0VOKTsKKwkJCX0KKworCQkJYXI5MDAzX21jaV9zZW5kXzJnNWdfc3RhdHVzKGFoLCB0cnVlKTsKKwkJfQorCX0KK30KKworYm9vbCBhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShzdHJ1Y3QgYXRoX2h3ICphaCwgdTggaGVhZGVyLCB1MzIgZmxhZywKKwkJCSAgICAgdTMyICpwYXlsb2FkLCB1OCBsZW4sIGJvb2wgd2FpdF9kb25lLAorCQkJICAgICBib29sIGNoZWNrX2J0KQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwlib29sIG1zZ19zZW50ID0gZmFsc2U7CisJdTMyIHJlZ3ZhbDsKKwl1MzIgc2F2ZWRfbWNpX2ludF9lbjsKKwlpbnQgaTsKKworCXNhdmVkX21jaV9pbnRfZW4gPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTik7CisJcmVndmFsID0gUkVHX1JFQUQoYWgsIEFSX0JUQ09FWF9DVFJMKTsKKworCWlmICgocmVndmFsID09IDB4ZGVhZGJlZWYpIHx8ICEocmVndmFsICYgQVJfQlRDT0VYX0NUUkxfTUNJX01PREVfRU4pKSB7CisKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBOb3Qgc2VuZGluZyAweCV4LiBNQ0kgaXMgbm90IGVuYWJsZWQuICIKKwkJCSJmdWxsX3NsZWVwID0gJWRcbiIsIGhlYWRlciwKKwkJCShhaC0+cG93ZXJfbW9kZSA9PSBBVEg5S19QTV9GVUxMX1NMRUVQKSA/IDEgOiAwKTsKKworCQlhcjkwMDNfbWNpX3F1ZXVlX3Vuc2VudF9ncG0oYWgsIGhlYWRlciwgcGF5bG9hZCwgdHJ1ZSk7CisJCXJldHVybiBmYWxzZTsKKworCX0gZWxzZSBpZiAoY2hlY2tfYnQgJiYgKG1jaS0+YnRfc3RhdGUgPT0gTUNJX0JUX1NMRUVQKSkgeworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJIk1DSSBEb24ndCBzZW5kIG1lc3NhZ2UgMHgleC4gQlQgaXMgaW4gc2xlZXAgc3RhdGVcbiIsIGhlYWRlcik7CisKKwkJYXI5MDAzX21jaV9xdWV1ZV91bnNlbnRfZ3BtKGFoLCBoZWFkZXIsIHBheWxvYWQsIHRydWUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHdhaXRfZG9uZSkKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX0VOLCAwKTsKKworCS8qIE5lZWQgdG8gY2xlYXIgU1dfTVNHX0RPTkUgcmF3IGJpdCBiZWZvcmUgd2FpdCAqLworCisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywKKwkJICAoQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORSB8CisJCSAgIEFSX01DSV9JTlRFUlJVUFRfTVNHX0ZBSUxfTUFTSykpOworCisJaWYgKHBheWxvYWQpIHsKKwkJZm9yIChpID0gMDsgKGkgKiA0KSA8IGxlbjsgaSsrKQorCQkJUkVHX1dSSVRFKGFoLCAoQVJfTUNJX1RYX1BBWUxPQUQwICsgaSAqIDQpLAorCQkJCSAgKihwYXlsb2FkICsgaSkpOworCX0KKworCVJFR19XUklURShhaCwgQVJfTUNJX0NPTU1BTkQwLAorCQkgIChTTSgoZmxhZyAmIE1DSV9GTEFHX0RJU0FCTEVfVElNRVNUQU1QKSwKKwkJICAgICAgQVJfTUNJX0NPTU1BTkQwX0RJU0FCTEVfVElNRVNUQU1QKSB8CisJCSAgIFNNKGxlbiwgQVJfTUNJX0NPTU1BTkQwX0xFTikgfAorCQkgICBTTShoZWFkZXIsIEFSX01DSV9DT01NQU5EMF9IRUFERVIpKSk7CisKKwlpZiAod2FpdF9kb25lICYmCisJICAgICEoYXI5MDAzX21jaV93YWl0X2Zvcl9pbnRlcnJ1cHQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUkFXLAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1NXX01TR19ET05FLCA1MDApKSkKKwkJYXI5MDAzX21jaV9xdWV1ZV91bnNlbnRfZ3BtKGFoLCBoZWFkZXIsIHBheWxvYWQsIHRydWUpOworCWVsc2UgeworCQlhcjkwMDNfbWNpX3F1ZXVlX3Vuc2VudF9ncG0oYWgsIGhlYWRlciwgcGF5bG9hZCwgZmFsc2UpOworCQltc2dfc2VudCA9IHRydWU7CisJfQorCisJaWYgKHdhaXRfZG9uZSkKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX0VOLCBzYXZlZF9tY2lfaW50X2VuKTsKKworCXJldHVybiBtc2dfc2VudDsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UpOworCit2b2lkIGFyOTAwM19tY2lfc2V0dXAoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBncG1fYWRkciwgdm9pZCAqZ3BtX2J1ZiwKKwkJICAgICAgdTE2IGxlbiwgdTMyIHNjaGVkX2FkZHIpCit7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXZvaWQgKnNjaGVkX2J1ZiA9ICh2b2lkICopKChjaGFyICopIGdwbV9idWYgKyAoc2NoZWRfYWRkciAtIGdwbV9hZGRyKSk7CisKKwltY2ktPmdwbV9hZGRyID0gZ3BtX2FkZHI7CisJbWNpLT5ncG1fYnVmID0gZ3BtX2J1ZjsKKwltY2ktPmdwbV9sZW4gPSBsZW47CisJbWNpLT5zY2hlZF9hZGRyID0gc2NoZWRfYWRkcjsKKwltY2ktPnNjaGVkX2J1ZiA9IHNjaGVkX2J1ZjsKKworCWFyOTAwM19tY2lfcmVzZXQoYWgsIHRydWUsIHRydWUsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTChhcjkwMDNfbWNpX3NldHVwKTsKKwordm9pZCBhcjkwMDNfbWNpX2NsZWFudXAoc3RydWN0IGF0aF9odyAqYWgpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisKKwkvKiBUdXJuIG9mZiBNQ0kgYW5kIEp1cGl0ZXIgbW9kZS4gKi8KKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9DVFJMLCAweDAwKTsKKwlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgYXI5MDAzX21jaV9jbGVhbnVwXG4iKTsKKwlhcjkwMDNfbWNpX2Rpc2FibGVfaW50ZXJydXB0KGFoKTsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX21jaV9jbGVhbnVwKTsKKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9wcm9jZXNzX2dwbV9leHRyYShzdHJ1Y3QgYXRoX2h3ICphaCwgdTggZ3BtX3R5cGUsCisJCQkJCSB1OCBncG1fb3Bjb2RlLCB1MzIgKnBfZ3BtKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1OCAqcF9kYXRhID0gKHU4ICopIHBfZ3BtOworCisJaWYgKGdwbV90eXBlICE9IE1DSV9HUE1fQ09FWF9BR0VOVCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChncG1fb3Bjb2RlKSB7CisJY2FzZSBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9RVUVSWToKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBSZWN2IEdQTSBDT0VYIFZlcnNpb24gUXVlcnlcbiIpOworCQlhcjkwMDNfbWNpX3NlbmRfY29leF92ZXJzaW9uX3Jlc3BvbnNlKGFoLCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9SRVNQT05TRToKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBSZWN2IEdQTSBDT0VYIFZlcnNpb24gUmVzcG9uc2VcbiIpOworCQltY2ktPmJ0X3Zlcl9tYWpvciA9CisJCQkqKHBfZGF0YSArIE1DSV9HUE1fQ09FWF9CX01BSk9SX1ZFUlNJT04pOworCQltY2ktPmJ0X3Zlcl9taW5vciA9CisJCQkqKHBfZGF0YSArIE1DSV9HUE1fQ09FWF9CX01JTk9SX1ZFUlNJT04pOworCQltY2ktPmJ0X3ZlcnNpb25fa25vd24gPSB0cnVlOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIEJUIENvZXggdmVyc2lvbjogJWQuJWRcbiIsCisJCQltY2ktPmJ0X3Zlcl9tYWpvciwKKwkJCW1jaS0+YnRfdmVyX21pbm9yKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfR1BNX0NPRVhfU1RBVFVTX1FVRVJZOgorCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggU3RhdHVzIFF1ZXJ5ID0gMHglMDJYLlxuIiwKKwkJCSoocF9kYXRhICsgTUNJX0dQTV9DT0VYX0JfV0xBTl9CSVRNQVApKTsKKwkJbWNpLT53bGFuX2NoYW5uZWxzX3VwZGF0ZSA9IHRydWU7CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3dsYW5fY2hhbm5lbHMoYWgsIHRydWUpOworCQlicmVhazsKKwljYXNlIE1DSV9HUE1fQ09FWF9CVF9QUk9GSUxFX0lORk86CisJCW1jaS0+cXVlcnlfYnQgPSB0cnVlOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggQlRfUHJvZmlsZV9JbmZvXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfR1BNX0NPRVhfQlRfU1RBVFVTX1VQREFURToKKwkJbWNpLT5xdWVyeV9idCA9IHRydWU7CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgUmVjdiBHUE0gQ09FWCBCVF9TdGF0dXNfVXBkYXRlICIKKwkJCSJTRVE9JWQgKGRyb3AmcXVlcnkpXG4iLCAqKHBfZ3BtICsgMykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3UzMiBhcjkwMDNfbWNpX3dhaXRfZm9yX2dwbShzdHJ1Y3QgYXRoX2h3ICphaCwgdTggZ3BtX3R5cGUsCisJCQkgICAgdTggZ3BtX29wY29kZSwgaW50IHRpbWVfb3V0KQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgKnBfZ3BtID0gTlVMTCwgbWlzbWF0Y2ggPSAwLCBtb3JlX2RhdGE7CisJdTMyIG9mZnNldDsKKwl1OCByZWN2X3R5cGUgPSAwLCByZWN2X29wY29kZSA9IDA7CisJYm9vbCBiX2lzX2J0X2NhbF9kb25lID0gKGdwbV90eXBlID09IE1DSV9HUE1fQlRfQ0FMX0RPTkUpOworCisJbW9yZV9kYXRhID0gdGltZV9vdXQgPyBNQ0lfR1BNX05PTU9SRSA6IE1DSV9HUE1fTU9SRTsKKworCXdoaWxlICh0aW1lX291dCA+IDApIHsKKwkJaWYgKHBfZ3BtKSB7CisJCQlNQ0lfR1BNX1JFQ1lDTEUocF9ncG0pOworCQkJcF9ncG0gPSBOVUxMOworCQl9CisKKwkJaWYgKG1vcmVfZGF0YSAhPSBNQ0lfR1BNX01PUkUpCisJCQl0aW1lX291dCA9IGFyOTAwM19tY2lfd2FpdF9mb3JfaW50ZXJydXB0KGFoLAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJCUFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTSwKKwkJCQkJdGltZV9vdXQpOworCisJCWlmICghdGltZV9vdXQpCisJCQlicmVhazsKKworCQlvZmZzZXQgPSBhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQkJCU1DSV9TVEFURV9ORVhUX0dQTV9PRkZTRVQsICZtb3JlX2RhdGEpOworCisJCWlmIChvZmZzZXQgPT0gTUNJX0dQTV9JTlZBTElEKQorCQkJY29udGludWU7CisKKwkJcF9ncG0gPSAodTMyICopIChtY2ktPmdwbV9idWYgKyBvZmZzZXQpOworCQlyZWN2X3R5cGUgPSBNQ0lfR1BNX1RZUEUocF9ncG0pOworCQlyZWN2X29wY29kZSA9IE1DSV9HUE1fT1BDT0RFKHBfZ3BtKTsKKworCQlpZiAoTUNJX0dQTV9JU19DQUxfVFlQRShyZWN2X3R5cGUpKSB7CisKKwkJCWlmIChyZWN2X3R5cGUgPT0gZ3BtX3R5cGUpIHsKKworCQkJCWlmICgoZ3BtX3R5cGUgPT0gTUNJX0dQTV9CVF9DQUxfRE9ORSkgJiYKKwkJCQkgICAgIWJfaXNfYnRfY2FsX2RvbmUpIHsKKwkJCQkJZ3BtX3R5cGUgPSBNQ0lfR1BNX0JUX0NBTF9HUkFOVDsKKwkJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkJIk1DSSBSZWN2IEJUX0NBTF9ET05FIgorCQkJCQkJIndhaXQgQlRfQ0FMX0dSQU5UXG4iKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoKHJlY3ZfdHlwZSA9PSBncG1fdHlwZSkgJiYKKwkJCSAgIChyZWN2X29wY29kZSA9PSBncG1fb3Bjb2RlKSkKKwkJCWJyZWFrOworCisJCS8qIG5vdCBleHBlY3RlZCBtZXNzYWdlICovCisKKwkJLyoKKwkJICogY2hlY2sgaWYgaXQncyBjYWxfZ3JhbnQKKwkJICoKKwkJICogV2hlbiB3ZSdyZSB3YWl0aW5nIGZvciBjYWxfZ3JhbnQgaW4gcmVzZXQgcm91dGluZSwKKwkJICogaXQncyBwb3NzaWJsZSB0aGF0IEJUIHNlbmRzIG91dCBjYWxfcmVxdWVzdCBhdCB0aGUKKwkJICogc2FtZSB0aW1lLiBTaW5jZSBCVCdzIGNhbGlicmF0aW9uIGRvZXNuJ3QgaGFwcGVuCisJCSAqIHRoYXQgb2Z0ZW4sIHdlJ2xsIGxldCBCVCBjb21wbGV0ZXMgY2FsaWJyYXRpb24gdGhlbgorCQkgKiB3ZSBjb250aW51ZSB0byB3YWl0IGZvciBjYWxfZ3JhbnQgZnJvbSBCVC4KKwkJICogT3JnaW5hbDogV2FpdCBCVF9DQUxfR1JBTlQuCisJCSAqIE5ldzogUmVjZWl2ZSBCVF9DQUxfUkVRIC0+IHNlbmQgV0xBTl9DQUxfR1JBTlQtPndhaXQKKwkJICogQlRfQ0FMX0RPTkUgLT4gV2FpdCBCVF9DQUxfR1JBTlQuCisJCSAqLworCisJCWlmICgoZ3BtX3R5cGUgPT0gTUNJX0dQTV9CVF9DQUxfR1JBTlQpICYmCisJCSAgICAocmVjdl90eXBlID09IE1DSV9HUE1fQlRfQ0FMX1JFUSkpIHsKKworCQkJdTMyIHBheWxvYWRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJCWdwbV90eXBlID0gTUNJX0dQTV9CVF9DQUxfRE9ORTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIFJjdiBCVF9DQUxfUkVRLCBzZW5kIFdMQU5fQ0FMX0dSQU5UXG4iKTsKKworCQkJTUNJX0dQTV9TRVRfQ0FMX1RZUEUocGF5bG9hZCwKKwkJCQkJTUNJX0dQTV9XTEFOX0NBTF9HUkFOVCk7CisKKwkJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwKKwkJCQkJCWZhbHNlLCBmYWxzZSk7CisKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIG5vdyB3YWl0IGZvciBCVF9DQUxfRE9ORVxuIik7CisKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIEdQTSBzdWJ0eXBlIgorCQkJCQkibm90IG1hdGNoIDB4JXhcbiIsICoocF9ncG0gKyAxKSk7CisJCQltaXNtYXRjaCsrOworCQkJYXI5MDAzX21jaV9wcm9jZXNzX2dwbV9leHRyYShhaCwgcmVjdl90eXBlLAorCQkJCQlyZWN2X29wY29kZSwgcF9ncG0pOworCQl9CisJfQorCWlmIChwX2dwbSkgeworCQlNQ0lfR1BNX1JFQ1lDTEUocF9ncG0pOworCQlwX2dwbSA9IE5VTEw7CisJfQorCisJaWYgKHRpbWVfb3V0IDw9IDApIHsKKwkJdGltZV9vdXQgPSAwOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIEdQTSByZWNlaXZlZCB0aW1lb3V0LCBtaXNtYXRjaCA9ICVkXG4iLCBtaXNtYXRjaCk7CisJfSBlbHNlCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgUmVjZWl2ZSBHUE0gdHlwZT0weCV4LCBjb2RlPTB4JXhcbiIsCisJCQlncG1fdHlwZSwgZ3BtX29wY29kZSk7CisKKwl3aGlsZSAobW9yZV9kYXRhID09IE1DSV9HUE1fTU9SRSkgeworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBkaXNjYXJkIHJlbWFpbmluZyBHUE1cbiIpOworCQlvZmZzZXQgPSBhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfTkVYVF9HUE1fT0ZGU0VULAorCQkJCQkgICZtb3JlX2RhdGEpOworCisJCWlmIChvZmZzZXQgPT0gTUNJX0dQTV9JTlZBTElEKQorCQkJYnJlYWs7CisKKwkJcF9ncG0gPSAodTMyICopIChtY2ktPmdwbV9idWYgKyBvZmZzZXQpOworCQlyZWN2X3R5cGUgPSBNQ0lfR1BNX1RZUEUocF9ncG0pOworCQlyZWN2X29wY29kZSA9IE1DSV9HUE1fT1BDT0RFKHBfZ3BtKTsKKworCQlpZiAoIU1DSV9HUE1fSVNfQ0FMX1RZUEUocmVjdl90eXBlKSkKKwkJCWFyOTAwM19tY2lfcHJvY2Vzc19ncG1fZXh0cmEoYWgsIHJlY3ZfdHlwZSwKKwkJCQkJCSAgICAgcmVjdl9vcGNvZGUsIHBfZ3BtKTsKKworCQlNQ0lfR1BNX1JFQ1lDTEUocF9ncG0pOworCX0KKworCXJldHVybiB0aW1lX291dDsKK30KKwordTMyIGFyOTAwM19tY2lfc3RhdGUoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBzdGF0ZV90eXBlLCB1MzIgKnBfZGF0YSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIHZhbHVlID0gMCwgbW9yZV9ncG0gPSAwLCBncG1fcHRyOworCXU4IHF1ZXJ5X3R5cGU7CisKKwlzd2l0Y2ggKHN0YXRlX3R5cGUpIHsKKwljYXNlIE1DSV9TVEFURV9FTkFCTEU6CisJCWlmIChtY2ktPnJlYWR5KSB7CisKKwkJCXZhbHVlID0gUkVHX1JFQUQoYWgsIEFSX0JUQ09FWF9DVFJMKTsKKworCQkJaWYgKCh2YWx1ZSA9PSAweGRlYWRiZWVmKSB8fCAodmFsdWUgPT0gMHhmZmZmZmZmZikpCisJCQkJdmFsdWUgPSAwOworCQl9CisJCXZhbHVlICY9IEFSX0JUQ09FWF9DVFJMX01DSV9NT0RFX0VOOworCQlicmVhazsKKwljYXNlIE1DSV9TVEFURV9JTklUX0dQTV9PRkZTRVQ6CisJCXZhbHVlID0gTVMoUkVHX1JFQUQoYWgsIEFSX01DSV9HUE1fMSksIEFSX01DSV9HUE1fV1JJVEVfUFRSKTsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBHUE0gaW5pdGlhbCBXUklURV9QVFI9JWRcbiIsIHZhbHVlKTsKKwkJbWNpLT5ncG1faWR4ID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgTUNJX1NUQVRFX05FWFRfR1BNX09GRlNFVDoKKwljYXNlIE1DSV9TVEFURV9MQVNUX0dQTV9PRkZTRVQ6CisJCS8qCisJCSogVGhpcyBjb3VsZCBiZSB1c2VmdWwgdG8gYXZvaWQgbmV3IEdQTSBtZXNzYWdlIGludGVycnVwdCB3aGljaAorCQkqIG1heSBsZWFkIHRvIHNwdXJpb3VzIGludGVycnVwdCBhZnRlciBwb3dlciBzbGVlcCwgb3IgbXVsdGlwbGUKKwkJKiBlbnRyeSBvZiBhdGhfbWNpX2ludHIoKS4KKwkJKiBBZGRpbmcgZW1wdHkgR1BNIGNoZWNrIGJ5IHJldHVybmluZyBIQUxfTUNJX0dQTV9JTlZBTElEIGNhbgorCQkqIGFsbGV2aWF0ZSB0aGlzIGVmZmVjdCwgYnV0IGNsZWFyaW5nIEdQTSBSWCBpbnRlcnJ1cHQgYml0IGlzCisJCSogc2FmZSwgYmVjYXVzZSB3aGV0aGVyIHRoaXMgaXMgY2FsbGVkIGZyb20gaHcgb3IgZHJpdmVyIGNvZGUKKwkJKiB0aGVyZSBtdXN0IGJlIGFuIGludGVycnVwdCBiaXQgc2V0L3RyaWdnZXJlZCBpbml0aWFsbHkKKwkJKi8KKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTSk7CisKKwkJZ3BtX3B0ciA9IE1TKFJFR19SRUFEKGFoLCBBUl9NQ0lfR1BNXzEpLCBBUl9NQ0lfR1BNX1dSSVRFX1BUUik7CisJCXZhbHVlID0gZ3BtX3B0cjsKKworCQlpZiAodmFsdWUgPT0gMCkKKwkJCXZhbHVlID0gbWNpLT5ncG1fbGVuIC0gMTsKKwkJZWxzZSBpZiAodmFsdWUgPj0gbWNpLT5ncG1fbGVuKSB7CisJCQlpZiAodmFsdWUgIT0gMHhGRkZGKSB7CisJCQkJdmFsdWUgPSAwOworCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBHUE0gb2Zmc2V0IgorCQkJCQkib3V0IG9mIHJhbmdlXG4iKTsKKwkJCX0KKwkJfSBlbHNlCisJCQl2YWx1ZS0tOworCisJCWlmICh2YWx1ZSA9PSAweEZGRkYpIHsKKwkJCXZhbHVlID0gTUNJX0dQTV9JTlZBTElEOworCQkJbW9yZV9ncG0gPSBNQ0lfR1BNX05PTU9SRTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBHUE0gcHRyIGludmFsaWQiCisJCQkJIkBwdHI9JWQsIG9mZnNldD0lZCwgbW9yZT1HUE1fTk9NT1JFXG4iLAorCQkJCWdwbV9wdHIsIHZhbHVlKTsKKwkJfSBlbHNlIGlmIChzdGF0ZV90eXBlID09IE1DSV9TVEFURV9ORVhUX0dQTV9PRkZTRVQpIHsKKworCQkJaWYgKGdwbV9wdHIgPT0gbWNpLT5ncG1faWR4KSB7CisJCQkJdmFsdWUgPSBNQ0lfR1BNX0lOVkFMSUQ7CisJCQkJbW9yZV9ncG0gPSBNQ0lfR1BNX05PTU9SRTsKKworCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBHUE0gbWVzc2FnZSIKKwkJCQkJIm5vdCBhdmFpbGFibGUgQHB0cj0lZCwgQG9mZnNldD0lZCwiCisJCQkJCSJtb3JlPUdQTV9OT01PUkVcbiIsIGdwbV9wdHIsIHZhbHVlKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yICg7OykgeworCisJCQkJCXUzMiB0ZW1wX2luZGV4OworCisJCQkJCS8qIHNraXAgcmVzZXJ2ZWQgR1BNIGlmIGFueSAqLworCisJCQkJCWlmICh2YWx1ZSAhPSBtY2ktPmdwbV9pZHgpCisJCQkJCQltb3JlX2dwbSA9IE1DSV9HUE1fTU9SRTsKKwkJCQkJZWxzZQorCQkJCQkJbW9yZV9ncG0gPSBNQ0lfR1BNX05PTU9SRTsKKworCQkJCQl0ZW1wX2luZGV4ID0gbWNpLT5ncG1faWR4OworCQkJCQltY2ktPmdwbV9pZHgrKzsKKworCQkJCQlpZiAobWNpLT5ncG1faWR4ID49CisJCQkJCSAgICBtY2ktPmdwbV9sZW4pCisJCQkJCQltY2ktPmdwbV9pZHggPSAwOworCisJCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJCSJNQ0kgR1BNIG1lc3NhZ2UgZ290IHB0cj0lZCwiCisJCQkJCQkiQG9mZnNldD0lZCwgbW9yZT0lZFxuIiwKKwkJCQkJCWdwbV9wdHIsIHRlbXBfaW5kZXgsCisJCQkJCQkobW9yZV9ncG0gPT0gTUNJX0dQTV9NT1JFKSk7CisKKwkJCQkJaWYgKGFyOTAwM19tY2lfaXNfZ3BtX3ZhbGlkKGFoLAorCQkJCQkJCQl0ZW1wX2luZGV4KSkgeworCQkJCQkJdmFsdWUgPSB0ZW1wX2luZGV4OworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAobW9yZV9ncG0gPT0gTUNJX0dQTV9OT01PUkUpIHsKKwkJCQkJCXZhbHVlID0gTUNJX0dQTV9JTlZBTElEOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAocF9kYXRhKQorCQkJCSpwX2RhdGEgPSBtb3JlX2dwbTsKKwkJCX0KKworCQkJaWYgKHZhbHVlICE9IE1DSV9HUE1fSU5WQUxJRCkKKwkJCQl2YWx1ZSA8PD0gNDsKKworCQkJYnJlYWs7CisJY2FzZSBNQ0lfU1RBVEVfTEFTVF9TQ0hEX01TR19PRkZTRVQ6CisJCXZhbHVlID0gTVMoUkVHX1JFQUQoYWgsIEFSX01DSV9SWF9TVEFUVVMpLAorCQkJCSAgICBBUl9NQ0lfUlhfTEFTVF9TQ0hEX01TR19JTkRFWCk7CisJCS8qIE1ha2UgaXQgaW4gYnl0ZXMgKi8KKwkJdmFsdWUgPDw9IDQ7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfU1RBVEVfUkVNT1RFX1NMRUVQOgorCQl2YWx1ZSA9IE1TKFJFR19SRUFEKGFoLCBBUl9NQ0lfUlhfU1RBVFVTKSwKKwkJCSAgIEFSX01DSV9SWF9SRU1PVEVfU0xFRVApID8KKwkJCU1DSV9CVF9TTEVFUCA6IE1DSV9CVF9BV0FLRTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9DT05UX1JTU0lfUE9XRVI6CisJCXZhbHVlID0gTVMobWNpLT5jb250X3N0YXR1cywgQVJfTUNJX0NPTlRfUlNTSV9QT1dFUik7CisJCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX0NPTlRfUFJJT1JJVFk6CisJCXZhbHVlID0gTVMobWNpLT5jb250X3N0YXR1cywgQVJfTUNJX0NPTlRfUlJJT1JJVFkpOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX0NPTlRfVFhSWDoKKwkJdmFsdWUgPSBNUyhtY2ktPmNvbnRfc3RhdHVzLCBBUl9NQ0lfQ09OVF9UWFJYKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9CVDoKKwkJdmFsdWUgPSBtY2ktPmJ0X3N0YXRlOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFVF9CVF9TTEVFUDoKKwkJbWNpLT5idF9zdGF0ZSA9IE1DSV9CVF9TTEVFUDsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRVRfQlRfQVdBS0U6CisJCW1jaS0+YnRfc3RhdGUgPSBNQ0lfQlRfQVdBS0U7CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3ZlcnNpb25fcXVlcnkoYWgsIHRydWUpOworCQlhcjkwMDNfbWNpX3NlbmRfY29leF93bGFuX2NoYW5uZWxzKGFoLCB0cnVlKTsKKworCQlpZiAobWNpLT51bmhhbHRfYnRfZ3BtKSB7CisKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIHVuaGFsdCBCVCBHUE1cbiIpOworCQkJYXI5MDAzX21jaV9zZW5kX2NvZXhfaGFsdF9idF9ncG0oYWgsIGZhbHNlLCB0cnVlKTsKKwkJfQorCisJCWFyOTAwM19tY2lfMmc1Z19zd2l0Y2goYWgsIHRydWUpOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFVF9CVF9DQUxfU1RBUlQ6CisJCW1jaS0+YnRfc3RhdGUgPSBNQ0lfQlRfQ0FMX1NUQVJUOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFVF9CVF9DQUw6CisJCW1jaS0+YnRfc3RhdGUgPSBNQ0lfQlRfQ0FMOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1JFU0VUX1JFUV9XQUtFOgorCQlhcjkwMDNfbWNpX3Jlc2V0X3JlcV93YWtldXAoYWgpOworCQltY2ktPnVwZGF0ZV8yZzVnID0gdHJ1ZTsKKworCQlpZiAoKEFSX1NSRVZfOTQ2Ml8yMF9PUl9MQVRFUihhaCkpICYmCisJCSAgICAobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01BU0spKSB7CisJCQkvKiBDaGVjayBpZiB3ZSBzdGlsbCBoYXZlIGNvbnRyb2wgb2YgdGhlIEdQSU9zICovCisJCQlpZiAoKFJFR19SRUFEKGFoLCBBUl9HTEJfR1BJT19DT05UUk9MKSAmCisJCQkJICAgICAgQVRIX01DSV9DT05GSUdfTUNJX09CU19HUElPKSAhPQorCQkJCQlBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0dQSU8pIHsKKworCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSByZWNvbmZpZ3VyZSBvYnNlcnZhdGlvbiIpOworCQkJCWFyOTAwM19tY2lfb2JzZXJ2YXRpb25fc2V0X3VwKGFoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFTkRfV0xBTl9DT0VYX1ZFUlNJT046CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3ZlcnNpb25fcmVzcG9uc2UoYWgsIHRydWUpOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFVF9CVF9DT0VYX1ZFUlNJT046CisKKwkJaWYgKCFwX2RhdGEpCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBTZXQgQlQgQ29leCB2ZXJzaW9uIHdpdGggTlVMTCBkYXRhISFcbiIpOworCQllbHNlIHsKKwkJCW1jaS0+YnRfdmVyX21ham9yID0gKCpwX2RhdGEgPj4gOCkgJiAweGZmOworCQkJbWNpLT5idF92ZXJfbWlub3IgPSAoKnBfZGF0YSkgJiAweGZmOworCQkJbWNpLT5idF92ZXJzaW9uX2tub3duID0gdHJ1ZTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIEJUIHZlcnNpb24gc2V0OiAlZC4lZFxuIiwKKwkJCQltY2ktPmJ0X3Zlcl9tYWpvciwKKwkJCQltY2ktPmJ0X3Zlcl9taW5vcik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRU5EX1dMQU5fQ0hBTk5FTFM6CisJCWlmIChwX2RhdGEpIHsKKwkJCWlmICgoKG1jaS0+d2xhbl9jaGFubmVsc1sxXSAmIDB4ZmZmZjAwMDApID09CisJCQkgICAgICgqKHBfZGF0YSArIDEpICYgMHhmZmZmMDAwMCkpICYmCisJCQkgICAgKG1jaS0+d2xhbl9jaGFubmVsc1syXSA9PSAqKHBfZGF0YSArIDIpKSAmJgorCQkJICAgIChtY2ktPndsYW5fY2hhbm5lbHNbM10gPT0gKihwX2RhdGEgKyAzKSkpCisJCQkJYnJlYWs7CisKKwkJCW1jaS0+d2xhbl9jaGFubmVsc1swXSA9ICpwX2RhdGErKzsKKwkJCW1jaS0+d2xhbl9jaGFubmVsc1sxXSA9ICpwX2RhdGErKzsKKwkJCW1jaS0+d2xhbl9jaGFubmVsc1syXSA9ICpwX2RhdGErKzsKKwkJCW1jaS0+d2xhbl9jaGFubmVsc1szXSA9ICpwX2RhdGErKzsKKwkJfQorCQltY2ktPndsYW5fY2hhbm5lbHNfdXBkYXRlID0gdHJ1ZTsKKwkJYXI5MDAzX21jaV9zZW5kX2NvZXhfd2xhbl9jaGFubmVscyhhaCwgdHJ1ZSk7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfU1RBVEVfU0VORF9WRVJTSU9OX1FVRVJZOgorCQlhcjkwMDNfbWNpX3NlbmRfY29leF92ZXJzaW9uX3F1ZXJ5KGFoLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRU5EX1NUQVRVU19RVUVSWToKKwkJcXVlcnlfdHlwZSA9IChBUl9TUkVWXzk0NjJfMTAoYWgpKSA/CisJCQkJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0FMTF9JTkZPIDoKKwkJCQlNQ0lfR1BNX0NPRVhfUVVFUllfQlRfVE9QT0xPR1k7CisKKwkJYXI5MDAzX21jaV9zZW5kX2NvZXhfYnRfc3RhdHVzX3F1ZXJ5KGFoLCB0cnVlLCBxdWVyeV90eXBlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9ORUVEX0ZMVVNIX0JUX0lORk86CisJCQkvKgorCQkJICogYnRjb2V4X2h3Lm1jaS51bmhhbHRfYnRfZ3BtIG1lYW5zIHdoZXRoZXIgaXQncworCQkJICogbmVlZGVkIHRvIHNlbmQgVU5IQUxUIG1lc3NhZ2UuIEl0J3Mgc2V0IHdoZW5ldmVyCisJCQkgKiB0aGVyZSdzIGEgcmVxdWVzdCB0byBzZW5kIEhBTFQgbWVzc2FnZS4KKwkJCSAqIG1jaV9oYWx0ZWRfYnRfZ3BtIG1lYW5zIHdoZXRoZXIgSEFMVCBtZXNzYWdlIGlzIHNlbnQKKwkJCSAqIG91dCBzdWNjZXNzZnVsbHkuCisJCQkgKgorCQkJICogQ2hlY2tpbmcgKG1jaV91bmhhbHRfYnRfZ3BtID09IGZhbHNlKSBpbnN0ZWFkIG9mCisJCQkgKiBjaGVja2luZyAoYWgtPm1jaV9oYWx0ZWRfYnRfZ3BtID09IGZhbHNlKSB3aWxsIG1ha2UKKwkJCSAqIHN1cmUgY3VycmVudGx5IGlzIGluIFVOSEFMVC1lZCBtb2RlIGFuZCBCVCBjYW4KKwkJCSAqIHJlc3BvbmQgdG8gc3RhdHVzIHF1ZXJ5LgorCQkJICovCisJCQl2YWx1ZSA9ICghbWNpLT51bmhhbHRfYnRfZ3BtICYmCisJCQkJIG1jaS0+bmVlZF9mbHVzaF9idGluZm8pID8gMSA6IDA7CisJCQlpZiAocF9kYXRhKQorCQkJCW1jaS0+bmVlZF9mbHVzaF9idGluZm8gPQorCQkJCQkoKnBfZGF0YSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKKwkJCWJyZWFrOworCisJY2FzZSBNQ0lfU1RBVEVfUkVDT1ZFUl9SWDoKKworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgaHcgUkVDT1ZFUl9SWFxuIik7CisJCWFyOTAwM19tY2lfcHJlcF9pbnRlcmZhY2UoYWgpOworCQltY2ktPnF1ZXJ5X2J0ID0gdHJ1ZTsKKwkJbWNpLT5uZWVkX2ZsdXNoX2J0aW5mbyA9IHRydWU7CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3dsYW5fY2hhbm5lbHMoYWgsIHRydWUpOworCQlhcjkwMDNfbWNpXzJnNWdfc3dpdGNoKGFoLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9ORUVEX0ZUUF9TVE9NUDoKKwkJdmFsdWUgPSAhKG1jaS0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfRElTQUJMRV9GVFBfU1RPTVApOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX05FRURfVFVOSU5HOgorCQl2YWx1ZSA9ICEobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX1RVTklORyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CitFWFBPUlRfU1lNQk9MKGFyOTAwM19tY2lfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4ZGExMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEFSOTAwM19NQ0lfSAorI2RlZmluZSBBUjkwMDNfTUNJX0gKKworI2RlZmluZSBNQ0lfRkxBR19ESVNBQkxFX1RJTUVTVEFNUCAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBEaXNhYmxlIHRpbWUgc3RhbXAgKi8KKworLyogRGVmYXVsdCByZW1vdGUgQlQgZGV2aWNlIE1DSSBDT0VYIHZlcnNpb24gKi8KKyNkZWZpbmUgTUNJX0dQTV9DT0VYX01BSk9SX1ZFUlNJT05fREVGQVVMVCAgMworI2RlZmluZSBNQ0lfR1BNX0NPRVhfTUlOT1JfVkVSU0lPTl9ERUZBVUxUICAwCisKKy8qIExvY2FsIFdMQU4gTUNJIENPRVggdmVyc2lvbiAqLworI2RlZmluZSBNQ0lfR1BNX0NPRVhfTUFKT1JfVkVSU0lPTl9XTEFOICAgICAzCisjZGVmaW5lIE1DSV9HUE1fQ09FWF9NSU5PUl9WRVJTSU9OX1dMQU4gICAgIDAKKworZW51bSBtY2lfZ3BtX2NvZXhfcXVlcnlfdHlwZSB7CisJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0FMTF9JTkZPICAgICAgPSBCSVQoMCksCisJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX1RPUE9MT0dZICAgICAgPSBCSVQoMSksCisJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0RFQlVHICAgICAgICAgPSBCSVQoMiksCit9OworCitlbnVtIG1jaV9ncG1fY29leF9oYWx0X2J0X2dwbSB7CisJTUNJX0dQTV9DT0VYX0JUX0dQTV9VTkhBTFQsCisJTUNJX0dQTV9DT0VYX0JUX0dQTV9IQUxUCit9OworCitlbnVtIG1jaV9ncG1fY29leF9idF91cGRhdGVfZmxhZ3Nfb3AgeworCU1DSV9HUE1fQ09FWF9CVF9GTEFHU19SRUFELAorCU1DSV9HUE1fQ09FWF9CVF9GTEFHU19TRVQsCisJTUNJX0dQTV9DT0VYX0JUX0ZMQUdTX0NMRUFSCit9OworCisjZGVmaW5lIE1DSV9OVU1fQlRfQ0hBTk5FTFMgICAgIDc5CisKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19VUERBVEVfQ09SUiAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfVVBEQVRFX0hEUiAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX1VQREFURV9QTEQgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19MTkFfQ1RSTCAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfREVCVUcgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX1NDSEVEX01TRyAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19DT05UX01TRyAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfQ09FWF9HUE0gICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX0NQVV9JTlRfTVNHICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19NQ0lfTU9ERSAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfQVI5NDYyX01PREUgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX09USEVSICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKworI2RlZmluZSBNQ0lfREVGQVVMVF9CVF9NQ0lfRkxBR1MgICAgICAgICAgICAgIDB4MDAwMTFkZGUKKworI2RlZmluZSBNQ0lfVE9HR0xFX0JUX01DSV9GTEFHUyAgKE1DSV9CVF9NQ0lfRkxBR1NfVVBEQVRFX0NPUlIgfCBcCisJCQkJICBNQ0lfQlRfTUNJX0ZMQUdTX1VQREFURV9IRFIgIHwgXAorCQkJCSAgTUNJX0JUX01DSV9GTEFHU19VUERBVEVfUExEICB8IFwKKwkJCQkgIE1DSV9CVF9NQ0lfRkxBR1NfTUNJX01PREUpCisKKyNkZWZpbmUgTUNJXzJHX0ZMQUdTX0NMRUFSX01BU0sgICAweDAwMDAwMDAwCisjZGVmaW5lIE1DSV8yR19GTEFHU19TRVRfTUFTSyAgICAgTUNJX1RPR0dMRV9CVF9NQ0lfRkxBR1MKKyNkZWZpbmUgTUNJXzJHX0ZMQUdTICAgICAgICAgICAgICBNQ0lfREVGQVVMVF9CVF9NQ0lfRkxBR1MKKworI2RlZmluZSBNQ0lfNUdfRkxBR1NfQ0xFQVJfTUFTSyAgIE1DSV9UT0dHTEVfQlRfTUNJX0ZMQUdTCisjZGVmaW5lIE1DSV81R19GTEFHU19TRVRfTUFTSyAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNQ0lfNUdfRkxBR1MgICAgICAgICAgICAgIChNQ0lfREVGQVVMVF9CVF9NQ0lfRkxBR1MgJiBcCisJCQkJICAgfk1DSV9UT0dHTEVfQlRfTUNJX0ZMQUdTKQorCisvKgorICogRGVmYXVsdCB2YWx1ZSBmb3IgQVI5NDYyIGlzIDB4MDAwMDIyMDEKKyAqLworI2RlZmluZSBBVEhfTUNJX0NPTkZJR19DT05DVVJfVFggICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX01DSV9PQlNfTUNJICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfTUNJX09CU19UWFJYICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0JUICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfTUNJX0NBTCAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfRElTQUJMRV9PU0xBICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX0ZUUF9TVE9NUCAgICAweDAwMDAwMDgwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0FHR1JfVEhSRVNIICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfQUdHUl9USFJFU0hfUyAgICAgICAgOAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX0FHR1JfVEhSRVNIICAweDAwMDAwODAwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0NMS19ESVYgICAgICAgICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfQ0xLX0RJVl9TICAgICAgICAgICAgMTIKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfRElTQUJMRV9UVU5JTkcgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfV0VJR0hUX0RCRyAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfTUNJICAgICAgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01BU0sgICAgIChBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01DSSAgfCBcCisJCQkJCSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX1RYUlggfCBcCisJCQkJCSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0JUKQorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0dQSU8gICAgIDB4MDAwMDAwMkYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BhcHJkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BhcHJkLmMKaW5kZXggMGM0NjJjOS4uYTQ0NTBjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19wYXByZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGFwcmQuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjkwMDNfcGh5LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jCmluZGV4IGZlOTY5OTcuLmU0MWQyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjkwMDNfcGh5LmgiCiAKQEAgLTE5OCwxMiArMTk5LDE0IEBACiAJCQlzeW50aF9mcmVxID0gY2hhbi0+Y2hhbm5lbDsKIAkJfQogCX0gZWxzZSB7Ci0JCXJhbmdlID0gMTA7CisJCXJhbmdlID0gQVJfU1JFVl85NDYyKGFoKSA/IDUgOiAxMDsKIAkJbWF4X3NwdXJfY250cyA9IDQ7CiAJCXN5bnRoX2ZyZXEgPSBjaGFuLT5jaGFubmVsOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBtYXhfc3B1cl9jbnRzOyBpKyspIHsKKwkJaWYgKEFSX1NSRVZfOTQ2MihhaCkgJiYgKGkgPT0gMCB8fCBpID09IDMpKQorCQkJY29udGludWU7CiAJCW5lZ2F0aXZlID0gMDsKIAkJaWYgKEFSX1NSRVZfOTQ4NShhaCkgfHwgQVJfU1JFVl85MzQwKGFoKSB8fCBBUl9TUkVWXzkzMzAoYWgpKQogCQkJY3VyX2JiX3NwdXIgPSBGQklOMkZSRVEoc3B1cl9mYmluX3B0cltpXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5oCmluZGV4IDQxMTRmZTcuLmVkNjQxMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuaApAQCAtMzg5LDYgKzM4OSw4IEBACiAjZGVmaW5lIEFSX1BIWV9EQUdfQ1RSTENDS19SU1NJX1RIUl9TICAgMTAKIAogI2RlZmluZSBBUl9QSFlfUklGU19JTklUX0RFTEFZICAgICAgICAgMHgzZmYwMDAwCisjZGVmaW5lIEFSX1BIWV9BR0NfUVVJQ0tfRFJPUCAgICAgICAweDAzYzAwMDAwCisjZGVmaW5lIEFSX1BIWV9BR0NfUVVJQ0tfRFJPUF9TICAgICAyMgogI2RlZmluZSBBUl9QSFlfQUdDX0NPQVJTRV9MT1cgICAgICAgMHgwMDAwN0Y4MAogI2RlZmluZSBBUl9QSFlfQUdDX0NPQVJTRV9MT1dfUyAgICAgNwogI2RlZmluZSBBUl9QSFlfQUdDX0NPQVJTRV9ISUdIICAgICAgMHgwMDNGODAwMApAQCAtNDg4LDYgKzQ5MCw4IEBACiAjZGVmaW5lIEFSX1BIWV9URVNUX0NUTF9UU1RBRENfRU5fUyAgICAgICA4CiAjZGVmaW5lIEFSX1BIWV9URVNUX0NUTF9SWF9PQlNfU0VMICAgICAgICAweDNDMDAKICNkZWZpbmUgQVJfUEhZX1RFU1RfQ1RMX1JYX09CU19TRUxfUyAgICAgIDEwCisjZGVmaW5lIEFSX1BIWV9URVNUX0NUTF9ERUJVR1BPUlRfU0VMCSAgMHhlMDAwMDAwMAorI2RlZmluZSBBUl9QSFlfVEVTVF9DVExfREVCVUdQT1JUX1NFTF9TCSAgMjkKIAogCiAjZGVmaW5lIEFSX1BIWV9UU1REQUMgICAgICAgICAgICAoQVJfU01fQkFTRSArIDB4MTY4KQpAQCAtOTk5LDYgKzEwMDMsNyBAQAogCiAvKiBHTEIgUmVnaXN0ZXJzICovCiAjZGVmaW5lIEFSX0dMQl9CQVNFCTB4MjAwMDAKKyNkZWZpbmUgQVJfR0xCX0dQSU9fQ09OVFJPTAkoQVJfR0xCX0JBU0UpCiAjZGVmaW5lIEFSX1BIWV9HTEJfQ09OVFJPTAkoQVJfR0xCX0JBU0UgKyAweDQ0KQogI2RlZmluZSBBUl9HTEJfU0NSQVRDSChfYWgpCShBUl9HTEJfQkFTRSArIFwKIAkJCQkJKEFSX1NSRVZfOTQ2Ml8yMChfYWgpID8gMHg0YyA6IDB4NTApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTQ2Ml8ycDBfaW5pdHZhbHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjk0NjJfMnAwX2luaXR2YWxzLmgKaW5kZXggOWM1MWIzOS4uMjU5YTZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTQ2Ml8ycDBfaW5pdHZhbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5NDYyXzJwMF9pbml0dmFscy5oCkBAIC00MywxNiArNDMsMTYgQEAKIAkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgICovCiAJezB4MDAwMDk4MTAsIDB4ZDAwYTgwMDUsIDB4ZDAwYTgwMDUsIDB4ZDAwYTgwMTEsIDB4ZDAwYTgwMTF9LAogCXsweDAwMDA5ODIwLCAweDIwNmEwMjJlLCAweDIwNmEwMjJlLCAweDIwNmEwMTJlLCAweDIwNmEwMTJlfSwKLQl7MHgwMDAwOTgyNCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMH0sCi0JezB4MDAwMDk4MjgsIDB4MDY5MDMwODEsIDB4MDY5MDMwODEsIDB4MDY5MDM4ODEsIDB4MDY5MDM4ODF9LAorCXsweDAwMDA5ODI0LCAweDVhYzY0MGRlLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGRlfSwKKwl7MHgwMDAwOTgyOCwgMHgwNzk2YmU4OSwgMHgwNjk2YjA4MSwgMHgwNjk2Yjg4MSwgMHgwNzk2YmU4OX0sCiAJezB4MDAwMDk4MmMsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDQsIDB4MDVlZWE2ZDR9LAogCXsweDAwMDA5ODMwLCAweDAwMDAwNTljLCAweDAwMDAwNTljLCAweDAwMDAxMTljLCAweDAwMDAxMTljfSwKIAl7MHgwMDAwOWMwMCwgMHgwMDAwMDBjNCwgMHgwMDAwMDBjNCwgMHgwMDAwMDBjNCwgMHgwMDAwMDBjNH0sCiAJezB4MDAwMDllMDAsIDB4MDM3MjExMWEsIDB4MDM3MjExMWEsIDB4MDM3MjE2YTAsIDB4MDM3MjE2YTB9LAogCXsweDAwMDA5ZTA0LCAweDAwMWMyMDIwLCAweDAwMWMyMDIwLCAweDAwMWMyMDIwLCAweDAwMWMyMDIwfSwKIAl7MHgwMDAwOWUwYywgMHg2YzQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2ZDQwMDBlMiwgMHg2YzQwMDBlMn0sCi0JezB4MDAwMDllMTAsIDB4N2VjODhkMmUsIDB4N2VjODhkMmUsIDB4N2VjODRkMmUsIDB4N2VjODRkMmV9LAotCXsweDAwMDA5ZTE0LCAweDM3Yjk1ZDVlLCAweDM3Yjk2MDVlLCAweDMwMzk2MDVlLCAweDMzNzk1ZDVlfSwKKwl7MHgwMDAwOWUxMCwgMHg5MmM4OGQyZSwgMHg3ZWM4OGQyZSwgMHg3ZWM4NGQyZSwgMHg5MmM4NGQyZX0sCisJezB4MDAwMDllMTQsIDB4MzdiOTVkNWUsIDB4MzdiOTYwNWUsIDB4MzM3OTYwNWUsIDB4MzM3OTVkNWV9LAogCXsweDAwMDA5ZTE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKIAl7MHgwMDAwOWUxYywgMHgwMDAxY2Y5YywgMHgwMDAxY2Y5YywgMHgwMDAyMWY5YywgMHgwMDAyMWY5Y30sCiAJezB4MDAwMDllMjAsIDB4MDAwMDAzYjUsIDB4MDAwMDAzYjUsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2V9LApAQCAtNjg4LDggKzY4OCw4IEBACiBzdGF0aWMgY29uc3QgdTMyIGFyOTQ2Ml8ycDBfcmFkaW9fcG9zdGFtYmxlX3N5czNhbnRbXVs1XSA9IHsKIAkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgICovCiAJezB4MDAwMTYwYWMsIDB4YTQ2NDZjMDgsIDB4YTQ2NDZjMDgsIDB4MjQ2NDU4MDgsIDB4MjQ2NDU4MDh9LAotCXsweDAwMDE2MTQwLCAweDEwODA0MDA4LCAweDEwODA0MDA4LCAweDkwODA0MDA4LCAweDkwODA0MDA4fSwKLQl7MHgwMDAxNjU0MCwgMHgxMDgwNDAwOCwgMHgxMDgwNDAwOCwgMHg5MDgwNDAwOCwgMHg5MDgwNDAwOH0sCisJezB4MDAwMTYxNDAsIDB4MTA4MDQwMDgsIDB4MTA4MDQwMDgsIDB4NTA4MDQwMDgsIDB4NTA4MDQwMDh9LAorCXsweDAwMDE2NTQwLCAweDEwODA0MDA4LCAweDEwODA0MDA4LCAweDUwODA0MDA4LCAweDUwODA0MDA4fSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5NDYyXzJwMF9iYXNlYmFuZF9wb3N0YW1ibGVfZW11bGF0aW9uW11bNV0gPSB7CkBAIC03MTcsOCArNzE3LDggQEAKIHN0YXRpYyBjb25zdCB1MzIgYXI5NDYyXzJwMF9yYWRpb19wb3N0YW1ibGVfc3lzMmFudFtdWzVdID0gewogCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KIAl7MHgwMDAxNjBhYywgMHhhNDY0NmMwOCwgMHhhNDY0NmMwOCwgMHgyNDY0NTgwOCwgMHgyNDY0NTgwOH0sCi0JezB4MDAwMTYxNDAsIDB4MTA4MDQwMDgsIDB4MTA4MDQwMDgsIDB4OTA4MDQwMDgsIDB4OTA4MDQwMDh9LAotCXsweDAwMDE2NTQwLCAweDEwODA0MDA4LCAweDEwODA0MDA4LCAweDkwODA0MDA4LCAweDkwODA0MDA4fSwKKwl7MHgwMDAxNjE0MCwgMHgxMDgwNDAwOCwgMHgxMDgwNDAwOCwgMHg1MDgwNDAwOCwgMHg1MDgwNDAwOH0sCisJezB4MDAwMTY1NDAsIDB4MTA4MDQwMDgsIDB4MTA4MDQwMDgsIDB4NTA4MDQwMDgsIDB4NTA4MDQwMDh9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjk0NjJfY29tbW9uX3dvX3hsbmFfcnhfZ2Fpbl90YWJsZV8ycDBbXVsyXSA9IHsKQEAgLTEwNTksNyArMTA1OSw3IEBACiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5NDYyXzJwMF9zb2NfcG9zdGFtYmxlW11bNV0gPSB7CiAJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLwotCXsweDAwMDA3MDEwLCAweDAwMDAyMjMzLCAweDAwMDAyMjMzLCAweDAwMDAyMjMzLCAweDAwMDAyMjMzfSwKKwl7MHgwMDAwNzAxMCwgMHgwMDAwMDAzMywgMHgwMDAwMDAzMywgMHgwMDAwMDAzMywgMHgwMDAwMDAzM30sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTQ2Ml8ycDBfYmFzZWJhbmRfY29yZVtdWzJdID0gewpAQCAtMTI1Nyw4ICsxMjU3LDggQEAKIAl7MHgwMDAwYTU0MCwgMHg0ODAyNWU2YywgMHg0ODAyNWU2YywgMHgzODAwMTY2MCwgMHgzODAwMTY2MH0sCiAJezB4MDAwMGE1NDQsIDB4NGUwMjVlOGUsIDB4NGUwMjVlOGUsIDB4M2IwMDE4NjEsIDB4M2IwMDE4NjF9LAogCXsweDAwMDBhNTQ4LCAweDUzMDI1ZWIyLCAweDUzMDI1ZWIyLCAweDNlMDAxYTgxLCAweDNlMDAxYTgxfSwKLQl7MHgwMDAwYTU0YywgMHg1OTAyNWViMiwgMHg1OTAyNWViMiwgMHg0MjAwMWE4MywgMHg0MjAwMWE4M30sCi0JezB4MDAwMGE1NTAsIDB4NWYwMjVlZjYsIDB4NWYwMjVlZjYsIDB4NDQwMDFjODQsIDB4NDQwMDFjODR9LAorCXsweDAwMDBhNTRjLCAweDU5MDI1ZWI2LCAweDU5MDI1ZWI2LCAweDQyMDAxYTgzLCAweDQyMDAxYTgzfSwKKwl7MHgwMDAwYTU1MCwgMHg1ZDAyNWVmNiwgMHg1ZDAyNWVmNiwgMHg0NDAwMWM4NCwgMHg0NDAwMWM4NH0sCiAJezB4MDAwMGE1NTQsIDB4NjIwMjVmNTYsIDB4NjIwMjVmNTYsIDB4NDgwMDFjZTMsIDB4NDgwMDFjZTN9LAogCXsweDAwMDBhNTU4LCAweDY2MDI3ZjU2LCAweDY2MDI3ZjU2LCAweDRjMDAxY2U1LCAweDRjMDAxY2U1fSwKIAl7MHgwMDAwYTU1YywgMHg2YTAyOWY1NiwgMHg2YTAyOWY1NiwgMHg1MDAwMWNlOSwgMHg1MDAwMWNlOX0sCkBAIC0xODUwLDggKzE4NTAsOCBAQAogCXsweDAwMDBhNTQwLCAweDQ4MDI1ZTZjLCAweDQ4MDI1ZTZjLCAweDM4MDAxNjYwLCAweDM4MDAxNjYwfSwKIAl7MHgwMDAwYTU0NCwgMHg0ZTAyNWU4ZSwgMHg0ZTAyNWU4ZSwgMHgzYjAwMTg2MSwgMHgzYjAwMTg2MX0sCiAJezB4MDAwMGE1NDgsIDB4NTMwMjVlYjIsIDB4NTMwMjVlYjIsIDB4M2UwMDFhODEsIDB4M2UwMDFhODF9LAotCXsweDAwMDBhNTRjLCAweDU5MDI1ZWIyLCAweDU5MDI1ZWIyLCAweDQyMDAxYTgzLCAweDQyMDAxYTgzfSwKLQl7MHgwMDAwYTU1MCwgMHg1ZjAyNWVmNiwgMHg1ZjAyNWVmNiwgMHg0NDAwMWM4NCwgMHg0NDAwMWM4NH0sCisJezB4MDAwMGE1NGMsIDB4NTkwMjVlYjYsIDB4NTkwMjVlYjYsIDB4NDIwMDFhODMsIDB4NDIwMDFhODN9LAorCXsweDAwMDBhNTUwLCAweDVkMDI1ZWY2LCAweDVkMDI1ZWY2LCAweDQ0MDAxYzg0LCAweDQ0MDAxYzg0fSwKIAl7MHgwMDAwYTU1NCwgMHg2MjAyNWY1NiwgMHg2MjAyNWY1NiwgMHg0ODAwMWNlMywgMHg0ODAwMWNlM30sCiAJezB4MDAwMGE1NTgsIDB4NjYwMjdmNTYsIDB4NjYwMjdmNTYsIDB4NGMwMDFjZTUsIDB4NGMwMDFjZTV9LAogCXsweDAwMDBhNTVjLCAweDZhMDI5ZjU2LCAweDZhMDI5ZjU2LCAweDUwMDAxY2U5LCAweDUwMDAxY2U5fSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hdGg5ay5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmgKaW5kZXggMWMyNjlmNS4uYWZjMTU2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAibWNpLmgiCiAKIC8qCiAgKiBIZWFkZXIgZm9yIHRoZSBhdGg5ay5rbyBkcml2ZXIgY29yZSAqb25seSogLS0gaHcgY29kZSBub3IgYW55IG90aGVyIGRyaXZlcgpAQCAtMjUyLDYgKzI1Myw3IEBACiAjaWZkZWYgQ09ORklHX0FUSDlLX0RFQlVHRlMKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGZvciBzYy0+bm9kZXMgKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOyAvKiBzdGF0aW9uIHN0cnVjdCB3ZSdyZSBwYXJ0IG9mICovCisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsgLyogaW50ZXJmYWNlIHdpdGggd2hpY2ggd2UncmUgYXNzb2NpYXRlZCAqLwogI2VuZGlmCiAJc3RydWN0IGF0aF9hdHhfdGlkIHRpZFtXTUVfTlVNX1RJRF07CiAJc3RydWN0IGF0aF9hdHhfYWMgYWNbV01FX05VTV9BQ107CkBAIC00NDMsNyArNDQ1LDkgQEAKIAl1MzIgYnRjb2V4X25vX3N0b21wOyAvKiBpbiB1c2VjICovCiAJdTMyIGJ0Y29leF9wZXJpb2Q7IC8qIGluIHVzZWMgKi8KIAl1MzIgYnRzY2FuX25vX3N0b21wOyAvKiBpbiB1c2VjICovCisJdTMyIGR1dHlfY3ljbGU7CiAJc3RydWN0IGF0aF9nZW5fdGltZXIgKm5vX3N0b21wX3RpbWVyOyAvKiBUaW1lciBmb3Igbm8gQlQgc3RvbXBpbmcgKi8KKwlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlIG1jaTsKIH07CiAKIGludCBhdGhfaW5pdF9idGNvZXhfdGltZXIoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwpAQCAtNDU4LDcgKzQ2Miw3IEBACiAjZGVmaW5lIEFUSF9MRURfUElOXzkyODcJCTgKICNkZWZpbmUgQVRIX0xFRF9QSU5fOTMwMAkJMTAKICNkZWZpbmUgQVRIX0xFRF9QSU5fOTQ4NQkJNgotI2RlZmluZSBBVEhfTEVEX1BJTl85NDYyCQkwCisjZGVmaW5lIEFUSF9MRURfUElOXzk0NjIJCTQKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9MRURTCiB2b2lkIGF0aF9pbml0X2xlZHMoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwpAQCAtNjQzLDYgKzY0Nyw3IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayB0eF9jb21wbGV0ZV93b3JrOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgaHdfcGxsX3dvcms7CiAJc3RydWN0IGF0aF9idGNvZXggYnRjb2V4OworCXN0cnVjdCBhdGhfbWNpX2NvZXggbWNpX2NvZXg7CiAKIAlzdHJ1Y3QgYXRoX2Rlc2NkbWEgdHhzZG1hOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmMKaW5kZXggNjYzNWMzNy4uYmJiMjA4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9idGNvZXguYwpAQCAtMTQsMTMgKzE0LDE0IEBACiAgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJody5oIgogCiBlbnVtIGF0aF9idF9tb2RlIHsKIAlBVEhfQlRfQ09FWF9NT0RFX0xFR0FDWSwgICAgICAgIC8qIGxlZ2FjeSByeF9jbGVhciBtb2RlICovCiAJQVRIX0JUX0NPRVhfTU9ERV9VTlNMT1RURUQsICAgICAvKiB1bnRpbWVkL3Vuc2xvdHRlZCBtb2RlICovCiAJQVRIX0JUX0NPRVhfTU9ERV9TTE9UVEVELCAgICAgICAvKiBzbG90dGVkIG1vZGUgKi8KLQlBVEhfQlRfQ09FWF9NT0RFX0RJU0FMQkVELCAgICAgIC8qIGNvZXhpc3RlbmNlIGRpc2FibGVkICovCisJQVRIX0JUX0NPRVhfTU9ERV9ESVNBQkxFRCwgICAgICAvKiBjb2V4aXN0ZW5jZSBkaXNhYmxlZCAqLwogfTsKIAogc3RydWN0IGF0aF9idGNvZXhfY29uZmlnIHsKQEAgLTM1LDYgKzM2LDIwIEBACiAJYm9vbCBidF9ob2xkX3J4X2NsZWFyOwogfTsKIAorc3RhdGljIGNvbnN0IHUzMiBhcjkwMDNfd2xhbl93ZWlnaHRzW0FUSF9CVENPRVhfU1RPTVBfTUFYXQorCQkJCSAgICBbQVI5MzAwX05VTV9XTEFOX1dFSUdIVFNdID0geworCXsgMHhmZmZmZmZmMCwgMHhmZmZmZmZmMCwgMHhmZmZmZmZmMCwgMHhmZmZmZmZmMCB9LCAvKiBTVE9NUF9BTEwgKi8KKwl7IDB4ODg4ODg4ODAsIDB4ODg4ODg4ODAsIDB4ODg4ODg4ODAsIDB4ODg4ODg4ODAgfSwgLyogU1RPTVBfTE9XICovCisJeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sIC8qIFNUT01QX05PTkUgKi8KK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5NDYyX3dsYW5fd2VpZ2h0c1tBVEhfQlRDT0VYX1NUT01QX01BWF0KKwkJCQkgICAgW0FSOTMwMF9OVU1fV0xBTl9XRUlHSFRTXSA9IHsKKwl7IDB4MDEwMTdkMDEsIDB4NDE0MTQxMDEsIDB4NDE0MTQxMDEsIDB4NDE0MTQxNDEgfSwgLyogU1RPTVBfQUxMICovCisJeyAweDAxMDE3ZDAxLCAweDNiM2IzYjAxLCAweDNiM2IzYjAxLCAweDNiM2IzYjNiIH0sIC8qIFNUT01QX0xPVyAqLworCXsgMHgwMTAxN2QwMSwgMHgwMTAxMDEwMSwgMHgwMTAxMDEwMSwgMHgwMTAxMDEwMSB9LCAvKiBTVE9NUF9OT05FICovCisJeyAweDAxMDE3ZDAxLCAweDAxM2IwMTAxLCAweDNiM2IwMTAxLCAweDNiM2IwMTNiIH0sIC8qIFNUT01QX0xPV19GVFAgKi8KK307CiAKIHZvaWQgYXRoOWtfaHdfaW5pdF9idGNvZXhfaHcoc3RydWN0IGF0aF9odyAqYWgsIGludCBxbnVtKQogewpAQCAtMTUxLDI3ICsxNjYsMjYgQEAKIAogc3RhdGljIHZvaWQgYXRoOWtfaHdfYnRjb2V4X2VuYWJsZV8zd2lyZShzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoX2J0Y29leF9odyAqYnRjb2V4X2h3ID0gJmFoLT5idGNvZXhfaHc7CisJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leCA9ICZhaC0+YnRjb2V4X2h3OwogCXUzMiAgdmFsOworCWludCBpOwogCiAJLyoKIAkgKiBQcm9ncmFtIGNvZXggbW9kZSBhbmQgd2VpZ2h0IHJlZ2lzdGVycyB0bwogCSAqIGVuYWJsZSBjb2V4IDMtd2lyZQogCSAqLwotCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9NT0RFLCBidGNvZXhfaHctPmJ0X2NvZXhfbW9kZSk7Ci0JUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX01PREUyLCBidGNvZXhfaHctPmJ0X2NvZXhfbW9kZTIpOworCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9NT0RFLCBidGNvZXgtPmJ0X2NvZXhfbW9kZSk7CisJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX01PREUyLCBidGNvZXgtPmJ0X2NvZXhfbW9kZTIpOwogCiAKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgewotCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzAsIGFoLT5idF9jb2V4X3dsYW5fd2VpZ2h0WzBdKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX1dMX1dFSUdIVFMxLCBhaC0+YnRfY29leF93bGFuX3dlaWdodFsxXSk7Ci0JCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMCwgYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzBdKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX0JUX1dFSUdIVFMxLCBhaC0+YnRfY29leF9idF93ZWlnaHRbMV0pOwotCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzIsIGFoLT5idF9jb2V4X2J0X3dlaWdodFsyXSk7Ci0JCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMywgYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzNdKTsKLQorCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzAsIGJ0Y29leC0+d2xhbl93ZWlnaHRbMF0pOworCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzEsIGJ0Y29leC0+d2xhbl93ZWlnaHRbMV0pOworCQlmb3IgKGkgPSAwOyBpIDwgQVI5MzAwX05VTV9CVF9XRUlHSFRTOyBpKyspCisJCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUyhpKSwKKwkJCQkgIGJ0Y29leC0+YnRfd2VpZ2h0W2ldKTsKIAl9IGVsc2UKLQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX1dFSUdIVCwgYnRjb2V4X2h3LT5idF9jb2V4X3dlaWdodHMpOworCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0VJR0hULCBidGNvZXgtPmJ0X2NvZXhfd2VpZ2h0cyk7CiAKIAogCkBAIC0xODQsMTAgKzE5OCwyMyBAQAogCVJFR19STVdfRklFTEQoYWgsIEFSX1FVSUVUMSwgQVJfUVVJRVQxX1FVSUVUX0FDS19DVFNfRU5BQkxFLCAxKTsKIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QQ1VfTUlTQywgQVJfUENVX0JUX0FOVF9QUkVWRU5UX1JYLCAwKTsKIAotCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGJ0Y29leF9ody0+d2xhbmFjdGl2ZV9ncGlvLAorCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGJ0Y29leC0+d2xhbmFjdGl2ZV9ncGlvLAogCQkJICAgIEFSX0dQSU9fT1VUUFVUX01VWF9BU19SWF9DTEVBUl9FWFRFUk5BTCk7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2J0Y29leF9lbmFibGVfbWNpKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfYnRjb2V4X2h3ICpidGNvZXggPSAmYWgtPmJ0Y29leF9odzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUjkzMDBfTlVNX0JUX1dFSUdIVFM7IGkrKykKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQ09FWF9XTF9XRUlHSFRTKGkpLAorCQkJICBidGNvZXgtPndsYW5fd2VpZ2h0W2ldKTsKKworCVJFR19STVdfRklFTEQoYWgsIEFSX1FVSUVUMSwgQVJfUVVJRVQxX1FVSUVUX0FDS19DVFNfRU5BQkxFLCAxKTsKKwlidGNvZXgtPmVuYWJsZWQgPSB0cnVlOworfQorCiB2b2lkIGF0aDlrX2h3X2J0Y29leF9lbmFibGUoc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leF9odyA9ICZhaC0+YnRjb2V4X2h3OwpAQCAtMjAxLDYgKzIyOCw5IEBACiAJY2FzZSBBVEhfQlRDT0VYX0NGR18zV0lSRToKIAkJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZV8zd2lyZShhaCk7CiAJCWJyZWFrOworCWNhc2UgQVRIX0JUQ09FWF9DRkdfTUNJOgorCQlhdGg5a19od19idGNvZXhfZW5hYmxlX21jaShhaCk7CisJCXJldHVybjsKIAl9CiAKIAlSRUdfUk1XKGFoLCBBUl9HUElPX1BEUFUsCkBAIC0yMTQsNyArMjQ0LDE1IEBACiB2b2lkIGF0aDlrX2h3X2J0Y29leF9kaXNhYmxlKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXN0cnVjdCBhdGhfYnRjb2V4X2h3ICpidGNvZXhfaHcgPSAmYWgtPmJ0Y29leF9odzsKKwlpbnQgaTsKIAorCWJ0Y29leF9ody0+ZW5hYmxlZCA9IGZhbHNlOworCWlmIChidGNvZXhfaHctPnNjaGVtZSA9PSBBVEhfQlRDT0VYX0NGR19NQ0kpIHsKKwkJYXRoOWtfaHdfYnRjb2V4X2J0X3N0b21wKGFoLCBBVEhfQlRDT0VYX1NUT01QX05PTkUpOworCQlmb3IgKGkgPSAwOyBpIDwgQVI5MzAwX05VTV9CVF9XRUlHSFRTOyBpKyspCisJCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9DT0VYX1dMX1dFSUdIVFMoaSksCisJCQkJICBidGNvZXhfaHctPndsYW5fd2VpZ2h0W2ldKTsKKwl9CiAJYXRoOWtfaHdfc2V0X2dwaW8oYWgsIGJ0Y29leF9ody0+d2xhbmFjdGl2ZV9ncGlvLCAwKTsKIAogCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGJ0Y29leF9ody0+d2xhbmFjdGl2ZV9ncGlvLApAQCAtMjI3LDQ5ICsyNjUsMjcgQEAKIAkJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9XTF9XRUlHSFRTMCwgMCk7CiAJCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzEsIDApOwotCQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX0JUX1dFSUdIVFMwLCAwKTsKLQkJCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMSwgMCk7Ci0JCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzIsIDApOwotCQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX0JUX1dFSUdIVFMzLCAwKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUjkzMDBfTlVNX0JUX1dFSUdIVFM7IGkrKykKKwkJCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUyhpKSwgMCk7CiAJCX0gZWxzZQogCQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX1dFSUdIVCwgMCk7CiAKIAl9Ci0KLQlhaC0+YnRjb2V4X2h3LmVuYWJsZWQgPSBmYWxzZTsKIH0KIEVYUE9SVF9TWU1CT0woYXRoOWtfaHdfYnRjb2V4X2Rpc2FibGUpOwogCiBzdGF0aWMgdm9pZCBhcjkwMDNfYnRjb2V4X2J0X3N0b21wKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJIGVudW0gYXRoX3N0b21wX3R5cGUgc3RvbXBfdHlwZSkKIHsKLQlhaC0+YnRfY29leF9idF93ZWlnaHRbMF0gPSBBUjkzMDBfQlRfV0dIVDsKLQlhaC0+YnRfY29leF9idF93ZWlnaHRbMV0gPSBBUjkzMDBfQlRfV0dIVDsKLQlhaC0+YnRfY29leF9idF93ZWlnaHRbMl0gPSBBUjkzMDBfQlRfV0dIVDsKLQlhaC0+YnRfY29leF9idF93ZWlnaHRbM10gPSBBUjkzMDBfQlRfV0dIVDsKKwlzdHJ1Y3QgYXRoX2J0Y29leF9odyAqYnRjb2V4ID0gJmFoLT5idGNvZXhfaHc7CisJY29uc3QgdTMyICp3ZWlnaHQgPSBBUl9TUkVWXzk0NjIoYWgpID8gYXI5MDAzX3dsYW5fd2VpZ2h0c1tzdG9tcF90eXBlXSA6CisJCQkJCSAgICAgICBhcjk0NjJfd2xhbl93ZWlnaHRzW3N0b21wX3R5cGVdOworCWludCBpOwogCi0KLQlzd2l0Y2ggKHN0b21wX3R5cGUpIHsKLQljYXNlIEFUSF9CVENPRVhfU1RPTVBfQUxMOgotCQlhaC0+YnRfY29leF93bGFuX3dlaWdodFswXSA9IEFSOTMwMF9TVE9NUF9BTExfV0xBTl9XR0hUMDsKLQkJYWgtPmJ0X2NvZXhfd2xhbl93ZWlnaHRbMV0gPSBBUjkzMDBfU1RPTVBfQUxMX1dMQU5fV0dIVDE7Ci0JCWJyZWFrOwotCWNhc2UgQVRIX0JUQ09FWF9TVE9NUF9MT1c6Ci0JCWFoLT5idF9jb2V4X3dsYW5fd2VpZ2h0WzBdID0gQVI5MzAwX1NUT01QX0xPV19XTEFOX1dHSFQwOwotCQlhaC0+YnRfY29leF93bGFuX3dlaWdodFsxXSA9IEFSOTMwMF9TVE9NUF9MT1dfV0xBTl9XR0hUMTsKLQkJYnJlYWs7Ci0JY2FzZSBBVEhfQlRDT0VYX1NUT01QX05PTkU6Ci0JCWFoLT5idF9jb2V4X3dsYW5fd2VpZ2h0WzBdID0gQVI5MzAwX1NUT01QX05PTkVfV0xBTl9XR0hUMDsKLQkJYWgtPmJ0X2NvZXhfd2xhbl93ZWlnaHRbMV0gPSBBUjkzMDBfU1RPTVBfTk9ORV9XTEFOX1dHSFQxOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19CVENPRVgsCi0JCQkJIkludmFsaWQgU3RvbXB0eXBlXG4iKTsKLQkJYnJlYWs7CisJZm9yIChpID0gMDsgaSA8IEFSOTMwMF9OVU1fV0xBTl9XRUlHSFRTOyBpKyspIHsKKwkJYnRjb2V4LT5idF93ZWlnaHRbaV0gPSBBUjkzMDBfQlRfV0dIVDsKKwkJYnRjb2V4LT53bGFuX3dlaWdodFtpXSA9IHdlaWdodFtpXTsKIAl9Ci0KLQlhdGg5a19od19idGNvZXhfZW5hYmxlKGFoKTsKIH0KIAogLyoKQEAgLTMwMSw3ICszMTcsNSBAQAogCQkJCSJJbnZhbGlkIFN0b21wdHlwZVxuIik7CiAJCWJyZWFrOwogCX0KLQotCWF0aDlrX2h3X2J0Y29leF9lbmFibGUoYWgpOwogfQogRVhQT1JUX1NZTUJPTChhdGg5a19od19idGNvZXhfYnRfc3RvbXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5oCmluZGV4IDIzNGY3NzYuLjI3ODM2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9idGNvZXguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmgKQEAgLTM2LDIyICszNiw1NyBAQAogI2RlZmluZSBBVEhfQlRfQ05UX1RIUkVTSE9MRAkgICAgICAgMwogI2RlZmluZSBBVEhfQlRfQ05UX1NDQU5fVEhSRVNIT0xEICAgICAgMTUKIAorI2RlZmluZSBBUjkzMDBfTlVNX0JUX1dFSUdIVFMgICA0CisjZGVmaW5lIEFSOTMwMF9OVU1fV0xBTl9XRUlHSFRTIDQKIC8qIERlZmluZXMgdGhlIEJUIEFSX0JUX0NPRVhfV0dIVCB1c2VkICovCiBlbnVtIGF0aF9zdG9tcF90eXBlIHsKLQlBVEhfQlRDT0VYX05PX1NUT01QLAogCUFUSF9CVENPRVhfU1RPTVBfQUxMLAogCUFUSF9CVENPRVhfU1RPTVBfTE9XLAotCUFUSF9CVENPRVhfU1RPTVBfTk9ORQorCUFUSF9CVENPRVhfU1RPTVBfTk9ORSwKKwlBVEhfQlRDT0VYX1NUT01QX0xPV19GVFAsCisJQVRIX0JUQ09FWF9TVE9NUF9NQVgKIH07CiAKIGVudW0gYXRoX2J0Y29leF9zY2hlbWUgewogCUFUSF9CVENPRVhfQ0ZHX05PTkUsCiAJQVRIX0JUQ09FWF9DRkdfMldJUkUsCiAJQVRIX0JUQ09FWF9DRkdfM1dJUkUsCisJQVRIX0JUQ09FWF9DRkdfTUNJLAorfTsKKworc3RydWN0IGF0aDlrX2h3X21jaSB7CisJdTMyIHJhd19pbnRyOworCXUzMiByeF9tc2dfaW50cjsKKwl1MzIgY29udF9zdGF0dXM7CisJdTMyIGdwbV9hZGRyOworCXUzMiBncG1fbGVuOworCXUzMiBncG1faWR4OworCXUzMiBzY2hlZF9hZGRyOworCXUzMiB3bGFuX2NoYW5uZWxzWzRdOworCXUzMiB3bGFuX2NhbF9zZXE7CisJdTMyIHdsYW5fY2FsX2RvbmU7CisJdTMyIGNvbmZpZzsKKwl1OCAqZ3BtX2J1ZjsKKwl1OCAqc2NoZWRfYnVmOworCWJvb2wgcmVhZHk7CisJYm9vbCB1cGRhdGVfMmc1ZzsKKwlib29sIGlzXzJnOworCWJvb2wgcXVlcnlfYnQ7CisJYm9vbCB1bmhhbHRfYnRfZ3BtOyAvKiBuZWVkIHNlbmQgVU5IQUxUICovCisJYm9vbCBoYWx0ZWRfYnRfZ3BtOyAvKiBIQUxUIHNlbnQgKi8KKwlib29sIG5lZWRfZmx1c2hfYnRpbmZvOworCWJvb2wgYnRfdmVyc2lvbl9rbm93bjsKKwlib29sIHdsYW5fY2hhbm5lbHNfdXBkYXRlOworCXU4IHdsYW5fdmVyX21ham9yOworCXU4IHdsYW5fdmVyX21pbm9yOworCXU4IGJ0X3Zlcl9tYWpvcjsKKwl1OCBidF92ZXJfbWlub3I7CisJdTggYnRfc3RhdGU7CiB9OwogCiBzdHJ1Y3QgYXRoX2J0Y29leF9odyB7CiAJZW51bSBhdGhfYnRjb2V4X3NjaGVtZSBzY2hlbWU7CisJc3RydWN0IGF0aDlrX2h3X21jaSBtY2k7CiAJYm9vbCBlbmFibGVkOwogCXU4IHdsYW5hY3RpdmVfZ3BpbzsKIAl1OCBidGFjdGl2ZV9ncGlvOwpAQCAtNTksNiArOTQsOCBAQAogCXUzMiBidF9jb2V4X21vZGU7IAkvKiBSZWdpc3RlciBzZXR0aW5nIGZvciBBUl9CVF9DT0VYX01PREUgKi8KIAl1MzIgYnRfY29leF93ZWlnaHRzOyAJLyogUmVnaXN0ZXIgc2V0dGluZyBmb3IgQVJfQlRfQ09FWF9XRUlHSFQgKi8KIAl1MzIgYnRfY29leF9tb2RlMjsgCS8qIFJlZ2lzdGVyIHNldHRpbmcgZm9yIEFSX0JUX0NPRVhfTU9ERTIgKi8KKwl1MzIgYnRfd2VpZ2h0W0FSOTMwMF9OVU1fQlRfV0VJR0hUU107CisJdTMyIHdsYW5fd2VpZ2h0W0FSOTMwMF9OVU1fV0xBTl9XRUlHSFRTXTsKIH07CiAKIHZvaWQgYXRoOWtfaHdfYnRjb2V4X2luaXRfMndpcmUoc3RydWN0IGF0aF9odyAqYWgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwppbmRleCBlYmFmMzA0Li45OTUzODgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJody1vcHMuaCIKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyogQ29tbW9uIGNhbGlicmF0aW9uIGNvZGUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYwppbmRleCAzMjdhYTI4Li42ZmI3MTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlICJhdGg5ay5oIgpAQCAtNzA4LDI0ICs3MDksMjkgQEAKIAogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCiAJCQkiU3RhdGlvbnM6XG4iCi0JCQkiIHRpZDogYWRkciBzY2hlZCBwYXVzZWQgYnVmX3EtZW1wdHkgYW4gYWNcbiIKKwkJCSIgdGlkOiBhZGRyIHNjaGVkIHBhdXNlZCBidWZfcS1lbXB0eSBhbiBhYyBiYXdcbiIKIAkJCSIgYWM6IGFkZHIgc2NoZWQgdGlkX3EtZW1wdHkgdHhxXG4iKTsKIAogCXNwaW5fbG9jaygmc2MtPm5vZGVzX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYW4sICZzYy0+bm9kZXMsIGxpc3QpIHsKKwkJdW5zaWduZWQgc2hvcnQgbWEgPSBhbi0+bWF4YW1wZHU7CisJCWlmIChtYSA9PSAwKQorCQkJbWEgPSA2NTUzNTsgLyogc2VlIGF0aF9sb29rdXBfcmF0ZSAqLwogCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAotCQkJCSIlcE1cbiIsIGFuLT5zdGEtPmFkZHIpOworCQkJCSJpZmFjZTogJXBNICBzdGE6ICVwTSBtYXgtYW1wZHU6ICVodSBtcGR1LWRlbnNpdHk6ICV1dXNcbiIsCisJCQkJYW4tPnZpZi0+YWRkciwgYW4tPnN0YS0+YWRkciwgbWEsCisJCQkJKHVuc2lnbmVkIGludCkoYW4tPm1wZHVkZW5zaXR5KSk7CiAJCWlmIChsZW4gPj0gc2l6ZSkKIAkJCWdvdG8gZG9uZTsKIAogCQlmb3IgKHEgPSAwOyBxIDwgV01FX05VTV9USUQ7IHErKykgewogCQkJc3RydWN0IGF0aF9hdHhfdGlkICp0aWQgPSAmKGFuLT50aWRbcV0pOwogCQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwKLQkJCQkJIiB0aWQ6ICVwICVzICVzICVpICVwICVwXG4iLAorCQkJCQkiIHRpZDogJXAgJXMgJXMgJWkgJXAgJXAgJWh1XG4iLAogCQkJCQl0aWQsIHRpZC0+c2NoZWQgPyAic2NoZWQiIDogImlkbGUiLAogCQkJCQl0aWQtPnBhdXNlZCA/ICJwYXVzZWQiIDogInJ1bm5pbmciLAogCQkJCQlza2JfcXVldWVfZW1wdHkoJnRpZC0+YnVmX3EpLAotCQkJCQl0aWQtPmFuLCB0aWQtPmFjKTsKKwkJCQkJdGlkLT5hbiwgdGlkLT5hYywgdGlkLT5iYXdfc2l6ZSk7CiAJCQlpZiAobGVuID49IHNpemUpCiAJCQkJZ290byBkb25lOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmgKaW5kZXggNDlhYmQzNC4uNWZmN2FiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb20uaApAQCAtMjQ5LDcgKzI0OSw4IEBACiAJRUVQX0FOVF9ESVZfQ1RMMSwKIAlFRVBfQ0hBSU5fTUFTS19SRURVQ0UsCiAJRUVQX0FOVEVOTkFfR0FJTl8yRywKLQlFRVBfQU5URU5OQV9HQUlOXzVHCisJRUVQX0FOVEVOTkFfR0FJTl81RywKKwlFRVBfUVVJQ0tfRFJPUAogfTsKIAogZW51bSBhcjU0MTZfcmF0ZXMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV80ay5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV80ay5jCmluZGV4IDlhNzUyMGYuLjYxZmNhYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fNGsuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzRrLmMKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCiAJaW50IGk7CiAJdTE2IHR3aWNlTWluRWRnZVBvd2VyOwotCXUxNiB0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOworCXUxNiB0d2ljZU1heEVkZ2VQb3dlcjsKIAl1MTYgc2NhbGVkUG93ZXIgPSAwLCBtaW5DdGxQb3dlcjsKIAl1MTYgbnVtQ3RsTW9kZXM7CiAJY29uc3QgdTE2ICpwQ3RsTW9kZTsKQEAgLTU0Miw5ICs1NDIsNyBAQAogCQllbHNlCiAJCQlmcmVxID0gY2VudGVycy5jdGxfY2VudGVyOwogCi0JCWlmIChhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV92ZXIoYWgpID09IDE0ICYmCi0JCSAgICBhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV9yZXYoYWgpIDw9IDIpCi0JCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOworCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOwogCiAJCWZvciAoaSA9IDA7IChpIDwgQVI1NDE2X0VFUDRLX05VTV9DVExTKSAmJgogCQkJICAgICBwRWVwRGF0YS0+Y3RsSW5kZXhbaV07IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV85Mjg3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwppbmRleCA0ZjVjNTBhLi4wOTgxYzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwpAQCAtNTY5LDcgKzU2OSw3IEBACiAjZGVmaW5lIFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVFdPX0NIQUlOICAgICA2CiAjZGVmaW5lIFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU4gICAxMAogCi0JdTE2IHR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CisJdTE2IHR3aWNlTWF4RWRnZVBvd2VyOwogCWludCBpOwogCXN0cnVjdCBjYWxfY3RsX2RhdGFfYXI5Mjg3ICpyZXA7CiAJc3RydWN0IGNhbF90YXJnZXRfcG93ZXJfbGVnIHRhcmdldFBvd2VyT2ZkbSA9IHswLCB7MCwgMCwgMCwgMH0gfSwKQEAgLTY2OSw2ICs2NjksNyBAQAogCQllbHNlCiAJCQlmcmVxID0gY2VudGVycy5jdGxfY2VudGVyOwogCisJCXR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CiAJCS8qIFdhbGsgdGhyb3VnaCB0aGUgQ1RMIGluZGljZXMgc3RvcmVkIGluIEVFUFJPTSAqLwogCQlmb3IgKGkgPSAwOyAoaSA8IEFSOTI4N19OVU1fQ1RMUykgJiYgcEVlcERhdGEtPmN0bEluZGV4W2ldOyBpKyspIHsKIAkJCXN0cnVjdCBjYWxfY3RsX2VkZ2VzICpwUmRFZGdlc1Bvd2VyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fZGVmLmMKaW5kZXggODFlNjI5Ni4uNTVhMjFkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tX2RlZi5jCkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogI2RlZmluZSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOICAgOSAvKiAxMCpsb2cxMCgzKSoyICovCiAKIAlzdHJ1Y3QgYXI1NDE2X2VlcHJvbV9kZWYgKnBFZXBEYXRhID0gJmFoLT5lZXByb20uZGVmOwotCXUxNiB0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOworCXUxNiB0d2ljZU1heEVkZ2VQb3dlcjsKIAlpbnQgaTsKIAlzdHJ1Y3QgY2FsX2N0bF9kYXRhICpyZXA7CiAJc3RydWN0IGNhbF90YXJnZXRfcG93ZXJfbGVnIHRhcmdldFBvd2VyT2ZkbSwgdGFyZ2V0UG93ZXJDY2sgPSB7CkBAIC0xMTIxLDkgKzExMjEsNyBAQAogCQllbHNlCiAJCQlmcmVxID0gY2VudGVycy5jdGxfY2VudGVyOwogCi0JCWlmIChhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV92ZXIoYWgpID09IDE0ICYmCi0JCSAgICBhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV9yZXYoYWgpIDw9IDIpCi0JCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOworCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOwogCiAJCWZvciAoaSA9IDA7IChpIDwgQVI1NDE2X05VTV9DVExTKSAmJiBwRWVwRGF0YS0+Y3RsSW5kZXhbaV07IGkrKykgewogCQkJaWYgKCgoKGNmZ0N0bCAmIH5DVExfTU9ERV9NKSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2dwaW8uYwppbmRleCA2NTU1NzZjLi5lNGFlMDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMKQEAgLTE4OSw4ICsxODksOCBAQAogCWJvb2wgaXNfYnRzY2FuOwogCiAJYXRoOWtfcHNfd2FrZXVwKHNjKTsKLQlhdGhfZGV0ZWN0X2J0X3ByaW9yaXR5KHNjKTsKLQorCWlmICghKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKSkKKwkJYXRoX2RldGVjdF9idF9wcmlvcml0eShzYyk7CiAJaXNfYnRzY2FuID0gc2MtPnNjX2ZsYWdzICYgU0NfT1BfQlRfU0NBTjsKIAogCXNwaW5fbG9ja19iaCgmYnRjb2V4LT5idGNvZXhfbG9jayk7CkBAIC0xOTgsNiArMTk4LDcgQEAKIAlhdGg5a19od19idGNvZXhfYnRfc3RvbXAoYWgsIGlzX2J0c2NhbiA/IEFUSF9CVENPRVhfU1RPTVBfQUxMIDoKIAkJCSAgICAgIGJ0Y29leC0+YnRfc3RvbXBfdHlwZSk7CiAKKwlhdGg5a19od19idGNvZXhfZW5hYmxlKGFoKTsKIAlzcGluX3VubG9ja19iaCgmYnRjb2V4LT5idGNvZXhfbG9jayk7CiAKIAlpZiAoYnRjb2V4LT5idGNvZXhfcGVyaW9kICE9IGJ0Y29leC0+YnRjb2V4X25vX3N0b21wKSB7CkBAIC0yMTIsOCArMjEzLDkgQEAKIAl9CiAKIAlhdGg5a19wc19yZXN0b3JlKHNjKTsKKwl0aW1lcl9wZXJpb2QgPSBidGNvZXgtPmJ0Y29leF9wZXJpb2QgLyAxMDAwOwogCW1vZF90aW1lcigmYnRjb2V4LT5wZXJpb2RfdGltZXIsIGppZmZpZXMgKwotCQkJCSAgbXNlY3NfdG9famlmZmllcyhBVEhfQlRDT0VYX0RFRl9CVF9QRVJJT0QpKTsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXModGltZXJfcGVyaW9kKSk7CiB9CiAKIC8qCkBAIC0yMzksNiArMjQxLDcgQEAKIAkgZWxzZSBpZiAoYnRjb2V4LT5idF9zdG9tcF90eXBlID09IEFUSF9CVENPRVhfU1RPTVBfQUxMKQogCQlhdGg5a19od19idGNvZXhfYnRfc3RvbXAoYWgsIEFUSF9CVENPRVhfU1RPTVBfTE9XKTsKIAorCWF0aDlrX2h3X2J0Y29leF9lbmFibGUoYWgpOwogCXNwaW5fdW5sb2NrX2JoKCZidGNvZXgtPmJ0Y29leF9sb2NrKTsKIAlhdGg5a19wc19yZXN0b3JlKHNjKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2dwaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2dwaW8uYwppbmRleCBlM2EwMmViLi5jZTYwNmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9ncGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfZ3Bpby5jCkBAIC04MCw2ICs4MCw3IEBACiAJYXRoOWtfaHdfYnRjb2V4X2J0X3N0b21wKHByaXYtPmFoLCBpc19idHNjYW4gPyBBVEhfQlRDT0VYX1NUT01QX0FMTCA6CiAJCQlidGNvZXgtPmJ0X3N0b21wX3R5cGUpOwogCisJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShwcml2LT5haCk7CiAJdGltZXJfcGVyaW9kID0gaXNfYnRzY2FuID8gYnRjb2V4LT5idHNjYW5fbm9fc3RvbXAgOgogCQlidGNvZXgtPmJ0Y29leF9ub19zdG9tcDsKIAlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmh3LCAmcHJpdi0+ZHV0eV9jeWNsZV93b3JrLApAQCAtMTA4LDYgKzEwOSw3IEBACiAJCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgQVRIX0JUQ09FWF9TVE9NUF9OT05FKTsKIAllbHNlIGlmIChidGNvZXgtPmJ0X3N0b21wX3R5cGUgPT0gQVRIX0JUQ09FWF9TVE9NUF9BTEwpCiAJCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgQVRIX0JUQ09FWF9TVE9NUF9MT1cpOworCWF0aDlrX2h3X2J0Y29leF9lbmFibGUocHJpdi0+YWgpOwogfQogCiB2b2lkIGF0aF9odGNfaW5pdF9idGNvZXhfd29yayhzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCmluZGV4IDdhOWM2ZjcuLmNhZjU3MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlICJody5oIgpAQCAtMTM0OSw2ICsxMzUwLDcgQEAKIAogc3RhdGljIGJvb2wgYXRoOWtfaHdfc2V0X3Jlc2V0X3JlZyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHR5cGUpCiB7CisJYm9vbCByZXQgPSBmYWxzZTsKIAogCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCVJFR19XUklURShhaCwgQVJfV0EsIGFoLT5XQVJlZ1ZhbCk7CkBAIC0xMzYwLDEzICsxMzYyLDIwIEBACiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFUSDlLX1JFU0VUX1BPV0VSX09OOgotCQlyZXR1cm4gYXRoOWtfaHdfc2V0X3Jlc2V0X3Bvd2VyX29uKGFoKTsKKwkJcmV0ID0gYXRoOWtfaHdfc2V0X3Jlc2V0X3Bvd2VyX29uKGFoKTsKKwkJYnJlYWs7CiAJY2FzZSBBVEg5S19SRVNFVF9XQVJNOgogCWNhc2UgQVRIOUtfUkVTRVRfQ09MRDoKLQkJcmV0dXJuIGF0aDlrX2h3X3NldF9yZXNldChhaCwgdHlwZSk7CisJCXJldCA9IGF0aDlrX2h3X3NldF9yZXNldChhaCwgdHlwZSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiBmYWxzZTsKKwkJYnJlYWs7CiAJfQorCisJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKQorCQlSRUdfV1JJVEUoYWgsIEFSX1JUQ19LRUVQX0FXQUtFLCAweDIpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGJvb2wgYXRoOWtfaHdfY2hpcF9yZXNldChzdHJ1Y3QgYXRoX2h3ICphaCwKQEAgLTE1MDUsNiArMTUxNCw3IEBACiAJCSAgIHN0cnVjdCBhdGg5a19od19jYWxfZGF0YSAqY2FsZGF0YSwgYm9vbCBiQ2hhbm5lbENoYW5nZSkKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2lfaHcgPSAmYWgtPmJ0Y29leF9ody5tY2k7CiAJdTMyIHNhdmVMZWRTdGF0ZTsKIAlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY3VyY2hhbiA9IGFoLT5jdXJjaGFuOwogCXUzMiBzYXZlRGVmQW50ZW5uYTsKQEAgLTE1MTIsNiArMTUyMiw1MyBAQAogCXU2NCB0c2YgPSAwOwogCWludCBpLCByOwogCWJvb2wgYWxsb3dfZmJzID0gZmFsc2U7CisJYm9vbCBtY2kgPSAhIShhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSk7CisJYm9vbCBzYXZlX2Z1bGxzbGVlcCA9IGFoLT5jaGlwX2Z1bGxzbGVlcDsKKworCWlmIChtY2kpIHsKKworCQlhcjkwMDNfbWNpXzJnNWdfY2hhbmdlZChhaCwgSVNfQ0hBTl8yR0haKGNoYW4pKTsKKworCQlpZiAobWNpX2h3LT5idF9zdGF0ZSA9PSBNQ0lfQlRfQ0FMX1NUQVJUKSB7CisJCQl1MzIgcGF5bG9hZFs0XSA9IHswLCAwLCAwLCAwfTsKKworCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIHN0b3AgcnggZm9yIEJUIENBTCIpOworCisJCQltY2lfaHctPmJ0X3N0YXRlID0gTUNJX0JUX0NBTDsKKworCQkJLyoKKwkJCSAqIE1DSSBGSVg6IGRpc2FibGUgbWNpIGludGVycnVwdCBoZXJlLiBUaGlzIGlzIHRvIGF2b2lkCisJCQkgKiBTV19NU0dfRE9ORSBvciBSWF9NU0cgYml0cyB0byB0cmlnZ2VyIE1DSV9JTlQgYW5kCisJCQkgKiBsZWFkIHRvIG1jaV9pbnRyIHJlZW50cnkuCisJCQkgKi8KKworCQkJYXI5MDAzX21jaV9kaXNhYmxlX2ludGVycnVwdChhaCk7CisKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgInNlbmQgV0xBTl9DQUxfR1JBTlQiKTsKKwkJCU1DSV9HUE1fU0VUX0NBTF9UWVBFKHBheWxvYWQsIE1DSV9HUE1fV0xBTl9DQUxfR1JBTlQpOworCQkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBheWxvYWQsCisJCQkJCQkxNiwgdHJ1ZSwgZmFsc2UpOworCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJcbk1DSSBCVCBpcyBjYWxpYnJhdGluZyIpOworCisJCQkvKiBXYWl0IEJUIGNhbGlicmF0aW9uIHRvIGJlIGNvbXBsZXRlZCBmb3IgMjVtcyAqLworCisJCQlpZiAoYXI5MDAzX21jaV93YWl0X2Zvcl9ncG0oYWgsIE1DSV9HUE1fQlRfQ0FMX0RPTkUsCisJCQkJCQkJCSAgMCwgMjUwMDApKQorCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSBnb3QgQlRfQ0FMX0RPTkVcbiIpOworCQkJZWxzZQorCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSAjIyMgQlQgY2FsIHRha2VzIHRvIGxvbmcsIGZvcmNlIgorCQkJCQkiYnRfc3RhdGUgdG8gYmUgYnRfYXdha2VcbiIpOworCQkJbWNpX2h3LT5idF9zdGF0ZSA9IE1DSV9CVF9BV0FLRTsKKwkJCS8qIE1DSSBGSVg6IGVuYWJsZSBtY2kgaW50ZXJydXB0IGhlcmUgKi8KKwkJCWFyOTAwM19tY2lfZW5hYmxlX2ludGVycnVwdChhaCk7CisKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCiAKIAlpZiAoIWF0aDlrX2h3X3NldHBvd2VyKGFoLCBBVEg5S19QTV9BV0FLRSkpCiAJCXJldHVybiAtRUlPOwpAQCAtMTU0OSwxMiArMTYwNiwyOSBAQAogCQlpZiAoYXRoOWtfaHdfY2hhbm5lbF9jaGFuZ2UoYWgsIGNoYW4pKSB7CiAJCQlhdGg5a19od19sb2FkbmYoYWgsIGFoLT5jdXJjaGFuKTsKIAkJCWF0aDlrX2h3X3N0YXJ0X25mY2FsKGFoLCB0cnVlKTsKKwkJCWlmIChtY2kgJiYgbWNpX2h3LT5yZWFkeSkKKwkJCQlhcjkwMDNfbWNpXzJnNWdfc3dpdGNoKGFoLCB0cnVlKTsKKwogCQkJaWYgKEFSX1NSRVZfOTI3MShhaCkpCiAJCQkJYXI5MDAyX2h3X2xvYWRfYW5pX3JlZyhhaCwgY2hhbik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAorCWlmIChtY2kpIHsKKwkJYXI5MDAzX21jaV9kaXNhYmxlX2ludGVycnVwdChhaCk7CisKKwkJaWYgKG1jaV9ody0+cmVhZHkgJiYgIXNhdmVfZnVsbHNsZWVwKSB7CisJCQlhcjkwMDNfbWNpX211dGVfYnQoYWgpOworCQkJdWRlbGF5KDIwKTsKKwkJCVJFR19XUklURShhaCwgQVJfQlRDT0VYX0NUUkwsIDApOworCQl9CisKKwkJbWNpX2h3LT5idF9zdGF0ZSA9IE1DSV9CVF9TTEVFUDsKKwkJbWNpX2h3LT5yZWFkeSA9IGZhbHNlOworCX0KKworCiAJc2F2ZURlZkFudGVubmEgPSBSRUdfUkVBRChhaCwgQVJfREVGX0FOVEVOTkEpOwogCWlmIChzYXZlRGVmQW50ZW5uYSA9PSAwKQogCQlzYXZlRGVmQW50ZW5uYSA9IDE7CkBAIC0xNjEwLDYgKzE2ODQsOSBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAorCWlmIChtY2kpCisJCWFyOTAwM19tY2lfcmVzZXQoYWgsIGZhbHNlLCBJU19DSEFOXzJHSFooY2hhbiksIHNhdmVfZnVsbHNsZWVwKTsKKwogCS8qCiAJICogU29tZSBBUjkxeHggU29DIGRldmljZXMgZnJlcXVlbnRseSBmYWlsIHRvIGFjY2VwdCBUU0Ygd3JpdGVzCiAJICogcmlnaHQgYWZ0ZXIgdGhlIGNoaXAgcmVzZXQuIFdoZW4gdGhhdCBoYXBwZW5zLCB3cml0ZSBhIG5ldwpAQCAtMTcyNyw2ICsxODA0LDU1IEBACiAJYXRoOWtfaHdfbG9hZG5mKGFoLCBjaGFuKTsKIAlhdGg5a19od19zdGFydF9uZmNhbChhaCwgdHJ1ZSk7CiAKKwlpZiAobWNpICYmIG1jaV9ody0+cmVhZHkpIHsKKworCQlpZiAoSVNfQ0hBTl8yR0haKGNoYW4pICYmCisJCSAgICAobWNpX2h3LT5idF9zdGF0ZSA9PSBNQ0lfQlRfU0xFRVApKSB7CisKKwkJCWlmIChhcjkwMDNfbWNpX2NoZWNrX2ludChhaCwKKwkJCSAgICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRU1PVEVfUkVTRVQpIHx8CisJCQkgICAgYXI5MDAzX21jaV9jaGVja19pbnQoYWgsCisJCQkgICAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UpKSB7CisKKwkJCQkvKgorCQkJCSAqIEJUIGlzIHNsZWVwaW5nLiBDaGVjayBpZiBCVCB3YWtlcyB1cCBkdXJpbmcKKwkJCQkgKiBXTEFOIGNhbGlicmF0aW9uLiBJZiBCVCB3YWtlcyB1cCBkdXJpbmcKKwkJCQkgKiBXTEFOIGNhbGlicmF0aW9uLCBuZWVkIHRvIGdvIHRocm91Z2ggYWxsCisJCQkJICogbWVzc2FnZSBleGNoYW5nZXMgYWdhaW4gYW5kIHJlY2FsLgorCQkJCSAqLworCisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIEJUIHdha2VzIHVwIgorCQkJCQkiZHVyaW5nIFdMQU4gY2FsaWJyYXRpb25cbiIpOworCisJCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVNT1RFX1JFU0VUIHwKKwkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRSk7CisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIHNlbmQiCisJCQkJCSJSRU1PVEVfUkVTRVRcbiIpOworCQkJCWFyOTAwM19tY2lfcmVtb3RlX3Jlc2V0KGFoLCB0cnVlKTsKKwkJCQlhcjkwMDNfbWNpX3NlbmRfc3lzX3dha2luZyhhaCwgdHJ1ZSk7CisJCQkJdWRlbGF5KDEpOworCQkJCWlmIChJU19DSEFOXzJHSFooY2hhbikpCisJCQkJCWFyOTAwM19tY2lfc2VuZF9sbmFfdHJhbnNmZXIoYWgsIHRydWUpOworCisJCQkJbWNpX2h3LT5idF9zdGF0ZSA9IE1DSV9CVF9BV0FLRTsKKworCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSByZS1jYWxcbiIpOworCisJCQkJaWYgKGNhbGRhdGEpIHsKKwkJCQkJY2FsZGF0YS0+ZG9uZV90eGlxY2FsX29uY2UgPSBmYWxzZTsKKwkJCQkJY2FsZGF0YS0+ZG9uZV90eGNsY2FsX29uY2UgPSBmYWxzZTsKKwkJCQkJY2FsZGF0YS0+cnR0X2hpc3QubnVtX3JlYWRpbmdzID0gMDsKKwkJCQl9CisKKwkJCQlpZiAoIWF0aDlrX2h3X2luaXRfY2FsKGFoLCBjaGFuKSkKKwkJCQkJcmV0dXJuIC1FSU87CisKKwkJCX0KKwkJfQorCQlhcjkwMDNfbWNpX2VuYWJsZV9pbnRlcnJ1cHQoYWgpOworCX0KKwogCUVOQUJMRV9SRUdXUklURV9CVUZGRVIoYWgpOwogCiAJYXRoOWtfaHdfcmVzdG9yZV9jaGFpbm1hc2soYWgpOwpAQCAtMTc2OSw2ICsxODk1LDIxIEBACiAJaWYgKGFoLT5idGNvZXhfaHcuZW5hYmxlZCkKIAkJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShhaCk7CiAKKwlpZiAobWNpICYmIG1jaV9ody0+cmVhZHkpIHsKKwkJLyoKKwkJICogY2hlY2sgQlQgc3RhdGUgYWdhaW4gdG8gbWFrZQorCQkgKiBzdXJlIGl0J3Mgbm90IGNoYW5nZWQuCisJCSAqLworCisJCWFyOTAwM19tY2lfc3luY19idF9zdGF0ZShhaCk7CisJCWFyOTAwM19tY2lfMmc1Z19zd2l0Y2goYWgsIHRydWUpOworCisJCWlmICgobWNpX2h3LT5idF9zdGF0ZSA9PSBNQ0lfQlRfQVdBS0UpICYmCisJCQkJKG1jaV9ody0+cXVlcnlfYnQgPT0gdHJ1ZSkpIHsKKwkJCW1jaV9ody0+bmVlZF9mbHVzaF9idGluZm8gPSB0cnVlOworCQl9CisJfQorCiAJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJYXI5MDAzX2h3X2JiX3dhdGNoZG9nX2NvbmZpZyhhaCk7CiAKQEAgLTE5MzMsNiArMjA3NCw3IEBACiBib29sIGF0aDlrX2h3X3NldHBvd2VyKHN0cnVjdCBhdGhfaHcgKmFoLCBlbnVtIGF0aDlrX3Bvd2VyX21vZGUgbW9kZSkKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CiAJaW50IHN0YXR1cyA9IHRydWUsIHNldENoaXAgPSB0cnVlOwogCXN0YXRpYyBjb25zdCBjaGFyICptb2Rlc1tdID0gewogCQkiQVdBS0UiLApAQCAtMTk1MCwxMiArMjA5MiwzNSBAQAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgQVRIOUtfUE1fQVdBS0U6CiAJCXN0YXR1cyA9IGF0aDlrX2h3X3NldF9wb3dlcl9hd2FrZShhaCwgc2V0Q2hpcCk7CisKKwkJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKQorCQkJUkVHX1dSSVRFKGFoLCBBUl9SVENfS0VFUF9BV0FLRSwgMHgyKTsKKwogCQlicmVhazsKIAljYXNlIEFUSDlLX1BNX0ZVTExfU0xFRVA6CisKKwkJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKSB7CisJCQlpZiAoYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0VOQUJMRSwgTlVMTCkgJiYKKwkJCQkobWNpLT5idF9zdGF0ZSAhPSBNQ0lfQlRfU0xFRVApICYmCisJCQkJIW1jaS0+aGFsdGVkX2J0X2dwbSkgeworCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBoYWx0IEJUIEdQTSIKKwkJCQkJCSIoZnVsbF9zbGVlcCkiKTsKKwkJCQlhcjkwMDNfbWNpX3NlbmRfY29leF9oYWx0X2J0X2dwbShhaCwKKwkJCQkJCQkJIHRydWUsIHRydWUpOworCQkJfQorCisJCQltY2ktPnJlYWR5ID0gZmFsc2U7CisJCQlSRUdfV1JJVEUoYWgsIEFSX1JUQ19LRUVQX0FXQUtFLCAweDIpOworCQl9CisKIAkJYXRoOWtfc2V0X3Bvd2VyX3NsZWVwKGFoLCBzZXRDaGlwKTsKIAkJYWgtPmNoaXBfZnVsbHNsZWVwID0gdHJ1ZTsKIAkJYnJlYWs7CiAJY2FzZSBBVEg5S19QTV9ORVRXT1JLX1NMRUVQOgorCisJCWlmIChhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkKKwkJCVJFR19XUklURShhaCwgQVJfUlRDX0tFRVBfQVdBS0UsIDB4Mik7CisKIAkJYXRoOWtfc2V0X3Bvd2VyX25ldHdvcmtfc2xlZXAoYWgsIHNldENoaXApOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjE0OCw2ICsyMzEzLDggQEAKIAogCWlmIChBUl9TUkVWXzk0ODUoYWgpIHx8IEFSX1NSRVZfOTI4NShhaCkgfHwgQVJfU1JFVl85MzMwKGFoKSkKIAkJY2hpcF9jaGFpbm1hc2sgPSAxOworCWVsc2UgaWYgKEFSX1NSRVZfOTQ2MihhaCkpCisJCWNoaXBfY2hhaW5tYXNrID0gMzsKIAllbHNlIGlmICghQVJfU1JFVl85MjgwXzIwX09SX0xBVEVSKGFoKSkKIAkJY2hpcF9jaGFpbm1hc2sgPSA3OwogCWVsc2UgaWYgKCFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpIHx8IEFSX1NSRVZfOTM0MChhaCkpCkBAIC0yMjMzLDcgKzI0MDAsOSBAQAogCQlwQ2FwLT5od19jYXBzIHw9IEFUSDlLX0hXX0NBUF80S0JfU1BMSVRUUkFOUzsKIAogCWlmIChjb21tb24tPmJ0Y29leF9lbmFibGVkKSB7Ci0JCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CisJCWlmIChBUl9TUkVWXzk0NjIoYWgpKQorCQkJYnRjb2V4X2h3LT5zY2hlbWUgPSBBVEhfQlRDT0VYX0NGR19NQ0k7CisJCWVsc2UgaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJCWJ0Y29leF9ody0+c2NoZW1lID0gQVRIX0JUQ09FWF9DRkdfM1dJUkU7CiAJCQlidGNvZXhfaHctPmJ0YWN0aXZlX2dwaW8gPSBBVEhfQlRBQ1RJVkVfR1BJT185MzAwOwogCQkJYnRjb2V4X2h3LT53bGFuYWN0aXZlX2dwaW8gPSBBVEhfV0xBTkFDVElWRV9HUElPXzkzMDA7CkBAIC0yMzMxLDExICsyNTAwLDExIEBACiAKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgewogCQlhaC0+ZW5hYmxlZF9jYWxzIHw9IFRYX0lRX0NBTDsKLQkJaWYgKCFBUl9TUkVWXzkzMzAoYWgpKQorCQlpZiAoQVJfU1JFVl85NDg1X09SX0xBVEVSKGFoKSkKIAkJCWFoLT5lbmFibGVkX2NhbHMgfD0gVFhfSVFfT05fQUdDX0NBTDsKIAl9CiAJaWYgKEFSX1NSRVZfOTQ2MihhaCkpCi0JCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQX1JUVDsKKwkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfUlRUIHwgQVRIOUtfSFdfQ0FQX01DSTsKIAogCXJldHVybiAwOwogfQpAQCAtMjU4Myw3ICsyNzUyLDcgQEAKIAlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiA9IGFoLT5jdXJjaGFuOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNoYW4tPmNoYW47CiAKLQlyZWctPnBvd2VyX2xpbWl0ID0gbWluX3QoaW50LCBsaW1pdCwgTUFYX1JBVEVfUE9XRVIpOworCXJlZy0+cG93ZXJfbGltaXQgPSBtaW5fdCh1MzIsIGxpbWl0LCBNQVhfUkFURV9QT1dFUik7CiAJaWYgKHRlc3QpCiAJCWNoYW5uZWwtPm1heF9wb3dlciA9IE1BWF9SQVRFX1BPV0VSIC8gMjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaAppbmRleCBmMzg5YjNjLi5jOWMzYjE4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmgKQEAgLTU5LDkgKzU5LDYgQEAKICNkZWZpbmUgQVQ5Mjg1X0NPRVgzV0lSRV9TQV9TVUJTWVNJRAkweDMwYWEKICNkZWZpbmUgQVQ5Mjg1X0NPRVgzV0lSRV9EQV9TVUJTWVNJRAkweDMwYWIKIAotI2RlZmluZSBBUjkzMDBfTlVNX0JUX1dFSUdIVFMgICA0Ci0jZGVmaW5lIEFSOTMwMF9OVU1fV0xBTl9XRUlHSFRTIDQKLQogI2RlZmluZSBBVEhfQU1QRFVfTElNSVRfTUFYICAgICAgICAoNjQgKiAxMDI0IC0gMSkKIAogI2RlZmluZQlBVEhfREVGQVVMVF9OT0lTRV9GTE9PUiAtOTUKQEAgLTEyOSw2ICsxMjYsMTYgQEAKICNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1JYX0NMRUFSX0VYVEVSTkFMICA0CiAjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQUNfTkVUV09SS19MRUQgICAgNQogI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfTUFDX1BPV0VSX0xFRCAgICAgIDYKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9XTEFOX0RBVEEgICAgICAweDE2CisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfV0xBTl9DTEsgICAgICAgMHgxNworI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfTUNJX0JUX0RBVEEgICAgICAgIDB4MTgKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9CVF9DTEsgICAgICAgICAweDE5CisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19XTF9JTl9UWCAgICAgICAgICAgMHgxNAorI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfV0xfSU5fUlggICAgICAgICAgIDB4MTMKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX0JUX0lOX1RYICAgICAgICAgICA5CisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19CVF9JTl9SWCAgICAgICAgICAgOAorI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfUlVDS1VTX1NUUk9CRSAgICAgIDB4MWQKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1JVQ0tVU19EQVRBICAgICAgICAweDFlCiAKICNkZWZpbmUgQVJfR1BJT0RfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDFGRkYKICNkZWZpbmUgQVJfR1BJT19CSVQoX2dwaW8pICAgICAgICAgICgxIDw8IChfZ3BpbykpCkBAIC0yMDMsNiArMjEwLDcgQEAKIAlBVEg5S19IV19DQVBfNUdIWgkJCT0gQklUKDE0KSwKIAlBVEg5S19IV19DQVBfQVBNCQkJPSBCSVQoMTUpLAogCUFUSDlLX0hXX0NBUF9SVFQJCQk9IEJJVCgxNiksCisJQVRIOUtfSFdfQ0FQX01DSQkJCT0gQklUKDE3KSwKIH07CiAKIHN0cnVjdCBhdGg5a19od19jYXBhYmlsaXRpZXMgewpAQCAtMjY4LDYgKzI3Niw3IEBACiAJQVRIOUtfSU5UX1RYID0gMHgwMDAwMDA0MCwKIAlBVEg5S19JTlRfVFhERVNDID0gMHgwMDAwMDA4MCwKIAlBVEg5S19JTlRfVElNX1RJTUVSID0gMHgwMDAwMDEwMCwKKwlBVEg5S19JTlRfTUNJID0gMHgwMDAwMDIwMCwKIAlBVEg5S19JTlRfQkJfV0FUQ0hET0cgPSAweDAwMDAwNDAwLAogCUFUSDlLX0lOVF9UWFVSTiA9IDB4MDAwMDA4MDAsCiAJQVRIOUtfSU5UX01JQiA9IDB4MDAwMDEwMDAsCkBAIC00MTksNiArNDI4LDE2MSBAQAogCUFUSDlLX1JYX1FVRVVFX01BWCwKIH07CiAKK2VudW0gbWNpX21lc3NhZ2VfaGVhZGVyIHsJCS8qIGxlbmd0aCBvZiBwYXlsb2FkICovCisJTUNJX0xOQV9DVFJMICAgICA9IDB4MTAsICAgICAgICAvKiBsZW4gPSAwICovCisJTUNJX0NPTlRfTkFDSyAgICA9IDB4MjAsICAgICAgICAvKiBsZW4gPSAwICovCisJTUNJX0NPTlRfSU5GTyAgICA9IDB4MzAsICAgICAgICAvKiBsZW4gPSA0ICovCisJTUNJX0NPTlRfUlNUICAgICA9IDB4NDAsICAgICAgICAvKiBsZW4gPSAwICovCisJTUNJX1NDSERfSU5GTyAgICA9IDB4NTAsICAgICAgICAvKiBsZW4gPSAxNiAqLworCU1DSV9DUFVfSU5UICAgICAgPSAweDYwLCAgICAgICAgLyogbGVuID0gNCAqLworCU1DSV9TWVNfV0FLSU5HICAgPSAweDcwLCAgICAgICAgLyogbGVuID0gMCAqLworCU1DSV9HUE0gICAgICAgICAgPSAweDgwLCAgICAgICAgLyogbGVuID0gMTYgKi8KKwlNQ0lfTE5BX0lORk8gICAgID0gMHg5MCwgICAgICAgIC8qIGxlbiA9IDEgKi8KKwlNQ0lfTE5BX1NUQVRFICAgID0gMHg5NCwKKwlNQ0lfTE5BX1RBS0UgICAgID0gMHg5OCwKKwlNQ0lfTE5BX1RSQU5TICAgID0gMHg5YywKKwlNQ0lfU1lTX1NMRUVQSU5HID0gMHhhMCwgICAgICAgIC8qIGxlbiA9IDAgKi8KKwlNQ0lfUkVRX1dBS0UgICAgID0gMHhjMCwgICAgICAgIC8qIGxlbiA9IDAgKi8KKwlNQ0lfREVCVUdfMTYgICAgID0gMHhmZSwgICAgICAgIC8qIGxlbiA9IDIgKi8KKwlNQ0lfUkVNT1RFX1JFU0VUID0gMHhmZiAgICAgICAgIC8qIGxlbiA9IDE2ICovCit9OworCitlbnVtIGF0aF9tY2lfZ3BtX2NvZXhfcHJvZmlsZV90eXBlIHsKKwlNQ0lfR1BNX0NPRVhfUFJPRklMRV9VTktOT1dOLAorCU1DSV9HUE1fQ09FWF9QUk9GSUxFX1JGQ09NTSwKKwlNQ0lfR1BNX0NPRVhfUFJPRklMRV9BMkRQLAorCU1DSV9HUE1fQ09FWF9QUk9GSUxFX0hJRCwKKwlNQ0lfR1BNX0NPRVhfUFJPRklMRV9CTkVQLAorCU1DSV9HUE1fQ09FWF9QUk9GSUxFX1ZPSUNFLAorCU1DSV9HUE1fQ09FWF9QUk9GSUxFX01BWAorfTsKKworLyogTUNJIEdQTS9Db2V4IG9wY29kZS90eXBlIGRlZmluaXRpb25zICovCitlbnVtIHsKKwlNQ0lfR1BNX0NPRVhfV19HUE1fUEFZTE9BRCAgICAgID0gMSwKKwlNQ0lfR1BNX0NPRVhfQl9HUE1fVFlQRSAgICAgICAgID0gNCwKKwlNQ0lfR1BNX0NPRVhfQl9HUE1fT1BDT0RFICAgICAgID0gNSwKKwkvKiBNQ0lfR1BNX1dMQU5fQ0FMX1JFUSwgTUNJX0dQTV9XTEFOX0NBTF9ET05FICovCisJTUNJX0dQTV9XTEFOX0NBTF9XX1NFUVVFTkNFICAgICA9IDIsCisKKwkvKiBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9RVUVSWSAqLworCS8qIE1DSV9HUE1fQ09FWF9WRVJTSU9OX1JFU1BPTlNFICovCisJTUNJX0dQTV9DT0VYX0JfTUFKT1JfVkVSU0lPTiAgICA9IDYsCisJTUNJX0dQTV9DT0VYX0JfTUlOT1JfVkVSU0lPTiAgICA9IDcsCisJLyogTUNJX0dQTV9DT0VYX1NUQVRVU19RVUVSWSAqLworCU1DSV9HUE1fQ09FWF9CX0JUX0JJVE1BUCAgICAgICAgPSA2LAorCU1DSV9HUE1fQ09FWF9CX1dMQU5fQklUTUFQICAgICAgPSA3LAorCS8qIE1DSV9HUE1fQ09FWF9IQUxUX0JUX0dQTSAqLworCU1DSV9HUE1fQ09FWF9CX0hBTFRfU1RBVEUgICAgICAgPSA2LAorCS8qIE1DSV9HUE1fQ09FWF9XTEFOX0NIQU5ORUxTICovCisJTUNJX0dQTV9DT0VYX0JfQ0hBTk5FTF9NQVAgICAgICA9IDYsCisJLyogTUNJX0dQTV9DT0VYX0JUX1BST0ZJTEVfSU5GTyAqLworCU1DSV9HUE1fQ09FWF9CX1BST0ZJTEVfVFlQRSAgICAgPSA2LAorCU1DSV9HUE1fQ09FWF9CX1BST0ZJTEVfTElOS0lEICAgPSA3LAorCU1DSV9HUE1fQ09FWF9CX1BST0ZJTEVfU1RBVEUgICAgPSA4LAorCU1DSV9HUE1fQ09FWF9CX1BST0ZJTEVfUk9MRSAgICAgPSA5LAorCU1DSV9HUE1fQ09FWF9CX1BST0ZJTEVfUkFURSAgICAgPSAxMCwKKwlNQ0lfR1BNX0NPRVhfQl9QUk9GSUxFX1ZPVFlQRSAgID0gMTEsCisJTUNJX0dQTV9DT0VYX0hfUFJPRklMRV9UICAgICAgICA9IDEyLAorCU1DSV9HUE1fQ09FWF9CX1BST0ZJTEVfVyAgICAgICAgPSAxNCwKKwlNQ0lfR1BNX0NPRVhfQl9QUk9GSUxFX0EgICAgICAgID0gMTUsCisJLyogTUNJX0dQTV9DT0VYX0JUX1NUQVRVU19VUERBVEUgKi8KKwlNQ0lfR1BNX0NPRVhfQl9TVEFUVVNfVFlQRSAgICAgID0gNiwKKwlNQ0lfR1BNX0NPRVhfQl9TVEFUVVNfTElOS0lEICAgID0gNywKKwlNQ0lfR1BNX0NPRVhfQl9TVEFUVVNfU1RBVEUgICAgID0gOCwKKwkvKiBNQ0lfR1BNX0NPRVhfQlRfVVBEQVRFX0ZMQUdTICovCisJTUNJX0dQTV9DT0VYX1dfQlRfRkxBR1MgICAgICAgICA9IDYsCisJTUNJX0dQTV9DT0VYX0JfQlRfRkxBR1NfT1AgICAgICA9IDEwCit9OworCitlbnVtIG1jaV9ncG1fc3VidHlwZSB7CisJTUNJX0dQTV9CVF9DQUxfUkVRICAgICAgPSAwLAorCU1DSV9HUE1fQlRfQ0FMX0dSQU5UICAgID0gMSwKKwlNQ0lfR1BNX0JUX0NBTF9ET05FICAgICA9IDIsCisJTUNJX0dQTV9XTEFOX0NBTF9SRVEgICAgPSAzLAorCU1DSV9HUE1fV0xBTl9DQUxfR1JBTlQgID0gNCwKKwlNQ0lfR1BNX1dMQU5fQ0FMX0RPTkUgICA9IDUsCisJTUNJX0dQTV9DT0VYX0FHRU5UICAgICAgPSAweDBjLAorCU1DSV9HUE1fUlNWRF9QQVRURVJOICAgID0gMHhmZSwKKwlNQ0lfR1BNX1JTVkRfUEFUVEVSTjMyICA9IDB4ZmVmZWZlZmUsCisJTUNJX0dQTV9CVF9ERUJVRyAgICAgICAgPSAweGZmCit9OworCitlbnVtIG1jaV9idF9zdGF0ZSB7CisJTUNJX0JUX1NMRUVQLAorCU1DSV9CVF9BV0FLRSwKKwlNQ0lfQlRfQ0FMX1NUQVJULAorCU1DSV9CVF9DQUwKK307CisKKy8qIFR5cGUgb2Ygc3RhdGUgcXVlcnkgKi8KK2VudW0gbWNpX3N0YXRlX3R5cGUgeworCU1DSV9TVEFURV9FTkFCTEUsCisJTUNJX1NUQVRFX0lOSVRfR1BNX09GRlNFVCwKKwlNQ0lfU1RBVEVfTkVYVF9HUE1fT0ZGU0VULAorCU1DSV9TVEFURV9MQVNUX0dQTV9PRkZTRVQsCisJTUNJX1NUQVRFX0JULAorCU1DSV9TVEFURV9TRVRfQlRfU0xFRVAsCisJTUNJX1NUQVRFX1NFVF9CVF9BV0FLRSwKKwlNQ0lfU1RBVEVfU0VUX0JUX0NBTF9TVEFSVCwKKwlNQ0lfU1RBVEVfU0VUX0JUX0NBTCwKKwlNQ0lfU1RBVEVfTEFTVF9TQ0hEX01TR19PRkZTRVQsCisJTUNJX1NUQVRFX1JFTU9URV9TTEVFUCwKKwlNQ0lfU1RBVEVfQ09OVF9SU1NJX1BPV0VSLAorCU1DSV9TVEFURV9DT05UX1BSSU9SSVRZLAorCU1DSV9TVEFURV9DT05UX1RYUlgsCisJTUNJX1NUQVRFX1JFU0VUX1JFUV9XQUtFLAorCU1DSV9TVEFURV9TRU5EX1dMQU5fQ09FWF9WRVJTSU9OLAorCU1DSV9TVEFURV9TRVRfQlRfQ09FWF9WRVJTSU9OLAorCU1DSV9TVEFURV9TRU5EX1dMQU5fQ0hBTk5FTFMsCisJTUNJX1NUQVRFX1NFTkRfVkVSU0lPTl9RVUVSWSwKKwlNQ0lfU1RBVEVfU0VORF9TVEFUVVNfUVVFUlksCisJTUNJX1NUQVRFX05FRURfRkxVU0hfQlRfSU5GTywKKwlNQ0lfU1RBVEVfU0VUX0NPTkNVUl9UWF9QUkksCisJTUNJX1NUQVRFX1JFQ09WRVJfUlgsCisJTUNJX1NUQVRFX05FRURfRlRQX1NUT01QLAorCU1DSV9TVEFURV9ORUVEX1RVTklORywKKwlNQ0lfU1RBVEVfREVCVUcsCisJTUNJX1NUQVRFX01BWAorfTsKKworZW51bSBtY2lfZ3BtX2NvZXhfb3Bjb2RlIHsKKwlNQ0lfR1BNX0NPRVhfVkVSU0lPTl9RVUVSWSwKKwlNQ0lfR1BNX0NPRVhfVkVSU0lPTl9SRVNQT05TRSwKKwlNQ0lfR1BNX0NPRVhfU1RBVFVTX1FVRVJZLAorCU1DSV9HUE1fQ09FWF9IQUxUX0JUX0dQTSwKKwlNQ0lfR1BNX0NPRVhfV0xBTl9DSEFOTkVMUywKKwlNQ0lfR1BNX0NPRVhfQlRfUFJPRklMRV9JTkZPLAorCU1DSV9HUE1fQ09FWF9CVF9TVEFUVVNfVVBEQVRFLAorCU1DSV9HUE1fQ09FWF9CVF9VUERBVEVfRkxBR1MKK307CisKKyNkZWZpbmUgTUNJX0dQTV9OT01PUkUgIDAKKyNkZWZpbmUgTUNJX0dQTV9NT1JFICAgIDEKKyNkZWZpbmUgTUNJX0dQTV9JTlZBTElEIDB4ZmZmZmZmZmYKKworI2RlZmluZSBNQ0lfR1BNX1JFQ1lDTEUoX3BfZ3BtKQlkbyB7CQkJICBcCisJKigoKHUzMiAqKV9wX2dwbSkgKyBNQ0lfR1BNX0NPRVhfV19HUE1fUEFZTE9BRCkgPSBcCisJCQkJTUNJX0dQTV9SU1ZEX1BBVFRFUk4zMjsgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1DSV9HUE1fVFlQRShfcF9ncG0pCVwKKwkoKigoKHU4ICopKF9wX2dwbSkpICsgTUNJX0dQTV9DT0VYX0JfR1BNX1RZUEUpICYgMHhmZikKKworI2RlZmluZSBNQ0lfR1BNX09QQ09ERShfcF9ncG0pCVwKKwkoKigoKHU4ICopKF9wX2dwbSkpICsgTUNJX0dQTV9DT0VYX0JfR1BNX09QQ09ERSkgJiAweGZmKQorCisjZGVmaW5lIE1DSV9HUE1fU0VUX0NBTF9UWVBFKF9wX2dwbSwgX2NhbF90eXBlKQlkbyB7CQkJICAgXAorCSooKCh1OCAqKShfcF9ncG0pKSArIE1DSV9HUE1fQ09FWF9CX0dQTV9UWVBFKSA9IChfY2FsX3R5cGUpICYgMHhmZjtcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1DSV9HUE1fU0VUX1RZUEVfT1BDT0RFKF9wX2dwbSwgX3R5cGUsIF9vcGNvZGUpIGRvIHsJCSAgIFwKKwkqKCgodTggKikoX3BfZ3BtKSkgKyBNQ0lfR1BNX0NPRVhfQl9HUE1fVFlQRSkgPSAoX3R5cGUpICYgMHhmZjsJICAgXAorCSooKCh1OCAqKShfcF9ncG0pKSArIE1DSV9HUE1fQ09FWF9CX0dQTV9PUENPREUpID0gKF9vcGNvZGUpICYgMHhmZjtcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1DSV9HUE1fSVNfQ0FMX1RZUEUoX3R5cGUpICgoX3R5cGUpIDw9IE1DSV9HUE1fV0xBTl9DQUxfRE9ORSkKKwogc3RydWN0IGF0aDlrX2JlYWNvbl9zdGF0ZSB7CiAJdTMyIGJzX25leHR0YnR0OwogCXUzMiBic19uZXh0ZHRpbTsKQEAgLTc5MSw4ICs5NTUsNiBAQAogCiAJLyogQmx1ZXRvb3RoIGNvZXhpc3RhbmNlICovCiAJc3RydWN0IGF0aF9idGNvZXhfaHcgYnRjb2V4X2h3OwotCXUzMiBidF9jb2V4X2J0X3dlaWdodFtBUjkzMDBfTlVNX0JUX1dFSUdIVFNdOwotCXUzMiBidF9jb2V4X3dsYW5fd2VpZ2h0W0FSOTMwMF9OVU1fV0xBTl9XRUlHSFRTXTsKIAogCXUzMiBpbnRyX3R4cXM7CiAJdTggdHhjaGFpbm1hc2s7CkBAIC0xMDQxLDYgKzEyMDMsMzIgQEAKIHZvaWQgYXRoOWtfaHdfcHJvY19taWJfZXZlbnQoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhdGg5a19od19hbmlfbW9uaXRvcihzdHJ1Y3QgYXRoX2h3ICphaCwgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pOwogCitib29sIGFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKHN0cnVjdCBhdGhfaHcgKmFoLCB1OCBoZWFkZXIsIHUzMiBmbGFnLAorCQkJICAgICB1MzIgKnBheWxvYWQsIHU4IGxlbiwgYm9vbCB3YWl0X2RvbmUsCisJCQkgICAgIGJvb2wgY2hlY2tfYnQpOwordm9pZCBhcjkwMDNfbWNpX211dGVfYnQoc3RydWN0IGF0aF9odyAqYWgpOwordTMyIGFyOTAwM19tY2lfc3RhdGUoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBzdGF0ZV90eXBlLCB1MzIgKnBfZGF0YSk7Cit2b2lkIGFyOTAwM19tY2lfc2V0dXAoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBncG1fYWRkciwgdm9pZCAqZ3BtX2J1ZiwKKwkJICAgICAgdTE2IGxlbiwgdTMyIHNjaGVkX2FkZHIpOwordm9pZCBhcjkwMDNfbWNpX2NsZWFudXAoc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhcjkwMDNfbWNpX3NlbmRfY29leF9oYWx0X2J0X2dwbShzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBoYWx0LAorCQkJCSAgICAgIGJvb2wgd2FpdF9kb25lKTsKK3UzMiBhcjkwMDNfbWNpX3dhaXRfZm9yX2dwbShzdHJ1Y3QgYXRoX2h3ICphaCwgdTggZ3BtX3R5cGUsCisJCQkgICAgdTggZ3BtX29wY29kZSwgaW50IHRpbWVfb3V0KTsKK3ZvaWQgYXI5MDAzX21jaV8yZzVnX2NoYW5nZWQoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgaXNfMmcpOwordm9pZCBhcjkwMDNfbWNpX2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBhdGhfaHcgKmFoKTsKK3ZvaWQgYXI5MDAzX21jaV9lbmFibGVfaW50ZXJydXB0KHN0cnVjdCBhdGhfaHcgKmFoKTsKK3ZvaWQgYXI5MDAzX21jaV8yZzVnX3N3aXRjaChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpOwordm9pZCBhcjkwMDNfbWNpX3Jlc2V0KHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGVuX2ludCwgYm9vbCBpc18yZywKKwkJICAgICAgYm9vbCBpc19mdWxsX3NsZWVwKTsKK2Jvb2wgYXI5MDAzX21jaV9jaGVja19pbnQoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBpbnRzKTsKK3ZvaWQgYXI5MDAzX21jaV9yZW1vdGVfcmVzZXQoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgd2FpdF9kb25lKTsKK3ZvaWQgYXI5MDAzX21jaV9zZW5kX3N5c193YWtpbmcoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgd2FpdF9kb25lKTsKK3ZvaWQgYXI5MDAzX21jaV9zZW5kX2xuYV90cmFuc2ZlcihzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpOwordm9pZCBhcjkwMDNfbWNpX3N5bmNfYnRfc3RhdGUoc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhcjkwMDNfbWNpX2dldF9pbnRlcnJ1cHQoc3RydWN0IGF0aF9odyAqYWgsIHUzMiAqcmF3X2ludHIsCisJCQkgICAgICB1MzIgKnJ4X21zZ19pbnRyKTsKKwogI2RlZmluZSBBVEg5S19DTE9DS19SQVRFX0NDSwkJMjIKICNkZWZpbmUgQVRIOUtfQ0xPQ0tfUkFURV81R0haX09GRE0JNDAKICNkZWZpbmUgQVRIOUtfQ0xPQ0tfUkFURV8yR0haX09GRE0JNDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jCmluZGV4IGFmMWIzMjUuLmU5NzExZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2F0aDlrX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJhdGg5ay5oIgogCkBAIC00MDcsNiArNDA4LDcgQEAKIHN0YXRpYyBpbnQgYXRoOWtfaW5pdF9idGNvZXgoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCiB7CiAJc3RydWN0IGF0aF90eHEgKnR4cTsKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKIAlpbnQgcjsKIAogCXN3aXRjaCAoc2MtPnNjX2FoLT5idGNvZXhfaHcuc2NoZW1lKSB7CkBAIC00MjQsNiArNDI2LDM3IEBACiAJCWF0aDlrX2h3X2luaXRfYnRjb2V4X2h3KHNjLT5zY19haCwgdHhxLT5heHFfcW51bSk7CiAJCXNjLT5idGNvZXguYnRfc3RvbXBfdHlwZSA9IEFUSF9CVENPRVhfU1RPTVBfTE9XOwogCQlicmVhazsKKwljYXNlIEFUSF9CVENPRVhfQ0ZHX01DSToKKwkJc2MtPmJ0Y29leC5idF9zdG9tcF90eXBlID0gQVRIX0JUQ09FWF9TVE9NUF9MT1c7CisJCXNjLT5idGNvZXguZHV0eV9jeWNsZSA9IEFUSF9CVENPRVhfREVGX0RVVFlfQ1lDTEU7CisJCUlOSVRfTElTVF9IRUFEKCZzYy0+YnRjb2V4Lm1jaS5pbmZvKTsKKworCQlyID0gYXRoX21jaV9zZXR1cChzYyk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkgeworCQkJYWgtPmJ0Y29leF9ody5tY2kucmVhZHkgPSBmYWxzZTsKKwkJCWFoLT5idGNvZXhfaHcubWNpLmJ0X3N0YXRlID0gMDsKKwkJCWFoLT5idGNvZXhfaHcubWNpLmJ0X3Zlcl9tYWpvciA9IDM7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS5idF92ZXJfbWlub3IgPSAwOworCQkJYWgtPmJ0Y29leF9ody5tY2kuYnRfdmVyc2lvbl9rbm93biA9IGZhbHNlOworCQkJYWgtPmJ0Y29leF9ody5tY2kudXBkYXRlXzJnNWcgPSB0cnVlOworCQkJYWgtPmJ0Y29leF9ody5tY2kuaXNfMmcgPSB0cnVlOworCQkJYWgtPmJ0Y29leF9ody5tY2kud2xhbl9jaGFubmVsc191cGRhdGUgPSBmYWxzZTsKKwkJCWFoLT5idGNvZXhfaHcubWNpLndsYW5fY2hhbm5lbHNbMF0gPSAweDAwMDAwMDAwOworCQkJYWgtPmJ0Y29leF9ody5tY2kud2xhbl9jaGFubmVsc1sxXSA9IDB4ZmZmZmZmZmY7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS53bGFuX2NoYW5uZWxzWzJdID0gMHhmZmZmZmZmZjsKKwkJCWFoLT5idGNvZXhfaHcubWNpLndsYW5fY2hhbm5lbHNbM10gPSAweDdmZmZmZmZmOworCQkJYWgtPmJ0Y29leF9ody5tY2kucXVlcnlfYnQgPSB0cnVlOworCQkJYWgtPmJ0Y29leF9ody5tY2kudW5oYWx0X2J0X2dwbSA9IHRydWU7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS5oYWx0ZWRfYnRfZ3BtID0gZmFsc2U7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS5uZWVkX2ZsdXNoX2J0aW5mbyA9IGZhbHNlOworCQkJYWgtPmJ0Y29leF9ody5tY2kud2xhbl9jYWxfc2VxID0gMDsKKwkJCWFoLT5idGNvZXhfaHcubWNpLndsYW5fY2FsX2RvbmUgPSAwOworCQkJYWgtPmJ0Y29leF9ody5tY2kuY29uZmlnID0gMHgyMjAxOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT04oMSk7CiAJCWJyZWFrOwpAQCAtNjk0LDYgKzcyNyw3IEBACiAJCWh3LT53aXBoeS0+ZmxhZ3MgJj0gfldJUEhZX0ZMQUdfUFNfT05fQllfREVGQVVMVDsKIAogCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19JQlNTX1JTTjsKKwlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfU1VQUE9SVFNfVERMUzsKIAogCWh3LT5xdWV1ZXMgPSA0OwogCWh3LT5tYXhfcmF0ZXMgPSA0OwpAQCAtODM1LDYgKzg2OSw5IEBACiAJICAgIHNjLT5zY19haC0+YnRjb2V4X2h3LnNjaGVtZSA9PSBBVEhfQlRDT0VYX0NGR18zV0lSRSkKIAkJYXRoX2dlbl90aW1lcl9mcmVlKHNjLT5zY19haCwgc2MtPmJ0Y29leC5ub19zdG9tcF90aW1lcik7CiAKKwlpZiAoc2MtPnNjX2FoLT5idGNvZXhfaHcuc2NoZW1lID09IEFUSF9CVENPRVhfQ0ZHX01DSSkKKwkJYXRoX21jaV9jbGVhbnVwKHNjKTsKKwogCWZvciAoaSA9IDA7IGkgPCBBVEg5S19OVU1fVFhfUVVFVUVTOyBpKyspCiAJCWlmIChBVEhfVFhRX1NFVFVQKHNjLCBpKSkKIAkJCWF0aF90eF9jbGVhbnVwcShzYywgJnNjLT50eC50eHFbaV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5jCmluZGV4IDZhOGZkZjMuLjBlNGZiYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgImh3LmgiCiAjaW5jbHVkZSAiaHctb3BzLmgiCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyB2b2lkIGF0aDlrX2h3X3NldF90eHFfaW50ZXJydXB0cyhzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkJc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gKnFpKQpAQCAtNzU5LDcgKzc2MCwxMCBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCWhvc3RfaXNyID0gUkVHX1JFQUQoYWgsIEFSX0lOVFJfQVNZTkNfQ0FVU0UpOwotCWlmICgoaG9zdF9pc3IgJiBBUl9JTlRSX01BQ19JUlEpICYmIChob3N0X2lzciAhPSBBUl9JTlRSX1NQVVJJT1VTKSkKKworCWlmICgoKGhvc3RfaXNyICYgQVJfSU5UUl9NQUNfSVJRKSB8fAorCSAgICAgKGhvc3RfaXNyICYgQVJfSU5UUl9BU1lOQ19NQVNLX01DSSkpICYmCisJICAgIChob3N0X2lzciAhPSBBUl9JTlRSX1NQVVJJT1VTKSkKIAkJcmV0dXJuIHRydWU7CiAKIAlob3N0X2lzciA9IFJFR19SRUFEKGFoLCBBUl9JTlRSX1NZTkNfQ0FVU0UpOwpAQCAtNzk3LDYgKzgwMSw3IEBACiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CiAJdTMyIHN5bmNfZGVmYXVsdCA9IEFSX0lOVFJfU1lOQ19ERUZBVUxUOworCXUzMiBhc3luY19tYXNrOwogCiAJaWYgKCEoYWgtPmltYXNrICYgQVRIOUtfSU5UX0dMT0JBTCkpCiAJCXJldHVybjsKQEAgLTgxMSwxMyArODE2LDE2IEBACiAJaWYgKEFSX1NSRVZfOTM0MChhaCkpCiAJCXN5bmNfZGVmYXVsdCAmPSB+QVJfSU5UUl9TWU5DX0hPU1QxX0ZBVEFMOwogCisJYXN5bmNfbWFzayA9IEFSX0lOVFJfTUFDX0lSUTsKKworCWlmIChhaC0+aW1hc2sgJiBBVEg5S19JTlRfTUNJKQorCQlhc3luY19tYXNrIHw9IEFSX0lOVFJfQVNZTkNfTUFTS19NQ0k7CisKIAlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19JTlRFUlJVUFQsICJlbmFibGUgSUVSXG4iKTsKIAlSRUdfV1JJVEUoYWgsIEFSX0lFUiwgQVJfSUVSX0VOQUJMRSk7CiAJaWYgKCFBUl9TUkVWXzkxMDAoYWgpKSB7Ci0JCVJFR19XUklURShhaCwgQVJfSU5UUl9BU1lOQ19FTkFCTEUsCi0JCQkgIEFSX0lOVFJfTUFDX0lSUSk7Ci0JCVJFR19XUklURShhaCwgQVJfSU5UUl9BU1lOQ19NQVNLLCBBUl9JTlRSX01BQ19JUlEpOwotCisJCVJFR19XUklURShhaCwgQVJfSU5UUl9BU1lOQ19FTkFCTEUsIGFzeW5jX21hc2spOworCQlSRUdfV1JJVEUoYWgsIEFSX0lOVFJfQVNZTkNfTUFTSywgYXN5bmNfbWFzayk7CiAKIAkJUkVHX1dSSVRFKGFoLCBBUl9JTlRSX1NZTkNfRU5BQkxFLCBzeW5jX2RlZmF1bHQpOwogCQlSRUdfV1JJVEUoYWgsIEFSX0lOVFJfU1lOQ19NQVNLLCBzeW5jX2RlZmF1bHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKaW5kZXggOTNmYmU2Zi4uZmQ1OWMxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCkBAIC02MzAsNyArNjMwLDggQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGF0aF9ub2RlX2F0dGFjaChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3N0YXRpYyB2b2lkIGF0aF9ub2RlX2F0dGFjaChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewogCXN0cnVjdCBhdGhfbm9kZSAqYW47CiAJYW4gPSAoc3RydWN0IGF0aF9ub2RlICopc3RhLT5kcnZfcHJpdjsKQEAgLTY0MCw2ICs2NDEsNyBAQAogCWxpc3RfYWRkKCZhbi0+bGlzdCwgJnNjLT5ub2Rlcyk7CiAJc3Bpbl91bmxvY2soJnNjLT5ub2Rlc19sb2NrKTsKIAlhbi0+c3RhID0gc3RhOworCWFuLT52aWYgPSB2aWY7CiAjZW5kaWYKIAlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfVFhBR0dSKSB7CiAJCWF0aF90eF9ub2RlX2luaXQoc2MsIGFuKTsKQEAgLTc0MCw2ICs3NDIsOSBAQAogCQlpZiAoc3RhdHVzICYgQVRIOUtfSU5UX0dFTlRJTUVSKQogCQkJYXRoX2dlbl90aW1lcl9pc3Ioc2MtPnNjX2FoKTsKIAorCWlmIChzdGF0dXMgJiBBVEg5S19JTlRfTUNJKQorCQlhdGhfbWNpX2ludHIoc2MpOworCiBvdXQ6CiAJLyogcmUtZW5hYmxlIGhhcmR3YXJlIGludGVycnVwdCAqLwogCWF0aDlrX2h3X2VuYWJsZV9pbnRlcnJ1cHRzKGFoKTsKQEAgLTc2Miw3ICs3NjcsOCBAQAogCQlBVEg5S19JTlRfQk1JU1MgfAkJXAogCQlBVEg5S19JTlRfQ1NUIHwJCQlcCiAJCUFUSDlLX0lOVF9UU0ZPT1IgfAkJXAotCQlBVEg5S19JTlRfR0VOVElNRVIpCisJCUFUSDlLX0lOVF9HRU5USU1FUiB8CQlcCisJCUFUSDlLX0lOVF9NQ0kpCiAKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGRldjsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKQEAgLTExMTcsNiArMTEyMyw5IEBACiAJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfSFQpCiAJCWFoLT5pbWFzayB8PSBBVEg5S19JTlRfQ1NUOwogCisJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKQorCQlhaC0+aW1hc2sgfD0gQVRIOUtfSU5UX01DSTsKKwogCXNjLT5zY19mbGFncyAmPSB+U0NfT1BfSU5WQUxJRDsKIAlzYy0+c2NfYWgtPmlzX21vbml0b3JpbmcgPSBmYWxzZTsKIApAQCAtMTEzMyw4ICsxMTQyLDkgQEAKIAogCWlmICgoYWgtPmJ0Y29leF9ody5zY2hlbWUgIT0gQVRIX0JUQ09FWF9DRkdfTk9ORSkgJiYKIAkgICAgIWFoLT5idGNvZXhfaHcuZW5hYmxlZCkgewotCQlhdGg5a19od19idGNvZXhfc2V0X3dlaWdodChhaCwgQVJfQlRfQ09FWF9XR0hULAotCQkJCQkgICBBUl9TVE9NUF9MT1dfV0xBTl9XR0hUKTsKKwkJaWYgKCEoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKSkKKwkJCWF0aDlrX2h3X2J0Y29leF9zZXRfd2VpZ2h0KGFoLCBBUl9CVF9DT0VYX1dHSFQsCisJCQkJCQkgICBBUl9TVE9NUF9MT1dfV0xBTl9XR0hUKTsKIAkJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShhaCk7CiAKIAkJaWYgKGFoLT5idGNvZXhfaHcuc2NoZW1lID09IEFUSF9CVENPRVhfQ0ZHXzNXSVJFKQpAQCAtMTIzNyw2ICsxMjQ3LDcgQEAKIAkJYXRoOWtfaHdfYnRjb2V4X2Rpc2FibGUoYWgpOwogCQlpZiAoYWgtPmJ0Y29leF9ody5zY2hlbWUgPT0gQVRIX0JUQ09FWF9DRkdfM1dJUkUpCiAJCQlhdGg5a19idGNvZXhfdGltZXJfcGF1c2Uoc2MpOworCQlhdGhfbWNpX2ZsdXNoX3Byb2ZpbGUoJnNjLT5idGNvZXgubWNpKTsKIAl9CiAKIAlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CkBAIC0xNzk4LDcgKzE4MDksNyBAQAogCXN0cnVjdCBhdGhfbm9kZSAqYW4gPSAoc3RydWN0IGF0aF9ub2RlICopIHN0YS0+ZHJ2X3ByaXY7CiAJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiBwc19rZXkgPSB7IH07CiAKLQlhdGhfbm9kZV9hdHRhY2goc2MsIHN0YSk7CisJYXRoX25vZGVfYXR0YWNoKHNjLCBzdGEsIHZpZik7CiAKIAlpZiAodmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCiAJICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21jaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21jaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NzgwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmMKQEAgLTAsMCArMSw2NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJhdGg5ay5oIgorI2luY2x1ZGUgIm1jaS5oIgorCit1OCBhdGhfbWNpX2R1dHlfY3ljbGVbXSA9IHsgMCwgNTAsIDYwLCA3MCwgODAsIDg1LCA5MCwgOTUsIDk4IH07CisKK3N0YXRpYyBzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8qCithdGhfbWNpX2ZpbmRfcHJvZmlsZShzdHJ1Y3QgYXRoX21jaV9wcm9maWxlICptY2ksCisJCSAgICAgc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvICppbmZvKQoreworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmbWNpLT5pbmZvLCBsaXN0KSB7CisJCWlmIChlbnRyeS0+Y29ubl9oYW5kbGUgPT0gaW5mby0+Y29ubl9oYW5kbGUpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgYm9vbCBhdGhfbWNpX2FkZF9wcm9maWxlKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sCisJCQkJc3RydWN0IGF0aF9tY2lfcHJvZmlsZSAqbWNpLAorCQkJCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8gKmVudHJ5OworCisJaWYgKChtY2ktPm51bV9zY28gPT0gQVRIX01DSV9NQVhfU0NPX1BST0ZJTEUpICYmCisJICAgIChpbmZvLT50eXBlID09IE1DSV9HUE1fQ09FWF9QUk9GSUxFX1ZPSUNFKSkgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiVG9vIG1hbnkgU0NPIHByb2ZpbGUsIGZhaWxlZCB0byBhZGQgbmV3IHByb2ZpbGVcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCgoTlVNX1BST0YobWNpKSAtIG1jaS0+bnVtX3NjbykgPT0gQVRIX01DSV9NQVhfQUNMX1BST0ZJTEUpICYmCisJICAgIChpbmZvLT50eXBlICE9IE1DSV9HUE1fQ09FWF9QUk9GSUxFX1ZPSUNFKSkgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiVG9vIG1hbnkgQUNMIHByb2ZpbGUsIGZhaWxlZCB0byBhZGQgbmV3IHByb2ZpbGVcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZW50cnkgPSBhdGhfbWNpX2ZpbmRfcHJvZmlsZShtY2ksIGluZm8pOworCisJaWYgKGVudHJ5KQorCQltZW1jcHkoZW50cnksIGluZm8sIDEwKTsKKwllbHNlIHsKKwkJZW50cnkgPSBremFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFlbnRyeSkKKwkJCXJldHVybiBmYWxzZTsKKworCQltZW1jcHkoZW50cnksIGluZm8sIDEwKTsKKwkJSU5DX1BST0YobWNpLCBpbmZvKTsKKwkJbGlzdF9hZGRfdGFpbCgmaW5mby0+bGlzdCwgJm1jaS0+aW5mbyk7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBhdGhfbWNpX2RlbF9wcm9maWxlKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sCisJCQkJc3RydWN0IGF0aF9tY2lfcHJvZmlsZSAqbWNpLAorCQkJCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8gKmVudHJ5OworCisJZW50cnkgPSBhdGhfbWNpX2ZpbmRfcHJvZmlsZShtY2ksIGluZm8pOworCisJaWYgKCFlbnRyeSkgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiUHJvZmlsZSB0byBiZSBkZWxldGVkIG5vdCBmb3VuZFxuIik7CisJCXJldHVybjsKKwl9CisJREVDX1BST0YobWNpLCBlbnRyeSk7CisJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwlrZnJlZShlbnRyeSk7Cit9CisKK3ZvaWQgYXRoX21jaV9mbHVzaF9wcm9maWxlKHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgKm1jaSkKK3sKKwlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8gKmluZm8sICp0aW5mbzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbmZvLCB0aW5mbywgJm1jaS0+aW5mbywgbGlzdCkgeworCQlsaXN0X2RlbCgmaW5mby0+bGlzdCk7CisJCURFQ19QUk9GKG1jaSwgaW5mbyk7CisJCWtmcmVlKGluZm8pOworCX0KKwltY2ktPmFnZ3JfbGltaXQgPSAwOworfQorCitzdGF0aWMgdm9pZCBhdGhfbWNpX2FkanVzdF9hZ2dyX2xpbWl0KHN0cnVjdCBhdGhfYnRjb2V4ICpidGNvZXgpCit7CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZSAqbWNpID0gJmJ0Y29leC0+bWNpOworCXUzMiB3bGFuX2FpcnRpbWUgPSBidGNvZXgtPmJ0Y29leF9wZXJpb2QgKgorCQkJCSgxMDAgLSBidGNvZXgtPmR1dHlfY3ljbGUpIC8gMTAwOworCisJLyoKKwkgKiBTY2FsZTogd2xhbl9haXJ0aW1lIGlzIGluIG1zLCBhZ2dyX2xpbWl0IGlzIGluIDAuMjUgbXMuCisJICogV2hlbiB3bGFuX2FpcnRpbWUgaXMgbGVzcyB0aGFuIDRtcywgYWdncmVnYXRpb24gbGltaXQgaGFzIHRvIGJlCisJICogYWRqdXN0ZWQgaGFsZiBvZiB3bGFuX2FpcnRpbWUgdG8gZW5zdXJlIHRoYXQgdGhlIGFnZ3JlZ2F0aW9uIGNhbiBmaXQKKwkgKiB3aXRob3V0IGNvbGxpc2lvbiB3aXRoIEJUIHRyYWZmaWMuCisJICovCisJaWYgKCh3bGFuX2FpcnRpbWUgPD0gNCkgJiYKKwkgICAgKCFtY2ktPmFnZ3JfbGltaXQgfHwgKG1jaS0+YWdncl9saW1pdCA+ICgyICogd2xhbl9haXJ0aW1lKSkpKQorCQltY2ktPmFnZ3JfbGltaXQgPSAyICogd2xhbl9haXJ0aW1lOworfQorCitzdGF0aWMgdm9pZCBhdGhfbWNpX3VwZGF0ZV9zY2hlbWUoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOworCXN0cnVjdCBhdGhfYnRjb2V4ICpidGNvZXggPSAmc2MtPmJ0Y29leDsKKwlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlICptY2kgPSAmYnRjb2V4LT5tY2k7CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvICppbmZvOworCXUzMiBudW1fcHJvZmlsZSA9IE5VTV9QUk9GKG1jaSk7CisKKwlpZiAobnVtX3Byb2ZpbGUgPT0gMSkgeworCQlpbmZvID0gbGlzdF9maXJzdF9lbnRyeSgmbWNpLT5pbmZvLAorCQkJCQlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8sCisJCQkJCWxpc3QpOworCQlpZiAobWNpLT5udW1fc2NvICYmIGluZm8tPlQgPT0gMTIpIHsKKwkJCW1jaS0+YWdncl9saW1pdCA9IDg7CisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIlNpbmdsZSBTQ08sIGFnZ3JlZ2F0aW9uIGxpbWl0IDIgbXNcbiIpOworCQl9IGVsc2UgaWYgKChpbmZvLT50eXBlID09IE1DSV9HUE1fQ09FWF9QUk9GSUxFX0JORVApICYmCisJCQkgICAhaW5mby0+bWFzdGVyKSB7CisJCQlidGNvZXgtPmJ0Y29leF9wZXJpb2QgPSA2MDsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiU2luZ2xlIHNsYXZlIFBBTi9GVFAsIGJ0IHBlcmlvZCA2MCBtc1xuIik7CisJCX0gZWxzZSBpZiAoKGluZm8tPnR5cGUgPT0gTUNJX0dQTV9DT0VYX1BST0ZJTEVfSElEKSAmJgorCQkJIChpbmZvLT5UID4gMCAmJiBpbmZvLT5UIDwgNTApICYmCisJCQkgKGluZm8tPkEgPiAxIHx8IGluZm8tPlcgPiAxKSkgeworCQkJYnRjb2V4LT5kdXR5X2N5Y2xlID0gMzA7CisJCQltY2ktPmFnZ3JfbGltaXQgPSA4OworCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNdWx0aXBsZSBhdHRlbXB0L3RpbWVvdXQgc2luZ2xlIEhJRCAiCisJCQkJImFnZ3JlZ2F0aW9uIGxpbWl0IDIgbXMgZHV0eWN5Y2xlIDMwJSVcbiIpOworCQl9CisJfSBlbHNlIGlmICgobnVtX3Byb2ZpbGUgPT0gMikgJiYgKG1jaS0+bnVtX2hpZCA9PSAyKSkgeworCQlidGNvZXgtPmR1dHlfY3ljbGUgPSAzMDsKKwkJbWNpLT5hZ2dyX2xpbWl0ID0gODsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIlR3byBISURzIGFnZ3JlZ2F0aW9uIGxpbWl0IDIgbXMgZHV0eWN5Y2xlIDMwJSVcbiIpOworCX0gZWxzZSBpZiAobnVtX3Byb2ZpbGUgPiAzKSB7CisJCW1jaS0+YWdncl9saW1pdCA9IDY7CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJUaHJlZSBvciBtb3JlIHByb2ZpbGVzIGFnZ3JlZ2F0aW9uIGxpbWl0IDEuNSBtc1xuIik7CisJfQorCisJaWYgKElTX0NIQU5fMkdIWihzYy0+c2NfYWgtPmN1cmNoYW4pKSB7CisJCWlmIChJU19DSEFOX0hUKHNjLT5zY19haC0+Y3VyY2hhbikpCisJCQlhdGhfbWNpX2FkanVzdF9hZ2dyX2xpbWl0KGJ0Y29leCk7CisJCWVsc2UKKwkJCWJ0Y29leC0+YnRjb2V4X3BlcmlvZCA+Pj0gMTsKKwl9CisKKwlhdGg5a19od19idGNvZXhfZGlzYWJsZShzYy0+c2NfYWgpOworCWF0aDlrX2J0Y29leF90aW1lcl9wYXVzZShzYyk7CisKKwlpZiAoSVNfQ0hBTl81R0haKHNjLT5zY19haC0+Y3VyY2hhbikpCisJCXJldHVybjsKKworCWJ0Y29leC0+ZHV0eV9jeWNsZSArPSAobWNpLT5udW1fYmRyID8gQVRIX01DSV9NQVhfRFVUWV9DWUNMRSA6IDApOworCWlmIChidGNvZXgtPmR1dHlfY3ljbGUgPiBBVEhfTUNJX01BWF9EVVRZX0NZQ0xFKQorCQlidGNvZXgtPmR1dHlfY3ljbGUgPSBBVEhfTUNJX01BWF9EVVRZX0NZQ0xFOworCisJYnRjb2V4LT5idGNvZXhfcGVyaW9kICo9IDEwMDA7CisJYnRjb2V4LT5idGNvZXhfbm9fc3RvbXAgPSAgYnRjb2V4LT5idGNvZXhfcGVyaW9kICoKKwkJCQkJKDEwMCAtIGJ0Y29leC0+ZHV0eV9jeWNsZSkgLyAxMDA7CisKKwlhdGg5a19od19idGNvZXhfZW5hYmxlKHNjLT5zY19haCk7CisJYXRoOWtfYnRjb2V4X3RpbWVyX3Jlc3VtZShzYyk7Cit9CisKKworc3RhdGljIHZvaWQgYXRoX21jaV9jYWxfbXNnKHN0cnVjdCBhdGhfc29mdGMgKnNjLCB1OCBvcGNvZGUsIHU4ICpyeF9wYXlsb2FkKQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXUzMiBwYXlsb2FkWzRdID0gezAsIDAsIDAsIDB9OworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIE1DSV9HUE1fQlRfQ0FMX1JFUToKKworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgcmVjZWl2ZWQgQlRfQ0FMX1JFUVxuIik7CisKKwkJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9CVCwgTlVMTCkgPT0gTUNJX0JUX0FXQUtFKSB7CisJCQlhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfU0VUX0JUX0NBTF9TVEFSVCwgTlVMTCk7CisJCQlpZWVlODAyMTFfcXVldWVfd29yayhzYy0+aHcsICZzYy0+aHdfcmVzZXRfd29yayk7CisJCX0gZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgU3RhdGUgbWlzbWF0Y2hlczogJWRcbiIsCisJCQkJYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0JULCBOVUxMKSk7CisKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9HUE1fQlRfQ0FMX0RPTkU6CisKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIHJlY2VpdmVkIEJUX0NBTF9ET05FXG4iKTsKKworCQlpZiAoYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0JULCBOVUxMKSA9PSBNQ0lfQlRfQ0FMKQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIGVycm9yIGlsbGVnYWwhXG4iKTsKKwkJZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIEJUIG5vdCBpbiBDQUwgc3RhdGVcbiIpOworCisJCWJyZWFrOworCisJY2FzZSBNQ0lfR1BNX0JUX0NBTF9HUkFOVDoKKworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgcmVjZWl2ZWQgQlRfQ0FMX0dSQU5UXG4iKTsKKworCQkvKiBTZW5kIFdMQU5fQ0FMX0RPTkUgZm9yIG5vdyAqLworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgc2VuZCBXTEFOX0NBTF9ET05FXG4iKTsKKwkJTUNJX0dQTV9TRVRfQ0FMX1RZUEUocGF5bG9hZCwgTUNJX0dQTV9XTEFOX0NBTF9ET05FKTsKKwkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2Uoc2MtPnNjX2FoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLAorCQkJCQkxNiwgZmFsc2UsIHRydWUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBVbmtub3duIEdQTSBDQUwgbWVzc2FnZVxuIik7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBhdGhfbWNpX3Byb2Nlc3NfcHJvZmlsZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywKKwkJCSAgICAgc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvICppbmZvKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKKwlzdHJ1Y3QgYXRoX2J0Y29leCAqYnRjb2V4ID0gJnNjLT5idGNvZXg7CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZSAqbWNpID0gJmJ0Y29leC0+bWNpOworCisJaWYgKGluZm8tPnN0YXJ0KSB7CisJCWlmICghYXRoX21jaV9hZGRfcHJvZmlsZShjb21tb24sIG1jaSwgaW5mbykpCisJCQlyZXR1cm47CisJfSBlbHNlCisJCWF0aF9tY2lfZGVsX3Byb2ZpbGUoY29tbW9uLCBtY2ksIGluZm8pOworCisJYnRjb2V4LT5idGNvZXhfcGVyaW9kID0gQVRIX01DSV9ERUZfQlRfUEVSSU9EOworCW1jaS0+YWdncl9saW1pdCA9IG1jaS0+bnVtX3NjbyA/IDYgOiAwOworCWlmIChOVU1fUFJPRihtY2kpKSB7CisJCWJ0Y29leC0+YnRfc3RvbXBfdHlwZSA9IEFUSF9CVENPRVhfU1RPTVBfTE9XOworCQlidGNvZXgtPmR1dHlfY3ljbGUgPSBhdGhfbWNpX2R1dHlfY3ljbGVbTlVNX1BST0YobWNpKV07CisJfSBlbHNlIHsKKwkJYnRjb2V4LT5idF9zdG9tcF90eXBlID0gbWNpLT5udW1fbWdtdCA/IEFUSF9CVENPRVhfU1RPTVBfQUxMIDoKKwkJCQkJCQlBVEhfQlRDT0VYX1NUT01QX0xPVzsKKwkJYnRjb2V4LT5kdXR5X2N5Y2xlID0gQVRIX0JUQ09FWF9ERUZfRFVUWV9DWUNMRTsKKwl9CisKKwlhdGhfbWNpX3VwZGF0ZV9zY2hlbWUoc2MpOworfQorCit2b2lkIGF0aF9tY2lfcHJvY2Vzc19zdGF0dXMoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCisJCQkgICAgc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9zdGF0dXMgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CisJc3RydWN0IGF0aF9idGNvZXggKmJ0Y29leCA9ICZzYy0+YnRjb2V4OworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgKm1jaSA9ICZidGNvZXgtPm1jaTsKKwlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8gaW5mbzsKKwlpbnQgaSA9IDAsIG9sZF9udW1fbWdtdCA9IG1jaS0+bnVtX21nbXQ7CisKKwkvKiBMaW5rIHN0YXR1cyB0eXBlIGFyZSBub3QgaGFuZGxlZCAqLworCWlmIChzdGF0dXMtPmlzX2xpbmspIHsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIlNraXAgbGluayB0eXBlIHN0YXR1cyB1cGRhdGVcbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvKSk7CisKKwlpbmZvLmNvbm5faGFuZGxlID0gc3RhdHVzLT5jb25uX2hhbmRsZTsKKwlpZiAoYXRoX21jaV9maW5kX3Byb2ZpbGUobWNpLCAmaW5mbykpIHsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIlNraXAgbm9uIGxpbmsgc3RhdGUgdXBkYXRlIGZvciBleGlzdGluZyBwcm9maWxlICVkXG4iLAorCQkJc3RhdHVzLT5jb25uX2hhbmRsZSk7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXR1cy0+Y29ubl9oYW5kbGUgPj0gQVRIX01DSV9NQVhfUFJPRklMRSkgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiSWdub3JlIHRvbyBtYW55IG5vbi1saW5rIHVwZGF0ZVxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXR1cy0+aXNfY3JpdGljYWwpCisJCV9fc2V0X2JpdChzdGF0dXMtPmNvbm5faGFuZGxlLCBtY2ktPnN0YXR1cyk7CisJZWxzZQorCQlfX2NsZWFyX2JpdChzdGF0dXMtPmNvbm5faGFuZGxlLCBtY2ktPnN0YXR1cyk7CisKKwltY2ktPm51bV9tZ210ID0gMDsKKwlkbyB7CisJCWlmICh0ZXN0X2JpdChpLCBtY2ktPnN0YXR1cykpCisJCQltY2ktPm51bV9tZ210Kys7CisJfSB3aGlsZSAoKytpIDwgQVRIX01DSV9NQVhfUFJPRklMRSk7CisKKwlpZiAob2xkX251bV9tZ210ICE9IG1jaS0+bnVtX21nbXQpCisJCWF0aF9tY2lfdXBkYXRlX3NjaGVtZShzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aF9tY2lfbXNnKHN0cnVjdCBhdGhfc29mdGMgKnNjLCB1OCBvcGNvZGUsIHU4ICpyeF9wYXlsb2FkKQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyBwcm9maWxlX2luZm87CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9zdGF0dXMgcHJvZmlsZV9zdGF0dXM7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOworCXUzMiB2ZXJzaW9uOworCXU4IG1ham9yOworCXU4IG1pbm9yOworCXUzMiBzZXFfbnVtOworCisJc3dpdGNoIChvcGNvZGUpIHsKKworCWNhc2UgTUNJX0dQTV9DT0VYX1ZFUlNJT05fUVVFUlk6CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgUmVjdiBHUE0gQ09FWCBWZXJzaW9uIFF1ZXJ5LlxuIik7CisJCXZlcnNpb24gPSBhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQkJCU1DSV9TVEFURV9TRU5EX1dMQU5fQ09FWF9WRVJTSU9OLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9HUE1fQ09FWF9WRVJTSU9OX1JFU1BPTlNFOgorCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggVmVyc2lvbiBSZXNwb25zZS5cbiIpOworCQltYWpvciA9ICoocnhfcGF5bG9hZCArIE1DSV9HUE1fQ09FWF9CX01BSk9SX1ZFUlNJT04pOworCQltaW5vciA9ICoocnhfcGF5bG9hZCArIE1DSV9HUE1fQ09FWF9CX01JTk9SX1ZFUlNJT04pOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIEJUIENvZXggdmVyc2lvbjogJWQuJWRcbiIsIG1ham9yLCBtaW5vcik7CisJCXZlcnNpb24gPSAobWFqb3IgPDwgOCkgKyBtaW5vcjsKKwkJdmVyc2lvbiA9IGFyOTAwM19tY2lfc3RhdGUoYWgsCisJCQkgIE1DSV9TVEFURV9TRVRfQlRfQ09FWF9WRVJTSU9OLCAmdmVyc2lvbik7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfR1BNX0NPRVhfU1RBVFVTX1FVRVJZOgorCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggU3RhdHVzIFF1ZXJ5ID0gMHglMDJ4LlxuIiwKKwkJCSoocnhfcGF5bG9hZCArIE1DSV9HUE1fQ09FWF9CX1dMQU5fQklUTUFQKSk7CisJCWFyOTAwM19tY2lfc3RhdGUoYWgsCisJCU1DSV9TVEFURV9TRU5EX1dMQU5fQ0hBTk5FTFMsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgTUNJX0dQTV9DT0VYX0JUX1BST0ZJTEVfSU5GTzoKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBSZWN2IEdQTSBDb2V4IEJUIHByb2ZpbGUgaW5mb1xuIik7CisJCW1lbWNweSgmcHJvZmlsZV9pbmZvLAorCQkgICAgICAgKHJ4X3BheWxvYWQgKyBNQ0lfR1BNX0NPRVhfQl9QUk9GSUxFX1RZUEUpLCAxMCk7CisKKwkJaWYgKChwcm9maWxlX2luZm8udHlwZSA9PSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9VTktOT1dOKQorCQkgICAgfHwgKHByb2ZpbGVfaW5mby50eXBlID49CisJCQkJCSAgICBNQ0lfR1BNX0NPRVhfUFJPRklMRV9NQVgpKSB7CisKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiaWxsZWdhbCBwcm9maWxlIHR5cGUgPSAlZCwiCisJCQkJInN0YXRlID0gJWRcbiIsIHByb2ZpbGVfaW5mby50eXBlLAorCQkJCXByb2ZpbGVfaW5mby5zdGFydCk7CisJCQlicmVhazsKKwkJfQorCisJCWF0aF9tY2lfcHJvY2Vzc19wcm9maWxlKHNjLCAmcHJvZmlsZV9pbmZvKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9HUE1fQ09FWF9CVF9TVEFUVVNfVVBEQVRFOgorCQlwcm9maWxlX3N0YXR1cy5pc19saW5rID0gKihyeF9wYXlsb2FkICsKKwkJCQkJICAgTUNJX0dQTV9DT0VYX0JfU1RBVFVTX1RZUEUpOworCQlwcm9maWxlX3N0YXR1cy5jb25uX2hhbmRsZSA9ICoocnhfcGF5bG9hZCArCisJCQkJCSAgICAgICBNQ0lfR1BNX0NPRVhfQl9TVEFUVVNfTElOS0lEKTsKKwkJcHJvZmlsZV9zdGF0dXMuaXNfY3JpdGljYWwgPSAqKHJ4X3BheWxvYWQgKworCQkJCQkgICAgICAgTUNJX0dQTV9DT0VYX0JfU1RBVFVTX1NUQVRFKTsKKworCQlzZXFfbnVtID0gKigodTMyICopKHJ4X3BheWxvYWQgKyAxMikpOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggQlRfU3RhdHVzX1VwZGF0ZTogIgorCQkJImlzX2xpbms9JWQsIGxpbmtJZD0lZCwgc3RhdGU9JWQsIFNFUT0lZFxuIiwKKwkJCXByb2ZpbGVfc3RhdHVzLmlzX2xpbmssIHByb2ZpbGVfc3RhdHVzLmNvbm5faGFuZGxlLAorCQkJcHJvZmlsZV9zdGF0dXMuaXNfY3JpdGljYWwsIHNlcV9udW0pOworCisJCWF0aF9tY2lfcHJvY2Vzc19zdGF0dXMoc2MsICZwcm9maWxlX3N0YXR1cyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkiTUNJIFVua25vd24gR1BNIENPRVggbWVzc2FnZSA9IDB4JTAyeFxuIiwgb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGF0aF9tY2lfYnVmX2FsbG9jKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX21jaV9idWYgKmJ1ZikKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJYnVmLT5iZl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KHNjLT5kZXYsIGJ1Zi0+YmZfbGVuLAorCQkJCQkgICZidWYtPmJmX3BhZGRyLCBHRlBfS0VSTkVMKTsKKworCWlmIChidWYtPmJmX2FkZHIgPT0gTlVMTCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgYXRoX21jaV9idWZfZnJlZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9tY2lfYnVmICpidWYpCit7CisJaWYgKGJ1Zi0+YmZfYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChzYy0+ZGV2LCBidWYtPmJmX2xlbiwgYnVmLT5iZl9hZGRyLAorCQkJCQkJCWJ1Zi0+YmZfcGFkZHIpOworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCX0KK30KKworaW50IGF0aF9tY2lfc2V0dXAoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOworCXN0cnVjdCBhdGhfbWNpX2NvZXggKm1jaSA9ICZzYy0+bWNpX2NvZXg7CisJaW50IGVycm9yID0gMDsKKworCW1jaS0+c2NoZWRfYnVmLmJmX2xlbiA9IEFUSF9NQ0lfU0NIRURfQlVGX1NJWkUgKyBBVEhfTUNJX0dQTV9CVUZfU0laRTsKKworCWlmIChhdGhfbWNpX2J1Zl9hbGxvYyhzYywgJm1jaS0+c2NoZWRfYnVmKSkgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19GQVRBTCwgIk1DSSBidWZmZXIgYWxsb2MgZmFpbGVkXG4iKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJbWNpLT5zY2hlZF9idWYuYmZfbGVuID0gQVRIX01DSV9TQ0hFRF9CVUZfU0laRTsKKworCW1lbXNldChtY2ktPnNjaGVkX2J1Zi5iZl9hZGRyLCBNQ0lfR1BNX1JTVkRfUEFUVEVSTiwKKwkJCQkJCW1jaS0+c2NoZWRfYnVmLmJmX2xlbik7CisKKwltY2ktPmdwbV9idWYuYmZfbGVuID0gQVRIX01DSV9HUE1fQlVGX1NJWkU7CisJbWNpLT5ncG1fYnVmLmJmX2FkZHIgPSAodTggKiltY2ktPnNjaGVkX2J1Zi5iZl9hZGRyICsKKwkJCQkJCQltY2ktPnNjaGVkX2J1Zi5iZl9sZW47CisJbWNpLT5ncG1fYnVmLmJmX3BhZGRyID0gbWNpLT5zY2hlZF9idWYuYmZfcGFkZHIgKyBtY2ktPnNjaGVkX2J1Zi5iZl9sZW47CisKKwkvKiBpbml0aWFsaXplIHRoZSBidWZmZXIgKi8KKwltZW1zZXQobWNpLT5ncG1fYnVmLmJmX2FkZHIsIE1DSV9HUE1fUlNWRF9QQVRURVJOLCBtY2ktPmdwbV9idWYuYmZfbGVuKTsKKworCWFyOTAwM19tY2lfc2V0dXAoc2MtPnNjX2FoLCBtY2ktPmdwbV9idWYuYmZfcGFkZHIsCisJCQkgbWNpLT5ncG1fYnVmLmJmX2FkZHIsIChtY2ktPmdwbV9idWYuYmZfbGVuID4+IDQpLAorCQkJIG1jaS0+c2NoZWRfYnVmLmJmX3BhZGRyKTsKK2ZhaWw6CisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIGF0aF9tY2lfY2xlYW51cChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlzdHJ1Y3QgYXRoX21jaV9jb2V4ICptY2kgPSAmc2MtPm1jaV9jb2V4OworCisJLyoKKwkgKiBib3RoIHNjaGVkdWxlIGFuZCBncG0gYnVmZmVycyB3aWxsIGJlIHJlbGVhc2VkCisJICovCisJYXRoX21jaV9idWZfZnJlZShzYywgJm1jaS0+c2NoZWRfYnVmKTsKKwlhcjkwMDNfbWNpX2NsZWFudXAoYWgpOworfQorCit2b2lkIGF0aF9tY2lfaW50cihzdHJ1Y3QgYXRoX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgYXRoX21jaV9jb2V4ICptY2kgPSAmc2MtPm1jaV9jb2V4OworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXUzMiBtY2lfaW50LCBtY2lfaW50X3J4bXNnOworCXUzMiBvZmZzZXQsIHN1YnR5cGUsIG9wY29kZTsKKwl1MzIgKnBncG07CisJdTMyIG1vcmVfZGF0YSA9IE1DSV9HUE1fTU9SRTsKKwlib29sIHNraXBfZ3BtID0gZmFsc2U7CisKKwlhcjkwMDNfbWNpX2dldF9pbnRlcnJ1cHQoc2MtPnNjX2FoLCAmbWNpX2ludCwgJm1jaV9pbnRfcnhtc2cpOworCisJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9FTkFCTEUsIE5VTEwpID09IDApIHsKKworCQlhcjkwMDNfbWNpX3N0YXRlKHNjLT5zY19haCwgTUNJX1NUQVRFX0lOSVRfR1BNX09GRlNFVCwgTlVMTCk7CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgaW50ZXJydXB0IGJ1dCBNQ0kgZGlzYWJsZWRcbiIpOworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgaW50ZXJydXB0OiBpbnRyID0gMHgleCwgaW50cl9yeG1zZyA9IDB4JXhcbiIsCisJCQltY2lfaW50LCBtY2lfaW50X3J4bXNnKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UpIHsKKwkJdTMyIHBheWxvYWRbNF0gPSB7IDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJCQkJICAgMHhmZmZmZmZmZiwgMHhmZmZmZmYwMH07CisKKwkJLyoKKwkJICogVGhlIGZvbGxvd2luZyBSRU1PVEVfUkVTRVQgYW5kIFNZU19XQUtJTkcgdXNlZCB0byBzZW50CisJCSAqIG9ubHkgd2hlbiBCVCB3YWtlIHVwLiBOb3cgdGhleSBhcmUgYWx3YXlzIHNlbnQsIGFzIGEKKwkJICogcmVjb3ZlcnkgbWV0aG9kIHRvIHJlc2V0IEJUIE1DSSdzIFJYIGFsaWdubWVudC4KKwkJICovCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBpbnRlcnJ1cHQgc2VuZCBSRU1PVEVfUkVTRVRcbiIpOworCisJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfUkVNT1RFX1JFU0VULCAwLAorCQkJCQlwYXlsb2FkLCAxNiwgdHJ1ZSwgZmFsc2UpOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgaW50ZXJydXB0IHNlbmQgU1lTX1dBS0lOR1xuIik7CisJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfU1lTX1dBS0lORywgMCwKKwkJCQkJTlVMTCwgMCwgdHJ1ZSwgZmFsc2UpOworCisJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFOworCQlhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfUkVTRVRfUkVRX1dBS0UsIE5VTEwpOworCisJCS8qCisJCSAqIGFsd2F5cyBkbyB0aGlzIGZvciByZWNvdmVyeSBhbmQgMkcvNUcgdG9nZ2xpbmcgYW5kIExOQV9UUkFOUworCQkgKi8KKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIFNldCBCVCBzdGF0ZSB0byBBV0FLRS5cbiIpOworCQlhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfU0VUX0JUX0FXQUtFLCBOVUxMKTsKKwl9CisKKwkvKiBQcm9jZXNzaW5nIFNZU19XQUtJTkcvU1lTX1NMRUVQSU5HICovCisJaWYgKG1jaV9pbnRfcnhtc2cgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HKSB7CisJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkc7CisKKwkJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9CVCwgTlVMTCkgPT0gTUNJX0JUX1NMRUVQKSB7CisKKwkJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfUkVNT1RFX1NMRUVQLCBOVUxMKQorCQkJCQk9PSBNQ0lfQlRfU0xFRVApCisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkiTUNJIEJUIHN0YXlzIGluIHNsZWVwIG1vZGVcbiIpOworCQkJZWxzZSB7CisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkiTUNJIFNldCBCVCBzdGF0ZSB0byBBV0FLRS5cbiIpOworCQkJCWFyOTAwM19tY2lfc3RhdGUoYWgsCisJCQkJCQkgTUNJX1NUQVRFX1NFVF9CVF9BV0FLRSwgTlVMTCk7CisJCQl9CisJCX0gZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgQlQgc3RheXMgaW4gQVdBS0UgbW9kZS5cbiIpOworCX0KKworCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1NMRUVQSU5HKSB7CisKKwkJbWNpX2ludF9yeG1zZyAmPSB+QVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1NMRUVQSU5HOworCisJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfQlQsIE5VTEwpID09IE1DSV9CVF9BV0FLRSkgeworCisJCQlpZiAoYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX1JFTU9URV9TTEVFUCwgTlVMTCkKKwkJCQkJPT0gTUNJX0JUX0FXQUtFKQorCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSBCVCBzdGF5cyBpbiBBV0FLRSBtb2RlLlxuIik7CisJCQllbHNlIHsKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgU2V0QlQgc3RhdGUgdG8gU0xFRVBcbiIpOworCQkJCWFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9TRVRfQlRfU0xFRVAsCisJCQkJCQkgTlVMTCk7CisJCQl9CisJCX0gZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgQlQgc3RheXMgaW4gU0xFRVAgbW9kZVxuIik7CisJfQorCisJaWYgKChtY2lfaW50ICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUikgfHwKKwkgICAgKG1jaV9pbnQgJiBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUKSkgeworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBSWCBicm9rZW4sIHNraXAgR1BNIG1zZ3NcbiIpOworCQlhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfUkVDT1ZFUl9SWCwgTlVMTCk7CisJCXNraXBfZ3BtID0gdHJ1ZTsKKwl9CisKKwlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTykgeworCisJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTzsKKwkJb2Zmc2V0ID0gYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0xBU1RfU0NIRF9NU0dfT0ZGU0VULAorCQkJCQkgIE5VTEwpOworCX0KKworCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfR1BNKSB7CisKKwkJbWNpX2ludF9yeG1zZyAmPSB+QVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfR1BNOworCisJCXdoaWxlIChtb3JlX2RhdGEgPT0gTUNJX0dQTV9NT1JFKSB7CisKKwkJCXBncG0gPSBtY2ktPmdwbV9idWYuYmZfYWRkcjsKKwkJCW9mZnNldCA9IGFyOTAwM19tY2lfc3RhdGUoYWgsCisJCQkJCU1DSV9TVEFURV9ORVhUX0dQTV9PRkZTRVQsICZtb3JlX2RhdGEpOworCisJCQlpZiAob2Zmc2V0ID09IE1DSV9HUE1fSU5WQUxJRCkKKwkJCQlicmVhazsKKworCQkJcGdwbSArPSAob2Zmc2V0ID4+IDIpOworCisJCQkvKgorCQkJICogVGhlIGZpcnN0IGR3b3JkIGlzIHRpbWVyLgorCQkJICogVGhlIHJlYWwgZGF0YSBzdGFydHMgZnJvbSAybmQgZHdvcmQuCisJCQkgKi8KKworCQkJc3VidHlwZSA9IE1DSV9HUE1fVFlQRShwZ3BtKTsKKwkJCW9wY29kZSA9IE1DSV9HUE1fT1BDT0RFKHBncG0pOworCisJCQlpZiAoIXNraXBfZ3BtKSB7CisKKwkJCQlpZiAoTUNJX0dQTV9JU19DQUxfVFlQRShzdWJ0eXBlKSkKKwkJCQkJYXRoX21jaV9jYWxfbXNnKHNjLCBzdWJ0eXBlLAorCQkJCQkJCSh1OCAqKSBwZ3BtKTsKKwkJCQllbHNlIHsKKwkJCQkJc3dpdGNoIChzdWJ0eXBlKSB7CisJCQkJCWNhc2UgTUNJX0dQTV9DT0VYX0FHRU5UOgorCQkJCQkJYXRoX21jaV9tc2coc2MsIG9wY29kZSwKKwkJCQkJCQkgICAgKHU4ICopIHBncG0pOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCU1DSV9HUE1fUkVDWUNMRShwZ3BtKTsKKwkJfQorCX0KKworCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfTUFTSykgeworCisJCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0NPTlRST0wpCisJCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTDsKKworCQlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPKSB7CisJCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GTzsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBMTkFfSU5GT1xuIik7CisJCX0KKworCQlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GTykgeworCisJCQlpbnQgdmFsdWVfZGJtID0gYXI5MDAzX21jaV9zdGF0ZShhaCwKKwkJCQkJTUNJX1NUQVRFX0NPTlRfUlNTSV9QT1dFUiwgTlVMTCk7CisKKwkJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GTzsKKworCQkJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9DT05UX1RYUlgsIE5VTEwpKQorCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSBDT05UX0lORk86ICIKKwkJCQkJIih0eCkgcHJpID0gJWQsIHB3ciA9ICVkIGRCbVxuIiwKKwkJCQkJYXI5MDAzX21jaV9zdGF0ZShhaCwKKwkJCQkJCU1DSV9TVEFURV9DT05UX1BSSU9SSVRZLCBOVUxMKSwKKwkJCQkJdmFsdWVfZGJtKTsKKwkJCWVsc2UKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgQ09OVF9JTkZPOiIKKwkJCQkJIihyeCkgcHJpID0gJWQscHdyID0gJWQgZEJtXG4iLAorCQkJCQlhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQkJCQkJTUNJX1NUQVRFX0NPTlRfUFJJT1JJVFksIE5VTEwpLAorCQkJCQl2YWx1ZV9kYm0pOworCQl9CisKKwkJaWYgKG1jaV9pbnRfcnhtc2cgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX05BQ0spIHsKKwkJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDSzsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBDT05UX05BQ0tcbiIpOworCQl9CisKKwkJaWYgKG1jaV9pbnRfcnhtc2cgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVCkgeworCQkJbWNpX2ludF9yeG1zZyAmPSB+QVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9SU1Q7CisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgQ09OVF9SU1RcbiIpOworCQl9CisJfQorCisJaWYgKChtY2lfaW50ICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUikgfHwKKwkgICAgKG1jaV9pbnQgJiBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUKSkKKwkJbWNpX2ludCAmPSB+KEFSX01DSV9JTlRFUlJVUFRfUlhfSU5WQUxJRF9IRFIgfAorCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUKTsKKworCWlmIChtY2lfaW50X3J4bXNnICYgMHhmZmZmZmZmZSkKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBub3QgcHJvY2Vzc2VkIG1jaV9pbnRfcnhtc2cgPSAweCV4XG4iLAorCQkJbWNpX2ludF9yeG1zZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxYmRlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tY2kuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgTUNJX0gKKyNkZWZpbmUgTUNJX0gKKworI2RlZmluZSBBVEhfTUNJX1NDSEVEX0JVRl9TSVpFCQkoMTYgKiAxNikgLyogMTYgZW50cmllcywgNCBkd29yZCBlYWNoICovCisjZGVmaW5lIEFUSF9NQ0lfR1BNX01BWF9FTlRSWQkJMTYKKyNkZWZpbmUgQVRIX01DSV9HUE1fQlVGX1NJWkUJCShBVEhfTUNJX0dQTV9NQVhfRU5UUlkgKiAxNikKKyNkZWZpbmUgQVRIX01DSV9ERUZfQlRfUEVSSU9ECQk0MAorI2RlZmluZSBBVEhfTUNJX0JEUl9EVVRZX0NZQ0xFCQkyMAorI2RlZmluZSBBVEhfTUNJX01BWF9EVVRZX0NZQ0xFCQk5MAorCisjZGVmaW5lIEFUSF9NQ0lfREVGX0FHR1JfTElNSVQJCTYgLyogaW4gMC4yNCBtcyAqLworI2RlZmluZSBBVEhfTUNJX01BWF9BQ0xfUFJPRklMRQkJNworI2RlZmluZSBBVEhfTUNJX01BWF9TQ09fUFJPRklMRQkJMQorI2RlZmluZSBBVEhfTUNJX01BWF9QUk9GSUxFCQkoQVRIX01DSV9NQVhfQUNMX1BST0ZJTEUgK1wKKwkJCQkJIEFUSF9NQ0lfTUFYX1NDT19QUk9GSUxFKQorCisjZGVmaW5lIElOQ19QUk9GKF9tY2ksIF9pbmZvKSBkbyB7CQkgXAorCQlzd2l0Y2ggKF9pbmZvLT50eXBlKSB7CQkgXAorCQljYXNlIE1DSV9HUE1fQ09FWF9QUk9GSUxFX1JGQ09NTTpcCisJCQlfbWNpLT5udW1fb3RoZXJfYWNsKys7CSBcCisJCQlicmVhazsJCQkgXAorCQljYXNlIE1DSV9HUE1fQ09FWF9QUk9GSUxFX0EyRFA6CSBcCisJCQlfbWNpLT5udW1fYTJkcCsrOwkgXAorCQkJaWYgKCFfaW5mby0+ZWRyKQkgXAorCQkJCV9tY2ktPm51bV9iZHIrKzsgXAorCQkJYnJlYWs7CQkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9ISUQ6CSBcCisJCQlfbWNpLT5udW1faGlkKys7CSBcCisJCQlicmVhazsJCQkgXAorCQljYXNlIE1DSV9HUE1fQ09FWF9QUk9GSUxFX0JORVA6CSBcCisJCQlfbWNpLT5udW1fcGFuKys7CSBcCisJCQlicmVhazsJCQkgXAorCQljYXNlIE1DSV9HUE1fQ09FWF9QUk9GSUxFX1ZPSUNFOiBcCisJCQlfbWNpLT5udW1fc2NvKys7CSBcCisJCQlicmVhazsJCQkgXAorCQlkZWZhdWx0OgkJCSBcCisJCQlicmVhazsJCQkgXAorCQl9CQkJCSBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBERUNfUFJPRihfbWNpLCBfaW5mbykgZG8gewkJIFwKKwkJc3dpdGNoIChfaW5mby0+dHlwZSkgewkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9SRkNPTU06XAorCQkJX21jaS0+bnVtX290aGVyX2FjbC0tOwkgXAorCQkJYnJlYWs7CQkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9BMkRQOgkgXAorCQkJX21jaS0+bnVtX2EyZHAtLTsJIFwKKwkJCWlmICghX2luZm8tPmVkcikJIFwKKwkJCQlfbWNpLT5udW1fYmRyLS07IFwKKwkJCWJyZWFrOwkJCSBcCisJCWNhc2UgTUNJX0dQTV9DT0VYX1BST0ZJTEVfSElEOgkgXAorCQkJX21jaS0+bnVtX2hpZC0tOwkgXAorCQkJYnJlYWs7CQkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9CTkVQOgkgXAorCQkJX21jaS0+bnVtX3Bhbi0tOwkgXAorCQkJYnJlYWs7CQkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9WT0lDRTogXAorCQkJX21jaS0+bnVtX3Njby0tOwkgXAorCQkJYnJlYWs7CQkJIFwKKwkJZGVmYXVsdDoJCQkgXAorCQkJYnJlYWs7CQkJIFwKKwkJfQkJCQkgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgTlVNX1BST0YoX21jaSkJKF9tY2ktPm51bV9vdGhlcl9hY2wgKyBfbWNpLT5udW1fYTJkcCArIFwKKwkJCSBfbWNpLT5udW1faGlkICsgX21jaS0+bnVtX3BhbiArIF9tY2ktPm51bV9zY28pCisKK3N0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyB7CisJdTggdHlwZTsKKwl1OCBjb25uX2hhbmRsZTsKKwlib29sIHN0YXJ0OworCWJvb2wgbWFzdGVyOworCWJvb2wgZWRyOworCXU4IHZvaWNlX3R5cGU7CisJdTE2IFQ7CQkvKiBWb2ljZTogVHZvaWNlLCBISUQ6IFRzbmlmZiwgICAgICAgIGluIHNsb3RzICovCisJdTggVzsJCS8qIFZvaWNlOiBXdm9pY2UsIEhJRDogU25pZmYgdGltZW91dCwgaW4gc2xvdHMgKi8KKwl1OCBBOwkJLyoJCSAgSElEOiBTbmlmZiBhdHRlbXB0LCBpbiBzbG90cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfc3RhdHVzIHsKKwlib29sIGlzX2NyaXRpY2FsOworCWJvb2wgaXNfbGluazsKKwl1OCBjb25uX2hhbmRsZTsKK307CisKK3N0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgeworCXN0cnVjdCBsaXN0X2hlYWQgaW5mbzsKKwlERUNMQVJFX0JJVE1BUChzdGF0dXMsIEFUSF9NQ0lfTUFYX1BST0ZJTEUpOworCXUxNiBhZ2dyX2xpbWl0OworCXU4IG51bV9tZ210OworCXU4IG51bV9zY287CisJdTggbnVtX2EyZHA7CisJdTggbnVtX2hpZDsKKwl1OCBudW1fcGFuOworCXU4IG51bV9vdGhlcl9hY2w7CisJdTggbnVtX2JkcjsKK307CisKKworc3RydWN0IGF0aF9tY2lfYnVmIHsKKwl2b2lkICpiZl9hZGRyOwkJLyogdmlydHVhbCBhZGRyIG9mIGRlc2MgKi8KKwlkbWFfYWRkcl90IGJmX3BhZGRyOyAgICAvKiBwaHlzaWNhbCBhZGRyIG9mIGJ1ZmZlciAqLworCXUzMiBiZl9sZW47CQkvKiBsZW4gb2YgZGF0YSAqLworfTsKKworc3RydWN0IGF0aF9tY2lfY29leCB7CisJYXRvbWljX3QgbWNpX2NhbF9mbGFnOworCXN0cnVjdCBhdGhfbWNpX2J1ZiBzY2hlZF9idWY7CisJc3RydWN0IGF0aF9tY2lfYnVmIGdwbV9idWY7CisJdTMyIGJ0X2NhbF9zdGFydDsKK307CisKK3ZvaWQgYXRoX21jaV9mbHVzaF9wcm9maWxlKHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgKm1jaSk7Cit2b2lkIGF0aF9tY2lfcHJvY2Vzc19wcm9maWxlKHN0cnVjdCBhdGhfc29mdGMgKnNjLAorCQkJICAgICBzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8gKmluZm8pOwordm9pZCBhdGhfbWNpX3Byb2Nlc3Nfc3RhdHVzKHN0cnVjdCBhdGhfc29mdGMgKnNjLAorCQkJICAgIHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfc3RhdHVzICpzdGF0dXMpOworaW50IGF0aF9tY2lfc2V0dXAoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwordm9pZCBhdGhfbWNpX2NsZWFudXAoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwordm9pZCBhdGhfbWNpX2ludHIoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKaW5kZXggZWRiMGI0Yi4uMmRjZGY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CiAjaW5jbHVkZSA8bGludXgvYXRoOWtfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJhdGg5ay5oIgogCiBzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoYXRoX3BjaV9pZF90YWJsZSkgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCmluZGV4IDg0NDgyODEuLjg4OGFiYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImF0aDlrLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVjdi5jCmluZGV4IDY3Yjg2MmMuLmUwMzE4NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlY3YuYwpAQCAtNDc1LDcgKzQ3NSw2IEBACiAKIAlyZXR1cm4gcmZpbHQ7CiAKLSN1bmRlZiBSWF9GSUxURVJfUFJFU0VSVkUKIH0KIAogaW50IGF0aF9zdGFydHJlY3Yoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCkBAIC0xODM4LDExICsxODM3LDYgQEAKIAkJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1JYRkxVU0gpCiAJCQlnb3RvIHJlcXVldWVfZHJvcF9mcmFnOwogCi0JCXJldHZhbCA9IGF0aDlrX3J4X3NrYl9wcmVwcm9jZXNzKGNvbW1vbiwgaHcsIGhkciwgJnJzLAotCQkJCQkJIHJ4cywgJmRlY3J5cHRfZXJyb3IpOwotCQlpZiAocmV0dmFsKQotCQkJZ290byByZXF1ZXVlX2Ryb3BfZnJhZzsKLQogCQlyeHMtPm1hY3RpbWUgPSAodHNmICYgfjB4ZmZmZmZmZmZVTEwpIHwgcnMucnNfdHN0YW1wOwogCQlpZiAocnMucnNfdHN0YW1wID4gdHNmX2xvd2VyICYmCiAJCSAgICB1bmxpa2VseShycy5yc190c3RhbXAgLSB0c2ZfbG93ZXIgPiAweDEwMDAwMDAwKSkKQEAgLTE4NTIsNiArMTg0NiwxMSBAQAogCQkgICAgdW5saWtlbHkodHNmX2xvd2VyIC0gcnMucnNfdHN0YW1wID4gMHgxMDAwMDAwMCkpCiAJCQlyeHMtPm1hY3RpbWUgKz0gMHgxMDAwMDAwMDBVTEw7CiAKKwkJcmV0dmFsID0gYXRoOWtfcnhfc2tiX3ByZXByb2Nlc3MoY29tbW9uLCBodywgaGRyLCAmcnMsCisJCQkJCQkgcnhzLCAmZGVjcnlwdF9lcnJvcik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIHJlcXVldWVfZHJvcF9mcmFnOworCiAJCS8qIEVuc3VyZSB3ZSBhbHdheXMgaGF2ZSBhbiBza2IgdG8gcmVxdWV1ZSBvbmNlIHdlIGFyZSBkb25lCiAJCSAqIHByb2Nlc3NpbmcgdGhlIGN1cnJlbnQgYnVmZmVyJ3Mgc2tiICovCiAJCXJlcXVldWVfc2tiID0gYXRoX3J4YnVmX2FsbG9jKGNvbW1vbiwgY29tbW9uLT5yeF9idWZzaXplLCBHRlBfQVRPTUlDKTsKQEAgLTE5MjMsMTUgKzE5MjIsMjAgQEAKIAkJCXNrYiA9IGhkcl9za2I7CiAJCX0KIAotCQkvKgotCQkgKiBjaGFuZ2UgdGhlIGRlZmF1bHQgcnggYW50ZW5uYSBpZiByeCBkaXZlcnNpdHkgY2hvb3NlcyB0aGUKLQkJICogb3RoZXIgYW50ZW5uYSAzIHRpbWVzIGluIGEgcm93LgotCQkgKi8KLQkJaWYgKHNjLT5yeC5kZWZhbnQgIT0gcnMucnNfYW50ZW5uYSkgewotCQkJaWYgKCsrc2MtPnJ4LnJ4b3RoZXJhbnQgPj0gMykKLQkJCQlhdGhfc2V0ZGVmYW50ZW5uYShzYywgcnMucnNfYW50ZW5uYSk7Ci0JCX0gZWxzZSB7Ci0JCQlzYy0+cngucnhvdGhlcmFudCA9IDA7CisKKwkJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfQU5UX0RJVl9DT01CKSB7CisKKwkJCS8qCisJCQkgKiBjaGFuZ2UgdGhlIGRlZmF1bHQgcnggYW50ZW5uYSBpZiByeCBkaXZlcnNpdHkKKwkJCSAqIGNob29zZXMgdGhlIG90aGVyIGFudGVubmEgMyB0aW1lcyBpbiBhIHJvdy4KKwkJCSAqLworCQkJaWYgKHNjLT5yeC5kZWZhbnQgIT0gcnMucnNfYW50ZW5uYSkgeworCQkJCWlmICgrK3NjLT5yeC5yeG90aGVyYW50ID49IDMpCisJCQkJCWF0aF9zZXRkZWZhbnRlbm5hKHNjLCBycy5yc19hbnRlbm5hKTsKKwkJCX0gZWxzZSB7CisJCQkJc2MtPnJ4LnJ4b3RoZXJhbnQgPSAwOworCQkJfQorCiAJCX0KIAogCQlpZiAocnhzLT5mbGFnICYgUlhfRkxBR19NTUlDX1NUUklQUEVEKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oCmluZGV4IDhmY2I3ZTkuLjZlMmYxODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmgKQEAgLTEwMDYsNiArMTAwNiw4IEBACiAjZGVmaW5lIEFSX0lOVFJfQVNZTkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKEFSX1NSRVZfOTM0MChhaCkgPyAweDQwMTggOiAweDQwMzApCiAjZGVmaW5lIEFSX0lOVFJfQVNZTkNfTUFTS19HUElPICAgICAgICAgICAgICAgICAgMHhGRkZDMDAwMAogI2RlZmluZSBBUl9JTlRSX0FTWU5DX01BU0tfR1BJT19TICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEFSX0lOVFJfQVNZTkNfTUFTS19NQ0kgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBUl9JTlRSX0FTWU5DX01BU0tfTUNJX1MgICAgICAgICAgICAgICAgIDcKIAogI2RlZmluZSBBUl9JTlRSX1NZTkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIChBUl9TUkVWXzkzNDAoYWgpID8gMHg0MDFjIDogMHg0MDM0KQogI2RlZmluZSBBUl9JTlRSX1NZTkNfTUFTS19HUElPICAgICAgICAgICAgICAgICAgIDB4RkZGQzAwMDAKQEAgLTEwMTMsNiArMTAxNSwxNCBAQAogCiAjZGVmaW5lIEFSX0lOVFJfQVNZTkNfQ0FVU0VfQ0xSICAgICAgICAgICAgICAgICAgKEFSX1NSRVZfOTM0MChhaCkgPyAweDQwMjAgOiAweDQwMzgpCiAjZGVmaW5lIEFSX0lOVFJfQVNZTkNfQ0FVU0UgICAgICAgICAgICAgICAgICAgICAgKEFSX1NSRVZfOTM0MChhaCkgPyAweDQwMjAgOiAweDQwMzgpCisjZGVmaW5lIEFSX0lOVFJfQVNZTkNfQ0FVU0VfTUNJCQkJIDB4MDAwMDAwODAKKyNkZWZpbmUgQVJfSU5UUl9BU1lOQ19VU0VECQkJIChBUl9JTlRSX01BQ19JUlEgfCBcCisJCQkJCQkgIEFSX0lOVFJfQVNZTkNfQ0FVU0VfTUNJKQorCisvKiBBc3luY2hyb25vdXMgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBUl9JTlRSX0FTWU5DX0VOQUJMRV9NQ0kgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEFSX0lOVFJfQVNZTkNfRU5BQkxFX01DSV9TICAgICAgIDcKKwogCiAjZGVmaW5lIEFSX0lOVFJfQVNZTkNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgKEFSX1NSRVZfOTM0MChhaCkgPyAweDQwMjQgOiAweDQwM2MpCiAjZGVmaW5lIEFSX0lOVFJfQVNZTkNfRU5BQkxFX0dQSU8gICAgICAgICAgICAgICAgMHhGRkZDMDAwMApAQCAtMTI2OSw2ICsxMjc5LDggQEAKICNkZWZpbmUgQVJfUlRDX0lOVFJfTUFTSyBcCiAJKChBUl9TUkVWXzkxMDAoYWgpKSA/IChBUl9SVENfQkFTRSArIDB4MDA1OCkgOiAweDcwNTgpCiAKKyNkZWZpbmUgQVJfUlRDX0tFRVBfQVdBS0UJMHg3MDM0CisKIC8qIFJUQ19ERVJJVkVEXyogLSBvbmx5IGZvciBBUjkxMDAgKi8KIAogI2RlZmluZSBBUl9SVENfREVSSVZFRF9DTEsgXApAQCAtMTU1NSw2ICsxNTY3LDggQEAKICNkZWZpbmUgQVJfRElBR19GUkFNRV9OVjAgICAgICAgICAgIDB4MDAwMjAwMDAKICNkZWZpbmUgQVJfRElBR19PQlNfUFRfU0VMMSAgICAgICAgIDB4MDAwQzAwMDAKICNkZWZpbmUgQVJfRElBR19PQlNfUFRfU0VMMV9TICAgICAgIDE4CisjZGVmaW5lIEFSX0RJQUdfT0JTX1BUX1NFTDIgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEFSX0RJQUdfT0JTX1BUX1NFTDJfUyAgICAgICAyNwogI2RlZmluZSBBUl9ESUFHX0ZPUkNFX1JYX0NMRUFSICAgICAgMHgwMDEwMDAwMCAvKiBmb3JjZSByeF9jbGVhciBoaWdoICovCiAjZGVmaW5lIEFSX0RJQUdfSUdOT1JFX1ZJUlRfQ1MgICAgICAweDAwMjAwMDAwCiAjZGVmaW5lIEFSX0RJQUdfRk9SQ0VfQ0hfSURMRV9ISUdIICAweDAwNDAwMDAwCkBAIC0xNzUyLDE5ICsxNzY2LDEwIEBACiAKICNkZWZpbmUgQVJfQlRfQ09FWF9XTF9XRUlHSFRTMCAgICAgMHg4MTc0CiAjZGVmaW5lIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzEgICAgIDB4ODFjNAorI2RlZmluZSBBUl9NQ0lfQ09FWF9XTF9XRUlHSFRTKF9pKSAoMHgxOGIwICsgKF9pIDw8IDIpKQorI2RlZmluZSBBUl9CVF9DT0VYX0JUX1dFSUdIVFMoX2kpICAoMHg4M2FjICsgKF9pIDw8IDIpKQogCi0jZGVmaW5lIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzAgICAgIDB4ODNhYwotI2RlZmluZSBBUl9CVF9DT0VYX0JUX1dFSUdIVFMxICAgICAweDgzYjAKLSNkZWZpbmUgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMiAgICAgMHg4M2I0Ci0jZGVmaW5lIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzMgICAgIDB4ODNiOAotCi0jZGVmaW5lIEFSOTMwMF9CVF9XR0hUICAgICAgICAgICAgICAgICAgICAgMHhjY2NjNDQ0NAotI2RlZmluZSBBUjkzMDBfU1RPTVBfQUxMX1dMQU5fV0dIVDAgICAgICAgIDB4ZmZmZmZmZjAKLSNkZWZpbmUgQVI5MzAwX1NUT01QX0FMTF9XTEFOX1dHSFQxICAgICAgICAweGZmZmZmZmYwCi0jZGVmaW5lIEFSOTMwMF9TVE9NUF9MT1dfV0xBTl9XR0hUMCAgICAgICAgMHg4ODg4ODg4MAotI2RlZmluZSBBUjkzMDBfU1RPTVBfTE9XX1dMQU5fV0dIVDEgICAgICAgIDB4ODg4ODg4ODAKLSNkZWZpbmUgQVI5MzAwX1NUT01QX05PTkVfV0xBTl9XR0hUMCAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEFSOTMwMF9TVE9NUF9OT05FX1dMQU5fV0dIVDEgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBBUjkzMDBfQlRfV0dIVCAgICAgICAgICAgICAweGNjY2M0NDQ0CiAKICNkZWZpbmUgQVJfQlRfQ09FWF9NT0RFMiAgICAgICAgICAgMHg4MTdjCiAjZGVmaW5lIEFSX0JUX0JDTl9NSVNTX1RIUkVTSCAgICAgIDB4MDAwMDAwZmYKQEAgLTE5MzgsMzcgKzE5NDMsMjc3IEBACiAjZGVmaW5lIEFSX1BIWV9BR0NfQ09OVFJPTF9ZQ09LX01BWF9TCQk2CiAKIC8qIE1DSSBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfRU4JCTB4MTgzYwotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRU1PVEVfUkVTRVQgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRU1PVEVfUkVTRVRfUyAgMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTCAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTF9TICAgMQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX05BQ0sgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX05BQ0tfUyAgICAgMgotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8gICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk9fUyAgICAgMwotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVCAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVF9TICAgICAgNAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TQ0hEX0lORk8gICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TQ0hEX0lORk9fUyAgICAgNQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DUFVfSU5UICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DUFVfSU5UX1MgICAgICAgNgotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19HUE0gICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19HUE1fUyAgICAgICAgICAgOAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GTyAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GT19TICAgICAgOQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfU0xFRVBJTkcgICAgMHgwMDAwMDQwMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfU0xFRVBJTkdfUyAgMTAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lORyAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lOR19TICAgIDExCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFX1MgICAgICAxMgotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0hXX01TR19NQVNLCShBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TQ0hEX0lORk8gIHwgXAorCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMAkJCQkweDE4MDAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwX0hFQURFUgkJCTB4RkYKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwX0hFQURFUl9TCQkwCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMF9MRU4JCQkweDFmMDAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwX0xFTl9TCQkJOAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfRElTQUJMRV9USU1FU1RBTVAJMHgyMDAwCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMF9ESVNBQkxFX1RJTUVTVEFNUF9TCTEzCisKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQxCQkJCTB4MTgwNAorCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMgkJCQkweDE4MDgKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1RYCQkweDAxCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9UWF9TCQkwCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWAkJMHgwMgorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUlhfUwkJMQorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUlhfTlVNX0NZQ0xFUyAgICAgMHgzRkMKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JYX05VTV9DWUNMRVNfUyAgIDIKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JFUV9XQUtFVVAgICAgICAgIDB4NDAwCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SRVFfV0FLRVVQX1MgICAgICAxMAorCisjZGVmaW5lIEFSX01DSV9SWF9DVFJMCQkJCTB4MTgwYworCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMCQkJCTB4MTgxMAorLyogMCA9IG5vIGRpdmlzaW9uLCAxID0gZGl2aWRlIGJ5IDIsIDIgPSBkaXZpZGUgYnkgNCwgMyA9IGRpdmlkZSBieSA4ICovCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0NMS19ESVYJCQkweDAzCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0NMS19ESVZfUwkJMAorI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEUJMHgwNAorI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEVfUwkyCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0dBSU5fVVBEQVRFX0ZSRVEJCTB4RkZGRkY4CisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0dBSU5fVVBEQVRFX0ZSRVFfUwkzCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0dBSU5fVVBEQVRFX05VTQkJMHhGMDAwMDAwCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0dBSU5fVVBEQVRFX05VTV9TCTI0CisKKyNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFCQkJMHgxODE0CisjZGVmaW5lIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9DSEVDS1NVTQkJMHhGRkZGCisjZGVmaW5lIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9DSEVDS1NVTV9TCQkwCisjZGVmaW5lIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9JTlZBTElEX0hEUgkJMHhGRkZGMDAwMAorI2RlZmluZSBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEVfSU5WQUxJRF9IRFJfUwkxNgorCisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzAJCQkJMHgxODE4CisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzEJCQkJMHgxODFjCisjZGVmaW5lIEFSX01DSV9HUE1fMAkJCQkJMHgxODIwCisjZGVmaW5lIEFSX01DSV9HUE1fMQkJCQkJMHgxODI0CisjZGVmaW5lIEFSX01DSV9HUE1fV1JJVEVfUFRSCQkJCTB4RkZGRjAwMDAKKyNkZWZpbmUgQVJfTUNJX0dQTV9XUklURV9QVFJfUwkJCQkxNgorI2RlZmluZSBBUl9NQ0lfR1BNX0JVRl9MRU4JCQkJMHgwMDAwRkZGRgorI2RlZmluZSBBUl9NQ0lfR1BNX0JVRl9MRU5fUwkJCQkwCisKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SQVcJCQkJMHgxODI4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfRU4JCQkJMHgxODJjCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfU1dfTVNHX0RPTkUJCQkweDAwMDAwMDAxCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfU1dfTVNHX0RPTkVfUwkJCTAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9DUFVfSU5UX01TRwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9DUFVfSU5UX01TR19TCQkJMQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0NLU1VNX0ZBSUwJCQkweDAwMDAwMDA0CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfQ0tTVU1fRkFJTF9TCQkyCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSU5WQUxJRF9IRFIJCQkweDAwMDAwMDA4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSU5WQUxJRF9IRFJfUwkJMworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0hXX01TR19GQUlMCQkJMHgwMDAwMDAxMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0hXX01TR19GQUlMX1MJCTQKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9TV19NU0dfRkFJTAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9TV19NU0dfRkFJTF9TCQk1CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfVFhfSFdfTVNHX0ZBSUwJCQkweDAwMDAwMDgwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfVFhfSFdfTVNHX0ZBSUxfUwkJNworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1RYX1NXX01TR19GQUlMCQkJMHgwMDAwMDEwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1RYX1NXX01TR19GQUlMX1MJCTgKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0cJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TCQkJOQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JFTU9URV9TTEVFUF9VUERBVEUJCTB4MDAwMDA0MDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SRU1PVEVfU0xFRVBfVVBEQVRFX1MJCTEwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfUFJJCQkJCTB4MDdmZmY4MDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUklfUwkJCTExCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfUFJJX1RIUkVTSAkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUklfVEhSRVNIX1MJCTI3CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfRlJFUQkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9GUkVRX1MJCQkyOAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1NUT01QCQkJMHgyMDAwMDAwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1NUT01QX1MJCQkyOQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JCX0FJQ19JUlEJCQkweDQwMDAwMDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQkJfQUlDX0lSUV9TCQkJMzAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9DT05UX0lORk9fVElNRU9VVAkJMHg4MDAwMDAwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUX1MJCTMxCisKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9ERUZBVUxUICAgIChBUl9NQ0lfSU5URVJSVVBUX1NXX01TR19ET05FCSAgfCBcCisJCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX1JYX0lOVkFMSURfSERSCSAgfCBcCisJCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX1JYX0hXX01TR19GQUlMCSAgfCBcCisJCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX1JYX1NXX01TR19GQUlMCSAgfCBcCisJCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX1RYX0hXX01TR19GQUlMCSAgfCBcCisJCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX1RYX1NXX01TR19GQUlMCSAgfCBcCisJCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TRwkJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUkVNT1RFX1NMRUVQX1VQREFURSB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfQ09OVF9JTkZPX1RJTUVPVVQpCisKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9NU0dfRkFJTF9NQVNLIChBUl9NQ0lfSU5URVJSVVBUX1JYX0hXX01TR19GQUlMIHwgXAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX1NXX01TR19GQUlMIHwgXAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1RYX0hXX01TR19GQUlMIHwgXAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1RYX1NXX01TR19GQUlMKQorCisjZGVmaW5lIEFSX01DSV9SRU1PVEVfQ1BVX0lOVAkJCQkweDE4MzAKKyNkZWZpbmUgQVJfTUNJX1JFTU9URV9DUFVfSU5UX0VOCQkJMHgxODM0CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVwkJCTB4MTgzOAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19FTgkJCTB4MTgzYworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRU1PVEVfUkVTRVQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVNT1RFX1JFU0VUX1MJCTAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0NPTlRST0wJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0NPTlRST0xfUwkJMQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX05BQ0sJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9OQUNLX1MJCTIKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9JTkZPCQkweDAwMDAwMDA4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GT19TCQkzCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUCQkweDAwMDAwMDEwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUX1MJCTQKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU0NIRF9JTkZPCQkweDAwMDAwMDIwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GT19TCQk1CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NQVV9JTlQJCQkweDAwMDAwMDQwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NQVV9JTlRfUwkJNgorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19HUE0JCQkweDAwMDAwMTAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTV9TCQkJOAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GTwkJMHgwMDAwMDIwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GT19TCQk5CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElORwkJMHgwMDAwMDQwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfU0xFRVBJTkdfUwkJMTAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lORwkJMHgwMDAwMDgwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HX1MJCTExCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFCQkweDAwMDAxMDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFX1MJCTEyCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX01BU0sJIChBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TQ0hEX0lORk8gIHwgXAogCQkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9DT05UUk9MfCBcCiAJCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0lORk8gICB8IFwKIAkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX05BQ0sgIHwgXAogCQkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GTyAgfCBcCiAJCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9SU1QpCiAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfREVGQVVMVCAoQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfR1BNCSB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lORyAgfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfU0xFRVBJTkd8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTyAgIHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0NPTlRST0wgfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GTyAgICB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDSyAgIHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9JTkZPICAgfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVCAgICB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFKQorCisjZGVmaW5lIEFSX01DSV9DUFVfSU5UCQkJCQkweDE4NDAKKworI2RlZmluZSBBUl9NQ0lfUlhfU1RBVFVTCQkJMHgxODQ0CisjZGVmaW5lIEFSX01DSV9SWF9MQVNUX1NDSERfTVNHX0lOREVYCQkweDAwMDAwRjAwCisjZGVmaW5lIEFSX01DSV9SWF9MQVNUX1NDSERfTVNHX0lOREVYX1MJCTgKKyNkZWZpbmUgQVJfTUNJX1JYX1JFTU9URV9TTEVFUAkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgQVJfTUNJX1JYX1JFTU9URV9TTEVFUF9TCQkxMgorI2RlZmluZSBBUl9NQ0lfUlhfTUNJX0NMS19SRVEJCQkweDAwMDAyMDAwCisjZGVmaW5lIEFSX01DSV9SWF9NQ0lfQ0xLX1JFUV9TCQkJMTMKKworI2RlZmluZSBBUl9NQ0lfQ09OVF9TVEFUVVMJCQkweDE4NDgKKyNkZWZpbmUgQVJfTUNJX0NPTlRfUlNTSV9QT1dFUgkJCTB4MDAwMDAwRkYKKyNkZWZpbmUgQVJfTUNJX0NPTlRfUlNTSV9QT1dFUl9TCQkwCisjZGVmaW5lIEFSX01DSV9DT05UX1JSSU9SSVRZCQkJMHgwMDAwRkYwMAorI2RlZmluZSBBUl9NQ0lfQ09OVF9SUklPUklUWV9TCQkJOAorI2RlZmluZSBBUl9NQ0lfQ09OVF9UWFJYCQkJMHgwMDAxMDAwMAorI2RlZmluZSBBUl9NQ0lfQ09OVF9UWFJYX1MJCQkxNgorCisjZGVmaW5lIEFSX01DSV9CVF9QUkkwCQkJCTB4MTg0YworI2RlZmluZSBBUl9NQ0lfQlRfUFJJMQkJCQkweDE4NTAKKyNkZWZpbmUgQVJfTUNJX0JUX1BSSTIJCQkJMHgxODU0CisjZGVmaW5lIEFSX01DSV9CVF9QUkkzCQkJCTB4MTg1OAorI2RlZmluZSBBUl9NQ0lfQlRfUFJJCQkJCTB4MTg1YworI2RlZmluZSBBUl9NQ0lfV0xfRlJFUTAJCQkJMHgxODYwCisjZGVmaW5lIEFSX01DSV9XTF9GUkVRMQkJCQkweDE4NjQKKyNkZWZpbmUgQVJfTUNJX1dMX0ZSRVEyCQkJCTB4MTg2OAorI2RlZmluZSBBUl9NQ0lfR0FJTgkJCQkweDE4NmMKKyNkZWZpbmUgQVJfTUNJX1dCVElNRVIxCQkJCTB4MTg3MAorI2RlZmluZSBBUl9NQ0lfV0JUSU1FUjIJCQkJMHgxODc0CisjZGVmaW5lIEFSX01DSV9XQlRJTUVSMwkJCQkweDE4NzgKKyNkZWZpbmUgQVJfTUNJX1dCVElNRVI0CQkJCTB4MTg3YworI2RlZmluZSBBUl9NQ0lfTUFYR0FJTgkJCQkweDE4ODAKKyNkZWZpbmUgQVJfTUNJX0hXX1NDSERfVEJMX0NUTAkJCTB4MTg4NAorI2RlZmluZSBBUl9NQ0lfSFdfU0NIRF9UQkxfRDAJCQkweDE4ODgKKyNkZWZpbmUgQVJfTUNJX0hXX1NDSERfVEJMX0QxCQkJMHgxODhjCisjZGVmaW5lIEFSX01DSV9IV19TQ0hEX1RCTF9EMgkJCTB4MTg5MAorI2RlZmluZSBBUl9NQ0lfSFdfU0NIRF9UQkxfRDMJCQkweDE4OTQKKyNkZWZpbmUgQVJfTUNJX1RYX1BBWUxPQUQwCQkJMHgxODk4CisjZGVmaW5lIEFSX01DSV9UWF9QQVlMT0FEMQkJCTB4MTg5YworI2RlZmluZSBBUl9NQ0lfVFhfUEFZTE9BRDIJCQkweDE4YTAKKyNkZWZpbmUgQVJfTUNJX1RYX1BBWUxPQUQzCQkJMHgxOGE0CisjZGVmaW5lIEFSX0JUQ09FWF9XQlRJTUVSCQkJMHgxOGE4CisKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwJCQkJCTB4MThhYworI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9BUjk0NjJfTU9ERQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfQVI5NDYyX01PREVfUwkJCTAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfV0JUSU1FUl9FTgkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfV0JUSU1FUl9FTl9TCQkJMQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9NQ0lfTU9ERV9FTgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfTUNJX01PREVfRU5fUwkJCTIKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfTE5BX1NIQVJFRAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfTE5BX1NIQVJFRF9TCQkJMworI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9QQV9TSEFSRUQJCQkweDAwMDAwMDEwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1BBX1NIQVJFRF9TCQkJNAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9PTkVfU1RFUF9MT09LX0FIRUFEX0VOCQkweDAwMDAwMDIwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU5fUwkJNQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9USU1FX1RPX05FWFRfQlRfVEhSRVNIX0VOCTB4MDAwMDAwNDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfVElNRV9UT19ORVhUX0JUX1RIUkVTSF9FTl9TCTYKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfTlVNX0FOVEVOTkFTCQkJMHgwMDAwMDE4MAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9OVU1fQU5URU5OQVNfUwkJCTcKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUlhfQ0hBSU5fTUFTSwkJCTB4MDAwMDBFMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUlhfQ0hBSU5fTUFTS19TCQkJOQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9BR0dSX1RIUkVTSAkJCTB4MDAwMDcwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfQUdHUl9USFJFU0hfUwkJCTEyCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMXzFfQ0hBSU5fQkNOCQkJMHgwMDA4MDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0JDTl9TCQkJMTkKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9BQ0sJCQkweDAwMTAwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMXzFfQ0hBSU5fQUNLX1MJCQkyMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9XQUlUX0JBX01BUkdJTgkJCTB4MUZFMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfV0FJVF9CQV9NQVJHSU5fUwkJCTI4CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1JFRFVDRV9UWFBXUgkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUkVEVUNFX1RYUFdSX1MJCQkyOQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRV8xMAkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9FTkFCTEVfMTBfUwkJCTMwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfUE9MQVJJVFkJCQkweDgwMDAwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfUE9MQVJJVFlfUwkJCTMxCisKKyNkZWZpbmUgQVJfQlRDT0VYX1dMX1dFSUdIVFMwCQkJCTB4MThiMAorI2RlZmluZSBBUl9CVENPRVhfV0xfV0VJR0hUUzEJCQkJMHgxOGI0CisjZGVmaW5lIEFSX0JUQ09FWF9XTF9XRUlHSFRTMgkJCQkweDE4YjgKKyNkZWZpbmUgQVJfQlRDT0VYX1dMX1dFSUdIVFMzCQkJCTB4MThiYworI2RlZmluZSBBUl9CVENPRVhfTUFYX1RYUFdSKF94KQkJCQkoMHgxOGMwICsgKChfeCkgPDwgMikpCisjZGVmaW5lIEFSX0JUQ09FWF9XTF9MTkEJCQkJMHgxOTQwCisjZGVmaW5lIEFSX0JUQ09FWF9SRkdBSU5fQ1RSTAkJCQkweDE5NDQKKworI2RlZmluZSBBUl9CVENPRVhfQ1RSTDIJCQkJCTB4MTk0OAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfVFhQV1JfVEhSRVNICQkJMHgwMDA3RjgwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfVFhQV1JfVEhSRVNIX1MJCQkxMQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfVFhfQ0hBSU5fTUFTSwkJCTB4MDAzODAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX1RYX0NIQUlOX01BU0tfUwkJCTE5CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9SWF9ERVdFSUdIVAkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX1JYX0RFV0VJR0hUX1MJCQkyMgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfR1BJT19PQlNfU0VMCQkJMHgwMDgwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfR1BJT19PQlNfU0VMX1MJCQkyMworI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfTUFDX0JCX09CU19TRUwJCQkweDAxMDAwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9NQUNfQkJfT0JTX1NFTF9TCQkyNAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfREVTQ19CQVNFRF9UWFBXUl9FTkFCTEUJCTB4MDIwMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX0RFU0NfQkFTRURfVFhQV1JfRU5BQkxFX1MJMjUKKworI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRSAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfRU5BQkxFX1MgICAgICAgIDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfQlRfT1dOX1NQRFRfQ1RSTCAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9CVF9PV05fU1BEVF9DVFJMX1MgICAxCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1VTRV9MQVRDSEVEX0JUX0FOVCAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfVVNFX0xBVENIRURfQlRfQU5UX1MgMgorI2RlZmluZSBBUl9HTEJfV0xBTl9VQVJUX0lOVEZfRU4gICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEFSX0dMQl9XTEFOX1VBUlRfSU5URl9FTl9TICAgICAgICAgIDE3CisjZGVmaW5lIEFSX0dMQl9EU19KVEFHX0RJU0FCTEUgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQVJfR0xCX0RTX0pUQUdfRElTQUJMRV9TICAgICAgICAgICAgMTgKKworI2RlZmluZSBBUl9CVENPRVhfUkMgICAgICAgICAgICAgICAgICAgIDB4MTk0YworI2RlZmluZSBBUl9CVENPRVhfTUFYX1JGR0FJTihfeCkgICAgICAgICgweDE5NTAgKyAoKF94KSA8PCAyKSkKKyNkZWZpbmUgQVJfQlRDT0VYX0RCRyAgICAgICAgICAgICAgICAgICAweDFhNTAKKyNkZWZpbmUgQVJfTUNJX0xBU1RfSFdfTVNHX0hEUiAgICAgICAgICAweDFhNTQKKyNkZWZpbmUgQVJfTUNJX0xBU1RfSFdfTVNHX0JEWSAgICAgICAgICAweDFhNTgKKworI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8yICAgICAgICAgICAgIDB4MWE1YworI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8yX01FTV9CQVNFRCAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMl9NRU1fQkFTRURfUyAwCisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzJfSFdfQkFTRUQgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8yX0hXX0JBU0VEX1MgIDEKKworI2RlZmluZSBBUl9CVENPRVhfQ1RSTDMgICAgICAgICAgICAgICAweDFhNjAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwzX0NPTlRfSU5GT19USU1FT1VUCTB4MDAwMDBmZmYKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwzX0NPTlRfSU5GT19USU1FT1VUX1MJMAorCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKaW5kZXggMDNiMGE2NS4uODA2MzllMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCkBAIC0xNzksNiArMTc5LDExIEBACiAJCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAJfQogCisJaWYgKHRpZC0+YmF3X2hlYWQgPT0gdGlkLT5iYXdfdGFpbCkgeworCQl0aWQtPnN0YXRlICY9IH5BR0dSX0FEREJBX0NPTVBMRVRFOworCQl0aWQtPnN0YXRlICY9IH5BR0dSX0NMRUFOVVA7CisJfQorCiAJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogfQogCkBAIC01NTYsMTUgKzU2MSw5IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAl9CiAKLQlpZiAodGlkLT5zdGF0ZSAmIEFHR1JfQ0xFQU5VUCkgeworCWlmICh0aWQtPnN0YXRlICYgQUdHUl9DTEVBTlVQKQogCQlhdGhfdHhfZmx1c2hfdGlkKHNjLCB0aWQpOwogCi0JCWlmICh0aWQtPmJhd19oZWFkID09IHRpZC0+YmF3X3RhaWwpIHsKLQkJCXRpZC0+c3RhdGUgJj0gfkFHR1JfQUREQkFfQ09NUExFVEU7Ci0JCQl0aWQtPnN0YXRlICY9IH5BR0dSX0NMRUFOVVA7Ci0JCX0KLQl9Ci0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChuZWVkcmVzZXQpIHsKQEAgLTYwMSw2ICs2MDAsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZXM7CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZSAqbWNpID0gJnNjLT5idGNvZXgubWNpOwogCXUzMiBtYXhfNG1zX2ZyYW1lbGVuLCBmcm1sZW47CiAJdTE2IGFnZ3JfbGltaXQsIGxlZ2FjeSA9IDA7CiAJaW50IGk7CkBAIC02NDUsNyArNjQ1LDkgQEAKIAlpZiAodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRSB8fCBsZWdhY3kpCiAJCXJldHVybiAwOwogCi0JaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX0JUX1BSSU9SSVRZX0RFVEVDVEVEKQorCWlmICgoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKSAmJiBtY2ktPmFnZ3JfbGltaXQpCisJCWFnZ3JfbGltaXQgPSAobWF4XzRtc19mcmFtZWxlbiAqIG1jaS0+YWdncl9saW1pdCkgPj4gNDsKKwllbHNlIGlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9CVF9QUklPUklUWV9ERVRFQ1RFRCkKIAkJYWdncl9saW1pdCA9IG1pbigobWF4XzRtc19mcmFtZWxlbiAqIDMpIC8gOCwKIAkJCQkgKHUzMilBVEhfQU1QRFVfTElNSVRfTUFYKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9mdy5jCmluZGV4IGY0Y2FlMWMuLmNiYTlkMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9mdy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImNhcmw5MTcwLmgiCiAjaW5jbHVkZSAiZndjbWQuaCIKICNpbmNsdWRlICJ2ZXJzaW9uLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC90eC5jCmluZGV4IDU5NDcyZTEuLmQxOWE5ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC90eC5jCkBAIC0zMTQsNyArMzE0LDcgQEAKIAkJCSAqICAgIGZlZWRiYWNrIGVpdGhlciBbQ1RMX1JFUV9UWF9TVEFUVVMgbm90IHNldF0KIAkJCSAqLwogCi0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJaWVlZTgwMjExX2ZyZWVfdHhza2IoYXItPmh3LCBza2IpOwogCQkJcmV0dXJuOwogCQl9IGVsc2UgewogCQkJLyoKQEAgLTE0MzIsNyArMTQzMiw3IEBACiAKIGVycl9mcmVlOgogCWFyLT50eF9kcm9wcGVkKys7Ci0JZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlpZWVlODAyMTFfZnJlZV90eHNrYihhci0+aHcsIHNrYik7CiB9CiAKIHZvaWQgY2FybDkxNzBfdHhfc2NoZWR1bGVyKHN0cnVjdCBhcjkxNzAgKmFyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGVidWcuYwppbmRleCA1MzY3YjEwLi41MDhlY2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGVidWcuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiYXRoLmgiCiAKIGNvbnN0IGNoYXIgKmF0aF9vcG1vZGVfdG9fc3RyaW5nKGVudW0gbmw4MDIxMV9pZnR5cGUgb3Btb2RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvaHcuYwppbmRleCAzZjUwOGU1Li4xOWJlZmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvaHcuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSAiYXRoLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgva2V5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgva2V5LmMKaW5kZXggMTdiMGVmZC4uNGNmN2M1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2tleS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9rZXkuYwpAQCAtMTUsNiArMTUsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvcmVnZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3JlZ2QuYwppbmRleCBmMWJlNTdmLi42NWVjYjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvcmVnZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9yZWdkLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSAicmVnZC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oCmluZGV4IDQ0N2EyMzAuLjM3MTEwZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYjQzLmgKQEAgLTEwMTEsMTQgKzEwMTEsMTAgQEAKIH0KIAogLyogTWVzc2FnZSBwcmludGluZyAqLwotdm9pZCBiNDNpbmZvKHN0cnVjdCBiNDNfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKLXZvaWQgYjQzZXJyKHN0cnVjdCBiNDNfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKLXZvaWQgYjQzd2FybihzdHJ1Y3QgYjQzX3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0gICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSk7Ci12b2lkIGI0M2RiZyhzdHJ1Y3QgYjQzX3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0gICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CitfX3ByaW50ZigyLCAzKSB2b2lkIGI0M2luZm8oc3RydWN0IGI0M193bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK19fcHJpbnRmKDIsIDMpIHZvaWQgYjQzZXJyKHN0cnVjdCBiNDNfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitfX3ByaW50ZigyLCAzKSB2b2lkIGI0M3dhcm4oc3RydWN0IGI0M193bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK19fcHJpbnRmKDIsIDMpIHZvaWQgYjQzZGJnKHN0cnVjdCBiNDNfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIAogLyogQSBXQVJOX09OIHZhcmlhbnQgdGhhdCB2YW5pc2hlcyB3aGVuIGI0MyBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwppbmRleCA3Y2Y0MTI1Li41NjM0ZDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BjbWNpYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BjbWNpYS5jCmluZGV4IDEyYjZiNDAuLjcxNGNhZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9wY21jaWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGNtY2lhLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2IuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9iNDNsZWdhY3kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9iNDNsZWdhY3kuaAppbmRleCAxMmI1MTgyLi4xZDRmYzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvYjQzbGVnYWN5LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2I0M2xlZ2FjeS5oCkBAIC04MTAsMTUgKzgxMCwxNSBAQAogCiAKIC8qIE1lc3NhZ2UgcHJpbnRpbmcgKi8KLXZvaWQgYjQzbGVnYWN5aW5mbyhzdHJ1Y3QgYjQzbGVnYWN5X3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7Ci12b2lkIGI0M2xlZ2FjeWVycihzdHJ1Y3QgYjQzbGVnYWN5X3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7Ci12b2lkIGI0M2xlZ2FjeXdhcm4oc3RydWN0IGI0M2xlZ2FjeV93bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCQlfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworX19wcmludGYoMiwgMykKK3ZvaWQgYjQzbGVnYWN5aW5mbyhzdHJ1Y3QgYjQzbGVnYWN5X3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworX19wcmludGYoMiwgMykKK3ZvaWQgYjQzbGVnYWN5ZXJyKHN0cnVjdCBiNDNsZWdhY3lfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitfX3ByaW50ZigyLCAzKQordm9pZCBiNDNsZWdhY3l3YXJuKHN0cnVjdCBiNDNsZWdhY3lfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAjaWYgQjQzbGVnYWN5X0RFQlVHCi12b2lkIGI0M2xlZ2FjeWRiZyhzdHJ1Y3QgYjQzbGVnYWN5X3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CitfX3ByaW50ZigyLCAzKQordm9pZCBiNDNsZWdhY3lkYmcoc3RydWN0IGI0M2xlZ2FjeV93bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKICNlbHNlIC8qIERFQlVHICovCiAjIGRlZmluZSBiNDNsZWdhY3lkYmcod2wsIGZtdC4uLikgZG8geyAvKiBub3RoaW5nICovIH0gd2hpbGUgKDApCiAjZW5kaWYgLyogREVCVUcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jCmluZGV4IGEzYjcyY2QuLjIwZjAyNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvTWFrZWZpbGUKaW5kZXggYjQ0ZTMwOS4uZDU4YWExYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9NYWtlZmlsZQpAQCAtMjYsNyArMjYsOCBAQAogCWRoZF9zZGlvLm8JXAogCWRoZF9saW51eC5vIFwKIAliY21zZGgubyBcCi0JYmNtc2RoX3NkbW1jLm8KKwliY21zZGhfc2RtbWMubyBcCisJc2Rpb19jaGlwLm8KIAogb2JqLSQoQ09ORklHX0JSQ01GTUFDKSArPSBicmNtZm1hYy5vCiBicmNtZm1hYy1vYmpzICs9ICQoREhET0ZJTEVTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbWNoaXAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21jaGlwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDNhZmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbWNoaXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9iY21jaGlwX2hfCi0jZGVmaW5lIF9iY21jaGlwX2hfCi0KLS8qIGJjbTQzMjkgKi8KLS8qIFNESU8gZGV2aWNlIGNvcmUsIElEIDB4ODI5ICovCi0jZGVmaW5lIEJDTTQzMjlfQ09SRV9CVVNfQkFTRQkJMHgxODAxMTAwMAotLyogaW50ZXJuYWwgbWVtb3J5IGNvcmUsIElEIDB4ODBlICovCi0jZGVmaW5lIEJDTTQzMjlfQ09SRV9TT0NSQU1fQkFTRQkweDE4MDAzMDAwCi0vKiBBUk0gQ29ydGV4IE0zIGNvcmUsIElEIDB4ODJhICovCi0jZGVmaW5lIEJDTTQzMjlfQ09SRV9BUk1fQkFTRQkJMHgxODAwMjAwMAotI2RlZmluZSBCQ000MzI5X1JBTVNJWkUJCQkweDQ4MDAwCi0vKiBmaXJtd2FyZSBuYW1lICovCi0jZGVmaW5lIEJDTTQzMjlfRldfTkFNRQkJCSJicmNtL2JjbTQzMjktZnVsbG1hYy00LmJpbiIKLSNkZWZpbmUgQkNNNDMyOV9OVl9OQU1FCQkJImJyY20vYmNtNDMyOS1mdWxsbWFjLTQudHh0IgotCi0jZW5kaWYJCQkJLyogX2JjbWNoaXBfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYwppbmRleCBiZmY5ZGNkLi43NDkzM2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtMzksNyArNDAsOCBAQAogCiBzdGF0aWMgdm9pZCBicmNtZl9zZGlvaF9pcnFoYW5kbGVyKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCiB7Ci0Jc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYpOworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YSgmZnVuYy0+Y2FyZC0+ZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2OwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiKioqSVJRSGFuZGxlclxuIik7CiAKQEAgLTIyMSwxOSArMjIzLDEyIEBACiAJcmV0dXJuIHNkaW9kZXYtPnJlZ2ZhaWw7CiB9CiAKLWludAotYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCi0JCSAgICAgIHVpbnQgZmxhZ3MsCi0JCSAgICAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQorc3RhdGljIGludCBicmNtZl9zZGNhcmRfcmVjdl9wcmVwYXJlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdWludCBmbiwKKwkJCQkgICAgIHVpbnQgZmxhZ3MsIHVpbnQgd2lkdGgsIHUzMiAqYWRkcikKIHsKLQlpbnQgc3RhdHVzOwotCXVpbnQgaW5jcl9maXg7Ci0JdWludCB3aWR0aDsKLQl1aW50IGJhcjAgPSBhZGRyICYgflNCU0RJT19TQl9PRlRfQUREUl9NQVNLOworCXVpbnQgYmFyMCA9ICphZGRyICYgflNCU0RJT19TQl9PRlRfQUREUl9NQVNLOwogCWludCBlcnIgPSAwOwogCi0JYnJjbWZfZGJnKElORk8sICJmdW4gPSAlZCwgYWRkciA9IDB4JXgsIHNpemUgPSAlZFxuIiwgZm4sIGFkZHIsIG5ieXRlcyk7Ci0KIAkvKiBBc3luYyBub3QgaW1wbGVtZW50ZWQgeWV0ICovCiAJaWYgKGZsYWdzICYgU0RJT19SRVFfQVNZTkMpCiAJCXJldHVybiAtRU5PVFNVUFA7CkBAIC0yNDYsMjkgKzI0MSwxMTQgQEAKIAkJc2Rpb2Rldi0+c2J3YWQgPSBiYXIwOwogCX0KIAotCWFkZHIgJj0gU0JTRElPX1NCX09GVF9BRERSX01BU0s7CisJKmFkZHIgJj0gU0JTRElPX1NCX09GVF9BRERSX01BU0s7CisKKwlpZiAod2lkdGggPT0gNCkKKwkJKmFkZHIgfD0gU0JTRElPX1NCX0FDQ0VTU18yXzRCX0ZMQUc7CisKKwlyZXR1cm4gMDsKK30KKworaW50CiticmNtZl9zZGNhcmRfcmVjdl9idWYoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKKwkJICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKm15cGt0OworCWludCBlcnI7CisKKwlteXBrdCA9IGJyY211X3BrdF9idWZfZ2V0X3NrYihuYnl0ZXMpOworCWlmICghbXlwa3QpIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAorCQkJICBuYnl0ZXMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwllcnIgPSBicmNtZl9zZGNhcmRfcmVjdl9wa3Qoc2Rpb2RldiwgYWRkciwgZm4sIGZsYWdzLCBteXBrdCk7CisJaWYgKCFlcnIpCisJCW1lbWNweShidWYsIG15cGt0LT5kYXRhLCBuYnl0ZXMpOworCisJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihteXBrdCk7CisJcmV0dXJuIGVycjsKK30KKworaW50CiticmNtZl9zZGNhcmRfcmVjdl9wa3Qoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKKwkJICAgICAgdWludCBmbGFncywgc3RydWN0IHNrX2J1ZmYgKnBrdCkKK3sKKwl1aW50IGluY3JfZml4OworCXVpbnQgd2lkdGg7CisJaW50IGVyciA9IDA7CisKKwlicmNtZl9kYmcoSU5GTywgImZ1biA9ICVkLCBhZGRyID0gMHgleCwgc2l6ZSA9ICVkXG4iLAorCQkgIGZuLCBhZGRyLCBwa3QtPmxlbik7CisKKwl3aWR0aCA9IChmbGFncyAmIFNESU9fUkVRXzRCWVRFKSA/IDQgOiAyOworCWVyciA9IGJyY21mX3NkY2FyZF9yZWN2X3ByZXBhcmUoc2Rpb2RldiwgZm4sIGZsYWdzLCB3aWR0aCwgJmFkZHIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpbmNyX2ZpeCA9IChmbGFncyAmIFNESU9fUkVRX0ZJWEVEKSA/IFNESU9IX0RBVEFfRklYIDogU0RJT0hfREFUQV9JTkM7CisJZXJyID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9idWZmZXIoc2Rpb2RldiwgaW5jcl9maXgsIFNESU9IX1JFQUQsCisJCQkJCSBmbiwgYWRkciwgcGt0KTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBicmNtZl9zZGNhcmRfcmVjdl9jaGFpbihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAorCQkJICAgIHVpbnQgZmxhZ3MsIHN0cnVjdCBza19idWZmX2hlYWQgKnBrdHEpCit7CisJdWludCBpbmNyX2ZpeDsKKwl1aW50IHdpZHRoOworCWludCBlcnIgPSAwOworCisJYnJjbWZfZGJnKElORk8sICJmdW4gPSAlZCwgYWRkciA9IDB4JXgsIHNpemUgPSAlZFxuIiwKKwkJICBmbiwgYWRkciwgcGt0cS0+cWxlbik7CisKIAl3aWR0aCA9IChmbGFncyAmIFNESU9fUkVRXzRCWVRFKSA/IDQgOiAyOwotCWlmICh3aWR0aCA9PSA0KQotCQlhZGRyIHw9IFNCU0RJT19TQl9BQ0NFU1NfMl80Ql9GTEFHOworCWVyciA9IGJyY21mX3NkY2FyZF9yZWN2X3ByZXBhcmUoc2Rpb2RldiwgZm4sIGZsYWdzLCB3aWR0aCwgJmFkZHIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlzdGF0dXMgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X2J1ZmZlcihzZGlvZGV2LCBpbmNyX2ZpeCwgU0RJT0hfUkVBRCwKLQkJCQkJICAgIGZuLCBhZGRyLCB3aWR0aCwgbmJ5dGVzLCBidWYsIHBrdCk7CisJaW5jcl9maXggPSAoZmxhZ3MgJiBTRElPX1JFUV9GSVhFRCkgPyBTRElPSF9EQVRBX0ZJWCA6IFNESU9IX0RBVEFfSU5DOworCWVyciA9IGJyY21mX3NkaW9oX3JlcXVlc3RfY2hhaW4oc2Rpb2RldiwgaW5jcl9maXgsIFNESU9IX1JFQUQsIGZuLCBhZGRyLAorCQkJCQlwa3RxKTsKIAotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIGVycjsKIH0KIAogaW50CiBicmNtZl9zZGNhcmRfc2VuZF9idWYoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKLQkJICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHN0cnVjdCBza19idWZmICpwa3QpCisJCSAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBza19idWZmICpteXBrdDsKKwlpbnQgZXJyOworCisJbXlwa3QgPSBicmNtdV9wa3RfYnVmX2dldF9za2IobmJ5dGVzKTsKKwlpZiAoIW15cGt0KSB7CisJCWJyY21mX2RiZyhFUlJPUiwgImJyY211X3BrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IGxlbiAlZFxuIiwKKwkJCSAgbmJ5dGVzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWVtY3B5KG15cGt0LT5kYXRhLCBidWYsIG5ieXRlcyk7CisJZXJyID0gYnJjbWZfc2RjYXJkX3NlbmRfcGt0KHNkaW9kZXYsIGFkZHIsIGZuLCBmbGFncywgbXlwa3QpOworCisJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihteXBrdCk7CisJcmV0dXJuIGVycjsKKworfQorCitpbnQKK2JyY21mX3NkY2FyZF9zZW5kX3BrdChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAorCQkgICAgICB1aW50IGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewogCXVpbnQgaW5jcl9maXg7CiAJdWludCB3aWR0aDsKIAl1aW50IGJhcjAgPSBhZGRyICYgflNCU0RJT19TQl9PRlRfQUREUl9NQVNLOwogCWludCBlcnIgPSAwOwogCi0JYnJjbWZfZGJnKElORk8sICJmdW4gPSAlZCwgYWRkciA9IDB4JXgsIHNpemUgPSAlZFxuIiwgZm4sIGFkZHIsIG5ieXRlcyk7CisJYnJjbWZfZGJnKElORk8sICJmdW4gPSAlZCwgYWRkciA9IDB4JXgsIHNpemUgPSAlZFxuIiwKKwkJICBmbiwgYWRkciwgcGt0LT5sZW4pOwogCiAJLyogQXN5bmMgbm90IGltcGxlbWVudGVkIHlldCAqLwogCWlmIChmbGFncyAmIFNESU9fUkVRX0FTWU5DKQpAQCAtMjkwLDE4ICszNzAsMzkgQEAKIAkJYWRkciB8PSBTQlNESU9fU0JfQUNDRVNTXzJfNEJfRkxBRzsKIAogCXJldHVybiBicmNtZl9zZGlvaF9yZXF1ZXN0X2J1ZmZlcihzZGlvZGV2LCBpbmNyX2ZpeCwgU0RJT0hfV1JJVEUsIGZuLAotCQkJCQkgIGFkZHIsIHdpZHRoLCBuYnl0ZXMsIGJ1ZiwgcGt0KTsKKwkJCQkJICBhZGRyLCBwa3QpOwogfQogCiBpbnQgYnJjbWZfc2RjYXJkX3J3ZGF0YShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHVpbnQgcncsIHUzMiBhZGRyLAogCQkJdTggKmJ1ZiwgdWludCBuYnl0ZXMpCiB7CisJc3RydWN0IHNrX2J1ZmYgKm15cGt0OworCWJvb2wgd3JpdGUgPSBydyA/IFNESU9IX1dSSVRFIDogU0RJT0hfUkVBRDsKKwlpbnQgZXJyOworCiAJYWRkciAmPSBTQlNESU9fU0JfT0ZUX0FERFJfTUFTSzsKIAlhZGRyIHw9IFNCU0RJT19TQl9BQ0NFU1NfMl80Ql9GTEFHOwogCi0JcmV0dXJuIGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKHNkaW9kZXYsIFNESU9IX0RBVEFfSU5DLAotCQkocncgPyBTRElPSF9XUklURSA6IFNESU9IX1JFQUQpLCBTRElPX0ZVTkNfMSwKLQkJYWRkciwgNCwgbmJ5dGVzLCBidWYsIE5VTEwpOworCW15cGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKG5ieXRlcyk7CisJaWYgKCFteXBrdCkgeworCQlicmNtZl9kYmcoRVJST1IsICJicmNtdV9wa3RfYnVmX2dldF9za2IgZmFpbGVkOiBsZW4gJWRcbiIsCisJCQkgIG5ieXRlcyk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIEZvciBhIHdyaXRlLCBjb3B5IHRoZSBidWZmZXIgZGF0YSBpbnRvIHRoZSBwYWNrZXQuICovCisJaWYgKHdyaXRlKQorCQltZW1jcHkobXlwa3QtPmRhdGEsIGJ1ZiwgbmJ5dGVzKTsKKworCWVyciA9IGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKHNkaW9kZXYsIFNESU9IX0RBVEFfSU5DLCB3cml0ZSwKKwkJCQkJIFNESU9fRlVOQ18xLCBhZGRyLCBteXBrdCk7CisKKwkvKiBGb3IgYSByZWFkLCBjb3B5IHRoZSBwYWNrZXQgZGF0YSBiYWNrIHRvIHRoZSBidWZmZXIuICovCisJaWYgKCFlcnIgJiYgIXdyaXRlKQorCQltZW1jcHkoYnVmLCBteXBrdC0+ZGF0YSwgbmJ5dGVzKTsKKworCWJyY211X3BrdF9idWZfZnJlZV9za2IobXlwa3QpOworCXJldHVybiBlcnI7CiB9CiAKIGludCBicmNtZl9zZGNhcmRfYWJvcnQoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IGZuKQpAQCAtMzMyLDcgKzQzMyw3IEBACiAJc2Rpb2Rldi0+c2J3YWQgPSBTSV9FTlVNX0JBU0U7CiAKIAkvKiB0cnkgdG8gYXR0YWNoIHRvIHRoZSB0YXJnZXQgZGV2aWNlICovCi0Jc2Rpb2Rldi0+YnVzID0gYnJjbWZfc2RicmNtX3Byb2JlKDAsIDAsIDAsIDAsIHJlZ3MsIHNkaW9kZXYpOworCXNkaW9kZXYtPmJ1cyA9IGJyY21mX3NkYnJjbV9wcm9iZShyZWdzLCBzZGlvZGV2KTsKIAlpZiAoIXNkaW9kZXYtPmJ1cykgewogCQlicmNtZl9kYmcoRVJST1IsICJkZXZpY2UgYXR0YWNoIGZhaWxlZFxuIik7CiAJCXJldCA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jLmMKaW5kZXggYmJhZWIyZC4uYjQxNmUyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYwpAQCAtMjA0LDYyICsyMDQsNzUgQEAKIAlyZXR1cm4gZXJyX3JldDsKIH0KIAorLyogcHJlY29uZGl0aW9uOiBob3N0IGNvbnRyb2xsZXIgaXMgY2xhaW1lZCAqLwogc3RhdGljIGludAotYnJjbWZfc2Rpb2hfcmVxdWVzdF9wYWNrZXQoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IGZpeF9pbmMsCi0JCQkgICB1aW50IHdyaXRlLCB1aW50IGZ1bmMsIHVpbnQgYWRkciwKLQkJCSAgIHN0cnVjdCBza19idWZmICpwa3QpCiticmNtZl9zZGlvaF9yZXF1ZXN0X2RhdGEoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IHdyaXRlLCBib29sIGZpZm8sCisJCQkgdWludCBmdW5jLCB1aW50IGFkZHIsIHN0cnVjdCBza19idWZmICpwa3QsIHVpbnQgcGt0bGVuKQoreworCWludCBlcnJfcmV0ID0gMDsKKworCWlmICgod3JpdGUpICYmICghZmlmbykpIHsKKwkJZXJyX3JldCA9IHNkaW9fbWVtY3B5X3RvaW8oc2Rpb2Rldi0+ZnVuY1tmdW5jXSwgYWRkciwKKwkJCQkJICAgKCh1OCAqKSAocGt0LT5kYXRhKSksIHBrdGxlbik7CisJfSBlbHNlIGlmICh3cml0ZSkgeworCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhzZGlvZGV2LT5mdW5jW2Z1bmNdLCBhZGRyLAorCQkJCQkgICAoKHU4ICopIChwa3QtPmRhdGEpKSwgcGt0bGVuKTsKKwl9IGVsc2UgaWYgKGZpZm8pIHsKKwkJZXJyX3JldCA9IHNkaW9fcmVhZHNiKHNkaW9kZXYtPmZ1bmNbZnVuY10sCisJCQkJICAgICAgKCh1OCAqKSAocGt0LT5kYXRhKSksIGFkZHIsIHBrdGxlbik7CisJfSBlbHNlIHsKKwkJZXJyX3JldCA9IHNkaW9fbWVtY3B5X2Zyb21pbyhzZGlvZGV2LT5mdW5jW2Z1bmNdLAorCQkJCQkgICAgICgodTggKikgKHBrdC0+ZGF0YSkpLAorCQkJCQkgICAgIGFkZHIsIHBrdGxlbik7CisJfQorCisJcmV0dXJuIGVycl9yZXQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcXVldWUgb2YgcGFja2V0cy4gVGhlIHBhY2tldHMgb24gdGhlIHF1ZXVlCisgKiBhcmUgYXNzdW1lZCB0byBiZSBwcm9wZXJseSBhbGlnbmVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2ludAorYnJjbWZfc2Rpb2hfcmVxdWVzdF9jaGFpbihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHVpbnQgZml4X2luYywKKwkJCSAgdWludCB3cml0ZSwgdWludCBmdW5jLCB1aW50IGFkZHIsCisJCQkgIHN0cnVjdCBza19idWZmX2hlYWQgKnBrdHEpCiB7CiAJYm9vbCBmaWZvID0gKGZpeF9pbmMgPT0gU0RJT0hfREFUQV9GSVgpOwogCXUzMiBTR0NvdW50ID0gMDsKIAlpbnQgZXJyX3JldCA9IDA7CiAKLQlzdHJ1Y3Qgc2tfYnVmZiAqcG5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAotCWJyY21mX3BtX3Jlc3VtZV93YWl0KHNkaW9kZXYsICZzZGlvZGV2LT5yZXF1ZXN0X3BhY2tldF93YWl0KTsKKwlicmNtZl9wbV9yZXN1bWVfd2FpdChzZGlvZGV2LCAmc2Rpb2Rldi0+cmVxdWVzdF9jaGFpbl93YWl0KTsKIAlpZiAoYnJjbWZfcG1fcmVzdW1lX2Vycm9yKHNkaW9kZXYpKQogCQlyZXR1cm4gLUVJTzsKIAogCS8qIENsYWltIGhvc3QgY29udHJvbGxlciAqLwogCXNkaW9fY2xhaW1faG9zdChzZGlvZGV2LT5mdW5jW2Z1bmNdKTsKLQlmb3IgKHBuZXh0ID0gcGt0OyBwbmV4dDsgcG5leHQgPSBwbmV4dC0+bmV4dCkgewotCQl1aW50IHBrdF9sZW4gPSBwbmV4dC0+bGVuOworCisJc2tiX3F1ZXVlX3dhbGsocGt0cSwgcGt0KSB7CisJCXVpbnQgcGt0X2xlbiA9IHBrdC0+bGVuOwogCQlwa3RfbGVuICs9IDM7CiAJCXBrdF9sZW4gJj0gMHhGRkZGRkZGQzsKIAotCQlpZiAoKHdyaXRlKSAmJiAoIWZpZm8pKSB7Ci0JCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhzZGlvZGV2LT5mdW5jW2Z1bmNdLCBhZGRyLAotCQkJCQkJICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKLQkJCQkJCSAgIHBrdF9sZW4pOwotCQl9IGVsc2UgaWYgKHdyaXRlKSB7Ci0JCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhzZGlvZGV2LT5mdW5jW2Z1bmNdLCBhZGRyLAotCQkJCQkJICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKLQkJCQkJCSAgIHBrdF9sZW4pOwotCQl9IGVsc2UgaWYgKGZpZm8pIHsKLQkJCWVycl9yZXQgPSBzZGlvX3JlYWRzYihzZGlvZGV2LT5mdW5jW2Z1bmNdLAotCQkJCQkgICAgICAoKHU4ICopIChwbmV4dC0+ZGF0YSkpLAotCQkJCQkgICAgICBhZGRyLCBwa3RfbGVuKTsKLQkJfSBlbHNlIHsKLQkJCWVycl9yZXQgPSBzZGlvX21lbWNweV9mcm9taW8oc2Rpb2Rldi0+ZnVuY1tmdW5jXSwKLQkJCQkJCSAgICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKLQkJCQkJCSAgICAgYWRkciwgcGt0X2xlbik7Ci0JCX0KLQorCQllcnJfcmV0ID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9kYXRhKHNkaW9kZXYsIHdyaXRlLCBmaWZvLCBmdW5jLAorCQkJCQkJICAgYWRkciwgcGt0LCBwa3RfbGVuKTsKIAkJaWYgKGVycl9yZXQpIHsKIAkJCWJyY21mX2RiZyhFUlJPUiwgIiVzIEZBSUxFRCAlcFslZF0sIGFkZHI9MHglMDV4LCBwa3RfbGVuPSVkLCBFUlI9MHglMDh4XG4iLAotCQkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgcG5leHQsIFNHQ291bnQsIGFkZHIsCisJCQkJICB3cml0ZSA/ICJUWCIgOiAiUlgiLCBwa3QsIFNHQ291bnQsIGFkZHIsCiAJCQkJICBwa3RfbGVuLCBlcnJfcmV0KTsKIAkJfSBlbHNlIHsKIAkJCWJyY21mX2RiZyhUUkFDRSwgIiVzIHhmcidkICVwWyVkXSwgYWRkcj0weCUwNXgsIGxlbj0lZFxuIiwKLQkJCQkgIHdyaXRlID8gIlRYIiA6ICJSWCIsIHBuZXh0LCBTR0NvdW50LCBhZGRyLAorCQkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgcGt0LCBTR0NvdW50LCBhZGRyLAogCQkJCSAgcGt0X2xlbik7CiAJCX0KLQogCQlpZiAoIWZpZm8pCiAJCQlhZGRyICs9IHBrdF9sZW47Ci0JCVNHQ291bnQrKzsKIAorCQlTR0NvdW50Kys7CiAJfQogCiAJLyogUmVsZWFzZSBob3N0IGNvbnRyb2xsZXIgKi8KQEAgLTI3MCw5MSArMjgzLDQ1IEBACiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgYnVmZmVyIG9yIHBhY2tldCwgYW5kIGZpeGVzIGV2ZXJ5dGhpbmcgdXAKLSAqIHNvIHRoYXQgaW4gdGhlIGVuZCwgYSBETUEtYWJsZSBwYWNrZXQgaXMgY3JlYXRlZC4KLSAqCi0gKiBBIGJ1ZmZlciBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgcGFja2V0IHBvaW50ZXIsCi0gKiBhbmQgbWF5IG9yIG1heSBub3QgYmUgYWxpZ25lZC4KLSAqIEEgcGFja2V0IG1heSBjb25zaXN0IG9mIGEgc2luZ2xlIHBhY2tldCwgb3IgYSBwYWNrZXQgY2hhaW4uCi0gKiBJZiBpdCBpcyBhIHBhY2tldCBjaGFpbiwgdGhlbiBhbGwgdGhlIHBhY2tldHMgaW4gdGhlIGNoYWluCi0gKiBtdXN0IGJlIHByb3Blcmx5IGFsaWduZWQuCi0gKgotICogSWYgdGhlIHBhY2tldCBkYXRhIGlzIG5vdCBhbGlnbmVkLCB0aGVuIHRoZXJlIG1heSBvbmx5IGJlCi0gKiBvbmUgcGFja2V0LCBhbmQgaW4gdGhpcyBjYXNlLCAgaXQgaXMgY29waWVkIHRvIGEgbmV3Ci0gKiBhbGlnbmVkIHBhY2tldC4KLSAqCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc2luZ2xlIERNQS1hYmxlIHBhY2tldC4KICAqLwogaW50IGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKIAkJCSAgICAgICB1aW50IGZpeF9pbmMsIHVpbnQgd3JpdGUsIHVpbnQgZnVuYywgdWludCBhZGRyLAotCQkJICAgICAgIHVpbnQgcmVnX3dpZHRoLCB1aW50IGJ1Zmxlbl91LCB1OCAqYnVmZmVyLAogCQkJICAgICAgIHN0cnVjdCBza19idWZmICpwa3QpCiB7Ci0JaW50IFN0YXR1czsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbXlwa3QgPSBOVUxMOworCWludCBzdGF0dXM7CisJdWludCBwa3RfbGVuID0gcGt0LT5sZW47CisJYm9vbCBmaWZvID0gKGZpeF9pbmMgPT0gU0RJT0hfREFUQV9GSVgpOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCisJaWYgKHBrdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWJyY21mX3BtX3Jlc3VtZV93YWl0KHNkaW9kZXYsICZzZGlvZGV2LT5yZXF1ZXN0X2J1ZmZlcl93YWl0KTsKIAlpZiAoYnJjbWZfcG1fcmVzdW1lX2Vycm9yKHNkaW9kZXYpKQogCQlyZXR1cm4gLUVJTzsKLQkvKiBDYXNlIDE6IHdlIGRvbid0IGhhdmUgYSBwYWNrZXQuICovCi0JaWYgKHBrdCA9PSBOVUxMKSB7Ci0JCWJyY21mX2RiZyhEQVRBLCAiQ3JlYXRpbmcgbmV3ICVzIFBhY2tldCwgbGVuPSVkXG4iLAotCQkJICB3cml0ZSA/ICJUWCIgOiAiUlgiLCBidWZsZW5fdSk7Ci0JCW15cGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKGJ1Zmxlbl91KTsKLQkJaWYgKCFteXBrdCkgewotCQkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAotCQkJCSAgYnVmbGVuX3UpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KIAotCQkvKiBGb3IgYSB3cml0ZSwgY29weSB0aGUgYnVmZmVyIGRhdGEgaW50byB0aGUgcGFja2V0LiAqLwotCQlpZiAod3JpdGUpCi0JCQltZW1jcHkobXlwa3QtPmRhdGEsIGJ1ZmZlciwgYnVmbGVuX3UpOworCS8qIENsYWltIGhvc3QgY29udHJvbGxlciAqLworCXNkaW9fY2xhaW1faG9zdChzZGlvZGV2LT5mdW5jW2Z1bmNdKTsKIAotCQlTdGF0dXMgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X3BhY2tldChzZGlvZGV2LCBmaXhfaW5jLCB3cml0ZSwKLQkJCQkJCSAgICBmdW5jLCBhZGRyLCBteXBrdCk7CisJcGt0X2xlbiArPSAzOworCXBrdF9sZW4gJj0gKHVpbnQpfjM7CiAKLQkJLyogRm9yIGEgcmVhZCwgY29weSB0aGUgcGFja2V0IGRhdGEgYmFjayB0byB0aGUgYnVmZmVyLiAqLwotCQlpZiAoIXdyaXRlKQotCQkJbWVtY3B5KGJ1ZmZlciwgbXlwa3QtPmRhdGEsIGJ1Zmxlbl91KTsKLQotCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKG15cGt0KTsKLQl9IGVsc2UgaWYgKCgodWxvbmcpIChwa3QtPmRhdGEpICYgRE1BX0FMSUdOX01BU0spICE9IDApIHsKLQkJLyoKLQkJICogQ2FzZSAyOiBXZSBoYXZlIGEgcGFja2V0LCBidXQgaXQgaXMgdW5hbGlnbmVkLgotCQkgKiBJbiB0aGlzIGNhc2UsIHdlIGNhbm5vdCBoYXZlIGEgY2hhaW4gKHBrdC0+bmV4dCA9PSBOVUxMKQotCQkgKi8KLQkJYnJjbWZfZGJnKERBVEEsICJDcmVhdGluZyBhbGlnbmVkICVzIFBhY2tldCwgbGVuPSVkXG4iLAotCQkJICB3cml0ZSA/ICJUWCIgOiAiUlgiLCBwa3QtPmxlbik7Ci0JCW15cGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKHBrdC0+bGVuKTsKLQkJaWYgKCFteXBrdCkgewotCQkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAotCQkJCSAgcGt0LT5sZW4pOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQkvKiBGb3IgYSB3cml0ZSwgY29weSB0aGUgYnVmZmVyIGRhdGEgaW50byB0aGUgcGFja2V0LiAqLwotCQlpZiAod3JpdGUpCi0JCQltZW1jcHkobXlwa3QtPmRhdGEsIHBrdC0+ZGF0YSwgcGt0LT5sZW4pOwotCi0JCVN0YXR1cyA9IGJyY21mX3NkaW9oX3JlcXVlc3RfcGFja2V0KHNkaW9kZXYsIGZpeF9pbmMsIHdyaXRlLAotCQkJCQkJICAgIGZ1bmMsIGFkZHIsIG15cGt0KTsKLQotCQkvKiBGb3IgYSByZWFkLCBjb3B5IHRoZSBwYWNrZXQgZGF0YSBiYWNrIHRvIHRoZSBidWZmZXIuICovCi0JCWlmICghd3JpdGUpCi0JCQltZW1jcHkocGt0LT5kYXRhLCBteXBrdC0+ZGF0YSwgbXlwa3QtPmxlbik7Ci0KLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihteXBrdCk7Ci0JfSBlbHNlIHsJCS8qIGNhc2UgMzogV2UgaGF2ZSBhIHBhY2tldCBhbmQKLQkJCQkgaXQgaXMgYWxpZ25lZC4gKi8KLQkJYnJjbWZfZGJnKERBVEEsICJBbGlnbmVkICVzIFBhY2tldCwgZGlyZWN0IERNQVxuIiwKLQkJCSAgd3JpdGUgPyAiVHgiIDogIlJ4Iik7Ci0JCVN0YXR1cyA9IGJyY21mX3NkaW9oX3JlcXVlc3RfcGFja2V0KHNkaW9kZXYsIGZpeF9pbmMsIHdyaXRlLAotCQkJCQkJICAgIGZ1bmMsIGFkZHIsIHBrdCk7CisJc3RhdHVzID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9kYXRhKHNkaW9kZXYsIHdyaXRlLCBmaWZvLCBmdW5jLAorCQkJCQkgICBhZGRyLCBwa3QsIHBrdF9sZW4pOworCWlmIChzdGF0dXMpIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAiJXMgRkFJTEVEICVwLCBhZGRyPTB4JTA1eCwgcGt0X2xlbj0lZCwgRVJSPTB4JTA4eFxuIiwKKwkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgcGt0LCBhZGRyLCBwa3RfbGVuLCBzdGF0dXMpOworCX0gZWxzZSB7CisJCWJyY21mX2RiZyhUUkFDRSwgIiVzIHhmcidkICVwLCBhZGRyPTB4JTA1eCwgbGVuPSVkXG4iLAorCQkJICB3cml0ZSA/ICJUWCIgOiAiUlgiLCBwa3QsIGFkZHIsIHBrdF9sZW4pOwogCX0KIAotCXJldHVybiBTdGF0dXM7CisJLyogUmVsZWFzZSBob3N0IGNvbnRyb2xsZXIgKi8KKwlzZGlvX3JlbGVhc2VfaG9zdChzZGlvZGV2LT5mdW5jW2Z1bmNdKTsKKworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qIFJlYWQgY2xpZW50IGNhcmQgcmVnICovCkBAIC00OTQsNiArNDYxLDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXY7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmOwogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAlicmNtZl9kYmcoVFJBQ0UsICJmdW5jLT5jbGFzcz0leFxuIiwgZnVuYy0+Y2xhc3MpOwogCWJyY21mX2RiZyhUUkFDRSwgInNkaW9fdmVuZG9yOiAweCUwNHhcbiIsIGZ1bmMtPnZlbmRvcik7CkBAIC01MDUsMjIgKzQ3MywzMSBAQAogCQkJYnJjbWZfZGJnKEVSUk9SLCAiY2FyZCBwcml2YXRlIGRydmRhdGEgb2NjdXBpZWRcbiIpOwogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQotCQlzZGlvZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX3NkaW9fZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc2Rpb2RldikKKwkJYnVzX2lmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX2J1cyksIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1c19pZikKIAkJCXJldHVybiAtRU5PTUVNOworCQlzZGlvZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX3NkaW9fZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2Rpb2RldikgeworCQkJa2ZyZWUoYnVzX2lmKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXNkaW9kZXYtPmRldiA9ICZmdW5jLT5jYXJkLT5kZXY7CiAJCXNkaW9kZXYtPmZ1bmNbMF0gPSBmdW5jLT5jYXJkLT5zZGlvX2Z1bmNbMF07CiAJCXNkaW9kZXYtPmZ1bmNbMV0gPSBmdW5jOwotCQlkZXZfc2V0X2RydmRhdGEoJmZ1bmMtPmNhcmQtPmRldiwgc2Rpb2Rldik7CisJCWJ1c19pZi0+YnVzX3ByaXYgPSBzZGlvZGV2OworCQlidXNfaWYtPnR5cGUgPSBTRElPX0JVUzsKKwkJZGV2X3NldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYsIGJ1c19pZik7CiAKIAkJYXRvbWljX3NldCgmc2Rpb2Rldi0+c3VzcGVuZCwgZmFsc2UpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZGlvZGV2LT5yZXF1ZXN0X2J5dGVfd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkaW9kZXYtPnJlcXVlc3Rfd29yZF93YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmc2Rpb2Rldi0+cmVxdWVzdF9wYWNrZXRfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkaW9kZXYtPnJlcXVlc3RfY2hhaW5fd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkaW9kZXYtPnJlcXVlc3RfYnVmZmVyX3dhaXQpOwogCX0KIAogCWlmIChmdW5jLT5udW0gPT0gMikgewotCQlzZGlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYpOworCQlidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoJmZ1bmMtPmNhcmQtPmRldik7CisJCXNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2OwogCQlpZiAoKCFzZGlvZGV2KSB8fCAoc2Rpb2Rldi0+ZnVuY1sxXS0+Y2FyZCAhPSBmdW5jLT5jYXJkKSkKIAkJCXJldHVybiAtRU5PREVWOwogCQlzZGlvZGV2LT5mdW5jWzJdID0gZnVuYzsKQEAgLTUzNCw2ICs1MTEsNyBAQAogCiBzdGF0aWMgdm9pZCBicmNtZl9vcHNfc2Rpb19yZW1vdmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKIHsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWY7CiAJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2OwogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAlicmNtZl9kYmcoSU5GTywgImZ1bmMtPmNsYXNzPSV4XG4iLCBmdW5jLT5jbGFzcyk7CkBAIC01NDIsMTAgKzUyMCwxMiBAQAogCWJyY21mX2RiZyhJTkZPLCAiRnVuY3Rpb24jOiAweCUwNHhcbiIsIGZ1bmMtPm51bSk7CiAKIAlpZiAoZnVuYy0+bnVtID09IDIpIHsKLQkJc2Rpb2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmZnVuYy0+Y2FyZC0+ZGV2KTsKKwkJYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYpOworCQlzZGlvZGV2ID0gYnVzX2lmLT5idXNfcHJpdjsKIAkJYnJjbWZfZGJnKFRSQUNFLCAiRjIgZm91bmQsIGNhbGxpbmcgYnJjbWZfc2Rpb19yZW1vdmUuLi5cbiIpOwogCQlicmNtZl9zZGlvX3JlbW92ZShzZGlvZGV2KTsKIAkJZGV2X3NldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYsIE5VTEwpOworCQlrZnJlZShidXNfaWYpOwogCQlrZnJlZShzZGlvZGV2KTsKIAl9CiB9CkBAIC01NTYsMTEgKzUzNiwxMiBAQAogCW1tY19wbV9mbGFnX3Qgc2Rpb19mbGFnczsKIAlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXY7CiAJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGRldl90b19zZGlvX2Z1bmMoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoJmZ1bmMtPmNhcmQtPmRldik7CiAJaW50IHJldCA9IDA7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJcbiIpOwogCi0Jc2Rpb2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmZnVuYy0+Y2FyZC0+ZGV2KTsKKwlzZGlvZGV2ID0gYnVzX2lmLT5idXNfcHJpdjsKIAogCWF0b21pY19zZXQoJnNkaW9kZXYtPnN1c3BlbmQsIHRydWUpOwogCkBAIC01ODUsOCArNTY2LDkgQEAKIHsKIAlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXY7CiAJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGRldl90b19zZGlvX2Z1bmMoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoJmZ1bmMtPmNhcmQtPmRldik7CiAKLQlzZGlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYpOworCXNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2OwogCWJyY21mX3NkaW9fd2R0bXJfZW5hYmxlKHNkaW9kZXYsIHRydWUpOwogCWF0b21pY19zZXQoJnNkaW9kZXYtPnN1c3BlbmQsIGZhbHNlKTsKIAlyZXR1cm4gMDsKQEAgLTYxMCwxNyArNTkyLDI2IEBACiAjZW5kaWYJLyogQ09ORklHX1BNX1NMRUVQICovCiB9OwogCi0vKiBidXMgcmVnaXN0ZXIgaW50ZXJmYWNlICovCi1pbnQgYnJjbWZfYnVzX3JlZ2lzdGVyKHZvaWQpCi17Ci0JYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwotCi0JcmV0dXJuIHNkaW9fcmVnaXN0ZXJfZHJpdmVyKCZicmNtZl9zZG1tY19kcml2ZXIpOwotfQotCi12b2lkIGJyY21mX2J1c191bnJlZ2lzdGVyKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYnJjbWZfc2Rpb19leGl0KHZvaWQpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCiAJc2Rpb191bnJlZ2lzdGVyX2RyaXZlcigmYnJjbWZfc2RtbWNfZHJpdmVyKTsKIH0KKworc3RhdGljIGludCBfX2luaXQgYnJjbWZfc2Rpb19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKKworCXJldCA9IHNkaW9fcmVnaXN0ZXJfZHJpdmVyKCZicmNtZl9zZG1tY19kcml2ZXIpOworCisJaWYgKHJldCkKKwkJYnJjbWZfZGJnKEVSUk9SLCAic2Rpb19yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK21vZHVsZV9pbml0KGJyY21mX3NkaW9faW5pdCk7Cittb2R1bGVfZXhpdChicmNtZl9zZGlvX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oCmluZGV4IDQ2NDU3NjYuLmI2OGQxMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmgKQEAgLTg3LDcgKzg3LDcgQEAKICNkZWZpbmUgVE9FX1RYX0NTVU1fT0wJCTB4MDAwMDAwMDEKICNkZWZpbmUgVE9FX1JYX0NTVU1fT0wJCTB4MDAwMDAwMDIKIAotI2RlZmluZQlCUkNNRl9CU1NfSU5GT19WRVJTSU9OCTEwOCAvKiBjdXJyZW50IHZlciBvZiBicmNtZl9ic3NfaW5mbyBzdHJ1Y3QgKi8KKyNkZWZpbmUJQlJDTUZfQlNTX0lORk9fVkVSU0lPTgkxMDggLyogY3VyciB2ZXIgb2YgYnJjbWZfYnNzX2luZm9fbGUgc3RydWN0ICovCiAKIC8qIHNpemUgb2YgYnJjbWZfc2Nhbl9wYXJhbXMgbm90IGluY2x1ZGluZyB2YXJpYWJsZSBsZW5ndGggYXJyYXkgKi8KICNkZWZpbmUgQlJDTUZfU0NBTl9QQVJBTVNfRklYRURfU0laRSA2NApAQCAtMTIyLDggKzEyMiw2IEBACiAKIC8qIEZvciBzdXBwb3J0aW5nIG11bHRpcGxlIGludGVyZmFjZXMgKi8KICNkZWZpbmUgQlJDTUZfTUFYX0lGUwkxNgotI2RlZmluZSBCUkNNRl9ERUxfSUYJLTB4ZQotI2RlZmluZSBCUkNNRl9CQURfSUYJLTB4ZgogCiAjZGVmaW5lIERPVDExX0JTU1RZUEVfQU5ZCQkJMgogI2RlZmluZSBET1QxMV9NQVhfREVGQVVMVF9LRVlTCTQKQEAgLTM2NSw3ICszNjMsNyBAQAogICogQXBwbGljYXRpb25zIE1VU1QgQ0hFQ0sgaWVfb2Zmc2V0IGZpZWxkIGFuZCBsZW5ndGggZmllbGQgdG8gYWNjZXNzIElFcyBhbmQKICAqIG5leHQgYnNzX2luZm8gc3RydWN0dXJlIGluIGEgdmVjdG9yIChpbiBzdHJ1Y3QgYnJjbWZfc2Nhbl9yZXN1bHRzKQogICovCi1zdHJ1Y3QgYnJjbWZfYnNzX2luZm8geworc3RydWN0IGJyY21mX2Jzc19pbmZvX2xlIHsKIAlfX2xlMzIgdmVyc2lvbjsJCS8qIHZlcnNpb24gZmllbGQgKi8KIAlfX2xlMzIgbGVuZ3RoOwkJLyogYnl0ZSBsZW5ndGggb2YgZGF0YSBpbiB0aGlzIHJlY29yZCwKIAkJCQkgKiBzdGFydGluZyBhdCB2ZXJzaW9uIGFuZCBpbmNsdWRpbmcgSUVzCkBAIC00NjYsMTQgKzQ2NCwxMyBAQAogCXUzMiBidWZsZW47CiAJdTMyIHZlcnNpb247CiAJdTMyIGNvdW50OwotCXN0cnVjdCBicmNtZl9ic3NfaW5mbyBic3NfaW5mb1sxXTsKKwlzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgYnNzX2luZm9fbGVbXTsKIH07CiAKIHN0cnVjdCBicmNtZl9zY2FuX3Jlc3VsdHNfbGUgewogCV9fbGUzMiBidWZsZW47CiAJX19sZTMyIHZlcnNpb247CiAJX19sZTMyIGNvdW50OwotCXN0cnVjdCBicmNtZl9ic3NfaW5mbyBic3NfaW5mb1sxXTsKIH07CiAKIC8qIHVzZWQgZm9yIGFzc29jaWF0aW9uIHdpdGggYSBzcGVjaWZpYyBCU1NJRCBhbmQgY2hhbnNwZWMgbGlzdCAqLwpAQCAtNDkzLDEwICs0OTAsNiBAQAogCXN0cnVjdCBicmNtZl9hc3NvY19wYXJhbXNfbGUgcGFyYW1zX2xlOwogfTsKIAotLyogc2l6ZSBvZiBicmNtZl9zY2FuX3Jlc3VsdHMgbm90IGluY2x1ZGluZyB2YXJpYWJsZSBsZW5ndGggYXJyYXkgKi8KLSNkZWZpbmUgQlJDTUZfU0NBTl9SRVNVTFRTX0ZJWEVEX1NJWkUgXAotCShzaXplb2Yoc3RydWN0IGJyY21mX3NjYW5fcmVzdWx0cykgLSBzaXplb2Yoc3RydWN0IGJyY21mX2Jzc19pbmZvKSkKLQogLyogaW5jcmVtZW50YWwgc2NhbiByZXN1bHRzIHN0cnVjdCAqLwogc3RydWN0IGJyY21mX2lzY2FuX3Jlc3VsdHMgewogCXVuaW9uIHsKQEAgLTUxMSw3ICs1MDQsNyBAQAogCiAvKiBzaXplIG9mIGJyY21mX2lzY2FuX3Jlc3VsdHMgbm90IGluY2x1ZGluZyB2YXJpYWJsZSBsZW5ndGggYXJyYXkgKi8KICNkZWZpbmUgQlJDTUZfSVNDQU5fUkVTVUxUU19GSVhFRF9TSVpFIFwKLQkoQlJDTUZfU0NBTl9SRVNVTFRTX0ZJWEVEX1NJWkUgKyBcCisJKHNpemVvZihzdHJ1Y3QgYnJjbWZfc2Nhbl9yZXN1bHRzKSArIFwKIAkgb2Zmc2V0b2Yoc3RydWN0IGJyY21mX2lzY2FuX3Jlc3VsdHMsIHJlc3VsdHMpKQogCiBzdHJ1Y3QgYnJjbWZfd3NlY19rZXkgewpAQCAtNTc4LDggKzU3MSwxNCBAQAogCXVpbnQgbmVlZGVkOwkJLyogYnl0ZXMgbmVlZGVkIChvcHRpb25hbCkgKi8KIH07CiAKK3N0cnVjdCBicmNtZl9idXMgeworCXU4IHR5cGU7CQkvKiBidXMgdHlwZSAqLworCXZvaWQgKmJ1c19wcml2OwkJLyogcG9pbnRlciB0byBidXMgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwllbnVtIGJyY21mX2J1c19zdGF0ZSBzdGF0ZTsKK307CisKIC8qIEZvcndhcmQgZGVjbHMgZm9yIHN0cnVjdCBicmNtZl9wdWIgKHNlZSBiZWxvdykgKi8KLXN0cnVjdCBicmNtZl9idXM7CQkvKiBkZXZpY2UgYnVzIGluZm8gKi8KK3N0cnVjdCBicmNtZl9zZGlvOwkJLyogZGV2aWNlIGJ1cyBpbmZvICovCiBzdHJ1Y3QgYnJjbWZfcHJvdG87CS8qIGRldmljZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIGluZm8gKi8KIHN0cnVjdCBicmNtZl9pbmZvOwkvKiBkZXZpY2UgZHJpdmVyIGluZm8gKi8KIHN0cnVjdCBicmNtZl9jZmc4MDIxMV9kZXY7IC8qIGNmZzgwMjExIGRldmljZSBpbmZvICovCkBAIC01ODcsMTUgKzU4NiwxNiBAQAogLyogQ29tbW9uIHN0cnVjdHVyZSBmb3IgbW9kdWxlIGFuZCBpbnN0YW5jZSBsaW5rYWdlICovCiBzdHJ1Y3QgYnJjbWZfcHViIHsKIAkvKiBMaW5rYWdlIHBvbnRlcnMgKi8KLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXM7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1czsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWY7CiAJc3RydWN0IGJyY21mX3Byb3RvICpwcm90OwogCXN0cnVjdCBicmNtZl9pbmZvICppbmZvOwogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9kZXYgKmNvbmZpZzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkvKiBmdWxsbWFjIGRvbmdsZSBkZXZpY2UgcG9pbnRlciAqLwogCiAJLyogSW50ZXJuYWwgYnJjbWYgaXRlbXMgKi8KIAlib29sIHVwOwkJLyogRHJpdmVyIHVwL2Rvd24gKHRvIE9TKSAqLwogCWJvb2wgdHhvZmY7CQkvKiBUcmFuc21pdCBmbG93LWNvbnRyb2xsZWQgKi8KLQllbnVtIGJyY21mX2J1c19zdGF0ZSBidXNzdGF0ZTsKIAl1aW50IGhkcmxlbjsJCS8qIFRvdGFsIEJSQ01GIGhlYWRlciBsZW5ndGggKHByb3RvICsgYnVzKSAqLwogCXVpbnQgbWF4Y3RsOwkJLyogTWF4IHNpemUgcnhjdGwgcmVxdWVzdCBmcm9tIHByb3RvIHRvIGJ1cyAqLwogCXVpbnQgcnhzejsJCS8qIFJ4IGJ1ZmZlciBzaXplIGJ1cyBtb2R1bGUgc2hvdWxkIHVzZSAqLwpAQCAtNjYzLDcgKzY2Myw2IEBACiAKIAl1OCBjb3VudHJ5X2NvZGVbQlJDTV9DTlRSWV9CVUZfU1pdOwogCWNoYXIgZXZlbnRtYXNrW0JSQ01GX0VWRU5USU5HX01BU0tfTEVOXTsKLQogfTsKIAogc3RydWN0IGJyY21mX2lmX2V2ZW50IHsKQEAgLTY4OCw4ICs2ODcsOCBAQAogICogUmV0dXJuZWQgc3RydWN0dXJlIHNob3VsZCBoYXZlIGJ1cyBhbmQgcHJvdCBwb2ludGVycyBmaWxsZWQgaW4uCiAgKiBidXNfaGRybGVuIHNwZWNpZmllcyByZXF1aXJlZCBoZWFkcm9vbSBmb3IgYnVzIG1vZHVsZSBoZWFkZXIuCiAgKi8KLWV4dGVybiBzdHJ1Y3QgYnJjbWZfcHViICpicmNtZl9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLAotCQkJCSAgICAgIHVpbnQgYnVzX2hkcmxlbik7CitleHRlcm4gc3RydWN0IGJyY21mX3B1YiAqYnJjbWZfYXR0YWNoKHN0cnVjdCBicmNtZl9zZGlvICpidXMsCisJCQkJICAgICAgdWludCBidXNfaGRybGVuLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBicmNtZl9uZXRfYXR0YWNoKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZHgpOwogZXh0ZXJuIGludCBicmNtZl9uZXRkZXZfd2FpdF9wZW5kODAyMXgoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOwogCkBAIC03MDYsNyArNzA1LDE2IEBACiAKIC8qIFJlY2VpdmUgZnJhbWUgZm9yIGRlbGl2ZXJ5IHRvIE9TLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHJ4cC4gKi8KIGV4dGVybiB2b2lkIGJyY21mX3J4X2ZyYW1lKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcnhwLCBpbnQgbnVtcGt0KTsKKwkJCSAgIHN0cnVjdCBza19idWZmX2hlYWQgKnJ4bGlzdCk7CitzdGF0aWMgaW5saW5lIHZvaWQgYnJjbWZfcnhfcGFja2V0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQoreworCXN0cnVjdCBza19idWZmX2hlYWQgcTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnEpOworCXNrYl9xdWV1ZV90YWlsKCZxLCBwa3QpOworCWJyY21mX3J4X2ZyYW1lKGRydnIsIGlmaWR4LCAmcSk7Cit9CiAKIC8qIFJldHVybiBwb2ludGVyIHRvIGludGVyZmFjZSBuYW1lICovCiBleHRlcm4gY2hhciAqYnJjbWZfaWZuYW1lKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZHgpOwpAQCAtNzMxLDExICs3MzksOCBAQAogCQkJICAgICAgdm9pZCAqcGt0ZGF0YSwgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqLAogCQkJICAgICAgdm9pZCAqKmRhdGFfcHRyKTsKIAotZXh0ZXJuIHZvaWQgYnJjbWZfY19pbml0KHZvaWQpOwotCiBleHRlcm4gaW50IGJyY21mX2FkZF9pZihzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgaWZpZHgsCi0JCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY2hhciAqbmFtZSwgdTggKm1hY19hZGRyLAotCQkJdTMyIGZsYWdzLCB1OCBic3NpZHgpOworCQkJY2hhciAqbmFtZSwgdTggKm1hY19hZGRyKTsKIGV4dGVybiB2b2lkIGJyY21mX2RlbF9pZihzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgaWZpZHgpOwogCiAvKiBTZW5kIHBhY2tldCB0byBkb25nbGUgdmlhIGRhdGEgY2hhbm5lbCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9idXMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKaW5kZXggYTI0OTQwNy4uMTg0MWY5OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9idXMuaApAQCAtMjcsMzEgKzI3LDI0IEBACiAgKiBFeHBvcnRlZCBmcm9tIGJyY21mIGJ1cyBtb2R1bGUgKGJyY21mX3VzYiwgYnJjbWZfc2RpbykKICAqLwogCi0vKiBJbmRpY2F0ZSAoZGlzKWludGVyZXN0IGluIGZpbmRpbmcgZG9uZ2xlcy4gKi8KLWV4dGVybiBpbnQgYnJjbWZfYnVzX3JlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnJjbWZfYnVzX3VucmVnaXN0ZXIodm9pZCk7Ci0KLS8qIG9idGFpbiBsaW51eCBkZXZpY2Ugb2JqZWN0IHByb3ZpZGluZyBidXMgZnVuY3Rpb24gKi8KLWV4dGVybiBzdHJ1Y3QgZGV2aWNlICpicmNtZl9idXNfZ2V0X2RldmljZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpOwotCiAvKiBTdG9wIGJ1cyBtb2R1bGU6IGNsZWFyIHBlbmRpbmcgZnJhbWVzLCBkaXNhYmxlIGRhdGEgZmxvdyAqLwotZXh0ZXJuIHZvaWQgYnJjbWZfc2RicmNtX2J1c19zdG9wKHN0cnVjdCBicmNtZl9idXMgKmJ1cyk7CitleHRlcm4gdm9pZCBicmNtZl9zZGJyY21fYnVzX3N0b3Aoc3RydWN0IGRldmljZSAqZGV2KTsKIAogLyogSW5pdGlhbGl6ZSBidXMgbW9kdWxlOiBwcmVwYXJlIGZvciBjb21tdW5pY2F0aW9uIHcvZG9uZ2xlICovCi1leHRlcm4gaW50IGJyY21mX3NkYnJjbV9idXNfaW5pdChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKTsKK2V4dGVybiBpbnQgYnJjbWZfc2RicmNtX2J1c19pbml0KHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIC8qIFNlbmQgYSBkYXRhIGZyYW1lIHRvIHRoZSBkb25nbGUuICBDYWxsZWUgZGlzcG9zZXMgb2YgdHhwLiAqLwotZXh0ZXJuIGludCBicmNtZl9zZGJyY21fYnVzX3R4ZGF0YShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHN0cnVjdCBza19idWZmICp0eHApOworZXh0ZXJuIGludCBicmNtZl9zZGJyY21fYnVzX3R4ZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICp0eHApOwogCiAvKiBTZW5kL3JlY2VpdmUgYSBjb250cm9sIG1lc3NhZ2UgdG8vZnJvbSB0aGUgZG9uZ2xlLgogICogRXhwZWN0cyBjYWxsZXIgdG8gZW5mb3JjZSBhIHNpbmdsZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbi4KICAqLwogZXh0ZXJuIGludAotYnJjbWZfc2RicmNtX2J1c190eGN0bChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pOworYnJjbWZfc2RicmNtX2J1c190eGN0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pOwogCiBleHRlcm4gaW50Ci1icmNtZl9zZGJyY21fYnVzX3J4Y3RsKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdW5zaWduZWQgY2hhciAqbXNnLCB1aW50IG1zZ2xlbik7CiticmNtZl9zZGJyY21fYnVzX3J4Y3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqbXNnLCB1aW50IG1zZ2xlbik7CiAKLWV4dGVybiB2b2lkIGJyY21mX3NkYnJjbV93ZF90aW1lcihzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgd2R0aWNrKTsKK2V4dGVybiB2b2lkIGJyY21mX3NkYnJjbV93ZF90aW1lcihzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1aW50IHdkdGljayk7CiAKICNlbmRpZgkJCQkvKiBfQlJDTUZfQlVTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NkYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYwppbmRleCBlMzRjNWMzLi5hNTI3ZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NkYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY2RjLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCQlsZW4gPSBDRENfTUFYX01TR19TSVpFOwogCiAJLyogU2VuZCByZXF1ZXN0ICovCi0JcmV0dXJuIGJyY21mX3NkYnJjbV9idXNfdHhjdGwoZHJ2ci0+YnVzLCAodW5zaWduZWQgY2hhciAqKSZwcm90LT5tc2csCisJcmV0dXJuIGJyY21mX3NkYnJjbV9idXNfdHhjdGwoZHJ2ci0+ZGV2LCAodW5zaWduZWQgY2hhciAqKSZwcm90LT5tc2csCiAJCQkJICAgICAgbGVuKTsKIH0KIApAQCAtMTI4LDcgKzEyOCw3IEBACiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCiAJZG8gewotCQlyZXQgPSBicmNtZl9zZGJyY21fYnVzX3J4Y3RsKGRydnItPmJ1cywKKwkJcmV0ID0gYnJjbWZfc2RicmNtX2J1c19yeGN0bChkcnZyLT5kZXYsCiAJCQkJKHVuc2lnbmVkIGNoYXIgKikmcHJvdC0+bXNnLAogCQkJCWxlbiArIHNpemVvZihzdHJ1Y3QgYnJjbWZfcHJvdG9fY2RjX2RjbWQpKTsKIAkJaWYgKHJldCA8IDApCkBAIC0yODAsNyArMjgwLDcgQEAKIAlzdHJ1Y3QgYnJjbWZfcHJvdG8gKnByb3QgPSBkcnZyLT5wcm90OwogCWludCByZXQgPSAtMTsKIAotCWlmIChkcnZyLT5idXNzdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgeworCWlmIChkcnZyLT5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19ET1dOKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImJ1cyBpcyBkb3duLiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYwppbmRleCA4OTE4MjYxLi42OWYzMzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMKQEAgLTMyLDggKzMyLDYgQEAKICNkZWZpbmUgUEtURklMVEVSX0JVRl9TSVpFCQkyMDQ4CiAjZGVmaW5lIEJSQ01GX0FSUE9MX01PREUJCTB4YgkvKiBhZ2VudHxzbm9vcHxwZWVyX2F1dG9yZXBseSAqLwogCi1pbnQgYnJjbWZfbXNnX2xldmVsOwotCiAjZGVmaW5lIE1TR1RSQUNFX1ZFUlNJT04JMQogCiAjZGVmaW5lIEJSQ01GX1BLVF9GSUxURVJfRklYRURfTEVOCW9mZnNldG9mKHN0cnVjdCBicmNtZl9wa3RfZmlsdGVyX2xlLCB1KQpAQCAtODUsMTkgKzgzLDYgQEAKIAlyZXR1cm4gbGVuOwogfQogCi12b2lkIGJyY21mX2NfaW5pdCh2b2lkKQotewotCS8qIEluaXQgZ2xvYmFsIHZhcmlhYmxlcyBhdCBydW4tdGltZSwgbm90IGFzIHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9uLgotCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBpbml0L2RlLWluaXQgb2YgdGhlIGRyaXZlci4KLQkgKiBJbml0aWFsaXphdGlvbgotCSAqIG9mIGdsb2JhbHMgYXMgcGFydCBvZiB0aGUgZGVjbGFyYXRpb24gcmVzdWx0cyBpbiBub24tZGV0ZXJtaW5pc3RpYwotCSAqIGJlaGF2aW91ciBzaW5jZSB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbHMgbWF5IGJlIGRpZmZlcmVudCBvbiB0aGUKLQkgKiBmaXJzdCB0aW1lIHRoYXQgdGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB2cyBzdWJzZXF1ZW50Ci0JICogaW5pdGlhbGl6YXRpb25zLgotCSAqLwotCWJyY21mX21zZ19sZXZlbCA9IEJSQ01GX0VSUk9SX1ZBTDsKLX0KLQogYm9vbCBicmNtZl9jX3ByZWNfZW5xKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHN0cnVjdCBwa3RxICpxLAogCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYykKIHsKQEAgLTQ4OCwxMCArNDczLDkgQEAKIAogCQlpZiAoaWZldmVudC0+aWZpZHggPiAwICYmIGlmZXZlbnQtPmlmaWR4IDwgQlJDTUZfTUFYX0lGUykgewogCQkJaWYgKGlmZXZlbnQtPmFjdGlvbiA9PSBCUkNNRl9FX0lGX0FERCkKLQkJCQlicmNtZl9hZGRfaWYoZHJ2cl9wcml2LCBpZmV2ZW50LT5pZmlkeCwgTlVMTCwKKwkJCQlicmNtZl9hZGRfaWYoZHJ2cl9wcml2LCBpZmV2ZW50LT5pZmlkeCwKIAkJCQkJICAgICBldmVudC0+aWZuYW1lLAotCQkJCQkgICAgIHB2dF9kYXRhLT5ldGguaF9kZXN0LAotCQkJCQkgICAgIGlmZXZlbnQtPmZsYWdzLCBpZmV2ZW50LT5ic3NpZHgpOworCQkJCQkgICAgIHB2dF9kYXRhLT5ldGguaF9kZXN0KTsKIAkJCWVsc2UKIAkJCQlicmNtZl9kZWxfaWYoZHJ2cl9wcml2LCBpZmV2ZW50LT5pZmlkeCk7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMKaW5kZXggNGFjYmFjNS4uNThkOTJiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgImRoZF9wcm90by5oIgogI2luY2x1ZGUgImRoZF9kYmcuaCIKICNpbmNsdWRlICJ3bF9jZmc4MDIxMS5oIgotI2luY2x1ZGUgImJjbWNoaXAuaCIKIAogTU9EVUxFX0FVVEhPUigiQnJvYWRjb20gQ29ycG9yYXRpb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gODAyLjExbiB3aXJlbGVzcyBMQU4gZnVsbG1hYyBkcml2ZXIuIik7CkBAIC01OCw3ICs1Nyw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJaW50IGlkeDsJCS8qIGlmYWNlIGlkeCBpbiBkb25nbGUgKi8KLQlpbnQgc3RhdGU7CQkvKiBpbnRlcmZhY2Ugc3RhdGUgKi8KIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07CS8qIGFzc2lnbmVkIE1BQyBhZGRyZXNzICovCiB9OwogCkBAIC03OCwyMiArNzYsOSBAQAogfTsKIAogLyogRXJyb3IgYml0cyAqLworaW50IGJyY21mX21zZ19sZXZlbCA9IEJSQ01GX0VSUk9SX1ZBTDsKIG1vZHVsZV9wYXJhbShicmNtZl9tc2dfbGV2ZWwsIGludCwgMCk7CiAKLQotc3RhdGljIGludCBicmNtZl9uZXQyaWR4KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCWludCBpID0gMDsKLQotCXdoaWxlIChpIDwgQlJDTUZfTUFYX0lGUykgewotCQlpZiAoZHJ2cl9wcml2LT5pZmxpc3RbaV0gJiYgZHJ2cl9wcml2LT5pZmxpc3RbaV0tPm5kZXYgPT0gbmRldikKLQkJCXJldHVybiBpOwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIEJSQ01GX0JBRF9JRjsKLX0KLQogaW50IGJyY21mX2lmbmFtZTJpZHgoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgY2hhciAqbmFtZSkKIHsKIAlpbnQgaSA9IEJSQ01GX01BWF9JRlM7CkBAIC0yODUsMTQgKzI3MCw5IEBACiAKIHN0YXRpYyBpbnQgYnJjbWZfbmV0ZGV2X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqYWRkcikKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gKihzdHJ1Y3QgYnJjbWZfaW5mbyAqKikKLQkJCQkJbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gaWZwLT5pbmZvOwogCXN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcjsKLQlpbnQgaWZpZHg7Ci0KLQlpZmlkeCA9IGJyY21mX25ldDJpZHgoZHJ2cl9wcml2LCBuZGV2KTsKLQlpZiAoaWZpZHggPT0gQlJDTUZfQkFEX0lGKQotCQlyZXR1cm4gLTE7CiAKIAltZW1jcHkoJmRydnJfcHJpdi0+bWFjdmFsdWUsIHNhLT5zYV9kYXRhLCBFVEhfQUxFTik7CiAJc2NoZWR1bGVfd29yaygmZHJ2cl9wcml2LT5zZXRtYWNhZGRyX3dvcmspOwpAQCAtMzAxLDEzICsyODEsOCBAQAogCiBzdGF0aWMgdm9pZCBicmNtZl9uZXRkZXZfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKQotCQkJCQluZXRkZXZfcHJpdihuZGV2KTsKLQlpbnQgaWZpZHg7Ci0KLQlpZmlkeCA9IGJyY21mX25ldDJpZHgoZHJ2cl9wcml2LCBuZGV2KTsKLQlpZiAoaWZpZHggPT0gQlJDTUZfQkFEX0lGKQotCQlyZXR1cm47CisJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gaWZwLT5pbmZvOwogCiAJc2NoZWR1bGVfd29yaygmZHJ2cl9wcml2LT5tdWx0aWNhc3Rfd29yayk7CiB9CkBAIC0zMTcsNyArMjkyLDcgQEAKIAlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKIAogCS8qIFJlamVjdCBpZiBkb3duICovCi0JaWYgKCFkcnZyLT51cCB8fCAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pKQorCWlmICghZHJ2ci0+dXAgfHwgKGRydnItPmJ1c19pZi0+c3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIFVwZGF0ZSBtdWx0aWNhc3Qgc3RhdGlzdGljICovCkBAIC0zMzUsMjkgKzMxMCwyOSBAQAogCWJyY21mX3Byb3RvX2hkcnB1c2goZHJ2ciwgaWZpZHgsIHBrdGJ1Zik7CiAKIAkvKiBVc2UgYnVzIG1vZHVsZSB0byBzZW5kIGRhdGEgZnJhbWUgKi8KLQlyZXR1cm4gYnJjbWZfc2RicmNtX2J1c190eGRhdGEoZHJ2ci0+YnVzLCBwa3RidWYpOworCXJldHVybiBicmNtZl9zZGJyY21fYnVzX3R4ZGF0YShkcnZyLT5kZXYsIHBrdGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgYnJjbWZfbmV0ZGV2X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gKihzdHJ1Y3QgYnJjbWZfaW5mbyAqKikKLQkJCQkJbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IGlmaWR4OworCXN0cnVjdCBicmNtZl9pZiAqaWZwID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGlmcC0+aW5mbzsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAogCS8qIFJlamVjdCBpZiBkb3duICovCi0JaWYgKCFkcnZyX3ByaXYtPnB1Yi51cCB8fCAoZHJ2cl9wcml2LT5wdWIuYnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pKSB7Ci0JCWJyY21mX2RiZyhFUlJPUiwgInhtaXQgcmVqZWN0ZWQgcHViLnVwPSVkIGJ1c3N0YXRlPSVkXG4iLAotCQkJICBkcnZyX3ByaXYtPnB1Yi51cCwgZHJ2cl9wcml2LT5wdWIuYnVzc3RhdGUpOworCWlmICghZHJ2cl9wcml2LT5wdWIudXAgfHwKKwkgICAgKGRydnJfcHJpdi0+cHViLmJ1c19pZi0+c3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pKSB7CisJCWJyY21mX2RiZyhFUlJPUiwgInhtaXQgcmVqZWN0ZWQgcHViLnVwPSVkIHN0YXRlPSVkXG4iLAorCQkJICBkcnZyX3ByaXYtPnB1Yi51cCwKKwkJCSAgZHJ2cl9wcml2LT5wdWIuYnVzX2lmLT5zdGF0ZSk7CiAJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmaWR4ID0gYnJjbWZfbmV0MmlkeChkcnZyX3ByaXYsIG5kZXYpOwotCWlmIChpZmlkeCA9PSBCUkNNRl9CQURfSUYpIHsKLQkJYnJjbWZfZGJnKEVSUk9SLCAiYmFkIGlmaWR4ICVkXG4iLCBpZmlkeCk7CisJaWYgKCFkcnZyX3ByaXYtPmlmbGlzdFtpZnAtPmlkeF0pIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAiYmFkIGlmaWR4ICVkXG4iLCBpZnAtPmlkeCk7CiAJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTM2NywyMCArMzQyLDIwIEBACiAJCXN0cnVjdCBza19idWZmICpza2IyOwogCiAJCWJyY21mX2RiZyhJTkZPLCAiJXM6IGluc3VmZmljaWVudCBoZWFkcm9vbVxuIiwKLQkJCSAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgpKTsKKwkJCSAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZwLT5pZHgpKTsKIAkJZHJ2cl9wcml2LT5wdWIudHhfcmVhbGxvYysrOwogCQlza2IyID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBkcnZyX3ByaXYtPnB1Yi5oZHJsZW4pOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXNrYiA9IHNrYjI7CiAJCWlmIChza2IgPT0gTlVMTCkgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiJXM6IHNrYl9yZWFsbG9jX2hlYWRyb29tIGZhaWxlZFxuIiwKLQkJCQkgIGJyY21mX2lmbmFtZSgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4KSk7CisJCQkJICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCBpZnAtPmlkeCkpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0KIAotCXJldCA9IGJyY21mX3NlbmRwa3QoJmRydnJfcHJpdi0+cHViLCBpZmlkeCwgc2tiKTsKKwlyZXQgPSBicmNtZl9zZW5kcGt0KCZkcnZyX3ByaXYtPnB1YiwgaWZwLT5pZHgsIHNrYik7CiAKIGRvbmU6CiAJaWYgKHJldCkKQEAgLTQyNCwyNiArMzk5LDIxIEBACiAJcmV0dXJuIGJjbWVycm9yOwogfQogCi12b2lkIGJyY21mX3J4X2ZyYW1lKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICBpbnQgbnVtcGt0KQordm9pZCBicmNtZl9yeF9mcmFtZShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgaWZpZHgsCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpza2JfbGlzdCkKIHsKIAlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKIAl1bnNpZ25lZCBjaGFyICpldGg7CiAJdWludCBsZW47CiAJdm9pZCAqZGF0YTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcG5leHQsICpzYXZlX3BrdGJ1ZjsKLQlpbnQgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqcG5leHQ7CiAJc3RydWN0IGJyY21mX2lmICppZnA7CiAJc3RydWN0IGJyY21mX2V2ZW50X21zZyBldmVudDsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAotCXNhdmVfcGt0YnVmID0gc2tiOwotCi0JZm9yIChpID0gMDsgc2tiICYmIGkgPCBudW1wa3Q7IGkrKywgc2tiID0gcG5leHQpIHsKLQotCQlwbmV4dCA9IHNrYi0+bmV4dDsKLQkJc2tiLT5uZXh0ID0gTlVMTDsKKwlza2JfcXVldWVfd2Fsa19zYWZlKHNrYl9saXN0LCBza2IsIHBuZXh0KSB7CisJCXNrYl91bmxpbmsoc2tiLCBza2JfbGlzdCk7CiAKIAkJLyogR2V0IHRoZSBwcm90b2NvbCwgbWFpbnRhaW4gc2tiIGFyb3VuZCBldGhfdHlwZV90cmFucygpCiAJCSAqIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBoYWNrIGlzIGZvciB0aGUgbGltaXRhdGlvbiBvZgpAQCAtNDY0LDYgKzQzNCwxMiBAQAogCQlpZiAoaWZwID09IE5VTEwpCiAJCQlpZnAgPSBkcnZyX3ByaXYtPmlmbGlzdFswXTsKIAorCQlpZiAoIWlmcCB8fCAhaWZwLT5uZGV2IHx8CisJCSAgICBpZnAtPm5kZXYtPnJlZ19zdGF0ZSAhPSBORVRSRUdfUkVHSVNURVJFRCkgeworCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihza2IpOworCQkJY29udGludWU7CisJCX0KKwogCQlza2ItPmRldiA9IGlmcC0+bmRldjsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOwogCkBAIC00ODIsMTIgKzQ1OCwxMCBAQAogCQkJCQkgIHNrYl9tYWNfaGVhZGVyKHNrYiksCiAJCQkJCSAgJmV2ZW50LCAmZGF0YSk7CiAKLQkJaWYgKGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XSAmJgotCQkgICAgIWRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XS0+c3RhdGUpCisJCWlmIChkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF0pIHsKIAkJCWlmcCA9IGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XTsKLQotCQlpZiAoaWZwLT5uZGV2KQogCQkJaWZwLT5uZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfQogCiAJCWRydnItPmRzdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAkJZHJ2ci0+cnhfcGFja2V0cysrOwkvKiBMb2NhbCBjb3VudCAqLwpAQCAtNTI0LDE5ICs0OTgsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpicmNtZl9uZXRkZXZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKQotCQkJCQluZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgYnJjbWZfaWYgKmlmcDsKLQlpbnQgaWZpZHg7CisJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gaWZwLT5pbmZvOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCi0JaWZpZHggPSBicmNtZl9uZXQyaWR4KGRydnJfcHJpdiwgbmRldik7Ci0JaWYgKGlmaWR4ID09IEJSQ01GX0JBRF9JRikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZnAgPSBkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF07Ci0KIAlpZiAoZHJ2cl9wcml2LT5wdWIudXApCiAJCS8qIFVzZSB0aGUgcHJvdG9jb2wgdG8gZ2V0IGRvbmdsZSBzdGF0cyAqLwogCQlicmNtZl9wcm90b19kc3RhdHMoJmRydnJfcHJpdi0+cHViKTsKQEAgLTYzNywxNCArNjAzLDEyIEBACiBzdGF0aWMgdm9pZCBicmNtZl9ldGh0b29sX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAogCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKQotCQkJCQluZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfaWYgKmlmcCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSBpZnAtPmluZm87CiAKIAlzcHJpbnRmKGluZm8tPmRyaXZlciwgS0JVSUxEX01PRE5BTUUpOwogCXNwcmludGYoaW5mby0+dmVyc2lvbiwgIiVsdSIsIGRydnJfcHJpdi0+cHViLmRydl92ZXJzaW9uKTsKLQlzcHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sICIlcyIsIEJDTTQzMjlfRldfTkFNRSk7Ci0Jc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIiVzIiwKLQkJZGV2X25hbWUoYnJjbWZfYnVzX2dldF9kZXZpY2UoZHJ2cl9wcml2LT5wdWIuYnVzKSkpOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICIlcyIsIGRldl9uYW1lKGRydnJfcHJpdi0+cHViLmRldikpOwogfQogCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGJyY21mX2V0aHRvb2xfb3BzID0gewpAQCAtNzY1LDE0ICs3MjksMTIgQEAKIHN0YXRpYyBpbnQgYnJjbWZfbmV0ZGV2X2lvY3RsX2VudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKIAkJCQkgICAgaW50IGNtZCkKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gKihzdHJ1Y3QgYnJjbWZfaW5mbyAqKikKLQkJCQkJbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IGlmaWR4OworCXN0cnVjdCBicmNtZl9pZiAqaWZwID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGlmcC0+aW5mbzsKIAotCWlmaWR4ID0gYnJjbWZfbmV0MmlkeChkcnZyX3ByaXYsIG5kZXYpOwotCWJyY21mX2RiZyhUUkFDRSwgImlmaWR4ICVkLCBjbWQgMHglMDR4XG4iLCBpZmlkeCwgY21kKTsKKwlicmNtZl9kYmcoVFJBQ0UsICJpZmlkeCAlZCwgY21kIDB4JTA0eFxuIiwgaWZwLT5pZHgsIGNtZCk7CiAKLQlpZiAoaWZpZHggPT0gQlJDTUZfQkFEX0lGKQorCWlmICghZHJ2cl9wcml2LT5pZmxpc3RbaWZwLT5pZHhdKQogCQlyZXR1cm4gLTE7CiAKIAlpZiAoY21kID09IFNJT0NFVEhUT09MKQpAQCAtNzg4LDIyICs3NTAsMTkgQEAKIAlzMzIgZXJyID0gMDsKIAlpbnQgYnVmbGVuID0gMDsKIAlib29sIGlzX3NldF9rZXlfY21kOwotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKQotCQkJCQluZXRkZXZfcHJpdihuZGV2KTsKLQlpbnQgaWZpZHg7CisJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gaWZwLT5pbmZvOwogCiAJbWVtc2V0KCZkY21kLCAwLCBzaXplb2YoZGNtZCkpOwogCWRjbWQuY21kID0gY21kOwogCWRjbWQuYnVmID0gYXJnOwogCWRjbWQubGVuID0gbGVuOwogCi0JaWZpZHggPSBicmNtZl9uZXQyaWR4KGRydnJfcHJpdiwgbmRldik7Ci0KIAlpZiAoZGNtZC5idWYgIT0gTlVMTCkKIAkJYnVmbGVuID0gbWluX3QodWludCwgZGNtZC5sZW4sIEJSQ01GX0RDTURfTUFYTEVOKTsKIAogCS8qIHNlbmQgdG8gZG9uZ2xlIChtdXN0IGJlIHVwLCBhbmQgd2wpICovCi0JaWYgKChkcnZyX3ByaXYtPnB1Yi5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfREFUQSkpIHsKKwlpZiAoKGRydnJfcHJpdi0+cHViLmJ1c19pZi0+c3RhdGUgIT0gQlJDTUZfQlVTX0RBVEEpKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgIkRPTkdMRV9ET1dOXG4iKTsKIAkJZXJyID0gLUVJTzsKIAkJZ290byBkb25lOwpAQCAtODI2LDcgKzc4NSw3IEBACiAJaWYgKGlzX3NldF9rZXlfY21kKQogCQlicmNtZl9uZXRkZXZfd2FpdF9wZW5kODAyMXgobmRldik7CiAKLQllcnIgPSBicmNtZl9wcm90b19kY21kKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgsICZkY21kLCBidWZsZW4pOworCWVyciA9IGJyY21mX3Byb3RvX2RjbWQoJmRydnJfcHJpdi0+cHViLCBpZnAtPmlkeCwgJmRjbWQsIGJ1Zmxlbik7CiAKIGRvbmU6CiAJaWYgKGVyciA+IDApCkBAIC04MzcsNyArNzk2LDggQEAKIAogc3RhdGljIGludCBicmNtZl9uZXRkZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gKihzdHJ1Y3QgYnJjbWZfcHViICoqKSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfaWYgKmlmcCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBicmNtZl9wdWIgKmRydnIgPSAmaWZwLT5pbmZvLT5wdWI7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAJYnJjbWZfY2ZnODAyMTFfZG93bihkcnZyLT5jb25maWcpOwpAQCAtODUzLDE2ICs4MTMsMTQgQEAKIAogc3RhdGljIGludCBicmNtZl9uZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gKihzdHJ1Y3QgYnJjbWZfaW5mbyAqKikKLQkJCQkJbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gaWZwLT5pbmZvOwogCXUzMiB0b2Vfb2w7Ci0JaW50IGlmaWR4ID0gYnJjbWZfbmV0MmlkeChkcnZyX3ByaXYsIG5kZXYpOwogCXMzMiByZXQgPSAwOwogCi0JYnJjbWZfZGJnKFRSQUNFLCAiaWZpZHggJWRcbiIsIGlmaWR4KTsKKwlicmNtZl9kYmcoVFJBQ0UsICJpZmlkeCAlZFxuIiwgaWZwLT5pZHgpOwogCi0JaWYgKGlmaWR4ID09IDApIHsJLyogZG8gaXQgb25seSBmb3IgcHJpbWFyeSBldGgwICovCi0KKwlpZiAoaWZwLT5pZHggPT0gMCkgewkvKiBkbyBpdCBvbmx5IGZvciBwcmltYXJ5IGV0aDAgKi8KIAkJLyogdHJ5IHRvIGJyaW5nIHVwIGJ1cyAqLwogCQlyZXQgPSBicmNtZl9idXNfc3RhcnQoJmRydnJfcHJpdi0+cHViKTsKIAkJaWYgKHJldCAhPSAwKSB7CkBAIC04NzQsMTIgKzgzMiwxMiBAQAogCQltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGRydnJfcHJpdi0+cHViLm1hYywgRVRIX0FMRU4pOwogCiAJCS8qIEdldCBjdXJyZW50IFRPRSBtb2RlIGZyb20gZG9uZ2xlICovCi0JCWlmIChicmNtZl90b2VfZ2V0KGRydnJfcHJpdiwgaWZpZHgsICZ0b2Vfb2wpID49IDAKKwkJaWYgKGJyY21mX3RvZV9nZXQoZHJ2cl9wcml2LCBpZnAtPmlkeCwgJnRvZV9vbCkgPj0gMAogCQkgICAgJiYgKHRvZV9vbCAmIFRPRV9UWF9DU1VNX09MKSAhPSAwKQotCQkJZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdLT5uZGV2LT5mZWF0dXJlcyB8PQorCQkJZHJ2cl9wcml2LT5pZmxpc3RbaWZwLT5pZHhdLT5uZGV2LT5mZWF0dXJlcyB8PQogCQkJCU5FVElGX0ZfSVBfQ1NVTTsKIAkJZWxzZQotCQkJZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdLT5uZGV2LT5mZWF0dXJlcyAmPQorCQkJZHJ2cl9wcml2LT5pZmxpc3RbaWZwLT5pZHhdLT5uZGV2LT5mZWF0dXJlcyAmPQogCQkJCX5ORVRJRl9GX0lQX0NTVU07CiAJfQogCS8qIEFsbG93IHRyYW5zbWl0IGNhbGxzICovCkBAIC04OTMsNzUgKzg1MSw2MiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYnJjbWZfbmV0ZGV2X29wc19wcmkgPSB7CisJLm5kb19vcGVuID0gYnJjbWZfbmV0ZGV2X29wZW4sCisJLm5kb19zdG9wID0gYnJjbWZfbmV0ZGV2X3N0b3AsCisJLm5kb19nZXRfc3RhdHMgPSBicmNtZl9uZXRkZXZfZ2V0X3N0YXRzLAorCS5uZG9fZG9faW9jdGwgPSBicmNtZl9uZXRkZXZfaW9jdGxfZW50cnksCisJLm5kb19zdGFydF94bWl0ID0gYnJjbWZfbmV0ZGV2X3N0YXJ0X3htaXQsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBicmNtZl9uZXRkZXZfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fc2V0X3J4X21vZGUgPSBicmNtZl9uZXRkZXZfc2V0X211bHRpY2FzdF9saXN0Cit9OworCiBpbnQKLWJyY21mX2FkZF9pZihzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgaWZpZHgsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCSAgICAgY2hhciAqbmFtZSwgdTggKm1hY19hZGRyLCB1MzIgZmxhZ3MsIHU4IGJzc2lkeCkKK2JyY21mX2FkZF9pZihzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgaWZpZHgsIGNoYXIgKm5hbWUsIHU4ICptYWNfYWRkcikKIHsKIAlzdHJ1Y3QgYnJjbWZfaWYgKmlmcDsKLQlpbnQgcmV0ID0gMCwgZXJyID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAotCWJyY21mX2RiZyhUUkFDRSwgImlkeCAlZCwgaGFuZGxlLT4lcFxuIiwgaWZpZHgsIG5kZXYpOworCWJyY21mX2RiZyhUUkFDRSwgImlkeCAlZFxuIiwgaWZpZHgpOwogCiAJaWZwID0gZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdOwotCWlmICghaWZwKSB7Ci0JCWlmcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9pZiksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWlmcCkKLQkJCXJldHVybiAtRU5PTUVNOworCS8qCisJICogRGVsZXRlIHRoZSBleGlzdGluZyBpbnRlcmZhY2UgYmVmb3JlIG92ZXJ3cml0aW5nIGl0CisJICogaW4gY2FzZSB3ZSBtaXNzZWQgdGhlIEJSQ01GX0VfSUZfREVMIGV2ZW50LgorCSAqLworCWlmIChpZnApIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAiRVJST1I6IG5ldGRldjolcyBhbHJlYWR5IGV4aXN0cywgdHJ5IGZyZWUgJiB1bnJlZ2lzdGVyXG4iLAorCQkJICBpZnAtPm5kZXYtPm5hbWUpOworCQluZXRpZl9zdG9wX3F1ZXVlKGlmcC0+bmRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGlmcC0+bmRldik7CisJCWZyZWVfbmV0ZGV2KGlmcC0+bmRldik7CisJCWRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XSA9IE5VTEw7CiAJfQogCi0JbWVtc2V0KGlmcCwgMCwgc2l6ZW9mKHN0cnVjdCBicmNtZl9pZikpOworCS8qIEFsbG9jYXRlIG5ldGRldiwgaW5jbHVkaW5nIHNwYWNlIGZvciBwcml2YXRlIHN0cnVjdHVyZSAqLworCW5kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBicmNtZl9pZiksIG5hbWUsIGV0aGVyX3NldHVwKTsKKwlpZiAoIW5kZXYpIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAiT09NIC0gYWxsb2NfbmV0ZGV2XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWZwID0gbmV0ZGV2X3ByaXYobmRldik7CisJaWZwLT5uZGV2ID0gbmRldjsKIAlpZnAtPmluZm8gPSBkcnZyX3ByaXY7CiAJZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdID0gaWZwOworCWlmcC0+aWR4ID0gaWZpZHg7CiAJaWYgKG1hY19hZGRyICE9IE5VTEwpCiAJCW1lbWNweSgmaWZwLT5tYWNfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKIAotCWlmIChuZGV2ID09IE5VTEwpIHsKLQkJaWZwLT5zdGF0ZSA9IEJSQ01GX0VfSUZfQUREOwotCQlpZnAtPmlkeCA9IGlmaWR4OwotCQkvKgotCQkgKiBEZWxldGUgdGhlIGV4aXN0aW5nIGludGVyZmFjZSBiZWZvcmUgb3ZlcndyaXRpbmcgaXQKLQkJICogaW4gY2FzZSB3ZSBtaXNzZWQgdGhlIEJSQ01GX0VfSUZfREVMIGV2ZW50LgotCQkgKi8KLQkJaWYgKGlmcC0+bmRldiAhPSBOVUxMKSB7Ci0JCQlicmNtZl9kYmcoRVJST1IsICJFUlJPUjogbmV0ZGV2OiVzIGFscmVhZHkgZXhpc3RzLCB0cnkgZnJlZSAmIHVucmVnaXN0ZXJcbiIsCi0JCQkJICBpZnAtPm5kZXYtPm5hbWUpOwotCQkJbmV0aWZfc3RvcF9xdWV1ZShpZnAtPm5kZXYpOwotCQkJdW5yZWdpc3Rlcl9uZXRkZXYoaWZwLT5uZGV2KTsKLQkJCWZyZWVfbmV0ZGV2KGlmcC0+bmRldik7Ci0JCX0KKwlpZiAoYnJjbWZfbmV0X2F0dGFjaCgmZHJ2cl9wcml2LT5wdWIsIGlmcC0+aWR4KSkgeworCQlicmNtZl9kYmcoRVJST1IsICJicmNtZl9uZXRfYXR0YWNoIGZhaWxlZCIpOworCQlmcmVlX25ldGRldihpZnAtPm5kZXYpOworCQlkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF0gPSBOVUxMOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCi0JCS8qIEFsbG9jYXRlIG5ldGRldiwgaW5jbHVkaW5nIHNwYWNlIGZvciBwcml2YXRlIHN0cnVjdHVyZSAqLwotCQlpZnAtPm5kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKGRydnJfcHJpdiksICJ3bGFuJWQiLAotCQkJCQkgZXRoZXJfc2V0dXApOwotCQlpZiAoIWlmcC0+bmRldikgewotCQkJYnJjbWZfZGJnKEVSUk9SLCAiT09NIC0gYWxsb2NfbmV0ZGV2XG4iKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCX0KLQotCQlpZiAocmV0ID09IDApIHsKLQkJCW1lbWNweShuZXRkZXZfcHJpdihpZnAtPm5kZXYpLCAmZHJ2cl9wcml2LAotCQkJICAgICAgIHNpemVvZihkcnZyX3ByaXYpKTsKLQkJCWVyciA9IGJyY21mX25ldF9hdHRhY2goJmRydnJfcHJpdi0+cHViLCBpZnAtPmlkeCk7Ci0JCQlpZiAoZXJyICE9IDApIHsKLQkJCQlicmNtZl9kYmcoRVJST1IsICJicmNtZl9uZXRfYXR0YWNoIGZhaWxlZCwgZXJyICVkXG4iLAotCQkJCQkgIGVycik7Ci0JCQkJcmV0ID0gLUVPUE5PVFNVUFA7Ci0JCQl9IGVsc2UgewotCQkJCWJyY21mX2RiZyhUUkFDRSwgIiA9PT09IHBpZDoleCwgbmV0X2RldmljZSBmb3IgaWY6JXMgY3JlYXRlZCA9PT1cbiIsCi0JCQkJCSAgY3VycmVudC0+cGlkLCBpZnAtPm5kZXYtPm5hbWUpOwotCQkJCWlmcC0+c3RhdGUgPSAwOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJldCA8IDApIHsKLQkJCWlmIChpZnAtPm5kZXYpCi0JCQkJZnJlZV9uZXRkZXYoaWZwLT5uZGV2KTsKLQotCQkJZHJ2cl9wcml2LT5pZmxpc3RbaWZwLT5pZHhdID0gTlVMTDsKLQkJCWtmcmVlKGlmcCk7Ci0JCX0KLQl9IGVsc2UKLQkJaWZwLT5uZGV2ID0gbmRldjsKKwlicmNtZl9kYmcoVFJBQ0UsICIgPT09PSBwaWQ6JXgsIG5ldF9kZXZpY2UgZm9yIGlmOiVzIGNyZWF0ZWQgPT09XG4iLAorCQkgIGN1cnJlbnQtPnBpZCwgaWZwLT5uZGV2LT5uYW1lKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTc3LDQ3ICs5MjIsMzcgQEAKIAkJYnJjbWZfZGJnKEVSUk9SLCAiTnVsbCBpbnRlcmZhY2VcbiIpOwogCQlyZXR1cm47CiAJfQorCWlmIChpZnAtPm5kZXYpIHsKKwkJaWYgKGlmaWR4ID09IDApIHsKKwkJCWlmIChpZnAtPm5kZXYtPm5ldGRldl9vcHMgPT0gJmJyY21mX25ldGRldl9vcHNfcHJpKSB7CisJCQkJcnRubF9sb2NrKCk7CisJCQkJYnJjbWZfbmV0ZGV2X3N0b3AoaWZwLT5uZGV2KTsKKwkJCQlydG5sX3VubG9jaygpOworCQkJfQorCQl9IGVsc2UgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShpZnAtPm5kZXYpOworCQl9CiAKLQlpZnAtPnN0YXRlID0gQlJDTUZfRV9JRl9ERUw7Ci0JaWZwLT5pZHggPSBpZmlkeDsKLQlpZiAoaWZwLT5uZGV2ICE9IE5VTEwpIHsKLQkJbmV0aWZfc3RvcF9xdWV1ZShpZnAtPm5kZXYpOwogCQl1bnJlZ2lzdGVyX25ldGRldihpZnAtPm5kZXYpOwotCQlmcmVlX25ldGRldihpZnAtPm5kZXYpOwogCQlkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF0gPSBOVUxMOwotCQlrZnJlZShpZnApOworCQlpZiAoaWZpZHggPT0gMCkKKwkJCWJyY21mX2NmZzgwMjExX2RldGFjaChkcnZyX3ByaXYtPnB1Yi5jb25maWcpOworCQlmcmVlX25ldGRldihpZnAtPm5kZXYpOwogCX0KIH0KIAotc3RydWN0IGJyY21mX3B1YiAqYnJjbWZfYXR0YWNoKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdWludCBidXNfaGRybGVuKQorc3RydWN0IGJyY21mX3B1YiAqYnJjbWZfYXR0YWNoKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHVpbnQgYnVzX2hkcmxlbiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IE5VTEw7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKLQkvKiBBbGxvY2F0ZSBuZXRkZXYsIGluY2x1ZGluZyBzcGFjZSBmb3IgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KLQluZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihkcnZyX3ByaXYpLCAid2xhbiVkIiwgZXRoZXJfc2V0dXApOwotCWlmICghbmRldikgewotCQlicmNtZl9kYmcoRVJST1IsICJPT00gLSBhbGxvY19uZXRkZXZcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCiAJLyogQWxsb2NhdGUgcHJpbWFyeSBicmNtZl9pbmZvICovCiAJZHJ2cl9wcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX2luZm8pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWRydnJfcHJpdikKIAkJZ290byBmYWlsOwogCi0JLyoKLQkgKiBTYXZlIHRoZSBicmNtZl9pbmZvIGludG8gdGhlIHByaXYKLQkgKi8KLQltZW1jcHkobmV0ZGV2X3ByaXYobmRldiksICZkcnZyX3ByaXYsIHNpemVvZihkcnZyX3ByaXYpKTsKLQotCWlmIChicmNtZl9hZGRfaWYoZHJ2cl9wcml2LCAwLCBuZGV2LCBuZGV2LT5uYW1lLCBOVUxMLCAwLCAwKSA9PQotCSAgICBCUkNNRl9CQURfSUYpCi0JCWdvdG8gZmFpbDsKLQotCW5kZXYtPm5ldGRldl9vcHMgPSBOVUxMOwogCW11dGV4X2luaXQoJmRydnJfcHJpdi0+cHJvdG9fYmxvY2spOwogCiAJLyogTGluayB0byBpbmZvIG1vZHVsZSAqLwpAQCAtMTAyNiw2ICs5NjEsOCBAQAogCS8qIExpbmsgdG8gYnVzIG1vZHVsZSAqLwogCWRydnJfcHJpdi0+cHViLmJ1cyA9IGJ1czsKIAlkcnZyX3ByaXYtPnB1Yi5oZHJsZW4gPSBidXNfaGRybGVuOworCWRydnJfcHJpdi0+cHViLmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWRydnJfcHJpdi0+cHViLmRldiA9IGRldjsKIAogCS8qIEF0dGFjaCBhbmQgbGluayBpbiB0aGUgcHJvdG9jb2wgKi8KIAlpZiAoYnJjbWZfcHJvdG9fYXR0YWNoKCZkcnZyX3ByaXYtPnB1YikgIT0gMCkgewpAQCAtMTAzMywyOSArOTcwLDEyIEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQkvKiBBdHRhY2ggYW5kIGxpbmsgaW4gdGhlIGNmZzgwMjExICovCi0JZHJ2cl9wcml2LT5wdWIuY29uZmlnID0KLQkJCWJyY21mX2NmZzgwMjExX2F0dGFjaChuZGV2LAotCQkJCQkgICAgICBicmNtZl9idXNfZ2V0X2RldmljZShidXMpLAotCQkJCQkgICAgICAmZHJ2cl9wcml2LT5wdWIpOwotCWlmIChkcnZyX3ByaXYtPnB1Yi5jb25maWcgPT0gTlVMTCkgewotCQlicmNtZl9kYmcoRVJST1IsICJ3bF9jZmc4MDIxMV9hdHRhY2ggZmFpbGVkXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQogCUlOSVRfV09SSygmZHJ2cl9wcml2LT5zZXRtYWNhZGRyX3dvcmssIF9icmNtZl9zZXRfbWFjX2FkZHJlc3MpOwogCUlOSVRfV09SSygmZHJ2cl9wcml2LT5tdWx0aWNhc3Rfd29yaywgX2JyY21mX3NldF9tdWx0aWNhc3RfbGlzdCk7CiAKLQkvKgotCSAqIFNhdmUgdGhlIGJyY21mX2luZm8gaW50byB0aGUgcHJpdgotCSAqLwotCW1lbWNweShuZXRkZXZfcHJpdihuZGV2KSwgJmRydnJfcHJpdiwgc2l6ZW9mKGRydnJfcHJpdikpOwotCiAJcmV0dXJuICZkcnZyX3ByaXYtPnB1YjsKIAogZmFpbDoKLQlpZiAobmRldikKLQkJZnJlZV9uZXRkZXYobmRldik7CiAJaWYgKGRydnJfcHJpdikKIAkJYnJjbWZfZGV0YWNoKCZkcnZyX3ByaXYtPnB1Yik7CiAKQEAgLTEwNzIsMTQgKzk5MiwxNCBAQAogCWJyY21mX2RiZyhUUkFDRSwgIlxuIik7CiAKIAkvKiBCcmluZyB1cCB0aGUgYnVzICovCi0JcmV0ID0gYnJjbWZfc2RicmNtX2J1c19pbml0KCZkcnZyX3ByaXYtPnB1Yik7CisJcmV0ID0gYnJjbWZfc2RicmNtX2J1c19pbml0KGRydnJfcHJpdi0+cHViLmRldik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImJyY21mX3NkYnJjbV9idXNfaW5pdCBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJLyogSWYgYnVzIGlzIG5vdCByZWFkeSwgY2FuJ3QgY29tZSB1cCAqLwotCWlmIChkcnZyX3ByaXYtPnB1Yi5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfREFUQSkgeworCWlmIChkcnZyX3ByaXYtPnB1Yi5idXNfaWYtPnN0YXRlICE9IEJSQ01GX0JVU19EQVRBKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImZhaWxlZCBidXMgaXMgbm90IHJlYWR5XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTEyMywxNiArMTA0Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYnJjbWZfbmV0ZGV2X29wc19wcmkgPSB7Ci0JLm5kb19vcGVuID0gYnJjbWZfbmV0ZGV2X29wZW4sCi0JLm5kb19zdG9wID0gYnJjbWZfbmV0ZGV2X3N0b3AsCi0JLm5kb19nZXRfc3RhdHMgPSBicmNtZl9uZXRkZXZfZ2V0X3N0YXRzLAotCS5uZG9fZG9faW9jdGwgPSBicmNtZl9uZXRkZXZfaW9jdGxfZW50cnksCi0JLm5kb19zdGFydF94bWl0ID0gYnJjbWZfbmV0ZGV2X3N0YXJ0X3htaXQsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBicmNtZl9uZXRkZXZfc2V0X21hY19hZGRyZXNzLAotCS5uZG9fc2V0X3J4X21vZGUgPSBicmNtZl9uZXRkZXZfc2V0X211bHRpY2FzdF9saXN0Ci19OwotCiBpbnQgYnJjbWZfbmV0X2F0dGFjaChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgaWZpZHgpCiB7CiAJc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGRydnItPmluZm87CkBAIC0xMTY5LDYgKzEwNzksMTUgQEAKIAogCW1lbWNweShuZGV2LT5kZXZfYWRkciwgdGVtcF9hZGRyLCBFVEhfQUxFTik7CiAKKwkvKiBhdHRhY2ggdG8gY2ZnODAyMTEgZm9yIHByaW1hcnkgaW50ZXJmYWNlICovCisJaWYgKCFpZmlkeCkgeworCQlkcnZyLT5jb25maWcgPSBicmNtZl9jZmc4MDIxMV9hdHRhY2gobmRldiwgZHJ2ci0+ZGV2LCBkcnZyKTsKKwkJaWYgKGRydnItPmNvbmZpZyA9PSBOVUxMKSB7CisJCQlicmNtZl9kYmcoRVJST1IsICJ3bF9jZmc4MDIxMV9hdHRhY2ggZmFpbGVkXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwogCWlmIChyZWdpc3Rlcl9uZXRkZXYobmRldikgIT0gMCkgewogCQlicmNtZl9kYmcoRVJST1IsICJjb3VsZG4ndCByZWdpc3RlciB0aGUgbmV0IGRldmljZVxuIik7CiAJCWdvdG8gZmFpbDsKQEAgLTExOTYsNyArMTExNSw3IEBACiAJCQlicmNtZl9wcm90b19zdG9wKCZkcnZyX3ByaXYtPnB1Yik7CiAKIAkJCS8qIFN0b3AgdGhlIGJ1cyBtb2R1bGUgKi8KLQkJCWJyY21mX3NkYnJjbV9idXNfc3RvcChkcnZyX3ByaXYtPnB1Yi5idXMpOworCQkJYnJjbWZfc2RicmNtX2J1c19zdG9wKGRydnJfcHJpdi0+cHViLmRldik7CiAJCX0KIAl9CiB9CkBAIC0xMjEwLDIxICsxMTI5LDEzIEBACiAJaWYgKGRydnIpIHsKIAkJZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKIAkJaWYgKGRydnJfcHJpdikgewotCQkJc3RydWN0IGJyY21mX2lmICppZnA7CiAJCQlpbnQgaTsKIAotCQkJZm9yIChpID0gMTsgaSA8IEJSQ01GX01BWF9JRlM7IGkrKykKKwkJCS8qIG1ha2Ugc3VyZSBwcmltYXJ5IGludGVyZmFjZSByZW1vdmVkIGxhc3QgKi8KKwkJCWZvciAoaSA9IEJSQ01GX01BWF9JRlMtMTsgaSA+IC0xOyBpLS0pCiAJCQkJaWYgKGRydnJfcHJpdi0+aWZsaXN0W2ldKQogCQkJCQlicmNtZl9kZWxfaWYoZHJ2cl9wcml2LCBpKTsKIAotCQkJaWZwID0gZHJ2cl9wcml2LT5pZmxpc3RbMF07Ci0JCQlpZiAoaWZwLT5uZGV2LT5uZXRkZXZfb3BzID09ICZicmNtZl9uZXRkZXZfb3BzX3ByaSkgewotCQkJCXJ0bmxfbG9jaygpOwotCQkJCWJyY21mX25ldGRldl9zdG9wKGlmcC0+bmRldik7Ci0JCQkJcnRubF91bmxvY2soKTsKLQkJCQl1bnJlZ2lzdGVyX25ldGRldihpZnAtPm5kZXYpOwotCQkJfQotCiAJCQljYW5jZWxfd29ya19zeW5jKCZkcnZyX3ByaXYtPnNldG1hY2FkZHJfd29yayk7CiAJCQljYW5jZWxfd29ya19zeW5jKCZkcnZyX3ByaXYtPm11bHRpY2FzdF93b3JrKTsKIApAQCAtMTIzMyw0MyArMTE0NCwxMSBAQAogCQkJaWYgKGRydnItPnByb3QpCiAJCQkJYnJjbWZfcHJvdG9fZGV0YWNoKGRydnIpOwogCi0JCQlicmNtZl9jZmc4MDIxMV9kZXRhY2goZHJ2ci0+Y29uZmlnKTsKLQotCQkJZnJlZV9uZXRkZXYoaWZwLT5uZGV2KTsKLQkJCWtmcmVlKGlmcCk7CiAJCQlrZnJlZShkcnZyX3ByaXYpOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgYnJjbWZfbW9kdWxlX2NsZWFudXAodm9pZCkKLXsKLQlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7Ci0KLQlicmNtZl9idXNfdW5yZWdpc3RlcigpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBicmNtZl9tb2R1bGVfaW5pdCh2b2lkKQotewotCWludCBlcnJvcjsKLQotCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKLQotCWVycm9yID0gYnJjbWZfYnVzX3JlZ2lzdGVyKCk7Ci0KLQlpZiAoZXJyb3IpIHsKLQkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbWZfYnVzX3JlZ2lzdGVyIGZhaWxlZFxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlyZXR1cm4gMDsKLQotZmFpbGVkOgotCXJldHVybiAtRUlOVkFMOwotfQotCi1tb2R1bGVfaW5pdChicmNtZl9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChicmNtZl9tb2R1bGVfY2xlYW51cCk7Ci0KIGludCBicmNtZl9vc19wcm90b19ibG9jayhzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQogewogCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSBkcnZyLT5pbmZvOwpAQCAtMTMwMiw3ICsxMTgxLDggQEAKIAogaW50IGJyY21mX25ldGRldl93YWl0X3BlbmQ4MDIxeChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gKihzdHJ1Y3QgYnJjbWZfaW5mbyAqKiluZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfaWYgKmlmcCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSBpZnAtPmluZm87CiAJaW50IHRpbWVvdXQgPSAxMCAqIEhaIC8gMTAwMDsKIAlpbnQgbnRpbWVzID0gTUFYX1dBSVRfRk9SXzgwMjFYX1RYOwogCWludCBwZW5kID0gYnJjbWZfZ2V0X3BlbmRfODAyMXhfY250KGRydnJfcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCmluZGV4IDMxM2I4YmYuLjE4NTk3ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8ZGVmcy5oPgogI2luY2x1ZGUgPGJyY211X3dpZmkuaD4KQEAgLTM1LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxicmNtX2h3X2lkcy5oPgogI2luY2x1ZGUgPHNvYy5oPgogI2luY2x1ZGUgInNkaW9faG9zdC5oIgorI2luY2x1ZGUgInNkaW9fY2hpcC5oIgogCiAjZGVmaW5lIERDTURfUkVTUF9USU1FT1VUICAyMDAwCS8qIEluIG1pbGxpIHNlY29uZCAqLwogCkBAIC04OSw3ICs5MSw2IEBACiAjaW5jbHVkZSAiZGhkX2J1cy5oIgogI2luY2x1ZGUgImRoZF9wcm90by5oIgogI2luY2x1ZGUgImRoZF9kYmcuaCIKLSNpbmNsdWRlIDxiY21jaGlwLmg+CiAKICNkZWZpbmUgVFhRTEVOCQkyMDQ4CS8qIGJ1bGsgdHggcXVldWUgbGVuZ3RoICovCiAjZGVmaW5lIFRYSEkJCShUWFFMRU4gLSAyNTYpCS8qIHR1cm4gb24gZmxvdyBjb250cm9sIGFib3ZlIFRYSEkgKi8KQEAgLTEzNCwzMyArMTM1LDYgQEAKIC8qICAgRm9yY2Ugbm8gYmFja3BsYW5lIHJlc2V0ICovCiAjZGVmaW5lIFNCU0RJT19ERVZDVExfUlNUX05PQlBSRVNFVAkweDIwCiAKLS8qIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSICovCi0KLS8qIEZvcmNlIEFMUCByZXF1ZXN0IHRvIGJhY2twbGFuZSAqLwotI2RlZmluZSBTQlNESU9fRk9SQ0VfQUxQCQkweDAxCi0vKiBGb3JjZSBIVCByZXF1ZXN0IHRvIGJhY2twbGFuZSAqLwotI2RlZmluZSBTQlNESU9fRk9SQ0VfSFQJCQkweDAyCi0vKiBGb3JjZSBJTFAgcmVxdWVzdCB0byBiYWNrcGxhbmUgKi8KLSNkZWZpbmUgU0JTRElPX0ZPUkNFX0lMUAkJMHgwNAotLyogTWFrZSBBTFAgcmVhZHkgKHBvd2VyIHVwIHh0YWwpICovCi0jZGVmaW5lIFNCU0RJT19BTFBfQVZBSUxfUkVRCQkweDA4Ci0vKiBNYWtlIEhUIHJlYWR5IChwb3dlciB1cCBQTEwpICovCi0jZGVmaW5lIFNCU0RJT19IVF9BVkFJTF9SRVEJCTB4MTAKLS8qIFNxdWVsY2ggY2xvY2sgcmVxdWVzdHMgZnJvbSBIVyAqLwotI2RlZmluZSBTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRgkweDIwCi0vKiBTdGF0dXM6IEFMUCBpcyByZWFkeSAqLwotI2RlZmluZSBTQlNESU9fQUxQX0FWQUlMCQkweDQwCi0vKiBTdGF0dXM6IEhUIGlzIHJlYWR5ICovCi0jZGVmaW5lIFNCU0RJT19IVF9BVkFJTAkJCTB4ODAKLQotI2RlZmluZSBTQlNESU9fQVZCSVRTCQkoU0JTRElPX0hUX0FWQUlMIHwgU0JTRElPX0FMUF9BVkFJTCkKLSNkZWZpbmUgU0JTRElPX0FMUEFWKHJlZ3ZhbCkJKChyZWd2YWwpICYgU0JTRElPX0FWQklUUykKLSNkZWZpbmUgU0JTRElPX0hUQVYocmVndmFsKQkoKChyZWd2YWwpICYgU0JTRElPX0FWQklUUykgPT0gU0JTRElPX0FWQklUUykKLSNkZWZpbmUgU0JTRElPX0FMUE9OTFkocmVndmFsKQkoU0JTRElPX0FMUEFWKHJlZ3ZhbCkgJiYgIVNCU0RJT19IVEFWKHJlZ3ZhbCkpCi0KLSNkZWZpbmUgU0JTRElPX0NMS0FWKHJlZ3ZhbCwgYWxwb25seSkgXAotCShTQlNESU9fQUxQQVYocmVndmFsKSAmJiAoYWxwb25seSA/IDEgOiBTQlNESU9fSFRBVihyZWd2YWwpKSkKLQogLyogZGlyZWN0KG1hcHBlZCkgY2lzIHNwYWNlICovCiAKIC8qIE1BUFBFRCBjb21tb24gQ0lTIGFkZHJlc3MgKi8KQEAgLTMzNSw0OSArMzA5LDEwIEBACiAvKiBGbGFncyBmb3IgU0RIIGNhbGxzICovCiAjZGVmaW5lIEYyU1lOQwkoU0RJT19SRVFfNEJZVEUgfCBTRElPX1JFUV9GSVhFRCkKIAotLyogc2JpbXN0YXRlICovCi0jZGVmaW5lCVNCSU1fSUJFCQkweDIwMDAwCS8qIGluYmFuZGVycm9yICovCi0jZGVmaW5lCVNCSU1fVE8JCQkweDQwMDAwCS8qIHRpbWVvdXQgKi8KLSNkZWZpbmUJU0JJTV9CWQkJCTB4MDE4MDAwMDAJLyogYnVzeSAoc29uaWNzID49IDIuMykgKi8KLSNkZWZpbmUJU0JJTV9SSgkJCTB4MDIwMDAwMDAJLyogcmVqZWN0IChzb25pY3MgPj0gMi4zKSAqLwotCi0vKiBzYnRtc3RhdGVsb3cgKi8KLQotLyogcmVzZXQgKi8KLSNkZWZpbmUJU0JUTUxfUkVTRVQJCTB4MDAwMQotLyogcmVqZWN0IGZpZWxkICovCi0jZGVmaW5lCVNCVE1MX1JFSl9NQVNLCQkweDAwMDYKLS8qIHJlamVjdCAqLwotI2RlZmluZQlTQlRNTF9SRUoJCTB4MDAwMgotLyogdGVtcG9yYXJ5IHJlamVjdCwgZm9yIGVycm9yIHJlY292ZXJ5ICovCi0jZGVmaW5lCVNCVE1MX1RNUFJFSgkJMHgwMDA0Ci0KLS8qIFNoaWZ0IHRvIGxvY2F0ZSB0aGUgU0kgY29udHJvbCBmbGFncyBpbiBzYnRtbCAqLwotI2RlZmluZQlTQlRNTF9TSUNGX1NISUZUCTE2Ci0KLS8qIHNidG1zdGF0ZWhpZ2ggKi8KLSNkZWZpbmUJU0JUTUhfU0VSUgkJMHgwMDAxCS8qIHNlcnJvciAqLwotI2RlZmluZQlTQlRNSF9JTlQJCTB4MDAwMgkvKiBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUJU0JUTUhfQlVTWQkJMHgwMDA0CS8qIGJ1c3kgKi8KLSNkZWZpbmUJU0JUTUhfVE8JCTB4MDAyMAkvKiB0aW1lb3V0IChzb25pY3MgPj0gMi4zKSAqLwotCi0vKiBTaGlmdCB0byBsb2NhdGUgdGhlIFNJIHN0YXR1cyBmbGFncyBpbiBzYnRtaCAqLwotI2RlZmluZQlTQlRNSF9TSVNGX1NISUZUCTE2Ci0KLS8qIHNiaWRsb3cgKi8KLSNkZWZpbmUJU0JJRExfSU5JVAkJMHg4MAkvKiBpbml0aWF0b3IgKi8KLQotLyogc2JpZGhpZ2ggKi8KLSNkZWZpbmUJU0JJREhfUkNfTUFTSwkJMHgwMDBmCS8qIHJldmlzaW9uIGNvZGUgKi8KLSNkZWZpbmUJU0JJREhfUkNFX01BU0sJCTB4NzAwMAkvKiByZXZpc2lvbiBjb2RlIGV4dGVuc2lvbiBmaWVsZCAqLwotI2RlZmluZQlTQklESF9SQ0VfU0hJRlQJCTgKLSNkZWZpbmUJU0JDT1JFUkVWKHNiaWRoKSBcCi0JKCgoKHNiaWRoKSAmIFNCSURIX1JDRV9NQVNLKSA+PiBTQklESF9SQ0VfU0hJRlQpIHwgXAotCSAgKChzYmlkaCkgJiBTQklESF9SQ19NQVNLKSkKLSNkZWZpbmUJU0JJREhfQ0NfTUFTSwkJMHg4ZmYwCS8qIGNvcmUgY29kZSAqLwotI2RlZmluZQlTQklESF9DQ19TSElGVAkJNAotI2RlZmluZQlTQklESF9WQ19NQVNLCQkweGZmZmYwMDAwCS8qIHZlbmRvciBjb2RlICovCi0jZGVmaW5lCVNCSURIX1ZDX1NISUZUCQkxNgorI2RlZmluZSBCUkNNRk1BQ19GV19OQU1FCSJicmNtL2JyY21mbWFjLmJpbiIKKyNkZWZpbmUgQlJDTUZNQUNfTlZfTkFNRQkiYnJjbS9icmNtZm1hYy50eHQiCitNT0RVTEVfRklSTVdBUkUoQlJDTUZNQUNfRldfTkFNRSk7CitNT0RVTEVfRklSTVdBUkUoQlJDTUZNQUNfTlZfTkFNRSk7CiAKIC8qCiAgKiBDb252ZXJzaW9uIG9mIDgwMi4xRCBwcmlvcml0eSB0byBwcmVjZWRlbmNlIGxldmVsCkBAIC0zODgsMTcgKzMyMyw2IEBACiAJICAgICAgIChwcmlvXjIpIDogcHJpbzsKIH0KIAotLyoKLSAqIENvcmUgcmVnIGFkZHJlc3MgdHJhbnNsYXRpb24uCi0gKiBCb3RoIG1hY3JvJ3MgcmV0dXJucyBhIDMyIGJpdHMgYnl0ZSBhZGRyZXNzIG9uIHRoZSBiYWNrcGxhbmUgYnVzLgotICovCi0jZGVmaW5lIENPUkVfQ0NfUkVHKGJhc2UsIGZpZWxkKSBcCi0JCShiYXNlICsgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZmllbGQpKQotI2RlZmluZSBDT1JFX0JVU19SRUcoYmFzZSwgZmllbGQpIFwKLQkJKGJhc2UgKyBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGZpZWxkKSkKLSNkZWZpbmUgQ09SRV9TQihiYXNlLCBmaWVsZCkgXAotCQkoYmFzZSArIFNCQ09ORklHT0ZGICsgb2Zmc2V0b2Yoc3RydWN0IHNiY29uZmlnLCBmaWVsZCkpCi0KIC8qIGNvcmUgcmVnaXN0ZXJzICovCiBzdHJ1Y3Qgc2RwY21kX3JlZ3MgewogCXUzMiBjb3JlY29udHJvbDsJCS8qIDB4MDAsIHJldjggKi8KQEAgLTUyNCwyMyArNDQ4LDggQEAKIAogCiAvKiBtaXNjIGNoaXAgaW5mbyBuZWVkZWQgYnkgc29tZSBvZiB0aGUgcm91dGluZXMgKi8KLXN0cnVjdCBjaGlwX2luZm8gewotCXUzMiBjaGlwOwotCXUzMiBjaGlwcmV2OwotCXUzMiBjY2NvcmViYXNlOwotCXUzMiBjY3JldjsKLQl1MzIgY2NjYXBzOwotCXUzMiBidXNjb3JlYmFzZTsgLyogMzIgYml0cyBiYWNrcGxhbmUgYnVzIGFkZHJlc3MgKi8KLQl1MzIgYnVzY29yZXJldjsKLQl1MzIgYnVzY29yZXR5cGU7Ci0JdTMyIHJhbWNvcmViYXNlOwotCXUzMiBhcm1jb3JlYmFzZTsKLQl1MzIgcG11cmV2OwotCXUzMiByYW1zaXplOwotfTsKLQogLyogUHJpdmF0ZSBkYXRhIGZvciBTRElPIGJ1cyBpbnRlcmFjdGlvbiAqLwotc3RydWN0IGJyY21mX2J1cyB7CitzdHJ1Y3QgYnJjbWZfc2RpbyB7CiAJc3RydWN0IGJyY21mX3B1YiAqZHJ2cjsKIAogCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldjsJLyogc2RpbyBkZXZpY2UgaGFuZGxlciAqLwpAQCAtNTc0LDcgKzQ4Myw3IEBACiAJdWludCB0eG1pbm1heDsKIAogCXN0cnVjdCBza19idWZmICpnbG9tZDsJLyogUGFja2V0IGNvbnRhaW5pbmcgZ2xvbW1pbmcgZGVzY3JpcHRvciAqLwotCXN0cnVjdCBza19idWZmICpnbG9tOwkvKiBQYWNrZXQgY2hhaW4gZm9yIGdsb21tZWQgc3VwZXJmcmFtZSAqLworCXN0cnVjdCBza19idWZmX2hlYWQgZ2xvbTsgLyogUGFja2V0IGxpc3QgZm9yIGdsb21tZWQgc3VwZXJmcmFtZSAqLwogCXVpbnQgZ2xvbWVycjsJCS8qIEdsb20gcGFja2V0IHJlYWQgZXJyb3JzICovCiAKIAl1OCAqcnhidWY7CQkvKiBCdWZmZXIgZm9yIHJlY2VpdmluZyBjb250cm9sIHBhY2tldHMgKi8KQEAgLTY1Nyw1MiArNTY2LDEwIEBACiAKIAlzdHJ1Y3Qgc2VtYXBob3JlIHNkc2VtOwogCi0JY29uc3QgY2hhciAqZndfbmFtZTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwotCWNvbnN0IGNoYXIgKm52X25hbWU7CiAJdTMyIGZ3X3B0cjsKIH07CiAKLXN0cnVjdCBzYmNvbmZpZyB7Ci0JdTMyIFBBRFsyXTsKLQl1MzIgc2JpcHNmbGFnOwkvKiBpbml0aWF0b3IgcG9ydCBvY3Agc2xhdmUgZmxhZyAqLwotCXUzMiBQQURbM107Ci0JdTMyIHNidHBzZmxhZzsJLyogdGFyZ2V0IHBvcnQgb2NwIHNsYXZlIGZsYWcgKi8KLQl1MzIgUEFEWzExXTsKLQl1MzIgc2J0bWVycmxvZ2E7CS8qIChzb25pY3MgPj0gMi4zKSAqLwotCXUzMiBQQUQ7Ci0JdTMyIHNidG1lcnJsb2c7CS8qIChzb25pY3MgPj0gMi4zKSAqLwotCXUzMiBQQURbM107Ci0JdTMyIHNiYWRtYXRjaDM7CS8qIGFkZHJlc3MgbWF0Y2gzICovCi0JdTMyIFBBRDsKLQl1MzIgc2JhZG1hdGNoMjsJLyogYWRkcmVzcyBtYXRjaDIgKi8KLQl1MzIgUEFEOwotCXUzMiBzYmFkbWF0Y2gxOwkvKiBhZGRyZXNzIG1hdGNoMSAqLwotCXUzMiBQQURbN107Ci0JdTMyIHNiaW1zdGF0ZTsJLyogaW5pdGlhdG9yIGFnZW50IHN0YXRlICovCi0JdTMyIHNiaW50dmVjOwkvKiBpbnRlcnJ1cHQgbWFzayAqLwotCXUzMiBzYnRtc3RhdGVsb3c7CS8qIHRhcmdldCBzdGF0ZSAqLwotCXUzMiBzYnRtc3RhdGVoaWdoOwkvKiB0YXJnZXQgc3RhdGUgKi8KLQl1MzIgc2Jid2EwOwkJLyogYmFuZHdpZHRoIGFsbG9jYXRpb24gdGFibGUwICovCi0JdTMyIFBBRDsKLQl1MzIgc2JpbWNvbmZpZ2xvdzsJLyogaW5pdGlhdG9yIGNvbmZpZ3VyYXRpb24gKi8KLQl1MzIgc2JpbWNvbmZpZ2hpZ2g7CS8qIGluaXRpYXRvciBjb25maWd1cmF0aW9uICovCi0JdTMyIHNiYWRtYXRjaDA7CS8qIGFkZHJlc3MgbWF0Y2gwICovCi0JdTMyIFBBRDsKLQl1MzIgc2J0bWNvbmZpZ2xvdzsJLyogdGFyZ2V0IGNvbmZpZ3VyYXRpb24gKi8KLQl1MzIgc2J0bWNvbmZpZ2hpZ2g7CS8qIHRhcmdldCBjb25maWd1cmF0aW9uICovCi0JdTMyIHNiYmNvbmZpZzsJLyogYnJvYWRjYXN0IGNvbmZpZ3VyYXRpb24gKi8KLQl1MzIgUEFEOwotCXUzMiBzYmJzdGF0ZTsJLyogYnJvYWRjYXN0IHN0YXRlICovCi0JdTMyIFBBRFszXTsKLQl1MzIgc2JhY3RjbmZnOwkvKiBhY3RpdmF0ZSBjb25maWd1cmF0aW9uICovCi0JdTMyIFBBRFszXTsKLQl1MzIgc2JmbGFnc3Q7CS8qIGN1cnJlbnQgc2JmbGFncyAqLwotCXUzMiBQQURbM107Ci0JdTMyIHNiaWRsb3c7CQkvKiBpZGVudGlmaWNhdGlvbiAqLwotCXUzMiBzYmlkaGlnaDsJLyogaWRlbnRpZmljYXRpb24gKi8KLX07Ci0KIC8qIGNsa3N0YXRlICovCiAjZGVmaW5lIENMS19OT05FCTAKICNkZWZpbmUgQ0xLX1NET05MWQkxCkBAIC03MzcsNyArNjA0LDcgQEAKIH0KIAogLyogVG8gY2hlY2sgaWYgdGhlcmUncyB3aW5kb3cgb2ZmZXJlZCAqLwotc3RhdGljIGJvb2wgZGF0YV9vayhzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgYm9vbCBkYXRhX29rKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJcmV0dXJuICh1OCkoYnVzLT50eF9tYXggLSBidXMtPnR4X3NlcSkgIT0gMCAmJgogCSAgICAgICAoKHU4KShidXMtPnR4X21heCAtIGJ1cy0+dHhfc2VxKSAmIDB4ODApID09IDA7CkBAIC03NDgsMTIgKzYxNSwxNCBAQAogICogYWRyZXNzZXMgb24gdGhlIDMyIGJpdCBiYWNrcGxhbmUgYnVzLgogICovCiBzdGF0aWMgdm9pZAotcl9zZHJlZzMyKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTMyICpyZWd2YXIsIHUzMiByZWdfb2Zmc2V0LCB1MzIgKnJldHJ5dmFyKQorcl9zZHJlZzMyKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHUzMiAqcmVndmFyLCB1MzIgcmVnX29mZnNldCwgdTMyICpyZXRyeXZhcikKIHsKKwl1OCBpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGJ1cy0+Y2ksIEJDTUFfQ09SRV9TRElPX0RFVik7CiAJKnJldHJ5dmFyID0gMDsKIAlkbyB7CiAJCSpyZWd2YXIgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoYnVzLT5zZGlvZGV2LAotCQkJCWJ1cy0+Y2ktPmJ1c2NvcmViYXNlICsgcmVnX29mZnNldCwgc2l6ZW9mKHUzMikpOworCQkJCWJ1cy0+Y2ktPmNfaW5mW2lkeF0uYmFzZSArIHJlZ19vZmZzZXQsCisJCQkJc2l6ZW9mKHUzMikpOwogCX0gd2hpbGUgKGJyY21mX3NkY2FyZF9yZWdmYWlsKGJ1cy0+c2Rpb2RldikgJiYKIAkJICgrKygqcmV0cnl2YXIpIDw9IHJldHJ5X2xpbWl0KSk7CiAJaWYgKCpyZXRyeXZhcikgewpAQCAtNzY2LDEyICs2MzUsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQKLXdfc2RyZWczMihzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHUzMiByZWd2YWwsIHUzMiByZWdfb2Zmc2V0LCB1MzIgKnJldHJ5dmFyKQord19zZHJlZzMyKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHUzMiByZWd2YWwsIHUzMiByZWdfb2Zmc2V0LCB1MzIgKnJldHJ5dmFyKQogeworCXU4IGlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoYnVzLT5jaSwgQkNNQV9DT1JFX1NESU9fREVWKTsKIAkqcmV0cnl2YXIgPSAwOwogCWRvIHsKIAkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShidXMtPnNkaW9kZXYsCi0JCQkJICAgICAgIGJ1cy0+Y2ktPmJ1c2NvcmViYXNlICsgcmVnX29mZnNldCwKKwkJCQkgICAgICAgYnVzLT5jaS0+Y19pbmZbaWR4XS5iYXNlICsgcmVnX29mZnNldCwKIAkJCQkgICAgICAgc2l6ZW9mKHUzMiksIHJlZ3ZhbCk7CiAJfSB3aGlsZSAoYnJjbWZfc2RjYXJkX3JlZ2ZhaWwoYnVzLT5zZGlvZGV2KSAmJgogCQkgKCsrKCpyZXRyeXZhcikgPD0gcmV0cnlfbGltaXQpKTsKQEAgLTc5MCwxNCArNjYwLDE0IEBACiAvKiBQYWNrZXQgZnJlZSBhcHBsaWNhYmxlIHVuY29uZGl0aW9uYWxseSBmb3Igc2RpbyBhbmQgc2RzcGkuCiAgKiBDb25kaXRpb25hbCBpZiBidWZwb29sIHdhcyBwcmVzZW50IGZvciBnc3BpIGJ1cy4KICAqLwotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3BrdGZyZWUyKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCkKK3N0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9wa3RmcmVlMihzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewogCWlmIChidXMtPnVzZWJ1ZnBvb2wpCiAJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGt0KTsKIH0KIAogLyogVHVybiBiYWNrcGxhbmUgY2xvY2sgb24gb3Igb2ZmICovCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9odGNsayhzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgb24sIGJvb2wgcGVuZG9rKQorc3RhdGljIGludCBicmNtZl9zZGJyY21faHRjbGsoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCBvbiwgYm9vbCBwZW5kb2spCiB7CiAJaW50IGVycjsKIAl1OCBjbGtjdGwsIGNsa3JlcSwgZGV2Y3RsOwpAQCAtODEyLDEwICs2ODIsNiBAQAogCQljbGtyZXEgPQogCQkgICAgYnVzLT5hbHBfb25seSA/IFNCU0RJT19BTFBfQVZBSUxfUkVRIDogU0JTRElPX0hUX0FWQUlMX1JFUTsKIAotCQlpZiAoKGJ1cy0+Y2ktPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKQotCQkgICAgJiYgKGJ1cy0+Y2ktPmNoaXByZXYgPT0gMCkpCi0JCQljbGtyZXEgfD0gU0JTRElPX0ZPUkNFX0FMUDsKLQogCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCiAJCQkJICAgICAgIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCBjbGtyZXEsICZlcnIpOwogCQlpZiAoZXJyKSB7CkBAIC04MjMsMTQgKzY4OSw2IEBACiAJCQlyZXR1cm4gLUVCQURFOwogCQl9CiAKLQkJaWYgKHBlbmRvayAmJiAoKGJ1cy0+Y2ktPmJ1c2NvcmV0eXBlID09IFBDTUNJQV9DT1JFX0lEKQotCQkJICAgICAgICYmIChidXMtPmNpLT5idXNjb3JlcmV2ID09IDkpKSkgewotCQkJdTMyIGR1bW15LCByZXRyaWVzOwotCQkJcl9zZHJlZzMyKGJ1cywgJmR1bW15LAotCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCBjbG9ja2N0bHN0YXR1cyksCi0JCQkJICAmcmV0cmllcyk7Ci0JCX0KLQogCQkvKiBDaGVjayBjdXJyZW50IHN0YXR1cyAqLwogCQljbGtjdGwgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKIAkJCQkJICAgICAgIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCAmZXJyKTsKQEAgLTkzMCw3ICs3ODgsNyBAQAogfQogCiAvKiBDaGFuZ2UgaWRsZS9hY3RpdmUgU0Qgc3RhdGUgKi8KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX3NkY2xrKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCBvbikKK3N0YXRpYyBpbnQgYnJjbWZfc2RicmNtX3NkY2xrKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIGJvb2wgb24pCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC05NDMsNyArODAxLDcgQEAKIH0KIAogLyogVHJhbnNpdGlvbiBTRCBhbmQgYmFja3BsYW5lIGNsb2NrIHJlYWRpbmVzcyAqLwotc3RhdGljIGludCBicmNtZl9zZGJyY21fY2xrY3RsKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdWludCB0YXJnZXQsIGJvb2wgcGVuZG9rKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fY2xrY3RsKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHVpbnQgdGFyZ2V0LCBib29sIHBlbmRvaykKIHsKICNpZmRlZiBCQ01EQkcKIAl1aW50IG9sZHN0YXRlID0gYnVzLT5jbGtzdGF0ZTsKQEAgLTk5OSw3ICs4NTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9idXNzbGVlcChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgc2xlZXApCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9idXNzbGVlcChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCBib29sIHNsZWVwKQogewogCXVpbnQgcmV0cmllcyA9IDA7CiAKQEAgLTEwMzQsMTEgKzg5Miw5IEBACiAJCQlTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRiwgTlVMTCk7CiAKIAkJLyogSXNvbGF0ZSB0aGUgYnVzICovCi0JCWlmIChidXMtPmNpLT5jaGlwICE9IEJDTTQzMjlfQ0hJUF9JRCkgewotCQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAotCQkJCVNCU0RJT19ERVZJQ0VfQ1RMLAotCQkJCVNCU0RJT19ERVZDVExfUEFEU19JU08sIE5VTEwpOwotCQl9CisJCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKKwkJCVNCU0RJT19ERVZJQ0VfQ1RMLAorCQkJU0JTRElPX0RFVkNUTF9QQURTX0lTTywgTlVMTCk7CiAKIAkJLyogQ2hhbmdlIHN0YXRlICovCiAJCWJ1cy0+c2xlZXBpbmcgPSB0cnVlOwpAQCAtMTA0OSwxMyArOTA1LDYgQEAKIAkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAogCQkJU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsIDAsIE5VTEwpOwogCi0JCS8qIEZvcmNlIHBhZCBpc29sYXRpb24gb2ZmIGlmIHBvc3NpYmxlCi0JCQkgKGluIGNhc2UgcG93ZXIgbmV2ZXIgdG9nZ2xlZCkgKi8KLQkJaWYgKChidXMtPmNpLT5idXNjb3JldHlwZSA9PSBQQ01DSUFfQ09SRV9JRCkKLQkJICAgICYmIChidXMtPmNpLT5idXNjb3JlcmV2ID49IDEwKSkKLQkJCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKLQkJCQlTQlNESU9fREVWSUNFX0NUTCwgMCwgTlVMTCk7Ci0KIAkJLyogTWFrZSBzdXJlIHRoZSBjb250cm9sbGVyIGhhcyB0aGUgYnVzIHVwICovCiAJCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfQVZBSUwsIGZhbHNlKTsKIApAQCAtMTA4MCwxMyArOTI5LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJ1c193YWtlKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3N0YXRpYyB2b2lkIGJ1c193YWtlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJaWYgKGJ1cy0+c2xlZXBpbmcpCiAJCWJyY21mX3NkYnJjbV9idXNzbGVlcChidXMsIGZhbHNlKTsKIH0KIAotc3RhdGljIHUzMiBicmNtZl9zZGJyY21faG9zdG1haWwoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIHUzMiBicmNtZl9zZGJyY21faG9zdG1haWwoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAl1MzIgaW50c3RhdHVzID0gMDsKIAl1MzIgaG1iX2RhdGE7CkBAIC0xMTYyLDcgKzEwMTEsNyBAQAogCXJldHVybiBpbnRzdGF0dXM7CiB9CiAKLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yeGZhaWwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBib29sIGFib3J0LCBib29sIHJ0eCkKK3N0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yeGZhaWwoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCBhYm9ydCwgYm9vbCBydHgpCiB7CiAJdWludCByZXRyaWVzID0gMDsKIAl1MTYgbGFzdHJiYzsKQEAgLTEyMTksMTYgKzEwNjgsNjEgQEAKIAogCS8qIElmIHdlIGNhbid0IHJlYWNoIHRoZSBkZXZpY2UsIHNpZ25hbCBmYWlsdXJlICovCiAJaWYgKGVyciB8fCBicmNtZl9zZGNhcmRfcmVnZmFpbChidXMtPnNkaW9kZXYpKQotCQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047CisJCWJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogfQogCi1zdGF0aWMgdTggYnJjbWZfc2RicmNtX3J4Z2xvbShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHU4IHJ4c2VxKQorLyogY29weSBhIGJ1ZmZlciBpbnRvIGEgcGt0IGJ1ZmZlciBjaGFpbiAqLworc3RhdGljIHVpbnQgYnJjbWZfc2RicmNtX2dsb21fZnJvbV9idWYoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCBsZW4pCit7CisJdWludCBuLCByZXQgPSAwOworCXN0cnVjdCBza19idWZmICpwOworCXU4ICpidWY7CisKKwlidWYgPSBidXMtPmRhdGFwdHI7CisKKwkvKiBjb3B5IHRoZSBkYXRhICovCisJc2tiX3F1ZXVlX3dhbGsoJmJ1cy0+Z2xvbSwgcCkgeworCQluID0gbWluX3QodWludCwgcC0+bGVuLCBsZW4pOworCQltZW1jcHkocC0+ZGF0YSwgYnVmLCBuKTsKKwkJYnVmICs9IG47CisJCWxlbiAtPSBuOworCQlyZXQgKz0gbjsKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiByZXR1cm4gdG90YWwgbGVuZ3RoIG9mIGJ1ZmZlciBjaGFpbiAqLworc3RhdGljIHVpbnQgYnJjbWZfc2RicmNtX2dsb21fbGVuKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisJdWludCB0b3RhbDsKKworCXRvdGFsID0gMDsKKwlza2JfcXVldWVfd2FsaygmYnVzLT5nbG9tLCBwKQorCQl0b3RhbCArPSBwLT5sZW47CisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fZnJlZV9nbG9tKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKmN1ciwgKm5leHQ7CisKKwlza2JfcXVldWVfd2Fsa19zYWZlKCZidXMtPmdsb20sIGN1ciwgbmV4dCkgeworCQlza2JfdW5saW5rKGN1ciwgJmJ1cy0+Z2xvbSk7CisJCWJyY211X3BrdF9idWZfZnJlZV9za2IoY3VyKTsKKwl9Cit9CisKK3N0YXRpYyB1OCBicmNtZl9zZGJyY21fcnhnbG9tKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHU4IHJ4c2VxKQogewogCXUxNiBkbGVuLCB0b3RsZW47CiAJdTggKmRwdHIsIG51bSA9IDA7CiAKIAl1MTYgc3VibGVuLCBjaGVjazsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGZpcnN0LCAqcGxhc3QsICpwbmV4dCwgKnNhdmVfcGZpcnN0OworCXN0cnVjdCBza19idWZmICpwZmlyc3QsICpwbmV4dDsKIAogCWludCBlcnJjb2RlOwogCXU4IGNoYW4sIHNlcSwgZG9mZiwgc2Zkb2ZmOwpAQCAtMTI0MCwxMSArMTEzNCwxMiBAQAogCS8qIElmIHBhY2tldHMsIGlzc3VlIHJlYWQocykgYW5kIHNlbmQgdXAgcGFja2V0IGNoYWluICovCiAJLyogUmV0dXJuIHNlcXVlbmNlIG51bWJlcnMgY29uc3VtZWQ/ICovCiAKLQlicmNtZl9kYmcoVFJBQ0UsICJzdGFydDogZ2xvbWQgJXAgZ2xvbSAlcFxuIiwgYnVzLT5nbG9tZCwgYnVzLT5nbG9tKTsKKwlicmNtZl9kYmcoVFJBQ0UsICJzdGFydDogZ2xvbWQgJXAgZ2xvbSAlcFxuIiwKKwkJICBidXMtPmdsb21kLCBza2JfcGVlaygmYnVzLT5nbG9tKSk7CiAKIAkvKiBJZiB0aGVyZSdzIGEgZGVzY3JpcHRvciwgZ2VuZXJhdGUgdGhlIHBhY2tldCBjaGFpbiAqLwogCWlmIChidXMtPmdsb21kKSB7Ci0JCXBmaXJzdCA9IHBsYXN0ID0gcG5leHQgPSBOVUxMOworCQlwZmlyc3QgPSBwbmV4dCA9IE5VTEw7CiAJCWRsZW4gPSAodTE2KSAoYnVzLT5nbG9tZC0+bGVuKTsKIAkJZHB0ciA9IGJ1cy0+Z2xvbWQtPmRhdGE7CiAJCWlmICghZGxlbiB8fCAoZGxlbiAmIDEpKSB7CkBAIC0xMjg3LDEyICsxMTgyLDcgQEAKIAkJCQkJICBudW0sIHN1Ymxlbik7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoIXBmaXJzdCkgewotCQkJCXBmaXJzdCA9IHBsYXN0ID0gcG5leHQ7Ci0JCQl9IGVsc2UgewotCQkJCXBsYXN0LT5uZXh0ID0gcG5leHQ7Ci0JCQkJcGxhc3QgPSBwbmV4dDsKLQkJCX0KKwkJCXNrYl9xdWV1ZV90YWlsKCZidXMtPmdsb20sIHBuZXh0KTsKIAogCQkJLyogQWRoZXJlIHRvIHN0YXJ0IGFsaWdubWVudCByZXF1aXJlbWVudHMgKi8KIAkJCXBrdF9hbGlnbihwbmV4dCwgc3VibGVuLCBCUkNNRl9TREFMSUdOKTsKQEAgLTEzMDgsMTIgKzExOTgsOSBAQAogCQkJCWJyY21mX2RiZyhHTE9NLCAiZ2xvbWRlc2MgbWlzbWF0Y2g6IG5leHRsZW4gJWQgZ2xvbWRlc2MgJWQgcnhzZXEgJWRcbiIsCiAJCQkJCSAgYnVzLT5uZXh0bGVuLCB0b3RsZW4sIHJ4c2VxKTsKIAkJCX0KLQkJCWJ1cy0+Z2xvbSA9IHBmaXJzdDsKIAkJCXBmaXJzdCA9IHBuZXh0ID0gTlVMTDsKIAkJfSBlbHNlIHsKLQkJCWlmIChwZmlyc3QpCi0JCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwZmlyc3QpOwotCQkJYnVzLT5nbG9tID0gTlVMTDsKKwkJCWJyY21mX3NkYnJjbV9mcmVlX2dsb20oYnVzKTsKIAkJCW51bSA9IDA7CiAJCX0KIApAQCAtMTMyNSwzNyArMTIxMiwzMyBAQAogCiAJLyogT2sgLS0gZWl0aGVyIHdlIGp1c3QgZ2VuZXJhdGVkIGEgcGFja2V0IGNoYWluLAogCQkgb3IgaGFkIG9uZSBmcm9tIGJlZm9yZSAqLwotCWlmIChidXMtPmdsb20pIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmYnVzLT5nbG9tKSkgewogCQlpZiAoQlJDTUZfR0xPTV9PTigpKSB7CiAJCQlicmNtZl9kYmcoR0xPTSwgInRyeSBzdXBlcmZyYW1lIHJlYWQsIHBhY2tldCBjaGFpbjpcbiIpOwotCQkJZm9yIChwbmV4dCA9IGJ1cy0+Z2xvbTsgcG5leHQ7IHBuZXh0ID0gcG5leHQtPm5leHQpIHsKKwkJCXNrYl9xdWV1ZV93YWxrKCZidXMtPmdsb20sIHBuZXh0KSB7CiAJCQkJYnJjbWZfZGJnKEdMT00sICIgICAgJXA6ICVwIGxlbiAweCUwNHggKCVkKVxuIiwKIAkJCQkJICBwbmV4dCwgKHU4ICopIChwbmV4dC0+ZGF0YSksCiAJCQkJCSAgcG5leHQtPmxlbiwgcG5leHQtPmxlbik7CiAJCQl9CiAJCX0KIAotCQlwZmlyc3QgPSBidXMtPmdsb207Ci0JCWRsZW4gPSAodTE2KSBicmNtdV9wa3R0b3RsZW4ocGZpcnN0KTsKKwkJcGZpcnN0ID0gc2tiX3BlZWsoJmJ1cy0+Z2xvbSk7CisJCWRsZW4gPSAodTE2KSBicmNtZl9zZGJyY21fZ2xvbV9sZW4oYnVzKTsKIAogCQkvKiBEbyBhbiBTRElPIHJlYWQgZm9yIHRoZSBzdXBlcmZyYW1lLiAgQ29uZmlndXJhYmxlIGlvdmFyIHRvCiAJCSAqIHJlYWQgZGlyZWN0bHkgaW50byB0aGUgY2hhaW5lZCBwYWNrZXQsIG9yIGFsbG9jYXRlIGEgbGFyZ2UKIAkJICogcGFja2V0IGFuZCBhbmQgY29weSBpbnRvIHRoZSBjaGFpbi4KIAkJICovCiAJCWlmICh1c2VjaGFpbikgewotCQkJZXJyY29kZSA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPnNkaW9kZXYsCisJCQllcnJjb2RlID0gYnJjbWZfc2RjYXJkX3JlY3ZfY2hhaW4oYnVzLT5zZGlvZGV2LAogCQkJCQlidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCQlTRElPX0ZVTkNfMiwKLQkJCQkJRjJTWU5DLCAodTggKikgcGZpcnN0LT5kYXRhLCBkbGVuLAotCQkJCQlwZmlyc3QpOworCQkJCQlTRElPX0ZVTkNfMiwgRjJTWU5DLCAmYnVzLT5nbG9tKTsKIAkJfSBlbHNlIGlmIChidXMtPmRhdGFwdHIpIHsKIAkJCWVycmNvZGUgPSBicmNtZl9zZGNhcmRfcmVjdl9idWYoYnVzLT5zZGlvZGV2LAogCQkJCQlidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCQlTRElPX0ZVTkNfMiwKLQkJCQkJRjJTWU5DLCBidXMtPmRhdGFwdHIsIGRsZW4sCi0JCQkJCU5VTEwpOwotCQkJc3VibGVuID0gKHUxNikgYnJjbXVfcGt0ZnJvbWJ1ZihwZmlyc3QsIDAsIGRsZW4sCi0JCQkJCQlidXMtPmRhdGFwdHIpOworCQkJCQlTRElPX0ZVTkNfMiwgRjJTWU5DLAorCQkJCQlidXMtPmRhdGFwdHIsIGRsZW4pOworCQkJc3VibGVuID0gKHUxNikgYnJjbWZfc2RicmNtX2dsb21fZnJvbV9idWYoYnVzLCBkbGVuKTsKIAkJCWlmIChzdWJsZW4gIT0gZGxlbikgewogCQkJCWJyY21mX2RiZyhFUlJPUiwgIkZBSUxFRCBUTyBDT1BZLCBkbGVuICVkIHN1YmxlbiAlZFxuIiwKIAkJCQkJICBkbGVuLCBzdWJsZW4pOwpAQCAtMTM4MCw5ICsxMjYzLDggQEAKIAkJCX0gZWxzZSB7CiAJCQkJYnVzLT5nbG9tZXJyID0gMDsKIAkJCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgdHJ1ZSwgZmFsc2UpOwotCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IoYnVzLT5nbG9tKTsKIAkJCQlidXMtPnJ4Z2xvbWZhaWwrKzsKLQkJCQlidXMtPmdsb20gPSBOVUxMOworCQkJCWJyY21mX3NkYnJjbV9mcmVlX2dsb20oYnVzKTsKIAkJCX0KIAkJCXJldHVybiAwOwogCQl9CkBAIC0xNDU1LDEwICsxMzM3LDE0IEBACiAJCS8qIFJlbW92ZSBzdXBlcmZyYW1lIGhlYWRlciwgcmVtZW1iZXIgb2Zmc2V0ICovCiAJCXNrYl9wdWxsKHBmaXJzdCwgZG9mZik7CiAJCXNmZG9mZiA9IGRvZmY7CisJCW51bSA9IDA7CiAKIAkJLyogVmFsaWRhdGUgYWxsIHRoZSBzdWJmcmFtZSBoZWFkZXJzICovCi0JCWZvciAobnVtID0gMCwgcG5leHQgPSBwZmlyc3Q7IHBuZXh0ICYmICFlcnJjb2RlOwotCQkgICAgIG51bSsrLCBwbmV4dCA9IHBuZXh0LT5uZXh0KSB7CisJCXNrYl9xdWV1ZV93YWxrKCZidXMtPmdsb20sIHBuZXh0KSB7CisJCQkvKiBsZWF2ZSB3aGVuIGludmFsaWQgc3ViZnJhbWUgaXMgZm91bmQgKi8KKwkJCWlmIChlcnJjb2RlKQorCQkJCWJyZWFrOworCiAJCQlkcHRyID0gKHU4ICopIChwbmV4dC0+ZGF0YSk7CiAJCQlkbGVuID0gKHUxNikgKHBuZXh0LT5sZW4pOwogCQkJc3VibGVuID0gZ2V0X3VuYWxpZ25lZF9sZTE2KGRwdHIpOwpAQCAtMTQ5MSw2ICsxMzc3LDggQEAKIAkJCQkJICBudW0sIGRvZmYsIHN1YmxlbiwgU0RQQ01fSERSTEVOKTsKIAkJCQllcnJjb2RlID0gLTE7CiAJCQl9CisJCQkvKiBpbmNyZWFzZSB0aGUgc3ViZnJhbWUgY291bnQgKi8KKwkJCW51bSsrOwogCQl9CiAKIAkJaWYgKGVycmNvZGUpIHsKQEAgLTE1MDMsMjMgKzEzOTEsMTYgQEAKIAkJCX0gZWxzZSB7CiAJCQkJYnVzLT5nbG9tZXJyID0gMDsKIAkJCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgdHJ1ZSwgZmFsc2UpOwotCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IoYnVzLT5nbG9tKTsKIAkJCQlidXMtPnJ4Z2xvbWZhaWwrKzsKLQkJCQlidXMtPmdsb20gPSBOVUxMOworCQkJCWJyY21mX3NkYnJjbV9mcmVlX2dsb20oYnVzKTsKIAkJCX0KIAkJCWJ1cy0+bmV4dGxlbiA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQogCiAJCS8qIEJhc2ljIFNEIGZyYW1pbmcgbG9va3Mgb2sgLSBwcm9jZXNzIGVhY2ggcGFja2V0IChoZWFkZXIpICovCi0JCXNhdmVfcGZpcnN0ID0gcGZpcnN0OwotCQlidXMtPmdsb20gPSBOVUxMOwotCQlwbGFzdCA9IE5VTEw7CiAKLQkJZm9yIChudW0gPSAwOyBwZmlyc3Q7IHJ4c2VxKyssIHBmaXJzdCA9IHBuZXh0KSB7Ci0JCQlwbmV4dCA9IHBmaXJzdC0+bmV4dDsKLQkJCXBmaXJzdC0+bmV4dCA9IE5VTEw7Ci0KKwkJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmYnVzLT5nbG9tLCBwZmlyc3QsIHBuZXh0KSB7CiAJCQlkcHRyID0gKHU4ICopIChwZmlyc3QtPmRhdGEpOwogCQkJc3VibGVuID0gZ2V0X3VuYWxpZ25lZF9sZTE2KGRwdHIpOwogCQkJY2hhbiA9IFNEUENNX1BBQ0tFVF9DSEFOTkVMKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwpAQCAtMTUzOSw2ICsxNDIwLDggQEAKIAkJCQlidXMtPnJ4X2JhZHNlcSsrOwogCQkJCXJ4c2VxID0gc2VxOwogCQkJfQorCQkJcnhzZXErKzsKKwogI2lmZGVmIEJDTURCRwogCQkJaWYgKEJSQ01GX0JZVEVTX09OKCkgJiYgQlJDTUZfREFUQV9PTigpKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlJ4IFN1YmZyYW1lIERhdGE6XG4iKTsKQEAgLTE1NTEsMzYgKzE0MzQsMjIgQEAKIAkJCXNrYl9wdWxsKHBmaXJzdCwgZG9mZik7CiAKIAkJCWlmIChwZmlyc3QtPmxlbiA9PSAwKSB7CisJCQkJc2tiX3VubGluayhwZmlyc3QsICZidXMtPmdsb20pOwogCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGZpcnN0KTsKLQkJCQlpZiAocGxhc3QpCi0JCQkJCXBsYXN0LT5uZXh0ID0gcG5leHQ7Ci0JCQkJZWxzZQotCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwotCiAJCQkJY29udGludWU7CiAJCQl9IGVsc2UgaWYgKGJyY21mX3Byb3RvX2hkcnB1bGwoYnVzLT5kcnZyLCAmaWZpZHgsCiAJCQkJCQkgICAgICAgcGZpcnN0KSAhPSAwKSB7CiAJCQkJYnJjbWZfZGJnKEVSUk9SLCAicnggcHJvdG9jb2wgZXJyb3JcbiIpOwogCQkJCWJ1cy0+ZHJ2ci0+cnhfZXJyb3JzKys7CisJCQkJc2tiX3VubGluayhwZmlyc3QsICZidXMtPmdsb20pOwogCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGZpcnN0KTsKLQkJCQlpZiAocGxhc3QpCi0JCQkJCXBsYXN0LT5uZXh0ID0gcG5leHQ7Ci0JCQkJZWxzZQotCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwotCiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCS8qIHRoaXMgcGFja2V0IHdpbGwgZ28gdXAsIGxpbmsgYmFjayBpbnRvCi0JCQkJIGNoYWluIGFuZCBjb3VudCBpdCAqLwotCQkJcGZpcnN0LT5uZXh0ID0gcG5leHQ7Ci0JCQlwbGFzdCA9IHBmaXJzdDsKLQkJCW51bSsrOwotCiAjaWZkZWYgQkNNREJHCiAJCQlpZiAoQlJDTUZfR0xPTV9PTigpKSB7CiAJCQkJYnJjbWZfZGJnKEdMT00sICJzdWJmcmFtZSAlZCB0byBzdGFjaywgJXAgKCVwLyVkKSBueHQvbG5rICVwLyVwXG4iLAotCQkJCQkgIG51bSwgcGZpcnN0LCBwZmlyc3QtPmRhdGEsCisJCQkJCSAgYnVzLT5nbG9tLnFsZW4sIHBmaXJzdCwgcGZpcnN0LT5kYXRhLAogCQkJCQkgIHBmaXJzdC0+bGVuLCBwZmlyc3QtPm5leHQsCiAJCQkJCSAgcGZpcnN0LT5wcmV2KTsKIAkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULApAQCAtMTU4OSwxOSArMTQ1OCwyMCBAQAogCQkJfQogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCQl9Ci0JCWlmIChudW0pIHsKKwkJLyogc2VudCBhbnkgcmVtYWluaW5nIHBhY2tldHMgdXAgKi8KKwkJaWYgKGJ1cy0+Z2xvbS5xbGVuKSB7CiAJCQl1cCgmYnVzLT5zZHNlbSk7Ci0JCQlicmNtZl9yeF9mcmFtZShidXMtPmRydnIsIGlmaWR4LCBzYXZlX3BmaXJzdCwgbnVtKTsKKwkJCWJyY21mX3J4X2ZyYW1lKGJ1cy0+ZHJ2ciwgaWZpZHgsICZidXMtPmdsb20pOwogCQkJZG93bigmYnVzLT5zZHNlbSk7CiAJCX0KIAogCQlidXMtPnJ4Z2xvbWZyYW1lcysrOwotCQlidXMtPnJ4Z2xvbXBrdHMgKz0gbnVtOworCQlidXMtPnJ4Z2xvbXBrdHMgKz0gYnVzLT5nbG9tLnFsZW47CiAJfQogCXJldHVybiBudW07CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2RjbWRfcmVzcF93YWl0KHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdWludCAqY29uZGl0aW9uLAorc3RhdGljIGludCBicmNtZl9zZGJyY21fZGNtZF9yZXNwX3dhaXQoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCAqY29uZGl0aW9uLAogCQkJCQlib29sICpwZW5kaW5nKQogewogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwpAQCAtMTYyMyw3ICsxNDkzLDcgQEAKIAlyZXR1cm4gdGltZW91dDsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fZGNtZF9yZXNwX3dha2Uoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZGNtZF9yZXNwX3dha2Uoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmYnVzLT5kY21kX3Jlc3Bfd2FpdCkpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYnVzLT5kY21kX3Jlc3Bfd2FpdCk7CkBAIC0xNjMxLDcgKzE1MDEsNyBAQAogCXJldHVybiAwOwogfQogc3RhdGljIHZvaWQKLWJyY21mX3NkYnJjbV9yZWFkX2NvbnRyb2woc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1OCAqaGRyLCB1aW50IGxlbiwgdWludCBkb2ZmKQorYnJjbWZfc2RicmNtX3JlYWRfY29udHJvbChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1OCAqaGRyLCB1aW50IGxlbiwgdWludCBkb2ZmKQogewogCXVpbnQgcmRsZW4sIHBhZDsKIApAQCAtMTY4OSw4ICsxNTU5LDcgQEAKIAlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPnNkaW9kZXYsCiAJCQkJYnVzLT5zZGlvZGV2LT5zYndhZCwKIAkJCQlTRElPX0ZVTkNfMiwKLQkJCQlGMlNZTkMsIChidXMtPnJ4Y3RsICsgQlJDTUZfRklSU1RSRUFEKSwgcmRsZW4sCi0JCQkJTlVMTCk7CisJCQkJRjJTWU5DLCAoYnVzLT5yeGN0bCArIEJSQ01GX0ZJUlNUUkVBRCksIHJkbGVuKTsKIAlidXMtPmYycnhkYXRhKys7CiAKIAkvKiBDb250cm9sIGZyYW1lIGZhaWx1cmVzIG5lZWQgcmV0cmFuc21pc3Npb24gKi8KQEAgLTE3MjEsNyArMTU5MCw3IEBACiB9CiAKIC8qIFBhZCByZWFkIHRvIGJsb2Nrc2l6ZSBmb3IgZWZmaWNpZW5jeSAqLwotc3RhdGljIHZvaWQgYnJjbWZfcGFkKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTE2ICpwYWQsIHUxNiAqcmRsZW4pCitzdGF0aWMgdm9pZCBicmNtZl9wYWQoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdTE2ICpwYWQsIHUxNiAqcmRsZW4pCiB7CiAJaWYgKGJ1cy0+cm91bmR1cCAmJiBidXMtPmJsb2Nrc2l6ZSAmJiAqcmRsZW4gPiBidXMtPmJsb2Nrc2l6ZSkgewogCQkqcGFkID0gYnVzLT5ibG9ja3NpemUgLSAoKnJkbGVuICUgYnVzLT5ibG9ja3NpemUpOwpAQCAtMTczNCw3ICsxNjAzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWJyY21mX2FsbG9jX3BrdF9hbmRfcmVhZChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHUxNiByZGxlbiwKK2JyY21mX2FsbG9jX3BrdF9hbmRfcmVhZChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1MTYgcmRsZW4sCiAJCQkgc3RydWN0IHNrX2J1ZmYgKipwa3QsIHU4ICoqcnhidWYpCiB7CiAJaW50IHNkcmV0OwkJLyogUmV0dXJuIGNvZGUgZnJvbSBjYWxscyAqLwpAQCAtMTc0Niw5ICsxNjE1LDggQEAKIAlwa3RfYWxpZ24oKnBrdCwgcmRsZW4sIEJSQ01GX1NEQUxJR04pOwogCSpyeGJ1ZiA9ICh1OCAqKSAoKCpwa3QpLT5kYXRhKTsKIAkvKiBSZWFkIHRoZSBlbnRpcmUgZnJhbWUgKi8KLQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCi0JCQkJICAgICAgU0RJT19GVU5DXzIsIEYyU1lOQywKLQkJCQkgICAgICAqcnhidWYsIHJkbGVuLCAqcGt0KTsKKwlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X3BrdChidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCisJCQkJICAgICAgU0RJT19GVU5DXzIsIEYyU1lOQywgKnBrdCk7CiAJYnVzLT5mMnJ4ZGF0YSsrOwogCiAJaWYgKHNkcmV0IDwgMCkgewpAQCAtMTc2Nyw3ICsxNjM1LDcgQEAKIAogLyogQ2hlY2tzIHRoZSBoZWFkZXIgKi8KIHN0YXRpYyBpbnQKLWJyY21mX2NoZWNrX3J4YnVmKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwgdTggKnJ4YnVmLAorYnJjbWZfY2hlY2tfcnhidWYoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwgdTggKnJ4YnVmLAogCQkgIHU4IHJ4c2VxLCB1MTYgbmV4dGxlbiwgdTE2ICpsZW4pCiB7CiAJdTE2IGNoZWNrOwpAQCAtMTgyMyw3ICsxNjkxLDcgQEAKIAogLyogUmV0dXJuIHRydWUgaWYgdGhlcmUgbWF5IGJlIG1vcmUgZnJhbWVzIHRvIHJlYWQgKi8KIHN0YXRpYyB1aW50Ci1icmNtZl9zZGJyY21fcmVhZGZyYW1lcyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgbWF4ZnJhbWVzLCBib29sICpmaW5pc2hlZCkKK2JyY21mX3NkYnJjbV9yZWFkZnJhbWVzKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHVpbnQgbWF4ZnJhbWVzLCBib29sICpmaW5pc2hlZCkKIHsKIAl1MTYgbGVuLCBjaGVjazsJLyogRXh0cmFjdGVkIGhhcmR3YXJlIGhlYWRlciBmaWVsZHMgKi8KIAl1OCBjaGFuLCBzZXEsIGRvZmY7CS8qIEV4dHJhY3RlZCBzb2Z0d2FyZSBoZWFkZXIgZmllbGRzICovCkBAIC0xODQ2LDE0ICsxNzE0LDE1IEBACiAJKmZpbmlzaGVkID0gZmFsc2U7CiAKIAlmb3IgKHJ4c2VxID0gYnVzLT5yeF9zZXEsIHJ4bGVmdCA9IG1heGZyYW1lczsKLQkgICAgICFidXMtPnJ4c2tpcCAmJiByeGxlZnQgJiYgYnVzLT5kcnZyLT5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTjsKKwkgICAgICFidXMtPnJ4c2tpcCAmJiByeGxlZnQgJiYKKwkgICAgIGJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTjsKIAkgICAgIHJ4c2VxKyssIHJ4bGVmdC0tKSB7CiAKIAkJLyogSGFuZGxlIGdsb21taW5nIHNlcGFyYXRlbHkgKi8KLQkJaWYgKGJ1cy0+Z2xvbSB8fCBidXMtPmdsb21kKSB7CisJCWlmIChidXMtPmdsb21kIHx8ICFza2JfcXVldWVfZW1wdHkoJmJ1cy0+Z2xvbSkpIHsKIAkJCXU4IGNudDsKIAkJCWJyY21mX2RiZyhHTE9NLCAiY2FsbGluZyByeGdsb206IGdsb21kICVwLCBnbG9tICVwXG4iLAotCQkJCSAgYnVzLT5nbG9tZCwgYnVzLT5nbG9tKTsKKwkJCQkgIGJ1cy0+Z2xvbWQsIHNrYl9wZWVrKCZidXMtPmdsb20pKTsKIAkJCWNudCA9IGJyY21mX3NkYnJjbV9yeGdsb20oYnVzLCByeHNlcSk7CiAJCQlicmNtZl9kYmcoR0xPTSwgInJ4Z2xvbSByZXR1cm5lZCAlZFxuIiwgY250KTsKIAkJCXJ4c2VxICs9IGNudCAtIDE7CkBAIC0xOTc2LDcgKzE4NDUsNyBAQAogCQkvKiBSZWFkIGZyYW1lIGhlYWRlciAoaGFyZHdhcmUgYW5kIHNvZnR3YXJlKSAqLwogCQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCiAJCQkJCSAgICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsIGJ1cy0+cnhoZHIsCi0JCQkJCSAgICAgIEJSQ01GX0ZJUlNUUkVBRCwgTlVMTCk7CisJCQkJCSAgICAgIEJSQ01GX0ZJUlNUUkVBRCk7CiAJCWJ1cy0+ZjJyeGhkcnMrKzsKIAogCQlpZiAoc2RyZXQgPCAwKSB7CkBAIC0yMTI1LDkgKzE5OTQsOCBAQAogCQlwa3RfYWxpZ24ocGt0LCByZGxlbiwgQlJDTUZfU0RBTElHTik7CiAKIAkJLyogUmVhZCB0aGUgcmVtYWluaW5nIGZyYW1lIGRhdGEgKi8KLQkJc2RyZXQgPSBicmNtZl9zZGNhcmRfcmVjdl9idWYoYnVzLT5zZGlvZGV2LCBidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCVNESU9fRlVOQ18yLCBGMlNZTkMsICgodTggKikgKHBrdC0+ZGF0YSkpLAotCQkJCXJkbGVuLCBwa3QpOworCQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X3BrdChidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCisJCQkJCSAgICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsIHBrdCk7CiAJCWJ1cy0+ZjJyeGRhdGErKzsKIAogCQlpZiAoc2RyZXQgPCAwKSB7CkBAIC0yMTk0LDcgKzIwNjIsNyBAQAogCiAJCS8qIFVubG9jayBkdXJpbmcgcnggY2FsbCAqLwogCQl1cCgmYnVzLT5zZHNlbSk7Ci0JCWJyY21mX3J4X2ZyYW1lKGJ1cy0+ZHJ2ciwgaWZpZHgsIHBrdCwgMSk7CisJCWJyY21mX3J4X3BhY2tldChidXMtPmRydnIsIGlmaWR4LCBwa3QpOwogCQlkb3duKCZidXMtPnNkc2VtKTsKIAl9CiAJcnhjb3VudCA9IG1heGZyYW1lcyAtIHJ4bGVmdDsKQEAgLTIyMTQsMTYgKzIwODIsOCBAQAogCXJldHVybiByeGNvdW50OwogfQogCi1zdGF0aWMgaW50Ci1icmNtZl9zZGJyY21fc2VuZF9idWYoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1MzIgYWRkciwgdWludCBmbiwgdWludCBmbGFncywKLQkJICAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQotewotCXJldHVybiBicmNtZl9zZGNhcmRfc2VuZF9idWYKLQkJKGJ1cy0+c2Rpb2RldiwgYWRkciwgZm4sIGZsYWdzLCBidWYsIG5ieXRlcywgcGt0KTsKLX0KLQogc3RhdGljIHZvaWQKLWJyY21mX3NkYnJjbV93YWl0X2Zvcl9ldmVudChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgKmxvY2t2YXIpCiticmNtZl9zZGJyY21fd2FpdF9mb3JfZXZlbnQoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCAqbG9ja3ZhcikKIHsKIAl1cCgmYnVzLT5zZHNlbSk7CiAJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYnVzLT5jdHJsX3dhaXQsCkBAIC0yMjMzLDcgKzIwOTMsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX3dhaXRfZXZlbnRfd2FrZXVwKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK2JyY21mX3NkYnJjbV93YWl0X2V2ZW50X3dha2V1cChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZidXMtPmN0cmxfd2FpdCkpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYnVzLT5jdHJsX3dhaXQpOwpAQCAtMjI0Miw3ICsyMTAyLDcgQEAKIAogLyogV3JpdGVzIGEgSFcvU1cgaGVhZGVyIGludG8gdGhlIHBhY2tldCBhbmQgc2VuZHMgaXQuICovCiAvKiBBc3N1bWVzOiAoYSkgaGVhZGVyIHNwYWNlIGFscmVhZHkgdGhlcmUsIChiKSBjYWxsZXIgaG9sZHMgbG9jayAqLwotc3RhdGljIGludCBicmNtZl9zZGJyY21fdHhwa3Qoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAorc3RhdGljIGludCBicmNtZl9zZGJyY21fdHhwa3Qoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwKIAkJCSAgICAgIHVpbnQgY2hhbiwgYm9vbCBmcmVlX3BrdCkKIHsKIAlpbnQgcmV0OwpAQCAtMjMzMSw5ICsyMTkxLDggQEAKIAlpZiAobGVuICYgKEFMSUdOTUVOVCAtIDEpKQogCQkJbGVuID0gcm91bmR1cChsZW4sIEFMSUdOTUVOVCk7CiAKLQlyZXQgPSBicmNtZl9zZGJyY21fc2VuZF9idWYoYnVzLCBidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCSAgICBTRElPX0ZVTkNfMiwgRjJTWU5DLCBmcmFtZSwKLQkJCQkgICAgbGVuLCBwa3QpOworCXJldCA9IGJyY21mX3NkY2FyZF9zZW5kX3BrdChidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCisJCQkJICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsIHBrdCk7CiAJYnVzLT5mMnR4ZGF0YSsrOwogCiAJaWYgKHJldCA8IDApIHsKQEAgLTIzODAsNyArMjIzOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHVpbnQgYnJjbWZfc2RicmNtX3NlbmRmcm9tcShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgbWF4ZnJhbWVzKQorc3RhdGljIHVpbnQgYnJjbWZfc2RicmNtX3NlbmRmcm9tcShzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1aW50IG1heGZyYW1lcykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwogCXUzMiBpbnRzdGF0dXMgPSAwOwpAQCAtMjQyOCwxNCArMjI4NywxNCBAQAogCX0KIAogCS8qIERlZmxvdy1jb250cm9sIHN0YWNrIGlmIG5lZWRlZCAqLwotCWlmIChkcnZyLT51cCAmJiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RBVEEpICYmCisJaWYgKGRydnItPnVwICYmIChkcnZyLT5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19EQVRBKSAmJgogCSAgICBkcnZyLT50eG9mZiAmJiAocGt0cV9sZW4oJmJ1cy0+dHhxKSA8IFRYTE9XKSkKIAkJYnJjbWZfdHhmbG93Y29udHJvbChkcnZyLCAwLCBPRkYpOwogCiAJcmV0dXJuIGNudDsKIH0KIAotc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX2RwYyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fZHBjKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJdTMyIGludHN0YXR1cywgbmV3c3RhdHVzID0gMDsKIAl1aW50IHJldHJpZXMgPSAwOwpAQCAtMjQ2Myw3ICsyMzIyLDcgQEAKIAkJCQkJICAgICAgIFNCU0RJT19ERVZJQ0VfQ1RMLCAmZXJyKTsKIAkJaWYgKGVycikgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiZXJyb3IgcmVhZGluZyBERVZDVEw6ICVkXG4iLCBlcnIpOwotCQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19ET1dOOworCQkJYnVzLT5kcnZyLT5idXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RPV047CiAJCX0KICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIApAQCAtMjQ3Myw3ICsyMzMyLDcgQEAKIAkJaWYgKGVycikgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiZXJyb3IgcmVhZGluZyBDU1I6ICVkXG4iLAogCQkJCSAgZXJyKTsKLQkJCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKKwkJCWJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogCQl9CiAKIAkJYnJjbWZfZGJnKElORk8sICJEUEM6IFBFTkRJTkcsIGRldmN0bCAweCUwMnggY2xrY3RsIDB4JTAyeFxuIiwKQEAgLTI0ODYsNyArMjM0NSw3IEBACiAJCQlpZiAoZXJyKSB7CiAJCQkJYnJjbWZfZGJnKEVSUk9SLCAiZXJyb3IgcmVhZGluZyBERVZDVEw6ICVkXG4iLAogCQkJCQkgIGVycik7Ci0JCQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19ET1dOOworCQkJCWJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogCQkJfQogCQkJZGV2Y3RsICY9IH5TQlNESU9fREVWQ1RMX0NBX0lOVF9PTkxZOwogCQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLApAQCAtMjQ5NCw3ICsyMzUzLDcgQEAKIAkJCWlmIChlcnIpIHsKIAkJCQlicmNtZl9kYmcoRVJST1IsICJlcnJvciB3cml0aW5nIERFVkNUTDogJWRcbiIsCiAJCQkJCSAgZXJyKTsKLQkJCQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047CisJCQkJYnVzLT5kcnZyLT5idXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RPV047CiAJCQl9CiAJCQlidXMtPmNsa3N0YXRlID0gQ0xLX0FWQUlMOwogCQl9IGVsc2UgewpAQCAtMjU5Niw5ICsyNDU1LDkgQEAKIAkJKGJ1cy0+Y2xrc3RhdGUgPT0gQ0xLX0FWQUlMKSkgewogCQlpbnQgcmV0LCBpOwogCi0JCXJldCA9IGJyY21mX3NkYnJjbV9zZW5kX2J1ZihidXMsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCisJCXJldCA9IGJyY21mX3NkY2FyZF9zZW5kX2J1ZihidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCiAJCQlTRElPX0ZVTkNfMiwgRjJTWU5DLCAodTggKikgYnVzLT5jdHJsX2ZyYW1lX2J1ZiwKLQkJCSh1MzIpIGJ1cy0+Y3RybF9mcmFtZV9sZW4sIE5VTEwpOworCQkJKHUzMikgYnVzLT5jdHJsX2ZyYW1lX2xlbik7CiAKIAkJaWYgKHJldCA8IDApIHsKIAkJCS8qIE9uIGZhaWx1cmUsIGFib3J0IHRoZSBjb21tYW5kIGFuZApAQCAtMjY1MCwxMSArMjUwOSwxMSBAQAogCQkgZWxzZSBhd2FpdCBuZXh0IGludGVycnVwdCAqLwogCS8qIE9uIGZhaWxlZCByZWdpc3RlciBhY2Nlc3MsIGFsbCBiZXRzIGFyZSBvZmY6CiAJCSBubyByZXNjaGVkIG9yIGludGVycnVwdHMgKi8KLQlpZiAoKGJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHx8CisJaWYgKChidXMtPmRydnItPmJ1c19pZi0+c3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHx8CiAJICAgIGJyY21mX3NkY2FyZF9yZWdmYWlsKGJ1cy0+c2Rpb2RldikpIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiZmFpbGVkIGJhY2twbGFuZSBhY2Nlc3Mgb3ZlciBTRElPLCBoYWx0aW5nIG9wZXJhdGlvbiAlZFxuIiwKIAkJCSAgYnJjbWZfc2RjYXJkX3JlZ2ZhaWwoYnVzLT5zZGlvZGV2KSk7Ci0JCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKKwkJYnVzLT5kcnZyLT5idXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RPV047CiAJCWJ1cy0+aW50c3RhdHVzID0gMDsKIAl9IGVsc2UgaWYgKGJ1cy0+Y2xrc3RhdGUgPT0gQ0xLX1BFTkRJTkcpIHsKIAkJYnJjbWZfZGJnKElORk8sICJyZXNjaGVkdWxlZCBkdWUgdG8gQ0xLX1BFTkRJTkcgYXdhaXRpbmcgSV9DSElQQUNUSVZFIGludGVycnVwdFxuIik7CkBAIC0yNjgxLDcgKzI1NDAsNyBAQAogCiBzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kcGNfdGhyZWFkKHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzID0gKHN0cnVjdCBicmNtZl9idXMgKikgZGF0YTsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gKHN0cnVjdCBicmNtZl9zZGlvICopIGRhdGE7CiAKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CiAJLyogUnVuIHVudGlsIHNpZ25hbCByZWNlaXZlZCAqLwpAQCAtMjY5MSwxMiArMjU1MCwxMiBAQAogCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmYnVzLT5kcGNfd2FpdCkpIHsKIAkJCS8qIENhbGwgYnVzIGRwYyB1bmxlc3MgaXQgaW5kaWNhdGVkIGRvd24KIAkJCSh0aGVuIGNsZWFuIHN0b3ApICovCi0JCQlpZiAoYnVzLT5kcnZyLT5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTikgeworCQkJaWYgKGJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTikgewogCQkJCWlmIChicmNtZl9zZGJyY21fZHBjKGJ1cykpCiAJCQkJCWNvbXBsZXRlKCZidXMtPmRwY193YWl0KTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogYWZ0ZXIgc3RvcHBpbmcgdGhlIGJ1cywgZXhpdCB0aHJlYWQgKi8KLQkJCQlicmNtZl9zZGJyY21fYnVzX3N0b3AoYnVzKTsKKwkJCQlicmNtZl9zZGJyY21fYnVzX3N0b3AoYnVzLT5zZGlvZGV2LT5kZXYpOwogCQkJCWJ1cy0+ZHBjX3RzayA9IE5VTEw7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0yNzA2LDEwICsyNTY1LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBicmNtZl9zZGJyY21fYnVzX3R4ZGF0YShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHN0cnVjdCBza19idWZmICpwa3QpCitpbnQgYnJjbWZfc2RicmNtX2J1c190eGRhdGEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewogCWludCByZXQgPSAtRUJBREU7CiAJdWludCBkYXRhbGVuLCBwcmVjOworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiA9IGJ1c19pZi0+YnVzX3ByaXY7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IHNkaW9kZXYtPmJ1czsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMjc1Nyw3ICsyNjE5LDcgQEAKIH0KIAogc3RhdGljIGludAotYnJjbWZfc2RicmNtX21lbWJ5dGVzKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCB3cml0ZSwgdTMyIGFkZHJlc3MsIHU4ICpkYXRhLAorYnJjbWZfc2RicmNtX21lbWJ5dGVzKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIGJvb2wgd3JpdGUsIHUzMiBhZGRyZXNzLCB1OCAqZGF0YSwKIAkJIHVpbnQgc2l6ZSkKIHsKIAlpbnQgYmNtZXJyb3IgPSAwOwpAQCAtMjgxOCw3ICsyNjgwLDcgQEAKICNpZmRlZiBCQ01EQkcKICNkZWZpbmUgQ09OU09MRV9MSU5FX01BWAkxOTIKIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fcmVhZGNvbnNvbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fcmVhZGNvbnNvbGUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlzdHJ1Y3QgYnJjbWZfY29uc29sZSAqYyA9ICZidXMtPmNvbnNvbGU7CiAJdTggbGluZVtDT05TT0xFX0xJTkVfTUFYXSwgY2g7CkBAIC0yODk1LDE0ICsyNzU3LDE0IEBACiB9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKLXN0YXRpYyBpbnQgYnJjbWZfdHhfZnJhbWUoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1OCAqZnJhbWUsIHUxNiBsZW4pCitzdGF0aWMgaW50IGJyY21mX3R4X2ZyYW1lKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHU4ICpmcmFtZSwgdTE2IGxlbikKIHsKIAlpbnQgaTsKIAlpbnQgcmV0OwogCiAJYnVzLT5jdHJsX2ZyYW1lX3N0YXQgPSBmYWxzZTsKLQlyZXQgPSBicmNtZl9zZGJyY21fc2VuZF9idWYoYnVzLCBidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCSAgICBTRElPX0ZVTkNfMiwgRjJTWU5DLCBmcmFtZSwgbGVuLCBOVUxMKTsKKwlyZXQgPSBicmNtZl9zZGNhcmRfc2VuZF9idWYoYnVzLT5zZGlvZGV2LCBidXMtPnNkaW9kZXYtPnNid2FkLAorCQkJCSAgICBTRElPX0ZVTkNfMiwgRjJTWU5DLCBmcmFtZSwgbGVuKTsKIAogCWlmIChyZXQgPCAwKSB7CiAJCS8qIE9uIGZhaWx1cmUsIGFib3J0IHRoZSBjb21tYW5kIGFuZCB0ZXJtaW5hdGUgdGhlIGZyYW1lICovCkBAIC0yOTM4LDcgKzI4MDAsNyBAQAogfQogCiBpbnQKLWJyY21mX3NkYnJjbV9idXNfdHhjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKQorYnJjbWZfc2RicmNtX2J1c190eGN0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pCiB7CiAJdTggKmZyYW1lOwogCXUxNiBsZW47CkBAIC0yOTQ2LDYgKzI4MDgsOSBAQAogCXVpbnQgcmV0cmllcyA9IDA7CiAJdTggZG9mZiA9IDA7CiAJaW50IHJldCA9IC0xOworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiA9IGJ1c19pZi0+YnVzX3ByaXY7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IHNkaW9kZXYtPmJ1czsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMzA1MywxMSArMjkxOCwxNCBAQAogfQogCiBpbnQKLWJyY21mX3NkYnJjbV9idXNfcnhjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKQorYnJjbWZfc2RicmNtX2J1c19yeGN0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pCiB7CiAJaW50IHRpbWVsZWZ0OwogCXVpbnQgcnhsZW4gPSAwOwogCWJvb2wgcGVuZGluZzsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2OworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSBzZGlvZGV2LT5idXM7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTMwOTAsNyArMjk1OCw3IEBACiAJcmV0dXJuIHJ4bGVuID8gKGludClyeGxlbiA6IC1FVElNRURPVVQ7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2Rvd25sb2FkdmFycyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHZvaWQgKmFyZywgaW50IGxlbikKK3N0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2Rvd25sb2FkdmFycyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB2b2lkICphcmcsIGludCBsZW4pCiB7CiAJaW50IGJjbWVycm9yID0gMDsKIApAQCAtMzEyMyw3ICsyOTkxLDcgQEAKIAlyZXR1cm4gYmNtZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX3dyaXRlX3ZhcnMoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fd3JpdGVfdmFycyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWludCBiY21lcnJvciA9IDA7CiAJdTMyIHZhcnNpemU7CkBAIC0zMjEwLDEzNSArMzA3OCwxMSBAQAogCXJldHVybiBiY21lcnJvcjsKIH0KIAotc3RhdGljIHZvaWQKLWJyY21mX3NkYnJjbV9jaGlwX2Rpc2FibGVjb3JlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGNvcmViYXNlKQotewotCXUzMiByZWdkYXRhOwotCi0JcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKLQlpZiAocmVnZGF0YSAmIFNCVE1MX1JFU0VUKQotCQlyZXR1cm47Ci0KLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCWlmICgocmVnZGF0YSAmIChTSUNGX0NMT0NLX0VOIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpKSAhPSAwKSB7Ci0JCS8qCi0JCSAqIHNldCB0YXJnZXQgcmVqZWN0IGFuZCBzcGluIHVudGlsIGJ1c3kgaXMgY2xlYXIKLQkJICogKHByZXNlcnZlIGNvcmUtc3BlY2lmaWMgYml0cykKLQkJICovCi0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsIENPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksCi0JCQkJICAgICAgIDQsIHJlZ2RhdGEgfCBTQlRNTF9SRUopOwotCi0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCQl1ZGVsYXkoMSk7Ci0JCVNQSU5XQUlUKChicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWhpZ2gpLCA0KSAmCi0JCQlTQlRNSF9CVVNZKSwgMTAwMDAwKTsKLQotCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCk7Ci0JCWlmIChyZWdkYXRhICYgU0JUTUhfQlVTWSkKLQkJCWJyY21mX2RiZyhFUlJPUiwgIkFSTSBjb3JlIHN0aWxsIGJ1c3lcbiIpOwotCi0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaWRsb3cpLCA0KTsKLQkJaWYgKHJlZ2RhdGEgJiBTQklETF9JTklUKSB7Ci0JCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCkgfAotCQkJCVNCSU1fUko7Ci0JCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCi0JCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCwKLQkJCQlyZWdkYXRhKTsKLQkJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0KTsKLQkJCXVkZWxheSgxKTsKLQkJCVNQSU5XQUlUKChicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0KSAmCi0JCQkJU0JJTV9CWSksIDEwMDAwMCk7Ci0JCX0KLQotCQkvKiBzZXQgcmVzZXQgYW5kIHJlamVjdCB3aGlsZSBlbmFibGluZyB0aGUgY2xvY2tzICovCi0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCi0JCQkoKChTSUNGX0ZHQyB8IFNJQ0ZfQ0xPQ0tfRU4pIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpIHwKLQkJCVNCVE1MX1JFSiB8IFNCVE1MX1JFU0VUKSk7Ci0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCQl1ZGVsYXkoMTApOwotCi0JCS8qIGNsZWFyIHRoZSBpbml0aWF0b3IgcmVqZWN0IGJpdCAqLwotCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYmlkbG93KSwgNCk7Ci0JCWlmIChyZWdkYXRhICYgU0JJRExfSU5JVCkgewotCQkJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaW1zdGF0ZSksIDQpICYKLQkJCQl+U0JJTV9SSjsKLQkJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0LAotCQkJCXJlZ2RhdGEpOwotCQl9Ci0JfQotCi0JLyogbGVhdmUgcmVzZXQgYW5kIHJlamVjdCBhc3NlcnRlZCAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJKFNCVE1MX1JFSiB8IFNCVE1MX1JFU0VUKSk7Ci0JdWRlbGF5KDEpOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX2NoaXBfcmVzZXRjb3JlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGNvcmViYXNlKQotewotCXUzMiByZWdkYXRhOwotCi0JLyoKLQkgKiBNdXN0IGRvIHRoZSBkaXNhYmxlIHNlcXVlbmNlIGZpcnN0IHRvIHdvcmsgZm9yCi0JICogYXJiaXRyYXJ5IGN1cnJlbnQgY29yZSBzdGF0ZS4KLQkgKi8KLQlicmNtZl9zZGJyY21fY2hpcF9kaXNhYmxlY29yZShzZGlvZGV2LCBjb3JlYmFzZSk7Ci0KLQkvKgotCSAqIE5vdyBkbyB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuCi0JICogc2V0IHJlc2V0IHdoaWxlIGVuYWJsaW5nIHRoZSBjbG9jayBhbmQKLQkgKiBmb3JjaW5nIHRoZW0gb24gdGhyb3VnaG91dCB0aGUgY29yZQotCSAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJKChTSUNGX0ZHQyB8IFNJQ0ZfQ0xPQ0tfRU4pIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpIHwKLQkJU0JUTUxfUkVTRVQpOwotCXVkZWxheSgxKTsKLQotCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQkJQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlaGlnaCksIDQpOwotCWlmIChyZWdkYXRhICYgU0JUTUhfU0VSUikKLQkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAotCQkJCSAgICAgICBDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCwgMCk7Ci0KLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaW1zdGF0ZSksIDQpOwotCWlmIChyZWdkYXRhICYgKFNCSU1fSUJFIHwgU0JJTV9UTykpCi0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCwKLQkJCXJlZ2RhdGEgJiB+KFNCSU1fSUJFIHwgU0JJTV9UTykpOwotCi0JLyogY2xlYXIgcmVzZXQgYW5kIGFsbG93IGl0IHRvIHByb3BhZ2F0ZSB0aHJvdWdob3V0IHRoZSBjb3JlICovCi0JYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LCBDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0LAotCQkoU0lDRl9GR0MgPDwgU0JUTUxfU0lDRl9TSElGVCkgfAotCQkoU0lDRl9DTE9DS19FTiA8PCBTQlRNTF9TSUNGX1NISUZUKSk7Ci0JdWRlbGF5KDEpOwotCi0JLyogbGVhdmUgY2xvY2sgZW5hYmxlZCAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJKFNJQ0ZfQ0xPQ0tfRU4gPDwgU0JUTUxfU0lDRl9TSElGVCkpOwotCXVkZWxheSgxKTsKLX0KLQotc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfc3RhdGUoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBib29sIGVudGVyKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfc3RhdGUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCBlbnRlcikKIHsKIAl1aW50IHJldHJpZXM7Ci0JdTMyIHJlZ2RhdGE7CiAJaW50IGJjbWVycm9yID0gMDsKKwlzdHJ1Y3QgY2hpcF9pbmZvICpjaSA9IGJ1cy0+Y2k7CiAKIAkvKiBUbyBlbnRlciBkb3dubG9hZCBzdGF0ZSwgZGlzYWJsZSBBUk0gYW5kIHJlc2V0IFNPQ1JBTS4KIAkgKiBUbyBleGl0IGRvd25sb2FkIHN0YXRlLCBzaW1wbHkgcmVzZXQgQVJNIChkZWZhdWx0IGlzIFJBTSBib290KS4KQEAgLTMzNDYsMTAgKzMwOTAsOSBAQAogCWlmIChlbnRlcikgewogCQlidXMtPmFscF9vbmx5ID0gdHJ1ZTsKIAotCQlicmNtZl9zZGJyY21fY2hpcF9kaXNhYmxlY29yZShidXMtPnNkaW9kZXYsCi0JCQkJCSAgICAgIGJ1cy0+Y2ktPmFybWNvcmViYXNlKTsKKwkJY2ktPmNvcmVkaXNhYmxlKGJ1cy0+c2Rpb2RldiwgY2ksIEJDTUFfQ09SRV9BUk1fQ00zKTsKIAotCQlicmNtZl9zZGJyY21fY2hpcF9yZXNldGNvcmUoYnVzLT5zZGlvZGV2LCBidXMtPmNpLT5yYW1jb3JlYmFzZSk7CisJCWNpLT5yZXNldGNvcmUoYnVzLT5zZGlvZGV2LCBjaSwgQkNNQV9DT1JFX0lOVEVSTkFMX01FTSk7CiAKIAkJLyogQ2xlYXIgdGhlIHRvcCBiaXQgb2YgbWVtb3J5ICovCiAJCWlmIChidXMtPnJhbXNpemUpIHsKQEAgLTMzNTgsMTEgKzMxMDEsNyBAQAogCQkJCQkgKHU4ICopJnplcm9zLCA0KTsKIAkJfQogCX0gZWxzZSB7Ci0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoYnVzLT5zZGlvZGV2LAotCQkJQ09SRV9TQihidXMtPmNpLT5yYW1jb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7Ci0JCXJlZ2RhdGEgJj0gKFNCVE1MX1JFU0VUIHwgU0JUTUxfUkVKX01BU0sgfAotCQkJKFNJQ0ZfQ0xPQ0tfRU4gPDwgU0JUTUxfU0lDRl9TSElGVCkpOwotCQlpZiAoKFNJQ0ZfQ0xPQ0tfRU4gPDwgU0JUTUxfU0lDRl9TSElGVCkgIT0gcmVnZGF0YSkgeworCQlpZiAoIWNpLT5pc2NvcmV1cChidXMtPnNkaW9kZXYsIGNpLCBCQ01BX0NPUkVfSU5URVJOQUxfTUVNKSkgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiU09DUkFNIGNvcmUgaXMgZG93biBhZnRlciByZXNldD9cbiIpOwogCQkJYmNtZXJyb3IgPSAtRUJBREU7CiAJCQlnb3RvIGZhaWw7CkBAIC0zMzc3LDE4ICszMTE2LDE4IEBACiAJCXdfc2RyZWczMihidXMsIDB4RkZGRkZGRkYsCiAJCQkgIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgaW50c3RhdHVzKSwgJnJldHJpZXMpOwogCi0JCWJyY21mX3NkYnJjbV9jaGlwX3Jlc2V0Y29yZShidXMtPnNkaW9kZXYsIGJ1cy0+Y2ktPmFybWNvcmViYXNlKTsKKwkJY2ktPnJlc2V0Y29yZShidXMtPnNkaW9kZXYsIGNpLCBCQ01BX0NPUkVfQVJNX0NNMyk7CiAKIAkJLyogQWxsb3cgSFQgQ2xvY2sgbm93IHRoYXQgdGhlIEFSTSBpcyBydW5uaW5nLiAqLwogCQlidXMtPmFscF9vbmx5ID0gZmFsc2U7CiAKLQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19MT0FEOworCQlidXMtPmRydnItPmJ1c19pZi0+c3RhdGUgPSBCUkNNRl9CVVNfTE9BRDsKIAl9CiBmYWlsOgogCXJldHVybiBiY21lcnJvcjsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fZ2V0X2ltYWdlKGNoYXIgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZ2V0X2ltYWdlKGNoYXIgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlpZiAoYnVzLT5maXJtd2FyZS0+c2l6ZSA8IGJ1cy0+ZndfcHRyICsgbGVuKQogCQlsZW4gPSBidXMtPmZpcm13YXJlLT5zaXplIC0gYnVzLT5md19wdHI7CkBAIC0zMzk4LDEwICszMTM3LDcgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1NT0RVTEVfRklSTVdBUkUoQkNNNDMyOV9GV19OQU1FKTsKLU1PRFVMRV9GSVJNV0FSRShCQ000MzI5X05WX05BTUUpOwotCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZF9jb2RlX2ZpbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfY29kZV9maWxlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJaW50IG9mZnNldCA9IDA7CiAJdWludCBsZW47CkBAIC0zNDEwLDggKzMxNDYsNyBAQAogCiAJYnJjbWZfZGJnKElORk8sICJFbnRlclxuIik7CiAKLQlidXMtPmZ3X25hbWUgPSBCQ000MzI5X0ZXX05BTUU7Ci0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmYnVzLT5maXJtd2FyZSwgYnVzLT5md19uYW1lLAorCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmJ1cy0+ZmlybXdhcmUsIEJSQ01GTUFDX0ZXX05BTUUsCiAJCQkgICAgICAgJmJ1cy0+c2Rpb2Rldi0+ZnVuY1syXS0+ZGV2KTsKIAlpZiAocmV0KSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgIkZhaWwgdG8gcmVxdWVzdCBmaXJtd2FyZSAlZFxuIiwgcmV0KTsKQEAgLTM1MDEsMTUgKzMyMzYsMTQgQEAKIAlyZXR1cm4gYnVmX2xlbjsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfbnZyYW0oc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfbnZyYW0oc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAl1aW50IGxlbjsKIAljaGFyICptZW1ibG9jayA9IE5VTEw7CiAJY2hhciAqYnVmcDsKIAlpbnQgcmV0OwogCi0JYnVzLT5udl9uYW1lID0gQkNNNDMyOV9OVl9OQU1FOwotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmJ1cy0+ZmlybXdhcmUsIGJ1cy0+bnZfbmFtZSwKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZidXMtPmZpcm13YXJlLCBCUkNNRk1BQ19OVl9OQU1FLAogCQkJICAgICAgICZidXMtPnNkaW9kZXYtPmZ1bmNbMl0tPmRldik7CiAJaWYgKHJldCkgewogCQlicmNtZl9kYmcoRVJST1IsICJGYWlsIHRvIHJlcXVlc3QgbnZyYW0gJWRcbiIsIHJldCk7CkBAIC0zNTQ5LDcgKzMyODMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX2JyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgaW50IF9icmNtZl9zZGJyY21fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlpbnQgYmNtZXJyb3IgPSAtMTsKIApAQCAtMzU4Miw3ICszMzE2LDcgQEAKIH0KIAogc3RhdGljIGJvb2wKLWJyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCiticmNtZl9zZGJyY21fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlib29sIHJldDsKIApAQCAtMzU5NiwxMiArMzMzMCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgYnJjbWZfc2RicmNtX2J1c19zdG9wKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3ZvaWQgYnJjbWZfc2RicmNtX2J1c19zdG9wKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAl1MzIgbG9jYWxfaG9zdGludG1hc2s7CiAJdTggc2F2ZWNsazsKIAl1aW50IHJldHJpZXM7CiAJaW50IGVycjsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2OworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSBzZGlvZGV2LT5idXM7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTM2MzAsNyArMzM2Nyw3IEBACiAJYnVzLT5ob3N0aW50bWFzayA9IDA7CiAKIAkvKiBDaGFuZ2Ugb3VyIGlkZWEgb2YgYnVzIHN0YXRlICovCi0JYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19ET1dOOworCWJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogCiAJLyogRm9yY2UgY2xvY2tzIG9uIGJhY2twbGFuZSB0byBiZSBzdXJlIEYyIGludGVycnVwdCBwcm9wYWdhdGVzICovCiAJc2F2ZWNsayA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLApAQCAtMzY2MSwxMSArMzM5OCw3IEBACiAJLyogQ2xlYXIgYW55IGhlbGQgZ2xvbW1pbmcgc3R1ZmYgKi8KIAlpZiAoYnVzLT5nbG9tZCkKIAkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihidXMtPmdsb21kKTsKLQotCWlmIChidXMtPmdsb20pCi0JCWJyY211X3BrdF9idWZfZnJlZV9za2IoYnVzLT5nbG9tKTsKLQotCWJ1cy0+Z2xvbSA9IGJ1cy0+Z2xvbWQgPSBOVUxMOworCWJyY21mX3NkYnJjbV9mcmVlX2dsb20oYnVzKTsKIAogCS8qIENsZWFyIHJ4IGNvbnRyb2wgYW5kIHdha2UgYW55IHdhaXRlcnMgKi8KIAlidXMtPnJ4bGVuID0gMDsKQEAgLTM2NzgsOSArMzQxMSwxMSBAQAogCXVwKCZidXMtPnNkc2VtKTsKIH0KIAotaW50IGJyY21mX3NkYnJjbV9idXNfaW5pdChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQoraW50IGJyY21mX3NkYnJjbV9idXNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzID0gZHJ2ci0+YnVzOworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiA9IGJ1c19pZi0+YnVzX3ByaXY7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IHNkaW9kZXYtPmJ1czsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJdWludCByZXRyaWVzID0gMDsKIAl1OCByZWFkeSwgZW5hYmxlOwpAQCAtMzY5MCw3ICszNDI1LDcgQEAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKIAkvKiB0cnkgdG8gZG93bmxvYWQgaW1hZ2UgYW5kIG52cmFtIHRvIHRoZSBkb25nbGUgKi8KLQlpZiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHsKKwlpZiAoYnVzX2lmLT5zdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgewogCQlpZiAoIShicmNtZl9zZGJyY21fZG93bmxvYWRfZmlybXdhcmUoYnVzKSkpCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzc1Niw3ICszNDkxLDcgQEAKIAkJCQkgICAgICAgU0JTRElPX1dBVEVSTUFSSywgOCwgJmVycik7CiAKIAkJLyogU2V0IGJ1cyBzdGF0ZSBhY2NvcmRpbmcgdG8gZW5hYmxlIHJlc3VsdCAqLwotCQlkcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19EQVRBOworCQlidXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RBVEE7CiAJfQogCiAJZWxzZSB7CkBAIC0zNzcxLDcgKzM1MDYsNyBAQAogCQkJICAgICAgIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCBzYXZlY2xrLCAmZXJyKTsKIAogCS8qIElmIHdlIGRpZG4ndCBjb21lIHVwLCB0dXJuIG9mZiBiYWNrcGxhbmUgY2xvY2sgKi8KLQlpZiAoZHJ2ci0+YnVzc3RhdGUgIT0gQlJDTUZfQlVTX0RBVEEpCisJaWYgKGJ1c19pZi0+c3RhdGUgIT0gQlJDTUZfQlVTX0RBVEEpCiAJCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfTk9ORSwgZmFsc2UpOwogCiBleGl0OgpAQCAtMzc4Miw3ICszNTE3LDcgQEAKIAogdm9pZCBicmNtZl9zZGJyY21faXNyKHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSAoc3RydWN0IGJyY21mX2J1cyAqKSBhcmc7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfc2RpbyAqKSBhcmc7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTM3OTEsNyArMzUyNiw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoYnVzLT5kcnZyLT5idXNzdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgeworCWlmIChidXMtPmRydnItPmJ1c19pZi0+c3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiYnVzIGlzIGRvd24uIHdlIGhhdmUgbm90aGluZyB0byBkb1xuIik7CiAJCXJldHVybjsKIAl9CkBAIC0zODE0LDE0ICszNTQ5LDE0IEBACiAJCWNvbXBsZXRlKCZidXMtPmRwY193YWl0KTsKIH0KIAotc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX2J1c193YXRjaGRvZyhzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQorc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX2J1c193YXRjaGRvZyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewotCXN0cnVjdCBicmNtZl9idXMgKmJ1czsKKyNpZmRlZiBCQ01EQkcKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoYnVzLT5zZGlvZGV2LT5kZXYpOworI2VuZGlmCS8qIEJDTURCRyAqLwogCiAJYnJjbWZfZGJnKFRJTUVSLCAiRW50ZXJcbiIpOwogCi0JYnVzID0gZHJ2ci0+YnVzOwotCiAJLyogSWdub3JlIHRoZSB0aW1lciBpZiBzaW11bGF0aW5nIGJ1cyBkb3duICovCiAJaWYgKGJ1cy0+c2xlZXBpbmcpCiAJCXJldHVybiBmYWxzZTsKQEAgLTM4NjUsNyArMzYwMCw4IEBACiAJfQogI2lmZGVmIEJDTURCRwogCS8qIFBvbGwgZm9yIGNvbnNvbGUgb3V0cHV0IHBlcmlvZGljYWxseSAqLwotCWlmIChkcnZyLT5idXNzdGF0ZSA9PSBCUkNNRl9CVVNfREFUQSAmJiBidXMtPmNvbnNvbGVfaW50ZXJ2YWwgIT0gMCkgeworCWlmIChidXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19EQVRBICYmCisJICAgIGJ1cy0+Y29uc29sZV9pbnRlcnZhbCAhPSAwKSB7CiAJCWJ1cy0+Y29uc29sZS5jb3VudCArPSBCUkNNRl9XRF9QT0xMX01TOwogCQlpZiAoYnVzLT5jb25zb2xlLmNvdW50ID49IGJ1cy0+Y29uc29sZV9pbnRlcnZhbCkgewogCQkJYnVzLT5jb25zb2xlLmNvdW50IC09IGJ1cy0+Y29uc29sZV9pbnRlcnZhbDsKQEAgLTM5MDMsNyArMzYzOSw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcmVsZWFzZV9tYWxsb2Moc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3JlbGVhc2VfbWFsbG9jKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC0zOTE1LDcgKzM2NTEsNyBAQAogCWJ1cy0+ZGF0YWJ1ZiA9IE5VTEw7CiB9CiAKLXN0YXRpYyBib29sIGJyY21mX3NkYnJjbV9wcm9iZV9tYWxsb2Moc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX3Byb2JlX21hbGxvYyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMzk1MCwyNzYgKzM2ODYsMTQgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLS8qIFNESU8gUGFkIGRyaXZlIHN0cmVuZ3RoIHRvIHNlbGVjdCB2YWx1ZSBtYXBwaW5ncyAqLwotc3RydWN0IHNkaW9kX2RyaXZlX3N0ciB7Ci0JdTggc3RyZW5ndGg7CS8qIFBhZCBEcml2ZSBTdHJlbmd0aCBpbiBtQSAqLwotCXU4IHNlbDsJCS8qIENoaXAtc3BlY2lmaWMgc2VsZWN0IHZhbHVlICovCi19OwotCi0vKiBTRElPIERyaXZlIFN0cmVuZ3RoIHRvIHNlbCB2YWx1ZSB0YWJsZSBmb3IgUE1VIFJldiAxICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9kX2RyaXZlX3N0ciBzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIxW10gPSB7Ci0JewotCTQsIDB4Mn0sIHsKLQkyLCAweDN9LCB7Ci0JMSwgMHgwfSwgewotCTAsIDB4MH0KLQl9OwotCi0vKiBTRElPIERyaXZlIFN0cmVuZ3RoIHRvIHNlbCB2YWx1ZSB0YWJsZSBmb3IgUE1VIFJldiAyLCAzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9kX2RyaXZlX3N0ciBzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIyW10gPSB7Ci0JewotCTEyLCAweDd9LCB7Ci0JMTAsIDB4Nn0sIHsKLQk4LCAweDV9LCB7Ci0JNiwgMHg0fSwgewotCTQsIDB4Mn0sIHsKLQkyLCAweDF9LCB7Ci0JMCwgMHgwfQotCX07Ci0KLS8qIFNESU8gRHJpdmUgU3RyZW5ndGggdG8gc2VsIHZhbHVlIHRhYmxlIGZvciBQTVUgUmV2IDggKDEuOFYpICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9kX2RyaXZlX3N0ciBzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIzW10gPSB7Ci0JewotCTMyLCAweDd9LCB7Ci0JMjYsIDB4Nn0sIHsKLQkyMiwgMHg1fSwgewotCTE2LCAweDR9LCB7Ci0JMTIsIDB4M30sIHsKLQk4LCAweDJ9LCB7Ci0JNCwgMHgxfSwgewotCTAsIDB4MH0KLQl9OwotCi0jZGVmaW5lIFNESU9EX0RSVlNUUl9LRVkoY2hpcCwgcG11KSAgICAgKCgoY2hpcCkgPDwgMTYpIHwgKHBtdSkpCi0KLXN0YXRpYyBjaGFyICpicmNtZl9jaGlwbmFtZSh1aW50IGNoaXBpZCwgY2hhciAqYnVmLCB1aW50IGxlbikKLXsKLQljb25zdCBjaGFyICpmbXQ7Ci0KLQlmbXQgPSAoKGNoaXBpZCA+IDB4YTAwMCkgfHwgKGNoaXBpZCA8IDB4NDAwMCkpID8gIiVkIiA6ICIleCI7Ci0Jc25wcmludGYoYnVmLCBsZW4sIGZtdCwgY2hpcGlkKTsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fc2Rpb2RfZHJpdmVfc3RyZW5ndGhfaW5pdChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsCi0JCQkJCQkgICB1MzIgZHJpdmVzdHJlbmd0aCkgewotCXN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgKnN0cl90YWIgPSBOVUxMOwotCXUzMiBzdHJfbWFzayA9IDA7Ci0JdTMyIHN0cl9zaGlmdCA9IDA7Ci0JY2hhciBjaG5bOF07Ci0KLQlpZiAoIShidXMtPmNpLT5jY2NhcHMgJiBDQ19DQVBfUE1VKSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChTRElPRF9EUlZTVFJfS0VZKGJ1cy0+Y2ktPmNoaXAsIGJ1cy0+Y2ktPnBtdXJldikpIHsKLQljYXNlIFNESU9EX0RSVlNUUl9LRVkoQkNNNDMyNV9DSElQX0lELCAxKToKLQkJc3RyX3RhYiA9IChzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyICopJnNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjE7Ci0JCXN0cl9tYXNrID0gMHgzMDAwMDAwMDsKLQkJc3RyX3NoaWZ0ID0gMjg7Ci0JCWJyZWFrOwotCWNhc2UgU0RJT0RfRFJWU1RSX0tFWShCQ000MzI1X0NISVBfSUQsIDIpOgotCWNhc2UgU0RJT0RfRFJWU1RSX0tFWShCQ000MzI1X0NISVBfSUQsIDMpOgotCQlzdHJfdGFiID0gKHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgKikmc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiMjsKLQkJc3RyX21hc2sgPSAweDAwMDAzODAwOwotCQlzdHJfc2hpZnQgPSAxMTsKLQkJYnJlYWs7Ci0JY2FzZSBTRElPRF9EUlZTVFJfS0VZKEJDTTQzMzZfQ0hJUF9JRCwgOCk6Ci0JCXN0cl90YWIgPSAoc3RydWN0IHNkaW9kX2RyaXZlX3N0ciAqKSZzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIzOwotCQlzdHJfbWFzayA9IDB4MDAwMDM4MDA7Ci0JCXN0cl9zaGlmdCA9IDExOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmNtZl9kYmcoRVJST1IsICJObyBTRElPIERyaXZlIHN0cmVuZ3RoIGluaXQgZG9uZSBmb3IgY2hpcCAlcyByZXYgJWQgcG11cmV2ICVkXG4iLAotCQkJICBicmNtZl9jaGlwbmFtZShidXMtPmNpLT5jaGlwLCBjaG4sIDgpLAotCQkJICBidXMtPmNpLT5jaGlwcmV2LCBidXMtPmNpLT5wbXVyZXYpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoc3RyX3RhYiAhPSBOVUxMKSB7Ci0JCXUzMiBkcml2ZXN0cmVuZ3RoX3NlbCA9IDA7Ci0JCXUzMiBjY19kYXRhX3RlbXA7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IHN0cl90YWJbaV0uc3RyZW5ndGggIT0gMDsgaSsrKSB7Ci0JCQlpZiAoZHJpdmVzdHJlbmd0aCA+PSBzdHJfdGFiW2ldLnN0cmVuZ3RoKSB7Ci0JCQkJZHJpdmVzdHJlbmd0aF9zZWwgPSBzdHJfdGFiW2ldLnNlbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoYnVzLT5zZGlvZGV2LAotCQkJQ09SRV9DQ19SRUcoYnVzLT5jaS0+Y2Njb3JlYmFzZSwgY2hpcGNvbnRyb2xfYWRkciksCi0JCQk0LCAxKTsKLQkJY2NfZGF0YV90ZW1wID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGJ1cy0+c2Rpb2RldiwKLQkJCUNPUkVfQ0NfUkVHKGJ1cy0+Y2ktPmNjY29yZWJhc2UsIGNoaXBjb250cm9sX2FkZHIpLCA0KTsKLQkJY2NfZGF0YV90ZW1wICY9IH5zdHJfbWFzazsKLQkJZHJpdmVzdHJlbmd0aF9zZWwgPDw9IHN0cl9zaGlmdDsKLQkJY2NfZGF0YV90ZW1wIHw9IGRyaXZlc3RyZW5ndGhfc2VsOwotCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKGJ1cy0+c2Rpb2RldiwKLQkJCUNPUkVfQ0NfUkVHKGJ1cy0+Y2ktPmNjY29yZWJhc2UsIGNoaXBjb250cm9sX2FkZHIpLAotCQkJNCwgY2NfZGF0YV90ZW1wKTsKLQotCQlicmNtZl9kYmcoSU5GTywgIlNESU86ICVkbUEgZHJpdmUgc3RyZW5ndGggc2VsZWN0ZWQsIHNldCB0byAweCUwOHhcbiIsCi0JCQkgIGRyaXZlc3RyZW5ndGgsIGNjX2RhdGFfdGVtcCk7Ci0JfQotfQotCi1zdGF0aWMgaW50Ci1icmNtZl9zZGJyY21fY2hpcF9yZWNvZ25pdGlvbihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCi0JCQkgICAgICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTMyIHJlZ3MpCi17Ci0JdTMyIHJlZ2RhdGE7Ci0KLQkvKgotCSAqIEdldCBDQyBjb3JlIHJldgotCSAqIENoaXBpZCBpcyBhc3N1bWUgdG8gYmUgYXQgb2Zmc2V0IDAgZnJvbSByZWdzIGFyZwotCSAqIEZvciBkaWZmZXJlbnQgY2hpcHR5cGVzIG9yIG9sZCBzZGlvIGhvc3RzIHcvbyBjaGlwY29tbW9uLAotCSAqIG90aGVyIHdheXMgb2YgcmVjb2duaXRpb24gc2hvdWxkIGJlIGFkZGVkIGhlcmUuCi0JICovCi0JY2ktPmNjY29yZWJhc2UgPSByZWdzOwotCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQlDT1JFX0NDX1JFRyhjaS0+Y2Njb3JlYmFzZSwgY2hpcGlkKSwgNCk7Ci0JY2ktPmNoaXAgPSByZWdkYXRhICYgQ0lEX0lEX01BU0s7Ci0JY2ktPmNoaXByZXYgPSAocmVnZGF0YSAmIENJRF9SRVZfTUFTSykgPj4gQ0lEX1JFVl9TSElGVDsKLQotCWJyY21mX2RiZyhJTkZPLCAiY2hpcGlkPTB4JXggY2hpcHJldj0lZFxuIiwgY2ktPmNoaXAsIGNpLT5jaGlwcmV2KTsKLQotCS8qIEFkZHJlc3Mgb2YgY29yZXMgZm9yIG5ldyBjaGlwcyBzaG91bGQgYmUgYWRkZWQgaGVyZSAqLwotCXN3aXRjaCAoY2ktPmNoaXApIHsKLQljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKLQkJY2ktPmJ1c2NvcmViYXNlID0gQkNNNDMyOV9DT1JFX0JVU19CQVNFOwotCQljaS0+cmFtY29yZWJhc2UgPSBCQ000MzI5X0NPUkVfU09DUkFNX0JBU0U7Ci0JCWNpLT5hcm1jb3JlYmFzZQk9IEJDTTQzMjlfQ09SRV9BUk1fQkFTRTsKLQkJY2ktPnJhbXNpemUgPSBCQ000MzI5X1JBTVNJWkU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyY21mX2RiZyhFUlJPUiwgImNoaXBpZCAweCV4IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGNpLT5jaGlwKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQlDT1JFX1NCKGNpLT5jY2NvcmViYXNlLCBzYmlkaGlnaCksIDQpOwotCWNpLT5jY3JldiA9IFNCQ09SRVJFVihyZWdkYXRhKTsKLQotCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJQ09SRV9DQ19SRUcoY2ktPmNjY29yZWJhc2UsIHBtdWNhcGFiaWxpdGllcyksIDQpOwotCWNpLT5wbXVyZXYgPSByZWdkYXRhICYgUENBUF9SRVZfTUFTSzsKLQotCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQkJQ09SRV9TQihjaS0+YnVzY29yZWJhc2UsIHNiaWRoaWdoKSwgNCk7Ci0JY2ktPmJ1c2NvcmVyZXYgPSBTQkNPUkVSRVYocmVnZGF0YSk7Ci0JY2ktPmJ1c2NvcmV0eXBlID0gKHJlZ2RhdGEgJiBTQklESF9DQ19NQVNLKSA+PiBTQklESF9DQ19TSElGVDsKLQotCWJyY21mX2RiZyhJTkZPLCAiY2NyZXY9JWQsIHBtdXJldj0lZCwgYnVzY29yZSByZXYvdHlwZT0lZC8weCV4XG4iLAotCQkgIGNpLT5jY3JldiwgY2ktPnBtdXJldiwgY2ktPmJ1c2NvcmVyZXYsIGNpLT5idXNjb3JldHlwZSk7Ci0KLQkvKiBnZXQgY2hpcGNvbW1vbiBjYXBhYmlsaXRlcyAqLwotCWNpLT5jY2NhcHMgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJQ09SRV9DQ19SRUcoY2ktPmNjY29yZWJhc2UsIGNhcGFiaWxpdGllcyksIDQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWJyY21mX3NkYnJjbV9jaGlwX2F0dGFjaChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHUzMiByZWdzKQotewotCXN0cnVjdCBjaGlwX2luZm8gKmNpOwotCWludCBlcnI7Ci0JdTggY2xrdmFsLCBjbGtzZXQ7Ci0KLQlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7Ci0KLQkvKiBhbGxvYyBjaGlwX2luZm9fdCAqLwotCWNpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoaXBfaW5mbyksIEdGUF9BVE9NSUMpOwotCWlmIChOVUxMID09IGNpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGJ1cy9jb3JlL2NsayBzZXR1cCBmb3IgcmVnaXN0ZXIgYWNjZXNzICovCi0JLyogVHJ5IGZvcmNpbmcgU0RJTyBjb3JlIHRvIGRvIEFMUEF2YWlsIHJlcXVlc3Qgb25seSAqLwotCWNsa3NldCA9IFNCU0RJT19GT1JDRV9IV19DTEtSRVFfT0ZGIHwgU0JTRElPX0FMUF9BVkFJTF9SRVE7Ci0JYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAotCQkJICAgICAgIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLAljbGtzZXQsICZlcnIpOwotCWlmIChlcnIpIHsKLQkJYnJjbWZfZGJnKEVSUk9SLCAiZXJyb3Igd3JpdGluZyBmb3IgSFQgb2ZmXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIElmIHJlZ2lzdGVyIHN1cHBvcnRlZCwgd2FpdCBmb3IgQUxQQXZhaWwgYW5kIHRoZW4gZm9yY2UgQUxQICovCi0JLyogVGhpcyBtYXkgdGFrZSB1cCB0byAxNSBtaWxsaXNlY29uZHMgKi8KLQljbGt2YWwgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKLQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCBOVUxMKTsKLQlpZiAoKGNsa3ZhbCAmIH5TQlNESU9fQVZCSVRTKSA9PSBjbGtzZXQpIHsKLQkJU1BJTldBSVQoKChjbGt2YWwgPQotCQkJCWJyY21mX3NkY2FyZF9jZmdfcmVhZChidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAotCQkJCQkJU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsCi0JCQkJCQlOVUxMKSksCi0JCQkJIVNCU0RJT19BTFBBVihjbGt2YWwpKSwKLQkJCQlQTVVfTUFYX1RSQU5TSVRJT05fRExZKTsKLQkJaWYgKCFTQlNESU9fQUxQQVYoY2xrdmFsKSkgewotCQkJYnJjbWZfZGJnKEVSUk9SLCAidGltZW91dCBvbiBBTFBBViB3YWl0LCBjbGt2YWwgMHglMDJ4XG4iLAotCQkJCSAgY2xrdmFsKTsKLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQljbGtzZXQgPSBTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRiB8Ci0JCQkJU0JTRElPX0ZPUkNFX0FMUDsKLQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAotCQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLAotCQkJCWNsa3NldCwgJmVycik7Ci0JCXVkZWxheSg2NSk7Ci0JfSBlbHNlIHsKLQkJYnJjbWZfZGJnKEVSUk9SLCAiQ2hpcENsa0NTUiBhY2Nlc3M6IHdyb3RlIDB4JTAyeCByZWFkIDB4JTAyeFxuIiwKLQkJCSAgY2xrc2V0LCBjbGt2YWwpOwotCQllcnIgPSAtRUFDQ0VTOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogQWxzbywgZGlzYWJsZSB0aGUgZXh0cmEgU0RJTyBwdWxsLXVwcyAqLwotCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKLQkJCSAgICAgICBTQlNESU9fRlVOQzFfU0RJT1BVTExVUCwgMCwgTlVMTCk7Ci0KLQllcnIgPSBicmNtZl9zZGJyY21fY2hpcF9yZWNvZ25pdGlvbihidXMtPnNkaW9kZXYsIGNpLCByZWdzKTsKLQlpZiAoZXJyKQotCQlnb3RvIGZhaWw7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBhbnkgb24tY2hpcCBBUk0gaXMgb2ZmIChpbiBjYXNlIHN0cmFwcGluZyBpcyB3cm9uZyksCi0JICogb3IgZG93bmxvYWRlZCBjb2RlIHdhcyBhbHJlYWR5IHJ1bm5pbmcuCi0JICovCi0JYnJjbWZfc2RicmNtX2NoaXBfZGlzYWJsZWNvcmUoYnVzLT5zZGlvZGV2LCBjaS0+YXJtY29yZWJhc2UpOwotCi0JYnJjbWZfc2RjYXJkX3JlZ193cml0ZShidXMtPnNkaW9kZXYsCi0JCUNPUkVfQ0NfUkVHKGNpLT5jY2NvcmViYXNlLCBncGlvcHVsbHVwKSwgNCwgMCk7Ci0JYnJjbWZfc2RjYXJkX3JlZ193cml0ZShidXMtPnNkaW9kZXYsCi0JCUNPUkVfQ0NfUkVHKGNpLT5jY2NvcmViYXNlLCBncGlvcHVsbGRvd24pLCA0LCAwKTsKLQotCS8qIERpc2FibGUgRjIgdG8gY2xlYXIgYW55IGludGVybWVkaWF0ZSBmcmFtZSBzdGF0ZSBvbiB0aGUgZG9uZ2xlICovCi0JYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18wLCBTRElPX0NDQ1JfSU9FeCwKLQkJU0RJT19GVU5DX0VOQUJMRV8xLCBOVUxMKTsKLQotCS8qIFdBUjogY21kNTIgYmFja3BsYW5lIHJlYWQgc28gY29yZSBIVyB3aWxsIGRyb3AgQUxQUmVxICovCi0JY2xrdmFsID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCi0JCQkwLCBOVUxMKTsKLQotCS8qIERvbmUgd2l0aCBiYWNrcGxhbmUtZGVwZW5kZW50IGFjY2Vzc2VzLCBjYW4gZHJvcCBjbG9jay4uLiAqLwotCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKLQkJCSAgICAgICBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwgMCwgTlVMTCk7Ci0KLQlidXMtPmNpID0gY2k7Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCWJ1cy0+Y2kgPSBOVUxMOwotCWtmcmVlKGNpKTsKLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgYm9vbAotYnJjbWZfc2RicmNtX3Byb2JlX2F0dGFjaChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHUzMiByZWdzdmEpCiticmNtZl9zZGJyY21fcHJvYmVfYXR0YWNoKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHUzMiByZWdzdmEpCiB7CiAJdTggY2xrY3RsID0gMDsKIAlpbnQgZXJyID0gMDsKIAlpbnQgcmVnX2FkZHI7CiAJdTMyIHJlZ192YWw7CisJdTggaWR4OwogCiAJYnVzLT5hbHBfb25seSA9IHRydWU7CiAKQEAgLTQyMzQsNyArMzcwOCw3IEBACiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKIAkvKgotCSAqIEZvcmNlIFBMTCBvZmYgdW50aWwgYnJjbWZfc2RicmNtX2NoaXBfYXR0YWNoKCkKKwkgKiBGb3JjZSBQTEwgb2ZmIHVudGlsIGJyY21mX3NkaW9fY2hpcF9hdHRhY2goKQogCSAqIHByb2dyYW1zIFBMTCBjb250cm9sIHJlZ3MKIAkgKi8KIApAQCAtNDI1Miw4ICszNzI2LDggQEAKIAkJZ290byBmYWlsOwogCX0KIAotCWlmIChicmNtZl9zZGJyY21fY2hpcF9hdHRhY2goYnVzLCByZWdzdmEpKSB7Ci0JCWJyY21mX2RiZyhFUlJPUiwgImJyY21mX3NkYnJjbV9jaGlwX2F0dGFjaCBmYWlsZWQhXG4iKTsKKwlpZiAoYnJjbWZfc2Rpb19jaGlwX2F0dGFjaChidXMtPnNkaW9kZXYsICZidXMtPmNpLCByZWdzdmEpKSB7CisJCWJyY21mX2RiZyhFUlJPUiwgImJyY21mX3NkaW9fY2hpcF9hdHRhY2ggZmFpbGVkIVxuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTQyNjIsMTEgKzM3MzYsMTAgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCWJyY21mX3NkYnJjbV9zZGlvZF9kcml2ZV9zdHJlbmd0aF9pbml0KGJ1cywgU0RJT19EUklWRV9TVFJFTkdUSCk7CisJYnJjbWZfc2Rpb19jaGlwX2RyaXZlc3RyZW5ndGhpbml0KGJ1cy0+c2Rpb2RldiwgYnVzLT5jaSwKKwkJCQkJICBTRElPX0RSSVZFX1NUUkVOR1RIKTsKIAotCS8qIEdldCBpbmZvIG9uIHRoZSBBUk0gYW5kIFNPQ1JBTSBjb3Jlcy4uLiAqLwotCWJyY21mX3NkY2FyZF9yZWdfcmVhZChidXMtPnNkaW9kZXYsCi0JCSAgQ09SRV9TQihidXMtPmNpLT5hcm1jb3JlYmFzZSwgc2JpZGhpZ2gpLCA0KTsKKwkvKiBHZXQgaW5mbyBvbiB0aGUgU09DUkFNIGNvcmVzLi4uICovCiAJYnVzLT5yYW1zaXplID0gYnVzLT5jaS0+cmFtc2l6ZTsKIAlpZiAoIShidXMtPnJhbXNpemUpKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImZhaWxlZCB0byBmaW5kIFNPQ1JBTSBtZW1vcnkhXG4iKTsKQEAgLTQyNzQsNyArMzc0Nyw4IEBACiAJfQogCiAJLyogU2V0IGNvcmUgY29udHJvbCBzbyBhbiBTRElPIHJlc2V0IGRvZXMgYSBiYWNrcGxhbmUgcmVzZXQgKi8KLQlyZWdfYWRkciA9IGJ1cy0+Y2ktPmJ1c2NvcmViYXNlICsKKwlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGJ1cy0+Y2ksIEJDTUFfQ09SRV9TRElPX0RFVik7CisJcmVnX2FkZHIgPSBidXMtPmNpLT5jX2luZltpZHhdLmJhc2UgKwogCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGNvcmVjb250cm9sKTsKIAlyZWdfdmFsID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGJ1cy0+c2Rpb2RldiwgcmVnX2FkZHIsIHNpemVvZih1MzIpKTsKIAlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgcmVnX2FkZHIsIHNpemVvZih1MzIpLApAQCAtNDI5OCw3ICszNzcyLDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIGJyY21mX3NkYnJjbV9wcm9iZV9pbml0KHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3N0YXRpYyBib29sIGJyY21mX3NkYnJjbV9wcm9iZV9pbml0KHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC00MzA2LDcgKzM3ODAsNyBAQAogCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMCwgU0RJT19DQ0NSX0lPRXgsCiAJCQkgICAgICAgU0RJT19GVU5DX0VOQUJMRV8xLCBOVUxMKTsKIAotCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKKwlidXMtPmRydnItPmJ1c19pZi0+c3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKIAlidXMtPnNsZWVwaW5nID0gZmFsc2U7CiAJYnVzLT5yeGZsb3cgPSBmYWxzZTsKIApAQCAtNDMzMyw3ICszODA3LDcgQEAKIHN0YXRpYyBpbnQKIGJyY21mX3NkYnJjbV93YXRjaGRvZ190aHJlYWQodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSAoc3RydWN0IGJyY21mX2J1cyAqKWRhdGE7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfc2RpbyAqKWRhdGE7CiAKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CiAJLyogUnVuIHVudGlsIHNpZ25hbCByZWNlaXZlZCAqLwpAQCAtNDM0MSw3ICszODE1LDcgQEAKIAkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKIAkJCWJyZWFrOwogCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmYnVzLT53YXRjaGRvZ193YWl0KSkgewotCQkJYnJjbWZfc2RicmNtX2J1c193YXRjaGRvZyhidXMtPmRydnIpOworCQkJYnJjbWZfc2RicmNtX2J1c193YXRjaGRvZyhidXMpOwogCQkJLyogQ291bnQgdGhlIHRpY2sgZm9yIHJlZmVyZW5jZSAqLwogCQkJYnVzLT5kcnZyLT50aWNrY250Kys7CiAJCX0gZWxzZQpAQCAtNDM1Myw3ICszODI3LDcgQEAKIHN0YXRpYyB2b2lkCiBicmNtZl9zZGJyY21fd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfYnVzICopZGF0YTsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gKHN0cnVjdCBicmNtZl9zZGlvICopZGF0YTsKIAogCWlmIChidXMtPndhdGNoZG9nX3RzaykgewogCQljb21wbGV0ZSgmYnVzLT53YXRjaGRvZ193YWl0KTsKQEAgLTQzNjQsMjMgKzM4MzgsMTQgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1icmNtZl9zZGJyY21fY2hpcF9kZXRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKLQotCWtmcmVlKGJ1cy0+Y2kpOwotCWJ1cy0+Y2kgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcmVsZWFzZV9kb25nbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3JlbGVhc2VfZG9uZ2xlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCiAJaWYgKGJ1cy0+Y2kpIHsKIAkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwogCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX05PTkUsIGZhbHNlKTsKLQkJYnJjbWZfc2RicmNtX2NoaXBfZGV0YWNoKGJ1cyk7CisJCWJyY21mX3NkaW9fY2hpcF9kZXRhY2goJmJ1cy0+Y2kpOwogCQlpZiAoYnVzLT52YXJzICYmIGJ1cy0+dmFyc3opCiAJCQlrZnJlZShidXMtPnZhcnMpOwogCQlidXMtPnZhcnMgPSBOVUxMOwpAQCAtNDM5MCw3ICszODU1LDcgQEAKIH0KIAogLyogRGV0YWNoIGFuZCBmcmVlIGV2ZXJ5dGhpbmcgKi8KLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yZWxlYXNlKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3N0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yZWxlYXNlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC00NDEyLDIxICszODc3LDEwIEBACiAJYnJjbWZfZGJnKFRSQUNFLCAiRGlzY29ubmVjdGVkXG4iKTsKIH0KIAotdm9pZCAqYnJjbWZfc2RicmNtX3Byb2JlKHUxNiBidXNfbm8sIHUxNiBzbG90LCB1MTYgZnVuYywgdWludCBidXN0eXBlLAotCQkJIHUzMiByZWdzdmEsIHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKK3ZvaWQgKmJyY21mX3NkYnJjbV9wcm9iZSh1MzIgcmVnc3ZhLCBzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXM7Ci0KLQkvKiBJbml0IGdsb2JhbCB2YXJpYWJsZXMgYXQgcnVuLXRpbWUsIG5vdCBhcyBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbi4KLQkgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgaW5pdC9kZS1pbml0IG9mIHRoZSBkcml2ZXIuCi0JICogSW5pdGlhbGl6YXRpb24KLQkgKiBvZiBnbG9iYWxzIGFzIHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9uIHJlc3VsdHMgaW4gbm9uLWRldGVybWluaXN0aWMKLQkgKiBiZWhhdmlvciBzaW5jZSB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbHMgbWF5IGJlIGRpZmZlcmVudCBvbiB0aGUKLQkgKiBmaXJzdCB0aW1lIHRoYXQgdGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB2cyBzdWJzZXF1ZW50Ci0JICogaW5pdGlhbGl6YXRpb25zLgotCSAqLwotCWJyY21mX2NfaW5pdCgpOworCXN0cnVjdCBicmNtZl9zZGlvICpidXM7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTQ0MzQsMTIgKzM4ODgsMTMgQEAKIAkgKiByZWdzdmEgPT0gU0lfRU5VTV9CQVNFKi8KIAogCS8qIEFsbG9jYXRlIHByaXZhdGUgYnVzIGludGVyZmFjZSBzdGF0ZSAqLwotCWJ1cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9idXMpLCBHRlBfQVRPTUlDKTsKKwlidXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbWZfc2RpbyksIEdGUF9BVE9NSUMpOwogCWlmICghYnVzKQogCQlnb3RvIGZhaWw7CiAKIAlidXMtPnNkaW9kZXYgPSBzZGlvZGV2OwogCXNkaW9kZXYtPmJ1cyA9IGJ1czsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZidXMtPmdsb20pOwogCWJ1cy0+dHhib3VuZCA9IEJSQ01GX1RYQk9VTkQ7CiAJYnVzLT5yeGJvdW5kID0gQlJDTUZfUlhCT1VORDsKIAlidXMtPnR4bWlubWF4ID0gQlJDTUZfVFhNSU5NQVg7CkBAIC00NDg1LDcgKzM5NDAsNyBAQAogCX0KIAogCS8qIEF0dGFjaCB0byB0aGUgYnJjbWYvT1MvbmV0d29yayBpbnRlcmZhY2UgKi8KLQlidXMtPmRydnIgPSBicmNtZl9hdHRhY2goYnVzLCBTRFBDTV9SRVNFUlZFKTsKKwlidXMtPmRydnIgPSBicmNtZl9hdHRhY2goYnVzLCBTRFBDTV9SRVNFUlZFLCBidXMtPnNkaW9kZXYtPmRldik7CiAJaWYgKCFidXMtPmRydnIpIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbWZfYXR0YWNoIGZhaWxlZFxuIik7CiAJCWdvdG8gZmFpbDsKQEAgLTQ1MjEsOSArMzk3NiwxMCBAQAogCQkJZ290byBmYWlsOwogCQl9CiAJfQotCS8qIE9rLCBoYXZlIHRoZSBwZXItcG9ydCB0ZWxsIHRoZSBzdGFjayB3ZSdyZSBvcGVuIGZvciBidXNpbmVzcyAqLwotCWlmIChicmNtZl9uZXRfYXR0YWNoKGJ1cy0+ZHJ2ciwgMCkgIT0gMCkgewotCQlicmNtZl9kYmcoRVJST1IsICJOZXQgYXR0YWNoIGZhaWxlZCEhXG4iKTsKKworCS8qIGFkZCBpbnRlcmZhY2UgYW5kIG9wZW4gZm9yIGJ1c2luZXNzICovCisJaWYgKGJyY21mX2FkZF9pZigoc3RydWN0IGJyY21mX2luZm8gKilidXMtPmRydnIsIDAsICJ3bGFuJWQiLCBOVUxMKSkgeworCQlicmNtZl9kYmcoRVJST1IsICJBZGQgcHJpbWFyeSBuZXQgZGV2aWNlIGludGVyZmFjZSBmYWlsZWQhIVxuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTQ1MzYsNyArMzk5Miw3IEBACiAKIHZvaWQgYnJjbWZfc2RicmNtX2Rpc2Nvbm5lY3Qodm9pZCAqcHRyKQogewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfYnVzICopcHRyOworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSAoc3RydWN0IGJyY21mX3NkaW8gKilwdHI7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTQ1NDYsMTggKzQwMDIsOSBAQAogCWJyY21mX2RiZyhUUkFDRSwgIkRpc2Nvbm5lY3RlZFxuIik7CiB9CiAKLXN0cnVjdCBkZXZpY2UgKmJyY21mX2J1c19nZXRfZGV2aWNlKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKLXsKLQlyZXR1cm4gJmJ1cy0+c2Rpb2Rldi0+ZnVuY1syXS0+ZGV2OwotfQotCiB2b2lkCi1icmNtZl9zZGJyY21fd2RfdGltZXIoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1aW50IHdkdGljaykKK2JyY21mX3NkYnJjbV93ZF90aW1lcihzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1aW50IHdkdGljaykKIHsKLQkvKiBkb24ndCBzdGFydCB0aGUgd2QgdW50aWwgZncgaXMgbG9hZGVkICovCi0JaWYgKGJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pCi0JCXJldHVybjsKLQogCS8qIFRvdGFsbHkgc3RvcCB0aGUgdGltZXIgKi8KIAlpZiAoIXdkdGljayAmJiBidXMtPndkX3RpbWVyX3ZhbGlkID09IHRydWUpIHsKIAkJZGVsX3RpbWVyX3N5bmMoJmJ1cy0+dGltZXIpOwpAQCAtNDU2Niw2ICs0MDEzLDEwIEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBkb24ndCBzdGFydCB0aGUgd2QgdW50aWwgZncgaXMgbG9hZGVkICovCisJaWYgKGJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikKKwkJcmV0dXJuOworCiAJaWYgKHdkdGljaykgewogCQlpZiAoYnVzLT5zYXZlX21zICE9IEJSQ01GX1dEX1BPTExfTVMpIHsKIAkJCWlmIChidXMtPndkX3RpbWVyX3ZhbGlkID09IHRydWUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19jaGlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19jaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiMTgyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvX2NoaXAuYwpAQCAtMCwwICsxLDYyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAqKioqKiBTRElPIGludGVyZmFjZSBjaGlwIGJhY2twbGFuZSBoYW5kbGUgZnVuY3Rpb25zICoqKioqICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CisjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9yZWdzLmg+CisjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CisKKyNpbmNsdWRlIDxjaGlwY29tbW9uLmg+CisjaW5jbHVkZSA8YnJjbV9od19pZHMuaD4KKyNpbmNsdWRlIDxicmNtdV93aWZpLmg+CisjaW5jbHVkZSA8YnJjbXVfdXRpbHMuaD4KKyNpbmNsdWRlIDxzb2MuaD4KKyNpbmNsdWRlICJkaGQuaCIKKyNpbmNsdWRlICJkaGRfZGJnLmgiCisjaW5jbHVkZSAic2Rpb19ob3N0LmgiCisjaW5jbHVkZSAic2Rpb19jaGlwLmgiCisKKy8qIGNoaXAgY29yZSBiYXNlICYgcmFtc2l6ZSAqLworLyogYmNtNDMyOSAqLworLyogU0RJTyBkZXZpY2UgY29yZSwgSUQgMHg4MjkgKi8KKyNkZWZpbmUgQkNNNDMyOV9DT1JFX0JVU19CQVNFCQkweDE4MDExMDAwCisvKiBpbnRlcm5hbCBtZW1vcnkgY29yZSwgSUQgMHg4MGUgKi8KKyNkZWZpbmUgQkNNNDMyOV9DT1JFX1NPQ1JBTV9CQVNFCTB4MTgwMDMwMDAKKy8qIEFSTSBDb3J0ZXggTTMgY29yZSwgSUQgMHg4MmEgKi8KKyNkZWZpbmUgQkNNNDMyOV9DT1JFX0FSTV9CQVNFCQkweDE4MDAyMDAwCisjZGVmaW5lIEJDTTQzMjlfUkFNU0laRQkJCTB4NDgwMDAKKworI2RlZmluZQlTQkNPUkVSRVYoc2JpZGgpIFwKKwkoKCgoc2JpZGgpICYgU1NCX0lESElHSF9SQ0hJKSA+PiBTU0JfSURISUdIX1JDSElfU0hJRlQpIHwgXAorCSAgKChzYmlkaCkgJiBTU0JfSURISUdIX1JDTE8pKQorCisvKiBTT0MgSW50ZXJjb25uZWN0IHR5cGVzIChha2EgY2hpcCB0eXBlcykgKi8KKyNkZWZpbmUgU09DSV9TQgkJMAorI2RlZmluZSBTT0NJX0FJCQkxCisKKy8qIEVST00gQ29tcElkZW50QiAqLworI2RlZmluZSBDSUJfUkVWX01BU0sJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgQ0lCX1JFVl9TSElGVAkJMjQKKworI2RlZmluZSBTRElPRF9EUlZTVFJfS0VZKGNoaXAsIHBtdSkgICAgICgoKGNoaXApIDw8IDE2KSB8IChwbXUpKQorLyogU0RJTyBQYWQgZHJpdmUgc3RyZW5ndGggdG8gc2VsZWN0IHZhbHVlIG1hcHBpbmdzICovCitzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyIHsKKwl1OCBzdHJlbmd0aDsJLyogUGFkIERyaXZlIFN0cmVuZ3RoIGluIG1BICovCisJdTggc2VsOwkJLyogQ2hpcC1zcGVjaWZpYyBzZWxlY3QgdmFsdWUgKi8KK307CisvKiBTRElPIERyaXZlIFN0cmVuZ3RoIHRvIHNlbCB2YWx1ZSB0YWJsZSBmb3IgUE1VIFJldiAxICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9kX2RyaXZlX3N0ciBzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIxW10gPSB7CisJeworCTQsIDB4Mn0sIHsKKwkyLCAweDN9LCB7CisJMSwgMHgwfSwgeworCTAsIDB4MH0KKwl9OworLyogU0RJTyBEcml2ZSBTdHJlbmd0aCB0byBzZWwgdmFsdWUgdGFibGUgZm9yIFBNVSBSZXYgMiwgMyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiMltdID0geworCXsKKwkxMiwgMHg3fSwgeworCTEwLCAweDZ9LCB7CisJOCwgMHg1fSwgeworCTYsIDB4NH0sIHsKKwk0LCAweDJ9LCB7CisJMiwgMHgxfSwgeworCTAsIDB4MH0KKwl9OworLyogU0RJTyBEcml2ZSBTdHJlbmd0aCB0byBzZWwgdmFsdWUgdGFibGUgZm9yIFBNVSBSZXYgOCAoMS44VikgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyIHNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjNbXSA9IHsKKwl7CisJMzIsIDB4N30sIHsKKwkyNiwgMHg2fSwgeworCTIyLCAweDV9LCB7CisJMTYsIDB4NH0sIHsKKwkxMiwgMHgzfSwgeworCTgsIDB4Mn0sIHsKKwk0LCAweDF9LCB7CisJMCwgMHgwfQorCX07CisKK3U4CiticmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KHN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKQoreworCXU4IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQlJDTUZfTUFYX0NPUkVOVU07IGlkeCsrKQorCQlpZiAoY29yZWlkID09IGNpLT5jX2luZltpZHhdLmlkKQorCQkJcmV0dXJuIGlkeDsKKworCXJldHVybiBCUkNNRl9NQVhfQ09SRU5VTTsKK30KKworc3RhdGljIHUzMgorYnJjbWZfc2Rpb19zYl9jb3JlcmV2KHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJICAgICAgc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTMyIHJlZ2RhdGE7CisJdTggaWR4OworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKKworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpZGhpZ2gpLCA0KTsKKwlyZXR1cm4gU0JDT1JFUkVWKHJlZ2RhdGEpOworfQorCitzdGF0aWMgdTMyCiticmNtZl9zZGlvX2FpX2NvcmVyZXYoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkgICAgICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTE2IGNvcmVpZCkKK3sKKwl1OCBpZHg7CisKKwlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGNpLCBjb3JlaWQpOworCisJcmV0dXJuIChjaS0+Y19pbmZbaWR4XS5jaWIgJiBDSUJfUkVWX01BU0spID4+IENJQl9SRVZfU0hJRlQ7Cit9CisKK3N0YXRpYyBib29sCiticmNtZl9zZGlvX3NiX2lzY29yZXVwKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJICAgICAgIHN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKQoreworCXUzMiByZWdkYXRhOworCXU4IGlkeDsKKworCWlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoY2ksIGNvcmVpZCk7CisKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOworCXJlZ2RhdGEgJj0gKFNTQl9UTVNMT1dfUkVTRVQgfCBTU0JfVE1TTE9XX1JFSkVDVCB8CisJCSAgICBTU0JfSU1TVEFURV9SRUpFQ1QgfCBTU0JfVE1TTE9XX0NMT0NLKTsKKwlyZXR1cm4gKFNTQl9UTVNMT1dfQ0xPQ0sgPT0gcmVnZGF0YSk7Cit9CisKK3N0YXRpYyBib29sCiticmNtZl9zZGlvX2FpX2lzY29yZXVwKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJICAgICAgIHN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKQoreworCXUzMiByZWdkYXRhOworCXU4IGlkeDsKKwlib29sIHJldDsKKworCWlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoY2ksIGNvcmVpZCk7CisKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJCWNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfSU9DVEwsIDQpOworCXJldCA9IChyZWdkYXRhICYgKEJDTUFfSU9DVExfRkdDIHwgQkNNQV9JT0NUTF9DTEspKSA9PSBCQ01BX0lPQ1RMX0NMSzsKKworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQkJY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9SRVNFVF9DVEwsCisJCQkJCTQpOworCXJldCA9IHJldCAmJiAoKHJlZ2RhdGEgJiBCQ01BX1JFU0VUX0NUTF9SRVNFVCkgPT0gMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorYnJjbWZfc2Rpb19zYl9jb3JlZGlzYWJsZShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQkgIHN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKQoreworCXUzMiByZWdkYXRhOworCXU4IGlkeDsKKworCWlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoY2ksIGNvcmVpZCk7CisKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJaWYgKHJlZ2RhdGEgJiBTU0JfVE1TTE9XX1JFU0VUKQorCQlyZXR1cm47CisKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJaWYgKChyZWdkYXRhICYgU1NCX1RNU0xPV19DTE9DSykgIT0gMCkgeworCQkvKgorCQkgKiBzZXQgdGFyZ2V0IHJlamVjdCBhbmQgc3BpbiB1bnRpbCBidXN5IGlzIGNsZWFyCisJCSAqIChwcmVzZXJ2ZSBjb3JlLXNwZWNpZmljIGJpdHMpCisJCSAqLworCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOworCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLAorCQkJCTQsIHJlZ2RhdGEgfCBTU0JfVE1TTE9XX1JFSkVDVCk7CisKKwkJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKKwkJdWRlbGF5KDEpOworCQlTUElOV0FJVCgoYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWhpZ2gpLCA0KSAmCisJCQlTU0JfVE1TSElHSF9CVVNZKSwgMTAwMDAwKTsKKworCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWhpZ2gpLCA0KTsKKwkJaWYgKHJlZ2RhdGEgJiBTU0JfVE1TSElHSF9CVVNZKQorCQkJYnJjbWZfZGJnKEVSUk9SLCAiY29yZSBzdGF0ZSBzdGlsbCBidXN5XG4iKTsKKworCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaWRsb3cpLCA0KTsKKwkJaWYgKHJlZ2RhdGEgJiBTU0JfSURMT1dfSU5JVElBVE9SKSB7CisJCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0KSB8CisJCQkJU1NCX0lNU1RBVEVfUkVKRUNUOworCQkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpbXN0YXRlKSwgNCwKKwkJCQlyZWdkYXRhKTsKKwkJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaW1zdGF0ZSksIDQpOworCQkJdWRlbGF5KDEpOworCQkJU1BJTldBSVQoKGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpbXN0YXRlKSwgNCkgJgorCQkJCVNTQl9JTVNUQVRFX0JVU1kpLCAxMDAwMDApOworCQl9CisKKwkJLyogc2V0IHJlc2V0IGFuZCByZWplY3Qgd2hpbGUgZW5hYmxpbmcgdGhlIGNsb2NrcyAqLworCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCisJCQkoU1NCX1RNU0xPV19GR0MgfCBTU0JfVE1TTE9XX0NMT0NLIHwKKwkJCVNTQl9UTVNMT1dfUkVKRUNUIHwgU1NCX1RNU0xPV19SRVNFVCkpOworCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOworCQl1ZGVsYXkoMTApOworCisJCS8qIGNsZWFyIHRoZSBpbml0aWF0b3IgcmVqZWN0IGJpdCAqLworCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaWRsb3cpLCA0KTsKKwkJaWYgKHJlZ2RhdGEgJiBTU0JfSURMT1dfSU5JVElBVE9SKSB7CisJCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0KSAmCisJCQkJflNTQl9JTVNUQVRFX1JFSkVDVDsKKwkJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaW1zdGF0ZSksIDQsCisJCQkJcmVnZGF0YSk7CisJCX0KKwl9CisKKwkvKiBsZWF2ZSByZXNldCBhbmQgcmVqZWN0IGFzc2VydGVkICovCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCisJCShTU0JfVE1TTE9XX1JFSkVDVCB8IFNTQl9UTVNMT1dfUkVTRVQpKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkCiticmNtZl9zZGlvX2FpX2NvcmVkaXNhYmxlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCSAgc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTggaWR4OworCXUzMiByZWdkYXRhOworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKKworCS8qIGlmIGNvcmUgaXMgYWxyZWFkeSBpbiByZXNldCwganVzdCByZXR1cm4gKi8KKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJCWNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfUkVTRVRfQ1RMLAorCQkJCQk0KTsKKwlpZiAoKHJlZ2RhdGEgJiBCQ01BX1JFU0VUX0NUTF9SRVNFVCkgIT0gMCkKKwkJcmV0dXJuOworCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LCBjaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX0lPQ1RMLAorCQkJICAgICAgIDQsIDApOworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQkJY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9JT0NUTCwgNCk7CisJdWRlbGF5KDEwKTsKKworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9SRVNFVF9DVEwsCisJCQkgICAgICAgNCwgQkNNQV9SRVNFVF9DVExfUkVTRVQpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQKK2JyY21mX3NkaW9fc2JfcmVzZXRjb3JlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCXN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKQoreworCXUzMiByZWdkYXRhOworCXU4IGlkeDsKKworCWlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoY2ksIGNvcmVpZCk7CisKKwkvKgorCSAqIE11c3QgZG8gdGhlIGRpc2FibGUgc2VxdWVuY2UgZmlyc3QgdG8gd29yayBmb3IKKwkgKiBhcmJpdHJhcnkgY3VycmVudCBjb3JlIHN0YXRlLgorCSAqLworCWJyY21mX3NkaW9fc2JfY29yZWRpc2FibGUoc2Rpb2RldiwgY2ksIGNvcmVpZCk7CisKKwkvKgorCSAqIE5vdyBkbyB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuCisJICogc2V0IHJlc2V0IHdoaWxlIGVuYWJsaW5nIHRoZSBjbG9jayBhbmQKKwkgKiBmb3JjaW5nIHRoZW0gb24gdGhyb3VnaG91dCB0aGUgY29yZQorCSAqLworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKKwkJCVNTQl9UTVNMT1dfRkdDIHwgU1NCX1RNU0xPV19DTE9DSyB8IFNTQl9UTVNMT1dfUkVTRVQpOworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOworCXVkZWxheSgxKTsKKworCS8qIGNsZWFyIGFueSBzZXJyb3IgKi8KKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCk7CisJaWYgKHJlZ2RhdGEgJiBTU0JfVE1TSElHSF9TRVJSKQorCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWhpZ2gpLCA0LCAwKTsKKworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaW1zdGF0ZSksIDQpOworCWlmIChyZWdkYXRhICYgKFNTQl9JTVNUQVRFX0lCRSB8IFNTQl9JTVNUQVRFX1RPKSkKKwkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0LAorCQkJcmVnZGF0YSAmIH4oU1NCX0lNU1RBVEVfSUJFIHwgU1NCX0lNU1RBVEVfVE8pKTsKKworCS8qIGNsZWFyIHJlc2V0IGFuZCBhbGxvdyBpdCB0byBwcm9wYWdhdGUgdGhyb3VnaG91dCB0aGUgY29yZSAqLworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0LAorCQlTU0JfVE1TTE9XX0ZHQyB8IFNTQl9UTVNMT1dfQ0xPQ0spOworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOworCXVkZWxheSgxKTsKKworCS8qIGxlYXZlIGNsb2NrIGVuYWJsZWQgKi8KKwlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCisJCQkgICAgICAgQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLAorCQkJICAgICAgIDQsIFNTQl9UTVNMT1dfQ0xPQ0spOworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQKK2JyY21mX3NkaW9fYWlfcmVzZXRjb3JlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCXN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKQoreworCXU4IGlkeDsKKwl1MzIgcmVnZGF0YTsKKworCWlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoY2ksIGNvcmVpZCk7CisKKwkvKiBtdXN0IGRpc2FibGUgZmlyc3QgdG8gd29yayBmb3IgYXJiaXRyYXJ5IGN1cnJlbnQgY29yZSBzdGF0ZSAqLworCWJyY21mX3NkaW9fYWlfY29yZWRpc2FibGUoc2Rpb2RldiwgY2ksIGNvcmVpZCk7CisKKwkvKiBub3cgZG8gaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgKi8KKwlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsIGNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfSU9DVEwsCisJCQkgICAgICAgNCwgQkNNQV9JT0NUTF9GR0MgfCBCQ01BX0lPQ1RMX0NMSyk7CisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCQljaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX0lPQ1RMLCA0KTsKKwlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsIGNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfUkVTRVRfQ1RMLAorCQkJICAgICAgIDQsIDApOworCXVkZWxheSgxKTsKKworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9JT0NUTCwKKwkJCSAgICAgICA0LCBCQ01BX0lPQ1RMX0NMSyk7CisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCQljaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX0lPQ1RMLCA0KTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyBpbnQgYnJjbWZfc2Rpb19jaGlwX3JlY29nbml0aW9uKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCQkgICAgICAgc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUzMiByZWdzKQoreworCXUzMiByZWdkYXRhOworCisJLyoKKwkgKiBHZXQgQ0MgY29yZSByZXYKKwkgKiBDaGlwaWQgaXMgYXNzdW1lIHRvIGJlIGF0IG9mZnNldCAwIGZyb20gcmVncyBhcmcKKwkgKiBGb3IgZGlmZmVyZW50IGNoaXB0eXBlcyBvciBvbGQgc2RpbyBob3N0cyB3L28gY2hpcGNvbW1vbiwKKwkgKiBvdGhlciB3YXlzIG9mIHJlY29nbml0aW9uIHNob3VsZCBiZSBhZGRlZCBoZXJlLgorCSAqLworCWNpLT5jX2luZlswXS5pZCA9IEJDTUFfQ09SRV9DSElQQ09NTU9OOworCWNpLT5jX2luZlswXS5iYXNlID0gcmVnczsKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQlDT1JFX0NDX1JFRyhjaS0+Y19pbmZbMF0uYmFzZSwgY2hpcGlkKSwgNCk7CisJY2ktPmNoaXAgPSByZWdkYXRhICYgQ0lEX0lEX01BU0s7CisJY2ktPmNoaXByZXYgPSAocmVnZGF0YSAmIENJRF9SRVZfTUFTSykgPj4gQ0lEX1JFVl9TSElGVDsKKwljaS0+c29jaXR5cGUgPSAocmVnZGF0YSAmIENJRF9UWVBFX01BU0spID4+IENJRF9UWVBFX1NISUZUOworCisJYnJjbWZfZGJnKElORk8sICJjaGlwaWQ9MHgleCBjaGlwcmV2PSVkXG4iLCBjaS0+Y2hpcCwgY2ktPmNoaXByZXYpOworCisJLyogQWRkcmVzcyBvZiBjb3JlcyBmb3IgbmV3IGNoaXBzIHNob3VsZCBiZSBhZGRlZCBoZXJlICovCisJc3dpdGNoIChjaS0+Y2hpcCkgeworCWNhc2UgQkNNNDMyOV9DSElQX0lEOgorCQljaS0+Y19pbmZbMV0uaWQgPSBCQ01BX0NPUkVfU0RJT19ERVY7CisJCWNpLT5jX2luZlsxXS5iYXNlID0gQkNNNDMyOV9DT1JFX0JVU19CQVNFOworCQljaS0+Y19pbmZbMl0uaWQgPSBCQ01BX0NPUkVfSU5URVJOQUxfTUVNOworCQljaS0+Y19pbmZbMl0uYmFzZSA9IEJDTTQzMjlfQ09SRV9TT0NSQU1fQkFTRTsKKwkJY2ktPmNfaW5mWzNdLmlkID0gQkNNQV9DT1JFX0FSTV9DTTM7CisJCWNpLT5jX2luZlszXS5iYXNlID0gQkNNNDMyOV9DT1JFX0FSTV9CQVNFOworCQljaS0+cmFtc2l6ZSA9IEJDTTQzMjlfUkFNU0laRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJjbWZfZGJnKEVSUk9SLCAiY2hpcGlkIDB4JXggaXMgbm90IHN1cHBvcnRlZFxuIiwgY2ktPmNoaXApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzd2l0Y2ggKGNpLT5zb2NpdHlwZSkgeworCWNhc2UgU09DSV9TQjoKKwkJY2ktPmlzY29yZXVwID0gYnJjbWZfc2Rpb19zYl9pc2NvcmV1cDsKKwkJY2ktPmNvcmVyZXYgPSBicmNtZl9zZGlvX3NiX2NvcmVyZXY7CisJCWNpLT5jb3JlZGlzYWJsZSA9IGJyY21mX3NkaW9fc2JfY29yZWRpc2FibGU7CisJCWNpLT5yZXNldGNvcmUgPSBicmNtZl9zZGlvX3NiX3Jlc2V0Y29yZTsKKwkJYnJlYWs7CisJY2FzZSBTT0NJX0FJOgorCQljaS0+aXNjb3JldXAgPSBicmNtZl9zZGlvX2FpX2lzY29yZXVwOworCQljaS0+Y29yZXJldiA9IGJyY21mX3NkaW9fYWlfY29yZXJldjsKKwkJY2ktPmNvcmVkaXNhYmxlID0gYnJjbWZfc2Rpb19haV9jb3JlZGlzYWJsZTsKKwkJY2ktPnJlc2V0Y29yZSA9IGJyY21mX3NkaW9fYWlfcmVzZXRjb3JlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmNtZl9kYmcoRVJST1IsICJzb2NpdHlwZSAldSBub3Qgc3VwcG9ydGVkXG4iLCBjaS0+c29jaXR5cGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYnJjbWZfc2Rpb19jaGlwX2J1c2NvcmVwcmVwKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKK3sKKwlpbnQgZXJyID0gMDsKKwl1OCBjbGt2YWwsIGNsa3NldDsKKworCS8qIFRyeSBmb3JjaW5nIFNESU8gY29yZSB0byBkbyBBTFBBdmFpbCByZXF1ZXN0IG9ubHkgKi8KKwljbGtzZXQgPSBTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRiB8IFNCU0RJT19BTFBfQVZBSUxfUkVROworCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoc2Rpb2RldiwgU0RJT19GVU5DXzEsCisJCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsCWNsa3NldCwgJmVycik7CisJaWYgKGVycikgeworCQlicmNtZl9kYmcoRVJST1IsICJlcnJvciB3cml0aW5nIGZvciBIVCBvZmZcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIElmIHJlZ2lzdGVyIHN1cHBvcnRlZCwgd2FpdCBmb3IgQUxQQXZhaWwgYW5kIHRoZW4gZm9yY2UgQUxQICovCisJLyogVGhpcyBtYXkgdGFrZSB1cCB0byAxNSBtaWxsaXNlY29uZHMgKi8KKwljbGt2YWwgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoc2Rpb2RldiwgU0RJT19GVU5DXzEsCisJCQkJICAgICAgIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCBOVUxMKTsKKworCWlmICgoY2xrdmFsICYgflNCU0RJT19BVkJJVFMpICE9IGNsa3NldCkgeworCQlicmNtZl9kYmcoRVJST1IsICJDaGlwQ2xrQ1NSIGFjY2Vzczogd3JvdGUgMHglMDJ4IHJlYWQgMHglMDJ4XG4iLAorCQkJICBjbGtzZXQsIGNsa3ZhbCk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCVNQSU5XQUlUKCgoY2xrdmFsID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKHNkaW9kZXYsIFNESU9fRlVOQ18xLAorCQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCBOVUxMKSksCisJCQkhU0JTRElPX0FMUEFWKGNsa3ZhbCkpLAorCQkJUE1VX01BWF9UUkFOU0lUSU9OX0RMWSk7CisJaWYgKCFTQlNESU9fQUxQQVYoY2xrdmFsKSkgeworCQlicmNtZl9kYmcoRVJST1IsICJ0aW1lb3V0IG9uIEFMUEFWIHdhaXQsIGNsa3ZhbCAweCUwMnhcbiIsCisJCQkgIGNsa3ZhbCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJY2xrc2V0ID0gU0JTRElPX0ZPUkNFX0hXX0NMS1JFUV9PRkYgfCBTQlNESU9fRk9SQ0VfQUxQOworCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoc2Rpb2RldiwgU0RJT19GVU5DXzEsCisJCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsIGNsa3NldCwgJmVycik7CisJdWRlbGF5KDY1KTsKKworCS8qIEFsc28sIGRpc2FibGUgdGhlIGV4dHJhIFNESU8gcHVsbC11cHMgKi8KKwlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKHNkaW9kZXYsIFNESU9fRlVOQ18xLAorCQkJICAgICAgIFNCU0RJT19GVU5DMV9TRElPUFVMTFVQLCAwLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYnJjbWZfc2Rpb19jaGlwX2J1c2NvcmVzZXR1cChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQkgICAgIHN0cnVjdCBjaGlwX2luZm8gKmNpKQoreworCS8qIGdldCBjaGlwY29tbW9uIHJldiAqLworCWNpLT5jX2luZlswXS5yZXYgPSBjaS0+Y29yZXJldihzZGlvZGV2LCBjaSwgY2ktPmNfaW5mWzBdLmlkKTsKKworCS8qIGdldCBjaGlwY29tbW9uIGNhcGFiaWxpdGVzICovCisJY2ktPmNfaW5mWzBdLmNhcHMgPQorCQlicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJQ09SRV9DQ19SRUcoY2ktPmNfaW5mWzBdLmJhc2UsIGNhcGFiaWxpdGllcyksIDQpOworCisJLyogZ2V0IHBtdSBjYXBzICYgcmV2ICovCisJaWYgKGNpLT5jX2luZlswXS5jYXBzICYgQ0NfQ0FQX1BNVSkgeworCQljaS0+cG11Y2FwcyA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJQ09SRV9DQ19SRUcoY2ktPmNfaW5mWzBdLmJhc2UsIHBtdWNhcGFiaWxpdGllcyksIDQpOworCQljaS0+cG11cmV2ID0gY2ktPnBtdWNhcHMgJiBQQ0FQX1JFVl9NQVNLOworCX0KKworCWNpLT5jX2luZlsxXS5yZXYgPSBjaS0+Y29yZXJldihzZGlvZGV2LCBjaSwgY2ktPmNfaW5mWzFdLmlkKTsKKworCWJyY21mX2RiZyhJTkZPLCAiY2NyZXY9JWQsIHBtdXJldj0lZCwgYnVzY29yZSByZXYvdHlwZT0lZC8weCV4XG4iLAorCQkgIGNpLT5jX2luZlswXS5yZXYsIGNpLT5wbXVyZXYsCisJCSAgY2ktPmNfaW5mWzFdLnJldiwgY2ktPmNfaW5mWzFdLmlkKTsKKworCS8qCisJICogTWFrZSBzdXJlIGFueSBvbi1jaGlwIEFSTSBpcyBvZmYgKGluIGNhc2Ugc3RyYXBwaW5nIGlzIHdyb25nKSwKKwkgKiBvciBkb3dubG9hZGVkIGNvZGUgd2FzIGFscmVhZHkgcnVubmluZy4KKwkgKi8KKwljaS0+Y29yZWRpc2FibGUoc2Rpb2RldiwgY2ksIEJDTUFfQ09SRV9BUk1fQ00zKTsKK30KKworaW50IGJyY21mX3NkaW9fY2hpcF9hdHRhY2goc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJICAgc3RydWN0IGNoaXBfaW5mbyAqKmNpX3B0ciwgdTMyIHJlZ3MpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2hpcF9pbmZvICpjaTsKKworCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKKworCS8qIGFsbG9jIGNoaXBfaW5mb190ICovCisJY2kgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hpcF9pbmZvKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBicmNtZl9zZGlvX2NoaXBfYnVzY29yZXByZXAoc2Rpb2Rldik7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGVycjsKKworCXJldCA9IGJyY21mX3NkaW9fY2hpcF9yZWNvZ25pdGlvbihzZGlvZGV2LCBjaSwgcmVncyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGVycjsKKworCWJyY21mX3NkaW9fY2hpcF9idXNjb3Jlc2V0dXAoc2Rpb2RldiwgY2kpOworCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQlDT1JFX0NDX1JFRyhjaS0+Y19pbmZbMF0uYmFzZSwgZ3Bpb3B1bGx1cCksIDQsIDApOworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJQ09SRV9DQ19SRUcoY2ktPmNfaW5mWzBdLmJhc2UsIGdwaW9wdWxsZG93biksIDQsIDApOworCisJKmNpX3B0ciA9IGNpOworCXJldHVybiAwOworCitlcnI6CisJa2ZyZWUoY2kpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2JyY21mX3NkaW9fY2hpcF9kZXRhY2goc3RydWN0IGNoaXBfaW5mbyAqKmNpX3B0cikKK3sKKwlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CisKKwlrZnJlZSgqY2lfcHRyKTsKKwkqY2lfcHRyID0gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKmJyY21mX3NkaW9fY2hpcF9uYW1lKHVpbnQgY2hpcGlkLCBjaGFyICpidWYsIHVpbnQgbGVuKQoreworCWNvbnN0IGNoYXIgKmZtdDsKKworCWZtdCA9ICgoY2hpcGlkID4gMHhhMDAwKSB8fCAoY2hpcGlkIDwgMHg0MDAwKSkgPyAiJWQiIDogIiV4IjsKKwlzbnByaW50ZihidWYsIGxlbiwgZm10LCBjaGlwaWQpOworCXJldHVybiBidWY7Cit9CisKK3ZvaWQKK2JyY21mX3NkaW9fY2hpcF9kcml2ZXN0cmVuZ3RoaW5pdChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQkJICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTMyIGRyaXZlc3RyZW5ndGgpCit7CisJc3RydWN0IHNkaW9kX2RyaXZlX3N0ciAqc3RyX3RhYiA9IE5VTEw7CisJdTMyIHN0cl9tYXNrID0gMDsKKwl1MzIgc3RyX3NoaWZ0ID0gMDsKKwljaGFyIGNobls4XTsKKworCWlmICghKGNpLT5jX2luZlswXS5jYXBzICYgQ0NfQ0FQX1BNVSkpCisJCXJldHVybjsKKworCXN3aXRjaCAoU0RJT0RfRFJWU1RSX0tFWShjaS0+Y2hpcCwgY2ktPnBtdXJldikpIHsKKwljYXNlIFNESU9EX0RSVlNUUl9LRVkoQkNNNDMyNV9DSElQX0lELCAxKToKKwkJc3RyX3RhYiA9IChzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyICopJnNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjE7CisJCXN0cl9tYXNrID0gMHgzMDAwMDAwMDsKKwkJc3RyX3NoaWZ0ID0gMjg7CisJCWJyZWFrOworCWNhc2UgU0RJT0RfRFJWU1RSX0tFWShCQ000MzI1X0NISVBfSUQsIDIpOgorCWNhc2UgU0RJT0RfRFJWU1RSX0tFWShCQ000MzI1X0NISVBfSUQsIDMpOgorCQlzdHJfdGFiID0gKHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgKikmc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiMjsKKwkJc3RyX21hc2sgPSAweDAwMDAzODAwOworCQlzdHJfc2hpZnQgPSAxMTsKKwkJYnJlYWs7CisJY2FzZSBTRElPRF9EUlZTVFJfS0VZKEJDTTQzMzZfQ0hJUF9JRCwgOCk6CisJCXN0cl90YWIgPSAoc3RydWN0IHNkaW9kX2RyaXZlX3N0ciAqKSZzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIzOworCQlzdHJfbWFzayA9IDB4MDAwMDM4MDA7CisJCXN0cl9zaGlmdCA9IDExOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmNtZl9kYmcoRVJST1IsICJObyBTRElPIERyaXZlIHN0cmVuZ3RoIGluaXQgZG9uZSBmb3IgY2hpcCAlcyByZXYgJWQgcG11cmV2ICVkXG4iLAorCQkJICBicmNtZl9zZGlvX2NoaXBfbmFtZShjaS0+Y2hpcCwgY2huLCA4KSwKKwkJCSAgY2ktPmNoaXByZXYsIGNpLT5wbXVyZXYpOworCQlicmVhazsKKwl9CisKKwlpZiAoc3RyX3RhYiAhPSBOVUxMKSB7CisJCXUzMiBkcml2ZXN0cmVuZ3RoX3NlbCA9IDA7CisJCXUzMiBjY19kYXRhX3RlbXA7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IHN0cl90YWJbaV0uc3RyZW5ndGggIT0gMDsgaSsrKSB7CisJCQlpZiAoZHJpdmVzdHJlbmd0aCA+PSBzdHJfdGFiW2ldLnN0cmVuZ3RoKSB7CisJCQkJZHJpdmVzdHJlbmd0aF9zZWwgPSBzdHJfdGFiW2ldLnNlbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJCUNPUkVfQ0NfUkVHKGNpLT5jX2luZlswXS5iYXNlLCBjaGlwY29udHJvbF9hZGRyKSwKKwkJCTQsIDEpOworCQljY19kYXRhX3RlbXAgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfQ0NfUkVHKGNpLT5jX2luZlswXS5iYXNlLCBjaGlwY29udHJvbF9hZGRyKSwgNCk7CisJCWNjX2RhdGFfdGVtcCAmPSB+c3RyX21hc2s7CisJCWRyaXZlc3RyZW5ndGhfc2VsIDw8PSBzdHJfc2hpZnQ7CisJCWNjX2RhdGFfdGVtcCB8PSBkcml2ZXN0cmVuZ3RoX3NlbDsKKwkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQkJQ09SRV9DQ19SRUcoY2ktPmNfaW5mWzBdLmJhc2UsIGNoaXBjb250cm9sX2FkZHIpLAorCQkJNCwgY2NfZGF0YV90ZW1wKTsKKworCQlicmNtZl9kYmcoSU5GTywgIlNESU86ICVkbUEgZHJpdmUgc3RyZW5ndGggc2VsZWN0ZWQsIHNldCB0byAweCUwOHhcbiIsCisJCQkgIGRyaXZlc3RyZW5ndGgsIGNjX2RhdGFfdGVtcCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9fY2hpcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9fY2hpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTc0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19jaGlwLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9CUkNNRk1BQ19TRElPX0NISVBfSF8KKyNkZWZpbmUgX0JSQ01GTUFDX1NESU9fQ0hJUF9IXworCisvKgorICogQ29yZSByZWcgYWRkcmVzcyB0cmFuc2xhdGlvbi4KKyAqIEJvdGggbWFjcm8ncyByZXR1cm5zIGEgMzIgYml0cyBieXRlIGFkZHJlc3Mgb24gdGhlIGJhY2twbGFuZSBidXMuCisgKi8KKyNkZWZpbmUgQ09SRV9DQ19SRUcoYmFzZSwgZmllbGQpIFwKKwkJKGJhc2UgKyBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBmaWVsZCkpCisjZGVmaW5lIENPUkVfQlVTX1JFRyhiYXNlLCBmaWVsZCkgXAorCQkoYmFzZSArIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgZmllbGQpKQorI2RlZmluZSBDT1JFX1NCKGJhc2UsIGZpZWxkKSBcCisJCShiYXNlICsgU0JDT05GSUdPRkYgKyBvZmZzZXRvZihzdHJ1Y3Qgc2Jjb25maWcsIGZpZWxkKSkKKworLyogU0RJTyBmdW5jdGlvbiAxIHJlZ2lzdGVyIENISVBDTEtDU1IgKi8KKy8qIEZvcmNlIEFMUCByZXF1ZXN0IHRvIGJhY2twbGFuZSAqLworI2RlZmluZSBTQlNESU9fRk9SQ0VfQUxQCQkweDAxCisvKiBGb3JjZSBIVCByZXF1ZXN0IHRvIGJhY2twbGFuZSAqLworI2RlZmluZSBTQlNESU9fRk9SQ0VfSFQJCQkweDAyCisvKiBGb3JjZSBJTFAgcmVxdWVzdCB0byBiYWNrcGxhbmUgKi8KKyNkZWZpbmUgU0JTRElPX0ZPUkNFX0lMUAkJMHgwNAorLyogTWFrZSBBTFAgcmVhZHkgKHBvd2VyIHVwIHh0YWwpICovCisjZGVmaW5lIFNCU0RJT19BTFBfQVZBSUxfUkVRCQkweDA4CisvKiBNYWtlIEhUIHJlYWR5IChwb3dlciB1cCBQTEwpICovCisjZGVmaW5lIFNCU0RJT19IVF9BVkFJTF9SRVEJCTB4MTAKKy8qIFNxdWVsY2ggY2xvY2sgcmVxdWVzdHMgZnJvbSBIVyAqLworI2RlZmluZSBTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRgkweDIwCisvKiBTdGF0dXM6IEFMUCBpcyByZWFkeSAqLworI2RlZmluZSBTQlNESU9fQUxQX0FWQUlMCQkweDQwCisvKiBTdGF0dXM6IEhUIGlzIHJlYWR5ICovCisjZGVmaW5lIFNCU0RJT19IVF9BVkFJTAkJCTB4ODAKKyNkZWZpbmUgU0JTRElPX0FWQklUUwkJKFNCU0RJT19IVF9BVkFJTCB8IFNCU0RJT19BTFBfQVZBSUwpCisjZGVmaW5lIFNCU0RJT19BTFBBVihyZWd2YWwpCSgocmVndmFsKSAmIFNCU0RJT19BVkJJVFMpCisjZGVmaW5lIFNCU0RJT19IVEFWKHJlZ3ZhbCkJKCgocmVndmFsKSAmIFNCU0RJT19BVkJJVFMpID09IFNCU0RJT19BVkJJVFMpCisjZGVmaW5lIFNCU0RJT19BTFBPTkxZKHJlZ3ZhbCkJKFNCU0RJT19BTFBBVihyZWd2YWwpICYmICFTQlNESU9fSFRBVihyZWd2YWwpKQorI2RlZmluZSBTQlNESU9fQ0xLQVYocmVndmFsLCBhbHBvbmx5KSBcCisJKFNCU0RJT19BTFBBVihyZWd2YWwpICYmIChhbHBvbmx5ID8gMSA6IFNCU0RJT19IVEFWKHJlZ3ZhbCkpKQorCisjZGVmaW5lIEJSQ01GX01BWF9DT1JFTlVNCTYKKworc3RydWN0IGNoaXBfY29yZV9pbmZvIHsKKwl1MTYgaWQ7CisJdTE2IHJldjsKKwl1MzIgYmFzZTsKKwl1MzIgd3JhcGJhc2U7CisJdTMyIGNhcHM7CisJdTMyIGNpYjsKK307CisKK3N0cnVjdCBjaGlwX2luZm8geworCXUzMiBjaGlwOworCXUzMiBjaGlwcmV2OworCXUzMiBzb2NpdHlwZTsKKwkvKiBjb3JlIGluZm8gKi8KKwkvKiBhbHdheXMgcHV0IGNoaXBjb21tb24gY29yZSBhdCAwLCBidXMgY29yZSBhdCAxICovCisJc3RydWN0IGNoaXBfY29yZV9pbmZvIGNfaW5mW0JSQ01GX01BWF9DT1JFTlVNXTsKKwl1MzIgcG11cmV2OworCXUzMiBwbXVjYXBzOworCXUzMiByYW1zaXplOworCisJYm9vbCAoKmlzY29yZXVwKShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHN0cnVjdCBjaGlwX2luZm8gKmNpLAorCQkJIHUxNiBjb3JlaWQpOworCXUzMiAoKmNvcmVyZXYpKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2Rldiwgc3RydWN0IGNoaXBfaW5mbyAqY2ksCisJCQkgdTE2IGNvcmVpZCk7CisJdm9pZCAoKmNvcmVkaXNhYmxlKShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQlzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTE2IGNvcmVpZCk7CisJdm9pZCAoKnJlc2V0Y29yZSkoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpOworfTsKKworc3RydWN0IHNiY29uZmlnIHsKKwl1MzIgUEFEWzJdOworCXUzMiBzYmlwc2ZsYWc7CS8qIGluaXRpYXRvciBwb3J0IG9jcCBzbGF2ZSBmbGFnICovCisJdTMyIFBBRFszXTsKKwl1MzIgc2J0cHNmbGFnOwkvKiB0YXJnZXQgcG9ydCBvY3Agc2xhdmUgZmxhZyAqLworCXUzMiBQQURbMTFdOworCXUzMiBzYnRtZXJybG9nYTsJLyogKHNvbmljcyA+PSAyLjMpICovCisJdTMyIFBBRDsKKwl1MzIgc2J0bWVycmxvZzsJLyogKHNvbmljcyA+PSAyLjMpICovCisJdTMyIFBBRFszXTsKKwl1MzIgc2JhZG1hdGNoMzsJLyogYWRkcmVzcyBtYXRjaDMgKi8KKwl1MzIgUEFEOworCXUzMiBzYmFkbWF0Y2gyOwkvKiBhZGRyZXNzIG1hdGNoMiAqLworCXUzMiBQQUQ7CisJdTMyIHNiYWRtYXRjaDE7CS8qIGFkZHJlc3MgbWF0Y2gxICovCisJdTMyIFBBRFs3XTsKKwl1MzIgc2JpbXN0YXRlOwkvKiBpbml0aWF0b3IgYWdlbnQgc3RhdGUgKi8KKwl1MzIgc2JpbnR2ZWM7CS8qIGludGVycnVwdCBtYXNrICovCisJdTMyIHNidG1zdGF0ZWxvdzsJLyogdGFyZ2V0IHN0YXRlICovCisJdTMyIHNidG1zdGF0ZWhpZ2g7CS8qIHRhcmdldCBzdGF0ZSAqLworCXUzMiBzYmJ3YTA7CQkvKiBiYW5kd2lkdGggYWxsb2NhdGlvbiB0YWJsZTAgKi8KKwl1MzIgUEFEOworCXUzMiBzYmltY29uZmlnbG93OwkvKiBpbml0aWF0b3IgY29uZmlndXJhdGlvbiAqLworCXUzMiBzYmltY29uZmlnaGlnaDsJLyogaW5pdGlhdG9yIGNvbmZpZ3VyYXRpb24gKi8KKwl1MzIgc2JhZG1hdGNoMDsJLyogYWRkcmVzcyBtYXRjaDAgKi8KKwl1MzIgUEFEOworCXUzMiBzYnRtY29uZmlnbG93OwkvKiB0YXJnZXQgY29uZmlndXJhdGlvbiAqLworCXUzMiBzYnRtY29uZmlnaGlnaDsJLyogdGFyZ2V0IGNvbmZpZ3VyYXRpb24gKi8KKwl1MzIgc2JiY29uZmlnOwkvKiBicm9hZGNhc3QgY29uZmlndXJhdGlvbiAqLworCXUzMiBQQUQ7CisJdTMyIHNiYnN0YXRlOwkvKiBicm9hZGNhc3Qgc3RhdGUgKi8KKwl1MzIgUEFEWzNdOworCXUzMiBzYmFjdGNuZmc7CS8qIGFjdGl2YXRlIGNvbmZpZ3VyYXRpb24gKi8KKwl1MzIgUEFEWzNdOworCXUzMiBzYmZsYWdzdDsJLyogY3VycmVudCBzYmZsYWdzICovCisJdTMyIFBBRFszXTsKKwl1MzIgc2JpZGxvdzsJCS8qIGlkZW50aWZpY2F0aW9uICovCisJdTMyIHNiaWRoaWdoOwkvKiBpZGVudGlmaWNhdGlvbiAqLworfTsKKworZXh0ZXJuIGludCBicmNtZl9zZGlvX2NoaXBfYXR0YWNoKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCQkgIHN0cnVjdCBjaGlwX2luZm8gKipjaV9wdHIsIHUzMiByZWdzKTsKK2V4dGVybiB2b2lkIGJyY21mX3NkaW9fY2hpcF9kZXRhY2goc3RydWN0IGNoaXBfaW5mbyAqKmNpX3B0cik7CitleHRlcm4gdm9pZCBicmNtZl9zZGlvX2NoaXBfZHJpdmVzdHJlbmd0aGluaXQoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwKKwkJCQkJICAgICAgdTMyIGRyaXZlc3RyZW5ndGgpOworZXh0ZXJuIHU4IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpOworCisKKyNlbmRpZgkJLyogX0JSQ01GTUFDX1NESU9fQ0hJUF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9faG9zdC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9faG9zdC5oCmluZGV4IDcyNmZhODkuLmM0YzI1NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvX2hvc3QuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19ob3N0LmgKQEAgLTEzMiw5ICsxMzIsOSBAQAogCWF0b21pY190IHN1c3BlbmQ7CQkvKiBzdXNwZW5kIGZsYWcgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCByZXF1ZXN0X2J5dGVfd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCByZXF1ZXN0X3dvcmRfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZXF1ZXN0X3BhY2tldF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IHJlcXVlc3RfY2hhaW5fd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCByZXF1ZXN0X2J1ZmZlcl93YWl0OwotCisJc3RydWN0IGRldmljZSAqZGV2OwogfTsKIAogLyogUmVnaXN0ZXIvZGVyZWdpc3RlciBkZXZpY2UgaW50ZXJydXB0IGhhbmRsZXIuICovCkBAIC0xODIsMTEgKzE4MiwyMSBAQAogICogTk9URTogQXN5bmMgb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgogICovCiBleHRlcm4gaW50CiticmNtZl9zZGNhcmRfc2VuZF9wa3Qoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKKwkJICAgICAgdWludCBmbGFncywgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CitleHRlcm4gaW50CiBicmNtZl9zZGNhcmRfc2VuZF9idWYoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKLQkJICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHN0cnVjdCBza19idWZmICpwa3QpOworCQkgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcyk7CisKK2V4dGVybiBpbnQKK2JyY21mX3NkY2FyZF9yZWN2X3BrdChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAorCQkgICAgICB1aW50IGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKIGV4dGVybiBpbnQKIGJyY21mX3NkY2FyZF9yZWN2X2J1ZihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAotCQkgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CisJCSAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzKTsKK2V4dGVybiBpbnQKK2JyY21mX3NkY2FyZF9yZWN2X2NoYWluKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCisJCQl1aW50IGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpwa3RxKTsKIAogLyogRmxhZ3MgYml0cyAqLwogCkBAIC0yMzcsMTYgKzI0NywxOCBAQAogLyogcmVhZCBvciB3cml0ZSBhbnkgYnVmZmVyIHVzaW5nIGNtZDUzICovCiBleHRlcm4gaW50CiBicmNtZl9zZGlvaF9yZXF1ZXN0X2J1ZmZlcihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCi0JCQkgICB1aW50IGZpeF9pbmMsIHVpbnQgcncsIHVpbnQgZm5jX251bSwKLQkJCSAgIHUzMiBhZGRyLCB1aW50IHJlZ3dpZHRoLAotCQkJICAgdTMyIGJ1ZmxlbiwgdTggKmJ1ZmZlciwgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CisJCQkgICB1aW50IGZpeF9pbmMsIHVpbnQgcncsIHVpbnQgZm5jX251bSwgdTMyIGFkZHIsCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKK2V4dGVybiBpbnQKK2JyY21mX3NkaW9oX3JlcXVlc3RfY2hhaW4oc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IGZpeF9pbmMsCisJCQkgIHVpbnQgd3JpdGUsIHVpbnQgZnVuYywgdWludCBhZGRyLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpwa3RxKTsKIAogLyogV2F0Y2hkb2cgdGltZXIgaW50ZXJmYWNlIGZvciBwbSBvcHMgKi8KIGV4dGVybiB2b2lkIGJyY21mX3NkaW9fd2R0bXJfZW5hYmxlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKIAkJCQkgICAgYm9vbCBlbmFibGUpOwogCi1leHRlcm4gdm9pZCAqYnJjbWZfc2RicmNtX3Byb2JlKHUxNiBidXNfbm8sIHUxNiBzbG90LCB1MTYgZnVuYywgdWludCBidXN0eXBlLAotCQkJCXUzMiByZWdzdmEsIHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2Rldik7CitleHRlcm4gdm9pZCAqYnJjbWZfc2RicmNtX3Byb2JlKHUzMiByZWdzdmEsIHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2Rldik7CiBleHRlcm4gdm9pZCBicmNtZl9zZGJyY21fZGlzY29ubmVjdCh2b2lkICpwdHIpOwogZXh0ZXJuIHZvaWQgYnJjbWZfc2RicmNtX2lzcih2b2lkICphcmcpOwogI2VuZGlmCQkJCS8qIF9CUkNNX1NESF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYwppbmRleCA1ZWRkYWJlLi5mMjNiMGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYwpAQCAtMTQyOSw3ICsxNDI5LDcgQEAKIAogc3RhdGljIHMzMgogYnJjbWZfY2ZnODAyMTFfc2V0X3R4X3Bvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkgZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZSwgczMyIGRibSkKKwkJCSAgICBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBzMzIgbWJtKQogewogCiAJc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gd2lwaHlfdG9fY2ZnKHdpcGh5KTsKQEAgLTE0MzcsNiArMTQzNyw3IEBACiAJdTE2IHR4cHdybXc7CiAJczMyIGVyciA9IDA7CiAJczMyIGRpc2FibGUgPSAwOworCXMzMiBkYm0gPSBNQk1fVE9fREJNKG1ibSk7CiAKIAlXTF9UUkFDRSgiRW50ZXJcbiIpOwogCWlmICghY2hlY2tfc3lzX3VwKHdpcGh5KSkKQEAgLTE0NDYsMTIgKzE0NDcsNiBAQAogCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUM6CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9MSU1JVEVEOgotCQlpZiAoZGJtIDwgMCkgewotCQkJV0xfRVJSKCJUWF9QT1dFUl9MSU1JVEVEIC0gZGJtIGlzIG5lZ2F0aXZlXG4iKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX1RYX1BPV0VSX0ZJWEVEOgogCQlpZiAoZGJtIDwgMCkgewogCQkJV0xfRVJSKCJUWF9QT1dFUl9GSVhFRCAtIGRibSBpcyBuZWdhdGl2ZVxuIik7CkBAIC0xOTk3LDcgKzE5OTIsNyBAQAogfQogCiBzdGF0aWMgczMyIGJyY21mX2luZm9ybV9zaW5nbGVfYnNzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCQkgICBzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKmJpKQorCQkJCSAgIHN0cnVjdCBicmNtZl9ic3NfaW5mb19sZSAqYmkpCiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGNmZ190b193aXBoeShjZmdfcHJpdik7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpub3RpZnlfY2hhbm5lbDsKQEAgLTIwNDksMTggKzIwNDQsMjcgQEAKIAkJbm90aWZ5X3RpbWVzdGFtcCwgbm90aWZ5X2NhcGFiaWxpdHksIG5vdGlmeV9pbnRlcnZhbCwgbm90aWZ5X2llLAogCQlub3RpZnlfaWVsZW4sIG5vdGlmeV9zaWduYWwsIEdGUF9LRVJORUwpOwogCi0JaWYgKCFic3MpIHsKLQkJV0xfRVJSKCJjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lIGVycm9yXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWlmICghYnNzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKIAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKgorbmV4dF9ic3NfbGUoc3RydWN0IGJyY21mX3NjYW5fcmVzdWx0cyAqbGlzdCwgc3RydWN0IGJyY21mX2Jzc19pbmZvX2xlICpic3MpCit7CisJaWYgKGJzcyA9PSBOVUxMKQorCQlyZXR1cm4gbGlzdC0+YnNzX2luZm9fbGU7CisJcmV0dXJuIChzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKikoKHVuc2lnbmVkIGxvbmcpYnNzICsKKwkJCQkJICAgIGxlMzJfdG9fY3B1KGJzcy0+bGVuZ3RoKSk7Cit9CisKIHN0YXRpYyBzMzIgYnJjbWZfaW5mb3JtX2JzcyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCiB7CiAJc3RydWN0IGJyY21mX3NjYW5fcmVzdWx0cyAqYnNzX2xpc3Q7Ci0Jc3RydWN0IGJyY21mX2Jzc19pbmZvICpiaSA9IE5VTEw7CS8qIG11c3QgYmUgaW5pdGlhbGl6ZWQgKi8KKwlzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKmJpID0gTlVMTDsJLyogbXVzdCBiZSBpbml0aWFsaXplZCAqLwogCXMzMiBlcnIgPSAwOwogCWludCBpOwogCkBAIC0yMDcyLDcgKzIwNzYsNyBAQAogCX0KIAlXTF9TQ0FOKCJzY2FubmVkIEFQIGNvdW50ICglZClcbiIsIGJzc19saXN0LT5jb3VudCk7CiAJZm9yIChpID0gMDsgaSA8IGJzc19saXN0LT5jb3VudCAmJiBpIDwgV0xfQVBfTUFYOyBpKyspIHsKLQkJYmkgPSBuZXh0X2Jzcyhic3NfbGlzdCwgYmkpOworCQliaSA9IG5leHRfYnNzX2xlKGJzc19saXN0LCBiaSk7CiAJCWVyciA9IGJyY21mX2luZm9ybV9zaW5nbGVfYnNzKGNmZ19wcml2LCBiaSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKQEAgLTIwODUsOCArMjA4OSw5IEBACiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGNmZ190b193aXBoeShjZmdfcHJpdik7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpub3RpZnlfY2hhbm5lbDsKLQlzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKmJpID0gTlVMTDsKKwlzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKmJpID0gTlVMTDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiYW5kOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAl1OCAqYnVmID0gTlVMTDsKIAlzMzIgZXJyID0gMDsKIAl1MTYgY2hhbm5lbDsKQEAgLTIxMTQsNyArMjExOSw3IEBACiAJCWdvdG8gQ2xlYW5VcDsKIAl9CiAKLQliaSA9IChzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKikoYnVmICsgNCk7CisJYmkgPSAoc3RydWN0IGJyY21mX2Jzc19pbmZvX2xlICopKGJ1ZiArIDQpOwogCiAJY2hhbm5lbCA9IGJpLT5jdGxfY2ggPyBiaS0+Y3RsX2NoIDoKIAkJCQlDSFNQRUNfQ0hBTk5FTChsZTE2X3RvX2NwdShiaS0+Y2hhbnNwZWMpKTsKQEAgLTIxNDAsMTAgKzIxNDUsMTcgQEAKIAlXTF9DT05OKCJzaWduYWw6ICVkXG4iLCBub3RpZnlfc2lnbmFsKTsKIAlXTF9DT05OKCJub3RpZnlfdGltZXN0YW1wOiAlIzAxOGxseFxuIiwgbm90aWZ5X3RpbWVzdGFtcCk7CiAKLQljZmc4MDIxMV9pbmZvcm1fYnNzKHdpcGh5LCBub3RpZnlfY2hhbm5lbCwgYnNzaWQsCisJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwgbm90aWZ5X2NoYW5uZWwsIGJzc2lkLAogCQlub3RpZnlfdGltZXN0YW1wLCBub3RpZnlfY2FwYWJpbGl0eSwgbm90aWZ5X2ludGVydmFsLAogCQlub3RpZnlfaWUsIG5vdGlmeV9pZWxlbiwgbm90aWZ5X3NpZ25hbCwgR0ZQX0tFUk5FTCk7CiAKKwlpZiAoIWJzcykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIENsZWFuVXA7CisJfQorCisJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOworCiBDbGVhblVwOgogCiAJa2ZyZWUoYnVmKTsKQEAgLTIxODgsNyArMjIwMCw3IEBACiAKIHN0YXRpYyBzMzIgYnJjbWZfdXBkYXRlX2Jzc19pbmZvKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKIHsKLQlzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKmJpOworCXN0cnVjdCBicmNtZl9ic3NfaW5mb19sZSAqYmk7CiAJc3RydWN0IGJyY21mX3NzaWQgKnNzaWQ7CiAJc3RydWN0IGJyY21mX3RsdiAqdGltOwogCXUxNiBiZWFjb25faW50ZXJ2YWw7CkBAIC0yMjExLDcgKzIyMjMsNyBAQAogCQlnb3RvIHVwZGF0ZV9ic3NfaW5mb19vdXQ7CiAJfQogCi0JYmkgPSAoc3RydWN0IGJyY21mX2Jzc19pbmZvICopKGNmZ19wcml2LT5leHRyYV9idWYgKyA0KTsKKwliaSA9IChzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKikoY2ZnX3ByaXYtPmV4dHJhX2J1ZiArIDQpOwogCWVyciA9IGJyY21mX2luZm9ybV9zaW5nbGVfYnNzKGNmZ19wcml2LCBiaSk7CiAJaWYgKGVycikKIAkJZ290byB1cGRhdGVfYnNzX2luZm9fb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaAppbmRleCA2MmRjNDYxLi5hNjEzYjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaApAQCAtMzUyLDE1ICszNTIsNiBAQAogCXJldHVybiAmY2ZnLT5jb25uX2luZm87CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJyY21mX2Jzc19pbmZvICpuZXh0X2JzcyhzdHJ1Y3QgYnJjbWZfc2Nhbl9yZXN1bHRzICpsaXN0LAotCQkJCQkgICBzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKmJzcykKLXsKLQlyZXR1cm4gYnNzID0gYnNzID8KLQkJKHN0cnVjdCBicmNtZl9ic3NfaW5mbyAqKSgodW5zaWduZWQgbG9uZylic3MgKwotCQkJCSAgICAgICBsZTMyX3RvX2NwdShic3MtPmxlbmd0aCkpIDoKLQkJbGlzdC0+YnNzX2luZm87Ci19Ci0KIGV4dGVybiBzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZGV2ICpicmNtZl9jZmc4MDIxMV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkJCQkJc3RydWN0IGRldmljZSAqYnVzZGV2LAogCQkJCQkJCXZvaWQgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9haXV0aWxzLmMKaW5kZXggMDI1ZmEwZS4uMzllMzA1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYWl1dGlscy5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKiBGaWxlIGNvbnRlbnRzOiBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgUENJL1BDSWUKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCkBAIC0zNDksOSArMzUxLDkgQEAKICNkZWZpbmUgUENJX0ZPUkNFSFQoc2kpCShQQ0lFKHNpKSAmJiAoc2ktPnB1Yi5jaGlwID09IEJDTTQ3MTZfQ0hJUF9JRCkpCiAKICNpZmRlZiBCQ01EQkcKLSNkZWZpbmUJU0lfTVNHKGFyZ3MpCXByaW50ayBhcmdzCisjZGVmaW5lCVNJX01TRyhmbXQsIC4uLikJcHJfZGVidWcoZm10LCAjI19fVkFfQVJHU19fKQogI2Vsc2UKLSNkZWZpbmUJU0lfTVNHKGFyZ3MpCisjZGVmaW5lCVNJX01TRyhmbXQsIC4uLikJbm9fcHJpbnRrKGZtdCwgIyNfX1ZBX0FSR1NfXykKICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAogI2RlZmluZQlHT09EQ09SRUFERFIoeCwgYikgXApAQCAtMTA3Myw3ICsxMDc1LDcgQEAKIAogCS8qIHNjYW4gZm9yIGNvcmVzICovCiAJaWYgKHNvY2l0eXBlID09IFNPQ0lfQUkpIHsKLQkJU0lfTVNHKCgiRm91bmQgY2hpcCB0eXBlIEFJICgweCUwOHgpXG4iLCB3KSk7CisJCVNJX01TRygiRm91bmQgY2hpcCB0eXBlIEFJICgweCUwOHgpXG4iLCB3KTsKIAkJLyogcGFzcyBjaGlwYyBhZGRyZXNzIGluc3RlYWQgb2Ygb3JpZ2luYWwgY29yZSBiYXNlICovCiAJCWFpX3NjYW4oJnNpaS0+cHViLCBjYyk7CiAJfSBlbHNlIHsKQEAgLTExMjksNyArMTEzMSw3IEBACiAJCSAqIHNldCBjaGlwQ29udHJvbCByZWdpc3RlciBiaXQgMTUKIAkJICovCiAJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkgewotCQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMyMjRBMCBXQVJzXG4iKSk7CisJCQlTSV9NU0coIkFwcGx5aW5nIDQzMjI0QTAgV0FSc1xuIik7CiAJCQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAogCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sKSwKIAkJCQkgICBDQ1RSTDQzMjI0X0dQSU9fVE9HR0xFLApAQCAtMTEzOCw3ICsxMTQwLDcgQEAKIAkJCQkJICAgQ0NUUkxfNDMyMjRBMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KIAkJaWYgKHNpaC0+Y2hpcHJldiA+PSAxKSB7Ci0JCQlTSV9NU0coKCJBcHBseWluZyA0MzIyNEIwKyBXQVJzXG4iKSk7CisJCQlTSV9NU0coIkFwcGx5aW5nIDQzMjI0QjArIFdBUnNcbiIpOwogCQkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSwKIAkJCQkJICAgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KQEAgLTExNDksNyArMTE1MSw3IEBACiAJCSAqIGVuYWJsZSAxMiBtQSBkcml2ZSBzdHJlbnRoIGZvciA0MzEzIGFuZAogCQkgKiBzZXQgY2hpcENvbnRyb2wgcmVnaXN0ZXIgYml0IDEKIAkJICovCi0JCVNJX01TRygoIkFwcGx5aW5nIDQzMTMgV0FSc1xuIikpOworCQlTSV9NU0coIkFwcGx5aW5nIDQzMTMgV0FSc1xuIik7CiAJCXNpX3BtdV9jaGlwY29udHJvbChzaWgsIDAsIENDVFJMXzQzMTNfMTJNQV9MRURfRFJJVkUsCiAJCQkJICAgQ0NUUkxfNDMxM18xMk1BX0xFRF9EUklWRSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9haXV0aWxzLmgKaW5kZXggMTA2YTc0Mi4uYjUxZDFlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYWl1dGlscy5oCkBAIC0zOCw4OCArMzgsMTIgQEAKIC8qIFBDSUUgQ2xpZW50IE1vZGUgc2IycGNpdHJhbnNsYXRpb24yICgyIFpldHRhQnl0ZXMpLCBoaWdoIDMyIGJpdHMgKi8KICNkZWZpbmUgU0lfUENJRV9ETUFfSDMyCQkweDgwMDAwMDAwCiAKLS8qIGNvcmUgY29kZXMgKi8KLSNkZWZpbmUJTk9ERVZfQ09SRV9JRAkJMHg3MDAJLyogSW52YWxpZCBjb3JlaWQgKi8KLSNkZWZpbmUJQ0NfQ09SRV9JRAkJMHg4MDAJLyogY2hpcGNvbW1vbiBjb3JlICovCi0jZGVmaW5lCUlMSU5FMjBfQ09SRV9JRAkJMHg4MDEJLyogaWxpbmUyMCBjb3JlICovCi0jZGVmaW5lCVNSQU1fQ09SRV9JRAkJMHg4MDIJLyogc3JhbSBjb3JlICovCi0jZGVmaW5lCVNEUkFNX0NPUkVfSUQJCTB4ODAzCS8qIHNkcmFtIGNvcmUgKi8KLSNkZWZpbmUJUENJX0NPUkVfSUQJCTB4ODA0CS8qIHBjaSBjb3JlICovCi0jZGVmaW5lCU1JUFNfQ09SRV9JRAkJMHg4MDUJLyogbWlwcyBjb3JlICovCi0jZGVmaW5lCUVORVRfQ09SRV9JRAkJMHg4MDYJLyogZW5ldCBtYWMgY29yZSAqLwotI2RlZmluZQlDT0RFQ19DT1JFX0lECQkweDgwNwkvKiB2OTAgY29kZWMgY29yZSAqLwotI2RlZmluZQlVU0JfQ09SRV9JRAkJMHg4MDgJLyogdXNiIDEuMSBob3N0L2RldmljZSBjb3JlICovCi0jZGVmaW5lCUFEU0xfQ09SRV9JRAkJMHg4MDkJLyogQURTTCBjb3JlICovCi0jZGVmaW5lCUlMSU5FMTAwX0NPUkVfSUQJMHg4MGEJLyogaWxpbmUxMDAgY29yZSAqLwotI2RlZmluZQlJUFNFQ19DT1JFX0lECQkweDgwYgkvKiBpcHNlYyBjb3JlICovCi0jZGVmaW5lCVVUT1BJQV9DT1JFX0lECQkweDgwYwkvKiB1dG9waWEgY29yZSAqLwotI2RlZmluZQlQQ01DSUFfQ09SRV9JRAkJMHg4MGQJLyogcGNtY2lhIGNvcmUgKi8KLSNkZWZpbmUJU09DUkFNX0NPUkVfSUQJCTB4ODBlCS8qIGludGVybmFsIG1lbW9yeSBjb3JlICovCi0jZGVmaW5lCU1FTUNfQ09SRV9JRAkJMHg4MGYJLyogbWVtYyBzZHJhbSBjb3JlICovCi0jZGVmaW5lCU9GRE1fQ09SRV9JRAkJMHg4MTAJLyogT0ZETSBwaHkgY29yZSAqLwotI2RlZmluZQlFWFRJRl9DT1JFX0lECQkweDgxMQkvKiBleHRlcm5hbCBpbnRlcmZhY2UgY29yZSAqLwotI2RlZmluZQlEMTFfQ09SRV9JRAkJMHg4MTIJLyogODAyLjExIE1BQyBjb3JlICovCi0jZGVmaW5lCUFQSFlfQ09SRV9JRAkJMHg4MTMJLyogODAyLjExYSBwaHkgY29yZSAqLwotI2RlZmluZQlCUEhZX0NPUkVfSUQJCTB4ODE0CS8qIDgwMi4xMWIgcGh5IGNvcmUgKi8KLSNkZWZpbmUJR1BIWV9DT1JFX0lECQkweDgxNQkvKiA4MDIuMTFnIHBoeSBjb3JlICovCi0jZGVmaW5lCU1JUFMzM19DT1JFX0lECQkweDgxNgkvKiBtaXBzMzMwMiBjb3JlICovCi0jZGVmaW5lCVVTQjExSF9DT1JFX0lECQkweDgxNwkvKiB1c2IgMS4xIGhvc3QgY29yZSAqLwotI2RlZmluZQlVU0IxMURfQ09SRV9JRAkJMHg4MTgJLyogdXNiIDEuMSBkZXZpY2UgY29yZSAqLwotI2RlZmluZQlVU0IyMEhfQ09SRV9JRAkJMHg4MTkJLyogdXNiIDIuMCBob3N0IGNvcmUgKi8KLSNkZWZpbmUJVVNCMjBEX0NPUkVfSUQJCTB4ODFhCS8qIHVzYiAyLjAgZGV2aWNlIGNvcmUgKi8KLSNkZWZpbmUJU0RJT0hfQ09SRV9JRAkJMHg4MWIJLyogc2RpbyBob3N0IGNvcmUgKi8KLSNkZWZpbmUJUk9CT19DT1JFX0lECQkweDgxYwkvKiByb2Jvc3dpdGNoIGNvcmUgKi8KLSNkZWZpbmUJQVRBMTAwX0NPUkVfSUQJCTB4ODFkCS8qIHBhcmFsbGVsIEFUQSBjb3JlICovCi0jZGVmaW5lCVNBVEFYT1JfQ09SRV9JRAkJMHg4MWUJLyogc2VyaWFsIEFUQSAmIFhPUiBETUEgY29yZSAqLwotI2RlZmluZQlHSUdFVEhfQ09SRV9JRAkJMHg4MWYJLyogZ2lnYWJpdCBldGhlcm5ldCBjb3JlICovCi0jZGVmaW5lCVBDSUVfQ09SRV9JRAkJMHg4MjAJLyogcGNpIGV4cHJlc3MgY29yZSAqLwotI2RlZmluZQlOUEhZX0NPUkVfSUQJCTB4ODIxCS8qIDgwMi4xMW4gMngyIHBoeSBjb3JlICovCi0jZGVmaW5lCVNSQU1DX0NPUkVfSUQJCTB4ODIyCS8qIFNSQU0gY29udHJvbGxlciBjb3JlICovCi0jZGVmaW5lCU1JTklNQUNfQ09SRV9JRAkJMHg4MjMJLyogTUlOSSBNQUMvcGh5IGNvcmUgKi8KLSNkZWZpbmUJQVJNMTFfQ09SRV9JRAkJMHg4MjQJLyogQVJNIDExNzYgY29yZSAqLwotI2RlZmluZQlBUk03U19DT1JFX0lECQkweDgyNQkvKiBBUk03dGRtaS1zIGNvcmUgKi8KLSNkZWZpbmUJTFBQSFlfQ09SRV9JRAkJMHg4MjYJLyogODAyLjExYS9iL2cgcGh5IGNvcmUgKi8KLSNkZWZpbmUJUE1VX0NPUkVfSUQJCTB4ODI3CS8qIFBNVSBjb3JlICovCi0jZGVmaW5lCVNTTlBIWV9DT1JFX0lECQkweDgyOAkvKiA4MDIuMTFuIHNpbmdsZS1zdHJlYW0gcGh5IGNvcmUgKi8KLSNkZWZpbmUJU0RJT0RfQ09SRV9JRAkJMHg4MjkJLyogU0RJTyBkZXZpY2UgY29yZSAqLwotI2RlZmluZQlBUk1DTTNfQ09SRV9JRAkJMHg4MmEJLyogQVJNIENvcnRleCBNMyBjb3JlICovCi0jZGVmaW5lCUhUUEhZX0NPUkVfSUQJCTB4ODJiCS8qIDgwMi4xMW4gNHg0IHBoeSBjb3JlICovCi0jZGVmaW5lCU1JUFM3NEtfQ09SRV9JRAkJMHg4MmMJLyogbWlwcyA3NGsgY29yZSAqLwotI2RlZmluZQlHTUFDX0NPUkVfSUQJCTB4ODJkCS8qIEdpZ2FiaXQgTUFDIGNvcmUgKi8KLSNkZWZpbmUJRE1FTUNfQ09SRV9JRAkJMHg4MmUJLyogRERSMS8yIG1lbW9yeSBjb250cm9sbGVyIGNvcmUgKi8KLSNkZWZpbmUJUENJRVJDX0NPUkVfSUQJCTB4ODJmCS8qIFBDSUUgUm9vdCBDb21wbGV4IGNvcmUgKi8KLSNkZWZpbmUJT0NQX0NPUkVfSUQJCTB4ODMwCS8qIE9DUDJPQ1AgYnJpZGdlIGNvcmUgKi8KLSNkZWZpbmUJU0NfQ09SRV9JRAkJMHg4MzEJLyogc2hhcmVkIGNvbW1vbiBjb3JlICovCi0jZGVmaW5lCUFIQl9DT1JFX0lECQkweDgzMgkvKiBPQ1AyQUhCIGJyaWRnZSBjb3JlICovCi0jZGVmaW5lCVNQSUhfQ09SRV9JRAkJMHg4MzMJLyogU1BJIGhvc3QgY29yZSAqLwotI2RlZmluZQlJMlNfQ09SRV9JRAkJMHg4MzQJLyogSTJTIGNvcmUgKi8KLSNkZWZpbmUJRE1FTVNfQ09SRV9JRAkJMHg4MzUJLyogU0RSL0REUjEgbWVtb3J5IGNvbnRyb2xsZXIgY29yZSAqLwotI2RlZmluZQlERUZfU0hJTV9DT01QCQkweDgzNwkvKiBTSElNIGNvbXBvbmVudCBpbiB1YnVzLzYzNjIgKi8KLSNkZWZpbmUgT09CX1JPVVRFUl9DT1JFX0lECTB4MzY3CS8qIE9PQiByb3V0ZXIgY29yZSBJRCAqLwotI2RlZmluZQlERUZfQUlfQ09NUAkJMHhmZmYJLyogRGVmYXVsdCBjb21wb25lbnQsIGluIGFpIGNoaXBzIGl0Ci0JCQkJCSAqIG1hcHMgYWxsIHVudXNlZCBhZGRyZXNzIHJhbmdlcwotCQkJCQkgKi8KLQogLyogY2hpcGNvbW1vbiBiZWluZyB0aGUgZmlyc3QgY29yZTogKi8KICNkZWZpbmUJU0lfQ0NfSURYCQkwCiAKIC8qIFNPQyBJbnRlcmNvbm5lY3QgdHlwZXMgKGFrYSBjaGlwIHR5cGVzKSAqLwogI2RlZmluZQlTT0NJX0FJCQkJMQogCi0vKiBDb21tb24gY29yZSBjb250cm9sIGZsYWdzICovCi0jZGVmaW5lCVNJQ0ZfQklTVF9FTgkJMHg4MDAwCi0jZGVmaW5lCVNJQ0ZfUE1FX0VOCQkweDQwMDAKLSNkZWZpbmUJU0lDRl9DT1JFX0JJVFMJCTB4M2ZmYwotI2RlZmluZQlTSUNGX0ZHQwkJMHgwMDAyCi0jZGVmaW5lCVNJQ0ZfQ0xPQ0tfRU4JCTB4MDAwMQotCi0vKiBDb21tb24gY29yZSBzdGF0dXMgZmxhZ3MgKi8KLSNkZWZpbmUJU0lTRl9CSVNUX0RPTkUJCTB4ODAwMAotI2RlZmluZQlTSVNGX0JJU1RfRVJST1IJCTB4NDAwMAotI2RlZmluZQlTSVNGX0dBVEVEX0NMSwkJMHgyMDAwCi0jZGVmaW5lCVNJU0ZfRE1BNjQJCTB4MTAwMAotI2RlZmluZQlTSVNGX0NPUkVfQklUUwkJMHgwZmZmCi0KIC8qIEEgcmVnaXN0ZXIgdGhhdCBpcyBjb21tb24gdG8gYWxsIGNvcmVzIHRvCiAgKiBjb21tdW5pY2F0ZSB3L1BNVSByZWdhcmRpbmcgY2xvY2sgY29udHJvbC4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FtcGR1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYW1wZHUuYwppbmRleCA3ZjI3ZGJkLi40M2Y3YTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYW1wZHUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYW1wZHUuYwpAQCAtNjQ5LDcgKzY0OSw3IEBACiAJCWxlbiA9IHJvdW5kdXAobGVuLCA0KTsKIAkJYW1wZHVfbGVuICs9IChsZW4gKyAobmRlbGltICsgMSkgKiBBTVBEVV9ERUxJTUlURVJfTEVOKTsKIAotCQlkbWFfbGVuICs9ICh1MTYpIGJyY211X3BrdHRvdGxlbihwKTsKKwkJZG1hX2xlbiArPSAodTE2KSBwLT5sZW47CiAKIAkJQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkOiBhbXBkdV9sZW4gJWQiCiAJCQkiIHNlZ19jbnQgJWQgbnVsbCBkZWxpbSAlZFxuIiwKQEAgLTc0MSw5ICs3NDEsNyBAQAogCQlpZiAocCkgewogCQkJaWYgKCh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpICYmCiAJCQkgICAgKCh1OCkgKHAtPnByaW9yaXR5KSA9PSB0aWQpKSB7Ci0KLQkJCQlwbGVuID0gYnJjbXVfcGt0dG90bGVuKHApICsKLQkJCQkgICAgICAgQU1QRFVfTUFYX01QRFVfT1ZFUkhFQUQ7CisJCQkJcGxlbiA9IHAtPmxlbiArIEFNUERVX01BWF9NUERVX09WRVJIRUFEOwogCQkJCXBsZW4gPSBtYXgoc2NiX2FtcGR1LT5taW5fbGVuLCBwbGVuKTsKIAogCQkJCWlmICgocGxlbiArIGFtcGR1X2xlbikgPiBtYXhfYW1wZHVfYnl0ZXMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9jaGFubmVsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvY2hhbm5lbC5jCmluZGV4IDg5YWQxYjcuLjU1ZTlmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2NoYW5uZWwuYwpAQCAtMTE1MywxMjEgKzExNTMsNiBAQAogCQkJICAgICAgJnR4cHdyKTsKIH0KIAotI2lmZGVmIFBPV0VSX0RCRwotc3RhdGljIHZvaWQgd2xjX3BoeV90eHBvd2VyX2xpbWl0c19kdW1wKHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQotewotCWludCBpOwotCWNoYXIgYnVmWzgwXTsKLQljaGFyIGZyYWN0aW9uWzRdWzRdID0geyAiICAgIiwgIi4yNSIsICIuNSAiLCAiLjc1IiB9OwotCi0Jc3ByaW50ZihidWYsICJDQ0sgICAgICAgICAgICAgICAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19DQ0s7IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5jY2tbaV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+Y2NrW2ldICUgQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogT0ZETSBTSVNPICAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19PRkRNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+b2ZkbVtpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5vZmRtW2ldICUgQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogT0ZETSBDREQgICAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19PRkRNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+b2ZkbV9jZGRbaV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+b2ZkbV9jZGRbaV0gJSBCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBPRkRNIFNJU08gICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5vZmRtXzQwX3Npc29baV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+b2ZkbV80MF9zaXNvW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBPRkRNIENERCAgICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5vZmRtXzQwX2NkZFtpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5vZmRtXzQwX2NkZFtpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogTUNTMC03IFNJU08gIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfMjBfc2lzb1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfMjBfc2lzb1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogTUNTMC03IENERCAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfMjBfY2RkW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc18yMF9jZGRbaV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiMjAgTUh6IE1DUzAtNyBTVEJDICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzIwX3N0YmNbaV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzIwX3N0YmNbaV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiMjAgTUh6IE1DUzgtMTUgU0RNICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzJfU1RSRUFNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzIwX21pbW9baV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzIwX21pbW9baV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiNDAgTUh6IE1DUzAtNyBTSVNPICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzQwX3Npc29baV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzQwX3Npc29baV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiNDAgTUh6IE1DUzAtNyBDREQgICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzQwX2NkZFtpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfNDBfY2RkW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBNQ1MwLTcgU1RCQyAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc180MF9zdGJjW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc180MF9zdGJjW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBNQ1M4LTE1IFNETSAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18yX1NUUkVBTTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc180MF9taW1vW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc180MF9taW1vW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIk1DUzMyICAgICAgICAgICAgICAgJTJkJXNcbiIsCi0JICAgICAgIHR4cHdyLT5tY3MzMiAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkgICAgICAgZnJhY3Rpb25bdHhwd3ItPm1jczMyICUgQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci19Ci0jZW5kaWYJCQkJLyogUE9XRVJfREJHICovCi0KIHZvaWQKIGJyY21zX2NfY2hhbm5lbF9yZWdfbGltaXRzKHN0cnVjdCBicmNtc19jbV9pbmZvICp3bGNfY20sIHUxNiBjaGFuc3BlYywKIAkJICAgICAgIHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQpAQCAtMTQ3OCw5ICsxMzYzLDYgQEAKIAkJCXR4cHdyLT5tY3NfNDBfc3RiY1tpXSA9IHR4cHdyLT5tY3NfNDBfY2RkW2ldOwogCX0KIAotI2lmZGVmIFBPV0VSX0RCRwotCXdsY19waHlfdHhwb3dlcl9saW1pdHNfZHVtcCh0eHB3cik7Ci0jZW5kaWYKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kbWEuYwppbmRleCA2ZWJlYzhmLi5iNTViMWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2RtYS5jCkBAIC0xMyw4ICsxMywxMCBAQAogICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIApAQCAtMjIsNiArMjQsNyBAQAogI2luY2x1ZGUgPGFpdXRpbHMuaD4KICNpbmNsdWRlICJ0eXBlcy5oIgogI2luY2x1ZGUgImRtYS5oIgorI2luY2x1ZGUgInNvYy5oIgogCiAvKgogICogRE1BIGhhcmR3YXJlIHJlcXVpcmVzIGVhY2ggZGVzY3JpcHRvciByaW5nIHRvIGJlIDhrQiBhbGlnbmVkLCBhbmQgZml0IHdpdGhpbgpAQCAtMTY4LDI2ICsxNzEsMjUgQEAKIAogLyogZGVidWcvdHJhY2UgKi8KICNpZmRlZiBCQ01EQkcKLSNkZWZpbmUJRE1BX0VSUk9SKGFyZ3MpIFwKLQlkbyB7IFwKLQkJaWYgKCEoKmRpLT5tc2dfbGV2ZWwgJiAxKSkgXAotCQkJOyBcCi0JCWVsc2UgXAotCQkJcHJpbnRrIGFyZ3M7IFwKLQl9IHdoaWxlICgwKQotI2RlZmluZQlETUFfVFJBQ0UoYXJncykgXAotCWRvIHsgXAotCQlpZiAoISgqZGktPm1zZ19sZXZlbCAmIDIpKSBcCi0JCQk7IFwKLQkJZWxzZSBcCi0JCQlwcmludGsgYXJnczsgXAotCX0gd2hpbGUgKDApCisjZGVmaW5lCURNQV9FUlJPUihmbXQsIC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoKmRpLT5tc2dfbGV2ZWwgJiAxKQkJCQkJXAorCQlwcl9kZWJ1ZygiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXyk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lCURNQV9UUkFDRShmbXQsIC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoKmRpLT5tc2dfbGV2ZWwgJiAyKQkJCQkJXAorCQlwcl9kZWJ1ZygiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXyk7CVwKK30gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZQlETUFfRVJST1IoYXJncykKLSNkZWZpbmUJRE1BX1RSQUNFKGFyZ3MpCisjZGVmaW5lCURNQV9FUlJPUihmbXQsIC4uLikJCQlcCisJbm9fcHJpbnRrKGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUJRE1BX1RSQUNFKGZtdCwgLi4uKQkJCVwKKwlub19wcmludGsoZm10LCAjI19fVkFfQVJHU19fKQogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCi0jZGVmaW5lCURNQV9OT05FKGFyZ3MpCisjZGVmaW5lCURNQV9OT05FKGZtdCwgLi4uKQkJCVwKKwlub19wcmludGsoZm10LCAjI19fVkFfQVJHU19fKQogCiAjZGVmaW5lCU1BWE5BTUVMCTgJLyogOCBjaGFyIG5hbWVzICovCiAKQEAgLTM2MSw3ICszNjMsNyBAQAogCXVpbnQgZG1hY3RybGZsYWdzOwogCiAJaWYgKGRpID09IE5VTEwpIHsKLQkJRE1BX0VSUk9SKCgiX2RtYV9jdHJsZmxhZ3M6IE5VTEwgZG1hIGhhbmRsZVxuIikpOworCQlETUFfRVJST1IoIk5VTEwgZG1hIGhhbmRsZVxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNDEyLDEzICs0MTQsMTMgQEAKIAkvKiBub3QgYWxsIHR4IG9yIHJ4IGNoYW5uZWwgYXJlIGF2YWlsYWJsZSAqLwogCWlmIChkaS0+ZDY0dHhyZWdzICE9IE5VTEwpIHsKIAkJaWYgKCFfZG1hNjRfYWRkcmV4dChkaS0+ZDY0dHhyZWdzKSkKLQkJCURNQV9FUlJPUigoIiVzOiBfZG1hX2lzYWRkcmV4dDogRE1BNjQgdHggZG9lc24ndCBoYXZlICIKLQkJCQkgICAiQUUgc2V0XG4iLCBkaS0+bmFtZSkpOworCQkJRE1BX0VSUk9SKCIlczogRE1BNjQgdHggZG9lc24ndCBoYXZlIEFFIHNldFxuIiwKKwkJCQkgIGRpLT5uYW1lKTsKIAkJcmV0dXJuIHRydWU7CiAJfSBlbHNlIGlmIChkaS0+ZDY0cnhyZWdzICE9IE5VTEwpIHsKIAkJaWYgKCFfZG1hNjRfYWRkcmV4dChkaS0+ZDY0cnhyZWdzKSkKLQkJCURNQV9FUlJPUigoIiVzOiBfZG1hX2lzYWRkcmV4dDogRE1BNjQgcnggZG9lc24ndCBoYXZlICIKLQkJCQkgICAiQUUgc2V0XG4iLCBkaS0+bmFtZSkpOworCQkJRE1BX0VSUk9SKCIlczogRE1BNjQgcnggZG9lc24ndCBoYXZlIEFFIHNldFxuIiwKKwkJCQkgIGRpLT5uYW1lKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC01MTksOCArNTIxLDggQEAKIAkJdmEgPSBkbWFfcmluZ2FsbG9jKGRpLCBENjRSSU5HQUxJR04sIHNpemUsICZhbGlnbl9iaXRzLAogCQkJJmFsbG9jZWQsICZkaS0+dHhkcGFvcmlnKTsKIAkJaWYgKHZhID09IE5VTEwpIHsKLQkJCURNQV9FUlJPUigoIiVzOiBkbWE2NF9hbGxvYzogRE1BX0FMTE9DX0NPTlNJU1RFTlQobnR4ZCkiCi0JCQkJICAgIiBmYWlsZWRcbiIsIGRpLT5uYW1lKSk7CisJCQlETUFfRVJST1IoIiVzOiBETUFfQUxMT0NfQ09OU0lTVEVOVChudHhkKSBmYWlsZWRcbiIsCisJCQkJICBkaS0+bmFtZSk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJYWxpZ24gPSAoMSA8PCBhbGlnbl9iaXRzKTsKQEAgLTUzMyw4ICs1MzUsOCBAQAogCQl2YSA9IGRtYV9yaW5nYWxsb2MoZGksIEQ2NFJJTkdBTElHTiwgc2l6ZSwgJmFsaWduX2JpdHMsCiAJCQkmYWxsb2NlZCwgJmRpLT5yeGRwYW9yaWcpOwogCQlpZiAodmEgPT0gTlVMTCkgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYTY0X2FsbG9jOiBETUFfQUxMT0NfQ09OU0lTVEVOVChucnhkKSIKLQkJCQkgICAiIGZhaWxlZFxuIiwgZGktPm5hbWUpKTsKKwkJCURNQV9FUlJPUigiJXM6IERNQV9BTExPQ19DT05TSVNURU5UKG5yeGQpIGZhaWxlZFxuIiwKKwkJCQkgIGRpLT5uYW1lKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlhbGlnbiA9ICgxIDw8IGFsaWduX2JpdHMpOwpAQCAtNTgzLDExICs1ODUsMTAgQEAKIAkgKi8KIAlfZG1hX2N0cmxmbGFncyhkaSwgRE1BX0NUUkxfUk9DIHwgRE1BX0NUUkxfUEVOLCAwKTsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfYXR0YWNoOiAlcyBmbGFncyAweCV4IG50eGQgJWQgbnJ4ZCAlZCAiCi0JCSAgICJyeGJ1ZnNpemUgJWQgcnhleHRoZWFkcm9vbSAlZCBucnhwb3N0ICVkIHJ4b2Zmc2V0ICVkICIKLQkJICAgImRtYXJlZ3N0eCAlcCBkbWFyZWdzcnggJXBcbiIsIG5hbWUsICJETUE2NCIsCi0JCSAgIGRpLT5kbWEuZG1hY3RybGZsYWdzLCBudHhkLCBucnhkLCByeGJ1ZnNpemUsCi0JCSAgIHJ4ZXh0aGVhZHJvb20sIG5yeHBvc3QsIHJ4b2Zmc2V0LCBkbWFyZWdzdHgsIGRtYXJlZ3NyeCkpOworCURNQV9UUkFDRSgiJXM6ICVzIGZsYWdzIDB4JXggbnR4ZCAlZCBucnhkICVkIHJ4YnVmc2l6ZSAlZCByeGV4dGhlYWRyb29tICVkIG5yeHBvc3QgJWQgcnhvZmZzZXQgJWQgZG1hcmVnc3R4ICVwIGRtYXJlZ3NyeCAlcFxuIiwKKwkJICBuYW1lLCAiRE1BNjQiLAorCQkgIGRpLT5kbWEuZG1hY3RybGZsYWdzLCBudHhkLCBucnhkLCByeGJ1ZnNpemUsCisJCSAgcnhleHRoZWFkcm9vbSwgbnJ4cG9zdCwgcnhvZmZzZXQsIGRtYXJlZ3N0eCwgZG1hcmVnc3J4KTsKIAogCS8qIG1ha2UgYSBwcml2YXRlIGNvcHkgb2Ygb3VyIGNhbGxlcnMgbmFtZSAqLwogCXN0cm5jcHkoZGktPm5hbWUsIG5hbWUsIE1BWE5BTUVMKTsKQEAgLTY0NSw4ICs2NDYsOCBAQAogCQlkaS0+ZG1hZGVzY19hbGlnbiA9IDQ7CS8qIDE2IGJ5dGUgYWxpZ25tZW50ICovCiAJfQogCi0JRE1BX05PTkUoKCJETUEgZGVzY3JpcHRvciBhbGlnbl9uZWVkZWQgJWQsIGFsaWduICVkXG4iLAotCQkgIGRpLT5hbGlnbmRlc2NfNGssIGRpLT5kbWFkZXNjX2FsaWduKSk7CisJRE1BX05PTkUoIkRNQSBkZXNjcmlwdG9yIGFsaWduX25lZWRlZCAlZCwgYWxpZ24gJWRcbiIsCisJCSBkaS0+YWxpZ25kZXNjXzRrLCBkaS0+ZG1hZGVzY19hbGlnbik7CiAKIAkvKiBhbGxvY2F0ZSB0eCBwYWNrZXQgcG9pbnRlciB2ZWN0b3IgKi8KIAlpZiAobnR4ZCkgewpAQCAtNjg0LDIxICs2ODUsMjEgQEAKIAogCWlmICgoZGktPmRkb2Zmc2V0bG93ICE9IDApICYmICFkaS0+YWRkcmV4dCkgewogCQlpZiAoZGktPnR4ZHBhID4gU0lfUENJX0RNQV9TWikgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYV9hdHRhY2g6IHR4ZHBhIDB4JXg6IGFkZHJleHQgbm90ICIKLQkJCQkgICAic3VwcG9ydGVkXG4iLCBkaS0+bmFtZSwgKHUzMilkaS0+dHhkcGEpKTsKKwkJCURNQV9FUlJPUigiJXM6IHR4ZHBhIDB4JXg6IGFkZHJleHQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQkgIGRpLT5uYW1lLCAodTMyKWRpLT50eGRwYSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJaWYgKGRpLT5yeGRwYSA+IFNJX1BDSV9ETUFfU1opIHsKLQkJCURNQV9FUlJPUigoIiVzOiBkbWFfYXR0YWNoOiByeGRwYSAweCV4OiBhZGRyZXh0IG5vdCAiCi0JCQkJICAgInN1cHBvcnRlZFxuIiwgZGktPm5hbWUsICh1MzIpZGktPnJ4ZHBhKSk7CisJCQlETUFfRVJST1IoIiVzOiByeGRwYSAweCV4OiBhZGRyZXh0IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJICBkaS0+bmFtZSwgKHUzMilkaS0+cnhkcGEpOwogCQkJZ290byBmYWlsOwogCQl9CiAJfQogCi0JRE1BX1RSQUNFKCgiZGRvZmZzZXRsb3cgMHgleCBkZG9mZnNldGhpZ2ggMHgleCBkYXRhb2Zmc2V0bG93IDB4JXggIgotCQkgICAiZGF0YW9mZnNldGhpZ2ggIiAiMHgleCBhZGRyZXh0ICVkXG4iLCBkaS0+ZGRvZmZzZXRsb3csCi0JCSAgIGRpLT5kZG9mZnNldGhpZ2gsIGRpLT5kYXRhb2Zmc2V0bG93LCBkaS0+ZGF0YW9mZnNldGhpZ2gsCi0JCSAgIGRpLT5hZGRyZXh0KSk7CisJRE1BX1RSQUNFKCJkZG9mZnNldGxvdyAweCV4IGRkb2Zmc2V0aGlnaCAweCV4IGRhdGFvZmZzZXRsb3cgMHgleCBkYXRhb2Zmc2V0aGlnaCAweCV4IGFkZHJleHQgJWRcbiIsCisJCSAgZGktPmRkb2Zmc2V0bG93LCBkaS0+ZGRvZmZzZXRoaWdoLAorCQkgIGRpLT5kYXRhb2Zmc2V0bG93LCBkaS0+ZGF0YW9mZnNldGhpZ2gsCisJCSAgZGktPmFkZHJleHQpOwogCiAJcmV0dXJuIChzdHJ1Y3QgZG1hX3B1YiAqKSBkaTsKIApAQCAtNzQ0LDcgKzc0NSw3IEBACiB7CiAJc3RydWN0IGRtYV9pbmZvICpkaSA9IChzdHJ1Y3QgZG1hX2luZm8gKilwdWI7CiAKLQlETUFfVFJBQ0UoKCIlczogZG1hX2RldGFjaFxuIiwgZGktPm5hbWUpKTsKKwlETUFfVFJBQ0UoIiVzOlxuIiwgZGktPm5hbWUpOwogCiAJLyogZnJlZSBkbWEgZGVzY3JpcHRvciByaW5ncyAqLwogCWlmIChkaS0+dHhkNjQpCkBAIC04MTIsNyArODEzLDcgQEAKIAl1aW50IGRtYWN0cmxmbGFncyA9IGRpLT5kbWEuZG1hY3RybGZsYWdzOwogCXUzMiBjb250cm9sOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeGVuYWJsZVxuIiwgZGktPm5hbWUpKTsKKwlETUFfVFJBQ0UoIiVzOlxuIiwgZGktPm5hbWUpOwogCiAJY29udHJvbCA9CiAJICAgIChSX1JFRygmZGktPmQ2NHJ4cmVncy0+Y29udHJvbCkgJiBENjRfUkNfQUUpIHwKQEAgLTgzMiw3ICs4MzMsNyBAQAogewogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeGluaXRcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCWlmIChkaS0+bnJ4ZCA9PSAwKQogCQlyZXR1cm47CkBAIC05MDEsNyArOTAyLDcgQEAKIAogLyoKICAqICEhIHJ4IGVudHJ5IHJvdXRpbmUKLSAqIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGZyYW1lIHJlY2VpdmVkLCBvciBOVUxMIGlmIHRoZXJlIGFyZSBubyBtb3JlCisgKiByZXR1cm5zIHRoZSBudW1iZXIgcGFja2FnZXMgaW4gdGhlIG5leHQgZnJhbWUsIG9yIDAgaWYgdGhlcmUgYXJlIG5vIG1vcmUKICAqICAgaWYgRE1BX0NUUkxfUlhNVUxUSSBpcyBkZWZpbmVkLCBETUEgc2NhdHRlcmluZyhtdWx0aXBsZSBidWZmZXJzKSBpcwogICogICBzdXBwb3J0ZWQgd2l0aCBwa3RzIGNoYWluCiAgKiAgIG90aGVyd2lzZSwgaXQncyB0cmVhdGVkIGFzIGdpYW50IHBrdCBhbmQgd2lsbCBiZSB0b3NzZWQuCkBAIC05MDksMzggKzkxMCw0MCBAQAogICogICBidWZmZXIgZGF0YS4gQWZ0ZXIgaXQgcmVhY2hlcyB0aGUgbWF4IHNpemUgb2YgYnVmZmVyLCB0aGUgZGF0YSBjb250aW51ZXMKICAqICAgaW4gbmV4dCBETUEgZGVzY3JpcHRvciBidWZmZXIgV0lUSE9VVCBETUEgaGVhZGVyCiAgKi8KLXN0cnVjdCBza19idWZmICpkbWFfcngoc3RydWN0IGRtYV9wdWIgKnB1YikKK2ludCBkbWFfcngoc3RydWN0IGRtYV9wdWIgKnB1Yiwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2tiX2xpc3QpCiB7CiAJc3RydWN0IGRtYV9pbmZvICpkaSA9IChzdHJ1Y3QgZG1hX2luZm8gKilwdWI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnAsICpoZWFkLCAqdGFpbDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGRtYV9mcmFtZXM7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpuZXh0OwogCXVpbnQgbGVuOwogCXVpbnQgcGt0X2xlbjsKIAlpbnQgcmVzaWQgPSAwOworCWludCBwa3RjbnQgPSAxOwogCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZG1hX2ZyYW1lcyk7CiAgbmV4dF9mcmFtZToKLQloZWFkID0gX2RtYV9nZXRuZXh0cnhwKGRpLCBmYWxzZSk7Ci0JaWYgKGhlYWQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisJcCA9IF9kbWFfZ2V0bmV4dHJ4cChkaSwgZmFsc2UpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAwOwogCi0JbGVuID0gbGUxNl90b19jcHUoKihfX2xlMTYgKikgKGhlYWQtPmRhdGEpKTsKLQlETUFfVFJBQ0UoKCIlczogZG1hX3J4IGxlbiAlZFxuIiwgZGktPm5hbWUsIGxlbikpOwotCWRtYV9zcGluX2Zvcl9sZW4obGVuLCBoZWFkKTsKKwlsZW4gPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSAocC0+ZGF0YSkpOworCURNQV9UUkFDRSgiJXM6IGRtYV9yeCBsZW4gJWRcbiIsIGRpLT5uYW1lLCBsZW4pOworCWRtYV9zcGluX2Zvcl9sZW4obGVuLCBwKTsKIAogCS8qIHNldCBhY3R1YWwgbGVuZ3RoICovCiAJcGt0X2xlbiA9IG1pbigoZGktPnJ4b2Zmc2V0ICsgbGVuKSwgZGktPnJ4YnVmc2l6ZSk7Ci0JX19za2JfdHJpbShoZWFkLCBwa3RfbGVuKTsKKwlfX3NrYl90cmltKHAsIHBrdF9sZW4pOworCXNrYl9xdWV1ZV90YWlsKCZkbWFfZnJhbWVzLCBwKTsKIAlyZXNpZCA9IGxlbiAtIChkaS0+cnhidWZzaXplIC0gZGktPnJ4b2Zmc2V0KTsKIAogCS8qIGNoZWNrIGZvciBzaW5nbGUgb3IgbXVsdGktYnVmZmVyIHJ4ICovCiAJaWYgKHJlc2lkID4gMCkgewotCQl0YWlsID0gaGVhZDsKIAkJd2hpbGUgKChyZXNpZCA+IDApICYmIChwID0gX2RtYV9nZXRuZXh0cnhwKGRpLCBmYWxzZSkpKSB7Ci0JCQl0YWlsLT5uZXh0ID0gcDsKIAkJCXBrdF9sZW4gPSBtaW5fdCh1aW50LCByZXNpZCwgZGktPnJ4YnVmc2l6ZSk7CiAJCQlfX3NrYl90cmltKHAsIHBrdF9sZW4pOwotCi0JCQl0YWlsID0gcDsKKwkJCXNrYl9xdWV1ZV90YWlsKCZkbWFfZnJhbWVzLCBwKTsKIAkJCXJlc2lkIC09IGRpLT5yeGJ1ZnNpemU7CisJCQlwa3RjbnQrKzsKIAkJfQogCiAjaWZkZWYgQkNNREJHCkBAIC05NTEsMjYgKzk1NCwzMSBAQAogCQkJCSAgRDY0X1JTMF9DRF9NQVNLKSAtCiAJCQkJIGRpLT5yY3ZwdHJiYXNlKSAmIEQ2NF9SUzBfQ0RfTUFTSywKIAkJCQlzdHJ1Y3QgZG1hNjRkZXNjKTsKLQkJCURNQV9FUlJPUigoImRtYV9yeCwgcnhpbiAlZCByeG91dCAlZCwgaHdfY3VyciAlZFxuIiwKLQkJCQkgICBkaS0+cnhpbiwgZGktPnJ4b3V0LCBjdXIpKTsKKwkJCURNQV9FUlJPUigicnhpbiAlZCByeG91dCAlZCwgaHdfY3VyciAlZFxuIiwKKwkJCQkgIGRpLT5yeGluLCBkaS0+cnhvdXQsIGN1cik7CiAJCX0KICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAogCQlpZiAoKGRpLT5kbWEuZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUlhNVUxUSSkgPT0gMCkgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYV9yeDogYmFkIGZyYW1lIGxlbmd0aCAoJWQpXG4iLAotCQkJCSAgIGRpLT5uYW1lLCBsZW4pKTsKLQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IoaGVhZCk7CisJCQlETUFfRVJST1IoIiVzOiBiYWQgZnJhbWUgbGVuZ3RoICglZClcbiIsCisJCQkJICBkaS0+bmFtZSwgbGVuKTsKKwkJCXNrYl9xdWV1ZV93YWxrX3NhZmUoJmRtYV9mcmFtZXMsIHAsIG5leHQpIHsKKwkJCQlza2JfdW5saW5rKHAsICZkbWFfZnJhbWVzKTsKKwkJCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHApOworCQkJfQogCQkJZGktPmRtYS5yeGdpYW50cysrOworCQkJcGt0Y250ID0gMTsKIAkJCWdvdG8gbmV4dF9mcmFtZTsKIAkJfQogCX0KIAotCXJldHVybiBoZWFkOworCXNrYl9xdWV1ZV9zcGxpY2VfdGFpbCgmZG1hX2ZyYW1lcywgc2tiX2xpc3QpOworCXJldHVybiBwa3RjbnQ7CiB9CiAKIHN0YXRpYyBib29sIGRtYTY0X3J4aWRsZShzdHJ1Y3QgZG1hX2luZm8gKmRpKQogewotCURNQV9UUkFDRSgoIiVzOiBkbWFfcnhpZGxlXG4iLCBkaS0+bmFtZSkpOworCURNQV9UUkFDRSgiJXM6XG4iLCBkaS0+bmFtZSk7CiAKIAlpZiAoZGktPm5yeGQgPT0gMCkKIAkJcmV0dXJuIHRydWU7CkBAIC0xMDEwLDcgKzEwMTgsNyBAQAogCiAJbiA9IGRpLT5ucnhwb3N0IC0gbnJ4ZGFjdGl2ZShkaSwgcnhpbiwgcnhvdXQpOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeGZpbGw6IHBvc3QgJWRcbiIsIGRpLT5uYW1lLCBuKSk7CisJRE1BX1RSQUNFKCIlczogcG9zdCAlZFxuIiwgZGktPm5hbWUsIG4pOwogCiAJaWYgKGRpLT5yeGJ1ZnNpemUgPiBCQ01FWFRSQUhEUk9PTSkKIAkJZXh0cmFfb2Zmc2V0ID0gZGktPnJ4ZXh0cmFoZHJyb29tOwpAQCAtMTAyMywxMSArMTAzMSw5IEBACiAJCXAgPSBicmNtdV9wa3RfYnVmX2dldF9za2IoZGktPnJ4YnVmc2l6ZSArIGV4dHJhX29mZnNldCk7CiAKIAkJaWYgKHAgPT0gTlVMTCkgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYV9yeGZpbGw6IG91dCBvZiByeGJ1ZnNcbiIsCi0JCQkJICAgZGktPm5hbWUpKTsKKwkJCURNQV9FUlJPUigiJXM6IG91dCBvZiByeGJ1ZnNcbiIsIGRpLT5uYW1lKTsKIAkJCWlmIChpID09IDAgJiYgZG1hNjRfcnhpZGxlKGRpKSkgewotCQkJCURNQV9FUlJPUigoIiVzOiByeGZpbGw2NDogcmluZyBpcyBlbXB0eSAhXG4iLAotCQkJCQkgICBkaS0+bmFtZSkpOworCQkJCURNQV9FUlJPUigiJXM6IHJpbmcgaXMgZW1wdHkgIVxuIiwgZGktPm5hbWUpOwogCQkJCXJpbmdfZW1wdHkgPSB0cnVlOwogCQkJfQogCQkJZGktPmRtYS5yeG5vYnVmKys7CkBAIC0xMDcyLDcgKzEwNzgsNyBAQAogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwogCXN0cnVjdCBza19idWZmICpwOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeHJlY2xhaW1cbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCXdoaWxlICgocCA9IF9kbWFfZ2V0bmV4dHJ4cChkaSwgdHJ1ZSkpKQogCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHApOwpAQCAtMTEwMyw3ICsxMTA5LDcgQEAKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKIAl1MzIgY29udHJvbCA9IEQ2NF9YQ19YRTsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfdHhpbml0XG4iLCBkaS0+bmFtZSkpOworCURNQV9UUkFDRSgiJXM6XG4iLCBkaS0+bmFtZSk7CiAKIAlpZiAoZGktPm50eGQgPT0gMCkKIAkJcmV0dXJuOwpAQCAtMTEzNSw3ICsxMTQxLDcgQEAKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfdHhzdXNwZW5kXG4iLCBkaS0+bmFtZSkpOworCURNQV9UUkFDRSgiJXM6XG4iLCBkaS0+bmFtZSk7CiAKIAlpZiAoZGktPm50eGQgPT0gMCkKIAkJcmV0dXJuOwpAQCAtMTE0Nyw3ICsxMTUzLDcgQEAKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfdHhyZXN1bWVcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCWlmIChkaS0+bnR4ZCA9PSAwKQogCQlyZXR1cm47CkBAIC0xMTY5LDExICsxMTc1LDExIEBACiAJc3RydWN0IGRtYV9pbmZvICpkaSA9IChzdHJ1Y3QgZG1hX2luZm8gKilwdWI7CiAJc3RydWN0IHNrX2J1ZmYgKnA7CiAKLQlETUFfVFJBQ0UoKCIlczogZG1hX3R4cmVjbGFpbSAlc1xuIiwgZGktPm5hbWUsCi0JCSAgIChyYW5nZSA9PSBETUFfUkFOR0VfQUxMKSA/ICJhbGwiIDoKLQkJICAgKChyYW5nZSA9PQotCQkgICAgIERNQV9SQU5HRV9UUkFOU01JVFRFRCkgPyAidHJhbnNtaXR0ZWQiIDoKLQkJICAgICJ0cmFuc2ZlcnJlZCIpKSk7CisJRE1BX1RSQUNFKCIlczogJXNcbiIsCisJCSAgZGktPm5hbWUsCisJCSAgcmFuZ2UgPT0gRE1BX1JBTkdFX0FMTCA/ICJhbGwiIDoKKwkJICByYW5nZSA9PSBETUFfUkFOR0VfVFJBTlNNSVRURUQgPyAidHJhbnNtaXR0ZWQiIDoKKwkJICAidHJhbnNmZXJyZWQiKTsKIAogCWlmIChkaS0+dHhpbiA9PSBkaS0+dHhvdXQpCiAJCXJldHVybjsKQEAgLTEyMzMsNjUgKzEyMzksNTEgQEAKICAqICAgdGhlIGVycm9yKHRvc3MgZnJhbWVzKSBjb3VsZCBiZSBmYXRhbCBhbmQgY2F1c2UgbWFueSBzdWJzZXF1ZW50IGhhcmQKICAqICAgdG8gZGVidWcgcHJvYmxlbXMKICAqLwotaW50IGRtYV90eGZhc3Qoc3RydWN0IGRtYV9wdWIgKnB1Yiwgc3RydWN0IHNrX2J1ZmYgKnAwLCBib29sIGNvbW1pdCkKK2ludCBkbWFfdHhmYXN0KHN0cnVjdCBkbWFfcHViICpwdWIsIHN0cnVjdCBza19idWZmICpwLCBib29sIGNvbW1pdCkKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcCwgKm5leHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YTsKIAl1aW50IGxlbjsKIAl1MTYgdHhvdXQ7CiAJdTMyIGZsYWdzID0gMDsKIAlkbWFfYWRkcl90IHBhOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV90eGZhc3RcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCXR4b3V0ID0gZGktPnR4b3V0OwogCiAJLyoKLQkgKiBXYWxrIHRoZSBjaGFpbiBvZiBwYWNrZXQgYnVmZmVycwotCSAqIGFsbG9jYXRpbmcgYW5kIGluaXRpYWxpemluZyB0cmFuc21pdCBkZXNjcmlwdG9yIGVudHJpZXMuCisJICogb2J0YWluIGFuZCBpbml0aWFsaXplIHRyYW5zbWl0IGRlc2NyaXB0b3IgZW50cnkuCiAJICovCi0JZm9yIChwID0gcDA7IHA7IHAgPSBuZXh0KSB7Ci0JCWRhdGEgPSBwLT5kYXRhOwotCQlsZW4gPSBwLT5sZW47Ci0JCW5leHQgPSBwLT5uZXh0OworCWRhdGEgPSBwLT5kYXRhOworCWxlbiA9IHAtPmxlbjsKIAotCQkvKiByZXR1cm4gbm9uemVybyBpZiBvdXQgb2YgdHggZGVzY3JpcHRvcnMgKi8KLQkJaWYgKG5leHR0eGQoZGksIHR4b3V0KSA9PSBkaS0+dHhpbikKLQkJCWdvdG8gb3V0b2Z0eGQ7CisJLyogbm8gdXNlIHRvIHRyYW5zbWl0IGEgemVybyBsZW5ndGggcGFja2V0ICovCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gMDsKIAotCQlpZiAobGVuID09IDApCi0JCQljb250aW51ZTsKKwkvKiByZXR1cm4gbm9uemVybyBpZiBvdXQgb2YgdHggZGVzY3JpcHRvcnMgKi8KKwlpZiAobmV4dHR4ZChkaSwgdHhvdXQpID09IGRpLT50eGluKQorCQlnb3RvIG91dG9mdHhkOwogCi0JCS8qIGdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIGJ1ZmZlciBzdGFydCAqLwotCQlwYSA9IHBjaV9tYXBfc2luZ2xlKGRpLT5wYnVzLCBkYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCS8qIGdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIGJ1ZmZlciBzdGFydCAqLworCXBhID0gcGNpX21hcF9zaW5nbGUoZGktPnBidXMsIGRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAKLQkJZmxhZ3MgPSAwOwotCQlpZiAocCA9PSBwMCkKLQkJCWZsYWdzIHw9IEQ2NF9DVFJMMV9TT0Y7CisJLyogV2l0aCBhIERNQSBzZWdtZW50IGxpc3QsIERlc2NyaXB0b3IgdGFibGUgaXMgZmlsbGVkCisJICogdXNpbmcgdGhlIHNlZ21lbnQgbGlzdCBpbnN0ZWFkIG9mIGxvb3Bpbmcgb3ZlcgorCSAqIGJ1ZmZlcnMgaW4gbXVsdGktY2hhaW4gRE1BLiBUaGVyZWZvcmUsIEVPRiBmb3IgU0dMSVNUCisJICogaXMgd2hlbiBlbmQgb2Ygc2VnbWVudCBsaXN0IGlzIHJlYWNoZWQuCisJICovCisJZmxhZ3MgPSBENjRfQ1RSTDFfU09GIHwgRDY0X0NUUkwxX0lPQyB8IEQ2NF9DVFJMMV9FT0Y7CisJaWYgKHR4b3V0ID09IChkaS0+bnR4ZCAtIDEpKQorCQlmbGFncyB8PSBENjRfQ1RSTDFfRU9UOwogCi0JCS8qIFdpdGggYSBETUEgc2VnbWVudCBsaXN0LCBEZXNjcmlwdG9yIHRhYmxlIGlzIGZpbGxlZAotCQkgKiB1c2luZyB0aGUgc2VnbWVudCBsaXN0IGluc3RlYWQgb2YgbG9vcGluZyBvdmVyCi0JCSAqIGJ1ZmZlcnMgaW4gbXVsdGktY2hhaW4gRE1BLiBUaGVyZWZvcmUsIEVPRiBmb3IgU0dMSVNUCi0JCSAqIGlzIHdoZW4gZW5kIG9mIHNlZ21lbnQgbGlzdCBpcyByZWFjaGVkLgotCQkgKi8KLQkJaWYgKG5leHQgPT0gTlVMTCkKLQkJCWZsYWdzIHw9IChENjRfQ1RSTDFfSU9DIHwgRDY0X0NUUkwxX0VPRik7Ci0JCWlmICh0eG91dCA9PSAoZGktPm50eGQgLSAxKSkKLQkJCWZsYWdzIHw9IEQ2NF9DVFJMMV9FT1Q7CisJZG1hNjRfZGRfdXBkKGRpLCBkaS0+dHhkNjQsIHBhLCB0eG91dCwgJmZsYWdzLCBsZW4pOwogCi0JCWRtYTY0X2RkX3VwZChkaSwgZGktPnR4ZDY0LCBwYSwgdHhvdXQsICZmbGFncywgbGVuKTsKLQotCQl0eG91dCA9IG5leHR0eGQoZGksIHR4b3V0KTsKLQl9Ci0KLQkvKiBpZiBsYXN0IHR4ZCBlb2Ygbm90IHNldCwgZml4IGl0ICovCi0JaWYgKCEoZmxhZ3MgJiBENjRfQ1RSTDFfRU9GKSkKLQkJZGktPnR4ZDY0W3ByZXZ0eGQoZGksIHR4b3V0KV0uY3RybDEgPQotCQkgICAgIGNwdV90b19sZTMyKGZsYWdzIHwgRDY0X0NUUkwxX0lPQyB8IEQ2NF9DVFJMMV9FT0YpOworCXR4b3V0ID0gbmV4dHR4ZChkaSwgdHhvdXQpOwogCiAJLyogc2F2ZSB0aGUgcGFja2V0ICovCi0JZGktPnR4cFtwcmV2dHhkKGRpLCB0eG91dCldID0gcDA7CisJZGktPnR4cFtwcmV2dHhkKGRpLCB0eG91dCldID0gcDsKIAogCS8qIGJ1bXAgdGhlIHR4IGRlc2NyaXB0b3IgaW5kZXggKi8KIAlkaS0+dHhvdXQgPSB0eG91dDsKQEAgLTEzMDcsOCArMTI5OSw4IEBACiAJcmV0dXJuIDA7CiAKICBvdXRvZnR4ZDoKLQlETUFfRVJST1IoKCIlczogZG1hX3R4ZmFzdDogb3V0IG9mIHR4ZHMgISEhXG4iLCBkaS0+bmFtZSkpOwotCWJyY211X3BrdF9idWZfZnJlZV9za2IocDApOworCURNQV9FUlJPUigiJXM6IG91dCBvZiB0eGRzICEhIVxuIiwgZGktPm5hbWUpOworCWJyY211X3BrdF9idWZfZnJlZV9za2IocCk7CiAJZGktPmRtYS50eGF2YWlsID0gMDsKIAlkaS0+ZG1hLnR4bm9idWYrKzsKIAlyZXR1cm4gLTE7CkBAIC0xMzMxLDExICsxMzIzLDExIEBACiAJdTE2IGFjdGl2ZV9kZXNjOwogCXN0cnVjdCBza19idWZmICp0eHA7CiAKLQlETUFfVFJBQ0UoKCIlczogZG1hX2dldG5leHR0eHAgJXNcbiIsIGRpLT5uYW1lLAotCQkgICAocmFuZ2UgPT0gRE1BX1JBTkdFX0FMTCkgPyAiYWxsIiA6Ci0JCSAgICgocmFuZ2UgPT0KLQkJICAgICBETUFfUkFOR0VfVFJBTlNNSVRURUQpID8gInRyYW5zbWl0dGVkIiA6Ci0JCSAgICAidHJhbnNmZXJyZWQiKSkpOworCURNQV9UUkFDRSgiJXM6ICVzXG4iLAorCQkgIGRpLT5uYW1lLAorCQkgIHJhbmdlID09IERNQV9SQU5HRV9BTEwgPyAiYWxsIiA6CisJCSAgcmFuZ2UgPT0gRE1BX1JBTkdFX1RSQU5TTUlUVEVEID8gInRyYW5zbWl0dGVkIiA6CisJCSAgInRyYW5zZmVycmVkIik7CiAKIAlpZiAoZGktPm50eGQgPT0gMCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMzk1LDggKzEzODcsOCBAQAogCXJldHVybiB0eHA7CiAKICBib2d1czoKLQlETUFfTk9ORSgoImRtYV9nZXRuZXh0dHhwOiBib2d1cyBjdXJyOiBzdGFydCAlZCBlbmQgJWQgdHhvdXQgJWQgIgotCQkgICJmb3JjZSAlZFxuIiwgc3RhcnQsIGVuZCwgZGktPnR4b3V0LCBmb3JjZWFsbCkpOworCURNQV9OT05FKCJib2d1cyBjdXJyOiBzdGFydCAlZCBlbmQgJWQgdHhvdXQgJWRcbiIsCisJCSBzdGFydCwgZW5kLCBkaS0+dHhvdXQpOwogCXJldHVybiBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmgKaW5kZXggZWJjNWJjNS4uZDMxN2M3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2RtYS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kbWEuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZQlfQlJDTV9ETUFfSF8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSAidHlwZXMuaCIJCS8qIGZvcndhcmQgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyAqLwogCiAvKiBtYXAvdW5tYXAgZGlyZWN0aW9uICovCkBAIC04MCw3ICs4MSw3IEBACiAJCQkgICAgdWludCBucnhwb3N0LCB1aW50IHJ4b2Zmc2V0LCB1aW50ICptc2dfbGV2ZWwpOwogCiB2b2lkIGRtYV9yeGluaXQoc3RydWN0IGRtYV9wdWIgKnB1Yik7Ci1zdHJ1Y3Qgc2tfYnVmZiAqZG1hX3J4KHN0cnVjdCBkbWFfcHViICpwdWIpOworaW50IGRtYV9yeChzdHJ1Y3QgZG1hX3B1YiAqcHViLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpza2JfbGlzdCk7CiBib29sIGRtYV9yeGZpbGwoc3RydWN0IGRtYV9wdWIgKnB1Yik7CiBib29sIGRtYV9yeHJlc2V0KHN0cnVjdCBkbWFfcHViICpwdWIpOwogYm9vbCBkbWFfdHhyZXNldChzdHJ1Y3QgZG1hX3B1YiAqcHViKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMKaW5kZXggYWM4ZDAyYi4uNzYzNzZlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSA8ZGVmcy5oPgogI2luY2x1ZGUgIm5pY3BjaS5oIgpAQCAtMzksMTAgKzQwLDEwIEBACiAjZGVmaW5lIE1BQ19GSUxURVJTIChGSUZfUFJPTUlTQ19JTl9CU1MgfCBcCiAJRklGX0FMTE1VTFRJIHwgXAogCUZJRl9GQ1NGQUlMIHwgXAotCUZJRl9QTENQRkFJTCB8IFwKIAlGSUZfQ09OVFJPTCB8IFwKIAlGSUZfT1RIRVJfQlNTIHwgXAotCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQorCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwgXAorCUZJRl9QU1BPTEwpCiAKICNkZWZpbmUgQ0hBTjJHSFooY2hhbm5lbCwgZnJlcWVuY3ksIGNoZmxhZ3MpICB7IFwKIAkuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFosIFwKQEAgLTIxNSw4ICsyMTYsNyBAQAogCS5odF9jYXAgPSB7CiAJCSAgIC8qIGZyb20gaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaCAqLwogCQkgICAuY2FwID0gSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxEIHwKLQkJICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAotCQkgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8IElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVCwKKwkJCSAgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCwKIAkJICAgLmh0X3N1cHBvcnRlZCA9IHRydWUsCiAJCSAgIC5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKIAkJICAgLmFtcGR1X2RlbnNpdHkgPSBBTVBEVV9ERUZfTVBEVV9ERU5TSVRZLApAQCAtMjM3LDggKzIzNyw3IEBACiAJCQlCUkNNU19MRUdBQ1lfNUdfUkFURV9PRkZTRVQsCiAJLmh0X2NhcCA9IHsKIAkJICAgLmNhcCA9IElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCB8IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKLQkJCSAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfAotCQkJICBJRUVFODAyMTFfSFRfQ0FQXzQwTUhaX0lOVE9MRVJBTlQsIC8qIE5vIDQwIG1oeiB5ZXQgKi8KKwkJCSAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAsCiAJCSAgIC5odF9zdXBwb3J0ZWQgPSB0cnVlLAogCQkgICAuYW1wZHVfZmFjdG9yID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEssCiAJCSAgIC5hbXBkdV9kZW5zaXR5ID0gQU1QRFVfREVGX01QRFVfREVOU0lUWSwKQEAgLTI4Niw2ICsyODUsNyBAQAogewogCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IGh3LT5wcml2OwogCWJvb2wgYmxvY2tlZDsKKwlpbnQgZXJyOwogCiAJaWVlZTgwMjExX3dha2VfcXVldWVzKGh3KTsKIAlzcGluX2xvY2tfYmgoJndsLT5sb2NrKTsKQEAgLTI5NCwzMyArMjk0LDEwIEBACiAJaWYgKCFibG9ja2VkKQogCQl3aXBoeV9yZmtpbGxfc3RvcF9wb2xsaW5nKHdsLT5wdWItPmllZWVfaHctPndpcGh5KTsKIAotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19vcHNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOwotfQotCi1zdGF0aWMgaW50Ci1icmNtc19vcHNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7Ci0JaW50IGVycjsKLQotCS8qIEp1c3QgU1RBIGZvciBub3cgKi8KLQlpZiAodmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCi0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UICYmCi0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCi0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9XRFMgJiYKLQkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCXdpcGh5X2Vycihody0+d2lwaHksICIlczogQXR0ZW1wdCB0byBhZGQgdHlwZSAlZCwgb25seSIKLQkJCSAgIiBTVEEgZm9yIG5vd1xuIiwgX19mdW5jX18sIHZpZi0+dHlwZSk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQl3bCA9IGh3LT5wcml2OwogCXNwaW5fbG9ja19iaCgmd2wtPmxvY2spOworCS8qIGF2b2lkIGFja25vd2xlZGdpbmcgZnJhbWVzIGJlZm9yZSBhIG5vbi1tb25pdG9yIGRldmljZSBpcyBhZGRlZCAqLworCXdsLT5tdXRlX3R4ID0gdHJ1ZTsKKwogCWlmICghd2wtPnB1Yi0+dXApCiAJCWVyciA9IGJyY21zX3VwKHdsKTsKIAllbHNlCkBAIC0zMzAsMTYgKzMwNywyOCBAQAogCWlmIChlcnIgIT0gMCkKIAkJd2lwaHlfZXJyKGh3LT53aXBoeSwgIiVzOiBicmNtc191cCgpIHJldHVybmVkICVkXG4iLCBfX2Z1bmNfXywKIAkJCSAgZXJyKTsKLQogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkCi1icmNtc19vcHNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3N0YXRpYyB2b2lkIGJyY21zX29wc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewotCXN0cnVjdCBicmNtc19pbmZvICp3bDsKKwlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBody0+cHJpdjsKKwlpbnQgc3RhdHVzOwogCi0Jd2wgPSBody0+cHJpdjsKKwlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOworCisJaWYgKHdsLT53bGMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZ3bC0+bG9jayk7CisJc3RhdHVzID0gYnJjbXNfY19jaGlwbWF0Y2god2wtPndsYy0+aHctPnZlbmRvcmlkLAorCQkJCSAgIHdsLT53bGMtPmh3LT5kZXZpY2VpZCk7CisJc3Bpbl91bmxvY2tfYmgoJndsLT5sb2NrKTsKKwlpZiAoIXN0YXR1cykgeworCQl3aXBoeV9lcnIod2wtPndpcGh5LAorCQkJICAid2w6IGJyY21zX29wc19zdG9wOiBjaGlwbWF0Y2ggZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KIAogCS8qIHB1dCBkcml2ZXIgaW4gZG93biBzdGF0ZSAqLwogCXNwaW5fbG9ja19iaCgmd2wtPmxvY2spOwpAQCAtMzQ3LDYgKzMzNiwyOSBAQAogCXNwaW5fdW5sb2NrX2JoKCZ3bC0+bG9jayk7CiB9CiAKK3N0YXRpYyBpbnQKK2JyY21zX29wc19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IGh3LT5wcml2OworCisJLyogSnVzdCBTVEEgZm9yIG5vdyAqLworCWlmICh2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgeworCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IEF0dGVtcHQgdG8gYWRkIHR5cGUgJWQsIG9ubHkiCisJCQkgICIgU1RBIGZvciBub3dcbiIsIF9fZnVuY19fLCB2aWYtPnR5cGUpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJd2wtPm11dGVfdHggPSBmYWxzZTsKKwlicmNtc19jX211dGUod2wtPndsYywgZmFsc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCiticmNtc19vcHNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKK30KKwogc3RhdGljIGludCBicmNtc19vcHNfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7CkBAIC0zNjEsNyArMzczLDcgQEAKIAkJCQkJCSAgIGNvbmYtPmxpc3Rlbl9pbnRlcnZhbCk7CiAJfQogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX01PTklUT1IpCi0JCXdpcGh5X2Vycih3aXBoeSwgIiVzOiBjaGFuZ2UgbW9uaXRvciBtb2RlOiAlcyAoaW1wbGVtZW50KVxuIiwKKwkJd2lwaHlfZGJnKHdpcGh5LCAiJXM6IGNoYW5nZSBtb25pdG9yIG1vZGU6ICVzXG4iLAogCQkJICBfX2Z1bmNfXywgY29uZi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9NT05JVE9SID8KIAkJCSAgInRydWUiIDogImZhbHNlIik7CiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUFMpCkBAIC01MzgsMjkgKzU1MCwyNSBAQAogCiAJY2hhbmdlZF9mbGFncyAmPSBNQUNfRklMVEVSUzsKIAkqdG90YWxfZmxhZ3MgJj0gTUFDX0ZJTFRFUlM7CisKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9QUk9NSVNDX0lOX0JTUykKLQkJd2lwaHlfZXJyKHdpcGh5LCAiRklGX1BST01JU0NfSU5fQlNTXG4iKTsKKwkJd2lwaHlfZGJnKHdpcGh5LCAiRklGX1BST01JU0NfSU5fQlNTXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9BTExNVUxUSSkKLQkJd2lwaHlfZXJyKHdpcGh5LCAiRklGX0FMTE1VTFRJXG4iKTsKKwkJd2lwaHlfZGJnKHdpcGh5LCAiRklGX0FMTE1VTFRJXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9GQ1NGQUlMKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfRkNTRkFJTFxuIik7Ci0JaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfUExDUEZBSUwpCi0JCXdpcGh5X2Vycih3aXBoeSwgIkZJRl9QTENQRkFJTFxuIik7CisJCXdpcGh5X2RiZyh3aXBoeSwgIkZJRl9GQ1NGQUlMXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9DT05UUk9MKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfQ09OVFJPTFxuIik7CisJCXdpcGh5X2RiZyh3aXBoeSwgIkZJRl9DT05UUk9MXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9PVEhFUl9CU1MpCi0JCXdpcGh5X2Vycih3aXBoeSwgIkZJRl9PVEhFUl9CU1NcbiIpOwotCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKLQkJc3Bpbl9sb2NrX2JoKCZ3bC0+bG9jayk7Ci0JCWlmICgqdG90YWxfZmxhZ3MgJiBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQykgewotCQkJd2wtPnB1Yi0+bWFjODAyMTFfc3RhdGUgfD0gTUFDODAyMTFfUFJPTUlTQ19CQ05TOwotCQkJYnJjbXNfY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHdsLT53bGMsIDEpOwotCQl9IGVsc2UgewotCQkJYnJjbXNfY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHdsLT53bGMsIDApOwotCQkJd2wtPnB1Yi0+bWFjODAyMTFfc3RhdGUgJj0gfk1BQzgwMjExX1BST01JU0NfQkNOUzsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmd2wtPmxvY2spOwotCX0KKwkJd2lwaHlfZGJnKHdpcGh5LCAiRklGX09USEVSX0JTU1xuIik7CisJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfUFNQT0xMKQorCQl3aXBoeV9kYmcod2lwaHksICJGSUZfUFNQT0xMXG4iKTsKKwlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQorCQl3aXBoeV9kYmcod2lwaHksICJGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQ1xuIik7CisKKwlzcGluX2xvY2tfYmgoJndsLT5sb2NrKTsKKwlicmNtc19jX21hY19wcm9taXNjKHdsLT53bGMsICp0b3RhbF9mbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJndsLT5sb2NrKTsKIAlyZXR1cm47CiB9CiAKQEAgLTYwOCwxMyArNjE2LDYgQEAKIAl3bC0+cHViLT5nbG9iYWxfYW1wZHUtPnNjYiA9IHNjYjsKIAl3bC0+cHViLT5nbG9iYWxfYW1wZHUtPm1heF9wZHUgPSAxNjsKIAotCXN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCA9IHRydWU7Ci0Jc3RhLT5odF9jYXAuYW1wZHVfZmFjdG9yID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEs7Ci0Jc3RhLT5odF9jYXAuYW1wZHVfZGVuc2l0eSA9IEFNUERVX0RFRl9NUERVX0RFTlNJVFk7Ci0Jc3RhLT5odF9jYXAuY2FwID0gSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxEIHwKLQkgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAotCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8IElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVDsKLQogCS8qCiAJICogbWluc3RyZWxfaHQgaW5pdGlhdGVzIGFkZEJBIG9uIG91ciBiZWhhbGYgYnkgY2FsbGluZwogCSAqIGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKCkKQEAgLTg3NiwzNyArODc3LDE4IEBACiB9CiAKIC8qCi0qIGNhbGxlZCBmcm9tIGJvdGgga2VybmVsIGFzIGZyb20gdGhpcyBrZXJuZWwgbW9kdWxlLgorKiBjYWxsZWQgZnJvbSBib3RoIGtlcm5lbCBhcyBmcm9tIHRoaXMga2VybmVsIG1vZHVsZSAoZXJyb3IgZmxvdyBvbiBhdHRhY2gpCiAqIHByZWNvbmRpdGlvbjogcGVyaW1ldGVyIGxvY2sgaXMgbm90IGFjcXVpcmVkLgogKi8KIHN0YXRpYyB2b2lkIGJyY21zX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHc7Ci0JaW50IHN0YXR1czsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBody0+cHJpdjsKIAotCWh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXdsID0gaHctPnByaXY7Ci0JaWYgKCF3bCkgewotCQlwcl9lcnIoIndsOiBicmNtc19yZW1vdmU6IHBjaV9nZXRfZHJ2ZGF0YSBmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZ3bC0+bG9jayk7Ci0Jc3RhdHVzID0gYnJjbXNfY19jaGlwbWF0Y2gocGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpOwotCXNwaW5fdW5sb2NrX2JoKCZ3bC0+bG9jayk7Ci0JaWYgKCFzdGF0dXMpIHsKLQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIndsOiBicmNtc19yZW1vdmU6IGNoaXBtYXRjaCAiCi0JCQkJICAgICAiZmFpbGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KIAlpZiAod2wtPndsYykgewogCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHdsLT5wdWItPmllZWVfaHctPndpcGh5LCBmYWxzZSk7CiAJCXdpcGh5X3Jma2lsbF9zdG9wX3BvbGxpbmcod2wtPnB1Yi0+aWVlZV9ody0+d2lwaHkpOwogCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhodyk7Ci0JCXNwaW5fbG9ja19iaCgmd2wtPmxvY2spOwotCQlicmNtc19kb3duKHdsKTsKLQkJc3Bpbl91bmxvY2tfYmgoJndsLT5sb2NrKTsKIAl9CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCkBAIC0xMDgwLDkgKzEwNjIsNiBAQAogCiAJd2wtPnB1Yi0+aWVlZV9odyA9IGh3OwogCi0JLyogZGlzYWJsZSBtcGMgKi8KLQlicmNtc19jX3NldF9yYWRpb19tcGMod2wtPndsYywgZmFsc2UpOwotCiAJLyogcmVnaXN0ZXIgb3VyIGludGVycnVwdCBoYW5kbGVyICovCiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgYnJjbXNfaXNyLCBJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIHdsKSkgewogCQl3aXBoeV9lcnIod2wtPndpcGh5LCAid2wlZDogcmVxdWVzdF9pcnEoKSBmYWlsZWRcbiIsIHVuaXQpOwpAQCAtMTMxOCw4ICsxMjk3LDcgQEAKIHsKIAlCQ01NU0cod2wtPnB1Yi0+aWVlZV9ody0+d2lwaHksICJ3bCVkXG4iLCB3bC0+cHViLT51bml0KTsKIAlicmNtc19yZXNldCh3bCk7Ci0KLQlicmNtc19jX2luaXQod2wtPndsYyk7CisJYnJjbXNfY19pbml0KHdsLT53bGMsIHdsLT5tdXRlX3R4KTsKIH0KIAogLyoKQEAgLTEzMzYsNiArMTMxNCwxNCBAQAogCXJldHVybiAwOwogfQogCit2b2lkIGJyY21zX2ZhdGFsX2Vycm9yKHN0cnVjdCBicmNtc19pbmZvICp3bCkKK3sKKwl3aXBoeV9lcnIod2wtPndsYy0+d2lwaHksICJ3bCVkOiBmYXRhbCBlcnJvciwgcmVpbml0aWFsaXppbmdcbiIsCisJCSAgd2wtPndsYy0+cHViLT51bml0KTsKKwlicmNtc19yZXNldCh3bCk7CisJaWVlZTgwMjExX3Jlc3RhcnRfaHcod2wtPnB1Yi0+aWVlZV9odyk7Cit9CisKIC8qCiAgKiBUaGVzZSBhcmUgaW50ZXJydXB0IG9uL29mZiBlbnRyeSBwb2ludHMuIERpc2FibGUgaW50ZXJydXB0cwogICogZHVyaW5nIGludGVycnVwdCBzdGF0ZSB0cmFuc2l0aW9uLgpAQCAtMTU2MCwxMSArMTU0NiwxMCBAQAogCQkJaWYgKGxlMzJfdG9fY3B1KGhkci0+aWR4KSA9PSBpZHgpIHsKIAkJCQlwZGF0YSA9IHdsLT5mdy5md19iaW5baV0tPmRhdGEgKwogCQkJCQlsZTMyX3RvX2NwdShoZHItPm9mZnNldCk7Ci0JCQkJKnBidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CisJCQkJKnBidWYgPSBrbWVtZHVwKHBkYXRhLCBsZW4sIEdGUF9BVE9NSUMpOwogCQkJCWlmICgqcGJ1ZiA9PSBOVUxMKQogCQkJCQlnb3RvIGZhaWw7CiAKLQkJCQltZW1jcHkoKnBidWYsIHBkYXRhLCBsZW4pOwogCQkJCXJldHVybiAwOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFjODAyMTFfaWYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5oCmluZGV4IDE3N2YwZTQuLjYyNDJmMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5oCkBAIC04MCw2ICs4MCw3IEBACiAJc3RydWN0IGJyY21zX2Zpcm13YXJlIGZ3OwogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAJc3RydWN0IGJyY21zX3Vjb2RlIHVjb2RlOworCWJvb2wgbXV0ZV90eDsKIH07CiAKIC8qIG1pc2MgY2FsbGJhY2tzICovCkBAIC0xMDQsNSArMTA1LDYgQEAKIGV4dGVybiB2b2lkIGJyY21zX21zbGVlcChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHVpbnQgbXMpOwogZXh0ZXJuIHZvaWQgYnJjbXNfZHBjKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBleHRlcm4gdm9pZCBicmNtc190aW1lcihzdHJ1Y3QgYnJjbXNfdGltZXIgKnQpOworZXh0ZXJuIHZvaWQgYnJjbXNfZmF0YWxfZXJyb3Ioc3RydWN0IGJyY21zX2luZm8gKndsKTsKIAogI2VuZGlmCQkJCS8qIF9CUkNNX01BQzgwMjExX0lGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uYwppbmRleCA1MTBlOWJiLi44N2Y4ZjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmMKQEAgLTMwLDQ0ICszMCwyMSBAQAogI2luY2x1ZGUgIm1hYzgwMjExX2lmLmgiCiAjaW5jbHVkZSAidWNvZGVfbG9hZGVyLmgiCiAjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInNvYy5oIgogCiAvKgogICogSW5kaWNhdGlvbiBmb3IgdHhmbG93Y29udHJvbCB0aGF0IGFsbCBwcmlvcml0eSBiaXRzIGluCiAgKiBUWFFfU1RPUF9GT1JfUFJJT0ZDX01BU0sgYXJlIHRvIGJlIGNvbnNpZGVyZWQuCiAgKi8KLSNkZWZpbmUgQUxMUFJJTwkJLTEKLQotLyoKLSAqIDMyIFNTSUQgY2hhcnMsIG1heCBvZiA0IGNoYXJzIGZvciBlYWNoIFNTSUQgY2hhciAiXHhGRiIsIHBsdXMgTlVMTC4KLSAqLwotI2RlZmluZSBTU0lEX0ZNVF9CVUZfTEVOCSgoNCAqIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pICsgMSkKKyNkZWZpbmUgQUxMUFJJTwkJCQktMQogCiAvKiB3YXRjaGRvZyB0aW1lciwgaW4gdW5pdCBvZiBtcyAqLwotI2RlZmluZQlUSU1FUl9JTlRFUlZBTF9XQVRDSERPRwkxMDAwCisjZGVmaW5lIFRJTUVSX0lOVEVSVkFMX1dBVENIRE9HCQkxMDAwCiAvKiByYWRpbyBtb25pdG9yIHRpbWVyLCBpbiB1bml0IG9mIG1zICovCi0jZGVmaW5lCVRJTUVSX0lOVEVSVkFMX1JBRElPQ0hLCTgwMAotCi0vKiBNYXggTVBDIHRpbWVvdXQsIGluIHVuaXQgb2Ygd2F0Y2hkb2cgKi8KLSNpZm5kZWYgQlJDTVNfTVBDX01BWF9ERUxBWUNOVAotI2RlZmluZQlCUkNNU19NUENfTUFYX0RFTEFZQ05UCTEwCi0jZW5kaWYKLQotLyogTWluIE1QQyB0aW1lb3V0LCBpbiB1bml0IG9mIHdhdGNoZG9nICovCi0jZGVmaW5lCUJSQ01TX01QQ19NSU5fREVMQVlDTlQJMQotI2RlZmluZQlCUkNNU19NUENfVEhSRVNIT0xECTMJLyogTVBDIGNvdW50IHRocmVzaG9sZCBsZXZlbCAqLworI2RlZmluZSBUSU1FUl9JTlRFUlZBTF9SQURJT0NISwkJODAwCiAKIC8qIGJlYWNvbiBpbnRlcnZhbCwgaW4gdW5pdCBvZiAxMDI0VFUgKi8KLSNkZWZpbmUJQkVBQ09OX0lOVEVSVkFMX0RFRkFVTFQJMTAwCi0vKiBEVElNIGludGVydmFsLCBpbiB1bml0IG9mIGJlYWNvbiBpbnRlcnZhbCAqLwotI2RlZmluZQlEVElNX0lOVEVSVkFMX0RFRkFVTFQJMwotCi0vKiBTY2FsZSBkb3duIGRlbGF5cyB0byBhY2NvbW1vZGF0ZSBRVCBzbG93IHNwZWVkICovCi0vKiBiZWFjb24gaW50ZXJ2YWwsIGluIHVuaXQgb2YgMTAyNFRVICovCi0jZGVmaW5lCUJFQUNPTl9JTlRFUlZBTF9ERUZfUVQJMjAKLS8qIERUSU0gaW50ZXJ2YWwsIGluIHVuaXQgb2YgYmVhY29uIGludGVydmFsICovCi0jZGVmaW5lCURUSU1fSU5URVJWQUxfREVGX1FUCTEKLQotI2RlZmluZQlUQlRUX0FMSUdOX0xFRVdBWV9VUwkxMDAJLyogbWluIGxlZXdheSBiZWZvcmUgZmlyc3QgVEJUVCBpbiB1cyAqLworI2RlZmluZSBCRUFDT05fSU5URVJWQUxfREVGQVVMVAkJMTAwCiAKIC8qIG4tbW9kZSBzdXBwb3J0IGNhcGFiaWxpdHkgKi8KIC8qIDJ4MiBpbmNsdWRlcyBib3RoIDF4MSAmIDJ4MiBkZXZpY2VzCkBAIC03OCwxMTMgKzU1LDcxIEBACiAjZGVmaW5lIFdMXzExTl8zeDMJCQkzCiAjZGVmaW5lIFdMXzExTl80eDQJCQk0CiAKLS8qIGRlZmluZSAxMW4gZmVhdHVyZSBkaXNhYmxlIGZsYWdzICovCi0jZGVmaW5lIFdMRkVBVFVSRV9ESVNBQkxFXzExTgkJMHgwMDAwMDAwMQotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fU1RCQ19UWAkweDAwMDAwMDAyCi0jZGVmaW5lIFdMRkVBVFVSRV9ESVNBQkxFXzExTl9TVEJDX1JYCTB4MDAwMDAwMDQKLSNkZWZpbmUgV0xGRUFUVVJFX0RJU0FCTEVfMTFOX1NHSV9UWAkweDAwMDAwMDA4Ci0jZGVmaW5lIFdMRkVBVFVSRV9ESVNBQkxFXzExTl9TR0lfUlgJMHgwMDAwMDAxMAotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fQU1QRFVfVFgJMHgwMDAwMDAyMAotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fQU1QRFVfUlgJMHgwMDAwMDA0MAotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fR0YJMHgwMDAwMDA4MAorI2RlZmluZSBFRENGX0FDSV9NQVNLCQkJMHg2MAorI2RlZmluZSBFRENGX0FDSV9TSElGVAkJCTUKKyNkZWZpbmUgRURDRl9FQ1dNSU5fTUFTSwkJMHgwZgorI2RlZmluZSBFRENGX0VDV01BWF9TSElGVAkJNAorI2RlZmluZSBFRENGX0FJRlNOX01BU0sJCQkweDBmCisjZGVmaW5lIEVEQ0ZfQUlGU05fTUFYCQkJMTUKKyNkZWZpbmUgRURDRl9FQ1dNQVhfTUFTSwkJMHhmMAogCi0jZGVmaW5lIEVEQ0ZfQUNJX01BU0sgICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBFRENGX0FDSV9TSElGVCAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgRURDRl9FQ1dNSU5fTUFTSyAgICAgICAgICAgICAweDBmCi0jZGVmaW5lIEVEQ0ZfRUNXTUFYX1NISUZUICAgICAgICAgICAgNAotI2RlZmluZSBFRENGX0FJRlNOX01BU0sgICAgICAgICAgICAgIDB4MGYKLSNkZWZpbmUgRURDRl9BSUZTTl9NQVggICAgICAgICAgICAgICAxNQotI2RlZmluZSBFRENGX0VDV01BWF9NQVNLICAgICAgICAgICAgIDB4ZjAKKyNkZWZpbmUgRURDRl9BQ19CRV9UWE9QX1NUQQkJMHgwMDAwCisjZGVmaW5lIEVEQ0ZfQUNfQktfVFhPUF9TVEEJCTB4MDAwMAorI2RlZmluZSBFRENGX0FDX1ZPX0FDSV9TVEEJCTB4NjIKKyNkZWZpbmUgRURDRl9BQ19WT19FQ1dfU1RBCQkweDMyCisjZGVmaW5lIEVEQ0ZfQUNfVklfQUNJX1NUQQkJMHg0MgorI2RlZmluZSBFRENGX0FDX1ZJX0VDV19TVEEJCTB4NDMKKyNkZWZpbmUgRURDRl9BQ19CS19FQ1dfU1RBCQkweEE0CisjZGVmaW5lIEVEQ0ZfQUNfVklfVFhPUF9TVEEJCTB4MDA1ZQorI2RlZmluZSBFRENGX0FDX1ZPX1RYT1BfU1RBCQkweDAwMmYKKyNkZWZpbmUgRURDRl9BQ19CRV9BQ0lfU1RBCQkweDAzCisjZGVmaW5lIEVEQ0ZfQUNfQkVfRUNXX1NUQQkJMHhBNAorI2RlZmluZSBFRENGX0FDX0JLX0FDSV9TVEEJCTB4MjcKKyNkZWZpbmUgRURDRl9BQ19WT19UWE9QX0FQCQkweDAwMmYKIAotI2RlZmluZSBFRENGX0FDX0JFX1RYT1BfU1RBICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBFRENGX0FDX0JLX1RYT1BfU1RBICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBFRENGX0FDX1ZPX0FDSV9TVEEgICAgICAgICAgIDB4NjIKLSNkZWZpbmUgRURDRl9BQ19WT19FQ1dfU1RBICAgICAgICAgICAweDMyCi0jZGVmaW5lIEVEQ0ZfQUNfVklfQUNJX1NUQSAgICAgICAgICAgMHg0MgotI2RlZmluZSBFRENGX0FDX1ZJX0VDV19TVEEgICAgICAgICAgIDB4NDMKLSNkZWZpbmUgRURDRl9BQ19CS19FQ1dfU1RBICAgICAgICAgICAweEE0Ci0jZGVmaW5lIEVEQ0ZfQUNfVklfVFhPUF9TVEEgICAgICAgICAgMHgwMDVlCi0jZGVmaW5lIEVEQ0ZfQUNfVk9fVFhPUF9TVEEgICAgICAgICAgMHgwMDJmCi0jZGVmaW5lIEVEQ0ZfQUNfQkVfQUNJX1NUQSAgICAgICAgICAgMHgwMwotI2RlZmluZSBFRENGX0FDX0JFX0VDV19TVEEgICAgICAgICAgIDB4QTQKLSNkZWZpbmUgRURDRl9BQ19CS19BQ0lfU1RBICAgICAgICAgICAweDI3Ci0jZGVmaW5lIEVEQ0ZfQUNfVk9fVFhPUF9BUCAgICAgICAgICAgMHgwMDJmCisjZGVmaW5lIEVEQ0ZfVFhPUDJVU0VDKHR4b3ApCQkoKHR4b3ApIDw8IDUpCisjZGVmaW5lIEVEQ0ZfRUNXMkNXKGV4cCkJCSgoMSA8PCAoZXhwKSkgLSAxKQogCi0jZGVmaW5lIEVEQ0ZfVFhPUDJVU0VDKHR4b3ApICAgICAgICAgKCh0eG9wKSA8PCA1KQotI2RlZmluZSBFRENGX0VDVzJDVyhleHApICAgICAgICAgICAgICgoMSA8PCAoZXhwKSkgLSAxKQorI2RlZmluZSBBUEhZX1NZTUJPTF9USU1FCQk0CisjZGVmaW5lIEFQSFlfUFJFQU1CTEVfVElNRQkJMTYKKyNkZWZpbmUgQVBIWV9TSUdOQUxfVElNRQkJNAorI2RlZmluZSBBUEhZX1NJRlNfVElNRQkJCTE2CisjZGVmaW5lIEFQSFlfU0VSVklDRV9OQklUUwkJMTYKKyNkZWZpbmUgQVBIWV9UQUlMX05CSVRTCQkJNgorI2RlZmluZSBCUEhZX1NJRlNfVElNRQkJCTEwCisjZGVmaW5lIEJQSFlfUExDUF9TSE9SVF9USU1FCQk5NgogCi0jZGVmaW5lIEFQSFlfU1lNQk9MX1RJTUUJNAotI2RlZmluZSBBUEhZX1BSRUFNQkxFX1RJTUUJMTYKLSNkZWZpbmUgQVBIWV9TSUdOQUxfVElNRQk0Ci0jZGVmaW5lIEFQSFlfU0lGU19USU1FCQkxNgotI2RlZmluZSBBUEhZX1NFUlZJQ0VfTkJJVFMJMTYKLSNkZWZpbmUgQVBIWV9UQUlMX05CSVRTCQk2Ci0jZGVmaW5lIEJQSFlfU0lGU19USU1FCQkxMAotI2RlZmluZSBCUEhZX1BMQ1BfU0hPUlRfVElNRQk5NgotCi0jZGVmaW5lIFBSRU5fUFJFQU1CTEUJCTI0Ci0jZGVmaW5lIFBSRU5fTU1fRVhUCQkxMgotI2RlZmluZSBQUkVOX1BSRUFNQkxFX0VYVAk0CisjZGVmaW5lIFBSRU5fUFJFQU1CTEUJCQkyNAorI2RlZmluZSBQUkVOX01NX0VYVAkJCTEyCisjZGVmaW5lIFBSRU5fUFJFQU1CTEVfRVhUCQk0CiAKICNkZWZpbmUgRE9UMTFfTUFDX0hEUl9MRU4JCTI0Ci0jZGVmaW5lCURPVDExX0FDS19MRU4JCTEwCi0jZGVmaW5lIERPVDExX0JBX0xFTgkJNAorI2RlZmluZSBET1QxMV9BQ0tfTEVOCQkJMTAKKyNkZWZpbmUgRE9UMTFfQkFfTEVOCQkJNAogI2RlZmluZSBET1QxMV9PRkRNX1NJR05BTF9FWFRFTlNJT04JNgogI2RlZmluZSBET1QxMV9NSU5fRlJBR19MRU4JCTI1NgotI2RlZmluZQlET1QxMV9SVFNfTEVOCQkxNgotI2RlZmluZQlET1QxMV9DVFNfTEVOCQkxMAorI2RlZmluZSBET1QxMV9SVFNfTEVOCQkJMTYKKyNkZWZpbmUgRE9UMTFfQ1RTX0xFTgkJCTEwCiAjZGVmaW5lIERPVDExX0JBX0JJVE1BUF9MRU4JCTEyOAogI2RlZmluZSBET1QxMV9NSU5fQkVBQ09OX1BFUklPRAkJMQogI2RlZmluZSBET1QxMV9NQVhfQkVBQ09OX1BFUklPRAkJMHhGRkZGCi0jZGVmaW5lCURPVDExX01BWE5VTUZSQUdTCTE2CisjZGVmaW5lIERPVDExX01BWE5VTUZSQUdTCQkxNgogI2RlZmluZSBET1QxMV9NQVhfRlJBR19MRU4JCTIzNDYKIAotI2RlZmluZSBCUEhZX1BMQ1BfVElNRQkJMTkyCi0jZGVmaW5lIFJJRlNfMTFOX1RJTUUJCTIKKyNkZWZpbmUgQlBIWV9QTENQX1RJTUUJCQkxOTIKKyNkZWZpbmUgUklGU18xMU5fVElNRQkJCTIKIAotI2RlZmluZSBXTUVfVkVSCQkJMQotI2RlZmluZSBXTUVfU1VCVFlQRV9QQVJBTV9JRQkxCi0jZGVmaW5lIFdNRV9UWVBFCQkyCi0jZGVmaW5lIFdNRV9PVUkJCQkiXHgwMFx4NTBceGYyIgotCi0jZGVmaW5lIEFDX0JFCQkJMAotI2RlZmluZSBBQ19CSwkJCTEKLSNkZWZpbmUgQUNfVkkJCQkyCi0jZGVmaW5lIEFDX1ZPCQkJMwotCi0jZGVmaW5lCUJDTl9UTVBMX0xFTgkJNTEyCS8qIGxlbmd0aCBvZiB0aGUgQkNOIHRlbXBsYXRlIGFyZWEgKi8KKy8qIGxlbmd0aCBvZiB0aGUgQkNOIHRlbXBsYXRlIGFyZWEgKi8KKyNkZWZpbmUgQkNOX1RNUExfTEVOCQkJNTEyCiAKIC8qIGJyY21zX2Jzc19pbmZvIGZsYWcgYml0IHZhbHVlcyAqLwotI2RlZmluZSBCUkNNU19CU1NfSFQJCTB4MDAyMAkvKiBCU1MgaXMgSFQgKE1JTU8pIGNhcGFibGUgKi8KKyNkZWZpbmUgQlJDTVNfQlNTX0hUCQkJMHgwMDIwCS8qIEJTUyBpcyBIVCAoTUlNTykgY2FwYWJsZSAqLwogCi0vKiBGbGFncyB1c2VkIGluIGJyY21zX2NfdHhxX2luZm8uc3RvcHBlZCAqLwotLyogcGVyIHByaW8gZmxvdyBjb250cm9sIGJpdHMgKi8KLSNkZWZpbmUgVFhRX1NUT1BfRk9SX1BSSU9GQ19NQVNLCTB4MDAwMDAwRkYKLS8qIHN0b3AgdHhxIGVucXVldWUgZm9yIHBhY2tldCBkcmFpbiAqLwotI2RlZmluZSBUWFFfU1RPUF9GT1JfUEtUX0RSQUlOCQkweDAwMDAwMTAwCi0vKiBzdG9wIHR4cSBlbnF1ZXVlIGZvciBhbXBkdSBmbG93IGNvbnRyb2wgKi8KLSNkZWZpbmUgVFhRX1NUT1BfRk9SX0FNUERVX0ZMT1dfQ05UUkwJMHgwMDAwMDIwMAotCi0jZGVmaW5lCUJSQ01TX0hXUlhPRkYJCTM4CS8qIGNoaXAgcnggYnVmZmVyIG9mZnNldCAqLwotCi0vKiBGaW5kIGJhc2ljIHJhdGUgZm9yIGEgZ2l2ZW4gcmF0ZSAqLwotc3RhdGljIHU4IGJyY21zX2Jhc2ljX3JhdGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1MzIgcnNwZWMpCi17Ci0JaWYgKGlzX21jc19yYXRlKHJzcGVjKSkKLQkJcmV0dXJuIHdsYy0+YmFuZC0+YmFzaWNfcmF0ZVttY3NfdGFibGVbcnNwZWMgJiBSU1BFQ19SQVRFX01BU0tdCi0JCSAgICAgICAubGVnX29mZG1dOwotCXJldHVybiB3bGMtPmJhbmQtPmJhc2ljX3JhdGVbcnNwZWMgJiBSU1BFQ19SQVRFX01BU0tdOwotfQotCi1zdGF0aWMgdTE2IGZyYW1ldHlwZSh1MzIgcnNwZWMsIHU4IG1pbW9mcmFtZSkKLXsKLQlpZiAoaXNfbWNzX3JhdGUocnNwZWMpKQotCQlyZXR1cm4gbWltb2ZyYW1lOwotCXJldHVybiBpc19jY2tfcmF0ZShyc3BlYykgPyBGVF9DQ0sgOiBGVF9PRkRNOwotfQorLyogY2hpcCByeCBidWZmZXIgb2Zmc2V0ICovCisjZGVmaW5lIEJSQ01TX0hXUlhPRkYJCQkzOAogCiAvKiByZmRpc2FibGUgZGVsYXkgdGltZXIgNTAwIG1zLCBydW5zIG9mIEFMUCBjbG9jayAqLwotI2RlZmluZSBSRkRJU0FCTEVfREVGQVVMVAkxMDAwMDAwMAorI2RlZmluZSBSRkRJU0FCTEVfREVGQVVMVAkJMTAwMDAwMDAKIAogI2RlZmluZSBCUkNNU19URU1QU0VOU0VfUEVSSU9ECQkxMAkvKiAxMCBzZWNvbmQgdGltZW91dCAqLwogCkBAIC0xOTQsODcgKzEyOSw4MyBAQAogICogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIE9OTFkgYnkgd2xjX3ByaW8ycHJlY19tYXAuICBEbyBub3QgdXNlIHRoZW0KICAqIGVsc2V3aGVyZS4KICAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19OT05FCQkwCS8qIE5vbmUgPSAtICovCi0jZGVmaW5lCV9CUkNNU19QUkVDX0JLCQkyCS8qIEJLIC0gQmFja2dyb3VuZCAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19CRQkJNAkvKiBCRSAtIEJlc3QtZWZmb3J0ICovCi0jZGVmaW5lCV9CUkNNU19QUkVDX0VFCQk2CS8qIEVFIC0gRXhjZWxsZW50LWVmZm9ydCAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19DTAkJOAkvKiBDTCAtIENvbnRyb2xsZWQgTG9hZCAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19WSQkJMTAJLyogVmkgLSBWaWRlbyAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19WTwkJMTIJLyogVm8gLSBWb2ljZSAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19OQwkJMTQJLyogTkMgLSBOZXR3b3JrIENvbnRyb2wgKi8KKyNkZWZpbmUgX0JSQ01TX1BSRUNfTk9ORQkJMAkvKiBOb25lID0gLSAqLworI2RlZmluZSBfQlJDTVNfUFJFQ19CSwkJCTIJLyogQksgLSBCYWNrZ3JvdW5kICovCisjZGVmaW5lIF9CUkNNU19QUkVDX0JFCQkJNAkvKiBCRSAtIEJlc3QtZWZmb3J0ICovCisjZGVmaW5lIF9CUkNNU19QUkVDX0VFCQkJNgkvKiBFRSAtIEV4Y2VsbGVudC1lZmZvcnQgKi8KKyNkZWZpbmUgX0JSQ01TX1BSRUNfQ0wJCQk4CS8qIENMIC0gQ29udHJvbGxlZCBMb2FkICovCisjZGVmaW5lIF9CUkNNU19QUkVDX1ZJCQkJMTAJLyogVmkgLSBWaWRlbyAqLworI2RlZmluZSBfQlJDTVNfUFJFQ19WTwkJCTEyCS8qIFZvIC0gVm9pY2UgKi8KKyNkZWZpbmUgX0JSQ01TX1BSRUNfTkMJCQkxNAkvKiBOQyAtIE5ldHdvcmsgQ29udHJvbCAqLwogCi0vKiBUaGUgQlNTIGlzIGdlbmVyYXRpbmcgYmVhY29ucyBpbiBIVyAqLwotI2RlZmluZSBCUkNNU19CU1NDRkdfSFdfQkNOCTB4MjAKKy8qIHN5bnRocHVfZGx5IHRpbWVzIGluIHVzICovCisjZGVmaW5lIFNZTlRIUFVfRExZX0FQSFlfVVMJCTM3MDAKKyNkZWZpbmUgU1lOVEhQVV9ETFlfQlBIWV9VUwkJMTA1MAorI2RlZmluZSBTWU5USFBVX0RMWV9OUEhZX1VTCQkyMDQ4CisjZGVmaW5lIFNZTlRIUFVfRExZX0xQUEhZX1VTCQkzMDAKIAotI2RlZmluZQlTWU5USFBVX0RMWV9BUEhZX1VTCTM3MDAJLyogYSBwaHkgc3ludGhwdV9kbHkgdGltZSBpbiB1cyAqLwotI2RlZmluZQlTWU5USFBVX0RMWV9CUEhZX1VTCTEwNTAJLyogYi9nIHBoeSBzeW50aHB1X2RseSB0aW1lIGluIHVzICovCi0jZGVmaW5lCVNZTlRIUFVfRExZX05QSFlfVVMJMjA0OAkvKiBuIHBoeSBSRVYzIHN5bnRocHVfZGx5IHRpbWUgaW4gdXMgKi8KLSNkZWZpbmUJU1lOVEhQVV9ETFlfTFBQSFlfVVMJMzAwCS8qIGxwcGh5IHN5bnRocHVfZGx5IHRpbWUgaW4gdXMgKi8KLQotI2RlZmluZQlTWU5USFBVX0RMWV9QSFlfVVNfUVQJMTAwCS8qIFFUIHN5bnRocHVfZGx5IHRpbWUgaW4gdXMgKi8KLQotI2RlZmluZQlBTlRDTlQJCQkxMAkvKiB2YW5pbGxhIE1fTUFYX0FOVENOVCB2YWx1ZSAqLworI2RlZmluZSBBTlRDTlQJCQkJMTAJLyogdmFuaWxsYSBNX01BWF9BTlRDTlQgdmFsICovCiAKIC8qIFBlci1BQyByZXRyeSBsaW1pdCByZWdpc3RlciBkZWZpbml0aW9uczsgdXNlcyBkZWZzLmggYml0ZmllbGQgbWFjcm9zICovCi0jZGVmaW5lIEVEQ0ZfU0hPUlRfUyAgICAgICAgICAgIDAKLSNkZWZpbmUgRURDRl9TRkJfUyAgICAgICAgICAgICAgNAotI2RlZmluZSBFRENGX0xPTkdfUyAgICAgICAgICAgICA4Ci0jZGVmaW5lIEVEQ0ZfTEZCX1MgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIEVEQ0ZfU0hPUlRfTSAgICAgICAgICAgIEJJVEZJRUxEX01BU0soNCkKLSNkZWZpbmUgRURDRl9TRkJfTSAgICAgICAgICAgICAgQklURklFTERfTUFTSyg0KQotI2RlZmluZSBFRENGX0xPTkdfTSAgICAgICAgICAgICBCSVRGSUVMRF9NQVNLKDQpCi0jZGVmaW5lIEVEQ0ZfTEZCX00gICAgICAgICAgICAgIEJJVEZJRUxEX01BU0soNCkKKyNkZWZpbmUgRURDRl9TSE9SVF9TCQkJMAorI2RlZmluZSBFRENGX1NGQl9TCQkJNAorI2RlZmluZSBFRENGX0xPTkdfUwkJCTgKKyNkZWZpbmUgRURDRl9MRkJfUwkJCTEyCisjZGVmaW5lIEVEQ0ZfU0hPUlRfTQkJCUJJVEZJRUxEX01BU0soNCkKKyNkZWZpbmUgRURDRl9TRkJfTQkJCUJJVEZJRUxEX01BU0soNCkKKyNkZWZpbmUgRURDRl9MT05HX00JCQlCSVRGSUVMRF9NQVNLKDQpCisjZGVmaW5lIEVEQ0ZfTEZCX00JCQlCSVRGSUVMRF9NQVNLKDQpCiAKLSNkZWZpbmUJUkVUUllfU0hPUlRfREVGCQkJNwkvKiBEZWZhdWx0IFNob3J0IHJldHJ5IExpbWl0ICovCi0jZGVmaW5lCVJFVFJZX1NIT1JUX01BWAkJCTI1NQkvKiBNYXhpbXVtIFNob3J0IHJldHJ5IExpbWl0ICovCi0jZGVmaW5lCVJFVFJZX0xPTkdfREVGCQkJNAkvKiBEZWZhdWx0IExvbmcgcmV0cnkgY291bnQgKi8KLSNkZWZpbmUJUkVUUllfU0hPUlRfRkIJCQkzIC8qIFNob3J0IGNvdW50IGZvciBmYWxsYmFjayByYXRlICovCi0jZGVmaW5lCVJFVFJZX0xPTkdfRkIJCQkyIC8qIExvbmcgY291bnQgZm9yIGZhbGxiYWNrIHJhdGUgKi8KKyNkZWZpbmUgUkVUUllfU0hPUlRfREVGCQkJNwkvKiBEZWZhdWx0IFNob3J0IHJldHJ5IExpbWl0ICovCisjZGVmaW5lIFJFVFJZX1NIT1JUX01BWAkJCTI1NQkvKiBNYXhpbXVtIFNob3J0IHJldHJ5IExpbWl0ICovCisjZGVmaW5lIFJFVFJZX0xPTkdfREVGCQkJNAkvKiBEZWZhdWx0IExvbmcgcmV0cnkgY291bnQgKi8KKyNkZWZpbmUgUkVUUllfU0hPUlRfRkIJCQkzCS8qIFNob3J0IGNvdW50IGZvciBmYiByYXRlICovCisjZGVmaW5lIFJFVFJZX0xPTkdfRkIJCQkyCS8qIExvbmcgY291bnQgZm9yIGZiIHJhdGUgKi8KIAotI2RlZmluZQlBUEhZX0NXTUlOCQkxNQotI2RlZmluZSBQSFlfQ1dNQVgJCTEwMjMKKyNkZWZpbmUgQVBIWV9DV01JTgkJCTE1CisjZGVmaW5lIFBIWV9DV01BWAkJCTEwMjMKIAotI2RlZmluZSBFRENGX0FJRlNOX01JTiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRURDRl9BSUZTTl9NSU4JCQkxCiAKLSNkZWZpbmUgRlJBR05VTV9NQVNLCQkweEYKKyNkZWZpbmUgRlJBR05VTV9NQVNLCQkJMHhGCiAKLSNkZWZpbmUgQVBIWV9TTE9UX1RJTUUJCTkKLSNkZWZpbmUgQlBIWV9TTE9UX1RJTUUJCTIwCisjZGVmaW5lIEFQSFlfU0xPVF9USU1FCQkJOQorI2RlZmluZSBCUEhZX1NMT1RfVElNRQkJCTIwCiAKLSNkZWZpbmUJV0xfU1BVUkFWT0lEX09GRgkwCi0jZGVmaW5lCVdMX1NQVVJBVk9JRF9PTjEJMQotI2RlZmluZQlXTF9TUFVSQVZPSURfT04yCTIKKyNkZWZpbmUgV0xfU1BVUkFWT0lEX09GRgkJMAorI2RlZmluZSBXTF9TUFVSQVZPSURfT04xCQkxCisjZGVmaW5lIFdMX1NQVVJBVk9JRF9PTjIJCTIKIAogLyogaW52YWxpZCBjb3JlIGZsYWdzLCB1c2UgdGhlIHNhdmVkIGNvcmVmbGFncyAqLwotI2RlZmluZSBCUkNNU19VU0VfQ09SRUZMQUdTCTB4ZmZmZmZmZmYKKyNkZWZpbmUgQlJDTVNfVVNFX0NPUkVGTEFHUwkJMHhmZmZmZmZmZgogCiAvKiB2YWx1ZXMgZm9yIFBMQ1BIZHJfb3ZlcnJpZGUgKi8KLSNkZWZpbmUgQlJDTVNfUExDUF9BVVRPCS0xCi0jZGVmaW5lIEJSQ01TX1BMQ1BfU0hPUlQJMAotI2RlZmluZSBCUkNNU19QTENQX0xPTkcJMQorI2RlZmluZSBCUkNNU19QTENQX0FVVE8JCQktMQorI2RlZmluZSBCUkNNU19QTENQX1NIT1JUCQkwCisjZGVmaW5lIEJSQ01TX1BMQ1BfTE9ORwkJCTEKIAogLyogdmFsdWVzIGZvciBnX3Byb3RlY3Rpb25fb3ZlcnJpZGUgYW5kIG5fcHJvdGVjdGlvbl9vdmVycmlkZSAqLwogI2RlZmluZSBCUkNNU19QUk9URUNUSU9OX0FVVE8JCS0xCiAjZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fT0ZGCQkwCiAjZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fT04JCTEKICNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9NTUhEUl9PTkxZCTIKLSNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9DVFNfT05MWQkJMworI2RlZmluZSBCUkNNU19QUk9URUNUSU9OX0NUU19PTkxZCTMKIAogLyogdmFsdWVzIGZvciBnX3Byb3RlY3Rpb25fY29udHJvbCBhbmQgbl9wcm90ZWN0aW9uX2NvbnRyb2wgKi8KLSNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9DVExfT0ZGCQkwCisjZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fQ1RMX09GRgkwCiAjZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fQ1RMX0xPQ0FMCTEKICNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9DVExfT1ZFUkxBUAkyCiAKIC8qIHZhbHVlcyBmb3Igbl9wcm90ZWN0aW9uICovCiAjZGVmaW5lIEJSQ01TX05fUFJPVEVDVElPTl9PRkYJCTAKICNkZWZpbmUgQlJDTVNfTl9QUk9URUNUSU9OX09QVElPTkFMCTEKLSNkZWZpbmUgQlJDTVNfTl9QUk9URUNUSU9OXzIwSU40MAkJMgorI2RlZmluZSBCUkNNU19OX1BST1RFQ1RJT05fMjBJTjQwCTIKICNkZWZpbmUgQlJDTVNfTl9QUk9URUNUSU9OX01JWEVETU9ERQkzCiAKIC8qIHZhbHVlcyBmb3IgYmFuZCBzcGVjaWZpYyA0ME1IeiBjYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgQlJDTVNfTl9CV18yMEFMTAkJCTAKLSNkZWZpbmUgQlJDTVNfTl9CV180MEFMTAkJCTEKLSNkZWZpbmUgQlJDTVNfTl9CV18yMElOMkdfNDBJTjVHCQkyCisjZGVmaW5lIEJSQ01TX05fQldfMjBBTEwJCTAKKyNkZWZpbmUgQlJDTVNfTl9CV180MEFMTAkJMQorI2RlZmluZSBCUkNNU19OX0JXXzIwSU4yR180MElONUcJMgogCiAvKiBiaXRmbGFncyBmb3IgU0dJIHN1cHBvcnQgKHNnaV9yeCBpb3ZhcikgKi8KICNkZWZpbmUgQlJDTVNfTl9TR0lfMjAJCQkweDAxCkBAIC0yODIsNDggKzIxMyw0MiBAQAogCiAvKiBkZWZpbmVzIHVzZWQgYnkgdGhlIG5yYXRlIGlvdmFyICovCiAvKiBNU0MgaW4gdXNlLGluZGljYXRlcyBiMC02IGhvbGRzIGFuIG1jcyAqLwotI2RlZmluZSBOUkFURV9NQ1NfSU5VU0UJMHgwMDAwMDA4MAorI2RlZmluZSBOUkFURV9NQ1NfSU5VU0UJCQkweDAwMDAwMDgwCiAvKiByYXRlL21jcyB2YWx1ZSAqLwotI2RlZmluZSBOUkFURV9SQVRFX01BU0sgMHgwMDAwMDA3ZgorI2RlZmluZSBOUkFURV9SQVRFX01BU0sJCQkweDAwMDAwMDdmCiAvKiBzdGYgbW9kZSBtYXNrOiBzaXNvLCBjZGQsIHN0YmMsIHNkbSAqLwotI2RlZmluZSBOUkFURV9TVEZfTUFTSwkweDAwMDBmZjAwCisjZGVmaW5lIE5SQVRFX1NURl9NQVNLCQkJMHgwMDAwZmYwMAogLyogc3RmIG1vZGUgc2hpZnQgKi8KLSNkZWZpbmUgTlJBVEVfU1RGX1NISUZUCTgKLS8qIGJpdCBpbmRpY2F0ZXMgb3ZlcnJpZGUgYm90aCByYXRlICYgbW9kZSAqLwotI2RlZmluZSBOUkFURV9PVkVSUklERQkweDgwMDAwMDAwCisjZGVmaW5lIE5SQVRFX1NURl9TSElGVAkJCTgKIC8qIGJpdCBpbmRpY2F0ZSB0byBvdmVycmlkZSBtY3Mgb25seSAqLwotI2RlZmluZSBOUkFURV9PVkVSUklERV9NQ1NfT05MWSAweDQwMDAwMDAwCi0jZGVmaW5lIE5SQVRFX1NHSV9NQVNLICAweDAwODAwMDAwCS8qIHNnaSBtb2RlICovCi0jZGVmaW5lIE5SQVRFX1NHSV9TSElGVCAyMwkvKiBzZ2kgbW9kZSAqLwotI2RlZmluZSBOUkFURV9MRFBDX0NPRElORyAweDAwNDAwMDAwCS8qIGJpdCBpbmRpY2F0ZXMgYWR2IGNvZGluZyBpbiB1c2UgKi8KLSNkZWZpbmUgTlJBVEVfTERQQ19TSElGVCAyMgkvKiBsZHBjIHNoaWZ0ICovCisjZGVmaW5lIE5SQVRFX09WRVJSSURFX01DU19PTkxZCQkweDQwMDAwMDAwCisjZGVmaW5lIE5SQVRFX1NHSV9NQVNLCQkJMHgwMDgwMDAwMAkvKiBzZ2kgbW9kZSAqLworI2RlZmluZSBOUkFURV9TR0lfU0hJRlQJCQkyMwkJLyogc2dpIG1vZGUgKi8KKyNkZWZpbmUgTlJBVEVfTERQQ19DT0RJTkcJCTB4MDA0MDAwMDAJLyogYWR2IGNvZGluZyBpbiB1c2UgKi8KKyNkZWZpbmUgTlJBVEVfTERQQ19TSElGVAkJMjIJCS8qIGxkcGMgc2hpZnQgKi8KIAotI2RlZmluZSBOUkFURV9TVEZfU0lTTwkwCS8qIHN0ZiBtb2RlIFNJU08gKi8KLSNkZWZpbmUgTlJBVEVfU1RGX0NERAkxCS8qIHN0ZiBtb2RlIENERCAqLwotI2RlZmluZSBOUkFURV9TVEZfU1RCQwkyCS8qIHN0ZiBtb2RlIFNUQkMgKi8KLSNkZWZpbmUgTlJBVEVfU1RGX1NETQkzCS8qIHN0ZiBtb2RlIFNETSAqLworI2RlZmluZSBOUkFURV9TVEZfU0lTTwkJCTAJCS8qIHN0ZiBtb2RlIFNJU08gKi8KKyNkZWZpbmUgTlJBVEVfU1RGX0NERAkJCTEJCS8qIHN0ZiBtb2RlIENERCAqLworI2RlZmluZSBOUkFURV9TVEZfU1RCQwkJCTIJCS8qIHN0ZiBtb2RlIFNUQkMgKi8KKyNkZWZpbmUgTlJBVEVfU1RGX1NETQkJCTMJCS8qIHN0ZiBtb2RlIFNETSAqLwogCi0jZGVmaW5lIE1BWF9ETUFfU0VHUyA0CisjZGVmaW5lIE1BWF9ETUFfU0VHUwkJCTQKIAogLyogTWF4ICMgb2YgZW50cmllcyBpbiBUeCBGSUZPIGJhc2VkIG9uIDRrYiBwYWdlIHNpemUgKi8KLSNkZWZpbmUgTlRYRAkJMjU2CisjZGVmaW5lIE5UWEQJCQkJMjU2CiAvKiBNYXggIyBvZiBlbnRyaWVzIGluIFJ4IEZJRk8gYmFzZWQgb24gNGtiIHBhZ2Ugc2l6ZSAqLwotI2RlZmluZSBOUlhECQkyNTYKKyNkZWZpbmUgTlJYRAkJCQkyNTYKIAogLyogdHJ5IHRvIGtlZXAgdGhpcyAjIHJidWZzIHBvc3RlZCB0byB0aGUgY2hpcCAqLwotI2RlZmluZQlOUlhCVUZQT1NUCTMyCisjZGVmaW5lIE5SWEJVRlBPU1QJCQkzMgogCiAvKiBkYXRhIG1zZyB0eHEgaGl3YXQgbWFyayAqLwotI2RlZmluZSBCUkNNU19EQVRBSElXQVQJCTUwCisjZGVmaW5lIEJSQ01TX0RBVEFISVdBVAkJCTUwCiAKLS8qIGJvdW5kZWQgcnggbG9vcHMgKi8KLSNkZWZpbmUgUlhCTkQJCTggLyogbWF4ICMgZnJhbWVzIHRvIHByb2Nlc3MgaW4gYnJjbXNfY19yZWN2KCkgKi8KLSNkZWZpbmUgVFhTQk5ECQk4IC8qIG1heCAjIHR4IHN0YXR1cyB0byBwcm9jZXNzIGluIHdsY190eHN0YXR1cygpICovCi0KLS8qCi0gKiAzMiBTU0lEIGNoYXJzLCBtYXggb2YgNCBjaGFycyBmb3IgZWFjaCBTU0lEIGNoYXIgIlx4RkYiLCBwbHVzIE5VTEwuCi0gKi8KLSNkZWZpbmUgU1NJRF9GTVRfQlVGX0xFTgkoKDQgKiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSArIDEpCisvKiBtYXggIyBmcmFtZXMgdG8gcHJvY2VzcyBpbiBicmNtc19jX3JlY3YoKSAqLworI2RlZmluZSBSWEJORAkJCQk4CisvKiBtYXggIyB0eCBzdGF0dXMgdG8gcHJvY2VzcyBpbiB3bGNfdHhzdGF0dXMoKSAqLworI2RlZmluZSBUWFNCTkQJCQkJOAogCiAvKiBicmNtdV9mb3JtYXRfZmxhZ3MoKSBiaXQgZGVzY3JpcHRpb24gc3RydWN0dXJlICovCiBzdHJ1Y3QgYnJjbXNfY19iaXRfZGVzYyB7CkBAIC0zNzUsMTAgKzMwMCwyMiBAQAogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCiAvKiBUWCBGSUZPIG51bWJlciB0byBXTUUvODAyLjFFIEFjY2VzcyBDYXRlZ29yeSAqLwotc3RhdGljIGNvbnN0IHU4IHdtZV9maWZvMmFjW10gPSB7IEFDX0JLLCBBQ19CRSwgQUNfVkksIEFDX1ZPLCBBQ19CRSwgQUNfQkUgfTsKK3N0YXRpYyBjb25zdCB1OCB3bWVfZmlmbzJhY1tdID0geworCUlFRUU4MDIxMV9BQ19CSywKKwlJRUVFODAyMTFfQUNfQkUsCisJSUVFRTgwMjExX0FDX1ZJLAorCUlFRUU4MDIxMV9BQ19WTywKKwlJRUVFODAyMTFfQUNfQkUsCisJSUVFRTgwMjExX0FDX0JFCit9OwogCi0vKiBXTUUvODAyLjFFIEFjY2VzcyBDYXRlZ29yeSB0byBUWCBGSUZPIG51bWJlciAqLwotc3RhdGljIGNvbnN0IHU4IHdtZV9hYzJmaWZvW10gPSB7IDEsIDAsIDIsIDMgfTsKKy8qIGllZWU4MDIxMSBBY2Nlc3MgQ2F0ZWdvcnkgdG8gVFggRklGTyBudW1iZXIgKi8KK3N0YXRpYyBjb25zdCB1OCB3bWVfYWMyZmlmb1tdID0geworCVRYX0FDX1ZPX0ZJRk8sCisJVFhfQUNfVklfRklGTywKKwlUWF9BQ19CRV9GSUZPLAorCVRYX0FDX0JLX0ZJRk8KK307CiAKIC8qIDgwMi4xRCBQcmlvcml0eSB0byBwcmVjZWRlbmNlIHF1ZXVlIG1hcHBpbmcgKi8KIGNvbnN0IHU4IHdsY19wcmlvMnByZWNfbWFwW10gPSB7CkBAIC00MDUsMTMgKzM0Miw2IEBACiAJezksIDU4LCAyMiwgMTQsIDE0LCA1fSwKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBhY2JpdG1hcDJtYXhwcmlvW10gPSB7Ci0JUFJJT184MDIxRF9CRSwgUFJJT184MDIxRF9CRSwgUFJJT184MDIxRF9CSywgUFJJT184MDIxRF9CSywKLQlQUklPXzgwMjFEX1ZJLCBQUklPXzgwMjFEX1ZJLCBQUklPXzgwMjFEX1ZJLCBQUklPXzgwMjFEX1ZJLAotCVBSSU9fODAyMURfVk8sIFBSSU9fODAyMURfVk8sIFBSSU9fODAyMURfVk8sIFBSSU9fODAyMURfVk8sCi0JUFJJT184MDIxRF9WTywgUFJJT184MDIxRF9WTywgUFJJT184MDIxRF9WTywgUFJJT184MDIxRF9WTwotfTsKLQogI2lmZGVmIEJDTURCRwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmaWZvX25hbWVzW10gPSB7CiAJIkFDX0JLIiwgIkFDX0JFIiwgIkFDX1ZJIiwgIkFDX1ZPIiwgIkJDTUMiLCAiQVRJTSIgfTsKQEAgLTQyNCw2ICszNTQsMjIgQEAKIHN0YXRpYyBzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGNfaW5mb19kYmcgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSAoTlVMTCk7CiAjZW5kaWYKIAorLyogRmluZCBiYXNpYyByYXRlIGZvciBhIGdpdmVuIHJhdGUgKi8KK3N0YXRpYyB1OCBicmNtc19iYXNpY19yYXRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTMyIHJzcGVjKQoreworCWlmIChpc19tY3NfcmF0ZShyc3BlYykpCisJCXJldHVybiB3bGMtPmJhbmQtPmJhc2ljX3JhdGVbbWNzX3RhYmxlW3JzcGVjICYgUlNQRUNfUkFURV9NQVNLXQorCQkgICAgICAgLmxlZ19vZmRtXTsKKwlyZXR1cm4gd2xjLT5iYW5kLT5iYXNpY19yYXRlW3JzcGVjICYgUlNQRUNfUkFURV9NQVNLXTsKK30KKworc3RhdGljIHUxNiBmcmFtZXR5cGUodTMyIHJzcGVjLCB1OCBtaW1vZnJhbWUpCit7CisJaWYgKGlzX21jc19yYXRlKHJzcGVjKSkKKwkJcmV0dXJuIG1pbW9mcmFtZTsKKwlyZXR1cm4gaXNfY2NrX3JhdGUocnNwZWMpID8gRlRfQ0NLIDogRlRfT0ZETTsKK30KKwogLyogY3VycmVudGx5IHRoZSBiZXN0IG1lY2hhbmlzbSBmb3IgZGV0ZXJtaW5pbmcgU0lGUyBpcyB0aGUgYmFuZCBpbiB1c2UgKi8KIHN0YXRpYyB1MTYgZ2V0X3NpZnMoc3RydWN0IGJyY21zX2JhbmQgKmJhbmQpCiB7CkBAIC00NzAsMjAgKzQxNiw2IEBACiAJcmV0dXJuIEJSQ01TXzEwX01IWjsKIH0KIAotLyoKLSAqIHJldHVybiB0cnVlIGlmIE1pbmltdW0gUG93ZXIgQ29uc3VtcHRpb24gc2hvdWxkCi0gKiBiZSBlbnRlcmVkLCBmYWxzZSBvdGhlcndpc2UKLSAqLwotc3RhdGljIGJvb2wgYnJjbXNfY19pc19ub25fZGVsYXlfbXBjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIGJyY21zX2NfaXNtcGMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXJldHVybiAod2xjLT5tcGNfZGVsYXlfb2ZmID09IDApICYmIChicmNtc19jX2lzX25vbl9kZWxheV9tcGMod2xjKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGJyY21zX2NfYnNzY2ZnX21mcmVlKHN0cnVjdCBicmNtc19ic3NfY2ZnICpjZmcpCiB7CiAJaWYgKGNmZyA9PSBOVUxMKQpAQCAtNjY5LDkgKzYwMSw4IEBACiAgKiBjYWxjdWxhdGUgZnJhbWUgZHVyYXRpb24gb2YgYSBnaXZlbiByYXRlIGFuZCBsZW5ndGgsIHJldHVybgogICogdGltZSBpbiB1c2VjIHVuaXQKICAqLwotdWludAotYnJjbXNfY19jYWxjX2ZyYW1lX3RpbWUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1MzIgcmF0ZXNwZWMsCi0JCQl1OCBwcmVhbWJsZV90eXBlLCB1aW50IG1hY19sZW4pCitzdGF0aWMgdWludCBicmNtc19jX2NhbGNfZnJhbWVfdGltZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHUzMiByYXRlc3BlYywKKwkJCQkgICAgdTggcHJlYW1ibGVfdHlwZSwgdWludCBtYWNfbGVuKQogewogCXVpbnQgbnN5bXMsIGR1ciA9IDAsIE5kcHMsIGtOZHBzOwogCXVpbnQgcmF0ZSA9IHJzcGVjMnJhdGUocmF0ZXNwZWMpOwpAQCAtOTY5LDcgKzkwMCw3IEBACiAJCSAgICBsZmJsLAkvKiBMb25nIEZyYW1lIFJhdGUgRmFsbGJhY2sgTGltaXQgKi8KIAkJICAgIGZibDsKIAotCQlpZiAocXVldWUgPCBBQ19DT1VOVCkgeworCQlpZiAocXVldWUgPCBJRUVFODAyMTFfTlVNX0FDUykgewogCQkJc2ZibCA9IEdGSUVMRCh3bGMtPndtZV9yZXRyaWVzW3dtZV9maWZvMmFjW3F1ZXVlXV0sCiAJCQkJICAgICAgRURDRl9TRkIpOwogCQkJbGZibCA9IEdGSUVMRCh3bGMtPndtZV9yZXRyaWVzW3dtZV9maWZvMmFjW3F1ZXVlXV0sCkBAIC0xMDE4LDE0ICs5NDksMTIgQEAKIAkJCXR4X2luZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKIAl9CiAKLQl0b3RsZW4gPSBicmNtdV9wa3R0b3RsZW4ocCk7CisJdG90bGVuID0gcC0+bGVuOwogCWZyZWVfcGR1ID0gdHJ1ZTsKIAogCWJyY21zX2NfdHhmaWZvX2NvbXBsZXRlKHdsYywgcXVldWUsIDEpOwogCiAJaWYgKGxhc3RmcmFtZSkgewotCQlwLT5uZXh0ID0gTlVMTDsKLQkJcC0+cHJldiA9IE5VTEw7CiAJCS8qIHJlbW92ZSBQTENQICYgQnJvYWRjb20gdHggZGVzY3JpcHRvciBoZWFkZXIgKi8KIAkJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKIAkJc2tiX3B1bGwocCwgRDExX1RYSF9MRU4pOwpAQCAtMjM1MiwxMyArMjI4MSw2IEBACiAJd2xjX3BoeV9hbnRzZWxfdHlwZV9zZXQod2xjX2h3LT5iYW5kLT5waSwgYW50c2VsX3R5cGUpOwogfQogCi1zdGF0aWMgdm9pZCBicmNtc19jX2ZhdGFsX2Vycm9yKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6IGZhdGFsIGVycm9yLCByZWluaXRpYWxpemluZ1xuIiwKLQkJICB3bGMtPnB1Yi0+dW5pdCk7Ci0JYnJjbXNfaW5pdCh3bGMtPndsKTsKLX0KLQogc3RhdGljIHZvaWQgYnJjbXNfYl9maWZvZXJyb3JzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQogewogCWJvb2wgZmF0YWwgPSBmYWxzZTsKQEAgLTI0MTQsNyArMjMzNiw3IEBACiAJCX0KIAogCQlpZiAoZmF0YWwpIHsKLQkJCWJyY21zX2NfZmF0YWxfZXJyb3Iod2xjX2h3LT53bGMpOwkvKiBiaWcgaGFtbWVyICovCisJCQlicmNtc19mYXRhbF9lcnJvcih3bGNfaHctPndsYy0+d2wpOyAvKiBiaWcgaGFtbWVyICovCiAJCQlicmVhazsKIAkJfSBlbHNlCiAJCQlXX1JFRygmcmVncy0+aW50Y3RybHJlZ3NbaWR4XS5pbnRzdGF0dXMsCkBAIC0yNDc5LDYgKzI0MDEsNyBAQAogCVdfUkVHKCZ3bGNfaHctPnJlZ3MtPm1hY2ludG1hc2ssIHdsYy0+bWFjaW50bWFzayk7CiB9CiAKKy8qIGFzc3VtZXMgdGhhdCB0aGUgZDExIE1BQyBpcyBlbmFibGVkICovCiBzdGF0aWMgdm9pZCBicmNtc19iX3R4X2ZpZm9fc3VzcGVuZChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKIAkJCQkgICAgdWludCB0eF9maWZvKQogewpAQCAtMjUzNSwxMSArMjQ1OCwxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYnJjbXNfYl9tdXRlKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBib29sIG9uLCB1MzIgZmxhZ3MpCisvKiBwcmVjb25kaXRpb246IHJlcXVpcmVzIHRoZSBtYWMgY29yZSB0byBiZSBlbmFibGVkICovCitzdGF0aWMgdm9pZCBicmNtc19iX211dGUoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGJvb2wgbXV0ZV90eCkKIHsKIAlzdGF0aWMgY29uc3QgdTggbnVsbF9ldGhlcl9hZGRyW0VUSF9BTEVOXSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKIAotCWlmIChvbikgeworCWlmIChtdXRlX3R4KSB7CiAJCS8qIHN1c3BlbmQgdHggZmlmb3MgKi8KIAkJYnJjbXNfYl90eF9maWZvX3N1c3BlbmQod2xjX2h3LCBUWF9EQVRBX0ZJRk8pOwogCQlicmNtc19iX3R4X2ZpZm9fc3VzcGVuZCh3bGNfaHcsIFRYX0NUTF9GSUZPKTsKQEAgLTI1NjEsMTQgKzI0ODUsMjAgQEAKIAkJCQkgICAgICAgd2xjX2h3LT5ldGhlcmFkZHIpOwogCX0KIAotCXdsY19waHlfbXV0ZV91cGQod2xjX2h3LT5iYW5kLT5waSwgb24sIGZsYWdzKTsKKwl3bGNfcGh5X211dGVfdXBkKHdsY19ody0+YmFuZC0+cGksIG11dGVfdHgsIDApOwogCi0JaWYgKG9uKQorCWlmIChtdXRlX3R4KQogCQlicmNtc19jX3Vjb2RlX211dGVfb3ZlcnJpZGVfc2V0KHdsY19odyk7CiAJZWxzZQogCQlicmNtc19jX3Vjb2RlX211dGVfb3ZlcnJpZGVfY2xlYXIod2xjX2h3KTsKIH0KIAordm9pZAorYnJjbXNfY19tdXRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBtdXRlX3R4KQoreworCWJyY21zX2JfbXV0ZSh3bGMtPmh3LCBtdXRlX3R4KTsKK30KKwogLyoKICAqIFJlYWQgYW5kIGNsZWFyIG1hY2ludG1hc2sgYW5kIG1hY2ludHN0YXR1cyBhbmQgaW50c3RhdHVzIHJlZ2lzdGVycy4KICAqIFRoaXMgcm91dGluZSBzaG91bGQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYKQEAgLTMxMzIsNyArMzA2Miw3IEBACiAJCXJldHVybiBmYWxzZTsKIAogCS8qIGRpc2FsbG93IFBTIHdoZW4gb25lIG9mIHRoZXNlIG1lZXRzIHdoZW4gbm90IHNjYW5uaW5nICovCi0JaWYgKHdsYy0+bW9uaXRvcikKKwlpZiAod2xjLT5maWx0ZXJfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpCiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChjZmctPmFzc29jaWF0ZWQpIHsKQEAgLTM0MzcsOCArMzM2Nyw3IEBACiB9CiAKIHZvaWQKLXN0YXRpYyBicmNtc19iX2luaXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUxNiBjaGFuc3BlYywKLQkJCSAgYm9vbCBtdXRlKSB7CitzdGF0aWMgYnJjbXNfYl9pbml0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1MTYgY2hhbnNwZWMpIHsKIAl1MzIgbWFjaW50bWFzazsKIAlib29sIGZhc3RjbGs7CiAJc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7CkBAIC0zNDYzLDEwICszMzkyLDYgQEAKIAkvKiBjb3JlLXNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCiAJYnJjbXNfYl9jb3JlaW5pdCh3bGMpOwogCi0JLyogc3VzcGVuZCB0aGUgdHggZmlmb3MgYW5kIG11dGUgdGhlIHBoeSBmb3IgcHJlaXNtIGNhYyB0aW1lICovCi0JaWYgKG11dGUpCi0JCWJyY21zX2JfbXV0ZSh3bGNfaHcsIE9OLCBQSFlfTVVURV9GT1JfUFJFSVNNKTsKLQogCS8qIGJhbmQtc3BlY2lmaWMgaW5pdHMgKi8KIAlicmNtc19iX2JzaW5pdCh3bGMsIGNoYW5zcGVjKTsKIApAQCAtMzY1Niw0MiArMzU4MSwzMiBAQAogCWJyY21zX2Nfc2V0X3BoeV9jaGFuc3BlYyh3bGMsIGNoYW5zcGVjKTsKIH0KIAotc3RhdGljIHZvaWQgYnJjbXNfY19tYWNfYmNuX3Byb21pc2Moc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWlmICh3bGMtPmJjbm1pc2NfbW9uaXRvcikKLQkJYnJjbXNfYl9tY3RybCh3bGMtPmh3LCBNQ1RMX0JDTlNfUFJPTUlTQywgTUNUTF9CQ05TX1BST01JU0MpOwotCWVsc2UKLQkJYnJjbXNfYl9tY3RybCh3bGMtPmh3LCBNQ1RMX0JDTlNfUFJPTUlTQywgMCk7Ci19Ci0KLXZvaWQgYnJjbXNfY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBwcm9taXNjKQotewotCXdsYy0+YmNubWlzY19tb25pdG9yID0gcHJvbWlzYzsKLQlicmNtc19jX21hY19iY25fcHJvbWlzYyh3bGMpOwotfQotCi0vKiBzZXQgb3IgY2xlYXIgbWFjY29udHJvbCBiaXRzIE1DVExfUFJPTUlTQyBhbmQgTUNUTF9LRUVQQ09OVFJPTCAqLwotc3RhdGljIHZvaWQgYnJjbXNfY19tYWNfcHJvbWlzYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCisvKgorICogU2V0IG9yIGNsZWFyIGZpbHRlcmluZyByZWxhdGVkIG1hY2NvbnRyb2wgYml0cyBiYXNlZCBvbgorICogc3BlY2lmaWVkIGZpbHRlciBmbGFncworICovCit2b2lkIGJyY21zX2NfbWFjX3Byb21pc2Moc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1aW50IGZpbHRlcl9mbGFncykKIHsKIAl1MzIgcHJvbWlzY19iaXRzID0gMDsKIAotCS8qCi0JICogcHJvbWlzY3VvdXMgbW9kZSBqdXN0IHNldHMgTUNUTF9QUk9NSVNDCi0JICogTm90ZTogQVBzIGdldCBhbGwgQlNTIHRyYWZmaWMgd2l0aG91dCB0aGUgbmVlZCB0byBzZXQKLQkgKiB0aGUgTUNUTF9QUk9NSVNDIGJpdCBzaW5jZSBhbGwgQlNTIGRhdGEgdHJhZmZpYyBpcwotCSAqIGRpcmVjdGVkIGF0IHRoZSBBUAotCSAqLwotCWlmICh3bGMtPnB1Yi0+cHJvbWlzYykKKwl3bGMtPmZpbHRlcl9mbGFncyA9IGZpbHRlcl9mbGFnczsKKworCWlmIChmaWx0ZXJfZmxhZ3MgJiAoRklGX1BST01JU0NfSU5fQlNTIHwgRklGX09USEVSX0JTUykpCiAJCXByb21pc2NfYml0cyB8PSBNQ1RMX1BST01JU0M7CiAKLQkvKiBtb25pdG9yIG1vZGUgbmVlZHMgYm90aCBNQ1RMX1BST01JU0MgYW5kIE1DVExfS0VFUENPTlRST0wKLQkgKiBOb3RlOiBtb25pdG9yIG1vZGUgYWxzbyBuZWVkcyBNQ1RMX0JDTlNfUFJPTUlTQywgYnV0IHRoYXQgaXMKLQkgKiBoYW5kbGVkIGluIGJyY21zX2NfbWFjX2Jjbl9wcm9taXNjKCkKLQkgKi8KLQlpZiAod2xjLT5tb25pdG9yKQotCQlwcm9taXNjX2JpdHMgfD0gTUNUTF9QUk9NSVNDIHwgTUNUTF9LRUVQQ09OVFJPTDsKKwlpZiAoZmlsdGVyX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpCisJCXByb21pc2NfYml0cyB8PSBNQ1RMX0JDTlNfUFJPTUlTQzsKIAotCWJyY21zX2JfbWN0cmwod2xjLT5odywgTUNUTF9QUk9NSVNDIHwgTUNUTF9LRUVQQ09OVFJPTCwgcHJvbWlzY19iaXRzKTsKKwlpZiAoZmlsdGVyX2ZsYWdzICYgRklGX0ZDU0ZBSUwpCisJCXByb21pc2NfYml0cyB8PSBNQ1RMX0tFRVBCQURGQ1M7CisKKwlpZiAoZmlsdGVyX2ZsYWdzICYgKEZJRl9DT05UUk9MIHwgRklGX1BTUE9MTCkpCisJCXByb21pc2NfYml0cyB8PSBNQ1RMX0tFRVBDT05UUk9MOworCisJYnJjbXNfYl9tY3RybCh3bGMtPmh3LAorCQlNQ1RMX1BST01JU0MgfCBNQ1RMX0JDTlNfUFJPTUlTQyB8CisJCU1DVExfS0VFUENPTlRST0wgfCBNQ1RMX0tFRVBCQURGQ1MsCisJCXByb21pc2NfYml0cyk7CiB9CiAKIC8qCkBAIC0zNzIxLDEwICszNjM2LDYgQEAKIAl9IGVsc2UgewogCQkvKiBkaXNhYmxlIGFuIGFjdGl2ZSBJQlNTIGlmIHdlIGFyZSBub3Qgb24gdGhlIGhvbWUgY2hhbm5lbCAqLwogCX0KLQotCS8qIHVwZGF0ZSB0aGUgdmFyaW91cyBwcm9taXNjIGJpdHMgKi8KLQlicmNtc19jX21hY19iY25fcHJvbWlzYyh3bGMpOwotCWJyY21zX2NfbWFjX3Byb21pc2Mod2xjKTsKIH0KIAogc3RhdGljIHZvaWQgYnJjbXNfY193cml0ZV9yYXRlX3NobShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHU4IHJhdGUsCkBAIC0zOTc5LDcgKzM4OTAsNyBAQAogCiB2b2lkCiBicmNtc19iX3NldF9jaGFuc3BlYyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IGNoYW5zcGVjLAotCQkgICAgICBib29sIG11dGUsIHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQorCQkgICAgICBib29sIG11dGVfdHgsIHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQogewogCXVpbnQgYmFuZHVuaXQ7CiAKQEAgLTQwMDUsNyArMzkxNiw3IEBACiAJCX0KIAl9CiAKLQl3bGNfcGh5X2luaXRjYWxfZW5hYmxlKHdsY19ody0+YmFuZC0+cGksICFtdXRlKTsKKwl3bGNfcGh5X2luaXRjYWxfZW5hYmxlKHdsY19ody0+YmFuZC0+cGksICFtdXRlX3R4KTsKIAogCWlmICghd2xjX2h3LT51cCkgewogCQlpZiAod2xjX2h3LT5jbGspCkBAIC00MDE3LDcgKzM5MjgsNyBAQAogCQl3bGNfcGh5X3R4cG93ZXJfbGltaXRfc2V0KHdsY19ody0+YmFuZC0+cGksIHR4cHdyLCBjaGFuc3BlYyk7CiAKIAkJLyogVXBkYXRlIG11dGluZyBvZiB0aGUgY2hhbm5lbCAqLwotCQlicmNtc19iX211dGUod2xjX2h3LCBtdXRlLCAwKTsKKwkJYnJjbXNfYl9tdXRlKHdsY19odywgbXV0ZV90eCk7CiAJfQogfQogCkBAIC00MjA1LDcgKzQxMTYsNyBAQAogCSAgICBFRENGX1RYT1AyVVNFQyhhY3Bfc2htLnR4b3ApOwogCWFjcF9zaG0uYWlmcyA9IChwYXJhbXMtPmFpZnMgJiBFRENGX0FJRlNOX01BU0spOwogCi0JaWYgKGFjaSA9PSBBQ19WSSAmJiBhY3Bfc2htLnR4b3AgPT0gMAorCWlmIChhY2kgPT0gSUVFRTgwMjExX0FDX1ZJICYmIGFjcF9zaG0udHhvcCA9PSAwCiAJICAgICYmIGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUFYKQogCQlhY3Bfc2htLmFpZnMrKzsKIApAQCAtNDI0Miw3ICs0MTUzLDcgQEAKIAl9CiB9CiAKLXZvaWQgYnJjbXNfY19lZGNmX3NldHBhcmFtcyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgc3VzcGVuZCkKK3N0YXRpYyB2b2lkIGJyY21zX2NfZWRjZl9zZXRwYXJhbXMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHN1c3BlbmQpCiB7CiAJdTE2IGFjaTsKIAlpbnQgaV9hYzsKQEAgLTQyNTUsNyArNDE2Niw3IEBACiAJfTsgLyogdWNvZGUgbmVlZHMgdGhlc2UgcGFyYW1ldGVycyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uICovCiAJY29uc3Qgc3RydWN0IGVkY2ZfYWNwYXJhbSAqZWRjZl9hY3AgPSAmZGVmYXVsdF9lZGNmX2FjcGFyYW1zWzBdOwogCi0JZm9yIChpX2FjID0gMDsgaV9hYyA8IEFDX0NPVU5UOyBpX2FjKyssIGVkY2ZfYWNwKyspIHsKKwlmb3IgKGlfYWMgPSAwOyBpX2FjIDwgSUVFRTgwMjExX05VTV9BQ1M7IGlfYWMrKywgZWRjZl9hY3ArKykgewogCQkvKiBmaW5kIG91dCB3aGljaCBhYyB0aGlzIHNldCBvZiBwYXJhbXMgYXBwbGllcyB0byAqLwogCQlhY2kgPSAoZWRjZl9hY3AtPkFDSSAmIEVEQ0ZfQUNJX01BU0spID4+IEVEQ0ZfQUNJX1NISUZUOwogCkBAIC00Mjc3LDE3ICs0MTg4LDYgQEAKIAl9CiB9CiAKLS8qIG1haW50YWluIExFRCBiZWhhdmlvciBpbiBkb3duIHN0YXRlICovCi1zdGF0aWMgdm9pZCBicmNtc19jX2Rvd25fbGVkX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JLyoKLQkgKiBtYWludGFpbiBMRURzIHdoaWxlIGluIGRvd24gc3RhdGUsIHR1cm4gb24gc2JjbGsgaWYKLQkgKiBub3QgYXZhaWxhYmxlIHlldC4gVHVybiBvbiBzYmNsayBpZiBuZWNlc3NhcnkKLQkgKi8KLQlicmNtc19iX3BsbHJlcSh3bGMtPmh3LCB0cnVlLCBCUkNNU19QTExSRVFfRkxJUCk7Ci0JYnJjbXNfYl9wbGxyZXEod2xjLT5odywgZmFsc2UsIEJSQ01TX1BMTFJFUV9GTElQKTsKLX0KLQogc3RhdGljIHZvaWQgYnJjbXNfY19yYWRpb19tb25pdG9yX3N0YXJ0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKIHsKIAkvKiBEb24ndCBzdGFydCB0aGUgdGltZXIgaWYgSFdSQURJTyBmZWF0dXJlIGlzIGRpc2FibGVkICovCkBAIC00Mjk5LDI4ICs0MTk5LDYgQEAKIAlicmNtc19hZGRfdGltZXIod2xjLT5yYWRpb190aW1lciwgVElNRVJfSU5URVJWQUxfUkFESU9DSEssIHRydWUpOwogfQogCi1zdGF0aWMgdm9pZCBicmNtc19jX3JhZGlvX2Rpc2FibGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWlmICghd2xjLT5wdWItPnVwKSB7Ci0JCWJyY21zX2NfZG93bl9sZWRfdXBkKHdsYyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlicmNtc19jX3JhZGlvX21vbml0b3Jfc3RhcnQod2xjKTsKLQlicmNtc19kb3duKHdsYy0+d2wpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3JhZGlvX2VuYWJsZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JaWYgKHdsYy0+cHViLT51cCkKLQkJcmV0dXJuOwotCi0JaWYgKGJyY21zX2RldmljZXJlbW92ZWQod2xjKSkKLQkJcmV0dXJuOwotCi0JYnJjbXNfdXAod2xjLT53bCk7Ci19Ci0KIHN0YXRpYyBib29sIGJyY21zX2NfcmFkaW9fbW9uaXRvcl9zdG9wKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKIHsKIAlpZiAoIXdsYy0+cmFkaW9fbW9uaXRvcikKQEAgLTQzNDMsMTggKzQyMjEsNiBAQAogCQltYm9vbGNscih3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQsIFdMX1JBRElPX0hXX0RJU0FCTEUpOwogfQogCi0vKgotICogY2VudHJhbGl6ZWQgcmFkaW8gZGlzYWJsZS9lbmFibGUgZnVuY3Rpb24sCi0gKiBpbnZva2UgcmFkaW8gZW5hYmxlL2Rpc2FibGUgYWZ0ZXIgdXBkYXRpbmcgaHdyYWRpbyBzdGF0dXMKLSAqLwotc3RhdGljIHZvaWQgYnJjbXNfY19yYWRpb191cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWlmICh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQpCi0JCWJyY21zX2NfcmFkaW9fZGlzYWJsZSh3bGMpOwotCWVsc2UKLQkJYnJjbXNfY19yYWRpb19lbmFibGUod2xjKTsKLX0KLQogLyogdXBkYXRlIGh3cmFkaW8gc3RhdHVzIGFuZCByZXR1cm4gaXQgKi8KIGJvb2wgYnJjbXNfY19jaGVja19yYWRpb19kaXNhYmxlZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCiB7CkBAIC00Mzc2LDEyICs0MjQyLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIGNhcCBtcGMgb2ZmIGNvdW50ICovCi0JaWYgKHdsYy0+bXBjX29mZmNudCA8IEJSQ01TX01QQ19NQVhfREVMQVlDTlQpCi0JCXdsYy0+bXBjX29mZmNudCsrOwotCiAJYnJjbXNfY19yYWRpb19od2Rpc2FibGVfdXBkKHdsYyk7Ci0JYnJjbXNfY19yYWRpb191cGQod2xjKTsKIH0KIAogLyogY29tbW9uIGxvdy1sZXZlbCB3YXRjaGRvZyBjb2RlICovCkBAIC00NDA3LDYwICs0MjY4LDYgQEAKIAl3bGNfcGh5X3dhdGNoZG9nKHdsY19ody0+YmFuZC0+cGkpOwogfQogCi1zdGF0aWMgdm9pZCBicmNtc19jX3JhZGlvX21wY191cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWJvb2wgbXBjX3JhZGlvLCByYWRpb19zdGF0ZTsKLQotCS8qCi0JICogQ2xlYXIgdGhlIFdMX1JBRElPX01QQ19ESVNBQkxFIGJpdCB3aGVuIG1wYyBmZWF0dXJlIGlzIGRpc2FibGVkCi0JICogaW4gY2FzZSB0aGUgV0xfUkFESU9fTVBDX0RJU0FCTEUgYml0IHdhcyBzZXQuIFN0b3AgdGhlIHJhZGlvCi0JICogbW9uaXRvciBhbHNvIHdoZW4gV0xfUkFESU9fTVBDX0RJU0FCTEUgaXMgdGhlIG9ubHkgcmVhc29uIHRoYXQKLQkgKiB0aGUgcmFkaW8gaXMgZ29pbmcgZG93bi4KLQkgKi8KLQlpZiAoIXdsYy0+bXBjKSB7Ci0JCWlmICghd2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQotCQkJcmV0dXJuOwotCQltYm9vbGNscih3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQsIFdMX1JBRElPX01QQ19ESVNBQkxFKTsKLQkJYnJjbXNfY19yYWRpb191cGQod2xjKTsKLQkJaWYgKCF3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQpCi0JCQlicmNtc19jX3JhZGlvX21vbml0b3Jfc3RvcCh3bGMpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBzeW5jIGlzbXBjIGxvZ2ljIHdpdGggV0xfUkFESU9fTVBDX0RJU0FCTEUgYml0IGluCi0JICogd2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkIHRvIGdvIE9OLCBhbHdheXMgY2FsbCByYWRpb191cGQKLQkgKiBzeW5jaHJvbm91c2x5IHRvIGdvIE9GRiwgcG9zdHBvbmUgcmFkaW9fdXBkIHRvIGxhdGVyIHdoZW4KLQkgKiBjb250ZXh0IGlzIHNhZmUoZS5nLiB3YXRjaGRvZykKLQkgKi8KLQlyYWRpb19zdGF0ZSA9Ci0JICAgIChtYm9vbGlzc2V0KHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fTVBDX0RJU0FCTEUpID8gT0ZGIDoKLQkgICAgIE9OKTsKLQltcGNfcmFkaW8gPSAoYnJjbXNfY19pc21wYyh3bGMpID09IHRydWUpID8gT0ZGIDogT047Ci0KLQlpZiAocmFkaW9fc3RhdGUgPT0gT04gJiYgbXBjX3JhZGlvID09IE9GRikKLQkJd2xjLT5tcGNfZGVsYXlfb2ZmID0gd2xjLT5tcGNfZGx5Y250OwotCWVsc2UgaWYgKHJhZGlvX3N0YXRlID09IE9GRiAmJiBtcGNfcmFkaW8gPT0gT04pIHsKLQkJbWJvb2xjbHIod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkLCBXTF9SQURJT19NUENfRElTQUJMRSk7Ci0JCWJyY21zX2NfcmFkaW9fdXBkKHdsYyk7Ci0JCWlmICh3bGMtPm1wY19vZmZjbnQgPCBCUkNNU19NUENfVEhSRVNIT0xEKQotCQkJd2xjLT5tcGNfZGx5Y250ID0gQlJDTVNfTVBDX01BWF9ERUxBWUNOVDsKLQkJZWxzZQotCQkJd2xjLT5tcGNfZGx5Y250ID0gQlJDTVNfTVBDX01JTl9ERUxBWUNOVDsKLQl9Ci0JLyoKLQkgKiBCZWxvdyBsb2dpYyBpcyBtZWFudCB0byBjYXB0dXJlIHRoZSB0cmFuc2l0aW9uIGZyb20gbXBjIG9mZgotCSAqIHRvIG1wYyBvbiBmb3IgcmVhc29ucyBvdGhlciB0aGFuIHdsYy0+bXBjX2RlbGF5X29mZiBrZWVwaW5nCi0JICogdGhlIG1wYyBvZmYuIEluIHRoYXQgY2FzZSByZXNldCB3bGMtPm1wY19kZWxheV9vZmYgdG8KLQkgKiB3bGMtPm1wY19kbHljbnQsIHNvIHRoYXQgd2UgcmVzdGFydCB0aGUgY291bnRkb3duIG9mIG1wY19kZWxheV9vZmYKLQkgKi8KLQlpZiAoKHdsYy0+cHJldl9ub25fZGVsYXlfbXBjID09IGZhbHNlKSAmJgotCSAgICAoYnJjbXNfY19pc19ub25fZGVsYXlfbXBjKHdsYykgPT0gdHJ1ZSkgJiYgd2xjLT5tcGNfZGVsYXlfb2ZmKQotCQl3bGMtPm1wY19kZWxheV9vZmYgPSB3bGMtPm1wY19kbHljbnQ7Ci0KLQl3bGMtPnByZXZfbm9uX2RlbGF5X21wYyA9IGJyY21zX2NfaXNfbm9uX2RlbGF5X21wYyh3bGMpOwotfQotCiAvKiBjb21tb24gd2F0Y2hkb2cgY29kZSAqLwogc3RhdGljIHZvaWQgYnJjbXNfY193YXRjaGRvZyh2b2lkICphcmcpCiB7CkBAIC00NDgxLDIxICs0Mjg4LDcgQEAKIAkvKiBpbmNyZW1lbnQgc2Vjb25kIGNvdW50ICovCiAJd2xjLT5wdWItPm5vdysrOwogCi0JLyogZGVsYXkgcmFkaW8gZGlzYWJsZSAqLwotCWlmICh3bGMtPm1wY19kZWxheV9vZmYpIHsKLQkJaWYgKC0td2xjLT5tcGNfZGVsYXlfb2ZmID09IDApIHsKLQkJCW1ib29sc2V0KHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwKLQkJCQkgV0xfUkFESU9fTVBDX0RJU0FCTEUpOwotCQkJaWYgKHdsYy0+bXBjICYmIGJyY21zX2NfaXNtcGMod2xjKSkKLQkJCQl3bGMtPm1wY19vZmZjbnQgPSAwOwotCQl9Ci0JfQotCi0JLyogbXBjIHN5bmMgKi8KLQlicmNtc19jX3JhZGlvX21wY191cGQod2xjKTsKLQkvKiByYWRpbyBzeW5jOiBzdy9ody9tcGMgLS0+IHJhZGlvX2Rpc2FibGUvcmFkaW9fZW5hYmxlICovCiAJYnJjbXNfY19yYWRpb19od2Rpc2FibGVfdXBkKHdsYyk7Ci0JYnJjbXNfY19yYWRpb191cGQod2xjKTsKIAkvKiBpZiByYWRpbyBpcyBkaXNhYmxlLCBkcml2ZXIgbWF5IGJlIGRvd24sIHF1aXQgaGVyZSAqLwogCWlmICh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQpCiAJCXJldHVybjsKQEAgLTQ1OTksOSArNDM5Miw2IEBACiAJLyogV01FIFFvUyBtb2RlIGlzIEF1dG8gYnkgZGVmYXVsdCAqLwogCXdsYy0+cHViLT5fYW1wZHUgPSBBTVBEVV9BR0dfSE9TVDsKIAl3bGMtPnB1Yi0+YmNtZXJyb3IgPSAwOwotCi0JLyogaW5pdGlhbGl6ZSBtcGMgZGVsYXkgKi8KLQl3bGMtPm1wY19kZWxheV9vZmYgPSB3bGMtPm1wY19kbHljbnQgPSBCUkNNU19NUENfTUlOX0RFTEFZQ05UOwogfQogCiBzdGF0aWMgdWludCBicmNtc19jX2F0dGFjaF9tb2R1bGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQpAQCAtNTI1OSw5ICs1MDQ5LDYgQEAKIHsKIAkvKiBTVEEtQlNTOyBzaG9ydCBjYXBhYmxlICovCiAJd2xjLT5QTENQSGRyX292ZXJyaWRlID0gQlJDTVNfUExDUF9TSE9SVDsKLQotCS8qIGZpeHVwIG1wYyAqLwotCXdsYy0+bXBjID0gdHJ1ZTsKIH0KIAogLyogSW5pdGlhbGl6ZSBqdXN0IHRoZSBoYXJkd2FyZSB3aGVuIGNvbWluZyBvdXQgb2YgUE9SIG9yIFMzL1M1IHN5c3RlbSBzdGF0ZXMgKi8KQEAgLTUzNzYsNyArNTE2Myw3IEBACiAJaWYgKCF3bGMtPmNsaykKIAkJcmV0dXJuOwogCi0JZm9yIChhYyA9IDA7IGFjIDwgQUNfQ09VTlQ7IGFjKyspCisJZm9yIChhYyA9IDA7IGFjIDwgSUVFRTgwMjExX05VTV9BQ1M7IGFjKyspCiAJCWJyY21zX2Jfd3JpdGVfc2htKHdsYy0+aHcsIE1fQUNfVFhMTVRfQUREUihhYyksCiAJCQkJICB3bGMtPndtZV9yZXRyaWVzW2FjXSk7CiB9CkBAIC01NTc1LDcgKzUzNjIsNiBAQAogCWlmICghd2xjLT5wdWItPnVwKQogCQlyZXR1cm4gY2FsbGJhY2tzOwogCi0JLyogaW4gYmV0d2VlbiwgbXBjIGNvdWxkIHRyeSB0byBicmluZyBkb3duIGFnYWluLi4gKi8KIAl3bGMtPmdvaW5nX2Rvd24gPSB0cnVlOwogCiAJY2FsbGJhY2tzICs9IGJyY21zX2JfYm1hY19kb3duX3ByZXAod2xjLT5odyk7CkBAIC01ODUyLDcgKzU2MzgsNyBAQAogCiAJYnJjbXNfYl9yZXRyeWxpbWl0X3VwZCh3bGMtPmh3LCB3bGMtPlNSTCwgd2xjLT5MUkwpOwogCi0JZm9yIChhYyA9IDA7IGFjIDwgQUNfQ09VTlQ7IGFjKyspIHsKKwlmb3IgKGFjID0gMDsgYWMgPCBJRUVFODAyMTFfTlVNX0FDUzsgYWMrKykgewogCQl3bGMtPndtZV9yZXRyaWVzW2FjXSA9CVNGSUVMRCh3bGMtPndtZV9yZXRyaWVzW2FjXSwKIAkJCQkJICAgICAgIEVEQ0ZfU0hPUlQsICB3bGMtPlNSTCk7CiAJCXdsYy0+d21lX3JldHJpZXNbYWNdID0JU0ZJRUxEKHdsYy0+d21lX3JldHJpZXNbYWNdLApAQCAtNjEwMyw3ICs1ODg5LDYgQEAKIAogCXU4ICpydHNwaCA9IHR4aC0+UlRTUGh5SGVhZGVyOwogCXN0cnVjdCBpZWVlODAyMTFfcnRzIHJ0cyA9IHR4aC0+cnRzX2ZyYW1lOwotCWNoYXIgaGV4YnVmWzI1Nl07CiAKIAkvKiBhZGQgcGxjcCBoZWFkZXIgYWxvbmcgd2l0aCB0eGggZGVzY3JpcHRvciAqLwogCXByaW50ayhLRVJOX0RFQlVHICJSYXcgVHhEZXNjICsgcGxjcCBoZWFkZXI6XG4iKTsKQEAgLTYxMjQsMTcgKzU5MDksMTYgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiWHRyYUZyYW1lVHlwZXM6ICUwNHggIiwgeHRyYWZ0KTsKIAlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKIAotCWJyY211X2Zvcm1hdF9oZXgoaGV4YnVmLCBpdiwgc2l6ZW9mKHR4aC0+SVYpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiU2VjSVY6ICAgICAgICVzXG4iLCBoZXhidWYpOwotCWJyY211X2Zvcm1hdF9oZXgoaGV4YnVmLCByYSwgc2l6ZW9mKHR4aC0+VHhGcmFtZVJBKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlJBOiAgICAgICAgICAlc1xuIiwgaGV4YnVmKTsKKwlwcmludF9oZXhfZHVtcF9ieXRlcygiU2VjSVY6IiwgRFVNUF9QUkVGSVhfT0ZGU0VULCBpdiwgc2l6ZW9mKHR4aC0+SVYpKTsKKwlwcmludF9oZXhfZHVtcF9ieXRlcygiUkE6IiwgRFVNUF9QUkVGSVhfT0ZGU0VULAorCQkJICAgICByYSwgc2l6ZW9mKHR4aC0+VHhGcmFtZVJBKSk7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiRmIgRkVTIFRpbWU6ICUwNHggIiwgdGZlc3RmYik7Ci0JYnJjbXVfZm9ybWF0X2hleChoZXhidWYsIHJ0c3BmYiwgc2l6ZW9mKHR4aC0+UlRTUExDUEZhbGxiYWNrKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlJUUyBQTENQOiAlcyAiLCBoZXhidWYpOworCXByaW50X2hleF9kdW1wX2J5dGVzKCJGYiBSVFMgUExDUDoiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkgICAgIHJ0c3BmYiwgc2l6ZW9mKHR4aC0+UlRTUExDUEZhbGxiYWNrKSk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIlJUUyBEVVI6ICUwNHggIiwgcnRzZGZiKTsKLQlicmNtdV9mb3JtYXRfaGV4KGhleGJ1ZiwgZnJhZ3BmYiwgc2l6ZW9mKHR4aC0+RnJhZ1BMQ1BGYWxsYmFjaykpOwotCXByaW50ayhLRVJOX0RFQlVHICJQTENQOiAlcyAiLCBoZXhidWYpOworCXByaW50X2hleF9kdW1wX2J5dGVzKCJQTENQOiIsIERVTVBfUFJFRklYX09GRlNFVCwKKwkJCSAgICAgZnJhZ3BmYiwgc2l6ZW9mKHR4aC0+RnJhZ1BMQ1BGYWxsYmFjaykpOwogCXByaW50ayhLRVJOX0RFQlVHICJEVVI6ICUwNHgiLCBmcmFnZGZiKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKIApAQCAtNjE0OSwxOCArNTkzMywxOCBAQAogCXByaW50ayhLRVJOX0RFQlVHICJNYXhBZ2dieXRlX2ZiOiAgJTA0eFxuIiwgbWFieXRlX2YpOwogCXByaW50ayhLRVJOX0RFQlVHICJNaW5CeXRlOiAgICAgJTA0eFxuIiwgbW1ieXRlKTsKIAotCWJyY211X2Zvcm1hdF9oZXgoaGV4YnVmLCBydHNwaCwgc2l6ZW9mKHR4aC0+UlRTUGh5SGVhZGVyKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlJUUyBQTENQOiAlcyAiLCBoZXhidWYpOwotCWJyY211X2Zvcm1hdF9oZXgoaGV4YnVmLCAodTggKikgJnJ0cywgc2l6ZW9mKHR4aC0+cnRzX2ZyYW1lKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlJUUyBGcmFtZTogJXMiLCBoZXhidWYpOworCXByaW50X2hleF9kdW1wX2J5dGVzKCJSVFMgUExDUDoiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkgICAgIHJ0c3BoLCBzaXplb2YodHhoLT5SVFNQaHlIZWFkZXIpKTsKKwlwcmludF9oZXhfZHVtcF9ieXRlcygiUlRTIEZyYW1lOiIsIERVTVBfUFJFRklYX09GRlNFVCwKKwkJCSAgICAgKHU4ICopJnJ0cywgc2l6ZW9mKHR4aC0+cnRzX2ZyYW1lKSk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CiB9CiAjZW5kaWYJCQkJLyogZGVmaW5lZChCQ01EQkcpICovCiAKICNpZiBkZWZpbmVkKEJDTURCRykKLWludAorc3RhdGljIGludAogYnJjbXNfY19mb3JtYXRfZmxhZ3MoY29uc3Qgc3RydWN0IGJyY21zX2NfYml0X2Rlc2MgKmJkLCB1MzIgZmxhZ3MsIGNoYXIgKmJ1ZiwKLQkJICAgaW50IGxlbikKKwkJICAgICBpbnQgbGVuKQogewogCWludCBpOwogCWNoYXIgKnAgPSBidWY7CkBAIC02OTE2LDcgKzY3MDAsNyBAQAogCXFvcyA9IGllZWU4MDIxMV9pc19kYXRhX3FvcyhoLT5mcmFtZV9jb250cm9sKTsKIAogCS8qIGNvbXB1dGUgbGVuZ3RoIG9mIGZyYW1lIGluIGJ5dGVzIGZvciB1c2UgaW4gUExDUCBjb21wdXRhdGlvbnMgKi8KLQlsZW4gPSBicmNtdV9wa3R0b3RsZW4ocCk7CisJbGVuID0gcC0+bGVuOwogCXBoeWxlbiA9IGxlbiArIEZDU19MRU47CiAKIAkvKiBHZXQgdHhfaW5mbyAqLwpAQCAtODI1MywxMiArODAzNyw2IEBACiAJcmV0dXJuIChpbnQpKHFkYm0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IpOwogfQogCi12b2lkIGJyY21zX2Nfc2V0X3JhZGlvX21wYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgbXBjKQotewotCXdsYy0+bXBjID0gbXBjOwotCWJyY21zX2NfcmFkaW9fbXBjX3VwZCh3bGMpOwotfQotCiAvKiBQcm9jZXNzIHJlY2VpdmVkIGZyYW1lcyAqLwogLyoKICAqIFJldHVybiB0cnVlIGlmIG1vcmUgZnJhbWVzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkLiBmYWxzZSBvdGhlcndpc2UuCkBAIC04MjkzLDE0ICs4MDcxLDggQEAKIAlsZW4gPSBwLT5sZW47CiAKIAlpZiAocnhoLT5SeFN0YXR1czEgJiBSWFNfRkNTRVJSKSB7Ci0JCWlmICh3bGMtPnB1Yi0+bWFjODAyMTFfc3RhdGUgJiBNQUM4MDIxMV9QUk9NSVNDX0JDTlMpIHsKLQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAiRkNTRVJSIHdoaWxlIHNjYW5uaW5nKioqKioqKiAtIgotCQkJCSAgIiB0b3NzaW5nXG4iKTsKKwkJaWYgKCEod2xjLT5maWx0ZXJfZmxhZ3MgJiBGSUZfRkNTRkFJTCkpCiAJCQlnb3RvIHRvc3M7Ci0JCX0gZWxzZSB7Ci0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIlJDU0VSUiEhIVxuIik7Ci0JCQlnb3RvIHRvc3M7Ci0JCX0KIAl9CiAKIAkvKiBjaGVjayByZWNlaXZlZCBwa3QgaGFzIGF0IGxlYXN0IGZyYW1lIGNvbnRyb2wgZmllbGQgKi8KQEAgLTgzMjgsMjEgKzgxMDAsMTcgQEAKIGJyY21zX2JfcmVjdihzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBmaWZvLCBib29sIGJvdW5kKQogewogCXN0cnVjdCBza19idWZmICpwOwotCXN0cnVjdCBza19idWZmICpoZWFkID0gTlVMTDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBOVUxMOworCXN0cnVjdCBza19idWZmX2hlYWQgcmVjdl9mcmFtZXM7CisKIAl1aW50IG4gPSAwOwogCXVpbnQgYm91bmRfbGltaXQgPSBib3VuZCA/IFJYQk5EIDogLTE7CiAKIAlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQkvKiBnYXRoZXIgcmVjZWl2ZWQgZnJhbWVzICovCi0Jd2hpbGUgKChwID0gZG1hX3J4KHdsY19ody0+ZGlbZmlmb10pKSkgeworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnJlY3ZfZnJhbWVzKTsKIAotCQlpZiAoIXRhaWwpCi0JCQloZWFkID0gdGFpbCA9IHA7Ci0JCWVsc2UgewotCQkJdGFpbC0+cHJldiA9IHA7Ci0JCQl0YWlsID0gcDsKLQkJfQorCS8qIGdhdGhlciByZWNlaXZlZCBmcmFtZXMgKi8KKwl3aGlsZSAoZG1hX3J4KHdsY19ody0+ZGlbZmlmb10sICZyZWN2X2ZyYW1lcykpIHsKIAogCQkvKiAhZ2l2ZSBvdGhlcnMgc29tZSB0aW1lIHRvIHJ1biEgKi8KIAkJaWYgKCsrbiA+PSBib3VuZF9saW1pdCkKQEAgLTgzNTMsMTIgKzgxMjEsMTEgQEAKIAlkbWFfcnhmaWxsKHdsY19ody0+ZGlbZmlmb10pOwogCiAJLyogcHJvY2VzcyBlYWNoIGZyYW1lICovCi0Jd2hpbGUgKChwID0gaGVhZCkgIT0gTlVMTCkgeworCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnJlY3ZfZnJhbWVzLCBwLCBuZXh0KSB7CiAJCXN0cnVjdCBkMTFyeGhkcl9sZSAqcnhoX2xlOwogCQlzdHJ1Y3QgZDExcnhoZHIgKnJ4aDsKLQkJaGVhZCA9IGhlYWQtPnByZXY7Ci0JCXAtPnByZXYgPSBOVUxMOwogCisJCXNrYl91bmxpbmsocCwgJnJlY3ZfZnJhbWVzKTsKIAkJcnhoX2xlID0gKHN0cnVjdCBkMTFyeGhkcl9sZSAqKXAtPmRhdGE7CiAJCXJ4aCA9IChzdHJ1Y3QgZDExcnhoZHIgKilwLT5kYXRhOwogCkBAIC04NDQ4LDggKzgyMTUsNyBAQAogCQlwcmludGtfb25jZSgiJXMgOiBQU00gV2F0Y2hkb2csIGNoaXBpZCAweCV4LCBjaGlwcmV2IDB4JXhcbiIsCiAJCQkJCV9fZnVuY19fLCB3bGNfaHctPnNpaC0+Y2hpcCwKIAkJCQkJd2xjX2h3LT5zaWgtPmNoaXByZXYpOwotCQkvKiBiaWcgaGFtbWVyICovCi0JCWJyY21zX2luaXQod2xjLT53bCk7CisJCWJyY21zX2ZhdGFsX2Vycm9yKHdsY19ody0+d2xjLT53bCk7CiAJfQogCiAJLyogZ3B0aW1lciB0aW1lb3V0ICovCkBAIC04NDcwLDE1ICs4MjM2LDE0IEBACiAJcmV0dXJuIHdsYy0+bWFjaW50c3RhdHVzICE9IDA7CiAKICBmYXRhbDoKLQlicmNtc19pbml0KHdsYy0+d2wpOworCWJyY21zX2ZhdGFsX2Vycm9yKHdsY19ody0+d2xjLT53bCk7CiAJcmV0dXJuIHdsYy0+bWFjaW50c3RhdHVzICE9IDA7CiB9CiAKLXZvaWQgYnJjbXNfY19pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKK3ZvaWQgYnJjbXNfY19pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBtdXRlX3R4KQogewogCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CiAJdTE2IGNoYW5zcGVjOwotCWJvb2wgbXV0ZSA9IGZhbHNlOwogCiAJQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGMtPnB1Yi0+dW5pdCk7CiAKQEAgLTg0OTQsNyArODI1OSw3IEBACiAJZWxzZQogCQljaGFuc3BlYyA9IGJyY21zX2NfaW5pdF9jaGFuc3BlYyh3bGMpOwogCi0JYnJjbXNfYl9pbml0KHdsYy0+aHcsIGNoYW5zcGVjLCBtdXRlKTsKKwlicmNtc19iX2luaXQod2xjLT5odywgY2hhbnNwZWMpOwogCiAJLyogdXBkYXRlIGJlYWNvbiBsaXN0ZW4gaW50ZXJ2YWwgKi8KIAlicmNtc19jX2Jjbl9saV91cGQod2xjKTsKQEAgLTg1NjAsMTUgKzgzMjUsMTYgQEAKIAkvKiAuLm5vdyByZWFsbHkgdW5sZWFzaCBoZWxsIChhbGxvdyB0aGUgTUFDIG91dCBvZiBzdXNwZW5kKSAqLwogCWJyY21zX2NfZW5hYmxlX21hYyh3bGMpOwogCisJLyogc3VzcGVuZCB0aGUgdHggZmlmb3MgYW5kIG11dGUgdGhlIHBoeSBmb3IgcHJlaXNtIGNhYyB0aW1lICovCisJaWYgKG11dGVfdHgpCisJCWJyY21zX2JfbXV0ZSh3bGMtPmh3LCB0cnVlKTsKKwogCS8qIGNsZWFyIHR4IGZsb3cgY29udHJvbCAqLwogCWJyY21zX2NfdHhmbG93Y29udHJvbF9yZXNldCh3bGMpOwogCiAJLyogZW5hYmxlIHRoZSBSRiBEaXNhYmxlIERlbGF5IHRpbWVyICovCiAJV19SRUcoJndsYy0+cmVncy0+cmZkaXNhYmxlZGx5LCBSRkRJU0FCTEVfREVGQVVMVCk7CiAKLQkvKiBpbml0aWFsaXplIG1wYyBkZWxheSAqLwotCXdsYy0+bXBjX2RlbGF5X29mZiA9IHdsYy0+bXBjX2RseWNudCA9IEJSQ01TX01QQ19NSU5fREVMQVlDTlQ7Ci0KIAkvKgogCSAqIEluaXRpYWxpemUgV01FIHBhcmFtZXRlcnM7IGlmIHRoZXkgaGF2ZW4ndCBiZWVuIHNldCBieSBzb21lIG90aGVyCiAJICogbWVjaGFuaXNtIChJT1ZhciwgZXRjKSB0aGVuIHJlYWQgdGhlbSBmcm9tIHRoZSBoYXJkd2FyZS4KQEAgLTg1NzcsNyArODM0Myw3IEBACiAJCS8qIFVuaW5pdGlhbGl6ZWQ7IHJlYWQgZnJvbSBIVyAqLwogCQlpbnQgYWM7CiAKLQkJZm9yIChhYyA9IDA7IGFjIDwgQUNfQ09VTlQ7IGFjKyspCisJCWZvciAoYWMgPSAwOyBhYyA8IElFRUU4MDIxMV9OVU1fQUNTOyBhYysrKQogCQkJd2xjLT53bWVfcmV0cmllc1thY10gPQogCQkJICAgIGJyY21zX2JfcmVhZF9zaG0od2xjLT5odywgTV9BQ19UWExNVF9BRERSKGFjKSk7CiAJfQpAQCAtODc1NCw4ICs4NTIwLDYgQEAKIAkJYnJjbXNfY19odF91cGRhdGVfc2dpX3J4KHdsYywgMCk7CiAJfQogCi0JLyogaW5pdGlhbGl6ZSByYWRpb19tcGNfZGlzYWJsZSBhY2NvcmRpbmcgdG8gd2xjLT5tcGMgKi8KLQlicmNtc19jX3JhZGlvX21wY191cGQod2xjKTsKIAlicmNtc19iX2FudHNlbF9zZXQod2xjLT5odywgd2xjLT5hc2ktPmFudHNlbF9hdmFpbCk7CiAKIAlpZiAocGVycikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5oCmluZGV4IGMwZTBmY2YuLmUyZGU5N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uaApAQCAtNDQsOCArNDQsNiBAQAogLyogdHJhbnNtaXQgYnVmZmVyIG1heCBoZWFkcm9vbSBmb3IgcHJvdG9jb2wgaGVhZGVycyAqLwogI2RlZmluZSBUWE9GRiAoRDExX1RYSF9MRU4gKyBEMTFfUEhZX0hEUl9MRU4pCiAKLSNkZWZpbmUgQUNfQ09VTlQJCTQKLQogLyogTWFjcm9zIGZvciBkb2luZyBkZWZpbml0aW9uIGFuZCBnZXQvc2V0IG9mIGJpdGZpZWxkcwogICogVXNhZ2UgZXhhbXBsZSwgZS5nLiBhIHRocmVlLWJpdCBmaWVsZCAoYml0cyA0LTYpOgogICogICAgI2RlZmluZSA8TkFNRT5fTQlCSVRGSUVMRF9NQVNLKDMpCkBAIC00MjcsMTEgKzQyNSw2IEBACiAgKiBiYW5kaW5pdF9wZW5kaW5nOiB0cmFjayBiYW5kIGluaXQgaW4gYXV0byBiYW5kLgogICogcmFkaW9fbW9uaXRvcjogcmFkaW8gdGltZXIgaXMgcnVubmluZy4KICAqIGdvaW5nX2Rvd246IGRvd24gcGF0aCBpbnRlcm1lZGlhdGUgdmFyaWFibGUuCi0gKiBtcGM6IGVuYWJsZSBtaW5pbXVtIHBvd2VyIGNvbnN1bXB0aW9uLgotICogbXBjX2RseWNudDogIyBvZiB3YXRjaGRvZyBjbnQgYmVmb3JlIHR1cm4gZGlzYWJsZSByYWRpby4KLSAqIG1wY19vZmZjbnQ6ICMgb2Ygd2F0Y2hkb2cgY250IHRoYXQgcmFkaW8gaXMgZGlzYWJsZWQuCi0gKiBtcGNfZGVsYXlfb2ZmOiBkZWxheSByYWRpbyBkaXNhYmxlIGJ5ICMgb2Ygd2F0Y2hkb2cgY250LgotICogcHJldl9ub25fZGVsYXlfbXBjOiBwcmV2IHN0YXRlIGJyY21zX2NfaXNfbm9uX2RlbGF5X21wYy4KICAqIHdkdGltZXI6IHRpbWVyIGZvciB3YXRjaGRvZyByb3V0aW5lLgogICogcmFkaW9fdGltZXI6IHRpbWVyIGZvciBodyByYWRpbyBidXR0b24gbW9uaXRvciByb3V0aW5lLgogICogbW9uaXRvcjogbW9uaXRvciAoTVBEVSBzbmlmZmluZykgbW9kZS4KQEAgLTQ0MSw3ICs0MzQsNyBAQAogICogYmNuX2xpX2R0aW06IGJlYWNvbiBsaXN0ZW4gaW50ZXJ2YWwgaW4gIyBkdGltcy4KICAqIFdEYXJtZWQ6IHdhdGNoZG9nIHRpbWVyIGlzIGFybWVkLgogICogV0RsYXN0OiBsYXN0IHRpbWUgd2xjX3dhdGNoZG9nKCkgd2FzIGNhbGxlZC4KLSAqIGVkY2ZfdHhvcFtBQ19DT1VOVF06IGN1cnJlbnQgdHhvcCBmb3IgZWFjaCBhYy4KKyAqIGVkY2ZfdHhvcFtJRUVFODAyMTFfTlVNX0FDU106IGN1cnJlbnQgdHhvcCBmb3IgZWFjaCBhYy4KICAqIHdtZV9yZXRyaWVzOiBwZXItQUMgcmV0cnkgbGltaXRzLgogICogdHhfcHJlY19tYXA6IFByZWNlZGVuY2UgbWFwIGJhc2VkIG9uIEhXIEZJRk8gc3BhY2UuCiAgKiBmaWZvMnByZWNfbWFwW05GSUZPXTogcG9pbnRlciB0byBmaWZvMl9wcmVjIG1hcCBiYXNlZCBvbiBXTUUuCkBAIC01MjIsMTggKzUxNSwxMSBAQAogCWJvb2wgcmFkaW9fbW9uaXRvcjsKIAlib29sIGdvaW5nX2Rvd247CiAKLQlib29sIG1wYzsKLQl1OCBtcGNfZGx5Y250OwotCXU4IG1wY19vZmZjbnQ7Ci0JdTggbXBjX2RlbGF5X29mZjsKLQl1OCBwcmV2X25vbl9kZWxheV9tcGM7Ci0KIAlzdHJ1Y3QgYnJjbXNfdGltZXIgKndkdGltZXI7CiAJc3RydWN0IGJyY21zX3RpbWVyICpyYWRpb190aW1lcjsKIAogCS8qIHByb21pc2N1b3VzICovCi0JYm9vbCBtb25pdG9yOwotCWJvb2wgYmNubWlzY19tb25pdG9yOworCXVpbnQgZmlsdGVyX2ZsYWdzOwogCiAJLyogZHJpdmVyIGZlYXR1cmUgKi8KIAlib29sIF9yaWZzOwpAQCAtNTQ2LDkgKzUzMiw5IEBACiAJdTMyIFdEbGFzdDsKIAogCS8qIFdNRSAqLwotCXUxNiBlZGNmX3R4b3BbQUNfQ09VTlRdOworCXUxNiBlZGNmX3R4b3BbSUVFRTgwMjExX05VTV9BQ1NdOwogCi0JdTE2IHdtZV9yZXRyaWVzW0FDX0NPVU5UXTsKKwl1MTYgd21lX3JldHJpZXNbSUVFRTgwMjExX05VTV9BQ1NdOwogCXUxNiB0eF9wcmVjX21hcDsKIAl1MTYgZmlmbzJwcmVjX21hcFtORklGT107CiAKQEAgLTY3MSw4ICs2NTcsNyBAQAogI2VuZGlmCiAKIGV4dGVybiBpbnQgYnJjbXNfY19zZXRfZ21vZGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1OCBnbW9kZSwgYm9vbCBjb25maWcpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkJICAgYm9vbCBwcm9taXNjKTsKK2V4dGVybiB2b2lkIGJyY21zX2NfbWFjX3Byb21pc2Moc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1aW50IGZpbHRlcl9mbGFncyk7CiBleHRlcm4gdm9pZCBicmNtc19jX3NlbmRfcShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwogZXh0ZXJuIGludCBicmNtc19jX3ByZXBfcGR1KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnBkdSwKIAkJCSAgICB1aW50ICpmaWZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2Ntbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfY21uLmMKaW5kZXggYTMxNDkyNS4uMDA4YWFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfY21uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfY21uLmMKQEAgLTEwOSwxMCArMTA5LDEwIEBACiAJezIwNCwgNTAyMH0sCiAJezIwOCwgNTA0MH0sCiAJezIxMiwgNTA2MH0sCi0JezIxNiwgNTA4MDB9CisJezIxNiwgNTA4MH0KIH07CiAKLWNvbnN0IHU4IG9mZG1fcmF0ZV9sb29rdXBbXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBvZmRtX3JhdGVfbG9va3VwW10gPSB7CiAKIAlCUkNNX1JBVEVfNDhNLAogCUJSQ01fUkFURV8yNE0sCkBAIC0xOTAsMTUgKzE5MCw3IEBACiAJCWRhdGEgPSBSX1JFRygmcGktPnJlZ3MtPnJhZGlvcmVnZGF0YSk7CiAJfSBlbHNlIHsKIAkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5waHk0d2FkZHIsIGFkZHIpOwotCi0jaWZkZWYgX19BUk1fQVJDSF80VF9fCi0JCV9fYXNtX18oIiAuYWxpZ24gNCAiKTsKLQkJX19hc21fXygiIG5vcCAiKTsKIAkJZGF0YSA9IFJfUkVHKCZwaS0+cmVncy0+cGh5NHdkYXRhbG8pOwotI2Vsc2UKLQkJZGF0YSA9IFJfUkVHKCZwaS0+cmVncy0+cGh5NHdkYXRhbG8pOwotI2VuZGlmCi0KIAl9CiAJcGktPnBoeV93cmVnID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfaW50LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaAppbmRleCBiZWE4NTI0Li41Zjk0NzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaApAQCAtNzc0LDExICs3NzQsNiBAQAogCXMxNiBucGh5X25vaXNlX3dpbltQSFlfQ09SRV9NQVhdW1BIWV9OT0lTRV9XSU5ET1dfU1pdOwogCXU4IG5waHlfbm9pc2VfaW5kZXg7CiAKLQl1OCBucGh5X3R4cGlkMmdbUEhZX0NPUkVfTlVNXzJdOwotCXU4IG5waHlfdHhwaWQ1Z1tQSFlfQ09SRV9OVU1fMl07Ci0JdTggbnBoeV90eHBpZDVnbFtQSFlfQ09SRV9OVU1fMl07Ci0JdTggbnBoeV90eHBpZDVnaFtQSFlfQ09SRV9OVU1fMl07Ci0KIAlib29sIG5waHlfZ2Fpbl9ib29zdDsKIAlib29sIG5waHlfZWxuYV9nYWluX2NvbmZpZzsKIAl1MTYgb2xkX2JwaHlfdGVzdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X24uYwppbmRleCBjZDE5YzJmLi5lYzliNTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAicGh5X3JhZGlvLmgiCiAjaW5jbHVkZSAicGh5cmVnX24uaCIKICNpbmNsdWRlICJwaHl0Ymxfbi5oIgorI2luY2x1ZGUgInNvYy5oIgogCiAjZGVmaW5lIFJFQURfUkFESU9fUkVHMihwaSwgcmFkaW9fdHlwZSwganNwYWNlLCBjb3JlLCByZWdfbmFtZSkJXAogCXJlYWRfcmFkaW9fcmVnKHBpLCByYWRpb190eXBlIyNfIyNqc3BhY2UjI18jI3JlZ19uYW1lIHwJXApAQCAtMTQ0MTcsMTIgKzE0NDE4LDYgQEAKIAkJc3dpdGNoIChiYW5kX251bSkgewogCQljYXNlIDA6CiAKLQkJCXBpLT5ucGh5X3R4cGlkMmdbUEhZX0NPUkVfMF0gPQotCQkJCSh1OCkgd2xhcGlfZ2V0aW50dmFyKHNoaW0sCi0JCQkJCQkgICAgIEJSQ01TX1NST01fVFhQSUQyR0EwKTsKLQkJCXBpLT5ucGh5X3R4cGlkMmdbUEhZX0NPUkVfMV0gPQotCQkJCSh1OCkgd2xhcGlfZ2V0aW50dmFyKHNoaW0sCi0JCQkJCQkgICAgIEJSQ01TX1NST01fVFhQSUQyR0ExKTsKIAkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1tQSFlfQ09SRV8wXS5tYXhfcHdyXzJnID0KIAkJCQkoczgpIHdsYXBpX2dldGludHZhcihzaGltLAogCQkJCQkJICAgICBCUkNNU19TUk9NX01BWFAyR0EwKTsKQEAgLTE0NDg2LDEyICsxNDQ4MSw2IEBACiAJCQlicmVhazsKIAkJY2FzZSAxOgogCi0JCQlwaS0+bnBoeV90eHBpZDVnW1BIWV9DT1JFXzBdID0KLQkJCQkodTgpIHdsYXBpX2dldGludHZhcihzaGltLAotCQkJCQkJICAgICBCUkNNU19TUk9NX1RYUElENUdBMCk7Ci0JCQlwaS0+bnBoeV90eHBpZDVnW1BIWV9DT1JFXzFdID0KLQkJCQkodTgpIHdsYXBpX2dldGludHZhcihzaGltLAotCQkJCQkJICAgICBCUkNNU19TUk9NX1RYUElENUdBMSk7CiAJCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMF0ubWF4X3B3cl81Z20gPQogCQkJCShzOCkgd2xhcGlfZ2V0aW50dmFyKHNoaW0sIEJSQ01TX1NST01fTUFYUDVHQTApOwogCQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzFdLm1heF9wd3JfNWdtID0KQEAgLTE0NTUxLDEyICsxNDU0MCw2IEBACiAJCQlicmVhazsKIAkJY2FzZSAyOgogCi0JCQlwaS0+bnBoeV90eHBpZDVnbFswXSA9Ci0JCQkJKHU4KSB3bGFwaV9nZXRpbnR2YXIoc2hpbSwKLQkJCQkJCSAgICAgQlJDTVNfU1JPTV9UWFBJRDVHTEEwKTsKLQkJCXBpLT5ucGh5X3R4cGlkNWdsWzFdID0KLQkJCQkodTgpIHdsYXBpX2dldGludHZhcihzaGltLAotCQkJCQkJICAgICBCUkNNU19TUk9NX1RYUElENUdMQTEpOwogCQkJcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLm1heF9wd3JfNWdsID0KIAkJCQkoczgpIHdsYXBpX2dldGludHZhcihzaGltLAogCQkJCQkJICAgICBCUkNNU19TUk9NX01BWFA1R0xBMCk7CkBAIC0xNDYxNSwxMiArMTQ1OTgsNiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgMzoKIAotCQkJcGktPm5waHlfdHhwaWQ1Z2hbMF0gPQotCQkJCSh1OCkgd2xhcGlfZ2V0aW50dmFyKHNoaW0sCi0JCQkJCQkgICAgIEJSQ01TX1NST01fVFhQSUQ1R0hBMCk7Ci0JCQlwaS0+bnBoeV90eHBpZDVnaFsxXSA9Ci0JCQkJKHU4KSB3bGFwaV9nZXRpbnR2YXIoc2hpbSwKLQkJCQkJCSAgICAgQlJDTVNfU1JPTV9UWFBJRDVHSEExKTsKIAkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5tYXhfcHdyXzVnaCA9CiAJCQkJKHM4KSB3bGFwaV9nZXRpbnR2YXIoc2hpbSwKIAkJCQkJCSAgICAgQlJDTVNfU1JPTV9NQVhQNUdIQTApOwpAQCAtMjc5OTQsMjAgKzI3OTcxLDExIEBACiAJCWNoYW5fZnJlcV9yYW5nZSA9IHdsY19waHlfZ2V0X2NoYW5fZnJlcV9yYW5nZV9ucGh5KHBpLCAwKTsKIAkJc3dpdGNoIChjaGFuX2ZyZXFfcmFuZ2UpIHsKIAkJY2FzZSBXTF9DSEFOX0ZSRVFfUkFOR0VfMkc6Ci0JCQl0eHBpWzBdID0gcGktPm5waHlfdHhwaWQyZ1swXTsKLQkJCXR4cGlbMV0gPSBwaS0+bnBoeV90eHBpZDJnWzFdOwotCQkJYnJlYWs7CiAJCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzVHTDoKLQkJCXR4cGlbMF0gPSBwaS0+bnBoeV90eHBpZDVnbFswXTsKLQkJCXR4cGlbMV0gPSBwaS0+bnBoeV90eHBpZDVnbFsxXTsKLQkJCWJyZWFrOwogCQljYXNlIFdMX0NIQU5fRlJFUV9SQU5HRV81R006Ci0JCQl0eHBpWzBdID0gcGktPm5waHlfdHhwaWQ1Z1swXTsKLQkJCXR4cGlbMV0gPSBwaS0+bnBoeV90eHBpZDVnWzFdOwotCQkJYnJlYWs7CiAJCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzVHSDoKLQkJCXR4cGlbMF0gPSBwaS0+bnBoeV90eHBpZDVnaFswXTsKLQkJCXR4cGlbMV0gPSBwaS0+bnBoeV90eHBpZDVnaFsxXTsKKwkJCXR4cGlbMF0gPSAwOworCQkJdHhwaVsxXSA9IDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXR4cGlbMF0gPSB0eHBpWzFdID0gOTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmMKaW5kZXggM2IzNmUzYS4uMTJiYTU3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BtdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9wbXUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgInB1Yi5oIgogI2luY2x1ZGUgImFpdXRpbHMuaCIKICNpbmNsdWRlICJwbXUuaCIKKyNpbmNsdWRlICJzb2MuaCIKIAogLyoKICAqIGV4dGVybmFsIExQTyBjcnlzdGFsIGZyZXF1ZW5jeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3B1Yi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3B1Yi5oCmluZGV4IDM3YmIyZGMuLjIxY2NmM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9wdWIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcHViLmgKQEAgLTE3MCwyMiArMTcwLDYgQEAKIAlCUkNNU19TUk9NX1RTU0lQT1MyRywKIAlCUkNNU19TUk9NX1RTU0lQT1M1RywKIAlCUkNNU19TUk9NX1RYQ0hBSU4sCi0JQlJDTVNfU1JPTV9UWFBJRDJHQTAsCi0JQlJDTVNfU1JPTV9UWFBJRDJHQTEsCi0JQlJDTVNfU1JPTV9UWFBJRDJHQTIsCi0JQlJDTVNfU1JPTV9UWFBJRDJHQTMsCi0JQlJDTVNfU1JPTV9UWFBJRDVHQTAsCi0JQlJDTVNfU1JPTV9UWFBJRDVHQTEsCi0JQlJDTVNfU1JPTV9UWFBJRDVHQTIsCi0JQlJDTVNfU1JPTV9UWFBJRDVHQTMsCi0JQlJDTVNfU1JPTV9UWFBJRDVHSEEwLAotCUJSQ01TX1NST01fVFhQSUQ1R0hBMSwKLQlCUkNNU19TUk9NX1RYUElENUdIQTIsCi0JQlJDTVNfU1JPTV9UWFBJRDVHSEEzLAotCUJSQ01TX1NST01fVFhQSUQ1R0xBMCwKLQlCUkNNU19TUk9NX1RYUElENUdMQTEsCi0JQlJDTVNfU1JPTV9UWFBJRDVHTEEyLAotCUJSQ01TX1NST01fVFhQSUQ1R0xBMywKIAkvKgogCSAqIHBlci1wYXRoIGlkZW50aWZpZXJzIChzZWUgc3JvbS5jKQogCSAqLwpAQCAtMjI1LDEwICsyMDksNiBAQAogCUJSQ01TX1NST01fUEEyR1cyQTEsCiAJQlJDTVNfU1JPTV9QQTJHVzJBMiwKIAlCUkNNU19TUk9NX1BBMkdXMkEzLAotCUJSQ01TX1NST01fUEEyR1czQTAsCi0JQlJDTVNfU1JPTV9QQTJHVzNBMSwKLQlCUkNNU19TUk9NX1BBMkdXM0EyLAotCUJSQ01TX1NST01fUEEyR1czQTMsCiAJQlJDTVNfU1JPTV9QQTVHSFcwQTAsCiAJQlJDTVNfU1JPTV9QQTVHSFcwQTEsCiAJQlJDTVNfU1JPTV9QQTVHSFcwQTIsCkBAIC0yNDEsMTAgKzIyMSw2IEBACiAJQlJDTVNfU1JPTV9QQTVHSFcyQTEsCiAJQlJDTVNfU1JPTV9QQTVHSFcyQTIsCiAJQlJDTVNfU1JPTV9QQTVHSFcyQTMsCi0JQlJDTVNfU1JPTV9QQTVHSFczQTAsCi0JQlJDTVNfU1JPTV9QQTVHSFczQTEsCi0JQlJDTVNfU1JPTV9QQTVHSFczQTIsCi0JQlJDTVNfU1JPTV9QQTVHSFczQTMsCiAJQlJDTVNfU1JPTV9QQTVHTFcwQTAsCiAJQlJDTVNfU1JPTV9QQTVHTFcwQTEsCiAJQlJDTVNfU1JPTV9QQTVHTFcwQTIsCkBAIC0yNTcsMTAgKzIzMyw2IEBACiAJQlJDTVNfU1JPTV9QQTVHTFcyQTEsCiAJQlJDTVNfU1JPTV9QQTVHTFcyQTIsCiAJQlJDTVNfU1JPTV9QQTVHTFcyQTMsCi0JQlJDTVNfU1JPTV9QQTVHTFczQTAsCi0JQlJDTVNfU1JPTV9QQTVHTFczQTEsCi0JQlJDTVNfU1JPTV9QQTVHTFczQTIsCi0JQlJDTVNfU1JPTV9QQTVHTFczQTMsCiAJQlJDTVNfU1JPTV9QQTVHVzBBMCwKIAlCUkNNU19TUk9NX1BBNUdXMEExLAogCUJSQ01TX1NST01fUEE1R1cwQTIsCkBAIC0yNzMsMTQgKzI0NSw5IEBACiAJQlJDTVNfU1JPTV9QQTVHVzJBMSwKIAlCUkNNU19TUk9NX1BBNUdXMkEyLAogCUJSQ01TX1NST01fUEE1R1cyQTMsCi0JQlJDTVNfU1JPTV9QQTVHVzNBMCwKLQlCUkNNU19TUk9NX1BBNUdXM0ExLAotCUJSQ01TX1NST01fUEE1R1czQTIsCi0JQlJDTVNfU1JPTV9QQTVHVzNBMywKIH07CiAKICNkZWZpbmUJQlJDTVNfTlVNUkFURVMJMTYJLyogbWF4ICMgb2YgcmF0ZXMgaW4gYSByYXRlc2V0ICovCi0jZGVmaW5lCUQxMV9QSFlfSERSX0xFTgk2CS8qIFBoeSBoZWFkZXIgbGVuZ3RoIC0gNiBieXRlcyAqLwogCiAvKiBwaHkgdHlwZXMgKi8KICNkZWZpbmUJUEhZX1RZUEVfQQkwCS8qIFBoeSB0eXBlIEEgKi8KQEAgLTQxNCw3ICszODEsNiBAQAogCXVpbnQgX25iYW5kczsJCS8qICMgYmFuZHMgc3VwcG9ydGVkICovCiAJdWludCBub3c7CQkvKiAjIGVsYXBzZWQgc2Vjb25kcyAqLwogCi0JYm9vbCBwcm9taXNjOwkJLyogcHJvbWlzY3VvdXMgZGVzdGluYXRpb24gYWRkcmVzcyAqLwogCWJvb2wgZGVsYXllZF9kb3duOwkvKiBkb3duIGRlbGF5ZWQgKi8KIAlib29sIGFzc29jaWF0ZWQ7CS8qIHRydWU6cGFydCBvZiBbSV1CU1MsIGZhbHNlOiBub3QgKi8KIAkvKiAodW5pb24gb2Ygc3Rhc19hc3NvY2lhdGVkLCBhcHNfYXNzb2NpYXRlZCkgKi8KQEAgLTU3Miw3ICs1MzgsNyBAQAogZXh0ZXJuIHVpbnQgYnJjbXNfY19kb3duKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7CiAKIGV4dGVybiBib29sIGJyY21zX2NfY2hpcG1hdGNoKHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7CitleHRlcm4gdm9pZCBicmNtc19jX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIG11dGVfdHgpOwogZXh0ZXJuIHZvaWQgYnJjbXNfY19yZXNldChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwogCiBleHRlcm4gdm9pZCBicmNtc19jX2ludHJzb24oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKQEAgLTYyOCw3ICs1OTQsNyBAQAogCQkJCQl1OCBpbnRlcnZhbCk7CiBleHRlcm4gaW50IGJyY21zX2Nfc2V0X3R4X3Bvd2VyKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgaW50IHR4cHdyKTsKIGV4dGVybiBpbnQgYnJjbXNfY19nZXRfdHhfcG93ZXIoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiB2b2lkIGJyY21zX2Nfc2V0X3JhZGlvX21wYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgbXBjKTsKIGV4dGVybiBib29sIGJyY21zX2NfY2hlY2tfcmFkaW9fZGlzYWJsZWQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIGJyY21zX2NfbXV0ZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgb24pOwogCiAjZW5kaWYJCQkJLyogX0JSQ01fUFVCX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcmF0ZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3JhdGUuaAppbmRleCBlN2I5ZGMyLi45ODBkNTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcmF0ZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9yYXRlLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgInR5cGVzLmgiCiAjaW5jbHVkZSAiZDExLmgiCisjaW5jbHVkZSAicGh5X2hhbC5oIgogCiBleHRlcm4gY29uc3QgdTggcmF0ZV9pbmZvW107CiBleHRlcm4gY29uc3Qgc3RydWN0IGJyY21zX2NfcmF0ZXNldCBjY2tfb2ZkbV9taW1vX3JhdGVzOwpAQCAtMTk4LDExICsxOTksOSBAQAogCiAvKiBDb252ZXJ0IGVuY29kZWQgcmF0ZSB2YWx1ZSBpbiBwbGNwIGhlYWRlciB0byBudW1lcmljYWwgcmF0ZXMgaW4gNTAwIEtIegogICogaW5jcmVtZW50cyAqLwotZXh0ZXJuIGNvbnN0IHU4IG9mZG1fcmF0ZV9sb29rdXBbXTsKLQogc3RhdGljIGlubGluZSB1OCBvZmRtX3BoeTJtYWNfcmF0ZSh1OCBybHB0KQogewotCXJldHVybiBvZmRtX3JhdGVfbG9va3VwW3JscHQgJiAweDddOworCXJldHVybiB3bGNfcGh5X2dldF9vZmRtX3JhdGVfbG9va3VwKClbcmxwdCAmIDB4N107CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTggY2NrX3BoeTJtYWNfcmF0ZSh1OCBzaWduYWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3Nyb20uYwppbmRleCA5OWY3OTEwLi5iNjk4N2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJhaXV0aWxzLmgiCiAjaW5jbHVkZSAib3RwLmgiCiAjaW5jbHVkZSAic3JvbS5oIgorI2luY2x1ZGUgInNvYy5oIgogCiAvKgogICogU1JPTSBDUkM4IHBvbHlub21pYWwgdmFsdWU6CkBAIC02Miw5ICs2Myw2IEBACiAjZGVmaW5lCVNST01fTUFDSElfRVQxCQk0MgogI2RlZmluZQlTUk9NX01BQ01JRF9FVDEJCTQzCiAjZGVmaW5lCVNST01fTUFDTE9fRVQxCQk0NAotI2RlZmluZQlTUk9NM19NQUNISQkJMzcKLSNkZWZpbmUJU1JPTTNfTUFDTUlECQkzOAotI2RlZmluZQlTUk9NM19NQUNMTwkJMzkKIAogI2RlZmluZQlTUk9NX0JYQVJTU0kyRwkJNDAKICNkZWZpbmUJU1JPTV9CWEFSU1NJNUcJCTQxCkBAIC0xMDEsNyArOTksNiBAQAogCiAjZGVmaW5lCVNST01fQkZMCQk1NwogI2RlZmluZQlTUk9NX0JGTDIJCTI4Ci0jZGVmaW5lCVNST00zX0JGTDIJCTYxCiAKICNkZWZpbmUJU1JPTV9BRzEwCQk1OAogCkBAIC0xMDksOTkgKzEwNiwxNiBAQAogCiAjZGVmaW5lCVNST01fT1BPCQk2MAogCi0jZGVmaW5lCVNST00zX0xFRERDCQk2MgotCiAjZGVmaW5lCVNST01fQ1JDUkVWCQk2MwogCi0vKiBTUk9NIFJldiA0OiBSZWFsbG9jYXRlIHRoZSBzb2Z0d2FyZSBwYXJ0IG9mIHRoZSBzcm9tIHRvIGFjY29tbW9kYXRlCi0gKiBNSU1PIGZlYXR1cmVzLiBJdCBhc3N1bWVzIHVwIHRvIHR3byBQQ0lFIGZ1bmN0aW9ucyBhbmQgNDQwIGJ5dGVzCi0gKiBvZiB1c2FibGUgc3JvbSBpLmUuIHRoZSB1c2FibGUgc3RvcmFnZSBpbiBjaGlwcyB3aXRoIE9UUCB0aGF0Ci0gKiBpbXBsZW1lbnRzIGhhcmR3YXJlIHJlZHVuZGFuY3kuCi0gKi8KLQogI2RlZmluZQlTUk9NNF9XT1JEUwkJMjIwCiAKLSNkZWZpbmUJU1JPTTRfU0lHTgkJMzIKLSNkZWZpbmUJU1JPTTRfU0lHTkFUVVJFCQkweDUzNzIKLQotI2RlZmluZQlTUk9NNF9CUkVWCQkzMwotCi0jZGVmaW5lCVNST000X0JGTDAJCTM0Ci0jZGVmaW5lCVNST000X0JGTDEJCTM1Ci0jZGVmaW5lCVNST000X0JGTDIJCTM2Ci0jZGVmaW5lCVNST000X0JGTDMJCTM3Ci0jZGVmaW5lCVNST001X0JGTDAJCTM3Ci0jZGVmaW5lCVNST001X0JGTDEJCTM4Ci0jZGVmaW5lCVNST001X0JGTDIJCTM5Ci0jZGVmaW5lCVNST001X0JGTDMJCTQwCi0KLSNkZWZpbmUJU1JPTTRfTUFDSEkJCTM4Ci0jZGVmaW5lCVNST000X01BQ01JRAkJMzkKLSNkZWZpbmUJU1JPTTRfTUFDTE8JCTQwCi0jZGVmaW5lCVNST001X01BQ0hJCQk0MQotI2RlZmluZQlTUk9NNV9NQUNNSUQJCTQyCi0jZGVmaW5lCVNST001X01BQ0xPCQk0MwotCi0jZGVmaW5lCVNST000X0NDT0RFCQk0MQotI2RlZmluZQlTUk9NNF9SRUdSRVYJCTQyCi0jZGVmaW5lCVNST001X0NDT0RFCQkzNAotI2RlZmluZQlTUk9NNV9SRUdSRVYJCTM1Ci0KLSNkZWZpbmUJU1JPTTRfTEVEQkgxMAkJNDMKLSNkZWZpbmUJU1JPTTRfTEVEQkgzMgkJNDQKLSNkZWZpbmUJU1JPTTVfTEVEQkgxMAkJNTkKLSNkZWZpbmUJU1JPTTVfTEVEQkgzMgkJNjAKLQotI2RlZmluZQlTUk9NNF9MRUREQwkJNDUKLSNkZWZpbmUJU1JPTTVfTEVEREMJCTQ1Ci0KLSNkZWZpbmUJU1JPTTRfQUEJCTQ2Ci0KLSNkZWZpbmUJU1JPTTRfQUcxMAkJNDcKLSNkZWZpbmUJU1JPTTRfQUczMgkJNDgKLQotI2RlZmluZQlTUk9NNF9UWFBJRDJHCQk0OQotI2RlZmluZQlTUk9NNF9UWFBJRDVHCQk1MQotI2RlZmluZQlTUk9NNF9UWFBJRDVHTAkJNTMKLSNkZWZpbmUJU1JPTTRfVFhQSUQ1R0gJCTU1Ci0KLSNkZWZpbmUgU1JPTTRfVFhSWEMJCTYxCiAjZGVmaW5lIFNST000X1RYQ0hBSU5fTUFTSwkweDAwMGYKLSNkZWZpbmUgU1JPTTRfVFhDSEFJTl9TSElGVAkwCiAjZGVmaW5lIFNST000X1JYQ0hBSU5fTUFTSwkweDAwZjAKLSNkZWZpbmUgU1JPTTRfUlhDSEFJTl9TSElGVAk0CiAjZGVmaW5lIFNST000X1NXSVRDSF9NQVNLCTB4ZmYwMAotI2RlZmluZSBTUk9NNF9TV0lUQ0hfU0hJRlQJOAogCiAvKiBQZXItcGF0aCBmaWVsZHMgKi8KICNkZWZpbmUJTUFYX1BBVEhfU1JPTQkJNAotI2RlZmluZQlTUk9NNF9QQVRIMAkJNjQKLSNkZWZpbmUJU1JPTTRfUEFUSDEJCTg3Ci0jZGVmaW5lCVNST000X1BBVEgyCQkxMTAKLSNkZWZpbmUJU1JPTTRfUEFUSDMJCTEzMwotCi0jZGVmaW5lCVNST000XzJHX0lUVF9NQVhQCTAKLSNkZWZpbmUJU1JPTTRfMkdfUEEJCTEKLSNkZWZpbmUJU1JPTTRfNUdfSVRUX01BWFAJNQotI2RlZmluZQlTUk9NNF81R0xIX01BWFAJCTYKLSNkZWZpbmUJU1JPTTRfNUdfUEEJCTcKLSNkZWZpbmUJU1JPTTRfNUdMX1BBCQkxMQotI2RlZmluZQlTUk9NNF81R0hfUEEJCTE1Ci0KLS8qIEFsbCB0aGUgbWlyaWFkIHBvd2VyIG9mZnNldHMgKi8KLSNkZWZpbmUJU1JPTTRfMkdfQ0NLUE8JCTE1NgotI2RlZmluZQlTUk9NNF8yR19PRkRNUE8JCTE1NwotI2RlZmluZQlTUk9NNF81R19PRkRNUE8JCTE1OQotI2RlZmluZQlTUk9NNF81R0xfT0ZETVBPCTE2MQotI2RlZmluZQlTUk9NNF81R0hfT0ZETVBPCTE2MwotI2RlZmluZQlTUk9NNF8yR19NQ1NQTwkJMTY1Ci0jZGVmaW5lCVNST000XzVHX01DU1BPCQkxNzMKLSNkZWZpbmUJU1JPTTRfNUdMX01DU1BPCQkxODEKLSNkZWZpbmUJU1JPTTRfNUdIX01DU1BPCQkxODkKLSNkZWZpbmUJU1JPTTRfQ0REUE8JCTE5NwotI2RlZmluZQlTUk9NNF9TVEJDUE8JCTE5OAotI2RlZmluZQlTUk9NNF9CVzQwUE8JCTE5OQotI2RlZmluZQlTUk9NNF9CV0RVUFBPCQkyMDAKIAogI2RlZmluZQlTUk9NNF9DUkNSRVYJCTIxOQogCkBAIC00MjQsMTAzICszMzgsMzIgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnJjbXNfc3JvbXZhciBwY2lfc3JvbXZhcnNbXSA9IHsKIAl7QlJDTVNfU1JPTV9ERVZJRCwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCB8IFNSRkxfTk9WQVIsIFBDSV9GMERFVklELAogCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JPQVJEUkVWLCAweDAwMDAwMDBlLCBTUkZMX1BSSEVYLCBTUk9NX0FBQlJFViwKLQkgU1JPTV9CUl9NQVNLfSwKLQl7QlJDTVNfU1JPTV9CT0FSRFJFViwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfQlJFViwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9CT0FSRFJFViwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfQlJFViwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CT0FSREZMQUdTLCAweDAwMDAwMDAyLCBTUkZMX1BSSEVYLCBTUk9NX0JGTCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CT0FSREZMQUdTLCAweDAwMDAwMDA0LCBTUkZMX1BSSEVYIHwgU1JGTF9NT1JFLCBTUk9NX0JGTCwKLQkgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NX0JGTDIsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQk9BUkRGTEFHUywgMHgwMDAwMDAwOCwgU1JGTF9QUkhFWCB8IFNSRkxfTU9SRSwgU1JPTV9CRkwsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTTNfQkZMMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CT0FSREZMQUdTLCAweDAwMDAwMDEwLCBTUkZMX1BSSEVYIHwgU1JGTF9NT1JFLCBTUk9NNF9CRkwwLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NPTlQsIDAsIDAsIFNST000X0JGTDEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQk9BUkRGTEFHUywgMHgwMDAwMDBlMCwgU1JGTF9QUkhFWCB8IFNSRkxfTU9SRSwgU1JPTTVfQkZMMCwKLQkgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NNV9CRkwxLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX0JPQVJERkxBR1MsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVggfCBTUkZMX01PUkUsIFNST004X0JGTDAsCiAJIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTThfQkZMMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CT0FSREZMQUdTMiwgMHgwMDAwMDAxMCwgU1JGTF9QUkhFWCB8IFNSRkxfTU9SRSwgU1JPTTRfQkZMMiwKLQkgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NNF9CRkwzLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JPQVJERkxBR1MyLCAweDAwMDAwMGUwLCBTUkZMX1BSSEVYIHwgU1JGTF9NT1JFLCBTUk9NNV9CRkwyLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NPTlQsIDAsIDAsIFNST001X0JGTDMsIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fQk9BUkRGTEFHUzIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVggfCBTUkZMX01PUkUsIFNST004X0JGTDIsCiAJIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTThfQkZMMywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9CT0FSRFRZUEUsIDB4ZmZmZmZmZmMsIFNSRkxfUFJIRVgsIFNST01fU1NJRCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CT0FSRE5VTSwgMHgwMDAwMDAwNiwgMCwgU1JPTV9NQUNMT19JTDAsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQk9BUkROVU0sIDB4MDAwMDAwMDgsIDAsIFNST00zX01BQ0xPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JPQVJETlVNLCAweDAwMDAwMDEwLCAwLCBTUk9NNF9NQUNMTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CT0FSRE5VTSwgMHgwMDAwMDBlMCwgMCwgU1JPTTVfTUFDTE8sIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fQk9BUkROVU0sIDB4ZmZmZmZmMDAsIDAsIFNST004X01BQ0xPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NDLCAweDAwMDAwMDAyLCAwLCBTUk9NX0FBQlJFViwgU1JPTV9DQ19NQVNLfSwKLQl7QlJDTVNfU1JPTV9SRUdSRVYsIDB4MDAwMDAwMDgsIDAsIFNST01fT1BPLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1JFR1JFViwgMHgwMDAwMDAxMCwgMCwgU1JPTTRfUkVHUkVWLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX1JFR1JFViwgMHgwMDAwMDBlMCwgMCwgU1JPTTVfUkVHUkVWLCAweDAwZmZ9LAogCXtCUkNNU19TUk9NX1JFR1JFViwgMHhmZmZmZmYwMCwgMCwgU1JPTThfUkVHUkVWLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0xFREJIMCwgMHgwMDAwMDAwZSwgU1JGTF9OT0ZGUywgU1JPTV9MRURCSDEwLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0xFREJIMSwgMHgwMDAwMDAwZSwgU1JGTF9OT0ZGUywgU1JPTV9MRURCSDEwLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX0xFREJIMiwgMHgwMDAwMDAwZSwgU1JGTF9OT0ZGUywgU1JPTV9MRURCSDMyLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0xFREJIMywgMHgwMDAwMDAwZSwgU1JGTF9OT0ZGUywgU1JPTV9MRURCSDMyLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX0xFREJIMCwgMHgwMDAwMDAxMCwgU1JGTF9OT0ZGUywgU1JPTTRfTEVEQkgxMCwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9MRURCSDEsIDB4MDAwMDAwMTAsIFNSRkxfTk9GRlMsIFNST000X0xFREJIMTAsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fTEVEQkgyLCAweDAwMDAwMDEwLCBTUkZMX05PRkZTLCBTUk9NNF9MRURCSDMyLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0xFREJIMywgMHgwMDAwMDAxMCwgU1JGTF9OT0ZGUywgU1JPTTRfTEVEQkgzMiwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9MRURCSDAsIDB4MDAwMDAwZTAsIFNSRkxfTk9GRlMsIFNST001X0xFREJIMTAsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fTEVEQkgxLCAweDAwMDAwMGUwLCBTUkZMX05PRkZTLCBTUk9NNV9MRURCSDEwLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX0xFREJIMiwgMHgwMDAwMDBlMCwgU1JGTF9OT0ZGUywgU1JPTTVfTEVEQkgzMiwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9MRURCSDMsIDB4MDAwMDAwZTAsIFNSRkxfTk9GRlMsIFNST001X0xFREJIMzIsIDB4ZmYwMH0sCiAJe0JSQ01TX1NST01fTEVEQkgwLCAweGZmZmZmZjAwLCBTUkZMX05PRkZTLCBTUk9NOF9MRURCSDEwLCAweDAwZmZ9LAogCXtCUkNNU19TUk9NX0xFREJIMSwgMHhmZmZmZmYwMCwgU1JGTF9OT0ZGUywgU1JPTThfTEVEQkgxMCwgMHhmZjAwfSwKIAl7QlJDTVNfU1JPTV9MRURCSDIsIDB4ZmZmZmZmMDAsIFNSRkxfTk9GRlMsIFNST004X0xFREJIMzIsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fTEVEQkgzLCAweGZmZmZmZjAwLCBTUkZMX05PRkZTLCBTUk9NOF9MRURCSDMyLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1BBMEIwLCAweDAwMDAwMDBlLCBTUkZMX1BSSEVYLCBTUk9NX1dMMFBBQjAsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEEwQjEsIDB4MDAwMDAwMGUsIFNSRkxfUFJIRVgsIFNST01fV0wwUEFCMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTBCMiwgMHgwMDAwMDAwZSwgU1JGTF9QUkhFWCwgU1JPTV9XTDBQQUIyLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMElUU1NJVCwgMHgwMDAwMDAwZSwgMCwgU1JPTV9JVFQsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fUEEwTUFYUFdSLCAweDAwMDAwMDBlLCAwLCBTUk9NX1dMMTBNQVhQLCAweDAwZmZ9LAogCXtCUkNNU19TUk9NX1BBMEIwLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9XMF9QQUIwLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX1BBMEIxLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9XMF9QQUIxLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX1BBMEIyLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9XMF9QQUIyLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX1BBMElUU1NJVCwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVzBfSVRUTUFYUCwgMHhmZjAwfSwKIAl7QlJDTVNfU1JPTV9QQTBNQVhQV1IsIDB4ZmZmZmZmMDAsIDAsIFNST004X1cwX0lUVE1BWFAsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fT1BPLCAweDAwMDAwMDBjLCAwLCBTUk9NX09QTywgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9PUE8sIDB4ZmZmZmZmMDAsIDAsIFNST004XzJHX09GRE1QTywgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9BQTJHLCAweDAwMDAwMDBlLCAwLCBTUk9NX0FBQlJFViwgU1JPTV9BQTBfTUFTS30sCi0Je0JSQ01TX1NST01fQUEyRywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfQUEsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fQUEyRywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQUEsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fQUE1RywgMHgwMDAwMDAwZSwgMCwgU1JPTV9BQUJSRVYsIFNST01fQUExX01BU0t9LAotCXtCUkNNU19TUk9NX0FBNUcsIDB4MDAwMDAwZjAsIDAsIFNST000X0FBLCAweGZmMDB9LAogCXtCUkNNU19TUk9NX0FBNUcsIDB4ZmZmZmZmMDAsIDAsIFNST004X0FBLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX0FHMCwgMHgwMDAwMDAwZSwgMCwgU1JPTV9BRzEwLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0FHMSwgMHgwMDAwMDAwZSwgMCwgU1JPTV9BRzEwLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX0FHMCwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfQUcxMCwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9BRzEsIDB4MDAwMDAwZjAsIDAsIFNST000X0FHMTAsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fQUcyLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9BRzMyLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0FHMywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfQUczMiwgMHhmZjAwfSwKIAl7QlJDTVNfU1JPTV9BRzAsIDB4ZmZmZmZmMDAsIDAsIFNST004X0FHMTAsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fQUcxLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9BRzEwLCAweGZmMDB9LAogCXtCUkNNU19TUk9NX0FHMiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfQUczMiwgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9BRzMsIDB4ZmZmZmZmMDAsIDAsIFNST004X0FHMzIsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fUEExQjAsIDB4MDAwMDAwMGUsIFNSRkxfUFJIRVgsIFNST01fV0wxUEFCMCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTFCMSwgMHgwMDAwMDAwZSwgU1JGTF9QUkhFWCwgU1JPTV9XTDFQQUIxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMUIyLCAweDAwMDAwMDBlLCBTUkZMX1BSSEVYLCBTUk9NX1dMMVBBQjIsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEExTE9CMCwgMHgwMDAwMDAwYywgU1JGTF9QUkhFWCwgU1JPTV9XTDFMUEFCMCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTFMT0IxLCAweDAwMDAwMDBjLCBTUkZMX1BSSEVYLCBTUk9NX1dMMUxQQUIxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMUxPQjIsIDB4MDAwMDAwMGMsIFNSRkxfUFJIRVgsIFNST01fV0wxTFBBQjIsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEExSElCMCwgMHgwMDAwMDAwYywgU1JGTF9QUkhFWCwgU1JPTV9XTDFIUEFCMCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTFISUIxLCAweDAwMDAwMDBjLCBTUkZMX1BSSEVYLCBTUk9NX1dMMUhQQUIxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMUhJQjIsIDB4MDAwMDAwMGMsIFNSRkxfUFJIRVgsIFNST01fV0wxSFBBQjIsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEExSVRTU0lULCAweDAwMDAwMDBlLCAwLCBTUk9NX0lUVCwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9QQTFNQVhQV1IsIDB4MDAwMDAwMGUsIDAsIFNST01fV0wxME1BWFAsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fUEExTE9NQVhQV1IsIDB4MDAwMDAwMGMsIDAsIFNST01fV0wxTEhNQVhQLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1BBMUhJTUFYUFdSLCAweDAwMDAwMDBjLCAwLCBTUk9NX1dMMUxITUFYUCwgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9QQTFCMCwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfVzFfUEFCMCwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9QQTFCMSwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfVzFfUEFCMSwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9QQTFCMiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfVzFfUEFCMiwgMHhmZmZmfSwKQEAgLTUzNCw0MCArMzc3LDIwIEBACiAJe0JSQ01TX1NST01fUEExTUFYUFdSLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9XMV9JVFRNQVhQLCAweDAwZmZ9LAogCXtCUkNNU19TUk9NX1BBMUxPTUFYUFdSLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9XMV9NQVhQX0xDSEMsIDB4ZmYwMH0sCiAJe0JSQ01TX1NST01fUEExSElNQVhQV1IsIDB4ZmZmZmZmMDAsIDAsIFNST004X1cxX01BWFBfTENIQywgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9CWEEyRywgMHgwMDAwMDAwOCwgMCwgU1JPTV9CWEFSU1NJMkcsIDB4MTgwMH0sCi0Je0JSQ01TX1NST01fUlNTSVNBVjJHLCAweDAwMDAwMDA4LCAwLCBTUk9NX0JYQVJTU0kyRywgMHgwNzAwfSwKLQl7QlJDTVNfU1JPTV9SU1NJU01DMkcsIDB4MDAwMDAwMDgsIDAsIFNST01fQlhBUlNTSTJHLCAweDAwZjB9LAotCXtCUkNNU19TUk9NX1JTU0lTTUYyRywgMHgwMDAwMDAwOCwgMCwgU1JPTV9CWEFSU1NJMkcsIDB4MDAwZn0sCiAJe0JSQ01TX1NST01fQlhBMkcsIDB4ZmZmZmZmMDAsIDAsIFNST004X0JYQVJTU0kyRywgMHgxODAwfSwKIAl7QlJDTVNfU1JPTV9SU1NJU0FWMkcsIDB4ZmZmZmZmMDAsIDAsIFNST004X0JYQVJTU0kyRywgMHgwNzAwfSwKIAl7QlJDTVNfU1JPTV9SU1NJU01DMkcsIDB4ZmZmZmZmMDAsIDAsIFNST004X0JYQVJTU0kyRywgMHgwMGYwfSwKIAl7QlJDTVNfU1JPTV9SU1NJU01GMkcsIDB4ZmZmZmZmMDAsIDAsIFNST004X0JYQVJTU0kyRywgMHgwMDBmfSwKLQl7QlJDTVNfU1JPTV9CWEE1RywgMHgwMDAwMDAwOCwgMCwgU1JPTV9CWEFSU1NJNUcsIDB4MTgwMH0sCi0Je0JSQ01TX1NST01fUlNTSVNBVjVHLCAweDAwMDAwMDA4LCAwLCBTUk9NX0JYQVJTU0k1RywgMHgwNzAwfSwKLQl7QlJDTVNfU1JPTV9SU1NJU01DNUcsIDB4MDAwMDAwMDgsIDAsIFNST01fQlhBUlNTSTVHLCAweDAwZjB9LAotCXtCUkNNU19TUk9NX1JTU0lTTUY1RywgMHgwMDAwMDAwOCwgMCwgU1JPTV9CWEFSU1NJNUcsIDB4MDAwZn0sCiAJe0JSQ01TX1NST01fQlhBNUcsIDB4ZmZmZmZmMDAsIDAsIFNST004X0JYQVJTU0k1RywgMHgxODAwfSwKIAl7QlJDTVNfU1JPTV9SU1NJU0FWNUcsIDB4ZmZmZmZmMDAsIDAsIFNST004X0JYQVJTU0k1RywgMHgwNzAwfSwKIAl7QlJDTVNfU1JPTV9SU1NJU01DNUcsIDB4ZmZmZmZmMDAsIDAsIFNST004X0JYQVJTU0k1RywgMHgwMGYwfSwKIAl7QlJDTVNfU1JPTV9SU1NJU01GNUcsIDB4ZmZmZmZmMDAsIDAsIFNST004X0JYQVJTU0k1RywgMHgwMDBmfSwKLQl7QlJDTVNfU1JPTV9UUkkyRywgMHgwMDAwMDAwOCwgMCwgU1JPTV9UUkk1MkcsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFJJNUcsIDB4MDAwMDAwMDgsIDAsIFNST01fVFJJNTJHLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1RSSTVHTCwgMHgwMDAwMDAwOCwgMCwgU1JPTV9UUkk1R0hMLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX1RSSTVHSCwgMHgwMDAwMDAwOCwgMCwgU1JPTV9UUkk1R0hMLCAweGZmMDB9LAogCXtCUkNNU19TUk9NX1RSSTJHLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9UUkk1MkcsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fVFJJNUcsIDB4ZmZmZmZmMDAsIDAsIFNST004X1RSSTUyRywgMHhmZjAwfSwKIAl7QlJDTVNfU1JPTV9UUkk1R0wsIDB4ZmZmZmZmMDAsIDAsIFNST004X1RSSTVHSEwsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fVFJJNUdILCAweGZmZmZmZjAwLCAwLCBTUk9NOF9UUkk1R0hMLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1JYUE8yRywgMHgwMDAwMDAwOCwgU1JGTF9QUlNJR04sIFNST01fUlhQTzUyRywgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9SWFBPNUcsIDB4MDAwMDAwMDgsIFNSRkxfUFJTSUdOLCBTUk9NX1JYUE81MkcsIDB4ZmYwMH0sCiAJe0JSQ01TX1NST01fUlhQTzJHLCAweGZmZmZmZjAwLCBTUkZMX1BSU0lHTiwgU1JPTThfUlhQTzUyRywgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9SWFBPNUcsIDB4ZmZmZmZmMDAsIFNSRkxfUFJTSUdOLCBTUk9NOF9SWFBPNTJHLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1RYQ0hBSU4sIDB4MDAwMDAwZjAsIFNSRkxfTk9GRlMsIFNST000X1RYUlhDLAotCSBTUk9NNF9UWENIQUlOX01BU0t9LAotCXtCUkNNU19TUk9NX1JYQ0hBSU4sIDB4MDAwMDAwZjAsIFNSRkxfTk9GRlMsIFNST000X1RYUlhDLAotCSBTUk9NNF9SWENIQUlOX01BU0t9LAotCXtCUkNNU19TUk9NX0FOVFNXSVRDSCwgMHgwMDAwMDBmMCwgU1JGTF9OT0ZGUywgU1JPTTRfVFhSWEMsCi0JIFNST000X1NXSVRDSF9NQVNLfSwKIAl7QlJDTVNfU1JPTV9UWENIQUlOLCAweGZmZmZmZjAwLCBTUkZMX05PRkZTLCBTUk9NOF9UWFJYQywKIAkgU1JPTTRfVFhDSEFJTl9NQVNLfSwKIAl7QlJDTVNfU1JPTV9SWENIQUlOLCAweGZmZmZmZjAwLCBTUkZMX05PRkZTLCBTUk9NOF9UWFJYQywKQEAgLTU5NCw0MyArNDE3LDExIEBACiAJIFNST004X0ZFTV9BTlRTV0xVVF9NQVNLfSwKIAl7QlJDTVNfU1JPTV9URU1QVEhSRVNILCAweGZmZmZmZjAwLCAwLCBTUk9NOF9USEVSTUFMLCAweGZmMDB9LAogCXtCUkNNU19TUk9NX1RFTVBPRkZTRVQsIDB4ZmZmZmZmMDAsIDAsIFNST004X1RIRVJNQUwsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFhQSUQyR0EwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDJHLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX1RYUElEMkdBMSwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQyRywgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDJHQTIsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElEMkcgKyAxLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX1RYUElEMkdBMywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQyRyArIDEsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fVFhQSUQ1R0EwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX1RYUElENUdBMSwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1RywgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDVHQTIsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUcgKyAxLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX1RYUElENUdBMywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1RyArIDEsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fVFhQSUQ1R0xBMCwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1R0wsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFhQSUQ1R0xBMSwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1R0wsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fVFhQSUQ1R0xBMiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1R0wgKyAxLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX1RYUElENUdMQTMsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUdMICsgMSwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDVHSEEwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHSCwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDVHSEExLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHSCwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDVHSEEyLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHSCArIDEsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFhQSUQ1R0hBMywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1R0ggKyAxLCAweGZmMDB9LAogCi0Je0JSQ01TX1NST01fQ0NPREUsIDB4MDAwMDAwMGYsIFNSRkxfQ0NPREUsIFNST01fQ0NPREUsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQ0NPREUsIDB4MDAwMDAwMTAsIFNSRkxfQ0NPREUsIFNST000X0NDT0RFLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NDT0RFLCAweDAwMDAwMGUwLCBTUkZMX0NDT0RFLCBTUk9NNV9DQ09ERSwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9DQ09ERSwgMHhmZmZmZmYwMCwgU1JGTF9DQ09ERSwgU1JPTThfQ0NPREUsIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fTUFDQUREUiwgMHhmZmZmZmYwMCwgU1JGTF9FVEhBRERSLCBTUk9NOF9NQUNISSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQUNBRERSLCAweDAwMDAwMGUwLCBTUkZMX0VUSEFERFIsIFNST001X01BQ0hJLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01BQ0FERFIsIDB4MDAwMDAwMTAsIFNSRkxfRVRIQUREUiwgU1JPTTRfTUFDSEksIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUFDQUREUiwgMHgwMDAwMDAwOCwgU1JGTF9FVEhBRERSLCBTUk9NM19NQUNISSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9JTDBNQUNBRERSLCAweDAwMDAwMDA3LCBTUkZMX0VUSEFERFIsIFNST01fTUFDSElfSUwwLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0VUMU1BQ0FERFIsIDB4MDAwMDAwMDcsIFNSRkxfRVRIQUREUiwgU1JPTV9NQUNISV9FVDEsCi0JIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fTEVEREMsIDB4ZmZmZmZmMDAsIFNSRkxfTk9GRlMgfCBTUkZMX0xFRERDLCBTUk9NOF9MRUREQywKIAkgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9MRUREQywgMHgwMDAwMDBlMCwgU1JGTF9OT0ZGUyB8IFNSRkxfTEVEREMsIFNST001X0xFRERDLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0xFRERDLCAweDAwMDAwMDEwLCBTUkZMX05PRkZTIHwgU1JGTF9MRUREQywgU1JPTTRfTEVEREMsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTEVEREMsIDB4MDAwMDAwMDgsIFNSRkxfTk9GRlMgfCBTUkZMX0xFRERDLCBTUk9NM19MRUREQywKLQkgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9SQVdURU1QU0VOU0UsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X01QV1JfUkFXVFMsCiAJIDB4MDFmZn0sCiAJe0JSQ01TX1NST01fTUVBU1BPV0VSLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9NUFdSX1JBV1RTLApAQCAtNjUwLDE2ICs0NDEsNyBAQAogCXtCUkNNU19TUk9NX1BIWUNBTF9URU1QREVMVEEsIDB4ZmZmZmZmMDAsIDAsIFNST004X1BIWUNBTF9URU1QREVMVEEsCiAJIDB4MDBmZn0sCiAKLQl7QlJDTVNfU1JPTV9DQ0syR1BPLCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19DQ0tQTywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9DQ0syR1BPLCAweDAwMDAwMTAwLCAwLCBTUk9NOF8yR19DQ0tQTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9PRkRNMkdQTywgMHgwMDAwMDBmMCwgU1JGTF9NT1JFLCBTUk9NNF8yR19PRkRNUE8sIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTTRfMkdfT0ZETVBPICsgMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9PRkRNNUdQTywgMHgwMDAwMDBmMCwgU1JGTF9NT1JFLCBTUk9NNF81R19PRkRNUE8sIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTTRfNUdfT0ZETVBPICsgMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9PRkRNNUdMUE8sIDB4MDAwMDAwZjAsIFNSRkxfTU9SRSwgU1JPTTRfNUdMX09GRE1QTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NNF81R0xfT0ZETVBPICsgMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9PRkRNNUdIUE8sIDB4MDAwMDAwZjAsIFNSRkxfTU9SRSwgU1JPTTRfNUdIX09GRE1QTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NNF81R0hfT0ZETVBPICsgMSwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9PRkRNMkdQTywgMHgwMDAwMDEwMCwgU1JGTF9NT1JFLCBTUk9NOF8yR19PRkRNUE8sIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTThfMkdfT0ZETVBPICsgMSwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9PRkRNNUdQTywgMHgwMDAwMDEwMCwgU1JGTF9NT1JFLCBTUk9NOF81R19PRkRNUE8sIDB4ZmZmZn0sCkBAIC02NjgsMzggKzQ1MCw2IEBACiAJe0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTThfNUdMX09GRE1QTyArIDEsIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fT0ZETTVHSFBPLCAweDAwMDAwMTAwLCBTUkZMX01PUkUsIFNST004XzVHSF9PRkRNUE8sIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTThfNUdIX09GRE1QTyArIDEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTMkdQTzAsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX01DU1BPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzJHUE8xLCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19NQ1NQTyArIDEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTMkdQTzIsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX01DU1BPICsgMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1MyR1BPMywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfMkdfTUNTUE8gKyAzLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzJHUE80LCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19NQ1NQTyArIDQsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTMkdQTzUsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX01DU1BPICsgNSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1MyR1BPNiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfMkdfTUNTUE8gKyA2LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzJHUE83LCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19NQ1NQTyArIDcsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdQTzAsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX01DU1BPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHUE8xLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19NQ1NQTyArIDEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdQTzIsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX01DU1BPICsgMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R1BPMywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdfTUNTUE8gKyAzLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHUE80LCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19NQ1NQTyArIDQsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdQTzUsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX01DU1BPICsgNSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R1BPNiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdfTUNTUE8gKyA2LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHUE83LCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19NQ1NQTyArIDcsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdMUE8wLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8sIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdMUE8xLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8gKyAxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHTFBPMiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdMX01DU1BPICsgMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0xQTzMsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHTF9NQ1NQTyArIDMsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdMUE80LCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8gKyA0LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHTFBPNSwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdMX01DU1BPICsgNSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0xQTzYsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHTF9NQ1NQTyArIDYsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdMUE83LCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8gKyA3LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHSFBPMCwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHSFBPMSwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPICsgMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0hQTzIsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHSF9NQ1NQTyArIDIsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdIUE8zLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0hfTUNTUE8gKyAzLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHSFBPNCwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPICsgNCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0hQTzUsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHSF9NQ1NQTyArIDUsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdIUE82LCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0hfTUNTUE8gKyA2LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHSFBPNywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPICsgNywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9NQ1MyR1BPMCwgMHgwMDAwMDEwMCwgMCwgU1JPTThfMkdfTUNTUE8sIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fTUNTMkdQTzEsIDB4MDAwMDAxMDAsIDAsIFNST004XzJHX01DU1BPICsgMSwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9NQ1MyR1BPMiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfMkdfTUNTUE8gKyAyLCAweGZmZmZ9LApAQCAtNzMyLDEwICs0ODIsNiBAQAogCXtCUkNNU19TUk9NX01DUzVHSFBPNSwgMHgwMDAwMDEwMCwgMCwgU1JPTThfNUdIX01DU1BPICsgNSwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9NQ1M1R0hQTzYsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHSF9NQ1NQTyArIDYsIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fTUNTNUdIUE83LCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R0hfTUNTUE8gKyA3LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NERFBPLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9DRERQTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9TVEJDUE8sIDB4MDAwMDAwZjAsIDAsIFNST000X1NUQkNQTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CVzQwUE8sIDB4MDAwMDAwZjAsIDAsIFNST000X0JXNDBQTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CV0RVUFBPLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9CV0RVUFBPLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX0NERFBPLCAweDAwMDAwMTAwLCAwLCBTUk9NOF9DRERQTywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9TVEJDUE8sIDB4MDAwMDAxMDAsIDAsIFNST004X1NUQkNQTywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9CVzQwUE8sIDB4MDAwMDAxMDAsIDAsIFNST004X0JXNDBQTywgMHhmZmZmfSwKQEAgLTgxMSwzNCArNTU3LDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnJjbXNfc3JvbXZhciBwZXJwYXRoX3BjaV9zcm9tdmFyc1tdID0gewotCXtCUkNNU19TUk9NX01BWFAyR0EwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19JVFRfTUFYUCwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9JVFQyR0EwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19JVFRfTUFYUCwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9JVFQ1R0EwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19JVFRfTUFYUCwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9QQTJHVzBBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfMkdfUEEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEEyR1cxQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzJHX1BBICsgMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTJHVzJBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfMkdfUEEgKyAyLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMkdXM0EwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF8yR19QQSArIDMsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUFYUDVHQTAsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX0lUVF9NQVhQLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX01BWFA1R0hBMCwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdMSF9NQVhQLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX01BWFA1R0xBMCwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdMSF9NQVhQLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1BBNUdXMEEwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R19QQSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTVHVzFBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdfUEEgKyAxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBNUdXMkEwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R19QQSArIDIsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEE1R1czQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHX1BBICsgMywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTVHTFcwQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHTF9QQSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTVHTFcxQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHTF9QQSArIDEsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEE1R0xXMkEwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R0xfUEEgKyAyLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBNUdMVzNBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdMX1BBICsgMywKLQkgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTVHSFcwQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHSF9QQSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTVHSFcxQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHSF9QQSArIDEsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEE1R0hXMkEwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R0hfUEEgKyAyLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBNUdIVzNBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdIX1BBICsgMywKLQkgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9NQVhQMkdBMCwgMHhmZmZmZmYwMCwgMCwgU1JPTThfMkdfSVRUX01BWFAsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fSVRUMkdBMCwgMHhmZmZmZmYwMCwgMCwgU1JPTThfMkdfSVRUX01BWFAsIDB4ZmYwMH0sCiAJe0JSQ01TX1NST01fSVRUNUdBMCwgMHhmZmZmZmYwMCwgMCwgU1JPTThfNUdfSVRUX01BWFAsIDB4ZmYwMH0sCkBAIC04NjgsMjQgKzU4NiwxNyBAQAogICogc2hhcmVkIGJldHdlZW4gZGV2aWNlcy4gKi8KIHN0YXRpYyB1OCBicmNtc19zcm9tX2NyYzhfdGFibGVbQ1JDOF9UQUJMRV9TSVpFXTsKIAotc3RhdGljIHUxNiBfX2lvbWVtICoKK3N0YXRpYyB1OCBfX2lvbWVtICoKIHNyb21fd2luZG93X2FkZHJlc3Moc3RydWN0IHNpX3B1YiAqc2loLCB1OCBfX2lvbWVtICpjdXJtYXApCiB7CiAJaWYgKHNpaC0+Y2NyZXYgPCAzMikKLQkJcmV0dXJuICh1MTYgX19pb21lbSAqKShjdXJtYXAgKyBQQ0lfQkFSMF9TUFJPTV9PRkZTRVQpOworCQlyZXR1cm4gY3VybWFwICsgUENJX0JBUjBfU1BST01fT0ZGU0VUOwogCWlmIChzaWgtPmNjY2FwcyAmIENDX0NBUF9TUk9NKQotCQlyZXR1cm4gKHUxNiBfX2lvbWVtICopCi0JCSAgICAgICAoY3VybWFwICsgUENJXzE2S0IwX0NDUkVHU19PRkZTRVQgKyBDQ19TUk9NX09UUCk7CisJCXJldHVybiBjdXJtYXAgKyBQQ0lfMTZLQjBfQ0NSRUdTX09GRlNFVCArIENDX1NST01fT1RQOwogCiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qIFBhcnNlIFNST00gYW5kIGNyZWF0ZSBuYW1lPXZhbHVlIHBhaXJzLiAnc3JvbScgcG9pbnRzIHRvCi0gKiB0aGUgU1JPTSB3b3JkIGFycmF5LiAnb2ZmJyBzcGVjaWZpZXMgdGhlIG9mZnNldCBvZiB0aGUKLSAqIGZpcnN0IHdvcmQgJ3Nyb20nIHBvaW50cyB0bywgd2hpY2ggc2hvdWxkIGJlIGVpdGhlciAwIG9yCi0gKiBTUk9NM19TV1JHX09GRiAoZnVsbCBTUk9NIG9yIHNvZnR3YXJlIHJlZ2lvbikuCi0gKi8KLQogc3RhdGljIHVpbnQgbWFza19zaGlmdCh1MTYgbWFzaykKIHsKIAl1aW50IGk7CkBAIC05MDYsMTggKzYxNywxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbHRvaDE2X2J1Zih1MTYgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCitzdGF0aWMgaW5saW5lIHZvaWQgbGUxNl90b19jcHVfYnVmKHUxNiAqYnVmLCB1aW50IG53b3JkcykKIHsKLQlzaXplIC89IDI7Ci0Jd2hpbGUgKHNpemUtLSkKLQkJKihidWYgKyBzaXplKSA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopKGJ1ZiArIHNpemUpKTsKKwl3aGlsZSAobndvcmRzLS0pCisJCSooYnVmICsgbndvcmRzKSA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopKGJ1ZiArIG53b3JkcykpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaHRvbDE2X2J1Zih1MTYgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3RvX2xlMTZfYnVmKHUxNiAqYnVmLCB1aW50IG53b3JkcykKIHsKLQlzaXplIC89IDI7Ci0Jd2hpbGUgKHNpemUtLSkKLQkJKihfX2xlMTYgKikoYnVmICsgc2l6ZSkgPSBjcHVfdG9fbGUxNigqKGJ1ZiArIHNpemUpKTsKKwl3aGlsZSAobndvcmRzLS0pCisJCSooX19sZTE2ICopKGJ1ZiArIG53b3JkcykgPSBjcHVfdG9fbGUxNigqKGJ1ZiArIG53b3JkcykpOwogfQogCiAvKgpAQCAtOTI5LDExICs2MzgsMTQgQEAKIAlzdHJ1Y3QgYnJjbXNfc3JvbV9saXN0X2hlYWQgKmVudHJ5OwogCWVudW0gYnJjbXNfc3JvbV9pZCBpZDsKIAl1MTYgdzsKLQl1MzIgdmFsOworCXUzMiB2YWwgPSAwOwogCWNvbnN0IHN0cnVjdCBicmNtc19zcm9tdmFyICpzcnY7CiAJdWludCB3aWR0aDsKIAl1aW50IGZsYWdzOwogCXUzMiBzciA9ICgxIDw8IHNyb21yZXYpOworCXVpbnQgcDsKKwl1aW50IHBiID0gIFNST004X1BBVEgwOworCWNvbnN0IHVpbnQgcHN6ID0gU1JPTThfUEFUSDEgLSBTUk9NOF9QQVRIMDsKIAogCS8qIGZpcnN0IHN0b3JlIHRoZSBzcm9tIHJldmlzaW9uICovCiAJZW50cnkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbXNfc3JvbV9saXN0X2hlYWQpLCBHRlBfS0VSTkVMKTsKQEAgLTEwMzEsNDcgKzc0MywzNCBAQAogCQlsaXN0X2FkZCgmZW50cnktPnZhcl9saXN0LCB2YXJfbGlzdCk7CiAJfQogCi0JaWYgKHNyb21yZXYgPj0gNCkgewotCQkvKiBEbyBwZXItcGF0aCB2YXJpYWJsZXMgKi8KLQkJdWludCBwLCBwYiwgcHN6OworCWZvciAocCA9IDA7IHAgPCBNQVhfUEFUSF9TUk9NOyBwKyspIHsKKwkJZm9yIChzcnYgPSBwZXJwYXRoX3BjaV9zcm9tdmFyczsKKwkJICAgICBzcnYtPnZhcmlkICE9IEJSQ01TX1NST01fTlVMTDsgc3J2KyspIHsKKwkJCWlmICgoc3J2LT5yZXZtYXNrICYgc3IpID09IDApCisJCQkJY29udGludWU7CiAKLQkJaWYgKHNyb21yZXYgPj0gOCkgewotCQkJcGIgPSBTUk9NOF9QQVRIMDsKLQkJCXBzeiA9IFNST004X1BBVEgxIC0gU1JPTThfUEFUSDA7Ci0JCX0gZWxzZSB7Ci0JCQlwYiA9IFNST000X1BBVEgwOwotCQkJcHN6ID0gU1JPTTRfUEFUSDEgLSBTUk9NNF9QQVRIMDsKKwkJCWlmIChzcnYtPmZsYWdzICYgU1JGTF9OT1ZBUikKKwkJCQljb250aW51ZTsKKworCQkJdyA9IHNyb21bcGIgKyBzcnYtPm9mZl07CisJCQl2YWwgPSAodyAmIHNydi0+bWFzaykgPj4gbWFza19zaGlmdChzcnYtPm1hc2spOworCQkJd2lkdGggPSBtYXNrX3dpZHRoKHNydi0+bWFzayk7CisKKwkJCS8qIENoZWF0aW5nOiBubyBwZXItcGF0aCB2YXIgaXMgbW9yZSB0aGFuCisJCQkgKiAxIHdvcmQgKi8KKwkJCWlmICgoc3J2LT5mbGFncyAmIFNSRkxfTk9GRlMpCisJCQkgICAgJiYgKChpbnQpdmFsID09ICgxIDw8IHdpZHRoKSAtIDEpKQorCQkJCWNvbnRpbnVlOworCisJCQllbnRyeSA9CisJCQkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21zX3Nyb21fbGlzdF9oZWFkKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQllbnRyeS0+dmFyaWQgPSBzcnYtPnZhcmlkK3A7CisJCQllbnRyeS0+dmFyX3R5cGUgPSBCUkNNU19TUk9NX1VOVU1CRVI7CisJCQllbnRyeS0+dXZhbCA9IHZhbDsKKwkJCWxpc3RfYWRkKCZlbnRyeS0+dmFyX2xpc3QsIHZhcl9saXN0KTsKIAkJfQotCi0JCWZvciAocCA9IDA7IHAgPCBNQVhfUEFUSF9TUk9NOyBwKyspIHsKLQkJCWZvciAoc3J2ID0gcGVycGF0aF9wY2lfc3JvbXZhcnM7Ci0JCQkgICAgIHNydi0+dmFyaWQgIT0gQlJDTVNfU1JPTV9OVUxMOyBzcnYrKykgewotCQkJCWlmICgoc3J2LT5yZXZtYXNrICYgc3IpID09IDApCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKHNydi0+ZmxhZ3MgJiBTUkZMX05PVkFSKQotCQkJCQljb250aW51ZTsKLQotCQkJCXcgPSBzcm9tW3BiICsgc3J2LT5vZmZdOwotCQkJCXZhbCA9ICh3ICYgc3J2LT5tYXNrKSA+PiBtYXNrX3NoaWZ0KHNydi0+bWFzayk7Ci0JCQkJd2lkdGggPSBtYXNrX3dpZHRoKHNydi0+bWFzayk7Ci0KLQkJCQkvKiBDaGVhdGluZzogbm8gcGVyLXBhdGggdmFyIGlzIG1vcmUgdGhhbgotCQkJCSAqIDEgd29yZCAqLwotCQkJCWlmICgoc3J2LT5mbGFncyAmIFNSRkxfTk9GRlMpCi0JCQkJICAgICYmICgoaW50KXZhbCA9PSAoMSA8PCB3aWR0aCkgLSAxKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQllbnRyeSA9Ci0JCQkJICAgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtc19zcm9tX2xpc3RfaGVhZCksCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJCQllbnRyeS0+dmFyaWQgPSBzcnYtPnZhcmlkK3A7Ci0JCQkJZW50cnktPnZhcl90eXBlID0gQlJDTVNfU1JPTV9VTlVNQkVSOwotCQkJCWVudHJ5LT51dmFsID0gdmFsOwotCQkJCWxpc3RfYWRkKCZlbnRyeS0+dmFyX2xpc3QsIHZhcl9saXN0KTsKLQkJCX0KLQkJCXBiICs9IHBzejsKLQkJfQorCQlwYiArPSBwc3o7CiAJfQogfQogCkBAIC0xMDgwLDQxICs3NzksMzggQEAKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQKLXNwcm9tX3JlYWRfcGNpKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTE2IF9faW9tZW0gKnNwcm9tLCB1aW50IHdvcmRvZmYsCitzcHJvbV9yZWFkX3BjaShzdHJ1Y3Qgc2lfcHViICpzaWgsIHU4IF9faW9tZW0gKnNwcm9tLCB1aW50IHdvcmRvZmYsCiAJICAgICAgIHUxNiAqYnVmLCB1aW50IG53b3JkcywgYm9vbCBjaGVja19jcmMpCiB7CiAJaW50IGVyciA9IDA7CiAJdWludCBpOworCXU4ICpiYnVmID0gKHU4ICopYnVmOyAvKiBieXRlIGJ1ZmZlciAqLworCXVpbnQgbmJ5dGVzID0gbndvcmRzIDw8IDE7CiAKLQkvKiByZWFkIHRoZSBzcHJvbSAqLwotCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkrKykKLQkJYnVmW2ldID0gUl9SRUcoJnNwcm9tW3dvcmRvZmYgKyBpXSk7CisJLyogcmVhZCB0aGUgc3Byb20gaW4gYnl0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspCisJCWJidWZbaV0gPSByZWFkYihzcHJvbStpKTsKIAotCWlmIChjaGVja19jcmMpIHsKKwlpZiAoYnVmWzBdID09IDB4ZmZmZikKKwkJLyoKKwkJICogVGhlIGhhcmR3YXJlIHRoaW5rcyB0aGF0IGFuIHNyb20gdGhhdCBzdGFydHMgd2l0aAorCQkgKiAweGZmZmYgaXMgYmxhbmssIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3Qgb2YgdGhlCisJCSAqIGNvbnRlbnQsIHNvIGRlY2xhcmUgaXQgYmFkLgorCQkgKi8KKwkJcmV0dXJuIC1FTk9EQVRBOwogCi0JCWlmIChidWZbMF0gPT0gMHhmZmZmKQotCQkJLyoKLQkJCSAqIFRoZSBoYXJkd2FyZSB0aGlua3MgdGhhdCBhbiBzcm9tIHRoYXQgc3RhcnRzIHdpdGgKLQkJCSAqIDB4ZmZmZiBpcyBibGFuaywgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdCBvZiB0aGUKLQkJCSAqIGNvbnRlbnQsIHNvIGRlY2xhcmUgaXQgYmFkLgotCQkJICovCi0JCQlyZXR1cm4gLUVOT0RBVEE7Ci0KLQkJLyogZml4dXAgdGhlIGVuZGlhbm5lc3Mgc28gY3JjOCB3aWxsIHBhc3MgKi8KLQkJaHRvbDE2X2J1ZihidWYsIG53b3JkcyAqIDIpOwotCQlpZiAoY3JjOChicmNtc19zcm9tX2NyYzhfdGFibGUsICh1OCAqKSBidWYsIG53b3JkcyAqIDIsCi0JCQkgQ1JDOF9JTklUX1ZBTFVFKSAhPQotCQkJIENSQzhfR09PRF9WQUxVRShicmNtc19zcm9tX2NyYzhfdGFibGUpKQotCQkJLyogREJHIG9ubHkgcGNpIGFsd2F5cyByZWFkIHNyb200IGZpcnN0LCB0aGVuIHNyb204LzkgKi8KLQkJCWVyciA9IC1FSU87Ci0KKwlpZiAoY2hlY2tfY3JjICYmCisJICAgIGNyYzgoYnJjbXNfc3JvbV9jcmM4X3RhYmxlLCBiYnVmLCBuYnl0ZXMsIENSQzhfSU5JVF9WQUxVRSkgIT0KKwkJIENSQzhfR09PRF9WQUxVRShicmNtc19zcm9tX2NyYzhfdGFibGUpKQorCQllcnIgPSAtRUlPOworCWVsc2UKIAkJLyogbm93IGNvcnJlY3QgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGJ5dGUgYXJyYXkgKi8KLQkJbHRvaDE2X2J1ZihidWYsIG53b3JkcyAqIDIpOwotCX0KKwkJbGUxNl90b19jcHVfYnVmKGJ1ZiwgbndvcmRzKTsKKwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgb3RwX3JlYWRfcGNpKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTE2ICpidWYsIHVpbnQgYnVmc3opCitzdGF0aWMgaW50IG90cF9yZWFkX3BjaShzdHJ1Y3Qgc2lfcHViICpzaWgsIHUxNiAqYnVmLCB1aW50IG53b3JkcykKIHsKIAl1OCAqb3RwOwogCXVpbnQgc3ogPSBPVFBfU1pfTUFYIC8gMjsJLyogc2l6ZSBpbiB3b3JkcyAqLwpAQCAtMTEyNiw3ICs4MjIsOCBAQAogCiAJZXJyID0gb3RwX3JlYWRfcmVnaW9uKHNpaCwgT1RQX0hXX1JHTiwgKHUxNiAqKSBvdHAsICZzeik7CiAKLQltZW1jcHkoYnVmLCBvdHAsIGJ1ZnN6KTsKKwlzeiA9IG1pbl90KHVpbnQsIHN6LCBud29yZHMpOworCW1lbWNweShidWYsIG90cCwgc3ogKiAyKTsKIAogCWtmcmVlKG90cCk7CiAKQEAgLTExMzksMTMgKzgzNiwxMyBAQAogCQlyZXR1cm4gLUVOT0RBVEE7CiAKIAkvKiBmaXh1cCB0aGUgZW5kaWFubmVzcyBzbyBjcmM4IHdpbGwgcGFzcyAqLwotCWh0b2wxNl9idWYoYnVmLCBidWZzeik7Ci0JaWYgKGNyYzgoYnJjbXNfc3JvbV9jcmM4X3RhYmxlLCAodTggKikgYnVmLCBTUk9NNF9XT1JEUyAqIDIsCisJY3B1X3RvX2xlMTZfYnVmKGJ1Ziwgc3opOworCWlmIChjcmM4KGJyY21zX3Nyb21fY3JjOF90YWJsZSwgKHU4ICopIGJ1Ziwgc3ogKiAyLAogCQkgQ1JDOF9JTklUX1ZBTFVFKSAhPSBDUkM4X0dPT0RfVkFMVUUoYnJjbXNfc3JvbV9jcmM4X3RhYmxlKSkKIAkJZXJyID0gLUVJTzsKLQotCS8qIG5vdyBjb3JyZWN0IHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBieXRlIGFycmF5ICovCi0JbHRvaDE2X2J1ZihidWYsIGJ1ZnN6KTsKKwllbHNlCisJCS8qIG5vdyBjb3JyZWN0IHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBieXRlIGFycmF5ICovCisJCWxlMTZfdG9fY3B1X2J1ZihidWYsIHN6KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0xMTU3LDcgKzg1NCw3IEBACiBzdGF0aWMgaW50IGluaXR2YXJzX3Nyb21fcGNpKHN0cnVjdCBzaV9wdWIgKnNpaCwgdm9pZCBfX2lvbWVtICpjdXJtYXApCiB7CiAJdTE2ICpzcm9tOwotCXUxNiBfX2lvbWVtICpzcm9td2luZG93OworCXU4IF9faW9tZW0gKnNyb213aW5kb3c7CiAJdTggc3JvbXJldiA9IDA7CiAJdTMyIHNyOwogCWludCBlcnIgPSAwOwpAQCAtMTE3MywyOSArODcwLDE2IEBACiAKIAljcmM4X3BvcHVsYXRlX2xzYihicmNtc19zcm9tX2NyYzhfdGFibGUsIFNST01fQ1JDOF9QT0xZKTsKIAlpZiAoYWlfaXNfc3Byb21fYXZhaWxhYmxlKHNpaCkpIHsKLQkJZXJyID0gc3Byb21fcmVhZF9wY2koc2loLCBzcm9td2luZG93LCAwLCBzcm9tLCBTUk9NX1dPUkRTLAotCQkJCSAgICAgdHJ1ZSk7CisJCWVyciA9IHNwcm9tX3JlYWRfcGNpKHNpaCwgc3JvbXdpbmRvdywgMCwgc3JvbSwKKwkJCQkgICAgIFNST000X1dPUkRTLCB0cnVlKTsKIAotCQlpZiAoKHNyb21bU1JPTTRfU0lHTl0gPT0gU1JPTTRfU0lHTkFUVVJFKSB8fAotCQkgICAgKCgoc2loLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpCi0JCSAgICAgICYmIChzaWgtPmJ1c2NvcmVyZXYgPj0gNikpCi0JCSAgICAgfHwgKChzaWgtPmJ1c2NvcmV0eXBlID09IFBDSV9DT1JFX0lEKQotCQkJICYmIChzaWgtPmJ1c2NvcmVyZXYgPj0gMHhlKSkpKSB7Ci0JCQkvKiBzcm9tcmV2ID49IDQsIHJlYWQgbW9yZSAqLwotCQkJZXJyID0gc3Byb21fcmVhZF9wY2koc2loLCBzcm9td2luZG93LCAwLCBzcm9tLAotCQkJCQkgICAgIFNST000X1dPUkRTLCB0cnVlKTsKLQkJCXNyb21yZXYgPSBzcm9tW1NST000X0NSQ1JFVl0gJiAweGZmOwotCQl9IGVsc2UgaWYgKGVyciA9PSAwKSB7Ci0JCQkvKiBzcm9tIGlzIGdvb2QgYW5kIGlzIHJldiA8IDQgKi8KKwkJaWYgKGVyciA9PSAwKQorCQkJLyogc3JvbSByZWFkIGFuZCBwYXNzZWQgY3JjICovCiAJCQkvKiB0b3Agd29yZCBvZiBzcHJvbSBjb250YWlucyB2ZXJzaW9uIGFuZCBjcmM4ICovCi0JCQlzcm9tcmV2ID0gc3JvbVtTUk9NX0NSQ1JFVl0gJiAweGZmOwotCQkJLyogYmNtNDQwMSBzcm9tcyBtaXNwcm9ncmFtbWVkICovCi0JCQlpZiAoc3JvbXJldiA9PSAweDEwKQotCQkJCXNyb21yZXYgPSAxOwotCQl9CisJCQlzcm9tcmV2ID0gc3JvbVtTUk9NNF9DUkNSRVZdICYgMHhmZjsKIAl9IGVsc2UgewogCQkvKiBVc2UgT1RQIGlmIFNQUk9NIG5vdCBhdmFpbGFibGUgKi8KLQkJZXJyID0gb3RwX3JlYWRfcGNpKHNpaCwgc3JvbSwgU1JPTV9NQVgpOworCQllcnIgPSBvdHBfcmVhZF9wY2koc2loLCBzcm9tLCBTUk9NNF9XT1JEUyk7CiAJCWlmIChlcnIgPT0gMCkKIAkJCS8qIE9UUCBvbmx5IGNvbnRhaW4gU1JPTSByZXY4L3JldjkgZm9yIG5vdyAqLwogCQkJc3JvbXJldiA9IHNyb21bU1JPTTRfQ1JDUkVWXSAmIDB4ZmY7CkBAIC0xMjA4LDEwICs4OTIsOSBAQAogCQlzciA9IDEgPDwgc3JvbXJldjsKIAogCQkvKgotCQkgKiBzcm9tIHZlcnNpb24gY2hlY2s6IEN1cnJlbnQgdmFsaWQgdmVyc2lvbnM6IDEsIDIsIDMsIDQsIDUsIDgsCi0JCSAqIDkKKwkJICogc3JvbSB2ZXJzaW9uIGNoZWNrOiBDdXJyZW50IHZhbGlkIHZlcnNpb25zOiA4LCA5CiAJCSAqLwotCQlpZiAoKHNyICYgMHgzM2UpID09IDApIHsKKwkJaWYgKChzciAmIDB4MzAwKSA9PSAwKSB7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5oCmluZGV4IDcwOGM0M2YuLmM4MWRmOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3Nyb20uaApAQCAtMjYsOSArMjYsNCBAQAogZXh0ZXJuIGludCBzcm9tX3JlYWQoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGJ1cywgdm9pZCAqY3VybWFwLAogCQkgICAgIHVpbnQgYnl0ZW9mZiwgdWludCBuYnl0ZXMsIHUxNiAqYnVmLCBib29sIGNoZWNrX2NyYyk7CiAKLS8qIHBhcnNlIHN0YW5kYXJkIFBDTUNJQSBjaXMsIG5vcm1hbGx5IHVzZWQgYnkgU0IvUENNQ0lBL1NESU8vU1BJL09UUAotICogICBhbmQgZXh0cmFjdCBmcm9tIGl0IGludG8gbmFtZT12YWx1ZSBwYWlycwotICovCi1leHRlcm4gaW50IHNyb21fcGFyc2VjaXModTggKipwY2lzLCB1aW50IGNpc2NudCwKLQkJCSBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogI2VuZGlmCQkJCS8qIF9CUkNNX1NST01fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtdXRpbC91dGlscy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY211dGlsL3V0aWxzLmMKaW5kZXggZjI3YzQ4OS4uYjc1MzdmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY211dGlsL3V0aWxzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY211dGlsL3V0aWxzLmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSA8YnJjbXVfdXRpbHMuaD4KIAogTU9EVUxFX0FVVEhPUigiQnJvYWRjb20gQ29ycG9yYXRpb24iKTsKQEAgLTQwLDc0ICs0MSwyMCBAQAogLyogRnJlZSB0aGUgZHJpdmVyIHBhY2tldC4gRnJlZSB0aGUgdGFnIGlmIHByZXNlbnQgKi8KIHZvaWQgYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBza19idWZmICpuc2tiOwotCWludCBuZXN0ID0gMDsKLQotCS8qIHBlcnZlcnNpb246IHdlIHVzZSBza2ItPm5leHQgdG8gY2hhaW4gbXVsdGktc2tiIHBhY2tldHMgKi8KLQl3aGlsZSAoc2tiKSB7Ci0JCW5za2IgPSBza2ItPm5leHQ7Ci0JCXNrYi0+bmV4dCA9IE5VTEw7Ci0KLQkJaWYgKHNrYi0+ZGVzdHJ1Y3RvcikKLQkJCS8qIGNhbm5vdCBrZnJlZV9za2IoKSBvbiBoYXJkIElSUSAobmV0L2NvcmUvc2tidWZmLmMpIGlmCi0JCQkgKiBkZXN0cnVjdG9yIGV4aXN0cwotCQkJICovCi0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQllbHNlCi0JCQkvKiBjYW4gZnJlZSBpbW1lZGlhdGVseSAoZXZlbiBpbl9pcnEoKSkgaWYgZGVzdHJ1Y3RvcgotCQkJICogZG9lcyBub3QgZXhpc3QKLQkJCSAqLwotCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCi0JCW5lc3QrKzsKLQkJc2tiID0gbnNrYjsKLQl9CisJV0FSTl9PTihza2ItPm5leHQpOworCWlmIChza2ItPmRlc3RydWN0b3IpCisJCS8qIGNhbm5vdCBrZnJlZV9za2IoKSBvbiBoYXJkIElSUSAobmV0L2NvcmUvc2tidWZmLmMpIGlmCisJCSAqIGRlc3RydWN0b3IgZXhpc3RzCisJCSAqLworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWVsc2UKKwkJLyogY2FuIGZyZWUgaW1tZWRpYXRlbHkgKGV2ZW4gaW5faXJxKCkpIGlmIGRlc3RydWN0b3IKKwkJICogZG9lcyBub3QgZXhpc3QKKwkJICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKIH0KIEVYUE9SVF9TWU1CT0woYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYik7CiAKLQotLyogY29weSBhIGJ1ZmZlciBpbnRvIGEgcGt0IGJ1ZmZlciBjaGFpbiAqLwotdWludCBicmNtdV9wa3Rmcm9tYnVmKHN0cnVjdCBza19idWZmICpwLCB1aW50IG9mZnNldCwgaW50IGxlbiwKLQkJdW5zaWduZWQgY2hhciAqYnVmKQotewotCXVpbnQgbiwgcmV0ID0gMDsKLQotCS8qIHNraXAgJ29mZnNldCcgYnl0ZXMgKi8KLQlmb3IgKDsgcCAmJiBvZmZzZXQ7IHAgPSBwLT5uZXh0KSB7Ci0JCWlmIChvZmZzZXQgPCAodWludCkgKHAtPmxlbikpCi0JCQlicmVhazsKLQkJb2Zmc2V0IC09IHAtPmxlbjsKLQl9Ci0KLQlpZiAoIXApCi0JCXJldHVybiAwOwotCi0JLyogY29weSB0aGUgZGF0YSAqLwotCWZvciAoOyBwICYmIGxlbjsgcCA9IHAtPm5leHQpIHsKLQkJbiA9IG1pbigodWludCkgKHAtPmxlbikgLSBvZmZzZXQsICh1aW50KSBsZW4pOwotCQltZW1jcHkocC0+ZGF0YSArIG9mZnNldCwgYnVmLCBuKTsKLQkJYnVmICs9IG47Ci0JCWxlbiAtPSBuOwotCQlyZXQgKz0gbjsKLQkJb2Zmc2V0ID0gMDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChicmNtdV9wa3Rmcm9tYnVmKTsKLQotLyogcmV0dXJuIHRvdGFsIGxlbmd0aCBvZiBidWZmZXIgY2hhaW4gKi8KLXVpbnQgYnJjbXVfcGt0dG90bGVuKHN0cnVjdCBza19idWZmICpwKQotewotCXVpbnQgdG90YWw7Ci0KLQl0b3RhbCA9IDA7Ci0JZm9yICg7IHA7IHAgPSBwLT5uZXh0KQotCQl0b3RhbCArPSBwLT5sZW47Ci0JcmV0dXJuIHRvdGFsOwotfQotRVhQT1JUX1NZTUJPTChicmNtdV9wa3R0b3RsZW4pOwotCiAvKgogICogb3NsIG11bHRpcGxlLXByZWNlZGVuY2UgcGFja2V0IHF1ZXVlCiAgKiBoaV9wcmVjIGlzIGFsd2F5cyA+PSB0aGUgbnVtYmVyIG9mIHRoZSBoaWdoZXN0IG5vbi1lbXB0eSBwcmVjZWRlbmNlCkBAIC0xMTUsMjEgKzYyLDEzIEBACiBzdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZW5xKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnApCiB7Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxOwogCiAJaWYgKHBrdHFfZnVsbChwcSkgfHwgcGt0cV9wZnVsbChwcSwgcHJlYykpCiAJCXJldHVybiBOVUxMOwogCi0JcSA9ICZwcS0+cVtwcmVjXTsKLQotCWlmIChxLT5oZWFkKQotCQlxLT50YWlsLT5wcmV2ID0gcDsKLQllbHNlCi0JCXEtPmhlYWQgPSBwOwotCi0JcS0+dGFpbCA9IHA7Ci0JcS0+bGVuKys7Ci0KKwlxID0gJnBxLT5xW3ByZWNdLnNrYmxpc3Q7CisJc2tiX3F1ZXVlX3RhaWwocSwgcCk7CiAJcHEtPmxlbisrOwogCiAJaWYgKHBxLT5oaV9wcmVjIDwgcHJlYykKQEAgLTE0MiwyMCArODEsMTMgQEAKIHN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX3BlbnFfaGVhZChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAogCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKLQlzdHJ1Y3QgcGt0cV9wcmVjICpxOworCXN0cnVjdCBza19idWZmX2hlYWQgKnE7CiAKIAlpZiAocGt0cV9mdWxsKHBxKSB8fCBwa3RxX3BmdWxsKHBxLCBwcmVjKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxID0gJnBxLT5xW3ByZWNdOwotCi0JaWYgKHEtPmhlYWQgPT0gTlVMTCkKLQkJcS0+dGFpbCA9IHA7Ci0KLQlwLT5wcmV2ID0gcS0+aGVhZDsKLQlxLT5oZWFkID0gcDsKLQlxLT5sZW4rKzsKLQorCXEgPSAmcHEtPnFbcHJlY10uc2tibGlzdDsKKwlza2JfcXVldWVfaGVhZChxLCBwKTsKIAlwcS0+bGVuKys7CiAKIAlpZiAocHEtPmhpX3ByZWMgPCBwcmVjKQpAQCAtMTY3LDUzICs5OSwzMCBAQAogCiBzdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxOwogCXN0cnVjdCBza19idWZmICpwOwogCi0JcSA9ICZwcS0+cVtwcmVjXTsKLQotCXAgPSBxLT5oZWFkOworCXEgPSAmcHEtPnFbcHJlY10uc2tibGlzdDsKKwlwID0gc2tiX2RlcXVldWUocSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxLT5oZWFkID0gcC0+cHJldjsKLQlpZiAocS0+aGVhZCA9PSBOVUxMKQotCQlxLT50YWlsID0gTlVMTDsKLQotCXEtPmxlbi0tOwotCiAJcHEtPmxlbi0tOwotCi0JcC0+cHJldiA9IE5VTEw7Ci0KIAlyZXR1cm4gcDsKIH0KIEVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9wZGVxKTsKIAogc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdHFfcGRlcV90YWlsKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcCwgKnByZXY7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAotCXEgPSAmcHEtPnFbcHJlY107Ci0KLQlwID0gcS0+aGVhZDsKKwlxID0gJnBxLT5xW3ByZWNdLnNrYmxpc3Q7CisJcCA9IHNrYl9kZXF1ZXVlX3RhaWwocSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlmb3IgKHByZXYgPSBOVUxMOyBwICE9IHEtPnRhaWw7IHAgPSBwLT5wcmV2KQotCQlwcmV2ID0gcDsKLQotCWlmIChwcmV2KQotCQlwcmV2LT5wcmV2ID0gTlVMTDsKLQllbHNlCi0JCXEtPmhlYWQgPSBOVUxMOwotCi0JcS0+dGFpbCA9IHByZXY7Ci0JcS0+bGVuLS07Ci0KIAlwcS0+bGVuLS07Ci0KIAlyZXR1cm4gcDsKIH0KIEVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9wZGVxX3RhaWwpOwpAQCAtMjIyLDMxICsxMzEsMTcgQEAKIGJyY211X3BrdHFfcGZsdXNoKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsIGJvb2wgZGlyLAogCQkgIGJvb2wgKCpmbikoc3RydWN0IHNrX2J1ZmYgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnAsICpwcmV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxOworCXN0cnVjdCBza19idWZmICpwLCAqbmV4dDsKIAotCXEgPSAmcHEtPnFbcHJlY107Ci0JcCA9IHEtPmhlYWQ7Ci0Jd2hpbGUgKHApIHsKKwlxID0gJnBxLT5xW3ByZWNdLnNrYmxpc3Q7CisJc2tiX3F1ZXVlX3dhbGtfc2FmZShxLCBwLCBuZXh0KSB7CiAJCWlmIChmbiA9PSBOVUxMIHx8ICgqZm4pIChwLCBhcmcpKSB7Ci0JCQlib29sIGhlYWQgPSAocCA9PSBxLT5oZWFkKTsKLQkJCWlmIChoZWFkKQotCQkJCXEtPmhlYWQgPSBwLT5wcmV2OwotCQkJZWxzZQotCQkJCXByZXYtPnByZXYgPSBwLT5wcmV2OwotCQkJcC0+cHJldiA9IE5VTEw7CisJCQlza2JfdW5saW5rKHAsIHEpOwogCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwKTsKLQkJCXEtPmxlbi0tOwogCQkJcHEtPmxlbi0tOwotCQkJcCA9IChoZWFkID8gcS0+aGVhZCA6IHByZXYtPnByZXYpOwotCQl9IGVsc2UgewotCQkJcHJldiA9IHA7Ci0JCQlwID0gcC0+cHJldjsKIAkJfQogCX0KLQotCWlmIChxLT5oZWFkID09IE5VTEwpCi0JCXEtPnRhaWwgPSBOVUxMOwogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wa3RxX3BmbHVzaCk7CiAKQEAgLTI3MSw4ICsxNjYsMTAgQEAKIAogCXBxLT5tYXggPSAodTE2KSBtYXhfbGVuOwogCi0JZm9yIChwcmVjID0gMDsgcHJlYyA8IG51bV9wcmVjOyBwcmVjKyspCisJZm9yIChwcmVjID0gMDsgcHJlYyA8IG51bV9wcmVjOyBwcmVjKyspIHsKIAkJcHEtPnFbcHJlY10ubWF4ID0gcHEtPm1heDsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHEtPnFbcHJlY10uc2tibGlzdCk7CisJfQogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wa3RxX2luaXQpOwogCkBAIC0yODQsMTMgKzE4MSwxMyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWZvciAocHJlYyA9IDA7IHByZWMgPCBwcS0+aGlfcHJlYzsgcHJlYysrKQotCQlpZiAocHEtPnFbcHJlY10uaGVhZCkKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnBxLT5xW3ByZWNdLnNrYmxpc3QpKQogCQkJYnJlYWs7CiAKIAlpZiAocHJlY19vdXQpCiAJCSpwcmVjX291dCA9IHByZWM7CiAKLQlyZXR1cm4gcHEtPnFbcHJlY10udGFpbDsKKwlyZXR1cm4gc2tiX3BlZWtfdGFpbCgmcHEtPnFbcHJlY10uc2tibGlzdCk7CiB9CiBFWFBPUlRfU1lNQk9MKGJyY211X3BrdHFfcGVla190YWlsKTsKIApAQCAtMzAzLDcgKzIwMCw3IEBACiAKIAlmb3IgKHByZWMgPSAwOyBwcmVjIDw9IHBxLT5oaV9wcmVjOyBwcmVjKyspCiAJCWlmIChwcmVjX2JtcCAmICgxIDw8IHByZWMpKQotCQkJbGVuICs9IHBxLT5xW3ByZWNdLmxlbjsKKwkJCWxlbiArPSBwcS0+cVtwcmVjXS5za2JsaXN0LnFsZW47CiAKIAlyZXR1cm4gbGVuOwogfQpAQCAtMzEzLDM5ICsyMTAsMzIgQEAKIHN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX21kZXEoc3RydWN0IHBrdHEgKnBxLCB1aW50IHByZWNfYm1wLAogCQkJCSAgICAgIGludCAqcHJlY19vdXQpCiB7Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxOwogCXN0cnVjdCBza19idWZmICpwOwogCWludCBwcmVjOwogCiAJaWYgKHBxLT5sZW4gPT0gMCkKIAkJcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoKHByZWMgPSBwcS0+aGlfcHJlYykgPiAwICYmIHBxLT5xW3ByZWNdLmhlYWQgPT0gTlVMTCkKKwl3aGlsZSAoKHByZWMgPSBwcS0+aGlfcHJlYykgPiAwICYmCisJICAgICAgIHNrYl9xdWV1ZV9lbXB0eSgmcHEtPnFbcHJlY10uc2tibGlzdCkpCiAJCXBxLT5oaV9wcmVjLS07CiAKLQl3aGlsZSAoKHByZWNfYm1wICYgKDEgPDwgcHJlYykpID09IDAgfHwgcHEtPnFbcHJlY10uaGVhZCA9PSBOVUxMKQorCXdoaWxlICgocHJlY19ibXAgJiAoMSA8PCBwcmVjKSkgPT0gMCB8fAorCSAgICAgICBza2JfcXVldWVfZW1wdHkoJnBxLT5xW3ByZWNdLnNrYmxpc3QpKQogCQlpZiAocHJlYy0tID09IDApCiAJCQlyZXR1cm4gTlVMTDsKIAotCXEgPSAmcHEtPnFbcHJlY107Ci0KLQlwID0gcS0+aGVhZDsKKwlxID0gJnBxLT5xW3ByZWNdLnNrYmxpc3Q7CisJcCA9IHNrYl9kZXF1ZXVlKHEpOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JcS0+aGVhZCA9IHAtPnByZXY7Ci0JaWYgKHEtPmhlYWQgPT0gTlVMTCkKLQkJcS0+dGFpbCA9IE5VTEw7Ci0KLQlxLT5sZW4tLTsKKwlwcS0+bGVuLS07CiAKIAlpZiAocHJlY19vdXQpCiAJCSpwcmVjX291dCA9IHByZWM7CiAKLQlwcS0+bGVuLS07Ci0KLQlwLT5wcmV2ID0gTlVMTDsKLQogCXJldHVybiBwOwogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wa3RxX21kZXEpOwpAQCAtMzY0LDIzICsyNTQsMyBAQAogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wcnBrdCk7CiAjZW5kaWYJCQkJLyogZGVmaW5lZChCQ01EQkcpICovCi0KLSNpZiBkZWZpbmVkKEJDTURCRykKLS8qCi0gKiBwcmludCBieXRlcyBmb3JtYXR0ZWQgYXMgaGV4IHRvIGEgc3RyaW5nLiByZXR1cm4gdGhlIHJlc3VsdGluZwotICogc3RyaW5nIGxlbmd0aAotICovCi1pbnQgYnJjbXVfZm9ybWF0X2hleChjaGFyICpzdHIsIGNvbnN0IHZvaWQgKmJ5dGVzLCBpbnQgbGVuKQotewotCWludCBpOwotCWNoYXIgKnAgPSBzdHI7Ci0JY29uc3QgdTggKnNyYyA9IChjb25zdCB1OCAqKWJ5dGVzOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCXAgKz0gc25wcmludGYocCwgMywgIiUwMlgiLCAqc3JjKTsKLQkJc3JjKys7Ci0JfQotCXJldHVybiAoaW50KShwIC0gc3RyKTsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfZm9ybWF0X2hleCk7Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChCQ01EQkcpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV91dGlscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvYnJjbXVfdXRpbHMuaAppbmRleCA3ZDBmNDZlLi5hZDI0OWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV91dGlscy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2JyY211X3V0aWxzLmgKQEAgLTY1LDkgKzY1LDcgQEAKICNkZWZpbmUgRVRIRVJfQUREUl9TVFJfTEVOCTE4CiAKIHN0cnVjdCBwa3RxX3ByZWMgewotCXN0cnVjdCBza19idWZmICpoZWFkOwkvKiBmaXJzdCBwYWNrZXQgdG8gZGVxdWV1ZSAqLwotCXN0cnVjdCBza19idWZmICp0YWlsOwkvKiBsYXN0IHBhY2tldCB0byBkZXF1ZXVlICovCi0JdTE2IGxlbjsJCS8qIG51bWJlciBvZiBxdWV1ZWQgcGFja2V0cyAqLworCXN0cnVjdCBza19idWZmX2hlYWQgc2tibGlzdDsKIAl1MTYgbWF4OwkJLyogbWF4aW11bSBudW1iZXIgb2YgcXVldWVkIHBhY2tldHMgKi8KIH07CiAKQEAgLTg4LDMyICs4NiwzMiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBwa3RxX3BsZW4oc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKIHsKLQlyZXR1cm4gcHEtPnFbcHJlY10ubGVuOworCXJldHVybiBwcS0+cVtwcmVjXS5za2JsaXN0LnFsZW47CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBrdHFfcGF2YWlsKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0JcmV0dXJuIHBxLT5xW3ByZWNdLm1heCAtIHBxLT5xW3ByZWNdLmxlbjsKKwlyZXR1cm4gcHEtPnFbcHJlY10ubWF4IC0gcHEtPnFbcHJlY10uc2tibGlzdC5xbGVuOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgcGt0cV9wZnVsbChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQogewotCXJldHVybiBwcS0+cVtwcmVjXS5sZW4gPj0gcHEtPnFbcHJlY10ubWF4OworCXJldHVybiBwcS0+cVtwcmVjXS5za2JsaXN0LnFsZW4gPj0gcHEtPnFbcHJlY10ubWF4OwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgcGt0cV9wZW1wdHkoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKIHsKLQlyZXR1cm4gcHEtPnFbcHJlY10ubGVuID09IDA7CisJcmV0dXJuIHNrYl9xdWV1ZV9lbXB0eSgmcHEtPnFbcHJlY10uc2tibGlzdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnBrdHFfcHBlZWsoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKIHsKLQlyZXR1cm4gcHEtPnFbcHJlY10uaGVhZDsKKwlyZXR1cm4gc2tiX3BlZWsoJnBxLT5xW3ByZWNdLnNrYmxpc3QpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpwa3RxX3BwZWVrX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKIHsKLQlyZXR1cm4gcHEtPnFbcHJlY10udGFpbDsKKwlyZXR1cm4gc2tiX3BlZWtfdGFpbCgmcHEtPnFbcHJlY10uc2tibGlzdCk7CiB9CiAKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZW5xKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCkBAIC0xNzIsMjQgKzE3MCwxNiBAQAogCQlib29sICgqZm4pKHN0cnVjdCBza19idWZmICosIHZvaWQgKiksIHZvaWQgKmFyZyk7CiAKIC8qIGV4dGVybnMgKi8KLS8qIHBhY2tldCAqLwotZXh0ZXJuIHVpbnQgYnJjbXVfcGt0ZnJvbWJ1ZihzdHJ1Y3Qgc2tfYnVmZiAqcCwKLQl1aW50IG9mZnNldCwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqYnVmKTsKLWV4dGVybiB1aW50IGJyY211X3BrdHRvdGxlbihzdHJ1Y3Qgc2tfYnVmZiAqcCk7Ci0KIC8qIGlwIGFkZHJlc3MgKi8KIHN0cnVjdCBpcHY0X2FkZHI7CiAKKworLyogZXh0ZXJucyAqLworLyogZm9ybWF0L3ByaW50ICovCiAjaWZkZWYgQkNNREJHCiBleHRlcm4gdm9pZCBicmNtdV9wcnBrdChjb25zdCBjaGFyICptc2csIHN0cnVjdCBza19idWZmICpwMCk7CiAjZWxzZQogI2RlZmluZSBicmNtdV9wcnBrdChhLCBiKQogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCi0vKiBleHRlcm5zICovCi0vKiBmb3JtYXQvcHJpbnQgKi8KLSNpZiBkZWZpbmVkKEJDTURCRykKLWV4dGVybiBpbnQgYnJjbXVfZm9ybWF0X2hleChjaGFyICpzdHIsIGNvbnN0IHZvaWQgKmJ5dGVzLCBpbnQgbGVuKTsKLSNlbmRpZgotCiAjZW5kaWYJCQkJLyogX0JSQ01VX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9kZWZzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9kZWZzLmgKaW5kZXggMWU1ZjMxMC4uZjBkOGMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvZGVmcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2RlZnMuaApAQCAtNjIsNyArNjIsNiBAQAogCiAjZGVmaW5lIFdMX1JBRElPX1NXX0RJU0FCTEUJCSgxPDwwKQogI2RlZmluZSBXTF9SQURJT19IV19ESVNBQkxFCQkoMTw8MSkKLSNkZWZpbmUgV0xfUkFESU9fTVBDX0RJU0FCTEUJCSgxPDwyKQogLyogc29tZSBjb3VudHJpZXMgZG9uJ3Qgc3VwcG9ydCBhbnkgY2hhbm5lbCAqLwogI2RlZmluZSBXTF9SQURJT19DT1VOVFJZX0RJU0FCTEUJKDE8PDMpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL3NvYy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvc29jLmgKaW5kZXggNGZjYjk1Ni4uNGU5YjdlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvc29jLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvc29jLmgKQEAgLTc3LDggKzc3LDkgQEAKICNkZWZpbmUJRE1FTVNfQ09SRV9JRAkJMHg4MzUJLyogU0RSL0REUjEgbWVtb3J5IGNvbnRyb2xsZXIgY29yZSAqLwogI2RlZmluZQlERUZfU0hJTV9DT01QCQkweDgzNwkvKiBTSElNIGNvbXBvbmVudCBpbiB1YnVzLzYzNjIgKi8KICNkZWZpbmUgT09CX1JPVVRFUl9DT1JFX0lECTB4MzY3CS8qIE9PQiByb3V0ZXIgY29yZSBJRCAqLwotLyogRGVmYXVsdCBjb21wb25lbnQsIGluIGFpIGNoaXBzIGl0IG1hcHMgYWxsIHVudXNlZCBhZGRyZXNzIHJhbmdlcyAqLwotI2RlZmluZQlERUZfQUlfQ09NUAkJMHhmZmYKKyNkZWZpbmUJREVGX0FJX0NPTVAJCTB4ZmZmCS8qIERlZmF1bHQgY29tcG9uZW50LCBpbiBhaSBjaGlwcyBpdAorCQkJCQkgKiBtYXBzIGFsbCB1bnVzZWQgYWRkcmVzcyByYW5nZXMKKwkJCQkJICovCiAKIC8qIENvbW1vbiBjb3JlIGNvbnRyb2wgZmxhZ3MgKi8KICNkZWZpbmUJU0lDRl9CSVNUX0VOCQkweDgwMDAKQEAgLTg3LDQgKzg4LDExIEBACiAjZGVmaW5lCVNJQ0ZfRkdDCQkweDAwMDIKICNkZWZpbmUJU0lDRl9DTE9DS19FTgkJMHgwMDAxCiAKKy8qIENvbW1vbiBjb3JlIHN0YXR1cyBmbGFncyAqLworI2RlZmluZQlTSVNGX0JJU1RfRE9ORQkJMHg4MDAwCisjZGVmaW5lCVNJU0ZfQklTVF9FUlJPUgkJMHg0MDAwCisjZGVmaW5lCVNJU0ZfR0FURURfQ0xLCQkweDIwMDAKKyNkZWZpbmUJU0lTRl9ETUE2NAkJMHgxMDAwCisjZGVmaW5lCVNJU0ZfQ09SRV9CSVRTCQkweDBmZmYKKwogI2VuZGlmCQkJCS8qIF9CUkNNX1NPQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMKaW5kZXggZTBiM2U4ZC4uZGY3MDUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfcnguYwpAQCAtMSw1ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbGliODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV90eC5jCmluZGV4IGMzNGEzYjcuLjM0NGE5ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3R4LmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiaG9zdGFwXzgwMjExLmgiCiAjaW5jbHVkZSAiaG9zdGFwX2NvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jCmluZGV4IDNkMDVkYzEuLmUxZjQxMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAogI2luY2x1ZGUgImhvc3RhcF93bGFuLmgiCiAjaW5jbHVkZSAiaG9zdGFwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKaW5kZXggNTQ0MWFkMS4uODllOWQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYwpAQCAtNjU2LDYgKzY1Niw5IEBACiAJCSJBZGR0cm9uIiwgIkFXUC0xMDAgV2lyZWxlc3MgUENNQ0lBIiwgIlZlcnNpb24gMDEuMDIiLAogCQkweGU2ZWM1MmNlLCAweDA4NjQ5YWYyLCAweDRiNzRiYWEwKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoCisJCSJDYW5vbiIsICJXaXJlbGVzcyBMQU4gQ0YgQ2FyZCBLMzAyMjUiLCAiVmVyc2lvbiAwMS4wMCIsCisJCTB4OTZlZjZmZTIsIDB4MjYzZmNiYWIsIDB4YTU3YWRiOGMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKIAkJIkQiLCAiTGluayBEV0wtNjUwIDExTWJwcyBXTEFOIENhcmQiLCAiVmVyc2lvbiAwMS4wMiIsCiAJCTB4NzFiMTg1ODksIDB4YjZmMWIwYWIsIDB4NGI3NGJhYTApLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW5mby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKaW5kZXggZDczNzA5MS4uNDc5MzJiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKQEAgLTMsNiArMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaG9zdGFwX3dsYW4uaCIKICNpbmNsdWRlICJob3N0YXAuaCIKICNpbmNsdWRlICJob3N0YXBfYXAuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW9jdGwuYwppbmRleCAxMmRlNDY0Li4xODA1NGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pb2N0bC5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9saWI4MDIxMS5oPgogCiAjaW5jbHVkZSAiaG9zdGFwX3dsYW4uaCIKQEAgLTM4NzEsOCArMzg3Miw4IEBACiAJaWZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCWxvY2FsID0gaWZhY2UtPmxvY2FsOwogCi0Jc3RybmNweShpbmZvLT5kcml2ZXIsICJob3N0YXAiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDEpOwotCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSAtIDEsCisJc3RybGNweShpbmZvLT5kcml2ZXIsICJob3N0YXAiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLAogCQkgIiVkLiVkLiVkIiwgKGxvY2FsLT5zdGFfZndfdmVyID4+IDE2KSAmIDB4ZmYsCiAJCSAobG9jYWwtPnN0YV9md192ZXIgPj4gOCkgJiAweGZmLAogCQkgbG9jYWwtPnN0YV9md192ZXIgJiAweGZmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcHJvYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wcm9jLmMKaW5kZXggMDA1ZmYyNS4uNzVlZjhmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wcm9jLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wcm9jLmMKQEAgLTIsNiArMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbGliODAyMTEuaD4KIAogI2luY2x1ZGUgImhvc3RhcF93bGFuLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jCmluZGV4IDEyN2U5YzYuLmEwZTVjMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jCkBAIC01OTgxLDggKzU5ODEsOCBAQAogCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBsaWJpcHdfcHJpdihkZXYpOwogCWNoYXIgZndfdmVyWzY0XSwgdWNvZGVfdmVyWzY0XTsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CiAKIAlpcHcyMTAwX2dldF9md3ZlcnNpb24ocHJpdiwgZndfdmVyLCBzaXplb2YoZndfdmVyKSk7CiAJaXB3MjEwMF9nZXRfdWNvZGV2ZXJzaW9uKHByaXYsIHVjb2RlX3Zlciwgc2l6ZW9mKHVjb2RlX3ZlcikpOwpAQCAtNTk5MCw3ICs1OTkwLDggQEAKIAlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIlczolZDolcyIsCiAJCSBmd192ZXIsIHByaXYtPmVlcHJvbV92ZXJzaW9uLCB1Y29kZV92ZXIpOwogCi0Jc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwcml2LT5wY2lfZGV2KSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocHJpdi0+cGNpX2RldiksCisJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgdTMyIGlwdzIxMDBfZXRodG9vbF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYwppbmRleCA5OWE3MTBkLi4wMThhOGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYwpAQCAtMTMxLDYgKzEzMSwxNCBAQAogI2RlZmluZSBpcHcyMjAwX2JnX3JhdGVzCShpcHcyMjAwX3JhdGVzICsgMCkKICNkZWZpbmUgaXB3MjIwMF9udW1fYmdfcmF0ZXMJMTIKIAorLyogVWdseSBtYWNybyB0byBjb252ZXJ0IGxpdGVyYWwgY2hhbm5lbCBudW1iZXJzIGludG8gdGhlaXIgbWh6IGVxdWl2YWxlbnRzCisgKiBUaGVyZSBhcmUgY2VydGlhbmx5IHNvbWUgY29uZGl0aW9ucyB0aGF0IHdpbGwgYnJlYWsgdGhpcyAobGlrZSBmZWVkaW5nIGl0ICczMCcpCisgKiBidXQgdGhleSBzaG91bGRuJ3QgYXJpc2Ugc2luY2Ugbm90aGluZyB0YWxrcyBvbiBjaGFubmVsIDMwLiAqLworI2RlZmluZSBpZWVlODAyMTFjaGFuMm1oeih4KSBcCisJKCgoeCkgPD0gMTQpID8gXAorCSgoKHgpID09IDE0KSA/IDI0ODQgOiAoKHgpICogNSkgKyAyNDA3KSA6IFwKKwkoKHgpICsgMTAwMCkgKiA1KQorCiAjaWZkZWYgQ09ORklHX0lQVzIyMDBfUU9TCiBzdGF0aWMgaW50IHFvc19lbmFibGUgPSAwOwogc3RhdGljIGludCBxb3NfYnVyc3RfZW5hYmxlID0gMDsKQEAgLTEwNTQwLDggKzEwNTQ4LDggQEAKIAljaGFyIGRhdGVbMzJdOwogCXUzMiBsZW47CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwogCiAJbGVuID0gc2l6ZW9mKHZlcnMpOwogCWlwd19nZXRfb3JkaW5hbChwLCBJUFdfT1JEX1NUQVRfRldfVkVSU0lPTiwgdmVycywgJmxlbik7CkBAIC0xMDU1MCw3ICsxMDU1OCw4IEBACiAKIAlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIlcyAoJXMpIiwKIAkJIHZlcnMsIGRhdGUpOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocC0+cGNpX2RldikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHAtPnBjaV9kZXYpLAorCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIAlpbmZvLT5lZWR1bXBfbGVuID0gSVBXX0VFUFJPTV9JTUFHRV9TSVpFOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwdy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHcuaAppbmRleCA3MGY1NTg2Li4zZDU4MjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwdy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3LmgKQEAgLTY2LDE2ICs2Niw4IEBACiBkbyB7IGlmIChsaWJpcHdfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSBcCiAgIHByaW50ayhLRVJOX0RFQlVHICJsaWJpcHc6ICVjICVzICIgZm10LCBcCiAgICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKLXN0YXRpYyBpbmxpbmUgYm9vbCBsaWJpcHdfcmF0ZWxpbWl0X2RlYnVnKHUzMiBsZXZlbCkKLXsKLQlyZXR1cm4gKGxpYmlwd19kZWJ1Z19sZXZlbCAmIGxldmVsKSAmJiBuZXRfcmF0ZWxpbWl0KCk7Ci19CiAjZWxzZQogI2RlZmluZSBMSUJJUFdfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCi1zdGF0aWMgaW5saW5lIGJvb2wgbGliaXB3X3JhdGVsaW1pdF9kZWJ1Zyh1MzIgbGV2ZWwpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQogI2VuZGlmCQkJCS8qIENPTkZJR19MSUJJUFdfREVCVUcgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUtZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUtZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTFhMTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS1kZWJ1Zy5jCkBAIC0wLDAgKzEsNTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiMzk0NS5oIgorCitzdGF0aWMgaW50CitpbDM5NDVfc3RhdHNfZmxhZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnN6KQoreworCWludCBwID0gMDsKKworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlN0YXRpc3RpY3MgRmxhZygweCVYKTpcbiIsCisJCSAgICAgICBsZTMyX3RvX2NwdShpbC0+XzM5NDUuc3RhdHMuZmxhZykpOworCWlmIChsZTMyX3RvX2NwdShpbC0+XzM5NDUuc3RhdHMuZmxhZykgJiBVQ09ERV9TVEFUU19DTEVBUl9NU0spCisJCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwKKwkJCSAgICAgICAiXHRTdGF0aXN0aWNzIGhhdmUgYmVlbiBjbGVhcmVkXG4iKTsKKwlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsICJcdE9wZXJhdGlvbmFsIEZyZXF1ZW5jeTogJXNcbiIsCisJCSAgICAgICAobGUzMl90b19jcHUoaWwtPl8zOTQ1LnN0YXRzLmZsYWcpICYKKwkJCVVDT0RFX1NUQVRTX0ZSRVFVRU5DWV9NU0spID8gIjIuNCBHSHoiIDogIjUuMiBHSHoiKTsKKwlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsICJcdFRHaiBOYXJyb3cgQmFuZDogJXNcbiIsCisJCSAgICAgICAobGUzMl90b19jcHUoaWwtPl8zOTQ1LnN0YXRzLmZsYWcpICYKKwkJCVVDT0RFX1NUQVRTX05BUlJPV19CQU5EX01TSykgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlyZXR1cm4gcDsKK30KKworc3NpemVfdAoraWwzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0KKwkgICAgc2l6ZW9mKHN0cnVjdCBpd2wzOV9zdGF0c19yeF9waHkpICogNDAgKworCSAgICBzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRzX3J4X25vbl9waHkpICogNDAgKyA0MDA7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGl3bDM5X3N0YXRzX3J4X3BoeSAqb2ZkbSwgKmFjY3VtX29mZG0sICpkZWx0YV9vZmRtLCAqbWF4X29mZG07CisJc3RydWN0IGl3bDM5X3N0YXRzX3J4X3BoeSAqY2NrLCAqYWNjdW1fY2NrLCAqZGVsdGFfY2NrLCAqbWF4X2NjazsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfbm9uX3BoeSAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7CisJc3RydWN0IGl3bDM5X3N0YXRzX3J4X25vbl9waHkgKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIFRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCisJICogdGhlIGxhc3Qgc3RhdHMgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKKwkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQorCSAqLworCW9mZG0gPSAmaWwtPl8zOTQ1LnN0YXRzLnJ4Lm9mZG07CisJY2NrID0gJmlsLT5fMzk0NS5zdGF0cy5yeC5jY2s7CisJZ2VuZXJhbCA9ICZpbC0+XzM5NDUuc3RhdHMucnguZ2VuZXJhbDsKKwlhY2N1bV9vZmRtID0gJmlsLT5fMzk0NS5hY2N1bV9zdGF0cy5yeC5vZmRtOworCWFjY3VtX2NjayA9ICZpbC0+XzM5NDUuYWNjdW1fc3RhdHMucnguY2NrOworCWFjY3VtX2dlbmVyYWwgPSAmaWwtPl8zOTQ1LmFjY3VtX3N0YXRzLnJ4LmdlbmVyYWw7CisJZGVsdGFfb2ZkbSA9ICZpbC0+XzM5NDUuZGVsdGFfc3RhdHMucngub2ZkbTsKKwlkZWx0YV9jY2sgPSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzLnJ4LmNjazsKKwlkZWx0YV9nZW5lcmFsID0gJmlsLT5fMzk0NS5kZWx0YV9zdGF0cy5yeC5nZW5lcmFsOworCW1heF9vZmRtID0gJmlsLT5fMzk0NS5tYXhfZGVsdGEucngub2ZkbTsKKwltYXhfY2NrID0gJmlsLT5fMzk0NS5tYXhfZGVsdGEucnguY2NrOworCW1heF9nZW5lcmFsID0gJmlsLT5fMzk0NS5tYXhfZGVsdGEucnguZ2VuZXJhbDsKKworCXBvcyArPSBpbDM5NDVfc3RhdHNfZmxhZyhpbCwgYnVmLCBidWZzeik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiJS0zMnMgICAgIGN1cnJlbnQiCisJCSAgICAgICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKKwkJICAgICAgIlN0YXRpc3RpY3NfUnggLSBPRkRNOiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImluYV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+aW5hX2NudCksIGFjY3VtX29mZG0tPmluYV9jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPmluYV9jbnQsIG1heF9vZmRtLT5pbmFfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJmaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5maW5hX2NudCksIGFjY3VtX29mZG0tPmZpbmFfY250LAorCQkgICAgICBkZWx0YV9vZmRtLT5maW5hX2NudCwgbWF4X29mZG0tPmZpbmFfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJwbGNwX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2VyciksIGFjY3VtX29mZG0tPnBsY3BfZXJyLAorCQkgICAgICBkZWx0YV9vZmRtLT5wbGNwX2VyciwgbWF4X29mZG0tPnBsY3BfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJjcmMzMl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+Y3JjMzJfZXJyKSwgYWNjdW1fb2ZkbS0+Y3JjMzJfZXJyLAorCQkgICAgICBkZWx0YV9vZmRtLT5jcmMzMl9lcnIsIG1heF9vZmRtLT5jcmMzMl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgIm92ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPm92ZXJydW5fZXJyKSwgYWNjdW1fb2ZkbS0+b3ZlcnJ1bl9lcnIsCisJCSAgICAgIGRlbHRhX29mZG0tPm92ZXJydW5fZXJyLCBtYXhfb2ZkbS0+b3ZlcnJ1bl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImVhcmx5X292ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmVhcmx5X292ZXJydW5fZXJyKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIsCisJCSAgICAgIGRlbHRhX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAorCQkgICAgICBtYXhfb2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImNyYzMyX2dvb2Q6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+Y3JjMzJfZ29vZCksIGFjY3VtX29mZG0tPmNyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX29mZG0tPmNyYzMyX2dvb2QsIG1heF9vZmRtLT5jcmMzMl9nb29kKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJmYWxzZV9hbGFybV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+ZmFsc2VfYWxhcm1fY250KSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+ZmFsc2VfYWxhcm1fY250LCBkZWx0YV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsCisJCSAgICAgIG1heF9vZmRtLT5mYWxzZV9hbGFybV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZpbmFfc3luY19lcnJfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfc3luY19lcnJfY250KSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPmZpbmFfc3luY19lcnJfY250LAorCQkgICAgICBtYXhfb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInNmZF90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnNmZF90aW1lb3V0KSwgYWNjdW1fb2ZkbS0+c2ZkX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX29mZG0tPnNmZF90aW1lb3V0LCBtYXhfb2ZkbS0+c2ZkX3RpbWVvdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZpbmFfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5maW5hX3RpbWVvdXQpLCBhY2N1bV9vZmRtLT5maW5hX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX29mZG0tPmZpbmFfdGltZW91dCwgbWF4X29mZG0tPmZpbmFfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAidW5yZXNwb25kZWRfcnRzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnVucmVzcG9uZGVkX3J0cyksCisJCSAgICAgIGFjY3VtX29mZG0tPnVucmVzcG9uZGVkX3J0cywgZGVsdGFfb2ZkbS0+dW5yZXNwb25kZWRfcnRzLAorCQkgICAgICBtYXhfb2ZkbS0+dW5yZXNwb25kZWRfcnRzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCisJCSAgICAgICJyeGVfZnJhbWVfbG10X292cnVuOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIGRlbHRhX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAorCQkgICAgICBtYXhfb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInNlbnRfYWNrX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5zZW50X2Fja19jbnQpLCBhY2N1bV9vZmRtLT5zZW50X2Fja19jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPnNlbnRfYWNrX2NudCwgbWF4X29mZG0tPnNlbnRfYWNrX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2VudF9jdHNfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfY3RzX2NudCksIGFjY3VtX29mZG0tPnNlbnRfY3RzX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+c2VudF9jdHNfY250LCBtYXhfb2ZkbS0+c2VudF9jdHNfY250KTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiUtMzJzICAgICBjdXJyZW50IgorCQkgICAgICAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCisJCSAgICAgICJTdGF0aXN0aWNzX1J4IC0gQ0NLOiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImluYV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5pbmFfY250KSwgYWNjdW1fY2NrLT5pbmFfY250LAorCQkgICAgICBkZWx0YV9jY2stPmluYV9jbnQsIG1heF9jY2stPmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZpbmFfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZmluYV9jbnQpLCBhY2N1bV9jY2stPmZpbmFfY250LAorCQkgICAgICBkZWx0YV9jY2stPmZpbmFfY250LCBtYXhfY2NrLT5maW5hX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAicGxjcF9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5wbGNwX2VyciksIGFjY3VtX2Njay0+cGxjcF9lcnIsCisJCSAgICAgIGRlbHRhX2Njay0+cGxjcF9lcnIsIG1heF9jY2stPnBsY3BfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJjcmMzMl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5jcmMzMl9lcnIpLCBhY2N1bV9jY2stPmNyYzMyX2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5jcmMzMl9lcnIsIG1heF9jY2stPmNyYzMyX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAib3ZlcnJ1bl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5vdmVycnVuX2VyciksIGFjY3VtX2Njay0+b3ZlcnJ1bl9lcnIsCisJCSAgICAgIGRlbHRhX2Njay0+b3ZlcnJ1bl9lcnIsIG1heF9jY2stPm92ZXJydW5fZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJlYXJseV9vdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmVhcmx5X292ZXJydW5fZXJyKSwKKwkJICAgICAgYWNjdW1fY2NrLT5lYXJseV9vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5lYXJseV9vdmVycnVuX2VyciwgbWF4X2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImNyYzMyX2dvb2Q6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5jcmMzMl9nb29kKSwgYWNjdW1fY2NrLT5jcmMzMl9nb29kLAorCQkgICAgICBkZWx0YV9jY2stPmNyYzMyX2dvb2QsIG1heF9jY2stPmNyYzMyX2dvb2QpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZhbHNlX2FsYXJtX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmZhbHNlX2FsYXJtX2NudCksCisJCSAgICAgIGFjY3VtX2Njay0+ZmFsc2VfYWxhcm1fY250LCBkZWx0YV9jY2stPmZhbHNlX2FsYXJtX2NudCwKKwkJICAgICAgbWF4X2Njay0+ZmFsc2VfYWxhcm1fY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJmaW5hX3N5bmNfZXJyX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmZpbmFfc3luY19lcnJfY250KSwKKwkJICAgICAgYWNjdW1fY2NrLT5maW5hX3N5bmNfZXJyX2NudCwKKwkJICAgICAgZGVsdGFfY2NrLT5maW5hX3N5bmNfZXJyX2NudCwgbWF4X2Njay0+ZmluYV9zeW5jX2Vycl9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInNmZF90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+c2ZkX3RpbWVvdXQpLCBhY2N1bV9jY2stPnNmZF90aW1lb3V0LAorCQkgICAgICBkZWx0YV9jY2stPnNmZF90aW1lb3V0LCBtYXhfY2NrLT5zZmRfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmluYV90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZmluYV90aW1lb3V0KSwgYWNjdW1fY2NrLT5maW5hX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX2Njay0+ZmluYV90aW1lb3V0LCBtYXhfY2NrLT5maW5hX3RpbWVvdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInVucmVzcG9uZGVkX3J0czoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnVucmVzcG9uZGVkX3J0cyksCisJCSAgICAgIGFjY3VtX2Njay0+dW5yZXNwb25kZWRfcnRzLCBkZWx0YV9jY2stPnVucmVzcG9uZGVkX3J0cywKKwkJICAgICAgbWF4X2Njay0+dW5yZXNwb25kZWRfcnRzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCisJCSAgICAgICJyeGVfZnJhbWVfbG10X292cnVuOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAorCQkgICAgICBhY2N1bV9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAorCQkgICAgICBkZWx0YV9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAorCQkgICAgICBtYXhfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2VudF9hY2tfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+c2VudF9hY2tfY250KSwgYWNjdW1fY2NrLT5zZW50X2Fja19jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+c2VudF9hY2tfY250LCBtYXhfY2NrLT5zZW50X2Fja19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInNlbnRfY3RzX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnNlbnRfY3RzX2NudCksIGFjY3VtX2Njay0+c2VudF9jdHNfY250LAorCQkgICAgICBkZWx0YV9jY2stPnNlbnRfY3RzX2NudCwgbWF4X2Njay0+c2VudF9jdHNfY250KTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiUtMzJzICAgICBjdXJyZW50IgorCQkgICAgICAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCisJCSAgICAgICJTdGF0aXN0aWNzX1J4IC0gR0VORVJBTDoiKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJib2d1c19jdHM6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+Ym9ndXNfY3RzKSwgYWNjdW1fZ2VuZXJhbC0+Ym9ndXNfY3RzLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ib2d1c19jdHMsIG1heF9nZW5lcmFsLT5ib2d1c19jdHMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImJvZ3VzX2FjazoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19hY2spLCBhY2N1bV9nZW5lcmFsLT5ib2d1c19hY2ssCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJvZ3VzX2FjaywgbWF4X2dlbmVyYWwtPmJvZ3VzX2Fjayk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAibm9uX2Jzc2lkX2ZyYW1lczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcywKKwkJICAgICAgbWF4X2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZpbHRlcmVkX2ZyYW1lczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcywKKwkJICAgICAgbWF4X2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAorCQkgICAgICAibm9uX2NoYW5uZWxfYmVhY29uczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucywKKwkJICAgICAgbWF4X2dlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90CitpbDM5NDVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPSAoc2l6ZW9mKHN0cnVjdCBpd2wzOV9zdGF0c190eCkgKiA0OCkgKyAyNTA7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGl3bDM5X3N0YXRzX3R4ICp0eCwgKmFjY3VtX3R4LCAqZGVsdGFfdHgsICptYXhfdHg7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBUaGUgc3RhdGlzdGljIGluZm9ybWF0aW9uIGRpc3BsYXkgaGVyZSBpcyBiYXNlZCBvbgorCSAqIHRoZSBsYXN0IHN0YXRzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCisJICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKKwkgKi8KKwl0eCA9ICZpbC0+XzM5NDUuc3RhdHMudHg7CisJYWNjdW1fdHggPSAmaWwtPl8zOTQ1LmFjY3VtX3N0YXRzLnR4OworCWRlbHRhX3R4ID0gJmlsLT5fMzk0NS5kZWx0YV9zdGF0cy50eDsKKwltYXhfdHggPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS50eDsKKwlwb3MgKz0gaWwzOTQ1X3N0YXRzX2ZsYWcoaWwsIGJ1ZiwgYnVmc3opOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiUtMzJzICAgICBjdXJyZW50IgorCQkgICAgICAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCisJCSAgICAgICJTdGF0aXN0aWNzX1R4OiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInByZWFtYmxlOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5wcmVhbWJsZV9jbnQpLCBhY2N1bV90eC0+cHJlYW1ibGVfY250LAorCQkgICAgICBkZWx0YV90eC0+cHJlYW1ibGVfY250LCBtYXhfdHgtPnByZWFtYmxlX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAicnhfZGV0ZWN0ZWRfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5yeF9kZXRlY3RlZF9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+cnhfZGV0ZWN0ZWRfY250LCBkZWx0YV90eC0+cnhfZGV0ZWN0ZWRfY250LAorCQkgICAgICBtYXhfdHgtPnJ4X2RldGVjdGVkX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYnRfcHJpb19kZWZlcl9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fZGVmZXJfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPmJ0X3ByaW9fZGVmZXJfY250LCBkZWx0YV90eC0+YnRfcHJpb19kZWZlcl9jbnQsCisJCSAgICAgIG1heF90eC0+YnRfcHJpb19kZWZlcl9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImJ0X3ByaW9fa2lsbF9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fa2lsbF9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+YnRfcHJpb19raWxsX2NudCwgZGVsdGFfdHgtPmJ0X3ByaW9fa2lsbF9jbnQsCisJCSAgICAgIG1heF90eC0+YnRfcHJpb19raWxsX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmV3X2J5dGVzX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+ZmV3X2J5dGVzX2NudCksIGFjY3VtX3R4LT5mZXdfYnl0ZXNfY250LAorCQkgICAgICBkZWx0YV90eC0+ZmV3X2J5dGVzX2NudCwgbWF4X3R4LT5mZXdfYnl0ZXNfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJjdHNfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+Y3RzX3RpbWVvdXQpLCBhY2N1bV90eC0+Y3RzX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX3R4LT5jdHNfdGltZW91dCwgbWF4X3R4LT5jdHNfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYWNrX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFja190aW1lb3V0KSwgYWNjdW1fdHgtPmFja190aW1lb3V0LAorCQkgICAgICBkZWx0YV90eC0+YWNrX3RpbWVvdXQsIG1heF90eC0+YWNrX3RpbWVvdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImV4cGVjdGVkX2Fja19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmV4cGVjdGVkX2Fja19jbnQpLAorCQkgICAgICBhY2N1bV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwgZGVsdGFfdHgtPmV4cGVjdGVkX2Fja19jbnQsCisJCSAgICAgIG1heF90eC0+ZXhwZWN0ZWRfYWNrX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYWN0dWFsX2Fja19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFjdHVhbF9hY2tfY250KSwgYWNjdW1fdHgtPmFjdHVhbF9hY2tfY250LAorCQkgICAgICBkZWx0YV90eC0+YWN0dWFsX2Fja19jbnQsIG1heF90eC0+YWN0dWFsX2Fja19jbnQpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90CitpbDM5NDVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRzX2dlbmVyYWwpICogMTAgKyAzMDA7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGl3bDM5X3N0YXRzX2dlbmVyYWwgKmdlbmVyYWwsICphY2N1bV9nZW5lcmFsOworCXN0cnVjdCBpd2wzOV9zdGF0c19nZW5lcmFsICpkZWx0YV9nZW5lcmFsLCAqbWF4X2dlbmVyYWw7CisJc3RydWN0IHN0YXRzX2RiZyAqZGJnLCAqYWNjdW1fZGJnLCAqZGVsdGFfZGJnLCAqbWF4X2RiZzsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfZGl2ICpkaXYsICphY2N1bV9kaXYsICpkZWx0YV9kaXYsICptYXhfZGl2OworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogVGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KKwkgKiB0aGUgbGFzdCBzdGF0cyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQorCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5CisJICovCisJZ2VuZXJhbCA9ICZpbC0+XzM5NDUuc3RhdHMuZ2VuZXJhbDsKKwlkYmcgPSAmaWwtPl8zOTQ1LnN0YXRzLmdlbmVyYWwuZGJnOworCWRpdiA9ICZpbC0+XzM5NDUuc3RhdHMuZ2VuZXJhbC5kaXY7CisJYWNjdW1fZ2VuZXJhbCA9ICZpbC0+XzM5NDUuYWNjdW1fc3RhdHMuZ2VuZXJhbDsKKwlkZWx0YV9nZW5lcmFsID0gJmlsLT5fMzk0NS5kZWx0YV9zdGF0cy5nZW5lcmFsOworCW1heF9nZW5lcmFsID0gJmlsLT5fMzk0NS5tYXhfZGVsdGEuZ2VuZXJhbDsKKwlhY2N1bV9kYmcgPSAmaWwtPl8zOTQ1LmFjY3VtX3N0YXRzLmdlbmVyYWwuZGJnOworCWRlbHRhX2RiZyA9ICZpbC0+XzM5NDUuZGVsdGFfc3RhdHMuZ2VuZXJhbC5kYmc7CisJbWF4X2RiZyA9ICZpbC0+XzM5NDUubWF4X2RlbHRhLmdlbmVyYWwuZGJnOworCWFjY3VtX2RpdiA9ICZpbC0+XzM5NDUuYWNjdW1fc3RhdHMuZ2VuZXJhbC5kaXY7CisJZGVsdGFfZGl2ID0gJmlsLT5fMzk0NS5kZWx0YV9zdGF0cy5nZW5lcmFsLmRpdjsKKwltYXhfZGl2ID0gJmlsLT5fMzk0NS5tYXhfZGVsdGEuZ2VuZXJhbC5kaXY7CisJcG9zICs9IGlsMzk0NV9zdGF0c19mbGFnKGlsLCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIlLTMycyAgICAgY3VycmVudCIKKwkJICAgICAgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAorCQkgICAgICAiU3RhdGlzdGljc19HZW5lcmFsOiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImJ1cnN0X2NoZWNrOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRiZy0+YnVyc3RfY2hlY2spLCBhY2N1bV9kYmctPmJ1cnN0X2NoZWNrLAorCQkgICAgICBkZWx0YV9kYmctPmJ1cnN0X2NoZWNrLCBtYXhfZGJnLT5idXJzdF9jaGVjayk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYnVyc3RfY291bnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGJnLT5idXJzdF9jb3VudCksIGFjY3VtX2RiZy0+YnVyc3RfY291bnQsCisJCSAgICAgIGRlbHRhX2RiZy0+YnVyc3RfY291bnQsIG1heF9kYmctPmJ1cnN0X2NvdW50KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJzbGVlcF90aW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsZWVwX3RpbWUpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5zbGVlcF90aW1lLCBkZWx0YV9nZW5lcmFsLT5zbGVlcF90aW1lLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+c2xlZXBfdGltZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2xvdHNfb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsb3RzX291dCksIGFjY3VtX2dlbmVyYWwtPnNsb3RzX291dCwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfb3V0LCBtYXhfZ2VuZXJhbC0+c2xvdHNfb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJzbG90c19pZGxlOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsb3RzX2lkbGUpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5zbG90c19pZGxlLCBkZWx0YV9nZW5lcmFsLT5zbG90c19pZGxlLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+c2xvdHNfaWRsZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAidHRsX3RpbWVzdGFtcDpcdFx0XHQldVxuIiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+dHRsX3RpbWVzdGFtcCkpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInR4X29uX2E6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGl2LT50eF9vbl9hKSwgYWNjdW1fZGl2LT50eF9vbl9hLAorCQkgICAgICBkZWx0YV9kaXYtPnR4X29uX2EsIG1heF9kaXYtPnR4X29uX2EpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInR4X29uX2I6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGl2LT50eF9vbl9iKSwgYWNjdW1fZGl2LT50eF9vbl9iLAorCQkgICAgICBkZWx0YV9kaXYtPnR4X29uX2IsIG1heF9kaXYtPnR4X29uX2IpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImV4ZWNfdGltZToiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPmV4ZWNfdGltZSksIGFjY3VtX2Rpdi0+ZXhlY190aW1lLAorCQkgICAgICBkZWx0YV9kaXYtPmV4ZWNfdGltZSwgbWF4X2Rpdi0+ZXhlY190aW1lKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJwcm9iZV90aW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRpdi0+cHJvYmVfdGltZSksIGFjY3VtX2Rpdi0+cHJvYmVfdGltZSwKKwkJICAgICAgZGVsdGFfZGl2LT5wcm9iZV90aW1lLCBtYXhfZGl2LT5wcm9iZV90aW1lKTsKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LW1hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS1tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWVmNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS1tYWMuYwpAQCAtMCwwICsxLDM5NzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAorICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJpd2wzOTQ1IgorCisjaW5jbHVkZSAiY29tbWFuZHMuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICIzOTQ1LmgiCisjaW5jbHVkZSAiaXdsLXNwZWN0cnVtLmgiCisKKy8qCisgKiBtb2R1bGUgbmFtZSwgY29weXJpZ2h0LCB2ZXJzaW9uLCBldGMuCisgKi8KKworI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JXAorIkludGVsKFIpIFBSTy9XaXJlbGVzcyAzOTQ1QUJHL0JHIE5ldHdvcmsgQ29ubmVjdGlvbiBkcml2ZXIgZm9yIExpbnV4IgorCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisjZGVmaW5lIFZEICJkIgorI2Vsc2UKKyNkZWZpbmUgVkQKKyNlbmRpZgorCisvKgorICogYWRkICJzIiB0byBpbmRpY2F0ZSBzcGVjdHJ1bSBtZWFzdXJlbWVudCBpbmNsdWRlZC4KKyAqIHdlIGFkZCBpdCBoZXJlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBwcmV2aW91cyByZWxlYXNlcyBpbiB3aGljaAorICogdGhpcyB3YXMgY29uZmlndXJhYmxlLgorICovCisjZGVmaW5lIERSVl9WRVJTSU9OICBJV0xXSUZJX1ZFUlNJT04gVkQgInMiCisjZGVmaW5lIERSVl9DT1BZUklHSFQJIkNvcHlyaWdodChjKSAyMDAzLTIwMTEgSW50ZWwgQ29ycG9yYXRpb24iCisjZGVmaW5lIERSVl9BVVRIT1IgICAgICI8aWx3QGxpbnV4LmludGVsLmNvbT4iCisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04pOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUihEUlZfQ09QWVJJR0hUICIgIiBEUlZfQVVUSE9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworIC8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgaWxfbW9kX3BhcmFtcyBpbDM5NDVfbW9kX3BhcmFtcyA9IHsKKwkuc3dfY3J5cHRvID0gMSwKKwkucmVzdGFydF9mdyA9IDEsCisJLmRpc2FibGVfaHdfc2NhbiA9IDEsCisJLyogdGhlIHJlc3QgYXJlIDAgYnkgZGVmYXVsdCAqLworfTsKKworLyoqCisgKiBpbDM5NDVfZ2V0X2FudGVubmFfZmxhZ3MgLSBHZXQgYW50ZW5uYSBmbGFncyBmb3IgUlhPTiBjb21tYW5kCisgKiBAaWw6IGVlcHJvbSBhbmQgYW50ZW5uYSBmaWVsZHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGFudGVubmEgZmxhZ3MKKyAqCisgKiBpbC0+ZWVwcm9tMzkgIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFudGVubmEgQVVYL01BSU4gYXJlIHJldmVyc2VkCisgKiBpbDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hIHNwZWNpZmllcyB0aGUgYW50ZW5uYSBkaXZlcnNpdHkgbW9kZToKKyAqCisgKiBJTF9BTlRFTk5BX0RJVkVSU0lUWSAtIE5JQyBzZWxlY3RzIGJlc3QgYW50ZW5uYSBieSBpdHNlbGYKKyAqIElMX0FOVEVOTkFfTUFJTiAgICAgIC0gRm9yY2UgTUFJTiBhbnRlbm5hCisgKiBJTF9BTlRFTk5BX0FVWCAgICAgICAtIEZvcmNlIEFVWCBhbnRlbm5hCisgKi8KK19fbGUzMgoraWwzOTQ1X2dldF9hbnRlbm5hX2ZsYWdzKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKworCXN3aXRjaCAoaWwzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSkgeworCWNhc2UgSUxfQU5URU5OQV9ESVZFUlNJVFk6CisJCXJldHVybiAwOworCisJY2FzZSBJTF9BTlRFTk5BX01BSU46CisJCWlmIChlZXByb20tPmFudGVubmFfc3dpdGNoX3R5cGUpCisJCQlyZXR1cm4gUlhPTl9GTEdfRElTX0RJVl9NU0sgfCBSWE9OX0ZMR19BTlRfQl9NU0s7CisJCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9BX01TSzsKKworCWNhc2UgSUxfQU5URU5OQV9BVVg6CisJCWlmIChlZXByb20tPmFudGVubmFfc3dpdGNoX3R5cGUpCisJCQlyZXR1cm4gUlhPTl9GTEdfRElTX0RJVl9NU0sgfCBSWE9OX0ZMR19BTlRfQV9NU0s7CisJCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9CX01TSzsKKwl9CisKKwkvKiBiYWQgYW50ZW5uYSBzZWxlY3RvciB2YWx1ZSAqLworCUlMX0VSUigiQmFkIGFudGVubmEgc2VsZWN0b3IgdmFsdWUgKDB4JXgpXG4iLAorCSAgICAgICBpbDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hKTsKKworCXJldHVybiAwOwkJLyogImRpdmVyc2l0eSIgaXMgZGVmYXVsdCBpZiBlcnJvciAqLworfQorCitzdGF0aWMgaW50CitpbDM5NDVfc2V0X2NjbXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsIHU4IHN0YV9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fbGUxNiBrZXlfZmxhZ3MgPSAwOworCWludCByZXQ7CisKKwlrZXlfZmxhZ3MgfD0gKFNUQV9LRVlfRkxHX0NDTVAgfCBTVEFfS0VZX0ZMR19NQVBfS0VZX01TSyk7CisJa2V5X2ZsYWdzIHw9IGNwdV90b19sZTE2KGtleWNvbmYtPmtleWlkeCA8PCBTVEFfS0VZX0ZMR19LRVlJRF9QT1MpOworCisJaWYgKHN0YV9pZCA9PSBpbC0+Y3R4LmJjYXN0X3N0YV9pZCkKKwkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfTVVMVElDQVNUX01TSzsKKworCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKKwlrZXljb25mLT5od19rZXlfaWR4ID0ga2V5Y29uZi0+a2V5aWR4OworCWtleV9mbGFncyAmPSB+U1RBX0tFWV9GTEdfSU5WQUxJRDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleWxlbiA9IGtleWNvbmYtPmtleWxlbjsKKwltZW1jcHkoaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKworCW1lbWNweShpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LgorCSAgICAga2V5X2ZsYWdzICYgU1RBX0tFWV9GTEdfRU5DUllQVF9NU0spID09IFNUQV9LRVlfRkxHX05PX0VOQykKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID0KKwkJICAgIGlsX2dldF9mcmVlX3Vjb2RlX2tleV9pZHgoaWwpOworCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCisJICogaW4gdUNvZGUuICovCisKKwlXQVJOKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCisJICAgICAibm8gc3BhY2UgZm9yIGEgbmV3IGtleSIpOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCisJRF9JTkZPKCJod2NyeXB0bzogbW9kaWZ5IHVjb2RlIHN0YXRpb24ga2V5IGluZm9cbiIpOworCisJcmV0ID0gaWxfc2VuZF9hZGRfc3RhKGlsLCAmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBDTURfQVNZTkMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDM5NDVfc2V0X3RraXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsIHU4IHN0YV9pZCkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsIHU4IHN0YV9pZCkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9jbGVhcl9zdGFfa2V5X2luZm8oc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBzdGFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCW1lbXNldCgmaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpbF9od19rZXkpKTsKKwltZW1zZXQoJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXksIDAsIHNpemVvZihzdHJ1Y3QgaWw0OTY1X2tleWluZm8pKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IFNUQV9LRVlfRkxHX05PX0VOQzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisJbWVtY3B5KCZzdGFfY21kLCAmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCURfSU5GTygiaHdjcnlwdG86IGNsZWFyIHVjb2RlIHN0YXRpb24ga2V5IGluZm9cbiIpOworCXJldHVybiBpbF9zZW5kX2FkZF9zdGEoaWwsICZzdGFfY21kLCBDTURfU1lOQyk7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZXRfZHluYW1pY19rZXkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAorCQkgICAgICAgdTggc3RhX2lkKQoreworCWludCByZXQgPSAwOworCisJa2V5Y29uZi0+aHdfa2V5X2lkeCA9IEhXX0tFWV9EWU5BTUlDOworCisJc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCXJldCA9IGlsMzk0NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKGlsLCBrZXljb25mLCBzdGFfaWQpOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCXJldCA9IGlsMzk0NV9zZXRfdGtpcF9keW5hbWljX2tleV9pbmZvKGlsLCBrZXljb25mLCBzdGFfaWQpOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorCQlyZXQgPSBpbDM5NDVfc2V0X3dlcF9keW5hbWljX2tleV9pbmZvKGlsLCBrZXljb25mLCBzdGFfaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJTF9FUlIoIlVua25vd24gYWxnOiAlcyBhbGc9JXhcbiIsIF9fZnVuY19fLCBrZXljb25mLT5jaXBoZXIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCURfV0VQKCJTZXQgZHluYW1pYyBrZXk6IGFsZz0leCBsZW49JWQgaWR4PSVkIHN0YT0lZCByZXQ9JWRcbiIsCisJICAgICAga2V5Y29uZi0+Y2lwaGVyLCBrZXljb25mLT5rZXlsZW4sIGtleWNvbmYtPmtleWlkeCwgc3RhX2lkLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3JlbW92ZV9zdGF0aWNfa2V5KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDM5NDVfc2V0X3N0YXRpY19rZXkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCit7CisJaWYgKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8CisJICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJSUxfRVJSKCJTdGF0aWMga2V5IGludmFsaWQ6IGNpcGhlciAleFxuIiwga2V5LT5jaXBoZXIpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2NsZWFyX2ZyZWVfZnJhbWVzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCisJRF9JTkZPKCIlZCBmcmFtZXMgb24gcHJlLWFsbG9jYXRlZCBoZWFwIG9uIGNsZWFyLlxuIiwgaWwtPmZyYW1lc19jb3VudCk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmlsLT5mcmVlX2ZyYW1lcykpIHsKKwkJZWxlbWVudCA9IGlsLT5mcmVlX2ZyYW1lcy5uZXh0OworCQlsaXN0X2RlbChlbGVtZW50KTsKKwkJa2ZyZWUobGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWwzOTQ1X2ZyYW1lLCBsaXN0KSk7CisJCWlsLT5mcmFtZXNfY291bnQtLTsKKwl9CisKKwlpZiAoaWwtPmZyYW1lc19jb3VudCkgeworCQlJTF9XQVJOKCIlZCBmcmFtZXMgc3RpbGwgaW4gdXNlLiAgRGlkIHdlIGxvc2Ugb25lP1xuIiwKKwkJCWlsLT5mcmFtZXNfY291bnQpOworCQlpbC0+ZnJhbWVzX2NvdW50ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWwzOTQ1X2ZyYW1lICoKK2lsMzk0NV9nZXRfZnJlZV9mcmFtZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsMzk0NV9mcmFtZSAqZnJhbWU7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlpZiAobGlzdF9lbXB0eSgmaWwtPmZyZWVfZnJhbWVzKSkgeworCQlmcmFtZSA9IGt6YWxsb2Moc2l6ZW9mKCpmcmFtZSksIEdGUF9LRVJORUwpOworCQlpZiAoIWZyYW1lKSB7CisJCQlJTF9FUlIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZSFcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpbC0+ZnJhbWVzX2NvdW50Kys7CisJCXJldHVybiBmcmFtZTsKKwl9CisKKwllbGVtZW50ID0gaWwtPmZyZWVfZnJhbWVzLm5leHQ7CisJbGlzdF9kZWwoZWxlbWVudCk7CisJcmV0dXJuIGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGlsMzk0NV9mcmFtZSwgbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfZnJlZV9mcmFtZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbDM5NDVfZnJhbWUgKmZyYW1lKQoreworCW1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKCpmcmFtZSkpOworCWxpc3RfYWRkKCZmcmFtZS0+bGlzdCwgJmlsLT5mcmVlX2ZyYW1lcyk7Cit9CisKK3Vuc2lnbmVkIGludAoraWwzOTQ1X2ZpbGxfYmVhY29uX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSBpbnQgbGVmdCkKK3sKKworCWlmICghaWxfaXNfYXNzb2NpYXRlZChpbCkgfHwgIWlsLT5iZWFjb25fc2tiKQorCQlyZXR1cm4gMDsKKworCWlmIChpbC0+YmVhY29uX3NrYi0+bGVuID4gbGVmdCkKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoaGRyLCBpbC0+YmVhY29uX3NrYi0+ZGF0YSwgaWwtPmJlYWNvbl9za2ItPmxlbik7CisKKwlyZXR1cm4gaWwtPmJlYWNvbl9za2ItPmxlbjsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3NlbmRfYmVhY29uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsMzk0NV9mcmFtZSAqZnJhbWU7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemU7CisJaW50IHJjOworCXU4IHJhdGU7CisKKwlmcmFtZSA9IGlsMzk0NV9nZXRfZnJlZV9mcmFtZShpbCk7CisKKwlpZiAoIWZyYW1lKSB7CisJCUlMX0VSUigiQ291bGQgbm90IG9idGFpbiBmcmVlIGZyYW1lIGJ1ZmZlciBmb3IgYmVhY29uICIKKwkJICAgICAgICJjb21tYW5kLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJhdGUgPSBpbF9nZXRfbG93ZXN0X3BsY3AoaWwsICZpbC0+Y3R4KTsKKworCWZyYW1lX3NpemUgPSBpbDM5NDVfaHdfZ2V0X2JlYWNvbl9jbWQoaWwsIGZyYW1lLCByYXRlKTsKKworCXJjID0gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1RYX0JFQUNPTiwgZnJhbWVfc2l6ZSwgJmZyYW1lLT51LmNtZFswXSk7CisKKwlpbDM5NDVfZnJlZV9mcmFtZShpbCwgZnJhbWUpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X3Vuc2V0X2h3X3BhcmFtcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWYgKGlsLT5fMzk0NS5zaGFyZWRfdmlydCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmlsLT5wY2lfZGV2LT5kZXYsCisJCQkJICBzaXplb2Yoc3RydWN0IGlsMzk0NV9zaGFyZWQpLAorCQkJCSAgaWwtPl8zOTQ1LnNoYXJlZF92aXJ0LCBpbC0+XzM5NDUuc2hhcmVkX3BoeXMpOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2J1aWxkX3R4X2NtZF9od2NyeXB0byhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJCSAgICAgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnLCBpbnQgc3RhX2lkKQoreworCXN0cnVjdCBpbDM5NDVfdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IGlsMzk0NV90eF9jbWQgKiljbWQtPmNtZC5wYXlsb2FkOworCXN0cnVjdCBpbF9od19rZXkgKmtleWluZm8gPSAmaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mbzsKKworCXR4X2NtZC0+c2VjX2N0bCA9IDA7CisKKwlzd2l0Y2ggKGtleWluZm8tPmNpcGhlcikgeworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJdHhfY21kLT5zZWNfY3RsID0gVFhfQ01EX1NFQ19DQ007CisJCW1lbWNweSh0eF9jbWQtPmtleSwga2V5aW5mby0+a2V5LCBrZXlpbmZvLT5rZXlsZW4pOworCQlEX1RYKCJ0eF9jbWQgd2l0aCBBRVMgaHdjcnlwdG9cbiIpOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKKwkJdHhfY21kLT5zZWNfY3RsIHw9IFRYX0NNRF9TRUNfS0VZMTI4OworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCQl0eF9jbWQtPnNlY19jdGwgfD0KKwkJICAgIFRYX0NNRF9TRUNfV0VQIHwgKGluZm8tPmNvbnRyb2wuaHdfa2V5LT4KKwkJCQkgICAgICBod19rZXlfaWR4ICYgVFhfQ01EX1NFQ19NU0spIDw8CisJCSAgICBUWF9DTURfU0VDX1NISUZUOworCisJCW1lbWNweSgmdHhfY21kLT5rZXlbM10sIGtleWluZm8tPmtleSwga2V5aW5mby0+a2V5bGVuKTsKKworCQlEX1RYKCJDb25maWd1cmluZyBwYWNrZXQgZm9yIFdFUCBlbmNyeXB0aW9uICIgIndpdGgga2V5ICVkXG4iLAorCQkgICAgIGluZm8tPmNvbnRyb2wuaHdfa2V5LT5od19rZXlfaWR4KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJTF9FUlIoIlVua25vd24gZW5jb2RlIGNpcGhlciAleFxuIiwga2V5aW5mby0+Y2lwaGVyKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogaGFuZGxlIGJ1aWxkIENfVFggY29tbWFuZCBub3RpZmljYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfYnVpbGRfdHhfY21kX2Jhc2ljKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCB1OCBzdGRfaWQpCit7CisJc3RydWN0IGlsMzk0NV90eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7CisJX19sZTMyIHR4X2ZsYWdzID0gdHhfY21kLT50eF9mbGFnczsKKwlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisKKwl0eF9jbWQtPnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOworCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spKSB7CisJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfQUNLX01TSzsKKwkJaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSkKKwkJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykgJiYKKwkJICAgICEobGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkgJiAweGYpKQorCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19UU0ZfTVNLOworCX0gZWxzZSB7CisJCXR4X2ZsYWdzICY9ICh+VFhfQ01EX0ZMR19BQ0tfTVNLKTsKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwl9CisKKwl0eF9jbWQtPnN0YV9pZCA9IHN0ZF9pZDsKKwlpZiAoaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoZmMpKQorCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX01PUkVfRlJBR19NU0s7CisKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgeworCQl1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKKwkJdHhfY21kLT50aWRfdHNwZWMgPSBxY1swXSAmIDB4ZjsKKwkJdHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJfSBlbHNlIHsKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwl9CisKKwlpbF90eF9jbWRfcHJvdGVjdGlvbihpbCwgaW5mbywgZmMsICZ0eF9mbGFncyk7CisKKwl0eF9mbGFncyAmPSB+KFRYX0NNRF9GTEdfQU5UX1NFTF9NU0spOworCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpIHsKKwkJaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpIHx8IGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCisJCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDMpOworCQllbHNlCisJCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDIpOworCX0gZWxzZSB7CisJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gMDsKKwl9CisKKwl0eF9jbWQtPmRyaXZlcl90eG9wID0gMDsKKwl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7CisJdHhfY21kLT5uZXh0X2ZyYW1lX2xlbiA9IDA7Cit9CisKKy8qCisgKiBzdGFydCBDX1RYIGNvbW1hbmQgcHJvY2VzcworICovCitzdGF0aWMgaW50CitpbDM5NDVfdHhfc2tiKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCAqdHhfY21kOworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gTlVMTDsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSBOVUxMOworCXN0cnVjdCBpbF9kZXZpY2VfY21kICpvdXRfY21kOworCXN0cnVjdCBpbF9jbWRfbWV0YSAqb3V0X21ldGE7CisJZG1hX2FkZHJfdCBwaHlzX2FkZHI7CisJZG1hX2FkZHJfdCB0eGNtZF9waHlzOworCWludCB0eHFfaWQgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKKwl1MTYgbGVuLCBpZHgsIGhkcl9sZW47CisJdTggaWQ7CisJdTggdW5pY2FzdDsKKwl1OCBzdGFfaWQ7CisJdTggdGlkID0gMDsKKwlfX2xlMTYgZmM7CisJdTggd2FpdF93cml0ZV9wdHIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkgeworCQlEX0RST1AoIkRyb3BwaW5nIC0gUkYgS0lMTFxuIik7CisJCWdvdG8gZHJvcF91bmxvY2s7CisJfQorCisJaWYgKChpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaWwtPmh3LCBpbmZvKS0+aHdfdmFsdWUgJiAweEZGKSA9PQorCSAgICBJTF9JTlZBTElEX1JBVEUpIHsKKwkJSUxfRVJSKCJFUlJPUjogTm8gVFggcmF0ZSBhdmFpbGFibGUuXG4iKTsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwl1bmljYXN0ID0gIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpOworCWlkID0gMDsKKworCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaWYgKGllZWU4MDIxMV9pc19hdXRoKGZjKSkKKwkJRF9UWCgiU2VuZGluZyBBVVRIIGZyYW1lXG4iKTsKKwllbHNlIGlmIChpZWVlODAyMTFfaXNfYXNzb2NfcmVxKGZjKSkKKwkJRF9UWCgiU2VuZGluZyBBU1NPQyBmcmFtZVxuIik7CisJZWxzZSBpZiAoaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKKwkJRF9UWCgiU2VuZGluZyBSRUFTU09DIGZyYW1lXG4iKTsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjKTsKKworCS8qIEZpbmQgaWR4IGludG8gc3RhdGlvbiB0YWJsZSBmb3IgZGVzdGluYXRpb24gc3RhdGlvbiAqLworCXN0YV9pZCA9IGlsX3N0YV9pZF9vcl9icm9hZGNhc3QoaWwsICZpbC0+Y3R4LCBpbmZvLT5jb250cm9sLnN0YSk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pIHsKKwkJRF9EUk9QKCJEcm9wcGluZyAtIElOVkFMSUQgU1RBVElPTjogJXBNXG4iLCBoZHItPmFkZHIxKTsKKwkJZ290byBkcm9wOworCX0KKworCURfUkFURSgic3RhdGlvbiBJZCAlZFxuIiwgc3RhX2lkKTsKKworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CisJCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQl0aWQgPSBxY1swXSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOworCQlpZiAodW5saWtlbHkodGlkID49IE1BWF9USURfQ09VTlQpKQorCQkJZ290byBkcm9wOworCX0KKworCS8qIERlc2NyaXB0b3IgZm9yIGNob3NlbiBUeCBxdWV1ZSAqLworCXR4cSA9ICZpbC0+dHhxW3R4cV9pZF07CisJcSA9ICZ0eHEtPnE7CisKKwlpZiAoKGlsX3F1ZXVlX3NwYWNlKHEpIDwgcS0+aGlnaF9tYXJrKSkKKwkJZ290byBkcm9wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpZHggPSBpbF9nZXRfY21kX2lkeChxLCBxLT53cml0ZV9wdHIsIDApOworCisJLyogU2V0IHVwIGRyaXZlciBkYXRhIGZvciB0aGlzIFRGRCAqLworCW1lbXNldCgmKHR4cS0+dHhiW3EtPndyaXRlX3B0cl0pLCAwLCBzaXplb2Yoc3RydWN0IGlsX3R4X2luZm8pKTsKKwl0eHEtPnR4YltxLT53cml0ZV9wdHJdLnNrYiA9IHNrYjsKKwl0eHEtPnR4YltxLT53cml0ZV9wdHJdLmN0eCA9ICZpbC0+Y3R4OworCisJLyogSW5pdCBmaXJzdCBlbXB0eSBlbnRyeSBpbiBxdWV1ZSdzIGFycmF5IG9mIFR4L2NtZCBidWZmZXJzICovCisJb3V0X2NtZCA9IHR4cS0+Y21kW2lkeF07CisJb3V0X21ldGEgPSAmdHhxLT5tZXRhW2lkeF07CisJdHhfY21kID0gKHN0cnVjdCBpbDM5NDVfdHhfY21kICopb3V0X2NtZC0+Y21kLnBheWxvYWQ7CisJbWVtc2V0KCZvdXRfY21kLT5oZHIsIDAsIHNpemVvZihvdXRfY21kLT5oZHIpKTsKKwltZW1zZXQodHhfY21kLCAwLCBzaXplb2YoKnR4X2NtZCkpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIFR4LWNvbW1hbmQgKG5vdCBNQUMhKSBoZWFkZXIuCisJICogU3RvcmUgdGhlIGNob3NlbiBUeCBxdWV1ZSBhbmQgVEZEIGlkeCB3aXRoaW4gdGhlIHNlcXVlbmNlIGZpZWxkOworCSAqIGFmdGVyIFR4LCB1Q29kZSdzIFR4IHJlc3BvbnNlIHdpbGwgcmV0dXJuIHRoaXMgdmFsdWUgc28gZHJpdmVyIGNhbgorCSAqIGxvY2F0ZSB0aGUgZnJhbWUgd2l0aGluIHRoZSB0eCBxdWV1ZSBhbmQgZG8gcG9zdC10eCBwcm9jZXNzaW5nLgorCSAqLworCW91dF9jbWQtPmhkci5jbWQgPSBDX1RYOworCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9CisJICAgIGNwdV90b19sZTE2KCh1MTYpCisJCQkoUVVFVUVfVE9fU0VRKHR4cV9pZCkgfCBJRFhfVE9fU0VRKHEtPndyaXRlX3B0cikpKTsKKworCS8qIENvcHkgTUFDIGhlYWRlciBmcm9tIHNrYiBpbnRvIGNvbW1hbmQgYnVmZmVyICovCisJbWVtY3B5KHR4X2NtZC0+aGRyLCBoZHIsIGhkcl9sZW4pOworCisJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5KQorCQlpbDM5NDVfYnVpbGRfdHhfY21kX2h3Y3J5cHRvKGlsLCBpbmZvLCBvdXRfY21kLCBza2IsIHN0YV9pZCk7CisKKwkvKiBUT0RPIG5lZWQgdGhpcyBmb3IgYnVyc3QgbW9kZSBsYXRlciBvbiAqLworCWlsMzk0NV9idWlsZF90eF9jbWRfYmFzaWMoaWwsIG91dF9jbWQsIGluZm8sIGhkciwgc3RhX2lkKTsKKworCS8qIHNldCBpc19oY2NhIHRvIDA7IGl0IHByb2JhYmx5IHdpbGwgbmV2ZXIgYmUgaW1wbGVtZW50ZWQgKi8KKwlpbDM5NDVfaHdfYnVpbGRfdHhfY21kX3JhdGUoaWwsIG91dF9jbWQsIGluZm8sIGhkciwgc3RhX2lkLCAwKTsKKworCS8qIFRvdGFsICMgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKwlsZW4gPSAodTE2KSBza2ItPmxlbjsKKwl0eF9jbWQtPmxlbiA9IGNwdV90b19sZTE2KGxlbik7CisKKwlpbF9kYmdfbG9nX3R4X2RhdGFfZnJhbWUoaWwsIGxlbiwgaGRyKTsKKwlpbF91cGRhdGVfc3RhdHMoaWwsIHRydWUsIGZjLCBsZW4pOworCXR4X2NtZC0+dHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfQU5UX0FfTVNLOworCXR4X2NtZC0+dHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfQU5UX0JfTVNLOworCisJaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCXR4cS0+bmVlZF91cGRhdGUgPSAxOworCX0gZWxzZSB7CisJCXdhaXRfd3JpdGVfcHRyID0gMTsKKwkJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7CisJfQorCisJRF9UWCgic2VxdWVuY2UgbnIgPSAwWCV4XG4iLCBsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpKTsKKwlEX1RYKCJ0eF9mbGFncyA9IDBYJXhcbiIsIGxlMzJfdG9fY3B1KHR4X2NtZC0+dHhfZmxhZ3MpKTsKKwlpbF9wcmludF9oZXhfZHVtcChpbCwgSUxfRExfVFgsIHR4X2NtZCwgc2l6ZW9mKCp0eF9jbWQpKTsKKwlpbF9wcmludF9oZXhfZHVtcChpbCwgSUxfRExfVFgsICh1OCAqKSB0eF9jbWQtPmhkciwKKwkJCSAgaWVlZTgwMjExX2hkcmxlbihmYykpOworCisJLyoKKwkgKiBVc2UgdGhlIGZpcnN0IGVtcHR5IGVudHJ5IGluIHRoaXMgcXVldWUncyBjb21tYW5kIGJ1ZmZlciBhcnJheQorCSAqIHRvIGNvbnRhaW4gdGhlIFR4IGNvbW1hbmQgYW5kIE1BQyBoZWFkZXIgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyCisJICogKHBheWxvYWQgZGF0YSB3aWxsIGJlIGluIGFub3RoZXIgYnVmZmVyKS4KKwkgKiBTaXplIG9mIHRoaXMgdmFyaWVzLCBkdWUgdG8gdmFyeWluZyBNQUMgaGVhZGVyIGxlbmd0aC4KKwkgKiBJZiBlbmQgaXMgbm90IGR3b3JkIGFsaWduZWQsIHdlJ2xsIGhhdmUgMiBleHRyYSBieXRlcyBhdCB0aGUgZW5kCisJICogb2YgdGhlIE1BQyBoZWFkZXIgKGRldmljZSByZWFkcyBvbiBkd29yZCBib3VuZGFyaWVzKS4KKwkgKiBXZSdsbCB0ZWxsIGRldmljZSBhYm91dCB0aGlzIHBhZGRpbmcgbGF0ZXIuCisJICovCisJbGVuID0KKwkgICAgc2l6ZW9mKHN0cnVjdCBpbDM5NDVfdHhfY21kKSArIHNpemVvZihzdHJ1Y3QgaWxfY21kX2hlYWRlcikgKworCSAgICBoZHJfbGVuOworCWxlbiA9IChsZW4gKyAzKSAmIH4zOworCisJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIFR4IGNvbW1hbmQncyBoZWFkZXIgKG5vdCBNQUMgaGVhZGVyISksCisJICogd2l0aGluIGNvbW1hbmQgYnVmZmVyIGFycmF5LiAqLworCXR4Y21kX3BoeXMgPQorCSAgICBwY2lfbWFwX3NpbmdsZShpbC0+cGNpX2RldiwgJm91dF9jbWQtPmhkciwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkvKiB3ZSBkbyBub3QgbWFwIG1ldGEgZGF0YSAuLi4gc28gd2UgY2FuIHNhZmVseSBhY2Nlc3MgYWRkcmVzcyB0bworCSAqIHByb3ZpZGUgdG8gdW5tYXAgY29tbWFuZCovCisJZG1hX3VubWFwX2FkZHJfc2V0KG91dF9tZXRhLCBtYXBwaW5nLCB0eGNtZF9waHlzKTsKKwlkbWFfdW5tYXBfbGVuX3NldChvdXRfbWV0YSwgbGVuLCBsZW4pOworCisJLyogQWRkIGJ1ZmZlciBjb250YWluaW5nIFR4IGNvbW1hbmQgYW5kIE1BQyghKSBoZWFkZXIgdG8gVEZEJ3MKKwkgKiBmaXJzdCBlbnRyeSAqLworCWlsLT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQoaWwsIHR4cSwgdHhjbWRfcGh5cywgbGVuLCAxLAorCQkJCQkJIDApOworCisJLyogU2V0IHVwIFRGRCdzIDJuZCBlbnRyeSB0byBwb2ludCBkaXJlY3RseSB0byByZW1haW5kZXIgb2Ygc2tiLAorCSAqIGlmIGFueSAoODAyLjExIG51bGwgZnJhbWVzIGhhdmUgbm8gcGF5bG9hZCkuICovCisJbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCWlmIChsZW4pIHsKKwkJcGh5c19hZGRyID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LCBza2ItPmRhdGEgKyBoZHJfbGVuLCBsZW4sCisJCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CisJCWlsLT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQoaWwsIHR4cSwgcGh5c19hZGRyLAorCQkJCQkJCSBsZW4sIDAsIFUzMl9QQUQobGVuKSk7CisJfQorCisJLyogVGVsbCBkZXZpY2UgdGhlIHdyaXRlIGlkeCAqanVzdCBwYXN0KiB0aGlzIGxhdGVzdCBmaWxsZWQgVEZEICovCisJcS0+d3JpdGVfcHRyID0gaWxfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyLCBxLT5uX2JkKTsKKwlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgdHhxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGlsX3F1ZXVlX3NwYWNlKHEpIDwgcS0+aGlnaF9tYXJrICYmIGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkKSB7CisJCWlmICh3YWl0X3dyaXRlX3B0cikgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKKwkJCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCB0eHEpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwkJfQorCisJCWlsX3N0b3BfcXVldWUoaWwsIHR4cSk7CisJfQorCisJcmV0dXJuIDA7CisKK2Ryb3BfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7Citkcm9wOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAoraWwzOTQ1X2dldF9tZWFzdXJlbWVudChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX21lYXN1cmVtZW50X3BhcmFtcyAqcGFyYW1zLCB1OCB0eXBlKQoreworCXN0cnVjdCBpbF9zcGVjdHJ1bV9jbWQgc3BlY3RydW07CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0OworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfU1BFQ1RSVU1fTUVBU1VSRU1FTlQsCisJCS5kYXRhID0gKHZvaWQgKikmc3BlY3RydW0sCisJCS5mbGFncyA9IENNRF9XQU5UX1NLQiwKKwl9OworCXUzMiBhZGRfdGltZSA9IGxlNjRfdG9fY3B1KHBhcmFtcy0+c3RhcnRfdGltZSk7CisJaW50IHJjOworCWludCBzcGVjdHJ1bV9yZXNwX3N0YXR1czsKKwlpbnQgZHVyYXRpb24gPSBsZTE2X3RvX2NwdShwYXJhbXMtPmR1cmF0aW9uKTsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCWlmIChpbF9pc19hc3NvY2lhdGVkKGlsKSkKKwkJYWRkX3RpbWUgPQorCQkgICAgaWxfdXNlY3NfdG9fYmVhY29ucyhpbCwKKwkJCQkJbGU2NF90b19jcHUocGFyYW1zLT5zdGFydF90aW1lKSAtCisJCQkJCWlsLT5fMzk0NS5sYXN0X3RzZiwKKwkJCQkJbGUxNl90b19jcHUoY3R4LT50aW1pbmcuCisJCQkJCQkgICAgYmVhY29uX2ludGVydmFsKSk7CisKKwltZW1zZXQoJnNwZWN0cnVtLCAwLCBzaXplb2Yoc3BlY3RydW0pKTsKKworCXNwZWN0cnVtLmNoYW5uZWxfY291bnQgPSBjcHVfdG9fbGUxNigxKTsKKwlzcGVjdHJ1bS5mbGFncyA9CisJICAgIFJYT05fRkxHX1RTRjJIT1NUX01TSyB8IFJYT05fRkxHX0FOVF9BX01TSyB8IFJYT05fRkxHX0RJU19ESVZfTVNLOworCXNwZWN0cnVtLmZpbHRlcl9mbGFncyA9IE1FQVNVUkVNRU5UX0ZJTFRFUl9GTEFHOworCWNtZC5sZW4gPSBzaXplb2Yoc3BlY3RydW0pOworCXNwZWN0cnVtLmxlbiA9IGNwdV90b19sZTE2KGNtZC5sZW4gLSBzaXplb2Yoc3BlY3RydW0ubGVuKSk7CisKKwlpZiAoaWxfaXNfYXNzb2NpYXRlZChpbCkpCisJCXNwZWN0cnVtLnN0YXJ0X3RpbWUgPQorCQkgICAgaWxfYWRkX2JlYWNvbl90aW1lKGlsLCBpbC0+XzM5NDUubGFzdF9iZWFjb25fdGltZSwgYWRkX3RpbWUsCisJCQkJICAgICAgIGxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLgorCQkJCQkJICAgYmVhY29uX2ludGVydmFsKSk7CisJZWxzZQorCQlzcGVjdHJ1bS5zdGFydF90aW1lID0gMDsKKworCXNwZWN0cnVtLmNoYW5uZWxzWzBdLmR1cmF0aW9uID0gY3B1X3RvX2xlMzIoZHVyYXRpb24gKiBUSU1FX1VOSVQpOworCXNwZWN0cnVtLmNoYW5uZWxzWzBdLmNoYW5uZWwgPSBwYXJhbXMtPmNoYW5uZWw7CisJc3BlY3RydW0uY2hhbm5lbHNbMF0udHlwZSA9IHR5cGU7CisJaWYgKGN0eC0+YWN0aXZlLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKQorCQlzcGVjdHJ1bS5mbGFncyB8PQorCQkgICAgUlhPTl9GTEdfQkFORF8yNEdfTVNLIHwgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLIHwKKwkJICAgIFJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKKworCXJjID0gaWxfc2VuZF9jbWRfc3luYyhpbCwgJmNtZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwa3QgPSAoc3RydWN0IGlsX3J4X3BrdCAqKWNtZC5yZXBseV9wYWdlOworCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tIE5fUlhfT05fQVNTT0MgY29tbWFuZFxuIik7CisJCXJjID0gLUVJTzsKKwl9CisKKwlzcGVjdHJ1bV9yZXNwX3N0YXR1cyA9IGxlMTZfdG9fY3B1KHBrdC0+dS5zcGVjdHJ1bS5zdGF0dXMpOworCXN3aXRjaCAoc3BlY3RydW1fcmVzcF9zdGF0dXMpIHsKKwljYXNlIDA6CQkvKiBDb21tYW5kIHdpbGwgYmUgaGFuZGxlZCAqLworCQlpZiAocGt0LT51LnNwZWN0cnVtLmlkICE9IDB4ZmYpIHsKKwkJCURfSU5GTygiUmVwbGFjZWQgZXhpc3RpbmcgbWVhc3VyZW1lbnQ6ICVkXG4iLAorCQkJICAgICAgIHBrdC0+dS5zcGVjdHJ1bS5pZCk7CisJCQlpbC0+bWVhc3VyZW1lbnRfc3RhdHVzICY9IH5NRUFTVVJFTUVOVF9SRUFEWTsKKwkJfQorCQlpbC0+bWVhc3VyZW1lbnRfc3RhdHVzIHw9IE1FQVNVUkVNRU5UX0FDVElWRTsKKwkJcmMgPSAwOworCQlicmVhazsKKworCWNhc2UgMToJCS8qIENvbW1hbmQgd2lsbCBub3QgYmUgaGFuZGxlZCAqLworCQlyYyA9IC1FQUdBSU47CisJCWJyZWFrOworCX0KKworCWlsX2ZyZWVfcGFnZXMoaWwsIGNtZC5yZXBseV9wYWdlKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9oZGxfYWxpdmUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfYWxpdmVfcmVzcCAqcGFsaXZlOworCXN0cnVjdCBkZWxheWVkX3dvcmsgKnB3b3JrOworCisJcGFsaXZlID0gJnBrdC0+dS5hbGl2ZV9mcmFtZTsKKworCURfSU5GTygiQWxpdmUgdWNvZGUgc3RhdHVzIDB4JTA4WCByZXZpc2lvbiAiICIweCUwMVggMHglMDFYXG4iLAorCSAgICAgICBwYWxpdmUtPmlzX3ZhbGlkLCBwYWxpdmUtPnZlcl90eXBlLCBwYWxpdmUtPnZlcl9zdWJ0eXBlKTsKKworCWlmIChwYWxpdmUtPnZlcl9zdWJ0eXBlID09IElOSVRJQUxJWkVfU1VCVFlQRSkgeworCQlEX0lORk8oIkluaXRpYWxpemF0aW9uIEFsaXZlIHJlY2VpdmVkLlxuIik7CisJCW1lbWNweSgmaWwtPmNhcmRfYWxpdmVfaW5pdCwgJnBrdC0+dS5hbGl2ZV9mcmFtZSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWxpdmVfcmVzcCkpOworCQlwd29yayA9ICZpbC0+aW5pdF9hbGl2ZV9zdGFydDsKKwl9IGVsc2UgeworCQlEX0lORk8oIlJ1bnRpbWUgQWxpdmUgcmVjZWl2ZWQuXG4iKTsKKwkJbWVtY3B5KCZpbC0+Y2FyZF9hbGl2ZSwgJnBrdC0+dS5hbGl2ZV9mcmFtZSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWxpdmVfcmVzcCkpOworCQlwd29yayA9ICZpbC0+YWxpdmVfc3RhcnQ7CisJCWlsMzk0NV9kaXNhYmxlX2V2ZW50cyhpbCk7CisJfQorCisJLyogV2UgZGVsYXkgdGhlIEFMSVZFIHJlc3BvbnNlIGJ5IDVtcyB0bworCSAqIGdpdmUgdGhlIEhXIFJGIEtpbGwgdGltZSB0byBhY3RpdmF0ZS4uLiAqLworCWlmIChwYWxpdmUtPmlzX3ZhbGlkID09IFVDT0RFX1ZBTElEX09LKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgcHdvcmssIG1zZWNzX3RvX2ppZmZpZXMoNSkpOworCWVsc2UKKwkJSUxfV0FSTigidUNvZGUgZGlkIG5vdCByZXNwb25kIE9LLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfaGRsX2FkZF9zdGEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKyNlbmRpZgorCisJRF9SWCgiUmVjZWl2ZWQgQ19BRERfU1RBOiAweCUwMlhcbiIsIHBrdC0+dS5zdGF0dXMpOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2hkbF9iZWFjb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWwzOTQ1X2JlYWNvbl9ub3RpZiAqYmVhY29uID0gJihwa3QtPnUuYmVhY29uX3N0YXR1cyk7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJdTggcmF0ZSA9IGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIucmF0ZTsKKworCURfUlgoImJlYWNvbiBzdGF0dXMgJXggcmV0cmllcyAlZCBpc3MgJWQgIiAidHNmICVkICVkIHJhdGUgJWRcbiIsCisJICAgICBsZTMyX3RvX2NwdShiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLnN0YXR1cykgJiBUWF9TVEFUVVNfTVNLLAorCSAgICAgYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5mYWlsdXJlX2ZyYW1lLAorCSAgICAgbGUzMl90b19jcHUoYmVhY29uLT5pYnNzX21ncl9zdGF0dXMpLAorCSAgICAgbGUzMl90b19jcHUoYmVhY29uLT5oaWdoX3RzZiksIGxlMzJfdG9fY3B1KGJlYWNvbi0+bG93X3RzZiksIHJhdGUpOworI2VuZGlmCisKKwlpbC0+aWJzc19tYW5hZ2VyID0gbGUzMl90b19jcHUoYmVhY29uLT5pYnNzX21ncl9zdGF0dXMpOworCit9CisKKy8qIEhhbmRsZSBub3RpZmljYXRpb24gZnJvbSB1Q29kZSB0aGF0IGNhcmQncyBwb3dlciBzdGF0ZSBpcyBjaGFuZ2luZworICogZHVlIHRvIHNvZnR3YXJlLCBoYXJkd2FyZSwgb3IgY3JpdGljYWwgdGVtcGVyYXR1cmUgUkZLSUxMICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X2hkbF9jYXJkX3N0YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJdTMyIGZsYWdzID0gbGUzMl90b19jcHUocGt0LT51LmNhcmRfc3RhdGVfbm90aWYuZmxhZ3MpOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gaWwtPnN0YXR1czsKKworCUlMX1dBUk4oIkNhcmQgc3RhdGUgcmVjZWl2ZWQ6IEhXOiVzIFNXOiVzXG4iLAorCQkoZmxhZ3MgJiBIV19DQVJEX0RJU0FCTEVEKSA/ICJLaWxsIiA6ICJPbiIsCisJCShmbGFncyAmIFNXX0NBUkRfRElTQUJMRUQpID8gIktpbGwiIDogIk9uIik7CisKKwlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKKworCWlmIChmbGFncyAmIEhXX0NBUkRfRElTQUJMRUQpCisJCXNldF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJZWxzZQorCQljbGVhcl9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisKKwlpbF9zY2FuX2NhbmNlbChpbCk7CisKKwlpZiAoKHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJnN0YXR1cykgIT0KKwkgICAgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpKSkKKwkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShpbC0+aHctPndpcGh5LAorCQkJCQkgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpKTsKKwllbHNlCisJCXdha2VfdXAoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworfQorCisvKioKKyAqIGlsMzk0NV9zZXR1cF9oYW5kbGVycyAtIEluaXRpYWxpemUgUnggaGFuZGxlciBjYWxsYmFja3MKKyAqCisgKiBTZXR1cCB0aGUgUlggaGFuZGxlcnMgZm9yIGVhY2ggb2YgdGhlIHJlcGx5IHR5cGVzIHNlbnQgZnJvbSB0aGUgdUNvZGUKKyAqIHRvIHRoZSBob3N0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hhaW5zIGludG8gdGhlIGhhcmR3YXJlIHNwZWNpZmljIGZpbGVzIGZvciB0aGVtIHRvIHNldHVwCisgKiBhbnkgaGFyZHdhcmUgc3BlY2lmaWMgaGFuZGxlcnMgYXMgd2VsbC4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9zZXR1cF9oYW5kbGVycyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwtPmhhbmRsZXJzW05fQUxJVkVdID0gaWwzOTQ1X2hkbF9hbGl2ZTsKKwlpbC0+aGFuZGxlcnNbQ19BRERfU1RBXSA9IGlsMzk0NV9oZGxfYWRkX3N0YTsKKwlpbC0+aGFuZGxlcnNbTl9FUlJPUl0gPSBpbF9oZGxfZXJyb3I7CisJaWwtPmhhbmRsZXJzW05fQ0hBTk5FTF9TV0lUQ0hdID0gaWxfaGRsX2NzYTsKKwlpbC0+aGFuZGxlcnNbTl9TUEVDVFJVTV9NRUFTVVJFTUVOVF0gPSBpbF9oZGxfc3BlY3RydW1fbWVhc3VyZW1lbnQ7CisJaWwtPmhhbmRsZXJzW05fUE1fU0xFRVBdID0gaWxfaGRsX3BtX3NsZWVwOworCWlsLT5oYW5kbGVyc1tOX1BNX0RFQlVHX1NUQVRTXSA9IGlsX2hkbF9wbV9kZWJ1Z19zdGF0czsKKwlpbC0+aGFuZGxlcnNbTl9CRUFDT05dID0gaWwzOTQ1X2hkbF9iZWFjb247CisKKwkvKgorCSAqIFRoZSBzYW1lIGhhbmRsZXIgaXMgdXNlZCBmb3IgYm90aCB0aGUgUkVQTFkgdG8gYSBkaXNjcmV0ZQorCSAqIHN0YXRzIHJlcXVlc3QgZnJvbSB0aGUgaG9zdCBhcyB3ZWxsIGFzIGZvciB0aGUgcGVyaW9kaWMKKwkgKiBzdGF0cyBub3RpZmljYXRpb25zIChhZnRlciByZWNlaXZlZCBiZWFjb25zKSBmcm9tIHRoZSB1Q29kZS4KKwkgKi8KKwlpbC0+aGFuZGxlcnNbQ19TVEFUU10gPSBpbDM5NDVfaGRsX2Nfc3RhdHM7CisJaWwtPmhhbmRsZXJzW05fU1RBVFNdID0gaWwzOTQ1X2hkbF9zdGF0czsKKworCWlsX3NldHVwX3J4X3NjYW5faGFuZGxlcnMoaWwpOworCWlsLT5oYW5kbGVyc1tOX0NBUkRfU1RBVEVdID0gaWwzOTQ1X2hkbF9jYXJkX3N0YXRlOworCisJLyogU2V0IHVwIGhhcmR3YXJlIHNwZWNpZmljIFJ4IGhhbmRsZXJzICovCisJaWwzOTQ1X2h3X2hhbmRsZXJfc2V0dXAoaWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogUlgtRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUnggdGhlb3J5IG9mIG9wZXJhdGlvbgorICoKKyAqIFRoZSBob3N0IGFsbG9jYXRlcyAzMiBETUEgdGFyZ2V0IGFkZHJlc3NlcyBhbmQgcGFzc2VzIHRoZSBob3N0IGFkZHJlc3MKKyAqIHRvIHRoZSBmaXJtd2FyZSBhdCByZWdpc3RlciBJTF9SRkRTX1RCTF9MT1dFUiArIE4gKiBSRkRfU0laRSB3aGVyZSBOIGlzCisgKiAwIHRvIDMxCisgKgorICogUnggUXVldWUgSW5kZXhlcworICogVGhlIGhvc3QvZmlybXdhcmUgc2hhcmUgdHdvIGlkeCByZWdpc3RlcnMgZm9yIG1hbmFnaW5nIHRoZSBSeCBidWZmZXJzLgorICoKKyAqIFRoZSBSRUFEIGlkeCBtYXBzIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiB0aGF0IHRoZSBmaXJtd2FyZSBtYXkgYmUgd3JpdGluZworICogdG8gLS0gdGhlIGRyaXZlciBjYW4gcmVhZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoaXMgcG9zaXRpb24gYW5kIGdldAorICogZ29vZCBkYXRhLgorICogVGhlIFJFQUQgaWR4IGlzIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlIG9uY2UgdGhlIGNhcmQgaXMgZW5hYmxlZC4KKyAqCisgKiBUaGUgV1JJVEUgaWR4IG1hcHMgdG8gdGhlIGxhc3QgcG9zaXRpb24gdGhlIGRyaXZlciBoYXMgcmVhZCBmcm9tIC0tIHRoZQorICogcG9zaXRpb24gcHJlY2VkaW5nIFdSSVRFIGlzIHRoZSBsYXN0IHNsb3QgdGhlIGZpcm13YXJlIGNhbiBwbGFjZSBhIHBhY2tldC4KKyAqCisgKiBUaGUgcXVldWUgaXMgZW1wdHkgKG5vIGdvb2QgZGF0YSkgaWYgV1JJVEUgPSBSRUFEIC0gMSwgYW5kIGlzIGZ1bGwgaWYKKyAqIFdSSVRFID0gUkVBRC4KKyAqCisgKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRoZSBob3N0IHNldHMgdXAgdGhlIFJFQUQgcXVldWUgcG9zaXRpb24gdG8gdGhlIGZpcnN0CisgKiBJRFggcG9zaXRpb24sIGFuZCBXUklURSB0byB0aGUgbGFzdCAoUkVBRCAtIDEgd3JhcHBlZCkKKyAqCisgKiBXaGVuIHRoZSBmaXJtd2FyZSBwbGFjZXMgYSBwYWNrZXQgaW4gYSBidWZmZXIsIGl0IHdpbGwgYWR2YW5jZSB0aGUgUkVBRCBpZHgKKyAqIGFuZCBmaXJlIHRoZSBSWCBpbnRlcnJ1cHQuICBUaGUgZHJpdmVyIGNhbiB0aGVuIHF1ZXJ5IHRoZSBSRUFEIGlkeCBhbmQKKyAqIHByb2Nlc3MgYXMgbWFueSBwYWNrZXRzIGFzIHBvc3NpYmxlLCBtb3ZpbmcgdGhlIFdSSVRFIGlkeCBmb3J3YXJkIGFzIGl0CisgKiByZXNldHMgdGhlIFJ4IHF1ZXVlIGJ1ZmZlcnMgd2l0aCBuZXcgbWVtb3J5LgorICoKKyAqIFRoZSBtYW5hZ2VtZW50IGluIHRoZSBkcml2ZXIgaXMgYXMgZm9sbG93czoKKyAqICsgQSBsaXN0IG9mIHByZS1hbGxvY2F0ZWQgU0tCcyBpcyBzdG9yZWQgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUuICBXaGVuCisgKiAgIGl3bC0+cnhxLT5mcmVlX2NvdW50IGRyb3BzIHRvIG9yIGJlbG93IFJYX0xPV19XQVRFUk1BUkssIHdvcmsgaXMgc2NoZWR1bGVkCisgKiAgIHRvIHJlcGxlbmlzaCB0aGUgaXdsLT5yeHEtPnJ4X2ZyZWUuCisgKiArIEluIGlsMzk0NV9yeF9yZXBsZW5pc2ggKHNjaGVkdWxlZCkgaWYgJ3Byb2Nlc3NlZCcgIT0gJ3JlYWQnIHRoZW4gdGhlCisgKiAgIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGFuZCB0aGUgUkVBRCBJRFggaXMgdXBkYXRlZCAodXBkYXRpbmcgdGhlCisgKiAgICdwcm9jZXNzZWQnIGFuZCAncmVhZCcgZHJpdmVyIGlkeGVzIGFzIHdlbGwpCisgKiArIEEgcmVjZWl2ZWQgcGFja2V0IGlzIHByb2Nlc3NlZCBhbmQgaGFuZGVkIHRvIHRoZSBrZXJuZWwgbmV0d29yayBzdGFjaywKKyAqICAgZGV0YWNoZWQgZnJvbSB0aGUgaXdsLT5yeHEuICBUaGUgZHJpdmVyICdwcm9jZXNzZWQnIGlkeCBpcyB1cGRhdGVkLgorICogKyBUaGUgSG9zdC9GaXJtd2FyZSBpd2wtPnJ4cSBpcyByZXBsZW5pc2hlZCBhdCB0YXNrbGV0IHRpbWUgZnJvbSB0aGUgcnhfZnJlZQorICogICBsaXN0LiBJZiB0aGVyZSBhcmUgbm8gYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUsIHRoZSBSRUFECisgKiAgIElEWCBpcyBub3QgaW5jcmVtZW50ZWQgYW5kIGl3bC0+c3RhdHVzKFJYX1NUQUxMRUQpIGlzIHNldC4gIElmIHRoZXJlCisgKiAgIHdlcmUgZW5vdWdoIGZyZWUgYnVmZmVycyBhbmQgUlhfU1RBTExFRCBpcyBzZXQgaXQgaXMgY2xlYXJlZC4KKyAqCisgKgorICogRHJpdmVyIHNlcXVlbmNlOgorICoKKyAqIGlsMzk0NV9yeF9yZXBsZW5pc2goKSAgICAgUmVwbGVuaXNoZXMgcnhfZnJlZSBsaXN0IGZyb20gcnhfdXNlZCwgYW5kIGNhbGxzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbDM5NDVfcnhfcXVldWVfcmVzdG9jaworICogaWwzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2soKSBNb3ZlcyBhdmFpbGFibGUgYnVmZmVycyBmcm9tIHJ4X2ZyZWUgaW50byBSeAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsIHVwZGF0ZXMgZmlybXdhcmUgcG9pbnRlcnMsIGFuZCB1cGRhdGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgV1JJVEUgaWR4LiAgSWYgaW5zdWZmaWNpZW50IHJ4X2ZyZWUgYnVmZmVycworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGF2YWlsYWJsZSwgc2NoZWR1bGVzIGlsMzk0NV9yeF9yZXBsZW5pc2gKKyAqCisgKiAtLSBlbmFibGUgaW50ZXJydXB0cyAtLQorICogSVNSIC0gaWwzOTQ1X3J4KCkgICAgICAgICBEZXRhY2ggaWxfcnhfYnVmcyBmcm9tIHBvb2wgdXAgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFEIElEWCwgZGV0YWNoaW5nIHRoZSBTS0IgZnJvbSB0aGUgcG9vbC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVzIHRoZSBwYWNrZXQgYnVmZmVyIGZyb20gcXVldWUgdG8gcnhfdXNlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxzIGlsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrIHRvIHJlZmlsbCBhbnkgZW1wdHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzLgorICogLi4uCisgKgorICovCisKKy8qKgorICogaWwzOTQ1X2RtYV9hZGRyMnJiZF9wdHIgLSBjb252ZXJ0IGEgRE1BIGFkZHJlc3MgdG8gYSB1Q29kZSByZWFkIGJ1ZmZlciBwdHIKKyAqLworc3RhdGljIGlubGluZSBfX2xlMzIKK2lsMzk0NV9kbWFfYWRkcjJyYmRfcHRyKHN0cnVjdCBpbF9wcml2ICppbCwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gY3B1X3RvX2xlMzIoKHUzMikgZG1hX2FkZHIpOworfQorCisvKioKKyAqIGlsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrIC0gcmVmaWxsIFJYIHF1ZXVlIGZyb20gcHJlLWFsbG9jYXRlZCBwb29sCisgKgorICogSWYgdGhlcmUgYXJlIHNsb3RzIGluIHRoZSBSWCBxdWV1ZSB0aGF0IG5lZWQgdG8gYmUgcmVzdG9ja2VkLAorICogYW5kIHdlIGhhdmUgZnJlZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMsIGZpbGwgdGhlIHJhbmtzIGFzIG11Y2gKKyAqIGFzIHdlIGNhbiwgcHVsbGluZyBmcm9tIHJ4X2ZyZWUuCisgKgorICogVGhpcyBtb3ZlcyB0aGUgJ3dyaXRlJyBpZHggZm9yd2FyZCB0byBjYXRjaCB1cCB3aXRoICdwcm9jZXNzZWQnLCBhbmQKKyAqIGFsc28gdXBkYXRlcyB0aGUgbWVtb3J5IGFkZHJlc3MgaW4gdGhlIGZpcm13YXJlIHRvIHJlZmVyZW5jZSB0aGUgbmV3CisgKiB0YXJnZXQgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlzdHJ1Y3QgaWxfcnhfYnVmICpyeGI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgd3JpdGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJd3JpdGUgPSByeHEtPndyaXRlICYgfjB4NzsKKwl3aGlsZSAoaWxfcnhfcXVldWVfc3BhY2UocnhxKSA+IDAgJiYgcnhxLT5mcmVlX2NvdW50KSB7CisJCS8qIEdldCBuZXh0IGZyZWUgUnggYnVmZmVyLCByZW1vdmUgZnJvbSBmcmVlIGxpc3QgKi8KKwkJZWxlbWVudCA9IHJ4cS0+cnhfZnJlZS5uZXh0OworCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpbF9yeF9idWYsIGxpc3QpOworCQlsaXN0X2RlbChlbGVtZW50KTsKKworCQkvKiBQb2ludCB0byBSeCBidWZmZXIgdmlhIG5leHQgUkJEIGluIGNpcmN1bGFyIGJ1ZmZlciAqLworCQlyeHEtPmJkW3J4cS0+d3JpdGVdID0KKwkJICAgIGlsMzk0NV9kbWFfYWRkcjJyYmRfcHRyKGlsLCByeGItPnBhZ2VfZG1hKTsKKwkJcnhxLT5xdWV1ZVtyeHEtPndyaXRlXSA9IHJ4YjsKKwkJcnhxLT53cml0ZSA9IChyeHEtPndyaXRlICsgMSkgJiBSWF9RVUVVRV9NQVNLOworCQlyeHEtPmZyZWVfY291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJLyogSWYgdGhlIHByZS1hbGxvY2F0ZWQgYnVmZmVyIHBvb2wgaXMgZHJvcHBpbmcgbG93LCBzY2hlZHVsZSB0bworCSAqIHJlZmlsbCBpdCAqLworCWlmIChyeHEtPmZyZWVfY291bnQgPD0gUlhfTE9XX1dBVEVSTUFSSykKKwkJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJ4X3JlcGxlbmlzaCk7CisKKwkvKiBJZiB3ZSd2ZSBhZGRlZCBtb3JlIHNwYWNlIGZvciB0aGUgZmlybXdhcmUgdG8gcGxhY2UgZGF0YSwgdGVsbCBpdC4KKwkgKiBJbmNyZW1lbnQgZGV2aWNlJ3Mgd3JpdGUgcG9pbnRlciBpbiBtdWx0aXBsZXMgb2YgOC4gKi8KKwlpZiAocnhxLT53cml0ZV9hY3R1YWwgIT0gKHJ4cS0+d3JpdGUgJiB+MHg3KSB8fAorCSAgICBhYnMocnhxLT53cml0ZSAtIHJ4cS0+cmVhZCkgPiA3KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJcnhxLT5uZWVkX3VwZGF0ZSA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlpbF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKGlsLCByeHEpOworCX0KK30KKworLyoqCisgKiBpbDM5NDVfcnhfcmVwbGVuaXNoIC0gTW92ZSBhbGwgdXNlZCBwYWNrZXQgZnJvbSByeF91c2VkIHRvIHJ4X2ZyZWUKKyAqCisgKiBXaGVuIG1vdmluZyB0byByeF9mcmVlIGFuIFNLQiBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzbG90LgorICoKKyAqIEFsc28gcmVzdG9jayB0aGUgUnggcXVldWUgdmlhIGlsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrLgorICogVGhpcyBpcyBjYWxsZWQgYXMgYSBzY2hlZHVsZWQgd29yayBpdGVtIChleGNlcHQgZm9yIGR1cmluZyBpbml0aWFsaXphdGlvbikKKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9yeF9hbGxvY2F0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGdmcF90IHByaW9yaXR5KQoreworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlzdHJ1Y3QgaWxfcnhfYnVmICpyeGI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlnZnBfdCBnZnBfbWFzayA9IHByaW9yaXR5OworCisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAocnhxLT5mcmVlX2NvdW50ID4gUlhfTE9XX1dBVEVSTUFSSykKKwkJCWdmcF9tYXNrIHw9IF9fR0ZQX05PV0FSTjsKKworCQlpZiAoaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID4gMCkKKwkJCWdmcF9tYXNrIHw9IF9fR0ZQX0NPTVA7CisKKwkJLyogQWxsb2MgYSBuZXcgcmVjZWl2ZSBidWZmZXIgKi8KKwkJcGFnZSA9IGFsbG9jX3BhZ2VzKGdmcF9tYXNrLCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOworCQlpZiAoIXBhZ2UpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJRF9JTkZPKCJGYWlsZWQgdG8gYWxsb2NhdGUgU0tCIGJ1ZmZlci5cbiIpOworCQkJaWYgKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLICYmCisJCQkgICAgbmV0X3JhdGVsaW1pdCgpKQorCQkJCUlMX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIFNLQiBidWZmZXIgd2l0aCAlMHguIgorCQkJCSAgICAgICAiT25seSAldSBmcmVlIGJ1ZmZlcnMgcmVtYWluaW5nLlxuIiwKKwkJCQkgICAgICAgcHJpb3JpdHksIHJ4cS0+ZnJlZV9jb3VudCk7CisJCQkvKiBXZSBkb24ndCByZXNjaGVkdWxlIHJlcGxlbmlzaCB3b3JrIGhlcmUgLS0gd2Ugd2lsbAorCQkJICogY2FsbCB0aGUgcmVzdG9jayBtZXRob2QgYW5kIGlmIGl0IHN0aWxsIG5lZWRzCisJCQkgKiBtb3JlIGJ1ZmZlcnMgaXQgd2lsbCBzY2hlZHVsZSByZXBsZW5pc2ggKi8KKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlpZiAobGlzdF9lbXB0eSgmcnhxLT5yeF91c2VkKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCQlfX2ZyZWVfcGFnZXMocGFnZSwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKKwkJCXJldHVybjsKKwkJfQorCQllbGVtZW50ID0gcnhxLT5yeF91c2VkLm5leHQ7CisJCXJ4YiA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGlsX3J4X2J1ZiwgbGlzdCk7CisJCWxpc3RfZGVsKGVsZW1lbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlyeGItPnBhZ2UgPSBwYWdlOworCQkvKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBSQi9TS0IgKi8KKwkJcnhiLT5wYWdlX2RtYSA9CisJCSAgICBwY2lfbWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHBhZ2UsIDAsCisJCQkJIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7CisJCXJ4cS0+ZnJlZV9jb3VudCsrOworCQlpbC0+YWxsb2NfcnhiX3BhZ2UrKzsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3ZvaWQKK2lsMzk0NV9yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X2ZyZWUpOworCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X3VzZWQpOworCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspIHsKKwkJLyogSW4gdGhlIHJlc2V0IGZ1bmN0aW9uLCB0aGVzZSBidWZmZXJzIG1heSBoYXZlIGJlZW4gYWxsb2NhdGVkCisJCSAqIHRvIGFuIFNLQiwgc28gd2UgbmVlZCB0byB1bm1hcCBhbmQgZnJlZSBwb3RlbnRpYWwgc3RvcmFnZSAqLworCQlpZiAocnhxLT5wb29sW2ldLnBhZ2UgIT0gTlVMTCkgeworCQkJcGNpX3VubWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5wYWdlX2RtYSwKKwkJCQkgICAgICAgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCV9faWxfZnJlZV9wYWdlcyhpbCwgcnhxLT5wb29sW2ldLnBhZ2UpOworCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKKwl9CisKKwkvKiBTZXQgdXMgc28gdGhhdCB3ZSBoYXZlIHByb2Nlc3NlZCBhbmQgdXNlZCBhbGwgYnVmZmVycywgYnV0IGhhdmUKKwkgKiBub3QgcmVzdG9ja2VkIHRoZSBSeCBxdWV1ZSB3aXRoIGZyZXNoIGJ1ZmZlcnMgKi8KKwlyeHEtPnJlYWQgPSByeHEtPndyaXRlID0gMDsKKwlyeHEtPndyaXRlX2FjdHVhbCA9IDA7CisJcnhxLT5mcmVlX2NvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZAoraWwzOTQ1X3J4X3JlcGxlbmlzaCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlsMzk0NV9yeF9hbGxvY2F0ZShpbCwgR0ZQX0tFUk5FTCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbDM5NDVfcnhfcXVldWVfcmVzdG9jayhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbDM5NDVfcnhfYWxsb2NhdGUoaWwsIEdGUF9BVE9NSUMpOworCisJaWwzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2soaWwpOworfQorCisvKiBBc3N1bWVzIHRoYXQgdGhlIHNrYiBmaWVsZCBvZiB0aGUgYnVmZmVycyBpbiAncG9vbCcgaXMga2VwdCBhY2N1cmF0ZS4KKyAqIElmIGFuIFNLQiBoYXMgYmVlbiBkZXRhY2hlZCwgdGhlIFBPT0wgbmVlZHMgdG8gaGF2ZSBpdHMgU0tCIHNldCB0byBOVUxMCisgKiBUaGlzIGZyZWUgcm91dGluZSB3YWxrcyB0aGUgbGlzdCBvZiBQT09MIGVudHJpZXMgYW5kIGlmIFNLQiBpcyBzZXQgdG8KKyAqIG5vbiBOVUxMIGl0IGlzIHVubWFwcGVkIGFuZCBmcmVlZAorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3J4X3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRSArIFJYX0ZSRUVfQlVGRkVSUzsgaSsrKSB7CisJCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7CisJCQlwY2lfdW5tYXBfcGFnZShpbC0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAorCQkJCSAgICAgICBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJX19pbF9mcmVlX3BhZ2VzKGlsLCByeHEtPnBvb2xbaV0ucGFnZSk7CisJCQlyeHEtPnBvb2xbaV0ucGFnZSA9IE5VTEw7CisJCX0KKwl9CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgNCAqIFJYX1FVRVVFX1NJWkUsIHJ4cS0+YmQsCisJCQkgIHJ4cS0+YmRfZG1hKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBpbF9yYl9zdGF0dXMpLAorCQkJICByeHEtPnJiX3N0dHMsIHJ4cS0+cmJfc3R0c19kbWEpOworCXJ4cS0+YmQgPSBOVUxMOworCXJ4cS0+cmJfc3R0cyA9IE5VTEw7Cit9CisKKy8qIENvbnZlcnQgbGluZWFyIHNpZ25hbC10by1ub2lzZSByYXRpbyBpbnRvIGRCICovCitzdGF0aWMgdTggcmF0aW8yZEJbMTAwXSA9IHsKKy8qCSAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICovCisJMCwgMCwgNiwgMTAsIDEyLCAxNCwgMTYsIDE3LCAxOCwgMTksCS8qIDAwIC0gMDkgKi8KKwkyMCwgMjEsIDIyLCAyMiwgMjMsIDIzLCAyNCwgMjUsIDI2LCAyNiwJLyogMTAgLSAxOSAqLworCTI2LCAyNiwgMjYsIDI3LCAyNywgMjgsIDI4LCAyOCwgMjksIDI5LAkvKiAyMCAtIDI5ICovCisJMjksIDMwLCAzMCwgMzAsIDMxLCAzMSwgMzEsIDMxLCAzMiwgMzIsCS8qIDMwIC0gMzkgKi8KKwkzMiwgMzIsIDMyLCAzMywgMzMsIDMzLCAzMywgMzMsIDM0LCAzNCwJLyogNDAgLSA0OSAqLworCTM0LCAzNCwgMzQsIDM0LCAzNSwgMzUsIDM1LCAzNSwgMzUsIDM1LAkvKiA1MCAtIDU5ICovCisJMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM3LCAzNywgMzcsCS8qIDYwIC0gNjkgKi8KKwkzNywgMzcsIDM3LCAzNywgMzcsIDM4LCAzOCwgMzgsIDM4LCAzOCwJLyogNzAgLSA3OSAqLworCTM4LCAzOCwgMzgsIDM4LCAzOCwgMzksIDM5LCAzOSwgMzksIDM5LAkvKiA4MCAtIDg5ICovCisJMzksIDM5LCAzOSwgMzksIDM5LCA0MCwgNDAsIDQwLCA0MCwgNDAJLyogOTAgLSA5OSAqLworfTsKKworLyogQ2FsY3VsYXRlcyBhIHJlbGF0aXZlIGRCIHZhbHVlIGZyb20gYSByYXRpbyBvZiBsaW5lYXIKKyAqICAgKGkuZS4gbm90IGRCKSBzaWduYWwgbGV2ZWxzLgorICogQ29udmVyc2lvbiBhc3N1bWVzIHRoYXQgbGV2ZWxzIGFyZSB2b2x0YWdlcyAoMjAqbG9nKSwgbm90IHBvd2VycyAoMTAqbG9nKS4gKi8KK2ludAoraWwzOTQ1X2NhbGNfZGJfZnJvbV9yYXRpbyhpbnQgc2lnX3JhdGlvKQoreworCS8qIDEwMDA6MSBvciBoaWdoZXIganVzdCByZXBvcnQgYXMgNjAgZEIgKi8KKwlpZiAoc2lnX3JhdGlvID49IDEwMDApCisJCXJldHVybiA2MDsKKworCS8qIDEwMDoxIG9yIGhpZ2hlciwgZGl2aWRlIGJ5IDEwIGFuZCB1c2UgdGFibGUsCisJICogICBhZGQgMjAgZEIgdG8gbWFrZSB1cCBmb3IgZGl2aWRlIGJ5IDEwICovCisJaWYgKHNpZ19yYXRpbyA+PSAxMDApCisJCXJldHVybiAyMCArIChpbnQpcmF0aW8yZEJbc2lnX3JhdGlvIC8gMTBdOworCisJLyogV2Ugc2hvdWxkbid0IHNlZSB0aGlzICovCisJaWYgKHNpZ19yYXRpbyA8IDEpCisJCXJldHVybiAwOworCisJLyogVXNlIHRhYmxlIGZvciByYXRpb3MgMToxIC0gOTk6MSAqLworCXJldHVybiAoaW50KXJhdGlvMmRCW3NpZ19yYXRpb107Cit9CisKKy8qKgorICogaWwzOTQ1X3J4X2hhbmRsZSAtIE1haW4gZW50cnkgZnVuY3Rpb24gZm9yIHJlY2VpdmluZyByZXNwb25zZXMgZnJvbSB1Q29kZQorICoKKyAqIFVzZXMgdGhlIGlsLT5oYW5kbGVycyBjYWxsYmFjayBmdW5jdGlvbiBhcnJheSB0byBpbnZva2UKKyAqIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVycywgaW5jbHVkaW5nIGNvbW1hbmQgcmVzcG9uc2VzLAorICogZnJhbWUtcmVjZWl2ZWQgbm90aWZpY2F0aW9ucywgYW5kIG90aGVyIG5vdGlmaWNhdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfcnhfaGFuZGxlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfcnhfYnVmICpyeGI7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0OworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJdTMyIHIsIGk7CisJaW50IHJlY2xhaW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBmaWxsX3J4ID0gMDsKKwl1MzIgY291bnQgPSA4OworCWludCB0b3RhbF9lbXB0eSA9IDA7CisKKwkvKiB1Q29kZSdzIHJlYWQgaWR4IChzdG9yZWQgaW4gc2hhcmVkIERSQU0pIGluZGljYXRlcyB0aGUgbGFzdCBSeAorCSAqIGJ1ZmZlciB0aGF0IHRoZSBkcml2ZXIgbWF5IHByb2Nlc3MgKGxhc3QgYnVmZmVyIGZpbGxlZCBieSB1Y29kZSkuICovCisJciA9IGxlMTZfdG9fY3B1KHJ4cS0+cmJfc3R0cy0+Y2xvc2VkX3JiX251bSkgJiAweDBGRkY7CisJaSA9IHJ4cS0+cmVhZDsKKworCS8qIGNhbGN1bGF0ZSB0b3RhbCBmcmFtZXMgbmVlZCB0byBiZSByZXN0b2NrIGFmdGVyIGhhbmRsaW5nIFJYICovCisJdG90YWxfZW1wdHkgPSByIC0gcnhxLT53cml0ZV9hY3R1YWw7CisJaWYgKHRvdGFsX2VtcHR5IDwgMCkKKwkJdG90YWxfZW1wdHkgKz0gUlhfUVVFVUVfU0laRTsKKworCWlmICh0b3RhbF9lbXB0eSA+IChSWF9RVUVVRV9TSVpFIC8gMikpCisJCWZpbGxfcnggPSAxOworCS8qIFJ4IGludGVycnVwdCwgYnV0IG5vdGhpbmcgc2VudCBmcm9tIHVDb2RlICovCisJaWYgKGkgPT0gcikKKwkJRF9SWCgiciA9ICVkLCBpID0gJWRcbiIsIHIsIGkpOworCisJd2hpbGUgKGkgIT0gcikgeworCQlpbnQgbGVuOworCisJCXJ4YiA9IHJ4cS0+cXVldWVbaV07CisKKwkJLyogSWYgYW4gUlhCIGRvZXNuJ3QgaGF2ZSBhIFJ4IHF1ZXVlIHNsb3QgYXNzb2NpYXRlZCB3aXRoIGl0LAorCQkgKiB0aGVuIGEgYnVnIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gdGhlIHF1ZXVlIHJlZmlsbGluZworCQkgKiByb3V0aW5lcyAtLSBjYXRjaCBpdCBoZXJlICovCisJCUJVR19PTihyeGIgPT0gTlVMTCk7CisKKwkJcnhxLT5xdWV1ZVtpXSA9IE5VTEw7CisKKwkJcGNpX3VubWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4Yi0+cGFnZV9kbWEsCisJCQkgICAgICAgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwa3QgPSByeGJfYWRkcihyeGIpOworCisJCWxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgSUxfUlhfRlJBTUVfU0laRV9NU0s7CisJCWxlbiArPSBzaXplb2YodTMyKTsJLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KKworCQkvKiBSZWNsYWltIGEgY29tbWFuZCBidWZmZXIgb25seSBpZiB0aGlzIHBhY2tldCBpcyBhIHJlc3BvbnNlCisJCSAqICAgdG8gYSAoZHJpdmVyLW9yaWdpbmF0ZWQpIGNvbW1hbmQuCisJCSAqIElmIHRoZSBwYWNrZXQgKGUuZy4gUnggZnJhbWUpIG9yaWdpbmF0ZWQgZnJvbSB1Q29kZSwKKwkJICogICB0aGVyZSBpcyBubyBjb21tYW5kIGJ1ZmZlciB0byByZWNsYWltLgorCQkgKiBVY29kZSBzaG91bGQgc2V0IFNFUV9SWF9GUkFNRSBiaXQgaWYgdWNvZGUtb3JpZ2luYXRlZCwKKwkJICogICBidXQgYXBwYXJlbnRseSBhIGZldyBkb24ndCBnZXQgc2V0OyBjYXRjaCB0aGVtIGhlcmUuICovCisJCXJlY2xhaW0gPSAhKHBrdC0+aGRyLnNlcXVlbmNlICYgU0VRX1JYX0ZSQU1FKSAmJgorCQkgICAgcGt0LT5oZHIuY21kICE9IE5fU1RBVFMgJiYgcGt0LT5oZHIuY21kICE9IENfVFg7CisKKwkJLyogQmFzZWQgb24gdHlwZSBvZiBjb21tYW5kIHJlc3BvbnNlIG9yIG5vdGlmaWNhdGlvbiwKKwkJICogICBoYW5kbGUgdGhvc2UgdGhhdCBuZWVkIGhhbmRsaW5nIHZpYSBmdW5jdGlvbiBpbgorCQkgKiAgIGhhbmRsZXJzIHRhYmxlLiAgU2VlIGlsMzk0NV9zZXR1cF9oYW5kbGVycygpICovCisJCWlmIChpbC0+aGFuZGxlcnNbcGt0LT5oZHIuY21kXSkgeworCQkJRF9SWCgiciA9ICVkLCBpID0gJWQsICVzLCAweCUwMnhcbiIsIHIsIGksCisJCQkgICAgIGlsX2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksIHBrdC0+aGRyLmNtZCk7CisJCQlpbC0+aXNyX3N0YXRzLmhhbmRsZXJzW3BrdC0+aGRyLmNtZF0rKzsKKwkJCWlsLT5oYW5kbGVyc1twa3QtPmhkci5jbWRdIChpbCwgcnhiKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIGhhbmRsaW5nIG5lZWRlZCAqLworCQkJRF9SWCgiciAlZCBpICVkIE5vIGhhbmRsZXIgbmVlZGVkIGZvciAlcywgMHglMDJ4XG4iLCByLAorCQkJICAgICBpLCBpbF9nZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpLCBwa3QtPmhkci5jbWQpOworCQl9CisKKwkJLyoKKwkJICogWFhYOiBBZnRlciBoZXJlLCB3ZSBzaG91bGQgYWx3YXlzIGNoZWNrIHJ4Yi0+cGFnZQorCQkgKiBhZ2FpbnN0IE5VTEwgYmVmb3JlIHRvdWNoaW5nIGl0IG9yIGl0cyB2aXJ0dWFsCisJCSAqIG1lbW9yeSAocGt0KS4gQmVjYXVzZSBzb21lIGhhbmRsZXIgbWlnaHQgaGF2ZQorCQkgKiBhbHJlYWR5IHRha2VuIG9yIGZyZWVkIHRoZSBwYWdlcy4KKwkJICovCisKKwkJaWYgKHJlY2xhaW0pIHsKKwkJCS8qIEludm9rZSBhbnkgY2FsbGJhY2tzLCB0cmFuc2ZlciB0aGUgYnVmZmVyIHRvIGNhbGxlciwKKwkJCSAqIGFuZCBmaXJlIG9mZiB0aGUgKHBvc3NpYmx5KSBibG9ja2luZyBpbF9zZW5kX2NtZCgpCisJCQkgKiBhcyB3ZSByZWNsYWltIHRoZSBkcml2ZXIgY29tbWFuZCBxdWV1ZSAqLworCQkJaWYgKHJ4Yi0+cGFnZSkKKwkJCQlpbF90eF9jbWRfY29tcGxldGUoaWwsIHJ4Yik7CisJCQllbHNlCisJCQkJSUxfV0FSTigiQ2xhaW0gbnVsbCByeGI/XG4iKTsKKwkJfQorCisJCS8qIFJldXNlIHRoZSBwYWdlIGlmIHBvc3NpYmxlLiBGb3Igbm90aWZpY2F0aW9uIHBhY2tldHMgYW5kCisJCSAqIFNLQnMgdGhhdCBmYWlsIHRvIFJ4IGNvcnJlY3RseSwgYWRkIHRoZW0gYmFjayBpbnRvIHRoZQorCQkgKiByeF9mcmVlIGxpc3QgZm9yIHJldXNlIGxhdGVyLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCWlmIChyeGItPnBhZ2UgIT0gTlVMTCkgeworCQkJcnhiLT5wYWdlX2RtYSA9CisJCQkgICAgcGNpX21hcF9wYWdlKGlsLT5wY2lfZGV2LCByeGItPnBhZ2UsIDAsCisJCQkJCSBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy4KKwkJCQkJIHJ4X3BhZ2Vfb3JkZXIsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOworCQkJcnhxLT5mcmVlX2NvdW50Kys7CisJCX0gZWxzZQorCQkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcnhxLT5yeF91c2VkKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlpID0gKGkgKyAxKSAmIFJYX1FVRVVFX01BU0s7CisJCS8qIElmIHRoZXJlIGFyZSBhIGxvdCBvZiB1bnVzZWQgZnJhbWVzLAorCQkgKiByZXN0b2NrIHRoZSBSeCBxdWV1ZSBzbyB1Y29kZSB3b24ndCBhc3NlcnQuICovCisJCWlmIChmaWxsX3J4KSB7CisJCQljb3VudCsrOworCQkJaWYgKGNvdW50ID49IDgpIHsKKwkJCQlyeHEtPnJlYWQgPSBpOworCQkJCWlsMzk0NV9yeF9yZXBsZW5pc2hfbm93KGlsKTsKKwkJCQljb3VudCA9IDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBCYWNrdHJhY2sgb25lIGVudHJ5ICovCisJcnhxLT5yZWFkID0gaTsKKwlpZiAoZmlsbF9yeCkKKwkJaWwzOTQ1X3J4X3JlcGxlbmlzaF9ub3coaWwpOworCWVsc2UKKwkJaWwzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2soaWwpOworfQorCisvKiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZmx1c2ggYW55IHNjaGVkdWxlZCB0YXNrbGV0ICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsMzk0NV9zeW5jaHJvbml6ZV9pcnEoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIHdhaXQgdG8gbWFrZSBzdXJlIHdlIGZsdXNoIHBlbmRpbmcgdGFza2xldCAqLworCXN5bmNocm9uaXplX2lycShpbC0+cGNpX2Rldi0+aXJxKTsKKwl0YXNrbGV0X2tpbGwoJmlsLT5pcnFfdGFza2xldCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2lsMzk0NV9kZXNjX2xvb2t1cChpbnQgaSkKK3sKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDE6CisJCXJldHVybiAiRkFJTCI7CisJY2FzZSAyOgorCQlyZXR1cm4gIkJBRF9QQVJBTSI7CisJY2FzZSAzOgorCQlyZXR1cm4gIkJBRF9DSEVDS1NVTSI7CisJY2FzZSA0OgorCQlyZXR1cm4gIk5NSV9JTlRFUlJVUFQiOworCWNhc2UgNToKKwkJcmV0dXJuICJTWVNBU1NFUlQiOworCWNhc2UgNjoKKwkJcmV0dXJuICJGQVRBTF9FUlJPUiI7CisJfQorCisJcmV0dXJuICJVTktOT1dOIjsKK30KKworI2RlZmluZSBFUlJPUl9TVEFSVF9PRkZTRVQgICgxICogc2l6ZW9mKHUzMikpCisjZGVmaW5lIEVSUk9SX0VMRU1fU0laRSAgICAgKDcgKiBzaXplb2YodTMyKSkKKwordm9pZAoraWwzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTMyIGk7CisJdTMyIGRlc2MsIHRpbWUsIGNvdW50LCBiYXNlLCBkYXRhMTsKKwl1MzIgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyOworCisJYmFzZSA9IGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlLmVycm9yX2V2ZW50X3RhYmxlX3B0cik7CisKKwlpZiAoIWlsMzk0NV9od192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CisJCUlMX0VSUigiTm90IHZhbGlkIGVycm9yIGxvZyBwb2ludGVyIDB4JTA4WFxuIiwgYmFzZSk7CisJCXJldHVybjsKKwl9CisKKwljb3VudCA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UpOworCisJaWYgKEVSUk9SX1NUQVJUX09GRlNFVCA8PSBjb3VudCAqIEVSUk9SX0VMRU1fU0laRSkgeworCQlJTF9FUlIoIlN0YXJ0IElXTCBFcnJvciBMb2cgRHVtcDpcbiIpOworCQlJTF9FUlIoIlN0YXR1czogMHglMDhsWCwgY291bnQ6ICVkXG4iLCBpbC0+c3RhdHVzLCBjb3VudCk7CisJfQorCisJSUxfRVJSKCJEZXNjICAgICAgIFRpbWUgICAgICAgYXNydFBDICBibGluazIgIgorCSAgICAgICAiaWxpbmsxICBubWlQQyAgIExpbmVcbiIpOworCWZvciAoaSA9IEVSUk9SX1NUQVJUX09GRlNFVDsKKwkgICAgIGkgPCAoY291bnQgKiBFUlJPUl9FTEVNX1NJWkUpICsgRVJST1JfU1RBUlRfT0ZGU0VUOworCSAgICAgaSArPSBFUlJPUl9FTEVNX1NJWkUpIHsKKwkJZGVzYyA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyBpKTsKKwkJdGltZSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyBpICsgMSAqIHNpemVvZih1MzIpKTsKKwkJYmxpbmsxID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIGkgKyAyICogc2l6ZW9mKHUzMikpOworCQlibGluazIgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgaSArIDMgKiBzaXplb2YodTMyKSk7CisJCWlsaW5rMSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyBpICsgNCAqIHNpemVvZih1MzIpKTsKKwkJaWxpbmsyID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIGkgKyA1ICogc2l6ZW9mKHUzMikpOworCQlkYXRhMSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyBpICsgNiAqIHNpemVvZih1MzIpKTsKKworCQlJTF9FUlIoIiUtMTNzICgweCVYKSAlMDEwdSAweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVggJXVcblxuIiwKKwkJICAgICAgIGlsMzk0NV9kZXNjX2xvb2t1cChkZXNjKSwgZGVzYywgdGltZSwgYmxpbmsxLCBibGluazIsCisJCSAgICAgICBpbGluazEsIGlsaW5rMiwgZGF0YTEpOworCX0KK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9pcnFfdGFza2xldChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTMyIGludGEsIGhhbmRsZWQgPSAwOworCXUzMiBpbnRhX2ZoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJdTMyIGludGFfbWFzazsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyB1Q29kZSBpbnRlcnJ1cHRzLgorCSAqIE5vdGU6ICBTb21lIGJpdHMgaW4gQ1NSX0lOVCBhcmUgIk9SIiBvZiBiaXRzIGluIENTUl9GSF9JTlRfU1RBVFVTLAorCSAqICBhbmQgd2lsbCBjbGVhciBvbmx5IHdoZW4gQ1NSX0ZIX0lOVF9TVEFUVVMgZ2V0cyBjbGVhcmVkLiAqLworCWludGEgPSBfaWxfcmQoaWwsIENTUl9JTlQpOworCV9pbF93cihpbCwgQ1NSX0lOVCwgaW50YSk7CisKKwkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyBmbG93LWhhbmRsZXIgKERNQSkgaW50ZXJydXB0cy4KKwkgKiBBbnkgbmV3IGludGVycnVwdHMgdGhhdCBoYXBwZW4gYWZ0ZXIgdGhpcywgZWl0aGVyIHdoaWxlIHdlJ3JlCisJICogaW4gdGhpcyB0YXNrbGV0LCBvciBsYXRlciwgd2lsbCBzaG93IHVwIGluIG5leHQgSVNSL3Rhc2tsZXQuICovCisJaW50YV9maCA9IF9pbF9yZChpbCwgQ1NSX0ZIX0lOVF9TVEFUVVMpOworCV9pbF93cihpbCwgQ1NSX0ZIX0lOVF9TVEFUVVMsIGludGFfZmgpOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaWYgKGlsX2dldF9kZWJ1Z19sZXZlbChpbCkgJiBJTF9ETF9JU1IpIHsKKwkJLyoganVzdCBmb3IgZGVidWcgKi8KKwkJaW50YV9tYXNrID0gX2lsX3JkKGlsLCBDU1JfSU5UX01BU0spOworCQlEX0lTUigiaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHhcbiIsIGludGEsCisJCSAgICAgIGludGFfbWFzaywgaW50YV9maCk7CisJfQorI2VuZGlmCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogU2luY2UgQ1NSX0lOVCBhbmQgQ1NSX0ZIX0lOVF9TVEFUVVMgcmVhZHMgYW5kIGNsZWFycyBhcmUgbm90CisJICogYXRvbWljLCBtYWtlIHN1cmUgdGhhdCBpbnRhIGNvdmVycyBhbGwgdGhlIGludGVycnVwdHMgdGhhdAorCSAqIHdlJ3ZlIGRpc2NvdmVyZWQsIGV2ZW4gaWYgRkggaW50ZXJydXB0IGNhbWUgaW4ganVzdCBhZnRlcgorCSAqIHJlYWRpbmcgQ1NSX0lOVC4gKi8KKwlpZiAoaW50YV9maCAmIENTUjM5X0ZIX0lOVF9SWF9NQVNLKQorCQlpbnRhIHw9IENTUl9JTlRfQklUX0ZIX1JYOworCWlmIChpbnRhX2ZoICYgQ1NSMzlfRkhfSU5UX1RYX01BU0spCisJCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7CisKKwkvKiBOb3cgc2VydmljZSBhbGwgaW50ZXJydXB0IGJpdHMgZGlzY292ZXJlZCBhYm92ZS4gKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX0hXX0VSUikgeworCQlJTF9FUlIoIkhhcmR3YXJlIGVycm9yIGRldGVjdGVkLiAgUmVzdGFydGluZy5cbiIpOworCisJCS8qIFRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLworCQlpbF9kaXNhYmxlX2ludGVycnVwdHMoaWwpOworCisJCWlsLT5pc3Jfc3RhdHMuaHcrKzsKKwkJaWxfaXJxX2hhbmRsZV9lcnJvcihpbCk7CisKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9IV19FUlI7CisKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIChJTF9ETF9JU1IpKSB7CisJCS8qIE5JQyBmaXJlcyB0aGlzLCBidXQgd2UgZG9uJ3QgdXNlIGl0LCByZWR1bmRhbnQgd2l0aCBXQUtFVVAgKi8KKwkJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9TQ0QpIHsKKwkJCURfSVNSKCJTY2hlZHVsZXIgZmluaXNoZWQgdG8gdHJhbnNtaXQgIgorCQkJICAgICAgInRoZSBmcmFtZS9mcmFtZXMuXG4iKTsKKwkJCWlsLT5pc3Jfc3RhdHMuc2NoKys7CisJCX0KKworCQkvKiBBbGl2ZSBub3RpZmljYXRpb24gdmlhIFJ4IGludGVycnVwdCB3aWxsIGRvIHRoZSByZWFsIHdvcmsgKi8KKwkJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9BTElWRSkgeworCQkJRF9JU1IoIkFsaXZlIGludGVycnVwdFxuIik7CisJCQlpbC0+aXNyX3N0YXRzLmFsaXZlKys7CisJCX0KKwl9CisjZW5kaWYKKwkvKiBTYWZlbHkgaWdub3JlIHRoZXNlIGJpdHMgZm9yIGRlYnVnIGNoZWNrcyBiZWxvdyAqLworCWludGEgJj0gfihDU1JfSU5UX0JJVF9TQ0QgfCBDU1JfSU5UX0JJVF9BTElWRSk7CisKKwkvKiBFcnJvciBkZXRlY3RlZCBieSB1Q29kZSAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU1dfRVJSKSB7CisJCUlMX0VSUigiTWljcm9jb2RlIFNXIGVycm9yIGRldGVjdGVkLiAiICJSZXN0YXJ0aW5nIDB4JVguXG4iLAorCQkgICAgICAgaW50YSk7CisJCWlsLT5pc3Jfc3RhdHMuc3crKzsKKwkJaWxfaXJxX2hhbmRsZV9lcnJvcihpbCk7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfU1dfRVJSOworCX0KKworCS8qIHVDb2RlIHdha2VzIHVwIGFmdGVyIHBvd2VyLWRvd24gc2xlZXAgKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX1dBS0VVUCkgeworCQlEX0lTUigiV2FrZXVwIGludGVycnVwdFxuIik7CisJCWlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoaWwsICZpbC0+cnhxKTsKKwkJaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoaWwsICZpbC0+dHhxWzBdKTsKKwkJaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoaWwsICZpbC0+dHhxWzFdKTsKKwkJaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoaWwsICZpbC0+dHhxWzJdKTsKKwkJaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoaWwsICZpbC0+dHhxWzNdKTsKKwkJaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoaWwsICZpbC0+dHhxWzRdKTsKKwkJaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoaWwsICZpbC0+dHhxWzVdKTsKKworCQlpbC0+aXNyX3N0YXRzLndha2V1cCsrOworCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1dBS0VVUDsKKwl9CisKKwkvKiBBbGwgdUNvZGUgY29tbWFuZCByZXNwb25zZXMsIGluY2x1ZGluZyBUeCBjb21tYW5kIHJlc3BvbnNlcywKKwkgKiBSeCAicmVzcG9uc2VzIiAoZnJhbWUtcmVjZWl2ZWQgbm90aWZpY2F0aW9uKSwgYW5kIG90aGVyCisJICogbm90aWZpY2F0aW9ucyBmcm9tIHVDb2RlIGNvbWUgdGhyb3VnaCBoZXJlKi8KKwlpZiAoaW50YSAmIChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKSkgeworCQlpbDM5NDVfcnhfaGFuZGxlKGlsKTsKKwkJaWwtPmlzcl9zdGF0cy5yeCsrOworCQloYW5kbGVkIHw9IChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKTsKKwl9CisKKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX0ZIX1RYKSB7CisJCURfSVNSKCJUeCBpbnRlcnJ1cHRcbiIpOworCQlpbC0+aXNyX3N0YXRzLnR4Kys7CisKKwkJX2lsX3dyKGlsLCBDU1JfRkhfSU5UX1NUQVRVUywgKDEgPDwgNikpOworCQlpbF93cihpbCwgRkgzOV9UQ1NSX0NSRURJVChGSDM5X1NSVkNfQ0hOTCksIDB4MCk7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7CisJfQorCisJaWYgKGludGEgJiB+aGFuZGxlZCkgeworCQlJTF9FUlIoIlVuaGFuZGxlZCBJTlRBIGJpdHMgMHglMDh4XG4iLCBpbnRhICYgfmhhbmRsZWQpOworCQlpbC0+aXNyX3N0YXRzLnVuaGFuZGxlZCsrOworCX0KKworCWlmIChpbnRhICYgfmlsLT5pbnRhX21hc2spIHsKKwkJSUxfV0FSTigiRGlzYWJsZWQgSU5UQSBiaXRzIDB4JTA4eCB3ZXJlIHBlbmRpbmdcbiIsCisJCQlpbnRhICYgfmlsLT5pbnRhX21hc2spOworCQlJTF9XQVJOKCIgICB3aXRoIGludGFfZmggPSAweCUwOHhcbiIsIGludGFfZmgpOworCX0KKworCS8qIFJlLWVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAqLworCWlmICh0ZXN0X2JpdChTX0lOVF9FTkFCTEVELCAmaWwtPnN0YXR1cykpCisJCWlsX2VuYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgKElMX0RMX0lTUikpIHsKKwkJaW50YSA9IF9pbF9yZChpbCwgQ1NSX0lOVCk7CisJCWludGFfbWFzayA9IF9pbF9yZChpbCwgQ1NSX0lOVF9NQVNLKTsKKwkJaW50YV9maCA9IF9pbF9yZChpbCwgQ1NSX0ZIX0lOVF9TVEFUVVMpOworCQlEX0lTUigiRW5kIGludGEgMHglMDh4LCBlbmFibGVkIDB4JTA4eCwgZmggMHglMDh4LCAiCisJCSAgICAgICJmbGFncyAweCUwOGx4XG4iLCBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgsIGZsYWdzKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIGludAoraWwzOTQ1X2dldF9jaGFubmVsc19mb3Jfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCSAgICAgdTggaXNfYWN0aXZlLCB1OCBuX3Byb2JlcywKKwkJCSAgICAgc3RydWN0IGlsMzk0NV9zY2FuX2NoYW5uZWwgKnNjYW5fY2gsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJdTE2IHBhc3NpdmVfZHdlbGwgPSAwOworCXUxNiBhY3RpdmVfZHdlbGwgPSAwOworCWludCBhZGRlZCwgaTsKKworCXNiYW5kID0gaWxfZ2V0X2h3X21vZGUoaWwsIGJhbmQpOworCWlmICghc2JhbmQpCisJCXJldHVybiAwOworCisJYWN0aXZlX2R3ZWxsID0gaWxfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKGlsLCBiYW5kLCBuX3Byb2Jlcyk7CisJcGFzc2l2ZV9kd2VsbCA9IGlsX2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUoaWwsIGJhbmQsIHZpZik7CisKKwlpZiAocGFzc2l2ZV9kd2VsbCA8PSBhY3RpdmVfZHdlbGwpCisJCXBhc3NpdmVfZHdlbGwgPSBhY3RpdmVfZHdlbGwgKyAxOworCisJZm9yIChpID0gMCwgYWRkZWQgPSAwOyBpIDwgaWwtPnNjYW5fcmVxdWVzdC0+bl9jaGFubmVsczsgaSsrKSB7CisJCWNoYW4gPSBpbC0+c2Nhbl9yZXF1ZXN0LT5jaGFubmVsc1tpXTsKKworCQlpZiAoY2hhbi0+YmFuZCAhPSBiYW5kKQorCQkJY29udGludWU7CisKKwkJc2Nhbl9jaC0+Y2hhbm5lbCA9IGNoYW4tPmh3X3ZhbHVlOworCisJCWNoX2luZm8gPSBpbF9nZXRfY2hhbm5lbF9pbmZvKGlsLCBiYW5kLCBzY2FuX2NoLT5jaGFubmVsKTsKKwkJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7CisJCQlEX1NDQU4oIkNoYW5uZWwgJWQgaXMgSU5WQUxJRCBmb3IgdGhpcyBiYW5kLlxuIiwKKwkJCSAgICAgICBzY2FuX2NoLT5jaGFubmVsKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYoYWN0aXZlX2R3ZWxsKTsKKwkJc2Nhbl9jaC0+cGFzc2l2ZV9kd2VsbCA9IGNwdV90b19sZTE2KHBhc3NpdmVfZHdlbGwpOworCQkvKiBJZiBwYXNzaXZlICwgc2V0IHVwIGZvciBhdXRvLXN3aXRjaAorCQkgKiAgYW5kIHVzZSBsb25nIGFjdGl2ZV9kd2VsbCB0aW1lLgorCQkgKi8KKwkJaWYgKCFpc19hY3RpdmUgfHwgaWxfaXNfY2hhbm5lbF9wYXNzaXZlKGNoX2luZm8pIHx8CisJCSAgICAoY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4pKSB7CisJCQlzY2FuX2NoLT50eXBlID0gMDsJLyogcGFzc2l2ZSAqLworCQkJaWYgKElMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKSA9PSAxKQorCQkJCXNjYW5fY2gtPmFjdGl2ZV9kd2VsbCA9CisJCQkJICAgIGNwdV90b19sZTE2KHBhc3NpdmVfZHdlbGwgLSAxKTsKKwkJfSBlbHNlIHsKKwkJCXNjYW5fY2gtPnR5cGUgPSAxOwkvKiBhY3RpdmUgKi8KKwkJfQorCisJCS8qIFNldCBkaXJlY3QgcHJvYmUgYml0cy4gVGhlc2UgbWF5IGJlIHVzZWQgYm90aCBmb3IgYWN0aXZlCisJCSAqIHNjYW4gY2hhbm5lbHMgKHByb2JlcyBnZXRzIHNlbnQgcmlnaHQgYXdheSksCisJCSAqIG9yIGZvciBwYXNzaXZlIGNoYW5uZWxzIChwcm9iZXMgZ2V0IHNlIHNlbnQgb25seSBhZnRlcgorCQkgKiBoZWFyaW5nIGNsZWFyIFJ4IHBhY2tldCkuKi8KKwkJaWYgKElMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKSA+PSAyKSB7CisJCQlpZiAobl9wcm9iZXMpCisJCQkJc2Nhbl9jaC0+dHlwZSB8PSBJTDM5X1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7CisJCX0gZWxzZSB7CisJCQkvKiB1Q29kZSB2MSBkb2VzIG5vdCBhbGxvdyBzZXR0aW5nIGRpcmVjdCBwcm9iZSBiaXRzIG9uCisJCQkgKiBwYXNzaXZlIGNoYW5uZWwuICovCisJCQlpZiAoKHNjYW5fY2gtPnR5cGUgJiAxKSAmJiBuX3Byb2JlcykKKwkJCQlzY2FuX2NoLT50eXBlIHw9IElMMzlfU0NBTl9QUk9CRV9NQVNLKG5fcHJvYmVzKTsKKwkJfQorCisJCS8qIFNldCB0eHBvd2VyIGxldmVscyB0byBkZWZhdWx0cyAqLworCQlzY2FuX2NoLT50cGMuZHNwX2F0dGVuID0gMTEwOworCQkvKiBzY2FuX3B3cl9pbmZvLT50cGMuZHNwX2F0dGVuOyAqLworCisJCS8qc2Nhbl9wd3JfaW5mby0+dHBjLnR4X2dhaW47ICovCisJCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQlzY2FuX2NoLT50cGMudHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICgzIDw8IDMpKSB8IDM7CisJCWVsc2UgeworCQkJc2Nhbl9jaC0+dHBjLnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoNSA8PCAzKSk7CisJCQkvKiBOT1RFOiBpZiB3ZSB3ZXJlIGRvaW5nIDZNYiBPRkRNIGZvciBzY2FucyB3ZSdkIHVzZQorCQkJICogcG93ZXIgbGV2ZWw6CisJCQkgKiBzY2FuX2NoLT50cGMudHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICgyIDw8IDMpKSB8IDM7CisJCQkgKi8KKwkJfQorCisJCURfU0NBTigiU2Nhbm5pbmcgJWQgWyVzICVkXVxuIiwgc2Nhbl9jaC0+Y2hhbm5lbCwKKwkJICAgICAgIChzY2FuX2NoLT50eXBlICYgMSkgPyAiQUNUSVZFIiA6ICJQQVNTSVZFIiwKKwkJICAgICAgIChzY2FuX2NoLT50eXBlICYgMSkgPyBhY3RpdmVfZHdlbGwgOiBwYXNzaXZlX2R3ZWxsKTsKKworCQlzY2FuX2NoKys7CisJCWFkZGVkKys7CisJfQorCisJRF9TQ0FOKCJ0b3RhbCBjaGFubmVscyB0byBzY2FuICVkXG4iLCBhZGRlZCk7CisJcmV0dXJuIGFkZGVkOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2luaXRfaHdfcmF0ZXMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGVzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlRfTEVHQUNZOyBpKyspIHsKKwkJcmF0ZXNbaV0uYml0cmF0ZSA9IGlsMzk0NV9yYXRlc1tpXS5pZWVlICogNTsKKwkJcmF0ZXNbaV0uaHdfdmFsdWUgPSBpOwkvKiBSYXRlIHNjYWxpbmcgd2lsbCB3b3JrIG9uIGlkeGVzICovCisJCXJhdGVzW2ldLmh3X3ZhbHVlX3Nob3J0ID0gaTsKKwkJcmF0ZXNbaV0uZmxhZ3MgPSAwOworCQlpZiAoaSA+IElMMzlfTEFTVF9PRkRNX1JBVEUgfHwgaSA8IElMX0ZJUlNUX09GRE1fUkFURSkgeworCQkJLyoKKwkJCSAqIElmIENDSyAhPSAxTSB0aGVuIHNldCBzaG9ydCBwcmVhbWJsZSByYXRlIGZsYWcuCisJCQkgKi8KKwkJCXJhdGVzW2ldLmZsYWdzIHw9CisJCQkgICAgKGlsMzk0NV9yYXRlc1tpXS5wbGNwID09CisJCQkgICAgIDEwKSA/IDAgOiBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHVDb2RlIGRvd25sb2FkIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpbDM5NDVfZGVhbGxvY191Y29kZV9wY2koc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9jb2RlKTsKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfZGF0YSk7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2RhdGFfYmFja3VwKTsKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfaW5pdCk7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXRfZGF0YSk7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2Jvb3QpOworfQorCisvKioKKyAqIGlsMzk0NV92ZXJpZnlfaW5zdF9mdWxsIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKKyAqICAgICBsb29raW5nIGF0IGFsbCBkYXRhLgorICovCitzdGF0aWMgaW50CitpbDM5NDVfdmVyaWZ5X2luc3RfZnVsbChzdHJ1Y3QgaWxfcHJpdiAqaWwsIF9fbGUzMiAqIGltYWdlLCB1MzIgbGVuKQoreworCXUzMiB2YWw7CisJdTMyIHNhdmVfbGVuID0gbGVuOworCWludCByYyA9IDA7CisJdTMyIGVycmNudDsKKworCURfSU5GTygidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOworCisJaWxfd3IoaWwsIEhCVVNfVEFSR19NRU1fUkFERFIsIElMMzlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOworCisJZXJyY250ID0gMDsKKwlmb3IgKDsgbGVuID4gMDsgbGVuIC09IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7CisJCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLworCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKKwkJICogaWYgSUxfRExfSU8gaXMgc2V0ICovCisJCXZhbCA9IF9pbF9yZChpbCwgSEJVU19UQVJHX01FTV9SREFUKTsKKwkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7CisJCQlJTF9FUlIoInVDb2RlIElOU1Qgc2VjdGlvbiBpcyBpbnZhbGlkIGF0ICIKKwkJCSAgICAgICAib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAorCQkJICAgICAgIHNhdmVfbGVuIC0gbGVuLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOworCQkJcmMgPSAtRUlPOworCQkJZXJyY250Kys7CisJCQlpZiAoZXJyY250ID49IDIwKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFlcnJjbnQpCisJCURfSU5GTygidWNvZGUgaW1hZ2UgaW4gSU5TVFJVQ1RJT04gbWVtb3J5IGlzIGdvb2RcbiIpOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGlsMzk0NV92ZXJpZnlfaW5zdF9zcGFyc2UgLSB2ZXJpZnkgcnVudGltZSB1Q29kZSBpbWFnZSBpbiBjYXJkIHZzLiBob3N0LAorICogICB1c2luZyBzYW1wbGUgZGF0YSAxMDAgYnl0ZXMgYXBhcnQuICBJZiB0aGVzZSBzYW1wbGUgcG9pbnRzIGFyZSBnb29kLAorICogICBpdCdzIGEgcHJldHR5IGdvb2QgYmV0IHRoYXQgZXZlcnl0aGluZyBiZXR3ZWVuIHRoZW0gaXMgZ29vZCwgdG9vLgorICovCitzdGF0aWMgaW50CitpbDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKHN0cnVjdCBpbF9wcml2ICppbCwgX19sZTMyICogaW1hZ2UsIHUzMiBsZW4pCit7CisJdTMyIHZhbDsKKwlpbnQgcmMgPSAwOworCXUzMiBlcnJjbnQgPSAwOworCXUzMiBpOworCisJRF9JTkZPKCJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDEwMCwgaW1hZ2UgKz0gMTAwIC8gc2l6ZW9mKHUzMikpIHsKKwkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCisJCS8qIE5PVEU6IFVzZSB0aGUgZGVidWdsZXNzIHJlYWQgc28gd2UgZG9uJ3QgZmxvb2Qga2VybmVsIGxvZworCQkgKiBpZiBJTF9ETF9JTyBpcyBzZXQgKi8KKwkJaWxfd3IoaWwsIEhCVVNfVEFSR19NRU1fUkFERFIsIGkgKyBJTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKKwkJdmFsID0gX2lsX3JkKGlsLCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpIHsKKyNpZiAwCQkJCS8qIEVuYWJsZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNlZSBkZXRhaWxzICovCisJCQlJTF9FUlIoInVDb2RlIElOU1Qgc2VjdGlvbiBpcyBpbnZhbGlkIGF0ICIKKwkJCSAgICAgICAib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLCBpLCB2YWwsCisJCQkgICAgICAgKmltYWdlKTsKKyNlbmRpZgorCQkJcmMgPSAtRUlPOworCQkJZXJyY250Kys7CisJCQlpZiAoZXJyY250ID49IDMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaWwzOTQ1X3ZlcmlmeV91Y29kZSAtIGRldGVybWluZSB3aGljaCBpbnN0cnVjdGlvbiBpbWFnZSBpcyBpbiBTUkFNLAorICogICAgYW5kIHZlcmlmeSBpdHMgY29udGVudHMKKyAqLworc3RhdGljIGludAoraWwzOTQ1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX19sZTMyICppbWFnZTsKKwl1MzIgbGVuOworCWludCByYyA9IDA7CisKKwkvKiBUcnkgYm9vdHN0cmFwICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9ib290LnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfYm9vdC5sZW47CisJcmMgPSBpbDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKGlsLCBpbWFnZSwgbGVuKTsKKwlpZiAocmMgPT0gMCkgeworCQlEX0lORk8oIkJvb3RzdHJhcCB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFRyeSBpbml0aWFsaXplICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9pbml0LnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfaW5pdC5sZW47CisJcmMgPSBpbDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKGlsLCBpbWFnZSwgbGVuKTsKKwlpZiAocmMgPT0gMCkgeworCQlEX0lORk8oIkluaXRpYWxpemUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgcnVudGltZS9wcm90b2NvbCAqLworCWltYWdlID0gKF9fbGUzMiAqKSBpbC0+dWNvZGVfY29kZS52X2FkZHI7CisJbGVuID0gaWwtPnVjb2RlX2NvZGUubGVuOworCXJjID0gaWwzOTQ1X3ZlcmlmeV9pbnN0X3NwYXJzZShpbCwgaW1hZ2UsIGxlbik7CisJaWYgKHJjID09IDApIHsKKwkJRF9JTkZPKCJSdW50aW1lIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJSUxfRVJSKCJOTyBWQUxJRCBVQ09ERSBJTUFHRSBJTiBJTlNUUlVDVElPTiBTUkFNISFcbiIpOworCisJLyogU2luY2Ugbm90aGluZyBzZWVtcyB0byBtYXRjaCwgc2hvdyBmaXJzdCBzZXZlcmFsIGRhdGEgZW50cmllcyBpbgorCSAqIGluc3RydWN0aW9uIFNSQU0sIHNvIG1heWJlIHZpc3VhbCBpbnNwZWN0aW9uIHdpbGwgZ2l2ZSBhIGNsdWUuCisJICogU2VsZWN0aW9uIG9mIGJvb3RzdHJhcCBpbWFnZSAodnMuIG90aGVyIGltYWdlcykgaXMgYXJiaXRyYXJ5LiAqLworCWltYWdlID0gKF9fbGUzMiAqKSBpbC0+dWNvZGVfYm9vdC52X2FkZHI7CisJbGVuID0gaWwtPnVjb2RlX2Jvb3QubGVuOworCXJjID0gaWwzOTQ1X3ZlcmlmeV9pbnN0X2Z1bGwoaWwsIGltYWdlLCBsZW4pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X25pY19zdGFydChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogUmVtb3ZlIGFsbCByZXNldHMgdG8gYWxsb3cgTklDIHRvIG9wZXJhdGUgKi8KKwlfaWxfd3IoaWwsIENTUl9SRVNFVCwgMCk7Cit9CisKKyNkZWZpbmUgSUwzOTQ1X1VDT0RFX0dFVChpdGVtKQkJCQkJCVwKK3N0YXRpYyB1MzIgaWwzOTQ1X3Vjb2RlX2dldF8jI2l0ZW0oY29uc3Qgc3RydWN0IGlsX3Vjb2RlX2hlYWRlciAqdWNvZGUpXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gbGUzMl90b19jcHUodWNvZGUtPnYxLml0ZW0pOwkJCQlcCit9CisKK3N0YXRpYyB1MzIKK2lsMzk0NV91Y29kZV9nZXRfaGVhZGVyX3NpemUodTMyIGFwaV92ZXIpCit7CisJcmV0dXJuIDI0OworfQorCitzdGF0aWMgdTggKgoraWwzOTQ1X3Vjb2RlX2dldF9kYXRhKGNvbnN0IHN0cnVjdCBpbF91Y29kZV9oZWFkZXIgKnVjb2RlKQoreworCXJldHVybiAodTggKikgdWNvZGUtPnYxLmRhdGE7Cit9CisKK0lMMzk0NV9VQ09ERV9HRVQoaW5zdF9zaXplKTsKK0lMMzk0NV9VQ09ERV9HRVQoZGF0YV9zaXplKTsKK0lMMzk0NV9VQ09ERV9HRVQoaW5pdF9zaXplKTsKK0lMMzk0NV9VQ09ERV9HRVQoaW5pdF9kYXRhX3NpemUpOworSUwzOTQ1X1VDT0RFX0dFVChib290X3NpemUpOworCisvKioKKyAqIGlsMzk0NV9yZWFkX3Vjb2RlIC0gUmVhZCB1Q29kZSBpbWFnZXMgZnJvbSBkaXNrIGZpbGUuCisgKgorICogQ29weSBpbnRvIGJ1ZmZlcnMgZm9yIGNhcmQgdG8gZmV0Y2ggdmlhIGJ1cy1tYXN0ZXJpbmcKKyAqLworc3RhdGljIGludAoraWwzOTQ1X3JlYWRfdWNvZGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWNvbnN0IHN0cnVjdCBpbF91Y29kZV9oZWFkZXIgKnVjb2RlOworCWludCByZXQgPSAtRUlOVkFMLCBpZHg7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZV9yYXc7CisJLyogZmlybXdhcmUgZmlsZSBuYW1lIGNvbnRhaW5zIHVDb2RlL2RyaXZlciBjb21wYXRpYmlsaXR5IHZlcnNpb24gKi8KKwljb25zdCBjaGFyICpuYW1lX3ByZSA9IGlsLT5jZmctPmZ3X25hbWVfcHJlOworCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWF4ID0gaWwtPmNmZy0+dWNvZGVfYXBpX21heDsKKwljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21pbiA9IGlsLT5jZmctPnVjb2RlX2FwaV9taW47CisJY2hhciBidWZbMjVdOworCXU4ICpzcmM7CisJc2l6ZV90IGxlbjsKKwl1MzIgYXBpX3ZlciwgaW5zdF9zaXplLCBkYXRhX3NpemUsIGluaXRfc2l6ZSwgaW5pdF9kYXRhX3NpemUsIGJvb3Rfc2l6ZTsKKworCS8qIEFzayBrZXJuZWwgZmlybXdhcmVfY2xhc3MgbW9kdWxlIHRvIGdldCB0aGUgYm9vdCBmaXJtd2FyZSBvZmYgZGlzay4KKwkgKiByZXF1ZXN0X2Zpcm13YXJlKCkgaXMgc3luY2hyb25vdXMsIGZpbGUgaXMgaW4gbWVtb3J5IG9uIHJldHVybi4gKi8KKwlmb3IgKGlkeCA9IGFwaV9tYXg7IGlkeCA+PSBhcGlfbWluOyBpZHgtLSkgeworCQlzcHJpbnRmKGJ1ZiwgIiVzJXUlcyIsIG5hbWVfcHJlLCBpZHgsICIudWNvZGUiKTsKKwkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmdWNvZGVfcmF3LCBidWYsICZpbC0+cGNpX2Rldi0+ZGV2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCUlMX0VSUigiJXMgZmlybXdhcmUgZmlsZSByZXEgZmFpbGVkOiAlZFxuIiwgYnVmLCByZXQpOworCQkJaWYgKHJldCA9PSAtRU5PRU5UKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZQorCQkJCWdvdG8gZXJyb3I7CisJCX0gZWxzZSB7CisJCQlpZiAoaWR4IDwgYXBpX21heCkKKwkJCQlJTF9FUlIoIkxvYWRlZCBmaXJtd2FyZSAlcywgIgorCQkJCSAgICAgICAid2hpY2ggaXMgZGVwcmVjYXRlZC4gIgorCQkJCSAgICAgICAiIFBsZWFzZSB1c2UgQVBJIHYldSBpbnN0ZWFkLlxuIiwgYnVmLAorCQkJCSAgICAgICBhcGlfbWF4KTsKKwkJCURfSU5GTygiR290IGZpcm13YXJlICclcycgZmlsZSAiCisJCQkgICAgICAgIiglemQgYnl0ZXMpIGZyb20gZGlza1xuIiwgYnVmLCB1Y29kZV9yYXctPnNpemUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGdvdCBhdCBsZWFzdCBvdXIgaGVhZGVyISAqLworCWlmICh1Y29kZV9yYXctPnNpemUgPCBpbDM5NDVfdWNvZGVfZ2V0X2hlYWRlcl9zaXplKDEpKSB7CisJCUlMX0VSUigiRmlsZSBzaXplIHdheSB0b28gc21hbGwhXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisKKwkvKiBEYXRhIGZyb20gdWNvZGUgZmlsZTogIGhlYWRlciBmb2xsb3dlZCBieSB1Q29kZSBpbWFnZXMgKi8KKwl1Y29kZSA9IChzdHJ1Y3QgaWxfdWNvZGVfaGVhZGVyICopdWNvZGVfcmF3LT5kYXRhOworCisJaWwtPnVjb2RlX3ZlciA9IGxlMzJfdG9fY3B1KHVjb2RlLT52ZXIpOworCWFwaV92ZXIgPSBJTF9VQ09ERV9BUEkoaWwtPnVjb2RlX3Zlcik7CisJaW5zdF9zaXplID0gaWwzOTQ1X3Vjb2RlX2dldF9pbnN0X3NpemUodWNvZGUpOworCWRhdGFfc2l6ZSA9IGlsMzk0NV91Y29kZV9nZXRfZGF0YV9zaXplKHVjb2RlKTsKKwlpbml0X3NpemUgPSBpbDM5NDVfdWNvZGVfZ2V0X2luaXRfc2l6ZSh1Y29kZSk7CisJaW5pdF9kYXRhX3NpemUgPSBpbDM5NDVfdWNvZGVfZ2V0X2luaXRfZGF0YV9zaXplKHVjb2RlKTsKKwlib290X3NpemUgPSBpbDM5NDVfdWNvZGVfZ2V0X2Jvb3Rfc2l6ZSh1Y29kZSk7CisJc3JjID0gaWwzOTQ1X3Vjb2RlX2dldF9kYXRhKHVjb2RlKTsKKworCS8qIGFwaV92ZXIgc2hvdWxkIG1hdGNoIHRoZSBhcGkgdmVyc2lvbiBmb3JtaW5nIHBhcnQgb2YgdGhlCisJICogZmlybXdhcmUgZmlsZW5hbWUgLi4uIGJ1dCB3ZSBkb24ndCBjaGVjayBmb3IgdGhhdCBhbmQgb25seSByZWx5CisJICogb24gdGhlIEFQSSB2ZXJzaW9uIHJlYWQgZnJvbSBmaXJtd2FyZSBoZWFkZXIgZnJvbSBoZXJlIG9uIGZvcndhcmQgKi8KKworCWlmIChhcGlfdmVyIDwgYXBpX21pbiB8fCBhcGlfdmVyID4gYXBpX21heCkgeworCQlJTF9FUlIoIkRyaXZlciB1bmFibGUgdG8gc3VwcG9ydCB5b3VyIGZpcm13YXJlIEFQSS4gIgorCQkgICAgICAgIkRyaXZlciBzdXBwb3J0cyB2JXUsIGZpcm13YXJlIGlzIHYldS5cbiIsIGFwaV9tYXgsCisJCSAgICAgICBhcGlfdmVyKTsKKwkJaWwtPnVjb2RlX3ZlciA9IDA7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCWlmIChhcGlfdmVyICE9IGFwaV9tYXgpCisJCUlMX0VSUigiRmlybXdhcmUgaGFzIG9sZCBBUEkgdmVyc2lvbi4gRXhwZWN0ZWQgJXUsICIKKwkJICAgICAgICJnb3QgJXUuIE5ldyBmaXJtd2FyZSBjYW4gYmUgb2J0YWluZWQgIgorCQkgICAgICAgImZyb20gaHR0cDovL3d3dy5pbnRlbGxpbnV4d2lyZWxlc3Mub3JnLlxuIiwgYXBpX21heCwKKwkJICAgICAgIGFwaV92ZXIpOworCisJSUxfSU5GTygibG9hZGVkIGZpcm13YXJlIHZlcnNpb24gJXUuJXUuJXUuJXVcbiIsCisJCUlMX1VDT0RFX01BSk9SKGlsLT51Y29kZV92ZXIpLCBJTF9VQ09ERV9NSU5PUihpbC0+dWNvZGVfdmVyKSwKKwkJSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpLCBJTF9VQ09ERV9TRVJJQUwoaWwtPnVjb2RlX3ZlcikpOworCisJc25wcmludGYoaWwtPmh3LT53aXBoeS0+ZndfdmVyc2lvbiwgc2l6ZW9mKGlsLT5ody0+d2lwaHktPmZ3X3ZlcnNpb24pLAorCQkgIiV1LiV1LiV1LiV1IiwgSUxfVUNPREVfTUFKT1IoaWwtPnVjb2RlX3ZlciksCisJCSBJTF9VQ09ERV9NSU5PUihpbC0+dWNvZGVfdmVyKSwgSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpLAorCQkgSUxfVUNPREVfU0VSSUFMKGlsLT51Y29kZV92ZXIpKTsKKworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIHVjb2RlIHZlcnNpb24gcmF3ID0gMHgleFxuIiwgaWwtPnVjb2RlX3Zlcik7CisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgcnVudGltZSBpbnN0IHNpemUgPSAldVxuIiwgaW5zdF9zaXplKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGRhdGEgc2l6ZSA9ICV1XG4iLCBkYXRhX3NpemUpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIGluaXQgaW5zdCBzaXplID0gJXVcbiIsIGluaXRfc2l6ZSk7CisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgaW5pdCBkYXRhIHNpemUgPSAldVxuIiwgaW5pdF9kYXRhX3NpemUpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIGJvb3QgaW5zdCBzaXplID0gJXVcbiIsIGJvb3Rfc2l6ZSk7CisKKwkvKiBWZXJpZnkgc2l6ZSBvZiBmaWxlIHZzLiBpbWFnZSBzaXplIGluZm8gaW4gZmlsZSdzIGhlYWRlciAqLworCWlmICh1Y29kZV9yYXctPnNpemUgIT0KKwkgICAgaWwzOTQ1X3Vjb2RlX2dldF9oZWFkZXJfc2l6ZShhcGlfdmVyKSArIGluc3Rfc2l6ZSArIGRhdGFfc2l6ZSArCisJICAgIGluaXRfc2l6ZSArIGluaXRfZGF0YV9zaXplICsgYm9vdF9zaXplKSB7CisKKwkJRF9JTkZPKCJ1Q29kZSBmaWxlIHNpemUgJXpkIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHNpemVcbiIsCisJCSAgICAgICB1Y29kZV9yYXctPnNpemUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZWxlYXNlOworCX0KKworCS8qIFZlcmlmeSB0aGF0IHVDb2RlIGltYWdlcyB3aWxsIGZpdCBpbiBjYXJkJ3MgU1JBTSAqLworCWlmIChpbnN0X3NpemUgPiBJTDM5X01BWF9JTlNUX1NJWkUpIHsKKwkJRF9JTkZPKCJ1Q29kZSBpbnN0ciBsZW4gJWQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwgaW5zdF9zaXplKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisKKwlpZiAoZGF0YV9zaXplID4gSUwzOV9NQVhfREFUQV9TSVpFKSB7CisJCURfSU5GTygidUNvZGUgZGF0YSBsZW4gJWQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwgZGF0YV9zaXplKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisJaWYgKGluaXRfc2l6ZSA+IElMMzlfTUFYX0lOU1RfU0laRSkgeworCQlEX0lORk8oInVDb2RlIGluaXQgaW5zdHIgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCisJCSAgICAgICBpbml0X3NpemUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZWxlYXNlOworCX0KKwlpZiAoaW5pdF9kYXRhX3NpemUgPiBJTDM5X01BWF9EQVRBX1NJWkUpIHsKKwkJRF9JTkZPKCJ1Q29kZSBpbml0IGRhdGEgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCisJCSAgICAgICBpbml0X2RhdGFfc2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCWlmIChib290X3NpemUgPiBJTDM5X01BWF9CU01fU0laRSkgeworCQlEX0lORk8oInVDb2RlIGJvb3QgaW5zdHIgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCisJCSAgICAgICBib290X3NpemUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZWxlYXNlOworCX0KKworCS8qIEFsbG9jYXRlIHVjb2RlIGJ1ZmZlcnMgZm9yIGNhcmQncyBidXMtbWFzdGVyIGxvYWRpbmcgLi4uICovCisKKwkvKiBSdW50aW1lIGluc3RydWN0aW9ucyBhbmQgMiBjb3BpZXMgb2YgZGF0YToKKwkgKiAxKSB1bm1vZGlmaWVkIGZyb20gZGlzaworCSAqIDIpIGJhY2t1cCBjYWNoZSBmb3Igc2F2ZS9yZXN0b3JlIGR1cmluZyBwb3dlci1kb3ducyAqLworCWlsLT51Y29kZV9jb2RlLmxlbiA9IGluc3Rfc2l6ZTsKKwlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2NvZGUpOworCisJaWwtPnVjb2RlX2RhdGEubGVuID0gZGF0YV9zaXplOworCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfZGF0YSk7CisKKwlpbC0+dWNvZGVfZGF0YV9iYWNrdXAubGVuID0gZGF0YV9zaXplOworCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfZGF0YV9iYWNrdXApOworCisJaWYgKCFpbC0+dWNvZGVfY29kZS52X2FkZHIgfHwgIWlsLT51Y29kZV9kYXRhLnZfYWRkciB8fAorCSAgICAhaWwtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkcikKKwkJZ290byBlcnJfcGNpX2FsbG9jOworCisJLyogSW5pdGlhbGl6YXRpb24gaW5zdHJ1Y3Rpb25zIGFuZCBkYXRhICovCisJaWYgKGluaXRfc2l6ZSAmJiBpbml0X2RhdGFfc2l6ZSkgeworCQlpbC0+dWNvZGVfaW5pdC5sZW4gPSBpbml0X3NpemU7CisJCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfaW5pdCk7CisKKwkJaWwtPnVjb2RlX2luaXRfZGF0YS5sZW4gPSBpbml0X2RhdGFfc2l6ZTsKKwkJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9pbml0X2RhdGEpOworCisJCWlmICghaWwtPnVjb2RlX2luaXQudl9hZGRyIHx8ICFpbC0+dWNvZGVfaW5pdF9kYXRhLnZfYWRkcikKKwkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKKwl9CisKKwkvKiBCb290c3RyYXAgKGluc3RydWN0aW9ucyBvbmx5LCBubyBkYXRhKSAqLworCWlmIChib290X3NpemUpIHsKKwkJaWwtPnVjb2RlX2Jvb3QubGVuID0gYm9vdF9zaXplOworCQlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2Jvb3QpOworCisJCWlmICghaWwtPnVjb2RlX2Jvb3Qudl9hZGRyKQorCQkJZ290byBlcnJfcGNpX2FsbG9jOworCX0KKworCS8qIENvcHkgaW1hZ2VzIGludG8gYnVmZmVycyBmb3IgY2FyZCdzIGJ1cy1tYXN0ZXIgcmVhZHMgLi4uICovCisKKwkvKiBSdW50aW1lIGluc3RydWN0aW9ucyAoZmlyc3QgYmxvY2sgb2YgZGF0YSBpbiBmaWxlKSAqLworCWxlbiA9IGluc3Rfc2l6ZTsKKwlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgdUNvZGUgaW5zdHIgbGVuICV6ZFxuIiwgbGVuKTsKKwltZW1jcHkoaWwtPnVjb2RlX2NvZGUudl9hZGRyLCBzcmMsIGxlbik7CisJc3JjICs9IGxlbjsKKworCURfSU5GTygidUNvZGUgaW5zdHIgYnVmIHZhZGRyID0gMHglcCwgcGFkZHIgPSAweCUwOHhcbiIsCisJICAgICAgIGlsLT51Y29kZV9jb2RlLnZfYWRkciwgKHUzMikgaWwtPnVjb2RlX2NvZGUucF9hZGRyKTsKKworCS8qIFJ1bnRpbWUgZGF0YSAoMm5kIGJsb2NrKQorCSAqIE5PVEU6ICBDb3B5IGludG8gYmFja3VwIGJ1ZmZlciB3aWxsIGJlIGRvbmUgaW4gaWwzOTQ1X3VwKCkgICovCisJbGVuID0gZGF0YV9zaXplOworCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSB1Q29kZSBkYXRhIGxlbiAlemRcbiIsIGxlbik7CisJbWVtY3B5KGlsLT51Y29kZV9kYXRhLnZfYWRkciwgc3JjLCBsZW4pOworCW1lbWNweShpbC0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyLCBzcmMsIGxlbik7CisJc3JjICs9IGxlbjsKKworCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyAoM3JkIGJsb2NrKSAqLworCWlmIChpbml0X3NpemUpIHsKKwkJbGVuID0gaW5pdF9zaXplOworCQlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBpbnN0ciBsZW4gJXpkXG4iLCBsZW4pOworCQltZW1jcHkoaWwtPnVjb2RlX2luaXQudl9hZGRyLCBzcmMsIGxlbik7CisJCXNyYyArPSBsZW47CisJfQorCisJLyogSW5pdGlhbGl6YXRpb24gZGF0YSAoNHRoIGJsb2NrKSAqLworCWlmIChpbml0X2RhdGFfc2l6ZSkgeworCQlsZW4gPSBpbml0X2RhdGFfc2l6ZTsKKwkJRF9JTkZPKCJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIGluaXQgZGF0YSBsZW4gJXpkXG4iLCBsZW4pOworCQltZW1jcHkoaWwtPnVjb2RlX2luaXRfZGF0YS52X2FkZHIsIHNyYywgbGVuKTsKKwkJc3JjICs9IGxlbjsKKwl9CisKKwkvKiBCb290c3RyYXAgaW5zdHJ1Y3Rpb25zICg1dGggYmxvY2spICovCisJbGVuID0gYm9vdF9zaXplOworCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBib290IGluc3RyIGxlbiAlemRcbiIsIGxlbik7CisJbWVtY3B5KGlsLT51Y29kZV9ib290LnZfYWRkciwgc3JjLCBsZW4pOworCisJLyogV2UgaGF2ZSBvdXIgY29waWVzIG5vdywgYWxsb3cgT1MgcmVsZWFzZSBpdHMgY29waWVzICovCisJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOworCXJldHVybiAwOworCitlcnJfcGNpX2FsbG9jOgorCUlMX0VSUigiZmFpbGVkIHRvIGFsbG9jYXRlIHBjaSBtZW1vcnlcbiIpOworCXJldCA9IC1FTk9NRU07CisJaWwzOTQ1X2RlYWxsb2NfdWNvZGVfcGNpKGlsKTsKKworZXJyX3JlbGVhc2U6CisJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOworCitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlsMzk0NV9zZXRfdWNvZGVfcHRycyAtIFNldCB1Q29kZSBhZGRyZXNzIGxvY2F0aW9uCisgKgorICogVGVsbCBpbml0aWFsaXphdGlvbiB1Q29kZSB3aGVyZSB0byBmaW5kIHJ1bnRpbWUgdUNvZGUuCisgKgorICogQlNNIHJlZ2lzdGVycyBpbml0aWFsbHkgY29udGFpbiBwb2ludGVycyB0byBpbml0aWFsaXphdGlvbiB1Q29kZS4KKyAqIFdlIG5lZWQgdG8gcmVwbGFjZSB0aGVtIHRvIGxvYWQgcnVudGltZSB1Q29kZSBpbnN0IGFuZCBkYXRhLAorICogYW5kIHRvIHNhdmUgcnVudGltZSBkYXRhIHdoZW4gcG93ZXJpbmcgZG93bi4KKyAqLworc3RhdGljIGludAoraWwzOTQ1X3NldF91Y29kZV9wdHJzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlkbWFfYWRkcl90IHBpbnN0OworCWRtYV9hZGRyX3QgcGRhdGE7CisKKwkvKiBiaXRzIDMxOjAgZm9yIDM5NDUgKi8KKwlwaW5zdCA9IGlsLT51Y29kZV9jb2RlLnBfYWRkcjsKKwlwZGF0YSA9IGlsLT51Y29kZV9kYXRhX2JhY2t1cC5wX2FkZHI7CisKKwkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIGltYWdlIHRvIGxvYWQgKi8KKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX1BUUl9SRUcsIHBpbnN0KTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX1BUUl9SRUcsIHBkYXRhKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsIGlsLT51Y29kZV9kYXRhLmxlbik7CisKKwkvKiBJbnN0IGJ5dGUgY291bnQgbXVzdCBiZSBsYXN0IHRvIHNldCB1cCwgYml0IDMxIHNpZ25hbHMgdUNvZGUKKwkgKiAgIHRoYXQgYWxsIG5ldyBwdHIvc2l6ZSBpbmZvIGlzIGluIHBsYWNlICovCisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fSU5TVF9CWVRFQ09VTlRfUkVHLAorCQkgICBpbC0+dWNvZGVfY29kZS5sZW4gfCBCU01fRFJBTV9JTlNUX0xPQUQpOworCisJRF9JTkZPKCJSdW50aW1lIHVDb2RlIHBvaW50ZXJzIGFyZSBzZXQuXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsMzk0NV9pbml0X2FsaXZlX3N0YXJ0IC0gQ2FsbGVkIGFmdGVyIE5fQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCisgKgorICogQ2FsbGVkIGFmdGVyIE5fQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkIGZyb20gImluaXRpYWxpemUiIHVDb2RlLgorICoKKyAqIFRlbGwgImluaXRpYWxpemUiIHVDb2RlIHRvIGdvIGFoZWFkIGFuZCBsb2FkIHRoZSBydW50aW1lIHVDb2RlLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X2luaXRfYWxpdmVfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIENoZWNrIGFsaXZlIHJlc3BvbnNlIGZvciAidmFsaWQiIHNpZ24gZnJvbSB1Q29kZSAqLworCWlmIChpbC0+Y2FyZF9hbGl2ZV9pbml0LmlzX3ZhbGlkICE9IFVDT0RFX1ZBTElEX09LKSB7CisJCS8qIFdlIGhhZCBhbiBlcnJvciBicmluZ2luZyB1cCB0aGUgaGFyZHdhcmUsIHNvIHRha2UgaXQKKwkJICogYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJJbml0aWFsaXplIEFsaXZlIGZhaWxlZC5cbiIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogQm9vdHN0cmFwIHVDb2RlIGhhcyBsb2FkZWQgaW5pdGlhbGl6ZSB1Q29kZSAuLi4gdmVyaWZ5IGluc3QgaW1hZ2UuCisJICogVGhpcyBpcyBhIHBhcmFub2lkIGNoZWNrLCBiZWNhdXNlIHdlIHdvdWxkIG5vdCBoYXZlIGdvdHRlbiB0aGUKKwkgKiAiaW5pdGlhbGl6ZSIgYWxpdmUgaWYgY29kZSB3ZXJlbid0IHByb3Blcmx5IGxvYWRlZC4gICovCisJaWYgKGlsMzk0NV92ZXJpZnlfdWNvZGUoaWwpKSB7CisJCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3YXMgYmFkOworCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCisJCURfSU5GTygiQmFkIFwiaW5pdGlhbGl6ZVwiIHVDb2RlIGxvYWQuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIFNlbmQgcG9pbnRlcnMgdG8gcHJvdG9jb2wvcnVudGltZSB1Q29kZSBpbWFnZSAuLi4gaW5pdCBjb2RlIHdpbGwKKwkgKiBsb2FkIGFuZCBsYXVuY2ggcnVudGltZSB1Q29kZSwgd2hpY2ggd2lsbCBzZW5kIHVzIGFub3RoZXIgIkFsaXZlIgorCSAqIG5vdGlmaWNhdGlvbi4gKi8KKwlEX0lORk8oIkluaXRpYWxpemF0aW9uIEFsaXZlIHJlY2VpdmVkLlxuIik7CisJaWYgKGlsMzk0NV9zZXRfdWNvZGVfcHRycyhpbCkpIHsKKwkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdvbid0IGhhcHBlbjsKKwkJICogdGFrZSBpdCBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlEX0lORk8oIkNvdWxkbid0IHNldCB1cCB1Q29kZSBwb2ludGVycy5cbiIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCXJldHVybjsKKworcmVzdGFydDoKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+cmVzdGFydCk7Cit9CisKKy8qKgorICogaWwzOTQ1X2FsaXZlX3N0YXJ0IC0gY2FsbGVkIGFmdGVyIE5fQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCisgKiAgICAgICAgICAgICAgICAgICBmcm9tIHByb3RvY29sL3J1bnRpbWUgdUNvZGUgKGluaXRpYWxpemF0aW9uIHVDb2RlJ3MKKyAqICAgICAgICAgICAgICAgICAgIEFsaXZlIGdldHMgaGFuZGxlZCBieSBpbDM5NDVfaW5pdF9hbGl2ZV9zdGFydCgpKS4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9hbGl2ZV9zdGFydChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHRoZXJtYWxfc3BpbiA9IDA7CisJdTMyIHJma2lsbDsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCURfSU5GTygiUnVudGltZSBBbGl2ZSByZWNlaXZlZC5cbiIpOworCisJaWYgKGlsLT5jYXJkX2FsaXZlLmlzX3ZhbGlkICE9IFVDT0RFX1ZBTElEX09LKSB7CisJCS8qIFdlIGhhZCBhbiBlcnJvciBicmluZ2luZyB1cCB0aGUgaGFyZHdhcmUsIHNvIHRha2UgaXQKKwkJICogYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJBbGl2ZSBmYWlsZWQuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIEluaXRpYWxpemUgdUNvZGUgaGFzIGxvYWRlZCBSdW50aW1lIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KKwkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQorCSAqICJydW50aW1lIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KKwlpZiAoaWwzOTQ1X3ZlcmlmeV91Y29kZShpbCkpIHsKKwkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7CisJCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJCYWQgcnVudGltZSB1Q29kZSBsb2FkLlxuIik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwlyZmtpbGwgPSBpbF9yZF9wcnBoKGlsLCBBUE1HX1JGS0lMTF9SRUcpOworCURfSU5GTygiUkZLSUxMIHN0YXR1czogMHgleFxuIiwgcmZraWxsKTsKKworCWlmIChyZmtpbGwgJiAweDEpIHsKKwkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCQkvKiBpZiBSRktJTEwgaXMgbm90IG9uLCB0aGVuIHdhaXQgZm9yIHRoZXJtYWwKKwkJICogc2Vuc29yIGluIGFkYXB0ZXIgdG8ga2ljayBpbiAqLworCQl3aGlsZSAoaWwzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShpbCkgPT0gMCkgeworCQkJdGhlcm1hbF9zcGluKys7CisJCQl1ZGVsYXkoMTApOworCQl9CisKKwkJaWYgKHRoZXJtYWxfc3BpbikKKwkJCURfSU5GTygiVGhlcm1hbCBjYWxpYnJhdGlvbiB0b29rICVkdXNcbiIsCisJCQkgICAgICAgdGhlcm1hbF9zcGluICogMTApOworCX0gZWxzZQorCQlzZXRfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCisJLyogQWZ0ZXIgdGhlIEFMSVZFIHJlc3BvbnNlLCB3ZSBjYW4gc2VuZCBjb21tYW5kcyB0byAzOTQ1IHVDb2RlICovCisJc2V0X2JpdChTX0FMSVZFLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBFbmFibGUgd2F0Y2hkb2cgdG8gbW9uaXRvciB0aGUgZHJpdmVyIHR4IHF1ZXVlcyAqLworCWlsX3NldHVwX3dhdGNoZG9nKGlsKTsKKworCWlmIChpbF9pc19yZmtpbGwoaWwpKQorCQlyZXR1cm47CisKKwlpZWVlODAyMTFfd2FrZV9xdWV1ZXMoaWwtPmh3KTsKKworCWlsLT5hY3RpdmVfcmF0ZSA9IFJBVEVTX01BU0tfMzk0NTsKKworCWlsX3Bvd2VyX3VwZGF0ZV9tb2RlKGlsLCB0cnVlKTsKKworCWlmIChpbF9pc19hc3NvY2lhdGVkKGlsKSkgeworCQlzdHJ1Y3QgaWwzOTQ1X3J4b25fY21kICphY3RpdmVfcnhvbiA9CisJCSAgICAoc3RydWN0IGlsMzk0NV9yeG9uX2NtZCAqKSgmY3R4LT5hY3RpdmUpOworCisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJfSBlbHNlIHsKKwkJLyogSW5pdGlhbGl6ZSBvdXIgcnhfY29uZmlnIGRhdGEgKi8KKwkJaWxfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhpbCwgY3R4KTsKKwl9CisKKwkvKiBDb25maWd1cmUgQmx1ZXRvb3RoIGRldmljZSBjb2V4aXN0ZW5jZSBzdXBwb3J0ICovCisJaWxfc2VuZF9idF9jb25maWcoaWwpOworCisJc2V0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBDb25maWd1cmUgdGhlIGFkYXB0ZXIgZm9yIHVuYXNzb2NpYXRlZCBvcGVyYXRpb24gKi8KKwlpbDM5NDVfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwlpbDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMoaWwpOworCisJRF9JTkZPKCJBTElWRSBwcm9jZXNzaW5nIGNvbXBsZXRlLlxuIik7CisJd2FrZV91cCgmaWwtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisKKwlyZXR1cm47CisKK3Jlc3RhcnQ6CisJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworfQorCitzdGF0aWMgdm9pZCBpbDM5NDVfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworc3RhdGljIHZvaWQKK19faWwzOTQ1X2Rvd24oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGV4aXRfcGVuZGluZzsKKworCURfSU5GTyhEUlZfTkFNRSAiIGlzIGdvaW5nIGRvd25cbiIpOworCisJaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMjAwKTsKKworCWV4aXRfcGVuZGluZyA9IHRlc3RfYW5kX3NldF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKworCS8qIFN0b3AgVFggcXVldWVzIHdhdGNoZG9nLiBXZSBuZWVkIHRvIGhhdmUgU19FWElUX1BFTkRJTkcgYml0IHNldAorCSAqIHRvIHByZXZlbnQgcmVhcm0gdGltZXIgKi8KKwlkZWxfdGltZXJfc3luYygmaWwtPndhdGNoZG9nKTsKKworCS8qIFN0YXRpb24gaW5mb3JtYXRpb24gd2lsbCBub3cgYmUgY2xlYXJlZCBpbiBkZXZpY2UgKi8KKwlpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhpbCwgTlVMTCk7CisJaWxfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhpbCk7CisJaWxfY2xlYXJfZHJpdmVyX3N0YXRpb25zKGlsKTsKKworCS8qIFVuYmxvY2sgYW55IHdhaXRpbmcgY2FsbHMgKi8KKwl3YWtlX3VwX2FsbCgmaWwtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisKKwkvKiBXaXBlIG91dCB0aGUgRVhJVF9QRU5ESU5HIHN0YXR1cyBiaXQgaWYgd2UgYXJlIG5vdCBhY3R1YWxseQorCSAqIGV4aXRpbmcgdGhlIG1vZHVsZSAqLworCWlmICghZXhpdF9wZW5kaW5nKQorCQljbGVhcl9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKworCS8qIHN0b3AgYW5kIHJlc2V0IHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IgKi8KKwlfaWxfd3IoaWwsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX05FVk9fUkVTRVQpOworCisJLyogdGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWxfZGlzYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsMzk0NV9zeW5jaHJvbml6ZV9pcnEoaWwpOworCisJaWYgKGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkKQorCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaWwtPmh3KTsKKworCS8qIElmIHdlIGhhdmUgbm90IHByZXZpb3VzbHkgY2FsbGVkIGlsMzk0NV9pbml0KCkgdGhlbgorCSAqIGNsZWFyIGFsbCBiaXRzIGJ1dCB0aGUgUkYgS2lsbCBiaXRzIGFuZCByZXR1cm4gKi8KKwlpZiAoIWlsX2lzX2luaXQoaWwpKSB7CisJCWlsLT5zdGF0dXMgPQorCQkgICAgdGVzdF9iaXQoU19SRl9LSUxMX0hXLAorCQkJICAgICAmaWwtPgorCQkJICAgICBzdGF0dXMpIDw8IFNfUkZfS0lMTF9IVyB8CisJCSAgICB0ZXN0X2JpdChTX0dFT19DT05GSUdVUkVELAorCQkJICAgICAmaWwtPgorCQkJICAgICBzdGF0dXMpIDw8IFNfR0VPX0NPTkZJR1VSRUQgfAorCQkgICAgdGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSA8PCBTX0VYSVRfUEVORElORzsKKwkJZ290byBleGl0OworCX0KKworCS8qIC4uLm90aGVyd2lzZSBjbGVhciBvdXQgYWxsIHRoZSBzdGF0dXMgYml0cyBidXQgdGhlIFJGIEtpbGwKKwkgKiBiaXQgYW5kIGNvbnRpbnVlIHRha2luZyB0aGUgTklDIGRvd24uICovCisJaWwtPnN0YXR1cyAmPQorCSAgICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsCisJCSAgICAgJmlsLT5zdGF0dXMpIDw8IFNfUkZfS0lMTF9IVyB8IHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsCisJCQkJCQkJICAgICAmaWwtPgorCQkJCQkJCSAgICAgc3RhdHVzKSA8PAorCSAgICBTX0dFT19DT05GSUdVUkVEIHwgdGVzdF9iaXQoU19GV19FUlJPUiwKKwkJCQkJJmlsLT4KKwkJCQkJc3RhdHVzKSA8PCBTX0ZXX0VSUk9SIHwKKwkgICAgdGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSA8PCBTX0VYSVRfUEVORElORzsKKworCWlsMzk0NV9od190eHFfY3R4X3N0b3AoaWwpOworCWlsMzk0NV9od19yeHFfc3RvcChpbCk7CisKKwkvKiBQb3dlci1kb3duIGRldmljZSdzIGJ1c21hc3RlciBETUEgY2xvY2tzICovCisJaWxfd3JfcHJwaChpbCwgQVBNR19DTEtfRElTX1JFRywgQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUKTsKKwl1ZGVsYXkoNSk7CisKKwkvKiBTdG9wIHRoZSBkZXZpY2UsIGFuZCBwdXQgaXQgaW4gbG93IHBvd2VyIHN0YXRlICovCisJaWxfYXBtX3N0b3AoaWwpOworCitleGl0OgorCW1lbXNldCgmaWwtPmNhcmRfYWxpdmUsIDAsIHNpemVvZihzdHJ1Y3QgaWxfYWxpdmVfcmVzcCkpOworCisJaWYgKGlsLT5iZWFjb25fc2tiKQorCQlkZXZfa2ZyZWVfc2tiKGlsLT5iZWFjb25fc2tiKTsKKwlpbC0+YmVhY29uX3NrYiA9IE5VTEw7CisKKwkvKiBjbGVhciBvdXQgYW55IGZyZWUgZnJhbWVzICovCisJaWwzOTQ1X2NsZWFyX2ZyZWVfZnJhbWVzKGlsKTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9kb3duKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCV9faWwzOTQ1X2Rvd24oaWwpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCWlsMzk0NV9jYW5jZWxfZGVmZXJyZWRfd29yayhpbCk7Cit9CisKKyNkZWZpbmUgTUFYX0hXX1JFU1RBUlRTIDUKKworc3RhdGljIGludAoraWwzOTQ1X2FsbG9jX2JjYXN0X3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggc3RhX2lkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCXN0YV9pZCA9IGlsX3ByZXBfc3RhdGlvbihpbCwgY3R4LCBpbF9iY2FzdF9hZGRyLCBmYWxzZSwgTlVMTCk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gcHJlcGFyZSBicm9hZGNhc3Qgc3RhdGlvblxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSUxfU1RBX0RSSVZFUl9BQ1RJVkU7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfQkNBU1Q7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX19pbDM5NDVfdXAoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYywgaTsKKworCXJjID0gaWwzOTQ1X2FsbG9jX2JjYXN0X3N0YXRpb24oaWwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpIHsKKwkJSUxfV0FSTigiRXhpdCBwZW5kaW5nOyB3aWxsIG5vdCBicmluZyB0aGUgTklDIHVwXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFpbC0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyIHx8ICFpbC0+dWNvZGVfZGF0YS52X2FkZHIpIHsKKwkJSUxfRVJSKCJ1Y29kZSBub3QgYXZhaWxhYmxlIGZvciBkZXZpY2UgYnJpbmcgdXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBJZiBwbGF0Zm9ybSdzIFJGX0tJTEwgc3dpdGNoIGlzIE5PVCBzZXQgdG8gS0lMTCAqLworCWlmIChfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykKKwkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCWVsc2UgeworCQlzZXRfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCQlJTF9XQVJOKCJSYWRpbyBkaXNhYmxlZCBieSBIVyBSRiBLaWxsIHN3aXRjaFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCV9pbF93cihpbCwgQ1NSX0lOVCwgMHhGRkZGRkZGRik7CisKKwlyYyA9IGlsMzk0NV9od19uaWNfaW5pdChpbCk7CisJaWYgKHJjKSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIGludCBuaWNcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7CisKKwkvKiBjbGVhciAoYWdhaW4pLCB0aGVuIGVuYWJsZSBob3N0IGludGVycnVwdHMgKi8KKwlfaWxfd3IoaWwsIENTUl9JTlQsIDB4RkZGRkZGRkYpOworCWlsX2VuYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKworCS8qIHJlYWxseSBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKKwlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOworCisJLyogQ29weSBvcmlnaW5hbCB1Y29kZSBkYXRhIGltYWdlIGZyb20gZGlzayBpbnRvIGJhY2t1cCBjYWNoZS4KKwkgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IncworCSAqIGRhdGEgU1JBTSBmb3IgYSBjbGVhbiBzdGFydCB3aGVuIHRoZSBydW50aW1lIHByb2dyYW0gZmlyc3QgbG9hZHMuICovCisJbWVtY3B5KGlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIGlsLT51Y29kZV9kYXRhLnZfYWRkciwKKwkgICAgICAgaWwtPnVjb2RlX2RhdGEubGVuKTsKKworCS8qIFdlIHJldHVybiBzdWNjZXNzIHdoZW4gd2UgcmVzdW1lIGZyb20gc3VzcGVuZCBhbmQgcmZfa2lsbCBpcyBvbi4gKi8KKwlpZiAodGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cykpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9IV19SRVNUQVJUUzsgaSsrKSB7CisKKwkJLyogbG9hZCBib290c3RyYXAgc3RhdGUgbWFjaGluZSwKKwkJICogbG9hZCBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHByb2Nlc3NvcidzIG1lbW9yeSwKKwkJICogcHJlcGFyZSB0byBsb2FkIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgKi8KKwkJcmMgPSBpbC0+Y2ZnLT5vcHMtPmxpYi0+bG9hZF91Y29kZShpbCk7CisKKwkJaWYgKHJjKSB7CisJCQlJTF9FUlIoIlVuYWJsZSB0byBzZXQgdXAgYm9vdHN0cmFwIHVDb2RlOiAlZFxuIiwgcmMpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBzdGFydCBjYXJkOyAiaW5pdGlhbGl6ZSIgd2lsbCBsb2FkIHJ1bnRpbWUgdWNvZGUgKi8KKwkJaWwzOTQ1X25pY19zdGFydChpbCk7CisKKwkJRF9JTkZPKERSVl9OQU1FICIgaXMgY29taW5nIHVwXG4iKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXRfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cyk7CisJX19pbDM5NDVfZG93bihpbCk7CisJY2xlYXJfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cyk7CisKKwkvKiB0cmllZCB0byByZXN0YXJ0IGFuZCBjb25maWcgdGhlIGRldmljZSBmb3IgYXMgbG9uZyBhcyBvdXIKKwkgKiBwYXRpZW5jZSBjb3VsZCB3aXRoc3RhbmQgKi8KKwlJTF9FUlIoIlVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZSBhZnRlciAlZCBhdHRlbXB0cy5cbiIsIGkpOworCXJldHVybiAtRUlPOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBXb3JrcXVldWUgY2FsbGJhY2tzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoraWwzOTQ1X2JnX2luaXRfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9CisJICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaWxfcHJpdiwgaW5pdF9hbGl2ZV9zdGFydC53b3JrKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCisJaWwzOTQ1X2luaXRfYWxpdmVfc3RhcnQoaWwpOworb3V0OgorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9iZ19hbGl2ZV9zdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0KKwkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCBhbGl2ZV9zdGFydC53b3JrKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCisJaWwzOTQ1X2FsaXZlX3N0YXJ0KGlsKTsKK291dDoKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKKy8qCisgKiAzOTQ1IGNhbm5vdCBpbnRlcnJ1cHQgZHJpdmVyIHdoZW4gaGFyZHdhcmUgcmYga2lsbCBzd2l0Y2ggdG9nZ2xlczsKKyAqIGRyaXZlciBtdXN0IHBvbGwgQ1NSX0dQX0NOVFJMX1JFRyByZWdpc3RlciBmb3IgY2hhbmdlLiAgVGhpcyByZWdpc3RlcgorICogKmlzKiByZWFkYWJsZSBldmVuIHdoZW4gZGV2aWNlIGhhcyBiZWVuIFNXX1JFU0VUIGludG8gbG93IHBvd2VyIG1vZGUKKyAqIChlLmcuIGR1cmluZyBSRiBLSUxMKS4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9yZmtpbGxfcG9sbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0KKwkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCBfMzk0NS5yZmtpbGxfcG9sbC53b3JrKTsKKwlib29sIG9sZF9yZmtpbGwgPSB0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwlib29sIG5ld19yZmtpbGwgPQorCSAgICAhKF9pbF9yZChpbCwgQ1NSX0dQX0NOVFJMKSAmIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKTsKKworCWlmIChuZXdfcmZraWxsICE9IG9sZF9yZmtpbGwpIHsKKwkJaWYgKG5ld19yZmtpbGwpCisJCQlzZXRfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCQllbHNlCisJCQljbGVhcl9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisKKwkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShpbC0+aHctPndpcGh5LCBuZXdfcmZraWxsKTsKKworCQlEX1JGX0tJTEwoIlJGX0tJTEwgYml0IHRvZ2dsZWQgdG8gJXMuXG4iLAorCQkJICBuZXdfcmZraWxsID8gImRpc2FibGUgcmFkaW8iIDogImVuYWJsZSByYWRpbyIpOworCX0KKworCS8qIEtlZXAgdGhpcyBydW5uaW5nLCBldmVuIGlmIHJhZGlvIG5vdyBlbmFibGVkLiAgVGhpcyB3aWxsIGJlCisJICogY2FuY2VsbGVkIGluIG1hY19zdGFydCgpIGlmIHN5c3RlbSBkZWNpZGVzIHRvIHN0YXJ0IGFnYWluICovCisJcXVldWVfZGVsYXllZF93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+XzM5NDUucmZraWxsX3BvbGwsCisJCQkgICByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKDIgKiBIWikpOworCit9CisKK2ludAoraWwzOTQ1X3JlcXVlc3Rfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gQ19TQ0FOLAorCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpbDM5NDVfc2Nhbl9jbWQpLAorCQkuZmxhZ3MgPSBDTURfU0laRV9IVUdFLAorCX07CisJc3RydWN0IGlsMzk0NV9zY2FuX2NtZCAqc2NhbjsKKwl1OCBuX3Byb2JlcyA9IDA7CisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCWJvb2wgaXNfYWN0aXZlID0gZmFsc2U7CisJaW50IHJldDsKKwl1MTYgbGVuOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWlmICghaWwtPnNjYW5fY21kKSB7CisJCWlsLT5zY2FuX2NtZCA9CisJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3NjYW5fY21kKSArIElMX01BWF9TQ0FOX1NJWkUsCisJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghaWwtPnNjYW5fY21kKSB7CisJCQlEX1NDQU4oIkZhaWwgdG8gYWxsb2NhdGUgc2NhbiBtZW1vcnlcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJc2NhbiA9IGlsLT5zY2FuX2NtZDsKKwltZW1zZXQoc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBpbDM5NDVfc2Nhbl9jbWQpICsgSUxfTUFYX1NDQU5fU0laRSk7CisKKwlzY2FuLT5xdWlldF9wbGNwX3RoID0gSUxfUExDUF9RVUlFVF9USFJFU0g7CisJc2Nhbi0+cXVpZXRfdGltZSA9IElMX0FDVElWRV9RVUlFVF9USU1FOworCisJaWYgKGlsX2lzX2Fzc29jaWF0ZWQoaWwpKSB7CisJCXUxNiBpbnRlcnZhbDsKKwkJdTMyIGV4dHJhOworCQl1MzIgc3VzcGVuZF90aW1lID0gMTAwOworCQl1MzIgc2Nhbl9zdXNwZW5kX3RpbWUgPSAxMDA7CisKKwkJRF9JTkZPKCJTY2FubmluZyB3aGlsZSBhc3NvY2lhdGVkLi4uXG4iKTsKKworCQlpbnRlcnZhbCA9IHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludDsKKworCQlzY2FuLT5zdXNwZW5kX3RpbWUgPSAwOworCQlzY2FuLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMigyMDAgKiAxMDI0KTsKKwkJaWYgKCFpbnRlcnZhbCkKKwkJCWludGVydmFsID0gc3VzcGVuZF90aW1lOworCQkvKgorCQkgKiBzdXNwZW5kIHRpbWUgZm9ybWF0OgorCQkgKiAgMC0xOTogYmVhY29uIGludGVydmFsIGluIHVzZWMgKHRpbWUgYmVmb3JlIGV4ZWMuKQorCQkgKiAyMC0yMzogMAorCQkgKiAyNC0zMTogbnVtYmVyIG9mIGJlYWNvbnMgKHN1c3BlbmQgYmV0d2VlbiBjaGFubmVscykKKwkJICovCisKKwkJZXh0cmEgPSAoc3VzcGVuZF90aW1lIC8gaW50ZXJ2YWwpIDw8IDI0OworCQlzY2FuX3N1c3BlbmRfdGltZSA9CisJCSAgICAweEZGMEZGRkZGICYgKGV4dHJhIHwgKChzdXNwZW5kX3RpbWUgJSBpbnRlcnZhbCkgKiAxMDI0KSk7CisKKwkJc2Nhbi0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl9zdXNwZW5kX3RpbWUpOworCQlEX1NDQU4oInN1c3BlbmRfdGltZSAweCVYIGJlYWNvbiBpbnRlcnZhbCAlZFxuIiwKKwkJICAgICAgIHNjYW5fc3VzcGVuZF90aW1lLCBpbnRlcnZhbCk7CisJfQorCisJaWYgKGlsLT5zY2FuX3JlcXVlc3QtPm5fc3NpZHMpIHsKKwkJaW50IGksIHAgPSAwOworCQlEX1NDQU4oIktpY2tpbmcgb2ZmIGFjdGl2ZSBzY2FuXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IGlsLT5zY2FuX3JlcXVlc3QtPm5fc3NpZHM7IGkrKykgeworCQkJLyogYWx3YXlzIGRvZXMgd2lsZGNhcmQgYW55d2F5ICovCisJCQlpZiAoIWlsLT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuKQorCQkJCWNvbnRpbnVlOworCQkJc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uaWQgPSBXTEFOX0VJRF9TU0lEOworCQkJc2Nhbi0+ZGlyZWN0X3NjYW5bcF0ubGVuID0KKwkJCSAgICBpbC0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbjsKKwkJCW1lbWNweShzY2FuLT5kaXJlY3Rfc2NhbltwXS5zc2lkLAorCQkJICAgICAgIGlsLT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWQsCisJCQkgICAgICAgaWwtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pOworCQkJbl9wcm9iZXMrKzsKKwkJCXArKzsKKwkJfQorCQlpc19hY3RpdmUgPSB0cnVlOworCX0gZWxzZQorCQlEX1NDQU4oIktpY2tpbmcgb2ZmIHBhc3NpdmUgc2Nhbi5cbiIpOworCisJLyogV2UgZG9uJ3QgYnVpbGQgYSBkaXJlY3Qgc2NhbiBwcm9iZSByZXF1ZXN0OyB0aGUgdUNvZGUgd2lsbCBkbworCSAqIHRoYXQgYmFzZWQgb24gdGhlIGRpcmVjdF9tYXNrIGFkZGVkIHRvIGVhY2ggY2hhbm5lbCBlbnRyeSAqLworCXNjYW4tPnR4X2NtZC50eF9mbGFncyA9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJc2Nhbi0+dHhfY21kLnN0YV9pZCA9IGlsLT5jdHguYmNhc3Rfc3RhX2lkOworCXNjYW4tPnR4X2NtZC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKKworCS8qIGZsYWdzICsgcmF0ZSBzZWxlY3Rpb24gKi8KKworCXN3aXRjaCAoaWwtPnNjYW5fYmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJc2Nhbi0+ZmxhZ3MgPSBSWE9OX0ZMR19CQU5EXzI0R19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0s7CisJCXNjYW4tPnR4X2NtZC5yYXRlID0gUkFURV8xTV9QTENQOworCQliYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgorCQlzY2FuLT50eF9jbWQucmF0ZSA9IFJBVEVfNk1fUExDUDsKKwkJYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX1dBUk4oIkludmFsaWQgc2NhbiBiYW5kXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiBJZiBhY3RpdmUgc2NhbmluZyBpcyByZXF1ZXN0ZWQgYnV0IGEgY2VydGFpbiBjaGFubmVsCisJICogaXMgbWFya2VkIHBhc3NpdmUsIHdlIGNhbiBkbyBhY3RpdmUgc2Nhbm5pbmcgaWYgd2UKKwkgKiBkZXRlY3QgdHJhbnNtaXNzaW9ucy4KKwkgKi8KKwlzY2FuLT5nb29kX0NSQ190aCA9CisJICAgIGlzX2FjdGl2ZSA/IElMX0dPT0RfQ1JDX1RIX0RFRkFVTFQgOiBJTF9HT09EX0NSQ19USF9ESVNBQkxFRDsKKworCWxlbiA9CisJICAgIGlsX2ZpbGxfcHJvYmVfcmVxKGlsLCAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2Nhbi0+ZGF0YSwKKwkJCSAgICAgIHZpZi0+YWRkciwgaWwtPnNjYW5fcmVxdWVzdC0+aWUsCisJCQkgICAgICBpbC0+c2Nhbl9yZXF1ZXN0LT5pZV9sZW4sCisJCQkgICAgICBJTF9NQVhfU0NBTl9TSVpFIC0gc2l6ZW9mKCpzY2FuKSk7CisJc2Nhbi0+dHhfY21kLmxlbiA9IGNwdV90b19sZTE2KGxlbik7CisKKwkvKiBzZWxlY3QgUnggYW50ZW5uYXMgKi8KKwlzY2FuLT5mbGFncyB8PSBpbDM5NDVfZ2V0X2FudGVubmFfZmxhZ3MoaWwpOworCisJc2Nhbi0+Y2hhbm5lbF9jb3VudCA9CisJICAgIGlsMzk0NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4oaWwsIGJhbmQsIGlzX2FjdGl2ZSwgbl9wcm9iZXMsCisJCQkJCSAodm9pZCAqKSZzY2FuLT5kYXRhW2xlbl0sIHZpZik7CisJaWYgKHNjYW4tPmNoYW5uZWxfY291bnQgPT0gMCkgeworCQlEX1NDQU4oImNoYW5uZWwgY291bnQgJWRcbiIsIHNjYW4tPmNoYW5uZWxfY291bnQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljbWQubGVuICs9CisJICAgIGxlMTZfdG9fY3B1KHNjYW4tPnR4X2NtZC5sZW4pICsKKwkgICAgc2Nhbi0+Y2hhbm5lbF9jb3VudCAqIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3NjYW5fY2hhbm5lbCk7CisJY21kLmRhdGEgPSBzY2FuOworCXNjYW4tPmxlbiA9IGNwdV90b19sZTE2KGNtZC5sZW4pOworCisJc2V0X2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKTsKKwlyZXQgPSBpbF9zZW5kX2NtZF9zeW5jKGlsLCAmY21kKTsKKwlpZiAocmV0KQorCQljbGVhcl9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZAoraWwzOTQ1X3Bvc3Rfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwkvKgorCSAqIFNpbmNlIHNldHRpbmcgdGhlIFJYT04gbWF5IGhhdmUgYmVlbiBkZWZlcnJlZCB3aGlsZQorCSAqIHBlcmZvcm1pbmcgdGhlIHNjYW4sIGZpcmUgb25lIG9mZiBpZiBuZWVkZWQKKwkgKi8KKwlpZiAobWVtY21wKCZjdHgtPnN0YWdpbmcsICZjdHgtPmFjdGl2ZSwgc2l6ZW9mKGN0eC0+c3RhZ2luZykpKQorCQlpbDM5NDVfY29tbWl0X3J4b24oaWwsIGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfYmdfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCByZXN0YXJ0KTsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNfRldfRVJST1IsICZpbC0+c3RhdHVzKSkgeworCQltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCQlpbC0+Y3R4LnZpZiA9IE5VTEw7CisJCWlsLT5pc19vcGVuID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQlpbDM5NDVfZG93bihpbCk7CisJCWllZWU4MDIxMV9yZXN0YXJ0X2h3KGlsLT5odyk7CisJfSBlbHNlIHsKKwkJaWwzOTQ1X2Rvd24oaWwpOworCisJCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKSB7CisJCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCQlyZXR1cm47CisJCX0KKworCQlfX2lsMzk0NV91cChpbCk7CisJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfYmdfcnhfcmVwbGVuaXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIHJ4X3JlcGxlbmlzaCk7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlsMzk0NV9yeF9yZXBsZW5pc2goaWwpOworb3V0OgorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKK30KKwordm9pZAoraWwzOTQ1X3Bvc3RfYXNzb2NpYXRlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlpZiAoIWN0eC0+dmlmIHx8ICFpbC0+aXNfb3BlbikKKwkJcmV0dXJuOworCisJRF9BU1NPQygiQXNzb2NpYXRlZCBhcyAlZCB0bzogJXBNXG4iLCBjdHgtPnZpZi0+YnNzX2NvbmYuYWlkLAorCQljdHgtPmFjdGl2ZS5ic3NpZF9hZGRyKTsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAyMDApOworCisJY29uZiA9ICZpbC0+aHctPmNvbmY7CisKKwljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJaWwzOTQ1X2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCisJcmMgPSBpbF9zZW5kX3J4b25fdGltaW5nKGlsLCBjdHgpOworCWlmIChyYykKKwkJSUxfV0FSTigiQ19SWE9OX1RJTUlORyBmYWlsZWQgLSAiICJBdHRlbXB0aW5nIHRvIGNvbnRpbnVlLlxuIik7CisKKwljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKKworCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IGNwdV90b19sZTE2KGN0eC0+dmlmLT5ic3NfY29uZi5haWQpOworCisJRF9BU1NPQygiYXNzb2MgaWQgJWQgYmVhY29uIGludGVydmFsICVkXG4iLCBjdHgtPnZpZi0+YnNzX2NvbmYuYWlkLAorCQljdHgtPnZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCk7CisKKwlpZiAoY3R4LT52aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkKKwkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKwllbHNlCisJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCisJaWYgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgeworCQlpZiAoY3R4LT52aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCQllbHNlCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCX0KKworCWlsMzk0NV9jb21taXRfcnhvbihpbCwgY3R4KTsKKworCXN3aXRjaCAoY3R4LT52aWYtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCWlsMzk0NV9yYXRlX3NjYWxlX2luaXQoaWwtPmh3LCBJTF9BUF9JRCk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCWlsMzk0NV9zZW5kX2JlYWNvbl9jbWQoaWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJTF9FUlIoIiVzIFNob3VsZCBub3QgYmUgY2FsbGVkIGluICVkIG1vZGVcbiIsIF9fZnVuY19fLAorCQkgICAgICAgY3R4LT52aWYtPnR5cGUpOworCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBVQ09ERV9SRUFEWV9USU1FT1VUCSgyICogSFopCisKK3N0YXRpYyBpbnQKK2lsMzk0NV9tYWNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJaW50IHJldDsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCS8qIHdlIHNob3VsZCBiZSB2ZXJpZnlpbmcgdGhlIGRldmljZSBpcyByZWFkeSB0byBiZSBvcGVuZWQgKi8KKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCisJLyogZmV0Y2ggdWNvZGUgZmlsZSBmcm9tIGRpc2ssIGFsbG9jIGFuZCBjb3B5IHRvIGJ1cy1tYXN0ZXIgYnVmZmVycyAuLi4KKwkgKiB1Y29kZSBmaWxlbmFtZSBhbmQgbWF4IHNpemVzIGFyZSBjYXJkLXNwZWNpZmljLiAqLworCisJaWYgKCFpbC0+dWNvZGVfY29kZS5sZW4pIHsKKwkJcmV0ID0gaWwzOTQ1X3JlYWRfdWNvZGUoaWwpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIkNvdWxkIG5vdCByZWFkIG1pY3JvY29kZTogJWRcbiIsIHJldCk7CisJCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCQlnb3RvIG91dF9yZWxlYXNlX2lycTsKKwkJfQorCX0KKworCXJldCA9IF9faWwzOTQ1X3VwKGlsKTsKKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCWlmIChyZXQpCisJCWdvdG8gb3V0X3JlbGVhc2VfaXJxOworCisJRF9JTkZPKCJTdGFydCBVUCB3b3JrLlxuIik7CisKKwkvKiBXYWl0IGZvciBTVEFSVF9BTElWRSBmcm9tIHVjb2RlLiBPdGhlcndpc2UgY2FsbGJhY2tzIGZyb20KKwkgKiBtYWM4MDIxMSB3aWxsIG5vdCBiZSBydW4gc3VjY2Vzc2Z1bGx5LiAqLworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChpbC0+d2FpdF9jb21tYW5kX3F1ZXVlLAorCQkJCSB0ZXN0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cyksCisJCQkJIFVDT0RFX1JFQURZX1RJTUVPVVQpOworCWlmICghcmV0KSB7CisJCWlmICghdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpKSB7CisJCQlJTF9FUlIoIldhaXQgZm9yIFNUQVJUX0FMSVZFIHRpbWVvdXQgYWZ0ZXIgJWRtcy5cbiIsCisJCQkgICAgICAgamlmZmllc190b19tc2VjcyhVQ09ERV9SRUFEWV9USU1FT1VUKSk7CisJCQlyZXQgPSAtRVRJTUVET1VUOworCQkJZ290byBvdXRfcmVsZWFzZV9pcnE7CisJCX0KKwl9CisKKwkvKiB1Y29kZSBpcyBydW5uaW5nIGFuZCB3aWxsIHNlbmQgcmZraWxsIG5vdGlmaWNhdGlvbnMsCisJICogbm8gbmVlZCB0byBwb2xsIHRoZSBraWxsc3dpdGNoIHN0YXRlIGFueW1vcmUgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbC0+XzM5NDUucmZraWxsX3BvbGwpOworCisJaWwtPmlzX29wZW4gPSAxOworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKKwlyZXR1cm4gMDsKKworb3V0X3JlbGVhc2VfaXJxOgorCWlsLT5pc19vcGVuID0gMDsKKwlEX01BQzgwMjExKCJsZWF2ZSAtIGZhaWxlZFxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCWlmICghaWwtPmlzX29wZW4pIHsKKwkJRF9NQUM4MDIxMSgibGVhdmUgLSBza2lwXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlsLT5pc19vcGVuID0gMDsKKworCWlsMzk0NV9kb3duKGlsKTsKKworCWZsdXNoX3dvcmtxdWV1ZShpbC0+d29ya3F1ZXVlKTsKKworCS8qIHN0YXJ0IHBvbGxpbmcgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgYWdhaW4gKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5fMzk0NS5yZmtpbGxfcG9sbCwKKwkJCSAgIHJvdW5kX2ppZmZpZXNfcmVsYXRpdmUoMiAqIEhaKSk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfbWFjX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJRF9UWCgiZGV2LT54bWl0KCVkIGJ5dGVzKSBhdCByYXRlIDB4JTAyeFxuIiwgc2tiLT5sZW4sCisJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKSktPmJpdHJhdGUpOworCisJaWYgKGlsMzk0NV90eF9za2IoaWwsIHNrYikpCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7Cit9CisKK3ZvaWQKK2lsMzk0NV9jb25maWdfYXAoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKKwlpbnQgcmMgPSAwOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCS8qIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGRvbmUgb25seSBhdCBBUCBicmluZyB1cCAqLworCWlmICghKGlsX2lzX2Fzc29jaWF0ZWQoaWwpKSkgeworCisJCS8qIFJYT04gLSB1bmFzc29jICh0byBzZXQgdGltaW5nIGNvbW1hbmQpICovCisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKwkJaWwzOTQ1X2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCisJCS8qIFJYT04gVGltaW5nICovCisJCXJjID0gaWxfc2VuZF9yeG9uX3RpbWluZyhpbCwgY3R4KTsKKwkJaWYgKHJjKQorCQkJSUxfV0FSTigiQ19SWE9OX1RJTUlORyBmYWlsZWQgLSAiCisJCQkJIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKKworCQljdHgtPnN0YWdpbmcuYXNzb2NfaWQgPSAwOworCisJCWlmICh2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCisJCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spIHsKKwkJCWlmICh2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KQorCQkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKKwkJCWVsc2UKKwkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCQl9CisJCS8qIHJlc3RvcmUgUlhPTiBhc3NvYyAqLworCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKKwkJaWwzOTQ1X2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCX0KKwlpbDM5NDVfc2VuZF9iZWFjb25fY21kKGlsKTsKK30KKworc3RhdGljIGludAoraWwzOTQ1X21hY19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKKwkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCWludCByZXQgPSAwOworCXU4IHN0YV9pZCA9IElMX0lOVkFMSURfU1RBVElPTjsKKwl1OCBzdGF0aWNfa2V5OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWYgKGlsMzk0NV9tb2RfcGFyYW1zLnN3X2NyeXB0bykgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIGh3Y3J5cHRvIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCS8qCisJICogVG8gc3VwcG9ydCBJQlNTIFJTTiwgZG9uJ3QgcHJvZ3JhbSBncm91cCBrZXlzIGluIElCU1MsIHRoZQorCSAqIGhhcmR3YXJlIHdpbGwgdGhlbiBub3QgYXR0ZW1wdCB0byBkZWNyeXB0IHRoZSBmcmFtZXMuCisJICovCisJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJgorCSAgICAhKGtleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfUEFJUldJU0UpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzdGF0aWNfa2V5ID0gIWlsX2lzX2Fzc29jaWF0ZWQoaWwpOworCisJaWYgKCFzdGF0aWNfa2V5KSB7CisJCXN0YV9pZCA9IGlsX3N0YV9pZF9vcl9icm9hZGNhc3QoaWwsICZpbC0+Y3R4LCBzdGEpOworCQlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMTAwKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTRVRfS0VZOgorCQlpZiAoc3RhdGljX2tleSkKKwkJCXJldCA9IGlsMzk0NV9zZXRfc3RhdGljX2tleShpbCwga2V5KTsKKwkJZWxzZQorCQkJcmV0ID0gaWwzOTQ1X3NldF9keW5hbWljX2tleShpbCwga2V5LCBzdGFfaWQpOworCQlEX01BQzgwMjExKCJlbmFibGUgaHdjcnlwdG8ga2V5XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBESVNBQkxFX0tFWToKKwkJaWYgKHN0YXRpY19rZXkpCisJCQlyZXQgPSBpbDM5NDVfcmVtb3ZlX3N0YXRpY19rZXkoaWwpOworCQllbHNlCisJCQlyZXQgPSBpbDM5NDVfY2xlYXJfc3RhX2tleV9pbmZvKGlsLCBzdGFfaWQpOworCQlEX01BQzgwMjExKCJkaXNhYmxlIGh3Y3J5cHRvIGtleVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWwzOTQ1X3N0YV9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlpbnQgcmV0OworCWJvb2wgaXNfYXAgPSB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKwl1OCBzdGFfaWQ7CisKKwlEX0lORk8oInJlY2VpdmVkIHJlcXVlc3QgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJRF9JTkZPKCJwcm9jZWVkaW5nIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwgc3RhLT5hZGRyKTsKKwlzdGFfcHJpdi0+Y29tbW9uLnN0YV9pZCA9IElMX0lOVkFMSURfU1RBVElPTjsKKworCXJldCA9CisJICAgIGlsX2FkZF9zdGF0aW9uX2NvbW1vbihpbCwgJmlsLT5jdHgsIHN0YS0+YWRkciwgaXNfYXAsIHN0YSwgJnN0YV9pZCk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE0gKCVkKVxuIiwgc3RhLT5hZGRyLCByZXQpOworCQkvKiBTaG91bGQgd2UgcmV0dXJuIHN1Y2Nlc3MgaWYgcmV0dXJuIGNvZGUgaXMgRUVYSVNUID8gKi8KKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gc3RhX2lkOworCisJLyogSW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgKi8KKwlEX0lORk8oIkluaXRpYWxpemluZyByYXRlIHNjYWxpbmcgZm9yIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCWlsMzk0NV9yc19yYXRlX2luaXQoaWwsIHN0YSwgc3RhX2lkKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKKwkJCXVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsIHU2NCBtdWx0aWNhc3QpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJX19sZTMyIGZpbHRlcl9vciA9IDAsIGZpbHRlcl9uYW5kID0gMDsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworI2RlZmluZSBDSEsodGVzdCwgZmxhZykJZG8geyBcCisJaWYgKCp0b3RhbF9mbGFncyAmICh0ZXN0KSkJCVwKKwkJZmlsdGVyX29yIHw9IChmbGFnKTsJCVwKKwllbHNlCQkJCQlcCisJCWZpbHRlcl9uYW5kIHw9IChmbGFnKTsJCVwKKwl9IHdoaWxlICgwKQorCisJRF9NQUM4MDIxMSgiRW50ZXI6IGNoYW5nZWQ6IDB4JXgsIHRvdGFsOiAweCV4XG4iLCBjaGFuZ2VkX2ZsYWdzLAorCQkgICAqdG90YWxfZmxhZ3MpOworCisJQ0hLKEZJRl9PVEhFUl9CU1MgfCBGSUZfUFJPTUlTQ19JTl9CU1MsIFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKKwlDSEsoRklGX0NPTlRST0wsIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyk7CisJQ0hLKEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDLCBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyk7CisKKyN1bmRlZiBDSEsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5maWx0ZXJfbmFuZDsKKwljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IGZpbHRlcl9vcjsKKworCS8qCisJICogTm90IGNvbW1pdHRpbmcgZGlyZWN0bHkgYmVjYXVzZSBoYXJkd2FyZSBjYW4gcGVyZm9ybSBhIHNjYW4sCisJICogYnV0IGV2ZW4gaWYgaHcgaXMgcmVhZHksIGNvbW1pdHRpbmcgaGVyZSBicmVha3MgZm9yIHNvbWUgcmVhc29uLAorCSAqIHdlJ2xsIGV2ZW50dWFsbHkgY29tbWl0IHRoZSBmaWx0ZXIgZmxhZ3MgY2hhbmdlIGFueXdheS4KKwkgKi8KKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCS8qCisJICogUmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIGlzIGFsd2F5cyBlbmFibGVkIGJ5IHRoZQorCSAqIGRlZmF1bHQgZmxhZ3Mgc2V0dXAgaW4gaWxfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZygpCisJICogc2luY2Ugd2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHByb2dyYW1taW5nIG11bHRpY2FzdAorCSAqIGZpbHRlcnMgaW50byB0aGUgZGV2aWNlLgorCSAqLworCSp0b3RhbF9mbGFncyAmPQorCSAgICBGSUZfT1RIRVJfQlNTIHwgRklGX0FMTE1VTFRJIHwgRklGX1BST01JU0NfSU5fQlNTIHwKKwkgICAgRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfCBGSUZfQ09OVFJPTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc3lzZnMgYXR0cmlidXRlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCisvKgorICogVGhlIGZvbGxvd2luZyBhZGRzIGEgbmV3IGF0dHJpYnV0ZSB0byB0aGUgc3lzZnMgcmVwcmVzZW50YXRpb24KKyAqIG9mIHRoaXMgZGV2aWNlIGRyaXZlciAoaS5lLiBhIG5ldyBmaWxlIGluIC9zeXMvYnVzL3BjaS9kcml2ZXJzL2l3bC8pCisgKiB1c2VkIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgbGV2ZWwuCisgKgorICogU2VlIHRoZSBsZXZlbCBkZWZpbml0aW9ucyBpbiBpd2wgZm9yIGRldGFpbHMuCisgKgorICogVGhlIGRlYnVnX2xldmVsIGJlaW5nIG1hbmFnZWQgdXNpbmcgc3lzZnMgYmVsb3cgaXMgYSBwZXIgZGV2aWNlIGRlYnVnCisgKiBsZXZlbCB0aGF0IGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIGRlYnVnIGxldmVsIGlmIGl0ICh0aGUgcGVyCisgKiBkZXZpY2UgZGVidWcgbGV2ZWwpIGlzIHNldC4KKyAqLworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zaG93X2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOFhcbiIsIGlsX2dldF9kZWJ1Z19sZXZlbChpbCkpOworfQorCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3N0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlJTF9JTkZPKCIlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CisJZWxzZSB7CisJCWlsLT5kZWJ1Z19sZXZlbCA9IHZhbDsKKwkJaWYgKGlsX2FsbG9jX3RyYWZmaWNfbWVtKGlsKSkKKwkJCUlMX0VSUigiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOworCX0KKwlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGRlYnVnX2xldmVsLCBTX0lXVVNSIHwgU19JUlVHTywgaWwzOTQ1X3Nob3dfZGVidWdfbGV2ZWwsCisJCSAgIGlsMzk0NV9zdG9yZV9kZWJ1Z19sZXZlbCk7CisKKyNlbmRpZiAvKiBDT05GSUdfSVdMRUdBQ1lfREVCVUcgKi8KKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpbDM5NDVfaHdfZ2V0X3RlbXBlcmF0dXJlKGlsKSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wZXJhdHVyZSwgU19JUlVHTywgaWwzOTQ1X3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfdHhfcG93ZXIoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGlsLT50eF9wb3dlcl91c2VyX2xtdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfdHhfcG93ZXIoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisJdTMyIHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7CisJaWYgKHAgPT0gYnVmKQorCQlJTF9JTkZPKCI6ICVzIGlzIG5vdCBpbiBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOworCWVsc2UKKwkJaWwzOTQ1X2h3X3JlZ19zZXRfdHhwb3dlcihpbCwgdmFsKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHR4X3Bvd2VyLCBTX0lXVVNSIHwgU19JUlVHTywgaWwzOTQ1X3Nob3dfdHhfcG93ZXIsCisJCSAgIGlsMzk0NV9zdG9yZV90eF9wb3dlcik7CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc2hvd19mbGFncyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA0WFxuIiwgY3R4LT5hY3RpdmUuZmxhZ3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3N0b3JlX2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJdTMyIGZsYWdzID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWYgKGxlMzJfdG9fY3B1KGN0eC0+c3RhZ2luZy5mbGFncykgIT0gZmxhZ3MpIHsKKwkJLyogQ2FuY2VsIGFueSBjdXJyZW50bHkgcnVubmluZyBzY2Fucy4uLiAqLworCQlpZiAoaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMTAwKSkKKwkJCUlMX1dBUk4oIkNvdWxkIG5vdCBjYW5jZWwgc2Nhbi5cbiIpOworCQllbHNlIHsKKwkJCURfSU5GTygiQ29tbWl0dGluZyByeG9uLmZsYWdzID0gMHglMDRYXG4iLCBmbGFncyk7CisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7CisJCQlpbDM5NDVfY29tbWl0X3J4b24oaWwsIGN0eCk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZmxhZ3MsIFNfSVdVU1IgfCBTX0lSVUdPLCBpbDM5NDVfc2hvd19mbGFncywKKwkJICAgaWwzOTQ1X3N0b3JlX2ZsYWdzKTsKKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zaG93X2ZpbHRlcl9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDRYXG4iLCBsZTMyX3RvX2NwdShjdHgtPmFjdGl2ZS5maWx0ZXJfZmxhZ3MpKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zdG9yZV9maWx0ZXJfZmxhZ3Moc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwl1MzIgZmlsdGVyX2ZsYWdzID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWYgKGxlMzJfdG9fY3B1KGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MpICE9IGZpbHRlcl9mbGFncykgeworCQkvKiBDYW5jZWwgYW55IGN1cnJlbnRseSBydW5uaW5nIHNjYW5zLi4uICovCisJCWlmIChpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAxMDApKQorCQkJSUxfV0FSTigiQ291bGQgbm90IGNhbmNlbCBzY2FuLlxuIik7CisJCWVsc2UgeworCQkJRF9JTkZPKCJDb21taXR0aW5nIHJ4b24uZmlsdGVyX2ZsYWdzID0gIiAiMHglMDRYXG4iLAorCQkJICAgICAgIGZpbHRlcl9mbGFncyk7CisJCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzID0gY3B1X3RvX2xlMzIoZmlsdGVyX2ZsYWdzKTsKKwkJCWlsMzk0NV9jb21taXRfcnhvbihpbCwgY3R4KTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihmaWx0ZXJfZmxhZ3MsIFNfSVdVU1IgfCBTX0lSVUdPLCBpbDM5NDVfc2hvd19maWx0ZXJfZmxhZ3MsCisJCSAgIGlsMzk0NV9zdG9yZV9maWx0ZXJfZmxhZ3MpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfbWVhc3VyZW1lbnQoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXN0cnVjdCBpbF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gbWVhc3VyZV9yZXBvcnQ7CisJdTMyIHNpemUgPSBzaXplb2YobWVhc3VyZV9yZXBvcnQpLCBsZW4gPSAwLCBvZnMgPSAwOworCXU4ICpkYXRhID0gKHU4ICopICZtZWFzdXJlX3JlcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWYgKCEoaWwtPm1lYXN1cmVtZW50X3N0YXR1cyAmIE1FQVNVUkVNRU5UX1JFQURZKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KCZtZWFzdXJlX3JlcG9ydCwgJmlsLT5tZWFzdXJlX3JlcG9ydCwgc2l6ZSk7CisJaWwtPm1lYXN1cmVtZW50X3N0YXR1cyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXdoaWxlIChzaXplICYmIFBBR0VfU0laRSAtIGxlbikgeworCQloZXhfZHVtcF90b19idWZmZXIoZGF0YSArIG9mcywgc2l6ZSwgMTYsIDEsIGJ1ZiArIGxlbiwKKwkJCQkgICBQQUdFX1NJWkUgLSBsZW4sIDEpOworCQlsZW4gPSBzdHJsZW4oYnVmKTsKKwkJaWYgKFBBR0VfU0laRSAtIGxlbikKKwkJCWJ1ZltsZW4rK10gPSAnXG4nOworCisJCW9mcyArPSAxNjsKKwkJc2l6ZSAtPSBtaW4oc2l6ZSwgMTZVKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3N0b3JlX21lYXN1cmVtZW50KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwlzdHJ1Y3QgaWVlZTgwMjExX21lYXN1cmVtZW50X3BhcmFtcyBwYXJhbXMgPSB7CisJCS5jaGFubmVsID0gbGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCksCisJCS5zdGFydF90aW1lID0gY3B1X3RvX2xlNjQoaWwtPl8zOTQ1Lmxhc3RfdHNmKSwKKwkJLmR1cmF0aW9uID0gY3B1X3RvX2xlMTYoMSksCisJfTsKKwl1OCB0eXBlID0gSUxfTUVBU1VSRV9CQVNJQzsKKwl1OCBidWZmZXJbMzJdOworCXU4IGNoYW5uZWw7CisKKwlpZiAoY291bnQpIHsKKwkJY2hhciAqcCA9IGJ1ZmZlcjsKKwkJc3RybmNweShidWZmZXIsIGJ1ZiwgbWluKHNpemVvZihidWZmZXIpLCBjb3VudCkpOworCQljaGFubmVsID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMCk7CisJCWlmIChjaGFubmVsKQorCQkJcGFyYW1zLmNoYW5uZWwgPSBjaGFubmVsOworCisJCXAgPSBidWZmZXI7CisJCXdoaWxlICgqcCAmJiAqcCAhPSAnICcpCisJCQlwKys7CisJCWlmICgqcCkKKwkJCXR5cGUgPSBzaW1wbGVfc3RydG91bChwICsgMSwgTlVMTCwgMCk7CisJfQorCisJRF9JTkZPKCJJbnZva2luZyBtZWFzdXJlbWVudCBvZiB0eXBlICVkIG9uICIgImNoYW5uZWwgJWQgKGZvciAnJXMnKVxuIiwKKwkgICAgICAgdHlwZSwgcGFyYW1zLmNoYW5uZWwsIGJ1Zik7CisJaWwzOTQ1X2dldF9tZWFzdXJlbWVudChpbCwgJnBhcmFtcywgdHlwZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihtZWFzdXJlbWVudCwgU19JUlVTUiB8IFNfSVdVU1IsIGlsMzk0NV9zaG93X21lYXN1cmVtZW50LAorCQkgICBpbDM5NDVfc3RvcmVfbWVhc3VyZW1lbnQpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3N0b3JlX3JldHJ5X3JhdGUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisKKwlpbC0+cmV0cnlfcmF0ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisJaWYgKGlsLT5yZXRyeV9yYXRlIDw9IDApCisJCWlsLT5yZXRyeV9yYXRlID0gMTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zaG93X3JldHJ5X3JhdGUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkIiwgaWwtPnJldHJ5X3JhdGUpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIocmV0cnlfcmF0ZSwgU19JV1VTUiB8IFNfSVJVU1IsIGlsMzk0NV9zaG93X3JldHJ5X3JhdGUsCisJCSAgIGlsMzk0NV9zdG9yZV9yZXRyeV9yYXRlKTsKKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zaG93X2NoYW5uZWxzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJLyogYWxsIHRoaXMgc2hpdCBkb2Vzbid0IGJlbG9uZyBpbnRvIHN5c2ZzIGFueXdheSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoY2hhbm5lbHMsIFNfSVJVU1IsIGlsMzk0NV9zaG93X2NoYW5uZWxzLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zaG93X2FudGVubmEoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaWwzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfYW50ZW5uYShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJaW50IGFudDsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChzc2NhbmYoYnVmLCAiJTFpIiwgJmFudCkgIT0gMSkgeworCQlEX0lORk8oIm5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIik7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwlpZiAoYW50ID49IDAgJiYgYW50IDw9IDIpIHsKKwkJRF9JTkZPKCJTZXR0aW5nIGFudGVubmEgc2VsZWN0IHRvICVkLlxuIiwgYW50KTsKKwkJaWwzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSA9IChlbnVtIGlsMzk0NV9hbnRlbm5hKWFudDsKKwl9IGVsc2UKKwkJRF9JTkZPKCJCYWQgYW50ZW5uYSBzZWxlY3QgdmFsdWUgJWQuXG4iLCBhbnQpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoYW50ZW5uYSwgU19JV1VTUiB8IFNfSVJVR08sIGlsMzk0NV9zaG93X2FudGVubmEsCisJCSAgIGlsMzk0NV9zdG9yZV9hbnRlbm5hKTsKKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zaG93X3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC1FQUdBSU47CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLCAoaW50KWlsLT5zdGF0dXMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzLCBTX0lSVUdPLCBpbDM5NDVfc2hvd19zdGF0dXMsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X2R1bXBfZXJyb3JfbG9nKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJY2hhciAqcCA9IChjaGFyICopYnVmOworCisJaWYgKHBbMF0gPT0gJzEnKQorCQlpbDM5NDVfZHVtcF9uaWNfZXJyb3JfbG9nKGlsKTsKKworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZHVtcF9lcnJvcnMsIFNfSVdVU1IsIE5VTEwsIGlsMzk0NV9kdW1wX2Vycm9yX2xvZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGRyaXZlciBzZXR1cCBhbmQgdGVhciBkb3duCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoraWwzOTQ1X3NldHVwX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShEUlZfTkFNRSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKworCUlOSVRfV09SSygmaWwtPnJlc3RhcnQsIGlsMzk0NV9iZ19yZXN0YXJ0KTsKKwlJTklUX1dPUksoJmlsLT5yeF9yZXBsZW5pc2gsIGlsMzk0NV9iZ19yeF9yZXBsZW5pc2gpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpbC0+aW5pdF9hbGl2ZV9zdGFydCwgaWwzOTQ1X2JnX2luaXRfYWxpdmVfc3RhcnQpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpbC0+YWxpdmVfc3RhcnQsIGlsMzk0NV9iZ19hbGl2ZV9zdGFydCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmlsLT5fMzk0NS5yZmtpbGxfcG9sbCwgaWwzOTQ1X3Jma2lsbF9wb2xsKTsKKworCWlsX3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayhpbCk7CisKKwlpbDM5NDVfaHdfc2V0dXBfZGVmZXJyZWRfd29yayhpbCk7CisKKwlpbml0X3RpbWVyKCZpbC0+d2F0Y2hkb2cpOworCWlsLT53YXRjaGRvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaWw7CisJaWwtPndhdGNoZG9nLmZ1bmN0aW9uID0gaWxfYmdfd2F0Y2hkb2c7CisKKwl0YXNrbGV0X2luaXQoJmlsLT5pcnFfdGFza2xldCwKKwkJICAgICAodm9pZCAoKikodW5zaWduZWQgbG9uZykpaWwzOTQ1X2lycV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKWlsKTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwzOTQ1X2h3X2NhbmNlbF9kZWZlcnJlZF93b3JrKGlsKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaWwtPmluaXRfYWxpdmVfc3RhcnQpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5hbGl2ZV9zdGFydCk7CisKKwlpbF9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKGlsKTsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlsMzk0NV9zeXNmc19lbnRyaWVzW10gPSB7CisJJmRldl9hdHRyX2FudGVubmEuYXR0ciwKKwkmZGV2X2F0dHJfY2hhbm5lbHMuYXR0ciwKKwkmZGV2X2F0dHJfZHVtcF9lcnJvcnMuYXR0ciwKKwkmZGV2X2F0dHJfZmxhZ3MuYXR0ciwKKwkmZGV2X2F0dHJfZmlsdGVyX2ZsYWdzLmF0dHIsCisJJmRldl9hdHRyX21lYXN1cmVtZW50LmF0dHIsCisJJmRldl9hdHRyX3JldHJ5X3JhdGUuYXR0ciwKKwkmZGV2X2F0dHJfc3RhdHVzLmF0dHIsCisJJmRldl9hdHRyX3RlbXBlcmF0dXJlLmF0dHIsCisJJmRldl9hdHRyX3R4X3Bvd2VyLmF0dHIsCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJJmRldl9hdHRyX2RlYnVnX2xldmVsLmF0dHIsCisjZW5kaWYKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpbDM5NDVfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gTlVMTCwJCS8qIHB1dCBpbiBkZXZpY2UgZGlyZWN0b3J5ICovCisJLmF0dHJzID0gaWwzOTQ1X3N5c2ZzX2VudHJpZXMsCit9OworCitzdHJ1Y3QgaWVlZTgwMjExX29wcyBpbDM5NDVfaHdfb3BzID0geworCS50eCA9IGlsMzk0NV9tYWNfdHgsCisJLnN0YXJ0ID0gaWwzOTQ1X21hY19zdGFydCwKKwkuc3RvcCA9IGlsMzk0NV9tYWNfc3RvcCwKKwkuYWRkX2ludGVyZmFjZSA9IGlsX21hY19hZGRfaW50ZXJmYWNlLAorCS5yZW1vdmVfaW50ZXJmYWNlID0gaWxfbWFjX3JlbW92ZV9pbnRlcmZhY2UsCisJLmNoYW5nZV9pbnRlcmZhY2UgPSBpbF9tYWNfY2hhbmdlX2ludGVyZmFjZSwKKwkuY29uZmlnID0gaWxfbWFjX2NvbmZpZywKKwkuY29uZmlndXJlX2ZpbHRlciA9IGlsMzk0NV9jb25maWd1cmVfZmlsdGVyLAorCS5zZXRfa2V5ID0gaWwzOTQ1X21hY19zZXRfa2V5LAorCS5jb25mX3R4ID0gaWxfbWFjX2NvbmZfdHgsCisJLnJlc2V0X3RzZiA9IGlsX21hY19yZXNldF90c2YsCisJLmJzc19pbmZvX2NoYW5nZWQgPSBpbF9tYWNfYnNzX2luZm9fY2hhbmdlZCwKKwkuaHdfc2NhbiA9IGlsX21hY19od19zY2FuLAorCS5zdGFfYWRkID0gaWwzOTQ1X21hY19zdGFfYWRkLAorCS5zdGFfcmVtb3ZlID0gaWxfbWFjX3N0YV9yZW1vdmUsCisJLnR4X2xhc3RfYmVhY29uID0gaWxfbWFjX3R4X2xhc3RfYmVhY29uLAorfTsKKworc3RhdGljIGludAoraWwzOTQ1X2luaXRfZHJ2KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpbDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCisJaWwtPnJldHJ5X3JhdGUgPSAxOworCWlsLT5iZWFjb25fc2tiID0gTlVMTDsKKworCXNwaW5fbG9ja19pbml0KCZpbC0+c3RhX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpbC0+aGNtZF9sb2NrKTsKKworCUlOSVRfTElTVF9IRUFEKCZpbC0+ZnJlZV9mcmFtZXMpOworCisJbXV0ZXhfaW5pdCgmaWwtPm11dGV4KTsKKworCWlsLT5pZWVlX2NoYW5uZWxzID0gTlVMTDsKKwlpbC0+aWVlZV9yYXRlcyA9IE5VTEw7CisJaWwtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOworCisJaWwtPml3X21vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOworCWlsLT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCA9IElMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX0RFRjsKKworCS8qIGluaXRpYWxpemUgZm9yY2UgcmVzZXQgKi8KKwlpbC0+Zm9yY2VfcmVzZXQucmVzZXRfZHVyYXRpb24gPSBJTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRDsKKworCWlmIChlZXByb20tPnZlcnNpb24gPCBFRVBST01fMzk0NV9FRVBST01fVkVSU0lPTikgeworCQlJTF9XQVJOKCJVbnN1cHBvcnRlZCBFRVBST00gdmVyc2lvbjogMHglMDRYXG4iLAorCQkJZWVwcm9tLT52ZXJzaW9uKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCXJldCA9IGlsX2luaXRfY2hhbm5lbF9tYXAoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJpbml0aWFsaXppbmcgcmVndWxhdG9yeSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBTZXQgdXAgdHhwb3dlciBzZXR0aW5ncyBpbiBkcml2ZXIgZm9yIGFsbCBjaGFubmVscyAqLworCWlmIChpbDM5NDVfdHhwb3dlcl9zZXRfZnJvbV9lZXByb20oaWwpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX2ZyZWVfY2hhbm5lbF9tYXA7CisJfQorCisJcmV0ID0gaWxfaW5pdF9nZW9zKGlsKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiaW5pdGlhbGl6aW5nIGdlb3MgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZnJlZV9jaGFubmVsX21hcDsKKwl9CisJaWwzOTQ1X2luaXRfaHdfcmF0ZXMoaWwsIGlsLT5pZWVlX3JhdGVzKTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9jaGFubmVsX21hcDoKKwlpbF9mcmVlX2NoYW5uZWxfbWFwKGlsKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIElMMzk0NV9NQVhfUFJPQkVfUkVRVUVTVAkyMDAKKworc3RhdGljIGludAoraWwzOTQ1X3NldHVwX21hYyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGlsLT5odzsKKworCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIml3bC0zOTQ1LXJzIjsKKwlody0+c3RhX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3N0YV9wcml2KTsKKwlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWxfdmlmX3ByaXYpOworCisJLyogVGVsbCBtYWM4MDIxMSBvdXIgY2hhcmFjdGVyaXN0aWNzICovCisJaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfCBJRUVFODAyMTFfSFdfU1BFQ1RSVU1fTUdNVDsKKworCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0gaWwtPmN0eC5pbnRlcmZhY2VfbW9kZXM7CisKKwlody0+d2lwaHktPmZsYWdzIHw9CisJICAgIFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkgfCBXSVBIWV9GTEFHX0RJU0FCTEVfQkVBQ09OX0hJTlRTIHwKKwkgICAgV0lQSFlfRkxBR19JQlNTX1JTTjsKKworCWh3LT53aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSBQUk9CRV9PUFRJT05fTUFYXzM5NDU7CisJLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLworCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gSUwzOTQ1X01BWF9QUk9CRV9SRVFVRVNUIC0gMjQgLSAyOworCisJLyogRGVmYXVsdCB2YWx1ZTsgNCBFRENBIFFPUyBwcmlvcml0aWVzICovCisJaHctPnF1ZXVlcyA9IDQ7CisKKwlpZiAoaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHMpCisJCWlsLT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0KKwkJICAgICZpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisKKwlpZiAoaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fY2hhbm5lbHMpCisJCWlsLT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0KKwkJICAgICZpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl07CisKKwlpbF9sZWRzX2luaXQoaWwpOworCisJcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGlsLT5odyk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoIkZhaWxlZCB0byByZWdpc3RlciBodyAoZXJyb3IgJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJc3RydWN0IGlsX2NmZyAqY2ZnID0gKHN0cnVjdCBpbF9jZmcgKikoZW50LT5kcml2ZXJfZGF0YSk7CisJc3RydWN0IGlsMzk0NV9lZXByb20gKmVlcHJvbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqCisJICogMS4gQWxsb2NhdGluZyBIVyBkYXRhCisJICogKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBtYWM4MDIxMSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGlzIGRldmljZSBpbnN0YW5jZSwgaW5jbHVkaW5nCisJICogICBzcGFjZSBmb3IgdGhpcyBkcml2ZXIncyBpbGF0ZSBzdHJ1Y3R1cmUgKi8KKwlodyA9IGlsX2FsbG9jX2FsbChjZmcpOworCWlmIChodyA9PSBOVUxMKSB7CisJCXByX2VycigiQ2FuIG5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlpbCA9IGh3LT5wcml2OworCVNFVF9JRUVFODAyMTFfREVWKGh3LCAmcGRldi0+ZGV2KTsKKworCWlsLT5jbWRfcXVldWUgPSBJTDM5X0NNRF9RVUVVRV9OVU07CisKKwlpbC0+Y3R4LmN0eGlkID0gMDsKKworCWlsLT5jdHgucnhvbl9jbWQgPSBDX1JYT047CisJaWwtPmN0eC5yeG9uX3RpbWluZ19jbWQgPSBDX1JYT05fVElNSU5HOworCWlsLT5jdHgucnhvbl9hc3NvY19jbWQgPSBDX1JYT05fQVNTT0M7CisJaWwtPmN0eC5xb3NfY21kID0gQ19RT1NfUEFSQU07CisJaWwtPmN0eC5hcF9zdGFfaWQgPSBJTF9BUF9JRDsKKwlpbC0+Y3R4LndlcF9rZXlfY21kID0gQ19XRVBLRVk7CisJaWwtPmN0eC5pbnRlcmZhY2VfbW9kZXMgPQorCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfCBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpOworCWlsLT5jdHguaWJzc19kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9JQlNTOworCWlsLT5jdHguc3RhdGlvbl9kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7CisJaWwtPmN0eC51bnVzZWRfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfRVNTOworCisJLyoKKwkgKiBEaXNhYmxpbmcgaGFyZHdhcmUgc2NhbiBtZWFucyB0aGF0IG1hYzgwMjExIHdpbGwgcGVyZm9ybSBzY2FucworCSAqICJ0aGUgaGFyZCB3YXkiLCByYXRoZXIgdGhhbiB1c2luZyBkZXZpY2UncyBzY2FuLgorCSAqLworCWlmIChpbDM5NDVfbW9kX3BhcmFtcy5kaXNhYmxlX2h3X3NjYW4pIHsKKwkJRF9JTkZPKCJEaXNhYmxpbmcgaHdfc2NhblxuIik7CisJCWlsMzk0NV9od19vcHMuaHdfc2NhbiA9IE5VTEw7CisJfQorCisJRF9JTkZPKCIqKiogTE9BRCBEUklWRVIgKioqXG4iKTsKKwlpbC0+Y2ZnID0gY2ZnOworCWlsLT5wY2lfZGV2ID0gcGRldjsKKwlpbC0+aW50YV9tYXNrID0gQ1NSX0lOSV9TRVRfTUFTSzsKKworCWlmIChpbF9hbGxvY190cmFmZmljX21lbShpbCkpCisJCUlMX0VSUigiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDIuIEluaXRpYWxpemluZyBQQ0kgYnVzCisJICogKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlwY2lfZGlzYWJsZV9saW5rX3N0YXRlKHBkZXYsCisJCQkgICAgICAgUENJRV9MSU5LX1NUQVRFX0wwUyB8IFBDSUVfTElOS19TVEFURV9MMSB8CisJCQkgICAgICAgUENJRV9MSU5LX1NUQVRFX0NMS1BNKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9pZWVlODAyMTFfZnJlZV9odzsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKCFlcnIpCisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAoZXJyKSB7CisJCUlMX1dBUk4oIk5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKKwkJZ290byBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpbCk7CisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqCisJICogMy4gUmVhZCBSRVYgUmVnaXN0ZXIKKwkgKiAqKioqKioqKioqKioqKioqKioqKi8KKwlpbC0+aHdfYmFzZSA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIWlsLT5od19iYXNlKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJRF9JTkZPKCJwY2lfcmVzb3VyY2VfbGVuID0gMHglMDhsbHhcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJRF9JTkZPKCJwY2lfcmVzb3VyY2VfYmFzZSA9ICVwXG4iLCBpbC0+aHdfYmFzZSk7CisKKwkvKiBXZSBkaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwCisJICogUENJIFR4IHJldHJpZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQxLCAweDAwKTsKKworCS8qIHRoZXNlIHNwaW4gbG9ja3Mgd2lsbCBiZSB1c2VkIGluIGFwbV9vcHMuaW5pdCBhbmQgRUVQUk9NIGFjY2VzcworCSAqIHdlIHNob3VsZCBpbml0IG5vdworCSAqLworCXNwaW5fbG9ja19pbml0KCZpbC0+cmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpbC0+bG9jayk7CisKKwkvKgorCSAqIHN0b3AgYW5kIHJlc2V0IHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IganVzdCBpbiBjYXNlIGl0IGlzIGluIGEKKwkgKiBzdHJhbmdlIHN0YXRlIC4uLiBsaWtlIGJlaW5nIGxlZnQgc3RyYW5kZWQgYnkgYSBwcmltYXJ5IGtlcm5lbAorCSAqIGFuZCB0aGlzIGlzIG5vdyB0aGUga2R1bXAga2VybmVsIHRyeWluZyB0byBzdGFydCB1cAorCSAqLworCV9pbF93cihpbCwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiA0LiBSZWFkIEVFUFJPTQorCSAqICoqKioqKioqKioqKioqKioqKioqLworCisJLyogUmVhZCB0aGUgRUVQUk9NICovCisJZXJyID0gaWxfZWVwcm9tX2luaXQoaWwpOworCWlmIChlcnIpIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gaW5pdCBFRVBST01cbiIpOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKwkvKiBNQUMgQWRkcmVzcyBsb2NhdGlvbiBpbiBFRVBST00gc2FtZSBmb3IgMzk0NS80OTY1ICovCisJZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwlEX0lORk8oIk1BQyBhZGRyZXNzOiAlcE1cbiIsIGVlcHJvbS0+bWFjX2FkZHJlc3MpOworCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGlsLT5odywgZWVwcm9tLT5tYWNfYWRkcmVzcyk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiA1LiBTZXR1cCBIVyBDb25zdGFudHMKKwkgKiAqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBEZXZpY2Utc3BlY2lmaWMgc2V0dXAgKi8KKwlpZiAoaWwzOTQ1X2h3X3NldF9od19wYXJhbXMoaWwpKSB7CisJCUlMX0VSUigiZmFpbGVkIHRvIHNldCBodyBzZXR0aW5nc1xuIik7CisJCWdvdG8gb3V0X2VlcHJvbV9mcmVlOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDYuIFNldHVwIGlsCisJICogKioqKioqKioqKioqKioqKioqKiovCisKKwllcnIgPSBpbDM5NDVfaW5pdF9kcnYoaWwpOworCWlmIChlcnIpIHsKKwkJSUxfRVJSKCJpbml0aWFsaXppbmcgZHJpdmVyIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X3Vuc2V0X2h3X3BhcmFtczsKKwl9CisKKwlJTF9JTkZPKCJEZXRlY3RlZCBJbnRlbCBXaXJlbGVzcyBXaUZpIExpbmsgJXNcbiIsIGlsLT5jZmctPm5hbWUpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqCisJICogNy4gU2V0dXAgU2VydmljZXMKKwkgKiAqKioqKioqKioqKioqKioqKioqKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXBjaV9lbmFibGVfbXNpKGlsLT5wY2lfZGV2KTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGlsLT5wY2lfZGV2LT5pcnEsIGlsX2lzciwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBpbCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBpbC0+cGNpX2Rldi0+aXJxKTsKKwkJZ290byBvdXRfZGlzYWJsZV9tc2k7CisJfQorCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmlsMzk0NV9hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChlcnIpIHsKKwkJSUxfRVJSKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGRldmljZSBhdHRyaWJ1dGVzXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9pcnE7CisJfQorCisJaWxfc2V0X3J4b25fY2hhbm5lbChpbCwgJmlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5jaGFubmVsc1s1XSwKKwkJCSAgICAmaWwtPmN0eCk7CisJaWwzOTQ1X3NldHVwX2RlZmVycmVkX3dvcmsoaWwpOworCWlsMzk0NV9zZXR1cF9oYW5kbGVycyhpbCk7CisJaWxfcG93ZXJfaW5pdGlhbGl6ZShpbCk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogOC4gU2V0dXAgYW5kIFJlZ2lzdGVyIG1hYzgwMjExCisJICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWlsX2VuYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKworCWVyciA9IGlsMzk0NV9zZXR1cF9tYWMoaWwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3JlbW92ZV9zeXNmczsKKworCWVyciA9IGlsX2RiZ2ZzX3JlZ2lzdGVyKGlsLCBEUlZfTkFNRSk7CisJaWYgKGVycikKKwkJSUxfRVJSKCJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZmlsZXMuIElnbm9yaW5nIGVycm9yOiAlZFxuIiwKKwkJICAgICAgIGVycik7CisKKwkvKiBTdGFydCBtb25pdG9yaW5nIHRoZSBraWxsc3dpdGNoICovCisJcXVldWVfZGVsYXllZF93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+XzM5NDUucmZraWxsX3BvbGwsIDIgKiBIWik7CisKKwlyZXR1cm4gMDsKKworb3V0X3JlbW92ZV9zeXNmczoKKwlkZXN0cm95X3dvcmtxdWV1ZShpbC0+d29ya3F1ZXVlKTsKKwlpbC0+d29ya3F1ZXVlID0gTlVMTDsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaWwzOTQ1X2F0dHJpYnV0ZV9ncm91cCk7CitvdXRfcmVsZWFzZV9pcnE6CisJZnJlZV9pcnEoaWwtPnBjaV9kZXYtPmlycSwgaWwpOworb3V0X2Rpc2FibGVfbXNpOgorCXBjaV9kaXNhYmxlX21zaShpbC0+cGNpX2Rldik7CisJaWxfZnJlZV9nZW9zKGlsKTsKKwlpbF9mcmVlX2NoYW5uZWxfbWFwKGlsKTsKK291dF91bnNldF9od19wYXJhbXM6CisJaWwzOTQ1X3Vuc2V0X2h3X3BhcmFtcyhpbCk7CitvdXRfZWVwcm9tX2ZyZWU6CisJaWxfZWVwcm9tX2ZyZWUoaWwpOworb3V0X2lvdW5tYXA6CisJcGNpX2lvdW5tYXAocGRldiwgaWwtPmh3X2Jhc2UpOworb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9wY2lfZGlzYWJsZV9kZXZpY2U6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK291dF9pZWVlODAyMTFfZnJlZV9odzoKKwlpbF9mcmVlX3RyYWZmaWNfbWVtKGlsKTsKKwlpZWVlODAyMTFfZnJlZV9odyhpbC0+aHcpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAoraWwzOTQ1X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWlsKQorCQlyZXR1cm47CisKKwlEX0lORk8oIioqKiBVTkxPQUQgRFJJVkVSICoqKlxuIik7CisKKwlpbF9kYmdmc191bnJlZ2lzdGVyKGlsKTsKKworCXNldF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKworCWlsX2xlZHNfZXhpdChpbCk7CisKKwlpZiAoaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKKwkJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoaWwtPmh3KTsKKwkJaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAwOworCX0gZWxzZSB7CisJCWlsMzk0NV9kb3duKGlsKTsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBkZXZpY2UgaXMgcmVzZXQgdG8gbG93IHBvd2VyIGJlZm9yZSB1bmxvYWRpbmcgZHJpdmVyLgorCSAqIFRoaXMgbWF5IGJlIHJlZHVuZGFudCB3aXRoIGlsX2Rvd24oKSwgYnV0IHRoZXJlIGFyZSBwYXRocyB0bworCSAqIHJ1biBpbF9kb3duKCkgd2l0aG91dCBjYWxsaW5nIGFwbV9vcHMuc3RvcCgpLCBhbmQgdGhlcmUgYXJlCisJICogcGF0aHMgdG8gYXZvaWQgcnVubmluZyBpbF9kb3duKCkgYXQgYWxsIGJlZm9yZSBsZWF2aW5nIGRyaXZlci4KKwkgKiBUaGlzIChpbmV4cGVuc2l2ZSkgY2FsbCAqbWFrZXMgc3VyZSogZGV2aWNlIGlzIHJlc2V0LgorCSAqLworCWlsX2FwbV9zdG9wKGlsKTsKKworCS8qIG1ha2Ugc3VyZSB3ZSBmbHVzaCBhbnkgcGVuZGluZyBpcnEgb3IKKwkgKiB0YXNrbGV0IGZvciB0aGUgZHJpdmVyCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWxfZGlzYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWwzOTQ1X3N5bmNocm9uaXplX2lycShpbCk7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaWwzOTQ1X2F0dHJpYnV0ZV9ncm91cCk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmlsLT5fMzk0NS5yZmtpbGxfcG9sbCk7CisKKwlpbDM5NDVfZGVhbGxvY191Y29kZV9wY2koaWwpOworCisJaWYgKGlsLT5yeHEuYmQpCisJCWlsMzk0NV9yeF9xdWV1ZV9mcmVlKGlsLCAmaWwtPnJ4cSk7CisJaWwzOTQ1X2h3X3R4cV9jdHhfZnJlZShpbCk7CisKKwlpbDM5NDVfdW5zZXRfaHdfcGFyYW1zKGlsKTsKKworCS8qbmV0aWZfc3RvcF9xdWV1ZShkZXYpOyAqLworCWZsdXNoX3dvcmtxdWV1ZShpbC0+d29ya3F1ZXVlKTsKKworCS8qIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IGNhbGxzIGlsMzk0NV9tYWNfc3RvcCwgd2hpY2ggZmx1c2hlcworCSAqIGlsLT53b3JrcXVldWUuLi4gc28gd2UgY2FuJ3QgdGFrZSBkb3duIHRoZSB3b3JrcXVldWUKKwkgKiB1bnRpbCBub3cuLi4gKi8KKwlkZXN0cm95X3dvcmtxdWV1ZShpbC0+d29ya3F1ZXVlKTsKKwlpbC0+d29ya3F1ZXVlID0gTlVMTDsKKwlpbF9mcmVlX3RyYWZmaWNfbWVtKGlsKTsKKworCWZyZWVfaXJxKHBkZXYtPmlycSwgaWwpOworCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKKworCXBjaV9pb3VubWFwKHBkZXYsIGlsLT5od19iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlpbF9mcmVlX2NoYW5uZWxfbWFwKGlsKTsKKwlpbF9mcmVlX2dlb3MoaWwpOworCWtmcmVlKGlsLT5zY2FuX2NtZCk7CisJaWYgKGlsLT5iZWFjb25fc2tiKQorCQlkZXZfa2ZyZWVfc2tiKGlsLT5iZWFjb25fc2tiKTsKKworCWllZWU4MDIxMV9mcmVlX2h3KGlsLT5odyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGRyaXZlciBhbmQgbW9kdWxlIGVudHJ5IHBvaW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaWwzOTQ1X2RyaXZlciA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IGlsMzk0NV9od19jYXJkX2lkcywKKwkucHJvYmUgPSBpbDM5NDVfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpbDM5NDVfcGNpX3JlbW92ZSksCisJLmRyaXZlci5wbSA9IElMX0xFR0FDWV9QTV9PUFMsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraWwzOTQ1X2luaXQodm9pZCkKK3sKKworCWludCByZXQ7CisJcHJfaW5mbyhEUlZfREVTQ1JJUFRJT04gIiwgIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlwcl9pbmZvKERSVl9DT1BZUklHSFQgIlxuIik7CisKKwlyZXQgPSBpbDM5NDVfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciByYXRlIGNvbnRyb2wgYWxnb3JpdGhtOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpbDM5NDVfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVW5hYmxlIHRvIGluaXRpYWxpemUgUENJIG1vZHVsZVxuIik7CisJCWdvdG8gZXJyb3JfcmVnaXN0ZXI7CisJfQorCisJcmV0dXJuIHJldDsKKworZXJyb3JfcmVnaXN0ZXI6CisJaWwzOTQ1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitpbDM5NDVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaWwzOTQ1X2RyaXZlcik7CisJaWwzOTQ1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCk7Cit9CisKK01PRFVMRV9GSVJNV0FSRShJTDM5NDVfTU9EVUxFX0ZJUk1XQVJFKElMMzk0NV9VQ09ERV9BUElfTUFYKSk7CisKK21vZHVsZV9wYXJhbV9uYW1lZChhbnRlbm5hLCBpbDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbnRlbm5hLCAic2VsZWN0IGFudGVubmEgKDE9TWFpbiwgMj1BdXgsIGRlZmF1bHQgMCBbYm90aF0pIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoc3djcnlwdG8sIGlsMzk0NV9tb2RfcGFyYW1zLnN3X2NyeXB0bywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Moc3djcnlwdG8sICJ1c2luZyBzb2Z0d2FyZSBjcnlwdG8gKGRlZmF1bHQgMSBbc29mdHdhcmVdKSIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRpc2FibGVfaHdfc2NhbiwgaWwzOTQ1X21vZF9wYXJhbXMuZGlzYWJsZV9od19zY2FuLCBpbnQsCisJCSAgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2h3X3NjYW4sICJkaXNhYmxlIGhhcmR3YXJlIHNjYW5uaW5nIChkZWZhdWx0IDEpIik7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGlsX2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgb3V0cHV0IG1hc2siKTsKKyNlbmRpZgorbW9kdWxlX3BhcmFtX25hbWVkKGZ3X3Jlc3RhcnQsIGlsMzk0NV9tb2RfcGFyYW1zLnJlc3RhcnRfZncsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGZ3X3Jlc3RhcnQsICJyZXN0YXJ0IGZpcm13YXJlIGluIGNhc2Ugb2YgZXJyb3IiKTsKKworbW9kdWxlX2V4aXQoaWwzOTQ1X2V4aXQpOworbW9kdWxlX2luaXQoaWwzOTQ1X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS1ycy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS1ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWQ0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LXJzLmMKQEAgLTAsMCArMSw5OTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSAiY29tbWFuZHMuaCIKKyNpbmNsdWRlICIzOTQ1LmgiCisKKyNkZWZpbmUgUlNfTkFNRSAiaXdsLTM5NDUtcnMiCisKK3N0YXRpYyBzMzIgaWwzOTQ1X2V4cGVjdGVkX3RwdF9nW1JBVEVfQ09VTlRfMzk0NV0gPSB7CisJNywgMTMsIDM1LCA1OCwgMCwgMCwgNzYsIDEwNCwgMTMwLCAxNjgsIDE5MSwgMjAyCit9OworCitzdGF0aWMgczMyIGlsMzk0NV9leHBlY3RlZF90cHRfZ19wcm90W1JBVEVfQ09VTlRfMzk0NV0gPSB7CisJNywgMTMsIDM1LCA1OCwgMCwgMCwgMCwgODAsIDkzLCAxMTMsIDEyMywgMTI1Cit9OworCitzdGF0aWMgczMyIGlsMzk0NV9leHBlY3RlZF90cHRfYVtSQVRFX0NPVU5UXzM5NDVdID0geworCTAsIDAsIDAsIDAsIDQwLCA1NywgNzIsIDk4LCAxMjEsIDE1NCwgMTc3LCAxODYKK307CisKK3N0YXRpYyBzMzIgaWwzOTQ1X2V4cGVjdGVkX3RwdF9iW1JBVEVfQ09VTlRfMzk0NV0gPSB7CisJNywgMTMsIDM1LCA1OCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworc3RydWN0IGlsMzk0NV90cHRfZW50cnkgeworCXM4IG1pbl9yc3NpOworCXU4IGlkeDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWwzOTQ1X3RwdF9lbnRyeSBpbDM5NDVfdHB0X3RhYmxlX2FbXSA9IHsKKwl7LTYwLCBSQVRFXzU0TV9JRFh9LAorCXstNjQsIFJBVEVfNDhNX0lEWH0sCisJey03MiwgUkFURV8zNk1fSURYfSwKKwl7LTgwLCBSQVRFXzI0TV9JRFh9LAorCXstODQsIFJBVEVfMThNX0lEWH0sCisJey04NSwgUkFURV8xMk1fSURYfSwKKwl7LTg3LCBSQVRFXzlNX0lEWH0sCisJey04OSwgUkFURV82TV9JRFh9Cit9OworCitzdGF0aWMgc3RydWN0IGlsMzk0NV90cHRfZW50cnkgaWwzOTQ1X3RwdF90YWJsZV9nW10gPSB7CisJey02MCwgUkFURV81NE1fSURYfSwKKwl7LTY0LCBSQVRFXzQ4TV9JRFh9LAorCXstNjgsIFJBVEVfMzZNX0lEWH0sCisJey04MCwgUkFURV8yNE1fSURYfSwKKwl7LTg0LCBSQVRFXzE4TV9JRFh9LAorCXstODUsIFJBVEVfMTJNX0lEWH0sCisJey04NiwgUkFURV8xMU1fSURYfSwKKwl7LTg4LCBSQVRFXzVNX0lEWH0sCisJey05MCwgUkFURV8yTV9JRFh9LAorCXstOTIsIFJBVEVfMU1fSURYfQorfTsKKworI2RlZmluZSBSQVRFX01BWF9XSU5ET1cgICAgICAgICAgNjIKKyNkZWZpbmUgUkFURV9GTFVTSAkJKDMqSFopCisjZGVmaW5lIFJBVEVfV0lOX0ZMVVNIICAgICAgIChIWi8yKQorI2RlZmluZSBJTDM5X1JBVEVfSElHSF9USCAgICAgICAgICAxMTUyMAorI2RlZmluZSBJTF9TVUNDRVNTX1VQX1RICSAgIDg5NjAKKyNkZWZpbmUgSUxfU1VDQ0VTU19ET1dOX1RICSAgMTA4ODAKKyNkZWZpbmUgUkFURV9NSU5fRkFJTFVSRV9USCAgICAgICA2CisjZGVmaW5lIFJBVEVfTUlOX1NVQ0NFU1NfVEggICAgICAgOAorI2RlZmluZSBSQVRFX0RFQ1JFQVNFX1RIICAgICAgIDE5MjAKKyNkZWZpbmUgUkFURV9SRVRSWV9USAkgICAgIDE1CisKK3N0YXRpYyB1OAoraWwzOTQ1X2dldF9yYXRlX2lkeF9ieV9yc3NpKHMzMiByc3NpLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCit7CisJdTMyIGlkeCA9IDA7CisJdTMyIHRhYmxlX3NpemUgPSAwOworCXN0cnVjdCBpbDM5NDVfdHB0X2VudHJ5ICp0cHRfdGFibGUgPSBOVUxMOworCisJaWYgKHJzc2kgPCBJTF9NSU5fUlNTSV9WQUwgfHwgcnNzaSA+IElMX01BWF9SU1NJX1ZBTCkKKwkJcnNzaSA9IElMX01JTl9SU1NJX1ZBTDsKKworCXN3aXRjaCAoYmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJdHB0X3RhYmxlID0gaWwzOTQ1X3RwdF90YWJsZV9nOworCQl0YWJsZV9zaXplID0gQVJSQVlfU0laRShpbDM5NDVfdHB0X3RhYmxlX2cpOworCQlicmVhazsKKworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJdHB0X3RhYmxlID0gaWwzOTQ1X3RwdF90YWJsZV9hOworCQl0YWJsZV9zaXplID0gQVJSQVlfU0laRShpbDM5NDVfdHB0X3RhYmxlX2EpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwl3aGlsZSAoaWR4IDwgdGFibGVfc2l6ZSAmJiByc3NpIDwgdHB0X3RhYmxlW2lkeF0ubWluX3Jzc2kpCisJCWlkeCsrOworCisJaWR4ID0gbWluKGlkeCwgKHRhYmxlX3NpemUgLSAxKSk7CisKKwlyZXR1cm4gdHB0X3RhYmxlW2lkeF0uaWR4OworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2NsZWFyX3dpbihzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGVfZGF0YSAqd2luKQoreworCXdpbi0+ZGF0YSA9IDA7CisJd2luLT5zdWNjZXNzX2NvdW50ZXIgPSAwOworCXdpbi0+c3VjY2Vzc19yYXRpbyA9IC0xOworCXdpbi0+Y291bnRlciA9IDA7CisJd2luLT5hdmVyYWdlX3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisJd2luLT5zdGFtcCA9IDA7Cit9CisKKy8qKgorICogaWwzOTQ1X3JhdGVfc2NhbGVfZmx1c2hfd2lucyAtIGZsdXNoIG91dCB0aGUgcmF0ZSBzY2FsZSB3aW5zCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdpbnMgdGhhdCBoYXZlIGdhdGhlcmVkIGRhdGEgYnV0IHdlcmUKKyAqIG5vdCBmbHVzaGVkLiAgSWYgdGhlcmUgd2VyZSBhbnkgdGhhdCB3ZXJlIG5vdCBmbHVzaGVkLCB0aGVuCisgKiByZXNjaGVkdWxlIHRoZSByYXRlIGZsdXNoaW5nIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9yYXRlX3NjYWxlX2ZsdXNoX3dpbnMoc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YSkKK3sKKwlpbnQgdW5mbHVzaGVkID0gMDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+aWw7CisKKwkvKgorCSAqIEZvciBlYWNoIHJhdGUsIGlmIHdlIGhhdmUgY29sbGVjdGVkIGRhdGEgb24gdGhhdCByYXRlCisJICogYW5kIGl0IGhhcyBiZWVuIG1vcmUgdGhhbiBSQVRFX1dJTl9GTFVTSAorCSAqIHNpbmNlIHdlIGZsdXNoZWQsIGNsZWFyIG91dCB0aGUgZ2F0aGVyZWQgc3RhdHMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVF8zOTQ1OyBpKyspIHsKKwkJaWYgKCFyc19zdGEtPndpbltpXS5jb3VudGVyKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCByc19zdGEtPndpbltpXS5zdGFtcCArIFJBVEVfV0lOX0ZMVVNIKSkgeworCQkJRF9SQVRFKCJmbHVzaGluZyAlZCBzYW1wbGVzIG9mIHJhdGUgIiAiaWR4ICVkXG4iLAorCQkJICAgICAgIHJzX3N0YS0+d2luW2ldLmNvdW50ZXIsIGkpOworCQkJaWwzOTQ1X2NsZWFyX3dpbigmcnNfc3RhLT53aW5baV0pOworCQl9IGVsc2UKKwkJCXVuZmx1c2hlZCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gdW5mbHVzaGVkOworfQorCisjZGVmaW5lIFJBVEVfRkxVU0hfTUFYICAgICAgICAgICAgICA1MDAwCS8qIG1zZWMgKi8KKyNkZWZpbmUgUkFURV9GTFVTSF9NSU4gICAgICAgICAgICAgIDUwCS8qIG1zZWMgKi8KKyNkZWZpbmUgSUxfQVZFUkFHRV9QQUNLRVRTICAgICAgICAgICAgIDE1MDAKKworc3RhdGljIHZvaWQKK2lsMzk0NV9iZ19yYXRlX3NjYWxlX2ZsdXNoKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqcnNfc3RhID0gKHZvaWQgKilkYXRhOworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+aWw7CisJaW50IHVuZmx1c2hlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcGFja2V0X2NvdW50LCBkdXJhdGlvbiwgcHBzOworCisJRF9SQVRFKCJlbnRlclxuIik7CisKKwl1bmZsdXNoZWQgPSBpbDM5NDVfcmF0ZV9zY2FsZV9mbHVzaF93aW5zKHJzX3N0YSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisKKwkvKiBOdW1iZXIgb2YgcGFja2V0cyBSeCdkIHNpbmNlIGxhc3QgdGltZSB0aGlzIHRpbWVyIHJhbiAqLworCXBhY2tldF9jb3VudCA9IChyc19zdGEtPnR4X3BhY2tldHMgLSByc19zdGEtPmxhc3RfdHhfcGFja2V0cykgKyAxOworCisJcnNfc3RhLT5sYXN0X3R4X3BhY2tldHMgPSByc19zdGEtPnR4X3BhY2tldHMgKyAxOworCisJaWYgKHVuZmx1c2hlZCkgeworCQlkdXJhdGlvbiA9CisJCSAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSByc19zdGEtPmxhc3RfcGFydGlhbF9mbHVzaCk7CisKKwkJRF9SQVRFKCJUeCdkICVkIHBhY2tldHMgaW4gJWRtc1xuIiwgcGFja2V0X2NvdW50LCBkdXJhdGlvbik7CisKKwkJLyogRGV0ZXJtaW5lIHBhY2tldHMgcGVyIHNlY29uZCAqLworCQlpZiAoZHVyYXRpb24pCisJCQlwcHMgPSAocGFja2V0X2NvdW50ICogMTAwMCkgLyBkdXJhdGlvbjsKKwkJZWxzZQorCQkJcHBzID0gMDsKKworCQlpZiAocHBzKSB7CisJCQlkdXJhdGlvbiA9IChJTF9BVkVSQUdFX1BBQ0tFVFMgKiAxMDAwKSAvIHBwczsKKwkJCWlmIChkdXJhdGlvbiA8IFJBVEVfRkxVU0hfTUlOKQorCQkJCWR1cmF0aW9uID0gUkFURV9GTFVTSF9NSU47CisJCQllbHNlIGlmIChkdXJhdGlvbiA+IFJBVEVfRkxVU0hfTUFYKQorCQkJCWR1cmF0aW9uID0gUkFURV9GTFVTSF9NQVg7CisJCX0gZWxzZQorCQkJZHVyYXRpb24gPSBSQVRFX0ZMVVNIX01BWDsKKworCQlyc19zdGEtPmZsdXNoX3RpbWUgPSBtc2Vjc190b19qaWZmaWVzKGR1cmF0aW9uKTsKKworCQlEX1JBVEUoIm5ldyBmbHVzaCBwZXJpb2Q6ICVkIG1zZWMgYXZlICVkXG4iLCBkdXJhdGlvbiwKKwkJICAgICAgIHBhY2tldF9jb3VudCk7CisKKwkJbW9kX3RpbWVyKCZyc19zdGEtPnJhdGVfc2NhbGVfZmx1c2gsCisJCQkgIGppZmZpZXMgKyByc19zdGEtPmZsdXNoX3RpbWUpOworCisJCXJzX3N0YS0+bGFzdF9wYXJ0aWFsX2ZsdXNoID0gamlmZmllczsKKwl9IGVsc2UgeworCQlyc19zdGEtPmZsdXNoX3RpbWUgPSBSQVRFX0ZMVVNIOworCQlyc19zdGEtPmZsdXNoX3BlbmRpbmcgPSAwOworCX0KKwkvKiBJZiB0aGVyZSB3ZXJlbid0IGFueSB1bmZsdXNoZWQgZW50cmllcywgd2UgZG9uJ3Qgc2NoZWR1bGUgdGhlIHRpbWVyCisJICogdG8gcnVuIGFnYWluICovCisKKwlyc19zdGEtPmxhc3RfZmx1c2ggPSBqaWZmaWVzOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisKKwlEX1JBVEUoImxlYXZlXG4iKTsKK30KKworLyoqCisgKiBpbDM5NDVfY29sbGVjdF90eF9kYXRhIC0gVXBkYXRlIHRoZSBzdWNjZXNzL2ZhaWx1cmUgc2xpZGluZyB3aW4KKyAqCisgKiBXZSBrZWVwIGEgc2xpZGluZyB3aW4gb2YgdGhlIGxhc3QgNjQgcGFja2V0cyB0cmFuc21pdHRlZAorICogYXQgdGhpcyByYXRlLiAgd2luLT5kYXRhIGNvbnRhaW5zIHRoZSBiaXRtYXNrIG9mIHN1Y2Nlc3NmdWwKKyAqIHBhY2tldHMuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfY29sbGVjdF90eF9kYXRhKHN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGEsCisJCSAgICAgICBzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGVfZGF0YSAqd2luLCBpbnQgc3VjY2VzcywKKwkJICAgICAgIGludCByZXRyaWVzLCBpbnQgaWR4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJczMyIGZhaWxfY291bnQ7CisJc3RydWN0IGlsX3ByaXYgKmlsIF9fbWF5YmVfdW51c2VkID0gcnNfc3RhLT5pbDsKKworCWlmICghcmV0cmllcykgeworCQlEX1JBVEUoImxlYXZlOiByZXRyaWVzID09IDAgLS0gc2hvdWxkIGJlIGF0IGxlYXN0IDFcbiIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBLZWVwIHRyYWNrIG9mIG9ubHkgdGhlIGxhdGVzdCA2MiB0eCBmcmFtZSBhdHRlbXB0cyBpbiB0aGlzIHJhdGUncworCSAqIGhpc3Rvcnkgd2luOyBhbnl0aGluZyBvbGRlciBpc24ndCByZWFsbHkgcmVsZXZhbnQgYW55IG1vcmUuCisJICogSWYgd2UgaGF2ZSBmaWxsZWQgdXAgdGhlIHNsaWRpbmcgd2luLCBkcm9wIHRoZSBvbGRlc3QgYXR0ZW1wdDsKKwkgKiBpZiB0aGUgb2xkZXN0IGF0dGVtcHQgKGhpZ2hlc3QgYml0IGluIGJpdG1hcCkgc2hvd3MgInN1Y2Nlc3MiLAorCSAqIHN1YnRyYWN0ICIxIiBmcm9tIHRoZSBzdWNjZXNzIGNvdW50ZXIgKHRoaXMgaXMgdGhlIG1haW4gcmVhc29uCisJICogd2Uga2VlcCB0aGVzZSBiaXRtYXBzISkuCisJICogKi8KKwl3aGlsZSAocmV0cmllcyA+IDApIHsKKwkJaWYgKHdpbi0+Y291bnRlciA+PSBSQVRFX01BWF9XSU5ET1cpIHsKKworCQkJLyogcmVtb3ZlIGVhcmxpZXN0ICovCisJCQl3aW4tPmNvdW50ZXIgPSBSQVRFX01BWF9XSU5ET1cgLSAxOworCisJCQlpZiAod2luLT5kYXRhICYgKDFVTEwgPDwgKFJBVEVfTUFYX1dJTkRPVyAtIDEpKSkgeworCQkJCXdpbi0+ZGF0YSAmPSB+KDFVTEwgPDwgKFJBVEVfTUFYX1dJTkRPVyAtIDEpKTsKKwkJCQl3aW4tPnN1Y2Nlc3NfY291bnRlci0tOworCQkJfQorCQl9CisKKwkJLyogSW5jcmVtZW50IGZyYW1lcy1hdHRlbXB0ZWQgY291bnRlciAqLworCQl3aW4tPmNvdW50ZXIrKzsKKworCQkvKiBTaGlmdCBiaXRtYXAgYnkgb25lIGZyYW1lICh0aHJvdyBhd2F5IG9sZGVzdCBoaXN0b3J5KSwKKwkJICogT1IgaW4gIjEiLCBhbmQgaW5jcmVtZW50ICJzdWNjZXNzIiBpZiB0aGlzCisJCSAqIGZyYW1lIHdhcyBzdWNjZXNzZnVsLiAqLworCQl3aW4tPmRhdGEgPDw9IDE7CisJCWlmIChzdWNjZXNzID4gMCkgeworCQkJd2luLT5zdWNjZXNzX2NvdW50ZXIrKzsKKwkJCXdpbi0+ZGF0YSB8PSAweDE7CisJCQlzdWNjZXNzLS07CisJCX0KKworCQlyZXRyaWVzLS07CisJfQorCisJLyogQ2FsY3VsYXRlIGN1cnJlbnQgc3VjY2VzcyByYXRpbywgYXZvaWQgZGl2aWRlLWJ5LTAhICovCisJaWYgKHdpbi0+Y291bnRlciA+IDApCisJCXdpbi0+c3VjY2Vzc19yYXRpbyA9CisJCSAgICAxMjggKiAoMTAwICogd2luLT5zdWNjZXNzX2NvdW50ZXIpIC8gd2luLT5jb3VudGVyOworCWVsc2UKKwkJd2luLT5zdWNjZXNzX3JhdGlvID0gSUxfSU5WQUxJRF9WQUxVRTsKKworCWZhaWxfY291bnQgPSB3aW4tPmNvdW50ZXIgLSB3aW4tPnN1Y2Nlc3NfY291bnRlcjsKKworCS8qIENhbGN1bGF0ZSBhdmVyYWdlIHRocm91Z2hwdXQsIGlmIHdlIGhhdmUgZW5vdWdoIGhpc3RvcnkuICovCisJaWYgKGZhaWxfY291bnQgPj0gUkFURV9NSU5fRkFJTFVSRV9USCB8fAorCSAgICB3aW4tPnN1Y2Nlc3NfY291bnRlciA+PSBSQVRFX01JTl9TVUNDRVNTX1RIKQorCQl3aW4tPmF2ZXJhZ2VfdHB0ID0KKwkJICAgICgod2luLT5zdWNjZXNzX3JhdGlvICogcnNfc3RhLT5leHBlY3RlZF90cHRbaWR4XSArCisJCSAgICAgIDY0KSAvIDEyOCk7CisJZWxzZQorCQl3aW4tPmF2ZXJhZ2VfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKworCS8qIFRhZyB0aGlzIHdpbiBhcyBoYXZpbmcgYmVlbiB1cGRhdGVkICovCisJd2luLT5zdGFtcCA9IGppZmZpZXM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworfQorCisvKgorICogQ2FsbGVkIGFmdGVyIGFkZGluZyBhIG5ldyBzdGF0aW9uIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nCisgKi8KK3ZvaWQKK2lsMzk0NV9yc19yYXRlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCBzdGFfaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBpbC0+aHc7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmlsLT5ody0+Y29uZjsKKwlzdHJ1Y3QgaWwzOTQ1X3N0YV9wcml2ICpwc3RhOworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGE7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJaW50IGk7CisKKwlEX0lORk8oImVudGVyXG4iKTsKKwlpZiAoc3RhX2lkID09IGlsLT5jdHguYmNhc3Rfc3RhX2lkKQorCQlnb3RvIG91dDsKKworCXBzdGEgPSAoc3RydWN0IGlsMzk0NV9zdGFfcHJpdiAqKXN0YS0+ZHJ2X3ByaXY7CisJcnNfc3RhID0gJnBzdGEtPnJzX3N0YTsKKwlzYmFuZCA9IGh3LT53aXBoeS0+YmFuZHNbY29uZi0+Y2hhbm5lbC0+YmFuZF07CisKKwlyc19zdGEtPmlsID0gaWw7CisKKwlyc19zdGEtPnN0YXJ0X3JhdGUgPSBSQVRFX0lOVkFMSUQ7CisKKwkvKiBkZWZhdWx0IHRvIGp1c3QgODAyLjExYiAqLworCXJzX3N0YS0+ZXhwZWN0ZWRfdHB0ID0gaWwzOTQ1X2V4cGVjdGVkX3RwdF9iOworCisJcnNfc3RhLT5sYXN0X3BhcnRpYWxfZmx1c2ggPSBqaWZmaWVzOworCXJzX3N0YS0+bGFzdF9mbHVzaCA9IGppZmZpZXM7CisJcnNfc3RhLT5mbHVzaF90aW1lID0gUkFURV9GTFVTSDsKKwlyc19zdGEtPmxhc3RfdHhfcGFja2V0cyA9IDA7CisKKwlyc19zdGEtPnJhdGVfc2NhbGVfZmx1c2guZGF0YSA9ICh1bnNpZ25lZCBsb25nKXJzX3N0YTsKKwlyc19zdGEtPnJhdGVfc2NhbGVfZmx1c2guZnVuY3Rpb24gPSBpbDM5NDVfYmdfcmF0ZV9zY2FsZV9mbHVzaDsKKworCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UXzM5NDU7IGkrKykKKwkJaWwzOTQ1X2NsZWFyX3dpbigmcnNfc3RhLT53aW5baV0pOworCisJLyogVE9ETzogd2hhdCBpcyBhIGdvb2Qgc3RhcnRpbmcgcmF0ZSBmb3IgU1RBPyBBYm91dCBtaWRkbGU/IE1heWJlIG5vdAorCSAqIHRoZSBsb3dlc3Qgb3IgdGhlIGhpZ2hlc3QgcmF0ZS4uIENvdWxkIGNvbnNpZGVyIHVzaW5nIFJTU0kgZnJvbQorCSAqIHByZXZpb3VzIHBhY2tldHM/IE5lZWQgdG8gaGF2ZSBJRUVFIDgwMi4xWCBhdXRoIHN1Y2NlZWQgaW1tZWRpYXRlbHkKKwkgKiBhZnRlciBhc3NvYy4uICovCisKKwlmb3IgKGkgPSBzYmFuZC0+bl9iaXRyYXRlcyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdICYgKDEgPDwgaSkpIHsKKwkJCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWwtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXTsKKwkvKiBGb3IgNSBHSHogYmFuZCBpdCBzdGFydCBhdCBJTF9GSVJTVF9PRkRNX1JBVEUgKi8KKwlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgeworCQlyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJCWlsLT5fMzk0NS5zdGFfc3VwcF9yYXRlcyA9CisJCSAgICBpbC0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgPDwgSUxfRklSU1RfT0ZETV9SQVRFOworCX0KKworb3V0OgorCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCisJRF9JTkZPKCJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkICoKK2lsMzk0NV9yc19hbGxvYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGRlbnRyeSAqZGVidWdmc2RpcikKK3sKKwlyZXR1cm4gaHctPnByaXY7Cit9CisKKy8qIHJhdGUgc2NhbGUgcmVxdWlyZXMgZnJlZSBmdW5jdGlvbiB0byBiZSBpbXBsZW1lbnRlZCAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9yc19mcmVlKHZvaWQgKmlsKQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgKgoraWwzOTQ1X3JzX2FsbG9jX3N0YSh2b2lkICppbF9wcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBnZnBfdCBnZnApCit7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YTsKKwlzdHJ1Y3QgaWwzOTQ1X3N0YV9wcml2ICpwc3RhID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IGlsX3ByaXY7CisKKwlEX1JBVEUoImVudGVyXG4iKTsKKworCXJzX3N0YSA9ICZwc3RhLT5yc19zdGE7CisKKwlzcGluX2xvY2tfaW5pdCgmcnNfc3RhLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZyc19zdGEtPnJhdGVfc2NhbGVfZmx1c2gpOworCisJRF9SQVRFKCJsZWF2ZVxuIik7CisKKwlyZXR1cm4gcnNfc3RhOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X3JzX2ZyZWVfc3RhKHZvaWQgKmlsX3ByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKmlsX3N0YSkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqcnNfc3RhID0gaWxfc3RhOworCisJLyoKKwkgKiBCZSBjYXJlZnVsIG5vdCB0byB1c2UgYW55IG1lbWJlcnMgb2YgaWwzOTQ1X3JzX3N0YSAobGlrZSB0cnlpbmcKKwkgKiB0byB1c2UgaWxfcHJpdiB0byBwcmludCBvdXQgZGVidWdnaW5nKSBzaW5jZSBpdCBtYXkgbm90IGJlIGZ1bGx5CisJICogaW5pdGlhbGl6ZWQgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlkZWxfdGltZXJfc3luYygmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoKTsKK30KKworLyoqCisgKiBpbDM5NDVfcnNfdHhfc3RhdHVzIC0gVXBkYXRlIHJhdGUgY29udHJvbCB2YWx1ZXMgYmFzZWQgb24gVHggcmVzdWx0cworICoKKyAqIE5PVEU6IFVzZXMgaWxfcHJpdi0+cmV0cnlfcmF0ZSBmb3IgdGhlICMgb2YgcmV0cmllcyBhdHRlbXB0ZWQgYnkKKyAqIHRoZSBoYXJkd2FyZSBmb3IgZWFjaCByYXRlLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3JzX3R4X3N0YXR1cyh2b2lkICppbF9yYXRlLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKmlsX3N0YSwKKwkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJczggcmV0cmllcyA9IDAsIGN1cnJlbnRfY291bnQ7CisJaW50IHNjYWxlX3JhdGVfaWR4LCBmaXJzdF9pZHgsIGxhc3RfaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gKHN0cnVjdCBpbF9wcml2ICopaWxfcmF0ZTsKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqcnNfc3RhID0gaWxfc3RhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKworCURfUkFURSgiZW50ZXJcbiIpOworCisJcmV0cmllcyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudDsKKwkvKiBTYW5pdHkgQ2hlY2sgZm9yIHJldHJpZXMgKi8KKwlpZiAocmV0cmllcyA+IFJBVEVfUkVUUllfVEgpCisJCXJldHJpZXMgPSBSQVRFX1JFVFJZX1RIOworCisJZmlyc3RfaWR4ID0gc2JhbmQtPmJpdHJhdGVzW2luZm8tPnN0YXR1cy5yYXRlc1swXS5pZHhdLmh3X3ZhbHVlOworCWlmIChmaXJzdF9pZHggPCAwIHx8IGZpcnN0X2lkeCA+PSBSQVRFX0NPVU5UXzM5NDUpIHsKKwkJRF9SQVRFKCJsZWF2ZTogUmF0ZSBvdXQgb2YgYm91bmRzOiAlZFxuIiwgZmlyc3RfaWR4KTsKKwkJcmV0dXJuOworCX0KKworCWlmICghaWxfc3RhKSB7CisJCURfUkFURSgibGVhdmU6IE5vIFNUQSBpbCBkYXRhIHRvIHVwZGF0ZSFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KKwlpZiAoIXJzX3N0YS0+aWwpIHsKKwkJRF9SQVRFKCJsZWF2ZTogU1RBIGlsIGRhdGEgdW5pbml0aWFsaXplZCFcbiIpOworCQlyZXR1cm47CisJfQorCisJcnNfc3RhLT50eF9wYWNrZXRzKys7CisKKwlzY2FsZV9yYXRlX2lkeCA9IGZpcnN0X2lkeDsKKwlsYXN0X2lkeCA9IGZpcnN0X2lkeDsKKworCS8qCisJICogVXBkYXRlIHRoZSB3aW4gZm9yIGVhY2ggcmF0ZS4gIFdlIGRldGVybWluZSB3aGljaCByYXRlcworCSAqIHdlcmUgVHgnZCBiYXNlZCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIHJldHJpZXMgdnMuIHRoZSBudW1iZXIKKwkgKiBvZiByZXRyaWVzIGNvbmZpZ3VyZWQgZm9yIGVhY2ggcmF0ZSAtLSBjdXJyZW50bHkgc2V0IHRvIHRoZQorCSAqIGlsIHZhbHVlICdyZXRyeV9yYXRlJyB2cy4gcmF0ZSBzcGVjaWZpYworCSAqCisJICogT24gZXhpdCBmcm9tIHRoaXMgd2hpbGUgbG9vcCBsYXN0X2lkeCBpbmRpY2F0ZXMgdGhlIHJhdGUKKwkgKiBhdCB3aGljaCB0aGUgZnJhbWUgd2FzIGZpbmFsbHkgdHJhbnNtaXR0ZWQgKG9yIGZhaWxlZCBpZiBubworCSAqIEFDSykKKwkgKi8KKwl3aGlsZSAocmV0cmllcyA+IDEpIHsKKwkJaWYgKChyZXRyaWVzIC0gMSkgPCBpbC0+cmV0cnlfcmF0ZSkgeworCQkJY3VycmVudF9jb3VudCA9IChyZXRyaWVzIC0gMSk7CisJCQlsYXN0X2lkeCA9IHNjYWxlX3JhdGVfaWR4OworCQl9IGVsc2UgeworCQkJY3VycmVudF9jb3VudCA9IGlsLT5yZXRyeV9yYXRlOworCQkJbGFzdF9pZHggPSBpbDM5NDVfcnNfbmV4dF9yYXRlKGlsLCBzY2FsZV9yYXRlX2lkeCk7CisJCX0KKworCQkvKiBVcGRhdGUgdGhpcyByYXRlIGFjY291bnRpbmcgZm9yIGFzIG1hbnkgcmV0cmllcworCQkgKiBhcyB3YXMgdXNlZCBmb3IgaXQgKHBlciBjdXJyZW50X2NvdW50KSAqLworCQlpbDM5NDVfY29sbGVjdF90eF9kYXRhKHJzX3N0YSwgJnJzX3N0YS0+d2luW3NjYWxlX3JhdGVfaWR4XSwgMCwKKwkJCQkgICAgICAgY3VycmVudF9jb3VudCwgc2NhbGVfcmF0ZV9pZHgpOworCQlEX1JBVEUoIlVwZGF0ZSByYXRlICVkIGZvciAlZCByZXRyaWVzLlxuIiwgc2NhbGVfcmF0ZV9pZHgsCisJCSAgICAgICBjdXJyZW50X2NvdW50KTsKKworCQlyZXRyaWVzIC09IGN1cnJlbnRfY291bnQ7CisKKwkJc2NhbGVfcmF0ZV9pZHggPSBsYXN0X2lkeDsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIGxhc3QgaWR4IHdpbiB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBiYXNlZCBvbiBBQ0sgKi8KKwlEX1JBVEUoIlVwZGF0ZSByYXRlICVkIHdpdGggJXMuXG4iLCBsYXN0X2lkeCwKKwkgICAgICAgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLKSA/ICJzdWNjZXNzIiA6ICJmYWlsdXJlIik7CisJaWwzOTQ1X2NvbGxlY3RfdHhfZGF0YShyc19zdGEsICZyc19zdGEtPndpbltsYXN0X2lkeF0sCisJCQkgICAgICAgaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0ssIDEsCisJCQkgICAgICAgbGFzdF9pZHgpOworCisJLyogV2UgdXBkYXRlZCB0aGUgcmF0ZSBzY2FsZSB3aW4gLS0gaWYgaXRzIGJlZW4gbW9yZSB0aGFuCisJICogZmx1c2hfdGltZSBzaW5jZSB0aGUgbGFzdCBydW4sIHNjaGVkdWxlIHRoZSBmbHVzaAorCSAqIGFnYWluICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFyc19zdGEtPmZsdXNoX3BlbmRpbmcgJiYKKwkgICAgdGltZV9hZnRlcihqaWZmaWVzLCByc19zdGEtPmxhc3RfZmx1c2ggKyByc19zdGEtPmZsdXNoX3RpbWUpKSB7CisKKwkJcnNfc3RhLT5sYXN0X3BhcnRpYWxfZmx1c2ggPSBqaWZmaWVzOworCQlyc19zdGEtPmZsdXNoX3BlbmRpbmcgPSAxOworCQltb2RfdGltZXIoJnJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaCwKKwkJCSAgamlmZmllcyArIHJzX3N0YS0+Zmx1c2hfdGltZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisKKwlEX1JBVEUoImxlYXZlXG4iKTsKK30KKworc3RhdGljIHUxNgoraWwzOTQ1X2dldF9hZGphY2VudF9yYXRlKHN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGEsIHU4IGlkeCwgdTE2IHJhdGVfbWFzaywKKwkJCSBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCit7CisJdTggaGlnaCA9IFJBVEVfSU5WQUxJRDsKKwl1OCBsb3cgPSBSQVRFX0lOVkFMSUQ7CisJc3RydWN0IGlsX3ByaXYgKmlsIF9fbWF5YmVfdW51c2VkID0gcnNfc3RhLT5pbDsKKworCS8qIDgwMi4xMUEgd2Fsa3MgdG8gdGhlIG5leHQgbGl0ZXJhbCBhZGphY2VudCByYXRlIGluCisJICogdGhlIHJhdGUgdGFibGUgKi8KKwlpZiAodW5saWtlbHkoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSkgeworCQlpbnQgaTsKKwkJdTMyIG1hc2s7CisKKwkJLyogRmluZCB0aGUgcHJldmlvdXMgcmF0ZSB0aGF0IGlzIGluIHRoZSByYXRlIG1hc2sgKi8KKwkJaSA9IGlkeCAtIDE7CisJCWZvciAobWFzayA9ICgxIDw8IGkpOyBpID49IDA7IGktLSwgbWFzayA+Pj0gMSkgeworCQkJaWYgKHJhdGVfbWFzayAmIG1hc2spIHsKKwkJCQlsb3cgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogRmluZCB0aGUgbmV4dCByYXRlIHRoYXQgaXMgaW4gdGhlIHJhdGUgbWFzayAqLworCQlpID0gaWR4ICsgMTsKKwkJZm9yIChtYXNrID0gKDEgPDwgaSk7IGkgPCBSQVRFX0NPVU5UXzM5NDU7IGkrKywgbWFzayA8PD0gMSkgeworCQkJaWYgKHJhdGVfbWFzayAmIG1hc2spIHsKKwkJCQloaWdoID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKKwl9CisKKwlsb3cgPSBpZHg7CisJd2hpbGUgKGxvdyAhPSBSQVRFX0lOVkFMSUQpIHsKKwkJaWYgKHJzX3N0YS0+dGdnKQorCQkJbG93ID0gaWwzOTQ1X3JhdGVzW2xvd10ucHJldl9yc190Z2c7CisJCWVsc2UKKwkJCWxvdyA9IGlsMzk0NV9yYXRlc1tsb3ddLnByZXZfcnM7CisJCWlmIChsb3cgPT0gUkFURV9JTlZBTElEKQorCQkJYnJlYWs7CisJCWlmIChyYXRlX21hc2sgJiAoMSA8PCBsb3cpKQorCQkJYnJlYWs7CisJCURfUkFURSgiU2tpcHBpbmcgbWFza2VkIGxvd2VyIHJhdGU6ICVkXG4iLCBsb3cpOworCX0KKworCWhpZ2ggPSBpZHg7CisJd2hpbGUgKGhpZ2ggIT0gUkFURV9JTlZBTElEKSB7CisJCWlmIChyc19zdGEtPnRnZykKKwkJCWhpZ2ggPSBpbDM5NDVfcmF0ZXNbaGlnaF0ubmV4dF9yc190Z2c7CisJCWVsc2UKKwkJCWhpZ2ggPSBpbDM5NDVfcmF0ZXNbaGlnaF0ubmV4dF9yczsKKwkJaWYgKGhpZ2ggPT0gUkFURV9JTlZBTElEKQorCQkJYnJlYWs7CisJCWlmIChyYXRlX21hc2sgJiAoMSA8PCBoaWdoKSkKKwkJCWJyZWFrOworCQlEX1JBVEUoIlNraXBwaW5nIG1hc2tlZCBoaWdoZXIgcmF0ZTogJWRcbiIsIGhpZ2gpOworCX0KKworCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKK30KKworLyoqCisgKiBpbDM5NDVfcnNfZ2V0X3JhdGUgLSBmaW5kIHRoZSByYXRlIGZvciB0aGUgcmVxdWVzdGVkIHBhY2tldAorICoKKyAqIFJldHVybnMgdGhlIGllZWU4MDIxMV9yYXRlIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlci4KKyAqCisgKiBUaGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBoYXMgbm8gaW50ZXJuYWwgbWFwcGluZyBiZXR3ZWVuIGh3X21vZGUncworICogcmF0ZSBvcmRlcmluZyBhbmQgdGhlIHJhdGUgb3JkZXJpbmcgdXNlZCBieSB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobS4KKyAqCisgKiBUaGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSB1c2VzIGEgc2luZ2xlIHRhYmxlIG9mIHJhdGVzIHRoYXQgZ29lcyBhY3Jvc3MKKyAqIHRoZSBlbnRpcmUgQS9CL0cgc3BlY3RydW0gdnMuIGJlaW5nIGxpbWl0ZWQgdG8ganVzdCBvbmUgcGFydGljdWxhcgorICogaHdfbW9kZS4KKyAqCisgKiBBcyBzdWNoLCB3ZSBjYW4ndCBjb252ZXJ0IHRoZSBpZHggb2J0YWluZWQgYmVsb3cgaW50byB0aGUgaHdfbW9kZSdzCisgKiByYXRlIHRhYmxlIGFuZCBtdXN0IHJlZmVyZW5jZSB0aGUgZHJpdmVyIGFsbG9jYXRlZCByYXRlIHRhYmxlCisgKgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3JzX2dldF9yYXRlKHZvaWQgKmlsX3IsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKmlsX3N0YSwKKwkJICAgc3RydWN0IGllZWU4MDIxMV90eF9yYXRlX2NvbnRyb2wgKnR4cmMpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPSB0eHJjLT5zYmFuZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhyYy0+c2tiOworCXU4IGxvdyA9IFJBVEVfSU5WQUxJRDsKKwl1OCBoaWdoID0gUkFURV9JTlZBTElEOworCXUxNiBoaWdoX2xvdzsKKwlpbnQgaWR4OworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGEgPSBpbF9zdGE7CisJc3RydWN0IGlsMzk0NV9yYXRlX3NjYWxlX2RhdGEgKndpbiA9IE5VTEw7CisJaW50IGN1cnJlbnRfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwlpbnQgbG93X3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisJaW50IGhpZ2hfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwl1MzIgZmFpbF9jb3VudDsKKwlzOCBzY2FsZV9hY3Rpb24gPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IHJhdGVfbWFzazsKKwlzOCBtYXhfcmF0ZV9pZHggPSAtMTsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSAoc3RydWN0IGlsX3ByaXYgKilpbF9yOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKworCURfUkFURSgiZW50ZXJcbiIpOworCisJLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KKwlpZiAocnNfc3RhICYmICFyc19zdGEtPmlsKSB7CisJCURfUkFURSgiUmF0ZSBzY2FsaW5nIGluZm9ybWF0aW9uIG5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKKwkJaWxfc3RhID0gTlVMTDsKKwl9CisKKwlpZiAocmF0ZV9jb250cm9sX3NlbmRfbG93KHN0YSwgaWxfc3RhLCB0eHJjKSkKKwkJcmV0dXJuOworCisJcmF0ZV9tYXNrID0gc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXTsKKworCS8qIGdldCB1c2VyIG1heCByYXRlIGlmIHNldCAqLworCW1heF9yYXRlX2lkeCA9IHR4cmMtPm1heF9yYXRlX2lkeDsKKwlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWiAmJiBtYXhfcmF0ZV9pZHggIT0gLTEpCisJCW1heF9yYXRlX2lkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJaWYgKG1heF9yYXRlX2lkeCA8IDAgfHwgbWF4X3JhdGVfaWR4ID49IFJBVEVfQ09VTlQpCisJCW1heF9yYXRlX2lkeCA9IC0xOworCisJaWR4ID0gbWluKHJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ICYgMHhmZmZmLCBSQVRFX0NPVU5UXzM5NDUgLSAxKTsKKworCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlyYXRlX21hc2sgPSByYXRlX21hc2sgPDwgSUxfRklSU1RfT0ZETV9SQVRFOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJLyogZm9yIHJlY2VudCBhc3NvYywgY2hvb3NlIGJlc3QgcmF0ZSByZWdhcmRpbmcKKwkgKiB0byByc3NpIHZhbHVlCisJICovCisJaWYgKHJzX3N0YS0+c3RhcnRfcmF0ZSAhPSBSQVRFX0lOVkFMSUQpIHsKKwkJaWYgKHJzX3N0YS0+c3RhcnRfcmF0ZSA8IGlkeCAmJgorCQkgICAgKHJhdGVfbWFzayAmICgxIDw8IHJzX3N0YS0+c3RhcnRfcmF0ZSkpKQorCQkJaWR4ID0gcnNfc3RhLT5zdGFydF9yYXRlOworCQlyc19zdGEtPnN0YXJ0X3JhdGUgPSBSQVRFX0lOVkFMSUQ7CisJfQorCisJLyogZm9yY2UgdXNlciBtYXggcmF0ZSBpZiBzZXQgYnkgdXNlciAqLworCWlmIChtYXhfcmF0ZV9pZHggIT0gLTEgJiYgbWF4X3JhdGVfaWR4IDwgaWR4KSB7CisJCWlmIChyYXRlX21hc2sgJiAoMSA8PCBtYXhfcmF0ZV9pZHgpKQorCQkJaWR4ID0gbWF4X3JhdGVfaWR4OworCX0KKworCXdpbiA9ICYocnNfc3RhLT53aW5baWR4XSk7CisKKwlmYWlsX2NvdW50ID0gd2luLT5jb3VudGVyIC0gd2luLT5zdWNjZXNzX2NvdW50ZXI7CisKKwlpZiAoZmFpbF9jb3VudCA8IFJBVEVfTUlOX0ZBSUxVUkVfVEggJiYKKwkgICAgd2luLT5zdWNjZXNzX2NvdW50ZXIgPCBSQVRFX01JTl9TVUNDRVNTX1RIKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJCURfUkFURSgiSW52YWxpZCBhdmVyYWdlX3RwdCBvbiByYXRlICVkOiAiCisJCSAgICAgICAiY291bnRlcjogJWQsIHN1Y2Nlc3NfY291bnRlcjogJWQsICIKKwkJICAgICAgICJleHBlY3RlZF90cHQgaXMgJXNOVUxMXG4iLCBpZHgsIHdpbi0+Y291bnRlciwKKwkJICAgICAgIHdpbi0+c3VjY2Vzc19jb3VudGVyLAorCQkgICAgICAgcnNfc3RhLT5leHBlY3RlZF90cHQgPyAibm90ICIgOiAiIik7CisKKwkJLyogQ2FuJ3QgY2FsY3VsYXRlIHRoaXMgeWV0OyBub3QgZW5vdWdoIGhpc3RvcnkgKi8KKwkJd2luLT5hdmVyYWdlX3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisJCWdvdG8gb3V0OworCisJfQorCisJY3VycmVudF90cHQgPSB3aW4tPmF2ZXJhZ2VfdHB0OworCisJaGlnaF9sb3cgPQorCSAgICBpbDM5NDVfZ2V0X2FkamFjZW50X3JhdGUocnNfc3RhLCBpZHgsIHJhdGVfbWFzaywgc2JhbmQtPmJhbmQpOworCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKKwloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKKworCS8qIElmIHVzZXIgc2V0IG1heCByYXRlLCBkb250IGFsbG93IGhpZ2hlciB0aGFuIHVzZXIgY29uc3RyYWluICovCisJaWYgKG1heF9yYXRlX2lkeCAhPSAtMSAmJiBtYXhfcmF0ZV9pZHggPCBoaWdoKQorCQloaWdoID0gUkFURV9JTlZBTElEOworCisJLyogQ29sbGVjdCBNZWFzdXJlZCB0aHJvdWdocHV0cyBvZiBhZGphY2VudCByYXRlcyAqLworCWlmIChsb3cgIT0gUkFURV9JTlZBTElEKQorCQlsb3dfdHB0ID0gcnNfc3RhLT53aW5bbG93XS5hdmVyYWdlX3RwdDsKKworCWlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCkKKwkJaGlnaF90cHQgPSByc19zdGEtPndpbltoaWdoXS5hdmVyYWdlX3RwdDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJc2NhbGVfYWN0aW9uID0gMDsKKworCS8qIExvdyBzdWNjZXNzIHJhdGlvICwgbmVlZCB0byBkcm9wIHRoZSByYXRlICovCisJaWYgKHdpbi0+c3VjY2Vzc19yYXRpbyA8IFJBVEVfREVDUkVBU0VfVEggfHwgIWN1cnJlbnRfdHB0KSB7CisJCURfUkFURSgiZGVjcmVhc2UgcmF0ZSBiZWNhdXNlIG9mIGxvdyBzdWNjZXNzX3JhdGlvXG4iKTsKKwkJc2NhbGVfYWN0aW9uID0gLTE7CisJCS8qIE5vIHRocm91Z2hwdXQgbWVhc3VyZWQgeWV0IGZvciBhZGphY2VudCByYXRlcywKKwkJICogdHJ5IGluY3JlYXNlICovCisJfSBlbHNlIGlmIChsb3dfdHB0ID09IElMX0lOVkFMSURfVkFMVUUgJiYgaGlnaF90cHQgPT0gSUxfSU5WQUxJRF9WQUxVRSkgeworCisJCWlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCAmJgorCQkgICAgd2luLT5zdWNjZXNzX3JhdGlvID49IFJBVEVfSU5DUkVBU0VfVEgpCisJCQlzY2FsZV9hY3Rpb24gPSAxOworCQllbHNlIGlmIChsb3cgIT0gUkFURV9JTlZBTElEKQorCQkJc2NhbGVfYWN0aW9uID0gMDsKKworCQkvKiBCb3RoIGFkamFjZW50IHRocm91Z2hwdXRzIGFyZSBtZWFzdXJlZCwgYnV0IG5laXRoZXIgb25lIGhhcworCQkgKiBiZXR0ZXIgdGhyb3VnaHB1dDsgd2UncmUgdXNpbmcgdGhlIGJlc3QgcmF0ZSwgZG9uJ3QgY2hhbmdlCisJCSAqIGl0ISAqLworCX0gZWxzZSBpZiAobG93X3RwdCAhPSBJTF9JTlZBTElEX1ZBTFVFICYmIGhpZ2hfdHB0ICE9IElMX0lOVkFMSURfVkFMVUUKKwkJICAgJiYgbG93X3RwdCA8IGN1cnJlbnRfdHB0ICYmIGhpZ2hfdHB0IDwgY3VycmVudF90cHQpIHsKKworCQlEX1JBVEUoIk5vIGFjdGlvbiAtLSBsb3cgWyVkXSAmIGhpZ2ggWyVkXSA8ICIKKwkJICAgICAgICJjdXJyZW50X3RwdCBbJWRdXG4iLCBsb3dfdHB0LCBoaWdoX3RwdCwgY3VycmVudF90cHQpOworCQlzY2FsZV9hY3Rpb24gPSAwOworCisJCS8qIEF0IGxlYXN0IG9uZSBvZiB0aGUgcmF0ZXMgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCisJfSBlbHNlIHsKKwkJaWYgKGhpZ2hfdHB0ICE9IElMX0lOVkFMSURfVkFMVUUpIHsKKworCQkJLyogSGlnaCByYXRlIGhhcyBiZXR0ZXIgdGhyb3VnaHB1dCwgSW5jcmVhc2UKKwkJCSAqIHJhdGUgKi8KKwkJCWlmIChoaWdoX3RwdCA+IGN1cnJlbnRfdHB0ICYmCisJCQkgICAgd2luLT5zdWNjZXNzX3JhdGlvID49IFJBVEVfSU5DUkVBU0VfVEgpCisJCQkJc2NhbGVfYWN0aW9uID0gMTsKKwkJCWVsc2UgeworCQkJCURfUkFURSgiZGVjcmVhc2UgcmF0ZSBiZWNhdXNlIG9mIGhpZ2ggdHB0XG4iKTsKKwkJCQlzY2FsZV9hY3Rpb24gPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKGxvd190cHQgIT0gSUxfSU5WQUxJRF9WQUxVRSkgeworCQkJaWYgKGxvd190cHQgPiBjdXJyZW50X3RwdCkgeworCQkJCURfUkFURSgiZGVjcmVhc2UgcmF0ZSBiZWNhdXNlIG9mIGxvdyB0cHRcbiIpOworCQkJCXNjYWxlX2FjdGlvbiA9IC0xOworCQkJfSBlbHNlIGlmICh3aW4tPnN1Y2Nlc3NfcmF0aW8gPj0gUkFURV9JTkNSRUFTRV9USCkgeworCQkJCS8qIExvd2VyIHJhdGUgaGFzIGJldHRlcgorCQkJCSAqIHRocm91Z2hwdXQsZGVjcmVhc2UgcmF0ZSAqLworCQkJCXNjYWxlX2FjdGlvbiA9IDE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTYW5pdHkgY2hlY2s7IGFza2VkIGZvciBkZWNyZWFzZSwgYnV0IHN1Y2Nlc3MgcmF0ZSBvciB0aHJvdWdocHV0CisJICogaGFzIGJlZW4gZ29vZCBhdCBvbGQgcmF0ZS4gIERvbid0IGNoYW5nZSBpdC4gKi8KKwlpZiAoc2NhbGVfYWN0aW9uID09IC0xICYmIGxvdyAhPSBSQVRFX0lOVkFMSUQgJiYKKwkgICAgKHdpbi0+c3VjY2Vzc19yYXRpbyA+IFJBVEVfSElHSF9USCB8fAorCSAgICAgY3VycmVudF90cHQgPiAxMDAgKiByc19zdGEtPmV4cGVjdGVkX3RwdFtsb3ddKSkKKwkJc2NhbGVfYWN0aW9uID0gMDsKKworCXN3aXRjaCAoc2NhbGVfYWN0aW9uKSB7CisJY2FzZSAtMToKKworCQkvKiBEZWNyZXNlIHJhdGUgKi8KKwkJaWYgKGxvdyAhPSBSQVRFX0lOVkFMSUQpCisJCQlpZHggPSBsb3c7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQkvKiBJbmNyZWFzZSByYXRlICovCisJCWlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCkKKwkJCWlkeCA9IGhpZ2g7CisKKwkJYnJlYWs7CisKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJLyogTm8gY2hhbmdlICovCisJCWJyZWFrOworCX0KKworCURfUkFURSgiU2VsZWN0ZWQgJWQgKGFjdGlvbiAlZCkgLSBsb3cgJWQgaGlnaCAlZFxuIiwgaWR4LCBzY2FsZV9hY3Rpb24sCisJICAgICAgIGxvdywgaGlnaCk7CisKK291dDoKKworCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCWlmIChXQVJOX09OX09OQ0UoaWR4IDwgSUxfRklSU1RfT0ZETV9SQVRFKSkKKwkJCWlkeCA9IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpZHg7CisJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gaWR4IC0gSUxfRklSU1RfT0ZETV9SQVRFOworCX0gZWxzZSB7CisJCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaWR4OworCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeCA9IHJzX3N0YS0+bGFzdF90eHJhdGVfaWR4OworCX0KKworCURfUkFURSgibGVhdmU6ICVkXG4iLCBpZHgpOworfQorCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKK3N0YXRpYyBpbnQKK2lsMzk0NV9vcGVuX2ZpbGVfZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3N0YV9kYmdmc19zdGF0c190YWJsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICpidWZmOworCWludCBkZXNjID0gMDsKKwlpbnQgajsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywKKwkJICAgICJ0eCBwYWNrZXRzPSVkIGxhc3QgcmF0ZSBpZHg9JWRcbiIKKwkJICAgICJyYXRlPTB4JVggZmx1c2ggdGltZSAlZFxuIiwgbHFfc3RhLT50eF9wYWNrZXRzLAorCQkgICAgbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHgsIGxxX3N0YS0+c3RhcnRfcmF0ZSwKKwkJICAgIGppZmZpZXNfdG9fbXNlY3MobHFfc3RhLT5mbHVzaF90aW1lKSk7CisJZm9yIChqID0gMDsgaiA8IFJBVEVfQ09VTlRfMzk0NTsgaisrKSB7CisJCWRlc2MgKz0KKwkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICJjb3VudGVyPSVkIHN1Y2Nlc3M9JWQgJSU9JWRcbiIsCisJCQkgICAgbHFfc3RhLT53aW5bal0uY291bnRlciwKKwkJCSAgICBscV9zdGEtPndpbltqXS5zdWNjZXNzX2NvdW50ZXIsCisJCQkgICAgbHFfc3RhLT53aW5bal0uc3VjY2Vzc19yYXRpbyk7CisJfQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmZiwgZGVzYyk7CisJa2ZyZWUoYnVmZik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX29wcyA9IHsKKwkucmVhZCA9IGlsMzk0NV9zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZCwKKwkub3BlbiA9IGlsMzk0NV9vcGVuX2ZpbGVfZ2VuZXJpYywKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgdm9pZAoraWwzOTQ1X2FkZF9kZWJ1Z2ZzKHZvaWQgKmlsLCB2b2lkICppbF9zdGEsIHN0cnVjdCBkZW50cnkgKmRpcikKK3sKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqbHFfc3RhID0gaWxfc3RhOworCisJbHFfc3RhLT5yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZSA9CisJICAgIGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJhdGVfc3RhdHNfdGFibGUiLCAwNjAwLCBkaXIsIGxxX3N0YSwKKwkJCQkmcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX29wcyk7CisKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9yZW1vdmVfZGVidWdmcyh2b2lkICppbCwgdm9pZCAqaWxfc3RhKQoreworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpscV9zdGEgPSBpbF9zdGE7CisJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZSk7Cit9CisjZW5kaWYKKworLyoKKyAqIEluaXRpYWxpemF0aW9uIG9mIHJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBpcyBkb25lIGJ5IGRyaXZlciBhZnRlcgorICogdGhlIHN0YXRpb24gaXMgYWRkZWQuIFNpbmNlIG1hYzgwMjExIGNhbGxzIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGEKKyAqIHN0YXRpb24gaXMgYWRkZWQgd2UgaWdub3JlIGl0LgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3JzX3JhdGVfaW5pdF9zdHViKHZvaWQgKmlsX3IsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKmlsX3N0YSkKK3sKK30KKworc3RhdGljIHN0cnVjdCByYXRlX2NvbnRyb2xfb3BzIHJzX29wcyA9IHsKKwkubW9kdWxlID0gTlVMTCwKKwkubmFtZSA9IFJTX05BTUUsCisJLnR4X3N0YXR1cyA9IGlsMzk0NV9yc190eF9zdGF0dXMsCisJLmdldF9yYXRlID0gaWwzOTQ1X3JzX2dldF9yYXRlLAorCS5yYXRlX2luaXQgPSBpbDM5NDVfcnNfcmF0ZV9pbml0X3N0dWIsCisJLmFsbG9jID0gaWwzOTQ1X3JzX2FsbG9jLAorCS5mcmVlID0gaWwzOTQ1X3JzX2ZyZWUsCisJLmFsbG9jX3N0YSA9IGlsMzk0NV9yc19hbGxvY19zdGEsCisJLmZyZWVfc3RhID0gaWwzOTQ1X3JzX2ZyZWVfc3RhLAorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCisJLmFkZF9zdGFfZGVidWdmcyA9IGlsMzk0NV9hZGRfZGVidWdmcywKKwkucmVtb3ZlX3N0YV9kZWJ1Z2ZzID0gaWwzOTQ1X3JlbW92ZV9kZWJ1Z2ZzLAorI2VuZGlmCisKK307CisKK3ZvaWQKK2lsMzk0NV9yYXRlX3NjYWxlX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHMzMiBzdGFfaWQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJczMyIHJzc2kgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOworCXN0cnVjdCBpbDM5NDVfc3RhX3ByaXYgKnBzdGE7CisKKwlEX1JBVEUoImVudGVyXG4iKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXN0YSA9CisJICAgIGllZWU4MDIxMV9maW5kX3N0YShpbC0+Y3R4LnZpZiwgaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyKTsKKwlpZiAoIXN0YSkgeworCQlEX1JBVEUoIlVuYWJsZSB0byBmaW5kIHN0YXRpb24gdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcuXG4iKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybjsKKwl9CisKKwlwc3RhID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCXJzX3N0YSA9ICZwc3RhLT5yc19zdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisKKwlyc19zdGEtPnRnZyA9IDA7CisJc3dpdGNoIChpbC0+YmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJLyogVE9ETzogdGhpcyBhbHdheXMgZG9lcyBHLCBub3QgYSByZWdyZXNzaW9uICovCisJCWlmIChpbC0+Y3R4LmFjdGl2ZS5mbGFncyAmIFJYT05fRkxHX1RHR19QUk9URUNUX01TSykgeworCQkJcnNfc3RhLT50Z2cgPSAxOworCQkJcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpbDM5NDVfZXhwZWN0ZWRfdHB0X2dfcHJvdDsKKwkJfSBlbHNlCisJCQlyc19zdGEtPmV4cGVjdGVkX3RwdCA9IGlsMzk0NV9leHBlY3RlZF90cHRfZzsKKwkJYnJlYWs7CisKKwljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6CisJCXJzX3N0YS0+ZXhwZWN0ZWRfdHB0ID0gaWwzOTQ1X2V4cGVjdGVkX3RwdF9hOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9OVU1fQkFORFM6CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCXJzc2kgPSBpbC0+XzM5NDUubGFzdF9yeF9yc3NpOworCWlmIChyc3NpID09IDApCisJCXJzc2kgPSBJTF9NSU5fUlNTSV9WQUw7CisKKwlEX1JBVEUoIk5ldHdvcmsgUlNTSTogJWRcbiIsIHJzc2kpOworCisJcnNfc3RhLT5zdGFydF9yYXRlID0gaWwzOTQ1X2dldF9yYXRlX2lkeF9ieV9yc3NpKHJzc2ksIGlsLT5iYW5kKTsKKworCURfUkFURSgibGVhdmU6IHJzc2kgJWQgYXNzaWduIHJhdGUgaWR4OiAiICIlZCAocGxjcCAweCV4KVxuIiwgcnNzaSwKKwkgICAgICAgcnNfc3RhLT5zdGFydF9yYXRlLCBpbDM5NDVfcmF0ZXNbcnNfc3RhLT5zdGFydF9yYXRlXS5wbGNwKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworaW50CitpbDM5NDVfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoJnJzX29wcyk7Cit9CisKK3ZvaWQKK2lsMzk0NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKQoreworCWllZWU4MDIxMV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigmcnNfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM2NjRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS5jCkBAIC0wLDAgKzEsMjc1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICIzOTQ1LmgiCisKKy8qIFNlbmQgbGVkIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9zZW5kX2xlZF9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbGVkX2NtZCAqbGVkX2NtZCkKK3sKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX0xFRFMsCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGlsX2xlZF9jbWQpLAorCQkuZGF0YSA9IGxlZF9jbWQsCisJCS5mbGFncyA9IENNRF9BU1lOQywKKwkJLmNhbGxiYWNrID0gTlVMTCwKKwl9OworCisJcmV0dXJuIGlsX3NlbmRfY21kKGlsLCAmY21kKTsKK30KKworY29uc3Qgc3RydWN0IGlsX2xlZF9vcHMgaWwzOTQ1X2xlZF9vcHMgPSB7CisJLmNtZCA9IGlsMzk0NV9zZW5kX2xlZF9jbWQsCit9OworCisjZGVmaW5lIElMX0RFQ0xBUkVfUkFURV9JTkZPKHIsIGlwLCBpbiwgcnAsIHJuLCBwcCwgbnApICAgIFwKKwlbUkFURV8jI3IjI01fSURYXSA9IHsgUkFURV8jI3IjI01fUExDUCwgICBcCisJCQkJICAgIFJBVEVfIyNyIyNNX0lFRUUsICAgXAorCQkJCSAgICBSQVRFXyMjaXAjI01fSURYLCBcCisJCQkJICAgIFJBVEVfIyNpbiMjTV9JRFgsIFwKKwkJCQkgICAgUkFURV8jI3JwIyNNX0lEWCwgXAorCQkJCSAgICBSQVRFXyMjcm4jI01fSURYLCBcCisJCQkJICAgIFJBVEVfIyNwcCMjTV9JRFgsIFwKKwkJCQkgICAgUkFURV8jI25wIyNNX0lEWCwgXAorCQkJCSAgICBSQVRFXyMjciMjTV9JRFhfVEJMLCBcCisJCQkJICAgIFJBVEVfIyNpcCMjTV9JRFhfVEJMIH0KKworLyoKKyAqIFBhcmFtZXRlciBvcmRlcjoKKyAqICAgcmF0ZSwgcHJldiByYXRlLCBuZXh0IHJhdGUsIHByZXYgdGdnIHJhdGUsIG5leHQgdGdnIHJhdGUKKyAqCisgKiBJZiB0aGVyZSBpc24ndCBhIHZhbGlkIG5leHQgb3IgcHJldmlvdXMgcmF0ZSB0aGVuIElOViBpcyB1c2VkIHdoaWNoCisgKiBtYXBzIHRvIFJBVEVfSU5WQUxJRAorICoKKyAqLworY29uc3Qgc3RydWN0IGlsMzk0NV9yYXRlX2luZm8gaWwzOTQ1X3JhdGVzW1JBVEVfQ09VTlRfMzk0NV0gPSB7CisJSUxfREVDTEFSRV9SQVRFX0lORk8oMSwgSU5WLCAyLCBJTlYsIDIsIElOViwgMiksCS8qICAxbWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDIsIDEsIDUsIDEsIDUsIDEsIDUpLAkvKiAgMm1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTyg1LCAyLCA2LCAyLCAxMSwgMiwgMTEpLAkvKjUuNW1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygxMSwgOSwgMTIsIDUsIDEyLCA1LCAxOCksCS8qIDExbWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDYsIDUsIDksIDUsIDExLCA1LCAxMSksCS8qICA2bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDksIDYsIDExLCA1LCAxMSwgNSwgMTEpLAkvKiAgOW1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygxMiwgMTEsIDE4LCAxMSwgMTgsIDExLCAxOCksCS8qIDEybWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDE4LCAxMiwgMjQsIDEyLCAyNCwgMTEsIDI0KSwJLyogMThtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oMjQsIDE4LCAzNiwgMTgsIDM2LCAxOCwgMzYpLAkvKiAyNG1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygzNiwgMjQsIDQ4LCAyNCwgNDgsIDI0LCA0OCksCS8qIDM2bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDQ4LCAzNiwgNTQsIDM2LCA1NCwgMzYsIDU0KSwJLyogNDhtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oNTQsIDQ4LCBJTlYsIDQ4LCBJTlYsIDQ4LCBJTlYpLAkvKiA1NG1icHMgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsMzk0NV9nZXRfcHJldl9pZWVlX3JhdGUodTggcmF0ZV9pZHgpCit7CisJdTggcmF0ZSA9IGlsMzk0NV9yYXRlc1tyYXRlX2lkeF0ucHJldl9pZWVlOworCisJaWYgKHJhdGUgPT0gUkFURV9JTlZBTElEKQorCQlyYXRlID0gcmF0ZV9pZHg7CisJcmV0dXJuIHJhdGU7Cit9CisKKy8qIDEgPSBlbmFibGUgdGhlIGlsMzk0NV9kaXNhYmxlX2V2ZW50cygpIGZ1bmN0aW9uICovCisjZGVmaW5lIElMX0VWVF9ESVNBQkxFICgwKQorI2RlZmluZSBJTF9FVlRfRElTQUJMRV9TSVpFICgxNTMyLzMyKQorCisvKioKKyAqIGlsMzk0NV9kaXNhYmxlX2V2ZW50cyAtIERpc2FibGUgc2VsZWN0ZWQgZXZlbnRzIGluIHVDb2RlIGV2ZW50IGxvZworICoKKyAqIERpc2FibGUgYW4gZXZlbnQgYnkgd3JpdGluZyAiMSJzIGludG8gImRpc2FibGUiCisgKiAgIGJpdG1hcCBpbiBTUkFNLiAgQml0IHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIEV2ZW50ICMgKGlkL3R5cGUpLgorICogICBEZWZhdWx0IHZhbHVlcyBvZiAwIGVuYWJsZSB1Q29kZSBldmVudHMgdG8gYmUgbG9nZ2VkLgorICogVXNlIGZvciBvbmx5IHNwZWNpYWwgZGVidWdnaW5nLiAgVGhpcyBmdW5jdGlvbiBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgYXMtaXMsCisgKiAgIHlvdSdsbCBuZWVkIHRvIHByb3ZpZGUgdGhlIHNwZWNpYWwgYml0cyEgLi4uCisgKiAgIC4uLiBhbmQgc2V0IElMX0VWVF9ESVNBQkxFIHRvIDEuICovCit2b2lkCitpbDM5NDVfZGlzYWJsZV9ldmVudHMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCBpOworCXUzMiBiYXNlOwkJLyogU1JBTSBhZGRyZXNzIG9mIGV2ZW50IGxvZyBoZWFkZXIgKi8KKwl1MzIgZGlzYWJsZV9wdHI7CS8qIFNSQU0gYWRkcmVzcyBvZiBldmVudC1kaXNhYmxlIGJpdG1hcCBhcnJheSAqLworCXUzMiBhcnJheV9zaXplOwkJLyogIyBvZiB1MzIgZW50cmllcyBpbiBhcnJheSAqLworCXN0YXRpYyBjb25zdCB1MzIgZXZ0X2Rpc2FibGVbSUxfRVZUX0RJU0FCTEVfU0laRV0gPSB7CisJCTB4MDAwMDAwMDAsCS8qICAgMzEgLSAgICAwICBFdmVudCBpZCBudW1iZXJzICovCisJCTB4MDAwMDAwMDAsCS8qICAgNjMgLSAgIDMyICovCisJCTB4MDAwMDAwMDAsCS8qICAgOTUgLSAgIDY0ICovCisJCTB4MDAwMDAwMDAsCS8qICAxMjcgLSAgIDk2ICovCisJCTB4MDAwMDAwMDAsCS8qICAxNTkgLSAgMTI4ICovCisJCTB4MDAwMDAwMDAsCS8qICAxOTEgLSAgMTYwICovCisJCTB4MDAwMDAwMDAsCS8qICAyMjMgLSAgMTkyICovCisJCTB4MDAwMDAwMDAsCS8qICAyNTUgLSAgMjI0ICovCisJCTB4MDAwMDAwMDAsCS8qICAyODcgLSAgMjU2ICovCisJCTB4MDAwMDAwMDAsCS8qICAzMTkgLSAgMjg4ICovCisJCTB4MDAwMDAwMDAsCS8qICAzNTEgLSAgMzIwICovCisJCTB4MDAwMDAwMDAsCS8qICAzODMgLSAgMzUyICovCisJCTB4MDAwMDAwMDAsCS8qICA0MTUgLSAgMzg0ICovCisJCTB4MDAwMDAwMDAsCS8qICA0NDcgLSAgNDE2ICovCisJCTB4MDAwMDAwMDAsCS8qICA0NzkgLSAgNDQ4ICovCisJCTB4MDAwMDAwMDAsCS8qICA1MTEgLSAgNDgwICovCisJCTB4MDAwMDAwMDAsCS8qICA1NDMgLSAgNTEyICovCisJCTB4MDAwMDAwMDAsCS8qICA1NzUgLSAgNTQ0ICovCisJCTB4MDAwMDAwMDAsCS8qICA2MDcgLSAgNTc2ICovCisJCTB4MDAwMDAwMDAsCS8qICA2MzkgLSAgNjA4ICovCisJCTB4MDAwMDAwMDAsCS8qICA2NzEgLSAgNjQwICovCisJCTB4MDAwMDAwMDAsCS8qICA3MDMgLSAgNjcyICovCisJCTB4MDAwMDAwMDAsCS8qICA3MzUgLSAgNzA0ICovCisJCTB4MDAwMDAwMDAsCS8qICA3NjcgLSAgNzM2ICovCisJCTB4MDAwMDAwMDAsCS8qICA3OTkgLSAgNzY4ICovCisJCTB4MDAwMDAwMDAsCS8qICA4MzEgLSAgODAwICovCisJCTB4MDAwMDAwMDAsCS8qICA4NjMgLSAgODMyICovCisJCTB4MDAwMDAwMDAsCS8qICA4OTUgLSAgODY0ICovCisJCTB4MDAwMDAwMDAsCS8qICA5MjcgLSAgODk2ICovCisJCTB4MDAwMDAwMDAsCS8qICA5NTkgLSAgOTI4ICovCisJCTB4MDAwMDAwMDAsCS8qICA5OTEgLSAgOTYwICovCisJCTB4MDAwMDAwMDAsCS8qIDEwMjMgLSAgOTkyICovCisJCTB4MDAwMDAwMDAsCS8qIDEwNTUgLSAxMDI0ICovCisJCTB4MDAwMDAwMDAsCS8qIDEwODcgLSAxMDU2ICovCisJCTB4MDAwMDAwMDAsCS8qIDExMTkgLSAxMDg4ICovCisJCTB4MDAwMDAwMDAsCS8qIDExNTEgLSAxMTIwICovCisJCTB4MDAwMDAwMDAsCS8qIDExODMgLSAxMTUyICovCisJCTB4MDAwMDAwMDAsCS8qIDEyMTUgLSAxMTg0ICovCisJCTB4MDAwMDAwMDAsCS8qIDEyNDcgLSAxMjE2ICovCisJCTB4MDAwMDAwMDAsCS8qIDEyNzkgLSAxMjQ4ICovCisJCTB4MDAwMDAwMDAsCS8qIDEzMTEgLSAxMjgwICovCisJCTB4MDAwMDAwMDAsCS8qIDEzNDMgLSAxMzEyICovCisJCTB4MDAwMDAwMDAsCS8qIDEzNzUgLSAxMzQ0ICovCisJCTB4MDAwMDAwMDAsCS8qIDE0MDcgLSAxMzc2ICovCisJCTB4MDAwMDAwMDAsCS8qIDE0MzkgLSAxNDA4ICovCisJCTB4MDAwMDAwMDAsCS8qIDE0NzEgLSAxNDQwICovCisJCTB4MDAwMDAwMDAsCS8qIDE1MDMgLSAxNDcyICovCisJfTsKKworCWJhc2UgPSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZS5sb2dfZXZlbnRfdGFibGVfcHRyKTsKKwlpZiAoIWlsMzk0NV9od192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CisJCUlMX0VSUigiSW52YWxpZCBldmVudCBsb2cgcG9pbnRlciAweCUwOFhcbiIsIGJhc2UpOworCQlyZXR1cm47CisJfQorCisJZGlzYWJsZV9wdHIgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgKDQgKiBzaXplb2YodTMyKSkpOworCWFycmF5X3NpemUgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgKDUgKiBzaXplb2YodTMyKSkpOworCisJaWYgKElMX0VWVF9ESVNBQkxFICYmIGFycmF5X3NpemUgPT0gSUxfRVZUX0RJU0FCTEVfU0laRSkgeworCQlEX0lORk8oIkRpc2FibGluZyBzZWxlY3RlZCB1Q29kZSBsb2cgZXZlbnRzIGF0IDB4JXhcbiIsCisJCSAgICAgICBkaXNhYmxlX3B0cik7CisJCWZvciAoaSA9IDA7IGkgPCBJTF9FVlRfRElTQUJMRV9TSVpFOyBpKyspCisJCQlpbF93cml0ZV90YXJnX21lbShpbCwgZGlzYWJsZV9wdHIgKyAoaSAqIHNpemVvZih1MzIpKSwKKwkJCQkJICBldnRfZGlzYWJsZVtpXSk7CisKKwl9IGVsc2UgeworCQlEX0lORk8oIlNlbGVjdGVkIHVDb2RlIGxvZyBldmVudHMgbWF5IGJlIGRpc2FibGVkXG4iKTsKKwkJRF9JTkZPKCIgIGJ5IHdyaXRpbmcgXCIxXCJzIGludG8gZGlzYWJsZSBiaXRtYXBcbiIpOworCQlEX0lORk8oIiAgaW4gU1JBTSBhdCAweCV4LCBzaXplICVkIHUzMnNcbiIsIGRpc2FibGVfcHRyLAorCQkgICAgICAgYXJyYXlfc2l6ZSk7CisJfQorCit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9od3JhdGVfdG9fcGxjcF9pZHgodTggcGxjcCkKK3sKKwlpbnQgaWR4OworCisJZm9yIChpZHggPSAwOyBpZHggPCBSQVRFX0NPVU5UXzM5NDU7IGlkeCsrKQorCQlpZiAoaWwzOTQ1X3JhdGVzW2lkeF0ucGxjcCA9PSBwbGNwKQorCQkJcmV0dXJuIGlkeDsKKwlyZXR1cm4gLTE7Cit9CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKyNkZWZpbmUgVFhfU1RBVFVTX0VOVFJZKHgpIGNhc2UgVFhfMzk0NV9TVEFUVVNfRkFJTF8gIyMgeDogcmV0dXJuICN4CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2lsMzk0NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKK3sKKwlzd2l0Y2ggKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spIHsKKwljYXNlIFRYXzM5NDVfU1RBVFVTX1NVQ0NFU1M6CisJCXJldHVybiAiU1VDQ0VTUyI7CisJCVRYX1NUQVRVU19FTlRSWShTSE9SVF9MSU1JVCk7CisJCVRYX1NUQVRVU19FTlRSWShMT05HX0xJTUlUKTsKKwkJVFhfU1RBVFVTX0VOVFJZKEZJRk9fVU5ERVJSVU4pOworCQlUWF9TVEFUVVNfRU5UUlkoTUdNTlRfQUJPUlQpOworCQlUWF9TVEFUVVNfRU5UUlkoTkVYVF9GUkFHKTsKKwkJVFhfU1RBVFVTX0VOVFJZKExJRkVfRVhQSVJFKTsKKwkJVFhfU1RBVFVTX0VOVFJZKERFU1RfUFMpOworCQlUWF9TVEFUVVNfRU5UUlkoQUJPUlRFRCk7CisJCVRYX1NUQVRVU19FTlRSWShCVF9SRVRSWSk7CisJCVRYX1NUQVRVU19FTlRSWShTVEFfSU5WQUxJRCk7CisJCVRYX1NUQVRVU19FTlRSWShGUkFHX0RST1BQRUQpOworCQlUWF9TVEFUVVNfRU5UUlkoVElEX0RJU0FCTEUpOworCQlUWF9TVEFUVVNfRU5UUlkoRlJBTUVfRkxVU0hFRCk7CisJCVRYX1NUQVRVU19FTlRSWShJTlNVRkZJQ0lFTlRfQ0ZfUE9MTCk7CisJCVRYX1NUQVRVU19FTlRSWShUWF9MT0NLRUQpOworCQlUWF9TVEFUVVNfRU5UUlkoTk9fQkVBQ09OX09OX1JBREFSKTsKKwl9CisKKwlyZXR1cm4gIlVOS05PV04iOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCitpbDM5NDVfZ2V0X3R4X2ZhaWxfcmVhc29uKHUzMiBzdGF0dXMpCit7CisJcmV0dXJuICIiOworfQorI2VuZGlmCisKKy8qCisgKiBnZXQgaWVlZSBwcmV2IHJhdGUgZnJvbSByYXRlIHNjYWxlIHRhYmxlLgorICogZm9yIEEgYW5kIEIgbW9kZSB3ZSBuZWVkIHRvIG92ZXJyaWdodCBwcmV2CisgKiB2YWx1ZQorICovCitpbnQKK2lsMzk0NV9yc19uZXh0X3JhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgcmF0ZSkKK3sKKwlpbnQgbmV4dF9yYXRlID0gaWwzOTQ1X2dldF9wcmV2X2llZWVfcmF0ZShyYXRlKTsKKworCXN3aXRjaCAoaWwtPmJhbmQpIHsKKwljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6CisJCWlmIChyYXRlID09IFJBVEVfMTJNX0lEWCkKKwkJCW5leHRfcmF0ZSA9IFJBVEVfOU1fSURYOworCQllbHNlIGlmIChyYXRlID09IFJBVEVfNk1fSURYKQorCQkJbmV4dF9yYXRlID0gUkFURV82TV9JRFg7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJaWYgKCEoaWwtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzICYgSUxfT0ZETV9SQVRFU19NQVNLKSAmJgorCQkgICAgaWxfaXNfYXNzb2NpYXRlZChpbCkpIHsKKwkJCWlmIChyYXRlID09IFJBVEVfMTFNX0lEWCkKKwkJCQluZXh0X3JhdGUgPSBSQVRFXzVNX0lEWDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBuZXh0X3JhdGU7Cit9CisKKy8qKgorICogaWwzOTQ1X3R4X3F1ZXVlX3JlY2xhaW0gLSBSZWNsYWltIFR4IHF1ZXVlIGVudHJpZXMgYWxyZWFkeSBUeCdkCisgKgorICogV2hlbiBGVyBhZHZhbmNlcyAnUicgaWR4LCBhbGwgZW50cmllcyBiZXR3ZWVuIG9sZCBhbmQgbmV3ICdSJyBpZHgKKyAqIG5lZWQgdG8gYmUgcmVjbGFpbWVkLiBBcyByZXN1bHQsIHNvbWUgZnJlZSBzcGFjZSBmb3Jtcy4gSWYgdGhlcmUgaXMKKyAqIGVub3VnaCBmcmVlIHNwYWNlICg+IGxvdyBtYXJrKSwgd2FrZSB0aGUgc3RhY2sgdGhhdCBmZWVkcyB1cy4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV90eF9xdWV1ZV9yZWNsYWltKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSA9ICZpbC0+dHhxW3R4cV9pZF07CisJc3RydWN0IGlsX3F1ZXVlICpxID0gJnR4cS0+cTsKKwlzdHJ1Y3QgaWxfdHhfaW5mbyAqdHhfaW5mbzsKKworCUJVR19PTih0eHFfaWQgPT0gSUwzOV9DTURfUVVFVUVfTlVNKTsKKworCWZvciAoaWR4ID0gaWxfcXVldWVfaW5jX3dyYXAoaWR4LCBxLT5uX2JkKTsgcS0+cmVhZF9wdHIgIT0gaWR4OworCSAgICAgcS0+cmVhZF9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKKworCQl0eF9pbmZvID0gJnR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl07CisJCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShpbC0+aHcsIHR4X2luZm8tPnNrYik7CisJCXR4X2luZm8tPnNrYiA9IE5VTEw7CisJCWlsLT5jZmctPm9wcy0+bGliLT50eHFfZnJlZV90ZmQoaWwsIHR4cSk7CisJfQorCisJaWYgKGlsX3F1ZXVlX3NwYWNlKHEpID4gcS0+bG93X21hcmsgJiYgdHhxX2lkID49IDAgJiYKKwkgICAgdHhxX2lkICE9IElMMzlfQ01EX1FVRVVFX05VTSAmJiBpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKKwkJaWxfd2FrZV9xdWV1ZShpbCwgdHhxKTsKK30KKworLyoqCisgKiBpbDM5NDVfaGRsX3R4IC0gSGFuZGxlIFR4IHJlc3BvbnNlCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfaGRsX3R4KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJdTE2IHNlcXVlbmNlID0gbGUxNl90b19jcHUocGt0LT5oZHIuc2VxdWVuY2UpOworCWludCB0eHFfaWQgPSBTRVFfVE9fUVVFVUUoc2VxdWVuY2UpOworCWludCBpZHggPSBTRVFfVE9fSURYKHNlcXVlbmNlKTsKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSA9ICZpbC0+dHhxW3R4cV9pZF07CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCXN0cnVjdCBpbDM5NDVfdHhfcmVzcCAqdHhfcmVzcCA9ICh2b2lkICopJnBrdC0+dS5yYXdbMF07CisJdTMyIHN0YXR1cyA9IGxlMzJfdG9fY3B1KHR4X3Jlc3AtPnN0YXR1cyk7CisJaW50IHJhdGVfaWR4OworCWludCBmYWlsOworCisJaWYgKGlkeCA+PSB0eHEtPnEubl9iZCB8fCBpbF9xdWV1ZV91c2VkKCZ0eHEtPnEsIGlkeCkgPT0gMCkgeworCQlJTF9FUlIoIlJlYWQgaWR4IGZvciBETUEgcXVldWUgdHhxX2lkICglZCkgaWR4ICVkICIKKwkJICAgICAgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkXG4iLCB0eHFfaWQsIGlkeCwKKwkJICAgICAgIHR4cS0+cS5uX2JkLCB0eHEtPnEud3JpdGVfcHRyLCB0eHEtPnEucmVhZF9wdHIpOworCQlyZXR1cm47CisJfQorCisJdHhxLT50aW1lX3N0YW1wID0gamlmZmllczsKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQih0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYik7CisJaWVlZTgwMjExX3R4X2luZm9fY2xlYXJfc3RhdHVzKGluZm8pOworCisJLyogRmlsbCB0aGUgTVJSIGNoYWluIHdpdGggc29tZSBpbmZvIGFib3V0IG9uLWNoaXAgcmV0cmFuc21pc3Npb25zICovCisJcmF0ZV9pZHggPSBpbDM5NDVfaHdyYXRlX3RvX3BsY3BfaWR4KHR4X3Jlc3AtPnJhdGUpOworCWlmIChpbmZvLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCXJhdGVfaWR4IC09IElMX0ZJUlNUX09GRE1fUkFURTsKKworCWZhaWwgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lOworCisJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeCA9IHJhdGVfaWR4OworCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IGZhaWwgKyAxOwkvKiBhZGQgZmluYWwgYXR0ZW1wdCAqLworCisJLyogdHhfc3RhdHVzLT5ydHNfcmV0cnlfY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX3J0czsgKi8KKwlpbmZvLT5mbGFncyB8PQorCSAgICAoKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spID09CisJICAgICBUWF9TVEFUVVNfU1VDQ0VTUykgPyBJRUVFODAyMTFfVFhfU1RBVF9BQ0sgOiAwOworCisJRF9UWCgiVHggcXVldWUgJWQgU3RhdHVzICVzICgweCUwOHgpIHBsY3AgcmF0ZSAlZCByZXRyaWVzICVkXG4iLCB0eHFfaWQsCisJICAgICBpbDM5NDVfZ2V0X3R4X2ZhaWxfcmVhc29uKHN0YXR1cyksIHN0YXR1cywgdHhfcmVzcC0+cmF0ZSwKKwkgICAgIHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUpOworCisJRF9UWF9SRVBMWSgiVHggcXVldWUgcmVjbGFpbSAlZFxuIiwgaWR4KTsKKwlpbDM5NDVfdHhfcXVldWVfcmVjbGFpbShpbCwgdHhxX2lkLCBpZHgpOworCisJaWYgKHN0YXR1cyAmIFRYX0FCT1JUX1JFUVVJUkVEX01TSykKKwkJSUxfRVJSKCJUT0RPOiAgSW1wbGVtZW50IFR4IEFCT1JUIFJFUVVJUkVEISEhXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW50ZWwgUFJPL1dpcmVsZXNzIDM5NDVBQkcvQkcgTmV0d29yayBDb25uZWN0aW9uCisgKgorICogIFJYIGhhbmRsZXIgaW1wbGVtZW50YXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCitzdGF0aWMgdm9pZAoraWwzOTQ1X2FjY3VtdWxhdGl2ZV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIF9fbGUzMiAqIHN0YXRzKQoreworCWludCBpOworCV9fbGUzMiAqcHJldl9zdGF0czsKKwl1MzIgKmFjY3VtX3N0YXRzOworCXUzMiAqZGVsdGEsICptYXhfZGVsdGE7CisKKwlwcmV2X3N0YXRzID0gKF9fbGUzMiAqKSAmaWwtPl8zOTQ1LnN0YXRzOworCWFjY3VtX3N0YXRzID0gKHUzMiAqKSAmaWwtPl8zOTQ1LmFjY3VtX3N0YXRzOworCWRlbHRhID0gKHUzMiAqKSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzOworCW1heF9kZWx0YSA9ICh1MzIgKikgJmlsLT5fMzk0NS5tYXhfZGVsdGE7CisKKwlmb3IgKGkgPSBzaXplb2YoX19sZTMyKTsgaSA8IHNpemVvZihzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzKTsKKwkgICAgIGkgKz0KKwkgICAgIHNpemVvZihfX2xlMzIpLCBzdGF0cysrLCBwcmV2X3N0YXRzKyssIGRlbHRhKyssIG1heF9kZWx0YSsrLAorCSAgICAgYWNjdW1fc3RhdHMrKykgeworCQlpZiAobGUzMl90b19jcHUoKnN0YXRzKSA+IGxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSkgeworCQkJKmRlbHRhID0KKwkJCSAgICAobGUzMl90b19jcHUoKnN0YXRzKSAtIGxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSk7CisJCQkqYWNjdW1fc3RhdHMgKz0gKmRlbHRhOworCQkJaWYgKCpkZWx0YSA+ICptYXhfZGVsdGEpCisJCQkJKm1heF9kZWx0YSA9ICpkZWx0YTsKKwkJfQorCX0KKworCS8qIHJlc2V0IGFjY3VtdWxhdGl2ZSBzdGF0cyBmb3IgIm5vLWNvdW50ZXIiIHR5cGUgc3RhdHMgKi8KKwlpbC0+XzM5NDUuYWNjdW1fc3RhdHMuZ2VuZXJhbC50ZW1wZXJhdHVyZSA9CisJICAgIGlsLT5fMzk0NS5zdGF0cy5nZW5lcmFsLnRlbXBlcmF0dXJlOworCWlsLT5fMzk0NS5hY2N1bV9zdGF0cy5nZW5lcmFsLnR0bF90aW1lc3RhbXAgPQorCSAgICBpbC0+XzM5NDUuc3RhdHMuZ2VuZXJhbC50dGxfdGltZXN0YW1wOworfQorI2VuZGlmCisKK3ZvaWQKK2lsMzk0NV9oZGxfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKworCURfUlgoIlN0YXRpc3RpY3Mgbm90aWZpY2F0aW9uIHJlY2VpdmVkICglZCB2cyAlZCkuXG4iLAorCSAgICAgKGludClzaXplb2Yoc3RydWN0IGlsMzk0NV9ub3RpZl9zdGF0cyksCisJICAgICBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIElMX1JYX0ZSQU1FX1NJWkVfTVNLKTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCWlsMzk0NV9hY2N1bXVsYXRpdmVfc3RhdHMoaWwsIChfX2xlMzIgKikgJnBrdC0+dS5yYXcpOworI2VuZGlmCisKKwltZW1jcHkoJmlsLT5fMzk0NS5zdGF0cywgcGt0LT51LnJhdywgc2l6ZW9mKGlsLT5fMzk0NS5zdGF0cykpOworfQorCit2b2lkCitpbDM5NDVfaGRsX2Nfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlfX2xlMzIgKmZsYWcgPSAoX19sZTMyICopICZwa3QtPnUucmF3OworCisJaWYgKGxlMzJfdG9fY3B1KCpmbGFnKSAmIFVDT0RFX1NUQVRTX0NMRUFSX01TSykgeworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJCW1lbXNldCgmaWwtPl8zOTQ1LmFjY3VtX3N0YXRzLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMpKTsKKwkJbWVtc2V0KCZpbC0+XzM5NDUuZGVsdGFfc3RhdHMsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsMzk0NV9ub3RpZl9zdGF0cykpOworCQltZW1zZXQoJmlsLT5fMzk0NS5tYXhfZGVsdGEsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsMzk0NV9ub3RpZl9zdGF0cykpOworI2VuZGlmCisJCURfUlgoIlN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOworCX0KKwlpbDM5NDVfaGRsX3N0YXRzKGlsLCByeGIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWlzYy4gaW50ZXJuYWwgc3RhdGUgYW5kIGhlbHBlciBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIGlzIG5lY2Vzc2FyeSBvbmx5IGZvciBhIG51bWJlciBvZiBzdGF0cywgc2VlIHRoZSBjYWxsZXIuICovCitzdGF0aWMgaW50CitpbDM5NDVfaXNfbmV0d29ya19wYWNrZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQoreworCS8qIEZpbHRlciBpbmNvbWluZyBwYWNrZXRzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSB0YXJnZXRlZCB0b3dhcmQKKwkgKiB0aGlzIG5ldHdvcmssIGRpc2NhcmRpbmcgcGFja2V0cyBjb21pbmcgZnJvbSBvdXJzZWx2ZXMgKi8KKwlzd2l0Y2ggKGlsLT5pd19tb2RlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoJLyogSGVhZGVyOiBEZXN0LiB8IFNvdXJjZSAgICB8IEJTU0lEICovCisJCS8qIHBhY2tldHMgdG8gb3VyIElCU1MgdXBkYXRlIGluZm9ybWF0aW9uICovCisJCXJldHVybiAhY29tcGFyZV9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjMsIGlsLT5ic3NpZCk7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgkvKiBIZWFkZXI6IERlc3QuIHwgQVB7QlNTSUR9IHwgU291cmNlICovCisJCS8qIHBhY2tldHMgdG8gb3VyIElCU1MgdXBkYXRlIGluZm9ybWF0aW9uICovCisJCXJldHVybiAhY29tcGFyZV9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjIsIGlsLT5ic3NpZCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0cykKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilJTF9SWF9EQVRBKHBrdCk7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9oZHIgKnJ4X2hkciA9IElMX1JYX0hEUihwa3QpOworCXN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfZW5kICpyeF9lbmQgPSBJTF9SWF9FTkQocGt0KTsKKwl1MTYgbGVuID0gbGUxNl90b19jcHUocnhfaGRyLT5sZW4pOworCXN0cnVjdCBza19idWZmICpza2I7CisJX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCisJLyogV2UgcmVjZWl2ZWQgZGF0YSBmcm9tIHRoZSBIVywgc28gc3RvcCB0aGUgd2F0Y2hkb2cgKi8KKwlpZiAodW5saWtlbHkKKwkgICAgKGxlbiArIElMMzlfUlhfRlJBTUVfU0laRSA+CisJICAgICBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKSkgeworCQlEX0RST1AoIkNvcnJ1cHRpb24gZGV0ZWN0ZWQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIG9ubHkgcHJvY2VzcyBkYXRhIHBhY2tldHMgaWYgdGhlIGludGVyZmFjZSBpcyBvcGVuICovCisJaWYgKHVubGlrZWx5KCFpbC0+aXNfb3BlbikpIHsKKwkJRF9EUk9QKCJEcm9wcGluZyBwYWNrZXQgd2hpbGUgaW50ZXJmYWNlIGlzIG5vdCBvcGVuLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7CisJaWYgKCFza2IpIHsKKwkJSUxfRVJSKCJkZXZfYWxsb2Nfc2tiIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWlsMzk0NV9tb2RfcGFyYW1zLnN3X2NyeXB0bykKKwkJaWxfc2V0X2RlY3J5cHRlZF9mbGFnKGlsLCAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilyeGJfYWRkcihyeGIpLAorCQkJCSAgICAgIGxlMzJfdG9fY3B1KHJ4X2VuZC0+c3RhdHVzKSwgc3RhdHMpOworCisJc2tiX2FkZF9yeF9mcmFnKHNrYiwgMCwgcnhiLT5wYWdlLAorCQkJKHZvaWQgKilyeF9oZHItPnBheWxvYWQgLSAodm9pZCAqKXBrdCwgbGVuKTsKKworCWlsX3VwZGF0ZV9zdGF0cyhpbCwgZmFsc2UsIGZjLCBsZW4pOworCW1lbWNweShJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKSwgc3RhdHMsIHNpemVvZigqc3RhdHMpKTsKKworCWllZWU4MDIxMV9yeChpbC0+aHcsIHNrYik7CisJaWwtPmFsbG9jX3J4Yl9wYWdlLS07CisJcnhiLT5wYWdlID0gTlVMTDsKK30KKworI2RlZmluZSBJTF9ERUxBWV9ORVhUX1NDQU5fQUZURVJfQVNTT0MgKEhaKjYpCisKK3N0YXRpYyB2b2lkCitpbDM5NDVfaGRsX3J4KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXI7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9zdGF0cyAqcnhfc3RhdHMgPSBJTF9SWF9TVEFUUyhwa3QpOworCXN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfaGRyICpyeF9oZHIgPSBJTF9SWF9IRFIocGt0KTsKKwlzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lX2VuZCAqcnhfZW5kID0gSUxfUlhfRU5EKHBrdCk7CisJdTE2IHJ4X3N0YXRzX3NpZ19hdmcgX19tYXliZV91bnVzZWQgPSBsZTE2X3RvX2NwdShyeF9zdGF0cy0+c2lnX2F2Zyk7CisJdTE2IHJ4X3N0YXRzX25vaXNlX2RpZmYgX19tYXliZV91bnVzZWQgPQorCSAgICBsZTE2X3RvX2NwdShyeF9zdGF0cy0+bm9pc2VfZGlmZik7CisJdTggbmV0d29ya19wYWNrZXQ7CisKKwlyeF9zdGF0dXMuZmxhZyA9IDA7CisJcnhfc3RhdHVzLm1hY3RpbWUgPSBsZTY0X3RvX2NwdShyeF9lbmQtPnRpbWVzdGFtcCk7CisJcnhfc3RhdHVzLmJhbmQgPQorCSAgICAocnhfaGRyLT4KKwkgICAgIHBoeV9mbGFncyAmIFJYX1JFU19QSFlfRkxBR1NfQkFORF8yNF9NU0spID8gSUVFRTgwMjExX0JBTkRfMkdIWiA6CisJICAgIElFRUU4MDIxMV9CQU5EXzVHSFo7CisJcnhfc3RhdHVzLmZyZXEgPQorCSAgICBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kobGUxNl90b19jcHUocnhfaGRyLT5jaGFubmVsKSwKKwkJCQkJICAgcnhfc3RhdHVzLmJhbmQpOworCisJcnhfc3RhdHVzLnJhdGVfaWR4ID0gaWwzOTQ1X2h3cmF0ZV90b19wbGNwX2lkeChyeF9oZHItPnJhdGUpOworCWlmIChyeF9zdGF0dXMuYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlyeF9zdGF0dXMucmF0ZV9pZHggLT0gSUxfRklSU1RfT0ZETV9SQVRFOworCisJcnhfc3RhdHVzLmFudGVubmEgPQorCSAgICAobGUxNl90b19jcHUocnhfaGRyLT5waHlfZmxhZ3MpICYgUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX01TSykgPj4KKwkgICAgNDsKKworCS8qIHNldCB0aGUgcHJlYW1ibGUgZmxhZyBpZiBhcHByb3ByaWF0ZSAqLworCWlmIChyeF9oZHItPnBoeV9mbGFncyAmIFJYX1JFU19QSFlfRkxBR1NfU0hPUlRfUFJFQU1CTEVfTVNLKQorCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX1NIT1JUUFJFOworCisJaWYgKCh1bmxpa2VseShyeF9zdGF0cy0+cGh5X2NvdW50ID4gMjApKSkgeworCQlEX0RST1AoImRzcCBzaXplIG91dCBvZiByYW5nZSBbMCwyMF06ICVkL24iLAorCQkgICAgICAgcnhfc3RhdHMtPnBoeV9jb3VudCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShyeF9lbmQtPnN0YXR1cyAmIFJYX1JFU19TVEFUVVNfTk9fQ1JDMzJfRVJST1IpIHx8CisJICAgICEocnhfZW5kLT5zdGF0dXMgJiBSWF9SRVNfU1RBVFVTX05PX1JYRV9PVkVSRkxPVykpIHsKKwkJRF9SWCgiQmFkIENSQyBvciBGSUZPOiAweCUwOFguXG4iLCByeF9lbmQtPnN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb252ZXJ0IDM5NDUncyByc3NpIGluZGljYXRvciB0byBkQm0gKi8KKwlyeF9zdGF0dXMuc2lnbmFsID0gcnhfc3RhdHMtPnJzc2kgLSBJTDM5X1JTU0lfT0ZGU0VUOworCisJRF9TVEFUUygiUnNzaSAlZCBzaWdfYXZnICVkIG5vaXNlX2RpZmYgJWRcbiIsIHJ4X3N0YXR1cy5zaWduYWwsCisJCXJ4X3N0YXRzX3NpZ19hdmcsIHJ4X3N0YXRzX25vaXNlX2RpZmYpOworCisJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopSUxfUlhfREFUQShwa3QpOworCisJbmV0d29ya19wYWNrZXQgPSBpbDM5NDVfaXNfbmV0d29ya19wYWNrZXQoaWwsIGhlYWRlcik7CisKKwlEX1NUQVRTKCJbJWNdICVkIFJTU0k6JWQgU2lnbmFsOiV1LCBSYXRlOiV1XG4iLAorCQluZXR3b3JrX3BhY2tldCA/ICcqJyA6ICcgJywgbGUxNl90b19jcHUocnhfaGRyLT5jaGFubmVsKSwKKwkJcnhfc3RhdHVzLnNpZ25hbCwgcnhfc3RhdHVzLnNpZ25hbCwgcnhfc3RhdHVzLnJhdGVfaWR4KTsKKworCWlsX2RiZ19sb2dfcnhfZGF0YV9mcmFtZShpbCwgbGUxNl90b19jcHUocnhfaGRyLT5sZW4pLCBoZWFkZXIpOworCisJaWYgKG5ldHdvcmtfcGFja2V0KSB7CisJCWlsLT5fMzk0NS5sYXN0X2JlYWNvbl90aW1lID0KKwkJICAgIGxlMzJfdG9fY3B1KHJ4X2VuZC0+YmVhY29uX3RpbWVzdGFtcCk7CisJCWlsLT5fMzk0NS5sYXN0X3RzZiA9IGxlNjRfdG9fY3B1KHJ4X2VuZC0+dGltZXN0YW1wKTsKKwkJaWwtPl8zOTQ1Lmxhc3RfcnhfcnNzaSA9IHJ4X3N0YXR1cy5zaWduYWw7CisJfQorCisJaWwzOTQ1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKGlsLCByeGIsICZyeF9zdGF0dXMpOworfQorCitpbnQKK2lsMzk0NV9od190eHFfYXR0YWNoX2J1Zl90b190ZmQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwKKwkJCQlkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sIHU4IHJlc2V0LCB1OCBwYWQpCit7CisJaW50IGNvdW50OworCXN0cnVjdCBpbF9xdWV1ZSAqcTsKKwlzdHJ1Y3QgaWwzOTQ1X3RmZCAqdGZkLCAqdGZkX3RtcDsKKworCXEgPSAmdHhxLT5xOworCXRmZF90bXAgPSAoc3RydWN0IGlsMzk0NV90ZmQgKil0eHEtPnRmZHM7CisJdGZkID0gJnRmZF90bXBbcS0+d3JpdGVfcHRyXTsKKworCWlmIChyZXNldCkKKwkJbWVtc2V0KHRmZCwgMCwgc2l6ZW9mKCp0ZmQpKTsKKworCWNvdW50ID0gVEZEX0NUTF9DT1VOVF9HRVQobGUzMl90b19jcHUodGZkLT5jb250cm9sX2ZsYWdzKSk7CisKKwlpZiAoY291bnQgPj0gTlVNX1RGRF9DSFVOS1MgfHwgY291bnQgPCAwKSB7CisJCUlMX0VSUigiRXJyb3IgY2FuIG5vdCBzZW5kIG1vcmUgdGhhbiAlZCBjaHVua3NcbiIsCisJCSAgICAgICBOVU1fVEZEX0NIVU5LUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRmZC0+dGJzW2NvdW50XS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CisJdGZkLT50YnNbY291bnRdLmxlbiA9IGNwdV90b19sZTMyKGxlbik7CisKKwljb3VudCsrOworCisJdGZkLT5jb250cm9sX2ZsYWdzID0KKwkgICAgY3B1X3RvX2xlMzIoVEZEX0NUTF9DT1VOVF9TRVQoY291bnQpIHwgVEZEX0NUTF9QQURfU0VUKHBhZCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWwzOTQ1X2h3X3R4cV9mcmVlX3RmZCAtIEZyZWUgb25lIFRGRCwgdGhvc2UgYXQgaWR4IFt0eHEtPnEucmVhZF9wdHJdCisgKgorICogRG9lcyBOT1QgYWR2YW5jZSBhbnkgaWR4ZXMKKyAqLwordm9pZAoraWwzOTQ1X2h3X3R4cV9mcmVlX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKQoreworCXN0cnVjdCBpbDM5NDVfdGZkICp0ZmRfdG1wID0gKHN0cnVjdCBpbDM5NDVfdGZkICopdHhxLT50ZmRzOworCWludCBpZHggPSB0eHEtPnEucmVhZF9wdHI7CisJc3RydWN0IGlsMzk0NV90ZmQgKnRmZCA9ICZ0ZmRfdG1wW2lkeF07CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGlsLT5wY2lfZGV2OworCWludCBpOworCWludCBjb3VudGVyOworCisJLyogc2FuaXR5IGNoZWNrICovCisJY291bnRlciA9IFRGRF9DVExfQ09VTlRfR0VUKGxlMzJfdG9fY3B1KHRmZC0+Y29udHJvbF9mbGFncykpOworCWlmIChjb3VudGVyID4gTlVNX1RGRF9DSFVOS1MpIHsKKwkJSUxfRVJSKCJUb28gbWFueSBjaHVua3M6ICVpXG4iLCBjb3VudGVyKTsKKwkJLyogQHRvZG8gaXNzdWUgZmF0YWwgZXJyb3IsIGl0IGlzIHF1aXRlIHNlcmlvdXMgc2l0dWF0aW9uICovCisJCXJldHVybjsKKwl9CisKKwkvKiBVbm1hcCB0eF9jbWQgKi8KKwlpZiAoY291bnRlcikKKwkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaWR4XSwgbWFwcGluZyksCisJCQkJIGRtYV91bm1hcF9sZW4oJnR4cS0+bWV0YVtpZHhdLCBsZW4pLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKworCS8qIHVubWFwIGNodW5rcyBpZiBhbnkgKi8KKworCWZvciAoaSA9IDE7IGkgPCBjb3VudGVyOyBpKyspCisJCXBjaV91bm1hcF9zaW5nbGUoZGV2LCBsZTMyX3RvX2NwdSh0ZmQtPnRic1tpXS5hZGRyKSwKKwkJCQkgbGUzMl90b19jcHUodGZkLT50YnNbaV0ubGVuKSwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwkvKiBmcmVlIFNLQiAqLworCWlmICh0eHEtPnR4YikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiOworCisJCS8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpcnFzLWRpc2FibGVkIGNvbnRleHQgKi8KKwkJaWYgKHNrYikgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqCisgKiBpbDM5NDVfaHdfYnVpbGRfdHhfY21kX3JhdGUgLSBBZGQgcmF0ZSBwb3J0aW9uIHRvIFRYX0NNRDoKKyAqCisqLwordm9pZAoraWwzOTQ1X2h3X2J1aWxkX3R4X2NtZF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwgaW50IHN0YV9pZCwgaW50IHR4X2lkKQoreworCXUxNiBod192YWx1ZSA9IGllZWU4MDIxMV9nZXRfdHhfcmF0ZShpbC0+aHcsIGluZm8pLT5od192YWx1ZTsKKwl1MTYgcmF0ZV9pZHggPSBtaW4oaHdfdmFsdWUgJiAweGZmZmYsIFJBVEVfQ09VTlRfMzk0NSk7CisJdTE2IHJhdGVfbWFzazsKKwlpbnQgcmF0ZTsKKwl1OCBydHNfcmV0cnlfbGltaXQ7CisJdTggZGF0YV9yZXRyeV9saW1pdDsKKwlfX2xlMzIgdHhfZmxhZ3M7CisJX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCXN0cnVjdCBpbDM5NDVfdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IGlsMzk0NV90eF9jbWQgKiljbWQtPmNtZC5wYXlsb2FkOworCisJcmF0ZSA9IGlsMzk0NV9yYXRlc1tyYXRlX2lkeF0ucGxjcDsKKwl0eF9mbGFncyA9IHR4X2NtZC0+dHhfZmxhZ3M7CisKKwkvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGdldCB0aGUgc3RhLT5zdXBwX3JhdGVzIHdoaWxlCisJICogaW4gdGhpcyBydW5uaW5nIGNvbnRleHQgKi8KKwlyYXRlX21hc2sgPSBSQVRFU19NQVNLXzM5NDU7CisKKwkvKiBTZXQgcmV0cnkgbGltaXQgb24gREFUQSBwYWNrZXRzIGFuZCBQcm9iZSBSZXNwb25zZXMgKi8KKwlpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoZmMpKQorCQlkYXRhX3JldHJ5X2xpbWl0ID0gMzsKKwllbHNlCisJCWRhdGFfcmV0cnlfbGltaXQgPSBJTF9ERUZBVUxUX1RYX1JFVFJZOworCXR4X2NtZC0+ZGF0YV9yZXRyeV9saW1pdCA9IGRhdGFfcmV0cnlfbGltaXQ7CisKKwlpZiAodHhfaWQgPj0gSUwzOV9DTURfUVVFVUVfTlVNKQorCQlydHNfcmV0cnlfbGltaXQgPSAzOworCWVsc2UKKwkJcnRzX3JldHJ5X2xpbWl0ID0gNzsKKworCWlmIChkYXRhX3JldHJ5X2xpbWl0IDwgcnRzX3JldHJ5X2xpbWl0KQorCQlydHNfcmV0cnlfbGltaXQgPSBkYXRhX3JldHJ5X2xpbWl0OworCXR4X2NtZC0+cnRzX3JldHJ5X2xpbWl0ID0gcnRzX3JldHJ5X2xpbWl0OworCisJdHhfY21kLT5yYXRlID0gcmF0ZTsKKwl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7CisKKwkvKiBPRkRNICovCisJdHhfY21kLT5zdXBwX3JhdGVzWzBdID0KKwkgICAgKChyYXRlX21hc2sgJiBJTF9PRkRNX1JBVEVTX01BU0spID4+IElMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOworCisJLyogQ0NLICovCisJdHhfY21kLT5zdXBwX3JhdGVzWzFdID0gKHJhdGVfbWFzayAmIDB4Rik7CisKKwlEX1JBVEUoIlR4IHN0YSBpZDogJWQsIHJhdGU6ICVkIChwbGNwKSwgZmxhZ3M6IDB4JTRYICIKKwkgICAgICAgImNjay9vZmRtIG1hc2s6IDB4JXgvMHgleFxuIiwgc3RhX2lkLCB0eF9jbWQtPnJhdGUsCisJICAgICAgIGxlMzJfdG9fY3B1KHR4X2NtZC0+dHhfZmxhZ3MpLCB0eF9jbWQtPnN1cHBfcmF0ZXNbMV0sCisJICAgICAgIHR4X2NtZC0+c3VwcF9yYXRlc1swXSk7Cit9CisKK3N0YXRpYyB1OAoraWwzOTQ1X3N5bmNfc3RhKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHN0YV9pZCwgdTE2IHR4X3JhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOworCXN0cnVjdCBpbF9zdGF0aW9uX2VudHJ5ICpzdGF0aW9uOworCisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pCisJCXJldHVybiBJTF9JTlZBTElEX1NUQVRJT047CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlzdGF0aW9uID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdOworCisJc3RhdGlvbi0+c3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfVFhfUkFURV9NU0s7CisJc3RhdGlvbi0+c3RhLnJhdGVfbl9mbGFncyA9IGNwdV90b19sZTE2KHR4X3JhdGUpOworCXN0YXRpb24tPnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwlpbF9zZW5kX2FkZF9zdGEoaWwsICZzdGF0aW9uLT5zdGEsIENNRF9BU1lOQyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKworCURfUkFURSgiU0NBTEUgc3luYyBzdGF0aW9uICVkIHRvIHJhdGUgJWRcbiIsIHN0YV9pZCwgdHhfcmF0ZSk7CisJcmV0dXJuIHN0YV9pZDsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9zZXRfcHdyX3ZtYWluKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKy8qCisgKiAoZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMpCisgKiB0byBzZXQgcG93ZXIgdG8gVl9BVVgsIGRvCisKKwkJaWYgKHBjaV9wbWVfY2FwYWJsZShpbC0+cGNpX2RldiwgUENJX0QzY29sZCkpIHsKKwkJCWlsX3NldF9iaXRzX21hc2tfcHJwaChpbCwgQVBNR19QU19DVFJMX1JFRywKKwkJCQkJQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZBVVgsCisJCQkJCX5BUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMpOworCisJCQlfaWxfcG9sbF9iaXQoaWwsIENTUl9HUElPX0lOLAorCQkJCSAgICAgQ1NSX0dQSU9fSU5fVkFMX1ZBVVhfUFdSX1NSQywKKwkJCQkgICAgIENTUl9HUElPX0lOX0JJVF9BVVhfUE9XRVIsIDUwMDApOworCQl9CisgKi8KKworCWlsX3NldF9iaXRzX21hc2tfcHJwaChpbCwgQVBNR19QU19DVFJMX1JFRywKKwkJCSAgICAgIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WTUFJTiwKKwkJCSAgICAgIH5BUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMpOworCisJX2lsX3BvbGxfYml0KGlsLCBDU1JfR1BJT19JTiwgQ1NSX0dQSU9fSU5fVkFMX1ZNQUlOX1BXUl9TUkMsCisJCSAgICAgQ1NSX0dQSU9fSU5fQklUX0FVWF9QT1dFUiwgNTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9yeF9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpCit7CisJaWxfd3IoaWwsIEZIMzlfUkNTUl9SQkRfQkFTRSgwKSwgcnhxLT5iZF9kbWEpOworCWlsX3dyKGlsLCBGSDM5X1JDU1JfUlBUUl9BRERSKDApLCByeHEtPnJiX3N0dHNfZG1hKTsKKwlpbF93cihpbCwgRkgzOV9SQ1NSX1dQVFIoMCksIDApOworCWlsX3dyKGlsLCBGSDM5X1JDU1JfQ09ORklHKDApLAorCSAgICAgIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTl9FTkFCTEUgfAorCSAgICAgIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SRFJCRF9FTl9FTkFCTEUgfAorCSAgICAgIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX0JJVF9XUl9TVFRTX0VOIHwKKwkgICAgICBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjggfCAoUlhfUVVFVUVfU0laRV9MT0cKKwkJCQkJCQkgICAgICAgPDwKKwkJCQkJCQkgICAgICAgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfUE9TX1JCRENfU0laRSkKKwkgICAgICB8IEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9JUlFfREVTVF9JTlRfSE9TVCB8ICgxIDw8CisJCQkJCQkJCSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfSVJRX1JCVEgpCisJICAgICAgfCBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfRkgpOworCisJLyogZmFrZSByZWFkIHRvIGZsdXNoIGFsbCBwcmV2IEkvTyAqLworCWlsX3JkKGlsLCBGSDM5X1JTU1JfQ1RSTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3R4X3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKworCS8qIGJ5cGFzcyBtb2RlICovCisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9NT0RFX1JFRywgMHgyKTsKKworCS8qIFJBIDAgaXMgYWN0aXZlICovCisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9BUkFTVEFUX1JFRywgMHgwMSk7CisKKwkvKiBhbGwgNiBmaWZvIGFyZSBhY3RpdmUgKi8KKwlpbF93cl9wcnBoKGlsLCBBTE1fU0NEX1RYRkFDVF9SRUcsIDB4M2YpOworCisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9TQllQX01PREVfMV9SRUcsIDB4MDEwMDAwKTsKKwlpbF93cl9wcnBoKGlsLCBBTE1fU0NEX1NCWVBfTU9ERV8yX1JFRywgMHgwMzAwMDIpOworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfVFhGNE1GX1JFRywgMHgwMDAwMDQpOworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfVFhGNU1GX1JFRywgMHgwMDAwMDUpOworCisJaWxfd3IoaWwsIEZIMzlfVFNTUl9DQkJfQkFTRSwgaWwtPl8zOTQ1LnNoYXJlZF9waHlzKTsKKworCWlsX3dyKGlsLCBGSDM5X1RTU1JfTVNHX0NPTkZJRywKKwkgICAgICBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX1NOT09QX1JEX1RYUERfT04gfAorCSAgICAgIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUkRfVFhQRF9PTiB8CisJICAgICAgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOEIgfAorCSAgICAgIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVEZEX09OIHwKKwkgICAgICBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JEX0NCQl9PTiB8CisJICAgICAgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SU1BfV0FJVF9USCB8CisJICAgICAgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9SU1BfV0FJVF9USCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDM5NDVfdHhxX2N0eF9yZXNldCAtIFJlc2V0IFRYIHF1ZXVlIGNvbnRleHQKKyAqCisgKiBEZXN0cm95cyBhbGwgRE1BIHN0cnVjdHVyZXMgYW5kIGluaXRpYWxpemUgdGhlbSBhZ2FpbgorICovCitzdGF0aWMgaW50CitpbDM5NDVfdHhxX2N0eF9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJjOworCWludCB0eHFfaWQsIHNsb3RzX251bTsKKworCWlsMzk0NV9od190eHFfY3R4X2ZyZWUoaWwpOworCisJLyogYWxsb2NhdGUgdHggcXVldWUgc3RydWN0dXJlICovCisJcmMgPSBpbF9hbGxvY190eHFfbWVtKGlsKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIFR4IENNRCBxdWV1ZSAqLworCXJjID0gaWwzOTQ1X3R4X3Jlc2V0KGlsKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBUeCBxdWV1ZShzKSAqLworCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKKwkJc2xvdHNfbnVtID0KKwkJICAgICh0eHFfaWQgPT0KKwkJICAgICBJTDM5X0NNRF9RVUVVRV9OVU0pID8gVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7CisJCXJjID0gaWxfdHhfcXVldWVfaW5pdChpbCwgJmlsLT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLCB0eHFfaWQpOworCQlpZiAocmMpIHsKKwkJCUlMX0VSUigiVHggJWQgcXVldWUgaW5pdCBmYWlsZWRcbiIsIHR4cV9pZCk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJcmV0dXJuIHJjOworCitlcnJvcjoKKwlpbDM5NDVfaHdfdHhxX2N0eF9mcmVlKGlsKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBTdGFydCB1cCAzOTQ1J3MgYmFzaWMgZnVuY3Rpb25hbGl0eSBhZnRlciBpdCBoYXMgYmVlbiByZXNldAorICogKGUuZy4gYWZ0ZXIgcGxhdGZvcm0gYm9vdCwgb3Igc2h1dGRvd24gdmlhIGlsX2FwbV9zdG9wKCkpCisgKiBOT1RFOiAgVGhpcyBkb2VzIG5vdCBsb2FkIHVDb2RlIG5vciBzdGFydCB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9hcG1faW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldCA9IGlsX2FwbV9pbml0KGlsKTsKKworCS8qIENsZWFyIEFQTUcgKE5JQydzIGludGVybmFsIHBvd2VyIG1hbmFnZW1lbnQpIGludGVycnVwdHMgKi8KKwlpbF93cl9wcnBoKGlsLCBBUE1HX1JUQ19JTlRfTVNLX1JFRywgMHgwKTsKKwlpbF93cl9wcnBoKGlsLCBBUE1HX1JUQ19JTlRfU1RUX1JFRywgMHhGRkZGRkZGRik7CisKKwkvKiBSZXNldCByYWRpbyBjaGlwICovCisJaWxfc2V0X2JpdHNfcHJwaChpbCwgQVBNR19QU19DVFJMX1JFRywgQVBNR19QU19DVFJMX1ZBTF9SRVNFVF9SRVEpOworCXVkZWxheSg1KTsKKwlpbF9jbGVhcl9iaXRzX3BycGgoaWwsIEFQTUdfUFNfQ1RSTF9SRUcsIEFQTUdfUFNfQ1RSTF9WQUxfUkVTRVRfUkVRKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfbmljX2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqKWlsLT5lZXByb207CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCByZXZfaWQgPSBpbC0+cGNpX2Rldi0+cmV2aXNpb247CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIERldGVybWluZSBIVyB0eXBlICovCisJRF9JTkZPKCJIVyBSZXZpc2lvbiBJRCA9IDB4JVhcbiIsIHJldl9pZCk7CisKKwlpZiAocmV2X2lkICYgUENJX0NGR19SRVZfSURfQklUX1JUUCkKKwkJRF9JTkZPKCJSVFAgdHlwZVxuIik7CisJZWxzZSBpZiAocmV2X2lkICYgUENJX0NGR19SRVZfSURfQklUX0JBU0lDX1NLVSkgeworCQlEX0lORk8oIjM5NDUgUkFESU8tTUIgdHlwZVxuIik7CisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfMzk0NV9NQik7CisJfSBlbHNlIHsKKwkJRF9JTkZPKCIzOTQ1IFJBRElPLU1NIHR5cGVcbiIpOworCQlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUXzM5NDVfTU0pOworCX0KKworCWlmIChFRVBST01fU0tVX0NBUF9PUF9NT0RFX01SQyA9PSBlZXByb20tPnNrdV9jYXApIHsKKwkJRF9JTkZPKCJTS1UgT1AgbW9kZSBpcyBtcmNcbiIpOworCQlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUX1NLVV9NUkMpOworCX0gZWxzZQorCQlEX0lORk8oIlNLVSBPUCBtb2RlIGlzIGJhc2ljXG4iKTsKKworCWlmICgoZWVwcm9tLT5ib2FyZF9yZXZpc2lvbiAmIDB4RjApID09IDB4RDApIHsKKwkJRF9JTkZPKCIzOTQ1QUJHIHJldmlzaW9uIGlzIDB4JVhcbiIsIGVlcHJvbS0+Ym9hcmRfcmV2aXNpb24pOworCQlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUX0JPQVJEX1RZUEUpOworCX0gZWxzZSB7CisJCURfSU5GTygiMzk0NUFCRyByZXZpc2lvbiBpcyAweCVYXG4iLCBlZXByb20tPmJvYXJkX3JldmlzaW9uKTsKKwkJaWxfY2xlYXJfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfQk9BUkRfVFlQRSk7CisJfQorCisJaWYgKGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbiA8PSAxKSB7CisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9BKTsKKwkJRF9JTkZPKCJDYXJkIE0gdHlwZSBBIHZlcnNpb24gaXMgMHglWFxuIiwKKwkJICAgICAgIGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbik7CisJfSBlbHNlIHsKKwkJRF9JTkZPKCJDYXJkIE0gdHlwZSBCIHZlcnNpb24gaXMgMHglWFxuIiwKKwkJICAgICAgIGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbik7CisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9CKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlmIChlZXByb20tPnNrdV9jYXAgJiBFRVBST01fU0tVX0NBUF9TV19SRl9LSUxMX0VOQUJMRSkKKwkJRF9SRl9LSUxMKCJTVyBSRiBLSUxMIHN1cHBvcnRlZCBpbiBFRVBST00uXG4iKTsKKworCWlmIChlZXByb20tPnNrdV9jYXAgJiBFRVBST01fU0tVX0NBUF9IV19SRl9LSUxMX0VOQUJMRSkKKwkJRF9SRl9LSUxMKCJIVyBSRiBLSUxMIHN1cHBvcnRlZCBpbiBFRVBST00uXG4iKTsKK30KKworaW50CitpbDM5NDVfaHdfbmljX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWwzOTQ1X3NldF9wd3Jfdm1haW4oaWwpOworCisJaWwtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuY29uZmlnKGlsKTsKKworCS8qIEFsbG9jYXRlIHRoZSBSWCBxdWV1ZSwgb3IgcmVzZXQgaWYgaXQgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlpZiAoIXJ4cS0+YmQpIHsKKwkJcmMgPSBpbF9yeF9xdWV1ZV9hbGxvYyhpbCk7CisJCWlmIChyYykgeworCQkJSUxfRVJSKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBSeCBxdWV1ZVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0gZWxzZQorCQlpbDM5NDVfcnhfcXVldWVfcmVzZXQoaWwsIHJ4cSk7CisKKwlpbDM5NDVfcnhfcmVwbGVuaXNoKGlsKTsKKworCWlsMzk0NV9yeF9pbml0KGlsLCByeHEpOworCisJLyogTG9vayBhdCB1c2luZyB0aGlzIGluc3RlYWQ6CisJICAgcnhxLT5uZWVkX3VwZGF0ZSA9IDE7CisJICAgaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihpbCwgcnhxKTsKKwkgKi8KKworCWlsX3dyKGlsLCBGSDM5X1JDU1JfV1BUUigwKSwgcnhxLT53cml0ZSAmIH43KTsKKworCXJjID0gaWwzOTQ1X3R4cV9jdHhfcmVzZXQoaWwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc2V0X2JpdChTX0lOSVQsICZpbC0+c3RhdHVzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsMzk0NV9od190eHFfY3R4X2ZyZWUgLSBGcmVlIFRYUSBDb250ZXh0CisgKgorICogRGVzdHJveSBhbGwgVFggRE1BIHF1ZXVlcyBhbmQgc3RydWN0dXJlcworICovCit2b2lkCitpbDM5NDVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgdHhxX2lkOworCisJLyogVHggcXVldWVzICovCisJaWYgKGlsLT50eHEpCisJCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspCisJCQlpZiAodHhxX2lkID09IElMMzlfQ01EX1FVRVVFX05VTSkKKwkJCQlpbF9jbWRfcXVldWVfZnJlZShpbCk7CisJCQllbHNlCisJCQkJaWxfdHhfcXVldWVfZnJlZShpbCwgdHhxX2lkKTsKKworCS8qIGZyZWUgdHggcXVldWUgc3RydWN0dXJlICovCisJaWxfdHhxX21lbShpbCk7Cit9CisKK3ZvaWQKK2lsMzk0NV9od190eHFfY3R4X3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCB0eHFfaWQ7CisKKwkvKiBzdG9wIFNDRCAqLworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfTU9ERV9SRUcsIDApOworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfVFhGQUNUX1JFRywgMCk7CisKKwkvKiByZXNldCBURkQgcXVldWVzICovCisJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykgeworCQlpbF93cihpbCwgRkgzOV9UQ1NSX0NPTkZJRyh0eHFfaWQpLCAweDApOworCQlpbF9wb2xsX2JpdChpbCwgRkgzOV9UU1NSX1RYX1NUQVRVUywKKwkJCSAgICBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKHR4cV9pZCksCisJCQkgICAgMTAwMCk7CisJfQorCisJaWwzOTQ1X2h3X3R4cV9jdHhfZnJlZShpbCk7Cit9CisKKy8qKgorICogaWwzOTQ1X2h3X3JlZ19hZGp1c3RfcG93ZXJfYnlfdGVtcAorICogcmV0dXJuIGlkeCBkZWx0YSBpbnRvIHBvd2VyIGdhaW4gc2V0dGluZ3MgdGFibGUKKyovCitzdGF0aWMgaW50CitpbDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wKGludCBuZXdfcmVhZGluZywgaW50IG9sZF9yZWFkaW5nKQoreworCXJldHVybiAobmV3X3JlYWRpbmcgLSBvbGRfcmVhZGluZykgKiAoLTExKSAvIDEwMDsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfcmVnX3RlbXBfb3V0X29mX3JhbmdlIC0gS2VlcCB0ZW1wZXJhdHVyZSBpbiBzYW5lIHJhbmdlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpbDM5NDVfaHdfcmVnX3RlbXBfb3V0X29mX3JhbmdlKGludCB0ZW1wZXJhdHVyZSkKK3sKKwlyZXR1cm4gKHRlbXBlcmF0dXJlIDwgLTI2MCB8fCB0ZW1wZXJhdHVyZSA+IDI1KSA/IDEgOiAwOworfQorCitpbnQKK2lsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiBfaWxfcmQoaWwsIENTUl9VQ09ERV9EUlZfR1AyKTsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlCisgKiBnZXQgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUgYnkgcmVhZGluZyBmcm9tIE5JQworKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9od19yZWdfdHhwb3dlcl9nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCWludCB0ZW1wZXJhdHVyZTsKKworCXRlbXBlcmF0dXJlID0gaWwzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShpbCk7CisKKwkvKiBkcml2ZXIncyBva2F5IHJhbmdlIGlzIC0yNjAgdG8gKzI1LgorCSAqICAgaHVtYW4gcmVhZGFibGUgb2theSByYW5nZSBpcyAwIHRvICsyODUgKi8KKwlEX0lORk8oIlRlbXBlcmF0dXJlOiAlZFxuIiwgdGVtcGVyYXR1cmUgKyBJTF9URU1QX0NPTlZFUlQpOworCisJLyogaGFuZGxlIGluc2FuZSB0ZW1wIHJlYWRpbmcgKi8KKwlpZiAoaWwzOTQ1X2h3X3JlZ190ZW1wX291dF9vZl9yYW5nZSh0ZW1wZXJhdHVyZSkpIHsKKwkJSUxfRVJSKCJFcnJvciBiYWQgdGVtcGVyYXR1cmUgdmFsdWUgICVkXG4iLCB0ZW1wZXJhdHVyZSk7CisKKwkJLyogaWYgcmVhbGx5IHJlYWxseSBob3QoPyksCisJCSAqICAgc3Vic3RpdHV0ZSB0aGUgM3JkIGJhbmQvZ3JvdXAncyB0ZW1wIG1lYXN1cmVkIGF0IGZhY3RvcnkgKi8KKwkJaWYgKGlsLT5sYXN0X3RlbXBlcmF0dXJlID4gMTAwKQorCQkJdGVtcGVyYXR1cmUgPSBlZXByb20tPmdyb3Vwc1syXS50ZW1wZXJhdHVyZTsKKwkJZWxzZQkJLyogZWxzZSB1c2UgbW9zdCByZWNlbnQgInNhbmUiIHZhbHVlIGZyb20gZHJpdmVyICovCisJCQl0ZW1wZXJhdHVyZSA9IGlsLT5sYXN0X3RlbXBlcmF0dXJlOworCX0KKworCXJldHVybiB0ZW1wZXJhdHVyZTsJLyogcmF3LCBub3QgImh1bWFuIHJlYWRhYmxlIiAqLworfQorCisvKiBBZGp1c3QgVHhwb3dlciBvbmx5IGlmIHRlbXBlcmF0dXJlIHZhcmlhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuCisgKgorICogQm90aCBhcmUgbG93ZXIgdGhhbiBvbGRlciB2ZXJzaW9ucycgOSBkZWdyZWVzICovCisjZGVmaW5lIElMX1RFTVBFUkFUVVJFX0xJTUlUX1RJTUVSICAgNgorCisvKioKKyAqIGlsMzk0NV9pc190ZW1wX2NhbGliX25lZWRlZCAtIGRldGVybWluZXMgaWYgbmV3IGNhbGlicmF0aW9uIGlzIG5lZWRlZAorICoKKyAqIHJlY29yZHMgbmV3IHRlbXBlcmF0dXJlIGluIHR4X21nci0+dGVtcGVyYXR1cmUuCisgKiByZXBsYWNlcyB0eF9tZ3ItPmxhc3RfdGVtcGVyYXR1cmUgKm9ubHkqIGlmIGNhbGliIG5lZWRlZAorICogICAgKGFzc3VtZXMgY2FsbGVyIHdpbGwgYWN0dWFsbHkgZG8gdGhlIGNhbGlicmF0aW9uISkuICovCitzdGF0aWMgaW50CitpbDM5NDVfaXNfdGVtcF9jYWxpYl9uZWVkZWQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCB0ZW1wX2RpZmY7CisKKwlpbC0+dGVtcGVyYXR1cmUgPSBpbDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKGlsKTsKKwl0ZW1wX2RpZmYgPSBpbC0+dGVtcGVyYXR1cmUgLSBpbC0+bGFzdF90ZW1wZXJhdHVyZTsKKworCS8qIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLworCWlmICh0ZW1wX2RpZmYgPCAwKSB7CisJCURfUE9XRVIoIkdldHRpbmcgY29vbGVyLCBkZWx0YSAlZCxcbiIsIHRlbXBfZGlmZik7CisJCXRlbXBfZGlmZiA9IC10ZW1wX2RpZmY7CisJfSBlbHNlIGlmICh0ZW1wX2RpZmYgPT0gMCkKKwkJRF9QT1dFUigiU2FtZSB0ZW1wLFxuIik7CisJZWxzZQorCQlEX1BPV0VSKCJHZXR0aW5nIHdhcm1lciwgZGVsdGEgJWQsXG4iLCB0ZW1wX2RpZmYpOworCisJLyogaWYgd2UgZG9uJ3QgbmVlZCBjYWxpYnJhdGlvbiwgKmRvbid0KiB1cGRhdGUgbGFzdF90ZW1wZXJhdHVyZSAqLworCWlmICh0ZW1wX2RpZmYgPCBJTF9URU1QRVJBVFVSRV9MSU1JVF9USU1FUikgeworCQlEX1BPV0VSKCJUaW1lZCB0aGVybWFsIGNhbGliIG5vdCBuZWVkZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEX1BPV0VSKCJUaW1lZCB0aGVybWFsIGNhbGliIG5lZWRlZFxuIik7CisKKwkvKiBhc3N1bWUgdGhhdCBjYWxsZXIgd2lsbCBhY3R1YWxseSBkbyBjYWxpYiAuLi4KKwkgKiAgIHVwZGF0ZSB0aGUgImxhc3QgdGVtcGVyYXR1cmUiIHZhbHVlICovCisJaWwtPmxhc3RfdGVtcGVyYXR1cmUgPSBpbC0+dGVtcGVyYXR1cmU7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgSUxfTUFYX0dBSU5fRU5UUklFUyA3OAorI2RlZmluZSBJTF9DQ0tfRlJPTV9PRkRNX1BPV0VSX0RJRkYgIC01CisjZGVmaW5lIElMX0NDS19GUk9NX09GRE1fSURYX0RJRkYgKDEwKQorCisvKiByYWRpbyBhbmQgRFNQIHBvd2VyIHRhYmxlLCBlYWNoIHN0ZXAgaXMgMS8yIGRCLgorICogMXN0IG51bWJlciBpcyBmb3IgUkYgYW5hbG9nIGdhaW4sIDJuZCBudW1iZXIgaXMgZm9yIERTUCBwcmUtREFDIGdhaW4uICovCitzdGF0aWMgc3RydWN0IGlsMzk0NV90eF9wb3dlciBwb3dlcl9nYWluX3RhYmxlWzJdW0lMX01BWF9HQUlOX0VOVFJJRVNdID0geworCXsKKwkgezI1MSwgMTI3fSwJCS8qIDIuNCBHSHosIGhpZ2hlc3QgcG93ZXIgKi8KKwkgezI1MSwgMTI3fSwKKwkgezI1MSwgMTI3fSwKKwkgezI1MSwgMTI3fSwKKwkgezI1MSwgMTI1fSwKKwkgezI1MSwgMTEwfSwKKwkgezI1MSwgMTA1fSwKKwkgezI1MSwgOTh9LAorCSB7MTg3LCAxMjV9LAorCSB7MTg3LCAxMTV9LAorCSB7MTg3LCAxMDh9LAorCSB7MTg3LCA5OX0sCisJIHsyNDMsIDExOX0sCisJIHsyNDMsIDExMX0sCisJIHsyNDMsIDEwNX0sCisJIHsyNDMsIDk3fSwKKwkgezI0MywgOTJ9LAorCSB7MjExLCAxMDZ9LAorCSB7MjExLCAxMDB9LAorCSB7MTc5LCAxMjB9LAorCSB7MTc5LCAxMTN9LAorCSB7MTc5LCAxMDd9LAorCSB7MTQ3LCAxMjV9LAorCSB7MTQ3LCAxMTl9LAorCSB7MTQ3LCAxMTJ9LAorCSB7MTQ3LCAxMDZ9LAorCSB7MTQ3LCAxMDF9LAorCSB7MTQ3LCA5N30sCisJIHsxNDcsIDkxfSwKKwkgezExNSwgMTA3fSwKKwkgezIzNSwgMTIxfSwKKwkgezIzNSwgMTE1fSwKKwkgezIzNSwgMTA5fSwKKwkgezIwMywgMTI3fSwKKwkgezIwMywgMTIxfSwKKwkgezIwMywgMTE1fSwKKwkgezIwMywgMTA4fSwKKwkgezIwMywgMTAyfSwKKwkgezIwMywgOTZ9LAorCSB7MjAzLCA5Mn0sCisJIHsxNzEsIDExMH0sCisJIHsxNzEsIDEwNH0sCisJIHsxNzEsIDk4fSwKKwkgezEzOSwgMTE2fSwKKwkgezIyNywgMTI1fSwKKwkgezIyNywgMTE5fSwKKwkgezIyNywgMTEzfSwKKwkgezIyNywgMTA3fSwKKwkgezIyNywgMTAxfSwKKwkgezIyNywgOTZ9LAorCSB7MTk1LCAxMTN9LAorCSB7MTk1LCAxMDZ9LAorCSB7MTk1LCAxMDJ9LAorCSB7MTk1LCA5NX0sCisJIHsxNjMsIDExM30sCisJIHsxNjMsIDEwNn0sCisJIHsxNjMsIDEwMn0sCisJIHsxNjMsIDk1fSwKKwkgezEzMSwgMTEzfSwKKwkgezEzMSwgMTA2fSwKKwkgezEzMSwgMTAyfSwKKwkgezEzMSwgOTV9LAorCSB7OTksIDExM30sCisJIHs5OSwgMTA2fSwKKwkgezk5LCAxMDJ9LAorCSB7OTksIDk1fSwKKwkgezY3LCAxMTN9LAorCSB7NjcsIDEwNn0sCisJIHs2NywgMTAyfSwKKwkgezY3LCA5NX0sCisJIHszNSwgMTEzfSwKKwkgezM1LCAxMDZ9LAorCSB7MzUsIDEwMn0sCisJIHszNSwgOTV9LAorCSB7MywgMTEzfSwKKwkgezMsIDEwNn0sCisJIHszLCAxMDJ9LAorCSB7MywgOTV9CQkvKiAyLjQgR0h6LCBsb3dlc3QgcG93ZXIgKi8KKwl9LAorCXsKKwkgezI1MSwgMTI3fSwJCS8qIDUueCBHSHosIGhpZ2hlc3QgcG93ZXIgKi8KKwkgezI1MSwgMTIwfSwKKwkgezI1MSwgMTE0fSwKKwkgezIxOSwgMTE5fSwKKwkgezIxOSwgMTAxfSwKKwkgezE4NywgMTEzfSwKKwkgezE4NywgMTAyfSwKKwkgezE1NSwgMTE0fSwKKwkgezE1NSwgMTAzfSwKKwkgezEyMywgMTE3fSwKKwkgezEyMywgMTA3fSwKKwkgezEyMywgOTl9LAorCSB7MTIzLCA5Mn0sCisJIHs5MSwgMTA4fSwKKwkgezU5LCAxMjV9LAorCSB7NTksIDExOH0sCisJIHs1OSwgMTA5fSwKKwkgezU5LCAxMDJ9LAorCSB7NTksIDk2fSwKKwkgezU5LCA5MH0sCisJIHsyNywgMTA0fSwKKwkgezI3LCA5OH0sCisJIHsyNywgOTJ9LAorCSB7MTE1LCAxMTh9LAorCSB7MTE1LCAxMTF9LAorCSB7MTE1LCAxMDR9LAorCSB7ODMsIDEyNn0sCisJIHs4MywgMTIxfSwKKwkgezgzLCAxMTN9LAorCSB7ODMsIDEwNX0sCisJIHs4MywgOTl9LAorCSB7NTEsIDExOH0sCisJIHs1MSwgMTExfSwKKwkgezUxLCAxMDR9LAorCSB7NTEsIDk4fSwKKwkgezE5LCAxMTZ9LAorCSB7MTksIDEwOX0sCisJIHsxOSwgMTAyfSwKKwkgezE5LCA5OH0sCisJIHsxOSwgOTN9LAorCSB7MTcxLCAxMTN9LAorCSB7MTcxLCAxMDd9LAorCSB7MTcxLCA5OX0sCisJIHsxMzksIDEyMH0sCisJIHsxMzksIDExM30sCisJIHsxMzksIDEwN30sCisJIHsxMzksIDk5fSwKKwkgezEwNywgMTIwfSwKKwkgezEwNywgMTEzfSwKKwkgezEwNywgMTA3fSwKKwkgezEwNywgOTl9LAorCSB7NzUsIDEyMH0sCisJIHs3NSwgMTEzfSwKKwkgezc1LCAxMDd9LAorCSB7NzUsIDk5fSwKKwkgezQzLCAxMjB9LAorCSB7NDMsIDExM30sCisJIHs0MywgMTA3fSwKKwkgezQzLCA5OX0sCisJIHsxMSwgMTIwfSwKKwkgezExLCAxMTN9LAorCSB7MTEsIDEwN30sCisJIHsxMSwgOTl9LAorCSB7MTMxLCAxMDd9LAorCSB7MTMxLCA5OX0sCisJIHs5OSwgMTIwfSwKKwkgezk5LCAxMTN9LAorCSB7OTksIDEwN30sCisJIHs5OSwgOTl9LAorCSB7NjcsIDEyMH0sCisJIHs2NywgMTEzfSwKKwkgezY3LCAxMDd9LAorCSB7NjcsIDk5fSwKKwkgezM1LCAxMjB9LAorCSB7MzUsIDExM30sCisJIHszNSwgMTA3fSwKKwkgezM1LCA5OX0sCisJIHszLCAxMjB9CQkvKiA1LnggR0h6LCBsb3dlc3QgcG93ZXIgKi8KKwl9Cit9OworCitzdGF0aWMgaW5saW5lIHU4CitpbDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pZHgoaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKGlkeCA+PSBJTF9NQVhfR0FJTl9FTlRSSUVTKQorCQlyZXR1cm4gSUxfTUFYX0dBSU5fRU5UUklFUyAtIDE7CisJcmV0dXJuICh1OCkgaWR4OworfQorCisvKiBLaWNrIG9mZiB0aGVybWFsIHJlY2FsaWJyYXRpb24gY2hlY2sgZXZlcnkgNjAgc2Vjb25kcyAqLworI2RlZmluZSBSRUdfUkVDQUxJQl9QRVJJT0QgKDYwKQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfc2V0X3NjYW5fcG93ZXIgLSBTZXQgVHggcG93ZXIgZm9yIHNjYW4gcHJvYmUgcmVxdWVzdHMKKyAqCisgKiBTZXQgKGluIG91ciBjaGFubmVsIGluZm8gZGF0YWJhc2UpIHRoZSBkaXJlY3Qgc2NhbiBUeCBwb3dlciBmb3IgMSBNYml0IChDQ0spCisgKiBvciA2IE1iaXQgKE9GRE0pIHJhdGVzLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBzY2FuX3RibF9pZHgsIHMzMiByYXRlX2lkeCwKKwkJCSAgICAgY29uc3QgczggKmNsaXBfcHdycywKKwkJCSAgICAgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbywgaW50IGJhbmRfaWR4KQoreworCXN0cnVjdCBpbDM5NDVfc2Nhbl9wb3dlcl9pbmZvICpzY2FuX3Bvd2VyX2luZm87CisJczggcG93ZXI7CisJdTggcG93ZXJfaWR4OworCisJc2Nhbl9wb3dlcl9pbmZvID0gJmNoX2luZm8tPnNjYW5fcHdyX2luZm9bc2Nhbl90YmxfaWR4XTsKKworCS8qIHVzZSB0aGlzIGNoYW5uZWwgZ3JvdXAncyA2TWJpdCBjbGlwcGluZy9zYXR1cmF0aW9uIHB3ciwKKwkgKiAgIGJ1dCBjYXAgYXQgcmVndWxhdG9yeSBzY2FuIHBvd2VyIHJlc3RyaWN0aW9uIChzZXQgZHVyaW5nIGluaXQKKwkgKiAgIGJhc2VkIG9uIGVlcHJvbSBjaGFubmVsIGRhdGEpIGZvciB0aGlzIGNoYW5uZWwuICAqLworCXBvd2VyID0gbWluKGNoX2luZm8tPnNjYW5fcG93ZXIsIGNsaXBfcHdyc1tSQVRFXzZNX0lEWF9UQkxdKTsKKworCXBvd2VyID0gbWluKHBvd2VyLCBpbC0+dHhfcG93ZXJfdXNlcl9sbXQpOworCXNjYW5fcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcG93ZXI7CisKKwkvKiBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBuZXcgc2NhbiAqcG93ZXIqIGFuZCBjdXJyZW50ICJub3JtYWwiCisJICogICBUeCAqcG93ZXIqIGZvciA2TWIuICBVc2UgdGhpcyBkaWZmZXJlbmNlICh4MikgdG8gYWRqdXN0IHRoZQorCSAqICAgY3VycmVudCAibm9ybWFsIiB0ZW1wZXJhdHVyZS1jb21wZW5zYXRlZCBUeCBwb3dlciAqaWR4KiBmb3IKKwkgKiAgIHRoaXMgcmF0ZSAoMU1iIG9yIDZNYikgdG8geWllbGQgbmV3IHRlbXAtY29tcGVuc2F0ZWQgc2NhbiBwb3dlcgorCSAqICAgKmlkeCouICovCisJcG93ZXJfaWR4ID0KKwkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2lkeF0ucG93ZXJfdGFibGVfaWR4IC0gKHBvd2VyIC0KKwkJCQkJCQkgICAgIGNoX2luZm8tPgorCQkJCQkJCSAgICAgcG93ZXJfaW5mbworCQkJCQkJCSAgICAgW1JBVEVfNk1fSURYX1RCTF0uCisJCQkJCQkJICAgICByZXF1ZXN0ZWRfcG93ZXIpICoKKwkgICAgMjsKKworCS8qIHN0b3JlIHJlZmVyZW5jZSBpZHggdGhhdCB3ZSB1c2Ugd2hlbiBhZGp1c3RpbmcgKmFsbCogc2NhbgorCSAqICAgcG93ZXJzLiAgU28gd2UgY2FuIGFjY29tbW9kYXRlIHVzZXIgKGFsbCBjaGFubmVsKSBvciBzcGVjdHJ1bQorCSAqICAgbWFuYWdlbWVudCAoc2luZ2xlIGNoYW5uZWwpIHBvd2VyIGNoYW5nZXMgImJldHdlZW4iIHRlbXBlcmF0dXJlCisJICogICBmZWVkYmFjayBjb21wZW5zYXRpb24gcHJvY2VkdXJlcy4KKwkgKiBkb24ndCBmb3JjZSBmaXQgdGhpcyByZWZlcmVuY2UgaWR4IGludG8gZ2FpbiB0YWJsZTsgaXQgbWF5IGJlIGEKKwkgKiAgIG5lZ2F0aXZlIG51bWJlci4gIFRoaXMgd2lsbCBoZWxwIGF2b2lkIGVycm9ycyB3aGVuIHdlJ3JlIGF0CisJICogICB0aGUgbG93ZXIgYm91bmRzIChoaWdoZXN0IGdhaW5zLCBmb3Igd2FybWVzdCB0ZW1wZXJhdHVyZXMpCisJICogICBvZiB0aGUgdGFibGUuICovCisKKwkvKiBkb24ndCBleGNlZWQgdGFibGUgYm91bmRzIGZvciAicmVhbCIgc2V0dGluZyAqLworCXBvd2VyX2lkeCA9IGlsMzk0NV9od19yZWdfZml4X3Bvd2VyX2lkeChwb3dlcl9pZHgpOworCisJc2Nhbl9wb3dlcl9pbmZvLT5wb3dlcl90YWJsZV9pZHggPSBwb3dlcl9pZHg7CisJc2Nhbl9wb3dlcl9pbmZvLT50cGMudHhfZ2FpbiA9CisJICAgIHBvd2VyX2dhaW5fdGFibGVbYmFuZF9pZHhdW3Bvd2VyX2lkeF0udHhfZ2FpbjsKKwlzY2FuX3Bvd2VyX2luZm8tPnRwYy5kc3BfYXR0ZW4gPQorCSAgICBwb3dlcl9nYWluX3RhYmxlW2JhbmRfaWR4XVtwb3dlcl9pZHhdLmRzcF9hdHRlbjsKK30KKworLyoqCisgKiBpbDM5NDVfc2VuZF90eF9wb3dlciAtIGZpbGwgaW4gVHggUG93ZXIgY29tbWFuZCB3aXRoIGdhaW4gc2V0dGluZ3MKKyAqCisgKiBDb25maWd1cmVzIHBvd2VyIHNldHRpbmdzIGZvciBhbGwgcmF0ZXMgZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwsCisgKiB1c2luZyB2YWx1ZXMgZnJvbSBjaGFubmVsIGluZm8gc3RydWN0LCBhbmQgc2VuZCB0byBOSUMKKyAqLworc3RhdGljIGludAoraWwzOTQ1X3NlbmRfdHhfcG93ZXIoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYXRlX2lkeCwgaTsKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgaWwzOTQ1X3R4cG93ZXJ0YWJsZV9jbWQgdHhwb3dlciA9IHsKKwkJLmNoYW5uZWwgPSBpbC0+Y3R4LmFjdGl2ZS5jaGFubmVsLAorCX07CisJdTE2IGNoYW47CisKKwlpZiAoV0FSTl9PTkNFCisJICAgICh0ZXN0X2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKSwKKwkgICAgICJUWCBQb3dlciByZXF1ZXN0ZWQgd2hpbGUgc2Nhbm5pbmchXG4iKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwljaGFuID0gbGUxNl90b19jcHUoaWwtPmN0eC5hY3RpdmUuY2hhbm5lbCk7CisKKwl0eHBvd2VyLmJhbmQgPSAoaWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgPyAwIDogMTsKKwljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgaWwtPmJhbmQsIGNoYW4pOworCWlmICghY2hfaW5mbykgeworCQlJTF9FUlIoIkZhaWxlZCB0byBnZXQgY2hhbm5lbCBpbmZvIGZvciBjaGFubmVsICVkIFslZF1cbiIsIGNoYW4sCisJCSAgICAgICBpbC0+YmFuZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgeworCQlEX1BPV0VSKCJOb3QgY2FsbGluZyBUWF9QV1JfVEJMX0NNRCBvbiAiICJub24tVHggY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBmaWxsIGNtZCB3aXRoIHBvd2VyIHNldHRpbmdzIGZvciBhbGwgcmF0ZXMgZm9yIGN1cnJlbnQgY2hhbm5lbCAqLworCS8qIEZpbGwgT0ZETSByYXRlICovCisJZm9yIChyYXRlX2lkeCA9IElMX0ZJUlNUX09GRE1fUkFURSwgaSA9IDA7CisJICAgICByYXRlX2lkeCA8PSBJTDM5X0xBU1RfT0ZETV9SQVRFOyByYXRlX2lkeCsrLCBpKyspIHsKKworCQl0eHBvd2VyLnBvd2VyW2ldLnRwYyA9IGNoX2luZm8tPnBvd2VyX2luZm9baV0udHBjOworCQl0eHBvd2VyLnBvd2VyW2ldLnJhdGUgPSBpbDM5NDVfcmF0ZXNbcmF0ZV9pZHhdLnBsY3A7CisKKwkJRF9QT1dFUigiY2ggJWQ6JWQgcmYgJWQgZHNwICUzZCByYXRlIGNvZGUgMHglMDJ4XG4iLAorCQkJbGUxNl90b19jcHUodHhwb3dlci5jaGFubmVsKSwgdHhwb3dlci5iYW5kLAorCQkJdHhwb3dlci5wb3dlcltpXS50cGMudHhfZ2FpbiwKKwkJCXR4cG93ZXIucG93ZXJbaV0udHBjLmRzcF9hdHRlbiwgdHhwb3dlci5wb3dlcltpXS5yYXRlKTsKKwl9CisJLyogRmlsbCBDQ0sgcmF0ZXMgKi8KKwlmb3IgKHJhdGVfaWR4ID0gSUxfRklSU1RfQ0NLX1JBVEU7IHJhdGVfaWR4IDw9IElMX0xBU1RfQ0NLX1JBVEU7CisJICAgICByYXRlX2lkeCsrLCBpKyspIHsKKwkJdHhwb3dlci5wb3dlcltpXS50cGMgPSBjaF9pbmZvLT5wb3dlcl9pbmZvW2ldLnRwYzsKKwkJdHhwb3dlci5wb3dlcltpXS5yYXRlID0gaWwzOTQ1X3JhdGVzW3JhdGVfaWR4XS5wbGNwOworCisJCURfUE9XRVIoImNoICVkOiVkIHJmICVkIGRzcCAlM2QgcmF0ZSBjb2RlIDB4JTAyeFxuIiwKKwkJCWxlMTZfdG9fY3B1KHR4cG93ZXIuY2hhbm5lbCksIHR4cG93ZXIuYmFuZCwKKwkJCXR4cG93ZXIucG93ZXJbaV0udHBjLnR4X2dhaW4sCisJCQl0eHBvd2VyLnBvd2VyW2ldLnRwYy5kc3BfYXR0ZW4sIHR4cG93ZXIucG93ZXJbaV0ucmF0ZSk7CisJfQorCisJcmV0dXJuIGlsX3NlbmRfY21kX3BkdShpbCwgQ19UWF9QV1JfVEJMLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3R4cG93ZXJ0YWJsZV9jbWQpLAorCQkJICAgICAgICZ0eHBvd2VyKTsKKworfQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfc2V0X25ld19wb3dlciAtIENvbmZpZ3VyZXMgcG93ZXIgdGFibGVzIGF0IG5ldyBsZXZlbHMKKyAqIEBjaF9pbmZvOiBDaGFubmVsIHRvIHVwZGF0ZS4gIFVzZXMgcG93ZXJfaW5mby5yZXF1ZXN0ZWRfcG93ZXIuCisgKgorICogUmVwbGFjZSByZXF1ZXN0ZWRfcG93ZXIgYW5kIGJhc2VfcG93ZXJfaWR4IGNoX2luZm8gZmllbGRzIGZvcgorICogb25lIGNoYW5uZWwuCisgKgorICogQ2FsbGVkIGlmIHVzZXIgb3Igc3BlY3RydW0gbWFuYWdlbWVudCBjaGFuZ2VzIHBvd2VyIHByZWZlcmVuY2VzLgorICogVGFrZXMgaW50byBhY2NvdW50IGgvdyBhbmQgbW9kdWxhdGlvbiBsaW1pdGF0aW9ucyAoY2xpcCBwb3dlcikuCisgKgorICogVGhpcyBkb2VzICpub3QqIHNlbmQgYW55dGhpbmcgdG8gTklDLCBqdXN0IHNldHMgdXAgY2hfaW5mbyBmb3Igb25lIGNoYW5uZWwuCisgKgorICogTk9URTogcmVnX2NvbXBlbnNhdGVfZm9yX3RlbXBlcmF0dXJlX2RpZigpICptdXN0KiBiZSBydW4gYWZ0ZXIgdGhpcyB0bworICoJIHByb3Blcmx5IGZpbGwgb3V0IHRoZSBzY2FuIHBvd2VycywgYW5kIGFjdHVhbCBoL3cgZ2FpbiBzZXR0aW5ncywKKyAqCSBhbmQgc2VuZCBjaGFuZ2VzIHRvIE5JQworICovCitzdGF0aWMgaW50CitpbDM5NDVfaHdfcmVnX3NldF9uZXdfcG93ZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQoreworCXN0cnVjdCBpbDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvICpwb3dlcl9pbmZvOworCWludCBwb3dlcl9jaGFuZ2VkID0gMDsKKwlpbnQgaTsKKwljb25zdCBzOCAqY2xpcF9wd3JzOworCWludCBwb3dlcjsKKworCS8qIEdldCB0aGlzIGNobmxncnAncyByYXRlLXRvLW1heC9jbGlwLXBvd2VycyB0YWJsZSAqLworCWNsaXBfcHdycyA9IGlsLT5fMzk0NS5jbGlwX2dyb3Vwc1tjaF9pbmZvLT5ncm91cF9pZHhdLmNsaXBfcG93ZXJzOworCisJLyogR2V0IHRoaXMgY2hhbm5lbCdzIHJhdGUtdG8tY3VycmVudC1wb3dlciBzZXR0aW5ncyB0YWJsZSAqLworCXBvd2VyX2luZm8gPSBjaF9pbmZvLT5wb3dlcl9pbmZvOworCisJLyogdXBkYXRlIE9GRE0gVHhwb3dlciBzZXR0aW5ncyAqLworCWZvciAoaSA9IFJBVEVfNk1fSURYX1RCTDsgaSA8PSBSQVRFXzU0TV9JRFhfVEJMOyBpKyssICsrcG93ZXJfaW5mbykgeworCQlpbnQgZGVsdGFfaWR4OworCisJCS8qIGxpbWl0IG5ldyBwb3dlciB0byBiZSBubyBtb3JlIHRoYW4gaC93IGNhcGFiaWxpdHkgKi8KKwkJcG93ZXIgPSBtaW4oY2hfaW5mby0+Y3Vycl90eHBvdywgY2xpcF9wd3JzW2ldKTsKKwkJaWYgKHBvd2VyID09IHBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlcikKKwkJCWNvbnRpbnVlOworCisJCS8qIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IHJlcXVlc3RlZCBwb3dlcnMsCisJCSAqICAgIHVwZGF0ZSBiYXNlIChub24tdGVtcC1jb21wZW5zYXRlZCkgcG93ZXIgaWR4ICovCisJCWRlbHRhX2lkeCA9IChwb3dlciAtIHBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlcikgKiAyOworCQlwb3dlcl9pbmZvLT5iYXNlX3Bvd2VyX2lkeCAtPSBkZWx0YV9pZHg7CisKKwkJLyogc2F2ZSBuZXcgcmVxdWVzdGVkIHBvd2VyIHZhbHVlICovCisJCXBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlciA9IHBvd2VyOworCisJCXBvd2VyX2NoYW5nZWQgPSAxOworCX0KKworCS8qIHVwZGF0ZSBDQ0sgVHhwb3dlciBzZXR0aW5ncywgYmFzZWQgb24gT0ZETSAxMk0gc2V0dGluZyAuLi4KKwkgKiAgICAuLi4gYWxsIENDSyBwb3dlciBzZXR0aW5ncyBmb3IgYSBnaXZlbiBjaGFubmVsIGFyZSB0aGUgKnNhbWUqLiAqLworCWlmIChwb3dlcl9jaGFuZ2VkKSB7CisJCXBvd2VyID0KKwkJICAgIGNoX2luZm8tPnBvd2VyX2luZm9bUkFURV8xMk1fSURYX1RCTF0ucmVxdWVzdGVkX3Bvd2VyICsKKwkJICAgIElMX0NDS19GUk9NX09GRE1fUE9XRVJfRElGRjsKKworCQkvKiBkbyBhbGwgQ0NLIHJhdGVzJyBpbDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvIHN0cnVjdHVyZXMgKi8KKwkJZm9yIChpID0gUkFURV8xTV9JRFhfVEJMOyBpIDw9IFJBVEVfMTFNX0lEWF9UQkw7IGkrKykgeworCQkJcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcG93ZXI7CisJCQlwb3dlcl9pbmZvLT5iYXNlX3Bvd2VyX2lkeCA9CisJCQkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tSQVRFXzEyTV9JRFhfVEJMXS4KKwkJCSAgICBiYXNlX3Bvd2VyX2lkeCArIElMX0NDS19GUk9NX09GRE1fSURYX0RJRkY7CisJCQkrK3Bvd2VyX2luZm87CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfcmVnX2dldF9jaF90eHBvd2VyX2xpbWl0IC0gcmV0dXJucyBuZXcgcG93ZXIgbGltaXQgZm9yIGNoYW5uZWwKKyAqCisgKiBOT1RFOiBSZXR1cm5lZCBwb3dlciBsaW1pdCBtYXkgYmUgbGVzcyAoYnV0IG5vdCBtb3JlKSB0aGFuIHJlcXVlc3RlZCwKKyAqCSBiYXNlZCBzdHJpY3RseSBvbiByZWd1bGF0b3J5IChlZXByb20gYW5kIHNwZWN0cnVtIG1ndCkgbGltaXRhdGlvbnMKKyAqCSAobm8gY29uc2lkZXJhdGlvbiBmb3IgaC93IGNsaXBwaW5nIGxpbWl0YXRpb25zKS4KKyAqLworc3RhdGljIGludAoraWwzOTQ1X2h3X3JlZ19nZXRfY2hfdHhwb3dlcl9saW1pdChzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQoreworCXM4IG1heF9wb3dlcjsKKworI2lmIDAKKwkvKiBpZiB3ZSdyZSB1c2luZyBUR2QgbGltaXRzLCB1c2UgbG93ZXIgb2YgVEdkIG9yIEVFUFJPTSAqLworCWlmIChjaF9pbmZvLT50Z2RfZGF0YS5tYXhfcG93ZXIgIT0gMCkKKwkJbWF4X3Bvd2VyID0KKwkJICAgIG1pbihjaF9pbmZvLT50Z2RfZGF0YS5tYXhfcG93ZXIsCisJCQljaF9pbmZvLT5lZXByb20ubWF4X3Bvd2VyX2F2Zyk7CisKKwkvKiBlbHNlIGp1c3QgdXNlIEVFUFJPTSBsaW1pdHMgKi8KKwllbHNlCisjZW5kaWYKKwkJbWF4X3Bvd2VyID0gY2hfaW5mby0+ZWVwcm9tLm1heF9wb3dlcl9hdmc7CisKKwlyZXR1cm4gbWluKG1heF9wb3dlciwgY2hfaW5mby0+bWF4X3Bvd2VyX2F2Zyk7Cit9CisKKy8qKgorICogaWwzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcCAtIENvbXBlbnNhdGUgZm9yIHRlbXBlcmF0dXJlCisgKgorICogQ29tcGVuc2F0ZSB0eHBvd2VyIHNldHRpbmdzIG9mICphbGwqIGNoYW5uZWxzIGZvciB0ZW1wZXJhdHVyZS4KKyAqIFRoaXMgb25seSBhY2NvdW50cyBmb3IgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IHRlbXBlcmF0dXJlCisgKiAgIGFuZCB0aGUgZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZXMsIGFuZCBiYXNlcyB0aGUgbmV3IHNldHRpbmdzCisgKiAgIG9uIHRoZSBjaGFubmVsJ3MgYmFzZV9wb3dlcl9pZHguCisgKgorICogSWYgUnhPbiBpcyAiYXNzb2NpYXRlZCIsIHRoaXMgc2VuZHMgdGhlIG5ldyBUeHBvd2VyIHRvIE5JQyEKKyAqLworc3RhdGljIGludAoraWwzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbyA9IE5VTEw7CisJc3RydWN0IGlsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqKWlsLT5lZXByb207CisJaW50IGRlbHRhX2lkeDsKKwljb25zdCBzOCAqY2xpcF9wd3JzOwkvKiBhcnJheSBvZiBoL3cgbWF4IHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlICovCisJdTggYV9iYW5kOworCXU4IHJhdGVfaWR4OworCXU4IHNjYW5fdGJsX2lkeDsKKwl1OCBpOworCWludCByZWZfdGVtcDsKKwlpbnQgdGVtcGVyYXR1cmUgPSBpbC0+dGVtcGVyYXR1cmU7CisKKwlpZiAoaWwtPmRpc2FibGVfdHhfcG93ZXJfY2FsIHx8IHRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgeworCQkvKiBkbyBub3QgcGVyZm9ybSB0eCBwb3dlciBjYWxpYnJhdGlvbiAqLworCQlyZXR1cm4gMDsKKwl9CisJLyogc2V0IHVwIG5ldyBUeCBwb3dlciBpbmZvIGZvciBlYWNoIGFuZCBldmVyeSBjaGFubmVsLCAyLjQgYW5kIDUueCAqLworCWZvciAoaSA9IDA7IGkgPCBpbC0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7CisJCWNoX2luZm8gPSAmaWwtPmNoYW5uZWxfaW5mb1tpXTsKKwkJYV9iYW5kID0gaWxfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbyk7CisKKwkJLyogR2V0IHRoaXMgY2hubGdycCdzIGZhY3RvcnkgY2FsaWJyYXRpb24gdGVtcGVyYXR1cmUgKi8KKwkJcmVmX3RlbXAgPSAoczE2KSBlZXByb20tPmdyb3Vwc1tjaF9pbmZvLT5ncm91cF9pZHhdLnRlbXBlcmF0dXJlOworCisJCS8qIGdldCBwb3dlciBpZHggYWRqdXN0bWVudCBiYXNlZCBvbiBjdXJyZW50IGFuZCBmYWN0b3J5CisJCSAqIHRlbXBzICovCisJCWRlbHRhX2lkeCA9CisJCSAgICBpbDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wKHRlbXBlcmF0dXJlLCByZWZfdGVtcCk7CisKKwkJLyogc2V0IHR4IHBvd2VyIHZhbHVlIGZvciBhbGwgcmF0ZXMsIE9GRE0gYW5kIENDSyAqLworCQlmb3IgKHJhdGVfaWR4ID0gMDsgcmF0ZV9pZHggPCBSQVRFX0NPVU5UXzM5NDU7IHJhdGVfaWR4KyspIHsKKwkJCWludCBwb3dlcl9pZHggPQorCQkJICAgIGNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pZHhdLmJhc2VfcG93ZXJfaWR4OworCisJCQkvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRlICovCisJCQlwb3dlcl9pZHggKz0gZGVsdGFfaWR4OworCisJCQkvKiBzdGF5IHdpdGhpbiB0YWJsZSByYW5nZSAqLworCQkJcG93ZXJfaWR4ID0gaWwzOTQ1X2h3X3JlZ19maXhfcG93ZXJfaWR4KHBvd2VyX2lkeCk7CisJCQljaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaWR4XS5wb3dlcl90YWJsZV9pZHggPQorCQkJICAgICh1OCkgcG93ZXJfaWR4OworCQkJY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2lkeF0udHBjID0KKwkJCSAgICBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcG93ZXJfaWR4XTsKKwkJfQorCisJCS8qIEdldCB0aGlzIGNobmxncnAncyByYXRlLXRvLW1heC9jbGlwLXBvd2VycyB0YWJsZSAqLworCQljbGlwX3B3cnMgPQorCQkgICAgaWwtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2lkeF0uY2xpcF9wb3dlcnM7CisKKwkJLyogc2V0IHNjYW4gdHggcG93ZXIsIDFNYml0IGZvciBDQ0ssIDZNYml0IGZvciBPRkRNICovCisJCWZvciAoc2Nhbl90YmxfaWR4ID0gMDsgc2Nhbl90YmxfaWR4IDwgSUxfTlVNX1NDQU5fUkFURVM7CisJCSAgICAgc2Nhbl90YmxfaWR4KyspIHsKKwkJCXMzMiBhY3R1YWxfaWR4ID0KKwkJCSAgICAoc2Nhbl90YmxfaWR4ID09CisJCQkgICAgIDApID8gUkFURV8xTV9JRFhfVEJMIDogUkFURV82TV9JRFhfVEJMOworCQkJaWwzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlcihpbCwgc2Nhbl90YmxfaWR4LAorCQkJCQkJICAgICBhY3R1YWxfaWR4LCBjbGlwX3B3cnMsCisJCQkJCQkgICAgIGNoX2luZm8sIGFfYmFuZCk7CisJCX0KKwl9CisKKwkvKiBzZW5kIFR4cG93ZXIgY29tbWFuZCBmb3IgY3VycmVudCBjaGFubmVsIHRvIHVjb2RlICovCisJcmV0dXJuIGlsLT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKGlsKTsKK30KKworaW50CitpbDM5NDVfaHdfcmVnX3NldF90eHBvd2VyKHN0cnVjdCBpbF9wcml2ICppbCwgczggcG93ZXIpCit7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKwlzOCBtYXhfcG93ZXI7CisJdTggYV9iYW5kOworCXU4IGk7CisKKwlpZiAoaWwtPnR4X3Bvd2VyX3VzZXJfbG10ID09IHBvd2VyKSB7CisJCURfUE9XRVIoIlJlcXVlc3RlZCBUeCBwb3dlciBzYW1lIGFzIGN1cnJlbnQgIiAibGltaXQ6ICVkZEJtLlxuIiwKKwkJCXBvd2VyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJRF9QT1dFUigiU2V0dGluZyB1cHBlciBsaW1pdCBjbGFtcCB0byAlZGRCbS5cbiIsIHBvd2VyKTsKKwlpbC0+dHhfcG93ZXJfdXNlcl9sbXQgPSBwb3dlcjsKKworCS8qIHNldCB1cCBuZXcgVHggcG93ZXJzIGZvciBlYWNoIGFuZCBldmVyeSBjaGFubmVsLCAyLjQgYW5kIDUueCAqLworCisJZm9yIChpID0gMDsgaSA8IGlsLT5jaGFubmVsX2NvdW50OyBpKyspIHsKKwkJY2hfaW5mbyA9ICZpbC0+Y2hhbm5lbF9pbmZvW2ldOworCQlhX2JhbmQgPSBpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKTsKKworCQkvKiBmaW5kIG1pbmltdW0gcG93ZXIgb2YgYWxsIHVzZXIgYW5kIHJlZ3VsYXRvcnkgY29uc3RyYWludHMKKwkJICogICAgKGRvZXMgbm90IGNvbnNpZGVyIGgvdyBjbGlwcGluZyBsaW1pdGF0aW9ucykgKi8KKwkJbWF4X3Bvd2VyID0gaWwzOTQ1X2h3X3JlZ19nZXRfY2hfdHhwb3dlcl9saW1pdChjaF9pbmZvKTsKKwkJbWF4X3Bvd2VyID0gbWluKHBvd2VyLCBtYXhfcG93ZXIpOworCQlpZiAobWF4X3Bvd2VyICE9IGNoX2luZm8tPmN1cnJfdHhwb3cpIHsKKwkJCWNoX2luZm8tPmN1cnJfdHhwb3cgPSBtYXhfcG93ZXI7CisKKwkJCS8qIHRoaXMgY29uc2lkZXJzIHRoZSBoL3cgY2xpcHBpbmcgbGltaXRhdGlvbnMgKi8KKwkJCWlsMzk0NV9od19yZWdfc2V0X25ld19wb3dlcihpbCwgY2hfaW5mbyk7CisJCX0KKwl9CisKKwkvKiB1cGRhdGUgdHhwb3dlciBzZXR0aW5ncyBmb3IgYWxsIGNoYW5uZWxzLAorCSAqICAgc2VuZCB0byBOSUMgaWYgYXNzb2NpYXRlZC4gKi8KKwlpbDM5NDVfaXNfdGVtcF9jYWxpYl9uZWVkZWQoaWwpOworCWlsMzk0NV9od19yZWdfY29tcF90eHBvd2VyX3RlbXAoaWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZW5kX3J4b25fYXNzb2Moc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3Q7CisJc3RydWN0IGlsMzk0NV9yeG9uX2Fzc29jX2NtZCByeG9uX2Fzc29jOworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfUlhPTl9BU1NPQywKKwkJLmxlbiA9IHNpemVvZihyeG9uX2Fzc29jKSwKKwkJLmZsYWdzID0gQ01EX1dBTlRfU0tCLAorCQkuZGF0YSA9ICZyeG9uX2Fzc29jLAorCX07CisJY29uc3Qgc3RydWN0IGlsX3J4b25fY21kICpyeG9uMSA9ICZjdHgtPnN0YWdpbmc7CisJY29uc3Qgc3RydWN0IGlsX3J4b25fY21kICpyeG9uMiA9ICZjdHgtPmFjdGl2ZTsKKworCWlmIChyeG9uMS0+ZmxhZ3MgPT0gcnhvbjItPmZsYWdzICYmCisJICAgIHJ4b24xLT5maWx0ZXJfZmxhZ3MgPT0gcnhvbjItPmZpbHRlcl9mbGFncyAmJgorCSAgICByeG9uMS0+Y2NrX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5jY2tfYmFzaWNfcmF0ZXMgJiYKKwkgICAgcnhvbjEtPm9mZG1fYmFzaWNfcmF0ZXMgPT0gcnhvbjItPm9mZG1fYmFzaWNfcmF0ZXMpIHsKKwkJRF9JTkZPKCJVc2luZyBjdXJyZW50IFJYT05fQVNTT0MuICBOb3QgcmVzZW5kaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXJ4b25fYXNzb2MuZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmxhZ3M7CisJcnhvbl9hc3NvYy5maWx0ZXJfZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzOworCXJ4b25fYXNzb2Mub2ZkbV9iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzOworCXJ4b25fYXNzb2MuY2NrX2Jhc2ljX3JhdGVzID0gY3R4LT5zdGFnaW5nLmNja19iYXNpY19yYXRlczsKKwlyeG9uX2Fzc29jLnJlc2VydmVkID0gMDsKKworCXJjID0gaWxfc2VuZF9jbWRfc3luYyhpbCwgJmNtZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwa3QgPSAoc3RydWN0IGlsX3J4X3BrdCAqKWNtZC5yZXBseV9wYWdlOworCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tIENfUlhPTl9BU1NPQyBjb21tYW5kXG4iKTsKKwkJcmMgPSAtRUlPOworCX0KKworCWlsX2ZyZWVfcGFnZXMoaWwsIGNtZC5yZXBseV9wYWdlKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpbDM5NDVfY29tbWl0X3J4b24gLSBjb21taXQgc3RhZ2luZ19yeG9uIHRvIGhhcmR3YXJlCisgKgorICogVGhlIFJYT04gY29tbWFuZCBpbiBzdGFnaW5nX3J4b24gaXMgY29tbWl0dGVkIHRvIHRoZSBoYXJkd2FyZSBhbmQKKyAqIHRoZSBhY3RpdmVfcnhvbiBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgZGF0YS4gIFRoaXMKKyAqIGZ1bmN0aW9uIGNvcnJlY3RseSB0cmFuc2l0aW9ucyBvdXQgb2YgdGhlIFJYT05fQVNTT0NfTVNLIHN0YXRlIGlmCisgKiBhIEhXIHR1bmUgaXMgcmVxdWlyZWQgYmFzZWQgb24gdGhlIFJYT04gc3RydWN0dXJlIGNoYW5nZXMuCisgKi8KK2ludAoraWwzOTQ1X2NvbW1pdF9yeG9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCS8qIGNhc3QgYXdheSB0aGUgY29uc3QgZm9yIGFjdGl2ZV9yeG9uIGluIHRoaXMgZnVuY3Rpb24gKi8KKwlzdHJ1Y3QgaWwzOTQ1X3J4b25fY21kICphY3RpdmVfcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOworCXN0cnVjdCBpbDM5NDVfcnhvbl9jbWQgKnN0YWdpbmdfcnhvbiA9ICh2b2lkICopJmN0eC0+c3RhZ2luZzsKKwlpbnQgcmMgPSAwOworCWJvb2wgbmV3X2Fzc29jID0gISEoc3RhZ2luZ19yeG9uLT5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtMTsKKworCS8qIGFsd2F5cyBnZXQgdGltZXN0YW1wIHdpdGggUnggZnJhbWUgKi8KKwlzdGFnaW5nX3J4b24tPmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKKworCS8qIHNlbGVjdCBhbnRlbm5hICovCisJc3RhZ2luZ19yeG9uLT5mbGFncyAmPSB+KFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX1NFTF9NU0spOworCXN0YWdpbmdfcnhvbi0+ZmxhZ3MgfD0gaWwzOTQ1X2dldF9hbnRlbm5hX2ZsYWdzKGlsKTsKKworCXJjID0gaWxfY2hlY2tfcnhvbl9jbWQoaWwsIGN0eCk7CisJaWYgKHJjKSB7CisJCUlMX0VSUigiSW52YWxpZCBSWE9OIGNvbmZpZ3VyYXRpb24uICBOb3QgY29tbWl0dGluZy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgYSBmdWxsIFJYT04sIHdlIGNhbiB1c2UKKwkgKiBpbDM5NDVfcnhvbl9hc3NvY19jbWQgd2hpY2ggaXMgdXNlZCB0byByZWNvbmZpZ3VyZSBmaWx0ZXIKKwkgKiBhbmQgb3RoZXIgZmxhZ3MgZm9yIHRoZSBjdXJyZW50IHJhZGlvIGNvbmZpZ3VyYXRpb24uICovCisJaWYgKCFpbF9mdWxsX3J4b25fcmVxdWlyZWQoaWwsICZpbC0+Y3R4KSkgeworCQlyYyA9IGlsX3NlbmRfcnhvbl9hc3NvYyhpbCwgJmlsLT5jdHgpOworCQlpZiAocmMpIHsKKwkJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBSWE9OX0FTU09DICIKKwkJCSAgICAgICAiY29uZmlndXJhdGlvbiAoJWQpLlxuIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJbWVtY3B5KGFjdGl2ZV9yeG9uLCBzdGFnaW5nX3J4b24sIHNpemVvZigqYWN0aXZlX3J4b24pKTsKKwkJLyoKKwkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAorCQkgKiBkbyBpdCBub3cgaWYgdHggcG93ZXIgY2hhbmdlZC4KKwkJICovCisJCWlsX3NldF90eF9wb3dlcihpbCwgaWwtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGFuZCB0aGUgbmV3IGNvbmZpZyByZXF1aXJlcworCSAqIGFuIFJYT05fQVNTT0MgYW5kIHRoZSBuZXcgY29uZmlnIHdhbnRzIHRoZSBhc3NvY2lhdGVkIG1hc2sgZW5hYmxlZCwKKwkgKiB3ZSBtdXN0IGNsZWFyIHRoZSBhc3NvY2lhdGVkIGZyb20gdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCisJICogYmVmb3JlIHdlIGFwcGx5IHRoZSBuZXcgY29uZmlnICovCisJaWYgKGlsX2lzX2Fzc29jaWF0ZWQoaWwpICYmIG5ld19hc3NvYykgeworCQlEX0lORk8oIlRvZ2dsaW5nIGFzc29jaWF0ZWQgYml0IG9uIGN1cnJlbnQgUlhPTlxuIik7CisJCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKworCQkvKgorCQkgKiByZXNlcnZlZDQgYW5kIDUgY291bGQgaGF2ZSBiZWVuIGZpbGxlZCBieSB0aGUgaXdsY29yZSBjb2RlLgorCQkgKiBMZXQncyBjbGVhciB0aGVtIGJlZm9yZSBwdXNoaW5nIHRvIHRoZSAzOTQ1LgorCQkgKi8KKwkJYWN0aXZlX3J4b24tPnJlc2VydmVkNCA9IDA7CisJCWFjdGl2ZV9yeG9uLT5yZXNlcnZlZDUgPSAwOworCQlyYyA9IGlsX3NlbmRfY21kX3BkdShpbCwgQ19SWE9OLCBzaXplb2Yoc3RydWN0IGlsMzk0NV9yeG9uX2NtZCksCisJCQkJICAgICAmaWwtPmN0eC5hY3RpdmUpOworCisJCS8qIElmIHRoZSBtYXNrIGNsZWFyaW5nIGZhaWxlZCB0aGVuIHdlIHNldAorCQkgKiBhY3RpdmVfcnhvbiBiYWNrIHRvIHdoYXQgaXQgd2FzIHByZXZpb3VzbHkgKi8KKwkJaWYgKHJjKSB7CisJCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKKwkJCUlMX0VSUigiRXJyb3IgY2xlYXJpbmcgQVNTT0NfTVNLIG9uIGN1cnJlbnQgIgorCQkJICAgICAgICJjb25maWd1cmF0aW9uICglZCkuXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoaWwsICZpbC0+Y3R4KTsKKwkJaWxfcmVzdG9yZV9zdGF0aW9ucyhpbCwgJmlsLT5jdHgpOworCX0KKworCURfSU5GTygiU2VuZGluZyBSWE9OXG4iICIqIHdpdGglcyBSWE9OX0ZJTFRFUl9BU1NPQ19NU0tcbiIKKwkgICAgICAgIiogY2hhbm5lbCA9ICVkXG4iICIqIGJzc2lkID0gJXBNXG4iLCAobmV3X2Fzc29jID8gIiIgOiAib3V0IiksCisJICAgICAgIGxlMTZfdG9fY3B1KHN0YWdpbmdfcnhvbi0+Y2hhbm5lbCksIHN0YWdpbmdfcnhvbi0+YnNzaWRfYWRkcik7CisKKwkvKgorCSAqIHJlc2VydmVkNCBhbmQgNSBjb3VsZCBoYXZlIGJlZW4gZmlsbGVkIGJ5IHRoZSBpd2xjb3JlIGNvZGUuCisJICogTGV0J3MgY2xlYXIgdGhlbSBiZWZvcmUgcHVzaGluZyB0byB0aGUgMzk0NS4KKwkgKi8KKwlzdGFnaW5nX3J4b24tPnJlc2VydmVkNCA9IDA7CisJc3RhZ2luZ19yeG9uLT5yZXNlcnZlZDUgPSAwOworCisJaWxfc2V0X3J4b25faHdjcnlwdG8oaWwsIGN0eCwgIWlsMzk0NV9tb2RfcGFyYW1zLnN3X2NyeXB0byk7CisKKwkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KKwlyYyA9IGlsX3NlbmRfY21kX3BkdShpbCwgQ19SWE9OLCBzaXplb2Yoc3RydWN0IGlsMzk0NV9yeG9uX2NtZCksCisJCQkgICAgIHN0YWdpbmdfcnhvbik7CisJaWYgKHJjKSB7CisJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBuZXcgY29uZmlndXJhdGlvbiAoJWQpLlxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJbWVtY3B5KGFjdGl2ZV9yeG9uLCBzdGFnaW5nX3J4b24sIHNpemVvZigqYWN0aXZlX3J4b24pKTsKKworCWlmICghbmV3X2Fzc29jKSB7CisJCWlsX2NsZWFyX3Vjb2RlX3N0YXRpb25zKGlsLCAmaWwtPmN0eCk7CisJCWlsX3Jlc3RvcmVfc3RhdGlvbnMoaWwsICZpbC0+Y3R4KTsKKwl9CisKKwkvKiBJZiB3ZSBpc3N1ZSBhIG5ldyBSWE9OIGNvbW1hbmQgd2hpY2ggcmVxdWlyZWQgYSB0dW5lIHRoZW4gd2UgbXVzdAorCSAqIHNlbmQgYSBuZXcgVFhQT1dFUiBjb21tYW5kIG9yIHdlIHdvbid0IGJlIGFibGUgdG8gVHggYW55IGZyYW1lcyAqLworCXJjID0gaWxfc2V0X3R4X3Bvd2VyKGlsLCBpbC0+dHhfcG93ZXJfbmV4dCwgdHJ1ZSk7CisJaWYgKHJjKSB7CisJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBUeCBwb3dlciAoJWQpLlxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogSW5pdCB0aGUgaGFyZHdhcmUncyByYXRlIGZhbGxiYWNrIG9yZGVyIGJhc2VkIG9uIHRoZSBiYW5kICovCisJcmMgPSBpbDM5NDVfaW5pdF9od19yYXRlX3RhYmxlKGlsKTsKKwlpZiAocmMpIHsKKwkJSUxfRVJSKCJFcnJvciBzZXR0aW5nIEhXIHJhdGUgdGFibGU6ICUwMlhcbiIsIHJjKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWwzOTQ1X3JlZ190eHBvd2VyX3BlcmlvZGljIC0gIGNhbGxlZCB3aGVuIHRpbWUgdG8gY2hlY2sgb3VyIHRlbXBlcmF0dXJlLgorICoKKyAqIC0tIHJlc2V0IHBlcmlvZGljIHRpbWVyCisgKiAtLSBzZWUgaWYgdGVtcCBoYXMgY2hhbmdlZCBlbm91Z2ggdG8gd2FycmFudCByZS1jYWxpYnJhdGlvbiAuLi4gaWYgc286CisgKiAgICAgLS0gY29ycmVjdCBjb2VmZnMgZm9yIHRlbXAgKGNhbiByZXNldCB0ZW1wIHRpbWVyKQorICogICAgIC0tIHNhdmUgdGhpcyB0ZW1wIGFzICJsYXN0IiwKKyAqICAgICAtLSBzZW5kIG5ldyBzZXQgb2YgZ2FpbiBzZXR0aW5ncyB0byBOSUMKKyAqIE5PVEU6ICBUaGlzIHNob3VsZCBjb250aW51ZSB3b3JraW5nLCBldmVuIHdoZW4gd2UncmUgbm90IGFzc29jaWF0ZWQsCisgKiAgIHNvIHdlIGNhbiBrZWVwIG91ciBpbnRlcm5hbCB0YWJsZSBvZiBzY2FuIHBvd2VycyBjdXJyZW50LiAqLwordm9pZAoraWwzOTQ1X3JlZ190eHBvd2VyX3BlcmlvZGljKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBUaGlzIHdpbGwga2ljayBpbiB0aGUgImJydXRlIGZvcmNlIgorCSAqIGlsMzk0NV9od19yZWdfY29tcF90eHBvd2VyX3RlbXAoKSBiZWxvdyAqLworCWlmICghaWwzOTQ1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKGlsKSkKKwkJZ290byByZXNjaGVkdWxlOworCisJLyogU2V0IHVwIGEgbmV3IHNldCBvZiB0ZW1wLWFkanVzdGVkIFR4UG93ZXJzLCBzZW5kIHRvIE5JQy4KKwkgKiBUaGlzIGlzIGJhc2VkICpvbmx5KiBvbiBjdXJyZW50IHRlbXBlcmF0dXJlLAorCSAqIGlnbm9yaW5nIGFueSBwcmV2aW91cyBwb3dlciBtZWFzdXJlbWVudHMgKi8KKwlpbDM5NDVfaHdfcmVnX2NvbXBfdHhwb3dlcl90ZW1wKGlsKTsKKworcmVzY2hlZHVsZToKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5fMzk0NS50aGVybWFsX3BlcmlvZGljLAorCQkJICAgUkVHX1JFQ0FMSUJfUEVSSU9EICogSFopOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2JnX3JlZ190eHBvd2VyX3BlcmlvZGljKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGlsX3ByaXYsCisJCQkJCSAgXzM5NDUudGhlcm1hbF9wZXJpb2RpYy53b3JrKTsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhpbCk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfZ2V0X2NoX2dycF9pZHggLSBmaW5kIHRoZSBjaGFubmVsLWdyb3VwIGlkeCAoMC00KSBmb3IgY2hhbm5lbC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgY2hhbm5lbC1pbmZvIHN0cnVjdHMuCisgKgorICogTk9URTogVGhlc2UgY2hhbm5lbCBncm91cHMgZG8gKk5PVCogbWF0Y2ggdGhlIGJhbmRzIGFib3ZlIQorICoJIFRoZXNlIGNoYW5uZWwgZ3JvdXBzIGFyZSBiYXNlZCBvbiBmYWN0b3J5LXRlc3RlZCBjaGFubmVsczsKKyAqCSBvbiBBLWJhbmQsIEVFUFJPTSdzICJncm91cCBmcmVxdWVuY3kiIGVudHJpZXMgcmVwcmVzZW50IHRoZSB0b3AKKyAqCSBjaGFubmVsIGluIGVhY2ggZ3JvdXAgMS00LiAgR3JvdXAgNSBBbGwgQi9HIGNoYW5uZWxzIGFyZSBpbiBncm91cCAwLgorICovCitzdGF0aWMgdTE2CitpbDM5NDVfaHdfcmVnX2dldF9jaF9ncnBfaWR4KHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbykKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwICpjaF9ncnAgPSAmZWVwcm9tLT5ncm91cHNbMF07CisJdTggZ3JvdXA7CisJdTE2IGdyb3VwX2lkeCA9IDA7CS8qIGJhc2VkIG9uIGZhY3RvcnkgY2FsaWIgZnJlcXVlbmNpZXMgKi8KKwl1OCBncnBfY2hhbm5lbDsKKworCS8qIEZpbmQgdGhlIGdyb3VwIGlkeCBmb3IgdGhlIGNoYW5uZWwgLi4uIGRvbid0IHVzZSBpZHggMSg/KSAqLworCWlmIChpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSkgeworCQlmb3IgKGdyb3VwID0gMTsgZ3JvdXAgPCA1OyBncm91cCsrKSB7CisJCQlncnBfY2hhbm5lbCA9IGNoX2dycFtncm91cF0uZ3JvdXBfY2hhbm5lbDsKKwkJCWlmIChjaF9pbmZvLT5jaGFubmVsIDw9IGdycF9jaGFubmVsKSB7CisJCQkJZ3JvdXBfaWR4ID0gZ3JvdXA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogZ3JvdXAgNCBoYXMgYSBmZXcgY2hhbm5lbHMgKmFib3ZlKiBpdHMgZmFjdG9yeSBjYWwgZnJlcSAqLworCQlpZiAoZ3JvdXAgPT0gNSkKKwkJCWdyb3VwX2lkeCA9IDQ7CisJfSBlbHNlCisJCWdyb3VwX2lkeCA9IDA7CS8qIDIuNCBHSHosIGdyb3VwIDAgKi8KKworCURfUE9XRVIoIkNobmwgJWQgbWFwcGVkIHRvIGdycCAlZFxuIiwgY2hfaW5mby0+Y2hhbm5lbCwgZ3JvdXBfaWR4KTsKKwlyZXR1cm4gZ3JvdXBfaWR4OworfQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfZ2V0X21hdGNoZWRfcG93ZXJfaWR4IC0gSW50ZXJwb2xhdGUgdG8gZ2V0IG5vbWluYWwgaWR4CisgKgorICogSW50ZXJwb2xhdGUgdG8gZ2V0IG5vbWluYWwgKGkuZS4gYXQgZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSkgaWR4CisgKiAgIGludG8gcmFkaW8vRFNQIGdhaW4gc2V0dGluZ3MgdGFibGUgZm9yIHJlcXVlc3RlZCBwb3dlci4KKyAqLworc3RhdGljIGludAoraWwzOTQ1X2h3X3JlZ19nZXRfbWF0Y2hlZF9wb3dlcl9pZHgoc3RydWN0IGlsX3ByaXYgKmlsLCBzOCByZXF1ZXN0ZWRfcG93ZXIsCisJCQkJICAgIHMzMiBzZXR0aW5nX2lkeCwgczMyICpuZXdfaWR4KQoreworCWNvbnN0IHN0cnVjdCBpbDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgKmNobmxfZ3JwID0gTlVMTDsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwlzMzIgaWR4MCwgaWR4MTsKKwlzMzIgcG93ZXIgPSAyICogcmVxdWVzdGVkX3Bvd2VyOworCXMzMiBpOworCWNvbnN0IHN0cnVjdCBpbDM5NDVfZWVwcm9tX3R4cG93ZXJfc2FtcGxlICpzYW1wbGVzOworCXMzMiBnYWluczAsIGdhaW5zMTsKKwlzMzIgcmVzOworCXMzMiBkZW5vbWluYXRvcjsKKworCWNobmxfZ3JwID0gJmVlcHJvbS0+Z3JvdXBzW3NldHRpbmdfaWR4XTsKKwlzYW1wbGVzID0gY2hubF9ncnAtPnNhbXBsZXM7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAocG93ZXIgPT0gc2FtcGxlc1tpXS5wb3dlcikgeworCQkJKm5ld19pZHggPSBzYW1wbGVzW2ldLmdhaW5faWR4OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAocG93ZXIgPiBzYW1wbGVzWzFdLnBvd2VyKSB7CisJCWlkeDAgPSAwOworCQlpZHgxID0gMTsKKwl9IGVsc2UgaWYgKHBvd2VyID4gc2FtcGxlc1syXS5wb3dlcikgeworCQlpZHgwID0gMTsKKwkJaWR4MSA9IDI7CisJfSBlbHNlIGlmIChwb3dlciA+IHNhbXBsZXNbM10ucG93ZXIpIHsKKwkJaWR4MCA9IDI7CisJCWlkeDEgPSAzOworCX0gZWxzZSB7CisJCWlkeDAgPSAzOworCQlpZHgxID0gNDsKKwl9CisKKwlkZW5vbWluYXRvciA9IChzMzIpIHNhbXBsZXNbaWR4MV0ucG93ZXIgLSAoczMyKSBzYW1wbGVzW2lkeDBdLnBvd2VyOworCWlmIChkZW5vbWluYXRvciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlnYWluczAgPSAoczMyKSBzYW1wbGVzW2lkeDBdLmdhaW5faWR4ICogKDEgPDwgMTkpOworCWdhaW5zMSA9IChzMzIpIHNhbXBsZXNbaWR4MV0uZ2Fpbl9pZHggKiAoMSA8PCAxOSk7CisJcmVzID0KKwkgICAgZ2FpbnMwICsgKGdhaW5zMSAtIGdhaW5zMCkgKiAoKHMzMikgcG93ZXIgLQorCQkJCQkgIChzMzIpIHNhbXBsZXNbaWR4MF0ucG93ZXIpIC8KKwkgICAgZGVub21pbmF0b3IgKyAoMSA8PCAxOCk7CisJKm5ld19pZHggPSByZXMgPj4gMTk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfaHdfcmVnX2luaXRfY2hhbm5lbF9ncm91cHMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXUzMiBpOworCXMzMiByYXRlX2lkeDsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwljb25zdCBzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwICpncm91cDsKKworCURfUE9XRVIoIkluaXRpYWxpemluZyBmYWN0b3J5IGNhbGliIGluZm8gZnJvbSBFRVBST01cbiIpOworCisJZm9yIChpID0gMDsgaSA8IElMX05VTV9UWF9DQUxJQl9HUk9VUFM7IGkrKykgeworCQlzOCAqY2xpcF9wd3JzOwkvKiB0YWJsZSBvZiBwb3dlciBsZXZlbHMgZm9yIGVhY2ggcmF0ZSAqLworCQlzOCBzYXR1cl9wd3I7CS8qIHNhdHVyYXRpb24gcG93ZXIgZm9yIGVhY2ggY2hubCBncm91cCAqLworCQlncm91cCA9ICZlZXByb20tPmdyb3Vwc1tpXTsKKworCQkvKiBzYW5pdHkgY2hlY2sgb24gZmFjdG9yeSBzYXR1cmF0aW9uIHBvd2VyIHZhbHVlICovCisJCWlmIChncm91cC0+c2F0dXJhdGlvbl9wb3dlciA8IDQwKSB7CisJCQlJTF9XQVJOKCJFcnJvcjogc2F0dXJhdGlvbiBwb3dlciBpcyAlZCwgIgorCQkJCSJsZXNzIHRoYW4gbWluaW11bSBleHBlY3RlZCA0MFxuIiwKKwkJCQlncm91cC0+c2F0dXJhdGlvbl9wb3dlcik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBEZXJpdmUgcmVxdWVzdGVkIHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlLCBiYXNlZCBvbgorCQkgKiAgIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAoc2F0dXJhdGlvbiBwb3dlciBmb3IgYmFuZCkuCisJCSAqIEJhc2ljIHZhbHVlIGlzIDNkQiBkb3duIGZyb20gc2F0dXJhdGlvbiwgd2l0aCBmdXJ0aGVyCisJCSAqICAgcG93ZXIgcmVkdWN0aW9ucyBmb3IgaGlnaGVzdCAzIGRhdGEgcmF0ZXMuICBUaGVzZQorCQkgKiAgIGJhY2tvZmZzIHByb3ZpZGUgaGVhZHJvb20gZm9yIGhpZ2ggcmF0ZSBtb2R1bGF0aW9uCisJCSAqICAgcG93ZXIgcGVha3MsIHdpdGhvdXQgdG9vIG11Y2ggZGlzdG9ydGlvbiAoY2xpcHBpbmcpLgorCQkgKi8KKwkJLyogd2UnbGwgZmlsbCBpbiB0aGlzIGFycmF5IHdpdGggaC93IG1heCBwb3dlciBsZXZlbHMgKi8KKwkJY2xpcF9wd3JzID0gKHM4ICopIGlsLT5fMzk0NS5jbGlwX2dyb3Vwc1tpXS5jbGlwX3Bvd2VyczsKKworCQkvKiBkaXZpZGUgZmFjdG9yeSBzYXR1cmF0aW9uIHBvd2VyIGJ5IDIgdG8gZmluZCAtM2RCIGxldmVsICovCisJCXNhdHVyX3B3ciA9IChzOCkgKGdyb3VwLT5zYXR1cmF0aW9uX3Bvd2VyID4+IDEpOworCisJCS8qIGZpbGwgaW4gY2hhbm5lbCBncm91cCdzIG5vbWluYWwgcG93ZXJzIGZvciBlYWNoIHJhdGUgKi8KKwkJZm9yIChyYXRlX2lkeCA9IDA7IHJhdGVfaWR4IDwgUkFURV9DT1VOVF8zOTQ1OworCQkgICAgIHJhdGVfaWR4KyssIGNsaXBfcHdycysrKSB7CisJCQlzd2l0Y2ggKHJhdGVfaWR4KSB7CisJCQljYXNlIFJBVEVfMzZNX0lEWF9UQkw6CisJCQkJaWYgKGkgPT0gMCkJLyogQi9HICovCisJCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3I7CisJCQkJZWxzZQkvKiBBICovCisJCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSA1OworCQkJCWJyZWFrOworCQkJY2FzZSBSQVRFXzQ4TV9JRFhfVEJMOgorCQkJCWlmIChpID09IDApCisJCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSA3OworCQkJCWVsc2UKKwkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDEwOworCQkJCWJyZWFrOworCQkJY2FzZSBSQVRFXzU0TV9JRFhfVEJMOgorCQkJCWlmIChpID09IDApCisJCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSA5OworCQkJCWVsc2UKKwkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDEyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIGlsMzk0NV90eHBvd2VyX3NldF9mcm9tX2VlcHJvbSAtIFNldCBjaGFubmVsIHBvd2VyIGluZm8gYmFzZWQgb24gRUVQUk9NCisgKgorICogU2Vjb25kIHBhc3MgKGR1cmluZyBpbml0KSB0byBzZXQgdXAgaWwtPmNoYW5uZWxfaW5mbworICoKKyAqIFNldCB1cCBUeC1wb3dlciBzZXR0aW5ncyBpbiBvdXIgY2hhbm5lbCBpbmZvIGRhdGFiYXNlIGZvciBlYWNoIFZBTElECisgKiAoZm9yIHRoaXMgZ2VvL1NLVSkgY2hhbm5lbCwgYXQgYWxsIFR4IGRhdGEgcmF0ZXMsIGJhc2VkIG9uIGVlcHJvbSB2YWx1ZXMKKyAqIGFuZCBjdXJyZW50IHRlbXBlcmF0dXJlLgorICoKKyAqIFNpbmNlIHRoaXMgaXMgYmFzZWQgb24gY3VycmVudCB0ZW1wZXJhdHVyZSAoYXQgaW5pdCB0aW1lKSwgdGhlc2UgdmFsdWVzIG1heQorICogbm90IGJlIHZhbGlkIGZvciB2ZXJ5IGxvbmcsIGJ1dCBpdCBnaXZlcyB1cyBhIHN0YXJ0aW5nL2RlZmF1bHQgcG9pbnQsCisgKiBhbmQgYWxsb3dzIHVzIHRvIGFjdGl2ZSAoaS5lLiB1c2luZyBUeCkgc2Nhbi4KKyAqCisgKiBUaGlzIGRvZXMgKm5vdCogd3JpdGUgdmFsdWVzIHRvIE5JQywganVzdCBzZXRzIHVwIG91ciBpbnRlcm5hbCB0YWJsZS4KKyAqLworaW50CitpbDM5NDVfdHhwb3dlcl9zZXRfZnJvbV9lZXByb20oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8gPSBOVUxMOworCXN0cnVjdCBpbDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvICpwd3JfaW5mbzsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwlpbnQgZGVsdGFfaWR4OworCXU4IHJhdGVfaWR4OworCXU4IHNjYW5fdGJsX2lkeDsKKwljb25zdCBzOCAqY2xpcF9wd3JzOwkvKiBhcnJheSBvZiBwb3dlciBsZXZlbHMgZm9yIGVhY2ggcmF0ZSAqLworCXU4IGdhaW4sIGRzcF9hdHRlbjsKKwlzOCBwb3dlcjsKKwl1OCBwd3JfaWR4LCBiYXNlX3B3cl9pZHgsIGFfYmFuZDsKKwl1OCBpOworCWludCB0ZW1wZXJhdHVyZTsKKworCS8qIHNhdmUgdGVtcGVyYXR1cmUgcmVmZXJlbmNlLAorCSAqICAgc28gd2UgY2FuIGRldGVybWluZSBuZXh0IHRpbWUgdG8gY2FsaWJyYXRlICovCisJdGVtcGVyYXR1cmUgPSBpbDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKGlsKTsKKwlpbC0+bGFzdF90ZW1wZXJhdHVyZSA9IHRlbXBlcmF0dXJlOworCisJaWwzOTQ1X2h3X3JlZ19pbml0X2NoYW5uZWxfZ3JvdXBzKGlsKTsKKworCS8qIGluaXRpYWxpemUgVHggcG93ZXIgaW5mbyBmb3IgZWFjaCBhbmQgZXZlcnkgY2hhbm5lbCwgMi40IGFuZCA1LnggKi8KKwlmb3IgKGkgPSAwLCBjaF9pbmZvID0gaWwtPmNoYW5uZWxfaW5mbzsgaSA8IGlsLT5jaGFubmVsX2NvdW50OworCSAgICAgaSsrLCBjaF9pbmZvKyspIHsKKwkJYV9iYW5kID0gaWxfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbyk7CisJCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGZpbmQgdGhpcyBjaGFubmVsJ3MgY2hhbm5lbCBncm91cCAoKm5vdCogImJhbmQiKSBpZHggKi8KKwkJY2hfaW5mby0+Z3JvdXBfaWR4ID0gaWwzOTQ1X2h3X3JlZ19nZXRfY2hfZ3JwX2lkeChpbCwgY2hfaW5mbyk7CisKKwkJLyogR2V0IHRoaXMgY2hubGdycCdzIHJhdGUtPm1heC9jbGlwLXBvd2VycyB0YWJsZSAqLworCQljbGlwX3B3cnMgPQorCQkgICAgaWwtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2lkeF0uY2xpcF9wb3dlcnM7CisKKwkJLyogY2FsY3VsYXRlIHBvd2VyIGlkeCAqYWRqdXN0bWVudCogdmFsdWUgYWNjb3JkaW5nIHRvCisJCSAqICBkaWZmIGJldHdlZW4gY3VycmVudCB0ZW1wZXJhdHVyZSBhbmQgZmFjdG9yeSB0ZW1wZXJhdHVyZSAqLworCQlkZWx0YV9pZHggPQorCQkgICAgaWwzOTQ1X2h3X3JlZ19hZGp1c3RfcG93ZXJfYnlfdGVtcCh0ZW1wZXJhdHVyZSwKKwkJCQkJCSAgICAgICBlZXByb20tPmdyb3Vwc1tjaF9pbmZvLT4KKwkJCQkJCQkJICAgICAgZ3JvdXBfaWR4XS4KKwkJCQkJCSAgICAgICB0ZW1wZXJhdHVyZSk7CisKKwkJRF9QT1dFUigiRGVsdGEgaWR4IGZvciBjaGFubmVsICVkOiAlZCBbJWRdXG4iLCBjaF9pbmZvLT5jaGFubmVsLAorCQkJZGVsdGFfaWR4LCB0ZW1wZXJhdHVyZSArIElMX1RFTVBfQ09OVkVSVCk7CisKKwkJLyogc2V0IHR4IHBvd2VyIHZhbHVlIGZvciBhbGwgT0ZETSByYXRlcyAqLworCQlmb3IgKHJhdGVfaWR4ID0gMDsgcmF0ZV9pZHggPCBJTF9PRkRNX1JBVEVTOyByYXRlX2lkeCsrKSB7CisJCQlzMzIgdW5pbml0aWFsaXplZF92YXIocG93ZXJfaWR4KTsKKwkJCWludCByYzsKKworCQkJLyogdXNlIGNoYW5uZWwgZ3JvdXAncyBjbGlwLXBvd2VyIHRhYmxlLAorCQkJICogICBidXQgZG9uJ3QgZXhjZWVkIGNoYW5uZWwncyBtYXggcG93ZXIgKi8KKwkJCXM4IHB3ciA9IG1pbihjaF9pbmZvLT5tYXhfcG93ZXJfYXZnLAorCQkJCSAgICAgY2xpcF9wd3JzW3JhdGVfaWR4XSk7CisKKwkJCXB3cl9pbmZvID0gJmNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pZHhdOworCisJCQkvKiBnZXQgYmFzZSAoaS5lLiBhdCBmYWN0b3J5LW1lYXN1cmVkIHRlbXBlcmF0dXJlKQorCQkJICogICAgcG93ZXIgdGFibGUgaWR4IGZvciB0aGlzIHJhdGUncyBwb3dlciAqLworCQkJcmMgPSBpbDM5NDVfaHdfcmVnX2dldF9tYXRjaGVkX3Bvd2VyX2lkeChpbCwgcHdyLAorCQkJCQkJCQkgY2hfaW5mby0+CisJCQkJCQkJCSBncm91cF9pZHgsCisJCQkJCQkJCSAmcG93ZXJfaWR4KTsKKwkJCWlmIChyYykgeworCQkJCUlMX0VSUigiSW52YWxpZCBwb3dlciBpZHhcbiIpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCXB3cl9pbmZvLT5iYXNlX3Bvd2VyX2lkeCA9ICh1OCkgcG93ZXJfaWR4OworCisJCQkvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRlICovCisJCQlwb3dlcl9pZHggKz0gZGVsdGFfaWR4OworCisJCQkvKiBzdGF5IHdpdGhpbiByYW5nZSBvZiBnYWluIHRhYmxlICovCisJCQlwb3dlcl9pZHggPSBpbDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pZHgocG93ZXJfaWR4KTsKKworCQkJLyogZmlsbCAxIE9GRE0gcmF0ZSdzIGlsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gc3RydWN0ICovCisJCQlwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcHdyOworCQkJcHdyX2luZm8tPnBvd2VyX3RhYmxlX2lkeCA9ICh1OCkgcG93ZXJfaWR4OworCQkJcHdyX2luZm8tPnRwYy50eF9nYWluID0KKwkJCSAgICBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcG93ZXJfaWR4XS50eF9nYWluOworCQkJcHdyX2luZm8tPnRwYy5kc3BfYXR0ZW4gPQorCQkJICAgIHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwb3dlcl9pZHhdLmRzcF9hdHRlbjsKKwkJfQorCisJCS8qIHNldCB0eCBwb3dlciBmb3IgQ0NLIHJhdGVzLCBiYXNlZCBvbiBPRkRNIDEyIE1iaXQgc2V0dGluZ3MgKi8KKwkJcHdyX2luZm8gPSAmY2hfaW5mby0+cG93ZXJfaW5mb1tSQVRFXzEyTV9JRFhfVEJMXTsKKwkJcG93ZXIgPSBwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyICsgSUxfQ0NLX0ZST01fT0ZETV9QT1dFUl9ESUZGOworCQlwd3JfaWR4ID0gcHdyX2luZm8tPnBvd2VyX3RhYmxlX2lkeCArIElMX0NDS19GUk9NX09GRE1fSURYX0RJRkY7CisJCWJhc2VfcHdyX2lkeCA9CisJCSAgICBwd3JfaW5mby0+YmFzZV9wb3dlcl9pZHggKyBJTF9DQ0tfRlJPTV9PRkRNX0lEWF9ESUZGOworCisJCS8qIHN0YXkgd2l0aGluIHRhYmxlIHJhbmdlICovCisJCXB3cl9pZHggPSBpbDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pZHgocHdyX2lkeCk7CisJCWdhaW4gPSBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcHdyX2lkeF0udHhfZ2FpbjsKKwkJZHNwX2F0dGVuID0gcG93ZXJfZ2Fpbl90YWJsZVthX2JhbmRdW3B3cl9pZHhdLmRzcF9hdHRlbjsKKworCQkvKiBmaWxsIGVhY2ggQ0NLIHJhdGUncyBpbDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvIHN0cnVjdHVyZQorCQkgKiBOT1RFOiAgQWxsIENDSy1yYXRlIFR4cHdycyBhcmUgdGhlIHNhbWUgZm9yIGEgZ2l2ZW4gY2hubCEKKwkJICogTk9URTogIENDSyByYXRlcyBzdGFydCBhdCBlbmQgb2YgT0ZETSByYXRlcyEgKi8KKwkJZm9yIChyYXRlX2lkeCA9IDA7IHJhdGVfaWR4IDwgSUxfQ0NLX1JBVEVTOyByYXRlX2lkeCsrKSB7CisJCQlwd3JfaW5mbyA9CisJCQkgICAgJmNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pZHggKyBJTF9PRkRNX1JBVEVTXTsKKwkJCXB3cl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwb3dlcjsKKwkJCXB3cl9pbmZvLT5wb3dlcl90YWJsZV9pZHggPSBwd3JfaWR4OworCQkJcHdyX2luZm8tPmJhc2VfcG93ZXJfaWR4ID0gYmFzZV9wd3JfaWR4OworCQkJcHdyX2luZm8tPnRwYy50eF9nYWluID0gZ2FpbjsKKwkJCXB3cl9pbmZvLT50cGMuZHNwX2F0dGVuID0gZHNwX2F0dGVuOworCQl9CisKKwkJLyogc2V0IHNjYW4gdHggcG93ZXIsIDFNYml0IGZvciBDQ0ssIDZNYml0IGZvciBPRkRNICovCisJCWZvciAoc2Nhbl90YmxfaWR4ID0gMDsgc2Nhbl90YmxfaWR4IDwgSUxfTlVNX1NDQU5fUkFURVM7CisJCSAgICAgc2Nhbl90YmxfaWR4KyspIHsKKwkJCXMzMiBhY3R1YWxfaWR4ID0KKwkJCSAgICAoc2Nhbl90YmxfaWR4ID09CisJCQkgICAgIDApID8gUkFURV8xTV9JRFhfVEJMIDogUkFURV82TV9JRFhfVEJMOworCQkJaWwzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlcihpbCwgc2Nhbl90YmxfaWR4LAorCQkJCQkJICAgICBhY3R1YWxfaWR4LCBjbGlwX3B3cnMsCisJCQkJCQkgICAgIGNoX2luZm8sIGFfYmFuZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitpbDM5NDVfaHdfcnhxX3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYzsKKworCWlsX3dyKGlsLCBGSDM5X1JDU1JfQ09ORklHKDApLCAwKTsKKwlyYyA9IGlsX3BvbGxfYml0KGlsLCBGSDM5X1JTU1JfU1RBVFVTLAorCQkJIEZIMzlfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFLCAxMDAwKTsKKwlpZiAocmMgPCAwKQorCQlJTF9FUlIoIkNhbid0IHN0b3AgUnggRE1BLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitpbDM5NDVfaHdfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKQoreworCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7CisKKwlzdHJ1Y3QgaWwzOTQ1X3NoYXJlZCAqc2hhcmVkX2RhdGEgPSBpbC0+XzM5NDUuc2hhcmVkX3ZpcnQ7CisKKwlzaGFyZWRfZGF0YS0+dHhfYmFzZV9wdHJbdHhxX2lkXSA9IGNwdV90b19sZTMyKCh1MzIpIHR4cS0+cS5kbWFfYWRkcik7CisKKwlpbF93cihpbCwgRkgzOV9DQkNDX0NUUkwodHhxX2lkKSwgMCk7CisJaWxfd3IoaWwsIEZIMzlfQ0JDQ19CQVNFKHR4cV9pZCksIDApOworCisJaWxfd3IoaWwsIEZIMzlfVENTUl9DT05GSUcodHhxX2lkKSwKKwkgICAgICBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9SVENfTk9JTlQgfAorCSAgICAgIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9UWEYgfAorCSAgICAgIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfSUZURkQgfAorCSAgICAgIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwgfAorCSAgICAgIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUpOworCisJLyogZmFrZSByZWFkIHRvIGZsdXNoIGFsbCBwcmV2LiB3cml0ZXMgKi8KKwlfaWxfcmQoaWwsIEZIMzlfVFNTUl9DQkJfQkFTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhDTUQgdXRpbHMKKyAqLworc3RhdGljIHUxNgoraWwzOTQ1X2dldF9oY21kX3NpemUodTggY21kX2lkLCB1MTYgbGVuKQoreworCXN3aXRjaCAoY21kX2lkKSB7CisJY2FzZSBDX1JYT046CisJCXJldHVybiBzaXplb2Yoc3RydWN0IGlsMzk0NV9yeG9uX2NtZCk7CisJY2FzZSBDX1BPV0VSX1RCTDoKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3Bvd2VydGFibGVfY21kKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gbGVuOworCX0KK30KKworc3RhdGljIHUxNgoraWwzOTQ1X2J1aWxkX2FkZHN0YV9oY21kKGNvbnN0IHN0cnVjdCBpbF9hZGRzdGFfY21kICpjbWQsIHU4ICogZGF0YSkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2FkZHN0YV9jbWQgKmFkZHN0YSA9IChzdHJ1Y3QgaWwzOTQ1X2FkZHN0YV9jbWQgKilkYXRhOworCWFkZHN0YS0+bW9kZSA9IGNtZC0+bW9kZTsKKwltZW1jcHkoJmFkZHN0YS0+c3RhLCAmY21kLT5zdGEsIHNpemVvZihzdHJ1Y3Qgc3RhX2lkX21vZGlmeSkpOworCW1lbWNweSgmYWRkc3RhLT5rZXksICZjbWQtPmtleSwgc2l6ZW9mKHN0cnVjdCBpbDQ5NjVfa2V5aW5mbykpOworCWFkZHN0YS0+c3RhdGlvbl9mbGFncyA9IGNtZC0+c3RhdGlvbl9mbGFnczsKKwlhZGRzdGEtPnN0YXRpb25fZmxhZ3NfbXNrID0gY21kLT5zdGF0aW9uX2ZsYWdzX21zazsKKwlhZGRzdGEtPnRpZF9kaXNhYmxlX3R4ID0gY3B1X3RvX2xlMTYoMCk7CisJYWRkc3RhLT5yYXRlX25fZmxhZ3MgPSBjbWQtPnJhdGVfbl9mbGFnczsKKwlhZGRzdGEtPmFkZF9pbW1lZGlhdGVfYmFfdGlkID0gY21kLT5hZGRfaW1tZWRpYXRlX2JhX3RpZDsKKwlhZGRzdGEtPnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkID0gY21kLT5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZDsKKwlhZGRzdGEtPmFkZF9pbW1lZGlhdGVfYmFfc3NuID0gY21kLT5hZGRfaW1tZWRpYXRlX2JhX3NzbjsKKworCXJldHVybiAodTE2KSBzaXplb2Yoc3RydWN0IGlsMzk0NV9hZGRzdGFfY21kKTsKK30KKworc3RhdGljIGludAoraWwzOTQ1X2FkZF9ic3NpZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggKiBhZGRyLCB1OCAqIHN0YV9pZF9yKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCWludCByZXQ7CisJdTggc3RhX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc3RhX2lkX3IpCisJCSpzdGFfaWRfciA9IElMX0lOVkFMSURfU1RBVElPTjsKKworCXJldCA9IGlsX2FkZF9zdGF0aW9uX2NvbW1vbihpbCwgY3R4LCBhZGRyLCAwLCBOVUxMLCAmc3RhX2lkKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwgYWRkcik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHN0YV9pZF9yKQorCQkqc3RhX2lkX3IgPSBzdGFfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfTE9DQUw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X21hbmFnZV9pYnNzX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgYm9vbCBhZGQpCit7CisJc3RydWN0IGlsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlpbnQgcmV0OworCisJaWYgKGFkZCkgeworCQlyZXQgPQorCQkgICAgaWwzOTQ1X2FkZF9ic3NpZF9zdGF0aW9uKGlsLCB2aWYtPmJzc19jb25mLmJzc2lkLAorCQkJCQkgICAgICZ2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpbDM5NDVfc3luY19zdGEoaWwsIHZpZl9wcml2LT5pYnNzX2Jzc2lkX3N0YV9pZCwKKwkJCQkoaWwtPmJhbmQgPT0KKwkJCQkgSUVFRTgwMjExX0JBTkRfNUdIWikgPyBSQVRFXzZNX1BMQ1AgOgorCQkJCVJBVEVfMU1fUExDUCk7CisJCWlsMzk0NV9yYXRlX3NjYWxlX2luaXQoaWwtPmh3LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOworCisJCXJldHVybiAwOworCX0KKworCXJldHVybiBpbF9yZW1vdmVfc3RhdGlvbihpbCwgdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkLAorCQkJCSB2aWYtPmJzc19jb25mLmJzc2lkKTsKK30KKworLyoqCisgKiBpbDM5NDVfaW5pdF9od19yYXRlX3RhYmxlIC0gSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgcmF0ZSBmYWxsYmFjayB0YWJsZQorICovCitpbnQKK2lsMzk0NV9pbml0X2h3X3JhdGVfdGFibGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYywgaSwgaWR4LCBwcmV2X2lkeDsKKwlzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGluZ19jbWQgcmF0ZV9jbWQgPSB7CisJCS5yZXNlcnZlZCA9IHswLCAwLCAwfSwKKwl9OworCXN0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsaW5nX2luZm8gKnRhYmxlID0gcmF0ZV9jbWQudGFibGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbDM5NDVfcmF0ZXMpOyBpKyspIHsKKwkJaWR4ID0gaWwzOTQ1X3JhdGVzW2ldLnRhYmxlX3JzX2lkeDsKKworCQl0YWJsZVtpZHhdLnJhdGVfbl9mbGFncyA9CisJCSAgICBpbDM5NDVfaHdfc2V0X3JhdGVfbl9mbGFncyhpbDM5NDVfcmF0ZXNbaV0ucGxjcCwgMCk7CisJCXRhYmxlW2lkeF0udHJ5X2NudCA9IGlsLT5yZXRyeV9yYXRlOworCQlwcmV2X2lkeCA9IGlsMzk0NV9nZXRfcHJldl9pZWVlX3JhdGUoaSk7CisJCXRhYmxlW2lkeF0ubmV4dF9yYXRlX2lkeCA9IGlsMzk0NV9yYXRlc1twcmV2X2lkeF0udGFibGVfcnNfaWR4OworCX0KKworCXN3aXRjaCAoaWwtPmJhbmQpIHsKKwljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6CisJCURfUkFURSgiU2VsZWN0IEEgbW9kZSByYXRlIHNjYWxlXG4iKTsKKwkJLyogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgQ0NLIHJhdGVzIGlzIHVzZWQsCisJCSAqIGhhdmUgaXQgZmFsbCBiYWNrIHRvIHRoZSA2TSBPRkRNIHJhdGUgKi8KKwkJZm9yIChpID0gUkFURV8xTV9JRFhfVEJMOyBpIDw9IFJBVEVfMTFNX0lEWF9UQkw7IGkrKykKKwkJCXRhYmxlW2ldLm5leHRfcmF0ZV9pZHggPQorCQkJICAgIGlsMzk0NV9yYXRlc1tJTF9GSVJTVF9PRkRNX1JBVEVdLnRhYmxlX3JzX2lkeDsKKworCQkvKiBEb24ndCBmYWxsIGJhY2sgdG8gQ0NLIHJhdGVzICovCisJCXRhYmxlW1JBVEVfMTJNX0lEWF9UQkxdLm5leHRfcmF0ZV9pZHggPSBSQVRFXzlNX0lEWF9UQkw7CisKKwkJLyogRG9uJ3QgZHJvcCBvdXQgb2YgT0ZETSByYXRlcyAqLworCQl0YWJsZVtSQVRFXzZNX0lEWF9UQkxdLm5leHRfcmF0ZV9pZHggPQorCQkgICAgaWwzOTQ1X3JhdGVzW0lMX0ZJUlNUX09GRE1fUkFURV0udGFibGVfcnNfaWR4OworCQlicmVhazsKKworCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJRF9SQVRFKCJTZWxlY3QgQi9HIG1vZGUgcmF0ZSBzY2FsZVxuIik7CisJCS8qIElmIGFuIE9GRE0gcmF0ZSBpcyB1c2VkLCBoYXZlIGl0IGZhbGwgYmFjayB0byB0aGUKKwkJICogMU0gQ0NLIHJhdGVzICovCisKKwkJaWYgKCEoaWwtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzICYgSUxfT0ZETV9SQVRFU19NQVNLKSAmJgorCQkgICAgaWxfaXNfYXNzb2NpYXRlZChpbCkpIHsKKworCQkJaWR4ID0gSUxfRklSU1RfQ0NLX1JBVEU7CisJCQlmb3IgKGkgPSBSQVRFXzZNX0lEWF9UQkw7IGkgPD0gUkFURV81NE1fSURYX1RCTDsgaSsrKQorCQkJCXRhYmxlW2ldLm5leHRfcmF0ZV9pZHggPQorCQkJCSAgICBpbDM5NDVfcmF0ZXNbaWR4XS50YWJsZV9yc19pZHg7CisKKwkJCWlkeCA9IFJBVEVfMTFNX0lEWF9UQkw7CisJCQkvKiBDQ0sgc2hvdWxkbid0IGZhbGwgYmFjayB0byBPRkRNLi4uICovCisJCQl0YWJsZVtpZHhdLm5leHRfcmF0ZV9pZHggPSBSQVRFXzVNX0lEWF9UQkw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlicmVhazsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIHJhdGUgc2NhbGluZyBmb3IgY29udHJvbCBmcmFtZSBUeCAqLworCXJhdGVfY21kLnRhYmxlX2lkID0gMDsKKwlyYyA9IGlsX3NlbmRfY21kX3BkdShpbCwgQ19SQVRFX1NDQUxFLCBzaXplb2YocmF0ZV9jbWQpLCAmcmF0ZV9jbWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogVXBkYXRlIHRoZSByYXRlIHNjYWxpbmcgZm9yIGRhdGEgZnJhbWUgVHggKi8KKwlyYXRlX2NtZC50YWJsZV9pZCA9IDE7CisJcmV0dXJuIGlsX3NlbmRfY21kX3BkdShpbCwgQ19SQVRFX1NDQUxFLCBzaXplb2YocmF0ZV9jbWQpLCAmcmF0ZV9jbWQpOworfQorCisvKiBDYWxsZWQgd2hlbiBpbml0aWFsaXppbmcgZHJpdmVyICovCitpbnQKK2lsMzk0NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwltZW1zZXQoKHZvaWQgKikmaWwtPmh3X3BhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCBpbF9od19wYXJhbXMpKTsKKworCWlsLT5fMzk0NS5zaGFyZWRfdmlydCA9CisJICAgIGRtYV9hbGxvY19jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBpbDM5NDVfc2hhcmVkKSwKKwkJCSAgICAgICAmaWwtPl8zOTQ1LnNoYXJlZF9waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlsLT5fMzk0NS5zaGFyZWRfdmlydCkgeworCQlJTF9FUlIoImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogQXNzaWduIG51bWJlciBvZiBVc2FibGUgVFggcXVldWVzICovCisJaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bSA9IGlsLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOworCisJaWwtPmh3X3BhcmFtcy50ZmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3RmZCk7CisJaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID0gZ2V0X29yZGVyKElMX1JYX0JVRl9TSVpFXzNLKTsKKwlpbC0+aHdfcGFyYW1zLm1heF9yeHFfc2l6ZSA9IFJYX1FVRVVFX1NJWkU7CisJaWwtPmh3X3BhcmFtcy5tYXhfcnhxX2xvZyA9IFJYX1FVRVVFX1NJWkVfTE9HOworCWlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zID0gSUwzOTQ1X1NUQVRJT05fQ09VTlQ7CisJaWwtPmN0eC5iY2FzdF9zdGFfaWQgPSBJTDM5NDVfQlJPQURDQVNUX0lEOworCisJaWwtPnN0YV9rZXlfbWF4X251bSA9IFNUQV9LRVlfTUFYX05VTTsKKworCWlsLT5od19wYXJhbXMucnhfd3J0X3B0cl9yZWcgPSBGSDM5X1JTQ1NSX0NITkwwX1dQVFI7CisJaWwtPmh3X3BhcmFtcy5tYXhfYmVhY29uX2l0cnZsID0gSUwzOV9NQVhfVUNPREVfQkVBQ09OX0lOVEVSVkFMOworCWlsLT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMgPSBJTDM5NDVfRVhUX0JFQUNPTl9USU1FX1BPUzsKKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQKK2lsMzk0NV9od19nZXRfYmVhY29uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbDM5NDVfZnJhbWUgKmZyYW1lLAorCQkJIHU4IHJhdGUpCit7CisJc3RydWN0IGlsMzk0NV90eF9iZWFjb25fY21kICp0eF9iZWFjb25fY21kOworCXVuc2lnbmVkIGludCBmcmFtZV9zaXplOworCisJdHhfYmVhY29uX2NtZCA9IChzdHJ1Y3QgaWwzOTQ1X3R4X2JlYWNvbl9jbWQgKikmZnJhbWUtPnU7CisJbWVtc2V0KHR4X2JlYWNvbl9jbWQsIDAsIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOworCisJdHhfYmVhY29uX2NtZC0+dHguc3RhX2lkID0gaWwtPmN0eC5iY2FzdF9zdGFfaWQ7CisJdHhfYmVhY29uX2NtZC0+dHguc3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7CisKKwlmcmFtZV9zaXplID0KKwkgICAgaWwzOTQ1X2ZpbGxfYmVhY29uX2ZyYW1lKGlsLCB0eF9iZWFjb25fY21kLT5mcmFtZSwKKwkJCQkgICAgIHNpemVvZihmcmFtZS0+dSkgLSBzaXplb2YoKnR4X2JlYWNvbl9jbWQpKTsKKworCUJVR19PTihmcmFtZV9zaXplID4gTUFYX01QRFVfU0laRSk7CisJdHhfYmVhY29uX2NtZC0+dHgubGVuID0gY3B1X3RvX2xlMTYoKHUxNikgZnJhbWVfc2l6ZSk7CisKKwl0eF9iZWFjb25fY21kLT50eC5yYXRlID0gcmF0ZTsKKwl0eF9iZWFjb25fY21kLT50eC50eF9mbGFncyA9CisJICAgIChUWF9DTURfRkxHX1NFUV9DVExfTVNLIHwgVFhfQ01EX0ZMR19UU0ZfTVNLKTsKKworCS8qIHN1cHBfcmF0ZXNbMF0gPT0gT0ZETSBzdGFydCBhdCBJTF9GSVJTVF9PRkRNX1JBVEUgKi8KKwl0eF9iZWFjb25fY21kLT50eC5zdXBwX3JhdGVzWzBdID0KKwkgICAgKElMX09GRE1fQkFTSUNfUkFURVNfTUFTSyA+PiBJTF9GSVJTVF9PRkRNX1JBVEUpICYgMHhGRjsKKworCXR4X2JlYWNvbl9jbWQtPnR4LnN1cHBfcmF0ZXNbMV0gPSAoSUxfQ0NLX0JBU0lDX1JBVEVTX01BU0sgJiAweEYpOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3R4X2JlYWNvbl9jbWQpICsgZnJhbWVfc2l6ZTsKK30KKwordm9pZAoraWwzOTQ1X2h3X2hhbmRsZXJfc2V0dXAoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT5oYW5kbGVyc1tDX1RYXSA9IGlsMzk0NV9oZGxfdHg7CisJaWwtPmhhbmRsZXJzW05fMzk0NV9SWF0gPSBpbDM5NDVfaGRsX3J4OworfQorCit2b2lkCitpbDM5NDVfaHdfc2V0dXBfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJSU5JVF9ERUxBWUVEX1dPUksoJmlsLT5fMzk0NS50aGVybWFsX3BlcmlvZGljLAorCQkJICBpbDM5NDVfYmdfcmVnX3R4cG93ZXJfcGVyaW9kaWMpOworfQorCit2b2lkCitpbDM5NDVfaHdfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5fMzk0NS50aGVybWFsX3BlcmlvZGljKTsKK30KKworLyogY2hlY2sgY29udGVudHMgb2Ygc3BlY2lhbCBib290c3RyYXAgdUNvZGUgU1JBTSAqLworc3RhdGljIGludAoraWwzOTQ1X3ZlcmlmeV9ic20oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9fbGUzMiAqaW1hZ2UgPSBpbC0+dWNvZGVfYm9vdC52X2FkZHI7CisJdTMyIGxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwl1MzIgcmVnOworCXUzMiB2YWw7CisKKwlEX0lORk8oIkJlZ2luIHZlcmlmeSBic21cbiIpOworCisJLyogdmVyaWZ5IEJTTSBTUkFNIGNvbnRlbnRzICovCisJdmFsID0gaWxfcmRfcHJwaChpbCwgQlNNX1dSX0RXQ09VTlRfUkVHKTsKKwlmb3IgKHJlZyA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOyByZWcgPCBCU01fU1JBTV9MT1dFUl9CT1VORCArIGxlbjsKKwkgICAgIHJlZyArPSBzaXplb2YodTMyKSwgaW1hZ2UrKykgeworCQl2YWwgPSBpbF9yZF9wcnBoKGlsLCByZWcpOworCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpIHsKKwkJCUlMX0VSUigiQlNNIHVDb2RlIHZlcmlmaWNhdGlvbiBmYWlsZWQgYXQgIgorCQkJICAgICAgICJhZGRyIDB4JTA4WCsldSAob2YgJXUpLCBpcyAweCV4LCBzL2IgMHgleFxuIiwKKwkJCSAgICAgICBCU01fU1JBTV9MT1dFUl9CT1VORCwgcmVnIC0gQlNNX1NSQU1fTE9XRVJfQk9VTkQsCisJCQkgICAgICAgbGVuLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlEX0lORk8oIkJTTSBib290c3RyYXAgdUNvZGUgaW1hZ2UgT0tcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFRVBST00gcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ2xlYXIgdGhlIE9XTkVSX01TSywgdG8gZXN0YWJsaXNoIGRyaXZlciAoaW5zdGVhZCBvZiB1Q29kZSBydW5uaW5nIG9uCisgKiBlbWJlZGRlZCBjb250cm9sbGVyKSBhcyBFRVBST00gcmVhZGVyOyBlYWNoIHJlYWQgaXMgYSBzZXJpZXMgb2YgcHVsc2VzCisgKiB0by9mcm9tIHRoZSBFRVBST00gY2hpcCwgbm90IGEgc2luZ2xlIGV2ZW50LCBzbyBldmVuIHJlYWRzIGNvdWxkIGNvbmZsaWN0CisgKiBpZiB0aGV5IHdlcmVuJ3QgYXJiaXRyYXRlZCBieSBzb21lIG93bmVyc2hpcCBtZWNoYW5pc20uICBIZXJlLCB0aGUgZHJpdmVyCisgKiBzaW1wbHkgY2xhaW1zIG93bmVyc2hpcCwgd2hpY2ggc2hvdWxkIGJlIHNhZmUgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogKGkuZS4gYmVmb3JlIGxvYWRpbmcgdUNvZGUhKS4KKyAqLworc3RhdGljIGludAoraWwzOTQ1X2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX2lsX2NsZWFyX2JpdChpbCwgQ1NSX0VFUFJPTV9HUCwgQ1NSX0VFUFJPTV9HUF9JRl9PV05FUl9NU0spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJcmV0dXJuOworfQorCisgLyoqCisgICogaWwzOTQ1X2xvYWRfYnNtIC0gTG9hZCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zCisgICoKKyAgKiBCU00gb3BlcmF0aW9uOgorICAqCisgICogVGhlIEJvb3RzdHJhcCBTdGF0ZSBNYWNoaW5lIChCU00pIHN0b3JlcyBhIHNob3J0IGJvb3RzdHJhcCB1Q29kZSBwcm9ncmFtCisgICogaW4gc3BlY2lhbCBTUkFNIHRoYXQgZG9lcyBub3QgcG93ZXIgZG93biBkdXJpbmcgUkZLSUxMLiAgV2hlbiBwb3dlcmluZyBiYWNrCisgICogdXAgYWZ0ZXIgcG93ZXItc2F2aW5nIHNsZWVwcyAob3IgZHVyaW5nIGluaXRpYWwgdUNvZGUgbG9hZCksIHRoZSBCU00gbG9hZHMKKyAgKiB0aGUgYm9vdHN0cmFwIHByb2dyYW0gaW50byB0aGUgb24tYm9hcmQgcHJvY2Vzc29yLCBhbmQgc3RhcnRzIGl0LgorICAqCisgICogVGhlIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzICh2aWEgRE1BKSBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgZm9yIGEgbmV3CisgICogcHJvZ3JhbSBmcm9tIGhvc3QgRFJBTSBsb2NhdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSBob3N0IGRyaXZlciBpbiB0aGUKKyAgKiBCU01fRFJBTV8qIHJlZ2lzdGVycy4gIE9uY2UgdGhlIG5ldyBwcm9ncmFtIGlzIGxvYWRlZCwgaXQgc3RhcnRzCisgICogYXV0b21hdGljYWxseS4KKyAgKgorICAqIFdoZW4gaW5pdGlhbGl6aW5nIHRoZSBOSUMsIHRoZSBob3N0IGRyaXZlciBwb2ludHMgdGhlIEJTTSB0byB0aGUKKyAgKiAiaW5pdGlhbGl6ZSIgdUNvZGUgaW1hZ2UuICBUaGlzIHVDb2RlIHNldHMgdXAgc29tZSBpbnRlcm5hbCBkYXRhLCB0aGVuCisgICogbm90aWZpZXMgaG9zdCB2aWEgImluaXRpYWxpemUgYWxpdmUiIHRoYXQgaXQgaXMgY29tcGxldGUuCisgICoKKyAgKiBUaGUgaG9zdCB0aGVuIHJlcGxhY2VzIHRoZSBCU01fRFJBTV8qIHBvaW50ZXIgdmFsdWVzIHRvIHBvaW50IHRvIHRoZQorICAqIG5vcm1hbCBydW50aW1lIHVDb2RlIGluc3RydWN0aW9ucyBhbmQgYSBiYWNrdXAgdUNvZGUgZGF0YSBjYWNoZSBidWZmZXIKKyAgKiAoZmlsbGVkIGluaXRpYWxseSB3aXRoIHN0YXJ0aW5nIGRhdGEgdmFsdWVzIGZvciB0aGUgb24tYm9hcmQgcHJvY2Vzc29yKSwKKyAgKiB0aGVuIHRyaWdnZXJzIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gbG9hZCBhbmQgbGF1bmNoIHRoZSBydW50aW1lIHVDb2RlLAorICAqIHdoaWNoIGJlZ2lucyBub3JtYWwgb3BlcmF0aW9uLgorICAqCisgICogV2hlbiBkb2luZyBhIHBvd2VyLXNhdmUgc2h1dGRvd24sIHJ1bnRpbWUgdUNvZGUgc2F2ZXMgZGF0YSBTUkFNIGludG8KKyAgKiB0aGUgYmFja3VwIGRhdGEgY2FjaGUgaW4gRFJBTSBiZWZvcmUgU1JBTSBpcyBwb3dlcmVkIGRvd24uCisgICoKKyAgKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgVGhpcyByZWxvYWRzCisgICogdGhlIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgYmFja3VwIGRhdGEgY2FjaGUgaW50byBTUkFNLAorICAqIGFuZCByZS1sYXVuY2hlcyB0aGUgcnVudGltZSB1Q29kZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLgorICAqLworc3RhdGljIGludAoraWwzOTQ1X2xvYWRfYnNtKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfX2xlMzIgKmltYWdlID0gaWwtPnVjb2RlX2Jvb3Qudl9hZGRyOworCXUzMiBsZW4gPSBpbC0+dWNvZGVfYm9vdC5sZW47CisJZG1hX2FkZHJfdCBwaW5zdDsKKwlkbWFfYWRkcl90IHBkYXRhOworCXUzMiBpbnN0X2xlbjsKKwl1MzIgZGF0YV9sZW47CisJaW50IHJjOworCWludCBpOworCXUzMiBkb25lOworCXUzMiByZWdfb2Zmc2V0OworCisJRF9JTkZPKCJCZWdpbiBsb2FkIGJzbVxuIik7CisKKwkvKiBtYWtlIHN1cmUgYm9vdHN0cmFwIHByb2dyYW0gaXMgbm8gbGFyZ2VyIHRoYW4gQlNNJ3MgU1JBTSBzaXplICovCisJaWYgKGxlbiA+IElMMzlfTUFYX0JTTV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRlbGwgYm9vdHN0cmFwIHVDb2RlIHdoZXJlIHRvIGZpbmQgdGhlICJJbml0aWFsaXplIiB1Q29kZQorCSAqICAgaW4gaG9zdCBEUkFNIC4uLiBob3N0IERSQU0gcGh5c2ljYWwgYWRkcmVzcyBiaXRzIDMxOjAgZm9yIDM5NDUuCisJICogTk9URTogIGlsMzk0NV9pbml0aWFsaXplX2FsaXZlX3N0YXJ0KCkgd2lsbCByZXBsYWNlIHRoZXNlIHZhbHVlcywKKwkgKiAgICAgICAgYWZ0ZXIgdGhlICJpbml0aWFsaXplIiB1Q29kZSBoYXMgcnVuLCB0byBwb2ludCB0bworCSAqICAgICAgICBydW50aW1lL3Byb3RvY29sIGluc3RydWN0aW9ucyBhbmQgYmFja3VwIGRhdGEgY2FjaGUuICovCisJcGluc3QgPSBpbC0+dWNvZGVfaW5pdC5wX2FkZHI7CisJcGRhdGEgPSBpbC0+dWNvZGVfaW5pdF9kYXRhLnBfYWRkcjsKKwlpbnN0X2xlbiA9IGlsLT51Y29kZV9pbml0LmxlbjsKKwlkYXRhX2xlbiA9IGlsLT51Y29kZV9pbml0X2RhdGEubGVuOworCisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7CisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fREFUQV9QVFJfUkVHLCBwZGF0YSk7CisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fSU5TVF9CWVRFQ09VTlRfUkVHLCBpbnN0X2xlbik7CisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLCBkYXRhX2xlbik7CisKKwkvKiBGaWxsIEJTTSBtZW1vcnkgd2l0aCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zICovCisJZm9yIChyZWdfb2Zmc2V0ID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7CisJICAgICByZWdfb2Zmc2V0IDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47CisJICAgICByZWdfb2Zmc2V0ICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKQorCQlfaWxfd3JfcHJwaChpbCwgcmVnX29mZnNldCwgbGUzMl90b19jcHUoKmltYWdlKSk7CisKKwlyYyA9IGlsMzk0NV92ZXJpZnlfYnNtKGlsKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIFRlbGwgQlNNIHRvIGNvcHkgZnJvbSBCU00gU1JBTSBpbnRvIGluc3RydWN0aW9uIFNSQU0sIHdoZW4gYXNrZWQgKi8KKwlpbF93cl9wcnBoKGlsLCBCU01fV1JfTUVNX1NSQ19SRUcsIDB4MCk7CisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX01FTV9EU1RfUkVHLCBJTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fV1JfRFdDT1VOVF9SRUcsIGxlbiAvIHNpemVvZih1MzIpKTsKKworCS8qIExvYWQgYm9vdHN0cmFwIGNvZGUgaW50byBpbnN0cnVjdGlvbiBTUkFNIG5vdywKKwkgKiAgIHRvIHByZXBhcmUgdG8gbG9hZCAiaW5pdGlhbGl6ZSIgdUNvZGUgKi8KKwlpbF93cl9wcnBoKGlsLCBCU01fV1JfQ1RSTF9SRUcsIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQpOworCisJLyogV2FpdCBmb3IgbG9hZCBvZiBib290c3RyYXAgdUNvZGUgdG8gZmluaXNoICovCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCWRvbmUgPSBpbF9yZF9wcnBoKGlsLCBCU01fV1JfQ1RSTF9SRUcpOworCQlpZiAoIShkb25lICYgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGkgPCAxMDApCisJCURfSU5GTygiQlNNIHdyaXRlIGNvbXBsZXRlLCBwb2xsICVkIGl0ZXJhdGlvbnNcbiIsIGkpOworCWVsc2UgeworCQlJTF9FUlIoIkJTTSB3cml0ZSBkaWQgbm90IGNvbXBsZXRlIVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIEVuYWJsZSBmdXR1cmUgYm9vdCBsb2FkcyB3aGVuZXZlciBwb3dlciBtYW5hZ2VtZW50IHVuaXQgdHJpZ2dlcnMgaXQKKwkgKiAgIChlLmcuIHdoZW4gcG93ZXJpbmcgYmFjayB1cCBhZnRlciBwb3dlci1zYXZlIHNodXRkb3duKSAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9DVFJMX1JFRywgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpbF9oY21kX29wcyBpbDM5NDVfaGNtZCA9IHsKKwkucnhvbl9hc3NvYyA9IGlsMzk0NV9zZW5kX3J4b25fYXNzb2MsCisJLmNvbW1pdF9yeG9uID0gaWwzOTQ1X2NvbW1pdF9yeG9uLAorfTsKKworc3RhdGljIHN0cnVjdCBpbF9saWJfb3BzIGlsMzk0NV9saWIgPSB7CisJLnR4cV9hdHRhY2hfYnVmX3RvX3RmZCA9IGlsMzk0NV9od190eHFfYXR0YWNoX2J1Zl90b190ZmQsCisJLnR4cV9mcmVlX3RmZCA9IGlsMzk0NV9od190eHFfZnJlZV90ZmQsCisJLnR4cV9pbml0ID0gaWwzOTQ1X2h3X3R4X3F1ZXVlX2luaXQsCisJLmxvYWRfdWNvZGUgPSBpbDM5NDVfbG9hZF9ic20sCisJLmR1bXBfbmljX2Vycm9yX2xvZyA9IGlsMzk0NV9kdW1wX25pY19lcnJvcl9sb2csCisJLmFwbV9vcHMgPSB7CisJCSAgICAuaW5pdCA9IGlsMzk0NV9hcG1faW5pdCwKKwkJICAgIC5jb25maWcgPSBpbDM5NDVfbmljX2NvbmZpZywKKwkJICAgIH0sCisJLmVlcHJvbV9vcHMgPSB7CisJCSAgICAgICAucmVndWxhdG9yeV9iYW5kcyA9IHsKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMV9DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMl9DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfM19DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNF9DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCwKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCwKKwkJCQkJICAgIH0sCisJCSAgICAgICAuYWNxdWlyZV9zZW1hcGhvcmUgPSBpbDM5NDVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlLAorCQkgICAgICAgLnJlbGVhc2Vfc2VtYXBob3JlID0gaWwzOTQ1X2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZSwKKwkJICAgICAgIH0sCisJLnNlbmRfdHhfcG93ZXIgPSBpbDM5NDVfc2VuZF90eF9wb3dlciwKKwkuaXNfdmFsaWRfcnRjX2RhdGFfYWRkciA9IGlsMzk0NV9od192YWxpZF9ydGNfZGF0YV9hZGRyLAorCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwkuZGVidWdmc19vcHMgPSB7CisJCQkucnhfc3RhdHNfcmVhZCA9IGlsMzk0NV91Y29kZV9yeF9zdGF0c19yZWFkLAorCQkJLnR4X3N0YXRzX3JlYWQgPSBpbDM5NDVfdWNvZGVfdHhfc3RhdHNfcmVhZCwKKwkJCS5nZW5lcmFsX3N0YXRzX3JlYWQgPSBpbDM5NDVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkLAorCQkJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9sZWdhY3lfb3BzIGlsMzk0NV9sZWdhY3lfb3BzID0geworCS5wb3N0X2Fzc29jaWF0ZSA9IGlsMzk0NV9wb3N0X2Fzc29jaWF0ZSwKKwkuY29uZmlnX2FwID0gaWwzOTQ1X2NvbmZpZ19hcCwKKwkubWFuYWdlX2lic3Nfc3RhdGlvbiA9IGlsMzk0NV9tYW5hZ2VfaWJzc19zdGF0aW9uLAorfTsKKworc3RhdGljIHN0cnVjdCBpbF9oY21kX3V0aWxzX29wcyBpbDM5NDVfaGNtZF91dGlscyA9IHsKKwkuZ2V0X2hjbWRfc2l6ZSA9IGlsMzk0NV9nZXRfaGNtZF9zaXplLAorCS5idWlsZF9hZGRzdGFfaGNtZCA9IGlsMzk0NV9idWlsZF9hZGRzdGFfaGNtZCwKKwkucmVxdWVzdF9zY2FuID0gaWwzOTQ1X3JlcXVlc3Rfc2NhbiwKKwkucG9zdF9zY2FuID0gaWwzOTQ1X3Bvc3Rfc2NhbiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWxfb3BzIGlsMzk0NV9vcHMgPSB7CisJLmxpYiA9ICZpbDM5NDVfbGliLAorCS5oY21kID0gJmlsMzk0NV9oY21kLAorCS51dGlscyA9ICZpbDM5NDVfaGNtZF91dGlscywKKwkubGVkID0gJmlsMzk0NV9sZWRfb3BzLAorCS5sZWdhY3kgPSAmaWwzOTQ1X2xlZ2FjeV9vcHMsCisJLmllZWU4MDIxMV9vcHMgPSAmaWwzOTQ1X2h3X29wcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWxfYmFzZV9wYXJhbXMgaWwzOTQ1X2Jhc2VfcGFyYW1zID0geworCS5lZXByb21fc2l6ZSA9IElMMzk0NV9FRVBST01fSU1HX1NJWkUsCisJLm51bV9vZl9xdWV1ZXMgPSBJTDM5X05VTV9RVUVVRVMsCisJLnBsbF9jZmdfdmFsID0gQ1NSMzlfQU5BX1BMTF9DRkdfVkFMLAorCS5zZXRfbDBzID0gZmFsc2UsCisJLnVzZV9ic20gPSB0cnVlLAorCS5sZWRfY29tcGVuc2F0aW9uID0gNjQsCisJLndkX3RpbWVvdXQgPSBJTF9ERUZfV0RfVElNRU9VVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWxfY2ZnIGlsMzk0NV9iZ19jZmcgPSB7CisJLm5hbWUgPSAiMzk0NUJHIiwKKwkuZndfbmFtZV9wcmUgPSBJTDM5NDVfRldfUFJFLAorCS51Y29kZV9hcGlfbWF4ID0gSUwzOTQ1X1VDT0RFX0FQSV9NQVgsCisJLnVjb2RlX2FwaV9taW4gPSBJTDM5NDVfVUNPREVfQVBJX01JTiwKKwkuc2t1ID0gSUxfU0tVX0csCisJLmVlcHJvbV92ZXIgPSBFRVBST01fMzk0NV9FRVBST01fVkVSU0lPTiwKKwkub3BzID0gJmlsMzk0NV9vcHMsCisJLm1vZF9wYXJhbXMgPSAmaWwzOTQ1X21vZF9wYXJhbXMsCisJLmJhc2VfcGFyYW1zID0gJmlsMzk0NV9iYXNlX3BhcmFtcywKKwkubGVkX21vZGUgPSBJTF9MRURfQkxJTkssCit9OworCitzdGF0aWMgc3RydWN0IGlsX2NmZyBpbDM5NDVfYWJnX2NmZyA9IHsKKwkubmFtZSA9ICIzOTQ1QUJHIiwKKwkuZndfbmFtZV9wcmUgPSBJTDM5NDVfRldfUFJFLAorCS51Y29kZV9hcGlfbWF4ID0gSUwzOTQ1X1VDT0RFX0FQSV9NQVgsCisJLnVjb2RlX2FwaV9taW4gPSBJTDM5NDVfVUNPREVfQVBJX01JTiwKKwkuc2t1ID0gSUxfU0tVX0EgfCBJTF9TS1VfRywKKwkuZWVwcm9tX3ZlciA9IEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OLAorCS5vcHMgPSAmaWwzOTQ1X29wcywKKwkubW9kX3BhcmFtcyA9ICZpbDM5NDVfbW9kX3BhcmFtcywKKwkuYmFzZV9wYXJhbXMgPSAmaWwzOTQ1X2Jhc2VfcGFyYW1zLAorCS5sZWRfbW9kZSA9IElMX0xFRF9CTElOSywKK307CisKK0RFRklORV9QQ0lfREVWSUNFX1RBQkxFKGlsMzk0NV9od19jYXJkX2lkcykgPSB7CisJe0lMX1BDSV9ERVZJQ0UoMHg0MjIyLCAweDEwMDUsIGlsMzk0NV9iZ19jZmcpfSwKKwl7SUxfUENJX0RFVklDRSgweDQyMjIsIDB4MTAzNCwgaWwzOTQ1X2JnX2NmZyl9LAorCXtJTF9QQ0lfREVWSUNFKDB4NDIyMiwgMHgxMDQ0LCBpbDM5NDVfYmdfY2ZnKX0sCisJe0lMX1BDSV9ERVZJQ0UoMHg0MjI3LCAweDEwMTQsIGlsMzk0NV9iZ19jZmcpfSwKKwl7SUxfUENJX0RFVklDRSgweDQyMjIsIFBDSV9BTllfSUQsIGlsMzk0NV9hYmdfY2ZnKX0sCisJe0lMX1BDSV9ERVZJQ0UoMHg0MjI3LCBQQ0lfQU5ZX0lELCBpbDM5NDVfYWJnX2NmZyl9LAorCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlsMzk0NV9od19jYXJkX2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyODk1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUuaApAQCAtMCwwICsxLDYyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19pbF8zOTQ1X2hfXworI2RlZmluZSBfX2lsXzM5NDVfaF9fCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4JCS8qIGZvciBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KKworLyogSGFyZHdhcmUgc3BlY2lmaWMgZmlsZSBkZWZpbmVzIHRoZSBQQ0kgSURzIHRhYmxlIGZvciB0aGF0IGhhcmR3YXJlIG1vZHVsZSAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlsMzk0NV9od19jYXJkX2lkc1tdOworCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIElMMzk0NV9VQ09ERV9BUElfTUFYIDIKKworLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLworI2RlZmluZSBJTDM5NDVfVUNPREVfQVBJX01JTiAxCisKKyNkZWZpbmUgSUwzOTQ1X0ZXX1BSRQkiaXdsd2lmaS0zOTQ1LSIKKyNkZWZpbmUgX0lMMzk0NV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJTDM5NDVfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSUwzOTQ1X01PRFVMRV9GSVJNV0FSRShhcGkpIF9JTDM5NDVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkKKworLyogRGVmYXVsdCBub2lzZSBsZXZlbCB0byByZXBvcnQgd2hlbiBub2lzZSBtZWFzdXJlbWVudCBpcyBub3QgYXZhaWxhYmxlLgorICogICBUaGlzIG1heSBiZSBiZWNhdXNlIHdlJ3JlOgorICogICAxKSAgTm90IGFzc29jaWF0ZWQgKDQ5NjUsIG5vIGJlYWNvbiBzdGF0cyBiZWluZyBzZW50IHRvIGRyaXZlcikKKyAqICAgMikgIFNjYW5uaW5nIChub2lzZSBtZWFzdXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBhc3NvY2lhdGVkIGNoYW5uZWwpCisgKiAgIDMpICBSZWNlaXZpbmcgQ0NLICgzOTQ1IGRlbGl2ZXJzIG5vaXNlIGluZm8gb25seSBmb3IgT0ZETSBmcmFtZXMpCisgKiBVc2UgZGVmYXVsdCBub2lzZSB2YWx1ZSBvZiAtMTI3IC4uLiB0aGlzIGlzIGJlbG93IHRoZSByYW5nZSBvZiBtZWFzdXJhYmxlCisgKiAgIFJ4IGRCbSBmb3IgZWl0aGVyIDM5NDUgb3IgNDk2NSwgc28gaXQgY2FuIGluZGljYXRlICJ1bm1lYXN1cmFibGUiIHRvIHVzZXIuCisgKiAgIEFsc28sIC0xMjcgd29ya3MgYmV0dGVyIHRoYW4gMCB3aGVuIGF2ZXJhZ2luZyBmcmFtZXMgd2l0aC93aXRob3V0CisgKiAgIG5vaXNlIGluZm8gKGUuZy4gYXZlcmFnaW5nIG1pZ2h0IGJlIGRvbmUgaW4gYXBwKTsgbWVhc3VyZWQgZEJtIHZhbHVlcyBhcmUKKyAqICAgYWx3YXlzIG5lZ2F0aXZlIC4uLiB1c2luZyBhIG5lZ2F0aXZlIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGtlZXBzIGFsbAorICogICBhdmVyYWdlcyB3aXRoaW4gYW4gczgncyAodXNlZCBpbiBzb21lIGFwcHMpIHJhbmdlIG9mIG5lZ2F0aXZlIHZhbHVlcy4gKi8KKyNkZWZpbmUgSUxfTk9JU0VfTUVBU19OT1RfQVZBSUxBQkxFICgtMTI3KQorCisvKiBNb2R1bGUgcGFyYW1ldGVycyBhY2Nlc3NpYmxlIGZyb20gaXdsLSouYyAqLworZXh0ZXJuIHN0cnVjdCBpbF9tb2RfcGFyYW1zIGlsMzk0NV9tb2RfcGFyYW1zOworCitzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGVfZGF0YSB7CisJdTY0IGRhdGE7CisJczMyIHN1Y2Nlc3NfY291bnRlcjsKKwlzMzIgc3VjY2Vzc19yYXRpbzsKKwlzMzIgY291bnRlcjsKKwlzMzIgYXZlcmFnZV90cHQ7CisJdW5zaWduZWQgbG9uZyBzdGFtcDsKK307CisKK3N0cnVjdCBpbDM5NDVfcnNfc3RhIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGlsX3ByaXYgKmlsOworCXMzMiAqZXhwZWN0ZWRfdHB0OworCXVuc2lnbmVkIGxvbmcgbGFzdF9wYXJ0aWFsX2ZsdXNoOworCXVuc2lnbmVkIGxvbmcgbGFzdF9mbHVzaDsKKwl1MzIgZmx1c2hfdGltZTsKKwl1MzIgbGFzdF90eF9wYWNrZXRzOworCXUzMiB0eF9wYWNrZXRzOworCXU4IHRnZzsKKwl1OCBmbHVzaF9wZW5kaW5nOworCXU4IHN0YXJ0X3JhdGU7CisJc3RydWN0IHRpbWVyX2xpc3QgcmF0ZV9zY2FsZV9mbHVzaDsKKwlzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGVfZGF0YSB3aW5bUkFURV9DT1VOVF8zOTQ1XTsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlOworI2VuZGlmCisKKwkvKiB1c2VkIHRvIGJlIGluIHN0YV9pbmZvICovCisJaW50IGxhc3RfdHhyYXRlX2lkeDsKK307CisKKy8qCisgKiBUaGUgY29tbW9uIHN0cnVjdCBNVVNUIGJlIGZpcnN0IGJlY2F1c2UgaXQgaXMgc2hhcmVkIGJldHdlZW4KKyAqIDM5NDUgYW5kIDQ5NjUhCisgKi8KK3N0cnVjdCBpbDM5NDVfc3RhX3ByaXYgeworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXZfY29tbW9uIGNvbW1vbjsKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSByc19zdGE7Cit9OworCitlbnVtIGlsMzk0NV9hbnRlbm5hIHsKKwlJTF9BTlRFTk5BX0RJVkVSU0lUWSwKKwlJTF9BTlRFTk5BX01BSU4sCisJSUxfQU5URU5OQV9BVVgKK307CisKKy8qCisgKiBSVFMgdGhyZXNob2xkIGhlcmUgaXMgdG90YWwgc2l6ZSBbMjM0N10gbWludXMgNCBGQ1MgYnl0ZXMKKyAqIFBlciBzcGVjOgorICogICBhIHZhbHVlIG9mIDAgbWVhbnMgUlRTIG9uIGFsbCBkYXRhL21hbmFnZW1lbnQgcGFja2V0cworICogICBhIHZhbHVlID4gbWF4IE1TRFUgc2l6ZSBtZWFucyBubyBSVFMKKyAqIGVsc2UgUlRTIGZvciBkYXRhL21hbmFnZW1lbnQgZnJhbWVzIHdoZXJlIE1QRFUgaXMgbGFyZ2VyCisgKiAgIHRoYW4gUlRTIHZhbHVlLgorICovCisjZGVmaW5lIERFRkFVTFRfUlRTX1RIUkVTSE9MRCAgICAgMjM0N1UKKyNkZWZpbmUgTUlOX1JUU19USFJFU0hPTEQgICAgICAgICAwVQorI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAgICAgICAgIDIzNDdVCisjZGVmaW5lIE1BWF9NU0RVX1NJWkUJCSAgMjMwNFUKKyNkZWZpbmUgTUFYX01QRFVfU0laRQkJICAyMzQ2VQorI2RlZmluZSBERUZBVUxUX0JFQUNPTl9JTlRFUlZBTCAgIDEwMFUKKyNkZWZpbmUJREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVCA3VQorI2RlZmluZQlERUZBVUxUX0xPTkdfUkVUUllfTElNSVQgIDRVCisKKyNkZWZpbmUgSUxfVFhfRklGT19BQzAJMAorI2RlZmluZSBJTF9UWF9GSUZPX0FDMQkxCisjZGVmaW5lIElMX1RYX0ZJRk9fQUMyCTIKKyNkZWZpbmUgSUxfVFhfRklGT19BQzMJMworI2RlZmluZSBJTF9UWF9GSUZPX0hDQ0FfMQk1CisjZGVmaW5lIElMX1RYX0ZJRk9fSENDQV8yCTYKKyNkZWZpbmUgSUxfVFhfRklGT19OT05FCTcKKworI2RlZmluZSBJRUVFODAyMTFfREFUQV9MRU4gICAgICAgICAgICAgIDIzMDQKKyNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAgICAgICAgICAgICAzMAorI2RlZmluZSBJRUVFODAyMTFfSExFTiAgICAgICAgICAgICAgICAgIChJRUVFODAyMTFfNEFERFJfTEVOKQorI2RlZmluZSBJRUVFODAyMTFfRlJBTUVfTEVOICAgICAgICAgICAgIChJRUVFODAyMTFfREFUQV9MRU4gKyBJRUVFODAyMTFfSExFTikKKworc3RydWN0IGlsMzk0NV9mcmFtZSB7CisJdW5pb24geworCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciBmcmFtZTsKKwkJc3RydWN0IGlsMzk0NV90eF9iZWFjb25fY21kIGJlYWNvbjsKKwkJdTggcmF3W0lFRUU4MDIxMV9GUkFNRV9MRU5dOworCQl1OCBjbWRbMzYwXTsKKwl9IHU7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworI2RlZmluZSBTRVFfVE9fU04oc2VxKSAoKChzZXEpICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQorI2RlZmluZSBTTl9UT19TRVEoc3NuKSAoKChzc24pIDw8IDQpICYgSUVFRTgwMjExX1NDVExfU0VRKQorI2RlZmluZSBNQVhfU04gKChJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCisKKyNkZWZpbmUgU1VQX1JBVEVfMTFBX01BWF9OVU1fQ0hBTk5FTFMgIDgKKyNkZWZpbmUgU1VQX1JBVEVfMTFCX01BWF9OVU1fQ0hBTk5FTFMgIDQKKyNkZWZpbmUgU1VQX1JBVEVfMTFHX01BWF9OVU1fQ0hBTk5FTFMgIDEyCisKKyNkZWZpbmUgSUxfU1VQUE9SVEVEX1JBVEVTX0lFX0xFTiAgICAgICAgIDgKKworI2RlZmluZSBTQ0FOX0lOVEVSVkFMIDEwMAorCisjZGVmaW5lIE1BWF9USURfQ09VTlQgICAgICAgIDkKKworI2RlZmluZSBJTF9JTlZBTElEX1JBVEUgICAgIDB4RkYKKyNkZWZpbmUgSUxfSU5WQUxJRF9WQUxVRSAgICAtMQorCisjZGVmaW5lIFNUQV9QU19TVEFUVVNfV0FLRSAgICAgICAgICAgICAwCisjZGVmaW5lIFNUQV9QU19TVEFUVVNfU0xFRVAgICAgICAgICAgICAxCisKK3N0cnVjdCBpbDM5NDVfaWJzc19zZXEgeworCXU4IG1hY1tFVEhfQUxFTl07CisJdTE2IHNlcV9udW07CisJdTE2IGZyYWdfbnVtOworCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWU7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworI2RlZmluZSBJTF9SWF9IRFIoeCkgKChzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lX2hkciAqKShcCisJCSAgICAgICB4LT51LnJ4X2ZyYW1lLnN0YXRzLnBheWxvYWQgKyBcCisJCSAgICAgICB4LT51LnJ4X2ZyYW1lLnN0YXRzLnBoeV9jb3VudCkpCisjZGVmaW5lIElMX1JYX0VORCh4KSAoKHN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfZW5kICopKFwKKwkJICAgICAgIElMX1JYX0hEUih4KS0+cGF5bG9hZCArIFwKKwkJICAgICAgIGxlMTZfdG9fY3B1KElMX1JYX0hEUih4KS0+bGVuKSkpCisjZGVmaW5lIElMX1JYX1NUQVRTKHgpICgmeC0+dS5yeF9mcmFtZS5zdGF0cykKKyNkZWZpbmUgSUxfUlhfREFUQSh4KSAoSUxfUlhfSERSKHgpLT5wYXlsb2FkKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGl3bDM5NDUtYmFzZS5jIHdoaWNoIGFyZSBmb3J3YXJkIGRlY2xhcmVkIGhlcmUKKyAqIGZvciB1c2UgYnkgaXdsLSouYworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBpbnQgaWwzOTQ1X2NhbGNfZGJfZnJvbV9yYXRpbyhpbnQgc2lnX3JhdGlvKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9yeF9yZXBsZW5pc2godm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCBpbDM5NDVfcnhfcXVldWVfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSk7CitleHRlcm4gdW5zaWduZWQgaW50IGlsMzk0NV9maWxsX2JlYWNvbl9mcmFtZShzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCQkJICAgICBpbnQgbGVmdCk7CitleHRlcm4gaW50IGlsMzk0NV9kdW1wX25pY19ldmVudF9sb2coc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGZ1bGxfbG9nLAorCQkJCSAgICAgY2hhciAqKmJ1ZiwgYm9vbCBkaXNwbGF5KTsKK2V4dGVybiB2b2lkIGlsMzk0NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBpd2wtWzM0XSouYyB3aGljaCBhcmUgZm9yd2FyZCBkZWNsYXJlZCBoZXJlCisgKiBmb3IgdXNlIGJ5IGl3bDM5NDUtYmFzZS5jCisgKgorICogTk9URTogIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGhhcmR3YXJlIHNwZWNpZmljCisgKiB3aGljaCBpcyB3aHkgdGhleSBhcmUgaW4gdGhlIGhhcmR3YXJlIHNwZWNpZmljIGZpbGVzICh2cy4gaXdsLWJhc2UuYykKKyAqCisgKiBOYW1pbmcgY29udmVudGlvbiAtLQorICogaWwzOTQ1XyAgICAgICAgIDwtLSBJdHMgcGFydCBvZiBpd2x3aWZpIChzaG91bGQgYmUgY2hhbmdlZCB0byBpbDM5NDVfKQorICogaWwzOTQ1X2h3XyAgICAgIDwtLSBIYXJkd2FyZSBzcGVjaWZpYyAoaW1wbGVtZW50ZWQgaW4gaXdsLVhYWFguYyBieSBhbGwgSFcpCisgKiBpd2xYWFhYXyAgICAgPC0tIEhhcmR3YXJlIHNwZWNpZmljIChpbXBsZW1lbnRlZCBpbiBpd2wtWFhYWC5jIGZvciBYWFhYKQorICogaWwzOTQ1X2JnXyAgICAgIDwtLSBDYWxsZWQgZnJvbSB3b3JrIHF1ZXVlIGNvbnRleHQKKyAqIGlsMzk0NV9tYWNfICAgICA8LS0gbWFjODAyMTEgY2FsbGJhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB2b2lkIGlsMzk0NV9od19oYW5kbGVyX3NldHVwKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfaHdfc2V0dXBfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2h3X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsMzk0NV9od19yeHFfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaHdfc2V0X2h3X3BhcmFtcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaHdfbmljX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X25pY19zdG9wX21hc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2h3X3R4cV9jdHhfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2h3X3R4cV9jdHhfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaHdfbmljX3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsMzk0NV9od190eHFfYXR0YWNoX2J1Zl90b190ZmQoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCQkgICBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwKKwkJCQkJICAgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLCB1OCByZXNldCwKKwkJCQkJICAgdTggcGFkKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9od190eHFfZnJlZV90ZmQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7CitleHRlcm4gaW50IGlsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7CitleHRlcm4gdW5zaWduZWQgaW50IGlsMzk0NV9od19nZXRfYmVhY29uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJCSAgICAgc3RydWN0IGlsMzk0NV9mcmFtZSAqZnJhbWUsCisJCQkJCSAgICAgdTggcmF0ZSk7Cit2b2lkIGlsMzk0NV9od19idWlsZF90eF9jbWRfcmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9kZXZpY2VfY21kICpjbWQsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwgaW50IHN0YV9pZCwKKwkJCQkgaW50IHR4X2lkKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X3JlZ19zZW5kX3R4cG93ZXIoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X3JlZ19zZXRfdHhwb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHM4IHBvd2VyKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9oZGxfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbDM5NDVfaGRsX2Nfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2Rpc2FibGVfZXZlbnRzKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsNDk2NV9nZXRfdGVtcGVyYXR1cmUoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9wb3N0X2Fzc29jaWF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2NvbmZpZ19hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCitleHRlcm4gaW50IGlsMzk0NV9jb21taXRfcnhvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisKKy8qKgorICogaWwzOTQ1X2h3X2ZpbmRfc3RhdGlvbiAtIEZpbmQgc3RhdGlvbiBpZCBmb3IgYSBnaXZlbiBCU1NJRAorICogQGJzc2lkOiBNQUMgYWRkcmVzcyBvZiBzdGF0aW9uIElEIHRvIGZpbmQKKyAqCisgKiBOT1RFOiAgVGhpcyBzaG91bGQgbm90IGJlIGhhcmR3YXJlIHNwZWNpZmljIGJ1dCB0aGUgY29kZSBoYXMKKyAqIG5vdCB5ZXQgYmVlbiBtZXJnZWQgaW50byBhIHNpbmdsZSBjb21tb24gbGF5ZXIgZm9yIG1hbmFnaW5nIHRoZQorICogc3RhdGlvbiB0YWJsZXMuCisgKi8KK2V4dGVybiB1OCBpbDM5NDVfaHdfZmluZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggKiBic3NpZCk7CisKK2V4dGVybiBzdHJ1Y3QgaWVlZTgwMjExX29wcyBpbDM5NDVfaHdfb3BzOworCitleHRlcm4gX19sZTMyIGlsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaW5pdF9od19yYXRlX3RhYmxlKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tKHN0cnVjdCBpbF9wcml2ICppbCk7CisKK2V4dGVybiBpbnQgaWwzOTQ1X3JzX25leHRfcmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCByYXRlKTsKKworLyogc2Nhbm5pbmcgKi8KK2ludCBpbDM5NDVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cit2b2lkIGlsMzk0NV9wb3N0X3NjYW4oc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogcmF0ZXMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgaWwzOTQ1X3JhdGVfaW5mbyBpbDM5NDVfcmF0ZXNbUkFURV9DT1VOVF8zOTQ1XTsKKworLyogUlNTSSB0byBkQm0gKi8KKyNkZWZpbmUgSUwzOV9SU1NJX09GRlNFVAk5NQorCisvKgorICogRUVQUk9NIHJlbGF0ZWQgY29uc3RhbnRzLCBlbnVtcywgYW5kIHN0cnVjdHVyZXMuCisgKi8KKyNkZWZpbmUgRUVQUk9NX1NLVV9DQVBfT1BfTU9ERV9NUkMgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNykKKworLyoKKyAqIE1hcHBpbmcgb2YgYSBUeCBwb3dlciBsZXZlbCwgYXQgZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSwKKyAqICAgdG8gYSByYWRpby9EU1AgZ2FpbiB0YWJsZSBpZHguCisgKiBPbmUgZm9yIGVhY2ggb2YgNSAic2FtcGxlIiBwb3dlciBsZXZlbHMgaW4gZWFjaCBiYW5kLgorICogdl9kZXQgaXMgbWVhc3VyZWQgYXQgdGhlIGZhY3RvcnksIHVzaW5nIHRoZSAzOTQ1J3MgYnVpbHQtaW4gcG93ZXIgYW1wbGlmaWVyCisgKiAgIChQQSkgb3V0cHV0IHZvbHRhZ2UgZGV0ZWN0b3IuICBUaGlzIHNhbWUgZGV0ZWN0b3IgaXMgdXNlZCBkdXJpbmcgVHggb2YKKyAqICAgbG9uZyBwYWNrZXRzIGluIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJvdmlkZSBmZWVkYmFjayBhcyB0byBwcm9wZXIgb3V0cHV0CisgKiAgIGxldmVsLgorICogRGF0YSBjb3BpZWQgZnJvbSBFRVBST00uCisgKiBETyBOT1QgQUxURVIgVEhJUyBTVFJVQ1RVUkUhISEKKyAqLworc3RydWN0IGlsMzk0NV9lZXByb21fdHhwb3dlcl9zYW1wbGUgeworCXU4IGdhaW5faWR4OwkJLyogaWR4IGludG8gcG93ZXIgKGdhaW4pIHNldHVwIHRhYmxlIC4uLiAqLworCXM4IHBvd2VyOwkJLyogLi4uIGZvciB0aGlzIHB3ciBsZXZlbCBmb3IgdGhpcyBjaG5sIGdyb3VwICovCisJdTE2IHZfZGV0OwkJLyogUEEgb3V0cHV0IHZvbHRhZ2UgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBNYXBwaW5ncyBvZiBUeCBwb3dlciBsZXZlbHMgLT4gbm9taW5hbCByYWRpby9EU1AgZ2FpbiB0YWJsZSBpZHhlcy4KKyAqIE9uZSBmb3IgZWFjaCBjaGFubmVsIGdyb3VwIChhLmsuYS4gImJhbmQiKSAoMSBmb3IgQkcsIDQgZm9yIEEpLgorICogVHggcG93ZXIgc2V0dXAgY29kZSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgNSAic2FtcGxlIiBwb3dlciBsZXZlbHMKKyAqICAgIHRvIGRldGVybWluZSB0aGUgbm9taW5hbCBzZXR1cCBmb3IgYSByZXF1ZXN0ZWQgcG93ZXIgbGV2ZWwuCisgKiBEYXRhIGNvcGllZCBmcm9tIEVFUFJPTS4KKyAqIERPIE5PVCBBTFRFUiBUSElTIFNUUlVDVFVSRSEhIQorICovCitzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwIHsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX3NhbXBsZSBzYW1wbGVzWzVdOwkvKiA1IHBvd2VyIGxldmVscyAqLworCXMzMiBhLCBiLCBjLCBkLCBlOwkvKiBjb2VmZmljaWVudHMgZm9yIHZvbHRhZ2UtPnBvd2VyCisJCQkJICogZm9ybXVsYSAoc2lnbmVkKSAqLworCXMzMiBGYSwgRmIsIEZjLCBGZCwgRmU7CS8qIHRoZXNlIG1vZGlmeSBjb2VmZnMgYmFzZWQgb24KKwkJCQkgKiBmcmVxdWVuY3kgKHNpZ25lZCkgKi8KKwlzOCBzYXR1cmF0aW9uX3Bvd2VyOwkvKiBoaWdoZXN0IHBvd2VyIHBvc3NpYmxlIGJ5IGgvdyBpbiB0aGlzCisJCQkJICogYmFuZCAqLworCXU4IGdyb3VwX2NoYW5uZWw7CS8qICJyZXByZXNlbnRhdGl2ZSIgY2hhbm5lbCAjIGluIHRoaXMgYmFuZCAqLworCXMxNiB0ZW1wZXJhdHVyZTsJLyogaC93IHRlbXBlcmF0dXJlIGF0IGZhY3RvcnkgY2FsaWIgdGhpcyBiYW5kCisJCQkJICogKHNpZ25lZCkgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBUZW1wZXJhdHVyZS1iYXNlZCBUeC1wb3dlciBjb21wZW5zYXRpb24gZGF0YSwgbm90IGJhbmQtc3BlY2lmaWMuCisgKiBUaGVzZSBjb2VmZmljaWVudHMgYXJlIHVzZSB0byBtb2RpZnkgYS9iL2MvZC9lIGNvZWZmcyBiYXNlZCBvbgorICogICBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCB0ZW1wZXJhdHVyZSBhbmQgZmFjdG9yeSBjYWxpYiB0ZW1wZXJhdHVyZS4KKyAqIERhdGEgY29waWVkIGZyb20gRUVQUk9NLgorICovCitzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90ZW1wZXJhdHVyZV9jb3JyIHsKKwl1MzIgVGE7CisJdTMyIFRiOworCXUzMiBUYzsKKwl1MzIgVGQ7CisJdTMyIFRlOworfSBfX3BhY2tlZDsKKworLyoKKyAqIEVFUFJPTSBtYXAKKyAqLworc3RydWN0IGlsMzk0NV9lZXByb20geworCXU4IHJlc2VydmVkMFsxNl07CisJdTE2IGRldmljZV9pZDsJCS8qIGFicy5vZnM6IDE2ICovCisJdTggcmVzZXJ2ZWQxWzJdOworCXUxNiBwbWM7CQkvKiBhYnMub2ZzOiAyMCAqLworCXU4IHJlc2VydmVkMlsyMF07CisJdTggbWFjX2FkZHJlc3NbNl07CS8qIGFicy5vZnM6IDQyICovCisJdTggcmVzZXJ2ZWQzWzU4XTsKKwl1MTYgYm9hcmRfcmV2aXNpb247CS8qIGFicy5vZnM6IDEwNiAqLworCXU4IHJlc2VydmVkNFsxMV07CisJdTggYm9hcmRfcGJhX251bWJlcls5XTsJLyogYWJzLm9mczogMTE5ICovCisJdTggcmVzZXJ2ZWQ1WzhdOworCXUxNiB2ZXJzaW9uOwkJLyogYWJzLm9mczogMTM2ICovCisJdTggc2t1X2NhcDsJCS8qIGFicy5vZnM6IDEzOCAqLworCXU4IGxlZHNfbW9kZTsJCS8qIGFicy5vZnM6IDEzOSAqLworCXUxNiBvZW1fbW9kZTsKKwl1MTYgd293bGFuX21vZGU7CS8qIGFicy5vZnM6IDE0MiAqLworCXUxNiBsZWRzX3RpbWVfaW50ZXJ2YWw7CS8qIGFicy5vZnM6IDE0NCAqLworCXU4IGxlZHNfb2ZmX3RpbWU7CS8qIGFicy5vZnM6IDE0NiAqLworCXU4IGxlZHNfb25fdGltZTsJLyogYWJzLm9mczogMTQ3ICovCisJdTggYWxtZ29yX21fdmVyc2lvbjsJLyogYWJzLm9mczogMTQ4ICovCisJdTggYW50ZW5uYV9zd2l0Y2hfdHlwZTsJLyogYWJzLm9mczogMTQ5ICovCisJdTggcmVzZXJ2ZWQ2WzQyXTsKKwl1OCBza3VfaWRbNF07CQkvKiBhYnMub2ZzOiAxOTIgKi8KKworLyoKKyAqIFBlci1jaGFubmVsIHJlZ3VsYXRvcnkgZGF0YS4KKyAqCisgKiBFYWNoIGNoYW5uZWwgdGhhdCAqbWlnaHQqIGJlIHN1cHBvcnRlZCBieSAzOTQ1IGhhcyBhIGZpeGVkIGxvY2F0aW9uCisgKiBpbiBFRVBST00gY29udGFpbmluZyBFRVBST01fQ0hBTk5FTF8qIHVzYWdlIGZsYWdzIChMU0IpIGFuZCBtYXggcmVndWxhdG9yeQorICogdHhwb3dlciAoTVNCKS4KKyAqCisgKiBFbnRyaWVzIGltbWVkaWF0ZWx5IGJlbG93IGFyZSBmb3IgMjAgTUh6IGNoYW5uZWwgd2lkdGguCisgKgorICogMi40IEdIeiBjaGFubmVscyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKKyAqLworCXUxNiBiYW5kXzFfY291bnQ7CS8qIGFicy5vZnM6IDE5NiAqLworCXN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCBiYW5kXzFfY2hhbm5lbHNbMTRdOwkvKiBhYnMub2ZzOiAxOTggKi8KKworLyoKKyAqIDQuOSBHSHogY2hhbm5lbHMgMTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OSwgMTkyLCAxOTYsCisgKiA1LjAgR0h6IGNoYW5uZWxzIDcsIDgsIDExLCAxMiwgMTYKKyAqICg0OTE1LTUwODBNSHopIChub25lIG9mIHRoZXNlIGlzIGV2ZXIgc3VwcG9ydGVkKQorICovCisJdTE2IGJhbmRfMl9jb3VudDsJLyogYWJzLm9mczogMjI2ICovCisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGJhbmRfMl9jaGFubmVsc1sxM107CS8qIGFicy5vZnM6IDIyOCAqLworCisvKgorICogNS4yIEdIeiBjaGFubmVscyAzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUyLCA1NiwgNjAsIDY0CisgKiAoNTE3MC01MzIwTUh6KQorICovCisJdTE2IGJhbmRfM19jb3VudDsJLyogYWJzLm9mczogMjU0ICovCisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGJhbmRfM19jaGFubmVsc1sxMl07CS8qIGFicy5vZnM6IDI1NiAqLworCisvKgorICogNS41IEdIeiBjaGFubmVscyAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorICogKDU1MDAtNTcwME1IeikKKyAqLworCXUxNiBiYW5kXzRfY291bnQ7CS8qIGFicy5vZnM6IDI4MCAqLworCXN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCBiYW5kXzRfY2hhbm5lbHNbMTFdOwkvKiBhYnMub2ZzOiAyODIgKi8KKworLyoKKyAqIDUuNyBHSHogY2hhbm5lbHMgMTQ1LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorICogKDU3MjUtNTgyNU1IeikKKyAqLworCXUxNiBiYW5kXzVfY291bnQ7CS8qIGFicy5vZnM6IDMwNCAqLworCXN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCBiYW5kXzVfY2hhbm5lbHNbNl07CS8qIGFicy5vZnM6IDMwNiAqLworCisJdTggcmVzZXJ2ZWQ5WzE5NF07CisKKy8qCisgKiAzOTQ1IFR4cG93ZXIgY2FsaWJyYXRpb24gZGF0YS4KKyAqLworI2RlZmluZSBJTF9OVU1fVFhfQ0FMSUJfR1JPVVBTIDUKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwIGdyb3Vwc1tJTF9OVU1fVFhfQ0FMSUJfR1JPVVBTXTsKKy8qIGFicy5vZnM6IDUxMiAqLworCXN0cnVjdCBpbDM5NDVfZWVwcm9tX3RlbXBlcmF0dXJlX2NvcnIgY29ycmVjdGlvbnM7CS8qIGFicy5vZnM6IDgzMiAqLworCXU4IHJlc2VydmVkMTZbMTcyXTsJLyogZmlsbCBvdXQgdG8gZnVsbCAxMDI0IGJ5dGUgYmxvY2sgKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSUwzOTQ1X0VFUFJPTV9JTUdfU0laRSAxMDI0CisKKy8qIEVuZCBvZiBFRVBST00gKi8KKworI2RlZmluZSBQQ0lfQ0ZHX1JFVl9JRF9CSVRfQkFTSUNfU0tVICAgICAgICAgICAgICAgICgweDQwKQkvKiBiaXQgNiAgICAqLworI2RlZmluZSBQQ0lfQ0ZHX1JFVl9JRF9CSVRfUlRQICAgICAgICAgICAgICAgICAgICAgICgweDgwKQkvKiBiaXQgNyAgICAqLworCisvKiA0IERBVEEgKyAxIENNRC4gVGhlcmUgYXJlIDIgSENDQSBxdWV1ZXMgdGhhdCBhcmUgbm90IHVzZWQuICovCisjZGVmaW5lIElMMzlfTlVNX1FVRVVFUyAgICAgICAgNQorI2RlZmluZSBJTDM5X0NNRF9RVUVVRV9OVU0JNAorCisjZGVmaW5lIElMX0RFRkFVTFRfVFhfUkVUUlkgIDE1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUkZEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5VTV9URkRfQ0hVTktTICAgICAgICAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIFRGRF9DVExfQ09VTlRfU0VUKG4pICAgICAgIChuIDw8IDI0KQorI2RlZmluZSBURkRfQ1RMX0NPVU5UX0dFVChjdGwpICAgICAoKGN0bCA+PiAyNCkgJiA3KQorI2RlZmluZSBURkRfQ1RMX1BBRF9TRVQobikgICAgICAgICAobiA8PCAyOCkKKyNkZWZpbmUgVEZEX0NUTF9QQURfR0VUKGN0bCkgICAgICAgKGN0bCA+PiAyOCkKKworLyogU2l6ZXMgYW5kIGFkZHJlc3NlcyBmb3IgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgbWVtb3J5IChTUkFNKSBpbgorICogMzk0NSdzIGVtYmVkZGVkIHByb2Nlc3Nvci4gIERyaXZlciBhY2Nlc3MgaXMgdmlhIEhCVVNfVEFSR19NRU1fKiByZWdzLiAqLworI2RlZmluZSBJTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5ECQkoMHgwMDAwMDApCisjZGVmaW5lIElMMzlfUlRDX0lOU1RfVVBQRVJfQk9VTkQJCSgweDAxNDAwMCkKKworI2RlZmluZSBJTDM5X1JUQ19EQVRBX0xPV0VSX0JPVU5ECQkoMHg4MDAwMDApCisjZGVmaW5lIElMMzlfUlRDX0RBVEFfVVBQRVJfQk9VTkQJCSgweDgwODAwMCkKKworI2RlZmluZSBJTDM5X1JUQ19JTlNUX1NJWkUgKElMMzlfUlRDX0lOU1RfVVBQRVJfQk9VTkQgLSBcCisJCQkJSUwzOV9SVENfSU5TVF9MT1dFUl9CT1VORCkKKyNkZWZpbmUgSUwzOV9SVENfREFUQV9TSVpFIChJTDM5X1JUQ19EQVRBX1VQUEVSX0JPVU5EIC0gXAorCQkJCUlMMzlfUlRDX0RBVEFfTE9XRVJfQk9VTkQpCisKKyNkZWZpbmUgSUwzOV9NQVhfSU5TVF9TSVpFIElMMzlfUlRDX0lOU1RfU0laRQorI2RlZmluZSBJTDM5X01BWF9EQVRBX1NJWkUgSUwzOV9SVENfREFUQV9TSVpFCisKKy8qIFNpemUgb2YgdUNvZGUgaW5zdHJ1Y3Rpb24gbWVtb3J5IGluIGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIElMMzlfTUFYX0JTTV9TSVpFIElMMzlfUlRDX0lOU1RfU0laRQorCitzdGF0aWMgaW5saW5lIGludAoraWwzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIodTMyIGFkZHIpCit7CisJcmV0dXJuIChhZGRyID49IElMMzlfUlRDX0RBVEFfTE9XRVJfQk9VTkQgJiYKKwkJYWRkciA8IElMMzlfUlRDX0RBVEFfVVBQRVJfQk9VTkQpOworfQorCisvKiBCYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgaWwzOTQ1X3NoYXJlZCBpcyBwcm92aWRlZCB0byBGSDM5X1RTU1JfQ0JCX0JBU0UKKyAqIGFuZCAmaWwzOTQ1X3NoYXJlZC5yeF9yZWFkX3B0clswXSBpcyBwcm92aWRlZCB0byBGSDM5X1JDU1JfUlBUUl9BRERSKDApICovCitzdHJ1Y3QgaWwzOTQ1X3NoYXJlZCB7CisJX19sZTMyIHR4X2Jhc2VfcHRyWzhdOworfSBfX3BhY2tlZDsKKworc3RhdGljIGlubGluZSB1OAoraWwzOTQ1X2h3X2dldF9yYXRlKF9fbGUxNiByYXRlX25fZmxhZ3MpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KHJhdGVfbl9mbGFncykgJiAweEZGOworfQorCitzdGF0aWMgaW5saW5lIHUxNgoraWwzOTQ1X2h3X2dldF9yYXRlX25fZmxhZ3MoX19sZTE2IHJhdGVfbl9mbGFncykKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUocmF0ZV9uX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBfX2xlMTYKK2lsMzk0NV9od19zZXRfcmF0ZV9uX2ZsYWdzKHU4IHJhdGUsIHUxNiBmbGFncykKK3sKKwlyZXR1cm4gY3B1X3RvX2xlMTYoKHUxNikgcmF0ZSB8IGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGl3bDM5NDUgRmxvdyBIYW5kbGVyIERlZmluaXRpb25zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgSS9PIGFyZWEgaXMgZGlyZWN0bHkgcmVhZC93cml0YWJsZSBieSBkcml2ZXIgKGUuZy4gTGludXggdXNlcyB3cml0ZWwoKSkKKyAqIEFkZHJlc3NlcyBhcmUgb2Zmc2V0cyBmcm9tIGRldmljZSdzIFBDSSBoYXJkd2FyZSBiYXNlIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUgRkgzOV9NRU1fTE9XRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MDgwMCkKKyNkZWZpbmUgRkgzOV9NRU1fVVBQRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MTAwMCkKKworI2RlZmluZSBGSDM5X0NCQ0NfVEJMCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDE0MCkKKyNkZWZpbmUgRkgzOV9URkRCX1RCTAkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHgxODApCisjZGVmaW5lIEZIMzlfUkNTUl9UQkwJCShGSDM5X01FTV9MT1dFUl9CT1VORCArIDB4NDAwKQorI2RlZmluZSBGSDM5X1JTU1JfVEJMCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDRjMCkKKyNkZWZpbmUgRkgzOV9UQ1NSX1RCTAkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHg1MDApCisjZGVmaW5lIEZIMzlfVFNTUl9UQkwJCShGSDM5X01FTV9MT1dFUl9CT1VORCArIDB4NjgwKQorCisvKiBURkRCIChUcmFuc21pdCBGcmFtZSBCdWZmZXIgRGVzY3JpcHRvcikgKi8KKyNkZWZpbmUgRkgzOV9URkRCKF9jaCwgYnVmKQkJCShGSDM5X1RGREJfVEJMICsgXAorCQkJCQkJICgoX2NoKSAqIDIgKyAoYnVmKSkgKiAweDI4KQorI2RlZmluZSBGSDM5X1RGREJfQ0hOTF9CVUZfQ1RSTF9SRUcoX2NoKQkoRkgzOV9URkRCX1RCTCArIDB4NTAgKiAoX2NoKSkKKworLyogQ0JDQyBjaGFubmVsIGlzIFswLDJdICovCisjZGVmaW5lIEZIMzlfQ0JDQyhfY2gpCQkoRkgzOV9DQkNDX1RCTCArIChfY2gpICogMHg4KQorI2RlZmluZSBGSDM5X0NCQ0NfQ1RSTChfY2gpCShGSDM5X0NCQ0MoX2NoKSArIDB4MDApCisjZGVmaW5lIEZIMzlfQ0JDQ19CQVNFKF9jaCkJKEZIMzlfQ0JDQyhfY2gpICsgMHgwNCkKKworLyogUkNTUiBjaGFubmVsIGlzIFswLDJdICovCisjZGVmaW5lIEZIMzlfUkNTUihfY2gpCQkJKEZIMzlfUkNTUl9UQkwgKyAoX2NoKSAqIDB4NDApCisjZGVmaW5lIEZIMzlfUkNTUl9DT05GSUcoX2NoKQkJKEZIMzlfUkNTUihfY2gpICsgMHgwMCkKKyNkZWZpbmUgRkgzOV9SQ1NSX1JCRF9CQVNFKF9jaCkJCShGSDM5X1JDU1IoX2NoKSArIDB4MDQpCisjZGVmaW5lIEZIMzlfUkNTUl9XUFRSKF9jaCkJCShGSDM5X1JDU1IoX2NoKSArIDB4MjApCisjZGVmaW5lIEZIMzlfUkNTUl9SUFRSX0FERFIoX2NoKQkoRkgzOV9SQ1NSKF9jaCkgKyAweDI0KQorCisjZGVmaW5lIEZIMzlfUlNDU1JfQ0hOTDBfV1BUUgkJKEZIMzlfUkNTUl9XUFRSKDApKQorCisvKiBSU1NSICovCisjZGVmaW5lIEZIMzlfUlNTUl9DVFJMCQkJKEZIMzlfUlNTUl9UQkwgKyAweDAwMCkKKyNkZWZpbmUgRkgzOV9SU1NSX1NUQVRVUwkJKEZIMzlfUlNTUl9UQkwgKyAweDAwNCkKKworLyogVENTUiAqLworI2RlZmluZSBGSDM5X1RDU1IoX2NoKQkJCShGSDM5X1RDU1JfVEJMICsgKF9jaCkgKiAweDIwKQorI2RlZmluZSBGSDM5X1RDU1JfQ09ORklHKF9jaCkJCShGSDM5X1RDU1IoX2NoKSArIDB4MDApCisjZGVmaW5lIEZIMzlfVENTUl9DUkVESVQoX2NoKQkJKEZIMzlfVENTUihfY2gpICsgMHgwNCkKKyNkZWZpbmUgRkgzOV9UQ1NSX0JVRkZfU1RUUyhfY2gpCShGSDM5X1RDU1IoX2NoKSArIDB4MDgpCisKKy8qIFRTU1IgKi8KKyNkZWZpbmUgRkgzOV9UU1NSX0NCQl9CQVNFICAgICAgICAoRkgzOV9UU1NSX1RCTCArIDB4MDAwKQorI2RlZmluZSBGSDM5X1RTU1JfTVNHX0NPTkZJRyAgICAgIChGSDM5X1RTU1JfVEJMICsgMHgwMDgpCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9TVEFUVVMgICAgICAgKEZIMzlfVFNTUl9UQkwgKyAweDAxMCkKKworLyogREJNICovCisKKyNkZWZpbmUgRkgzOV9TUlZDX0NITkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCisKKyNkZWZpbmUgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfUE9TX1JCRENfU0laRSAgICAgKDIwKQorI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfSVJRX1JCVEggICAgICAoNCkKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19CSVRfV1JfU1RUU19FTiAgICAoMHgwODAwMDAwMCkKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5fRU5BQkxFICAgICAgICAoMHg4MDAwMDAwMCkKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkRSQkRfRU5fRU5BQkxFICAgICAgICAgICAoMHgyMDAwMDAwMCkKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjgJCSgweDAxMDAwMDAwKQorCisjZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9JUlFfREVTVF9JTlRfSE9TVAkJKDB4MDAwMDEwMDApCisKKyNkZWZpbmUgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0ZICQkJKDB4MDAwMDAwMDApCisKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX1RYRgkJKDB4MDAwMDAwMDApCisjZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9EUklWRVIJCSgweDAwMDAwMDAxKQorCisjZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0RJU0FCTEVfVkFMCSgweDAwMDAwMDAwKQorI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9FTkFCTEVfVkFMCSgweDAwMDAwMDA4KQorCisjZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfSUZURkQJCSgweDAwMjAwMDAwKQorCisjZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19OT0lOVAkJKDB4MDAwMDAwMDApCisKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX1BBVVNFCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRQkJKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkgzOV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfVkFMX1RGREJfVkFMSUQJCSgweDAwMDA0MDAwKQorCisjZGVmaW5lIEZIMzlfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX0JJVF9URkRCX1dQVFIJCSgweDAwMDAwMDAxKQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVFhQRF9PTgkoMHhGRjAwMDAwMCkKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SRF9UWFBEX09OCSgweDAwRkYwMDAwKQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjhCCSgweDAwMDAwNDAwKQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVEZEX09OCQkoMHgwMDAwMDEwMCkKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SRF9DQkJfT04JCSgweDAwMDAwMDgwKQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUlNQX1dBSVRfVEgJKDB4MDAwMDAwMjApCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfUlNQX1dBSVRfVEgJCSgweDAwMDAwMDA1KQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9TVEFUVVNfUkVHX0JJVF9CVUZTX0VNUFRZKF9jaCkJKEJJVChfY2gpIDw8IDI0KQorI2RlZmluZSBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfTk9fUEVORF9SRVEoX2NoKQkoQklUKF9jaCkgPDwgMTYpCisKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRShfY2gpIFwKKwkoRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfQklUX0JVRlNfRU1QVFkoX2NoKSB8IFwKKwkgRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfQklUX05PX1BFTkRfUkVRKF9jaCkpCisKKyNkZWZpbmUgRkgzOV9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUJCQkoMHgwMTAwMDAwMCkKKworc3RydWN0IGlsMzk0NV90ZmRfdGIgeworCV9fbGUzMiBhZGRyOworCV9fbGUzMiBsZW47Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWwzOTQ1X3RmZCB7CisJX19sZTMyIGNvbnRyb2xfZmxhZ3M7CisJc3RydWN0IGlsMzk0NV90ZmRfdGIgdGJzWzRdOworCXU4IF9fcGFkWzI4XTsKK30gX19wYWNrZWQ7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworc3NpemVfdCBpbDM5NDVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3NzaXplX3QgaWwzOTQ1X3Vjb2RlX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Citzc2l6ZV90IGlsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCQlsb2ZmX3QgKnBwb3MpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1jYWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1jYWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjQ4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LWNhbGliLmMKQEAgLTAsMCArMSw5NDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyAqIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICI0OTY1LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVCBjYWxpYnJhdGlvbnMgZnJhbWV3b3JrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBzdGF0c19nZW5lcmFsX2RhdGEgeworCXUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2E7CisJdTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYjsKKwl1MzIgYmVhY29uX3NpbGVuY2VfcnNzaV9jOworCXUzMiBiZWFjb25fZW5lcmd5X2E7CisJdTMyIGJlYWNvbl9lbmVyZ3lfYjsKKwl1MzIgYmVhY29uX2VuZXJneV9jOworfTsKKwordm9pZAoraWw0OTY1X2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUxfQ0FMSUJfTUFYOyBpKyspIHsKKwkJa2ZyZWUoaWwtPmNhbGliX3Jlc3VsdHNbaV0uYnVmKTsKKwkJaWwtPmNhbGliX3Jlc3VsdHNbaV0uYnVmID0gTlVMTDsKKwkJaWwtPmNhbGliX3Jlc3VsdHNbaV0uYnVmX2xlbiA9IDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJVTlRJTUUgY2FsaWJyYXRpb25zIGZyYW1ld29yaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAiZmFsc2UgYWxhcm1zIiBhcmUgc2lnbmFscyB0aGF0IG91ciBEU1AgdHJpZXMgdG8gbG9jayBvbnRvLAorICogICBidXQgdGhlbiBkZXRlcm1pbmVzIHRoYXQgdGhleSBhcmUgZWl0aGVyIG5vaXNlLCBvciB0cmFuc21pc3Npb25zCisgKiAgIGZyb20gYSBkaXN0YW50IHdpcmVsZXNzIG5ldHdvcmsgKGFsc28gIm5vaXNlIiwgcmVhbGx5KSB0aGF0IGdldAorICogICAic3RlcHBlZCBvbiIgYnkgc3Ryb25nZXIgdHJhbnNtaXNzaW9ucyB3aXRoaW4gb3VyIG93biBuZXR3b3JrLgorICogVGhpcyBhbGdvcml0aG0gYXR0ZW1wdHMgdG8gc2V0IGEgc2Vuc2l0aXZpdHkgbGV2ZWwgdGhhdCBpcyBoaWdoCisgKiAgIGVub3VnaCB0byByZWNlaXZlIGFsbCBvZiBvdXIgb3duIG5ldHdvcmsgdHJhZmZpYywgYnV0IG5vdCBzbworICogICBoaWdoIHRoYXQgb3VyIERTUCBnZXRzIHRvbyBidXN5IHRyeWluZyB0byBsb2NrIG9udG8gbm9uLW5ldHdvcmsKKyAqICAgYWN0aXZpdHkvbm9pc2UuICovCitzdGF0aWMgaW50CitpbDQ5NjVfc2Vuc19lbmVyZ3lfY2NrKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG5vcm1fZmEsIHUzMiByeF9lbmFibGVfdGltZSwKKwkJICAgICAgIHN0cnVjdCBzdGF0c19nZW5lcmFsX2RhdGEgKnJ4X2luZm8pCit7CisJdTMyIG1heF9ucmdfY2NrID0gMDsKKwlpbnQgaSA9IDA7CisJdTggbWF4X3NpbGVuY2VfcnNzaSA9IDA7CisJdTMyIHNpbGVuY2VfcmVmID0gMDsKKwl1OCBzaWxlbmNlX3Jzc2lfYSA9IDA7CisJdTggc2lsZW5jZV9yc3NpX2IgPSAwOworCXU4IHNpbGVuY2VfcnNzaV9jID0gMDsKKwl1MzIgdmFsOworCisJLyogImZhbHNlX2FsYXJtcyIgdmFsdWVzIGJlbG93IGFyZSBjcm9zcy1tdWx0aXBsaWNhdGlvbnMgdG8gYXNzZXNzIHRoZQorCSAqICAgbnVtYmVycyBvZiBmYWxzZSBhbGFybXMgd2l0aGluIHRoZSBtZWFzdXJlZCBwZXJpb2Qgb2YgYWN0dWFsIFJ4CisJICogICAoUnggaXMgb2ZmIHdoZW4gd2UncmUgdHhpbmcpLCB2cyB0aGUgbWluL21heCBleHBlY3RlZCBmYWxzZSBhbGFybXMKKwkgKiAgIChzb21lIHNob3VsZCBiZSBleHBlY3RlZCBpZiByeCBpcyBzZW5zaXRpdmUgZW5vdWdoKSBpbiBhCisJICogICBoeXBvdGhldGljYWwgbGlzdGVuaW5nIHBlcmlvZCBvZiAyMDAgdGltZSB1bml0cyAoVFUpLCAyMDQuOCBtc2VjOgorCSAqCisJICogTUlOX0ZBL2ZpeGVkLXRpbWUgPCBmYWxzZV9hbGFybXMvYWN0dWFsLXJ4LXRpbWUgPCBNQVhfRkEvYmVhY29uLXRpbWUKKwkgKgorCSAqICovCisJdTMyIGZhbHNlX2FsYXJtcyA9IG5vcm1fZmEgKiAyMDAgKiAxMDI0OworCXUzMiBtYXhfZmFsc2VfYWxhcm1zID0gTUFYX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOworCXUzMiBtaW5fZmFsc2VfYWxhcm1zID0gTUlOX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOworCXN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBpbC0+aHdfcGFyYW1zLnNlbnM7CisKKwlkYXRhID0gJihpbC0+c2Vuc2l0aXZpdHlfZGF0YSk7CisKKwlkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA9IDA7CisKKwkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYW1vbmcgYWxsIDMgcmVjZWl2ZXJzLgorCSAqIFRoaXMgaXMgYmFja2dyb3VuZCBub2lzZSwgd2hpY2ggbWF5IGluY2x1ZGUgdHJhbnNtaXNzaW9ucyBmcm9tIG90aGVyCisJICogICAgbmV0d29ya3MsIG1lYXN1cmVkIGR1cmluZyBzaWxlbmNlIGJlZm9yZSBvdXIgbmV0d29yaydzIGJlYWNvbiAqLworCXNpbGVuY2VfcnNzaV9hID0KKwkgICAgKHU4KSAoKHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSAmIEFMTF9CQU5EX0ZJTFRFUikgPj4gOCk7CisJc2lsZW5jZV9yc3NpX2IgPQorCSAgICAodTgpICgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iICYgQUxMX0JBTkRfRklMVEVSKSA+PiA4KTsKKwlzaWxlbmNlX3Jzc2lfYyA9CisJICAgICh1OCkgKChyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MgJiBBTExfQkFORF9GSUxURVIpID4+IDgpOworCisJdmFsID0gbWF4KHNpbGVuY2VfcnNzaV9iLCBzaWxlbmNlX3Jzc2lfYyk7CisJbWF4X3NpbGVuY2VfcnNzaSA9IG1heChzaWxlbmNlX3Jzc2lfYSwgKHU4KSB2YWwpOworCisJLyogU3RvcmUgc2lsZW5jZSByc3NpIGluIDIwLWJlYWNvbiBoaXN0b3J5IHRhYmxlICovCisJZGF0YS0+bnJnX3NpbGVuY2VfcnNzaVtkYXRhLT5ucmdfc2lsZW5jZV9pZHhdID0gbWF4X3NpbGVuY2VfcnNzaTsKKwlkYXRhLT5ucmdfc2lsZW5jZV9pZHgrKzsKKwlpZiAoZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID49IE5SR19OVU1fUFJFVl9TVEFUX0wpCisJCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCA9IDA7CisKKwkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYWNyb3NzIDIwIGJlYWNvbiBoaXN0b3J5ICovCisJZm9yIChpID0gMDsgaSA8IE5SR19OVU1fUFJFVl9TVEFUX0w7IGkrKykgeworCQl2YWwgPSBkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2ldOworCQlzaWxlbmNlX3JlZiA9IG1heChzaWxlbmNlX3JlZiwgdmFsKTsKKwl9CisJRF9DQUxJQigic2lsZW5jZSBhICV1LCBiICV1LCBjICV1LCAyMC1iY24gbWF4ICV1XG4iLCBzaWxlbmNlX3Jzc2lfYSwKKwkJc2lsZW5jZV9yc3NpX2IsIHNpbGVuY2VfcnNzaV9jLCBzaWxlbmNlX3JlZik7CisKKwkvKiBGaW5kIG1heCByeCBlbmVyZ3kgKG1pbiB2YWx1ZSEpIGFtb25nIGFsbCAzIHJlY2VpdmVycywKKwkgKiAgIG1lYXN1cmVkIGR1cmluZyBiZWFjb24gZnJhbWUuCisJICogU2F2ZSBpdCBpbiAxMC1iZWFjb24gaGlzdG9yeSB0YWJsZS4gKi8KKwlpID0gZGF0YS0+bnJnX2VuZXJneV9pZHg7CisJdmFsID0gbWluKHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYiwgcnhfaW5mby0+YmVhY29uX2VuZXJneV9jKTsKKwlkYXRhLT5ucmdfdmFsdWVbaV0gPSBtaW4ocnhfaW5mby0+YmVhY29uX2VuZXJneV9hLCB2YWwpOworCisJZGF0YS0+bnJnX2VuZXJneV9pZHgrKzsKKwlpZiAoZGF0YS0+bnJnX2VuZXJneV9pZHggPj0gMTApCisJCWRhdGEtPm5yZ19lbmVyZ3lfaWR4ID0gMDsKKworCS8qIEZpbmQgbWluIHJ4IGVuZXJneSAobWF4IHZhbHVlKSBhY3Jvc3MgMTAgYmVhY29uIGhpc3RvcnkuCisJICogVGhpcyBpcyB0aGUgbWluaW11bSBzaWduYWwgbGV2ZWwgdGhhdCB3ZSB3YW50IHRvIHJlY2VpdmUgd2VsbC4KKwkgKiBBZGQgYmFja29mZiAobWFyZ2luIHNvIHdlIGRvbid0IG1pc3Mgc2xpZ2h0bHkgbG93ZXIgZW5lcmd5IGZyYW1lcykuCisJICogVGhpcyBlc3RhYmxpc2hlcyBhbiB1cHBlciBib3VuZCAobWluIHZhbHVlKSBmb3IgZW5lcmd5IHRocmVzaG9sZC4gKi8KKwltYXhfbnJnX2NjayA9IGRhdGEtPm5yZ192YWx1ZVswXTsKKwlmb3IgKGkgPSAxOyBpIDwgMTA7IGkrKykKKwkJbWF4X25yZ19jY2sgPSAodTMyKSBtYXgobWF4X25yZ19jY2ssIChkYXRhLT5ucmdfdmFsdWVbaV0pKTsKKwltYXhfbnJnX2NjayArPSA2OworCisJRF9DQUxJQigicnggZW5lcmd5IGEgJXUsIGIgJXUsIGMgJXUsIDEwLWJjbiBtYXgvbWluICV1XG4iLAorCQlyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2EsIHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYiwKKwkJcnhfaW5mby0+YmVhY29uX2VuZXJneV9jLCBtYXhfbnJnX2NjayAtIDYpOworCisJLyogQ291bnQgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJlYWNvbnMgd2l0aCBmZXdlci10aGFuLWRlc2lyZWQKKwkgKiAgIGZhbHNlIGFsYXJtcy4gKi8KKwlpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykKKwkJZGF0YS0+bnVtX2luX2Nja19ub19mYSsrOworCWVsc2UKKwkJZGF0YS0+bnVtX2luX2Nja19ub19mYSA9IDA7CisJRF9DQUxJQigiY29uc2VjdXRpdmUgYmNucyB3aXRoIGZldyBmYWxzZSBhbGFybXMgPSAldVxuIiwKKwkJZGF0YS0+bnVtX2luX2Nja19ub19mYSk7CisKKwkvKiBJZiB3ZSBnb3QgdG9vIG1hbnkgZmFsc2UgYWxhcm1zIHRoaXMgdGltZSwgcmVkdWNlIHNlbnNpdGl2aXR5ICovCisJaWYgKGZhbHNlX2FsYXJtcyA+IG1heF9mYWxzZV9hbGFybXMgJiYKKwkgICAgZGF0YS0+YXV0b19jb3JyX2NjayA+IEFVVE9fQ09SUl9NQVhfVEhfQ0NLKSB7CisJCURfQ0FMSUIoIm5vcm0gRkEgJXUgPiBtYXggRkEgJXVcbiIsIGZhbHNlX2FsYXJtcywKKwkJCW1heF9mYWxzZV9hbGFybXMpOworCQlEX0NBTElCKCIuLi4gcmVkdWNpbmcgc2Vuc2l0aXZpdHlcbiIpOworCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElMX0ZBX1RPT19NQU5ZOworCQkvKiBTdG9yZSBmb3IgImZld2VyIHRoYW4gZGVzaXJlZCIgb24gbGF0ZXIgYmVhY29uICovCisJCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IHNpbGVuY2VfcmVmOworCisJCS8qIGluY3JlYXNlIGVuZXJneSB0aHJlc2hvbGQgKHJlZHVjZSBucmcgdmFsdWUpCisJCSAqICAgdG8gZGVjcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KKwkJZGF0YS0+bnJnX3RoX2NjayA9IGRhdGEtPm5yZ190aF9jY2sgLSBOUkdfU1RFUF9DQ0s7CisJCS8qIEVsc2UgaWYgd2UgZ290IGZld2VyIHRoYW4gZGVzaXJlZCwgaW5jcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KKwl9IGVsc2UgaWYgKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpIHsKKwkJZGF0YS0+bnJnX2N1cnJfc3RhdGUgPSBJTF9GQV9UT09fRkVXOworCisJCS8qIENvbXBhcmUgc2lsZW5jZSBsZXZlbCB3aXRoIHNpbGVuY2UgbGV2ZWwgZm9yIG1vc3QgcmVjZW50CisJCSAqICAgaGVhbHRoeSBudW1iZXIgb3IgdG9vIG1hbnkgZmFsc2UgYWxhcm1zICovCisJCWRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmID0KKwkJICAgIChzMzIpIGRhdGEtPm5yZ19zaWxlbmNlX3JlZiAtIChzMzIpIHNpbGVuY2VfcmVmOworCisJCURfQ0FMSUIoIm5vcm0gRkEgJXUgPCBtaW4gRkEgJXUsIHNpbGVuY2UgZGlmZiAlZFxuIiwKKwkJCWZhbHNlX2FsYXJtcywgbWluX2ZhbHNlX2FsYXJtcywKKwkJCWRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmKTsKKworCQkvKiBJbmNyZWFzZSB2YWx1ZSB0byBpbmNyZWFzZSBzZW5zaXRpdml0eSwgYnV0IG9ubHkgaWY6CisJCSAqIDFhKSBwcmV2aW91cyBiZWFjb24gZGlkICpub3QqIGhhdmUgKnRvbyBtYW55KiBmYWxzZSBhbGFybXMKKwkJICogMWIpIEFORCB0aGVyZSdzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBSeCBsZXZlbHMKKwkJICogICAgICBmcm9tIGEgcHJldmlvdXMgYmVhY29uIHdpdGggdG9vIG1hbnksIG9yIGhlYWx0aHkgIyBGQXMKKwkJICogT1IgMikgV2UndmUgc2VlbiBhIGxvdCBvZiBiZWFjb25zICgxMDApIHdpdGggdG9vIGZldworCQkgKiAgICAgICBmYWxzZSBhbGFybXMgKi8KKwkJaWYgKGRhdGEtPm5yZ19wcmV2X3N0YXRlICE9IElMX0ZBX1RPT19NQU5ZICYmCisJCSAgICAoZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYgPiBOUkdfRElGRiB8fAorCQkgICAgIGRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPiBNQVhfTlVNQkVSX0NDS19OT19GQSkpIHsKKworCQkJRF9DQUxJQigiLi4uIGluY3JlYXNpbmcgc2Vuc2l0aXZpdHlcbiIpOworCQkJLyogSW5jcmVhc2UgbnJnIHZhbHVlIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCisJCQl2YWwgPSBkYXRhLT5ucmdfdGhfY2NrICsgTlJHX1NURVBfQ0NLOworCQkJZGF0YS0+bnJnX3RoX2NjayA9IG1pbigodTMyKSByYW5nZXMtPm1pbl9ucmdfY2NrLCB2YWwpOworCQl9IGVsc2UgeworCQkJRF9DQUxJQigiLi4uIGJ1dCBub3QgY2hhbmdpbmcgc2Vuc2l0aXZpdHlcbiIpOworCQl9CisKKwkJLyogRWxzZSB3ZSBnb3QgYSBoZWFsdGh5IG51bWJlciBvZiBmYWxzZSBhbGFybXMsIGtlZXAgc3RhdHVzIHF1byAqLworCX0gZWxzZSB7CisJCURfQ0FMSUIoIiBGQSBpbiBzYWZlIHpvbmVcbiIpOworCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElMX0ZBX0dPT0RfUkFOR0U7CisKKwkJLyogU3RvcmUgZm9yIHVzZSBpbiAiZmV3ZXIgdGhhbiBkZXNpcmVkIiB3aXRoIGxhdGVyIGJlYWNvbiAqLworCQlkYXRhLT5ucmdfc2lsZW5jZV9yZWYgPSBzaWxlbmNlX3JlZjsKKworCQkvKiBJZiBwcmV2aW91cyBiZWFjb24gaGFkIHRvbyBtYW55IGZhbHNlIGFsYXJtcywKKwkJICogICBnaXZlIGl0IHNvbWUgZXh0cmEgbWFyZ2luIGJ5IHJlZHVjaW5nIHNlbnNpdGl2aXR5IGFnYWluCisJCSAqICAgKGJ1dCBkb24ndCBnbyBiZWxvdyBtZWFzdXJlZCBlbmVyZ3kgb2YgZGVzaXJlZCBSeCkgKi8KKwkJaWYgKElMX0ZBX1RPT19NQU5ZID09IGRhdGEtPm5yZ19wcmV2X3N0YXRlKSB7CisJCQlEX0NBTElCKCIuLi4gaW5jcmVhc2luZyBtYXJnaW5cbiIpOworCQkJaWYgKGRhdGEtPm5yZ190aF9jY2sgPiAobWF4X25yZ19jY2sgKyBOUkdfTUFSR0lOKSkKKwkJCQlkYXRhLT5ucmdfdGhfY2NrIC09IE5SR19NQVJHSU47CisJCQllbHNlCisJCQkJZGF0YS0+bnJnX3RoX2NjayA9IG1heF9ucmdfY2NrOworCQl9CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBlbmVyZ3kgdGhyZXNob2xkIGRvZXMgbm90IGdvIGFib3ZlIHRoZSBtZWFzdXJlZAorCSAqIGVuZXJneSBvZiB0aGUgZGVzaXJlZCBSeCBzaWduYWxzIChyZWR1Y2VkIGJ5IGJhY2tvZmYgbWFyZ2luKSwKKwkgKiBvciBlbHNlIHdlIG1pZ2h0IHN0YXJ0IG1pc3NpbmcgUnggZnJhbWVzLgorCSAqIExvd2VyIHZhbHVlIGlzIGhpZ2hlciBlbmVyZ3ksIHNvIHdlIHVzZSBtYXgoKSEKKwkgKi8KKwlkYXRhLT5ucmdfdGhfY2NrID0gbWF4KG1heF9ucmdfY2NrLCBkYXRhLT5ucmdfdGhfY2NrKTsKKwlEX0NBTElCKCJuZXcgbnJnX3RoX2NjayAldVxuIiwgZGF0YS0+bnJnX3RoX2Njayk7CisKKwlkYXRhLT5ucmdfcHJldl9zdGF0ZSA9IGRhdGEtPm5yZ19jdXJyX3N0YXRlOworCisJLyogQXV0by1jb3JyZWxhdGlvbiBDQ0sgYWxnb3JpdGhtICovCisJaWYgKGZhbHNlX2FsYXJtcyA+IG1pbl9mYWxzZV9hbGFybXMpIHsKKworCQkvKiBpbmNyZWFzZSBhdXRvX2NvcnIgdmFsdWVzIHRvIGRlY3JlYXNlIHNlbnNpdGl2aXR5CisJCSAqIHNvIHRoZSBEU1Agd29uJ3QgYmUgZGlzdHVyYmVkIGJ5IHRoZSBub2lzZQorCQkgKi8KKwkJaWYgKGRhdGEtPmF1dG9fY29ycl9jY2sgPCBBVVRPX0NPUlJfTUFYX1RIX0NDSykKKwkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPSBBVVRPX0NPUlJfTUFYX1RIX0NDSyArIDE7CisJCWVsc2UgeworCQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2NjayArIEFVVE9fQ09SUl9TVEVQX0NDSzsKKwkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPQorCQkJICAgIG1pbigodTMyKSByYW5nZXMtPmF1dG9fY29ycl9tYXhfY2NrLCB2YWwpOworCQl9CisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjICsgQVVUT19DT1JSX1NURVBfQ0NLOworCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9CisJCSAgICBtaW4oKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X2Nja19tcmMsIHZhbCk7CisJfSBlbHNlIGlmIChmYWxzZV9hbGFybXMgPCBtaW5fZmFsc2VfYWxhcm1zICYmCisJCSAgIChkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA+IE5SR19ESUZGIHx8CisJCSAgICBkYXRhLT5udW1faW5fY2NrX25vX2ZhID4gTUFYX05VTUJFUl9DQ0tfTk9fRkEpKSB7CisKKwkJLyogRGVjcmVhc2UgYXV0b19jb3JyIHZhbHVlcyB0byBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfY2NrIC0gQVVUT19DT1JSX1NURVBfQ0NLOworCQlkYXRhLT5hdXRvX2NvcnJfY2NrID0gbWF4KCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21pbl9jY2ssIHZhbCk7CisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjIC0gQVVUT19DT1JSX1NURVBfQ0NLOworCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9CisJCSAgICBtYXgoKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWluX2Nja19tcmMsIHZhbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5zX2F1dG9fY29ycl9vZmRtKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG5vcm1fZmEsIHUzMiByeF9lbmFibGVfdGltZSkKK3sKKwl1MzIgdmFsOworCXUzMiBmYWxzZV9hbGFybXMgPSBub3JtX2ZhICogMjAwICogMTAyNDsKKwl1MzIgbWF4X2ZhbHNlX2FsYXJtcyA9IE1BWF9GQV9PRkRNICogcnhfZW5hYmxlX3RpbWU7CisJdTMyIG1pbl9mYWxzZV9hbGFybXMgPSBNSU5fRkFfT0ZETSAqIHJ4X2VuYWJsZV90aW1lOworCXN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBpbC0+aHdfcGFyYW1zLnNlbnM7CisKKwlkYXRhID0gJihpbC0+c2Vuc2l0aXZpdHlfZGF0YSk7CisKKwkvKiBJZiB3ZSBnb3QgdG9vIG1hbnkgZmFsc2UgYWxhcm1zIHRoaXMgdGltZSwgcmVkdWNlIHNlbnNpdGl2aXR5ICovCisJaWYgKGZhbHNlX2FsYXJtcyA+IG1heF9mYWxzZV9hbGFybXMpIHsKKworCQlEX0NBTElCKCJub3JtIEZBICV1ID4gbWF4IEZBICV1KVxuIiwgZmFsc2VfYWxhcm1zLAorCQkJbWF4X2ZhbHNlX2FsYXJtcyk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG0gKyBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbSA9CisJCSAgICBtaW4oKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG0sIHZhbCk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjICsgQVVUT19DT1JSX1NURVBfT0ZETTsKKwkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjID0KKwkJICAgIG1pbigodTMyKSByYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbV9tcmMsIHZhbCk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1feDEgKyBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSA9CisJCSAgICBtaW4oKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG1feDEsIHZhbCk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxICsgQVVUT19DT1JSX1NURVBfT0ZETTsKKwkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxID0KKwkJICAgIG1pbigodTMyKSByYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbV9tcmNfeDEsIHZhbCk7CisJfQorCisJLyogRWxzZSBpZiB3ZSBnb3QgZmV3ZXIgdGhhbiBkZXNpcmVkLCBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLworCWVsc2UgaWYgKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpIHsKKworCQlEX0NBTElCKCJub3JtIEZBICV1IDwgbWluIEZBICV1XG4iLCBmYWxzZV9hbGFybXMsCisJCQltaW5fZmFsc2VfYWxhcm1zKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbSAtIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtID0KKwkJICAgIG1heCgodTMyKSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbSwgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgPQorCQkgICAgbWF4KCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yYywgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSAtIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxID0KKwkJICAgIG1heCgodTMyKSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV94MSwgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPQorCQkgICAgbWF4KCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yY194MSwgdmFsKTsKKwl9IGVsc2UgeworCQlEX0NBTElCKCJtaW4gRkEgJXUgPCBub3JtIEZBICV1IDwgbWF4IEZBICV1IE9LXG4iLAorCQkJbWluX2ZhbHNlX2FsYXJtcywgZmFsc2VfYWxhcm1zLCBtYXhfZmFsc2VfYWxhcm1zKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcHJlcGFyZV9sZWdhY3lfc2Vuc2l0aXZpdHlfdGJsKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgICAgICBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSwKKwkJCQkgICAgICBfX2xlMTYgKnRibCkKK3sKKwl0YmxbSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+YXV0b19jb3JyX29mZG0pOworCXRibFtIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX01SQ19JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjKTsKKwl0YmxbSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+YXV0b19jb3JyX29mZG1feDEpOworCXRibFtIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxKTsKKworCXRibFtIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lEWF0gPQorCSAgICBjcHVfdG9fbGUxNigodTE2KSBkYXRhLT5hdXRvX2NvcnJfY2NrKTsKKwl0YmxbSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSURYXSA9CisJICAgIGNwdV90b19sZTE2KCh1MTYpIGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjKTsKKworCXRibFtIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYXSA9IGNwdV90b19sZTE2KCh1MTYpIGRhdGEtPm5yZ190aF9jY2spOworCXRibFtIRF9NSU5fRU5FUkdZX09GRE1fREVUX0lEWF0gPSBjcHVfdG9fbGUxNigodTE2KSBkYXRhLT5ucmdfdGhfb2ZkbSk7CisKKwl0YmxbSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoZGF0YS0+YmFya2VyX2NvcnJfdGhfbWluKTsKKwl0YmxbSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9NUkNfSURYXSA9CisJICAgIGNwdV90b19sZTE2KGRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmMpOworCXRibFtIRF9PRkRNX0VORVJHWV9USF9JTl9JRFhdID0gY3B1X3RvX2xlMTYoZGF0YS0+bnJnX3RoX2NjYSk7CisKKwlEX0NBTElCKCJvZmRtOiBhYyAldSBtcmMgJXUgeDEgJXUgbXJjX3gxICV1IHRocmVzaCAldVxuIiwKKwkJZGF0YS0+YXV0b19jb3JyX29mZG0sIGRhdGEtPmF1dG9fY29ycl9vZmRtX21yYywKKwkJZGF0YS0+YXV0b19jb3JyX29mZG1feDEsIGRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSwKKwkJZGF0YS0+bnJnX3RoX29mZG0pOworCisJRF9DQUxJQigiY2NrOiBhYyAldSBtcmMgJXUgdGhyZXNoICV1XG4iLCBkYXRhLT5hdXRvX2NvcnJfY2NrLAorCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYywgZGF0YS0+bnJnX3RoX2Njayk7Cit9CisKKy8qIFByZXBhcmUgYSBDX1NFTlNJVElWSVRZLCBzZW5kIHRvIHVDb2RlIGlmIHZhbHVlcyBoYXZlIGNoYW5nZWQgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5zaXRpdml0eV93cml0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2NtZCBjbWQ7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWRfb3V0ID0geworCQkuaWQgPSBDX1NFTlNJVElWSVRZLAorCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQpLAorCQkuZmxhZ3MgPSBDTURfQVNZTkMsCisJCS5kYXRhID0gJmNtZCwKKwl9OworCisJZGF0YSA9ICYoaWwtPnNlbnNpdGl2aXR5X2RhdGEpOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKworCWlsNDk2NV9wcmVwYXJlX2xlZ2FjeV9zZW5zaXRpdml0eV90YmwoaWwsIGRhdGEsICZjbWQudGFibGVbMF0pOworCisJLyogVXBkYXRlIHVDb2RlJ3MgIndvcmsiIHRhYmxlLCBhbmQgY29weSBpdCB0byBEU1AgKi8KKwljbWQuY29udHJvbCA9IENfU0VOU0lUSVZJVFlfQ09OVFJPTF9XT1JLX1RCTDsKKworCS8qIERvbid0IHNlbmQgY29tbWFuZCB0byB1Q29kZSBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCisJaWYgKCFtZW1jbXAKKwkgICAgKCZjbWQudGFibGVbMF0sICYoaWwtPnNlbnNpdGl2aXR5X3RibFswXSksCisJICAgICBzaXplb2YodTE2KSAqIEhEX1RCTF9TSVpFKSkgeworCQlEX0NBTElCKCJObyBjaGFuZ2UgaW4gQ19TRU5TSVRJVklUWVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIENvcHkgdGFibGUgZm9yIGNvbXBhcmlzb24gbmV4dCB0aW1lICovCisJbWVtY3B5KCYoaWwtPnNlbnNpdGl2aXR5X3RibFswXSksICYoY21kLnRhYmxlWzBdKSwKKwkgICAgICAgc2l6ZW9mKHUxNikgKiBIRF9UQkxfU0laRSk7CisKKwlyZXR1cm4gaWxfc2VuZF9jbWQoaWwsICZjbWRfb3V0KTsKK30KKwordm9pZAoraWw0OTY1X2luaXRfc2Vuc2l0aXZpdHkoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQgPSAwOworCWludCBpOworCXN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBpbC0+aHdfcGFyYW1zLnNlbnM7CisKKwlpZiAoaWwtPmRpc2FibGVfc2Vuc19jYWwpCisJCXJldHVybjsKKworCURfQ0FMSUIoIlN0YXJ0IGlsNDk2NV9pbml0X3NlbnNpdGl2aXR5XG4iKTsKKworCS8qIENsZWFyIGRyaXZlcidzIHNlbnNpdGl2aXR5IGFsZ28gZGF0YSAqLworCWRhdGEgPSAmKGlsLT5zZW5zaXRpdml0eV9kYXRhKTsKKworCWlmIChyYW5nZXMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSkpOworCisJZGF0YS0+bnVtX2luX2Nja19ub19mYSA9IDA7CisJZGF0YS0+bnJnX2N1cnJfc3RhdGUgPSBJTF9GQV9UT09fTUFOWTsKKwlkYXRhLT5ucmdfcHJldl9zdGF0ZSA9IElMX0ZBX1RPT19NQU5ZOworCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IDA7CisJZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID0gMDsKKwlkYXRhLT5ucmdfZW5lcmd5X2lkeCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJZGF0YS0+bnJnX3ZhbHVlW2ldID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOUkdfTlVNX1BSRVZfU1RBVF9MOyBpKyspCisJCWRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbaV0gPSAwOworCisJZGF0YS0+YXV0b19jb3JyX29mZG0gPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbTsKKwlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV9tcmM7CisJZGF0YS0+YXV0b19jb3JyX29mZG1feDEgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV94MTsKKwlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV9tcmNfeDE7CisJZGF0YS0+YXV0b19jb3JyX2NjayA9IEFVVE9fQ09SUl9DQ0tfTUlOX1ZBTF9ERUY7CisJZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fY2NrX21yYzsKKwlkYXRhLT5ucmdfdGhfY2NrID0gcmFuZ2VzLT5ucmdfdGhfY2NrOworCWRhdGEtPm5yZ190aF9vZmRtID0gcmFuZ2VzLT5ucmdfdGhfb2ZkbTsKKwlkYXRhLT5iYXJrZXJfY29ycl90aF9taW4gPSByYW5nZXMtPmJhcmtlcl9jb3JyX3RoX21pbjsKKwlkYXRhLT5iYXJrZXJfY29ycl90aF9taW5fbXJjID0gcmFuZ2VzLT5iYXJrZXJfY29ycl90aF9taW5fbXJjOworCWRhdGEtPm5yZ190aF9jY2EgPSByYW5nZXMtPm5yZ190aF9jY2E7CisKKwlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtID0gMDsKKwlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtID0gMDsKKwlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPSAwOworCWRhdGEtPmxhc3RfZmFfY250X2NjayA9IDA7CisKKwlyZXQgfD0gaWw0OTY1X3NlbnNpdGl2aXR5X3dyaXRlKGlsKTsKKwlEX0NBTElCKCI8PHJldHVybiAweCVYXG4iLCByZXQpOworfQorCit2b2lkCitpbDQ5NjVfc2Vuc2l0aXZpdHlfY2FsaWJyYXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCB2b2lkICpyZXNwKQoreworCXUzMiByeF9lbmFibGVfdGltZTsKKwl1MzIgZmFfY2NrOworCXUzMiBmYV9vZmRtOworCXUzMiBiYWRfcGxjcF9jY2s7CisJdTMyIGJhZF9wbGNwX29mZG07CisJdTMyIG5vcm1fZmFfb2ZkbTsKKwl1MzIgbm9ybV9mYV9jY2s7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOworCXN0cnVjdCBzdGF0c19yeF9ub25fcGh5ICpyeF9pbmZvOworCXN0cnVjdCBzdGF0c19yeF9waHkgKm9mZG0sICpjY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3RhdHNfZ2VuZXJhbF9kYXRhIHN0YXRpczsKKworCWlmIChpbC0+ZGlzYWJsZV9zZW5zX2NhbCkKKwkJcmV0dXJuOworCisJZGF0YSA9ICYoaWwtPnNlbnNpdGl2aXR5X2RhdGEpOworCisJaWYgKCFpbF9pc19hbnlfYXNzb2NpYXRlZChpbCkpIHsKKwkJRF9DQUxJQigiPDwgLSBub3QgYXNzb2NpYXRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXJ4X2luZm8gPSAmKCgoc3RydWN0IGlsX25vdGlmX3N0YXRzICopcmVzcCktPnJ4LmdlbmVyYWwpOworCW9mZG0gPSAmKCgoc3RydWN0IGlsX25vdGlmX3N0YXRzICopcmVzcCktPnJ4Lm9mZG0pOworCWNjayA9ICYoKChzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgKilyZXNwKS0+cnguY2NrKTsKKworCWlmIChyeF9pbmZvLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnICE9IElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSkgeworCQlEX0NBTElCKCI8PCBpbnZhbGlkIGRhdGEuXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEV4dHJhY3QgU3RhdGlzdGljczogKi8KKwlyeF9lbmFibGVfdGltZSA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmNoYW5uZWxfbG9hZCk7CisJZmFfY2NrID0gbGUzMl90b19jcHUoY2NrLT5mYWxzZV9hbGFybV9jbnQpOworCWZhX29mZG0gPSBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpOworCWJhZF9wbGNwX2NjayA9IGxlMzJfdG9fY3B1KGNjay0+cGxjcF9lcnIpOworCWJhZF9wbGNwX29mZG0gPSBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2Vycik7CisKKwlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9hID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKTsKKwlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9iID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKTsKKwlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9jID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jKTsKKwlzdGF0aXMuYmVhY29uX2VuZXJneV9hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9hKTsKKwlzdGF0aXMuYmVhY29uX2VuZXJneV9iID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9iKTsKKwlzdGF0aXMuYmVhY29uX2VuZXJneV9jID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9jKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlEX0NBTElCKCJyeF9lbmFibGVfdGltZSA9ICV1IHVzZWNzXG4iLCByeF9lbmFibGVfdGltZSk7CisKKwlpZiAoIXJ4X2VuYWJsZV90aW1lKSB7CisJCURfQ0FMSUIoIjw8IFJYIEVuYWJsZSBUaW1lID09IDAhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoZXNlIHN0YXRzIGluY3JlYXNlIG1vbm90b25pY2FsbHksIGFuZCBkbyBub3QgcmVzZXQKKwkgKiAgIGF0IGVhY2ggYmVhY29uLiAgQ2FsY3VsYXRlIGRpZmZlcmVuY2UgZnJvbSBsYXN0IHZhbHVlLCBvciBqdXN0CisJICogICB1c2UgdGhlIG5ldyBzdGF0cyB2YWx1ZSBpZiBpdCBoYXMgcmVzZXQgb3Igd3JhcHBlZCBhcm91bmQuICovCisJaWYgKGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayA+IGJhZF9wbGNwX2NjaykKKwkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrID0gYmFkX3BsY3BfY2NrOworCWVsc2UgeworCQliYWRfcGxjcF9jY2sgLT0gZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrOworCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgKz0gYmFkX3BsY3BfY2NrOworCX0KKworCWlmIChkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtID4gYmFkX3BsY3Bfb2ZkbSkKKwkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSA9IGJhZF9wbGNwX29mZG07CisJZWxzZSB7CisJCWJhZF9wbGNwX29mZG0gLT0gZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbTsKKwkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSArPSBiYWRfcGxjcF9vZmRtOworCX0KKworCWlmIChkYXRhLT5sYXN0X2ZhX2NudF9vZmRtID4gZmFfb2ZkbSkKKwkJZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbSA9IGZhX29mZG07CisJZWxzZSB7CisJCWZhX29mZG0gLT0gZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbTsKKwkJZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbSArPSBmYV9vZmRtOworCX0KKworCWlmIChkYXRhLT5sYXN0X2ZhX2NudF9jY2sgPiBmYV9jY2spCisJCWRhdGEtPmxhc3RfZmFfY250X2NjayA9IGZhX2NjazsKKwllbHNlIHsKKwkJZmFfY2NrIC09IGRhdGEtPmxhc3RfZmFfY250X2NjazsKKwkJZGF0YS0+bGFzdF9mYV9jbnRfY2NrICs9IGZhX2NjazsKKwl9CisKKwkvKiBUb3RhbCBhYm9ydGVkIHNpZ25hbCBsb2NrcyAqLworCW5vcm1fZmFfb2ZkbSA9IGZhX29mZG0gKyBiYWRfcGxjcF9vZmRtOworCW5vcm1fZmFfY2NrID0gZmFfY2NrICsgYmFkX3BsY3BfY2NrOworCisJRF9DQUxJQigiY2NrOiBmYSAldSBiYWRwICV1ICBvZmRtOiBmYSAldSBiYWRwICV1XG4iLCBmYV9jY2ssCisJCWJhZF9wbGNwX2NjaywgZmFfb2ZkbSwgYmFkX3BsY3Bfb2ZkbSk7CisKKwlpbDQ5NjVfc2Vuc19hdXRvX2NvcnJfb2ZkbShpbCwgbm9ybV9mYV9vZmRtLCByeF9lbmFibGVfdGltZSk7CisJaWw0OTY1X3NlbnNfZW5lcmd5X2NjayhpbCwgbm9ybV9mYV9jY2ssIHJ4X2VuYWJsZV90aW1lLCAmc3RhdGlzKTsKKworCWlsNDk2NV9zZW5zaXRpdml0eV93cml0ZShpbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsNDk2NV9maW5kX2ZpcnN0X2NoYWluKHU4IG1hc2spCit7CisJaWYgKG1hc2sgJiBBTlRfQSkKKwkJcmV0dXJuIENIQUlOX0E7CisJaWYgKG1hc2sgJiBBTlRfQikKKwkJcmV0dXJuIENIQUlOX0I7CisJcmV0dXJuIENIQUlOX0M7Cit9CisKKy8qKgorICogUnVuIGRpc2Nvbm5lY3RlZCBhbnRlbm5hIGFsZ29yaXRobSB0byBmaW5kIG91dCB3aGljaCBhbnRlbm5hcyBhcmUKKyAqIGRpc2Nvbm5lY3RlZC4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9maW5kX2Rpc2Nvbm5fYW50ZW5uYShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiAqIGF2ZXJhZ2Vfc2lnLAorCQkJICAgIHN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhKQoreworCXUzMiBhY3RpdmVfY2hhaW5zID0gMDsKKwl1MzIgbWF4X2F2ZXJhZ2Vfc2lnOworCXUxNiBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pOworCXU4IG51bV90eF9jaGFpbnM7CisJdTggZmlyc3RfY2hhaW47CisJdTE2IGkgPSAwOworCisJYXZlcmFnZV9zaWdbMF0gPQorCSAgICBkYXRhLT5jaGFpbl9zaWduYWxfYSAvCisJICAgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKwlhdmVyYWdlX3NpZ1sxXSA9CisJICAgIGRhdGEtPmNoYWluX3NpZ25hbF9iIC8KKwkgICAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOworCWF2ZXJhZ2Vfc2lnWzJdID0KKwkgICAgZGF0YS0+Y2hhaW5fc2lnbmFsX2MgLworCSAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7CisKKwlpZiAoYXZlcmFnZV9zaWdbMF0gPj0gYXZlcmFnZV9zaWdbMV0pIHsKKwkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMF07CisJCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAwOworCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7CisJfSBlbHNlIHsKKwkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMV07CisJCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAxOworCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7CisJfQorCisJaWYgKGF2ZXJhZ2Vfc2lnWzJdID49IG1heF9hdmVyYWdlX3NpZykgeworCQltYXhfYXZlcmFnZV9zaWcgPSBhdmVyYWdlX3NpZ1syXTsKKwkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSA9IDI7CisJCWFjdGl2ZV9jaGFpbnMgPSAoMSA8PCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKKwl9CisKKwlEX0NBTElCKCJhdmVyYWdlX3NpZzogYSAlZCBiICVkIGMgJWRcbiIsIGF2ZXJhZ2Vfc2lnWzBdLCBhdmVyYWdlX3NpZ1sxXSwKKwkJYXZlcmFnZV9zaWdbMl0pOworCURfQ0FMSUIoIm1heF9hdmVyYWdlX3NpZyA9ICVkLCBhbnRlbm5hICVkXG4iLCBtYXhfYXZlcmFnZV9zaWcsCisJCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpOworCisJLyogQ29tcGFyZSBzaWduYWwgc3RyZW5ndGhzIGZvciBhbGwgMyByZWNlaXZlcnMuICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgeworCQlpZiAoaSAhPSBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKSB7CisJCQlzMzIgcnNzaV9kZWx0YSA9IChtYXhfYXZlcmFnZV9zaWcgLSBhdmVyYWdlX3NpZ1tpXSk7CisKKwkJCS8qIElmIHNpZ25hbCBpcyB2ZXJ5IHdlYWssIGNvbXBhcmVkIHdpdGgKKwkJCSAqIHN0cm9uZ2VzdCwgbWFyayBpdCBhcyBkaXNjb25uZWN0ZWQuICovCisJCQlpZiAocnNzaV9kZWx0YSA+IE1BWElNVU1fQUxMT1dFRF9QQVRITE9TUykKKwkJCQlkYXRhLT5kaXNjb25uX2FycmF5W2ldID0gMTsKKwkJCWVsc2UKKwkJCQlhY3RpdmVfY2hhaW5zIHw9ICgxIDw8IGkpOworCQkJRF9DQUxJQigiaSA9ICVkICByc3NpRGVsdGEgPSAlZCAgIgorCQkJCSJkaXNjb25uX2FycmF5W2ldID0gJWRcbiIsIGksIHJzc2lfZGVsdGEsCisJCQkJZGF0YS0+ZGlzY29ubl9hcnJheVtpXSk7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZSBhYm92ZSBhbGdvcml0aG0gc29tZXRpbWVzIGZhaWxzIHdoZW4gdGhlIHVjb2RlCisJICogcmVwb3J0cyAwIGZvciBhbGwgY2hhaW5zLiBJdCdzIG5vdCBjbGVhciB3aHkgdGhhdAorCSAqIGhhcHBlbnMgdG8gc3RhcnQgd2l0aCwgYnV0IGl0IGlzIHRoZW4gY2F1c2luZyB0cm91YmxlCisJICogYmVjYXVzZSB0aGlzIGNhbiBtYWtlIHVzIGVuYWJsZSBtb3JlIGNoYWlucyB0aGFuIHRoZQorCSAqIGhhcmR3YXJlIHJlYWxseSBoYXMuCisJICoKKwkgKiBUbyBiZSBzYWZlLCBzaW1wbHkgbWFzayBvdXQgYW55IGNoYWlucyB0aGF0IHdlIGtub3cKKwkgKiBhcmUgbm90IG9uIHRoZSBkZXZpY2UuCisJICovCisJYWN0aXZlX2NoYWlucyAmPSBpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudDsKKworCW51bV90eF9jaGFpbnMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfQ0hBSU5TOyBpKyspIHsKKwkJLyogbG9vcHMgb24gYWxsIHRoZSBiaXRzIG9mCisJCSAqIGlsLT5od19zZXR0aW5nLnZhbGlkX3R4X2FudCAqLworCQl1OCBhbnRfbXNrID0gKDEgPDwgaSk7CisJCWlmICghKGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgYW50X21zaykpCisJCQljb250aW51ZTsKKworCQludW1fdHhfY2hhaW5zKys7CisJCWlmIChkYXRhLT5kaXNjb25uX2FycmF5W2ldID09IDApCisJCQkvKiB0aGVyZSBpcyBhIFR4IGFudGVubmEgY29ubmVjdGVkICovCisJCQlicmVhazsKKwkJaWYgKG51bV90eF9jaGFpbnMgPT0gaWwtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtICYmCisJCSAgICBkYXRhLT5kaXNjb25uX2FycmF5W2ldKSB7CisJCQkvKgorCQkJICogSWYgYWxsIGNoYWlucyBhcmUgZGlzY29ubmVjdGVkCisJCQkgKiBjb25uZWN0IHRoZSBmaXJzdCB2YWxpZCB0eCBjaGFpbgorCQkJICovCisJCQlmaXJzdF9jaGFpbiA9CisJCQkgICAgaWw0OTY1X2ZpbmRfZmlyc3RfY2hhaW4oaWwtPmNmZy0+dmFsaWRfdHhfYW50KTsKKwkJCWRhdGEtPmRpc2Nvbm5fYXJyYXlbZmlyc3RfY2hhaW5dID0gMDsKKwkJCWFjdGl2ZV9jaGFpbnMgfD0gQklUKGZpcnN0X2NoYWluKTsKKwkJCURfQ0FMSUIoIkFsbCBUeCBjaGFpbnMgYXJlIGRpc2Nvbm5lY3RlZCIKKwkJCQkiLSBkZWNsYXJlICVkIGFzIGNvbm5lY3RlZFxuIiwgZmlyc3RfY2hhaW4pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYWN0aXZlX2NoYWlucyAhPSBpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudCAmJgorCSAgICBhY3RpdmVfY2hhaW5zICE9IGlsLT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnMpCisJCURfQ0FMSUIoIkRldGVjdGVkIHRoYXQgbm90IGFsbCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkISAiCisJCQkiQ29ubmVjdGVkOiAlI3gsIHZhbGlkOiAlI3guXG4iLCBhY3RpdmVfY2hhaW5zLAorCQkJaWwtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQpOworCisJLyogU2F2ZSBmb3IgdXNlIHdpdGhpbiBSWE9OLCBUWCwgU0NBTiBjb21tYW5kcywgZXRjLiAqLworCWRhdGEtPmFjdGl2ZV9jaGFpbnMgPSBhY3RpdmVfY2hhaW5zOworCURfQ0FMSUIoImFjdGl2ZV9jaGFpbnMgKGJpdHdpc2UpID0gMHgleFxuIiwgYWN0aXZlX2NoYWlucyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfZ2Fpbl9jb21wdXRhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiAqIGF2ZXJhZ2Vfbm9pc2UsCisJCQl1MTYgbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pLCB1MzIgbWluX2F2ZXJhZ2Vfbm9pc2UsCisJCQl1OCBkZWZhdWx0X2NoYWluKQoreworCWludCBpLCByZXQ7CisJc3RydWN0IGlsX2NoYWluX25vaXNlX2RhdGEgKmRhdGEgPSAmaWwtPmNoYWluX25vaXNlX2RhdGE7CisKKwlkYXRhLT5kZWx0YV9nYWluX2NvZGVbbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pXSA9IDA7CisKKwlmb3IgKGkgPSBkZWZhdWx0X2NoYWluOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7CisJCXMzMiBkZWx0YV9nID0gMDsKKworCQlpZiAoIWRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0gJiYKKwkJICAgIGRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9PQorCQkgICAgQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTCkgeworCQkJZGVsdGFfZyA9IGF2ZXJhZ2Vfbm9pc2VbaV0gLSBtaW5fYXZlcmFnZV9ub2lzZTsKKwkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9ICh1OCkgKChkZWx0YV9nICogMTApIC8gMTUpOworCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0KKwkJCSAgICBtaW4oZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldLAorCQkJCSh1OCkgQ0hBSU5fTk9JU0VfTUFYX0RFTFRBX0dBSU5fQ09ERSk7CisKKwkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9CisJCQkgICAgKGRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSB8ICgxIDw8IDIpKTsKKwkJfSBlbHNlIHsKKwkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9IDA7CisJCX0KKwl9CisJRF9DQUxJQigiZGVsdGFfZ2Fpbl9jb2RlczogYSAlZCBiICVkIGMgJWRcbiIsIGRhdGEtPmRlbHRhX2dhaW5fY29kZVswXSwKKwkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzFdLCBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMl0pOworCisJLyogRGlmZmVyZW50aWFsIGdhaW4gZ2V0cyBzZW50IHRvIHVDb2RlIG9ubHkgb25jZSAqLworCWlmICghZGF0YS0+cmFkaW9fd3JpdGUpIHsKKwkJc3RydWN0IGlsX2NhbGliX2RpZmZfZ2Fpbl9jbWQgY21kOworCQlkYXRhLT5yYWRpb193cml0ZSA9IDE7CisKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJY21kLmhkci5vcF9jb2RlID0gSUxfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01EOworCQljbWQuZGlmZl9nYWluX2EgPSBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMF07CisJCWNtZC5kaWZmX2dhaW5fYiA9IGRhdGEtPmRlbHRhX2dhaW5fY29kZVsxXTsKKwkJY21kLmRpZmZfZ2Fpbl9jID0gZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzJdOworCQlyZXQgPSBpbF9zZW5kX2NtZF9wZHUoaWwsIENfUEhZX0NBTElCUkFUSU9OLCBzaXplb2YoY21kKSwgJmNtZCk7CisJCWlmIChyZXQpCisJCQlEX0NBTElCKCJmYWlsIHNlbmRpbmcgY21kICIgIkNfUEhZX0NBTElCUkFUSU9OXG4iKTsKKworCQkvKiBUT0RPIHdlIG1pZ2h0IHdhbnQgcmVjYWxjdWxhdGUKKwkJICogcnhfY2hhaW4gaW4gcnhvbiBjbWQgKi8KKworCQkvKiBNYXJrIHNvIHdlIHJ1biB0aGlzIGFsZ28gb25seSBvbmNlISAqLworCQlkYXRhLT5zdGF0ZSA9IElMX0NIQUlOX05PSVNFX0NBTElCUkFURUQ7CisJfQorfQorCisvKgorICogQWNjdW11bGF0ZSAxNiBiZWFjb25zIG9mIHNpZ25hbCBhbmQgbm9pc2Ugc3RhdHMgZm9yIGVhY2ggb2YKKyAqICAgMyByZWNlaXZlcnMvYW50ZW5uYXMvcngtY2hhaW5zLCB0aGVuIGZpZ3VyZSBvdXQ6CisgKiAxKSAgV2hpY2ggYW50ZW5uYXMgYXJlIGNvbm5lY3RlZC4KKyAqIDIpICBEaWZmZXJlbnRpYWwgcnggZ2FpbiBzZXR0aW5ncyB0byBiYWxhbmNlIHRoZSAzIHJlY2VpdmVycy4KKyAqLwordm9pZAoraWw0OTY1X2NoYWluX25vaXNlX2NhbGlicmF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgdm9pZCAqc3RhdF9yZXNwKQoreworCXN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gTlVMTDsKKworCXUzMiBjaGFpbl9ub2lzZV9hOworCXUzMiBjaGFpbl9ub2lzZV9iOworCXUzMiBjaGFpbl9ub2lzZV9jOworCXUzMiBjaGFpbl9zaWdfYTsKKwl1MzIgY2hhaW5fc2lnX2I7CisJdTMyIGNoYWluX3NpZ19jOworCXUzMiBhdmVyYWdlX3NpZ1tOVU1fUlhfQ0hBSU5TXSA9IHsgSU5JVElBTElaQVRJT05fVkFMVUUgfTsKKwl1MzIgYXZlcmFnZV9ub2lzZVtOVU1fUlhfQ0hBSU5TXSA9IHsgSU5JVElBTElaQVRJT05fVkFMVUUgfTsKKwl1MzIgbWluX2F2ZXJhZ2Vfbm9pc2UgPSBNSU5fQVZFUkFHRV9OT0lTRV9NQVhfVkFMVUU7CisJdTE2IG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSA9IElOSVRJQUxJWkFUSU9OX1ZBTFVFOworCXUxNiBpID0gMDsKKwl1MTYgcnhvbl9jaG51bSA9IElOSVRJQUxJWkFUSU9OX1ZBTFVFOworCXUxNiBzdGF0X2NobnVtID0gSU5JVElBTElaQVRJT05fVkFMVUU7CisJdTggcnhvbl9iYW5kMjQ7CisJdTggc3RhdF9iYW5kMjQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3RhdHNfcnhfbm9uX3BoeSAqcnhfaW5mbzsKKworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJaWYgKGlsLT5kaXNhYmxlX2NoYWluX25vaXNlX2NhbCkKKwkJcmV0dXJuOworCisJZGF0YSA9ICYoaWwtPmNoYWluX25vaXNlX2RhdGEpOworCisJLyoKKwkgKiBBY2N1bXVsYXRlIGp1c3QgdGhlIGZpcnN0ICJjaGFpbl9ub2lzZV9udW1fYmVhY29ucyIgYWZ0ZXIKKwkgKiB0aGUgZmlyc3QgYXNzb2NpYXRpb24sIHRoZW4gd2UncmUgZG9uZSBmb3JldmVyLgorCSAqLworCWlmIChkYXRhLT5zdGF0ZSAhPSBJTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFKSB7CisJCWlmIChkYXRhLT5zdGF0ZSA9PSBJTF9DSEFJTl9OT0lTRV9BTElWRSkKKwkJCURfQ0FMSUIoIldhaXQgZm9yIG5vaXNlIGNhbGliIHJlc2V0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJcnhfaW5mbyA9ICYoKChzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgKilzdGF0X3Jlc3ApLT5yeC5nZW5lcmFsKTsKKworCWlmIChyeF9pbmZvLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnICE9IElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSkgeworCQlEX0NBTElCKCIgPDwgSW50ZXJmZXJlbmNlIGRhdGEgdW5hdmFpbGFibGVcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJcnhvbl9iYW5kMjQgPSAhIShjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spOworCXJ4b25fY2hudW0gPSBsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCk7CisKKwlzdGF0X2JhbmQyNCA9CisJICAgICEhKCgoc3RydWN0IGlsX25vdGlmX3N0YXRzICopc3RhdF9yZXNwKS0+CisJICAgICAgIGZsYWcgJiBTVEFUU19SRVBMWV9GTEdfQkFORF8yNEdfTVNLKTsKKwlzdGF0X2NobnVtID0KKwkgICAgbGUzMl90b19jcHUoKChzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgKilzdGF0X3Jlc3ApLT5mbGFnKSA+PiAxNjsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhY2N1bXVsYXRlIGRhdGEgZm9yIGp1c3QgdGhlIGFzc29jaWF0ZWQgY2hhbm5lbAorCSAqICAgKGV2ZW4gaWYgc2Nhbm5pbmcpLiAqLworCWlmIChyeG9uX2NobnVtICE9IHN0YXRfY2hudW0gfHwgcnhvbl9iYW5kMjQgIT0gc3RhdF9iYW5kMjQpIHsKKwkJRF9DQUxJQigiU3RhdHMgbm90IGZyb20gY2hhbj0lZCwgYmFuZDI0PSVkXG4iLCByeG9uX2NobnVtLAorCQkJcnhvbl9iYW5kMjQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgQWNjdW11bGF0ZSBiZWFjb24gc3RhdHMgdmFsdWVzIGFjcm9zcworCSAqICJjaGFpbl9ub2lzZV9udW1fYmVhY29ucyIKKwkgKi8KKwljaGFpbl9ub2lzZV9hID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKSAmIElOX0JBTkRfRklMVEVSOworCWNoYWluX25vaXNlX2IgPQorCSAgICBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7CisJY2hhaW5fbm9pc2VfYyA9CisJICAgIGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYykgJiBJTl9CQU5EX0ZJTFRFUjsKKworCWNoYWluX3NpZ19hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3Jzc2lfYSkgJiBJTl9CQU5EX0ZJTFRFUjsKKwljaGFpbl9zaWdfYiA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7CisJY2hhaW5fc2lnX2MgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fcnNzaV9jKSAmIElOX0JBTkRfRklMVEVSOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWRhdGEtPmJlYWNvbl9jb3VudCsrOworCisJZGF0YS0+Y2hhaW5fbm9pc2VfYSA9IChjaGFpbl9ub2lzZV9hICsgZGF0YS0+Y2hhaW5fbm9pc2VfYSk7CisJZGF0YS0+Y2hhaW5fbm9pc2VfYiA9IChjaGFpbl9ub2lzZV9iICsgZGF0YS0+Y2hhaW5fbm9pc2VfYik7CisJZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IChjaGFpbl9ub2lzZV9jICsgZGF0YS0+Y2hhaW5fbm9pc2VfYyk7CisKKwlkYXRhLT5jaGFpbl9zaWduYWxfYSA9IChjaGFpbl9zaWdfYSArIGRhdGEtPmNoYWluX3NpZ25hbF9hKTsKKwlkYXRhLT5jaGFpbl9zaWduYWxfYiA9IChjaGFpbl9zaWdfYiArIGRhdGEtPmNoYWluX3NpZ25hbF9iKTsKKwlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IChjaGFpbl9zaWdfYyArIGRhdGEtPmNoYWluX3NpZ25hbF9jKTsKKworCURfQ0FMSUIoImNoYW49JWQsIGJhbmQyND0lZCwgYmVhY29uPSVkXG4iLCByeG9uX2NobnVtLCByeG9uX2JhbmQyNCwKKwkJZGF0YS0+YmVhY29uX2NvdW50KTsKKwlEX0NBTElCKCJjaGFpbl9zaWc6IGEgJWQgYiAlZCBjICVkXG4iLCBjaGFpbl9zaWdfYSwgY2hhaW5fc2lnX2IsCisJCWNoYWluX3NpZ19jKTsKKwlEX0NBTElCKCJjaGFpbl9ub2lzZTogYSAlZCBiICVkIGMgJWRcbiIsIGNoYWluX25vaXNlX2EsIGNoYWluX25vaXNlX2IsCisJCWNoYWluX25vaXNlX2MpOworCisJLyogSWYgdGhpcyBpcyB0aGUgImNoYWluX25vaXNlX251bV9iZWFjb25zIiwgZGV0ZXJtaW5lOgorCSAqIDEpICBEaXNjb25uZWN0ZWQgYW50ZW5uYXMgKHVzaW5nIHNpZ25hbCBzdHJlbmd0aHMpCisJICogMikgIERpZmZlcmVudGlhbCBnYWluICh1c2luZyBzaWxlbmNlIG5vaXNlKSB0byBiYWxhbmNlIHJlY2VpdmVycyAqLworCWlmIChkYXRhLT5iZWFjb25fY291bnQgIT0gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zKQorCQlyZXR1cm47CisKKwkvKiBBbmFseXplIHNpZ25hbCBmb3IgZGlzY29ubmVjdGVkIGFudGVubmEgKi8KKwlpbDQ5NjVfZmluZF9kaXNjb25uX2FudGVubmEoaWwsIGF2ZXJhZ2Vfc2lnLCBkYXRhKTsKKworCS8qIEFuYWx5emUgbm9pc2UgZm9yIHJ4IGJhbGFuY2UgKi8KKwlhdmVyYWdlX25vaXNlWzBdID0KKwkgICAgZGF0YS0+Y2hhaW5fbm9pc2VfYSAvIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKwlhdmVyYWdlX25vaXNlWzFdID0KKwkgICAgZGF0YS0+Y2hhaW5fbm9pc2VfYiAvIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKwlhdmVyYWdlX25vaXNlWzJdID0KKwkgICAgZGF0YS0+Y2hhaW5fbm9pc2VfYyAvIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfQ0hBSU5TOyBpKyspIHsKKwkJaWYgKCFkYXRhLT5kaXNjb25uX2FycmF5W2ldICYmCisJCSAgICBhdmVyYWdlX25vaXNlW2ldIDw9IG1pbl9hdmVyYWdlX25vaXNlKSB7CisJCQkvKiBUaGlzIG1lYW5zIHRoYXQgY2hhaW4gaSBpcyBhY3RpdmUgYW5kIGhhcworCQkJICogbG93ZXIgbm9pc2UgdmFsdWVzIHNvIGZhcjogKi8KKwkJCW1pbl9hdmVyYWdlX25vaXNlID0gYXZlcmFnZV9ub2lzZVtpXTsKKwkJCW1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSA9IGk7CisJCX0KKwl9CisKKwlEX0NBTElCKCJhdmVyYWdlX25vaXNlOiBhICVkIGIgJWQgYyAlZFxuIiwgYXZlcmFnZV9ub2lzZVswXSwKKwkJYXZlcmFnZV9ub2lzZVsxXSwgYXZlcmFnZV9ub2lzZVsyXSk7CisKKwlEX0NBTElCKCJtaW5fYXZlcmFnZV9ub2lzZSA9ICVkLCBhbnRlbm5hICVkXG4iLCBtaW5fYXZlcmFnZV9ub2lzZSwKKwkJbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pKTsKKworCWlsNDk2NV9nYWluX2NvbXB1dGF0aW9uKGlsLCBhdmVyYWdlX25vaXNlLCBtaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2ksCisJCQkJbWluX2F2ZXJhZ2Vfbm9pc2UsCisJCQkJaWw0OTY1X2ZpbmRfZmlyc3RfY2hhaW4oaWwtPmNmZy0+dmFsaWRfcnhfYW50KSk7CisKKwkvKiBTb21lIHBvd2VyIGNoYW5nZXMgbWF5IGhhdmUgYmVlbiBtYWRlIGR1cmluZyB0aGUgY2FsaWJyYXRpb24uCisJICogVXBkYXRlIGFuZCBjb21taXQgdGhlIFJYT04KKwkgKi8KKwlpZiAoaWwtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncykKKwkJaWwtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyhpbCk7CisKKwlkYXRhLT5zdGF0ZSA9IElMX0NIQUlOX05PSVNFX0RPTkU7CisJaWxfcG93ZXJfdXBkYXRlX21vZGUoaWwsIGZhbHNlKTsKK30KKwordm9pZAoraWw0OTY1X3Jlc2V0X3J1bl90aW1lX2NhbGliKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgaTsKKwltZW1zZXQoJihpbC0+c2Vuc2l0aXZpdHlfZGF0YSksIDAsIHNpemVvZihzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSkpOworCW1lbXNldCgmKGlsLT5jaGFpbl9ub2lzZV9kYXRhKSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhKSk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykKKwkJaWwtPmNoYWluX25vaXNlX2RhdGEuZGVsdGFfZ2Fpbl9jb2RlW2ldID0KKwkJICAgIENIQUlOX05PSVNFX0RFTFRBX0dBSU5fSU5JVF9WQUw7CisKKwkvKiBBc2sgZm9yIHN0YXRzIG5vdywgdGhlIHVDb2RlIHdpbGwgc2VuZCBub3RpZmljYXRpb24KKwkgKiBwZXJpb2RpY2FsbHkgYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwlpbF9zZW5kX3N0YXRzX3JlcXVlc3QoaWwsIENNRF9BU1lOQywgdHJ1ZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LWRlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LWRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlYzM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtZGVidWcuYwpAQCAtMCwwICsxLDc0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBHUEwgTElDRU5TRSBTVU1NQVJZCisqCisqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisqIFVTQQorKgorKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisqCisqIENvbnRhY3QgSW5mb3JtYXRpb246CisqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiNDk2NS5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqZm10X3ZhbHVlID0gIiAgJS0zMHMgJTEwdVxuIjsKK3N0YXRpYyBjb25zdCBjaGFyICpmbXRfdGFibGUgPSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iOworc3RhdGljIGNvbnN0IGNoYXIgKmZtdF9oZWFkZXIgPQorICAgICIlLTMycyAgICBjdXJyZW50ICBjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iOworCitzdGF0aWMgaW50CitpbDQ5NjVfc3RhdHNfZmxhZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnN6KQoreworCWludCBwID0gMDsKKwl1MzIgZmxhZzsKKworCWZsYWcgPSBsZTMyX3RvX2NwdShpbC0+XzQ5NjUuc3RhdHMuZmxhZyk7CisKKwlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsICJTdGF0aXN0aWNzIEZsYWcoMHglWCk6XG4iLCBmbGFnKTsKKwlpZiAoZmxhZyAmIFVDT0RFX1NUQVRTX0NMRUFSX01TSykKKwkJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLAorCQkJICAgICAgICJcdFN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0T3BlcmF0aW9uYWwgRnJlcXVlbmN5OiAlc1xuIiwKKwkJICAgICAgIChmbGFnICYgVUNPREVfU1RBVFNfRlJFUVVFTkNZX01TSykgPyAiMi40IEdIeiIgOgorCQkgICAgICAgIjUuMiBHSHoiKTsKKwlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsICJcdFRHaiBOYXJyb3cgQmFuZDogJXNcbiIsCisJCSAgICAgICAoZmxhZyAmIFVDT0RFX1NUQVRTX05BUlJPV19CQU5EX01TSykgPyAiZW5hYmxlZCIgOgorCQkgICAgICAgImRpc2FibGVkIik7CisKKwlyZXR1cm4gcDsKK30KKworc3NpemVfdAoraWw0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0KKwkgICAgc2l6ZW9mKHN0cnVjdCBzdGF0c19yeF9waHkpICogNDAgKworCSAgICBzaXplb2Yoc3RydWN0IHN0YXRzX3J4X25vbl9waHkpICogNDAgKworCSAgICBzaXplb2Yoc3RydWN0IHN0YXRzX3J4X2h0X3BoeSkgKiA0MCArIDQwMDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3Qgc3RhdHNfcnhfcGh5ICpvZmRtLCAqYWNjdW1fb2ZkbSwgKmRlbHRhX29mZG0sICptYXhfb2ZkbTsKKwlzdHJ1Y3Qgc3RhdHNfcnhfcGh5ICpjY2ssICphY2N1bV9jY2ssICpkZWx0YV9jY2ssICptYXhfY2NrOworCXN0cnVjdCBzdGF0c19yeF9ub25fcGh5ICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdHNfcnhfbm9uX3BoeSAqZGVsdGFfZ2VuZXJhbCwgKm1heF9nZW5lcmFsOworCXN0cnVjdCBzdGF0c19yeF9odF9waHkgKmh0LCAqYWNjdW1faHQsICpkZWx0YV9odCwgKm1heF9odDsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCisJICogdGhlIGxhc3Qgc3RhdHMgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKKwkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQorCSAqLworCW9mZG0gPSAmaWwtPl80OTY1LnN0YXRzLnJ4Lm9mZG07CisJY2NrID0gJmlsLT5fNDk2NS5zdGF0cy5yeC5jY2s7CisJZ2VuZXJhbCA9ICZpbC0+XzQ5NjUuc3RhdHMucnguZ2VuZXJhbDsKKwlodCA9ICZpbC0+XzQ5NjUuc3RhdHMucngub2ZkbV9odDsKKwlhY2N1bV9vZmRtID0gJmlsLT5fNDk2NS5hY2N1bV9zdGF0cy5yeC5vZmRtOworCWFjY3VtX2NjayA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMucnguY2NrOworCWFjY3VtX2dlbmVyYWwgPSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzLnJ4LmdlbmVyYWw7CisJYWNjdW1faHQgPSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzLnJ4Lm9mZG1faHQ7CisJZGVsdGFfb2ZkbSA9ICZpbC0+XzQ5NjUuZGVsdGFfc3RhdHMucngub2ZkbTsKKwlkZWx0YV9jY2sgPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLnJ4LmNjazsKKwlkZWx0YV9nZW5lcmFsID0gJmlsLT5fNDk2NS5kZWx0YV9zdGF0cy5yeC5nZW5lcmFsOworCWRlbHRhX2h0ID0gJmlsLT5fNDk2NS5kZWx0YV9zdGF0cy5yeC5vZmRtX2h0OworCW1heF9vZmRtID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEucngub2ZkbTsKKwltYXhfY2NrID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEucnguY2NrOworCW1heF9nZW5lcmFsID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEucnguZ2VuZXJhbDsKKwltYXhfaHQgPSAmaWwtPl80OTY1Lm1heF9kZWx0YS5yeC5vZmRtX2h0OworCisJcG9zICs9IGlsNDk2NV9zdGF0c19mbGFnKGlsLCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsCisJCSAgICAgICJTdGF0aXN0aWNzX1J4IC0gT0ZETToiKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImluYV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+aW5hX2NudCksIGFjY3VtX29mZG0tPmluYV9jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPmluYV9jbnQsIG1heF9vZmRtLT5pbmFfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZpbmFfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfY250KSwgYWNjdW1fb2ZkbS0+ZmluYV9jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPmZpbmFfY250LCBtYXhfb2ZkbS0+ZmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+cGxjcF9lcnIpLCBhY2N1bV9vZmRtLT5wbGNwX2VyciwKKwkJICAgICAgZGVsdGFfb2ZkbS0+cGxjcF9lcnIsIG1heF9vZmRtLT5wbGNwX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjcmMzMl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+Y3JjMzJfZXJyKSwgYWNjdW1fb2ZkbS0+Y3JjMzJfZXJyLAorCQkgICAgICBkZWx0YV9vZmRtLT5jcmMzMl9lcnIsIG1heF9vZmRtLT5jcmMzMl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9vZmRtLT5vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfb2ZkbS0+b3ZlcnJ1bl9lcnIsIG1heF9vZmRtLT5vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJlYXJseV9vdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5lYXJseV9vdmVycnVuX2VyciksCisJCSAgICAgIGFjY3VtX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAorCQkgICAgICBkZWx0YV9vZmRtLT5lYXJseV9vdmVycnVuX2VyciwKKwkJICAgICAgbWF4X29mZG0tPmVhcmx5X292ZXJydW5fZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImNyYzMyX2dvb2Q6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+Y3JjMzJfZ29vZCksIGFjY3VtX29mZG0tPmNyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX29mZG0tPmNyYzMyX2dvb2QsIG1heF9vZmRtLT5jcmMzMl9nb29kKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZhbHNlX2FsYXJtX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpLAorCQkgICAgICBhY2N1bV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsIGRlbHRhX29mZG0tPmZhbHNlX2FsYXJtX2NudCwKKwkJICAgICAgbWF4X29mZG0tPmZhbHNlX2FsYXJtX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJmaW5hX3N5bmNfZXJyX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5maW5hX3N5bmNfZXJyX2NudCksCisJCSAgICAgIGFjY3VtX29mZG0tPmZpbmFfc3luY19lcnJfY250LAorCQkgICAgICBkZWx0YV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKKwkJICAgICAgbWF4X29mZG0tPmZpbmFfc3luY19lcnJfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNmZF90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnNmZF90aW1lb3V0KSwgYWNjdW1fb2ZkbS0+c2ZkX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX29mZG0tPnNmZF90aW1lb3V0LCBtYXhfb2ZkbS0+c2ZkX3RpbWVvdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZmluYV90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfdGltZW91dCksIGFjY3VtX29mZG0tPmZpbmFfdGltZW91dCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+ZmluYV90aW1lb3V0LCBtYXhfb2ZkbS0+ZmluYV90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInVucmVzcG9uZGVkX3J0czoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT51bnJlc3BvbmRlZF9ydHMpLAorCQkgICAgICBhY2N1bV9vZmRtLT51bnJlc3BvbmRlZF9ydHMsIGRlbHRhX29mZG0tPnVucmVzcG9uZGVkX3J0cywKKwkJICAgICAgbWF4X29mZG0tPnVucmVzcG9uZGVkX3J0cyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJyeGVfZnJhbWVfbG10X292cnVuOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIGRlbHRhX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAorCQkgICAgICBtYXhfb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2VudF9hY2tfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYWNrX2NudCksIGFjY3VtX29mZG0tPnNlbnRfYWNrX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+c2VudF9hY2tfY250LCBtYXhfb2ZkbS0+c2VudF9hY2tfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNlbnRfY3RzX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5zZW50X2N0c19jbnQpLCBhY2N1bV9vZmRtLT5zZW50X2N0c19jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPnNlbnRfY3RzX2NudCwgbWF4X29mZG0tPnNlbnRfY3RzX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJzZW50X2JhX3JzcF9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+c2VudF9iYV9yc3BfY250KSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+c2VudF9iYV9yc3BfY250LCBkZWx0YV9vZmRtLT5zZW50X2JhX3JzcF9jbnQsCisJCSAgICAgIG1heF9vZmRtLT5zZW50X2JhX3JzcF9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZHNwX3NlbGZfa2lsbDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5kc3Bfc2VsZl9raWxsKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+ZHNwX3NlbGZfa2lsbCwgZGVsdGFfb2ZkbS0+ZHNwX3NlbGZfa2lsbCwKKwkJICAgICAgbWF4X29mZG0tPmRzcF9zZWxmX2tpbGwpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAibWhfZm9ybWF0X2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5taF9mb3JtYXRfZXJyKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+bWhfZm9ybWF0X2VyciwgZGVsdGFfb2ZkbS0+bWhfZm9ybWF0X2VyciwKKwkJICAgICAgbWF4X29mZG0tPm1oX2Zvcm1hdF9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAicmVfYWNxX21haW5fcnNzaV9zdW06IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+cmVfYWNxX21haW5fcnNzaV9zdW0pLAorCQkgICAgICBhY2N1bV9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKKwkJICAgICAgZGVsdGFfb2ZkbS0+cmVfYWNxX21haW5fcnNzaV9zdW0sCisJCSAgICAgIG1heF9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSk7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsCisJCSAgICAgICJTdGF0aXN0aWNzX1J4IC0gQ0NLOiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmluYV9jbnQpLCBhY2N1bV9jY2stPmluYV9jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+aW5hX2NudCwgbWF4X2Njay0+aW5hX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJmaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmZpbmFfY250KSwgYWNjdW1fY2NrLT5maW5hX2NudCwKKwkJICAgICAgZGVsdGFfY2NrLT5maW5hX2NudCwgbWF4X2Njay0+ZmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5wbGNwX2VyciksIGFjY3VtX2Njay0+cGxjcF9lcnIsCisJCSAgICAgIGRlbHRhX2Njay0+cGxjcF9lcnIsIG1heF9jY2stPnBsY3BfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImNyYzMyX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2VyciksIGFjY3VtX2Njay0+Y3JjMzJfZXJyLAorCQkgICAgICBkZWx0YV9jY2stPmNyYzMyX2VyciwgbWF4X2Njay0+Y3JjMzJfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgIm92ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9jY2stPm92ZXJydW5fZXJyLAorCQkgICAgICBkZWx0YV9jY2stPm92ZXJydW5fZXJyLCBtYXhfY2NrLT5vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJlYXJseV9vdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmVhcmx5X292ZXJydW5fZXJyKSwKKwkJICAgICAgYWNjdW1fY2NrLT5lYXJseV9vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5lYXJseV9vdmVycnVuX2VyciwgbWF4X2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiY3JjMzJfZ29vZDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2dvb2QpLCBhY2N1bV9jY2stPmNyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX2Njay0+Y3JjMzJfZ29vZCwgbWF4X2Njay0+Y3JjMzJfZ29vZCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJmYWxzZV9hbGFybV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5mYWxzZV9hbGFybV9jbnQpLAorCQkgICAgICBhY2N1bV9jY2stPmZhbHNlX2FsYXJtX2NudCwgZGVsdGFfY2NrLT5mYWxzZV9hbGFybV9jbnQsCisJCSAgICAgIG1heF9jY2stPmZhbHNlX2FsYXJtX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJmaW5hX3N5bmNfZXJyX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmZpbmFfc3luY19lcnJfY250KSwKKwkJICAgICAgYWNjdW1fY2NrLT5maW5hX3N5bmNfZXJyX2NudCwKKwkJICAgICAgZGVsdGFfY2NrLT5maW5hX3N5bmNfZXJyX2NudCwgbWF4X2Njay0+ZmluYV9zeW5jX2Vycl9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2ZkX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5zZmRfdGltZW91dCksIGFjY3VtX2Njay0+c2ZkX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX2Njay0+c2ZkX3RpbWVvdXQsIG1heF9jY2stPnNmZF90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZpbmFfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmZpbmFfdGltZW91dCksIGFjY3VtX2Njay0+ZmluYV90aW1lb3V0LAorCQkgICAgICBkZWx0YV9jY2stPmZpbmFfdGltZW91dCwgbWF4X2Njay0+ZmluYV90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInVucmVzcG9uZGVkX3J0czoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnVucmVzcG9uZGVkX3J0cyksCisJCSAgICAgIGFjY3VtX2Njay0+dW5yZXNwb25kZWRfcnRzLCBkZWx0YV9jY2stPnVucmVzcG9uZGVkX3J0cywKKwkJICAgICAgbWF4X2Njay0+dW5yZXNwb25kZWRfcnRzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInJ4ZV9mcmFtZV9sbXRfb3ZydW46IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biksCisJCSAgICAgIGFjY3VtX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIGRlbHRhX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIG1heF9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNlbnRfYWNrX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnNlbnRfYWNrX2NudCksIGFjY3VtX2Njay0+c2VudF9hY2tfY250LAorCQkgICAgICBkZWx0YV9jY2stPnNlbnRfYWNrX2NudCwgbWF4X2Njay0+c2VudF9hY2tfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNlbnRfY3RzX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnNlbnRfY3RzX2NudCksIGFjY3VtX2Njay0+c2VudF9jdHNfY250LAorCQkgICAgICBkZWx0YV9jY2stPnNlbnRfY3RzX2NudCwgbWF4X2Njay0+c2VudF9jdHNfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNlbnRfYmFfcnNwX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnNlbnRfYmFfcnNwX2NudCksCisJCSAgICAgIGFjY3VtX2Njay0+c2VudF9iYV9yc3BfY250LCBkZWx0YV9jY2stPnNlbnRfYmFfcnNwX2NudCwKKwkJICAgICAgbWF4X2Njay0+c2VudF9iYV9yc3BfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImRzcF9zZWxmX2tpbGw6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5kc3Bfc2VsZl9raWxsKSwgYWNjdW1fY2NrLT5kc3Bfc2VsZl9raWxsLAorCQkgICAgICBkZWx0YV9jY2stPmRzcF9zZWxmX2tpbGwsIG1heF9jY2stPmRzcF9zZWxmX2tpbGwpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAibWhfZm9ybWF0X2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPm1oX2Zvcm1hdF9lcnIpLCBhY2N1bV9jY2stPm1oX2Zvcm1hdF9lcnIsCisJCSAgICAgIGRlbHRhX2Njay0+bWhfZm9ybWF0X2VyciwgbWF4X2Njay0+bWhfZm9ybWF0X2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJyZV9hY3FfbWFpbl9yc3NpX3N1bToiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnJlX2FjcV9tYWluX3Jzc2lfc3VtKSwKKwkJICAgICAgYWNjdW1fY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKKwkJICAgICAgZGVsdGFfY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKKwkJICAgICAgbWF4X2Njay0+cmVfYWNxX21haW5fcnNzaV9zdW0pOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfaGVhZGVyLAorCQkgICAgICAiU3RhdGlzdGljc19SeCAtIEdFTkVSQUw6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJib2d1c19jdHM6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+Ym9ndXNfY3RzKSwgYWNjdW1fZ2VuZXJhbC0+Ym9ndXNfY3RzLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ib2d1c19jdHMsIG1heF9nZW5lcmFsLT5ib2d1c19jdHMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYm9ndXNfYWNrOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJvZ3VzX2FjayksIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2FjaywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfYWNrLCBtYXhfZ2VuZXJhbC0+Ym9ndXNfYWNrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgIm5vbl9ic3NpZF9mcmFtZXM6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMsCisJCSAgICAgIG1heF9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZpbHRlcmVkX2ZyYW1lczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcywKKwkJICAgICAgbWF4X2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJub25fY2hhbm5lbF9iZWFjb25zOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjaGFubmVsX2JlYWNvbnM6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMsCisJCSAgICAgIG1heF9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAibnVtX21pc3NlZF9iY29uOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm51bV9taXNzZWRfYmNvbiksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPm51bV9taXNzZWRfYmNvbiwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+bnVtX21pc3NlZF9iY29uLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+bnVtX21pc3NlZF9iY29uKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFkY19yeF9zYXR1cmF0aW9uX3RpbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+YWRjX3J4X3NhdHVyYXRpb25fdGltZSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUsCisJCSAgICAgIG1heF9nZW5lcmFsLT5hZGNfcnhfc2F0dXJhdGlvbl90aW1lKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImluYV9kZXRlY3Rfc2VhcmNoX3RtOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5pbmFfZGV0ZWN0aW9uX3NlYXJjaF90aW1lLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5pbmFfZGV0ZWN0aW9uX3NlYXJjaF90aW1lLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+aW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJiZWFjb25fc2lsZW5jZV9yc3NpX2E6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EsCisJCSAgICAgIG1heF9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiYmVhY29uX3NpbGVuY2VfcnNzaV9iOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYiksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYiwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImJlYWNvbl9zaWxlbmNlX3Jzc2lfYzoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYywKKwkJICAgICAgbWF4X2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJpbnRlcmZlcmVuY2VfZGF0YV9mbGFnOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+aW50ZXJmZXJlbmNlX2RhdGFfZmxhZyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjaGFubmVsX2xvYWQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+Y2hhbm5lbF9sb2FkKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+Y2hhbm5lbF9sb2FkLCBkZWx0YV9nZW5lcmFsLT5jaGFubmVsX2xvYWQsCisJCSAgICAgIG1heF9nZW5lcmFsLT5jaGFubmVsX2xvYWQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZHNwX2ZhbHNlX2FsYXJtczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+ZHNwX2ZhbHNlX2FsYXJtcywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+ZHNwX2ZhbHNlX2FsYXJtcywKKwkJICAgICAgbWF4X2dlbmVyYWwtPmRzcF9mYWxzZV9hbGFybXMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYmVhY29uX3Jzc2lfYToiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fcnNzaV9hKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSwgbWF4X2dlbmVyYWwtPmJlYWNvbl9yc3NpX2EpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYmVhY29uX3Jzc2lfYjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fcnNzaV9iKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYiwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYiwgbWF4X2dlbmVyYWwtPmJlYWNvbl9yc3NpX2IpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYmVhY29uX3Jzc2lfYzoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fcnNzaV9jKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYywgbWF4X2dlbmVyYWwtPmJlYWNvbl9yc3NpX2MpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYmVhY29uX2VuZXJneV9hOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9hLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9hKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImJlYWNvbl9lbmVyZ3lfYjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fZW5lcmd5X2IpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2IsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiwKKwkJICAgICAgbWF4X2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJiZWFjb25fZW5lcmd5X2M6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MsCisJCSAgICAgIG1heF9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfaGVhZGVyLAorCQkgICAgICAiU3RhdGlzdGljc19SeCAtIE9GRE1fSFQ6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJwbGNwX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShodC0+cGxjcF9lcnIpLCBhY2N1bV9odC0+cGxjcF9lcnIsCisJCSAgICAgIGRlbHRhX2h0LT5wbGNwX2VyciwgbWF4X2h0LT5wbGNwX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJvdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShodC0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9odC0+b3ZlcnJ1bl9lcnIsCisJCSAgICAgIGRlbHRhX2h0LT5vdmVycnVuX2VyciwgbWF4X2h0LT5vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJlYXJseV9vdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShodC0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAorCQkgICAgICBhY2N1bV9odC0+ZWFybHlfb3ZlcnJ1bl9lcnIsIGRlbHRhX2h0LT5lYXJseV9vdmVycnVuX2VyciwKKwkJICAgICAgbWF4X2h0LT5lYXJseV9vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjcmMzMl9nb29kOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5jcmMzMl9nb29kKSwgYWNjdW1faHQtPmNyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX2h0LT5jcmMzMl9nb29kLCBtYXhfaHQtPmNyYzMyX2dvb2QpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiY3JjMzJfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5jcmMzMl9lcnIpLCBhY2N1bV9odC0+Y3JjMzJfZXJyLAorCQkgICAgICBkZWx0YV9odC0+Y3JjMzJfZXJyLCBtYXhfaHQtPmNyYzMyX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJtaF9mb3JtYXRfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5taF9mb3JtYXRfZXJyKSwgYWNjdW1faHQtPm1oX2Zvcm1hdF9lcnIsCisJCSAgICAgIGRlbHRhX2h0LT5taF9mb3JtYXRfZXJyLCBtYXhfaHQtPm1oX2Zvcm1hdF9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnX2NyYzMyX2dvb2Q6IiwKKwkJICAgICAgbGUzMl90b19jcHUoaHQtPmFnZ19jcmMzMl9nb29kKSwgYWNjdW1faHQtPmFnZ19jcmMzMl9nb29kLAorCQkgICAgICBkZWx0YV9odC0+YWdnX2NyYzMyX2dvb2QsIG1heF9odC0+YWdnX2NyYzMyX2dvb2QpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnX21wZHVfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5hZ2dfbXBkdV9jbnQpLCBhY2N1bV9odC0+YWdnX21wZHVfY250LAorCQkgICAgICBkZWx0YV9odC0+YWdnX21wZHVfY250LCBtYXhfaHQtPmFnZ19tcGR1X2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2dfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5hZ2dfY250KSwgYWNjdW1faHQtPmFnZ19jbnQsCisJCSAgICAgIGRlbHRhX2h0LT5hZ2dfY250LCBtYXhfaHQtPmFnZ19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAidW5zdXBwb3J0X21jczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShodC0+dW5zdXBwb3J0X21jcyksIGFjY3VtX2h0LT51bnN1cHBvcnRfbWNzLAorCQkgICAgICBkZWx0YV9odC0+dW5zdXBwb3J0X21jcywgbWF4X2h0LT51bnN1cHBvcnRfbWNzKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdAoraWw0OTY1X3Vjb2RlX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0gKHNpemVvZihzdHJ1Y3Qgc3RhdHNfdHgpICogNDgpICsgMjUwOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBzdGF0c190eCAqdHgsICphY2N1bV90eCwgKmRlbHRhX3R4LCAqbWF4X3R4OworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCisJICogdGhlIGxhc3Qgc3RhdHMgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKKwkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQorCSAqLworCXR4ID0gJmlsLT5fNDk2NS5zdGF0cy50eDsKKwlhY2N1bV90eCA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMudHg7CisJZGVsdGFfdHggPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLnR4OworCW1heF90eCA9ICZpbC0+XzQ5NjUubWF4X2RlbHRhLnR4OworCisJcG9zICs9IGlsNDk2NV9zdGF0c19mbGFnKGlsLCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsICJTdGF0aXN0aWNzX1R4OiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicHJlYW1ibGU6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPnByZWFtYmxlX2NudCksIGFjY3VtX3R4LT5wcmVhbWJsZV9jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5wcmVhbWJsZV9jbnQsIG1heF90eC0+cHJlYW1ibGVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInJ4X2RldGVjdGVkX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+cnhfZGV0ZWN0ZWRfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPnJ4X2RldGVjdGVkX2NudCwgZGVsdGFfdHgtPnJ4X2RldGVjdGVkX2NudCwKKwkJICAgICAgbWF4X3R4LT5yeF9kZXRlY3RlZF9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYnRfcHJpb19kZWZlcl9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fZGVmZXJfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPmJ0X3ByaW9fZGVmZXJfY250LCBkZWx0YV90eC0+YnRfcHJpb19kZWZlcl9jbnQsCisJCSAgICAgIG1heF90eC0+YnRfcHJpb19kZWZlcl9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYnRfcHJpb19raWxsX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnRfcHJpb19raWxsX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5idF9wcmlvX2tpbGxfY250LCBkZWx0YV90eC0+YnRfcHJpb19raWxsX2NudCwKKwkJICAgICAgbWF4X3R4LT5idF9wcmlvX2tpbGxfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZld19ieXRlc19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmZld19ieXRlc19jbnQpLCBhY2N1bV90eC0+ZmV3X2J5dGVzX2NudCwKKwkJICAgICAgZGVsdGFfdHgtPmZld19ieXRlc19jbnQsIG1heF90eC0+ZmV3X2J5dGVzX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjdHNfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+Y3RzX3RpbWVvdXQpLCBhY2N1bV90eC0+Y3RzX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX3R4LT5jdHNfdGltZW91dCwgbWF4X3R4LT5jdHNfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhY2tfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWNrX3RpbWVvdXQpLCBhY2N1bV90eC0+YWNrX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX3R4LT5hY2tfdGltZW91dCwgbWF4X3R4LT5hY2tfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJleHBlY3RlZF9hY2tfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5leHBlY3RlZF9hY2tfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPmV4cGVjdGVkX2Fja19jbnQsIGRlbHRhX3R4LT5leHBlY3RlZF9hY2tfY250LAorCQkgICAgICBtYXhfdHgtPmV4cGVjdGVkX2Fja19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWN0dWFsX2Fja19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFjdHVhbF9hY2tfY250KSwgYWNjdW1fdHgtPmFjdHVhbF9hY2tfY250LAorCQkgICAgICBkZWx0YV90eC0+YWN0dWFsX2Fja19jbnQsIG1heF90eC0+YWN0dWFsX2Fja19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZHVtcF9tc2R1X2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+ZHVtcF9tc2R1X2NudCksIGFjY3VtX3R4LT5kdW1wX21zZHVfY250LAorCQkgICAgICBkZWx0YV90eC0+ZHVtcF9tc2R1X2NudCwgbWF4X3R4LT5kdW1wX21zZHVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFib3J0X254dF9mcmFtZV9taXNtYXRjaDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCwKKwkJICAgICAgbWF4X3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJhYm9ydF9taXNzaW5nX254dF9mcmFtZToiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250LAorCQkgICAgICBkZWx0YV90eC0+YnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudCwKKwkJICAgICAgbWF4X3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImN0c190aW1lb3V0X2NvbGxpc2lvbjoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+Y3RzX3RpbWVvdXRfY29sbGlzaW9uKSwKKwkJICAgICAgYWNjdW1fdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbiwKKwkJICAgICAgZGVsdGFfdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbiwKKwkJICAgICAgbWF4X3R4LT5jdHNfdGltZW91dF9jb2xsaXNpb24pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiYWNrX2JhX3RpbWVvdXRfY29sbGlzaW9uOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24pLAorCQkgICAgICBhY2N1bV90eC0+YWNrX29yX2JhX3RpbWVvdXRfY29sbGlzaW9uLAorCQkgICAgICBkZWx0YV90eC0+YWNrX29yX2JhX3RpbWVvdXRfY29sbGlzaW9uLAorCQkgICAgICBtYXhfdHgtPmFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2cgYmFfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLmJhX3RpbWVvdXQpLCBhY2N1bV90eC0+YWdnLmJhX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuYmFfdGltZW91dCwgbWF4X3R4LT5hZ2cuYmFfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJhZ2cgYmFfcmVzY2hlZF9mcmFtZXM6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFnZy5iYV9yZXNjaGVkdWxlX2ZyYW1lcyksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMsCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMsCisJCSAgICAgIG1heF90eC0+YWdnLmJhX3Jlc2NoZWR1bGVfZnJhbWVzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFnZyBzY2RfcXVlcnlfYWdnX2ZyYW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9hZ2dfZnJhbWVfY250LAorCQkgICAgICBkZWx0YV90eC0+YWdnLnNjZF9xdWVyeV9hZ2dfZnJhbWVfY250LAorCQkgICAgICBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfYWdnX2ZyYW1lX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJhZ2cgc2NkX3F1ZXJ5X25vX2FnZzoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2cpLAorCQkgICAgICBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2csCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X25vX2FnZywKKwkJICAgICAgbWF4X3R4LT5hZ2cuc2NkX3F1ZXJ5X25vX2FnZyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2cgc2NkX3F1ZXJ5X2FnZzoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLnNjZF9xdWVyeV9hZ2cpLAorCQkgICAgICBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9hZ2csIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZywKKwkJICAgICAgbWF4X3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJhZ2cgc2NkX3F1ZXJ5X21pc21hdGNoOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X21pc21hdGNoKSwKKwkJICAgICAgYWNjdW1fdHgtPmFnZy5zY2RfcXVlcnlfbWlzbWF0Y2gsCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X21pc21hdGNoLAorCQkgICAgICBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfbWlzbWF0Y2gpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnIGZyYW1lX25vdF9yZWFkeToiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLmZyYW1lX25vdF9yZWFkeSksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5LAorCQkgICAgICBkZWx0YV90eC0+YWdnLmZyYW1lX25vdF9yZWFkeSwKKwkJICAgICAgbWF4X3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImFnZyB1bmRlcnJ1bjoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLnVuZGVycnVuKSwgYWNjdW1fdHgtPmFnZy51bmRlcnJ1biwKKwkJICAgICAgZGVsdGFfdHgtPmFnZy51bmRlcnJ1biwgbWF4X3R4LT5hZ2cudW5kZXJydW4pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnIGJ0X3ByaW9fa2lsbDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLmJ0X3ByaW9fa2lsbCksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cuYnRfcHJpb19raWxsLCBkZWx0YV90eC0+YWdnLmJ0X3ByaW9fa2lsbCwKKwkJICAgICAgbWF4X3R4LT5hZ2cuYnRfcHJpb19raWxsKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImFnZyByeF9iYV9yc3BfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cucnhfYmFfcnNwX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cucnhfYmFfcnNwX2NudCwgZGVsdGFfdHgtPmFnZy5yeF9iYV9yc3BfY250LAorCQkgICAgICBtYXhfdHgtPmFnZy5yeF9iYV9yc3BfY250KTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdAoraWw0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0cnVjdCBzdGF0c19nZW5lcmFsKSAqIDEwICsgMzAwOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBzdGF0c19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7CisJc3RydWN0IHN0YXRzX2dlbmVyYWxfY29tbW9uICpkZWx0YV9nZW5lcmFsLCAqbWF4X2dlbmVyYWw7CisJc3RydWN0IHN0YXRzX2RiZyAqZGJnLCAqYWNjdW1fZGJnLCAqZGVsdGFfZGJnLCAqbWF4X2RiZzsKKwlzdHJ1Y3Qgc3RhdHNfZGl2ICpkaXYsICphY2N1bV9kaXYsICpkZWx0YV9kaXYsICptYXhfZGl2OworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCisJICogdGhlIGxhc3Qgc3RhdHMgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKKwkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQorCSAqLworCWdlbmVyYWwgPSAmaWwtPl80OTY1LnN0YXRzLmdlbmVyYWwuY29tbW9uOworCWRiZyA9ICZpbC0+XzQ5NjUuc3RhdHMuZ2VuZXJhbC5jb21tb24uZGJnOworCWRpdiA9ICZpbC0+XzQ5NjUuc3RhdHMuZ2VuZXJhbC5jb21tb24uZGl2OworCWFjY3VtX2dlbmVyYWwgPSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzLmdlbmVyYWwuY29tbW9uOworCWFjY3VtX2RiZyA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMuZ2VuZXJhbC5jb21tb24uZGJnOworCWFjY3VtX2RpdiA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMuZ2VuZXJhbC5jb21tb24uZGl2OworCWRlbHRhX2dlbmVyYWwgPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLmdlbmVyYWwuY29tbW9uOworCW1heF9nZW5lcmFsID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEuZ2VuZXJhbC5jb21tb247CisJZGVsdGFfZGJnID0gJmlsLT5fNDk2NS5kZWx0YV9zdGF0cy5nZW5lcmFsLmNvbW1vbi5kYmc7CisJbWF4X2RiZyA9ICZpbC0+XzQ5NjUubWF4X2RlbHRhLmdlbmVyYWwuY29tbW9uLmRiZzsKKwlkZWx0YV9kaXYgPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLmdlbmVyYWwuY29tbW9uLmRpdjsKKwltYXhfZGl2ID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEuZ2VuZXJhbC5jb21tb24uZGl2OworCisJcG9zICs9IGlsNDk2NV9zdGF0c19mbGFnKGlsLCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsCisJCSAgICAgICJTdGF0aXN0aWNzX0dlbmVyYWw6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdmFsdWUsICJ0ZW1wZXJhdHVyZToiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT50ZW1wZXJhdHVyZSkpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3ZhbHVlLCAidHRsX3RpbWVzdGFtcDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT50dGxfdGltZXN0YW1wKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJidXJzdF9jaGVjazoiLAorCQkgICAgICBsZTMyX3RvX2NwdShkYmctPmJ1cnN0X2NoZWNrKSwgYWNjdW1fZGJnLT5idXJzdF9jaGVjaywKKwkJICAgICAgZGVsdGFfZGJnLT5idXJzdF9jaGVjaywgbWF4X2RiZy0+YnVyc3RfY2hlY2spOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYnVyc3RfY291bnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGJnLT5idXJzdF9jb3VudCksIGFjY3VtX2RiZy0+YnVyc3RfY291bnQsCisJCSAgICAgIGRlbHRhX2RiZy0+YnVyc3RfY291bnQsIG1heF9kYmctPmJ1cnN0X2NvdW50KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgIndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jb3VudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShkYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQpLAorCQkgICAgICBhY2N1bV9kYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQsCisJCSAgICAgIGRlbHRhX2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCwKKwkJICAgICAgbWF4X2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJzbGVlcF90aW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsZWVwX3RpbWUpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5zbGVlcF90aW1lLCBkZWx0YV9nZW5lcmFsLT5zbGVlcF90aW1lLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+c2xlZXBfdGltZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJzbG90c19vdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfb3V0KSwgYWNjdW1fZ2VuZXJhbC0+c2xvdHNfb3V0LAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5zbG90c19vdXQsIG1heF9nZW5lcmFsLT5zbG90c19vdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2xvdHNfaWRsZToiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbG90c19pZGxlKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+c2xvdHNfaWRsZSwgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfaWRsZSwKKwkJICAgICAgbWF4X2dlbmVyYWwtPnNsb3RzX2lkbGUpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAidHhfb25fYToiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2EpLCBhY2N1bV9kaXYtPnR4X29uX2EsCisJCSAgICAgIGRlbHRhX2Rpdi0+dHhfb25fYSwgbWF4X2Rpdi0+dHhfb25fYSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJ0eF9vbl9iOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRpdi0+dHhfb25fYiksIGFjY3VtX2Rpdi0+dHhfb25fYiwKKwkJICAgICAgZGVsdGFfZGl2LT50eF9vbl9iLCBtYXhfZGl2LT50eF9vbl9iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImV4ZWNfdGltZToiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPmV4ZWNfdGltZSksIGFjY3VtX2Rpdi0+ZXhlY190aW1lLAorCQkgICAgICBkZWx0YV9kaXYtPmV4ZWNfdGltZSwgbWF4X2Rpdi0+ZXhlY190aW1lKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInByb2JlX3RpbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGl2LT5wcm9iZV90aW1lKSwgYWNjdW1fZGl2LT5wcm9iZV90aW1lLAorCQkgICAgICBkZWx0YV9kaXYtPnByb2JlX3RpbWUsIG1heF9kaXYtPnByb2JlX3RpbWUpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicnhfZW5hYmxlX2NvdW50ZXI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+cnhfZW5hYmxlX2NvdW50ZXIpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+cnhfZW5hYmxlX2NvdW50ZXIsCisJCSAgICAgIG1heF9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlcik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJudW1fb2Zfc29zX3N0YXRlczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPm51bV9vZl9zb3Nfc3RhdGVzLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcywKKwkJICAgICAgbWF4X2dlbmVyYWwtPm51bV9vZl9zb3Nfc3RhdGVzKTsKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LW1hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWFlZjQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1tYWMuYwpAQCAtMCwwICsxLDY1MzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAorICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNkZWZpbmUgRFJWX05BTUUgICAgICAgICJpd2w0OTY1IgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiNDk2NS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbW9kdWxlIGJvaWxlciBwbGF0ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBtb2R1bGUgbmFtZSwgY29weXJpZ2h0LCB2ZXJzaW9uLCBldGMuCisgKi8KKyNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCSJJbnRlbChSKSBXaXJlbGVzcyBXaUZpIDQ5NjUgZHJpdmVyIGZvciBMaW51eCIKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworI2RlZmluZSBWRCAiZCIKKyNlbHNlCisjZGVmaW5lIFZECisjZW5kaWYKKworI2RlZmluZSBEUlZfVkVSU0lPTiAgICAgSVdMV0lGSV9WRVJTSU9OIFZECisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04pOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUihEUlZfQ09QWVJJR0hUICIgIiBEUlZfQVVUSE9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXdsNDk2NSIpOworCit2b2lkCitpbDQ5NjVfY2hlY2tfYWJvcnRfc3RhdHVzKHN0cnVjdCBpbF9wcml2ICppbCwgdTggZnJhbWVfY291bnQsIHUzMiBzdGF0dXMpCit7CisJaWYgKGZyYW1lX2NvdW50ID09IDEgJiYgc3RhdHVzID09IFRYX1NUQVRVU19GQUlMX1JGS0lMTF9GTFVTSCkgeworCQlJTF9FUlIoIlR4IGZsdXNoIGNvbW1hbmQgdG8gZmx1c2ggb3V0IGFsbCBmcmFtZXNcbiIpOworCQlpZiAoIXRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCQlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+dHhfZmx1c2gpOworCX0KK30KKworLyoKKyAqIEVFUFJPTQorICovCitzdHJ1Y3QgaWxfbW9kX3BhcmFtcyBpbDQ5NjVfbW9kX3BhcmFtcyA9IHsKKwkuYW1zZHVfc2l6ZV84SyA9IDEsCisJLnJlc3RhcnRfZncgPSAxLAorCS8qIHRoZSByZXN0IGFyZSAwIGJ5IGRlZmF1bHQgKi8KK307CisKK3ZvaWQKK2lsNDk2NV9yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X2ZyZWUpOworCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X3VzZWQpOworCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspIHsKKwkJLyogSW4gdGhlIHJlc2V0IGZ1bmN0aW9uLCB0aGVzZSBidWZmZXJzIG1heSBoYXZlIGJlZW4gYWxsb2NhdGVkCisJCSAqIHRvIGFuIFNLQiwgc28gd2UgbmVlZCB0byB1bm1hcCBhbmQgZnJlZSBwb3RlbnRpYWwgc3RvcmFnZSAqLworCQlpZiAocnhxLT5wb29sW2ldLnBhZ2UgIT0gTlVMTCkgeworCQkJcGNpX3VubWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5wYWdlX2RtYSwKKwkJCQkgICAgICAgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCV9faWxfZnJlZV9wYWdlcyhpbCwgcnhxLT5wb29sW2ldLnBhZ2UpOworCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRTsgaSsrKQorCQlyeHEtPnF1ZXVlW2ldID0gTlVMTDsKKworCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQorCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLworCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOworCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKKwlyeHEtPmZyZWVfY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworfQorCitpbnQKK2lsNDk2NV9yeF9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpCit7CisJdTMyIHJiX3NpemU7CisJY29uc3QgdTMyIHJmZG5sb2cgPSBSWF9RVUVVRV9TSVpFX0xPRzsJLyogMjU2IFJCRHMgKi8KKwl1MzIgcmJfdGltZW91dCA9IDA7CisKKwlpZiAoaWwtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKKwkJcmJfc2l6ZSA9IEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzhLOworCWVsc2UKKwkJcmJfc2l6ZSA9IEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzRLOworCisJLyogU3RvcCBSeCBETUEgKi8KKwlpbF93cihpbCwgRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLCAwKTsKKworCS8qIFJlc2V0IGRyaXZlcidzIFJ4IHF1ZXVlIHdyaXRlIGlkeCAqLworCWlsX3dyKGlsLCBGSDQ5X1JTQ1NSX0NITkwwX1JCRENCX1dQVFJfUkVHLCAwKTsKKworCS8qIFRlbGwgZGV2aWNlIHdoZXJlIHRvIGZpbmQgUkJEIGNpcmN1bGFyIGJ1ZmZlciBpbiBEUkFNICovCisJaWxfd3IoaWwsIEZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcsICh1MzIpIChyeHEtPmJkX2RtYSA+PiA4KSk7CisKKwkvKiBUZWxsIGRldmljZSB3aGVyZSBpbiBEUkFNIHRvIHVwZGF0ZSBpdHMgUnggc3RhdHVzICovCisJaWxfd3IoaWwsIEZINDlfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRywgcnhxLT5yYl9zdHRzX2RtYSA+PiA0KTsKKworCS8qIEVuYWJsZSBSeCBETUEKKwkgKiBEaXJlY3QgcnggaW50ZXJydXB0cyB0byBob3N0cworCSAqIFJ4IGJ1ZmZlciBzaXplIDQgb3IgOGsKKwkgKiBSQiB0aW1lb3V0IDB4MTAKKwkgKiAyNTYgUkJEcworCSAqLworCWlsX3dyKGlsLCBGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsCisJICAgICAgRkg0OV9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX0VOQUJMRV9WQUwgfAorCSAgICAgIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMIHwKKwkgICAgICBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX1NJTkdMRV9GUkFNRV9NU0sgfAorCSAgICAgIHJiX3NpemUgfAorCSAgICAgIChyYl90aW1lb3V0IDw8IEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX0lSUV9SQlRIX1BPUykgfAorCSAgICAgIChyZmRubG9nIDw8IEZINDlfUkNTUl9SWF9DT05GSUdfUkJEQ0JfU0laRV9QT1MpKTsKKworCS8qIFNldCBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lciB0byBkZWZhdWx0ICgyMDQ4IHVzZWNzKSAqLworCWlsX3dyaXRlOChpbCwgQ1NSX0lOVF9DT0FMRVNDSU5HLCBJTF9IT1NUX0lOVF9USU1FT1VUX0RFRik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9zZXRfcHdyX3ZtYWluKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKy8qCisgKiAoZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMpCisgKiB0byBzZXQgcG93ZXIgdG8gVl9BVVgsIGRvOgorCisJCWlmIChwY2lfcG1lX2NhcGFibGUoaWwtPnBjaV9kZXYsIFBDSV9EM2NvbGQpKQorCQkJaWxfc2V0X2JpdHNfbWFza19wcnBoKGlsLCBBUE1HX1BTX0NUUkxfUkVHLAorCQkJCQkgICAgICAgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZBVVgsCisJCQkJCSAgICAgICB+QVBNR19QU19DVFJMX01TS19QV1JfU1JDKTsKKyAqLworCisJaWxfc2V0X2JpdHNfbWFza19wcnBoKGlsLCBBUE1HX1BTX0NUUkxfUkVHLAorCQkJICAgICAgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZNQUlOLAorCQkJICAgICAgfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7Cit9CisKK2ludAoraWw0OTY1X2h3X25pY19pbml0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJaW50IHJldDsKKworCS8qIG5pY19pbml0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWwtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuaW5pdChpbCk7CisKKwkvKiBTZXQgaW50ZXJydXB0IGNvYWxlc2NpbmcgY2FsaWJyYXRpb24gdGltZXIgdG8gZGVmYXVsdCAoNTEyIHVzZWNzKSAqLworCWlsX3dyaXRlOChpbCwgQ1NSX0lOVF9DT0FMRVNDSU5HLCBJTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX0RFRik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWw0OTY1X3NldF9wd3Jfdm1haW4oaWwpOworCisJaWwtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuY29uZmlnKGlsKTsKKworCS8qIEFsbG9jYXRlIHRoZSBSWCBxdWV1ZSwgb3IgcmVzZXQgaWYgaXQgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlpZiAoIXJ4cS0+YmQpIHsKKwkJcmV0ID0gaWxfcnhfcXVldWVfYWxsb2MoaWwpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0aWFsaXplIFJ4IHF1ZXVlXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlCisJCWlsNDk2NV9yeF9xdWV1ZV9yZXNldChpbCwgcnhxKTsKKworCWlsNDk2NV9yeF9yZXBsZW5pc2goaWwpOworCisJaWw0OTY1X3J4X2luaXQoaWwsIHJ4cSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXJ4cS0+bmVlZF91cGRhdGUgPSAxOworCWlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoaWwsIHJ4cSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogQWxsb2NhdGUgb3IgcmVzZXQgYW5kIGluaXQgYWxsIFR4IGFuZCBDb21tYW5kIHF1ZXVlcyAqLworCWlmICghaWwtPnR4cSkgeworCQlyZXQgPSBpbDQ5NjVfdHhxX2N0eF9hbGxvYyhpbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZQorCQlpbDQ5NjVfdHhxX2N0eF9yZXNldChpbCk7CisKKwlzZXRfYml0KFNfSU5JVCwgJmlsLT5zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWw0OTY1X2RtYV9hZGRyMnJiZF9wdHIgLSBjb252ZXJ0IGEgRE1BIGFkZHJlc3MgdG8gYSB1Q29kZSByZWFkIGJ1ZmZlciBwdHIKKyAqLworc3RhdGljIGlubGluZSBfX2xlMzIKK2lsNDk2NV9kbWFfYWRkcjJyYmRfcHRyKHN0cnVjdCBpbF9wcml2ICppbCwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gY3B1X3RvX2xlMzIoKHUzMikgKGRtYV9hZGRyID4+IDgpKTsKK30KKworLyoqCisgKiBpbDQ5NjVfcnhfcXVldWVfcmVzdG9jayAtIHJlZmlsbCBSWCBxdWV1ZSBmcm9tIHByZS1hbGxvY2F0ZWQgcG9vbAorICoKKyAqIElmIHRoZXJlIGFyZSBzbG90cyBpbiB0aGUgUlggcXVldWUgdGhhdCBuZWVkIHRvIGJlIHJlc3RvY2tlZCwKKyAqIGFuZCB3ZSBoYXZlIGZyZWUgcHJlLWFsbG9jYXRlZCBidWZmZXJzLCBmaWxsIHRoZSByYW5rcyBhcyBtdWNoCisgKiBhcyB3ZSBjYW4sIHB1bGxpbmcgZnJvbSByeF9mcmVlLgorICoKKyAqIFRoaXMgbW92ZXMgdGhlICd3cml0ZScgaWR4IGZvcndhcmQgdG8gY2F0Y2ggdXAgd2l0aCAncHJvY2Vzc2VkJywgYW5kCisgKiBhbHNvIHVwZGF0ZXMgdGhlIG1lbW9yeSBhZGRyZXNzIGluIHRoZSBmaXJtd2FyZSB0byByZWZlcmVuY2UgdGhlIG5ldworICogdGFyZ2V0IGJ1ZmZlci4KKyAqLwordm9pZAoraWw0OTY1X3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlzdHJ1Y3QgaWxfcnhfYnVmICpyeGI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwl3aGlsZSAoaWxfcnhfcXVldWVfc3BhY2UocnhxKSA+IDAgJiYgcnhxLT5mcmVlX2NvdW50KSB7CisJCS8qIFRoZSBvdmVyd3JpdHRlbiByeGIgbXVzdCBiZSBhIHVzZWQgb25lICovCisJCXJ4YiA9IHJ4cS0+cXVldWVbcnhxLT53cml0ZV07CisJCUJVR19PTihyeGIgJiYgcnhiLT5wYWdlKTsKKworCQkvKiBHZXQgbmV4dCBmcmVlIFJ4IGJ1ZmZlciwgcmVtb3ZlIGZyb20gZnJlZSBsaXN0ICovCisJCWVsZW1lbnQgPSByeHEtPnJ4X2ZyZWUubmV4dDsKKwkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWxfcnhfYnVmLCBsaXN0KTsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisKKwkJLyogUG9pbnQgdG8gUnggYnVmZmVyIHZpYSBuZXh0IFJCRCBpbiBjaXJjdWxhciBidWZmZXIgKi8KKwkJcnhxLT5iZFtyeHEtPndyaXRlXSA9CisJCSAgICBpbDQ5NjVfZG1hX2FkZHIycmJkX3B0cihpbCwgcnhiLT5wYWdlX2RtYSk7CisJCXJ4cS0+cXVldWVbcnhxLT53cml0ZV0gPSByeGI7CisJCXJ4cS0+d3JpdGUgPSAocnhxLT53cml0ZSArIDEpICYgUlhfUVVFVUVfTUFTSzsKKwkJcnhxLT5mcmVlX2NvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCS8qIElmIHRoZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciBwb29sIGlzIGRyb3BwaW5nIGxvdywgc2NoZWR1bGUgdG8KKwkgKiByZWZpbGwgaXQgKi8KKwlpZiAocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUkspCisJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yeF9yZXBsZW5pc2gpOworCisJLyogSWYgd2UndmUgYWRkZWQgbW9yZSBzcGFjZSBmb3IgdGhlIGZpcm13YXJlIHRvIHBsYWNlIGRhdGEsIHRlbGwgaXQuCisJICogSW5jcmVtZW50IGRldmljZSdzIHdyaXRlIHBvaW50ZXIgaW4gbXVsdGlwbGVzIG9mIDguICovCisJaWYgKHJ4cS0+d3JpdGVfYWN0dWFsICE9IChyeHEtPndyaXRlICYgfjB4NykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlyeHEtPm5lZWRfdXBkYXRlID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCWlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoaWwsIHJ4cSk7CisJfQorfQorCisvKioKKyAqIGlsNDk2NV9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQorICoKKyAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCisgKgorICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaWxfcnhfcXVldWVfcmVzdG9jay4KKyAqIFRoaXMgaXMgY2FsbGVkIGFzIGEgc2NoZWR1bGVkIHdvcmsgaXRlbSAoZXhjZXB0IGZvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24pCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnhfYWxsb2NhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCBnZnBfdCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSA9ICZpbC0+cnhxOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJc3RydWN0IGlsX3J4X2J1ZiAqcnhiOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZ2ZwX3QgZ2ZwX21hc2sgPSBwcmlvcml0eTsKKworCXdoaWxlICgxKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWlmIChyeHEtPmZyZWVfY291bnQgPiBSWF9MT1dfV0FURVJNQVJLKQorCQkJZ2ZwX21hc2sgfD0gX19HRlBfTk9XQVJOOworCisJCWlmIChpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIgPiAwKQorCQkJZ2ZwX21hc2sgfD0gX19HRlBfQ09NUDsKKworCQkvKiBBbGxvYyBhIG5ldyByZWNlaXZlIGJ1ZmZlciAqLworCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwX21hc2ssIGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7CisJCWlmICghcGFnZSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlEX0lORk8oImFsbG9jX3BhZ2VzIGZhaWxlZCwgIiAib3JkZXI6ICVkXG4iLAorCQkJCSAgICAgICBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOworCisJCQlpZiAocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUksgJiYKKwkJCSAgICBuZXRfcmF0ZWxpbWl0KCkpCisJCQkJSUxfRVJSKCJGYWlsZWQgdG8gYWxsb2NfcGFnZXMgd2l0aCAlcy4gIgorCQkJCSAgICAgICAiT25seSAldSBmcmVlIGJ1ZmZlcnMgcmVtYWluaW5nLlxuIiwKKwkJCQkgICAgICAgcHJpb3JpdHkgPT0KKwkJCQkgICAgICAgR0ZQX0FUT01JQyA/ICJHRlBfQVRPTUlDIiA6ICJHRlBfS0VSTkVMIiwKKwkJCQkgICAgICAgcnhxLT5mcmVlX2NvdW50KTsKKwkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCisJCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKKwkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLworCQkJcmV0dXJuOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJCV9fZnJlZV9wYWdlcyhwYWdlLCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOworCQkJcmV0dXJuOworCQl9CisJCWVsZW1lbnQgPSByeHEtPnJ4X3VzZWQubmV4dDsKKwkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWxfcnhfYnVmLCBsaXN0KTsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJQlVHX09OKHJ4Yi0+cGFnZSk7CisJCXJ4Yi0+cGFnZSA9IHBhZ2U7CisJCS8qIEdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBSQiAqLworCQlyeGItPnBhZ2VfZG1hID0KKwkJICAgIHBjaV9tYXBfcGFnZShpbC0+cGNpX2RldiwgcGFnZSwgMCwKKwkJCQkgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJLyogZG1hIGFkZHJlc3MgbXVzdCBiZSBubyBtb3JlIHRoYW4gMzYgYml0cyAqLworCQlCVUdfT04ocnhiLT5wYWdlX2RtYSAmIH5ETUFfQklUX01BU0soMzYpKTsKKwkJLyogYW5kIGFsc28gMjU2IGJ5dGUgYWxpZ25lZCEgKi8KKwkJQlVHX09OKHJ4Yi0+cGFnZV9kbWEgJiBETUFfQklUX01BU0soOCkpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOworCQlyeHEtPmZyZWVfY291bnQrKzsKKwkJaWwtPmFsbG9jX3J4Yl9wYWdlKys7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJfQorfQorCit2b2lkCitpbDQ5NjVfcnhfcmVwbGVuaXNoKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWw0OTY1X3J4X2FsbG9jYXRlKGlsLCBHRlBfS0VSTkVMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkCitpbDQ5NjVfcnhfcmVwbGVuaXNoX25vdyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWw0OTY1X3J4X2FsbG9jYXRlKGlsLCBHRlBfQVRPTUlDKTsKKworCWlsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrKGlsKTsKK30KKworLyogQXNzdW1lcyB0aGF0IHRoZSBza2IgZmllbGQgb2YgdGhlIGJ1ZmZlcnMgaW4gJ3Bvb2wnIGlzIGtlcHQgYWNjdXJhdGUuCisgKiBJZiBhbiBTS0IgaGFzIGJlZW4gZGV0YWNoZWQsIHRoZSBQT09MIG5lZWRzIHRvIGhhdmUgaXRzIFNLQiBzZXQgdG8gTlVMTAorICogVGhpcyBmcmVlIHJvdXRpbmUgd2Fsa3MgdGhlIGxpc3Qgb2YgUE9PTCBlbnRyaWVzIGFuZCBpZiBTS0IgaXMgc2V0IHRvCisgKiBub24gTlVMTCBpdCBpcyB1bm1hcHBlZCBhbmQgZnJlZWQKKyAqLwordm9pZAoraWw0OTY1X3J4X3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRSArIFJYX0ZSRUVfQlVGRkVSUzsgaSsrKSB7CisJCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7CisJCQlwY2lfdW5tYXBfcGFnZShpbC0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAorCQkJCSAgICAgICBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJX19pbF9mcmVlX3BhZ2VzKGlsLCByeHEtPnBvb2xbaV0ucGFnZSk7CisJCQlyeHEtPnBvb2xbaV0ucGFnZSA9IE5VTEw7CisJCX0KKwl9CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgNCAqIFJYX1FVRVVFX1NJWkUsIHJ4cS0+YmQsCisJCQkgIHJ4cS0+YmRfZG1hKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBpbF9yYl9zdGF0dXMpLAorCQkJICByeHEtPnJiX3N0dHMsIHJ4cS0+cmJfc3R0c19kbWEpOworCXJ4cS0+YmQgPSBOVUxMOworCXJ4cS0+cmJfc3R0cyA9IE5VTEw7Cit9CisKK2ludAoraWw0OTY1X3J4cV9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKworCS8qIHN0b3AgUnggRE1BICovCisJaWxfd3IoaWwsIEZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywgMCk7CisJaWxfcG9sbF9iaXQoaWwsIEZINDlfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRywKKwkJICAgIEZINDlfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFLCAxMDAwKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2lsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHUzMiByYXRlX25fZmxhZ3MsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwlpbnQgaWR4ID0gMDsKKwlpbnQgYmFuZF9vZmZzZXQgPSAwOworCisJLyogSFQgcmF0ZSBmb3JtYXQ6IG1hYzgwMjExIHdhbnRzIGFuIE1DUyBudW1iZXIsIHdoaWNoIGlzIGp1c3QgTFNCICovCisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgeworCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7CisJCXJldHVybiBpZHg7CisJCS8qIExlZ2FjeSByYXRlIGZvcm1hdCwgc2VhcmNoIGZvciBtYXRjaCBpbiB0YWJsZSAqLworCX0gZWxzZSB7CisJCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQliYW5kX29mZnNldCA9IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJZm9yIChpZHggPSBiYW5kX29mZnNldDsgaWR4IDwgUkFURV9DT1VOVF9MRUdBQ1k7IGlkeCsrKQorCQkJaWYgKGlsX3JhdGVzW2lkeF0ucGxjcCA9PSAocmF0ZV9uX2ZsYWdzICYgMHhGRikpCisJCQkJcmV0dXJuIGlkeCAtIGJhbmRfb2Zmc2V0OworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAoraWw0OTY1X2NhbGNfcnNzaShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9waHlfcmVzICpyeF9yZXNwKQoreworCS8qIGRhdGEgZnJvbSBQSFkvRFNQIHJlZ2FyZGluZyBzaWduYWwgc3RyZW5ndGgsIGV0Yy4sCisJICogICBjb250ZW50cyBhcmUgYWx3YXlzIHRoZXJlLCBub3QgY29uZmlndXJhYmxlIGJ5IGhvc3QuICAqLworCXN0cnVjdCBpbDQ5NjVfcnhfbm9uX2NmZ19waHkgKm5jcGh5ID0KKwkgICAgKHN0cnVjdCBpbDQ5NjVfcnhfbm9uX2NmZ19waHkgKilyeF9yZXNwLT5ub25fY2ZnX3BoeV9idWY7CisJdTMyIGFnYyA9CisJICAgIChsZTE2X3RvX2NwdShuY3BoeS0+YWdjX2luZm8pICYgSUw0OV9BR0NfREJfTUFTSykgPj4KKwkgICAgSUw0OV9BR0NfREJfUE9TOworCisJdTMyIHZhbGlkX2FudGVubmFlID0KKwkgICAgKGxlMTZfdG9fY3B1KHJ4X3Jlc3AtPnBoeV9mbGFncykgJiBJTDQ5X1JYX1BIWV9GTEFHU19BTlRFTk5BRV9NQVNLKQorCSAgICA+PiBJTDQ5X1JYX1BIWV9GTEFHU19BTlRFTk5BRV9PRkZTRVQ7CisJdTggbWF4X3Jzc2kgPSAwOworCXUzMiBpOworCisJLyogRmluZCBtYXggcnNzaSBhbW9uZyAzIHBvc3NpYmxlIHJlY2VpdmVycy4KKwkgKiBUaGVzZSB2YWx1ZXMgYXJlIG1lYXN1cmVkIGJ5IHRoZSBkaWdpdGFsIHNpZ25hbCBwcm9jZXNzb3IgKERTUCkuCisJICogVGhleSBzaG91bGQgc3RheSBmYWlybHkgY29uc3RhbnQgZXZlbiBhcyB0aGUgc2lnbmFsIHN0cmVuZ3RoIHZhcmllcywKKwkgKiAgIGlmIHRoZSByYWRpbydzIGF1dG9tYXRpYyBnYWluIGNvbnRyb2wgKEFHQykgaXMgd29ya2luZyByaWdodC4KKwkgKiBBR0MgdmFsdWUgKHNlZSBiZWxvdykgd2lsbCBwcm92aWRlIHRoZSAiaW50ZXJlc3RpbmciIGluZm8uICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJaWYgKHZhbGlkX2FudGVubmFlICYgKDEgPDwgaSkpCisJCQltYXhfcnNzaSA9IG1heChuY3BoeS0+cnNzaV9pbmZvW2kgPDwgMV0sIG1heF9yc3NpKTsKKworCURfU1RBVFMoIlJzc2kgSW4gQSAlZCBCICVkIEMgJWQgTWF4ICVkIEFHQyBkQiAlZFxuIiwKKwkJbmNwaHktPnJzc2lfaW5mb1swXSwgbmNwaHktPnJzc2lfaW5mb1syXSwgbmNwaHktPnJzc2lfaW5mb1s0XSwKKwkJbWF4X3Jzc2ksIGFnYyk7CisKKwkvKiBkQm0gPSBtYXhfcnNzaSBkQiAtIGFnYyBkQiAtIGNvbnN0YW50LgorCSAqIEhpZ2hlciBBR0MgKGhpZ2hlciByYWRpbyBnYWluKSBtZWFucyBsb3dlciBzaWduYWwuICovCisJcmV0dXJuIG1heF9yc3NpIC0gYWdjIC0gSUw0OTY1X1JTU0lfT0ZGU0VUOworfQorCitzdGF0aWMgdTMyCitpbDQ5NjVfdHJhbnNsYXRlX3J4X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBkZWNyeXB0X2luKQoreworCXUzMiBkZWNyeXB0X291dCA9IDA7CisKKwlpZiAoKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NUQVRJT05fRk9VTkQpID09CisJICAgIFJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCkKKwkJZGVjcnlwdF9vdXQgfD0KKwkJICAgIChSWF9SRVNfU1RBVFVTX1NUQVRJT05fRk9VTkQgfAorCQkgICAgIFJYX1JFU19TVEFUVVNfTk9fU1RBVElPTl9JTkZPX01JU01BVENIKTsKKworCWRlY3J5cHRfb3V0IHw9IChkZWNyeXB0X2luICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spOworCisJLyogcGFja2V0IHdhcyBub3QgZW5jcnlwdGVkICovCisJaWYgKChkZWNyeXB0X2luICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spID09CisJICAgIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTk9ORSkKKwkJcmV0dXJuIGRlY3J5cHRfb3V0OworCisJLyogcGFja2V0IHdhcyBlbmNyeXB0ZWQgd2l0aCB1bmtub3duIGFsZyAqLworCWlmICgoZGVjcnlwdF9pbiAmIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLKSA9PQorCSAgICBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX0VSUikKKwkJcmV0dXJuIGRlY3J5cHRfb3V0OworCisJLyogZGVjcnlwdGlvbiB3YXMgbm90IGRvbmUgaW4gSFcgKi8KKwlpZiAoKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfREVDX0RPTkVfTVNLKSAhPQorCSAgICBSWF9NUERVX1JFU19TVEFUVVNfREVDX0RPTkVfTVNLKQorCQlyZXR1cm4gZGVjcnlwdF9vdXQ7CisKKwlzd2l0Y2ggKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSykgeworCisJY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX0NDTVA6CisJCS8qIGFsZyBpcyBDQ006IGNoZWNrIE1JQyBvbmx5ICovCisJCWlmICghKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfTUlDX09LKSkKKwkJCS8qIEJhZCBNSUMgKi8KKwkJCWRlY3J5cHRfb3V0IHw9IFJYX1JFU19TVEFUVVNfQkFEX0lDVl9NSUM7CisJCWVsc2UKKwkJCWRlY3J5cHRfb3V0IHw9IFJYX1JFU19TVEFUVVNfREVDUllQVF9PSzsKKworCQlicmVhazsKKworCWNhc2UgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9US0lQOgorCQlpZiAoIShkZWNyeXB0X2luICYgUlhfTVBEVV9SRVNfU1RBVFVTX1RUQUtfT0spKSB7CisJCQkvKiBCYWQgVFRBSyAqLworCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfS0VZX1RUQUs7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggaWYgVFRBSyBPSyAqLworCWRlZmF1bHQ6CisJCWlmICghKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfSUNWX09LKSkKKwkJCWRlY3J5cHRfb3V0IHw9IFJYX1JFU19TVEFUVVNfQkFEX0lDVl9NSUM7CisJCWVsc2UKKwkJCWRlY3J5cHRfb3V0IHw9IFJYX1JFU19TVEFUVVNfREVDUllQVF9PSzsKKwkJYnJlYWs7CisJfQorCisJRF9SWCgiZGVjcnlwdF9pbjoweCV4ICBkZWNyeXB0X291dCA9IDB4JXhcbiIsIGRlY3J5cHRfaW4sIGRlY3J5cHRfb3V0KTsKKworCXJldHVybiBkZWNyeXB0X291dDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9wYXNzX3BhY2tldF90b19tYWM4MDIxMShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkgICAgICAgdTE2IGxlbiwgdTMyIGFtcGR1X3N0YXR1cywgc3RydWN0IGlsX3J4X2J1ZiAqcnhiLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0cykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKKworCS8qIFdlIG9ubHkgcHJvY2VzcyBkYXRhIHBhY2tldHMgaWYgdGhlIGludGVyZmFjZSBpcyBvcGVuICovCisJaWYgKHVubGlrZWx5KCFpbC0+aXNfb3BlbikpIHsKKwkJRF9EUk9QKCJEcm9wcGluZyBwYWNrZXQgd2hpbGUgaW50ZXJmYWNlIGlzIG5vdCBvcGVuLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBJbiBjYXNlIG9mIEhXIGFjY2VsZXJhdGVkIGNyeXB0byBhbmQgYmFkIGRlY3J5cHRpb24sIGRyb3AgKi8KKwlpZiAoIWlsLT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0byAmJgorCSAgICBpbF9zZXRfZGVjcnlwdGVkX2ZsYWcoaWwsIGhkciwgYW1wZHVfc3RhdHVzLCBzdGF0cykpCisJCXJldHVybjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKKwlpZiAoIXNrYikgeworCQlJTF9FUlIoImRldl9hbGxvY19za2IgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9hZGRfcnhfZnJhZyhza2IsIDAsIHJ4Yi0+cGFnZSwgKHZvaWQgKiloZHIgLSByeGJfYWRkcihyeGIpLCBsZW4pOworCisJaWxfdXBkYXRlX3N0YXRzKGlsLCBmYWxzZSwgZmMsIGxlbik7CisJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpOworCisJaWVlZTgwMjExX3J4KGlsLT5odywgc2tiKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKKwlyeGItPnBhZ2UgPSBOVUxMOworfQorCisvKiBDYWxsZWQgZm9yIE5fUlggKGxlZ2FjeSBBQkcgZnJhbWVzKSwgb3IKKyAqIE5fUlhfTVBEVSAoSFQgaGlnaC10aHJvdWdocHV0IE4gZnJhbWVzKS4gKi8KK3ZvaWQKK2lsNDk2NV9oZGxfcngoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXM7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfcnhfcGh5X3JlcyAqcGh5X3JlczsKKwlfX2xlMzIgcnhfcGt0X3N0YXR1czsKKwlzdHJ1Y3QgaWxfcnhfbXBkdV9yZXNfc3RhcnQgKmFtc2R1OworCXUzMiBsZW47CisJdTMyIGFtcGR1X3N0YXR1czsKKwl1MzIgcmF0ZV9uX2ZsYWdzOworCisJLyoqCisJICogTl9SWCBhbmQgTl9SWF9NUERVIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LgorCSAqCU5fUlg6IHBoeXNpY2FsIGxheWVyIGluZm8gaXMgaW4gdGhpcyBidWZmZXIKKwkgKglOX1JYX01QRFU6IHBoeXNpY2FsIGxheWVyIGluZm8gd2FzIHNlbnQgaW4gc2VwYXJhdGUKKwkgKgkJY29tbWFuZCBhbmQgY2FjaGVkIGluIGlsLT5sYXN0X3BoeV9yZXMKKwkgKgorCSAqIEhlcmUgd2Ugc2V0IHVwIGxvY2FsIHZhcmlhYmxlcyBkZXBlbmRpbmcgb24gd2hpY2ggY29tbWFuZCBpcworCSAqIHJlY2VpdmVkLgorCSAqLworCWlmIChwa3QtPmhkci5jbWQgPT0gTl9SWCkgeworCQlwaHlfcmVzID0gKHN0cnVjdCBpbF9yeF9waHlfcmVzICopcGt0LT51LnJhdzsKKwkJaGVhZGVyID0KKwkJICAgIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCpwaHlfcmVzKSArCisJCQkJCSAgICAgcGh5X3Jlcy0+Y2ZnX3BoeV9jbnQpOworCisJCWxlbiA9IGxlMTZfdG9fY3B1KHBoeV9yZXMtPmJ5dGVfY291bnQpOworCQlyeF9wa3Rfc3RhdHVzID0KKwkJICAgICooX19sZTMyICopIChwa3QtPnUucmF3ICsgc2l6ZW9mKCpwaHlfcmVzKSArCisJCQkJIHBoeV9yZXMtPmNmZ19waHlfY250ICsgbGVuKTsKKwkJYW1wZHVfc3RhdHVzID0gbGUzMl90b19jcHUocnhfcGt0X3N0YXR1cyk7CisJfSBlbHNlIHsKKwkJaWYgKCFpbC0+XzQ5NjUubGFzdF9waHlfcmVzX3ZhbGlkKSB7CisJCQlJTF9FUlIoIk1QRFUgZnJhbWUgd2l0aG91dCBjYWNoZWQgUEhZIGRhdGFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCXBoeV9yZXMgPSAmaWwtPl80OTY1Lmxhc3RfcGh5X3JlczsKKwkJYW1zZHUgPSAoc3RydWN0IGlsX3J4X21wZHVfcmVzX3N0YXJ0ICopcGt0LT51LnJhdzsKKwkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKHBrdC0+dS5yYXcgKyBzaXplb2YoKmFtc2R1KSk7CisJCWxlbiA9IGxlMTZfdG9fY3B1KGFtc2R1LT5ieXRlX2NvdW50KTsKKwkJcnhfcGt0X3N0YXR1cyA9ICooX19sZTMyICopIChwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkgKyBsZW4pOworCQlhbXBkdV9zdGF0dXMgPQorCQkgICAgaWw0OTY1X3RyYW5zbGF0ZV9yeF9zdGF0dXMoaWwsIGxlMzJfdG9fY3B1KHJ4X3BrdF9zdGF0dXMpKTsKKwl9CisKKwlpZiAoKHVubGlrZWx5KHBoeV9yZXMtPmNmZ19waHlfY250ID4gMjApKSkgeworCQlEX0RST1AoImRzcCBzaXplIG91dCBvZiByYW5nZSBbMCwyMF06ICVkL24iLAorCQkgICAgICAgcGh5X3Jlcy0+Y2ZnX3BoeV9jbnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEocnhfcGt0X3N0YXR1cyAmIFJYX1JFU19TVEFUVVNfTk9fQ1JDMzJfRVJST1IpIHx8CisJICAgICEocnhfcGt0X3N0YXR1cyAmIFJYX1JFU19TVEFUVVNfTk9fUlhFX09WRVJGTE9XKSkgeworCQlEX1JYKCJCYWQgQ1JDIG9yIEZJRk86IDB4JTA4WC5cbiIsIGxlMzJfdG9fY3B1KHJ4X3BrdF9zdGF0dXMpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoaXMgd2lsbCBiZSB1c2VkIGluIHNldmVyYWwgcGxhY2VzIGxhdGVyICovCisJcmF0ZV9uX2ZsYWdzID0gbGUzMl90b19jcHUocGh5X3Jlcy0+cmF0ZV9uX2ZsYWdzKTsKKworCS8qIHJ4X3N0YXR1cyBjYXJyaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWNrZXQgdG8gbWFjODAyMTEgKi8KKwlyeF9zdGF0dXMubWFjdGltZSA9IGxlNjRfdG9fY3B1KHBoeV9yZXMtPnRpbWVzdGFtcCk7CisJcnhfc3RhdHVzLmJhbmQgPQorCSAgICAocGh5X3Jlcy0+CisJICAgICBwaHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX0JBTkRfMjRfTVNLKSA/IElFRUU4MDIxMV9CQU5EXzJHSFogOgorCSAgICBJRUVFODAyMTFfQkFORF81R0haOworCXJ4X3N0YXR1cy5mcmVxID0KKwkgICAgaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGxlMTZfdG9fY3B1KHBoeV9yZXMtPmNoYW5uZWwpLAorCQkJCQkgICByeF9zdGF0dXMuYmFuZCk7CisJcnhfc3RhdHVzLnJhdGVfaWR4ID0KKwkgICAgaWw0OTY1X2h3cmF0ZV90b19tYWM4MDIxMV9pZHgocmF0ZV9uX2ZsYWdzLCByeF9zdGF0dXMuYmFuZCk7CisJcnhfc3RhdHVzLmZsYWcgPSAwOworCisJLyogVFNGIGlzbid0IHJlbGlhYmxlLiBJbiBvcmRlciB0byBhbGxvdyBzbW9vdGggdXNlciBleHBlcmllbmNlLAorCSAqIHRoaXMgVy9BIGRvZXNuJ3QgcHJvcGFnYXRlIGl0IHRvIHRoZSBtYWM4MDIxMSAqLworCS8qcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19NQUNUSU1FX01QRFU7ICovCisKKwlpbC0+dWNvZGVfYmVhY29uX3RpbWUgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5iZWFjb25fdGltZV9zdGFtcCk7CisKKwkvKiBGaW5kIG1heCBzaWduYWwgc3RyZW5ndGggKGRCbSkgYW1vbmcgMyBhbnRlbm5hL3JlY2VpdmVyIGNoYWlucyAqLworCXJ4X3N0YXR1cy5zaWduYWwgPSBpbDQ5NjVfY2FsY19yc3NpKGlsLCBwaHlfcmVzKTsKKworCWlsX2RiZ19sb2dfcnhfZGF0YV9mcmFtZShpbCwgbGVuLCBoZWFkZXIpOworCURfU1RBVFMoIlJzc2kgJWQsIFRTRiAlbGx1XG4iLCByeF9zdGF0dXMuc2lnbmFsLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXJ4X3N0YXR1cy5tYWN0aW1lKTsKKworCS8qCisJICogImFudGVubmEgbnVtYmVyIgorCSAqCisJICogSXQgc2VlbXMgdGhhdCB0aGUgYW50ZW5uYSBmaWVsZCBpbiB0aGUgcGh5IGZsYWdzIHZhbHVlCisJICogaXMgYWN0dWFsbHkgYSBiaXQgZmllbGQuIFRoaXMgaXMgdW5kZWZpbmVkIGJ5IHJhZGlvdGFwLAorCSAqIGl0IHdhbnRzIGFuIGFjdHVhbCBhbnRlbm5hIG51bWJlciBidXQgSSBhbHdheXMgZ2V0ICI3IgorCSAqIGZvciBtb3N0IGxlZ2FjeSBmcmFtZXMgSSByZWNlaXZlIGluZGljYXRpbmcgdGhhdCB0aGUKKwkgKiBzYW1lIGZyYW1lIHdhcyByZWNlaXZlZCBvbiBhbGwgdGhyZWUgUlggY2hhaW5zLgorCSAqCisJICogSSB0aGluayB0aGlzIGZpZWxkIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGEKKwkgKiBuZXcgODAyLjExbiByYWRpb3RhcCBmaWVsZCAiUlggY2hhaW5zIiB0aGF0IGlzIGRlZmluZWQKKwkgKiBhcyBhIGJpdG1hc2suCisJICovCisJcnhfc3RhdHVzLmFudGVubmEgPQorCSAgICAobGUxNl90b19jcHUocGh5X3Jlcy0+cGh5X2ZsYWdzKSAmIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spID4+CisJICAgIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9QT1M7CisKKwkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAocGh5X3Jlcy0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0spCisJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7CisKKwkvKiBTZXQgdXAgdGhlIEhUIHBoeSBmbGFncyAqLworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCisJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSFQ7CisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUNDBfTVNLKQorCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHXzQwTUhaOworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQorCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX1NIT1JUX0dJOworCisJaWw0OTY1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKGlsLCBoZWFkZXIsIGxlbiwgYW1wZHVfc3RhdHVzLCByeGIsCisJCQkJICAgICAgICZyeF9zdGF0dXMpOworfQorCisvKiBDYWNoZSBwaHkgZGF0YSAoUnggc2lnbmFsIHN0cmVuZ3RoLCBldGMpIGZvciBIVCBmcmFtZSAoTl9SWF9QSFkpLgorICogVGhpcyB3aWxsIGJlIHVzZWQgbGF0ZXIgaW4gaWxfaGRsX3J4KCkgZm9yIE5fUlhfTVBEVS4gKi8KK3ZvaWQKK2lsNDk2NV9oZGxfcnhfcGh5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJaWwtPl80OTY1Lmxhc3RfcGh5X3Jlc192YWxpZCA9IHRydWU7CisJbWVtY3B5KCZpbC0+XzQ5NjUubGFzdF9waHlfcmVzLCBwa3QtPnUucmF3LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX3J4X3BoeV9yZXMpKTsKK30KKworc3RhdGljIGludAoraWw0OTY1X2dldF9jaGFubmVsc19mb3Jfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgdTggaXNfYWN0aXZlLAorCQkJICAgICB1OCBuX3Byb2Jlcywgc3RydWN0IGlsX3NjYW5fY2hhbm5lbCAqc2Nhbl9jaCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKwl1MTYgcGFzc2l2ZV9kd2VsbCA9IDA7CisJdTE2IGFjdGl2ZV9kd2VsbCA9IDA7CisJaW50IGFkZGVkLCBpOworCXUxNiBjaGFubmVsOworCisJc2JhbmQgPSBpbF9nZXRfaHdfbW9kZShpbCwgYmFuZCk7CisJaWYgKCFzYmFuZCkKKwkJcmV0dXJuIDA7CisKKwlhY3RpdmVfZHdlbGwgPSBpbF9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUoaWwsIGJhbmQsIG5fcHJvYmVzKTsKKwlwYXNzaXZlX2R3ZWxsID0gaWxfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZShpbCwgYmFuZCwgdmlmKTsKKworCWlmIChwYXNzaXZlX2R3ZWxsIDw9IGFjdGl2ZV9kd2VsbCkKKwkJcGFzc2l2ZV9kd2VsbCA9IGFjdGl2ZV9kd2VsbCArIDE7CisKKwlmb3IgKGkgPSAwLCBhZGRlZCA9IDA7IGkgPCBpbC0+c2Nhbl9yZXF1ZXN0LT5uX2NoYW5uZWxzOyBpKyspIHsKKwkJY2hhbiA9IGlsLT5zY2FuX3JlcXVlc3QtPmNoYW5uZWxzW2ldOworCisJCWlmIChjaGFuLT5iYW5kICE9IGJhbmQpCisJCQljb250aW51ZTsKKworCQljaGFubmVsID0gY2hhbi0+aHdfdmFsdWU7CisJCXNjYW5fY2gtPmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaGFubmVsKTsKKworCQljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgYmFuZCwgY2hhbm5lbCk7CisJCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgeworCQkJRF9TQ0FOKCJDaGFubmVsICVkIGlzIElOVkFMSUQgZm9yIHRoaXMgYmFuZC5cbiIsCisJCQkgICAgICAgY2hhbm5lbCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghaXNfYWN0aXZlIHx8IGlsX2lzX2NoYW5uZWxfcGFzc2l2ZShjaF9pbmZvKSB8fAorCQkgICAgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSkKKwkJCXNjYW5fY2gtPnR5cGUgPSBTQ0FOX0NIQU5ORUxfVFlQRV9QQVNTSVZFOworCQllbHNlCisJCQlzY2FuX2NoLT50eXBlID0gU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFOworCisJCWlmIChuX3Byb2JlcykKKwkJCXNjYW5fY2gtPnR5cGUgfD0gSUxfU0NBTl9QUk9CRV9NQVNLKG5fcHJvYmVzKTsKKworCQlzY2FuX2NoLT5hY3RpdmVfZHdlbGwgPSBjcHVfdG9fbGUxNihhY3RpdmVfZHdlbGwpOworCQlzY2FuX2NoLT5wYXNzaXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYocGFzc2l2ZV9kd2VsbCk7CisKKwkJLyogU2V0IHR4cG93ZXIgbGV2ZWxzIHRvIGRlZmF1bHRzICovCisJCXNjYW5fY2gtPmRzcF9hdHRlbiA9IDExMDsKKworCQkvKiBOT1RFOiBpZiB3ZSB3ZXJlIGRvaW5nIDZNYiBPRkRNIGZvciBzY2FucyB3ZSdkIHVzZQorCQkgKiBwb3dlciBsZXZlbDoKKwkJICogc2Nhbl9jaC0+dHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICgyIDw8IDMpKSB8IDM7CisJCSAqLworCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJc2Nhbl9jaC0+dHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICgzIDw8IDMpKSB8IDM7CisJCWVsc2UKKwkJCXNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoNSA8PCAzKSk7CisKKwkJRF9TQ0FOKCJTY2FubmluZyBjaD0lZCBwcm9iPTB4JVggWyVzICVkXVxuIiwgY2hhbm5lbCwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHNjYW5fY2gtPnR5cGUpLAorCQkgICAgICAgKHNjYW5fY2gtPgorCQkJdHlwZSAmIFNDQU5fQ0hBTk5FTF9UWVBFX0FDVElWRSkgPyAiQUNUSVZFIiA6ICJQQVNTSVZFIiwKKwkJICAgICAgIChzY2FuX2NoLT4KKwkJCXR5cGUgJiBTQ0FOX0NIQU5ORUxfVFlQRV9BQ1RJVkUpID8gYWN0aXZlX2R3ZWxsIDoKKwkJICAgICAgIHBhc3NpdmVfZHdlbGwpOworCisJCXNjYW5fY2grKzsKKwkJYWRkZWQrKzsKKwl9CisKKwlEX1NDQU4oInRvdGFsIGNoYW5uZWxzIHRvIHNjYW4gJWRcbiIsIGFkZGVkKTsKKwlyZXR1cm4gYWRkZWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitpbDQ5NjVfYW50X2lkeF90b19mbGFncyh1OCBhbnRfaWR4KQoreworCXJldHVybiBCSVQoYW50X2lkeCkgPDwgUkFURV9NQ1NfQU5UX1BPUzsKK30KKworaW50CitpbDQ5NjVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX1NDQU4sCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGlsX3NjYW5fY21kKSwKKwkJLmZsYWdzID0gQ01EX1NJWkVfSFVHRSwKKwl9OworCXN0cnVjdCBpbF9zY2FuX2NtZCAqc2NhbjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwl1MzIgcmF0ZV9mbGFncyA9IDA7CisJdTE2IGNtZF9sZW47CisJdTE2IHJ4X2NoYWluID0gMDsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CisJdTggbl9wcm9iZXMgPSAwOworCXU4IHJ4X2FudCA9IGlsLT5od19wYXJhbXMudmFsaWRfcnhfYW50OworCXU4IHJhdGU7CisJYm9vbCBpc19hY3RpdmUgPSBmYWxzZTsKKwlpbnQgY2hhbl9tb2Q7CisJdTggYWN0aXZlX2NoYWluczsKKwl1OCBzY2FuX3R4X2FudGVubmFzID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwljdHggPSBpbF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOworCisJaWYgKCFpbC0+c2Nhbl9jbWQpIHsKKwkJaWwtPnNjYW5fY21kID0KKwkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbF9zY2FuX2NtZCkgKyBJTF9NQVhfU0NBTl9TSVpFLAorCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWlsLT5zY2FuX2NtZCkgeworCQkJRF9TQ0FOKCJmYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc2NhblxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlzY2FuID0gaWwtPnNjYW5fY21kOworCW1lbXNldChzY2FuLCAwLCBzaXplb2Yoc3RydWN0IGlsX3NjYW5fY21kKSArIElMX01BWF9TQ0FOX1NJWkUpOworCisJc2Nhbi0+cXVpZXRfcGxjcF90aCA9IElMX1BMQ1BfUVVJRVRfVEhSRVNIOworCXNjYW4tPnF1aWV0X3RpbWUgPSBJTF9BQ1RJVkVfUVVJRVRfVElNRTsKKworCWlmIChpbF9pc19hbnlfYXNzb2NpYXRlZChpbCkpIHsKKwkJdTE2IGludGVydmFsOworCQl1MzIgZXh0cmE7CisJCXUzMiBzdXNwZW5kX3RpbWUgPSAxMDA7CisJCXUzMiBzY2FuX3N1c3BlbmRfdGltZSA9IDEwMDsKKworCQlEX0lORk8oIlNjYW5uaW5nIHdoaWxlIGFzc29jaWF0ZWQuLi5cbiIpOworCQlpbnRlcnZhbCA9IHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludDsKKworCQlzY2FuLT5zdXNwZW5kX3RpbWUgPSAwOworCQlzY2FuLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMigyMDAgKiAxMDI0KTsKKwkJaWYgKCFpbnRlcnZhbCkKKwkJCWludGVydmFsID0gc3VzcGVuZF90aW1lOworCisJCWV4dHJhID0gKHN1c3BlbmRfdGltZSAvIGludGVydmFsKSA8PCAyMjsKKwkJc2Nhbl9zdXNwZW5kX3RpbWUgPQorCQkgICAgKGV4dHJhIHwgKChzdXNwZW5kX3RpbWUgJSBpbnRlcnZhbCkgKiAxMDI0KSk7CisJCXNjYW4tPnN1c3BlbmRfdGltZSA9IGNwdV90b19sZTMyKHNjYW5fc3VzcGVuZF90aW1lKTsKKwkJRF9TQ0FOKCJzdXNwZW5kX3RpbWUgMHglWCBiZWFjb24gaW50ZXJ2YWwgJWRcbiIsCisJCSAgICAgICBzY2FuX3N1c3BlbmRfdGltZSwgaW50ZXJ2YWwpOworCX0KKworCWlmIChpbC0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzKSB7CisJCWludCBpLCBwID0gMDsKKwkJRF9TQ0FOKCJLaWNraW5nIG9mZiBhY3RpdmUgc2NhblxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBpbC0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKKwkJCS8qIGFsd2F5cyBkb2VzIHdpbGRjYXJkIGFueXdheSAqLworCQkJaWYgKCFpbC0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbikKKwkJCQljb250aW51ZTsKKwkJCXNjYW4tPmRpcmVjdF9zY2FuW3BdLmlkID0gV0xBTl9FSURfU1NJRDsKKwkJCXNjYW4tPmRpcmVjdF9zY2FuW3BdLmxlbiA9CisJCQkgICAgaWwtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW47CisJCQltZW1jcHkoc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uc3NpZCwKKwkJCSAgICAgICBpbC0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLAorCQkJICAgICAgIGlsLT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuKTsKKwkJCW5fcHJvYmVzKys7CisJCQlwKys7CisJCX0KKwkJaXNfYWN0aXZlID0gdHJ1ZTsKKwl9IGVsc2UKKwkJRF9TQ0FOKCJTdGFydCBwYXNzaXZlIHNjYW4uXG4iKTsKKworCXNjYW4tPnR4X2NtZC50eF9mbGFncyA9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJc2Nhbi0+dHhfY21kLnN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOworCXNjYW4tPnR4X2NtZC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKKworCXN3aXRjaCAoaWwtPnNjYW5fYmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJc2Nhbi0+ZmxhZ3MgPSBSWE9OX0ZMR19CQU5EXzI0R19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0s7CisJCWNoYW5fbW9kID0KKwkJICAgIGxlMzJfdG9fY3B1KGlsLT5jdHguYWN0aXZlLgorCQkJCWZsYWdzICYgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01TSykgPj4KKwkJICAgIFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QT1M7CisJCWlmIChjaGFuX21vZCA9PSBDSEFOTkVMX01PREVfUFVSRV80MCkgeworCQkJcmF0ZSA9IFJBVEVfNk1fUExDUDsKKwkJfSBlbHNlIHsKKwkJCXJhdGUgPSBSQVRFXzFNX1BMQ1A7CisJCQlyYXRlX2ZsYWdzID0gUkFURV9NQ1NfQ0NLX01TSzsKKwkJfQorCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6CisJCXJhdGUgPSBSQVRFXzZNX1BMQ1A7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX1dBUk4oIkludmFsaWQgc2NhbiBiYW5kXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiBJZiBhY3RpdmUgc2Nhbm5pbmcgaXMgcmVxdWVzdGVkIGJ1dCBhIGNlcnRhaW4gY2hhbm5lbCBpcworCSAqIG1hcmtlZCBwYXNzaXZlLCB3ZSBjYW4gZG8gYWN0aXZlIHNjYW5uaW5nIGlmIHdlIGRldGVjdAorCSAqIHRyYW5zbWlzc2lvbnMuCisJICoKKwkgKiBUaGVyZSBpcyBhbiBpc3N1ZSB3aXRoIHNvbWUgZmlybXdhcmUgdmVyc2lvbnMgdGhhdCB0cmlnZ2VycworCSAqIGEgc3lzYXNzZXJ0IG9uIGEgImdvb2QgQ1JDIHRocmVzaG9sZCIgb2YgemVybyAoPT0gZGlzYWJsZWQpLAorCSAqIG9uIGEgcmFkYXIgY2hhbm5lbCBldmVuIHRob3VnaCB0aGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIE5PVAorCSAqIHNlbmQgcHJvYmVzLgorCSAqCisJICogVGhlICJnb29kIENSQyB0aHJlc2hvbGQiIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgd2UKKwkgKiBuZWVkIHRvIHJlY2VpdmUgZHVyaW5nIG91ciBkd2VsbCB0aW1lIG9uIGEgY2hhbm5lbCBiZWZvcmUKKwkgKiBzZW5kaW5nIG91dCBwcm9iZXMgLS0gc2V0dGluZyB0aGlzIHRvIGEgaHVnZSB2YWx1ZSB3aWxsCisJICogbWVhbiB3ZSBuZXZlciByZWFjaCBpdCwgYnV0IGF0IHRoZSBzYW1lIHRpbWUgd29yayBhcm91bmQKKwkgKiB0aGUgYWZvcmVtZW50aW9uZWQgaXNzdWUuIFRodXMgdXNlIElMX0dPT0RfQ1JDX1RIX05FVkVSCisJICogaGVyZSBpbnN0ZWFkIG9mIElMX0dPT0RfQ1JDX1RIX0RJU0FCTEVELgorCSAqLworCXNjYW4tPmdvb2RfQ1JDX3RoID0KKwkgICAgaXNfYWN0aXZlID8gSUxfR09PRF9DUkNfVEhfREVGQVVMVCA6IElMX0dPT0RfQ1JDX1RIX05FVkVSOworCisJYmFuZCA9IGlsLT5zY2FuX2JhbmQ7CisKKwlpZiAoaWwtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXSkKKwkJcnhfYW50ID0gaWwtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXTsKKworCWlsLT5zY2FuX3R4X2FudFtiYW5kXSA9CisJICAgIGlsNDk2NV90b2dnbGVfdHhfYW50KGlsLCBpbC0+c2Nhbl90eF9hbnRbYmFuZF0sIHNjYW5fdHhfYW50ZW5uYXMpOworCXJhdGVfZmxhZ3MgfD0gaWw0OTY1X2FudF9pZHhfdG9fZmxhZ3MoaWwtPnNjYW5fdHhfYW50W2JhbmRdKTsKKwlzY2FuLT50eF9jbWQucmF0ZV9uX2ZsYWdzID0KKwkgICAgaWw0OTY1X2h3X3NldF9yYXRlX25fZmxhZ3MocmF0ZSwgcmF0ZV9mbGFncyk7CisKKwkvKiBJbiBwb3dlciBzYXZlIG1vZGUgdXNlIG9uZSBjaGFpbiwgb3RoZXJ3aXNlIHVzZSBhbGwgY2hhaW5zICovCisJaWYgKHRlc3RfYml0KFNfUE9XRVJfUE1JLCAmaWwtPnN0YXR1cykpIHsKKwkJLyogcnhfYW50IGhhcyBiZWVuIHNldCB0byBhbGwgdmFsaWQgY2hhaW5zIHByZXZpb3VzbHkgKi8KKwkJYWN0aXZlX2NoYWlucyA9CisJCSAgICByeF9hbnQgJiAoKHU4KSAoaWwtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykpOworCQlpZiAoIWFjdGl2ZV9jaGFpbnMpCisJCQlhY3RpdmVfY2hhaW5zID0gcnhfYW50OworCisJCURfU0NBTigiY2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zOiAldVxuIiwKKwkJICAgICAgIGlsLT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnMpOworCisJCXJ4X2FudCA9IGlsNDk2NV9maXJzdF9hbnRlbm5hKGFjdGl2ZV9jaGFpbnMpOworCX0KKworCS8qIE1JTU8gaXMgbm90IHVzZWQgaGVyZSwgYnV0IHZhbHVlIGlzIHJlcXVpcmVkICovCisJcnhfY2hhaW4gfD0gaWwtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQgPDwgUlhPTl9SWF9DSEFJTl9WQUxJRF9QT1M7CisJcnhfY2hhaW4gfD0gcnhfYW50IDw8IFJYT05fUlhfQ0hBSU5fRk9SQ0VfTUlNT19TRUxfUE9TOworCXJ4X2NoYWluIHw9IHJ4X2FudCA8PCBSWE9OX1JYX0NIQUlOX0ZPUkNFX1NFTF9QT1M7CisJcnhfY2hhaW4gfD0gMHgxIDw8IFJYT05fUlhfQ0hBSU5fRFJJVkVSX0ZPUkNFX1BPUzsKKwlzY2FuLT5yeF9jaGFpbiA9IGNwdV90b19sZTE2KHJ4X2NoYWluKTsKKworCWNtZF9sZW4gPQorCSAgICBpbF9maWxsX3Byb2JlX3JlcShpbCwgKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNjYW4tPmRhdGEsCisJCQkgICAgICB2aWYtPmFkZHIsIGlsLT5zY2FuX3JlcXVlc3QtPmllLAorCQkJICAgICAgaWwtPnNjYW5fcmVxdWVzdC0+aWVfbGVuLAorCQkJICAgICAgSUxfTUFYX1NDQU5fU0laRSAtIHNpemVvZigqc2NhbikpOworCXNjYW4tPnR4X2NtZC5sZW4gPSBjcHVfdG9fbGUxNihjbWRfbGVuKTsKKworCXNjYW4tPmZpbHRlcl9mbGFncyB8PQorCSAgICAoUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0sgfCBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyk7CisKKwlzY2FuLT5jaGFubmVsX2NvdW50ID0KKwkgICAgaWw0OTY1X2dldF9jaGFubmVsc19mb3Jfc2NhbihpbCwgdmlmLCBiYW5kLCBpc19hY3RpdmUsIG5fcHJvYmVzLAorCQkJCQkgKHZvaWQgKikmc2Nhbi0+ZGF0YVtjbWRfbGVuXSk7CisJaWYgKHNjYW4tPmNoYW5uZWxfY291bnQgPT0gMCkgeworCQlEX1NDQU4oImNoYW5uZWwgY291bnQgJWRcbiIsIHNjYW4tPmNoYW5uZWxfY291bnQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljbWQubGVuICs9CisJICAgIGxlMTZfdG9fY3B1KHNjYW4tPnR4X2NtZC5sZW4pICsKKwkgICAgc2Nhbi0+Y2hhbm5lbF9jb3VudCAqIHNpemVvZihzdHJ1Y3QgaWxfc2Nhbl9jaGFubmVsKTsKKwljbWQuZGF0YSA9IHNjYW47CisJc2Nhbi0+bGVuID0gY3B1X3RvX2xlMTYoY21kLmxlbik7CisKKwlzZXRfYml0KFNfU0NBTl9IVywgJmlsLT5zdGF0dXMpOworCisJcmV0ID0gaWxfc2VuZF9jbWRfc3luYyhpbCwgJmNtZCk7CisJaWYgKHJldCkKKwkJY2xlYXJfYml0KFNfU0NBTl9IVywgJmlsLT5zdGF0dXMpOworCisJcmV0dXJuIHJldDsKK30KKworaW50CitpbDQ5NjVfbWFuYWdlX2lic3Nfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICBib29sIGFkZCkKK3sKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCisJaWYgKGFkZCkKKwkJcmV0dXJuIGlsNDk2NV9hZGRfYnNzaWRfc3RhdGlvbihpbCwgdmlmX3ByaXYtPmN0eCwKKwkJCQkJCXZpZi0+YnNzX2NvbmYuYnNzaWQsCisJCQkJCQkmdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkKTsKKwlyZXR1cm4gaWxfcmVtb3ZlX3N0YXRpb24oaWwsIHZpZl9wcml2LT5pYnNzX2Jzc2lkX3N0YV9pZCwKKwkJCQkgdmlmLT5ic3NfY29uZi5ic3NpZCk7Cit9CisKK3ZvaWQKK2lsNDk2NV9mcmVlX3RmZHNfaW5fcXVldWUoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgc3RhX2lkLCBpbnQgdGlkLCBpbnQgZnJlZWQpCit7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPnN0YV9sb2NrKTsKKworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS50ZmRzX2luX3F1ZXVlID49IGZyZWVkKQorCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS50ZmRzX2luX3F1ZXVlIC09IGZyZWVkOworCWVsc2UgeworCQlEX1RYKCJmcmVlIG1vcmUgdGhhbiB0ZmRzX2luX3F1ZXVlICgldTolZClcbiIsCisJCSAgICAgaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSwgZnJlZWQpOworCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS50ZmRzX2luX3F1ZXVlID0gMDsKKwl9Cit9CisKKyNkZWZpbmUgSUxfVFhfUVVFVUVfTVNLCTB4ZmZmZmYKKworc3RhdGljIGJvb2wKK2lsNDk2NV9pc19zaW5nbGVfcnhfc3RyZWFtKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gaWwtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPT0gSUVFRTgwMjExX1NNUFNfU1RBVElDIHx8CisJICAgIGlsLT5jdXJyZW50X2h0X2NvbmZpZy5zaW5nbGVfY2hhaW5fc3VmZmljaWVudDsKK30KKworI2RlZmluZSBJTF9OVU1fUlhfQ0hBSU5TX01VTFRJUExFCTMKKyNkZWZpbmUgSUxfTlVNX1JYX0NIQUlOU19TSU5HTEUJMgorI2RlZmluZSBJTF9OVU1fSURMRV9DSEFJTlNfRFVBTAkyCisjZGVmaW5lIElMX05VTV9JRExFX0NIQUlOU19TSU5HTEUJMQorCisvKgorICogRGV0ZXJtaW5lIGhvdyBtYW55IHJlY2VpdmVyL2FudGVubmEgY2hhaW5zIHRvIHVzZS4KKyAqCisgKiBNb3JlIHByb3ZpZGVzIGJldHRlciByZWNlcHRpb24gdmlhIGRpdmVyc2l0eS4gIEZld2VyIHNhdmVzIHBvd2VyCisgKiBhdCB0aGUgZXhwZW5zZSBvZiB0aHJvdWdocHV0LCBidXQgb25seSB3aGVuIG5vdCBpbiBwb3dlcnNhdmUgdG8KKyAqIHN0YXJ0IHdpdGguCisgKgorICogTUlNTyAoZHVhbCBzdHJlYW0pIHJlcXVpcmVzIGF0IGxlYXN0IDIsIGJ1dCB3b3JrcyBiZXR0ZXIgd2l0aCAzLgorICogVGhpcyBkb2VzIG5vdCBkZXRlcm1pbmUgKndoaWNoKiBjaGFpbnMgdG8gdXNlLCBqdXN0IGhvdyBtYW55LgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfZ2V0X2FjdGl2ZV9yeF9jaGFpbl9jb3VudChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogIyBvZiBSeCBjaGFpbnMgdG8gdXNlIHdoZW4gZXhwZWN0aW5nIE1JTU8uICovCisJaWYgKGlsNDk2NV9pc19zaW5nbGVfcnhfc3RyZWFtKGlsKSkKKwkJcmV0dXJuIElMX05VTV9SWF9DSEFJTlNfU0lOR0xFOworCWVsc2UKKwkJcmV0dXJuIElMX05VTV9SWF9DSEFJTlNfTVVMVElQTEU7Cit9CisKKy8qCisgKiBXaGVuIHdlIGFyZSBpbiBwb3dlciBzYXZpbmcgbW9kZSwgdW5sZXNzIGRldmljZSBzdXBwb3J0IHNwYXRpYWwKKyAqIG11bHRpcGxleGluZyBwb3dlciBzYXZlLCB1c2UgdGhlIGFjdGl2ZSBjb3VudCBmb3IgcnggY2hhaW4gY291bnQuCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9nZXRfaWRsZV9yeF9jaGFpbl9jb3VudChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBhY3RpdmVfY250KQoreworCS8qICMgUnggY2hhaW5zIHdoZW4gaWRsaW5nLCBkZXBlbmRpbmcgb24gU01QUyBtb2RlICovCisJc3dpdGNoIChpbC0+Y3VycmVudF9odF9jb25maWcuc21wcykgeworCWNhc2UgSUVFRTgwMjExX1NNUFNfU1RBVElDOgorCWNhc2UgSUVFRTgwMjExX1NNUFNfRFlOQU1JQzoKKwkJcmV0dXJuIElMX05VTV9JRExFX0NIQUlOU19TSU5HTEU7CisJY2FzZSBJRUVFODAyMTFfU01QU19PRkY6CisJCXJldHVybiBhY3RpdmVfY250OworCWRlZmF1bHQ6CisJCVdBUk4oMSwgImludmFsaWQgU01QUyBtb2RlICVkIiwgaWwtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMpOworCQlyZXR1cm4gYWN0aXZlX2NudDsKKwl9Cit9CisKKy8qIHVwIHRvIDQgY2hhaW5zICovCitzdGF0aWMgdTgKK2lsNDk2NV9jb3VudF9jaGFpbl9iaXRtYXAodTMyIGNoYWluX2JpdG1hcCkKK3sKKwl1OCByZXM7CisJcmVzID0gKGNoYWluX2JpdG1hcCAmIEJJVCgwKSkgPj4gMDsKKwlyZXMgKz0gKGNoYWluX2JpdG1hcCAmIEJJVCgxKSkgPj4gMTsKKwlyZXMgKz0gKGNoYWluX2JpdG1hcCAmIEJJVCgyKSkgPj4gMjsKKwlyZXMgKz0gKGNoYWluX2JpdG1hcCAmIEJJVCgzKSkgPj4gMzsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIGlsNDk2NV9zZXRfcnhvbl9jaGFpbiAtIFNldCB1cCBSeCBjaGFpbiB1c2FnZSBpbiAic3RhZ2luZyIgUlhPTiBpbWFnZQorICoKKyAqIFNlbGVjdHMgaG93IG1hbnkgYW5kIHdoaWNoIFJ4IHJlY2VpdmVycy9hbnRlbm5hcy9jaGFpbnMgdG8gdXNlLgorICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIHNjYW4gY29tbWFuZCAuLi4gaXQgcHV0cyBkYXRhIGluIHdyb25nIHBsYWNlLgorICovCit2b2lkCitpbDQ5NjVfc2V0X3J4b25fY2hhaW4oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJYm9vbCBpc19zaW5nbGUgPSBpbDQ5NjVfaXNfc2luZ2xlX3J4X3N0cmVhbShpbCk7CisJYm9vbCBpc19jYW0gPSAhdGVzdF9iaXQoU19QT1dFUl9QTUksICZpbC0+c3RhdHVzKTsKKwl1OCBpZGxlX3J4X2NudCwgYWN0aXZlX3J4X2NudCwgdmFsaWRfcnhfY250OworCXUzMiBhY3RpdmVfY2hhaW5zOworCXUxNiByeF9jaGFpbjsKKworCS8qIFRlbGwgdUNvZGUgd2hpY2ggYW50ZW5uYXMgYXJlIGFjdHVhbGx5IGNvbm5lY3RlZC4KKwkgKiBCZWZvcmUgZmlyc3QgYXNzb2NpYXRpb24sIHdlIGFzc3VtZSBhbGwgYW50ZW5uYXMgYXJlIGNvbm5lY3RlZC4KKwkgKiBKdXN0IGFmdGVyIGZpcnN0IGFzc29jaWF0aW9uLCBpbDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oKQorCSAqICAgIGNoZWNrcyB3aGljaCBhbnRlbm5hcyBhY3R1YWxseSAqYXJlKiBjb25uZWN0ZWQuICovCisJaWYgKGlsLT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnMpCisJCWFjdGl2ZV9jaGFpbnMgPSBpbC0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zOworCWVsc2UKKwkJYWN0aXZlX2NoYWlucyA9IGlsLT5od19wYXJhbXMudmFsaWRfcnhfYW50OworCisJcnhfY2hhaW4gPSBhY3RpdmVfY2hhaW5zIDw8IFJYT05fUlhfQ0hBSU5fVkFMSURfUE9TOworCisJLyogSG93IG1hbnkgcmVjZWl2ZXJzIHNob3VsZCB3ZSB1c2U/ICovCisJYWN0aXZlX3J4X2NudCA9IGlsNDk2NV9nZXRfYWN0aXZlX3J4X2NoYWluX2NvdW50KGlsKTsKKwlpZGxlX3J4X2NudCA9IGlsNDk2NV9nZXRfaWRsZV9yeF9jaGFpbl9jb3VudChpbCwgYWN0aXZlX3J4X2NudCk7CisKKwkvKiBjb3JyZWN0IHJ4IGNoYWluIGNvdW50IGFjY29yZGluZyBodyBzZXR0aW5ncworCSAqIGFuZCBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbgorCSAqLworCXZhbGlkX3J4X2NudCA9IGlsNDk2NV9jb3VudF9jaGFpbl9iaXRtYXAoYWN0aXZlX2NoYWlucyk7CisJaWYgKHZhbGlkX3J4X2NudCA8IGFjdGl2ZV9yeF9jbnQpCisJCWFjdGl2ZV9yeF9jbnQgPSB2YWxpZF9yeF9jbnQ7CisKKwlpZiAodmFsaWRfcnhfY250IDwgaWRsZV9yeF9jbnQpCisJCWlkbGVfcnhfY250ID0gdmFsaWRfcnhfY250OworCisJcnhfY2hhaW4gfD0gYWN0aXZlX3J4X2NudCA8PCBSWE9OX1JYX0NIQUlOX01JTU9fQ05UX1BPUzsKKwlyeF9jaGFpbiB8PSBpZGxlX3J4X2NudCA8PCBSWE9OX1JYX0NIQUlOX0NOVF9QT1M7CisKKwljdHgtPnN0YWdpbmcucnhfY2hhaW4gPSBjcHVfdG9fbGUxNihyeF9jaGFpbik7CisKKwlpZiAoIWlzX3NpbmdsZSAmJiBhY3RpdmVfcnhfY250ID49IElMX05VTV9SWF9DSEFJTlNfU0lOR0xFICYmIGlzX2NhbSkKKwkJY3R4LT5zdGFnaW5nLnJ4X2NoYWluIHw9IFJYT05fUlhfQ0hBSU5fTUlNT19GT1JDRV9NU0s7CisJZWxzZQorCQljdHgtPnN0YWdpbmcucnhfY2hhaW4gJj0gflJYT05fUlhfQ0hBSU5fTUlNT19GT1JDRV9NU0s7CisKKwlEX0FTU09DKCJyeF9jaGFpbj0weCVYIGFjdGl2ZT0lZCBpZGxlPSVkXG4iLCBjdHgtPnN0YWdpbmcucnhfY2hhaW4sCisJCWFjdGl2ZV9yeF9jbnQsIGlkbGVfcnhfY250KTsKKworCVdBUk5fT04oYWN0aXZlX3J4X2NudCA9PSAwIHx8IGlkbGVfcnhfY250ID09IDAgfHwKKwkJYWN0aXZlX3J4X2NudCA8IGlkbGVfcnhfY250KTsKK30KKwordTgKK2lsNDk2NV90b2dnbGVfdHhfYW50KHN0cnVjdCBpbF9wcml2ICppbCwgdTggYW50LCB1OCB2YWxpZCkKK3sKKwlpbnQgaTsKKwl1OCBpbmQgPSBhbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkFURV9BTlRfTlVNIC0gMTsgaSsrKSB7CisJCWluZCA9IChpbmQgKyAxKSA8IFJBVEVfQU5UX05VTSA/IGluZCArIDEgOiAwOworCQlpZiAodmFsaWQgJiBCSVQoaW5kKSkKKwkJCXJldHVybiBpbmQ7CisJfQorCXJldHVybiBhbnQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2lsNDk2NV9nZXRfZmhfc3RyaW5nKGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwkJSUxfQ01EKEZINDlfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRyk7CisJCUlMX0NNRChGSDQ5X1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHKTsKKwkJSUxfQ01EKEZINDlfUlNDU1JfQ0hOTDBfV1BUUik7CisJCUlMX0NNRChGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcpOworCQlJTF9DTUQoRkg0OV9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcpOworCQlJTF9DTUQoRkg0OV9NRU1fUlNTUl9SWF9TVEFUVVNfUkVHKTsKKwkJSUxfQ01EKEZINDlfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWKTsKKwkJSUxfQ01EKEZINDlfVFNTUl9UWF9TVEFUVVNfUkVHKTsKKwkJSUxfQ01EKEZINDlfVFNTUl9UWF9FUlJPUl9SRUcpOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisJfQorfQorCitpbnQKK2lsNDk2NV9kdW1wX2ZoKHN0cnVjdCBpbF9wcml2ICppbCwgY2hhciAqKmJ1ZiwgYm9vbCBkaXNwbGF5KQoreworCWludCBpOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWludCBwb3MgPSAwOworCXNpemVfdCBidWZzeiA9IDA7CisjZW5kaWYKKwlzdGF0aWMgY29uc3QgdTMyIGZoX3RibFtdID0geworCQlGSDQ5X1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcsCisJCUZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcsCisJCUZINDlfUlNDU1JfQ0hOTDBfV1BUUiwKKwkJRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLAorCQlGSDQ5X01FTV9SU1NSX1NIQVJFRF9DVFJMX1JFRywKKwkJRkg0OV9NRU1fUlNTUl9SWF9TVEFUVVNfUkVHLAorCQlGSDQ5X01FTV9SU1NSX1JYX0VOQUJMRV9FUlJfSVJRMkRSViwKKwkJRkg0OV9UU1NSX1RYX1NUQVRVU19SRUcsCisJCUZINDlfVFNTUl9UWF9FUlJPUl9SRUcKKwl9OworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWlmIChkaXNwbGF5KSB7CisJCWJ1ZnN6ID0gQVJSQVlfU0laRShmaF90YmwpICogNDggKyA0MDsKKwkJKmJ1ZiA9IGttYWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCQlpZiAoISpidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoKmJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJGSCByZWdpc3RlciB2YWx1ZXM6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmhfdGJsKTsgaSsrKSB7CisJCQlwb3MgKz0KKwkJCSAgICBzY25wcmludGYoKmJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkJICAgICAgIiAgJTM0czogMFglMDh4XG4iLAorCQkJCSAgICAgIGlsNDk2NV9nZXRfZmhfc3RyaW5nKGZoX3RibFtpXSksCisJCQkJICAgICAgaWxfcmQoaWwsIGZoX3RibFtpXSkpOworCQl9CisJCXJldHVybiBwb3M7CisJfQorI2VuZGlmCisJSUxfRVJSKCJGSCByZWdpc3RlciB2YWx1ZXM6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmaF90YmwpOyBpKyspIHsKKwkJSUxfRVJSKCIgICUzNHM6IDBYJTA4eFxuIiwgaWw0OTY1X2dldF9maF9zdHJpbmcoZmhfdGJsW2ldKSwKKwkJICAgICAgIGlsX3JkKGlsLCBmaF90YmxbaV0pKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2lsNDk2NV9oZGxfbWlzc2VkX2JlYWNvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9taXNzZWRfYmVhY29uX25vdGlmICptaXNzZWRfYmVhY29uOworCisJbWlzc2VkX2JlYWNvbiA9ICZwa3QtPnUubWlzc2VkX2JlYWNvbjsKKwlpZiAobGUzMl90b19jcHUobWlzc2VkX2JlYWNvbi0+Y29uc2VjdXRpdmVfbWlzc2VkX2JlYWNvbnMpID4KKwkgICAgaWwtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkKSB7CisJCURfQ0FMSUIoIm1pc3NlZCBiY24gY25zcSAlZCB0b3RsICVkIHJjZCAlZCBleHBjdGQgJWRcbiIsCisJCQlsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5jb25zZWN1dGl2ZV9taXNzZWRfYmVhY29ucyksCisJCQlsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT50b3RhbF9taXNzZWRfYmVjb25zKSwKKwkJCWxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9yZWN2ZF9iZWFjb25zKSwKKwkJCWxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9leHBlY3RlZF9iZWFjb25zKSk7CisJCWlmICghdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKQorCQkJaWw0OTY1X2luaXRfc2Vuc2l0aXZpdHkoaWwpOworCX0KK30KKworLyogQ2FsY3VsYXRlIG5vaXNlIGxldmVsLCBiYXNlZCBvbiBtZWFzdXJlbWVudHMgZHVyaW5nIG5ldHdvcmsgc2lsZW5jZSBqdXN0CisgKiAgIGJlZm9yZSBhcnJpdmluZyBiZWFjb24uICBUaGlzIG1lYXN1cmVtZW50IGNhbiBiZSBkb25lIG9ubHkgaWYgd2Uga25vdworICogICBleGFjdGx5IHdoZW4gdG8gZXhwZWN0IGJlYWNvbnMsIHRoZXJlZm9yZSBvbmx5IHdoZW4gd2UncmUgYXNzb2NpYXRlZC4gKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnhfY2FsY19ub2lzZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IHN0YXRzX3J4X25vbl9waHkgKnJ4X2luZm87CisJaW50IG51bV9hY3RpdmVfcnggPSAwOworCWludCB0b3RhbF9zaWxlbmNlID0gMDsKKwlpbnQgYmNuX3NpbGVuY2VfYSwgYmNuX3NpbGVuY2VfYiwgYmNuX3NpbGVuY2VfYzsKKwlpbnQgbGFzdF9yeF9ub2lzZTsKKworCXJ4X2luZm8gPSAmKGlsLT5fNDk2NS5zdGF0cy5yeC5nZW5lcmFsKTsKKwliY25fc2lsZW5jZV9hID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKSAmIElOX0JBTkRfRklMVEVSOworCWJjbl9zaWxlbmNlX2IgPQorCSAgICBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7CisJYmNuX3NpbGVuY2VfYyA9CisJICAgIGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYykgJiBJTl9CQU5EX0ZJTFRFUjsKKworCWlmIChiY25fc2lsZW5jZV9hKSB7CisJCXRvdGFsX3NpbGVuY2UgKz0gYmNuX3NpbGVuY2VfYTsKKwkJbnVtX2FjdGl2ZV9yeCsrOworCX0KKwlpZiAoYmNuX3NpbGVuY2VfYikgeworCQl0b3RhbF9zaWxlbmNlICs9IGJjbl9zaWxlbmNlX2I7CisJCW51bV9hY3RpdmVfcngrKzsKKwl9CisJaWYgKGJjbl9zaWxlbmNlX2MpIHsKKwkJdG90YWxfc2lsZW5jZSArPSBiY25fc2lsZW5jZV9jOworCQludW1fYWN0aXZlX3J4Kys7CisJfQorCisJLyogQXZlcmFnZSBhbW9uZyBhY3RpdmUgYW50ZW5uYXMgKi8KKwlpZiAobnVtX2FjdGl2ZV9yeCkKKwkJbGFzdF9yeF9ub2lzZSA9ICh0b3RhbF9zaWxlbmNlIC8gbnVtX2FjdGl2ZV9yeCkgLSAxMDc7CisJZWxzZQorCQlsYXN0X3J4X25vaXNlID0gSUxfTk9JU0VfTUVBU19OT1RfQVZBSUxBQkxFOworCisJRF9DQUxJQigiaW5iYW5kIHNpbGVuY2UgYSAldSwgYiAldSwgYyAldSwgZEJtICVkXG4iLCBiY25fc2lsZW5jZV9hLAorCQliY25fc2lsZW5jZV9iLCBiY25fc2lsZW5jZV9jLCBsYXN0X3J4X25vaXNlKTsKK30KKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisvKgorICogIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIG9mIGFsbCBzdGF0cyBjb3VudGVyIGFyZSBpbiBEV09SRAorICogIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBkZWJ1Z2dpbmcsIGRvIG5vdCBkZWFsIHdpdGgKKyAqICB0aGUgY2FzZSBvZiBjb3VudGVycyByb2xsLW92ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfYWNjdW11bGF0aXZlX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgX19sZTMyICogc3RhdHMpCit7CisJaW50IGksIHNpemU7CisJX19sZTMyICpwcmV2X3N0YXRzOworCXUzMiAqYWNjdW1fc3RhdHM7CisJdTMyICpkZWx0YSwgKm1heF9kZWx0YTsKKwlzdHJ1Y3Qgc3RhdHNfZ2VuZXJhbF9jb21tb24gKmdlbmVyYWwsICphY2N1bV9nZW5lcmFsOworCXN0cnVjdCBzdGF0c190eCAqdHgsICphY2N1bV90eDsKKworCXByZXZfc3RhdHMgPSAoX19sZTMyICopICZpbC0+XzQ5NjUuc3RhdHM7CisJYWNjdW1fc3RhdHMgPSAodTMyICopICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHM7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWxfbm90aWZfc3RhdHMpOworCWdlbmVyYWwgPSAmaWwtPl80OTY1LnN0YXRzLmdlbmVyYWwuY29tbW9uOworCWFjY3VtX2dlbmVyYWwgPSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzLmdlbmVyYWwuY29tbW9uOworCXR4ID0gJmlsLT5fNDk2NS5zdGF0cy50eDsKKwlhY2N1bV90eCA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMudHg7CisJZGVsdGEgPSAodTMyICopICZpbC0+XzQ5NjUuZGVsdGFfc3RhdHM7CisJbWF4X2RlbHRhID0gKHUzMiAqKSAmaWwtPl80OTY1Lm1heF9kZWx0YTsKKworCWZvciAoaSA9IHNpemVvZihfX2xlMzIpOyBpIDwgc2l6ZTsKKwkgICAgIGkgKz0KKwkgICAgIHNpemVvZihfX2xlMzIpLCBzdGF0cysrLCBwcmV2X3N0YXRzKyssIGRlbHRhKyssIG1heF9kZWx0YSsrLAorCSAgICAgYWNjdW1fc3RhdHMrKykgeworCQlpZiAobGUzMl90b19jcHUoKnN0YXRzKSA+IGxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSkgeworCQkJKmRlbHRhID0KKwkJCSAgICAobGUzMl90b19jcHUoKnN0YXRzKSAtIGxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSk7CisJCQkqYWNjdW1fc3RhdHMgKz0gKmRlbHRhOworCQkJaWYgKCpkZWx0YSA+ICptYXhfZGVsdGEpCisJCQkJKm1heF9kZWx0YSA9ICpkZWx0YTsKKwkJfQorCX0KKworCS8qIHJlc2V0IGFjY3VtdWxhdGl2ZSBzdGF0cyBmb3IgIm5vLWNvdW50ZXIiIHR5cGUgc3RhdHMgKi8KKwlhY2N1bV9nZW5lcmFsLT50ZW1wZXJhdHVyZSA9IGdlbmVyYWwtPnRlbXBlcmF0dXJlOworCWFjY3VtX2dlbmVyYWwtPnR0bF90aW1lc3RhbXAgPSBnZW5lcmFsLT50dGxfdGltZXN0YW1wOworfQorI2VuZGlmCisKKyNkZWZpbmUgUkVHX1JFQ0FMSUJfUEVSSU9EICg2MCkKKwordm9pZAoraWw0OTY1X2hkbF9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlpbnQgY2hhbmdlOworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisKKwlEX1JYKCJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKKwkgICAgIChpbnQpc2l6ZW9mKHN0cnVjdCBpbF9ub3RpZl9zdGF0cyksCisJICAgICBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIElMX1JYX0ZSQU1FX1NJWkVfTVNLKTsKKworCWNoYW5nZSA9CisJICAgICgoaWwtPl80OTY1LnN0YXRzLmdlbmVyYWwuY29tbW9uLnRlbXBlcmF0dXJlICE9CisJICAgICAgcGt0LT51LnN0YXRzLmdlbmVyYWwuY29tbW9uLnRlbXBlcmF0dXJlKSB8fAorCSAgICAgKChpbC0+XzQ5NjUuc3RhdHMuZmxhZyAmIFNUQVRTX1JFUExZX0ZMR19IVDQwX01PREVfTVNLKSAhPQorCSAgICAgIChwa3QtPnUuc3RhdHMuZmxhZyAmIFNUQVRTX1JFUExZX0ZMR19IVDQwX01PREVfTVNLKSkpOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJaWw0OTY1X2FjY3VtdWxhdGl2ZV9zdGF0cyhpbCwgKF9fbGUzMiAqKSAmcGt0LT51LnN0YXRzKTsKKyNlbmRpZgorCisJLyogVE9ETzogcmVhZGluZyBzb21lIG9mIHN0YXRzIGlzIHVubmVlZGVkICovCisJbWVtY3B5KCZpbC0+XzQ5NjUuc3RhdHMsICZwa3QtPnUuc3RhdHMsIHNpemVvZihpbC0+XzQ5NjUuc3RhdHMpKTsKKworCXNldF9iaXQoU19TVEFUUywgJmlsLT5zdGF0dXMpOworCisJLyogUmVzY2hlZHVsZSB0aGUgc3RhdHMgdGltZXIgdG8gb2NjdXIgaW4KKwkgKiBSRUdfUkVDQUxJQl9QRVJJT0Qgc2Vjb25kcyB0byBlbnN1cmUgd2UgZ2V0IGEKKwkgKiB0aGVybWFsIHVwZGF0ZSBldmVuIGlmIHRoZSB1Q29kZSBkb2Vzbid0IGdpdmUKKwkgKiB1cyBvbmUgKi8KKwltb2RfdGltZXIoJmlsLT5zdGF0c19wZXJpb2RpYywKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhSRUdfUkVDQUxJQl9QRVJJT0QgKiAxMDAwKSk7CisKKwlpZiAodW5saWtlbHkoIXRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgJiYKKwkgICAgKHBrdC0+aGRyLmNtZCA9PSBOX1NUQVRTKSkgeworCQlpbDQ5NjVfcnhfY2FsY19ub2lzZShpbCk7CisJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5ydW5fdGltZV9jYWxpYl93b3JrKTsKKwl9CisJaWYgKGlsLT5jZmctPm9wcy0+bGliLT50ZW1wX29wcy50ZW1wZXJhdHVyZSAmJiBjaGFuZ2UpCisJCWlsLT5jZmctPm9wcy0+bGliLT50ZW1wX29wcy50ZW1wZXJhdHVyZShpbCk7Cit9CisKK3ZvaWQKK2lsNDk2NV9oZGxfY19zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCisJaWYgKGxlMzJfdG9fY3B1KHBrdC0+dS5zdGF0cy5mbGFnKSAmIFVDT0RFX1NUQVRTX0NMRUFSX01TSykgeworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJCW1lbXNldCgmaWwtPl80OTY1LmFjY3VtX3N0YXRzLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9ub3RpZl9zdGF0cykpOworCQltZW1zZXQoJmlsLT5fNDk2NS5kZWx0YV9zdGF0cywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfbm90aWZfc3RhdHMpKTsKKwkJbWVtc2V0KCZpbC0+XzQ5NjUubWF4X2RlbHRhLCAwLCBzaXplb2Yoc3RydWN0IGlsX25vdGlmX3N0YXRzKSk7CisjZW5kaWYKKwkJRF9SWCgiU3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7CisJfQorCWlsNDk2NV9oZGxfc3RhdHMoaWwsIHJ4Yik7Cit9CisKKworLyoKKyAqIG1hYzgwMjExIHF1ZXVlcywgQUNzLCBoYXJkd2FyZSBxdWV1ZXMsIEZJRk9zLgorICoKKyAqIENmLiBodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi9kZXZlbG9wZXJzL0RvY3VtZW50YXRpb24vbWFjODAyMTEvcXVldWVzCisgKgorICogTWFjODAyMTEgdXNlcyB0aGUgZm9sbG93aW5nIG51bWJlcnMsIHdoaWNoIHdlIGdldCBhcyBmcm9tIGl0CisgKiBieSB3YXkgb2Ygc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik6CisgKgorICogICAgIFZPICAgICAgMAorICogICAgIFZJICAgICAgMQorICogICAgIEJFICAgICAgMgorICogICAgIEJLICAgICAgMworICoKKyAqCisgKiBSZWd1bGFyIChub3QgQS1NUERVKSBmcmFtZXMgYXJlIHB1dCBpbnRvIGhhcmR3YXJlIHF1ZXVlcyBjb3JyZXNwb25kaW5nCisgKiB0byB0aGUgRklGT3MsIHNlZSBjb21tZW50cyBpbiBpd2wtcHJwaC5oLiBBZ2dyZWdhdGVkIGZyYW1lcyBnZXQgdGhlaXIKKyAqIG93biBxdWV1ZSBwZXIgYWdncmVnYXRpb24gc2Vzc2lvbiAoUkEvVElEIGNvbWJpbmF0aW9uKSwgc3VjaCBxdWV1ZXMgYXJlCisgKiBzZXQgdXAgdG8gbWFwIGludG8gRklGT3MgdG9vLCBmb3Igd2hpY2ggd2UgbmVlZCBhbiBBQy0+RklGTyBtYXBwaW5nLiBJbgorICogb3JkZXIgdG8gbWFwIGZyYW1lcyB0byB0aGUgcmlnaHQgcXVldWUsIHdlIGFsc28gbmVlZCBhbiBBQy0+aHcgcXVldWUKKyAqIG1hcHBpbmcuIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZS4KKyAqCisgKiBEdWUgdG8gdGhlIHdheSBodyBxdWV1ZXMgYXJlIHNldCB1cCAoYnkgdGhlIGh3IHNwZWNpZmljIG1vZHVsZXMgbGlrZQorICogNDk2NS5jKSwgdGhlIEFDLT5odyBxdWV1ZSBtYXBwaW5nIGlzIHRoZSBpZGVudGl0eQorICogbWFwcGluZy4KKyAqLworCitzdGF0aWMgY29uc3QgdTggdGlkX3RvX2FjW10gPSB7CisJSUVFRTgwMjExX0FDX0JFLAorCUlFRUU4MDIxMV9BQ19CSywKKwlJRUVFODAyMTFfQUNfQkssCisJSUVFRTgwMjExX0FDX0JFLAorCUlFRUU4MDIxMV9BQ19WSSwKKwlJRUVFODAyMTFfQUNfVkksCisJSUVFRTgwMjExX0FDX1ZPLAorCUlFRUU4MDIxMV9BQ19WTworfTsKKworc3RhdGljIGlubGluZSBpbnQKK2lsNDk2NV9nZXRfYWNfZnJvbV90aWQodTE2IHRpZCkKK3sKKwlpZiAobGlrZWx5KHRpZCA8IEFSUkFZX1NJWkUodGlkX3RvX2FjKSkpCisJCXJldHVybiB0aWRfdG9fYWNbdGlkXTsKKworCS8qIG5vIHN1cHBvcnQgZm9yIFRJRHMgOC0xNSB5ZXQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsNDk2NV9nZXRfZmlmb19mcm9tX3RpZChzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsIHUxNiB0aWQpCit7CisJaWYgKGxpa2VseSh0aWQgPCBBUlJBWV9TSVpFKHRpZF90b19hYykpKQorCQlyZXR1cm4gY3R4LT5hY190b19maWZvW3RpZF90b19hY1t0aWRdXTsKKworCS8qIG5vIHN1cHBvcnQgZm9yIFRJRHMgOC0xNSB5ZXQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIGhhbmRsZSBidWlsZCBDX1RYIGNvbW1hbmQgbm90aWZpY2F0aW9uLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3R4X2NtZF9idWlsZF9iYXNpYyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBpbF90eF9jbWQgKnR4X2NtZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCB1OCBzdGRfaWQpCit7CisJX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCV9fbGUzMiB0eF9mbGFncyA9IHR4X2NtZC0+dHhfZmxhZ3M7CisKKwl0eF9jbWQtPnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOworCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spKSB7CisJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfQUNLX01TSzsKKwkJaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSkKKwkJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykgJiYKKwkJICAgICEobGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkgJiAweGYpKQorCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19UU0ZfTVNLOworCX0gZWxzZSB7CisJCXR4X2ZsYWdzICY9ICh+VFhfQ01EX0ZMR19BQ0tfTVNLKTsKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwl9CisKKwlpZiAoaWVlZTgwMjExX2lzX2JhY2tfcmVxKGZjKSkKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLIHwgVFhfQ01EX0ZMR19JTU1fQkFfUlNQX01BU0s7CisKKwl0eF9jbWQtPnN0YV9pZCA9IHN0ZF9pZDsKKwlpZiAoaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoZmMpKQorCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX01PUkVfRlJBR19NU0s7CisKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgeworCQl1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKKwkJdHhfY21kLT50aWRfdHNwZWMgPSBxY1swXSAmIDB4ZjsKKwkJdHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJfSBlbHNlIHsKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwl9CisKKwlpbF90eF9jbWRfcHJvdGVjdGlvbihpbCwgaW5mbywgZmMsICZ0eF9mbGFncyk7CisKKwl0eF9mbGFncyAmPSB+KFRYX0NNRF9GTEdfQU5UX1NFTF9NU0spOworCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpIHsKKwkJaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpIHx8IGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCisJCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDMpOworCQllbHNlCisJCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDIpOworCX0gZWxzZSB7CisJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gMDsKKwl9CisKKwl0eF9jbWQtPmRyaXZlcl90eG9wID0gMDsKKwl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7CisJdHhfY21kLT5uZXh0X2ZyYW1lX2xlbiA9IDA7Cit9CisKKyNkZWZpbmUgUlRTX0RGQVVMVF9SRVRSWV9MSU1JVAkJNjAKKworc3RhdGljIHZvaWQKK2lsNDk2NV90eF9jbWRfYnVpbGRfcmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9jbWQgKnR4X2NtZCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sIF9fbGUxNiBmYykKK3sKKwl1MzIgcmF0ZV9mbGFnczsKKwlpbnQgcmF0ZV9pZHg7CisJdTggcnRzX3JldHJ5X2xpbWl0OworCXU4IGRhdGFfcmV0cnlfbGltaXQ7CisJdTggcmF0ZV9wbGNwOworCisJLyogU2V0IHJldHJ5IGxpbWl0IG9uIERBVEEgcGFja2V0cyBhbmQgUHJvYmUgUmVzcG9uc2VzICovCisJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSkKKwkJZGF0YV9yZXRyeV9saW1pdCA9IDM7CisJZWxzZQorCQlkYXRhX3JldHJ5X2xpbWl0ID0gSUw0OTY1X0RFRkFVTFRfVFhfUkVUUlk7CisJdHhfY21kLT5kYXRhX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKKworCS8qIFNldCByZXRyeSBsaW1pdCBvbiBSVFMgcGFja2V0cyAqLworCXJ0c19yZXRyeV9saW1pdCA9IFJUU19ERkFVTFRfUkVUUllfTElNSVQ7CisJaWYgKGRhdGFfcmV0cnlfbGltaXQgPCBydHNfcmV0cnlfbGltaXQpCisJCXJ0c19yZXRyeV9saW1pdCA9IGRhdGFfcmV0cnlfbGltaXQ7CisJdHhfY21kLT5ydHNfcmV0cnlfbGltaXQgPSBydHNfcmV0cnlfbGltaXQ7CisKKwkvKiBEQVRBIHBhY2tldHMgd2lsbCB1c2UgdGhlIHVDb2RlIHN0YXRpb24gdGFibGUgZm9yIHJhdGUvYW50ZW5uYQorCSAqIHNlbGVjdGlvbiAqLworCWlmIChpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKKwkJdHhfY21kLT5pbml0aWFsX3JhdGVfaWR4ID0gMDsKKwkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX1NUQV9SQVRFX01TSzsKKwkJcmV0dXJuOworCX0KKworCS8qKgorCSAqIElmIHRoZSBjdXJyZW50IFRYIHJhdGUgc3RvcmVkIGluIG1hYzgwMjExIGhhcyB0aGUgTUNTIGJpdCBzZXQsIGl0J3MKKwkgKiBub3QgcmVhbGx5IGEgVFggcmF0ZS4gIFRodXMsIHdlIHVzZSB0aGUgbG93ZXN0IHN1cHBvcnRlZCByYXRlIGZvcgorCSAqIHRoaXMgYmFuZC4gIEFsc28gdXNlIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIHJhdGUgaWYgdGhlIHN0b3JlZCByYXRlCisJICogaWR4IGlzIGludmFsaWQuCisJICovCisJcmF0ZV9pZHggPSBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeDsKKwlpZiAoKGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKSB8fCByYXRlX2lkeCA8IDAKKwkgICAgfHwgcmF0ZV9pZHggPiBSQVRFX0NPVU5UX0xFR0FDWSkKKwkJcmF0ZV9pZHggPQorCQkgICAgcmF0ZV9sb3dlc3RfaW5kZXgoJmlsLT5iYW5kc1tpbmZvLT5iYW5kXSwKKwkJCQkgICAgICBpbmZvLT5jb250cm9sLnN0YSk7CisJLyogRm9yIDUgR0haIGJhbmQsIHJlbWFwIG1hYzgwMjExIHJhdGUgaW5kaWNlcyBpbnRvIGRyaXZlciBpbmRpY2VzICovCisJaWYgKGluZm8tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJcmF0ZV9pZHggKz0gSUxfRklSU1RfT0ZETV9SQVRFOworCS8qIEdldCBQTENQIHJhdGUgZm9yIHR4X2NtZC0+cmF0ZV9uX2ZsYWdzICovCisJcmF0ZV9wbGNwID0gaWxfcmF0ZXNbcmF0ZV9pZHhdLnBsY3A7CisJLyogWmVybyBvdXQgZmxhZ3MgZm9yIHRoaXMgcGFja2V0ICovCisJcmF0ZV9mbGFncyA9IDA7CisKKwkvKiBTZXQgQ0NLIGZsYWcgYXMgbmVlZGVkICovCisJaWYgKHJhdGVfaWR4ID49IElMX0ZJUlNUX0NDS19SQVRFICYmIHJhdGVfaWR4IDw9IElMX0xBU1RfQ0NLX1JBVEUpCisJCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKKworCS8qIFNldCB1cCBhbnRlbm5hcyAqLworCWlsLT5tZ210X3R4X2FudCA9CisJICAgIGlsNDk2NV90b2dnbGVfdHhfYW50KGlsLCBpbC0+bWdtdF90eF9hbnQsCisJCQkJIGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKKworCXJhdGVfZmxhZ3MgfD0gaWw0OTY1X2FudF9pZHhfdG9fZmxhZ3MoaWwtPm1nbXRfdHhfYW50KTsKKworCS8qIFNldCB0aGUgcmF0ZSBpbiB0aGUgVFggY21kICovCisJdHhfY21kLT5yYXRlX25fZmxhZ3MgPQorCSAgICBpbDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlX3BsY3AsIHJhdGVfZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3R4X2NtZF9idWlsZF9od2NyeXB0byhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJCSAgICAgc3RydWN0IGlsX3R4X2NtZCAqdHhfY21kLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2ZyYWcsCisJCQkgICAgIGludCBzdGFfaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiA9IGluZm8tPmNvbnRyb2wuaHdfa2V5OworCisJc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfQ0NNOworCQltZW1jcHkodHhfY21kLT5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKwkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKKwkJCXR4X2NtZC0+dHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BR0dfQ0NNUF9NU0s7CisJCURfVFgoInR4X2NtZCB3aXRoIEFFUyBod2NyeXB0b1xuIik7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgorCQl0eF9jbWQtPnNlY19jdGwgPSBUWF9DTURfU0VDX1RLSVA7CisJCWllZWU4MDIxMV9nZXRfdGtpcF9wMmsoa2V5Y29uZiwgc2tiX2ZyYWcsIHR4X2NtZC0+a2V5KTsKKwkJRF9UWCgidHhfY21kIHdpdGggdGtpcCBod2NyeXB0b1xuIik7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CisJCXR4X2NtZC0+c2VjX2N0bCB8PSBUWF9DTURfU0VDX0tFWTEyODsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKKwkJdHhfY21kLT5zZWNfY3RsIHw9CisJCSAgICAoVFhfQ01EX1NFQ19XRVAgfCAoa2V5Y29uZi0+a2V5aWR4ICYgVFhfQ01EX1NFQ19NU0spIDw8CisJCSAgICAgVFhfQ01EX1NFQ19TSElGVCk7CisKKwkJbWVtY3B5KCZ0eF9jbWQtPmtleVszXSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCisJCURfVFgoIkNvbmZpZ3VyaW5nIHBhY2tldCBmb3IgV0VQIGVuY3J5cHRpb24gIiAid2l0aCBrZXkgJWRcbiIsCisJCSAgICAga2V5Y29uZi0+a2V5aWR4KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJTF9FUlIoIlVua25vd24gZW5jb2RlIGNpcGhlciAleFxuIiwga2V5Y29uZi0+Y2lwaGVyKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogc3RhcnQgQ19UWCBjb21tYW5kIHByb2Nlc3MKKyAqLworaW50CitpbDQ5NjVfdHhfc2tiKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhID0gaW5mby0+Y29udHJvbC5zdGE7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSBOVUxMOworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxOworCXN0cnVjdCBpbF9xdWV1ZSAqcTsKKwlzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqb3V0X2NtZDsKKwlzdHJ1Y3QgaWxfY21kX21ldGEgKm91dF9tZXRhOworCXN0cnVjdCBpbF90eF9jbWQgKnR4X2NtZDsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwlpbnQgdHhxX2lkOworCWRtYV9hZGRyX3QgcGh5c19hZGRyOworCWRtYV9hZGRyX3QgdHhjbWRfcGh5czsKKwlkbWFfYWRkcl90IHNjcmF0Y2hfcGh5czsKKwl1MTYgbGVuLCBmaXJzdGxlbiwgc2Vjb25kbGVuOworCXUxNiBzZXFfbnVtYmVyID0gMDsKKwlfX2xlMTYgZmM7CisJdTggaGRyX2xlbjsKKwl1OCBzdGFfaWQ7CisJdTggd2FpdF93cml0ZV9wdHIgPSAwOworCXU4IHRpZCA9IDA7CisJdTggKnFjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgaXNfYWdnID0gZmFsc2U7CisKKwlpZiAoaW5mby0+Y29udHJvbC52aWYpCisJCWN0eCA9IGlsX3J4b25fY3R4X2Zyb21fdmlmKGluZm8tPmNvbnRyb2wudmlmKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlmIChpbF9pc19yZmtpbGwoaWwpKSB7CisJCURfRFJPUCgiRHJvcHBpbmcgLSBSRiBLSUxMXG4iKTsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwlmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWlmIChpZWVlODAyMTFfaXNfYXV0aChmYykpCisJCURfVFgoIlNlbmRpbmcgQVVUSCBmcmFtZVxuIik7CisJZWxzZSBpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykpCisJCURfVFgoIlNlbmRpbmcgQVNTT0MgZnJhbWVcbiIpOworCWVsc2UgaWYgKGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCisJCURfVFgoIlNlbmRpbmcgUkVBU1NPQyBmcmFtZVxuIik7CisjZW5kaWYKKworCWhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjKTsKKworCS8qIEZvciBtYW5hZ2VtZW50IGZyYW1lcyB1c2UgYnJvYWRjYXN0IGlkIHRvIGRvIG5vdCBicmVhayBhZ2dyZWdhdGlvbiAqLworCWlmICghaWVlZTgwMjExX2lzX2RhdGEoZmMpKQorCQlzdGFfaWQgPSBjdHgtPmJjYXN0X3N0YV9pZDsKKwllbHNlIHsKKwkJLyogRmluZCBpZHggaW50byBzdGF0aW9uIHRhYmxlIGZvciBkZXN0aW5hdGlvbiBzdGF0aW9uICovCisJCXN0YV9pZCA9IGlsX3N0YV9pZF9vcl9icm9hZGNhc3QoaWwsIGN0eCwgaW5mby0+Y29udHJvbC5zdGEpOworCisJCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSB7CisJCQlEX0RST1AoIkRyb3BwaW5nIC0gSU5WQUxJRCBTVEFUSU9OOiAlcE1cbiIsIGhkci0+YWRkcjEpOworCQkJZ290byBkcm9wX3VubG9jazsKKwkJfQorCX0KKworCURfVFgoInN0YXRpb24gSWQgJWRcbiIsIHN0YV9pZCk7CisKKwlpZiAoc3RhKQorCQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKworCWlmIChzdGFfcHJpdiAmJiBzdGFfcHJpdi0+YXNsZWVwICYmCisJICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUE9MTF9SRVNQT05TRSkpIHsKKwkJLyoKKwkJICogVGhpcyBzZW5kcyBhbiBhc3luY2hyb25vdXMgY29tbWFuZCB0byB0aGUgZGV2aWNlLAorCQkgKiBidXQgd2UgY2FuIHJlbHkgb24gaXQgYmVpbmcgcHJvY2Vzc2VkIGJlZm9yZSB0aGUKKwkJICogbmV4dCBmcmFtZSBpcyBwcm9jZXNzZWQgLS0gYW5kIHRoZSBuZXh0IGZyYW1lIHRvCisJCSAqIHRoaXMgc3RhdGlvbiBpcyB0aGUgb25lIHRoYXQgd2lsbCBjb25zdW1lIHRoaXMKKwkJICogY291bnRlci4KKwkJICogRm9yIG5vdyBzZXQgdGhlIGNvdW50ZXIgdG8ganVzdCAxIHNpbmNlIHdlIGRvIG5vdAorCQkgKiBzdXBwb3J0IHVBUFNEIHlldC4KKwkJICovCisJCWlsNDk2NV9zdGFfbW9kaWZ5X3NsZWVwX3R4X2NvdW50KGlsLCBzdGFfaWQsIDEpOworCX0KKworCS8qCisJICogU2VuZCB0aGlzIGZyYW1lIGFmdGVyIERUSU0gLS0gdGhlcmUncyBhIHNwZWNpYWwgcXVldWUKKwkgKiByZXNlcnZlZCBmb3IgdGhpcyBmb3IgY29udGV4dHMgdGhhdCBzdXBwb3J0IEFQIG1vZGUuCisJICovCisJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9TRU5EX0FGVEVSX0RUSU0pIHsKKwkJdHhxX2lkID0gY3R4LT5tY2FzdF9xdWV1ZTsKKwkJLyoKKwkJICogVGhlIG1pY3JvY29kZSB3aWxsIGNsZWFyIHRoZSBtb3JlIGRhdGEKKwkJICogYml0IGluIHRoZSBsYXN0IGZyYW1lIGl0IHRyYW5zbWl0cy4KKwkJICovCisJCWhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9NT1JFREFUQSk7CisJfSBlbHNlCisJCXR4cV9pZCA9IGN0eC0+YWNfdG9fcXVldWVbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildOworCisJLyogaXJxcyBhbHJlYWR5IGRpc2FibGVkL3NhdmVkIGFib3ZlIHdoZW4gbG9ja2luZyBpbC0+bG9jayAqLworCXNwaW5fbG9jaygmaWwtPnN0YV9sb2NrKTsKKworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CisJCXFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7CisJCXRpZCA9IHFjWzBdICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7CisJCWlmIChXQVJOX09OX09OQ0UodGlkID49IE1BWF9USURfQ09VTlQpKSB7CisJCQlzcGluX3VubG9jaygmaWwtPnN0YV9sb2NrKTsKKwkJCWdvdG8gZHJvcF91bmxvY2s7CisJCX0KKwkJc2VxX251bWJlciA9IGlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnNlcV9udW1iZXI7CisJCXNlcV9udW1iZXIgJj0gSUVFRTgwMjExX1NDVExfU0VROworCQloZHItPnNlcV9jdHJsID0KKwkJICAgIGhkci0+c2VxX2N0cmwgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfU0NUTF9GUkFHKTsKKwkJaGRyLT5zZXFfY3RybCB8PSBjcHVfdG9fbGUxNihzZXFfbnVtYmVyKTsKKwkJc2VxX251bWJlciArPSAweDEwOworCQkvKiBhZ2dyZWdhdGlvbiBpcyBvbiBmb3IgdGhpcyA8c3RhLHRpZD4gKi8KKwkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSAmJgorCQkgICAgaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID09IElMX0FHR19PTikgeworCQkJdHhxX2lkID0gaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnR4cV9pZDsKKwkJCWlzX2FnZyA9IHRydWU7CisJCX0KKwl9CisKKwl0eHEgPSAmaWwtPnR4cVt0eHFfaWRdOworCXEgPSAmdHhxLT5xOworCisJaWYgKHVubGlrZWx5KGlsX3F1ZXVlX3NwYWNlKHEpIDwgcS0+aGlnaF9tYXJrKSkgeworCQlzcGluX3VubG9jaygmaWwtPnN0YV9sb2NrKTsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgeworCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS50ZmRzX2luX3F1ZXVlKys7CisJCWlmICghaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoZmMpKQorCQkJaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uc2VxX251bWJlciA9IHNlcV9udW1iZXI7CisJfQorCisJc3Bpbl91bmxvY2soJmlsLT5zdGFfbG9jayk7CisKKwkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCisJbWVtc2V0KCYodHhxLT50eGJbcS0+d3JpdGVfcHRyXSksIDAsIHNpemVvZihzdHJ1Y3QgaWxfdHhfaW5mbykpOworCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uc2tiID0gc2tiOworCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uY3R4ID0gY3R4OworCisJLyogU2V0IHVwIGZpcnN0IGVtcHR5IGVudHJ5IGluIHF1ZXVlJ3MgYXJyYXkgb2YgVHgvY21kIGJ1ZmZlcnMgKi8KKwlvdXRfY21kID0gdHhxLT5jbWRbcS0+d3JpdGVfcHRyXTsKKwlvdXRfbWV0YSA9ICZ0eHEtPm1ldGFbcS0+d3JpdGVfcHRyXTsKKwl0eF9jbWQgPSAmb3V0X2NtZC0+Y21kLnR4OworCW1lbXNldCgmb3V0X2NtZC0+aGRyLCAwLCBzaXplb2Yob3V0X2NtZC0+aGRyKSk7CisJbWVtc2V0KHR4X2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBpbF90eF9jbWQpKTsKKworCS8qCisJICogU2V0IHVwIHRoZSBUeC1jb21tYW5kIChub3QgTUFDISkgaGVhZGVyLgorCSAqIFN0b3JlIHRoZSBjaG9zZW4gVHggcXVldWUgYW5kIFRGRCBpZHggd2l0aGluIHRoZSBzZXF1ZW5jZSBmaWVsZDsKKwkgKiBhZnRlciBUeCwgdUNvZGUncyBUeCByZXNwb25zZSB3aWxsIHJldHVybiB0aGlzIHZhbHVlIHNvIGRyaXZlciBjYW4KKwkgKiBsb2NhdGUgdGhlIGZyYW1lIHdpdGhpbiB0aGUgdHggcXVldWUgYW5kIGRvIHBvc3QtdHggcHJvY2Vzc2luZy4KKwkgKi8KKwlvdXRfY21kLT5oZHIuY21kID0gQ19UWDsKKwlvdXRfY21kLT5oZHIuc2VxdWVuY2UgPQorCSAgICBjcHVfdG9fbGUxNigodTE2KQorCQkJKFFVRVVFX1RPX1NFUSh0eHFfaWQpIHwgSURYX1RPX1NFUShxLT53cml0ZV9wdHIpKSk7CisKKwkvKiBDb3B5IE1BQyBoZWFkZXIgZnJvbSBza2IgaW50byBjb21tYW5kIGJ1ZmZlciAqLworCW1lbWNweSh0eF9jbWQtPmhkciwgaGRyLCBoZHJfbGVuKTsKKworCS8qIFRvdGFsICMgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKwlsZW4gPSAodTE2KSBza2ItPmxlbjsKKwl0eF9jbWQtPmxlbiA9IGNwdV90b19sZTE2KGxlbik7CisKKwlpZiAoaW5mby0+Y29udHJvbC5od19rZXkpCisJCWlsNDk2NV90eF9jbWRfYnVpbGRfaHdjcnlwdG8oaWwsIGluZm8sIHR4X2NtZCwgc2tiLCBzdGFfaWQpOworCisJLyogVE9ETyBuZWVkIHRoaXMgZm9yIGJ1cnN0IG1vZGUgbGF0ZXIgb24gKi8KKwlpbDQ5NjVfdHhfY21kX2J1aWxkX2Jhc2ljKGlsLCBza2IsIHR4X2NtZCwgaW5mbywgaGRyLCBzdGFfaWQpOworCWlsX2RiZ19sb2dfdHhfZGF0YV9mcmFtZShpbCwgbGVuLCBoZHIpOworCisJaWw0OTY1X3R4X2NtZF9idWlsZF9yYXRlKGlsLCB0eF9jbWQsIGluZm8sIGZjKTsKKworCWlsX3VwZGF0ZV9zdGF0cyhpbCwgdHJ1ZSwgZmMsIGxlbik7CisJLyoKKwkgKiBVc2UgdGhlIGZpcnN0IGVtcHR5IGVudHJ5IGluIHRoaXMgcXVldWUncyBjb21tYW5kIGJ1ZmZlciBhcnJheQorCSAqIHRvIGNvbnRhaW4gdGhlIFR4IGNvbW1hbmQgYW5kIE1BQyBoZWFkZXIgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyCisJICogKHBheWxvYWQgZGF0YSB3aWxsIGJlIGluIGFub3RoZXIgYnVmZmVyKS4KKwkgKiBTaXplIG9mIHRoaXMgdmFyaWVzLCBkdWUgdG8gdmFyeWluZyBNQUMgaGVhZGVyIGxlbmd0aC4KKwkgKiBJZiBlbmQgaXMgbm90IGR3b3JkIGFsaWduZWQsIHdlJ2xsIGhhdmUgMiBleHRyYSBieXRlcyBhdCB0aGUgZW5kCisJICogb2YgdGhlIE1BQyBoZWFkZXIgKGRldmljZSByZWFkcyBvbiBkd29yZCBib3VuZGFyaWVzKS4KKwkgKiBXZSdsbCB0ZWxsIGRldmljZSBhYm91dCB0aGlzIHBhZGRpbmcgbGF0ZXIuCisJICovCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpbF90eF9jbWQpICsgc2l6ZW9mKHN0cnVjdCBpbF9jbWRfaGVhZGVyKSArIGhkcl9sZW47CisJZmlyc3RsZW4gPSAobGVuICsgMykgJiB+MzsKKworCS8qIFRlbGwgTklDIGFib3V0IGFueSAyLWJ5dGUgcGFkZGluZyBhZnRlciBNQUMgaGVhZGVyICovCisJaWYgKGZpcnN0bGVuICE9IGxlbikKKwkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX01IX1BBRF9NU0s7CisKKwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgVHggY29tbWFuZCdzIGhlYWRlciAobm90IE1BQyBoZWFkZXIhKSwKKwkgKiB3aXRoaW4gY29tbWFuZCBidWZmZXIgYXJyYXkuICovCisJdHhjbWRfcGh5cyA9CisJICAgIHBjaV9tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LCAmb3V0X2NtZC0+aGRyLCBmaXJzdGxlbiwKKwkJCSAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJZG1hX3VubWFwX2FkZHJfc2V0KG91dF9tZXRhLCBtYXBwaW5nLCB0eGNtZF9waHlzKTsKKwlkbWFfdW5tYXBfbGVuX3NldChvdXRfbWV0YSwgbGVuLCBmaXJzdGxlbik7CisJLyogQWRkIGJ1ZmZlciBjb250YWluaW5nIFR4IGNvbW1hbmQgYW5kIE1BQyghKSBoZWFkZXIgdG8gVEZEJ3MKKwkgKiBmaXJzdCBlbnRyeSAqLworCWlsLT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQoaWwsIHR4cSwgdHhjbWRfcGh5cywgZmlyc3RsZW4sCisJCQkJCQkgMSwgMCk7CisKKwlpZiAoIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7CisJfSBlbHNlIHsKKwkJd2FpdF93cml0ZV9wdHIgPSAxOworCQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKKwl9CisKKwkvKiBTZXQgdXAgVEZEJ3MgMm5kIGVudHJ5IHRvIHBvaW50IGRpcmVjdGx5IHRvIHJlbWFpbmRlciBvZiBza2IsCisJICogaWYgYW55ICg4MDIuMTEgbnVsbCBmcmFtZXMgaGF2ZSBubyBwYXlsb2FkKS4gKi8KKwlzZWNvbmRsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJaWYgKHNlY29uZGxlbiA+IDApIHsKKwkJcGh5c19hZGRyID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LCBza2ItPmRhdGEgKyBoZHJfbGVuLCBzZWNvbmRsZW4sCisJCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CisJCWlsLT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQoaWwsIHR4cSwgcGh5c19hZGRyLAorCQkJCQkJCSBzZWNvbmRsZW4sIDAsIDApOworCX0KKworCXNjcmF0Y2hfcGh5cyA9CisJICAgIHR4Y21kX3BoeXMgKyBzaXplb2Yoc3RydWN0IGlsX2NtZF9oZWFkZXIpICsKKwkgICAgb2Zmc2V0b2Yoc3RydWN0IGlsX3R4X2NtZCwgc2NyYXRjaCk7CisKKwkvKiB0YWtlIGJhY2sgb3duZXJzaGlwIG9mIERNQSBidWZmZXIgdG8gZW5hYmxlIHVwZGF0ZSAqLworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShpbC0+cGNpX2RldiwgdHhjbWRfcGh5cywgZmlyc3RsZW4sCisJCQkJICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJdHhfY21kLT5kcmFtX2xzYl9wdHIgPSBjcHVfdG9fbGUzMihzY3JhdGNoX3BoeXMpOworCXR4X2NtZC0+ZHJhbV9tc2JfcHRyID0gaWxfZ2V0X2RtYV9oaV9hZGRyKHNjcmF0Y2hfcGh5cyk7CisKKwlEX1RYKCJzZXF1ZW5jZSBuciA9IDBYJXhcbiIsIGxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSkpOworCURfVFgoInR4X2ZsYWdzID0gMFgleFxuIiwgbGUzMl90b19jcHUodHhfY21kLT50eF9mbGFncykpOworCWlsX3ByaW50X2hleF9kdW1wKGlsLCBJTF9ETF9UWCwgKHU4ICopIHR4X2NtZCwgc2l6ZW9mKCp0eF9jbWQpKTsKKwlpbF9wcmludF9oZXhfZHVtcChpbCwgSUxfRExfVFgsICh1OCAqKSB0eF9jbWQtPmhkciwgaGRyX2xlbik7CisKKwkvKiBTZXQgdXAgZW50cnkgZm9yIHRoaXMgVEZEIGluIFR4IGJ5dGUtY291bnQgYXJyYXkgKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKQorCQlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX3VwZGF0ZV9ieXRlX2NudF90YmwoaWwsIHR4cSwKKwkJCQkJCQkgICBsZTE2X3RvX2NwdSh0eF9jbWQtPgorCQkJCQkJCQkgICAgICAgbGVuKSk7CisKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoaWwtPnBjaV9kZXYsIHR4Y21kX3BoeXMsIGZpcnN0bGVuLAorCQkJCSAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCisJLyogVGVsbCBkZXZpY2UgdGhlIHdyaXRlIGlkeCAqanVzdCBwYXN0KiB0aGlzIGxhdGVzdCBmaWxsZWQgVEZEICovCisJcS0+d3JpdGVfcHRyID0gaWxfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyLCBxLT5uX2JkKTsKKwlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgdHhxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyAidHJhbnNtaXR0ZWQiIHN1Y2Nlc3NmdWxseQorCSAqIGFuZCB3ZSB3aWxsIGdldCBhIFRYIHN0YXR1cyBub3RpZmljYXRpb24gZXZlbnR1YWxseSwKKwkgKiByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiByZXQuICJyZXQiIG9ubHkgaW5kaWNhdGVzCisJICogd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlci4KKwkgKi8KKworCS8qCisJICogQXZvaWQgYXRvbWljIG9wcyBpZiBpdCBpc24ndCBhbiBhc3NvY2lhdGVkIGNsaWVudC4KKwkgKiBBbHNvLCBpZiB0aGlzIGlzIGEgcGFja2V0IGZvciBhZ2dyZWdhdGlvbiwgZG9uJ3QKKwkgKiBpbmNyZWFzZSB0aGUgY291bnRlciBiZWNhdXNlIHRoZSB1Y29kZSB3aWxsIHN0b3AKKwkgKiBhZ2dyZWdhdGlvbiBxdWV1ZXMgd2hlbiB0aGVpciByZXNwZWN0aXZlIHN0YXRpb24KKwkgKiBnb2VzIHRvIHNsZWVwLgorCSAqLworCWlmIChzdGFfcHJpdiAmJiBzdGFfcHJpdi0+Y2xpZW50ICYmICFpc19hZ2cpCisJCWF0b21pY19pbmMoJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcyk7CisKKwlpZiAoaWxfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmsgJiYgaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKKwkJaWYgKHdhaXRfd3JpdGVfcHRyKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwkJCXR4cS0+bmVlZF91cGRhdGUgPSAxOworCQkJaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoaWwsIHR4cSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJaWxfc3RvcF9xdWV1ZShpbCwgdHhxKTsKKwkJfQorCX0KKworCXJldHVybiAwOworCitkcm9wX3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsNDk2NV9hbGxvY19kbWFfcHRyKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2RtYV9wdHIgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJcHRyLT5hZGRyID0KKwkgICAgZG1hX2FsbG9jX2NvaGVyZW50KCZpbC0+cGNpX2Rldi0+ZGV2LCBzaXplLCAmcHRyLT5kbWEsIEdGUF9LRVJORUwpOworCWlmICghcHRyLT5hZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwdHItPnNpemUgPSBzaXplOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsNDk2NV9mcmVlX2RtYV9wdHIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZG1hX3B0ciAqcHRyKQoreworCWlmICh1bmxpa2VseSghcHRyLT5hZGRyKSkKKwkJcmV0dXJuOworCisJZG1hX2ZyZWVfY29oZXJlbnQoJmlsLT5wY2lfZGV2LT5kZXYsIHB0ci0+c2l6ZSwgcHRyLT5hZGRyLCBwdHItPmRtYSk7CisJbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKCpwdHIpKTsKK30KKworLyoqCisgKiBpbDQ5NjVfaHdfdHhxX2N0eF9mcmVlIC0gRnJlZSBUWFEgQ29udGV4dAorICoKKyAqIERlc3Ryb3kgYWxsIFRYIERNQSBxdWV1ZXMgYW5kIHN0cnVjdHVyZXMKKyAqLwordm9pZAoraWw0OTY1X2h3X3R4cV9jdHhfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHR4cV9pZDsKKworCS8qIFR4IHF1ZXVlcyAqLworCWlmIChpbC0+dHhxKSB7CisJCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspCisJCQlpZiAodHhxX2lkID09IGlsLT5jbWRfcXVldWUpCisJCQkJaWxfY21kX3F1ZXVlX2ZyZWUoaWwpOworCQkJZWxzZQorCQkJCWlsX3R4X3F1ZXVlX2ZyZWUoaWwsIHR4cV9pZCk7CisJfQorCWlsNDk2NV9mcmVlX2RtYV9wdHIoaWwsICZpbC0+a3cpOworCisJaWw0OTY1X2ZyZWVfZG1hX3B0cihpbCwgJmlsLT5zY2RfYmNfdGJscyk7CisKKwkvKiBmcmVlIHR4IHF1ZXVlIHN0cnVjdHVyZSAqLworCWlsX3R4cV9tZW0oaWwpOworfQorCisvKioKKyAqIGlsNDk2NV90eHFfY3R4X2FsbG9jIC0gYWxsb2NhdGUgVFggcXVldWUgY29udGV4dAorICogQWxsb2NhdGUgYWxsIFR4IERNQSBzdHJ1Y3R1cmVzIGFuZCBpbml0aWFsaXplIHRoZW0KKyAqCisgKiBAcGFyYW0gaWwKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitpbnQKK2lsNDk2NV90eHFfY3R4X2FsbG9jKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0OworCWludCB0eHFfaWQsIHNsb3RzX251bTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRnJlZSBhbGwgdHgvY21kIHF1ZXVlcyBhbmQga2VlcC13YXJtIGJ1ZmZlciAqLworCWlsNDk2NV9od190eHFfY3R4X2ZyZWUoaWwpOworCisJcmV0ID0KKwkgICAgaWw0OTY1X2FsbG9jX2RtYV9wdHIoaWwsICZpbC0+c2NkX2JjX3RibHMsCisJCQkJIGlsLT5od19wYXJhbXMuc2NkX2JjX3RibHNfc2l6ZSk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoIlNjaGVkdWxlciBCQyBUYWJsZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfYmNfdGJsczsKKwl9CisJLyogQWxsb2Mga2VlcC13YXJtIGJ1ZmZlciAqLworCXJldCA9IGlsNDk2NV9hbGxvY19kbWFfcHRyKGlsLCAmaWwtPmt3LCBJTF9LV19TSVpFKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiS2VlcCBXYXJtIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9rdzsKKwl9CisKKwkvKiBhbGxvY2F0ZSB0eCBxdWV1ZSBzdHJ1Y3R1cmUgKi8KKwlyZXQgPSBpbF9hbGxvY190eHFfbWVtKGlsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBUdXJuIG9mZiBhbGwgVHggRE1BIGZpZm9zICovCisJaWw0OTY1X3R4cV9zZXRfc2NoZWQoaWwsIDApOworCisJLyogVGVsbCBOSUMgd2hlcmUgdG8gZmluZCB0aGUgImtlZXAgd2FybSIgYnVmZmVyICovCisJaWxfd3IoaWwsIEZINDlfS1dfTUVNX0FERFJfUkVHLCBpbC0+a3cuZG1hID4+IDQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIEFsbG9jIGFuZCBpbml0IGFsbCBUeCBxdWV1ZXMsIGluY2x1ZGluZyB0aGUgY29tbWFuZCBxdWV1ZSAoIzQvIzkpICovCisJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykgeworCQlzbG90c19udW0gPQorCQkgICAgKHR4cV9pZCA9PQorCQkgICAgIGlsLT5jbWRfcXVldWUpID8gVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7CisJCXJldCA9IGlsX3R4X3F1ZXVlX2luaXQoaWwsICZpbC0+dHhxW3R4cV9pZF0sIHNsb3RzX251bSwgdHhxX2lkKTsKKwkJaWYgKHJldCkgeworCQkJSUxfRVJSKCJUeCAlZCBxdWV1ZSBpbml0IGZhaWxlZFxuIiwgdHhxX2lkKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJvcjoKKwlpbDQ5NjVfaHdfdHhxX2N0eF9mcmVlKGlsKTsKKwlpbDQ5NjVfZnJlZV9kbWFfcHRyKGlsLCAmaWwtPmt3KTsKK2Vycm9yX2t3OgorCWlsNDk2NV9mcmVlX2RtYV9wdHIoaWwsICZpbC0+c2NkX2JjX3RibHMpOworZXJyb3JfYmNfdGJsczoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitpbDQ5NjVfdHhxX2N0eF9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHR4cV9pZCwgc2xvdHNfbnVtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIFR1cm4gb2ZmIGFsbCBUeCBETUEgZmlmb3MgKi8KKwlpbDQ5NjVfdHhxX3NldF9zY2hlZChpbCwgMCk7CisKKwkvKiBUZWxsIE5JQyB3aGVyZSB0byBmaW5kIHRoZSAia2VlcCB3YXJtIiBidWZmZXIgKi8KKwlpbF93cihpbCwgRkg0OV9LV19NRU1fQUREUl9SRUcsIGlsLT5rdy5kbWEgPj4gNCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogQWxsb2MgYW5kIGluaXQgYWxsIFR4IHF1ZXVlcywgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlICgjNCkgKi8KKwlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKSB7CisJCXNsb3RzX251bSA9CisJCSAgICB0eHFfaWQgPT0gaWwtPmNtZF9xdWV1ZSA/IFRGRF9DTURfU0xPVFMgOiBURkRfVFhfQ01EX1NMT1RTOworCQlpbF90eF9xdWV1ZV9yZXNldChpbCwgJmlsLT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLCB0eHFfaWQpOworCX0KK30KKworLyoqCisgKiBpbDQ5NjVfdHhxX2N0eF9zdG9wIC0gU3RvcCBhbGwgVHggRE1BIGNoYW5uZWxzCisgKi8KK3ZvaWQKK2lsNDk2NV90eHFfY3R4X3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCBjaCwgdHhxX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBUdXJuIG9mZiBhbGwgVHggRE1BIGZpZm9zICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpbDQ5NjVfdHhxX3NldF9zY2hlZChpbCwgMCk7CisKKwkvKiBTdG9wIGVhY2ggVHggRE1BIGNoYW5uZWwsIGFuZCB3YWl0IGZvciBpdCB0byBiZSBpZGxlICovCisJZm9yIChjaCA9IDA7IGNoIDwgaWwtPmh3X3BhcmFtcy5kbWFfY2hubF9udW07IGNoKyspIHsKKwkJaWxfd3IoaWwsIEZINDlfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2gpLCAweDApOworCQlpZiAoaWxfcG9sbF9iaXQKKwkJICAgIChpbCwgRkg0OV9UU1NSX1RYX1NUQVRVU19SRUcsCisJCSAgICAgRkg0OV9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRShjaCksIDEwMDApKQorCQkJSUxfRVJSKCJGYWlsaW5nIG9uIHRpbWVvdXQgd2hpbGUgc3RvcHBpbmciCisJCQkgICAgICAgIiBETUEgY2hhbm5lbCAlZCBbMHglMDh4XSIsIGNoLAorCQkJICAgICAgIGlsX3JkKGlsLCBGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFRykpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFpbC0+dHhxKQorCQlyZXR1cm47CisKKwkvKiBVbm1hcCBETUEgZnJvbSBob3N0IHN5c3RlbSBhbmQgZnJlZSBza2IncyAqLworCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspCisJCWlmICh0eHFfaWQgPT0gaWwtPmNtZF9xdWV1ZSkKKwkJCWlsX2NtZF9xdWV1ZV91bm1hcChpbCk7CisJCWVsc2UKKwkJCWlsX3R4X3F1ZXVlX3VubWFwKGlsLCB0eHFfaWQpOworfQorCisvKgorICogRmluZCBmaXJzdCBhdmFpbGFibGUgKGxvd2VzdCB1bnVzZWQpIFR4IFF1ZXVlLCBtYXJrIGl0ICJhY3RpdmUiLgorICogQ2FsbGVkIG9ubHkgd2hlbiBmaW5kaW5nIHF1ZXVlIGZvciBhZ2dyZWdhdGlvbi4KKyAqIFNob3VsZCBuZXZlciByZXR1cm4gYW55dGhpbmcgPCA3LCBiZWNhdXNlIHRoZXkgc2hvdWxkIGFscmVhZHkKKyAqIGJlIGluIHVzZSBhcyBFRENBIEFDICgwLTMpLCBDb21tYW5kICg0KSwgcmVzZXJ2ZWQgKDUsIDYpCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV90eHFfY3R4X2FjdGl2YXRlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCB0eHFfaWQ7CisKKwlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQodHhxX2lkLCAmaWwtPnR4cV9jdHhfYWN0aXZlX21zaykpCisJCQlyZXR1cm4gdHhxX2lkOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBpbDQ5NjVfdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIgLSBTdG9wIHF1ZXVlLCBidXQga2VlcCBjb25maWd1cmF0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgdHhxX2lkKQoreworCS8qIFNpbXBseSBzdG9wIHRoZSBxdWV1ZSwgYnV0IGRvbid0IGNoYW5nZSBhbnkgY29uZmlndXJhdGlvbjsKKwkgKiB0aGUgU0NEX0FDVF9FTiBiaXQgaXMgdGhlIHdyaXRlLWVuYWJsZSBtYXNrIGZvciB0aGUgQUNUSVZFIGJpdC4gKi8KKwlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9RVUVVRV9TVEFUVVNfQklUUyh0eHFfaWQpLAorCQkgICAoMCA8PCBJTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfQUNUSVZFKSB8CisJCSAgICgxIDw8IElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19TQ0RfQUNUX0VOKSk7Cit9CisKKy8qKgorICogaWw0OTY1X3R4X3F1ZXVlX3NldF9xMnJhdGlkIC0gTWFwIHVuaXF1ZSByZWNlaXZlci90aWQgY29tYmluYXRpb24gdG8gYSBxdWV1ZQorICovCitzdGF0aWMgaW50CitpbDQ5NjVfdHhfcXVldWVfc2V0X3EycmF0aWQoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgcmFfdGlkLCB1MTYgdHhxX2lkKQoreworCXUzMiB0YmxfZHdfYWRkcjsKKwl1MzIgdGJsX2R3OworCXUxNiBzY2RfcTJyYXRpZDsKKworCXNjZF9xMnJhdGlkID0gcmFfdGlkICYgSUxfU0NEX1FVRVVFX1JBX1RJRF9NQVBfUkFUSURfTVNLOworCisJdGJsX2R3X2FkZHIgPQorCSAgICBpbC0+c2NkX2Jhc2VfYWRkciArIElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUX1FVRVVFKHR4cV9pZCk7CisKKwl0YmxfZHcgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCB0YmxfZHdfYWRkcik7CisKKwlpZiAodHhxX2lkICYgMHgxKQorCQl0YmxfZHcgPSAoc2NkX3EycmF0aWQgPDwgMTYpIHwgKHRibF9kdyAmIDB4MDAwMEZGRkYpOworCWVsc2UKKwkJdGJsX2R3ID0gc2NkX3EycmF0aWQgfCAodGJsX2R3ICYgMHhGRkZGMDAwMCk7CisKKwlpbF93cml0ZV90YXJnX21lbShpbCwgdGJsX2R3X2FkZHIsIHRibF9kdyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfdHhfcXVldWVfYWdnX2VuYWJsZSAtIFNldCB1cCAmIGVuYWJsZSBhZ2dyZWdhdGlvbiBmb3Igc2VsZWN0ZWQgcXVldWUKKyAqCisgKiBOT1RFOiAgdHhxX2lkIG11c3QgYmUgZ3JlYXRlciB0aGFuIElMNDlfRklSU1RfQU1QRFVfUVVFVUUsCisgKiAgICAgICAgaS5lLiBpdCBtdXN0IGJlIG9uZSBvZiB0aGUgaGlnaGVyIHF1ZXVlcyB1c2VkIGZvciBhZ2dyZWdhdGlvbgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfdHhxX2FnZ19lbmFibGUoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgdHhfZmlmbywgaW50IHN0YV9pZCwKKwkJICAgICAgaW50IHRpZCwgdTE2IHNzbl9pZHgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgcmFfdGlkOworCWludCByZXQ7CisKKwlpZiAoKElMNDlfRklSU1RfQU1QRFVfUVVFVUUgPiB0eHFfaWQpIHx8CisJICAgIChJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsKKwkgICAgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIDw9IHR4cV9pZCkpIHsKKwkJSUxfV0FSTigicXVldWUgbnVtYmVyIG91dCBvZiByYW5nZTogJWQsIG11c3QgYmUgJWQgdG8gJWRcbiIsCisJCQl0eHFfaWQsIElMNDlfRklSU1RfQU1QRFVfUVVFVUUsCisJCQlJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsKKwkJCWlsLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIC0gMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJhX3RpZCA9IEJVSUxEX1JBeFRJRChzdGFfaWQsIHRpZCk7CisKKwkvKiBNb2RpZnkgZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSB0byBUeCB0aGlzIFRJRCAqLworCXJldCA9IGlsNDk2NV9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQoaWwsIHN0YV9pZCwgdGlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBTdG9wIHRoaXMgVHggcXVldWUgYmVmb3JlIGNvbmZpZ3VyaW5nIGl0ICovCisJaWw0OTY1X3R4X3F1ZXVlX3N0b3Bfc2NoZWR1bGVyKGlsLCB0eHFfaWQpOworCisJLyogTWFwIHJlY2VpdmVyLWFkZHJlc3MgLyB0cmFmZmljLUlEIHRvIHRoaXMgcXVldWUgKi8KKwlpbDQ5NjVfdHhfcXVldWVfc2V0X3EycmF0aWQoaWwsIHJhX3RpZCwgdHhxX2lkKTsKKworCS8qIFNldCB0aGlzIHF1ZXVlIGFzIGEgY2hhaW4tYnVpbGRpbmcgcXVldWUgKi8KKwlpbF9zZXRfYml0c19wcnBoKGlsLCBJTDQ5X1NDRF9RVUVVRUNIQUlOX1NFTCwgKDEgPDwgdHhxX2lkKSk7CisKKwkvKiBQbGFjZSBmaXJzdCBURkQgYXQgaWR4IGNvcnJlc3BvbmRpbmcgdG8gc3RhcnQgc2VxdWVuY2UgbnVtYmVyLgorCSAqIEFzc3VtZXMgdGhhdCBzc25faWR4IGlzIHZhbGlkICghPSAweEZGRikgKi8KKwlpbC0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc25faWR4ICYgMHhmZik7CisJaWwtPnR4cVt0eHFfaWRdLnEud3JpdGVfcHRyID0gKHNzbl9pZHggJiAweGZmKTsKKwlpbDQ5NjVfc2V0X3dyX3B0cnMoaWwsIHR4cV9pZCwgc3NuX2lkeCk7CisKKwkvKiBTZXQgdXAgVHggd2luIHNpemUgYW5kIGZyYW1lIGxpbWl0IGZvciB0aGlzIHF1ZXVlICovCisJaWxfd3JpdGVfdGFyZ19tZW0oaWwsCisJCQkgIGlsLT5zY2RfYmFzZV9hZGRyICsKKwkJCSAgSUw0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQodHhxX2lkKSwKKwkJCSAgKFNDRF9XSU5fU0laRSA8PCBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9QT1MpCisJCQkgICYgSUw0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfTVNLKTsKKworCWlsX3dyaXRlX3RhcmdfbWVtKGlsLAorCQkJICBpbC0+c2NkX2Jhc2VfYWRkciArCisJCQkgIElMNDlfU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHR4cV9pZCkgKyBzaXplb2YodTMyKSwKKwkJCSAgKFNDRF9GUkFNRV9MSU1JVCA8PAorCQkJICAgSUw0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfUE9TKSAmCisJCQkgIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX01TSyk7CisKKwlpbF9zZXRfYml0c19wcnBoKGlsLCBJTDQ5X1NDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7CisKKwkvKiBTZXQgdXAgU3RhdHVzIGFyZWEgaW4gU1JBTSwgbWFwIHRvIFR4IERNQS9GSUZPLCBhY3RpdmF0ZSB0aGUgcXVldWUgKi8KKwlpbDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyhpbCwgJmlsLT50eHFbdHhxX2lkXSwgdHhfZmlmbywgMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X3R4X2FnZ19zdGFydChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKiBzc24pCit7CisJaW50IHN0YV9pZDsKKwlpbnQgdHhfZmlmbzsKKwlpbnQgdHhxX2lkOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfdGlkX2RhdGEgKnRpZF9kYXRhOworCisJdHhfZmlmbyA9IGlsNDk2NV9nZXRfZmlmb19mcm9tX3RpZChpbF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLCB0aWQpOworCWlmICh1bmxpa2VseSh0eF9maWZvIDwgMCkpCisJCXJldHVybiB0eF9maWZvOworCisJRF9IVCgiJXMgb24gcmEgPSAlcE0gdGlkID0gJWRcbiIsIF9fZnVuY19fLCBzdGEtPmFkZHIsIHRpZCk7CisKKwlzdGFfaWQgPSBpbF9zdGFfaWQoc3RhKTsKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlJTF9FUlIoIlN0YXJ0IEFHRyBvbiBpbnZhbGlkIHN0YXRpb25cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAodW5saWtlbHkodGlkID49IE1BWF9USURfQ09VTlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cuc3RhdGUgIT0gSUxfQUdHX09GRikgeworCQlJTF9FUlIoIlN0YXJ0IEFHRyB3aGVuIHN0YXRlIGlzIG5vdCBJTF9BR0dfT0ZGICFcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXR4cV9pZCA9IGlsNDk2NV90eHFfY3R4X2FjdGl2YXRlX2ZyZWUoaWwpOworCWlmICh0eHFfaWQgPT0gLTEpIHsKKwkJSUxfRVJSKCJObyBmcmVlIGFnZ3JlZ2F0aW9uIHF1ZXVlIGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCXRpZF9kYXRhID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdOworCSpzc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOworCXRpZF9kYXRhLT5hZ2cudHhxX2lkID0gdHhxX2lkOworCWlsX3NldF9zd3FfaWQoJmlsLT50eHFbdHhxX2lkXSwgaWw0OTY1X2dldF9hY19mcm9tX3RpZCh0aWQpLCB0eHFfaWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0ID0gaWw0OTY1X3R4cV9hZ2dfZW5hYmxlKGlsLCB0eHFfaWQsIHR4X2ZpZm8sIHN0YV9pZCwgdGlkLCAqc3NuKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCXRpZF9kYXRhID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdOworCWlmICh0aWRfZGF0YS0+dGZkc19pbl9xdWV1ZSA9PSAwKSB7CisJCURfSFQoIkhXIHF1ZXVlIGlzIGVtcHR5XG4iKTsKKwkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElMX0FHR19PTjsKKwkJaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUodmlmLCBzdGEtPmFkZHIsIHRpZCk7CisJfSBlbHNlIHsKKwkJRF9IVCgiSFcgcXVldWUgaXMgTk9UIGVtcHR5OiAlZCBwYWNrZXRzIGluIEhXIHF1ZXVlXG4iLAorCQkgICAgIHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlKTsKKwkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHR4cV9pZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFCisgKiBpbC0+bG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlcgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfdHhxX2FnZ19kaXNhYmxlKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IHR4cV9pZCwgdTE2IHNzbl9pZHgsIHU4IHR4X2ZpZm8pCit7CisJaWYgKChJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFID4gdHhxX2lkKSB8fAorCSAgICAoSUw0OV9GSVJTVF9BTVBEVV9RVUVVRSArCisJICAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlcyA8PSB0eHFfaWQpKSB7CisJCUlMX1dBUk4oInF1ZXVlIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVkLCBtdXN0IGJlICVkIHRvICVkXG4iLAorCQkJdHhxX2lkLCBJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFLAorCQkJSUw0OV9GSVJTVF9BTVBEVV9RVUVVRSArCisJCQlpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlcyAtIDEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbDQ5NjVfdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIoaWwsIHR4cV9pZCk7CisKKwlpbF9jbGVhcl9iaXRzX3BycGgoaWwsIElMNDlfU0NEX1FVRVVFQ0hBSU5fU0VMLCAoMSA8PCB0eHFfaWQpKTsKKworCWlsLT50eHFbdHhxX2lkXS5xLnJlYWRfcHRyID0gKHNzbl9pZHggJiAweGZmKTsKKwlpbC0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOworCS8qIHN1cHBvc2VzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCisJaWw0OTY1X3NldF93cl9wdHJzKGlsLCB0eHFfaWQsIHNzbl9pZHgpOworCisJaWxfY2xlYXJfYml0c19wcnBoKGlsLCBJTDQ5X1NDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7CisJaWxfdHhxX2N0eF9kZWFjdGl2YXRlKGlsLCB0eHFfaWQpOworCWlsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKGlsLCAmaWwtPnR4cVt0eHFfaWRdLCB0eF9maWZvLCAwKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2lsNDk2NV90eF9hZ2dfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpCit7CisJaW50IHR4X2ZpZm9faWQsIHR4cV9pZCwgc3RhX2lkLCBzc247CisJc3RydWN0IGlsX3RpZF9kYXRhICp0aWRfZGF0YTsKKwlpbnQgd3JpdGVfcHRyLCByZWFkX3B0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHhfZmlmb19pZCA9IGlsNDk2NV9nZXRfZmlmb19mcm9tX3RpZChpbF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLCB0aWQpOworCWlmICh1bmxpa2VseSh0eF9maWZvX2lkIDwgMCkpCisJCXJldHVybiB0eF9maWZvX2lkOworCisJc3RhX2lkID0gaWxfc3RhX2lkKHN0YSk7CisKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlJTF9FUlIoIkludmFsaWQgc3RhdGlvbiBmb3IgQUdHIHRpZCAlZFxuIiwgdGlkKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwl0aWRfZGF0YSA9ICZpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKKwlzc24gPSAodGlkX2RhdGEtPnNlcV9udW1iZXIgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQ7CisJdHhxX2lkID0gdGlkX2RhdGEtPmFnZy50eHFfaWQ7CisKKwlzd2l0Y2ggKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgeworCWNhc2UgSUxfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE6CisJCS8qCisJCSAqIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgcGVlciBzdG9wcyBhZ2dyZWdhdGlvbgorCQkgKiBhZ2FpbiBiZWZvcmUgd2UndmUgaGFkIGEgY2hhbmNlIHRvIGRyYWluIHRoZQorCQkgKiBxdWV1ZSB3ZSBzZWxlY3RlZCBwcmV2aW91c2x5LCBpLmUuIGJlZm9yZSB0aGUKKwkJICogc2Vzc2lvbiB3YXMgcmVhbGx5IHN0YXJ0ZWQgY29tcGxldGVseS4KKwkJICovCisJCURfSFQoIkFHRyBzdG9wIGJlZm9yZSBzZXR1cCBkb25lXG4iKTsKKwkJZ290byB0dXJuX29mZjsKKwljYXNlIElMX0FHR19PTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSUxfV0FSTigiU3RvcHBpbmcgQUdHIHdoaWxlIHN0YXRlIG5vdCBPTiBvciBzdGFydGluZ1xuIik7CisJfQorCisJd3JpdGVfcHRyID0gaWwtPnR4cVt0eHFfaWRdLnEud3JpdGVfcHRyOworCXJlYWRfcHRyID0gaWwtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHI7CisKKwkvKiBUaGUgcXVldWUgaXMgbm90IGVtcHR5ICovCisJaWYgKHdyaXRlX3B0ciAhPSByZWFkX3B0cikgeworCQlEX0hUKCJTdG9wcGluZyBhIG5vbiBlbXB0eSBBR0cgSFcgUVVFVUVcbiIpOworCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cuc3RhdGUgPQorCQkgICAgSUxfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEX0hUKCJIVyBxdWV1ZSBpcyBlbXB0eVxuIik7Cit0dXJuX29mZjoKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cuc3RhdGUgPSBJTF9BR0dfT0ZGOworCisJLyogZG8gbm90IHJlc3RvcmUvc2F2ZSBpcnFzICovCisJc3Bpbl91bmxvY2soJmlsLT5zdGFfbG9jayk7CisJc3Bpbl9sb2NrKCZpbC0+bG9jayk7CisKKwkvKgorCSAqIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGNhbGwgY2FuIGZhaWwgaXMgcXVldWUgbnVtYmVyIG91dCBvZiByYW5nZSwKKwkgKiB3aGljaCBjYW4gaGFwcGVuIGlmIHVDb2RlIGlzIHJlbG9hZGVkIGFuZCBhbGwgdGhlIHN0YXRpb24KKwkgKiBpbmZvcm1hdGlvbiBhcmUgbG9zdC4gaWYgaXQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UsIHRoZXJlIGlzIG5vIG5lZWQKKwkgKiB0byBkZWFjdGl2YXRlIHRoZSB1Q29kZSBxdWV1ZSwganVzdCByZXR1cm4gInN1Y2Nlc3MiIHRvIGFsbG93CisJICogIG1hYzgwMjExIHRvIGNsZWFuIHVwIGl0IG93biBkYXRhLgorCSAqLworCWlsNDk2NV90eHFfYWdnX2Rpc2FibGUoaWwsIHR4cV9pZCwgc3NuLCB0eF9maWZvX2lkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2lsNDk2NV90eHFfY2hlY2tfZW1wdHkoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgc3RhX2lkLCB1OCB0aWQsIGludCB0eHFfaWQpCit7CisJc3RydWN0IGlsX3F1ZXVlICpxID0gJmlsLT50eHFbdHhxX2lkXS5xOworCXU4ICphZGRyID0gaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyOworCXN0cnVjdCBpbF90aWRfZGF0YSAqdGlkX2RhdGEgPSAmaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4OworCisJY3R4ID0gJmlsLT5jdHg7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+c3RhX2xvY2spOworCisJc3dpdGNoIChpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cuc3RhdGUpIHsKKwljYXNlIElMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOgorCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlICovCisJCS8qIGFnZ3JlZ2F0ZWQgSFcgcXVldWUgKi8KKwkJaWYgKHR4cV9pZCA9PSB0aWRfZGF0YS0+YWdnLnR4cV9pZCAmJgorCQkgICAgcS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyKSB7CisJCQl1MTYgc3NuID0gU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKTsKKwkJCWludCB0eF9maWZvID0gaWw0OTY1X2dldF9maWZvX2Zyb21fdGlkKGN0eCwgdGlkKTsKKwkJCURfSFQoIkhXIHF1ZXVlIGVtcHR5OiBjb250aW51ZSBERUxCQSBmbG93XG4iKTsKKwkJCWlsNDk2NV90eHFfYWdnX2Rpc2FibGUoaWwsIHR4cV9pZCwgc3NuLCB0eF9maWZvKTsKKwkJCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJTF9BR0dfT0ZGOworCQkJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZShjdHgtPnZpZiwgYWRkciwgdGlkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgorCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlIHF1ZXVlICovCisJCWlmICh0aWRfZGF0YS0+dGZkc19pbl9xdWV1ZSA9PSAwKSB7CisJCQlEX0hUKCJIVyBxdWV1ZSBlbXB0eTogY29udGludWUgQUREQkEgZmxvd1xuIik7CisJCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSUxfQUdHX09OOworCQkJaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUoY3R4LT52aWYsIGFkZHIsIHRpZCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfbm9uX2FnZ190eF9zdGF0dXMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgY29uc3QgdTggKmFkZHIxKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXY7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhKGN0eC0+dmlmLCBhZGRyMSk7CisJaWYgKHN0YSkgeworCQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwkJLyogYXZvaWQgYXRvbWljIG9wcyBpZiB0aGlzIGlzbid0IGEgY2xpZW50ICovCisJCWlmIChzdGFfcHJpdi0+Y2xpZW50ICYmCisJCSAgICBhdG9taWNfZGVjX3JldHVybigmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzKSA9PSAwKQorCQkJaWVlZTgwMjExX3N0YV9ibG9ja19hd2FrZShpbC0+aHcsIHN0YSwgZmFsc2UpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV90eF9zdGF0dXMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfaW5mbyAqdHhfaW5mbywgYm9vbCBpc19hZ2cpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXR4X2luZm8tPnNrYi0+ZGF0YTsKKworCWlmICghaXNfYWdnKQorCQlpbDQ5NjVfbm9uX2FnZ190eF9zdGF0dXMoaWwsIHR4X2luZm8tPmN0eCwgaGRyLT5hZGRyMSk7CisKKwlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUoaWwtPmh3LCB0eF9pbmZvLT5za2IpOworfQorCitpbnQKK2lsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSA9ICZpbC0+dHhxW3R4cV9pZF07CisJc3RydWN0IGlsX3F1ZXVlICpxID0gJnR4cS0+cTsKKwlzdHJ1Y3QgaWxfdHhfaW5mbyAqdHhfaW5mbzsKKwlpbnQgbmZyZWVkID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCisJaWYgKGlkeCA+PSBxLT5uX2JkIHx8IGlsX3F1ZXVlX3VzZWQocSwgaWR4KSA9PSAwKSB7CisJCUlMX0VSUigiUmVhZCBpZHggZm9yIERNQSBxdWV1ZSB0eHEgaWQgKCVkKSwgaWR4ICVkLCAiCisJCSAgICAgICAiaXMgb3V0IG9mIHJhbmdlIFswLSVkXSAlZCAlZC5cbiIsIHR4cV9pZCwgaWR4LCBxLT5uX2JkLAorCQkgICAgICAgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaWR4ID0gaWxfcXVldWVfaW5jX3dyYXAoaWR4LCBxLT5uX2JkKTsgcS0+cmVhZF9wdHIgIT0gaWR4OworCSAgICAgcS0+cmVhZF9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKKworCQl0eF9pbmZvID0gJnR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl07CisKKwkJaWYgKFdBUk5fT05fT05DRSh0eF9pbmZvLT5za2IgPT0gTlVMTCkpCisJCQljb250aW51ZTsKKworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKil0eF9pbmZvLT5za2ItPmRhdGE7CisJCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkKKwkJCW5mcmVlZCsrOworCisJCWlsNDk2NV90eF9zdGF0dXMoaWwsIHR4X2luZm8sCisJCQkJIHR4cV9pZCA+PSBJTDQ5NjVfRklSU1RfQU1QRFVfUVVFVUUpOworCQl0eF9pbmZvLT5za2IgPSBOVUxMOworCisJCWlsLT5jZmctPm9wcy0+bGliLT50eHFfZnJlZV90ZmQoaWwsIHR4cSk7CisJfQorCXJldHVybiBuZnJlZWQ7Cit9CisKKy8qKgorICogaWw0OTY1X3R4X3N0YXR1c19yZXBseV9jb21wcmVzc2VkX2JhIC0gVXBkYXRlIHR4IHN0YXR1cyBmcm9tIGJsb2NrLWFjaworICoKKyAqIEdvIHRocm91Z2ggYmxvY2stYWNrJ3MgYml0bWFwIG9mIEFDSydkIGZyYW1lcywgdXBkYXRlIGRyaXZlcidzIHJlY29yZCBvZgorICogQUNLIHZzLiBub3QuICBUaGlzIGdldHMgc2VudCB0byBtYWM4MDIxMSwgdGhlbiB0byByYXRlIHNjYWxpbmcgYWxnby4KKyAqLworc3RhdGljIGludAoraWw0OTY1X3R4X3N0YXR1c19yZXBseV9jb21wcmVzc2VkX2JhKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2h0X2FnZyAqYWdnLAorCQkJCSAgICAgc3RydWN0IGlsX2NvbXByZXNzZWRfYmFfcmVzcCAqYmFfcmVzcCkKK3sKKwlpbnQgaSwgc2gsIGFjazsKKwl1MTYgc2VxX2N0bCA9IGxlMTZfdG9fY3B1KGJhX3Jlc3AtPnNlcV9jdGwpOworCXUxNiBzY2RfZmxvdyA9IGxlMTZfdG9fY3B1KGJhX3Jlc3AtPnNjZF9mbG93KTsKKwlpbnQgc3VjY2Vzc2VzID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJdTY0IGJpdG1hcCwgc2VudF9iaXRtYXA7CisKKwlpZiAodW5saWtlbHkoIWFnZy0+d2FpdF9mb3JfYmEpKSB7CisJCWlmICh1bmxpa2VseShiYV9yZXNwLT5iaXRtYXApKQorCQkJSUxfRVJSKCJSZWNlaXZlZCBCQSB3aGVuIG5vdCBleHBlY3RlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE1hcmsgdGhhdCB0aGUgZXhwZWN0ZWQgYmxvY2stYWNrIHJlc3BvbnNlIGFycml2ZWQgKi8KKwlhZ2ctPndhaXRfZm9yX2JhID0gMDsKKwlEX1RYX1JFUExZKCJCQSAlZCAlZFxuIiwgYWdnLT5zdGFydF9pZHgsIGJhX3Jlc3AtPnNlcV9jdGwpOworCisJLyogQ2FsY3VsYXRlIHNoaWZ0IHRvIGFsaWduIGJsb2NrLWFjayBiaXRzIHdpdGggb3VyIFR4IHdpbiBiaXRzICovCisJc2ggPSBhZ2ctPnN0YXJ0X2lkeCAtIFNFUV9UT19JRFgoc2VxX2N0bCA+PiA0KTsKKwlpZiAoc2ggPCAwKQkJLyogdGJ3IHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGluZGljZXMgKi8KKwkJc2ggKz0gMHgxMDA7CisKKwlpZiAoYWdnLT5mcmFtZV9jb3VudCA+ICg2NCAtIHNoKSkgeworCQlEX1RYX1JFUExZKCJtb3JlIGZyYW1lcyB0aGFuIGJpdG1hcCBzaXplIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBkb24ndCB1c2UgNjQtYml0IHZhbHVlcyBmb3Igbm93ICovCisJYml0bWFwID0gbGU2NF90b19jcHUoYmFfcmVzcC0+Yml0bWFwKSA+PiBzaDsKKworCS8qIGNoZWNrIGZvciBzdWNjZXNzIG9yIGZhaWx1cmUgYWNjb3JkaW5nIHRvIHRoZQorCSAqIHRyYW5zbWl0dGVkIGJpdG1hcCBhbmQgYmxvY2stYWNrIGJpdG1hcCAqLworCXNlbnRfYml0bWFwID0gYml0bWFwICYgYWdnLT5iaXRtYXA7CisKKwkvKiBGb3IgZWFjaCBmcmFtZSBhdHRlbXB0ZWQgaW4gYWdncmVnYXRpb24sCisJICogdXBkYXRlIGRyaXZlcidzIHJlY29yZCBvZiB0eCBmcmFtZSdzIHN0YXR1cy4gKi8KKwlpID0gMDsKKwl3aGlsZSAoc2VudF9iaXRtYXApIHsKKwkJYWNrID0gc2VudF9iaXRtYXAgJiAxVUxMOworCQlzdWNjZXNzZXMgKz0gYWNrOworCQlEX1RYX1JFUExZKCIlcyBPTiBpPSVkIGlkeD0lZCByYXc9JWRcbiIsIGFjayA/ICJBQ0siIDogIk5BQ0siLAorCQkJICAgaSwgKGFnZy0+c3RhcnRfaWR4ICsgaSkgJiAweGZmLCBhZ2ctPnN0YXJ0X2lkeCArIGkpOworCQlzZW50X2JpdG1hcCA+Pj0gMTsKKwkJKytpOworCX0KKworCURfVFhfUkVQTFkoIkJpdG1hcCAlbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWJpdG1hcCk7CisKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihpbC0+dHhxW3NjZF9mbG93XS50eGJbYWdnLT5zdGFydF9pZHhdLnNrYik7CisJbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKKwlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CisJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQU1QRFU7CisJaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW4gPSBzdWNjZXNzZXM7CisJaW5mby0+c3RhdHVzLmFtcGR1X2xlbiA9IGFnZy0+ZnJhbWVfY291bnQ7CisJaWw0OTY1X2h3cmF0ZV90b190eF9jb250cm9sKGlsLCBhZ2ctPnJhdGVfbl9mbGFncywgaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0cmFuc2xhdGUgdWNvZGUgcmVzcG9uc2UgdG8gbWFjODAyMTEgdHggc3RhdHVzIGNvbnRyb2wgdmFsdWVzCisgKi8KK3ZvaWQKK2lsNDk2NV9od3JhdGVfdG9fdHhfY29udHJvbChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByYXRlX25fZmxhZ3MsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvKQoreworCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqciA9ICZpbmZvLT5jb250cm9sLnJhdGVzWzBdOworCisJaW5mby0+YW50ZW5uYV9zZWxfdHggPQorCSAgICAoKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9BQkNfTVNLKSA+PiBSQVRFX01DU19BTlRfUE9TKTsKKwlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFRfTVNLKQorCQlyLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfTUNTOworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19HRl9NU0spCisJCXItPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19HUkVFTl9GSUVMRDsKKwlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFQ0MF9NU0spCisJCXItPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEg7CisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0RVUF9NU0spCisJCXItPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19EVVBfREFUQTsKKwlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfU0dJX01TSykKKwkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJOworCXItPmlkeCA9IGlsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHJhdGVfbl9mbGFncywgaW5mby0+YmFuZCk7Cit9CisKKy8qKgorICogaWw0OTY1X2hkbF9jb21wcmVzc2VkX2JhIC0gSGFuZGxlciBmb3IgTl9DT01QUkVTU0VEX0JBCisgKgorICogSGFuZGxlcyBibG9jay1hY2tub3dsZWRnZSBub3RpZmljYXRpb24gZnJvbSBkZXZpY2UsIHdoaWNoIHJlcG9ydHMgc3VjY2VzcworICogb2YgZnJhbWVzIHNlbnQgdmlhIGFnZ3JlZ2F0aW9uLgorICovCit2b2lkCitpbDQ5NjVfaGRsX2NvbXByZXNzZWRfYmEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfY29tcHJlc3NlZF9iYV9yZXNwICpiYV9yZXNwID0gJnBrdC0+dS5jb21wcmVzc2VkX2JhOworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gTlVMTDsKKwlzdHJ1Y3QgaWxfaHRfYWdnICphZ2c7CisJaW50IGlkeDsKKwlpbnQgc3RhX2lkOworCWludCB0aWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qICJmbG93IiBjb3JyZXNwb25kcyB0byBUeCBxdWV1ZSAqLworCXUxNiBzY2RfZmxvdyA9IGxlMTZfdG9fY3B1KGJhX3Jlc3AtPnNjZF9mbG93KTsKKworCS8qICJzc24iIGlzIHN0YXJ0IG9mIGJsb2NrLWFjayBUeCB3aW4sIGNvcnJlc3BvbmRzIHRvIGlkeAorCSAqIChpbiBUeCBxdWV1ZSdzIGNpcmN1bGFyIGJ1ZmZlcikgb2YgZmlyc3QgVEZEL2ZyYW1lIGluIHdpbiAqLworCXUxNiBiYV9yZXNwX3NjZF9zc24gPSBsZTE2X3RvX2NwdShiYV9yZXNwLT5zY2Rfc3NuKTsKKworCWlmIChzY2RfZmxvdyA+PSBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtKSB7CisJCUlMX0VSUigiQlVHX09OIHNjZF9mbG93IGlzIGJpZ2dlciB0aGFuIG51bWJlciBvZiBxdWV1ZXNcbiIpOworCQlyZXR1cm47CisJfQorCisJdHhxID0gJmlsLT50eHFbc2NkX2Zsb3ddOworCXN0YV9pZCA9IGJhX3Jlc3AtPnN0YV9pZDsKKwl0aWQgPSBiYV9yZXNwLT50aWQ7CisJYWdnID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZzsKKwlpZiAodW5saWtlbHkoYWdnLT50eHFfaWQgIT0gc2NkX2Zsb3cpKSB7CisJCS8qCisJCSAqIEZJWE1FOiB0aGlzIGlzIGEgdUNvZGUgYnVnIHdoaWNoIG5lZWQgdG8gYmUgYWRkcmVzc2VkLAorCQkgKiBsb2cgdGhlIGluZm9ybWF0aW9uIGFuZCByZXR1cm4gZm9yIG5vdyEKKwkJICogc2luY2UgaXQgaXMgcG9zc2libGUgaGFwcGVuIHZlcnkgb2Z0ZW4gYW5kIGluIG9yZGVyCisJCSAqIG5vdCB0byBmaWxsIHRoZSBzeXNsb2csIGRvbid0IGVuYWJsZSB0aGUgbG9nZ2luZyBieSBkZWZhdWx0CisJCSAqLworCQlEX1RYX1JFUExZKCJCQSBzY2RfZmxvdyAlZCBkb2VzIG5vdCBtYXRjaCB0eHFfaWQgJWRcbiIsCisJCQkgICBzY2RfZmxvdywgYWdnLT50eHFfaWQpOworCQlyZXR1cm47CisJfQorCisJLyogRmluZCBpZHgganVzdCBiZWZvcmUgYmxvY2stYWNrIHdpbiAqLworCWlkeCA9IGlsX3F1ZXVlX2RlY193cmFwKGJhX3Jlc3Bfc2NkX3NzbiAmIDB4ZmYsIHR4cS0+cS5uX2JkKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCURfVFhfUkVQTFkoIk5fQ09NUFJFU1NFRF9CQSBbJWRdIFJlY2VpdmVkIGZyb20gJXBNLCAiICJzdGFfaWQgPSAlZFxuIiwKKwkJICAgYWdnLT53YWl0X2Zvcl9iYSwgKHU4ICopICZiYV9yZXNwLT5zdGFfYWRkcl9sbzMyLAorCQkgICBiYV9yZXNwLT5zdGFfaWQpOworCURfVFhfUkVQTFkoIlRJRCA9ICVkLCBTZXFDdGwgPSAlZCwgYml0bWFwID0gMHglbGx4LCIgInNjZF9mbG93ID0gIgorCQkgICAiJWQsIHNjZF9zc24gPSAlZFxuIiwgYmFfcmVzcC0+dGlkLCBiYV9yZXNwLT5zZXFfY3RsLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGJhX3Jlc3AtPmJpdG1hcCksCisJCSAgIGJhX3Jlc3AtPnNjZF9mbG93LCBiYV9yZXNwLT5zY2Rfc3NuKTsKKwlEX1RYX1JFUExZKCJEQVQgc3RhcnRfaWR4ID0gJWQsIGJpdG1hcCA9IDB4JWxseFxuIiwgYWdnLT5zdGFydF9pZHgsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWdnLT5iaXRtYXApOworCisJLyogVXBkYXRlIGRyaXZlcidzIHJlY29yZCBvZiBBQ0sgdnMuIG5vdCBmb3IgZWFjaCBmcmFtZSBpbiB3aW4gKi8KKwlpbDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEoaWwsIGFnZywgYmFfcmVzcCk7CisKKwkvKiBSZWxlYXNlIGFsbCBURkRzIGJlZm9yZSB0aGUgU1NOLCBpLmUuIGFsbCBURkRzIGluIGZyb250IG9mCisJICogYmxvY2stYWNrIHdpbiAod2UgYXNzdW1lIHRoYXQgdGhleSd2ZSBiZWVuIHN1Y2Nlc3NmdWxseQorCSAqIHRyYW5zbWl0dGVkIC4uLiBpZiBub3QsIGl0J3MgdG9vIGxhdGUgYW55d2F5KS4gKi8KKwlpZiAodHhxLT5xLnJlYWRfcHRyICE9IChiYV9yZXNwX3NjZF9zc24gJiAweGZmKSkgeworCQkvKiBjYWxjdWxhdGUgbWFjODAyMTEgYW1wZHUgc3cgcXVldWUgdG8gd2FrZSAqLworCQlpbnQgZnJlZWQgPSBpbDQ5NjVfdHhfcXVldWVfcmVjbGFpbShpbCwgc2NkX2Zsb3csIGlkeCk7CisJCWlsNDk2NV9mcmVlX3RmZHNfaW5fcXVldWUoaWwsIHN0YV9pZCwgdGlkLCBmcmVlZCk7CisKKwkJaWYgKGlsX3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrICYmCisJCSAgICBpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCAmJgorCQkgICAgYWdnLT5zdGF0ZSAhPSBJTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQSkKKwkJCWlsX3dha2VfcXVldWUoaWwsIHR4cSk7CisKKwkJaWw0OTY1X3R4cV9jaGVja19lbXB0eShpbCwgc3RhX2lkLCB0aWQsIHNjZF9mbG93KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworY29uc3QgY2hhciAqCitpbDQ5NjVfZ2V0X3R4X2ZhaWxfcmVhc29uKHUzMiBzdGF0dXMpCit7CisjZGVmaW5lIFRYX1NUQVRVU19GQUlMKHgpIGNhc2UgVFhfU1RBVFVTX0ZBSUxfICMjIHg6IHJldHVybiAjeAorI2RlZmluZSBUWF9TVEFUVVNfUE9TVFBPTkUoeCkgY2FzZSBUWF9TVEFUVVNfUE9TVFBPTkVfICMjIHg6IHJldHVybiAjeAorCisJc3dpdGNoIChzdGF0dXMgJiBUWF9TVEFUVVNfTVNLKSB7CisJY2FzZSBUWF9TVEFUVVNfU1VDQ0VTUzoKKwkJcmV0dXJuICJTVUNDRVNTIjsKKwkJVFhfU1RBVFVTX1BPU1RQT05FKERFTEFZKTsKKwkJVFhfU1RBVFVTX1BPU1RQT05FKEZFV19CWVRFUyk7CisJCVRYX1NUQVRVU19QT1NUUE9ORShRVUlFVF9QRVJJT0QpOworCQlUWF9TVEFUVVNfUE9TVFBPTkUoQ0FMQ19UVEFLKTsKKwkJVFhfU1RBVFVTX0ZBSUwoSU5URVJOQUxfQ1JPU1NFRF9SRVRSWSk7CisJCVRYX1NUQVRVU19GQUlMKFNIT1JUX0xJTUlUKTsKKwkJVFhfU1RBVFVTX0ZBSUwoTE9OR19MSU1JVCk7CisJCVRYX1NUQVRVU19GQUlMKEZJRk9fVU5ERVJSVU4pOworCQlUWF9TVEFUVVNfRkFJTChEUkFJTl9GTE9XKTsKKwkJVFhfU1RBVFVTX0ZBSUwoUkZLSUxMX0ZMVVNIKTsKKwkJVFhfU1RBVFVTX0ZBSUwoTElGRV9FWFBJUkUpOworCQlUWF9TVEFUVVNfRkFJTChERVNUX1BTKTsKKwkJVFhfU1RBVFVTX0ZBSUwoSE9TVF9BQk9SVEVEKTsKKwkJVFhfU1RBVFVTX0ZBSUwoQlRfUkVUUlkpOworCQlUWF9TVEFUVVNfRkFJTChTVEFfSU5WQUxJRCk7CisJCVRYX1NUQVRVU19GQUlMKEZSQUdfRFJPUFBFRCk7CisJCVRYX1NUQVRVU19GQUlMKFRJRF9ESVNBQkxFKTsKKwkJVFhfU1RBVFVTX0ZBSUwoRklGT19GTFVTSEVEKTsKKwkJVFhfU1RBVFVTX0ZBSUwoSU5TVUZGSUNJRU5UX0NGX1BPTEwpOworCQlUWF9TVEFUVVNfRkFJTChQQVNTSVZFX05PX1JYKTsKKwkJVFhfU1RBVFVTX0ZBSUwoTk9fQkVBQ09OX09OX1JBREFSKTsKKwl9CisKKwlyZXR1cm4gIlVOS05PV04iOworCisjdW5kZWYgVFhfU1RBVFVTX0ZBSUwKKyN1bmRlZiBUWF9TVEFUVVNfUE9TVFBPTkUKK30KKyNlbmRpZiAvKiBDT05GSUdfSVdMRUdBQ1lfREVCVUcgKi8KKworc3RhdGljIHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICoKK2lsNDk2NV9zdGFfYWxsb2NfbHEoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBzdGFfaWQpCit7CisJaW50IGksIHI7CisJc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOworCXUzMiByYXRlX2ZsYWdzID0gMDsKKwlfX2xlMzIgcmF0ZV9uX2ZsYWdzOworCisJbGlua19jbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCksIEdGUF9LRVJORUwpOworCWlmICghbGlua19jbWQpIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBMUSBjbWQuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIFNldCB1cCB0aGUgcmF0ZSBzY2FsaW5nIHRvIHN0YXJ0IGF0IHNlbGVjdGVkIHJhdGUsIGZhbGwgYmFjaworCSAqIGFsbCB0aGUgd2F5IGRvd24gdG8gMU0gaW4gSUVFRSBvcmRlciwgYW5kIHRoZW4gc3BpbiBvbiAxTSAqLworCWlmIChpbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlyID0gUkFURV82TV9JRFg7CisJZWxzZQorCQlyID0gUkFURV8xTV9JRFg7CisKKwlpZiAociA+PSBJTF9GSVJTVF9DQ0tfUkFURSAmJiByIDw9IElMX0xBU1RfQ0NLX1JBVEUpCisJCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKKworCXJhdGVfZmxhZ3MgfD0KKwkgICAgaWw0OTY1X2ZpcnN0X2FudGVubmEoaWwtPmh3X3BhcmFtcy4KKwkJCQkgdmFsaWRfdHhfYW50KSA8PCBSQVRFX01DU19BTlRfUE9TOworCXJhdGVfbl9mbGFncyA9IGlsNDk2NV9od19zZXRfcmF0ZV9uX2ZsYWdzKGlsX3JhdGVzW3JdLnBsY3AsIHJhdGVfZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKQorCQlsaW5rX2NtZC0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzID0gcmF0ZV9uX2ZsYWdzOworCisJbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zayA9CisJICAgIGlsNDk2NV9maXJzdF9hbnRlbm5hKGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKKworCWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0KKwkgICAgaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiB+aWw0OTY1X2ZpcnN0X2FudGVubmEoaWwtPmh3X3BhcmFtcy4KKwkJCQkJCQkgICAgICAgdmFsaWRfdHhfYW50KTsKKwlpZiAoIWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKSB7CisJCWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0gQU5UX0FCOworCX0gZWxzZSBpZiAoaWw0OTY1X251bV9vZl9hbnQoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpID09IDIpIHsKKwkJbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQorCQkgICAgaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJfQorCisJbGlua19jbWQtPmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCA9IExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUY7CisJbGlua19jbWQtPmFnZ19wYXJhbXMuYWdnX3RpbWVfbGltaXQgPQorCSAgICBjcHVfdG9fbGUxNihMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfREVGKTsKKworCWxpbmtfY21kLT5zdGFfaWQgPSBzdGFfaWQ7CisKKwlyZXR1cm4gbGlua19jbWQ7Cit9CisKKy8qCisgKiBpbDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24gLSBBZGQgdGhlIHNwZWNpYWwgSUJTUyBCU1NJRCBzdGF0aW9uCisgKgorICogRnVuY3Rpb24gc2xlZXBzLgorICovCitpbnQKK2lsNDk2NV9hZGRfYnNzaWRfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSBjb25zdCB1OCAqYWRkciwgdTggKnN0YV9pZF9yKQoreworCWludCByZXQ7CisJdTggc3RhX2lkOworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpsaW5rX2NtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHN0YV9pZF9yKQorCQkqc3RhX2lkX3IgPSBJTF9JTlZBTElEX1NUQVRJT047CisKKwlyZXQgPSBpbF9hZGRfc3RhdGlvbl9jb21tb24oaWwsIGN0eCwgYWRkciwgMCwgTlVMTCwgJnN0YV9pZCk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE1cbiIsIGFkZHIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChzdGFfaWRfcikKKwkJKnN0YV9pZF9yID0gc3RhX2lkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSUxfU1RBX0xPQ0FMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJLyogU2V0IHVwIGRlZmF1bHQgcmF0ZSBzY2FsaW5nIHRhYmxlIGluIGRldmljZSdzIHN0YXRpb24gdGFibGUgKi8KKwlsaW5rX2NtZCA9IGlsNDk2NV9zdGFfYWxsb2NfbHEoaWwsIHN0YV9pZCk7CisJaWYgKCFsaW5rX2NtZCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0aWFsaXplIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE0uXG4iLAorCQkgICAgICAgYWRkcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGlsX3NlbmRfbHFfY21kKGlsLCBjdHgsIGxpbmtfY21kLCBDTURfU1lOQywgdHJ1ZSk7CisJaWYgKHJldCkKKwkJSUxfRVJSKCJMaW5rIHF1YWxpdHkgY29tbWFuZCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSBib29sIHNlbmRfaWZfZW1wdHkpCit7CisJaW50IGksIG5vdF9lbXB0eSA9IDA7CisJdTggYnVmZltzaXplb2Yoc3RydWN0IGlsX3dlcF9jbWQpICsKKwkJc2l6ZW9mKHN0cnVjdCBpbF93ZXBfa2V5KSAqIFdFUF9LRVlTX01BWF07CisJc3RydWN0IGlsX3dlcF9jbWQgKndlcF9jbWQgPSAoc3RydWN0IGlsX3dlcF9jbWQgKilidWZmOworCXNpemVfdCBjbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWxfd2VwX2NtZCk7CisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gY3R4LT53ZXBfa2V5X2NtZCwKKwkJLmRhdGEgPSB3ZXBfY21kLAorCQkuZmxhZ3MgPSBDTURfU1lOQywKKwl9OworCisJbWlnaHRfc2xlZXAoKTsKKworCW1lbXNldCh3ZXBfY21kLCAwLAorCSAgICAgICBjbWRfc2l6ZSArIChzaXplb2Yoc3RydWN0IGlsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVNfTUFYOyBpKyspIHsKKwkJd2VwX2NtZC0+a2V5W2ldLmtleV9pZHggPSBpOworCQlpZiAoY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZSkgeworCQkJd2VwX2NtZC0+a2V5W2ldLmtleV9vZmZzZXQgPSBpOworCQkJbm90X2VtcHR5ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXdlcF9jbWQtPmtleVtpXS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOworCQl9CisKKwkJd2VwX2NtZC0+a2V5W2ldLmtleV9zaXplID0gY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZTsKKwkJbWVtY3B5KCZ3ZXBfY21kLT5rZXlbaV0ua2V5WzNdLCBjdHgtPndlcF9rZXlzW2ldLmtleSwKKwkJICAgICAgIGN0eC0+d2VwX2tleXNbaV0ua2V5X3NpemUpOworCX0KKworCXdlcF9jbWQtPmdsb2JhbF9rZXlfdHlwZSA9IFdFUF9LRVlfV0VQX1RZUEU7CisJd2VwX2NtZC0+bnVtX2tleXMgPSBXRVBfS0VZU19NQVg7CisKKwljbWRfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGlsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYOworCisJY21kLmxlbiA9IGNtZF9zaXplOworCisJaWYgKG5vdF9lbXB0eSB8fCBzZW5kX2lmX2VtcHR5KQorCQlyZXR1cm4gaWxfc2VuZF9jbWQoaWwsICZjbWQpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJcmV0dXJuIGlsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChpbCwgY3R4LCBmYWxzZSk7Cit9CisKK2ludAoraWw0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mKQoreworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJRF9XRVAoIlJlbW92aW5nIGRlZmF1bHQgV0VQIGtleTogaWR4PSVkXG4iLCBrZXljb25mLT5rZXlpZHgpOworCisJbWVtc2V0KCZjdHgtPndlcF9rZXlzW2tleWNvbmYtPmtleWlkeF0sIDAsIHNpemVvZihjdHgtPndlcF9rZXlzWzBdKSk7CisJaWYgKGlsX2lzX3Jma2lsbChpbCkpIHsKKwkJRF9XRVAoIk5vdCBzZW5kaW5nIENfV0VQS0VZIGNvbW1hbmQgZHVlIHRvIFJGS0lMTC5cbiIpOworCQkvKiBidXQga2V5cyBpbiBkZXZpY2UgYXJlIGNsZWFyIGFueXdheSBzbyByZXR1cm4gc3VjY2VzcyAqLworCQlyZXR1cm4gMDsKKwl9CisJcmV0ID0gaWw0OTY1X3N0YXRpY193ZXBrZXlfY21kKGlsLCBjdHgsIDEpOworCURfV0VQKCJSZW1vdmUgZGVmYXVsdCBXRVAga2V5OiBpZHg9JWQgcmV0PSVkXG4iLCBrZXljb25mLT5rZXlpZHgsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2lsNDk2NV9zZXRfZGVmYXVsdF93ZXBfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZikKK3sKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWlmIChrZXljb25mLT5rZXlsZW4gIT0gV0VQX0tFWV9MRU5fMTI4ICYmCisJICAgIGtleWNvbmYtPmtleWxlbiAhPSBXRVBfS0VZX0xFTl82NCkgeworCQlEX1dFUCgiQmFkIFdFUCBrZXkgbGVuZ3RoICVkXG4iLCBrZXljb25mLT5rZXlsZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlrZXljb25mLT5mbGFncyAmPSB+SUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOworCWtleWNvbmYtPmh3X2tleV9pZHggPSBIV19LRVlfREVGQVVMVDsKKwlpbC0+c3RhdGlvbnNbY3R4LT5hcF9zdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOworCisJY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleV9zaXplID0ga2V5Y29uZi0+a2V5bGVuOworCW1lbWNweSgmY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleSwgJmtleWNvbmYtPmtleSwKKwkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKKworCXJldCA9IGlsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChpbCwgY3R4LCBmYWxzZSk7CisJRF9XRVAoIlNldCBkZWZhdWx0IFdFUCBrZXk6IGxlbj0lZCBpZHg9JWQgcmV0PSVkXG4iLCBrZXljb25mLT5rZXlsZW4sCisJICAgICAga2V5Y29uZi0+a2V5aWR4LCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraWw0OTY1X3NldF93ZXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLCB1OCBzdGFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX2xlMTYga2V5X2ZsYWdzID0gMDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWtleWNvbmYtPmZsYWdzICY9IH5JRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7CisKKwlrZXlfZmxhZ3MgfD0gKFNUQV9LRVlfRkxHX1dFUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKKwlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7CisJa2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOworCisJaWYgKGtleWNvbmYtPmtleWxlbiA9PSBXRVBfS0VZX0xFTl8xMjgpCisJCWtleV9mbGFncyB8PSBTVEFfS0VZX0ZMR19LRVlfU0laRV9NU0s7CisKKwlpZiAoc3RhX2lkID09IGN0eC0+YmNhc3Rfc3RhX2lkKQorCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9NVUxUSUNBU1RfTVNLOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlsZW4gPSBrZXljb25mLT5rZXlsZW47CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlpZHggPSBrZXljb25mLT5rZXlpZHg7CisKKwltZW1jcHkoaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKworCW1lbWNweSgmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlbM10sIGtleWNvbmYtPmtleSwKKwkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKKworCWlmICgoaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS4KKwkgICAgIGtleV9mbGFncyAmIFNUQV9LRVlfRkxHX0VOQ1JZUFRfTVNLKSA9PSBTVEFfS0VZX0ZMR19OT19FTkMpCisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9CisJCSAgICBpbF9nZXRfZnJlZV91Y29kZV9rZXlfaWR4KGlsKTsKKwkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQorCSAqIGluIHVDb2RlLiAqLworCisJV0FSTihpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VULAorCSAgICAgIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKworCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfc2V0X2NjbXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX19sZTE2IGtleV9mbGFncyA9IDA7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlrZXlfZmxhZ3MgfD0gKFNUQV9LRVlfRkxHX0NDTVAgfCBTVEFfS0VZX0ZMR19NQVBfS0VZX01TSyk7CisJa2V5X2ZsYWdzIHw9IGNwdV90b19sZTE2KGtleWNvbmYtPmtleWlkeCA8PCBTVEFfS0VZX0ZMR19LRVlJRF9QT1MpOworCWtleV9mbGFncyAmPSB+U1RBX0tFWV9GTEdfSU5WQUxJRDsKKworCWlmIChzdGFfaWQgPT0gY3R4LT5iY2FzdF9zdGFfaWQpCisJCWtleV9mbGFncyB8PSBTVEFfS0VZX01VTFRJQ0FTVF9NU0s7CisKKwlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlsZW4gPSBrZXljb25mLT5rZXlsZW47CisKKwltZW1jcHkoaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKworCW1lbWNweShpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LgorCSAgICAga2V5X2ZsYWdzICYgU1RBX0tFWV9GTEdfRU5DUllQVF9NU0spID09IFNUQV9LRVlfRkxHX05PX0VOQykKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID0KKwkJICAgIGlsX2dldF9mcmVlX3Vjb2RlX2tleV9pZHgoaWwpOworCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCisJICogaW4gdUNvZGUuICovCisKKwlXQVJOKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCisJICAgICAibm8gc3BhY2UgZm9yIGEgbmV3IGtleSIpOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCisJbWVtY3B5KCZzdGFfY21kLCAmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbF9zZW5kX2FkZF9zdGEoaWwsICZzdGFfY21kLCBDTURfU1lOQyk7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zZXRfdGtpcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLCB1OCBzdGFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwlfX2xlMTYga2V5X2ZsYWdzID0gMDsKKworCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfVEtJUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKKwlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7CisJa2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOworCisJaWYgKHN0YV9pZCA9PSBjdHgtPmJjYXN0X3N0YV9pZCkKKwkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfTVVMVElDQVNUX01TSzsKKworCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKKwlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0gMTY7CisKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkuCisJICAgICBrZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykgPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQorCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQorCQkgICAgaWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChpbCk7CisJLyogZWxzZSwgd2UgYXJlIG92ZXJyaWRpbmcgYW4gZXhpc3Rpbmcga2V5ID0+IG5vIG5lZWQgdG8gYWxsb2NhdGVkIHJvb20KKwkgKiBpbiB1Q29kZS4gKi8KKworCVdBUk4oaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKKwkgICAgICJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IGtleV9mbGFnczsKKworCS8qIFRoaXMgY29weSBpcyBhY3V0YWxseSBub3QgbmVlZGVkOiB3ZSBnZXQgdGhlIGtleSB3aXRoIGVhY2ggVFggKi8KKwltZW1jcHkoaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwgMTYpOworCisJbWVtY3B5KGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksIDE2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZAoraWw0OTY1X3VwZGF0ZV90a2lwX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwgdTE2ICogcGhhc2Uxa2V5KQoreworCXU4IHN0YV9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJaWYgKGlsX3NjYW5fY2FuY2VsKGlsKSkgeworCQkvKiBjYW5jZWwgc2NhbiBmYWlsZWQsIGp1c3QgbGl2ZSB3LyBiYWQga2V5IGFuZCByZWx5CisJCSAgIGJyaWVmbHkgb24gU1cgZGVjcnlwdGlvbiAqLworCQlyZXR1cm47CisJfQorCisJc3RhX2lkID0gaWxfc3RhX2lkX29yX2Jyb2FkY2FzdChpbCwgY3R4LCBzdGEpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHNjX2J5dGUyID0gKHU4KSBpdjMyOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS50a2lwX3J4X3R0YWtbaV0gPQorCQkgICAgY3B1X3RvX2xlMTYocGhhc2Uxa2V5W2ldKTsKKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKworCWlsX3NlbmRfYWRkX3N0YShpbCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCit9CisKK2ludAoraWw0OTY1X3JlbW92ZV9keW5hbWljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IGtleV9mbGFnczsKKwl1OCBrZXlpZHg7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwljdHgtPmtleV9tYXBwaW5nX2tleXMtLTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlrZXlfZmxhZ3MgPSBsZTE2X3RvX2NwdShpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyk7CisJa2V5aWR4ID0gKGtleV9mbGFncyA+PiBTVEFfS0VZX0ZMR19LRVlJRF9QT1MpICYgMHgzOworCisJRF9XRVAoIlJlbW92ZSBkeW5hbWljIGtleTogaWR4PSVkIHN0YT0lZFxuIiwga2V5Y29uZi0+a2V5aWR4LCBzdGFfaWQpOworCisJaWYgKGtleWNvbmYtPmtleWlkeCAhPSBrZXlpZHgpIHsKKwkJLyogV2UgbmVlZCB0byByZW1vdmUgYSBrZXkgd2l0aCBpZHggZGlmZmVyZW50IHRoYXQgdGhlIG9uZQorCQkgKiBpbiB0aGUgdUNvZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUga2V5IHdlIG5lZWQgdG8gcmVtb3ZlIGhhcworCQkgKiBiZWVuIHJlcGxhY2VkIGJ5IGFub3RoZXIgb25lIHdpdGggZGlmZmVyZW50IGlkeC4KKwkJICogRG9uJ3QgZG8gYW55dGhpbmcgYW5kIHJldHVybiBvaworCQkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VUKSB7CisJCUlMX1dBUk4oIlJlbW92aW5nIHdyb25nIGtleSAlZCAweCV4XG4iLCBrZXljb25mLT5rZXlpZHgsCisJCQlrZXlfZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQKKwkgICAgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCwgJmlsLT51Y29kZV9rZXlfdGFibGUpKQorCQlJTF9FUlIoImlkeCAlZCBub3QgdXNlZCBpbiB1Q29kZSBrZXkgdGFibGUuXG4iLAorCQkgICAgICAgaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0KTsKKwltZW1zZXQoJmlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaWxfaHdfa2V5KSk7CisJbWVtc2V0KCZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LCAwLCBzaXplb2Yoc3RydWN0IGlsNDk2NV9rZXlpbmZvKSk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPQorCSAgICBTVEFfS0VZX0ZMR19OT19FTkMgfCBTVEFfS0VZX0ZMR19JTlZBTElEOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9IFdFUF9JTlZBTElEX09GRlNFVDsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkgeworCQlEX1dFUAorCQkgICAgKCJOb3Qgc2VuZGluZyBDX0FERF9TVEEgY29tbWFuZCBiZWNhdXNlIFJGS0lMTCBlbmFibGVkLlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KCZzdGFfY21kLCAmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbF9zZW5kX2FkZF9zdGEoaWwsICZzdGFfY21kLCBDTURfU1lOQyk7Cit9CisKK2ludAoraWw0OTY1X3NldF9keW5hbWljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsIHU4IHN0YV9pZCkKK3sKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWN0eC0+a2V5X21hcHBpbmdfa2V5cysrOworCWtleWNvbmYtPmh3X2tleV9pZHggPSBIV19LRVlfRFlOQU1JQzsKKworCXN3aXRjaCAoa2V5Y29uZi0+Y2lwaGVyKSB7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQlyZXQgPQorCQkgICAgaWw0OTY1X3NldF9jY21wX2R5bmFtaWNfa2V5X2luZm8oaWwsIGN0eCwga2V5Y29uZiwgc3RhX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgorCQlyZXQgPQorCQkgICAgaWw0OTY1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oaWwsIGN0eCwga2V5Y29uZiwgc3RhX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKKwkJcmV0ID0gaWw0OTY1X3NldF93ZXBfZHluYW1pY19rZXlfaW5mbyhpbCwgY3R4LCBrZXljb25mLCBzdGFfaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJTF9FUlIoIlVua25vd24gYWxnOiAlcyBjaXBoZXIgPSAleFxuIiwgX19mdW5jX18sCisJCSAgICAgICBrZXljb25mLT5jaXBoZXIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCURfV0VQKCJTZXQgZHluYW1pYyBrZXk6IGNpcGhlcj0leCBsZW49JWQgaWR4PSVkIHN0YT0lZCByZXQ9JWRcbiIsCisJICAgICAga2V5Y29uZi0+Y2lwaGVyLCBrZXljb25mLT5rZXlsZW4sIGtleWNvbmYtPmtleWlkeCwgc3RhX2lkLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpbDQ5NjVfYWxsb2NfYmNhc3Rfc3RhdGlvbiAtIGFkZCBicm9hZGNhc3Qgc3RhdGlvbiBpbnRvIGRyaXZlcidzIHN0YXRpb24gdGFibGUuCisgKgorICogVGhpcyBhZGRzIHRoZSBicm9hZGNhc3Qgc3RhdGlvbiBpbnRvIHRoZSBkcml2ZXIncyBzdGF0aW9uIHRhYmxlCisgKiBhbmQgbWFya3MgaXQgZHJpdmVyIGFjdGl2ZSwgc28gdGhhdCBpdCB3aWxsIGJlIHJlc3RvcmVkIHRvIHRoZQorICogZGV2aWNlIGF0IHRoZSBuZXh0IGJlc3QgdGltZS4KKyAqLworaW50CitpbDQ5NjVfYWxsb2NfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBzdGFfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJc3RhX2lkID0gaWxfcHJlcF9zdGF0aW9uKGlsLCBjdHgsIGlsX2JjYXN0X2FkZHIsIGZhbHNlLCBOVUxMKTsKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlJTF9FUlIoIlVuYWJsZSB0byBwcmVwYXJlIGJyb2FkY2FzdCBzdGF0aW9uXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfRFJJVkVSX0FDVElWRTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElMX1NUQV9CQ0FTVDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCWxpbmtfY21kID0gaWw0OTY1X3N0YV9hbGxvY19scShpbCwgc3RhX2lkKTsKKwlpZiAoIWxpbmtfY21kKSB7CisJCUlMX0VSUgorCQkgICAgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIGJjYXN0IHN0YXRpb24uXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxID0gbGlua19jbWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb24gLSB1cGRhdGUgYnJvYWRjYXN0IHN0YXRpb24ncyBMUSBjb21tYW5kCisgKgorICogT25seSB1c2VkIGJ5IGl3bDQ5NjUuIFBsYWNlZCBoZXJlIHRvIGhhdmUgYWxsIGJjYXN0IHN0YXRpb24gbWFuYWdlbWVudAorICogY29kZSB0b2dldGhlci4KKyAqLworc3RhdGljIGludAoraWw0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOworCXU4IHN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOworCisJbGlua19jbWQgPSBpbDQ5NjVfc3RhX2FsbG9jX2xxKGlsLCBzdGFfaWQpOworCWlmICghbGlua19jbWQpIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIGJjYXN0IHN0YS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxKQorCQlrZnJlZShpbC0+c3RhdGlvbnNbc3RhX2lkXS5scSk7CisJZWxzZQorCQlEX0lORk8oIkJjYXN0IHN0YSByYXRlIHNjYWxpbmcgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlxuIik7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBsaW5rX2NtZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2lsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiBpbDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb24oaWwsICZpbC0+Y3R4KTsKK30KKworLyoqCisgKiBpbDQ5NjVfc3RhX3R4X21vZGlmeV9lbmFibGVfdGlkIC0gRW5hYmxlIFR4IGZvciB0aGlzIFRJRCBpbiBzdGF0aW9uIHRhYmxlCisgKi8KK2ludAoraWw0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIGludCB0aWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCS8qIFJlbW92ZSAiZGlzYWJsZSIgZmxhZywgdG8gZW5hYmxlIFR4IGZvciB0aGlzIFRJRCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9USURfRElTQUJMRV9UWDsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEudGlkX2Rpc2FibGVfdHggJj0gY3B1X3RvX2xlMTYofigxIDw8IHRpZCkpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKworaW50CitpbDQ5NjVfc3RhX3J4X2FnZ19zdGFydChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCB0aWQsCisJCQl1MTYgc3NuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YV9pZDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCXN0YV9pZCA9IGlsX3N0YV9pZChzdGEpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKQorCQlyZXR1cm4gLUVOWElPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGF0aW9uX2ZsYWdzX21zayA9IDA7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfQUREQkFfVElEX01TSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuYWRkX2ltbWVkaWF0ZV9iYV90aWQgPSAodTgpIHRpZDsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuYWRkX2ltbWVkaWF0ZV9iYV9zc24gPSBjcHVfdG9fbGUxNihzc24pOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKworaW50CitpbDQ5NjVfc3RhX3J4X2FnZ19zdG9wKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgaW50IHRpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGFfaWQ7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlzdGFfaWQgPSBpbF9zdGFfaWQoc3RhKTsKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlJTF9FUlIoIkludmFsaWQgc3RhdGlvbiBmb3IgQUdHIHRpZCAlZFxuIiwgdGlkKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gMDsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9ERUxCQV9USURfTVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZCA9ICh1OCkgdGlkOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKwordm9pZAoraWw0OTY1X3N0YV9tb2RpZnlfc2xlZXBfdHhfY291bnQoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgc3RhX2lkLCBpbnQgY250KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3MgfD0gU1RBX0ZMR19QV1JfU0FWRV9NU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gU1RBX0ZMR19QV1JfU0FWRV9NU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9CisJICAgIFNUQV9NT0RJRllfU0xFRVBfVFhfQ09VTlRfTVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zbGVlcF90eF9jb3VudCA9IGNwdV90b19sZTE2KGNudCk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCWlsX3NlbmRfYWRkX3N0YShpbCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworfQorCit2b2lkCitpbDQ5NjVfdXBkYXRlX2NoYWluX2ZsYWdzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikgeworCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCAmaWwtPmN0eCk7CisJCWlmIChpbC0+Y3R4LmFjdGl2ZS5yeF9jaGFpbiAhPSBpbC0+Y3R4LnN0YWdpbmcucnhfY2hhaW4pCisJCQlpbF9jb21taXRfcnhvbihpbCwgJmlsLT5jdHgpOworCX0KK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9jbGVhcl9mcmVlX2ZyYW1lcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKworCURfSU5GTygiJWQgZnJhbWVzIG9uIHByZS1hbGxvY2F0ZWQgaGVhcCBvbiBjbGVhci5cbiIsIGlsLT5mcmFtZXNfY291bnQpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZpbC0+ZnJlZV9mcmFtZXMpKSB7CisJCWVsZW1lbnQgPSBpbC0+ZnJlZV9mcmFtZXMubmV4dDsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisJCWtmcmVlKGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGlsX2ZyYW1lLCBsaXN0KSk7CisJCWlsLT5mcmFtZXNfY291bnQtLTsKKwl9CisKKwlpZiAoaWwtPmZyYW1lc19jb3VudCkgeworCQlJTF9XQVJOKCIlZCBmcmFtZXMgc3RpbGwgaW4gdXNlLiAgRGlkIHdlIGxvc2Ugb25lP1xuIiwKKwkJCWlsLT5mcmFtZXNfY291bnQpOworCQlpbC0+ZnJhbWVzX2NvdW50ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWxfZnJhbWUgKgoraWw0OTY1X2dldF9mcmVlX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfZnJhbWUgKmZyYW1lOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJaWYgKGxpc3RfZW1wdHkoJmlsLT5mcmVlX2ZyYW1lcykpIHsKKwkJZnJhbWUgPSBremFsbG9jKHNpemVvZigqZnJhbWUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmcmFtZSkgeworCQkJSUxfRVJSKCJDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUhXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWwtPmZyYW1lc19jb3VudCsrOworCQlyZXR1cm4gZnJhbWU7CisJfQorCisJZWxlbWVudCA9IGlsLT5mcmVlX2ZyYW1lcy5uZXh0OworCWxpc3RfZGVsKGVsZW1lbnQpOworCXJldHVybiBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpbF9mcmFtZSwgbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfZnJlZV9mcmFtZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9mcmFtZSAqZnJhbWUpCit7CisJbWVtc2V0KGZyYW1lLCAwLCBzaXplb2YoKmZyYW1lKSk7CisJbGlzdF9hZGQoJmZyYW1lLT5saXN0LCAmaWwtPmZyZWVfZnJhbWVzKTsKK30KKworc3RhdGljIHUzMgoraWw0OTY1X2ZpbGxfYmVhY29uX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSBpbnQgbGVmdCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKCFpbC0+YmVhY29uX3NrYikKKwkJcmV0dXJuIDA7CisKKwlpZiAoaWwtPmJlYWNvbl9za2ItPmxlbiA+IGxlZnQpCisJCXJldHVybiAwOworCisJbWVtY3B5KGhkciwgaWwtPmJlYWNvbl9za2ItPmRhdGEsIGlsLT5iZWFjb25fc2tiLT5sZW4pOworCisJcmV0dXJuIGlsLT5iZWFjb25fc2tiLT5sZW47Cit9CisKKy8qIFBhcnNlIHRoZSBiZWFjb24gZnJhbWUgdG8gZmluZCB0aGUgVElNIGVsZW1lbnQgYW5kIHNldCB0aW1faWR4ICYgdGltX3NpemUgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfc2V0X2JlYWNvbl90aW0oc3RydWN0IGlsX3ByaXYgKmlsLAorCQkgICAgICBzdHJ1Y3QgaWxfdHhfYmVhY29uX2NtZCAqdHhfYmVhY29uX2NtZCwgdTggKiBiZWFjb24sCisJCSAgICAgIHUzMiBmcmFtZV9zaXplKQoreworCXUxNiB0aW1faWR4OworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKiliZWFjb247CisKKwkvKgorCSAqIFRoZSBpZHggaXMgcmVsYXRpdmUgdG8gZnJhbWUgc3RhcnQgYnV0IHdlIHN0YXJ0IGxvb2tpbmcgYXQgdGhlCisJICogdmFyaWFibGUtbGVuZ3RoIHBhcnQgb2YgdGhlIGJlYWNvbi4KKwkgKi8KKwl0aW1faWR4ID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGUgLSBiZWFjb247CisKKwkvKiBQYXJzZSB2YXJpYWJsZS1sZW5ndGggZWxlbWVudHMgb2YgYmVhY29uIHRvIGZpbmQgV0xBTl9FSURfVElNICovCisJd2hpbGUgKCh0aW1faWR4IDwgKGZyYW1lX3NpemUgLSAyKSkgJiYKKwkgICAgICAgKGJlYWNvblt0aW1faWR4XSAhPSBXTEFOX0VJRF9USU0pKQorCQl0aW1faWR4ICs9IGJlYWNvblt0aW1faWR4ICsgMV0gKyAyOworCisJLyogSWYgVElNIGZpZWxkIHdhcyBmb3VuZCwgc2V0IHZhcmlhYmxlcyAqLworCWlmICgodGltX2lkeCA8IChmcmFtZV9zaXplIC0gMSkpICYmIChiZWFjb25bdGltX2lkeF0gPT0gV0xBTl9FSURfVElNKSkgeworCQl0eF9iZWFjb25fY21kLT50aW1faWR4ID0gY3B1X3RvX2xlMTYodGltX2lkeCk7CisJCXR4X2JlYWNvbl9jbWQtPnRpbV9zaXplID0gYmVhY29uW3RpbV9pZHggKyAxXTsKKwl9IGVsc2UKKwkJSUxfV0FSTigiVW5hYmxlIHRvIGZpbmQgVElNIEVsZW1lbnQgaW4gYmVhY29uXG4iKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraWw0OTY1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2ZyYW1lICpmcmFtZSkKK3sKKwlzdHJ1Y3QgaWxfdHhfYmVhY29uX2NtZCAqdHhfYmVhY29uX2NtZDsKKwl1MzIgZnJhbWVfc2l6ZTsKKwl1MzIgcmF0ZV9mbGFnczsKKwl1MzIgcmF0ZTsKKwkvKgorCSAqIFdlIGhhdmUgdG8gc2V0IHVwIHRoZSBUWCBjb21tYW5kLCB0aGUgVFggQmVhY29uIGNvbW1hbmQsIGFuZCB0aGUKKwkgKiBiZWFjb24gY29udGVudHMuCisJICovCisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKCFpbC0+YmVhY29uX2N0eCkgeworCQlJTF9FUlIoInRyeWluZyB0byBidWlsZCBiZWFjb24gdy9vIGJlYWNvbiBjb250ZXh0IVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEluaXRpYWxpemUgbWVtb3J5ICovCisJdHhfYmVhY29uX2NtZCA9ICZmcmFtZS0+dS5iZWFjb247CisJbWVtc2V0KHR4X2JlYWNvbl9jbWQsIDAsIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOworCisJLyogU2V0IHVwIFRYIGJlYWNvbiBjb250ZW50cyAqLworCWZyYW1lX3NpemUgPQorCSAgICBpbDQ5NjVfZmlsbF9iZWFjb25fZnJhbWUoaWwsIHR4X2JlYWNvbl9jbWQtPmZyYW1lLAorCQkJCSAgICAgc2l6ZW9mKGZyYW1lLT51KSAtIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOworCWlmIChXQVJOX09OX09OQ0UoZnJhbWVfc2l6ZSA+IE1BWF9NUERVX1NJWkUpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWZyYW1lX3NpemUpCisJCXJldHVybiAwOworCisJLyogU2V0IHVwIFRYIGNvbW1hbmQgZmllbGRzICovCisJdHhfYmVhY29uX2NtZC0+dHgubGVuID0gY3B1X3RvX2xlMTYoKHUxNikgZnJhbWVfc2l6ZSk7CisJdHhfYmVhY29uX2NtZC0+dHguc3RhX2lkID0gaWwtPmJlYWNvbl9jdHgtPmJjYXN0X3N0YV9pZDsKKwl0eF9iZWFjb25fY21kLT50eC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKKwl0eF9iZWFjb25fY21kLT50eC50eF9mbGFncyA9CisJICAgIFRYX0NNRF9GTEdfU0VRX0NUTF9NU0sgfCBUWF9DTURfRkxHX1RTRl9NU0sgfAorCSAgICBUWF9DTURfRkxHX1NUQV9SQVRFX01TSzsKKworCS8qIFNldCB1cCBUWCBiZWFjb24gY29tbWFuZCBmaWVsZHMgKi8KKwlpbDQ5NjVfc2V0X2JlYWNvbl90aW0oaWwsIHR4X2JlYWNvbl9jbWQsICh1OCAqKSB0eF9iZWFjb25fY21kLT5mcmFtZSwKKwkJCSAgICAgIGZyYW1lX3NpemUpOworCisJLyogU2V0IHVwIHBhY2tldCByYXRlIGFuZCBmbGFncyAqLworCXJhdGUgPSBpbF9nZXRfbG93ZXN0X3BsY3AoaWwsIGlsLT5iZWFjb25fY3R4KTsKKwlpbC0+bWdtdF90eF9hbnQgPQorCSAgICBpbDQ5NjVfdG9nZ2xlX3R4X2FudChpbCwgaWwtPm1nbXRfdHhfYW50LAorCQkJCSBpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCk7CisJcmF0ZV9mbGFncyA9IGlsNDk2NV9hbnRfaWR4X3RvX2ZsYWdzKGlsLT5tZ210X3R4X2FudCk7CisJaWYgKChyYXRlID49IElMX0ZJUlNUX0NDS19SQVRFKSAmJiAocmF0ZSA8PSBJTF9MQVNUX0NDS19SQVRFKSkKKwkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOworCXR4X2JlYWNvbl9jbWQtPnR4LnJhdGVfbl9mbGFncyA9CisJICAgIGlsNDk2NV9od19zZXRfcmF0ZV9uX2ZsYWdzKHJhdGUsIHJhdGVfZmxhZ3MpOworCisJcmV0dXJuIHNpemVvZigqdHhfYmVhY29uX2NtZCkgKyBmcmFtZV9zaXplOworfQorCitpbnQKK2lsNDk2NV9zZW5kX2JlYWNvbl9jbWQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9mcmFtZSAqZnJhbWU7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemU7CisJaW50IHJjOworCisJZnJhbWUgPSBpbDQ5NjVfZ2V0X2ZyZWVfZnJhbWUoaWwpOworCWlmICghZnJhbWUpIHsKKwkJSUxfRVJSKCJDb3VsZCBub3Qgb2J0YWluIGZyZWUgZnJhbWUgYnVmZmVyIGZvciBiZWFjb24gIgorCQkgICAgICAgImNvbW1hbmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZnJhbWVfc2l6ZSA9IGlsNDk2NV9od19nZXRfYmVhY29uX2NtZChpbCwgZnJhbWUpOworCWlmICghZnJhbWVfc2l6ZSkgeworCQlJTF9FUlIoIkVycm9yIGNvbmZpZ3VyaW5nIHRoZSBiZWFjb24gY29tbWFuZFxuIik7CisJCWlsNDk2NV9mcmVlX2ZyYW1lKGlsLCBmcmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1RYX0JFQUNPTiwgZnJhbWVfc2l6ZSwgJmZyYW1lLT51LmNtZFswXSk7CisKKwlpbDQ5NjVfZnJlZV9mcmFtZShpbCwgZnJhbWUpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKK2lsNDk2NV90ZmRfdGJfZ2V0X2FkZHIoc3RydWN0IGlsX3RmZCAqdGZkLCB1OCBpZHgpCit7CisJc3RydWN0IGlsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKKworCWRtYV9hZGRyX3QgYWRkciA9IGdldF91bmFsaWduZWRfbGUzMigmdGItPmxvKTsKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCisJCWFkZHIgfD0KKwkJICAgICgoZG1hX2FkZHJfdCkgKGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgJiAweEYpIDw8IDE2KSA8PAorCQkgICAgMTY7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGlubGluZSB1MTYKK2lsNDk2NV90ZmRfdGJfZ2V0X2xlbihzdHJ1Y3QgaWxfdGZkICp0ZmQsIHU4IGlkeCkKK3sKKwlzdHJ1Y3QgaWxfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCisJcmV0dXJuIGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgPj4gNDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbDQ5NjVfdGZkX3NldF90YihzdHJ1Y3QgaWxfdGZkICp0ZmQsIHU4IGlkeCwgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuKQoreworCXN0cnVjdCBpbF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07CisJdTE2IGhpX25fbGVuID0gbGVuIDw8IDQ7CisKKwlwdXRfdW5hbGlnbmVkX2xlMzIoYWRkciwgJnRiLT5sbyk7CisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IHNpemVvZih1MzIpKQorCQloaV9uX2xlbiB8PSAoKGFkZHIgPj4gMTYpID4+IDE2KSAmIDB4RjsKKworCXRiLT5oaV9uX2xlbiA9IGNwdV90b19sZTE2KGhpX25fbGVuKTsKKworCXRmZC0+bnVtX3RicyA9IGlkeCArIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsNDk2NV90ZmRfZ2V0X251bV90YnMoc3RydWN0IGlsX3RmZCAqdGZkKQoreworCXJldHVybiB0ZmQtPm51bV90YnMgJiAweDFmOworfQorCisvKioKKyAqIGlsNDk2NV9od190eHFfZnJlZV90ZmQgLSBGcmVlIGFsbCBjaHVua3MgcmVmZXJlbmNlZCBieSBURkQgW3R4cS0+cS5yZWFkX3B0cl0KKyAqIEBpbCAtIGRyaXZlciBpbGF0ZSBkYXRhCisgKiBAdHhxIC0gdHggcXVldWUKKyAqCisgKiBEb2VzIE5PVCBhZHZhbmNlIGFueSBURkQgY2lyY3VsYXIgYnVmZmVyIHJlYWQvd3JpdGUgaWR4ZXMKKyAqIERvZXMgTk9UIGZyZWUgdGhlIFRGRCBpdHNlbGYgKHdoaWNoIGlzIHdpdGhpbiBjaXJjdWxhciBidWZmZXIpCisgKi8KK3ZvaWQKK2lsNDk2NV9od190eHFfZnJlZV90ZmQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSkKK3sKKwlzdHJ1Y3QgaWxfdGZkICp0ZmRfdG1wID0gKHN0cnVjdCBpbF90ZmQgKil0eHEtPnRmZHM7CisJc3RydWN0IGlsX3RmZCAqdGZkOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBpbC0+cGNpX2RldjsKKwlpbnQgaWR4ID0gdHhxLT5xLnJlYWRfcHRyOworCWludCBpOworCWludCBudW1fdGJzOworCisJdGZkID0gJnRmZF90bXBbaWR4XTsKKworCS8qIFNhbml0eSBjaGVjayBvbiBudW1iZXIgb2YgY2h1bmtzICovCisJbnVtX3RicyA9IGlsNDk2NV90ZmRfZ2V0X251bV90YnModGZkKTsKKworCWlmIChudW1fdGJzID49IElMX05VTV9PRl9UQlMpIHsKKwkJSUxfRVJSKCJUb28gbWFueSBjaHVua3M6ICVpXG4iLCBudW1fdGJzKTsKKwkJLyogQHRvZG8gaXNzdWUgZmF0YWwgZXJyb3IsIGl0IGlzIHF1aXRlIHNlcmlvdXMgc2l0dWF0aW9uICovCisJCXJldHVybjsKKwl9CisKKwkvKiBVbm1hcCB0eF9jbWQgKi8KKwlpZiAobnVtX3RicykKKwkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaWR4XSwgbWFwcGluZyksCisJCQkJIGRtYV91bm1hcF9sZW4oJnR4cS0+bWV0YVtpZHhdLCBsZW4pLAorCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCisJLyogVW5tYXAgY2h1bmtzLCBpZiBhbnkuICovCisJZm9yIChpID0gMTsgaSA8IG51bV90YnM7IGkrKykKKwkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGlsNDk2NV90ZmRfdGJfZ2V0X2FkZHIodGZkLCBpKSwKKwkJCQkgaWw0OTY1X3RmZF90Yl9nZXRfbGVuKHRmZCwgaSksCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJLyogZnJlZSBTS0IgKi8KKwlpZiAodHhxLT50eGIpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSB0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYjsKKworCQkvKiBjYW4gYmUgY2FsbGVkIGZyb20gaXJxcy1kaXNhYmxlZCBjb250ZXh0ICovCisJCWlmIChza2IpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQl0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK2ludAoraWw0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJCWRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgdTggcmVzZXQsIHU4IHBhZCkKK3sKKwlzdHJ1Y3QgaWxfcXVldWUgKnE7CisJc3RydWN0IGlsX3RmZCAqdGZkLCAqdGZkX3RtcDsKKwl1MzIgbnVtX3RiczsKKworCXEgPSAmdHhxLT5xOworCXRmZF90bXAgPSAoc3RydWN0IGlsX3RmZCAqKXR4cS0+dGZkczsKKwl0ZmQgPSAmdGZkX3RtcFtxLT53cml0ZV9wdHJdOworCisJaWYgKHJlc2V0KQorCQltZW1zZXQodGZkLCAwLCBzaXplb2YoKnRmZCkpOworCisJbnVtX3RicyA9IGlsNDk2NV90ZmRfZ2V0X251bV90YnModGZkKTsKKworCS8qIEVhY2ggVEZEIGNhbiBwb2ludCB0byBhIG1heGltdW0gMjAgVHggYnVmZmVycyAqLworCWlmIChudW1fdGJzID49IElMX05VTV9PRl9UQlMpIHsKKwkJSUxfRVJSKCJFcnJvciBjYW4gbm90IHNlbmQgbW9yZSB0aGFuICVkIGNodW5rc1xuIiwKKwkJICAgICAgIElMX05VTV9PRl9UQlMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlCVUdfT04oYWRkciAmIH5ETUFfQklUX01BU0soMzYpKTsKKwlpZiAodW5saWtlbHkoYWRkciAmIH5JTF9UWF9ETUFfTUFTSykpCisJCUlMX0VSUigiVW5hbGlnbmVkIGFkZHJlc3MgPSAlbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIpOworCisJaWw0OTY1X3RmZF9zZXRfdGIodGZkLCBudW1fdGJzLCBhZGRyLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUZWxsIG5pYyB3aGVyZSB0byBmaW5kIGNpcmN1bGFyIGJ1ZmZlciBvZiBUeCBGcmFtZSBEZXNjcmlwdG9ycyBmb3IKKyAqIGdpdmVuIFR4IHF1ZXVlLCBhbmQgZW5hYmxlIHRoZSBETUEgY2hhbm5lbCB1c2VkIGZvciB0aGF0IHF1ZXVlLgorICoKKyAqIDQ5NjUgc3VwcG9ydHMgdXAgdG8gMTYgVHggcXVldWVzIGluIERSQU0sIG1hcHBlZCB0byB1cCB0byA4IFR4IERNQQorICogY2hhbm5lbHMgc3VwcG9ydGVkIGluIGhhcmR3YXJlLgorICovCitpbnQKK2lsNDk2NV9od190eF9xdWV1ZV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpCit7CisJaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKworCS8qIENpcmN1bGFyIGJ1ZmZlciAoVEZEIHF1ZXVlIGluIERSQU0pIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLworCWlsX3dyKGlsLCBGSDQ5X01FTV9DQkJDX1FVRVVFKHR4cV9pZCksIHR4cS0+cS5kbWFfYWRkciA+PiA4KTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2VuZXJpYyBSWCBoYW5kbGVyIGltcGxlbWVudGF0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraWw0OTY1X2hkbF9hbGl2ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9hbGl2ZV9yZXNwICpwYWxpdmU7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqcHdvcms7CisKKwlwYWxpdmUgPSAmcGt0LT51LmFsaXZlX2ZyYW1lOworCisJRF9JTkZPKCJBbGl2ZSB1Y29kZSBzdGF0dXMgMHglMDhYIHJldmlzaW9uICIgIjB4JTAxWCAweCUwMVhcbiIsCisJICAgICAgIHBhbGl2ZS0+aXNfdmFsaWQsIHBhbGl2ZS0+dmVyX3R5cGUsIHBhbGl2ZS0+dmVyX3N1YnR5cGUpOworCisJaWYgKHBhbGl2ZS0+dmVyX3N1YnR5cGUgPT0gSU5JVElBTElaRV9TVUJUWVBFKSB7CisJCURfSU5GTygiSW5pdGlhbGl6YXRpb24gQWxpdmUgcmVjZWl2ZWQuXG4iKTsKKwkJbWVtY3B5KCZpbC0+Y2FyZF9hbGl2ZV9pbml0LCAmcGt0LT51LmFsaXZlX2ZyYW1lLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9pbml0X2FsaXZlX3Jlc3ApKTsKKwkJcHdvcmsgPSAmaWwtPmluaXRfYWxpdmVfc3RhcnQ7CisJfSBlbHNlIHsKKwkJRF9JTkZPKCJSdW50aW1lIEFsaXZlIHJlY2VpdmVkLlxuIik7CisJCW1lbWNweSgmaWwtPmNhcmRfYWxpdmUsICZwa3QtPnUuYWxpdmVfZnJhbWUsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FsaXZlX3Jlc3ApKTsKKwkJcHdvcmsgPSAmaWwtPmFsaXZlX3N0YXJ0OworCX0KKworCS8qIFdlIGRlbGF5IHRoZSBBTElWRSByZXNwb25zZSBieSA1bXMgdG8KKwkgKiBnaXZlIHRoZSBIVyBSRiBLaWxsIHRpbWUgdG8gYWN0aXZhdGUuLi4gKi8KKwlpZiAocGFsaXZlLT5pc192YWxpZCA9PSBVQ09ERV9WQUxJRF9PSykKKwkJcXVldWVfZGVsYXllZF93b3JrKGlsLT53b3JrcXVldWUsIHB3b3JrLCBtc2Vjc190b19qaWZmaWVzKDUpKTsKKwllbHNlCisJCUlMX1dBUk4oInVDb2RlIGRpZCBub3QgcmVzcG9uZCBPSy5cbiIpOworfQorCisvKioKKyAqIGlsNDk2NV9iZ19zdGF0c19wZXJpb2RpYyAtIFRpbWVyIGNhbGxiYWNrIHRvIHF1ZXVlIHN0YXRzCisgKgorICogVGhpcyBjYWxsYmFjayBpcyBwcm92aWRlZCBpbiBvcmRlciB0byBzZW5kIGEgc3RhdHMgcmVxdWVzdC4KKyAqCisgKiBUaGlzIHRpbWVyIGZ1bmN0aW9uIGlzIGNvbnRpbnVhbGx5IHJlc2V0IHRvIGV4ZWN1dGUgd2l0aGluCisgKiBSRUdfUkVDQUxJQl9QRVJJT0Qgc2Vjb25kcyBzaW5jZSB0aGUgbGFzdCBOX1NUQVRTCisgKiB3YXMgcmVjZWl2ZWQuICBXZSBuZWVkIHRvIGVuc3VyZSB3ZSByZWNlaXZlIHRoZSBzdGF0cyBpbiBvcmRlcgorICogdG8gdXBkYXRlIHRoZSB0ZW1wZXJhdHVyZSB1c2VkIGZvciBjYWxpYnJhdGluZyB0aGUgVFhQT1dFUi4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9iZ19zdGF0c19wZXJpb2RpYyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gKHN0cnVjdCBpbF9wcml2ICopZGF0YTsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwkvKiBkb250IHNlbmQgaG9zdCBjb21tYW5kIGlmIHJmLWtpbGwgaXMgb24gKi8KKwlpZiAoIWlsX2lzX3JlYWR5X3JmKGlsKSkKKwkJcmV0dXJuOworCisJaWxfc2VuZF9zdGF0c19yZXF1ZXN0KGlsLCBDTURfQVNZTkMsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9oZGxfYmVhY29uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsNDk2NV9iZWFjb25fbm90aWYgKmJlYWNvbiA9CisJICAgIChzdHJ1Y3QgaWw0OTY1X2JlYWNvbl9ub3RpZiAqKXBrdC0+dS5yYXc7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJdTggcmF0ZSA9IGlsNDk2NV9od19nZXRfcmF0ZShiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLnJhdGVfbl9mbGFncyk7CisKKwlEX1JYKCJiZWFjb24gc3RhdHVzICV4IHJldHJpZXMgJWQgaXNzICVkICIgInRzZiAlZCAlZCByYXRlICVkXG4iLAorCSAgICAgbGUzMl90b19jcHUoYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci51LnN0YXR1cykgJiBUWF9TVEFUVVNfTVNLLAorCSAgICAgYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5mYWlsdXJlX2ZyYW1lLAorCSAgICAgbGUzMl90b19jcHUoYmVhY29uLT5pYnNzX21ncl9zdGF0dXMpLAorCSAgICAgbGUzMl90b19jcHUoYmVhY29uLT5oaWdoX3RzZiksIGxlMzJfdG9fY3B1KGJlYWNvbi0+bG93X3RzZiksIHJhdGUpOworI2VuZGlmCisKKwlpbC0+aWJzc19tYW5hZ2VyID0gbGUzMl90b19jcHUoYmVhY29uLT5pYnNzX21ncl9zdGF0dXMpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3BlcmZvcm1fY3Rfa2lsbF90YXNrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRF9QT1dFUigiU3RvcCBhbGwgcXVldWVzXG4iKTsKKworCWlmIChpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKKwkJaWVlZTgwMjExX3N0b3BfcXVldWVzKGlsLT5odyk7CisKKwlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwKKwkgICAgICAgQ1NSX1VDT0RFX0RSVl9HUDFfUkVHX0JJVF9DVF9LSUxMX0VYSVQpOworCV9pbF9yZChpbCwgQ1NSX1VDT0RFX0RSVl9HUDEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmICghX2lsX2dyYWJfbmljX2FjY2VzcyhpbCkpCisJCV9pbF9yZWxlYXNlX25pY19hY2Nlc3MoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCisvKiBIYW5kbGUgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUgdGhhdCBjYXJkJ3MgcG93ZXIgc3RhdGUgaXMgY2hhbmdpbmcKKyAqIGR1ZSB0byBzb2Z0d2FyZSwgaGFyZHdhcmUsIG9yIGNyaXRpY2FsIHRlbXBlcmF0dXJlIFJGS0lMTCAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9oZGxfY2FyZF9zdGF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXUzMiBmbGFncyA9IGxlMzJfdG9fY3B1KHBrdC0+dS5jYXJkX3N0YXRlX25vdGlmLmZsYWdzKTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IGlsLT5zdGF0dXM7CisKKwlEX1JGX0tJTEwoIkNhcmQgc3RhdGUgcmVjZWl2ZWQ6IEhXOiVzIFNXOiVzIENUOiVzXG4iLAorCQkgIChmbGFncyAmIEhXX0NBUkRfRElTQUJMRUQpID8gIktpbGwiIDogIk9uIiwKKwkJICAoZmxhZ3MgJiBTV19DQVJEX0RJU0FCTEVEKSA/ICJLaWxsIiA6ICJPbiIsCisJCSAgKGZsYWdzICYgQ1RfQ0FSRF9ESVNBQkxFRCkgPyAiUmVhY2hlZCIgOiAiTm90IHJlYWNoZWQiKTsKKworCWlmIChmbGFncyAmIChTV19DQVJEX0RJU0FCTEVEIHwgSFdfQ0FSRF9ESVNBQkxFRCB8IENUX0NBUkRfRElTQUJMRUQpKSB7CisKKwkJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsCisJCSAgICAgICBDU1JfVUNPREVfRFJWX0dQMV9CSVRfQ01EX0JMT0NLRUQpOworCisJCWlsX3dyKGlsLCBIQlVTX1RBUkdfTUJYX0MsIEhCVVNfVEFSR19NQlhfQ19SRUdfQklUX0NNRF9CTE9DS0VEKTsKKworCQlpZiAoIShmbGFncyAmIFJYT05fQ0FSRF9ESVNBQkxFRCkpIHsKKwkJCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAorCQkJICAgICAgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7CisJCQlpbF93cihpbCwgSEJVU19UQVJHX01CWF9DLAorCQkJICAgICAgSEJVU19UQVJHX01CWF9DX1JFR19CSVRfQ01EX0JMT0NLRUQpOworCQl9CisJfQorCisJaWYgKGZsYWdzICYgQ1RfQ0FSRF9ESVNBQkxFRCkKKwkJaWw0OTY1X3BlcmZvcm1fY3Rfa2lsbF90YXNrKGlsKTsKKworCWlmIChmbGFncyAmIEhXX0NBUkRfRElTQUJMRUQpCisJCXNldF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJZWxzZQorCQljbGVhcl9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisKKwlpZiAoIShmbGFncyAmIFJYT05fQ0FSRF9ESVNBQkxFRCkpCisJCWlsX3NjYW5fY2FuY2VsKGlsKTsKKworCWlmICgodGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmc3RhdHVzKSAhPQorCSAgICAgdGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cykpKQorCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKGlsLT5ody0+d2lwaHksCisJCQkJCSAgdGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cykpOworCWVsc2UKKwkJd2FrZV91cCgmaWwtPndhaXRfY29tbWFuZF9xdWV1ZSk7Cit9CisKKy8qKgorICogaWw0OTY1X3NldHVwX2hhbmRsZXJzIC0gSW5pdGlhbGl6ZSBSeCBoYW5kbGVyIGNhbGxiYWNrcworICoKKyAqIFNldHVwIHRoZSBSWCBoYW5kbGVycyBmb3IgZWFjaCBvZiB0aGUgcmVwbHkgdHlwZXMgc2VudCBmcm9tIHRoZSB1Q29kZQorICogdG8gdGhlIGhvc3QuCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGFpbnMgaW50byB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgZmlsZXMgZm9yIHRoZW0gdG8gc2V0dXAKKyAqIGFueSBoYXJkd2FyZSBzcGVjaWZpYyBoYW5kbGVycyBhcyB3ZWxsLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3NldHVwX2hhbmRsZXJzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbC0+aGFuZGxlcnNbTl9BTElWRV0gPSBpbDQ5NjVfaGRsX2FsaXZlOworCWlsLT5oYW5kbGVyc1tOX0VSUk9SXSA9IGlsX2hkbF9lcnJvcjsKKwlpbC0+aGFuZGxlcnNbTl9DSEFOTkVMX1NXSVRDSF0gPSBpbF9oZGxfY3NhOworCWlsLT5oYW5kbGVyc1tOX1NQRUNUUlVNX01FQVNVUkVNRU5UXSA9IGlsX2hkbF9zcGVjdHJ1bV9tZWFzdXJlbWVudDsKKwlpbC0+aGFuZGxlcnNbTl9QTV9TTEVFUF0gPSBpbF9oZGxfcG1fc2xlZXA7CisJaWwtPmhhbmRsZXJzW05fUE1fREVCVUdfU1RBVFNdID0gaWxfaGRsX3BtX2RlYnVnX3N0YXRzOworCWlsLT5oYW5kbGVyc1tOX0JFQUNPTl0gPSBpbDQ5NjVfaGRsX2JlYWNvbjsKKworCS8qCisJICogVGhlIHNhbWUgaGFuZGxlciBpcyB1c2VkIGZvciBib3RoIHRoZSBSRVBMWSB0byBhIGRpc2NyZXRlCisJICogc3RhdHMgcmVxdWVzdCBmcm9tIHRoZSBob3N0IGFzIHdlbGwgYXMgZm9yIHRoZSBwZXJpb2RpYworCSAqIHN0YXRzIG5vdGlmaWNhdGlvbnMgKGFmdGVyIHJlY2VpdmVkIGJlYWNvbnMpIGZyb20gdGhlIHVDb2RlLgorCSAqLworCWlsLT5oYW5kbGVyc1tDX1NUQVRTXSA9IGlsNDk2NV9oZGxfY19zdGF0czsKKwlpbC0+aGFuZGxlcnNbTl9TVEFUU10gPSBpbDQ5NjVfaGRsX3N0YXRzOworCisJaWxfc2V0dXBfcnhfc2Nhbl9oYW5kbGVycyhpbCk7CisKKwkvKiBzdGF0dXMgY2hhbmdlIGhhbmRsZXIgKi8KKwlpbC0+aGFuZGxlcnNbTl9DQVJEX1NUQVRFXSA9IGlsNDk2NV9oZGxfY2FyZF9zdGF0ZTsKKworCWlsLT5oYW5kbGVyc1tOX01JU1NFRF9CRUFDT05TXSA9IGlsNDk2NV9oZGxfbWlzc2VkX2JlYWNvbjsKKwkvKiBSeCBoYW5kbGVycyAqLworCWlsLT5oYW5kbGVyc1tOX1JYX1BIWV0gPSBpbDQ5NjVfaGRsX3J4X3BoeTsKKwlpbC0+aGFuZGxlcnNbTl9SWF9NUERVXSA9IGlsNDk2NV9oZGxfcng7CisJLyogYmxvY2sgYWNrICovCisJaWwtPmhhbmRsZXJzW05fQ09NUFJFU1NFRF9CQV0gPSBpbDQ5NjVfaGRsX2NvbXByZXNzZWRfYmE7CisJLyogU2V0IHVwIGhhcmR3YXJlIHNwZWNpZmljIFJ4IGhhbmRsZXJzICovCisJaWwtPmNmZy0+b3BzLT5saWItPmhhbmRsZXJfc2V0dXAoaWwpOworfQorCisvKioKKyAqIGlsNDk2NV9yeF9oYW5kbGUgLSBNYWluIGVudHJ5IGZ1bmN0aW9uIGZvciByZWNlaXZpbmcgcmVzcG9uc2VzIGZyb20gdUNvZGUKKyAqCisgKiBVc2VzIHRoZSBpbC0+aGFuZGxlcnMgY2FsbGJhY2sgZnVuY3Rpb24gYXJyYXkgdG8gaW52b2tlCisgKiB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlcnMsIGluY2x1ZGluZyBjb21tYW5kIHJlc3BvbnNlcywKKyAqIGZyYW1lLXJlY2VpdmVkIG5vdGlmaWNhdGlvbnMsIGFuZCBvdGhlciBub3RpZmljYXRpb25zLgorICovCit2b2lkCitpbDQ5NjVfcnhfaGFuZGxlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfcnhfYnVmICpyeGI7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0OworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJdTMyIHIsIGk7CisJaW50IHJlY2xhaW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBmaWxsX3J4ID0gMDsKKwl1MzIgY291bnQgPSA4OworCWludCB0b3RhbF9lbXB0eTsKKworCS8qIHVDb2RlJ3MgcmVhZCBpZHggKHN0b3JlZCBpbiBzaGFyZWQgRFJBTSkgaW5kaWNhdGVzIHRoZSBsYXN0IFJ4CisJICogYnVmZmVyIHRoYXQgdGhlIGRyaXZlciBtYXkgcHJvY2VzcyAobGFzdCBidWZmZXIgZmlsbGVkIGJ5IHVjb2RlKS4gKi8KKwlyID0gbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT5jbG9zZWRfcmJfbnVtKSAmIDB4MEZGRjsKKwlpID0gcnhxLT5yZWFkOworCisJLyogUnggaW50ZXJydXB0LCBidXQgbm90aGluZyBzZW50IGZyb20gdUNvZGUgKi8KKwlpZiAoaSA9PSByKQorCQlEX1JYKCJyID0gJWQsIGkgPSAlZFxuIiwgciwgaSk7CisKKwkvKiBjYWxjdWxhdGUgdG90YWwgZnJhbWVzIG5lZWQgdG8gYmUgcmVzdG9jayBhZnRlciBoYW5kbGluZyBSWCAqLworCXRvdGFsX2VtcHR5ID0gciAtIHJ4cS0+d3JpdGVfYWN0dWFsOworCWlmICh0b3RhbF9lbXB0eSA8IDApCisJCXRvdGFsX2VtcHR5ICs9IFJYX1FVRVVFX1NJWkU7CisKKwlpZiAodG90YWxfZW1wdHkgPiAoUlhfUVVFVUVfU0laRSAvIDIpKQorCQlmaWxsX3J4ID0gMTsKKworCXdoaWxlIChpICE9IHIpIHsKKwkJaW50IGxlbjsKKworCQlyeGIgPSByeHEtPnF1ZXVlW2ldOworCisJCS8qIElmIGFuIFJYQiBkb2Vzbid0IGhhdmUgYSBSeCBxdWV1ZSBzbG90IGFzc29jaWF0ZWQgd2l0aCBpdCwKKwkJICogdGhlbiBhIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHRoZSBxdWV1ZSByZWZpbGxpbmcKKwkJICogcm91dGluZXMgLS0gY2F0Y2ggaXQgaGVyZSAqLworCQlCVUdfT04ocnhiID09IE5VTEwpOworCisJCXJ4cS0+cXVldWVbaV0gPSBOVUxMOworCisJCXBjaV91bm1hcF9wYWdlKGlsLT5wY2lfZGV2LCByeGItPnBhZ2VfZG1hLAorCQkJICAgICAgIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCisJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcGt0ID0gcnhiX2FkZHIocnhiKTsKKworCQlsZW4gPSBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIElMX1JYX0ZSQU1FX1NJWkVfTVNLOworCQlsZW4gKz0gc2l6ZW9mKHUzMik7CS8qIGFjY291bnQgZm9yIHN0YXR1cyB3b3JkICovCisKKwkJLyogUmVjbGFpbSBhIGNvbW1hbmQgYnVmZmVyIG9ubHkgaWYgdGhpcyBwYWNrZXQgaXMgYSByZXNwb25zZQorCQkgKiAgIHRvIGEgKGRyaXZlci1vcmlnaW5hdGVkKSBjb21tYW5kLgorCQkgKiBJZiB0aGUgcGFja2V0IChlLmcuIFJ4IGZyYW1lKSBvcmlnaW5hdGVkIGZyb20gdUNvZGUsCisJCSAqICAgdGhlcmUgaXMgbm8gY29tbWFuZCBidWZmZXIgdG8gcmVjbGFpbS4KKwkJICogVWNvZGUgc2hvdWxkIHNldCBTRVFfUlhfRlJBTUUgYml0IGlmIHVjb2RlLW9yaWdpbmF0ZWQsCisJCSAqICAgYnV0IGFwcGFyZW50bHkgYSBmZXcgZG9uJ3QgZ2V0IHNldDsgY2F0Y2ggdGhlbSBoZXJlLiAqLworCQlyZWNsYWltID0gIShwa3QtPmhkci5zZXF1ZW5jZSAmIFNFUV9SWF9GUkFNRSkgJiYKKwkJICAgIChwa3QtPmhkci5jbWQgIT0gTl9SWF9QSFkpICYmIChwa3QtPmhkci5jbWQgIT0gTl9SWCkgJiYKKwkJICAgIChwa3QtPmhkci5jbWQgIT0gTl9SWF9NUERVKSAmJgorCQkgICAgKHBrdC0+aGRyLmNtZCAhPSBOX0NPTVBSRVNTRURfQkEpICYmCisJCSAgICAocGt0LT5oZHIuY21kICE9IE5fU1RBVFMpICYmIChwa3QtPmhkci5jbWQgIT0gQ19UWCk7CisKKwkJLyogQmFzZWQgb24gdHlwZSBvZiBjb21tYW5kIHJlc3BvbnNlIG9yIG5vdGlmaWNhdGlvbiwKKwkJICogICBoYW5kbGUgdGhvc2UgdGhhdCBuZWVkIGhhbmRsaW5nIHZpYSBmdW5jdGlvbiBpbgorCQkgKiAgIGhhbmRsZXJzIHRhYmxlLiAgU2VlIGlsNDk2NV9zZXR1cF9oYW5kbGVycygpICovCisJCWlmIChpbC0+aGFuZGxlcnNbcGt0LT5oZHIuY21kXSkgeworCQkJRF9SWCgiciA9ICVkLCBpID0gJWQsICVzLCAweCUwMnhcbiIsIHIsIGksCisJCQkgICAgIGlsX2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksIHBrdC0+aGRyLmNtZCk7CisJCQlpbC0+aXNyX3N0YXRzLmhhbmRsZXJzW3BrdC0+aGRyLmNtZF0rKzsKKwkJCWlsLT5oYW5kbGVyc1twa3QtPmhkci5jbWRdIChpbCwgcnhiKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIGhhbmRsaW5nIG5lZWRlZCAqLworCQkJRF9SWCgiciAlZCBpICVkIE5vIGhhbmRsZXIgbmVlZGVkIGZvciAlcywgMHglMDJ4XG4iLCByLAorCQkJICAgICBpLCBpbF9nZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpLCBwa3QtPmhkci5jbWQpOworCQl9CisKKwkJLyoKKwkJICogWFhYOiBBZnRlciBoZXJlLCB3ZSBzaG91bGQgYWx3YXlzIGNoZWNrIHJ4Yi0+cGFnZQorCQkgKiBhZ2FpbnN0IE5VTEwgYmVmb3JlIHRvdWNoaW5nIGl0IG9yIGl0cyB2aXJ0dWFsCisJCSAqIG1lbW9yeSAocGt0KS4gQmVjYXVzZSBzb21lIGhhbmRsZXIgbWlnaHQgaGF2ZQorCQkgKiBhbHJlYWR5IHRha2VuIG9yIGZyZWVkIHRoZSBwYWdlcy4KKwkJICovCisKKwkJaWYgKHJlY2xhaW0pIHsKKwkJCS8qIEludm9rZSBhbnkgY2FsbGJhY2tzLCB0cmFuc2ZlciB0aGUgYnVmZmVyIHRvIGNhbGxlciwKKwkJCSAqIGFuZCBmaXJlIG9mZiB0aGUgKHBvc3NpYmx5KSBibG9ja2luZyBpbF9zZW5kX2NtZCgpCisJCQkgKiBhcyB3ZSByZWNsYWltIHRoZSBkcml2ZXIgY29tbWFuZCBxdWV1ZSAqLworCQkJaWYgKHJ4Yi0+cGFnZSkKKwkJCQlpbF90eF9jbWRfY29tcGxldGUoaWwsIHJ4Yik7CisJCQllbHNlCisJCQkJSUxfV0FSTigiQ2xhaW0gbnVsbCByeGI/XG4iKTsKKwkJfQorCisJCS8qIFJldXNlIHRoZSBwYWdlIGlmIHBvc3NpYmxlLiBGb3Igbm90aWZpY2F0aW9uIHBhY2tldHMgYW5kCisJCSAqIFNLQnMgdGhhdCBmYWlsIHRvIFJ4IGNvcnJlY3RseSwgYWRkIHRoZW0gYmFjayBpbnRvIHRoZQorCQkgKiByeF9mcmVlIGxpc3QgZm9yIHJldXNlIGxhdGVyLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCWlmIChyeGItPnBhZ2UgIT0gTlVMTCkgeworCQkJcnhiLT5wYWdlX2RtYSA9CisJCQkgICAgcGNpX21hcF9wYWdlKGlsLT5wY2lfZGV2LCByeGItPnBhZ2UsIDAsCisJCQkJCSBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy4KKwkJCQkJIHJ4X3BhZ2Vfb3JkZXIsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOworCQkJcnhxLT5mcmVlX2NvdW50Kys7CisJCX0gZWxzZQorCQkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcnhxLT5yeF91c2VkKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlpID0gKGkgKyAxKSAmIFJYX1FVRVVFX01BU0s7CisJCS8qIElmIHRoZXJlIGFyZSBhIGxvdCBvZiB1bnVzZWQgZnJhbWVzLAorCQkgKiByZXN0b2NrIHRoZSBSeCBxdWV1ZSBzbyB1Y29kZSB3b250IGFzc2VydC4gKi8KKwkJaWYgKGZpbGxfcngpIHsKKwkJCWNvdW50Kys7CisJCQlpZiAoY291bnQgPj0gOCkgeworCQkJCXJ4cS0+cmVhZCA9IGk7CisJCQkJaWw0OTY1X3J4X3JlcGxlbmlzaF9ub3coaWwpOworCQkJCWNvdW50ID0gMDsKKwkJCX0KKwkJfQorCX0KKworCS8qIEJhY2t0cmFjayBvbmUgZW50cnkgKi8KKwlyeHEtPnJlYWQgPSBpOworCWlmIChmaWxsX3J4KQorCQlpbDQ5NjVfcnhfcmVwbGVuaXNoX25vdyhpbCk7CisJZWxzZQorCQlpbDQ5NjVfcnhfcXVldWVfcmVzdG9jayhpbCk7Cit9CisKKy8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmbHVzaCBhbnkgc2NoZWR1bGVkIHRhc2tsZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraWw0OTY1X3N5bmNocm9uaXplX2lycShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogd2FpdCB0byBtYWtlIHN1cmUgd2UgZmx1c2ggcGVuZGluZyB0YXNrbGV0ICovCisJc3luY2hyb25pemVfaXJxKGlsLT5wY2lfZGV2LT5pcnEpOworCXRhc2tsZXRfa2lsbCgmaWwtPmlycV90YXNrbGV0KTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9pcnFfdGFza2xldChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTMyIGludGEsIGhhbmRsZWQgPSAwOworCXUzMiBpbnRhX2ZoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGk7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJdTMyIGludGFfbWFzazsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyB1Q29kZSBpbnRlcnJ1cHRzLgorCSAqIE5vdGU6ICBTb21lIGJpdHMgaW4gQ1NSX0lOVCBhcmUgIk9SIiBvZiBiaXRzIGluIENTUl9GSF9JTlRfU1RBVFVTLAorCSAqICBhbmQgd2lsbCBjbGVhciBvbmx5IHdoZW4gQ1NSX0ZIX0lOVF9TVEFUVVMgZ2V0cyBjbGVhcmVkLiAqLworCWludGEgPSBfaWxfcmQoaWwsIENTUl9JTlQpOworCV9pbF93cihpbCwgQ1NSX0lOVCwgaW50YSk7CisKKwkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyBmbG93LWhhbmRsZXIgKERNQSkgaW50ZXJydXB0cy4KKwkgKiBBbnkgbmV3IGludGVycnVwdHMgdGhhdCBoYXBwZW4gYWZ0ZXIgdGhpcywgZWl0aGVyIHdoaWxlIHdlJ3JlCisJICogaW4gdGhpcyB0YXNrbGV0LCBvciBsYXRlciwgd2lsbCBzaG93IHVwIGluIG5leHQgSVNSL3Rhc2tsZXQuICovCisJaW50YV9maCA9IF9pbF9yZChpbCwgQ1NSX0ZIX0lOVF9TVEFUVVMpOworCV9pbF93cihpbCwgQ1NSX0ZIX0lOVF9TVEFUVVMsIGludGFfZmgpOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaWYgKGlsX2dldF9kZWJ1Z19sZXZlbChpbCkgJiBJTF9ETF9JU1IpIHsKKwkJLyoganVzdCBmb3IgZGVidWcgKi8KKwkJaW50YV9tYXNrID0gX2lsX3JkKGlsLCBDU1JfSU5UX01BU0spOworCQlEX0lTUigiaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHhcbiIsIGludGEsCisJCSAgICAgIGludGFfbWFzaywgaW50YV9maCk7CisJfQorI2VuZGlmCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogU2luY2UgQ1NSX0lOVCBhbmQgQ1NSX0ZIX0lOVF9TVEFUVVMgcmVhZHMgYW5kIGNsZWFycyBhcmUgbm90CisJICogYXRvbWljLCBtYWtlIHN1cmUgdGhhdCBpbnRhIGNvdmVycyBhbGwgdGhlIGludGVycnVwdHMgdGhhdAorCSAqIHdlJ3ZlIGRpc2NvdmVyZWQsIGV2ZW4gaWYgRkggaW50ZXJydXB0IGNhbWUgaW4ganVzdCBhZnRlcgorCSAqIHJlYWRpbmcgQ1NSX0lOVC4gKi8KKwlpZiAoaW50YV9maCAmIENTUjQ5X0ZIX0lOVF9SWF9NQVNLKQorCQlpbnRhIHw9IENTUl9JTlRfQklUX0ZIX1JYOworCWlmIChpbnRhX2ZoICYgQ1NSNDlfRkhfSU5UX1RYX01BU0spCisJCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7CisKKwkvKiBOb3cgc2VydmljZSBhbGwgaW50ZXJydXB0IGJpdHMgZGlzY292ZXJlZCBhYm92ZS4gKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX0hXX0VSUikgeworCQlJTF9FUlIoIkhhcmR3YXJlIGVycm9yIGRldGVjdGVkLiAgUmVzdGFydGluZy5cbiIpOworCisJCS8qIFRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLworCQlpbF9kaXNhYmxlX2ludGVycnVwdHMoaWwpOworCisJCWlsLT5pc3Jfc3RhdHMuaHcrKzsKKwkJaWxfaXJxX2hhbmRsZV9lcnJvcihpbCk7CisKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9IV19FUlI7CisKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIChJTF9ETF9JU1IpKSB7CisJCS8qIE5JQyBmaXJlcyB0aGlzLCBidXQgd2UgZG9uJ3QgdXNlIGl0LCByZWR1bmRhbnQgd2l0aCBXQUtFVVAgKi8KKwkJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9TQ0QpIHsKKwkJCURfSVNSKCJTY2hlZHVsZXIgZmluaXNoZWQgdG8gdHJhbnNtaXQgIgorCQkJICAgICAgInRoZSBmcmFtZS9mcmFtZXMuXG4iKTsKKwkJCWlsLT5pc3Jfc3RhdHMuc2NoKys7CisJCX0KKworCQkvKiBBbGl2ZSBub3RpZmljYXRpb24gdmlhIFJ4IGludGVycnVwdCB3aWxsIGRvIHRoZSByZWFsIHdvcmsgKi8KKwkJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9BTElWRSkgeworCQkJRF9JU1IoIkFsaXZlIGludGVycnVwdFxuIik7CisJCQlpbC0+aXNyX3N0YXRzLmFsaXZlKys7CisJCX0KKwl9CisjZW5kaWYKKwkvKiBTYWZlbHkgaWdub3JlIHRoZXNlIGJpdHMgZm9yIGRlYnVnIGNoZWNrcyBiZWxvdyAqLworCWludGEgJj0gfihDU1JfSU5UX0JJVF9TQ0QgfCBDU1JfSU5UX0JJVF9BTElWRSk7CisKKwkvKiBIVyBSRiBLSUxMIHN3aXRjaCB0b2dnbGVkICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9SRl9LSUxMKSB7CisJCWludCBod19yZl9raWxsID0gMDsKKwkJaWYgKCEKKwkJICAgIChfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJgorCQkgICAgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKSkKKwkJCWh3X3JmX2tpbGwgPSAxOworCisJCUlMX1dBUk4oIlJGX0tJTEwgYml0IHRvZ2dsZWQgdG8gJXMuXG4iLAorCQkJaHdfcmZfa2lsbCA/ICJkaXNhYmxlIHJhZGlvIiA6ICJlbmFibGUgcmFkaW8iKTsKKworCQlpbC0+aXNyX3N0YXRzLnJma2lsbCsrOworCisJCS8qIGRyaXZlciBvbmx5IGxvYWRzIHVjb2RlIG9uY2Ugc2V0dGluZyB0aGUgaW50ZXJmYWNlIHVwLgorCQkgKiB0aGUgZHJpdmVyIGFsbG93cyBsb2FkaW5nIHRoZSB1Y29kZSBldmVuIGlmIHRoZSByYWRpbworCQkgKiBpcyBraWxsZWQuIEhlbmNlIHVwZGF0ZSB0aGUga2lsbHN3aXRjaCBzdGF0ZSBoZXJlLiBUaGUKKwkJICogcmZraWxsIGhhbmRsZXIgd2lsbCBjYXJlIGFib3V0IHJlc3RhcnRpbmcgaWYgbmVlZGVkLgorCQkgKi8KKwkJaWYgKCF0ZXN0X2JpdChTX0FMSVZFLCAmaWwtPnN0YXR1cykpIHsKKwkJCWlmIChod19yZl9raWxsKQorCQkJCXNldF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJCQllbHNlCisJCQkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCQkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShpbC0+aHctPndpcGh5LCBod19yZl9raWxsKTsKKwkJfQorCisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfUkZfS0lMTDsKKwl9CisKKwkvKiBDaGlwIGdvdCB0b28gaG90IGFuZCBzdG9wcGVkIGl0c2VsZiAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQ1RfS0lMTCkgeworCQlJTF9FUlIoIk1pY3JvY29kZSBDVCBraWxsIGVycm9yIGRldGVjdGVkLlxuIik7CisJCWlsLT5pc3Jfc3RhdHMuY3RraWxsKys7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfQ1RfS0lMTDsKKwl9CisKKwkvKiBFcnJvciBkZXRlY3RlZCBieSB1Q29kZSAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU1dfRVJSKSB7CisJCUlMX0VSUigiTWljcm9jb2RlIFNXIGVycm9yIGRldGVjdGVkLiAiICIgUmVzdGFydGluZyAweCVYLlxuIiwKKwkJICAgICAgIGludGEpOworCQlpbC0+aXNyX3N0YXRzLnN3Kys7CisJCWlsX2lycV9oYW5kbGVfZXJyb3IoaWwpOworCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1NXX0VSUjsKKwl9CisKKwkvKgorCSAqIHVDb2RlIHdha2VzIHVwIGFmdGVyIHBvd2VyLWRvd24gc2xlZXAuCisJICogVGVsbCBkZXZpY2UgYWJvdXQgYW55IG5ldyB0eCBvciBob3N0IGNvbW1hbmRzIGVucXVldWVkLAorCSAqIGFuZCBhYm91dCBhbnkgUnggYnVmZmVycyBtYWRlIGF2YWlsYWJsZSB3aGlsZSBhc2xlZXAuCisJICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9XQUtFVVApIHsKKwkJRF9JU1IoIldha2V1cCBpbnRlcnJ1cHRcbiIpOworCQlpbF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnJ4cSk7CisJCWZvciAoaSA9IDA7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBpKyspCisJCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgJmlsLT50eHFbaV0pOworCQlpbC0+aXNyX3N0YXRzLndha2V1cCsrOworCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1dBS0VVUDsKKwl9CisKKwkvKiBBbGwgdUNvZGUgY29tbWFuZCByZXNwb25zZXMsIGluY2x1ZGluZyBUeCBjb21tYW5kIHJlc3BvbnNlcywKKwkgKiBSeCAicmVzcG9uc2VzIiAoZnJhbWUtcmVjZWl2ZWQgbm90aWZpY2F0aW9uKSwgYW5kIG90aGVyCisJICogbm90aWZpY2F0aW9ucyBmcm9tIHVDb2RlIGNvbWUgdGhyb3VnaCBoZXJlKi8KKwlpZiAoaW50YSAmIChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKSkgeworCQlpbDQ5NjVfcnhfaGFuZGxlKGlsKTsKKwkJaWwtPmlzcl9zdGF0cy5yeCsrOworCQloYW5kbGVkIHw9IChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKTsKKwl9CisKKwkvKiBUaGlzICJUeCIgRE1BIGNoYW5uZWwgaXMgdXNlZCBvbmx5IGZvciBsb2FkaW5nIHVDb2RlICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9GSF9UWCkgeworCQlEX0lTUigidUNvZGUgbG9hZCBpbnRlcnJ1cHRcbiIpOworCQlpbC0+aXNyX3N0YXRzLnR4Kys7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7CisJCS8qIFdha2UgdXAgdUNvZGUgbG9hZCByb3V0aW5lLCBub3cgdGhhdCBsb2FkIGlzIGNvbXBsZXRlICovCisJCWlsLT51Y29kZV93cml0ZV9jb21wbGV0ZSA9IDE7CisJCXdha2VfdXAoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCX0KKworCWlmIChpbnRhICYgfmhhbmRsZWQpIHsKKwkJSUxfRVJSKCJVbmhhbmRsZWQgSU5UQSBiaXRzIDB4JTA4eFxuIiwgaW50YSAmIH5oYW5kbGVkKTsKKwkJaWwtPmlzcl9zdGF0cy51bmhhbmRsZWQrKzsKKwl9CisKKwlpZiAoaW50YSAmIH4oaWwtPmludGFfbWFzaykpIHsKKwkJSUxfV0FSTigiRGlzYWJsZWQgSU5UQSBiaXRzIDB4JTA4eCB3ZXJlIHBlbmRpbmdcbiIsCisJCQlpbnRhICYgfmlsLT5pbnRhX21hc2spOworCQlJTF9XQVJOKCIgICB3aXRoIEZINDlfSU5UID0gMHglMDh4XG4iLCBpbnRhX2ZoKTsKKwl9CisKKwkvKiBSZS1lbmFibGUgYWxsIGludGVycnVwdHMgKi8KKwkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEgKi8KKwlpZiAodGVzdF9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpKQorCQlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisJLyogUmUtZW5hYmxlIFJGX0tJTEwgaWYgaXQgb2NjdXJyZWQgKi8KKwllbHNlIGlmIChoYW5kbGVkICYgQ1NSX0lOVF9CSVRfUkZfS0lMTCkKKwkJaWxfZW5hYmxlX3Jma2lsbF9pbnQoaWwpOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaWYgKGlsX2dldF9kZWJ1Z19sZXZlbChpbCkgJiAoSUxfRExfSVNSKSkgeworCQlpbnRhID0gX2lsX3JkKGlsLCBDU1JfSU5UKTsKKwkJaW50YV9tYXNrID0gX2lsX3JkKGlsLCBDU1JfSU5UX01BU0spOworCQlpbnRhX2ZoID0gX2lsX3JkKGlsLCBDU1JfRkhfSU5UX1NUQVRVUyk7CisJCURfSVNSKCJFbmQgaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHgsICIKKwkJICAgICAgImZsYWdzIDB4JTA4bHhcbiIsIGludGEsIGludGFfbWFzaywgaW50YV9maCwgZmxhZ3MpOworCX0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzeXNmcyBhdHRyaWJ1dGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFkZHMgYSBuZXcgYXR0cmlidXRlIHRvIHRoZSBzeXNmcyByZXByZXNlbnRhdGlvbgorICogb2YgdGhpcyBkZXZpY2UgZHJpdmVyIChpLmUuIGEgbmV3IGZpbGUgaW4gL3N5cy9jbGFzcy9uZXQvd2xhbjAvZGV2aWNlLykKKyAqIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBkZWJ1ZyBsZXZlbC4KKyAqCisgKiBTZWUgdGhlIGxldmVsIGRlZmluaXRpb25zIGluIGl3bCBmb3IgZGV0YWlscy4KKyAqCisgKiBUaGUgZGVidWdfbGV2ZWwgYmVpbmcgbWFuYWdlZCB1c2luZyBzeXNmcyBiZWxvdyBpcyBhIHBlciBkZXZpY2UgZGVidWcKKyAqIGxldmVsIHRoYXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgZGVidWcgbGV2ZWwgaWYgaXQgKHRoZSBwZXIKKyAqIGRldmljZSBkZWJ1ZyBsZXZlbCkgaXMgc2V0LgorICovCitzdGF0aWMgc3NpemVfdAoraWw0OTY1X3Nob3dfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4WFxuIiwgaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfc3RvcmVfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCUlMX0VSUigiJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOworCWVsc2UgeworCQlpbC0+ZGVidWdfbGV2ZWwgPSB2YWw7CisJCWlmIChpbF9hbGxvY190cmFmZmljX21lbShpbCkpCisJCQlJTF9FUlIoIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGdlbmVyYXRlIHRyYWZmaWMgbG9nXG4iKTsKKwl9CisJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWJ1Z19sZXZlbCwgU19JV1VTUiB8IFNfSVJVR08sIGlsNDk2NV9zaG93X2RlYnVnX2xldmVsLAorCQkgICBpbDQ5NjVfc3RvcmVfZGVidWdfbGV2ZWwpOworCisjZW5kaWYgLyogQ09ORklHX0lXTEVHQUNZX0RFQlVHICovCisKK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfc2hvd190ZW1wZXJhdHVyZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaWwtPnRlbXBlcmF0dXJlKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRlbXBlcmF0dXJlLCBTX0lSVUdPLCBpbDQ5NjVfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfc2hvd190eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJvZmZcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGlsLT50eF9wb3dlcl91c2VyX2xtdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfc3RvcmVfdHhfcG93ZXIoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJSUxfSU5GTygiJXMgaXMgbm90IGluIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CisJZWxzZSB7CisJCXJldCA9IGlsX3NldF90eF9wb3dlcihpbCwgdmFsLCBmYWxzZSk7CisJCWlmIChyZXQpCisJCQlJTF9FUlIoImZhaWxlZCBzZXR0aW5nIHR4IHBvd2VyICgweCVkKS5cbiIsIHJldCk7CisJCWVsc2UKKwkJCXJldCA9IGNvdW50OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodHhfcG93ZXIsIFNfSVdVU1IgfCBTX0lSVUdPLCBpbDQ5NjVfc2hvd190eF9wb3dlciwKKwkJICAgaWw0OTY1X3N0b3JlX3R4X3Bvd2VyKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlsX3N5c2ZzX2VudHJpZXNbXSA9IHsKKwkmZGV2X2F0dHJfdGVtcGVyYXR1cmUuYXR0ciwKKwkmZGV2X2F0dHJfdHhfcG93ZXIuYXR0ciwKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwkmZGV2X2F0dHJfZGVidWdfbGV2ZWwuYXR0ciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlsX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkubmFtZSA9IE5VTEwsCQkvKiBwdXQgaW4gZGV2aWNlIGRpcmVjdG9yeSAqLworCS5hdHRycyA9IGlsX3N5c2ZzX2VudHJpZXMsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdUNvZGUgZG93bmxvYWQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2lsNDk2NV9kZWFsbG9jX3Vjb2RlX3BjaShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2NvZGUpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9kYXRhKTsKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfZGF0YV9iYWNrdXApOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9pbml0KTsKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfaW5pdF9kYXRhKTsKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfYm9vdCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfbmljX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBSZW1vdmUgYWxsIHJlc2V0cyB0byBhbGxvdyBOSUMgdG8gb3BlcmF0ZSAqLworCV9pbF93cihpbCwgQ1NSX1JFU0VULCAwKTsKK30KKworc3RhdGljIHZvaWQgaWw0OTY1X3Vjb2RlX2NhbGxiYWNrKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWNvZGVfcmF3LAorCQkJCSAgdm9pZCAqY29udGV4dCk7CitzdGF0aWMgaW50IGlsNDk2NV9tYWNfc2V0dXBfcmVnaXN0ZXIoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgbWF4X3Byb2JlX2xlbmd0aCk7CisKK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrCitpbDQ5NjVfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgZmlyc3QpCit7CisJY29uc3QgY2hhciAqbmFtZV9wcmUgPSBpbC0+Y2ZnLT5md19uYW1lX3ByZTsKKwljaGFyIHRhZ1s4XTsKKworCWlmIChmaXJzdCkgeworCQlpbC0+ZndfaWR4ID0gaWwtPmNmZy0+dWNvZGVfYXBpX21heDsKKwkJc3ByaW50Zih0YWcsICIlZCIsIGlsLT5md19pZHgpOworCX0gZWxzZSB7CisJCWlsLT5md19pZHgtLTsKKwkJc3ByaW50Zih0YWcsICIlZCIsIGlsLT5md19pZHgpOworCX0KKworCWlmIChpbC0+ZndfaWR4IDwgaWwtPmNmZy0+dWNvZGVfYXBpX21pbikgeworCQlJTF9FUlIoIm5vIHN1aXRhYmxlIGZpcm13YXJlIGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXNwcmludGYoaWwtPmZpcm13YXJlX25hbWUsICIlcyVzJXMiLCBuYW1lX3ByZSwgdGFnLCAiLnVjb2RlIik7CisKKwlEX0lORk8oImF0dGVtcHRpbmcgdG8gbG9hZCBmaXJtd2FyZSAnJXMnXG4iLCBpbC0+ZmlybXdhcmVfbmFtZSk7CisKKwlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIDEsIGlsLT5maXJtd2FyZV9uYW1lLAorCQkJCSAgICAgICAmaWwtPnBjaV9kZXYtPmRldiwgR0ZQX0tFUk5FTCwgaWwsCisJCQkJICAgICAgIGlsNDk2NV91Y29kZV9jYWxsYmFjayk7Cit9CisKK3N0cnVjdCBpbDQ5NjVfZmlybXdhcmVfcGllY2VzIHsKKwljb25zdCB2b2lkICppbnN0LCAqZGF0YSwgKmluaXQsICppbml0X2RhdGEsICpib290OworCXNpemVfdCBpbnN0X3NpemUsIGRhdGFfc2l6ZSwgaW5pdF9zaXplLCBpbml0X2RhdGFfc2l6ZSwgYm9vdF9zaXplOworfTsKKworc3RhdGljIGludAoraWw0OTY1X2xvYWRfZmlybXdhcmUoc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3JhdywKKwkJICAgICBzdHJ1Y3QgaWw0OTY1X2Zpcm13YXJlX3BpZWNlcyAqcGllY2VzKQoreworCXN0cnVjdCBpbF91Y29kZV9oZWFkZXIgKnVjb2RlID0gKHZvaWQgKil1Y29kZV9yYXctPmRhdGE7CisJdTMyIGFwaV92ZXIsIGhkcl9zaXplOworCWNvbnN0IHU4ICpzcmM7CisKKwlpbC0+dWNvZGVfdmVyID0gbGUzMl90b19jcHUodWNvZGUtPnZlcik7CisJYXBpX3ZlciA9IElMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKTsKKworCXN3aXRjaCAoYXBpX3ZlcikgeworCWRlZmF1bHQ6CisJY2FzZSAwOgorCWNhc2UgMToKKwljYXNlIDI6CisJCWhkcl9zaXplID0gMjQ7CisJCWlmICh1Y29kZV9yYXctPnNpemUgPCBoZHJfc2l6ZSkgeworCQkJSUxfRVJSKCJGaWxlIHNpemUgdG9vIHNtYWxsIVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwaWVjZXMtPmluc3Rfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5pbnN0X3NpemUpOworCQlwaWVjZXMtPmRhdGFfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5kYXRhX3NpemUpOworCQlwaWVjZXMtPmluaXRfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5pbml0X3NpemUpOworCQlwaWVjZXMtPmluaXRfZGF0YV9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmluaXRfZGF0YV9zaXplKTsKKwkJcGllY2VzLT5ib290X3NpemUgPSBsZTMyX3RvX2NwdSh1Y29kZS0+djEuYm9vdF9zaXplKTsKKwkJc3JjID0gdWNvZGUtPnYxLmRhdGE7CisJCWJyZWFrOworCX0KKworCS8qIFZlcmlmeSBzaXplIG9mIGZpbGUgdnMuIGltYWdlIHNpemUgaW5mbyBpbiBmaWxlJ3MgaGVhZGVyICovCisJaWYgKHVjb2RlX3Jhdy0+c2l6ZSAhPQorCSAgICBoZHJfc2l6ZSArIHBpZWNlcy0+aW5zdF9zaXplICsgcGllY2VzLT5kYXRhX3NpemUgKworCSAgICBwaWVjZXMtPmluaXRfc2l6ZSArIHBpZWNlcy0+aW5pdF9kYXRhX3NpemUgKyBwaWVjZXMtPmJvb3Rfc2l6ZSkgeworCisJCUlMX0VSUigidUNvZGUgZmlsZSBzaXplICVkIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHNpemVcbiIsCisJCSAgICAgICAoaW50KXVjb2RlX3Jhdy0+c2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBpZWNlcy0+aW5zdCA9IHNyYzsKKwlzcmMgKz0gcGllY2VzLT5pbnN0X3NpemU7CisJcGllY2VzLT5kYXRhID0gc3JjOworCXNyYyArPSBwaWVjZXMtPmRhdGFfc2l6ZTsKKwlwaWVjZXMtPmluaXQgPSBzcmM7CisJc3JjICs9IHBpZWNlcy0+aW5pdF9zaXplOworCXBpZWNlcy0+aW5pdF9kYXRhID0gc3JjOworCXNyYyArPSBwaWVjZXMtPmluaXRfZGF0YV9zaXplOworCXBpZWNlcy0+Ym9vdCA9IHNyYzsKKwlzcmMgKz0gcGllY2VzLT5ib290X3NpemU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfdWNvZGVfY2FsbGJhY2sgLSBjYWxsYmFjayB3aGVuIGZpcm13YXJlIHdhcyBsb2FkZWQKKyAqCisgKiBJZiBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCBjb3BpZXMgdGhlIGZpcm13YXJlIGludG8gYnVmZmVycworICogZm9yIHRoZSBjYXJkIHRvIGZldGNoICh2aWEgRE1BKS4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV91Y29kZV9jYWxsYmFjayhjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3Jhdywgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250ZXh0OworCXN0cnVjdCBpbF91Y29kZV9oZWFkZXIgKnVjb2RlOworCWludCBlcnI7CisJc3RydWN0IGlsNDk2NV9maXJtd2FyZV9waWVjZXMgcGllY2VzOworCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWF4ID0gaWwtPmNmZy0+dWNvZGVfYXBpX21heDsKKwljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21pbiA9IGlsLT5jZmctPnVjb2RlX2FwaV9taW47CisJdTMyIGFwaV92ZXI7CisKKwl1MzIgbWF4X3Byb2JlX2xlbmd0aCA9IDIwMDsKKwl1MzIgc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemUgPQorCSAgICBJTF9ERUZBVUxUX1NUQU5EQVJEX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkU7CisKKwltZW1zZXQoJnBpZWNlcywgMCwgc2l6ZW9mKHBpZWNlcykpOworCisJaWYgKCF1Y29kZV9yYXcpIHsKKwkJaWYgKGlsLT5md19pZHggPD0gaWwtPmNmZy0+dWNvZGVfYXBpX21heCkKKwkJCUlMX0VSUigicmVxdWVzdCBmb3IgZmlybXdhcmUgZmlsZSAnJXMnIGZhaWxlZC5cbiIsCisJCQkgICAgICAgaWwtPmZpcm13YXJlX25hbWUpOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwlEX0lORk8oIkxvYWRlZCBmaXJtd2FyZSBmaWxlICclcycgKCV6ZCBieXRlcykuXG4iLCBpbC0+ZmlybXdhcmVfbmFtZSwKKwkgICAgICAgdWNvZGVfcmF3LT5zaXplKTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGdvdCBhdCBsZWFzdCB0aGUgQVBJIHZlcnNpb24gbnVtYmVyICovCisJaWYgKHVjb2RlX3Jhdy0+c2l6ZSA8IDQpIHsKKwkJSUxfRVJSKCJGaWxlIHNpemUgd2F5IHRvbyBzbWFsbCFcbiIpOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwkvKiBEYXRhIGZyb20gdWNvZGUgZmlsZTogIGhlYWRlciBmb2xsb3dlZCBieSB1Q29kZSBpbWFnZXMgKi8KKwl1Y29kZSA9IChzdHJ1Y3QgaWxfdWNvZGVfaGVhZGVyICopdWNvZGVfcmF3LT5kYXRhOworCisJZXJyID0gaWw0OTY1X2xvYWRfZmlybXdhcmUoaWwsIHVjb2RlX3JhdywgJnBpZWNlcyk7CisKKwlpZiAoZXJyKQorCQlnb3RvIHRyeV9hZ2FpbjsKKworCWFwaV92ZXIgPSBJTF9VQ09ERV9BUEkoaWwtPnVjb2RlX3Zlcik7CisKKwkvKgorCSAqIGFwaV92ZXIgc2hvdWxkIG1hdGNoIHRoZSBhcGkgdmVyc2lvbiBmb3JtaW5nIHBhcnQgb2YgdGhlCisJICogZmlybXdhcmUgZmlsZW5hbWUgLi4uIGJ1dCB3ZSBkb24ndCBjaGVjayBmb3IgdGhhdCBhbmQgb25seSByZWx5CisJICogb24gdGhlIEFQSSB2ZXJzaW9uIHJlYWQgZnJvbSBmaXJtd2FyZSBoZWFkZXIgZnJvbSBoZXJlIG9uIGZvcndhcmQKKwkgKi8KKwlpZiAoYXBpX3ZlciA8IGFwaV9taW4gfHwgYXBpX3ZlciA+IGFwaV9tYXgpIHsKKwkJSUxfRVJSKCJEcml2ZXIgdW5hYmxlIHRvIHN1cHBvcnQgeW91ciBmaXJtd2FyZSBBUEkuICIKKwkJICAgICAgICJEcml2ZXIgc3VwcG9ydHMgdiV1LCBmaXJtd2FyZSBpcyB2JXUuXG4iLCBhcGlfbWF4LAorCQkgICAgICAgYXBpX3Zlcik7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCWlmIChhcGlfdmVyICE9IGFwaV9tYXgpCisJCUlMX0VSUigiRmlybXdhcmUgaGFzIG9sZCBBUEkgdmVyc2lvbi4gRXhwZWN0ZWQgdiV1LCAiCisJCSAgICAgICAiZ290IHYldS4gTmV3IGZpcm13YXJlIGNhbiBiZSBvYnRhaW5lZCAiCisJCSAgICAgICAiZnJvbSBodHRwOi8vd3d3LmludGVsbGludXh3aXJlbGVzcy5vcmcuXG4iLCBhcGlfbWF4LAorCQkgICAgICAgYXBpX3Zlcik7CisKKwlJTF9JTkZPKCJsb2FkZWQgZmlybXdhcmUgdmVyc2lvbiAldS4ldS4ldS4ldVxuIiwKKwkJSUxfVUNPREVfTUFKT1IoaWwtPnVjb2RlX3ZlciksIElMX1VDT0RFX01JTk9SKGlsLT51Y29kZV92ZXIpLAorCQlJTF9VQ09ERV9BUEkoaWwtPnVjb2RlX3ZlciksIElMX1VDT0RFX1NFUklBTChpbC0+dWNvZGVfdmVyKSk7CisKKwlzbnByaW50ZihpbC0+aHctPndpcGh5LT5md192ZXJzaW9uLCBzaXplb2YoaWwtPmh3LT53aXBoeS0+ZndfdmVyc2lvbiksCisJCSAiJXUuJXUuJXUuJXUiLCBJTF9VQ09ERV9NQUpPUihpbC0+dWNvZGVfdmVyKSwKKwkJIElMX1VDT0RFX01JTk9SKGlsLT51Y29kZV92ZXIpLCBJTF9VQ09ERV9BUEkoaWwtPnVjb2RlX3ZlciksCisJCSBJTF9VQ09ERV9TRVJJQUwoaWwtPnVjb2RlX3ZlcikpOworCisJLyoKKwkgKiBGb3IgYW55IG9mIHRoZSBmYWlsdXJlcyBiZWxvdyAoYmVmb3JlIGFsbG9jYXRpbmcgcGNpIG1lbW9yeSkKKwkgKiB3ZSB3aWxsIHRyeSB0byBsb2FkIGEgdmVyc2lvbiB3aXRoIGEgc21hbGxlciBBUEkgLS0gbWF5YmUgdGhlCisJICogdXNlciBqdXN0IGdvdCBhIGNvcnJ1cHRlZCB2ZXJzaW9uIG9mIHRoZSBsYXRlc3QgQVBJLgorCSAqLworCisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgdWNvZGUgdmVyc2lvbiByYXcgPSAweCV4XG4iLCBpbC0+dWNvZGVfdmVyKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGluc3Qgc2l6ZSA9ICVaZFxuIiwgcGllY2VzLmluc3Rfc2l6ZSk7CisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgcnVudGltZSBkYXRhIHNpemUgPSAlWmRcbiIsIHBpZWNlcy5kYXRhX3NpemUpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIGluaXQgaW5zdCBzaXplID0gJVpkXG4iLCBwaWVjZXMuaW5pdF9zaXplKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBpbml0IGRhdGEgc2l6ZSA9ICVaZFxuIiwgcGllY2VzLmluaXRfZGF0YV9zaXplKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBib290IGluc3Qgc2l6ZSA9ICVaZFxuIiwgcGllY2VzLmJvb3Rfc2l6ZSk7CisKKwkvKiBWZXJpZnkgdGhhdCB1Q29kZSBpbWFnZXMgd2lsbCBmaXQgaW4gY2FyZCdzIFNSQU0gKi8KKwlpZiAocGllY2VzLmluc3Rfc2l6ZSA+IGlsLT5od19wYXJhbXMubWF4X2luc3Rfc2l6ZSkgeworCQlJTF9FUlIoInVDb2RlIGluc3RyIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIHBpZWNlcy5pbnN0X3NpemUpOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwlpZiAocGllY2VzLmRhdGFfc2l6ZSA+IGlsLT5od19wYXJhbXMubWF4X2RhdGFfc2l6ZSkgeworCQlJTF9FUlIoInVDb2RlIGRhdGEgbGVuICVaZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAorCQkgICAgICAgcGllY2VzLmRhdGFfc2l6ZSk7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCWlmIChwaWVjZXMuaW5pdF9zaXplID4gaWwtPmh3X3BhcmFtcy5tYXhfaW5zdF9zaXplKSB7CisJCUlMX0VSUigidUNvZGUgaW5pdCBpbnN0ciBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCisJCSAgICAgICBwaWVjZXMuaW5pdF9zaXplKTsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCisJaWYgKHBpZWNlcy5pbml0X2RhdGFfc2l6ZSA+IGlsLT5od19wYXJhbXMubWF4X2RhdGFfc2l6ZSkgeworCQlJTF9FUlIoInVDb2RlIGluaXQgZGF0YSBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCisJCSAgICAgICBwaWVjZXMuaW5pdF9kYXRhX3NpemUpOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwlpZiAocGllY2VzLmJvb3Rfc2l6ZSA+IGlsLT5od19wYXJhbXMubWF4X2JzbV9zaXplKSB7CisJCUlMX0VSUigidUNvZGUgYm9vdCBpbnN0ciBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCisJCSAgICAgICBwaWVjZXMuYm9vdF9zaXplKTsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCisJLyogQWxsb2NhdGUgdWNvZGUgYnVmZmVycyBmb3IgY2FyZCdzIGJ1cy1tYXN0ZXIgbG9hZGluZyAuLi4gKi8KKworCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIGFuZCAyIGNvcGllcyBvZiBkYXRhOgorCSAqIDEpIHVubW9kaWZpZWQgZnJvbSBkaXNrCisJICogMikgYmFja3VwIGNhY2hlIGZvciBzYXZlL3Jlc3RvcmUgZHVyaW5nIHBvd2VyLWRvd25zICovCisJaWwtPnVjb2RlX2NvZGUubGVuID0gcGllY2VzLmluc3Rfc2l6ZTsKKwlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2NvZGUpOworCisJaWwtPnVjb2RlX2RhdGEubGVuID0gcGllY2VzLmRhdGFfc2l6ZTsKKwlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2RhdGEpOworCisJaWwtPnVjb2RlX2RhdGFfYmFja3VwLmxlbiA9IHBpZWNlcy5kYXRhX3NpemU7CisJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9kYXRhX2JhY2t1cCk7CisKKwlpZiAoIWlsLT51Y29kZV9jb2RlLnZfYWRkciB8fCAhaWwtPnVjb2RlX2RhdGEudl9hZGRyIHx8CisJICAgICFpbC0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyKQorCQlnb3RvIGVycl9wY2lfYWxsb2M7CisKKwkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgKi8KKwlpZiAocGllY2VzLmluaXRfc2l6ZSAmJiBwaWVjZXMuaW5pdF9kYXRhX3NpemUpIHsKKwkJaWwtPnVjb2RlX2luaXQubGVuID0gcGllY2VzLmluaXRfc2l6ZTsKKwkJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9pbml0KTsKKworCQlpbC0+dWNvZGVfaW5pdF9kYXRhLmxlbiA9IHBpZWNlcy5pbml0X2RhdGFfc2l6ZTsKKwkJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9pbml0X2RhdGEpOworCisJCWlmICghaWwtPnVjb2RlX2luaXQudl9hZGRyIHx8ICFpbC0+dWNvZGVfaW5pdF9kYXRhLnZfYWRkcikKKwkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKKwl9CisKKwkvKiBCb290c3RyYXAgKGluc3RydWN0aW9ucyBvbmx5LCBubyBkYXRhKSAqLworCWlmIChwaWVjZXMuYm9vdF9zaXplKSB7CisJCWlsLT51Y29kZV9ib290LmxlbiA9IHBpZWNlcy5ib290X3NpemU7CisJCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfYm9vdCk7CisKKwkJaWYgKCFpbC0+dWNvZGVfYm9vdC52X2FkZHIpCisJCQlnb3RvIGVycl9wY2lfYWxsb2M7CisJfQorCisJLyogTm93IHRoYXQgd2UgY2FuIG5vIGxvbmdlciBmYWlsLCBjb3B5IGluZm9ybWF0aW9uICovCisKKwlpbC0+c3RhX2tleV9tYXhfbnVtID0gU1RBX0tFWV9NQVhfTlVNOworCisJLyogQ29weSBpbWFnZXMgaW50byBidWZmZXJzIGZvciBjYXJkJ3MgYnVzLW1hc3RlciByZWFkcyAuLi4gKi8KKworCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIChmaXJzdCBibG9jayBvZiBkYXRhIGluIGZpbGUpICovCisJRF9JTkZPKCJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGluc3RyIGxlbiAlWmRcbiIsCisJICAgICAgIHBpZWNlcy5pbnN0X3NpemUpOworCW1lbWNweShpbC0+dWNvZGVfY29kZS52X2FkZHIsIHBpZWNlcy5pbnN0LCBwaWVjZXMuaW5zdF9zaXplKTsKKworCURfSU5GTygidUNvZGUgaW5zdHIgYnVmIHZhZGRyID0gMHglcCwgcGFkZHIgPSAweCUwOHhcbiIsCisJICAgICAgIGlsLT51Y29kZV9jb2RlLnZfYWRkciwgKHUzMikgaWwtPnVjb2RlX2NvZGUucF9hZGRyKTsKKworCS8qCisJICogUnVudGltZSBkYXRhCisJICogTk9URTogIENvcHkgaW50byBiYWNrdXAgYnVmZmVyIHdpbGwgYmUgZG9uZSBpbiBpbF91cCgpCisJICovCisJRF9JTkZPKCJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGRhdGEgbGVuICVaZFxuIiwKKwkgICAgICAgcGllY2VzLmRhdGFfc2l6ZSk7CisJbWVtY3B5KGlsLT51Y29kZV9kYXRhLnZfYWRkciwgcGllY2VzLmRhdGEsIHBpZWNlcy5kYXRhX3NpemUpOworCW1lbWNweShpbC0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyLCBwaWVjZXMuZGF0YSwgcGllY2VzLmRhdGFfc2l6ZSk7CisKKwkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgKi8KKwlpZiAocGllY2VzLmluaXRfc2l6ZSkgeworCQlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBpbnN0ciBsZW4gJVpkXG4iLAorCQkgICAgICAgcGllY2VzLmluaXRfc2l6ZSk7CisJCW1lbWNweShpbC0+dWNvZGVfaW5pdC52X2FkZHIsIHBpZWNlcy5pbml0LCBwaWVjZXMuaW5pdF9zaXplKTsKKwl9CisKKwkvKiBJbml0aWFsaXphdGlvbiBkYXRhICovCisJaWYgKHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkgeworCQlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBkYXRhIGxlbiAlWmRcbiIsCisJCSAgICAgICBwaWVjZXMuaW5pdF9kYXRhX3NpemUpOworCQltZW1jcHkoaWwtPnVjb2RlX2luaXRfZGF0YS52X2FkZHIsIHBpZWNlcy5pbml0X2RhdGEsCisJCSAgICAgICBwaWVjZXMuaW5pdF9kYXRhX3NpemUpOworCX0KKworCS8qIEJvb3RzdHJhcCBpbnN0cnVjdGlvbnMgKi8KKwlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgYm9vdCBpbnN0ciBsZW4gJVpkXG4iLAorCSAgICAgICBwaWVjZXMuYm9vdF9zaXplKTsKKwltZW1jcHkoaWwtPnVjb2RlX2Jvb3Qudl9hZGRyLCBwaWVjZXMuYm9vdCwgcGllY2VzLmJvb3Rfc2l6ZSk7CisKKwkvKgorCSAqIGZpZ3VyZSBvdXQgdGhlIG9mZnNldCBvZiBjaGFpbiBub2lzZSByZXNldCBhbmQgZ2FpbiBjb21tYW5kcworCSAqIGJhc2Ugb24gdGhlIHNpemUgb2Ygc3RhbmRhcmQgcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzIHRhYmxlIHNpemUKKwkgKi8KKwlpbC0+XzQ5NjUucGh5X2NhbGliX2NoYWluX25vaXNlX3Jlc2V0X2NtZCA9CisJICAgIHN0YW5kYXJkX3BoeV9jYWxpYnJhdGlvbl9zaXplOworCWlsLT5fNDk2NS5waHlfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQgPQorCSAgICBzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZSArIDE7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBUaGlzIGlzIHN0aWxsIHBhcnQgb2YgcHJvYmUoKSBpbiBhIHNlbnNlLi4uCisJICoKKwkgKiA5LiBTZXR1cCBhbmQgcmVnaXN0ZXIgd2l0aCBtYWM4MDIxMSBhbmQgZGVidWdmcworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwllcnIgPSBpbDQ5NjVfbWFjX3NldHVwX3JlZ2lzdGVyKGlsLCBtYXhfcHJvYmVfbGVuZ3RoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmJpbmQ7CisKKwllcnIgPSBpbF9kYmdmc19yZWdpc3RlcihpbCwgRFJWX05BTUUpOworCWlmIChlcnIpCisJCUlMX0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGZpbGVzLiBJZ25vcmluZyBlcnJvcjogJWRcbiIsCisJCSAgICAgICBlcnIpOworCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpbC0+cGNpX2Rldi0+ZGV2LmtvYmosICZpbF9hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChlcnIpIHsKKwkJSUxfRVJSKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGRldmljZSBhdHRyaWJ1dGVzXG4iKTsKKwkJZ290byBvdXRfdW5iaW5kOworCX0KKworCS8qIFdlIGhhdmUgb3VyIGNvcGllcyBub3csIGFsbG93IE9TIHJlbGVhc2UgaXRzIGNvcGllcyAqLworCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKKwljb21wbGV0ZSgmaWwtPl80OTY1LmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOworCXJldHVybjsKKwordHJ5X2FnYWluOgorCS8qIHRyeSBuZXh0LCBpZiBhbnkgKi8KKwlpZiAoaWw0OTY1X3JlcXVlc3RfZmlybXdhcmUoaWwsIGZhbHNlKSkKKwkJZ290byBvdXRfdW5iaW5kOworCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKKwlyZXR1cm47CisKK2Vycl9wY2lfYWxsb2M6CisJSUxfRVJSKCJmYWlsZWQgdG8gYWxsb2NhdGUgcGNpIG1lbW9yeVxuIik7CisJaWw0OTY1X2RlYWxsb2NfdWNvZGVfcGNpKGlsKTsKK291dF91bmJpbmQ6CisJY29tcGxldGUoJmlsLT5fNDk2NS5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKKwlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoJmlsLT5wY2lfZGV2LT5kZXYpOworCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGRlc2NfbG9va3VwX3RleHRbXSA9IHsKKwkiT0siLAorCSJGQUlMIiwKKwkiQkFEX1BBUkFNIiwKKwkiQkFEX0NIRUNLU1VNIiwKKwkiTk1JX0lOVEVSUlVQVF9XREciLAorCSJTWVNBU1NFUlQiLAorCSJGQVRBTF9FUlJPUiIsCisJIkJBRF9DT01NQU5EIiwKKwkiSFdfRVJST1JfVFVORV9MT0NLIiwKKwkiSFdfRVJST1JfVEVNUEVSQVRVUkUiLAorCSJJTExFR0FMX0NIQU5fRlJFUSIsCisJIlZDQ19OT1RfU1RCTCIsCisJIkZINDlfRVJST1IiLAorCSJOTUlfSU5URVJSVVBUX0hPU1QiLAorCSJOTUlfSU5URVJSVVBUX0FDVElPTl9QVCIsCisJIk5NSV9JTlRFUlJVUFRfVU5LTk9XTiIsCisJIlVDT0RFX1ZFUlNJT05fTUlTTUFUQ0giLAorCSJIV19FUlJPUl9BQlNfTE9DSyIsCisJIkhXX0VSUk9SX0NBTF9MT0NLX0ZBSUwiLAorCSJOTUlfSU5URVJSVVBUX0lOU1RfQUNUSU9OX1BUIiwKKwkiTk1JX0lOVEVSUlVQVF9EQVRBX0FDVElPTl9QVCIsCisJIk5NSV9UUk1fSFdfRVIiLAorCSJOTUlfSU5URVJSVVBUX1RSTSIsCisJIk5NSV9JTlRFUlJVUFRfQlJFQUtfUE9JTlQiLAorCSJERUJVR18wIiwKKwkiREVCVUdfMSIsCisJIkRFQlVHXzIiLAorCSJERUJVR18zIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIgKm5hbWU7CisJdTggbnVtOworfSBhZHZhbmNlZF9sb29rdXBbXSA9IHsKKwl7CisJIk5NSV9JTlRFUlJVUFRfV0RHIiwgMHgzNH0sIHsKKwkiU1lTQVNTRVJUIiwgMHgzNX0sIHsKKwkiVUNPREVfVkVSU0lPTl9NSVNNQVRDSCIsIDB4Mzd9LCB7CisJIkJBRF9DT01NQU5EIiwgMHgzOH0sIHsKKwkiTk1JX0lOVEVSUlVQVF9EQVRBX0FDVElPTl9QVCIsIDB4M0N9LCB7CisJIkZBVEFMX0VSUk9SIiwgMHgzRH0sIHsKKwkiTk1JX1RSTV9IV19FUlIiLCAweDQ2fSwgeworCSJOTUlfSU5URVJSVVBUX1RSTSIsIDB4NEN9LCB7CisJIk5NSV9JTlRFUlJVUFRfQlJFQUtfUE9JTlQiLCAweDU0fSwgeworCSJOTUlfSU5URVJSVVBUX1dER19SWEZfRlVMTCIsIDB4NUN9LCB7CisJIk5NSV9JTlRFUlJVUFRfV0RHX05PX1JCRF9SWEZfRlVMTCIsIDB4NjR9LCB7CisJIk5NSV9JTlRFUlJVUFRfSE9TVCIsIDB4NjZ9LCB7CisJIk5NSV9JTlRFUlJVUFRfQUNUSU9OX1BUIiwgMHg3Q30sIHsKKwkiTk1JX0lOVEVSUlVQVF9VTktOT1dOIiwgMHg4NH0sIHsKKwkiTk1JX0lOVEVSUlVQVF9JTlNUX0FDVElPTl9QVCIsIDB4ODZ9LCB7CisiQURWQU5DRURfU1lTQVNTRVJUIiwgMH0sfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKgoraWw0OTY1X2Rlc2NfbG9va3VwKHUzMiBudW0pCit7CisJaW50IGk7CisJaW50IG1heCA9IEFSUkFZX1NJWkUoZGVzY19sb29rdXBfdGV4dCk7CisKKwlpZiAobnVtIDwgbWF4KQorCQlyZXR1cm4gZGVzY19sb29rdXBfdGV4dFtudW1dOworCisJbWF4ID0gQVJSQVlfU0laRShhZHZhbmNlZF9sb29rdXApIC0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJaWYgKGFkdmFuY2VkX2xvb2t1cFtpXS5udW0gPT0gbnVtKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBhZHZhbmNlZF9sb29rdXBbaV0ubmFtZTsKK30KKworI2RlZmluZSBFUlJPUl9TVEFSVF9PRkZTRVQgICgxICogc2l6ZW9mKHUzMikpCisjZGVmaW5lIEVSUk9SX0VMRU1fU0laRSAgICAgKDcgKiBzaXplb2YodTMyKSkKKwordm9pZAoraWw0OTY1X2R1bXBfbmljX2Vycm9yX2xvZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTMyIGRhdGEyLCBsaW5lOworCXUzMiBkZXNjLCB0aW1lLCBjb3VudCwgYmFzZSwgZGF0YTE7CisJdTMyIGJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMjsKKwl1MzIgcGMsIGhjbWQ7CisKKwlpZiAoaWwtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkKKwkJYmFzZSA9IGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQuZXJyb3JfZXZlbnRfdGFibGVfcHRyKTsKKwllbHNlCisJCWJhc2UgPSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZS5lcnJvcl9ldmVudF90YWJsZV9wdHIpOworCisJaWYgKCFpbC0+Y2ZnLT5vcHMtPmxpYi0+aXNfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgeworCQlJTF9FUlIoIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFggZm9yICVzIHVDb2RlXG4iLAorCQkgICAgICAgYmFzZSwgKGlsLT51Y29kZV90eXBlID09IFVDT0RFX0lOSVQpID8gIkluaXQiIDogIlJUIik7CisJCXJldHVybjsKKwl9CisKKwljb3VudCA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UpOworCisJaWYgKEVSUk9SX1NUQVJUX09GRlNFVCA8PSBjb3VudCAqIEVSUk9SX0VMRU1fU0laRSkgeworCQlJTF9FUlIoIlN0YXJ0IElXTCBFcnJvciBMb2cgRHVtcDpcbiIpOworCQlJTF9FUlIoIlN0YXR1czogMHglMDhsWCwgY291bnQ6ICVkXG4iLCBpbC0+c3RhdHVzLCBjb3VudCk7CisJfQorCisJZGVzYyA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyAxICogc2l6ZW9mKHUzMikpOworCWlsLT5pc3Jfc3RhdHMuZXJyX2NvZGUgPSBkZXNjOworCXBjID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDIgKiBzaXplb2YodTMyKSk7CisJYmxpbmsxID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDMgKiBzaXplb2YodTMyKSk7CisJYmxpbmsyID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDQgKiBzaXplb2YodTMyKSk7CisJaWxpbmsxID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDUgKiBzaXplb2YodTMyKSk7CisJaWxpbmsyID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDYgKiBzaXplb2YodTMyKSk7CisJZGF0YTEgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgNyAqIHNpemVvZih1MzIpKTsKKwlkYXRhMiA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyA4ICogc2l6ZW9mKHUzMikpOworCWxpbmUgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgOSAqIHNpemVvZih1MzIpKTsKKwl0aW1lID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDExICogc2l6ZW9mKHUzMikpOworCWhjbWQgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgMjIgKiBzaXplb2YodTMyKSk7CisKKwlJTF9FUlIoIkRlc2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZSAgICAgICAiCisJICAgICAgICJkYXRhMSAgICAgIGRhdGEyICAgICAgbGluZVxuIik7CisJSUxfRVJSKCIlLTI4cyAoMHglMDRYKSAlMDEwdSAweCUwOFggMHglMDhYICV1XG4iLAorCSAgICAgICBpbDQ5NjVfZGVzY19sb29rdXAoZGVzYyksIGRlc2MsIHRpbWUsIGRhdGExLCBkYXRhMiwgbGluZSk7CisJSUxfRVJSKCJwYyAgICAgIGJsaW5rMSAgYmxpbmsyICBpbGluazEgIGlsaW5rMiAgaGNtZFxuIik7CisJSUxfRVJSKCIweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYIDB4JTA1WFxuIiwgcGMsIGJsaW5rMSwKKwkgICAgICAgYmxpbmsyLCBpbGluazEsIGlsaW5rMiwgaGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcmZfa2lsbF9jdF9jb25maWcoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9jdF9raWxsX2NvbmZpZyBjbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAorCSAgICAgICBDU1JfVUNPREVfRFJWX0dQMV9SRUdfQklUX0NUX0tJTExfRVhJVCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWNtZC5jcml0aWNhbF90ZW1wZXJhdHVyZV9SID0KKwkgICAgY3B1X3RvX2xlMzIoaWwtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCk7CisKKwlyZXQgPSBpbF9zZW5kX2NtZF9wZHUoaWwsIENfQ1RfS0lMTF9DT05GSUcsIHNpemVvZihjbWQpLCAmY21kKTsKKwlpZiAocmV0KQorCQlJTF9FUlIoIkNfQ1RfS0lMTF9DT05GSUcgZmFpbGVkXG4iKTsKKwllbHNlCisJCURfSU5GTygiQ19DVF9LSUxMX0NPTkZJRyAiICJzdWNjZWVkZWQsICIKKwkJICAgICAgICJjcml0aWNhbCB0ZW1wZXJhdHVyZSBpcyAlZFxuIiwKKwkJICAgICAgIGlsLT5od19wYXJhbXMuY3Rfa2lsbF90aHJlc2hvbGQpOworfQorCitzdGF0aWMgY29uc3QgczggZGVmYXVsdF9xdWV1ZV90b190eF9maWZvW10gPSB7CisJSUxfVFhfRklGT19WTywKKwlJTF9UWF9GSUZPX1ZJLAorCUlMX1RYX0ZJRk9fQkUsCisJSUxfVFhfRklGT19CSywKKwlJTDQ5X0NNRF9GSUZPX05VTSwKKwlJTF9UWF9GSUZPX1VOVVNFRCwKKwlJTF9UWF9GSUZPX1VOVVNFRCwKK307CisKKyNkZWZpbmUgSUxfTUFTSyhsbywgaGkpICgoMSA8PCAoaGkpKSB8ICgoMSA8PCAoaGkpKSAtICgxIDw8IChsbykpKSkKKworc3RhdGljIGludAoraWw0OTY1X2FsaXZlX25vdGlmeShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTMyIGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgY2hhbjsKKwl1MzIgcmVnX3ZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogQ2xlYXIgNDk2NSdzIGludGVybmFsIFR4IFNjaGVkdWxlciBkYXRhIGJhc2UgKi8KKwlpbC0+c2NkX2Jhc2VfYWRkciA9IGlsX3JkX3BycGgoaWwsIElMNDlfU0NEX1NSQU1fQkFTRV9BRERSKTsKKwlhID0gaWwtPnNjZF9iYXNlX2FkZHIgKyBJTDQ5X1NDRF9DT05URVhUX0RBVEFfT0ZGU0VUOworCWZvciAoOyBhIDwgaWwtPnNjZF9iYXNlX2FkZHIgKyBJTDQ5X1NDRF9UWF9TVFRTX0JJVE1BUF9PRkZTRVQ7IGEgKz0gNCkKKwkJaWxfd3JpdGVfdGFyZ19tZW0oaWwsIGEsIDApOworCWZvciAoOyBhIDwgaWwtPnNjZF9iYXNlX2FkZHIgKyBJTDQ5X1NDRF9UUkFOU0xBVEVfVEJMX09GRlNFVDsgYSArPSA0KQorCQlpbF93cml0ZV90YXJnX21lbShpbCwgYSwgMCk7CisJZm9yICg7CisJICAgICBhIDwKKwkgICAgIGlsLT5zY2RfYmFzZV9hZGRyICsKKwkgICAgIElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUX1FVRVVFKGlsLT5od19wYXJhbXMubWF4X3R4cV9udW0pOworCSAgICAgYSArPSA0KQorCQlpbF93cml0ZV90YXJnX21lbShpbCwgYSwgMCk7CisKKwkvKiBUZWwgNDk2NSB3aGVyZSB0byBmaW5kIFR4IGJ5dGUgY291bnQgdGFibGVzICovCisJaWxfd3JfcHJwaChpbCwgSUw0OV9TQ0RfRFJBTV9CQVNFX0FERFIsIGlsLT5zY2RfYmNfdGJscy5kbWEgPj4gMTApOworCisJLyogRW5hYmxlIERNQSBjaGFubmVsICovCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IEZINDlfVENTUl9DSE5MX05VTTsgY2hhbisrKQorCQlpbF93cihpbCwgRkg0OV9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhjaGFuKSwKKwkJICAgICAgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRSB8CisJCSAgICAgIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRSk7CisKKwkvKiBVcGRhdGUgRkggY2hpY2tlbiBiaXRzICovCisJcmVnX3ZhbCA9IGlsX3JkKGlsLCBGSDQ5X1RYX0NISUNLRU5fQklUU19SRUcpOworCWlsX3dyKGlsLCBGSDQ5X1RYX0NISUNLRU5fQklUU19SRUcsCisJICAgICAgcmVnX3ZhbCB8IEZINDlfVFhfQ0hJQ0tFTl9CSVRTX1NDRF9BVVRPX1JFVFJZX0VOKTsKKworCS8qIERpc2FibGUgY2hhaW4gbW9kZSBmb3IgYWxsIHF1ZXVlcyAqLworCWlsX3dyX3BycGgoaWwsIElMNDlfU0NEX1FVRVVFQ0hBSU5fU0VMLCAwKTsKKworCS8qIEluaXRpYWxpemUgZWFjaCBUeCBxdWV1ZSAoaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlKSAqLworCWZvciAoaSA9IDA7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBpKyspIHsKKworCQkvKiBURkQgY2lyY3VsYXIgYnVmZmVyIHJlYWQvd3JpdGUgaWR4ZXMgKi8KKwkJaWxfd3JfcHJwaChpbCwgSUw0OV9TQ0RfUVVFVUVfUkRQVFIoaSksIDApOworCQlpbF93cihpbCwgSEJVU19UQVJHX1dSUFRSLCAwIHwgKGkgPDwgOCkpOworCisJCS8qIE1heCBUeCBXaW5kb3cgc2l6ZSBmb3IgU2NoZWR1bGVyLUFDSyBtb2RlICovCisJCWlsX3dyaXRlX3RhcmdfbWVtKGlsLAorCQkJCSAgaWwtPnNjZF9iYXNlX2FkZHIgKworCQkJCSAgSUw0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoaSksCisJCQkJICAoU0NEX1dJTl9TSVpFIDw8CisJCQkJICAgSUw0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfUE9TKSAmCisJCQkJICBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9NU0spOworCisJCS8qIEZyYW1lIGxpbWl0ICovCisJCWlsX3dyaXRlX3RhcmdfbWVtKGlsLAorCQkJCSAgaWwtPnNjZF9iYXNlX2FkZHIgKworCQkJCSAgSUw0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoaSkgKworCQkJCSAgc2l6ZW9mKHUzMiksCisJCQkJICAoU0NEX0ZSQU1FX0xJTUlUIDw8CisJCQkJICAgSUw0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfUE9TKSAmCisJCQkJICBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0spOworCisJfQorCWlsX3dyX3BycGgoaWwsIElMNDlfU0NEX0lOVEVSUlVQVF9NQVNLLAorCQkgICAoMSA8PCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtKSAtIDEpOworCisJLyogQWN0aXZhdGUgYWxsIFR4IERNQS9GSUZPIGNoYW5uZWxzICovCisJaWw0OTY1X3R4cV9zZXRfc2NoZWQoaWwsIElMX01BU0soMCwgNikpOworCisJaWw0OTY1X3NldF93cl9wdHJzKGlsLCBJTF9ERUZBVUxUX0NNRF9RVUVVRV9OVU0sIDApOworCisJLyogbWFrZSBzdXJlIGFsbCBxdWV1ZSBhcmUgbm90IHN0b3BwZWQgKi8KKwltZW1zZXQoJmlsLT5xdWV1ZV9zdG9wcGVkWzBdLCAwLCBzaXplb2YoaWwtPnF1ZXVlX3N0b3BwZWQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlhdG9taWNfc2V0KCZpbC0+cXVldWVfc3RvcF9jb3VudFtpXSwgMCk7CisKKwkvKiByZXNldCB0byAwIHRvIGVuYWJsZSBhbGwgdGhlIHF1ZXVlIGZpcnN0ICovCisJaWwtPnR4cV9jdHhfYWN0aXZlX21zayA9IDA7CisJLyogTWFwIGVhY2ggVHgvY21kIHF1ZXVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGZpZm8gKi8KKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm8pICE9IDcpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGVmYXVsdF9xdWV1ZV90b190eF9maWZvKTsgaSsrKSB7CisJCWludCBhYyA9IGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmb1tpXTsKKworCQlpbF90eHFfY3R4X2FjdGl2YXRlKGlsLCBpKTsKKworCQlpZiAoYWMgPT0gSUxfVFhfRklGT19VTlVTRUQpCisJCQljb250aW51ZTsKKworCQlpbDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyhpbCwgJmlsLT50eHFbaV0sIGFjLCAwKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWw0OTY1X2FsaXZlX3N0YXJ0IC0gY2FsbGVkIGFmdGVyIE5fQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCisgKiAgICAgICAgICAgICAgICAgICBmcm9tIHByb3RvY29sL3J1bnRpbWUgdUNvZGUgKGluaXRpYWxpemF0aW9uIHVDb2RlJ3MKKyAqICAgICAgICAgICAgICAgICAgIEFsaXZlIGdldHMgaGFuZGxlZCBieSBpbF9pbml0X2FsaXZlX3N0YXJ0KCkpLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2FsaXZlX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCURfSU5GTygiUnVudGltZSBBbGl2ZSByZWNlaXZlZC5cbiIpOworCisJaWYgKGlsLT5jYXJkX2FsaXZlLmlzX3ZhbGlkICE9IFVDT0RFX1ZBTElEX09LKSB7CisJCS8qIFdlIGhhZCBhbiBlcnJvciBicmluZ2luZyB1cCB0aGUgaGFyZHdhcmUsIHNvIHRha2UgaXQKKwkJICogYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJBbGl2ZSBmYWlsZWQuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIEluaXRpYWxpemUgdUNvZGUgaGFzIGxvYWRlZCBSdW50aW1lIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KKwkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQorCSAqICJydW50aW1lIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KKwlpZiAoaWw0OTY1X3ZlcmlmeV91Y29kZShpbCkpIHsKKwkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7CisJCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJCYWQgcnVudGltZSB1Q29kZSBsb2FkLlxuIik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwlyZXQgPSBpbDQ5NjVfYWxpdmVfbm90aWZ5KGlsKTsKKwlpZiAocmV0KSB7CisJCUlMX1dBUk4oIkNvdWxkIG5vdCBjb21wbGV0ZSBBTElWRSB0cmFuc2l0aW9uIFtudGZdOiAlZFxuIiwgcmV0KTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIEFmdGVyIHRoZSBBTElWRSByZXNwb25zZSwgd2UgY2FuIHNlbmQgaG9zdCBjb21tYW5kcyB0byB0aGUgdUNvZGUgKi8KKwlzZXRfYml0KFNfQUxJVkUsICZpbC0+c3RhdHVzKTsKKworCS8qIEVuYWJsZSB3YXRjaGRvZyB0byBtb25pdG9yIHRoZSBkcml2ZXIgdHggcXVldWVzICovCisJaWxfc2V0dXBfd2F0Y2hkb2coaWwpOworCisJaWYgKGlsX2lzX3Jma2lsbChpbCkpCisJCXJldHVybjsKKworCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhpbC0+aHcpOworCisJaWwtPmFjdGl2ZV9yYXRlID0gUkFURVNfTUFTSzsKKworCWlmIChpbF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKSB7CisJCXN0cnVjdCBpbF9yeG9uX2NtZCAqYWN0aXZlX3J4b24gPQorCQkgICAgKHN0cnVjdCBpbF9yeG9uX2NtZCAqKSZjdHgtPmFjdGl2ZTsKKwkJLyogYXBwbHkgYW55IGNoYW5nZXMgaW4gc3RhZ2luZyAqLworCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKKwkJYWN0aXZlX3J4b24tPmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOworCX0gZWxzZSB7CisJCS8qIEluaXRpYWxpemUgb3VyIHJ4X2NvbmZpZyBkYXRhICovCisJCWlsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoaWwsICZpbC0+Y3R4KTsKKworCQlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKKwkJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisJfQorCisJLyogQ29uZmlndXJlIGJsdWV0b290aCBjb2V4aXN0ZW5jZSBpZiBlbmFibGVkICovCisJaWxfc2VuZF9idF9jb25maWcoaWwpOworCisJaWw0OTY1X3Jlc2V0X3J1bl90aW1lX2NhbGliKGlsKTsKKworCXNldF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpOworCisJLyogQ29uZmlndXJlIHRoZSBhZGFwdGVyIGZvciB1bmFzc29jaWF0ZWQgb3BlcmF0aW9uICovCisJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwkvKiBBdCB0aGlzIHBvaW50LCB0aGUgTklDIGlzIGluaXRpYWxpemVkIGFuZCBvcGVyYXRpb25hbCAqLworCWlsNDk2NV9yZl9raWxsX2N0X2NvbmZpZyhpbCk7CisKKwlEX0lORk8oIkFMSVZFIHByb2Nlc3NpbmcgY29tcGxldGUuXG4iKTsKKwl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKworCWlsX3Bvd2VyX3VwZGF0ZV9tb2RlKGlsLCB0cnVlKTsKKwlEX0lORk8oIlVwZGF0ZWQgcG93ZXIgbW9kZVxuIik7CisKKwlyZXR1cm47CisKK3Jlc3RhcnQ6CisJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworfQorCitzdGF0aWMgdm9pZCBpbDQ5NjVfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworc3RhdGljIHZvaWQKK19faWw0OTY1X2Rvd24oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGV4aXRfcGVuZGluZzsKKworCURfSU5GTyhEUlZfTkFNRSAiIGlzIGdvaW5nIGRvd25cbiIpOworCisJaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMjAwKTsKKworCWV4aXRfcGVuZGluZyA9IHRlc3RfYW5kX3NldF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKworCS8qIFN0b3AgVFggcXVldWVzIHdhdGNoZG9nLiBXZSBuZWVkIHRvIGhhdmUgU19FWElUX1BFTkRJTkcgYml0IHNldAorCSAqIHRvIHByZXZlbnQgcmVhcm0gdGltZXIgKi8KKwlkZWxfdGltZXJfc3luYygmaWwtPndhdGNoZG9nKTsKKworCWlsX2NsZWFyX3Vjb2RlX3N0YXRpb25zKGlsLCBOVUxMKTsKKwlpbF9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKGlsKTsKKwlpbF9jbGVhcl9kcml2ZXJfc3RhdGlvbnMoaWwpOworCisJLyogVW5ibG9jayBhbnkgd2FpdGluZyBjYWxscyAqLworCXdha2VfdXBfYWxsKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKworCS8qIFdpcGUgb3V0IHRoZSBFWElUX1BFTkRJTkcgc3RhdHVzIGJpdCBpZiB3ZSBhcmUgbm90IGFjdHVhbGx5CisJICogZXhpdGluZyB0aGUgbW9kdWxlICovCisJaWYgKCFleGl0X3BlbmRpbmcpCisJCWNsZWFyX2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJLyogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciAqLworCV9pbF93cihpbCwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7CisKKwkvKiB0ZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbF9kaXNhYmxlX2ludGVycnVwdHMoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWw0OTY1X3N5bmNocm9uaXplX2lycShpbCk7CisKKwlpZiAoaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQpCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhpbC0+aHcpOworCisJLyogSWYgd2UgaGF2ZSBub3QgcHJldmlvdXNseSBjYWxsZWQgaWxfaW5pdCgpIHRoZW4KKwkgKiBjbGVhciBhbGwgYml0cyBidXQgdGhlIFJGIEtpbGwgYml0IGFuZCByZXR1cm4gKi8KKwlpZiAoIWlsX2lzX2luaXQoaWwpKSB7CisJCWlsLT5zdGF0dXMgPQorCQkgICAgdGVzdF9iaXQoU19SRl9LSUxMX0hXLAorCQkJICAgICAmaWwtPgorCQkJICAgICBzdGF0dXMpIDw8IFNfUkZfS0lMTF9IVyB8CisJCSAgICB0ZXN0X2JpdChTX0dFT19DT05GSUdVUkVELAorCQkJICAgICAmaWwtPgorCQkJICAgICBzdGF0dXMpIDw8IFNfR0VPX0NPTkZJR1VSRUQgfAorCQkgICAgdGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSA8PCBTX0VYSVRfUEVORElORzsKKwkJZ290byBleGl0OworCX0KKworCS8qIC4uLm90aGVyd2lzZSBjbGVhciBvdXQgYWxsIHRoZSBzdGF0dXMgYml0cyBidXQgdGhlIFJGIEtpbGwKKwkgKiBiaXQgYW5kIGNvbnRpbnVlIHRha2luZyB0aGUgTklDIGRvd24uICovCisJaWwtPnN0YXR1cyAmPQorCSAgICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsCisJCSAgICAgJmlsLT5zdGF0dXMpIDw8IFNfUkZfS0lMTF9IVyB8IHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsCisJCQkJCQkJICAgICAmaWwtPgorCQkJCQkJCSAgICAgc3RhdHVzKSA8PAorCSAgICBTX0dFT19DT05GSUdVUkVEIHwgdGVzdF9iaXQoU19GV19FUlJPUiwKKwkJCQkJJmlsLT4KKwkJCQkJc3RhdHVzKSA8PCBTX0ZXX0VSUk9SIHwKKwkgICAgdGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSA8PCBTX0VYSVRfUEVORElORzsKKworCWlsNDk2NV90eHFfY3R4X3N0b3AoaWwpOworCWlsNDk2NV9yeHFfc3RvcChpbCk7CisKKwkvKiBQb3dlci1kb3duIGRldmljZSdzIGJ1c21hc3RlciBETUEgY2xvY2tzICovCisJaWxfd3JfcHJwaChpbCwgQVBNR19DTEtfRElTX1JFRywgQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUKTsKKwl1ZGVsYXkoNSk7CisKKwkvKiBNYWtlIHN1cmUgKHJlZHVuZGFudCkgd2UndmUgcmVsZWFzZWQgb3VyIHJlcXVlc3QgdG8gc3RheSBhd2FrZSAqLworCWlsX2NsZWFyX2JpdChpbCwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOworCisJLyogU3RvcCB0aGUgZGV2aWNlLCBhbmQgcHV0IGl0IGluIGxvdyBwb3dlciBzdGF0ZSAqLworCWlsX2FwbV9zdG9wKGlsKTsKKworZXhpdDoKKwltZW1zZXQoJmlsLT5jYXJkX2FsaXZlLCAwLCBzaXplb2Yoc3RydWN0IGlsX2FsaXZlX3Jlc3ApKTsKKworCWRldl9rZnJlZV9za2IoaWwtPmJlYWNvbl9za2IpOworCWlsLT5iZWFjb25fc2tiID0gTlVMTDsKKworCS8qIGNsZWFyIG91dCBhbnkgZnJlZSBmcmFtZXMgKi8KKwlpbDQ5NjVfY2xlYXJfZnJlZV9mcmFtZXMoaWwpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2Rvd24oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJX19pbDQ5NjVfZG93bihpbCk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJaWw0OTY1X2NhbmNlbF9kZWZlcnJlZF93b3JrKGlsKTsKK30KKworI2RlZmluZSBIV19SRUFEWV9USU1FT1VUICg1MCkKKworc3RhdGljIGludAoraWw0OTY1X3NldF9od19yZWFkeShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldCA9IDA7CisKKwlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19SRUFEWSk7CisKKwkvKiBTZWUgaWYgd2UgZ290IGl0ICovCisJcmV0ID0KKwkgICAgX2lsX3BvbGxfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZLAorCQkJIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFksIEhXX1JFQURZX1RJTUVPVVQpOworCWlmIChyZXQgIT0gLUVUSU1FRE9VVCkKKwkJaWwtPmh3X3JlYWR5ID0gdHJ1ZTsKKwllbHNlCisJCWlsLT5od19yZWFkeSA9IGZhbHNlOworCisJRF9JTkZPKCJoYXJkd2FyZSAlc1xuIiwgKGlsLT5od19yZWFkeSA9PSAxKSA/ICJyZWFkeSIgOiAibm90IHJlYWR5Iik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraWw0OTY1X3ByZXBhcmVfY2FyZF9odyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldCA9IDA7CisKKwlEX0lORk8oImlsNDk2NV9wcmVwYXJlX2NhcmRfaHcgZW50ZXJcbiIpOworCisJcmV0ID0gaWw0OTY1X3NldF9od19yZWFkeShpbCk7CisJaWYgKGlsLT5od19yZWFkeSkKKwkJcmV0dXJuIHJldDsKKworCS8qIElmIEhXIGlzIG5vdCByZWFkeSwgcHJlcGFyZSB0aGUgY29uZGl0aW9ucyB0byBjaGVjayBhZ2FpbiAqLworCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLCBDU1JfSFdfSUZfQ09ORklHX1JFR19QUkVQQVJFKTsKKworCXJldCA9CisJICAgIF9pbF9wb2xsX2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCQkgfkNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUFJFUEFSRV9ET05FLAorCQkJIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUFJFUEFSRV9ET05FLCAxNTAwMDApOworCisJLyogSFcgc2hvdWxkIGJlIHJlYWR5IGJ5IG5vdywgY2hlY2sgYWdhaW4uICovCisJaWYgKHJldCAhPSAtRVRJTUVET1VUKQorCQlpbDQ5NjVfc2V0X2h3X3JlYWR5KGlsKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgTUFYX0hXX1JFU1RBUlRTIDUKKworc3RhdGljIGludAorX19pbDQ5NjVfdXAoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCBpOworCWludCByZXQ7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkgeworCQlJTF9XQVJOKCJFeGl0IHBlbmRpbmc7IHdpbGwgbm90IGJyaW5nIHRoZSBOSUMgdXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIWlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIgfHwgIWlsLT51Y29kZV9kYXRhLnZfYWRkcikgeworCQlJTF9FUlIoInVjb2RlIG5vdCBhdmFpbGFibGUgZm9yIGRldmljZSBicmluZ3VwXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gaWw0OTY1X2FsbG9jX2JjYXN0X3N0YXRpb24oaWwsICZpbC0+Y3R4KTsKKwlpZiAocmV0KSB7CisJCWlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoaWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlsNDk2NV9wcmVwYXJlX2NhcmRfaHcoaWwpOworCisJaWYgKCFpbC0+aHdfcmVhZHkpIHsKKwkJSUxfV0FSTigiRXhpdCBIVyBub3QgcmVhZHlcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBJZiBwbGF0Zm9ybSdzIFJGX0tJTEwgc3dpdGNoIGlzIE5PVCBzZXQgdG8gS0lMTCAqLworCWlmIChfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykKKwkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCWVsc2UKKwkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKworCWlmIChpbF9pc19yZmtpbGwoaWwpKSB7CisJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUoaWwtPmh3LT53aXBoeSwgdHJ1ZSk7CisKKwkJaWxfZW5hYmxlX2ludGVycnVwdHMoaWwpOworCQlJTF9XQVJOKCJSYWRpbyBkaXNhYmxlZCBieSBIVyBSRiBLaWxsIHN3aXRjaFxuIik7CisJCXJldHVybiAwOworCX0KKworCV9pbF93cihpbCwgQ1NSX0lOVCwgMHhGRkZGRkZGRik7CisKKwkvKiBtdXN0IGJlIGluaXRpYWxpc2VkIGJlZm9yZSBpbF9od19uaWNfaW5pdCAqLworCWlsLT5jbWRfcXVldWUgPSBJTF9ERUZBVUxUX0NNRF9RVUVVRV9OVU07CisKKwlyZXQgPSBpbDQ5NjVfaHdfbmljX2luaXQoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gaW5pdCBuaWNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIG1ha2Ugc3VyZSByZmtpbGwgaGFuZHNoYWtlIGJpdHMgYXJlIGNsZWFyZWQgKi8KKwlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfRFJWX0dQMV9CSVRfQ01EX0JMT0NLRUQpOworCisJLyogY2xlYXIgKGFnYWluKSwgdGhlbiBlbmFibGUgaG9zdCBpbnRlcnJ1cHRzICovCisJX2lsX3dyKGlsLCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKKwlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisKKwkvKiByZWFsbHkgbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKKworCS8qIENvcHkgb3JpZ2luYWwgdWNvZGUgZGF0YSBpbWFnZSBmcm9tIGRpc2sgaW50byBiYWNrdXAgY2FjaGUuCisJICogVGhpcyB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgb24tYm9hcmQgcHJvY2Vzc29yJ3MKKwkgKiBkYXRhIFNSQU0gZm9yIGEgY2xlYW4gc3RhcnQgd2hlbiB0aGUgcnVudGltZSBwcm9ncmFtIGZpcnN0IGxvYWRzLiAqLworCW1lbWNweShpbC0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyLCBpbC0+dWNvZGVfZGF0YS52X2FkZHIsCisJICAgICAgIGlsLT51Y29kZV9kYXRhLmxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXX1JFU1RBUlRTOyBpKyspIHsKKworCQkvKiBsb2FkIGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lLAorCQkgKiBsb2FkIGJvb3RzdHJhcCBwcm9ncmFtIGludG8gcHJvY2Vzc29yJ3MgbWVtb3J5LAorCQkgKiBwcmVwYXJlIHRvIGxvYWQgdGhlICJpbml0aWFsaXplIiB1Q29kZSAqLworCQlyZXQgPSBpbC0+Y2ZnLT5vcHMtPmxpYi0+bG9hZF91Y29kZShpbCk7CisKKwkJaWYgKHJldCkgeworCQkJSUxfRVJSKCJVbmFibGUgdG8gc2V0IHVwIGJvb3RzdHJhcCB1Q29kZTogJWRcbiIsIHJldCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHN0YXJ0IGNhcmQ7ICJpbml0aWFsaXplIiB3aWxsIGxvYWQgcnVudGltZSB1Y29kZSAqLworCQlpbDQ5NjVfbmljX3N0YXJ0KGlsKTsKKworCQlEX0lORk8oRFJWX05BTUUgIiBpcyBjb21pbmcgdXBcbiIpOworCisJCXJldHVybiAwOworCX0KKworCXNldF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKwlfX2lsNDk2NV9kb3duKGlsKTsKKwljbGVhcl9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKworCS8qIHRyaWVkIHRvIHJlc3RhcnQgYW5kIGNvbmZpZyB0aGUgZGV2aWNlIGZvciBhcyBsb25nIGFzIG91cgorCSAqIHBhdGllbmNlIGNvdWxkIHdpdGhzdGFuZCAqLworCUlMX0VSUigiVW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlIGFmdGVyICVkIGF0dGVtcHRzLlxuIiwgaSk7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFdvcmtxdWV1ZSBjYWxsYmFja3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfYmdfaW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0KKwkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCBpbml0X2FsaXZlX3N0YXJ0LndvcmspOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJZ290byBvdXQ7CisKKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+aW5pdF9hbGl2ZV9zdGFydChpbCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2JnX2FsaXZlX3N0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPQorCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIGFsaXZlX3N0YXJ0LndvcmspOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJZ290byBvdXQ7CisKKwlpbDQ5NjVfYWxpdmVfc3RhcnQoaWwpOworb3V0OgorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9iZ19ydW5fdGltZV9jYWxpYl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGlsX3ByaXYsCisJCQkJCSAgcnVuX3RpbWVfY2FsaWJfd29yayk7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKSB7CisJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbC0+c3RhcnRfY2FsaWIpIHsKKwkJaWw0OTY1X2NoYWluX25vaXNlX2NhbGlicmF0aW9uKGlsLCAodm9pZCAqKSZpbC0+XzQ5NjUuc3RhdHMpOworCQlpbDQ5NjVfc2Vuc2l0aXZpdHlfY2FsaWJyYXRpb24oaWwsICh2b2lkICopJmlsLT5fNDk2NS5zdGF0cyk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2JnX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaWxfcHJpdiwgcmVzdGFydCk7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTX0ZXX0VSUk9SLCAmaWwtPnN0YXR1cykpIHsKKwkJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwkJaWwtPmN0eC52aWYgPSBOVUxMOworCQlpbC0+aXNfb3BlbiA9IDA7CisKKwkJX19pbDQ5NjVfZG93bihpbCk7CisKKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQlpbDQ5NjVfY2FuY2VsX2RlZmVycmVkX3dvcmsoaWwpOworCQlpZWVlODAyMTFfcmVzdGFydF9odyhpbC0+aHcpOworCX0gZWxzZSB7CisJCWlsNDk2NV9kb3duKGlsKTsKKworCQltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCQlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQkJcmV0dXJuOworCQl9CisKKwkJX19pbDQ5NjVfdXAoaWwpOworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJfQorfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2JnX3J4X3JlcGxlbmlzaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCByeF9yZXBsZW5pc2gpOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWw0OTY1X3J4X3JlcGxlbmlzaChpbCk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVUNPREVfUkVBRFlfVElNRU9VVAkoNCAqIEhaKQorCisvKgorICogTm90IGEgbWFjODAyMTEgZW50cnkgcG9pbnQgZnVuY3Rpb24sIGJ1dCBpdCBmaXRzIGluIHdpdGggYWxsIHRoZQorICogb3RoZXIgbWFjODAyMTEgZnVuY3Rpb25zIGdyb3VwZWQgaGVyZS4KKyAqLworc3RhdGljIGludAoraWw0OTY1X21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBtYXhfcHJvYmVfbGVuZ3RoKQoreworCWludCByZXQ7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBpbC0+aHc7CisKKwlody0+cmF0ZV9jb250cm9sX2FsZ29yaXRobSA9ICJpd2wtNDk2NS1ycyI7CisKKwkvKiBUZWxsIG1hYzgwMjExIG91ciBjaGFyYWN0ZXJpc3RpY3MgKi8KKwlody0+ZmxhZ3MgPQorCSAgICBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8IElFRUU4MDIxMV9IV19BTVBEVV9BR0dSRUdBVElPTiB8CisJICAgIElFRUU4MDIxMV9IV19ORUVEX0RUSU1fUEVSSU9EIHwgSUVFRTgwMjExX0hXX1NQRUNUUlVNX01HTVQgfAorCSAgICBJRUVFODAyMTFfSFdfUkVQT1JUU19UWF9BQ0tfU1RBVFVTOworCisJaWYgKGlsLT5jZmctPnNrdSAmIElMX1NLVV9OKQorCQlody0+ZmxhZ3MgfD0KKwkJICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1NNUFMgfAorCQkgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX1NUQVRJQ19TTVBTOworCisJaHctPnN0YV9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGlsX3N0YXRpb25fcHJpdik7CisJaHctPnZpZl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGlsX3ZpZl9wcml2KTsKKworCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGlsLT5jdHguaW50ZXJmYWNlX21vZGVzOworCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGlsLT5jdHguZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKKworCWh3LT53aXBoeS0+ZmxhZ3MgfD0KKwkgICAgV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB8IFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFM7CisKKwkvKgorCSAqIEZvciBub3csIGRpc2FibGUgUFMgYnkgZGVmYXVsdCBiZWNhdXNlIGl0IGFmZmVjdHMKKwkgKiBSWCBwZXJmb3JtYW5jZSBzaWduaWZpY2FudGx5LgorCSAqLworCWh3LT53aXBoeS0+ZmxhZ3MgJj0gfldJUEhZX0ZMQUdfUFNfT05fQllfREVGQVVMVDsKKworCWh3LT53aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSBQUk9CRV9PUFRJT05fTUFYOworCS8qIHdlIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciBhbmQgYSB6ZXJvLWxlbmd0aCBTU0lEIGVsZW1lbnQgKi8KKwlody0+d2lwaHktPm1heF9zY2FuX2llX2xlbiA9IG1heF9wcm9iZV9sZW5ndGggLSAyNCAtIDI7CisKKwkvKiBEZWZhdWx0IHZhbHVlOyA0IEVEQ0EgUU9TIHByaW9yaXRpZXMgKi8KKwlody0+cXVldWVzID0gNDsKKworCWh3LT5tYXhfbGlzdGVuX2ludGVydmFsID0gSUxfQ09OTl9NQVhfTElTVEVOX0lOVEVSVkFMOworCisJaWYgKGlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2NoYW5uZWxzKQorCQlpbC0+aHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9CisJCSAgICAmaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOworCWlmIChpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscykKKwkJaWwtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQorCQkgICAgJmlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKKworCWlsX2xlZHNfaW5pdChpbCk7CisKKwlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoaWwtPmh3KTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGh3IChlcnJvciAlZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQKK2lsNDk2NV9tYWNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJaW50IHJldDsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCS8qIHdlIHNob3VsZCBiZSB2ZXJpZnlpbmcgdGhlIGRldmljZSBpcyByZWFkeSB0byBiZSBvcGVuZWQgKi8KKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCXJldCA9IF9faWw0OTY1X3VwKGlsKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGlsX2lzX3Jma2lsbChpbCkpCisJCWdvdG8gb3V0OworCisJRF9JTkZPKCJTdGFydCBVUCB3b3JrIGRvbmUuXG4iKTsKKworCS8qIFdhaXQgZm9yIFNUQVJUX0FMSVZFIGZyb20gUnVuIFRpbWUgdWNvZGUuIE90aGVyd2lzZSBjYWxsYmFja3MgZnJvbQorCSAqIG1hYzgwMjExIHdpbGwgbm90IGJlIHJ1biBzdWNjZXNzZnVsbHkuICovCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGlsLT53YWl0X2NvbW1hbmRfcXVldWUsCisJCQkJIHRlc3RfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKSwKKwkJCQkgVUNPREVfUkVBRFlfVElNRU9VVCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKCF0ZXN0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cykpIHsKKwkJCUlMX0VSUigiU1RBUlRfQUxJVkUgdGltZW91dCBhZnRlciAlZG1zLlxuIiwKKwkJCQlqaWZmaWVzX3RvX21zZWNzKFVDT0RFX1JFQURZX1RJTUVPVVQpKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJfQorCisJaWw0OTY1X2xlZF9lbmFibGUoaWwpOworCitvdXQ6CisJaWwtPmlzX29wZW4gPSAxOworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAoraWw0OTY1X21hY19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWYgKCFpbC0+aXNfb3BlbikKKwkJcmV0dXJuOworCisJaWwtPmlzX29wZW4gPSAwOworCisJaWw0OTY1X2Rvd24oaWwpOworCisJZmx1c2hfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCisJLyogVXNlciBzcGFjZSBzb2Z0d2FyZSBtYXkgZXhwZWN0IGdldHRpbmcgcmZraWxsIGNoYW5nZXMKKwkgKiBldmVuIGlmIGludGVyZmFjZSBpcyBkb3duICovCisJX2lsX3dyKGlsLCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKKwlpbF9lbmFibGVfcmZraWxsX2ludChpbCk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7Cit9CisKK3ZvaWQKK2lsNDk2NV9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisKKwlEX01BQ0RVTVAoImVudGVyXG4iKTsKKworCURfVFgoImRldi0+eG1pdCglZCBieXRlcykgYXQgcmF0ZSAweCUwMnhcbiIsIHNrYi0+bGVuLAorCSAgICAgaWVlZTgwMjExX2dldF90eF9yYXRlKGh3LCBJRUVFODAyMTFfU0tCX0NCKHNrYikpLT5iaXRyYXRlKTsKKworCWlmIChpbDQ5NjVfdHhfc2tiKGlsLCBza2IpKQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJRF9NQUNEVU1QKCJsZWF2ZVxuIik7Cit9CisKK3ZvaWQKK2lsNDk2NV9tYWNfdXBkYXRlX3RraXBfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUzMiBpdjMyLCB1MTYgKiBwaGFzZTFrZXkpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJc3RydWN0IGlsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCWlsNDk2NV91cGRhdGVfdGtpcF9rZXkoaWwsIHZpZl9wcml2LT5jdHgsIGtleWNvbmYsIHN0YSwgaXYzMiwKKwkJCSAgICAgICBwaGFzZTFrZXkpOworCisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworfQorCitpbnQKK2lsNDk2NV9tYWNfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCSAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IHZpZl9wcml2LT5jdHg7CisJaW50IHJldDsKKwl1OCBzdGFfaWQ7CisJYm9vbCBpc19kZWZhdWx0X3dlcF9rZXkgPSBmYWxzZTsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCWlmIChpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5zd19jcnlwdG8pIHsKKwkJRF9NQUM4MDIxMSgibGVhdmUgLSBod2NyeXB0byBkaXNhYmxlZFxuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlzdGFfaWQgPSBpbF9zdGFfaWRfb3JfYnJvYWRjYXN0KGlsLCB2aWZfcHJpdi0+Y3R4LCBzdGEpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMTAwKTsKKworCS8qCisJICogSWYgd2UgYXJlIGdldHRpbmcgV0VQIGdyb3VwIGtleSBhbmQgd2UgZGlkbid0IHJlY2VpdmUgYW55IGtleSBtYXBwaW5nCisJICogc28gZmFyLCB3ZSBhcmUgaW4gbGVnYWN5IHdlcCBtb2RlIChncm91cCBrZXkgb25seSksIG90aGVyd2lzZSB3ZSBhcmUKKwkgKiBpbiAxWCBtb2RlLgorCSAqIEluIGxlZ2FjeSB3ZXAgbW9kZSwgd2UgdXNlIGFub3RoZXIgaG9zdCBjb21tYW5kIHRvIHRoZSB1Q29kZS4KKwkgKi8KKwlpZiAoKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8CisJICAgICBrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpICYmICFzdGEpIHsKKwkJaWYgKGNtZCA9PSBTRVRfS0VZKQorCQkJaXNfZGVmYXVsdF93ZXBfa2V5ID0gIWN0eC0+a2V5X21hcHBpbmdfa2V5czsKKwkJZWxzZQorCQkJaXNfZGVmYXVsdF93ZXBfa2V5ID0KKwkJCSAgICAoa2V5LT5od19rZXlfaWR4ID09IEhXX0tFWV9ERUZBVUxUKTsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VUX0tFWToKKwkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKKwkJCXJldCA9CisJCQkgICAgaWw0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkoaWwsIHZpZl9wcml2LT5jdHgsIGtleSk7CisJCWVsc2UKKwkJCXJldCA9CisJCQkgICAgaWw0OTY1X3NldF9keW5hbWljX2tleShpbCwgdmlmX3ByaXYtPmN0eCwga2V5LAorCQkJCQkJICAgc3RhX2lkKTsKKworCQlEX01BQzgwMjExKCJlbmFibGUgaHdjcnlwdG8ga2V5XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBESVNBQkxFX0tFWToKKwkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKKwkJCXJldCA9IGlsNDk2NV9yZW1vdmVfZGVmYXVsdF93ZXBfa2V5KGlsLCBjdHgsIGtleSk7CisJCWVsc2UKKwkJCXJldCA9IGlsNDk2NV9yZW1vdmVfZHluYW1pY19rZXkoaWwsIGN0eCwga2V5LCBzdGFfaWQpOworCisJCURfTUFDODAyMTEoImRpc2FibGUgaHdjcnlwdG8ga2V5XG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworaW50CitpbDQ5NjVfbWFjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCWVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqIHNzbiwKKwkJCXU4IGJ1Zl9zaXplKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCWludCByZXQgPSAtRUlOVkFMOworCisJRF9IVCgiQS1NUERVIGFjdGlvbiBvbiBhZGRyICVwTSB0aWQgJWRcbiIsIHN0YS0+YWRkciwgdGlkKTsKKworCWlmICghKGlsLT5jZmctPnNrdSAmIElMX1NLVV9OKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKKwkJRF9IVCgic3RhcnQgUnhcbiIpOworCQlyZXQgPSBpbDQ5NjVfc3RhX3J4X2FnZ19zdGFydChpbCwgc3RhLCB0aWQsICpzc24pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QOgorCQlEX0hUKCJzdG9wIFJ4XG4iKTsKKwkJcmV0ID0gaWw0OTY1X3N0YV9yeF9hZ2dfc3RvcChpbCwgc3RhLCB0aWQpOworCQlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOgorCQlEX0hUKCJzdGFydCBUeFxuIik7CisJCXJldCA9IGlsNDk2NV90eF9hZ2dfc3RhcnQoaWwsIHZpZiwgc3RhLCB0aWQsIHNzbik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1A6CisJCURfSFQoInN0b3AgVHhcbiIpOworCQlyZXQgPSBpbDQ5NjVfdHhfYWdnX3N0b3AoaWwsIHZpZiwgc3RhLCB0aWQpOworCQlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOgorCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50CitpbDQ5NjVfbWFjX3N0YV9hZGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlib29sIGlzX2FwID0gdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJaW50IHJldDsKKwl1OCBzdGFfaWQ7CisKKwlEX0lORk8oInJlY2VpdmVkIHJlcXVlc3QgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJRF9JTkZPKCJwcm9jZWVkaW5nIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwgc3RhLT5hZGRyKTsKKwlzdGFfcHJpdi0+Y29tbW9uLnN0YV9pZCA9IElMX0lOVkFMSURfU1RBVElPTjsKKworCWF0b21pY19zZXQoJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcywgMCk7CisKKwlyZXQgPQorCSAgICBpbF9hZGRfc3RhdGlvbl9jb21tb24oaWwsIHZpZl9wcml2LT5jdHgsIHN0YS0+YWRkciwgaXNfYXAsIHN0YSwKKwkJCQkgICZzdGFfaWQpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNICglZClcbiIsIHN0YS0+YWRkciwgcmV0KTsKKwkJLyogU2hvdWxkIHdlIHJldHVybiBzdWNjZXNzIGlmIHJldHVybiBjb2RlIGlzIEVFWElTVCA/ICovCisJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzdGFfcHJpdi0+Y29tbW9uLnN0YV9pZCA9IHN0YV9pZDsKKworCS8qIEluaXRpYWxpemUgcmF0ZSBzY2FsaW5nICovCisJRF9JTkZPKCJJbml0aWFsaXppbmcgcmF0ZSBzY2FsaW5nIGZvciBzdGF0aW9uICVwTVxuIiwgc3RhLT5hZGRyKTsKKwlpbDQ5NjVfcnNfcmF0ZV9pbml0KGlsLCBzdGEsIHN0YV9pZCk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2lsNDk2NV9tYWNfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9zd2l0Y2ggKmNoX3N3aXRjaCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBjaF9zd2l0Y2gtPmNoYW5uZWw7CisJc3RydWN0IGlsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZpbC0+Y3VycmVudF9odF9jb25maWc7CisKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwl1MTYgY2g7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCisJaWYgKGlsX2lzX3Jma2lsbChpbCkpCisJCWdvdG8gb3V0OworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlmICghaWxfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWlsLT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gpCisJCWdvdG8gb3V0OworCisJY2ggPSBjaGFubmVsLT5od192YWx1ZTsKKwlpZiAobGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCkgPT0gY2gpCisJCWdvdG8gb3V0OworCisJY2hfaW5mbyA9IGlsX2dldF9jaGFubmVsX2luZm8oaWwsIGNoYW5uZWwtPmJhbmQsIGNoKTsKKwlpZiAoIWlsX2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKKwkJRF9NQUM4MDIxMSgiaW52YWxpZCBjaGFubmVsXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaWwtPmxvY2spOworCisJaWwtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBjb25mLT5zbXBzX21vZGU7CisKKwkvKiBDb25maWd1cmUgSFQ0MCBjaGFubmVscyAqLworCWN0eC0+aHQuZW5hYmxlZCA9IGNvbmZfaXNfaHQoY29uZik7CisJaWYgKGN0eC0+aHQuZW5hYmxlZCkgeworCQlpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKSB7CisJCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9CisJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7CisJCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChjb25mX2lzX2h0NDBfcGx1cyhjb25mKSkgeworCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJICAgIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOworCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7CisJCX0gZWxzZSB7CisJCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9CisJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKKwkJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKKwkJfQorCX0gZWxzZQorCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CisKKwlpZiAoKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSAhPSBjaCkpCisJCWN0eC0+c3RhZ2luZy5mbGFncyA9IDA7CisKKwlpbF9zZXRfcnhvbl9jaGFubmVsKGlsLCBjaGFubmVsLCBjdHgpOworCWlsX3NldF9yeG9uX2h0KGlsLCBodF9jb25mKTsKKwlpbF9zZXRfZmxhZ3NfZm9yX2JhbmQoaWwsIGN0eCwgY2hhbm5lbC0+YmFuZCwgY3R4LT52aWYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZpbC0+bG9jayk7CisKKwlpbF9zZXRfcmF0ZShpbCk7CisJLyoKKwkgKiBhdCB0aGlzIHBvaW50LCBzdGFnaW5nX3J4b24gaGFzIHRoZQorCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCisJICovCisJc2V0X2JpdChTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKwlpbC0+c3dpdGNoX2NoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7CisJaWYgKGlsLT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2goaWwsIGNoX3N3aXRjaCkpIHsKKwkJY2xlYXJfYml0KFNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJmlsLT5zdGF0dXMpOworCQlpbC0+c3dpdGNoX2NoYW5uZWwgPSAwOworCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZShjdHgtPnZpZiwgZmFsc2UpOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7Cit9CisKK3ZvaWQKK2lsNDk2NV9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKKwkJCXVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsIHU2NCBtdWx0aWNhc3QpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJX19sZTMyIGZpbHRlcl9vciA9IDAsIGZpbHRlcl9uYW5kID0gMDsKKworI2RlZmluZSBDSEsodGVzdCwgZmxhZykJZG8geyBcCisJaWYgKCp0b3RhbF9mbGFncyAmICh0ZXN0KSkJCVwKKwkJZmlsdGVyX29yIHw9IChmbGFnKTsJCVwKKwllbHNlCQkJCQlcCisJCWZpbHRlcl9uYW5kIHw9IChmbGFnKTsJCVwKKwl9IHdoaWxlICgwKQorCisJRF9NQUM4MDIxMSgiRW50ZXI6IGNoYW5nZWQ6IDB4JXgsIHRvdGFsOiAweCV4XG4iLCBjaGFuZ2VkX2ZsYWdzLAorCQkgICAqdG90YWxfZmxhZ3MpOworCisJQ0hLKEZJRl9PVEhFUl9CU1MgfCBGSUZfUFJPTUlTQ19JTl9CU1MsIFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKKwkvKiBTZXR0aW5nIF9qdXN0XyBSWE9OX0ZJTFRFUl9DVEwySE9TVF9NU0sgY2F1c2VzIEZIIGVycm9ycyAqLworCUNISyhGSUZfQ09OVFJPTCwgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIHwgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOworCUNISyhGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQywgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0spOworCisjdW5kZWYgQ0hLCisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCisJaWwtPmN0eC5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+ZmlsdGVyX25hbmQ7CisJaWwtPmN0eC5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBmaWx0ZXJfb3I7CisKKwkvKgorCSAqIE5vdCBjb21taXR0aW5nIGRpcmVjdGx5IGJlY2F1c2UgaGFyZHdhcmUgY2FuIHBlcmZvcm0gYSBzY2FuLAorCSAqIGJ1dCB3ZSdsbCBldmVudHVhbGx5IGNvbW1pdCB0aGUgZmlsdGVyIGZsYWdzIGNoYW5nZSBhbnl3YXkuCisJICovCisKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwkvKgorCSAqIFJlY2VpdmluZyBhbGwgbXVsdGljYXN0IGZyYW1lcyBpcyBhbHdheXMgZW5hYmxlZCBieSB0aGUKKwkgKiBkZWZhdWx0IGZsYWdzIHNldHVwIGluIGlsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoKQorCSAqIHNpbmNlIHdlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBwcm9ncmFtbWluZyBtdWx0aWNhc3QKKwkgKiBmaWx0ZXJzIGludG8gdGhlIGRldmljZS4KKwkgKi8KKwkqdG90YWxfZmxhZ3MgJj0KKwkgICAgRklGX09USEVSX0JTUyB8IEZJRl9BTExNVUxUSSB8IEZJRl9QUk9NSVNDX0lOX0JTUyB8CisJICAgIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwgRklGX0NPTlRST0w7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGRyaXZlciBzZXR1cCBhbmQgdGVhcmRvd24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfYmdfdHhwb3dlcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGlsX3ByaXYsCisJCQkJCSAgdHhwb3dlcl93b3JrKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwkvKiBJZiBhIHNjYW4gaGFwcGVuZWQgdG8gc3RhcnQgYmVmb3JlIHdlIGdvdCBoZXJlCisJICogdGhlbiBqdXN0IHJldHVybjsgdGhlIHN0YXRzIG5vdGlmaWNhdGlvbiB3aWxsCisJICoga2ljayBvZmYgYW5vdGhlciBzY2hlZHVsZWQgd29yayB0byBjb21wZW5zYXRlIGZvcgorCSAqIGFueSB0ZW1wZXJhdHVyZSBkZWx0YSB3ZSBtaXNzZWQgaGVyZS4gKi8KKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCisJLyogUmVnYXJkbGVzcyBvZiBpZiB3ZSBhcmUgYXNzb2NpYXRlZCwgd2UgbXVzdCByZWNvbmZpZ3VyZSB0aGUKKwkgKiBUWCBwb3dlciBzaW5jZSBmcmFtZXMgY2FuIGJlIHNlbnQgb24gbm9uLXJhZGFyIGNoYW5uZWxzIHdoaWxlCisJICogbm90IGFzc29jaWF0ZWQgKi8KKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+c2VuZF90eF9wb3dlcihpbCk7CisKKwkvKiBVcGRhdGUgbGFzdF90ZW1wZXJhdHVyZSB0byBrZWVwIGlzX2NhbGliX25lZWRlZCBmcm9tIHJ1bm5pbmcKKwkgKiB3aGVuIGl0IGlzbid0IG5lZWRlZC4uLiAqLworCWlsLT5sYXN0X3RlbXBlcmF0dXJlID0gaWwtPnRlbXBlcmF0dXJlOworb3V0OgorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbC0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoRFJWX05BTUUpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmaWwtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisKKwlJTklUX1dPUksoJmlsLT5yZXN0YXJ0LCBpbDQ5NjVfYmdfcmVzdGFydCk7CisJSU5JVF9XT1JLKCZpbC0+cnhfcmVwbGVuaXNoLCBpbDQ5NjVfYmdfcnhfcmVwbGVuaXNoKTsKKwlJTklUX1dPUksoJmlsLT5ydW5fdGltZV9jYWxpYl93b3JrLCBpbDQ5NjVfYmdfcnVuX3RpbWVfY2FsaWJfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmlsLT5pbml0X2FsaXZlX3N0YXJ0LCBpbDQ5NjVfYmdfaW5pdF9hbGl2ZV9zdGFydCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmlsLT5hbGl2ZV9zdGFydCwgaWw0OTY1X2JnX2FsaXZlX3N0YXJ0KTsKKworCWlsX3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayhpbCk7CisKKwlJTklUX1dPUksoJmlsLT50eHBvd2VyX3dvcmssIGlsNDk2NV9iZ190eHBvd2VyX3dvcmspOworCisJaW5pdF90aW1lcigmaWwtPnN0YXRzX3BlcmlvZGljKTsKKwlpbC0+c3RhdHNfcGVyaW9kaWMuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWlsOworCWlsLT5zdGF0c19wZXJpb2RpYy5mdW5jdGlvbiA9IGlsNDk2NV9iZ19zdGF0c19wZXJpb2RpYzsKKworCWluaXRfdGltZXIoJmlsLT53YXRjaGRvZyk7CisJaWwtPndhdGNoZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbDsKKwlpbC0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBpbF9iZ193YXRjaGRvZzsKKworCXRhc2tsZXRfaW5pdCgmaWwtPmlycV90YXNrbGV0LAorCQkgICAgICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlpbDQ5NjVfaXJxX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpaWwpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwljYW5jZWxfd29ya19zeW5jKCZpbC0+dHhwb3dlcl93b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmlsLT5pbml0X2FsaXZlX3N0YXJ0KTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbC0+YWxpdmVfc3RhcnQpOworCWNhbmNlbF93b3JrX3N5bmMoJmlsLT5ydW5fdGltZV9jYWxpYl93b3JrKTsKKworCWlsX2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmsoaWwpOworCisJZGVsX3RpbWVyX3N5bmMoJmlsLT5zdGF0c19wZXJpb2RpYyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfaW5pdF9od19yYXRlcyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVF9MRUdBQ1k7IGkrKykgeworCQlyYXRlc1tpXS5iaXRyYXRlID0gaWxfcmF0ZXNbaV0uaWVlZSAqIDU7CisJCXJhdGVzW2ldLmh3X3ZhbHVlID0gaTsJLyogUmF0ZSBzY2FsaW5nIHdpbGwgd29yayBvbiBpZHhlcyAqLworCQlyYXRlc1tpXS5od192YWx1ZV9zaG9ydCA9IGk7CisJCXJhdGVzW2ldLmZsYWdzID0gMDsKKwkJaWYgKChpID49IElMX0ZJUlNUX0NDS19SQVRFKSAmJiAoaSA8PSBJTF9MQVNUX0NDS19SQVRFKSkgeworCQkJLyoKKwkJCSAqIElmIENDSyAhPSAxTSB0aGVuIHNldCBzaG9ydCBwcmVhbWJsZSByYXRlIGZsYWcuCisJCQkgKi8KKwkJCXJhdGVzW2ldLmZsYWdzIHw9CisJCQkgICAgKGlsX3JhdGVzW2ldLnBsY3AgPT0KKwkJCSAgICAgUkFURV8xTV9QTENQKSA/IDAgOiBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRTsKKwkJfQorCX0KK30KKworLyoKKyAqIEFjcXVpcmUgaWwtPmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhCisgKi8KK3ZvaWQKK2lsNDk2NV9zZXRfd3JfcHRycyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQsIHUzMiBpZHgpCit7CisJaWxfd3IoaWwsIEhCVVNfVEFSR19XUlBUUiwgKGlkeCAmIDB4ZmYpIHwgKHR4cV9pZCA8PCA4KSk7CisJaWxfd3JfcHJwaChpbCwgSUw0OV9TQ0RfUVVFVUVfUkRQVFIodHhxX2lkKSwgaWR4KTsKK30KKwordm9pZAoraWw0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwKKwkJCSAgIGludCB0eF9maWZvX2lkLCBpbnQgc2NkX3JldHJ5KQoreworCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7CisKKwkvKiBGaW5kIG91dCB3aGV0aGVyIHRvIGFjdGl2YXRlIFR4IHF1ZXVlICovCisJaW50IGFjdGl2ZSA9IHRlc3RfYml0KHR4cV9pZCwgJmlsLT50eHFfY3R4X2FjdGl2ZV9tc2spID8gMSA6IDA7CisKKwkvKiBTZXQgdXAgYW5kIGFjdGl2YXRlICovCisJaWxfd3JfcHJwaChpbCwgSUw0OV9TQ0RfUVVFVUVfU1RBVFVTX0JJVFModHhxX2lkKSwKKwkJICAgKGFjdGl2ZSA8PCBJTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfQUNUSVZFKSB8CisJCSAgICh0eF9maWZvX2lkIDw8IElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19UWEYpIHwKKwkJICAgKHNjZF9yZXRyeSA8PCBJTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfV1NMKSB8CisJCSAgIChzY2RfcmV0cnkgPDwgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ0spIHwKKwkJICAgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfTVNLKTsKKworCXR4cS0+c2NoZWRfcmV0cnkgPSBzY2RfcmV0cnk7CisKKwlEX0lORk8oIiVzICVzIFF1ZXVlICVkIG9uIEFDICVkXG4iLCBhY3RpdmUgPyAiQWN0aXZhdGUiIDogIkRlYWN0aXZhdGUiLAorCSAgICAgICBzY2RfcmV0cnkgPyAiQkEiIDogIkFDIiwgdHhxX2lkLCB0eF9maWZvX2lkKTsKK30KKworc3RhdGljIGludAoraWw0OTY1X2luaXRfZHJ2KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2luaXQoJmlsLT5zdGFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlsLT5oY21kX2xvY2spOworCisJSU5JVF9MSVNUX0hFQUQoJmlsLT5mcmVlX2ZyYW1lcyk7CisKKwltdXRleF9pbml0KCZpbC0+bXV0ZXgpOworCisJaWwtPmllZWVfY2hhbm5lbHMgPSBOVUxMOworCWlsLT5pZWVlX3JhdGVzID0gTlVMTDsKKwlpbC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisKKwlpbC0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJaWwtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBJRUVFODAyMTFfU01QU19TVEFUSUM7CisJaWwtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkID0gSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOworCisJLyogaW5pdGlhbGl6ZSBmb3JjZSByZXNldCAqLworCWlsLT5mb3JjZV9yZXNldC5yZXNldF9kdXJhdGlvbiA9IElMX0RFTEFZX05FWFRfRk9SQ0VfRldfUkVMT0FEOworCisJLyogQ2hvb3NlIHdoaWNoIHJlY2VpdmVycy9hbnRlbm5hcyB0byB1c2UgKi8KKwlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKKwkJaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihpbCwgJmlsLT5jdHgpOworCisJaWxfaW5pdF9zY2FuX3BhcmFtcyhpbCk7CisKKwlyZXQgPSBpbF9pbml0X2NoYW5uZWxfbWFwKGlsKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiaW5pdGlhbGl6aW5nIHJlZ3VsYXRvcnkgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gaWxfaW5pdF9nZW9zKGlsKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiaW5pdGlhbGl6aW5nIGdlb3MgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZnJlZV9jaGFubmVsX21hcDsKKwl9CisJaWw0OTY1X2luaXRfaHdfcmF0ZXMoaWwsIGlsLT5pZWVlX3JhdGVzKTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9jaGFubmVsX21hcDoKKwlpbF9mcmVlX2NoYW5uZWxfbWFwKGlsKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3VuaW5pdF9kcnYoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsNDk2NV9jYWxpYl9mcmVlX3Jlc3VsdHMoaWwpOworCWlsX2ZyZWVfZ2VvcyhpbCk7CisJaWxfZnJlZV9jaGFubmVsX21hcChpbCk7CisJa2ZyZWUoaWwtPnNjYW5fY21kKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9od19kZXRlY3Qoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT5od19yZXYgPSBfaWxfcmQoaWwsIENTUl9IV19SRVYpOworCWlsLT5od193YV9yZXYgPSBfaWxfcmQoaWwsIENTUl9IV19SRVZfV0FfUkVHKTsKKwlpbC0+cmV2X2lkID0gaWwtPnBjaV9kZXYtPnJldmlzaW9uOworCURfSU5GTygiSFcgUmV2aXNpb24gSUQgPSAweCVYXG4iLCBpbC0+cmV2X2lkKTsKK30KKworc3RhdGljIGludAoraWw0OTY1X3NldF9od19wYXJhbXMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT5od19wYXJhbXMubWF4X3J4cV9zaXplID0gUlhfUVVFVUVfU0laRTsKKwlpbC0+aHdfcGFyYW1zLm1heF9yeHFfbG9nID0gUlhfUVVFVUVfU0laRV9MT0c7CisJaWYgKGlsLT5jZmctPm1vZF9wYXJhbXMtPmFtc2R1X3NpemVfOEspCisJCWlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA9IGdldF9vcmRlcihJTF9SWF9CVUZfU0laRV84Syk7CisJZWxzZQorCQlpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIgPSBnZXRfb3JkZXIoSUxfUlhfQlVGX1NJWkVfNEspOworCisJaWwtPmh3X3BhcmFtcy5tYXhfYmVhY29uX2l0cnZsID0gSUxfTUFYX1VDT0RFX0JFQUNPTl9JTlRFUlZBTDsKKworCWlmIChpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5kaXNhYmxlXzExbikKKwkJaWwtPmNmZy0+c2t1ICY9IH5JTF9TS1VfTjsKKworCS8qIERldmljZS1zcGVjaWZpYyBzZXR1cCAqLworCXJldHVybiBpbC0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2h3X3BhcmFtcyhpbCk7Cit9CisKK3N0YXRpYyBjb25zdCB1OCBpbDQ5NjVfYnNzX2FjX3RvX2ZpZm9bXSA9IHsKKwlJTF9UWF9GSUZPX1ZPLAorCUlMX1RYX0ZJRk9fVkksCisJSUxfVFhfRklGT19CRSwKKwlJTF9UWF9GSUZPX0JLLAorfTsKKworc3RhdGljIGNvbnN0IHU4IGlsNDk2NV9ic3NfYWNfdG9fcXVldWVbXSA9IHsKKwkwLCAxLCAyLCAzLAorfTsKKworc3RhdGljIGludAoraWw0OTY1X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJc3RydWN0IGlsX2NmZyAqY2ZnID0gKHN0cnVjdCBpbF9jZmcgKikoZW50LT5kcml2ZXJfZGF0YSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgcGNpX2NtZDsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAxLiBBbGxvY2F0aW5nIEhXIGRhdGEKKwkgKioqKioqKioqKioqKioqKioqKioqKioqLworCisJaHcgPSBpbF9hbGxvY19hbGwoY2ZnKTsKKwlpZiAoIWh3KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlpbCA9IGh3LT5wcml2OworCS8qIEF0IHRoaXMgcG9pbnQgYm90aCBodyBhbmQgaWwgYXJlIGFsbG9jYXRlZC4gKi8KKworCWlsLT5jdHguY3R4aWQgPSAwOworCisJaWwtPmN0eC5hbHdheXNfYWN0aXZlID0gdHJ1ZTsKKwlpbC0+Y3R4LmlzX2FjdGl2ZSA9IHRydWU7CisJaWwtPmN0eC5yeG9uX2NtZCA9IENfUlhPTjsKKwlpbC0+Y3R4LnJ4b25fdGltaW5nX2NtZCA9IENfUlhPTl9USU1JTkc7CisJaWwtPmN0eC5yeG9uX2Fzc29jX2NtZCA9IENfUlhPTl9BU1NPQzsKKwlpbC0+Y3R4LnFvc19jbWQgPSBDX1FPU19QQVJBTTsKKwlpbC0+Y3R4LmFwX3N0YV9pZCA9IElMX0FQX0lEOworCWlsLT5jdHgud2VwX2tleV9jbWQgPSBDX1dFUEtFWTsKKwlpbC0+Y3R4LmFjX3RvX2ZpZm8gPSBpbDQ5NjVfYnNzX2FjX3RvX2ZpZm87CisJaWwtPmN0eC5hY190b19xdWV1ZSA9IGlsNDk2NV9ic3NfYWNfdG9fcXVldWU7CisJaWwtPmN0eC5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzID0gQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKTsKKwlpbC0+Y3R4LmludGVyZmFjZV9tb2RlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKTsKKwlpbC0+Y3R4LmFwX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0FQOworCWlsLT5jdHguaWJzc19kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9JQlNTOworCWlsLT5jdHguc3RhdGlvbl9kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7CisJaWwtPmN0eC51bnVzZWRfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfRVNTOworCisJU0VUX0lFRUU4MDIxMV9ERVYoaHcsICZwZGV2LT5kZXYpOworCisJRF9JTkZPKCIqKiogTE9BRCBEUklWRVIgKioqXG4iKTsKKwlpbC0+Y2ZnID0gY2ZnOworCWlsLT5wY2lfZGV2ID0gcGRldjsKKwlpbC0+aW50YV9tYXNrID0gQ1NSX0lOSV9TRVRfTUFTSzsKKworCWlmIChpbF9hbGxvY190cmFmZmljX21lbShpbCkpCisJCUlMX0VSUigiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogMi4gSW5pdGlhbGl6aW5nIFBDSSBidXMKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJcGNpX2Rpc2FibGVfbGlua19zdGF0ZShwZGV2LAorCQkJICAgICAgIFBDSUVfTElOS19TVEFURV9MMFMgfCBQQ0lFX0xJTktfU1RBVEVfTDEgfAorCQkJICAgICAgIFBDSUVfTElOS19TVEFURV9DTEtQTSk7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfaWVlZTgwMjExX2ZyZWVfaHc7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzNikpOworCWlmICghZXJyKQorCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM2KSk7CisJaWYgKGVycikgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAoIWVycikKKwkJCWVyciA9CisJCQkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQkvKiBib3RoIGF0dGVtcHRzIGZhaWxlZDogKi8KKwkJaWYgKGVycikgeworCQkJSUxfV0FSTigiTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOworCQkJZ290byBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOworCQl9CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGlsKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDMuIFJlYWQgUkVWIHJlZ2lzdGVyCisJICoqKioqKioqKioqKioqKioqKioqKioqLworCWlsLT5od19iYXNlID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOworCWlmICghaWwtPmh3X2Jhc2UpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwlEX0lORk8oInBjaV9yZXNvdXJjZV9sZW4gPSAweCUwOGxseFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlEX0lORk8oInBjaV9yZXNvdXJjZV9iYXNlID0gJXBcbiIsIGlsLT5od19iYXNlKTsKKworCS8qIHRoZXNlIHNwaW4gbG9ja3Mgd2lsbCBiZSB1c2VkIGluIGFwbV9vcHMuaW5pdCBhbmQgRUVQUk9NIGFjY2VzcworCSAqIHdlIHNob3VsZCBpbml0IG5vdworCSAqLworCXNwaW5fbG9ja19pbml0KCZpbC0+cmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpbC0+bG9jayk7CisKKwkvKgorCSAqIHN0b3AgYW5kIHJlc2V0IHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IganVzdCBpbiBjYXNlIGl0IGlzIGluIGEKKwkgKiBzdHJhbmdlIHN0YXRlIC4uLiBsaWtlIGJlaW5nIGxlZnQgc3RyYW5kZWQgYnkgYSBwcmltYXJ5IGtlcm5lbAorCSAqIGFuZCB0aGlzIGlzIG5vdyB0aGUga2R1bXAga2VybmVsIHRyeWluZyB0byBzdGFydCB1cAorCSAqLworCV9pbF93cihpbCwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7CisKKwlpbDQ5NjVfaHdfZGV0ZWN0KGlsKTsKKwlJTF9JTkZPKCJEZXRlY3RlZCAlcywgUkVWPTB4JVhcbiIsIGlsLT5jZmctPm5hbWUsIGlsLT5od19yZXYpOworCisJLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAorCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGR19SRVRSWV9USU1FT1VULCAweDAwKTsKKworCWlsNDk2NV9wcmVwYXJlX2NhcmRfaHcoaWwpOworCWlmICghaWwtPmh3X3JlYWR5KSB7CisJCUlMX1dBUk4oIkZhaWxlZCwgSFcgbm90IHJlYWR5XG4iKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisKKwkvKioqKioqKioqKioqKioqKioKKwkgKiA0LiBSZWFkIEVFUFJPTQorCSAqKioqKioqKioqKioqKioqKi8KKwkvKiBSZWFkIHRoZSBFRVBST00gKi8KKwllcnIgPSBpbF9lZXByb21faW5pdChpbCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0IEVFUFJPTVxuIik7CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCWVyciA9IGlsNDk2NV9lZXByb21fY2hlY2tfdmVyc2lvbihpbCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9lZXByb207CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2VlcHJvbTsKKworCS8qIGV4dHJhY3QgTUFDIEFkZHJlc3MgKi8KKwlpbDQ5NjVfZWVwcm9tX2dldF9tYWMoaWwsIGlsLT5hZGRyZXNzZXNbMF0uYWRkcik7CisJRF9JTkZPKCJNQUMgYWRkcmVzczogJXBNXG4iLCBpbC0+YWRkcmVzc2VzWzBdLmFkZHIpOworCWlsLT5ody0+d2lwaHktPmFkZHJlc3NlcyA9IGlsLT5hZGRyZXNzZXM7CisJaWwtPmh3LT53aXBoeS0+bl9hZGRyZXNzZXMgPSAxOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDUuIFNldHVwIEhXIGNvbnN0YW50cworCSAqKioqKioqKioqKioqKioqKioqKioqKiovCisJaWYgKGlsNDk2NV9zZXRfaHdfcGFyYW1zKGlsKSkgeworCQlJTF9FUlIoImZhaWxlZCB0byBzZXQgaHcgcGFyYW1ldGVyc1xuIik7CisJCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOworCX0KKworCS8qKioqKioqKioqKioqKioqKioqCisJICogNi4gU2V0dXAgaWwKKwkgKioqKioqKioqKioqKioqKioqKi8KKworCWVyciA9IGlsNDk2NV9pbml0X2RydihpbCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9lZXByb207CisJLyogQXQgdGhpcyBwb2ludCBib3RoIGh3IGFuZCBpbCBhcmUgaW5pdGlhbGl6ZWQuICovCisKKwkvKioqKioqKioqKioqKioqKioqKioKKwkgKiA3LiBTZXR1cCBzZXJ2aWNlcworCSAqKioqKioqKioqKioqKioqKioqKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbF9kaXNhYmxlX2ludGVycnVwdHMoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlwY2lfZW5hYmxlX21zaShpbC0+cGNpX2Rldik7CisKKwllcnIgPSByZXF1ZXN0X2lycShpbC0+cGNpX2Rldi0+aXJxLCBpbF9pc3IsIElSUUZfU0hBUkVELCBEUlZfTkFNRSwgaWwpOworCWlmIChlcnIpIHsKKwkJSUxfRVJSKCJFcnJvciBhbGxvY2F0aW5nIElSUSAlZFxuIiwgaWwtPnBjaV9kZXYtPmlycSk7CisJCWdvdG8gb3V0X2Rpc2FibGVfbXNpOworCX0KKworCWlsNDk2NV9zZXR1cF9kZWZlcnJlZF93b3JrKGlsKTsKKwlpbDQ5NjVfc2V0dXBfaGFuZGxlcnMoaWwpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDguIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZWFkIFJGS0lMTCBzdGF0ZQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBlbmFibGUgcmZraWxsIGludGVycnVwdDogaHcgYnVnIHcvYSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGlsLT5wY2lfZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCWlmIChwY2lfY21kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7CisJCXBjaV9jbWQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGlsLT5wY2lfZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NtZCk7CisJfQorCisJaWxfZW5hYmxlX3Jma2lsbF9pbnQoaWwpOworCisJLyogSWYgcGxhdGZvcm0ncyBSRl9LSUxMIHN3aXRjaCBpcyBOT1Qgc2V0IHRvIEtJTEwgKi8KKwlpZiAoX2lsX3JkKGlsLCBDU1JfR1BfQ05UUkwpICYgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpCisJCWNsZWFyX2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwllbHNlCisJCXNldF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisKKwl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKGlsLT5ody0+d2lwaHksCisJCQkJICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKSk7CisKKwlpbF9wb3dlcl9pbml0aWFsaXplKGlsKTsKKworCWluaXRfY29tcGxldGlvbigmaWwtPl80OTY1LmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOworCisJZXJyID0gaWw0OTY1X3JlcXVlc3RfZmlybXdhcmUoaWwsIHRydWUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2Rlc3Ryb3lfd29ya3F1ZXVlOworCisJcmV0dXJuIDA7CisKK291dF9kZXN0cm95X3dvcmtxdWV1ZToKKwlkZXN0cm95X3dvcmtxdWV1ZShpbC0+d29ya3F1ZXVlKTsKKwlpbC0+d29ya3F1ZXVlID0gTlVMTDsKKwlmcmVlX2lycShpbC0+cGNpX2Rldi0+aXJxLCBpbCk7CitvdXRfZGlzYWJsZV9tc2k6CisJcGNpX2Rpc2FibGVfbXNpKGlsLT5wY2lfZGV2KTsKKwlpbDQ5NjVfdW5pbml0X2RydihpbCk7CitvdXRfZnJlZV9lZXByb206CisJaWxfZWVwcm9tX2ZyZWUoaWwpOworb3V0X2lvdW5tYXA6CisJcGNpX2lvdW5tYXAocGRldiwgaWwtPmh3X2Jhc2UpOworb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK291dF9pZWVlODAyMTFfZnJlZV9odzoKKwlpbF9mcmVlX3RyYWZmaWNfbWVtKGlsKTsKKwlpZWVlODAyMTFfZnJlZV9odyhpbC0+aHcpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAoraWw0OTY1X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWlsKQorCQlyZXR1cm47CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpbC0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7CisKKwlEX0lORk8oIioqKiBVTkxPQUQgRFJJVkVSICoqKlxuIik7CisKKwlpbF9kYmdmc191bnJlZ2lzdGVyKGlsKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaWxfYXR0cmlidXRlX2dyb3VwKTsKKworCS8qIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IGNhbGwgd2lsIGNhdXNlIGlsX21hY19zdG9wIHRvCisJICogdG8gYmUgY2FsbGVkIGFuZCBpbDQ5NjVfZG93biBzaW5jZSB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGRldmljZQorCSAqIHdlIG5lZWQgdG8gc2V0IFNfRVhJVF9QRU5ESU5HIGJpdC4KKwkgKi8KKwlzZXRfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cyk7CisKKwlpbF9sZWRzX2V4aXQoaWwpOworCisJaWYgKGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkKSB7CisJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGlsLT5odyk7CisJCWlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMDsKKwl9IGVsc2UgeworCQlpbDQ5NjVfZG93bihpbCk7CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgZGV2aWNlIGlzIHJlc2V0IHRvIGxvdyBwb3dlciBiZWZvcmUgdW5sb2FkaW5nIGRyaXZlci4KKwkgKiBUaGlzIG1heSBiZSByZWR1bmRhbnQgd2l0aCBpbDQ5NjVfZG93bigpLCBidXQgdGhlcmUgYXJlIHBhdGhzIHRvCisJICogcnVuIGlsNDk2NV9kb3duKCkgd2l0aG91dCBjYWxsaW5nIGFwbV9vcHMuc3RvcCgpLCBhbmQgdGhlcmUgYXJlCisJICogcGF0aHMgdG8gYXZvaWQgcnVubmluZyBpbDQ5NjVfZG93bigpIGF0IGFsbCBiZWZvcmUgbGVhdmluZyBkcml2ZXIuCisJICogVGhpcyAoaW5leHBlbnNpdmUpIGNhbGwgKm1ha2VzIHN1cmUqIGRldmljZSBpcyByZXNldC4KKwkgKi8KKwlpbF9hcG1fc3RvcChpbCk7CisKKwkvKiBtYWtlIHN1cmUgd2UgZmx1c2ggYW55IHBlbmRpbmcgaXJxIG9yCisJICogdGFza2xldCBmb3IgdGhlIGRyaXZlcgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlsNDk2NV9zeW5jaHJvbml6ZV9pcnEoaWwpOworCisJaWw0OTY1X2RlYWxsb2NfdWNvZGVfcGNpKGlsKTsKKworCWlmIChpbC0+cnhxLmJkKQorCQlpbDQ5NjVfcnhfcXVldWVfZnJlZShpbCwgJmlsLT5yeHEpOworCWlsNDk2NV9od190eHFfY3R4X2ZyZWUoaWwpOworCisJaWxfZWVwcm9tX2ZyZWUoaWwpOworCisJLypuZXRpZl9zdG9wX3F1ZXVlKGRldik7ICovCisJZmx1c2hfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCisJLyogaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcgY2FsbHMgaWxfbWFjX3N0b3AsIHdoaWNoIGZsdXNoZXMKKwkgKiBpbC0+d29ya3F1ZXVlLi4uIHNvIHdlIGNhbid0IHRha2UgZG93biB0aGUgd29ya3F1ZXVlCisJICogdW50aWwgbm93Li4uICovCisJZGVzdHJveV93b3JrcXVldWUoaWwtPndvcmtxdWV1ZSk7CisJaWwtPndvcmtxdWV1ZSA9IE5VTEw7CisJaWxfZnJlZV90cmFmZmljX21lbShpbCk7CisKKwlmcmVlX2lycShpbC0+cGNpX2Rldi0+aXJxLCBpbCk7CisJcGNpX2Rpc2FibGVfbXNpKGlsLT5wY2lfZGV2KTsKKwlwY2lfaW91bm1hcChwZGV2LCBpbC0+aHdfYmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJaWw0OTY1X3VuaW5pdF9kcnYoaWwpOworCisJZGV2X2tmcmVlX3NrYihpbC0+YmVhY29uX3NrYik7CisKKwlpZWVlODAyMTFfZnJlZV9odyhpbC0+aHcpOworfQorCisvKgorICogQWN0aXZhdGUvRGVhY3RpdmF0ZSBUeCBETUEvRklGTyBjaGFubmVscyBhY2NvcmRpbmcgdHggZmlmb3MgbWFzaworICogbXVzdCBiZSBjYWxsZWQgdW5kZXIgaWwtPmxvY2sgYW5kIG1hYyBhY2Nlc3MKKyAqLwordm9pZAoraWw0OTY1X3R4cV9zZXRfc2NoZWQoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgbWFzaykKK3sKKwlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9UWEZBQ1QsIG1hc2spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBkcml2ZXIgYW5kIG1vZHVsZSBlbnRyeSBwb2ludAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGFyZHdhcmUgc3BlY2lmaWMgZmlsZSBkZWZpbmVzIHRoZSBQQ0kgSURzIHRhYmxlIGZvciB0aGF0IGhhcmR3YXJlIG1vZHVsZSAqLworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGlsNDk2NV9od19jYXJkX2lkcykgPSB7CisJe0lMX1BDSV9ERVZJQ0UoMHg0MjI5LCBQQ0lfQU5ZX0lELCBpbDQ5NjVfY2ZnKX0sCisJe0lMX1BDSV9ERVZJQ0UoMHg0MjMwLCBQQ0lfQU5ZX0lELCBpbDQ5NjVfY2ZnKX0sCisJezB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlsNDk2NV9od19jYXJkX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpbDQ5NjVfZHJpdmVyID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmlkX3RhYmxlID0gaWw0OTY1X2h3X2NhcmRfaWRzLAorCS5wcm9iZSA9IGlsNDk2NV9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGlsNDk2NV9wY2lfcmVtb3ZlKSwKKwkuZHJpdmVyLnBtID0gSUxfTEVHQUNZX1BNX09QUywKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitpbDQ5NjVfaW5pdCh2b2lkKQoreworCisJaW50IHJldDsKKwlwcl9pbmZvKERSVl9ERVNDUklQVElPTiAiLCAiIERSVl9WRVJTSU9OICJcbiIpOworCXByX2luZm8oRFJWX0NPUFlSSUdIVCAiXG4iKTsKKworCXJldCA9IGlsNDk2NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIHJhdGUgY29udHJvbCBhbGdvcml0aG06ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlsNDk2NV9kcml2ZXIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKKwkJZ290byBlcnJvcl9yZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJvcl9yZWdpc3RlcjoKKwlpbDQ5NjVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2lsNDk2NV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpbDQ5NjVfZHJpdmVyKTsKKwlpbDQ5NjVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKK30KKworbW9kdWxlX2V4aXQoaWw0OTY1X2V4aXQpOworbW9kdWxlX2luaXQoaWw0OTY1X2luaXQpOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGlsX2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgb3V0cHV0IG1hc2siKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW1fbmFtZWQoc3djcnlwdG8sIGlsNDk2NV9tb2RfcGFyYW1zLnN3X2NyeXB0bywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Moc3djcnlwdG8sICJ1c2luZyBjcnlwdG8gaW4gc29mdHdhcmUgKGRlZmF1bHQgMCBbaGFyZHdhcmVdKSIpOworbW9kdWxlX3BhcmFtX25hbWVkKHF1ZXVlc19udW0sIGlsNDk2NV9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXMsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHF1ZXVlc19udW0sICJudW1iZXIgb2YgaHcgcXVldWVzLiIpOworbW9kdWxlX3BhcmFtX25hbWVkKDExbl9kaXNhYmxlLCBpbDQ5NjVfbW9kX3BhcmFtcy5kaXNhYmxlXzExbiwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoMTFuX2Rpc2FibGUsICJkaXNhYmxlIDExbiBmdW5jdGlvbmFsaXR5Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoYW1zZHVfc2l6ZV84SywgaWw0OTY1X21vZF9wYXJhbXMuYW1zZHVfc2l6ZV84SywgaW50LAorCQkgICBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoYW1zZHVfc2l6ZV84SywgImVuYWJsZSA4SyBhbXNkdSBzaXplIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZndfcmVzdGFydCwgaWw0OTY1X21vZF9wYXJhbXMucmVzdGFydF9mdywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZndfcmVzdGFydCwgInJlc3RhcnQgZmlybXdhcmUgaW4gY2FzZSBvZiBlcnJvciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1ycy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2QwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LXJzLmMKQEAgLTAsMCArMSwyODYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICI0OTY1LmgiCisKKyNkZWZpbmUgSUw0OTY1X1JTX05BTUUgIml3bC00OTY1LXJzIgorCisjZGVmaW5lIE5VTV9UUllfQkVGT1JFX0FOVF9UT0dHTEUgMQorI2RlZmluZSBJTF9OVU1CRVJfVFJZICAgICAgMQorI2RlZmluZSBJTF9IVF9OVU1CRVJfVFJZICAgMworCisjZGVmaW5lIFJBVEVfTUFYX1dJTkRPVwkJNjIJLyogIyB0eCBpbiBoaXN0b3J5IHdpbiAqLworI2RlZmluZSBSQVRFX01JTl9GQUlMVVJFX1RICQk2CS8qIG1pbiBmYWlsdXJlcyB0byBjYWxjIHRwdCAqLworI2RlZmluZSBSQVRFX01JTl9TVUNDRVNTX1RICQk4CS8qIG1pbiBzdWNjZXNzZXMgdG8gY2FsYyB0cHQgKi8KKworLyogbWF4IGFsbG93ZWQgcmF0ZSBtaXNzIGJlZm9yZSBzeW5jIExRIGNtZCAqLworI2RlZmluZSBJTF9NSVNTRURfUkFURV9NQVgJCTE1CisvKiBtYXggdGltZSB0byBhY2N1bSBoaXN0b3J5IDIgc2Vjb25kcyAqLworI2RlZmluZSBSQVRFX1NDQUxFX0ZMVVNIX0lOVFZMICAgKDMqSFopCisKK3N0YXRpYyB1OCByc19odF90b19sZWdhY3lbXSA9IHsKKwlSQVRFXzZNX0lEWCwgUkFURV82TV9JRFgsCisJUkFURV82TV9JRFgsIFJBVEVfNk1fSURYLAorCVJBVEVfNk1fSURYLAorCVJBVEVfNk1fSURYLCBSQVRFXzlNX0lEWCwKKwlSQVRFXzEyTV9JRFgsIFJBVEVfMThNX0lEWCwKKwlSQVRFXzI0TV9JRFgsIFJBVEVfMzZNX0lEWCwKKwlSQVRFXzQ4TV9JRFgsIFJBVEVfNTRNX0lEWAorfTsKKworc3RhdGljIGNvbnN0IHU4IGFudF90b2dnbGVfbG9va3VwW10gPSB7CisJLypBTlRfTk9ORSAtPiAqLyBBTlRfTk9ORSwKKwkvKkFOVF9BICAgIC0+ICovIEFOVF9CLAorCS8qQU5UX0IgICAgLT4gKi8gQU5UX0MsCisJLypBTlRfQUIgICAtPiAqLyBBTlRfQkMsCisJLypBTlRfQyAgICAtPiAqLyBBTlRfQSwKKwkvKkFOVF9BQyAgIC0+ICovIEFOVF9BQiwKKwkvKkFOVF9CQyAgIC0+ICovIEFOVF9BQywKKwkvKkFOVF9BQkMgIC0+ICovIEFOVF9BQkMsCit9OworCisjZGVmaW5lIElMX0RFQ0xBUkVfUkFURV9JTkZPKHIsIHMsIGlwLCBpbiwgcnAsIHJuLCBwcCwgbnApICAgIFwKKwlbUkFURV8jI3IjI01fSURYXSA9IHsgUkFURV8jI3IjI01fUExDUCwgICAgICBcCisJCQkJICAgIFJBVEVfU0lTT18jI3MjI01fUExDUCwgXAorCQkJCSAgICBSQVRFX01JTU8yXyMjcyMjTV9QTENQLFwKKwkJCQkgICAgUkFURV8jI3IjI01fSUVFRSwgICAgICBcCisJCQkJICAgIFJBVEVfIyNpcCMjTV9JRFgsICAgIFwKKwkJCQkgICAgUkFURV8jI2luIyNNX0lEWCwgICAgXAorCQkJCSAgICBSQVRFXyMjcnAjI01fSURYLCAgICBcCisJCQkJICAgIFJBVEVfIyNybiMjTV9JRFgsICAgIFwKKwkJCQkgICAgUkFURV8jI3BwIyNNX0lEWCwgICAgXAorCQkJCSAgICBSQVRFXyMjbnAjI01fSURYIH0KKworLyoKKyAqIFBhcmFtZXRlciBvcmRlcjoKKyAqICAgcmF0ZSwgaHQgcmF0ZSwgcHJldiByYXRlLCBuZXh0IHJhdGUsIHByZXYgdGdnIHJhdGUsIG5leHQgdGdnIHJhdGUKKyAqCisgKiBJZiB0aGVyZSBpc24ndCBhIHZhbGlkIG5leHQgb3IgcHJldmlvdXMgcmF0ZSB0aGVuIElOViBpcyB1c2VkIHdoaWNoCisgKiBtYXBzIHRvIFJBVEVfSU5WQUxJRAorICoKKyAqLworY29uc3Qgc3RydWN0IGlsX3JhdGVfaW5mbyBpbF9yYXRlc1tSQVRFX0NPVU5UXSA9IHsKKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygxLCBJTlYsIElOViwgMiwgSU5WLCAyLCBJTlYsIDIpLAkvKiAgMW1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygyLCBJTlYsIDEsIDUsIDEsIDUsIDEsIDUpLAkJLyogIDJtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oNSwgSU5WLCAyLCA2LCAyLCAxMSwgMiwgMTEpLAkvKjUuNW1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygxMSwgSU5WLCA5LCAxMiwgOSwgMTIsIDUsIDE4KSwJLyogMTFtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oNiwgNiwgNSwgOSwgNSwgMTEsIDUsIDExKSwJCS8qICA2bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDksIDYsIDYsIDExLCA2LCAxMSwgNSwgMTEpLAkvKiAgOW1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygxMiwgMTIsIDExLCAxOCwgMTEsIDE4LCAxMSwgMTgpLAkvKiAxMm1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygxOCwgMTgsIDEyLCAyNCwgMTIsIDI0LCAxMSwgMjQpLAkvKiAxOG1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygyNCwgMjQsIDE4LCAzNiwgMTgsIDM2LCAxOCwgMzYpLAkvKiAyNG1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygzNiwgMzYsIDI0LCA0OCwgMjQsIDQ4LCAyNCwgNDgpLAkvKiAzNm1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTyg0OCwgNDgsIDM2LCA1NCwgMzYsIDU0LCAzNiwgNTQpLAkvKiA0OG1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTyg1NCwgNTQsIDQ4LCBJTlYsIDQ4LCBJTlYsIDQ4LCBJTlYpLC8qIDU0bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDYwLCA2MCwgNDgsIElOViwgNDgsIElOViwgNDgsIElOViksLyogNjBtYnBzICovCit9OworCitzdGF0aWMgaW50CitpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHUzMiByYXRlX25fZmxhZ3MpCit7CisJaW50IGlkeCA9IDA7CisKKwkvKiBIVCByYXRlIGZvcm1hdCAqLworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spIHsKKwkJaWR4ID0gKHJhdGVfbl9mbGFncyAmIDB4ZmYpOworCisJCWlmIChpZHggPj0gUkFURV9NSU1PMl82TV9QTENQKQorCQkJaWR4ID0gaWR4IC0gUkFURV9NSU1PMl82TV9QTENQOworCisJCWlkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJCS8qIHNraXAgOU0gbm90IHN1cHBvcnRlZCBpbiBodCAqLworCQlpZiAoaWR4ID49IFJBVEVfOU1fSURYKQorCQkJaWR4ICs9IDE7CisJCWlmIChpZHggPj0gSUxfRklSU1RfT0ZETV9SQVRFICYmIGlkeCA8PSBJTF9MQVNUX09GRE1fUkFURSkKKwkJCXJldHVybiBpZHg7CisKKwkJLyogbGVnYWN5IHJhdGUgZm9ybWF0LCBzZWFyY2ggZm9yIG1hdGNoIGluIHRhYmxlICovCisJfSBlbHNlIHsKKwkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKGlsX3JhdGVzKTsgaWR4KyspCisJCQlpZiAoaWxfcmF0ZXNbaWR4XS5wbGNwID09IChyYXRlX25fZmxhZ3MgJiAweEZGKSkKKwkJCQlyZXR1cm4gaWR4OworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgaWw0OTY1X3JzX3JhdGVfc2NhbGVfcGVyZm9ybShzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCQkJIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSk7CitzdGF0aWMgdm9pZCBpbDQ5NjVfcnNfZmlsbF9saW5rX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJICAgIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwgdTMyIHJhdGVfbl9mbGFncyk7CitzdGF0aWMgdm9pZCBpbDQ5NjVfcnNfc3RheV9pbl90YWJsZShzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkJICAgIGJvb2wgZm9yY2Vfc2VhcmNoKTsKKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCitzdGF0aWMgdm9pZCBpbDQ5NjVfcnNfZGJnZnNfc2V0X21jcyhzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkJICAgIHUzMiAqcmF0ZV9uX2ZsYWdzLCBpbnQgaWR4KTsKKyNlbHNlCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX2RiZ2ZzX3NldF9tY3Moc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLCB1MzIgKiByYXRlX25fZmxhZ3MsIGludCBpZHgpCit7Cit9CisjZW5kaWYKKworLyoqCisgKiBUaGUgZm9sbG93aW5nIHRhYmxlcyBjb250YWluIHRoZSBleHBlY3RlZCB0aHJvdWdocHV0IG1ldHJpY3MgZm9yIGFsbCByYXRlcworICoKKyAqCTEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDYwIE1CaXRzCisgKgorICogd2hlcmUgaW52YWxpZCBlbnRyaWVzIGFyZSB6ZXJvcy4KKyAqCisgKiBDQ0sgcmF0ZXMgYXJlIG9ubHkgdmFsaWQgaW4gbGVnYWN5IHRhYmxlIGFuZCB3aWxsIG9ubHkgYmUgdXNlZCBpbiBHCisgKiAoMi40IEdIeikgYmFuZC4KKyAqLworCitzdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9sZWdhY3lbUkFURV9DT1VOVF0gPSB7CisJNywgMTMsIDM1LCA1OCwgNDAsIDU3LCA3MiwgOTgsIDEyMSwgMTU0LCAxNzcsIDE4NiwgMAorfTsKKworc3RhdGljIHMzMiBleHBlY3RlZF90cHRfc2lzbzIwTUh6WzRdW1JBVEVfQ09VTlRdID0geworCXswLCAwLCAwLCAwLCA0MiwgMCwgNzYsIDEwMiwgMTI0LCAxNTgsIDE4MywgMTkzLCAyMDJ9LAkvKiBOb3JtICovCisJezAsIDAsIDAsIDAsIDQ2LCAwLCA4MiwgMTEwLCAxMzIsIDE2NywgMTkyLCAyMDIsIDIxMH0sCS8qIFNHSSAqLworCXswLCAwLCAwLCAwLCA0OCwgMCwgOTMsIDEzNSwgMTc2LCAyNTEsIDMxOSwgMzUxLCAzODF9LAkvKiBBR0cgKi8KKwl7MCwgMCwgMCwgMCwgNTMsIDAsIDEwMiwgMTQ5LCAxOTMsIDI3NSwgMzQ4LCAzODEsIDQxM30sCS8qIEFHRytTR0kgKi8KK307CisKK3N0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X3Npc280ME1Iels0XVtSQVRFX0NPVU5UXSA9IHsKKwl7MCwgMCwgMCwgMCwgNzcsIDAsIDEyNywgMTYwLCAxODQsIDIyMCwgMjQyLCAyNTAsIDI1N30sCS8qIE5vcm0gKi8KKwl7MCwgMCwgMCwgMCwgODMsIDAsIDEzNSwgMTY5LCAxOTMsIDIyOSwgMjUwLCAyNTcsIDI2NH0sCS8qIFNHSSAqLworCXswLCAwLCAwLCAwLCA5NiwgMCwgMTgyLCAyNTksIDMyOCwgNDUxLCA1NTMsIDU5OCwgNjQwfSwJLyogQUdHICovCisJezAsIDAsIDAsIDAsIDEwNiwgMCwgMTk5LCAyODIsIDM1NywgNDg3LCA1OTMsIDY0MCwgNjgzfSwJLyogQUdHK1NHSSAqLworfTsKKworc3RhdGljIHMzMiBleHBlY3RlZF90cHRfbWltbzJfMjBNSHpbNF1bUkFURV9DT1VOVF0gPSB7CisJezAsIDAsIDAsIDAsIDc0LCAwLCAxMjMsIDE1NSwgMTc5LCAyMTMsIDIzNSwgMjQzLCAyNTB9LAkvKiBOb3JtICovCisJezAsIDAsIDAsIDAsIDgxLCAwLCAxMzEsIDE2NCwgMTg3LCAyMjEsIDI0MiwgMjUwLCAyNTZ9LAkvKiBTR0kgKi8KKwl7MCwgMCwgMCwgMCwgOTIsIDAsIDE3NSwgMjUwLCAzMTcsIDQzNiwgNTM0LCA1NzgsIDYxOX0sCS8qIEFHRyAqLworCXswLCAwLCAwLCAwLCAxMDIsIDAsIDE5MiwgMjczLCAzNDQsIDQ3MCwgNTczLCA2MTksIDY2MH0sCS8qIEFHRytTR0kgKi8KK307CisKK3N0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X21pbW8yXzQwTUh6WzRdW1JBVEVfQ09VTlRdID0geworCXswLCAwLCAwLCAwLCAxMjMsIDAsIDE4MiwgMjE0LCAyMzUsIDI2NCwgMjc5LCAyODUsIDI4OX0sCS8qIE5vcm0gKi8KKwl7MCwgMCwgMCwgMCwgMTMxLCAwLCAxOTEsIDIyMiwgMjQyLCAyNzAsIDI4NCwgMjg5LCAyOTN9LAkvKiBTR0kgKi8KKwl7MCwgMCwgMCwgMCwgMTgwLCAwLCAzMjcsIDQ0NiwgNTQ1LCA3MDgsIDgyOCwgODc4LCA5MjJ9LAkvKiBBR0cgKi8KKwl7MCwgMCwgMCwgMCwgMTk3LCAwLCAzNTUsIDQ4MSwgNTg0LCA3NTIsIDg3MiwgOTIyLCA5NjZ9LAkvKiBBR0crU0dJICovCit9OworCisvKiBtYnBzLCBtY3MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWxfcmF0ZV9tY3NfaW5mbyBpbF9yYXRlX21jc1tSQVRFX0NPVU5UXSA9IHsKKwl7IjEiLCAiQlBTSyBEU1NTIn0sCisJeyIyIiwgIlFQU0sgRFNTUyJ9LAorCXsiNS41IiwgIkJQU0sgQ0NLIn0sCisJeyIxMSIsICJRUFNLIENDSyJ9LAorCXsiNiIsICJCUFNLIDEvMiJ9LAorCXsiOSIsICJCUFNLIDEvMiJ9LAorCXsiMTIiLCAiUVBTSyAxLzIifSwKKwl7IjE4IiwgIlFQU0sgMy80In0sCisJeyIyNCIsICIxNlFBTSAxLzIifSwKKwl7IjM2IiwgIjE2UUFNIDMvNCJ9LAorCXsiNDgiLCAiNjRRQU0gMi8zIn0sCisJeyI1NCIsICI2NFFBTSAzLzQifSwKKwl7IjYwIiwgIjY0UUFNIDUvNiJ9LAorfTsKKworI2RlZmluZSBNQ1NfSURYX1BFUl9TVFJFQU0JKDgpCisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsNDk2NV9yc19leHRyYWN0X3JhdGUodTMyIHJhdGVfbl9mbGFncykKK3sKKwlyZXR1cm4gKHU4KSAocmF0ZV9uX2ZsYWdzICYgMHhGRik7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9jbGVhcl93aW4oc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luKQoreworCXdpbi0+ZGF0YSA9IDA7CisJd2luLT5zdWNjZXNzX2NvdW50ZXIgPSAwOworCXdpbi0+c3VjY2Vzc19yYXRpbyA9IElMX0lOVkFMSURfVkFMVUU7CisJd2luLT5jb3VudGVyID0gMDsKKwl3aW4tPmF2ZXJhZ2VfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwl3aW4tPnN0YW1wID0gMDsKK30KKworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X3JzX2lzX3ZhbGlkX2FudCh1OCB2YWxpZF9hbnRlbm5hLCB1OCBhbnRfdHlwZSkKK3sKKwlyZXR1cm4gKGFudF90eXBlICYgdmFsaWRfYW50ZW5uYSkgPT0gYW50X3R5cGU7Cit9CisKKy8qCisgKglyZW1vdmVzIHRoZSBvbGQgZGF0YSBmcm9tIHRoZSBzdGF0cy4gQWxsIGRhdGEgdGhhdCBpcyBvbGRlciB0aGFuCisgKglUSURfTUFYX1RJTUVfRElGRiwgd2lsbCBiZSBkZWxldGVkLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX3RsX3JtX29sZF9zdGF0cyhzdHJ1Y3QgaWxfdHJhZmZpY19sb2FkICp0bCwgdTMyIGN1cnJfdGltZSkKK3sKKwkvKiBUaGUgb2xkZXN0IGFnZSB3ZSB3YW50IHRvIGtlZXAgKi8KKwl1MzIgb2xkZXN0X3RpbWUgPSBjdXJyX3RpbWUgLSBUSURfTUFYX1RJTUVfRElGRjsKKworCXdoaWxlICh0bC0+cXVldWVfY291bnQgJiYgdGwtPnRpbWVfc3RhbXAgPCBvbGRlc3RfdGltZSkgeworCQl0bC0+dG90YWwgLT0gdGwtPnBhY2tldF9jb3VudFt0bC0+aGVhZF07CisJCXRsLT5wYWNrZXRfY291bnRbdGwtPmhlYWRdID0gMDsKKwkJdGwtPnRpbWVfc3RhbXAgKz0gVElEX1FVRVVFX0NFTExfU1BBQ0lORzsKKwkJdGwtPnF1ZXVlX2NvdW50LS07CisJCXRsLT5oZWFkKys7CisJCWlmICh0bC0+aGVhZCA+PSBUSURfUVVFVUVfTUFYX1NJWkUpCisJCQl0bC0+aGVhZCA9IDA7CisJfQorfQorCisvKgorICoJaW5jcmVtZW50IHRyYWZmaWMgbG9hZCB2YWx1ZSBmb3IgdGlkIGFuZCBhbHNvIHJlbW92ZQorICoJYW55IG9sZCB2YWx1ZXMgaWYgcGFzc2VkIHRoZSBjZXJ0YWluIHRpbWUgcGVyaW9kCisgKi8KK3N0YXRpYyB1OAoraWw0OTY1X3JzX3RsX2FkZF9wYWNrZXQoc3RydWN0IGlsX2xxX3N0YSAqbHFfZGF0YSwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwl1MzIgY3Vycl90aW1lID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzKTsKKwl1MzIgdGltZV9kaWZmOworCXMzMiBpZHg7CisJc3RydWN0IGlsX3RyYWZmaWNfbG9hZCAqdGwgPSBOVUxMOworCXU4IHRpZDsKKworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQl1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKKwkJdGlkID0gcWNbMF0gJiAweGY7CisJfSBlbHNlCisJCXJldHVybiBNQVhfVElEX0NPVU5UOworCisJaWYgKHVubGlrZWx5KHRpZCA+PSBUSURfTUFYX0xPQURfQ09VTlQpKQorCQlyZXR1cm4gTUFYX1RJRF9DT1VOVDsKKworCXRsID0gJmxxX2RhdGEtPmxvYWRbdGlkXTsKKworCWN1cnJfdGltZSAtPSBjdXJyX3RpbWUgJSBUSURfUk9VTkRfVkFMVUU7CisKKwkvKiBIYXBwZW5zIG9ubHkgZm9yIHRoZSBmaXJzdCBwYWNrZXQuIEluaXRpYWxpemUgdGhlIGRhdGEgKi8KKwlpZiAoISh0bC0+cXVldWVfY291bnQpKSB7CisJCXRsLT50b3RhbCA9IDE7CisJCXRsLT50aW1lX3N0YW1wID0gY3Vycl90aW1lOworCQl0bC0+cXVldWVfY291bnQgPSAxOworCQl0bC0+aGVhZCA9IDA7CisJCXRsLT5wYWNrZXRfY291bnRbMF0gPSAxOworCQlyZXR1cm4gTUFYX1RJRF9DT1VOVDsKKwl9CisKKwl0aW1lX2RpZmYgPSBUSU1FX1dSQVBfQVJPVU5EKHRsLT50aW1lX3N0YW1wLCBjdXJyX3RpbWUpOworCWlkeCA9IHRpbWVfZGlmZiAvIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkc7CisKKwkvKiBUaGUgaGlzdG9yeSBpcyB0b28gbG9uZzogcmVtb3ZlIGRhdGEgdGhhdCBpcyBvbGRlciB0aGFuICovCisJLyogVElEX01BWF9USU1FX0RJRkYgKi8KKwlpZiAoaWR4ID49IFRJRF9RVUVVRV9NQVhfU0laRSkKKwkJaWw0OTY1X3JzX3RsX3JtX29sZF9zdGF0cyh0bCwgY3Vycl90aW1lKTsKKworCWlkeCA9ICh0bC0+aGVhZCArIGlkeCkgJSBUSURfUVVFVUVfTUFYX1NJWkU7CisJdGwtPnBhY2tldF9jb3VudFtpZHhdID0gdGwtPnBhY2tldF9jb3VudFtpZHhdICsgMTsKKwl0bC0+dG90YWwgPSB0bC0+dG90YWwgKyAxOworCisJaWYgKChpZHggKyAxKSA+IHRsLT5xdWV1ZV9jb3VudCkKKwkJdGwtPnF1ZXVlX2NvdW50ID0gaWR4ICsgMTsKKworCXJldHVybiB0aWQ7Cit9CisKKy8qCisJZ2V0IHRoZSB0cmFmZmljIGxvYWQgdmFsdWUgZm9yIHRpZAorKi8KK3N0YXRpYyB1MzIKK2lsNDk2NV9yc190bF9nZXRfbG9hZChzdHJ1Y3QgaWxfbHFfc3RhICpscV9kYXRhLCB1OCB0aWQpCit7CisJdTMyIGN1cnJfdGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyk7CisJdTMyIHRpbWVfZGlmZjsKKwlzMzIgaWR4OworCXN0cnVjdCBpbF90cmFmZmljX2xvYWQgKnRsID0gTlVMTDsKKworCWlmICh0aWQgPj0gVElEX01BWF9MT0FEX0NPVU5UKQorCQlyZXR1cm4gMDsKKworCXRsID0gJihscV9kYXRhLT5sb2FkW3RpZF0pOworCisJY3Vycl90aW1lIC09IGN1cnJfdGltZSAlIFRJRF9ST1VORF9WQUxVRTsKKworCWlmICghKHRsLT5xdWV1ZV9jb3VudCkpCisJCXJldHVybiAwOworCisJdGltZV9kaWZmID0gVElNRV9XUkFQX0FST1VORCh0bC0+dGltZV9zdGFtcCwgY3Vycl90aW1lKTsKKwlpZHggPSB0aW1lX2RpZmYgLyBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HOworCisJLyogVGhlIGhpc3RvcnkgaXMgdG9vIGxvbmc6IHJlbW92ZSBkYXRhIHRoYXQgaXMgb2xkZXIgdGhhbiAqLworCS8qIFRJRF9NQVhfVElNRV9ESUZGICovCisJaWYgKGlkeCA+PSBUSURfUVVFVUVfTUFYX1NJWkUpCisJCWlsNDk2NV9yc190bF9ybV9vbGRfc3RhdHModGwsIGN1cnJfdGltZSk7CisKKwlyZXR1cm4gdGwtPnRvdGFsOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfdGxfdHVybl9vbl9hZ2dfZm9yX3RpZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX2RhdGEsCisJCQkJIHU4IHRpZCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlpbnQgcmV0ID0gLUVBR0FJTjsKKwl1MzIgbG9hZDsKKworCWxvYWQgPSBpbDQ5NjVfcnNfdGxfZ2V0X2xvYWQobHFfZGF0YSwgdGlkKTsKKworCWlmIChsb2FkID4gSUxfQUdHX0xPQURfVEhSRVNIT0xEKSB7CisJCURfSFQoIlN0YXJ0aW5nIFR4IGFnZzogU1RBOiAlcE0gdGlkOiAlZFxuIiwgc3RhLT5hZGRyLCB0aWQpOworCQlyZXQgPSBpZWVlODAyMTFfc3RhcnRfdHhfYmFfc2Vzc2lvbihzdGEsIHRpZCwgNTAwMCk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJLyoKKwkJCSAqIGRyaXZlciBhbmQgbWFjODAyMTEgaXMgb3V0IG9mIHN5bmMKKwkJCSAqIHRoaXMgbWlnaHQgYmUgY2F1c2UgYnkgcmVsb2FkaW5nIGZpcm13YXJlCisJCQkgKiBzdG9wIHRoZSB0eCBiYSBzZXNzaW9uIGhlcmUKKwkJCSAqLworCQkJSUxfRVJSKCJGYWlsIHN0YXJ0IFR4IGFnZyBvbiB0aWQ6ICVkXG4iLCB0aWQpOworCQkJaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdGEsIHRpZCk7CisJCX0KKwl9IGVsc2UKKwkJRF9IVCgiQWdncmVnYXRpb24gbm90IGVuYWJsZWQgZm9yIHRpZCAlZCBiZWNhdXNlIGxvYWQgPSAldVxuIiwKKwkJICAgICB0aWQsIGxvYWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9yc190bF90dXJuX29uX2FnZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IHRpZCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfZGF0YSwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCWlmICh0aWQgPCBUSURfTUFYX0xPQURfQ09VTlQpCisJCWlsNDk2NV9yc190bF90dXJuX29uX2FnZ19mb3JfdGlkKGlsLCBscV9kYXRhLCB0aWQsIHN0YSk7CisJZWxzZQorCQlJTF9FUlIoInRpZCBleGNlZWRzIG1heCBsb2FkIGNvdW50OiAlZC8lZFxuIiwgdGlkLAorCQkgICAgICAgVElEX01BWF9MT0FEX0NPVU5UKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsNDk2NV9nZXRfaWw0OTY1X251bV9vZl9hbnRfZnJvbV9yYXRlKHUzMiByYXRlX25fZmxhZ3MpCit7CisJcmV0dXJuICEhKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9BX01TSykgKworCSAgICAhIShyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19BTlRfQl9NU0spICsKKwkgICAgISEocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0NfTVNLKTsKK30KKworLyoKKyAqIFN0YXRpYyBmdW5jdGlvbiB0byBnZXQgdGhlIGV4cGVjdGVkIHRocm91Z2hwdXQgZnJvbSBhbiBpbF9zY2FsZV90YmxfaW5mbworICogdGhhdCB3cmFwcyBhIE5VTEwgcG9pbnRlciBjaGVjaworICovCitzdGF0aWMgczMyCitpbDQ5NjVfZ2V0X2V4cGVjdGVkX3RwdChzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwgaW50IHJzX2lkeCkKK3sKKwlpZiAodGJsLT5leHBlY3RlZF90cHQpCisJCXJldHVybiB0YmwtPmV4cGVjdGVkX3RwdFtyc19pZHhdOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsNDk2NV9yc19jb2xsZWN0X3R4X2RhdGEgLSBVcGRhdGUgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBzbGlkaW5nIHdpbgorICoKKyAqIFdlIGtlZXAgYSBzbGlkaW5nIHdpbiBvZiB0aGUgbGFzdCA2MiBwYWNrZXRzIHRyYW5zbWl0dGVkCisgKiBhdCB0aGlzIHJhdGUuICB3aW4tPmRhdGEgY29udGFpbnMgdGhlIGJpdG1hc2sgb2Ygc3VjY2Vzc2Z1bAorICogcGFja2V0cy4KKyAqLworc3RhdGljIGludAoraWw0OTY1X3JzX2NvbGxlY3RfdHhfZGF0YShzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwgaW50IHNjYWxlX2lkeCwKKwkJCSAgaW50IGF0dGVtcHRzLCBpbnQgc3VjY2Vzc2VzKQoreworCXN0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEgKndpbiA9IE5VTEw7CisJc3RhdGljIGNvbnN0IHU2NCBtYXNrID0gKCgodTY0KSAxKSA8PCAoUkFURV9NQVhfV0lORE9XIC0gMSkpOworCXMzMiBmYWlsX2NvdW50LCB0cHQ7CisKKwlpZiAoc2NhbGVfaWR4IDwgMCB8fCBzY2FsZV9pZHggPj0gUkFURV9DT1VOVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBTZWxlY3Qgd2luIGZvciBjdXJyZW50IHR4IGJpdCByYXRlICovCisJd2luID0gJih0YmwtPndpbltzY2FsZV9pZHhdKTsKKworCS8qIEdldCBleHBlY3RlZCB0aHJvdWdocHV0ICovCisJdHB0ID0gaWw0OTY1X2dldF9leHBlY3RlZF90cHQodGJsLCBzY2FsZV9pZHgpOworCisJLyoKKwkgKiBLZWVwIHRyYWNrIG9mIG9ubHkgdGhlIGxhdGVzdCA2MiB0eCBmcmFtZSBhdHRlbXB0cyBpbiB0aGlzIHJhdGUncworCSAqIGhpc3Rvcnkgd2luOyBhbnl0aGluZyBvbGRlciBpc24ndCByZWFsbHkgcmVsZXZhbnQgYW55IG1vcmUuCisJICogSWYgd2UgaGF2ZSBmaWxsZWQgdXAgdGhlIHNsaWRpbmcgd2luLCBkcm9wIHRoZSBvbGRlc3QgYXR0ZW1wdDsKKwkgKiBpZiB0aGUgb2xkZXN0IGF0dGVtcHQgKGhpZ2hlc3QgYml0IGluIGJpdG1hcCkgc2hvd3MgInN1Y2Nlc3MiLAorCSAqIHN1YnRyYWN0ICIxIiBmcm9tIHRoZSBzdWNjZXNzIGNvdW50ZXIgKHRoaXMgaXMgdGhlIG1haW4gcmVhc29uCisJICogd2Uga2VlcCB0aGVzZSBiaXRtYXBzISkuCisJICovCisJd2hpbGUgKGF0dGVtcHRzID4gMCkgeworCQlpZiAod2luLT5jb3VudGVyID49IFJBVEVfTUFYX1dJTkRPVykgeworCisJCQkvKiByZW1vdmUgZWFybGllc3QgKi8KKwkJCXdpbi0+Y291bnRlciA9IFJBVEVfTUFYX1dJTkRPVyAtIDE7CisKKwkJCWlmICh3aW4tPmRhdGEgJiBtYXNrKSB7CisJCQkJd2luLT5kYXRhICY9IH5tYXNrOworCQkJCXdpbi0+c3VjY2Vzc19jb3VudGVyLS07CisJCQl9CisJCX0KKworCQkvKiBJbmNyZW1lbnQgZnJhbWVzLWF0dGVtcHRlZCBjb3VudGVyICovCisJCXdpbi0+Y291bnRlcisrOworCisJCS8qIFNoaWZ0IGJpdG1hcCBieSBvbmUgZnJhbWUgdG8gdGhyb3cgYXdheSBvbGRlc3QgaGlzdG9yeSAqLworCQl3aW4tPmRhdGEgPDw9IDE7CisKKwkJLyogTWFyayB0aGUgbW9zdCByZWNlbnQgI3N1Y2Nlc3NlcyBhdHRlbXB0cyBhcyBzdWNjZXNzZnVsICovCisJCWlmIChzdWNjZXNzZXMgPiAwKSB7CisJCQl3aW4tPnN1Y2Nlc3NfY291bnRlcisrOworCQkJd2luLT5kYXRhIHw9IDB4MTsKKwkJCXN1Y2Nlc3Nlcy0tOworCQl9CisKKwkJYXR0ZW1wdHMtLTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgY3VycmVudCBzdWNjZXNzIHJhdGlvLCBhdm9pZCBkaXZpZGUtYnktMCEgKi8KKwlpZiAod2luLT5jb3VudGVyID4gMCkKKwkJd2luLT5zdWNjZXNzX3JhdGlvID0KKwkJICAgIDEyOCAqICgxMDAgKiB3aW4tPnN1Y2Nlc3NfY291bnRlcikgLyB3aW4tPmNvdW50ZXI7CisJZWxzZQorCQl3aW4tPnN1Y2Nlc3NfcmF0aW8gPSBJTF9JTlZBTElEX1ZBTFVFOworCisJZmFpbF9jb3VudCA9IHdpbi0+Y291bnRlciAtIHdpbi0+c3VjY2Vzc19jb3VudGVyOworCisJLyogQ2FsY3VsYXRlIGF2ZXJhZ2UgdGhyb3VnaHB1dCwgaWYgd2UgaGF2ZSBlbm91Z2ggaGlzdG9yeS4gKi8KKwlpZiAoZmFpbF9jb3VudCA+PSBSQVRFX01JTl9GQUlMVVJFX1RIIHx8CisJICAgIHdpbi0+c3VjY2Vzc19jb3VudGVyID49IFJBVEVfTUlOX1NVQ0NFU1NfVEgpCisJCXdpbi0+YXZlcmFnZV90cHQgPSAod2luLT5zdWNjZXNzX3JhdGlvICogdHB0ICsgNjQpIC8gMTI4OworCWVsc2UKKwkJd2luLT5hdmVyYWdlX3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisKKwkvKiBUYWcgdGhpcyB3aW4gYXMgaGF2aW5nIGJlZW4gdXBkYXRlZCAqLworCXdpbi0+c3RhbXAgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaWxsIHVDb2RlIEFQSSByYXRlX25fZmxhZ3MgZmllbGQsIGJhc2VkIG9uICJzZWFyY2giIG9yICJhY3RpdmUiIHRhYmxlLgorICovCitzdGF0aWMgdTMyCitpbDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwsCisJCQkgICAgIGludCBpZHgsIHU4IHVzZV9ncmVlbikKK3sKKwl1MzIgcmF0ZV9uX2ZsYWdzID0gMDsKKworCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgeworCQlyYXRlX25fZmxhZ3MgPSBpbF9yYXRlc1tpZHhdLnBsY3A7CisJCWlmIChpZHggPj0gSUxfRklSU1RfQ0NLX1JBVEUgJiYgaWR4IDw9IElMX0xBU1RfQ0NLX1JBVEUpCisJCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKKworCX0gZWxzZSBpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgeworCQlpZiAoaWR4ID4gSUxfTEFTVF9PRkRNX1JBVEUpIHsKKwkJCUlMX0VSUigiSW52YWxpZCBIVCByYXRlIGlkeCAlZFxuIiwgaWR4KTsKKwkJCWlkeCA9IElMX0xBU1RfT0ZETV9SQVRFOworCQl9CisJCXJhdGVfbl9mbGFncyA9IFJBVEVfTUNTX0hUX01TSzsKKworCQlpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpKQorCQkJcmF0ZV9uX2ZsYWdzIHw9IGlsX3JhdGVzW2lkeF0ucGxjcF9zaXNvOworCQllbHNlCisJCQlyYXRlX25fZmxhZ3MgfD0gaWxfcmF0ZXNbaWR4XS5wbGNwX21pbW8yOworCX0gZWxzZSB7CisJCUlMX0VSUigiSW52YWxpZCB0YmwtPmxxX3R5cGUgJWRcbiIsIHRibC0+bHFfdHlwZSk7CisJfQorCisJcmF0ZV9uX2ZsYWdzIHw9CisJICAgICgodGJsLT5hbnRfdHlwZSA8PCBSQVRFX01DU19BTlRfUE9TKSAmIFJBVEVfTUNTX0FOVF9BQkNfTVNLKTsKKworCWlmIChpc19IdCh0YmwtPmxxX3R5cGUpKSB7CisJCWlmICh0YmwtPmlzX2h0NDApIHsKKwkJCWlmICh0YmwtPmlzX2R1cCkKKwkJCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfRFVQX01TSzsKKwkJCWVsc2UKKwkJCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfSFQ0MF9NU0s7CisJCX0KKwkJaWYgKHRibC0+aXNfU0dJKQorCQkJcmF0ZV9uX2ZsYWdzIHw9IFJBVEVfTUNTX1NHSV9NU0s7CisKKwkJaWYgKHVzZV9ncmVlbikgeworCQkJcmF0ZV9uX2ZsYWdzIHw9IFJBVEVfTUNTX0dGX01TSzsKKwkJCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkgJiYgdGJsLT5pc19TR0kpIHsKKwkJCQlyYXRlX25fZmxhZ3MgJj0gflJBVEVfTUNTX1NHSV9NU0s7CisJCQkJSUxfRVJSKCJHRiB3YXMgc2V0IHdpdGggU0dJOlNJU09cbiIpOworCQkJfQorCQl9CisJfQorCXJldHVybiByYXRlX25fZmxhZ3M7Cit9CisKKy8qCisgKiBJbnRlcnByZXQgdUNvZGUgQVBJJ3MgcmF0ZV9uX2ZsYWdzIGZvcm1hdCwKKyAqIGZpbGwgInNlYXJjaCIgb3IgImFjdGl2ZSIgdHggbW9kZSB0YWJsZS4KKyAqLworc3RhdGljIGludAoraWw0OTY1X3JzX2dldF90YmxfaW5mb19mcm9tX21jcyhjb25zdCB1MzIgcmF0ZV9uX2ZsYWdzLAorCQkJCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCQlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwgaW50ICpyYXRlX2lkeCkKK3sKKwl1MzIgYW50X21zayA9IChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19BTlRfQUJDX01TSyk7CisJdTggaWw0OTY1X251bV9vZl9hbnQgPQorCSAgICBpbDQ5NjVfZ2V0X2lsNDk2NV9udW1fb2ZfYW50X2Zyb21fcmF0ZShyYXRlX25fZmxhZ3MpOworCXU4IG1jczsKKworCW1lbXNldCh0YmwsIDAsIHNpemVvZihzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8pKTsKKwkqcmF0ZV9pZHggPSBpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHJhdGVfbl9mbGFncyk7CisKKwlpZiAoKnJhdGVfaWR4ID09IFJBVEVfSU5WQUxJRCkgeworCQkqcmF0ZV9pZHggPSAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXRibC0+aXNfU0dJID0gMDsJLyogZGVmYXVsdCBsZWdhY3kgc2V0dXAgKi8KKwl0YmwtPmlzX2h0NDAgPSAwOworCXRibC0+aXNfZHVwID0gMDsKKwl0YmwtPmFudF90eXBlID0gKGFudF9tc2sgPj4gUkFURV9NQ1NfQU5UX1BPUyk7CisJdGJsLT5scV90eXBlID0gTFFfTk9ORTsKKwl0YmwtPm1heF9zZWFyY2ggPSBJTF9NQVhfU0VBUkNIOworCisJLyogbGVnYWN5IHJhdGUgZm9ybWF0ICovCisJaWYgKCEocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFRfTVNLKSkgeworCQlpZiAoaWw0OTY1X251bV9vZl9hbnQgPT0gMSkgeworCQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJCQl0YmwtPmxxX3R5cGUgPSBMUV9BOworCQkJZWxzZQorCQkJCXRibC0+bHFfdHlwZSA9IExRX0c7CisJCX0KKwkJLyogSFQgcmF0ZSBmb3JtYXQgKi8KKwl9IGVsc2UgeworCQlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfU0dJX01TSykKKwkJCXRibC0+aXNfU0dJID0gMTsKKworCQlpZiAoKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUNDBfTVNLKSB8fAorCQkgICAgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0RVUF9NU0spKQorCQkJdGJsLT5pc19odDQwID0gMTsKKworCQlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykKKwkJCXRibC0+aXNfZHVwID0gMTsKKworCQltY3MgPSBpbDQ5NjVfcnNfZXh0cmFjdF9yYXRlKHJhdGVfbl9mbGFncyk7CisKKwkJLyogU0lTTyAqLworCQlpZiAobWNzIDw9IFJBVEVfU0lTT182ME1fUExDUCkgeworCQkJaWYgKGlsNDk2NV9udW1fb2ZfYW50ID09IDEpCisJCQkJdGJsLT5scV90eXBlID0gTFFfU0lTTzsJLyplbHNlIE5PTkUgKi8KKwkJCS8qIE1JTU8yICovCisJCX0gZWxzZSB7CisJCQlpZiAoaWw0OTY1X251bV9vZl9hbnQgPT0gMikKKwkJCQl0YmwtPmxxX3R5cGUgPSBMUV9NSU1PMjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogc3dpdGNoIHRvIGFub3RoZXIgYW50ZW5uYS9hbnRlbm5hcyBhbmQgcmV0dXJuIDEgKi8KKy8qIGlmIG5vIG90aGVyIHZhbGlkIGFudGVubmEgZm91bmQsIHJldHVybiAwICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodTMyIHZhbGlkX2FudCwgdTMyICpyYXRlX25fZmxhZ3MsCisJCQkgc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwpCit7CisJdTggbmV3X2FudF90eXBlOworCisJaWYgKCF0YmwtPmFudF90eXBlIHx8IHRibC0+YW50X3R5cGUgPiBBTlRfQUJDKQorCQlyZXR1cm4gMDsKKworCWlmICghaWw0OTY1X3JzX2lzX3ZhbGlkX2FudCh2YWxpZF9hbnQsIHRibC0+YW50X3R5cGUpKQorCQlyZXR1cm4gMDsKKworCW5ld19hbnRfdHlwZSA9IGFudF90b2dnbGVfbG9va3VwW3RibC0+YW50X3R5cGVdOworCisJd2hpbGUgKG5ld19hbnRfdHlwZSAhPSB0YmwtPmFudF90eXBlICYmCisJICAgICAgICFpbDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX2FudCwgbmV3X2FudF90eXBlKSkKKwkJbmV3X2FudF90eXBlID0gYW50X3RvZ2dsZV9sb29rdXBbbmV3X2FudF90eXBlXTsKKworCWlmIChuZXdfYW50X3R5cGUgPT0gdGJsLT5hbnRfdHlwZSkKKwkJcmV0dXJuIDA7CisKKwl0YmwtPmFudF90eXBlID0gbmV3X2FudF90eXBlOworCSpyYXRlX25fZmxhZ3MgJj0gflJBVEVfTUNTX0FOVF9BQkNfTVNLOworCSpyYXRlX25fZmxhZ3MgfD0gbmV3X2FudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1M7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogR3JlZW4tZmllbGQgbW9kZSBpcyB2YWxpZCBpZiB0aGUgc3RhdGlvbiBzdXBwb3J0cyBpdCBhbmQKKyAqIHRoZXJlIGFyZSBubyBub24tR0Ygc3RhdGlvbnMgcHJlc2VudCBpbiB0aGUgQlNTLgorICovCitzdGF0aWMgYm9vbAoraWw0OTY1X3JzX3VzZV9ncmVlbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OworCisJcmV0dXJuIChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQpICYmCisJICAgICEoY3R4LT5odC5ub25fZ2Zfc3RhX3ByZXNlbnQpOworfQorCisvKioKKyAqIGlsNDk2NV9yc19nZXRfc3VwcG9ydGVkX3JhdGVzIC0gZ2V0IHRoZSBhdmFpbGFibGUgcmF0ZXMKKyAqCisgKiBpZiBtYW5hZ2VtZW50IGZyYW1lIG9yIGJyb2FkY2FzdCBmcmFtZSBvbmx5IHJldHVybgorICogYmFzaWMgYXZhaWxhYmxlIHJhdGVzLgorICoKKyAqLworc3RhdGljIHUxNgoraWw0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMoc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgICAgIGVudW0gaWxfdGFibGVfdHlwZSByYXRlX3R5cGUpCit7CisJaWYgKGlzX2xlZ2FjeShyYXRlX3R5cGUpKSB7CisJCXJldHVybiBscV9zdGEtPmFjdGl2ZV9sZWdhY3lfcmF0ZTsKKwl9IGVsc2UgeworCQlpZiAoaXNfc2lzbyhyYXRlX3R5cGUpKQorCQkJcmV0dXJuIGxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZTsKKwkJZWxzZQorCQkJcmV0dXJuIGxxX3N0YS0+YWN0aXZlX21pbW8yX3JhdGU7CisJfQorfQorCitzdGF0aWMgdTE2CitpbDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZHgsIHUxNiByYXRlX21hc2ssCisJCQkgICAgaW50IHJhdGVfdHlwZSkKK3sKKwl1OCBoaWdoID0gUkFURV9JTlZBTElEOworCXU4IGxvdyA9IFJBVEVfSU5WQUxJRDsKKworCS8qIDgwMi4xMUEgb3IgaHQgd2Fsa3MgdG8gdGhlIG5leHQgbGl0ZXJhbCBhZGphY2VudCByYXRlIGluCisJICogdGhlIHJhdGUgdGFibGUgKi8KKwlpZiAoaXNfYV9iYW5kKHJhdGVfdHlwZSkgfHwgIWlzX2xlZ2FjeShyYXRlX3R5cGUpKSB7CisJCWludCBpOworCQl1MzIgbWFzazsKKworCQkvKiBGaW5kIHRoZSBwcmV2aW91cyByYXRlIHRoYXQgaXMgaW4gdGhlIHJhdGUgbWFzayAqLworCQlpID0gaWR4IC0gMTsKKwkJZm9yIChtYXNrID0gKDEgPDwgaSk7IGkgPj0gMDsgaS0tLCBtYXNrID4+PSAxKSB7CisJCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgeworCQkJCWxvdyA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBGaW5kIHRoZSBuZXh0IHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCisJCWkgPSBpZHggKyAxOworCQlmb3IgKG1hc2sgPSAoMSA8PCBpKTsgaSA8IFJBVEVfQ09VTlQ7IGkrKywgbWFzayA8PD0gMSkgeworCQkJaWYgKHJhdGVfbWFzayAmIG1hc2spIHsKKwkJCQloaWdoID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKKwl9CisKKwlsb3cgPSBpZHg7CisJd2hpbGUgKGxvdyAhPSBSQVRFX0lOVkFMSUQpIHsKKwkJbG93ID0gaWxfcmF0ZXNbbG93XS5wcmV2X3JzOworCQlpZiAobG93ID09IFJBVEVfSU5WQUxJRCkKKwkJCWJyZWFrOworCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgbG93KSkKKwkJCWJyZWFrOworCQlEX1JBVEUoIlNraXBwaW5nIG1hc2tlZCBsb3dlciByYXRlOiAlZFxuIiwgbG93KTsKKwl9CisKKwloaWdoID0gaWR4OworCXdoaWxlIChoaWdoICE9IFJBVEVfSU5WQUxJRCkgeworCQloaWdoID0gaWxfcmF0ZXNbaGlnaF0ubmV4dF9yczsKKwkJaWYgKGhpZ2ggPT0gUkFURV9JTlZBTElEKQorCQkJYnJlYWs7CisJCWlmIChyYXRlX21hc2sgJiAoMSA8PCBoaWdoKSkKKwkJCWJyZWFrOworCQlEX1JBVEUoIlNraXBwaW5nIG1hc2tlZCBoaWdoZXIgcmF0ZTogJWRcbiIsIGhpZ2gpOworCX0KKworCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKK30KKworc3RhdGljIHUzMgoraWw0OTY1X3JzX2dldF9sb3dlcl9yYXRlKHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCSBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwgdTggc2NhbGVfaWR4LAorCQkJIHU4IGh0X3Bvc3NpYmxlKQoreworCXMzMiBsb3c7CisJdTE2IHJhdGVfbWFzazsKKwl1MTYgaGlnaF9sb3c7CisJdTggc3dpdGNoX3RvX2xlZ2FjeSA9IDA7CisJdTggaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOworCXN0cnVjdCBpbF9wcml2ICppbCA9IGxxX3N0YS0+ZHJ2OworCisJLyogY2hlY2sgaWYgd2UgbmVlZCB0byBzd2l0Y2ggZnJvbSBIVCB0byBsZWdhY3kgcmF0ZXMuCisJICogYXNzdW1wdGlvbiBpcyB0aGF0IG1hbmRhdG9yeSByYXRlcyAoMU1icHMgb3IgNk1icHMpCisJICogYXJlIGFsd2F5cyBzdXBwb3J0ZWQgKHNwZWMgZGVtYW5kKSAqLworCWlmICghaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkgJiYgKCFodF9wb3NzaWJsZSB8fCAhc2NhbGVfaWR4KSkgeworCQlzd2l0Y2hfdG9fbGVnYWN5ID0gMTsKKwkJc2NhbGVfaWR4ID0gcnNfaHRfdG9fbGVnYWN5W3NjYWxlX2lkeF07CisJCWlmIChscV9zdGEtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJCXRibC0+bHFfdHlwZSA9IExRX0E7CisJCWVsc2UKKwkJCXRibC0+bHFfdHlwZSA9IExRX0c7CisKKwkJaWYgKGlsNDk2NV9udW1fb2ZfYW50KHRibC0+YW50X3R5cGUpID4gMSkKKwkJCXRibC0+YW50X3R5cGUgPQorCQkJICAgIGlsNDk2NV9maXJzdF9hbnRlbm5hKGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKKworCQl0YmwtPmlzX2h0NDAgPSAwOworCQl0YmwtPmlzX1NHSSA9IDA7CisJCXRibC0+bWF4X3NlYXJjaCA9IElMX01BWF9TRUFSQ0g7CisJfQorCisJcmF0ZV9tYXNrID0gaWw0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMobHFfc3RhLCBOVUxMLCB0YmwtPmxxX3R5cGUpOworCisJLyogTWFzayB3aXRoIHN0YXRpb24gcmF0ZSByZXN0cmljdGlvbiAqLworCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgeworCQkvKiBzdXBwX3JhdGVzIGhhcyBubyBDQ0sgYml0cyBpbiBBIG1vZGUgKi8KKwkJaWYgKGxxX3N0YS0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJcmF0ZV9tYXNrID0KKwkJCSAgICAodTE2KSAocmF0ZV9tYXNrICYKKwkJCQkgICAobHFfc3RhLT5zdXBwX3JhdGVzIDw8IElMX0ZJUlNUX09GRE1fUkFURSkpOworCQllbHNlCisJCQlyYXRlX21hc2sgPSAodTE2KSAocmF0ZV9tYXNrICYgbHFfc3RhLT5zdXBwX3JhdGVzKTsKKwl9CisKKwkvKiBJZiB3ZSBzd2l0Y2hlZCBmcm9tIEhUIHRvIGxlZ2FjeSwgY2hlY2sgY3VycmVudCByYXRlICovCisJaWYgKHN3aXRjaF90b19sZWdhY3kgJiYgKHJhdGVfbWFzayAmICgxIDw8IHNjYWxlX2lkeCkpKSB7CisJCWxvdyA9IHNjYWxlX2lkeDsKKwkJZ290byBvdXQ7CisJfQorCisJaGlnaF9sb3cgPQorCSAgICBpbDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUobHFfc3RhLT5kcnYsIHNjYWxlX2lkeCwgcmF0ZV9tYXNrLAorCQkJCQl0YmwtPmxxX3R5cGUpOworCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKKworCWlmIChsb3cgPT0gUkFURV9JTlZBTElEKQorCQlsb3cgPSBzY2FsZV9pZHg7CisKK291dDoKKwlyZXR1cm4gaWw0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChscV9zdGEtPmRydiwgdGJsLCBsb3csIGlzX2dyZWVuKTsKK30KKworLyoKKyAqIFNpbXBsZSBmdW5jdGlvbiB0byBjb21wYXJlIHR3byByYXRlIHNjYWxlIHRhYmxlIHR5cGVzCisgKi8KK3N0YXRpYyBib29sCitpbDQ5NjVfdGFibGVfdHlwZV9tYXRjaGVzKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqYSwKKwkJCSAgc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICpiKQoreworCXJldHVybiAoYS0+bHFfdHlwZSA9PSBiLT5scV90eXBlICYmIGEtPmFudF90eXBlID09IGItPmFudF90eXBlICYmCisJCWEtPmlzX1NHSSA9PSBiLT5pc19TR0kpOworfQorCisvKgorICogbWFjODAyMTEgc2VuZHMgdXMgVHggc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfdHhfc3RhdHVzKHZvaWQgKmlsX3IsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqaWxfc3RhLAorCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgbGVnYWN5X3N1Y2Nlc3M7CisJaW50IHJldHJpZXM7CisJaW50IHJzX2lkeCwgbWFjX2lkeCwgaTsKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEgPSBpbF9zdGE7CisJc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKnRhYmxlOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gKHN0cnVjdCBpbF9wcml2ICopaWxfcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJZW51bSBtYWM4MDIxMV9yYXRlX2NvbnRyb2xfZmxhZ3MgbWFjX2ZsYWdzOworCXUzMiB0eF9yYXRlOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyB0YmxfdHlwZTsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKmN1cnJfdGJsLCAqb3RoZXJfdGJsLCAqdG1wX3RibDsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKKworCURfUkFURSgiZ2V0IGZyYW1lIGFjayByZXNwb25zZSwgdXBkYXRlIHJhdGUgc2NhbGUgd2luXG4iKTsKKworCS8qIFRyZWF0IHVuaW5pdGlhbGl6ZWQgcmF0ZSBzY2FsaW5nIGRhdGEgc2FtZSBhcyBub24tZXhpc3RpbmcuICovCisJaWYgKCFscV9zdGEpIHsKKwkJRF9SQVRFKCJTdGF0aW9uIHJhdGUgc2NhbGluZyBub3QgY3JlYXRlZCB5ZXQuXG4iKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoIWxxX3N0YS0+ZHJ2KSB7CisJCURfUkFURSgiUmF0ZSBzY2FsaW5nIG5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSB8fAorCSAgICAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpCisJCXJldHVybjsKKworCS8qIFRoaXMgcGFja2V0IHdhcyBhZ2dyZWdhdGVkIGJ1dCBkb2Vzbid0IGNhcnJ5IHN0YXR1cyBpbmZvICovCisJaWYgKChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpICYmCisJICAgICEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVSkpCisJCXJldHVybjsKKworCS8qCisJICogSWdub3JlIHRoaXMgVHggZnJhbWUgcmVzcG9uc2UgaWYgaXRzIGluaXRpYWwgcmF0ZSBkb2Vzbid0IG1hdGNoCisJICogdGhhdCBvZiBsYXRlc3QgTGluayBRdWFsaXR5IGNvbW1hbmQuICBUaGVyZSBtYXkgYmUgc3RyYWdnbGVycworCSAqIGZyb20gYSBwcmV2aW91cyBMaW5rIFF1YWxpdHkgY29tbWFuZCwgYnV0IHdlJ3JlIG5vIGxvbmdlciBpbnRlcmVzdGVkCisJICogaW4gdGhvc2U7IHRoZXkncmUgZWl0aGVyIGZyb20gdGhlICJhY3RpdmUiIG1vZGUgd2hpbGUgd2UncmUgdHJ5aW5nCisJICogdG8gY2hlY2sgInNlYXJjaCIgbW9kZSwgb3IgYSBwcmlvciAic2VhcmNoIiBtb2RlIGFmdGVyIHdlJ3ZlIG1vdmVkCisJICogdG8gYSBuZXcgInNlYXJjaCIgbW9kZSAod2hpY2ggbWlnaHQgYmVjb21lIHRoZSBuZXcgImFjdGl2ZSIgbW9kZSkuCisJICovCisJdGFibGUgPSAmbHFfc3RhLT5scTsKKwl0eF9yYXRlID0gbGUzMl90b19jcHUodGFibGUtPnJzX3RhYmxlWzBdLnJhdGVfbl9mbGFncyk7CisJaWw0OTY1X3JzX2dldF90YmxfaW5mb19mcm9tX21jcyh0eF9yYXRlLCBpbC0+YmFuZCwgJnRibF90eXBlLCAmcnNfaWR4KTsKKwlpZiAoaWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJcnNfaWR4IC09IElMX0ZJUlNUX09GRE1fUkFURTsKKwltYWNfZmxhZ3MgPSBpbmZvLT5zdGF0dXMucmF0ZXNbMF0uZmxhZ3M7CisJbWFjX2lkeCA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5pZHg7CisJLyogRm9yIEhUIHBhY2tldHMsIG1hcCBNQ1MgdG8gUExDUCAqLworCWlmIChtYWNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKSB7CisJCW1hY19pZHggJj0gUkFURV9NQ1NfQ09ERV9NU0s7CS8qIFJlbW92ZSAjIG9mIHN0cmVhbXMgKi8KKwkJaWYgKG1hY19pZHggPj0gKFJBVEVfOU1fSURYIC0gSUxfRklSU1RfT0ZETV9SQVRFKSkKKwkJCW1hY19pZHgrKzsKKwkJLyoKKwkJICogbWFjODAyMTEgSFQgaWR4IGlzIGFsd2F5cyB6ZXJvLWlkeGVkOyB3ZSBuZWVkIHRvIG1vdmUKKwkJICogSFQgT0ZETSByYXRlcyBhZnRlciBDQ0sgcmF0ZXMgaW4gMi40IEdIeiBiYW5kCisJCSAqLworCQlpZiAoaWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKKwkJCW1hY19pZHggKz0gSUxfRklSU1RfT0ZETV9SQVRFOworCX0KKwkvKiBIZXJlIHdlIGFjdHVhbGx5IGNvbXBhcmUgdGhpcyByYXRlIHRvIHRoZSBsYXRlc3QgTFEgY29tbWFuZCAqLworCWlmIChtYWNfaWR4IDwgMCB8fAorCSAgICB0YmxfdHlwZS5pc19TR0kgIT0gISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKSB8fAorCSAgICB0YmxfdHlwZS5pc19odDQwICE9ICEhKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpIHx8CisJICAgIHRibF90eXBlLmlzX2R1cCAhPSAhIShtYWNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfRFVQX0RBVEEpIHx8CisJICAgIHRibF90eXBlLmFudF90eXBlICE9IGluZm8tPmFudGVubmFfc2VsX3R4IHx8CisJICAgICEhKHR4X3JhdGUgJiBSQVRFX01DU19IVF9NU0spICE9ICEhKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpCisJICAgIHx8ICEhKHR4X3JhdGUgJiBSQVRFX01DU19HRl9NU0spICE9CisJICAgICEhKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19HUkVFTl9GSUVMRCkgfHwgcnNfaWR4ICE9IG1hY19pZHgpIHsKKwkJRF9SQVRFKCJpbml0aWFsIHJhdGUgJWQgZG9lcyBub3QgbWF0Y2ggJWQgKDB4JXgpXG4iLCBtYWNfaWR4LAorCQkgICAgICAgcnNfaWR4LCB0eF9yYXRlKTsKKwkJLyoKKwkJICogU2luY2UgcmF0ZXMgbWlzLW1hdGNoLCB0aGUgbGFzdCBMUSBjb21tYW5kIG1heSBoYXZlIGZhaWxlZC4KKwkJICogQWZ0ZXIgSUxfTUlTU0VEX1JBVEVfTUFYIG1pcy1tYXRjaGVzLCByZXN5bmMgdGhlIHVDb2RlIHdpdGgKKwkJICogLi4uIGRyaXZlci4KKwkJICovCisJCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlcisrOworCQlpZiAobHFfc3RhLT5taXNzZWRfcmF0ZV9jb3VudGVyID4gSUxfTUlTU0VEX1JBVEVfTUFYKSB7CisJCQlscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPSAwOworCQkJaWxfc2VuZF9scV9jbWQoaWwsIGN0eCwgJmxxX3N0YS0+bHEsIENNRF9BU1lOQywgZmFsc2UpOworCQl9CisJCS8qIFJlZ2FyZGxlc3MsIGlnbm9yZSB0aGlzIHN0YXR1cyBpbmZvIGZvciBvdXRkYXRlZCByYXRlICovCisJCXJldHVybjsKKwl9IGVsc2UKKwkJLyogUmF0ZSBkaWQgbWF0Y2gsIHNvIHJlc2V0IHRoZSBtaXNzZWRfcmF0ZV9jb3VudGVyICovCisJCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IDA7CisKKwkvKiBGaWd1cmUgb3V0IGlmIHJhdGUgc2NhbGUgYWxnb3JpdGhtIGlzIGluIGFjdGl2ZSBvciBzZWFyY2ggdGFibGUgKi8KKwlpZiAoaWw0OTY1X3RhYmxlX3R5cGVfbWF0Y2hlcworCSAgICAoJnRibF90eXBlLCAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKSkpIHsKKwkJY3Vycl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKwkJb3RoZXJfdGJsID0gJihscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pOworCX0gZWxzZQorCSAgICBpZiAoaWw0OTY1X3RhYmxlX3R5cGVfbWF0Y2hlcworCQkoJnRibF90eXBlLCAmbHFfc3RhLT5scV9pbmZvWzEgLSBscV9zdGEtPmFjdGl2ZV90YmxdKSkgeworCQljdXJyX3RibCA9ICYobHFfc3RhLT5scV9pbmZvWzEgLSBscV9zdGEtPmFjdGl2ZV90YmxdKTsKKwkJb3RoZXJfdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJfSBlbHNlIHsKKwkJRF9SQVRFKCJOZWl0aGVyIGFjdGl2ZSBub3Igc2VhcmNoIG1hdGNoZXMgdHggcmF0ZVxuIik7CisJCXRtcF90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKwkJRF9SQVRFKCJhY3RpdmUtIGxxOiV4LCBhbnQ6JXgsIFNHSTolZFxuIiwgdG1wX3RibC0+bHFfdHlwZSwKKwkJICAgICAgIHRtcF90YmwtPmFudF90eXBlLCB0bXBfdGJsLT5pc19TR0kpOworCQl0bXBfdGJsID0gJihscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pOworCQlEX1JBVEUoInNlYXJjaC0gbHE6JXgsIGFudDoleCwgU0dJOiVkXG4iLCB0bXBfdGJsLT5scV90eXBlLAorCQkgICAgICAgdG1wX3RibC0+YW50X3R5cGUsIHRtcF90YmwtPmlzX1NHSSk7CisJCURfUkFURSgiYWN0dWFsLSBscToleCwgYW50OiV4LCBTR0k6JWRcbiIsIHRibF90eXBlLmxxX3R5cGUsCisJCSAgICAgICB0YmxfdHlwZS5hbnRfdHlwZSwgdGJsX3R5cGUuaXNfU0dJKTsKKwkJLyoKKwkJICogbm8gbWF0Y2hpbmcgdGFibGUgZm91bmQsIGxldCdzIGJ5LXBhc3MgdGhlIGRhdGEgY29sbGVjdGlvbgorCQkgKiBhbmQgY29udGludWUgdG8gcGVyZm9ybSByYXRlIHNjYWxlIHRvIGZpbmQgdGhlIHJhdGUgdGFibGUKKwkJICovCisJCWlsNDk2NV9yc19zdGF5X2luX3RhYmxlKGxxX3N0YSwgdHJ1ZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIFVwZGF0aW5nIHRoZSBmcmFtZSBoaXN0b3J5IGRlcGVuZHMgb24gd2hldGhlciBwYWNrZXRzIHdlcmUKKwkgKiBhZ2dyZWdhdGVkLgorCSAqCisJICogRm9yIGFnZ3JlZ2F0aW9uLCBhbGwgcGFja2V0cyB3ZXJlIHRyYW5zbWl0dGVkIGF0IHRoZSBzYW1lIHJhdGUsIHRoZQorCSAqIGZpcnN0IGlkeCBpbnRvIHJhdGUgc2NhbGUgdGFibGUuCisJICovCisJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQU1QRFUpIHsKKwkJdHhfcmF0ZSA9IGxlMzJfdG9fY3B1KHRhYmxlLT5yc190YWJsZVswXS5yYXRlX25fZmxhZ3MpOworCQlpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKHR4X3JhdGUsIGlsLT5iYW5kLCAmdGJsX3R5cGUsCisJCQkJCQkmcnNfaWR4KTsKKwkJaWw0OTY1X3JzX2NvbGxlY3RfdHhfZGF0YShjdXJyX3RibCwgcnNfaWR4LAorCQkJCQkgIGluZm8tPnN0YXR1cy5hbXBkdV9sZW4sCisJCQkJCSAgaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW4pOworCisJCS8qIFVwZGF0ZSBzdWNjZXNzL2ZhaWwgY291bnRzIGlmIG5vdCBzZWFyY2hpbmcgZm9yIG5ldyBtb2RlICovCisJCWlmIChscV9zdGEtPnN0YXlfaW5fdGJsKSB7CisJCQlscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgKz0gaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW47CisJCQlscV9zdGEtPnRvdGFsX2ZhaWxlZCArPQorCQkJICAgIChpbmZvLT5zdGF0dXMuYW1wZHVfbGVuIC0KKwkJCSAgICAgaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW4pOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRm9yIGxlZ2FjeSwgdXBkYXRlIGZyYW1lIGhpc3Rvcnkgd2l0aCBmb3IgZWFjaCBUeCByZXRyeS4KKwkJICovCisJCXJldHJpZXMgPSBpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgLSAxOworCQkvKiBIVyBkb2Vzbid0IHNlbmQgbW9yZSB0aGFuIDE1IHJldHJpZXMgKi8KKwkJcmV0cmllcyA9IG1pbihyZXRyaWVzLCAxNSk7CisKKwkJLyogVGhlIGxhc3QgdHJhbnNtaXNzaW9uIG1heSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bCAqLworCQlsZWdhY3lfc3VjY2VzcyA9ICEhKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLKTsKKwkJLyogQ29sbGVjdCBkYXRhIGZvciBlYWNoIHJhdGUgdXNlZCBkdXJpbmcgZmFpbGVkIFRYIGF0dGVtcHRzICovCisJCWZvciAoaSA9IDA7IGkgPD0gcmV0cmllczsgKytpKSB7CisJCQl0eF9yYXRlID0gbGUzMl90b19jcHUodGFibGUtPnJzX3RhYmxlW2ldLnJhdGVfbl9mbGFncyk7CisJCQlpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKHR4X3JhdGUsIGlsLT5iYW5kLAorCQkJCQkJCSZ0YmxfdHlwZSwgJnJzX2lkeCk7CisJCQkvKgorCQkJICogT25seSBjb2xsZWN0IHN0YXRzIGlmIHJldHJpZWQgcmF0ZSBpcyBpbiB0aGUgc2FtZSBSUworCQkJICogdGFibGUgYXMgYWN0aXZlL3NlYXJjaC4KKwkJCSAqLworCQkJaWYgKGlsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLCBjdXJyX3RibCkpCisJCQkJdG1wX3RibCA9IGN1cnJfdGJsOworCQkJZWxzZSBpZiAoaWw0OTY1X3RhYmxlX3R5cGVfbWF0Y2hlcworCQkJCSAoJnRibF90eXBlLCBvdGhlcl90YmwpKQorCQkJCXRtcF90YmwgPSBvdGhlcl90Ymw7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCQlpbDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhKHRtcF90YmwsIHJzX2lkeCwgMSwKKwkJCQkJCSAgaSA8CisJCQkJCQkgIHJldHJpZXMgPyAwIDogbGVnYWN5X3N1Y2Nlc3MpOworCQl9CisKKwkJLyogVXBkYXRlIHN1Y2Nlc3MvZmFpbCBjb3VudHMgaWYgbm90IHNlYXJjaGluZyBmb3IgbmV3IG1vZGUgKi8KKwkJaWYgKGxxX3N0YS0+c3RheV9pbl90YmwpIHsKKwkJCWxxX3N0YS0+dG90YWxfc3VjY2VzcyArPSBsZWdhY3lfc3VjY2VzczsKKwkJCWxxX3N0YS0+dG90YWxfZmFpbGVkICs9IHJldHJpZXMgKyAoMSAtIGxlZ2FjeV9zdWNjZXNzKTsKKwkJfQorCX0KKwkvKiBUaGUgbGFzdCBUWCByYXRlIGlzIGNhY2hlZCBpbiBscV9zdGE7IGl0J3Mgc2V0IGluIGlmL2Vsc2UgYWJvdmUgKi8KKwlscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzID0gdHhfcmF0ZTsKK2RvbmU6CisJLyogU2VlIGlmIHRoZXJlJ3MgYSBiZXR0ZXIgcmF0ZSBvciBtb2R1bGF0aW9uIG1vZGUgdG8gdHJ5LiAqLworCWlmIChzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdKQorCQlpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKGlsLCBza2IsIHN0YSwgbHFfc3RhKTsKK30KKworLyoKKyAqIEJlZ2luIGEgcGVyaW9kIG9mIHN0YXlpbmcgd2l0aCBhIHNlbGVjdGVkIG1vZHVsYXRpb24gbW9kZS4KKyAqIFNldCAic3RheV9pbl90YmwiIGZsYWcgdG8gcHJldmVudCBhbnkgbW9kZSBzd2l0Y2hlcy4KKyAqIFNldCBmcmFtZSB0eCBzdWNjZXNzIGxpbWl0cyBhY2NvcmRpbmcgdG8gbGVnYWN5IHZzLiBoaWdoLXRocm91Z2hwdXQsCisgKiBhbmQgcmVzZXQgb3ZlcmFsbCAoc3Bhbm5pbmcgYWxsIHJhdGVzKSB0eCBzdWNjZXNzIGhpc3Rvcnkgc3RhdHMuCisgKiBUaGVzZSBjb250cm9sIGhvdyBsb25nIHdlIHN0YXkgdXNpbmcgc2FtZSBtb2R1bGF0aW9uIG1vZGUgYmVmb3JlCisgKiBzZWFyY2hpbmcgZm9yIGEgbmV3IG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfc2V0X3N0YXlfaW5fdGFibGUoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpc19sZWdhY3ksCisJCQkgICAgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhKQoreworCURfUkFURSgid2UgYXJlIHN0YXlpbmcgaW4gdGhlIHNhbWUgdGFibGVcbiIpOworCWxxX3N0YS0+c3RheV9pbl90YmwgPSAxOwkvKiBvbmx5IHBsYWNlIHRoaXMgZ2V0cyBzZXQgKi8KKwlpZiAoaXNfbGVnYWN5KSB7CisJCWxxX3N0YS0+dGFibGVfY291bnRfbGltaXQgPSBJTF9MRUdBQ1lfVEJMX0NPVU5UOworCQlscV9zdGEtPm1heF9mYWlsdXJlX2xpbWl0ID0gSUxfTEVHQUNZX0ZBSUxVUkVfTElNSVQ7CisJCWxxX3N0YS0+bWF4X3N1Y2Nlc3NfbGltaXQgPSBJTF9MRUdBQ1lfU1VDQ0VTU19MSU1JVDsKKwl9IGVsc2UgeworCQlscV9zdGEtPnRhYmxlX2NvdW50X2xpbWl0ID0gSUxfTk9ORV9MRUdBQ1lfVEJMX0NPVU5UOworCQlscV9zdGEtPm1heF9mYWlsdXJlX2xpbWl0ID0gSUxfTk9ORV9MRUdBQ1lfRkFJTFVSRV9MSU1JVDsKKwkJbHFfc3RhLT5tYXhfc3VjY2Vzc19saW1pdCA9IElMX05PTkVfTEVHQUNZX1NVQ0NFU1NfTElNSVQ7CisJfQorCWxxX3N0YS0+dGFibGVfY291bnQgPSAwOworCWxxX3N0YS0+dG90YWxfZmFpbGVkID0gMDsKKwlscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgPSAwOworCWxxX3N0YS0+Zmx1c2hfdGltZXIgPSBqaWZmaWVzOworCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOworfQorCisvKgorICogRmluZCBjb3JyZWN0IHRocm91Z2hwdXQgdGFibGUgZm9yIGdpdmVuIG1vZGUgb2YgbW9kdWxhdGlvbgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUoc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJCSBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCkKK3sKKwkvKiBVc2VkIHRvIGNob29zZSBhbW9uZyBIVCB0YWJsZXMgKi8KKwlzMzIoKmh0X3RibF9wb2ludGVyKVtSQVRFX0NPVU5UXTsKKworCS8qIENoZWNrIGZvciBpbnZhbGlkIExRIHR5cGUgKi8KKwlpZiAoV0FSTl9PTl9PTkNFKCFpc19sZWdhY3kodGJsLT5scV90eXBlKSAmJiAhaXNfSHQodGJsLT5scV90eXBlKSkpIHsKKwkJdGJsLT5leHBlY3RlZF90cHQgPSBleHBlY3RlZF90cHRfbGVnYWN5OworCQlyZXR1cm47CisJfQorCisJLyogTGVnYWN5IHJhdGVzIGhhdmUgb25seSBvbmUgdGFibGUgKi8KKwlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKKwkJdGJsLT5leHBlY3RlZF90cHQgPSBleHBlY3RlZF90cHRfbGVnYWN5OworCQlyZXR1cm47CisJfQorCisJLyogQ2hvb3NlIGFtb25nIG1hbnkgSFQgdGFibGVzIGRlcGVuZGluZyBvbiBudW1iZXIgb2Ygc3RyZWFtcworCSAqIChTSVNPL01JTU8yKSwgY2hhbm5lbCB3aWR0aCAoMjAvNDApLCBTR0ksIGFuZCBhZ2dyZWdhdGlvbgorCSAqIHN0YXR1cyAqLworCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkgJiYgKCF0YmwtPmlzX2h0NDAgfHwgbHFfc3RhLT5pc19kdXApKQorCQlodF90YmxfcG9pbnRlciA9IGV4cGVjdGVkX3RwdF9zaXNvMjBNSHo7CisJZWxzZSBpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpKQorCQlodF90YmxfcG9pbnRlciA9IGV4cGVjdGVkX3RwdF9zaXNvNDBNSHo7CisJZWxzZSBpZiAoaXNfbWltbzIodGJsLT5scV90eXBlKSAmJiAoIXRibC0+aXNfaHQ0MCB8fCBscV9zdGEtPmlzX2R1cCkpCisJCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X21pbW8yXzIwTUh6OworCWVsc2UJCQkvKiBpZiAoaXNfbWltbzIodGJsLT5scV90eXBlKSkgPC0tIG11c3QgYmUgdHJ1ZSAqLworCQlodF90YmxfcG9pbnRlciA9IGV4cGVjdGVkX3RwdF9taW1vMl80ME1IejsKKworCWlmICghdGJsLT5pc19TR0kgJiYgIWxxX3N0YS0+aXNfYWdnKQkvKiBOb3JtYWwgKi8KKwkJdGJsLT5leHBlY3RlZF90cHQgPSBodF90YmxfcG9pbnRlclswXTsKKwllbHNlIGlmICh0YmwtPmlzX1NHSSAmJiAhbHFfc3RhLT5pc19hZ2cpCS8qIFNHSSAqLworCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzFdOworCWVsc2UgaWYgKCF0YmwtPmlzX1NHSSAmJiBscV9zdGEtPmlzX2FnZykJLyogQUdHICovCisJCXRibC0+ZXhwZWN0ZWRfdHB0ID0gaHRfdGJsX3BvaW50ZXJbMl07CisJZWxzZQkJCS8qIEFHRytTR0kgKi8KKwkJdGJsLT5leHBlY3RlZF90cHQgPSBodF90YmxfcG9pbnRlclszXTsKK30KKworLyoKKyAqIEZpbmQgc3RhcnRpbmcgcmF0ZSBmb3IgbmV3ICJzZWFyY2giIGhpZ2gtdGhyb3VnaHB1dCBtb2RlIG9mIG1vZHVsYXRpb24uCisgKiBHb2FsIGlzIHRvIGZpbmQgbG93ZXN0IGV4cGVjdGVkIHJhdGUgKHVuZGVyIHBlcmZlY3QgY29uZGl0aW9ucykgdGhhdCBpcworICogYWJvdmUgdGhlIGN1cnJlbnQgbWVhc3VyZWQgdGhyb3VnaHB1dCBvZiAiYWN0aXZlIiBtb2RlLCB0byBnaXZlIG5ldyBtb2RlCisgKiBhIGZhaXIgY2hhbmNlIHRvIHByb3ZlIGl0c2VsZiB3aXRob3V0IHRvbyBtYW55IGNoYWxsZW5nZXMuCisgKgorICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIHRyYW5zaXRpb25pbmcgdG8gbW9yZSBhZ2dyZXNzaXZlIG1vZHVsYXRpb24KKyAqIChpLmUuIGxlZ2FjeSB0byBTSVNPIG9yIE1JTU8sIG9yIFNJU08gdG8gTUlNTyksIGFzIHdlbGwgYXMgbGVzcyBhZ2dyZXNzaXZlCisgKiAoaS5lLiBNSU1PIHRvIFNJU08pLiAgV2hlbiBtb3ZpbmcgdG8gTUlNTywgYml0IHJhdGUgd2lsbCB0eXBpY2FsbHkgbmVlZAorICogdG8gZGVjcmVhc2UgdG8gbWF0Y2ggImFjdGl2ZSIgdGhyb3VnaHB1dC4gIFdoZW4gbW92aW5nIGZyb20gTUlNTyB0byBTSVNPLAorICogYml0IHJhdGUgd2lsbCB0eXBpY2FsbHkgbmVlZCB0byBpbmNyZWFzZSwgYnV0IG5vdCBpZiBwZXJmb3JtYW5jZSB3YXMgYmFkLgorICovCitzdGF0aWMgczMyCitpbDQ5NjVfcnNfZ2V0X2Jlc3RfcmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLAkvKiAic2VhcmNoIiAqLworCQkJdTE2IHJhdGVfbWFzaywgczggaWR4KQoreworCS8qICJhY3RpdmUiIHZhbHVlcyAqLworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqYWN0aXZlX3RibCA9CisJICAgICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOworCXMzMiBhY3RpdmVfc3IgPSBhY3RpdmVfdGJsLT53aW5baWR4XS5zdWNjZXNzX3JhdGlvOworCXMzMiBhY3RpdmVfdHB0ID0gYWN0aXZlX3RibC0+ZXhwZWN0ZWRfdHB0W2lkeF07CisKKwkvKiBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICovCisJczMyICp0cHRfdGJsID0gdGJsLT5leHBlY3RlZF90cHQ7CisKKwlzMzIgbmV3X3JhdGUsIGhpZ2gsIGxvdywgc3RhcnRfaGk7CisJdTE2IGhpZ2hfbG93OworCXM4IHJhdGUgPSBpZHg7CisKKwluZXdfcmF0ZSA9IGhpZ2ggPSBsb3cgPSBzdGFydF9oaSA9IFJBVEVfSU5WQUxJRDsKKworCWZvciAoOzspIHsKKwkJaGlnaF9sb3cgPQorCQkgICAgaWw0OTY1X3JzX2dldF9hZGphY2VudF9yYXRlKGlsLCByYXRlLCByYXRlX21hc2ssCisJCQkJCQl0YmwtPmxxX3R5cGUpOworCisJCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKKwkJaGlnaCA9IChoaWdoX2xvdyA+PiA4KSAmIDB4ZmY7CisKKwkJLyoKKwkJICogTG93ZXIgdGhlICJzZWFyY2giIGJpdCByYXRlLCB0byBnaXZlIG5ldyAic2VhcmNoIiBtb2RlCisJCSAqIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgdGhyb3VnaHB1dCBhcyAiYWN0aXZlIiBpZjoKKwkJICoKKwkJICogMSkgIkFjdGl2ZSIgbW9kZSBoYXMgYmVlbiB3b3JraW5nIG1vZGVzdGx5IHdlbGwgKGJ1dCBub3QKKwkJICogICAgZ3JlYXQpLCBhbmQgZXhwZWN0ZWQgInNlYXJjaCIgdGhyb3VnaHB1dCAodW5kZXIgcGVyZmVjdAorCQkgKiAgICBjb25kaXRpb25zKSBhdCBjYW5kaWRhdGUgcmF0ZSBpcyBhYm92ZSB0aGUgYWN0dWFsCisJCSAqICAgIG1lYXN1cmVkICJhY3RpdmUiIHRocm91Z2hwdXQgKGJ1dCBsZXNzIHRoYW4gZXhwZWN0ZWQKKwkJICogICAgImFjdGl2ZSIgdGhyb3VnaHB1dCB1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpLgorCQkgKiBPUgorCQkgKiAyKSAiQWN0aXZlIiBtb2RlIGhhcyBiZWVuIHdvcmtpbmcgcGVyZmVjdGx5IG9yIHZlcnkgd2VsbAorCQkgKiAgICBhbmQgZXhwZWN0ZWQgInNlYXJjaCIgdGhyb3VnaHB1dCAodW5kZXIgcGVyZmVjdAorCQkgKiAgICBjb25kaXRpb25zKSBhdCBjYW5kaWRhdGUgcmF0ZSBpcyBhYm92ZSBleHBlY3RlZAorCQkgKiAgICAiYWN0aXZlIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpLgorCQkgKi8KKwkJaWYgKCgxMDAgKiB0cHRfdGJsW3JhdGVdID4gbHFfc3RhLT5sYXN0X3RwdCAmJgorCQkgICAgIChhY3RpdmVfc3IgPiBSQVRFX0RFQ1JFQVNFX1RIICYmIGFjdGl2ZV9zciA8PSBSQVRFX0hJR0hfVEgKKwkJICAgICAgJiYgdHB0X3RibFtyYXRlXSA8PSBhY3RpdmVfdHB0KSkgfHwKKwkJICAgIChhY3RpdmVfc3IgPj0gUkFURV9TQ0FMRV9TV0lUQ0ggJiYKKwkJICAgICB0cHRfdGJsW3JhdGVdID4gYWN0aXZlX3RwdCkpIHsKKworCQkJLyogKDJuZCBvciBsYXRlciBwYXNzKQorCQkJICogSWYgd2UndmUgYWxyZWFkeSB0cmllZCB0byByYWlzZSB0aGUgcmF0ZSwgYW5kIGFyZQorCQkJICogbm93IHRyeWluZyB0byBsb3dlciBpdCwgdXNlIHRoZSBoaWdoZXIgcmF0ZS4gKi8KKwkJCWlmIChzdGFydF9oaSAhPSBSQVRFX0lOVkFMSUQpIHsKKwkJCQluZXdfcmF0ZSA9IHN0YXJ0X2hpOworCQkJCWJyZWFrOworCQkJfQorCisJCQluZXdfcmF0ZSA9IHJhdGU7CisKKwkJCS8qIExvb3AgYWdhaW4gd2l0aCBsb3dlciByYXRlICovCisJCQlpZiAobG93ICE9IFJBVEVfSU5WQUxJRCkKKwkJCQlyYXRlID0gbG93OworCisJCQkvKiBMb3dlciByYXRlIG5vdCBhdmFpbGFibGUsIHVzZSB0aGUgb3JpZ2luYWwgKi8KKwkJCWVsc2UKKwkJCQlicmVhazsKKworCQkJLyogRWxzZSB0cnkgdG8gcmFpc2UgdGhlICJzZWFyY2giIHJhdGUgdG8gbWF0Y2ggImFjdGl2ZSIgKi8KKwkJfSBlbHNlIHsKKwkJCS8qICgybmQgb3IgbGF0ZXIgcGFzcykKKwkJCSAqIElmIHdlJ3ZlIGFscmVhZHkgdHJpZWQgdG8gbG93ZXIgdGhlIHJhdGUsIGFuZCBhcmUKKwkJCSAqIG5vdyB0cnlpbmcgdG8gcmFpc2UgaXQsIHVzZSB0aGUgbG93ZXIgcmF0ZS4gKi8KKwkJCWlmIChuZXdfcmF0ZSAhPSBSQVRFX0lOVkFMSUQpCisJCQkJYnJlYWs7CisKKwkJCS8qIExvb3AgYWdhaW4gd2l0aCBoaWdoZXIgcmF0ZSAqLworCQkJZWxzZSBpZiAoaGlnaCAhPSBSQVRFX0lOVkFMSUQpIHsKKwkJCQlzdGFydF9oaSA9IGhpZ2g7CisJCQkJcmF0ZSA9IGhpZ2g7CisKKwkJCQkvKiBIaWdoZXIgcmF0ZSBub3QgYXZhaWxhYmxlLCB1c2UgdGhlIG9yaWdpbmFsICovCisJCQl9IGVsc2UgeworCQkJCW5ld19yYXRlID0gcmF0ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBuZXdfcmF0ZTsKK30KKworLyoKKyAqIFNldCB1cCBzZWFyY2ggdGFibGUgZm9yIE1JTU8yCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9yc19zd2l0Y2hfdG9fbWltbzIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwsIGludCBpZHgpCit7CisJdTE2IHJhdGVfbWFzazsKKwlzMzIgcmF0ZTsKKwlzOCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7CisKKwlpZiAoIWNvbmZfaXNfaHQoY29uZikgfHwgIXN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCgoc3RhLT5odF9jYXAuY2FwICYgSUVFRTgwMjExX0hUX0NBUF9TTV9QUykgPj4gMikgPT0KKwkgICAgV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDKQorCQlyZXR1cm4gLTE7CisKKwkvKiBOZWVkIGJvdGggVHggY2hhaW5zL2FudGVubmFzIHRvIHN1cHBvcnQgTUlNTyAqLworCWlmIChpbC0+aHdfcGFyYW1zLnR4X2NoYWluc19udW0gPCAyKQorCQlyZXR1cm4gLTE7CisKKwlEX1JBVEUoIkxROiB0cnkgdG8gc3dpdGNoIHRvIE1JTU8yXG4iKTsKKworCXRibC0+bHFfdHlwZSA9IExRX01JTU8yOworCXRibC0+aXNfZHVwID0gbHFfc3RhLT5pc19kdXA7CisJdGJsLT5hY3Rpb24gPSAwOworCXRibC0+bWF4X3NlYXJjaCA9IElMX01BWF9TRUFSQ0g7CisJcmF0ZV9tYXNrID0gbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZTsKKworCWlmIChpbF9pc19odDQwX3R4X2FsbG93ZWQoaWwsIGN0eCwgJnN0YS0+aHRfY2FwKSkKKwkJdGJsLT5pc19odDQwID0gMTsKKwllbHNlCisJCXRibC0+aXNfaHQ0MCA9IDA7CisKKwlpbDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHRibCk7CisKKwlyYXRlID0gaWw0OTY1X3JzX2dldF9iZXN0X3JhdGUoaWwsIGxxX3N0YSwgdGJsLCByYXRlX21hc2ssIGlkeCk7CisKKwlEX1JBVEUoIkxROiBNSU1PMiBiZXN0IHJhdGUgJWQgbWFzayAlWFxuIiwgcmF0ZSwgcmF0ZV9tYXNrKTsKKwlpZiAocmF0ZSA9PSBSQVRFX0lOVkFMSUQgfHwgISgoMSA8PCByYXRlKSAmIHJhdGVfbWFzaykpIHsKKwkJRF9SQVRFKCJDYW4ndCBzd2l0Y2ggd2l0aCBpZHggJWQgcmF0ZSBtYXNrICV4XG4iLCByYXRlLAorCQkgICAgICAgcmF0ZV9tYXNrKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0YmwtPmN1cnJlbnRfcmF0ZSA9CisJICAgIGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHRibCwgcmF0ZSwgaXNfZ3JlZW4pOworCisJRF9SQVRFKCJMUTogU3dpdGNoIHRvIG5ldyBtY3MgJVggaWR4IGlzIGdyZWVuICVYXG4iLCB0YmwtPmN1cnJlbnRfcmF0ZSwKKwkgICAgICAgaXNfZ3JlZW4pOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHVwIHNlYXJjaCB0YWJsZSBmb3IgU0lTTworICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfc3dpdGNoX3RvX3Npc28oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJIHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgaWR4KQoreworCXUxNiByYXRlX21hc2s7CisJdTggaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOworCXMzMiByYXRlOworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OworCisJaWYgKCFjb25mX2lzX2h0KGNvbmYpIHx8ICFzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpCisJCXJldHVybiAtMTsKKworCURfUkFURSgiTFE6IHRyeSB0byBzd2l0Y2ggdG8gU0lTT1xuIik7CisKKwl0YmwtPmlzX2R1cCA9IGxxX3N0YS0+aXNfZHVwOworCXRibC0+bHFfdHlwZSA9IExRX1NJU087CisJdGJsLT5hY3Rpb24gPSAwOworCXRibC0+bWF4X3NlYXJjaCA9IElMX01BWF9TRUFSQ0g7CisJcmF0ZV9tYXNrID0gbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlOworCisJaWYgKGlsX2lzX2h0NDBfdHhfYWxsb3dlZChpbCwgY3R4LCAmc3RhLT5odF9jYXApKQorCQl0YmwtPmlzX2h0NDAgPSAxOworCWVsc2UKKwkJdGJsLT5pc19odDQwID0gMDsKKworCWlmIChpc19ncmVlbikKKwkJdGJsLT5pc19TR0kgPSAwOwkvKjExbiBzcGVjOiBubyBTR0kgaW4gU0lTTytHcmVlbmZpZWxkICovCisKKwlpbDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHRibCk7CisJcmF0ZSA9IGlsNDk2NV9yc19nZXRfYmVzdF9yYXRlKGlsLCBscV9zdGEsIHRibCwgcmF0ZV9tYXNrLCBpZHgpOworCisJRF9SQVRFKCJMUTogZ2V0IGJlc3QgcmF0ZSAlZCBtYXNrICVYXG4iLCByYXRlLCByYXRlX21hc2spOworCWlmIChyYXRlID09IFJBVEVfSU5WQUxJRCB8fCAhKCgxIDw8IHJhdGUpICYgcmF0ZV9tYXNrKSkgeworCQlEX1JBVEUoImNhbiBub3Qgc3dpdGNoIHdpdGggaWR4ICVkIHJhdGUgbWFzayAleFxuIiwgcmF0ZSwKKwkJICAgICAgIHJhdGVfbWFzayk7CisJCXJldHVybiAtMTsKKwl9CisJdGJsLT5jdXJyZW50X3JhdGUgPQorCSAgICBpbDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGlsLCB0YmwsIHJhdGUsIGlzX2dyZWVuKTsKKwlEX1JBVEUoIkxROiBTd2l0Y2ggdG8gbmV3IG1jcyAlWCBpZHggaXMgZ3JlZW4gJVhcbiIsIHRibC0+Y3VycmVudF9yYXRlLAorCSAgICAgICBpc19ncmVlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUcnkgdG8gc3dpdGNoIHRvIG5ldyBtb2R1bGF0aW9uIG1vZGUgZnJvbSBsZWdhY3kKKyAqLworc3RhdGljIGludAoraWw0OTY1X3JzX21vdmVfbGVnYWN5X290aGVyKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBpbnQgaWR4KQoreworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICpzZWFyY2hfdGJsID0KKwkgICAgJihscV9zdGEtPmxxX2luZm9bKDEgLSBscV9zdGEtPmFjdGl2ZV90YmwpXSk7CisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luID0gJih0YmwtPndpbltpZHhdKTsKKwl1MzIgc3ogPQorCSAgICAoc2l6ZW9mKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbykgLQorCSAgICAgKHNpemVvZihzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhKSAqIFJBVEVfQ09VTlQpKTsKKwl1OCBzdGFydF9hY3Rpb247CisJdTggdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJdTggdHhfY2hhaW5zX251bSA9IGlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKKwlpbnQgcmV0ID0gMDsKKwl1OCB1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMDsKKworCXRibC0+YWN0aW9uID0gSUxfTEVHQUNZX1NXSVRDSF9TSVNPOworCisJc3RhcnRfYWN0aW9uID0gdGJsLT5hY3Rpb247CisJZm9yICg7OykgeworCQlscV9zdGEtPmFjdGlvbl9jb3VudGVyKys7CisJCXN3aXRjaCAodGJsLT5hY3Rpb24pIHsKKwkJY2FzZSBJTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOgorCQljYXNlIElMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTI6CisJCQlEX1JBVEUoIkxROiBMZWdhY3kgdG9nZ2xlIEFudGVubmFcbiIpOworCisJCQlpZiAoKHRibC0+YWN0aW9uID09IElMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTEgJiYKKwkJCSAgICAgdHhfY2hhaW5zX251bSA8PSAxKSB8fAorCQkJICAgICh0YmwtPmFjdGlvbiA9PSBJTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkEyICYmCisJCQkgICAgIHR4X2NoYWluc19udW0gPD0gMikpCisJCQkJYnJlYWs7CisKKwkJCS8qIERvbid0IGNoYW5nZSBhbnRlbm5hIGlmIHN1Y2Nlc3MgaGFzIGJlZW4gZ3JlYXQgKi8KKwkJCWlmICh3aW4tPnN1Y2Nlc3NfcmF0aW8gPj0gSUxfUlNfR09PRF9SQVRJTykKKwkJCQlicmVhazsKKworCQkJLyogU2V0IHVwIHNlYXJjaCB0YWJsZSB0byB0cnkgb3RoZXIgYW50ZW5uYSAqLworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCisJCQlpZiAoaWw0OTY1X3JzX3RvZ2dsZV9hbnRlbm5hCisJCQkgICAgKHZhbGlkX3R4X2FudCwgJnNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSwKKwkJCSAgICAgc2VhcmNoX3RibCkpIHsKKwkJCQl1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMTsKKwkJCQlpbDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsCisJCQkJCQkJCSBzZWFyY2hfdGJsKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElMX0xFR0FDWV9TV0lUQ0hfU0lTTzoKKwkJCURfUkFURSgiTFE6IExlZ2FjeSBzd2l0Y2ggdG8gU0lTT1xuIik7CisKKwkJCS8qIFNldCB1cCBzZWFyY2ggdGFibGUgdG8gdHJ5IFNJU08gKi8KKwkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKKwkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7CisJCQlyZXQgPQorCQkJICAgIGlsNDk2NV9yc19zd2l0Y2hfdG9fc2lzbyhpbCwgbHFfc3RhLCBjb25mLCBzdGEsCisJCQkJCQkgICAgIHNlYXJjaF90YmwsIGlkeCk7CisJCQlpZiAoIXJldCkgeworCQkJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlicmVhazsKKwkJY2FzZSBJTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FCOgorCQljYXNlIElMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQUM6CisJCWNhc2UgSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQzoKKwkJCURfUkFURSgiTFE6IExlZ2FjeSBzd2l0Y2ggdG8gTUlNTzJcbiIpOworCisJCQkvKiBTZXQgdXAgc2VhcmNoIHRhYmxlIHRvIHRyeSBNSU1PICovCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisJCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAwOworCisJCQlpZiAodGJsLT5hY3Rpb24gPT0gSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQikKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BQjsKKwkJCWVsc2UgaWYgKHRibC0+YWN0aW9uID09IElMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQUMpCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUM7CisJCQllbHNlCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQkM7CisKKwkJCWlmICghaWw0OTY1X3JzX2lzX3ZhbGlkX2FudAorCQkJICAgICh2YWxpZF90eF9hbnQsIHNlYXJjaF90YmwtPmFudF90eXBlKSkKKwkJCQlicmVhazsKKworCQkJcmV0ID0KKwkJCSAgICBpbDQ5NjVfcnNfc3dpdGNoX3RvX21pbW8yKGlsLCBscV9zdGEsIGNvbmYsIHN0YSwKKwkJCQkJCSAgICAgIHNlYXJjaF90YmwsIGlkeCk7CisJCQlpZiAoIXJldCkgeworCQkJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJdGJsLT5hY3Rpb24rKzsKKwkJaWYgKHRibC0+YWN0aW9uID4gSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQykKKwkJCXRibC0+YWN0aW9uID0gSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMTsKKworCQlpZiAodGJsLT5hY3Rpb24gPT0gc3RhcnRfYWN0aW9uKQorCQkJYnJlYWs7CisKKwl9CisJc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7CisJcmV0dXJuIDA7CisKK291dDoKKwlscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsID0gMTsKKwl0YmwtPmFjdGlvbisrOworCWlmICh0YmwtPmFjdGlvbiA+IElMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQkMpCisJCXRibC0+YWN0aW9uID0gSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMTsKKwlpZiAodXBkYXRlX3NlYXJjaF90YmxfY291bnRlcikKKwkJc2VhcmNoX3RibC0+YWN0aW9uID0gdGJsLT5hY3Rpb247CisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIFRyeSB0byBzd2l0Y2ggdG8gbmV3IG1vZHVsYXRpb24gbW9kZSBmcm9tIFNJU08KKyAqLworc3RhdGljIGludAoraWw0OTY1X3JzX21vdmVfc2lzb190b19vdGhlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBpbnQgaWR4KQoreworCXU4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqc2VhcmNoX3RibCA9CisJICAgICYobHFfc3RhLT5scV9pbmZvWygxIC0gbHFfc3RhLT5hY3RpdmVfdGJsKV0pOworCXN0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEgKndpbiA9ICYodGJsLT53aW5baWR4XSk7CisJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAgPSAmc3RhLT5odF9jYXA7CisJdTMyIHN6ID0KKwkgICAgKHNpemVvZihzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8pIC0KKwkgICAgIChzaXplb2Yoc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSkgKiBSQVRFX0NPVU5UKSk7CisJdTggc3RhcnRfYWN0aW9uOworCXU4IHZhbGlkX3R4X2FudCA9IGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50OworCXU4IHR4X2NoYWluc19udW0gPSBpbC0+aHdfcGFyYW1zLnR4X2NoYWluc19udW07CisJdTggdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDA7CisJaW50IHJldDsKKworCXN0YXJ0X2FjdGlvbiA9IHRibC0+YWN0aW9uOworCisJZm9yICg7OykgeworCQlscV9zdGEtPmFjdGlvbl9jb3VudGVyKys7CisJCXN3aXRjaCAodGJsLT5hY3Rpb24pIHsKKwkJY2FzZSBJTF9TSVNPX1NXSVRDSF9BTlRFTk5BMToKKwkJY2FzZSBJTF9TSVNPX1NXSVRDSF9BTlRFTk5BMjoKKwkJCURfUkFURSgiTFE6IFNJU08gdG9nZ2xlIEFudGVubmFcbiIpOworCQkJaWYgKCh0YmwtPmFjdGlvbiA9PSBJTF9TSVNPX1NXSVRDSF9BTlRFTk5BMSAmJgorCQkJICAgICB0eF9jaGFpbnNfbnVtIDw9IDEpIHx8CisJCQkgICAgKHRibC0+YWN0aW9uID09IElMX1NJU09fU1dJVENIX0FOVEVOTkEyICYmCisJCQkgICAgIHR4X2NoYWluc19udW0gPD0gMikpCisJCQkJYnJlYWs7CisKKwkJCWlmICh3aW4tPnN1Y2Nlc3NfcmF0aW8gPj0gSUxfUlNfR09PRF9SQVRJTykKKwkJCQlicmVhazsKKworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCQkJaWYgKGlsNDk2NV9yc190b2dnbGVfYW50ZW5uYQorCQkJICAgICh2YWxpZF90eF9hbnQsICZzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUsCisJCQkgICAgIHNlYXJjaF90YmwpKSB7CisJCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9BQjoKKwkJY2FzZSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9BQzoKKwkJY2FzZSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9CQzoKKwkJCURfUkFURSgiTFE6IFNJU08gc3dpdGNoIHRvIE1JTU8yXG4iKTsKKwkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKKwkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7CisKKwkJCWlmICh0YmwtPmFjdGlvbiA9PSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9BQikKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BQjsKKwkJCWVsc2UgaWYgKHRibC0+YWN0aW9uID09IElMX1NJU09fU1dJVENIX01JTU8yX0FDKQorCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0FDOworCQkJZWxzZQorCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0JDOworCisJCQlpZiAoIWlsNDk2NV9yc19pc192YWxpZF9hbnQKKwkJCSAgICAodmFsaWRfdHhfYW50LCBzZWFyY2hfdGJsLT5hbnRfdHlwZSkpCisJCQkJYnJlYWs7CisKKwkJCXJldCA9CisJCQkgICAgaWw0OTY1X3JzX3N3aXRjaF90b19taW1vMihpbCwgbHFfc3RhLCBjb25mLCBzdGEsCisJCQkJCQkgICAgICBzZWFyY2hfdGJsLCBpZHgpOworCQkJaWYgKCFyZXQpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBJTF9TSVNPX1NXSVRDSF9HSToKKwkJCWlmICghdGJsLT5pc19odDQwICYmCisJCQkgICAgIShodF9jYXAtPmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSkKKwkJCQlicmVhazsKKwkJCWlmICh0YmwtPmlzX2h0NDAgJiYKKwkJCSAgICAhKGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQorCQkJCWJyZWFrOworCisJCQlEX1JBVEUoIkxROiBTSVNPIHRvZ2dsZSBTR0kvTkdJXG4iKTsKKworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCQkJaWYgKGlzX2dyZWVuKSB7CisJCQkJaWYgKCF0YmwtPmlzX1NHSSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZQorCQkJCQlJTF9FUlIoIlNHSSB3YXMgc2V0IGluIEdGK1NJU09cbiIpOworCQkJfQorCQkJc2VhcmNoX3RibC0+aXNfU0dJID0gIXRibC0+aXNfU0dJOworCQkJaWw0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUobHFfc3RhLCBzZWFyY2hfdGJsKTsKKwkJCWlmICh0YmwtPmlzX1NHSSkgeworCQkJCXMzMiB0cHQgPSBscV9zdGEtPmxhc3RfdHB0IC8gMTAwOworCQkJCWlmICh0cHQgPj0gc2VhcmNoX3RibC0+ZXhwZWN0ZWRfdHB0W2lkeF0pCisJCQkJCWJyZWFrOworCQkJfQorCQkJc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlID0KKwkJCSAgICBpbDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGlsLCBzZWFyY2hfdGJsLCBpZHgsCisJCQkJCQkJIGlzX2dyZWVuKTsKKwkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJdGJsLT5hY3Rpb24rKzsKKwkJaWYgKHRibC0+YWN0aW9uID4gSUxfU0lTT19TV0lUQ0hfR0kpCisJCQl0YmwtPmFjdGlvbiA9IElMX1NJU09fU1dJVENIX0FOVEVOTkExOworCisJCWlmICh0YmwtPmFjdGlvbiA9PSBzdGFydF9hY3Rpb24pCisJCQlicmVhazsKKwl9CisJc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7CisJcmV0dXJuIDA7CisKK291dDoKKwlscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsID0gMTsKKwl0YmwtPmFjdGlvbisrOworCWlmICh0YmwtPmFjdGlvbiA+IElMX1NJU09fU1dJVENIX0dJKQorCQl0YmwtPmFjdGlvbiA9IElMX1NJU09fU1dJVENIX0FOVEVOTkExOworCWlmICh1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyKQorCQlzZWFyY2hfdGJsLT5hY3Rpb24gPSB0YmwtPmFjdGlvbjsKKworCXJldHVybiAwOworfQorCisvKgorICogVHJ5IHRvIHN3aXRjaCB0byBuZXcgbW9kdWxhdGlvbiBtb2RlIGZyb20gTUlNTzIKKyAqLworc3RhdGljIGludAoraWw0OTY1X3JzX21vdmVfbWltbzJfdG9fb3RoZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBpbnQgaWR4KQoreworCXM4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqc2VhcmNoX3RibCA9CisJICAgICYobHFfc3RhLT5scV9pbmZvWygxIC0gbHFfc3RhLT5hY3RpdmVfdGJsKV0pOworCXN0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEgKndpbiA9ICYodGJsLT53aW5baWR4XSk7CisJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAgPSAmc3RhLT5odF9jYXA7CisJdTMyIHN6ID0KKwkgICAgKHNpemVvZihzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8pIC0KKwkgICAgIChzaXplb2Yoc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSkgKiBSQVRFX0NPVU5UKSk7CisJdTggc3RhcnRfYWN0aW9uOworCXU4IHZhbGlkX3R4X2FudCA9IGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50OworCXU4IHR4X2NoYWluc19udW0gPSBpbC0+aHdfcGFyYW1zLnR4X2NoYWluc19udW07CisJdTggdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDA7CisJaW50IHJldDsKKworCXN0YXJ0X2FjdGlvbiA9IHRibC0+YWN0aW9uOworCWZvciAoOzspIHsKKwkJbHFfc3RhLT5hY3Rpb25fY291bnRlcisrOworCQlzd2l0Y2ggKHRibC0+YWN0aW9uKSB7CisJCWNhc2UgSUxfTUlNTzJfU1dJVENIX0FOVEVOTkExOgorCQljYXNlIElMX01JTU8yX1NXSVRDSF9BTlRFTk5BMjoKKwkJCURfUkFURSgiTFE6IE1JTU8yIHRvZ2dsZSBBbnRlbm5hc1xuIik7CisKKwkJCWlmICh0eF9jaGFpbnNfbnVtIDw9IDIpCisJCQkJYnJlYWs7CisKKwkJCWlmICh3aW4tPnN1Y2Nlc3NfcmF0aW8gPj0gSUxfUlNfR09PRF9SQVRJTykKKwkJCQlicmVhazsKKworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCQkJaWYgKGlsNDk2NV9yc190b2dnbGVfYW50ZW5uYQorCQkJICAgICh2YWxpZF90eF9hbnQsICZzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUsCisJCQkgICAgIHNlYXJjaF90YmwpKSB7CisJCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJTF9NSU1PMl9TV0lUQ0hfU0lTT19BOgorCQljYXNlIElMX01JTU8yX1NXSVRDSF9TSVNPX0I6CisJCWNhc2UgSUxfTUlNTzJfU1dJVENIX1NJU09fQzoKKwkJCURfUkFURSgiTFE6IE1JTU8yIHN3aXRjaCB0byBTSVNPXG4iKTsKKworCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIFNJU08gKi8KKwkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKKworCQkJaWYgKHRibC0+YWN0aW9uID09IElMX01JTU8yX1NXSVRDSF9TSVNPX0EpCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQTsKKwkJCWVsc2UgaWYgKHRibC0+YWN0aW9uID09IElMX01JTU8yX1NXSVRDSF9TSVNPX0IpCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQjsKKwkJCWVsc2UKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9DOworCisJCQlpZiAoIWlsNDk2NV9yc19pc192YWxpZF9hbnQKKwkJCSAgICAodmFsaWRfdHhfYW50LCBzZWFyY2hfdGJsLT5hbnRfdHlwZSkpCisJCQkJYnJlYWs7CisKKwkJCXJldCA9CisJCQkgICAgaWw0OTY1X3JzX3N3aXRjaF90b19zaXNvKGlsLCBscV9zdGEsIGNvbmYsIHN0YSwKKwkJCQkJCSAgICAgc2VhcmNoX3RibCwgaWR4KTsKKwkJCWlmICghcmV0KQorCQkJCWdvdG8gb3V0OworCisJCQlicmVhazsKKworCQljYXNlIElMX01JTU8yX1NXSVRDSF9HSToKKwkJCWlmICghdGJsLT5pc19odDQwICYmCisJCQkgICAgIShodF9jYXAtPmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSkKKwkJCQlicmVhazsKKwkJCWlmICh0YmwtPmlzX2h0NDAgJiYKKwkJCSAgICAhKGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQorCQkJCWJyZWFrOworCisJCQlEX1JBVEUoIkxROiBNSU1PMiB0b2dnbGUgU0dJL05HSVxuIik7CisKKwkJCS8qIFNldCB1cCBuZXcgc2VhcmNoIHRhYmxlIGZvciBNSU1PMiAqLworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCQkJc2VhcmNoX3RibC0+aXNfU0dJID0gIXRibC0+aXNfU0dJOworCQkJaWw0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUobHFfc3RhLCBzZWFyY2hfdGJsKTsKKwkJCS8qCisJCQkgKiBJZiBhY3RpdmUgdGFibGUgYWxyZWFkeSB1c2VzIHRoZSBmYXN0ZXN0IHBvc3NpYmxlCisJCQkgKiBtb2R1bGF0aW9uIChkdWFsIHN0cmVhbSB3aXRoIHNob3J0IGd1YXJkIGludGVydmFsKSwKKwkJCSAqIGFuZCBpdCdzIHdvcmtpbmcgd2VsbCwgdGhlcmUncyBubyBuZWVkIHRvIGxvb2sKKwkJCSAqIGZvciBhIGJldHRlciB0eXBlIG9mIG1vZHVsYXRpb24hCisJCQkgKi8KKwkJCWlmICh0YmwtPmlzX1NHSSkgeworCQkJCXMzMiB0cHQgPSBscV9zdGEtPmxhc3RfdHB0IC8gMTAwOworCQkJCWlmICh0cHQgPj0gc2VhcmNoX3RibC0+ZXhwZWN0ZWRfdHB0W2lkeF0pCisJCQkJCWJyZWFrOworCQkJfQorCQkJc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlID0KKwkJCSAgICBpbDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGlsLCBzZWFyY2hfdGJsLCBpZHgsCisJCQkJCQkJIGlzX2dyZWVuKTsKKwkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOworCQkJZ290byBvdXQ7CisKKwkJfQorCQl0YmwtPmFjdGlvbisrOworCQlpZiAodGJsLT5hY3Rpb24gPiBJTF9NSU1PMl9TV0lUQ0hfR0kpCisJCQl0YmwtPmFjdGlvbiA9IElMX01JTU8yX1NXSVRDSF9BTlRFTk5BMTsKKworCQlpZiAodGJsLT5hY3Rpb24gPT0gc3RhcnRfYWN0aW9uKQorCQkJYnJlYWs7CisJfQorCXNlYXJjaF90YmwtPmxxX3R5cGUgPSBMUV9OT05FOworCXJldHVybiAwOworb3V0OgorCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAxOworCXRibC0+YWN0aW9uKys7CisJaWYgKHRibC0+YWN0aW9uID4gSUxfTUlNTzJfU1dJVENIX0dJKQorCQl0YmwtPmFjdGlvbiA9IElMX01JTU8yX1NXSVRDSF9BTlRFTk5BMTsKKwlpZiAodXBkYXRlX3NlYXJjaF90YmxfY291bnRlcikKKwkJc2VhcmNoX3RibC0+YWN0aW9uID0gdGJsLT5hY3Rpb247CisKKwlyZXR1cm4gMDsKKworfQorCisvKgorICogQ2hlY2sgd2hldGhlciB3ZSBzaG91bGQgY29udGludWUgdXNpbmcgc2FtZSBtb2R1bGF0aW9uIG1vZGUsIG9yCisgKiBiZWdpbiBzZWFyY2ggZm9yIGEgbmV3IG1vZGUsIGJhc2VkIG9uOgorICogMSkgIyB0eCBzdWNjZXNzZXMgb3IgZmFpbHVyZXMgd2hpbGUgdXNpbmcgdGhpcyBtb2RlCisgKiAyKSAjIHRpbWVzIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogMykgZWxhcHNlZCB0aW1lIGluIHRoaXMgbW9kZSAobm90IHVzZWQsIGZvciBub3cpCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfc3RheV9pbl90YWJsZShzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsIGJvb2wgZm9yY2Vfc2VhcmNoKQoreworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsOworCWludCBpOworCWludCBhY3RpdmVfdGJsOworCWludCBmbHVzaF9pbnRlcnZhbF9wYXNzZWQgPSAwOworCXN0cnVjdCBpbF9wcml2ICppbDsKKworCWlsID0gbHFfc3RhLT5kcnY7CisJYWN0aXZlX3RibCA9IGxxX3N0YS0+YWN0aXZlX3RibDsKKworCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKKworCS8qIElmIHdlJ3ZlIGJlZW4gZGlzYWxsb3dpbmcgc2VhcmNoLCBzZWUgaWYgd2Ugc2hvdWxkIG5vdyBhbGxvdyBpdCAqLworCWlmIChscV9zdGEtPnN0YXlfaW5fdGJsKSB7CisKKwkJLyogRWxhcHNlZCB0aW1lIHVzaW5nIGN1cnJlbnQgbW9kdWxhdGlvbiBtb2RlICovCisJCWlmIChscV9zdGEtPmZsdXNoX3RpbWVyKQorCQkJZmx1c2hfaW50ZXJ2YWxfcGFzc2VkID0KKwkJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKShscV9zdGEtPmZsdXNoX3RpbWVyICsKKwkJCQkJCSAgICAgICBSQVRFX1NDQUxFX0ZMVVNIX0lOVFZMKSk7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgd2Ugc2hvdWxkIGFsbG93IHNlYXJjaCBmb3IgbmV3IG1vZHVsYXRpb24gbW9kZS4KKwkJICogSWYgbWFueSBmcmFtZXMgaGF2ZSBmYWlsZWQgb3Igc3VjY2VlZGVkLCBvciB3ZSd2ZSB1c2VkCisJCSAqIHRoaXMgc2FtZSBtb2R1bGF0aW9uIGZvciBhIGxvbmcgdGltZSwgYWxsb3cgc2VhcmNoLCBhbmQKKwkJICogcmVzZXQgaGlzdG9yeSBzdGF0cyB0aGF0IGtlZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSBzaG91bGQKKwkJICogYWxsb3cgYSBuZXcgc2VhcmNoLiAgQWxzbyAoYmVsb3cpIHJlc2V0IGFsbCBiaXRtYXBzIGFuZAorCQkgKiBzdGF0cyBpbiBhY3RpdmUgaGlzdG9yeS4KKwkJICovCisJCWlmIChmb3JjZV9zZWFyY2ggfHwKKwkJICAgIGxxX3N0YS0+dG90YWxfZmFpbGVkID4gbHFfc3RhLT5tYXhfZmFpbHVyZV9saW1pdCB8fAorCQkgICAgbHFfc3RhLT50b3RhbF9zdWNjZXNzID4gbHFfc3RhLT5tYXhfc3VjY2Vzc19saW1pdCB8fAorCQkgICAgKCFscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsICYmIGxxX3N0YS0+Zmx1c2hfdGltZXIgJiYKKwkJICAgICBmbHVzaF9pbnRlcnZhbF9wYXNzZWQpKSB7CisJCQlEX1JBVEUoIkxROiBzdGF5IGlzIGV4cGlyZWQgJWQgJWQgJWRcbjoiLAorCQkJICAgICAgIGxxX3N0YS0+dG90YWxfZmFpbGVkLCBscV9zdGEtPnRvdGFsX3N1Y2Nlc3MsCisJCQkgICAgICAgZmx1c2hfaW50ZXJ2YWxfcGFzc2VkKTsKKworCQkJLyogQWxsb3cgc2VhcmNoIGZvciBuZXcgbW9kZSAqLworCQkJbHFfc3RhLT5zdGF5X2luX3RibCA9IDA7CS8qIG9ubHkgcGxhY2UgcmVzZXQgKi8KKwkJCWxxX3N0YS0+dG90YWxfZmFpbGVkID0gMDsKKwkJCWxxX3N0YS0+dG90YWxfc3VjY2VzcyA9IDA7CisJCQlscV9zdGEtPmZsdXNoX3RpbWVyID0gMDsKKworCQkJLyoKKwkJCSAqIEVsc2UgaWYgd2UndmUgdXNlZCB0aGlzIG1vZHVsYXRpb24gbW9kZSBlbm91Z2ggcmVwZXRpdGlvbnMKKwkJCSAqIChyZWdhcmRsZXNzIG9mIGVsYXBzZWQgdGltZSBvciBzdWNjZXNzL2ZhaWx1cmUpLCByZXNldAorCQkJICogaGlzdG9yeSBiaXRtYXBzIGFuZCByYXRlLXNwZWNpZmljIHN0YXRzIGZvciBhbGwgcmF0ZXMgaW4KKwkJCSAqIGFjdGl2ZSB0YWJsZS4KKwkJCSAqLworCQl9IGVsc2UgeworCQkJbHFfc3RhLT50YWJsZV9jb3VudCsrOworCQkJaWYgKGxxX3N0YS0+dGFibGVfY291bnQgPj0gbHFfc3RhLT50YWJsZV9jb3VudF9saW1pdCkgeworCQkJCWxxX3N0YS0+dGFibGVfY291bnQgPSAwOworCisJCQkJRF9SQVRFKCJMUTogc3RheSBpbiB0YWJsZSBjbGVhciB3aW5cbiIpOworCQkJCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UOyBpKyspCisJCQkJCWlsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbigmCisJCQkJCQkJCSAgICAgICAodGJsLT4KKwkJCQkJCQkJCXdpbgorCQkJCQkJCQkJW2ldKSk7CisJCQl9CisJCX0KKworCQkvKiBJZiB0cmFuc2l0aW9uaW5nIHRvIGFsbG93ICJzZWFyY2giLCByZXNldCBhbGwgaGlzdG9yeQorCQkgKiBiaXRtYXBzIGFuZCBzdGF0cyBpbiBhY3RpdmUgdGFibGUgKHRoaXMgd2lsbCBiZWNvbWUgdGhlIG5ldworCQkgKiAic2VhcmNoIiB0YWJsZSkuICovCisJCWlmICghbHFfc3RhLT5zdGF5X2luX3RibCkgeworCQkJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlQ7IGkrKykKKwkJCQlpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9jbGVhcl93aW4oJih0YmwtPndpbltpXSkpOworCQl9CisJfQorfQorCisvKgorICogc2V0dXAgcmF0ZSB0YWJsZSBpbiB1Q29kZQorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX3VwZGF0ZV9yYXRlX3RibChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJICBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwgaW50IGlkeCwgdTggaXNfZ3JlZW4pCit7CisJdTMyIHJhdGU7CisKKwkvKiBVcGRhdGUgdUNvZGUncyByYXRlIHRhYmxlLiAqLworCXJhdGUgPSBpbDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGlsLCB0YmwsIGlkeCwgaXNfZ3JlZW4pOworCWlsNDk2NV9yc19maWxsX2xpbmtfY21kKGlsLCBscV9zdGEsIHJhdGUpOworCWlsX3NlbmRfbHFfY21kKGlsLCBjdHgsICZscV9zdGEtPmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKK30KKworLyoKKyAqIERvIHJhdGUgc2NhbGluZyBhbmQgc2VhcmNoIGZvciBuZXcgbW9kdWxhdGlvbiBtb2RlLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX3JhdGVfc2NhbGVfcGVyZm9ybShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgICAgIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGlsLT5odzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJaW50IGxvdyA9IFJBVEVfSU5WQUxJRDsKKwlpbnQgaGlnaCA9IFJBVEVfSU5WQUxJRDsKKwlpbnQgaWR4OworCWludCBpOworCXN0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEgKndpbiA9IE5VTEw7CisJaW50IGN1cnJlbnRfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwlpbnQgbG93X3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisJaW50IGhpZ2hfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwl1MzIgZmFpbF9jb3VudDsKKwlzOCBzY2FsZV9hY3Rpb24gPSAwOworCXUxNiByYXRlX21hc2s7CisJdTggdXBkYXRlX2xxID0gMDsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwgKnRibDE7CisJdTE2IHJhdGVfc2NhbGVfaWR4X21zayA9IDA7CisJdTggaXNfZ3JlZW4gPSAwOworCXU4IGFjdGl2ZV90YmwgPSAwOworCXU4IGRvbmVfc2VhcmNoID0gMDsKKwl1MTYgaGlnaF9sb3c7CisJczMyIHNyOworCXU4IHRpZCA9IE1BWF9USURfQ09VTlQ7CisJc3RydWN0IGlsX3RpZF9kYXRhICp0aWRfZGF0YTsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKKworCURfUkFURSgicmF0ZSBzY2FsZSBjYWxjdWxhdGUgbmV3IHJhdGUgZm9yIHNrYlxuIik7CisKKwkvKiBTZW5kIG1hbmFnZW1lbnQgZnJhbWVzIGFuZCBOT19BQ0sgZGF0YSB1c2luZyBsb3dlc3QgcmF0ZS4gKi8KKwkvKiBUT0RPOiB0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGltcHJvdmVkLi4gKi8KKwlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKKwkgICAgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spKQorCQlyZXR1cm47CisKKwlscV9zdGEtPnN1cHBfcmF0ZXMgPSBzdGEtPnN1cHBfcmF0ZXNbbHFfc3RhLT5iYW5kXTsKKworCXRpZCA9IGlsNDk2NV9yc190bF9hZGRfcGFja2V0KGxxX3N0YSwgaGRyKTsKKwlpZiAodGlkICE9IE1BWF9USURfQ09VTlQgJiYgKGxxX3N0YS0+dHhfYWdnX3RpZF9lbiAmICgxIDw8IHRpZCkpKSB7CisJCXRpZF9kYXRhID0gJmlsLT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0udGlkW3RpZF07CisJCWlmICh0aWRfZGF0YS0+YWdnLnN0YXRlID09IElMX0FHR19PRkYpCisJCQlscV9zdGEtPmlzX2FnZyA9IDA7CisJCWVsc2UKKwkJCWxxX3N0YS0+aXNfYWdnID0gMTsKKwl9IGVsc2UKKwkJbHFfc3RhLT5pc19hZ2cgPSAwOworCisJLyoKKwkgKiBTZWxlY3QgcmF0ZS1zY2FsZSAvIG1vZHVsYXRpb24tbW9kZSB0YWJsZSB0byB3b3JrIHdpdGggaW4KKwkgKiB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uOiAgInNlYXJjaCIgaWYgc2VhcmNoaW5nIGZvciBiZXR0ZXIKKwkgKiBtb2R1bGF0aW9uIG1vZGUsIG9yICJhY3RpdmUiIGlmIGRvaW5nIHJhdGUgc2NhbGluZyB3aXRoaW4gYSBtb2RlLgorCSAqLworCWlmICghbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCkKKwkJYWN0aXZlX3RibCA9IGxxX3N0YS0+YWN0aXZlX3RibDsKKwllbHNlCisJCWFjdGl2ZV90YmwgPSAxIC0gbHFfc3RhLT5hY3RpdmVfdGJsOworCisJdGJsID0gJihscV9zdGEtPmxxX2luZm9bYWN0aXZlX3RibF0pOworCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkKKwkJbHFfc3RhLT5pc19ncmVlbiA9IDA7CisJZWxzZQorCQlscV9zdGEtPmlzX2dyZWVuID0gaWw0OTY1X3JzX3VzZV9ncmVlbihzdGEpOworCWlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKKworCS8qIGN1cnJlbnQgdHggcmF0ZSAqLworCWlkeCA9IGxxX3N0YS0+bGFzdF90eHJhdGVfaWR4OworCisJRF9SQVRFKCJSYXRlIHNjYWxlIGlkeCAlZCBmb3IgdHlwZSAlZFxuIiwgaWR4LCB0YmwtPmxxX3R5cGUpOworCisJLyogcmF0ZXMgYXZhaWxhYmxlIGZvciB0aGlzIGFzc29jaWF0aW9uLCBhbmQgZm9yIG1vZHVsYXRpb24gbW9kZSAqLworCXJhdGVfbWFzayA9IGlsNDk2NV9yc19nZXRfc3VwcG9ydGVkX3JhdGVzKGxxX3N0YSwgaGRyLCB0YmwtPmxxX3R5cGUpOworCisJRF9SQVRFKCJtYXNrIDB4JTA0WFxuIiwgcmF0ZV9tYXNrKTsKKworCS8qIG1hc2sgd2l0aCBzdGF0aW9uIHJhdGUgcmVzdHJpY3Rpb24gKi8KKwlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKKwkJaWYgKGxxX3N0YS0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJLyogc3VwcF9yYXRlcyBoYXMgbm8gQ0NLIGJpdHMgaW4gQSBtb2RlICovCisJCQlyYXRlX3NjYWxlX2lkeF9tc2sgPQorCQkJICAgICh1MTYpIChyYXRlX21hc2sgJgorCQkJCSAgIChscV9zdGEtPnN1cHBfcmF0ZXMgPDwgSUxfRklSU1RfT0ZETV9SQVRFKSk7CisJCWVsc2UKKwkJCXJhdGVfc2NhbGVfaWR4X21zayA9CisJCQkgICAgKHUxNikgKHJhdGVfbWFzayAmIGxxX3N0YS0+c3VwcF9yYXRlcyk7CisKKwl9IGVsc2UKKwkJcmF0ZV9zY2FsZV9pZHhfbXNrID0gcmF0ZV9tYXNrOworCisJaWYgKCFyYXRlX3NjYWxlX2lkeF9tc2spCisJCXJhdGVfc2NhbGVfaWR4X21zayA9IHJhdGVfbWFzazsKKworCWlmICghKCgxIDw8IGlkeCkgJiByYXRlX3NjYWxlX2lkeF9tc2spKSB7CisJCUlMX0VSUigiQ3VycmVudCBSYXRlIGlzIG5vdCB2YWxpZFxuIik7CisJCWlmIChscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSB7CisJCQkvKiByZXZlcnQgdG8gYWN0aXZlIHRhYmxlIGlmIHNlYXJjaCB0YWJsZSBpcyBub3QgdmFsaWQgKi8KKwkJCXRibC0+bHFfdHlwZSA9IExRX05PTkU7CisJCQlscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsID0gMDsKKwkJCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOworCQkJLyogZ2V0ICJhY3RpdmUiIHJhdGUgaW5mbyAqLworCQkJaWR4ID0gaWw0OTY1X2h3cmF0ZV90b19wbGNwX2lkeCh0YmwtPmN1cnJlbnRfcmF0ZSk7CisJCQlpbDQ5NjVfcnNfdXBkYXRlX3JhdGVfdGJsKGlsLCBjdHgsIGxxX3N0YSwgdGJsLCBpZHgsCisJCQkJCQkgICAgICBpc19ncmVlbik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIEdldCBleHBlY3RlZCB0aHJvdWdocHV0IHRhYmxlIGFuZCBoaXN0b3J5IHdpbiBmb3IgY3VycmVudCByYXRlICovCisJaWYgKCF0YmwtPmV4cGVjdGVkX3RwdCkgeworCQlJTF9FUlIoInRibC0+ZXhwZWN0ZWRfdHB0IGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogZm9yY2UgdXNlciBtYXggcmF0ZSBpZiBzZXQgYnkgdXNlciAqLworCWlmIChscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSAmJiBscV9zdGEtPm1heF9yYXRlX2lkeCA8IGlkeCkgeworCQlpZHggPSBscV9zdGEtPm1heF9yYXRlX2lkeDsKKwkJdXBkYXRlX2xxID0gMTsKKwkJd2luID0gJih0YmwtPndpbltpZHhdKTsKKwkJZ290byBscV91cGRhdGU7CisJfQorCisJd2luID0gJih0YmwtPndpbltpZHhdKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm90IGVub3VnaCBoaXN0b3J5IHRvIGNhbGN1bGF0ZSBhY3R1YWwgYXZlcmFnZQorCSAqIHRocm91Z2hwdXQsIGtlZXAgYW5hbHl6aW5nIHJlc3VsdHMgb2YgbW9yZSB0eCBmcmFtZXMsIHdpdGhvdXQKKwkgKiBjaGFuZ2luZyByYXRlIG9yIG1vZGUgKGJ5cGFzcyBtb3N0IG9mIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24pLgorCSAqIFNldCB1cCBuZXcgcmF0ZSB0YWJsZSBpbiB1Q29kZSBvbmx5IGlmIG9sZCByYXRlIGlzIG5vdCBzdXBwb3J0ZWQKKwkgKiBpbiBjdXJyZW50IGFzc29jaWF0aW9uICh1c2UgbmV3IHJhdGUgZm91bmQgYWJvdmUpLgorCSAqLworCWZhaWxfY291bnQgPSB3aW4tPmNvdW50ZXIgLSB3aW4tPnN1Y2Nlc3NfY291bnRlcjsKKwlpZiAoZmFpbF9jb3VudCA8IFJBVEVfTUlOX0ZBSUxVUkVfVEggJiYKKwkgICAgd2luLT5zdWNjZXNzX2NvdW50ZXIgPCBSQVRFX01JTl9TVUNDRVNTX1RIKSB7CisJCURfUkFURSgiTFE6IHN0aWxsIGJlbG93IFRILiBzdWNjPSVkIHRvdGFsPSVkICIgImZvciBpZHggJWRcbiIsCisJCSAgICAgICB3aW4tPnN1Y2Nlc3NfY291bnRlciwgd2luLT5jb3VudGVyLCBpZHgpOworCisJCS8qIENhbid0IGNhbGN1bGF0ZSB0aGlzIHlldDsgbm90IGVub3VnaCBoaXN0b3J5ICovCisJCXdpbi0+YXZlcmFnZV90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCisJCS8qIFNob3VsZCB3ZSBzdGF5IHdpdGggdGhpcyBtb2R1bGF0aW9uIG1vZGUsCisJCSAqIG9yIHNlYXJjaCBmb3IgYSBuZXcgb25lPyAqLworCQlpbDQ5NjVfcnNfc3RheV9pbl90YWJsZShscV9zdGEsIGZhbHNlKTsKKworCQlnb3RvIG91dDsKKwl9CisJLyogRWxzZSB3ZSBoYXZlIGVub3VnaCBzYW1wbGVzOyBjYWxjdWxhdGUgZXN0aW1hdGUgb2YKKwkgKiBhY3R1YWwgYXZlcmFnZSB0aHJvdWdocHV0ICovCisJaWYgKHdpbi0+YXZlcmFnZV90cHQgIT0KKwkgICAgKCh3aW4tPnN1Y2Nlc3NfcmF0aW8gKiB0YmwtPmV4cGVjdGVkX3RwdFtpZHhdICsgNjQpIC8gMTI4KSkgeworCQlJTF9FUlIoImV4cGVjdGVkX3RwdCBzaG91bGQgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgYnkgbm93XG4iKTsKKwkJd2luLT5hdmVyYWdlX3RwdCA9CisJCSAgICAoKHdpbi0+c3VjY2Vzc19yYXRpbyAqIHRibC0+ZXhwZWN0ZWRfdHB0W2lkeF0gKyA2NCkgLyAxMjgpOworCX0KKworCS8qIElmIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGJldHRlciBtb2R1bGF0aW9uIG1vZGUsIGNoZWNrIHN1Y2Nlc3MuICovCisJaWYgKGxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpIHsKKwkJLyogSWYgZ29vZCBzdWNjZXNzLCBjb250aW51ZSB1c2luZyB0aGUgInNlYXJjaCIgbW9kZTsKKwkJICogbm8gbmVlZCB0byBzZW5kIG5ldyBsaW5rIHF1YWxpdHkgY29tbWFuZCwgc2luY2Ugd2UncmUKKwkJICogY29udGludWluZyB0byB1c2UgdGhlIHNldHVwIHRoYXQgd2UndmUgYmVlbiB0cnlpbmcuICovCisJCWlmICh3aW4tPmF2ZXJhZ2VfdHB0ID4gbHFfc3RhLT5sYXN0X3RwdCkgeworCisJCQlEX1JBVEUoIkxROiBTV0lUQ0hJTkcgVE8gTkVXIFRCTCAiCisJCQkgICAgICAgInN1Yz0lZCBjdXItdHB0PSVkIG9sZC10cHQ9JWRcbiIsCisJCQkgICAgICAgd2luLT5zdWNjZXNzX3JhdGlvLCB3aW4tPmF2ZXJhZ2VfdHB0LAorCQkJICAgICAgIGxxX3N0YS0+bGFzdF90cHQpOworCisJCQlpZiAoIWlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKQorCQkJCWxxX3N0YS0+ZW5hYmxlX2NvdW50ZXIgPSAxOworCisJCQkvKiBTd2FwIHRhYmxlczsgInNlYXJjaCIgYmVjb21lcyAiYWN0aXZlIiAqLworCQkJbHFfc3RhLT5hY3RpdmVfdGJsID0gYWN0aXZlX3RibDsKKwkJCWN1cnJlbnRfdHB0ID0gd2luLT5hdmVyYWdlX3RwdDsKKworCQkJLyogRWxzZSBwb29yIHN1Y2Nlc3M7IGdvIGJhY2sgdG8gbW9kZSBpbiAiYWN0aXZlIiB0YWJsZSAqLworCQl9IGVsc2UgeworCisJCQlEX1JBVEUoIkxROiBHT0lORyBCQUNLIFRPIFRIRSBPTEQgVEJMICIKKwkJCSAgICAgICAic3VjPSVkIGN1ci10cHQ9JWQgb2xkLXRwdD0lZFxuIiwKKwkJCSAgICAgICB3aW4tPnN1Y2Nlc3NfcmF0aW8sIHdpbi0+YXZlcmFnZV90cHQsCisJCQkgICAgICAgbHFfc3RhLT5sYXN0X3RwdCk7CisKKwkJCS8qIE51bGxpZnkgInNlYXJjaCIgdGFibGUgKi8KKwkJCXRibC0+bHFfdHlwZSA9IExRX05PTkU7CisKKwkJCS8qIFJldmVydCB0byAiYWN0aXZlIiB0YWJsZSAqLworCQkJYWN0aXZlX3RibCA9IGxxX3N0YS0+YWN0aXZlX3RibDsKKwkJCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKKworCQkJLyogUmV2ZXJ0IHRvICJhY3RpdmUiIHJhdGUgYW5kIHRocm91Z2hwdXQgaW5mbyAqLworCQkJaWR4ID0gaWw0OTY1X2h3cmF0ZV90b19wbGNwX2lkeCh0YmwtPmN1cnJlbnRfcmF0ZSk7CisJCQljdXJyZW50X3RwdCA9IGxxX3N0YS0+bGFzdF90cHQ7CisKKwkJCS8qIE5lZWQgdG8gc2V0IHVwIGEgbmV3IHJhdGUgdGFibGUgaW4gdUNvZGUgKi8KKwkJCXVwZGF0ZV9scSA9IDE7CisJCX0KKworCQkvKiBFaXRoZXIgd2F5LCB3ZSd2ZSBtYWRlIGEgZGVjaXNpb247IG1vZHVsYXRpb24gbW9kZQorCQkgKiBzZWFyY2ggaXMgZG9uZSwgYWxsb3cgcmF0ZSBhZGp1c3RtZW50IG5leHQgdGltZS4gKi8KKwkJbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDA7CisJCWRvbmVfc2VhcmNoID0gMTsJLyogRG9uJ3Qgc3dpdGNoIG1vZGVzIGJlbG93ISAqLworCQlnb3RvIGxxX3VwZGF0ZTsKKwl9CisKKwkvKiAoRWxzZSkgbm90IGluIHNlYXJjaCBvZiBiZXR0ZXIgbW9kdWxhdGlvbiBtb2RlLCB0cnkgZm9yIGJldHRlcgorCSAqIHN0YXJ0aW5nIHJhdGUsIHdoaWxlIHN0YXlpbmcgaW4gdGhpcyBtb2RlLiAqLworCWhpZ2hfbG93ID0KKwkgICAgaWw0OTY1X3JzX2dldF9hZGphY2VudF9yYXRlKGlsLCBpZHgsIHJhdGVfc2NhbGVfaWR4X21zaywKKwkJCQkJdGJsLT5scV90eXBlKTsKKwlsb3cgPSBoaWdoX2xvdyAmIDB4ZmY7CisJaGlnaCA9IChoaWdoX2xvdyA+PiA4KSAmIDB4ZmY7CisKKwkvKiBJZiB1c2VyIHNldCBtYXggcmF0ZSwgZG9udCBhbGxvdyBoaWdoZXIgdGhhbiB1c2VyIGNvbnN0cmFpbiAqLworCWlmIChscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSAmJiBscV9zdGEtPm1heF9yYXRlX2lkeCA8IGhpZ2gpCisJCWhpZ2ggPSBSQVRFX0lOVkFMSUQ7CisKKwlzciA9IHdpbi0+c3VjY2Vzc19yYXRpbzsKKworCS8qIENvbGxlY3QgbWVhc3VyZWQgdGhyb3VnaHB1dHMgZm9yIGN1cnJlbnQgYW5kIGFkamFjZW50IHJhdGVzICovCisJY3VycmVudF90cHQgPSB3aW4tPmF2ZXJhZ2VfdHB0OworCWlmIChsb3cgIT0gUkFURV9JTlZBTElEKQorCQlsb3dfdHB0ID0gdGJsLT53aW5bbG93XS5hdmVyYWdlX3RwdDsKKwlpZiAoaGlnaCAhPSBSQVRFX0lOVkFMSUQpCisJCWhpZ2hfdHB0ID0gdGJsLT53aW5baGlnaF0uYXZlcmFnZV90cHQ7CisKKwlzY2FsZV9hY3Rpb24gPSAwOworCisJLyogVG9vIG1hbnkgZmFpbHVyZXMsIGRlY3JlYXNlIHJhdGUgKi8KKwlpZiAoc3IgPD0gUkFURV9ERUNSRUFTRV9USCB8fCBjdXJyZW50X3RwdCA9PSAwKSB7CisJCURfUkFURSgiZGVjcmVhc2UgcmF0ZSBiZWNhdXNlIG9mIGxvdyBzdWNjZXNzX3JhdGlvXG4iKTsKKwkJc2NhbGVfYWN0aW9uID0gLTE7CisKKwkJLyogTm8gdGhyb3VnaHB1dCBtZWFzdXJlZCB5ZXQgZm9yIGFkamFjZW50IHJhdGVzOyB0cnkgaW5jcmVhc2UuICovCisJfSBlbHNlIGlmIChsb3dfdHB0ID09IElMX0lOVkFMSURfVkFMVUUgJiYgaGlnaF90cHQgPT0gSUxfSU5WQUxJRF9WQUxVRSkgeworCisJCWlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCAmJiBzciA+PSBSQVRFX0lOQ1JFQVNFX1RIKQorCQkJc2NhbGVfYWN0aW9uID0gMTsKKwkJZWxzZSBpZiAobG93ICE9IFJBVEVfSU5WQUxJRCkKKwkJCXNjYWxlX2FjdGlvbiA9IDA7CisJfQorCisJLyogQm90aCBhZGphY2VudCB0aHJvdWdocHV0cyBhcmUgbWVhc3VyZWQsIGJ1dCBuZWl0aGVyIG9uZSBoYXMgYmV0dGVyCisJICogdGhyb3VnaHB1dDsgd2UncmUgdXNpbmcgdGhlIGJlc3QgcmF0ZSwgZG9uJ3QgY2hhbmdlIGl0ISAqLworCWVsc2UgaWYgKGxvd190cHQgIT0gSUxfSU5WQUxJRF9WQUxVRSAmJiBoaWdoX3RwdCAhPSBJTF9JTlZBTElEX1ZBTFVFICYmCisJCSBsb3dfdHB0IDwgY3VycmVudF90cHQgJiYgaGlnaF90cHQgPCBjdXJyZW50X3RwdCkKKwkJc2NhbGVfYWN0aW9uID0gMDsKKworCS8qIEF0IGxlYXN0IG9uZSBhZGphY2VudCByYXRlJ3MgdGhyb3VnaHB1dCBpcyBtZWFzdXJlZCwKKwkgKiBhbmQgbWF5IGhhdmUgYmV0dGVyIHBlcmZvcm1hbmNlLiAqLworCWVsc2UgeworCQkvKiBIaWdoZXIgYWRqYWNlbnQgcmF0ZSdzIHRocm91Z2hwdXQgaXMgbWVhc3VyZWQgKi8KKwkJaWYgKGhpZ2hfdHB0ICE9IElMX0lOVkFMSURfVkFMVUUpIHsKKwkJCS8qIEhpZ2hlciByYXRlIGhhcyBiZXR0ZXIgdGhyb3VnaHB1dCAqLworCQkJaWYgKGhpZ2hfdHB0ID4gY3VycmVudF90cHQgJiYgc3IgPj0gUkFURV9JTkNSRUFTRV9USCkKKwkJCQlzY2FsZV9hY3Rpb24gPSAxOworCQkJZWxzZQorCQkJCXNjYWxlX2FjdGlvbiA9IDA7CisKKwkJCS8qIExvd2VyIGFkamFjZW50IHJhdGUncyB0aHJvdWdocHV0IGlzIG1lYXN1cmVkICovCisJCX0gZWxzZSBpZiAobG93X3RwdCAhPSBJTF9JTlZBTElEX1ZBTFVFKSB7CisJCQkvKiBMb3dlciByYXRlIGhhcyBiZXR0ZXIgdGhyb3VnaHB1dCAqLworCQkJaWYgKGxvd190cHQgPiBjdXJyZW50X3RwdCkgeworCQkJCURfUkFURSgiZGVjcmVhc2UgcmF0ZSBiZWNhdXNlIG9mIGxvdyB0cHRcbiIpOworCQkJCXNjYWxlX2FjdGlvbiA9IC0xOworCQkJfSBlbHNlIGlmIChzciA+PSBSQVRFX0lOQ1JFQVNFX1RIKSB7CisJCQkJc2NhbGVfYWN0aW9uID0gMTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNhbml0eSBjaGVjazsgYXNrZWQgZm9yIGRlY3JlYXNlLCBidXQgc3VjY2VzcyByYXRlIG9yIHRocm91Z2hwdXQKKwkgKiBoYXMgYmVlbiBnb29kIGF0IG9sZCByYXRlLiAgRG9uJ3QgY2hhbmdlIGl0LiAqLworCWlmIChzY2FsZV9hY3Rpb24gPT0gLTEgJiYgbG93ICE9IFJBVEVfSU5WQUxJRCAmJgorCSAgICAoc3IgPiBSQVRFX0hJR0hfVEggfHwgY3VycmVudF90cHQgPiAxMDAgKiB0YmwtPmV4cGVjdGVkX3RwdFtsb3ddKSkKKwkJc2NhbGVfYWN0aW9uID0gMDsKKworCXN3aXRjaCAoc2NhbGVfYWN0aW9uKSB7CisJY2FzZSAtMToKKwkJLyogRGVjcmVhc2Ugc3RhcnRpbmcgcmF0ZSwgdXBkYXRlIHVDb2RlJ3MgcmF0ZSB0YWJsZSAqLworCQlpZiAobG93ICE9IFJBVEVfSU5WQUxJRCkgeworCQkJdXBkYXRlX2xxID0gMTsKKwkJCWlkeCA9IGxvdzsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogSW5jcmVhc2Ugc3RhcnRpbmcgcmF0ZSwgdXBkYXRlIHVDb2RlJ3MgcmF0ZSB0YWJsZSAqLworCQlpZiAoaGlnaCAhPSBSQVRFX0lOVkFMSUQpIHsKKwkJCXVwZGF0ZV9scSA9IDE7CisJCQlpZHggPSBoaWdoOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSAwOgorCQkvKiBObyBjaGFuZ2UgKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlEX1JBVEUoImNob29zZSByYXRlIHNjYWxlIGlkeCAlZCBhY3Rpb24gJWQgbG93ICVkICIgImhpZ2ggJWQgdHlwZSAlZFxuIiwKKwkgICAgICAgaWR4LCBzY2FsZV9hY3Rpb24sIGxvdywgaGlnaCwgdGJsLT5scV90eXBlKTsKKworbHFfdXBkYXRlOgorCS8qIFJlcGxhY2UgdUNvZGUncyByYXRlIHRhYmxlIGZvciB0aGUgZGVzdGluYXRpb24gc3RhdGlvbi4gKi8KKwlpZiAodXBkYXRlX2xxKQorCQlpbDQ5NjVfcnNfdXBkYXRlX3JhdGVfdGJsKGlsLCBjdHgsIGxxX3N0YSwgdGJsLCBpZHgsCisJCQkJCSAgICAgIGlzX2dyZWVuKTsKKworCS8qIFNob3VsZCB3ZSBzdGF5IHdpdGggdGhpcyBtb2R1bGF0aW9uIG1vZGUsCisJICogb3Igc2VhcmNoIGZvciBhIG5ldyBvbmU/ICovCisJaWw0OTY1X3JzX3N0YXlfaW5fdGFibGUobHFfc3RhLCBmYWxzZSk7CisKKwkvKgorCSAqIFNlYXJjaCBmb3IgbmV3IG1vZHVsYXRpb24gbW9kZSBpZiB3ZSdyZToKKwkgKiAxKSAgTm90IGNoYW5naW5nIHJhdGVzIHJpZ2h0IG5vdworCSAqIDIpICBOb3QganVzdCBmaW5pc2hpbmcgdXAgYSBzZWFyY2gKKwkgKiAzKSAgQWxsb3dpbmcgYSBuZXcgc2VhcmNoCisJICovCisJaWYgKCF1cGRhdGVfbHEgJiYgIWRvbmVfc2VhcmNoICYmICFscV9zdGEtPnN0YXlfaW5fdGJsICYmIHdpbi0+Y291bnRlcikgeworCQkvKiBTYXZlIGN1cnJlbnQgdGhyb3VnaHB1dCB0byBjb21wYXJlIHdpdGggInNlYXJjaCIgdGhyb3VnaHB1dCAqLworCQlscV9zdGEtPmxhc3RfdHB0ID0gY3VycmVudF90cHQ7CisKKwkJLyogU2VsZWN0IGEgbmV3ICJzZWFyY2giIG1vZHVsYXRpb24gbW9kZSB0byB0cnkuCisJCSAqIElmIG9uZSBpcyBmb3VuZCwgc2V0IHVwIHRoZSBuZXcgInNlYXJjaCIgdGFibGUuICovCisJCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkKKwkJCWlsNDk2NV9yc19tb3ZlX2xlZ2FjeV9vdGhlcihpbCwgbHFfc3RhLCBjb25mLCBzdGEsIGlkeCk7CisJCWVsc2UgaWYgKGlzX3Npc28odGJsLT5scV90eXBlKSkKKwkJCWlsNDk2NV9yc19tb3ZlX3Npc29fdG9fb3RoZXIoaWwsIGxxX3N0YSwgY29uZiwgc3RhLAorCQkJCQkJICAgICBpZHgpOworCQllbHNlCQkvKiAoaXNfbWltbzIodGJsLT5scV90eXBlKSkgKi8KKwkJCWlsNDk2NV9yc19tb3ZlX21pbW8yX3RvX290aGVyKGlsLCBscV9zdGEsIGNvbmYsIHN0YSwKKwkJCQkJCSAgICAgIGlkeCk7CisKKwkJLyogSWYgbmV3ICJzZWFyY2giIG1vZGUgd2FzIHNlbGVjdGVkLCBzZXQgdXAgaW4gdUNvZGUgdGFibGUgKi8KKwkJaWYgKGxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpIHsKKwkJCS8qIEFjY2VzcyB0aGUgInNlYXJjaCIgdGFibGUsIGNsZWFyIGl0cyBoaXN0b3J5LiAqLworCQkJdGJsID0gJihscV9zdGEtPmxxX2luZm9bKDEgLSBscV9zdGEtPmFjdGl2ZV90YmwpXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVDsgaSsrKQorCQkJCWlsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbigmKHRibC0+d2luW2ldKSk7CisKKwkJCS8qIFVzZSBuZXcgInNlYXJjaCIgc3RhcnQgcmF0ZSAqLworCQkJaWR4ID0gaWw0OTY1X2h3cmF0ZV90b19wbGNwX2lkeCh0YmwtPmN1cnJlbnRfcmF0ZSk7CisKKwkJCURfUkFURSgiU3dpdGNoIGN1cnJlbnQgIG1jczogJVggaWR4OiAlZFxuIiwKKwkJCSAgICAgICB0YmwtPmN1cnJlbnRfcmF0ZSwgaWR4KTsKKwkJCWlsNDk2NV9yc19maWxsX2xpbmtfY21kKGlsLCBscV9zdGEsIHRibC0+Y3VycmVudF9yYXRlKTsKKwkJCWlsX3NlbmRfbHFfY21kKGlsLCBjdHgsICZscV9zdGEtPmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKKwkJfSBlbHNlCisJCQlkb25lX3NlYXJjaCA9IDE7CisJfQorCisJaWYgKGRvbmVfc2VhcmNoICYmICFscV9zdGEtPnN0YXlfaW5fdGJsKSB7CisJCS8qIElmIHRoZSAiYWN0aXZlIiAobm9uLXNlYXJjaCkgbW9kZSB3YXMgbGVnYWN5LAorCQkgKiBhbmQgd2UndmUgdHJpZWQgc3dpdGNoaW5nIGFudGVubmFzLAorCQkgKiBidXQgd2UgaGF2ZW4ndCBiZWVuIGFibGUgdG8gdHJ5IEhUIG1vZGVzIChub3QgYXZhaWxhYmxlKSwKKwkJICogc3RheSB3aXRoIGJlc3QgYW50ZW5uYSBsZWdhY3kgbW9kdWxhdGlvbiBmb3IgYSB3aGlsZQorCQkgKiBiZWZvcmUgbmV4dCByb3VuZCBvZiBtb2RlIGNvbXBhcmlzb25zLiAqLworCQl0YmwxID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJCWlmIChpc19sZWdhY3kodGJsMS0+bHFfdHlwZSkgJiYgIWNvbmZfaXNfaHQoY29uZikgJiYKKwkJICAgIGxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPiB0YmwxLT5tYXhfc2VhcmNoKSB7CisJCQlEX1JBVEUoIkxROiBTVEFZIGluIGxlZ2FjeSB0YWJsZVxuIik7CisJCQlpbDQ5NjVfcnNfc2V0X3N0YXlfaW5fdGFibGUoaWwsIDEsIGxxX3N0YSk7CisJCX0KKworCQkvKiBJZiB3ZSdyZSBpbiBhbiBIVCBtb2RlLCBhbmQgYWxsIDMgbW9kZSBzd2l0Y2ggYWN0aW9ucworCQkgKiBoYXZlIGJlZW4gdHJpZWQgYW5kIGNvbXBhcmVkLCBzdGF5IGluIHRoaXMgYmVzdCBtb2R1bGF0aW9uCisJCSAqIG1vZGUgZm9yIGEgd2hpbGUgYmVmb3JlIG5leHQgcm91bmQgb2YgbW9kZSBjb21wYXJpc29ucy4gKi8KKwkJaWYgKGxxX3N0YS0+ZW5hYmxlX2NvdW50ZXIgJiYKKwkJICAgIGxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPj0gdGJsMS0+bWF4X3NlYXJjaCkgeworCQkJaWYgKGxxX3N0YS0+bGFzdF90cHQgPiBJTF9BR0dfVFBUX1RIUkVIT0xEICYmCisJCQkgICAgKGxxX3N0YS0+dHhfYWdnX3RpZF9lbiAmICgxIDw8IHRpZCkpICYmCisJCQkgICAgdGlkICE9IE1BWF9USURfQ09VTlQpIHsKKwkJCQl0aWRfZGF0YSA9CisJCQkJICAgICZpbC0+c3RhdGlvbnNbbHFfc3RhLT5scS5zdGFfaWRdLnRpZFt0aWRdOworCQkJCWlmICh0aWRfZGF0YS0+YWdnLnN0YXRlID09IElMX0FHR19PRkYpIHsKKwkJCQkJRF9SQVRFKCJ0cnkgdG8gYWdncmVnYXRlIHRpZCAlZFxuIiwKKwkJCQkJICAgICAgIHRpZCk7CisJCQkJCWlsNDk2NV9yc190bF90dXJuX29uX2FnZyhpbCwgdGlkLAorCQkJCQkJCQkgbHFfc3RhLCBzdGEpOworCQkJCX0KKwkJCX0KKwkJCWlsNDk2NV9yc19zZXRfc3RheV9pbl90YWJsZShpbCwgMCwgbHFfc3RhKTsKKwkJfQorCX0KKworb3V0OgorCXRibC0+Y3VycmVudF9yYXRlID0KKwkgICAgaWw0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChpbCwgdGJsLCBpZHgsIGlzX2dyZWVuKTsKKwlpID0gaWR4OworCWxxX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaTsKK30KKworLyoqCisgKiBpbDQ5NjVfcnNfaW5pdGlhbGl6ZV9scSAtIEluaXRpYWxpemUgYSBzdGF0aW9uJ3MgaGFyZHdhcmUgcmF0ZSB0YWJsZQorICoKKyAqIFRoZSB1Q29kZSdzIHN0YXRpb24gdGFibGUgY29udGFpbnMgYSB0YWJsZSBvZiBmYWxsYmFjayByYXRlcworICogZm9yIGF1dG9tYXRpYyBmYWxsYmFjayBkdXJpbmcgdHJhbnNtaXNzaW9uLgorICoKKyAqIE5PVEU6IFRoaXMgc2V0cyB1cCBhIGRlZmF1bHQgc2V0IG9mIHZhbHVlcy4gIFRoZXNlIHdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIKKyAqICAgICAgIGlmIHRoZSBkcml2ZXIncyBpd2wtNDk2NS1ycyByYXRlIHNjYWxpbmcgYWxnb3JpdGhtIGlzIHVzZWQsIGluc3RlYWQgb2YKKyAqICAgICAgIHJjODAyMTFfc2ltcGxlLgorICoKKyAqIE5PVEU6IFJ1biBDX0FERF9TVEEgY29tbWFuZCB0byBzZXQgdXAgc3RhdGlvbiB0YWJsZSBlbnRyeSwgYmVmb3JlCisgKiAgICAgICBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gKHdoaWNoIHJ1bnMgQ19UWF9MSU5LX1FVQUxJVFlfQ01ELAorICogICAgICAgd2hpY2ggcmVxdWlyZXMgc3RhdGlvbiB0YWJsZSBlbnRyeSB0byBleGlzdCkuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfaW5pdGlhbGl6ZV9scShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSkKK3sKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibDsKKwlpbnQgcmF0ZV9pZHg7CisJaW50IGk7CisJdTMyIHJhdGU7CisJdTggdXNlX2dyZWVuID0gaWw0OTY1X3JzX3VzZV9ncmVlbihzdGEpOworCXU4IGFjdGl2ZV90YmwgPSAwOworCXU4IHZhbGlkX3R4X2FudDsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7CisKKwlpZiAoIXN0YSB8fCAhbHFfc3RhKQorCQlyZXR1cm47CisKKwlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwljdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKKworCWkgPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKKworCXZhbGlkX3R4X2FudCA9IGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50OworCisJaWYgKCFscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKQorCQlhY3RpdmVfdGJsID0gbHFfc3RhLT5hY3RpdmVfdGJsOworCWVsc2UKKwkJYWN0aXZlX3RibCA9IDEgLSBscV9zdGEtPmFjdGl2ZV90Ymw7CisKKwl0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1thY3RpdmVfdGJsXSk7CisKKwlpZiAoaSA8IDAgfHwgaSA+PSBSQVRFX0NPVU5UKQorCQlpID0gMDsKKworCXJhdGUgPSBpbF9yYXRlc1tpXS5wbGNwOworCXRibC0+YW50X3R5cGUgPSBpbDQ5NjVfZmlyc3RfYW50ZW5uYSh2YWxpZF90eF9hbnQpOworCXJhdGUgfD0gdGJsLT5hbnRfdHlwZSA8PCBSQVRFX01DU19BTlRfUE9TOworCisJaWYgKGkgPj0gSUxfRklSU1RfQ0NLX1JBVEUgJiYgaSA8PSBJTF9MQVNUX0NDS19SQVRFKQorCQlyYXRlIHw9IFJBVEVfTUNTX0NDS19NU0s7CisKKwlpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKHJhdGUsIGlsLT5iYW5kLCB0YmwsICZyYXRlX2lkeCk7CisJaWYgKCFpbDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX3R4X2FudCwgdGJsLT5hbnRfdHlwZSkpCisJCWlsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsICZyYXRlLCB0YmwpOworCisJcmF0ZSA9IGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHRibCwgcmF0ZV9pZHgsIHVzZV9ncmVlbik7CisJdGJsLT5jdXJyZW50X3JhdGUgPSByYXRlOworCWlsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgdGJsKTsKKwlpbDQ5NjVfcnNfZmlsbF9saW5rX2NtZChOVUxMLCBscV9zdGEsIHJhdGUpOworCWlsLT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0ubHEgPSAmbHFfc3RhLT5scTsKKwlpbF9zZW5kX2xxX2NtZChpbCwgY3R4LCAmbHFfc3RhLT5scSwgQ01EX1NZTkMsIHRydWUpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX2dldF9yYXRlKHZvaWQgKmlsX3IsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKmlsX3N0YSwKKwkJICAgc3RydWN0IGllZWU4MDIxMV90eF9yYXRlX2NvbnRyb2wgKnR4cmMpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhyYy0+c2tiOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0gdHhyYy0+c2JhbmQ7CisJc3RydWN0IGlsX3ByaXYgKmlsIF9fbWF5YmVfdW51c2VkID0gKHN0cnVjdCBpbF9wcml2ICopaWxfcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhID0gaWxfc3RhOworCWludCByYXRlX2lkeDsKKworCURfUkFURSgicmF0ZSBzY2FsZSBjYWxjdWxhdGUgbmV3IHJhdGUgZm9yIHNrYlxuIik7CisKKwkvKiBHZXQgbWF4IHJhdGUgaWYgdXNlciBzZXQgbWF4IHJhdGUgKi8KKwlpZiAobHFfc3RhKSB7CisJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ID0gdHhyYy0+bWF4X3JhdGVfaWR4OworCQlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWiAmJgorCQkgICAgbHFfc3RhLT5tYXhfcmF0ZV9pZHggIT0gLTEpCisJCQlscV9zdGEtPm1heF9yYXRlX2lkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJCWlmIChscV9zdGEtPm1heF9yYXRlX2lkeCA8IDAgfHwKKwkJICAgIGxxX3N0YS0+bWF4X3JhdGVfaWR4ID49IFJBVEVfQ09VTlQpCisJCQlscV9zdGEtPm1heF9yYXRlX2lkeCA9IC0xOworCX0KKworCS8qIFRyZWF0IHVuaW5pdGlhbGl6ZWQgcmF0ZSBzY2FsaW5nIGRhdGEgc2FtZSBhcyBub24tZXhpc3RpbmcuICovCisJaWYgKGxxX3N0YSAmJiAhbHFfc3RhLT5kcnYpIHsKKwkJRF9SQVRFKCJSYXRlIHNjYWxpbmcgbm90IGluaXRpYWxpemVkIHlldC5cbiIpOworCQlpbF9zdGEgPSBOVUxMOworCX0KKworCS8qIFNlbmQgbWFuYWdlbWVudCBmcmFtZXMgYW5kIE5PX0FDSyBkYXRhIHVzaW5nIGxvd2VzdCByYXRlLiAqLworCWlmIChyYXRlX2NvbnRyb2xfc2VuZF9sb3coc3RhLCBpbF9zdGEsIHR4cmMpKQorCQlyZXR1cm47CisKKwlpZiAoIWxxX3N0YSkKKwkJcmV0dXJuOworCisJcmF0ZV9pZHggPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKKworCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFRfTVNLKSB7CisJCXJhdGVfaWR4IC09IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJLyogNk0gYW5kIDlNIHNoYXJlZCBzYW1lIE1DUyBpZHggKi8KKwkJcmF0ZV9pZHggPSAocmF0ZV9pZHggPiAwKSA/IChyYXRlX2lkeCAtIDEpIDogMDsKKwkJaWYgKGlsNDk2NV9yc19leHRyYWN0X3JhdGUobHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncykgPj0KKwkJICAgIFJBVEVfTUlNTzJfNk1fUExDUCkKKwkJCXJhdGVfaWR4ID0gcmF0ZV9pZHggKyBNQ1NfSURYX1BFUl9TVFJFQU07CisJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgPSBJRUVFODAyMTFfVFhfUkNfTUNTOworCQlpZiAobHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyAmIFJBVEVfTUNTX1NHSV9NU0spCisJCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9CisJCQkgICAgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJOworCQlpZiAobHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0RVUF9NU0spCisJCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9CisJCQkgICAgSUVFRTgwMjExX1RYX1JDX0RVUF9EQVRBOworCQlpZiAobHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUNDBfTVNLKQorCQkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyB8PQorCQkJICAgIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEg7CisJCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfR0ZfTVNLKQorCQkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyB8PQorCQkJICAgIElFRUU4MDIxMV9UWF9SQ19HUkVFTl9GSUVMRDsKKwl9IGVsc2UgeworCQkvKiBDaGVjayBmb3IgaW52YWxpZCByYXRlcyAqLworCQlpZiAocmF0ZV9pZHggPCAwIHx8IHJhdGVfaWR4ID49IFJBVEVfQ09VTlRfTEVHQUNZIHx8CisJCSAgICAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWiAmJgorCQkgICAgIHJhdGVfaWR4IDwgSUxfRklSU1RfT0ZETV9SQVRFKSkKKwkJCXJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgoc2JhbmQsIHN0YSk7CisJCS8qIE9uIHZhbGlkIDUgR0h6IHJhdGUsIGFkanVzdCBpZHggKi8KKwkJZWxzZSBpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJCXJhdGVfaWR4IC09IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyA9IDA7CisJfQorCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gcmF0ZV9pZHg7CisKK30KKworc3RhdGljIHZvaWQgKgoraWw0OTY1X3JzX2FsbG9jX3N0YSh2b2lkICppbF9yYXRlLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBnZnBfdCBnZnApCit7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPQorCSAgICAoc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3ByaXYgKmlsOworCisJaWwgPSAoc3RydWN0IGlsX3ByaXYgKilpbF9yYXRlOworCURfUkFURSgiY3JlYXRlIHN0YXRpb24gcmF0ZSBzY2FsZSB3aW5cbiIpOworCisJcmV0dXJuICZzdGFfcHJpdi0+bHFfc3RhOworfQorCisvKgorICogQ2FsbGVkIGFmdGVyIGFkZGluZyBhIG5ldyBzdGF0aW9uIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nCisgKi8KK3ZvaWQKK2lsNDk2NV9yc19yYXRlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCBzdGFfaWQpCit7CisJaW50IGksIGo7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBpbC0+aHc7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmlsLT5ody0+Y29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdjsKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGE7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisKKwlzdGFfcHJpdiA9IChzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICopc3RhLT5kcnZfcHJpdjsKKwlscV9zdGEgPSAmc3RhX3ByaXYtPmxxX3N0YTsKKwlzYmFuZCA9IGh3LT53aXBoeS0+YmFuZHNbY29uZi0+Y2hhbm5lbC0+YmFuZF07CisKKwlscV9zdGEtPmxxLnN0YV9pZCA9IHN0YV9pZDsKKworCWZvciAoaiA9IDA7IGogPCBMUV9TSVpFOyBqKyspCisJCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UOyBpKyspCisJCQlpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9jbGVhcl93aW4oJmxxX3N0YS0+bHFfaW5mb1tqXS4KKwkJCQkJCSAgICAgICB3aW5baV0pOworCisJbHFfc3RhLT5mbHVzaF90aW1lciA9IDA7CisJbHFfc3RhLT5zdXBwX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXTsKKwlmb3IgKGogPSAwOyBqIDwgTFFfU0laRTsgaisrKQorCQlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVDsgaSsrKQorCQkJaWw0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luKCZscV9zdGEtPmxxX2luZm9bal0uCisJCQkJCQkgICAgICAgd2luW2ldKTsKKworCURfUkFURSgiTFE6IiAiKioqIHJhdGUgc2NhbGUgc3RhdGlvbiBnbG9iYWwgaW5pdCBmb3Igc3RhdGlvbiAlZCAqKipcbiIsCisJICAgICAgIHN0YV9pZCk7CisJLyogVE9ETzogd2hhdCBpcyBhIGdvb2Qgc3RhcnRpbmcgcmF0ZSBmb3IgU1RBPyBBYm91dCBtaWRkbGU/IE1heWJlIG5vdAorCSAqIHRoZSBsb3dlc3Qgb3IgdGhlIGhpZ2hlc3QgcmF0ZS4uIENvdWxkIGNvbnNpZGVyIHVzaW5nIFJTU0kgZnJvbQorCSAqIHByZXZpb3VzIHBhY2tldHM/IE5lZWQgdG8gaGF2ZSBJRUVFIDgwMi4xWCBhdXRoIHN1Y2NlZWQgaW1tZWRpYXRlbHkKKwkgKiBhZnRlciBhc3NvYy4uICovCisKKwlscV9zdGEtPmlzX2R1cCA9IDA7CisJbHFfc3RhLT5tYXhfcmF0ZV9pZHggPSAtMTsKKwlscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPSBJTF9NSVNTRURfUkFURV9NQVg7CisJbHFfc3RhLT5pc19ncmVlbiA9IGlsNDk2NV9yc191c2VfZ3JlZW4oc3RhKTsKKwlscV9zdGEtPmFjdGl2ZV9sZWdhY3lfcmF0ZSA9IGlsLT5hY3RpdmVfcmF0ZSAmIH4oMHgxMDAwKTsKKwlscV9zdGEtPmJhbmQgPSBpbC0+YmFuZDsKKwkvKgorCSAqIGFjdGl2ZV9zaXNvX3JhdGUgbWFzayBpbmNsdWRlcyA5IE1CaXRzIChiaXQgNSksIGFuZCBDQ0sgKGJpdHMgMC0zKSwKKwkgKiBzdXBwX3JhdGVzW10gZG9lcyBub3Q7IHNoaWZ0IHRvIGNvbnZlcnQgZm9ybWF0LCBmb3JjZSA5IE1CaXRzIG9mZi4KKwkgKi8KKwlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgPSBodF9jYXAtPm1jcy5yeF9tYXNrWzBdIDw8IDE7CisJbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlIHw9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gJiAweDE7CisJbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlICY9IH4oKHUxNikgMHgyKTsKKwlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgPDw9IElMX0ZJUlNUX09GRE1fUkFURTsKKworCS8qIFNhbWUgaGVyZSAqLworCWxxX3N0YS0+YWN0aXZlX21pbW8yX3JhdGUgPSBodF9jYXAtPm1jcy5yeF9tYXNrWzFdIDw8IDE7CisJbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSB8PSBodF9jYXAtPm1jcy5yeF9tYXNrWzFdICYgMHgxOworCWxxX3N0YS0+YWN0aXZlX21pbW8yX3JhdGUgJj0gfigodTE2KSAweDIpOworCWxxX3N0YS0+YWN0aXZlX21pbW8yX3JhdGUgPDw9IElMX0ZJUlNUX09GRE1fUkFURTsKKworCS8qIFRoZXNlIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4gbGF0ZXIgKi8KKwlscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zayA9CisJICAgIGlsNDk2NV9maXJzdF9hbnRlbm5hKGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKKwlscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQorCSAgICBpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCAmIH5pbDQ5NjVfZmlyc3RfYW50ZW5uYShpbC0+aHdfcGFyYW1zLgorCQkJCQkJCSAgICAgICB2YWxpZF90eF9hbnQpOworCWlmICghbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKSB7CisJCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9IEFOVF9BQjsKKwl9IGVsc2UgaWYgKGlsNDk2NV9udW1fb2ZfYW50KGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50KSA9PSAyKSB7CisJCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9CisJCSAgICBpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKKwl9CisKKwkvKiBhcyBkZWZhdWx0IGFsbG93IGFnZ3JlZ2F0aW9uIGZvciBhbGwgdGlkcyAqLworCWxxX3N0YS0+dHhfYWdnX3RpZF9lbiA9IElMX0FHR19BTExfVElEOworCWxxX3N0YS0+ZHJ2ID0gaWw7CisKKwkvKiBTZXQgbGFzdF90eHJhdGVfaWR4IHRvIGxvd2VzdCByYXRlICovCisJbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSByYXRlX2xvd2VzdF9pbmRleChzYmFuZCwgc3RhKTsKKwlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggKz0gSUxfRklSU1RfT0ZETV9SQVRFOworCWxxX3N0YS0+aXNfYWdnID0gMDsKKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCisJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7CisjZW5kaWYKKworCWlsNDk2NV9yc19pbml0aWFsaXplX2xxKGlsLCBjb25mLCBzdGEsIGxxX3N0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfZmlsbF9saW5rX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCXUzMiBuZXdfcmF0ZSkKK3sKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gdGJsX3R5cGU7CisJaW50IGlkeCA9IDA7CisJaW50IHJhdGVfaWR4OworCWludCByZXBlYXRfcmF0ZSA9IDA7CisJdTggYW50X3RvZ2dsZV9jbnQgPSAwOworCXU4IHVzZV9odF9wb3NzaWJsZSA9IDE7CisJdTggdmFsaWRfdHhfYW50ID0gMDsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHFfY21kID0gJmxxX3N0YS0+bHE7CisKKwkvKiBPdmVycmlkZSBzdGFydGluZyByYXRlIChpZHggMCkgaWYgbmVlZGVkIGZvciBkZWJ1ZyBwdXJwb3NlcyAqLworCWlsNDk2NV9yc19kYmdmc19zZXRfbWNzKGxxX3N0YSwgJm5ld19yYXRlLCBpZHgpOworCisJLyogSW50ZXJwcmV0IG5ld19yYXRlIChyYXRlX25fZmxhZ3MpICovCisJaWw0OTY1X3JzX2dldF90YmxfaW5mb19mcm9tX21jcyhuZXdfcmF0ZSwgbHFfc3RhLT5iYW5kLCAmdGJsX3R5cGUsCisJCQkJCSZyYXRlX2lkeCk7CisKKwkvKiBIb3cgbWFueSB0aW1lcyBzaG91bGQgd2UgcmVwZWF0IHRoZSBpbml0aWFsIHJhdGU/ICovCisJaWYgKGlzX2xlZ2FjeSh0YmxfdHlwZS5scV90eXBlKSkgeworCQlhbnRfdG9nZ2xlX2NudCA9IDE7CisJCXJlcGVhdF9yYXRlID0gSUxfTlVNQkVSX1RSWTsKKwl9IGVsc2UgeworCQlyZXBlYXRfcmF0ZSA9IElMX0hUX05VTUJFUl9UUlk7CisJfQorCisJbHFfY21kLT5nZW5lcmFsX3BhcmFtcy5taW1vX2RlbGltaXRlciA9CisJICAgIGlzX21pbW8odGJsX3R5cGUubHFfdHlwZSkgPyAxIDogMDsKKworCS8qIEZpbGwgMXN0IHRhYmxlIGVudHJ5IChpZHggMCkgKi8KKwlscV9jbWQtPnJzX3RhYmxlW2lkeF0ucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIobmV3X3JhdGUpOworCisJaWYgKGlsNDk2NV9udW1fb2ZfYW50KHRibF90eXBlLmFudF90eXBlKSA9PSAxKSB7CisJCWxxX2NtZC0+Z2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrID0KKwkJICAgIHRibF90eXBlLmFudF90eXBlOworCX0gZWxzZSBpZiAoaWw0OTY1X251bV9vZl9hbnQodGJsX3R5cGUuYW50X3R5cGUpID09IDIpIHsKKwkJbHFfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0gdGJsX3R5cGUuYW50X3R5cGU7CisJfQorCS8qIG90aGVyd2lzZSB3ZSBkb24ndCBtb2RpZnkgdGhlIGV4aXN0aW5nIHZhbHVlICovCisJaWR4Kys7CisJcmVwZWF0X3JhdGUtLTsKKwlpZiAoaWwpCisJCXZhbGlkX3R4X2FudCA9IGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50OworCisJLyogRmlsbCByZXN0IG9mIHJhdGUgdGFibGUgKi8KKwl3aGlsZSAoaWR4IDwgTElOS19RVUFMX01BWF9SRVRSWV9OVU0pIHsKKwkJLyogUmVwZWF0IGluaXRpYWwvbmV4dCByYXRlLgorCQkgKiBGb3IgbGVnYWN5IElMX05VTUJFUl9UUlkgPT0gMSwgdGhpcyBsb29wIHdpbGwgbm90IGV4ZWN1dGUuCisJCSAqIEZvciBIVCBJTF9IVF9OVU1CRVJfVFJZID09IDMsIHRoaXMgZXhlY3V0ZXMgdHdpY2UuICovCisJCXdoaWxlIChyZXBlYXRfcmF0ZSA+IDAgJiYgaWR4IDwgTElOS19RVUFMX01BWF9SRVRSWV9OVU0pIHsKKwkJCWlmIChpc19sZWdhY3kodGJsX3R5cGUubHFfdHlwZSkpIHsKKwkJCQlpZiAoYW50X3RvZ2dsZV9jbnQgPCBOVU1fVFJZX0JFRk9SRV9BTlRfVE9HR0xFKQorCQkJCQlhbnRfdG9nZ2xlX2NudCsrOworCQkJCWVsc2UgaWYgKGlsICYmCisJCQkJCSBpbDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAorCQkJCQkJCQkgICZuZXdfcmF0ZSwKKwkJCQkJCQkJICAmdGJsX3R5cGUpKQorCQkJCQlhbnRfdG9nZ2xlX2NudCA9IDE7CisJCQl9CisKKwkJCS8qIE92ZXJyaWRlIG5leHQgcmF0ZSBpZiBuZWVkZWQgZm9yIGRlYnVnIHB1cnBvc2VzICovCisJCQlpbDQ5NjVfcnNfZGJnZnNfc2V0X21jcyhscV9zdGEsICZuZXdfcmF0ZSwgaWR4KTsKKworCQkJLyogRmlsbCBuZXh0IHRhYmxlIGVudHJ5ICovCisJCQlscV9jbWQtPnJzX3RhYmxlW2lkeF0ucmF0ZV9uX2ZsYWdzID0KKwkJCSAgICBjcHVfdG9fbGUzMihuZXdfcmF0ZSk7CisJCQlyZXBlYXRfcmF0ZS0tOworCQkJaWR4Kys7CisJCX0KKworCQlpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKG5ld19yYXRlLCBscV9zdGEtPmJhbmQsCisJCQkJCQkmdGJsX3R5cGUsICZyYXRlX2lkeCk7CisKKwkJLyogSW5kaWNhdGUgdG8gdUNvZGUgd2hpY2ggZW50cmllcyBtaWdodCBiZSBNSU1PLgorCQkgKiBJZiBpbml0aWFsIHJhdGUgd2FzIE1JTU8sIHRoaXMgd2lsbCBmaW5hbGx5IGVuZCB1cAorCQkgKiBhcyAoSUxfSFRfTlVNQkVSX1RSWSAqIDIpLCBhZnRlciAybmQgcGFzcywgb3RoZXJ3aXNlIDAuICovCisJCWlmIChpc19taW1vKHRibF90eXBlLmxxX3R5cGUpKQorCQkJbHFfY21kLT5nZW5lcmFsX3BhcmFtcy5taW1vX2RlbGltaXRlciA9IGlkeDsKKworCQkvKiBHZXQgbmV4dCByYXRlICovCisJCW5ld19yYXRlID0KKwkJICAgIGlsNDk2NV9yc19nZXRfbG93ZXJfcmF0ZShscV9zdGEsICZ0YmxfdHlwZSwgcmF0ZV9pZHgsCisJCQkJCSAgICAgdXNlX2h0X3Bvc3NpYmxlKTsKKworCQkvKiBIb3cgbWFueSB0aW1lcyBzaG91bGQgd2UgcmVwZWF0IHRoZSBuZXh0IHJhdGU/ICovCisJCWlmIChpc19sZWdhY3kodGJsX3R5cGUubHFfdHlwZSkpIHsKKwkJCWlmIChhbnRfdG9nZ2xlX2NudCA8IE5VTV9UUllfQkVGT1JFX0FOVF9UT0dHTEUpCisJCQkJYW50X3RvZ2dsZV9jbnQrKzsKKwkJCWVsc2UgaWYgKGlsICYmCisJCQkJIGlsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsCisJCQkJCQkJICAmbmV3X3JhdGUsICZ0YmxfdHlwZSkpCisJCQkJYW50X3RvZ2dsZV9jbnQgPSAxOworCisJCQlyZXBlYXRfcmF0ZSA9IElMX05VTUJFUl9UUlk7CisJCX0gZWxzZSB7CisJCQlyZXBlYXRfcmF0ZSA9IElMX0hUX05VTUJFUl9UUlk7CisJCX0KKworCQkvKiBEb24ndCBhbGxvdyBIVCByYXRlcyBhZnRlciBuZXh0IHBhc3MuCisJCSAqIGlsNDk2NV9yc19nZXRfbG93ZXJfcmF0ZSgpIHdpbGwgY2hhbmdlIHR5cGUgdG8gTFFfQSBvciBMUV9HLiAqLworCQl1c2VfaHRfcG9zc2libGUgPSAwOworCisJCS8qIE92ZXJyaWRlIG5leHQgcmF0ZSBpZiBuZWVkZWQgZm9yIGRlYnVnIHB1cnBvc2VzICovCisJCWlsNDk2NV9yc19kYmdmc19zZXRfbWNzKGxxX3N0YSwgJm5ld19yYXRlLCBpZHgpOworCisJCS8qIEZpbGwgbmV4dCB0YWJsZSBlbnRyeSAqLworCQlscV9jbWQtPnJzX3RhYmxlW2lkeF0ucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIobmV3X3JhdGUpOworCisJCWlkeCsrOworCQlyZXBlYXRfcmF0ZS0tOworCX0KKworCWxxX2NtZC0+YWdnX3BhcmFtcy5hZ2dfZnJhbWVfY250X2xpbWl0ID0gTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9ERUY7CisJbHFfY21kLT5hZ2dfcGFyYW1zLmFnZ19kaXNfc3RhcnRfdGggPSBMSU5LX1FVQUxfQUdHX0RJU0FCTEVfU1RBUlRfREVGOworCisJbHFfY21kLT5hZ2dfcGFyYW1zLmFnZ190aW1lX2xpbWl0ID0KKwkgICAgY3B1X3RvX2xlMTYoTElOS19RVUFMX0FHR19USU1FX0xJTUlUX0RFRik7Cit9CisKK3N0YXRpYyB2b2lkICoKK2lsNDk2NV9yc19hbGxvYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGRlbnRyeSAqZGVidWdmc2RpcikKK3sKKwlyZXR1cm4gaHctPnByaXY7Cit9CisKKy8qIHJhdGUgc2NhbGUgcmVxdWlyZXMgZnJlZSBmdW5jdGlvbiB0byBiZSBpbXBsZW1lbnRlZCAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19mcmVlKHZvaWQgKmlsX3JhdGUpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX2ZyZWVfc3RhKHZvaWQgKmlsX3IsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKmlsX3N0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSBpbF9yOworCisJRF9SQVRFKCJlbnRlclxuIik7CisJRF9SQVRFKCJsZWF2ZVxuIik7Cit9CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworc3RhdGljIGludAoraWw0OTY1X29wZW5fZmlsZV9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfZGJnZnNfc2V0X21jcyhzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsIHUzMiAqIHJhdGVfbl9mbGFncywgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisJdTggdmFsaWRfdHhfYW50OworCXU4IGFudF9zZWxfdHg7CisKKwlpbCA9IGxxX3N0YS0+ZHJ2OworCXZhbGlkX3R4X2FudCA9IGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50OworCWlmIChscV9zdGEtPmRiZ19maXhlZF9yYXRlKSB7CisJCWFudF9zZWxfdHggPQorCQkgICAgKChscV9zdGEtPgorCQkgICAgICBkYmdfZml4ZWRfcmF0ZSAmIFJBVEVfTUNTX0FOVF9BQkNfTVNLKSA+PgorCQkgICAgIFJBVEVfTUNTX0FOVF9QT1MpOworCQlpZiAoKHZhbGlkX3R4X2FudCAmIGFudF9zZWxfdHgpID09IGFudF9zZWxfdHgpIHsKKwkJCSpyYXRlX25fZmxhZ3MgPSBscV9zdGEtPmRiZ19maXhlZF9yYXRlOworCQkJRF9SQVRFKCJGaXhlZCByYXRlIE9OXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSAwOworCQkJSUxfRVJSCisJCQkgICAgKCJJbnZhbGlkIGFudGVubmEgc2VsZWN0aW9uIDB4JVgsIFZhbGlkIGlzIDB4JVhcbiIsCisJCQkgICAgIGFudF9zZWxfdHgsIHZhbGlkX3R4X2FudCk7CisJCQlEX1JBVEUoIkZpeGVkIHJhdGUgT0ZGXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCURfUkFURSgiRml4ZWQgcmF0ZSBPRkZcbiIpOworCX0KK30KKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisJY2hhciBidWZbNjRdOworCXNpemVfdCBidWZfc2l6ZTsKKwl1MzIgcGFyc2VkX3JhdGU7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPQorCSAgICBjb250YWluZXJfb2YobHFfc3RhLCBzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2LCBscV9zdGEpOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OworCisJaWwgPSBscV9zdGEtPmRydjsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV4IiwgJnBhcnNlZF9yYXRlKSA9PSAxKQorCQlscV9zdGEtPmRiZ19maXhlZF9yYXRlID0gcGFyc2VkX3JhdGU7CisJZWxzZQorCQlscV9zdGEtPmRiZ19maXhlZF9yYXRlID0gMDsKKworCWxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlID0gMHgwRkZGOwkvKiAxIC0gNTQgTUJpdHMsIGluY2x1ZGVzIENDSyAqLworCWxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZSA9IDB4MUZEMDsJLyogNiAtIDYwIE1CaXRzLCBubyA5LCBubyBDQ0sgKi8KKwlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlID0gMHgxRkQwOwkvKiA2IC0gNjAgTUJpdHMsIG5vIDksIG5vIENDSyAqLworCisJRF9SQVRFKCJzdGFfaWQgJWQgcmF0ZSAweCVYXG4iLCBscV9zdGEtPmxxLnN0YV9pZCwKKwkgICAgICAgbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSk7CisKKwlpZiAobHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSkgeworCQlpbDQ5NjVfcnNfZmlsbF9saW5rX2NtZChOVUxMLCBscV9zdGEsIGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpOworCQlpbF9zZW5kX2xxX2NtZChscV9zdGEtPmRydiwgY3R4LCAmbHFfc3RhLT5scSwgQ01EX0FTWU5DLCBmYWxzZSk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWw0OTY1X3JzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICpidWZmOworCWludCBkZXNjID0gMDsKKwlpbnQgaSA9IDA7CisJaW50IGlkeCA9IDA7CisJc3NpemVfdCByZXQ7CisKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlsX3ByaXYgKmlsOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisKKwlpbCA9IGxxX3N0YS0+ZHJ2OworCWJ1ZmYgPSBrbWFsbG9jKDEwMjQsIEdGUF9LRVJORUwpOworCWlmICghYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXNjICs9IHNwcmludGYoYnVmZiArIGRlc2MsICJzdGFfaWQgJWRcbiIsIGxxX3N0YS0+bHEuc3RhX2lkKTsKKwlkZXNjICs9CisJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICJmYWlsZWQ9JWQgc3VjY2Vzcz0lZCByYXRlPTAlWFxuIiwKKwkJICAgIGxxX3N0YS0+dG90YWxfZmFpbGVkLCBscV9zdGEtPnRvdGFsX3N1Y2Nlc3MsCisJCSAgICBscV9zdGEtPmFjdGl2ZV9sZWdhY3lfcmF0ZSk7CisJZGVzYyArPQorCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiZml4ZWQgcmF0ZSAweCVYXG4iLCBscV9zdGEtPmRiZ19maXhlZF9yYXRlKTsKKwlkZXNjICs9CisJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICJ2YWxpZF90eF9hbnQgJXMlcyVzXG4iLAorCQkgICAgKGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgQU5UX0EpID8gIkFOVF9BLCIgOiAiIiwKKwkJICAgIChpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCAmIEFOVF9CKSA/ICJBTlRfQiwiIDogIiIsCisJCSAgICAoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiBBTlRfQykgPyAiQU5UX0MiIDogIiIpOworCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywgImxxIHR5cGUgJXNcbiIsCisJCSAgICAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpID8gImxlZ2FjeSIgOiAiSFQiKTsKKwlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgeworCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiICVzIiwKKwkJCSAgICAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpKSA/ICJTSVNPIiA6ICJNSU1PMiIpOworCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiICVzIiwKKwkJCSAgICAodGJsLT5pc19odDQwKSA/ICI0ME1IeiIgOiAiMjBNSHoiKTsKKwkJZGVzYyArPQorCQkgICAgc3ByaW50ZihidWZmICsgZGVzYywgIiAlcyAlcyAlc1xuIiwKKwkJCSAgICAodGJsLT5pc19TR0kpID8gIlNHSSIgOiAiIiwKKwkJCSAgICAobHFfc3RhLT5pc19ncmVlbikgPyAiR0YgZW5hYmxlZCIgOiAiIiwKKwkJCSAgICAobHFfc3RhLT5pc19hZ2cpID8gIkFHRyBvbiIgOiAiIik7CisJfQorCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywgImxhc3QgdHggcmF0ZT0weCVYXG4iLAorCQkgICAgbHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyk7CisJZGVzYyArPQorCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLAorCQkgICAgImdlbmVyYWw6IiAiZmxhZ3M9MHglWCBtaW1vLWQ9JWQgcy1hbnQweCV4IGQtYW50PTB4JXhcbiIsCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLmZsYWdzLAorCQkgICAgbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5taW1vX2RlbGltaXRlciwKKwkJICAgIGxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrLAorCQkgICAgbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKTsKKworCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywKKwkJICAgICJhZ2c6IgorCQkgICAgInRpbWVfbGltaXQ9JWQgZGlzdF9zdGFydF90aD0lZCBmcmFtZV9jbnRfbGltaXQ9JWRcbiIsCisJCSAgICBsZTE2X3RvX2NwdShscV9zdGEtPmxxLmFnZ19wYXJhbXMuYWdnX3RpbWVfbGltaXQpLAorCQkgICAgbHFfc3RhLT5scS5hZ2dfcGFyYW1zLmFnZ19kaXNfc3RhcnRfdGgsCisJCSAgICBscV9zdGEtPmxxLmFnZ19wYXJhbXMuYWdnX2ZyYW1lX2NudF9saW1pdCk7CisKKwlkZXNjICs9CisJICAgIHNwcmludGYoYnVmZiArIGRlc2MsCisJCSAgICAiU3RhcnQgaWR4IFswXT0weCV4IFsxXT0weCV4IFsyXT0weCV4IFszXT0weCV4XG4iLAorCQkgICAgbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2lkeFswXSwKKwkJICAgIGxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc3RhcnRfcmF0ZV9pZHhbMV0sCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLnN0YXJ0X3JhdGVfaWR4WzJdLAorCQkgICAgbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2lkeFszXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTElOS19RVUFMX01BWF9SRVRSWV9OVU07IGkrKykgeworCQlpZHggPQorCQkgICAgaWw0OTY1X2h3cmF0ZV90b19wbGNwX2lkeChsZTMyX3RvX2NwdQorCQkJCQkgICAgICAobHFfc3RhLT5scS5yc190YWJsZVtpXS4KKwkJCQkJICAgICAgIHJhdGVfbl9mbGFncykpOworCQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKKwkJCWRlc2MgKz0KKwkJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiIHJhdGVbJWRdIDB4JVggJXNtYnBzXG4iLCBpLAorCQkJCSAgICBsZTMyX3RvX2NwdShscV9zdGEtPmxxLnJzX3RhYmxlW2ldLgorCQkJCQkJcmF0ZV9uX2ZsYWdzKSwKKwkJCQkgICAgaWxfcmF0ZV9tY3NbaWR4XS5tYnBzKTsKKwkJfSBlbHNlIHsKKwkJCWRlc2MgKz0KKwkJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiIHJhdGVbJWRdIDB4JVggJXNtYnBzICglcylcbiIsCisJCQkJICAgIGksCisJCQkJICAgIGxlMzJfdG9fY3B1KGxxX3N0YS0+bHEucnNfdGFibGVbaV0uCisJCQkJCQlyYXRlX25fZmxhZ3MpLAorCQkJCSAgICBpbF9yYXRlX21jc1tpZHhdLm1icHMsCisJCQkJICAgIGlsX3JhdGVfbWNzW2lkeF0ubWNzKTsKKwkJfQorCX0KKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmZiwgZGVzYyk7CisJa2ZyZWUoYnVmZik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX29wcyA9IHsKKwkud3JpdGUgPSBpbDQ5NjVfcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX3dyaXRlLAorCS5yZWFkID0gaWw0OTY1X3JzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9yZWFkLAorCS5vcGVuID0gaWw0OTY1X29wZW5fZmlsZV9nZW5lcmljLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKmJ1ZmY7CisJaW50IGRlc2MgPSAwOworCWludCBpLCBqOworCXNzaXplX3QgcmV0OworCisJc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBMUV9TSVpFOyBpKyspIHsKKwkJZGVzYyArPQorCQkgICAgc3ByaW50ZihidWZmICsgZGVzYywKKwkJCSAgICAiJXMgdHlwZT0lZCBTR0k9JWQgSFQ0MD0lZCBEVVA9JWQgR0Y9JWRcbiIKKwkJCSAgICAicmF0ZT0weCVYXG4iLCBscV9zdGEtPmFjdGl2ZV90YmwgPT0gaSA/ICIqIiA6ICJ4IiwKKwkJCSAgICBscV9zdGEtPmxxX2luZm9baV0ubHFfdHlwZSwKKwkJCSAgICBscV9zdGEtPmxxX2luZm9baV0uaXNfU0dJLAorCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS5pc19odDQwLAorCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS5pc19kdXAsIGxxX3N0YS0+aXNfZ3JlZW4sCisJCQkgICAgbHFfc3RhLT5scV9pbmZvW2ldLmN1cnJlbnRfcmF0ZSk7CisJCWZvciAoaiA9IDA7IGogPCBSQVRFX0NPVU5UOyBqKyspIHsKKwkJCWRlc2MgKz0KKwkJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLAorCQkJCSAgICAiY291bnRlcj0lZCBzdWNjZXNzPSVkICUlPSVkXG4iLAorCQkJCSAgICBscV9zdGEtPmxxX2luZm9baV0ud2luW2pdLmNvdW50ZXIsCisJCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS53aW5bal0uc3VjY2Vzc19jb3VudGVyLAorCQkJCSAgICBscV9zdGEtPmxxX2luZm9baV0ud2luW2pdLnN1Y2Nlc3NfcmF0aW8pOworCQl9CisJfQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmZiwgZGVzYyk7CisJa2ZyZWUoYnVmZik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX29wcyA9IHsKKwkucmVhZCA9IGlsNDk2NV9yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZCwKKwkub3BlbiA9IGlsNDk2NV9vcGVuX2ZpbGVfZ2VuZXJpYywKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdAoraWw0OTY1X3JzX3N0YV9kYmdmc19yYXRlX3NjYWxlX2RhdGFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCQkgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmZlsxMjBdOworCWludCBkZXNjID0gMDsKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmbHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF07CisKKwlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkKKwkJZGVzYyArPQorCQkgICAgc3ByaW50ZihidWZmICsgZGVzYywgIkJpdCBSYXRlPSAlZCBNYi9zXG4iLAorCQkJICAgIHRibC0+ZXhwZWN0ZWRfdHB0W2xxX3N0YS0+bGFzdF90eHJhdGVfaWR4XSk7CisJZWxzZQorCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiQml0IFJhdGU9ICVkIE1iL3NcbiIsCisJCQkgICAgaWxfcmF0ZXNbbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHhdLmllZWUgPj4gMSk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9vcHMgPSB7CisJLnJlYWQgPSBpbDQ5NjVfcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9yZWFkLAorCS5vcGVuID0gaWw0OTY1X29wZW5fZmlsZV9nZW5lcmljLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfYWRkX2RlYnVnZnModm9pZCAqaWwsIHZvaWQgKmlsX3N0YSwgc3RydWN0IGRlbnRyeSAqZGlyKQoreworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSA9IGlsX3N0YTsKKwlscV9zdGEtPnJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9maWxlID0KKwkgICAgZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zY2FsZV90YWJsZSIsIFNfSVJVU1IgfCBTX0lXVVNSLCBkaXIsCisJCQkJbHFfc3RhLCAmcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX29wcyk7CisJbHFfc3RhLT5yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZSA9CisJICAgIGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJhdGVfc3RhdHNfdGFibGUiLCBTX0lSVVNSLCBkaXIsIGxxX3N0YSwKKwkJCQkmcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX29wcyk7CisJbHFfc3RhLT5yc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX2ZpbGUgPQorCSAgICBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3NjYWxlX2RhdGEiLCBTX0lSVVNSLCBkaXIsIGxxX3N0YSwKKwkJCQkmcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9vcHMpOworCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3R4X2FnZ190aWRfZW5fZmlsZSA9CisJICAgIGRlYnVnZnNfY3JlYXRlX3U4KCJ0eF9hZ2dfdGlkX2VuYWJsZSIsIFNfSVJVU1IgfCBTX0lXVVNSLCBkaXIsCisJCQkgICAgICAmbHFfc3RhLT50eF9hZ2dfdGlkX2VuKTsKKworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX3JlbW92ZV9kZWJ1Z2ZzKHZvaWQgKmlsLCB2b2lkICppbF9zdGEpCit7CisJc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhID0gaWxfc3RhOworCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShscV9zdGEtPnJzX3N0YV9kYmdmc190eF9hZ2dfdGlkX2VuX2ZpbGUpOworfQorI2VuZGlmCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiByYXRlIHNjYWxpbmcgaW5mb3JtYXRpb24gaXMgZG9uZSBieSBkcml2ZXIgYWZ0ZXIKKyAqIHRoZSBzdGF0aW9uIGlzIGFkZGVkLiBTaW5jZSBtYWM4MDIxMSBjYWxscyB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhCisgKiBzdGF0aW9uIGlzIGFkZGVkIHdlIGlnbm9yZSBpdC4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19yYXRlX2luaXRfc3R1Yih2b2lkICppbF9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICppbF9zdGEpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyByc180OTY1X29wcyA9IHsKKwkubW9kdWxlID0gTlVMTCwKKwkubmFtZSA9IElMNDk2NV9SU19OQU1FLAorCS50eF9zdGF0dXMgPSBpbDQ5NjVfcnNfdHhfc3RhdHVzLAorCS5nZXRfcmF0ZSA9IGlsNDk2NV9yc19nZXRfcmF0ZSwKKwkucmF0ZV9pbml0ID0gaWw0OTY1X3JzX3JhdGVfaW5pdF9zdHViLAorCS5hbGxvYyA9IGlsNDk2NV9yc19hbGxvYywKKwkuZnJlZSA9IGlsNDk2NV9yc19mcmVlLAorCS5hbGxvY19zdGEgPSBpbDQ5NjVfcnNfYWxsb2Nfc3RhLAorCS5mcmVlX3N0YSA9IGlsNDk2NV9yc19mcmVlX3N0YSwKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCS5hZGRfc3RhX2RlYnVnZnMgPSBpbDQ5NjVfcnNfYWRkX2RlYnVnZnMsCisJLnJlbW92ZV9zdGFfZGVidWdmcyA9IGlsNDk2NV9yc19yZW1vdmVfZGVidWdmcywKKyNlbmRpZgorfTsKKworaW50CitpbDQ5NjVfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoJnJzXzQ5NjVfb3BzKTsKK30KKwordm9pZAoraWw0OTY1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKHZvaWQpCit7CisJaWVlZTgwMjExX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCZyc180OTY1X29wcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjNTRkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUuYwpAQCAtMCwwICsxLDI0MjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiNDk2NS5oIgorCisvKioKKyAqIGlsX3ZlcmlmeV9pbnN0X3NwYXJzZSAtIHZlcmlmeSBydW50aW1lIHVDb2RlIGltYWdlIGluIGNhcmQgdnMuIGhvc3QsCisgKiAgIHVzaW5nIHNhbXBsZSBkYXRhIDEwMCBieXRlcyBhcGFydC4gIElmIHRoZXNlIHNhbXBsZSBwb2ludHMgYXJlIGdvb2QsCisgKiAgIGl0J3MgYSBwcmV0dHkgZ29vZCBiZXQgdGhhdCBldmVyeXRoaW5nIGJldHdlZW4gdGhlbSBpcyBnb29kLCB0b28uCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2Uoc3RydWN0IGlsX3ByaXYgKmlsLCBfX2xlMzIgKiBpbWFnZSwgdTMyIGxlbikKK3sKKwl1MzIgdmFsOworCWludCByZXQgPSAwOworCXUzMiBlcnJjbnQgPSAwOworCXUzMiBpOworCisJRF9JTkZPKCJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDEwMCwgaW1hZ2UgKz0gMTAwIC8gc2l6ZW9mKHUzMikpIHsKKwkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCisJCS8qIE5PVEU6IFVzZSB0aGUgZGVidWdsZXNzIHJlYWQgc28gd2UgZG9uJ3QgZmxvb2Qga2VybmVsIGxvZworCQkgKiBpZiBJTF9ETF9JTyBpcyBzZXQgKi8KKwkJaWxfd3IoaWwsIEhCVVNfVEFSR19NRU1fUkFERFIsIGkgKyBJTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOworCQl2YWwgPSBfaWxfcmQoaWwsIEhCVVNfVEFSR19NRU1fUkRBVCk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWVycmNudCsrOworCQkJaWYgKGVycmNudCA+PSAzKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpbDQ5NjVfdmVyaWZ5X2luc3RfZnVsbCAtIHZlcmlmeSBydW50aW1lIHVDb2RlIGltYWdlIGluIGNhcmQgdnMuIGhvc3QsCisgKiAgICAgbG9va2luZyBhdCBhbGwgZGF0YS4KKyAqLworc3RhdGljIGludAoraWw0OTY1X3ZlcmlmeV9pbnN0X2Z1bGwoc3RydWN0IGlsX3ByaXYgKmlsLCBfX2xlMzIgKiBpbWFnZSwgdTMyIGxlbikKK3sKKwl1MzIgdmFsOworCXUzMiBzYXZlX2xlbiA9IGxlbjsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgZXJyY250OworCisJRF9JTkZPKCJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7CisKKwlpbF93cihpbCwgSEJVU19UQVJHX01FTV9SQUREUiwgSUw0OTY1X1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKKworCWVycmNudCA9IDA7CisJZm9yICg7IGxlbiA+IDA7IGxlbiAtPSBzaXplb2YodTMyKSwgaW1hZ2UrKykgeworCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KKwkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCisJCSAqIGlmIElMX0RMX0lPIGlzIHNldCAqLworCQl2YWwgPSBfaWxfcmQoaWwsIEhCVVNfVEFSR19NRU1fUkRBVCk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgeworCQkJSUxfRVJSKCJ1Q29kZSBJTlNUIHNlY3Rpb24gaXMgaW52YWxpZCBhdCAiCisJCQkgICAgICAgIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwKKwkJCSAgICAgICBzYXZlX2xlbiAtIGxlbiwgdmFsLCBsZTMyX3RvX2NwdSgqaW1hZ2UpKTsKKwkJCXJldCA9IC1FSU87CisJCQllcnJjbnQrKzsKKwkJCWlmIChlcnJjbnQgPj0gMjApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWVycmNudCkKKwkJRF9JTkZPKCJ1Y29kZSBpbWFnZSBpbiBJTlNUUlVDVElPTiBtZW1vcnkgaXMgZ29vZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlsNDk2NV92ZXJpZnlfdWNvZGUgLSBkZXRlcm1pbmUgd2hpY2ggaW5zdHJ1Y3Rpb24gaW1hZ2UgaXMgaW4gU1JBTSwKKyAqICAgIGFuZCB2ZXJpZnkgaXRzIGNvbnRlbnRzCisgKi8KK2ludAoraWw0OTY1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX19sZTMyICppbWFnZTsKKwl1MzIgbGVuOworCWludCByZXQ7CisKKwkvKiBUcnkgYm9vdHN0cmFwICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9ib290LnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfYm9vdC5sZW47CisJcmV0ID0gaWw0OTY1X3ZlcmlmeV9pbnN0X3NwYXJzZShpbCwgaW1hZ2UsIGxlbik7CisJaWYgKCFyZXQpIHsKKwkJRF9JTkZPKCJCb290c3RyYXAgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgaW5pdGlhbGl6ZSAqLworCWltYWdlID0gKF9fbGUzMiAqKSBpbC0+dWNvZGVfaW5pdC52X2FkZHI7CisJbGVuID0gaWwtPnVjb2RlX2luaXQubGVuOworCXJldCA9IGlsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2UoaWwsIGltYWdlLCBsZW4pOworCWlmICghcmV0KSB7CisJCURfSU5GTygiSW5pdGlhbGl6ZSB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFRyeSBydW50aW1lL3Byb3RvY29sICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9jb2RlLnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfY29kZS5sZW47CisJcmV0ID0gaWw0OTY1X3ZlcmlmeV9pbnN0X3NwYXJzZShpbCwgaW1hZ2UsIGxlbik7CisJaWYgKCFyZXQpIHsKKwkJRF9JTkZPKCJSdW50aW1lIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJSUxfRVJSKCJOTyBWQUxJRCBVQ09ERSBJTUFHRSBJTiBJTlNUUlVDVElPTiBTUkFNISFcbiIpOworCisJLyogU2luY2Ugbm90aGluZyBzZWVtcyB0byBtYXRjaCwgc2hvdyBmaXJzdCBzZXZlcmFsIGRhdGEgZW50cmllcyBpbgorCSAqIGluc3RydWN0aW9uIFNSQU0sIHNvIG1heWJlIHZpc3VhbCBpbnNwZWN0aW9uIHdpbGwgZ2l2ZSBhIGNsdWUuCisJICogU2VsZWN0aW9uIG9mIGJvb3RzdHJhcCBpbWFnZSAodnMuIG90aGVyIGltYWdlcykgaXMgYXJiaXRyYXJ5LiAqLworCWltYWdlID0gKF9fbGUzMiAqKSBpbC0+dWNvZGVfYm9vdC52X2FkZHI7CisJbGVuID0gaWwtPnVjb2RlX2Jvb3QubGVuOworCXJldCA9IGlsNDk2NV92ZXJpZnlfaW5zdF9mdWxsKGlsLCBpbWFnZSwgbGVuKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFRVBST00gcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGUgZGV2aWNlJ3MgRUVQUk9NIHNlbWFwaG9yZSBwcmV2ZW50cyBjb25mbGljdHMgYmV0d2VlbiBkcml2ZXIgYW5kIHVDb2RlCisgKiB3aGVuIGFjY2Vzc2luZyB0aGUgRUVQUk9NOyBlYWNoIGFjY2VzcyBpcyBhIHNlcmllcyBvZiBwdWxzZXMgdG8vZnJvbSB0aGUKKyAqIEVFUFJPTSBjaGlwLCBub3QgYSBzaW5nbGUgZXZlbnQsIHNvIGV2ZW4gcmVhZHMgY291bGQgY29uZmxpY3QgaWYgdGhleQorICogd2VyZW4ndCBhcmJpdHJhdGVkIGJ5IHRoZSBzZW1hcGhvcmUuCisgKi8KK2ludAoraWw0OTY1X2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTE2IGNvdW50OworCWludCByZXQ7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBFRVBST01fU0VNX1JFVFJZX0xJTUlUOyBjb3VudCsrKSB7CisJCS8qIFJlcXVlc3Qgc2VtYXBob3JlICovCisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNKTsKKworCQkvKiBTZWUgaWYgd2UgZ290IGl0ICovCisJCXJldCA9CisJCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJCSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0sCisJCQkJIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSwKKwkJCQkgRUVQUk9NX1NFTV9USU1FT1VUKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitpbDQ5NjVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbF9jbGVhcl9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkgICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSk7CisKK30KKworaW50CitpbDQ5NjVfZWVwcm9tX2NoZWNrX3ZlcnNpb24oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXUxNiBlZXByb21fdmVyOworCXUxNiBjYWxpYl92ZXI7CisKKwllZXByb21fdmVyID0gaWxfZWVwcm9tX3F1ZXJ5MTYoaWwsIEVFUFJPTV9WRVJTSU9OKTsKKwljYWxpYl92ZXIgPSBpbF9lZXByb21fcXVlcnkxNihpbCwgRUVQUk9NXzQ5NjVfQ0FMSUJfVkVSU0lPTl9PRkZTRVQpOworCisJaWYgKGVlcHJvbV92ZXIgPCBpbC0+Y2ZnLT5lZXByb21fdmVyIHx8CisJICAgIGNhbGliX3ZlciA8IGlsLT5jZmctPmVlcHJvbV9jYWxpYl92ZXIpCisJCWdvdG8gZXJyOworCisJSUxfSU5GTygiZGV2aWNlIEVFUFJPTSBWRVI9MHgleCwgQ0FMSUI9MHgleFxuIiwgZWVwcm9tX3ZlciwgY2FsaWJfdmVyKTsKKworCXJldHVybiAwOworZXJyOgorCUlMX0VSUigiVW5zdXBwb3J0ZWQgKHRvbyBvbGQpIEVFUFJPTSBWRVI9MHgleCA8IDB4JXggIgorCSAgICAgICAiQ0FMSUI9MHgleCA8IDB4JXhcbiIsIGVlcHJvbV92ZXIsIGlsLT5jZmctPmVlcHJvbV92ZXIsCisJICAgICAgIGNhbGliX3ZlciwgaWwtPmNmZy0+ZWVwcm9tX2NhbGliX3Zlcik7CisJcmV0dXJuIC1FSU5WQUw7CisKK30KKwordm9pZAoraWw0OTY1X2VlcHJvbV9nZXRfbWFjKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwgdTggKiBtYWMpCit7CisJY29uc3QgdTggKmFkZHIgPSBpbF9lZXByb21fcXVlcnlfYWRkcihpbCwKKwkJCQkJICAgICAgRUVQUk9NX01BQ19BRERSRVNTKTsKKwltZW1jcHkobWFjLCBhZGRyLCBFVEhfQUxFTik7Cit9CisKKy8qIFNlbmQgbGVkIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5kX2xlZF9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbGVkX2NtZCAqbGVkX2NtZCkKK3sKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX0xFRFMsCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGlsX2xlZF9jbWQpLAorCQkuZGF0YSA9IGxlZF9jbWQsCisJCS5mbGFncyA9IENNRF9BU1lOQywKKwkJLmNhbGxiYWNrID0gTlVMTCwKKwl9OworCXUzMiByZWc7CisKKwlyZWcgPSBfaWxfcmQoaWwsIENTUl9MRURfUkVHKTsKKwlpZiAocmVnICE9IChyZWcgJiBDU1JfTEVEX0JTTV9DVFJMX01TSykpCisJCV9pbF93cihpbCwgQ1NSX0xFRF9SRUcsIHJlZyAmIENTUl9MRURfQlNNX0NUUkxfTVNLKTsKKworCXJldHVybiBpbF9zZW5kX2NtZChpbCwgJmNtZCk7Cit9CisKKy8qIFNldCBsZWQgcmVnaXN0ZXIgb2ZmICovCit2b2lkCitpbDQ5NjVfbGVkX2VuYWJsZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX2lsX3dyKGlsLCBDU1JfTEVEX1JFRywgQ1NSX0xFRF9SRUdfVFJVTl9PTik7Cit9CisKK2NvbnN0IHN0cnVjdCBpbF9sZWRfb3BzIGlsNDk2NV9sZWRfb3BzID0geworCS5jbWQgPSBpbDQ5NjVfc2VuZF9sZWRfY21kLAorfTsKKworc3RhdGljIGludCBpbDQ5NjVfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpOworc3RhdGljIGludCBpbDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIElMNDk2NV9VQ09ERV9BUElfTUFYIDIKKworLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLworI2RlZmluZSBJTDQ5NjVfVUNPREVfQVBJX01JTiAyCisKKyNkZWZpbmUgSUw0OTY1X0ZXX1BSRSAiaXdsd2lmaS00OTY1LSIKKyNkZWZpbmUgX0lMNDk2NV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJTDQ5NjVfRldfUFJFICNhcGkgIi51Y29kZSIKKyNkZWZpbmUgSUw0OTY1X01PRFVMRV9GSVJNV0FSRShhcGkpIF9JTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkKKworLyogY2hlY2sgY29udGVudHMgb2Ygc3BlY2lhbCBib290c3RyYXAgdUNvZGUgU1JBTSAqLworc3RhdGljIGludAoraWw0OTY1X3ZlcmlmeV9ic20oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9fbGUzMiAqaW1hZ2UgPSBpbC0+dWNvZGVfYm9vdC52X2FkZHI7CisJdTMyIGxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwl1MzIgcmVnOworCXUzMiB2YWw7CisKKwlEX0lORk8oIkJlZ2luIHZlcmlmeSBic21cbiIpOworCisJLyogdmVyaWZ5IEJTTSBTUkFNIGNvbnRlbnRzICovCisJdmFsID0gaWxfcmRfcHJwaChpbCwgQlNNX1dSX0RXQ09VTlRfUkVHKTsKKwlmb3IgKHJlZyA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOyByZWcgPCBCU01fU1JBTV9MT1dFUl9CT1VORCArIGxlbjsKKwkgICAgIHJlZyArPSBzaXplb2YodTMyKSwgaW1hZ2UrKykgeworCQl2YWwgPSBpbF9yZF9wcnBoKGlsLCByZWcpOworCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpIHsKKwkJCUlMX0VSUigiQlNNIHVDb2RlIHZlcmlmaWNhdGlvbiBmYWlsZWQgYXQgIgorCQkJICAgICAgICJhZGRyIDB4JTA4WCsldSAob2YgJXUpLCBpcyAweCV4LCBzL2IgMHgleFxuIiwKKwkJCSAgICAgICBCU01fU1JBTV9MT1dFUl9CT1VORCwgcmVnIC0gQlNNX1NSQU1fTE9XRVJfQk9VTkQsCisJCQkgICAgICAgbGVuLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlEX0lORk8oIkJTTSBib290c3RyYXAgdUNvZGUgaW1hZ2UgT0tcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWw0OTY1X2xvYWRfYnNtIC0gTG9hZCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zCisgKgorICogQlNNIG9wZXJhdGlvbjoKKyAqCisgKiBUaGUgQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUgKEJTTSkgc3RvcmVzIGEgc2hvcnQgYm9vdHN0cmFwIHVDb2RlIHByb2dyYW0KKyAqIGluIHNwZWNpYWwgU1JBTSB0aGF0IGRvZXMgbm90IHBvd2VyIGRvd24gZHVyaW5nIFJGS0lMTC4gIFdoZW4gcG93ZXJpbmcgYmFjaworICogdXAgYWZ0ZXIgcG93ZXItc2F2aW5nIHNsZWVwcyAob3IgZHVyaW5nIGluaXRpYWwgdUNvZGUgbG9hZCksIHRoZSBCU00gbG9hZHMKKyAqIHRoZSBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsIGFuZCBzdGFydHMgaXQuCisgKgorICogVGhlIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzICh2aWEgRE1BKSBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgZm9yIGEgbmV3CisgKiBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIGhvc3QgZHJpdmVyIGluIHRoZQorICogQlNNX0RSQU1fKiByZWdpc3RlcnMuICBPbmNlIHRoZSBuZXcgcHJvZ3JhbSBpcyBsb2FkZWQsIGl0IHN0YXJ0cworICogYXV0b21hdGljYWxseS4KKyAqCisgKiBXaGVuIGluaXRpYWxpemluZyB0aGUgTklDLCB0aGUgaG9zdCBkcml2ZXIgcG9pbnRzIHRoZSBCU00gdG8gdGhlCisgKiAiaW5pdGlhbGl6ZSIgdUNvZGUgaW1hZ2UuICBUaGlzIHVDb2RlIHNldHMgdXAgc29tZSBpbnRlcm5hbCBkYXRhLCB0aGVuCisgKiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgdGhhdCBpdCBpcyBjb21wbGV0ZS4KKyAqCisgKiBUaGUgaG9zdCB0aGVuIHJlcGxhY2VzIHRoZSBCU01fRFJBTV8qIHBvaW50ZXIgdmFsdWVzIHRvIHBvaW50IHRvIHRoZQorICogbm9ybWFsIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCBhIGJhY2t1cCB1Q29kZSBkYXRhIGNhY2hlIGJ1ZmZlcgorICogKGZpbGxlZCBpbml0aWFsbHkgd2l0aCBzdGFydGluZyBkYXRhIHZhbHVlcyBmb3IgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciksCisgKiB0aGVuIHRyaWdnZXJzIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gbG9hZCBhbmQgbGF1bmNoIHRoZSBydW50aW1lIHVDb2RlLAorICogd2hpY2ggYmVnaW5zIG5vcm1hbCBvcGVyYXRpb24uCisgKgorICogV2hlbiBkb2luZyBhIHBvd2VyLXNhdmUgc2h1dGRvd24sIHJ1bnRpbWUgdUNvZGUgc2F2ZXMgZGF0YSBTUkFNIGludG8KKyAqIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbiBEUkFNIGJlZm9yZSBTUkFNIGlzIHBvd2VyZWQgZG93bi4KKyAqCisgKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgVGhpcyByZWxvYWRzCisgKiB0aGUgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbnRvIFNSQU0sCisgKiBhbmQgcmUtbGF1bmNoZXMgdGhlIHJ1bnRpbWUgdUNvZGUgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4KKyAqLworc3RhdGljIGludAoraWw0OTY1X2xvYWRfYnNtKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfX2xlMzIgKmltYWdlID0gaWwtPnVjb2RlX2Jvb3Qudl9hZGRyOworCXUzMiBsZW4gPSBpbC0+dWNvZGVfYm9vdC5sZW47CisJZG1hX2FkZHJfdCBwaW5zdDsKKwlkbWFfYWRkcl90IHBkYXRhOworCXUzMiBpbnN0X2xlbjsKKwl1MzIgZGF0YV9sZW47CisJaW50IGk7CisJdTMyIGRvbmU7CisJdTMyIHJlZ19vZmZzZXQ7CisJaW50IHJldDsKKworCURfSU5GTygiQmVnaW4gbG9hZCBic21cbiIpOworCisJaWwtPnVjb2RlX3R5cGUgPSBVQ09ERV9SVDsKKworCS8qIG1ha2Ugc3VyZSBib290c3RyYXAgcHJvZ3JhbSBpcyBubyBsYXJnZXIgdGhhbiBCU00ncyBTUkFNIHNpemUgKi8KKwlpZiAobGVuID4gSUw0OV9NQVhfQlNNX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCB0aGUgIkluaXRpYWxpemUiIHVDb2RlCisJICogICBpbiBob3N0IERSQU0gLi4uIGhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgMzU6NCBmb3IgNDk2NS4KKwkgKiBOT1RFOiAgaWxfaW5pdF9hbGl2ZV9zdGFydCgpIHdpbGwgcmVwbGFjZSB0aGVzZSB2YWx1ZXMsCisJICogICAgICAgIGFmdGVyIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgaGFzIHJ1biwgdG8gcG9pbnQgdG8KKwkgKiAgICAgICAgcnVudGltZS9wcm90b2NvbCBpbnN0cnVjdGlvbnMgYW5kIGJhY2t1cCBkYXRhIGNhY2hlLgorCSAqLworCXBpbnN0ID0gaWwtPnVjb2RlX2luaXQucF9hZGRyID4+IDQ7CisJcGRhdGEgPSBpbC0+dWNvZGVfaW5pdF9kYXRhLnBfYWRkciA+PiA0OworCWluc3RfbGVuID0gaWwtPnVjb2RlX2luaXQubGVuOworCWRhdGFfbGVuID0gaWwtPnVjb2RlX2luaXRfZGF0YS5sZW47CisKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX1BUUl9SRUcsIHBpbnN0KTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX1BUUl9SRUcsIHBkYXRhKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcsIGluc3RfbGVuKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsIGRhdGFfbGVuKTsKKworCS8qIEZpbGwgQlNNIG1lbW9yeSB3aXRoIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMgKi8KKwlmb3IgKHJlZ19vZmZzZXQgPSBCU01fU1JBTV9MT1dFUl9CT1VORDsKKwkgICAgIHJlZ19vZmZzZXQgPCBCU01fU1JBTV9MT1dFUl9CT1VORCArIGxlbjsKKwkgICAgIHJlZ19vZmZzZXQgKz0gc2l6ZW9mKHUzMiksIGltYWdlKyspCisJCV9pbF93cl9wcnBoKGlsLCByZWdfb2Zmc2V0LCBsZTMyX3RvX2NwdSgqaW1hZ2UpKTsKKworCXJldCA9IGlsNDk2NV92ZXJpZnlfYnNtKGlsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogVGVsbCBCU00gdG8gY29weSBmcm9tIEJTTSBTUkFNIGludG8gaW5zdHJ1Y3Rpb24gU1JBTSwgd2hlbiBhc2tlZCAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9NRU1fU1JDX1JFRywgMHgwKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fV1JfTUVNX0RTVF9SRUcsIElMNDlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9EV0NPVU5UX1JFRywgbGVuIC8gc2l6ZW9mKHUzMikpOworCisJLyogTG9hZCBib290c3RyYXAgY29kZSBpbnRvIGluc3RydWN0aW9uIFNSQU0gbm93LAorCSAqICAgdG8gcHJlcGFyZSB0byBsb2FkICJpbml0aWFsaXplIiB1Q29kZSAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9DVFJMX1JFRywgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCk7CisKKwkvKiBXYWl0IGZvciBsb2FkIG9mIGJvb3RzdHJhcCB1Q29kZSB0byBmaW5pc2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJZG9uZSA9IGlsX3JkX3BycGgoaWwsIEJTTV9XUl9DVFJMX1JFRyk7CisJCWlmICghKGRvbmUgJiBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA8IDEwMCkKKwkJRF9JTkZPKCJCU00gd3JpdGUgY29tcGxldGUsIHBvbGwgJWQgaXRlcmF0aW9uc1xuIiwgaSk7CisJZWxzZSB7CisJCUlMX0VSUigiQlNNIHdyaXRlIGRpZCBub3QgY29tcGxldGUhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRW5hYmxlIGZ1dHVyZSBib290IGxvYWRzIHdoZW5ldmVyIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCB0cmlnZ2VycyBpdAorCSAqICAgKGUuZy4gd2hlbiBwb3dlcmluZyBiYWNrIHVwIGFmdGVyIHBvd2VyLXNhdmUgc2h1dGRvd24pICovCisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX0NUUkxfUkVHLCBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUX0VOKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsNDk2NV9zZXRfdWNvZGVfcHRycyAtIFNldCB1Q29kZSBhZGRyZXNzIGxvY2F0aW9uCisgKgorICogVGVsbCBpbml0aWFsaXphdGlvbiB1Q29kZSB3aGVyZSB0byBmaW5kIHJ1bnRpbWUgdUNvZGUuCisgKgorICogQlNNIHJlZ2lzdGVycyBpbml0aWFsbHkgY29udGFpbiBwb2ludGVycyB0byBpbml0aWFsaXphdGlvbiB1Q29kZS4KKyAqIFdlIG5lZWQgdG8gcmVwbGFjZSB0aGVtIHRvIGxvYWQgcnVudGltZSB1Q29kZSBpbnN0IGFuZCBkYXRhLAorICogYW5kIHRvIHNhdmUgcnVudGltZSBkYXRhIHdoZW4gcG93ZXJpbmcgZG93bi4KKyAqLworc3RhdGljIGludAoraWw0OTY1X3NldF91Y29kZV9wdHJzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlkbWFfYWRkcl90IHBpbnN0OworCWRtYV9hZGRyX3QgcGRhdGE7CisJaW50IHJldCA9IDA7CisKKwkvKiBiaXRzIDM1OjQgZm9yIDQ5NjUgKi8KKwlwaW5zdCA9IGlsLT51Y29kZV9jb2RlLnBfYWRkciA+PiA0OworCXBkYXRhID0gaWwtPnVjb2RlX2RhdGFfYmFja3VwLnBfYWRkciA+PiA0OworCisJLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCBpbWFnZSB0byBsb2FkICovCisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7CisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fREFUQV9QVFJfUkVHLCBwZGF0YSk7CisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLCBpbC0+dWNvZGVfZGF0YS5sZW4pOworCisJLyogSW5zdCBieXRlIGNvdW50IG11c3QgYmUgbGFzdCB0byBzZXQgdXAsIGJpdCAzMSBzaWduYWxzIHVDb2RlCisJICogICB0aGF0IGFsbCBuZXcgcHRyL3NpemUgaW5mbyBpcyBpbiBwbGFjZSAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0lOU1RfQllURUNPVU5UX1JFRywKKwkJICAgaWwtPnVjb2RlX2NvZGUubGVuIHwgQlNNX0RSQU1fSU5TVF9MT0FEKTsKKwlEX0lORk8oIlJ1bnRpbWUgdUNvZGUgcG9pbnRlcnMgYXJlIHNldC5cbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpbDQ5NjVfaW5pdF9hbGl2ZV9zdGFydCAtIENhbGxlZCBhZnRlciBOX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZAorICoKKyAqIENhbGxlZCBhZnRlciBOX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tICJpbml0aWFsaXplIiB1Q29kZS4KKyAqCisgKiBUaGUgNDk2NSAiaW5pdGlhbGl6ZSIgQUxJVkUgcmVwbHkgY29udGFpbnMgY2FsaWJyYXRpb24gZGF0YSBmb3I6CisgKiAgIFZvbHRhZ2UsIHRlbXBlcmF0dXJlLCBhbmQgTUlNTyB0eCBnYWluIGNvcnJlY3Rpb24sIG5vdyBzdG9yZWQgaW4gaWwKKyAqICAgKDM5NDUgZG9lcyBub3QgY29udGFpbiB0aGlzIGRhdGEpLgorICoKKyAqIFRlbGwgImluaXRpYWxpemUiIHVDb2RlIHRvIGdvIGFoZWFkIGFuZCBsb2FkIHRoZSBydW50aW1lIHVDb2RlLgorKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfaW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogQm9vdHN0cmFwIHVDb2RlIGhhcyBsb2FkZWQgaW5pdGlhbGl6ZSB1Q29kZSAuLi4gdmVyaWZ5IGluc3QgaW1hZ2UuCisJICogVGhpcyBpcyBhIHBhcmFub2lkIGNoZWNrLCBiZWNhdXNlIHdlIHdvdWxkIG5vdCBoYXZlIGdvdHRlbiB0aGUKKwkgKiAiaW5pdGlhbGl6ZSIgYWxpdmUgaWYgY29kZSB3ZXJlbid0IHByb3Blcmx5IGxvYWRlZC4gICovCisJaWYgKGlsNDk2NV92ZXJpZnlfdWNvZGUoaWwpKSB7CisJCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3YXMgYmFkOworCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCisJCURfSU5GTygiQmFkIFwiaW5pdGlhbGl6ZVwiIHVDb2RlIGxvYWQuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIENhbGN1bGF0ZSB0ZW1wZXJhdHVyZSAqLworCWlsLT50ZW1wZXJhdHVyZSA9IGlsNDk2NV9od19nZXRfdGVtcGVyYXR1cmUoaWwpOworCisJLyogU2VuZCBwb2ludGVycyB0byBwcm90b2NvbC9ydW50aW1lIHVDb2RlIGltYWdlIC4uLiBpbml0IGNvZGUgd2lsbAorCSAqIGxvYWQgYW5kIGxhdW5jaCBydW50aW1lIHVDb2RlLCB3aGljaCB3aWxsIHNlbmQgdXMgYW5vdGhlciAiQWxpdmUiCisJICogbm90aWZpY2F0aW9uLiAqLworCURfSU5GTygiSW5pdGlhbGl6YXRpb24gQWxpdmUgcmVjZWl2ZWQuXG4iKTsKKwlpZiAoaWw0OTY1X3NldF91Y29kZV9wdHJzKGlsKSkgeworCQkvKiBSdW50aW1lIGluc3RydWN0aW9uIGxvYWQgd29uJ3QgaGFwcGVuOworCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCisJCURfSU5GTygiQ291bGRuJ3Qgc2V0IHVwIHVDb2RlIHBvaW50ZXJzLlxuIik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJcmV0dXJuOworCityZXN0YXJ0OgorCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yZXN0YXJ0KTsKK30KKworc3RhdGljIGJvb2wKK2l3NDk2NV9pc19odDQwX2NoYW5uZWwoX19sZTMyIHJ4b25fZmxhZ3MpCit7CisJaW50IGNoYW5fbW9kID0KKwkgICAgbGUzMl90b19jcHUocnhvbl9mbGFncyAmIFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NU0spID4+CisJICAgIFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QT1M7CisJcmV0dXJuIChjaGFuX21vZCA9PSBDSEFOTkVMX01PREVfUFVSRV80MCB8fAorCQljaGFuX21vZCA9PSBDSEFOTkVMX01PREVfTUlYRUQpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X25pY19jb25maWcoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IHJhZGlvX2NmZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJcmFkaW9fY2ZnID0gaWxfZWVwcm9tX3F1ZXJ5MTYoaWwsIEVFUFJPTV9SQURJT19DT05GSUcpOworCisJLyogd3JpdGUgcmFkaW8gY29uZmlnIHZhbHVlcyB0byByZWdpc3RlciAqLworCWlmIChFRVBST01fUkZfQ0ZHX1RZUEVfTVNLKHJhZGlvX2NmZykgPT0gRUVQUk9NXzQ5NjVfUkZfQ0ZHX1RZUEVfTUFYKQorCQlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgIEVFUFJPTV9SRl9DRkdfVFlQRV9NU0socmFkaW9fY2ZnKSB8CisJCQkgICBFRVBST01fUkZfQ0ZHX1NURVBfTVNLKHJhZGlvX2NmZykgfAorCQkJICAgRUVQUk9NX1JGX0NGR19EQVNIX01TSyhyYWRpb19jZmcpKTsKKworCS8qIHNldCBDU1JfSFdfQ09ORklHX1JFRyBmb3IgdUNvZGUgdXNlICovCisJaWxfc2V0X2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCSAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9SQURJT19TSSB8CisJCSAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9NQUNfU0kpOworCisJaWwtPmNhbGliX2luZm8gPQorCSAgICAoc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9pbmZvICopCisJICAgIGlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLCBFRVBST01fNDk2NV9DQUxJQl9UWFBPV0VSX09GRlNFVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworfQorCisvKiBSZXNldCBkaWZmZXJlbnRpYWwgUnggZ2FpbnMgaW4gTklDIHRvIHByZXBhcmUgZm9yIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uLgorICogQ2FsbGVkIGFmdGVyIGV2ZXJ5IGFzc29jaWF0aW9uLCBidXQgdGhpcyBydW5zIG9ubHkgb25jZSEKKyAqICAuLi4gb25jZSBjaGFpbiBub2lzZSBpcyBjYWxpYnJhdGVkIHRoZSBmaXJzdCB0aW1lLCBpdCdzIGdvb2QgZm9yZXZlci4gICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2NoYWluX25vaXNlX3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YSA9ICYoaWwtPmNoYWluX25vaXNlX2RhdGEpOworCisJaWYgKGRhdGEtPnN0YXRlID09IElMX0NIQUlOX05PSVNFX0FMSVZFICYmIGlsX2lzX2FueV9hc3NvY2lhdGVkKGlsKSkgeworCQlzdHJ1Y3QgaWxfY2FsaWJfZGlmZl9nYWluX2NtZCBjbWQ7CisKKwkJLyogY2xlYXIgZGF0YSBmb3IgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gYWxnb3JpdGhtICovCisJCWRhdGEtPmNoYWluX25vaXNlX2EgPSAwOworCQlkYXRhLT5jaGFpbl9ub2lzZV9iID0gMDsKKwkJZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IDA7CisJCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gMDsKKwkJZGF0YS0+Y2hhaW5fc2lnbmFsX2IgPSAwOworCQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IDA7CisJCWRhdGEtPmJlYWNvbl9jb3VudCA9IDA7CisKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJY21kLmhkci5vcF9jb2RlID0gSUxfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01EOworCQljbWQuZGlmZl9nYWluX2EgPSAwOworCQljbWQuZGlmZl9nYWluX2IgPSAwOworCQljbWQuZGlmZl9nYWluX2MgPSAwOworCQlpZiAoaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1BIWV9DQUxJQlJBVElPTiwgc2l6ZW9mKGNtZCksICZjbWQpKQorCQkJSUxfRVJSKCJDb3VsZCBub3Qgc2VuZCBDX1BIWV9DQUxJQlJBVElPTlxuIik7CisJCWRhdGEtPnN0YXRlID0gSUxfQ0hBSU5fTk9JU0VfQUNDVU1VTEFURTsKKwkJRF9DQUxJQigiUnVuIGNoYWluX25vaXNlX2NhbGlicmF0ZVxuIik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGlsX3NlbnNpdGl2aXR5X3JhbmdlcyBpbDQ5NjVfc2Vuc2l0aXZpdHkgPSB7CisJLm1pbl9ucmdfY2NrID0gOTcsCisJLm1heF9ucmdfY2NrID0gMCwJLyogbm90IHVzZWQsIHNldCB0byAwICovCisKKwkuYXV0b19jb3JyX21pbl9vZmRtID0gODUsCisJLmF1dG9fY29ycl9taW5fb2ZkbV9tcmMgPSAxNzAsCisJLmF1dG9fY29ycl9taW5fb2ZkbV94MSA9IDEwNSwKKwkuYXV0b19jb3JyX21pbl9vZmRtX21yY194MSA9IDIyMCwKKworCS5hdXRvX2NvcnJfbWF4X29mZG0gPSAxMjAsCisJLmF1dG9fY29ycl9tYXhfb2ZkbV9tcmMgPSAyMTAsCisJLmF1dG9fY29ycl9tYXhfb2ZkbV94MSA9IDE0MCwKKwkuYXV0b19jb3JyX21heF9vZmRtX21yY194MSA9IDI3MCwKKworCS5hdXRvX2NvcnJfbWluX2NjayA9IDEyNSwKKwkuYXV0b19jb3JyX21heF9jY2sgPSAyMDAsCisJLmF1dG9fY29ycl9taW5fY2NrX21yYyA9IDIwMCwKKwkuYXV0b19jb3JyX21heF9jY2tfbXJjID0gNDAwLAorCisJLm5yZ190aF9jY2sgPSAxMDAsCisJLm5yZ190aF9vZmRtID0gMTAwLAorCisJLmJhcmtlcl9jb3JyX3RoX21pbiA9IDE5MCwKKwkuYmFya2VyX2NvcnJfdGhfbWluX21yYyA9IDM5MCwKKwkubnJnX3RoX2NjYSA9IDYyLAorfTsKKworc3RhdGljIHZvaWQKK2lsNDk2NV9zZXRfY3RfdGhyZXNob2xkKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiB3YW50IEtlbHZpbiAqLworCWlsLT5od19wYXJhbXMuY3Rfa2lsbF90aHJlc2hvbGQgPQorCSAgICBDRUxTSVVTX1RPX0tFTFZJTihDVF9LSUxMX1RIUkVTSE9MRF9MRUdBQ1kpOworfQorCisvKioKKyAqIGlsNDk2NV9od19zZXRfaHdfcGFyYW1zCisgKgorICogQ2FsbGVkIHdoZW4gaW5pdGlhbGl6aW5nIGRyaXZlcgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfaHdfc2V0X2h3X3BhcmFtcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWYgKGlsLT5jZmctPm1vZF9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPj0gSUxfTUlOX05VTV9RVUVVRVMgJiYKKwkgICAgaWwtPmNmZy0+bW9kX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA8PSBJTDQ5X05VTV9RVUVVRVMpCisJCWlsLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID0KKwkJICAgIGlsLT5jZmctPm1vZF9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CisKKwlpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtID0gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CisJaWwtPmh3X3BhcmFtcy5kbWFfY2hubF9udW0gPSBGSDQ5X1RDU1JfQ0hOTF9OVU07CisJaWwtPmh3X3BhcmFtcy5zY2RfYmNfdGJsc19zaXplID0KKwkgICAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgKgorCSAgICBzaXplb2Yoc3RydWN0IGlsNDk2NV9zY2RfYmNfdGJsKTsKKwlpbC0+aHdfcGFyYW1zLnRmZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbF90ZmQpOworCWlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zID0gSUw0OTY1X1NUQVRJT05fQ09VTlQ7CisJaWwtPmN0eC5iY2FzdF9zdGFfaWQgPSBJTDQ5NjVfQlJPQURDQVNUX0lEOworCWlsLT5od19wYXJhbXMubWF4X2RhdGFfc2l6ZSA9IElMNDlfUlRDX0RBVEFfU0laRTsKKwlpbC0+aHdfcGFyYW1zLm1heF9pbnN0X3NpemUgPSBJTDQ5X1JUQ19JTlNUX1NJWkU7CisJaWwtPmh3X3BhcmFtcy5tYXhfYnNtX3NpemUgPSBCU01fU1JBTV9TSVpFOworCWlsLT5od19wYXJhbXMuaHQ0MF9jaGFubmVsID0gQklUKElFRUU4MDIxMV9CQU5EXzVHSFopOworCisJaWwtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZINDlfUlNDU1JfQ0hOTDBfV1BUUjsKKworCWlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bSA9IGlsNDk2NV9udW1fb2ZfYW50KGlsLT5jZmctPnZhbGlkX3R4X2FudCk7CisJaWwtPmh3X3BhcmFtcy5yeF9jaGFpbnNfbnVtID0gaWw0OTY1X251bV9vZl9hbnQoaWwtPmNmZy0+dmFsaWRfcnhfYW50KTsKKwlpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCA9IGlsLT5jZmctPnZhbGlkX3R4X2FudDsKKwlpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudCA9IGlsLT5jZmctPnZhbGlkX3J4X2FudDsKKworCWlsNDk2NV9zZXRfY3RfdGhyZXNob2xkKGlsKTsKKworCWlsLT5od19wYXJhbXMuc2VucyA9ICZpbDQ5NjVfc2Vuc2l0aXZpdHk7CisJaWwtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyA9IElMNDk2NV9FWFRfQkVBQ09OX1RJTUVfUE9TOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIKK2lsNDk2NV9tYXRoX2Rpdl9yb3VuZChzMzIgbnVtLCBzMzIgZGVub20sIHMzMiAqIHJlcykKK3sKKwlzMzIgc2lnbiA9IDE7CisKKwlpZiAobnVtIDwgMCkgeworCQlzaWduID0gLXNpZ247CisJCW51bSA9IC1udW07CisJfQorCWlmIChkZW5vbSA8IDApIHsKKwkJc2lnbiA9IC1zaWduOworCQlkZW5vbSA9IC1kZW5vbTsKKwl9CisJKnJlcyA9IDE7CisJKnJlcyA9ICgobnVtICogMiArIGRlbm9tKSAvIChkZW5vbSAqIDIpKSAqIHNpZ247CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBpbDQ5NjVfZ2V0X3ZvbHRhZ2VfY29tcGVuc2F0aW9uIC0gUG93ZXIgc3VwcGx5IHZvbHRhZ2UgY29tcCBmb3IgdHhwb3dlcgorICoKKyAqIERldGVybWluZXMgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgY29tcGVuc2F0aW9uIGZvciB0eHBvd2VyIGNhbGN1bGF0aW9ucy4KKyAqIFJldHVybnMgbnVtYmVyIG9mIDEvMi1kQiBzdGVwcyB0byBzdWJ0cmFjdCBmcm9tIGdhaW4gdGFibGUgaWR4LAorICogdG8gY29tcGVuc2F0ZSBmb3IgZGlmZmVyZW5jZSBiZXR3ZWVuIHBvd2VyIHN1cHBseSB2b2x0YWdlIGR1cmluZworICogZmFjdG9yeSBtZWFzdXJlbWVudHMsIHZzLiBjdXJyZW50IHBvd2VyIHN1cHBseSB2b2x0YWdlLgorICoKKyAqIFZvbHRhZ2UgaW5kaWNhdGlvbiBpcyBoaWdoZXIgZm9yIGxvd2VyIHZvbHRhZ2UuCisgKiBMb3dlciB2b2x0YWdlIHJlcXVpcmVzIG1vcmUgZ2FpbiAobG93ZXIgZ2FpbiB0YWJsZSBpZHgpLgorICovCitzdGF0aWMgczMyCitpbDQ5NjVfZ2V0X3ZvbHRhZ2VfY29tcGVuc2F0aW9uKHMzMiBlZXByb21fdm9sdGFnZSwgczMyIGN1cnJlbnRfdm9sdGFnZSkKK3sKKwlzMzIgY29tcCA9IDA7CisKKwlpZiAoVFhfUE9XRVJfSUxfSUxMRUdBTF9WT0xUQUdFID09IGVlcHJvbV92b2x0YWdlIHx8CisJICAgIFRYX1BPV0VSX0lMX0lMTEVHQUxfVk9MVEFHRSA9PSBjdXJyZW50X3ZvbHRhZ2UpCisJCXJldHVybiAwOworCisJaWw0OTY1X21hdGhfZGl2X3JvdW5kKGN1cnJlbnRfdm9sdGFnZSAtIGVlcHJvbV92b2x0YWdlLAorCQkJICAgICAgVFhfUE9XRVJfSUxfVk9MVEFHRV9DT0RFU19QRVJfMDNWLCAmY29tcCk7CisKKwlpZiAoY3VycmVudF92b2x0YWdlID4gZWVwcm9tX3ZvbHRhZ2UpCisJCWNvbXAgKj0gMjsKKwlpZiAoKGNvbXAgPCAtMikgfHwgKGNvbXAgPiAyKSkKKwkJY29tcCA9IDA7CisKKwlyZXR1cm4gY29tcDsKK30KKworc3RhdGljIHMzMgoraWw0OTY1X2dldF90eF9hdHRlbl9ncnAodTE2IGNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSUxfVFhfQVRURU5fR1I1X0ZDSCAmJgorCSAgICBjaGFubmVsIDw9IENBTElCX0lMX1RYX0FUVEVOX0dSNV9MQ0gpCisJCXJldHVybiBDQUxJQl9DSF9HUk9VUF81OworCisJaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSUxfVFhfQVRURU5fR1IxX0ZDSCAmJgorCSAgICBjaGFubmVsIDw9IENBTElCX0lMX1RYX0FUVEVOX0dSMV9MQ0gpCisJCXJldHVybiBDQUxJQl9DSF9HUk9VUF8xOworCisJaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSUxfVFhfQVRURU5fR1IyX0ZDSCAmJgorCSAgICBjaGFubmVsIDw9IENBTElCX0lMX1RYX0FUVEVOX0dSMl9MQ0gpCisJCXJldHVybiBDQUxJQl9DSF9HUk9VUF8yOworCisJaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSUxfVFhfQVRURU5fR1IzX0ZDSCAmJgorCSAgICBjaGFubmVsIDw9IENBTElCX0lMX1RYX0FUVEVOX0dSM19MQ0gpCisJCXJldHVybiBDQUxJQl9DSF9HUk9VUF8zOworCisJaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSUxfVFhfQVRURU5fR1I0X0ZDSCAmJgorCSAgICBjaGFubmVsIDw9IENBTElCX0lMX1RYX0FUVEVOX0dSNF9MQ0gpCisJCXJldHVybiBDQUxJQl9DSF9HUk9VUF80OworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB1MzIKK2lsNDk2NV9nZXRfc3ViX2JhbmQoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgY2hhbm5lbCkKK3sKKwlzMzIgYiA9IC0xOworCisJZm9yIChiID0gMDsgYiA8IEVFUFJPTV9UWF9QT1dFUl9CQU5EUzsgYisrKSB7CisJCWlmIChpbC0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW2JdLmNoX2Zyb20gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjaGFubmVsID49IGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bYl0uY2hfZnJvbSAmJgorCQkgICAgY2hhbm5lbCA8PSBpbC0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW2JdLmNoX3RvKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyBzMzIKK2lsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShzMzIgeCwgczMyIHgxLCBzMzIgeTEsIHMzMiB4MiwgczMyIHkyKQoreworCXMzMiB2YWw7CisKKwlpZiAoeDIgPT0geDEpCisJCXJldHVybiB5MTsKKwllbHNlIHsKKwkJaWw0OTY1X21hdGhfZGl2X3JvdW5kKCh4MiAtIHgpICogKHkxIC0geTIpLCAoeDIgLSB4MSksICZ2YWwpOworCQlyZXR1cm4gdmFsICsgeTI7CisJfQorfQorCisvKioKKyAqIGlsNDk2NV9pbnRlcnBvbGF0ZV9jaGFuIC0gSW50ZXJwb2xhdGUgZmFjdG9yeSBtZWFzdXJlbWVudHMgZm9yIG9uZSBjaGFubmVsCisgKgorICogSW50ZXJwb2xhdGVzIGZhY3RvcnkgbWVhc3VyZW1lbnRzIGZyb20gdGhlIHR3byBzYW1wbGUgY2hhbm5lbHMgd2l0aGluIGEKKyAqIHN1Yi1iYW5kLCB0byBhcHBseSB0byBjaGFubmVsIG9mIGludGVyZXN0LiAgSW50ZXJwb2xhdGlvbiBpcyBwcm9wb3J0aW9uYWwgdG8KKyAqIGRpZmZlcmVuY2VzIGluIGNoYW5uZWwgZnJlcXVlbmNpZXMsIHdoaWNoIGlzIHByb3BvcnRpb25hbCB0byBkaWZmZXJlbmNlcworICogaW4gY2hhbm5lbCBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9pbnRlcnBvbGF0ZV9jaGFuKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIGNoYW5uZWwsCisJCQlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2NoX2luZm8gKmNoYW5faW5mbykKK3sKKwlzMzIgcyA9IC0xOworCXUzMiBjOworCXUzMiBtOworCWNvbnN0IHN0cnVjdCBpbF9lZXByb21fY2FsaWJfbWVhc3VyZSAqbTE7CisJY29uc3Qgc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptMjsKKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX21lYXN1cmUgKm9tZWFzOworCXUzMiBjaF9pMTsKKwl1MzIgY2hfaTI7CisKKwlzID0gaWw0OTY1X2dldF9zdWJfYmFuZChpbCwgY2hhbm5lbCk7CisJaWYgKHMgPj0gRUVQUk9NX1RYX1BPV0VSX0JBTkRTKSB7CisJCUlMX0VSUigiVHggUG93ZXIgY2FuIG5vdCBmaW5kIGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hfaTEgPSBpbC0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW3NdLmNoMS5jaF9udW07CisJY2hfaTIgPSBpbC0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW3NdLmNoMi5jaF9udW07CisJY2hhbl9pbmZvLT5jaF9udW0gPSAodTgpIGNoYW5uZWw7CisKKwlEX1RYUE9XRVIoImNoYW5uZWwgJWQgc3ViYmFuZCAlZCBmYWN0b3J5IGNhbCBjaCAlZCAmICVkXG4iLCBjaGFubmVsLCBzLAorCQkgIGNoX2kxLCBjaF9pMik7CisKKwlmb3IgKGMgPSAwOyBjIDwgRUVQUk9NX1RYX1BPV0VSX1RYX0NIQUlOUzsgYysrKSB7CisJCWZvciAobSA9IDA7IG0gPCBFRVBST01fVFhfUE9XRVJfTUVBU1VSRU1FTlRTOyBtKyspIHsKKwkJCW0xID0gJihpbC0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW3NdLmNoMS4KKwkJCSAgICAgICBtZWFzdXJlbWVudHNbY11bbV0pOworCQkJbTIgPSAmKGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gyLgorCQkJICAgICAgIG1lYXN1cmVtZW50c1tjXVttXSk7CisJCQlvbWVhcyA9ICYoY2hhbl9pbmZvLT5tZWFzdXJlbWVudHNbY11bbV0pOworCisJCQlvbWVhcy0+YWN0dWFsX3BvdyA9CisJCQkgICAgKHU4KSBpbDQ5NjVfaW50ZXJwb2xhdGVfdmFsdWUoY2hhbm5lbCwgY2hfaTEsCisJCQkJCQkJICBtMS0+YWN0dWFsX3BvdywgY2hfaTIsCisJCQkJCQkJICBtMi0+YWN0dWFsX3Bvdyk7CisJCQlvbWVhcy0+Z2Fpbl9pZHggPQorCQkJICAgICh1OCkgaWw0OTY1X2ludGVycG9sYXRlX3ZhbHVlKGNoYW5uZWwsIGNoX2kxLAorCQkJCQkJCSAgbTEtPmdhaW5faWR4LCBjaF9pMiwKKwkJCQkJCQkgIG0yLT5nYWluX2lkeCk7CisJCQlvbWVhcy0+dGVtcGVyYXR1cmUgPQorCQkJICAgICh1OCkgaWw0OTY1X2ludGVycG9sYXRlX3ZhbHVlKGNoYW5uZWwsIGNoX2kxLAorCQkJCQkJCSAgbTEtPnRlbXBlcmF0dXJlLAorCQkJCQkJCSAgY2hfaTIsCisJCQkJCQkJICBtMi0+dGVtcGVyYXR1cmUpOworCQkJb21lYXMtPnBhX2RldCA9CisJCQkgICAgKHM4KSBpbDQ5NjVfaW50ZXJwb2xhdGVfdmFsdWUoY2hhbm5lbCwgY2hfaTEsCisJCQkJCQkJICBtMS0+cGFfZGV0LCBjaF9pMiwKKwkJCQkJCQkgIG0yLT5wYV9kZXQpOworCisJCQlEX1RYUE9XRVIoImNoYWluICVkIG1lYXMgJWQgQVAxPSVkIEFQMj0lZCBBUD0lZFxuIiwgYywKKwkJCQkgIG0sIG0xLT5hY3R1YWxfcG93LCBtMi0+YWN0dWFsX3BvdywKKwkJCQkgIG9tZWFzLT5hY3R1YWxfcG93KTsKKwkJCURfVFhQT1dFUigiY2hhaW4gJWQgbWVhcyAlZCBOSTE9JWQgTkkyPSVkIE5JPSVkXG4iLCBjLAorCQkJCSAgbSwgbTEtPmdhaW5faWR4LCBtMi0+Z2Fpbl9pZHgsCisJCQkJICBvbWVhcy0+Z2Fpbl9pZHgpOworCQkJRF9UWFBPV0VSKCJjaGFpbiAlZCBtZWFzICVkIFBBMT0lZCBQQTI9JWQgUEE9JWRcbiIsIGMsCisJCQkJICBtLCBtMS0+cGFfZGV0LCBtMi0+cGFfZGV0LCBvbWVhcy0+cGFfZGV0KTsKKwkJCURfVFhQT1dFUigiY2hhaW4gJWQgbWVhcyAlZCAgVDE9JWQgIFQyPSVkICBUPSVkXG4iLCBjLAorCQkJCSAgbSwgbTEtPnRlbXBlcmF0dXJlLCBtMi0+dGVtcGVyYXR1cmUsCisJCQkJICBvbWVhcy0+dGVtcGVyYXR1cmUpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGJpdC1yYXRlLWRlcGVuZGVudCB0YWJsZSB0byBwcmV2ZW50IFR4IGRpc3RvcnRpb24sIGluIGhhbGYtZEIgdW5pdHMsCisgKiBmb3IgT0ZETSA2LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA2MCBNQml0LCBhbmQgQ0NLIGFsbCByYXRlcy4gKi8KK3N0YXRpYyBzMzIgYmFja19vZmZfdGFibGVbXSA9IHsKKwkxMCwgMTAsIDEwLCAxMCwgMTAsIDE1LCAxNywgMjAsCS8qIE9GRE0gU0lTTyAyMCBNSHogKi8KKwkxMCwgMTAsIDEwLCAxMCwgMTAsIDE1LCAxNywgMjAsCS8qIE9GRE0gTUlNTyAyMCBNSHogKi8KKwkxMCwgMTAsIDEwLCAxMCwgMTAsIDE1LCAxNywgMjAsCS8qIE9GRE0gU0lTTyA0MCBNSHogKi8KKwkxMCwgMTAsIDEwLCAxMCwgMTAsIDE1LCAxNywgMjAsCS8qIE9GRE0gTUlNTyA0MCBNSHogKi8KKwkxMAkJCS8qIENDSyAqLworfTsKKworLyogVGhlcm1hbCBjb21wZW5zYXRpb24gdmFsdWVzIGZvciB0eHBvd2VyIGZvciB2YXJpb3VzIGZyZXF1ZW5jeSByYW5nZXMgLi4uCisgKiAgIHJhdGlvcyBmcm9tIDM6MSB0byA0LjU6MSBvZiBkZWdyZWVzIChDZWxzaXVzKSBwZXIgaGFsZi1kQiBnYWluIGFkanVzdCAqLworc3RhdGljIHN0cnVjdCBpbDQ5NjVfdHhwb3dlcl9jb21wX2VudHJ5IHsKKwlzMzIgZGVncmVlc19wZXJfMDVkYl9hOworCXMzMiBkZWdyZWVzX3Blcl8wNWRiX2FfZGVub207Cit9IHR4X3Bvd2VyX2NtcF90YmxlW0NBTElCX0NIX0dST1VQX01BWF0gPSB7CisJeworCTksIDJ9LAkJCS8qIGdyb3VwIDAgNS4yLCBjaCAgMzQtNDMgKi8KKwl7CisJNCwgMX0sCQkJLyogZ3JvdXAgMSA1LjIsIGNoICA0NC03MCAqLworCXsKKwk0LCAxfSwJCQkvKiBncm91cCAyIDUuMiwgY2ggIDcxLTEyNCAqLworCXsKKwk0LCAxfSwJCQkvKiBncm91cCAzIDUuMiwgY2ggMTI1LTIwMCAqLworCXsKKwkzLCAxfQkJCS8qIGdyb3VwIDQgMi40LCBjaCAgIGFsbCAqLworfTsKKworc3RhdGljIHMzMgorZ2V0X21pbl9wb3dlcl9pZHgoczMyIHJhdGVfcG93ZXJfaWR4LCB1MzIgYmFuZCkKK3sKKwlpZiAoIWJhbmQpIHsKKwkJaWYgKChyYXRlX3Bvd2VyX2lkeCAmIDcpIDw9IDQpCisJCQlyZXR1cm4gTUlOX1RYX0dBSU5fSURYXzUyR0haX0VYVDsKKwl9CisJcmV0dXJuIE1JTl9UWF9HQUlOX0lEWDsKK30KKworc3RydWN0IGdhaW5fZW50cnkgeworCXU4IGRzcDsKKwl1OCByYWRpbzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2Fpbl9lbnRyeSBnYWluX3RhYmxlWzJdWzEwOF0gPSB7CisJLyogNS4yR0h6IHBvd2VyIGdhaW4gaWR4IHRhYmxlICovCisJeworCSB7MTIzLCAweDNGfSwJCS8qIGhpZ2hlc3QgdHhwb3dlciAqLworCSB7MTE3LCAweDNGfSwKKwkgezExMCwgMHgzRn0sCisJIHsxMDQsIDB4M0Z9LAorCSB7OTgsIDB4M0Z9LAorCSB7MTEwLCAweDNFfSwKKwkgezEwNCwgMHgzRX0sCisJIHs5OCwgMHgzRX0sCisJIHsxMTAsIDB4M0R9LAorCSB7MTA0LCAweDNEfSwKKwkgezk4LCAweDNEfSwKKwkgezExMCwgMHgzQ30sCisJIHsxMDQsIDB4M0N9LAorCSB7OTgsIDB4M0N9LAorCSB7MTEwLCAweDNCfSwKKwkgezEwNCwgMHgzQn0sCisJIHs5OCwgMHgzQn0sCisJIHsxMTAsIDB4M0F9LAorCSB7MTA0LCAweDNBfSwKKwkgezk4LCAweDNBfSwKKwkgezExMCwgMHgzOX0sCisJIHsxMDQsIDB4Mzl9LAorCSB7OTgsIDB4Mzl9LAorCSB7MTEwLCAweDM4fSwKKwkgezEwNCwgMHgzOH0sCisJIHs5OCwgMHgzOH0sCisJIHsxMTAsIDB4Mzd9LAorCSB7MTA0LCAweDM3fSwKKwkgezk4LCAweDM3fSwKKwkgezExMCwgMHgzNn0sCisJIHsxMDQsIDB4MzZ9LAorCSB7OTgsIDB4MzZ9LAorCSB7MTEwLCAweDM1fSwKKwkgezEwNCwgMHgzNX0sCisJIHs5OCwgMHgzNX0sCisJIHsxMTAsIDB4MzR9LAorCSB7MTA0LCAweDM0fSwKKwkgezk4LCAweDM0fSwKKwkgezExMCwgMHgzM30sCisJIHsxMDQsIDB4MzN9LAorCSB7OTgsIDB4MzN9LAorCSB7MTEwLCAweDMyfSwKKwkgezEwNCwgMHgzMn0sCisJIHs5OCwgMHgzMn0sCisJIHsxMTAsIDB4MzF9LAorCSB7MTA0LCAweDMxfSwKKwkgezk4LCAweDMxfSwKKwkgezExMCwgMHgzMH0sCisJIHsxMDQsIDB4MzB9LAorCSB7OTgsIDB4MzB9LAorCSB7MTEwLCAweDI1fSwKKwkgezEwNCwgMHgyNX0sCisJIHs5OCwgMHgyNX0sCisJIHsxMTAsIDB4MjR9LAorCSB7MTA0LCAweDI0fSwKKwkgezk4LCAweDI0fSwKKwkgezExMCwgMHgyM30sCisJIHsxMDQsIDB4MjN9LAorCSB7OTgsIDB4MjN9LAorCSB7MTEwLCAweDIyfSwKKwkgezEwNCwgMHgxOH0sCisJIHs5OCwgMHgxOH0sCisJIHsxMTAsIDB4MTd9LAorCSB7MTA0LCAweDE3fSwKKwkgezk4LCAweDE3fSwKKwkgezExMCwgMHgxNn0sCisJIHsxMDQsIDB4MTZ9LAorCSB7OTgsIDB4MTZ9LAorCSB7MTEwLCAweDE1fSwKKwkgezEwNCwgMHgxNX0sCisJIHs5OCwgMHgxNX0sCisJIHsxMTAsIDB4MTR9LAorCSB7MTA0LCAweDE0fSwKKwkgezk4LCAweDE0fSwKKwkgezExMCwgMHgxM30sCisJIHsxMDQsIDB4MTN9LAorCSB7OTgsIDB4MTN9LAorCSB7MTEwLCAweDEyfSwKKwkgezEwNCwgMHgwOH0sCisJIHs5OCwgMHgwOH0sCisJIHsxMTAsIDB4MDd9LAorCSB7MTA0LCAweDA3fSwKKwkgezk4LCAweDA3fSwKKwkgezExMCwgMHgwNn0sCisJIHsxMDQsIDB4MDZ9LAorCSB7OTgsIDB4MDZ9LAorCSB7MTEwLCAweDA1fSwKKwkgezEwNCwgMHgwNX0sCisJIHs5OCwgMHgwNX0sCisJIHsxMTAsIDB4MDR9LAorCSB7MTA0LCAweDA0fSwKKwkgezk4LCAweDA0fSwKKwkgezExMCwgMHgwM30sCisJIHsxMDQsIDB4MDN9LAorCSB7OTgsIDB4MDN9LAorCSB7MTEwLCAweDAyfSwKKwkgezEwNCwgMHgwMn0sCisJIHs5OCwgMHgwMn0sCisJIHsxMTAsIDB4MDF9LAorCSB7MTA0LCAweDAxfSwKKwkgezk4LCAweDAxfSwKKwkgezExMCwgMHgwMH0sCisJIHsxMDQsIDB4MDB9LAorCSB7OTgsIDB4MDB9LAorCSB7OTMsIDB4MDB9LAorCSB7ODgsIDB4MDB9LAorCSB7ODMsIDB4MDB9LAorCSB7NzgsIDB4MDB9LAorCSB9LAorCS8qIDIuNEdIeiBwb3dlciBnYWluIGlkeCB0YWJsZSAqLworCXsKKwkgezExMCwgMHgzZn0sCQkvKiBoaWdoZXN0IHR4cG93ZXIgKi8KKwkgezEwNCwgMHgzZn0sCisJIHs5OCwgMHgzZn0sCisJIHsxMTAsIDB4M2V9LAorCSB7MTA0LCAweDNlfSwKKwkgezk4LCAweDNlfSwKKwkgezExMCwgMHgzZH0sCisJIHsxMDQsIDB4M2R9LAorCSB7OTgsIDB4M2R9LAorCSB7MTEwLCAweDNjfSwKKwkgezEwNCwgMHgzY30sCisJIHs5OCwgMHgzY30sCisJIHsxMTAsIDB4M2J9LAorCSB7MTA0LCAweDNifSwKKwkgezk4LCAweDNifSwKKwkgezExMCwgMHgzYX0sCisJIHsxMDQsIDB4M2F9LAorCSB7OTgsIDB4M2F9LAorCSB7MTEwLCAweDM5fSwKKwkgezEwNCwgMHgzOX0sCisJIHs5OCwgMHgzOX0sCisJIHsxMTAsIDB4Mzh9LAorCSB7MTA0LCAweDM4fSwKKwkgezk4LCAweDM4fSwKKwkgezExMCwgMHgzN30sCisJIHsxMDQsIDB4Mzd9LAorCSB7OTgsIDB4Mzd9LAorCSB7MTEwLCAweDM2fSwKKwkgezEwNCwgMHgzNn0sCisJIHs5OCwgMHgzNn0sCisJIHsxMTAsIDB4MzV9LAorCSB7MTA0LCAweDM1fSwKKwkgezk4LCAweDM1fSwKKwkgezExMCwgMHgzNH0sCisJIHsxMDQsIDB4MzR9LAorCSB7OTgsIDB4MzR9LAorCSB7MTEwLCAweDMzfSwKKwkgezEwNCwgMHgzM30sCisJIHs5OCwgMHgzM30sCisJIHsxMTAsIDB4MzJ9LAorCSB7MTA0LCAweDMyfSwKKwkgezk4LCAweDMyfSwKKwkgezExMCwgMHgzMX0sCisJIHsxMDQsIDB4MzF9LAorCSB7OTgsIDB4MzF9LAorCSB7MTEwLCAweDMwfSwKKwkgezEwNCwgMHgzMH0sCisJIHs5OCwgMHgzMH0sCisJIHsxMTAsIDB4Nn0sCisJIHsxMDQsIDB4Nn0sCisJIHs5OCwgMHg2fSwKKwkgezExMCwgMHg1fSwKKwkgezEwNCwgMHg1fSwKKwkgezk4LCAweDV9LAorCSB7MTEwLCAweDR9LAorCSB7MTA0LCAweDR9LAorCSB7OTgsIDB4NH0sCisJIHsxMTAsIDB4M30sCisJIHsxMDQsIDB4M30sCisJIHs5OCwgMHgzfSwKKwkgezExMCwgMHgyfSwKKwkgezEwNCwgMHgyfSwKKwkgezk4LCAweDJ9LAorCSB7MTEwLCAweDF9LAorCSB7MTA0LCAweDF9LAorCSB7OTgsIDB4MX0sCisJIHsxMTAsIDB4MH0sCisJIHsxMDQsIDB4MH0sCisJIHs5OCwgMHgwfSwKKwkgezk3LCAwfSwKKwkgezk2LCAwfSwKKwkgezk1LCAwfSwKKwkgezk0LCAwfSwKKwkgezkzLCAwfSwKKwkgezkyLCAwfSwKKwkgezkxLCAwfSwKKwkgezkwLCAwfSwKKwkgezg5LCAwfSwKKwkgezg4LCAwfSwKKwkgezg3LCAwfSwKKwkgezg2LCAwfSwKKwkgezg1LCAwfSwKKwkgezg0LCAwfSwKKwkgezgzLCAwfSwKKwkgezgyLCAwfSwKKwkgezgxLCAwfSwKKwkgezgwLCAwfSwKKwkgezc5LCAwfSwKKwkgezc4LCAwfSwKKwkgezc3LCAwfSwKKwkgezc2LCAwfSwKKwkgezc1LCAwfSwKKwkgezc0LCAwfSwKKwkgezczLCAwfSwKKwkgezcyLCAwfSwKKwkgezcxLCAwfSwKKwkgezcwLCAwfSwKKwkgezY5LCAwfSwKKwkgezY4LCAwfSwKKwkgezY3LCAwfSwKKwkgezY2LCAwfSwKKwkgezY1LCAwfSwKKwkgezY0LCAwfSwKKwkgezYzLCAwfSwKKwkgezYyLCAwfSwKKwkgezYxLCAwfSwKKwkgezYwLCAwfSwKKwkgezU5LCAwfSwKKwkgfQorfTsKKworc3RhdGljIGludAoraWw0OTY1X2ZpbGxfdHhwb3dlcl90Ymwoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBiYW5kLCB1MTYgY2hhbm5lbCwgdTggaXNfaHQ0MCwKKwkJCXU4IGN0cmxfY2hhbl9oaWdoLAorCQkJc3RydWN0IGlsNDk2NV90eF9wb3dlcl9kYiAqdHhfcG93ZXJfdGJsKQoreworCXU4IHNhdHVyYXRpb25fcG93ZXI7CisJczMyIHRhcmdldF9wb3dlcjsKKwlzMzIgdXNlcl90YXJnZXRfcG93ZXI7CisJczMyIHBvd2VyX2xpbWl0OworCXMzMiBjdXJyZW50X3RlbXA7CisJczMyIHJlZ19saW1pdDsKKwlzMzIgY3VycmVudF9yZWd1bGF0b3J5OworCXMzMiB0eGF0dGVuX2dycCA9IENBTElCX0NIX0dST1VQX01BWDsKKwlpbnQgaTsKKwlpbnQgYzsKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2NoX2luZm8gY2hfZWVwcm9tX2luZm87CisJY29uc3Qgc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptZWFzdXJlbWVudDsKKwlzMTYgdm9sdGFnZTsKKwlzMzIgaW5pdF92b2x0YWdlOworCXMzMiB2b2x0YWdlX2NvbXBlbnNhdGlvbjsKKwlzMzIgZGVncmVlc19wZXJfMDVkYl9udW07CisJczMyIGRlZ3JlZXNfcGVyXzA1ZGJfZGVub207CisJczMyIGZhY3RvcnlfdGVtcDsKKwlzMzIgdGVtcGVyYXR1cmVfY29tcFsyXTsKKwlzMzIgZmFjdG9yeV9nYWluX2lkeFsyXTsKKwlzMzIgZmFjdG9yeV9hY3R1YWxfcHdyWzJdOworCXMzMiBwb3dlcl9pZHg7CisKKwkvKiB0eF9wb3dlcl91c2VyX2xtdCBpcyBpbiBkQm0sIGNvbnZlcnQgdG8gaGFsZi1kQm0gKGhhbGYtZEIgdW5pdHMKKwkgKiAgIGFyZSB1c2VkIGZvciBpZHhpbmcgaW50byB0eHBvd2VyIHRhYmxlKSAqLworCXVzZXJfdGFyZ2V0X3Bvd2VyID0gMiAqIGlsLT50eF9wb3dlcl91c2VyX2xtdDsKKworCS8qIEdldCBjdXJyZW50IChSWE9OKSBjaGFubmVsLCBiYW5kLCB3aWR0aCAqLworCURfVFhQT1dFUigiY2hhbiAlZCBiYW5kICVkIGlzX2h0NDAgJWRcbiIsIGNoYW5uZWwsIGJhbmQsIGlzX2h0NDApOworCisJY2hfaW5mbyA9IGlsX2dldF9jaGFubmVsX2luZm8oaWwsIGlsLT5iYW5kLCBjaGFubmVsKTsKKworCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBnZXQgdHhhdHRlbiBncm91cCwgdXNlZCB0byBzZWxlY3QgMSkgdGhlcm1hbCB0eHBvd2VyIGFkanVzdG1lbnQKKwkgKiAgIGFuZCAyKSBtaW1vIHR4cG93ZXIgYmFsYW5jZSBiZXR3ZWVuIFR4IGNoYWlucy4gKi8KKwl0eGF0dGVuX2dycCA9IGlsNDk2NV9nZXRfdHhfYXR0ZW5fZ3JwKGNoYW5uZWwpOworCWlmICh0eGF0dGVuX2dycCA8IDApIHsKKwkJSUxfRVJSKCJDYW4ndCBmaW5kIHR4YXR0ZW4gZ3JvdXAgZm9yIGNoYW5uZWwgJWQuXG4iLCBjaGFubmVsKTsKKwkJcmV0dXJuIHR4YXR0ZW5fZ3JwOworCX0KKworCURfVFhQT1dFUigiY2hhbm5lbCAlZCBiZWxvbmdzIHRvIHR4YXR0ZW4gZ3JvdXAgJWRcbiIsIGNoYW5uZWwsCisJCSAgdHhhdHRlbl9ncnApOworCisJaWYgKGlzX2h0NDApIHsKKwkJaWYgKGN0cmxfY2hhbl9oaWdoKQorCQkJY2hhbm5lbCAtPSAyOworCQllbHNlCisJCQljaGFubmVsICs9IDI7CisJfQorCisJLyogaGFyZHdhcmUgdHhwb3dlciBsaW1pdHMgLi4uCisJICogc2F0dXJhdGlvbiAoY2xpcHBpbmcgZGlzdG9ydGlvbikgdHhwb3dlcnMgYXJlIGluIGhhbGYtZEJtICovCisJaWYgKGJhbmQpCisJCXNhdHVyYXRpb25fcG93ZXIgPSBpbC0+Y2FsaWJfaW5mby0+c2F0dXJhdGlvbl9wb3dlcjI0OworCWVsc2UKKwkJc2F0dXJhdGlvbl9wb3dlciA9IGlsLT5jYWxpYl9pbmZvLT5zYXR1cmF0aW9uX3Bvd2VyNTI7CisKKwlpZiAoc2F0dXJhdGlvbl9wb3dlciA8IElMX1RYX1BPV0VSX1NBVFVSQVRJT05fTUlOIHx8CisJICAgIHNhdHVyYXRpb25fcG93ZXIgPiBJTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01BWCkgeworCQlpZiAoYmFuZCkKKwkJCXNhdHVyYXRpb25fcG93ZXIgPSBJTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fMjQ7CisJCWVsc2UKKwkJCXNhdHVyYXRpb25fcG93ZXIgPSBJTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fNTI7CisJfQorCisJLyogcmVndWxhdG9yeSB0eHBvd2VyIGxpbWl0cyAuLi4gcmVnX2xpbWl0IHZhbHVlcyBhcmUgaW4gaGFsZi1kQm0sCisJICogICBtYXhfcG93ZXJfYXZnIHZhbHVlcyBhcmUgaW4gZEJtLCBjb252ZXJ0ICogMiAqLworCWlmIChpc19odDQwKQorCQlyZWdfbGltaXQgPSBjaF9pbmZvLT5odDQwX21heF9wb3dlcl9hdmcgKiAyOworCWVsc2UKKwkJcmVnX2xpbWl0ID0gY2hfaW5mby0+bWF4X3Bvd2VyX2F2ZyAqIDI7CisKKwlpZiAoKHJlZ19saW1pdCA8IElMX1RYX1BPV0VSX1JFR1VMQVRPUllfTUlOKSB8fAorCSAgICAocmVnX2xpbWl0ID4gSUxfVFhfUE9XRVJfUkVHVUxBVE9SWV9NQVgpKSB7CisJCWlmIChiYW5kKQorCQkJcmVnX2xpbWl0ID0gSUxfVFhfUE9XRVJfREVGQVVMVF9SRUdVTEFUT1JZXzI0OworCQllbHNlCisJCQlyZWdfbGltaXQgPSBJTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfNTI7CisJfQorCisJLyogSW50ZXJwb2xhdGUgdHhwb3dlciBjYWxpYnJhdGlvbiB2YWx1ZXMgZm9yIHRoaXMgY2hhbm5lbCwKKwkgKiAgIGJhc2VkIG9uIGZhY3RvcnkgY2FsaWJyYXRpb24gdGVzdHMgb24gc3BhY2VkIGNoYW5uZWxzLiAqLworCWlsNDk2NV9pbnRlcnBvbGF0ZV9jaGFuKGlsLCBjaGFubmVsLCAmY2hfZWVwcm9tX2luZm8pOworCisJLyogY2FsY3VsYXRlIHR4IGdhaW4gYWRqdXN0bWVudCBiYXNlZCBvbiBwb3dlciBzdXBwbHkgdm9sdGFnZSAqLworCXZvbHRhZ2UgPSBsZTE2X3RvX2NwdShpbC0+Y2FsaWJfaW5mby0+dm9sdGFnZSk7CisJaW5pdF92b2x0YWdlID0gKHMzMikgbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmVfaW5pdC52b2x0YWdlKTsKKwl2b2x0YWdlX2NvbXBlbnNhdGlvbiA9CisJICAgIGlsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24odm9sdGFnZSwgaW5pdF92b2x0YWdlKTsKKworCURfVFhQT1dFUigiY3VyciB2b2x0ICVkIGVlcHJvbSB2b2x0ICVkIHZvbHQgY29tcCAlZFxuIiwgaW5pdF92b2x0YWdlLAorCQkgIHZvbHRhZ2UsIHZvbHRhZ2VfY29tcGVuc2F0aW9uKTsKKworCS8qIGdldCBjdXJyZW50IHRlbXBlcmF0dXJlIChDZWxzaXVzKSAqLworCWN1cnJlbnRfdGVtcCA9IG1heChpbC0+dGVtcGVyYXR1cmUsIElMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01JTik7CisJY3VycmVudF90ZW1wID0gbWluKGlsLT50ZW1wZXJhdHVyZSwgSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUFYKTsKKwljdXJyZW50X3RlbXAgPSBLRUxWSU5fVE9fQ0VMU0lVUyhjdXJyZW50X3RlbXApOworCisJLyogc2VsZWN0IHRoZXJtYWwgdHhwb3dlciBhZGp1c3RtZW50IHBhcmFtcywgYmFzZWQgb24gY2hhbm5lbCBncm91cAorCSAqICAgKHNhbWUgZnJlcXVlbmN5IGdyb3VwIHVzZWQgZm9yIG1pbW8gdHhhdHRlbiBhZGp1c3RtZW50KSAqLworCWRlZ3JlZXNfcGVyXzA1ZGJfbnVtID0KKwkgICAgdHhfcG93ZXJfY21wX3RibGVbdHhhdHRlbl9ncnBdLmRlZ3JlZXNfcGVyXzA1ZGJfYTsKKwlkZWdyZWVzX3Blcl8wNWRiX2Rlbm9tID0KKwkgICAgdHhfcG93ZXJfY21wX3RibGVbdHhhdHRlbl9ncnBdLmRlZ3JlZXNfcGVyXzA1ZGJfYV9kZW5vbTsKKworCS8qIGdldCBwZXItY2hhaW4gdHhwb3dlciB2YWx1ZXMgZnJvbSBmYWN0b3J5IG1lYXN1cmVtZW50cyAqLworCWZvciAoYyA9IDA7IGMgPCAyOyBjKyspIHsKKwkJbWVhc3VyZW1lbnQgPSAmY2hfZWVwcm9tX2luZm8ubWVhc3VyZW1lbnRzW2NdWzFdOworCisJCS8qIHR4Z2FpbiBhZGp1c3RtZW50IChpbiBoYWxmLWRCIHN0ZXBzKSBiYXNlZCBvbiBkaWZmZXJlbmNlCisJCSAqICAgYmV0d2VlbiBmYWN0b3J5IGFuZCBjdXJyZW50IHRlbXBlcmF0dXJlICovCisJCWZhY3RvcnlfdGVtcCA9IG1lYXN1cmVtZW50LT50ZW1wZXJhdHVyZTsKKwkJaWw0OTY1X21hdGhfZGl2X3JvdW5kKChjdXJyZW50X3RlbXAgLQorCQkJCSAgICAgICBmYWN0b3J5X3RlbXApICogZGVncmVlc19wZXJfMDVkYl9kZW5vbSwKKwkJCQkgICAgICBkZWdyZWVzX3Blcl8wNWRiX251bSwKKwkJCQkgICAgICAmdGVtcGVyYXR1cmVfY29tcFtjXSk7CisKKwkJZmFjdG9yeV9nYWluX2lkeFtjXSA9IG1lYXN1cmVtZW50LT5nYWluX2lkeDsKKwkJZmFjdG9yeV9hY3R1YWxfcHdyW2NdID0gbWVhc3VyZW1lbnQtPmFjdHVhbF9wb3c7CisKKwkJRF9UWFBPV0VSKCJjaGFpbiA9ICVkXG4iLCBjKTsKKwkJRF9UWFBPV0VSKCJmY3RyeSB0bXAgJWQsICIgImN1cnIgdG1wICVkLCBjb21wICVkIHN0ZXBzXG4iLAorCQkJICBmYWN0b3J5X3RlbXAsIGN1cnJlbnRfdGVtcCwgdGVtcGVyYXR1cmVfY29tcFtjXSk7CisKKwkJRF9UWFBPV0VSKCJmY3RyeSBpZHggJWQsIGZjdHJ5IHB3ciAlZFxuIiwgZmFjdG9yeV9nYWluX2lkeFtjXSwKKwkJCSAgZmFjdG9yeV9hY3R1YWxfcHdyW2NdKTsKKwl9CisKKwkvKiBmb3IgZWFjaCBvZiAzMyBiaXQtcmF0ZXMgKGluY2x1ZGluZyAxIGZvciBDQ0spICovCisJZm9yIChpID0gMDsgaSA8IFBPV0VSX1RCTF9OVU1fRU5UUklFUzsgaSsrKSB7CisJCXU4IGlzX21pbW9fcmF0ZTsKKwkJdW5pb24gaWw0OTY1X3R4X3Bvd2VyX2R1YWxfc3RyZWFtIHR4X3Bvd2VyOworCisJCS8qIGZvciBtaW1vLCByZWR1Y2UgZWFjaCBjaGFpbidzIHR4cG93ZXIgYnkgaGFsZgorCQkgKiAoM2RCLCA2IHN0ZXBzKSwgc28gdG90YWwgb3V0cHV0IHBvd2VyIGlzIHJlZ3VsYXRvcnkKKwkJICogY29tcGxpYW50LiAqLworCQlpZiAoaSAmIDB4OCkgeworCQkJY3VycmVudF9yZWd1bGF0b3J5ID0KKwkJCSAgICByZWdfbGltaXQgLQorCQkJICAgIElMX1RYX1BPV0VSX01JTU9fUkVHVUxBVE9SWV9DT01QRU5TQVRJT047CisJCQlpc19taW1vX3JhdGUgPSAxOworCQl9IGVsc2UgeworCQkJY3VycmVudF9yZWd1bGF0b3J5ID0gcmVnX2xpbWl0OworCQkJaXNfbWltb19yYXRlID0gMDsKKwkJfQorCisJCS8qIGZpbmQgdHhwb3dlciBsaW1pdCwgZWl0aGVyIGhhcmR3YXJlIG9yIHJlZ3VsYXRvcnkgKi8KKwkJcG93ZXJfbGltaXQgPSBzYXR1cmF0aW9uX3Bvd2VyIC0gYmFja19vZmZfdGFibGVbaV07CisJCWlmIChwb3dlcl9saW1pdCA+IGN1cnJlbnRfcmVndWxhdG9yeSkKKwkJCXBvd2VyX2xpbWl0ID0gY3VycmVudF9yZWd1bGF0b3J5OworCisJCS8qIHJlZHVjZSB1c2VyJ3MgdHhwb3dlciByZXF1ZXN0IGlmIG5lY2Vzc2FyeQorCQkgKiBmb3IgdGhpcyByYXRlIG9uIHRoaXMgY2hhbm5lbCAqLworCQl0YXJnZXRfcG93ZXIgPSB1c2VyX3RhcmdldF9wb3dlcjsKKwkJaWYgKHRhcmdldF9wb3dlciA+IHBvd2VyX2xpbWl0KQorCQkJdGFyZ2V0X3Bvd2VyID0gcG93ZXJfbGltaXQ7CisKKwkJRF9UWFBPV0VSKCJyYXRlICVkIHNhdCAlZCByZWcgJWQgdXNyICVkIHRndCAlZFxuIiwgaSwKKwkJCSAgc2F0dXJhdGlvbl9wb3dlciAtIGJhY2tfb2ZmX3RhYmxlW2ldLAorCQkJICBjdXJyZW50X3JlZ3VsYXRvcnksIHVzZXJfdGFyZ2V0X3Bvd2VyLCB0YXJnZXRfcG93ZXIpOworCisJCS8qIGZvciBlYWNoIG9mIDIgVHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlcnMpICovCisJCWZvciAoYyA9IDA7IGMgPCAyOyBjKyspIHsKKwkJCXMzMiBhdHRlbl92YWx1ZTsKKworCQkJaWYgKGlzX21pbW9fcmF0ZSkKKwkJCQlhdHRlbl92YWx1ZSA9CisJCQkJICAgIChzMzIpIGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQuCisJCQkJCQkgICAgICB0eF9hdHRlblt0eGF0dGVuX2dycF1bY10pOworCQkJZWxzZQorCQkJCWF0dGVuX3ZhbHVlID0gMDsKKworCQkJLyogY2FsY3VsYXRlIGlkeDsgaGlnaGVyIGlkeCBtZWFucyBsb3dlciB0eHBvd2VyICovCisJCQlwb3dlcl9pZHggPQorCQkJICAgICh1OCkgKGZhY3RvcnlfZ2Fpbl9pZHhbY10gLQorCQkJCSAgKHRhcmdldF9wb3dlciAtIGZhY3RvcnlfYWN0dWFsX3B3cltjXSkgLQorCQkJCSAgdGVtcGVyYXR1cmVfY29tcFtjXSAtIHZvbHRhZ2VfY29tcGVuc2F0aW9uICsKKwkJCQkgIGF0dGVuX3ZhbHVlKTsKKworLyoJCQlEX1RYUE9XRVIoImNhbGN1bGF0ZWQgdHhwb3dlciBpZHggJWRcbiIsCisJCQkJCQlwb3dlcl9pZHgpOyAqLworCisJCQlpZiAocG93ZXJfaWR4IDwgZ2V0X21pbl9wb3dlcl9pZHgoaSwgYmFuZCkpCisJCQkJcG93ZXJfaWR4ID0gZ2V0X21pbl9wb3dlcl9pZHgoaSwgYmFuZCk7CisKKwkJCS8qIGFkanVzdCA1IEdIeiBpZHggdG8gc3VwcG9ydCBuZWdhdGl2ZSBpZHhlcyAqLworCQkJaWYgKCFiYW5kKQorCQkJCXBvd2VyX2lkeCArPSA5OworCisJCQkvKiBDQ0ssIHJhdGUgMzIsIHJlZHVjZSB0eHBvd2VyIGZvciBDQ0sgKi8KKwkJCWlmIChpID09IFBPV0VSX1RCTF9DQ0tfRU5UUlkpCisJCQkJcG93ZXJfaWR4ICs9CisJCQkJICAgIElMX1RYX1BPV0VSX0NDS19DT01QRU5TQVRJT05fQ19TVEVQOworCisJCQkvKiBzdGF5IHdpdGhpbiB0aGUgdGFibGUhICovCisJCQlpZiAocG93ZXJfaWR4ID4gMTA3KSB7CisJCQkJSUxfV0FSTigidHhwb3dlciBpZHggJWQgPiAxMDdcbiIsIHBvd2VyX2lkeCk7CisJCQkJcG93ZXJfaWR4ID0gMTA3OworCQkJfQorCQkJaWYgKHBvd2VyX2lkeCA8IDApIHsKKwkJCQlJTF9XQVJOKCJ0eHBvd2VyIGlkeCAlZCA8IDBcbiIsIHBvd2VyX2lkeCk7CisJCQkJcG93ZXJfaWR4ID0gMDsKKwkJCX0KKworCQkJLyogZmlsbCB0eHBvd2VyIGNvbW1hbmQgZm9yIHRoaXMgcmF0ZS9jaGFpbiAqLworCQkJdHhfcG93ZXIucy5yYWRpb190eF9nYWluW2NdID0KKwkJCSAgICBnYWluX3RhYmxlW2JhbmRdW3Bvd2VyX2lkeF0ucmFkaW87CisJCQl0eF9wb3dlci5zLmRzcF9wcmVkaXNfYXR0ZW5bY10gPQorCQkJICAgIGdhaW5fdGFibGVbYmFuZF1bcG93ZXJfaWR4XS5kc3A7CisKKwkJCURfVFhQT1dFUigiY2hhaW4gJWQgbWltbyAlZCBpZHggJWQgIgorCQkJCSAgImdhaW4gMHglMDJ4IGRzcCAlZFxuIiwgYywgYXR0ZW5fdmFsdWUsCisJCQkJICBwb3dlcl9pZHgsIHR4X3Bvd2VyLnMucmFkaW9fdHhfZ2FpbltjXSwKKwkJCQkgIHR4X3Bvd2VyLnMuZHNwX3ByZWRpc19hdHRlbltjXSk7CisJCX0JCS8qIGZvciBlYWNoIGNoYWluICovCisKKwkJdHhfcG93ZXJfdGJsLT5wb3dlcl90YmxbaV0uZHcgPSBjcHVfdG9fbGUzMih0eF9wb3dlci5kdyk7CisKKwl9CQkJLyogZm9yIGVhY2ggcmF0ZSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWw0OTY1X3NlbmRfdHhfcG93ZXIgLSBDb25maWd1cmUgdGhlIFRYUE9XRVIgbGV2ZWwgdXNlciBsaW1pdAorICoKKyAqIFVzZXMgdGhlIGFjdGl2ZSBSWE9OIGZvciBjaGFubmVsLCBiYW5kLCBhbmQgY2hhcmFjdGVyaXN0aWNzIChodDQwLCBoaWdoKQorICogVGhlIHBvd2VyIGxpbWl0IGlzIHRha2VuIGZyb20gaWwtPnR4X3Bvd2VyX3VzZXJfbG10LgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsNDk2NV90eHBvd2VydGFibGVfY21kIGNtZCA9IHsgMCB9OworCWludCByZXQ7CisJdTggYmFuZCA9IDA7CisJYm9vbCBpc19odDQwID0gZmFsc2U7CisJdTggY3RybF9jaGFuX2hpZ2ggPSAwOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJaWYgKFdBUk5fT05DRQorCSAgICAodGVzdF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyksCisJICAgICAiVFggUG93ZXIgcmVxdWVzdGVkIHdoaWxlIHNjYW5uaW5nIVxuIikpCisJCXJldHVybiAtRUFHQUlOOworCisJYmFuZCA9IGlsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFo7CisKKwlpc19odDQwID0gaXc0OTY1X2lzX2h0NDBfY2hhbm5lbChjdHgtPmFjdGl2ZS5mbGFncyk7CisKKwlpZiAoaXNfaHQ0MCAmJiAoY3R4LT5hY3RpdmUuZmxhZ3MgJiBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSykpCisJCWN0cmxfY2hhbl9oaWdoID0gMTsKKworCWNtZC5iYW5kID0gYmFuZDsKKwljbWQuY2hhbm5lbCA9IGN0eC0+YWN0aXZlLmNoYW5uZWw7CisKKwlyZXQgPQorCSAgICBpbDQ5NjVfZmlsbF90eHBvd2VyX3RibChpbCwgYmFuZCwgbGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCksCisJCQkJICAgIGlzX2h0NDAsIGN0cmxfY2hhbl9oaWdoLCAmY21kLnR4X3Bvd2VyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGlsX3NlbmRfY21kX3BkdShpbCwgQ19UWF9QV1JfVEJMLCBzaXplb2YoY21kKSwgJmNtZCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfc2VuZF9yeG9uX2Fzc29jKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpbDQ5NjVfcnhvbl9hc3NvY19jbWQgcnhvbl9hc3NvYzsKKwljb25zdCBzdHJ1Y3QgaWxfcnhvbl9jbWQgKnJ4b24xID0gJmN0eC0+c3RhZ2luZzsKKwljb25zdCBzdHJ1Y3QgaWxfcnhvbl9jbWQgKnJ4b24yID0gJmN0eC0+YWN0aXZlOworCisJaWYgKHJ4b24xLT5mbGFncyA9PSByeG9uMi0+ZmxhZ3MgJiYKKwkgICAgcnhvbjEtPmZpbHRlcl9mbGFncyA9PSByeG9uMi0+ZmlsdGVyX2ZsYWdzICYmCisJICAgIHJ4b24xLT5jY2tfYmFzaWNfcmF0ZXMgPT0gcnhvbjItPmNja19iYXNpY19yYXRlcyAmJgorCSAgICByeG9uMS0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzID09CisJICAgIHJ4b24yLT5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgJiYKKwkgICAgcnhvbjEtPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPT0KKwkgICAgcnhvbjItPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgJiYKKwkgICAgcnhvbjEtPnJ4X2NoYWluID09IHJ4b24yLT5yeF9jaGFpbiAmJgorCSAgICByeG9uMS0+b2ZkbV9iYXNpY19yYXRlcyA9PSByeG9uMi0+b2ZkbV9iYXNpY19yYXRlcykgeworCQlEX0lORk8oIlVzaW5nIGN1cnJlbnQgUlhPTl9BU1NPQy4gIE5vdCByZXNlbmRpbmcuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcnhvbl9hc3NvYy5mbGFncyA9IGN0eC0+c3RhZ2luZy5mbGFnczsKKwlyeG9uX2Fzc29jLmZpbHRlcl9mbGFncyA9IGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3M7CisJcnhvbl9hc3NvYy5vZmRtX2Jhc2ljX3JhdGVzID0gY3R4LT5zdGFnaW5nLm9mZG1fYmFzaWNfcmF0ZXM7CisJcnhvbl9hc3NvYy5jY2tfYmFzaWNfcmF0ZXMgPSBjdHgtPnN0YWdpbmcuY2NrX2Jhc2ljX3JhdGVzOworCXJ4b25fYXNzb2MucmVzZXJ2ZWQgPSAwOworCXJ4b25fYXNzb2Mub2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzID0KKwkgICAgY3R4LT5zdGFnaW5nLm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlczsKKwlyeG9uX2Fzc29jLm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPQorCSAgICBjdHgtPnN0YWdpbmcub2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlczsKKwlyeG9uX2Fzc29jLnJ4X2NoYWluX3NlbGVjdF9mbGFncyA9IGN0eC0+c3RhZ2luZy5yeF9jaGFpbjsKKworCXJldCA9CisJICAgIGlsX3NlbmRfY21kX3BkdV9hc3luYyhpbCwgQ19SWE9OX0FTU09DLCBzaXplb2Yocnhvbl9hc3NvYyksCisJCQkJICAmcnhvbl9hc3NvYywgTlVMTCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfY29tbWl0X3J4b24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJLyogY2FzdCBhd2F5IHRoZSBjb25zdCBmb3IgYWN0aXZlX3J4b24gaW4gdGhpcyBmdW5jdGlvbiAqLworCXN0cnVjdCBpbF9yeG9uX2NtZCAqYWN0aXZlX3J4b24gPSAodm9pZCAqKSZjdHgtPmFjdGl2ZTsKKwlpbnQgcmV0OworCWJvb2wgbmV3X2Fzc29jID0gISEoY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSyk7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghY3R4LT5pc19hY3RpdmUpCisJCXJldHVybiAwOworCisJLyogYWx3YXlzIGdldCB0aW1lc3RhbXAgd2l0aCBSeCBmcmFtZSAqLworCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19UU0YySE9TVF9NU0s7CisKKwlyZXQgPSBpbF9jaGVja19yeG9uX2NtZChpbCwgY3R4KTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiSW52YWxpZCBSWE9OIGNvbmZpZ3VyYXRpb24uICBOb3QgY29tbWl0dGluZy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIHJlY2VpdmUgY29tbWl0X3J4b24gcmVxdWVzdAorCSAqIGFib3J0IGFueSBwcmV2aW91cyBjaGFubmVsIHN3aXRjaCBpZiBzdGlsbCBpbiBwcm9jZXNzCisJICovCisJaWYgKHRlc3RfYml0KFNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJmlsLT5zdGF0dXMpICYmCisJICAgIGlsLT5zd2l0Y2hfY2hhbm5lbCAhPSBjdHgtPnN0YWdpbmcuY2hhbm5lbCkgeworCQlEXzExSCgiYWJvcnQgY2hhbm5lbCBzd2l0Y2ggb24gJWRcbiIsCisJCSAgICAgIGxlMTZfdG9fY3B1KGlsLT5zd2l0Y2hfY2hhbm5lbCkpOworCQlpbF9jaHN3aXRjaF9kb25lKGlsLCBmYWxzZSk7CisJfQorCisJLyogSWYgd2UgZG9uJ3QgbmVlZCB0byBzZW5kIGEgZnVsbCBSWE9OLCB3ZSBjYW4gdXNlCisJICogaWxfcnhvbl9hc3NvY19jbWQgd2hpY2ggaXMgdXNlZCB0byByZWNvbmZpZ3VyZSBmaWx0ZXIKKwkgKiBhbmQgb3RoZXIgZmxhZ3MgZm9yIHRoZSBjdXJyZW50IHJhZGlvIGNvbmZpZ3VyYXRpb24uICovCisJaWYgKCFpbF9mdWxsX3J4b25fcmVxdWlyZWQoaWwsIGN0eCkpIHsKKwkJcmV0ID0gaWxfc2VuZF9yeG9uX2Fzc29jKGlsLCBjdHgpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIkVycm9yIHNldHRpbmcgUlhPTl9BU1NPQyAoJWQpXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOworCQlpbF9wcmludF9yeF9jb25maWdfY21kKGlsLCBjdHgpOworCQkvKgorCQkgKiBXZSBkbyBub3QgY29tbWl0IHR4IHBvd2VyIHNldHRpbmdzIHdoaWxlIGNoYW5uZWwgY2hhbmdpbmcsCisJCSAqIGRvIGl0IG5vdyBpZiB0eCBwb3dlciBjaGFuZ2VkLgorCQkgKi8KKwkJaWxfc2V0X3R4X3Bvd2VyKGlsLCBpbC0+dHhfcG93ZXJfbmV4dCwgZmFsc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgY3VycmVudGx5IGFzc29jaWF0ZWQgYW5kIHRoZSBuZXcgY29uZmlnIHJlcXVpcmVzCisJICogYW4gUlhPTl9BU1NPQyBhbmQgdGhlIG5ldyBjb25maWcgd2FudHMgdGhlIGFzc29jaWF0ZWQgbWFzayBlbmFibGVkLAorCSAqIHdlIG11c3QgY2xlYXIgdGhlIGFzc29jaWF0ZWQgZnJvbSB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24KKwkgKiBiZWZvcmUgd2UgYXBwbHkgdGhlIG5ldyBjb25maWcgKi8KKwlpZiAoaWxfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSAmJiBuZXdfYXNzb2MpIHsKKwkJRF9JTkZPKCJUb2dnbGluZyBhc3NvY2lhdGVkIGJpdCBvbiBjdXJyZW50IFJYT05cbiIpOworCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisKKwkJcmV0ID0KKwkJICAgIGlsX3NlbmRfY21kX3BkdShpbCwgY3R4LT5yeG9uX2NtZCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpbF9yeG9uX2NtZCksIGFjdGl2ZV9yeG9uKTsKKworCQkvKiBJZiB0aGUgbWFzayBjbGVhcmluZyBmYWlsZWQgdGhlbiB3ZSBzZXQKKwkJICogYWN0aXZlX3J4b24gYmFjayB0byB3aGF0IGl0IHdhcyBwcmV2aW91c2x5ICovCisJCWlmIChyZXQpIHsKKwkJCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQkJSUxfRVJSKCJFcnJvciBjbGVhcmluZyBBU1NPQ19NU0sgKCVkKVxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoaWwsIGN0eCk7CisJCWlsX3Jlc3RvcmVfc3RhdGlvbnMoaWwsIGN0eCk7CisJCXJldCA9IGlsNDk2NV9yZXN0b3JlX2RlZmF1bHRfd2VwX2tleXMoaWwsIGN0eCk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiRmFpbGVkIHRvIHJlc3RvcmUgV0VQIGtleXMgKCVkKVxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlEX0lORk8oIlNlbmRpbmcgUlhPTlxuIiAiKiB3aXRoJXMgUlhPTl9GSUxURVJfQVNTT0NfTVNLXG4iCisJICAgICAgICIqIGNoYW5uZWwgPSAlZFxuIiAiKiBic3NpZCA9ICVwTVxuIiwgKG5ld19hc3NvYyA/ICIiIDogIm91dCIpLAorCSAgICAgICBsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCksIGN0eC0+c3RhZ2luZy5ic3NpZF9hZGRyKTsKKworCWlsX3NldF9yeG9uX2h3Y3J5cHRvKGlsLCBjdHgsICFpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5zd19jcnlwdG8pOworCisJLyogQXBwbHkgdGhlIG5ldyBjb25maWd1cmF0aW9uCisJICogUlhPTiB1bmFzc29jIGNsZWFycyB0aGUgc3RhdGlvbiB0YWJsZSBpbiB1Q29kZSBzbyByZXN0b3JhdGlvbiBvZgorCSAqIHN0YXRpb25zIGlzIG5lZWRlZCBhZnRlciBpdCAodGhlIFJYT04gY29tbWFuZCkgY29tcGxldGVzCisJICovCisJaWYgKCFuZXdfYXNzb2MpIHsKKwkJcmV0ID0KKwkJICAgIGlsX3NlbmRfY21kX3BkdShpbCwgY3R4LT5yeG9uX2NtZCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpbF9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIkVycm9yIHNldHRpbmcgbmV3IFJYT04gKCVkKVxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJRF9JTkZPKCJSZXR1cm4gZnJvbSAhbmV3X2Fzc29jIFJYT04uXG4iKTsKKwkJbWVtY3B5KGFjdGl2ZV9yeG9uLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7CisJCWlsX2NsZWFyX3Vjb2RlX3N0YXRpb25zKGlsLCBjdHgpOworCQlpbF9yZXN0b3JlX3N0YXRpb25zKGlsLCBjdHgpOworCQlyZXQgPSBpbDQ5NjVfcmVzdG9yZV9kZWZhdWx0X3dlcF9rZXlzKGlsLCBjdHgpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIkZhaWxlZCB0byByZXN0b3JlIFdFUCBrZXlzICglZClcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCWlmIChuZXdfYXNzb2MpIHsKKwkJaWwtPnN0YXJ0X2NhbGliID0gMDsKKwkJLyogQXBwbHkgdGhlIG5ldyBjb25maWd1cmF0aW9uCisJCSAqIFJYT04gYXNzb2MgZG9lc24ndCBjbGVhciB0aGUgc3RhdGlvbiB0YWJsZSBpbiB1Q29kZSwKKwkJICovCisJCXJldCA9CisJCSAgICBpbF9zZW5kX2NtZF9wZHUoaWwsIGN0eC0+cnhvbl9jbWQsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaWxfcnhvbl9jbWQpLCAmY3R4LT5zdGFnaW5nKTsKKwkJaWYgKHJldCkgeworCQkJSUxfRVJSKCJFcnJvciBzZXR0aW5nIG5ldyBSWE9OICglZClcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOworCX0KKwlpbF9wcmludF9yeF9jb25maWdfY21kKGlsLCBjdHgpOworCisJaWw0OTY1X2luaXRfc2Vuc2l0aXZpdHkoaWwpOworCisJLyogSWYgd2UgaXNzdWUgYSBuZXcgUlhPTiBjb21tYW5kIHdoaWNoIHJlcXVpcmVkIGEgdHVuZSB0aGVuIHdlIG11c3QKKwkgKiBzZW5kIGEgbmV3IFRYUE9XRVIgY29tbWFuZCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIFR4IGFueSBmcmFtZXMgKi8KKwlyZXQgPSBpbF9zZXRfdHhfcG93ZXIoaWwsIGlsLT50eF9wb3dlcl9uZXh0LCB0cnVlKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiRXJyb3Igc2VuZGluZyBUWCBwb3dlciAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9zd2l0Y2ggKmNoX3N3aXRjaCkKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwlpbnQgcmM7CisJdTggYmFuZCA9IDA7CisJYm9vbCBpc19odDQwID0gZmFsc2U7CisJdTggY3RybF9jaGFuX2hpZ2ggPSAwOworCXN0cnVjdCBpbDQ5NjVfY2hhbm5lbF9zd2l0Y2hfY21kIGNtZDsKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCXUzMiBzd2l0Y2hfdGltZV9pbl91c2VjLCB1Y29kZV9zd2l0Y2hfdGltZTsKKwl1MTYgY2g7CisJdTMyIHRzZl9sb3c7CisJdTggc3dpdGNoX2NvdW50OworCXUxNiBiZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShjdHgtPnRpbWluZy5iZWFjb25faW50ZXJ2YWwpOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKKwliYW5kID0gaWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWjsKKworCWlzX2h0NDAgPSBpdzQ5NjVfaXNfaHQ0MF9jaGFubmVsKGN0eC0+c3RhZ2luZy5mbGFncyk7CisKKwlpZiAoaXNfaHQ0MCAmJiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0spKQorCQljdHJsX2NoYW5faGlnaCA9IDE7CisKKwljbWQuYmFuZCA9IGJhbmQ7CisJY21kLmV4cGVjdF9iZWFjb24gPSAwOworCWNoID0gY2hfc3dpdGNoLT5jaGFubmVsLT5od192YWx1ZTsKKwljbWQuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKKwljbWQucnhvbl9mbGFncyA9IGN0eC0+c3RhZ2luZy5mbGFnczsKKwljbWQucnhvbl9maWx0ZXJfZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzOworCXN3aXRjaF9jb3VudCA9IGNoX3N3aXRjaC0+Y291bnQ7CisJdHNmX2xvdyA9IGNoX3N3aXRjaC0+dGltZXN0YW1wICYgMHgwZmZmZmZmZmY7CisJLyoKKwkgKiBjYWxjdWxhdGUgdGhlIHVjb2RlIGNoYW5uZWwgc3dpdGNoIHRpbWUKKwkgKiBhZGRpbmcgVFNGIGFzIG9uZSBvZiB0aGUgZmFjdG9yIGZvciB3aGVuIHRvIHN3aXRjaAorCSAqLworCWlmIChpbC0+dWNvZGVfYmVhY29uX3RpbWUgPiB0c2ZfbG93ICYmIGJlYWNvbl9pbnRlcnZhbCkgeworCQlpZiAoc3dpdGNoX2NvdW50ID4KKwkJICAgICgoaWwtPnVjb2RlX2JlYWNvbl90aW1lIC0gdHNmX2xvdykgLyBiZWFjb25faW50ZXJ2YWwpKSB7CisJCQlzd2l0Y2hfY291bnQgLT0KKwkJCSAgICAoaWwtPnVjb2RlX2JlYWNvbl90aW1lIC0gdHNmX2xvdykgLyBiZWFjb25faW50ZXJ2YWw7CisJCX0gZWxzZQorCQkJc3dpdGNoX2NvdW50ID0gMDsKKwl9CisJaWYgKHN3aXRjaF9jb3VudCA8PSAxKQorCQljbWQuc3dpdGNoX3RpbWUgPSBjcHVfdG9fbGUzMihpbC0+dWNvZGVfYmVhY29uX3RpbWUpOworCWVsc2UgeworCQlzd2l0Y2hfdGltZV9pbl91c2VjID0KKwkJICAgIHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCAqIHN3aXRjaF9jb3VudCAqIFRJTUVfVU5JVDsKKwkJdWNvZGVfc3dpdGNoX3RpbWUgPQorCQkgICAgaWxfdXNlY3NfdG9fYmVhY29ucyhpbCwgc3dpdGNoX3RpbWVfaW5fdXNlYywKKwkJCQkJYmVhY29uX2ludGVydmFsKTsKKwkJY21kLnN3aXRjaF90aW1lID0KKwkJICAgIGlsX2FkZF9iZWFjb25fdGltZShpbCwgaWwtPnVjb2RlX2JlYWNvbl90aW1lLAorCQkJCSAgICAgICB1Y29kZV9zd2l0Y2hfdGltZSwgYmVhY29uX2ludGVydmFsKTsKKwl9CisJRF8xMUgoInVDb2RlIHRpbWUgZm9yIHRoZSBzd2l0Y2ggaXMgMHgleFxuIiwgY21kLnN3aXRjaF90aW1lKTsKKwljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgaWwtPmJhbmQsIGNoKTsKKwlpZiAoY2hfaW5mbykKKwkJY21kLmV4cGVjdF9iZWFjb24gPSBpbF9pc19jaGFubmVsX3JhZGFyKGNoX2luZm8pOworCWVsc2UgeworCQlJTF9FUlIoImludmFsaWQgY2hhbm5lbCBzd2l0Y2ggZnJvbSAldSB0byAldVxuIiwKKwkJICAgICAgIGN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpbDQ5NjVfZmlsbF90eHBvd2VyX3RibChpbCwgYmFuZCwgY2gsIGlzX2h0NDAsIGN0cmxfY2hhbl9oaWdoLAorCQkJCSAgICAgJmNtZC50eF9wb3dlcik7CisJaWYgKHJjKSB7CisJCURfMTFIKCJlcnJvcjolZCAgZmlsbCB0eHBvd2VyX3RibFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIGlsX3NlbmRfY21kX3BkdShpbCwgQ19DSEFOTkVMX1NXSVRDSCwgc2l6ZW9mKGNtZCksICZjbWQpOworfQorCisvKioKKyAqIGlsNDk2NV90eHFfdXBkYXRlX2J5dGVfY250X3RibCAtIFNldCB1cCBlbnRyeSBpbiBUeCBieXRlLWNvdW50IGFycmF5CisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfdHhxX3VwZGF0ZV9ieXRlX2NudF90Ymwoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwKKwkJCSAgICAgICB1MTYgYnl0ZV9jbnQpCit7CisJc3RydWN0IGlsNDk2NV9zY2RfYmNfdGJsICpzY2RfYmNfdGJsID0gaWwtPnNjZF9iY190YmxzLmFkZHI7CisJaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKwlpbnQgd3JpdGVfcHRyID0gdHhxLT5xLndyaXRlX3B0cjsKKwlpbnQgbGVuID0gYnl0ZV9jbnQgKyBJTF9UWF9DUkNfU0laRSArIElMX1RYX0RFTElNSVRFUl9TSVpFOworCV9fbGUxNiBiY19lbnQ7CisKKwlXQVJOX09OKGxlbiA+IDB4RkZGIHx8IHdyaXRlX3B0ciA+PSBURkRfUVVFVUVfU0laRV9NQVgpOworCisJYmNfZW50ID0gY3B1X3RvX2xlMTYobGVuICYgMHhGRkYpOworCS8qIFNldCB1cCBieXRlIGNvdW50IHdpdGhpbiBmaXJzdCAyNTYgZW50cmllcyAqLworCXNjZF9iY190YmxbdHhxX2lkXS50ZmRfb2Zmc2V0W3dyaXRlX3B0cl0gPSBiY19lbnQ7CisKKwkvKiBJZiB3aXRoaW4gZmlyc3QgNjQgZW50cmllcywgZHVwbGljYXRlIGF0IGVuZCAqLworCWlmICh3cml0ZV9wdHIgPCBURkRfUVVFVUVfU0laRV9CQ19EVVApCisJCXNjZF9iY190YmxbdHhxX2lkXS50ZmRfb2Zmc2V0W1RGRF9RVUVVRV9TSVpFX01BWCArIHdyaXRlX3B0cl0gPQorCQkgICAgYmNfZW50OworfQorCisvKioKKyAqIGlsNDk2NV9od19nZXRfdGVtcGVyYXR1cmUgLSByZXR1cm4gdGhlIGNhbGlicmF0ZWQgdGVtcGVyYXR1cmUgKGluIEtlbHZpbikKKyAqIEBzdGF0czogUHJvdmlkZXMgdGhlIHRlbXBlcmF0dXJlIHJlYWRpbmcgZnJvbSB0aGUgdUNvZGUKKyAqCisgKiBBIHJldHVybiBvZiA8MCBpbmRpY2F0ZXMgYm9ndXMgZGF0YSBpbiB0aGUgc3RhdHMKKyAqLworc3RhdGljIGludAoraWw0OTY1X2h3X2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJczMyIHRlbXBlcmF0dXJlOworCXMzMiB2dDsKKwlzMzIgUjEsIFIyLCBSMzsKKwl1MzIgUjQ7CisKKwlpZiAodGVzdF9iaXQoU19URU1QRVJBVFVSRSwgJmlsLT5zdGF0dXMpICYmCisJICAgIChpbC0+XzQ5NjUuc3RhdHMuZmxhZyAmIFNUQVRTX1JFUExZX0ZMR19IVDQwX01PREVfTVNLKSkgeworCQlEX1RFTVAoIlJ1bm5pbmcgSFQ0MCB0ZW1wZXJhdHVyZSBjYWxpYnJhdGlvblxuIik7CisJCVIxID0gKHMzMikgbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yMVsxXSk7CisJCVIyID0gKHMzMikgbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yMlsxXSk7CisJCVIzID0gKHMzMikgbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yM1sxXSk7CisJCVI0ID0gbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yNFsxXSk7CisJfSBlbHNlIHsKKwkJRF9URU1QKCJSdW5uaW5nIHRlbXBlcmF0dXJlIGNhbGlicmF0aW9uXG4iKTsKKwkJUjEgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IxWzBdKTsKKwkJUjIgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IyWzBdKTsKKwkJUjMgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IzWzBdKTsKKwkJUjQgPSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3I0WzBdKTsKKwl9CisKKwkvKgorCSAqIFRlbXBlcmF0dXJlIGlzIG9ubHkgMjMgYml0cywgc28gc2lnbiBleHRlbmQgb3V0IHRvIDMyLgorCSAqCisJICogTk9URSBJZiB3ZSBoYXZlbid0IHJlY2VpdmVkIGEgc3RhdHMgbm90aWZpY2F0aW9uIHlldAorCSAqIHdpdGggYW4gdXBkYXRlZCB0ZW1wZXJhdHVyZSwgdXNlIFI0IHByb3ZpZGVkIHRvIHVzIGluIHRoZQorCSAqICJpbml0aWFsaXplIiBBTElWRSByZXNwb25zZS4KKwkgKi8KKwlpZiAoIXRlc3RfYml0KFNfVEVNUEVSQVRVUkUsICZpbC0+c3RhdHVzKSkKKwkJdnQgPSBzaWduX2V4dGVuZDMyKFI0LCAyMyk7CisJZWxzZQorCQl2dCA9IHNpZ25fZXh0ZW5kMzIobGUzMl90b19jcHUKKwkJCQkgICAoaWwtPl80OTY1LnN0YXRzLmdlbmVyYWwuY29tbW9uLnRlbXBlcmF0dXJlKSwKKwkJCQkgICAyMyk7CisKKwlEX1RFTVAoIkNhbGliIHZhbHVlcyBSWzEtM106ICVkICVkICVkIFI0OiAlZFxuIiwgUjEsIFIyLCBSMywgdnQpOworCisJaWYgKFIzID09IFIxKSB7CisJCUlMX0VSUigiQ2FsaWJyYXRpb24gY29uZmxpY3QgUjEgPT0gUjNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2FsY3VsYXRlIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgS2VsdmluLCBhZGp1c3QgYnkgOTclLgorCSAqIEFkZCBvZmZzZXQgdG8gY2VudGVyIHRoZSBhZGp1c3RtZW50IGFyb3VuZCAwIGRlZ3JlZXMgQ2VudGlncmFkZS4gKi8KKwl0ZW1wZXJhdHVyZSA9IFRFTVBFUkFUVVJFX0NBTElCX0FfVkFMICogKHZ0IC0gUjIpOworCXRlbXBlcmF0dXJlIC89IChSMyAtIFIxKTsKKwl0ZW1wZXJhdHVyZSA9CisJICAgICh0ZW1wZXJhdHVyZSAqIDk3KSAvIDEwMCArIFRFTVBFUkFUVVJFX0NBTElCX0tFTFZJTl9PRkZTRVQ7CisKKwlEX1RFTVAoIkNhbGlicmF0ZWQgdGVtcGVyYXR1cmU6ICVkSywgJWRDXG4iLCB0ZW1wZXJhdHVyZSwKKwkgICAgICAgS0VMVklOX1RPX0NFTFNJVVModGVtcGVyYXR1cmUpKTsKKworCXJldHVybiB0ZW1wZXJhdHVyZTsKK30KKworLyogQWRqdXN0IFR4cG93ZXIgb25seSBpZiB0ZW1wZXJhdHVyZSB2YXJpYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLiAqLworI2RlZmluZSBJTF9URU1QRVJBVFVSRV9USFJFU0hPTEQgICAzCisKKy8qKgorICogaWw0OTY1X2lzX3RlbXBfY2FsaWJfbmVlZGVkIC0gZGV0ZXJtaW5lcyBpZiBuZXcgY2FsaWJyYXRpb24gaXMgbmVlZGVkCisgKgorICogSWYgdGhlIHRlbXBlcmF0dXJlIGNoYW5nZWQgaGFzIGNoYW5nZWQgc3VmZmljaWVudGx5LCB0aGVuIGEgcmVjYWxpYnJhdGlvbgorICogaXMgbmVlZGVkLgorICoKKyAqIEFzc3VtZXMgY2FsbGVyIHdpbGwgcmVwbGFjZSBpbC0+bGFzdF90ZW1wZXJhdHVyZSBvbmNlIGNhbGlicmF0aW9uCisgKiBleGVjdXRlZC4KKyAqLworc3RhdGljIGludAoraWw0OTY1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgdGVtcF9kaWZmOworCisJaWYgKCF0ZXN0X2JpdChTX1NUQVRTLCAmaWwtPnN0YXR1cykpIHsKKwkJRF9URU1QKCJUZW1wZXJhdHVyZSBub3QgdXBkYXRlZCAtLSBubyBzdGF0cy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0ZW1wX2RpZmYgPSBpbC0+dGVtcGVyYXR1cmUgLSBpbC0+bGFzdF90ZW1wZXJhdHVyZTsKKworCS8qIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLworCWlmICh0ZW1wX2RpZmYgPCAwKSB7CisJCURfUE9XRVIoIkdldHRpbmcgY29vbGVyLCBkZWx0YSAlZFxuIiwgdGVtcF9kaWZmKTsKKwkJdGVtcF9kaWZmID0gLXRlbXBfZGlmZjsKKwl9IGVsc2UgaWYgKHRlbXBfZGlmZiA9PSAwKQorCQlEX1BPV0VSKCJUZW1wZXJhdHVyZSB1bmNoYW5nZWRcbiIpOworCWVsc2UKKwkJRF9QT1dFUigiR2V0dGluZyB3YXJtZXIsIGRlbHRhICVkXG4iLCB0ZW1wX2RpZmYpOworCisJaWYgKHRlbXBfZGlmZiA8IElMX1RFTVBFUkFUVVJFX1RIUkVTSE9MRCkgeworCQlEX1BPV0VSKCIgPT4gdGhlcm1hbCB0eHBvd2VyIGNhbGliIG5vdCBuZWVkZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEX1BPV0VSKCIgPT4gdGhlcm1hbCB0eHBvd2VyIGNhbGliIG5lZWRlZFxuIik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV90ZW1wZXJhdHVyZV9jYWxpYihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJczMyIHRlbXA7CisKKwl0ZW1wID0gaWw0OTY1X2h3X2dldF90ZW1wZXJhdHVyZShpbCk7CisJaWYgKElMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX09VVF9PRl9SQU5HRSh0ZW1wKSkKKwkJcmV0dXJuOworCisJaWYgKGlsLT50ZW1wZXJhdHVyZSAhPSB0ZW1wKSB7CisJCWlmIChpbC0+dGVtcGVyYXR1cmUpCisJCQlEX1RFTVAoIlRlbXBlcmF0dXJlIGNoYW5nZWQgIiAiZnJvbSAlZEMgdG8gJWRDXG4iLAorCQkJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKGlsLT50ZW1wZXJhdHVyZSksCisJCQkgICAgICAgS0VMVklOX1RPX0NFTFNJVVModGVtcCkpOworCQllbHNlCisJCQlEX1RFTVAoIlRlbXBlcmF0dXJlICIgImluaXRpYWxpemVkIHRvICVkQ1xuIiwKKwkJCSAgICAgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ZW1wKSk7CisJfQorCisJaWwtPnRlbXBlcmF0dXJlID0gdGVtcDsKKwlzZXRfYml0KFNfVEVNUEVSQVRVUkUsICZpbC0+c3RhdHVzKTsKKworCWlmICghaWwtPmRpc2FibGVfdHhfcG93ZXJfY2FsICYmCisJICAgIHVubGlrZWx5KCF0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykpICYmCisJICAgIGlsNDk2NV9pc190ZW1wX2NhbGliX25lZWRlZChpbCkpCisJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT50eHBvd2VyX3dvcmspOworfQorCitzdGF0aWMgdTE2CitpbDQ5NjVfZ2V0X2hjbWRfc2l6ZSh1OCBjbWRfaWQsIHUxNiBsZW4pCit7CisJc3dpdGNoIChjbWRfaWQpIHsKKwljYXNlIENfUlhPTjoKKwkJcmV0dXJuICh1MTYpIHNpemVvZihzdHJ1Y3QgaWw0OTY1X3J4b25fY21kKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gbGVuOworCX0KK30KKworc3RhdGljIHUxNgoraWw0OTY1X2J1aWxkX2FkZHN0YV9oY21kKGNvbnN0IHN0cnVjdCBpbF9hZGRzdGFfY21kICpjbWQsIHU4ICogZGF0YSkKK3sKKwlzdHJ1Y3QgaWw0OTY1X2FkZHN0YV9jbWQgKmFkZHN0YSA9IChzdHJ1Y3QgaWw0OTY1X2FkZHN0YV9jbWQgKilkYXRhOworCWFkZHN0YS0+bW9kZSA9IGNtZC0+bW9kZTsKKwltZW1jcHkoJmFkZHN0YS0+c3RhLCAmY21kLT5zdGEsIHNpemVvZihzdHJ1Y3Qgc3RhX2lkX21vZGlmeSkpOworCW1lbWNweSgmYWRkc3RhLT5rZXksICZjbWQtPmtleSwgc2l6ZW9mKHN0cnVjdCBpbDQ5NjVfa2V5aW5mbykpOworCWFkZHN0YS0+c3RhdGlvbl9mbGFncyA9IGNtZC0+c3RhdGlvbl9mbGFnczsKKwlhZGRzdGEtPnN0YXRpb25fZmxhZ3NfbXNrID0gY21kLT5zdGF0aW9uX2ZsYWdzX21zazsKKwlhZGRzdGEtPnRpZF9kaXNhYmxlX3R4ID0gY21kLT50aWRfZGlzYWJsZV90eDsKKwlhZGRzdGEtPmFkZF9pbW1lZGlhdGVfYmFfdGlkID0gY21kLT5hZGRfaW1tZWRpYXRlX2JhX3RpZDsKKwlhZGRzdGEtPnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkID0gY21kLT5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZDsKKwlhZGRzdGEtPmFkZF9pbW1lZGlhdGVfYmFfc3NuID0gY21kLT5hZGRfaW1tZWRpYXRlX2JhX3NzbjsKKwlhZGRzdGEtPnNsZWVwX3R4X2NvdW50ID0gY21kLT5zbGVlcF90eF9jb3VudDsKKwlhZGRzdGEtPnJlc2VydmVkMSA9IGNwdV90b19sZTE2KDApOworCWFkZHN0YS0+cmVzZXJ2ZWQyID0gY3B1X3RvX2xlMTYoMCk7CisKKwlyZXR1cm4gKHUxNikgc2l6ZW9mKHN0cnVjdCBpbDQ5NjVfYWRkc3RhX2NtZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitpbDQ5NjVfZ2V0X3NjZF9zc24oc3RydWN0IGlsNDk2NV90eF9yZXNwICp0eF9yZXNwKQoreworCXJldHVybiBsZTMyX3RvX2NwdXAoJnR4X3Jlc3AtPnUuc3RhdHVzICsgdHhfcmVzcC0+ZnJhbWVfY291bnQpICYgTUFYX1NOOworfQorCitzdGF0aWMgaW5saW5lIHUzMgoraWw0OTY1X3R4X3N0YXR1c190b19tYWM4MDIxMSh1MzIgc3RhdHVzKQoreworCXN0YXR1cyAmPSBUWF9TVEFUVVNfTVNLOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIFRYX1NUQVRVU19TVUNDRVNTOgorCWNhc2UgVFhfU1RBVFVTX0RJUkVDVF9ET05FOgorCQlyZXR1cm4gSUVFRTgwMjExX1RYX1NUQVRfQUNLOworCWNhc2UgVFhfU1RBVFVTX0ZBSUxfREVTVF9QUzoKKwkJcmV0dXJuIElFRUU4MDIxMV9UWF9TVEFUX1RYX0ZJTFRFUkVEOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGlubGluZSBib29sCitpbDQ5NjVfaXNfdHhfc3VjY2Vzcyh1MzIgc3RhdHVzKQoreworCXN0YXR1cyAmPSBUWF9TVEFUVVNfTVNLOworCXJldHVybiAoc3RhdHVzID09IFRYX1NUQVRVU19TVUNDRVNTIHx8IHN0YXR1cyA9PSBUWF9TVEFUVVNfRElSRUNUX0RPTkUpOworfQorCisvKioKKyAqIGlsNDk2NV90eF9zdGF0dXNfcmVwbHlfdHggLSBIYW5kbGUgVHggcmVzcG9uc2UgZm9yIGZyYW1lcyBpbiBhZ2dyZWdhdGlvbiBxdWV1ZQorICovCitzdGF0aWMgaW50CitpbDQ5NjVfdHhfc3RhdHVzX3JlcGx5X3R4KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2h0X2FnZyAqYWdnLAorCQkJICBzdHJ1Y3QgaWw0OTY1X3R4X3Jlc3AgKnR4X3Jlc3AsIGludCB0eHFfaWQsCisJCQkgIHUxNiBzdGFydF9pZHgpCit7CisJdTE2IHN0YXR1czsKKwlzdHJ1Y3QgYWdnX3R4X3N0YXR1cyAqZnJhbWVfc3RhdHVzID0gdHhfcmVzcC0+dS5hZ2dfc3RhdHVzOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IE5VTEw7CisJdTMyIHJhdGVfbl9mbGFncyA9IGxlMzJfdG9fY3B1KHR4X3Jlc3AtPnJhdGVfbl9mbGFncyk7CisJaW50IGksIHNoLCBpZHg7CisJdTE2IHNlcTsKKwlpZiAoYWdnLT53YWl0X2Zvcl9iYSkKKwkJRF9UWF9SRVBMWSgiZ290IHR4IHJlc3BvbnNlIHcvbyBibG9jay1hY2tcbiIpOworCisJYWdnLT5mcmFtZV9jb3VudCA9IHR4X3Jlc3AtPmZyYW1lX2NvdW50OworCWFnZy0+c3RhcnRfaWR4ID0gc3RhcnRfaWR4OworCWFnZy0+cmF0ZV9uX2ZsYWdzID0gcmF0ZV9uX2ZsYWdzOworCWFnZy0+Yml0bWFwID0gMDsKKworCS8qIG51bSBmcmFtZXMgYXR0ZW1wdGVkIGJ5IFR4IGNvbW1hbmQgKi8KKwlpZiAoYWdnLT5mcmFtZV9jb3VudCA9PSAxKSB7CisJCS8qIE9ubHkgb25lIGZyYW1lIHdhcyBhdHRlbXB0ZWQ7IG5vIGJsb2NrLWFjayB3aWxsIGFycml2ZSAqLworCQlzdGF0dXMgPSBsZTE2X3RvX2NwdShmcmFtZV9zdGF0dXNbMF0uc3RhdHVzKTsKKwkJaWR4ID0gc3RhcnRfaWR4OworCisJCURfVFhfUkVQTFkoIkZyYW1lQ250ID0gJWQsIFN0YXJ0SWR4PSVkIGlkeD0lZFxuIiwKKwkJCSAgIGFnZy0+ZnJhbWVfY291bnQsIGFnZy0+c3RhcnRfaWR4LCBpZHgpOworCisJCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKGlsLT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2IpOworCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lICsgMTsKKwkJaW5mby0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9UWF9DVExfQU1QRFU7CisJCWluZm8tPmZsYWdzIHw9IGlsNDk2NV90eF9zdGF0dXNfdG9fbWFjODAyMTEoc3RhdHVzKTsKKwkJaWw0OTY1X2h3cmF0ZV90b190eF9jb250cm9sKGlsLCByYXRlX25fZmxhZ3MsIGluZm8pOworCisJCURfVFhfUkVQTFkoIjEgRnJhbWUgMHgleCBmYWlsdXJlIDolZFxuIiwgc3RhdHVzICYgMHhmZiwKKwkJCSAgIHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUpOworCQlEX1RYX1JFUExZKCJSYXRlIEluZm8gcmF0ZV9uX2ZsYWdzPSV4XG4iLCByYXRlX25fZmxhZ3MpOworCisJCWFnZy0+d2FpdF9mb3JfYmEgPSAwOworCX0gZWxzZSB7CisJCS8qIFR3byBvciBtb3JlIGZyYW1lcyB3ZXJlIGF0dGVtcHRlZDsgZXhwZWN0IGJsb2NrLWFjayAqLworCQl1NjQgYml0bWFwID0gMDsKKwkJaW50IHN0YXJ0ID0gYWdnLT5zdGFydF9pZHg7CisKKwkJLyogQ29uc3RydWN0IGJpdC1tYXAgb2YgcGVuZGluZyBmcmFtZXMgd2l0aGluIFR4IHdpbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgYWdnLT5mcmFtZV9jb3VudDsgaSsrKSB7CisJCQl1MTYgc2M7CisJCQlzdGF0dXMgPSBsZTE2X3RvX2NwdShmcmFtZV9zdGF0dXNbaV0uc3RhdHVzKTsKKwkJCXNlcSA9IGxlMTZfdG9fY3B1KGZyYW1lX3N0YXR1c1tpXS5zZXF1ZW5jZSk7CisJCQlpZHggPSBTRVFfVE9fSURYKHNlcSk7CisJCQl0eHFfaWQgPSBTRVFfVE9fUVVFVUUoc2VxKTsKKworCQkJaWYgKHN0YXR1cyAmCisJCQkgICAgKEFHR19UWF9TVEFURV9GRVdfQllURVNfTVNLIHwKKwkJCSAgICAgQUdHX1RYX1NUQVRFX0FCT1JUX01TSykpCisJCQkJY29udGludWU7CisKKwkJCURfVFhfUkVQTFkoIkZyYW1lQ250ID0gJWQsIHR4cV9pZD0lZCBpZHg9JWRcbiIsCisJCQkJICAgYWdnLT5mcmFtZV9jb3VudCwgdHhxX2lkLCBpZHgpOworCisJCQloZHIgPSBpbF90eF9xdWV1ZV9nZXRfaGRyKGlsLCB0eHFfaWQsIGlkeCk7CisJCQlpZiAoIWhkcikgeworCQkJCUlMX0VSUigiQlVHX09OIGlkeCBkb2Vzbid0IHBvaW50IHRvIHZhbGlkIHNrYiIKKwkJCQkgICAgICAgIiBpZHg9JWQsIHR4cV9pZD0lZFxuIiwgaWR4LCB0eHFfaWQpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKTsKKwkJCWlmIChpZHggIT0gKFNFUV9UT19TTihzYykgJiAweGZmKSkgeworCQkJCUlMX0VSUigiQlVHX09OIGlkeCBkb2Vzbid0IG1hdGNoIHNlcSBjb250cm9sIgorCQkJCSAgICAgICAiIGlkeD0lZCwgc2VxX2lkeD0lZCwgc2VxPSVkXG4iLCBpZHgsCisJCQkJICAgICAgIFNFUV9UT19TTihzYyksIGhkci0+c2VxX2N0cmwpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJRF9UWF9SRVBMWSgiQUdHIEZyYW1lIGk9JWQgaWR4ICVkIHNlcT0lZFxuIiwgaSwgaWR4LAorCQkJCSAgIFNFUV9UT19TTihzYykpOworCisJCQlzaCA9IGlkeCAtIHN0YXJ0OworCQkJaWYgKHNoID4gNjQpIHsKKwkJCQlzaCA9IChzdGFydCAtIGlkeCkgKyAweGZmOworCQkJCWJpdG1hcCA9IGJpdG1hcCA8PCBzaDsKKwkJCQlzaCA9IDA7CisJCQkJc3RhcnQgPSBpZHg7CisJCQl9IGVsc2UgaWYgKHNoIDwgLTY0KQorCQkJCXNoID0gMHhmZiAtIChzdGFydCAtIGlkeCk7CisJCQllbHNlIGlmIChzaCA8IDApIHsKKwkJCQlzaCA9IHN0YXJ0IC0gaWR4OworCQkJCXN0YXJ0ID0gaWR4OworCQkJCWJpdG1hcCA9IGJpdG1hcCA8PCBzaDsKKwkJCQlzaCA9IDA7CisJCQl9CisJCQliaXRtYXAgfD0gMVVMTCA8PCBzaDsKKwkJCURfVFhfUkVQTFkoInN0YXJ0PSVkIGJpdG1hcD0weCVsbHhcbiIsIHN0YXJ0LAorCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYml0bWFwKTsKKwkJfQorCisJCWFnZy0+Yml0bWFwID0gYml0bWFwOworCQlhZ2ctPnN0YXJ0X2lkeCA9IHN0YXJ0OworCQlEX1RYX1JFUExZKCJGcmFtZXMgJWQgc3RhcnRfaWR4PSVkIGJpdG1hcD0weCVsbHhcbiIsCisJCQkgICBhZ2ctPmZyYW1lX2NvdW50LCBhZ2ctPnN0YXJ0X2lkeCwKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWdnLT5iaXRtYXApOworCisJCWlmIChiaXRtYXApCisJCQlhZ2ctPndhaXRfZm9yX2JhID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OAoraWw0OTY1X2ZpbmRfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNvbnN0IHU4ICogYWRkcikKK3sKKwlpbnQgaTsKKwlpbnQgc3RhcnQgPSAwOworCWludCByZXQgPSBJTF9JTlZBTElEX1NUQVRJT047CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgoaWwtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpKQorCQlzdGFydCA9IElMX1NUQV9JRDsKKworCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihhZGRyKSkKKwkJcmV0dXJuIGlsLT5jdHguYmNhc3Rfc3RhX2lkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IHN0YXJ0OyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykKKwkJaWYgKGlsLT5zdGF0aW9uc1tpXS51c2VkICYmCisJCSAgICAoIWNvbXBhcmVfZXRoZXJfYWRkcihpbC0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyLCBhZGRyKSkpIHsKKwkJCXJldCA9IGk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJRF9BU1NPQygiY2FuIG5vdCBmaW5kIFNUQSAlcE0gdG90YWwgJWRcbiIsIGFkZHIsIGlsLT5udW1fc3RhdGlvbnMpOworCitvdXQ6CisJLyoKKwkgKiBJdCBtYXkgYmUgcG9zc2libGUgdGhhdCBtb3JlIGNvbW1hbmRzIGludGVyYWN0aW5nIHdpdGggc3RhdGlvbnMKKwkgKiBhcnJpdmUgYmVmb3JlIHdlIGNvbXBsZXRlZCBwcm9jZXNzaW5nIHRoZSBhZGRpbmcgb2YKKwkgKiBzdGF0aW9uCisJICovCisJaWYgKHJldCAhPSBJTF9JTlZBTElEX1NUQVRJT04gJiYKKwkgICAgKCEoaWwtPnN0YXRpb25zW3JldF0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpIHx8CisJICAgICAoKGlsLT5zdGF0aW9uc1tyZXRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSAmJgorCSAgICAgIChpbC0+c3RhdGlvbnNbcmV0XS51c2VkICYgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MpKSkpIHsKKwkJSUxfRVJSKCJSZXF1ZXN0ZWQgc3RhdGlvbiBpbmZvIGZvciBzdGEgJWQgYmVmb3JlIHJlYWR5LlxuIiwKKwkJICAgICAgIHJldCk7CisJCXJldCA9IElMX0lOVkFMSURfU1RBVElPTjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraWw0OTY1X2dldF9yYV9zdGFfaWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQoreworCWlmIChpbC0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CisJCXJldHVybiBJTF9BUF9JRDsKKwl9IGVsc2UgeworCQl1OCAqZGEgPSBpZWVlODAyMTFfZ2V0X0RBKGhkcik7CisJCXJldHVybiBpbDQ5NjVfZmluZF9zdGF0aW9uKGlsLCBkYSk7CisJfQorfQorCisvKioKKyAqIGlsNDk2NV9oZGxfdHggLSBIYW5kbGUgc3RhbmRhcmQgKG5vbi1hZ2dyZWdhdGlvbikgVHggcmVzcG9uc2UKKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9oZGxfdHgoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwl1MTYgc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7CisJaW50IHR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXF1ZW5jZSk7CisJaW50IGlkeCA9IFNFUV9UT19JRFgoc2VxdWVuY2UpOworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaWw0OTY1X3R4X3Jlc3AgKnR4X3Jlc3AgPSAodm9pZCAqKSZwa3QtPnUucmF3WzBdOworCXUzMiBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0eF9yZXNwLT51LnN0YXR1cyk7CisJaW50IHVuaW5pdGlhbGl6ZWRfdmFyKHRpZCk7CisJaW50IHN0YV9pZDsKKwlpbnQgZnJlZWQ7CisJdTggKnFjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGlkeCA+PSB0eHEtPnEubl9iZCB8fCBpbF9xdWV1ZV91c2VkKCZ0eHEtPnEsIGlkeCkgPT0gMCkgeworCQlJTF9FUlIoIlJlYWQgaWR4IGZvciBETUEgcXVldWUgdHhxX2lkICglZCkgaWR4ICVkICIKKwkJICAgICAgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkXG4iLCB0eHFfaWQsIGlkeCwKKwkJICAgICAgIHR4cS0+cS5uX2JkLCB0eHEtPnEud3JpdGVfcHRyLCB0eHEtPnEucmVhZF9wdHIpOworCQlyZXR1cm47CisJfQorCisJdHhxLT50aW1lX3N0YW1wID0gamlmZmllczsKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQih0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYik7CisJbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKKworCWhkciA9IGlsX3R4X3F1ZXVlX2dldF9oZHIoaWwsIHR4cV9pZCwgaWR4KTsKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKKwkJdGlkID0gcWNbMF0gJiAweGY7CisJfQorCisJc3RhX2lkID0gaWw0OTY1X2dldF9yYV9zdGFfaWQoaWwsIGhkcik7CisJaWYgKHR4cS0+c2NoZWRfcmV0cnkgJiYgdW5saWtlbHkoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikpIHsKKwkJSUxfRVJSKCJTdGF0aW9uIG5vdCBrbm93blxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWYgKHR4cS0+c2NoZWRfcmV0cnkpIHsKKwkJY29uc3QgdTMyIHNjZF9zc24gPSBpbDQ5NjVfZ2V0X3NjZF9zc24odHhfcmVzcCk7CisJCXN0cnVjdCBpbF9odF9hZ2cgKmFnZyA9IE5VTEw7CisJCVdBUk5fT04oIXFjKTsKKworCQlhZ2cgPSAmaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnOworCisJCWlsNDk2NV90eF9zdGF0dXNfcmVwbHlfdHgoaWwsIGFnZywgdHhfcmVzcCwgdHhxX2lkLCBpZHgpOworCisJCS8qIGNoZWNrIGlmIEJBUiBpcyBuZWVkZWQgKi8KKwkJaWYgKCh0eF9yZXNwLT5mcmFtZV9jb3VudCA9PSAxKSAmJgorCQkgICAgIWlsNDk2NV9pc190eF9zdWNjZXNzKHN0YXR1cykpCisJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVV9OT19CQUNLOworCisJCWlmICh0eHEtPnEucmVhZF9wdHIgIT0gKHNjZF9zc24gJiAweGZmKSkgeworCQkJaWR4ID0gaWxfcXVldWVfZGVjX3dyYXAoc2NkX3NzbiAmIDB4ZmYsIHR4cS0+cS5uX2JkKTsKKwkJCURfVFhfUkVQTFkoIlJldHJ5IHNjaGVkdWxlciByZWNsYWltIHNjZF9zc24gIgorCQkJCSAgICIlZCBpZHggJWRcbiIsIHNjZF9zc24sIGlkeCk7CisJCQlmcmVlZCA9IGlsNDk2NV90eF9xdWV1ZV9yZWNsYWltKGlsLCB0eHFfaWQsIGlkeCk7CisJCQlpZiAocWMpCisJCQkJaWw0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShpbCwgc3RhX2lkLCB0aWQsCisJCQkJCQkJICBmcmVlZCk7CisKKwkJCWlmIChpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCAmJgorCQkJICAgIGlsX3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrICYmCisJCQkgICAgYWdnLT5zdGF0ZSAhPSBJTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQSkKKwkJCQlpbF93YWtlX3F1ZXVlKGlsLCB0eHEpOworCQl9CisJfSBlbHNlIHsKKwkJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmNvdW50ID0gdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSArIDE7CisJCWluZm8tPmZsYWdzIHw9IGlsNDk2NV90eF9zdGF0dXNfdG9fbWFjODAyMTEoc3RhdHVzKTsKKwkJaWw0OTY1X2h3cmF0ZV90b190eF9jb250cm9sKGlsLAorCQkJCQkgICAgbGUzMl90b19jcHUodHhfcmVzcC0+cmF0ZV9uX2ZsYWdzKSwKKwkJCQkJICAgIGluZm8pOworCisJCURfVFhfUkVQTFkoIlRYUSAlZCBzdGF0dXMgJXMgKDB4JTA4eCkgIgorCQkJICAgInJhdGVfbl9mbGFncyAweCV4IHJldHJpZXMgJWRcbiIsIHR4cV9pZCwKKwkJCSAgIGlsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24oc3RhdHVzKSwgc3RhdHVzLAorCQkJICAgbGUzMl90b19jcHUodHhfcmVzcC0+cmF0ZV9uX2ZsYWdzKSwKKwkJCSAgIHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUpOworCisJCWZyZWVkID0gaWw0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oaWwsIHR4cV9pZCwgaWR4KTsKKwkJaWYgKHFjICYmIGxpa2VseShzdGFfaWQgIT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKKwkJCWlsNDk2NV9mcmVlX3RmZHNfaW5fcXVldWUoaWwsIHN0YV9pZCwgdGlkLCBmcmVlZCk7CisJCWVsc2UgaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pCisJCQlEX1RYX1JFUExZKCJTdGF0aW9uIG5vdCBrbm93blxuIik7CisKKwkJaWYgKGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkICYmCisJCSAgICBpbF9xdWV1ZV9zcGFjZSgmdHhxLT5xKSA+IHR4cS0+cS5sb3dfbWFyaykKKwkJCWlsX3dha2VfcXVldWUoaWwsIHR4cSk7CisJfQorCWlmIChxYyAmJiBsaWtlbHkoc3RhX2lkICE9IElMX0lOVkFMSURfU1RBVElPTikpCisJCWlsNDk2NV90eHFfY2hlY2tfZW1wdHkoaWwsIHN0YV9pZCwgdGlkLCB0eHFfaWQpOworCisJaWw0OTY1X2NoZWNrX2Fib3J0X3N0YXR1cyhpbCwgdHhfcmVzcC0+ZnJhbWVfY291bnQsIHN0YXR1cyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9oZGxfYmVhY29uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsNDk2NV9iZWFjb25fbm90aWYgKmJlYWNvbiA9ICh2b2lkICopcGt0LT51LnJhdzsKKwl1OCByYXRlIF9fbWF5YmVfdW51c2VkID0KKwkgICAgaWw0OTY1X2h3X2dldF9yYXRlKGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIucmF0ZV9uX2ZsYWdzKTsKKworCURfUlgoImJlYWNvbiBzdGF0dXMgJSN4LCByZXRyaWVzOiVkIGlic3NtZ3I6JWQgIgorCSAgICAgInRzZjoweCUuOHglLjh4IHJhdGU6JWRcbiIsCisJICAgICBsZTMyX3RvX2NwdShiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLnUuc3RhdHVzKSAmIFRYX1NUQVRVU19NU0ssCisJICAgICBiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLmZhaWx1cmVfZnJhbWUsCisJICAgICBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyksCisJICAgICBsZTMyX3RvX2NwdShiZWFjb24tPmhpZ2hfdHNmKSwgbGUzMl90b19jcHUoYmVhY29uLT5sb3dfdHNmKSwgcmF0ZSk7CisKKwlpbC0+aWJzc19tYW5hZ2VyID0gbGUzMl90b19jcHUoYmVhY29uLT5pYnNzX21ncl9zdGF0dXMpOworfQorCisvKiBTZXQgdXAgNDk2NS1zcGVjaWZpYyBSeCBmcmFtZSByZXBseSBoYW5kbGVycyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9oYW5kbGVyX3NldHVwKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBMZWdhY3kgUnggZnJhbWVzICovCisJaWwtPmhhbmRsZXJzW05fUlhdID0gaWw0OTY1X2hkbF9yeDsKKwkvKiBUeCByZXNwb25zZSAqLworCWlsLT5oYW5kbGVyc1tDX1RYXSA9IGlsNDk2NV9oZGxfdHg7CisJaWwtPmhhbmRsZXJzW05fQkVBQ09OXSA9IGlsNDk2NV9oZGxfYmVhY29uOworfQorCitzdGF0aWMgc3RydWN0IGlsX2hjbWRfb3BzIGlsNDk2NV9oY21kID0geworCS5yeG9uX2Fzc29jID0gaWw0OTY1X3NlbmRfcnhvbl9hc3NvYywKKwkuY29tbWl0X3J4b24gPSBpbDQ5NjVfY29tbWl0X3J4b24sCisJLnNldF9yeG9uX2NoYWluID0gaWw0OTY1X3NldF9yeG9uX2NoYWluLAorfTsKKworc3RhdGljIHZvaWQKK2lsNDk2NV9wb3N0X3NjYW4oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJLyoKKwkgKiBTaW5jZSBzZXR0aW5nIHRoZSBSWE9OIG1heSBoYXZlIGJlZW4gZGVmZXJyZWQgd2hpbGUKKwkgKiBwZXJmb3JtaW5nIHRoZSBzY2FuLCBmaXJlIG9uZSBvZmYgaWYgbmVlZGVkCisJICovCisJaWYgKG1lbWNtcCgmY3R4LT5zdGFnaW5nLCAmY3R4LT5hY3RpdmUsIHNpemVvZihjdHgtPnN0YWdpbmcpKSkKKwkJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcG9zdF9hc3NvY2lhdGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSBOVUxMOworCWludCByZXQgPSAwOworCisJaWYgKCF2aWYgfHwgIWlsLT5pc19vcGVuKQorCQlyZXR1cm47CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMjAwKTsKKworCWNvbmYgPSAmaWwtPmh3LT5jb25mOworCisJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOworCWlsX2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCisJcmV0ID0gaWxfc2VuZF9yeG9uX3RpbWluZyhpbCwgY3R4KTsKKwlpZiAocmV0KQorCQlJTF9XQVJOKCJSWE9OIHRpbWluZyAtICIgIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKKworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCisJaWxfc2V0X3J4b25faHQoaWwsICZpbC0+Y3VycmVudF9odF9jb25maWcpOworCisJaWYgKGlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCisJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisKKwljdHgtPnN0YWdpbmcuYXNzb2NfaWQgPSBjcHVfdG9fbGUxNih2aWYtPmJzc19jb25mLmFpZCk7CisKKwlEX0FTU09DKCJhc3NvYyBpZCAlZCBiZWFjb24gaW50ZXJ2YWwgJWRcbiIsIHZpZi0+YnNzX2NvbmYuYWlkLAorCQl2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQpOworCisJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCWVsc2UKKwkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisKKwlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7CisJCWlmICh2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCQllbHNlCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCX0KKworCWlsX2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCisJRF9BU1NPQygiQXNzb2NpYXRlZCBhcyAlZCB0bzogJXBNXG4iLCB2aWYtPmJzc19jb25mLmFpZCwKKwkJY3R4LT5hY3RpdmUuYnNzaWRfYWRkcik7CisKKwlzd2l0Y2ggKHZpZi0+dHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJaWw0OTY1X3NlbmRfYmVhY29uX2NtZChpbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX0VSUigiJXMgU2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gJWQgbW9kZVxuIiwgX19mdW5jX18sCisJCSAgICAgICB2aWYtPnR5cGUpOworCQlicmVhazsKKwl9CisKKwkvKiB0aGUgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gd2lsbCBlbmFibGVkIFBNIHVwb24gY29tcGxldGlvbgorCSAqIElmIGNoYWluIG5vaXNlIGhhcyBhbHJlYWR5IGJlZW4gcnVuLCB0aGVuIHdlIG5lZWQgdG8gZW5hYmxlCisJICogcG93ZXIgbWFuYWdlbWVudCBoZXJlICovCisJaWYgKGlsLT5jaGFpbl9ub2lzZV9kYXRhLnN0YXRlID09IElMX0NIQUlOX05PSVNFX0RPTkUpCisJCWlsX3Bvd2VyX3VwZGF0ZV9tb2RlKGlsLCBmYWxzZSk7CisKKwkvKiBFbmFibGUgUnggZGlmZmVyZW50aWFsIGdhaW4gYW5kIHNlbnNpdGl2aXR5IGNhbGlicmF0aW9ucyAqLworCWlsNDk2NV9jaGFpbl9ub2lzZV9yZXNldChpbCk7CisJaWwtPnN0YXJ0X2NhbGliID0gMTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9jb25maWdfYXAoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKKwlpbnQgcmV0ID0gMDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJLyogVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgZG9uZSBvbmx5IGF0IEFQIGJyaW5nIHVwICovCisJaWYgKCFpbF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKSB7CisKKwkJLyogUlhPTiAtIHVuYXNzb2MgKHRvIHNldCB0aW1pbmcgY29tbWFuZCkgKi8KKwkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKKworCQkvKiBSWE9OIFRpbWluZyAqLworCQlyZXQgPSBpbF9zZW5kX3J4b25fdGltaW5nKGlsLCBjdHgpOworCQlpZiAocmV0KQorCQkJSUxfV0FSTigiUlhPTiB0aW1pbmcgZmFpbGVkIC0gIgorCQkJCSJBdHRlbXB0aW5nIHRvIGNvbnRpbnVlLlxuIik7CisKKwkJLyogQVAgaGFzIGFsbCBhbnRlbm5hcyAqLworCQlpbC0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zID0gaWwtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQ7CisJCWlsX3NldF9yeG9uX2h0KGlsLCAmaWwtPmN1cnJlbnRfaHRfY29uZmlnKTsKKwkJaWYgKGlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCisJCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCBjdHgpOworCisJCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IDA7CisKKwkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKwkJZWxzZQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisKKwkJaWYgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgeworCQkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCisJCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCQkJZWxzZQorCQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCX0KKwkJLyogbmVlZCB0byBzZW5kIGJlYWNvbiBjbWQgYmVmb3JlIGNvbW1pdHRpbmcgYXNzb2MgUlhPTiEgKi8KKwkJaWw0OTY1X3NlbmRfYmVhY29uX2NtZChpbCk7CisJCS8qIHJlc3RvcmUgUlhPTiBhc3NvYyAqLworCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKKwkJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7CisJfQorCWlsNDk2NV9zZW5kX2JlYWNvbl9jbWQoaWwpOworfQorCitzdGF0aWMgc3RydWN0IGlsX2hjbWRfdXRpbHNfb3BzIGlsNDk2NV9oY21kX3V0aWxzID0geworCS5nZXRfaGNtZF9zaXplID0gaWw0OTY1X2dldF9oY21kX3NpemUsCisJLmJ1aWxkX2FkZHN0YV9oY21kID0gaWw0OTY1X2J1aWxkX2FkZHN0YV9oY21kLAorCS5yZXF1ZXN0X3NjYW4gPSBpbDQ5NjVfcmVxdWVzdF9zY2FuLAorCS5wb3N0X3NjYW4gPSBpbDQ5NjVfcG9zdF9zY2FuLAorfTsKKworc3RhdGljIHN0cnVjdCBpbF9saWJfb3BzIGlsNDk2NV9saWIgPSB7CisJLnNldF9od19wYXJhbXMgPSBpbDQ5NjVfaHdfc2V0X2h3X3BhcmFtcywKKwkudHhxX3VwZGF0ZV9ieXRlX2NudF90YmwgPSBpbDQ5NjVfdHhxX3VwZGF0ZV9ieXRlX2NudF90YmwsCisJLnR4cV9hdHRhY2hfYnVmX3RvX3RmZCA9IGlsNDk2NV9od190eHFfYXR0YWNoX2J1Zl90b190ZmQsCisJLnR4cV9mcmVlX3RmZCA9IGlsNDk2NV9od190eHFfZnJlZV90ZmQsCisJLnR4cV9pbml0ID0gaWw0OTY1X2h3X3R4X3F1ZXVlX2luaXQsCisJLmhhbmRsZXJfc2V0dXAgPSBpbDQ5NjVfaGFuZGxlcl9zZXR1cCwKKwkuaXNfdmFsaWRfcnRjX2RhdGFfYWRkciA9IGlsNDk2NV9od192YWxpZF9ydGNfZGF0YV9hZGRyLAorCS5pbml0X2FsaXZlX3N0YXJ0ID0gaWw0OTY1X2luaXRfYWxpdmVfc3RhcnQsCisJLmxvYWRfdWNvZGUgPSBpbDQ5NjVfbG9hZF9ic20sCisJLmR1bXBfbmljX2Vycm9yX2xvZyA9IGlsNDk2NV9kdW1wX25pY19lcnJvcl9sb2csCisJLmR1bXBfZmggPSBpbDQ5NjVfZHVtcF9maCwKKwkuc2V0X2NoYW5uZWxfc3dpdGNoID0gaWw0OTY1X2h3X2NoYW5uZWxfc3dpdGNoLAorCS5hcG1fb3BzID0geworCQkgICAgLmluaXQgPSBpbF9hcG1faW5pdCwKKwkJICAgIC5jb25maWcgPSBpbDQ5NjVfbmljX2NvbmZpZywKKwkJICAgIH0sCisJLmVlcHJvbV9vcHMgPSB7CisJCSAgICAgICAucmVndWxhdG9yeV9iYW5kcyA9IHsKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMV9DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMl9DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfM19DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNF9DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUywKKwkJCQkJICAgIEVFUFJPTV80OTY1X1JFR1VMQVRPUllfQkFORF8yNF9IVDQwX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzUyX0hUNDBfQ0hBTk5FTFN9LAorCQkgICAgICAgLmFjcXVpcmVfc2VtYXBob3JlID0gaWw0OTY1X2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZSwKKwkJICAgICAgIC5yZWxlYXNlX3NlbWFwaG9yZSA9IGlsNDk2NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUsCisJCSAgICAgICB9LAorCS5zZW5kX3R4X3Bvd2VyID0gaWw0OTY1X3NlbmRfdHhfcG93ZXIsCisJLnVwZGF0ZV9jaGFpbl9mbGFncyA9IGlsNDk2NV91cGRhdGVfY2hhaW5fZmxhZ3MsCisJLnRlbXBfb3BzID0geworCQkgICAgIC50ZW1wZXJhdHVyZSA9IGlsNDk2NV90ZW1wZXJhdHVyZV9jYWxpYiwKKwkJICAgICB9LAorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJLmRlYnVnZnNfb3BzID0geworCQkJLnJ4X3N0YXRzX3JlYWQgPSBpbDQ5NjVfdWNvZGVfcnhfc3RhdHNfcmVhZCwKKwkJCS50eF9zdGF0c19yZWFkID0gaWw0OTY1X3Vjb2RlX3R4X3N0YXRzX3JlYWQsCisJCQkuZ2VuZXJhbF9zdGF0c19yZWFkID0gaWw0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZCwKKwkJCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWxfbGVnYWN5X29wcyBpbDQ5NjVfbGVnYWN5X29wcyA9IHsKKwkucG9zdF9hc3NvY2lhdGUgPSBpbDQ5NjVfcG9zdF9hc3NvY2lhdGUsCisJLmNvbmZpZ19hcCA9IGlsNDk2NV9jb25maWdfYXAsCisJLm1hbmFnZV9pYnNzX3N0YXRpb24gPSBpbDQ5NjVfbWFuYWdlX2lic3Nfc3RhdGlvbiwKKwkudXBkYXRlX2JjYXN0X3N0YXRpb25zID0gaWw0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9ucywKK307CisKK3N0cnVjdCBpZWVlODAyMTFfb3BzIGlsNDk2NV9od19vcHMgPSB7CisJLnR4ID0gaWw0OTY1X21hY190eCwKKwkuc3RhcnQgPSBpbDQ5NjVfbWFjX3N0YXJ0LAorCS5zdG9wID0gaWw0OTY1X21hY19zdG9wLAorCS5hZGRfaW50ZXJmYWNlID0gaWxfbWFjX2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UgPSBpbF9tYWNfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY2hhbmdlX2ludGVyZmFjZSA9IGlsX21hY19jaGFuZ2VfaW50ZXJmYWNlLAorCS5jb25maWcgPSBpbF9tYWNfY29uZmlnLAorCS5jb25maWd1cmVfZmlsdGVyID0gaWw0OTY1X2NvbmZpZ3VyZV9maWx0ZXIsCisJLnNldF9rZXkgPSBpbDQ5NjVfbWFjX3NldF9rZXksCisJLnVwZGF0ZV90a2lwX2tleSA9IGlsNDk2NV9tYWNfdXBkYXRlX3RraXBfa2V5LAorCS5jb25mX3R4ID0gaWxfbWFjX2NvbmZfdHgsCisJLnJlc2V0X3RzZiA9IGlsX21hY19yZXNldF90c2YsCisJLmJzc19pbmZvX2NoYW5nZWQgPSBpbF9tYWNfYnNzX2luZm9fY2hhbmdlZCwKKwkuYW1wZHVfYWN0aW9uID0gaWw0OTY1X21hY19hbXBkdV9hY3Rpb24sCisJLmh3X3NjYW4gPSBpbF9tYWNfaHdfc2NhbiwKKwkuc3RhX2FkZCA9IGlsNDk2NV9tYWNfc3RhX2FkZCwKKwkuc3RhX3JlbW92ZSA9IGlsX21hY19zdGFfcmVtb3ZlLAorCS5jaGFubmVsX3N3aXRjaCA9IGlsNDk2NV9tYWNfY2hhbm5lbF9zd2l0Y2gsCisJLnR4X2xhc3RfYmVhY29uID0gaWxfbWFjX3R4X2xhc3RfYmVhY29uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9vcHMgaWw0OTY1X29wcyA9IHsKKwkubGliID0gJmlsNDk2NV9saWIsCisJLmhjbWQgPSAmaWw0OTY1X2hjbWQsCisJLnV0aWxzID0gJmlsNDk2NV9oY21kX3V0aWxzLAorCS5sZWQgPSAmaWw0OTY1X2xlZF9vcHMsCisJLmxlZ2FjeSA9ICZpbDQ5NjVfbGVnYWN5X29wcywKKwkuaWVlZTgwMjExX29wcyA9ICZpbDQ5NjVfaHdfb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBpbF9iYXNlX3BhcmFtcyBpbDQ5NjVfYmFzZV9wYXJhbXMgPSB7CisJLmVlcHJvbV9zaXplID0gSUw0OTY1X0VFUFJPTV9JTUdfU0laRSwKKwkubnVtX29mX3F1ZXVlcyA9IElMNDlfTlVNX1FVRVVFUywKKwkubnVtX29mX2FtcGR1X3F1ZXVlcyA9IElMNDlfTlVNX0FNUERVX1FVRVVFUywKKwkucGxsX2NmZ192YWwgPSAwLAorCS5zZXRfbDBzID0gdHJ1ZSwKKwkudXNlX2JzbSA9IHRydWUsCisJLmxlZF9jb21wZW5zYXRpb24gPSA2MSwKKwkuY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMgPSBJTDQ5NjVfQ0FMX05VTV9CRUFDT05TLAorCS53ZF90aW1lb3V0ID0gSUxfREVGX1dEX1RJTUVPVVQsCisJLnRlbXBlcmF0dXJlX2tlbHZpbiA9IHRydWUsCisJLnVjb2RlX3RyYWNpbmcgPSB0cnVlLAorCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAorfTsKKworc3RydWN0IGlsX2NmZyBpbDQ5NjVfY2ZnID0geworCS5uYW1lID0gIkludGVsKFIpIFdpcmVsZXNzIFdpRmkgTGluayA0OTY1QUdOIiwKKwkuZndfbmFtZV9wcmUgPSBJTDQ5NjVfRldfUFJFLAorCS51Y29kZV9hcGlfbWF4ID0gSUw0OTY1X1VDT0RFX0FQSV9NQVgsCisJLnVjb2RlX2FwaV9taW4gPSBJTDQ5NjVfVUNPREVfQVBJX01JTiwKKwkuc2t1ID0gSUxfU0tVX0EgfCBJTF9TS1VfRyB8IElMX1NLVV9OLAorCS52YWxpZF90eF9hbnQgPSBBTlRfQUIsCisJLnZhbGlkX3J4X2FudCA9IEFOVF9BQkMsCisJLmVlcHJvbV92ZXIgPSBFRVBST01fNDk2NV9FRVBST01fVkVSU0lPTiwKKwkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV80OTY1X1RYX1BPV0VSX1ZFUlNJT04sCisJLm9wcyA9ICZpbDQ5NjVfb3BzLAorCS5tb2RfcGFyYW1zID0gJmlsNDk2NV9tb2RfcGFyYW1zLAorCS5iYXNlX3BhcmFtcyA9ICZpbDQ5NjVfYmFzZV9wYXJhbXMsCisJLmxlZF9tb2RlID0gSUxfTEVEX0JMSU5LLAorCS8qCisJICogRm9yY2UgdXNlIG9mIGNoYWlucyBCIGFuZCBDIGZvciBzY2FuIFJYIG9uIDUgR0h6IGJhbmQKKwkgKiBiZWNhdXNlIHRoZSBkZXZpY2UgaGFzIG9mZi1jaGFubmVsIHJlY2VwdGlvbiBvbiBjaGFpbiBBLgorCSAqLworCS5zY2FuX3J4X2FudGVubmFzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gQU5UX0JDLAorfTsKKworLyogTW9kdWxlIGZpcm13YXJlICovCitNT0RVTEVfRklSTVdBUkUoSUw0OTY1X01PRFVMRV9GSVJNV0FSRShJTDQ5NjVfVUNPREVfQVBJX01BWCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDcyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LmgKQEAgLTAsMCArMSwxMzA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX2lsXzQ5NjVfaF9fCisjZGVmaW5lIF9faWxfNDk2NV9oX18KKworc3RydWN0IGlsX3J4X3F1ZXVlOworc3RydWN0IGlsX3J4X2J1ZjsKK3N0cnVjdCBpbF9yeF9wa3Q7CitzdHJ1Y3QgaWxfdHhfcXVldWU7CitzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0OworCisvKiBjb25maWd1cmF0aW9uIGZvciB0aGUgXzQ5NjUgZGV2aWNlcyAqLworZXh0ZXJuIHN0cnVjdCBpbF9jZmcgaWw0OTY1X2NmZzsKKworZXh0ZXJuIHN0cnVjdCBpbF9tb2RfcGFyYW1zIGlsNDk2NV9tb2RfcGFyYW1zOworCitleHRlcm4gc3RydWN0IGllZWU4MDIxMV9vcHMgaWw0OTY1X2h3X29wczsKKworLyogdHggcXVldWUgKi8KK3ZvaWQgaWw0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIGludCB0aWQsCisJCQkgICAgICAgaW50IGZyZWVkKTsKKworLyogUlhPTiAqLwordm9pZCBpbDQ5NjVfc2V0X3J4b25fY2hhaW4oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpOworCisvKiB1Q29kZSAqLworaW50IGlsNDk2NV92ZXJpZnlfdWNvZGUoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogbGliICovCit2b2lkIGlsNDk2NV9jaGVja19hYm9ydF9zdGF0dXMoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBmcmFtZV9jb3VudCwgdTMyIHN0YXR1cyk7CisKK3ZvaWQgaWw0OTY1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpOworaW50IGlsNDk2NV9yeF9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpOworaW50IGlsNDk2NV9od19uaWNfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsNDk2NV9kdW1wX2ZoKHN0cnVjdCBpbF9wcml2ICppbCwgY2hhciAqKmJ1ZiwgYm9vbCBkaXNwbGF5KTsKKworLyogcnggKi8KK3ZvaWQgaWw0OTY1X3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWw0OTY1X3J4X3JlcGxlbmlzaChzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbDQ5NjVfcnhfcmVwbGVuaXNoX25vdyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbDQ5NjVfcnhfcXVldWVfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxKTsKK2ludCBpbDQ5NjVfcnhxX3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2ludCBpbDQ5NjVfaHdyYXRlX3RvX21hYzgwMjExX2lkeCh1MzIgcmF0ZV9uX2ZsYWdzLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpOwordm9pZCBpbDQ5NjVfaGRsX3J4KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKK3ZvaWQgaWw0OTY1X2hkbF9yeF9waHkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbDQ5NjVfcnhfaGFuZGxlKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qIHR4ICovCit2b2lkIGlsNDk2NV9od190eHFfZnJlZV90ZmQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7CitpbnQgaWw0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJCSAgICBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sIHU4IHJlc2V0LCB1OCBwYWQpOworaW50IGlsNDk2NV9od190eF9xdWV1ZV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpOwordm9pZCBpbDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgcmF0ZV9uX2ZsYWdzLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8pOworaW50IGlsNDk2NV90eF9za2Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBpbDQ5NjVfdHhfYWdnX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqIHNzbik7CitpbnQgaWw0OTY1X3R4X2FnZ19zdG9wKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpOworaW50IGlsNDk2NV90eHFfY2hlY2tfZW1wdHkoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgc3RhX2lkLCB1OCB0aWQsIGludCB0eHFfaWQpOwordm9pZCBpbDQ5NjVfaGRsX2NvbXByZXNzZWRfYmEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOworaW50IGlsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCwgaW50IGlkeCk7Cit2b2lkIGlsNDk2NV9od190eHFfY3R4X2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2ludCBpbDQ5NjVfdHhxX2N0eF9hbGxvYyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbDQ5NjVfdHhxX2N0eF9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbDQ5NjVfdHhxX2N0eF9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV90eHFfc2V0X3NjaGVkKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG1hc2spOworCisvKgorICogQWNxdWlyZSBpbC0+bG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICEKKyAqLwordm9pZCBpbDQ5NjVfc2V0X3dyX3B0cnMoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCB1MzIgaWR4KTsKKy8qKgorICogaWw0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMgLSAob3B0aW9uYWxseSkgc3RhcnQgVHgvQ21kIHF1ZXVlCisgKiBAdHhfZmlmb19pZDogVHggRE1BL0ZJRk8gY2hhbm5lbCAocmFuZ2UgMC03KSB0aGF0IHRoZSBxdWV1ZSB3aWxsIGZlZWQKKyAqIEBzY2RfcmV0cnk6ICgxKSBJbmRpY2F0ZXMgcXVldWUgd2lsbCBiZSB1c2VkIGluIGFnZ3JlZ2F0aW9uIG1vZGUKKyAqCisgKiBOT1RFOiAgQWNxdWlyZSBpbC0+bG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICEKKyAqLwordm9pZCBpbDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJCWludCB0eF9maWZvX2lkLCBpbnQgc2NkX3JldHJ5KTsKKwordTggaWw0OTY1X3RvZ2dsZV90eF9hbnQoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBhbnRfaWR4LCB1OCB2YWxpZCk7CisKKy8qIHJ4ICovCit2b2lkIGlsNDk2NV9oZGxfbWlzc2VkX2JlYWNvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7Citib29sIGlsNDk2NV9nb29kX3BsY3BfaGVhbHRoKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3BrdCAqcGt0KTsKK3ZvaWQgaWw0OTY1X2hkbF9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7Cit2b2lkIGlsNDk2NV9oZGxfY19zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7CisKKy8qIHNjYW4gKi8KK2ludCBpbDQ5NjVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CisKKy8qIHN0YXRpb24gbWdtdCAqLworaW50IGlsNDk2NV9tYW5hZ2VfaWJzc19zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgICBib29sIGFkZCk7CisKKy8qIGhjbWQgKi8KK2ludCBpbDQ5NjVfc2VuZF9iZWFjb25fY21kKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK2NvbnN0IGNoYXIgKmlsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cyk7CisjZWxzZQorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK2lsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKK3sKKwlyZXR1cm4gIiI7Cit9CisjZW5kaWYKKworLyogc3RhdGlvbiBtYW5hZ2VtZW50ICovCitpbnQgaWw0OTY1X2FsbG9jX2JjYXN0X3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpOworaW50IGlsNDk2NV9hZGRfYnNzaWRfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgICAgY29uc3QgdTggKmFkZHIsIHU4ICpzdGFfaWRfcik7CitpbnQgaWw0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKK2ludCBpbDQ5NjVfc2V0X2RlZmF1bHRfd2VwX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpOworaW50IGlsNDk2NV9yZXN0b3JlX2RlZmF1bHRfd2VwX2tleXMoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpOworaW50IGlsNDk2NV9zZXRfZHluYW1pY19rZXkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksIHU4IHN0YV9pZCk7CitpbnQgaWw0OTY1X3JlbW92ZV9keW5hbWljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgdTggc3RhX2lkKTsKK3ZvaWQgaWw0OTY1X3VwZGF0ZV90a2lwX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUzMiBpdjMyLAorCQkJICAgIHUxNiAqcGhhc2Uxa2V5KTsKK2ludCBpbDQ5NjVfc3RhX3R4X21vZGlmeV9lbmFibGVfdGlkKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHN0YV9pZCwgaW50IHRpZCk7CitpbnQgaWw0OTY1X3N0YV9yeF9hZ2dfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgIGludCB0aWQsIHUxNiBzc24pOworaW50IGlsNDk2NV9zdGFfcnhfYWdnX3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgaW50IHRpZCk7Cit2b2lkIGlsNDk2NV9zdGFfbW9kaWZ5X3NsZWVwX3R4X2NvdW50KHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHN0YV9pZCwgaW50IGNudCk7CitpbnQgaWw0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKiByYXRlICovCitzdGF0aWMgaW5saW5lIHU4CitpbDQ5NjVfaHdfZ2V0X3JhdGUoX19sZTMyIHJhdGVfbl9mbGFncykKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUocmF0ZV9uX2ZsYWdzKSAmIDB4RkY7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19sZTMyCitpbDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyh1OCByYXRlLCB1MzIgZmxhZ3MpCit7CisJcmV0dXJuIGNwdV90b19sZTMyKGZsYWdzIHwgKHUzMikgcmF0ZSk7Cit9CisKKy8qIGVlcHJvbSAqLwordm9pZCBpbDQ5NjVfZWVwcm9tX2dldF9tYWMoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsLCB1OCAqIG1hYyk7CitpbnQgaWw0OTY1X2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbDQ5NjVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWw0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qIG1hYzgwMjExIGhhbmRsZXJzIChmb3IgNDk2NSkgKi8KK3ZvaWQgaWw0OTY1X21hY190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgaWw0OTY1X21hY19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIGlsNDk2NV9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Cit2b2lkIGlsNDk2NV9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKKwkJCSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywgdTY0IG11bHRpY2FzdCk7CitpbnQgaWw0OTY1X21hY19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpOwordm9pZCBpbDQ5NjVfbWFjX3VwZGF0ZV90a2lwX2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTMyIGl2MzIsCisJCQkJdTE2ICpwaGFzZTFrZXkpOworaW50IGlsNDk2NV9tYWNfYW1wZHVfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKiBzc24sCisJCQkgICAgdTggYnVmX3NpemUpOworaW50IGlsNDk2NV9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwordm9pZCBpbDQ5NjVfbWFjX2NoYW5uZWxfc3dpdGNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9zd2l0Y2ggKmNoX3N3aXRjaCk7CisKK3ZvaWQgaWw0OTY1X2xlZF9lbmFibGUoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogRUVQUk9NICovCisjZGVmaW5lIElMNDk2NV9FRVBST01fSU1HX1NJWkUJCQkxMDI0CisKKy8qCisgKiB1Q29kZSBxdWV1ZSBtYW5hZ2VtZW50IGRlZmluaXRpb25zIC4uLgorICogVGhlIGZpcnN0IHF1ZXVlIHVzZWQgZm9yIGJsb2NrLWFjayBhZ2dyZWdhdGlvbiBpcyAjNyAoNDk2NSBvbmx5KS4KKyAqIEFsbCBibG9jay1hY2sgYWdncmVnYXRpb24gcXVldWVzIHNob3VsZCBtYXAgdG8gVHggRE1BL0ZJRk8gY2hhbm5lbCA3LgorICovCisjZGVmaW5lIElMNDlfRklSU1RfQU1QRFVfUVVFVUUJNworCisvKiBTaXplcyBhbmQgYWRkcmVzc2VzIGZvciBpbnN0cnVjdGlvbiBhbmQgZGF0YSBtZW1vcnkgKFNSQU0pIGluCisgKiA0OTY1J3MgZW1iZWRkZWQgcHJvY2Vzc29yLiAgRHJpdmVyIGFjY2VzcyBpcyB2aWEgSEJVU19UQVJHX01FTV8qIHJlZ3MuICovCisjZGVmaW5lIElMNDlfUlRDX0lOU1RfTE9XRVJfQk9VTkQJCSgweDAwMDAwMCkKKyNkZWZpbmUgSUw0OV9SVENfSU5TVF9VUFBFUl9CT1VORAkJKDB4MDE4MDAwKQorCisjZGVmaW5lIElMNDlfUlRDX0RBVEFfTE9XRVJfQk9VTkQJCSgweDgwMDAwMCkKKyNkZWZpbmUgSUw0OV9SVENfREFUQV9VUFBFUl9CT1VORAkJKDB4ODBBMDAwKQorCisjZGVmaW5lIElMNDlfUlRDX0lOU1RfU0laRSAgKElMNDlfUlRDX0lOU1RfVVBQRVJfQk9VTkQgLSBcCisJCQkJSUw0OV9SVENfSU5TVF9MT1dFUl9CT1VORCkKKyNkZWZpbmUgSUw0OV9SVENfREFUQV9TSVpFICAoSUw0OV9SVENfREFUQV9VUFBFUl9CT1VORCAtIFwKKwkJCQlJTDQ5X1JUQ19EQVRBX0xPV0VSX0JPVU5EKQorCisjZGVmaW5lIElMNDlfTUFYX0lOU1RfU0laRSBJTDQ5X1JUQ19JTlNUX1NJWkUKKyNkZWZpbmUgSUw0OV9NQVhfREFUQV9TSVpFIElMNDlfUlRDX0RBVEFfU0laRQorCisvKiBTaXplIG9mIHVDb2RlIGluc3RydWN0aW9uIG1lbW9yeSBpbiBib290c3RyYXAgc3RhdGUgbWFjaGluZSAqLworI2RlZmluZSBJTDQ5X01BWF9CU01fU0laRSBCU01fU1JBTV9TSVpFCisKK3N0YXRpYyBpbmxpbmUgaW50CitpbDQ5NjVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkcih1MzIgYWRkcikKK3sKKwlyZXR1cm4gKGFkZHIgPj0gSUw0OV9SVENfREFUQV9MT1dFUl9CT1VORCAmJgorCQlhZGRyIDwgSUw0OV9SVENfREFUQV9VUFBFUl9CT1VORCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogU1RBUlQgVEVNUEVSQVRVUkUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiA0OTY1IHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9uLgorICoKKyAqIFRoZSBkcml2ZXIgbXVzdCBjYWxjdWxhdGUgdGhlIGRldmljZSB0ZW1wZXJhdHVyZSBiZWZvcmUgY2FsY3VsYXRpbmcKKyAqIGEgdHhwb3dlciBzZXR0aW5nIChhbXBsaWZpZXIgZ2FpbiBpcyB0ZW1wZXJhdHVyZSBkZXBlbmRlbnQpLiAgVGhlCisgKiBjYWxjdWxhdGlvbiB1c2VzIDQgbWVhc3VyZW1lbnRzLCAzIG9mIHdoaWNoIChSMSwgUjIsIFIzKSBhcmUgY2FsaWJyYXRpb24KKyAqIHZhbHVlcyB1c2VkIGZvciB0aGUgbGlmZSBvZiB0aGUgZHJpdmVyLCBhbmQgb25lIG9mIHdoaWNoIChSNCkgaXMgdGhlCisgKiByZWFsLXRpbWUgdGVtcGVyYXR1cmUgaW5kaWNhdG9yLgorICoKKyAqIHVDb2RlIHByb3ZpZGVzIGFsbCA0IHZhbHVlcyB0byB0aGUgZHJpdmVyIHZpYSB0aGUgImluaXRpYWxpemUgYWxpdmUiCisgKiBub3RpZmljYXRpb24gKHNlZSBzdHJ1Y3QgaWw0OTY1X2luaXRfYWxpdmVfcmVzcCkuICBBZnRlciB0aGUgcnVudGltZSB1Q29kZQorICogaW1hZ2UgbG9hZHMsIHVDb2RlIHVwZGF0ZXMgdGhlIFI0IHZhbHVlIHZpYSBzdGF0cyBub3RpZmljYXRpb25zCisgKiAoc2VlIE5fU1RBVFMpLCB3aGljaCBvY2N1ciBhZnRlciBlYWNoIHJlY2VpdmVkIGJlYWNvbgorICogd2hlbiBhc3NvY2lhdGVkLCBvciBjYW4gYmUgcmVxdWVzdGVkIHZpYSBDX1NUQVRTLgorICoKKyAqIE5PVEU6ICB1Q29kZSBwcm92aWRlcyB0aGUgUjQgdmFsdWUgYXMgYSAyMy1iaXQgc2lnbmVkIHZhbHVlLiAgRHJpdmVyCisgKiAgICAgICAgbXVzdCBzaWduLWV4dGVuZCB0byAzMiBiaXRzIGJlZm9yZSBhcHBseWluZyBmb3JtdWxhIGJlbG93LgorICoKKyAqIEZvcm11bGE6CisgKgorICogZGVncmVlcyBLZWx2aW4gPSAoKDk3ICogMjU5ICogKFI0IC0gUjIpIC8gKFIzIC0gUjEpKSAvIDEwMCkgKyA4CisgKgorICogTk9URTogIFRoZSBiYXNpYyBmb3JtdWxhIGlzIDI1OSAqIChSNC1SMikgLyAoUjMtUjEpLiAgVGhlIDk3LzEwMCBpcworICogYW4gYWRkaXRpb25hbCBjb3JyZWN0aW9uLCB3aGljaCBzaG91bGQgYmUgY2VudGVyZWQgYXJvdW5kIDAgZGVncmVlcworICogQ2Vsc2l1cyAoMjczIGRlZ3JlZXMgS2VsdmluKS4gIFRoZSA4ICgzIHBlcmNlbnQgb2YgMjczKSBjb21wZW5zYXRlcyBmb3IKKyAqIGNlbnRlcmluZyB0aGUgOTcvMTAwIGNvcnJlY3Rpb24gYXJvdW5kIDAgZGVncmVlcyBLLgorICoKKyAqIEFkZCAyNzMgdG8gS2VsdmluIHZhbHVlIHRvIGZpbmQgZGVncmVlcyBDZWxzaXVzLCBmb3IgY29tcGFyaW5nIGN1cnJlbnQKKyAqIHRlbXBlcmF0dXJlIHdpdGggZmFjdG9yeS1tZWFzdXJlZCB0ZW1wZXJhdHVyZXMgd2hlbiBjYWxjdWxhdGluZyB0eHBvd2VyCisgKiBzZXR0aW5ncy4KKyAqLworI2RlZmluZSBURU1QRVJBVFVSRV9DQUxJQl9LRUxWSU5fT0ZGU0VUIDgKKyNkZWZpbmUgVEVNUEVSQVRVUkVfQ0FMSUJfQV9WQUwgMjU5CisKKy8qIExpbWl0IHJhbmdlIG9mIGNhbGN1bGF0ZWQgdGVtcGVyYXR1cmUgdG8gYmUgYmV0d2VlbiB0aGVzZSBLZWx2aW4gdmFsdWVzICovCisjZGVmaW5lIElMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01JTiAgKDI2MykKKyNkZWZpbmUgSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUFYICAoNDEwKQorCisjZGVmaW5lIElMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX09VVF9PRl9SQU5HRSh0KSBcCisJKCh0KSA8IElMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01JTiB8fCBcCisJICh0KSA+IElMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01BWCkKKworLyoqKioqKioqKioqKioqKioqKioqKiBFTkQgVEVNUEVSQVRVUkUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqIFNUQVJUIFRYUE9XRVIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogNDk2NSB0eHBvd2VyIGNhbGN1bGF0aW9ucyByZWx5IG9uIGluZm9ybWF0aW9uIGZyb20gdGhyZWUgc291cmNlczoKKyAqCisgKiAgICAgMSkgRUVQUk9NCisgKiAgICAgMikgImluaXRpYWxpemUiIGFsaXZlIG5vdGlmaWNhdGlvbgorICogICAgIDMpIHN0YXRzIG5vdGlmaWNhdGlvbnMKKyAqCisgKiBFRVBST00gZGF0YSBjb25zaXN0cyBvZjoKKyAqCisgKiAxKSAgUmVndWxhdG9yeSBpbmZvcm1hdGlvbiAobWF4IHR4cG93ZXIgYW5kIGNoYW5uZWwgdXNhZ2UgZmxhZ3MpIGlzIHByb3ZpZGVkCisgKiAgICAgc2VwYXJhdGVseSBmb3IgZWFjaCBjaGFubmVsIHRoYXQgY2FuIHBvc3NpYmx5IHN1cHBvcnRlZCBieSA0OTY1LgorICogICAgIDQwIE1IeiB3aWRlICguMTFuIEhUNDApIGNoYW5uZWxzIGFyZSBsaXN0ZWQgc2VwYXJhdGVseSBmcm9tIDIwIE1IegorICogICAgIChsZWdhY3kpIGNoYW5uZWxzLgorICoKKyAqICAgICBTZWUgc3RydWN0IGlsNDk2NV9lZXByb21fY2hhbm5lbCBmb3IgZm9ybWF0LCBhbmQgc3RydWN0IGlsNDk2NV9lZXByb20KKyAqICAgICBmb3IgbG9jYXRpb25zIGluIEVFUFJPTS4KKyAqCisgKiAyKSAgRmFjdG9yeSB0eHBvd2VyIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHNlcGFyYXRlbHkgZm9yCisgKiAgICAgc3ViLWJhbmRzIG9mIGNvbnRpZ3VvdXMgY2hhbm5lbHMuICAyLjRHSHogaGFzIGp1c3Qgb25lIHN1Yi1iYW5kLAorICogICAgIGJ1dCA1IEdIeiBoYXMgc2V2ZXJhbCBzdWItYmFuZHMuCisgKgorICogICAgIEluIGFkZGl0aW9uLCBwZXItYmFuZCAoMi40IGFuZCA1IEdoeikgc2F0dXJhdGlvbiB0eHBvd2VycyBhcmUgcHJvdmlkZWQuCisgKgorICogICAgIFNlZSBzdHJ1Y3QgaWw0OTY1X2VlcHJvbV9jYWxpYl9pbmZvIChhbmQgdGhlIHRyZWUgb2Ygc3RydWN0dXJlcworICogICAgIGNvbnRhaW5lZCB3aXRoaW4gaXQpIGZvciBmb3JtYXQsIGFuZCBzdHJ1Y3QgaWw0OTY1X2VlcHJvbSBmb3IKKyAqICAgICBsb2NhdGlvbnMgaW4gRUVQUk9NLgorICoKKyAqICJJbml0aWFsaXphdGlvbiBhbGl2ZSIgbm90aWZpY2F0aW9uIChzZWUgc3RydWN0IGlsNDk2NV9pbml0X2FsaXZlX3Jlc3ApCisgKiBjb25zaXN0cyBvZjoKKyAqCisgKiAxKSAgVGVtcGVyYXR1cmUgY2FsY3VsYXRpb24gcGFyYW1ldGVycy4KKyAqCisgKiAyKSAgUG93ZXIgc3VwcGx5IHZvbHRhZ2UgbWVhc3VyZW1lbnQuCisgKgorICogMykgIFR4IGdhaW4gY29tcGVuc2F0aW9uIHRvIGJhbGFuY2UgMiB0cmFuc21pdHRlcnMgZm9yIE1JTU8gdXNlLgorICoKKyAqIFN0YXRpc3RpY3Mgbm90aWZpY2F0aW9ucyBkZWxpdmVyOgorICoKKyAqIDEpICBDdXJyZW50IHZhbHVlcyBmb3IgdGVtcGVyYXR1cmUgcGFyYW0gUjQuCisgKi8KKworLyoqCisgKiBUbyBjYWxjdWxhdGUgYSB0eHBvd2VyIHNldHRpbmcgZm9yIGEgZ2l2ZW4gZGVzaXJlZCB0YXJnZXQgdHhwb3dlciwgY2hhbm5lbCwKKyAqIG1vZHVsYXRpb24gYml0IHJhdGUsIGFuZCB0cmFuc21pdHRlciBjaGFpbiAoNDk2NSBoYXMgMiB0cmFuc21pdHRlcnMgdG8KKyAqIHN1cHBvcnQgTUlNTyBhbmQgdHJhbnNtaXQgZGl2ZXJzaXR5KSwgZHJpdmVyIG11c3QgZG8gdGhlIGZvbGxvd2luZzoKKyAqCisgKiAxKSAgQ29tcGFyZSBkZXNpcmVkIHR4cG93ZXIgdnMuIChFRVBST00pIHJlZ3VsYXRvcnkgbGltaXQgZm9yIHRoaXMgY2hhbm5lbC4KKyAqICAgICBEbyBub3QgZXhjZWVkIHJlZ3VsYXRvcnkgbGltaXQ7IHJlZHVjZSB0YXJnZXQgdHhwb3dlciBpZiBuZWNlc3NhcnkuCisgKgorICogICAgIElmIHNldHRpbmcgdXAgdHhwb3dlcnMgZm9yIE1JTU8gcmF0ZXMgKHJhdGUgaWR4ZXMgOC0xNSwgMjQtMzEpLAorICogICAgIDIgdHJhbnNtaXR0ZXJzIHdpbGwgYmUgdXNlZCBzaW11bHRhbmVvdXNseTsgZHJpdmVyIG11c3QgcmVkdWNlIHRoZQorICogICAgIHJlZ3VsYXRvcnkgbGltaXQgYnkgMyBkQiAoaGFsZi1wb3dlcikgZm9yIGVhY2ggdHJhbnNtaXR0ZXIsIHNvIHRoZQorICogICAgIGNvbWJpbmVkIHRvdGFsIG91dHB1dCBvZiB0aGUgMiB0cmFuc21pdHRlcnMgaXMgd2l0aGluIHJlZ3VsYXRvcnkgbGltaXRzLgorICoKKyAqCisgKiAyKSAgQ29tcGFyZSB0YXJnZXQgdHhwb3dlciB2cy4gKEVFUFJPTSkgc2F0dXJhdGlvbiB0eHBvd2VyICpyZWR1Y2VkIGJ5CisgKiAgICAgYmFja29mZiBmb3IgdGhpcyBiaXQgcmF0ZSouICBEbyBub3QgZXhjZWVkIChzYXR1cmF0aW9uIC0gYmFja29mZltyYXRlXSk7CisgKiAgICAgcmVkdWNlIHRhcmdldCB0eHBvd2VyIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiAgICAgQmFja29mZiB2YWx1ZXMgYmVsb3cgYXJlIGluIDEvMiBkQiB1bml0cyAoZXF1aXZhbGVudCB0byBzdGVwcyBpbgorICogICAgIHR4cG93ZXIgZ2FpbiB0YWJsZXMpOgorICoKKyAqICAgICBPRkRNIDYgLSAzNiBNQml0OiAgMTAgc3RlcHMgKDUgZEIpCisgKiAgICAgT0ZETSA0OCBNQml0OiAgICAgIDE1IHN0ZXBzICg3LjUgZEIpCisgKiAgICAgT0ZETSA1NCBNQml0OiAgICAgIDE3IHN0ZXBzICg4LjUgZEIpCisgKiAgICAgT0ZETSA2MCBNQml0OiAgICAgIDIwIHN0ZXBzICgxMCBkQikKKyAqICAgICBDQ0sgYWxsIHJhdGVzOiAgICAgMTAgc3RlcHMgKDUgZEIpCisgKgorICogICAgIEJhY2tvZmYgdmFsdWVzIGFwcGx5IHRvIHNhdHVyYXRpb24gdHhwb3dlciBvbiBhIHBlci10cmFuc21pdHRlciBiYXNpczsKKyAqICAgICB3aGVuIHVzaW5nIE1JTU8gKDIgdHJhbnNtaXR0ZXJzKSwgZWFjaCB0cmFuc21pdHRlciB1c2VzIHRoZSBzYW1lCisgKiAgICAgc2F0dXJhdGlvbiBsZXZlbCBwcm92aWRlZCBpbiBFRVBST00sIGFuZCB0aGUgc2FtZSBiYWNrb2ZmIHZhbHVlczsKKyAqICAgICBubyByZWR1Y3Rpb24gKHN1Y2ggYXMgd2l0aCByZWd1bGF0b3J5IHR4cG93ZXIgbGltaXRzKSBpcyByZXF1aXJlZC4KKyAqCisgKiAgICAgU2F0dXJhdGlvbiBhbmQgQmFja29mZiB2YWx1ZXMgYXBwbHkgZXF1YWxseSB0byAyMCBNaHogKGxlZ2FjeSkgY2hhbm5lbAorICogICAgIHdpZHRocyBhbmQgNDAgTWh6ICguMTFuIEhUNDApIGNoYW5uZWwgd2lkdGhzOyB0aGVyZSBpcyBubyBzZXBhcmF0ZQorICogICAgIGZhY3RvcnkgbWVhc3VyZW1lbnQgZm9yIGh0NDAgY2hhbm5lbHMuCisgKgorICogICAgIFRoZSByZXN1bHQgb2YgdGhpcyBzdGVwIGlzIHRoZSBmaW5hbCB0YXJnZXQgdHhwb3dlci4gIFRoZSByZXN0IG9mCisgKiAgICAgdGhlIHN0ZXBzIGZpZ3VyZSBvdXQgdGhlIHByb3BlciBzZXR0aW5ncyBmb3IgdGhlIGRldmljZSB0byBhY2hpZXZlCisgKiAgICAgdGhhdCB0YXJnZXQgdHhwb3dlci4KKyAqCisgKgorICogMykgIERldGVybWluZSAoRUVQUk9NKSBjYWxpYnJhdGlvbiBzdWIgYmFuZCBmb3IgdGhlIHRhcmdldCBjaGFubmVsLCBieQorICogICAgIGNvbXBhcmluZyBhZ2FpbnN0IGZpcnN0IGFuZCBsYXN0IGNoYW5uZWxzIGluIGVhY2ggc3ViIGJhbmQKKyAqICAgICAoc2VlIHN0cnVjdCBpbDQ5NjVfZWVwcm9tX2NhbGliX3N1YmJhbmRfaW5mbykuCisgKgorICoKKyAqIDQpICBMaW5lYXJseSBpbnRlcnBvbGF0ZSAoRUVQUk9NKSBmYWN0b3J5IGNhbGlicmF0aW9uIG1lYXN1cmVtZW50IHNldHMsCisgKiAgICAgcmVmZXJlbmNpbmcgdGhlIDIgZmFjdG9yeS1tZWFzdXJlZCAoc2FtcGxlKSBjaGFubmVscyB3aXRoaW4gdGhlIHN1YiBiYW5kLgorICoKKyAqICAgICBJbnRlcnBvbGF0aW9uIGlzIGJhc2VkIG9uIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhbm5lbCdzIGZyZXF1ZW5jeQorICogICAgIGFuZCB0aGUgc2FtcGxlIGNoYW5uZWxzJyBmcmVxdWVuY2llcy4gIFNpbmNlIGNoYW5uZWwgbnVtYmVycyBhcmUgYmFzZWQKKyAqICAgICBvbiBmcmVxdWVuY3kgKDUgTUh6IGJldHdlZW4gZWFjaCBjaGFubmVsIG51bWJlciksIHRoaXMgaXMgZXF1aXZhbGVudAorICogICAgIHRvIGludGVycG9sYXRpbmcgYmFzZWQgb24gY2hhbm5lbCBudW1iZXIgZGlmZmVyZW5jZXMuCisgKgorICogICAgIE5vdGUgdGhhdCB0aGUgc2FtcGxlIGNoYW5uZWxzIG1heSBvciBtYXkgbm90IGJlIHRoZSBjaGFubmVscyBhdCB0aGUKKyAqICAgICBlZGdlcyBvZiB0aGUgc3ViIGJhbmQuICBUaGUgdGFyZ2V0IGNoYW5uZWwgbWF5IGJlICJvdXRzaWRlIiBvZiB0aGUKKyAqICAgICBzcGFuIG9mIHRoZSBzYW1wbGVkIGNoYW5uZWxzLgorICoKKyAqICAgICBEcml2ZXIgbWF5IGNob29zZSB0aGUgcGFpciAoZm9yIDIgVHggY2hhaW5zKSBvZiBtZWFzdXJlbWVudHMgKHNlZQorICogICAgIHN0cnVjdCBpbDQ5NjVfZWVwcm9tX2NhbGliX2NoX2luZm8pIGZvciB3aGljaCB0aGUgYWN0dWFsIG1lYXN1cmVkCisgKiAgICAgdHhwb3dlciBjb21lcyBjbG9zZXN0IHRvIHRoZSBkZXNpcmVkIHR4cG93ZXIuICBVc3VhbGx5LCB0aG91Z2gsCisgKiAgICAgdGhlIG1pZGRsZSBzZXQgb2YgbWVhc3VyZW1lbnRzIGlzIGNsb3Nlc3QgdG8gdGhlIHJlZ3VsYXRvcnkgbGltaXRzLAorICogICAgIGFuZCBpcyB0aGVyZWZvcmUgYSBnb29kIGNob2ljZSBmb3IgYWxsIHR4cG93ZXIgY2FsY3VsYXRpb25zICh0aGlzCisgKiAgICAgYXNzdW1lcyB0aGF0IGhpZ2ggYWNjdXJhY3kgaXMgbmVlZGVkIGZvciBtYXhpbWl6aW5nIGxlZ2FsIHR4cG93ZXIsCisgKiAgICAgd2hpbGUgbG93ZXIgdHhwb3dlciBjb25maWd1cmF0aW9ucyBkbyBub3QgbmVlZCBhcyBtdWNoIGFjY3VyYWN5KS4KKyAqCisgKiAgICAgRHJpdmVyIHNob3VsZCBpbnRlcnBvbGF0ZSBib3RoIG1lbWJlcnMgb2YgdGhlIGNob3NlbiBtZWFzdXJlbWVudCBwYWlyLAorICogICAgIGkuZS4gZm9yIGJvdGggVHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlcnMpLCB1bmxlc3MgdGhlIGRyaXZlciBrbm93cworICogICAgIHRoYXQgb25seSBvbmUgb2YgdGhlIGNoYWlucyB3aWxsIGJlIHVzZWQgKGUuZy4gb25seSBvbmUgdHggYW50ZW5uYQorICogICAgIGNvbm5lY3RlZCwgYnV0IHRoaXMgc2hvdWxkIGJlIHVudXN1YWwpLiAgVGhlIHJhdGUgc2NhbGluZyBhbGdvcml0aG0KKyAqICAgICBzd2l0Y2hlcyBhbnRlbm5hcyB0byBmaW5kIGJlc3QgcGVyZm9ybWFuY2UsIHNvIGJvdGggVHggY2hhaW5zIHdpbGwKKyAqICAgICBiZSB1c2VkIChhbHRob3VnaCBvbmx5IG9uZSBhdCBhIHRpbWUpIGV2ZW4gZm9yIG5vbi1NSU1PIHRyYW5zbWlzc2lvbnMuCisgKgorICogICAgIERyaXZlciBzaG91bGQgaW50ZXJwb2xhdGUgZmFjdG9yeSB2YWx1ZXMgZm9yIHRlbXBlcmF0dXJlLCBnYWluIHRhYmxlCisgKiAgICAgaWR4LCBhbmQgYWN0dWFsIHBvd2VyLiAgVGhlIHBvd2VyIGFtcGxpZmllciBkZXRlY3RvciB2YWx1ZXMgYXJlCisgKiAgICAgbm90IHVzZWQgYnkgdGhlIGRyaXZlci4KKyAqCisgKiAgICAgU2FuaXR5IGNoZWNrOiAgSWYgdGhlIHRhcmdldCBjaGFubmVsIGhhcHBlbnMgdG8gYmUgb25lIG9mIHRoZSBzYW1wbGUKKyAqICAgICBjaGFubmVscywgdGhlIHJlc3VsdHMgc2hvdWxkIGFncmVlIHdpdGggdGhlIHNhbXBsZSBjaGFubmVsJ3MKKyAqICAgICBtZWFzdXJlbWVudHMhCisgKgorICoKKyAqIDUpICBGaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBkZXNpcmVkIHR4cG93ZXIgYW5kIChpbnRlcnBvbGF0ZWQpCisgKiAgICAgZmFjdG9yeS1tZWFzdXJlZCB0eHBvd2VyLiAgVXNpbmcgKGludGVycG9sYXRlZCkgZmFjdG9yeSBnYWluIHRhYmxlIGlkeAorICogICAgIChzaG93biBlbHNld2hlcmUpIGFzIGEgc3RhcnRpbmcgcG9pbnQsIGFkanVzdCB0aGlzIGlkeCBsb3dlciB0bworICogICAgIGluY3JlYXNlIHR4cG93ZXIsIG9yIGhpZ2hlciB0byBkZWNyZWFzZSB0eHBvd2VyLCB1bnRpbCB0aGUgdGFyZ2V0CisgKiAgICAgdHhwb3dlciBpcyByZWFjaGVkLiAgRWFjaCBzdGVwIGluIHRoZSBnYWluIHRhYmxlIGlzIDEvMiBkQi4KKyAqCisgKiAgICAgRm9yIGV4YW1wbGUsIGlmIGZhY3RvcnkgbWVhc3VyZWQgdHhwb3dlciBpcyAxNiBkQm0sIGFuZCB0YXJnZXQgdHhwb3dlcgorICogICAgIGlzIDEzIGRCbSwgYWRkIDYgc3RlcHMgdG8gdGhlIGZhY3RvcnkgZ2FpbiBpZHggdG8gcmVkdWNlIHR4cG93ZXIKKyAqICAgICBieSAzIGRCLgorICoKKyAqCisgKiA2KSAgRmluZCBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBkZXZpY2UgdGVtcGVyYXR1cmUgYW5kIChpbnRlcnBvbGF0ZWQpCisgKiAgICAgZmFjdG9yeS1tZWFzdXJlZCB0ZW1wZXJhdHVyZSBmb3Igc3ViLWJhbmQuICBGYWN0b3J5IHZhbHVlcyBhcmUgaW4KKyAqICAgICBkZWdyZWVzIENlbHNpdXMuICBUbyBjYWxjdWxhdGUgY3VycmVudCB0ZW1wZXJhdHVyZSwgc2VlIGNvbW1lbnRzIGZvcgorICogICAgICI0OTY1IHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9uIi4KKyAqCisgKiAgICAgSWYgY3VycmVudCB0ZW1wZXJhdHVyZSBpcyBoaWdoZXIgdGhhbiBmYWN0b3J5IHRlbXBlcmF0dXJlLCBkcml2ZXIgbXVzdAorICogICAgIGluY3JlYXNlIGdhaW4gKGxvd2VyIGdhaW4gdGFibGUgaWR4KSwgYW5kIHZpY2UgdmVyc2UuCisgKgorICogICAgIFRlbXBlcmF0dXJlIGFmZmVjdHMgZ2FpbiBkaWZmZXJlbnRseSBmb3IgZGlmZmVyZW50IGNoYW5uZWxzOgorICoKKyAqICAgICAyLjQgR0h6IGFsbCBjaGFubmVsczogIDMuNSBkZWdyZWVzIHBlciBoYWxmLWRCIHN0ZXAKKyAqICAgICA1IEdIeiBjaGFubmVscyAzNC00MzogIDQuNSBkZWdyZWVzIHBlciBoYWxmLWRCIHN0ZXAKKyAqICAgICA1IEdIeiBjaGFubmVscyA+PSA0NDogIDQuMCBkZWdyZWVzIHBlciBoYWxmLWRCIHN0ZXAKKyAqCisgKiAgICAgTk9URTogIFRlbXBlcmF0dXJlIGNhbiBpbmNyZWFzZSByYXBpZGx5IHdoZW4gdHJhbnNtaXR0aW5nLCBlc3BlY2lhbGx5CisgKiAgICAgICAgICAgIHdpdGggaGVhdnkgdHJhZmZpYyBhdCBoaWdoIHR4cG93ZXJzLiAgRHJpdmVyIHNob3VsZCB1cGRhdGUKKyAqICAgICAgICAgICAgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb25zIG9mdGVuIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnMgdG8KKyAqICAgICAgICAgICAgbWFpbnRhaW4gc3Ryb25nIHR4cG93ZXIgaW4gdGhlIGZhY2Ugb2YgcmlzaW5nIHRlbXBlcmF0dXJlLgorICoKKyAqCisgKiA3KSAgRmluZCBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBwb3dlciBzdXBwbHkgdm9sdGFnZSBpbmRpY2F0b3IKKyAqICAgICAoZnJvbSAiaW5pdGlhbGl6ZSBhbGl2ZSIpIGFuZCBmYWN0b3J5LW1lYXN1cmVkIHBvd2VyIHN1cHBseSB2b2x0YWdlCisgKiAgICAgaW5kaWNhdG9yIChFRVBST00pLgorICoKKyAqICAgICBJZiB0aGUgY3VycmVudCB2b2x0YWdlIGlzIGhpZ2hlciAoaW5kaWNhdG9yIGlzIGxvd2VyKSB0aGFuIGZhY3RvcnkKKyAqICAgICB2b2x0YWdlLCBnYWluIHNob3VsZCBiZSByZWR1Y2VkIChnYWluIHRhYmxlIGlkeCBpbmNyZWFzZWQpIGJ5OgorICoKKyAqICAgICAoZWVwcm9tIC0gY3VycmVudCkgLyA3CisgKgorICogICAgIElmIHRoZSBjdXJyZW50IHZvbHRhZ2UgaXMgbG93ZXIgKGluZGljYXRvciBpcyBoaWdoZXIpIHRoYW4gZmFjdG9yeQorICogICAgIHZvbHRhZ2UsIGdhaW4gc2hvdWxkIGJlIGluY3JlYXNlZCAoZ2FpbiB0YWJsZSBpZHggZGVjcmVhc2VkKSBieToKKyAqCisgKiAgICAgMiAqIChjdXJyZW50IC0gZWVwcm9tKSAvIDcKKyAqCisgKiAgICAgSWYgbnVtYmVyIG9mIGlkeCBzdGVwcyBpbiBlaXRoZXIgZGlyZWN0aW9uIHR1cm5zIG91dCB0byBiZSA+IDIsCisgKiAgICAgc29tZXRoaW5nIGlzIHdyb25nIC4uLiBqdXN0IHVzZSAwLgorICoKKyAqICAgICBOT1RFOiAgVm9sdGFnZSBjb21wZW5zYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgYmFuZC9jaGFubmVsLgorICoKKyAqICAgICBOT1RFOiAgIkluaXRpYWxpemUiIHVDb2RlIG1lYXN1cmVzIGN1cnJlbnQgdm9sdGFnZSwgd2hpY2ggaXMgYXNzdW1lZAorICogICAgICAgICAgICB0byBiZSBjb25zdGFudCBhZnRlciB0aGlzIGluaXRpYWwgbWVhc3VyZW1lbnQuICBWb2x0YWdlCisgKiAgICAgICAgICAgIGNvbXBlbnNhdGlvbiBmb3IgdHhwb3dlciAobnVtYmVyIG9mIHN0ZXBzIGluIGdhaW4gdGFibGUpCisgKiAgICAgICAgICAgIG1heSBiZSBjYWxjdWxhdGVkIG9uY2UgYW5kIHVzZWQgdW50aWwgdGhlIG5leHQgdUNvZGUgYm9vdGxvYWQuCisgKgorICoKKyAqIDgpICBJZiBzZXR0aW5nIHVwIHR4cG93ZXJzIGZvciBNSU1PIHJhdGVzIChyYXRlIGlkeGVzIDgtMTUsIDI0LTMxKSwKKyAqICAgICBhZGp1c3QgdHhwb3dlciBmb3IgZWFjaCB0cmFuc21pdHRlciBjaGFpbiwgc28gdHhwb3dlciBpcyBiYWxhbmNlZAorICogICAgIGJldHdlZW4gdGhlIHR3byBjaGFpbnMuICBUaGVyZSBhcmUgNSBwYWlycyBvZiB0eF9hdHRlbltncm91cF1bY2hhaW5dCisgKiAgICAgdmFsdWVzIGluICJpbml0aWFsaXplIGFsaXZlIiwgb25lIHBhaXIgZm9yIGVhY2ggb2YgNSBjaGFubmVsIHJhbmdlczoKKyAqCisgKiAgICAgR3JvdXAgMDogIDUgR0h6IGNoYW5uZWwgMzQtNDMKKyAqICAgICBHcm91cCAxOiAgNSBHSHogY2hhbm5lbCA0NC03MAorICogICAgIEdyb3VwIDI6ICA1IEdIeiBjaGFubmVsIDcxLTEyNAorICogICAgIEdyb3VwIDM6ICA1IEdIeiBjaGFubmVsIDEyNS0yMDAKKyAqICAgICBHcm91cCA0OiAgMi40IEdIeiBhbGwgY2hhbm5lbHMKKyAqCisgKiAgICAgQWRkIHRoZSB0eF9hdHRlbltncm91cF1bY2hhaW5dIHZhbHVlIHRvIHRoZSBpZHggZm9yIHRoZSB0YXJnZXQgY2hhaW4uCisgKiAgICAgVGhlIHZhbHVlcyBhcmUgc2lnbmVkLCBidXQgYXJlIGluIHBhaXJzIG9mIDAgYW5kIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwKKyAqICAgICBzbyBhcyB0byByZWR1Y2UgZ2FpbiAoaWYgbmVjZXNzYXJ5KSBvZiB0aGUgImhvdHRlciIgY2hhbm5lbC4gIFRoaXMKKyAqICAgICBhdm9pZHMgYW55IG5lZWQgdG8gZG91YmxlLWNoZWNrIGZvciByZWd1bGF0b3J5IGNvbXBsaWFuY2UgYWZ0ZXIKKyAqICAgICB0aGlzIHN0ZXAuCisgKgorICoKKyAqIDkpICBJZiBzZXR0aW5nIHVwIGZvciBhIENDSyByYXRlLCBsb3dlciB0aGUgZ2FpbiBieSBhZGRpbmcgYSBDQ0sgY29tcGVuc2F0aW9uCisgKiAgICAgdmFsdWUgdG8gdGhlIGlkeDoKKyAqCisgKiAgICAgSGFyZHdhcmUgcmV2IEI6ICA5IHN0ZXBzICg0LjUgZEIpCisgKiAgICAgSGFyZHdhcmUgcmV2IEM6ICA1IHN0ZXBzICgyLjUgZEIpCisgKgorICogICAgIEhhcmR3YXJlIHJldiBmb3IgNDk2NSBjYW4gYmUgZGV0ZXJtaW5lZCBieSByZWFkaW5nIENTUl9IV19SRVZfV0FfUkVHLAorICogICAgIGJpdHMgWzM6Ml0sIDEgPSBCLCAyID0gQy4KKyAqCisgKiAgICAgTk9URTogIFRoaXMgY29tcGVuc2F0aW9uIGlzIGluIGFkZGl0aW9uIHRvIGFueSBzYXR1cmF0aW9uIGJhY2tvZmYgdGhhdAorICogICAgICAgICAgICBtaWdodCBoYXZlIGJlZW4gYXBwbGllZCBpbiBhbiBlYXJsaWVyIHN0ZXAuCisgKgorICoKKyAqIDEwKSBTZWxlY3QgdGhlIGdhaW4gdGFibGUsIGJhc2VkIG9uIGJhbmQgKDIuNCB2cyA1IEdIeikuCisgKgorICogICAgIExpbWl0IHRoZSBhZGp1c3RlZCBpZHggdG8gc3RheSB3aXRoaW4gdGhlIHRhYmxlIQorICoKKyAqCisgKiAxMSkgUmVhZCBnYWluIHRhYmxlIGVudHJpZXMgZm9yIERTUCBhbmQgcmFkaW8gZ2FpbiwgcGxhY2UgaW50byBhcHByb3ByaWF0ZQorICogICAgIGxvY2F0aW9uKHMpIGluIGNvbW1hbmQgKHN0cnVjdCBpbDQ5NjVfdHhwb3dlcnRhYmxlX2NtZCkuCisgKi8KKworLyoqCisgKiBXaGVuIE1JTU8gaXMgdXNlZCAoMiB0cmFuc21pdHRlcnMgb3BlcmF0aW5nIHNpbXVsdGFuZW91c2x5KSwgZHJpdmVyIHNob3VsZAorICogbGltaXQgZWFjaCB0cmFuc21pdHRlciB0byBkZWxpdmVyIGEgbWF4IG9mIDMgZEIgYmVsb3cgdGhlIHJlZ3VsYXRvcnkgbGltaXQKKyAqIGZvciB0aGUgZGV2aWNlLiAgVGhhdCBpcywgdXNlIGhhbGYgcG93ZXIgZm9yIGVhY2ggdHJhbnNtaXR0ZXIsIHNvIHRvdGFsCisgKiB0eHBvd2VyIGlzIHdpdGhpbiByZWd1bGF0b3J5IGxpbWl0cy4KKyAqCisgKiBUaGUgdmFsdWUgIjYiIHJlcHJlc2VudHMgbnVtYmVyIG9mIHN0ZXBzIGluIGdhaW4gdGFibGUgdG8gcmVkdWNlIHBvd2VyIDMgZEIuCisgKiBFYWNoIHN0ZXAgaXMgMS8yIGRCLgorICovCisjZGVmaW5lIElMX1RYX1BPV0VSX01JTU9fUkVHVUxBVE9SWV9DT01QRU5TQVRJT04gKDYpCisKKy8qKgorICogQ0NLIGdhaW4gY29tcGVuc2F0aW9uLgorICoKKyAqIFdoZW4gY2FsY3VsYXRpbmcgdHhwb3dlcnMgZm9yIENDSywgYWZ0ZXIgbWFraW5nIHN1cmUgdGhhdCB0aGUgdGFyZ2V0IHBvd2VyCisgKiBpcyB3aXRoaW4gcmVndWxhdG9yeSBhbmQgc2F0dXJhdGlvbiBsaW1pdHMsIGRyaXZlciBtdXN0IGFkZGl0aW9uYWxseQorICogYmFjayBvZmYgZ2FpbiBieSBhZGRpbmcgdGhlc2UgdmFsdWVzIHRvIHRoZSBnYWluIHRhYmxlIGlkeC4KKyAqCisgKiBIYXJkd2FyZSByZXYgZm9yIDQ5NjUgY2FuIGJlIGRldGVybWluZWQgYnkgcmVhZGluZyBDU1JfSFdfUkVWX1dBX1JFRywKKyAqIGJpdHMgWzM6Ml0sIDEgPSBCLCAyID0gQy4KKyAqLworI2RlZmluZSBJTF9UWF9QT1dFUl9DQ0tfQ09NUEVOU0FUSU9OX0JfU1RFUCAoOSkKKyNkZWZpbmUgSUxfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9DX1NURVAgKDUpCisKKy8qCisgKiA0OTY1IHBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXBlbnNhdGlvbiBmb3IgdHhwb3dlcgorICovCisjZGVmaW5lIFRYX1BPV0VSX0lMX1ZPTFRBR0VfQ09ERVNfUEVSXzAzViAgICg3KQorCisvKioKKyAqIEdhaW4gdGFibGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgdGFibGVzIGNvbnRhaW4gcGFpciBvZiB2YWx1ZXMgZm9yIHNldHRpbmcgdHhwb3dlciwgaS5lLgorICogZ2FpbiBzZXR0aW5ncyBmb3IgdGhlIG91dHB1dCBvZiB0aGUgZGV2aWNlJ3MgZGlnaXRhbCBzaWduYWwgcHJvY2Vzc29yIChEU1ApLAorICogYW5kIGZvciB0aGUgYW5hbG9nIGdhaW4gc3RydWN0dXJlIG9mIHRoZSB0cmFuc21pdHRlci4KKyAqCisgKiBFYWNoIGVudHJ5IGluIHRoZSBnYWluIHRhYmxlcyByZXByZXNlbnRzIGEgc3RlcCBvZiAxLzIgZEIuICBOb3RlIHRoYXQgdGhlc2UKKyAqIGFyZSAqcmVsYXRpdmUqIHN0ZXBzLCBub3QgaW5kaWNhdGlvbnMgb2YgYWJzb2x1dGUgb3V0cHV0IHBvd2VyLiAgT3V0cHV0CisgKiBwb3dlciB2YXJpZXMgd2l0aCB0ZW1wZXJhdHVyZSwgdm9sdGFnZSwgYW5kIGNoYW5uZWwgZnJlcXVlbmN5LCBhbmQgYWxzbworICogcmVxdWlyZXMgY29uc2lkZXJhdGlvbiBvZiBhdmVyYWdlIHBvd2VyICh0byBzYXRpc2Z5IHJlZ3VsYXRvcnkgY29uc3RyYWludHMpLAorICogYW5kIHBlYWsgcG93ZXIgKHRvIGF2b2lkIGRpc3RvcnRpb24gb2YgdGhlIG91dHB1dCBzaWduYWwpLgorICoKKyAqIEVhY2ggZW50cnkgY29udGFpbnMgdHdvIHZhbHVlczoKKyAqIDEpICBEU1AgZ2FpbiAob3Igc29tZXRpbWVzIGNhbGxlZCBEU1AgYXR0ZW51YXRpb24pLiAgVGhpcyBpcyBhIGZpbmUtZ3JhaW5lZAorICogICAgIGxpbmVhciB2YWx1ZSB0aGF0IG11bHRpcGxpZXMgdGhlIG91dHB1dCBvZiB0aGUgZGlnaXRhbCBzaWduYWwgcHJvY2Vzc29yLAorICogICAgIGJlZm9yZSBiZWluZyBzZW50IHRvIHRoZSBhbmFsb2cgcmFkaW8uCisgKiAyKSAgUmFkaW8gZ2Fpbi4gIFRoaXMgc2V0cyB0aGUgYW5hbG9nIGdhaW4gb2YgdGhlIHJhZGlvIFR4IHBhdGguCisgKiAgICAgSXQgaXMgYSBjb2Fyc2VyIHNldHRpbmcsIGFuZCBiZWhhdmVzIGluIGEgbG9nYXJpdGhtaWMgKGRCKSBmYXNoaW9uLgorICoKKyAqIEVFUFJPTSBjb250YWlucyBmYWN0b3J5IGNhbGlicmF0aW9uIGRhdGEgZm9yIHR4cG93ZXIuICBUaGlzIG1hcHMgYWN0dWFsCisgKiBtZWFzdXJlZCB0eHBvd2VyIGxldmVscyB0byBnYWluIHNldHRpbmdzIGluIHRoZSAid2VsbCBrbm93biIgdGFibGVzCisgKiBiZWxvdyAoIndlbGwta25vd24iIG1lYW5zIGhlcmUgdGhhdCBib3RoIGZhY3RvcnkgY2FsaWJyYXRpb24gKmFuZCogdGhlCisgKiBkcml2ZXIgd29yayB3aXRoIHRoZSBzYW1lIHRhYmxlKS4KKyAqCisgKiBUaGVyZSBhcmUgc2VwYXJhdGUgdGFibGVzIGZvciAyLjQgR0h6IGFuZCA1IEdIeiBiYW5kcy4gIFRoZSA1IEdIeiB0YWJsZQorICogaGFzIGFuIGV4dGVuc2lvbiAoaW50byBuZWdhdGl2ZSBpZHhlcyksIGluIGNhc2UgdGhlIGRyaXZlciBuZWVkcyB0bworICogYm9vc3QgcG93ZXIgc2V0dGluZyBmb3IgaGlnaCBkZXZpY2UgdGVtcGVyYXR1cmVzIChoaWdoZXIgdGhhbiB3b3VsZCBiZQorICogcHJlc2VudCBkdXJpbmcgZmFjdG9yeSBjYWxpYnJhdGlvbikuICBBIDUgR2h6IEVFUFJPTSBpZHggb2YgIjQwIgorICogY29ycmVzcG9uZHMgdG8gdGhlIDQ5dGggZW50cnkgaW4gdGhlIHRhYmxlIHVzZWQgYnkgdGhlIGRyaXZlci4KKyAqLworI2RlZmluZSBNSU5fVFhfR0FJTl9JRFgJCSgwKQkvKiBoaWdoZXN0IGdhaW4sIGxvd2VzdCBpZHgsIDIuNCAqLworI2RlZmluZSBNSU5fVFhfR0FJTl9JRFhfNTJHSFpfRVhUCSgtOSkJLyogaGlnaGVzdCBnYWluLCBsb3dlc3QgaWR4LCA1ICovCisKKy8qKgorICogMi40IEdIeiBnYWluIHRhYmxlCisgKgorICogSW5kZXggICAgRHNwIGdhaW4gICBSYWRpbyBnYWluCisgKiAgIDAgICAgICAgIDExMCAgICAgICAgIDB4M2YgICAgICAoaGlnaGVzdCBnYWluKQorICogICAxICAgICAgICAxMDQgICAgICAgICAweDNmCisgKiAgIDIgICAgICAgICA5OCAgICAgICAgIDB4M2YKKyAqICAgMyAgICAgICAgMTEwICAgICAgICAgMHgzZQorICogICA0ICAgICAgICAxMDQgICAgICAgICAweDNlCisgKiAgIDUgICAgICAgICA5OCAgICAgICAgIDB4M2UKKyAqICAgNiAgICAgICAgMTEwICAgICAgICAgMHgzZAorICogICA3ICAgICAgICAxMDQgICAgICAgICAweDNkCisgKiAgIDggICAgICAgICA5OCAgICAgICAgIDB4M2QKKyAqICAgOSAgICAgICAgMTEwICAgICAgICAgMHgzYworICogIDEwICAgICAgICAxMDQgICAgICAgICAweDNjCisgKiAgMTEgICAgICAgICA5OCAgICAgICAgIDB4M2MKKyAqICAxMiAgICAgICAgMTEwICAgICAgICAgMHgzYgorICogIDEzICAgICAgICAxMDQgICAgICAgICAweDNiCisgKiAgMTQgICAgICAgICA5OCAgICAgICAgIDB4M2IKKyAqICAxNSAgICAgICAgMTEwICAgICAgICAgMHgzYQorICogIDE2ICAgICAgICAxMDQgICAgICAgICAweDNhCisgKiAgMTcgICAgICAgICA5OCAgICAgICAgIDB4M2EKKyAqICAxOCAgICAgICAgMTEwICAgICAgICAgMHgzOQorICogIDE5ICAgICAgICAxMDQgICAgICAgICAweDM5CisgKiAgMjAgICAgICAgICA5OCAgICAgICAgIDB4MzkKKyAqICAyMSAgICAgICAgMTEwICAgICAgICAgMHgzOAorICogIDIyICAgICAgICAxMDQgICAgICAgICAweDM4CisgKiAgMjMgICAgICAgICA5OCAgICAgICAgIDB4MzgKKyAqICAyNCAgICAgICAgMTEwICAgICAgICAgMHgzNworICogIDI1ICAgICAgICAxMDQgICAgICAgICAweDM3CisgKiAgMjYgICAgICAgICA5OCAgICAgICAgIDB4MzcKKyAqICAyNyAgICAgICAgMTEwICAgICAgICAgMHgzNgorICogIDI4ICAgICAgICAxMDQgICAgICAgICAweDM2CisgKiAgMjkgICAgICAgICA5OCAgICAgICAgIDB4MzYKKyAqICAzMCAgICAgICAgMTEwICAgICAgICAgMHgzNQorICogIDMxICAgICAgICAxMDQgICAgICAgICAweDM1CisgKiAgMzIgICAgICAgICA5OCAgICAgICAgIDB4MzUKKyAqICAzMyAgICAgICAgMTEwICAgICAgICAgMHgzNAorICogIDM0ICAgICAgICAxMDQgICAgICAgICAweDM0CisgKiAgMzUgICAgICAgICA5OCAgICAgICAgIDB4MzQKKyAqICAzNiAgICAgICAgMTEwICAgICAgICAgMHgzMworICogIDM3ICAgICAgICAxMDQgICAgICAgICAweDMzCisgKiAgMzggICAgICAgICA5OCAgICAgICAgIDB4MzMKKyAqICAzOSAgICAgICAgMTEwICAgICAgICAgMHgzMgorICogIDQwICAgICAgICAxMDQgICAgICAgICAweDMyCisgKiAgNDEgICAgICAgICA5OCAgICAgICAgIDB4MzIKKyAqICA0MiAgICAgICAgMTEwICAgICAgICAgMHgzMQorICogIDQzICAgICAgICAxMDQgICAgICAgICAweDMxCisgKiAgNDQgICAgICAgICA5OCAgICAgICAgIDB4MzEKKyAqICA0NSAgICAgICAgMTEwICAgICAgICAgMHgzMAorICogIDQ2ICAgICAgICAxMDQgICAgICAgICAweDMwCisgKiAgNDcgICAgICAgICA5OCAgICAgICAgIDB4MzAKKyAqICA0OCAgICAgICAgMTEwICAgICAgICAgIDB4NgorICogIDQ5ICAgICAgICAxMDQgICAgICAgICAgMHg2CisgKiAgNTAgICAgICAgICA5OCAgICAgICAgICAweDYKKyAqICA1MSAgICAgICAgMTEwICAgICAgICAgIDB4NQorICogIDUyICAgICAgICAxMDQgICAgICAgICAgMHg1CisgKiAgNTMgICAgICAgICA5OCAgICAgICAgICAweDUKKyAqICA1NCAgICAgICAgMTEwICAgICAgICAgIDB4NAorICogIDU1ICAgICAgICAxMDQgICAgICAgICAgMHg0CisgKiAgNTYgICAgICAgICA5OCAgICAgICAgICAweDQKKyAqICA1NyAgICAgICAgMTEwICAgICAgICAgIDB4MworICogIDU4ICAgICAgICAxMDQgICAgICAgICAgMHgzCisgKiAgNTkgICAgICAgICA5OCAgICAgICAgICAweDMKKyAqICA2MCAgICAgICAgMTEwICAgICAgICAgIDB4MgorICogIDYxICAgICAgICAxMDQgICAgICAgICAgMHgyCisgKiAgNjIgICAgICAgICA5OCAgICAgICAgICAweDIKKyAqICA2MyAgICAgICAgMTEwICAgICAgICAgIDB4MQorICogIDY0ICAgICAgICAxMDQgICAgICAgICAgMHgxCisgKiAgNjUgICAgICAgICA5OCAgICAgICAgICAweDEKKyAqICA2NiAgICAgICAgMTEwICAgICAgICAgIDB4MAorICogIDY3ICAgICAgICAxMDQgICAgICAgICAgMHgwCisgKiAgNjggICAgICAgICA5OCAgICAgICAgICAweDAKKyAqICA2OSAgICAgICAgIDk3ICAgICAgICAgICAgMAorICogIDcwICAgICAgICAgOTYgICAgICAgICAgICAwCisgKiAgNzEgICAgICAgICA5NSAgICAgICAgICAgIDAKKyAqICA3MiAgICAgICAgIDk0ICAgICAgICAgICAgMAorICogIDczICAgICAgICAgOTMgICAgICAgICAgICAwCisgKiAgNzQgICAgICAgICA5MiAgICAgICAgICAgIDAKKyAqICA3NSAgICAgICAgIDkxICAgICAgICAgICAgMAorICogIDc2ICAgICAgICAgOTAgICAgICAgICAgICAwCisgKiAgNzcgICAgICAgICA4OSAgICAgICAgICAgIDAKKyAqICA3OCAgICAgICAgIDg4ICAgICAgICAgICAgMAorICogIDc5ICAgICAgICAgODcgICAgICAgICAgICAwCisgKiAgODAgICAgICAgICA4NiAgICAgICAgICAgIDAKKyAqICA4MSAgICAgICAgIDg1ICAgICAgICAgICAgMAorICogIDgyICAgICAgICAgODQgICAgICAgICAgICAwCisgKiAgODMgICAgICAgICA4MyAgICAgICAgICAgIDAKKyAqICA4NCAgICAgICAgIDgyICAgICAgICAgICAgMAorICogIDg1ICAgICAgICAgODEgICAgICAgICAgICAwCisgKiAgODYgICAgICAgICA4MCAgICAgICAgICAgIDAKKyAqICA4NyAgICAgICAgIDc5ICAgICAgICAgICAgMAorICogIDg4ICAgICAgICAgNzggICAgICAgICAgICAwCisgKiAgODkgICAgICAgICA3NyAgICAgICAgICAgIDAKKyAqICA5MCAgICAgICAgIDc2ICAgICAgICAgICAgMAorICogIDkxICAgICAgICAgNzUgICAgICAgICAgICAwCisgKiAgOTIgICAgICAgICA3NCAgICAgICAgICAgIDAKKyAqICA5MyAgICAgICAgIDczICAgICAgICAgICAgMAorICogIDk0ICAgICAgICAgNzIgICAgICAgICAgICAwCisgKiAgOTUgICAgICAgICA3MSAgICAgICAgICAgIDAKKyAqICA5NiAgICAgICAgIDcwICAgICAgICAgICAgMAorICogIDk3ICAgICAgICAgNjkgICAgICAgICAgICAwCisgKiAgOTggICAgICAgICA2OCAgICAgICAgICAgIDAKKyAqLworCisvKioKKyAqIDUgR0h6IGdhaW4gdGFibGUKKyAqCisgKiBJbmRleCAgICBEc3AgZ2FpbiAgIFJhZGlvIGdhaW4KKyAqICAtOSAJICAgICAgMTIzICAgICAgICAgMHgzRiAgICAgIChoaWdoZXN0IGdhaW4pCisgKiAgLTggCSAgICAgIDExNyAgICAgICAgIDB4M0YKKyAqICAtNyAgICAgICAgMTEwICAgICAgICAgMHgzRgorICogIC02ICAgICAgICAxMDQgICAgICAgICAweDNGCisgKiAgLTUgICAgICAgICA5OCAgICAgICAgIDB4M0YKKyAqICAtNCAgICAgICAgMTEwICAgICAgICAgMHgzRQorICogIC0zICAgICAgICAxMDQgICAgICAgICAweDNFCisgKiAgLTIgICAgICAgICA5OCAgICAgICAgIDB4M0UKKyAqICAtMSAgICAgICAgMTEwICAgICAgICAgMHgzRAorICogICAwICAgICAgICAxMDQgICAgICAgICAweDNECisgKiAgIDEgICAgICAgICA5OCAgICAgICAgIDB4M0QKKyAqICAgMiAgICAgICAgMTEwICAgICAgICAgMHgzQworICogICAzICAgICAgICAxMDQgICAgICAgICAweDNDCisgKiAgIDQgICAgICAgICA5OCAgICAgICAgIDB4M0MKKyAqICAgNSAgICAgICAgMTEwICAgICAgICAgMHgzQgorICogICA2ICAgICAgICAxMDQgICAgICAgICAweDNCCisgKiAgIDcgICAgICAgICA5OCAgICAgICAgIDB4M0IKKyAqICAgOCAgICAgICAgMTEwICAgICAgICAgMHgzQQorICogICA5ICAgICAgICAxMDQgICAgICAgICAweDNBCisgKiAgMTAgICAgICAgICA5OCAgICAgICAgIDB4M0EKKyAqICAxMSAgICAgICAgMTEwICAgICAgICAgMHgzOQorICogIDEyICAgICAgICAxMDQgICAgICAgICAweDM5CisgKiAgMTMgICAgICAgICA5OCAgICAgICAgIDB4MzkKKyAqICAxNCAgICAgICAgMTEwICAgICAgICAgMHgzOAorICogIDE1ICAgICAgICAxMDQgICAgICAgICAweDM4CisgKiAgMTYgICAgICAgICA5OCAgICAgICAgIDB4MzgKKyAqICAxNyAgICAgICAgMTEwICAgICAgICAgMHgzNworICogIDE4ICAgICAgICAxMDQgICAgICAgICAweDM3CisgKiAgMTkgICAgICAgICA5OCAgICAgICAgIDB4MzcKKyAqICAyMCAgICAgICAgMTEwICAgICAgICAgMHgzNgorICogIDIxICAgICAgICAxMDQgICAgICAgICAweDM2CisgKiAgMjIgICAgICAgICA5OCAgICAgICAgIDB4MzYKKyAqICAyMyAgICAgICAgMTEwICAgICAgICAgMHgzNQorICogIDI0ICAgICAgICAxMDQgICAgICAgICAweDM1CisgKiAgMjUgICAgICAgICA5OCAgICAgICAgIDB4MzUKKyAqICAyNiAgICAgICAgMTEwICAgICAgICAgMHgzNAorICogIDI3ICAgICAgICAxMDQgICAgICAgICAweDM0CisgKiAgMjggICAgICAgICA5OCAgICAgICAgIDB4MzQKKyAqICAyOSAgICAgICAgMTEwICAgICAgICAgMHgzMworICogIDMwICAgICAgICAxMDQgICAgICAgICAweDMzCisgKiAgMzEgICAgICAgICA5OCAgICAgICAgIDB4MzMKKyAqICAzMiAgICAgICAgMTEwICAgICAgICAgMHgzMgorICogIDMzICAgICAgICAxMDQgICAgICAgICAweDMyCisgKiAgMzQgICAgICAgICA5OCAgICAgICAgIDB4MzIKKyAqICAzNSAgICAgICAgMTEwICAgICAgICAgMHgzMQorICogIDM2ICAgICAgICAxMDQgICAgICAgICAweDMxCisgKiAgMzcgICAgICAgICA5OCAgICAgICAgIDB4MzEKKyAqICAzOCAgICAgICAgMTEwICAgICAgICAgMHgzMAorICogIDM5ICAgICAgICAxMDQgICAgICAgICAweDMwCisgKiAgNDAgICAgICAgICA5OCAgICAgICAgIDB4MzAKKyAqICA0MSAgICAgICAgMTEwICAgICAgICAgMHgyNQorICogIDQyICAgICAgICAxMDQgICAgICAgICAweDI1CisgKiAgNDMgICAgICAgICA5OCAgICAgICAgIDB4MjUKKyAqICA0NCAgICAgICAgMTEwICAgICAgICAgMHgyNAorICogIDQ1ICAgICAgICAxMDQgICAgICAgICAweDI0CisgKiAgNDYgICAgICAgICA5OCAgICAgICAgIDB4MjQKKyAqICA0NyAgICAgICAgMTEwICAgICAgICAgMHgyMworICogIDQ4ICAgICAgICAxMDQgICAgICAgICAweDIzCisgKiAgNDkgICAgICAgICA5OCAgICAgICAgIDB4MjMKKyAqICA1MCAgICAgICAgMTEwICAgICAgICAgMHgyMgorICogIDUxICAgICAgICAxMDQgICAgICAgICAweDE4CisgKiAgNTIgICAgICAgICA5OCAgICAgICAgIDB4MTgKKyAqICA1MyAgICAgICAgMTEwICAgICAgICAgMHgxNworICogIDU0ICAgICAgICAxMDQgICAgICAgICAweDE3CisgKiAgNTUgICAgICAgICA5OCAgICAgICAgIDB4MTcKKyAqICA1NiAgICAgICAgMTEwICAgICAgICAgMHgxNgorICogIDU3ICAgICAgICAxMDQgICAgICAgICAweDE2CisgKiAgNTggICAgICAgICA5OCAgICAgICAgIDB4MTYKKyAqICA1OSAgICAgICAgMTEwICAgICAgICAgMHgxNQorICogIDYwICAgICAgICAxMDQgICAgICAgICAweDE1CisgKiAgNjEgICAgICAgICA5OCAgICAgICAgIDB4MTUKKyAqICA2MiAgICAgICAgMTEwICAgICAgICAgMHgxNAorICogIDYzICAgICAgICAxMDQgICAgICAgICAweDE0CisgKiAgNjQgICAgICAgICA5OCAgICAgICAgIDB4MTQKKyAqICA2NSAgICAgICAgMTEwICAgICAgICAgMHgxMworICogIDY2ICAgICAgICAxMDQgICAgICAgICAweDEzCisgKiAgNjcgICAgICAgICA5OCAgICAgICAgIDB4MTMKKyAqICA2OCAgICAgICAgMTEwICAgICAgICAgMHgxMgorICogIDY5ICAgICAgICAxMDQgICAgICAgICAweDA4CisgKiAgNzAgICAgICAgICA5OCAgICAgICAgIDB4MDgKKyAqICA3MSAgICAgICAgMTEwICAgICAgICAgMHgwNworICogIDcyICAgICAgICAxMDQgICAgICAgICAweDA3CisgKiAgNzMgICAgICAgICA5OCAgICAgICAgIDB4MDcKKyAqICA3NCAgICAgICAgMTEwICAgICAgICAgMHgwNgorICogIDc1ICAgICAgICAxMDQgICAgICAgICAweDA2CisgKiAgNzYgICAgICAgICA5OCAgICAgICAgIDB4MDYKKyAqICA3NyAgICAgICAgMTEwICAgICAgICAgMHgwNQorICogIDc4ICAgICAgICAxMDQgICAgICAgICAweDA1CisgKiAgNzkgICAgICAgICA5OCAgICAgICAgIDB4MDUKKyAqICA4MCAgICAgICAgMTEwICAgICAgICAgMHgwNAorICogIDgxICAgICAgICAxMDQgICAgICAgICAweDA0CisgKiAgODIgICAgICAgICA5OCAgICAgICAgIDB4MDQKKyAqICA4MyAgICAgICAgMTEwICAgICAgICAgMHgwMworICogIDg0ICAgICAgICAxMDQgICAgICAgICAweDAzCisgKiAgODUgICAgICAgICA5OCAgICAgICAgIDB4MDMKKyAqICA4NiAgICAgICAgMTEwICAgICAgICAgMHgwMgorICogIDg3ICAgICAgICAxMDQgICAgICAgICAweDAyCisgKiAgODggICAgICAgICA5OCAgICAgICAgIDB4MDIKKyAqICA4OSAgICAgICAgMTEwICAgICAgICAgMHgwMQorICogIDkwICAgICAgICAxMDQgICAgICAgICAweDAxCisgKiAgOTEgICAgICAgICA5OCAgICAgICAgIDB4MDEKKyAqICA5MiAgICAgICAgMTEwICAgICAgICAgMHgwMAorICogIDkzICAgICAgICAxMDQgICAgICAgICAweDAwCisgKiAgOTQgICAgICAgICA5OCAgICAgICAgIDB4MDAKKyAqICA5NSAgICAgICAgIDkzICAgICAgICAgMHgwMAorICogIDk2ICAgICAgICAgODggICAgICAgICAweDAwCisgKiAgOTcgICAgICAgICA4MyAgICAgICAgIDB4MDAKKyAqICA5OCAgICAgICAgIDc4ICAgICAgICAgMHgwMAorICovCisKKy8qKgorICogU2FuaXR5IGNoZWNrcyBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIEVFUFJPTSByZWd1bGF0b3J5IGxldmVscy4KKyAqIElmIEVFUFJPTSB2YWx1ZXMgZmFsbCBvdXRzaWRlIE1JTi9NQVggcmFuZ2UsIHVzZSBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBSZWd1bGF0b3J5IGxpbWl0cyByZWZlciB0byB0aGUgbWF4aW11bSBhdmVyYWdlIHR4cG93ZXIgYWxsb3dlZCBieQorICogcmVndWxhdG9yeSBhZ2VuY2llcyBpbiB0aGUgZ2VvZ3JhcGhpZXMgaW4gd2hpY2ggdGhlIGRldmljZSBpcyBtZWFudAorICogdG8gYmUgb3BlcmF0ZWQuICBUaGVzZSBsaW1pdHMgYXJlIFNLVS1zcGVjaWZpYyAoaS5lLiBnZW9ncmFwaHktc3BlY2lmaWMpLAorICogYW5kIGNoYW5uZWwtc3BlY2lmaWM7IGVhY2ggY2hhbm5lbCBoYXMgYW4gaW5kaXZpZHVhbCByZWd1bGF0b3J5IGxpbWl0CisgKiBsaXN0ZWQgaW4gdGhlIEVFUFJPTS4KKyAqCisgKiBVbml0cyBhcmUgaW4gaGFsZi1kQm0gKGkuZS4gIjM0IiBtZWFucyAxNyBkQm0pLgorICovCisjZGVmaW5lIElMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV8yNCAgICgzNCkKKyNkZWZpbmUgSUxfVFhfUE9XRVJfREVGQVVMVF9SRUdVTEFUT1JZXzUyICAgKDM0KQorI2RlZmluZSBJTF9UWF9QT1dFUl9SRUdVTEFUT1JZX01JTiAgICAgICAgICAoMCkKKyNkZWZpbmUgSUxfVFhfUE9XRVJfUkVHVUxBVE9SWV9NQVggICAgICAgICAgKDM0KQorCisvKioKKyAqIFNhbml0eSBjaGVja3MgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciBFRVBST00gc2F0dXJhdGlvbiBsZXZlbHMuCisgKiBJZiBFRVBST00gdmFsdWVzIGZhbGwgb3V0c2lkZSBNSU4vTUFYIHJhbmdlLCB1c2UgZGVmYXVsdCB2YWx1ZXMuCisgKgorICogU2F0dXJhdGlvbiBpcyB0aGUgaGlnaGVzdCBsZXZlbCB0aGF0IHRoZSBvdXRwdXQgcG93ZXIgYW1wbGlmaWVyIGNhbiBwcm9kdWNlCisgKiB3aXRob3V0IHNpZ25pZmljYW50IGNsaXBwaW5nIGRpc3RvcnRpb24uICBUaGlzIGlzIGEgInBlYWsiIHBvd2VyIGxldmVsLgorICogRGlmZmVyZW50IHR5cGVzIG9mIG1vZHVsYXRpb24gKGkuZS4gdmFyaW91cyAicmF0ZXMiLCBhbmQgT0ZETSB2cy4gQ0NLKQorICogcmVxdWlyZSBkaWZmZXJpbmcgYW1vdW50cyBvZiBiYWNrb2ZmLCByZWxhdGl2ZSB0byB0aGVpciBhdmVyYWdlIHBvd2VyIG91dHB1dCwKKyAqIGluIG9yZGVyIHRvIGF2b2lkIGNsaXBwaW5nIGRpc3RvcnRpb24uCisgKgorICogRHJpdmVyIG11c3QgbWFrZSBzdXJlIHRoYXQgaXQgaXMgdmlvbGF0aW5nIG5laXRoZXIgdGhlIHNhdHVyYXRpb24gbGltaXQsCisgKiBub3IgdGhlIHJlZ3VsYXRvcnkgbGltaXQsIHdoZW4gY2FsY3VsYXRpbmcgVHggcG93ZXIgc2V0dGluZ3MgZm9yIHZhcmlvdXMKKyAqIHJhdGVzLgorICoKKyAqIFVuaXRzIGFyZSBpbiBoYWxmLWRCbSAoaS5lLiAiMzgiIG1lYW5zIDE5IGRCbSkuCisgKi8KKyNkZWZpbmUgSUxfVFhfUE9XRVJfREVGQVVMVF9TQVRVUkFUSU9OXzI0ICAgKDM4KQorI2RlZmluZSBJTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fNTIgICAoMzgpCisjZGVmaW5lIElMX1RYX1BPV0VSX1NBVFVSQVRJT05fTUlOICAgICAgICAgICgyMCkKKyNkZWZpbmUgSUxfVFhfUE9XRVJfU0FUVVJBVElPTl9NQVggICAgICAgICAgKDUwKQorCisvKioKKyAqIENoYW5uZWwgZ3JvdXBzIHVzZWQgZm9yIFR4IEF0dGVudWF0aW9uIGNhbGlicmF0aW9uIChNSU1PIHR4IGNoYW5uZWwgYmFsYW5jZSkKKyAqIGFuZCB0aGVybWFsIFR4cG93ZXIgY2FsaWJyYXRpb24uCisgKgorICogV2hlbiBjYWxjdWxhdGluZyB0eHBvd2VyLCBkcml2ZXIgbXVzdCBjb21wZW5zYXRlIGZvciBjdXJyZW50IGRldmljZQorICogdGVtcGVyYXR1cmU7IGhpZ2hlciB0ZW1wZXJhdHVyZSByZXF1aXJlcyBoaWdoZXIgZ2Fpbi4gIERyaXZlciBtdXN0IGNhbGN1bGF0ZQorICogY3VycmVudCB0ZW1wZXJhdHVyZSAoc2VlICI0OTY1IHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9uIiksIHRoZW4gY29tcGFyZSB2cy4KKyAqIGZhY3RvcnkgY2FsaWJyYXRpb24gdGVtcGVyYXR1cmUgaW4gRUVQUk9NOyBpZiBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIGhpZ2hlcgorICogdGhhbiBmYWN0b3J5IHRlbXBlcmF0dXJlLCBkcml2ZXIgbXVzdCAqaW5jcmVhc2UqIGdhaW4gYnkgcHJvcG9ydGlvbnMgc2hvd24KKyAqIGluIHRhYmxlIGJlbG93LiAgSWYgY3VycmVudCB0ZW1wZXJhdHVyZSBpcyBsb3dlciB0aGFuIGZhY3RvcnksIGRyaXZlciBtdXN0CisgKiAqZGVjcmVhc2UqIGdhaW4uCisgKgorICogRGlmZmVyZW50IGZyZXF1ZW5jeSByYW5nZXMgcmVxdWlyZSBkaWZmZXJlbnQgY29tcGVuc2F0aW9uLCBhcyBzaG93biBiZWxvdy4KKyAqLworLyogR3JvdXAgMCwgNS4yIEdIeiBjaCAzNC00MzogIDQuNSBkZWdyZWVzIHBlciAxLzIgZEIuICovCisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSMV9GQ0ggMzQKKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1IxX0xDSCA0MworCisvKiBHcm91cCAxLCA1LjMgR0h6IGNoIDQ0LTcwOiAgNC4wIGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1IyX0ZDSCA0NAorI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjJfTENIIDcwCisKKy8qIEdyb3VwIDIsIDUuNSBHSHogY2ggNzEtMTI0OiAgNC4wIGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1IzX0ZDSCA3MQorI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjNfTENIIDEyNAorCisvKiBHcm91cCAzLCA1LjcgR0h6IGNoIDEyNS0yMDA6ICA0LjAgZGVncmVlcyBwZXIgMS8yIGRCLiAqLworI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjRfRkNIIDEyNQorI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjRfTENIIDIwMAorCisvKiBHcm91cCA0LCAyLjQgR0h6IGFsbCBjaGFubmVsczogIDMuNSBkZWdyZWVzIHBlciAxLzIgZEIuICovCisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSNV9GQ0ggMQorI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjVfTENIIDIwCisKK2VudW0geworCUNBTElCX0NIX0dST1VQXzEgPSAwLAorCUNBTElCX0NIX0dST1VQXzIgPSAxLAorCUNBTElCX0NIX0dST1VQXzMgPSAyLAorCUNBTElCX0NIX0dST1VQXzQgPSAzLAorCUNBTElCX0NIX0dST1VQXzUgPSA0LAorCUNBTElCX0NIX0dST1VQX01BWAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKiBFTkQgVFhQT1dFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUeC9SeCBRdWV1ZXMKKyAqCisgKiBNb3N0IGNvbW11bmljYXRpb24gYmV0d2VlbiBkcml2ZXIgYW5kIDQ5NjUgaXMgdmlhIHF1ZXVlcyBvZiBkYXRhIGJ1ZmZlcnMuCisgKiBGb3IgZXhhbXBsZSwgYWxsIGNvbW1hbmRzIHRoYXQgdGhlIGRyaXZlciBpc3N1ZXMgdG8gZGV2aWNlJ3MgZW1iZWRkZWQKKyAqIGNvbnRyb2xsZXIgKHVDb2RlKSBhcmUgdmlhIHRoZSBjb21tYW5kIHF1ZXVlIChvbmUgb2YgdGhlIFR4IHF1ZXVlcykuICBBbGwKKyAqIHVDb2RlIGNvbW1hbmQgcmVzcG9uc2VzL3JlcGxpZXMvbm90aWZpY2F0aW9ucywgaW5jbHVkaW5nIFJ4IGZyYW1lcywgYXJlCisgKiBjb252ZXllZCBmcm9tIHVDb2RlIHRvIGRyaXZlciB2aWEgdGhlIFJ4IHF1ZXVlLgorICoKKyAqIE1vc3Qgc3VwcG9ydCBmb3IgdGhlc2UgcXVldWVzLCBpbmNsdWRpbmcgaGFuZHNoYWtlIHN1cHBvcnQsIHJlc2lkZXMgaW4KKyAqIHN0cnVjdHVyZXMgaW4gaG9zdCBEUkFNLCBzaGFyZWQgYmV0d2VlbiB0aGUgZHJpdmVyIGFuZCB0aGUgZGV2aWNlLiAgV2hlbgorICogYWxsb2NhdGluZyB0aGlzIG1lbW9yeSwgdGhlIGRyaXZlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IGRhdGEgd3JpdHRlbiBieQorICogdGhlIGhvc3QgQ1BVIHVwZGF0ZXMgRFJBTSBpbW1lZGlhdGVseSAoYW5kIGRvZXMgbm90IGdldCAic3R1Y2siIGluIENQVSdzCisgKiBjYWNoZSBtZW1vcnkpLCBzbyBEUkFNIGFuZCBjYWNoZSBhcmUgY29uc2lzdGVudCwgYW5kIHRoZSBkZXZpY2UgY2FuCisgKiBpbW1lZGlhdGVseSBzZWUgY2hhbmdlcyBtYWRlIGJ5IHRoZSBkcml2ZXIuCisgKgorICogNDk2NSBzdXBwb3J0cyB1cCB0byAxNiBEUkFNLWJhc2VkIFR4IHF1ZXVlcywgYW5kIHNlcnZpY2VzIHRoZXNlIHF1ZXVlcyB2aWEKKyAqIHVwIHRvIDcgRE1BIGNoYW5uZWxzIChGSUZPcykuICBFYWNoIFR4IHF1ZXVlIGlzIHN1cHBvcnRlZCBieSBhIGNpcmN1bGFyIGFycmF5CisgKiBpbiBEUkFNIGNvbnRhaW5pbmcgMjU2IFRyYW5zbWl0IEZyYW1lIERlc2NyaXB0b3JzIChURkRzKS4KKyAqLworI2RlZmluZSBJTDQ5X05VTV9GSUZPUwk3CisjZGVmaW5lIElMNDlfQ01EX0ZJRk9fTlVNCTQKKyNkZWZpbmUgSUw0OV9OVU1fUVVFVUVTCTE2CisjZGVmaW5lIElMNDlfTlVNX0FNUERVX1FVRVVFUwk4CisKKy8qKgorICogc3RydWN0IGlsNDk2NV9zY2hlZHFfYmNfdGJsCisgKgorICogQnl0ZSBDb3VudCB0YWJsZQorICoKKyAqIEVhY2ggVHggcXVldWUgdXNlcyBhIGJ5dGUtY291bnQgdGFibGUgY29udGFpbmluZyAzMjAgZW50cmllczoKKyAqIG9uZSAxNi1iaXQgZW50cnkgZm9yIGVhY2ggb2YgMjU2IFRGRHMsIHBsdXMgYW4gYWRkaXRpb25hbCA2NCBlbnRyaWVzIHRoYXQKKyAqIGR1cGxpY2F0ZSB0aGUgZmlyc3QgNjQgZW50cmllcyAodG8gYXZvaWQgd3JhcC1hcm91bmQgd2l0aGluIGEgVHggd2luOworICogbWF4IFR4IHdpbiBpcyA2NCBURkRzKS4KKyAqCisgKiBXaGVuIGRyaXZlciBzZXRzIHVwIGEgbmV3IFRGRCwgaXQgbXVzdCBhbHNvIGVudGVyIHRoZSB0b3RhbCBieXRlIGNvdW50CisgKiBvZiB0aGUgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQgaW50byB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgYnl0ZQorICogY291bnQgdGFibGUgZm9yIHRoZSBjaG9zZW4gVHggcXVldWUuICBJZiB0aGUgVEZEIGlkeCBpcyAwLTYzLCB0aGUgZHJpdmVyCisgKiBtdXN0IGR1cGxpY2F0ZSB0aGUgYnl0ZSBjb3VudCBlbnRyeSBpbiBjb3JyZXNwb25kaW5nIGlkeCAyNTYtMzE5LgorICoKKyAqIHBhZGRpbmcgcHV0cyBlYWNoIGJ5dGUgY291bnQgdGFibGUgb24gYSAxMDI0LWJ5dGUgYm91bmRhcnk7CisgKiA0OTY1IGFzc3VtZXMgdGFibGVzIGFyZSBzZXBhcmF0ZWQgYnkgMTAyNCBieXRlcy4KKyAqLworc3RydWN0IGlsNDk2NV9zY2RfYmNfdGJsIHsKKwlfX2xlMTYgdGZkX29mZnNldFtURkRfUVVFVUVfQkNfU0laRV07CisJdTggcGFkWzEwMjQgLSAoVEZEX1FVRVVFX0JDX1NJWkUpICogc2l6ZW9mKF9fbGUxNildOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBJTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQJCSgweDAwMDAwMCkKKworLyogUlNTSSB0byBkQm0gKi8KKyNkZWZpbmUgSUw0OTY1X1JTU0lfT0ZGU0VUCTQ0CisKKy8qIFBDSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJX0NGR19SRVRSWV9USU1FT1VUCTB4MDQxCisKKy8qIFBDSSByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wwU19FTgkweDAxCisjZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTgkweDAyCisKKyNkZWZpbmUgSUw0OTY1X0RFRkFVTFRfVFhfUkVUUlkgIDE1CisKKy8qIEVFUFJPTSAqLworI2RlZmluZSBJTDQ5NjVfRklSU1RfQU1QRFVfUVVFVUUJMTAKKworLyogQ2FsaWJyYXRpb24gKi8KK3ZvaWQgaWw0OTY1X2NoYWluX25vaXNlX2NhbGlicmF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgdm9pZCAqc3RhdF9yZXNwKTsKK3ZvaWQgaWw0OTY1X3NlbnNpdGl2aXR5X2NhbGlicmF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgdm9pZCAqcmVzcCk7Cit2b2lkIGlsNDk2NV9pbml0X3NlbnNpdGl2aXR5KHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV9yZXNldF9ydW5fdGltZV9jYWxpYihzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbDQ5NjVfY2FsaWJfZnJlZV9yZXN1bHRzKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qIERlYnVnICovCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKK3NzaXplX3QgaWw0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Citzc2l6ZV90IGlsNDk2NV91Y29kZV90eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3NpemVfdCBpbDQ5NjVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJCQkJbG9mZl90ICpwcG9zKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZsb3cgSGFuZGxlciBEZWZpbml0aW9ucyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBJL08gYXJlYSBpcyBkaXJlY3RseSByZWFkL3dyaXRhYmxlIGJ5IGRyaXZlciAoZS5nLiBMaW51eCB1c2VzIHdyaXRlbCgpKQorICogQWRkcmVzc2VzIGFyZSBvZmZzZXRzIGZyb20gZGV2aWNlJ3MgUENJIGhhcmR3YXJlIGJhc2UgYWRkcmVzcy4KKyAqLworI2RlZmluZSBGSDQ5X01FTV9MT1dFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgxMDAwKQorI2RlZmluZSBGSDQ5X01FTV9VUFBFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgyMDAwKQorCisvKioKKyAqIEtlZXAtV2FybSAoS1cpIGJ1ZmZlciBiYXNlIGFkZHJlc3MuCisgKgorICogRHJpdmVyIG11c3QgYWxsb2NhdGUgYSA0S0J5dGUgYnVmZmVyIHRoYXQgaXMgdXNlZCBieSA0OTY1IGZvciBrZWVwaW5nIHRoZQorICogaG9zdCBEUkFNIHBvd2VyZWQgb24gKHZpYSBkdW1teSBhY2Nlc3NlcyB0byBEUkFNKSB0byBtYWludGFpbiBsb3ctbGF0ZW5jeQorICogRFJBTSBhY2Nlc3Mgd2hlbiA0OTY1IGlzIFR4aW5nIG9yIFJ4aW5nLiAgVGhlIGR1bW15IGFjY2Vzc2VzIHByZXZlbnQgaG9zdAorICogZnJvbSBnb2luZyBpbnRvIGEgcG93ZXItc2F2aW5ncyBtb2RlIHRoYXQgd291bGQgY2F1c2UgaGlnaGVyIERSQU0gbGF0ZW5jeSwKKyAqIGFuZCBwb3NzaWJsZSBkYXRhIG92ZXIvdW5kZXItcnVucywgYmVmb3JlIGFsbCBUeC9SeCBpcyBjb21wbGV0ZS4KKyAqCisgKiBEcml2ZXIgbG9hZHMgRkg0OV9LV19NRU1fQUREUl9SRUcgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyAoYml0cyAzNTo0KQorICogb2YgdGhlIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSA0SyBhbGlnbmVkLiAgT25jZSB0aGlzIGlzIHNldCB1cCwgdGhlIDQ5NjUKKyAqIGF1dG9tYXRpY2FsbHkgaW52b2tlcyBrZWVwLXdhcm0gYWNjZXNzZXMgd2hlbiBub3JtYWwgYWNjZXNzZXMgbWlnaHQgbm90CisgKiBiZSBzdWZmaWNpZW50IHRvIG1haW50YWluIGZhc3QgRFJBTSByZXNwb25zZS4KKyAqCisgKiBCaXQgZmllbGRzOgorICogIDMxLTA6ICBLZWVwLXdhcm0gYnVmZmVyIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBbMzU6NF0sIG11c3QgYmUgNEsgYWxpZ25lZAorICovCisjZGVmaW5lIEZINDlfS1dfTUVNX0FERFJfUkVHCQkgICAgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4OTdDKQorCisvKioKKyAqIFRGRCBDaXJjdWxhciBCdWZmZXJzIEJhc2UgKENCQkMpIGFkZHJlc3NlcworICoKKyAqIDQ5NjUgaGFzIDE2IGJhc2UgcG9pbnRlciByZWdpc3RlcnMsIG9uZSBmb3IgZWFjaCBvZiAxNiBob3N0LURSQU0tcmVzaWRlbnQKKyAqIGNpcmN1bGFyIGJ1ZmZlcnMgKENCcy9xdWV1ZXMpIGNvbnRhaW5pbmcgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvcnMgKFRGRHMpCisgKiAoc2VlIHN0cnVjdCBpbF90ZmRfZnJhbWUpLiAgVGhlc2UgMTYgcG9pbnRlciByZWdpc3RlcnMgYXJlIG9mZnNldCBieSAweDA0CisgKiBieXRlcyBmcm9tIG9uZSBhbm90aGVyLiAgRWFjaCBURkQgY2lyY3VsYXIgYnVmZmVyIGluIERSQU0gbXVzdCBiZSAyNTYtYnl0ZQorICogYWxpZ25lZCAoYWRkcmVzcyBiaXRzIDAtNyBtdXN0IGJlIDApLgorICoKKyAqIEJpdCBmaWVsZHMgaW4gZWFjaCBwb2ludGVyIHJlZ2lzdGVyOgorICogIDI3LTA6IFRGRCBDQiBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgWzM1OjhdLCBtdXN0IGJlIDI1Ni1ieXRlIGFsaWduZWQKKyAqLworI2RlZmluZSBGSDQ5X01FTV9DQkJDX0xPV0VSX0JPVU5EICAgICAgICAgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4OUQwKQorI2RlZmluZSBGSDQ5X01FTV9DQkJDX1VQUEVSX0JPVU5EICAgICAgICAgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4QTEwKQorCisvKiBGaW5kIFRGRCBDQiBiYXNlIHBvaW50ZXIgZm9yIGdpdmVuIHF1ZXVlIChyYW5nZSAwLTE1KS4gKi8KKyNkZWZpbmUgRkg0OV9NRU1fQ0JCQ19RVUVVRSh4KSAgKEZINDlfTUVNX0NCQkNfTE9XRVJfQk9VTkQgKyAoeCkgKiAweDQpCisKKy8qKgorICogUnggU1JBTSBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXJzIChSU0NTUikKKyAqCisgKiBUaGVzZSByZWdpc3RlcnMgcHJvdmlkZSBoYW5kc2hha2UgYmV0d2VlbiBkcml2ZXIgYW5kIDQ5NjUgZm9yIHRoZSBSeCBxdWV1ZQorICogKHRoaXMgcXVldWUgaGFuZGxlcyAqYWxsKiBjb21tYW5kIHJlc3BvbnNlcywgbm90aWZpY2F0aW9ucywgUnggZGF0YSwgZXRjLgorICogc2VudCBmcm9tIDQ5NjUgdUNvZGUgdG8gaG9zdCBkcml2ZXIpLiAgVW5saWtlIFR4LCB0aGVyZSBpcyBvbmx5IG9uZSBSeAorICogcXVldWUsIGFuZCBvbmx5IG9uZSBSeCBETUEvRklGTyBjaGFubmVsLiAgQWxzbyB1bmxpa2UgVHgsIHdoaWNoIGNhbgorICogY29uY2F0ZW5hdGUgdXAgdG8gMjAgRFJBTSBidWZmZXJzIHRvIGZvcm0gYSBUeCBmcmFtZSwgZWFjaCBSZWNlaXZlIEJ1ZmZlcgorICogRGVzY3JpcHRvciAoUkJEKSBwb2ludHMgdG8gb25seSBvbmUgUnggQnVmZmVyIChSQik7IHRoZXJlIGlzIGEgMToxCisgKiBtYXBwaW5nIGJldHdlZW4gUkJEcyBhbmQgUkJzLgorICoKKyAqIERyaXZlciBtdXN0IGFsbG9jYXRlIGhvc3QgRFJBTSBtZW1vcnkgZm9yIHRoZSBmb2xsb3dpbmcsIGFuZCBzZXQgdGhlCisgKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGVhY2ggaW50byA0OTY1IHJlZ2lzdGVyczoKKyAqCisgKiAxKSAgUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvciAoUkJEKSBjaXJjdWxhciBidWZmZXIgKENCKSwgdHlwaWNhbGx5IHdpdGggMjU2CisgKiAgICAgZW50cmllcyAoYWx0aG91Z2ggYW55IHBvd2VyIG9mIDIsIHVwIHRvIDQwOTYsIGlzIHNlbGVjdGFibGUgYnkgZHJpdmVyKS4KKyAqICAgICBFYWNoIGVudHJ5ICgxIGR3b3JkKSBwb2ludHMgdG8gYSByZWNlaXZlIGJ1ZmZlciAoUkIpIG9mIGNvbnNpc3RlbnQgc2l6ZQorICogICAgICh0eXBpY2FsbHkgNEssIGFsdGhvdWdoIDhLIG9yIDE2SyBhcmUgYWxzbyBzZWxlY3RhYmxlIGJ5IGRyaXZlcikuCisgKiAgICAgRHJpdmVyIHNldHMgdXAgUkIgc2l6ZSBhbmQgbnVtYmVyIG9mIFJCRHMgaW4gdGhlIENCIHZpYSBSeCBjb25maWcKKyAqICAgICByZWdpc3RlciBGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcuCisgKgorICogICAgIEJpdCBmaWVsZHMgd2l0aGluIG9uZSBSQkQ6CisgKiAgICAgMjctMDogIFJlY2VpdmUgQnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MgYml0cyBbMzU6OF0sIDI1Ni1ieXRlIGFsaWduZWQKKyAqCisgKiAgICAgRHJpdmVyIHNldHMgcGh5c2ljYWwgYWRkcmVzcyBbMzU6OF0gb2YgYmFzZSBvZiBSQkQgY2lyY3VsYXIgYnVmZmVyCisgKiAgICAgaW50byBGSDQ5X1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHIFsyNzowXS4KKyAqCisgKiAyKSAgUnggc3RhdHVzIGJ1ZmZlciwgOCBieXRlcywgaW4gd2hpY2ggNDk2NSBpbmRpY2F0ZXMgd2hpY2ggUnggQnVmZmVycworICogICAgIChSQnMpIGhhdmUgYmVlbiBmaWxsZWQsIHZpYSBhICJ3cml0ZSBwb2ludGVyIiwgYWN0dWFsbHkgdGhlIGlkeCBvZgorICogICAgIHRoZSBSQidzIGNvcnJlc3BvbmRpbmcgUkJEIHdpdGhpbiB0aGUgY2lyY3VsYXIgYnVmZmVyLiAgRHJpdmVyIHNldHMKKyAqICAgICBwaHlzaWNhbCBhZGRyZXNzIFszNTo0XSBpbnRvIEZINDlfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRyBbMzE6MF0uCisgKgorICogICAgIEJpdCBmaWVsZHMgaW4gbG93ZXIgZHdvcmQgb2YgUnggc3RhdHVzIGJ1ZmZlciAodXBwZXIgZHdvcmQgbm90IHVzZWQKKyAqICAgICBieSBkcml2ZXI7IHNlZSBzdHJ1Y3QgaWw0OTY1X3NoYXJlZCwgdmFsMCk6CisgKiAgICAgMzEtMTI6ICBOb3QgdXNlZCBieSBkcml2ZXIKKyAqICAgICAxMS0gMDogIEluZGV4IG9mIGxhc3QgZmlsbGVkIFJ4IGJ1ZmZlciBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAoNDk2NSB3cml0ZXMsIGRyaXZlciByZWFkcyB0aGlzIHZhbHVlKQorICoKKyAqIEFzIHRoZSBkcml2ZXIgcHJlcGFyZXMgUmVjZWl2ZSBCdWZmZXJzIChSQnMpIGZvciA0OTY1IHRvIGZpbGwsIGRyaXZlciBtdXN0CisgKiBlbnRlciBwb2ludGVycyB0byB0aGVzZSBSQnMgaW50byBjb250aWd1b3VzIFJCRCBjaXJjdWxhciBidWZmZXIgZW50cmllcywKKyAqIGFuZCB1cGRhdGUgdGhlIDQ5NjUncyAid3JpdGUiIGlkeCByZWdpc3RlciwKKyAqIEZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcuCisgKgorICogVGhpcyAid3JpdGUiIGlkeCBjb3JyZXNwb25kcyB0byB0aGUgKm5leHQqIFJCRCB0aGF0IHRoZSBkcml2ZXIgd2lsbCBtYWtlCisgKiBhdmFpbGFibGUsIGkuZS4gb25lIFJCRCBwYXN0IHRoZSB0YWlsIG9mIHRoZSByZWFkeS10by1maWxsIFJCRHMgd2l0aGluCisgKiB0aGUgY2lyY3VsYXIgYnVmZmVyLiAgVGhpcyB2YWx1ZSBzaG91bGQgaW5pdGlhbGx5IGJlIDAgKGJlZm9yZSBwcmVwYXJpbmcgYW55CisgKiBSQnMpLCBzaG91bGQgYmUgOCBhZnRlciBwcmVwYXJpbmcgdGhlIGZpcnN0IDggUkJzIChmb3IgZXhhbXBsZSksIGFuZCBtdXN0CisgKiB3cmFwIGJhY2sgdG8gMCBhdCB0aGUgZW5kIG9mIHRoZSBjaXJjdWxhciBidWZmZXIgKGJ1dCBkb24ndCB3cmFwIGJlZm9yZQorICogInJlYWQiIGlkeCBoYXMgYWR2YW5jZWQgcGFzdCAxISAgU2VlIGJlbG93KS4KKyAqIE5PVEU6ICA0OTY1IEVYUEVDVFMgVEhFIFdSSVRFIElEWCBUTyBCRSBJTkNSRU1FTlRFRCBJTiBNVUxUSVBMRVMgT0YgOC4KKyAqCisgKiBBcyB0aGUgNDk2NSBmaWxscyBSQnMgKHJlZmVyZW5jZWQgZnJvbSBjb250aWd1b3VzIFJCRHMgd2l0aGluIHRoZSBjaXJjdWxhcgorICogYnVmZmVyKSwgaXQgdXBkYXRlcyB0aGUgUnggc3RhdHVzIGJ1ZmZlciBpbiBob3N0IERSQU0sIDIpIGRlc2NyaWJlZCBhYm92ZSwKKyAqIHRvIHRlbGwgdGhlIGRyaXZlciB0aGUgaWR4IG9mIHRoZSBsYXRlc3QgZmlsbGVkIFJCRC4gIFRoZSBkcml2ZXIgbXVzdAorICogcmVhZCB0aGlzICJyZWFkIiBpZHggZnJvbSBEUkFNIGFmdGVyIHJlY2VpdmluZyBhbiBSeCBpbnRlcnJ1cHQgZnJvbSA0OTY1LgorICoKKyAqIFRoZSBkcml2ZXIgbXVzdCBhbHNvIGludGVybmFsbHkga2VlcCB0cmFjayBvZiBhIHRoaXJkIGlkeCwgd2hpY2ggaXMgdGhlCisgKiBuZXh0IFJCRCB0byBwcm9jZXNzLiAgV2hlbiByZWNlaXZpbmcgYW4gUnggaW50ZXJydXB0LCBkcml2ZXIgc2hvdWxkIHByb2Nlc3MKKyAqIGFsbCBmaWxsZWQgYnV0IHVucHJvY2Vzc2VkIFJCcyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBSQgorICogY29ycmVzcG9uZGluZyB0byB0aGUgInJlYWQiIGlkeC4gIEZvciBleGFtcGxlLCBpZiAicmVhZCIgaWR4IGJlY29tZXMgIjEiLAorICogZHJpdmVyIG1heSBwcm9jZXNzIHRoZSBSQiBwb2ludGVkIHRvIGJ5IFJCRCAwLiAgRGVwZW5kaW5nIG9uIHZvbHVtZSBvZgorICogdHJhZmZpYywgdGhlcmUgbWF5IGJlIG1hbnkgUkJzIHRvIHByb2Nlc3MuCisgKgorICogSWYgcmVhZCBpZHggPT0gd3JpdGUgaWR4LCA0OTY1IHRoaW5rcyB0aGVyZSBpcyBubyByb29tIHRvIHB1dCBuZXcgZGF0YS4KKyAqIER1ZSB0byB0aGlzLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsbGVkIFJCcyBpcyAyNTUsIGluc3RlYWQgb2YgMjU2LiAgVG8KKyAqIGJlIHNhZmUsIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGEgZ2FwIG9mIGF0IGxlYXN0IDIgUkJEcyBiZXR3ZWVuICJ3cml0ZSIKKyAqIGFuZCAicmVhZCIgaWR4ZXM7IHRoYXQgaXMsIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjU0CisgKiBidWZmZXJzIHdhaXRpbmcgdG8gYmUgZmlsbGVkLgorICovCisjZGVmaW5lIEZINDlfTUVNX1JTQ1NSX0xPV0VSX0JPVU5ECShGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4QkMwKQorI2RlZmluZSBGSDQ5X01FTV9SU0NTUl9VUFBFUl9CT1VORAkoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEMwMCkKKyNkZWZpbmUgRkg0OV9NRU1fUlNDU1JfQ0hOTDAJCShGSDQ5X01FTV9SU0NTUl9MT1dFUl9CT1VORCkKKworLyoqCisgKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgOC1ieXRlIFJ4IFN0YXR1cyBidWZmZXIuCisgKiBCaXQgZmllbGRzOgorICogIDMxLTA6IFJ4IHN0YXR1cyBidWZmZXIgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo0XSwgbXVzdCAxNi1ieXRlIGFsaWduZWQuCisgKi8KKyNkZWZpbmUgRkg0OV9SU0NTUl9DSE5MMF9TVFRTX1dQVFJfUkVHCShGSDQ5X01FTV9SU0NTUl9DSE5MMCkKKworLyoqCisgKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgUnggQnVmZmVyIERlc2NyaXB0b3IgQ2lyY3VsYXIgQnVmZmVyLgorICogQml0IGZpZWxkczoKKyAqICAyNy0wOiAgUkJEIENEIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBbMzU6OF0sIG11c3QgYmUgMjU2LWJ5dGUgYWxpZ25lZC4KKyAqLworI2RlZmluZSBGSDQ5X1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHCShGSDQ5X01FTV9SU0NTUl9DSE5MMCArIDB4MDA0KQorCisvKioKKyAqIFJ4IHdyaXRlIHBvaW50ZXIgKGlkeCwgcmVhbGx5ISkuCisgKiBCaXQgZmllbGRzOgorICogIDExLTA6ICBJbmRleCBvZiBkcml2ZXIncyBtb3N0IHJlY2VudCBwcmVwYXJlZC10by1iZS1maWxsZWQgUkJELCArIDEuCisgKiAgICAgICAgIE5PVEU6ICBGb3IgMjU2LWVudHJ5IGNpcmN1bGFyIGJ1ZmZlciwgdXNlIG9ubHkgYml0cyBbNzowXS4KKyAqLworI2RlZmluZSBGSDQ5X1JTQ1NSX0NITkwwX1JCRENCX1dQVFJfUkVHCShGSDQ5X01FTV9SU0NTUl9DSE5MMCArIDB4MDA4KQorI2RlZmluZSBGSDQ5X1JTQ1NSX0NITkwwX1dQVFIgICAgICAgIChGSDQ5X1JTQ1NSX0NITkwwX1JCRENCX1dQVFJfUkVHKQorCisvKioKKyAqIFJ4IENvbmZpZy9TdGF0dXMgUmVnaXN0ZXJzIChSQ1NSKQorICogUnggQ29uZmlnIFJlZyBmb3IgY2hhbm5lbCAwIChvbmx5IGNoYW5uZWwgdXNlZCkKKyAqCisgKiBEcml2ZXIgbXVzdCBpbml0aWFsaXplIEZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRyBhcyBmb2xsb3dzIGZvcgorICogbm9ybWFsIG9wZXJhdGlvbiAoc2VlIGJpdCBmaWVsZHMpLgorICoKKyAqIENsZWFyaW5nIEZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRyB0byAwIHR1cm5zIG9mZiBSeCBETUEuCisgKiBEcml2ZXIgc2hvdWxkIHBvbGwgRkg0OV9NRU1fUlNTUl9SWF9TVEFUVVNfUkVHCWZvcgorICogRkg0OV9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUgKGJpdCAyNCkgYmVmb3JlIGNvbnRpbnVpbmcuCisgKgorICogQml0IGZpZWxkczoKKyAqIDMxLTMwOiBSeCBETUEgY2hhbm5lbCBlbmFibGU6ICcwMCcgb2ZmL3BhdXNlLCAnMDEnIHBhdXNlIGF0IGVuZCBvZiBmcmFtZSwKKyAqICAgICAgICAnMTAnIG9wZXJhdGUgbm9ybWFsbHkKKyAqIDI5LTI0OiByZXNlcnZlZAorICogMjMtMjA6ICMgUkJEcyBpbiBjaXJjdWxhciBidWZmZXIgPSAyXnZhbHVlOyB1c2UgIjgiIGZvciAyNTYgUkJEcyAobm9ybWFsKSwKKyAqICAgICAgICBtaW4gIjUiIGZvciAzMiBSQkRzLCBtYXggIjEyIiBmb3IgNDA5NiBSQkRzLgorICogMTktMTg6IHJlc2VydmVkCisgKiAxNy0xNjogc2l6ZSBvZiBlYWNoIHJlY2VpdmUgYnVmZmVyOyAnMDAnIDRLIChub3JtYWwpLCAnMDEnIDhLLAorICogICAgICAgICcxMCcgMTJLLCAnMTEnIDE2Sy4KKyAqIDE1LTE0OiByZXNlcnZlZAorICogMTMtMTI6IElSUSBkZXN0aW5hdGlvbjsgJzAwJyBub25lLCAnMDEnIGhvc3QgZHJpdmVyIChub3JtYWwgb3BlcmF0aW9uKQorICogMTEtIDQ6IHRpbWVvdXQgZm9yIGNsb3NpbmcgUnggYnVmZmVyIGFuZCBpbnRlcnJ1cHRpbmcgaG9zdCAodW5pdHMgMzIgdXNlYykKKyAqICAgICAgICB0eXBpY2FsIHZhbHVlIDB4MTAgKGFib3V0IDEvMiBtc2VjKQorICogIDMtIDA6IHJlc2VydmVkCisgKi8KKyNkZWZpbmUgRkg0OV9NRU1fUkNTUl9MT1dFUl9CT1VORCAgICAgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4QzAwKQorI2RlZmluZSBGSDQ5X01FTV9SQ1NSX1VQUEVSX0JPVU5EICAgICAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhDQzApCisjZGVmaW5lIEZINDlfTUVNX1JDU1JfQ0hOTDAgICAgICAgICAgICAoRkg0OV9NRU1fUkNTUl9MT1dFUl9CT1VORCkKKworI2RlZmluZSBGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcJKEZINDlfTUVNX1JDU1JfQ0hOTDApCisKKyNkZWZpbmUgRkg0OV9SQ1NSX0NITkwwX1JYX0NPTkZJR19SQl9USU1FT1VUX01TSyAoMHgwMDAwMEZGMCkJLyogYml0cyA0LTExICovCisjZGVmaW5lIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfTVNLICAgKDB4MDAwMDEwMDApCS8qIGJpdHMgMTIgKi8KKyNkZWZpbmUgRkg0OV9SQ1NSX0NITkwwX1JYX0NPTkZJR19TSU5HTEVfRlJBTUVfTVNLICgweDAwMDA4MDAwKQkvKiBiaXQgMTUgKi8KKyNkZWZpbmUgRkg0OV9SQ1NSX0NITkwwX1JYX0NPTkZJR19SQl9TSVpFX01TSyAgICgweDAwMDMwMDAwKQkvKiBiaXRzIDE2LTE3ICovCisjZGVmaW5lIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfUkJEQkNfU0laRV9NU0sgKDB4MDBGMDAwMDApCS8qIGJpdHMgMjAtMjMgKi8KKyNkZWZpbmUgRkg0OV9SQ1NSX0NITkwwX1JYX0NPTkZJR19ETUFfQ0hOTF9FTl9NU0sgKDB4QzAwMDAwMDApCS8qIGJpdHMgMzAtMzEgKi8KKworI2RlZmluZSBGSDQ5X1JDU1JfUlhfQ09ORklHX1JCRENCX1NJWkVfUE9TCSgyMCkKKyNkZWZpbmUgRkg0OV9SQ1NSX1JYX0NPTkZJR19SRUdfSVJRX1JCVEhfUE9TCSg0KQorI2RlZmluZSBSWF9SQl9USU1FT1VUCSgweDEwKQorCisjZGVmaW5lIEZINDlfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9QQVVTRV9WQUwgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX1BBVVNFX0VPRl9WQUwgICAgICgweDQwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1JDU1JfUlhfQ09ORklHX0NITkxfRU5fRU5BQkxFX1ZBTCAgICAgICAgKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkg0OV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfNEsgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzhLICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBGSDQ5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV8xMksgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgRkg0OV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfMTZLICAgKDB4MDAwMzAwMDApCisKKyNkZWZpbmUgRkg0OV9SQ1NSX0NITkwwX1JYX0lHTk9SRV9SWEZfRU1QVFkgICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX0lSUV9ERVNUX05PX0lOVF9WQUwgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMICAoMHgwMDAwMTAwMCkKKworLyoqCisgKiBSeCBTaGFyZWQgU3RhdHVzIFJlZ2lzdGVycyAoUlNTUikKKyAqCisgKiBBZnRlciBzdG9wcGluZyBSeCBETUEgY2hhbm5lbCAod3JpdGluZyAwIHRvCisgKiBGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcpLCBkcml2ZXIgbXVzdCBwb2xsCisgKiBGSDQ5X01FTV9SU1NSX1JYX1NUQVRVU19SRUcgdW50aWwgUnggY2hhbm5lbCBpcyBpZGxlLgorICoKKyAqIEJpdCBmaWVsZHM6CisgKiAgMjQ6ICAxID0gQ2hhbm5lbCAwIGlzIGlkbGUKKyAqCisgKiBGSDQ5X01FTV9SU1NSX1NIQVJFRF9DVFJMX1JFRyBhbmQgRkg0OV9NRU1fUlNTUl9SWF9FTkFCTEVfRVJSX0lSUTJEUlYKKyAqIGNvbnRhaW4gZGVmYXVsdCB2YWx1ZXMgdGhhdCBzaG91bGQgbm90IGJlIGFsdGVyZWQgYnkgdGhlIGRyaXZlci4KKyAqLworI2RlZmluZSBGSDQ5X01FTV9SU1NSX0xPV0VSX0JPVU5EICAgICAgICAgICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEM0MCkKKyNkZWZpbmUgRkg0OV9NRU1fUlNTUl9VUFBFUl9CT1VORCAgICAgICAgICAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhEMDApCisKKyNkZWZpbmUgRkg0OV9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcgICAgICAgKEZINDlfTUVNX1JTU1JfTE9XRVJfQk9VTkQpCisjZGVmaW5lIEZINDlfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRwkoRkg0OV9NRU1fUlNTUl9MT1dFUl9CT1VORCArIDB4MDA0KQorI2RlZmluZSBGSDQ5X01FTV9SU1NSX1JYX0VOQUJMRV9FUlJfSVJRMkRSVlwKKwkJCQkJKEZINDlfTUVNX1JTU1JfTE9XRVJfQk9VTkQgKyAweDAwOCkKKworI2RlZmluZSBGSDQ5X1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRQkoMHgwMTAwMDAwMCkKKworI2RlZmluZSBGSDQ5X01FTV9URkRJQl9SRUcxX0FERFJfQklUU0hJRlQJMjgKKworLyogVEZEQiAgQXJlYSAtIFRGRHMgYnVmZmVyIHRhYmxlICovCisjZGVmaW5lIEZINDlfTUVNX1RGRElCX0RSQU1fQUREUl9MU0JfTVNLICAgICAgKDB4RkZGRkZGRkYpCisjZGVmaW5lIEZINDlfVEZESUJfTE9XRVJfQk9VTkQgICAgICAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHg5MDApCisjZGVmaW5lIEZINDlfVEZESUJfVVBQRVJfQk9VTkQgICAgICAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHg5NTgpCisjZGVmaW5lIEZINDlfVEZESUJfQ1RSTDBfUkVHKF9jaG5sKSAgKEZINDlfVEZESUJfTE9XRVJfQk9VTkQgKyAweDggKiAoX2NobmwpKQorI2RlZmluZSBGSDQ5X1RGRElCX0NUUkwxX1JFRyhfY2hubCkgIChGSDQ5X1RGRElCX0xPV0VSX0JPVU5EICsgMHg4ICogKF9jaG5sKSArIDB4NCkKKworLyoqCisgKiBUcmFuc21pdCBETUEgQ2hhbm5lbCBDb250cm9sL1N0YXR1cyBSZWdpc3RlcnMgKFRDU1IpCisgKgorICogNDk2NSBoYXMgb25lIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIGVhY2ggb2YgOCBUeCBETUEvRklGTyBjaGFubmVscworICogc3VwcG9ydGVkIGluIGhhcmR3YXJlIChkb24ndCBjb25mdXNlIHRoZXNlIHdpdGggdGhlIDE2IFR4IHF1ZXVlcyBpbiBEUkFNLAorICogd2hpY2ggZmVlZCB0aGUgRE1BL0ZJRk8gY2hhbm5lbHMpOyBjb25maWcgcmVncyBhcmUgc2VwYXJhdGVkIGJ5IDB4MjAgYnl0ZXMuCisgKgorICogVG8gdXNlIGEgVHggRE1BIGNoYW5uZWwsIGRyaXZlciBtdXN0IGluaXRpYWxpemUgaXRzCisgKiBGSDQ5X1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNobmwpIHdpdGg6CisgKgorICogRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRSB8CisgKiBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9FTkFCTEVfVkFMCisgKgorICogQWxsIG90aGVyIGJpdHMgc2hvdWxkIGJlIDAuCisgKgorICogQml0IGZpZWxkczoKKyAqIDMxLTMwOiBUeCBETUEgY2hhbm5lbCBlbmFibGU6ICcwMCcgb2ZmL3BhdXNlLCAnMDEnIHBhdXNlIGF0IGVuZCBvZiBmcmFtZSwKKyAqICAgICAgICAnMTAnIG9wZXJhdGUgbm9ybWFsbHkKKyAqIDI5LSA0OiBSZXNlcnZlZCwgc2V0IHRvICIwIgorICogICAgIDM6IEVuYWJsZSBpbnRlcm5hbCBETUEgcmVxdWVzdHMgKDEsIG5vcm1hbCBvcGVyYXRpb24pLCBkaXNhYmxlICgwKQorICogIDItIDA6IFJlc2VydmVkLCBzZXQgdG8gIjAiCisgKi8KKyNkZWZpbmUgRkg0OV9UQ1NSX0xPV0VSX0JPVU5EICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEQwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX1VQUEVSX0JPVU5EICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEU2MCkKKworLyogRmluZCBDb250cm9sL1N0YXR1cyByZWcgZm9yIGdpdmVuIFR4IERNQS9GSUZPIGNoYW5uZWwgKi8KKyNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICg3KQorI2RlZmluZSBGSDUwX1RDU1JfQ0hOTF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDgpCisKKy8qIFRDU1I6IHR4X2NvbmZpZyByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhfY2hubCkJXAorCQkoRkg0OV9UQ1NSX0xPV0VSX0JPVU5EICsgMHgyMCAqIChfY2hubCkpCisjZGVmaW5lIEZINDlfVENTUl9DSE5MX1RYX0NSRURJVF9SRUcoX2NobmwpCVwKKwkJKEZINDlfVENTUl9MT1dFUl9CT1VORCArIDB4MjAgKiAoX2NobmwpICsgMHg0KQorI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFRyhfY2hubCkJXAorCQkoRkg0OV9UQ1NSX0xPV0VSX0JPVU5EICsgMHgyMCAqIChfY2hubCkgKyAweDgpCisKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX1RYRgkJKDB4MDAwMDAwMDApCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9EUlYJCSgweDAwMDAwMDAxKQorCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0RJU0FCTEUJKDB4MDAwMDAwMDApCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRQkoMHgwMDAwMDAwOCkKKworI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9IT1NUX05PSU5UCSgweDAwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9IT1NUX0VORFRGRAkoMHgwMDEwMDAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9JRlRGRAkoMHgwMDIwMDAwMCkKKworI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9SVENfTk9JTlQJKDB4MDAwMDAwMDApCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19FTkRURkQJKDB4MDA0MDAwMDApCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19JRlRGRAkoMHgwMDgwMDAwMCkKKworI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfUEFVU0UJKDB4MDAwMDAwMDApCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9QQVVTRV9FT0YJKDB4NDAwMDAwMDApCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUJKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfVkFMX1RGREJfRU1QVFkJKDB4MDAwMDAwMDApCisjZGVmaW5lIEZINDlfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX1dBSVQJKDB4MDAwMDIwMDApCisjZGVmaW5lIEZINDlfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX1ZBTElECSgweDAwMDAwMDAzKQorCisjZGVmaW5lIEZINDlfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1BPU19UQl9OVU0JCSgyMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfUE9TX1RCX0lEWAkJKDEyKQorCisvKioKKyAqIFR4IFNoYXJlZCBTdGF0dXMgUmVnaXN0ZXJzIChUU1NSKQorICoKKyAqIEFmdGVyIHN0b3BwaW5nIFR4IERNQSBjaGFubmVsICh3cml0aW5nIDAgdG8KKyAqIEZINDlfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2hubCkpLCBkcml2ZXIgbXVzdCBwb2xsCisgKiBGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFRyB1bnRpbCBzZWxlY3RlZCBUeCBjaGFubmVsIGlzIGlkbGUKKyAqIChjaGFubmVsJ3MgYnVmZmVycyBlbXB0eSB8IG5vIHBlbmRpbmcgcmVxdWVzdHMpLgorICoKKyAqIEJpdCBmaWVsZHM6CisgKiAzMS0yNDogIDEgPSBDaGFubmVsIGJ1ZmZlcnMgZW1wdHkgKGNoYW5uZWwgNzowKQorICogMjMtMTY6ICAxID0gTm8gcGVuZGluZyByZXF1ZXN0cyAoY2hhbm5lbCA3OjApCisgKi8KKyNkZWZpbmUgRkg0OV9UU1NSX0xPV0VSX0JPVU5ECQkoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEVBMCkKKyNkZWZpbmUgRkg0OV9UU1NSX1VQUEVSX0JPVU5ECQkoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEVDMCkKKworI2RlZmluZSBGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFRwkJKEZINDlfVFNTUl9MT1dFUl9CT1VORCArIDB4MDEwKQorCisvKioKKyAqIEJpdCBmaWVsZHMgZm9yIFRTU1IoVHggU2hhcmVkIFN0YXR1cyAmIENvbnRyb2wpIGVycm9yIHN0YXR1cyByZWdpc3RlcjoKKyAqIDMxOiAgSW5kaWNhdGVzIGFuIGFkZHJlc3MgZXJyb3Igd2hlbiBhY2Nlc3NlZCB0byBpbnRlcm5hbCBtZW1vcnkKKyAqCXVDb2RlL2RyaXZlciBtdXN0IHdyaXRlICIxIiBpbiBvcmRlciB0byBjbGVhciB0aGlzIGZsYWcKKyAqIDMwOiAgSW5kaWNhdGVzIHRoYXQgSG9zdCBkaWQgbm90IHNlbmQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBkd29yZHMgdG8gRkgKKyAqCXVDb2RlL2RyaXZlciBtdXN0IHdyaXRlICIxIiBpbiBvcmRlciB0byBjbGVhciB0aGlzIGZsYWcKKyAqIDE2LTk6RWFjaCBzdGF0dXMgYml0IGlzIGZvciBvbmUgY2hhbm5lbC4gSW5kaWNhdGVzIHRoYXQgYW4gKEVycm9yKSBBY3RETUEKKyAqCWNvbW1hbmQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIHNjaGVkdWxlciB3aGlsZSB0aGUgVFJCIHdhcyBhbHJlYWR5IGZ1bGwKKyAqCXdpdGggcHJldmlvdXMgY29tbWFuZAorICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZworICogNy0wOiBFYWNoIHN0YXR1cyBiaXQgaW5kaWNhdGVzIGEgY2hhbm5lbCdzIFR4Q3JlZGl0IGVycm9yLiBXaGVuIGFuIGVycm9yCisgKgliaXQgaXMgc2V0LCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgRkggaGFzIHJlY2VpdmVkIGEgZnVsbCBpbmRpY2F0aW9uCisgKglmcm9tIHRoZSBSVEMgVHhGSUZPIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgVHhDcmVkaXQgY291bnRlciB3YXMKKyAqCW5vdCBlcXVhbCB0byB6ZXJvLiBUaGlzIG1lYW4gdGhhdCB0aGUgY3JlZGl0IG1lY2hhbmlzbSB3YXMgbm90CisgKglzeW5jaHJvbml6ZWQgdG8gdGhlIFR4RklGTyBzdGF0dXMKKyAqCXVDb2RlL2RyaXZlciBtdXN0IHdyaXRlICIxIiBpbiBvcmRlciB0byBjbGVhciB0aGlzIGZsYWcKKyAqLworI2RlZmluZSBGSDQ5X1RTU1JfVFhfRVJST1JfUkVHCQkoRkg0OV9UU1NSX0xPV0VSX0JPVU5EICsgMHgwMTgpCisKKyNkZWZpbmUgRkg0OV9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRShfY2hubCkgKCgxIDw8IChfY2hubCkpIDw8IDE2KQorCisvKiBUeCBzZXJ2aWNlIGNoYW5uZWxzICovCisjZGVmaW5lIEZINDlfU1JWQ19DSE5MCQkoOSkKKyNkZWZpbmUgRkg0OV9TUlZDX0xPV0VSX0JPVU5ECShGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4OUM4KQorI2RlZmluZSBGSDQ5X1NSVkNfVVBQRVJfQk9VTkQJKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHg5RDApCisjZGVmaW5lIEZINDlfU1JWQ19DSE5MX1NSQU1fQUREUl9SRUcoX2NobmwpIFwKKwkJKEZINDlfU1JWQ19MT1dFUl9CT1VORCArICgoX2NobmwpIC0gOSkgKiAweDQpCisKKyNkZWZpbmUgRkg0OV9UWF9DSElDS0VOX0JJVFNfUkVHCShGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4RTk4KQorLyogSW5zdHJ1Y3QgRkggdG8gaW5jcmVtZW50IHRoZSByZXRyeSBjb3VudCBvZiBhIHBhY2tldCB3aGVuCisgKiBpdCBpcyBicm91Z2h0IGZyb20gdGhlIG1lbW9yeSB0byBUWC1GSUZPCisgKi8KKyNkZWZpbmUgRkg0OV9UWF9DSElDS0VOX0JJVFNfU0NEX0FVVE9fUkVUUllfRU4JKDB4MDAwMDAwMDIpCisKKy8qIEtlZXAgV2FybSBTaXplICovCisjZGVmaW5lIElMX0tXX1NJWkUgMHgxMDAwCS8qIDRrICovCisKKyNlbmRpZiAvKiBfX2lsXzQ5NjVfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvS2NvbmZpZwppbmRleCBhZWY2NWNkLi4wNWJkMzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L0tjb25maWcKQEAgLTEsNCArMSw0IEBACi1jb25maWcgSVdMV0lGSV9MRUdBQ1kKK2NvbmZpZyBJV0xFR0FDWQogCXRyaXN0YXRlCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBORVdfTEVEUwpAQCAtNywxMyArNywxMyBAQAogCXNlbGVjdCBNQUM4MDIxMV9MRURTCiAKIG1lbnUgIkRlYnVnZ2luZyBPcHRpb25zIgotCWRlcGVuZHMgb24gSVdMV0lGSV9MRUdBQ1kKKwlkZXBlbmRzIG9uIElXTEVHQUNZCiAKLWNvbmZpZyBJV0xXSUZJX0xFR0FDWV9ERUJVRwotCWJvb2wgIkVuYWJsZSBmdWxsIGRlYnVnZ2luZyBvdXRwdXQgaW4gNDk2NSBhbmQgMzk0NSBkcml2ZXJzIgotCWRlcGVuZHMgb24gSVdMV0lGSV9MRUdBQ1kKK2NvbmZpZyBJV0xFR0FDWV9ERUJVRworCWJvb2wgIkVuYWJsZSBmdWxsIGRlYnVnZ2luZyBvdXRwdXQgaW4gaXdsZWdhY3kgKGl3bCAzOTQ1LzQ5NjUpIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBJV0xFR0FDWQogCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIGRlYnVnIHRyYWNpbmcgb3V0cHV0IGZvciB0aGUgaXdsd2lmaWxlZ2FjeQorCSAgVGhpcyBvcHRpb24gd2lsbCBlbmFibGUgZGVidWcgdHJhY2luZyBvdXRwdXQgZm9yIHRoZSBpd2xlZ2FjeQogCSAgZHJpdmVycy4KIAogCSAgVGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUga2VybmVsIG1vZHVsZSBiZWluZyB+MTAwayBsYXJnZXIuICBZb3UgY2FuCkBAIC0yOSw0MyArMjksMjYgQEAKIAkJICAlIGVjaG8gMHg0M2ZmZiA+IC9zeXMvY2xhc3MvbmV0L3dsYW4wL2RldmljZS9kZWJ1Z19sZXZlbAogCiAJICBZb3UgY2FuIGZpbmQgdGhlIGxpc3Qgb2YgZGVidWcgbWFzayB2YWx1ZXMgaW46Ci0JCSAgZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaWxlZ2FjeS9pd2wtZGVidWcuaAorCQkgIGRyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2NvbW1vbi5oCiAKIAkgIElmIHRoaXMgaXMgeW91ciBmaXJzdCB0aW1lIHVzaW5nIHRoaXMgZHJpdmVyLCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUKIAkgIGFzIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBjYW4gYXNzaXN0IG90aGVycyBpbiBoZWxwaW5nIHlvdSByZXNvbHZlCiAJICBhbnkgcHJvYmxlbXMgeW91IG1heSBlbmNvdW50ZXIuCiAKLWNvbmZpZyBJV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0gICAgICAgIGJvb2wgIjQ5NjUgYW5kIDM5NDUgZGVidWdmcyBzdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIElXTFdJRklfTEVHQUNZICYmIE1BQzgwMjExX0RFQlVHRlMKK2NvbmZpZyBJV0xFR0FDWV9ERUJVR0ZTCisgICAgICAgIGJvb2wgIml3bGVnYWN5IChpd2wgMzk0NS80OTY1KSBkZWJ1Z2ZzIHN1cHBvcnQiCisgICAgICAgIGRlcGVuZHMgb24gSVdMRUdBQ1kgJiYgTUFDODAyMTFfREVCVUdGUwogICAgICAgICAtLS1oZWxwLS0tCi0JICBFbmFibGUgY3JlYXRpb24gb2YgZGVidWdmcyBmaWxlcyBmb3IgdGhlIGl3bHdpZmlsZWdhY3kgZHJpdmVycy4gVGhpcworCSAgRW5hYmxlIGNyZWF0aW9uIG9mIGRlYnVnZnMgZmlsZXMgZm9yIHRoZSBpd2xlZ2FjeSBkcml2ZXJzLiBUaGlzCiAJICBpcyBhIGxvdy1pbXBhY3Qgb3B0aW9uIHRoYXQgYWxsb3dzIGdldHRpbmcgaW5zaWdodCBpbnRvIHRoZQogCSAgZHJpdmVyJ3Mgc3RhdGUgYXQgcnVudGltZS4KIAotY29uZmlnIElXTFdJRklfTEVHQUNZX0RFVklDRV9UUkFDSU5HCi0JYm9vbCAiaXdsd2lmaWxlZ2FjeSBsZWdhY3kgZGV2aWNlIGFjY2VzcyB0cmFjaW5nIgotCWRlcGVuZHMgb24gSVdMV0lGSV9MRUdBQ1kKLQlkZXBlbmRzIG9uIEVWRU5UX1RSQUNJTkcKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHRyYWNlIGFsbCBjb21tYW5kcywgaW5jbHVkaW5nIFRYIGZyYW1lcyBhbmQgSU8KLQkgIGFjY2Vzc2VzLCBzZW50IHRvIHRoZSBkZXZpY2UuIElmIHlvdSBzYXkgeWVzLCBpd2x3aWZpbGVnYWN5IHdpbGwKLQkgIHJlZ2lzdGVyIHdpdGggdGhlIGZ0cmFjZSBmcmFtZXdvcmsgZm9yIGV2ZW50IHRyYWNpbmcgYW5kIGR1bXAKLQkgIGFsbCB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSByaW5nYnVmZmVyLCB5b3UgbWF5IG5lZWQgdG8KLQkgIGluY3JlYXNlIHRoZSByaW5nYnVmZmVyIHNpemUuIFNlZSB0aGUgZnRyYWNlIGRvY3VtZW50YXRpb24KLQkgIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0JICBXaGVuIHRyYWNpbmcgaXMgbm90IGVuYWJsZWQsIHRoaXMgb3B0aW9uIHN0aWxsIGhhcyBzb21lCi0JICAodGhvdWdoIHJhdGhlciBzbWFsbCkgb3ZlcmhlYWQuCi0KLQkgIElmIHVuc3VyZSwgc2F5IFkgc28gd2UgY2FuIGhlbHAgeW91IGJldHRlciB3aGVuIHByb2JsZW1zCi0JICBvY2N1ci4KIGVuZG1lbnUKIAogY29uZmlnIElXTDQ5NjUKIAl0cmlzdGF0ZSAiSW50ZWwgV2lyZWxlc3MgV2lGaSA0OTY1QUdOIChpd2w0OTY1KSIKIAlkZXBlbmRzIG9uIFBDSSAmJiBNQUM4MDIxMQotCXNlbGVjdCBJV0xXSUZJX0xFR0FDWQorCXNlbGVjdCBJV0xFR0FDWQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IKIApAQCAtOTMsNyArNzYsNyBAQAogY29uZmlnIElXTDM5NDUKIAl0cmlzdGF0ZSAiSW50ZWwgUFJPL1dpcmVsZXNzIDM5NDVBQkcvQkcgTmV0d29yayBDb25uZWN0aW9uIChpd2wzOTQ1KSIKIAlkZXBlbmRzIG9uIFBDSSAmJiBNQUM4MDIxMQotCXNlbGVjdCBJV0xXSUZJX0xFR0FDWQorCXNlbGVjdCBJV0xFR0FDWQogCS0tLWhlbHAtLS0KIAkgIFNlbGVjdCB0byBidWlsZCB0aGUgZHJpdmVyIHN1cHBvcnRpbmcgdGhlOgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L01ha2VmaWxlCmluZGV4IGQ1NmFlYjMuLmM5ODVhMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L01ha2VmaWxlCkBAIC0xLDI1ICsxLDE3IEBACi1vYmotJChDT05GSUdfSVdMV0lGSV9MRUdBQ1kpCSs9IGl3bC1sZWdhY3kubwotaXdsLWxlZ2FjeS1vYmpzIAkJOj0gaXdsLWNvcmUubyBpd2wtZWVwcm9tLm8gaXdsLWhjbWQubyBpd2wtcG93ZXIubwotaXdsLWxlZ2FjeS1vYmpzIAkJKz0gaXdsLXJ4Lm8gaXdsLXR4Lm8gaXdsLXN0YS5vCi1pd2wtbGVnYWN5LW9ianMgCQkrPSBpd2wtc2Nhbi5vIGl3bC1sZWQubwotaXdsLWxlZ2FjeS0kKENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTKSArPSBpd2wtZGVidWdmcy5vCi1pd2wtbGVnYWN5LSQoQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFVklDRV9UUkFDSU5HKSArPSBpd2wtZGV2dHJhY2Uubworb2JqLSQoQ09ORklHX0lXTEVHQUNZKQkrPSBpd2xlZ2FjeS5vCitpd2xlZ2FjeS1vYmpzIAkJOj0gY29tbW9uLm8KK2l3bGVnYWN5LSQoQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMpICs9IGRlYnVnLm8KIAotaXdsLWxlZ2FjeS1vYmpzICs9ICQoaXdsLWxlZ2FjeS1tKQotCi1DRkxBR1NfaXdsLWRldnRyYWNlLm8gOj0gLUkkKHNyYykKK2l3bGVnYWN5LW9ianMgKz0gJChpd2xlZ2FjeS1tKQogCiAjIDQ5NjUKIG9iai0kKENPTkZJR19JV0w0OTY1KQkrPSBpd2w0OTY1Lm8KLWl3bDQ5NjUtb2JqcwkJOj0gaXdsLTQ5NjUubyBpd2w0OTY1LWJhc2UubyBpd2wtNDk2NS1ycy5vIGl3bC00OTY1LWxlZC5vCi1pd2w0OTY1LW9ianMJCSs9IGl3bC00OTY1LXVjb2RlLm8gaXdsLTQ5NjUtdHgubwotaXdsNDk2NS1vYmpzCQkrPSBpd2wtNDk2NS1saWIubyBpd2wtNDk2NS1yeC5vIGl3bC00OTY1LWNhbGliLm8KLWl3bDQ5NjUtb2JqcwkJKz0gaXdsLTQ5NjUtc3RhLm8gaXdsLTQ5NjUtZWVwcm9tLm8KLWl3bDQ5NjUtJChDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUykgKz0gaXdsLTQ5NjUtZGVidWdmcy5vCitpd2w0OTY1LW9ianMJCTo9IDQ5NjUubyA0OTY1LW1hYy5vIDQ5NjUtcnMubyA0OTY1LWNhbGliLm8KK2l3bDQ5NjUtJChDT05GSUdfSVdMRUdBQ1lfREVCVUdGUykgKz0gNDk2NS1kZWJ1Zy5vCiAKICMgMzk0NQogb2JqLSQoQ09ORklHX0lXTDM5NDUpCSs9IGl3bDM5NDUubwotaXdsMzk0NS1vYmpzCQk6PSBpd2wzOTQ1LWJhc2UubyBpd2wtMzk0NS5vIGl3bC0zOTQ1LXJzLm8gaXdsLTM5NDUtbGVkLm8KLWl3bDM5NDUtJChDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUykgKz0gaXdsLTM5NDUtZGVidWdmcy5vCitpd2wzOTQ1LW9ianMJCTo9IDM5NDUtbWFjLm8gMzk0NS5vIDM5NDUtcnMubworaXdsMzk0NS0kKENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTKSArPSAzOTQ1LWRlYnVnLm8KIAogY2NmbGFncy15ICs9IC1EX19DSEVDS19FTkRJQU5fXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbWFuZHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2NvbW1hbmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkZDdkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2NvbW1hbmRzLmgKQEAgLTAsMCArMSwzMzc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX2lsX2NvbW1hbmRzX2hfXworI2RlZmluZSBfX2lsX2NvbW1hbmRzX2hfXworCisjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CisKK3N0cnVjdCBpbF9wcml2OworCisvKiB1Q29kZSB2ZXJzaW9uIGNvbnRhaW5zIDQgdmFsdWVzOiBNYWpvci9NaW5vci9BUEkvU2VyaWFsICovCisjZGVmaW5lIElMX1VDT0RFX01BSk9SKHZlcikJKCgodmVyKSAmIDB4RkYwMDAwMDApID4+IDI0KQorI2RlZmluZSBJTF9VQ09ERV9NSU5PUih2ZXIpCSgoKHZlcikgJiAweDAwRkYwMDAwKSA+PiAxNikKKyNkZWZpbmUgSUxfVUNPREVfQVBJKHZlcikJKCgodmVyKSAmIDB4MDAwMEZGMDApID4+IDgpCisjZGVmaW5lIElMX1VDT0RFX1NFUklBTCh2ZXIpCSgodmVyKSAmIDB4MDAwMDAwRkYpCisKKy8qIFR4IHJhdGVzICovCisjZGVmaW5lIElMX0NDS19SQVRFUwk0CisjZGVmaW5lIElMX09GRE1fUkFURVMJOAorI2RlZmluZSBJTF9NQVhfUkFURVMJKElMX0NDS19SQVRFUyArIElMX09GRE1fUkFURVMpCisKK2VudW0geworCU5fQUxJVkUgPSAweDEsCisJTl9FUlJPUiA9IDB4MiwKKworCS8qIFJYT04gYW5kIFFPUyBjb21tYW5kcyAqLworCUNfUlhPTiA9IDB4MTAsCisJQ19SWE9OX0FTU09DID0gMHgxMSwKKwlDX1FPU19QQVJBTSA9IDB4MTMsCisJQ19SWE9OX1RJTUlORyA9IDB4MTQsCisKKwkvKiBNdWx0aS1TdGF0aW9uIHN1cHBvcnQgKi8KKwlDX0FERF9TVEEgPSAweDE4LAorCUNfUkVNX1NUQSA9IDB4MTksCisKKwkvKiBTZWN1cml0eSAqLworCUNfV0VQS0VZID0gMHgyMCwKKworCS8qIFJYLCBUWCwgTEVEcyAqLworCU5fMzk0NV9SWCA9IDB4MWIsCS8qIDM5NDUgb25seSAqLworCUNfVFggPSAweDFjLAorCUNfUkFURV9TQ0FMRSA9IDB4NDcsCS8qIDM5NDUgb25seSAqLworCUNfTEVEUyA9IDB4NDgsCisJQ19UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSwJLyogZm9yIDQ5NjUgKi8KKworCS8qIDgwMi4xMWggcmVsYXRlZCAqLworCUNfQ0hBTk5FTF9TV0lUQ0ggPSAweDcyLAorCU5fQ0hBTk5FTF9TV0lUQ0ggPSAweDczLAorCUNfU1BFQ1RSVU1fTUVBU1VSRU1FTlQgPSAweDc0LAorCU5fU1BFQ1RSVU1fTUVBU1VSRU1FTlQgPSAweDc1LAorCisJLyogUG93ZXIgTWFuYWdlbWVudCAqLworCUNfUE9XRVJfVEJMID0gMHg3NywKKwlOX1BNX1NMRUVQID0gMHg3QSwKKwlOX1BNX0RFQlVHX1NUQVRTID0gMHg3QiwKKworCS8qIFNjYW4gY29tbWFuZHMgYW5kIG5vdGlmaWNhdGlvbnMgKi8KKwlDX1NDQU4gPSAweDgwLAorCUNfU0NBTl9BQk9SVCA9IDB4ODEsCisJTl9TQ0FOX1NUQVJUID0gMHg4MiwKKwlOX1NDQU5fUkVTVUxUUyA9IDB4ODMsCisJTl9TQ0FOX0NPTVBMRVRFID0gMHg4NCwKKworCS8qIElCU1MvQVAgY29tbWFuZHMgKi8KKwlOX0JFQUNPTiA9IDB4OTAsCisJQ19UWF9CRUFDT04gPSAweDkxLAorCisJLyogTWlzY2VsbGFuZW91cyBjb21tYW5kcyAqLworCUNfVFhfUFdSX1RCTCA9IDB4OTcsCisKKwkvKiBCbHVldG9vdGggZGV2aWNlIGNvZXhpc3RlbmNlIGNvbmZpZyBjb21tYW5kICovCisJQ19CVF9DT05GSUcgPSAweDliLAorCisJLyogU3RhdGlzdGljcyAqLworCUNfU1RBVFMgPSAweDljLAorCU5fU1RBVFMgPSAweDlkLAorCisJLyogUkYtS0lMTCBjb21tYW5kcyBhbmQgbm90aWZpY2F0aW9ucyAqLworCU5fQ0FSRF9TVEFURSA9IDB4YTEsCisKKwkvKiBNaXNzZWQgYmVhY29ucyBub3RpZmljYXRpb24gKi8KKwlOX01JU1NFRF9CRUFDT05TID0gMHhhMiwKKworCUNfQ1RfS0lMTF9DT05GSUcgPSAweGE0LAorCUNfU0VOU0lUSVZJVFkgPSAweGE4LAorCUNfUEhZX0NBTElCUkFUSU9OID0gMHhiMCwKKwlOX1JYX1BIWSA9IDB4YzAsCisJTl9SWF9NUERVID0gMHhjMSwKKwlOX1JYID0gMHhjMywKKwlOX0NPTVBSRVNTRURfQkEgPSAweGM1LAorCisJSUxfQ05fTUFYID0gMHhmZgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKDApCisgKiBDb21tb25seSB1c2VkIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zOgorICogQ29tbWFuZCBoZWFkZXIsIHJhdGVfbl9mbGFncywgdHhwb3dlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaWxfY21kX2hlYWRlciBmbGFncyB2YWx1ZSAqLworI2RlZmluZSBJTF9DTURfRkFJTEVEX01TSyAweDQwCisKKyNkZWZpbmUgU0VRX1RPX1FVRVVFKHMpCSgoKHMpID4+IDgpICYgMHgxZikKKyNkZWZpbmUgUVVFVUVfVE9fU0VRKHEpCSgoKHEpICYgMHgxZikgPDwgOCkKKyNkZWZpbmUgU0VRX1RPX0lEWChzKQkoKHMpICYgMHhmZikKKyNkZWZpbmUgSURYX1RPX1NFUShpKQkoKGkpICYgMHhmZikKKyNkZWZpbmUgU0VRX0hVR0VfRlJBTUUJY3B1X3RvX2xlMTYoMHg0MDAwKQorI2RlZmluZSBTRVFfUlhfRlJBTUUJY3B1X3RvX2xlMTYoMHg4MDAwKQorCisvKioKKyAqIHN0cnVjdCBpbF9jbWRfaGVhZGVyCisgKgorICogVGhpcyBoZWFkZXIgZm9ybWF0IGFwcGVhcnMgaW4gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGNvbW1hbmQgc2VudCBmcm9tIHRoZQorICogZHJpdmVyLCBhbmQgZWFjaCByZXNwb25zZS9ub3RpZmljYXRpb24gcmVjZWl2ZWQgZnJvbSB1Q29kZS4KKyAqLworc3RydWN0IGlsX2NtZF9oZWFkZXIgeworCXU4IGNtZDsJCQkvKiBDb21tYW5kIElEOiAgQ19SWE9OLCBldGMuICovCisJdTggZmxhZ3M7CQkvKiAwOjUgcmVzZXJ2ZWQsIDYgYWJvcnQsIDcgaW50ZXJuYWwgKi8KKwkvKgorCSAqIFRoZSBkcml2ZXIgc2V0cyB1cCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIHZhbHVlcyBvZiBpdHMgY2hvb3NpbmcuCisJICogdUNvZGUgZG9lcyBub3QgdXNlIHRoaXMgdmFsdWUsIGJ1dCBwYXNzZXMgaXQgYmFjayB0byB0aGUgZHJpdmVyCisJICogd2hlbiBzZW5kaW5nIHRoZSByZXNwb25zZSB0byBlYWNoIGRyaXZlci1vcmlnaW5hdGVkIGNvbW1hbmQsIHNvCisJICogdGhlIGRyaXZlciBjYW4gbWF0Y2ggdGhlIHJlc3BvbnNlIHRvIHRoZSBjb21tYW5kLiAgU2luY2UgdGhlIHZhbHVlcworCSAqIGRvbid0IGdldCB1c2VkIGJ5IHVDb2RlLCB0aGUgZHJpdmVyIG1heSBzZXQgdXAgYW4gYXJiaXRyYXJ5IGZvcm1hdC4KKwkgKgorCSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb246ICB1Q29kZSBzZXRzIGJpdCAxNSB3aGVuIGl0IG9yaWdpbmF0ZXMKKwkgKiB0aGUgcmVzcG9uc2Uvbm90aWZpY2F0aW9uLCBpLmUuIHdoZW4gdGhlIHJlc3BvbnNlL25vdGlmaWNhdGlvbgorCSAqIGlzIG5vdCBhIGRpcmVjdCByZXNwb25zZSB0byBhIGNvbW1hbmQgc2VudCBieSB0aGUgZHJpdmVyLiAgRm9yCisJICogZXhhbXBsZSwgdUNvZGUgaXNzdWVzIE5fMzk0NV9SWCB3aGVuIGl0IHNlbmRzIGEgcmVjZWl2ZWQgZnJhbWUKKwkgKiB0byB0aGUgZHJpdmVyOyBpdCBpcyBub3QgYSBkaXJlY3QgcmVzcG9uc2UgdG8gYW55IGRyaXZlciBjb21tYW5kLgorCSAqCisJICogVGhlIExpbnV4IGRyaXZlciB1c2VzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCSAqCisJICogIDA6NyAgICAgICAgIHRmZCBpZHggLSBwb3NpdGlvbiB3aXRoaW4gVFggcXVldWUKKwkgKiAgODoxMiAgICAgICAgVFggcXVldWUgaWQKKwkgKiAgMTMgICAgICAgICAgcmVzZXJ2ZWQKKwkgKiAgMTQgICAgICAgICAgaHVnZSAtIGRyaXZlciBzZXRzIHRoaXMgdG8gaW5kaWNhdGUgY29tbWFuZCBpcyBpbiB0aGUKKwkgKiAgICAgICAgICAgICAgJ2h1Z2UnIHN0b3JhZ2UgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBidWZmZXJzCisJICogIDE1ICAgICAgICAgIHVuc29saWNpdGVkIFJYIG9yIHVDb2RlLW9yaWdpbmF0ZWQgbm90aWZpY2F0aW9uCisJICovCisJX19sZTE2IHNlcXVlbmNlOworCisJLyogY29tbWFuZCBvciByZXNwb25zZS9ub3RpZmljYXRpb24gZGF0YSBmb2xsb3dzIGltbWVkaWF0ZWx5ICovCisJdTggZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IGlsMzk0NV90eF9wb3dlcgorICoKKyAqIFVzZWQgaW4gQ19UWF9QV1JfVEJMLCBDX1NDQU4sIENfQ0hBTk5FTF9TV0lUQ0gKKyAqCisgKiBFYWNoIGVudHJ5IGNvbnRhaW5zIHR3byB2YWx1ZXM6CisgKiAxKSAgRFNQIGdhaW4gKG9yIHNvbWV0aW1lcyBjYWxsZWQgRFNQIGF0dGVudWF0aW9uKS4gIFRoaXMgaXMgYSBmaW5lLWdyYWluZWQKKyAqICAgICBsaW5lYXIgdmFsdWUgdGhhdCBtdWx0aXBsaWVzIHRoZSBvdXRwdXQgb2YgdGhlIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciwKKyAqICAgICBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgYW5hbG9nIHJhZGlvLgorICogMikgIFJhZGlvIGdhaW4uICBUaGlzIHNldHMgdGhlIGFuYWxvZyBnYWluIG9mIHRoZSByYWRpbyBUeCBwYXRoLgorICogICAgIEl0IGlzIGEgY29hcnNlciBzZXR0aW5nLCBhbmQgYmVoYXZlcyBpbiBhIGxvZ2FyaXRobWljIChkQikgZmFzaGlvbi4KKyAqCisgKiBEcml2ZXIgb2J0YWlucyB2YWx1ZXMgZnJvbSBzdHJ1Y3QgaWwzOTQ1X3R4X3Bvd2VyIHBvd2VyX2dhaW5fdGFibGVbXVtdLgorICovCitzdHJ1Y3QgaWwzOTQ1X3R4X3Bvd2VyIHsKKwl1OCB0eF9nYWluOwkJLyogZ2FpbiBmb3IgYW5hbG9nIHJhZGlvICovCisJdTggZHNwX2F0dGVuOwkJLyogZ2FpbiBmb3IgRFNQICovCit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCBpbDM5NDVfcG93ZXJfcGVyX3JhdGUKKyAqCisgKiBVc2VkIGluIENfVFhfUFdSX1RCTCwgQ19DSEFOTkVMX1NXSVRDSAorICovCitzdHJ1Y3QgaWwzOTQ1X3Bvd2VyX3Blcl9yYXRlIHsKKwl1OCByYXRlOwkJLyogcGxjcCAqLworCXN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgdHBjOworCXU4IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBpd2w0OTY1IHJhdGVfbl9mbGFncyBiaXQgZmllbGRzCisgKgorICogcmF0ZV9uX2ZsYWdzIGZvcm1hdCBpcyB1c2VkIGluIGZvbGxvd2luZyBpd2w0OTY1IGNvbW1hbmRzOgorICogIE5fUlggKHJlc3BvbnNlIG9ubHkpCisgKiAgTl9SWF9NUERVIChyZXNwb25zZSBvbmx5KQorICogIENfVFggKGJvdGggY29tbWFuZCBhbmQgcmVzcG9uc2UpCisgKiAgQ19UWF9MSU5LX1FVQUxJVFlfQ01ECisgKgorICogSGlnaC10aHJvdWdocHV0IChIVCkgcmF0ZSBmb3JtYXQgZm9yIGJpdHMgNzowIChiaXQgOCBtdXN0IGJlICIxIik6CisgKiAgMi0wOiAgMCkgICA2IE1icHMKKyAqICAgICAgICAxKSAgMTIgTWJwcworICogICAgICAgIDIpICAxOCBNYnBzCisgKiAgICAgICAgMykgIDI0IE1icHMKKyAqICAgICAgICA0KSAgMzYgTWJwcworICogICAgICAgIDUpICA0OCBNYnBzCisgKiAgICAgICAgNikgIDU0IE1icHMKKyAqICAgICAgICA3KSAgNjAgTWJwcworICoKKyAqICA0LTM6ICAwKSAgU2luZ2xlIHN0cmVhbSAoU0lTTykKKyAqICAgICAgICAxKSAgRHVhbCBzdHJlYW0gKE1JTU8pCisgKiAgICAgICAgMikgIFRyaXBsZSBzdHJlYW0gKE1JTU8pCisgKgorICogICAgNTogIFZhbHVlIG9mIDB4MjAgaW4gYml0cyA3OjAgaW5kaWNhdGVzIDYgTWJwcyBIVDQwIGR1cGxpY2F0ZSBkYXRhCisgKgorICogTGVnYWN5IE9GRE0gcmF0ZSBmb3JtYXQgZm9yIGJpdHMgNzowIChiaXQgOCBtdXN0IGJlICIwIiwgYml0IDkgIjAiKToKKyAqICAzLTA6ICAweEQpICAgNiBNYnBzCisgKiAgICAgICAgMHhGKSAgIDkgTWJwcworICogICAgICAgIDB4NSkgIDEyIE1icHMKKyAqICAgICAgICAweDcpICAxOCBNYnBzCisgKiAgICAgICAgMHg5KSAgMjQgTWJwcworICogICAgICAgIDB4QikgIDM2IE1icHMKKyAqICAgICAgICAweDEpICA0OCBNYnBzCisgKiAgICAgICAgMHgzKSAgNTQgTWJwcworICoKKyAqIExlZ2FjeSBDQ0sgcmF0ZSBmb3JtYXQgZm9yIGJpdHMgNzowIChiaXQgOCBtdXN0IGJlICIwIiwgYml0IDkgIjEiKToKKyAqICA2LTA6ICAgMTApICAxIE1icHMKKyAqICAgICAgICAgMjApICAyIE1icHMKKyAqICAgICAgICAgNTUpICA1LjUgTWJwcworICogICAgICAgIDExMCkgIDExIE1icHMKKyAqLworI2RlZmluZSBSQVRFX01DU19DT0RFX01TSyAweDcKKyNkZWZpbmUgUkFURV9NQ1NfU1BBVElBTF9QT1MgMworI2RlZmluZSBSQVRFX01DU19TUEFUSUFMX01TSyAweDE4CisjZGVmaW5lIFJBVEVfTUNTX0hUX0RVUF9QT1MgNQorI2RlZmluZSBSQVRFX01DU19IVF9EVVBfTVNLIDB4MjAKKworLyogQml0IDg6ICgxKSBIVCBmb3JtYXQsICgwKSBsZWdhY3kgZm9ybWF0IGluIGJpdHMgNzowICovCisjZGVmaW5lIFJBVEVfTUNTX0ZMQUdTX1BPUyA4CisjZGVmaW5lIFJBVEVfTUNTX0hUX1BPUyA4CisjZGVmaW5lIFJBVEVfTUNTX0hUX01TSyAweDEwMAorCisvKiBCaXQgOTogKDEpIENDSywgKDApIE9GRE0uICBIVCAoYml0IDgpIG11c3QgYmUgIjAiIGZvciB0aGlzIGJpdCB0byBiZSB2YWxpZCAqLworI2RlZmluZSBSQVRFX01DU19DQ0tfUE9TIDkKKyNkZWZpbmUgUkFURV9NQ1NfQ0NLX01TSyAweDIwMAorCisvKiBCaXQgMTA6ICgxKSBVc2UgR3JlZW4gRmllbGQgcHJlYW1ibGUgKi8KKyNkZWZpbmUgUkFURV9NQ1NfR0ZfUE9TIDEwCisjZGVmaW5lIFJBVEVfTUNTX0dGX01TSyAweDQwMAorCisvKiBCaXQgMTE6ICgxKSBVc2UgNDBNaHogSFQ0MCBjaG5sIHdpZHRoLCAoMCkgdXNlIDIwIE1IeiBsZWdhY3kgY2hubCB3aWR0aCAqLworI2RlZmluZSBSQVRFX01DU19IVDQwX1BPUyAxMQorI2RlZmluZSBSQVRFX01DU19IVDQwX01TSyAweDgwMAorCisvKiBCaXQgMTI6ICgxKSBEdXBsaWNhdGUgZGF0YSBvbiBib3RoIDIwTUh6IGNobmxzLiBIVDQwIChiaXQgMTEpIG11c3QgYmUgc2V0LiAqLworI2RlZmluZSBSQVRFX01DU19EVVBfUE9TIDEyCisjZGVmaW5lIFJBVEVfTUNTX0RVUF9NU0sgMHgxMDAwCisKKy8qIEJpdCAxMzogKDEpIFNob3J0IGd1YXJkIGludGVydmFsICgwLjQgdXNlYyksICgwKSBub3JtYWwgR0kgKDAuOCB1c2VjKSAqLworI2RlZmluZSBSQVRFX01DU19TR0lfUE9TIDEzCisjZGVmaW5lIFJBVEVfTUNTX1NHSV9NU0sgMHgyMDAwCisKKy8qKgorICogcmF0ZV9uX2ZsYWdzIFR4IGFudGVubmEgbWFza3MKKyAqIDQ5NjUgaGFzIDIgdHJhbnNtaXR0ZXJzCisgKiBiaXQxNDoxNgorICovCisjZGVmaW5lIFJBVEVfTUNTX0FOVF9QT1MJMTQKKyNkZWZpbmUgUkFURV9NQ1NfQU5UX0FfTVNLCTB4MDQwMDAKKyNkZWZpbmUgUkFURV9NQ1NfQU5UX0JfTVNLCTB4MDgwMDAKKyNkZWZpbmUgUkFURV9NQ1NfQU5UX0NfTVNLCTB4MTAwMDAKKyNkZWZpbmUgUkFURV9NQ1NfQU5UX0FCX01TSwkoUkFURV9NQ1NfQU5UX0FfTVNLIHwgUkFURV9NQ1NfQU5UX0JfTVNLKQorI2RlZmluZSBSQVRFX01DU19BTlRfQUJDX01TSwkoUkFURV9NQ1NfQU5UX0FCX01TSyB8IFJBVEVfTUNTX0FOVF9DX01TSykKKyNkZWZpbmUgUkFURV9BTlRfTlVNIDMKKworI2RlZmluZSBQT1dFUl9UQkxfTlVNX0VOVFJJRVMJCQkzMworI2RlZmluZSBQT1dFUl9UQkxfTlVNX0hUX09GRE1fRU5UUklFUwkJMzIKKyNkZWZpbmUgUE9XRVJfVEJMX0NDS19FTlRSWQkJCTMyCisKKyNkZWZpbmUgSUxfUFdSX05VTV9IVF9PRkRNX0VOVFJJRVMJCTI0CisjZGVmaW5lIElMX1BXUl9DQ0tfRU5UUklFUwkJCTIKKworLyoqCisgKiB1bmlvbiBpbDQ5NjVfdHhfcG93ZXJfZHVhbF9zdHJlYW0KKyAqCisgKiBIb3N0IGZvcm1hdCB1c2VkIGZvciBDX1RYX1BXUl9UQkwsIENfQ0hBTk5FTF9TV0lUQ0gKKyAqIFVzZSBfX2xlMzIgdmVyc2lvbiAoc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtKSB3aGVuIGJ1aWxkaW5nIGNvbW1hbmQuCisgKgorICogRHJpdmVyIHByb3ZpZGVzIHJhZGlvIGdhaW4gYW5kIERTUCBhdHRlbnVhdGlvbiBzZXR0aW5ncyB0byBkZXZpY2UgaW4gcGFpcnMsCisgKiBvbmUgdmFsdWUgZm9yIGVhY2ggdHJhbnNtaXR0ZXIgY2hhaW4uICBUaGUgZmlyc3QgdmFsdWUgaXMgZm9yIHRyYW5zbWl0dGVyIEEsCisgKiBzZWNvbmQgZm9yIHRyYW5zbWl0dGVyIEIuCisgKgorICogRm9yIFNJU08gYml0IHJhdGVzLCBib3RoIHZhbHVlcyBpbiBhIHBhaXIgc2hvdWxkIGJlIGlkZW50aWNhbC4KKyAqIEZvciBNSU1PIHJhdGVzLCBvbmUgdmFsdWUgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciwKKyAqIGluIG9yZGVyIHRvIGJhbGFuY2UgdGhlIFR4IG91dHB1dCBiZXR3ZWVuIHRoZSB0d28gdHJhbnNtaXR0ZXJzLgorICoKKyAqIFNlZSBtb3JlIGRldGFpbHMgaW4gZG9jIGZvciBUWFBPV0VSIGluIDQ5NjUuaC4KKyAqLwordW5pb24gaWw0OTY1X3R4X3Bvd2VyX2R1YWxfc3RyZWFtIHsKKwlzdHJ1Y3QgeworCQl1OCByYWRpb190eF9nYWluWzJdOworCQl1OCBkc3BfcHJlZGlzX2F0dGVuWzJdOworCX0gczsKKwl1MzIgZHc7Cit9OworCisvKioKKyAqIHN0cnVjdCB0eF9wb3dlcl9kdWFsX3N0cmVhbQorICoKKyAqIFRhYmxlIGVudHJpZXMgaW4gQ19UWF9QV1JfVEJMLCBDX0NIQU5ORUxfU1dJVENICisgKgorICogU2FtZSBmb3JtYXQgYXMgaWxfdHhfcG93ZXJfZHVhbF9zdHJlYW0sIGJ1dCBfX2xlMzIKKyAqLworc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtIHsKKwlfX2xlMzIgZHc7Cit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCBpbDQ5NjVfdHhfcG93ZXJfZGIKKyAqCisgKiBFbnRpcmUgdGFibGUgd2l0aGluIENfVFhfUFdSX1RCTCwgQ19DSEFOTkVMX1NXSVRDSAorICovCitzdHJ1Y3QgaWw0OTY1X3R4X3Bvd2VyX2RiIHsKKwlzdHJ1Y3QgdHhfcG93ZXJfZHVhbF9zdHJlYW0gcG93ZXJfdGJsW1BPV0VSX1RCTF9OVU1fRU5UUklFU107Cit9IF9fcGFja2VkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoMGEpCisgKiBBbGl2ZSBhbmQgRXJyb3IgQ29tbWFuZHMgJiBSZXNwb25zZXM6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFVDT0RFX1ZBTElEX09LCWNwdV90b19sZTMyKDB4MSkKKyNkZWZpbmUgSU5JVElBTElaRV9TVUJUWVBFICAgICg5KQorCisvKgorICogKCJJbml0aWFsaXplIikgTl9BTElWRSA9IDB4MSAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKKyAqCisgKiB1Q29kZSBpc3N1ZXMgdGhpcyAiaW5pdGlhbGl6ZSBhbGl2ZSIgbm90aWZpY2F0aW9uIG9uY2UgdGhlIGluaXRpYWxpemF0aW9uCisgKiB1Q29kZSBpbWFnZSBoYXMgY29tcGxldGVkIGl0cyB3b3JrLCBhbmQgaXMgcmVhZHkgdG8gbG9hZCB0aGUgcnVudGltZSBpbWFnZS4KKyAqIFRoaXMgaXMgdGhlICpmaXJzdCogImFsaXZlIiBub3RpZmljYXRpb24gdGhhdCB0aGUgZHJpdmVyIHdpbGwgcmVjZWl2ZSBhZnRlcgorICogcmVib290aW5nIHVDb2RlOyB0aGUgImluaXRpYWxpemUiIGFsaXZlIGlzIGluZGljYXRlZCBieSBzdWJ0eXBlIGZpZWxkID09IDkuCisgKgorICogU2VlIGNvbW1lbnRzIGRvY3VtZW50aW5nICJCU00iIChib290c3RyYXAgc3RhdGUgbWFjaGluZSkuCisgKgorICogRm9yIDQ5NjUsIHRoaXMgbm90aWZpY2F0aW9uIGNvbnRhaW5zIGltcG9ydGFudCBjYWxpYnJhdGlvbiBkYXRhIGZvcgorICogY2FsY3VsYXRpbmcgdHhwb3dlciBzZXR0aW5nczoKKyAqCisgKiAxKSAgUG93ZXIgc3VwcGx5IHZvbHRhZ2UgaW5kaWNhdGlvbi4gIFRoZSB2b2x0YWdlIHNlbnNvciBvdXRwdXRzIGhpZ2hlcgorICogICAgIHZhbHVlcyBmb3IgbG93ZXIgdm9sdGFnZSwgYW5kIHZpY2UgdmVyc2UuCisgKgorICogMikgIFRlbXBlcmF0dXJlIG1lYXN1cmVtZW50IHBhcmFtZXRlcnMsIGZvciBlYWNoIG9mIHR3byBjaGFubmVsIHdpZHRocworICogICAgICgyMCBNSHogYW5kIDQwIE1Ieikgc3VwcG9ydGVkIGJ5IHRoZSByYWRpb3MuICBUZW1wZXJhdHVyZSBzZW5zaW5nCisgKiAgICAgaXMgZG9uZSB2aWEgb25lIG9mIHRoZSByZWNlaXZlciBjaGFpbnMsIGFuZCBjaGFubmVsIHdpZHRoIGluZmx1ZW5jZXMKKyAqICAgICB0aGUgcmVzdWx0cy4KKyAqCisgKiAzKSAgVHggZ2FpbiBjb21wZW5zYXRpb24gdG8gYmFsYW5jZSA0OTY1J3MgMiBUeCBjaGFpbnMgZm9yIE1JTU8gb3BlcmF0aW9uLAorICogICAgIGZvciBlYWNoIG9mIDUgZnJlcXVlbmN5IHJhbmdlcy4KKyAqLworc3RydWN0IGlsX2luaXRfYWxpdmVfcmVzcCB7CisJdTggdWNvZGVfbWlub3I7CisJdTggdWNvZGVfbWFqb3I7CisJX19sZTE2IHJlc2VydmVkMTsKKwl1OCBzd19yZXZbOF07CisJdTggdmVyX3R5cGU7CisJdTggdmVyX3N1YnR5cGU7CQkvKiAiOSIgZm9yIGluaXRpYWxpemUgYWxpdmUgKi8KKwlfX2xlMTYgcmVzZXJ2ZWQyOworCV9fbGUzMiBsb2dfZXZlbnRfdGFibGVfcHRyOworCV9fbGUzMiBlcnJvcl9ldmVudF90YWJsZV9wdHI7CisJX19sZTMyIHRpbWVzdGFtcDsKKwlfX2xlMzIgaXNfdmFsaWQ7CisKKwkvKiBjYWxpYnJhdGlvbiB2YWx1ZXMgZnJvbSAiaW5pdGlhbGl6ZSIgdUNvZGUgKi8KKwlfX2xlMzIgdm9sdGFnZTsJCS8qIHNpZ25lZCwgaGlnaGVyIHZhbHVlIGlzIGxvd2VyIHZvbHRhZ2UgKi8KKwlfX2xlMzIgdGhlcm1fcjFbMl07CS8qIHNpZ25lZCwgMXN0IGZvciBub3JtYWwsIDJuZCBmb3IgSFQ0MCAqLworCV9fbGUzMiB0aGVybV9yMlsyXTsJLyogc2lnbmVkICovCisJX19sZTMyIHRoZXJtX3IzWzJdOwkvKiBzaWduZWQgKi8KKwlfX2xlMzIgdGhlcm1fcjRbMl07CS8qIHNpZ25lZCAqLworCV9fbGUzMiB0eF9hdHRlbls1XVsyXTsJLyogc2lnbmVkIE1JTU8gZ2FpbiBjb21wLCA1IGZyZXEgZ3JvdXBzLAorCQkJCSAqIDIgVHggY2hhaW5zICovCit9IF9fcGFja2VkOworCisvKioKKyAqIE5fQUxJVkUgPSAweDEgKHJlc3BvbnNlIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKgorICogdUNvZGUgaXNzdWVzIHRoaXMgImFsaXZlIiBub3RpZmljYXRpb24gb25jZSB0aGUgcnVudGltZSBpbWFnZSBpcyByZWFkeQorICogdG8gcmVjZWl2ZSBjb21tYW5kcyBmcm9tIHRoZSBkcml2ZXIuICBUaGlzIGlzIHRoZSAqc2Vjb25kKiAiYWxpdmUiCisgKiBub3RpZmljYXRpb24gdGhhdCB0aGUgZHJpdmVyIHdpbGwgcmVjZWl2ZSBhZnRlciByZWJvb3RpbmcgdUNvZGU7CisgKiB0aGlzICJhbGl2ZSIgaXMgaW5kaWNhdGVkIGJ5IHN1YnR5cGUgZmllbGQgIT0gOS4KKyAqCisgKiBTZWUgY29tbWVudHMgZG9jdW1lbnRpbmcgIkJTTSIgKGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lKS4KKyAqCisgKiBUaGlzIHJlc3BvbnNlIGluY2x1ZGVzIHR3byBwb2ludGVycyB0byBzdHJ1Y3R1cmVzIHdpdGhpbiB0aGUgZGV2aWNlJ3MKKyAqIGRhdGEgU1JBTSAoYWNjZXNzIHZpYSBIQlVTX1RBUkdfTUVNXyogcmVncykgdGhhdCBhcmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmc6CisgKgorICogMSkgIGxvZ19ldmVudF90YWJsZV9wdHIgaW5kaWNhdGVzIGJhc2Ugb2YgdGhlIGV2ZW50IGxvZy4gIFRoaXMgdHJhY2VzCisgKiAgICAgYSAyNTYtZW50cnkgaGlzdG9yeSBvZiB1Q29kZSBleGVjdXRpb24gd2l0aGluIGEgY2lyY3VsYXIgYnVmZmVyLgorICogICAgIEl0cyBoZWFkZXIgZm9ybWF0IGlzOgorICoKKyAqCV9fbGUzMiBsb2dfc2l6ZTsgICAgIGxvZyBjYXBhY2l0eSAoaW4gbnVtYmVyIG9mIGVudHJpZXMpCisgKglfX2xlMzIgdHlwZTsgICAgICAgICAoMSkgdGltZXN0YW1wIHdpdGggZWFjaCBlbnRyeSwgKDApIG5vIHRpbWVzdGFtcAorICoJX19sZTMyIHdyYXBzOyAgICAgICAgIyB0aW1lcyB1Q29kZSBoYXMgd3JhcHBlZCB0byB0b3Agb2YgY2lyY3VsYXIgYnVmZmVyCisgKiAgICAgIF9fbGUzMiB3cml0ZV9pZHg7ICBuZXh0IGNpcmN1bGFyIGJ1ZmZlciBlbnRyeSB0aGF0IHVDb2RlIHdvdWxkIGZpbGwKKyAqCisgKiAgICAgVGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSB0aGUgY2lyY3VsYXIgYnVmZmVyIG9mIGxvZyBlbnRyaWVzLiAgRW50cmllcworICogICAgIHdpdGggdGltZXN0YW1wcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICoKKyAqCV9fbGUzMiBldmVudF9pZDsgICAgIHJhbmdlIDAgLSAxNTAwCisgKglfX2xlMzIgdGltZXN0YW1wOyAgICBsb3cgMzIgYml0cyBvZiBUU0YgKG9mIG5ldHdvcmssIGlmIGFzc29jaWF0ZWQpCisgKglfX2xlMzIgZGF0YTsgICAgICAgICBldmVudF9pZC1zcGVjaWZpYyBkYXRhIHZhbHVlCisgKgorICogICAgIEVudHJpZXMgd2l0aG91dCB0aW1lc3RhbXBzIGNvbnRhaW4gb25seSBldmVudF9pZCBhbmQgZGF0YS4KKyAqCisgKgorICogMikgIGVycm9yX2V2ZW50X3RhYmxlX3B0ciBpbmRpY2F0ZXMgYmFzZSBvZiB0aGUgZXJyb3IgbG9nLiAgVGhpcyBjb250YWlucworICogICAgIGluZm9ybWF0aW9uIGFib3V0IGFueSB1Q29kZSBlcnJvciB0aGF0IG9jY3Vycy4gIEZvciA0OTY1LCB0aGUgZm9ybWF0CisgKiAgICAgb2YgdGhlIGVycm9yIGxvZyBpczoKKyAqCisgKglfX2xlMzIgdmFsaWQ7ICAgICAgICAobm9uemVybykgdmFsaWQsICgwKSBsb2cgaXMgZW1wdHkKKyAqCV9fbGUzMiBlcnJvcl9pZDsgICAgIHR5cGUgb2YgZXJyb3IKKyAqCV9fbGUzMiBwYzsgICAgICAgICAgIHByb2dyYW0gY291bnRlcgorICoJX19sZTMyIGJsaW5rMTsgICAgICAgYnJhbmNoIGxpbmsKKyAqCV9fbGUzMiBibGluazI7ICAgICAgIGJyYW5jaCBsaW5rCisgKglfX2xlMzIgaWxpbmsxOyAgICAgICBpbnRlcnJ1cHQgbGluaworICoJX19sZTMyIGlsaW5rMjsgICAgICAgaW50ZXJydXB0IGxpbmsKKyAqCV9fbGUzMiBkYXRhMTsgICAgICAgIGVycm9yLXNwZWNpZmljIGRhdGEKKyAqCV9fbGUzMiBkYXRhMjsgICAgICAgIGVycm9yLXNwZWNpZmljIGRhdGEKKyAqCV9fbGUzMiBsaW5lOyAgICAgICAgIHNvdXJjZSBjb2RlIGxpbmUgb2YgZXJyb3IKKyAqCV9fbGUzMiBiY29uX3RpbWU7ICAgIGJlYWNvbiB0aW1lcgorICoJX19sZTMyIHRzZl9sb3c7ICAgICAgbmV0d29yayB0aW1lc3RhbXAgZnVuY3Rpb24gdGltZXIKKyAqCV9fbGUzMiB0c2ZfaGk7ICAgICAgIG5ldHdvcmsgdGltZXN0YW1wIGZ1bmN0aW9uIHRpbWVyCisgKglfX2xlMzIgZ3AxOyAgICAgICAgICBHUDEgdGltZXIgcmVnaXN0ZXIKKyAqCV9fbGUzMiBncDI7ICAgICAgICAgIEdQMiB0aW1lciByZWdpc3RlcgorICoJX19sZTMyIGdwMzsgICAgICAgICAgR1AzIHRpbWVyIHJlZ2lzdGVyCisgKglfX2xlMzIgdWNvZGVfdmVyOyAgICB1Q29kZSB2ZXJzaW9uCisgKglfX2xlMzIgaHdfdmVyOyAgICAgICBIVyBTaWxpY29uIHZlcnNpb24KKyAqCV9fbGUzMiBicmRfdmVyOyAgICAgIEhXIGJvYXJkIHZlcnNpb24KKyAqCV9fbGUzMiBsb2dfcGM7ICAgICAgIGxvZyBwcm9ncmFtIGNvdW50ZXIKKyAqCV9fbGUzMiBmcmFtZV9wdHI7ICAgIGZyYW1lIHBvaW50ZXIKKyAqCV9fbGUzMiBzdGFja19wdHI7ICAgIHN0YWNrIHBvaW50ZXIKKyAqCV9fbGUzMiBoY21kOyAgICAgICAgIGxhc3QgaG9zdCBjb21tYW5kCisgKglfX2xlMzIgaXNyMDsgICAgICAgICBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjA6IHJ4dHhfZmxhZworICoJX19sZTMyIGlzcjE7ICAgICAgICAgaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IxOiBob3N0X2ZsYWcKKyAqCV9fbGUzMiBpc3IyOyAgICAgICAgIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMjogZW5jX2ZsYWcKKyAqCV9fbGUzMiBpc3IzOyAgICAgICAgIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMzogdGltZV9mbGFnCisgKglfX2xlMzIgaXNyNDsgICAgICAgICBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjQ6IHdpY28gaW50ZXJydXB0CisgKglfX2xlMzIgaXNyX3ByZWY7ICAgICBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX1BSRUZfU1RBVAorICoJX19sZTMyIHdhaXRfZXZlbnQ7ICAgd2FpdCBldmVudCgpIGNhbGxlciBhZGRyZXNzCisgKglfX2xlMzIgbDJwX2NvbnRyb2w7ICBMMnBDb250cm9sRmllbGQKKyAqCV9fbGUzMiBsMnBfZHVyYXRpb247IEwycER1cmF0aW9uRmllbGQKKyAqCV9fbGUzMiBsMnBfbWh2YWxpZDsgIEwycE1oVmFsaWRCaXRzCisgKglfX2xlMzIgbDJwX2FkZHJfbWF0Y2g7IEwycEFkZHJNYXRjaFN0YXQKKyAqCV9fbGUzMiBsbXBtX3BtZ19zZWw7IGluZGljYXRlIHdoaWNoIGNsb2NrcyBhcmUgdHVybmVkIG9uIChMTVBNX1BNR19TRUwpCisgKglfX2xlMzIgdV90aW1lc3RhbXA7ICBpbmRpY2F0ZSB3aGVuIHRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBjb21waWxhdGlvbgorICoJX19sZTMyIHJlc2VydmVkOworICoKKyAqIFRoZSBMaW51eCBkcml2ZXIgY2FuIHByaW50IGJvdGggbG9ncyB0byB0aGUgc3lzdGVtIGxvZyB3aGVuIGEgdUNvZGUgZXJyb3IKKyAqIG9jY3Vycy4KKyAqLworc3RydWN0IGlsX2FsaXZlX3Jlc3AgeworCXU4IHVjb2RlX21pbm9yOworCXU4IHVjb2RlX21ham9yOworCV9fbGUxNiByZXNlcnZlZDE7CisJdTggc3dfcmV2WzhdOworCXU4IHZlcl90eXBlOworCXU4IHZlcl9zdWJ0eXBlOwkJLyogbm90ICI5IiBmb3IgcnVudGltZSBhbGl2ZSAqLworCV9fbGUxNiByZXNlcnZlZDI7CisJX19sZTMyIGxvZ19ldmVudF90YWJsZV9wdHI7CS8qIFNSQU0gYWRkcmVzcyBmb3IgZXZlbnQgbG9nICovCisJX19sZTMyIGVycm9yX2V2ZW50X3RhYmxlX3B0cjsJLyogU1JBTSBhZGRyZXNzIGZvciBlcnJvciBsb2cgKi8KKwlfX2xlMzIgdGltZXN0YW1wOworCV9fbGUzMiBpc192YWxpZDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBOX0VSUk9SID0gMHgyIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQorICovCitzdHJ1Y3QgaWxfZXJyb3JfcmVzcCB7CisJX19sZTMyIGVycm9yX3R5cGU7CisJdTggY21kX2lkOworCXU4IHJlc2VydmVkMTsKKwlfX2xlMTYgYmFkX2NtZF9zZXFfbnVtOworCV9fbGUzMiBlcnJvcl9pbmZvOworCV9fbGU2NCB0aW1lc3RhbXA7Cit9IF9fcGFja2VkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoMSkKKyAqIFJYT04gQ29tbWFuZHMgJiBSZXNwb25zZXM6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUnggY29uZmlnIGRlZmluZXMgJiBzdHJ1Y3R1cmUKKyAqLworLyogcnhfY29uZmlnIGRldmljZSB0eXBlcyAgKi8KK2VudW0geworCVJYT05fREVWX1RZUEVfQVAgPSAxLAorCVJYT05fREVWX1RZUEVfRVNTID0gMywKKwlSWE9OX0RFVl9UWVBFX0lCU1MgPSA0LAorCVJYT05fREVWX1RZUEVfU05JRkZFUiA9IDYsCit9OworCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fRFJJVkVSX0ZPUkNFX01TSwkJY3B1X3RvX2xlMTYoMHgxIDw8IDApCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fRFJJVkVSX0ZPUkNFX1BPUwkJKDApCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fVkFMSURfTVNLCQkJY3B1X3RvX2xlMTYoMHg3IDw8IDEpCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fVkFMSURfUE9TCQkJKDEpCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fRk9SQ0VfU0VMX01TSwkJY3B1X3RvX2xlMTYoMHg3IDw8IDQpCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fRk9SQ0VfU0VMX1BPUwkJKDQpCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fRk9SQ0VfTUlNT19TRUxfTVNLCWNwdV90b19sZTE2KDB4NyA8PCA3KQorI2RlZmluZSBSWE9OX1JYX0NIQUlOX0ZPUkNFX01JTU9fU0VMX1BPUwkoNykKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9DTlRfTVNLCQkJY3B1X3RvX2xlMTYoMHgzIDw8IDEwKQorI2RlZmluZSBSWE9OX1JYX0NIQUlOX0NOVF9QT1MJCQkoMTApCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fTUlNT19DTlRfTVNLCQljcHVfdG9fbGUxNigweDMgPDwgMTIpCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fTUlNT19DTlRfUE9TCQkoMTIpCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fTUlNT19GT1JDRV9NU0sJCWNwdV90b19sZTE2KDB4MSA8PCAxNCkKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9NSU1PX0ZPUkNFX1BPUwkJKDE0KQorCisvKiByeF9jb25maWcgZmxhZ3MgKi8KKy8qIGJhbmQgJiBtb2R1bGF0aW9uIHNlbGVjdGlvbiAqLworI2RlZmluZSBSWE9OX0ZMR19CQU5EXzI0R19NU0sgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgMCkKKyNkZWZpbmUgUlhPTl9GTEdfQ0NLX01TSyAgICAgICAgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDEpCisvKiBhdXRvIGRldGVjdGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDIpCisvKiBUR2cgcHJvdGVjdGlvbiB3aGVuIHR4ICovCisjZGVmaW5lIFJYT05fRkxHX1RHR19QUk9URUNUX01TSyAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAzKQorLyogY2NrIHNob3J0IHNsb3QgJiBwcmVhbWJsZSAqLworI2RlZmluZSBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSyAgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDQpCisjZGVmaW5lIFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSyAgICAgY3B1X3RvX2xlMzIoMSA8PCA1KQorLyogYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgUlhPTl9GTEdfRElTX0RJVl9NU0sgICAgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDcpCisjZGVmaW5lIFJYT05fRkxHX0FOVF9TRUxfTVNLICAgICAgICAgICAgY3B1X3RvX2xlMzIoMHgwZjAwKQorI2RlZmluZSBSWE9OX0ZMR19BTlRfQV9NU0sgICAgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgOCkKKyNkZWZpbmUgUlhPTl9GTEdfQU5UX0JfTVNLICAgICAgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDkpCisvKiByYWRhciBkZXRlY3Rpb24gZW5hYmxlICovCisjZGVmaW5lIFJYT05fRkxHX1JBREFSX0RFVEVDVF9NU0sgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAxMikKKyNkZWZpbmUgUlhPTl9GTEdfVEdKX05BUlJPV19CQU5EX01TSyAgICBjcHVfdG9fbGUzMigxIDw8IDEzKQorLyogcnggcmVzcG9uc2UgdG8gaG9zdCB3aXRoIDgtYnl0ZSBUU0YKKyogKGFjY29yZGluZyB0byBPTl9BSVIgZGVhc3NlcnRpb24pICovCisjZGVmaW5lIFJYT05fRkxHX1RTRjJIT1NUX01TSyAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAxNSkKKworLyogSFQgZmxhZ3MgKi8KKyNkZWZpbmUgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19QT1MJCSgyMikKKyNkZWZpbmUgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0sJY3B1X3RvX2xlMzIoMHgxIDw8IDIyKQorCisjZGVmaW5lIFJYT05fRkxHX0hUX09QRVJBVElOR19NT0RFX1BPUwkJKDIzKQorCisjZGVmaW5lIFJYT05fRkxHX0hUX1BST1RfTVNLCQkJY3B1X3RvX2xlMzIoMHgxIDw8IDIzKQorI2RlZmluZSBSWE9OX0ZMR19IVDQwX1BST1RfTVNLCQkJY3B1X3RvX2xlMzIoMHgyIDw8IDIzKQorCisjZGVmaW5lIFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QT1MJCSgyNSkKKyNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01TSwkJY3B1X3RvX2xlMzIoMHgzIDw8IDI1KQorCisvKiBjaGFubmVsIG1vZGUgKi8KK2VudW0geworCUNIQU5ORUxfTU9ERV9MRUdBQ1kgPSAwLAorCUNIQU5ORUxfTU9ERV9QVVJFXzQwID0gMSwKKwlDSEFOTkVMX01PREVfTUlYRUQgPSAyLAorCUNIQU5ORUxfTU9ERV9SRVNFUlZFRCA9IDMsCit9OworI2RlZmluZSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTEVHQUNZCQkJXAorCWNwdV90b19sZTMyKENIQU5ORUxfTU9ERV9MRUdBQ1kgPDwgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUykKKyNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BVUkVfNDAJCQlcCisJY3B1X3RvX2xlMzIoQ0hBTk5FTF9NT0RFX1BVUkVfNDAgPDwgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUykKKyNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01JWEVECQkJXAorCWNwdV90b19sZTMyKENIQU5ORUxfTU9ERV9NSVhFRCA8PCBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TKQorCisvKiBDVFMgdG8gc2VsZiAoaWYgc3BlYyBhbGxvd3MpIGZsYWcgKi8KKyNkZWZpbmUgUlhPTl9GTEdfU0VMRl9DVFNfRU4JCQljcHVfdG9fbGUzMigweDE8PDMwKQorCisvKiByeF9jb25maWcgZmlsdGVyIGZsYWdzICovCisvKiBhY2NlcHQgYWxsIGRhdGEgZnJhbWVzICovCisjZGVmaW5lIFJYT05fRklMVEVSX1BST01JU0NfTVNLICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAwKQorLyogcGFzcyBjb250cm9sICYgbWFuYWdlbWVudCB0byBob3N0ICovCisjZGVmaW5lIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAxKQorLyogYWNjZXB0IG11bHRpLWNhc3QgKi8KKyNkZWZpbmUgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0sgICAgICBjcHVfdG9fbGUzMigxIDw8IDIpCisvKiBkb24ndCBkZWNyeXB0IHVuaS1jYXN0IGZyYW1lcyAqLworI2RlZmluZSBSWE9OX0ZJTFRFUl9ESVNfREVDUllQVF9NU0sgICAgIGNwdV90b19sZTMyKDEgPDwgMykKKy8qIGRvbid0IGRlY3J5cHQgbXVsdGktY2FzdCBmcmFtZXMgKi8KKyNkZWZpbmUgUlhPTl9GSUxURVJfRElTX0dSUF9ERUNSWVBUX01TSyBjcHVfdG9fbGUzMigxIDw8IDQpCisvKiBTVEEgaXMgYXNzb2NpYXRlZCAqLworI2RlZmluZSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0sgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgNSkKKy8qIHRyYW5zZmVyIHRvIGhvc3Qgbm9uIGJzc2lkIGJlYWNvbnMgaW4gYXNzb2NpYXRlZCBzdGF0ZSAqLworI2RlZmluZSBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyAgICAgIGNwdV90b19sZTMyKDEgPDwgNikKKworLyoqCisgKiBDX1JYT04gPSAweDEwIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKgorICogUlhPTiB0dW5lcyB0aGUgcmFkaW8gdHVuZXIgdG8gYSBzZXJ2aWNlIGNoYW5uZWwsIGFuZCBzZXRzIHVwIGEgbnVtYmVyCisgKiBvZiBwYXJhbWV0ZXJzIHRoYXQgYXJlIHVzZWQgcHJpbWFyaWx5IGZvciBSeCwgYnV0IGFsc28gZm9yIFR4IG9wZXJhdGlvbnMuCisgKgorICogTk9URTogIFdoZW4gdHVuaW5nIHRvIGEgbmV3IGNoYW5uZWwsIGRyaXZlciBtdXN0IHNldCB0aGUKKyAqICAgICAgICBSWE9OX0ZJTFRFUl9BU1NPQ19NU0sgdG8gMC4gIFRoaXMgd2lsbCBjbGVhciBzdGF0aW9uLWRlcGVuZGVudAorICogICAgICAgIGluZm8gd2l0aGluIHRoZSBkZXZpY2UsIGluY2x1ZGluZyB0aGUgc3RhdGlvbiB0YWJsZXMsIHR4IHJldHJ5CisgKiAgICAgICAgcmF0ZSB0YWJsZXMsIGFuZCB0eHBvd2VyIHRhYmxlcy4gIERyaXZlciBtdXN0IGJ1aWxkIGEgbmV3IHN0YXRpb24KKyAqICAgICAgICB0YWJsZSBhbmQgdHhwb3dlciB0YWJsZSBiZWZvcmUgdHJhbnNtaXR0aW5nIGFueXRoaW5nIG9uIHRoZSBSWE9OCisgKiAgICAgICAgY2hhbm5lbC4KKyAqCisgKiBOT1RFOiAgQWxsIFJYT05zIHdpcGUgY2xlYW4gdGhlIGludGVybmFsIHR4cG93ZXIgdGFibGUuICBEcml2ZXIgbXVzdAorICogICAgICAgIGlzc3VlIGEgbmV3IENfVFhfUFdSX1RCTCBhZnRlciBlYWNoIENfUlhPTiAoMHgxMCksCisgKiAgICAgICAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIFJYT05fRklMVEVSX0FTU09DX01TSyBpcyBzZXQuCisgKi8KKworc3RydWN0IGlsMzk0NV9yeG9uX2NtZCB7CisJdTggbm9kZV9hZGRyWzZdOworCV9fbGUxNiByZXNlcnZlZDE7CisJdTggYnNzaWRfYWRkcls2XTsKKwlfX2xlMTYgcmVzZXJ2ZWQyOworCXU4IHdsYXBfYnNzaWRfYWRkcls2XTsKKwlfX2xlMTYgcmVzZXJ2ZWQzOworCXU4IGRldl90eXBlOworCXU4IGFpcl9wcm9wYWdhdGlvbjsKKwlfX2xlMTYgcmVzZXJ2ZWQ0OworCXU4IG9mZG1fYmFzaWNfcmF0ZXM7CisJdTggY2NrX2Jhc2ljX3JhdGVzOworCV9fbGUxNiBhc3NvY19pZDsKKwlfX2xlMzIgZmxhZ3M7CisJX19sZTMyIGZpbHRlcl9mbGFnczsKKwlfX2xlMTYgY2hhbm5lbDsKKwlfX2xlMTYgcmVzZXJ2ZWQ1OworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsNDk2NV9yeG9uX2NtZCB7CisJdTggbm9kZV9hZGRyWzZdOworCV9fbGUxNiByZXNlcnZlZDE7CisJdTggYnNzaWRfYWRkcls2XTsKKwlfX2xlMTYgcmVzZXJ2ZWQyOworCXU4IHdsYXBfYnNzaWRfYWRkcls2XTsKKwlfX2xlMTYgcmVzZXJ2ZWQzOworCXU4IGRldl90eXBlOworCXU4IGFpcl9wcm9wYWdhdGlvbjsKKwlfX2xlMTYgcnhfY2hhaW47CisJdTggb2ZkbV9iYXNpY19yYXRlczsKKwl1OCBjY2tfYmFzaWNfcmF0ZXM7CisJX19sZTE2IGFzc29jX2lkOworCV9fbGUzMiBmbGFnczsKKwlfX2xlMzIgZmlsdGVyX2ZsYWdzOworCV9fbGUxNiBjaGFubmVsOworCXU4IG9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlczsKKwl1OCBvZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzOworfSBfX3BhY2tlZDsKKworLyogQ3JlYXRlIGEgY29tbW9uIHJ4b24gY21kIHdoaWNoIHdpbGwgYmUgdHlwZWNhc3QgaW50byB0aGUgMzk0NSBvciA0OTY1CisgKiBzcGVjaWZpYyByeG9uIGNtZCwgZGVwZW5kaW5nIG9uIHdoZXJlIGl0IGlzIGNhbGxlZCBmcm9tLgorICovCitzdHJ1Y3QgaWxfcnhvbl9jbWQgeworCXU4IG5vZGVfYWRkcls2XTsKKwlfX2xlMTYgcmVzZXJ2ZWQxOworCXU4IGJzc2lkX2FkZHJbNl07CisJX19sZTE2IHJlc2VydmVkMjsKKwl1OCB3bGFwX2Jzc2lkX2FkZHJbNl07CisJX19sZTE2IHJlc2VydmVkMzsKKwl1OCBkZXZfdHlwZTsKKwl1OCBhaXJfcHJvcGFnYXRpb247CisJX19sZTE2IHJ4X2NoYWluOworCXU4IG9mZG1fYmFzaWNfcmF0ZXM7CisJdTggY2NrX2Jhc2ljX3JhdGVzOworCV9fbGUxNiBhc3NvY19pZDsKKwlfX2xlMzIgZmxhZ3M7CisJX19sZTMyIGZpbHRlcl9mbGFnczsKKwlfX2xlMTYgY2hhbm5lbDsKKwl1OCBvZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXM7CisJdTggb2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlczsKKwl1OCByZXNlcnZlZDQ7CisJdTggcmVzZXJ2ZWQ1OworfSBfX3BhY2tlZDsKKworLyoKKyAqIENfUlhPTl9BU1NPQyA9IDB4MTEgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqLworc3RydWN0IGlsMzk0NV9yeG9uX2Fzc29jX2NtZCB7CisJX19sZTMyIGZsYWdzOworCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7CisJdTggb2ZkbV9iYXNpY19yYXRlczsKKwl1OCBjY2tfYmFzaWNfcmF0ZXM7CisJX19sZTE2IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsNDk2NV9yeG9uX2Fzc29jX2NtZCB7CisJX19sZTMyIGZsYWdzOworCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7CisJdTggb2ZkbV9iYXNpY19yYXRlczsKKwl1OCBjY2tfYmFzaWNfcmF0ZXM7CisJdTggb2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOworCXU4IG9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXM7CisJX19sZTE2IHJ4X2NoYWluX3NlbGVjdF9mbGFnczsKKwlfX2xlMTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIElMX0NPTk5fTUFYX0xJU1RFTl9JTlRFUlZBTAkxMAorI2RlZmluZSBJTF9NQVhfVUNPREVfQkVBQ09OX0lOVEVSVkFMCTQJLyogNDA5NiAqLworI2RlZmluZSBJTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJMQkvKiAxMDI0ICovCisKKy8qCisgKiBDX1JYT05fVElNSU5HID0gMHgxNCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQorICovCitzdHJ1Y3QgaWxfcnhvbl90aW1lX2NtZCB7CisJX19sZTY0IHRpbWVzdGFtcDsKKwlfX2xlMTYgYmVhY29uX2ludGVydmFsOworCV9fbGUxNiBhdGltX3dpbjsKKwlfX2xlMzIgYmVhY29uX2luaXRfdmFsOworCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTggZHRpbV9wZXJpb2Q7CisJdTggZGVsdGFfY3BfYnNzX3RidHRzOworfSBfX3BhY2tlZDsKKworLyoKKyAqIENfQ0hBTk5FTF9TV0lUQ0ggPSAweDcyIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKi8KK3N0cnVjdCBpbDM5NDVfY2hhbm5lbF9zd2l0Y2hfY21kIHsKKwl1OCBiYW5kOworCXU4IGV4cGVjdF9iZWFjb247CisJX19sZTE2IGNoYW5uZWw7CisJX19sZTMyIHJ4b25fZmxhZ3M7CisJX19sZTMyIHJ4b25fZmlsdGVyX2ZsYWdzOworCV9fbGUzMiBzd2l0Y2hfdGltZTsKKwlzdHJ1Y3QgaWwzOTQ1X3Bvd2VyX3Blcl9yYXRlIHBvd2VyW0lMX01BWF9SQVRFU107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWw0OTY1X2NoYW5uZWxfc3dpdGNoX2NtZCB7CisJdTggYmFuZDsKKwl1OCBleHBlY3RfYmVhY29uOworCV9fbGUxNiBjaGFubmVsOworCV9fbGUzMiByeG9uX2ZsYWdzOworCV9fbGUzMiByeG9uX2ZpbHRlcl9mbGFnczsKKwlfX2xlMzIgc3dpdGNoX3RpbWU7CisJc3RydWN0IGlsNDk2NV90eF9wb3dlcl9kYiB0eF9wb3dlcjsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBOX0NIQU5ORUxfU1dJVENIID0gMHg3MyAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKi8KK3N0cnVjdCBpbF9jc2Ffbm90aWZpY2F0aW9uIHsKKwlfX2xlMTYgYmFuZDsKKwlfX2xlMTYgY2hhbm5lbDsKKwlfX2xlMzIgc3RhdHVzOwkJLyogMCAtIE9LLCAxIC0gZmFpbCAqLworfSBfX3BhY2tlZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKDIpCisgKiBRdWFsaXR5LW9mLVNlcnZpY2UgKFFPUykgQ29tbWFuZHMgJiBSZXNwb25zZXM6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIHN0cnVjdCBpbF9hY19xb3MgLS0gUU9TIHRpbWluZyBwYXJhbXMgZm9yIENfUU9TX1BBUkFNCisgKiBPbmUgZm9yIGVhY2ggb2YgNCBFRENBIGFjY2VzcyBjYXRlZ29yaWVzIGluIHN0cnVjdCBpbF9xb3NwYXJhbV9jbWQKKyAqCisgKiBAY3dfbWluOiBDb250ZW50aW9uIHdpbiwgc3RhcnQgdmFsdWUgaW4gbnVtYmVycyBvZiBzbG90cy4KKyAqICAgICAgICAgIFNob3VsZCBiZSBhIHBvd2VyLW9mLTIsIG1pbnVzIDEuICBEZXZpY2UncyBkZWZhdWx0IGlzIDB4MGYuCisgKiBAY3dfbWF4OiBDb250ZW50aW9uIHdpbiwgbWF4IHZhbHVlIGluIG51bWJlcnMgb2Ygc2xvdHMuCisgKiAgICAgICAgICBTaG91bGQgYmUgYSBwb3dlci1vZi0yLCBtaW51cyAxLiAgRGV2aWNlJ3MgZGVmYXVsdCBpcyAweDNmLgorICogQGFpZnNuOiAgTnVtYmVyIG9mIHNsb3RzIGluIEFyYml0cmF0aW9uIEludGVyZnJhbWUgU3BhY2UgKGJlZm9yZQorICogICAgICAgICAgcGVyZm9ybWluZyByYW5kb20gYmFja29mZiB0aW1pbmcgcHJpb3IgdG8gVHgpLiAgRGV2aWNlIGRlZmF1bHQgMS4KKyAqIEBlZGNhX3R4b3A6ICBMZW5ndGggb2YgVHggb3Bwb3J0dW5pdHksIGluIHVTZWNzLiAgRGV2aWNlIGRlZmF1bHQgaXMgMC4KKyAqCisgKiBEZXZpY2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGluY3JlYXNlIGNvbnRlbnRpb24gd2luIGJ5ICgyKkNXKSArIDEgZm9yIGVhY2gKKyAqIHRyYW5zbWlzc2lvbiByZXRyeS4gIERldmljZSB1c2VzIGN3X21heCBhcyBhIGJpdCBtYXNrLCBBTkRlZCB3aXRoIG5ldyBDVworICogdmFsdWUsIHRvIGNhcCB0aGUgQ1cgdmFsdWUuCisgKi8KK3N0cnVjdCBpbF9hY19xb3MgeworCV9fbGUxNiBjd19taW47CisJX19sZTE2IGN3X21heDsKKwl1OCBhaWZzbjsKKwl1OCByZXNlcnZlZDE7CisJX19sZTE2IGVkY2FfdHhvcDsKK30gX19wYWNrZWQ7CisKKy8qIFFvUyBmbGFncyBkZWZpbmVzICovCisjZGVmaW5lIFFPU19QQVJBTV9GTEdfVVBEQVRFX0VEQ0FfTVNLCWNwdV90b19sZTMyKDB4MDEpCisjZGVmaW5lIFFPU19QQVJBTV9GTEdfVEdOX01TSwkJY3B1X3RvX2xlMzIoMHgwMikKKyNkZWZpbmUgUU9TX1BBUkFNX0ZMR19UWE9QX1RZUEVfTVNLCWNwdV90b19sZTMyKDB4MTApCisKKy8qIE51bWJlciBvZiBBY2Nlc3MgQ2F0ZWdvcmllcyAoQUMpIChFRENBKSwgcXVldWVzIDAuLjMgKi8KKyNkZWZpbmUgQUNfTlVNICAgICAgICAgICAgICAgIDQKKworLyoKKyAqIENfUU9TX1BBUkFNID0gMHgxMyAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQorICoKKyAqIFRoaXMgY29tbWFuZCBzZXRzIHVwIHRpbWluZ3MgZm9yIGVhY2ggb2YgdGhlIDQgcHJpb3JpdGl6ZWQgRURDQSBUeCBGSUZPcworICogMDogQmFja2dyb3VuZCwgMTogQmVzdCBFZmZvcnQsIDI6IFZpZGVvLCAzOiBWb2ljZS4KKyAqLworc3RydWN0IGlsX3Fvc3BhcmFtX2NtZCB7CisJX19sZTMyIHFvc19mbGFnczsKKwlzdHJ1Y3QgaWxfYWNfcW9zIGFjW0FDX05VTV07Cit9IF9fcGFja2VkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoMykKKyAqIEFkZC9Nb2RpZnkgU3RhdGlvbnMgQ29tbWFuZHMgJiBSZXNwb25zZXM6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIE11bHRpIHN0YXRpb24gc3VwcG9ydAorICovCisKKy8qIFNwZWNpYWwsIGRlZGljYXRlZCBsb2NhdGlvbnMgd2l0aGluIGRldmljZSdzIHN0YXRpb24gdGFibGUgKi8KKyNkZWZpbmUJSUxfQVBfSUQJCTAKKyNkZWZpbmUJSUxfU1RBX0lECQkyCisjZGVmaW5lCUlMMzk0NV9CUk9BRENBU1RfSUQJMjQKKyNkZWZpbmUgSUwzOTQ1X1NUQVRJT05fQ09VTlQJMjUKKyNkZWZpbmUgSUw0OTY1X0JST0FEQ0FTVF9JRAkzMQorI2RlZmluZQlJTDQ5NjVfU1RBVElPTl9DT1VOVAkzMgorCisjZGVmaW5lCUlMX1NUQVRJT05fQ09VTlQJMzIJLyogTUFYKDM5NDUsNDk2NSkgKi8KKyNkZWZpbmUJSUxfSU5WQUxJRF9TVEFUSU9OCTI1NQorCisjZGVmaW5lIFNUQV9GTEdfVFhfUkFURV9NU0sJCWNwdV90b19sZTMyKDEgPDwgMikKKyNkZWZpbmUgU1RBX0ZMR19QV1JfU0FWRV9NU0sJCWNwdV90b19sZTMyKDEgPDwgOCkKKyNkZWZpbmUgU1RBX0ZMR19SVFNfTUlNT19QUk9UX01TSwljcHVfdG9fbGUzMigxIDw8IDE3KQorI2RlZmluZSBTVEFfRkxHX0FHR19NUERVXzhVU19NU0sJY3B1X3RvX2xlMzIoMSA8PCAxOCkKKyNkZWZpbmUgU1RBX0ZMR19NQVhfQUdHX1NJWkVfUE9TCSgxOSkKKyNkZWZpbmUgU1RBX0ZMR19NQVhfQUdHX1NJWkVfTVNLCWNwdV90b19sZTMyKDMgPDwgMTkpCisjZGVmaW5lIFNUQV9GTEdfSFQ0MF9FTl9NU0sJCWNwdV90b19sZTMyKDEgPDwgMjEpCisjZGVmaW5lIFNUQV9GTEdfTUlNT19ESVNfTVNLCQljcHVfdG9fbGUzMigxIDw8IDIyKQorI2RlZmluZSBTVEFfRkxHX0FHR19NUERVX0RFTlNJVFlfUE9TCSgyMykKKyNkZWZpbmUgU1RBX0ZMR19BR0dfTVBEVV9ERU5TSVRZX01TSwljcHVfdG9fbGUzMig3IDw8IDIzKQorCisvKiBVc2UgaW4gbW9kZSBmaWVsZC4gIDE6IG1vZGlmeSBleGlzdGluZyBlbnRyeSwgMDogYWRkIG5ldyBzdGF0aW9uIGVudHJ5ICovCisjZGVmaW5lIFNUQV9DT05UUk9MX01PRElGWV9NU0sJCTB4MDEKKworLyoga2V5IGZsYWdzIF9fbGUxNiovCisjZGVmaW5lIFNUQV9LRVlfRkxHX0VOQ1JZUFRfTVNLCWNwdV90b19sZTE2KDB4MDAwNykKKyNkZWZpbmUgU1RBX0tFWV9GTEdfTk9fRU5DCWNwdV90b19sZTE2KDB4MDAwMCkKKyNkZWZpbmUgU1RBX0tFWV9GTEdfV0VQCQljcHVfdG9fbGUxNigweDAwMDEpCisjZGVmaW5lIFNUQV9LRVlfRkxHX0NDTVAJY3B1X3RvX2xlMTYoMHgwMDAyKQorI2RlZmluZSBTVEFfS0VZX0ZMR19US0lQCWNwdV90b19sZTE2KDB4MDAwMykKKworI2RlZmluZSBTVEFfS0VZX0ZMR19LRVlJRF9QT1MJOAorI2RlZmluZSBTVEFfS0VZX0ZMR19JTlZBTElECWNwdV90b19sZTE2KDB4MDgwMCkKKy8qIHdlcCBrZXkgaXMgZWl0aGVyIGZyb20gZ2xvYmFsIGtleSAoMCkgb3IgZnJvbSBzdGF0aW9uIGluZm8gYXJyYXkgKDEpICovCisjZGVmaW5lIFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLCWNwdV90b19sZTE2KDB4MDAwOCkKKworLyogd2VwIGtleSBpbiBTVEE6IDUtYnl0ZXMgKDApIG9yIDEzLWJ5dGVzICgxKSAqLworI2RlZmluZSBTVEFfS0VZX0ZMR19LRVlfU0laRV9NU0sJY3B1X3RvX2xlMTYoMHgxMDAwKQorI2RlZmluZSBTVEFfS0VZX01VTFRJQ0FTVF9NU0sJCWNwdV90b19sZTE2KDB4NDAwMCkKKyNkZWZpbmUgU1RBX0tFWV9NQVhfTlVNCQk4CisKKy8qIEZsYWdzIGluZGljYXRlIHdoZXRoZXIgdG8gbW9kaWZ5IHZzLiBkb24ndCBjaGFuZ2UgdmFyaW91cyBzdGF0aW9uIHBhcmFtcyAqLworI2RlZmluZQlTVEFfTU9ESUZZX0tFWV9NQVNLCQkweDAxCisjZGVmaW5lCVNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFgJMHgwMgorI2RlZmluZQlTVEFfTU9ESUZZX1RYX1JBVEVfTVNLCQkweDA0CisjZGVmaW5lIFNUQV9NT0RJRllfQUREQkFfVElEX01TSwkweDA4CisjZGVmaW5lIFNUQV9NT0RJRllfREVMQkFfVElEX01TSwkweDEwCisjZGVmaW5lIFNUQV9NT0RJRllfU0xFRVBfVFhfQ09VTlRfTVNLCTB4MjAKKworLyogUmVjZWl2ZXIgYWRkcmVzcyAoYWN0dWFsbHksIFJ4IHN0YXRpb24ncyBpZHggaW50byBzdGF0aW9uIHRhYmxlKSwKKyAqIGNvbWJpbmVkIHdpdGggVHJhZmZpYyBJRCAoUU9TIHByaW9yaXR5KSwgaW4gZm9ybWF0IHVzZWQgYnkgVHggU2NoZWR1bGVyICovCisjZGVmaW5lIEJVSUxEX1JBeFRJRChzdGFfaWQsIHRpZCkJKCgoc3RhX2lkKSA8PCA0KSArICh0aWQpKQorCitzdHJ1Y3QgaWw0OTY1X2tleWluZm8geworCV9fbGUxNiBrZXlfZmxhZ3M7CisJdTggdGtpcF9yeF90c2NfYnl0ZTI7CS8qIFRTQ1syXSBmb3Iga2V5IG1peCBwaDEgZGV0ZWN0aW9uICovCisJdTggcmVzZXJ2ZWQxOworCV9fbGUxNiB0a2lwX3J4X3R0YWtbNV07CS8qIDEwLWJ5dGUgdW5pY2FzdCBUS0lQIFRUQUsgKi8KKwl1OCBrZXlfb2Zmc2V0OworCXU4IHJlc2VydmVkMjsKKwl1OCBrZXlbMTZdOwkJLyogMTYtYnl0ZSB1bmljYXN0IGRlY3J5cHRpb24ga2V5ICovCit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCBzdGFfaWRfbW9kaWZ5CisgKiBAYWRkcltFVEhfQUxFTl06IHN0YXRpb24ncyBNQUMgYWRkcmVzcworICogQHN0YV9pZDogaWR4IG9mIHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlCisgKiBAbW9kaWZ5X21hc2s6IFNUQV9NT0RJRllfKiwgMTogbW9kaWZ5LCAwOiBkb24ndCBjaGFuZ2UKKyAqCisgKiBEcml2ZXIgc2VsZWN0cyB1bnVzZWQgdGFibGUgaWR4IHdoZW4gYWRkaW5nIG5ldyBzdGF0aW9uLAorICogb3IgdGhlIGlkeCB0byBhIHByZS1leGlzdGluZyBzdGF0aW9uIGVudHJ5IHdoZW4gbW9kaWZ5aW5nIHRoYXQgc3RhdGlvbi4KKyAqIFNvbWUgaWR4ZXMgaGF2ZSBzcGVjaWFsIHB1cnBvc2VzIChJTF9BUF9JRCwgaWR4IDAsIGlzIGZvciBBUCkuCisgKgorICogbW9kaWZ5X21hc2sgZmxhZ3Mgc2VsZWN0IHdoaWNoIHBhcmFtZXRlcnMgdG8gbW9kaWZ5IHZzLiBsZWF2ZSBhbG9uZS4KKyAqLworc3RydWN0IHN0YV9pZF9tb2RpZnkgeworCXU4IGFkZHJbRVRIX0FMRU5dOworCV9fbGUxNiByZXNlcnZlZDE7CisJdTggc3RhX2lkOworCXU4IG1vZGlmeV9tYXNrOworCV9fbGUxNiByZXNlcnZlZDI7Cit9IF9fcGFja2VkOworCisvKgorICogQ19BRERfU1RBID0gMHgxOCAoY29tbWFuZCkKKyAqCisgKiBUaGUgZGV2aWNlIGNvbnRhaW5zIGFuIGludGVybmFsIHRhYmxlIG9mIHBlci1zdGF0aW9uIGluZm9ybWF0aW9uLAorICogd2l0aCBpbmZvIG9uIHNlY3VyaXR5IGtleXMsIGFnZ3JlZ2F0aW9uIHBhcmFtZXRlcnMsIGFuZCBUeCByYXRlcyBmb3IKKyAqIGluaXRpYWwgVHggYXR0ZW1wdCBhbmQgYW55IHJldHJpZXMgKDQ5NjUgZGV2aWNlcyB1c2VzCisgKiBDX1RYX0xJTktfUVVBTElUWV9DTUQsCisgKiAzOTQ1IHVzZXMgQ19SQVRFX1NDQUxFIHRvIHNldCB1cCByYXRlIHRhYmxlcykuCisgKgorICogQ19BRERfU1RBIHNldHMgdXAgdGhlIHRhYmxlIGVudHJ5IGZvciBvbmUgc3RhdGlvbiwgZWl0aGVyIGNyZWF0aW5nCisgKiBhIG5ldyBlbnRyeSwgb3IgbW9kaWZ5aW5nIGEgcHJlLWV4aXN0aW5nIG9uZS4KKyAqCisgKiBOT1RFOiAgUlhPTiBjb21tYW5kICh3aXRob3V0ICJhc3NvY2lhdGVkIiBiaXQgc2V0KSB3aXBlcyB0aGUgc3RhdGlvbiB0YWJsZQorICogICAgICAgIGNsZWFuLiAgTW92aW5nIGludG8gUkZfS0lMTCBzdGF0ZSBkb2VzIHRoaXMgYWxzby4gIERyaXZlciBtdXN0IHNldCB1cAorICogICAgICAgIG5ldyBzdGF0aW9uIHRhYmxlIGJlZm9yZSB0cmFuc21pdHRpbmcgYW55dGhpbmcgb24gdGhlIFJYT04gY2hhbm5lbAorICogICAgICAgIChleGNlcHQgYWN0aXZlIHNjYW5zIG9yIGFjdGl2ZSBtZWFzdXJlbWVudHM7IHRob3NlIGNvbW1hbmRzIGNhcnJ5CisgKiAgICAgICAgdGhlaXIgb3duIHR4cG93ZXIvcmF0ZSBzZXR1cCBkYXRhKS4KKyAqCisgKiAgICAgICAgV2hlbiBnZXR0aW5nIHN0YXJ0ZWQgb24gYSBuZXcgY2hhbm5lbCwgZHJpdmVyIG11c3Qgc2V0IHVwIHRoZQorICogICAgICAgIElMX0JST0FEQ0FTVF9JRCBlbnRyeSAobGFzdCBlbnRyeSBpbiB0aGUgdGFibGUpLiAgRm9yIGEgY2xpZW50CisgKiAgICAgICAgc3RhdGlvbiBpbiBhIEJTUywgb25jZSBhbiBBUCBpcyBzZWxlY3RlZCwgZHJpdmVyIHNldHMgdXAgdGhlIEFQIFNUQQorICogICAgICAgIGluIHRoZSBJTF9BUF9JRCBlbnRyeSAoMXN0IGVudHJ5IGluIHRoZSB0YWJsZSkuICBCUk9BRENBU1QgYW5kIEFQCisgKiAgICAgICAgYXJlIGFsbCB0aGF0IGFyZSBuZWVkZWQgZm9yIGEgQlNTIGNsaWVudCBzdGF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICogICAgICAgIHVzZWQgYXMgQVAsIG9yIGluIGFuIElCU1MgbmV0d29yaywgZHJpdmVyIG11c3Qgc2V0IHVwIHN0YXRpb24gdGFibGUKKyAqICAgICAgICBlbnRyaWVzIGZvciBhbGwgU1RBcyBpbiBuZXR3b3JrLCBzdGFydGluZyB3aXRoIGlkeCBJTF9TVEFfSUQuCisgKi8KKworc3RydWN0IGlsMzk0NV9hZGRzdGFfY21kIHsKKwl1OCBtb2RlOwkJLyogMTogbW9kaWZ5IGV4aXN0aW5nLCAwOiBhZGQgbmV3IHN0YXRpb24gKi8KKwl1OCByZXNlcnZlZFszXTsKKwlzdHJ1Y3Qgc3RhX2lkX21vZGlmeSBzdGE7CisJc3RydWN0IGlsNDk2NV9rZXlpbmZvIGtleTsKKwlfX2xlMzIgc3RhdGlvbl9mbGFnczsJLyogU1RBX0ZMR18qICovCisJX19sZTMyIHN0YXRpb25fZmxhZ3NfbXNrOwkvKiBTVEFfRkxHXyogKi8KKworCS8qIGJpdCBmaWVsZCB0byBkaXNhYmxlICgxKSBvciBlbmFibGUgKDApIFR4IGZvciBUcmFmZmljIElEIChUSUQpCisJICogY29ycmVzcG9uZGluZyB0byBiaXQgKGUuZy4gYml0IDUgY29udHJvbHMgVElEIDUpLgorCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9USURfRElTQUJMRV9UWCB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwlfX2xlMTYgdGlkX2Rpc2FibGVfdHg7CisKKwlfX2xlMTYgcmF0ZV9uX2ZsYWdzOworCisJLyogVElEIGZvciB3aGljaCB0byBhZGQgYmxvY2stYWNrIHN1cHBvcnQuCisJICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0FEREJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCisJdTggYWRkX2ltbWVkaWF0ZV9iYV90aWQ7CisKKwkvKiBUSUQgZm9yIHdoaWNoIHRvIHJlbW92ZSBibG9jay1hY2sgc3VwcG9ydC4KKwkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfREVMQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwl1OCByZW1vdmVfaW1tZWRpYXRlX2JhX3RpZDsKKworCS8qIFN0YXJ0aW5nIFNlcXVlbmNlIE51bWJlciBmb3IgYWRkZWQgYmxvY2stYWNrIHN1cHBvcnQuCisJICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0FEREJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCisJX19sZTE2IGFkZF9pbW1lZGlhdGVfYmFfc3NuOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsNDk2NV9hZGRzdGFfY21kIHsKKwl1OCBtb2RlOwkJLyogMTogbW9kaWZ5IGV4aXN0aW5nLCAwOiBhZGQgbmV3IHN0YXRpb24gKi8KKwl1OCByZXNlcnZlZFszXTsKKwlzdHJ1Y3Qgc3RhX2lkX21vZGlmeSBzdGE7CisJc3RydWN0IGlsNDk2NV9rZXlpbmZvIGtleTsKKwlfX2xlMzIgc3RhdGlvbl9mbGFnczsJLyogU1RBX0ZMR18qICovCisJX19sZTMyIHN0YXRpb25fZmxhZ3NfbXNrOwkvKiBTVEFfRkxHXyogKi8KKworCS8qIGJpdCBmaWVsZCB0byBkaXNhYmxlICgxKSBvciBlbmFibGUgKDApIFR4IGZvciBUcmFmZmljIElEIChUSUQpCisJICogY29ycmVzcG9uZGluZyB0byBiaXQgKGUuZy4gYml0IDUgY29udHJvbHMgVElEIDUpLgorCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9USURfRElTQUJMRV9UWCB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwlfX2xlMTYgdGlkX2Rpc2FibGVfdHg7CisKKwlfX2xlMTYgcmVzZXJ2ZWQxOworCisJLyogVElEIGZvciB3aGljaCB0byBhZGQgYmxvY2stYWNrIHN1cHBvcnQuCisJICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0FEREJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCisJdTggYWRkX2ltbWVkaWF0ZV9iYV90aWQ7CisKKwkvKiBUSUQgZm9yIHdoaWNoIHRvIHJlbW92ZSBibG9jay1hY2sgc3VwcG9ydC4KKwkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfREVMQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwl1OCByZW1vdmVfaW1tZWRpYXRlX2JhX3RpZDsKKworCS8qIFN0YXJ0aW5nIFNlcXVlbmNlIE51bWJlciBmb3IgYWRkZWQgYmxvY2stYWNrIHN1cHBvcnQuCisJICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0FEREJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCisJX19sZTE2IGFkZF9pbW1lZGlhdGVfYmFfc3NuOworCisJLyoKKwkgKiBOdW1iZXIgb2YgcGFja2V0cyBPSyB0byB0cmFuc21pdCB0byBzdGF0aW9uIGV2ZW4gdGhvdWdoCisJICogaXQgaXMgYXNsZWVwIC0tIHVzZWQgdG8gc3luY2hyb25pc2UgUFMtcG9sbCBhbmQgdS1BUFNECisJICogcmVzcG9uc2VzIHdoaWxlIHVjb2RlIGtlZXBzIHRyYWNrIG9mIFNUQSBzbGVlcCBzdGF0ZS4KKwkgKi8KKwlfX2xlMTYgc2xlZXBfdHhfY291bnQ7CisKKwlfX2xlMTYgcmVzZXJ2ZWQyOworfSBfX3BhY2tlZDsKKworLyogV3JhcHBlciBzdHJ1Y3QgZm9yIDM5NDUgYW5kIDQ5NjUgYWRkc3RhX2NtZCBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgaWxfYWRkc3RhX2NtZCB7CisJdTggbW9kZTsJCS8qIDE6IG1vZGlmeSBleGlzdGluZywgMDogYWRkIG5ldyBzdGF0aW9uICovCisJdTggcmVzZXJ2ZWRbM107CisJc3RydWN0IHN0YV9pZF9tb2RpZnkgc3RhOworCXN0cnVjdCBpbDQ5NjVfa2V5aW5mbyBrZXk7CisJX19sZTMyIHN0YXRpb25fZmxhZ3M7CS8qIFNUQV9GTEdfKiAqLworCV9fbGUzMiBzdGF0aW9uX2ZsYWdzX21zazsJLyogU1RBX0ZMR18qICovCisKKwkvKiBiaXQgZmllbGQgdG8gZGlzYWJsZSAoMSkgb3IgZW5hYmxlICgwKSBUeCBmb3IgVHJhZmZpYyBJRCAoVElEKQorCSAqIGNvcnJlc3BvbmRpbmcgdG8gYml0IChlLmcuIGJpdCA1IGNvbnRyb2xzIFRJRCA1KS4KKwkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFggdG8gdXNlIHRoaXMgZmllbGQuICovCisJX19sZTE2IHRpZF9kaXNhYmxlX3R4OworCisJX19sZTE2IHJhdGVfbl9mbGFnczsJLyogMzk0NSBvbmx5ICovCisKKwkvKiBUSUQgZm9yIHdoaWNoIHRvIGFkZCBibG9jay1hY2sgc3VwcG9ydC4KKwkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwl1OCBhZGRfaW1tZWRpYXRlX2JhX3RpZDsKKworCS8qIFRJRCBmb3Igd2hpY2ggdG8gcmVtb3ZlIGJsb2NrLWFjayBzdXBwb3J0LgorCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9ERUxCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLworCXU4IHJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOworCisJLyogU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyIGZvciBhZGRlZCBibG9jay1hY2sgc3VwcG9ydC4KKwkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwlfX2xlMTYgYWRkX2ltbWVkaWF0ZV9iYV9zc247CisKKwkvKgorCSAqIE51bWJlciBvZiBwYWNrZXRzIE9LIHRvIHRyYW5zbWl0IHRvIHN0YXRpb24gZXZlbiB0aG91Z2gKKwkgKiBpdCBpcyBhc2xlZXAgLS0gdXNlZCB0byBzeW5jaHJvbmlzZSBQUy1wb2xsIGFuZCB1LUFQU0QKKwkgKiByZXNwb25zZXMgd2hpbGUgdWNvZGUga2VlcHMgdHJhY2sgb2YgU1RBIHNsZWVwIHN0YXRlLgorCSAqLworCV9fbGUxNiBzbGVlcF90eF9jb3VudDsKKworCV9fbGUxNiByZXNlcnZlZDI7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFERF9TVEFfU1VDQ0VTU19NU0sJCTB4MQorI2RlZmluZSBBRERfU1RBX05PX1JPT01fSU5fVEJMCTB4MgorI2RlZmluZSBBRERfU1RBX05PX0JMT0NLX0FDS19SRVNPVVJDRQkweDQKKyNkZWZpbmUgQUREX1NUQV9NT0RJRllfTk9OX0VYSVNUX1NUQQkweDgKKy8qCisgKiBDX0FERF9TVEEgPSAweDE4IChyZXNwb25zZSkKKyAqLworc3RydWN0IGlsX2FkZF9zdGFfcmVzcCB7CisJdTggc3RhdHVzOwkJLyogQUREX1NUQV8qICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIFJFTV9TVEFfU1VDQ0VTU19NU0sgICAgICAgICAgICAgIDB4MQorLyoKKyAqICBDX1JFTV9TVEEgPSAweDE5IChyZXNwb25zZSkKKyAqLworc3RydWN0IGlsX3JlbV9zdGFfcmVzcCB7CisJdTggc3RhdHVzOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBDX1JFTV9TVEEgPSAweDE5IChjb21tYW5kKQorICovCitzdHJ1Y3QgaWxfcmVtX3N0YV9jbWQgeworCXU4IG51bV9zdGE7CQkvKiBudW1iZXIgb2YgcmVtb3ZlZCBzdGF0aW9ucyAqLworCXU4IHJlc2VydmVkWzNdOworCXU4IGFkZHJbRVRIX0FMRU5dOwkvKiBNQUMgYWRkciBvZiB0aGUgZmlyc3Qgc3RhdGlvbiAqLworCXU4IHJlc2VydmVkMlsyXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSUxfVFhfRklGT19CS19NU0sJCWNwdV90b19sZTMyKEJJVCgwKSkKKyNkZWZpbmUgSUxfVFhfRklGT19CRV9NU0sJCWNwdV90b19sZTMyKEJJVCgxKSkKKyNkZWZpbmUgSUxfVFhfRklGT19WSV9NU0sJCWNwdV90b19sZTMyKEJJVCgyKSkKKyNkZWZpbmUgSUxfVFhfRklGT19WT19NU0sJCWNwdV90b19sZTMyKEJJVCgzKSkKKyNkZWZpbmUgSUxfQUdHX1RYX1FVRVVFX01TSwkJY3B1X3RvX2xlMzIoMHhmZmMwMCkKKworI2RlZmluZSBJTF9EUk9QX1NJTkdMRQkJMAorI2RlZmluZSBJTF9EUk9QX1NFTEVDVEVECTEKKyNkZWZpbmUgSUxfRFJPUF9BTEwJCTIKKworLyoKKyAqIFJFUExZX1dFUF9LRVkgPSAweDIwCisgKi8KK3N0cnVjdCBpbF93ZXBfa2V5IHsKKwl1OCBrZXlfaWR4OworCXU4IGtleV9vZmZzZXQ7CisJdTggcmVzZXJ2ZWQxWzJdOworCXU4IGtleV9zaXplOworCXU4IHJlc2VydmVkMlszXTsKKwl1OCBrZXlbMTZdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsX3dlcF9jbWQgeworCXU4IG51bV9rZXlzOworCXU4IGdsb2JhbF9rZXlfdHlwZTsKKwl1OCBmbGFnczsKKwl1OCByZXNlcnZlZDsKKwlzdHJ1Y3QgaWxfd2VwX2tleSBrZXlbMF07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFdFUF9LRVlfV0VQX1RZUEUgMQorI2RlZmluZSBXRVBfS0VZU19NQVggNAorI2RlZmluZSBXRVBfSU5WQUxJRF9PRkZTRVQgMHhmZgorI2RlZmluZSBXRVBfS0VZX0xFTl82NCA1CisjZGVmaW5lIFdFUF9LRVlfTEVOXzEyOCAxMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoNCkKKyAqIFJ4IFJlc3BvbnNlczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUlhfUkVTX1NUQVRVU19OT19DUkMzMl9FUlJPUgljcHVfdG9fbGUzMigxIDw8IDApCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfTk9fUlhFX09WRVJGTE9XCWNwdV90b19sZTMyKDEgPDwgMSkKKworI2RlZmluZSBSWF9SRVNfUEhZX0ZMQUdTX0JBTkRfMjRfTVNLCWNwdV90b19sZTE2KDEgPDwgMCkKKyNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19NT0RfQ0NLX01TSwkJY3B1X3RvX2xlMTYoMSA8PCAxKQorI2RlZmluZSBSWF9SRVNfUEhZX0ZMQUdTX1NIT1JUX1BSRUFNQkxFX01TSwljcHVfdG9fbGUxNigxIDw8IDIpCisjZGVmaW5lIFJYX1JFU19QSFlfRkxBR1NfTkFSUk9XX0JBTkRfTVNLCWNwdV90b19sZTE2KDEgPDwgMykKKyNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX01TSwkJMHhmMAorI2RlZmluZSBSWF9SRVNfUEhZX0ZMQUdTX0FOVEVOTkFfUE9TCQk0CisKKyNkZWZpbmUgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0sJKDB4NyA8PCA4KQorI2RlZmluZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX05PTkUJKDB4MCA8PCA4KQorI2RlZmluZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1dFUAkoMHgxIDw8IDgpCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfQ0NNUAkoMHgyIDw8IDgpCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfVEtJUAkoMHgzIDw8IDgpCisjZGVmaW5lCVJYX1JFU19TVEFUVVNfU0VDX1RZUEVfRVJSCSgweDcgPDwgOCkKKworI2RlZmluZSBSWF9SRVNfU1RBVFVTX1NUQVRJT05fRk9VTkQJKDE8PDYpCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfTk9fU1RBVElPTl9JTkZPX01JU01BVENICSgxPDw3KQorCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfREVDUllQVF9UWVBFX01TSwkoMHgzIDw8IDExKQorI2RlZmluZSBSWF9SRVNfU1RBVFVTX05PVF9ERUNSWVBUCSgweDAgPDwgMTEpCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfREVDUllQVF9PSwkoMHgzIDw8IDExKQorI2RlZmluZSBSWF9SRVNfU1RBVFVTX0JBRF9JQ1ZfTUlDCSgweDEgPDwgMTEpCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfQkFEX0tFWV9UVEFLCSgweDIgPDwgMTEpCisKKyNkZWZpbmUgUlhfTVBEVV9SRVNfU1RBVFVTX0lDVl9PSwkoMHgyMCkKKyNkZWZpbmUgUlhfTVBEVV9SRVNfU1RBVFVTX01JQ19PSwkoMHg0MCkKKyNkZWZpbmUgUlhfTVBEVV9SRVNfU1RBVFVTX1RUQUtfT0sJKDEgPDwgNykKKyNkZWZpbmUgUlhfTVBEVV9SRVNfU1RBVFVTX0RFQ19ET05FX01TSwkoMHg4MDApCisKK3N0cnVjdCBpbDM5NDVfcnhfZnJhbWVfc3RhdHMgeworCXU4IHBoeV9jb3VudDsKKwl1OCBpZDsKKwl1OCByc3NpOworCXU4IGFnYzsKKwlfX2xlMTYgc2lnX2F2ZzsKKwlfX2xlMTYgbm9pc2VfZGlmZjsKKwl1OCBwYXlsb2FkWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9oZHIgeworCV9fbGUxNiBjaGFubmVsOworCV9fbGUxNiBwaHlfZmxhZ3M7CisJdTggcmVzZXJ2ZWQxOworCXU4IHJhdGU7CisJX19sZTE2IGxlbjsKKwl1OCBwYXlsb2FkWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9lbmQgeworCV9fbGUzMiBzdGF0dXM7CisJX19sZTY0IHRpbWVzdGFtcDsKKwlfX2xlMzIgYmVhY29uX3RpbWVzdGFtcDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBOXzM5NDVfUlggPSAweDFiIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQorICoKKyAqIE5PVEU6ICBETyBOT1QgZGVyZWZlcmVuY2UgZnJvbSBjYXN0cyB0byB0aGlzIHN0cnVjdHVyZQorICogSXQgaXMgcHJvdmlkZWQgb25seSBmb3IgY2FsY3VsYXRpbmcgbWluaW11bSBkYXRhIHNldCBzaXplLgorICogVGhlIGFjdHVhbCBvZmZzZXRzIG9mIHRoZSBoZHIgYW5kIGVuZCBhcmUgZHluYW1pYyBiYXNlZCBvbgorICogc3RhdHMucGh5X2NvdW50CisgKi8KK3N0cnVjdCBpbDM5NDVfcnhfZnJhbWUgeworCXN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfc3RhdHMgc3RhdHM7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9oZHIgaGRyOworCXN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfZW5kIGVuZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSUwzOV9SWF9GUkFNRV9TSVpFCSg0ICsgc2l6ZW9mKHN0cnVjdCBpbDM5NDVfcnhfZnJhbWUpKQorCisvKiBGaXhlZCAobm9uLWNvbmZpZ3VyYWJsZSkgcnggZGF0YSBmcm9tIHBoeSAqLworCisjZGVmaW5lIElMNDlfUlhfUkVTX1BIWV9DTlQgMTQKKyNkZWZpbmUgSUw0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfT0ZGU0VUCSg0KQorI2RlZmluZSBJTDQ5X1JYX1BIWV9GTEFHU19BTlRFTk5BRV9NQVNLCSgweDcwKQorI2RlZmluZSBJTDQ5X0FHQ19EQl9NQVNLCQkJKDB4M2Y4MCkJLyogTUFTSyg3LDEzKSAqLworI2RlZmluZSBJTDQ5X0FHQ19EQl9QT1MJCQkoNykKK3N0cnVjdCBpbDQ5NjVfcnhfbm9uX2NmZ19waHkgeworCV9fbGUxNiBhbnRfc2VsZWN0aW9uOwkvKiBhbnQgQSBiaXQgNCwgYW50IEIgYml0IDUsIGFudCBDIGJpdCA2ICovCisJX19sZTE2IGFnY19pbmZvOwkvKiBhZ2MgY29kZSAwOjYsIGFnYyBkQiA3OjEzLCByZXNlcnZlZCAxNDoxNSAqLworCXU4IHJzc2lfaW5mb1s2XTsJLyogd2UgdXNlIGV2ZW4gZW50cmllcywgMC8yLzQgZm9yIEEvQi9DIHJzc2kgKi8KKwl1OCBwYWRbMF07Cit9IF9fcGFja2VkOworCisvKgorICogTl9SWCA9IDB4YzMgKHJlc3BvbnNlIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKiBVc2VkIG9ubHkgZm9yIGxlZ2FjeSAobm9uIDExbikgZnJhbWVzLgorICovCitzdHJ1Y3QgaWxfcnhfcGh5X3JlcyB7CisJdTggbm9uX2NmZ19waHlfY250OwkvKiBub24gY29uZmlndXJhYmxlIERTUCBwaHkgZGF0YSBieXRlIGNvdW50ICovCisJdTggY2ZnX3BoeV9jbnQ7CQkvKiBjb25maWd1cmFibGUgRFNQIHBoeSBkYXRhIGJ5dGUgY291bnQgKi8KKwl1OCBzdGF0X2lkOwkJLyogY29uZmlndXJhYmxlIERTUCBwaHkgZGF0YSBzZXQgSUQgKi8KKwl1OCByZXNlcnZlZDE7CisJX19sZTY0IHRpbWVzdGFtcDsJLyogVFNGIGF0IG9uIGFpciByaXNlICovCisJX19sZTMyIGJlYWNvbl90aW1lX3N0YW1wOwkvKiBiZWFjb24gYXQgb24tYWlyIHJpc2UgKi8KKwlfX2xlMTYgcGh5X2ZsYWdzOwkvKiBnZW5lcmFsIHBoeSBmbGFnczogYmFuZCwgbW9kdWxhdGlvbiwgLi4uICovCisJX19sZTE2IGNoYW5uZWw7CQkvKiBjaGFubmVsIG51bWJlciAqLworCXU4IG5vbl9jZmdfcGh5X2J1ZlszMl07CS8qIGZvciB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyBvZiBub25fY2ZnX3BoeSAqLworCV9fbGUzMiByYXRlX25fZmxhZ3M7CS8qIFJBVEVfTUNTXyogKi8KKwlfX2xlMTYgYnl0ZV9jb3VudDsJLyogZnJhbWUncyBieXRlLWNvdW50ICovCisJX19sZTE2IGZyYW1lX3RpbWU7CS8qIGZyYW1lJ3MgdGltZSBvbiB0aGUgYWlyICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWxfcnhfbXBkdV9yZXNfc3RhcnQgeworCV9fbGUxNiBieXRlX2NvdW50OworCV9fbGUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICg1KQorICogVHggQ29tbWFuZHMgJiBSZXNwb25zZXM6CisgKgorICogRHJpdmVyIG11c3QgcGxhY2UgZWFjaCBDX1RYIGNvbW1hbmQgaW50byBvbmUgb2YgdGhlIHByaW9yaXRpemVkIFR4CisgKiBxdWV1ZXMgaW4gaG9zdCBEUkFNLCBzaGFyZWQgYmV0d2VlbiBkcml2ZXIgYW5kIGRldmljZSAoc2VlIGNvbW1lbnRzIGZvcgorICogU0NEIHJlZ2lzdGVycyBhbmQgVHgvUnggUXVldWVzKS4gIFdoZW4gdGhlIGRldmljZSdzIFR4IHNjaGVkdWxlciBhbmQgdUNvZGUKKyAqIGFyZSBwcmVwYXJpbmcgdG8gdHJhbnNtaXQsIHRoZSBkZXZpY2UgcHVsbHMgdGhlIFR4IGNvbW1hbmQgb3ZlciB0aGUgUENJCisgKiBidXMgdmlhIG9uZSBvZiB0aGUgZGV2aWNlJ3MgVHggRE1BIGNoYW5uZWxzLCB0byBmaWxsIGFuIGludGVybmFsIEZJRk8KKyAqIGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHRyYW5zbWl0dGVkLgorICoKKyAqIHVDb2RlIGhhbmRsZXMgYWxsIHRpbWluZyBhbmQgcHJvdG9jb2wgcmVsYXRlZCB0byBjb250cm9sIGZyYW1lcworICogKFJUUy9DVFMvQUNLKSwgYmFzZWQgb24gZmxhZ3MgaW4gdGhlIFR4IGNvbW1hbmQuICB1Q29kZSBhbmQgVHggc2NoZWR1bGVyCisgKiBoYW5kbGUgcmVjZXB0aW9uIG9mIGJsb2NrLWFja3M7IHVDb2RlIHVwZGF0ZXMgdGhlIGhvc3QgZHJpdmVyIHZpYQorICogTl9DT01QUkVTU0VEX0JBLgorICoKKyAqIHVDb2RlIGhhbmRsZXMgcmV0cnlpbmcgVHggd2hlbiBhbiBBQ0sgaXMgZXhwZWN0ZWQgYnV0IG5vdCByZWNlaXZlZC4KKyAqIFRoaXMgaW5jbHVkZXMgdHJ5aW5nIGxvd2VyIGRhdGEgcmF0ZXMgdGhhbiB0aGUgb25lIHJlcXVlc3RlZCBpbiB0aGUgVHgKKyAqIGNvbW1hbmQsIGFzIHNldCB1cCBieSB0aGUgQ19SQVRFX1NDQUxFIChmb3IgMzk0NSkgb3IKKyAqIENfVFhfTElOS19RVUFMSVRZX0NNRCAoNDk2NSkuCisgKgorICogRHJpdmVyIHNldHMgdXAgdHJhbnNtaXQgcG93ZXIgZm9yIHZhcmlvdXMgcmF0ZXMgdmlhIENfVFhfUFdSX1RCTC4KKyAqIFRoaXMgY29tbWFuZCBtdXN0IGJlIGV4ZWN1dGVkIGFmdGVyIGV2ZXJ5IFJYT04gY29tbWFuZCwgYmVmb3JlIFR4IGNhbiBvY2N1ci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ19UWCBUeCBmbGFncyBmaWVsZCAqLworCisvKgorICogMTogVXNlIFJlcXVlc3QtVG8tU2VuZCBwcm90b2NvbCBiZWZvcmUgdGhpcyBmcmFtZS4KKyAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB2cy4gVFhfQ01EX0ZMR19DVFNfTVNLLgorICovCisjZGVmaW5lIFRYX0NNRF9GTEdfUlRTX01TSyBjcHVfdG9fbGUzMigxIDw8IDEpCisKKy8qCisgKiAxOiBUcmFuc21pdCBDbGVhci1Uby1TZW5kIHRvIHNlbGYgYmVmb3JlIHRoaXMgZnJhbWUuCisgKiBEcml2ZXIgc2hvdWxkIHNldCB0aGlzIGZvciBBVVRIL0RFQVVUSC9BU1NPQy1SRVEvUkVBU1NPQyBtZ21udCBmcmFtZXMuCisgKiBNdXR1YWxseSBleGNsdXNpdmUgdnMuIFRYX0NNRF9GTEdfUlRTX01TSy4KKyAqLworI2RlZmluZSBUWF9DTURfRkxHX0NUU19NU0sgY3B1X3RvX2xlMzIoMSA8PCAyKQorCisvKiAxOiBFeHBlY3QgQUNLIGZyb20gcmVjZWl2aW5nIHN0YXRpb24KKyAqIDA6IERvbid0IGV4cGVjdCBBQ0sgKE1BQyBoZWFkZXIncyBkdXJhdGlvbiBmaWVsZCBzL2IgMCkKKyAqIFNldCB0aGlzIGZvciB1bmljYXN0IGZyYW1lcywgYnV0IG5vdCBicm9hZGNhc3QvbXVsdGljYXN0LiAqLworI2RlZmluZSBUWF9DTURfRkxHX0FDS19NU0sgY3B1X3RvX2xlMzIoMSA8PCAzKQorCisvKiBGb3IgNDk2NSBkZXZpY2VzOgorICogMTogVXNlIHJhdGUgc2NhbGUgdGFibGUgKHNlZSBDX1RYX0xJTktfUVVBTElUWV9DTUQpLgorICogICAgVHggY29tbWFuZCdzIGluaXRpYWxfcmF0ZV9pZHggaW5kaWNhdGVzIGZpcnN0IHJhdGUgdG8gdHJ5OworICogICAgdUNvZGUgd2Fsa3MgdGhyb3VnaCB0YWJsZSBmb3IgYWRkaXRpb25hbCBUeCBhdHRlbXB0cy4KKyAqIDA6IFVzZSBUeCByYXRlL01DUyBmcm9tIFR4IGNvbW1hbmQncyByYXRlX25fZmxhZ3MgZmllbGQuCisgKiAgICBUaGlzIHJhdGUgd2lsbCBiZSB1c2VkIGZvciBhbGwgVHggYXR0ZW1wdHM7IGl0IHdpbGwgbm90IGJlIHNjYWxlZC4gKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19TVEFfUkFURV9NU0sgY3B1X3RvX2xlMzIoMSA8PCA0KQorCisvKiAxOiBFeHBlY3QgaW1tZWRpYXRlIGJsb2NrLWFjay4KKyAqIFNldCB3aGVuIFR4aW5nIGEgYmxvY2stYWNrIHJlcXVlc3QgZnJhbWUuICBBbHNvIHNldCBUWF9DTURfRkxHX0FDS19NU0suICovCisjZGVmaW5lIFRYX0NNRF9GTEdfSU1NX0JBX1JTUF9NQVNLICBjcHVfdG9fbGUzMigxIDw8IDYpCisKKy8qCisgKiAxOiBGcmFtZSByZXF1aXJlcyBmdWxsIFR4LU9wIHByb3RlY3Rpb24uCisgKiBTZXQgdGhpcyBpZiBlaXRoZXIgUlRTIG9yIENUUyBUeCBGbGFnIGdldHMgc2V0LgorICovCisjZGVmaW5lIFRYX0NNRF9GTEdfRlVMTF9UWE9QX1BST1RfTVNLIGNwdV90b19sZTMyKDEgPDwgNykKKworLyogVHggYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQ7IHVzZWQgb25seSBmb3IgMzk0NSwgcmVzZXJ2ZWQgKDApIGZvciA0OTY1IGRldmljZXMuCisgKiBTZXQgZmllbGQgdG8gIjAiIHRvIGFsbG93IDM5NDUgdUNvZGUgdG8gc2VsZWN0IGFudGVubmEgKG5vcm1hbCB1c2FnZSkuICovCisjZGVmaW5lIFRYX0NNRF9GTEdfQU5UX1NFTF9NU0sgY3B1X3RvX2xlMzIoMHhmMDApCisjZGVmaW5lIFRYX0NNRF9GTEdfQU5UX0FfTVNLIGNwdV90b19sZTMyKDEgPDwgOCkKKyNkZWZpbmUgVFhfQ01EX0ZMR19BTlRfQl9NU0sgY3B1X3RvX2xlMzIoMSA8PCA5KQorCisvKiAxOiB1Q29kZSBvdmVycmlkZXMgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpbiBNQUMgaGVhZGVyLgorICogMDogRHJpdmVyIHByb3ZpZGVzIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaW4gTUFDIGhlYWRlci4KKyAqIFNldCB0aGlzIGZvciBtYW5hZ2VtZW50IGZyYW1lcywgbm9uLVFPUyBkYXRhIGZyYW1lcywgbm9uLXVuaWNhc3QgZnJhbWVzLAorICogYW5kIGFsc28gaW4gVHggY29tbWFuZCBlbWJlZGRlZCBpbiBDX1NDQU4gZm9yIGFjdGl2ZSBzY2Fucy4gKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19TRVFfQ1RMX01TSyBjcHVfdG9fbGUzMigxIDw8IDEzKQorCisvKiAxOiBUaGlzIGZyYW1lIGlzIG5vbi1sYXN0IE1QRFU7IG1vcmUgZnJhZ21lbnRzIGFyZSBjb21pbmcuCisgKiAwOiBMYXN0IGZyYWdtZW50LCBvciBub3QgdXNpbmcgZnJhZ21lbnRhdGlvbi4gKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19NT1JFX0ZSQUdfTVNLIGNwdV90b19sZTMyKDEgPDwgMTQpCisKKy8qIDE6IHVDb2RlIGNhbGN1bGF0ZXMgYW5kIGluc2VydHMgVGltZXN0YW1wIEZ1bmN0aW9uIChUU0YpIGluIG91dGdvaW5nIGZyYW1lLgorICogMDogTm8gVFNGIHJlcXVpcmVkIGluIG91dGdvaW5nIGZyYW1lLgorICogU2V0IHRoaXMgZm9yIHRyYW5zbWl0dGluZyBiZWFjb25zIGFuZCBwcm9iZSByZXNwb25zZXMuICovCisjZGVmaW5lIFRYX0NNRF9GTEdfVFNGX01TSyBjcHVfdG9fbGUzMigxIDw8IDE2KQorCisvKiAxOiBEcml2ZXIgaW5zZXJ0ZWQgMiBieXRlcyBwYWQgYWZ0ZXIgdGhlIE1BQyBoZWFkZXIsIGZvciAocmVxdWlyZWQpIGR3b3JkCisgKiAgICBhbGlnbm1lbnQgb2YgZnJhbWUncyBwYXlsb2FkIGRhdGEgZmllbGQuCisgKiAwOiBObyBwYWQKKyAqIFNldCB0aGlzIGZvciBNQUMgaGVhZGVycyB3aXRoIDI2IG9yIDMwIGJ5dGVzLCBpLmUuIHRob3NlIHdpdGggUU9TIG9yIEFERFI0CisgKiBmaWVsZCAoYnV0IG5vdCBib3RoKS4gIERyaXZlciBtdXN0IGFsaWduIGZyYW1lIGRhdGEgKGkuZS4gZGF0YSBmb2xsb3dpbmcKKyAqIE1BQyBoZWFkZXIpIHRvIERXT1JEIGJvdW5kYXJ5LiAqLworI2RlZmluZSBUWF9DTURfRkxHX01IX1BBRF9NU0sgY3B1X3RvX2xlMzIoMSA8PCAyMCkKKworLyogYWNjZWxlcmF0ZSBhZ2dyZWdhdGlvbiBzdXBwb3J0CisgKiAwIC0gbm8gQ0NNUCBlbmNyeXB0aW9uOyAxIC0gQ0NNUCBlbmNyeXB0aW9uICovCisjZGVmaW5lIFRYX0NNRF9GTEdfQUdHX0NDTVBfTVNLIGNwdV90b19sZTMyKDEgPDwgMjIpCisKKy8qIEhDQ0EtQVAgLSBkaXNhYmxlIGR1cmF0aW9uIG92ZXJ3cml0aW5nLiAqLworI2RlZmluZSBUWF9DTURfRkxHX0RVUl9NU0sgY3B1X3RvX2xlMzIoMSA8PCAyNSkKKworLyoKKyAqIFRYIGNvbW1hbmQgc2VjdXJpdHkgY29udHJvbAorICovCisjZGVmaW5lIFRYX0NNRF9TRUNfV0VQCQkweDAxCisjZGVmaW5lIFRYX0NNRF9TRUNfQ0NNCQkweDAyCisjZGVmaW5lIFRYX0NNRF9TRUNfVEtJUAkJMHgwMworI2RlZmluZSBUWF9DTURfU0VDX01TSwkJMHgwMworI2RlZmluZSBUWF9DTURfU0VDX1NISUZUCTYKKyNkZWZpbmUgVFhfQ01EX1NFQ19LRVkxMjgJMHgwOAorCisvKgorICogc2VjdXJpdHkgb3ZlcmhlYWQgc2l6ZXMKKyAqLworI2RlZmluZSBXRVBfSVZfTEVOIDQKKyNkZWZpbmUgV0VQX0lDVl9MRU4gNAorI2RlZmluZSBDQ01QX01JQ19MRU4gOAorI2RlZmluZSBUS0lQX0lDVl9MRU4gNAorCisvKgorICogQ19UWCA9IDB4MWMgKGNvbW1hbmQpCisgKi8KKworc3RydWN0IGlsMzk0NV90eF9jbWQgeworCS8qCisJICogTVBEVSBieXRlIGNvdW50OgorCSAqIE1BQyBoZWFkZXIgKDI0LzI2LzMwLzMyIGJ5dGVzKSArIDIgYnl0ZXMgcGFkIGlmIDI2LzMwIGhlYWRlciBzaXplLAorCSAqICsgOCBieXRlIElWIGZvciBDQ00gb3IgVEtJUCAobm90IHVzZWQgZm9yIFdFUCkKKwkgKiArIERhdGEgcGF5bG9hZAorCSAqICsgOC1ieXRlIE1JQyAobm90IHVzZWQgZm9yIENDTS9XRVApCisJICogTk9URTogIERvZXMgbm90IGluY2x1ZGUgVHggY29tbWFuZCBieXRlcywgcG9zdC1NQUMgcGFkIGJ5dGVzLAorCSAqICAgICAgICBNSUMgKENDTSkgOCBieXRlcywgSUNWIChXRVAvVEtJUC9DS0lQKSA0IGJ5dGVzLCBDUkMgNCBieXRlcy5pCisJICogUmFuZ2U6IDE0LTIzNDIgYnl0ZXMuCisJICovCisJX19sZTE2IGxlbjsKKworCS8qCisJICogTVBEVSBvciBNU0RVIGJ5dGUgY291bnQgZm9yIG5leHQgZnJhbWUuCisJICogVXNlZCBmb3IgZnJhZ21lbnRhdGlvbiBhbmQgYnVyc3RpbmcsIGJ1dCBub3QgMTFuIGFnZ3JlZ2F0aW9uLgorCSAqIFNhbWUgYXMgImxlbiIsIGJ1dCBmb3IgbmV4dCBmcmFtZS4gIFNldCB0byAwIGlmIG5vdCBhcHBsaWNhYmxlLgorCSAqLworCV9fbGUxNiBuZXh0X2ZyYW1lX2xlbjsKKworCV9fbGUzMiB0eF9mbGFnczsJLyogVFhfQ01EX0ZMR18qICovCisKKwl1OCByYXRlOworCisJLyogSW5kZXggb2YgcmVjaXBpZW50IHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlICovCisJdTggc3RhX2lkOworCXU4IHRpZF90c3BlYzsKKwl1OCBzZWNfY3RsOworCXU4IGtleVsxNl07CisJdW5pb24geworCQl1OCBieXRlWzhdOworCQlfX2xlMTYgd29yZFs0XTsKKwkJX19sZTMyIGR3WzJdOworCX0gdGtpcF9taWM7CisJX19sZTMyIG5leHRfZnJhbWVfaW5mbzsKKwl1bmlvbiB7CisJCV9fbGUzMiBsaWZlX3RpbWU7CisJCV9fbGUzMiBhdHRlbXB0OworCX0gc3RvcF90aW1lOworCXU4IHN1cHBfcmF0ZXNbMl07CisJdTggcnRzX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTAgKi8KKwl1OCBkYXRhX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTEgKi8KKwl1bmlvbiB7CisJCV9fbGUxNiBwbV9mcmFtZV90aW1lb3V0OworCQlfX2xlMTYgYXR0ZW1wdF9kdXJhdGlvbjsKKwl9IHRpbWVvdXQ7CisKKwkvKgorCSAqIER1cmF0aW9uIG9mIEVEQ0EgYnVyc3QgVHggT3Bwb3J0dW5pdHksIGluIDMyLXVzZWMgdW5pdHMuCisJICogU2V0IHRoaXMgaWYgdHhvcCB0aW1lIGlzIG5vdCBzcGVjaWZpZWQgYnkgSENDQSBwcm90b2NvbCAoZS5nLiBieSBBUCkuCisJICovCisJX19sZTE2IGRyaXZlcl90eG9wOworCisJLyoKKwkgKiBNQUMgaGVhZGVyIGdvZXMgaGVyZSwgZm9sbG93ZWQgYnkgMiBieXRlcyBwYWRkaW5nIGlmIE1BQyBoZWFkZXIKKwkgKiBsZW5ndGggaXMgMjYgb3IgMzAgYnl0ZXMsIGZvbGxvd2VkIGJ5IHBheWxvYWQgZGF0YQorCSAqLworCXU4IHBheWxvYWRbMF07CisJc3RydWN0IGllZWU4MDIxMV9oZHIgaGRyWzBdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIENfVFggPSAweDFjIChyZXNwb25zZSkKKyAqLworc3RydWN0IGlsMzk0NV90eF9yZXNwIHsKKwl1OCBmYWlsdXJlX3J0czsKKwl1OCBmYWlsdXJlX2ZyYW1lOworCXU4IGJ0X2tpbGxfY291bnQ7CisJdTggcmF0ZTsKKwlfX2xlMzIgd2lyZWxlc3NfbWVkaWFfdGltZTsKKwlfX2xlMzIgc3RhdHVzOwkJLyogVFggc3RhdHVzICovCit9IF9fcGFja2VkOworCisvKgorICogNDk2NSB1Q29kZSB1cGRhdGVzIHRoZXNlIFR4IGF0dGVtcHQgY291bnQgdmFsdWVzIGluIGhvc3QgRFJBTS4KKyAqIFVzZWQgZm9yIG1hbmFnaW5nIFR4IHJldHJpZXMgd2hlbiBleHBlY3RpbmcgYmxvY2stYWNrcy4KKyAqIERyaXZlciBzaG91bGQgc2V0IHRoZXNlIGZpZWxkcyB0byAwLgorICovCitzdHJ1Y3QgaWxfZHJhbV9zY3JhdGNoIHsKKwl1OCB0cnlfY250OwkJLyogVHggYXR0ZW1wdHMgKi8KKwl1OCBidF9raWxsX2NudDsJCS8qIFR4IGF0dGVtcHRzIGJsb2NrZWQgYnkgQmx1ZXRvb3RoIGRldmljZSAqLworCV9fbGUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbF90eF9jbWQgeworCS8qCisJICogTVBEVSBieXRlIGNvdW50OgorCSAqIE1BQyBoZWFkZXIgKDI0LzI2LzMwLzMyIGJ5dGVzKSArIDIgYnl0ZXMgcGFkIGlmIDI2LzMwIGhlYWRlciBzaXplLAorCSAqICsgOCBieXRlIElWIGZvciBDQ00gb3IgVEtJUCAobm90IHVzZWQgZm9yIFdFUCkKKwkgKiArIERhdGEgcGF5bG9hZAorCSAqICsgOC1ieXRlIE1JQyAobm90IHVzZWQgZm9yIENDTS9XRVApCisJICogTk9URTogIERvZXMgbm90IGluY2x1ZGUgVHggY29tbWFuZCBieXRlcywgcG9zdC1NQUMgcGFkIGJ5dGVzLAorCSAqICAgICAgICBNSUMgKENDTSkgOCBieXRlcywgSUNWIChXRVAvVEtJUC9DS0lQKSA0IGJ5dGVzLCBDUkMgNCBieXRlcy5pCisJICogUmFuZ2U6IDE0LTIzNDIgYnl0ZXMuCisJICovCisJX19sZTE2IGxlbjsKKworCS8qCisJICogTVBEVSBvciBNU0RVIGJ5dGUgY291bnQgZm9yIG5leHQgZnJhbWUuCisJICogVXNlZCBmb3IgZnJhZ21lbnRhdGlvbiBhbmQgYnVyc3RpbmcsIGJ1dCBub3QgMTFuIGFnZ3JlZ2F0aW9uLgorCSAqIFNhbWUgYXMgImxlbiIsIGJ1dCBmb3IgbmV4dCBmcmFtZS4gIFNldCB0byAwIGlmIG5vdCBhcHBsaWNhYmxlLgorCSAqLworCV9fbGUxNiBuZXh0X2ZyYW1lX2xlbjsKKworCV9fbGUzMiB0eF9mbGFnczsJLyogVFhfQ01EX0ZMR18qICovCisKKwkvKiB1Q29kZSBtYXkgbW9kaWZ5IHRoaXMgZmllbGQgb2YgdGhlIFR4IGNvbW1hbmQgKGluIGhvc3QgRFJBTSEpLgorCSAqIERyaXZlciBtdXN0IGFsc28gc2V0IGRyYW1fbHNiX3B0ciBhbmQgZHJhbV9tc2JfcHRyIGluIHRoaXMgY21kLiAqLworCXN0cnVjdCBpbF9kcmFtX3NjcmF0Y2ggc2NyYXRjaDsKKworCS8qIFJhdGUgZm9yICphbGwqIFR4IGF0dGVtcHRzLCBpZiBUWF9DTURfRkxHX1NUQV9SQVRFX01TSyBpcyBjbGVhcmVkLiAqLworCV9fbGUzMiByYXRlX25fZmxhZ3M7CS8qIFJBVEVfTUNTXyogKi8KKworCS8qIEluZGV4IG9mIGRlc3RpbmF0aW9uIHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlICovCisJdTggc3RhX2lkOworCisJLyogVHlwZSBvZiBzZWN1cml0eSBlbmNyeXB0aW9uOiAgQ0NNIG9yIFRLSVAgKi8KKwl1OCBzZWNfY3RsOwkJLyogVFhfQ01EX1NFQ18qICovCisKKwkvKgorCSAqIEluZGV4IGludG8gcmF0ZSB0YWJsZSAoc2VlIENfVFhfTElOS19RVUFMSVRZX0NNRCkgZm9yIGluaXRpYWwKKwkgKiBUeCBhdHRlbXB0LCBpZiBUWF9DTURfRkxHX1NUQV9SQVRFX01TSyBpcyBzZXQuICBOb3JtYWxseSAiMCIgZm9yCisJICogZGF0YSBmcmFtZXMsIHRoaXMgZmllbGQgbWF5IGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkgcmVkdWNlIGluaXRpYWwKKwkgKiByYXRlICh2aWEgbm9uLTAgdmFsdWUpIGZvciBzcGVjaWFsIGZyYW1lcyAoZS5nLiBtYW5hZ2VtZW50KSwgd2hpbGUKKwkgKiBzdGlsbCBzdXBwb3J0aW5nIHJhdGUgc2NhbGluZyBmb3IgYWxsIGZyYW1lcy4KKwkgKi8KKwl1OCBpbml0aWFsX3JhdGVfaWR4OworCXU4IHJlc2VydmVkOworCXU4IGtleVsxNl07CisJX19sZTE2IG5leHRfZnJhbWVfZmxhZ3M7CisJX19sZTE2IHJlc2VydmVkMjsKKwl1bmlvbiB7CisJCV9fbGUzMiBsaWZlX3RpbWU7CisJCV9fbGUzMiBhdHRlbXB0OworCX0gc3RvcF90aW1lOworCisJLyogSG9zdCBEUkFNIHBoeXNpY2FsIGFkZHJlc3MgcG9pbnRlciB0byAic2NyYXRjaCIgaW4gdGhpcyBjb21tYW5kLgorCSAqIE11c3QgYmUgZHdvcmQgYWxpZ25lZC4gICIwIiBpbiBkcmFtX2xzYl9wdHIgZGlzYWJsZXMgdXNhZ2UuICovCisJX19sZTMyIGRyYW1fbHNiX3B0cjsKKwl1OCBkcmFtX21zYl9wdHI7CisKKwl1OCBydHNfcmV0cnlfbGltaXQ7CS8qYnl0ZSA1MCAqLworCXU4IGRhdGFfcmV0cnlfbGltaXQ7CS8qYnl0ZSA1MSAqLworCXU4IHRpZF90c3BlYzsKKwl1bmlvbiB7CisJCV9fbGUxNiBwbV9mcmFtZV90aW1lb3V0OworCQlfX2xlMTYgYXR0ZW1wdF9kdXJhdGlvbjsKKwl9IHRpbWVvdXQ7CisKKwkvKgorCSAqIER1cmF0aW9uIG9mIEVEQ0EgYnVyc3QgVHggT3Bwb3J0dW5pdHksIGluIDMyLXVzZWMgdW5pdHMuCisJICogU2V0IHRoaXMgaWYgdHhvcCB0aW1lIGlzIG5vdCBzcGVjaWZpZWQgYnkgSENDQSBwcm90b2NvbCAoZS5nLiBieSBBUCkuCisJICovCisJX19sZTE2IGRyaXZlcl90eG9wOworCisJLyoKKwkgKiBNQUMgaGVhZGVyIGdvZXMgaGVyZSwgZm9sbG93ZWQgYnkgMiBieXRlcyBwYWRkaW5nIGlmIE1BQyBoZWFkZXIKKwkgKiBsZW5ndGggaXMgMjYgb3IgMzAgYnl0ZXMsIGZvbGxvd2VkIGJ5IHBheWxvYWQgZGF0YQorCSAqLworCXU4IHBheWxvYWRbMF07CisJc3RydWN0IGllZWU4MDIxMV9oZHIgaGRyWzBdOworfSBfX3BhY2tlZDsKKworLyogVFggY29tbWFuZCByZXNwb25zZSBpcyBzZW50IGFmdGVyICozOTQ1KiB0cmFuc21pc3Npb24gYXR0ZW1wdHMuCisgKgorICogTk9URVM6CisgKgorICogVFhfU1RBVFVTX0ZBSUxfTkVYVF9GUkFHCisgKgorICogSWYgdGhlIGZyYWdtZW50IGZsYWcgaW4gdGhlIE1BQyBoZWFkZXIgZm9yIHRoZSBmcmFtZSBiZWluZyB0cmFuc21pdHRlZAorICogaXMgc2V0IGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgdGltZSB0byB0cmFuc21pdCB0aGUgbmV4dCBmcmFtZSwgdGhlCisgKiBUWCBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZCB3aXRoICdUWF9TVEFUVVNfRkFJTF9ORVhUX0ZSQUcnLgorICoKKyAqIFRYX1NUQVRVU19GSUZPX1VOREVSUlVOCisgKgorICogSW5kaWNhdGVzIHRoZSBob3N0IGRpZCBub3QgcHJvdmlkZSBieXRlcyB0byB0aGUgRklGTyBmYXN0IGVub3VnaCB3aGlsZQorICogYSBUWCB3YXMgaW4gcHJvZ3Jlc3MuCisgKgorICogVFhfU1RBVFVTX0ZBSUxfTUdNTlRfQUJPUlQKKyAqCisgKiBUaGlzIHN0YXR1cyBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSBBQk9SVCBPTiBNR01UIFJYIHBhcmFtZXRlciB3YXMKKyAqIHNldCB0byB0cnVlIHdpdGggdGhlIFRYIGNvbW1hbmQuCisgKgorICogSWYgdGhlIE1TQiBvZiB0aGUgc3RhdHVzIHBhcmFtZXRlciBpcyBzZXQgdGhlbiBhbiBhYm9ydCBzZXF1ZW5jZSBpcworICogcmVxdWlyZWQuICBUaGlzIHNlcXVlbmNlIGNvbnNpc3RzIG9mIHRoZSBob3N0IGFjdGl2YXRpbmcgdGhlIFRYIEFib3J0CisgKiBjb250cm9sIGxpbmUsIGFuZCB0aGVuIHdhaXRpbmcgZm9yIHRoZSBUWCBBYm9ydCBjb21tYW5kIHJlc3BvbnNlLiAgVGhpcworICogaW5kaWNhdGVzIHRoYXQgYSB0aGUgZGV2aWNlIGlzIG5vIGxvbmdlciBpbiBhIHRyYW5zbWl0IHN0YXRlLCBhbmQgdGhhdCB0aGUKKyAqIGNvbW1hbmQgRklGTyBoYXMgYmVlbiBjbGVhcmVkLiAgVGhlIGhvc3QgbXVzdCB0aGVuIGRlYWN0aXZhdGUgdGhlIFRYIEFib3J0CisgKiBjb250cm9sIGxpbmUuICBSZWNlaXZpbmcgaXMgc3RpbGwgYWxsb3dlZCBpbiB0aGlzIGNhc2UuCisgKi8KK2VudW0geworCVRYXzM5NDVfU1RBVFVTX1NVQ0NFU1MgPSAweDAxLAorCVRYXzM5NDVfU1RBVFVTX0RJUkVDVF9ET05FID0gMHgwMiwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX1NIT1JUX0xJTUlUID0gMHg4MiwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX0xPTkdfTElNSVQgPSAweDgzLAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfRklGT19VTkRFUlJVTiA9IDB4ODQsCisJVFhfMzk0NV9TVEFUVVNfRkFJTF9NR01OVF9BQk9SVCA9IDB4ODUsCisJVFhfMzk0NV9TVEFUVVNfRkFJTF9ORVhUX0ZSQUcgPSAweDg2LAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfTElGRV9FWFBJUkUgPSAweDg3LAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfREVTVF9QUyA9IDB4ODgsCisJVFhfMzk0NV9TVEFUVVNfRkFJTF9BQk9SVEVEID0gMHg4OSwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX0JUX1JFVFJZID0gMHg4YSwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX1NUQV9JTlZBTElEID0gMHg4YiwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX0ZSQUdfRFJPUFBFRCA9IDB4OGMsCisJVFhfMzk0NV9TVEFUVVNfRkFJTF9USURfRElTQUJMRSA9IDB4OGQsCisJVFhfMzk0NV9TVEFUVVNfRkFJTF9GUkFNRV9GTFVTSEVEID0gMHg4ZSwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX0lOU1VGRklDSUVOVF9DRl9QT0xMID0gMHg4ZiwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX1RYX0xPQ0tFRCA9IDB4OTAsCisJVFhfMzk0NV9TVEFUVVNfRkFJTF9OT19CRUFDT05fT05fUkFEQVIgPSAweDkxLAorfTsKKworLyoKKyAqIFRYIGNvbW1hbmQgcmVzcG9uc2UgaXMgc2VudCBhZnRlciAqNDk2NSogdHJhbnNtaXNzaW9uIGF0dGVtcHRzLgorICoKKyAqIGJvdGggcG9zdHBvbmUgYW5kIGFib3J0IHN0YXR1cyBhcmUgZXhwZWN0ZWQgYmVoYXZpb3IgZnJvbSB1Q29kZS4gdGhlcmUgaXMKKyAqIG5vIHNwZWNpYWwgb3BlcmF0aW9uIHJlcXVpcmVkIGZyb20gZHJpdmVyOyBleGNlcHQgZm9yIFJGS0lMTF9GTFVTSCwKKyAqIHdoaWNoIHJlcXVpcmVkIHR4IGZsdXNoIGhvc3QgY29tbWFuZCB0byBmbHVzaCBhbGwgdGhlIHR4IGZyYW1lcyBpbiBxdWV1ZXMKKyAqLworZW51bSB7CisJVFhfU1RBVFVTX1NVQ0NFU1MgPSAweDAxLAorCVRYX1NUQVRVU19ESVJFQ1RfRE9ORSA9IDB4MDIsCisJLyogcG9zdHBvbmUgVFggKi8KKwlUWF9TVEFUVVNfUE9TVFBPTkVfREVMQVkgPSAweDQwLAorCVRYX1NUQVRVU19QT1NUUE9ORV9GRVdfQllURVMgPSAweDQxLAorCVRYX1NUQVRVU19QT1NUUE9ORV9RVUlFVF9QRVJJT0QgPSAweDQzLAorCVRYX1NUQVRVU19QT1NUUE9ORV9DQUxDX1RUQUsgPSAweDQ0LAorCS8qIGFib3J0IFRYICovCisJVFhfU1RBVFVTX0ZBSUxfSU5URVJOQUxfQ1JPU1NFRF9SRVRSWSA9IDB4ODEsCisJVFhfU1RBVFVTX0ZBSUxfU0hPUlRfTElNSVQgPSAweDgyLAorCVRYX1NUQVRVU19GQUlMX0xPTkdfTElNSVQgPSAweDgzLAorCVRYX1NUQVRVU19GQUlMX0ZJRk9fVU5ERVJSVU4gPSAweDg0LAorCVRYX1NUQVRVU19GQUlMX0RSQUlOX0ZMT1cgPSAweDg1LAorCVRYX1NUQVRVU19GQUlMX1JGS0lMTF9GTFVTSCA9IDB4ODYsCisJVFhfU1RBVFVTX0ZBSUxfTElGRV9FWFBJUkUgPSAweDg3LAorCVRYX1NUQVRVU19GQUlMX0RFU1RfUFMgPSAweDg4LAorCVRYX1NUQVRVU19GQUlMX0hPU1RfQUJPUlRFRCA9IDB4ODksCisJVFhfU1RBVFVTX0ZBSUxfQlRfUkVUUlkgPSAweDhhLAorCVRYX1NUQVRVU19GQUlMX1NUQV9JTlZBTElEID0gMHg4YiwKKwlUWF9TVEFUVVNfRkFJTF9GUkFHX0RST1BQRUQgPSAweDhjLAorCVRYX1NUQVRVU19GQUlMX1RJRF9ESVNBQkxFID0gMHg4ZCwKKwlUWF9TVEFUVVNfRkFJTF9GSUZPX0ZMVVNIRUQgPSAweDhlLAorCVRYX1NUQVRVU19GQUlMX0lOU1VGRklDSUVOVF9DRl9QT0xMID0gMHg4ZiwKKwlUWF9TVEFUVVNfRkFJTF9QQVNTSVZFX05PX1JYID0gMHg5MCwKKwlUWF9TVEFUVVNfRkFJTF9OT19CRUFDT05fT05fUkFEQVIgPSAweDkxLAorfTsKKworI2RlZmluZQlUWF9QQUNLRVRfTU9ERV9SRUdVTEFSCQkweDAwMDAKKyNkZWZpbmUJVFhfUEFDS0VUX01PREVfQlVSU1RfU0VRCTB4MDEwMAorI2RlZmluZQlUWF9QQUNLRVRfTU9ERV9CVVJTVF9GSVJTVAkweDAyMDAKKworZW51bSB7CisJVFhfUE9XRVJfUEFfTk9UX0FDVElWRSA9IDB4MCwKK307CisKK2VudW0geworCVRYX1NUQVRVU19NU0sgPSAweDAwMDAwMGZmLAkvKiBiaXRzIDA6NyAqLworCVRYX1NUQVRVU19ERUxBWV9NU0sgPSAweDAwMDAwMDQwLAorCVRYX1NUQVRVU19BQk9SVF9NU0sgPSAweDAwMDAwMDgwLAorCVRYX1BBQ0tFVF9NT0RFX01TSyA9IDB4MDAwMGZmMDAsCS8qIGJpdHMgODoxNSAqLworCVRYX0ZJRk9fTlVNQkVSX01TSyA9IDB4MDAwNzAwMDAsCS8qIGJpdHMgMTY6MTggKi8KKwlUWF9SRVNFUlZFRCA9IDB4MDA3ODAwMDAsCS8qIGJpdHMgMTk6MjIgKi8KKwlUWF9QT1dFUl9QQV9ERVRFQ1RfTVNLID0gMHg3ZjgwMDAwMCwJLyogYml0cyAyMzozMCAqLworCVRYX0FCT1JUX1JFUVVJUkVEX01TSyA9IDB4ODAwMDAwMDAsCS8qIGJpdHMgMzE6MzEgKi8KK307CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRYIGFnZ3JlZ2F0aW9uIHN0YXR1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworZW51bSB7CisJQUdHX1RYX1NUQVRFX1RSQU5TTUlUVEVEID0gMHgwMCwKKwlBR0dfVFhfU1RBVEVfVU5ERVJSVU5fTVNLID0gMHgwMSwKKwlBR0dfVFhfU1RBVEVfRkVXX0JZVEVTX01TSyA9IDB4MDQsCisJQUdHX1RYX1NUQVRFX0FCT1JUX01TSyA9IDB4MDgsCisJQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9UVExfTVNLID0gMHgxMCwKKwlBR0dfVFhfU1RBVEVfTEFTVF9TRU5UX1RSWV9DTlRfTVNLID0gMHgyMCwKKwlBR0dfVFhfU1RBVEVfU0NEX1FVRVJZX01TSyA9IDB4ODAsCisJQUdHX1RYX1NUQVRFX1RFU1RfQkFEX0NSQzMyX01TSyA9IDB4MTAwLAorCUFHR19UWF9TVEFURV9SRVNQT05TRV9NU0sgPSAweDFmZiwKKwlBR0dfVFhfU1RBVEVfRFVNUF9UWF9NU0sgPSAweDIwMCwKKwlBR0dfVFhfU1RBVEVfREVMQVlfVFhfTVNLID0gMHg0MDAKK307CisKKyNkZWZpbmUgQUdHX1RYX1NUQVRVU19NU0sJMHgwMDAwMGZmZgkvKiBiaXRzIDA6MTEgKi8KKyNkZWZpbmUgQUdHX1RYX1RSWV9NU0sJCTB4MDAwMGYwMDAJLyogYml0cyAxMjoxNSAqLworCisjZGVmaW5lIEFHR19UWF9TVEFURV9MQVNUX1NFTlRfTVNLICAoQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9UVExfTVNLIHwgXAorCQkJCSAgICAgQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9UUllfQ05UX01TSykKKworLyogIyB0eCBhdHRlbXB0cyBmb3IgZmlyc3QgZnJhbWUgaW4gYWdncmVnYXRpb24gKi8KKyNkZWZpbmUgQUdHX1RYX1NUQVRFX1RSWV9DTlRfUE9TIDEyCisjZGVmaW5lIEFHR19UWF9TVEFURV9UUllfQ05UX01TSyAweGYwMDAKKworLyogQ29tbWFuZCBJRCBhbmQgc2VxdWVuY2UgbnVtYmVyIG9mIFR4IGNvbW1hbmQgZm9yIHRoaXMgZnJhbWUgKi8KKyNkZWZpbmUgQUdHX1RYX1NUQVRFX1NFUV9OVU1fUE9TIDE2CisjZGVmaW5lIEFHR19UWF9TVEFURV9TRVFfTlVNX01TSyAweGZmZmYwMDAwCisKKy8qCisgKiBDX1RYID0gMHgxYyAocmVzcG9uc2UpCisgKgorICogVGhpcyByZXNwb25zZSBtYXkgYmUgaW4gb25lIG9mIHR3byBzbGlnaHRseSBkaWZmZXJlbnQgZm9ybWF0cywgaW5kaWNhdGVkCisgKiBieSB0aGUgZnJhbWVfY291bnQgZmllbGQ6CisgKgorICogMSkgIE5vIGFnZ3JlZ2F0aW9uIChmcmFtZV9jb3VudCA9PSAxKS4gIFRoaXMgcmVwb3J0cyBUeCByZXN1bHRzIGZvcgorICogICAgIGEgc2luZ2xlIGZyYW1lLiAgTXVsdGlwbGUgYXR0ZW1wdHMsIGF0IHZhcmlvdXMgYml0IHJhdGVzLCBtYXkgaGF2ZQorICogICAgIGJlZW4gbWFkZSBmb3IgdGhpcyBmcmFtZS4KKyAqCisgKiAyKSAgQWdncmVnYXRpb24gKGZyYW1lX2NvdW50ID4gMSkuICBUaGlzIHJlcG9ydHMgVHggcmVzdWx0cyBmb3IKKyAqICAgICAyIG9yIG1vcmUgZnJhbWVzIHRoYXQgdXNlZCBibG9jay1hY2tub3dsZWRnZS4gIEFsbCBmcmFtZXMgd2VyZQorICogICAgIHRyYW5zbWl0dGVkIGF0IHNhbWUgcmF0ZS4gIFJhdGUgc2NhbGluZyBtYXkgaGF2ZSBiZWVuIHVzZWQgaWYgZmlyc3QKKyAqICAgICBmcmFtZSBpbiB0aGlzIG5ldyBhZ2cgYmxvY2sgZmFpbGVkIGluIHByZXZpb3VzIGFnZyBibG9jayhzKS4KKyAqCisgKiAgICAgTm90ZSB0aGF0LCBmb3IgYWdncmVnYXRpb24sIEFDSyAoYmxvY2stYWNrKSBzdGF0dXMgaXMgbm90IGRlbGl2ZXJlZCBoZXJlOworICogICAgIGJsb2NrLWFjayBoYXMgbm90IGJlZW4gcmVjZWl2ZWQgYnkgdGhlIHRpbWUgdGhlIDQ5NjUgZGV2aWNlIHJlY29yZHMKKyAqICAgICB0aGlzIHN0YXR1cy4KKyAqICAgICBUaGlzIHN0YXR1cyByZWxhdGVzIHRvIHJlYXNvbnMgdGhlIHR4IG1pZ2h0IGhhdmUgYmVlbiBibG9ja2VkIG9yIGFib3J0ZWQKKyAqICAgICB3aXRoaW4gdGhlIHNlbmRpbmcgc3RhdGlvbiAodGhpcyA0OTY1IGRldmljZSksIHJhdGhlciB0aGFuIHdoZXRoZXIgaXQgd2FzCisgKiAgICAgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5IGJ5IHRoZSBkZXN0aW5hdGlvbiBzdGF0aW9uLgorICovCitzdHJ1Y3QgYWdnX3R4X3N0YXR1cyB7CisJX19sZTE2IHN0YXR1czsKKwlfX2xlMTYgc2VxdWVuY2U7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWw0OTY1X3R4X3Jlc3AgeworCXU4IGZyYW1lX2NvdW50OwkJLyogMSBubyBhZ2dyZWdhdGlvbiwgPjEgYWdncmVnYXRpb24gKi8KKwl1OCBidF9raWxsX2NvdW50OwkvKiAjIGJsb2NrZWQgYnkgYmx1ZXRvb3RoICh1bnVzZWQgZm9yIGFnZykgKi8KKwl1OCBmYWlsdXJlX3J0czsJCS8qICMgZmFpbHVyZXMgZHVlIHRvIHVuc3VjY2Vzc2Z1bCBSVFMgKi8KKwl1OCBmYWlsdXJlX2ZyYW1lOwkvKiAjIGZhaWx1cmVzIGR1ZSB0byBubyBBQ0sgKHVudXNlZCBmb3IgYWdnKSAqLworCisJLyogRm9yIG5vbi1hZ2c6ICBSYXRlIGF0IHdoaWNoIGZyYW1lIHdhcyBzdWNjZXNzZnVsLgorCSAqIEZvciBhZ2c6ICBSYXRlIGF0IHdoaWNoIGFsbCBmcmFtZXMgd2VyZSB0cmFuc21pdHRlZC4gKi8KKwlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwkvKiBSQVRFX01DU18qICAqLworCisJLyogRm9yIG5vbi1hZ2c6ICBSVFMgKyBDVFMgKyBmcmFtZSB0eCBhdHRlbXB0cyB0aW1lICsgQUNLLgorCSAqIEZvciBhZ2c6ICBSVFMgKyBDVFMgKyBhZ2dyZWdhdGlvbiB0eCB0aW1lICsgYmxvY2stYWNrIHRpbWUuICovCisJX19sZTE2IHdpcmVsZXNzX21lZGlhX3RpbWU7CS8qIHVTZWNzICovCisKKwlfX2xlMTYgcmVzZXJ2ZWQ7CisJX19sZTMyIHBhX3Bvd2VyMTsJLyogUkYgcG93ZXIgYW1wbGlmaWVyIG1lYXN1cmVtZW50IChub3QgdXNlZCkgKi8KKwlfX2xlMzIgcGFfcG93ZXIyOworCisJLyoKKwkgKiBGb3Igbm9uLWFnZzogIGZyYW1lIHN0YXR1cyBUWF9TVEFUVVNfKgorCSAqIEZvciBhZ2c6ICBzdGF0dXMgb2YgMXN0IGZyYW1lLCBBR0dfVFhfU1RBVEVfKjsgb3RoZXIgZnJhbWUgc3RhdHVzCisJICogICAgICAgICAgIGZpZWxkcyBmb2xsb3cgdGhpcyBvbmUsIHVwIHRvIGZyYW1lX2NvdW50LgorCSAqICAgICAgICAgICBCaXQgZmllbGRzOgorCSAqICAgICAgICAgICAxMS0gMDogIEFHR19UWF9TVEFURV8qIHN0YXR1cyBjb2RlCisJICogICAgICAgICAgIDE1LTEyOiAgUmV0cnkgY291bnQgZm9yIDFzdCBmcmFtZSBpbiBhZ2dyZWdhdGlvbiAocmV0cmllcworCSAqICAgICAgICAgICAgICAgICAgIG9jY3VyIGlmIHR4IGZhaWxlZCBmb3IgdGhpcyBmcmFtZSB3aGVuIGl0IHdhcyBhCisJICogICAgICAgICAgICAgICAgICAgbWVtYmVyIG9mIGEgcHJldmlvdXMgYWdncmVnYXRpb24gYmxvY2spLiAgSWYgcmF0ZQorCSAqICAgICAgICAgICAgICAgICAgIHNjYWxpbmcgaXMgdXNlZCwgcmV0cnkgY291bnQgaW5kaWNhdGVzIHRoZSByYXRlCisJICogICAgICAgICAgICAgICAgICAgdGFibGUgZW50cnkgdXNlZCBmb3IgYWxsIGZyYW1lcyBpbiB0aGUgbmV3IGFnZy4KKwkgKiAgICAgICAgICAgMzEtMTY6ICBTZXF1ZW5jZSAjIGZvciB0aGlzIGZyYW1lJ3MgVHggY21kIChub3QgU1NOISkKKwkgKi8KKwl1bmlvbiB7CisJCV9fbGUzMiBzdGF0dXM7CisJCXN0cnVjdCBhZ2dfdHhfc3RhdHVzIGFnZ19zdGF0dXNbMF07CS8qIGZvciBlYWNoIGFnZyBmcmFtZSAqLworCX0gdTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBOX0NPTVBSRVNTRURfQkEgPSAweGM1IChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQorICoKKyAqIFJlcG9ydHMgQmxvY2stQWNrbm93bGVkZ2UgZnJvbSByZWNpcGllbnQgc3RhdGlvbgorICovCitzdHJ1Y3QgaWxfY29tcHJlc3NlZF9iYV9yZXNwIHsKKwlfX2xlMzIgc3RhX2FkZHJfbG8zMjsKKwlfX2xlMTYgc3RhX2FkZHJfaGkxNjsKKwlfX2xlMTYgcmVzZXJ2ZWQ7CisKKwkvKiBJbmRleCBvZiByZWNpcGllbnQgKEJBLXNlbmRpbmcpIHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlICovCisJdTggc3RhX2lkOworCXU4IHRpZDsKKwlfX2xlMTYgc2VxX2N0bDsKKwlfX2xlNjQgYml0bWFwOworCV9fbGUxNiBzY2RfZmxvdzsKKwlfX2xlMTYgc2NkX3NzbjsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBDX1RYX1BXUl9UQkwgPSAweDk3IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKgorICogU2VlIGRldGFpbHMgdW5kZXIgIlRYUE9XRVIiIGluIDQ5NjUuaC4KKyAqLworCitzdHJ1Y3QgaWwzOTQ1X3R4cG93ZXJ0YWJsZV9jbWQgeworCXU4IGJhbmQ7CQkvKiAwOiA1IEdIeiwgMTogMi40IEdIeiAqLworCXU4IHJlc2VydmVkOworCV9fbGUxNiBjaGFubmVsOworCXN0cnVjdCBpbDM5NDVfcG93ZXJfcGVyX3JhdGUgcG93ZXJbSUxfTUFYX1JBVEVTXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbDQ5NjVfdHhwb3dlcnRhYmxlX2NtZCB7CisJdTggYmFuZDsJCS8qIDA6IDUgR0h6LCAxOiAyLjQgR0h6ICovCisJdTggcmVzZXJ2ZWQ7CisJX19sZTE2IGNoYW5uZWw7CisJc3RydWN0IGlsNDk2NV90eF9wb3dlcl9kYiB0eF9wb3dlcjsKK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IGlsMzk0NV9yYXRlX3NjYWxpbmdfY21kIC0gUmF0ZSBTY2FsaW5nIENvbW1hbmQgJiBSZXNwb25zZQorICoKKyAqIENfUkFURV9TQ0FMRSA9IDB4NDcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqCisgKiBOT1RFOiBUaGUgdGFibGUgb2YgcmF0ZXMgcGFzc2VkIHRvIHRoZSB1Q29kZSB2aWEgdGhlCisgKiBSQVRFX1NDQUxFIGNvbW1hbmQgc2V0cyB1cCB0aGUgY29ycmVzcG9uZGluZyBvcmRlciBvZgorICogcmF0ZXMgdXNlZCBmb3IgYWxsIHJlbGF0ZWQgY29tbWFuZHMsIGluY2x1ZGluZyByYXRlCisgKiBtYXNrcywgZXRjLgorICoKKyAqIEZvciBleGFtcGxlLCBpZiB5b3Ugc2V0IDlNQiAoUExDUCAweDBmKSBhcyB0aGUgZmlyc3QKKyAqIHJhdGUgaW4gdGhlIHJhdGUgdGFibGUsIHRoZSBiaXQgbWFzayBmb3IgdGhhdCByYXRlCisgKiB3aGVuIHBhc3NlZCB0aHJvdWdoIG9mZG1fYmFzaWNfcmF0ZXMgb24gdGhlIENfUlhPTgorICogY29tbWFuZCB3b3VsZCBiZSBiaXQgMCAoMSA8PCAwKQorICovCitzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGluZ19pbmZvIHsKKwlfX2xlMTYgcmF0ZV9uX2ZsYWdzOworCXU4IHRyeV9jbnQ7CisJdTggbmV4dF9yYXRlX2lkeDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsaW5nX2NtZCB7CisJdTggdGFibGVfaWQ7CisJdTggcmVzZXJ2ZWRbM107CisJc3RydWN0IGlsMzk0NV9yYXRlX3NjYWxpbmdfaW5mbyB0YWJsZVtJTF9NQVhfUkFURVNdOworfSBfX3BhY2tlZDsKKworLypSU19ORVdfQVBJOiBvbmx5IFRMQ19SVFMgcmVtYWlucyBhbmQgbW92ZWQgdG8gYml0IDAgKi8KKyNkZWZpbmUgIExJTktfUVVBTF9GTEFHU19TRVRfU1RBX1RMQ19SVFNfTVNLCSgxIDw8IDApCisKKy8qICMgb2YgRURDQSBwcmlvcml0aXplZCB0eCBmaWZvcyAqLworI2RlZmluZSAgTElOS19RVUFMX0FDX05VTSBBQ19OVU0KKworLyogIyBlbnRyaWVzIGluIHJhdGUgc2NhbGUgdGFibGUgdG8gc3VwcG9ydCBUeCByZXRyaWVzICovCisjZGVmaW5lICBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSAxNgorCisvKiBUeCBhbnRlbm5hIHNlbGVjdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgIExJTktfUVVBTF9BTlRfQV9NU0sgKDEgPDwgMCkKKyNkZWZpbmUgIExJTktfUVVBTF9BTlRfQl9NU0sgKDEgPDwgMSkKKyNkZWZpbmUgIExJTktfUVVBTF9BTlRfTVNLICAgKExJTktfUVVBTF9BTlRfQV9NU0t8TElOS19RVUFMX0FOVF9CX01TSykKKworLyoqCisgKiBzdHJ1Y3QgaWxfbGlua19xdWFsX2dlbmVyYWxfcGFyYW1zCisgKgorICogVXNlZCBpbiBDX1RYX0xJTktfUVVBTElUWV9DTUQKKyAqLworc3RydWN0IGlsX2xpbmtfcXVhbF9nZW5lcmFsX3BhcmFtcyB7CisJdTggZmxhZ3M7CisKKwkvKiBObyBlbnRyaWVzIGF0IG9yIGFib3ZlIHRoaXMgKGRyaXZlciBjaG9zZW4pIGlkeCBjb250YWluIE1JTU8gKi8KKwl1OCBtaW1vX2RlbGltaXRlcjsKKworCS8qIEJlc3Qgc2luZ2xlIGFudGVubmEgdG8gdXNlIGZvciBzaW5nbGUgc3RyZWFtIChsZWdhY3ksIFNJU08pLiAqLworCXU4IHNpbmdsZV9zdHJlYW1fYW50X21zazsJLyogTElOS19RVUFMX0FOVF8qICovCisKKwkvKiBCZXN0IGFudGVubmFzIHRvIHVzZSBmb3IgTUlNTyAodW51c2VkIGZvciA0OTY1LCBhc3N1bWVzIGJvdGgpLiAqLworCXU4IGR1YWxfc3RyZWFtX2FudF9tc2s7CS8qIExJTktfUVVBTF9BTlRfKiAqLworCisJLyoKKwkgKiBJZiBkcml2ZXIgbmVlZHMgdG8gdXNlIGRpZmZlcmVudCBpbml0aWFsIHJhdGVzIGZvciBkaWZmZXJlbnQKKwkgKiBFRENBIFFPUyBhY2Nlc3MgY2F0ZWdvcmllcyAoYXMgaW1wbGVtZW50ZWQgYnkgdHggZmlmb3MgMC0zKSwKKwkgKiB0aGlzIHRhYmxlIHdpbGwgc2V0IHRoYXQgdXAsIGJ5IGluZGljYXRpbmcgdGhlIGlkeGVzIGluIHRoZQorCSAqIHJzX3RhYmxlW0xJTktfUVVBTF9NQVhfUkVUUllfTlVNXSByYXRlIHRhYmxlIGF0IHdoaWNoIHRvIHN0YXJ0LgorCSAqIE90aGVyd2lzZSwgZHJpdmVyIHNob3VsZCBzZXQgYWxsIGVudHJpZXMgdG8gMC4KKwkgKgorCSAqIEVudHJ5IHVzYWdlOgorCSAqIDAgPSBCYWNrZ3JvdW5kLCAxID0gQmVzdCBFZmZvcnQgKG5vcm1hbCksIDIgPSBWaWRlbywgMyA9IFZvaWNlCisJICogVFggRklGT3MgYWJvdmUgMyB1c2Ugc2FtZSB2YWx1ZSAodHlwaWNhbGx5IDApIGFzIFRYIEZJRk8gMy4KKwkgKi8KKwl1OCBzdGFydF9yYXRlX2lkeFtMSU5LX1FVQUxfQUNfTlVNXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX0RFRgkoNDAwMCkJLyogNCBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX01BWAkoODAwMCkKKyNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX01JTgkoMTAwKQorCisjZGVmaW5lIExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUYJKDMpCisjZGVmaW5lIExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9NQVgJKDI1NSkKKyNkZWZpbmUgTElOS19RVUFMX0FHR19ESVNBQkxFX1NUQVJUX01JTgkoMCkKKworI2RlZmluZSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRgkoMzEpCisjZGVmaW5lIExJTktfUVVBTF9BR0dfRlJBTUVfTElNSVRfTUFYCSg2MykKKyNkZWZpbmUgTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9NSU4JKDApCisKKy8qKgorICogc3RydWN0IGlsX2xpbmtfcXVhbF9hZ2dfcGFyYW1zCisgKgorICogVXNlZCBpbiBDX1RYX0xJTktfUVVBTElUWV9DTUQKKyAqLworc3RydWN0IGlsX2xpbmtfcXVhbF9hZ2dfcGFyYW1zIHsKKworCS8qCisJICpNYXhpbXVtIG51bWJlciBvZiB1U2VjIGluIGFnZ3JlZ2F0aW9uLgorCSAqIGRlZmF1bHQgc2V0IHRvIDQwMDAgKDQgbWlsbGlzZWNvbmRzKSBpZiBub3QgY29uZmlndXJlZCBpbiAuY2ZnCisJICovCisJX19sZTE2IGFnZ190aW1lX2xpbWl0OworCisJLyoKKwkgKiBOdW1iZXIgb2YgVHggcmV0cmllcyBhbGxvd2VkIGZvciBhIGZyYW1lLCBiZWZvcmUgdGhhdCBmcmFtZSB3aWxsCisJICogbm8gbG9uZ2VyIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBzdGFydCBvZiBhbiBhZ2dyZWdhdGlvbiBzZXF1ZW5jZQorCSAqIChzY2hlZHVsZXIgd2lsbCB0aGVuIHRyeSB0byB0eCBpdCBhcyBzaW5nbGUgZnJhbWUpLgorCSAqIERyaXZlciBzaG91bGQgc2V0IHRoaXMgdG8gMy4KKwkgKi8KKwl1OCBhZ2dfZGlzX3N0YXJ0X3RoOworCisJLyoKKwkgKiBNYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgaW4gYWdncmVnYXRpb24uCisJICogMCA9IG5vIGxpbWl0IChkZWZhdWx0KS4gIDEgPSBubyBhZ2dyZWdhdGlvbi4KKwkgKiBPdGhlciB2YWx1ZXMgPSBtYXggIyBmcmFtZXMgaW4gYWdncmVnYXRpb24uCisJICovCisJdTggYWdnX2ZyYW1lX2NudF9saW1pdDsKKworCV9fbGUzMiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBDX1RYX0xJTktfUVVBTElUWV9DTUQgPSAweDRlIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKgorICogRm9yIDQ5NjUgZGV2aWNlcyBvbmx5OyAzOTQ1IHVzZXMgQ19SQVRFX1NDQUxFLgorICoKKyAqIEVhY2ggc3RhdGlvbiBpbiB0aGUgNDk2NSBkZXZpY2UncyBpbnRlcm5hbCBzdGF0aW9uIHRhYmxlIGhhcyBpdHMgb3duIHRhYmxlCisgKiBvZiAxNgorICogVHggcmF0ZXMgYW5kIG1vZHVsYXRpb24gbW9kZXMgKGUuZy4gbGVnYWN5L1NJU08vTUlNTykgZm9yIHJldHJ5aW5nIFR4IHdoZW4KKyAqIGFuIEFDSyBpcyBub3QgcmVjZWl2ZWQuICBUaGlzIGNvbW1hbmQgcmVwbGFjZXMgdGhlIGVudGlyZSB0YWJsZSBmb3IKKyAqIG9uZSBzdGF0aW9uLgorICoKKyAqIE5PVEU6ICBTdGF0aW9uIG11c3QgYWxyZWFkeSBiZSBpbiA0OTY1IGRldmljZSdzIHN0YXRpb24gdGFibGUuCisgKgkgIFVzZSBDX0FERF9TVEEuCisgKgorICogVGhlIHJhdGUgc2NhbGluZyBwcm9jZWR1cmVzIGRlc2NyaWJlZCBiZWxvdyB3b3JrIHdlbGwuICBPZiBjb3Vyc2UsIG90aGVyCisgKiBwcm9jZWR1cmVzIGFyZSBwb3NzaWJsZSwgYW5kIG1heSB3b3JrIGJldHRlciBmb3IgcGFydGljdWxhciBlbnZpcm9ubWVudHMuCisgKgorICoKKyAqIEZJTExJTkcgVEhFIFJBVEUgVEJMCisgKgorICogR2l2ZW4gYSBwYXJ0aWN1bGFyIGluaXRpYWwgcmF0ZSBhbmQgbW9kZSwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgcmF0ZQorICogc2NhbGluZyBhbGdvcml0aG0gZGVzY3JpYmVkIGJlbG93LCB0aGUgTGludXggZHJpdmVyIHVzZXMgdGhlIGZvbGxvd2luZworICogZm9ybXVsYSB0byBmaWxsIHRoZSByc190YWJsZVtMSU5LX1FVQUxfTUFYX1JFVFJZX05VTV0gcmF0ZSB0YWJsZSBpbiB0aGUKKyAqIExpbmsgUXVhbGl0eSBjb21tYW5kOgorICoKKyAqCisgKiAxKSAgSWYgdXNpbmcgSGlnaC10aHJvdWdocHV0IChIVCkgKFNJU08gb3IgTUlNTykgaW5pdGlhbCByYXRlOgorICogICAgIGEpIFVzZSB0aGlzIHNhbWUgaW5pdGlhbCByYXRlIGZvciBmaXJzdCAzIGVudHJpZXMuCisgKiAgICAgYikgRmluZCBuZXh0IGxvd2VyIGF2YWlsYWJsZSByYXRlIHVzaW5nIHNhbWUgbW9kZSAoU0lTTyBvciBNSU1PKSwKKyAqICAgICAgICB1c2UgZm9yIG5leHQgMyBlbnRyaWVzLiAgSWYgbm8gbG93ZXIgcmF0ZSBhdmFpbGFibGUsIHN3aXRjaCB0bworICogICAgICAgIGxlZ2FjeSBtb2RlIChubyBIVDQwIGNoYW5uZWwsIG5vIE1JTU8sIG5vIHNob3J0IGd1YXJkIGludGVydmFsKS4KKyAqICAgICBjKSBJZiB1c2luZyBNSU1PLCBzZXQgY29tbWFuZCdzIG1pbW9fZGVsaW1pdGVyIHRvIG51bWJlciBvZiBlbnRyaWVzCisgKiAgICAgICAgdXNpbmcgTUlNTyAoMyBvciA2KS4KKyAqICAgICBkKSBBZnRlciB0cnlpbmcgMiBIVCByYXRlcywgc3dpdGNoIHRvIGxlZ2FjeSBtb2RlIChubyBIVDQwIGNoYW5uZWwsCisgKiAgICAgICAgbm8gTUlNTywgbm8gc2hvcnQgZ3VhcmQgaW50ZXJ2YWwpLCBhdCB0aGUgbmV4dCBsb3dlciBiaXQgcmF0ZQorICogICAgICAgIChlLmcuIGlmIHNlY29uZCBIVCBiaXQgcmF0ZSB3YXMgNTQsIHRyeSA0OCBsZWdhY3kpLCBhbmQgZm9sbG93CisgKiAgICAgICAgbGVnYWN5IHByb2NlZHVyZSBmb3IgcmVtYWluaW5nIHRhYmxlIGVudHJpZXMuCisgKgorICogMikgIElmIHVzaW5nIGxlZ2FjeSBpbml0aWFsIHJhdGU6CisgKiAgICAgYSkgVXNlIHRoZSBpbml0aWFsIHJhdGUgZm9yIG9ubHkgb25lIGVudHJ5LgorICogICAgIGIpIEZvciBlYWNoIGZvbGxvd2luZyBlbnRyeSwgcmVkdWNlIHRoZSByYXRlIHRvIG5leHQgbG93ZXIgYXZhaWxhYmxlCisgKiAgICAgICAgcmF0ZSwgdW50aWwgcmVhY2hpbmcgdGhlIGxvd2VzdCBhdmFpbGFibGUgcmF0ZS4KKyAqICAgICBjKSBXaGVuIHJlZHVjaW5nIHJhdGUsIGFsc28gc3dpdGNoIGFudGVubmEgc2VsZWN0aW9uLgorICogICAgIGQpIE9uY2UgbG93ZXN0IGF2YWlsYWJsZSByYXRlIGlzIHJlYWNoZWQsIHJlcGVhdCB0aGlzIHJhdGUgdW50aWwKKyAqICAgICAgICByYXRlIHRhYmxlIGlzIGZpbGxlZCAoMTYgZW50cmllcyksIHN3aXRjaGluZyBhbnRlbm5hIGVhY2ggZW50cnkuCisgKgorICoKKyAqIEFDQ1VNVUxBVElORyBISVNUT1JZCisgKgorICogVGhlIHJhdGUgc2NhbGluZyBhbGdvcml0aG0gZm9yIDQ5NjUgZGV2aWNlcywgYXMgaW1wbGVtZW50ZWQgaW4gTGludXggZHJpdmVyLAorICogdXNlcyB0d28gc2V0cyBvZiBmcmFtZSBUeCBzdWNjZXNzIGhpc3Rvcnk6ICBPbmUgZm9yIHRoZSBjdXJyZW50L2FjdGl2ZQorICogbW9kdWxhdGlvbiBtb2RlLCBhbmQgb25lIGZvciBhIHNwZWN1bGF0aXZlL3NlYXJjaCBtb2RlIHRoYXQgaXMgYmVpbmcKKyAqIGF0dGVtcHRlZC4gSWYgdGhlIHNwZWN1bGF0aXZlIG1vZGUgdHVybnMgb3V0IHRvIGJlIG1vcmUgZWZmZWN0aXZlIChpLmUuCisgKiBhY3R1YWwgdHJhbnNmZXIgcmF0ZSBpcyBiZXR0ZXIpLCB0aGVuIHRoZSBkcml2ZXIgY29udGludWVzIHRvIHVzZSB0aGUKKyAqIHNwZWN1bGF0aXZlIG1vZGUgYXMgdGhlIG5ldyBjdXJyZW50IGFjdGl2ZSBtb2RlLgorICoKKyAqIEVhY2ggaGlzdG9yeSBzZXQgY29udGFpbnMsIHNlcGFyYXRlbHkgZm9yIGVhY2ggcG9zc2libGUgcmF0ZSwgZGF0YSBmb3IgYQorICogc2xpZGluZyB3aW4gb2YgdGhlIDYyIG1vc3QgcmVjZW50IHR4IGF0dGVtcHRzIGF0IHRoYXQgcmF0ZS4gIFRoZSBkYXRhCisgKiBpbmNsdWRlcyBhIHNoaWZ0aW5nIGJpdG1hcCBvZiBzdWNjZXNzKDEpL2ZhaWx1cmUoMCksIGFuZCBzdW1zIG9mIHN1Y2Nlc3NmdWwKKyAqIGFuZCBhdHRlbXB0ZWQgZnJhbWVzLCBmcm9tIHdoaWNoIHRoZSBkcml2ZXIgY2FuIGFkZGl0aW9uYWxseSBjYWxjdWxhdGUgYQorICogc3VjY2VzcyByYXRpbyAoc3VjY2VzcyAvIGF0dGVtcHRlZCkgYW5kIG51bWJlciBvZiBmYWlsdXJlcworICogKGF0dGVtcHRlZCAtIHN1Y2Nlc3MpLCBhbmQgY29udHJvbCB0aGUgc2l6ZSBvZiB0aGUgd2luIChhdHRlbXB0ZWQpLgorICogVGhlIGRyaXZlciB1c2VzIHRoZSBiaXQgbWFwIHRvIHJlbW92ZSBzdWNjZXNzZXMgZnJvbSB0aGUgc3VjY2VzcyBzdW0sIGFzCisgKiB0aGUgb2xkZXN0IHR4IGF0dGVtcHRzIGZhbGwgb3V0IG9mIHRoZSB3aW4uCisgKgorICogV2hlbiB0aGUgNDk2NSBkZXZpY2UgbWFrZXMgbXVsdGlwbGUgdHggYXR0ZW1wdHMgZm9yIGEgZ2l2ZW4gZnJhbWUsIGVhY2gKKyAqIGF0dGVtcHQgbWlnaHQgYmUgYXQgYSBkaWZmZXJlbnQgcmF0ZSwgYW5kIGhhdmUgZGlmZmVyZW50IG1vZHVsYXRpb24KKyAqIGNoYXJhY3RlcmlzdGljcyAoZS5nLiBhbnRlbm5hLCBmYXQgY2hhbm5lbCwgc2hvcnQgZ3VhcmQgaW50ZXJ2YWwpLCBhcyBzZXQKKyAqIHVwIGluIHRoZSByYXRlIHNjYWxpbmcgdGFibGUgaW4gdGhlIExpbmsgUXVhbGl0eSBjb21tYW5kLiAgVGhlIGRyaXZlciBtdXN0CisgKiBkZXRlcm1pbmUgd2hpY2ggcmF0ZSB0YWJsZSBlbnRyeSB3YXMgdXNlZCBmb3IgZWFjaCB0eCBhdHRlbXB0LCB0byBkZXRlcm1pbmUKKyAqIHdoaWNoIHJhdGUtc3BlY2lmaWMgaGlzdG9yeSB0byB1cGRhdGUsIGFuZCByZWNvcmQgb25seSB0aG9zZSBhdHRlbXB0cyB0aGF0CisgKiBtYXRjaCB0aGUgbW9kdWxhdGlvbiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGhpc3Rvcnkgc2V0LgorICoKKyAqIFdoZW4gdXNpbmcgYmxvY2stYWNrIChhZ2dyZWdhdGlvbiksIGFsbCBmcmFtZXMgYXJlIHRyYW5zbWl0dGVkIGF0IHRoZSBzYW1lCisgKiByYXRlLCBzaW5jZSB0aGVyZSBpcyBubyBwZXItYXR0ZW1wdCBhY2tub3dsZWRnbWVudCBmcm9tIHRoZSBkZXN0aW5hdGlvbgorICogc3RhdGlvbi4gIFRoZSBUeCByZXNwb25zZSBzdHJ1Y3QgaWxfdHhfcmVzcCBpbmRpY2F0ZXMgdGhlIFR4IHJhdGUgaW4KKyAqIHJhdGVfbl9mbGFncyBmaWVsZC4gIEFmdGVyIHJlY2VpdmluZyBhIGJsb2NrLWFjaywgdGhlIGRyaXZlciBjYW4gdXBkYXRlCisgKiBoaXN0b3J5IGZvciB0aGUgZW50aXJlIGJsb2NrIGFsbCBhdCBvbmNlLgorICoKKyAqCisgKiBGSU5ESU5HIEJFU1QgU1RBUlRJTkcgUkFURToKKyAqCisgKiBXaGVuIHdvcmtpbmcgd2l0aCBhIHNlbGVjdGVkIGluaXRpYWwgbW9kdWxhdGlvbiBtb2RlIChzZWUgYmVsb3cpLCB0aGUKKyAqIGRyaXZlciBhdHRlbXB0cyB0byBmaW5kIGEgYmVzdCBpbml0aWFsIHJhdGUuICBUaGUgaW5pdGlhbCByYXRlIGlzIHRoZQorICogZmlyc3QgZW50cnkgaW4gdGhlIExpbmsgUXVhbGl0eSBjb21tYW5kJ3MgcmF0ZSB0YWJsZS4KKyAqCisgKiAxKSAgQ2FsY3VsYXRlIGFjdHVhbCB0aHJvdWdocHV0IChzdWNjZXNzIHJhdGlvICogZXhwZWN0ZWQgdGhyb3VnaHB1dCwgc2VlCisgKiAgICAgdGFibGUgYmVsb3cpIGZvciBjdXJyZW50IGluaXRpYWwgcmF0ZS4gIERvIHRoaXMgb25seSBpZiBlbm91Z2ggZnJhbWVzCisgKiAgICAgaGF2ZSBiZWVuIGF0dGVtcHRlZCB0byBtYWtlIHRoZSB2YWx1ZSBtZWFuaW5nZnVsOiAgYXQgbGVhc3QgNiBmYWlsZWQKKyAqICAgICB0eCBhdHRlbXB0cywgb3IgYXQgbGVhc3QgOCBzdWNjZXNzZXMuICBJZiBub3QgZW5vdWdoLCBkb24ndCB0cnkgcmF0ZQorICogICAgIHNjYWxpbmcgeWV0LgorICoKKyAqIDIpICBGaW5kIGF2YWlsYWJsZSByYXRlcyBhZGphY2VudCB0byBjdXJyZW50IGluaXRpYWwgcmF0ZS4gIEF2YWlsYWJsZSBtZWFuczoKKyAqICAgICBhKSAgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlICYmCisgKiAgICAgYikgIHN1cHBvcnRlZCBieSBhc3NvY2lhdGlvbiAmJgorICogICAgIGMpICB3aXRoaW4gYW55IGNvbnN0cmFpbnRzIHNlbGVjdGVkIGJ5IHVzZXIKKyAqCisgKiAzKSAgR2F0aGVyIG1lYXN1cmVkIHRocm91Z2hwdXRzIGZvciBhZGphY2VudCByYXRlcy4gIFRoZXNlIG1pZ2h0IG5vdCBoYXZlCisgKiAgICAgZW5vdWdoIGhpc3RvcnkgdG8gY2FsY3VsYXRlIGEgdGhyb3VnaHB1dC4gIFRoYXQncyBva2F5LCB3ZSBtaWdodCB0cnkKKyAqICAgICB1c2luZyBvbmUgb2YgdGhlbSBhbnl3YXkhCisgKgorICogNCkgIFRyeSBkZWNyZWFzaW5nIHJhdGUgaWYsIGZvciBjdXJyZW50IHJhdGU6CisgKiAgICAgYSkgIHN1Y2Nlc3MgcmF0aW8gaXMgPCAxNSUgfHwKKyAqICAgICBiKSAgbG93ZXIgYWRqYWNlbnQgcmF0ZSBoYXMgYmV0dGVyIG1lYXN1cmVkIHRocm91Z2hwdXQgfHwKKyAqICAgICBjKSAgaGlnaGVyIGFkamFjZW50IHJhdGUgaGFzIHdvcnNlIHRocm91Z2hwdXQsIGFuZCBsb3dlciBpcyB1bm1lYXN1cmVkCisgKgorICogICAgIEFzIGEgc2FuaXR5IGNoZWNrLCBpZiBkZWNyZWFzZSB3YXMgZGV0ZXJtaW5lZCBhYm92ZSwgbGVhdmUgcmF0ZQorICogICAgIHVuY2hhbmdlZCBpZjoKKyAqICAgICBhKSAgbG93ZXIgcmF0ZSB1bmF2YWlsYWJsZQorICogICAgIGIpICBzdWNjZXNzIHJhdGlvIGF0IGN1cnJlbnQgcmF0ZSA+IDg1JSAodmVyeSBnb29kKQorICogICAgIGMpICBjdXJyZW50IG1lYXN1cmVkIHRocm91Z2hwdXQgaXMgYmV0dGVyIHRoYW4gZXhwZWN0ZWQgdGhyb3VnaHB1dAorICogICAgICAgICBvZiBsb3dlciByYXRlICh1bmRlciBwZXJmZWN0IDEwMCUgdHggY29uZGl0aW9ucywgc2VlIHRhYmxlIGJlbG93KQorICoKKyAqIDUpICBUcnkgaW5jcmVhc2luZyByYXRlIGlmLCBmb3IgY3VycmVudCByYXRlOgorICogICAgIGEpICBzdWNjZXNzIHJhdGlvIGlzIDwgMTUlIHx8CisgKiAgICAgYikgIGJvdGggYWRqYWNlbnQgcmF0ZXMnIHRocm91Z2hwdXRzIGFyZSB1bm1lYXN1cmVkICh0cnkgaXQhKSB8fAorICogICAgIGIpICBoaWdoZXIgYWRqYWNlbnQgcmF0ZSBoYXMgYmV0dGVyIG1lYXN1cmVkIHRocm91Z2hwdXQgfHwKKyAqICAgICBjKSAgbG93ZXIgYWRqYWNlbnQgcmF0ZSBoYXMgd29yc2UgdGhyb3VnaHB1dCwgYW5kIGhpZ2hlciBpcyB1bm1lYXN1cmVkCisgKgorICogICAgIEFzIGEgc2FuaXR5IGNoZWNrLCBpZiBpbmNyZWFzZSB3YXMgZGV0ZXJtaW5lZCBhYm92ZSwgbGVhdmUgcmF0ZQorICogICAgIHVuY2hhbmdlZCBpZjoKKyAqICAgICBhKSAgc3VjY2VzcyByYXRpbyBhdCBjdXJyZW50IHJhdGUgPCA3MCUuICBUaGlzIGlzIG5vdCBwYXJ0aWN1bGFybHkKKyAqICAgICAgICAgZ29vZCBwZXJmb3JtYW5jZTsgaGlnaGVyIHJhdGUgaXMgc3VyZSB0byBoYXZlIHBvb3JlciBzdWNjZXNzLgorICoKKyAqIDYpICBSZS1ldmFsdWF0ZSB0aGUgcmF0ZSBhZnRlciBlYWNoIHR4IGZyYW1lLiAgSWYgd29ya2luZyB3aXRoIGJsb2NrLQorICogICAgIGFja25vd2xlZGdlLCBoaXN0b3J5IGFuZCBzdGF0cyBtYXkgYmUgY2FsY3VsYXRlZCBmb3IgdGhlIGVudGlyZQorICogICAgIGJsb2NrIChpbmNsdWRpbmcgcHJpb3IgaGlzdG9yeSB0aGF0IGZpdHMgd2l0aGluIHRoZSBoaXN0b3J5IHdpbnMpLAorICogICAgIGJlZm9yZSByZS1ldmFsdWF0aW9uLgorICoKKyAqIEZJTkRJTkcgQkVTVCBTVEFSVElORyBNT0RVTEFUSU9OIE1PREU6CisgKgorICogQWZ0ZXIgd29ya2luZyB3aXRoIGEgbW9kdWxhdGlvbiBtb2RlIGZvciBhICJ3aGlsZSIgKGFuZCBkb2luZyByYXRlIHNjYWxpbmcpLAorICogdGhlIGRyaXZlciBzZWFyY2hlcyBmb3IgYSBuZXcgaW5pdGlhbCBtb2RlIGluIGFuIGF0dGVtcHQgdG8gaW1wcm92ZQorICogdGhyb3VnaHB1dC4gIFRoZSAid2hpbGUiIGlzIG1lYXN1cmVkIGJ5IG51bWJlcnMgb2YgYXR0ZW1wdGVkIGZyYW1lczoKKyAqCisgKiBGb3IgbGVnYWN5IG1vZGUsIHNlYXJjaCBmb3IgbmV3IG1vZGUgYWZ0ZXI6CisgKiAgIDQ4MCBzdWNjZXNzZnVsIGZyYW1lcywgb3IgMTYwIGZhaWxlZCBmcmFtZXMKKyAqIEZvciBoaWdoLXRocm91Z2hwdXQgbW9kZXMgKFNJU08gb3IgTUlNTyksIHNlYXJjaCBmb3IgbmV3IG1vZGUgYWZ0ZXI6CisgKiAgIDQ1MDAgc3VjY2Vzc2Z1bCBmcmFtZXMsIG9yIDQwMCBmYWlsZWQgZnJhbWVzCisgKgorICogTW9kZSBzd2l0Y2ggcG9zc2liaWxpdGllcyBhcmUgKDMgZm9yIGVhY2ggbW9kZSk6CisgKgorICogRm9yIGxlZ2FjeToKKyAqICAgQ2hhbmdlIGFudGVubmEsIHRyeSBTSVNPIChpZiBIVCBhc3NvY2lhdGlvbiksIHRyeSBNSU1PIChpZiBIVCBhc3NvY2lhdGlvbikKKyAqIEZvciBTSVNPOgorICogICBDaGFuZ2UgYW50ZW5uYSwgdHJ5IE1JTU8sIHRyeSBzaG9ydGVuZWQgZ3VhcmQgaW50ZXJ2YWwgKFNHSSkKKyAqIEZvciBNSU1POgorICogICBUcnkgU0lTTyBhbnRlbm5hIEEsIFNJU08gYW50ZW5uYSBCLCB0cnkgc2hvcnRlbmVkIGd1YXJkIGludGVydmFsIChTR0kpCisgKgorICogV2hlbiB0cnlpbmcgYSBuZXcgbW9kZSwgdXNlIHRoZSBzYW1lIGJpdCByYXRlIGFzIHRoZSBvbGQvY3VycmVudCBtb2RlIHdoZW4KKyAqIHRyeWluZyBhbnRlbm5hIHN3aXRjaGVzIGFuZCBzaG9ydGVuZWQgZ3VhcmQgaW50ZXJ2YWwuICBXaGVuIHN3aXRjaGluZyB0bworICogU0lTTyBmcm9tIE1JTU8gb3IgbGVnYWN5LCBvciB0byBNSU1PIGZyb20gU0lTTyBvciBsZWdhY3ksIHVzZSBhIHJhdGUKKyAqIGZvciB3aGljaCB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCAodW5kZXIgcGVyZmVjdCBjb25kaXRpb25zKSBpcyBhYm91dCB0aGUKKyAqIHNhbWUgb3Igc2xpZ2h0bHkgYmV0dGVyIHRoYW4gdGhlIGFjdHVhbCBtZWFzdXJlZCB0aHJvdWdocHV0IGRlbGl2ZXJlZCBieQorICogdGhlIG9sZC9jdXJyZW50IG1vZGUuCisgKgorICogQWN0dWFsIHRocm91Z2hwdXQgY2FuIGJlIGVzdGltYXRlZCBieSBtdWx0aXBseWluZyB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dAorICogYnkgdGhlIHN1Y2Nlc3MgcmF0aW8gKHN1Y2Nlc3NmdWwgLyBhdHRlbXB0ZWQgdHggZnJhbWVzKS4gIEZyYW1lIHNpemUgaXMKKyAqIG5vdCBjb25zaWRlcmVkIGluIHRoaXMgY2FsY3VsYXRpb247IGl0IGFzc3VtZXMgdGhhdCBmcmFtZSBzaXplIHdpbGwgYXZlcmFnZQorICogb3V0IHRvIGJlIGZhaXJseSBjb25zaXN0ZW50IG92ZXIgc2V2ZXJhbCBzYW1wbGVzLiAgVGhlIGZvbGxvd2luZyBhcmUKKyAqIG1ldHJpYyB2YWx1ZXMgZm9yIGV4cGVjdGVkIHRocm91Z2hwdXQgYXNzdW1pbmcgMTAwJSBzdWNjZXNzIHJhdGlvLgorICogT25seSBHIGJhbmQgaGFzIHN1cHBvcnQgZm9yIENDSyByYXRlczoKKyAqCisgKiAgICAgICAgICAgUkFURTogIDEgICAgMiAgICA1ICAgMTEgICAgNiAgIDkgICAxMiAgIDE4ICAgMjQgICAzNiAgIDQ4ICAgNTQgICA2MAorICoKKyAqICAgICAgICAgICAgICBHOiAgNyAgIDEzICAgMzUgICA1OCAgIDQwICA1NyAgIDcyICAgOTggIDEyMSAgMTU0ICAxNzcgIDE4NiAgMTg2CisgKiAgICAgICAgICAgICAgQTogIDAgICAgMCAgICAwICAgIDAgICA0MCAgNTcgICA3MiAgIDk4ICAxMjEgIDE1NCAgMTc3ICAxODYgIDE4NgorICogICAgIFNJU08gMjBNSHo6ICAwICAgIDAgICAgMCAgICAwICAgNDIgIDQyICAgNzYgIDEwMiAgMTI0ICAxNTkgIDE4MyAgMTkzICAyMDIKKyAqIFNHSSBTSVNPIDIwTUh6OiAgMCAgICAwICAgIDAgICAgMCAgIDQ2ICA0NiAgIDgyICAxMTAgIDEzMiAgMTY4ICAxOTIgIDIwMiAgMjExCisgKiAgICAgTUlNTyAyME1IejogIDAgICAgMCAgICAwICAgIDAgICA3NCAgNzQgIDEyMyAgMTU1ICAxNzkgIDIxNCAgMjM2ICAyNDQgIDI1MQorICogU0dJIE1JTU8gMjBNSHo6ICAwICAgIDAgICAgMCAgICAwICAgODEgIDgxICAxMzEgIDE2NCAgMTg4ICAyMjIgIDI0MyAgMjUxICAyNTcKKyAqICAgICBTSVNPIDQwTUh6OiAgMCAgICAwICAgIDAgICAgMCAgIDc3ICA3NyAgMTI3ICAxNjAgIDE4NCAgMjIwICAyNDIgIDI1MCAgMjU3CisgKiBTR0kgU0lTTyA0ME1IejogIDAgICAgMCAgICAwICAgIDAgICA4MyAgODMgIDEzNSAgMTY5ICAxOTMgIDIyOSAgMjUwICAyNTcgIDI2NAorICogICAgIE1JTU8gNDBNSHo6ICAwICAgIDAgICAgMCAgICAwICAxMjMgMTIzICAxODIgIDIxNCAgMjM1ICAyNjQgIDI3OSAgMjg1ICAyODkKKyAqIFNHSSBNSU1PIDQwTUh6OiAgMCAgICAwICAgIDAgICAgMCAgMTMxIDEzMSAgMTkxICAyMjIgIDI0MiAgMjcwICAyODQgIDI4OSAgMjkzCisgKgorICogQWZ0ZXIgdGhlIG5ldyBtb2RlIGhhcyBiZWVuIHRyaWVkIGZvciBhIHNob3J0IHdoaWxlIChtaW5pbXVtIG9mIDYgZmFpbGVkCisgKiBmcmFtZXMgb3IgOCBzdWNjZXNzZnVsIGZyYW1lcyksIGNvbXBhcmUgc3VjY2VzcyByYXRpbyBhbmQgYWN0dWFsIHRocm91Z2hwdXQKKyAqIGVzdGltYXRlIG9mIHRoZSBuZXcgbW9kZSB3aXRoIHRoZSBvbGQuICBJZiBlaXRoZXIgaXMgYmV0dGVyIHdpdGggdGhlIG5ldworICogbW9kZSwgY29udGludWUgdG8gdXNlIHRoZSBuZXcgbW9kZS4KKyAqCisgKiBDb250aW51ZSBjb21wYXJpbmcgbW9kZXMgdW50aWwgYWxsIDMgcG9zc2liaWxpdGllcyBoYXZlIGJlZW4gdHJpZWQuCisgKiBJZiBtb3ZpbmcgZnJvbSBsZWdhY3kgdG8gSFQsIHRyeSBhbGwgMyBwb3NzaWJpbGl0aWVzIGZyb20gdGhlIG5ldyBIVAorICogbW9kZS4gIEFmdGVyIHRyeWluZyBhbGwgMywgYSBiZXN0IG1vZGUgaXMgZm91bmQuICBDb250aW51ZSB0byB1c2UgdGhpcyBtb2RlCisgKiBmb3IgdGhlIGxvbmdlciAid2hpbGUiIGRlc2NyaWJlZCBhYm92ZSAoZS5nLiA0ODAgc3VjY2Vzc2Z1bCBmcmFtZXMgZm9yCisgKiBsZWdhY3kpLCBhbmQgdGhlbiByZXBlYXQgdGhlIHNlYXJjaCBwcm9jZXNzLgorICoKKyAqLworc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgeworCisJLyogSW5kZXggb2YgZGVzdGluYXRpb24vcmVjaXBpZW50IHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlICovCisJdTggc3RhX2lkOworCXU4IHJlc2VydmVkMTsKKwlfX2xlMTYgY29udHJvbDsJCS8qIG5vdCB1c2VkICovCisJc3RydWN0IGlsX2xpbmtfcXVhbF9nZW5lcmFsX3BhcmFtcyBnZW5lcmFsX3BhcmFtczsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsX2FnZ19wYXJhbXMgYWdnX3BhcmFtczsKKworCS8qCisJICogUmF0ZSBpbmZvOyB3aGVuIHVzaW5nIHJhdGUtc2NhbGluZywgVHggY29tbWFuZCdzIGluaXRpYWxfcmF0ZV9pZHgKKwkgKiBzcGVjaWZpZXMgMXN0IFR4IHJhdGUgYXR0ZW1wdGVkLCB2aWEgaWR4IGludG8gdGhpcyB0YWJsZS4KKwkgKiA0OTY1IGRldmljZXMgd29ya3MgaXRzIHdheSB0aHJvdWdoIHRhYmxlIHdoZW4gcmV0cnlpbmcgVHguCisJICovCisJc3RydWN0IHsKKwkJX19sZTMyIHJhdGVfbl9mbGFnczsJLyogUkFURV9NQ1NfKiwgUkFURV8qICovCisJfSByc190YWJsZVtMSU5LX1FVQUxfTUFYX1JFVFJZX05VTV07CisJX19sZTMyIHJlc2VydmVkMjsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBCVCBjb25maWd1cmF0aW9uIGVuYWJsZSBmbGFnczoKKyAqICAgYml0IDAgLSAxOiBCVCBjaGFubmVsIGFubm91bmNlbWVudCBlbmFibGVkCisgKiAgICAgICAgICAgMDogZGlzYWJsZQorICogICBiaXQgMSAtIDE6IHByaW9yaXR5IG9mIEJUIGRldmljZSBlbmFibGVkCisgKiAgICAgICAgICAgMDogZGlzYWJsZQorICovCisjZGVmaW5lIEJUX0NPRVhfRElTQUJMRSAoMHgwKQorI2RlZmluZSBCVF9FTkFCTEVfQ0hBTk5FTF9BTk5PVU5DRSBCSVQoMCkKKyNkZWZpbmUgQlRfRU5BQkxFX1BSSU9SSVRZCSAgIEJJVCgxKQorCisjZGVmaW5lIEJUX0NPRVhfRU5BQkxFICAoQlRfRU5BQkxFX0NIQU5ORUxfQU5OT1VOQ0UgfCBCVF9FTkFCTEVfUFJJT1JJVFkpCisKKyNkZWZpbmUgQlRfTEVBRF9USU1FX0RFRiAoMHgxRSkKKworI2RlZmluZSBCVF9NQVhfS0lMTF9ERUYgKDB4NSkKKworLyoKKyAqIENfQlRfQ09ORklHID0gMHg5YiAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQorICoKKyAqIDM5NDUgYW5kIDQ5NjUgZGV2aWNlcyBzdXBwb3J0IGhhcmR3YXJlIGhhbmRzaGFrZSB3aXRoIEJsdWV0b290aCBkZXZpY2Ugb24KKyAqIHNhbWUgcGxhdGZvcm0uICBCbHVldG9vdGggZGV2aWNlIGFsZXJ0cyB3aXJlbGVzcyBkZXZpY2Ugd2hlbiBpdCB3aWxsIFR4OworICogd2lyZWxlc3MgZGV2aWNlIGNhbiBkZWxheSBvciBraWxsIGl0cyBvd24gVHggdG8gYWNjb21tb2RhdGUuCisgKi8KK3N0cnVjdCBpbF9idF9jbWQgeworCXU4IGZsYWdzOworCXU4IGxlYWRfdGltZTsKKwl1OCBtYXhfa2lsbDsKKwl1OCByZXNlcnZlZDsKKwlfX2xlMzIga2lsbF9hY2tfbWFzazsKKwlfX2xlMzIga2lsbF9jdHNfbWFzazsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICg2KQorICogU3BlY3RydW0gTWFuYWdlbWVudCAoODAyLjExaCkgQ29tbWFuZHMsIFJlc3BvbnNlcywgTm90aWZpY2F0aW9uczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTcGVjdHJ1bSBNYW5hZ2VtZW50CisgKi8KKyNkZWZpbmUgTUVBU1VSRU1FTlRfRklMVEVSX0ZMQUcgKFJYT05fRklMVEVSX1BST01JU0NfTVNLICAgICAgICAgfCBcCisJCQkJIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyAgICAgICAgfCBcCisJCQkJIFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLICAgICAgfCBcCisJCQkJIFJYT05fRklMVEVSX0RJU19ERUNSWVBUX01TSyAgICAgfCBcCisJCQkJIFJYT05fRklMVEVSX0RJU19HUlBfREVDUllQVF9NU0sgfCBcCisJCQkJIFJYT05fRklMVEVSX0FTU09DX01TSyAgICAgICAgICAgfCBcCisJCQkJIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKQorCitzdHJ1Y3QgaWxfbWVhc3VyZV9jaGFubmVsIHsKKwlfX2xlMzIgZHVyYXRpb247CS8qIG1lYXN1cmVtZW50IGR1cmF0aW9uIGluIGV4dGVuZGVkIGJlYWNvbgorCQkJCSAqIGZvcm1hdCAqLworCXU4IGNoYW5uZWw7CQkvKiBjaGFubmVsIHRvIG1lYXN1cmUgKi8KKwl1OCB0eXBlOwkJLyogc2VlIGVudW0gaWxfbWVhc3VyZV90eXBlICovCisJX19sZTE2IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworLyoKKyAqIENfU1BFQ1RSVU1fTUVBU1VSRU1FTlQgPSAweDc0IChjb21tYW5kKQorICovCitzdHJ1Y3QgaWxfc3BlY3RydW1fY21kIHsKKwlfX2xlMTYgbGVuOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHN0YXJ0aW5nIGZyb20gdG9rZW4gKi8KKwl1OCB0b2tlbjsJCS8qIHRva2VuIGlkICovCisJdTggaWQ7CQkJLyogbWVhc3VyZW1lbnQgaWQgLS0gMCBvciAxICovCisJdTggb3JpZ2luOwkJLyogMCA9IFRHaCwgMSA9IG90aGVyLCAyID0gVEdrICovCisJdTggcGVyaW9kaWM7CQkvKiAxID0gcGVyaW9kaWMgKi8KKwlfX2xlMTYgcGF0aF9sb3NzX3RpbWVvdXQ7CisJX19sZTMyIHN0YXJ0X3RpbWU7CS8qIHN0YXJ0IHRpbWUgaW4gZXh0ZW5kZWQgYmVhY29uIGZvcm1hdCAqLworCV9fbGUzMiByZXNlcnZlZDI7CisJX19sZTMyIGZsYWdzOwkJLyogcnhvbiBmbGFncyAqLworCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7CS8qIHJ4b24gZmlsdGVyIGZsYWdzICovCisJX19sZTE2IGNoYW5uZWxfY291bnQ7CS8qIG1pbmltdW0gMSwgbWF4aW11bSAxMCAqLworCV9fbGUxNiByZXNlcnZlZDM7CisJc3RydWN0IGlsX21lYXN1cmVfY2hhbm5lbCBjaGFubmVsc1sxMF07Cit9IF9fcGFja2VkOworCisvKgorICogQ19TUEVDVFJVTV9NRUFTVVJFTUVOVCA9IDB4NzQgKHJlc3BvbnNlKQorICovCitzdHJ1Y3QgaWxfc3BlY3RydW1fcmVzcCB7CisJdTggdG9rZW47CisJdTggaWQ7CQkJLyogaWQgb2YgdGhlIHByaW9yIGNvbW1hbmQgcmVwbGFjZWQsIG9yIDB4ZmYgKi8KKwlfX2xlMTYgc3RhdHVzOwkJLyogMCAtIGNvbW1hbmQgd2lsbCBiZSBoYW5kbGVkCisJCQkJICogMSAtIGNhbm5vdCBoYW5kbGUgKGNvbmZsaWN0cyB3aXRoIGFub3RoZXIKKwkJCQkgKiAgICAgbWVhc3VyZW1lbnQpICovCit9IF9fcGFja2VkOworCitlbnVtIGlsX21lYXN1cmVtZW50X3N0YXRlIHsKKwlJTF9NRUFTVVJFTUVOVF9TVEFSVCA9IDAsCisJSUxfTUVBU1VSRU1FTlRfU1RPUCA9IDEsCit9OworCitlbnVtIGlsX21lYXN1cmVtZW50X3N0YXR1cyB7CisJSUxfTUVBU1VSRU1FTlRfT0sgPSAwLAorCUlMX01FQVNVUkVNRU5UX0NPTkNVUlJFTlQgPSAxLAorCUlMX01FQVNVUkVNRU5UX0NTQV9DT05GTElDVCA9IDIsCisJSUxfTUVBU1VSRU1FTlRfVEdIX0NPTkZMSUNUID0gMywKKwkvKiA0LTUgcmVzZXJ2ZWQgKi8KKwlJTF9NRUFTVVJFTUVOVF9TVE9QUEVEID0gNiwKKwlJTF9NRUFTVVJFTUVOVF9USU1FT1VUID0gNywKKwlJTF9NRUFTVVJFTUVOVF9QRVJJT0RJQ19GQUlMRUQgPSA4LAorfTsKKworI2RlZmluZSBOVU1fRUxFTUVOVFNfSU5fSElTVE9HUkFNIDgKKworc3RydWN0IGlsX21lYXN1cmVtZW50X2hpc3RvZ3JhbSB7CisJX19sZTMyIG9mZG1bTlVNX0VMRU1FTlRTX0lOX0hJU1RPR1JBTV07CS8qIGluIDAuOHVzZWMgY291bnRzICovCisJX19sZTMyIGNja1tOVU1fRUxFTUVOVFNfSU5fSElTVE9HUkFNXTsJLyogaW4gMXVzZWMgY291bnRzICovCit9IF9fcGFja2VkOworCisvKiBjbGVhciBjaGFubmVsIGF2YWlsYWJpbGl0eSBjb3VudGVycyAqLworc3RydWN0IGlsX21lYXN1cmVtZW50X2NjYV9jb3VudGVycyB7CisJX19sZTMyIG9mZG07CisJX19sZTMyIGNjazsKK30gX19wYWNrZWQ7CisKK2VudW0gaWxfbWVhc3VyZV90eXBlIHsKKwlJTF9NRUFTVVJFX0JBU0lDID0gKDEgPDwgMCksCisJSUxfTUVBU1VSRV9DSEFOTkVMX0xPQUQgPSAoMSA8PCAxKSwKKwlJTF9NRUFTVVJFX0hJU1RPR1JBTV9SUEkgPSAoMSA8PCAyKSwKKwlJTF9NRUFTVVJFX0hJU1RPR1JBTV9OT0lTRSA9ICgxIDw8IDMpLAorCUlMX01FQVNVUkVfRlJBTUUgPSAoMSA8PCA0KSwKKwkvKiBiaXRzIDU6NiBhcmUgcmVzZXJ2ZWQgKi8KKwlJTF9NRUFTVVJFX0lETEUgPSAoMSA8PCA3KSwKK307CisKKy8qCisgKiBOX1NQRUNUUlVNX01FQVNVUkVNRU5UID0gMHg3NSAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKi8KK3N0cnVjdCBpbF9zcGVjdHJ1bV9ub3RpZmljYXRpb24geworCXU4IGlkOwkJCS8qIG1lYXN1cmVtZW50IGlkIC0tIDAgb3IgMSAqLworCXU4IHRva2VuOworCXU4IGNoYW5uZWxfaWR4OwkJLyogaWR4IGluIG1lYXN1cmVtZW50IGNoYW5uZWwgbGlzdCAqLworCXU4IHN0YXRlOwkJLyogMCAtIHN0YXJ0LCAxIC0gc3RvcCAqLworCV9fbGUzMiBzdGFydF90aW1lOwkvKiBsb3dlciAzMi1iaXRzIG9mIFRTRiAqLworCXU4IGJhbmQ7CQkvKiAwIC0gNS4yR0h6LCAxIC0gMi40R0h6ICovCisJdTggY2hhbm5lbDsKKwl1OCB0eXBlOwkJLyogc2VlIGVudW0gaWxfbWVhc3VyZW1lbnRfdHlwZSAqLworCXU4IHJlc2VydmVkMTsKKwkvKiBOT1RFOiAgY2NhX29mZG0sIGNjYV9jY2ssIGJhc2ljX3R5cGUsIGFuZCBoaXN0b2dyYW0gYXJlIG9ubHkgb25seQorCSAqIHZhbGlkIGlmIGFwcGxpY2FibGUgZm9yIG1lYXN1cmVtZW50IHR5cGUgcmVxdWVzdGVkLiAqLworCV9fbGUzMiBjY2Ffb2ZkbTsJLyogY2NhIGZyYWN0aW9uIHRpbWUgaW4gNDBNaHogY2xvY2sgcGVyaW9kcyAqLworCV9fbGUzMiBjY2FfY2NrOwkJLyogY2NhIGZyYWN0aW9uIHRpbWUgaW4gNDRNaHogY2xvY2sgcGVyaW9kcyAqLworCV9fbGUzMiBjY2FfdGltZTsJLyogY2hhbm5lbCBsb2FkIHRpbWUgaW4gdXNlY3MgKi8KKwl1OCBiYXNpY190eXBlOwkJLyogMCAtIGJzcywgMSAtIG9mZG0gcHJlYW1ibGUsIDIgLQorCQkJCSAqIHVuaWRlbnRpZmllZCAqLworCXU4IHJlc2VydmVkMlszXTsKKwlzdHJ1Y3QgaWxfbWVhc3VyZW1lbnRfaGlzdG9ncmFtIGhpc3RvZ3JhbTsKKwlfX2xlMzIgc3RvcF90aW1lOwkvKiBsb3dlciAzMi1iaXRzIG9mIFRTRiAqLworCV9fbGUzMiBzdGF0dXM7CQkvKiBzZWUgaWxfbWVhc3VyZW1lbnRfc3RhdHVzICovCit9IF9fcGFja2VkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoNykKKyAqIFBvd2VyIE1hbmFnZW1lbnQgQ29tbWFuZHMsIFJlc3BvbnNlcywgTm90aWZpY2F0aW9uczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogc3RydWN0IGlsX3Bvd2VydGFibGVfY21kIC0gUG93ZXIgVGFibGUgQ29tbWFuZAorICogQGZsYWdzOiBTZWUgYmVsb3c6CisgKgorICogQ19QT1dFUl9UQkwgPSAweDc3IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKgorICogUE0gYWxsb3c6CisgKiAgIGJpdCAwIC0gJzAnIERyaXZlciBub3QgYWxsb3cgcG93ZXIgbWFuYWdlbWVudAorICogICAgICAgICAgICcxJyBEcml2ZXIgYWxsb3cgUE0gKHVzZSByZXN0IG9mIHBhcmFtZXRlcnMpCisgKgorICogdUNvZGUgc2VuZCBzbGVlcCBub3RpZmljYXRpb25zOgorICogICBiaXQgMSAtICcwJyBEb24ndCBzZW5kIHNsZWVwIG5vdGlmaWNhdGlvbgorICogICAgICAgICAgICcxJyBzZW5kIHNsZWVwIG5vdGlmaWNhdGlvbiAoU0VORF9QTV9OT1RJRklDQVRJT04pCisgKgorICogU2xlZXAgb3ZlciBEVElNCisgKiAgIGJpdCAyIC0gJzAnIFBNIGhhdmUgdG8gd2FsayB1cCBldmVyeSBEVElNCisgKiAgICAgICAgICAgJzEnIFBNIGNvdWxkIHNsZWVwIG92ZXIgRFRJTSB0aWxsIGxpc3RlbiBJbnRlcnZhbC4KKyAqCisgKiBQQ0kgcG93ZXIgbWFuYWdlZAorICogICBiaXQgMyAtICcwJyAoUENJX0NGR19MSU5LX0NUUkwgJiAweDEpCisgKiAgICAgICAgICAgJzEnICEoUENJX0NGR19MSU5LX0NUUkwgJiAweDEpCisgKgorICogRmFzdCBQRAorICogICBiaXQgNCAtICcxJyBQdXQgcmFkaW8gdG8gc2xlZXAgd2hlbiByZWNlaXZpbmcgZnJhbWUgZm9yIG90aGVycworICoKKyAqIEZvcmNlIHNsZWVwIE1vZGVzCisgKiAgIGJpdCAzMS8zMC0gJzAwJyB1c2UgYm90aCBtYWMveHRhbCBzbGVlcHMKKyAqICAgICAgICAgICAgICAnMDEnIGZvcmNlIE1hYyBzbGVlcAorICogICAgICAgICAgICAgICcxMCcgZm9yY2UgeHRhbCBzbGVlcAorICogICAgICAgICAgICAgICcxMScgSWxsZWdhbCBzZXQKKyAqCisgKiBOT1RFOiBpZiBzbGVlcF9pbnRlcnZhbFtTTEVFUF9JTlRSVkxfVEJMX1NJWkUtMV0gPiBEVElNIHBlcmlvZCB0aGVuCisgKiB1Y29kZSBhc3N1bWUgc2xlZXAgb3ZlciBEVElNIGlzIGFsbG93ZWQgYW5kIHdlIGRvbid0IG5lZWQgdG8gd2FrZSB1cAorICogZm9yIGV2ZXJ5IERUSU0uCisgKi8KKyNkZWZpbmUgSUxfUE9XRVJfVkVDX1NJWkUgNQorCisjZGVmaW5lIElMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0sJY3B1X3RvX2xlMTYoQklUKDApKQorI2RlZmluZSBJTF9QT1dFUl9QQ0lfUE1fTVNLCQkJY3B1X3RvX2xlMTYoQklUKDMpKQorCitzdHJ1Y3QgaWwzOTQ1X3Bvd2VydGFibGVfY21kIHsKKwlfX2xlMTYgZmxhZ3M7CisJdTggcmVzZXJ2ZWRbMl07CisJX19sZTMyIHJ4X2RhdGFfdGltZW91dDsKKwlfX2xlMzIgdHhfZGF0YV90aW1lb3V0OworCV9fbGUzMiBzbGVlcF9pbnRlcnZhbFtJTF9QT1dFUl9WRUNfU0laRV07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWxfcG93ZXJ0YWJsZV9jbWQgeworCV9fbGUxNiBmbGFnczsKKwl1OCBrZWVwX2FsaXZlX3NlY29uZHM7CS8qIDM5NDUgcmVzZXJ2ZWQgKi8KKwl1OCBkZWJ1Z19mbGFnczsJCS8qIDM5NDUgcmVzZXJ2ZWQgKi8KKwlfX2xlMzIgcnhfZGF0YV90aW1lb3V0OworCV9fbGUzMiB0eF9kYXRhX3RpbWVvdXQ7CisJX19sZTMyIHNsZWVwX2ludGVydmFsW0lMX1BPV0VSX1ZFQ19TSVpFXTsKKwlfX2xlMzIga2VlcF9hbGl2ZV9iZWFjb25zOworfSBfX3BhY2tlZDsKKworLyoKKyAqIE5fUE1fU0xFRVAgPSAweDdBIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqIGFsbCBkZXZpY2VzIGlkZW50aWNhbC4KKyAqLworc3RydWN0IGlsX3NsZWVwX25vdGlmaWNhdGlvbiB7CisJdTggcG1fc2xlZXBfbW9kZTsKKwl1OCBwbV93YWtldXBfc3JjOworCV9fbGUxNiByZXNlcnZlZDsKKwlfX2xlMzIgc2xlZXBfdGltZTsKKwlfX2xlMzIgdHNmX2xvdzsKKwlfX2xlMzIgYmNvbl90aW1lcjsKK30gX19wYWNrZWQ7CisKKy8qIFNsZWVwIHN0YXRlcy4gIGFsbCBkZXZpY2VzIGlkZW50aWNhbC4gKi8KK2VudW0geworCUlMX1BNX05PX1NMRUVQID0gMCwKKwlJTF9QTV9TTFBfTUFDID0gMSwKKwlJTF9QTV9TTFBfRlVMTF9NQUNfVU5BU1NPQ0lBVEUgPSAyLAorCUlMX1BNX1NMUF9GVUxMX01BQ19DQVJEX1NUQVRFID0gMywKKwlJTF9QTV9TTFBfUEhZID0gNCwKKwlJTF9QTV9TTFBfUkVQRU5UID0gNSwKKwlJTF9QTV9XQUtFVVBfQllfVElNRVIgPSA2LAorCUlMX1BNX1dBS0VVUF9CWV9EUklWRVIgPSA3LAorCUlMX1BNX1dBS0VVUF9CWV9SRktJTEwgPSA4LAorCS8qIDMgcmVzZXJ2ZWQgKi8KKwlJTF9QTV9OVU1fT0ZfTU9ERVMgPSAxMiwKK307CisKKy8qCisgKiBOX0NBUkRfU1RBVEUgPSAweGExIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqLworc3RydWN0IGlsX2NhcmRfc3RhdGVfbm90aWYgeworCV9fbGUzMiBmbGFnczsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSFdfQ0FSRF9ESVNBQkxFRCAgIDB4MDEKKyNkZWZpbmUgU1dfQ0FSRF9ESVNBQkxFRCAgIDB4MDIKKyNkZWZpbmUgQ1RfQ0FSRF9ESVNBQkxFRCAgIDB4MDQKKyNkZWZpbmUgUlhPTl9DQVJEX0RJU0FCTEVEIDB4MTAKKworc3RydWN0IGlsX2N0X2tpbGxfY29uZmlnIHsKKwlfX2xlMzIgcmVzZXJ2ZWQ7CisJX19sZTMyIGNyaXRpY2FsX3RlbXBlcmF0dXJlX007CisJX19sZTMyIGNyaXRpY2FsX3RlbXBlcmF0dXJlX1I7Cit9IF9fcGFja2VkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoOCkKKyAqIFNjYW4gQ29tbWFuZHMsIFJlc3BvbnNlcywgTm90aWZpY2F0aW9uczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU0NBTl9DSEFOTkVMX1RZUEVfUEFTU0lWRSBjcHVfdG9fbGUzMigwKQorI2RlZmluZSBTQ0FOX0NIQU5ORUxfVFlQRV9BQ1RJVkUgIGNwdV90b19sZTMyKDEpCisKKy8qKgorICogc3RydWN0IGlsX3NjYW5fY2hhbm5lbCAtIGVudHJ5IGluIENfU0NBTiBjaGFubmVsIHRhYmxlCisgKgorICogT25lIGZvciBlYWNoIGNoYW5uZWwgaW4gdGhlIHNjYW4gbGlzdC4KKyAqIEVhY2ggY2hhbm5lbCBjYW4gaW5kZXBlbmRlbnRseSBzZWxlY3Q6CisgKiAxKSAgU1NJRCBmb3IgZGlyZWN0ZWQgYWN0aXZlIHNjYW5zCisgKiAyKSAgVHhwb3dlciBzZXR0aW5nIChmb3IgcmF0ZSBzcGVjaWZpZWQgd2l0aGluIFR4IGNvbW1hbmQpCisgKiAzKSAgSG93IGxvbmcgdG8gc3RheSBvbi1jaGFubmVsIChiZWhhdmlvciBtYXkgYmUgbW9kaWZpZWQgYnkgcXVpZXRfdGltZSwKKyAqICAgICBxdWlldF9wbGNwX3RoLCBnb29kX0NSQ190aCkKKyAqCisgKiBUbyBhdm9pZCB1Q29kZSBlcnJvcnMsIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGFyZSB0cnVlIChzZWUgY29tbWVudHMKKyAqIHVuZGVyIHN0cnVjdCBpbF9zY2FuX2NtZCBhYm91dCBtYXhfb3V0X3RpbWUgYW5kIHF1aWV0X3RpbWUpOgorICogMSkgIElmIHVzaW5nIHBhc3NpdmVfZHdlbGwgKGkuZS4gcGFzc2l2ZV9kd2VsbCAhPSAwKToKKyAqICAgICBhY3RpdmVfZHdlbGwgPD0gcGFzc2l2ZV9kd2VsbCAoPCBtYXhfb3V0X3RpbWUgaWYgbWF4X291dF90aW1lICE9IDApCisgKiAyKSAgcXVpZXRfdGltZSA8PSBhY3RpdmVfZHdlbGwKKyAqIDMpICBJZiByZXN0cmljdGluZyBvZmYtY2hhbm5lbCB0aW1lIChpLmUuIG1heF9vdXRfdGltZSAhPTApOgorICogICAgIHBhc3NpdmVfZHdlbGwgPCBtYXhfb3V0X3RpbWUKKyAqICAgICBhY3RpdmVfZHdlbGwgPCBtYXhfb3V0X3RpbWUKKyAqLworc3RydWN0IGlsMzk0NV9zY2FuX2NoYW5uZWwgeworCS8qCisJICogdHlwZSBpcyBkZWZpbmVkIGFzOgorCSAqIDA6MCAxID0gYWN0aXZlLCAwID0gcGFzc2l2ZQorCSAqIDE6NCBTU0lEIGRpcmVjdCBiaXQgbWFwOyBpZiBhIGJpdCBpcyBzZXQsIHRoZW4gY29ycmVzcG9uZGluZworCSAqICAgICBTU0lEIElFIGlzIHRyYW5zbWl0dGVkIGluIHByb2JlIHJlcXVlc3QuCisJICogNTo3IHJlc2VydmVkCisJICovCisJdTggdHlwZTsKKwl1OCBjaGFubmVsOwkJLyogYmFuZCBpcyBzZWxlY3RlZCBieSBpbDM5NDVfc2Nhbl9jbWQgImZsYWdzIiBmaWVsZCAqLworCXN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgdHBjOworCV9fbGUxNiBhY3RpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCA1LTUwICovCisJX19sZTE2IHBhc3NpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCAyMC01MDAgKi8KK30gX19wYWNrZWQ7CisKKy8qIHNldCBudW1iZXIgb2YgZGlyZWN0IHByb2JlcyB1OCB0eXBlICovCisjZGVmaW5lIElMMzlfU0NBTl9QUk9CRV9NQVNLKG4pICgoQklUKG4pIHwgKEJJVChuKSAtIEJJVCgxKSkpKQorCitzdHJ1Y3QgaWxfc2Nhbl9jaGFubmVsIHsKKwkvKgorCSAqIHR5cGUgaXMgZGVmaW5lZCBhczoKKwkgKiAwOjAgMSA9IGFjdGl2ZSwgMCA9IHBhc3NpdmUKKwkgKiAxOjIwIFNTSUQgZGlyZWN0IGJpdCBtYXA7IGlmIGEgYml0IGlzIHNldCwgdGhlbiBjb3JyZXNwb25kaW5nCisJICogICAgIFNTSUQgSUUgaXMgdHJhbnNtaXR0ZWQgaW4gcHJvYmUgcmVxdWVzdC4KKwkgKiAyMTozMSByZXNlcnZlZAorCSAqLworCV9fbGUzMiB0eXBlOworCV9fbGUxNiBjaGFubmVsOwkJLyogYmFuZCBpcyBzZWxlY3RlZCBieSBpbF9zY2FuX2NtZCAiZmxhZ3MiIGZpZWxkICovCisJdTggdHhfZ2FpbjsJCS8qIGdhaW4gZm9yIGFuYWxvZyByYWRpbyAqLworCXU4IGRzcF9hdHRlbjsJCS8qIGdhaW4gZm9yIERTUCAqLworCV9fbGUxNiBhY3RpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCA1LTUwICovCisJX19sZTE2IHBhc3NpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCAyMC01MDAgKi8KK30gX19wYWNrZWQ7CisKKy8qIHNldCBudW1iZXIgb2YgZGlyZWN0IHByb2JlcyBfX2xlMzIgdHlwZSAqLworI2RlZmluZSBJTF9TQ0FOX1BST0JFX01BU0sobikJY3B1X3RvX2xlMzIoKEJJVChuKSB8IChCSVQobikgLSBCSVQoMSkpKSkKKworLyoqCisgKiBzdHJ1Y3QgaWxfc3NpZF9pZSAtIGRpcmVjdGVkIHNjYW4gbmV0d29yayBpbmZvcm1hdGlvbiBlbGVtZW50CisgKgorICogVXAgdG8gMjAgb2YgdGhlc2UgbWF5IGFwcGVhciBpbiBDX1NDQU4gKE5vdGU6IE9ubHkgNCBhcmUgaW4KKyAqIDM5NDUgU0NBTiBhcGkpLCBzZWxlY3RlZCBieSAidHlwZSIgYml0IGZpZWxkIGluIHN0cnVjdCBpbF9zY2FuX2NoYW5uZWw7CisgKiBlYWNoIGNoYW5uZWwgbWF5IHNlbGVjdCBkaWZmZXJlbnQgc3NpZHMgZnJvbSBhbW9uZyB0aGUgMjAgKDQpIGVudHJpZXMuCisgKiBTU0lEIElFcyBnZXQgdHJhbnNtaXR0ZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiBlbnRyeS4KKyAqLworc3RydWN0IGlsX3NzaWRfaWUgeworCXU4IGlkOworCXU4IGxlbjsKKwl1OCBzc2lkWzMyXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgUFJPQkVfT1BUSU9OX01BWF8zOTQ1CQk0CisjZGVmaW5lIFBST0JFX09QVElPTl9NQVgJCTIwCisjZGVmaW5lIFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEUJY3B1X3RvX2xlMzIoMHhGRkZGRkZGRikKKyNkZWZpbmUgSUxfR09PRF9DUkNfVEhfRElTQUJMRUQJMAorI2RlZmluZSBJTF9HT09EX0NSQ19USF9ERUZBVUxUCQljcHVfdG9fbGUxNigxKQorI2RlZmluZSBJTF9HT09EX0NSQ19USF9ORVZFUgkJY3B1X3RvX2xlMTYoMHhmZmZmKQorI2RlZmluZSBJTF9NQVhfU0NBTl9TSVpFIDEwMjQKKyNkZWZpbmUgSUxfTUFYX0NNRF9TSVpFIDQwOTYKKworLyoKKyAqIENfU0NBTiA9IDB4ODAgKGNvbW1hbmQpCisgKgorICogVGhlIGhhcmR3YXJlIHNjYW4gY29tbWFuZCBpcyB2ZXJ5IHBvd2VyZnVsOyB0aGUgZHJpdmVyIGNhbiBzZXQgaXQgdXAgdG8KKyAqIG1haW50YWluIChyZWxhdGl2ZWx5KSBub3JtYWwgbmV0d29yayB0cmFmZmljIHdoaWxlIGRvaW5nIGEgc2NhbiBpbiB0aGUKKyAqIGJhY2tncm91bmQuICBUaGUgbWF4X291dF90aW1lIGFuZCBzdXNwZW5kX3RpbWUgY29udHJvbCB0aGUgcmF0aW8gb2YgaG93CisgKiBsb25nIHRoZSBkZXZpY2Ugc3RheXMgb24gYW4gYXNzb2NpYXRlZCBuZXR3b3JrIGNoYW5uZWwgKCJzZXJ2aWNlIGNoYW5uZWwiKQorICogdnMuIGhvdyBsb25nIGl0J3MgYXdheSBmcm9tIHRoZSBzZXJ2aWNlIGNoYW5uZWwsIGkuZS4gdHVuZWQgdG8gb3RoZXIgY2hhbm5lbHMKKyAqIGZvciBzY2FubmluZy4KKyAqCisgKiBtYXhfb3V0X3RpbWUgaXMgdGhlIG1heCB0aW1lIG9mZi1jaGFubmVsIChpbiB1c2VjKSwgYW5kIHN1c3BlbmRfdGltZQorICogaXMgaG93IGxvbmcgKGluICJleHRlbmRlZCBiZWFjb24iIGZvcm1hdCkgdGhhdCB0aGUgc2NhbiBpcyAic3VzcGVuZGVkIgorICogYWZ0ZXIgcmV0dXJuaW5nIHRvIHRoZSBzZXJ2aWNlIGNoYW5uZWwuICBUaGF0IGlzLCBzdXNwZW5kX3RpbWUgaXMgdGhlCisgKiB0aW1lIHRoYXQgd2Ugc3RheSBvbiB0aGUgc2VydmljZSBjaGFubmVsLCBkb2luZyBub3JtYWwgd29yaywgYmV0d2VlbgorICogc2NhbiBzZWdtZW50cy4gIFRoZSBkcml2ZXIgbWF5IHNldCB0aGVzZSBwYXJhbWV0ZXJzIGRpZmZlcmVudGx5IHRvIHN1cHBvcnQKKyAqIHNjYW5uaW5nIHdoZW4gYXNzb2NpYXRlZCB2cy4gbm90IGFzc29jaWF0ZWQsIGFuZCBsaWdodCB2cy4gaGVhdnkgdHJhZmZpYworICogbG9hZHMgd2hlbiBhc3NvY2lhdGVkLgorICoKKyAqIEFmdGVyIHJlY2VpdmluZyB0aGlzIGNvbW1hbmQsIHRoZSBkZXZpY2UncyBzY2FuIGVuZ2luZSBkb2VzIHRoZSBmb2xsb3dpbmc7CisgKgorICogMSkgIFNlbmRzIFNDQU5fU1RBUlQgbm90aWZpY2F0aW9uIHRvIGRyaXZlcgorICogMikgIENoZWNrcyB0byBzZWUgaWYgaXQgaGFzIHRpbWUgdG8gZG8gc2NhbiBmb3Igb25lIGNoYW5uZWwKKyAqIDMpICBTZW5kcyBOVUxMIHBhY2tldCwgd2l0aCBwb3dlci1zYXZlIChQUykgYml0IHNldCB0byAxLAorICogICAgIHRvIHRlbGwgQVAgdGhhdCB3ZSdyZSBnb2luZyBvZmYtY2hhbm5lbAorICogNCkgIFR1bmVzIHRvIGZpcnN0IGNoYW5uZWwgaW4gc2NhbiBsaXN0LCBkb2VzIGFjdGl2ZSBvciBwYXNzaXZlIHNjYW4KKyAqIDUpICBTZW5kcyBTQ0FOX1JFU1VMVCBub3RpZmljYXRpb24gdG8gZHJpdmVyCisgKiA2KSAgQ2hlY2tzIHRvIHNlZSBpZiBpdCBoYXMgdGltZSB0byBkbyBzY2FuIG9uICpuZXh0KiBjaGFubmVsIGluIGxpc3QKKyAqIDcpICBSZXBlYXRzIDQtNiB1bnRpbCBpdCBubyBsb25nZXIgaGFzIHRpbWUgdG8gc2NhbiB0aGUgbmV4dCBjaGFubmVsCisgKiAgICAgYmVmb3JlIG1heF9vdXRfdGltZSBleHBpcmVzCisgKiA4KSAgUmV0dXJucyB0byBzZXJ2aWNlIGNoYW5uZWwKKyAqIDkpICBTZW5kcyBOVUxMIHBhY2tldCB3aXRoIFBTPTAgdG8gdGVsbCBBUCB0aGF0IHdlJ3JlIGJhY2sKKyAqIDEwKSBTdGF5cyBvbiBzZXJ2aWNlIGNoYW5uZWwgdW50aWwgc3VzcGVuZF90aW1lIGV4cGlyZXMKKyAqIDExKSBSZXBlYXRzIGVudGlyZSBwcm9jZXNzIDItMTAgdW50aWwgbGlzdCBpcyBjb21wbGV0ZQorICogMTIpIFNlbmRzIFNDQU5fQ09NUExFVEUgbm90aWZpY2F0aW9uCisgKgorICogRm9yIGZhc3QsIGVmZmljaWVudCBzY2FucywgdGhlIHNjYW4gY29tbWFuZCBhbHNvIGhhcyBzdXBwb3J0IGZvciBzdGF5aW5nIG9uCisgKiBhIGNoYW5uZWwgZm9yIGp1c3QgYSBzaG9ydCB0aW1lLCBpZiBkb2luZyBhY3RpdmUgc2Nhbm5pbmcgYW5kIGdldHRpbmcgbm8KKyAqIHJlc3BvbnNlcyB0byB0aGUgdHJhbnNtaXR0ZWQgcHJvYmUgcmVxdWVzdC4gIFRoaXMgdGltZSBpcyBjb250cm9sbGVkIGJ5CisgKiBxdWlldF90aW1lLCBhbmQgdGhlIG51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRzIGJlbG93IHdoaWNoIGEgY2hhbm5lbCBpcworICogY29uc2lkZXJlZCAicXVpZXQiIGlzIGNvbnRyb2xsZWQgYnkgcXVpZXRfcGxjcF90aHJlc2hvbGQuCisgKgorICogRm9yIGFjdGl2ZSBzY2FubmluZyBvbiBjaGFubmVscyB0aGF0IGhhdmUgcmVndWxhdG9yeSByZXN0cmljdGlvbnMgYWdhaW5zdAorICogYmxpbmRseSB0cmFuc21pdHRpbmcsIHRoZSBzY2FuIGNhbiBsaXN0ZW4gYmVmb3JlIHRyYW5zbWl0dGluZywgdG8gbWFrZSBzdXJlCisgKiB0aGF0IHRoZXJlIGlzIGFscmVhZHkgbGVnaXRpbWF0ZSBhY3Rpdml0eSBvbiB0aGUgY2hhbm5lbC4gIElmIGVub3VnaAorICogcGFja2V0cyBhcmUgY2xlYW5seSByZWNlaXZlZCBvbiB0aGUgY2hhbm5lbCAoY29udHJvbGxlZCBieSBnb29kX0NSQ190aCwKKyAqIHR5cGljYWwgdmFsdWUgMSksIHRoZSBzY2FuIGVuZ2luZSBzdGFydHMgdHJhbnNtaXR0aW5nIHByb2JlIHJlcXVlc3RzLgorICoKKyAqIERyaXZlciBtdXN0IHVzZSBzZXBhcmF0ZSBzY2FuIGNvbW1hbmRzIGZvciAyLjQgdnMuIDUgR0h6IGJhbmRzLgorICoKKyAqIFRvIGF2b2lkIHVDb2RlIGVycm9ycywgc2VlIHRpbWluZyByZXN0cmljdGlvbnMgZGVzY3JpYmVkIHVuZGVyCisgKiBzdHJ1Y3QgaWxfc2Nhbl9jaGFubmVsLgorICovCisKK3N0cnVjdCBpbDM5NDVfc2Nhbl9jbWQgeworCV9fbGUxNiBsZW47CisJdTggcmVzZXJ2ZWQwOworCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgY2hhbm5lbHMgaW4gY2hhbm5lbCBsaXN0ICovCisJX19sZTE2IHF1aWV0X3RpbWU7CS8qIGR3ZWxsIG9ubHkgdGhpcyAjIG1pbGxpc2VjcyBvbiBxdWlldCBjaGFubmVsCisJCQkJICogKG9ubHkgZm9yIGFjdGl2ZSBzY2FuKSAqLworCV9fbGUxNiBxdWlldF9wbGNwX3RoOwkvKiBxdWlldCBjaG5sIGlzIDwgdGhpcyAjIHBrdHMgKHR5cC4gMSkgKi8KKwlfX2xlMTYgZ29vZF9DUkNfdGg7CS8qIHBhc3NpdmUgLT4gYWN0aXZlIHByb21vdGlvbiB0aHJlc2hvbGQgKi8KKwlfX2xlMTYgcmVzZXJ2ZWQxOworCV9fbGUzMiBtYXhfb3V0X3RpbWU7CS8qIG1heCB1c2VjIHRvIGJlIGF3YXkgZnJvbSBhc3NvY2lhdGVkIChzZXJ2aWNlKQorCQkJCSAqIGNoYW5uZWwgKi8KKwlfX2xlMzIgc3VzcGVuZF90aW1lOwkvKiBwYXVzZSBzY2FuIHRoaXMgbG9uZyAoaW4gImV4dGVuZGVkIGJlYWNvbgorCQkJCSAqIGZvcm1hdCIpIHdoZW4gcmV0dXJuaW5nIHRvIHNlcnZpY2UgY2hhbm5lbDoKKwkJCQkgKiAzOTQ1OyAzMToyNCAjIGJlYWNvbnMsIDE5OjAgYWRkaXRpb25hbCB1c2VjLAorCQkJCSAqIDQ5NjU7IDMxOjIyICMgYmVhY29ucywgMjE6MCBhZGRpdGlvbmFsIHVzZWMuCisJCQkJICovCisJX19sZTMyIGZsYWdzOwkJLyogUlhPTl9GTEdfKiAqLworCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7CS8qIFJYT05fRklMVEVSXyogKi8KKworCS8qIEZvciBhY3RpdmUgc2NhbnMgKHNldCB0byBhbGwtMHMgZm9yIHBhc3NpdmUgc2NhbnMpLgorCSAqIERvZXMgbm90IGluY2x1ZGUgcGF5bG9hZC4gIE11c3Qgc3BlY2lmeSBUeCByYXRlOyBubyByYXRlIHNjYWxpbmcuICovCisJc3RydWN0IGlsMzk0NV90eF9jbWQgdHhfY21kOworCisJLyogRm9yIGRpcmVjdGVkIGFjdGl2ZSBzY2FucyAoc2V0IHRvIGFsbC0wcyBvdGhlcndpc2UpICovCisJc3RydWN0IGlsX3NzaWRfaWUgZGlyZWN0X3NjYW5bUFJPQkVfT1BUSU9OX01BWF8zOTQ1XTsKKworCS8qCisJICogUHJvYmUgcmVxdWVzdCBmcmFtZSwgZm9sbG93ZWQgYnkgY2hhbm5lbCBsaXN0LgorCSAqCisJICogU2l6ZSBvZiBwcm9iZSByZXF1ZXN0IGZyYW1lIGlzIHNwZWNpZmllZCBieSBieXRlIGNvdW50IGluIHR4X2NtZC4KKwkgKiBDaGFubmVsIGxpc3QgZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlciBwcm9iZSByZXF1ZXN0IGZyYW1lLgorCSAqIE51bWJlciBvZiBjaGFubmVscyBpbiBsaXN0IGlzIHNwZWNpZmllZCBieSBjaGFubmVsX2NvdW50LgorCSAqIEVhY2ggY2hhbm5lbCBpbiBsaXN0IGlzIG9mIHR5cGU6CisJICoKKwkgKiBzdHJ1Y3QgaWwzOTQ1X3NjYW5fY2hhbm5lbCBjaGFubmVsc1swXTsKKwkgKgorCSAqIE5PVEU6ICBPbmx5IG9uZSBiYW5kIG9mIGNoYW5uZWxzIGNhbiBiZSBzY2FubmVkIHBlciBwYXNzLiAgWW91CisJICogbXVzdCBub3QgbWl4IDIuNEdIeiBjaGFubmVscyBhbmQgNS4yR0h6IGNoYW5uZWxzLCBhbmQgeW91IG11c3Qgd2FpdAorCSAqIGZvciBvbmUgc2NhbiB0byBjb21wbGV0ZSAoaS5lLiByZWNlaXZlIE5fU0NBTl9DT01QTEVURSkKKwkgKiBiZWZvcmUgcmVxdWVzdGluZyBhbm90aGVyIHNjYW4uCisJICovCisJdTggZGF0YVswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbF9zY2FuX2NtZCB7CisJX19sZTE2IGxlbjsKKwl1OCByZXNlcnZlZDA7CisJdTggY2hhbm5lbF9jb3VudDsJLyogIyBjaGFubmVscyBpbiBjaGFubmVsIGxpc3QgKi8KKwlfX2xlMTYgcXVpZXRfdGltZTsJLyogZHdlbGwgb25seSB0aGlzICMgbWlsbGlzZWNzIG9uIHF1aWV0IGNoYW5uZWwKKwkJCQkgKiAob25seSBmb3IgYWN0aXZlIHNjYW4pICovCisJX19sZTE2IHF1aWV0X3BsY3BfdGg7CS8qIHF1aWV0IGNobmwgaXMgPCB0aGlzICMgcGt0cyAodHlwLiAxKSAqLworCV9fbGUxNiBnb29kX0NSQ190aDsJLyogcGFzc2l2ZSAtPiBhY3RpdmUgcHJvbW90aW9uIHRocmVzaG9sZCAqLworCV9fbGUxNiByeF9jaGFpbjsJLyogUlhPTl9SWF9DSEFJTl8qICovCisJX19sZTMyIG1heF9vdXRfdGltZTsJLyogbWF4IHVzZWMgdG8gYmUgYXdheSBmcm9tIGFzc29jaWF0ZWQgKHNlcnZpY2UpCisJCQkJICogY2hhbm5lbCAqLworCV9fbGUzMiBzdXNwZW5kX3RpbWU7CS8qIHBhdXNlIHNjYW4gdGhpcyBsb25nIChpbiAiZXh0ZW5kZWQgYmVhY29uCisJCQkJICogZm9ybWF0Iikgd2hlbiByZXR1cm5pbmcgdG8gc2VydmljZSBjaG5sOgorCQkJCSAqIDM5NDU7IDMxOjI0ICMgYmVhY29ucywgMTk6MCBhZGRpdGlvbmFsIHVzZWMsCisJCQkJICogNDk2NTsgMzE6MjIgIyBiZWFjb25zLCAyMTowIGFkZGl0aW9uYWwgdXNlYy4KKwkJCQkgKi8KKwlfX2xlMzIgZmxhZ3M7CQkvKiBSWE9OX0ZMR18qICovCisJX19sZTMyIGZpbHRlcl9mbGFnczsJLyogUlhPTl9GSUxURVJfKiAqLworCisJLyogRm9yIGFjdGl2ZSBzY2FucyAoc2V0IHRvIGFsbC0wcyBmb3IgcGFzc2l2ZSBzY2FucykuCisJICogRG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkLiAgTXVzdCBzcGVjaWZ5IFR4IHJhdGU7IG5vIHJhdGUgc2NhbGluZy4gKi8KKwlzdHJ1Y3QgaWxfdHhfY21kIHR4X2NtZDsKKworCS8qIEZvciBkaXJlY3RlZCBhY3RpdmUgc2NhbnMgKHNldCB0byBhbGwtMHMgb3RoZXJ3aXNlKSAqLworCXN0cnVjdCBpbF9zc2lkX2llIGRpcmVjdF9zY2FuW1BST0JFX09QVElPTl9NQVhdOworCisJLyoKKwkgKiBQcm9iZSByZXF1ZXN0IGZyYW1lLCBmb2xsb3dlZCBieSBjaGFubmVsIGxpc3QuCisJICoKKwkgKiBTaXplIG9mIHByb2JlIHJlcXVlc3QgZnJhbWUgaXMgc3BlY2lmaWVkIGJ5IGJ5dGUgY291bnQgaW4gdHhfY21kLgorCSAqIENoYW5uZWwgbGlzdCBmb2xsb3dzIGltbWVkaWF0ZWx5IGFmdGVyIHByb2JlIHJlcXVlc3QgZnJhbWUuCisJICogTnVtYmVyIG9mIGNoYW5uZWxzIGluIGxpc3QgaXMgc3BlY2lmaWVkIGJ5IGNoYW5uZWxfY291bnQuCisJICogRWFjaCBjaGFubmVsIGluIGxpc3QgaXMgb2YgdHlwZToKKwkgKgorCSAqIHN0cnVjdCBpbF9zY2FuX2NoYW5uZWwgY2hhbm5lbHNbMF07CisJICoKKwkgKiBOT1RFOiAgT25seSBvbmUgYmFuZCBvZiBjaGFubmVscyBjYW4gYmUgc2Nhbm5lZCBwZXIgcGFzcy4gIFlvdQorCSAqIG11c3Qgbm90IG1peCAyLjRHSHogY2hhbm5lbHMgYW5kIDUuMkdIeiBjaGFubmVscywgYW5kIHlvdSBtdXN0IHdhaXQKKwkgKiBmb3Igb25lIHNjYW4gdG8gY29tcGxldGUgKGkuZS4gcmVjZWl2ZSBOX1NDQU5fQ09NUExFVEUpCisJICogYmVmb3JlIHJlcXVlc3RpbmcgYW5vdGhlciBzY2FuLgorCSAqLworCXU4IGRhdGFbMF07Cit9IF9fcGFja2VkOworCisvKiBDYW4gYWJvcnQgd2lsbCBub3RpZnkgYnkgY29tcGxldGUgbm90aWZpY2F0aW9uIHdpdGggYWJvcnQgc3RhdHVzLiAqLworI2RlZmluZSBDQU5fQUJPUlRfU1RBVFVTCWNwdV90b19sZTMyKDB4MSkKKy8qIGNvbXBsZXRlIG5vdGlmaWNhdGlvbiBzdGF0dXNlcyAqLworI2RlZmluZSBBQk9SVF9TVEFUVVMgICAgICAgICAgICAweDIKKworLyoKKyAqIENfU0NBTiA9IDB4ODAgKHJlc3BvbnNlKQorICovCitzdHJ1Y3QgaWxfc2NhbnJlcV9ub3RpZmljYXRpb24geworCV9fbGUzMiBzdGF0dXM7CQkvKiAxOiBva2F5LCAyOiBjYW5ub3QgZnVsZmlsbCByZXF1ZXN0ICovCit9IF9fcGFja2VkOworCisvKgorICogTl9TQ0FOX1NUQVJUID0gMHg4MiAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKi8KK3N0cnVjdCBpbF9zY2Fuc3RhcnRfbm90aWZpY2F0aW9uIHsKKwlfX2xlMzIgdHNmX2xvdzsKKwlfX2xlMzIgdHNmX2hpZ2g7CisJX19sZTMyIGJlYWNvbl90aW1lcjsKKwl1OCBjaGFubmVsOworCXU4IGJhbmQ7CisJdTggcmVzZXJ2ZWRbMl07CisJX19sZTMyIHN0YXR1czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgIFNDQU5fT1dORVJfU1RBVFVTIDB4MQorI2RlZmluZSAgTUVBU1VSRV9PV05FUl9TVEFUVVMgMHgyCisKKyNkZWZpbmUgSUxfUFJPQkVfU1RBVFVTX09LCQkwCisjZGVmaW5lIElMX1BST0JFX1NUQVRVU19UWF9GQUlMRUQJQklUKDApCisvKiBlcnJvciBzdGF0dXNlcyBjb21iaW5lZCB3aXRoIFRYX0ZBSUxFRCAqLworI2RlZmluZSBJTF9QUk9CRV9TVEFUVVNfRkFJTF9UVEwJQklUKDEpCisjZGVmaW5lIElMX1BST0JFX1NUQVRVU19GQUlMX0JUCUJJVCgyKQorCisjZGVmaW5lIE5VTUJFUl9PRl9TVEFUUyAxCS8qIGZpcnN0IF9fbGUzMiBpcyBnb29kIENSQyAqLworLyoKKyAqIE5fU0NBTl9SRVNVTFRTID0gMHg4MyAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKi8KK3N0cnVjdCBpbF9zY2FucmVzdWx0c19ub3RpZmljYXRpb24geworCXU4IGNoYW5uZWw7CisJdTggYmFuZDsKKwl1OCBwcm9iZV9zdGF0dXM7CisJdTggbnVtX3Byb2JlX25vdF9zZW50OwkvKiBub3QgZW5vdWdoIHRpbWUgdG8gc2VuZCAqLworCV9fbGUzMiB0c2ZfbG93OworCV9fbGUzMiB0c2ZfaGlnaDsKKwlfX2xlMzIgc3RhdHNbTlVNQkVSX09GX1NUQVRTXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBOX1NDQU5fQ09NUExFVEUgPSAweDg0IChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqLworc3RydWN0IGlsX3NjYW5jb21wbGV0ZV9ub3RpZmljYXRpb24geworCXU4IHNjYW5uZWRfY2hhbm5lbHM7CisJdTggc3RhdHVzOworCXU4IGxhc3RfY2hhbm5lbDsKKwlfX2xlMzIgdHNmX2xvdzsKKwlfX2xlMzIgdHNmX2hpZ2g7Cit9IF9fcGFja2VkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoOSkKKyAqIElCU1MvQVAgQ29tbWFuZHMgYW5kIE5vdGlmaWNhdGlvbnM6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIGlsX2lic3NfbWFuYWdlciB7CisJSUxfTk9UX0lCU1NfTUFOQUdFUiA9IDAsCisJSUxfSUJTU19NQU5BR0VSID0gMSwKK307CisKKy8qCisgKiBOX0JFQUNPTiA9IDB4OTAgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICovCisKK3N0cnVjdCBpbDM5NDVfYmVhY29uX25vdGlmIHsKKwlzdHJ1Y3QgaWwzOTQ1X3R4X3Jlc3AgYmVhY29uX25vdGlmeV9oZHI7CisJX19sZTMyIGxvd190c2Y7CisJX19sZTMyIGhpZ2hfdHNmOworCV9fbGUzMiBpYnNzX21ncl9zdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWw0OTY1X2JlYWNvbl9ub3RpZiB7CisJc3RydWN0IGlsNDk2NV90eF9yZXNwIGJlYWNvbl9ub3RpZnlfaGRyOworCV9fbGUzMiBsb3dfdHNmOworCV9fbGUzMiBoaWdoX3RzZjsKKwlfX2xlMzIgaWJzc19tZ3Jfc3RhdHVzOworfSBfX3BhY2tlZDsKKworLyoKKyAqIENfVFhfQkVBQ09OPSAweDkxIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKi8KKworc3RydWN0IGlsMzk0NV90eF9iZWFjb25fY21kIHsKKwlzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCB0eDsKKwlfX2xlMTYgdGltX2lkeDsKKwl1OCB0aW1fc2l6ZTsKKwl1OCByZXNlcnZlZDE7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWVbMF07CS8qIGJlYWNvbiBmcmFtZSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsX3R4X2JlYWNvbl9jbWQgeworCXN0cnVjdCBpbF90eF9jbWQgdHg7CisJX19sZTE2IHRpbV9pZHg7CisJdTggdGltX3NpemU7CisJdTggcmVzZXJ2ZWQxOworCXN0cnVjdCBpZWVlODAyMTFfaGRyIGZyYW1lWzBdOwkvKiBiZWFjb24gZnJhbWUgKi8KK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICgxMCkKKyAqIFN0YXRpc3RpY3MgQ29tbWFuZHMgYW5kIE5vdGlmaWNhdGlvbnM6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElMX1RFTVBfQ09OVkVSVCAyNjAKKworI2RlZmluZSBTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMUyAgOAorI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgNAorI2RlZmluZSBTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMUyAgMTIKKworLyogVXNlZCBmb3IgcGFzc2luZyB0byBkcml2ZXIgbnVtYmVyIG9mIHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMgcGVyIHJhdGUgKi8KK3N0cnVjdCByYXRlX2hpc3RvZ3JhbSB7CisJdW5pb24geworCQlfX2xlMzIgYVtTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMU107CisJCV9fbGUzMiBiW1NVUF9SQVRFXzExQl9NQVhfTlVNX0NIQU5ORUxTXTsKKwkJX19sZTMyIGdbU1VQX1JBVEVfMTFHX01BWF9OVU1fQ0hBTk5FTFNdOworCX0gc3VjY2VzczsKKwl1bmlvbiB7CisJCV9fbGUzMiBhW1NVUF9SQVRFXzExQV9NQVhfTlVNX0NIQU5ORUxTXTsKKwkJX19sZTMyIGJbU1VQX1JBVEVfMTFCX01BWF9OVU1fQ0hBTk5FTFNdOworCQlfX2xlMzIgZ1tTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMU107CisJfSBmYWlsZWQ7Cit9IF9fcGFja2VkOworCisvKiBzdGF0cyBjb21tYW5kIHJlc3BvbnNlICovCisKK3N0cnVjdCBpd2wzOV9zdGF0c19yeF9waHkgeworCV9fbGUzMiBpbmFfY250OworCV9fbGUzMiBmaW5hX2NudDsKKwlfX2xlMzIgcGxjcF9lcnI7CisJX19sZTMyIGNyYzMyX2VycjsKKwlfX2xlMzIgb3ZlcnJ1bl9lcnI7CisJX19sZTMyIGVhcmx5X292ZXJydW5fZXJyOworCV9fbGUzMiBjcmMzMl9nb29kOworCV9fbGUzMiBmYWxzZV9hbGFybV9jbnQ7CisJX19sZTMyIGZpbmFfc3luY19lcnJfY250OworCV9fbGUzMiBzZmRfdGltZW91dDsKKwlfX2xlMzIgZmluYV90aW1lb3V0OworCV9fbGUzMiB1bnJlc3BvbmRlZF9ydHM7CisJX19sZTMyIHJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuOworCV9fbGUzMiBzZW50X2Fja19jbnQ7CisJX19sZTMyIHNlbnRfY3RzX2NudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpd2wzOV9zdGF0c19yeF9ub25fcGh5IHsKKwlfX2xlMzIgYm9ndXNfY3RzOwkvKiBDVFMgcmVjZWl2ZWQgd2hlbiBub3QgZXhwZWN0aW5nIENUUyAqLworCV9fbGUzMiBib2d1c19hY2s7CS8qIEFDSyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQUNLICovCisJX19sZTMyIG5vbl9ic3NpZF9mcmFtZXM7CS8qIG51bWJlciBvZiBmcmFtZXMgd2l0aCBCU1NJRCB0aGF0CisJCQkJCSAqIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBTVEEgQlNTSUQgKi8KKwlfX2xlMzIgZmlsdGVyZWRfZnJhbWVzOwkvKiBjb3VudCBmcmFtZXMgdGhhdCB3ZXJlIGR1bXBlZCBpbiB0aGUKKwkJCQkgKiBmaWx0ZXJpbmcgcHJvY2VzcyAqLworCV9fbGUzMiBub25fY2hhbm5lbF9iZWFjb25zOwkvKiBiZWFjb25zIHdpdGggb3VyIGJzcyBpZCBidXQgbm90IG9uCisJCQkJCSAqIG91ciBzZXJ2aW5nIGNoYW5uZWwgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpd2wzOV9zdGF0c19yeCB7CisJc3RydWN0IGl3bDM5X3N0YXRzX3J4X3BoeSBvZmRtOworCXN0cnVjdCBpd2wzOV9zdGF0c19yeF9waHkgY2NrOworCXN0cnVjdCBpd2wzOV9zdGF0c19yeF9ub25fcGh5IGdlbmVyYWw7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaXdsMzlfc3RhdHNfdHggeworCV9fbGUzMiBwcmVhbWJsZV9jbnQ7CisJX19sZTMyIHJ4X2RldGVjdGVkX2NudDsKKwlfX2xlMzIgYnRfcHJpb19kZWZlcl9jbnQ7CisJX19sZTMyIGJ0X3ByaW9fa2lsbF9jbnQ7CisJX19sZTMyIGZld19ieXRlc19jbnQ7CisJX19sZTMyIGN0c190aW1lb3V0OworCV9fbGUzMiBhY2tfdGltZW91dDsKKwlfX2xlMzIgZXhwZWN0ZWRfYWNrX2NudDsKKwlfX2xlMzIgYWN0dWFsX2Fja19jbnQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3RhdHNfZGJnIHsKKwlfX2xlMzIgYnVyc3RfY2hlY2s7CisJX19sZTMyIGJ1cnN0X2NvdW50OworCV9fbGUzMiB3YWl0X2Zvcl9zaWxlbmNlX3RpbWVvdXRfY250OworCV9fbGUzMiByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpd2wzOV9zdGF0c19kaXYgeworCV9fbGUzMiB0eF9vbl9hOworCV9fbGUzMiB0eF9vbl9iOworCV9fbGUzMiBleGVjX3RpbWU7CisJX19sZTMyIHByb2JlX3RpbWU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaXdsMzlfc3RhdHNfZ2VuZXJhbCB7CisJX19sZTMyIHRlbXBlcmF0dXJlOworCXN0cnVjdCBzdGF0c19kYmcgZGJnOworCV9fbGUzMiBzbGVlcF90aW1lOworCV9fbGUzMiBzbG90c19vdXQ7CisJX19sZTMyIHNsb3RzX2lkbGU7CisJX19sZTMyIHR0bF90aW1lc3RhbXA7CisJc3RydWN0IGl3bDM5X3N0YXRzX2RpdiBkaXY7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3RhdHNfcnhfcGh5IHsKKwlfX2xlMzIgaW5hX2NudDsKKwlfX2xlMzIgZmluYV9jbnQ7CisJX19sZTMyIHBsY3BfZXJyOworCV9fbGUzMiBjcmMzMl9lcnI7CisJX19sZTMyIG92ZXJydW5fZXJyOworCV9fbGUzMiBlYXJseV9vdmVycnVuX2VycjsKKwlfX2xlMzIgY3JjMzJfZ29vZDsKKwlfX2xlMzIgZmFsc2VfYWxhcm1fY250OworCV9fbGUzMiBmaW5hX3N5bmNfZXJyX2NudDsKKwlfX2xlMzIgc2ZkX3RpbWVvdXQ7CisJX19sZTMyIGZpbmFfdGltZW91dDsKKwlfX2xlMzIgdW5yZXNwb25kZWRfcnRzOworCV9fbGUzMiByeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bjsKKwlfX2xlMzIgc2VudF9hY2tfY250OworCV9fbGUzMiBzZW50X2N0c19jbnQ7CisJX19sZTMyIHNlbnRfYmFfcnNwX2NudDsKKwlfX2xlMzIgZHNwX3NlbGZfa2lsbDsKKwlfX2xlMzIgbWhfZm9ybWF0X2VycjsKKwlfX2xlMzIgcmVfYWNxX21haW5fcnNzaV9zdW07CisJX19sZTMyIHJlc2VydmVkMzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzdGF0c19yeF9odF9waHkgeworCV9fbGUzMiBwbGNwX2VycjsKKwlfX2xlMzIgb3ZlcnJ1bl9lcnI7CisJX19sZTMyIGVhcmx5X292ZXJydW5fZXJyOworCV9fbGUzMiBjcmMzMl9nb29kOworCV9fbGUzMiBjcmMzMl9lcnI7CisJX19sZTMyIG1oX2Zvcm1hdF9lcnI7CisJX19sZTMyIGFnZ19jcmMzMl9nb29kOworCV9fbGUzMiBhZ2dfbXBkdV9jbnQ7CisJX19sZTMyIGFnZ19jbnQ7CisJX19sZTMyIHVuc3VwcG9ydF9tY3M7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSAgICAgIGNwdV90b19sZTMyKDEpCisKK3N0cnVjdCBzdGF0c19yeF9ub25fcGh5IHsKKwlfX2xlMzIgYm9ndXNfY3RzOwkvKiBDVFMgcmVjZWl2ZWQgd2hlbiBub3QgZXhwZWN0aW5nIENUUyAqLworCV9fbGUzMiBib2d1c19hY2s7CS8qIEFDSyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQUNLICovCisJX19sZTMyIG5vbl9ic3NpZF9mcmFtZXM7CS8qIG51bWJlciBvZiBmcmFtZXMgd2l0aCBCU1NJRCB0aGF0CisJCQkJCSAqIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBTVEEgQlNTSUQgKi8KKwlfX2xlMzIgZmlsdGVyZWRfZnJhbWVzOwkvKiBjb3VudCBmcmFtZXMgdGhhdCB3ZXJlIGR1bXBlZCBpbiB0aGUKKwkJCQkgKiBmaWx0ZXJpbmcgcHJvY2VzcyAqLworCV9fbGUzMiBub25fY2hhbm5lbF9iZWFjb25zOwkvKiBiZWFjb25zIHdpdGggb3VyIGJzcyBpZCBidXQgbm90IG9uCisJCQkJCSAqIG91ciBzZXJ2aW5nIGNoYW5uZWwgKi8KKwlfX2xlMzIgY2hhbm5lbF9iZWFjb25zOwkvKiBiZWFjb25zIHdpdGggb3VyIGJzcyBpZCBhbmQgaW4gb3VyCisJCQkJICogc2VydmluZyBjaGFubmVsICovCisJX19sZTMyIG51bV9taXNzZWRfYmNvbjsJLyogbnVtYmVyIG9mIG1pc3NlZCBiZWFjb25zICovCisJX19sZTMyIGFkY19yeF9zYXR1cmF0aW9uX3RpbWU7CS8qIGNvdW50IGluIDAuOHVzIHVuaXRzIHRoZSB0aW1lIHRoZQorCQkJCQkgKiBBREMgd2FzIGluIHNhdHVyYXRpb24gKi8KKwlfX2xlMzIgaW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZTsJLyogdG90YWwgdGltZSAoaW4gMC44dXMpIHNlYXJjaGVkCisJCQkJCQkgKiBmb3IgSU5BICovCisJX19sZTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYTsJLyogUlNTSSBzaWxlbmNlIGFmdGVyIGJlYWNvbiBmcmFtZSAqLworCV9fbGUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2I7CS8qIFJTU0kgc2lsZW5jZSBhZnRlciBiZWFjb24gZnJhbWUgKi8KKwlfX2xlMzIgYmVhY29uX3NpbGVuY2VfcnNzaV9jOwkvKiBSU1NJIHNpbGVuY2UgYWZ0ZXIgYmVhY29uIGZyYW1lICovCisJX19sZTMyIGludGVyZmVyZW5jZV9kYXRhX2ZsYWc7CS8qIGZsYWcgZm9yIGludGVyZmVyZW5jZSBkYXRhCisJCQkJCSAqIGF2YWlsYWJpbGl0eS4gMSB3aGVuIGRhdGEgaXMKKwkJCQkJICogYXZhaWxhYmxlLiAqLworCV9fbGUzMiBjaGFubmVsX2xvYWQ7CS8qIGNvdW50cyBSWCBFbmFibGUgdGltZSBpbiB1U2VjICovCisJX19sZTMyIGRzcF9mYWxzZV9hbGFybXM7CS8qIERTUCBmYWxzZSBhbGFybSAoYm90aCBPRkRNCisJCQkJCSAqIGFuZCBDQ0spIGNvdW50ZXIgKi8KKwlfX2xlMzIgYmVhY29uX3Jzc2lfYTsKKwlfX2xlMzIgYmVhY29uX3Jzc2lfYjsKKwlfX2xlMzIgYmVhY29uX3Jzc2lfYzsKKwlfX2xlMzIgYmVhY29uX2VuZXJneV9hOworCV9fbGUzMiBiZWFjb25fZW5lcmd5X2I7CisJX19sZTMyIGJlYWNvbl9lbmVyZ3lfYzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzdGF0c19yeCB7CisJc3RydWN0IHN0YXRzX3J4X3BoeSBvZmRtOworCXN0cnVjdCBzdGF0c19yeF9waHkgY2NrOworCXN0cnVjdCBzdGF0c19yeF9ub25fcGh5IGdlbmVyYWw7CisJc3RydWN0IHN0YXRzX3J4X2h0X3BoeSBvZmRtX2h0OworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3Qgc3RhdHNfdHhfcG93ZXIgLSBjdXJyZW50IHR4IHBvd2VyCisgKgorICogQGFudF9hOiBjdXJyZW50IHR4IHBvd2VyIG9uIGNoYWluIGEgaW4gMS8yIGRCIHN0ZXAKKyAqIEBhbnRfYjogY3VycmVudCB0eCBwb3dlciBvbiBjaGFpbiBiIGluIDEvMiBkQiBzdGVwCisgKiBAYW50X2M6IGN1cnJlbnQgdHggcG93ZXIgb24gY2hhaW4gYyBpbiAxLzIgZEIgc3RlcAorICovCitzdHJ1Y3Qgc3RhdHNfdHhfcG93ZXIgeworCXU4IGFudF9hOworCXU4IGFudF9iOworCXU4IGFudF9jOworCXU4IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworc3RydWN0IHN0YXRzX3R4X25vbl9waHlfYWdnIHsKKwlfX2xlMzIgYmFfdGltZW91dDsKKwlfX2xlMzIgYmFfcmVzY2hlZHVsZV9mcmFtZXM7CisJX19sZTMyIHNjZF9xdWVyeV9hZ2dfZnJhbWVfY250OworCV9fbGUzMiBzY2RfcXVlcnlfbm9fYWdnOworCV9fbGUzMiBzY2RfcXVlcnlfYWdnOworCV9fbGUzMiBzY2RfcXVlcnlfbWlzbWF0Y2g7CisJX19sZTMyIGZyYW1lX25vdF9yZWFkeTsKKwlfX2xlMzIgdW5kZXJydW47CisJX19sZTMyIGJ0X3ByaW9fa2lsbDsKKwlfX2xlMzIgcnhfYmFfcnNwX2NudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzdGF0c190eCB7CisJX19sZTMyIHByZWFtYmxlX2NudDsKKwlfX2xlMzIgcnhfZGV0ZWN0ZWRfY250OworCV9fbGUzMiBidF9wcmlvX2RlZmVyX2NudDsKKwlfX2xlMzIgYnRfcHJpb19raWxsX2NudDsKKwlfX2xlMzIgZmV3X2J5dGVzX2NudDsKKwlfX2xlMzIgY3RzX3RpbWVvdXQ7CisJX19sZTMyIGFja190aW1lb3V0OworCV9fbGUzMiBleHBlY3RlZF9hY2tfY250OworCV9fbGUzMiBhY3R1YWxfYWNrX2NudDsKKwlfX2xlMzIgZHVtcF9tc2R1X2NudDsKKwlfX2xlMzIgYnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQ7CisJX19sZTMyIGJ1cnN0X2Fib3J0X21pc3NpbmdfbmV4dF9mcmFtZV9jbnQ7CisJX19sZTMyIGN0c190aW1lb3V0X2NvbGxpc2lvbjsKKwlfX2xlMzIgYWNrX29yX2JhX3RpbWVvdXRfY29sbGlzaW9uOworCXN0cnVjdCBzdGF0c190eF9ub25fcGh5X2FnZyBhZ2c7CisKKwlfX2xlMzIgcmVzZXJ2ZWQxOworfSBfX3BhY2tlZDsKKworc3RydWN0IHN0YXRzX2RpdiB7CisJX19sZTMyIHR4X29uX2E7CisJX19sZTMyIHR4X29uX2I7CisJX19sZTMyIGV4ZWNfdGltZTsKKwlfX2xlMzIgcHJvYmVfdGltZTsKKwlfX2xlMzIgcmVzZXJ2ZWQxOworCV9fbGUzMiByZXNlcnZlZDI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3RhdHNfZ2VuZXJhbF9jb21tb24geworCV9fbGUzMiB0ZW1wZXJhdHVyZTsJLyogcmFkaW8gdGVtcGVyYXR1cmUgKi8KKwlzdHJ1Y3Qgc3RhdHNfZGJnIGRiZzsKKwlfX2xlMzIgc2xlZXBfdGltZTsKKwlfX2xlMzIgc2xvdHNfb3V0OworCV9fbGUzMiBzbG90c19pZGxlOworCV9fbGUzMiB0dGxfdGltZXN0YW1wOworCXN0cnVjdCBzdGF0c19kaXYgZGl2OworCV9fbGUzMiByeF9lbmFibGVfY291bnRlcjsKKwkvKgorCSAqIG51bV9vZl9zb3Nfc3RhdGVzOgorCSAqICBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGhhdmUgdG8gcmUtdHVuZQorCSAqICBpbiBvcmRlciB0byBnZXQgb3V0IG9mIGJhZCBQSFkgc3RhdHVzCisJICovCisJX19sZTMyIG51bV9vZl9zb3Nfc3RhdGVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IHN0YXRzX2dlbmVyYWwgeworCXN0cnVjdCBzdGF0c19nZW5lcmFsX2NvbW1vbiBjb21tb247CisJX19sZTMyIHJlc2VydmVkMjsKKwlfX2xlMzIgcmVzZXJ2ZWQzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBVQ09ERV9TVEFUU19DTEVBUl9NU0sJCSgweDEgPDwgMCkKKyNkZWZpbmUgVUNPREVfU1RBVFNfRlJFUVVFTkNZX01TSwkJKDB4MSA8PCAxKQorI2RlZmluZSBVQ09ERV9TVEFUU19OQVJST1dfQkFORF9NU0sJKDB4MSA8PCAyKQorCisvKgorICogQ19TVEFUUyA9IDB4OWMsCisgKiBhbGwgZGV2aWNlcyBpZGVudGljYWwuCisgKgorICogVGhpcyBjb21tYW5kIHRyaWdnZXJzIGFuIGltbWVkaWF0ZSByZXNwb25zZSBjb250YWluaW5nIHVDb2RlIHN0YXRzLgorICogVGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyBOX1NUQVRTIDB4OWQsIGJlbG93LgorICoKKyAqIElmIHRoZSBDTEVBUl9TVEFUUyBjb25maWd1cmF0aW9uIGZsYWcgaXMgc2V0LCB1Q29kZSB3aWxsIGNsZWFyIGl0cworICogaW50ZXJuYWwgY29weSBvZiB0aGUgc3RhdHMgKGNvdW50ZXJzKSBhZnRlciBpc3N1aW5nIHRoZSByZXNwb25zZS4KKyAqIFRoaXMgZmxhZyBkb2VzIG5vdCBhZmZlY3QgTl9TVEFUU3MgYWZ0ZXIgYmVhY29ucyAoc2VlIGJlbG93KS4KKyAqCisgKiBJZiB0aGUgRElTQUJMRV9OT1RJRiBjb25maWd1cmF0aW9uIGZsYWcgaXMgc2V0LCB1Q29kZSB3aWxsIG5vdCBpc3N1ZQorICogTl9TVEFUU3MgYWZ0ZXIgcmVjZWl2ZWQgYmVhY29ucyAoc2VlIGJlbG93KS4gIFRoaXMgZmxhZworICogZG9lcyBub3QgYWZmZWN0IHRoZSByZXNwb25zZSB0byB0aGUgQ19TVEFUUyAweDljIGl0c2VsZi4KKyAqLworI2RlZmluZSBJTF9TVEFUU19DT05GX0NMRUFSX1NUQVRTIGNwdV90b19sZTMyKDB4MSkJLyogc2VlIGFib3ZlICovCisjZGVmaW5lIElMX1NUQVRTX0NPTkZfRElTQUJMRV9OT1RJRiBjcHVfdG9fbGUzMigweDIpCS8qIHNlZSBhYm92ZSAqLworc3RydWN0IGlsX3N0YXRzX2NtZCB7CisJX19sZTMyIGNvbmZpZ3VyYXRpb25fZmxhZ3M7CS8qIElMX1NUQVRTX0NPTkZfKiAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIE5fU1RBVFMgPSAweDlkIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqCisgKiBCeSBkZWZhdWx0LCB1Q29kZSBpc3N1ZXMgdGhpcyBub3RpZmljYXRpb24gYWZ0ZXIgcmVjZWl2aW5nIGEgYmVhY29uCisgKiB3aGlsZSBhc3NvY2lhdGVkLiAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLCBzZXQgRElTQUJMRV9OT1RJRiBmbGFnIGluIHRoZQorICogQ19TVEFUUyAweDljLCBhYm92ZS4KKyAqCisgKiBTdGF0aXN0aWNzIGNvdW50ZXJzIGNvbnRpbnVlIHRvIGluY3JlbWVudCBiZWFjb24gYWZ0ZXIgYmVhY29uLCBidXQgYXJlCisgKiBjbGVhcmVkIHdoZW4gY2hhbmdpbmcgY2hhbm5lbHMgb3Igd2hlbiBkcml2ZXIgaXNzdWVzIENfU1RBVFMKKyAqIDB4OWMgd2l0aCBDTEVBUl9TVEFUUyBiaXQgc2V0IChzZWUgYWJvdmUpLgorICoKKyAqIHVDb2RlIGFsc28gaXNzdWVzIHRoaXMgbm90aWZpY2F0aW9uIGR1cmluZyBzY2Fucy4gIHVDb2RlIGNsZWFycyBzdGF0cworICogYXBwcm9wcmlhdGVseSBzbyB0aGF0IGVhY2ggbm90aWZpY2F0aW9uIGNvbnRhaW5zIHN0YXRzIGZvciBvbmx5IHRoZQorICogb25lIGNoYW5uZWwgdGhhdCBoYXMganVzdCBiZWVuIHNjYW5uZWQuCisgKi8KKyNkZWZpbmUgU1RBVFNfUkVQTFlfRkxHX0JBTkRfMjRHX01TSyAgICAgICAgIGNwdV90b19sZTMyKDB4MikKKyNkZWZpbmUgU1RBVFNfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0sgICAgICAgIGNwdV90b19sZTMyKDB4OCkKKworc3RydWN0IGlsMzk0NV9ub3RpZl9zdGF0cyB7CisJX19sZTMyIGZsYWc7CisJc3RydWN0IGl3bDM5X3N0YXRzX3J4IHJ4OworCXN0cnVjdCBpd2wzOV9zdGF0c190eCB0eDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfZ2VuZXJhbCBnZW5lcmFsOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsX25vdGlmX3N0YXRzIHsKKwlfX2xlMzIgZmxhZzsKKwlzdHJ1Y3Qgc3RhdHNfcnggcng7CisJc3RydWN0IHN0YXRzX3R4IHR4OworCXN0cnVjdCBzdGF0c19nZW5lcmFsIGdlbmVyYWw7Cit9IF9fcGFja2VkOworCisvKgorICogTl9NSVNTRURfQkVBQ09OUyA9IDB4YTIgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICoKKyAqIHVDb2RlIHNlbmQgTl9NSVNTRURfQkVBQ09OUyB0byBkcml2ZXIgd2hlbiBkZXRlY3QgYmVhY29uIG1pc3NlZAorICogaW4gcmVnYXJkbGVzcyBvZiBob3cgbWFueSBtaXNzZWQgYmVhY29ucywgd2hpY2ggbWVhbiB3aGVuIGRyaXZlciByZWNlaXZlIHRoZQorICogbm90aWZpY2F0aW9uLCBpbnNpZGUgdGhlIGNvbW1hbmQsIGl0IGNhbiBmaW5kIGFsbCB0aGUgYmVhY29ucyBpbmZvcm1hdGlvbgorICogd2hpY2ggaW5jbHVkZSBudW1iZXIgb2YgdG90YWwgbWlzc2VkIGJlYWNvbnMsIG51bWJlciBvZiBjb25zZWN1dGl2ZSBtaXNzZWQKKyAqIGJlYWNvbnMsIG51bWJlciBvZiBiZWFjb25zIHJlY2VpdmVkIGFuZCBudW1iZXIgb2YgYmVhY29ucyBleHBlY3RlZCB0bworICogcmVjZWl2ZS4KKyAqCisgKiBJZiB1Q29kZSBkZXRlY3RlZCBjb25zZWN1dGl2ZV9taXNzZWRfYmVhY29ucyA+IDUsIGl0IHdpbGwgcmVzZXQgdGhlIHJhZGlvCisgKiBpbiBvcmRlciB0byBicmluZyB0aGUgcmFkaW8vUEhZIGJhY2sgdG8gd29ya2luZyBzdGF0ZTsgd2hpY2ggaGFzIG5vIHJlbGF0aW9uCisgKiB0byB3aGVuIGRyaXZlciB3aWxsIHBlcmZvcm0gc2Vuc2l0aXZpdHkgY2FsaWJyYXRpb24uCisgKgorICogRHJpdmVyIHNob3VsZCBzZXQgaXQgb3duIG1pc3NlZF9iZWFjb25fdGhyZXNob2xkIHRvIGRlY2lkZSB3aGVuIHRvIHBlcmZvcm0KKyAqIHNlbnNpdGl2aXR5IGNhbGlicmF0aW9uIGJhc2VkIG9uIG51bWJlciBvZiBjb25zZWN1dGl2ZSBtaXNzZWQgYmVhY29ucyBpbgorICogb3JkZXIgdG8gaW1wcm92ZSBvdmVyYWxsIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IGluIG5vaXN5IGVudmlyb25tZW50LgorICoKKyAqLworCisjZGVmaW5lIElMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX01JTgkoMSkKKyNkZWZpbmUgSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGCSg1KQorI2RlZmluZSBJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9NQVgJSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGCisKK3N0cnVjdCBpbF9taXNzZWRfYmVhY29uX25vdGlmIHsKKwlfX2xlMzIgY29uc2VjdXRpdmVfbWlzc2VkX2JlYWNvbnM7CisJX19sZTMyIHRvdGFsX21pc3NlZF9iZWNvbnM7CisJX19sZTMyIG51bV9leHBlY3RlZF9iZWFjb25zOworCV9fbGUzMiBudW1fcmVjdmRfYmVhY29uczsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICgxMSkKKyAqIFJ4IENhbGlicmF0aW9uIENvbW1hbmRzOgorICoKKyAqIFdpdGggdGhlIHVDb2RlIHVzZWQgZm9yIG9wZW4gc291cmNlIGRyaXZlcnMsIG1vc3QgVHggY2FsaWJyYXRpb24gKGV4Y2VwdAorICogZm9yIFR4IFBvd2VyKSBhbmQgbW9zdCBSeCBjYWxpYnJhdGlvbiBpcyBkb25lIGJ5IHVDb2RlIGR1cmluZyB0aGUKKyAqICJpbml0aWFsaXplIiBwaGFzZSBvZiB1Q29kZSBib290LiAgRHJpdmVyIG11c3QgY2FsaWJyYXRlIG9ubHk6CisgKgorICogMSkgIFR4IHBvd2VyIChkZXBlbmRzIG9uIHRlbXBlcmF0dXJlKSwgZGVzY3JpYmVkIGVsc2V3aGVyZQorICogMikgIFJlY2VpdmVyIGdhaW4gYmFsYW5jZSAob3B0aW1pemUgTUlNTywgYW5kIGRldGVjdCBkaXNjb25uZWN0ZWQgYW50ZW5uYXMpCisgKiAzKSAgUmVjZWl2ZXIgc2Vuc2l0aXZpdHkgKHRvIG9wdGltaXplIHNpZ25hbCBkZXRlY3Rpb24pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIENfU0VOU0lUSVZJVFkgPSAweGE4IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKgorICogVGhpcyBjb21tYW5kIHNldHMgdXAgdGhlIFJ4IHNpZ25hbCBkZXRlY3RvciBmb3IgYSBzZW5zaXRpdml0eSBsZXZlbCB0aGF0CisgKiBpcyBoaWdoIGVub3VnaCB0byBsb2NrIG9udG8gYWxsIHNpZ25hbHMgd2l0aGluIHRoZSBhc3NvY2lhdGVkIG5ldHdvcmssCisgKiBidXQgbG93IGVub3VnaCB0byBpZ25vcmUgc2lnbmFscyB0aGF0IGFyZSBiZWxvdyBhIGNlcnRhaW4gdGhyZXNob2xkLCBzbyBhcworICogbm90IHRvIGhhdmUgdG9vIG1hbnkgImZhbHNlIGFsYXJtcyIuICBGYWxzZSBhbGFybXMgYXJlIHNpZ25hbHMgdGhhdCB0aGUKKyAqIFJ4IERTUCB0cmllcyB0byBsb2NrIG9udG8sIGJ1dCB0aGVuIGRpc2NhcmRzIGFmdGVyIGRldGVybWluaW5nIHRoYXQgdGhleQorICogYXJlIG5vaXNlLgorICoKKyAqIFRoZSBvcHRpbXVtIG51bWJlciBvZiBmYWxzZSBhbGFybXMgaXMgYmV0d2VlbiA1IGFuZCA1MCBwZXIgMjAwIFRVcworICogKDIwMCAqIDEwMjQgdVNlY3MsIGkuZS4gMjA0LjggbWlsbGlzZWNvbmRzKSBvZiBhY3R1YWwgUnggdGltZSAoaS5lLgorICogdGltZSBsaXN0ZW5pbmcsIG5vdCB0cmFuc21pdHRpbmcpLiAgRHJpdmVyIG11c3QgYWRqdXN0IHNlbnNpdGl2aXR5IHNvIHRoYXQKKyAqIHRoZSByYXRpbyBvZiBhY3R1YWwgZmFsc2UgYWxhcm1zIHRvIGFjdHVhbCBSeCB0aW1lIGZhbGxzIHdpdGhpbiB0aGlzIHJhbmdlLgorICoKKyAqIFdoaWxlIGFzc29jaWF0ZWQsIHVDb2RlIGRlbGl2ZXJzIE5fU1RBVFNzIGFmdGVyIGVhY2gKKyAqIHJlY2VpdmVkIGJlYWNvbi4gIFRoZXNlIHByb3ZpZGUgaW5mb3JtYXRpb24gdG8gdGhlIGRyaXZlciB0byBhbmFseXplIHRoZQorICogc2Vuc2l0aXZpdHkuICBEb24ndCBhbmFseXplIHN0YXRzIHRoYXQgY29tZSBpbiBmcm9tIHNjYW5uaW5nLCBvciBhbnkKKyAqIG90aGVyIG5vbi1hc3NvY2lhdGVkLW5ldHdvcmsgc291cmNlLiAgUGVydGluZW50IHN0YXRzIGluY2x1ZGU6CisgKgorICogRnJvbSAiZ2VuZXJhbCIgc3RhdHMgKHN0cnVjdCBzdGF0c19yeF9ub25fcGh5KToKKyAqCisgKiAoYmVhY29uX2VuZXJneV9bYWJjXSAmIDB4MEZGMDApID4+IDggKHVuc2lnbmVkLCBoaWdoZXIgdmFsdWUgaXMgbG93ZXIgbGV2ZWwpCisgKiAgIE1lYXN1cmUgb2YgZW5lcmd5IG9mIGRlc2lyZWQgc2lnbmFsLiAgVXNlZCBmb3IgZXN0YWJsaXNoaW5nIGEgbGV2ZWwKKyAqICAgYmVsb3cgd2hpY2ggdGhlIGRldmljZSBkb2VzIG5vdCBkZXRlY3Qgc2lnbmFscy4KKyAqCisgKiAoYmVhY29uX3NpbGVuY2VfcnNzaV9bYWJjXSAmIDB4MEZGMDApID4+IDggKHVuc2lnbmVkLCB1bml0cyBpbiBkQikKKyAqICAgTWVhc3VyZSBvZiBiYWNrZ3JvdW5kIG5vaXNlIGluIHNpbGVudCBwZXJpb2QgYWZ0ZXIgYmVhY29uLgorICoKKyAqIGNoYW5uZWxfbG9hZAorICogICB1U2VjcyBvZiBhY3R1YWwgUnggdGltZSBkdXJpbmcgYmVhY29uIHBlcmlvZCAodmFyaWVzIGFjY29yZGluZyB0bworICogICBob3cgbXVjaCB0aW1lIHdhcyBzcGVudCB0cmFuc21pdHRpbmcpLgorICoKKyAqIEZyb20gImNjayIgYW5kICJvZmRtIiBzdGF0cyAoc3RydWN0IHN0YXRzX3J4X3BoeSksIHNlcGFyYXRlbHk6CisgKgorICogZmFsc2VfYWxhcm1fY250CisgKiAgIFNpZ25hbCBsb2NrcyBhYmFuZG9uZWQgZWFybHkgKGJlZm9yZSBwaHktbGV2ZWwgaGVhZGVyKS4KKyAqCisgKiBwbGNwX2VycgorICogICBTaWduYWwgbG9ja3MgYWJhbmRvbmVkIGxhdGUgKGR1cmluZyBwaHktbGV2ZWwgaGVhZGVyKS4KKyAqCisgKiBOT1RFOiAgQm90aCBmYWxzZV9hbGFybV9jbnQgYW5kIHBsY3BfZXJyIGluY3JlbWVudCBtb25vdG9uaWNhbGx5IGZyb20KKyAqICAgICAgICBiZWFjb24gdG8gYmVhY29uLCBpLmUuIGVhY2ggdmFsdWUgaXMgYW4gYWNjdW11bGF0aW9uIG9mIGFsbCBlcnJvcnMKKyAqICAgICAgICBiZWZvcmUgYW5kIGluY2x1ZGluZyB0aGUgbGF0ZXN0IGJlYWNvbi4gIFZhbHVlcyB3aWxsIHdyYXAgYXJvdW5kIHRvIDAKKyAqICAgICAgICBhZnRlciBjb3VudGluZyB1cCB0byAyXjMyIC0gMS4gIERyaXZlciBtdXN0IGRpZmZlcmVudGlhdGUgdnMuCisgKiAgICAgICAgcHJldmlvdXMgYmVhY29uJ3MgdmFsdWVzIHRvIGRldGVybWluZSAjIGZhbHNlIGFsYXJtcyBpbiB0aGUgY3VycmVudAorICogICAgICAgIGJlYWNvbiBwZXJpb2QuCisgKgorICogVG90YWwgbnVtYmVyIG9mIGZhbHNlIGFsYXJtcyA9IGZhbHNlX2FsYXJtcyArIHBsY3BfZXJycworICoKKyAqIEZvciBPRkRNLCBhZGp1c3QgdGhlIGZvbGxvd2luZyB0YWJsZSBlbnRyaWVzIGluIHN0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQKKyAqIChub3RpY2UgdGhhdCB0aGUgc3RhcnQgcG9pbnRzIGZvciBPRkRNIGFyZSBhdCBvciBjbG9zZSB0byBzZXR0aW5ncyBmb3IKKyAqIG1heGltdW0gc2Vuc2l0aXZpdHkpOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlQgIC8gIE1JTiAgLyAgTUFYCisgKiAgIEhEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fSURYICAgICAgICAgIDkwICAgLyAgIDg1ICAvICAxMjAKKyAqICAgSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9NUkNfSURYICAgICAxNzAgICAvICAxNzAgIC8gIDIxMAorICogICBIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX0lEWCAgICAgICAgIDEwNSAgIC8gIDEwNSAgLyAgMTQwCisgKiAgIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fTVJDX0lEWCAgICAgMjIwICAgLyAgMjIwICAvICAyNzAKKyAqCisgKiAgIElmIGFjdHVhbCByYXRlIG9mIE9GRE0gZmFsc2UgYWxhcm1zICgrIHBsY3BfZXJyb3JzKSBpcyB0b28gaGlnaAorICogICAoZ3JlYXRlciB0aGFuIDUwIGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyksIHJlZHVjZSBzZW5zaXRpdml0eQorICogICBieSAqYWRkaW5nKiAxIHRvIGFsbCA0IG9mIHRoZSB0YWJsZSBlbnRyaWVzIGFib3ZlLCB1cCB0byB0aGUgbWF4IGZvcgorICogICBlYWNoIGVudHJ5LiAgQ29udmVyc2VseSwgaWYgZmFsc2UgYWxhcm0gcmF0ZSBpcyB0b28gbG93IChsZXNzIHRoYW4gNQorICogICBmb3IgZWFjaCAyMDQuOCBtc2VjcyBsaXN0ZW5pbmcpLCAqc3VidHJhY3QqIDEgZnJvbSBlYWNoIGVudHJ5IHRvCisgKiAgIGluY3JlYXNlIHNlbnNpdGl2aXR5LgorICoKKyAqIEZvciBDQ0sgc2Vuc2l0aXZpdHksIGtlZXAgdHJhY2sgb2YgdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgIDEpLiAgMjAtYmVhY29uIGhpc3Rvcnkgb2YgbWF4aW11bSBiYWNrZ3JvdW5kIG5vaXNlLCBpbmRpY2F0ZWQgYnkKKyAqICAgICAgICAoYmVhY29uX3NpbGVuY2VfcnNzaV9bYWJjXSAmIDB4MEZGMDApLCB1bml0cyBpbiBkQiwgYWNyb3NzIHRoZQorICogICAgICAgIDMgcmVjZWl2ZXJzLiAgRm9yIGFueSBnaXZlbiBiZWFjb24sIHRoZSAic2lsZW5jZSByZWZlcmVuY2UiIGlzCisgKiAgICAgICAgdGhlIG1heGltdW0gb2YgbGFzdCA2MCBzYW1wbGVzICgyMCBiZWFjb25zICogMyByZWNlaXZlcnMpLgorICoKKyAqICAgMikuICAxMC1iZWFjb24gaGlzdG9yeSBvZiBzdHJvbmdlc3Qgc2lnbmFsIGxldmVsLCBhcyBpbmRpY2F0ZWQKKyAqICAgICAgICBieSAoYmVhY29uX2VuZXJneV9bYWJjXSAmIDB4MEZGMDApID4+IDgsIGFjcm9zcyB0aGUgMyByZWNlaXZlcnMsCisgKiAgICAgICAgaS5lLiB0aGUgc3RyZW5ndGggb2YgdGhlIHNpZ25hbCB0aHJvdWdoIHRoZSBiZXN0IHJlY2VpdmVyIGF0IHRoZQorICogICAgICAgIG1vbWVudC4gIFRoZXNlIG1lYXN1cmVtZW50cyBhcmUgInVwc2lkZSBkb3duIiwgd2l0aCBsb3dlciB2YWx1ZXMKKyAqICAgICAgICBmb3Igc3Ryb25nZXIgc2lnbmFscywgc28gbWF4IGVuZXJneSB3aWxsIGJlICptaW5pbXVtKiB2YWx1ZS4KKyAqCisgKiAgICAgICAgVGhlbiBmb3IgYW55IGdpdmVuIGJlYWNvbiwgdGhlIGRyaXZlciBtdXN0IGRldGVybWluZSB0aGUgKndlYWtlc3QqCisgKiAgICAgICAgb2YgdGhlIHN0cm9uZ2VzdCBzaWduYWxzOyB0aGlzIGlzIHRoZSBtaW5pbXVtIGxldmVsIHRoYXQgbmVlZHMgdG8gYmUKKyAqICAgICAgICBzdWNjZXNzZnVsbHkgZGV0ZWN0ZWQsIHdoZW4gdXNpbmcgdGhlIGJlc3QgcmVjZWl2ZXIgYXQgdGhlIG1vbWVudC4KKyAqICAgICAgICAiTWF4IGNjayBlbmVyZ3kiIGlzIHRoZSBtYXhpbXVtIChoaWdoZXIgdmFsdWUgbWVhbnMgbG93ZXIgZW5lcmd5ISkKKyAqICAgICAgICBvZiB0aGUgbGFzdCAxMCBtaW5pbWEuICBPbmNlIHRoaXMgaXMgZGV0ZXJtaW5lZCwgZHJpdmVyIG11c3QgYWRkCisgKiAgICAgICAgYSBsaXR0bGUgbWFyZ2luIGJ5IGFkZGluZyAiNiIgdG8gaXQuCisgKgorICogICAzKS4gIE51bWJlciBvZiBjb25zZWN1dGl2ZSBiZWFjb24gcGVyaW9kcyB3aXRoIHRvbyBmZXcgZmFsc2UgYWxhcm1zLgorICogICAgICAgIFJlc2V0IHRoaXMgdG8gMCBhdCB0aGUgZmlyc3QgYmVhY29uIHBlcmlvZCB0aGF0IGZhbGxzIHdpdGhpbiB0aGUKKyAqICAgICAgICAiZ29vZCIgcmFuZ2UgKDUgdG8gNTAgZmFsc2UgYWxhcm1zIHBlciAyMDQuOCBtaWxsaXNlY29uZHMgcngpLgorICoKKyAqIFRoZW4sIGFkanVzdCB0aGUgZm9sbG93aW5nIENDSyB0YWJsZSBlbnRyaWVzIGluIHN0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQKKyAqIChub3RpY2UgdGhhdCB0aGUgc3RhcnQgcG9pbnRzIGZvciBDQ0sgYXJlIGF0IG1heGltdW0gc2Vuc2l0aXZpdHkpOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlQgIC8gIE1JTiAgLyAgTUFYCisgKiAgIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSURYICAgICAgICAgMTI1ICAgLyAgMTI1ICAvICAyMDAKKyAqICAgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSURYICAgICAyMDAgICAvICAyMDAgIC8gIDQwMAorICogICBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYICAgICAgICAgICAgICAgIDEwMCAgIC8gICAgMCAgLyAgMTAwCisgKgorICogICBJZiBhY3R1YWwgcmF0ZSBvZiBDQ0sgZmFsc2UgYWxhcm1zICgrIHBsY3BfZXJyb3JzKSBpcyB0b28gaGlnaAorICogICAoZ3JlYXRlciB0aGFuIDUwIGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyksIG1ldGhvZCBmb3IgcmVkdWNpbmcKKyAqICAgc2Vuc2l0aXZpdHkgaXM6CisgKgorICogICAxKSAgKkFkZCogMyB0byB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JRFgsCisgKiAgICAgICB1cCB0byBtYXggNDAwLgorICoKKyAqICAgMikgIElmIGN1cnJlbnQgdmFsdWUgaW4gSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JRFggaXMgPCAxNjAsCisgKiAgICAgICBzZW5zaXRpdml0eSBoYXMgYmVlbiByZWR1Y2VkIGEgc2lnbmlmaWNhbnQgYW1vdW50OyBicmluZyBpdCB1cCB0bworICogICAgICAgYSBtb2RlcmF0ZSAxNjEuICBPdGhlcndpc2UsICphZGQqIDMsIHVwIHRvIG1heCAyMDAuCisgKgorICogICAzKSAgYSkgIElmIGN1cnJlbnQgdmFsdWUgaW4gSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JRFggaXMgPiAxNjAsCisgKiAgICAgICBzZW5zaXRpdml0eSBoYXMgYmVlbiByZWR1Y2VkIG9ubHkgYSBtb2RlcmF0ZSBvciBzbWFsbCBhbW91bnQ7CisgKiAgICAgICAqc3VidHJhY3QqIDIgZnJvbSB2YWx1ZSBpbiBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYLAorICogICAgICAgZG93biB0byBtaW4gMC4gIE90aGVyd2lzZSAoaWYgZ2FpbiBoYXMgYmVlbiBzaWduaWZpY2FudGx5IHJlZHVjZWQpLAorICogICAgICAgZG9uJ3QgY2hhbmdlIHRoZSBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYIHZhbHVlLgorICoKKyAqICAgICAgIGIpICBTYXZlIGEgc25hcHNob3Qgb2YgdGhlICJzaWxlbmNlIHJlZmVyZW5jZSIuCisgKgorICogICBJZiBhY3R1YWwgcmF0ZSBvZiBDQ0sgZmFsc2UgYWxhcm1zICgrIHBsY3BfZXJyb3JzKSBpcyB0b28gbG93CisgKiAgIChsZXNzIHRoYW4gNSBmb3IgZWFjaCAyMDQuOCBtc2VjcyBsaXN0ZW5pbmcpLCBtZXRob2QgZm9yIGluY3JlYXNpbmcKKyAqICAgc2Vuc2l0aXZpdHkgaXMgdXNlZCBvbmx5IGlmOgorICoKKyAqICAgMWEpICBQcmV2aW91cyBiZWFjb24gZGlkIG5vdCBoYXZlIHRvbyBtYW55IGZhbHNlIGFsYXJtcworICogICAxYikgIEFORCBkaWZmZXJlbmNlIGJldHdlZW4gcHJldmlvdXMgInNpbGVuY2UgcmVmZXJlbmNlIiBhbmQgY3VycmVudAorICogICAgICAgICJzaWxlbmNlIHJlZmVyZW5jZSIgKHByZXYgLSBjdXJyZW50KSBpcyAyIG9yIG1vcmUsCisgKiAgIE9SIDIpICAxMDAgb3IgbW9yZSBjb25zZWN1dGl2ZSBiZWFjb24gcGVyaW9kcyBoYXZlIGhhZCByYXRlIG9mCisgKiAgICAgICAgICBsZXNzIHRoYW4gNSBmYWxzZSBhbGFybXMgcGVyIDIwNC44IG1pbGxpc2Vjb25kcyByeCB0aW1lLgorICoKKyAqICAgTWV0aG9kIGZvciBpbmNyZWFzaW5nIHNlbnNpdGl2aXR5OgorICoKKyAqICAgMSkgICpTdWJ0cmFjdCogMyBmcm9tIHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSURYLAorICogICAgICAgZG93biB0byBtaW4gMTI1LgorICoKKyAqICAgMikgICpTdWJ0cmFjdCogMyBmcm9tIHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fTVJDX0lEWCwKKyAqICAgICAgIGRvd24gdG8gbWluIDIwMC4KKyAqCisgKiAgIDMpICAqQWRkKiAyIHRvIHZhbHVlIGluIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JRFgsIHVwIHRvIG1heCAxMDAuCisgKgorICogICBJZiBhY3R1YWwgcmF0ZSBvZiBDQ0sgZmFsc2UgYWxhcm1zICgrIHBsY3BfZXJyb3JzKSBpcyB3aXRoaW4gZ29vZCByYW5nZQorICogICAoYmV0d2VlbiA1IGFuZCA1MCBmb3IgZWFjaCAyMDQuOCBtc2VjcyBsaXN0ZW5pbmcpOgorICoKKyAqICAgMSkgIFNhdmUgYSBzbmFwc2hvdCBvZiB0aGUgc2lsZW5jZSByZWZlcmVuY2UuCisgKgorICogICAyKSAgSWYgcHJldmlvdXMgYmVhY29uIGhhZCB0b28gbWFueSBDQ0sgZmFsc2UgYWxhcm1zICgrIHBsY3BfZXJyb3JzKSwKKyAqICAgICAgIGdpdmUgc29tZSBleHRyYSBtYXJnaW4gdG8gZW5lcmd5IHRocmVzaG9sZCBieSAqc3VidHJhY3RpbmcqIDgKKyAqICAgICAgIGZyb20gdmFsdWUgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lEWC4KKyAqCisgKiAgIEZvciBhbGwgY2FzZXMgKHRvbyBmZXcsIHRvbyBtYW55LCBnb29kIHJhbmdlKSwgbWFrZSBzdXJlIHRoYXQgdGhlIENDSworICogICBkZXRlY3Rpb24gdGhyZXNob2xkIChlbmVyZ3kpIGlzIGJlbG93IHRoZSBlbmVyZ3kgbGV2ZWwgZm9yIHJvYnVzdAorICogICBkZXRlY3Rpb24gb3ZlciB0aGUgcGFzdCAxMCBiZWFjb24gcGVyaW9kcywgdGhlICJNYXggY2NrIGVuZXJneSIuCisgKiAgIExvd2VyIHZhbHVlcyBtZWFuIGhpZ2hlciBlbmVyZ3k7IHRoaXMgbWVhbnMgbWFraW5nIHN1cmUgdGhhdCB0aGUgdmFsdWUKKyAqICAgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lEWCBpcyBhdCBvciAqYWJvdmUqICJNYXggY2NrIGVuZXJneSIuCisgKgorICovCisKKy8qCisgKiBUYWJsZSBlbnRyaWVzIGluIENfU0VOU0lUSVZJVFkgKHN0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQpCisgKi8KKyNkZWZpbmUgSERfVEJMX1NJWkUgICgxMSkJLyogbnVtYmVyIG9mIGVudHJpZXMgKi8KKyNkZWZpbmUgSERfTUlOX0VORVJHWV9DQ0tfREVUX0lEWCAgICAgICAgICAgICAgICAgKDApCS8qIHRhYmxlIGlkeGVzICovCisjZGVmaW5lIEhEX01JTl9FTkVSR1lfT0ZETV9ERVRfSURYICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX0lEWCAgICAgICAgICAoMikKKyNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9NUkNfSURYICAgICAgKDMpCisjZGVmaW5lIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fTVJDX0lEWCAgICAgICg0KQorI2RlZmluZSBIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX0lEWCAgICAgICAgICAoNSkKKyNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9NUkNfSURYICAgICAgKDYpCisjZGVmaW5lIEhEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fSURYICAgICAgICAgICAgICg3KQorI2RlZmluZSBIRF9CQVJLRVJfQ09SUl9USF9BRERfTUlOX01SQ19JRFggICAgICAgICAoOCkKKyNkZWZpbmUgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JRFggICAgICAgICAgKDkpCisjZGVmaW5lIEhEX09GRE1fRU5FUkdZX1RIX0lOX0lEWCAgICAgICAgICAgICAgICAgICgxMCkKKworLyogQ29udHJvbCBmaWVsZCBpbiBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfY21kICovCisjZGVmaW5lIENfU0VOU0lUSVZJVFlfQ09OVFJPTF9ERUZBVUxUX1RCTAljcHVfdG9fbGUxNigwKQorI2RlZmluZSBDX1NFTlNJVElWSVRZX0NPTlRST0xfV09SS19UQkwJY3B1X3RvX2xlMTYoMSkKKworLyoqCisgKiBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfY21kCisgKiBAY29udHJvbDogICgxKSB1cGRhdGVzIHdvcmtpbmcgdGFibGUsICgwKSB1cGRhdGVzIGRlZmF1bHQgdGFibGUKKyAqIEB0YWJsZTogIGVuZXJneSB0aHJlc2hvbGQgdmFsdWVzLCB1c2UgSERfKiBhcyBpZHggaW50byB0YWJsZQorICoKKyAqIEFsd2F5cyB1c2UgIjEiIGluICJjb250cm9sIiB0byB1cGRhdGUgdUNvZGUncyB3b3JraW5nIHRhYmxlIGFuZCBEU1AuCisgKi8KK3N0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQgeworCV9fbGUxNiBjb250cm9sOwkJLyogYWx3YXlzIHVzZSAiMSIgKi8KKwlfX2xlMTYgdGFibGVbSERfVEJMX1NJWkVdOwkvKiB1c2UgSERfKiBhcyBpZHggKi8KK30gX19wYWNrZWQ7CisKKy8qKgorICogQ19QSFlfQ0FMSUJSQVRJT04gPSAweGIwIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKgorICogVGhpcyBjb21tYW5kIHNldHMgdGhlIHJlbGF0aXZlIGdhaW5zIG9mIDQ5NjUgZGV2aWNlJ3MgMyByYWRpbyByZWNlaXZlciBjaGFpbnMuCisgKgorICogQWZ0ZXIgdGhlIGZpcnN0IGFzc29jaWF0aW9uLCBkcml2ZXIgc2hvdWxkIGFjY3VtdWxhdGUgc2lnbmFsIGFuZCBub2lzZQorICogc3RhdHMgZnJvbSB0aGUgTl9TVEFUU3MgdGhhdCBmb2xsb3cgdGhlIGZpcnN0IDIwCisgKiBiZWFjb25zIGZyb20gdGhlIGFzc29jaWF0ZWQgbmV0d29yayAoZG9uJ3QgY29sbGVjdCBzdGF0cyB0aGF0IGNvbWUKKyAqIGluIGZyb20gc2Nhbm5pbmcsIG9yIGFueSBvdGhlciBub24tbmV0d29yayBzb3VyY2UpLgorICoKKyAqIERJU0NPTk5FQ1RFRCBBTlRFTk5BOgorICoKKyAqIERyaXZlciBzaG91bGQgZGV0ZXJtaW5lIHdoaWNoIGFudGVubmFzIGFyZSBhY3R1YWxseSBjb25uZWN0ZWQsIGJ5IGNvbXBhcmluZworICogYXZlcmFnZSBiZWFjb24gc2lnbmFsIGxldmVscyBmb3IgdGhlIDMgUnggY2hhaW5zLiAgQWNjdW11bGF0ZSAoYWRkKSB0aGUKKyAqIGZvbGxvd2luZyB2YWx1ZXMgb3ZlciAyMCBiZWFjb25zLCBvbmUgYWNjdW11bGF0b3IgZm9yIGVhY2ggb2YgdGhlIGNoYWlucworICogYS9iL2MsIGZyb20gc3RydWN0IHN0YXRzX3J4X25vbl9waHk6CisgKgorICogYmVhY29uX3Jzc2lfW2FiY10gJiAweDBGRiAodW5zaWduZWQsIHVuaXRzIGluIGRCKQorICoKKyAqIEZpbmQgdGhlIHN0cm9uZ2VzdCBzaWduYWwgZnJvbSBhbW9uZyBhL2IvYy4gIENvbXBhcmUgdGhlIG90aGVyIHR3byB0byB0aGUKKyAqIHN0cm9uZ2VzdC4gIElmIGFueSBzaWduYWwgaXMgbW9yZSB0aGFuIDE1IGRCICh0aW1lcyAyMCwgdW5sZXNzIHlvdQorICogZGl2aWRlIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMgYnkgMjApIGJlbG93IHRoZSBzdHJvbmdlc3QsIHRoZSBkcml2ZXIKKyAqIGNvbnNpZGVycyB0aGF0IGFudGVubmEgdG8gYmUgZGlzY29ubmVjdGVkLCBhbmQgc2hvdWxkIG5vdCB0cnkgdG8gdXNlIHRoYXQKKyAqIGFudGVubmEvY2hhaW4gZm9yIFJ4IG9yIFR4LiAgSWYgYm90aCBBIGFuZCBCIHNlZW0gdG8gYmUgZGlzY29ubmVjdGVkLAorICogZHJpdmVyIHNob3VsZCBkZWNsYXJlIHRoZSBzdHJvbmdlciBvbmUgYXMgY29ubmVjdGVkLCBhbmQgYXR0ZW1wdCB0byB1c2UgaXQKKyAqIChBIGFuZCBCIGFyZSB0aGUgb25seSAyIFR4IGNoYWlucyEpLgorICoKKyAqCisgKiBSWCBCQUxBTkNFOgorICoKKyAqIERyaXZlciBzaG91bGQgYmFsYW5jZSB0aGUgMyByZWNlaXZlcnMgKGJ1dCBqdXN0IHRoZSBvbmVzIHRoYXQgYXJlIGNvbm5lY3RlZAorICogdG8gYW50ZW5uYXMsIHNlZSBhYm92ZSkgZm9yIGdhaW4sIGJ5IGNvbXBhcmluZyB0aGUgYXZlcmFnZSBzaWduYWwgbGV2ZWxzCisgKiBkZXRlY3RlZCBkdXJpbmcgdGhlIHNpbGVuY2UgYWZ0ZXIgZWFjaCBiZWFjb24gKGJhY2tncm91bmQgbm9pc2UpLgorICogQWNjdW11bGF0ZSAoYWRkKSB0aGUgZm9sbG93aW5nIHZhbHVlcyBvdmVyIDIwIGJlYWNvbnMsIG9uZSBhY2N1bXVsYXRvciBmb3IKKyAqIGVhY2ggb2YgdGhlIGNoYWlucyBhL2IvYywgZnJvbSBzdHJ1Y3Qgc3RhdHNfcnhfbm9uX3BoeToKKyAqCisgKiBiZWFjb25fc2lsZW5jZV9yc3NpX1thYmNdICYgMHgwRkYgKHVuc2lnbmVkLCB1bml0cyBpbiBkQikKKyAqCisgKiBGaW5kIHRoZSB3ZWFrZXN0IGJhY2tncm91bmQgbm9pc2UgbGV2ZWwgZnJvbSBhbW9uZyBhL2IvYy4gIFRoaXMgUnggY2hhaW4KKyAqIHdpbGwgYmUgdGhlIHJlZmVyZW5jZSwgd2l0aCAwIGdhaW4gYWRqdXN0bWVudC4gIEF0dGVudWF0ZSBvdGhlciBjaGFubmVscyBieQorICogZmluZGluZyBub2lzZSBkaWZmZXJlbmNlOgorICoKKyAqIChhY2N1bV9ub2lzZVtpXSAtIGFjY3VtX25vaXNlW3JlZmVyZW5jZV0pIC8gMzAKKyAqCisgKiBUaGUgIjMwIiBhZGp1c3RzIHRoZSBkQiBpbiB0aGUgMjAgYWNjdW11bGF0ZWQgc2FtcGxlcyB0byB1bml0cyBvZiAxLjUgZEIuCisgKiBGb3IgdXNlIGluIGRpZmZfZ2Fpbl9bYWJjXSBmaWVsZHMgb2Ygc3RydWN0IGlsX2NhbGlicmF0aW9uX2NtZCwgdGhlCisgKiBkcml2ZXIgc2hvdWxkIGxpbWl0IHRoZSBkaWZmZXJlbmNlIHJlc3VsdHMgdG8gYSByYW5nZSBvZiAwLTMgKDAtNC41IGRCKSwKKyAqIGFuZCBzZXQgYml0IDIgdG8gaW5kaWNhdGUgInJlZHVjZSBnYWluIi4gIFRoZSB2YWx1ZSBmb3IgdGhlIHJlZmVyZW5jZQorICogKHdlYWtlc3QpIGNoYWluIHNob3VsZCBiZSAiMCIuCisgKgorICogZGlmZl9nYWluX1thYmNdIGJpdCBmaWVsZHM6CisgKiAgIDI6ICgxKSByZWR1Y2UgZ2FpbiwgKDApIGluY3JlYXNlIGdhaW4KKyAqIDEtMDogYW1vdW50IG9mIGdhaW4sIHVuaXRzIG9mIDEuNSBkQgorICovCisKKy8qIFBoeSBjYWxpYnJhdGlvbiBjb21tYW5kIGZvciBzZXJpZXMgKi8KKy8qIFRoZSBkZWZhdWx0IGNhbGlicmF0ZSB0YWJsZSBzaXplIGlmIG5vdCBzcGVjaWZpZWQgYnkgZmlybXdhcmUgKi8KKyNkZWZpbmUgSUxfREVGQVVMVF9TVEFOREFSRF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFCTE4CitlbnVtIHsKKwlJTF9QSFlfQ0FMSUJSQVRFX0RJRkZfR0FJTl9DTUQgPSA3LAorCUlMX01BWF9TVEFOREFSRF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFID0gMTksCit9OworCisjZGVmaW5lIElMX01BWF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFCQkoMjUzKQorCitzdHJ1Y3QgaWxfY2FsaWJfaGRyIHsKKwl1OCBvcF9jb2RlOworCXU4IGZpcnN0X2dyb3VwOworCXU4IGdyb3Vwc19udW07CisJdTggZGF0YV92YWxpZDsKK30gX19wYWNrZWQ7CisKKy8qIElMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRCAoNykgKi8KK3N0cnVjdCBpbF9jYWxpYl9kaWZmX2dhaW5fY21kIHsKKwlzdHJ1Y3QgaWxfY2FsaWJfaGRyIGhkcjsKKwlzOCBkaWZmX2dhaW5fYTsJCS8qIHNlZSBhYm92ZSAqLworCXM4IGRpZmZfZ2Fpbl9iOworCXM4IGRpZmZfZ2Fpbl9jOworCXU4IHJlc2VydmVkMTsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICgxMikKKyAqIE1pc2NlbGxhbmVvdXMgQ29tbWFuZHM6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogTEVEcyBDb21tYW5kICYgUmVzcG9uc2UKKyAqIENfTEVEUyA9IDB4NDggKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqCisgKiBGb3IgZWFjaCBvZiAzIHBvc3NpYmxlIExFRHMgKEFjdGl2aXR5L0xpbmsvVGVjaCwgc2VsZWN0ZWQgYnkgImlkIiBmaWVsZCksCisgKiB0aGlzIGNvbW1hbmQgdHVybnMgaXQgb24gb3Igb2ZmLCBvciBzZXRzIHVwIGEgcGVyaW9kaWMgYmxpbmtpbmcgY3ljbGUuCisgKi8KK3N0cnVjdCBpbF9sZWRfY21kIHsKKwlfX2xlMzIgaW50ZXJ2YWw7CS8qICJpbnRlcnZhbCIgaW4gdVNlYyAqLworCXU4IGlkOwkJCS8qIDE6IEFjdGl2aXR5LCAyOiBMaW5rLCAzOiBUZWNoICovCisJdTggb2ZmOwkJCS8qICMgaW50ZXJ2YWxzIG9mZiB3aGlsZSBibGlua2luZzsKKwkJCQkgKiAiMCIsIHdpdGggPjAgIm9uIiB2YWx1ZSwgdHVybnMgTEVEIG9uICovCisJdTggb247CQkJLyogIyBpbnRlcnZhbHMgb24gd2hpbGUgYmxpbmtpbmc7CisJCQkJICogIjAiLCByZWdhcmRsZXNzIG9mICJvZmYiLCB0dXJucyBMRUQgb2ZmICovCisJdTggcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoMTMpCisgKiBVbmlvbiBvZiBhbGwgZXhwZWN0ZWQgbm90aWZpY2F0aW9ucy9yZXNwb25zZXM6CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElMX1JYX0ZSQU1FX1NJWkVfTVNLCTB4MDAwMDNmZmYKKworc3RydWN0IGlsX3J4X3BrdCB7CisJLyoKKwkgKiBUaGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgUlggZnJhbWUgaGVhZGVyIGNvbnRhaW4gYm90aCB0aGUgUlggZnJhbWUKKwkgKiBzaXplIGFuZCBzb21lIGZsYWdzLgorCSAqIEJpdCBmaWVsZHM6CisJICogMzE6ICAgIGZsYWcgZmx1c2ggUkIgcmVxdWVzdAorCSAqIDMwOiAgICBmbGFnIGlnbm9yZSBUQyAodGVybWluYWwgY291bnRlcikgcmVxdWVzdAorCSAqIDI5OiAgICBmbGFnIGZhc3QgSVJRIHJlcXVlc3QKKwkgKiAyOC0xNDogUmVzZXJ2ZWQKKwkgKiAxMy0wMDogUlggZnJhbWUgc2l6ZQorCSAqLworCV9fbGUzMiBsZW5fbl9mbGFnczsKKwlzdHJ1Y3QgaWxfY21kX2hlYWRlciBoZHI7CisJdW5pb24geworCQlzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lIHJ4X2ZyYW1lOworCQlzdHJ1Y3QgaWwzOTQ1X3R4X3Jlc3AgdHhfcmVzcDsKKwkJc3RydWN0IGlsMzk0NV9iZWFjb25fbm90aWYgYmVhY29uX3N0YXR1czsKKworCQlzdHJ1Y3QgaWxfYWxpdmVfcmVzcCBhbGl2ZV9mcmFtZTsKKwkJc3RydWN0IGlsX3NwZWN0cnVtX25vdGlmaWNhdGlvbiBzcGVjdHJ1bV9ub3RpZjsKKwkJc3RydWN0IGlsX2NzYV9ub3RpZmljYXRpb24gY3NhX25vdGlmOworCQlzdHJ1Y3QgaWxfZXJyb3JfcmVzcCBlcnJfcmVzcDsKKwkJc3RydWN0IGlsX2NhcmRfc3RhdGVfbm90aWYgY2FyZF9zdGF0ZV9ub3RpZjsKKwkJc3RydWN0IGlsX2FkZF9zdGFfcmVzcCBhZGRfc3RhOworCQlzdHJ1Y3QgaWxfcmVtX3N0YV9yZXNwIHJlbV9zdGE7CisJCXN0cnVjdCBpbF9zbGVlcF9ub3RpZmljYXRpb24gc2xlZXBfbm90aWY7CisJCXN0cnVjdCBpbF9zcGVjdHJ1bV9yZXNwIHNwZWN0cnVtOworCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgc3RhdHM7CisJCXN0cnVjdCBpbF9jb21wcmVzc2VkX2JhX3Jlc3AgY29tcHJlc3NlZF9iYTsKKwkJc3RydWN0IGlsX21pc3NlZF9iZWFjb25fbm90aWYgbWlzc2VkX2JlYWNvbjsKKwkJX19sZTMyIHN0YXR1czsKKwkJdTggcmF3WzBdOworCX0gdTsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKiBfX2lsX2NvbW1hbmRzX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI5MjRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmMKQEAgLTAsMCArMSw1NzA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK2NvbnN0IGNoYXIgKgoraWxfZ2V0X2NtZF9zdHJpbmcodTggY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJCUlMX0NNRChOX0FMSVZFKTsKKwkJSUxfQ01EKE5fRVJST1IpOworCQlJTF9DTUQoQ19SWE9OKTsKKwkJSUxfQ01EKENfUlhPTl9BU1NPQyk7CisJCUlMX0NNRChDX1FPU19QQVJBTSk7CisJCUlMX0NNRChDX1JYT05fVElNSU5HKTsKKwkJSUxfQ01EKENfQUREX1NUQSk7CisJCUlMX0NNRChDX1JFTV9TVEEpOworCQlJTF9DTUQoQ19XRVBLRVkpOworCQlJTF9DTUQoTl8zOTQ1X1JYKTsKKwkJSUxfQ01EKENfVFgpOworCQlJTF9DTUQoQ19SQVRFX1NDQUxFKTsKKwkJSUxfQ01EKENfTEVEUyk7CisJCUlMX0NNRChDX1RYX0xJTktfUVVBTElUWV9DTUQpOworCQlJTF9DTUQoQ19DSEFOTkVMX1NXSVRDSCk7CisJCUlMX0NNRChOX0NIQU5ORUxfU1dJVENIKTsKKwkJSUxfQ01EKENfU1BFQ1RSVU1fTUVBU1VSRU1FTlQpOworCQlJTF9DTUQoTl9TUEVDVFJVTV9NRUFTVVJFTUVOVCk7CisJCUlMX0NNRChDX1BPV0VSX1RCTCk7CisJCUlMX0NNRChOX1BNX1NMRUVQKTsKKwkJSUxfQ01EKE5fUE1fREVCVUdfU1RBVFMpOworCQlJTF9DTUQoQ19TQ0FOKTsKKwkJSUxfQ01EKENfU0NBTl9BQk9SVCk7CisJCUlMX0NNRChOX1NDQU5fU1RBUlQpOworCQlJTF9DTUQoTl9TQ0FOX1JFU1VMVFMpOworCQlJTF9DTUQoTl9TQ0FOX0NPTVBMRVRFKTsKKwkJSUxfQ01EKE5fQkVBQ09OKTsKKwkJSUxfQ01EKENfVFhfQkVBQ09OKTsKKwkJSUxfQ01EKENfVFhfUFdSX1RCTCk7CisJCUlMX0NNRChDX0JUX0NPTkZJRyk7CisJCUlMX0NNRChDX1NUQVRTKTsKKwkJSUxfQ01EKE5fU1RBVFMpOworCQlJTF9DTUQoTl9DQVJEX1NUQVRFKTsKKwkJSUxfQ01EKE5fTUlTU0VEX0JFQUNPTlMpOworCQlJTF9DTUQoQ19DVF9LSUxMX0NPTkZJRyk7CisJCUlMX0NNRChDX1NFTlNJVElWSVRZKTsKKwkJSUxfQ01EKENfUEhZX0NBTElCUkFUSU9OKTsKKwkJSUxfQ01EKE5fUlhfUEhZKTsKKwkJSUxfQ01EKE5fUlhfTVBEVSk7CisJCUlMX0NNRChOX1JYKTsKKwkJSUxfQ01EKE5fQ09NUFJFU1NFRF9CQSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfZ2V0X2NtZF9zdHJpbmcpOworCisjZGVmaW5lIEhPU1RfQ09NUExFVEVfVElNRU9VVCAoSFogLyAyKQorCitzdGF0aWMgdm9pZAoraWxfZ2VuZXJpY19jbWRfY2FsbGJhY2soc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJc3RydWN0IGlsX3J4X3BrdCAqcGt0KQoreworCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tICVzICgweCUwOFgpXG4iLAorCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOworCQlyZXR1cm47CisJfQorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXN3aXRjaCAoY21kLT5oZHIuY21kKSB7CisJY2FzZSBDX1RYX0xJTktfUVVBTElUWV9DTUQ6CisJY2FzZSBDX1NFTlNJVElWSVRZOgorCQlEX0hDX0RVTVAoImJhY2sgZnJvbSAlcyAoMHglMDhYKVxuIiwKKwkJCSAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEX0hDKCJiYWNrIGZyb20gJXMgKDB4JTA4WClcbiIsIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aGRyLmNtZCksCisJCSAgICAgcGt0LT5oZHIuZmxhZ3MpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW50CitpbF9zZW5kX2NtZF9hc3luYyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9ob3N0X2NtZCAqY21kKQoreworCWludCByZXQ7CisKKwlCVUdfT04oIShjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSk7CisKKwkvKiBBbiBhc3luY2hyb25vdXMgY29tbWFuZCBjYW4gbm90IGV4cGVjdCBhbiBTS0IgdG8gYmUgc2V0LiAqLworCUJVR19PTihjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKTsKKworCS8qIEFzc2lnbiBhIGdlbmVyaWMgY2FsbGJhY2sgaWYgb25lIGlzIG5vdCBwcm92aWRlZCAqLworCWlmICghY21kLT5jYWxsYmFjaykKKwkJY21kLT5jYWxsYmFjayA9IGlsX2dlbmVyaWNfY21kX2NhbGxiYWNrOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXQgPSBpbF9lbnF1ZXVlX2hjbWQoaWwsIGNtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJSUxfRVJSKCJFcnJvciBzZW5kaW5nICVzOiBlbnF1ZXVlX2hjbWQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitpbF9zZW5kX2NtZF9zeW5jKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2hvc3RfY21kICpjbWQpCit7CisJaW50IGNtZF9pZHg7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlCVUdfT04oY21kLT5mbGFncyAmIENNRF9BU1lOQyk7CisKKwkvKiBBIHN5bmNocm9ub3VzIGNvbW1hbmQgY2FuIG5vdCBoYXZlIGEgY2FsbGJhY2sgc2V0LiAqLworCUJVR19PTihjbWQtPmNhbGxiYWNrKTsKKworCURfSU5GTygiQXR0ZW1wdGluZyB0byBzZW5kIHN5bmMgY29tbWFuZCAlc1xuIiwKKwkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCisJc2V0X2JpdChTX0hDTURfQUNUSVZFLCAmaWwtPnN0YXR1cyk7CisJRF9JTkZPKCJTZXR0aW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAorCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisKKwljbWRfaWR4ID0gaWxfZW5xdWV1ZV9oY21kKGlsLCBjbWQpOworCWlmIChjbWRfaWR4IDwgMCkgeworCQlyZXQgPSBjbWRfaWR4OworCQlJTF9FUlIoIkVycm9yIHNlbmRpbmcgJXM6IGVucXVldWVfaGNtZCBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChpbC0+d2FpdF9jb21tYW5kX3F1ZXVlLAorCQkJCSAhdGVzdF9iaXQoU19IQ01EX0FDVElWRSwgJmlsLT5zdGF0dXMpLAorCQkJCSBIT1NUX0NPTVBMRVRFX1RJTUVPVVQpOworCWlmICghcmV0KSB7CisJCWlmICh0ZXN0X2JpdChTX0hDTURfQUNUSVZFLCAmaWwtPnN0YXR1cykpIHsKKwkJCUlMX0VSUigiRXJyb3Igc2VuZGluZyAlczogdGltZSBvdXQgYWZ0ZXIgJWRtcy5cbiIsCisJCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksCisJCQkgICAgICAgamlmZmllc190b19tc2VjcyhIT1NUX0NPTVBMRVRFX1RJTUVPVVQpKTsKKworCQkJY2xlYXJfYml0KFNfSENNRF9BQ1RJVkUsICZpbC0+c3RhdHVzKTsKKwkJCURfSU5GTygiQ2xlYXJpbmcgSENNRF9BQ1RJVkUgZm9yIGNvbW1hbmQgJXNcbiIsCisJCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJCWdvdG8gY2FuY2VsOworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpKSB7CisJCUlMX0VSUigiQ29tbWFuZCAlcyBhYm9ydGVkOiBSRiBLSUxMIFN3aXRjaFxuIiwKKwkJICAgICAgIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKKwkJcmV0ID0gLUVDQU5DRUxFRDsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodGVzdF9iaXQoU19GV19FUlJPUiwgJmlsLT5zdGF0dXMpKSB7CisJCUlMX0VSUigiQ29tbWFuZCAlcyBmYWlsZWQ6IEZXIEVycm9yXG4iLAorCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZhaWw7CisJfQorCWlmICgoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikgJiYgIWNtZC0+cmVwbHlfcGFnZSkgeworCQlJTF9FUlIoIkVycm9yOiBSZXNwb25zZSBOVUxMIGluICclcydcbiIsCisJCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gY2FuY2VsOworCX0KKworCXJldCA9IDA7CisJZ290byBvdXQ7CisKK2NhbmNlbDoKKwlpZiAoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikgeworCQkvKgorCQkgKiBDYW5jZWwgdGhlIENNRF9XQU5UX1NLQiBmbGFnIGZvciB0aGUgY21kIGluIHRoZQorCQkgKiBUWCBjbWQgcXVldWUuIE90aGVyd2lzZSBpbiBjYXNlIHRoZSBjbWQgY29tZXMKKwkJICogaW4gbGF0ZXIsIGl0IHdpbGwgcG9zc2libHkgc2V0IGFuIGludmFsaWQKKwkJICogYWRkcmVzcyAoY21kLT5tZXRhLnNvdXJjZSkuCisJCSAqLworCQlpbC0+dHhxW2lsLT5jbWRfcXVldWVdLm1ldGFbY21kX2lkeF0uZmxhZ3MgJj0gfkNNRF9XQU5UX1NLQjsKKwl9CitmYWlsOgorCWlmIChjbWQtPnJlcGx5X3BhZ2UpIHsKKwkJaWxfZnJlZV9wYWdlcyhpbCwgY21kLT5yZXBseV9wYWdlKTsKKwkJY21kLT5yZXBseV9wYWdlID0gMDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9jbWRfc3luYyk7CisKK2ludAoraWxfc2VuZF9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaG9zdF9jbWQgKmNtZCkKK3sKKwlpZiAoY21kLT5mbGFncyAmIENNRF9BU1lOQykKKwkJcmV0dXJuIGlsX3NlbmRfY21kX2FzeW5jKGlsLCBjbWQpOworCisJcmV0dXJuIGlsX3NlbmRfY21kX3N5bmMoaWwsIGNtZCk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NlbmRfY21kKTsKKworaW50CitpbF9zZW5kX2NtZF9wZHUoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBpZCwKKwkJLmxlbiA9IGxlbiwKKwkJLmRhdGEgPSBkYXRhLAorCX07CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfc3luYyhpbCwgJmNtZCk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NlbmRfY21kX3BkdSk7CisKK2ludAoraWxfc2VuZF9jbWRfcGR1X2FzeW5jKHN0cnVjdCBpbF9wcml2ICppbCwgdTggaWQsIHUxNiBsZW4sIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCQkJc3RydWN0IGlsX3J4X3BrdCAqcGt0KSkKK3sKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBpZCwKKwkJLmxlbiA9IGxlbiwKKwkJLmRhdGEgPSBkYXRhLAorCX07CisKKwljbWQuZmxhZ3MgfD0gQ01EX0FTWU5DOworCWNtZC5jYWxsYmFjayA9IGNhbGxiYWNrOworCisJcmV0dXJuIGlsX3NlbmRfY21kX2FzeW5jKGlsLCAmY21kKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9jbWRfcGR1X2FzeW5jKTsKKworLyogZGVmYXVsdDogSUxfTEVEX0JMSU5LKDApIHVzaW5nIGJsaW5raW5nIGlkeCB0YWJsZSAqLworc3RhdGljIGludCBsZWRfbW9kZTsKK21vZHVsZV9wYXJhbShsZWRfbW9kZSwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobGVkX21vZGUsCisJCSAiMD1zeXN0ZW0gZGVmYXVsdCwgIiAiMT1PbihSRiBPbikvT2ZmKFJGIE9mZiksIDI9YmxpbmtpbmciKTsKKworLyogVGhyb3VnaHB1dAkJT0ZGIHRpbWUobXMpCU9OIHRpbWUgKG1zKQorICoJPjMwMAkJCTI1CQkyNQorICoJPjIwMCB0byAzMDAJCTQwCQk0MAorICoJPjEwMCB0byAyMDAJCTU1CQk1NQorICoJPjcwIHRvIDEwMAkJNjUJCTY1CisgKgk+NTAgdG8gNzAJCTc1CQk3NQorICoJPjIwIHRvIDUwCQk4NQkJODUKKyAqCT4xMCB0byAyMAkJOTUJCTk1CisgKgk+NSB0byAxMAkJMTEwCQkxMTAKKyAqCT4xIHRvIDUJCQkxMzAJCTEzMAorICoJPjAgdG8gMQkJCTE2NwkJMTY3CisgKgk8PTAJCQkJCVNPTElEIE9OCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3RwdF9ibGluayBpbF9ibGlua1tdID0geworCXsudGhyb3VnaHB1dCA9IDAsCQkuYmxpbmtfdGltZSA9IDMzNH0sCisJey50aHJvdWdocHV0ID0gMSAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDI2MH0sCisJey50aHJvdWdocHV0ID0gNSAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDIyMH0sCisJey50aHJvdWdocHV0ID0gMTAgKiAxMDI0IC0gMSwJLmJsaW5rX3RpbWUgPSAxOTB9LAorCXsudGhyb3VnaHB1dCA9IDIwICogMTAyNCAtIDEsCS5ibGlua190aW1lID0gMTcwfSwKKwl7LnRocm91Z2hwdXQgPSA1MCAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDE1MH0sCisJey50aHJvdWdocHV0ID0gNzAgKiAxMDI0IC0gMSwJLmJsaW5rX3RpbWUgPSAxMzB9LAorCXsudGhyb3VnaHB1dCA9IDEwMCAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDExMH0sCisJey50aHJvdWdocHV0ID0gMjAwICogMTAyNCAtIDEsCS5ibGlua190aW1lID0gODB9LAorCXsudGhyb3VnaHB1dCA9IDMwMCAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDUwfSwKK307CisKKy8qCisgKiBBZGp1c3QgbGVkIGJsaW5rIHJhdGUgdG8gY29tcGVuc2F0ZSBvbiBhIE1BQyBDbG9jayBkaWZmZXJlbmNlIG9uIGV2ZXJ5IEhXCisgKiBMZWQgYmxpbmsgcmF0ZSBhbmFseXNpcyBzaG93ZWQgYW4gYXZlcmFnZSBkZXZpYXRpb24gb2YgMCUgb24gMzk0NSwKKyAqIDUlIG9uIDQ5NjUgSFcuCisgKiBOZWVkIHRvIGNvbXBlbnNhdGUgb24gdGhlIGxlZCBvbi9vZmYgdGltZSBwZXIgSFcgYWNjb3JkaW5nIHRvIHRoZSBkZXZpYXRpb24KKyAqIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgbGVkIGZyZXF1ZW5jeQorICogVGhlIGNhbGN1bGF0aW9uIGlzOiAoMTAwLWF2ZXJhZ2VEZXZpYXRpb24pLzEwMCAqIGJsaW5rVGltZQorICogRm9yIGNvZGUgZWZmaWNpZW5jeSB0aGUgY2FsY3VsYXRpb24gd2lsbCBiZToKKyAqICAgICBjb21wZW5zYXRpb24gPSAoMTAwIC0gYXZlcmFnZURldmlhdGlvbikgKiA2NCAvIDEwMAorICogICAgIE5ld0JsaW5rVGltZSA9IChjb21wZW5zYXRpb24gKiBCbGlua1RpbWUpIC8gNjQKKyAqLworc3RhdGljIGlubGluZSB1OAoraWxfYmxpbmtfY29tcGVuc2F0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgdTggdGltZSwgdTE2IGNvbXBlbnNhdGlvbikKK3sKKwlpZiAoIWNvbXBlbnNhdGlvbikgeworCQlJTF9FUlIoInVuZGVmaW5lZCBibGluayBjb21wZW5zYXRpb246ICIKKwkJICAgICAgICJ1c2UgcHJlLWRlZmluZWQgYmxpbmtpbmcgdGltZVxuIik7CisJCXJldHVybiB0aW1lOworCX0KKworCXJldHVybiAodTgpICgodGltZSAqIGNvbXBlbnNhdGlvbikgPj4gNik7Cit9CisKKy8qIFNldCBsZWQgcGF0dGVybiBjb21tYW5kICovCitzdGF0aWMgaW50CitpbF9sZWRfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgdW5zaWduZWQgbG9uZyBvbiwgdW5zaWduZWQgbG9uZyBvZmYpCit7CisJc3RydWN0IGlsX2xlZF9jbWQgbGVkX2NtZCA9IHsKKwkJLmlkID0gSUxfTEVEX0xJTkssCisJCS5pbnRlcnZhbCA9IElMX0RFRl9MRURfSU5UUlZMCisJfTsKKwlpbnQgcmV0OworCisJaWYgKCF0ZXN0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cykpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoaWwtPmJsaW5rX29uID09IG9uICYmIGlsLT5ibGlua19vZmYgPT0gb2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChvZmYgPT0gMCkgeworCQkvKiBsZWQgaXMgU09MSURfT04gKi8KKwkJb24gPSBJTF9MRURfU09MSUQ7CisJfQorCisJRF9MRUQoIkxlZCBibGluayB0aW1lIGNvbXBlbnNhdGlvbj0ldVxuIiwKKwkgICAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bGVkX2NvbXBlbnNhdGlvbik7CisJbGVkX2NtZC5vbiA9CisJICAgIGlsX2JsaW5rX2NvbXBlbnNhdGlvbihpbCwgb24sCisJCQkJICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bGVkX2NvbXBlbnNhdGlvbik7CisJbGVkX2NtZC5vZmYgPQorCSAgICBpbF9ibGlua19jb21wZW5zYXRpb24oaWwsIG9mZiwKKwkJCQkgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKKworCXJldCA9IGlsLT5jZmctPm9wcy0+bGVkLT5jbWQoaWwsICZsZWRfY21kKTsKKwlpZiAoIXJldCkgeworCQlpbC0+Ymxpbmtfb24gPSBvbjsKKwkJaWwtPmJsaW5rX29mZiA9IG9mZjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lsX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwkJICAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGlsX3ByaXYsIGxlZCk7CisJdW5zaWduZWQgbG9uZyBvbiA9IDA7CisKKwlpZiAoYnJpZ2h0bmVzcyA+IDApCisJCW9uID0gSUxfTEVEX1NPTElEOworCisJaWxfbGVkX2NtZChpbCwgb24sIDApOworfQorCitzdGF0aWMgaW50CitpbF9sZWRfYmxpbmtfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LCB1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKKwkJIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBpbF9wcml2LCBsZWQpOworCisJcmV0dXJuIGlsX2xlZF9jbWQoaWwsICpkZWxheV9vbiwgKmRlbGF5X29mZik7Cit9CisKK3ZvaWQKK2lsX2xlZHNfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IG1vZGUgPSBsZWRfbW9kZTsKKwlpbnQgcmV0OworCisJaWYgKG1vZGUgPT0gSUxfTEVEX0RFRkFVTFQpCisJCW1vZGUgPSBpbC0+Y2ZnLT5sZWRfbW9kZTsKKworCWlsLT5sZWQubmFtZSA9CisJICAgIGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMtbGVkIiwgd2lwaHlfbmFtZShpbC0+aHctPndpcGh5KSk7CisJaWwtPmxlZC5icmlnaHRuZXNzX3NldCA9IGlsX2xlZF9icmlnaHRuZXNzX3NldDsKKwlpbC0+bGVkLmJsaW5rX3NldCA9IGlsX2xlZF9ibGlua19zZXQ7CisJaWwtPmxlZC5tYXhfYnJpZ2h0bmVzcyA9IDE7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIElMX0xFRF9ERUZBVUxUOgorCQlXQVJOX09OKDEpOworCQlicmVhazsKKwljYXNlIElMX0xFRF9CTElOSzoKKwkJaWwtPmxlZC5kZWZhdWx0X3RyaWdnZXIgPQorCQkgICAgaWVlZTgwMjExX2NyZWF0ZV90cHRfbGVkX3RyaWdnZXIoaWwtPmh3LAorCQkJCQkJICAgICBJRUVFODAyMTFfVFBUX0xFRFRSSUdfRkxfQ09OTkVDVEVELAorCQkJCQkJICAgICBpbF9ibGluaywKKwkJCQkJCSAgICAgQVJSQVlfU0laRShpbF9ibGluaykpOworCQlicmVhazsKKwljYXNlIElMX0xFRF9SRl9TVEFURToKKwkJaWwtPmxlZC5kZWZhdWx0X3RyaWdnZXIgPSBpZWVlODAyMTFfZ2V0X3JhZGlvX2xlZF9uYW1lKGlsLT5odyk7CisJCWJyZWFrOworCX0KKworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmaWwtPnBjaV9kZXYtPmRldiwgJmlsLT5sZWQpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoaWwtPmxlZC5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlsLT5sZWRfcmVnaXN0ZXJlZCA9IHRydWU7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2xlZHNfaW5pdCk7CisKK3ZvaWQKK2lsX2xlZHNfZXhpdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWYgKCFpbC0+bGVkX3JlZ2lzdGVyZWQpCisJCXJldHVybjsKKworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZpbC0+bGVkKTsKKwlrZnJlZShpbC0+bGVkLm5hbWUpOworfQorRVhQT1JUX1NZTUJPTChpbF9sZWRzX2V4aXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRUVQUk9NIEJBTkRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgaWxfZWVwcm9tX2JhbmQgZGVmaW5pdGlvbnMgYmVsb3cgcHJvdmlkZSB0aGUgbWFwcGluZyBmcm9tIHRoZQorICogRUVQUk9NIGNvbnRlbnRzIHRvIHRoZSBzcGVjaWZpYyBjaGFubmVsIG51bWJlciBzdXBwb3J0ZWQgZm9yIGVhY2gKKyAqIGJhbmQuCisgKgorICogRm9yIGV4YW1wbGUsIGlsX3ByaXYtPmVlcHJvbS5iYW5kXzNfY2hhbm5lbHNbNF0gZnJvbSB0aGUgYmFuZF8zCisgKiBkZWZpbml0aW9uIGJlbG93IG1hcHMgdG8gcGh5c2ljYWwgY2hhbm5lbCA0MiBpbiB0aGUgNS4yR0h6IHNwZWN0cnVtLgorICogVGhlIHNwZWNpZmljIGdlb2dyYXBoeSBhbmQgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoYXQgY2hhbm5lbAorICogaXMgY29udGFpbmVkIGluIHRoZSBlZXByb20gbWFwIGl0c2VsZi4KKyAqCisgKiBEdXJpbmcgaW5pdCwgd2UgY29weSB0aGUgZWVwcm9tIGluZm9ybWF0aW9uIGFuZCBjaGFubmVsIG1hcAorICogaW5mb3JtYXRpb24gaW50byBpbC0+Y2hhbm5lbF9pbmZvXzI0LzUyIGFuZCBpbC0+Y2hhbm5lbF9tYXBfMjQvNTIKKyAqCisgKiBjaGFubmVsX21hcF8yNC81MiBwcm92aWRlcyB0aGUgaWR4IGluIHRoZSBjaGFubmVsX2luZm8gYXJyYXkgZm9yIGEKKyAqIGdpdmVuIGNoYW5uZWwuICBXZSBoYXZlIHRvIGhhdmUgdHdvIHNlcGFyYXRlIG1hcHMgYXMgdGhlcmUgaXMgY2hhbm5lbAorICogb3ZlcmxhcCB3aXRoIHRoZSAyLjRHSHogYW5kIDUuMkdIeiBzcGVjdHJ1bSBhcyBzZWVuIGluIGJhbmRfMSBhbmQKKyAqIGJhbmRfMgorICoKKyAqIEEgdmFsdWUgb2YgMHhmZiBzdG9yZWQgaW4gdGhlIGNoYW5uZWxfbWFwIGluZGljYXRlcyB0aGF0IHRoZSBjaGFubmVsCisgKiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSBhdCBhbGwuCisgKgorICogQSB2YWx1ZSBvZiAweGZlIGluIHRoZSBjaGFubmVsX21hcCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hhbm5lbCBpcyBub3QKKyAqIHZhbGlkIGZvciBUeCB3aXRoIHRoZSBjdXJyZW50IGhhcmR3YXJlLiAgVGhpcyBtZWFucyB0aGF0CisgKiB3aGlsZSB0aGUgc3lzdGVtIGNhbiB0dW5lIGFuZCByZWNlaXZlIG9uIGEgZ2l2ZW4gY2hhbm5lbCwgaXQgbWF5IG5vdAorICogYmUgYWJsZSB0byBhc3NvY2lhdGUgb3IgdHJhbnNtaXQgYW55IGZyYW1lcyBvbiB0aGF0CisgKiBjaGFubmVsLiAgVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uIGZvciB0aGF0CisgKiBlbnRyeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAyLjQgR0h6ICovCitjb25zdCB1OCBpbF9lZXByb21fYmFuZF8xWzE0XSA9IHsKKwkxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKK307CisKKy8qIDUuMiBHSHogYmFuZHMgKi8KK3N0YXRpYyBjb25zdCB1OCBpbF9lZXByb21fYmFuZF8yW10gPSB7CS8qIDQ5MTUtNTA4ME1IeiAqLworCTE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODksIDE5MiwgMTk2LCA3LCA4LCAxMSwgMTIsIDE2Cit9OworCitzdGF0aWMgY29uc3QgdTggaWxfZWVwcm9tX2JhbmRfM1tdID0gewkvKiA1MTcwLTUzMjBNSHogKi8KKwkzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUyLCA1NiwgNjAsIDY0Cit9OworCitzdGF0aWMgY29uc3QgdTggaWxfZWVwcm9tX2JhbmRfNFtdID0gewkvKiA1NTAwLTU3MDBNSHogKi8KKwkxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorfTsKKworc3RhdGljIGNvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzVbXSA9IHsJLyogNTcyNS01ODI1TUh6ICovCisJMTQ1LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorfTsKKworc3RhdGljIGNvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzZbXSA9IHsJLyogMi40IGh0NDAgY2hhbm5lbCAqLworCTEsIDIsIDMsIDQsIDUsIDYsIDcKK307CisKK3N0YXRpYyBjb25zdCB1OCBpbF9lZXByb21fYmFuZF83W10gPSB7CS8qIDUuMiBodDQwIGNoYW5uZWwgKi8KKwkzNiwgNDQsIDUyLCA2MCwgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzIsIDE0OSwgMTU3Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRUVQUk9NIHJlbGF0ZWQgZnVuY3Rpb25zCisgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitpbF9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTMyIGdwID0gX2lsX3JkKGlsLCBDU1JfRUVQUk9NX0dQKSAmIENTUl9FRVBST01fR1BfVkFMSURfTVNLOworCWludCByZXQgPSAwOworCisJRF9FRVBST00oIkVFUFJPTSBzaWduYXR1cmU9MHglMDh4XG4iLCBncCk7CisJc3dpdGNoIChncCkgeworCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTEVTU19USEFOXzRLOgorCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTU9SRV9USEFOXzRLOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJTF9FUlIoImJhZCBFRVBST00gc2lnbmF0dXJlLCIgIkVFUFJPTV9HUD0weCUwOHhcbiIsIGdwKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2NvbnN0IHU4ICoKK2lsX2VlcHJvbV9xdWVyeV9hZGRyKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwgc2l6ZV90IG9mZnNldCkKK3sKKwlCVUdfT04ob2Zmc2V0ID49IGlsLT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZSk7CisJcmV0dXJuICZpbC0+ZWVwcm9tW29mZnNldF07Cit9CitFWFBPUlRfU1lNQk9MKGlsX2VlcHJvbV9xdWVyeV9hZGRyKTsKKwordTE2CitpbF9lZXByb21fcXVlcnkxNihjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIHNpemVfdCBvZmZzZXQpCit7CisJaWYgKCFpbC0+ZWVwcm9tKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHUxNikgaWwtPmVlcHJvbVtvZmZzZXRdIHwgKCh1MTYpIGlsLT5lZXByb21bb2Zmc2V0ICsgMV0gPDwgOCk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2VlcHJvbV9xdWVyeTE2KTsKKworLyoqCisgKiBpbF9lZXByb21faW5pdCAtIHJlYWQgRUVQUk9NIGNvbnRlbnRzCisgKgorICogTG9hZCB0aGUgRUVQUk9NIGNvbnRlbnRzIGZyb20gYWRhcHRlciBpbnRvIGlsLT5lZXByb20KKyAqCisgKiBOT1RFOiAgVGhpcyByb3V0aW5lIHVzZXMgdGhlIG5vbi1kZWJ1ZyBJTyBhY2Nlc3MgZnVuY3Rpb25zLgorICovCitpbnQKK2lsX2VlcHJvbV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfX2xlMTYgKmU7CisJdTMyIGdwID0gX2lsX3JkKGlsLCBDU1JfRUVQUk9NX0dQKTsKKwlpbnQgc3o7CisJaW50IHJldDsKKwl1MTYgYWRkcjsKKworCS8qIGFsbG9jYXRlIGVlcHJvbSAqLworCXN6ID0gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplOworCURfRUVQUk9NKCJOVk0gc2l6ZSA9ICVkXG4iLCBzeik7CisJaWwtPmVlcHJvbSA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghaWwtPmVlcHJvbSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFsbG9jX2VycjsKKwl9CisJZSA9IChfX2xlMTYgKikgaWwtPmVlcHJvbTsKKworCWlsLT5jZmctPm9wcy0+bGliLT5hcG1fb3BzLmluaXQoaWwpOworCisJcmV0ID0gaWxfZWVwcm9tX3ZlcmlmeV9zaWduYXR1cmUoaWwpOworCWlmIChyZXQgPCAwKSB7CisJCUlMX0VSUigiRUVQUk9NIG5vdCBmb3VuZCwgRUVQUk9NX0dQPTB4JTA4eFxuIiwgZ3ApOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgZHJpdmVyIChpbnN0ZWFkIG9mIHVDb2RlKSBpcyBhbGxvd2VkIHRvIHJlYWQgRUVQUk9NICovCisJcmV0ID0gaWwtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMuYWNxdWlyZV9zZW1hcGhvcmUoaWwpOworCWlmIChyZXQgPCAwKSB7CisJCUlMX0VSUigiRmFpbGVkIHRvIGFjcXVpcmUgRUVQUk9NIHNlbWFwaG9yZS5cbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBlZXByb20gaXMgYW4gYXJyYXkgb2YgMTZiaXQgdmFsdWVzICovCisJZm9yIChhZGRyID0gMDsgYWRkciA8IHN6OyBhZGRyICs9IHNpemVvZih1MTYpKSB7CisJCXUzMiByOworCisJCV9pbF93cihpbCwgQ1NSX0VFUFJPTV9SRUcsCisJCSAgICAgICBDU1JfRUVQUk9NX1JFR19NU0tfQUREUiAmIChhZGRyIDw8IDEpKTsKKworCQlyZXQgPQorCQkgICAgX2lsX3BvbGxfYml0KGlsLCBDU1JfRUVQUk9NX1JFRywKKwkJCQkgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0ssCisJCQkJIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLLAorCQkJCSBJTF9FRVBST01fQUNDRVNTX1RJTUVPVVQpOworCQlpZiAocmV0IDwgMCkgeworCQkJSUxfRVJSKCJUaW1lIG91dCByZWFkaW5nIEVFUFJPTVslZF1cbiIsIGFkZHIpOworCQkJZ290byBkb25lOworCQl9CisJCXIgPSBfaWxfcmQoaWwsIENTUl9FRVBST01fUkVHKTsKKwkJZVthZGRyIC8gMl0gPSBjcHVfdG9fbGUxNihyID4+IDE2KTsKKwl9CisKKwlEX0VFUFJPTSgiTlZNIFR5cGU6ICVzLCB2ZXJzaW9uOiAweCV4XG4iLCAiRUVQUk9NIiwKKwkJIGlsX2VlcHJvbV9xdWVyeTE2KGlsLCBFRVBST01fVkVSU0lPTikpOworCisJcmV0ID0gMDsKK2RvbmU6CisJaWwtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVsZWFzZV9zZW1hcGhvcmUoaWwpOworCitlcnI6CisJaWYgKHJldCkKKwkJaWxfZWVwcm9tX2ZyZWUoaWwpOworCS8qIFJlc2V0IGNoaXAgdG8gc2F2ZSBwb3dlciB1bnRpbCB3ZSBsb2FkIHVDb2RlIGR1cmluZyAidXAiLiAqLworCWlsX2FwbV9zdG9wKGlsKTsKK2FsbG9jX2VycjoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9lZXByb21faW5pdCk7CisKK3ZvaWQKK2lsX2VlcHJvbV9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlrZnJlZShpbC0+ZWVwcm9tKTsKKwlpbC0+ZWVwcm9tID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaWxfZWVwcm9tX2ZyZWUpOworCitzdGF0aWMgdm9pZAoraWxfaW5pdF9iYW5kX3JlZmVyZW5jZShjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBlZXBfYmFuZCwKKwkJICAgICAgIGludCAqZWVwcm9tX2NoX2NvdW50LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICoqZWVwcm9tX2NoX2luZm8sCisJCSAgICAgICBjb25zdCB1OCAqKmVlcHJvbV9jaF9pZHgpCit7CisJdTMyIG9mZnNldCA9CisJICAgIGlsLT5jZmctPm9wcy0+bGliLT5lZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbZWVwX2JhbmQgLSAxXTsKKwlzd2l0Y2ggKGVlcF9iYW5kKSB7CisJY2FzZSAxOgkJLyogMi40R0h6IGJhbmQgKi8KKwkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfMSk7CisJCSplZXByb21fY2hfaW5mbyA9CisJCSAgICAoc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICopaWxfZWVwcm9tX3F1ZXJ5X2FkZHIoaWwsCisJCQkJCQkJCSAgICAgb2Zmc2V0KTsKKwkJKmVlcHJvbV9jaF9pZHggPSBpbF9lZXByb21fYmFuZF8xOworCQlicmVhazsKKwljYXNlIDI6CQkvKiA0LjlHSHogYmFuZCAqLworCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF8yKTsKKwkJKmVlcHJvbV9jaF9pbmZvID0KKwkJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKilpbF9lZXByb21fcXVlcnlfYWRkcihpbCwKKwkJCQkJCQkJICAgICBvZmZzZXQpOworCQkqZWVwcm9tX2NoX2lkeCA9IGlsX2VlcHJvbV9iYW5kXzI7CisJCWJyZWFrOworCWNhc2UgMzoJCS8qIDUuMkdIeiBiYW5kICovCisJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzMpOworCQkqZWVwcm9tX2NoX2luZm8gPQorCQkgICAgKHN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCAqKWlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLAorCQkJCQkJCQkgICAgIG9mZnNldCk7CisJCSplZXByb21fY2hfaWR4ID0gaWxfZWVwcm9tX2JhbmRfMzsKKwkJYnJlYWs7CisJY2FzZSA0OgkJLyogNS41R0h6IGJhbmQgKi8KKwkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfNCk7CisJCSplZXByb21fY2hfaW5mbyA9CisJCSAgICAoc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICopaWxfZWVwcm9tX3F1ZXJ5X2FkZHIoaWwsCisJCQkJCQkJCSAgICAgb2Zmc2V0KTsKKwkJKmVlcHJvbV9jaF9pZHggPSBpbF9lZXByb21fYmFuZF80OworCQlicmVhazsKKwljYXNlIDU6CQkvKiA1LjdHSHogYmFuZCAqLworCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF81KTsKKwkJKmVlcHJvbV9jaF9pbmZvID0KKwkJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKilpbF9lZXByb21fcXVlcnlfYWRkcihpbCwKKwkJCQkJCQkJICAgICBvZmZzZXQpOworCQkqZWVwcm9tX2NoX2lkeCA9IGlsX2VlcHJvbV9iYW5kXzU7CisJCWJyZWFrOworCWNhc2UgNjoJCS8qIDIuNEdIeiBodDQwIGNoYW5uZWxzICovCisJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzYpOworCQkqZWVwcm9tX2NoX2luZm8gPQorCQkgICAgKHN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCAqKWlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLAorCQkJCQkJCQkgICAgIG9mZnNldCk7CisJCSplZXByb21fY2hfaWR4ID0gaWxfZWVwcm9tX2JhbmRfNjsKKwkJYnJlYWs7CisJY2FzZSA3OgkJLyogNSBHSHogaHQ0MCBjaGFubmVscyAqLworCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF83KTsKKwkJKmVlcHJvbV9jaF9pbmZvID0KKwkJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKilpbF9lZXByb21fcXVlcnlfYWRkcihpbCwKKwkJCQkJCQkJICAgICBvZmZzZXQpOworCQkqZWVwcm9tX2NoX2lkeCA9IGlsX2VlcHJvbV9iYW5kXzc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworI2RlZmluZSBDSEVDS19BTkRfUFJJTlQoeCkgKChlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfIyN4KSBcCisJCQkgICAgPyAjIHggIiAiIDogIiIpCisvKioKKyAqIGlsX21vZF9odDQwX2NoYW5faW5mbyAtIENvcHkgaHQ0MCBjaGFubmVsIGluZm8gaW50byBkcml2ZXIncyBpbC4KKyAqCisgKiBEb2VzIG5vdCBzZXQgdXAgYSBjb21tYW5kLCBvciB0b3VjaCBoYXJkd2FyZS4KKyAqLworc3RhdGljIGludAoraWxfbW9kX2h0NDBfY2hhbl9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLCB1MTYgY2hhbm5lbCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICplZXByb21fY2gsCisJCSAgICAgIHU4IGNsZWFyX2h0NDBfZXh0ZW5zaW9uX2NoYW5uZWwpCit7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKworCWNoX2luZm8gPQorCSAgICAoc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqKWlsX2dldF9jaGFubmVsX2luZm8oaWwsIGJhbmQsIGNoYW5uZWwpOworCisJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKQorCQlyZXR1cm4gLTE7CisKKwlEX0VFUFJPTSgiSFQ0MCBDaC4gJWQgWyVzR0h6XSAlcyVzJXMlcyVzKDB4JTAyeCAlZGRCbSk6IgorCQkgIiBBZC1Ib2MgJXNzdXBwb3J0ZWRcbiIsIGNoX2luZm8tPmNoYW5uZWwsCisJCSBpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSA/ICI1LjIiIDogIjIuNCIsCisJCSBDSEVDS19BTkRfUFJJTlQoSUJTUyksIENIRUNLX0FORF9QUklOVChBQ1RJVkUpLAorCQkgQ0hFQ0tfQU5EX1BSSU5UKFJBREFSKSwgQ0hFQ0tfQU5EX1BSSU5UKFdJREUpLAorCQkgQ0hFQ0tfQU5EX1BSSU5UKERGUyksIGVlcHJvbV9jaC0+ZmxhZ3MsCisJCSBlZXByb21fY2gtPm1heF9wb3dlcl9hdmcsCisJCSAoKGVlcHJvbV9jaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9JQlNTKSAmJgorCQkgICEoZWVwcm9tX2NoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1JBREFSKSkgPyAiIiA6ICJub3QgIik7CisKKwljaF9pbmZvLT5odDQwX2VlcHJvbSA9ICplZXByb21fY2g7CisJY2hfaW5mby0+aHQ0MF9tYXhfcG93ZXJfYXZnID0gZWVwcm9tX2NoLT5tYXhfcG93ZXJfYXZnOworCWNoX2luZm8tPmh0NDBfZmxhZ3MgPSBlZXByb21fY2gtPmZsYWdzOworCWlmIChlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfVkFMSUQpCisJCWNoX2luZm8tPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgJj0KKwkJICAgIH5jbGVhcl9odDQwX2V4dGVuc2lvbl9jaGFubmVsOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfQU5EX1BSSU5UX0koeCkgKChlZXByb21fY2hfaW5mb1tjaF0uZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF8jI3gpIFwKKwkJCSAgICA/ICMgeCAiICIgOiAiIikKKworLyoqCisgKiBpbF9pbml0X2NoYW5uZWxfbWFwIC0gU2V0IHVwIGRyaXZlcidzIGluZm8gZm9yIGFsbCBwb3NzaWJsZSBjaGFubmVscworICovCitpbnQKK2lsX2luaXRfY2hhbm5lbF9tYXAoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCBlZXByb21fY2hfY291bnQgPSAwOworCWNvbnN0IHU4ICplZXByb21fY2hfaWR4ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKmVlcHJvbV9jaF9pbmZvID0gTlVMTDsKKwlpbnQgYmFuZCwgY2g7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKworCWlmIChpbC0+Y2hhbm5lbF9jb3VudCkgeworCQlEX0VFUFJPTSgiQ2hhbm5lbCBtYXAgYWxyZWFkeSBpbml0aWFsaXplZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEX0VFUFJPTSgiSW5pdGlhbGl6aW5nIHJlZ3VsYXRvcnkgaW5mbyBmcm9tIEVFUFJPTVxuIik7CisKKwlpbC0+Y2hhbm5lbF9jb3VudCA9CisJICAgIEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfMSkgKyBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzIpICsKKwkgICAgQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF8zKSArIEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfNCkgKworCSAgICBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzUpOworCisJRF9FRVBST00oIlBhcnNpbmcgZGF0YSBmb3IgJWQgY2hhbm5lbHMuXG4iLCBpbC0+Y2hhbm5lbF9jb3VudCk7CisKKwlpbC0+Y2hhbm5lbF9pbmZvID0KKwkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IGlsX2NoYW5uZWxfaW5mbykgKiBpbC0+Y2hhbm5lbF9jb3VudCwKKwkJICAgIEdGUF9LRVJORUwpOworCWlmICghaWwtPmNoYW5uZWxfaW5mbykgeworCQlJTF9FUlIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBjaGFubmVsX2luZm9cbiIpOworCQlpbC0+Y2hhbm5lbF9jb3VudCA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNoX2luZm8gPSBpbC0+Y2hhbm5lbF9pbmZvOworCisJLyogTG9vcCB0aHJvdWdoIHRoZSA1IEVFUFJPTSBiYW5kcyBhZGRpbmcgdGhlbSBpbiBvcmRlciB0byB0aGUKKwkgKiBjaGFubmVsIG1hcCB3ZSBtYWludGFpbiAodGhhdCBjb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYW4KKwkgKiB3aGF0IGp1c3QgaW4gdGhlIEVFUFJPTSkgKi8KKwlmb3IgKGJhbmQgPSAxOyBiYW5kIDw9IDU7IGJhbmQrKykgeworCisJCWlsX2luaXRfYmFuZF9yZWZlcmVuY2UoaWwsIGJhbmQsICZlZXByb21fY2hfY291bnQsCisJCQkJICAgICAgICZlZXByb21fY2hfaW5mbywgJmVlcHJvbV9jaF9pZHgpOworCisJCS8qIExvb3AgdGhyb3VnaCBlYWNoIGJhbmQgYWRkaW5nIGVhY2ggb2YgdGhlIGNoYW5uZWxzICovCisJCWZvciAoY2ggPSAwOyBjaCA8IGVlcHJvbV9jaF9jb3VudDsgY2grKykgeworCQkJY2hfaW5mby0+Y2hhbm5lbCA9IGVlcHJvbV9jaF9pZHhbY2hdOworCQkJY2hfaW5mby0+YmFuZCA9CisJCQkgICAgKGJhbmQgPT0KKwkJCSAgICAgMSkgPyBJRUVFODAyMTFfQkFORF8yR0haIDogSUVFRTgwMjExX0JBTkRfNUdIWjsKKworCQkJLyogcGVybWFuZW50bHkgc3RvcmUgRUVQUk9NJ3MgY2hhbm5lbCByZWd1bGF0b3J5IGZsYWdzCisJCQkgKiAgIGFuZCBtYXggcG93ZXIgaW4gY2hhbm5lbCBpbmZvIGRhdGFiYXNlLiAqLworCQkJY2hfaW5mby0+ZWVwcm9tID0gZWVwcm9tX2NoX2luZm9bY2hdOworCisJCQkvKiBDb3B5IHRoZSBydW4tdGltZSBmbGFncyBzbyB0aGV5IGFyZSB0aGVyZSBldmVuIG9uCisJCQkgKiBpbnZhbGlkIGNoYW5uZWxzICovCisJCQljaF9pbmZvLT5mbGFncyA9IGVlcHJvbV9jaF9pbmZvW2NoXS5mbGFnczsKKwkJCS8qIEZpcnN0IHdyaXRlIHRoYXQgaHQ0MCBpcyBub3QgZW5hYmxlZCwgYW5kIHRoZW4gZW5hYmxlCisJCQkgKiBvbmUgYnkgb25lICovCisJCQljaF9pbmZvLT5odDQwX2V4dGVuc2lvbl9jaGFubmVsID0KKwkJCSAgICBJRUVFODAyMTFfQ0hBTl9OT19IVDQwOworCisJCQlpZiAoIShpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSkgeworCQkJCURfRUVQUk9NKCJDaC4gJWQgRmxhZ3MgJXggWyVzR0h6XSAtICIKKwkJCQkJICJObyB0cmFmZmljXG4iLCBjaF9pbmZvLT5jaGFubmVsLAorCQkJCQkgY2hfaW5mby0+ZmxhZ3MsCisJCQkJCSBpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSA/ICI1LjIiIDoKKwkJCQkJICIyLjQiKTsKKwkJCQljaF9pbmZvKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIEluaXRpYWxpemUgcmVndWxhdG9yeS1iYXNlZCBydW4tdGltZSBkYXRhICovCisJCQljaF9pbmZvLT5tYXhfcG93ZXJfYXZnID0gY2hfaW5mby0+Y3Vycl90eHBvdyA9CisJCQkgICAgZWVwcm9tX2NoX2luZm9bY2hdLm1heF9wb3dlcl9hdmc7CisJCQljaF9pbmZvLT5zY2FuX3Bvd2VyID0gZWVwcm9tX2NoX2luZm9bY2hdLm1heF9wb3dlcl9hdmc7CisJCQljaF9pbmZvLT5taW5fcG93ZXIgPSAwOworCisJCQlEX0VFUFJPTSgiQ2guICVkIFslc0dIel0gIiAiJXMlcyVzJXMlcyVzKDB4JTAyeCAlZGRCbSk6IgorCQkJCSAiIEFkLUhvYyAlc3N1cHBvcnRlZFxuIiwgY2hfaW5mby0+Y2hhbm5lbCwKKwkJCQkgaWxfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbykgPyAiNS4yIiA6ICIyLjQiLAorCQkJCSBDSEVDS19BTkRfUFJJTlRfSShWQUxJRCksCisJCQkJIENIRUNLX0FORF9QUklOVF9JKElCU1MpLAorCQkJCSBDSEVDS19BTkRfUFJJTlRfSShBQ1RJVkUpLAorCQkJCSBDSEVDS19BTkRfUFJJTlRfSShSQURBUiksCisJCQkJIENIRUNLX0FORF9QUklOVF9JKFdJREUpLAorCQkJCSBDSEVDS19BTkRfUFJJTlRfSShERlMpLAorCQkJCSBlZXByb21fY2hfaW5mb1tjaF0uZmxhZ3MsCisJCQkJIGVlcHJvbV9jaF9pbmZvW2NoXS5tYXhfcG93ZXJfYXZnLAorCQkJCSAoKGVlcHJvbV9jaF9pbmZvW2NoXS4KKwkJCQkgICBmbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpICYmCisJCQkJICAhKGVlcHJvbV9jaF9pbmZvW2NoXS4KKwkJCQkgICAgZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikpID8gIiIgOgorCQkJCSAibm90ICIpOworCisJCQljaF9pbmZvKys7CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBkbyBoYXZlIEhUNDAgY2hhbm5lbHMgKi8KKwlpZiAoaWwtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s1XSA9PQorCSAgICBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDAgJiYKKwkgICAgaWwtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s2XSA9PQorCSAgICBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDApCisJCXJldHVybiAwOworCisJLyogVHdvIGFkZGl0aW9uYWwgRUVQUk9NIGJhbmRzIGZvciAyLjQgYW5kIDUgR0h6IEhUNDAgY2hhbm5lbHMgKi8KKwlmb3IgKGJhbmQgPSA2OyBiYW5kIDw9IDc7IGJhbmQrKykgeworCQllbnVtIGllZWU4MDIxMV9iYW5kIGllZWViYW5kOworCisJCWlsX2luaXRfYmFuZF9yZWZlcmVuY2UoaWwsIGJhbmQsICZlZXByb21fY2hfY291bnQsCisJCQkJICAgICAgICZlZXByb21fY2hfaW5mbywgJmVlcHJvbV9jaF9pZHgpOworCisJCS8qIEVFUFJPTSBiYW5kIDYgaXMgMi40LCBiYW5kIDcgaXMgNSBHSHogKi8KKwkJaWVlZWJhbmQgPQorCQkgICAgKGJhbmQgPT0gNikgPyBJRUVFODAyMTFfQkFORF8yR0haIDogSUVFRTgwMjExX0JBTkRfNUdIWjsKKworCQkvKiBMb29wIHRocm91Z2ggZWFjaCBiYW5kIGFkZGluZyBlYWNoIG9mIHRoZSBjaGFubmVscyAqLworCQlmb3IgKGNoID0gMDsgY2ggPCBlZXByb21fY2hfY291bnQ7IGNoKyspIHsKKwkJCS8qIFNldCB1cCBkcml2ZXIncyBpbmZvIGZvciBsb3dlciBoYWxmICovCisJCQlpbF9tb2RfaHQ0MF9jaGFuX2luZm8oaWwsIGllZWViYW5kLCBlZXByb21fY2hfaWR4W2NoXSwKKwkJCQkJICAgICAgJmVlcHJvbV9jaF9pbmZvW2NoXSwKKwkJCQkJICAgICAgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVMpOworCisJCQkvKiBTZXQgdXAgZHJpdmVyJ3MgaW5mbyBmb3IgdXBwZXIgaGFsZiAqLworCQkJaWxfbW9kX2h0NDBfY2hhbl9pbmZvKGlsLCBpZWVlYmFuZCwKKwkJCQkJICAgICAgZWVwcm9tX2NoX2lkeFtjaF0gKyA0LAorCQkJCQkgICAgICAmZWVwcm9tX2NoX2luZm9bY2hdLAorCQkJCQkgICAgICBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2luaXRfY2hhbm5lbF9tYXApOworCisvKgorICogaWxfZnJlZV9jaGFubmVsX21hcCAtIHVuZG8gYWxsb2NhdGlvbnMgaW4gaWxfaW5pdF9jaGFubmVsX21hcAorICovCit2b2lkCitpbF9mcmVlX2NoYW5uZWxfbWFwKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlrZnJlZShpbC0+Y2hhbm5lbF9pbmZvKTsKKwlpbC0+Y2hhbm5lbF9jb3VudCA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2ZyZWVfY2hhbm5lbF9tYXApOworCisvKioKKyAqIGlsX2dldF9jaGFubmVsX2luZm8gLSBGaW5kIGRyaXZlcidzIGlsYXRlIGNoYW5uZWwgaW5mbworICoKKyAqIEJhc2VkIG9uIGJhbmQgYW5kIGNoYW5uZWwgbnVtYmVyLgorICovCitjb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICoKK2lsX2dldF9jaGFubmVsX2luZm8oY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCSAgICB1MTYgY2hhbm5lbCkKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAoYmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJZm9yIChpID0gMTQ7IGkgPCBpbC0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7CisJCQlpZiAoaWwtPmNoYW5uZWxfaW5mb1tpXS5jaGFubmVsID09IGNoYW5uZWwpCisJCQkJcmV0dXJuICZpbC0+Y2hhbm5lbF9pbmZvW2ldOworCQl9CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJaWYgKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KQorCQkJcmV0dXJuICZpbC0+Y2hhbm5lbF9pbmZvW2NoYW5uZWwgLSAxXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2dldF9jaGFubmVsX2luZm8pOworCisvKgorICogU2V0dGluZyBwb3dlciBsZXZlbCBhbGxvd3MgdGhlIGNhcmQgdG8gZ28gdG8gc2xlZXAgd2hlbiBub3QgYnVzeS4KKyAqCisgKiBXZSBjYWxjdWxhdGUgYSBzbGVlcCBjb21tYW5kIGJhc2VkIG9uIHRoZSByZXF1aXJlZCBsYXRlbmN5LCB3aGljaAorICogd2UgZ2V0IGZyb20gbWFjODAyMTEuIEluIG9yZGVyIHRvIGhhbmRsZSB0aGVybWFsIHRocm90dGxpbmcsIHdlIGNhbgorICogYWxzbyB1c2UgcHJlLWRlZmluZWQgcG93ZXIgbGV2ZWxzLgorICovCisKKy8qCisgKiBUaGlzIGRlZmluZXMgdGhlIG9sZCBwb3dlciBsZXZlbHMuIFRoZXkgYXJlIHN0aWxsIHVzZWQgYnkgZGVmYXVsdAorICogKGxldmVsIDEpIGFuZCBmb3IgdGhlcm1hbCB0aHJvdHRsZSAobGV2ZWxzIDMgdGhyb3VnaCA1KQorICovCisKK3N0cnVjdCBpbF9wb3dlcl92ZWNfZW50cnkgeworCXN0cnVjdCBpbF9wb3dlcnRhYmxlX2NtZCBjbWQ7CisJdTggbm9fZHRpbTsJCS8qIG51bWJlciBvZiBza2lwIGR0aW0gKi8KK307CisKK3N0YXRpYyB2b2lkCitpbF9wb3dlcl9zbGVlcF9jYW1fY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3Bvd2VydGFibGVfY21kICpjbWQpCit7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKworCWlmIChpbC0+cG93ZXJfZGF0YS5wY2lfcG0pCisJCWNtZC0+ZmxhZ3MgfD0gSUxfUE9XRVJfUENJX1BNX01TSzsKKworCURfUE9XRVIoIlNsZWVwIGNvbW1hbmQgZm9yIENBTVxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2lsX3NldF9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9wb3dlcnRhYmxlX2NtZCAqY21kKQoreworCURfUE9XRVIoIlNlbmRpbmcgcG93ZXIvc2xlZXAgY29tbWFuZFxuIik7CisJRF9QT1dFUigiRmxhZ3MgdmFsdWUgPSAweCUwOFhcbiIsIGNtZC0+ZmxhZ3MpOworCURfUE9XRVIoIlR4IHRpbWVvdXQgPSAldVxuIiwgbGUzMl90b19jcHUoY21kLT50eF9kYXRhX3RpbWVvdXQpKTsKKwlEX1BPV0VSKCJSeCB0aW1lb3V0ID0gJXVcbiIsIGxlMzJfdG9fY3B1KGNtZC0+cnhfZGF0YV90aW1lb3V0KSk7CisJRF9QT1dFUigiU2xlZXAgaW50ZXJ2YWwgdmVjdG9yID0geyAlZCAsICVkICwgJWQgLCAlZCAsICVkIH1cbiIsCisJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbMF0pLAorCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzFdKSwKKwkJbGUzMl90b19jcHUoY21kLT5zbGVlcF9pbnRlcnZhbFsyXSksCisJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbM10pLAorCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzRdKSk7CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1BPV0VSX1RCTCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX3Bvd2VydGFibGVfY21kKSwgY21kKTsKK30KKworaW50CitpbF9wb3dlcl9zZXRfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9wb3dlcnRhYmxlX2NtZCAqY21kLCBib29sIGZvcmNlKQoreworCWludCByZXQ7CisJYm9vbCB1cGRhdGVfY2hhaW5zOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCS8qIERvbid0IHVwZGF0ZSB0aGUgUlggY2hhaW4gd2hlbiBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBpcyBydW5uaW5nICovCisJdXBkYXRlX2NoYWlucyA9IGlsLT5jaGFpbl9ub2lzZV9kYXRhLnN0YXRlID09IElMX0NIQUlOX05PSVNFX0RPTkUgfHwKKwkgICAgaWwtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUgPT0gSUxfQ0hBSU5fTk9JU0VfQUxJVkU7CisKKwlpZiAoIW1lbWNtcCgmaWwtPnBvd2VyX2RhdGEuc2xlZXBfY21kLCBjbWQsIHNpemVvZigqY21kKSkgJiYgIWZvcmNlKQorCQlyZXR1cm4gMDsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHNjYW4gY29tcGxldGUgdXNlIHNsZWVwX3Bvd2VyX25leHQsIG5lZWQgdG8gYmUgdXBkYXRlZCAqLworCW1lbWNweSgmaWwtPnBvd2VyX2RhdGEuc2xlZXBfY21kX25leHQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAodGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpICYmICFmb3JjZSkgeworCQlEX0lORk8oIkRlZmVyIHBvd2VyIHNldCBtb2RlIHdoaWxlIHNjYW5uaW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNtZC0+ZmxhZ3MgJiBJTF9QT1dFUl9EUklWRVJfQUxMT1dfU0xFRVBfTVNLKQorCQlzZXRfYml0KFNfUE9XRVJfUE1JLCAmaWwtPnN0YXR1cyk7CisKKwlyZXQgPSBpbF9zZXRfcG93ZXIoaWwsIGNtZCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKCEoY21kLT5mbGFncyAmIElMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0spKQorCQkJY2xlYXJfYml0KFNfUE9XRVJfUE1JLCAmaWwtPnN0YXR1cyk7CisKKwkJaWYgKGlsLT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MgJiYgdXBkYXRlX2NoYWlucykKKwkJCWlsLT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MoaWwpOworCQllbHNlIGlmIChpbC0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQorCQkJRF9QT1dFUigiQ2Fubm90IHVwZGF0ZSB0aGUgcG93ZXIsIGNoYWluIG5vaXNlICIKKwkJCQkiY2FsaWJyYXRpb24gcnVubmluZzogJWRcbiIsCisJCQkJaWwtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUpOworCisJCW1lbWNweSgmaWwtPnBvd2VyX2RhdGEuc2xlZXBfY21kLCBjbWQsIHNpemVvZigqY21kKSk7CisJfSBlbHNlCisJCUlMX0VSUigic2V0IHBvd2VyIGZhaWwsIHJldCA9ICVkIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAoraWxfcG93ZXJfdXBkYXRlX21vZGUoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGZvcmNlKQoreworCXN0cnVjdCBpbF9wb3dlcnRhYmxlX2NtZCBjbWQ7CisKKwlpbF9wb3dlcl9zbGVlcF9jYW1fY21kKGlsLCAmY21kKTsKKwlyZXR1cm4gaWxfcG93ZXJfc2V0X21vZGUoaWwsICZjbWQsIGZvcmNlKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfcG93ZXJfdXBkYXRlX21vZGUpOworCisvKiBpbml0aWFsaXplIHRvIGRlZmF1bHQgKi8KK3ZvaWQKK2lsX3Bvd2VyX2luaXRpYWxpemUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXUxNiBsY3RsID0gaWxfcGNpZV9saW5rX2N0bChpbCk7CisKKwlpbC0+cG93ZXJfZGF0YS5wY2lfcG0gPSAhKGxjdGwgJiBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDBTX0VOKTsKKworCWlsLT5wb3dlcl9kYXRhLmRlYnVnX3NsZWVwX2xldmVsX292ZXJyaWRlID0gLTE7CisKKwltZW1zZXQoJmlsLT5wb3dlcl9kYXRhLnNsZWVwX2NtZCwgMCwgc2l6ZW9mKGlsLT5wb3dlcl9kYXRhLnNsZWVwX2NtZCkpOworfQorRVhQT1JUX1NZTUJPTChpbF9wb3dlcl9pbml0aWFsaXplKTsKKworLyogRm9yIGFjdGl2ZSBzY2FuLCBsaXN0ZW4gQUNUSVZFX0RXRUxMX1RJTUUgKG1zZWMpIG9uIGVhY2ggY2hhbm5lbCBhZnRlcgorICogc2VuZGluZyBwcm9iZSByZXEuICBUaGlzIHNob3VsZCBiZSBzZXQgbG9uZyBlbm91Z2ggdG8gaGVhciBwcm9iZSByZXNwb25zZXMKKyAqIGZyb20gbW9yZSB0aGFuIG9uZSBBUC4gICovCisjZGVmaW5lIElMX0FDVElWRV9EV0VMTF9USU1FXzI0ICAgICgzMCkJLyogYWxsIHRpbWVzIGluIG1zZWMgKi8KKyNkZWZpbmUgSUxfQUNUSVZFX0RXRUxMX1RJTUVfNTIgICAgKDIwKQorCisjZGVmaW5lIElMX0FDVElWRV9EV0VMTF9GQUNUT1JfMjRHSFogKDMpCisjZGVmaW5lIElMX0FDVElWRV9EV0VMTF9GQUNUT1JfNTJHSFogKDIpCisKKy8qIEZvciBwYXNzaXZlIHNjYW4sIGxpc3RlbiBQQVNTSVZFX0RXRUxMX1RJTUUgKG1zZWMpIG9uIGVhY2ggY2hhbm5lbC4KKyAqIE11c3QgYmUgc2V0IGxvbmdlciB0aGFuIGFjdGl2ZSBkd2VsbCB0aW1lLgorICogRm9yIHRoZSBtb3N0IHJlbGlhYmxlIHNjYW4sIHNldCA+IEFQIGJlYWNvbiBpbnRlcnZhbCAodHlwaWNhbGx5IDEwMG1zZWMpLiAqLworI2RlZmluZSBJTF9QQVNTSVZFX0RXRUxMX1RJTUVfMjQgICAoMjApCS8qIGFsbCB0aW1lcyBpbiBtc2VjICovCisjZGVmaW5lIElMX1BBU1NJVkVfRFdFTExfVElNRV81MiAgICgxMCkKKyNkZWZpbmUgSUxfUEFTU0lWRV9EV0VMTF9CQVNFICAgICAgKDEwMCkKKyNkZWZpbmUgSUxfQ0hBTk5FTF9UVU5FX1RJTUUgICAgICAgNQorCitzdGF0aWMgaW50CitpbF9zZW5kX3NjYW5fYWJvcnQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQ7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0OworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfU0NBTl9BQk9SVCwKKwkJLmZsYWdzID0gQ01EX1dBTlRfU0tCLAorCX07CisKKwkvKiBFeGl0IGluc3RhbnRseSB3aXRoIGVycm9yIHdoZW4gZGV2aWNlIGlzIG5vdCByZWFkeQorCSAqIHRvIHJlY2VpdmUgc2NhbiBhYm9ydCBjb21tYW5kIG9yIGl0IGRvZXMgbm90IHBlcmZvcm0KKwkgKiBoYXJkd2FyZSBzY2FuIGN1cnJlbnRseSAqLworCWlmICghdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpIHx8CisJICAgICF0ZXN0X2JpdChTX0dFT19DT05GSUdVUkVELCAmaWwtPnN0YXR1cykgfHwKKwkgICAgIXRlc3RfYml0KFNfU0NBTl9IVywgJmlsLT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNfRldfRVJST1IsICZpbC0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGlsX3NlbmRfY21kX3N5bmMoaWwsICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwa3QgPSAoc3RydWN0IGlsX3J4X3BrdCAqKWNtZC5yZXBseV9wYWdlOworCWlmIChwa3QtPnUuc3RhdHVzICE9IENBTl9BQk9SVF9TVEFUVVMpIHsKKwkJLyogVGhlIHNjYW4gYWJvcnQgd2lsbCByZXR1cm4gMSBmb3Igc3VjY2VzcyBvcgorCQkgKiAyIGZvciAiZmFpbHVyZSIuICBBIGZhaWx1cmUgY29uZGl0aW9uIGNhbiBiZQorCQkgKiBkdWUgdG8gc2ltcGx5IG5vdCBiZWluZyBpbiBhbiBhY3RpdmUgc2NhbiB3aGljaAorCQkgKiBjYW4gb2NjdXIgaWYgd2Ugc2VuZCB0aGUgc2NhbiBhYm9ydCBiZWZvcmUgd2UKKwkJICogdGhlIG1pY3JvY29kZSBoYXMgbm90aWZpZWQgdXMgdGhhdCBhIHNjYW4gaXMKKwkJICogY29tcGxldGVkLiAqLworCQlEX1NDQU4oIlNDQU5fQUJPUlQgcmV0ICVkLlxuIiwgcGt0LT51LnN0YXR1cyk7CisJCXJldCA9IC1FSU87CisJfQorCisJaWxfZnJlZV9wYWdlcyhpbCwgY21kLnJlcGx5X3BhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitpbF9jb21wbGV0ZV9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgYm9vbCBhYm9ydGVkKQoreworCS8qIGNoZWNrIGlmIHNjYW4gd2FzIHJlcXVlc3RlZCBmcm9tIG1hYzgwMjExICovCisJaWYgKGlsLT5zY2FuX3JlcXVlc3QpIHsKKwkJRF9TQ0FOKCJDb21wbGV0ZSBzY2FuIGluIG1hYzgwMjExXG4iKTsKKwkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKGlsLT5odywgYWJvcnRlZCk7CisJfQorCisJaWwtPnNjYW5fdmlmID0gTlVMTDsKKwlpbC0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKK30KKwordm9pZAoraWxfZm9yY2Vfc2Nhbl9lbmQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoIXRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIkZvcmNpbmcgc2NhbiBlbmQgd2hpbGUgbm90IHNjYW5uaW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKworCURfU0NBTigiRm9yY2luZyBzY2FuIGVuZFxuIik7CisJY2xlYXJfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKTsKKwljbGVhcl9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7CisJY2xlYXJfYml0KFNfU0NBTl9BQk9SVElORywgJmlsLT5zdGF0dXMpOworCWlsX2NvbXBsZXRlX3NjYW4oaWwsIHRydWUpOworfQorCitzdGF0aWMgdm9pZAoraWxfZG9fc2Nhbl9hYm9ydChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoIXRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIk5vdCBwZXJmb3JtaW5nIHNjYW4gdG8gYWJvcnRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU19TQ0FOX0FCT1JUSU5HLCAmaWwtPnN0YXR1cykpIHsKKwkJRF9TQ0FOKCJTY2FuIGFib3J0IGluIHByb2dyZXNzXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGlsX3NlbmRfc2Nhbl9hYm9ydChpbCk7CisJaWYgKHJldCkgeworCQlEX1NDQU4oIlNlbmQgc2NhbiBhYm9ydCBmYWlsZWQgJWRcbiIsIHJldCk7CisJCWlsX2ZvcmNlX3NjYW5fZW5kKGlsKTsKKwl9IGVsc2UKKwkJRF9TQ0FOKCJTdWNjZXNzZnVsbHkgc2VuZCBzY2FuIGFib3J0XG4iKTsKK30KKworLyoqCisgKiBpbF9zY2FuX2NhbmNlbCAtIENhbmNlbCBhbnkgY3VycmVudGx5IGV4ZWN1dGluZyBIVyBzY2FuCisgKi8KK2ludAoraWxfc2Nhbl9jYW5jZWwoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCURfU0NBTigiUXVldWluZyBhYm9ydCBzY2FuXG4iKTsKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+YWJvcnRfc2Nhbik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NjYW5fY2FuY2VsKTsKKworLyoqCisgKiBpbF9zY2FuX2NhbmNlbF90aW1lb3V0IC0gQ2FuY2VsIGFueSBjdXJyZW50bHkgZXhlY3V0aW5nIEhXIHNjYW4KKyAqIEBtczogYW1vdW50IG9mIHRpbWUgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3Igc2NhbiB0byBhYm9ydAorICoKKyAqLworaW50CitpbF9zY2FuX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBpbF9wcml2ICppbCwgdW5zaWduZWQgbG9uZyBtcykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtcyk7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJRF9TQ0FOKCJTY2FuIGNhbmNlbCB0aW1lb3V0XG4iKTsKKworCWlsX2RvX3NjYW5fYWJvcnQoaWwpOworCisJd2hpbGUgKHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmICghdGVzdF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cykpCisJCQlicmVhazsKKwkJbXNsZWVwKDIwKTsKKwl9CisKKwlyZXR1cm4gdGVzdF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NjYW5fY2FuY2VsX3RpbWVvdXQpOworCisvKiBTZXJ2aWNlIHJlc3BvbnNlIHRvIENfU0NBTiAoMHg4MCkgKi8KK3N0YXRpYyB2b2lkCitpbF9oZGxfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9zY2FucmVxX25vdGlmaWNhdGlvbiAqbm90aWYgPQorCSAgICAoc3RydWN0IGlsX3NjYW5yZXFfbm90aWZpY2F0aW9uICopcGt0LT51LnJhdzsKKworCURfU0NBTigiU2NhbiByZXF1ZXN0IHN0YXR1cyA9IDB4JXhcbiIsIG5vdGlmLT5zdGF0dXMpOworI2VuZGlmCit9CisKKy8qIFNlcnZpY2UgTl9TQ0FOX1NUQVJUICgweDgyKSAqLworc3RhdGljIHZvaWQKK2lsX2hkbF9zY2FuX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX3NjYW5zdGFydF9ub3RpZmljYXRpb24gKm5vdGlmID0KKwkgICAgKHN0cnVjdCBpbF9zY2Fuc3RhcnRfbm90aWZpY2F0aW9uICopcGt0LT51LnJhdzsKKwlpbC0+c2Nhbl9zdGFydF90c2YgPSBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdyk7CisJRF9TQ0FOKCJTY2FuIHN0YXJ0OiAiICIlZCBbODAyLjExJXNdICIKKwkgICAgICAgIihUU0Y6IDB4JTA4WDolMDhYKSAtICVkIChiZWFjb24gdGltZXIgJXUpXG4iLCBub3RpZi0+Y2hhbm5lbCwKKwkgICAgICAgbm90aWYtPmJhbmQgPyAiYmciIDogImEiLCBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2hpZ2gpLAorCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdyksIG5vdGlmLT5zdGF0dXMsIG5vdGlmLT5iZWFjb25fdGltZXIpOworfQorCisvKiBTZXJ2aWNlIE5fU0NBTl9SRVNVTFRTICgweDgzKSAqLworc3RhdGljIHZvaWQKK2lsX2hkbF9zY2FuX3Jlc3VsdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfc2NhbnJlc3VsdHNfbm90aWZpY2F0aW9uICpub3RpZiA9CisJICAgIChzdHJ1Y3QgaWxfc2NhbnJlc3VsdHNfbm90aWZpY2F0aW9uICopcGt0LT51LnJhdzsKKworCURfU0NBTigiU2NhbiBjaC5yZXM6ICIgIiVkIFs4MDIuMTElc10gIiAiKFRTRjogMHglMDhYOiUwOFgpIC0gJWQgIgorCSAgICAgICAiZWxhcHNlZD0lbHUgdXNlY1xuIiwgbm90aWYtPmNoYW5uZWwsIG5vdGlmLT5iYW5kID8gImJnIiA6ICJhIiwKKwkgICAgICAgbGUzMl90b19jcHUobm90aWYtPnRzZl9oaWdoKSwgbGUzMl90b19jcHUobm90aWYtPnRzZl9sb3cpLAorCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+c3RhdHNbMF0pLAorCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdykgLSBpbC0+c2Nhbl9zdGFydF90c2YpOworI2VuZGlmCit9CisKKy8qIFNlcnZpY2UgTl9TQ0FOX0NPTVBMRVRFICgweDg0KSAqLworc3RhdGljIHZvaWQKK2lsX2hkbF9zY2FuX2NvbXBsZXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfc2NhbmNvbXBsZXRlX25vdGlmaWNhdGlvbiAqc2Nhbl9ub3RpZiA9ICh2b2lkICopcGt0LT51LnJhdzsKKyNlbmRpZgorCisJRF9TQ0FOKCJTY2FuIGNvbXBsZXRlOiAlZCBjaGFubmVscyAoVFNGIDB4JTA4WDolMDhYKSAtICVkXG4iLAorCSAgICAgICBzY2FuX25vdGlmLT5zY2FubmVkX2NoYW5uZWxzLCBzY2FuX25vdGlmLT50c2ZfbG93LAorCSAgICAgICBzY2FuX25vdGlmLT50c2ZfaGlnaCwgc2Nhbl9ub3RpZi0+c3RhdHVzKTsKKworCS8qIFRoZSBIVyBpcyBubyBsb25nZXIgc2Nhbm5pbmcgKi8KKwljbGVhcl9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7CisKKwlEX1NDQU4oIlNjYW4gb24gJXNHSHogdG9vayAlZG1zXG4iLAorCSAgICAgICAoaWwtPnNjYW5fYmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKSA/ICIyLjQiIDogIjUuMiIsCisJICAgICAgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGlsLT5zY2FuX3N0YXJ0KSk7CisKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+c2Nhbl9jb21wbGV0ZWQpOworfQorCit2b2lkCitpbF9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBzY2FuIGhhbmRsZXJzICovCisJaWwtPmhhbmRsZXJzW0NfU0NBTl0gPSBpbF9oZGxfc2NhbjsKKwlpbC0+aGFuZGxlcnNbTl9TQ0FOX1NUQVJUXSA9IGlsX2hkbF9zY2FuX3N0YXJ0OworCWlsLT5oYW5kbGVyc1tOX1NDQU5fUkVTVUxUU10gPSBpbF9oZGxfc2Nhbl9yZXN1bHRzOworCWlsLT5oYW5kbGVyc1tOX1NDQU5fQ09NUExFVEVdID0gaWxfaGRsX3NjYW5fY29tcGxldGU7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NldHVwX3J4X3NjYW5faGFuZGxlcnMpOworCitpbmxpbmUgdTE2CitpbF9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQkgdTggbl9wcm9iZXMpCit7CisJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJcmV0dXJuIElMX0FDVElWRV9EV0VMTF9USU1FXzUyICsKKwkJICAgIElMX0FDVElWRV9EV0VMTF9GQUNUT1JfNTJHSFogKiAobl9wcm9iZXMgKyAxKTsKKwllbHNlCisJCXJldHVybiBJTF9BQ1RJVkVfRFdFTExfVElNRV8yNCArCisJCSAgICBJTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzI0R0haICogKG5fcHJvYmVzICsgMSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2dldF9hY3RpdmVfZHdlbGxfdGltZSk7CisKK3UxNgoraWxfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwl1MTYgdmFsdWU7CisKKwl1MTYgcGFzc2l2ZSA9CisJICAgIChiYW5kID09CisJICAgICBJRUVFODAyMTFfQkFORF8yR0haKSA/IElMX1BBU1NJVkVfRFdFTExfQkFTRSArCisJICAgIElMX1BBU1NJVkVfRFdFTExfVElNRV8yNCA6IElMX1BBU1NJVkVfRFdFTExfQkFTRSArCisJICAgIElMX1BBU1NJVkVfRFdFTExfVElNRV81MjsKKworCWlmIChpbF9pc19hbnlfYXNzb2NpYXRlZChpbCkpIHsKKwkJLyoKKwkJICogSWYgd2UncmUgYXNzb2NpYXRlZCwgd2UgY2xhbXAgdGhlIG1heGltdW0gcGFzc2l2ZQorCQkgKiBkd2VsbCB0aW1lIHRvIGJlIDk4JSBvZiB0aGUgc21hbGxlc3QgYmVhY29uIGludGVydmFsCisJCSAqIChtaW51cyAyICogY2hhbm5lbCB0dW5lIHRpbWUpCisJCSAqLworCQl2YWx1ZSA9IGN0eC0+dmlmID8gY3R4LT52aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgOiAwOworCQlpZiAodmFsdWUgPiBJTF9QQVNTSVZFX0RXRUxMX0JBU0UgfHwgIXZhbHVlKQorCQkJdmFsdWUgPSBJTF9QQVNTSVZFX0RXRUxMX0JBU0U7CisJCXZhbHVlID0gKHZhbHVlICogOTgpIC8gMTAwIC0gSUxfQ0hBTk5FTF9UVU5FX1RJTUUgKiAyOworCQlwYXNzaXZlID0gbWluKHZhbHVlLCBwYXNzaXZlKTsKKwl9CisKKwlyZXR1cm4gcGFzc2l2ZTsKK30KK0VYUE9SVF9TWU1CT0woaWxfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZSk7CisKK3ZvaWQKK2lsX2luaXRfc2Nhbl9wYXJhbXMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXU4IGFudF9pZHggPSBmbHMoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpIC0gMTsKKwlpZiAoIWlsLT5zY2FuX3R4X2FudFtJRUVFODAyMTFfQkFORF81R0haXSkKKwkJaWwtPnNjYW5fdHhfYW50W0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gYW50X2lkeDsKKwlpZiAoIWlsLT5zY2FuX3R4X2FudFtJRUVFODAyMTFfQkFORF8yR0haXSkKKwkJaWwtPnNjYW5fdHhfYW50W0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gYW50X2lkeDsKK30KK0VYUE9SVF9TWU1CT0woaWxfaW5pdF9zY2FuX3BhcmFtcyk7CisKK3N0YXRpYyBpbnQKK2lsX3NjYW5faW5pdGlhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKFdBUk5fT04oIWlsLT5jZmctPm9wcy0+dXRpbHMtPnJlcXVlc3Rfc2NhbikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5zY2FuX2NoZWNrKTsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKSB7CisJCUlMX1dBUk4oIlJlcXVlc3Qgc2NhbiBjYWxsZWQgd2hlbiBkcml2ZXIgbm90IHJlYWR5LlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICh0ZXN0X2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIk11bHRpcGxlIGNvbmN1cnJlbnQgc2NhbiByZXF1ZXN0cyBpbiBwYXJhbGxlbC5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICh0ZXN0X2JpdChTX1NDQU5fQUJPUlRJTkcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIlNjYW4gcmVxdWVzdCB3aGlsZSBhYm9ydCBwZW5kaW5nLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJRF9TQ0FOKCJTdGFydGluZyBzY2FuLi4uXG4iKTsKKworCXNldF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpOworCWlsLT5zY2FuX3N0YXJ0ID0gamlmZmllczsKKworCXJldCA9IGlsLT5jZmctPm9wcy0+dXRpbHMtPnJlcXVlc3Rfc2NhbihpbCwgdmlmKTsKKwlpZiAocmV0KSB7CisJCWNsZWFyX2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcXVldWVfZGVsYXllZF93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+c2Nhbl9jaGVjaywKKwkJCSAgIElMX1NDQU5fQ0hFQ0tfV0FUQ0hET0cpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWxfbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlpbnQgcmV0OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWYgKHJlcS0+bl9jaGFubmVscyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAodGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKSB7CisJCURfU0NBTigiU2NhbiBhbHJlYWR5IGluIHByb2dyZXNzLlxuIik7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBtYWM4MDIxMSB3aWxsIG9ubHkgYXNrIGZvciBvbmUgYmFuZCBhdCBhIHRpbWUgKi8KKwlpbC0+c2Nhbl9yZXF1ZXN0ID0gcmVxOworCWlsLT5zY2FuX3ZpZiA9IHZpZjsKKwlpbC0+c2Nhbl9iYW5kID0gcmVxLT5jaGFubmVsc1swXS0+YmFuZDsKKworCXJldCA9IGlsX3NjYW5faW5pdGlhdGUoaWwsIHZpZik7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX2h3X3NjYW4pOworCitzdGF0aWMgdm9pZAoraWxfYmdfc2Nhbl9jaGVjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0KKwkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCBzY2FuX2NoZWNrLndvcmspOworCisJRF9TQ0FOKCJTY2FuIGNoZWNrIHdvcmtcbiIpOworCisJLyogU2luY2Ugd2UgYXJlIGhlcmUgZmlybXdhcmUgZG9lcyBub3QgZmluaXNoIHNjYW4gYW5kCisJICogbW9zdCBsaWtlbHkgaXMgaW4gYmFkIHNoYXBlLCBzbyB3ZSBkb24ndCBib3RoZXIgdG8KKwkgKiBzZW5kIGFib3J0IGNvbW1hbmQsIGp1c3QgZm9yY2Ugc2NhbiBjb21wbGV0ZSB0byBtYWM4MDIxMSAqLworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWxfZm9yY2Vfc2Nhbl9lbmQoaWwpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKK30KKworLyoqCisgKiBpbF9maWxsX3Byb2JlX3JlcSAtIGZpbGwgaW4gYWxsIHJlcXVpcmVkIGZpZWxkcyBhbmQgSUUgZm9yIHByb2JlIHJlcXVlc3QKKyAqLworCit1MTYKK2lsX2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9tZ210ICpmcmFtZSwKKwkJICBjb25zdCB1OCAqdGEsIGNvbnN0IHU4ICppZXMsIGludCBpZV9sZW4sIGludCBsZWZ0KQoreworCWludCBsZW4gPSAwOworCXU4ICpwb3MgPSBOVUxMOworCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgdGhlIHByb2JlIHJlcXVlc3QsCisJICogdHdvIG1hbmRhdG9yeSBJRXMgYW5kIHRoZSBkYXRhICovCisJbGVmdCAtPSAyNDsKKwlpZiAobGVmdCA8IDApCisJCXJldHVybiAwOworCisJZnJhbWUtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKTsKKwltZW1jcHkoZnJhbWUtPmRhLCBpbF9iY2FzdF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGZyYW1lLT5zYSwgdGEsIEVUSF9BTEVOKTsKKwltZW1jcHkoZnJhbWUtPmJzc2lkLCBpbF9iY2FzdF9hZGRyLCBFVEhfQUxFTik7CisJZnJhbWUtPnNlcV9jdHJsID0gMDsKKworCWxlbiArPSAyNDsKKworCS8qIC4uLm5leHQgSUUuLi4gKi8KKwlwb3MgPSAmZnJhbWUtPnUucHJvYmVfcmVxLnZhcmlhYmxlWzBdOworCisJLyogZmlsbCBpbiBvdXIgaW5kaXJlY3QgU1NJRCBJRSAqLworCWxlZnQgLT0gMjsKKwlpZiAobGVmdCA8IDApCisJCXJldHVybiAwOworCSpwb3MrKyA9IFdMQU5fRUlEX1NTSUQ7CisJKnBvcysrID0gMDsKKworCWxlbiArPSAyOworCisJaWYgKFdBUk5fT04obGVmdCA8IGllX2xlbikpCisJCXJldHVybiBsZW47CisKKwlpZiAoaWVzICYmIGllX2xlbikgeworCQltZW1jcHkocG9zLCBpZXMsIGllX2xlbik7CisJCWxlbiArPSBpZV9sZW47CisJfQorCisJcmV0dXJuICh1MTYpIGxlbjsKK30KK0VYUE9SVF9TWU1CT0woaWxfZmlsbF9wcm9iZV9yZXEpOworCitzdGF0aWMgdm9pZAoraWxfYmdfYWJvcnRfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpbF9wcml2LCBhYm9ydF9zY2FuKTsKKworCURfU0NBTigiQWJvcnQgc2NhbiB3b3JrXG4iKTsKKworCS8qIFdlIGtlZXAgc2Nhbl9jaGVjayB3b3JrIHF1ZXVlZCBpbiBjYXNlIHdoZW4gZmlybXdhcmUgd2lsbCBub3QKKwkgKiByZXBvcnQgYmFjayBzY2FuIGNvbXBsZXRlZCBub3RpZmljYXRpb24gKi8KKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDIwMCk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAoraWxfYmdfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWxfcHJpdiwgc2Nhbl9jb21wbGV0ZWQpOworCWJvb2wgYWJvcnRlZDsKKworCURfU0NBTigiQ29tcGxldGVkIHNjYW4uXG4iKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5zY2FuX2NoZWNrKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlhYm9ydGVkID0gdGVzdF9hbmRfY2xlYXJfYml0KFNfU0NBTl9BQk9SVElORywgJmlsLT5zdGF0dXMpOworCWlmIChhYm9ydGVkKQorCQlEX1NDQU4oIkFib3J0ZWQgc2NhbiBjb21wbGV0ZWQuXG4iKTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIlNjYW4gYWxyZWFkeSBjb21wbGV0ZWQuXG4iKTsKKwkJZ290byBvdXRfc2V0dGluZ3M7CisJfQorCisJaWxfY29tcGxldGVfc2NhbihpbCwgYWJvcnRlZCk7CisKK291dF9zZXR0aW5nczoKKwkvKiBDYW4gd2Ugc3RpbGwgdGFsayB0byBmaXJtd2FyZSA/ICovCisJaWYgKCFpbF9pc19yZWFkeV9yZihpbCkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBXZSBkbyBub3QgY29tbWl0IHBvd2VyIHNldHRpbmdzIHdoaWxlIHNjYW4gaXMgcGVuZGluZywKKwkgKiBkbyBpdCBub3cgaWYgdGhlIHNldHRpbmdzIGNoYW5nZWQuCisJICovCisJaWxfcG93ZXJfc2V0X21vZGUoaWwsICZpbC0+cG93ZXJfZGF0YS5zbGVlcF9jbWRfbmV4dCwgZmFsc2UpOworCWlsX3NldF90eF9wb3dlcihpbCwgaWwtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKKworCWlsLT5jZmctPm9wcy0+dXRpbHMtPnBvc3Rfc2NhbihpbCk7CisKK291dDoKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKK3ZvaWQKK2lsX3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJSU5JVF9XT1JLKCZpbC0+c2Nhbl9jb21wbGV0ZWQsIGlsX2JnX3NjYW5fY29tcGxldGVkKTsKKwlJTklUX1dPUksoJmlsLT5hYm9ydF9zY2FuLCBpbF9iZ19hYm9ydF9zY2FuKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPnNjYW5fY2hlY2ssIGlsX2JnX3NjYW5fY2hlY2spOworfQorRVhQT1JUX1NZTUJPTChpbF9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmspOworCit2b2lkCitpbF9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwljYW5jZWxfd29ya19zeW5jKCZpbC0+YWJvcnRfc2Nhbik7CisJY2FuY2VsX3dvcmtfc3luYygmaWwtPnNjYW5fY29tcGxldGVkKTsKKworCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmlsLT5zY2FuX2NoZWNrKSkgeworCQltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCQlpbF9mb3JjZV9zY2FuX2VuZChpbCk7CisJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlsX2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmspOworCisvKiBpbC0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZAoraWxfc3RhX3Vjb2RlX2FjdGl2YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgdTggc3RhX2lkKQoreworCisJaWYgKCEoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9EUklWRVJfQUNUSVZFKSkKKwkJSUxfRVJSKCJBQ1RJVkFURSBhIG5vbiBEUklWRVIgYWN0aXZlIHN0YXRpb24gaWQgJXUgYWRkciAlcE1cbiIsCisJCSAgICAgICBzdGFfaWQsIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisKKwlpZiAoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpIHsKKwkJRF9BU1NPQygiU1RBIGlkICV1IGFkZHIgJXBNIGFscmVhZHkgcHJlc2VudCIKKwkJCSIgaW4gdUNvZGUgKGFjY29yZGluZyB0byBkcml2ZXIpXG4iLCBzdGFfaWQsCisJCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCX0gZWxzZSB7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSUxfU1RBX1VDT0RFX0FDVElWRTsKKwkJRF9BU1NPQygiQWRkZWQgU1RBIGlkICV1IGFkZHIgJXBNIHRvIHVDb2RlXG4iLCBzdGFfaWQsCisJCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCX0KK30KKworc3RhdGljIGludAoraWxfcHJvY2Vzc19hZGRfc3RhX3Jlc3Aoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfYWRkc3RhX2NtZCAqYWRkc3RhLAorCQkJc3RydWN0IGlsX3J4X3BrdCAqcGt0LCBib29sIHN5bmMpCit7CisJdTggc3RhX2lkID0gYWRkc3RhLT5zdGEuc3RhX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU87CisKKwlpZiAocGt0LT5oZHIuZmxhZ3MgJiBJTF9DTURfRkFJTEVEX01TSykgeworCQlJTF9FUlIoIkJhZCByZXR1cm4gZnJvbSBDX0FERF9TVEEgKDB4JTA4WClcbiIsIHBrdC0+aGRyLmZsYWdzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlEX0lORk8oIlByb2Nlc3NpbmcgcmVzcG9uc2UgZm9yIGFkZGluZyBzdGF0aW9uICV1XG4iLCBzdGFfaWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChwa3QtPnUuYWRkX3N0YS5zdGF0dXMpIHsKKwljYXNlIEFERF9TVEFfU1VDQ0VTU19NU0s6CisJCURfSU5GTygiQ19BRERfU1RBIFBBU1NFRFxuIik7CisJCWlsX3N0YV91Y29kZV9hY3RpdmF0ZShpbCwgc3RhX2lkKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBRERfU1RBX05PX1JPT01fSU5fVEJMOgorCQlJTF9FUlIoIkFkZGluZyBzdGF0aW9uICVkIGZhaWxlZCwgbm8gcm9vbSBpbiB0YWJsZS5cbiIsIHN0YV9pZCk7CisJCWJyZWFrOworCWNhc2UgQUREX1NUQV9OT19CTE9DS19BQ0tfUkVTT1VSQ0U6CisJCUlMX0VSUigiQWRkaW5nIHN0YXRpb24gJWQgZmFpbGVkLCBubyBibG9jayBhY2sgcmVzb3VyY2UuXG4iLAorCQkgICAgICAgc3RhX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBBRERfU1RBX01PRElGWV9OT05fRVhJU1RfU1RBOgorCQlJTF9FUlIoIkF0dGVtcHRpbmcgdG8gbW9kaWZ5IG5vbi1leGlzdGluZyBzdGF0aW9uICVkXG4iLAorCQkgICAgICAgc3RhX2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRF9BU1NPQygiUmVjZWl2ZWQgQ19BRERfU1RBOigweCUwOFgpXG4iLCBwa3QtPnUuYWRkX3N0YS5zdGF0dXMpOworCQlicmVhazsKKwl9CisKKwlEX0lORk8oIiVzIHN0YXRpb24gaWQgJXUgYWRkciAlcE1cbiIsCisJICAgICAgIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID09CisJICAgICAgIFNUQV9DT05UUk9MX01PRElGWV9NU0sgPyAiTW9kaWZpZWQiIDogIkFkZGVkIiwgc3RhX2lkLAorCSAgICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCisJLyoKKwkgKiBYWFg6IFRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgY29tbWFuZCBidWZmZXIgaXMgb2Z0ZW4gY2hhbmdlZCBmcm9tCisJICogdGhlIG9yaWdpbmFsIHNlbnQgdG8gdGhlIGRldmljZS4gVGhhdCBpcywgdGhlIE1BQyBhZGRyZXNzCisJICogd3JpdHRlbiB0byB0aGUgY29tbWFuZCBidWZmZXIgb2Z0ZW4gaXMgbm90IHRoZSBzYW1lIE1BQyBhZGRyZXNzCisJICogcmVhZCBmcm9tIHRoZSBjb21tYW5kIGJ1ZmZlciB3aGVuIHRoZSBjb21tYW5kIHJldHVybnMuIFRoaXMKKwkgKiBpc3N1ZSBoYXMgbm90IHlldCBiZWVuIHJlc29sdmVkIGFuZCB0aGlzIGRlYnVnZ2luZyBpcyBsZWZ0IHRvCisJICogb2JzZXJ2ZSB0aGUgcHJvYmxlbS4KKwkgKi8KKwlEX0lORk8oIiVzIHN0YXRpb24gYWNjb3JkaW5nIHRvIGNtZCBidWZmZXIgJXBNXG4iLAorCSAgICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9PQorCSAgICAgICBTVEFfQ09OVFJPTF9NT0RJRllfTVNLID8gIk1vZGlmaWVkIiA6ICJBZGRlZCIsIGFkZHN0YS0+c3RhLmFkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lsX2FkZF9zdGFfY2FsbGJhY2soc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkgICAgc3RydWN0IGlsX3J4X3BrdCAqcGt0KQoreworCXN0cnVjdCBpbF9hZGRzdGFfY21kICphZGRzdGEgPSAoc3RydWN0IGlsX2FkZHN0YV9jbWQgKiljbWQtPmNtZC5wYXlsb2FkOworCisJaWxfcHJvY2Vzc19hZGRfc3RhX3Jlc3AoaWwsIGFkZHN0YSwgcGt0LCBmYWxzZSk7CisKK30KKworaW50CitpbF9zZW5kX2FkZF9zdGEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfYWRkc3RhX2NtZCAqc3RhLCB1OCBmbGFncykKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSBOVUxMOworCWludCByZXQgPSAwOworCXU4IGRhdGFbc2l6ZW9mKCpzdGEpXTsKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX0FERF9TVEEsCisJCS5mbGFncyA9IGZsYWdzLAorCQkuZGF0YSA9IGRhdGEsCisJfTsKKwl1OCBzdGFfaWQgX19tYXliZV91bnVzZWQgPSBzdGEtPnN0YS5zdGFfaWQ7CisKKwlEX0lORk8oIkFkZGluZyBzdGEgJXUgKCVwTSkgJXNzeW5jaHJvbm91c2x5XG4iLCBzdGFfaWQsIHN0YS0+c3RhLmFkZHIsCisJICAgICAgIGZsYWdzICYgQ01EX0FTWU5DID8gImEiIDogIiIpOworCisJaWYgKGZsYWdzICYgQ01EX0FTWU5DKQorCQljbWQuY2FsbGJhY2sgPSBpbF9hZGRfc3RhX2NhbGxiYWNrOworCWVsc2UgeworCQljbWQuZmxhZ3MgfD0gQ01EX1dBTlRfU0tCOworCQltaWdodF9zbGVlcCgpOworCX0KKworCWNtZC5sZW4gPSBpbC0+Y2ZnLT5vcHMtPnV0aWxzLT5idWlsZF9hZGRzdGFfaGNtZChzdGEsIGRhdGEpOworCXJldCA9IGlsX3NlbmRfY21kKGlsLCAmY21kKTsKKworCWlmIChyZXQgfHwgKGZsYWdzICYgQ01EX0FTWU5DKSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChyZXQgPT0gMCkgeworCQlwa3QgPSAoc3RydWN0IGlsX3J4X3BrdCAqKWNtZC5yZXBseV9wYWdlOworCQlyZXQgPSBpbF9wcm9jZXNzX2FkZF9zdGFfcmVzcChpbCwgc3RhLCBwa3QsIHRydWUpOworCX0KKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX2FkZF9zdGEpOworCitzdGF0aWMgdm9pZAoraWxfc2V0X2h0X2FkZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgdTggaWR4LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkgICAgICBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpzdGFfaHRfaW5mID0gJnN0YS0+aHRfY2FwOworCV9fbGUzMiBzdGFfZmxhZ3M7CisJdTggbWltb19wc19tb2RlOworCisJaWYgKCFzdGEgfHwgIXN0YV9odF9pbmYtPmh0X3N1cHBvcnRlZCkKKwkJZ290byBkb25lOworCisJbWltb19wc19tb2RlID0gKHN0YV9odF9pbmYtPmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU01fUFMpID4+IDI7CisJRF9BU1NPQygic3BhdGlhbCBtdWx0aXBsZXhpbmcgcG93ZXIgc2F2ZSBtb2RlOiAlc1xuIiwKKwkJKG1pbW9fcHNfbW9kZSA9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpID8gInN0YXRpYyIgOgorCQkobWltb19wc19tb2RlID09IFdMQU5fSFRfQ0FQX1NNX1BTX0RZTkFNSUMpID8gImR5bmFtaWMiIDoKKwkJImRpc2FibGVkIik7CisKKwlzdGFfZmxhZ3MgPSBpbC0+c3RhdGlvbnNbaWR4XS5zdGEuc3RhdGlvbl9mbGFnczsKKworCXN0YV9mbGFncyAmPSB+KFNUQV9GTEdfUlRTX01JTU9fUFJPVF9NU0sgfCBTVEFfRkxHX01JTU9fRElTX01TSyk7CisKKwlzd2l0Y2ggKG1pbW9fcHNfbW9kZSkgeworCWNhc2UgV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDOgorCQlzdGFfZmxhZ3MgfD0gU1RBX0ZMR19NSU1PX0RJU19NU0s7CisJCWJyZWFrOworCWNhc2UgV0xBTl9IVF9DQVBfU01fUFNfRFlOQU1JQzoKKwkJc3RhX2ZsYWdzIHw9IFNUQV9GTEdfUlRTX01JTU9fUFJPVF9NU0s7CisJCWJyZWFrOworCWNhc2UgV0xBTl9IVF9DQVBfU01fUFNfRElTQUJMRUQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX1dBUk4oIkludmFsaWQgTUlNTyBQUyBtb2RlICVkXG4iLCBtaW1vX3BzX21vZGUpOworCQlicmVhazsKKwl9CisKKwlzdGFfZmxhZ3MgfD0KKwkgICAgY3B1X3RvX2xlMzIoKHUzMikgc3RhX2h0X2luZi0+CisJCQlhbXBkdV9mYWN0b3IgPDwgU1RBX0ZMR19NQVhfQUdHX1NJWkVfUE9TKTsKKworCXN0YV9mbGFncyB8PQorCSAgICBjcHVfdG9fbGUzMigodTMyKSBzdGFfaHRfaW5mLT4KKwkJCWFtcGR1X2RlbnNpdHkgPDwgU1RBX0ZMR19BR0dfTVBEVV9ERU5TSVRZX1BPUyk7CisKKwlpZiAoaWxfaXNfaHQ0MF90eF9hbGxvd2VkKGlsLCBjdHgsICZzdGEtPmh0X2NhcCkpCisJCXN0YV9mbGFncyB8PSBTVEFfRkxHX0hUNDBfRU5fTVNLOworCWVsc2UKKwkJc3RhX2ZsYWdzICY9IH5TVEFfRkxHX0hUNDBfRU5fTVNLOworCisJaWwtPnN0YXRpb25zW2lkeF0uc3RhLnN0YXRpb25fZmxhZ3MgPSBzdGFfZmxhZ3M7Citkb25lOgorCXJldHVybjsKK30KKworLyoqCisgKiBpbF9wcmVwX3N0YXRpb24gLSBQcmVwYXJlIHN0YXRpb24gaW5mb3JtYXRpb24gZm9yIGFkZGl0aW9uCisgKgorICogc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHN0YV9sb2NrIGhlbGQKKyAqLwordTgKK2lsX3ByZXBfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJY29uc3QgdTggKmFkZHIsIGJvb2wgaXNfYXAsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IGlsX3N0YXRpb25fZW50cnkgKnN0YXRpb247CisJaW50IGk7CisJdTggc3RhX2lkID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCXUxNiByYXRlOworCisJaWYgKGlzX2FwKQorCQlzdGFfaWQgPSBjdHgtPmFwX3N0YV9pZDsKKwllbHNlIGlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihhZGRyKSkKKwkJc3RhX2lkID0gY3R4LT5iY2FzdF9zdGFfaWQ7CisJZWxzZQorCQlmb3IgKGkgPSBJTF9TVEFfSUQ7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7CisJCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcgorCQkJICAgIChpbC0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyLCBhZGRyKSkgeworCQkJCXN0YV9pZCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghaWwtPnN0YXRpb25zW2ldLnVzZWQgJiYKKwkJCSAgICBzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKQorCQkJCXN0YV9pZCA9IGk7CisJCX0KKworCS8qCisJICogVGhlc2UgdHdvIGNvbmRpdGlvbnMgaGF2ZSB0aGUgc2FtZSBvdXRjb21lLCBidXQga2VlcCB0aGVtCisJICogc2VwYXJhdGUKKwkgKi8KKwlpZiAodW5saWtlbHkoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikpCisJCXJldHVybiBzdGFfaWQ7CisKKwkvKgorCSAqIHVDb2RlIGlzIG5vdCBhYmxlIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSByZXF1ZXN0cyB0byBhZGQgYQorCSAqIHN0YXRpb24uIEtlZXAgdHJhY2sgaWYgb25lIGlzIGluIHByb2dyZXNzIHNvIHRoYXQgd2UgZG8gbm90IHNlbmQKKwkgKiBhbm90aGVyLgorCSAqLworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MpIHsKKwkJRF9JTkZPKCJTVEEgJWQgYWxyZWFkeSBpbiBwcm9jZXNzIG9mIGJlaW5nIGFkZGVkLlxuIiwgc3RhX2lkKTsKKwkJcmV0dXJuIHN0YV9pZDsKKwl9CisKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKKwkgICAgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSAmJgorCSAgICAhY29tcGFyZV9ldGhlcl9hZGRyKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkciwgYWRkcikpIHsKKwkJRF9BU1NPQygiU1RBICVkICglcE0pIGFscmVhZHkgYWRkZWQsIG5vdCBhZGRpbmcgYWdhaW4uXG4iLAorCQkJc3RhX2lkLCBhZGRyKTsKKwkJcmV0dXJuIHN0YV9pZDsKKwl9CisKKwlzdGF0aW9uID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdOworCXN0YXRpb24tPnVzZWQgPSBJTF9TVEFfRFJJVkVSX0FDVElWRTsKKwlEX0FTU09DKCJBZGQgU1RBIHRvIGRyaXZlciBJRCAlZDogJXBNXG4iLCBzdGFfaWQsIGFkZHIpOworCWlsLT5udW1fc3RhdGlvbnMrKzsKKworCS8qIFNldCB1cCB0aGUgQ19BRERfU1RBIGNvbW1hbmQgdG8gc2VuZCB0byBkZXZpY2UgKi8KKwltZW1zZXQoJnN0YXRpb24tPnN0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CisJbWVtY3B5KHN0YXRpb24tPnN0YS5zdGEuYWRkciwgYWRkciwgRVRIX0FMRU4pOworCXN0YXRpb24tPnN0YS5tb2RlID0gMDsKKwlzdGF0aW9uLT5zdGEuc3RhLnN0YV9pZCA9IHN0YV9pZDsKKwlzdGF0aW9uLT5zdGEuc3RhdGlvbl9mbGFncyA9IGN0eC0+c3RhdGlvbl9mbGFnczsKKwlzdGF0aW9uLT5jdHhpZCA9IGN0eC0+Y3R4aWQ7CisKKwlpZiAoc3RhKSB7CisJCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXZfY29tbW9uICpzdGFfcHJpdjsKKworCQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwkJc3RhX3ByaXYtPmN0eCA9IGN0eDsKKwl9CisKKwkvKgorCSAqIE9LIHRvIGNhbGwgdW5jb25kaXRpb25hbGx5LCBzaW5jZSBsb2NhbCBzdGF0aW9ucyAoSUJTUyBCU1NJRAorCSAqIFNUQSBhbmQgYnJvYWRjYXN0IFNUQSkgcGFzcyBpbiBhIE5VTEwgc3RhLCBhbmQgbWFjODAyMTEKKwkgKiBkb2Vzbid0IGFsbG93IEhUIElCU1MuCisJICovCisJaWxfc2V0X2h0X2FkZF9zdGF0aW9uKGlsLCBzdGFfaWQsIHN0YSwgY3R4KTsKKworCS8qIDM5NDUgb25seSAqLworCXJhdGUgPSAoaWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgPyBSQVRFXzZNX1BMQ1AgOiBSQVRFXzFNX1BMQ1A7CisJLyogVHVybiBvbiBib3RoIGFudGVubmFzIGZvciB0aGUgc3RhdGlvbi4uLiAqLworCXN0YXRpb24tPnN0YS5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUxNihyYXRlIHwgUkFURV9NQ1NfQU5UX0FCX01TSyk7CisKKwlyZXR1cm4gc3RhX2lkOworCit9CitFWFBPUlRfU1lNQk9MX0dQTChpbF9wcmVwX3N0YXRpb24pOworCisjZGVmaW5lIFNUQV9XQUlUX1RJTUVPVVQgKEhaLzIpCisKKy8qKgorICogaWxfYWRkX3N0YXRpb25fY29tbW9uIC0KKyAqLworaW50CitpbF9hZGRfc3RhdGlvbl9jb21tb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCSAgICAgIGNvbnN0IHU4ICphZGRyLCBib29sIGlzX2FwLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkgICAgICB1OCAqc3RhX2lkX3IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOworCWludCByZXQgPSAwOworCXU4IHN0YV9pZDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJKnN0YV9pZF9yID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlzdGFfaWQgPSBpbF9wcmVwX3N0YXRpb24oaWwsIGN0eCwgYWRkciwgaXNfYXAsIHN0YSk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gcHJlcGFyZSBzdGF0aW9uICVwTSBmb3IgYWRkaXRpb25cbiIsIGFkZHIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIHVDb2RlIGlzIG5vdCBhYmxlIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSByZXF1ZXN0cyB0byBhZGQgYQorCSAqIHN0YXRpb24uIEtlZXAgdHJhY2sgaWYgb25lIGlzIGluIHByb2dyZXNzIHNvIHRoYXQgd2UgZG8gbm90IHNlbmQKKwkgKiBhbm90aGVyLgorCSAqLworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MpIHsKKwkJRF9JTkZPKCJTVEEgJWQgYWxyZWFkeSBpbiBwcm9jZXNzIG9mIGJlaW5nIGFkZGVkLlxuIiwgc3RhX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCisJICAgIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkpIHsKKwkJRF9BU1NPQygiU1RBICVkICglcE0pIGFscmVhZHkgYWRkZWQsIG5vdCBhZGRpbmcgYWdhaW4uXG4iLAorCQkJc3RhX2lkLCBhZGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisKKwkvKiBBZGQgc3RhdGlvbiB0byBkZXZpY2UncyBzdGF0aW9uIHRhYmxlICovCisJcmV0ID0gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOworCWlmIChyZXQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCUlMX0VSUigiQWRkaW5nIHN0YXRpb24gJXBNIGZhaWxlZC5cbiIsCisJCSAgICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JTF9TVEFfRFJJVkVSX0FDVElWRTsKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJfQorCSpzdGFfaWRfciA9IHN0YV9pZDsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9hZGRfc3RhdGlvbl9jb21tb24pOworCisvKioKKyAqIGlsX3N0YV91Y29kZV9kZWFjdGl2YXRlIC0gZGVhY3RpdmF0ZSB1Y29kZSBzdGF0dXMgZm9yIGEgc3RhdGlvbgorICoKKyAqIGlsLT5zdGFfbG9jayBtdXN0IGJlIGhlbGQKKyAqLworc3RhdGljIHZvaWQKK2lsX3N0YV91Y29kZV9kZWFjdGl2YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgdTggc3RhX2lkKQoreworCS8qIFVjb2RlIG11c3QgYmUgYWN0aXZlIGFuZCBkcml2ZXIgbXVzdCBiZSBub24gYWN0aXZlICovCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS4KKwkgICAgIHVzZWQgJiAoSUxfU1RBX1VDT0RFX0FDVElWRSB8IElMX1NUQV9EUklWRVJfQUNUSVZFKSkgIT0KKwkgICAgSUxfU1RBX1VDT0RFX0FDVElWRSkKKwkJSUxfRVJSKCJyZW1vdmVkIG5vbiBhY3RpdmUgU1RBICV1XG4iLCBzdGFfaWQpOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0FDVElWRTsKKworCW1lbXNldCgmaWwtPnN0YXRpb25zW3N0YV9pZF0sIDAsIHNpemVvZihzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSkpOworCURfQVNTT0MoIlJlbW92ZWQgU1RBICV1XG4iLCBzdGFfaWQpOworfQorCitzdGF0aWMgaW50CitpbF9zZW5kX3JlbW92ZV9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggKiBhZGRyLCBpbnQgc3RhX2lkLAorCQkgICAgICAgYm9vbCB0ZW1wb3JhcnkpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0OworCWludCByZXQ7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CisJc3RydWN0IGlsX3JlbV9zdGFfY21kIHJtX3N0YV9jbWQ7CisKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX1JFTV9TVEEsCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGlsX3JlbV9zdGFfY21kKSwKKwkJLmZsYWdzID0gQ01EX1NZTkMsCisJCS5kYXRhID0gJnJtX3N0YV9jbWQsCisJfTsKKworCW1lbXNldCgmcm1fc3RhX2NtZCwgMCwgc2l6ZW9mKHJtX3N0YV9jbWQpKTsKKwlybV9zdGFfY21kLm51bV9zdGEgPSAxOworCW1lbWNweSgmcm1fc3RhX2NtZC5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisKKwljbWQuZmxhZ3MgfD0gQ01EX1dBTlRfU0tCOworCisJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBrdCA9IChzdHJ1Y3QgaWxfcnhfcGt0ICopY21kLnJlcGx5X3BhZ2U7CisJaWYgKHBrdC0+aGRyLmZsYWdzICYgSUxfQ01EX0ZBSUxFRF9NU0spIHsKKwkJSUxfRVJSKCJCYWQgcmV0dXJuIGZyb20gQ19SRU1fU1RBICgweCUwOFgpXG4iLCBwa3QtPmhkci5mbGFncyk7CisJCXJldCA9IC1FSU87CisJfQorCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChwa3QtPnUucmVtX3N0YS5zdGF0dXMpIHsKKwkJY2FzZSBSRU1fU1RBX1NVQ0NFU1NfTVNLOgorCQkJaWYgKCF0ZW1wb3JhcnkpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCQlpbF9zdGFfdWNvZGVfZGVhY3RpdmF0ZShpbCwgc3RhX2lkKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssCisJCQkJCQkgICAgICAgZmxhZ3Nfc3Bpbik7CisJCQl9CisJCQlEX0FTU09DKCJDX1JFTV9TVEEgUEFTU0VEXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTzsKKwkJCUlMX0VSUigiQ19SRU1fU1RBIGZhaWxlZFxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlsX3JlbW92ZV9zdGF0aW9uIC0gUmVtb3ZlIGRyaXZlcidzIGtub3dsZWRnZSBvZiBzdGF0aW9uLgorICovCitpbnQKK2lsX3JlbW92ZV9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggc3RhX2lkLCBjb25zdCB1OCAqIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaWxfaXNfcmVhZHkoaWwpKSB7CisJCURfSU5GTygiVW5hYmxlIHRvIHJlbW92ZSBzdGF0aW9uICVwTSwgZGV2aWNlIG5vdCByZWFkeS5cbiIsCisJCSAgICAgICBhZGRyKTsKKwkJLyoKKwkJICogSXQgaXMgdHlwaWNhbCBmb3Igc3RhdGlvbnMgdG8gYmUgcmVtb3ZlZCB3aGVuIHdlIGFyZQorCQkgKiBnb2luZyBkb3duLiBSZXR1cm4gc3VjY2VzcyBzaW5jZSBkZXZpY2Ugd2lsbCBiZSBkb3duCisJCSAqIHNvb24gYW55d2F5CisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlEX0FTU09DKCJSZW1vdmluZyBTVEEgZnJvbSBkcml2ZXI6JWQgICVwTVxuIiwgc3RhX2lkLCBhZGRyKTsKKworCWlmIChXQVJOX09OKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCWlmICghKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkpIHsKKwkJRF9JTkZPKCJSZW1vdmluZyAlcE0gYnV0IG5vbiBEUklWRVIgYWN0aXZlXG4iLCBhZGRyKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmICghKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSkgeworCQlEX0lORk8oIlJlbW92aW5nICVwTSBidXQgbm9uIFVDT0RFIGFjdGl2ZVxuIiwgYWRkcik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9MT0NBTCkgeworCQlrZnJlZShpbC0+c3RhdGlvbnNbc3RhX2lkXS5scSk7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxID0gTlVMTDsKKwl9CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JTF9TVEFfRFJJVkVSX0FDVElWRTsKKworCWlsLT5udW1fc3RhdGlvbnMtLTsKKworCUJVR19PTihpbC0+bnVtX3N0YXRpb25zIDwgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbF9zZW5kX3JlbW92ZV9zdGF0aW9uKGlsLCBhZGRyLCBzdGFfaWQsIGZhbHNlKTsKK291dF9lcnI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbF9yZW1vdmVfc3RhdGlvbik7CisKKy8qKgorICogaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMgLSBjbGVhciB1Y29kZSBzdGF0aW9uIHRhYmxlIGJpdHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyBhbGwgdGhlIGJpdHMgaW4gdGhlIGRyaXZlciBpbmRpY2F0aW5nCisgKiB3aGljaCBzdGF0aW9ucyBhcmUgYWN0aXZlIGluIHRoZSB1Y29kZS4gQ2FsbCB3aGVuIHNvbWV0aGluZworICogb3RoZXIgdGhhbiBleHBsaWNpdCBzdGF0aW9uIG1hbmFnZW1lbnQgd291bGQgY2F1c2UgdGhpcyBpbgorICogdGhlIHVjb2RlLCBlLmcuIHVuYXNzb2NpYXRlZCBSWE9OLgorICovCit2b2lkCitpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CisJYm9vbCBjbGVhcmVkID0gZmFsc2U7CisKKwlEX0lORk8oIkNsZWFyaW5nIHVjb2RlIHN0YXRpb25zIGluIGRyaXZlclxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgeworCQlpZiAoY3R4ICYmIGN0eC0+Y3R4aWQgIT0gaWwtPnN0YXRpb25zW2ldLmN0eGlkKQorCQkJY29udGludWU7CisKKwkJaWYgKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkgeworCQkJRF9JTkZPKCJDbGVhcmluZyB1Y29kZSBhY3RpdmUgZm9yIHN0YXRpb24gJWRcbiIsIGkpOworCQkJaWwtPnN0YXRpb25zW2ldLnVzZWQgJj0gfklMX1NUQV9VQ09ERV9BQ1RJVkU7CisJCQljbGVhcmVkID0gdHJ1ZTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCisJaWYgKCFjbGVhcmVkKQorCQlEX0lORk8oIk5vIGFjdGl2ZSBzdGF0aW9ucyBmb3VuZCB0byBiZSBjbGVhcmVkXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMpOworCisvKioKKyAqIGlsX3Jlc3RvcmVfc3RhdGlvbnMoKSAtIFJlc3RvcmUgZHJpdmVyIGtub3duIHN0YXRpb25zIHRvIGRldmljZQorICoKKyAqIEFsbCBzdGF0aW9ucyBjb25zaWRlcmVkIGFjdGl2ZSBieSBkcml2ZXIsIGJ1dCBub3QgcHJlc2VudCBpbiB1Y29kZSwgaXMKKyAqIHJlc3RvcmVkLgorICoKKyAqIEZ1bmN0aW9uIHNsZWVwcy4KKyAqLwordm9pZAoraWxfcmVzdG9yZV9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kIGxxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3Nfc3BpbjsKKwlpbnQgaTsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJaW50IHJldDsKKwlib29sIHNlbmRfbHE7CisKKwlpZiAoIWlsX2lzX3JlYWR5KGlsKSkgeworCQlEX0lORk8oIk5vdCByZWFkeSB5ZXQsIG5vdCByZXN0b3JpbmcgYW55IHN0YXRpb25zLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlEX0FTU09DKCJSZXN0b3JpbmcgYWxsIGtub3duIHN0YXRpb25zIC4uLiBzdGFydC5cbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCWZvciAoaSA9IDA7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7CisJCWlmIChjdHgtPmN0eGlkICE9IGlsLT5zdGF0aW9uc1tpXS5jdHhpZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCisJCSAgICAhKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkpIHsKKwkJCURfQVNTT0MoIlJlc3RvcmluZyBzdGEgJXBNXG4iLAorCQkJCWlsLT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIpOworCQkJaWwtPnN0YXRpb25zW2ldLnN0YS5tb2RlID0gMDsKKwkJCWlsLT5zdGF0aW9uc1tpXS51c2VkIHw9IElMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQkJZm91bmQgPSB0cnVlOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKKwkJaWYgKChpbC0+c3RhdGlvbnNbaV0udXNlZCAmIElMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSkgeworCQkJbWVtY3B5KCZzdGFfY21kLCAmaWwtPnN0YXRpb25zW2ldLnN0YSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwkJCXNlbmRfbHEgPSBmYWxzZTsKKwkJCWlmIChpbC0+c3RhdGlvbnNbaV0ubHEpIHsKKwkJCQltZW1jcHkoJmxxLCBpbC0+c3RhdGlvbnNbaV0ubHEsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCkpOworCQkJCXNlbmRfbHEgPSB0cnVlOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCXJldCA9IGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCQlJTF9FUlIoIkFkZGluZyBzdGF0aW9uICVwTSBmYWlsZWQuXG4iLAorCQkJCSAgICAgICBpbC0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyKTsKKwkJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX0RSSVZFUl9BQ1RJVkU7CisJCQkJaWwtPnN0YXRpb25zW2ldLnVzZWQgJj0KKwkJCQkgICAgfklMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywKKwkJCQkJCSAgICAgICBmbGFnc19zcGluKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBSYXRlIHNjYWxpbmcgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwgc2VuZAorCQkJICogY3VycmVudCBMUSBjb21tYW5kCisJCQkgKi8KKwkJCWlmIChzZW5kX2xxKQorCQkJCWlsX3NlbmRfbHFfY21kKGlsLCBjdHgsICZscSwgQ01EX1NZTkMsIHRydWUpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCWlmICghZm91bmQpCisJCURfSU5GTygiUmVzdG9yaW5nIGFsbCBrbm93biBzdGF0aW9ucyIKKwkJICAgICAgICIgLi4uLiBubyBzdGF0aW9ucyB0byBiZSByZXN0b3JlZC5cbiIpOworCWVsc2UKKwkJRF9JTkZPKCJSZXN0b3JpbmcgYWxsIGtub3duIHN0YXRpb25zIiAiIC4uLi4gY29tcGxldGUuXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfcmVzdG9yZV9zdGF0aW9ucyk7CisKK2ludAoraWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPnN0YV9rZXlfbWF4X251bTsgaSsrKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJmlsLT51Y29kZV9rZXlfdGFibGUpKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gV0VQX0lOVkFMSURfT0ZGU0VUOworfQorRVhQT1JUX1NZTUJPTChpbF9nZXRfZnJlZV91Y29kZV9rZXlfaWR4KTsKKwordm9pZAoraWxfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgeworCQlpZiAoIShpbC0+c3RhdGlvbnNbaV0udXNlZCAmIElMX1NUQV9CQ0FTVCkpCisJCQljb250aW51ZTsKKworCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0FDVElWRTsKKwkJaWwtPm51bV9zdGF0aW9ucy0tOworCQlCVUdfT04oaWwtPm51bV9zdGF0aW9ucyA8IDApOworCQlrZnJlZShpbC0+c3RhdGlvbnNbaV0ubHEpOworCQlpbC0+c3RhdGlvbnNbaV0ubHEgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMpOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCitzdGF0aWMgdm9pZAoraWxfZHVtcF9scV9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEpCit7CisJaW50IGk7CisJRF9SQVRFKCJscSBzdGF0aW9uIGlkIDB4JXhcbiIsIGxxLT5zdGFfaWQpOworCURfUkFURSgibHEgYW50IDB4JVggMHglWFxuIiwgbHEtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zaywKKwkgICAgICAgbHEtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spOworCisJZm9yIChpID0gMDsgaSA8IExJTktfUVVBTF9NQVhfUkVUUllfTlVNOyBpKyspCisJCURfUkFURSgibHEgaWR4ICVkIDB4JVhcbiIsIGksIGxxLT5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZHVtcF9scV9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEpCit7Cit9CisjZW5kaWYKKworLyoqCisgKiBpbF9pc19scV90YWJsZV92YWxpZCgpIC0gVGVzdCBvbmUgYXNwZWN0IG9mIExRIGNtZCBmb3IgdmFsaWRpdHkKKyAqCisgKiBJdCBzb21ldGltZXMgaGFwcGVucyB3aGVuIGEgSFQgcmF0ZSBoYXMgYmVlbiBpbiB1c2UgYW5kIHdlCisgKiBsb29zZSBjb25uZWN0aXZpdHkgd2l0aCBBUCB0aGVuIG1hYzgwMjExIHdpbGwgZmlyc3QgdGVsbCB1cyB0aGF0IHRoZQorICogY3VycmVudCBjaGFubmVsIGlzIG5vdCBIVCBhbnltb3JlIGJlZm9yZSByZW1vdmluZyB0aGUgc3RhdGlvbi4gSW4gc3VjaCBhCisgKiBzY2VuYXJpbyB0aGUgUlhPTiBmbGFncyB3aWxsIGJlIHVwZGF0ZWQgdG8gaW5kaWNhdGUgd2UgYXJlIG5vdAorICogY29tbXVuaWNhdGluZyBIVCBhbnltb3JlLCBidXQgdGhlIExRIGNvbW1hbmQgbWF5IHN0aWxsIGNvbnRhaW4gSFQgcmF0ZXMuCisgKiBUZXN0IGZvciB0aGlzIHRvIHByZXZlbnQgZHJpdmVyIGZyb20gc2VuZGluZyBMUSBjb21tYW5kIGJldHdlZW4gdGhlIHRpbWUKKyAqIFJYT04gZmxhZ3MgYXJlIHVwZGF0ZWQgYW5kIHdoZW4gTFEgY29tbWFuZCBpcyB1cGRhdGVkLgorICovCitzdGF0aWMgYm9vbAoraWxfaXNfbHFfdGFibGVfdmFsaWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCSAgICAgc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKmxxKQoreworCWludCBpOworCisJaWYgKGN0eC0+aHQuZW5hYmxlZCkKKwkJcmV0dXJuIHRydWU7CisKKwlEX0lORk8oIkNoYW5uZWwgJXUgaXMgbm90IGFuIEhUIGNoYW5uZWxcbiIsIGN0eC0+YWN0aXZlLmNoYW5uZWwpOworCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKSB7CisJCWlmIChsZTMyX3RvX2NwdShscS0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzKSAmIFJBVEVfTUNTX0hUX01TSykgeworCQkJRF9JTkZPKCJpZHggJWQgb2YgTFEgZXhwZWN0cyBIVCBjaGFubmVsXG4iLCBpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBpbF9zZW5kX2xxX2NtZCgpIC0gU2VuZCBsaW5rIHF1YWxpdHkgY29tbWFuZAorICogQGluaXQ6IFRoaXMgY29tbWFuZCBpcyBzZW50IGFzIHBhcnQgb2Ygc3RhdGlvbiBpbml0aWFsaXphdGlvbiByaWdodAorICogICAgICAgIGFmdGVyIHN0YXRpb24gaGFzIGJlZW4gYWRkZWQuCisgKgorICogVGhlIGxpbmsgcXVhbGl0eSBjb21tYW5kIGlzIHNlbnQgYXMgdGhlIGxhc3Qgc3RlcCBvZiBzdGF0aW9uIGNyZWF0aW9uLgorICogVGhpcyBpcyB0aGUgc3BlY2lhbCBjYXNlIGluIHdoaWNoIGluaXQgaXMgc2V0IGFuZCB3ZSBjYWxsIGEgY2FsbGJhY2sgaW4KKyAqIHRoaXMgY2FzZSB0byBjbGVhciB0aGUgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHN0YXRpb24gY3JlYXRpb24gaXMgaW4KKyAqIHByb2dyZXNzLgorICovCitpbnQKK2lsX3NlbmRfbHFfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCSAgICAgICBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEsIHU4IGZsYWdzLCBib29sIGluaXQpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOworCisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gQ19UWF9MSU5LX1FVQUxJVFlfQ01ELAorCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kKSwKKwkJLmZsYWdzID0gZmxhZ3MsCisJCS5kYXRhID0gbHEsCisJfTsKKworCWlmIChXQVJOX09OKGxxLT5zdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlpZiAoIShpbC0+c3RhdGlvbnNbbHEtPnN0YV9pZF0udXNlZCAmIElMX1NUQV9EUklWRVJfQUNUSVZFKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKworCWlsX2R1bXBfbHFfY21kKGlsLCBscSk7CisJQlVHX09OKGluaXQgJiYgKGNtZC5mbGFncyAmIENNRF9BU1lOQykpOworCisJaWYgKGlsX2lzX2xxX3RhYmxlX3ZhbGlkKGlsLCBjdHgsIGxxKSkKKwkJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOworCWVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKKworCWlmIChjbWQuZmxhZ3MgJiBDTURfQVNZTkMpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaW5pdCkgeworCQlEX0lORk8oImluaXQgTFEgY29tbWFuZCBjb21wbGV0ZSwiCisJCSAgICAgICAiIGNsZWFyaW5nIHN0YSBhZGRpdGlvbiBzdGF0dXMgZm9yIHN0YSAlZFxuIiwKKwkJICAgICAgIGxxLT5zdGFfaWQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJaWwtPnN0YXRpb25zW2xxLT5zdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX2xxX2NtZCk7CisKK2ludAoraWxfbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2X2NvbW1vbiAqc3RhX2NvbW1vbiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlpbnQgcmV0OworCisJRF9JTkZPKCJyZWNlaXZlZCByZXF1ZXN0IHRvIHJlbW92ZSBzdGF0aW9uICVwTVxuIiwgc3RhLT5hZGRyKTsKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCURfSU5GTygicHJvY2VlZGluZyB0byByZW1vdmUgc3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJcmV0ID0gaWxfcmVtb3ZlX3N0YXRpb24oaWwsIHN0YV9jb21tb24tPnN0YV9pZCwgc3RhLT5hZGRyKTsKKwlpZiAocmV0KQorCQlJTF9FUlIoIkVycm9yIHJlbW92aW5nIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9tYWNfc3RhX3JlbW92ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBSWC1GVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBSeCB0aGVvcnkgb2Ygb3BlcmF0aW9uCisgKgorICogRHJpdmVyIGFsbG9jYXRlcyBhIGNpcmN1bGFyIGJ1ZmZlciBvZiBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9ycyAoUkJEcyksCisgKiBlYWNoIG9mIHdoaWNoIHBvaW50IHRvIFJlY2VpdmUgQnVmZmVycyB0byBiZSBmaWxsZWQgYnkgdGhlIE5JQy4gIFRoZXNlIGdldAorICogdXNlZCBub3Qgb25seSBmb3IgUnggZnJhbWVzLCBidXQgZm9yIGFueSBjb21tYW5kIHJlc3BvbnNlIG9yIG5vdGlmaWNhdGlvbgorICogZnJvbSB0aGUgTklDLiAgVGhlIGRyaXZlciBhbmQgTklDIG1hbmFnZSB0aGUgUnggYnVmZmVycyBieSBtZWFucworICogb2YgaWR4ZXMgaW50byB0aGUgY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIFJ4IFF1ZXVlIEluZGV4ZXMKKyAqIFRoZSBob3N0L2Zpcm13YXJlIHNoYXJlIHR3byBpZHggcmVnaXN0ZXJzIGZvciBtYW5hZ2luZyB0aGUgUnggYnVmZmVycy4KKyAqCisgKiBUaGUgUkVBRCBpZHggbWFwcyB0byB0aGUgZmlyc3QgcG9zaXRpb24gdGhhdCB0aGUgZmlybXdhcmUgbWF5IGJlIHdyaXRpbmcKKyAqIHRvIC0tIHRoZSBkcml2ZXIgY2FuIHJlYWQgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGlzIHBvc2l0aW9uIGFuZCBnZXQKKyAqIGdvb2QgZGF0YS4KKyAqIFRoZSBSRUFEIGlkeCBpcyBtYW5hZ2VkIGJ5IHRoZSBmaXJtd2FyZSBvbmNlIHRoZSBjYXJkIGlzIGVuYWJsZWQuCisgKgorICogVGhlIFdSSVRFIGlkeCBtYXBzIHRvIHRoZSBsYXN0IHBvc2l0aW9uIHRoZSBkcml2ZXIgaGFzIHJlYWQgZnJvbSAtLSB0aGUKKyAqIHBvc2l0aW9uIHByZWNlZGluZyBXUklURSBpcyB0aGUgbGFzdCBzbG90IHRoZSBmaXJtd2FyZSBjYW4gcGxhY2UgYSBwYWNrZXQuCisgKgorICogVGhlIHF1ZXVlIGlzIGVtcHR5IChubyBnb29kIGRhdGEpIGlmIFdSSVRFID0gUkVBRCAtIDEsIGFuZCBpcyBmdWxsIGlmCisgKiBXUklURSA9IFJFQUQuCisgKgorICogRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgaG9zdCBzZXRzIHVwIHRoZSBSRUFEIHF1ZXVlIHBvc2l0aW9uIHRvIHRoZSBmaXJzdAorICogSURYIHBvc2l0aW9uLCBhbmQgV1JJVEUgdG8gdGhlIGxhc3QgKFJFQUQgLSAxIHdyYXBwZWQpCisgKgorICogV2hlbiB0aGUgZmlybXdhcmUgcGxhY2VzIGEgcGFja2V0IGluIGEgYnVmZmVyLCBpdCB3aWxsIGFkdmFuY2UgdGhlIFJFQUQgaWR4CisgKiBhbmQgZmlyZSB0aGUgUlggaW50ZXJydXB0LiAgVGhlIGRyaXZlciBjYW4gdGhlbiBxdWVyeSB0aGUgUkVBRCBpZHggYW5kCisgKiBwcm9jZXNzIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZSwgbW92aW5nIHRoZSBXUklURSBpZHggZm9yd2FyZCBhcyBpdAorICogcmVzZXRzIHRoZSBSeCBxdWV1ZSBidWZmZXJzIHdpdGggbmV3IG1lbW9yeS4KKyAqCisgKiBUaGUgbWFuYWdlbWVudCBpbiB0aGUgZHJpdmVyIGlzIGFzIGZvbGxvd3M6CisgKiArIEEgbGlzdCBvZiBwcmUtYWxsb2NhdGVkIFNLQnMgaXMgc3RvcmVkIGluIGl3bC0+cnhxLT5yeF9mcmVlLiAgV2hlbgorICogICBpd2wtPnJ4cS0+ZnJlZV9jb3VudCBkcm9wcyB0byBvciBiZWxvdyBSWF9MT1dfV0FURVJNQVJLLCB3b3JrIGlzIHNjaGVkdWxlZAorICogICB0byByZXBsZW5pc2ggdGhlIGl3bC0+cnhxLT5yeF9mcmVlLgorICogKyBJbiBpbF9yeF9yZXBsZW5pc2ggKHNjaGVkdWxlZCkgaWYgJ3Byb2Nlc3NlZCcgIT0gJ3JlYWQnIHRoZW4gdGhlCisgKiAgIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGFuZCB0aGUgUkVBRCBJRFggaXMgdXBkYXRlZCAodXBkYXRpbmcgdGhlCisgKiAgICdwcm9jZXNzZWQnIGFuZCAncmVhZCcgZHJpdmVyIGlkeGVzIGFzIHdlbGwpCisgKiArIEEgcmVjZWl2ZWQgcGFja2V0IGlzIHByb2Nlc3NlZCBhbmQgaGFuZGVkIHRvIHRoZSBrZXJuZWwgbmV0d29yayBzdGFjaywKKyAqICAgZGV0YWNoZWQgZnJvbSB0aGUgaXdsLT5yeHEuICBUaGUgZHJpdmVyICdwcm9jZXNzZWQnIGlkeCBpcyB1cGRhdGVkLgorICogKyBUaGUgSG9zdC9GaXJtd2FyZSBpd2wtPnJ4cSBpcyByZXBsZW5pc2hlZCBhdCB0YXNrbGV0IHRpbWUgZnJvbSB0aGUgcnhfZnJlZQorICogICBsaXN0LiBJZiB0aGVyZSBhcmUgbm8gYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUsIHRoZSBSRUFECisgKiAgIElEWCBpcyBub3QgaW5jcmVtZW50ZWQgYW5kIGl3bC0+c3RhdHVzKFJYX1NUQUxMRUQpIGlzIHNldC4gIElmIHRoZXJlCisgKiAgIHdlcmUgZW5vdWdoIGZyZWUgYnVmZmVycyBhbmQgUlhfU1RBTExFRCBpcyBzZXQgaXQgaXMgY2xlYXJlZC4KKyAqCisgKgorICogRHJpdmVyIHNlcXVlbmNlOgorICoKKyAqIGlsX3J4X3F1ZXVlX2FsbG9jKCkgICBBbGxvY2F0ZXMgcnhfZnJlZQorICogaWxfcnhfcmVwbGVuaXNoKCkgICAgIFJlcGxlbmlzaGVzIHJ4X2ZyZWUgbGlzdCBmcm9tIHJ4X3VzZWQsIGFuZCBjYWxscworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWxfcnhfcXVldWVfcmVzdG9jaworICogaWxfcnhfcXVldWVfcmVzdG9jaygpIE1vdmVzIGF2YWlsYWJsZSBidWZmZXJzIGZyb20gcnhfZnJlZSBpbnRvIFJ4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgdXBkYXRlcyBmaXJtd2FyZSBwb2ludGVycywgYW5kIHVwZGF0ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBXUklURSBpZHguICBJZiBpbnN1ZmZpY2llbnQgcnhfZnJlZSBidWZmZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlLCBzY2hlZHVsZXMgaWxfcnhfcmVwbGVuaXNoCisgKgorICogLS0gZW5hYmxlIGludGVycnVwdHMgLS0KKyAqIElTUiAtIGlsX3J4KCkgICAgICAgICBEZXRhY2ggaWxfcnhfYnVmcyBmcm9tIHBvb2wgdXAgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFEIElEWCwgZGV0YWNoaW5nIHRoZSBTS0IgZnJvbSB0aGUgcG9vbC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVzIHRoZSBwYWNrZXQgYnVmZmVyIGZyb20gcXVldWUgdG8gcnhfdXNlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxzIGlsX3J4X3F1ZXVlX3Jlc3RvY2sgdG8gcmVmaWxsIGFueSBlbXB0eQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHMuCisgKiAuLi4KKyAqCisgKi8KKworLyoqCisgKiBpbF9yeF9xdWV1ZV9zcGFjZSAtIFJldHVybiBudW1iZXIgb2YgZnJlZSBzbG90cyBhdmFpbGFibGUgaW4gcXVldWUuCisgKi8KK2ludAoraWxfcnhfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGlsX3J4X3F1ZXVlICpxKQoreworCWludCBzID0gcS0+cmVhZCAtIHEtPndyaXRlOworCWlmIChzIDw9IDApCisJCXMgKz0gUlhfUVVFVUVfU0laRTsKKwkvKiBrZWVwIHNvbWUgYnVmZmVyIHRvIG5vdCBjb25mdXNlIGZ1bGwgYW5kIGVtcHR5IHF1ZXVlICovCisJcyAtPSAyOworCWlmIChzIDwgMCkKKwkJcyA9IDA7CisJcmV0dXJuIHM7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3J4X3F1ZXVlX3NwYWNlKTsKKworLyoqCisgKiBpbF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyIC0gVXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyIGZvciB0aGUgUlggcXVldWUKKyAqLwordm9pZAoraWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiByeF93cnRfcHRyX3JlZyA9IGlsLT5od19wYXJhbXMucnhfd3J0X3B0cl9yZWc7CisJdTMyIHJlZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bmVlZF91cGRhdGUgPT0gMCkKKwkJZ290byBleGl0X3VubG9jazsKKworCS8qIElmIHBvd2VyLXNhdmluZyBpcyBpbiB1c2UsIG1ha2Ugc3VyZSBkZXZpY2UgaXMgYXdha2UgKi8KKwlpZiAodGVzdF9iaXQoU19QT1dFUl9QTUksICZpbC0+c3RhdHVzKSkgeworCQlyZWcgPSBfaWxfcmQoaWwsIENTUl9VQ09ERV9EUlZfR1AxKTsKKworCQlpZiAocmVnICYgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX01BQ19TTEVFUCkgeworCQkJRF9JTkZPKCJSeCBxdWV1ZSByZXF1ZXN0aW5nIHdha2V1cCwiICIgR1AxID0gMHgleFxuIiwKKwkJCSAgICAgICByZWcpOworCQkJaWxfc2V0X2JpdChpbCwgQ1NSX0dQX0NOVFJMLAorCQkJCSAgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7CisJCQlnb3RvIGV4aXRfdW5sb2NrOworCQl9CisKKwkJcS0+d3JpdGVfYWN0dWFsID0gKHEtPndyaXRlICYgfjB4Nyk7CisJCWlsX3dyKGlsLCByeF93cnRfcHRyX3JlZywgcS0+d3JpdGVfYWN0dWFsKTsKKworCQkvKiBFbHNlIGRldmljZSBpcyBhc3N1bWVkIHRvIGJlIGF3YWtlICovCisJfSBlbHNlIHsKKwkJLyogRGV2aWNlIGV4cGVjdHMgYSBtdWx0aXBsZSBvZiA4ICovCisJCXEtPndyaXRlX2FjdHVhbCA9IChxLT53cml0ZSAmIH4weDcpOworCQlpbF93cihpbCwgcnhfd3J0X3B0cl9yZWcsIHEtPndyaXRlX2FjdHVhbCk7CisJfQorCisJcS0+bmVlZF91cGRhdGUgPSAwOworCitleGl0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIpOworCitpbnQKK2lsX3J4X3F1ZXVlX2FsbG9jKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSA9ICZpbC0+cnhxOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbC0+cGNpX2Rldi0+ZGV2OworCWludCBpOworCisJc3Bpbl9sb2NrX2luaXQoJnJ4cS0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfZnJlZSk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfdXNlZCk7CisKKwkvKiBBbGxvYyB0aGUgY2lyY3VsYXIgYnVmZmVyIG9mIFJlYWQgQnVmZmVyIERlc2NyaXB0b3JzIChSQkRzKSAqLworCXJ4cS0+YmQgPQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgJnJ4cS0+YmRfZG1hLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghcnhxLT5iZCkKKwkJZ290byBlcnJfYmQ7CisKKwlyeHEtPnJiX3N0dHMgPQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplb2Yoc3RydWN0IGlsX3JiX3N0YXR1cyksCisJCQkgICAgICAgJnJ4cS0+cmJfc3R0c19kbWEsIEdGUF9LRVJORUwpOworCWlmICghcnhxLT5yYl9zdHRzKQorCQlnb3RvIGVycl9yYjsKKworCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKKworCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQorCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLworCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOworCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKKwlyeHEtPmZyZWVfY291bnQgPSAwOworCXJ4cS0+bmVlZF91cGRhdGUgPSAwOworCXJldHVybiAwOworCitlcnJfcmI6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmlsLT5wY2lfZGV2LT5kZXYsIDQgKiBSWF9RVUVVRV9TSVpFLCByeHEtPmJkLAorCQkJICByeHEtPmJkX2RtYSk7CitlcnJfYmQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MKGlsX3J4X3F1ZXVlX2FsbG9jKTsKKwordm9pZAoraWxfaGRsX3NwZWN0cnVtX21lYXN1cmVtZW50KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX3NwZWN0cnVtX25vdGlmaWNhdGlvbiAqcmVwb3J0ID0gJihwa3QtPnUuc3BlY3RydW1fbm90aWYpOworCisJaWYgKCFyZXBvcnQtPnN0YXRlKSB7CisJCURfMTFIKCJTcGVjdHJ1bSBNZWFzdXJlIE5vdGlmaWNhdGlvbjogU3RhcnRcbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KCZpbC0+bWVhc3VyZV9yZXBvcnQsIHJlcG9ydCwgc2l6ZW9mKCpyZXBvcnQpKTsKKwlpbC0+bWVhc3VyZW1lbnRfc3RhdHVzIHw9IE1FQVNVUkVNRU5UX1JFQURZOworfQorRVhQT1JUX1NZTUJPTChpbF9oZGxfc3BlY3RydW1fbWVhc3VyZW1lbnQpOworCisvKgorICogcmV0dXJucyBub24temVybyBpZiBwYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQKKyAqLworaW50CitpbF9zZXRfZGVjcnlwdGVkX2ZsYWcoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkgICAgICB1MzIgZGVjcnlwdF9yZXMsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0cykKK3sKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpOworCisJLyoKKwkgKiBBbGwgY29udGV4dHMgaGF2ZSB0aGUgc2FtZSBzZXR0aW5nIGhlcmUgZHVlIHRvIGl0IGJlaW5nCisJICogYSBtb2R1bGUgcGFyYW1ldGVyLCBzbyBPSyB0byBjaGVjayBhbnkgY29udGV4dC4KKwkgKi8KKwlpZiAoaWwtPmN0eC5hY3RpdmUuZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLKQorCQlyZXR1cm4gMDsKKworCWlmICghKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSkKKwkJcmV0dXJuIDA7CisKKwlEX1JYKCJkZWNyeXB0X3JlczoweCV4XG4iLCBkZWNyeXB0X3Jlcyk7CisJc3dpdGNoIChkZWNyeXB0X3JlcyAmIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLKSB7CisJY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1RLSVA6CisJCS8qIFRoZSB1Q29kZSBoYXMgZ290IGEgYmFkIHBoYXNlIDEgS2V5LCBwdXNoZXMgdGhlIHBhY2tldC4KKwkJICogRGVjcnlwdGlvbiB3aWxsIGJlIGRvbmUgaW4gU1cuICovCisJCWlmICgoZGVjcnlwdF9yZXMgJiBSWF9SRVNfU1RBVFVTX0RFQ1JZUFRfVFlQRV9NU0spID09CisJCSAgICBSWF9SRVNfU1RBVFVTX0JBRF9LRVlfVFRBSykKKwkJCWJyZWFrOworCisJY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1dFUDoKKwkJaWYgKChkZWNyeXB0X3JlcyAmIFJYX1JFU19TVEFUVVNfREVDUllQVF9UWVBFX01TSykgPT0KKwkJICAgIFJYX1JFU19TVEFUVVNfQkFEX0lDVl9NSUMpIHsKKwkJCS8qIGJhZCBJQ1YsIHRoZSBwYWNrZXQgaXMgZGVzdHJveWVkIHNpbmNlIHRoZQorCQkJICogZGVjcnlwdGlvbiBpcyBpbnBsYWNlLCBkcm9wIGl0ICovCisJCQlEX1JYKCJQYWNrZXQgZGVzdHJveWVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCWNhc2UgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9DQ01QOgorCQlpZiAoKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19ERUNSWVBUX1RZUEVfTVNLKSA9PQorCQkgICAgUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LKSB7CisJCQlEX1JYKCJodyBkZWNyeXB0IHN1Y2Nlc3NmdWxseSEhIVxuIik7CisJCQlzdGF0cy0+ZmxhZyB8PSBSWF9GTEFHX0RFQ1JZUFRFRDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X2RlY3J5cHRlZF9mbGFnKTsKKworLyoqCisgKiBpbF90eHFfdXBkYXRlX3dyaXRlX3B0ciAtIFNlbmQgbmV3IHdyaXRlIGlkeCB0byBoYXJkd2FyZQorICovCit2b2lkCitpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKQoreworCXUzMiByZWcgPSAwOworCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7CisKKwlpZiAodHhxLT5uZWVkX3VwZGF0ZSA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBpZiB3ZSdyZSB0cnlpbmcgdG8gc2F2ZSBwb3dlciAqLworCWlmICh0ZXN0X2JpdChTX1BPV0VSX1BNSSwgJmlsLT5zdGF0dXMpKSB7CisJCS8qIHdha2UgdXAgbmljIGlmIGl0J3MgcG93ZXJlZCBkb3duIC4uLgorCQkgKiB1Q29kZSB3aWxsIHdha2UgdXAsIGFuZCBpbnRlcnJ1cHQgdXMgYWdhaW4sIHNvIG5leHQKKwkJICogdGltZSB3ZSdsbCBza2lwIHRoaXMgcGFydC4gKi8KKwkJcmVnID0gX2lsX3JkKGlsLCBDU1JfVUNPREVfRFJWX0dQMSk7CisKKwkJaWYgKHJlZyAmIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVApIHsKKwkJCURfSU5GTygiVHggcXVldWUgJWQgcmVxdWVzdGluZyB3YWtldXAsIiAiIEdQMSA9IDB4JXhcbiIsCisJCQkgICAgICAgdHhxX2lkLCByZWcpOworCQkJaWxfc2V0X2JpdChpbCwgQ1NSX0dQX0NOVFJMLAorCQkJCSAgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpbF93cihpbCwgSEJVU19UQVJHX1dSUFRSLCB0eHEtPnEud3JpdGVfcHRyIHwgKHR4cV9pZCA8PCA4KSk7CisKKwkJLyoKKwkJICogZWxzZSBub3QgaW4gcG93ZXItc2F2ZSBtb2RlLAorCQkgKiB1Q29kZSB3aWxsIG5ldmVyIHNsZWVwIHdoZW4gd2UncmUKKwkJICogdHJ5aW5nIHRvIHR4IChkdXJpbmcgUkZLSUxMLCB3ZSdyZSBub3QgdHJ5aW5nIHRvIHR4KS4KKwkJICovCisJfSBlbHNlCisJCV9pbF93cihpbCwgSEJVU19UQVJHX1dSUFRSLCB0eHEtPnEud3JpdGVfcHRyIHwgKHR4cV9pZCA8PCA4KSk7CisJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKTsKKworLyoqCisgKiBpbF90eF9xdWV1ZV91bm1hcCAtICBVbm1hcCBhbnkgcmVtYWluaW5nIERNQSBtYXBwaW5ncyBhbmQgZnJlZSBza2IncworICovCit2b2lkCitpbF90eF9xdWV1ZV91bm1hcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVt0eHFfaWRdOworCXN0cnVjdCBpbF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisKKwlpZiAocS0+bl9iZCA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAocS0+d3JpdGVfcHRyICE9IHEtPnJlYWRfcHRyKSB7CisJCWlsLT5jZmctPm9wcy0+bGliLT50eHFfZnJlZV90ZmQoaWwsIHR4cSk7CisJCXEtPnJlYWRfcHRyID0gaWxfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIsIHEtPm5fYmQpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfdHhfcXVldWVfdW5tYXApOworCisvKioKKyAqIGlsX3R4X3F1ZXVlX2ZyZWUgLSBEZWFsbG9jYXRlIERNQSBxdWV1ZS4KKyAqIEB0eHE6IFRyYW5zbWl0IHF1ZXVlIHRvIGRlYWxsb2NhdGUuCisgKgorICogRW1wdHkgcXVldWUgYnkgcmVtb3ZpbmcgYW5kIGRlc3Ryb3lpbmcgYWxsIEJEJ3MuCisgKiBGcmVlIGFsbCBidWZmZXJzLgorICogMC1maWxsLCBidXQgZG8gbm90IGZyZWUgInR4cSIgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQKK2lsX3R4X3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkKQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaWwtPnBjaV9kZXYtPmRldjsKKwlpbnQgaTsKKworCWlsX3R4X3F1ZXVlX3VubWFwKGlsLCB0eHFfaWQpOworCisJLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IFRGRF9UWF9DTURfU0xPVFM7IGkrKykKKwkJa2ZyZWUodHhxLT5jbWRbaV0pOworCisJLyogRGUtYWxsb2MgY2lyY3VsYXIgYnVmZmVyIG9mIFRGRHMgKi8KKwlpZiAodHhxLT5xLm5fYmQpCisJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgaWwtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqIHR4cS0+cS5uX2JkLAorCQkJCSAgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOworCisJLyogRGUtYWxsb2MgYXJyYXkgb2YgcGVyLVRGRCBkcml2ZXIgZGF0YSAqLworCWtmcmVlKHR4cS0+dHhiKTsKKwl0eHEtPnR4YiA9IE5VTEw7CisKKwkvKiBkZWFsbG9jYXRlIGFycmF5cyAqLworCWtmcmVlKHR4cS0+Y21kKTsKKwlrZnJlZSh0eHEtPm1ldGEpOworCXR4cS0+Y21kID0gTlVMTDsKKwl0eHEtPm1ldGEgPSBOVUxMOworCisJLyogMC1maWxsIHF1ZXVlIGRlc2NyaXB0b3Igc3RydWN0dXJlICovCisJbWVtc2V0KHR4cSwgMCwgc2l6ZW9mKCp0eHEpKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfdHhfcXVldWVfZnJlZSk7CisKKy8qKgorICogaWxfY21kX3F1ZXVlX3VubWFwIC0gVW5tYXAgYW55IHJlbWFpbmluZyBETUEgbWFwcGluZ3MgZnJvbSBjb21tYW5kIHF1ZXVlCisgKi8KK3ZvaWQKK2lsX2NtZF9xdWV1ZV91bm1hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVtpbC0+Y21kX3F1ZXVlXTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmdHhxLT5xOworCWludCBpOworCisJaWYgKHEtPm5fYmQgPT0gMCkKKwkJcmV0dXJuOworCisJd2hpbGUgKHEtPnJlYWRfcHRyICE9IHEtPndyaXRlX3B0cikgeworCQlpID0gaWxfZ2V0X2NtZF9pZHgocSwgcS0+cmVhZF9wdHIsIDApOworCisJCWlmICh0eHEtPm1ldGFbaV0uZmxhZ3MgJiBDTURfTUFQUEVEKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LAorCQkJCQkgZG1hX3VubWFwX2FkZHIoJnR4cS0+bWV0YVtpXSwgbWFwcGluZyksCisJCQkJCSBkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaV0sIGxlbiksCisJCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQkJdHhxLT5tZXRhW2ldLmZsYWdzID0gMDsKKwkJfQorCisJCXEtPnJlYWRfcHRyID0gaWxfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIsIHEtPm5fYmQpOworCX0KKworCWkgPSBxLT5uX3dpbjsKKwlpZiAodHhxLT5tZXRhW2ldLmZsYWdzICYgQ01EX01BUFBFRCkgeworCQlwY2lfdW5tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LAorCQkJCSBkbWFfdW5tYXBfYWRkcigmdHhxLT5tZXRhW2ldLCBtYXBwaW5nKSwKKwkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2ldLCBsZW4pLAorCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQl0eHEtPm1ldGFbaV0uZmxhZ3MgPSAwOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfY21kX3F1ZXVlX3VubWFwKTsKKworLyoqCisgKiBpbF9jbWRfcXVldWVfZnJlZSAtIERlYWxsb2NhdGUgRE1BIHF1ZXVlLgorICogQHR4cTogVHJhbnNtaXQgcXVldWUgdG8gZGVhbGxvY2F0ZS4KKyAqCisgKiBFbXB0eSBxdWV1ZSBieSByZW1vdmluZyBhbmQgZGVzdHJveWluZyBhbGwgQkQncy4KKyAqIEZyZWUgYWxsIGJ1ZmZlcnMuCisgKiAwLWZpbGwsIGJ1dCBkbyBub3QgZnJlZSAidHhxIiBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyAqLwordm9pZAoraWxfY21kX3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbaWwtPmNtZF9xdWV1ZV07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlsLT5wY2lfZGV2LT5kZXY7CisJaW50IGk7CisKKwlpbF9jbWRfcXVldWVfdW5tYXAoaWwpOworCisJLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8PSBURkRfQ01EX1NMT1RTOyBpKyspCisJCWtmcmVlKHR4cS0+Y21kW2ldKTsKKworCS8qIERlLWFsbG9jIGNpcmN1bGFyIGJ1ZmZlciBvZiBURkRzICovCisJaWYgKHR4cS0+cS5uX2JkKQorCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGlsLT5od19wYXJhbXMudGZkX3NpemUgKiB0eHEtPnEubl9iZCwKKwkJCQkgIHR4cS0+dGZkcywgdHhxLT5xLmRtYV9hZGRyKTsKKworCS8qIGRlYWxsb2NhdGUgYXJyYXlzICovCisJa2ZyZWUodHhxLT5jbWQpOworCWtmcmVlKHR4cS0+bWV0YSk7CisJdHhxLT5jbWQgPSBOVUxMOworCXR4cS0+bWV0YSA9IE5VTEw7CisKKwkvKiAwLWZpbGwgcXVldWUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQodHhxLCAwLCBzaXplb2YoKnR4cSkpOworfQorRVhQT1JUX1NZTUJPTChpbF9jbWRfcXVldWVfZnJlZSk7CisKKy8qKioqKioqKioqKioqKiogRE1BLVFVRVVFLUdFTkVSQUwtRlVOQ1RJT05TICAqKioqKgorICogRE1BIHNlcnZpY2VzCisgKgorICogVGhlb3J5IG9mIG9wZXJhdGlvbgorICoKKyAqIEEgVHggb3IgUnggcXVldWUgcmVzaWRlcyBpbiBob3N0IERSQU0sIGFuZCBpcyBjb21wcmlzZWQgb2YgYSBjaXJjdWxhciBidWZmZXIKKyAqIG9mIGJ1ZmZlciBkZXNjcmlwdG9ycywgZWFjaCBvZiB3aGljaCBwb2ludHMgdG8gb25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIGZvcgorICogdGhlIGRldmljZSB0byByZWFkIGZyb20gb3IgZmlsbC4gIERyaXZlciBhbmQgZGV2aWNlIGV4Y2hhbmdlIHN0YXR1cyBvZiBlYWNoCisgKiBxdWV1ZSB2aWEgInJlYWQiIGFuZCAid3JpdGUiIHBvaW50ZXJzLiAgRHJpdmVyIGtlZXBzIG1pbmltdW0gb2YgMiBlbXB0eQorICogZW50cmllcyBpbiBlYWNoIGNpcmN1bGFyIGJ1ZmZlciwgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmZ1c2luZyBlbXB0eSBhbmQgZnVsbAorICogcXVldWUgc3RhdGVzLgorICoKKyAqIFRoZSBkZXZpY2UgcmVhZHMgb3Igd3JpdGVzIHRoZSBkYXRhIGluIHRoZSBxdWV1ZXMgdmlhIHRoZSBkZXZpY2UncyBzZXZlcmFsCisgKiBETUEvRklGTyBjaGFubmVscy4gIEVhY2ggcXVldWUgaXMgbWFwcGVkIHRvIGEgc2luZ2xlIERNQSBjaGFubmVsLgorICoKKyAqIEZvciBUeCBxdWV1ZSwgdGhlcmUgYXJlIGxvdyBtYXJrIGFuZCBoaWdoIG1hcmsgbGltaXRzLiBJZiwgYWZ0ZXIgcXVldWluZworICogdGhlIHBhY2tldCBmb3IgVHgsIGZyZWUgc3BhY2UgYmVjb21lIDwgbG93IG1hcmssIFR4IHF1ZXVlIHN0b3BwZWQuIFdoZW4KKyAqIHJlY2xhaW1pbmcgcGFja2V0cyAob24gJ3R4IGRvbmUgSVJRKSwgaWYgZnJlZSBzcGFjZSBiZWNvbWUgPiBoaWdoIG1hcmssCisgKiBUeCBxdWV1ZSByZXN1bWVkLgorICoKKyAqIFNlZSBtb3JlIGRldGFpbGVkIGluZm8gaW4gNDk2NS5oLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CitpbF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaWxfcXVldWUgKnEpCit7CisJaW50IHMgPSBxLT5yZWFkX3B0ciAtIHEtPndyaXRlX3B0cjsKKworCWlmIChxLT5yZWFkX3B0ciA+IHEtPndyaXRlX3B0cikKKwkJcyAtPSBxLT5uX2JkOworCisJaWYgKHMgPD0gMCkKKwkJcyArPSBxLT5uX3dpbjsKKwkvKiBrZWVwIHNvbWUgcmVzZXJ2ZSB0byBub3QgY29uZnVzZSBlbXB0eSBhbmQgZnVsbCBzaXR1YXRpb25zICovCisJcyAtPSAyOworCWlmIChzIDwgMCkKKwkJcyA9IDA7CisJcmV0dXJuIHM7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3F1ZXVlX3NwYWNlKTsKKworCisvKioKKyAqIGlsX3F1ZXVlX2luaXQgLSBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgYW5kIHJlYWQvd3JpdGUgaWR4ZXMKKyAqLworc3RhdGljIGludAoraWxfcXVldWVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9xdWV1ZSAqcSwgaW50IGNvdW50LCBpbnQgc2xvdHNfbnVtLAorCSAgICAgIHUzMiBpZCkKK3sKKwlxLT5uX2JkID0gY291bnQ7CisJcS0+bl93aW4gPSBzbG90c19udW07CisJcS0+aWQgPSBpZDsKKworCS8qIGNvdW50IG11c3QgYmUgcG93ZXItb2YtdHdvIHNpemUsIG90aGVyd2lzZSBpbF9xdWV1ZV9pbmNfd3JhcAorCSAqIGFuZCBpbF9xdWV1ZV9kZWNfd3JhcCBhcmUgYnJva2VuLiAqLworCUJVR19PTighaXNfcG93ZXJfb2ZfMihjb3VudCkpOworCisJLyogc2xvdHNfbnVtIG11c3QgYmUgcG93ZXItb2YtdHdvIHNpemUsIG90aGVyd2lzZQorCSAqIGlsX2dldF9jbWRfaWR4IGlzIGJyb2tlbi4gKi8KKwlCVUdfT04oIWlzX3Bvd2VyX29mXzIoc2xvdHNfbnVtKSk7CisKKwlxLT5sb3dfbWFyayA9IHEtPm5fd2luIC8gNDsKKwlpZiAocS0+bG93X21hcmsgPCA0KQorCQlxLT5sb3dfbWFyayA9IDQ7CisKKwlxLT5oaWdoX21hcmsgPSBxLT5uX3dpbiAvIDg7CisJaWYgKHEtPmhpZ2hfbWFyayA8IDIpCisJCXEtPmhpZ2hfbWFyayA9IDI7CisKKwlxLT53cml0ZV9wdHIgPSBxLT5yZWFkX3B0ciA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbF90eF9xdWV1ZV9hbGxvYyAtIEFsbG9jIGRyaXZlciBkYXRhIGFuZCBURkQgQ0IgZm9yIG9uZSBUeC9jbWQgcXVldWUKKyAqLworc3RhdGljIGludAoraWxfdHhfcXVldWVfYWxsb2Moc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwgdTMyIGlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbC0+cGNpX2Rldi0+ZGV2OworCXNpemVfdCB0ZmRfc3ogPSBpbC0+aHdfcGFyYW1zLnRmZF9zaXplICogVEZEX1FVRVVFX1NJWkVfTUFYOworCisJLyogRHJpdmVyIGlsYXRlIGRhdGEsIG9ubHkgZm9yIFR4IChub3QgY29tbWFuZCkgcXVldWVzLAorCSAqIG5vdCBzaGFyZWQgd2l0aCBkZXZpY2UuICovCisJaWYgKGlkICE9IGlsLT5jbWRfcXVldWUpIHsKKwkJdHhxLT50eGIgPQorCQkgICAga3phbGxvYyhzaXplb2YodHhxLT50eGJbMF0pICogVEZEX1FVRVVFX1NJWkVfTUFYLAorCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXR4cS0+dHhiKSB7CisJCQlJTF9FUlIoImttYWxsb2MgZm9yIGF1eGlsaWFyeSBCRCAiCisJCQkgICAgICAgInN0cnVjdHVyZXMgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9IGVsc2UgeworCQl0eHEtPnR4YiA9IE5VTEw7CisJfQorCisJLyogQ2lyY3VsYXIgYnVmZmVyIG9mIHRyYW5zbWl0IGZyYW1lIGRlc2NyaXB0b3JzIChURkRzKSwKKwkgKiBzaGFyZWQgd2l0aCBkZXZpY2UgKi8KKwl0eHEtPnRmZHMgPQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCB0ZmRfc3osICZ0eHEtPnEuZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICghdHhxLT50ZmRzKSB7CisJCUlMX0VSUigicGNpX2FsbG9jX2NvbnNpc3RlbnQoJXpkKSBmYWlsZWRcbiIsIHRmZF9zeik7CisJCWdvdG8gZXJyb3I7CisJfQorCXR4cS0+cS5pZCA9IGlkOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWtmcmVlKHR4cS0+dHhiKTsKKwl0eHEtPnR4YiA9IE5VTEw7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoqCisgKiBpbF90eF9xdWV1ZV9pbml0IC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgb25lIHR4L2NtZCBxdWV1ZQorICovCitpbnQKK2lsX3R4X3F1ZXVlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwgaW50IHNsb3RzX251bSwKKwkJIHUzMiB0eHFfaWQpCit7CisJaW50IGksIGxlbjsKKwlpbnQgcmV0OworCWludCBhY3R1YWxfc2xvdHMgPSBzbG90c19udW07CisKKwkvKgorCSAqIEFsbG9jIGJ1ZmZlciBhcnJheSBmb3IgY29tbWFuZHMgKFR4IG9yIG90aGVyIHR5cGVzIG9mIGNvbW1hbmRzKS4KKwkgKiBGb3IgdGhlIGNvbW1hbmQgcXVldWUgKCM0LyM5KSwgYWxsb2NhdGUgY29tbWFuZCBzcGFjZSArIG9uZSBiaWcKKwkgKiBjb21tYW5kIGZvciBzY2FuLCBzaW5jZSBzY2FuIGNvbW1hbmQgaXMgdmVyeSBodWdlOyB0aGUgc3lzdGVtIHdpbGwKKwkgKiBub3QgaGF2ZSB0d28gc2NhbnMgYXQgdGhlIHNhbWUgdGltZSwgc28gb25seSBvbmUgaXMgbmVlZGVkLgorCSAqIEZvciBub3JtYWwgVHggcXVldWVzIChhbGwgb3RoZXIgcXVldWVzKSwgbm8gc3VwZXItc2l6ZSBjb21tYW5kCisJICogc3BhY2UgaXMgbmVlZGVkLgorCSAqLworCWlmICh0eHFfaWQgPT0gaWwtPmNtZF9xdWV1ZSkKKwkJYWN0dWFsX3Nsb3RzKys7CisKKwl0eHEtPm1ldGEgPQorCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWxfY21kX21ldGEpICogYWN0dWFsX3Nsb3RzLCBHRlBfS0VSTkVMKTsKKwl0eHEtPmNtZCA9CisJICAgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbF9kZXZpY2VfY21kICopICogYWN0dWFsX3Nsb3RzLCBHRlBfS0VSTkVMKTsKKworCWlmICghdHhxLT5tZXRhIHx8ICF0eHEtPmNtZCkKKwkJZ290byBvdXRfZnJlZV9hcnJheXM7CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGlsX2RldmljZV9jbWQpOworCWZvciAoaSA9IDA7IGkgPCBhY3R1YWxfc2xvdHM7IGkrKykgeworCQkvKiBvbmx5IGhhcHBlbnMgZm9yIGNtZCBxdWV1ZSAqLworCQlpZiAoaSA9PSBzbG90c19udW0pCisJCQlsZW4gPSBJTF9NQVhfQ01EX1NJWkU7CisKKwkJdHhxLT5jbWRbaV0gPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghdHhxLT5jbWRbaV0pCisJCQlnb3RvIGVycjsKKwl9CisKKwkvKiBBbGxvYyBkcml2ZXIgZGF0YSBhcnJheSBhbmQgVEZEIGNpcmN1bGFyIGJ1ZmZlciAqLworCXJldCA9IGlsX3R4X3F1ZXVlX2FsbG9jKGlsLCB0eHEsIHR4cV9pZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwl0eHEtPm5lZWRfdXBkYXRlID0gMDsKKworCS8qCisJICogRm9yIHRoZSBkZWZhdWx0IHF1ZXVlcyAwLTMsIHNldCB1cCB0aGUgc3dxX2lkCisJICogYWxyZWFkeSAtLSBhbGwgb3RoZXJzIG5lZWQgdG8gZ2V0IG9uZSBsYXRlcgorCSAqIChpZiB0aGV5IG5lZWQgb25lIGF0IGFsbCkuCisJICovCisJaWYgKHR4cV9pZCA8IDQpCisJCWlsX3NldF9zd3FfaWQodHhxLCB0eHFfaWQsIHR4cV9pZCk7CisKKwkvKiBURkRfUVVFVUVfU0laRV9NQVggbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlCisJICogaWxfcXVldWVfaW5jX3dyYXAgYW5kIGlsX3F1ZXVlX2RlY193cmFwIGFyZSBicm9rZW4uICovCisJQlVJTERfQlVHX09OKFRGRF9RVUVVRV9TSVpFX01BWCAmIChURkRfUVVFVUVfU0laRV9NQVggLSAxKSk7CisKKwkvKiBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgbWFya3MsIGFuZCBoZWFkL3RhaWwgaWR4ZXMgKi8KKwlpbF9xdWV1ZV9pbml0KGlsLCAmdHhxLT5xLCBURkRfUVVFVUVfU0laRV9NQVgsIHNsb3RzX251bSwgdHhxX2lkKTsKKworCS8qIFRlbGwgZGV2aWNlIHdoZXJlIHRvIGZpbmQgcXVldWUgKi8KKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2luaXQoaWwsIHR4cSk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsX3Nsb3RzOyBpKyspCisJCWtmcmVlKHR4cS0+Y21kW2ldKTsKK291dF9mcmVlX2FycmF5czoKKwlrZnJlZSh0eHEtPm1ldGEpOworCWtmcmVlKHR4cS0+Y21kKTsKKworCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTChpbF90eF9xdWV1ZV9pbml0KTsKKwordm9pZAoraWxfdHhfcXVldWVfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwgaW50IHNsb3RzX251bSwKKwkJICB1MzIgdHhxX2lkKQoreworCWludCBhY3R1YWxfc2xvdHMgPSBzbG90c19udW07CisKKwlpZiAodHhxX2lkID09IGlsLT5jbWRfcXVldWUpCisJCWFjdHVhbF9zbG90cysrOworCisJbWVtc2V0KHR4cS0+bWV0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9jbWRfbWV0YSkgKiBhY3R1YWxfc2xvdHMpOworCisJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7CisKKwkvKiBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgbWFya3MsIGFuZCBoZWFkL3RhaWwgaWR4ZXMgKi8KKwlpbF9xdWV1ZV9pbml0KGlsLCAmdHhxLT5xLCBURkRfUVVFVUVfU0laRV9NQVgsIHNsb3RzX251bSwgdHhxX2lkKTsKKworCS8qIFRlbGwgZGV2aWNlIHdoZXJlIHRvIGZpbmQgcXVldWUgKi8KKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2luaXQoaWwsIHR4cSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3R4X3F1ZXVlX3Jlc2V0KTsKKworLyoqKioqKioqKioqKioqKiBIT1NUIENPTU1BTkQgUVVFVUUgRlVOQ1RJT05TICAgKioqKiovCisKKy8qKgorICogaWxfZW5xdWV1ZV9oY21kIC0gZW5xdWV1ZSBhIHVDb2RlIGNvbW1hbmQKKyAqIEBpbDogZGV2aWNlIGlsYXRlIGRhdGEgcG9pbnQKKyAqIEBjbWQ6IGEgcG9pbnQgdG8gdGhlIHVjb2RlIGNvbW1hbmQgc3RydWN0dXJlCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgPCAwIHZhbHVlcyB0byBpbmRpY2F0ZSB0aGUgb3BlcmF0aW9uIGlzCisgKiBmYWlsZWQuIE9uIHN1Y2Nlc3MsIGl0IHR1cm5zIHRoZSBpZHggKD4gMCkgb2YgY29tbWFuZCBpbiB0aGUKKyAqIGNvbW1hbmQgcXVldWUuCisgKi8KK2ludAoraWxfZW5xdWV1ZV9oY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2hvc3RfY21kICpjbWQpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVtpbC0+Y21kX3F1ZXVlXTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmdHhxLT5xOworCXN0cnVjdCBpbF9kZXZpY2VfY21kICpvdXRfY21kOworCXN0cnVjdCBpbF9jbWRfbWV0YSAqb3V0X21ldGE7CisJZG1hX2FkZHJfdCBwaHlzX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGVuOworCXUzMiBpZHg7CisJdTE2IGZpeF9zaXplOworCisJY21kLT5sZW4gPSBpbC0+Y2ZnLT5vcHMtPnV0aWxzLT5nZXRfaGNtZF9zaXplKGNtZC0+aWQsIGNtZC0+bGVuKTsKKwlmaXhfc2l6ZSA9ICh1MTYpIChjbWQtPmxlbiArIHNpemVvZihvdXRfY21kLT5oZHIpKTsKKworCS8qIElmIGFueSBvZiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmVzIGVuZCB1cCBiZWluZyBsYXJnZXIgdGhhbgorCSAqIHRoZSBURkRfTUFYX1BBWUxPQURfU0laRSwgYW5kIGl0IHNlbnQgYXMgYSAnc21hbGwnIGNvbW1hbmQgdGhlbgorCSAqIHdlIHdpbGwgbmVlZCB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgVEZEIGVudHJpZXMKKwkgKiBBbHNvLCBjaGVjayB0byBzZWUgaWYgY29tbWFuZCBidWZmZXIgc2hvdWxkIG5vdCBleGNlZWQgdGhlIHNpemUKKwkgKiBvZiBkZXZpY2VfY21kIGFuZCBtYXhfY21kX3NpemUuICovCisJQlVHX09OKChmaXhfc2l6ZSA+IFRGRF9NQVhfUEFZTE9BRF9TSVpFKSAmJgorCSAgICAgICAhKGNtZC0+ZmxhZ3MgJiBDTURfU0laRV9IVUdFKSk7CisJQlVHX09OKGZpeF9zaXplID4gSUxfTUFYX0NNRF9TSVpFKTsKKworCWlmIChpbF9pc19yZmtpbGwoaWwpIHx8IGlsX2lzX2N0a2lsbChpbCkpIHsKKwkJSUxfV0FSTigiTm90IHNlbmRpbmcgY29tbWFuZCAtICVzIEtJTExcbiIsCisJCQlpbF9pc19yZmtpbGwoaWwpID8gIlJGIiA6ICJDVCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworCisJaWYgKGlsX3F1ZXVlX3NwYWNlKHEpIDwgKChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSA/IDIgOiAxKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+aGNtZF9sb2NrLCBmbGFncyk7CisKKwkJSUxfRVJSKCJSZXN0YXJ0aW5nIGFkYXB0ZXIgZHVlIHRvIGNvbW1hbmQgcXVldWUgZnVsbFxuIik7CisJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yZXN0YXJ0KTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJaWR4ID0gaWxfZ2V0X2NtZF9pZHgocSwgcS0+d3JpdGVfcHRyLCBjbWQtPmZsYWdzICYgQ01EX1NJWkVfSFVHRSk7CisJb3V0X2NtZCA9IHR4cS0+Y21kW2lkeF07CisJb3V0X21ldGEgPSAmdHhxLT5tZXRhW2lkeF07CisKKwlpZiAoV0FSTl9PTihvdXRfbWV0YS0+ZmxhZ3MgJiBDTURfTUFQUEVEKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+aGNtZF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCW1lbXNldChvdXRfbWV0YSwgMCwgc2l6ZW9mKCpvdXRfbWV0YSkpOwkvKiByZS1pbml0aWFsaXplIHRvIE5VTEwgKi8KKwlvdXRfbWV0YS0+ZmxhZ3MgPSBjbWQtPmZsYWdzIHwgQ01EX01BUFBFRDsKKwlpZiAoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikKKwkJb3V0X21ldGEtPnNvdXJjZSA9IGNtZDsKKwlpZiAoY21kLT5mbGFncyAmIENNRF9BU1lOQykKKwkJb3V0X21ldGEtPmNhbGxiYWNrID0gY21kLT5jYWxsYmFjazsKKworCW91dF9jbWQtPmhkci5jbWQgPSBjbWQtPmlkOworCW1lbWNweSgmb3V0X2NtZC0+Y21kLnBheWxvYWQsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOworCisJLyogQXQgdGhpcyBwb2ludCwgdGhlIG91dF9jbWQgbm93IGhhcyBhbGwgb2YgdGhlIGluY29taW5nIGNtZAorCSAqIGluZm9ybWF0aW9uICovCisKKwlvdXRfY21kLT5oZHIuZmxhZ3MgPSAwOworCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9CisJICAgIGNwdV90b19sZTE2KFFVRVVFX1RPX1NFUShpbC0+Y21kX3F1ZXVlKSB8IElEWF9UT19TRVEocS0+d3JpdGVfcHRyKSk7CisJaWYgKGNtZC0+ZmxhZ3MgJiBDTURfU0laRV9IVUdFKQorCQlvdXRfY21kLT5oZHIuc2VxdWVuY2UgfD0gU0VRX0hVR0VfRlJBTUU7CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpbF9kZXZpY2VfY21kKTsKKwlpZiAoaWR4ID09IFRGRF9DTURfU0xPVFMpCisJCWxlbiA9IElMX01BWF9DTURfU0laRTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXN3aXRjaCAob3V0X2NtZC0+aGRyLmNtZCkgeworCWNhc2UgQ19UWF9MSU5LX1FVQUxJVFlfQ01EOgorCWNhc2UgQ19TRU5TSVRJVklUWToKKwkJRF9IQ19EVU1QKCJTZW5kaW5nIGNvbW1hbmQgJXMgKCMleCksIHNlcTogMHglMDRYLCAiCisJCQkgICIlZCBieXRlcyBhdCAlZFslZF06JWRcbiIsCisJCQkgIGlsX2dldF9jbWRfc3RyaW5nKG91dF9jbWQtPmhkci5jbWQpLCBvdXRfY21kLT5oZHIuY21kLAorCQkJICBsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpLCBmaXhfc2l6ZSwKKwkJCSAgcS0+d3JpdGVfcHRyLCBpZHgsIGlsLT5jbWRfcXVldWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEX0hDKCJTZW5kaW5nIGNvbW1hbmQgJXMgKCMleCksIHNlcTogMHglMDRYLCAiCisJCSAgICAgIiVkIGJ5dGVzIGF0ICVkWyVkXTolZFxuIiwKKwkJICAgICBpbF9nZXRfY21kX3N0cmluZyhvdXRfY21kLT5oZHIuY21kKSwgb3V0X2NtZC0+aGRyLmNtZCwKKwkJICAgICBsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpLCBmaXhfc2l6ZSwgcS0+d3JpdGVfcHRyLAorCQkgICAgIGlkeCwgaWwtPmNtZF9xdWV1ZSk7CisJfQorI2VuZGlmCisJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7CisKKwlpZiAoaWwtPmNmZy0+b3BzLT5saWItPnR4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKQorCQkvKiBTZXQgdXAgZW50cnkgaW4gcXVldWUncyBieXRlIGNvdW50IGNpcmN1bGFyIGJ1ZmZlciAqLworCQlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX3VwZGF0ZV9ieXRlX2NudF90YmwoaWwsIHR4cSwgMCk7CisKKwlwaHlzX2FkZHIgPQorCSAgICBwY2lfbWFwX3NpbmdsZShpbC0+cGNpX2RldiwgJm91dF9jbWQtPmhkciwgZml4X3NpemUsCisJCQkgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWRtYV91bm1hcF9hZGRyX3NldChvdXRfbWV0YSwgbWFwcGluZywgcGh5c19hZGRyKTsKKwlkbWFfdW5tYXBfbGVuX3NldChvdXRfbWV0YSwgbGVuLCBmaXhfc2l6ZSk7CisKKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2F0dGFjaF9idWZfdG9fdGZkKGlsLCB0eHEsIHBoeXNfYWRkciwgZml4X3NpemUsCisJCQkJCQkgMSwgVTMyX1BBRChjbWQtPmxlbikpOworCisJLyogSW5jcmVtZW50IGFuZCB1cGRhdGUgcXVldWUncyB3cml0ZSBpZHggKi8KKwlxLT53cml0ZV9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOworCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCB0eHEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworCXJldHVybiBpZHg7Cit9CisKKy8qKgorICogaWxfaGNtZF9xdWV1ZV9yZWNsYWltIC0gUmVjbGFpbSBUWCBjb21tYW5kIHF1ZXVlIGVudHJpZXMgYWxyZWFkeSBUeCdkCisgKgorICogV2hlbiBGVyBhZHZhbmNlcyAnUicgaWR4LCBhbGwgZW50cmllcyBiZXR3ZWVuIG9sZCBhbmQgbmV3ICdSJyBpZHgKKyAqIG5lZWQgdG8gYmUgcmVjbGFpbWVkLiBBcyByZXN1bHQsIHNvbWUgZnJlZSBzcGFjZSBmb3Jtcy4gIElmIHRoZXJlIGlzCisgKiBlbm91Z2ggZnJlZSBzcGFjZSAoPiBsb3cgbWFyayksIHdha2UgdGhlIHN0YWNrIHRoYXQgZmVlZHMgdXMuCisgKi8KK3N0YXRpYyB2b2lkCitpbF9oY21kX3F1ZXVlX3JlY2xhaW0oc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4LCBpbnQgY21kX2lkeCkKK3sKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSA9ICZpbC0+dHhxW3R4cV9pZF07CisJc3RydWN0IGlsX3F1ZXVlICpxID0gJnR4cS0+cTsKKwlpbnQgbmZyZWVkID0gMDsKKworCWlmIChpZHggPj0gcS0+bl9iZCB8fCBpbF9xdWV1ZV91c2VkKHEsIGlkeCkgPT0gMCkgeworCQlJTF9FUlIoIlJlYWQgaWR4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGlkeCAlZCwgIgorCQkgICAgICAgImlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWQuXG4iLCB0eHFfaWQsIGlkeCwgcS0+bl9iZCwKKwkJICAgICAgIHEtPndyaXRlX3B0ciwgcS0+cmVhZF9wdHIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpZHggPSBpbF9xdWV1ZV9pbmNfd3JhcChpZHgsIHEtPm5fYmQpOyBxLT5yZWFkX3B0ciAhPSBpZHg7CisJICAgICBxLT5yZWFkX3B0ciA9IGlsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgeworCisJCWlmIChuZnJlZWQrKyA+IDApIHsKKwkJCUlMX0VSUigiSENNRCBza2lwcGVkOiBpZHggKCVkKSAlZCAlZFxuIiwgaWR4LAorCQkJICAgICAgIHEtPndyaXRlX3B0ciwgcS0+cmVhZF9wdHIpOworCQkJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworCQl9CisKKwl9Cit9CisKKy8qKgorICogaWxfdHhfY21kX2NvbXBsZXRlIC0gUHVsbCB1bnVzZWQgYnVmZmVycyBvZmYgdGhlIHF1ZXVlIGFuZCByZWNsYWltIHRoZW0KKyAqIEByeGI6IFJ4IGJ1ZmZlciB0byByZWNsYWltCisgKgorICogSWYgYW4gUnggYnVmZmVyIGhhcyBhbiBhc3luYyBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggaXQgdGhlIGNhbGxiYWNrCisgKiB3aWxsIGJlIGV4ZWN1dGVkLiAgVGhlIGF0dGFjaGVkIHNrYiAoaWYgcHJlc2VudCkgd2lsbCBvbmx5IGJlIGZyZWVkCisgKiBpZiB0aGUgY2FsbGJhY2sgcmV0dXJucyAxCisgKi8KK3ZvaWQKK2lsX3R4X2NtZF9jb21wbGV0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXUxNiBzZXF1ZW5jZSA9IGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKTsKKwlpbnQgdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcXVlbmNlKTsKKwlpbnQgaWR4ID0gU0VRX1RPX0lEWChzZXF1ZW5jZSk7CisJaW50IGNtZF9pZHg7CisJYm9vbCBodWdlID0gISEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfSFVHRV9GUkFNRSk7CisJc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZDsKKwlzdHJ1Y3QgaWxfY21kX21ldGEgKm1ldGE7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVtpbC0+Y21kX3F1ZXVlXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSWYgYSBUeCBjb21tYW5kIGlzIGJlaW5nIGhhbmRsZWQgYW5kIGl0IGlzbid0IGluIHRoZSBhY3R1YWwKKwkgKiBjb21tYW5kIHF1ZXVlIHRoZW4gdGhlcmUgYSBjb21tYW5kIHJvdXRpbmcgYnVnIGhhcyBiZWVuIGludHJvZHVjZWQKKwkgKiBpbiB0aGUgcXVldWUgbWFuYWdlbWVudCBjb2RlLiAqLworCWlmIChXQVJOCisJICAgICh0eHFfaWQgIT0gaWwtPmNtZF9xdWV1ZSwKKwkgICAgICJ3cm9uZyBjb21tYW5kIHF1ZXVlICVkIChzaG91bGQgYmUgJWQpLCBzZXF1ZW5jZSAweCVYIHJlYWRwPSVkIHdyaXRlcD0lZFxuIiwKKwkgICAgIHR4cV9pZCwgaWwtPmNtZF9xdWV1ZSwgc2VxdWVuY2UsIGlsLT50eHFbaWwtPmNtZF9xdWV1ZV0ucS5yZWFkX3B0ciwKKwkgICAgIGlsLT50eHFbaWwtPmNtZF9xdWV1ZV0ucS53cml0ZV9wdHIpKSB7CisJCWlsX3ByaW50X2hleF9lcnJvcihpbCwgcGt0LCAzMik7CisJCXJldHVybjsKKwl9CisKKwljbWRfaWR4ID0gaWxfZ2V0X2NtZF9pZHgoJnR4cS0+cSwgaWR4LCBodWdlKTsKKwljbWQgPSB0eHEtPmNtZFtjbWRfaWR4XTsKKwltZXRhID0gJnR4cS0+bWV0YVtjbWRfaWR4XTsKKworCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisKKwlwY2lfdW5tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LCBkbWFfdW5tYXBfYWRkcihtZXRhLCBtYXBwaW5nKSwKKwkJCSBkbWFfdW5tYXBfbGVuKG1ldGEsIGxlbiksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkvKiBJbnB1dCBlcnJvciBjaGVja2luZyBpcyBkb25lIHdoZW4gY29tbWFuZHMgYXJlIGFkZGVkIHRvIHF1ZXVlLiAqLworCWlmIChtZXRhLT5mbGFncyAmIENNRF9XQU5UX1NLQikgeworCQltZXRhLT5zb3VyY2UtPnJlcGx5X3BhZ2UgPSAodW5zaWduZWQgbG9uZylyeGJfYWRkcihyeGIpOworCQlyeGItPnBhZ2UgPSBOVUxMOworCX0gZWxzZSBpZiAobWV0YS0+Y2FsbGJhY2spCisJCW1ldGEtPmNhbGxiYWNrKGlsLCBjbWQsIHBrdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworCisJaWxfaGNtZF9xdWV1ZV9yZWNsYWltKGlsLCB0eHFfaWQsIGlkeCwgY21kX2lkeCk7CisKKwlpZiAoIShtZXRhLT5mbGFncyAmIENNRF9BU1lOQykpIHsKKwkJY2xlYXJfYml0KFNfSENNRF9BQ1RJVkUsICZpbC0+c3RhdHVzKTsKKwkJRF9JTkZPKCJDbGVhcmluZyBIQ01EX0FDVElWRSBmb3IgY29tbWFuZCAlc1xuIiwKKwkJICAgICAgIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aGRyLmNtZCkpOworCQl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKwl9CisKKwkvKiBNYXJrIGFzIHVubWFwcGVkICovCisJbWV0YS0+ZmxhZ3MgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpbF90eF9jbWRfY29tcGxldGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIml3bC1sZWdhY3k6IGNvbW1vbiBmdW5jdGlvbnMgZm9yIDM5NDUgYW5kIDQ5NjUiKTsKK01PRFVMRV9WRVJTSU9OKElXTFdJRklfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQgIiAiIERSVl9BVVRIT1IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogc2V0IGJ0X2NvZXhfYWN0aXZlIHRvIHRydWUsIHVDb2RlIHdpbGwgZG8ga2lsbC9kZWZlcgorICogZXZlcnkgdGltZSB0aGUgcHJpb3JpdHkgbGluZSBpcyBhc3NlcnRlZCAoQlQgaXMgc2VuZGluZyBzaWduYWxzIG9uIHRoZQorICogcHJpb3JpdHkgbGluZSBpbiB0aGUgUENJeCkuCisgKiBzZXQgYnRfY29leF9hY3RpdmUgdG8gZmFsc2UsIHVDb2RlIHdpbGwgaWdub3JlIHRoZSBCVCBhY3Rpdml0eSBhbmQKKyAqIHBlcmZvcm0gdGhlIG5vcm1hbCBvcGVyYXRpb24KKyAqCisgKiBVc2VyIG1pZ2h0IGV4cGVyaWVuY2UgdHJhbnNtaXQgaXNzdWUgb24gc29tZSBwbGF0Zm9ybSBkdWUgdG8gV2lGaS9CVAorICogY28tZXhpc3QgcHJvYmxlbS4gVGhlIHBvc3NpYmxlIGJlaGF2aW9ycyBhcmU6CisgKiAgIEFibGUgdG8gc2NhbiBhbmQgZmluZGluZyBhbGwgdGhlIGF2YWlsYWJsZSBBUAorICogICBOb3QgYWJsZSB0byBhc3NvY2lhdGUgd2l0aCBhbnkgQVAKKyAqIE9uIHRob3NlIHBsYXRmb3JtcywgV2lGaSBjb21tdW5pY2F0aW9uIGNhbiBiZSByZXN0b3JlZCBieSBzZXQKKyAqICJidF9jb2V4X2FjdGl2ZSIgbW9kdWxlIHBhcmFtZXRlciB0byAiZmFsc2UiCisgKgorICogZGVmYXVsdDogYnRfY29leF9hY3RpdmUgPSB0cnVlIChCVF9DT0VYX0VOQUJMRSkKKyAqLworc3RhdGljIGJvb2wgYnRfY29leF9hY3RpdmUgPSB0cnVlOworbW9kdWxlX3BhcmFtKGJ0X2NvZXhfYWN0aXZlLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoYnRfY29leF9hY3RpdmUsICJlbmFibGUgd2lmaS9ibHVldG9vdGggY28tZXhpc3QiKTsKKwordTMyIGlsX2RlYnVnX2xldmVsOworRVhQT1JUX1NZTUJPTChpbF9kZWJ1Z19sZXZlbCk7CisKK2NvbnN0IHU4IGlsX2JjYXN0X2FkZHJbRVRIX0FMRU5dID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CitFWFBPUlRfU1lNQk9MKGlsX2JjYXN0X2FkZHIpOworCisvKiBUaGlzIGZ1bmN0aW9uIGJvdGggYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBodyBhbmQgaWwuICovCitzdHJ1Y3QgaWVlZTgwMjExX2h3ICoKK2lsX2FsbG9jX2FsbChzdHJ1Y3QgaWxfY2ZnICpjZmcpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsOworCS8qIG1hYzgwMjExIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoaXMgZGV2aWNlIGluc3RhbmNlLCBpbmNsdWRpbmcKKwkgKiAgIHNwYWNlIGZvciB0aGlzIGRyaXZlcidzIGlsYXRlIHN0cnVjdHVyZSAqLworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCisJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBpbF9wcml2KSwKKwkJCQljZmctPm9wcy0+aWVlZTgwMjExX29wcyk7CisJaWYgKGh3ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIiwgY2ZnLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWwgPSBody0+cHJpdjsKKwlpbC0+aHcgPSBodzsKKworb3V0OgorCXJldHVybiBodzsKK30KK0VYUE9SVF9TWU1CT0woaWxfYWxsb2NfYWxsKTsKKworI2RlZmluZSBNQVhfQklUX1JBVEVfNDBfTUhaIDE1MAkvKiBNYnBzICovCisjZGVmaW5lIE1BWF9CSVRfUkFURV8yMF9NSFogNzIJLyogTWJwcyAqLworc3RhdGljIHZvaWQKK2lsX2luaXRfaHRfaHdfY2FwYWIoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsLAorCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9pbmZvLAorCQkgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQoreworCXUxNiBtYXhfYml0X3JhdGUgPSAwOworCXU4IHJ4X2NoYWluc19udW0gPSBpbC0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW07CisJdTggdHhfY2hhaW5zX251bSA9IGlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKKworCWh0X2luZm8tPmNhcCA9IDA7CisJbWVtc2V0KCZodF9pbmZvLT5tY3MsIDAsIHNpemVvZihodF9pbmZvLT5tY3MpKTsKKworCWh0X2luZm8tPmh0X3N1cHBvcnRlZCA9IHRydWU7CisKKwlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfMjA7CisJbWF4X2JpdF9yYXRlID0gTUFYX0JJVF9SQVRFXzIwX01IWjsKKwlpZiAoaWwtPmh3X3BhcmFtcy5odDQwX2NoYW5uZWwgJiBCSVQoYmFuZCkpIHsKKwkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOworCQlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7CisJCWh0X2luZm8tPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKKwkJbWF4X2JpdF9yYXRlID0gTUFYX0JJVF9SQVRFXzQwX01IWjsKKwl9CisKKwlpZiAoaWwtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKKwkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVOworCisJaHRfaW5mby0+YW1wZHVfZmFjdG9yID0gQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl9ERUY7CisJaHRfaW5mby0+YW1wZHVfZGVuc2l0eSA9IENGR19IVF9NUERVX0RFTlNJVFlfREVGOworCisJaHRfaW5mby0+bWNzLnJ4X21hc2tbMF0gPSAweEZGOworCWlmIChyeF9jaGFpbnNfbnVtID49IDIpCisJCWh0X2luZm8tPm1jcy5yeF9tYXNrWzFdID0gMHhGRjsKKwlpZiAocnhfY2hhaW5zX251bSA+PSAzKQorCQlodF9pbmZvLT5tY3MucnhfbWFza1syXSA9IDB4RkY7CisKKwkvKiBIaWdoZXN0IHN1cHBvcnRlZCBSeCBkYXRhIHJhdGUgKi8KKwltYXhfYml0X3JhdGUgKj0gcnhfY2hhaW5zX251bTsKKwlXQVJOX09OKG1heF9iaXRfcmF0ZSAmIH5JRUVFODAyMTFfSFRfTUNTX1JYX0hJR0hFU1RfTUFTSyk7CisJaHRfaW5mby0+bWNzLnJ4X2hpZ2hlc3QgPSBjcHVfdG9fbGUxNihtYXhfYml0X3JhdGUpOworCisJLyogVHggTUNTIGNhcGFiaWxpdGllcyAqLworCWh0X2luZm8tPm1jcy50eF9wYXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUQ7CisJaWYgKHR4X2NoYWluc19udW0gIT0gcnhfY2hhaW5zX251bSkgeworCQlodF9pbmZvLT5tY3MudHhfcGFyYW1zIHw9IElFRUU4MDIxMV9IVF9NQ1NfVFhfUlhfRElGRjsKKwkJaHRfaW5mby0+bWNzLnR4X3BhcmFtcyB8PQorCQkgICAgKCh0eF9jaGFpbnNfbnVtIC0KKwkJICAgICAgMSkgPDwgSUVFRTgwMjExX0hUX01DU19UWF9NQVhfU1RSRUFNU19TSElGVCk7CisJfQorfQorCisvKioKKyAqIGlsX2luaXRfZ2VvcyAtIEluaXRpYWxpemUgbWFjODAyMTEncyBnZW8vY2hhbm5lbCBpbmZvIGJhc2VkIGZyb20gZWVwcm9tCisgKi8KK2ludAoraWxfaW5pdF9nZW9zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWxzOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqZ2VvX2NoOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXM7CisJaW50IGkgPSAwOworCXM4IG1heF90eF9wb3dlciA9IDA7CisKKwlpZiAoaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fYml0cmF0ZXMgfHwKKwkgICAgaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fYml0cmF0ZXMpIHsKKwkJRF9JTkZPKCJHZW9ncmFwaHkgbW9kZXMgYWxyZWFkeSBpbml0aWFsaXplZC5cbiIpOworCQlzZXRfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2hhbm5lbHMgPQorCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwpICogaWwtPmNoYW5uZWxfY291bnQsCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWxzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJhdGVzID0KKwkgICAga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiBSQVRFX0NPVU5UX0xFR0FDWSksCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXJhdGVzKSB7CisJCWtmcmVlKGNoYW5uZWxzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogNS4yR0h6IGNoYW5uZWxzIHN0YXJ0IGFmdGVyIHRoZSAyLjRHSHogY2hhbm5lbHMgKi8KKwlzYmFuZCA9ICZpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl07CisJc2JhbmQtPmNoYW5uZWxzID0gJmNoYW5uZWxzW0FSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfMSldOworCS8qIGp1c3QgT0ZETSAqLworCXNiYW5kLT5iaXRyYXRlcyA9ICZyYXRlc1tJTF9GSVJTVF9PRkRNX1JBVEVdOworCXNiYW5kLT5uX2JpdHJhdGVzID0gUkFURV9DT1VOVF9MRUdBQ1kgLSBJTF9GSVJTVF9PRkRNX1JBVEU7CisKKwlpZiAoaWwtPmNmZy0+c2t1ICYgSUxfU0tVX04pCisJCWlsX2luaXRfaHRfaHdfY2FwYWIoaWwsICZzYmFuZC0+aHRfY2FwLCBJRUVFODAyMTFfQkFORF81R0haKTsKKworCXNiYW5kID0gJmlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKKwlzYmFuZC0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKwkvKiBPRkRNICYgQ0NLICovCisJc2JhbmQtPmJpdHJhdGVzID0gcmF0ZXM7CisJc2JhbmQtPm5fYml0cmF0ZXMgPSBSQVRFX0NPVU5UX0xFR0FDWTsKKworCWlmIChpbC0+Y2ZnLT5za3UgJiBJTF9TS1VfTikKKwkJaWxfaW5pdF9odF9od19jYXBhYihpbCwgJnNiYW5kLT5odF9jYXAsIElFRUU4MDIxMV9CQU5EXzJHSFopOworCisJaWwtPmllZWVfY2hhbm5lbHMgPSBjaGFubmVsczsKKwlpbC0+aWVlZV9yYXRlcyA9IHJhdGVzOworCisJZm9yIChpID0gMDsgaSA8IGlsLT5jaGFubmVsX2NvdW50OyBpKyspIHsKKwkJY2ggPSAmaWwtPmNoYW5uZWxfaW5mb1tpXTsKKworCQlpZiAoIWlsX2lzX2NoYW5uZWxfdmFsaWQoY2gpKQorCQkJY29udGludWU7CisKKwkJc2JhbmQgPSAmaWwtPmJhbmRzW2NoLT5iYW5kXTsKKworCQlnZW9fY2ggPSAmc2JhbmQtPmNoYW5uZWxzW3NiYW5kLT5uX2NoYW5uZWxzKytdOworCisJCWdlb19jaC0+Y2VudGVyX2ZyZXEgPQorCQkgICAgaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoLT5jaGFubmVsLCBjaC0+YmFuZCk7CisJCWdlb19jaC0+bWF4X3Bvd2VyID0gY2gtPm1heF9wb3dlcl9hdmc7CisJCWdlb19jaC0+bWF4X2FudGVubmFfZ2FpbiA9IDB4ZmY7CisJCWdlb19jaC0+aHdfdmFsdWUgPSBjaC0+Y2hhbm5lbDsKKworCQlpZiAoaWxfaXNfY2hhbm5lbF92YWxpZChjaCkpIHsKKwkJCWlmICghKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpKQorCQkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fTk9fSUJTUzsKKworCQkJaWYgKCEoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfQUNUSVZFKSkKKwkJCQlnZW9fY2gtPmZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTjsKKworCQkJaWYgKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1JBREFSKQorCQkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fUkFEQVI7CisKKwkJCWdlb19jaC0+ZmxhZ3MgfD0gY2gtPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWw7CisKKwkJCWlmIChjaC0+bWF4X3Bvd2VyX2F2ZyA+IG1heF90eF9wb3dlcikKKwkJCQltYXhfdHhfcG93ZXIgPSBjaC0+bWF4X3Bvd2VyX2F2ZzsKKwkJfSBlbHNlIHsKKwkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fRElTQUJMRUQ7CisJCX0KKworCQlEX0lORk8oIkNoYW5uZWwgJWQgRnJlcT0lZFslc0dIel0gJXMgZmxhZz0weCVYXG4iLCBjaC0+Y2hhbm5lbCwKKwkJICAgICAgIGdlb19jaC0+Y2VudGVyX2ZyZXEsCisJCSAgICAgICBpbF9pc19jaGFubmVsX2FfYmFuZChjaCkgPyAiNS4yIiA6ICIyLjQiLAorCQkgICAgICAgZ2VvX2NoLT4KKwkJICAgICAgIGZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQgPyAicmVzdHJpY3RlZCIgOiAidmFsaWQiLAorCQkgICAgICAgZ2VvX2NoLT5mbGFncyk7CisJfQorCisJaWwtPnR4X3Bvd2VyX2RldmljZV9sbXQgPSBtYXhfdHhfcG93ZXI7CisJaWwtPnR4X3Bvd2VyX3VzZXJfbG10ID0gbWF4X3R4X3Bvd2VyOworCWlsLT50eF9wb3dlcl9uZXh0ID0gbWF4X3R4X3Bvd2VyOworCisJaWYgKGlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzID09IDAgJiYKKwkgICAgKGlsLT5jZmctPnNrdSAmIElMX1NLVV9BKSkgeworCQlJTF9JTkZPKCJJbmNvcnJlY3RseSBkZXRlY3RlZCBCRyBjYXJkIGFzIEFCRy4gIgorCQkJIlBsZWFzZSBzZW5kIHlvdXIgUENJIElEIDB4JTA0WDoweCUwNFggdG8gbWFpbnRhaW5lci5cbiIsCisJCQlpbC0+cGNpX2Rldi0+ZGV2aWNlLCBpbC0+cGNpX2Rldi0+c3Vic3lzdGVtX2RldmljZSk7CisJCWlsLT5jZmctPnNrdSAmPSB+SUxfU0tVX0E7CisJfQorCisJSUxfSU5GTygiVHVuYWJsZSBjaGFubmVsczogJWQgODAyLjExYmcsICVkIDgwMi4xMWEgY2hhbm5lbHNcbiIsCisJCWlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2NoYW5uZWxzLAorCQlpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscyk7CisKKwlzZXRfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9pbml0X2dlb3MpOworCisvKgorICogaWxfZnJlZV9nZW9zIC0gdW5kbyBhbGxvY2F0aW9ucyBpbiBpbF9pbml0X2dlb3MKKyAqLwordm9pZAoraWxfZnJlZV9nZW9zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlrZnJlZShpbC0+aWVlZV9jaGFubmVscyk7CisJa2ZyZWUoaWwtPmllZWVfcmF0ZXMpOworCWNsZWFyX2JpdChTX0dFT19DT05GSUdVUkVELCAmaWwtPnN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2ZyZWVfZ2Vvcyk7CisKK3N0YXRpYyBib29sCitpbF9pc19jaGFubmVsX2V4dGVuc2lvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCXUxNiBjaGFubmVsLCB1OCBleHRlbnNpb25fY2hhbl9vZmZzZXQpCit7CisJY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKworCWNoX2luZm8gPSBpbF9nZXRfY2hhbm5lbF9pbmZvKGlsLCBiYW5kLCBjaGFubmVsKTsKKwlpZiAoIWlsX2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChleHRlbnNpb25fY2hhbl9vZmZzZXQgPT0gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkUpCisJCXJldHVybiAhKGNoX2luZm8tPgorCQkJIGh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgJiBJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyk7CisJZWxzZSBpZiAoZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID09IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XKQorCQlyZXR1cm4gIShjaF9pbmZvLT4KKwkJCSBodDQwX2V4dGVuc2lvbl9jaGFubmVsICYgSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTKTsKKworCXJldHVybiBmYWxzZTsKK30KKworYm9vbAoraWxfaXNfaHQ0MF90eF9hbGxvd2VkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCkKK3sKKwlpZiAoIWN0eC0+aHQuZW5hYmxlZCB8fCAhY3R4LT5odC5pc180MG1oeikKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBXZSBkbyBub3QgY2hlY2sgZm9yIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwCisJICogdGhlIGJpdCB3aWxsIG5vdCBzZXQgaWYgaXQgaXMgcHVyZSA0ME1IeiBjYXNlCisJICovCisJaWYgKGh0X2NhcCAmJiAhaHRfY2FwLT5odF9zdXBwb3J0ZWQpCisJCXJldHVybiBmYWxzZTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJaWYgKGlsLT5kaXNhYmxlX2h0NDApCisJCXJldHVybiBmYWxzZTsKKyNlbmRpZgorCisJcmV0dXJuIGlsX2lzX2NoYW5uZWxfZXh0ZW5zaW9uKGlsLCBpbC0+YmFuZCwKKwkJCQkgICAgICAgbGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpLAorCQkJCSAgICAgICBjdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2lzX2h0NDBfdHhfYWxsb3dlZCk7CisKK3N0YXRpYyB1MTYKK2lsX2FkanVzdF9iZWFjb25faW50ZXJ2YWwodTE2IGJlYWNvbl92YWwsIHUxNiBtYXhfYmVhY29uX3ZhbCkKK3sKKwl1MTYgbmV3X3ZhbDsKKwl1MTYgYmVhY29uX2ZhY3RvcjsKKworCS8qCisJICogSWYgbWFjODAyMTEgaGFzbid0IGdpdmVuIHVzIGEgYmVhY29uIGludGVydmFsLCBwcm9ncmFtCisJICogdGhlIGRlZmF1bHQgaW50byB0aGUgZGV2aWNlLgorCSAqLworCWlmICghYmVhY29uX3ZhbCkKKwkJcmV0dXJuIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMOworCisJLyoKKwkgKiBJZiB0aGUgYmVhY29uIGludGVydmFsIHdlIG9idGFpbmVkIGZyb20gdGhlIHBlZXIKKwkgKiBpcyB0b28gbGFyZ2UsIHdlJ2xsIGhhdmUgdG8gd2FrZSB1cCBtb3JlIG9mdGVuCisJICogKGFuZCBpbiBJQlNTIGNhc2UsIHdlJ2xsIGJlYWNvbiB0b28gbXVjaCkKKwkgKgorCSAqIEZvciBleGFtcGxlLCBpZiBtYXhfYmVhY29uX3ZhbCBpcyA0MDk2LCBhbmQgdGhlCisJICogcmVxdWVzdGVkIGJlYWNvbiBpbnRlcnZhbCBpcyA3MDAwLCB3ZSdsbCBoYXZlIHRvCisJICogdXNlIDM1MDAgdG8gYmUgYWJsZSB0byB3YWtlIHVwIG9uIHRoZSBiZWFjb25zLgorCSAqCisJICogVGhpcyBjb3VsZCBiYWRseSBpbmZsdWVuY2UgYmVhY29uIGRldGVjdGlvbiBzdGF0cy4KKwkgKi8KKworCWJlYWNvbl9mYWN0b3IgPSAoYmVhY29uX3ZhbCArIG1heF9iZWFjb25fdmFsKSAvIG1heF9iZWFjb25fdmFsOworCW5ld192YWwgPSBiZWFjb25fdmFsIC8gYmVhY29uX2ZhY3RvcjsKKworCWlmICghbmV3X3ZhbCkKKwkJbmV3X3ZhbCA9IG1heF9iZWFjb25fdmFsOworCisJcmV0dXJuIG5ld192YWw7Cit9CisKK2ludAoraWxfc2VuZF9yeG9uX3RpbWluZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwl1NjQgdHNmOworCXMzMiBpbnRlcnZhbF90bSwgcmVtOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7CisJdTE2IGJlYWNvbl9pbnQ7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCisJY29uZiA9ICZpbC0+aHctPmNvbmY7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJbWVtc2V0KCZjdHgtPnRpbWluZywgMCwgc2l6ZW9mKHN0cnVjdCBpbF9yeG9uX3RpbWVfY21kKSk7CisKKwljdHgtPnRpbWluZy50aW1lc3RhbXAgPSBjcHVfdG9fbGU2NChpbC0+dGltZXN0YW1wKTsKKwljdHgtPnRpbWluZy5saXN0ZW5faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihjb25mLT5saXN0ZW5faW50ZXJ2YWwpOworCisJYmVhY29uX2ludCA9IHZpZiA/IHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCA6IDA7CisKKwkvKgorCSAqIFRPRE86IEZvciBJQlNTIHdlIG5lZWQgdG8gZ2V0IGF0aW1fd2luIGZyb20gbWFjODAyMTEsCisJICogICAgICAgZm9yIG5vdyBqdXN0IGFsd2F5cyB1c2UgMAorCSAqLworCWN0eC0+dGltaW5nLmF0aW1fd2luID0gMDsKKworCWJlYWNvbl9pbnQgPQorCSAgICBpbF9hZGp1c3RfYmVhY29uX2ludGVydmFsKGJlYWNvbl9pbnQsCisJCQkJICAgICAgaWwtPmh3X3BhcmFtcy5tYXhfYmVhY29uX2l0cnZsICoKKwkJCQkgICAgICBUSU1FX1VOSVQpOworCWN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGJlYWNvbl9pbnQpOworCisJdHNmID0gaWwtPnRpbWVzdGFtcDsJLyogdHNmIGlzIG1vZGlmZWQgYnkgZG9fZGl2OiBjb3B5IGl0ICovCisJaW50ZXJ2YWxfdG0gPSBiZWFjb25faW50ICogVElNRV9VTklUOworCXJlbSA9IGRvX2Rpdih0c2YsIGludGVydmFsX3RtKTsKKwljdHgtPnRpbWluZy5iZWFjb25faW5pdF92YWwgPSBjcHVfdG9fbGUzMihpbnRlcnZhbF90bSAtIHJlbSk7CisKKwljdHgtPnRpbWluZy5kdGltX3BlcmlvZCA9IHZpZiA/ICh2aWYtPmJzc19jb25mLmR0aW1fcGVyaW9kID8gOiAxKSA6IDE7CisKKwlEX0FTU09DKCJiZWFjb24gaW50ZXJ2YWwgJWQgYmVhY29uIHRpbWVyICVkIGJlYWNvbiB0aW0gJWRcbiIsCisJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCksCisJCWxlMzJfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbml0X3ZhbCksCisJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmF0aW1fd2luKSk7CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBjdHgtPnJ4b25fdGltaW5nX2NtZCwgc2l6ZW9mKGN0eC0+dGltaW5nKSwKKwkJCSAgICAgICAmY3R4LT50aW1pbmcpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX3J4b25fdGltaW5nKTsKKwordm9pZAoraWxfc2V0X3J4b25faHdjcnlwdG8oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCSAgICAgaW50IGh3X2RlY3J5cHQpCit7CisJc3RydWN0IGlsX3J4b25fY21kICpyeG9uID0gJmN0eC0+c3RhZ2luZzsKKworCWlmIChod19kZWNyeXB0KQorCQlyeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0RJU19ERUNSWVBUX01TSzsKKwllbHNlCisJCXJ4b24tPmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9ESVNfREVDUllQVF9NU0s7CisKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X3J4b25faHdjcnlwdG8pOworCisvKiB2YWxpZGF0ZSBSWE9OIHN0cnVjdHVyZSBpcyB2YWxpZCAqLworaW50CitpbF9jaGVja19yeG9uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jbWQgKnJ4b24gPSAmY3R4LT5zdGFnaW5nOworCWJvb2wgZXJyb3IgPSBmYWxzZTsKKworCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgeworCQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19UR0pfTkFSUk9XX0JBTkRfTVNLKSB7CisJCQlJTF9XQVJOKCJjaGVjayAyLjRHOiB3cm9uZyBuYXJyb3dcbiIpOworCQkJZXJyb3IgPSB0cnVlOworCQl9CisJCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX1JBREFSX0RFVEVDVF9NU0spIHsKKwkJCUlMX1dBUk4oImNoZWNrIDIuNEc6IHdyb25nIHJhZGFyXG4iKTsKKwkJCWVycm9yID0gdHJ1ZTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghKHJ4b24tPmZsYWdzICYgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0spKSB7CisJCQlJTF9XQVJOKCJjaGVjayA1LjJHOiBub3Qgc2hvcnQgc2xvdCFcbiIpOworCQkJZXJyb3IgPSB0cnVlOworCQl9CisJCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX0NDS19NU0spIHsKKwkJCUlMX1dBUk4oImNoZWNrIDUuMkc6IENDSyFcbiIpOworCQkJZXJyb3IgPSB0cnVlOworCQl9CisJfQorCWlmICgocnhvbi0+bm9kZV9hZGRyWzBdIHwgcnhvbi0+YnNzaWRfYWRkclswXSkgJiAweDEpIHsKKwkJSUxfV0FSTigibWFjL2Jzc2lkIG1jYXN0IVxuIik7CisJCWVycm9yID0gdHJ1ZTsKKwl9CisKKwkvKiBtYWtlIHN1cmUgYmFzaWMgcmF0ZXMgNk1icHMgYW5kIDFNYnBzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAoKHJ4b24tPm9mZG1fYmFzaWNfcmF0ZXMgJiBSQVRFXzZNX01BU0spID09IDAgJiYKKwkgICAgKHJ4b24tPmNja19iYXNpY19yYXRlcyAmIFJBVEVfMU1fTUFTSykgPT0gMCkgeworCQlJTF9XQVJOKCJuZWl0aGVyIDEgbm9yIDYgYXJlIGJhc2ljXG4iKTsKKwkJZXJyb3IgPSB0cnVlOworCX0KKworCWlmIChsZTE2X3RvX2NwdShyeG9uLT5hc3NvY19pZCkgPiAyMDA3KSB7CisJCUlMX1dBUk4oImFpZCA+IDIwMDdcbiIpOworCQllcnJvciA9IHRydWU7CisJfQorCisJaWYgKChyeG9uLT5mbGFncyAmIChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0spKSA9PQorCSAgICAoUlhPTl9GTEdfQ0NLX01TSyB8IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLKSkgeworCQlJTF9XQVJOKCJDQ0sgYW5kIHNob3J0IHNsb3RcbiIpOworCQllcnJvciA9IHRydWU7CisJfQorCisJaWYgKChyeG9uLT5mbGFncyAmIChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLKSkgPT0KKwkgICAgKFJYT05fRkxHX0NDS19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0spKSB7CisJCUlMX1dBUk4oIkNDSyBhbmQgYXV0byBkZXRlY3QiKTsKKwkJZXJyb3IgPSB0cnVlOworCX0KKworCWlmICgocnhvbi0+CisJICAgICBmbGFncyAmIChSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0sgfCBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0spKSA9PQorCSAgICBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0spIHsKKwkJSUxfV0FSTigiVEdnIGJ1dCBubyBhdXRvLWRldGVjdFxuIik7CisJCWVycm9yID0gdHJ1ZTsKKwl9CisKKwlpZiAoZXJyb3IpCisJCUlMX1dBUk4oIlR1bmluZyB0byBjaGFubmVsICVkXG4iLCBsZTE2X3RvX2NwdShyeG9uLT5jaGFubmVsKSk7CisKKwlpZiAoZXJyb3IpIHsKKwkJSUxfRVJSKCJJbnZhbGlkIFJYT05cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2NoZWNrX3J4b25fY21kKTsKKworLyoqCisgKiBpbF9mdWxsX3J4b25fcmVxdWlyZWQgLSBjaGVjayBpZiBmdWxsIFJYT04gKHZzIFJYT05fQVNTT0MpIGNtZCBpcyBuZWVkZWQKKyAqIEBpbDogc3RhZ2luZ19yeG9uIGlzIGNvbXBhcmVkIHRvIGFjdGl2ZV9yeG9uCisgKgorICogSWYgdGhlIFJYT04gc3RydWN0dXJlIGlzIGNoYW5naW5nIGVub3VnaCB0byByZXF1aXJlIGEgbmV3IHR1bmUsCisgKiBvciBpcyBjbGVhcmluZyB0aGUgUlhPTl9GSUxURVJfQVNTT0NfTVNLLCB0aGVuIHJldHVybiAxIHRvIGluZGljYXRlIHRoYXQKKyAqIGEgbmV3IHR1bmUgKGZ1bGwgUlhPTiBjb21tYW5kLCByYXRoZXIgdGhhbiBSWE9OX0FTU09DIGNtZCkgaXMgcmVxdWlyZWQuCisgKi8KK2ludAoraWxfZnVsbF9yeG9uX3JlcXVpcmVkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWNvbnN0IHN0cnVjdCBpbF9yeG9uX2NtZCAqc3RhZ2luZyA9ICZjdHgtPnN0YWdpbmc7CisJY29uc3Qgc3RydWN0IGlsX3J4b25fY21kICphY3RpdmUgPSAmY3R4LT5hY3RpdmU7CisKKyNkZWZpbmUgQ0hLKGNvbmQpCQkJCQkJCVwKKwlpZiAoKGNvbmQpKSB7CQkJCQkJCVwKKwkJRF9JTkZPKCJuZWVkIGZ1bGwgUlhPTiAtICIgI2NvbmQgIlxuIik7CVwKKwkJcmV0dXJuIDE7CQkJCQkJXAorCX0KKworI2RlZmluZSBDSEtfTkVRKGMxLCBjMikJCQkJCQlcCisJaWYgKChjMSkgIT0gKGMyKSkgewkJCQkJXAorCQlEX0lORk8oIm5lZWQgZnVsbCBSWE9OIC0gIglcCisJCQkgICAgICAgI2MxICIgIT0gIiAjYzIgIiAtICVkICE9ICVkXG4iLAlcCisJCQkgICAgICAgKGMxKSwgKGMyKSk7CQkJXAorCQlyZXR1cm4gMTsJCQkJCVwKKwl9CisKKwkvKiBUaGVzZSBpdGVtcyBhcmUgb25seSBzZXR0YWJsZSBmcm9tIHRoZSBmdWxsIFJYT04gY29tbWFuZCAqLworCUNISyghaWxfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSk7CisJQ0hLKGNvbXBhcmVfZXRoZXJfYWRkcihzdGFnaW5nLT5ic3NpZF9hZGRyLCBhY3RpdmUtPmJzc2lkX2FkZHIpKTsKKwlDSEsoY29tcGFyZV9ldGhlcl9hZGRyKHN0YWdpbmctPm5vZGVfYWRkciwgYWN0aXZlLT5ub2RlX2FkZHIpKTsKKwlDSEsoY29tcGFyZV9ldGhlcl9hZGRyCisJICAgIChzdGFnaW5nLT53bGFwX2Jzc2lkX2FkZHIsIGFjdGl2ZS0+d2xhcF9ic3NpZF9hZGRyKSk7CisJQ0hLX05FUShzdGFnaW5nLT5kZXZfdHlwZSwgYWN0aXZlLT5kZXZfdHlwZSk7CisJQ0hLX05FUShzdGFnaW5nLT5jaGFubmVsLCBhY3RpdmUtPmNoYW5uZWwpOworCUNIS19ORVEoc3RhZ2luZy0+YWlyX3Byb3BhZ2F0aW9uLCBhY3RpdmUtPmFpcl9wcm9wYWdhdGlvbik7CisJQ0hLX05FUShzdGFnaW5nLT5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMsCisJCWFjdGl2ZS0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzKTsKKwlDSEtfTkVRKHN0YWdpbmctPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMsCisJCWFjdGl2ZS0+b2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyk7CisJQ0hLX05FUShzdGFnaW5nLT5hc3NvY19pZCwgYWN0aXZlLT5hc3NvY19pZCk7CisKKwkvKiBmbGFncywgZmlsdGVyX2ZsYWdzLCBvZmRtX2Jhc2ljX3JhdGVzLCBhbmQgY2NrX2Jhc2ljX3JhdGVzIGNhbgorCSAqIGJlIHVwZGF0ZWQgd2l0aCB0aGUgUlhPTl9BU1NPQyBjb21tYW5kIC0tIGhvd2V2ZXIgb25seSBzb21lCisJICogZmxhZyB0cmFuc2l0aW9ucyBhcmUgYWxsb3dlZCB1c2luZyBSWE9OX0FTU09DICovCisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgbm90IHN3aXRjaGluZyBiYW5kcyAqLworCUNIS19ORVEoc3RhZ2luZy0+ZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0ssCisJCWFjdGl2ZS0+ZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spOworCisJLyogQ2hlY2sgaWYgd2UgYXJlIHN3aXRjaGluZyBhc3NvY2lhdGlvbiB0b2dnbGUgKi8KKwlDSEtfTkVRKHN0YWdpbmctPmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSywKKwkJYWN0aXZlLT5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spOworCisjdW5kZWYgQ0hLCisjdW5kZWYgQ0hLX05FUQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2Z1bGxfcnhvbl9yZXF1aXJlZCk7CisKK3U4CitpbF9nZXRfbG93ZXN0X3BsY3Aoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJLyoKKwkgKiBBc3NpZ24gdGhlIGxvd2VzdCByYXRlIC0tIHNob3VsZCByZWFsbHkgZ2V0IHRoaXMgZnJvbQorCSAqIHRoZSBiZWFjb24gc2tiIGZyb20gbWFjODAyMTEuCisJICovCisJaWYgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykKKwkJcmV0dXJuIFJBVEVfMU1fUExDUDsKKwllbHNlCisJCXJldHVybiBSQVRFXzZNX1BMQ1A7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2dldF9sb3dlc3RfcGxjcCk7CisKK3N0YXRpYyB2b2lkCitfaWxfc2V0X3J4b25faHQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaHRfY29uZmlnICpodF9jb25mLAorCQlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGlsX3J4b25fY21kICpyeG9uID0gJmN0eC0+c3RhZ2luZzsKKworCWlmICghY3R4LT5odC5lbmFibGVkKSB7CisJCXJ4b24tPmZsYWdzICY9CisJCSAgICB+KFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NU0sgfAorCQkgICAgICBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSyB8IFJYT05fRkxHX0hUNDBfUFJPVF9NU0sKKwkJICAgICAgfCBSWE9OX0ZMR19IVF9QUk9UX01TSyk7CisJCXJldHVybjsKKwl9CisKKwlyeG9uLT5mbGFncyB8PQorCSAgICBjcHVfdG9fbGUzMihjdHgtPmh0LnByb3RlY3Rpb24gPDwgUlhPTl9GTEdfSFRfT1BFUkFUSU5HX01PREVfUE9TKTsKKworCS8qIFNldCB1cCBjaGFubmVsIGJhbmR3aWR0aDoKKwkgKiAyMCBNSHogb25seSwgMjAvNDAgbWl4ZWQgb3IgcHVyZSA0MCBpZiBodDQwIG9rICovCisJLyogY2xlYXIgdGhlIEhUIGNoYW5uZWwgbW9kZSBiZWZvcmUgc2V0IHRoZSBtb2RlICovCisJcnhvbi0+ZmxhZ3MgJj0KKwkgICAgfihSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLIHwgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0spOworCWlmIChpbF9pc19odDQwX3R4X2FsbG93ZWQoaWwsIGN0eCwgTlVMTCkpIHsKKwkJLyogcHVyZSBodDQwICovCisJCWlmIChjdHgtPmh0LnByb3RlY3Rpb24gPT0gSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl8yME1IWikgeworCQkJcnhvbi0+ZmxhZ3MgfD0gUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BVUkVfNDA7CisJCQkvKiBOb3RlOiBjb250cm9sIGNoYW5uZWwgaXMgb3Bwb3NpdGUgb2YgZXh0ZW5zaW9uIGNoYW5uZWwgKi8KKwkJCXN3aXRjaCAoY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQpIHsKKwkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU6CisJCQkJcnhvbi0+ZmxhZ3MgJj0KKwkJCQkgICAgflJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLOworCQkJCWJyZWFrOworCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzoKKwkJCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE5vdGU6IGNvbnRyb2wgY2hhbm5lbCBpcyBvcHBvc2l0ZSBvZiBleHRlbnNpb24gY2hhbm5lbCAqLworCQkJc3dpdGNoIChjdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCkgeworCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKKwkJCQlyeG9uLT5mbGFncyAmPQorCQkJCSAgICB+KFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLKTsKKwkJCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTUlYRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgorCQkJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLOworCQkJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORToKKwkJCWRlZmF1bHQ6CisJCQkJLyogY2hhbm5lbCBsb2NhdGlvbiBvbmx5IHZhbGlkIGlmIGluIE1peGVkIG1vZGUgKi8KKwkJCQlJTF9FUlIoImludmFsaWQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0XG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9MRUdBQ1k7CisJfQorCisJaWYgKGlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCisJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisKKwlEX0FTU09DKCJyeG9uIGZsYWdzIDB4JVggb3BlcmF0aW9uIG1vZGUgOjB4JVggIgorCQkiZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IDB4JXhcbiIsIGxlMzJfdG9fY3B1KHJ4b24tPmZsYWdzKSwKKwkJY3R4LT5odC5wcm90ZWN0aW9uLCBjdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCk7Cit9CisKK3ZvaWQKK2lsX3NldF9yeG9uX2h0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2h0X2NvbmZpZyAqaHRfY29uZikKK3sKKwlfaWxfc2V0X3J4b25faHQoaWwsIGh0X2NvbmYsICZpbC0+Y3R4KTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X3J4b25faHQpOworCisvKiBSZXR1cm4gdmFsaWQsIHVudXNlZCwgY2hhbm5lbCBmb3IgYSBwYXNzaXZlIHNjYW4gdG8gcmVzZXQgdGhlIFJGICovCit1OAoraWxfZ2V0X3NpbmdsZV9jaGFubmVsX251bWJlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCWludCBpOworCXU4IGNoYW5uZWwgPSAwOworCXU4IG1pbiwgbWF4OworCisJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgeworCQltaW4gPSAxNDsKKwkJbWF4ID0gaWwtPmNoYW5uZWxfY291bnQ7CisJfSBlbHNlIHsKKwkJbWluID0gMDsKKwkJbWF4ID0gMTQ7CisJfQorCisJZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspIHsKKwkJY2hhbm5lbCA9IGlsLT5jaGFubmVsX2luZm9baV0uY2hhbm5lbDsKKwkJaWYgKGNoYW5uZWwgPT0gbGUxNl90b19jcHUoaWwtPmN0eC5zdGFnaW5nLmNoYW5uZWwpKQorCQkJY29udGludWU7CisKKwkJY2hfaW5mbyA9IGlsX2dldF9jaGFubmVsX2luZm8oaWwsIGJhbmQsIGNoYW5uZWwpOworCQlpZiAoaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBjaGFubmVsOworfQorRVhQT1JUX1NZTUJPTChpbF9nZXRfc2luZ2xlX2NoYW5uZWxfbnVtYmVyKTsKKworLyoqCisgKiBpbF9zZXRfcnhvbl9jaGFubmVsIC0gU2V0IHRoZSBiYW5kIGFuZCBjaGFubmVsIHZhbHVlcyBpbiBzdGFnaW5nIFJYT04KKyAqIEBjaDogcmVxdWVzdGVkIGNoYW5uZWwgYXMgYSBwb2ludGVyIHRvIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorCisgKiBOT1RFOiAgRG9lcyBub3QgY29tbWl0IHRvIHRoZSBoYXJkd2FyZTsgaXQgc2V0cyBhcHByb3ByaWF0ZSBiaXQgZmllbGRzCisgKiBpbiB0aGUgc3RhZ2luZyBSWE9OIGZsYWcgc3RydWN0dXJlIGJhc2VkIG9uIHRoZSBjaC0+YmFuZAorICovCitpbnQKK2lsX3NldF9yeG9uX2NoYW5uZWwoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoLAorCQkgICAgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IGNoLT5iYW5kOworCXUxNiBjaGFubmVsID0gY2gtPmh3X3ZhbHVlOworCisJaWYgKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSA9PSBjaGFubmVsICYmIGlsLT5iYW5kID09IGJhbmQpCisJCXJldHVybiAwOworCisJY3R4LT5zdGFnaW5nLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaGFubmVsKTsKKwlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX0JBTkRfMjRHX01TSzsKKwllbHNlCisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19CQU5EXzI0R19NU0s7CisKKwlpbC0+YmFuZCA9IGJhbmQ7CisKKwlEX0lORk8oIlN0YWdpbmcgY2hhbm5lbCBzZXQgdG8gJWQgWyVkXVxuIiwgY2hhbm5lbCwgYmFuZCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X3J4b25fY2hhbm5lbCk7CisKK3ZvaWQKK2lsX3NldF9mbGFnc19mb3JfYmFuZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJY3R4LT5zdGFnaW5nLmZsYWdzICY9CisJCSAgICB+KFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSyB8CisJCSAgICAgIFJYT05fRkxHX0NDS19NU0spOworCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJfSBlbHNlIHsKKwkJLyogQ29waWVkIGZyb20gaWxfcG9zdF9hc3NvY2lhdGUoKSAqLworCQlpZiAodmlmICYmIHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisKKwkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX0JBTkRfMjRHX01TSzsKKwkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX0FVVE9fREVURUNUX01TSzsKKwkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19DQ0tfTVNLOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X2ZsYWdzX2Zvcl9iYW5kKTsKKworLyoKKyAqIGluaXRpYWxpemUgcnhvbiBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcyBmcm9tIGVlcHJvbQorICovCit2b2lkCitpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisKKwltZW1zZXQoJmN0eC0+c3RhZ2luZywgMCwgc2l6ZW9mKGN0eC0+c3RhZ2luZykpOworCisJaWYgKCFjdHgtPnZpZikgeworCQljdHgtPnN0YWdpbmcuZGV2X3R5cGUgPSBjdHgtPnVudXNlZF9kZXZ0eXBlOworCX0gZWxzZQorCQlzd2l0Y2ggKGN0eC0+dmlmLT50eXBlKSB7CisKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gY3R4LT5zdGF0aW9uX2RldnR5cGU7CisJCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzID0gUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0s7CisJCQlicmVhazsKKworCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gY3R4LT5pYnNzX2RldnR5cGU7CisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisJCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzID0KKwkJCSAgICBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyB8CisJCQkgICAgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0s7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJSUxfRVJSKCJVbnN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZSAlZFxuIiwKKwkJCSAgICAgICBjdHgtPnZpZi0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCisjaWYgMAorCS8qIFRPRE86ICBGaWd1cmUgb3V0IHdoZW4gc2hvcnRfcHJlYW1ibGUgd291bGQgYmUgc2V0IGFuZCBjYWNoZSBmcm9tCisJICogdGhhdCAqLworCWlmICghaHdfdG9fbG9jYWwoaWwtPmh3KS0+c2hvcnRfcHJlYW1ibGUpCisJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCWVsc2UKKwkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKyNlbmRpZgorCisJY2hfaW5mbyA9CisJICAgIGlsX2dldF9jaGFubmVsX2luZm8oaWwsIGlsLT5iYW5kLCBsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSk7CisKKwlpZiAoIWNoX2luZm8pCisJCWNoX2luZm8gPSAmaWwtPmNoYW5uZWxfaW5mb1swXTsKKworCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hfaW5mby0+Y2hhbm5lbCk7CisJaWwtPmJhbmQgPSBjaF9pbmZvLT5iYW5kOworCisJaWxfc2V0X2ZsYWdzX2Zvcl9iYW5kKGlsLCBjdHgsIGlsLT5iYW5kLCBjdHgtPnZpZik7CisKKwljdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9CisJICAgIChJTF9PRkRNX1JBVEVTX01BU0sgPj4gSUxfRklSU1RfT0ZETV9SQVRFKSAmIDB4RkY7CisJY3R4LT5zdGFnaW5nLmNja19iYXNpY19yYXRlcyA9CisJICAgIChJTF9DQ0tfUkFURVNfTUFTSyA+PiBJTF9GSVJTVF9DQ0tfUkFURSkgJiAweEY7CisKKwkvKiBjbGVhciBib3RoIE1JWCBhbmQgUFVSRTQwIG1vZGUgZmxhZyAqLworCWN0eC0+c3RhZ2luZy5mbGFncyAmPQorCSAgICB+KFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRCB8IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QVVJFXzQwKTsKKwlpZiAoY3R4LT52aWYpCisJCW1lbWNweShjdHgtPnN0YWdpbmcubm9kZV9hZGRyLCBjdHgtPnZpZi0+YWRkciwgRVRIX0FMRU4pOworCisJY3R4LT5zdGFnaW5nLm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyA9IDB4ZmY7CisJY3R4LT5zdGFnaW5nLm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPSAweGZmOworfQorRVhQT1JUX1NZTUJPTChpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKTsKKwordm9pZAoraWxfc2V0X3JhdGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmh3ID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGU7CisJaW50IGk7CisKKwlodyA9IGlsX2dldF9od19tb2RlKGlsLCBpbC0+YmFuZCk7CisJaWYgKCFodykgeworCQlJTF9FUlIoIkZhaWxlZCB0byBzZXQgcmF0ZTogdW5hYmxlIHRvIGdldCBodyBtb2RlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlsLT5hY3RpdmVfcmF0ZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPm5fYml0cmF0ZXM7IGkrKykgeworCQlyYXRlID0gJihody0+Yml0cmF0ZXNbaV0pOworCQlpZiAocmF0ZS0+aHdfdmFsdWUgPCBSQVRFX0NPVU5UX0xFR0FDWSkKKwkJCWlsLT5hY3RpdmVfcmF0ZSB8PSAoMSA8PCByYXRlLT5od192YWx1ZSk7CisJfQorCisJRF9SQVRFKCJTZXQgYWN0aXZlX3JhdGUgPSAlMHhcbiIsIGlsLT5hY3RpdmVfcmF0ZSk7CisKKwlpbC0+Y3R4LnN0YWdpbmcuY2NrX2Jhc2ljX3JhdGVzID0KKwkgICAgKElMX0NDS19CQVNJQ19SQVRFU19NQVNLID4+IElMX0ZJUlNUX0NDS19SQVRFKSAmIDB4RjsKKworCWlsLT5jdHguc3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KKwkgICAgKElMX09GRE1fQkFTSUNfUkFURVNfTUFTSyA+PiBJTF9GSVJTVF9PRkRNX1JBVEUpICYgMHhGRjsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X3JhdGUpOworCit2b2lkCitpbF9jaHN3aXRjaF9kb25lKHN0cnVjdCBpbF9wcml2ICppbCwgYm9vbCBpc19zdWNjZXNzKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBpc19zdWNjZXNzKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfY2hzd2l0Y2hfZG9uZSk7CisKK3ZvaWQKK2lsX2hkbF9jc2Eoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfY3NhX25vdGlmaWNhdGlvbiAqY3NhID0gJihwa3QtPnUuY3NhX25vdGlmKTsKKworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXN0cnVjdCBpbF9yeG9uX2NtZCAqcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOworCisJaWYgKCF0ZXN0X2JpdChTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJaWYgKCFsZTMyX3RvX2NwdShjc2EtPnN0YXR1cykgJiYgY3NhLT5jaGFubmVsID09IGlsLT5zd2l0Y2hfY2hhbm5lbCkgeworCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOworCQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKKwkJRF8xMUgoIkNTQSBub3RpZjogY2hhbm5lbCAlZFxuIiwgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7CisJCWlsX2Noc3dpdGNoX2RvbmUoaWwsIHRydWUpOworCX0gZWxzZSB7CisJCUlMX0VSUigiQ1NBIG5vdGlmIChmYWlsKSA6IGNoYW5uZWwgJWRcbiIsCisJCSAgICAgICBsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKKwkJaWxfY2hzd2l0Y2hfZG9uZShpbCwgZmFsc2UpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfaGRsX2NzYSk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK3ZvaWQKK2lsX3ByaW50X3J4X2NvbmZpZ19jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGlsX3J4b25fY21kICpyeG9uID0gJmN0eC0+c3RhZ2luZzsKKworCURfUkFESU8oIlJYIENPTkZJRzpcbiIpOworCWlsX3ByaW50X2hleF9kdW1wKGlsLCBJTF9ETF9SQURJTywgKHU4ICopIHJ4b24sIHNpemVvZigqcnhvbikpOworCURfUkFESU8oInUxNiBjaGFubmVsOiAweCV4XG4iLCBsZTE2X3RvX2NwdShyeG9uLT5jaGFubmVsKSk7CisJRF9SQURJTygidTMyIGZsYWdzOiAweCUwOFhcbiIsIGxlMzJfdG9fY3B1KHJ4b24tPmZsYWdzKSk7CisJRF9SQURJTygidTMyIGZpbHRlcl9mbGFnczogMHglMDh4XG4iLCBsZTMyX3RvX2NwdShyeG9uLT5maWx0ZXJfZmxhZ3MpKTsKKwlEX1JBRElPKCJ1OCBkZXZfdHlwZTogMHgleFxuIiwgcnhvbi0+ZGV2X3R5cGUpOworCURfUkFESU8oInU4IG9mZG1fYmFzaWNfcmF0ZXM6IDB4JTAyeFxuIiwgcnhvbi0+b2ZkbV9iYXNpY19yYXRlcyk7CisJRF9SQURJTygidTggY2NrX2Jhc2ljX3JhdGVzOiAweCUwMnhcbiIsIHJ4b24tPmNja19iYXNpY19yYXRlcyk7CisJRF9SQURJTygidThbNl0gbm9kZV9hZGRyOiAlcE1cbiIsIHJ4b24tPm5vZGVfYWRkcik7CisJRF9SQURJTygidThbNl0gYnNzaWRfYWRkcjogJXBNXG4iLCByeG9uLT5ic3NpZF9hZGRyKTsKKwlEX1JBRElPKCJ1MTYgYXNzb2NfaWQ6IDB4JXhcbiIsIGxlMTZfdG9fY3B1KHJ4b24tPmFzc29jX2lkKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3ByaW50X3J4X2NvbmZpZ19jbWQpOworI2VuZGlmCisvKioKKyAqIGlsX2lycV9oYW5kbGVfZXJyb3IgLSBjYWxsZWQgZm9yIEhXIG9yIFNXIGVycm9yIGludGVycnVwdCBmcm9tIGNhcmQKKyAqLwordm9pZAoraWxfaXJxX2hhbmRsZV9lcnJvcihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogU2V0IHRoZSBGVyBlcnJvciBmbGFnIC0tIGNsZWFyZWQgb24gaWxfZG93biAqLworCXNldF9iaXQoU19GV19FUlJPUiwgJmlsLT5zdGF0dXMpOworCisJLyogQ2FuY2VsIGN1cnJlbnRseSBxdWV1ZWQgY29tbWFuZC4gKi8KKwljbGVhcl9iaXQoU19IQ01EX0FDVElWRSwgJmlsLT5zdGF0dXMpOworCisJSUxfRVJSKCJMb2FkZWQgZmlybXdhcmUgdmVyc2lvbjogJXNcbiIsIGlsLT5ody0+d2lwaHktPmZ3X3ZlcnNpb24pOworCisJaWwtPmNmZy0+b3BzLT5saWItPmR1bXBfbmljX2Vycm9yX2xvZyhpbCk7CisJaWYgKGlsLT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKQorCQlpbC0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maChpbCwgTlVMTCwgZmFsc2UpOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgSUxfRExfRldfRVJST1JTKQorCQlpbF9wcmludF9yeF9jb25maWdfY21kKGlsLCAmaWwtPmN0eCk7CisjZW5kaWYKKworCXdha2VfdXAoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJLyogS2VlcCB0aGUgcmVzdGFydCBwcm9jZXNzIGZyb20gdHJ5aW5nIHRvIHNlbmQgaG9zdAorCSAqIGNvbW1hbmRzIGJ5IGNsZWFyaW5nIHRoZSBJTklUIHN0YXR1cyBiaXQgKi8KKwljbGVhcl9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpOworCisJaWYgKCF0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKSB7CisJCUlMX0RCRyhJTF9ETF9GV19FUlJPUlMsCisJCSAgICAgICAiUmVzdGFydGluZyBhZGFwdGVyIGR1ZSB0byB1Q29kZSBlcnJvci5cbiIpOworCisJCWlmIChpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5yZXN0YXJ0X2Z3KQorCQkJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfaXJxX2hhbmRsZV9lcnJvcik7CisKK3N0YXRpYyBpbnQKK2lsX2FwbV9zdG9wX21hc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldCA9IDA7CisKKwkvKiBzdG9wIGRldmljZSdzIGJ1c21hc3RlciBETUEgYWN0aXZpdHkgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19TVE9QX01BU1RFUik7CisKKwlyZXQgPQorCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX01BU1RFUl9ESVNBQkxFRCwKKwkJCSBDU1JfUkVTRVRfUkVHX0ZMQUdfTUFTVEVSX0RJU0FCTEVELCAxMDApOworCWlmIChyZXQpCisJCUlMX1dBUk4oIk1hc3RlciBEaXNhYmxlIFRpbWVkIE91dCwgMTAwIHVzZWNcbiIpOworCisJRF9JTkZPKCJzdG9wIG1hc3RlclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitpbF9hcG1fc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJRF9JTkZPKCJTdG9wIGNhcmQsIHB1dCBpbiBsb3cgcG93ZXIgc3RhdGVcbiIpOworCisJLyogU3RvcCBkZXZpY2UncyBETUEgYWN0aXZpdHkgKi8KKwlpbF9hcG1fc3RvcF9tYXN0ZXIoaWwpOworCisJLyogUmVzZXQgdGhlIGVudGlyZSBkZXZpY2UgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19TV19SRVNFVCk7CisKKwl1ZGVsYXkoMTApOworCisJLyoKKwkgKiBDbGVhciAiaW5pdGlhbGl6YXRpb24gY29tcGxldGUiIGJpdCB0byBtb3ZlIGFkYXB0ZXIgZnJvbQorCSAqIEQwQSogKHBvd2VyZWQtdXAgQWN0aXZlKSAtLT4gRDBVKiAoVW5pbml0aWFsaXplZCkgc3RhdGUuCisJICovCisJaWxfY2xlYXJfYml0KGlsLCBDU1JfR1BfQ05UUkwsIENTUl9HUF9DTlRSTF9SRUdfRkxBR19JTklUX0RPTkUpOworfQorRVhQT1JUX1NZTUJPTChpbF9hcG1fc3RvcCk7CisKKy8qCisgKiBTdGFydCB1cCBOSUMncyBiYXNpYyBmdW5jdGlvbmFsaXR5IGFmdGVyIGl0IGhhcyBiZWVuIHJlc2V0CisgKiAoZS5nLiBhZnRlciBwbGF0Zm9ybSBib290LCBvciBzaHV0ZG93biB2aWEgaWxfYXBtX3N0b3AoKSkKKyAqIE5PVEU6ICBUaGlzIGRvZXMgbm90IGxvYWQgdUNvZGUgbm9yIHN0YXJ0IHRoZSBlbWJlZGRlZCBwcm9jZXNzb3IKKyAqLworaW50CitpbF9hcG1faW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldCA9IDA7CisJdTE2IGxjdGw7CisKKwlEX0lORk8oIkluaXQgY2FyZCdzIGJhc2ljIGZ1bmN0aW9uc1xuIik7CisKKwkvKgorCSAqIFVzZSAic2V0X2JpdCIgYmVsb3cgcmF0aGVyIHRoYW4gIndyaXRlIiwgdG8gcHJlc2VydmUgYW55IGhhcmR3YXJlCisJICogYml0cyBhbHJlYWR5IHNldCBieSBkZWZhdWx0IGFmdGVyIHJlc2V0LgorCSAqLworCisJLyogRGlzYWJsZSBMMFMgZXhpdCB0aW1lciAocGxhdGZvcm0gTk1JIFdvcmsvQXJvdW5kKSAqLworCWlsX3NldF9iaXQoaWwsIENTUl9HSU9fQ0hJQ0tFTl9CSVRTLAorCQkgICBDU1JfR0lPX0NISUNLRU5fQklUU19SRUdfQklUX0RJU19MMFNfRVhJVF9USU1FUik7CisKKwkvKgorCSAqIERpc2FibGUgTDBzIHdpdGhvdXQgYWZmZWN0aW5nIEwxOworCSAqICBkb24ndCB3YWl0IGZvciBJQ0ggTDBzIChJQ0ggYnVnIFcvQSkKKwkgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfR0lPX0NISUNLRU5fQklUUywKKwkJICAgQ1NSX0dJT19DSElDS0VOX0JJVFNfUkVHX0JJVF9MMUFfTk9fTDBTX1JYKTsKKworCS8qIFNldCBGSCB3YWl0IHRocmVzaG9sZCB0byBtYXhpbXVtIChIVyBlcnJvciBkdXJpbmcgc3RyZXNzIFcvQSkgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfREJHX0hQRVRfTUVNX1JFRywgQ1NSX0RCR19IUEVUX01FTV9SRUdfVkFMKTsKKworCS8qCisJICogRW5hYmxlIEhBUCBJTlRBIChpbnRlcnJ1cHQgZnJvbSBtYW5hZ2VtZW50IGJ1cykgdG8KKwkgKiB3YWtlIGRldmljZSdzIFBDSSBFeHByZXNzIGxpbmsgTDFhIC0+IEwwcworCSAqIE5PVEU6ICBUaGlzIGlzIG5vLW9wIGZvciAzOTQ1IChub24tZXhpc3RlbnQgYml0KQorCSAqLworCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfSEFQX1dBS0VfTDFBKTsKKworCS8qCisJICogSFcgYnVnIFcvQSBmb3IgaW5zdGFiaWxpdHkgaW4gUENJZSBidXMgTDAtPkwwUy0+TDEgdHJhbnNpdGlvbi4KKwkgKiBDaGVjayBpZiBCSU9TIChvciBPUykgZW5hYmxlZCBMMS1BU1BNIG9uIHRoaXMgZGV2aWNlLgorCSAqIElmIHNvIChsaWtlbHkpLCBkaXNhYmxlIEwwUywgc28gZGV2aWNlIG1vdmVzIGRpcmVjdGx5IEwwLT5MMTsKKwkgKiAgICBjb3N0cyBuZWdsaWdpYmxlIGFtb3VudCBvZiBwb3dlciBzYXZpbmdzLgorCSAqIElmIG5vdCAodW5saWtlbHkpLCBlbmFibGUgTDBTLCBzbyB0aGVyZSBpcyBhdCBsZWFzdCBzb21lCisJICogICAgcG93ZXIgc2F2aW5ncywgZXZlbiB3aXRob3V0IEwxLgorCSAqLworCWlmIChpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2V0X2wwcykgeworCQlsY3RsID0gaWxfcGNpZV9saW5rX2N0bChpbCk7CisJCWlmICgobGN0bCAmIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTikgPT0KKwkJICAgIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTikgeworCQkJLyogTDEtQVNQTSBlbmFibGVkOyBkaXNhYmxlKCEpIEwwUyAgKi8KKwkJCWlsX3NldF9iaXQoaWwsIENTUl9HSU9fUkVHLAorCQkJCSAgIENTUl9HSU9fUkVHX1ZBTF9MMFNfRU5BQkxFRCk7CisJCQlEX1BPV0VSKCJMMSBFbmFibGVkOyBEaXNhYmxpbmcgTDBTXG4iKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEwxLUFTUE0gZGlzYWJsZWQ7IGVuYWJsZSghKSBMMFMgKi8KKwkJCWlsX2NsZWFyX2JpdChpbCwgQ1NSX0dJT19SRUcsCisJCQkJICAgICBDU1JfR0lPX1JFR19WQUxfTDBTX0VOQUJMRUQpOworCQkJRF9QT1dFUigiTDEgRGlzYWJsZWQ7IEVuYWJsaW5nIEwwU1xuIik7CisJCX0KKwl9CisKKwkvKiBDb25maWd1cmUgYW5hbG9nIHBoYXNlLWxvY2stbG9vcCBiZWZvcmUgYWN0aXZhdGluZyB0byBEMEEgKi8KKwlpZiAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKQorCQlpbF9zZXRfYml0KGlsLCBDU1JfQU5BX1BMTF9DRkcsCisJCQkgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+cGxsX2NmZ192YWwpOworCisJLyoKKwkgKiBTZXQgImluaXRpYWxpemF0aW9uIGNvbXBsZXRlIiBiaXQgdG8gbW92ZSBhZGFwdGVyIGZyb20KKwkgKiBEMFUqIC0tPiBEMEEqIChwb3dlcmVkLXVwIGFjdGl2ZSkgc3RhdGUuCisJICovCisJaWxfc2V0X2JpdChpbCwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSU5JVF9ET05FKTsKKworCS8qCisJICogV2FpdCBmb3IgY2xvY2sgc3RhYmlsaXphdGlvbjsgb25jZSBzdGFiaWxpemVkLCBhY2Nlc3MgdG8KKwkgKiBkZXZpY2UtaW50ZXJuYWwgcmVzb3VyY2VzIGlzIHN1cHBvcnRlZCwgZS5nLiBpbF93cl9wcnBoKCkKKwkgKiBhbmQgYWNjZXNzZXMgdG8gdUNvZGUgU1JBTS4KKwkgKi8KKwlyZXQgPQorCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9HUF9DTlRSTCwKKwkJCSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZLAorCQkJIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQ0xPQ0tfUkVBRFksIDI1MDAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlEX0lORk8oIkZhaWxlZCB0byBpbml0IHRoZSBjYXJkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBFbmFibGUgRE1BIGFuZCBCU00gKGlmIHVzZWQpIGNsb2Nrcywgd2FpdCBmb3IgdGhlbSB0byBzdGFiaWxpemUuCisJICogQlNNIChCb29zdHJhcCBTdGF0ZSBNYWNoaW5lKSBpcyBvbmx5IGluIDM5NDUgYW5kIDQ5NjUuCisJICoKKwkgKiBXcml0ZSB0byAiQ0xLX0VOX1JFRyI7ICIxIiBiaXRzIGVuYWJsZSBjbG9ja3MsIHdoaWxlICIwIiBiaXRzCisJICogZG8gbm90IGRpc2FibGUgY2xvY2tzLiAgVGhpcyBwcmVzZXJ2ZXMgYW55IGhhcmR3YXJlIGJpdHMgYWxyZWFkeQorCSAqIHNldCBieSBkZWZhdWx0IGluICJDTEtfQ1RSTF9SRUciIGFmdGVyIHJlc2V0LgorCSAqLworCWlmIChpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+dXNlX2JzbSkKKwkJaWxfd3JfcHJwaChpbCwgQVBNR19DTEtfRU5fUkVHLAorCQkJICAgQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUIHwgQVBNR19DTEtfVkFMX0JTTV9DTEtfUlFUKTsKKwllbHNlCisJCWlsX3dyX3BycGgoaWwsIEFQTUdfQ0xLX0VOX1JFRywgQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUKTsKKwl1ZGVsYXkoMjApOworCisJLyogRGlzYWJsZSBMMS1BY3RpdmUgKi8KKwlpbF9zZXRfYml0c19wcnBoKGlsLCBBUE1HX1BDSURFVl9TVFRfUkVHLAorCQkJIEFQTUdfUENJREVWX1NUVF9WQUxfTDFfQUNUX0RJUyk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9hcG1faW5pdCk7CisKK2ludAoraWxfc2V0X3R4X3Bvd2VyKHN0cnVjdCBpbF9wcml2ICppbCwgczggdHhfcG93ZXIsIGJvb2wgZm9yY2UpCit7CisJaW50IHJldDsKKwlzOCBwcmV2X3R4X3Bvd2VyOworCWJvb2wgZGVmZXI7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKGlsLT50eF9wb3dlcl91c2VyX2xtdCA9PSB0eF9wb3dlciAmJiAhZm9yY2UpCisJCXJldHVybiAwOworCisJaWYgKCFpbC0+Y2ZnLT5vcHMtPmxpYi0+c2VuZF90eF9wb3dlcikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogMCBkQm0gbWVhbiAxIG1pbGxpd2F0dCAqLworCWlmICh0eF9wb3dlciA8IDApIHsKKwkJSUxfV0FSTigiUmVxdWVzdGVkIHVzZXIgVFhQT1dFUiAlZCBiZWxvdyAxIG1XLlxuIiwgdHhfcG93ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodHhfcG93ZXIgPiBpbC0+dHhfcG93ZXJfZGV2aWNlX2xtdCkgeworCQlJTF9XQVJOKCJSZXF1ZXN0ZWQgdXNlciBUWFBPV0VSICVkIGFib3ZlIHVwcGVyIGxpbWl0ICVkLlxuIiwKKwkJCXR4X3Bvd2VyLCBpbC0+dHhfcG93ZXJfZGV2aWNlX2xtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHNjYW4gY29tcGxldGUgYW5kIGNvbW1pdF9yeG9uIHVzZSB0eF9wb3dlcl9uZXh0IHZhbHVlLAorCSAqIGl0IGFsd2F5cyBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIG5ld2VzdCByZXF1ZXN0ICovCisJaWwtPnR4X3Bvd2VyX25leHQgPSB0eF9wb3dlcjsKKworCS8qIGRvIG5vdCBzZXQgdHggcG93ZXIgd2hlbiBzY2FubmluZyBvciBjaGFubmVsIGNoYW5naW5nICovCisJZGVmZXIgPSB0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykgfHwKKwkgICAgbWVtY21wKCZjdHgtPmFjdGl2ZSwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKGN0eC0+c3RhZ2luZykpOworCWlmIChkZWZlciAmJiAhZm9yY2UpIHsKKwkJRF9JTkZPKCJEZWZlcnJpbmcgdHggcG93ZXIgc2V0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJldl90eF9wb3dlciA9IGlsLT50eF9wb3dlcl91c2VyX2xtdDsKKwlpbC0+dHhfcG93ZXJfdXNlcl9sbXQgPSB0eF9wb3dlcjsKKworCXJldCA9IGlsLT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKGlsKTsKKworCS8qIGlmIGZhaWwgdG8gc2V0IHR4X3Bvd2VyLCByZXN0b3JlIHRoZSBvcmlnLiB0eCBwb3dlciAqLworCWlmIChyZXQpIHsKKwkJaWwtPnR4X3Bvd2VyX3VzZXJfbG10ID0gcHJldl90eF9wb3dlcjsKKwkJaWwtPnR4X3Bvd2VyX25leHQgPSBwcmV2X3R4X3Bvd2VyOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9zZXRfdHhfcG93ZXIpOworCit2b2lkCitpbF9zZW5kX2J0X2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2J0X2NtZCBidF9jbWQgPSB7CisJCS5sZWFkX3RpbWUgPSBCVF9MRUFEX1RJTUVfREVGLAorCQkubWF4X2tpbGwgPSBCVF9NQVhfS0lMTF9ERUYsCisJCS5raWxsX2Fja19tYXNrID0gMCwKKwkJLmtpbGxfY3RzX21hc2sgPSAwLAorCX07CisKKwlpZiAoIWJ0X2NvZXhfYWN0aXZlKQorCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0RJU0FCTEU7CisJZWxzZQorCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0VOQUJMRTsKKworCURfSU5GTygiQlQgY29leCAlc1xuIiwKKwkgICAgICAgKGJ0X2NtZC5mbGFncyA9PSBCVF9DT0VYX0RJU0FCTEUpID8gImRpc2FibGUiIDogImFjdGl2ZSIpOworCisJaWYgKGlsX3NlbmRfY21kX3BkdShpbCwgQ19CVF9DT05GSUcsIHNpemVvZihzdHJ1Y3QgaWxfYnRfY21kKSwgJmJ0X2NtZCkpCisJCUlMX0VSUigiZmFpbGVkIHRvIHNlbmQgQlQgQ29leCBDb25maWdcbiIpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX2J0X2NvbmZpZyk7CisKK2ludAoraWxfc2VuZF9zdGF0c19yZXF1ZXN0KHN0cnVjdCBpbF9wcml2ICppbCwgdTggZmxhZ3MsIGJvb2wgY2xlYXIpCit7CisJc3RydWN0IGlsX3N0YXRzX2NtZCBzdGF0c19jbWQgPSB7CisJCS5jb25maWd1cmF0aW9uX2ZsYWdzID0gY2xlYXIgPyBJTF9TVEFUU19DT05GX0NMRUFSX1NUQVRTIDogMCwKKwl9OworCisJaWYgKGZsYWdzICYgQ01EX0FTWU5DKQorCQlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1X2FzeW5jKGlsLCBDX1NUQVRTLCBzaXplb2Yoc3RydWN0IGlsX3N0YXRzX2NtZCksCisJCQkJCSAgICAgJnN0YXRzX2NtZCwgTlVMTCk7CisJZWxzZQorCQlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1NUQVRTLCBzaXplb2Yoc3RydWN0IGlsX3N0YXRzX2NtZCksCisJCQkJICAgICAgICZzdGF0c19jbWQpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX3N0YXRzX3JlcXVlc3QpOworCit2b2lkCitpbF9oZGxfcG1fc2xlZXAoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfc2xlZXBfbm90aWZpY2F0aW9uICpzbGVlcCA9ICYocGt0LT51LnNsZWVwX25vdGlmKTsKKwlEX1JYKCJzbGVlcCBtb2RlOiAlZCwgc3JjOiAlZFxuIiwKKwkgICAgIHNsZWVwLT5wbV9zbGVlcF9tb2RlLCBzbGVlcC0+cG1fd2FrZXVwX3NyYyk7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0woaWxfaGRsX3BtX3NsZWVwKTsKKwordm9pZAoraWxfaGRsX3BtX2RlYnVnX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJdTMyIGxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgSUxfUlhfRlJBTUVfU0laRV9NU0s7CisJRF9SQURJTygiRHVtcGluZyAlZCBieXRlcyBvZiB1bmhhbmRsZWQgbm90aWZpY2F0aW9uIGZvciAlczpcbiIsIGxlbiwKKwkJaWxfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSk7CisJaWxfcHJpbnRfaGV4X2R1bXAoaWwsIElMX0RMX1JBRElPLCBwa3QtPnUucmF3LCBsZW4pOworfQorRVhQT1JUX1NZTUJPTChpbF9oZGxfcG1fZGVidWdfc3RhdHMpOworCit2b2lkCitpbF9oZGxfZXJyb3Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKworCUlMX0VSUigiRXJyb3IgUmVwbHkgdHlwZSAweCUwOFggY21kICVzICgweCUwMlgpICIKKwkgICAgICAgInNlcSAweCUwNFggc2VyIDB4JTA4WFxuIiwKKwkgICAgICAgbGUzMl90b19jcHUocGt0LT51LmVycl9yZXNwLmVycm9yX3R5cGUpLAorCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhwa3QtPnUuZXJyX3Jlc3AuY21kX2lkKSwKKwkgICAgICAgcGt0LT51LmVycl9yZXNwLmNtZF9pZCwKKwkgICAgICAgbGUxNl90b19jcHUocGt0LT51LmVycl9yZXNwLmJhZF9jbWRfc2VxX251bSksCisJICAgICAgIGxlMzJfdG9fY3B1KHBrdC0+dS5lcnJfcmVzcC5lcnJvcl9pbmZvKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2hkbF9lcnJvcik7CisKK3ZvaWQKK2lsX2NsZWFyX2lzcl9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJbWVtc2V0KCZpbC0+aXNyX3N0YXRzLCAwLCBzaXplb2YoaWwtPmlzcl9zdGF0cykpOworfQorCitpbnQKK2lsX21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCisJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcTsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKSB7CisJCURfTUFDODAyMTEoImxlYXZlIC0gUkYgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHF1ZXVlID49IEFDX05VTSkgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIHF1ZXVlID49IEFDX05VTSAlZFxuIiwgcXVldWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlxID0gQUNfTlVNIC0gMSAtIHF1ZXVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpbC0+Y3R4LnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5jd19taW4gPQorCSAgICBjcHVfdG9fbGUxNihwYXJhbXMtPmN3X21pbik7CisJaWwtPmN0eC5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uY3dfbWF4ID0KKwkgICAgY3B1X3RvX2xlMTYocGFyYW1zLT5jd19tYXgpOworCWlsLT5jdHgucW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmFpZnNuID0gcGFyYW1zLT5haWZzOworCWlsLT5jdHgucW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmVkY2FfdHhvcCA9CisJICAgIGNwdV90b19sZTE2KChwYXJhbXMtPnR4b3AgKiAzMikpOworCisJaWwtPmN0eC5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0ucmVzZXJ2ZWQxID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19jb25mX3R4KTsKKworaW50CitpbF9tYWNfdHhfbGFzdF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisKKwlyZXR1cm4gaWwtPmlic3NfbWFuYWdlciA9PSBJTF9JQlNTX01BTkFHRVI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbF9tYWNfdHhfbGFzdF9iZWFjb24pOworCitzdGF0aWMgaW50CitpbF9zZXRfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKGlsLCBjdHgpOworCisJaWYgKGlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCisJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisKKwlyZXR1cm4gaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7Cit9CisKK3N0YXRpYyBpbnQKK2lsX3NldHVwX2ludGVyZmFjZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gY3R4LT52aWY7CisJaW50IGVycjsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwkvKgorCSAqIFRoaXMgdmFyaWFibGUgd2lsbCBiZSBjb3JyZWN0IG9ubHkgd2hlbiB0aGVyZSdzIGp1c3QKKwkgKiBhIHNpbmdsZSBjb250ZXh0LCBidXQgYWxsIGNvZGUgdXNpbmcgaXQgaXMgZm9yIGhhcmR3YXJlCisJICogdGhhdCBzdXBwb3J0cyBvbmx5IG9uZSBjb250ZXh0LgorCSAqLworCWlsLT5pd19tb2RlID0gdmlmLT50eXBlOworCisJY3R4LT5pc19hY3RpdmUgPSB0cnVlOworCisJZXJyID0gaWxfc2V0X21vZGUoaWwsIGN0eCk7CisJaWYgKGVycikgeworCQlpZiAoIWN0eC0+YWx3YXlzX2FjdGl2ZSkKKwkJCWN0eC0+aXNfYWN0aXZlID0gZmFsc2U7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWxfbWFjX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJc3RydWN0IGlsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlpbnQgZXJyOworCXUzMiBtb2RlczsKKworCURfTUFDODAyMTEoImVudGVyOiB0eXBlICVkLCBhZGRyICVwTVxuIiwgdmlmLT50eXBlLCB2aWYtPmFkZHIpOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKSB7CisJCUlMX1dBUk4oIlRyeSB0byBhZGQgaW50ZXJmYWNlIHdoZW4gZGV2aWNlIG5vdCByZWFkeVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGNoZWNrIGlmIGJ1c3kgY29udGV4dCBpcyBleGNsdXNpdmUgKi8KKwlpZiAoaWwtPmN0eC52aWYgJiYKKwkgICAgKGlsLT5jdHguZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmIEJJVChpbC0+Y3R4LnZpZi0+dHlwZSkpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCW1vZGVzID0gaWwtPmN0eC5pbnRlcmZhY2VfbW9kZXMgfCBpbC0+Y3R4LmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7CisJaWYgKCEobW9kZXMgJiBCSVQodmlmLT50eXBlKSkpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCXZpZl9wcml2LT5jdHggPSAmaWwtPmN0eDsKKwlpbC0+Y3R4LnZpZiA9IHZpZjsKKworCWVyciA9IGlsX3NldHVwX2ludGVyZmFjZShpbCwgJmlsLT5jdHgpOworCWlmIChlcnIpIHsKKwkJaWwtPmN0eC52aWYgPSBOVUxMOworCQlpbC0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19hZGRfaW50ZXJmYWNlKTsKKworc3RhdGljIHZvaWQKK2lsX3RlYXJkb3duX2ludGVyZmFjZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgICAgIGJvb2wgbW9kZV9jaGFuZ2UpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoaWwtPnNjYW5fdmlmID09IHZpZikgeworCQlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAyMDApOworCQlpbF9mb3JjZV9zY2FuX2VuZChpbCk7CisJfQorCisJaWYgKCFtb2RlX2NoYW5nZSkgeworCQlpbF9zZXRfbW9kZShpbCwgY3R4KTsKKwkJaWYgKCFjdHgtPmFsd2F5c19hY3RpdmUpCisJCQljdHgtPmlzX2FjdGl2ZSA9IGZhbHNlOworCX0KK30KKwordm9pZAoraWxfbWFjX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlXQVJOX09OKGN0eC0+dmlmICE9IHZpZik7CisJY3R4LT52aWYgPSBOVUxMOworCisJaWxfdGVhcmRvd25faW50ZXJmYWNlKGlsLCB2aWYsIGZhbHNlKTsKKworCW1lbXNldChpbC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX3JlbW92ZV9pbnRlcmZhY2UpOworCitpbnQKK2lsX2FsbG9jX3R4cV9tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlmICghaWwtPnR4cSkKKwkJaWwtPnR4cSA9CisJCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWxfdHhfcXVldWUpICoKKwkJCSAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbC0+dHhxKSB7CisJCUlMX0VSUigiTm90IGVub3VnaCBtZW1vcnkgZm9yIHR4cVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfYWxsb2NfdHhxX21lbSk7CisKK3ZvaWQKK2lsX3R4cV9tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWtmcmVlKGlsLT50eHEpOworCWlsLT50eHEgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChpbF90eHFfbWVtKTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisKKyNkZWZpbmUgSUxfVFJBRkZJQ19EVU1QX1NJWkUJKElMX1RSQUZGSUNfRU5UUllfU0laRSAqIElMX1RSQUZGSUNfRU5UUklFUykKKwordm9pZAoraWxfcmVzZXRfdHJhZmZpY19sb2coc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT50eF90cmFmZmljX2lkeCA9IDA7CisJaWwtPnJ4X3RyYWZmaWNfaWR4ID0gMDsKKwlpZiAoaWwtPnR4X3RyYWZmaWMpCisJCW1lbXNldChpbC0+dHhfdHJhZmZpYywgMCwgSUxfVFJBRkZJQ19EVU1QX1NJWkUpOworCWlmIChpbC0+cnhfdHJhZmZpYykKKwkJbWVtc2V0KGlsLT5yeF90cmFmZmljLCAwLCBJTF9UUkFGRklDX0RVTVBfU0laRSk7Cit9CisKK2ludAoraWxfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXUzMiB0cmFmZmljX3NpemUgPSBJTF9UUkFGRklDX0RVTVBfU0laRTsKKworCWlmIChpbF9kZWJ1Z19sZXZlbCAmIElMX0RMX1RYKSB7CisJCWlmICghaWwtPnR4X3RyYWZmaWMpIHsKKwkJCWlsLT50eF90cmFmZmljID0ga3phbGxvYyh0cmFmZmljX3NpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKCFpbC0+dHhfdHJhZmZpYykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlpZiAoaWxfZGVidWdfbGV2ZWwgJiBJTF9ETF9SWCkgeworCQlpZiAoIWlsLT5yeF90cmFmZmljKSB7CisJCQlpbC0+cnhfdHJhZmZpYyA9IGt6YWxsb2ModHJhZmZpY19zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghaWwtPnJ4X3RyYWZmaWMpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJaWxfcmVzZXRfdHJhZmZpY19sb2coaWwpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9hbGxvY190cmFmZmljX21lbSk7CisKK3ZvaWQKK2lsX2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWtmcmVlKGlsLT50eF90cmFmZmljKTsKKwlpbC0+dHhfdHJhZmZpYyA9IE5VTEw7CisKKwlrZnJlZShpbC0+cnhfdHJhZmZpYyk7CisJaWwtPnJ4X3RyYWZmaWMgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChpbF9mcmVlX3RyYWZmaWNfbWVtKTsKKwordm9pZAoraWxfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IGxlbmd0aCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQoreworCV9fbGUxNiBmYzsKKwl1MTYgbGVuOworCisJaWYgKGxpa2VseSghKGlsX2RlYnVnX2xldmVsICYgSUxfRExfVFgpKSkKKwkJcmV0dXJuOworCisJaWYgKCFpbC0+dHhfdHJhZmZpYykKKwkJcmV0dXJuOworCisJZmMgPSBoZWFkZXItPmZyYW1lX2NvbnRyb2w7CisJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgeworCQlsZW4gPQorCQkgICAgKGxlbmd0aCA+CisJCSAgICAgSUxfVFJBRkZJQ19FTlRSWV9TSVpFKSA/IElMX1RSQUZGSUNfRU5UUllfU0laRSA6IGxlbmd0aDsKKwkJbWVtY3B5KChpbC0+dHhfdHJhZmZpYyArCisJCQkoaWwtPnR4X3RyYWZmaWNfaWR4ICogSUxfVFJBRkZJQ19FTlRSWV9TSVpFKSksIGhlYWRlciwKKwkJICAgICAgIGxlbik7CisJCWlsLT50eF90cmFmZmljX2lkeCA9CisJCSAgICAoaWwtPnR4X3RyYWZmaWNfaWR4ICsgMSkgJSBJTF9UUkFGRklDX0VOVFJJRVM7CisJfQorfQorRVhQT1JUX1NZTUJPTChpbF9kYmdfbG9nX3R4X2RhdGFfZnJhbWUpOworCit2b2lkCitpbF9kYmdfbG9nX3J4X2RhdGFfZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgbGVuZ3RoLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCit7CisJX19sZTE2IGZjOworCXUxNiBsZW47CisKKwlpZiAobGlrZWx5KCEoaWxfZGVidWdfbGV2ZWwgJiBJTF9ETF9SWCkpKQorCQlyZXR1cm47CisKKwlpZiAoIWlsLT5yeF90cmFmZmljKQorCQlyZXR1cm47CisKKwlmYyA9IGhlYWRlci0+ZnJhbWVfY29udHJvbDsKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGEoZmMpKSB7CisJCWxlbiA9CisJCSAgICAobGVuZ3RoID4KKwkJICAgICBJTF9UUkFGRklDX0VOVFJZX1NJWkUpID8gSUxfVFJBRkZJQ19FTlRSWV9TSVpFIDogbGVuZ3RoOworCQltZW1jcHkoKGlsLT5yeF90cmFmZmljICsKKwkJCShpbC0+cnhfdHJhZmZpY19pZHggKiBJTF9UUkFGRklDX0VOVFJZX1NJWkUpKSwgaGVhZGVyLAorCQkgICAgICAgbGVuKTsKKwkJaWwtPnJ4X3RyYWZmaWNfaWR4ID0KKwkJICAgIChpbC0+cnhfdHJhZmZpY19pZHggKyAxKSAlIElMX1RSQUZGSUNfRU5UUklFUzsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlsX2RiZ19sb2dfcnhfZGF0YV9mcmFtZSk7CisKK2NvbnN0IGNoYXIgKgoraWxfZ2V0X21nbXRfc3RyaW5nKGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfQVNTT0NfUkVRKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfQVNTT0NfUkVTUCk7CisJCUlMX0NNRChNQU5BR0VNRU5UX1JFQVNTT0NfUkVRKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfUkVBU1NPQ19SRVNQKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfUFJPQkVfUkVRKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfUFJPQkVfUkVTUCk7CisJCUlMX0NNRChNQU5BR0VNRU5UX0JFQUNPTik7CisJCUlMX0NNRChNQU5BR0VNRU5UX0FUSU0pOworCQlJTF9DTUQoTUFOQUdFTUVOVF9ESVNBU1NPQyk7CisJCUlMX0NNRChNQU5BR0VNRU5UX0FVVEgpOworCQlJTF9DTUQoTUFOQUdFTUVOVF9ERUFVVEgpOworCQlJTF9DTUQoTUFOQUdFTUVOVF9BQ1RJT04pOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisKKwl9Cit9CisKK2NvbnN0IGNoYXIgKgoraWxfZ2V0X2N0cmxfc3RyaW5nKGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwkJSUxfQ01EKENPTlRST0xfQkFDS19SRVEpOworCQlJTF9DTUQoQ09OVFJPTF9CQUNLKTsKKwkJSUxfQ01EKENPTlRST0xfUFNQT0xMKTsKKwkJSUxfQ01EKENPTlRST0xfUlRTKTsKKwkJSUxfQ01EKENPTlRST0xfQ1RTKTsKKwkJSUxfQ01EKENPTlRST0xfQUNLKTsKKwkJSUxfQ01EKENPTlRST0xfQ0ZFTkQpOworCQlJTF9DTUQoQ09OVFJPTF9DRkVOREFDSyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKworCX0KK30KKwordm9pZAoraWxfY2xlYXJfdHJhZmZpY19zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJbWVtc2V0KCZpbC0+dHhfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgdHJhZmZpY19zdGF0cykpOworCW1lbXNldCgmaWwtPnJ4X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHRyYWZmaWNfc3RhdHMpKTsKK30KKworLyoKKyAqIGlmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTIGRlZmluZWQsCisgKiBpbF91cGRhdGVfc3RhdHMgZnVuY3Rpb24gd2lsbAorICogcmVjb3JkIGFsbCB0aGUgTUdNVCwgQ1RSTCBhbmQgREFUQSBwa3QgZm9yIGJvdGggVFggYW5kIFJ4IHBhc3MKKyAqIFVzZSBkZWJ1Z0ZzIHRvIGRpc3BsYXkgdGhlIHJ4L3J4X3N0YXRzCisgKiBpZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUyBub3QgYmVpbmcgZGVmaW5lZCwgdGhlbiBubyBNR01UIGFuZCBDVFJMCisgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlY29yZGVkLCBidXQgREFUQSBwa3Qgc3RpbGwgd2lsbCBiZSByZWNvcmRlZAorICogZm9yIHRoZSByZWFzb24gb2YgaWxfbGVkLmMgbmVlZCB0byBjb250cm9sIHRoZSBsZWQgYmxpbmtpbmcgYmFzZWQgb24KKyAqIG51bWJlciBvZiB0eCBhbmQgcnggZGF0YS4KKyAqCisgKi8KK3ZvaWQKK2lsX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgaXNfdHgsIF9fbGUxNiBmYywgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgdHJhZmZpY19zdGF0cyAqc3RhdHM7CisKKwlpZiAoaXNfdHgpCisJCXN0YXRzID0gJmlsLT50eF9zdGF0czsKKwllbHNlCisJCXN0YXRzID0gJmlsLT5yeF9zdGF0czsKKworCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpIHsKKwkJc3dpdGNoIChmYyAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1NUWVBFKSkgeworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BU1NPQ19SRVFdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCk6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0FTU09DX1JFU1BdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEpOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9SRUFTU09DX1JFUV0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1ApOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9SRUFTU09DX1JFU1BdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUFJPQkVfUkVRXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9QUk9CRV9SRVNQXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0JFQUNPTik6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0JFQUNPTl0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVElNKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQVRJTV0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyk6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0RJU0FTU09DXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BVVRIXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0RFQVVUSCk6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0RFQVVUSF0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BQ1RJT05dKys7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lzX2N0bChmYykpIHsKKwkJc3dpdGNoIChmYyAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1NUWVBFKSkgeworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CQUNLX1JFUSk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX0JBQ0tfUkVRXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0JBQ0spOgorCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9CQUNLXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BTUE9MTCk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX1BTUE9MTF0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9SVFMpOgorCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9SVFNdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQ1RTKToKKwkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQ1RTXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FDSyk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX0FDS10rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9DRkVORCk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX0NGRU5EXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLKToKKwkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQ0ZFTkRBQ0tdKys7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGRhdGEgKi8KKwkJc3RhdHMtPmRhdGFfY250Kys7CisJCXN0YXRzLT5kYXRhX2J5dGVzICs9IGxlbjsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlsX3VwZGF0ZV9zdGF0cyk7CisjZW5kaWYKKworaW50CitpbF9mb3JjZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgZXh0ZXJuYWwpCit7CisJc3RydWN0IGlsX2ZvcmNlX3Jlc2V0ICpmb3JjZV9yZXNldDsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvcmNlX3Jlc2V0ID0gJmlsLT5mb3JjZV9yZXNldDsKKwlmb3JjZV9yZXNldC0+cmVzZXRfcmVxdWVzdF9jb3VudCsrOworCWlmICghZXh0ZXJuYWwpIHsKKwkJaWYgKGZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgJiYKKwkJICAgIHRpbWVfYWZ0ZXIoZm9yY2VfcmVzZXQtPmxhc3RfZm9yY2VfcmVzZXRfamlmZmllcyArCisJCQkgICAgICAgZm9yY2VfcmVzZXQtPnJlc2V0X2R1cmF0aW9uLCBqaWZmaWVzKSkgeworCQkJRF9JTkZPKCJmb3JjZSByZXNldCByZWplY3RlZFxuIik7CisJCQlmb3JjZV9yZXNldC0+cmVzZXRfcmVqZWN0X2NvdW50Kys7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKwlmb3JjZV9yZXNldC0+cmVzZXRfc3VjY2Vzc19jb3VudCsrOworCWZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgPSBqaWZmaWVzOworCisJLyoKKwkgKiBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGV4dGVybmFsKGV4OiBkZWJ1Z2ZzKSwKKwkgKiB0aGVuIGFsd2F5cyBwZXJmb3JtIHRoZSByZXF1ZXN0IGluIHJlZ2FyZGxlc3MgdGhlIG1vZHVsZQorCSAqIHBhcmFtZXRlciBzZXR0aW5nCisJICogaWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBpbnRlcm5hbCAodUNvZGUgZXJyb3Igb3IgZHJpdmVyCisJICogZGV0ZWN0IGZhaWx1cmUpLCB0aGVuIGZ3X3Jlc3RhcnQgbW9kdWxlIHBhcmFtZXRlcgorCSAqIG5lZWQgdG8gYmUgY2hlY2sgYmVmb3JlIHBlcmZvcm1pbmcgZmlybXdhcmUgcmVsb2FkCisJICovCisKKwlpZiAoIWV4dGVybmFsICYmICFpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5yZXN0YXJ0X2Z3KSB7CisJCURfSU5GTygiQ2FuY2VsIGZpcm13YXJlIHJlbG9hZCBiYXNlZCBvbiAiCisJCSAgICAgICAibW9kdWxlIHBhcmFtZXRlciBzZXR0aW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJSUxfRVJSKCJPbiBkZW1hbmQgZmlybXdhcmUgcmVsb2FkXG4iKTsKKworCS8qIFNldCB0aGUgRlcgZXJyb3IgZmxhZyAtLSBjbGVhcmVkIG9uIGlsX2Rvd24gKi8KKwlzZXRfYml0KFNfRldfRVJST1IsICZpbC0+c3RhdHVzKTsKKwl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKwkvKgorCSAqIEtlZXAgdGhlIHJlc3RhcnQgcHJvY2VzcyBmcm9tIHRyeWluZyB0byBzZW5kIGhvc3QKKwkgKiBjb21tYW5kcyBieSBjbGVhcmluZyB0aGUgSU5JVCBzdGF0dXMgYml0CisJICovCisJY2xlYXJfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKTsKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+cmVzdGFydCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitpbF9tYWNfY2hhbmdlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCWVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKwl1MzIgbW9kZXM7CisJaW50IGVycjsKKworCW5ld3R5cGUgPSBpZWVlODAyMTFfaWZ0eXBlX3AycChuZXd0eXBlLCBuZXdwMnApOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCWlmICghY3R4LT52aWYgfHwgIWlsX2lzX3JlYWR5X3JmKGlsKSkgeworCQkvKgorCQkgKiBIdWg/IEJ1dCB3YWl0IC4uLiB0aGlzIGNhbiBtYXliZSBoYXBwZW4gd2hlbgorCQkgKiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZmlybXdhcmUgcmVzdGFydCEKKwkJICovCisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJbW9kZXMgPSBjdHgtPmludGVyZmFjZV9tb2RlcyB8IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKKwlpZiAoIShtb2RlcyAmIEJJVChuZXd0eXBlKSkpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoaWwtPmN0eC5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYgQklUKGlsLT5jdHgudmlmLT50eXBlKSkgfHwKKwkgICAgKGlsLT5jdHguZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogc3VjY2VzcyAqLworCWlsX3RlYXJkb3duX2ludGVyZmFjZShpbCwgdmlmLCB0cnVlKTsKKwl2aWYtPnR5cGUgPSBuZXd0eXBlOworCXZpZi0+cDJwID0gbmV3cDJwOworCWVyciA9IGlsX3NldHVwX2ludGVyZmFjZShpbCwgY3R4KTsKKwlXQVJOX09OKGVycik7CisJLyoKKwkgKiBXZSd2ZSBzd2l0Y2hlZCBpbnRlcm5hbGx5LCBidXQgc3VibWl0dGluZyB0byB0aGUKKwkgKiBkZXZpY2UgbWF5IGhhdmUgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gTWFzayB0aGlzCisJICogZXJyb3IsIGJlY2F1c2Ugb3RoZXJ3aXNlIG1hYzgwMjExIHdpbGwgbm90IHN3aXRjaAorCSAqIChhbmQgc2V0IHRoZSBpbnRlcmZhY2UgdHlwZSBiYWNrKSBhbmQgd2UnbGwgYmUKKwkgKiBvdXQgb2Ygc3luYyB3aXRoIGl0LgorCSAqLworCWVyciA9IDA7CisKK291dDoKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX2NoYW5nZV9pbnRlcmZhY2UpOworCisvKgorICogT24gZXZlcnkgd2F0Y2hkb2cgdGljayB3ZSBjaGVjayAobGF0ZXN0KSB0aW1lIHN0YW1wLiBJZiBpdCBkb2VzIG5vdAorICogY2hhbmdlIGR1cmluZyB0aW1lb3V0IHBlcmlvZCBhbmQgcXVldWUgaXMgbm90IGVtcHR5IHdlIHJlc2V0IGZpcm13YXJlLgorICovCitzdGF0aWMgaW50CitpbF9jaGVja19zdHVja19xdWV1ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBjbnQpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVtjbnRdOworCXN0cnVjdCBpbF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXQ7CisKKwlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyKSB7CisJCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJCXJldHVybiAwOworCX0KKworCXRpbWVvdXQgPQorCSAgICB0eHEtPnRpbWVfc3RhbXAgKworCSAgICBtc2Vjc190b19qaWZmaWVzKGlsLT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0KTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCUlMX0VSUigiUXVldWUgJWQgc3R1Y2sgZm9yICV1IG1zLlxuIiwgcS0+aWQsCisJCSAgICAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCk7CisJCXJldCA9IGlsX2ZvcmNlX3Jlc2V0KGlsLCBmYWxzZSk7CisJCXJldHVybiAocmV0ID09IC1FQUdBSU4pID8gMCA6IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYWtpbmcgd2F0Y2hkb2cgdGljayBiZSBhIHF1YXJ0ZXIgb2YgdGltZW91dCBhc3N1cmUgd2Ugd2lsbAorICogZGlzY292ZXIgdGhlIHF1ZXVlIGh1bmcgYmV0d2VlbiB0aW1lb3V0IGFuZCAxLjI1KnRpbWVvdXQKKyAqLworI2RlZmluZSBJTF9XRF9USUNLKHRpbWVvdXQpICgodGltZW91dCkgLyA0KQorCisvKgorICogV2F0Y2hkb2cgdGltZXIgY2FsbGJhY2ssIHdlIGNoZWNrIGVhY2ggdHggcXVldWUgZm9yIHN0dWNrLCBpZiBpZiBodW5nCisgKiB3ZSByZXNldCB0aGUgZmlybXdhcmUuIElmIGV2ZXJ5dGhpbmcgaXMgZmluZSBqdXN0IHJlYXJtIHRoZSB0aW1lci4KKyAqLwordm9pZAoraWxfYmdfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IChzdHJ1Y3QgaWxfcHJpdiAqKWRhdGE7CisJaW50IGNudDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJdGltZW91dCA9IGlsLT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OworCWlmICh0aW1lb3V0ID09IDApCisJCXJldHVybjsKKworCS8qIG1vbml0b3IgYW5kIGNoZWNrIGZvciBzdHVjayBjbWQgcXVldWUgKi8KKwlpZiAoaWxfY2hlY2tfc3R1Y2tfcXVldWUoaWwsIGlsLT5jbWRfcXVldWUpKQorCQlyZXR1cm47CisKKwkvKiBtb25pdG9yIGFuZCBjaGVjayBmb3Igb3RoZXIgc3R1Y2sgcXVldWVzICovCisJaWYgKGlsX2lzX2FueV9hc3NvY2lhdGVkKGlsKSkgeworCQlmb3IgKGNudCA9IDA7IGNudCA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IGNudCsrKSB7CisJCQkvKiBza2lwIGFzIHdlIGFscmVhZHkgY2hlY2tlZCB0aGUgY29tbWFuZCBxdWV1ZSAqLworCQkJaWYgKGNudCA9PSBpbC0+Y21kX3F1ZXVlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGlsX2NoZWNrX3N0dWNrX3F1ZXVlKGlsLCBjbnQpKQorCQkJCXJldHVybjsKKwkJfQorCX0KKworCW1vZF90aW1lcigmaWwtPndhdGNoZG9nLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKElMX1dEX1RJQ0sodGltZW91dCkpKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfYmdfd2F0Y2hkb2cpOworCit2b2lkCitpbF9zZXR1cF93YXRjaGRvZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKKworCWlmICh0aW1lb3V0KQorCQltb2RfdGltZXIoJmlsLT53YXRjaGRvZywKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSUxfV0RfVElDSyh0aW1lb3V0KSkpOworCWVsc2UKKwkJZGVsX3RpbWVyKCZpbC0+d2F0Y2hkb2cpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZXR1cF93YXRjaGRvZyk7CisKKy8qCisgKiBleHRlbmRlZCBiZWFjb24gdGltZSBmb3JtYXQKKyAqIHRpbWUgaW4gdXNlYyB3aWxsIGJlIGNoYW5nZWQgaW50byBhIDMyLWJpdCB2YWx1ZSBpbiBleHRlbmRlZDppbnRlcm5hbCBmb3JtYXQKKyAqIHRoZSBleHRlbmRlZCBwYXJ0IGlzIHRoZSBiZWFjb24gY291bnRzCisgKiB0aGUgaW50ZXJuYWwgcGFydCBpcyB0aGUgdGltZSBpbiB1c2VjIHdpdGhpbiBvbmUgYmVhY29uIGludGVydmFsCisgKi8KK3UzMgoraWxfdXNlY3NfdG9fYmVhY29ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiB1c2VjLCB1MzIgYmVhY29uX2ludGVydmFsKQoreworCXUzMiBxdW90OworCXUzMiByZW07CisJdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogVElNRV9VTklUOworCisJaWYgKCFpbnRlcnZhbCB8fCAhdXNlYykKKwkJcmV0dXJuIDA7CisKKwlxdW90ID0KKwkgICAgKHVzZWMgLworCSAgICAgaW50ZXJ2YWwpICYgKGlsX2JlYWNvbl90aW1lX21hc2tfaGlnaChpbCwKKwkJCQkJCSAgIGlsLT5od19wYXJhbXMuCisJCQkJCQkgICBiZWFjb25fdGltZV90c2ZfYml0cykgPj4gaWwtPgorCQkJICBod19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOworCXJlbSA9CisJICAgICh1c2VjICUgaW50ZXJ2YWwpICYgaWxfYmVhY29uX3RpbWVfbWFza19sb3coaWwsCisJCQkJCQkJaWwtPmh3X3BhcmFtcy4KKwkJCQkJCQliZWFjb25fdGltZV90c2ZfYml0cyk7CisKKwlyZXR1cm4gKHF1b3QgPDwgaWwtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cykgKyByZW07Cit9CitFWFBPUlRfU1lNQk9MKGlsX3VzZWNzX3RvX2JlYWNvbnMpOworCisvKiBiYXNlIGlzIHVzdWFsbHkgd2hhdCB3ZSBnZXQgZnJvbSB1Y29kZSB3aXRoIGVhY2ggcmVjZWl2ZWQgZnJhbWUsCisgKiB0aGUgc2FtZSBhcyBIVyB0aW1lciBjb3VudGVyIGNvdW50aW5nIGRvd24KKyAqLworX19sZTMyCitpbF9hZGRfYmVhY29uX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYmFzZSwgdTMyIGFkZG9uLAorCQkgICB1MzIgYmVhY29uX2ludGVydmFsKQoreworCXUzMiBiYXNlX2xvdyA9IGJhc2UgJiBpbF9iZWFjb25fdGltZV9tYXNrX2xvdyhpbCwKKwkJCQkJCSAgICAgIGlsLT5od19wYXJhbXMuCisJCQkJCQkgICAgICBiZWFjb25fdGltZV90c2ZfYml0cyk7CisJdTMyIGFkZG9uX2xvdyA9IGFkZG9uICYgaWxfYmVhY29uX3RpbWVfbWFza19sb3coaWwsCisJCQkJCQkJaWwtPmh3X3BhcmFtcy4KKwkJCQkJCQliZWFjb25fdGltZV90c2ZfYml0cyk7CisJdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogVElNRV9VTklUOworCXUzMiByZXMgPSAoYmFzZSAmIGlsX2JlYWNvbl90aW1lX21hc2tfaGlnaChpbCwKKwkJCQkJCSAgIGlsLT5od19wYXJhbXMuCisJCQkJCQkgICBiZWFjb25fdGltZV90c2ZfYml0cykpICsKKwkgICAgKGFkZG9uICYgaWxfYmVhY29uX3RpbWVfbWFza19oaWdoKGlsLAorCQkJCQkgICAgICBpbC0+aHdfcGFyYW1zLgorCQkJCQkgICAgICBiZWFjb25fdGltZV90c2ZfYml0cykpOworCisJaWYgKGJhc2VfbG93ID4gYWRkb25fbG93KQorCQlyZXMgKz0gYmFzZV9sb3cgLSBhZGRvbl9sb3c7CisJZWxzZSBpZiAoYmFzZV9sb3cgPCBhZGRvbl9sb3cpIHsKKwkJcmVzICs9IGludGVydmFsICsgYmFzZV9sb3cgLSBhZGRvbl9sb3c7CisJCXJlcyArPSAoMSA8PCBpbC0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKKwl9IGVsc2UKKwkJcmVzICs9ICgxIDw8IGlsLT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOworCisJcmV0dXJuIGNwdV90b19sZTMyKHJlcyk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2FkZF9iZWFjb25fdGltZSk7CisKKyNpZmRlZiBDT05GSUdfUE0KKworaW50CitpbF9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHN5c3RlbSBnb2VzIGludG8gc3VzcGVuZCBzdGF0ZQorCSAqIG1hYzgwMjExIHdpbGwgY2FsbCBpbF9tYWNfc3RvcCgpIGZyb20gdGhlIG1hYzgwMjExIHN1c3BlbmQgZnVuY3Rpb24KKwkgKiBmaXJzdCBidXQgc2luY2UgaWxfbWFjX3N0b3AoKSBoYXMgbm8ga25vd2xlZGdlIG9mIHdobyB0aGUgY2FsbGVyIGlzLAorCSAqIGl0IHdpbGwgbm90IGNhbGwgYXBtX29wcy5zdG9wKCkgdG8gc3RvcCB0aGUgRE1BIG9wZXJhdGlvbi4KKwkgKiBDYWxsaW5nIGFwbV9vcHMuc3RvcCBoZXJlIHRvIG1ha2Ugc3VyZSB3ZSBzdG9wIHRoZSBETUEuCisJICovCisJaWxfYXBtX3N0b3AoaWwpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3BjaV9zdXNwZW5kKTsKKworaW50CitpbF9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYm9vbCBod19yZmtpbGwgPSBmYWxzZTsKKworCS8qCisJICogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAorCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUuCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkdfUkVUUllfVElNRU9VVCwgMHgwMCk7CisKKwlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisKKwlpZiAoIShfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykpCisJCWh3X3Jma2lsbCA9IHRydWU7CisKKwlpZiAoaHdfcmZraWxsKQorCQlzZXRfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCWVsc2UKKwkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCisJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShpbC0+aHctPndpcGh5LCBod19yZmtpbGwpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3BjaV9yZXN1bWUpOworCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpbF9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBpbF9wY2lfc3VzcGVuZCwKKwkucmVzdW1lID0gaWxfcGNpX3Jlc3VtZSwKKwkuZnJlZXplID0gaWxfcGNpX3N1c3BlbmQsCisJLnRoYXcgPSBpbF9wY2lfcmVzdW1lLAorCS5wb3dlcm9mZiA9IGlsX3BjaV9zdXNwZW5kLAorCS5yZXN0b3JlID0gaWxfcGNpX3Jlc3VtZSwKK307CitFWFBPUlRfU1lNQk9MKGlsX3BtX29wcyk7CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHZvaWQKK2lsX3VwZGF0ZV9xb3Moc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICghY3R4LT5pc19hY3RpdmUpCisJCXJldHVybjsKKworCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyA9IDA7CisKKwlpZiAoY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlKQorCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MgfD0KKwkJICAgIFFPU19QQVJBTV9GTEdfVVBEQVRFX0VEQ0FfTVNLOworCisJaWYgKGN0eC0+aHQuZW5hYmxlZCkKKwkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzIHw9IFFPU19QQVJBTV9GTEdfVEdOX01TSzsKKworCURfUU9TKCJzZW5kIFFvUyBjbWQgd2l0aCBRb3MgYWN0aXZlPSVkIEZMQUdTPTB4JVhcbiIsCisJICAgICAgY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlLCBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MpOworCisJaWxfc2VuZF9jbWRfcGR1X2FzeW5jKGlsLCBjdHgtPnFvc19jbWQsIHNpemVvZihzdHJ1Y3QgaWxfcW9zcGFyYW1fY21kKSwKKwkJCSAgICAgICZjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybSwgTlVMTCk7Cit9CisKKy8qKgorICogaWxfbWFjX2NvbmZpZyAtIG1hYzgwMjExIGNvbmZpZyBjYWxsYmFjaworICovCitpbnQKK2lsX21hY19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbmYtPmNoYW5uZWw7CisJc3RydWN0IGlsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZpbC0+Y3VycmVudF9odF9jb25maWc7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IHJldCA9IDA7CisJdTE2IGNoOworCWludCBzY2FuX2FjdGl2ZSA9IDA7CisJYm9vbCBodF9jaGFuZ2VkID0gZmFsc2U7CisKKwlpZiAoV0FSTl9PTighaWwtPmNmZy0+b3BzLT5sZWdhY3kpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCisJRF9NQUM4MDIxMSgiZW50ZXIgdG8gY2hhbm5lbCAlZCBjaGFuZ2VkIDB4JVhcbiIsIGNoYW5uZWwtPmh3X3ZhbHVlLAorCQkgICBjaGFuZ2VkKTsKKworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykpKSB7CisJCXNjYW5fYWN0aXZlID0gMTsKKwkJRF9NQUM4MDIxMSgic2NhbiBhY3RpdmVcbiIpOworCX0KKworCWlmIChjaGFuZ2VkICYKKwkgICAgKElFRUU4MDIxMV9DT05GX0NIQU5HRV9TTVBTIHwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpKSB7CisJCS8qIG1hYzgwMjExIHVzZXMgc3RhdGljIGZvciBub24tSFQgd2hpY2ggaXMgd2hhdCB3ZSB3YW50ICovCisJCWlsLT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOworCisJCS8qCisJCSAqIFJlY2FsY3VsYXRlIGNoYWluIGNvdW50cy4KKwkJICoKKwkJICogSWYgbW9uaXRvciBtb2RlIGlzIGVuYWJsZWQgdGhlbiBtYWM4MDIxMSB3aWxsCisJCSAqIHNldCB1cCB0aGUgU00gUFMgbW9kZSB0byBPRkYgaWYgYW4gSFQgY2hhbm5lbCBpcworCQkgKiBjb25maWd1cmVkLgorCQkgKi8KKwkJaWYgKGlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCisJCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCAmaWwtPmN0eCk7CisJfQorCisJLyogZHVyaW5nIHNjYW5uaW5nIG1hYzgwMjExIHdpbGwgZGVsYXkgY2hhbm5lbCBzZXR0aW5nIHVudGlsCisJICogc2NhbiBmaW5pc2ggd2l0aCBjaGFuZ2VkID0gMAorCSAqLworCWlmICghY2hhbmdlZCB8fCAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKSkgeworCisJCWlmIChzY2FuX2FjdGl2ZSkKKwkJCWdvdG8gc2V0X2NoX291dDsKKworCQljaCA9IGNoYW5uZWwtPmh3X3ZhbHVlOworCQljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgY2hhbm5lbC0+YmFuZCwgY2gpOworCQlpZiAoIWlsX2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKKwkJCURfTUFDODAyMTEoImxlYXZlIC0gaW52YWxpZCBjaGFubmVsXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIHNldF9jaF9vdXQ7CisJCX0KKworCQlpZiAoaWwtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKKwkJICAgICFpbF9pc19jaGFubmVsX2lic3MoY2hfaW5mbykpIHsKKwkJCURfTUFDODAyMTEoImxlYXZlIC0gbm90IElCU1MgY2hhbm5lbFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBzZXRfY2hfb3V0OworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkJLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KKwkJaWYgKGN0eC0+aHQuZW5hYmxlZCAhPSBjb25mX2lzX2h0KGNvbmYpKSB7CisJCQljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOworCQkJaHRfY2hhbmdlZCA9IHRydWU7CisJCX0KKwkJaWYgKGN0eC0+aHQuZW5hYmxlZCkgeworCQkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgeworCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7CisJCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGNvbmZfaXNfaHQ0MF9wbHVzKGNvbmYpKSB7CisJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCSAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKKwkJCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCSAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOworCQkJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlCisJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CisKKwkJLyoKKwkJICogRGVmYXVsdCB0byBubyBwcm90ZWN0aW9uLiBQcm90ZWN0aW9uIG1vZGUgd2lsbAorCQkgKiBsYXRlciBiZSBzZXQgZnJvbSBCU1MgY29uZmlnIGluIGlsX2h0X2NvbmYKKwkJICovCisJCWN0eC0+aHQucHJvdGVjdGlvbiA9IElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fTk9ORTsKKworCQkvKiBpZiB3ZSBhcmUgc3dpdGNoaW5nIGZyb20gaHQgdG8gMi40IGNsZWFyIGZsYWdzCisJCSAqIGZyb20gYW55IGh0IHJlbGF0ZWQgaW5mbyBzaW5jZSAyLjQgZG9lcyBub3QKKwkJICogc3VwcG9ydCBodCAqLworCQlpZiAoKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSAhPSBjaCkpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOworCisJCWlsX3NldF9yeG9uX2NoYW5uZWwoaWwsIGNoYW5uZWwsIGN0eCk7CisJCWlsX3NldF9yeG9uX2h0KGlsLCBodF9jb25mKTsKKworCQlpbF9zZXRfZmxhZ3NfZm9yX2JhbmQoaWwsIGN0eCwgY2hhbm5lbC0+YmFuZCwgY3R4LT52aWYpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGlsLT5jZmctPm9wcy0+bGVnYWN5LT51cGRhdGVfYmNhc3Rfc3RhdGlvbnMpCisJCQlyZXQgPSBpbC0+Y2ZnLT5vcHMtPmxlZ2FjeS0+dXBkYXRlX2JjYXN0X3N0YXRpb25zKGlsKTsKKworc2V0X2NoX291dDoKKwkJLyogVGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHJhdGVzIGFuZCByYXRlIG1hc2sgY2FuIGJlIGRpZmZlcmVudAorCQkgKiBmb3IgZWFjaCBiYW5kOyBzaW5jZSB0aGUgYmFuZCBtYXkgaGF2ZSBjaGFuZ2VkLCByZXNldAorCQkgKiB0aGUgcmF0ZSBtYXNrIHRvIHdoYXQgbWFjODAyMTEgbGlzdHMgKi8KKwkJaWxfc2V0X3JhdGUoaWwpOworCX0KKworCWlmIChjaGFuZ2VkICYgKElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUyB8IElFRUU4MDIxMV9DT05GX0NIQU5HRV9JRExFKSkgeworCQlyZXQgPSBpbF9wb3dlcl91cGRhdGVfbW9kZShpbCwgZmFsc2UpOworCQlpZiAocmV0KQorCQkJRF9NQUM4MDIxMSgiRXJyb3Igc2V0dGluZyBzbGVlcCBsZXZlbFxuIik7CisJfQorCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUE9XRVIpIHsKKwkJRF9NQUM4MDIxMSgiVFggUG93ZXIgb2xkPSVkIG5ldz0lZFxuIiwgaWwtPnR4X3Bvd2VyX3VzZXJfbG10LAorCQkJICAgY29uZi0+cG93ZXJfbGV2ZWwpOworCisJCWlsX3NldF90eF9wb3dlcihpbCwgY29uZi0+cG93ZXJfbGV2ZWwsIGZhbHNlKTsKKwl9CisKKwlpZiAoIWlsX2lzX3JlYWR5KGlsKSkgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIG5vdCByZWFkeVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzY2FuX2FjdGl2ZSkKKwkJZ290byBvdXQ7CisKKwlpZiAobWVtY21wKCZjdHgtPmFjdGl2ZSwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKGN0eC0+c3RhZ2luZykpKQorCQlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKKwllbHNlCisJCURfSU5GTygiTm90IHJlLXNlbmRpbmcgc2FtZSBSWE9OIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwlpZiAoaHRfY2hhbmdlZCkKKwkJaWxfdXBkYXRlX3FvcyhpbCwgY3R4KTsKKworb3V0OgorCURfTUFDODAyMTEoImxlYXZlXG4iKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX2NvbmZpZyk7CisKK3ZvaWQKK2lsX21hY19yZXNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCWlmIChXQVJOX09OKCFpbC0+Y2ZnLT5vcHMtPmxlZ2FjeSkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJbWVtc2V0KCZpbC0+Y3VycmVudF9odF9jb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgaWxfaHRfY29uZmlnKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogbmV3IGFzc29jaWF0aW9uIGdldCByaWQgb2YgaWJzcyBiZWFjb24gc2tiICovCisJaWYgKGlsLT5iZWFjb25fc2tiKQorCQlkZXZfa2ZyZWVfc2tiKGlsLT5iZWFjb25fc2tiKTsKKworCWlsLT5iZWFjb25fc2tiID0gTlVMTDsKKworCWlsLT50aW1lc3RhbXAgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDEwMCk7CisJaWYgKCFpbF9pc19yZWFkeV9yZihpbCkpIHsKKwkJRF9NQUM4MDIxMSgibGVhdmUgLSBub3QgcmVhZHlcbiIpOworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwkvKiB3ZSBhcmUgcmVzdGFydGluZyBhc3NvY2lhdGlvbiBwcm9jZXNzCisJICogY2xlYXIgUlhPTl9GSUxURVJfQVNTT0NfTVNLIGJpdAorCSAqLworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKwlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKKworCWlsX3NldF9yYXRlKGlsKTsKKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX3Jlc2V0X3RzZik7CisKK3N0YXRpYyB2b2lkCitpbF9odF9jb25mKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfaHRfY29uZmlnICpodF9jb25mID0gJmlsLT5jdXJyZW50X2h0X2NvbmZpZzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOworCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mID0gJnZpZi0+YnNzX2NvbmY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKworCURfQVNTT0MoImVudGVyOlxuIik7CisKKwlpZiAoIWN0eC0+aHQuZW5hYmxlZCkKKwkJcmV0dXJuOworCisJY3R4LT5odC5wcm90ZWN0aW9uID0KKwkgICAgYnNzX2NvbmYtPmh0X29wZXJhdGlvbl9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTjsKKwljdHgtPmh0Lm5vbl9nZl9zdGFfcHJlc2VudCA9CisJICAgICEhKGJzc19jb25mLT4KKwkgICAgICAgaHRfb3BlcmF0aW9uX21vZGUgJiBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fR0ZfU1RBX1BSU05UKTsKKworCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gZmFsc2U7CisKKwlzd2l0Y2ggKHZpZi0+dHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJcmN1X3JlYWRfbG9jaygpOworCQlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEodmlmLCBic3NfY29uZi0+YnNzaWQpOworCQlpZiAoc3RhKSB7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKKwkJCWludCBtYXhzdHJlYW1zOworCisJCQltYXhzdHJlYW1zID0KKwkJCSAgICAoaHRfY2FwLT5tY3MuCisJCQkgICAgIHR4X3BhcmFtcyAmIElFRUU4MDIxMV9IVF9NQ1NfVFhfTUFYX1NUUkVBTVNfTUFTSykKKwkJCSAgICA+PiBJRUVFODAyMTFfSFRfTUNTX1RYX01BWF9TVFJFQU1TX1NISUZUOworCQkJbWF4c3RyZWFtcyArPSAxOworCisJCQlpZiAoaHRfY2FwLT5tY3MucnhfbWFza1sxXSA9PSAwICYmCisJCQkgICAgaHRfY2FwLT5tY3MucnhfbWFza1syXSA9PSAwKQorCQkJCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKKwkJCWlmIChtYXhzdHJlYW1zIDw9IDEpCisJCQkJaHRfY29uZi0+c2luZ2xlX2NoYWluX3N1ZmZpY2llbnQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIGF0IGFsbCwgdGhpcyBjYW4gb25seSBoYXBwZW4gdGhyb3VnaCBhIHJhY2UKKwkJCSAqIHdoZW4gdGhlIEFQIGRpc2Nvbm5lY3RzIHVzIHdoaWxlIHdlJ3JlIHN0aWxsCisJCQkgKiBzZXR0aW5nIHVwIHRoZSBjb25uZWN0aW9uLCBpbiB0aGF0IGNhc2UgbWFjODAyMTEKKwkJCSAqIHdpbGwgc29vbiB0ZWxsIHVzIGFib3V0IHRoYXQuCisJCQkgKi8KKwkJCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJaHRfY29uZi0+c2luZ2xlX2NoYWluX3N1ZmZpY2llbnQgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlEX0FTU09DKCJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfc2V0X25vX2Fzc29jKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSBpbF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOworCisJLyoKKwkgKiBpbmZvcm0gdGhlIHVjb2RlIHRoYXQgdGhlcmUgaXMgbm8gbG9uZ2VyIGFuCisJICogYXNzb2NpYXRpb24gYW5kIHRoYXQgbm8gbW9yZSBwYWNrZXRzIHNob3VsZCBiZQorCSAqIHNlbnQKKwkgKi8KKwljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gMDsKKwlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKK30KKworc3RhdGljIHZvaWQKK2lsX2JlYWNvbl91cGRhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX2xlNjQgdGltZXN0YW1wOworCXN0cnVjdCBza19idWZmICpza2IgPSBpZWVlODAyMTFfYmVhY29uX2dldChodywgdmlmKTsKKworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKCFpbC0+YmVhY29uX2N0eCkgeworCQlJTF9FUlIoInVwZGF0ZSBiZWFjb24gYnV0IG5vIGJlYWNvbiBjb250ZXh0IVxuIik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGlsLT5iZWFjb25fc2tiKQorCQlkZXZfa2ZyZWVfc2tiKGlsLT5iZWFjb25fc2tiKTsKKworCWlsLT5iZWFjb25fc2tiID0gc2tiOworCisJdGltZXN0YW1wID0gKChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilza2ItPmRhdGEpLT51LmJlYWNvbi50aW1lc3RhbXA7CisJaWwtPnRpbWVzdGFtcCA9IGxlNjRfdG9fY3B1KHRpbWVzdGFtcCk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKSB7CisJCURfTUFDODAyMTEoImxlYXZlIC0gUkYgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlsLT5jZmctPm9wcy0+bGVnYWN5LT5wb3N0X2Fzc29jaWF0ZShpbCk7Cit9CisKK3ZvaWQKK2lsX21hY19ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYsIHUzMiBjaGFuZ2VzKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisJaW50IHJldDsKKworCWlmIChXQVJOX09OKCFpbC0+Y2ZnLT5vcHMtPmxlZ2FjeSkpCisJCXJldHVybjsKKworCURfTUFDODAyMTEoImNoYW5nZXMgPSAweCVYXG4iLCBjaGFuZ2VzKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkgeworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX1FPUykgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCQljdHgtPnFvc19kYXRhLnFvc19hY3RpdmUgPSBic3NfY29uZi0+cW9zOworCQlpbF91cGRhdGVfcW9zKGlsLCBjdHgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCX0KKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpIHsKKwkJLyoKKwkJICogdGhlIGFkZF9pbnRlcmZhY2UgY29kZSBtdXN0IG1ha2Ugc3VyZSB3ZSBvbmx5IGV2ZXIKKwkJICogaGF2ZSBhIHNpbmdsZSBpbnRlcmZhY2UgdGhhdCBjb3VsZCBiZSBiZWFjb25pbmcgYXQKKwkJICogYW55IHRpbWUuCisJCSAqLworCQlpZiAodmlmLT5ic3NfY29uZi5lbmFibGVfYmVhY29uKQorCQkJaWwtPmJlYWNvbl9jdHggPSBjdHg7CisJCWVsc2UKKwkJCWlsLT5iZWFjb25fY3R4ID0gTlVMTDsKKwl9CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JTU0lEKSB7CisJCURfTUFDODAyMTEoIkJTU0lEICVwTVxuIiwgYnNzX2NvbmYtPmJzc2lkKTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBjdXJyZW50bHkgYSBIVyBzY2FuIGdvaW5nIG9uIGluIHRoZQorCQkgKiBiYWNrZ3JvdW5kIHRoZW4gd2UgbmVlZCB0byBjYW5jZWwgaXQgZWxzZSB0aGUgUlhPTgorCQkgKiBiZWxvdy9pbiBwb3N0X2Fzc29jaWF0ZSB3aWxsIGZhaWwuCisJCSAqLworCQlpZiAoaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMTAwKSkgeworCQkJSUxfV0FSTigiQWJvcnRlZCBzY2FuIHN0aWxsIGluIHByb2dyZXNzIGFmdGVyIDEwMG1zXG4iKTsKKwkJCURfTUFDODAyMTEoImxlYXZpbmcgLSBzY2FuIGFib3J0IGZhaWxlZC5cbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogbWFjODAyMTEgb25seSBzZXRzIGFzc29jIHdoZW4gaW4gU1RBVElPTiBtb2RlICovCisJCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwgYnNzX2NvbmYtPmFzc29jKSB7CisJCQltZW1jcHkoY3R4LT5zdGFnaW5nLmJzc2lkX2FkZHIsIGJzc19jb25mLT5ic3NpZCwKKwkJCSAgICAgICBFVEhfQUxFTik7CisKKwkJCS8qIGN1cnJlbnRseSBuZWVkZWQgaW4gYSBmZXcgcGxhY2VzICovCisJCQltZW1jcHkoaWwtPmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJfSBlbHNlIHsKKwkJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKwkJfQorCisJfQorCisJLyoKKwkgKiBUaGlzIG5lZWRzIHRvIGJlIGFmdGVyIHNldHRpbmcgdGhlIEJTU0lEIGluIGNhc2UKKwkgKiBtYWM4MDIxMSBkZWNpZGVzIHRvIGRvIGJvdGggY2hhbmdlcyBhdCBvbmNlIGJlY2F1c2UKKwkgKiBpdCB3aWxsIGludm9rZSBwb3N0X2Fzc29jaWF0ZS4KKwkgKi8KKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkVBQ09OKSkKKwkJaWxfYmVhY29uX3VwZGF0ZShodywgdmlmKTsKKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfRVJQX1BSRUFNQkxFKSB7CisJCURfTUFDODAyMTEoIkVSUF9QUkVBTUJMRSAlZFxuIiwgYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSk7CisJCWlmIChic3NfY29uZi0+dXNlX3Nob3J0X3ByZWFtYmxlKQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKwkJZWxzZQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9FUlBfQ1RTX1BST1QpIHsKKwkJRF9NQUM4MDIxMSgiRVJQX0NUUyAlZFxuIiwgYnNzX2NvbmYtPnVzZV9jdHNfcHJvdCk7CisJCWlmIChic3NfY29uZi0+dXNlX2N0c19wcm90ICYmIGlsLT5iYW5kICE9IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLOworCQllbHNlCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKKwkJaWYgKGJzc19jb25mLT51c2VfY3RzX3Byb3QpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0VMRl9DVFNfRU47CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0VMRl9DVFNfRU47CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CQVNJQ19SQVRFUykgeworCQkvKiBYWFggdXNlIHRoaXMgaW5mb3JtYXRpb24KKwkJICoKKwkJICogVG8gZG8gdGhhdCwgcmVtb3ZlIGNvZGUgZnJvbSBpbF9zZXRfcmF0ZSgpIGFuZCBwdXQgc29tZXRoaW5nCisJCSAqIGxpa2UgdGhpcyBoZXJlOgorCQkgKgorCQkgaWYgKEEtYmFuZCkKKwkJIGN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KKwkJIGJzc19jb25mLT5iYXNpY19yYXRlczsKKwkJIGVsc2UKKwkJIGN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KKwkJIGJzc19jb25mLT5iYXNpY19yYXRlcyA+PiA0OworCQkgY3R4LT5zdGFnaW5nLmNja19iYXNpY19yYXRlcyA9CisJCSBic3NfY29uZi0+YmFzaWNfcmF0ZXMgJiAweEY7CisJCSAqLworCX0KKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfSFQpIHsKKwkJaWxfaHRfY29uZihpbCwgdmlmKTsKKworCQlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKKwkJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9BU1NPQykgeworCQlEX01BQzgwMjExKCJBU1NPQyAlZFxuIiwgYnNzX2NvbmYtPmFzc29jKTsKKwkJaWYgKGJzc19jb25mLT5hc3NvYykgeworCQkJaWwtPnRpbWVzdGFtcCA9IGJzc19jb25mLT50aW1lc3RhbXA7CisKKwkJCWlmICghaWxfaXNfcmZraWxsKGlsKSkKKwkJCQlpbC0+Y2ZnLT5vcHMtPmxlZ2FjeS0+cG9zdF9hc3NvY2lhdGUoaWwpOworCQl9IGVsc2UKKwkJCWlsX3NldF9ub19hc3NvYyhpbCwgdmlmKTsKKwl9CisKKwlpZiAoY2hhbmdlcyAmJiBpbF9pc19hc3NvY2lhdGVkX2N0eChjdHgpICYmIGJzc19jb25mLT5haWQpIHsKKwkJRF9NQUM4MDIxMSgiQ2hhbmdlcyAoJSN4KSB3aGlsZSBhc3NvY2lhdGVkXG4iLCBjaGFuZ2VzKTsKKwkJcmV0ID0gaWxfc2VuZF9yeG9uX2Fzc29jKGlsLCBjdHgpOworCQlpZiAoIXJldCkgeworCQkJLyogU3luYyBhY3RpdmVfcnhvbiB3aXRoIGxhdGVzdCBjaGFuZ2UuICovCisJCQltZW1jcHkoKHZvaWQgKikmY3R4LT5hY3RpdmUsICZjdHgtPnN0YWdpbmcsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9yeG9uX2NtZCkpOworCQl9CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCkgeworCQlpZiAodmlmLT5ic3NfY29uZi5lbmFibGVfYmVhY29uKSB7CisJCQltZW1jcHkoY3R4LT5zdGFnaW5nLmJzc2lkX2FkZHIsIGJzc19jb25mLT5ic3NpZCwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCQltZW1jcHkoaWwtPmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJCWlsLT5jZmctPm9wcy0+bGVnYWN5LT5jb25maWdfYXAoaWwpOworCQl9IGVsc2UKKwkJCWlsX3NldF9ub19hc3NvYyhpbCwgdmlmKTsKKwl9CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0lCU1MpIHsKKwkJcmV0ID0KKwkJICAgIGlsLT5jZmctPm9wcy0+bGVnYWN5LT5tYW5hZ2VfaWJzc19zdGF0aW9uKGlsLCB2aWYsCisJCQkJCQkJICAgICAgYnNzX2NvbmYtPgorCQkJCQkJCSAgICAgIGlic3Nfam9pbmVkKTsKKwkJaWYgKHJldCkKKwkJCUlMX0VSUigiZmFpbGVkIHRvICVzIElCU1Mgc3RhdGlvbiAlcE1cbiIsCisJCQkgICAgICAgYnNzX2NvbmYtPmlic3Nfam9pbmVkID8gImFkZCIgOiAicmVtb3ZlIiwKKwkJCSAgICAgICBic3NfY29uZi0+YnNzaWQpOworCX0KKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX2Jzc19pbmZvX2NoYW5nZWQpOworCitpcnFyZXR1cm5fdAoraWxfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGF0YTsKKwl1MzIgaW50YSwgaW50YV9tYXNrOworCXUzMiBpbnRhX2ZoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWYgKCFpbCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIChidXQgZG9uJ3QgY2xlYXIhKSBpbnRlcnJ1cHRzIGhlcmUgdG8gYXZvaWQKKwkgKiAgICBiYWNrLXRvLWJhY2sgSVNScyBhbmQgc3BvcmFkaWMgaW50ZXJydXB0cyBmcm9tIG91ciBOSUMuCisJICogSWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gc2VydmljZSwgdGhlIHRhc2tsZXQgd2lsbCByZS1lbmFibGUgaW50cy4KKwkgKiBJZiB3ZSAqZG9uJ3QqIGhhdmUgc29tZXRoaW5nLCB3ZSdsbCByZS1lbmFibGUgYmVmb3JlIGxlYXZpbmcgaGVyZS4gKi8KKwlpbnRhX21hc2sgPSBfaWxfcmQoaWwsIENTUl9JTlRfTUFTSyk7CS8qIGp1c3QgZm9yIGRlYnVnICovCisJX2lsX3dyKGlsLCBDU1JfSU5UX01BU0ssIDB4MDAwMDAwMDApOworCisJLyogRGlzY292ZXIgd2hpY2ggaW50ZXJydXB0cyBhcmUgYWN0aXZlL3BlbmRpbmcgKi8KKwlpbnRhID0gX2lsX3JkKGlsLCBDU1JfSU5UKTsKKwlpbnRhX2ZoID0gX2lsX3JkKGlsLCBDU1JfRkhfSU5UX1NUQVRVUyk7CisKKwkvKiBJZ25vcmUgaW50ZXJydXB0IGlmIHRoZXJlJ3Mgbm90aGluZyBpbiBOSUMgdG8gc2VydmljZS4KKwkgKiBUaGlzIG1heSBiZSBkdWUgdG8gSVJRIHNoYXJlZCB3aXRoIGFub3RoZXIgZGV2aWNlLAorCSAqIG9yIGR1ZSB0byBzcG9yYWRpYyBpbnRlcnJ1cHRzIHRocm93biBmcm9tIG91ciBOSUMuICovCisJaWYgKCFpbnRhICYmICFpbnRhX2ZoKSB7CisJCURfSVNSKCJJZ25vcmUgaW50ZXJydXB0LCBpbnRhID09IDAsIGludGFfZmggPT0gMFxuIik7CisJCWdvdG8gbm9uZTsKKwl9CisKKwlpZiAoaW50YSA9PSAweEZGRkZGRkZGIHx8IChpbnRhICYgMHhGRkZGRkZGMCkgPT0gMHhhNWE1YTVhMCkgeworCQkvKiBIYXJkd2FyZSBkaXNhcHBlYXJlZC4gSXQgbWlnaHQgaGF2ZSBhbHJlYWR5IHJhaXNlZAorCQkgKiBhbiBpbnRlcnJ1cHQgKi8KKwkJSUxfV0FSTigiSEFSRFdBUkUgR09ORT8/IElOVEEgPT0gMHglMDh4XG4iLCBpbnRhKTsKKwkJZ290byB1bnBsdWdnZWQ7CisJfQorCisJRF9JU1IoIklTUiBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eFxuIiwgaW50YSwgaW50YV9tYXNrLAorCSAgICAgIGludGFfZmgpOworCisJaW50YSAmPSB+Q1NSX0lOVF9CSVRfU0NEOworCisJLyogaWxfaXJxX3Rhc2tsZXQoKSB3aWxsIHNlcnZpY2UgaW50ZXJydXB0cyBhbmQgcmUtZW5hYmxlIHRoZW0gKi8KKwlpZiAobGlrZWx5KGludGEgfHwgaW50YV9maCkpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmlsLT5pcnFfdGFza2xldCk7CisKK3VucGx1Z2dlZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKKworbm9uZToKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc2VydmljZS4gKi8KKwkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEgKi8KKwlpZiAodGVzdF9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpKQorCQlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2lzcik7CisKKy8qCisgKiAgaWxfdHhfY21kX3Byb3RlY3Rpb246IFNldCBydHMvY3RzLiAzOTQ1IGFuZCA0OTY1IG9ubHkgc2hhcmUgdGhpcworICogIGZ1bmN0aW9uLgorICovCit2b2lkCitpbF90eF9jbWRfcHJvdGVjdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJICAgICBfX2xlMTYgZmMsIF9fbGUzMiAqdHhfZmxhZ3MpCit7CisJaWYgKGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpIHsKKwkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfUlRTX01TSzsKKwkJKnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX0NUU19NU0s7CisJCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX0ZVTExfVFhPUF9QUk9UX01TSzsKKworCQlpZiAoIWllZWU4MDIxMV9pc19tZ210KGZjKSkKKwkJCXJldHVybjsKKworCQlzd2l0Y2ggKGZjICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfU1RZUEUpKSB7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOgorCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOgorCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOgorCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUSk6CisJCQkqdHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfUlRTX01TSzsKKwkJCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX0NUU19NU0s7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS4KKwkJICAgZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUKSB7CisJCSp0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19SVFNfTVNLOworCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19DVFNfTVNLOworCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19GVUxMX1RYT1BfUFJPVF9NU0s7CisJfQorfQorRVhQT1JUX1NZTUJPTChpbF90eF9jbWRfcHJvdGVjdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzBiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uaApAQCAtMCwwICsxLDM0MjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX2lsX2NvcmVfaF9fCisjZGVmaW5lIF9faWxfY29yZV9oX18KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkJLyogZm9yIHN0cnVjdCBwY2lfZGV2aWNlX2lkICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CisKKyNpbmNsdWRlICJjb21tYW5kcy5oIgorI2luY2x1ZGUgImNzci5oIgorI2luY2x1ZGUgInBycGguaCIKKworc3RydWN0IGlsX2hvc3RfY21kOworc3RydWN0IGlsX2NtZDsKK3N0cnVjdCBpbF90eF9xdWV1ZTsKKworI2RlZmluZSBJTF9FUlIoZiwgYS4uLikgZGV2X2VycigmaWwtPnBjaV9kZXYtPmRldiwgZiwgIyMgYSkKKyNkZWZpbmUgSUxfV0FSTihmLCBhLi4uKSBkZXZfd2FybigmaWwtPnBjaV9kZXYtPmRldiwgZiwgIyMgYSkKKyNkZWZpbmUgSUxfSU5GTyhmLCBhLi4uKSBkZXZfaW5mbygmaWwtPnBjaV9kZXYtPmRldiwgZiwgIyMgYSkKKworI2RlZmluZSBSWF9RVUVVRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBSWF9RVUVVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDI1NQorI2RlZmluZSBSWF9RVUVVRV9TSVpFX0xPRyAgICAgICAgICAgICAgICAgICAgIDgKKworLyoKKyAqIFJYIHJlbGF0ZWQgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgUlhfRlJFRV9CVUZGRVJTIDY0CisjZGVmaW5lIFJYX0xPV19XQVRFUk1BUksgOAorCisjZGVmaW5lIFUzMl9QQUQobikJCSgoNC0obikpJjB4MykKKworLyogQ1QtS0lMTCBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ1RfS0lMTF9USFJFU0hPTERfTEVHQUNZICAgMTEwCS8qIGluIENlbHNpdXMgKi8KKworLyogRGVmYXVsdCBub2lzZSBsZXZlbCB0byByZXBvcnQgd2hlbiBub2lzZSBtZWFzdXJlbWVudCBpcyBub3QgYXZhaWxhYmxlLgorICogICBUaGlzIG1heSBiZSBiZWNhdXNlIHdlJ3JlOgorICogICAxKSAgTm90IGFzc29jaWF0ZWQgKDQ5NjUsIG5vIGJlYWNvbiBzdGF0cyBiZWluZyBzZW50IHRvIGRyaXZlcikKKyAqICAgMikgIFNjYW5uaW5nIChub2lzZSBtZWFzdXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBhc3NvY2lhdGVkIGNoYW5uZWwpCisgKiAgIDMpICBSZWNlaXZpbmcgQ0NLICgzOTQ1IGRlbGl2ZXJzIG5vaXNlIGluZm8gb25seSBmb3IgT0ZETSBmcmFtZXMpCisgKiBVc2UgZGVmYXVsdCBub2lzZSB2YWx1ZSBvZiAtMTI3IC4uLiB0aGlzIGlzIGJlbG93IHRoZSByYW5nZSBvZiBtZWFzdXJhYmxlCisgKiAgIFJ4IGRCbSBmb3IgZWl0aGVyIDM5NDUgb3IgNDk2NSwgc28gaXQgY2FuIGluZGljYXRlICJ1bm1lYXN1cmFibGUiIHRvIHVzZXIuCisgKiAgIEFsc28sIC0xMjcgd29ya3MgYmV0dGVyIHRoYW4gMCB3aGVuIGF2ZXJhZ2luZyBmcmFtZXMgd2l0aC93aXRob3V0CisgKiAgIG5vaXNlIGluZm8gKGUuZy4gYXZlcmFnaW5nIG1pZ2h0IGJlIGRvbmUgaW4gYXBwKTsgbWVhc3VyZWQgZEJtIHZhbHVlcyBhcmUKKyAqICAgYWx3YXlzIG5lZ2F0aXZlIC4uLiB1c2luZyBhIG5lZ2F0aXZlIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGtlZXBzIGFsbAorICogICBhdmVyYWdlcyB3aXRoaW4gYW4gczgncyAodXNlZCBpbiBzb21lIGFwcHMpIHJhbmdlIG9mIG5lZ2F0aXZlIHZhbHVlcy4gKi8KKyNkZWZpbmUgSUxfTk9JU0VfTUVBU19OT1RfQVZBSUxBQkxFICgtMTI3KQorCisvKgorICogUlRTIHRocmVzaG9sZCBoZXJlIGlzIHRvdGFsIHNpemUgWzIzNDddIG1pbnVzIDQgRkNTIGJ5dGVzCisgKiBQZXIgc3BlYzoKKyAqICAgYSB2YWx1ZSBvZiAwIG1lYW5zIFJUUyBvbiBhbGwgZGF0YS9tYW5hZ2VtZW50IHBhY2tldHMKKyAqICAgYSB2YWx1ZSA+IG1heCBNU0RVIHNpemUgbWVhbnMgbm8gUlRTCisgKiBlbHNlIFJUUyBmb3IgZGF0YS9tYW5hZ2VtZW50IGZyYW1lcyB3aGVyZSBNUERVIGlzIGxhcmdlcgorICogICB0aGFuIFJUUyB2YWx1ZS4KKyAqLworI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgICAgIDIzNDdVCisjZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEICAgICAgICAgMFUKKyNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAyMzQ3VQorI2RlZmluZSBNQVhfTVNEVV9TSVpFCQkgIDIzMDRVCisjZGVmaW5lIE1BWF9NUERVX1NJWkUJCSAgMjM0NlUKKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwgICAxMDBVCisjZGVmaW5lCURFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQgN1UKKyNkZWZpbmUJREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUICA0VQorCitzdHJ1Y3QgaWxfcnhfYnVmIHsKKwlkbWFfYWRkcl90IHBhZ2VfZG1hOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgcnhiX2FkZHIocikgcGFnZV9hZGRyZXNzKHItPnBhZ2UpCisKKy8qIGRlZmluZWQgYmVsb3cgKi8KK3N0cnVjdCBpbF9kZXZpY2VfY21kOworCitzdHJ1Y3QgaWxfY21kX21ldGEgeworCS8qIG9ubHkgZm9yIFNZTkMgY29tbWFuZHMsIGlmZiB0aGUgcmVwbHkgc2tiIGlzIHdhbnRlZCAqLworCXN0cnVjdCBpbF9ob3N0X2NtZCAqc291cmNlOworCS8qCisJICogb25seSBmb3IgQVNZTkMgY29tbWFuZHMKKwkgKiAod2hpY2ggaXMgc29tZXdoYXQgc3R1cGlkIC0tIGxvb2sgYXQgY29tbW9uLmMgZm9yIGluc3RhbmNlCisJICogd2hpY2ggZHVwbGljYXRlcyBhIGJ1bmNoIG9mIGNvZGUgYmVjYXVzZSB0aGUgY2FsbGJhY2sgaXNuJ3QKKwkgKiBpbnZva2VkIGZvciBTWU5DIGNvbW1hbmRzLCBpZiBpdCB3ZXJlIGFuZCBpdHMgcmVzdWx0IHBhc3NlZAorCSAqIHRocm91Z2ggaXQgd291bGQgYmUgc2ltcGxlci4uLikKKwkgKi8KKwl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9kZXZpY2VfY21kICpjbWQsCisJCQkgIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCk7CisKKwkvKiBUaGUgQ01EX1NJWkVfSFVHRSBmbGFnIGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZAorCSAqIHN0cnVjdHVyZSBpcyBzdG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2hhcmVkIHF1ZXVlIG1lbW9yeS4gKi8KKwl1MzIgZmxhZ3M7CisKKwkgREVGSU5FX0RNQV9VTk1BUF9BRERSKG1hcHBpbmcpOworCSBERUZJTkVfRE1BX1VOTUFQX0xFTihsZW4pOworfTsKKworLyoKKyAqIEdlbmVyaWMgcXVldWUgc3RydWN0dXJlCisgKgorICogQ29udGFpbnMgY29tbW9uIGRhdGEgZm9yIFJ4IGFuZCBUeCBxdWV1ZXMKKyAqLworc3RydWN0IGlsX3F1ZXVlIHsKKwlpbnQgbl9iZDsJCS8qIG51bWJlciBvZiBCRHMgaW4gdGhpcyBxdWV1ZSAqLworCWludCB3cml0ZV9wdHI7CQkvKiAxLXN0IGVtcHR5IGVudHJ5IChpZHgpIGhvc3RfdyAqLworCWludCByZWFkX3B0cjsJCS8qIGxhc3QgdXNlZCBlbnRyeSAoaWR4KSBob3N0X3IgKi8KKwkvKiB1c2UgZm9yIG1vbml0b3JpbmcgYW5kIHJlY292ZXJpbmcgdGhlIHN0dWNrIHF1ZXVlICovCisJZG1hX2FkZHJfdCBkbWFfYWRkcjsJLyogcGh5c2ljYWwgYWRkciBmb3IgQkQncyAqLworCWludCBuX3dpbjsJCS8qIHNhZmUgcXVldWUgd2luICovCisJdTMyIGlkOworCWludCBsb3dfbWFyazsJCS8qIGxvdyB3YXRlcm1hcmssIHJlc3VtZSBxdWV1ZSBpZiBmcmVlCisJCQkJICogc3BhY2UgbW9yZSB0aGFuIHRoaXMgKi8KKwlpbnQgaGlnaF9tYXJrOwkJLyogaGlnaCB3YXRlcm1hcmssIHN0b3AgcXVldWUgaWYgZnJlZQorCQkJCSAqIHNwYWNlIGxlc3MgdGhhbiB0aGlzICovCit9OworCisvKiBPbmUgZm9yIGVhY2ggVEZEICovCitzdHJ1Y3QgaWxfdHhfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7Cit9OworCisvKioKKyAqIHN0cnVjdCBpbF90eF9xdWV1ZSAtIFR4IFF1ZXVlIGZvciBETUEKKyAqIEBxOiBnZW5lcmljIFJ4L1R4IHF1ZXVlIGRlc2NyaXB0b3IKKyAqIEBiZDogYmFzZSBvZiBjaXJjdWxhciBidWZmZXIgb2YgVEZEcworICogQGNtZDogYXJyYXkgb2YgY29tbWFuZC9UWCBidWZmZXIgcG9pbnRlcnMKKyAqIEBtZXRhOiBhcnJheSBvZiBtZXRhIGRhdGEgZm9yIGVhY2ggY29tbWFuZC90eCBidWZmZXIKKyAqIEBkbWFfYWRkcl9jbWQ6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgY21kL3R4IGJ1ZmZlciBhcnJheQorICogQHR4YjogYXJyYXkgb2YgcGVyLVRGRCBkcml2ZXIgZGF0YQorICogQHRpbWVfc3RhbXA6IHRpbWUgKGluIGppZmZpZXMpIG9mIGxhc3QgcmVhZF9wdHIgY2hhbmdlCisgKiBAbmVlZF91cGRhdGU6IGluZGljYXRlcyBuZWVkIHRvIHVwZGF0ZSByZWFkL3dyaXRlIGlkeAorICogQHNjaGVkX3JldHJ5OiBpbmRpY2F0ZXMgcXVldWUgaXMgaGlnaC10aHJvdWdocHV0IGFnZ3JlZ2F0aW9uIChIVCBBR0cpIGVuYWJsZWQKKyAqCisgKiBBIFR4IHF1ZXVlIGNvbnNpc3RzIG9mIGNpcmN1bGFyIGJ1ZmZlciBvZiBCRHMgKGEuay5hLiBURkRzLCB0cmFuc21pdCBmcmFtZQorICogZGVzY3JpcHRvcnMpIGFuZCByZXF1aXJlZCBsb2NraW5nIHN0cnVjdHVyZXMuCisgKi8KKyNkZWZpbmUgVEZEX1RYX0NNRF9TTE9UUyAyNTYKKyNkZWZpbmUgVEZEX0NNRF9TTE9UUyAzMgorCitzdHJ1Y3QgaWxfdHhfcXVldWUgeworCXN0cnVjdCBpbF9xdWV1ZSBxOworCXZvaWQgKnRmZHM7CisJc3RydWN0IGlsX2RldmljZV9jbWQgKipjbWQ7CisJc3RydWN0IGlsX2NtZF9tZXRhICptZXRhOworCXN0cnVjdCBpbF90eF9pbmZvICp0eGI7CisJdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOworCXU4IG5lZWRfdXBkYXRlOworCXU4IHNjaGVkX3JldHJ5OworCXU4IGFjdGl2ZTsKKwl1OCBzd3FfaWQ7Cit9OworCisvKgorICogRUVQUk9NIGFjY2VzcyB0aW1lIHZhbHVlczoKKyAqCisgKiBEcml2ZXIgaW5pdGlhdGVzIEVFUFJPTSByZWFkIGJ5IHdyaXRpbmcgYnl0ZSBhZGRyZXNzIDw8IDEgdG8gQ1NSX0VFUFJPTV9SRUcuCisgKiBEcml2ZXIgdGhlbiBwb2xscyBDU1JfRUVQUk9NX1JFRyBmb3IgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0sgKDB4MSkuCisgKiBXaGVuIHBvbGxpbmcsIHdhaXQgMTAgdVNlYyBiZXR3ZWVuIHBvbGxpbmcgbG9vcHMsIHVwIHRvIGEgbWF4aW11bSA1MDAwIHVTZWMuCisgKiBEcml2ZXIgcmVhZHMgMTYtYml0IHZhbHVlIGZyb20gYml0cyAzMS0xNiBvZiBDU1JfRUVQUk9NX1JFRy4KKyAqLworI2RlZmluZSBJTF9FRVBST01fQUNDRVNTX1RJTUVPVVQJNTAwMAkvKiB1U2VjICovCisKKyNkZWZpbmUgSUxfRUVQUk9NX1NFTV9USU1FT1VUCQkxMAkvKiBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgSUxfRUVQUk9NX1NFTV9SRVRSWV9MSU1JVAkxMDAwCS8qIG51bWJlciBvZiBhdHRlbXB0cyAobm90IHRpbWUpICovCisKKy8qCisgKiBSZWd1bGF0b3J5IGNoYW5uZWwgdXNhZ2UgZmxhZ3MgaW4gRUVQUk9NIHN0cnVjdCBpbDQ5NjVfZWVwcm9tX2NoYW5uZWwuZmxhZ3MuCisgKgorICogSUJTUyBhbmQvb3IgQVAgb3BlcmF0aW9uIGlzIGFsbG93ZWQgKm9ubHkqIG9uIHRob3NlIGNoYW5uZWxzIHdpdGgKKyAqIChWQUxJRCAmJiBJQlNTICYmIEFDVElWRSAmJiAhUkFEQVIpLiAgVGhpcyByZXN0cmljdGlvbiBpcyBpbiBwbGFjZSBiZWNhdXNlCisgKiBSQURBUiBkZXRlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgNDk2NSBkcml2ZXIsIGJ1dCBpcyBhCisgKiByZXF1aXJlbWVudCBmb3IgZXN0YWJsaXNoaW5nIGEgbmV3IG5ldHdvcmsgZm9yIGxlZ2FsIG9wZXJhdGlvbiBvbiBjaGFubmVscworICogcmVxdWlyaW5nIFJBREFSIGRldGVjdGlvbiBvciByZXN0cmljdGluZyBBQ1RJVkUgc2Nhbm5pbmcuCisgKgorICogTk9URTogICJXSURFIiBmbGFnIGRvZXMgbm90IGluZGljYXRlIGFueXRoaW5nIGFib3V0ICJIVDQwIiA0MCBNSHogY2hhbm5lbHMuCisgKiAgICAgICAgSXQgb25seSBpbmRpY2F0ZXMgdGhhdCAyMCBNSHogY2hhbm5lbCB1c2UgaXMgc3VwcG9ydGVkOyBIVDQwIGNoYW5uZWwKKyAqICAgICAgICB1c2FnZSBpcyBpbmRpY2F0ZWQgYnkgYSBzZXBhcmF0ZSBzZXQgb2YgcmVndWxhdG9yeSBmbGFncyBmb3IgZWFjaAorICogICAgICAgIEhUNDAgY2hhbm5lbCBwYWlyLgorICoKKyAqIE5PVEU6ICBVc2luZyBhIGNoYW5uZWwgaW5hcHByb3ByaWF0ZWx5IHdpbGwgcmVzdWx0IGluIGEgdUNvZGUgZXJyb3IhCisgKi8KKyNkZWZpbmUgSUxfTlVNX1RYX0NBTElCX0dST1VQUyA1CitlbnVtIHsKKwlFRVBST01fQ0hBTk5FTF9WQUxJRCA9ICgxIDw8IDApLAkvKiB1c2FibGUgZm9yIHRoaXMgU0tVL2dlbyAqLworCUVFUFJPTV9DSEFOTkVMX0lCU1MgPSAoMSA8PCAxKSwJLyogdXNhYmxlIGFzIGFuIElCU1MgY2hhbm5lbCAqLworCS8qIEJpdCAyIFJlc2VydmVkICovCisJRUVQUk9NX0NIQU5ORUxfQUNUSVZFID0gKDEgPDwgMyksCS8qIGFjdGl2ZSBzY2FubmluZyBhbGxvd2VkICovCisJRUVQUk9NX0NIQU5ORUxfUkFEQVIgPSAoMSA8PCA0KSwJLyogcmFkYXIgZGV0ZWN0aW9uIHJlcXVpcmVkICovCisJRUVQUk9NX0NIQU5ORUxfV0lERSA9ICgxIDw8IDUpLAkvKiAyMCBNSHogY2hhbm5lbCBva2F5ICovCisJLyogQml0IDYgUmVzZXJ2ZWQgKHdhcyBOYXJyb3cgQ2hhbm5lbCkgKi8KKwlFRVBST01fQ0hBTk5FTF9ERlMgPSAoMSA8PCA3KSwJLyogZHluYW1pYyBmcmVxIHNlbGVjdGlvbiBjYW5kaWRhdGUgKi8KK307CisKKy8qIFNLVSBDYXBhYmlsaXRpZXMgKi8KKy8qIDM5NDUgb25seSAqLworI2RlZmluZSBFRVBST01fU0tVX0NBUF9TV19SRl9LSUxMX0VOQUJMRSAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBFRVBST01fU0tVX0NBUF9IV19SRl9LSUxMX0VOQUJMRSAgICAgICAgICAgICAgICAoMSA8PCAxKQorCisvKiAqcmVndWxhdG9yeSogY2hhbm5lbCBkYXRhIGZvcm1hdCBpbiBlZXByb20sIG9uZSBmb3IgZWFjaCBjaGFubmVsLgorICogVGhlcmUgYXJlIHNlcGFyYXRlIGVudHJpZXMgZm9yIEhUNDAgKDQwIE1IeikgdnMuIG5vcm1hbCAoMjAgTUh6KSBjaGFubmVscy4gKi8KK3N0cnVjdCBpbF9lZXByb21fY2hhbm5lbCB7CisJdTggZmxhZ3M7CQkvKiBFRVBST01fQ0hBTk5FTF8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLworCXM4IG1heF9wb3dlcl9hdmc7CS8qIG1heCBwb3dlciAoZEJtKSBvbiB0aGlzIGNobmwsIGxpbWl0IDMxICovCit9IF9fcGFja2VkOworCisvKiAzOTQ1IFNwZWNpZmljICovCisjZGVmaW5lIEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OCSgweDJmKQorCisvKiA0OTY1IGhhcyB0d28gcmFkaW8gdHJhbnNtaXR0ZXJzIChhbmQgMyByYWRpbyByZWNlaXZlcnMpICovCisjZGVmaW5lIEVFUFJPTV9UWF9QT1dFUl9UWF9DSEFJTlMgICAgICAoMikKKworLyogNDk2NSBoYXMgcm9vbSBmb3IgdXAgdG8gOCBzZXRzIG9mIHR4cG93ZXIgY2FsaWJyYXRpb24gZGF0YSAqLworI2RlZmluZSBFRVBST01fVFhfUE9XRVJfQkFORFMgICAgICAgICAgKDgpCisKKy8qIDQ5NjUgZmFjdG9yeSBjYWxpYnJhdGlvbiBtZWFzdXJlcyB0eHBvd2VyIGdhaW4gc2V0dGluZ3MgZm9yCisgKiBlYWNoIG9mIDMgdGFyZ2V0IG91dHB1dCBsZXZlbHMgKi8KKyNkZWZpbmUgRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UUyAgICgzKQorCisvKiA0OTY1IFNwZWNpZmljICovCisvKiA0OTY1IGRyaXZlciBkb2VzIG5vdCB3b3JrIHdpdGggdHhwb3dlciBjYWxpYnJhdGlvbiB2ZXJzaW9uIDwgNSAqLworI2RlZmluZSBFRVBST01fNDk2NV9UWF9QT1dFUl9WRVJTSU9OICAgICg1KQorI2RlZmluZSBFRVBST01fNDk2NV9FRVBST01fVkVSU0lPTgkoMHgyZikKKyNkZWZpbmUgRUVQUk9NXzQ5NjVfQ0FMSUJfVkVSU0lPTl9PRkZTRVQgICAgICAgKDIqMHhCNikJLyogMiBieXRlcyAqLworI2RlZmluZSBFRVBST01fNDk2NV9DQUxJQl9UWFBPV0VSX09GRlNFVCAgICAgICAoMioweEU4KQkvKiA0OCAgYnl0ZXMgKi8KKyNkZWZpbmUgRUVQUk9NXzQ5NjVfQk9BUkRfUkVWSVNJT04gICAgICAgICAgICAgKDIqMHg0RikJLyogMiBieXRlcyAqLworI2RlZmluZSBFRVBST01fNDk2NV9CT0FSRF9QQkEgICAgICAgICAgICAgICAgICAoMioweDU2KzEpCS8qIDkgYnl0ZXMgKi8KKworLyogMi40IEdIeiAqLworZXh0ZXJuIGNvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzFbMTRdOworCisvKgorICogZmFjdG9yeSBjYWxpYnJhdGlvbiBkYXRhIGZvciBvbmUgdHhwb3dlciBsZXZlbCwgb24gb25lIGNoYW5uZWwsCisgKiBtZWFzdXJlZCBvbiBvbmUgb2YgdGhlIDIgdHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlciBhbmQgYXNzb2NpYXRlZAorICogYW50ZW5uYSkuICBFRVBST00gY29udGFpbnM6CisgKgorICogMSkgIFRlbXBlcmF0dXJlIChkZWdyZWVzIENlbHNpdXMpIG9mIGRldmljZSB3aGVuIG1lYXN1cmVtZW50IHdhcyBtYWRlLgorICoKKyAqIDIpICBHYWluIHRhYmxlIGlkeCB1c2VkIHRvIGFjaGlldmUgdGhlIHRhcmdldCBtZWFzdXJlbWVudCBwb3dlci4KKyAqICAgICBUaGlzIHJlZmVycyB0byB0aGUgIndlbGwta25vd24iIGdhaW4gdGFibGVzIChzZWUgNDk2NS5oKS4KKyAqCisgKiAzKSAgQWN0dWFsIG1lYXN1cmVkIG91dHB1dCBwb3dlciwgaW4gaGFsZi1kQm0gKCIzNCIgPSAxNyBkQm0pLgorICoKKyAqIDQpICBSRiBwb3dlciBhbXBsaWZpZXIgZGV0ZWN0b3IgbGV2ZWwgbWVhc3VyZW1lbnQgKG5vdCB1c2VkKS4KKyAqLworc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlIHsKKwl1OCB0ZW1wZXJhdHVyZTsJCS8qIERldmljZSB0ZW1wZXJhdHVyZSAoQ2Vsc2l1cykgKi8KKwl1OCBnYWluX2lkeDsJCS8qIEluZGV4IGludG8gZ2FpbiB0YWJsZSAqLworCXU4IGFjdHVhbF9wb3c7CQkvKiBNZWFzdXJlZCBSRiBvdXRwdXQgcG93ZXIsIGhhbGYtZEJtICovCisJczggcGFfZGV0OwkJLyogUG93ZXIgYW1wIGRldGVjdG9yIGxldmVsIChub3QgdXNlZCkgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBtZWFzdXJlbWVudCBzZXQgZm9yIG9uZSBjaGFubmVsLiAgRUVQUk9NIGNvbnRhaW5zOgorICoKKyAqIDEpICBDaGFubmVsIG51bWJlciBtZWFzdXJlZAorICoKKyAqIDIpICBNZWFzdXJlbWVudHMgZm9yIGVhY2ggb2YgMyBwb3dlciBsZXZlbHMgZm9yIGVhY2ggb2YgMiByYWRpbyB0cmFuc21pdHRlcnMKKyAqICAgICAoYS5rLmEuICJ0eCBjaGFpbnMiKSAoNiBtZWFzdXJlbWVudHMgYWx0b2dldGhlcikKKyAqLworc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9jaF9pbmZvIHsKKwl1OCBjaF9udW07CisJc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlCisJICAgIG1lYXN1cmVtZW50c1tFRVBST01fVFhfUE9XRVJfVFhfQ0hBSU5TXQorCSAgICBbRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UU107Cit9IF9fcGFja2VkOworCisvKgorICogdHhwb3dlciBzdWJiYW5kIGluZm8uCisgKgorICogRm9yIGVhY2ggZnJlcXVlbmN5IHN1YmJhbmQsIEVFUFJPTSBjb250YWlucyB0aGUgZm9sbG93aW5nOgorICoKKyAqIDEpICBGaXJzdCBhbmQgbGFzdCBjaGFubmVscyB3aXRoaW4gcmFuZ2Ugb2YgdGhlIHN1YmJhbmQuICAiMCIgdmFsdWVzCisgKiAgICAgaW5kaWNhdGUgdGhhdCB0aGlzIHNhbXBsZSBzZXQgaXMgbm90IGJlaW5nIHVzZWQuCisgKgorICogMikgIFNhbXBsZSBtZWFzdXJlbWVudCBzZXRzIGZvciAyIGNoYW5uZWxzIGNsb3NlIHRvIHRoZSByYW5nZSBlbmRwb2ludHMuCisgKi8KK3N0cnVjdCBpbF9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvIHsKKwl1OCBjaF9mcm9tOwkJLyogY2hhbm5lbCBudW1iZXIgb2YgbG93ZXN0IGNoYW5uZWwgaW4gc3ViYmFuZCAqLworCXU4IGNoX3RvOwkJLyogY2hhbm5lbCBudW1iZXIgb2YgaGlnaGVzdCBjaGFubmVsIGluIHN1YmJhbmQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2NoX2luZm8gY2gxOworCXN0cnVjdCBpbF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaDI7Cit9IF9fcGFja2VkOworCisvKgorICogdHhwb3dlciBjYWxpYnJhdGlvbiBpbmZvLiAgRUVQUk9NIGNvbnRhaW5zOgorICoKKyAqIDEpICBGYWN0b3J5LW1lYXN1cmVkIHNhdHVyYXRpb24gcG93ZXIgbGV2ZWxzIChtYXhpbXVtIGxldmVscyBhdCB3aGljaAorICogICAgIHR4IHBvd2VyIGFtcGxpZmllciBjYW4gb3V0cHV0IGEgc2lnbmFsIHdpdGhvdXQgdG9vIG11Y2ggZGlzdG9ydGlvbikuCisgKiAgICAgVGhlcmUgaXMgb25lIGxldmVsIGZvciAyLjQgR0h6IGJhbmQgYW5kIG9uZSBmb3IgNSBHSHogYmFuZC4gIFRoZXNlCisgKiAgICAgdmFsdWVzIGFwcGx5IHRvIGFsbCBjaGFubmVscyB3aXRoaW4gZWFjaCBvZiB0aGUgYmFuZHMuCisgKgorICogMikgIEZhY3RvcnktbWVhc3VyZWQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgbGV2ZWwuICBUaGlzIGlzIGFzc3VtZWQgdG8gYmUKKyAqICAgICBjb25zdGFudCAoaS5lLiBzYW1lIHZhbHVlIGFwcGxpZXMgdG8gYWxsIGNoYW5uZWxzL2JhbmRzKSB3aGlsZSB0aGUKKyAqICAgICBmYWN0b3J5IG1lYXN1cmVtZW50cyBhcmUgYmVpbmcgbWFkZS4KKyAqCisgKiAzKSAgVXAgdG8gOCBzZXRzIG9mIGZhY3RvcnktbWVhc3VyZWQgdHhwb3dlciBjYWxpYnJhdGlvbiB2YWx1ZXMuCisgKiAgICAgVGhlc2UgYXJlIGZvciBkaWZmZXJlbnQgZnJlcXVlbmN5IHJhbmdlcywgc2luY2UgdHhwb3dlciBnYWluCisgKiAgICAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBhbmFsb2cgcmFkaW8gY2lyY3VpdHJ5IHZhcnkgd2l0aCBmcmVxdWVuY3kuCisgKgorICogICAgIE5vdCBhbGwgc2V0cyBuZWVkIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGE7CisgKiAgICAgc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9zdWJiYW5kX2luZm8gY29udGFpbnMgcmFuZ2Ugb2YgY2hhbm5lbHMKKyAqICAgICAoMCBpZiB1bnVzZWQpIGZvciBlYWNoIHNldCBvZiBkYXRhLgorICovCitzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2luZm8geworCXU4IHNhdHVyYXRpb25fcG93ZXIyNDsJLyogaGFsZi1kQm0gKGUuZy4gIjM0IiA9IDE3IGRCbSkgKi8KKwl1OCBzYXR1cmF0aW9uX3Bvd2VyNTI7CS8qIGhhbGYtZEJtICovCisJX19sZTE2IHZvbHRhZ2U7CQkvKiBzaWduZWQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX3N1YmJhbmRfaW5mbyBiYW5kX2luZm9bRUVQUk9NX1RYX1BPV0VSX0JBTkRTXTsKK30gX19wYWNrZWQ7CisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgRUVQUk9NX0RFVklDRV9JRCAgICAgICAgICAgICAgICAgICAgKDIqMHgwOCkJLyogMiBieXRlcyAqLworI2RlZmluZSBFRVBST01fTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAoMioweDE1KQkvKiA2ICBieXRlcyAqLworI2RlZmluZSBFRVBST01fQk9BUkRfUkVWSVNJT04gICAgICAgICAgICAgICAoMioweDM1KQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fQk9BUkRfUEJBX05VTUJFUiAgICAgICAgICAgICAoMioweDNCKzEpCS8qIDkgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICgyKjB4NDQpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9TS1VfQ0FQICAgICAgICAgICAgICAgICAgICAgICgyKjB4NDUpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9PRU1fTU9ERSAgICAgICAgICAgICAgICAgICAgICgyKjB4NDYpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9XT1dMQU5fTU9ERSAgICAgICAgICAgICAgICAgICgyKjB4NDcpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9SQURJT19DT05GSUcgICAgICAgICAgICAgICAgICgyKjB4NDgpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9OVU1fTUFDX0FERFJFU1MgICAgICAgICAgICAgICgyKjB4NEMpCS8qIDIgIGJ5dGVzICovCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFza3MgYXJlIHRvIGJlIGFwcGxpZWQgb24gRUVQUk9NX1JBRElPX0NPTkZJRyAqLworI2RlZmluZSBFRVBST01fUkZfQ0ZHX1RZUEVfTVNLKHgpICAgKHggJiAweDMpCS8qIGJpdHMgMC0xICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19TVEVQX01TSyh4KSAgICgoeCA+PiAyKSAgJiAweDMpCS8qIGJpdHMgMi0zICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19EQVNIX01TSyh4KSAgICgoeCA+PiA0KSAgJiAweDMpCS8qIGJpdHMgNC01ICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19QTlVNX01TSyh4KSAgICgoeCA+PiA2KSAgJiAweDMpCS8qIGJpdHMgNi03ICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19UWF9BTlRfTVNLKHgpICgoeCA+PiA4KSAgJiAweEYpCS8qIGJpdHMgOC0xMSAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19SWF9BTlRfTVNLKHgpICgoeCA+PiAxMikgJiAweEYpCS8qIGJpdHMgMTItMTUgKi8KKworI2RlZmluZSBFRVBST01fMzk0NV9SRl9DRkdfVFlQRV9NQVggIDB4MAorI2RlZmluZSBFRVBST01fNDk2NV9SRl9DRkdfVFlQRV9NQVggIDB4MQorCisvKgorICogUGVyLWNoYW5uZWwgcmVndWxhdG9yeSBkYXRhLgorICoKKyAqIEVhY2ggY2hhbm5lbCB0aGF0ICptaWdodCogYmUgc3VwcG9ydGVkIGJ5IGl3bCBoYXMgYSBmaXhlZCBsb2NhdGlvbgorICogaW4gRUVQUk9NIGNvbnRhaW5pbmcgRUVQUk9NX0NIQU5ORUxfKiB1c2FnZSBmbGFncyAoTFNCKSBhbmQgbWF4IHJlZ3VsYXRvcnkKKyAqIHR4cG93ZXIgKE1TQikuCisgKgorICogRW50cmllcyBpbW1lZGlhdGVseSBiZWxvdyBhcmUgZm9yIDIwIE1IeiBjaGFubmVsIHdpZHRoLiAgSFQ0MCAoNDAgTUh6KQorICogY2hhbm5lbHMgKG9ubHkgZm9yIDQ5NjUsIG5vdCBzdXBwb3J0ZWQgYnkgMzk0NSkgYXBwZWFyIGxhdGVyIGluIHRoZSBFRVBST00uCisgKgorICogMi40IEdIeiBjaGFubmVscyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKKyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9TS1VfSUQgICAgICAgICAgICAoMioweDYwKQkvKiA0ICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzEgICAgICAgICAgICAoMioweDYyKQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzFfQ0hBTk5FTFMgICAoMioweDYzKQkvKiAyOCBieXRlcyAqLworCisvKgorICogNC45IEdIeiBjaGFubmVscyAxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5LCAxOTIsIDE5NiwKKyAqIDUuMCBHSHogY2hhbm5lbHMgNywgOCwgMTEsIDEyLCAxNgorICogKDQ5MTUtNTA4ME1IeikgKG5vbmUgb2YgdGhlc2UgaXMgZXZlciBzdXBwb3J0ZWQpCisgKi8KKyNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yICAgICAgICAgICAgKDIqMHg3MSkJLyogMiAgYnl0ZXMgKi8KKyNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTICAgKDIqMHg3MikJLyogMjYgYnl0ZXMgKi8KKworLyoKKyAqIDUuMiBHSHogY2hhbm5lbHMgMzQsIDM2LCAzOCwgNDAsIDQyLCA0NCwgNDYsIDQ4LCA1MiwgNTYsIDYwLCA2NAorICogKDUxNzAtNTMyME1IeikKKyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzMgICAgICAgICAgICAoMioweDdGKQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzNfQ0hBTk5FTFMgICAoMioweDgwKQkvKiAyNCBieXRlcyAqLworCisvKgorICogNS41IEdIeiBjaGFubmVscyAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorICogKDU1MDAtNTcwME1IeikKKyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzQgICAgICAgICAgICAoMioweDhDKQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzRfQ0hBTk5FTFMgICAoMioweDhEKQkvKiAyMiBieXRlcyAqLworCisvKgorICogNS43IEdIeiBjaGFubmVscyAxNDUsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisgKiAoNTcyNS01ODI1TUh6KQorICovCisjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNSAgICAgICAgICAgICgyKjB4OTgpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUyAgICgyKjB4OTkpCS8qIDEyIGJ5dGVzICovCisKKy8qCisgKiAyLjQgR0h6IEhUNDAgY2hhbm5lbHMgMSAoNSksIDIgKDYpLCAzICg3KSwgNCAoOCksIDUgKDkpLCA2ICgxMCksIDcgKDExKQorICoKKyAqIFRoZSBjaGFubmVsIGxpc3RlZCBpcyB0aGUgY2VudGVyIG9mIHRoZSBsb3dlciAyMCBNSHogaGFsZiBvZiB0aGUgY2hhbm5lbC4KKyAqIFRoZSBvdmVyYWxsIGNlbnRlciBmcmVxdWVuY3kgaXMgYWN0dWFsbHkgMiBjaGFubmVscyAoMTAgTUh6KSBhYm92ZSB0aGF0LAorICogYW5kIHRoZSB1cHBlciBoYWxmIG9mIGVhY2ggSFQ0MCBjaGFubmVsIGlzIGNlbnRlcmVkIDQgY2hhbm5lbHMgKDIwIE1IeikgYXdheQorICogZnJvbSB0aGUgbG93ZXIgaGFsZjsgZS5nLiB0aGUgdXBwZXIgaGFsZiBvZiBIVDQwIGNoYW5uZWwgMSBpcyBjaGFubmVsIDUsCisgKiBhbmQgdGhlIG92ZXJhbGwgSFQ0MCBjaGFubmVsIHdpZHRoIGNlbnRlcnMgb24gY2hhbm5lbCAzLgorICoKKyAqIE5PVEU6ICBUaGUgUlhPTiBjb21tYW5kIHVzZXMgMjAgTUh6IGNoYW5uZWwgbnVtYmVycyB0byBzcGVjaWZ5IHRoZQorICogICAgICAgIGNvbnRyb2wgY2hhbm5lbCB0byB3aGljaCB0byB0dW5lLiAgUlhPTiBhbHNvIHNwZWNpZmllcyB3aGV0aGVyIHRoZQorICogICAgICAgIGNvbnRyb2wgY2hhbm5lbCBpcyB0aGUgdXBwZXIgb3IgbG93ZXIgaGFsZiBvZiBhIEhUNDAgY2hhbm5lbC4KKyAqCisgKiBOT1RFOiAgNDk2NSBkb2VzIG5vdCBzdXBwb3J0IEhUNDAgY2hhbm5lbHMgb24gMi40IEdIei4KKyAqLworI2RlZmluZSBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfMjRfSFQ0MF9DSEFOTkVMUyAoMioweEEwKQkvKiAxNCBieXRlcyAqLworCisvKgorICogNS4yIEdIeiBIVDQwIGNoYW5uZWxzIDM2ICg0MCksIDQ0ICg0OCksIDUyICg1NiksIDYwICg2NCksCisgKiAxMDAgKDEwNCksIDEwOCAoMTEyKSwgMTE2ICgxMjApLCAxMjQgKDEyOCksIDEzMiAoMTM2KSwgMTQ5ICgxNTMpLCAxNTcgKDE2MSkKKyAqLworI2RlZmluZSBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfNTJfSFQ0MF9DSEFOTkVMUyAoMioweEE4KQkvKiAyMiBieXRlcyAqLworCisjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MAkJCSgwKQorCitzdHJ1Y3QgaWxfZWVwcm9tX29wcyB7CisJY29uc3QgdTMyIHJlZ3VsYXRvcnlfYmFuZHNbN107CisJaW50ICgqYWNxdWlyZV9zZW1hcGhvcmUpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCXZvaWQgKCpyZWxlYXNlX3NlbWFwaG9yZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7Cit9OworCitpbnQgaWxfZWVwcm9tX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfZWVwcm9tX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2NvbnN0IHU4ICppbF9lZXByb21fcXVlcnlfYWRkcihjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIHNpemVfdCBvZmZzZXQpOwordTE2IGlsX2VlcHJvbV9xdWVyeTE2KGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwgc2l6ZV90IG9mZnNldCk7CitpbnQgaWxfaW5pdF9jaGFubmVsX21hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF9mcmVlX2NoYW5uZWxfbWFwKHN0cnVjdCBpbF9wcml2ICppbCk7Citjb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICppbF9nZXRfY2hhbm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJCSAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJCQkJICB1MTYgY2hhbm5lbCk7CisKKyNkZWZpbmUgSUxfTlVNX1NDQU5fUkFURVMgICAgICAgICAoMikKKworc3RydWN0IGlsNDk2NV9jaGFubmVsX3RnZF9pbmZvIHsKKwl1OCB0eXBlOworCXM4IG1heF9wb3dlcjsKK307CisKK3N0cnVjdCBpbDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB7CisJczY0IGxhc3RfcmFkYXJfdGltZTsKK307CisKKyNkZWZpbmUgSUw0OTY1X01BWF9SQVRFICgzMykKKworc3RydWN0IGlsMzk0NV9jbGlwX2dyb3VwIHsKKwkvKiBtYXhpbXVtIHBvd2VyIGxldmVsIHRvIHByZXZlbnQgY2xpcHBpbmcgZm9yIGVhY2ggcmF0ZSwgZGVyaXZlZCBieQorCSAqICAgdXMgZnJvbSB0aGlzIGJhbmQncyBzYXR1cmF0aW9uIHBvd2VyIGluIEVFUFJPTSAqLworCWNvbnN0IHM4IGNsaXBfcG93ZXJzW0lMX01BWF9SQVRFU107Cit9OworCisvKiBjdXJyZW50IFR4IHBvd2VyIHZhbHVlcyB0byB1c2UsIG9uZSBmb3IgZWFjaCByYXRlIGZvciBlYWNoIGNoYW5uZWwuCisgKiByZXF1ZXN0ZWQgcG93ZXIgaXMgbGltaXRlZCBieToKKyAqIC0tIHJlZ3VsYXRvcnkgRUVQUk9NIGxpbWl0cyBmb3IgdGhpcyBjaGFubmVsCisgKiAtLSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgKGNsaXAtcG93ZXJzKQorICogLS0gc3BlY3RydW0gbWFuYWdlbWVudAorICogLS0gdXNlciBwcmVmZXJlbmNlIChlLmcuIGl3Y29uZmlnKQorICogd2hlbiByZXF1ZXN0ZWQgcG93ZXIgaXMgc2V0LCBiYXNlIHBvd2VyIGlkeCBtdXN0IGFsc28gYmUgc2V0LiAqLworc3RydWN0IGlsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8geworCXN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgdHBjOwkvKiBhY3R1YWwgcmFkaW8gYW5kIERTUCBnYWluIHNldHRpbmdzICovCisJczggcG93ZXJfdGFibGVfaWR4OwkvKiBhY3R1YWwgKGNvbXBlbnN0J2QpIGlkeCBpbnRvIGdhaW4gdGFibGUgKi8KKwlzOCBiYXNlX3Bvd2VyX2lkeDsJLyogZ2FpbiBpZHggZm9yIHBvd2VyIGF0IGZhY3RvcnkgdGVtcC4gKi8KKwlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHBvd2VyIChkQm0pIHJlcXVlc3RlZCBmb3IgdGhpcyBjaG5sL3JhdGUgKi8KK307CisKKy8qIGN1cnJlbnQgc2NhbiBUeCBwb3dlciB2YWx1ZXMgdG8gdXNlLCBvbmUgZm9yIGVhY2ggc2NhbiByYXRlIGZvciBlYWNoCisgKiBjaGFubmVsLiAqLworc3RydWN0IGlsMzk0NV9zY2FuX3Bvd2VyX2luZm8geworCXN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgdHBjOwkvKiBhY3R1YWwgcmFkaW8gYW5kIERTUCBnYWluIHNldHRpbmdzICovCisJczggcG93ZXJfdGFibGVfaWR4OwkvKiBhY3R1YWwgKGNvbXBlbnN0J2QpIGlkeCBpbnRvIGdhaW4gdGFibGUgKi8KKwlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHNjYW4gcHdyIChkQm0pIHJlcXVlc3RlZCBmb3IgY2hubC9yYXRlICovCit9OworCisvKgorICogT25lIGZvciBlYWNoIGNoYW5uZWwsIGhvbGRzIGFsbCBjaGFubmVsIHNldHVwIGRhdGEKKyAqIFNvbWUgb2YgdGhlIGZpZWxkcyAoZS5nLiBlZXByb20gYW5kIGZsYWdzL21heF9wb3dlcl9hdmcpIGFyZSByZWR1bmRhbnQKKyAqICAgICB3aXRoIG9uZSBhbm90aGVyIQorICovCitzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvIHsKKwlzdHJ1Y3QgaWw0OTY1X2NoYW5uZWxfdGdkX2luZm8gdGdkOworCXN0cnVjdCBpbDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB0Z2g7CisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGVlcHJvbTsJLyogRUVQUk9NIHJlZ3VsYXRvcnkgbGltaXQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgaHQ0MF9lZXByb207CS8qIEVFUFJPTSByZWd1bGF0b3J5IGxpbWl0IGZvcgorCQkJCQkJICogSFQ0MCBjaGFubmVsICovCisKKwl1OCBjaGFubmVsOwkJLyogY2hhbm5lbCBudW1iZXIgKi8KKwl1OCBmbGFnczsJCS8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLworCXM4IG1heF9wb3dlcl9hdmc7CS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIG5vcm1hbCBUeCwgYW55IHJhdGUgKi8KKwlzOCBjdXJyX3R4cG93OwkJLyogKGRCbSkgcmVndWxhdG9yeS9zcGVjdHJ1bS91c2VyIChub3QgaC93KSBsaW1pdCAqLworCXM4IG1pbl9wb3dlcjsJCS8qIGFsd2F5cyAwICovCisJczggc2Nhbl9wb3dlcjsJCS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIGRpcmVjdCBzY2FucywgYW55IHJhdGUgKi8KKworCXU4IGdyb3VwX2lkeDsJCS8qIDAtNCwgbWFwcyBjaGFubmVsIHRvIGdyb3VwMS8yLzMvNC81ICovCisJdTggYmFuZF9pZHg7CQkvKiAwLTQsIG1hcHMgY2hhbm5lbCB0byBiYW5kMS8yLzMvNC81ICovCisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCisJLyogSFQ0MCBjaGFubmVsIGluZm8gKi8KKwlzOCBodDQwX21heF9wb3dlcl9hdmc7CS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIG5vcm1hbCBUeCwgYW55IHJhdGUgKi8KKwl1OCBodDQwX2ZsYWdzOwkJLyogZmxhZ3MgY29waWVkIGZyb20gRUVQUk9NICovCisJdTggaHQ0MF9leHRlbnNpb25fY2hhbm5lbDsJLyogSFRfSUVfRVhUX0NIQU5ORUxfKiAqLworCisJLyogUmFkaW8vRFNQIGdhaW4gc2V0dGluZ3MgZm9yIGVhY2ggIm5vcm1hbCIgZGF0YSBUeCByYXRlLgorCSAqIFRoZXNlIGluY2x1ZGUsIGluIGFkZGl0aW9uIHRvIFJGIGFuZCBEU1AgZ2FpbiwgYSBmZXcgZmllbGRzIGZvcgorCSAqICAgcmVtZW1iZXJpbmcvbW9kaWZ5aW5nIGdhaW4gc2V0dGluZ3MgKGlkeGVzKS4gKi8KKwlzdHJ1Y3QgaWwzOTQ1X2NoYW5uZWxfcG93ZXJfaW5mbyBwb3dlcl9pbmZvW0lMNDk2NV9NQVhfUkFURV07CisKKwkvKiBSYWRpby9EU1AgZ2FpbiBzZXR0aW5ncyBmb3IgZWFjaCBzY2FuIHJhdGUsIGZvciBkaXJlY3RlZCBzY2Fucy4gKi8KKwlzdHJ1Y3QgaWwzOTQ1X3NjYW5fcG93ZXJfaW5mbyBzY2FuX3B3cl9pbmZvW0lMX05VTV9TQ0FOX1JBVEVTXTsKK307CisKKyNkZWZpbmUgSUxfVFhfRklGT19CSwkJMAkvKiBzaGFyZWQgKi8KKyNkZWZpbmUgSUxfVFhfRklGT19CRQkJMQorI2RlZmluZSBJTF9UWF9GSUZPX1ZJCQkyCS8qIHNoYXJlZCAqLworI2RlZmluZSBJTF9UWF9GSUZPX1ZPCQkzCisjZGVmaW5lIElMX1RYX0ZJRk9fVU5VU0VECS0xCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIHF1ZXVlcy4gTUFYX05VTSBpcyBkZWZpbmVkIGluIGh3IHNwZWNpZmljIGZpbGVzLgorICogU2V0IHRoZSBtaW5pbXVtIHRvIGFjY29tbW9kYXRlIHRoZSA0IHN0YW5kYXJkIFRYIHF1ZXVlcywgMSBjb21tYW5kCisgKiBxdWV1ZSwgMiAodW51c2VkKSBIQ0NBIHF1ZXVlcywgYW5kIDQgSFQgcXVldWVzIChvbmUgZm9yIGVhY2ggQUMpICovCisjZGVmaW5lIElMX01JTl9OVU1fUVVFVUVTCTEwCisKKyNkZWZpbmUgSUxfREVGQVVMVF9DTURfUVVFVUVfTlVNCTQKKworI2RlZmluZSBJRUVFODAyMTFfREFUQV9MRU4gICAgICAgICAgICAgIDIzMDQKKyNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAgICAgICAgICAgICAzMAorI2RlZmluZSBJRUVFODAyMTFfSExFTiAgICAgICAgICAgICAgICAgIChJRUVFODAyMTFfNEFERFJfTEVOKQorI2RlZmluZSBJRUVFODAyMTFfRlJBTUVfTEVOICAgICAgICAgICAgIChJRUVFODAyMTFfREFUQV9MRU4gKyBJRUVFODAyMTFfSExFTikKKworc3RydWN0IGlsX2ZyYW1lIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBpZWVlODAyMTFfaGRyIGZyYW1lOworCQlzdHJ1Y3QgaWxfdHhfYmVhY29uX2NtZCBiZWFjb247CisJCXU4IHJhd1tJRUVFODAyMTFfRlJBTUVfTEVOXTsKKwkJdTggY21kWzM2MF07CisJfSB1OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgU0VRX1RPX1NOKHNlcSkgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKyNkZWZpbmUgU05fVE9fU0VRKHNzbikgKCgoc3NuKSA8PCA0KSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKyNkZWZpbmUgTUFYX1NOICgoSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQorCitlbnVtIHsKKwlDTURfU1lOQyA9IDAsCisJQ01EX1NJWkVfTk9STUFMID0gMCwKKwlDTURfTk9fU0tCID0gMCwKKwlDTURfU0laRV9IVUdFID0gKDEgPDwgMCksCisJQ01EX0FTWU5DID0gKDEgPDwgMSksCisJQ01EX1dBTlRfU0tCID0gKDEgPDwgMiksCisJQ01EX01BUFBFRCA9ICgxIDw8IDMpLAorfTsKKworI2RlZmluZSBERUZfQ01EX1BBWUxPQURfU0laRSAzMjAKKworLyoqCisgKiBzdHJ1Y3QgaWxfZGV2aWNlX2NtZAorICoKKyAqIEZvciBhbGxvY2F0aW9uIG9mIHRoZSBjb21tYW5kIGFuZCB0eCBxdWV1ZXMsIHRoaXMgZXN0YWJsaXNoZXMgdGhlIG92ZXJhbGwKKyAqIHNpemUgb2YgdGhlIGxhcmdlc3QgY29tbWFuZCB3ZSBzZW5kIHRvIHVDb2RlLCBleGNlcHQgZm9yIGEgc2NhbiBjb21tYW5kCisgKiAod2hpY2ggaXMgcmVsYXRpdmVseSBodWdlOyBzcGFjZSBpcyBhbGxvY2F0ZWQgc2VwYXJhdGVseSkuCisgKi8KK3N0cnVjdCBpbF9kZXZpY2VfY21kIHsKKwlzdHJ1Y3QgaWxfY21kX2hlYWRlciBoZHI7CS8qIHVDb2RlIEFQSSAqLworCXVuaW9uIHsKKwkJdTMyIGZsYWdzOworCQl1OCB2YWw4OworCQl1MTYgdmFsMTY7CisJCXUzMiB2YWwzMjsKKwkJc3RydWN0IGlsX3R4X2NtZCB0eDsKKwkJdTggcGF5bG9hZFtERUZfQ01EX1BBWUxPQURfU0laRV07CisJfSBfX3BhY2tlZCBjbWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFRGRF9NQVhfUEFZTE9BRF9TSVpFIChzaXplb2Yoc3RydWN0IGlsX2RldmljZV9jbWQpKQorCitzdHJ1Y3QgaWxfaG9zdF9jbWQgeworCWNvbnN0IHZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyByZXBseV9wYWdlOworCXZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCSAgc3RydWN0IGlsX3J4X3BrdCAqcGt0KTsKKwl1MzIgZmxhZ3M7CisJdTE2IGxlbjsKKwl1OCBpZDsKK307CisKKyNkZWZpbmUgU1VQX1JBVEVfMTFBX01BWF9OVU1fQ0hBTk5FTFMgIDgKKyNkZWZpbmUgU1VQX1JBVEVfMTFCX01BWF9OVU1fQ0hBTk5FTFMgIDQKKyNkZWZpbmUgU1VQX1JBVEVfMTFHX01BWF9OVU1fQ0hBTk5FTFMgIDEyCisKKy8qKgorICogc3RydWN0IGlsX3J4X3F1ZXVlIC0gUnggcXVldWUKKyAqIEBiZDogZHJpdmVyJ3MgcG9pbnRlciB0byBidWZmZXIgb2YgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMgKHJiZCkKKyAqIEBiZF9kbWE6IGJ1cyBhZGRyZXNzIG9mIGJ1ZmZlciBvZiByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9ycyAocmJkKQorICogQHJlYWQ6IFNoYXJlZCBpZHggdG8gbmV3ZXN0IGF2YWlsYWJsZSBSeCBidWZmZXIKKyAqIEB3cml0ZTogU2hhcmVkIGlkeCB0byBvbGRlc3Qgd3JpdHRlbiBSeCBwYWNrZXQKKyAqIEBmcmVlX2NvdW50OiBOdW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBidWZmZXJzIGluIHJ4X2ZyZWUKKyAqIEByeF9mcmVlOiBsaXN0IG9mIGZyZWUgU0tCcyBmb3IgdXNlCisgKiBAcnhfdXNlZDogTGlzdCBvZiBSeCBidWZmZXJzIHdpdGggbm8gU0tCCisgKiBAbmVlZF91cGRhdGU6IGZsYWcgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byB1cGRhdGUgcmVhZC93cml0ZSBpZHgKKyAqIEByYl9zdHRzOiBkcml2ZXIncyBwb2ludGVyIHRvIHJlY2VpdmUgYnVmZmVyIHN0YXR1cworICogQHJiX3N0dHNfZG1hOiBidXMgYWRkcmVzcyBvZiByZWNlaXZlIGJ1ZmZlciBzdGF0dXMKKyAqCisgKiBOT1RFOiAgcnhfZnJlZSBhbmQgcnhfdXNlZCBhcmUgdXNlZCBhcyBhIEZJRk8gZm9yIGlsX3J4X2J1ZnMKKyAqLworc3RydWN0IGlsX3J4X3F1ZXVlIHsKKwlfX2xlMzIgKmJkOworCWRtYV9hZGRyX3QgYmRfZG1hOworCXN0cnVjdCBpbF9yeF9idWYgcG9vbFtSWF9RVUVVRV9TSVpFICsgUlhfRlJFRV9CVUZGRVJTXTsKKwlzdHJ1Y3QgaWxfcnhfYnVmICpxdWV1ZVtSWF9RVUVVRV9TSVpFXTsKKwl1MzIgcmVhZDsKKwl1MzIgd3JpdGU7CisJdTMyIGZyZWVfY291bnQ7CisJdTMyIHdyaXRlX2FjdHVhbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2ZyZWU7CisJc3RydWN0IGxpc3RfaGVhZCByeF91c2VkOworCWludCBuZWVkX3VwZGF0ZTsKKwlzdHJ1Y3QgaWxfcmJfc3RhdHVzICpyYl9zdHRzOworCWRtYV9hZGRyX3QgcmJfc3R0c19kbWE7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworI2RlZmluZSBJTF9TVVBQT1JURURfUkFURVNfSUVfTEVOICAgICAgICAgOAorCisjZGVmaW5lIE1BWF9USURfQ09VTlQgICAgICAgIDkKKworI2RlZmluZSBJTF9JTlZBTElEX1JBVEUgICAgIDB4RkYKKyNkZWZpbmUgSUxfSU5WQUxJRF9WQUxVRSAgICAtMQorCisvKioKKyAqIHN0cnVjdCBpbF9odF9hZ2cgLS0gYWdncmVnYXRpb24gc3RhdHVzIHdoaWxlIHdhaXRpbmcgZm9yIGJsb2NrLWFjaworICogQHR4cV9pZDogVHggcXVldWUgdXNlZCBmb3IgVHggYXR0ZW1wdAorICogQGZyYW1lX2NvdW50OiAjIGZyYW1lcyBhdHRlbXB0ZWQgYnkgVHggY29tbWFuZAorICogQHdhaXRfZm9yX2JhOiBFeHBlY3QgYmxvY2stYWNrIGJlZm9yZSBuZXh0IFR4IHJlcGx5CisgKiBAc3RhcnRfaWR4OiBJbmRleCBvZiAxc3QgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKSBpbiBUeCB3aW4KKyAqIEBiaXRtYXAwOiBMb3cgb3JkZXIgYml0bWFwLCBvbmUgYml0IGZvciBlYWNoIGZyYW1lIHBlbmRpbmcgQUNLIGluIFR4IHdpbgorICogQGJpdG1hcDE6IEhpZ2ggb3JkZXIsIG9uZSBiaXQgZm9yIGVhY2ggZnJhbWUgcGVuZGluZyBBQ0sgaW4gVHggd2luCisgKiBAcmF0ZV9uX2ZsYWdzOiBSYXRlIGF0IHdoaWNoIFR4IHdhcyBhdHRlbXB0ZWQKKyAqCisgKiBJZiBDX1RYIGluZGljYXRlcyB0aGF0IGFnZ3JlZ2F0aW9uIHdhcyBhdHRlbXB0ZWQsIGRyaXZlciBtdXN0IHdhaXQKKyAqIGZvciBibG9jayBhY2sgKE5fQ09NUFJFU1NFRF9CQSkuICBUaGlzIHN0cnVjdCBzdG9yZXMgdHggcmVwbHkgaW5mbworICogdW50aWwgYmxvY2sgYWNrIGFycml2ZXMuCisgKi8KK3N0cnVjdCBpbF9odF9hZ2cgeworCXUxNiB0eHFfaWQ7CisJdTE2IGZyYW1lX2NvdW50OworCXUxNiB3YWl0X2Zvcl9iYTsKKwl1MTYgc3RhcnRfaWR4OworCXU2NCBiaXRtYXA7CisJdTMyIHJhdGVfbl9mbGFnczsKKyNkZWZpbmUgSUxfQUdHX09GRiAwCisjZGVmaW5lIElMX0FHR19PTiAxCisjZGVmaW5lIElMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBIDIKKyNkZWZpbmUgSUxfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkEgMworCXU4IHN0YXRlOworfTsKKworc3RydWN0IGlsX3RpZF9kYXRhIHsKKwl1MTYgc2VxX251bWJlcjsJCS8qIDQ5NjUgb25seSAqLworCXUxNiB0ZmRzX2luX3F1ZXVlOworCXN0cnVjdCBpbF9odF9hZ2cgYWdnOworfTsKKworc3RydWN0IGlsX2h3X2tleSB7CisJdTMyIGNpcGhlcjsKKwlpbnQga2V5bGVuOworCXU4IGtleWlkeDsKKwl1OCBrZXlbMzJdOworfTsKKwordW5pb24gaWxfaHRfcmF0ZV9zdXBwIHsKKwl1MTYgcmF0ZXM7CisJc3RydWN0IHsKKwkJdTggc2lzb19yYXRlOworCQl1OCBtaW1vX3JhdGU7CisJfTsKK307CisKKyNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl84SyAgICgweDApCisjZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfMTZLICAoMHgxKQorI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzMySyAgKDB4MikKKyNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsgICgweDMpCisjZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfREVGICBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzY0SworI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SX01BWCAgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsKKyNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl9NSU4gIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfOEsKKworLyoKKyAqIE1heGltYWwgTVBEVSBkZW5zaXR5IGZvciBUWCBhZ2dyZWdhdGlvbgorICogNCAtIDJ1cyBkZW5zaXR5CisgKiA1IC0gNHVzIGRlbnNpdHkKKyAqIDYgLSA4dXMgZGVuc2l0eQorICogNyAtIDE2dXMgZGVuc2l0eQorICovCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMlVTRUMgICAoMHg0KQorI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDICAgKDB4NSkKKyNkZWZpbmUgQ0ZHX0hUX01QRFVfREVOU0lUWV84VVNFQyAgICgweDYpCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDICAoMHg3KQorI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZX0RFRiBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUFYIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUlOICAgICAoMHgxKQorCitzdHJ1Y3QgaWxfaHRfY29uZmlnIHsKKwlib29sIHNpbmdsZV9jaGFpbl9zdWZmaWNpZW50OworCWVudW0gaWVlZTgwMjExX3NtcHNfbW9kZSBzbXBzOwkvKiBjdXJyZW50IHNtcHMgbW9kZSAqLworfTsKKworLyogUW9TIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBpbF9xb3NfaW5mbyB7CisJaW50IHFvc19hY3RpdmU7CisJc3RydWN0IGlsX3Fvc3BhcmFtX2NtZCBkZWZfcW9zX3Bhcm07Cit9OworCisvKgorICogU3RydWN0dXJlIHNob3VsZCBiZSBhY2Nlc3NlZCB3aXRoIHN0YV9sb2NrIGhlbGQuIFdoZW4gc3RhdGlvbiBhZGRpdGlvbgorICogaXMgaW4gcHJvZ3Jlc3MgKElMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3Mgb25seQorICogdGhlIGNvbW1hbmRzIChpbF9hZGRzdGFfY21kIGFuZCBpbF9saW5rX3F1YWxpdHlfY21kKSB3aXRob3V0CisgKiBzdGFfbG9jayBoZWxkLgorICovCitzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSB7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhOworCXN0cnVjdCBpbF90aWRfZGF0YSB0aWRbTUFYX1RJRF9DT1VOVF07CisJdTggdXNlZCwgY3R4aWQ7CisJc3RydWN0IGlsX2h3X2tleSBrZXlpbmZvOworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscTsKK307CisKK3N0cnVjdCBpbF9zdGF0aW9uX3ByaXZfY29tbW9uIHsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7CisJdTggc3RhX2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaWxfdmlmX3ByaXYgLSBkcml2ZXIncyBpbGF0ZSBwZXItaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKgorICogV2hlbiBtYWM4MDIxMSBhbGxvY2F0ZXMgYSB2aXJ0dWFsIGludGVyZmFjZSwgaXQgY2FuIGFsbG9jYXRlCisgKiBzcGFjZSBmb3IgdXMgdG8gcHV0IGRhdGEgaW50by4KKyAqLworc3RydWN0IGlsX3ZpZl9wcml2IHsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7CisJdTggaWJzc19ic3NpZF9zdGFfaWQ7Cit9OworCisvKiBvbmUgZm9yIGVhY2ggdUNvZGUgaW1hZ2UgKGluc3QvZGF0YSwgYm9vdC9pbml0L3J1bnRpbWUpICovCitzdHJ1Y3QgZndfZGVzYyB7CisJdm9pZCAqdl9hZGRyOwkJLyogYWNjZXNzIGJ5IGRyaXZlciAqLworCWRtYV9hZGRyX3QgcF9hZGRyOwkvKiBhY2Nlc3MgYnkgY2FyZCdzIGJ1c21hc3RlciBETUEgKi8KKwl1MzIgbGVuOwkJLyogYnl0ZXMgKi8KK307CisKKy8qIHVDb2RlIGZpbGUgbGF5b3V0ICovCitzdHJ1Y3QgaWxfdWNvZGVfaGVhZGVyIHsKKwlfX2xlMzIgdmVyOwkJLyogbWFqb3IvbWlub3IvQVBJL3NlcmlhbCAqLworCXN0cnVjdCB7CisJCV9fbGUzMiBpbnN0X3NpemU7CS8qIGJ5dGVzIG9mIHJ1bnRpbWUgY29kZSAqLworCQlfX2xlMzIgZGF0YV9zaXplOwkvKiBieXRlcyBvZiBydW50aW1lIGRhdGEgKi8KKwkJX19sZTMyIGluaXRfc2l6ZTsJLyogYnl0ZXMgb2YgaW5pdCBjb2RlICovCisJCV9fbGUzMiBpbml0X2RhdGFfc2l6ZTsJLyogYnl0ZXMgb2YgaW5pdCBkYXRhICovCisJCV9fbGUzMiBib290X3NpemU7CS8qIGJ5dGVzIG9mIGJvb3RzdHJhcCBjb2RlICovCisJCXU4IGRhdGFbMF07CS8qIGluIHNhbWUgb3JkZXIgYXMgc2l6ZXMgKi8KKwl9IHYxOworfTsKKworc3RydWN0IGlsNDk2NV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bTsKKwl1MTYgZnJhZ19udW07CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzIHsKKwl1MTYgbWluX25yZ19jY2s7CisJdTE2IG1heF9ucmdfY2NrOworCisJdTE2IG5yZ190aF9jY2s7CisJdTE2IG5yZ190aF9vZmRtOworCisJdTE2IGF1dG9fY29ycl9taW5fb2ZkbTsKKwl1MTYgYXV0b19jb3JyX21pbl9vZmRtX21yYzsKKwl1MTYgYXV0b19jb3JyX21pbl9vZmRtX3gxOworCXUxNiBhdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxOworCisJdTE2IGF1dG9fY29ycl9tYXhfb2ZkbTsKKwl1MTYgYXV0b19jb3JyX21heF9vZmRtX21yYzsKKwl1MTYgYXV0b19jb3JyX21heF9vZmRtX3gxOworCXUxNiBhdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxOworCisJdTE2IGF1dG9fY29ycl9tYXhfY2NrOworCXUxNiBhdXRvX2NvcnJfbWF4X2Nja19tcmM7CisJdTE2IGF1dG9fY29ycl9taW5fY2NrOworCXUxNiBhdXRvX2NvcnJfbWluX2Nja19tcmM7CisKKwl1MTYgYmFya2VyX2NvcnJfdGhfbWluOworCXUxNiBiYXJrZXJfY29ycl90aF9taW5fbXJjOworCXUxNiBucmdfdGhfY2NhOworfTsKKworI2RlZmluZSBLRUxWSU5fVE9fQ0VMU0lVUyh4KSAoKHgpLTI3MykKKyNkZWZpbmUgQ0VMU0lVU19UT19LRUxWSU4oeCkgKCh4KSsyNzMpCisKKy8qKgorICogc3RydWN0IGlsX2h3X3BhcmFtcworICogQG1heF90eHFfbnVtOiBNYXggIyBUeCBxdWV1ZXMgc3VwcG9ydGVkCisgKiBAZG1hX2NobmxfbnVtOiBOdW1iZXIgb2YgVHggRE1BL0ZJRk8gY2hhbm5lbHMKKyAqIEBzY2RfYmNfdGJsc19zaXplOiBzaXplIG9mIHNjaGVkdWxlciBieXRlIGNvdW50IHRhYmxlcworICogQHRmZF9zaXplOiBURkQgc2l6ZQorICogQHR4L3J4X2NoYWluc19udW06IE51bWJlciBvZiBUWC9SWCBjaGFpbnMKKyAqIEB2YWxpZF90eC9yeF9hbnQ6IHVzYWJsZSBhbnRlbm5hcworICogQG1heF9yeHFfc2l6ZTogTWF4ICMgUnggZnJhbWVzIGluIFJ4IHF1ZXVlIChtdXN0IGJlIHBvd2VyLW9mLTIpCisgKiBAbWF4X3J4cV9sb2c6IExvZy1iYXNlLTIgb2YgbWF4X3J4cV9zaXplCisgKiBAcnhfcGFnZV9vcmRlcjogUnggYnVmZmVyIHBhZ2Ugb3JkZXIKKyAqIEByeF93cnRfcHRyX3JlZzogRkh7Mzl9X1JTQ1NSX0NITkwwX1dQVFIKKyAqIEBtYXhfc3RhdGlvbnM6CisgKiBAaHQ0MF9jaGFubmVsOiBpcyA0ME1IeiB3aWR0aCBwb3NzaWJsZSBpbiBiYW5kIDIuNAorICogQklUKElFRUU4MDIxMV9CQU5EXzVHSFopIEJJVChJRUVFODAyMTFfQkFORF81R0haKQorICogQHN3X2NyeXB0bzogMCBmb3IgaHcsIDEgZm9yIHN3CisgKiBAbWF4X3h4eF9zaXplOiBmb3IgdWNvZGUgdXNlcworICogQGN0X2tpbGxfdGhyZXNob2xkOiB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQKKyAqIEBiZWFjb25fdGltZV90c2ZfYml0czogbnVtYmVyIG9mIHZhbGlkIHRzZiBiaXRzIGZvciBiZWFjb24gdGltZQorICogQHN0cnVjdCBpbF9zZW5zaXRpdml0eV9yYW5nZXM6IHJhbmdlIG9mIHNlbnNpdGl2aXR5IHZhbHVlcworICovCitzdHJ1Y3QgaWxfaHdfcGFyYW1zIHsKKwl1OCBtYXhfdHhxX251bTsKKwl1OCBkbWFfY2hubF9udW07CisJdTE2IHNjZF9iY190YmxzX3NpemU7CisJdTMyIHRmZF9zaXplOworCXU4IHR4X2NoYWluc19udW07CisJdTggcnhfY2hhaW5zX251bTsKKwl1OCB2YWxpZF90eF9hbnQ7CisJdTggdmFsaWRfcnhfYW50OworCXUxNiBtYXhfcnhxX3NpemU7CisJdTE2IG1heF9yeHFfbG9nOworCXUzMiByeF9wYWdlX29yZGVyOworCXUzMiByeF93cnRfcHRyX3JlZzsKKwl1OCBtYXhfc3RhdGlvbnM7CisJdTggaHQ0MF9jaGFubmVsOworCXU4IG1heF9iZWFjb25faXRydmw7CS8qIGluIDEwMjQgbXMgKi8KKwl1MzIgbWF4X2luc3Rfc2l6ZTsKKwl1MzIgbWF4X2RhdGFfc2l6ZTsKKwl1MzIgbWF4X2JzbV9zaXplOworCXUzMiBjdF9raWxsX3RocmVzaG9sZDsJLyogdmFsdWUgaW4gaHctZGVwZW5kZW50IHVuaXRzICovCisJdTE2IGJlYWNvbl90aW1lX3RzZl9iaXRzOworCWNvbnN0IHN0cnVjdCBpbF9zZW5zaXRpdml0eV9yYW5nZXMgKnNlbnM7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGNvcmUgbW9kdWxlIHdoaWNoIGFyZSBmb3J3YXJkIGRlY2xhcmVkIGhlcmUKKyAqIGZvciB1c2UgYnkgaXdsLVs0LTVdLmMKKyAqCisgKiBOT1RFOiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGhhcmR3YXJlIHNwZWNpZmljCisgKiB3aGljaCBpcyB3aHkgdGhleSBhcmUgaW4gdGhlIGNvcmUgbW9kdWxlIGZpbGVzLgorICoKKyAqIE5hbWluZyBjb252ZW50aW9uIC0tCisgKiBpbF8gICAgICAgICA8LS0gSXMgcGFydCBvZiBpd2x3aWZpCisgKiBpd2xYWFhYXyAgICAgPC0tIEhhcmR3YXJlIHNwZWNpZmljIChpbXBsZW1lbnRlZCBpbiBpd2wtWFhYWC5jIGZvciBYWFhYKQorICogaWw0OTY1X2JnXyAgICAgIDwtLSBDYWxsZWQgZnJvbSB3b3JrIHF1ZXVlIGNvbnRleHQKKyAqIGlsNDk2NV9tYWNfICAgICA8LS0gbWFjODAyMTEgY2FsbGJhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB2b2lkIGlsNDk2NV91cGRhdGVfY2hhaW5fZmxhZ3Moc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBjb25zdCB1OCBpbF9iY2FzdF9hZGRyW0VUSF9BTEVOXTsKK2V4dGVybiBpbnQgaWxfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGlsX3F1ZXVlICpxKTsKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9xdWV1ZV91c2VkKGNvbnN0IHN0cnVjdCBpbF9xdWV1ZSAqcSwgaW50IGkpCit7CisJcmV0dXJuIHEtPndyaXRlX3B0ciA+PSBxLT5yZWFkX3B0ciA/IChpID49IHEtPnJlYWRfcHRyICYmCisJCQkJCSAgICAgIGkgPCBxLT53cml0ZV9wdHIpIDogIShpIDwKKwkJCQkJCQkJICAgIHEtPnJlYWRfcHRyCisJCQkJCQkJCSAgICAmJiBpID49CisJCQkJCQkJCSAgICBxLT4KKwkJCQkJCQkJICAgIHdyaXRlX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsX2dldF9jbWRfaWR4KHN0cnVjdCBpbF9xdWV1ZSAqcSwgdTMyIGlkeCwgaW50IGlzX2h1Z2UpCit7CisJLyoKKwkgKiBUaGlzIGlzIGZvciBpbml0IGNhbGlicmF0aW9uIHJlc3VsdCBhbmQgc2NhbiBjb21tYW5kIHdoaWNoCisJICogcmVxdWlyZWQgYnVmZmVyID4gVEZEX01BWF9QQVlMT0FEX1NJWkUsCisJICogdGhlIGJpZyBidWZmZXIgYXQgZW5kIG9mIGNvbW1hbmQgYXJyYXkKKwkgKi8KKwlpZiAoaXNfaHVnZSkKKwkJcmV0dXJuIHEtPm5fd2luOwkvKiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KKworCS8qIE90aGVyd2lzZSwgdXNlIG5vcm1hbCBzaXplIGJ1ZmZlcnMgKi8KKwlyZXR1cm4gaWR4ICYgKHEtPm5fd2luIC0gMSk7Cit9CisKK3N0cnVjdCBpbF9kbWFfcHRyIHsKKwlkbWFfYWRkcl90IGRtYTsKKwl2b2lkICphZGRyOworCXNpemVfdCBzaXplOworfTsKKworI2RlZmluZSBJTF9PUEVSQVRJT05fTU9ERV9BVVRPICAgICAwCisjZGVmaW5lIElMX09QRVJBVElPTl9NT0RFX0hUX09OTFkgIDEKKyNkZWZpbmUgSUxfT1BFUkFUSU9OX01PREVfTUlYRUQgICAgMgorI2RlZmluZSBJTF9PUEVSQVRJT05fTU9ERV8yME1IWiAgICAzCisKKyNkZWZpbmUgSUxfVFhfQ1JDX1NJWkUgNAorI2RlZmluZSBJTF9UWF9ERUxJTUlURVJfU0laRSA0CisKKyNkZWZpbmUgVFhfUE9XRVJfSUxfSUxMRUdBTF9WT0xUQUdFIC0xMDAwMAorCisvKiBTZW5zaXRpdml0eSBhbmQgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgSU5JVElBTElaQVRJT05fVkFMVUUJCTB4RkZGRgorI2RlZmluZSBJTDQ5NjVfQ0FMX05VTV9CRUFDT05TCQkyMAorI2RlZmluZSBJTF9DQUxfTlVNX0JFQUNPTlMJCTE2CisjZGVmaW5lIE1BWElNVU1fQUxMT1dFRF9QQVRITE9TUwkxNQorCisjZGVmaW5lIENIQUlOX05PSVNFX01BWF9ERUxUQV9HQUlOX0NPREUgMworCisjZGVmaW5lIE1BWF9GQV9PRkRNICA1MAorI2RlZmluZSBNSU5fRkFfT0ZETSAgNQorI2RlZmluZSBNQVhfRkFfQ0NLICAgNTAKKyNkZWZpbmUgTUlOX0ZBX0NDSyAgIDUKKworI2RlZmluZSBBVVRPX0NPUlJfU1RFUF9PRkRNICAgICAgIDEKKworI2RlZmluZSBBVVRPX0NPUlJfU1RFUF9DQ0sgICAgIDMKKyNkZWZpbmUgQVVUT19DT1JSX01BWF9USF9DQ0sgICAxNjAKKworI2RlZmluZSBOUkdfRElGRiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTlJHX1NURVBfQ0NLICAgICAgICAgICAyCisjZGVmaW5lIE5SR19NQVJHSU4gICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTlVNQkVSX0NDS19OT19GQSAxMDAKKworI2RlZmluZSBBVVRPX0NPUlJfQ0NLX01JTl9WQUxfREVGICAgICgxMjUpCisKKyNkZWZpbmUgQ0hBSU5fQSAgICAgICAgICAgICAwCisjZGVmaW5lIENIQUlOX0IgICAgICAgICAgICAgMQorI2RlZmluZSBDSEFJTl9DICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTCA0CisjZGVmaW5lIEFMTF9CQU5EX0ZJTFRFUgkJCTB4RkYwMAorI2RlZmluZSBJTl9CQU5EX0ZJTFRFUgkJCTB4RkYKKyNkZWZpbmUgTUlOX0FWRVJBR0VfTk9JU0VfTUFYX1ZBTFVFCTB4RkZGRkZGRkYKKworI2RlZmluZSBOUkdfTlVNX1BSRVZfU1RBVF9MICAgICAyMAorI2RlZmluZSBOVU1fUlhfQ0hBSU5TICAgICAgICAgICAzCisKK2VudW0gaWw0OTY1X2ZhbHNlX2FsYXJtX3N0YXRlIHsKKwlJTF9GQV9UT09fTUFOWSA9IDAsCisJSUxfRkFfVE9PX0ZFVyA9IDEsCisJSUxfRkFfR09PRF9SQU5HRSA9IDIsCit9OworCitlbnVtIGlsNDk2NV9jaGFpbl9ub2lzZV9zdGF0ZSB7CisJSUxfQ0hBSU5fTk9JU0VfQUxJVkUgPSAwLAkvKiBtdXN0IGJlIDAgKi8KKwlJTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFLAorCUlMX0NIQUlOX05PSVNFX0NBTElCUkFURUQsCisJSUxfQ0hBSU5fTk9JU0VfRE9ORSwKK307CisKK2VudW0gaWw0OTY1X2NhbGliX2VuYWJsZWRfc3RhdGUgeworCUlMX0NBTElCX0RJU0FCTEVEID0gMCwJLyogbXVzdCBiZSAwICovCisJSUxfQ0FMSUJfRU5BQkxFRCA9IDEsCit9OworCisvKgorICogZW51bSBpbF9jYWxpYgorICogZGVmaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggcmVzdWx0cyBvZiBpbml0aWFsIGNhbGlicmF0aW9ucworICogc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgdUNvZGUKKyAqLworZW51bSBpbF9jYWxpYiB7CisJSUxfQ0FMSUJfTUFYLAorfTsKKworLyogT3BhcXVlIGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KK3N0cnVjdCBpbF9jYWxpYl9yZXN1bHQgeworCXZvaWQgKmJ1ZjsKKwlzaXplX3QgYnVmX2xlbjsKK307CisKK2VudW0gdWNvZGVfdHlwZSB7CisJVUNPREVfTk9ORSA9IDAsCisJVUNPREVfSU5JVCwKKwlVQ09ERV9SVAorfTsKKworLyogU2Vuc2l0aXZpdHkgY2FsaWIgZGF0YSAqLworc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgeworCXUzMiBhdXRvX2NvcnJfb2ZkbTsKKwl1MzIgYXV0b19jb3JyX29mZG1fbXJjOworCXUzMiBhdXRvX2NvcnJfb2ZkbV94MTsKKwl1MzIgYXV0b19jb3JyX29mZG1fbXJjX3gxOworCXUzMiBhdXRvX2NvcnJfY2NrOworCXUzMiBhdXRvX2NvcnJfY2NrX21yYzsKKworCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9vZmRtOworCXUzMiBsYXN0X2ZhX2NudF9vZmRtOworCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9jY2s7CisJdTMyIGxhc3RfZmFfY250X2NjazsKKworCXUzMiBucmdfY3Vycl9zdGF0ZTsKKwl1MzIgbnJnX3ByZXZfc3RhdGU7CisJdTMyIG5yZ192YWx1ZVsxMF07CisJdTggbnJnX3NpbGVuY2VfcnNzaVtOUkdfTlVNX1BSRVZfU1RBVF9MXTsKKwl1MzIgbnJnX3NpbGVuY2VfcmVmOworCXUzMiBucmdfZW5lcmd5X2lkeDsKKwl1MzIgbnJnX3NpbGVuY2VfaWR4OworCXUzMiBucmdfdGhfY2NrOworCXMzMiBucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZjsKKwl1MzIgbnVtX2luX2Nja19ub19mYTsKKwl1MzIgbnJnX3RoX29mZG07CisKKwl1MTYgYmFya2VyX2NvcnJfdGhfbWluOworCXUxNiBiYXJrZXJfY29ycl90aF9taW5fbXJjOworCXUxNiBucmdfdGhfY2NhOworfTsKKworLyogQ2hhaW4gbm9pc2UgKGRpZmZlcmVudGlhbCBSeCBnYWluKSBjYWxpYiBkYXRhICovCitzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSB7CisJdTMyIGFjdGl2ZV9jaGFpbnM7CisJdTMyIGNoYWluX25vaXNlX2E7CisJdTMyIGNoYWluX25vaXNlX2I7CisJdTMyIGNoYWluX25vaXNlX2M7CisJdTMyIGNoYWluX3NpZ25hbF9hOworCXUzMiBjaGFpbl9zaWduYWxfYjsKKwl1MzIgY2hhaW5fc2lnbmFsX2M7CisJdTE2IGJlYWNvbl9jb3VudDsKKwl1OCBkaXNjb25uX2FycmF5W05VTV9SWF9DSEFJTlNdOworCXU4IGRlbHRhX2dhaW5fY29kZVtOVU1fUlhfQ0hBSU5TXTsKKwl1OCByYWRpb193cml0ZTsKKwl1OCBzdGF0ZTsKK307CisKKyNkZWZpbmUJRUVQUk9NX1NFTV9USU1FT1VUIDEwCS8qIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBFRVBST01fU0VNX1JFVFJZX0xJTUlUIDEwMDAJLyogbnVtYmVyIG9mIGF0dGVtcHRzIChub3QgdGltZSkgKi8KKworI2RlZmluZSBJTF9UUkFGRklDX0VOVFJJRVMJKDI1NikKKyNkZWZpbmUgSUxfVFJBRkZJQ19FTlRSWV9TSVpFICAoNjQpCisKK2VudW0geworCU1FQVNVUkVNRU5UX1JFQURZID0gKDEgPDwgMCksCisJTUVBU1VSRU1FTlRfQUNUSVZFID0gKDEgPDwgMSksCit9OworCisvKiBpbnRlcnJ1cHQgc3RhdHMgKi8KK3N0cnVjdCBpc3Jfc3RhdHMgeworCXUzMiBodzsKKwl1MzIgc3c7CisJdTMyIGVycl9jb2RlOworCXUzMiBzY2g7CisJdTMyIGFsaXZlOworCXUzMiByZmtpbGw7CisJdTMyIGN0a2lsbDsKKwl1MzIgd2FrZXVwOworCXUzMiByeDsKKwl1MzIgaGFuZGxlcnNbSUxfQ05fTUFYXTsKKwl1MzIgdHg7CisJdTMyIHVuaGFuZGxlZDsKK307CisKKy8qIG1hbmFnZW1lbnQgc3RhdHMgKi8KK2VudW0gaWxfbWdtdF9zdGF0cyB7CisJTUFOQUdFTUVOVF9BU1NPQ19SRVEgPSAwLAorCU1BTkFHRU1FTlRfQVNTT0NfUkVTUCwKKwlNQU5BR0VNRU5UX1JFQVNTT0NfUkVRLAorCU1BTkFHRU1FTlRfUkVBU1NPQ19SRVNQLAorCU1BTkFHRU1FTlRfUFJPQkVfUkVRLAorCU1BTkFHRU1FTlRfUFJPQkVfUkVTUCwKKwlNQU5BR0VNRU5UX0JFQUNPTiwKKwlNQU5BR0VNRU5UX0FUSU0sCisJTUFOQUdFTUVOVF9ESVNBU1NPQywKKwlNQU5BR0VNRU5UX0FVVEgsCisJTUFOQUdFTUVOVF9ERUFVVEgsCisJTUFOQUdFTUVOVF9BQ1RJT04sCisJTUFOQUdFTUVOVF9NQVgsCit9OworLyogY29udHJvbCBzdGF0cyAqLworZW51bSBpbF9jdHJsX3N0YXRzIHsKKwlDT05UUk9MX0JBQ0tfUkVRID0gMCwKKwlDT05UUk9MX0JBQ0ssCisJQ09OVFJPTF9QU1BPTEwsCisJQ09OVFJPTF9SVFMsCisJQ09OVFJPTF9DVFMsCisJQ09OVFJPTF9BQ0ssCisJQ09OVFJPTF9DRkVORCwKKwlDT05UUk9MX0NGRU5EQUNLLAorCUNPTlRST0xfTUFYLAorfTsKKworc3RydWN0IHRyYWZmaWNfc3RhdHMgeworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJdTMyIG1nbXRbTUFOQUdFTUVOVF9NQVhdOworCXUzMiBjdHJsW0NPTlRST0xfTUFYXTsKKwl1MzIgZGF0YV9jbnQ7CisJdTY0IGRhdGFfYnl0ZXM7CisjZW5kaWYKK307CisKKy8qCisgKiBob3N0IGludGVycnVwdCB0aW1lb3V0IHZhbHVlCisgKiB1c2VkIHdpdGggc2V0dGluZyBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lcgorICogdGhlIENTUl9JTlRfQ09BTEVTQ0lORyBpcyBhbiA4IGJpdCByZWdpc3RlciBpbiAzMi11c2VjIHVuaXQKKyAqCisgKiBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVyIGlzIDY0IHggMzIgPSAyMDQ4IHVzZWNzCisgKiBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjaW5nIGNhbGlicmF0aW9uIHRpbWVyIGlzIDE2IHggMzIgPSA1MTIgdXNlY3MKKyAqLworI2RlZmluZSBJTF9IT1NUX0lOVF9USU1FT1VUX01BWAkoMHhGRikKKyNkZWZpbmUgSUxfSE9TVF9JTlRfVElNRU9VVF9ERUYJKDB4NDApCisjZGVmaW5lIElMX0hPU1RfSU5UX1RJTUVPVVRfTUlOCSgweDApCisjZGVmaW5lIElMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfTUFYCSgweEZGKQorI2RlZmluZSBJTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX0RFRgkoMHgxMCkKKyNkZWZpbmUgSUxfSE9TVF9JTlRfQ0FMSUJfVElNRU9VVF9NSU4JKDB4MCkKKworI2RlZmluZSBJTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRCAoSFoqNSkKKworLyogVFggcXVldWUgd2F0Y2hkb2cgdGltZW91dHMgaW4gbVNlY3MgKi8KKyNkZWZpbmUgSUxfREVGX1dEX1RJTUVPVVQJKDIwMDApCisjZGVmaW5lIElMX0xPTkdfV0RfVElNRU9VVAkoMTAwMDApCisjZGVmaW5lIElMX01BWF9XRF9USU1FT1VUCSgxMjAwMDApCisKK3N0cnVjdCBpbF9mb3JjZV9yZXNldCB7CisJaW50IHJlc2V0X3JlcXVlc3RfY291bnQ7CisJaW50IHJlc2V0X3N1Y2Nlc3NfY291bnQ7CisJaW50IHJlc2V0X3JlamVjdF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X2R1cmF0aW9uOworCXVuc2lnbmVkIGxvbmcgbGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzOworfTsKKworLyogZXh0ZW5kIGJlYWNvbiB0aW1lIGZvcm1hdCBiaXQgc2hpZnRpbmcgICovCisvKgorICogZm9yIF8zOTQ1IGRldmljZXMKKyAqIGJpdHMgMzE6MjQgLSBleHRlbmRlZAorICogYml0cyAyMzowICAtIGludGVydmFsCisgKi8KKyNkZWZpbmUgSUwzOTQ1X0VYVF9CRUFDT05fVElNRV9QT1MJMjQKKy8qCisgKiBmb3IgXzQ5NjUgZGV2aWNlcworICogYml0cyAzMToyMiAtIGV4dGVuZGVkCisgKiBiaXRzIDIxOjAgIC0gaW50ZXJ2YWwKKyAqLworI2RlZmluZSBJTDQ5NjVfRVhUX0JFQUNPTl9USU1FX1BPUwkyMgorCitzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCisJY29uc3QgdTggKmFjX3RvX2ZpZm87CisJY29uc3QgdTggKmFjX3RvX3F1ZXVlOworCXU4IG1jYXN0X3F1ZXVlOworCisJLyoKKwkgKiBXZSBjb3VsZCB1c2UgdGhlIHZpZiB0byBpbmRpY2F0ZSBhY3RpdmUsIGJ1dCB3ZQorCSAqIGFsc28gbmVlZCBpdCB0byBiZSBhY3RpdmUgZHVyaW5nIGRpc2FibGluZyB3aGVuCisJICogd2UgYWxyZWFkeSByZW1vdmVkIHRoZSB2aWYgZm9yIHR5cGUgc2V0dGluZy4KKwkgKi8KKwlib29sIGFsd2F5c19hY3RpdmUsIGlzX2FjdGl2ZTsKKworCWJvb2wgaHRfbmVlZF9tdWx0aXBsZV9jaGFpbnM7CisKKwlpbnQgY3R4aWQ7CisKKwl1MzIgaW50ZXJmYWNlX21vZGVzLCBleGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOworCXU4IHVudXNlZF9kZXZ0eXBlLCBhcF9kZXZ0eXBlLCBpYnNzX2RldnR5cGUsIHN0YXRpb25fZGV2dHlwZTsKKworCS8qCisJICogV2UgZGVjbGFyZSB0aGlzIGNvbnN0IHNvIGl0IGNhbiBvbmx5IGJlCisJICogY2hhbmdlZCB2aWEgZXhwbGljaXQgY2FzdCB3aXRoaW4gdGhlCisJICogcm91dGluZXMgdGhhdCBhY3R1YWxseSB1cGRhdGUgdGhlIHBoeXNpY2FsCisJICogaGFyZHdhcmUuCisJICovCisJY29uc3Qgc3RydWN0IGlsX3J4b25fY21kIGFjdGl2ZTsKKwlzdHJ1Y3QgaWxfcnhvbl9jbWQgc3RhZ2luZzsKKworCXN0cnVjdCBpbF9yeG9uX3RpbWVfY21kIHRpbWluZzsKKworCXN0cnVjdCBpbF9xb3NfaW5mbyBxb3NfZGF0YTsKKworCXU4IGJjYXN0X3N0YV9pZCwgYXBfc3RhX2lkOworCisJdTggcnhvbl9jbWQsIHJ4b25fYXNzb2NfY21kLCByeG9uX3RpbWluZ19jbWQ7CisJdTggcW9zX2NtZDsKKwl1OCB3ZXBfa2V5X2NtZDsKKworCXN0cnVjdCBpbF93ZXBfa2V5IHdlcF9rZXlzW1dFUF9LRVlTX01BWF07CisJdTgga2V5X21hcHBpbmdfa2V5czsKKworCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOworCisJc3RydWN0IHsKKwkJYm9vbCBub25fZ2Zfc3RhX3ByZXNlbnQ7CisJCXU4IHByb3RlY3Rpb247CisJCWJvb2wgZW5hYmxlZCwgaXNfNDBtaHo7CisJCXU4IGV4dGVuc2lvbl9jaGFuX29mZnNldDsKKwl9IGh0OworfTsKKworc3RydWN0IGlsX3Bvd2VyX21nciB7CisJc3RydWN0IGlsX3Bvd2VydGFibGVfY21kIHNsZWVwX2NtZDsKKwlzdHJ1Y3QgaWxfcG93ZXJ0YWJsZV9jbWQgc2xlZXBfY21kX25leHQ7CisJaW50IGRlYnVnX3NsZWVwX2xldmVsX292ZXJyaWRlOworCWJvb2wgcGNpX3BtOworfTsKKworc3RydWN0IGlsX3ByaXYgeworCisJLyogaWVlZSBkZXZpY2UgdXNlZCBieSBnZW5lcmljIGllZWUgcHJvY2Vzc2luZyBjb2RlICovCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICppZWVlX2NoYW5uZWxzOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqaWVlZV9yYXRlczsKKwlzdHJ1Y3QgaWxfY2ZnICpjZmc7CisKKwkvKiB0ZW1wb3JhcnkgZnJhbWUgc3RvcmFnZSBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2ZyYW1lczsKKwlpbnQgZnJhbWVzX2NvdW50OworCisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCWludCBhbGxvY19yeGJfcGFnZTsKKworCXZvaWQgKCpoYW5kbGVyc1tJTF9DTl9NQVhdKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICAgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZHNbSUVFRTgwMjExX05VTV9CQU5EU107CisKKwkvKiBzcGVjdHJ1bSBtZWFzdXJlbWVudCByZXBvcnQgY2FjaGluZyAqLworCXN0cnVjdCBpbF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gbWVhc3VyZV9yZXBvcnQ7CisJdTggbWVhc3VyZW1lbnRfc3RhdHVzOworCisJLyogdWNvZGUgYmVhY29uIHRpbWUgKi8KKwl1MzIgdWNvZGVfYmVhY29uX3RpbWU7CisJaW50IG1pc3NlZF9iZWFjb25fdGhyZXNob2xkOworCisJLyogdHJhY2sgSUJTUyBtYW5hZ2VyIChsYXN0IGJlYWNvbikgc3RhdHVzICovCisJdTMyIGlic3NfbWFuYWdlcjsKKworCS8qIGZvcmNlIHJlc2V0ICovCisJc3RydWN0IGlsX2ZvcmNlX3Jlc2V0IGZvcmNlX3Jlc2V0OworCisJLyogd2UgYWxsb2NhdGUgYXJyYXkgb2YgaWxfY2hhbm5lbF9pbmZvIGZvciBOSUMncyB2YWxpZCBjaGFubmVscy4KKwkgKiAgICBBY2Nlc3MgdmlhIGNoYW5uZWwgIyB1c2luZyBpbmRpcmVjdCBpZHggYXJyYXkgKi8KKwlzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaGFubmVsX2luZm87CS8qIGNoYW5uZWwgaW5mbyBhcnJheSAqLworCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgb2YgY2hhbm5lbHMgKi8KKworCS8qIHRoZXJtYWwgY2FsaWJyYXRpb24gKi8KKwlzMzIgdGVtcGVyYXR1cmU7CS8qIGRlZ3JlZXMgS2VsdmluICovCisJczMyIGxhc3RfdGVtcGVyYXR1cmU7CisKKwkvKiBpbml0IGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KKwlzdHJ1Y3QgaWxfY2FsaWJfcmVzdWx0IGNhbGliX3Jlc3VsdHNbSUxfQ0FMSUJfTUFYXTsKKworCS8qIFNjYW4gcmVsYXRlZCB2YXJpYWJsZXMgKi8KKwl1bnNpZ25lZCBsb25nIHNjYW5fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzY2FuX3N0YXJ0X3RzZjsKKwl2b2lkICpzY2FuX2NtZDsKKwllbnVtIGllZWU4MDIxMV9iYW5kIHNjYW5fYmFuZDsKKwlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnNjYW5fdmlmOworCXU4IHNjYW5fdHhfYW50W0lFRUU4MDIxMV9OVU1fQkFORFNdOworCXU4IG1nbXRfdHhfYW50OworCisJLyogc3BpbmxvY2sgKi8KKwlzcGlubG9ja190IGxvY2s7CS8qIHByb3RlY3QgZ2VuZXJhbCBzaGFyZWQgZGF0YSAqLworCXNwaW5sb2NrX3QgaGNtZF9sb2NrOwkvKiBwcm90ZWN0IGhjbWQgKi8KKwlzcGlubG9ja190IHJlZ19sb2NrOwkvKiBwcm90ZWN0IGh3IHJlZ2lzdGVyIGFjY2VzcyAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKworCS8qIGJhc2ljIHBjaS1uZXR3b3JrIGRyaXZlciBzdHVmZiAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCisJLyogcGNpIGhhcmR3YXJlIGFkZHJlc3Mgc3VwcG9ydCAqLworCXZvaWQgX19pb21lbSAqaHdfYmFzZTsKKwl1MzIgaHdfcmV2OworCXUzMiBod193YV9yZXY7CisJdTggcmV2X2lkOworCisJLyogY29tbWFuZCBxdWV1ZSBudW1iZXIgKi8KKwl1OCBjbWRfcXVldWU7CisKKwkvKiBtYXggbnVtYmVyIG9mIHN0YXRpb24ga2V5cyAqLworCXU4IHN0YV9rZXlfbWF4X251bTsKKworCS8qIEVFUFJPTSBNQUMgYWRkcmVzc2VzICovCisJc3RydWN0IG1hY19hZGRyZXNzIGFkZHJlc3Nlc1sxXTsKKworCS8qIHVDb2RlIGltYWdlcywgc2F2ZSB0byByZWxvYWQgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJaW50IGZ3X2lkeDsJCS8qIGZpcm13YXJlIHdlJ3JlIHRyeWluZyB0byBsb2FkICovCisJdTMyIHVjb2RlX3ZlcjsJCS8qIHZlcnNpb24gb2YgdWNvZGUsIGNvcHkgb2YKKwkJCQkgICBpbF91Y29kZS52ZXIgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9jb2RlOwkvKiBydW50aW1lIGluc3QgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhOwkvKiBydW50aW1lIGRhdGEgb3JpZ2luYWwgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhX2JhY2t1cDsJLyogcnVudGltZSBkYXRhIHNhdmUvcmVzdG9yZSAqLworCXN0cnVjdCBmd19kZXNjIHVjb2RlX2luaXQ7CS8qIGluaXRpYWxpemF0aW9uIGluc3QgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9pbml0X2RhdGE7CS8qIGluaXRpYWxpemF0aW9uIGRhdGEgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9ib290OwkvKiBib290c3RyYXAgaW5zdCAqLworCWVudW0gdWNvZGVfdHlwZSB1Y29kZV90eXBlOworCXU4IHVjb2RlX3dyaXRlX2NvbXBsZXRlOwkvKiB0aGUgaW1hZ2Ugd3JpdGUgaXMgY29tcGxldGUgKi8KKwljaGFyIGZpcm13YXJlX25hbWVbMjVdOworCisJc3RydWN0IGlsX3J4b25fY29udGV4dCBjdHg7CisKKwlfX2xlMTYgc3dpdGNoX2NoYW5uZWw7CisKKwkvKiAxc3QgcmVzcG9uc2VzIGZyb20gaW5pdGlhbGl6ZSBhbmQgcnVudGltZSB1Q29kZSBpbWFnZXMuCisJICogXzQ5NjUncyBpbml0aWFsaXplIGFsaXZlIHJlc3BvbnNlIGNvbnRhaW5zIHNvbWUgY2FsaWJyYXRpb24gZGF0YS4gKi8KKwlzdHJ1Y3QgaWxfaW5pdF9hbGl2ZV9yZXNwIGNhcmRfYWxpdmVfaW5pdDsKKwlzdHJ1Y3QgaWxfYWxpdmVfcmVzcCBjYXJkX2FsaXZlOworCisJdTE2IGFjdGl2ZV9yYXRlOworCisJdTggc3RhcnRfY2FsaWI7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgc2Vuc2l0aXZpdHlfZGF0YTsKKwlzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSBjaGFpbl9ub2lzZV9kYXRhOworCV9fbGUxNiBzZW5zaXRpdml0eV90YmxbSERfVEJMX1NJWkVdOworCisJc3RydWN0IGlsX2h0X2NvbmZpZyBjdXJyZW50X2h0X2NvbmZpZzsKKworCS8qIFJhdGUgc2NhbGluZyBkYXRhICovCisJdTggcmV0cnlfcmF0ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfY29tbWFuZF9xdWV1ZTsKKworCWludCBhY3Rpdml0eV90aW1lcl9hY3RpdmU7CisKKwkvKiBSeCBhbmQgVHggRE1BIHByb2Nlc3NpbmcgcXVldWVzICovCisJc3RydWN0IGlsX3J4X3F1ZXVlIHJ4cTsKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cTsKKwl1bnNpZ25lZCBsb25nIHR4cV9jdHhfYWN0aXZlX21zazsKKwlzdHJ1Y3QgaWxfZG1hX3B0ciBrdzsJLyoga2VlcCB3YXJtIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaWxfZG1hX3B0ciBzY2RfYmNfdGJsczsKKworCXUzMiBzY2RfYmFzZV9hZGRyOwkvKiBzY2hlZHVsZXIgc3JhbSBiYXNlIGFkZHJlc3MgKi8KKworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJLyogY291bnRzIG1nbXQsIGN0bCwgYW5kIGRhdGEgcGFja2V0cyAqLworCXN0cnVjdCB0cmFmZmljX3N0YXRzIHR4X3N0YXRzOworCXN0cnVjdCB0cmFmZmljX3N0YXRzIHJ4X3N0YXRzOworCisJLyogY291bnRzIGludGVycnVwdHMgKi8KKwlzdHJ1Y3QgaXNyX3N0YXRzIGlzcl9zdGF0czsKKworCXN0cnVjdCBpbF9wb3dlcl9tZ3IgcG93ZXJfZGF0YTsKKworCS8qIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CS8qIHVzZWQgb25seSBvbiAzOTQ1IGJ1dCBmaWxsZWQgYnkgY29yZSAqLworCisJLyogc3RhdGlvbiB0YWJsZSB2YXJpYWJsZXMgKi8KKworCS8qIE5vdGU6IGlmIGxvY2sgYW5kIHN0YV9sb2NrIGFyZSBuZWVkZWQsIGxvY2sgbXVzdCBiZSBhY3F1aXJlZCBmaXJzdCAqLworCXNwaW5sb2NrX3Qgc3RhX2xvY2s7CisJaW50IG51bV9zdGF0aW9uczsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSBzdGF0aW9uc1tJTF9TVEFUSU9OX0NPVU5UXTsKKwl1bnNpZ25lZCBsb25nIHVjb2RlX2tleV90YWJsZTsKKworCS8qIHF1ZXVlIHJlZmNvdW50cyAqLworI2RlZmluZSBJTF9NQVhfSFdfUVVFVUVTCTMyCisJdW5zaWduZWQgbG9uZyBxdWV1ZV9zdG9wcGVkW0JJVFNfVE9fTE9OR1MoSUxfTUFYX0hXX1FVRVVFUyldOworCS8qIGZvciBlYWNoIEFDICovCisJYXRvbWljX3QgcXVldWVfc3RvcF9jb3VudFs0XTsKKworCS8qIEluZGljYXRpb24gaWYgaWVlZTgwMjExX29wcy0+b3BlbiBoYXMgYmVlbiBjYWxsZWQgKi8KKwl1OCBpc19vcGVuOworCisJdTggbWFjODAyMTFfcmVnaXN0ZXJlZDsKKworCS8qIGVlcHJvbSAtLSB0aGlzIGlzIGluIHRoZSBjYXJkJ3MgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyICovCisJdTggKmVlcHJvbTsKKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2luZm8gKmNhbGliX2luZm87CisKKwllbnVtIG5sODAyMTFfaWZ0eXBlIGl3X21vZGU7CisKKwkvKiBMYXN0IFJ4J2QgYmVhY29uIHRpbWVzdGFtcCAqLworCXU2NCB0aW1lc3RhbXA7CisKKwl1bmlvbiB7CisjaWYgZGVmaW5lZChDT05GSUdfSVdMMzk0NSkgfHwgZGVmaW5lZChDT05GSUdfSVdMMzk0NV9NT0RVTEUpCisJCXN0cnVjdCB7CisJCQl2b2lkICpzaGFyZWRfdmlydDsKKwkJCWRtYV9hZGRyX3Qgc2hhcmVkX3BoeXM7CisKKwkJCXN0cnVjdCBkZWxheWVkX3dvcmsgdGhlcm1hbF9wZXJpb2RpYzsKKwkJCXN0cnVjdCBkZWxheWVkX3dvcmsgcmZraWxsX3BvbGw7CisKKwkJCXN0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMgc3RhdHM7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwkJCXN0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMgYWNjdW1fc3RhdHM7CisJCQlzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzIGRlbHRhX3N0YXRzOworCQkJc3RydWN0IGlsMzk0NV9ub3RpZl9zdGF0cyBtYXhfZGVsdGE7CisjZW5kaWYKKworCQkJdTMyIHN0YV9zdXBwX3JhdGVzOworCQkJaW50IGxhc3RfcnhfcnNzaTsJLyogRnJvbSBSeCBwYWNrZXQgc3RhdHMgKi8KKworCQkJLyogUngnZCBwYWNrZXQgdGltaW5nIGluZm9ybWF0aW9uICovCisJCQl1MzIgbGFzdF9iZWFjb25fdGltZTsKKwkJCXU2NCBsYXN0X3RzZjsKKworCQkJLyoKKwkJCSAqIGVhY2ggY2FsaWJyYXRpb24gY2hhbm5lbCBncm91cCBpbiB0aGUKKwkJCSAqIEVFUFJPTSBoYXMgYSBkZXJpdmVkIGNsaXAgc2V0dGluZyBmb3IKKwkJCSAqIGVhY2ggcmF0ZS4KKwkJCSAqLworCQkJY29uc3Qgc3RydWN0IGlsMzk0NV9jbGlwX2dyb3VwIGNsaXBfZ3JvdXBzWzVdOworCisJCX0gXzM5NDU7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19JV0w0OTY1KSB8fCBkZWZpbmVkKENPTkZJR19JV0w0OTY1X01PRFVMRSkKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBpbF9yeF9waHlfcmVzIGxhc3RfcGh5X3JlczsKKwkJCWJvb2wgbGFzdF9waHlfcmVzX3ZhbGlkOworCisJCQlzdHJ1Y3QgY29tcGxldGlvbiBmaXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlOworCisJCQkvKgorCQkJICogY2hhaW4gbm9pc2UgcmVzZXQgYW5kIGdhaW4gY29tbWFuZHMgYXJlIHRoZQorCQkJICogdHdvIGV4dHJhIGNhbGlicmF0aW9uIGNvbW1hbmRzIGZvbGxvd3MgdGhlIHN0YW5kYXJkCisJCQkgKiBwaHkgY2FsaWJyYXRpb24gY29tbWFuZHMKKwkJCSAqLworCQkJdTggcGh5X2NhbGliX2NoYWluX25vaXNlX3Jlc2V0X2NtZDsKKwkJCXU4IHBoeV9jYWxpYl9jaGFpbl9ub2lzZV9nYWluX2NtZDsKKworCQkJc3RydWN0IGlsX25vdGlmX3N0YXRzIHN0YXRzOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgYWNjdW1fc3RhdHM7CisJCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgZGVsdGFfc3RhdHM7CisJCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgbWF4X2RlbHRhOworI2VuZGlmCisKKwkJfSBfNDk2NTsKKyNlbmRpZgorCX07CisKKwlzdHJ1Y3QgaWxfaHdfcGFyYW1zIGh3X3BhcmFtczsKKworCXUzMiBpbnRhX21hc2s7CisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOworCisJc3RydWN0IHdvcmtfc3RydWN0IHJlc3RhcnQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHNjYW5fY29tcGxldGVkOworCXN0cnVjdCB3b3JrX3N0cnVjdCByeF9yZXBsZW5pc2g7CisJc3RydWN0IHdvcmtfc3RydWN0IGFib3J0X3NjYW47CisKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpiZWFjb25fY3R4OworCXN0cnVjdCBza19idWZmICpiZWFjb25fc2tiOworCisJc3RydWN0IHdvcmtfc3RydWN0IHR4X2ZsdXNoOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90YXNrbGV0OworCisJc3RydWN0IGRlbGF5ZWRfd29yayBpbml0X2FsaXZlX3N0YXJ0OworCXN0cnVjdCBkZWxheWVkX3dvcmsgYWxpdmVfc3RhcnQ7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzY2FuX2NoZWNrOworCisJLyogVFggUG93ZXIgKi8KKwlzOCB0eF9wb3dlcl91c2VyX2xtdDsKKwlzOCB0eF9wb3dlcl9kZXZpY2VfbG10OworCXM4IHR4X3Bvd2VyX25leHQ7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwkvKiBkZWJ1Z2dpbmcgaW5mbyAqLworCXUzMiBkZWJ1Z19sZXZlbDsJLyogcGVyIGRldmljZSBkZWJ1Z2dpbmcgd2lsbCBvdmVycmlkZSBnbG9iYWwKKwkJCQkgICBpbF9kZWJ1Z19sZXZlbCBpZiBzZXQgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfSVdMRUdBQ1lfREVCVUcgKi8KKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCS8qIGRlYnVnZnMgKi8KKwl1MTYgdHhfdHJhZmZpY19pZHg7CisJdTE2IHJ4X3RyYWZmaWNfaWR4OworCXU4ICp0eF90cmFmZmljOworCXU4ICpyeF90cmFmZmljOworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOworCXUzMiBkYmdmc19zcmFtX29mZnNldCwgZGJnZnNfc3JhbV9sZW47CisJYm9vbCBkaXNhYmxlX2h0NDA7CisjZW5kaWYJCQkJLyogQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMgKi8KKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eHBvd2VyX3dvcms7CisJdTMyIGRpc2FibGVfc2Vuc19jYWw7CisJdTMyIGRpc2FibGVfY2hhaW5fbm9pc2VfY2FsOworCXUzMiBkaXNhYmxlX3R4X3Bvd2VyX2NhbDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcnVuX3RpbWVfY2FsaWJfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0c19wZXJpb2RpYzsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZzsKKwlib29sIGh3X3JlYWR5OworCisJc3RydWN0IGxlZF9jbGFzc2RldiBsZWQ7CisJdW5zaWduZWQgbG9uZyBibGlua19vbiwgYmxpbmtfb2ZmOworCWJvb2wgbGVkX3JlZ2lzdGVyZWQ7Cit9OwkJCQkvKmlsX3ByaXYgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitpbF90eHFfY3R4X2FjdGl2YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCkKK3sKKwlzZXRfYml0KHR4cV9pZCwgJmlsLT50eHFfY3R4X2FjdGl2ZV9tc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3R4cV9jdHhfZGVhY3RpdmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQpCit7CisJY2xlYXJfYml0KHR4cV9pZCwgJmlsLT50eHFfY3R4X2FjdGl2ZV9tc2spOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfaGRyICoKK2lsX3R4X3F1ZXVlX2dldF9oZHIoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4KQoreworCWlmIChpbC0+dHhxW3R4cV9pZF0udHhiW2lkeF0uc2tiKQorCQlyZXR1cm4gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaWwtPnR4cVt0eHFfaWRdLnR4YltpZHhdLnNrYi0+CisJCSAgICBkYXRhOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKgoraWxfcnhvbl9jdHhfZnJvbV92aWYoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCisJcmV0dXJuIHZpZl9wcml2LT5jdHg7Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfY29udGV4dChpbCwgX2N0eCkgXAorCWZvciAoX2N0eCA9ICZpbC0+Y3R4OyBfY3R4ID09ICZpbC0+Y3R4OyBfY3R4KyspCisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19hc3NvY2lhdGVkKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gKGlsLT5jdHguYWN0aXZlLmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSykgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsX2lzX2FueV9hc3NvY2lhdGVkKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gaWxfaXNfYXNzb2NpYXRlZChpbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19hc3NvY2lhdGVkX2N0eChzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIChjdHgtPmFjdGl2ZS5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19jaGFubmVsX3ZhbGlkKGNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8pCit7CisJaWYgKGNoX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChjaF9pbmZvLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1ZBTElEKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY2hhbm5lbF9yYWRhcihjb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQoreworCXJldHVybiAoY2hfaW5mby0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSB1OAoraWxfaXNfY2hhbm5lbF9hX2JhbmQoY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbykKK3sKKwlyZXR1cm4gY2hfaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY2hhbm5lbF9wYXNzaXZlKGNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoKQoreworCXJldHVybiAoIShjaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9BQ1RJVkUpKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY2hhbm5lbF9pYnNzKGNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoKQoreworCXJldHVybiAoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfSUJTUykgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2lsX2ZyZWVfcGFnZXMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlfX2ZyZWVfcGFnZXMocGFnZSwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9mcmVlX3BhZ2VzKHN0cnVjdCBpbF9wcml2ICppbCwgdW5zaWduZWQgbG9uZyBwYWdlKQoreworCWZyZWVfcGFnZXMocGFnZSwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKK30KKworI2RlZmluZSBJV0xXSUZJX1ZFUlNJT04gImluLXRyZWU6IgorI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0yMDExIEludGVsIENvcnBvcmF0aW9uIgorI2RlZmluZSBEUlZfQVVUSE9SICAgICAiPGlsd0BsaW51eC5pbnRlbC5jb20+IgorCisjZGVmaW5lIElMX1BDSV9ERVZJQ0UoZGV2LCBzdWJkZXYsIGNmZykgXAorCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLCAgLmRldmljZSA9IChkZXYpLCBcCisJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsIC5zdWJkZXZpY2UgPSAoc3ViZGV2KSwgXAorCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkmKGNmZykKKworI2RlZmluZSBUSU1FX1VOSVQJCTEwMjQKKworI2RlZmluZSBJTF9TS1VfRyAgICAgICAweDEKKyNkZWZpbmUgSUxfU0tVX0EgICAgICAgMHgyCisjZGVmaW5lIElMX1NLVV9OICAgICAgIDB4OAorCisjZGVmaW5lIElMX0NNRCh4KSBjYXNlIHg6IHJldHVybiAjeAorCisvKiBTaXplIG9mIG9uZSBSeCBidWZmZXIgaW4gaG9zdCBEUkFNICovCisjZGVmaW5lIElMX1JYX0JVRl9TSVpFXzNLICgzICogMTAwMCkJLyogMzk0NSBvbmx5ICovCisjZGVmaW5lIElMX1JYX0JVRl9TSVpFXzRLICg0ICogMTAyNCkKKyNkZWZpbmUgSUxfUlhfQlVGX1NJWkVfOEsgKDggKiAxMDI0KQorCitzdHJ1Y3QgaWxfaGNtZF9vcHMgeworCWludCAoKnJ4b25fYXNzb2MpIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisJaW50ICgqY29tbWl0X3J4b24pIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisJdm9pZCAoKnNldF9yeG9uX2NoYWluKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit9OworCitzdHJ1Y3QgaWxfaGNtZF91dGlsc19vcHMgeworCXUxNigqZ2V0X2hjbWRfc2l6ZSkgKHU4IGNtZF9pZCwgdTE2IGxlbik7CisJdTE2KCpidWlsZF9hZGRzdGFfaGNtZCkgKGNvbnN0IHN0cnVjdCBpbF9hZGRzdGFfY21kICpjbWQsIHU4ICpkYXRhKTsKKwlpbnQgKCpyZXF1ZXN0X3NjYW4pIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOworCXZvaWQgKCpwb3N0X3NjYW4pIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworfTsKKworc3RydWN0IGlsX2FwbV9vcHMgeworCWludCAoKmluaXQpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCXZvaWQgKCpjb25maWcpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworfTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCitzdHJ1Y3QgaWxfZGVidWdmc19vcHMgeworCXNzaXplX3QoKnJ4X3N0YXRzX3JlYWQpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisJc3NpemVfdCgqdHhfc3RhdHNfcmVhZCkgKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKwlzc2l6ZV90KCpnZW5lcmFsX3N0YXRzX3JlYWQpIChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJCQkgICAgICBsb2ZmX3QgKnBwb3MpOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgaWxfdGVtcF9vcHMgeworCXZvaWQgKCp0ZW1wZXJhdHVyZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7Cit9OworCitzdHJ1Y3QgaWxfbGliX29wcyB7CisJLyogc2V0IGh3IGRlcGVuZGVudCBwYXJhbWV0ZXJzICovCisJaW50ICgqc2V0X2h3X3BhcmFtcykgKHN0cnVjdCBpbF9wcml2ICppbCk7CisJLyogSGFuZGxpbmcgVFggKi8KKwl2b2lkICgqdHhxX3VwZGF0ZV9ieXRlX2NudF90YmwpIChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJCSBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwKKwkJCQkJIHUxNiBieXRlX2NudCk7CisJaW50ICgqdHhxX2F0dGFjaF9idWZfdG9fdGZkKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICAgIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLCBkbWFfYWRkcl90IGFkZHIsCisJCQkJICAgICAgdTE2IGxlbiwgdTggcmVzZXQsIHU4IHBhZCk7CisJdm9pZCAoKnR4cV9mcmVlX3RmZCkgKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpOworCWludCAoKnR4cV9pbml0KSAoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7CisJLyogc2V0dXAgUnggaGFuZGxlciAqLworCXZvaWQgKCpoYW5kbGVyX3NldHVwKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwkvKiBhbGl2ZSBub3RpZmljYXRpb24gYWZ0ZXIgaW5pdCB1Q29kZSBsb2FkICovCisJdm9pZCAoKmluaXRfYWxpdmVfc3RhcnQpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCS8qIGNoZWNrIHZhbGlkaXR5IG9mIHJ0YyBkYXRhIGFkZHJlc3MgKi8KKwlpbnQgKCppc192YWxpZF9ydGNfZGF0YV9hZGRyKSAodTMyIGFkZHIpOworCS8qIDFzdCB1Y29kZSBsb2FkICovCisJaW50ICgqbG9hZF91Y29kZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKwl2b2lkICgqZHVtcF9uaWNfZXJyb3JfbG9nKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwlpbnQgKCpkdW1wX2ZoKSAoc3RydWN0IGlsX3ByaXYgKmlsLCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOworCWludCAoKnNldF9jaGFubmVsX3N3aXRjaCkgKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpOworCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgaWxfYXBtX29wcyBhcG1fb3BzOworCisJLyogcG93ZXIgKi8KKwlpbnQgKCpzZW5kX3R4X3Bvd2VyKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwl2b2lkICgqdXBkYXRlX2NoYWluX2ZsYWdzKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworCS8qIGVlcHJvbSBvcGVyYXRpb25zICovCisJc3RydWN0IGlsX2VlcHJvbV9vcHMgZWVwcm9tX29wczsKKworCS8qIHRlbXBlcmF0dXJlICovCisJc3RydWN0IGlsX3RlbXBfb3BzIHRlbXBfb3BzOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwlzdHJ1Y3QgaWxfZGVidWdmc19vcHMgZGVidWdmc19vcHM7CisjZW5kaWYKKworfTsKKworc3RydWN0IGlsX2xlZF9vcHMgeworCWludCAoKmNtZCkgKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xlZF9jbWQgKmxlZF9jbWQpOworfTsKKworc3RydWN0IGlsX2xlZ2FjeV9vcHMgeworCXZvaWQgKCpwb3N0X2Fzc29jaWF0ZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7CisJdm9pZCAoKmNvbmZpZ19hcCkgKHN0cnVjdCBpbF9wcml2ICppbCk7CisJLyogc3RhdGlvbiBtYW5hZ2VtZW50ICovCisJaW50ICgqdXBkYXRlX2JjYXN0X3N0YXRpb25zKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwlpbnQgKCptYW5hZ2VfaWJzc19zdGF0aW9uKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGFkZCk7Cit9OworCitzdHJ1Y3QgaWxfb3BzIHsKKwljb25zdCBzdHJ1Y3QgaWxfbGliX29wcyAqbGliOworCWNvbnN0IHN0cnVjdCBpbF9oY21kX29wcyAqaGNtZDsKKwljb25zdCBzdHJ1Y3QgaWxfaGNtZF91dGlsc19vcHMgKnV0aWxzOworCWNvbnN0IHN0cnVjdCBpbF9sZWRfb3BzICpsZWQ7CisJY29uc3Qgc3RydWN0IGlsX25pY19vcHMgKm5pYzsKKwljb25zdCBzdHJ1Y3QgaWxfbGVnYWN5X29wcyAqbGVnYWN5OworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzICppZWVlODAyMTFfb3BzOworfTsKKworc3RydWN0IGlsX21vZF9wYXJhbXMgeworCWludCBzd19jcnlwdG87CQkvKiBkZWY6IDAgPSB1c2luZyBoYXJkd2FyZSBlbmNyeXB0aW9uICovCisJaW50IGRpc2FibGVfaHdfc2NhbjsJLyogZGVmOiAwID0gdXNlIGgvdyBzY2FuICovCisJaW50IG51bV9vZl9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCisJaW50IGRpc2FibGVfMTFuOwkvKiBkZWY6IDAgPSAxMW4gY2FwYWJpbGl0aWVzIGVuYWJsZWQgKi8KKwlpbnQgYW1zZHVfc2l6ZV84SzsJLyogZGVmOiAxID0gZW5hYmxlIDhLIGFtc2R1IHNpemUgKi8KKwlpbnQgYW50ZW5uYTsJCS8qIGRlZjogMCA9IGJvdGggYW50ZW5uYXMgKHVzZSBkaXZlcnNpdHkpICovCisJaW50IHJlc3RhcnRfZnc7CQkvKiBkZWY6IDEgPSByZXN0YXJ0IGZpcm13YXJlICovCit9OworCisvKgorICogQGxlZF9jb21wZW5zYXRpb246IGNvbXBlbnNhdGUgb24gdGhlIGxlZCBvbi9vZmYgdGltZSBwZXIgSFcgYWNjb3JkaW5nCisgKgl0byB0aGUgZGV2aWF0aW9uIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgbGVkIGZyZXF1ZW5jeS4KKyAqCVRoZSBkZXRhaWwgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBjb21tb24uYworICogQGNoYWluX25vaXNlX251bV9iZWFjb25zOiBudW1iZXIgb2YgYmVhY29ucyB1c2VkIHRvIGNvbXB1dGUgY2hhaW4gbm9pc2UKKyAqIEB3ZF90aW1lb3V0OiBUWCBxdWV1ZXMgd2F0Y2hkb2cgdGltZW91dAorICogQHRlbXBlcmF0dXJlX2tlbHZpbjogdGVtcGVyYXR1cmUgcmVwb3J0IGJ5IHVDb2RlIGluIGtlbHZpbgorICogQHVjb2RlX3RyYWNpbmc6IHN1cHBvcnQgdWNvZGUgY29udGludW91cyB0cmFjaW5nCisgKiBAc2Vuc2l0aXZpdHlfY2FsaWJfYnlfZHJpdmVyOiBkcml2ZXIgaGFzIHRoZSBjYXBhYmlsaXR5IHRvIHBlcmZvcm0KKyAqCXNlbnNpdGl2aXR5IGNhbGlicmF0aW9uIG9wZXJhdGlvbgorICogQGNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcjogZHJpdmVyIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBwZXJmb3JtCisgKgljaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBvcGVyYXRpb24KKyAqLworc3RydWN0IGlsX2Jhc2VfcGFyYW1zIHsKKwlpbnQgZWVwcm9tX3NpemU7CisJaW50IG51bV9vZl9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCisJaW50IG51bV9vZl9hbXBkdV9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCisJLyogZm9yIGlsX2FwbV9pbml0KCkgKi8KKwl1MzIgcGxsX2NmZ192YWw7CisJYm9vbCBzZXRfbDBzOworCWJvb2wgdXNlX2JzbTsKKworCXUxNiBsZWRfY29tcGVuc2F0aW9uOworCWludCBjaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKwl1bnNpZ25lZCBpbnQgd2RfdGltZW91dDsKKwlib29sIHRlbXBlcmF0dXJlX2tlbHZpbjsKKwljb25zdCBib29sIHVjb2RlX3RyYWNpbmc7CisJY29uc3QgYm9vbCBzZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXI7CisJY29uc3QgYm9vbCBjaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXI7Cit9OworCisjZGVmaW5lIElMX0xFRF9TT0xJRCAxMQorI2RlZmluZSBJTF9ERUZfTEVEX0lOVFJWTCBjcHVfdG9fbGUzMigxMDAwKQorCisjZGVmaW5lIElMX0xFRF9BQ1RJVklUWSAgICAgICAoMDw8MSkKKyNkZWZpbmUgSUxfTEVEX0xJTksgICAgICAgICAgICgxPDwxKQorCisvKgorICogTEVEIG1vZGUKKyAqICAgIElMX0xFRF9ERUZBVUxUOiAgdXNlIGRldmljZSBkZWZhdWx0CisgKiAgICBJTF9MRURfUkZfU1RBVEU6IHR1cm4gTEVEIG9uL29mZiBiYXNlZCBvbiBSRiBzdGF0ZQorICoJCQlMRUQgT04gID0gUkYgT04KKyAqCQkJTEVEIE9GRiA9IFJGIE9GRgorICogICAgSUxfTEVEX0JMSU5LOiAgICBhZGp1c3QgbGVkIGJsaW5rIHJhdGUgYmFzZWQgb24gYmxpbmsgdGFibGUKKyAqLworZW51bSBpbF9sZWRfbW9kZSB7CisJSUxfTEVEX0RFRkFVTFQsCisJSUxfTEVEX1JGX1NUQVRFLAorCUlMX0xFRF9CTElOSywKK307CisKK3ZvaWQgaWxfbGVkc19pbml0KHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsX2xlZHNfZXhpdChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKioKKyAqIHN0cnVjdCBpbF9jZmcKKyAqIEBmd19uYW1lX3ByZTogRmlybXdhcmUgZmlsZW5hbWUgcHJlZml4LiBUaGUgYXBpIHZlcnNpb24gYW5kIGV4dGVuc2lvbgorICoJKC51Y29kZSkgd2lsbCBiZSBhZGRlZCB0byBmaWxlbmFtZSBiZWZvcmUgbG9hZGluZyBmcm9tIGRpc2suIFRoZQorICoJZmlsZW5hbWUgaXMgY29uc3RydWN0ZWQgYXMgZndfbmFtZV9wcmU8YXBpPi51Y29kZS4KKyAqIEB1Y29kZV9hcGlfbWF4OiBIaWdoZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCisgKiBAdWNvZGVfYXBpX21pbjogTG93ZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCisgKiBAc2Nhbl9hbnRlbm5hczogYXZhaWxhYmxlIGFudGVubmEgZm9yIHNjYW4gb3BlcmF0aW9uCisgKiBAbGVkX21vZGU6IDA9YmxpbmtpbmcsIDE9T24oUkYgT24pL09mZihSRiBPZmYpCisgKgorICogV2UgZW5hYmxlIHRoZSBkcml2ZXIgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3cnQgQVBJIHZlcnNpb24uIFRoZQorICogZHJpdmVyIHNwZWNpZmllcyB3aGljaCBBUElzIGl0IHN1cHBvcnRzICh3aXRoIEB1Y29kZV9hcGlfbWF4IGJlaW5nIHRoZQorICogaGlnaGVzdCBhbmQgQHVjb2RlX2FwaV9taW4gdGhlIGxvd2VzdCkuIEZpcm13YXJlIHdpbGwgb25seSBiZSBsb2FkZWQgaWYKKyAqIGl0IGhhcyBhIHN1cHBvcnRlZCBBUEkgdmVyc2lvbi4gVGhlIGZpcm13YXJlJ3MgQVBJIHZlcnNpb24gd2lsbCBiZQorICogc3RvcmVkIGluIEBpbF9wcml2LCBlbmFibGluZyB0aGUgZHJpdmVyIHRvIG1ha2UgcnVudGltZSBjaGFuZ2VzIGJhc2VkCisgKiBvbiBmaXJtd2FyZSB2ZXJzaW9uIHVzZWQuCisgKgorICogRm9yIGV4YW1wbGUsCisgKiBpZiAoSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpID49IDIpIHsKKyAqCURyaXZlciBpbnRlcmFjdHMgd2l0aCBGaXJtd2FyZSBBUEkgdmVyc2lvbiA+PSAyLgorICogfSBlbHNlIHsKKyAqCURyaXZlciBpbnRlcmFjdHMgd2l0aCBGaXJtd2FyZSBBUEkgdmVyc2lvbiAxLgorICogfQorICoKKyAqIFRoZSBpZGVhbCB1c2FnZSBvZiB0aGlzIGluZnJhc3RydWN0dXJlIGlzIHRvIHRyZWF0IGEgbmV3IHVjb2RlIEFQSQorICogcmVsZWFzZSBhcyBhIG5ldyBoYXJkd2FyZSByZXZpc2lvbi4gVGhhdCBpcywgdGhyb3VnaCB1dGlsaXppbmcgdGhlCisgKiBpbF9oY21kX3V0aWxzX29wcyBldGMuIHdlIGFjY29tbW9kYXRlIGRpZmZlcmVudCBjb21tYW5kIHN0cnVjdHVyZXMKKyAqIGFuZCBmbG93cyBiZXR3ZWVuIGhhcmR3YXJlIHZlcnNpb25zIGFzIHdlbGwgYXMgdGhlaXIgQVBJCisgKiB2ZXJzaW9ucy4KKyAqCisgKi8KK3N0cnVjdCBpbF9jZmcgeworCS8qIHBhcmFtcyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIGRldmljZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpmd19uYW1lX3ByZTsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21heDsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21pbjsKKwl1OCB2YWxpZF90eF9hbnQ7CisJdTggdmFsaWRfcnhfYW50OworCXVuc2lnbmVkIGludCBza3U7CisJdTE2IGVlcHJvbV92ZXI7CisJdTE2IGVlcHJvbV9jYWxpYl92ZXI7CisJY29uc3Qgc3RydWN0IGlsX29wcyAqb3BzOworCS8qIG1vZHVsZSBiYXNlZCBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBzZXQgZnJvbSBtb2Rwcm9iZSBjbWQgKi8KKwljb25zdCBzdHJ1Y3QgaWxfbW9kX3BhcmFtcyAqbW9kX3BhcmFtczsKKwkvKiBwYXJhbXMgbm90IGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLworCXN0cnVjdCBpbF9iYXNlX3BhcmFtcyAqYmFzZV9wYXJhbXM7CisJLyogcGFyYW1zIGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLworCXU4IHNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX05VTV9CQU5EU107CisJZW51bSBpbF9sZWRfbW9kZSBsZWRfbW9kZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgTCBpIGIgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBpZWVlODAyMTFfaHcgKmlsX2FsbG9jX2FsbChzdHJ1Y3QgaWxfY2ZnICpjZmcpOworaW50IGlsX21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICB1MTYgcXVldWUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpOworaW50IGlsX21hY190eF9sYXN0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisKK3ZvaWQgaWxfc2V0X3J4b25faHdjcnlwdG8oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgIGludCBod19kZWNyeXB0KTsKK2ludCBpbF9jaGVja19yeG9uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CitpbnQgaWxfZnVsbF9yeG9uX3JlcXVpcmVkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KTsKK2ludCBpbF9zZXRfcnhvbl9jaGFubmVsKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaCwKKwkJCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit2b2lkIGlsX3NldF9mbGFnc19mb3JfYmFuZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cit1OCBpbF9nZXRfc2luZ2xlX2NoYW5uZWxfbnVtYmVyKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKTsKK3ZvaWQgaWxfc2V0X3J4b25faHQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaHRfY29uZmlnICpodF9jb25mKTsKK2Jvb2wgaWxfaXNfaHQ0MF90eF9hbGxvd2VkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXApOwordm9pZCBpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit2b2lkIGlsX3NldF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfc2V0X2RlY3J5cHRlZF9mbGFnKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgdTMyIGRlY3J5cHRfcmVzLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHMpOwordm9pZCBpbF9pcnFfaGFuZGxlX2Vycm9yKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfbWFjX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwordm9pZCBpbF9tYWNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CitpbnQgaWxfbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgZW51bSBubDgwMjExX2lmdHlwZSBuZXd0eXBlLCBib29sIG5ld3AycCk7CitpbnQgaWxfYWxsb2NfdHhxX21lbShzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF90eHFfbWVtKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworaW50IGlsX2FsbG9jX3RyYWZmaWNfbWVtKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsX2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfcmVzZXRfdHJhZmZpY19sb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IGxlbmd0aCwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpOwordm9pZCBpbF9kYmdfbG9nX3J4X2RhdGFfZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgbGVuZ3RoLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcik7Citjb25zdCBjaGFyICppbF9nZXRfbWdtdF9zdHJpbmcoaW50IGNtZCk7Citjb25zdCBjaGFyICppbF9nZXRfY3RybF9zdHJpbmcoaW50IGNtZCk7Cit2b2lkIGlsX2NsZWFyX3RyYWZmaWNfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfdXBkYXRlX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgYm9vbCBpc190eCwgX19sZTE2IGZjLCB1MTYgbGVuKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAoraWxfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3Jlc2V0X3RyYWZmaWNfbG9nKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9kYmdfbG9nX3R4X2RhdGFfZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgbGVuZ3RoLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IGxlbmd0aCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgaXNfdHgsIF9fbGUxNiBmYywgdTE2IGxlbikKK3sKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSWCBoYW5kbGVycy4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbF9oZGxfcG1fc2xlZXAoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbF9oZGxfcG1fZGVidWdfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbF9oZGxfZXJyb3Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUlgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWxfY21kX3F1ZXVlX3VubWFwKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsX2NtZF9xdWV1ZV9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfcnhfcXVldWVfYWxsb2Moc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcSk7CitpbnQgaWxfcnhfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGlsX3J4X3F1ZXVlICpxKTsKK3ZvaWQgaWxfdHhfY21kX2NvbXBsZXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKy8qIEhhbmRsZXJzICovCit2b2lkIGlsX2hkbF9zcGVjdHJ1bV9tZWFzdXJlbWVudChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7Cit2b2lkIGlsX3JlY292ZXJfZnJvbV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCk7Cit2b2lkIGlsX2Noc3dpdGNoX2RvbmUoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGlzX3N1Y2Nlc3MpOwordm9pZCBpbF9oZGxfY3NhKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKworLyogVFggaGVscGVycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVFgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7CitpbnQgaWxfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLCBpbnQgc2xvdHNfbnVtLAorCQkgICAgIHUzMiB0eHFfaWQpOwordm9pZCBpbF90eF9xdWV1ZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkgICAgICAgaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCk7Cit2b2lkIGlsX3R4X3F1ZXVlX3VubWFwKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCk7Cit2b2lkIGlsX3R4X3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkKTsKK3ZvaWQgaWxfc2V0dXBfd2F0Y2hkb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVFggcG93ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGlsX3NldF90eF9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHM4IHR4X3Bvd2VyLCBib29sIGZvcmNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGlsX2dldF9sb3dlc3RfcGxjcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTY2FubmluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWxfaW5pdF9zY2FuX3BhcmFtcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsX3NjYW5fY2FuY2VsKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfc2Nhbl9jYW5jZWxfdGltZW91dChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHVuc2lnbmVkIGxvbmcgbXMpOwordm9pZCBpbF9mb3JjZV9zY2FuX2VuZChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsX21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpOwordm9pZCBpbF9pbnRlcm5hbF9zaG9ydF9od19zY2FuKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfZm9yY2VfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGV4dGVybmFsKTsKK3UxNiBpbF9maWxsX3Byb2JlX3JlcShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqZnJhbWUsCisJCSAgICAgIGNvbnN0IHU4ICp0YSwgY29uc3QgdTggKmllLCBpbnQgaWVfbGVuLCBpbnQgbGVmdCk7Cit2b2lkIGlsX3NldHVwX3J4X3NjYW5faGFuZGxlcnMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3UxNiBpbF9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQkgICAgIHU4IG5fcHJvYmVzKTsKK3UxNiBpbF9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cit2b2lkIGlsX3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qIEZvciBmYXN0ZXIgYWN0aXZlIHNjYW5uaW5nLCBzY2FuIHdpbGwgbW92ZSB0byB0aGUgbmV4dCBjaGFubmVsIGlmIGZld2VyIHRoYW4KKyAqIFBMQ1BfUVVJRVRfVEhSRVNIIHBhY2tldHMgYXJlIGhlYXJkIG9uIHRoaXMgY2hhbm5lbCB3aXRoaW4KKyAqIEFDVElWRV9RVUlFVF9USU1FIGFmdGVyIHNlbmRpbmcgcHJvYmUgcmVxdWVzdC4gIFRoaXMgc2hvcnRlbnMgdGhlIGR3ZWxsCisgKiB0aW1lIGlmIGl0J3MgYSBxdWlldCBjaGFubmVsIChub3RoaW5nIHJlc3BvbmRlZCB0byBvdXIgcHJvYmUsIGFuZCB0aGVyZSdzCisgKiBubyBvdGhlciB0cmFmZmljKS4KKyAqIERpc2FibGUgInF1aWV0IiBmZWF0dXJlIGJ5IHNldHRpbmcgUExDUF9RVUlFVF9USFJFU0ggdG8gMC4gKi8KKyNkZWZpbmUgSUxfQUNUSVZFX1FVSUVUX1RJTUUgICAgICAgY3B1X3RvX2xlMTYoMTApCS8qIG1zZWMgKi8KKyNkZWZpbmUgSUxfUExDUF9RVUlFVF9USFJFU0ggICAgICAgY3B1X3RvX2xlMTYoMSkJLyogcGFja2V0cyAqLworCisjZGVmaW5lIElMX1NDQU5fQ0hFQ0tfV0FUQ0hET0cJCShIWiAqIDcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBTIGUgbiBkIGkgbiBnICAgICBIIG8gcyB0ICAgICBDIG8gbSBtIGEgbiBkIHMgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IGNoYXIgKmlsX2dldF9jbWRfc3RyaW5nKHU4IGNtZCk7CitpbnQgX19tdXN0X2NoZWNrIGlsX3NlbmRfY21kX3N5bmMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaG9zdF9jbWQgKmNtZCk7CitpbnQgaWxfc2VuZF9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaG9zdF9jbWQgKmNtZCk7CitpbnQgX19tdXN0X2NoZWNrIGlsX3NlbmRfY21kX3BkdShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGlkLCB1MTYgbGVuLAorCQkJCSBjb25zdCB2b2lkICpkYXRhKTsKK2ludCBpbF9zZW5kX2NtZF9wZHVfYXN5bmMoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgdm9pZCAoKmNhbGxiYWNrKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCQkgICAgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCQkJICAgIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCkpOworCitpbnQgaWxfZW5xdWV1ZV9oY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2hvc3RfY21kICpjbWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBDSQkJCQkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHUxNgoraWxfcGNpZV9saW5rX2N0bChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHBvczsKKwl1MTYgcGNpX2xua19jdGw7CisJcG9zID0gcGNpX3BjaWVfY2FwKGlsLT5wY2lfZGV2KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChpbC0+cGNpX2RldiwgcG9zICsgUENJX0VYUF9MTktDVEwsICZwY2lfbG5rX2N0bCk7CisJcmV0dXJuIHBjaV9sbmtfY3RsOworfQorCit2b2lkIGlsX2JnX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit1MzIgaWxfdXNlY3NfdG9fYmVhY29ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiB1c2VjLCB1MzIgYmVhY29uX2ludGVydmFsKTsKK19fbGUzMiBpbF9hZGRfYmVhY29uX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYmFzZSwgdTMyIGFkZG9uLAorCQkJICB1MzIgYmVhY29uX2ludGVydmFsKTsKKworI2lmZGVmIENPTkZJR19QTQoraW50IGlsX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CitpbnQgaWxfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGlsX3BtX29wczsKKworI2RlZmluZSBJTF9MRUdBQ1lfUE1fT1BTCSgmaWxfcG1fb3BzKQorCisjZWxzZSAvKiAhQ09ORklHX1BNICovCisKKyNkZWZpbmUgSUxfTEVHQUNZX1BNX09QUwlOVUxMCisKKyNlbmRpZiAvKiAhQ09ORklHX1BNICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRXJyb3IgSGFuZGxpbmcgRGVidWdnaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGlsNDk2NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK3ZvaWQgaWxfcHJpbnRfcnhfY29uZmlnX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitpbF9wcmludF9yeF9jb25maWdfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworfQorI2VuZGlmCisKK3ZvaWQgaWxfY2xlYXJfaXNyX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgR0VPUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGlsX2luaXRfZ2VvcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF9mcmVlX2dlb3Moc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyoqKioqKioqKioqKioqKiBEUklWRVIgU1RBVFVTIEZVTkNUSU9OUyAgICoqKioqLworCisjZGVmaW5lIFNfSENNRF9BQ1RJVkUJMAkvKiBob3N0IGNvbW1hbmQgaW4gcHJvZ3Jlc3MgKi8KKy8qIDEgaXMgdW51c2VkICh1c2VkIHRvIGJlIFNfSENNRF9TWU5DX0FDVElWRSkgKi8KKyNkZWZpbmUgU19JTlRfRU5BQkxFRAkyCisjZGVmaW5lIFNfUkZfS0lMTF9IVwkzCisjZGVmaW5lIFNfQ1RfS0lMTAkJNAorI2RlZmluZSBTX0lOSVQJCTUKKyNkZWZpbmUgU19BTElWRQkJNgorI2RlZmluZSBTX1JFQURZCQk3CisjZGVmaW5lIFNfVEVNUEVSQVRVUkUJOAorI2RlZmluZSBTX0dFT19DT05GSUdVUkVECTkKKyNkZWZpbmUgU19FWElUX1BFTkRJTkcJMTAKKyNkZWZpbmUgU19TVEFUUwkJMTIKKyNkZWZpbmUgU19TQ0FOTklORwkJMTMKKyNkZWZpbmUgU19TQ0FOX0FCT1JUSU5HCTE0CisjZGVmaW5lIFNfU0NBTl9IVwkJMTUKKyNkZWZpbmUgU19QT1dFUl9QTUkJMTYKKyNkZWZpbmUgU19GV19FUlJPUgkJMTcKKyNkZWZpbmUgU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE4CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19yZWFkeShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogVGhlIGFkYXB0ZXIgaXMgJ3JlYWR5JyBpZiBSRUFEWSBhbmQgR0VPX0NPTkZJR1VSRUQgYml0cyBhcmUKKwkgKiBzZXQgYnV0IEVYSVRfUEVORElORyBpcyBub3QgKi8KKwlyZXR1cm4gdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpICYmCisJICAgIHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKSAmJgorCSAgICAhdGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsX2lzX2FsaXZlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoU19BTElWRSwgJmlsLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJcmV0dXJuIHRlc3RfYml0KFNfSU5JVCwgJmlsLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfcmZraWxsX2h3KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19yZmtpbGwoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiBpbF9pc19yZmtpbGxfaHcoaWwpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY3RraWxsKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoU19DVF9LSUxMLCAmaWwtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19yZWFkeV9yZihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaWxfaXNfcmVhZHkoaWwpOworfQorCitleHRlcm4gdm9pZCBpbF9zZW5kX2J0X2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbF9zZW5kX3N0YXRzX3JlcXVlc3Qoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBmbGFncywgYm9vbCBjbGVhcik7Cit2b2lkIGlsX2FwbV9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfYXBtX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworaW50IGlsX3NlbmRfcnhvbl90aW1pbmcoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpOworc3RhdGljIGlubGluZSBpbnQKK2lsX3NlbmRfcnhvbl9hc3NvYyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gaWwtPmNmZy0+b3BzLT5oY21kLT5yeG9uX2Fzc29jKGlsLCBjdHgpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfY29tbWl0X3J4b24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGlsLT5jZmctPm9wcy0+aGNtZC0+Y29tbWl0X3J4b24oaWwsIGN0eCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqCitpbF9nZXRfaHdfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwlyZXR1cm4gaWwtPmh3LT53aXBoeS0+YmFuZHNbYmFuZF07Cit9CisKKy8qIG1hYzgwMjExIGhhbmRsZXJzICovCitpbnQgaWxfbWFjX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpOwordm9pZCBpbF9tYWNfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKK3ZvaWQgaWxfbWFjX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLCB1MzIgY2hhbmdlcyk7Cit2b2lkIGlsX3R4X2NtZF9wcm90ZWN0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICBfX2xlMTYgZmMsIF9fbGUzMiAqdHhfZmxhZ3MpOworCitpcnFyZXR1cm5fdCBpbF9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSk7CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQKK19pbF93cml0ZTgoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgb2ZzLCB1OCB2YWwpCit7CisJaW93cml0ZTgodmFsLCBpbC0+aHdfYmFzZSArIG9mcyk7Cit9CisjZGVmaW5lIGlsX3dyaXRlOChpbCwgb2ZzLCB2YWwpIF9pbF93cml0ZTgoaWwsIG9mcywgdmFsKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19pbF93cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBvZnMsIHUzMiB2YWwpCit7CisJaW93cml0ZTMyKHZhbCwgaWwtPmh3X2Jhc2UgKyBvZnMpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorX2lsX3JkKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG9mcykKK3sKKwlyZXR1cm4gaW9yZWFkMzIoaWwtPmh3X2Jhc2UgKyBvZnMpOworfQorCisjZGVmaW5lIElMX1BPTExfSU5URVJWQUwgMTAJLyogbWljcm9zZWNvbmRzICovCitzdGF0aWMgaW5saW5lIGludAorX2lsX3BvbGxfYml0KHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIGFkZHIsIHUzMiBiaXRzLCB1MzIgbWFzaywgaW50IHRpbWVvdXQpCit7CisJaW50IHQgPSAwOworCisJZG8geworCQlpZiAoKF9pbF9yZChpbCwgYWRkcikgJiBtYXNrKSA9PSAoYml0cyAmIG1hc2spKQorCQkJcmV0dXJuIHQ7CisJCXVkZWxheShJTF9QT0xMX0lOVEVSVkFMKTsKKwkJdCArPSBJTF9QT0xMX0lOVEVSVkFMOworCX0gd2hpbGUgKHQgPCB0aW1lb3V0KTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19pbF9zZXRfYml0KHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJX2lsX3dyKGlsLCByZWcsIF9pbF9yZChpbCwgcmVnKSB8IG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3NldF9iaXQoc3RydWN0IGlsX3ByaXYgKnAsIHUzMiByLCB1MzIgbSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlfaWxfc2V0X2JpdChwLCByLCBtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfaWxfY2xlYXJfYml0KHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJX2lsX3dyKGlsLCByZWcsIF9pbF9yZChpbCwgcmVnKSAmIH5tYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9jbGVhcl9iaXQoc3RydWN0IGlsX3ByaXYgKnAsIHUzMiByLCB1MzIgbSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlfaWxfY2xlYXJfYml0KHAsIHIsIG0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX2lsX2dyYWJfbmljX2FjY2VzcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJLyogdGhpcyBiaXQgd2FrZXMgdXAgdGhlIE5JQyAqLworCV9pbF9zZXRfYml0KGlsLCBDU1JfR1BfQ05UUkwsIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7CisKKwkvKgorCSAqIFRoZXNlIGJpdHMgc2F5IHRoZSBkZXZpY2UgaXMgcnVubmluZywgYW5kIHNob3VsZCBrZWVwIHJ1bm5pbmcgZm9yCisJICogYXQgbGVhc3QgYSBzaG9ydCB3aGlsZSAoYXQgbGVhc3QgYXMgbG9uZyBhcyBNQUNfQUNDRVNTX1JFUSBzdGF5cyAxKSwKKwkgKiBidXQgdGhleSBkbyBub3QgaW5kaWNhdGUgdGhhdCBlbWJlZGRlZCBTUkFNIGlzIHJlc3RvcmVkIHlldDsKKwkgKiAzOTQ1IGFuZCA0OTY1IGhhdmUgdm9sYXRpbGUgU1JBTSwgYW5kIG11c3Qgc2F2ZS9yZXN0b3JlIGNvbnRlbnRzCisJICogdG8vZnJvbSBob3N0IERSQU0gd2hlbiBzbGVlcGluZy93YWtpbmcgZm9yIHBvd2VyLXNhdmluZy4KKwkgKiBFYWNoIGRpcmVjdGlvbiB0YWtlcyBhcHByb3hpbWF0ZWx5IDEvNCBtaWxsaXNlY29uZDsgd2l0aCB0aGlzCisJICogb3ZlcmhlYWQsIGl0J3MgYSBnb29kIGlkZWEgdG8gZ3JhYiBhbmQgaG9sZCBNQUNfQUNDRVNTX1JFUVVFU1QgaWYgYQorCSAqIHNlcmllcyBvZiByZWdpc3RlciBhY2Nlc3NlcyBhcmUgZXhwZWN0ZWQgKGUuZy4gcmVhZGluZyBFdmVudCBMb2cpLAorCSAqIHRvIGtlZXAgZGV2aWNlIGZyb20gc2xlZXBpbmcuCisJICoKKwkgKiBDU1JfVUNPREVfRFJWX0dQMSByZWdpc3RlciBiaXQgTUFDX1NMRUVQID09IDAgaW5kaWNhdGVzIHRoYXQKKwkgKiBTUkFNIGlzIG9rYXkvcmVzdG9yZWQuICBXZSBkb24ndCBjaGVjayB0aGF0IGhlcmUgYmVjYXVzZSB0aGlzIGNhbGwKKwkgKiBpcyBqdXN0IGZvciBoYXJkd2FyZSByZWdpc3RlciBhY2Nlc3M7IGJ1dCBHUDEgTUFDX1NMRUVQIGNoZWNrIGlzIGEKKwkgKiBnb29kIGlkZWEgYmVmb3JlIGFjY2Vzc2luZyAzOTQ1LzQ5NjUgU1JBTSAoZS5nLiByZWFkaW5nIEV2ZW50IExvZykuCisJICoKKwkgKi8KKwlyZXQgPQorCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9HUF9DTlRSTCwgQ1NSX0dQX0NOVFJMX1JFR19WQUxfTUFDX0FDQ0VTU19FTiwKKwkJCSAoQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSB8CisJCQkgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19HT0lOR19UT19TTEVFUCksIDE1MDAwKTsKKwlpZiAocmV0IDwgMCkgeworCQl2YWwgPSBfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCk7CisJCUlMX0VSUigiTUFDIGlzIGluIGRlZXAgc2xlZXAhLiAgQ1NSX0dQX0NOVFJMID0gMHglMDhYXG4iLCB2YWwpOworCQlfaWxfd3IoaWwsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX0ZPUkNFX05NSSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19pbF9yZWxlYXNlX25pY19hY2Nlc3Moc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9pbF9jbGVhcl9iaXQoaWwsIENTUl9HUF9DTlRSTCwgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2lsX3JkKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZykKK3sKKwl1MzIgdmFsdWU7CisJdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpOworCXZhbHVlID0gX2lsX3JkKGlsLCByZWcpOworCV9pbF9yZWxlYXNlX25pY19hY2Nlc3MoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlyZXR1cm4gdmFsdWU7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF93cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByZWcsIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJaWYgKCFfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKSkgeworCQlfaWxfd3IoaWwsIHJlZywgdmFsdWUpOworCQlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3dyaXRlX3JlZ19idWYoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgcmVnLCB1MzIgbGVuLCB1MzIgKiB2YWx1ZXMpCit7CisJdTMyIGNvdW50ID0gc2l6ZW9mKHUzMik7CisKKwlpZiAoaWwgIT0gTlVMTCAmJiB2YWx1ZXMgIT0gTlVMTCkgeworCQlmb3IgKDsgMCA8IGxlbjsgbGVuIC09IGNvdW50LCByZWcgKz0gY291bnQsIHZhbHVlcysrKQorCQkJaWxfd3IoaWwsIHJlZywgKnZhbHVlcyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfcG9sbF9iaXQoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYWRkciwgdTMyIG1hc2ssIGludCB0aW1lb3V0KQoreworCWludCB0ID0gMDsKKworCWRvIHsKKwkJaWYgKChpbF9yZChpbCwgYWRkcikgJiBtYXNrKSA9PSBtYXNrKQorCQkJcmV0dXJuIHQ7CisJCXVkZWxheShJTF9QT0xMX0lOVEVSVkFMKTsKKwkJdCArPSBJTF9QT0xMX0lOVEVSVkFMOworCX0gd2hpbGUgKHQgPCB0aW1lb3V0KTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorX2lsX3JkX3BycGgoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgcmVnKQoreworCV9pbF93cihpbCwgSEJVU19UQVJHX1BSUEhfUkFERFIsIHJlZyB8ICgzIDw8IDI0KSk7CisJcm1iKCk7CisJcmV0dXJuIF9pbF9yZChpbCwgSEJVU19UQVJHX1BSUEhfUkRBVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitpbF9yZF9wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKwl1MzIgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKTsKKwl2YWwgPSBfaWxfcmRfcHJwaChpbCwgcmVnKTsKKwlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfaWxfd3JfcHJwaChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyLCB1MzIgdmFsKQoreworCV9pbF93cihpbCwgSEJVU19UQVJHX1BSUEhfV0FERFIsICgoYWRkciAmIDB4MDAwMEZGRkYpIHwgKDMgPDwgMjQpKSk7CisJd21iKCk7CisJX2lsX3dyKGlsLCBIQlVTX1RBUkdfUFJQSF9XREFULCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3dyX3BycGgoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYWRkciwgdTMyIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJaWYgKCFfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKSkgeworCQlfaWxfd3JfcHJwaChpbCwgYWRkciwgdmFsKTsKKwkJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KKworI2RlZmluZSBfaWxfc2V0X2JpdHNfcHJwaChpbCwgcmVnLCBtYXNrKSBcCitfaWxfd3JfcHJwaChpbCwgcmVnLCAoX2lsX3JkX3BycGgoaWwsIHJlZykgfCBtYXNrKSkKKworc3RhdGljIGlubGluZSB2b2lkCitpbF9zZXRfYml0c19wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpOworCV9pbF9zZXRfYml0c19wcnBoKGlsLCByZWcsIG1hc2spOworCV9pbF9yZWxlYXNlX25pY19hY2Nlc3MoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KKworI2RlZmluZSBfaWxfc2V0X2JpdHNfbWFza19wcnBoKGlsLCByZWcsIGJpdHMsIG1hc2spIFwKK19pbF93cl9wcnBoKGlsLCByZWcsCQkJCVwKKwkJICgoX2lsX3JkX3BycGgoaWwsIHJlZykgJiBtYXNrKSB8IGJpdHMpKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3NldF9iaXRzX21hc2tfcHJwaChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByZWcsIHUzMiBiaXRzLCB1MzIgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJX2lsX2dyYWJfbmljX2FjY2VzcyhpbCk7CisJX2lsX3NldF9iaXRzX21hc2tfcHJwaChpbCwgcmVnLCBiaXRzLCBtYXNrKTsKKwlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfY2xlYXJfYml0c19wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7CisJdTMyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJX2lsX2dyYWJfbmljX2FjY2VzcyhpbCk7CisJdmFsID0gX2lsX3JkX3BycGgoaWwsIHJlZyk7CisJX2lsX3dyX3BycGgoaWwsIHJlZywgKHZhbCAmIH5tYXNrKSk7CisJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgoraWxfcmVhZF90YXJnX21lbShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCXUzMiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJX2lsX2dyYWJfbmljX2FjY2VzcyhpbCk7CisKKwlfaWxfd3IoaWwsIEhCVVNfVEFSR19NRU1fUkFERFIsIGFkZHIpOworCXJtYigpOworCXZhbHVlID0gX2lsX3JkKGlsLCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCisJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF93cml0ZV90YXJnX21lbShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyLCB1MzIgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlpZiAoIV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpKSB7CisJCV9pbF93cihpbCwgSEJVU19UQVJHX01FTV9XQUREUiwgYWRkcik7CisJCXdtYigpOworCQlfaWxfd3IoaWwsIEhCVVNfVEFSR19NRU1fV0RBVCwgdmFsKTsKKwkJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF93cml0ZV90YXJnX21lbV9idWYoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYWRkciwgdTMyIGxlbiwgdTMyICogdmFsdWVzKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlpZiAoIV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpKSB7CisJCV9pbF93cihpbCwgSEJVU19UQVJHX01FTV9XQUREUiwgYWRkcik7CisJCXdtYigpOworCQlmb3IgKDsgMCA8IGxlbjsgbGVuIC09IHNpemVvZih1MzIpLCB2YWx1ZXMrKykKKwkJCV9pbF93cihpbCwgSEJVU19UQVJHX01FTV9XREFULCAqdmFsdWVzKTsKKworCQlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCisjZGVmaW5lIEhXX0tFWV9EWU5BTUlDIDAKKyNkZWZpbmUgSFdfS0VZX0RFRkFVTFQgMQorCisjZGVmaW5lIElMX1NUQV9EUklWRVJfQUNUSVZFIEJJVCgwKQkvKiBkcml2ZXIgZW50cnkgaXMgYWN0aXZlICovCisjZGVmaW5lIElMX1NUQV9VQ09ERV9BQ1RJVkUgIEJJVCgxKQkvKiB1Y29kZSBlbnRyeSBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MgIEJJVCgyKQkvKiB1Y29kZSBlbnRyeSBpcyBpbiBwcm9jZXNzIG9mCisJCQkJCSAgIGJlaW5nIGFjdGl2YXRlZCAqLworI2RlZmluZSBJTF9TVEFfTE9DQUwgQklUKDMpCS8qIHN0YXRpb24gc3RhdGUgbm90IGRpcmVjdGVkIGJ5IG1hYzgwMjExOworCQkJCSAgICh0aGlzIGlzIGZvciB0aGUgSUJTUyBCU1NJRCBzdGF0aW9ucykgKi8KKyNkZWZpbmUgSUxfU1RBX0JDQVNUIEJJVCg0KQkvKiB0aGlzIHN0YXRpb24gaXMgdGhlIHNwZWNpYWwgYmNhc3Qgc3RhdGlvbiAqLworCit2b2lkIGlsX3Jlc3RvcmVfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpOwordm9pZCBpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit2b2lkIGlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2ludCBpbF9nZXRfZnJlZV91Y29kZV9rZXlfaWR4KHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfc2VuZF9hZGRfc3RhKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2FkZHN0YV9jbWQgKnN0YSwgdTggZmxhZ3MpOworaW50IGlsX2FkZF9zdGF0aW9uX2NvbW1vbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgY29uc3QgdTggKmFkZHIsIGJvb2wgaXNfYXAsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4ICpzdGFfaWRfcik7CitpbnQgaWxfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCB1OCBzdGFfaWQsIGNvbnN0IHU4ICogYWRkcik7CitpbnQgaWxfbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOworCit1OCBpbF9wcmVwX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCSAgIGNvbnN0IHU4ICphZGRyLCBib29sIGlzX2FwLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKKworaW50IGlsX3NlbmRfbHFfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkgICBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEsIHU4IGZsYWdzLCBib29sIGluaXQpOworCisvKioKKyAqIGlsX2NsZWFyX2RyaXZlcl9zdGF0aW9ucyAtIGNsZWFyIGtub3dsZWRnZSBvZiBhbGwgc3RhdGlvbnMgZnJvbSBkcml2ZXIKKyAqIEBpbDogaXdsIGlsIHN0cnVjdAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBpbF9kb3duKCkgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhlIGNhc2UKKyAqIHdlJ3JlIGNvbWluZyB0aGVyZSBmcm9tIGEgaGFyZHdhcmUgcmVzdGFydCBtYWM4MDIxMSB3aWxsIGJlCisgKiBhYmxlIHRvIHJlY29uZmlndXJlIHN0YXRpb25zIC0tIGlmIHdlJ3JlIGdldHRpbmcgdGhlcmUgaW4gdGhlCisgKiBub3JtYWwgZG93biBmbG93IHRoZW4gdGhlIHN0YXRpb25zIHdpbGwgYWxyZWFkeSBiZSBjbGVhcmVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2NsZWFyX2RyaXZlcl9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwltZW1zZXQoaWwtPnN0YXRpb25zLCAwLCBzaXplb2YoaWwtPnN0YXRpb25zKSk7CisJaWwtPm51bV9zdGF0aW9ucyA9IDA7CisKKwlpbC0+dWNvZGVfa2V5X3RhYmxlID0gMDsKKworCS8qCisJICogUmVtb3ZlIGFsbCBrZXkgaW5mb3JtYXRpb24gdGhhdCBpcyBub3Qgc3RvcmVkIGFzIHBhcnQKKwkgKiBvZiBzdGF0aW9uIGluZm9ybWF0aW9uIHNpbmNlIG1hYzgwMjExIG1heSBub3QgaGF2ZSBoYWQKKwkgKiBhIGNoYW5jZSB0byByZW1vdmUgYWxsIHRoZSBrZXlzLiBXaGVuIGRldmljZSBpcworCSAqIHJlY29uZmlndXJlZCBieSBtYWM4MDIxMSBhZnRlciBhbiBlcnJvciBhbGwga2V5cyB3aWxsCisJICogYmUgcmVjb25maWd1cmVkLgorCSAqLworCW1lbXNldChjdHgtPndlcF9rZXlzLCAwLCBzaXplb2YoY3R4LT53ZXBfa2V5cykpOworCWN0eC0+a2V5X21hcHBpbmdfa2V5cyA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsX3N0YV9pZChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCWlmIChXQVJOX09OKCFzdGEpKQorCQlyZXR1cm4gSUxfSU5WQUxJRF9TVEFUSU9OOworCisJcmV0dXJuICgoc3RydWN0IGlsX3N0YXRpb25fcHJpdl9jb21tb24gKilzdGEtPmRydl9wcml2KS0+c3RhX2lkOworfQorCisvKioKKyAqIGlsX3N0YV9pZF9vcl9icm9hZGNhc3QgLSByZXR1cm4gc3RhX2lkIG9yIGJyb2FkY2FzdCBzdGEKKyAqIEBpbDogaXdsIGlsCisgKiBAY29udGV4dDogdGhlIGN1cnJlbnQgY29udGV4dAorICogQHN0YTogbWFjODAyMTEgc3RhdGlvbgorICoKKyAqIEluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyBtYWM4MDIxMSBwYXNzZXMgYSBzdGF0aW9uIHBvaW50ZXIKKyAqIHRoYXQgbWF5IGJlICVOVUxMLCBmb3IgZXhhbXBsZSBkdXJpbmcgVFggb3Iga2V5IHNldHVwLiBJbgorICogdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgYnJvYWRjYXN0IHN0YXRpb24sIHNvIHRoaXMKKyAqIGlubGluZSB3cmFwcyB0aGF0IHBhdHRlcm4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpbF9zdGFfaWRfb3JfYnJvYWRjYXN0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY29udGV4dCwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJaW50IHN0YV9pZDsKKworCWlmICghc3RhKQorCQlyZXR1cm4gY29udGV4dC0+YmNhc3Rfc3RhX2lkOworCisJc3RhX2lkID0gaWxfc3RhX2lkKHN0YSk7CisKKwkvKgorCSAqIG1hYzgwMjExIHNob3VsZCBub3QgYmUgcGFzc2luZyBhIHBhcnRpYWxseQorCSAqIGluaXRpYWxpc2VkIHN0YXRpb24hCisJICovCisJV0FSTl9PTihzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKTsKKworCXJldHVybiBzdGFfaWQ7Cit9CisKKy8qKgorICogaWxfcXVldWVfaW5jX3dyYXAgLSBpbmNyZW1lbnQgcXVldWUgaWR4LCB3cmFwIGJhY2sgdG8gYmVnaW5uaW5nCisgKiBAaWR4IC0tIGN1cnJlbnQgaWR4CisgKiBAbl9iZCAtLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBxdWV1ZSAobXVzdCBiZSBwb3dlciBvZiAyKQorICovCitzdGF0aWMgaW5saW5lIGludAoraWxfcXVldWVfaW5jX3dyYXAoaW50IGlkeCwgaW50IG5fYmQpCit7CisJcmV0dXJuICsraWR4ICYgKG5fYmQgLSAxKTsKK30KKworLyoqCisgKiBpbF9xdWV1ZV9kZWNfd3JhcCAtIGRlY3JlbWVudCBxdWV1ZSBpZHgsIHdyYXAgYmFjayB0byBlbmQKKyAqIEBpZHggLS0gY3VycmVudCBpZHgKKyAqIEBuX2JkIC0tIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHF1ZXVlIChtdXN0IGJlIHBvd2VyIG9mIDIpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpbF9xdWV1ZV9kZWNfd3JhcChpbnQgaWR4LCBpbnQgbl9iZCkKK3sKKwlyZXR1cm4gLS1pZHggJiAobl9iZCAtIDEpOworfQorCisvKiBUT0RPOiBNb3ZlIGZ3X2Rlc2MgZnVuY3Rpb25zIHRvIGl3bC1wY2kua28gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZnJlZV9md19kZXNjKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBzdHJ1Y3QgZndfZGVzYyAqZGVzYykKK3sKKwlpZiAoZGVzYy0+dl9hZGRyKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmcGNpX2Rldi0+ZGV2LCBkZXNjLT5sZW4sIGRlc2MtPnZfYWRkciwKKwkJCQkgIGRlc2MtPnBfYWRkcik7CisJZGVzYy0+dl9hZGRyID0gTlVMTDsKKwlkZXNjLT5sZW4gPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfYWxsb2NfZndfZGVzYyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IGZ3X2Rlc2MgKmRlc2MpCit7CisJaWYgKCFkZXNjLT5sZW4pIHsKKwkJZGVzYy0+dl9hZGRyID0gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGVzYy0+dl9hZGRyID0KKwkgICAgZG1hX2FsbG9jX2NvaGVyZW50KCZwY2lfZGV2LT5kZXYsIGRlc2MtPmxlbiwgJmRlc2MtPnBfYWRkciwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlyZXR1cm4gKGRlc2MtPnZfYWRkciAhPSBOVUxMKSA/IDAgOiAtRU5PTUVNOworfQorCisvKgorICogd2UgaGF2ZSA4IGJpdHMgdXNlZCBsaWtlIHRoaXM6CisgKgorICogNyA2IDUgNCAzIDIgMSAwCisgKiB8IHwgfCB8IHwgfCB8IHwKKyAqIHwgfCB8IHwgfCB8ICstKy0tLS0tLS0tIEFDIHF1ZXVlICgwLTMpCisgKiB8IHwgfCB8IHwgfAorICogfCArLSstKy0rLSstLS0tLS0tLS0tLS0gSFcgcXVldWUgSUQKKyAqIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHVudXNlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3NldF9zd3FfaWQoc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsIHU4IGFjLCB1OCBod3EpCit7CisJQlVHX09OKGFjID4gMyk7CQkvKiBvbmx5IGhhdmUgMiBiaXRzICovCisJQlVHX09OKGh3cSA+IDMxKTsJLyogb25seSB1c2UgNSBiaXRzICovCisKKwl0eHEtPnN3cV9pZCA9IChod3EgPDwgMikgfCBhYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF93YWtlX3F1ZXVlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpCit7CisJdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKKwl1OCBhYyA9IHF1ZXVlICYgMzsKKwl1OCBod3EgPSAocXVldWUgPj4gMikgJiAweDFmOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChod3EsIGlsLT5xdWV1ZV9zdG9wcGVkKSkKKwkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZpbC0+cXVldWVfc3RvcF9jb3VudFthY10pIDw9IDApCisJCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShpbC0+aHcsIGFjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9zdG9wX3F1ZXVlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpCit7CisJdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKKwl1OCBhYyA9IHF1ZXVlICYgMzsKKwl1OCBod3EgPSAocXVldWUgPj4gMikgJiAweDFmOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGh3cSwgaWwtPnF1ZXVlX3N0b3BwZWQpKQorCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJmlsLT5xdWV1ZV9zdG9wX2NvdW50W2FjXSkgPiAwKQorCQkJaWVlZTgwMjExX3N0b3BfcXVldWUoaWwtPmh3LCBhYyk7Cit9CisKKyNpZmRlZiBpZWVlODAyMTFfc3RvcF9xdWV1ZQorI3VuZGVmIGllZWU4MDIxMV9zdG9wX3F1ZXVlCisjZW5kaWYKKworI2RlZmluZSBpZWVlODAyMTFfc3RvcF9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV9zdG9wX3F1ZXVlCisKKyNpZmRlZiBpZWVlODAyMTFfd2FrZV9xdWV1ZQorI3VuZGVmIGllZWU4MDIxMV93YWtlX3F1ZXVlCisjZW5kaWYKKworI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV93YWtlX3F1ZXVlCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwljbGVhcl9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gdUNvZGUvTklDIHRvIGhvc3QgKi8KKwlfaWxfd3IoaWwsIENTUl9JTlRfTUFTSywgMHgwMDAwMDAwMCk7CisKKwkvKiBhY2tub3dsZWRnZS9jbGVhci9yZXNldCBhbnkgaW50ZXJydXB0cyBzdGlsbCBwZW5kaW5nCisJICogZnJvbSB1Q29kZSBvciBmbG93IGhhbmRsZXIgKFJ4L1R4IERNQSkgKi8KKwlfaWxfd3IoaWwsIENTUl9JTlQsIDB4ZmZmZmZmZmYpOworCV9pbF93cihpbCwgQ1NSX0ZIX0lOVF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2VuYWJsZV9yZmtpbGxfaW50KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfaWxfd3IoaWwsIENTUl9JTlRfTUFTSywgQ1NSX0lOVF9CSVRfUkZfS0lMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXNldF9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpOworCV9pbF93cihpbCwgQ1NSX0lOVF9NQVNLLCBpbC0+aW50YV9tYXNrKTsKK30KKworLyoqCisgKiBpbF9iZWFjb25fdGltZV9tYXNrX2xvdyAtIG1hc2sgb2YgbG93ZXIgMzIgYml0IG9mIGJlYWNvbiB0aW1lCisgKiBAaWwgLS0gcG9pbnRlciB0byBpbF9wcml2IGRhdGEgc3RydWN0dXJlCisgKiBAdHNmX2JpdHMgLS0gbnVtYmVyIG9mIGJpdHMgbmVlZCB0byBzaGlmdCBmb3IgbWFza2luZykKKyAqLworc3RhdGljIGlubGluZSB1MzIKK2lsX2JlYWNvbl90aW1lX21hc2tfbG93KHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IHRzZl9iaXRzKQoreworCXJldHVybiAoMSA8PCB0c2ZfYml0cykgLSAxOworfQorCisvKioKKyAqIGlsX2JlYWNvbl90aW1lX21hc2tfaGlnaCAtIG1hc2sgb2YgaGlnaGVyIDMyIGJpdCBvZiBiZWFjb24gdGltZQorICogQGlsIC0tIHBvaW50ZXIgdG8gaWxfcHJpdiBkYXRhIHN0cnVjdHVyZQorICogQHRzZl9iaXRzIC0tIG51bWJlciBvZiBiaXRzIG5lZWQgdG8gc2hpZnQgZm9yIG1hc2tpbmcpCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitpbF9iZWFjb25fdGltZV9tYXNrX2hpZ2goc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgdHNmX2JpdHMpCit7CisJcmV0dXJuICgoMSA8PCAoMzIgLSB0c2ZfYml0cykpIC0gMSkgPDwgdHNmX2JpdHM7Cit9CisKKy8qKgorICogc3RydWN0IGlsX3JiX3N0YXR1cyAtIHJlc2V2ZSBidWZmZXIgc3RhdHVzIGhvc3QgbWVtb3J5IG1hcHBlZCBGSCByZWdpc3RlcnMKKyAqCisgKiBAY2xvc2VkX3JiX251bSBbMDoxMV0gLSBJbmRpY2F0ZXMgdGhlIGlkeCBvZiB0aGUgUkIgd2hpY2ggd2FzIGNsb3NlZAorICogQGNsb3NlZF9mcl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpZHggb2YgdGhlIFJYIEZyYW1lIHdoaWNoIHdhcyBjbG9zZWQKKyAqIEBmaW5pc2hlZF9yYl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpZHggb2YgdGhlIGN1cnJlbnQgUkIKKyAqCQkJICAgICBpbiB3aGljaCB0aGUgbGFzdCBmcmFtZSB3YXMgd3JpdHRlbiB0bworICogQGZpbmlzaGVkX2ZyX251bSBbMDoxMV0gLSBJbmRpY2F0ZXMgdGhlIGlkeCBvZiB0aGUgUlggRnJhbWUKKyAqCQkJICAgICB3aGljaCB3YXMgdHJhbnNmZXJyZWQKKyAqLworc3RydWN0IGlsX3JiX3N0YXR1cyB7CisJX19sZTE2IGNsb3NlZF9yYl9udW07CisJX19sZTE2IGNsb3NlZF9mcl9udW07CisJX19sZTE2IGZpbmlzaGVkX3JiX251bTsKKwlfX2xlMTYgZmluaXNoZWRfZnJfbmFtOworCV9fbGUzMiBfX3VudXNlZDsJLyogMzk0NSBvbmx5ICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIFRGRF9RVUVVRV9TSVpFX01BWCAgICAgICgyNTYpCisjZGVmaW5lIFRGRF9RVUVVRV9TSVpFX0JDX0RVUAkoNjQpCisjZGVmaW5lIFRGRF9RVUVVRV9CQ19TSVpFCShURkRfUVVFVUVfU0laRV9NQVggKyBURkRfUVVFVUVfU0laRV9CQ19EVVApCisjZGVmaW5lIElMX1RYX0RNQV9NQVNLICAgICAgICBETUFfQklUX01BU0soMzYpCisjZGVmaW5lIElMX05VTV9PRl9UQlMJCTIwCisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsX2dldF9kbWFfaGlfYWRkcihkbWFfYWRkcl90IGFkZHIpCit7CisJcmV0dXJuIChzaXplb2YoYWRkcikgPiBzaXplb2YodTMyKSA/IChhZGRyID4+IDE2KSA+PiAxNiA6IDApICYgMHhGOworfQorCisvKioKKyAqIHN0cnVjdCBpbF90ZmRfdGIgdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3Igd2l0aGluIHRyYW5zbWl0IGZyYW1lIGRlc2NyaXB0b3IKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBkbWEgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRyYW5zbWlzc2lvbiBhZGRyZXNzCisgKgorICogQGxvOiBsb3cgWzMxOjBdIHBvcnRpb24gb2YgdGhlIGRtYSBhZGRyZXNzIG9mIFRYIGJ1ZmZlciBldmVyeSBldmVuIGlzCisgKgl1bmFsaWduZWQgb24gMTYgYml0IGJvdW5kYXJ5CisgKiBAaGlfbl9sZW46IDAtMyBbMzU6MzJdIHBvcnRpb24gb2YgZG1hCisgKgkgICAgICA0LTE1IGxlbmd0aCBvZiB0aGUgdHggYnVmZmVyCisgKi8KK3N0cnVjdCBpbF90ZmRfdGIgeworCV9fbGUzMiBsbzsKKwlfX2xlMTYgaGlfbl9sZW47Cit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCBpbF90ZmQKKyAqCisgKiBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9yIChURkQpCisgKgorICogQCBfX3Jlc2VydmVkMVszXSByZXNlcnZlZAorICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicworICoJICAgICA1ICAgcmVzZXJ2ZWQKKyAqIAkgICAgIDYtNyBwYWRkaW5nIChub3QgdXNlZCkKKyAqIEAgdGJzWzIwXQl0cmFuc21pdCBmcmFtZSBidWZmZXIgZGVzY3JpcHRvcnMKKyAqIEAgX19wYWQJcGFkZGluZworICoKKyAqIEVhY2ggVHggcXVldWUgdXNlcyBhIGNpcmN1bGFyIGJ1ZmZlciBvZiAyNTYgVEZEcyBzdG9yZWQgaW4gaG9zdCBEUkFNLgorICogQm90aCBkcml2ZXIgYW5kIGRldmljZSBzaGFyZSB0aGVzZSBjaXJjdWxhciBidWZmZXJzLCBlYWNoIG9mIHdoaWNoIG11c3QgYmUKKyAqIGNvbnRpZ3VvdXMgMjU2IFRGRHMgeCAxMjggYnl0ZXMtcGVyLVRGRCA9IDMyIEtCeXRlcworICoKKyAqIERyaXZlciBtdXN0IGluZGljYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBiYXNlIG9mIGVhY2gKKyAqIGNpcmN1bGFyIGJ1ZmZlciB2aWEgdGhlIEZINDlfTUVNX0NCQkNfUVVFVUUgcmVnaXN0ZXJzLgorICoKKyAqIEVhY2ggVEZEIGNvbnRhaW5zIHBvaW50ZXIvc2l6ZSBpbmZvcm1hdGlvbiBmb3IgdXAgdG8gMjAgZGF0YSBidWZmZXJzCisgKiBpbiBob3N0IERSQU0uICBUaGVzZSBidWZmZXJzIGNvbGxlY3RpdmVseSBjb250YWluIHRoZSAob25lKSBmcmFtZSBkZXNjcmliZWQKKyAqIGJ5IHRoZSBURkQuICBFYWNoIGJ1ZmZlciBtdXN0IGJlIGEgc2luZ2xlIGNvbnRpZ3VvdXMgYmxvY2sgb2YgbWVtb3J5IHdpdGhpbgorICogaXRzZWxmLCBidXQgYnVmZmVycyBtYXkgYmUgc2NhdHRlcmVkIGluIGhvc3QgRFJBTS4gIEVhY2ggYnVmZmVyIGhhcyBtYXggc2l6ZQorICogb2YgKDRLIC0gNCkuICBUaGUgY29uY2F0ZW5hdGVzIGFsbCBvZiBhIFRGRCdzIGJ1ZmZlcnMgaW50byBhIHNpbmdsZQorICogVHggZnJhbWUsIHVwIHRvIDggS0J5dGVzIGluIHNpemUuCisgKgorICogQSBtYXhpbXVtIG9mIDI1NSAobm90IDI1NiEpIFRGRHMgbWF5IGJlIG9uIGEgcXVldWUgd2FpdGluZyBmb3IgVHguCisgKi8KK3N0cnVjdCBpbF90ZmQgeworCXU4IF9fcmVzZXJ2ZWQxWzNdOworCXU4IG51bV90YnM7CisJc3RydWN0IGlsX3RmZF90YiB0YnNbSUxfTlVNX09GX1RCU107CisJX19sZTMyIF9fcGFkOworfSBfX3BhY2tlZDsKKy8qIFBDSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJX0NGR19SRVRSWV9USU1FT1VUCTB4MDQxCisKKy8qIFBDSSByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wwU19FTgkweDAxCisjZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTgkweDAyCisKK3N0cnVjdCBpbF9yYXRlX2luZm8geworCXU4IHBsY3A7CQkvKiB1Q29kZSBBUEk6ICBSQVRFXzZNX1BMQ1AsIGV0Yy4gKi8KKwl1OCBwbGNwX3Npc287CQkvKiB1Q29kZSBBUEk6ICBSQVRFX1NJU09fNk1fUExDUCwgZXRjLiAqLworCXU4IHBsY3BfbWltbzI7CQkvKiB1Q29kZSBBUEk6ICBSQVRFX01JTU8yXzZNX1BMQ1AsIGV0Yy4gKi8KKwl1OCBpZWVlOwkJLyogTUFDIGhlYWRlcjogIFJBVEVfNk1fSUVFRSwgZXRjLiAqLworCXU4IHByZXZfaWVlZTsJCS8qIHByZXZpb3VzIHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KKwl1OCBuZXh0X2llZWU7CQkvKiBuZXh0IHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KKwl1OCBwcmV2X3JzOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KKwl1OCBuZXh0X3JzOwkJLyogbmV4dCByYXRlIHVzZWQgaW4gcnMgYWxnbyAqLworCXU4IHByZXZfcnNfdGdnOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIFRHRyBycyBhbGdvICovCisJdTggbmV4dF9yc190Z2c7CQkvKiBuZXh0IHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLworfTsKKworc3RydWN0IGlsMzk0NV9yYXRlX2luZm8geworCXU4IHBsY3A7CQkvKiB1Q29kZSBBUEk6ICBSQVRFXzZNX1BMQ1AsIGV0Yy4gKi8KKwl1OCBpZWVlOwkJLyogTUFDIGhlYWRlcjogIFJBVEVfNk1fSUVFRSwgZXRjLiAqLworCXU4IHByZXZfaWVlZTsJCS8qIHByZXZpb3VzIHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KKwl1OCBuZXh0X2llZWU7CQkvKiBuZXh0IHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KKwl1OCBwcmV2X3JzOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KKwl1OCBuZXh0X3JzOwkJLyogbmV4dCByYXRlIHVzZWQgaW4gcnMgYWxnbyAqLworCXU4IHByZXZfcnNfdGdnOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIFRHRyBycyBhbGdvICovCisJdTggbmV4dF9yc190Z2c7CQkvKiBuZXh0IHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLworCXU4IHRhYmxlX3JzX2lkeDsJLyogaWR4IGluIHJhdGUgc2NhbGUgdGFibGUgY21kICovCisJdTggcHJldl90YWJsZV9yczsJLyogcHJldiBpbiByYXRlIHRhYmxlIGNtZCAqLworfTsKKworLyoKKyAqIFRoZXNlIHNlcnZlIGFzIGlkeGVzIGludG8KKyAqIHN0cnVjdCBpbF9yYXRlX2luZm8gaWxfcmF0ZXNbUkFURV9DT1VOVF07CisgKi8KK2VudW0geworCVJBVEVfMU1fSURYID0gMCwKKwlSQVRFXzJNX0lEWCwKKwlSQVRFXzVNX0lEWCwKKwlSQVRFXzExTV9JRFgsCisJUkFURV82TV9JRFgsCisJUkFURV85TV9JRFgsCisJUkFURV8xMk1fSURYLAorCVJBVEVfMThNX0lEWCwKKwlSQVRFXzI0TV9JRFgsCisJUkFURV8zNk1fSURYLAorCVJBVEVfNDhNX0lEWCwKKwlSQVRFXzU0TV9JRFgsCisJUkFURV82ME1fSURYLAorCVJBVEVfQ09VTlQsCisJUkFURV9DT1VOVF9MRUdBQ1kgPSBSQVRFX0NPVU5UIC0gMSwJLyogRXhjbHVkaW5nIDYwTSAqLworCVJBVEVfQ09VTlRfMzk0NSA9IFJBVEVfQ09VTlQgLSAxLAorCVJBVEVfSU5WTV9JRFggPSBSQVRFX0NPVU5ULAorCVJBVEVfSU5WQUxJRCA9IFJBVEVfQ09VTlQsCit9OworCitlbnVtIHsKKwlSQVRFXzZNX0lEWF9UQkwgPSAwLAorCVJBVEVfOU1fSURYX1RCTCwKKwlSQVRFXzEyTV9JRFhfVEJMLAorCVJBVEVfMThNX0lEWF9UQkwsCisJUkFURV8yNE1fSURYX1RCTCwKKwlSQVRFXzM2TV9JRFhfVEJMLAorCVJBVEVfNDhNX0lEWF9UQkwsCisJUkFURV81NE1fSURYX1RCTCwKKwlSQVRFXzFNX0lEWF9UQkwsCisJUkFURV8yTV9JRFhfVEJMLAorCVJBVEVfNU1fSURYX1RCTCwKKwlSQVRFXzExTV9JRFhfVEJMLAorCVJBVEVfSU5WTV9JRFhfVEJMID0gUkFURV9JTlZNX0lEWCAtIDEsCit9OworCitlbnVtIHsKKwlJTF9GSVJTVF9PRkRNX1JBVEUgPSBSQVRFXzZNX0lEWCwKKwlJTDM5X0xBU1RfT0ZETV9SQVRFID0gUkFURV81NE1fSURYLAorCUlMX0xBU1RfT0ZETV9SQVRFID0gUkFURV82ME1fSURYLAorCUlMX0ZJUlNUX0NDS19SQVRFID0gUkFURV8xTV9JRFgsCisJSUxfTEFTVF9DQ0tfUkFURSA9IFJBVEVfMTFNX0lEWCwKK307CisKKy8qICNkZWZpbmUgdnMuIGVudW0gdG8ga2VlcCBmcm9tIGRlZmF1bHRpbmcgdG8gJ2xhcmdlIGludGVnZXInICovCisjZGVmaW5lCVJBVEVfNk1fTUFTSyAgICgxIDw8IFJBVEVfNk1fSURYKQorI2RlZmluZQlSQVRFXzlNX01BU0sgICAoMSA8PCBSQVRFXzlNX0lEWCkKKyNkZWZpbmUJUkFURV8xMk1fTUFTSyAgKDEgPDwgUkFURV8xMk1fSURYKQorI2RlZmluZQlSQVRFXzE4TV9NQVNLICAoMSA8PCBSQVRFXzE4TV9JRFgpCisjZGVmaW5lCVJBVEVfMjRNX01BU0sgICgxIDw8IFJBVEVfMjRNX0lEWCkKKyNkZWZpbmUJUkFURV8zNk1fTUFTSyAgKDEgPDwgUkFURV8zNk1fSURYKQorI2RlZmluZQlSQVRFXzQ4TV9NQVNLICAoMSA8PCBSQVRFXzQ4TV9JRFgpCisjZGVmaW5lCVJBVEVfNTRNX01BU0sgICgxIDw8IFJBVEVfNTRNX0lEWCkKKyNkZWZpbmUgUkFURV82ME1fTUFTSyAgKDEgPDwgUkFURV82ME1fSURYKQorI2RlZmluZQlSQVRFXzFNX01BU0sgICAoMSA8PCBSQVRFXzFNX0lEWCkKKyNkZWZpbmUJUkFURV8yTV9NQVNLICAgKDEgPDwgUkFURV8yTV9JRFgpCisjZGVmaW5lCVJBVEVfNU1fTUFTSyAgICgxIDw8IFJBVEVfNU1fSURYKQorI2RlZmluZQlSQVRFXzExTV9NQVNLICAoMSA8PCBSQVRFXzExTV9JRFgpCisKKy8qIHVDb2RlIEFQSSB2YWx1ZXMgZm9yIGxlZ2FjeSBiaXQgcmF0ZXMsIGJvdGggT0ZETSBhbmQgQ0NLICovCitlbnVtIHsKKwlSQVRFXzZNX1BMQ1AgPSAxMywKKwlSQVRFXzlNX1BMQ1AgPSAxNSwKKwlSQVRFXzEyTV9QTENQID0gNSwKKwlSQVRFXzE4TV9QTENQID0gNywKKwlSQVRFXzI0TV9QTENQID0gOSwKKwlSQVRFXzM2TV9QTENQID0gMTEsCisJUkFURV80OE1fUExDUCA9IDEsCisJUkFURV81NE1fUExDUCA9IDMsCisJUkFURV82ME1fUExDUCA9IDMsCS8qRklYTUU6UlM6c2hvdWxkIGJlIHJlbW92ZWQgKi8KKwlSQVRFXzFNX1BMQ1AgPSAxMCwKKwlSQVRFXzJNX1BMQ1AgPSAyMCwKKwlSQVRFXzVNX1BMQ1AgPSA1NSwKKwlSQVRFXzExTV9QTENQID0gMTEwLAorCS8qRklYTUU6UlM6YWRkIFJBVEVfTEVHQUNZX0lOVk1fUExDUCA9IDAsICovCit9OworCisvKiB1Q29kZSBBUEkgdmFsdWVzIGZvciBPRkRNIGhpZ2gtdGhyb3VnaHB1dCAoSFQpIGJpdCByYXRlcyAqLworZW51bSB7CisJUkFURV9TSVNPXzZNX1BMQ1AgPSAwLAorCVJBVEVfU0lTT18xMk1fUExDUCA9IDEsCisJUkFURV9TSVNPXzE4TV9QTENQID0gMiwKKwlSQVRFX1NJU09fMjRNX1BMQ1AgPSAzLAorCVJBVEVfU0lTT18zNk1fUExDUCA9IDQsCisJUkFURV9TSVNPXzQ4TV9QTENQID0gNSwKKwlSQVRFX1NJU09fNTRNX1BMQ1AgPSA2LAorCVJBVEVfU0lTT182ME1fUExDUCA9IDcsCisJUkFURV9NSU1PMl82TV9QTENQID0gMHg4LAorCVJBVEVfTUlNTzJfMTJNX1BMQ1AgPSAweDksCisJUkFURV9NSU1PMl8xOE1fUExDUCA9IDB4YSwKKwlSQVRFX01JTU8yXzI0TV9QTENQID0gMHhiLAorCVJBVEVfTUlNTzJfMzZNX1BMQ1AgPSAweGMsCisJUkFURV9NSU1PMl80OE1fUExDUCA9IDB4ZCwKKwlSQVRFX01JTU8yXzU0TV9QTENQID0gMHhlLAorCVJBVEVfTUlNTzJfNjBNX1BMQ1AgPSAweGYsCisJUkFURV9TSVNPX0lOVk1fUExDUCwKKwlSQVRFX01JTU8yX0lOVk1fUExDUCA9IFJBVEVfU0lTT19JTlZNX1BMQ1AsCit9OworCisvKiBNQUMgaGVhZGVyIHZhbHVlcyBmb3IgYml0IHJhdGVzICovCitlbnVtIHsKKwlSQVRFXzZNX0lFRUUgPSAxMiwKKwlSQVRFXzlNX0lFRUUgPSAxOCwKKwlSQVRFXzEyTV9JRUVFID0gMjQsCisJUkFURV8xOE1fSUVFRSA9IDM2LAorCVJBVEVfMjRNX0lFRUUgPSA0OCwKKwlSQVRFXzM2TV9JRUVFID0gNzIsCisJUkFURV80OE1fSUVFRSA9IDk2LAorCVJBVEVfNTRNX0lFRUUgPSAxMDgsCisJUkFURV82ME1fSUVFRSA9IDEyMCwKKwlSQVRFXzFNX0lFRUUgPSAyLAorCVJBVEVfMk1fSUVFRSA9IDQsCisJUkFURV81TV9JRUVFID0gMTEsCisJUkFURV8xMU1fSUVFRSA9IDIyLAorfTsKKworI2RlZmluZSBJTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyAgICBcCisJKFJBVEVfMU1fTUFTSyAgICAgICAgICB8IFwKKwlSQVRFXzJNX01BU0spCisKKyNkZWZpbmUgSUxfQ0NLX1JBVEVTX01BU0sgICAgICAgICAgXAorCShJTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyAgfCBcCisJUkFURV81TV9NQVNLICAgICAgICAgIHwgXAorCVJBVEVfMTFNX01BU0spCisKKyNkZWZpbmUgSUxfT0ZETV9CQVNJQ19SQVRFU19NQVNLICAgXAorCShSQVRFXzZNX01BU0sgICAgICAgICB8IFwKKwlSQVRFXzEyTV9NQVNLICAgICAgICAgfCBcCisJUkFURV8yNE1fTUFTSykKKworI2RlZmluZSBJTF9PRkRNX1JBVEVTX01BU0sgICAgICAgICBcCisJKElMX09GRE1fQkFTSUNfUkFURVNfTUFTSyB8IFwKKwlSQVRFXzlNX01BU0sgICAgICAgICAgfCBcCisJUkFURV8xOE1fTUFTSyAgICAgICAgIHwgXAorCVJBVEVfMzZNX01BU0sgICAgICAgICB8IFwKKwlSQVRFXzQ4TV9NQVNLICAgICAgICAgfCBcCisJUkFURV81NE1fTUFTSykKKworI2RlZmluZSBJTF9CQVNJQ19SQVRFU19NQVNLICAgICAgICAgXAorCShJTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJIElMX0NDS19CQVNJQ19SQVRFU19NQVNLKQorCisjZGVmaW5lIFJBVEVTX01BU0sgKCgxIDw8IFJBVEVfQ09VTlQpIC0gMSkKKyNkZWZpbmUgUkFURVNfTUFTS18zOTQ1ICgoMSA8PCBSQVRFX0NPVU5UXzM5NDUpIC0gMSkKKworI2RlZmluZSBJTF9JTlZBTElEX1ZBTFVFICAgIC0xCisKKyNkZWZpbmUgSUxfTUlOX1JTU0lfVkFMICAgICAgICAgICAgICAgICAtMTAwCisjZGVmaW5lIElMX01BWF9SU1NJX1ZBTCAgICAgICAgICAgICAgICAgICAgMAorCisvKiBUaGVzZSB2YWx1ZXMgc3BlY2lmeSBob3cgbWFueSBUeCBmcmFtZSBhdHRlbXB0cyBiZWZvcmUKKyAqIHNlYXJjaGluZyBmb3IgYSBuZXcgbW9kdWxhdGlvbiBtb2RlICovCisjZGVmaW5lIElMX0xFR0FDWV9GQUlMVVJFX0xJTUlUCTE2MAorI2RlZmluZSBJTF9MRUdBQ1lfU1VDQ0VTU19MSU1JVAk0ODAKKyNkZWZpbmUgSUxfTEVHQUNZX1RCTF9DT1VOVAkJMTYwCisKKyNkZWZpbmUgSUxfTk9ORV9MRUdBQ1lfRkFJTFVSRV9MSU1JVAk0MDAKKyNkZWZpbmUgSUxfTk9ORV9MRUdBQ1lfU1VDQ0VTU19MSU1JVAk0NTAwCisjZGVmaW5lIElMX05PTkVfTEVHQUNZX1RCTF9DT1VOVAkxNTAwCisKKy8qIFN1Y2Nlc3MgcmF0aW8gKEFDS2VkIC8gYXR0ZW1wdGVkIHR4IGZyYW1lcykgdmFsdWVzIChwZXJmZWN0IGlzIDEyOCAqIDEwMCkgKi8KKyNkZWZpbmUgSUxfUlNfR09PRF9SQVRJTwkJMTI4MDAJLyogMTAwJSAqLworI2RlZmluZSBSQVRFX1NDQUxFX1NXSVRDSAkJMTA4ODAJLyogIDg1JSAqLworI2RlZmluZSBSQVRFX0hJR0hfVEgJCTEwODgwCS8qICA4NSUgKi8KKyNkZWZpbmUgUkFURV9JTkNSRUFTRV9USAkJNjQwMAkvKiAgNTAlICovCisjZGVmaW5lIFJBVEVfREVDUkVBU0VfVEgJCTE5MjAJLyogIDE1JSAqLworCisvKiBwb3NzaWJsZSBhY3Rpb25zIHdoZW4gaW4gbGVnYWN5IG1vZGUgKi8KKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMSAgICAgIDAKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMiAgICAgIDEKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9TSVNPICAgICAgICAgIDIKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQiAgICAgIDMKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQyAgICAgIDQKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQyAgICAgIDUKKworLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIHNpc28gbW9kZSAqLworI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9BTlRFTk5BMSAgICAgICAgMAorI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9BTlRFTk5BMiAgICAgICAgMQorI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9BQiAgICAgICAgMgorI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9BQyAgICAgICAgMworI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9CQyAgICAgICAgNAorI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9HSSAgICAgICAgICAgICAgNQorCisvKiBwb3NzaWJsZSBhY3Rpb25zIHdoZW4gaW4gbWltbyBtb2RlICovCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9BTlRFTk5BMSAgICAgICAwCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9BTlRFTk5BMiAgICAgICAxCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9TSVNPX0EgICAgICAgICAyCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9TSVNPX0IgICAgICAgICAzCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9TSVNPX0MgICAgICAgICA0CisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9HSSAgICAgICAgICAgICA1CisKKyNkZWZpbmUgSUxfTUFYX1NFQVJDSCBJTF9NSU1PMl9TV0lUQ0hfR0kKKworI2RlZmluZSBJTF9BQ1RJT05fTElNSVQJCTMJLyogIyBwb3NzaWJsZSBhY3Rpb25zICovCisKKyNkZWZpbmUgTFFfU0laRQkJMgkvKiAyIG1vZGUgdGFibGVzOiAgIkFjdGl2ZSIgYW5kICJTZWFyY2giICovCisKKy8qIGxvYWQgcGVyIHRpZCBkZWZpbmVzIGZvciBBLU1QRFUgYWN0aXZhdGlvbiAqLworI2RlZmluZSBJTF9BR0dfVFBUX1RIUkVIT0xECTAKKyNkZWZpbmUgSUxfQUdHX0xPQURfVEhSRVNIT0xECTEwCisjZGVmaW5lIElMX0FHR19BTExfVElECQkweGZmCisjZGVmaW5lIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkcJNTAJLyptUyAqLworI2RlZmluZSBUSURfUVVFVUVfTUFYX1NJWkUJMjAKKyNkZWZpbmUgVElEX1JPVU5EX1ZBTFVFCQk1CS8qIG1TICovCisjZGVmaW5lIFRJRF9NQVhfTE9BRF9DT1VOVAk4CisKKyNkZWZpbmUgVElEX01BWF9USU1FX0RJRkYgKChUSURfUVVFVUVfTUFYX1NJWkUgLSAxKSAqIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkcpCisjZGVmaW5lIFRJTUVfV1JBUF9BUk9VTkQoeCwgeSkgKCgoeSkgPiAoeCkpID8gKHkpIC0gKHgpIDogKDAtKHgpKSArICh5KSkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbF9yYXRlX2luZm8gaWxfcmF0ZXNbUkFURV9DT1VOVF07CisKK2VudW0gaWxfdGFibGVfdHlwZSB7CisJTFFfTk9ORSwKKwlMUV9HLAkJCS8qIGxlZ2FjeSB0eXBlcyAqLworCUxRX0EsCisJTFFfU0lTTywJCS8qIGhpZ2gtdGhyb3VnaHB1dCB0eXBlcyAqLworCUxRX01JTU8yLAorCUxRX01BWCwKK307CisKKyNkZWZpbmUgaXNfbGVnYWN5KHRibCkgKCh0YmwpID09IExRX0cgfHwgKHRibCkgPT0gTFFfQSkKKyNkZWZpbmUgaXNfc2lzbyh0YmwpICgodGJsKSA9PSBMUV9TSVNPKQorI2RlZmluZSBpc19taW1vMih0YmwpICgodGJsKSA9PSBMUV9NSU1PMikKKyNkZWZpbmUgaXNfbWltbyh0YmwpIChpc19taW1vMih0YmwpKQorI2RlZmluZSBpc19IdCh0YmwpIChpc19zaXNvKHRibCkgfHwgaXNfbWltbyh0YmwpKQorI2RlZmluZSBpc19hX2JhbmQodGJsKSAoKHRibCkgPT0gTFFfQSkKKyNkZWZpbmUgaXNfZ19hbmQodGJsKSAoKHRibCkgPT0gTFFfRykKKworI2RlZmluZQlBTlRfTk9ORQkweDAKKyNkZWZpbmUJQU5UX0EJCUJJVCgwKQorI2RlZmluZQlBTlRfQgkJQklUKDEpCisjZGVmaW5lCUFOVF9BQgkJKEFOVF9BIHwgQU5UX0IpCisjZGVmaW5lIEFOVF9DCQlCSVQoMikKKyNkZWZpbmUJQU5UX0FDCQkoQU5UX0EgfCBBTlRfQykKKyNkZWZpbmUgQU5UX0JDCQkoQU5UX0IgfCBBTlRfQykKKyNkZWZpbmUgQU5UX0FCQwkJKEFOVF9BQiB8IEFOVF9DKQorCisjZGVmaW5lIElMX01BWF9NQ1NfRElTUExBWV9TSVpFCTEyCisKK3N0cnVjdCBpbF9yYXRlX21jc19pbmZvIHsKKwljaGFyIG1icHNbSUxfTUFYX01DU19ESVNQTEFZX1NJWkVdOworCWNoYXIgbWNzW0lMX01BWF9NQ1NfRElTUExBWV9TSVpFXTsKK307CisKKy8qKgorICogc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAtLSB0eCBzdWNjZXNzIGhpc3RvcnkgZm9yIG9uZSByYXRlCisgKi8KK3N0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEgeworCXU2NCBkYXRhOwkJLyogYml0bWFwIG9mIHN1Y2Nlc3NmdWwgZnJhbWVzICovCisJczMyIHN1Y2Nlc3NfY291bnRlcjsJLyogbnVtYmVyIG9mIGZyYW1lcyBzdWNjZXNzZnVsICovCisJczMyIHN1Y2Nlc3NfcmF0aW87CS8qIHBlci1jZW50ICogMTI4ICAqLworCXMzMiBjb3VudGVyOwkJLyogbnVtYmVyIG9mIGZyYW1lcyBhdHRlbXB0ZWQgKi8KKwlzMzIgYXZlcmFnZV90cHQ7CS8qIHN1Y2Nlc3MgcmF0aW8gKiBleHBlY3RlZCB0aHJvdWdocHV0ICovCisJdW5zaWduZWQgbG9uZyBzdGFtcDsKK307CisKKy8qKgorICogc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvIC0tIHR4IHBhcmFtcyBhbmQgc3VjY2VzcyBoaXN0b3J5IGZvciBhbGwgcmF0ZXMKKyAqCisgKiBUaGVyZSBhcmUgdHdvIG9mIHRoZXNlIGluIHN0cnVjdCBpbF9scV9zdGEsCisgKiBvbmUgZm9yICJhY3RpdmUiLCBhbmQgb25lIGZvciAic2VhcmNoIi4KKyAqLworc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvIHsKKwllbnVtIGlsX3RhYmxlX3R5cGUgbHFfdHlwZTsKKwl1OCBhbnRfdHlwZTsKKwl1OCBpc19TR0k7CQkvKiAxID0gc2hvcnQgZ3VhcmQgaW50ZXJ2YWwgKi8KKwl1OCBpc19odDQwOwkJLyogMSA9IDQwIE1IeiBjaGFubmVsIHdpZHRoICovCisJdTggaXNfZHVwOwkJLyogMSA9IGR1cGxpY2F0ZWQgZGF0YSBzdHJlYW1zICovCisJdTggYWN0aW9uOwkJLyogY2hhbmdlIG1vZHVsYXRpb247IElMX1tMRUdBQ1kvU0lTTy9NSU1PXV9TV0lUQ0hfKiAqLworCXU4IG1heF9zZWFyY2g7CQkvKiBtYXhpbXVuIG51bWJlciBvZiB0YWJsZXMgd2UgY2FuIHNlYXJjaCAqLworCXMzMiAqZXhwZWN0ZWRfdHB0OwkvKiB0aHJvdWdocHV0IG1ldHJpY3M7IGV4cGVjdGVkX3RwdF9HLCBldGMuICovCisJdTMyIGN1cnJlbnRfcmF0ZTsJLyogcmF0ZV9uX2ZsYWdzLCB1Q29kZSBBUEkgZm9ybWF0ICovCisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSB3aW5bUkFURV9DT1VOVF07CS8qIHJhdGUgaGlzdG9yaWVzICovCit9OworCitzdHJ1Y3QgaWxfdHJhZmZpY19sb2FkIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVfc3RhbXA7CS8qIGFnZSBvZiB0aGUgb2xkZXN0IHN0YXRzICovCisJdTMyIHBhY2tldF9jb3VudFtUSURfUVVFVUVfTUFYX1NJWkVdOwkvKiBwYWNrZXQgY291bnQgaW4gdGhpcyB0aW1lCisJCQkJCQkgKiBzbGljZSAqLworCXUzMiB0b3RhbDsJCS8qIHRvdGFsIG51bSBvZiBwYWNrZXRzIGR1cmluZyB0aGUKKwkJCQkgKiBsYXN0IFRJRF9NQVhfVElNRV9ESUZGICovCisJdTggcXVldWVfY291bnQ7CQkvKiBudW1iZXIgb2YgcXVldWVzIHRoYXQgaGFzCisJCQkJICogYmVlbiB1c2VkIHNpbmNlIHRoZSBsYXN0IGNsZWFudXAgKi8KKwl1OCBoZWFkOwkJLyogc3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciAqLworfTsKKworLyoqCisgKiBzdHJ1Y3QgaWxfbHFfc3RhIC0tIGRyaXZlcidzIHJhdGUgc2NhbGluZyBpbGF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBQb2ludGVyIHRvIHRoaXMgZ2V0cyBwYXNzZWQgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBkcml2ZXIgYW5kIG1hYzgwMjExLgorICovCitzdHJ1Y3QgaWxfbHFfc3RhIHsKKwl1OCBhY3RpdmVfdGJsOwkJLyogaWR4IG9mIGFjdGl2ZSB0YWJsZSwgcmFuZ2UgMC0xICovCisJdTggZW5hYmxlX2NvdW50ZXI7CS8qIGluZGljYXRlcyBIVCBtb2RlICovCisJdTggc3RheV9pbl90Ymw7CQkvKiAxOiBkaXNhbGxvdywgMDogYWxsb3cgc2VhcmNoIGZvciBuZXcgbW9kZSAqLworCXU4IHNlYXJjaF9iZXR0ZXJfdGJsOwkvKiAxOiBjdXJyZW50bHkgdHJ5aW5nIGFsdGVybmF0ZSBtb2RlICovCisJczMyIGxhc3RfdHB0OworCisJLyogVGhlIGZvbGxvd2luZyBkZXRlcm1pbmUgd2hlbiB0byBzZWFyY2ggZm9yIGEgbmV3IG1vZGUgKi8KKwl1MzIgdGFibGVfY291bnRfbGltaXQ7CisJdTMyIG1heF9mYWlsdXJlX2xpbWl0OwkvKiAjIGZhaWxlZCBmcmFtZXMgYmVmb3JlIG5ldyBzZWFyY2ggKi8KKwl1MzIgbWF4X3N1Y2Nlc3NfbGltaXQ7CS8qICMgc3VjY2Vzc2Z1bCBmcmFtZXMgYmVmb3JlIG5ldyBzZWFyY2ggKi8KKwl1MzIgdGFibGVfY291bnQ7CisJdTMyIHRvdGFsX2ZhaWxlZDsJLyogdG90YWwgZmFpbGVkIGZyYW1lcywgYW55L2FsbCByYXRlcyAqLworCXUzMiB0b3RhbF9zdWNjZXNzOwkvKiB0b3RhbCBzdWNjZXNzZnVsIGZyYW1lcywgYW55L2FsbCByYXRlcyAqLworCXU2NCBmbHVzaF90aW1lcjsJLyogdGltZSBzdGF5aW5nIGluIG1vZGUgYmVmb3JlIG5ldyBzZWFyY2ggKi8KKworCXU4IGFjdGlvbl9jb3VudGVyOwkvKiAjIG1vZGUtc3dpdGNoIGFjdGlvbnMgdHJpZWQgKi8KKwl1OCBpc19ncmVlbjsKKwl1OCBpc19kdXA7CisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCisJLyogVGhlIGZvbGxvd2luZyBhcmUgYml0bWFwcyBvZiByYXRlczsgUkFURV82TV9NQVNLLCBldGMuICovCisJdTMyIHN1cHBfcmF0ZXM7CisJdTE2IGFjdGl2ZV9sZWdhY3lfcmF0ZTsKKwl1MTYgYWN0aXZlX3Npc29fcmF0ZTsKKwl1MTYgYWN0aXZlX21pbW8yX3JhdGU7CisJczggbWF4X3JhdGVfaWR4OwkvKiBNYXggcmF0ZSBzZXQgYnkgdXNlciAqLworCXU4IG1pc3NlZF9yYXRlX2NvdW50ZXI7CisKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCBscTsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gbHFfaW5mb1tMUV9TSVpFXTsJLyogImFjdGl2ZSIsICJzZWFyY2giICovCisJc3RydWN0IGlsX3RyYWZmaWNfbG9hZCBsb2FkW1RJRF9NQVhfTE9BRF9DT1VOVF07CisJdTggdHhfYWdnX3RpZF9lbjsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9maWxlOworCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlOworCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19yYXRlX3NjYWxlX2RhdGFfZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfdHhfYWdnX3RpZF9lbl9maWxlOworCXUzMiBkYmdfZml4ZWRfcmF0ZTsKKyNlbmRpZgorCXN0cnVjdCBpbF9wcml2ICpkcnY7CisKKwkvKiB1c2VkIHRvIGJlIGluIHN0YV9pbmZvICovCisJaW50IGxhc3RfdHhyYXRlX2lkeDsKKwkvKiBsYXN0IHR4IHJhdGVfbl9mbGFncyAqLworCXUzMiBsYXN0X3JhdGVfbl9mbGFnczsKKwkvKiBwYWNrZXRzIGRlc3RpbmVkIGZvciB0aGlzIFNUQSBhcmUgYWdncmVnYXRlZCAqLworCXU4IGlzX2FnZzsKK307CisKKy8qCisgKiBpbF9zdGF0aW9uX3ByaXY6IERyaXZlcidzIGlsYXRlIHN0YXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBXaGVuIG1hYzgwMjExIGNyZWF0ZXMgYSBzdGF0aW9uIGl0IHJlc2VydmVzIHNvbWUgc3BhY2UgKGh3LT5zdGFfZGF0YV9zaXplKQorICogaW4gdGhlIHN0cnVjdHVyZSBmb3IgdXNlIGJ5IGRyaXZlci4gVGhpcyBzdHJ1Y3R1cmUgaXMgcGxhY2VzIGluIHRoYXQKKyAqIHNwYWNlLgorICoKKyAqIFRoZSBjb21tb24gc3RydWN0IE1VU1QgYmUgZmlyc3QgYmVjYXVzZSBpdCBpcyBzaGFyZWQgYmV0d2VlbgorICogMzk0NSBhbmQgNDk2NSEKKyAqLworc3RydWN0IGlsX3N0YXRpb25fcHJpdiB7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdl9jb21tb24gY29tbW9uOworCXN0cnVjdCBpbF9scV9zdGEgbHFfc3RhOworCWF0b21pY190IHBlbmRpbmdfZnJhbWVzOworCWJvb2wgY2xpZW50OworCWJvb2wgYXNsZWVwOworfTsKKworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X251bV9vZl9hbnQodTggbSkKK3sKKwlyZXR1cm4gISEobSAmIEFOVF9BKSArICEhKG0gJiBBTlRfQikgKyAhIShtICYgQU5UX0MpOworfQorCitzdGF0aWMgaW5saW5lIHU4CitpbDQ5NjVfZmlyc3RfYW50ZW5uYSh1OCBtYXNrKQoreworCWlmIChtYXNrICYgQU5UX0EpCisJCXJldHVybiBBTlRfQTsKKwlpZiAobWFzayAmIEFOVF9CKQorCQlyZXR1cm4gQU5UX0I7CisJcmV0dXJuIEFOVF9DOworfQorCisvKioKKyAqIGlsMzk0NV9yYXRlX3NjYWxlX2luaXQgLSBJbml0aWFsaXplIHRoZSByYXRlIHNjYWxlIHRhYmxlIGJhc2VkIG9uIGFzc29jIGluZm8KKyAqCisgKiBUaGUgc3BlY2lmaWMgdGhyb3VnaHB1dCB0YWJsZSB1c2VkIGlzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIG5ldHdvcmsKKyAqIHRoZSBhc3NvY2lhdGVkIHdpdGgsIGluY2x1ZGluZyBBLCBCLCBHLCBhbmQgRyB3LyBUR0cgcHJvdGVjdGlvbgorICovCitleHRlcm4gdm9pZCBpbDM5NDVfcmF0ZV9zY2FsZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzMzIgc3RhX2lkKTsKKworLyogSW5pdGlhbGl6ZSBzdGF0aW9uJ3MgcmF0ZSBzY2FsaW5nIGluZm9ybWF0aW9uIGFmdGVyIGFkZGluZyBzdGF0aW9uICovCitleHRlcm4gdm9pZCBpbDQ5NjVfcnNfcmF0ZV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCQl1OCBzdGFfaWQpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJdTggc3RhX2lkKTsKKworLyoqCisgKiBpbF9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIgLSBSZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBjYWxsYmFja3MKKyAqCisgKiBTaW5jZSB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBpcyBoYXJkd2FyZSBzcGVjaWZpYywgdGhlcmUgaXMgbm8gbmVlZAorICogb3IgcmVhc29uIHRvIHBsYWNlIGl0IGFzIGEgc3RhbmQgYWxvbmUgbW9kdWxlLiAgVGhlIGRyaXZlciBjYW4gY2FsbAorICogaWxfcmF0ZV9jb250cm9sX3JlZ2lzdGVyIGluIG9yZGVyIHRvIHJlZ2lzdGVyIHRoZSByYXRlIGNvbnRyb2wgY2FsbGJhY2tzCisgKiB3aXRoIHRoZSBtYWM4MDIxMSBzdWJzeXN0ZW0uICBUaGlzIHNob3VsZCBiZSBwZXJmb3JtZWQgcHJpb3IgdG8gY2FsbGluZworICogaWVlZTgwMjExX3JlZ2lzdGVyX2h3CisgKgorICovCitleHRlcm4gaW50IGlsNDk2NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCk7CitleHRlcm4gaW50IGlsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCk7CisKKy8qKgorICogaWxfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIgLSBVbnJlZ2lzdGVyIHRoZSByYXRlIGNvbnRyb2wgY2FsbGJhY2tzCisgKgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGNhbGxpbmcgaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcsIGJ1dCBiZWZvcmUKKyAqIHRoZSBkcml2ZXIgaXMgdW5sb2FkZWQuCisgKi8KK2V4dGVybiB2b2lkIGlsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKTsKKworZXh0ZXJuIGludCBpbF9wb3dlcl91cGRhdGVfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgZm9yY2UpOworZXh0ZXJuIHZvaWQgaWxfcG93ZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCitleHRlcm4gdTMyIGlsX2RlYnVnX2xldmVsOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisvKgorICogaWxfZ2V0X2RlYnVnX2xldmVsOiBSZXR1cm4gYWN0aXZlIGRlYnVnIGxldmVsIGZvciBkZXZpY2UKKyAqCisgKiBVc2luZyBzeXNmcyBpdCBpcyBwb3NzaWJsZSB0byBzZXQgcGVyIGRldmljZSBkZWJ1ZyBsZXZlbC4gVGhpcyBkZWJ1ZworICogbGV2ZWwgd2lsbCBiZSB1c2VkIGlmIHNldCwgb3RoZXJ3aXNlIHRoZSBnbG9iYWwgZGVidWcgbGV2ZWwgd2hpY2ggY2FuIGJlCisgKiBzZXQgdmlhIG1vZHVsZSBwYXJhbWV0ZXIgaXMgdXNlZC4KKyAqLworc3RhdGljIGlubGluZSB1MzIKK2lsX2dldF9kZWJ1Z19sZXZlbChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWYgKGlsLT5kZWJ1Z19sZXZlbCkKKwkJcmV0dXJuIGlsLT5kZWJ1Z19sZXZlbDsKKwllbHNlCisJCXJldHVybiBpbF9kZWJ1Z19sZXZlbDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHUzMgoraWxfZ2V0X2RlYnVnX2xldmVsKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gaWxfZGVidWdfbGV2ZWw7Cit9CisjZW5kaWYKKworI2RlZmluZSBpbF9wcmludF9oZXhfZXJyb3IoaWwsIHAsIGxlbikJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJpd2wgZGF0YTogIiwJCQkJXAorCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwgcCwgbGVuLCAxKTsJCVwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKyNkZWZpbmUgSUxfREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgbGV2ZWwpCQkJCVwKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmlsLT5ody0+d2lwaHktPmRldiwJCVwKKwkJCSAiJWMgJXMgIiBmbXQsIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLAlcCisJCQlfX2Z1bmNfXyAsICMjIGFyZ3MpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGlsX3ByaW50X2hleF9kdW1wKGlsLCBsZXZlbCwgcCwgbGVuKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgbGV2ZWwpCQkJCVwKKwkJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgIml3bCBkYXRhOiAiLAkJXAorCQkJICAgICAgIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsIHAsIGxlbiwgMSk7CVwKK30gd2hpbGUgKDApCisKKyNlbHNlCisjZGVmaW5lIElMX0RCRyhsZXZlbCwgZm10LCBhcmdzLi4uKQorc3RhdGljIGlubGluZSB2b2lkCitpbF9wcmludF9oZXhfZHVtcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBsZXZlbCwgY29uc3Qgdm9pZCAqcCwgdTMyIGxlbikKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfSVdMRUdBQ1lfREVCVUcgKi8KKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCitpbnQgaWxfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaWxfZGJnZnNfdW5yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZGJnZnNfdW5yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMgKi8KKworLyoKKyAqIFRvIHVzZSB0aGUgZGVidWcgc3lzdGVtOgorICoKKyAqIElmIHlvdSBhcmUgZGVmaW5pbmcgYSBuZXcgZGVidWcgY2xhc3NpZmljYXRpb24sIHNpbXBseSBhZGQgaXQgdG8gdGhlICNkZWZpbmUKKyAqIGxpc3QgaGVyZSBpbiB0aGUgZm9ybSBvZgorICoKKyAqICNkZWZpbmUgSUxfRExfeHh4eCBWQUxVRQorICoKKyAqIHdoZXJlIHh4eHggc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkuCisgKgorICogWW91IHRoZW4gbmVlZCB0byBlaXRoZXIgYWRkIGEgSUxfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUxfREJHKElMX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKKyAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCisgKgorICogVGhlIGFjdGl2ZSBkZWJ1ZyBsZXZlbHMgY2FuIGJlIGFjY2Vzc2VkIHZpYSBmaWxlcworICoKKyAqCS9zeXMvbW9kdWxlL2l3bDQ5NjUvcGFyYW1ldGVycy9kZWJ1ZworICoJL3N5cy9tb2R1bGUvaXdsMzk0NS9wYXJhbWV0ZXJzL2RlYnVnCisgKgkvc3lzL2NsYXNzL25ldC93bGFuMC9kZXZpY2UvZGVidWdfbGV2ZWwKKyAqCisgKiB3aGVuIENPTkZJR19JV0xFR0FDWV9ERUJVRz15LgorICovCisKKy8qIDB4MDAwMDAwMEYgLSAweDAwMDAwMDAxICovCisjZGVmaW5lIElMX0RMX0lORk8JCSgxIDw8IDApCisjZGVmaW5lIElMX0RMX01BQzgwMjExCQkoMSA8PCAxKQorI2RlZmluZSBJTF9ETF9IQ01ECQkoMSA8PCAyKQorI2RlZmluZSBJTF9ETF9TVEFURQkJKDEgPDwgMykKKy8qIDB4MDAwMDAwRjAgLSAweDAwMDAwMDEwICovCisjZGVmaW5lIElMX0RMX01BQ0RVTVAJCSgxIDw8IDQpCisjZGVmaW5lIElMX0RMX0hDTURfRFVNUAkJKDEgPDwgNSkKKyNkZWZpbmUgSUxfRExfRUVQUk9NCQkoMSA8PCA2KQorI2RlZmluZSBJTF9ETF9SQURJTwkJKDEgPDwgNykKKy8qIDB4MDAwMDBGMDAgLSAweDAwMDAwMTAwICovCisjZGVmaW5lIElMX0RMX1BPV0VSCQkoMSA8PCA4KQorI2RlZmluZSBJTF9ETF9URU1QCQkoMSA8PCA5KQorI2RlZmluZSBJTF9ETF9OT1RJRgkJKDEgPDwgMTApCisjZGVmaW5lIElMX0RMX1NDQU4JCSgxIDw8IDExKQorLyogMHgwMDAwRjAwMCAtIDB4MDAwMDEwMDAgKi8KKyNkZWZpbmUgSUxfRExfQVNTT0MJCSgxIDw8IDEyKQorI2RlZmluZSBJTF9ETF9EUk9QCQkoMSA8PCAxMykKKyNkZWZpbmUgSUxfRExfVFhQT1dFUgkJKDEgPDwgMTQpCisjZGVmaW5lIElMX0RMX0FQCQkoMSA8PCAxNSkKKy8qIDB4MDAwRjAwMDAgLSAweDAwMDEwMDAwICovCisjZGVmaW5lIElMX0RMX0ZXCQkoMSA8PCAxNikKKyNkZWZpbmUgSUxfRExfUkZfS0lMTAkJKDEgPDwgMTcpCisjZGVmaW5lIElMX0RMX0ZXX0VSUk9SUwkJKDEgPDwgMTgpCisjZGVmaW5lIElMX0RMX0xFRAkJKDEgPDwgMTkpCisvKiAweDAwRjAwMDAwIC0gMHgwMDEwMDAwMCAqLworI2RlZmluZSBJTF9ETF9SQVRFCQkoMSA8PCAyMCkKKyNkZWZpbmUgSUxfRExfQ0FMSUIJCSgxIDw8IDIxKQorI2RlZmluZSBJTF9ETF9XRVAJCSgxIDw8IDIyKQorI2RlZmluZSBJTF9ETF9UWAkJKDEgPDwgMjMpCisvKiAweDBGMDAwMDAwIC0gMHgwMTAwMDAwMCAqLworI2RlZmluZSBJTF9ETF9SWAkJKDEgPDwgMjQpCisjZGVmaW5lIElMX0RMX0lTUgkJKDEgPDwgMjUpCisjZGVmaW5lIElMX0RMX0hUCQkoMSA8PCAyNikKKy8qIDB4RjAwMDAwMDAgLSAweDEwMDAwMDAwICovCisjZGVmaW5lIElMX0RMXzExSAkJKDEgPDwgMjgpCisjZGVmaW5lIElMX0RMX1NUQVRTCQkoMSA8PCAyOSkKKyNkZWZpbmUgSUxfRExfVFhfUkVQTFkJCSgxIDw8IDMwKQorI2RlZmluZSBJTF9ETF9RT1MJCSgxIDw8IDMxKQorCisjZGVmaW5lIERfSU5GTyhmLCBhLi4uKQkJSUxfREJHKElMX0RMX0lORk8sIGYsICMjIGEpCisjZGVmaW5lIERfTUFDODAyMTEoZiwgYS4uLikJSUxfREJHKElMX0RMX01BQzgwMjExLCBmLCAjIyBhKQorI2RlZmluZSBEX01BQ0RVTVAoZiwgYS4uLikJSUxfREJHKElMX0RMX01BQ0RVTVAsIGYsICMjIGEpCisjZGVmaW5lIERfVEVNUChmLCBhLi4uKQkJSUxfREJHKElMX0RMX1RFTVAsIGYsICMjIGEpCisjZGVmaW5lIERfU0NBTihmLCBhLi4uKQkJSUxfREJHKElMX0RMX1NDQU4sIGYsICMjIGEpCisjZGVmaW5lIERfUlgoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9SWCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9UWChmLCBhLi4uKQkJSUxfREJHKElMX0RMX1RYLCBmLCAjIyBhKQorI2RlZmluZSBEX0lTUihmLCBhLi4uKQkJSUxfREJHKElMX0RMX0lTUiwgZiwgIyMgYSkKKyNkZWZpbmUgRF9MRUQoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9MRUQsIGYsICMjIGEpCisjZGVmaW5lIERfV0VQKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfV0VQLCBmLCAjIyBhKQorI2RlZmluZSBEX0hDKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfSENNRCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9IQ19EVU1QKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9IQ01EX0RVTVAsIGYsICMjIGEpCisjZGVmaW5lIERfRUVQUk9NKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9FRVBST00sIGYsICMjIGEpCisjZGVmaW5lIERfQ0FMSUIoZiwgYS4uLikJSUxfREJHKElMX0RMX0NBTElCLCBmLCAjIyBhKQorI2RlZmluZSBEX0ZXKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfRlcsIGYsICMjIGEpCisjZGVmaW5lIERfUkZfS0lMTChmLCBhLi4uKQlJTF9EQkcoSUxfRExfUkZfS0lMTCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9EUk9QKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfRFJPUCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9BUChmLCBhLi4uKQkJSUxfREJHKElMX0RMX0FQLCBmLCAjIyBhKQorI2RlZmluZSBEX1RYUE9XRVIoZiwgYS4uLikJSUxfREJHKElMX0RMX1RYUE9XRVIsIGYsICMjIGEpCisjZGVmaW5lIERfUkFURShmLCBhLi4uKQkJSUxfREJHKElMX0RMX1JBVEUsIGYsICMjIGEpCisjZGVmaW5lIERfTk9USUYoZiwgYS4uLikJSUxfREJHKElMX0RMX05PVElGLCBmLCAjIyBhKQorI2RlZmluZSBEX0FTU09DKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9BU1NPQywgZiwgIyMgYSkKKyNkZWZpbmUgRF9IVChmLCBhLi4uKQkJSUxfREJHKElMX0RMX0hULCBmLCAjIyBhKQorI2RlZmluZSBEX1NUQVRTKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9TVEFUUywgZiwgIyMgYSkKKyNkZWZpbmUgRF9UWF9SRVBMWShmLCBhLi4uKQlJTF9EQkcoSUxfRExfVFhfUkVQTFksIGYsICMjIGEpCisjZGVmaW5lIERfUU9TKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfUU9TLCBmLCAjIyBhKQorI2RlZmluZSBEX1JBRElPKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9SQURJTywgZiwgIyMgYSkKKyNkZWZpbmUgRF9QT1dFUihmLCBhLi4uKQlJTF9EQkcoSUxfRExfUE9XRVIsIGYsICMjIGEpCisjZGVmaW5lIERfMTFIKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfMTFILCBmLCAjIyBhKQorCisjZW5kaWYgLyogX19pbF9jb3JlX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY3NyLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jc3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTM4ZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY3NyLmgKQEAgLTAsMCArMSw0MTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyAqIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX2lsX2Nzcl9oX18KKyNkZWZpbmUgX19pbF9jc3JfaF9fCisvKgorICogQ1NSIChjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzKQorICoKKyAqIENTUiByZWdpc3RlcnMgYXJlIG1hcHBlZCBkaXJlY3RseSBpbnRvIFBDSSBidXMgc3BhY2UsIGFuZCBhcmUgYWNjZXNzaWJsZQorICogd2hlbmV2ZXIgcGxhdGZvcm0gc3VwcGxpZXMgcG93ZXIgdG8gZGV2aWNlLCBldmVuIHdoZW4gZGV2aWNlIGlzIGluCisgKiBsb3cgcG93ZXIgc3RhdGVzIGR1ZSB0byBkcml2ZXItaW52b2tlZCBkZXZpY2UgcmVzZXRzCisgKiAoZS5nLiBDU1JfUkVTRVRfUkVHX0ZMQUdfU1dfUkVTRVQpIG9yIHVDb2RlLWRyaXZlbiBwb3dlci1zYXZpbmcgbW9kZXMuCisgKgorICogVXNlIF9pbF93cigpIGFuZCBfaWxfcmQoKSBmYW1pbHkgdG8gYWNjZXNzIHRoZXNlIHJlZ2lzdGVyczsKKyAqIHRoZXNlIHByb3ZpZGUgc2ltcGxlIFBDSSBidXMgYWNjZXNzLCB3aXRob3V0IHdha2luZyB1cCB0aGUgTUFDLgorICogRG8gbm90IHVzZSBpbF93cigpIGZhbWlseSBmb3IgdGhlc2UgcmVnaXN0ZXJzOworICogbm8gbmVlZCB0byAiZ3JhYiBuaWMgYWNjZXNzIiB2aWEgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRLgorICogVGhlIE1BQyAodUNvZGUgcHJvY2Vzc29yLCBldGMuKSBkb2VzIG5vdCBuZWVkIHRvIGJlIHBvd2VyZWQgdXAgZm9yIGFjY2Vzc2luZworICogdGhlIENTUiByZWdpc3RlcnMuCisgKgorICogTk9URTogIERldmljZSBkb2VzIG5lZWQgdG8gYmUgYXdha2UgaW4gb3JkZXIgdG8gcmVhZCB0aGlzIG1lbW9yeQorICogICAgICAgIHZpYSBDU1JfRUVQUk9NIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQ1NSX0JBU0UgICAgKDB4MDAwKQorCisjZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHICAgIChDU1JfQkFTRSsweDAwMCkJLyogaGFyZHdhcmUgaW50ZXJmYWNlIGNvbmZpZyAqLworI2RlZmluZSBDU1JfSU5UX0NPQUxFU0NJTkcgICAgICAoQ1NSX0JBU0UrMHgwMDQpCS8qIGFjY3VtIGludHMsIDMyLXVzZWMgdW5pdHMgKi8KKyNkZWZpbmUgQ1NSX0lOVCAgICAgICAgICAgICAgICAgKENTUl9CQVNFKzB4MDA4KQkvKiBob3N0IGludGVycnVwdCBzdGF0dXMvYWNrICovCisjZGVmaW5lIENTUl9JTlRfTUFTSyAgICAgICAgICAgIChDU1JfQkFTRSsweDAwYykJLyogaG9zdCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIENTUl9GSF9JTlRfU1RBVFVTICAgICAgIChDU1JfQkFTRSsweDAxMCkJLyogYnVzbWFzdGVyIGludCBzdGF0dXMvYWNrICovCisjZGVmaW5lIENTUl9HUElPX0lOICAgICAgICAgICAgIChDU1JfQkFTRSsweDAxOCkJLyogcmVhZCBleHRlcm5hbCBjaGlwIHBpbnMgKi8KKyNkZWZpbmUgQ1NSX1JFU0VUICAgICAgICAgICAgICAgKENTUl9CQVNFKzB4MDIwKQkvKiBidXNtYXN0ZXIgZW5hYmxlLCBOTUksIGV0YyAqLworI2RlZmluZSBDU1JfR1BfQ05UUkwgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMjQpCisKKy8qIDJuZCBieXRlIG9mIENTUl9JTlRfQ09BTEVTQ0lORywgbm90IGFjY2Vzc2libGUgdmlhIF9pbF93cigpISAqLworI2RlZmluZSBDU1JfSU5UX1BFUklPRElDX1JFRwkoQ1NSX0JBU0UrMHgwMDUpCisKKy8qCisgKiBIYXJkd2FyZSByZXZpc2lvbiBpbmZvCisgKiBCaXQgZmllbGRzOgorICogMzEtODogIFJlc2VydmVkCisgKiAgNy00OiAgVHlwZSBvZiBkZXZpY2U6ICBzZWUgQ1NSX0hXX1JFVl9UWVBFX3h4eCBkZWZpbml0aW9ucworICogIDMtMjogIFJldmlzaW9uIHN0ZXA6ICAwID0gQSwgMSA9IEIsIDIgPSBDLCAzID0gRAorICogIDEtMDogICJEYXNoIiAoLSkgdmFsdWUsIGFzIGluIEEtMSwgZXRjLgorICoKKyAqIE5PVEU6ICBSZXZpc2lvbiBzdGVwIGFmZmVjdHMgY2FsY3VsYXRpb24gb2YgQ0NLIHR4cG93ZXIgZm9yIDQ5NjUuCisgKiBOT1RFOiAgU2VlIGFsc28gQ1NSX0hXX1JFVl9XQV9SRUcgKHdvcmstYXJvdW5kIGZvciBidWcgaW4gNDk2NSkuCisgKi8KKyNkZWZpbmUgQ1NSX0hXX1JFViAgICAgICAgICAgICAgKENTUl9CQVNFKzB4MDI4KQorCisvKgorICogRUVQUk9NIG1lbW9yeSByZWFkcworICoKKyAqIE5PVEU6ICBEZXZpY2UgbXVzdCBiZSBhd2FrZSwgaW5pdGlhbGl6ZWQgdmlhIGFwbV9vcHMuaW5pdCgpLAorICogICAgICAgIGluIG9yZGVyIHRvIHJlYWQuCisgKi8KKyNkZWZpbmUgQ1NSX0VFUFJPTV9SRUcgICAgICAgICAgKENTUl9CQVNFKzB4MDJjKQorI2RlZmluZSBDU1JfRUVQUk9NX0dQICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMzApCisKKyNkZWZpbmUgQ1NSX0dJT19SRUcJCShDU1JfQkFTRSsweDAzQykKKyNkZWZpbmUgQ1NSX0dQX1VDT0RFX1JFRwkoQ1NSX0JBU0UrMHgwNDgpCisjZGVmaW5lIENTUl9HUF9EUklWRVJfUkVHCShDU1JfQkFTRSsweDA1MCkKKworLyoKKyAqIFVDT0RFLURSSVZFUiBHUCAoZ2VuZXJhbCBwdXJwb3NlKSBtYWlsYm94IHJlZ2lzdGVycy4KKyAqIFNFVC9DTFIgcmVnaXN0ZXJzIHNldC9jbGVhciBiaXQocykgaWYgIjEiIGlzIHdyaXR0ZW4uCisgKi8KKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDEgICAgICAgKENTUl9CQVNFKzB4MDU0KQorI2RlZmluZSBDU1JfVUNPREVfRFJWX0dQMV9TRVQgICAoQ1NSX0JBU0UrMHgwNTgpCisjZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX0NMUiAgIChDU1JfQkFTRSsweDA1YykKKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDIgICAgICAgKENTUl9CQVNFKzB4MDYwKQorCisjZGVmaW5lIENTUl9MRURfUkVHICAgICAgICAgICAgIChDU1JfQkFTRSsweDA5NCkKKyNkZWZpbmUgQ1NSX0RSQU1fSU5UX1RCTF9SRUcJKENTUl9CQVNFKzB4MEEwKQorCisvKiBHSU8gQ2hpY2tlbiBCaXRzIChQQ0kgRXhwcmVzcyBidXMgbGluayBwb3dlciBtYW5hZ2VtZW50KSAqLworI2RlZmluZSBDU1JfR0lPX0NISUNLRU5fQklUUyAgICAoQ1NSX0JBU0UrMHgxMDApCisKKy8qIEFuYWxvZyBwaGFzZS1sb2NrLWxvb3AgY29uZmlndXJhdGlvbiAgKi8KKyNkZWZpbmUgQ1NSX0FOQV9QTExfQ0ZHICAgICAgICAgKENTUl9CQVNFKzB4MjBjKQorCisvKgorICogQ1NSIEhhcmR3YXJlIFJldmlzaW9uIFdvcmthcm91bmQgUmVnaXN0ZXIuICBJbmRpY2F0ZXMgaGFyZHdhcmUgcmV2OworICogInN0ZXAiIGRldGVybWluZXMgQ0NLIGJhY2tvZmYgZm9yIHR4cG93ZXIgY2FsY3VsYXRpb24uICBVc2VkIGZvciA0OTY1IG9ubHkuCisgKiBTZWUgYWxzbyBDU1JfSFdfUkVWIHJlZ2lzdGVyLgorICogQml0IGZpZWxkczoKKyAqICAzLTI6ICAwID0gQSwgMSA9IEIsIDIgPSBDLCAzID0gRCBzdGVwCisgKiAgMS0wOiAgIkRhc2giICgtKSB2YWx1ZSwgYXMgaW4gQy0xLCBldGMuCisgKi8KKyNkZWZpbmUgQ1NSX0hXX1JFVl9XQV9SRUcJCShDU1JfQkFTRSsweDIyQykKKworI2RlZmluZSBDU1JfREJHX0hQRVRfTUVNX1JFRwkJKENTUl9CQVNFKzB4MjQwKQorI2RlZmluZSBDU1JfREJHX0xJTktfUFdSX01HTVRfUkVHCShDU1JfQkFTRSsweDI1MCkKKworLyogQml0cyBmb3IgQ1NSX0hXX0lGX0NPTkZJR19SRUcgKi8KKyNkZWZpbmUgQ1NSNDlfSFdfSUZfQ09ORklHX1JFR19CSVRfNDk2NV9SCSgweDAwMDAwMDEwKQorI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19NU0tfQk9BUkRfVkVSCSgweDAwMDAwQzAwKQorI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTUFDX1NJIAkoMHgwMDAwMDEwMCkKKyNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX1JBRElPX1NJCSgweDAwMDAwMjAwKQorCisjZGVmaW5lIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUXzM5NDVfTUIgICAgICAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfMzk0NV9NTSAgICAgICAgICgweDAwMDAwMjAwKQorI2RlZmluZSBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF9TS1VfTVJDICAgICAgICAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUX0JPQVJEX1RZUEUgICAgICAgICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9BICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVFNfU0lMSUNPTl9UWVBFX0IgICAgKDB4MDAwMDEwMDApCisKKyNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0hBUF9XQUtFX0wxQQkoMHgwMDA4MDAwMCkKKyNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNCSgweDAwMjAwMDAwKQorI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZCSgweDAwNDAwMDAwKQkvKiBQQ0lfT1dOX1NFTSAqLworI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1BSRVBBUkVfRE9ORSAoMHgwMjAwMDAwMCkJLyogTUVfT1dOICovCisjZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHX1BSRVBBUkUJCSAgKDB4MDgwMDAwMDApCS8qIFdBS0VfTUUgKi8KKworI2RlZmluZSBDU1JfSU5UX1BFUklPRElDX0RJUwkJCSgweDAwKQkvKiBkaXNhYmxlIHBlcmlvZGljIGludCAqLworI2RlZmluZSBDU1JfSU5UX1BFUklPRElDX0VOQQkJCSgweEZGKQkvKiAyNTUqMzIgdXNlYyB+IDggbXNlYyAqLworCisvKiBpbnRlcnJ1cHQgZmxhZ3MgaW4gSU5UQSwgc2V0IGJ5IHVDb2RlIG9yIGhhcmR3YXJlIChlLmcuIGRtYSksCisgKiBhY2tub3dsZWRnZWQgKHJlc2V0KSBieSBob3N0IHdyaXRpbmcgIjEiIHRvIGZsYWdnZWQgYml0cy4gKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfRkhfUlggICAgICAgICgxIDw8IDMxKQkvKiBSeCBETUEsIGNtZCByZXNwb25zZXMsIEZIX0lOVFsxNzoxNl0gKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfSFdfRVJSICAgICAgICgxIDw8IDI5KQkvKiBETUEgaGFyZHdhcmUgZXJyb3IgRkhfSU5UWzMxXSAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9SWF9QRVJJT0RJQwkgKDEgPDwgMjgpCS8qIFJ4IHBlcmlvZGljICovCisjZGVmaW5lIENTUl9JTlRfQklUX0ZIX1RYICAgICAgICAoMSA8PCAyNykJLyogVHggRE1BIEZIX0lOVFsxOjBdICovCisjZGVmaW5lIENTUl9JTlRfQklUX1NDRCAgICAgICAgICAoMSA8PCAyNikJLyogVFhRIHBvaW50ZXIgYWR2YW5jZWQgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfU1dfRVJSICAgICAgICgxIDw8IDI1KQkvKiB1Q29kZSBlcnJvciAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9SRl9LSUxMICAgICAgKDEgPDwgNykJLyogSFcgUkZLSUxMIHN3aXRjaCBHUF9DTlRSTFsyN10gdG9nZ2xlZCAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9DVF9LSUxMICAgICAgKDEgPDwgNikJLyogQ3JpdGljYWwgdGVtcCAoY2hpcCB0b28gaG90KSByZmtpbGwgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfU1dfUlggICAgICAgICgxIDw8IDMpCS8qIFJ4LCBjb21tYW5kIHJlc3BvbnNlcywgMzk0NSAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9XQUtFVVAgICAgICAgKDEgPDwgMSkJLyogTklDIGNvbnRyb2xsZXIgd2FraW5nIHVwIChwd3IgbWdtdCkgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfQUxJVkUgICAgICAgICgxIDw8IDApCS8qIHVDb2RlIGludGVycnVwdHMgb25jZSBpdCBpbml0aWFsaXplcyAqLworCisjZGVmaW5lIENTUl9JTklfU0VUX01BU0sJKENTUl9JTlRfQklUX0ZIX1JYICAgfCBcCisJCQkJIENTUl9JTlRfQklUX0hXX0VSUiAgfCBcCisJCQkJIENTUl9JTlRfQklUX0ZIX1RYICAgfCBcCisJCQkJIENTUl9JTlRfQklUX1NXX0VSUiAgfCBcCisJCQkJIENTUl9JTlRfQklUX1JGX0tJTEwgfCBcCisJCQkJIENTUl9JTlRfQklUX1NXX1JYICAgfCBcCisJCQkJIENTUl9JTlRfQklUX1dBS0VVUCAgfCBcCisJCQkJIENTUl9JTlRfQklUX0FMSVZFKQorCisvKiBpbnRlcnJ1cHQgZmxhZ3MgaW4gRkggKGZsb3cgaGFuZGxlcikgKFBDSSBidXNtYXN0ZXIgRE1BKSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9FUlIgICAgICAgKDEgPDwgMzEpCS8qIEVycm9yICovCisjZGVmaW5lIENTUl9GSF9JTlRfQklUX0hJX1BSSU9SICAoMSA8PCAzMCkJLyogSGlnaCBwcmlvcml0eSBSeCwgYnlwYXNzIGNvYWxlc2NpbmcgKi8KKyNkZWZpbmUgQ1NSMzlfRkhfSU5UX0JJVF9SWF9DSE5MMiAgKDEgPDwgMTgpCS8qIFJ4IGNoYW5uZWwgMiAoMzk0NSBvbmx5KSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMSAgKDEgPDwgMTcpCS8qIFJ4IGNoYW5uZWwgMSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMCAgKDEgPDwgMTYpCS8qIFJ4IGNoYW5uZWwgMCAqLworI2RlZmluZSBDU1IzOV9GSF9JTlRfQklUX1RYX0NITkw2ICAoMSA8PCA2KQkvKiBUeCBjaGFubmVsIDYgKDM5NDUgb25seSkgKi8KKyNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfVFhfQ0hOTDEgICgxIDw8IDEpCS8qIFR4IGNoYW5uZWwgMSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCAgKDEgPDwgMCkJLyogVHggY2hhbm5lbCAwICovCisKKyNkZWZpbmUgQ1NSMzlfRkhfSU5UX1JYX01BU0sJKENTUl9GSF9JTlRfQklUX0hJX1BSSU9SIHwgXAorCQkJCSBDU1IzOV9GSF9JTlRfQklUX1JYX0NITkwyIHwgXAorCQkJCSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMSB8IFwKKwkJCQkgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDApCisKKyNkZWZpbmUgQ1NSMzlfRkhfSU5UX1RYX01BU0sJKENTUjM5X0ZIX0lOVF9CSVRfVFhfQ0hOTDYgfCBcCisJCQkJIENTUl9GSF9JTlRfQklUX1RYX0NITkwxIHwgXAorCQkJCSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCkKKworI2RlZmluZSBDU1I0OV9GSF9JTlRfUlhfTUFTSwkoQ1NSX0ZIX0lOVF9CSVRfSElfUFJJT1IgfCBcCisJCQkJIENTUl9GSF9JTlRfQklUX1JYX0NITkwxIHwgXAorCQkJCSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMCkKKworI2RlZmluZSBDU1I0OV9GSF9JTlRfVFhfTUFTSwkoQ1NSX0ZIX0lOVF9CSVRfVFhfQ0hOTDEgfCBcCisJCQkJIENTUl9GSF9JTlRfQklUX1RYX0NITkwwKQorCisvKiBHUElPICovCisjZGVmaW5lIENTUl9HUElPX0lOX0JJVF9BVVhfUE9XRVIgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIENTUl9HUElPX0lOX1ZBTF9WQVVYX1BXUl9TUkMgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIENTUl9HUElPX0lOX1ZBTF9WTUFJTl9QV1JfU1JDICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCisKKy8qIFJFU0VUICovCisjZGVmaW5lIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBDU1JfUkVTRVRfUkVHX0ZMQUdfRk9SQ0VfTk1JICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgQ1NSX1JFU0VUX1JFR19GTEFHX1NXX1JFU0VUICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIENTUl9SRVNFVF9SRUdfRkxBR19NQVNURVJfRElTQUJMRUQgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBDU1JfUkVTRVRfUkVHX0ZMQUdfU1RPUF9NQVNURVIgICAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgQ1NSX1JFU0VUX0xJTktfUFdSX01HTVRfRElTQUJMRUQgICAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKy8qCisgKiBHUCAoZ2VuZXJhbCBwdXJwb3NlKSBDT05UUk9MIFJFR0lTVEVSCisgKiBCaXQgZmllbGRzOgorICogICAgMjc6ICBIV19SRl9LSUxMX1NXCisgKiAgICAgICAgIEluZGljYXRlcyBzdGF0ZSBvZiAocGxhdGZvcm0ncykgaGFyZHdhcmUgUkYtS2lsbCBzd2l0Y2gKKyAqIDI2LTI0OiAgUE9XRVJfU0FWRV9UWVBFCisgKiAgICAgICAgIEluZGljYXRlcyBjdXJyZW50IHBvd2VyLXNhdmluZyBtb2RlOgorICogICAgICAgICAwMDAgLS0gTm8gcG93ZXIgc2F2aW5nCisgKiAgICAgICAgIDAwMSAtLSBNQUMgcG93ZXItZG93bgorICogICAgICAgICAwMTAgLS0gUEhZIChyYWRpbykgcG93ZXItZG93bgorICogICAgICAgICAwMTEgLS0gRXJyb3IKKyAqICAgOS02OiAgU1lTX0NPTkZJRworICogICAgICAgICBJbmRpY2F0ZXMgY3VycmVudCBzeXN0ZW0gY29uZmlndXJhdGlvbiwgcmVmbGVjdGluZyBwaW5zIG9uIGNoaXAKKyAqICAgICAgICAgYXMgZm9yY2VkIGhpZ2gvbG93IGJ5IGRldmljZSBjaXJjdWl0IGJvYXJkLgorICogICAgIDQ6ICBHT0lOR19UT19TTEVFUAorICogICAgICAgICBJbmRpY2F0ZXMgTUFDIGlzIGVudGVyaW5nIGEgcG93ZXItc2F2aW5nIHNsZWVwIHBvd2VyLWRvd24uCisgKiAgICAgICAgIE5vdCBhIGdvb2QgdGltZSB0byBhY2Nlc3MgZGV2aWNlLWludGVybmFsIHJlc291cmNlcy4KKyAqICAgICAzOiAgTUFDX0FDQ0VTU19SRVEKKyAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcmVxdWVzdCBhbmQgbWFpbnRhaW4gTUFDIHdha2V1cCwgdG8gYWxsb3cgaG9zdAorICogICAgICAgICBhY2Nlc3MgdG8gZGV2aWNlLWludGVybmFsIHJlc291cmNlcy4gIEhvc3QgbXVzdCB3YWl0IGZvcgorICogICAgICAgICBNQUNfQ0xPQ0tfUkVBRFkgKGFuZCAhR09JTkdfVE9fU0xFRVApIGJlZm9yZSBhY2Nlc3Npbmcgbm9uLUNTUgorICogICAgICAgICBkZXZpY2UgcmVnaXN0ZXJzLgorICogICAgIDI6ICBJTklUX0RPTkUKKyAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcHV0IGRldmljZSBpbnRvIGZ1bGx5IG9wZXJhdGlvbmFsIEQwIHBvd2VyIG1vZGUuCisgKiAgICAgICAgIEhvc3QgcmVzZXRzIHRoaXMgYWZ0ZXIgU1dfUkVTRVQgdG8gcHV0IGRldmljZSBpbnRvIGxvdyBwb3dlciBtb2RlLgorICogICAgIDA6ICBNQUNfQ0xPQ0tfUkVBRFkKKyAqICAgICAgICAgSW5kaWNhdGVzIE1BQyAodWNvZGUgcHJvY2Vzc29yLCBldGMuKSBpcyBwb3dlcmVkIHVwIGFuZCBjYW4gcnVuLgorICogICAgICAgICBJbnRlcm5hbCByZXNvdXJjZXMgYXJlIGFjY2Vzc2libGUuCisgKiAgICAgICAgIE5PVEU6ICBUaGlzIGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBhY3R1YWxseSBydW5uaW5nLgorICogICAgICAgICBOT1RFOiAgVGhpcyBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IDQ5NjUgb3IgMzk0NSBoYXMgY29tcGxldGVkCisgKiAgICAgICAgICAgICAgICBpbml0IG9yIHBvc3QtcG93ZXItZG93biByZXN0b3JlIG9mIGludGVybmFsIFNSQU0gbWVtb3J5LgorICogICAgICAgICAgICAgICAgVXNlIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVAgYXMgaW5kaWNhdGlvbiB0aGF0CisgKiAgICAgICAgICAgICAgICBTUkFNIGlzIHJlc3RvcmVkIGFuZCB1Q29kZSBpcyBpbiBub3JtYWwgb3BlcmF0aW9uIG1vZGUuCisgKiAgICAgICAgICAgICAgICBMYXRlciBkZXZpY2VzICg1eHh4LzZ4eHgvMXh4eCkgdXNlIG5vbi12b2xhdGlsZSBTUkFNLCBhbmQKKyAqICAgICAgICAgICAgICAgIGRvIG5vdCBuZWVkIHRvIHNhdmUvcmVzdG9yZSBpdC4KKyAqICAgICAgICAgTk9URTogIEFmdGVyIGRldmljZSByZXNldCwgdGhpcyBiaXQgcmVtYWlucyAiMCIgdW50aWwgaG9zdCBzZXRzCisgKiAgICAgICAgICAgICAgICBJTklUX0RPTkUKKyAqLworI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0lOSVRfRE9ORSAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfR09JTkdfVE9fU0xFRVAgICAgICAgICAoMHgwMDAwMDAxMCkKKworI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX1ZBTF9NQUNfQUNDRVNTX0VOICAgICAgICAgICAoMHgwMDAwMDAwMSkKKworI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX01TS19QT1dFUl9TQVZFX1RZUEUgICAgICAgICAoMHgwNzAwMDAwMCkKKyNkZWZpbmUgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19QT1dFUl9TQVZFICAgICAgICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXICAgICAgICAgICgweDA4MDAwMDAwKQorCisvKiBFRVBST00gUkVHICovCisjZGVmaW5lIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLCSgweDAwMDAwMDAxKQorI2RlZmluZSBDU1JfRUVQUk9NX1JFR19CSVRfQ01ECQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgQ1NSX0VFUFJPTV9SRUdfTVNLX0FERFIJCSgweDAwMDBGRkZDKQorI2RlZmluZSBDU1JfRUVQUk9NX1JFR19NU0tfREFUQQkJKDB4RkZGRjAwMDApCisKKy8qIEVFUFJPTSBHUCAqLworI2RlZmluZSBDU1JfRUVQUk9NX0dQX1ZBTElEX01TSwkJKDB4MDAwMDAwMDcpCS8qIHNpZ25hdHVyZSAqLworI2RlZmluZSBDU1JfRUVQUk9NX0dQX0lGX09XTkVSX01TSwkoMHgwMDAwMDE4MCkKKyNkZWZpbmUgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTEVTU19USEFOXzRLCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTU9SRV9USEFOXzRLCQkoMHgwMDAwMDAwNCkKKworLyogR1AgUkVHICovCisjZGVmaW5lIENTUl9HUF9SRUdfUE9XRVJfU0FWRV9TVEFUVVNfTVNLICAgICAgICAgICAgKDB4MDMwMDAwMDApCS8qIGJpdCAyNC8yNSAqLworI2RlZmluZSBDU1JfR1BfUkVHX05PX1BPV0VSX1NBVkUgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgQ1NSX0dQX1JFR19NQUNfUE9XRVJfU0FWRSAgICAgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIENTUl9HUF9SRUdfUEhZX1BPV0VSX1NBVkUgICAgICAgICAgICgweDAyMDAwMDAwKQorI2RlZmluZSBDU1JfR1BfUkVHX1BPV0VSX1NBVkVfRVJST1IgICAgICAgICAoMHgwMzAwMDAwMCkKKworLyogQ1NSIEdJTyAqLworI2RlZmluZSBDU1JfR0lPX1JFR19WQUxfTDBTX0VOQUJMRUQJKDB4MDAwMDAwMDIpCisKKy8qCisgKiBVQ09ERS1EUklWRVIgR1AgKGdlbmVyYWwgcHVycG9zZSkgbWFpbGJveCByZWdpc3RlciAxCisgKiBIb3N0IGRyaXZlciBhbmQgdUNvZGUgd3JpdGUgYW5kL29yIHJlYWQgdGhpcyByZWdpc3RlciB0byBjb21tdW5pY2F0ZSB3aXRoCisgKiBlYWNoIG90aGVyLgorICogQml0IGZpZWxkczoKKyAqICAgICA0OiAgVUNPREVfRElTQUJMRQorICogICAgICAgICBIb3N0IHNldHMgdGhpcyB0byByZXF1ZXN0IHBlcm1hbmVudCBoYWx0IG9mIHVDb2RlLCBzYW1lIGFzCisgKiAgICAgICAgIHNlbmRpbmcgQ0FSRF9TVEFURSBjb21tYW5kIHdpdGggImhhbHQiIGJpdCBzZXQuCisgKiAgICAgMzogIENUX0tJTExfRVhJVAorICogICAgICAgICBIb3N0IHNldHMgdGhpcyB0byByZXF1ZXN0IGV4aXQgZnJvbSBDVF9LSUxMIHN0YXRlLCBpLmUuIGhvc3QgdGhpbmtzCisgKiAgICAgICAgIGRldmljZSB0ZW1wZXJhdHVyZSBpcyBsb3cgZW5vdWdoIHRvIGNvbnRpbnVlIG5vcm1hbCBvcGVyYXRpb24uCisgKiAgICAgMjogIENNRF9CTE9DS0VECisgKiAgICAgICAgIEhvc3Qgc2V0cyB0aGlzIGR1cmluZyBSRiBLSUxMIHBvd2VyLWRvd24gc2VxdWVuY2UgKEhXLCBTVywgQ1QgS0lMTCkKKyAqICAgICAgICAgdG8gcmVsZWFzZSB1Q29kZSB0byBjbGVhciBhbGwgVHggYW5kIGNvbW1hbmQgcXVldWVzLCBlbnRlcgorICogICAgICAgICB1bmFzc29jaWF0ZWQgbW9kZSwgYW5kIHBvd2VyIGRvd24uCisgKiAgICAgICAgIE5PVEU6ICBTb21lIGRldmljZXMgYWxzbyB1c2UgSEJVU19UQVJHX01CWF9DIHJlZ2lzdGVyIGZvciB0aGlzIGJpdC4KKyAqICAgICAxOiAgU1dfQklUX1JGS0lMTAorICogICAgICAgICBIb3N0IHNldHMgdGhpcyB3aGVuIGlzc3VpbmcgQ0FSRF9TVEFURSBjb21tYW5kIHRvIHJlcXVlc3QKKyAqICAgICAgICAgZGV2aWNlIHNsZWVwLgorICogICAgIDA6ICBNQUNfU0xFRVAKKyAqICAgICAgICAgdUNvZGUgc2V0cyB0aGlzIHdoZW4gcHJlcGFyaW5nIGEgcG93ZXItc2F2aW5nIHBvd2VyLWRvd24uCisgKiAgICAgICAgIHVDb2RlIHJlc2V0cyB0aGlzIHdoZW4gcG93ZXItdXAgaXMgY29tcGxldGUgYW5kIFNSQU0gaXMgc2FuZS4KKyAqICAgICAgICAgTk9URTogIDM5NDUvNDk2NSBzYXZlcyBpbnRlcm5hbCBTUkFNIGRhdGEgdG8gaG9zdCB3aGVuIHBvd2VyaW5nIGRvd24sCisgKiAgICAgICAgICAgICAgICBhbmQgbXVzdCByZXN0b3JlIHRoaXMgZGF0YSBhZnRlciBwb3dlcmluZyBiYWNrIHVwLgorICogICAgICAgICAgICAgICAgTUFDX1NMRUVQIGlzIHRoZSBiZXN0IGluZGljYXRpb24gdGhhdCByZXN0b3JlIGlzIGNvbXBsZXRlLgorICogICAgICAgICAgICAgICAgTGF0ZXIgZGV2aWNlcyAoNXh4eC82eHh4LzF4eHgpIHVzZSBub24tdm9sYXRpbGUgU1JBTSwgYW5kCisgKiAgICAgICAgICAgICAgICBkbyBub3QgbmVlZCB0byBzYXZlL3Jlc3RvcmUgaXQuCisgKi8KKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX01BQ19TTEVFUCAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDFfUkVHX0JJVF9DVF9LSUxMX0VYSVQgICAgICAoMHgwMDAwMDAwOCkKKworLyogR0lPIENoaWNrZW4gQml0cyAoUENJIEV4cHJlc3MgYnVzIGxpbmsgcG93ZXIgbWFuYWdlbWVudCkgKi8KKyNkZWZpbmUgQ1NSX0dJT19DSElDS0VOX0JJVFNfUkVHX0JJVF9MMUFfTk9fTDBTX1JYICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgQ1NSX0dJT19DSElDS0VOX0JJVFNfUkVHX0JJVF9ESVNfTDBTX0VYSVRfVElNRVIgICgweDIwMDAwMDAwKQorCisvKiBMRUQgKi8KKyNkZWZpbmUgQ1NSX0xFRF9CU01fQ1RSTF9NU0sgKDB4RkZGRkZGREYpCisjZGVmaW5lIENTUl9MRURfUkVHX1RSVU5fT04gKDB4NzgpCisjZGVmaW5lIENTUl9MRURfUkVHX1RSVU5fT0ZGICgweDM4KQorCisvKiBBTkFfUExMICovCisjZGVmaW5lIENTUjM5X0FOQV9QTExfQ0ZHX1ZBTCAgICAgICAgKDB4MDEwMDAwMDApCisKKy8qIEhQRVQgTUVNIGRlYnVnICovCisjZGVmaW5lIENTUl9EQkdfSFBFVF9NRU1fUkVHX1ZBTAkoMHhGRkZGMDAwMCkKKworLyogRFJBTSBJTlQgVEJMICovCisjZGVmaW5lIENTUl9EUkFNX0lOVF9UQkxfRU5BQkxFCQkoMSA8PCAzMSkKKyNkZWZpbmUgQ1NSX0RSQU1fSU5JVF9UQkxfV1JBUF9DSEVDSwkoMSA8PCAyNykKKworLyoKKyAqIEhCVVMgKEhvc3Qtc2lkZSBCdXMpCisgKgorICogSEJVUyByZWdpc3RlcnMgYXJlIG1hcHBlZCBkaXJlY3RseSBpbnRvIFBDSSBidXMgc3BhY2UsIGJ1dCBhcmUgdXNlZAorICogdG8gaW5kaXJlY3RseSBhY2Nlc3MgZGV2aWNlJ3MgaW50ZXJuYWwgbWVtb3J5IG9yIHJlZ2lzdGVycyB0aGF0CisgKiBtYXkgYmUgcG93ZXJlZC1kb3duLgorICoKKyAqIFVzZSBpbF93cigpL2lsX3JkKCkgZmFtaWx5CisgKiBmb3IgdGhlc2UgcmVnaXN0ZXJzOworICogaG9zdCBtdXN0ICJncmFiIG5pYyBhY2Nlc3MiIHZpYSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEKKyAqIHRvIG1ha2Ugc3VyZSB0aGUgTUFDICh1Q29kZSBwcm9jZXNzb3IsIGV0Yy4pIGlzIHBvd2VyZWQgdXAgZm9yIGFjY2Vzc2luZworICogaW50ZXJuYWwgcmVzb3VyY2VzLgorICoKKyAqIERvIG5vdCB1c2UgX2lsX3dyKCkvX2lsX3JkKCkgZmFtaWx5IHRvIGFjY2VzcyB0aGVzZSByZWdpc3RlcnM7CisgKiB0aGVzZSBwcm92aWRlIG9ubHkgc2ltcGxlIFBDSSBidXMgYWNjZXNzLCB3aXRob3V0IHdha2luZyB1cCB0aGUgTUFDLgorICovCisjZGVmaW5lIEhCVVNfQkFTRQkoMHg0MDApCisKKy8qCisgKiBSZWdpc3RlcnMgZm9yIGFjY2Vzc2luZyBkZXZpY2UncyBpbnRlcm5hbCBTUkFNIG1lbW9yeSAoZS5nLiBTQ0QgU1JBTQorICogc3RydWN0dXJlcywgZXJyb3IgbG9nLCBldmVudCBsb2csIHZlcmlmeWluZyB1Q29kZSBsb2FkKS4KKyAqIEZpcnN0IHdyaXRlIHRvIGFkZHJlc3MgcmVnaXN0ZXIsIHRoZW4gcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGRhdGEgcmVnaXN0ZXIKKyAqIHRvIGNvbXBsZXRlIHRoZSBqb2IuICBPbmNlIHRoZSBhZGRyZXNzIHJlZ2lzdGVyIGlzIHNldCB1cCwgYWNjZXNzZXMgdG8KKyAqIGRhdGEgcmVnaXN0ZXJzIGF1dG8taW5jcmVtZW50IHRoZSBhZGRyZXNzIGJ5IG9uZSBkd29yZC4KKyAqIEJpdCB1c2FnZSBmb3IgYWRkcmVzcyByZWdpc3RlcnMgKHJlYWQgb3Igd3JpdGUpOgorICogIDAtMzE6ICBtZW1vcnkgYWRkcmVzcyB3aXRoaW4gZGV2aWNlCisgKi8KKyNkZWZpbmUgSEJVU19UQVJHX01FTV9SQUREUiAgICAgKEhCVVNfQkFTRSsweDAwYykKKyNkZWZpbmUgSEJVU19UQVJHX01FTV9XQUREUiAgICAgKEhCVVNfQkFTRSsweDAxMCkKKyNkZWZpbmUgSEJVU19UQVJHX01FTV9XREFUICAgICAgKEhCVVNfQkFTRSsweDAxOCkKKyNkZWZpbmUgSEJVU19UQVJHX01FTV9SREFUICAgICAgKEhCVVNfQkFTRSsweDAxYykKKworLyogTWFpbGJveCBDLCB1c2VkIGFzIHdvcmthcm91bmQgYWx0ZXJuYXRpdmUgdG8gQ1NSX1VDT0RFX0RSVl9HUDEgbWFpbGJveCAqLworI2RlZmluZSBIQlVTX1RBUkdfTUJYX0MgICAgICAgICAoSEJVU19CQVNFKzB4MDMwKQorI2RlZmluZSBIQlVTX1RBUkdfTUJYX0NfUkVHX0JJVF9DTURfQkxPQ0tFRCAgICAgICAgICgweDAwMDAwMDA0KQorCisvKgorICogUmVnaXN0ZXJzIGZvciBhY2Nlc3NpbmcgZGV2aWNlJ3MgaW50ZXJuYWwgcGVyaXBoZXJhbCByZWdpc3RlcnMKKyAqIChlLmcuIFNDRCwgQlNNLCBldGMuKS4gIEZpcnN0IHdyaXRlIHRvIGFkZHJlc3MgcmVnaXN0ZXIsCisgKiB0aGVuIHJlYWQgZnJvbSBvciB3cml0ZSB0byBkYXRhIHJlZ2lzdGVyIHRvIGNvbXBsZXRlIHRoZSBqb2IuCisgKiBCaXQgdXNhZ2UgZm9yIGFkZHJlc3MgcmVnaXN0ZXJzIChyZWFkIG9yIHdyaXRlKToKKyAqICAwLTE1OiAgcmVnaXN0ZXIgYWRkcmVzcyAob2Zmc2V0KSB3aXRoaW4gZGV2aWNlCisgKiAyNC0yNTogICgjIGJ5dGVzIC0gMSkgdG8gcmVhZCBvciB3cml0ZSAoZS5nLiAzIGZvciBkd29yZCkKKyAqLworI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9XQUREUiAgICAoSEJVU19CQVNFKzB4MDQ0KQorI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9SQUREUiAgICAoSEJVU19CQVNFKzB4MDQ4KQorI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9XREFUICAgICAoSEJVU19CQVNFKzB4MDRjKQorI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9SREFUICAgICAoSEJVU19CQVNFKzB4MDUwKQorCisvKgorICogUGVyLVR4LXF1ZXVlIHdyaXRlIHBvaW50ZXIgKGlkeCwgcmVhbGx5ISkKKyAqIEluZGljYXRlcyBpZHggdG8gbmV4dCBURkQgdGhhdCBkcml2ZXIgd2lsbCBmaWxsICgxIHBhc3QgbGF0ZXN0IGZpbGxlZCkuCisgKiBCaXQgdXNhZ2U6CisgKiAgMC03OiAgcXVldWUgd3JpdGUgaWR4CisgKiAxMS04OiAgcXVldWUgc2VsZWN0b3IKKyAqLworI2RlZmluZSBIQlVTX1RBUkdfV1JQVFIgICAgICAgICAoSEJVU19CQVNFKzB4MDYwKQorCisjZW5kaWYgLyogIV9faWxfY3NyX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiODkyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2RlYnVnLmMKQEAgLTAsMCArMSwxNDExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qIGNyZWF0ZSBhbmQgcmVtb3ZlIG9mIGZpbGVzICovCisjZGVmaW5lIERFQlVHRlNfQUREX0ZJTEUobmFtZSwgcGFyZW50LCBtb2RlKSBkbyB7CQkJXAorCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgjbmFtZSwgbW9kZSwgcGFyZW50LCBpbCwJCVwKKwkJCSAmaWxfZGJnZnNfIyNuYW1lIyNfb3BzKSkJCVwKKwkJZ290byBlcnI7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBERUJVR0ZTX0FERF9CT09MKG5hbWUsIHBhcmVudCwgcHRyKSBkbyB7CQkJXAorCXN0cnVjdCBkZW50cnkgKl9fdG1wOwkJCQkJCVwKKwlfX3RtcCA9IGRlYnVnZnNfY3JlYXRlX2Jvb2woI25hbWUsIFNfSVdVU1IgfCBTX0lSVVNSLAkJXAorCQkJCSAgICBwYXJlbnQsIHB0cik7CQkJXAorCWlmIChJU19FUlIoX190bXApIHx8ICFfX3RtcCkJCQkJCVwKKwkJZ290byBlcnI7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBERUJVR0ZTX0FERF9YMzIobmFtZSwgcGFyZW50LCBwdHIpIGRvIHsJCQkJXAorCXN0cnVjdCBkZW50cnkgKl9fdG1wOwkJCQkJCVwKKwlfX3RtcCA9IGRlYnVnZnNfY3JlYXRlX3gzMigjbmFtZSwgU19JV1VTUiB8IFNfSVJVU1IsCQlcCisJCQkJICAgcGFyZW50LCBwdHIpOwkJCVwKKwlpZiAoSVNfRVJSKF9fdG1wKSB8fCAhX190bXApCQkJCQlcCisJCWdvdG8gZXJyOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIGZpbGUgb3BlcmF0aW9uICovCisjZGVmaW5lIERFQlVHRlNfUkVBRF9GVU5DKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBpbF9kYmdmc18jI25hbWUjI19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCAgICAgICAgICAgICAgIFwKKwkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLCAgICAgICAgICBcCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworI2RlZmluZSBERUJVR0ZTX1dSSVRFX0ZVTkMobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3QgaWxfZGJnZnNfIyNuYW1lIyNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsICAgICAgICAgICAgICBcCisJCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwgICAgXAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisKK3N0YXRpYyBpbnQKK2lsX2RiZ2ZzX29wZW5fZmlsZV9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgREVCVUdGU19SRUFEX0ZJTEVfT1BTKG5hbWUpCQkJCVwKKwlERUJVR0ZTX1JFQURfRlVOQyhuYW1lKTsJCQkJXAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaWxfZGJnZnNfIyNuYW1lIyNfb3BzID0gewlcCisJLnJlYWQgPSBpbF9kYmdmc18jI25hbWUjI19yZWFkLAkJCQlcCisJLm9wZW4gPSBpbF9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywJCQlcCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKK307CisKKyNkZWZpbmUgREVCVUdGU19XUklURV9GSUxFX09QUyhuYW1lKQkJCQlcCisJREVCVUdGU19XUklURV9GVU5DKG5hbWUpOwkJCQlcCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbF9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKKwkud3JpdGUgPSBpbF9kYmdmc18jI25hbWUjI193cml0ZSwJCQlcCisJLm9wZW4gPSBpbF9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywJCQlcCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKK307CisKKyNkZWZpbmUgREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKG5hbWUpCQkJXAorCURFQlVHRlNfUkVBRF9GVU5DKG5hbWUpOwkJCQlcCisJREVCVUdGU19XUklURV9GVU5DKG5hbWUpOwkJCQlcCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbF9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKKwkud3JpdGUgPSBpbF9kYmdmc18jI25hbWUjI193cml0ZSwJCQlcCisJLnJlYWQgPSBpbF9kYmdmc18jI25hbWUjI19yZWFkLAkJCQlcCisJLm9wZW4gPSBpbF9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywJCQlcCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKK307CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc190eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpidWY7CisJaW50IHBvcyA9IDA7CisKKwlpbnQgY250OworCXNzaXplX3QgcmV0OworCWNvbnN0IHNpemVfdCBidWZzeiA9CisJICAgIDEwMCArIHNpemVvZihjaGFyKSAqIDUwICogKE1BTkFHRU1FTlRfTUFYICsgQ09OVFJPTF9NQVgpOworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJNYW5hZ2VtZW50OlxuIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQU5BR0VNRU5UX01BWDsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0JTI1c1x0XHQ6ICV1XG4iLAorCQkJICAgICAgaWxfZ2V0X21nbXRfc3RyaW5nKGNudCksIGlsLT50eF9zdGF0cy5tZ210W2NudF0pOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJDb250cm9sXG4iKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IENPTlRST0xfTUFYOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHQlMjVzXHRcdDogJXVcbiIsCisJCQkgICAgICBpbF9nZXRfY3RybF9zdHJpbmcoY250KSwgaWwtPnR4X3N0YXRzLmN0cmxbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkRhdGE6XG4iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdGNudDogJXVcbiIsCisJCSAgICAgIGlsLT50eF9zdGF0cy5kYXRhX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRieXRlczogJWxsdVxuIiwKKwkJICAgICAgaWwtPnR4X3N0YXRzLmRhdGFfYnl0ZXMpOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX2NsZWFyX3RyYWZmaWNfc3RhdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1MzIgY2xlYXJfZmxhZzsKKwljaGFyIGJ1Zls4XTsKKwlpbnQgYnVmX3NpemU7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHNzY2FuZihidWYsICIleCIsICZjbGVhcl9mbGFnKSAhPSAxKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpbF9jbGVhcl90cmFmZmljX3N0YXRzKGlsKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKmJ1ZjsKKwlpbnQgcG9zID0gMDsKKwlpbnQgY250OworCXNzaXplX3QgcmV0OworCWNvbnN0IHNpemVfdCBidWZzeiA9CisJICAgIDEwMCArIHNpemVvZihjaGFyKSAqIDUwICogKE1BTkFHRU1FTlRfTUFYICsgQ09OVFJPTF9NQVgpOworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIk1hbmFnZW1lbnQ6XG4iKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BTkFHRU1FTlRfTUFYOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHQlMjVzXHRcdDogJXVcbiIsCisJCQkgICAgICBpbF9nZXRfbWdtdF9zdHJpbmcoY250KSwgaWwtPnJ4X3N0YXRzLm1nbXRbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkNvbnRyb2w6XG4iKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IENPTlRST0xfTUFYOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHQlMjVzXHRcdDogJXVcbiIsCisJCQkgICAgICBpbF9nZXRfY3RybF9zdHJpbmcoY250KSwgaWwtPnJ4X3N0YXRzLmN0cmxbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkRhdGE6XG4iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdGNudDogJXVcbiIsCisJCSAgICAgIGlsLT5yeF9zdGF0cy5kYXRhX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRieXRlczogJWxsdVxuIiwKKwkJICAgICAgaWwtPnJ4X3N0YXRzLmRhdGFfYnl0ZXMpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEJZVEUxX01BU0sgMHgwMDAwMDBmZjsKKyNkZWZpbmUgQllURTJfTUFTSyAweDAwMDBmZmZmOworI2RlZmluZSBCWVRFM19NQVNLIDB4MDBmZmZmZmY7CitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfc3JhbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICAgbG9mZl90ICpwcG9zKQoreworCXUzMiB2YWw7CisJY2hhciAqYnVmOworCXNzaXplX3QgcmV0OworCWludCBpOworCWludCBwb3MgPSAwOworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzaXplX3QgYnVmc3o7CisKKwkvKiBkZWZhdWx0IGlzIHRvIGR1bXAgdGhlIGVudGlyZSBkYXRhIHNlZ21lbnQgKi8KKwlpZiAoIWlsLT5kYmdmc19zcmFtX29mZnNldCAmJiAhaWwtPmRiZ2ZzX3NyYW1fbGVuKSB7CisJCWlsLT5kYmdmc19zcmFtX29mZnNldCA9IDB4ODAwMDAwOworCQlpZiAoaWwtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkKKwkJCWlsLT5kYmdmc19zcmFtX2xlbiA9IGlsLT51Y29kZV9pbml0X2RhdGEubGVuOworCQllbHNlCisJCQlpbC0+ZGJnZnNfc3JhbV9sZW4gPSBpbC0+dWNvZGVfZGF0YS5sZW47CisJfQorCWJ1ZnN6ID0gMzAgKyBpbC0+ZGJnZnNfc3JhbV9sZW4gKiBzaXplb2YoY2hhcikgKiAxMDsKKwlidWYgPSBrbWFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAic3JhbV9sZW46IDB4JXhcbiIsCisJCSAgICAgIGlsLT5kYmdmc19zcmFtX2xlbik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAic3JhbV9vZmZzZXQ6IDB4JXhcbiIsCisJCSAgICAgIGlsLT5kYmdmc19zcmFtX29mZnNldCk7CisJZm9yIChpID0gaWwtPmRiZ2ZzX3NyYW1fbGVuOyBpID4gMDsgaSAtPSA0KSB7CisJCXZhbCA9CisJCSAgICBpbF9yZWFkX3RhcmdfbWVtKGlsLAorCQkJCSAgICAgaWwtPmRiZ2ZzX3NyYW1fb2Zmc2V0ICsKKwkJCQkgICAgIGlsLT5kYmdmc19zcmFtX2xlbiAtIGkpOworCQlpZiAoaSA8IDQpIHsKKwkJCXN3aXRjaCAoaSkgeworCQkJY2FzZSAxOgorCQkJCXZhbCAmPSBCWVRFMV9NQVNLOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXZhbCAmPSBCWVRFMl9NQVNLOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXZhbCAmPSBCWVRFM19NQVNLOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghKGkgJSAxNikpCisJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOworCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIweCUwOHggIiwgdmFsKTsKKwl9CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3NyYW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1Zls2NF07CisJaW50IGJ1Zl9zaXplOworCXUzMiBvZmZzZXQsIGxlbjsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzc2NhbmYoYnVmLCAiJXgsJXgiLCAmb2Zmc2V0LCAmbGVuKSA9PSAyKSB7CisJCWlsLT5kYmdmc19zcmFtX29mZnNldCA9IG9mZnNldDsKKwkJaWwtPmRiZ2ZzX3NyYW1fbGVuID0gbGVuOworCX0gZWxzZSB7CisJCWlsLT5kYmdmc19zcmFtX29mZnNldCA9IDA7CisJCWlsLT5kYmdmc19zcmFtX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfc3RhdGlvbnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbF9zdGF0aW9uX2VudHJ5ICpzdGF0aW9uOworCWludCBtYXhfc3RhID0gaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7CisJY2hhciAqYnVmOworCWludCBpLCBqLCBwb3MgPSAwOworCXNzaXplX3QgcmV0OworCS8qIEFkZCAzMCBmb3IgaW5pdGlhbCBzdHJpbmcgKi8KKwljb25zdCBzaXplX3QgYnVmc3ogPSAzMCArIHNpemVvZihjaGFyKSAqIDUwMCAqIChpbC0+bnVtX3N0YXRpb25zKTsKKworCWJ1ZiA9IGttYWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm51bSBvZiBzdGF0aW9uczogJWRcblxuIiwKKwkJICAgICAgaWwtPm51bV9zdGF0aW9ucyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3N0YTsgaSsrKSB7CisJCXN0YXRpb24gPSAmaWwtPnN0YXRpb25zW2ldOworCQlpZiAoIXN0YXRpb24tPnVzZWQpCisJCQljb250aW51ZTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJzdGF0aW9uICVkIC0gYWRkcjogJXBNLCBmbGFnczogJSN4XG4iLCBpLAorCQkJICAgICAgc3RhdGlvbi0+c3RhLnN0YS5hZGRyLAorCQkJICAgICAgc3RhdGlvbi0+c3RhLnN0YXRpb25fZmxhZ3NfbXNrKTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJUSURcdHNlcV9udW1cdHR4cV9pZFx0ZnJhbWVzXHR0ZmRzXHQiKTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJzdGFydF9pZHhcdGJpdG1hcFx0XHRcdHJhdGVfbl9mbGFnc1xuIik7CisKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9USURfQ09VTlQ7IGorKykgeworCQkJcG9zICs9CisJCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkJICAgICAgIiVkOlx0JSN4XHQlI3hcdCV1XHQldVx0JXVcdFx0JSMuMTZsbHhcdCUjeCIsCisJCQkJICAgICAgaiwgc3RhdGlvbi0+dGlkW2pdLnNlcV9udW1iZXIsCisJCQkJICAgICAgc3RhdGlvbi0+dGlkW2pdLmFnZy50eHFfaWQsCisJCQkJICAgICAgc3RhdGlvbi0+dGlkW2pdLmFnZy5mcmFtZV9jb3VudCwKKwkJCQkgICAgICBzdGF0aW9uLT50aWRbal0udGZkc19pbl9xdWV1ZSwKKwkJCQkgICAgICBzdGF0aW9uLT50aWRbal0uYWdnLnN0YXJ0X2lkeCwKKwkJCQkgICAgICBzdGF0aW9uLT50aWRbal0uYWdnLmJpdG1hcCwKKwkJCQkgICAgICBzdGF0aW9uLT50aWRbal0uYWdnLnJhdGVfbl9mbGFncyk7CisKKwkJCWlmIChzdGF0aW9uLT50aWRbal0uYWdnLndhaXRfZm9yX2JhKQorCQkJCXBvcyArPQorCQkJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkJICAgICAgIiAtIHdhaXRmb3JiYSIpOworCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKKwkJfQorCisJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisJfQorCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfbnZtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDAsIG9mcyA9IDAsIGJ1Zl9zaXplID0gMDsKKwljb25zdCB1OCAqcHRyOworCWNoYXIgKmJ1ZjsKKwl1MTYgZWVwcm9tX3ZlcjsKKwlzaXplX3QgZWVwcm9tX2xlbiA9IGlsLT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZTsKKwlidWZfc2l6ZSA9IDQgKiBlZXByb21fbGVuICsgMjU2OworCisJaWYgKGVlcHJvbV9sZW4gJSAxNikgeworCQlJTF9FUlIoIk5WTSBzaXplIGlzIG5vdCBtdWx0aXBsZSBvZiAxNi5cbiIpOworCQlyZXR1cm4gLUVOT0RBVEE7CisJfQorCisJcHRyID0gaWwtPmVlcHJvbTsKKwlpZiAoIXB0cikgeworCQlJTF9FUlIoIkludmFsaWQgRUVQUk9NIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIDQgY2hhcmFjdGVycyBmb3IgYnl0ZSAweFlZICovCisJYnVmID0ga3phbGxvYyhidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllZXByb21fdmVyID0gaWxfZWVwcm9tX3F1ZXJ5MTYoaWwsIEVFUFJPTV9WRVJTSU9OKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmX3NpemUgLSBwb3MsICJFRVBST00gIiAidmVyc2lvbjogMHgleFxuIiwKKwkJICAgICAgZWVwcm9tX3Zlcik7CisJZm9yIChvZnMgPSAwOyBvZnMgPCBlZXByb21fbGVuOyBvZnMgKz0gMTYpIHsKKwkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1Zl9zaXplIC0gcG9zLCAiMHglLjR4ICIsIG9mcyk7CisJCWhleF9kdW1wX3RvX2J1ZmZlcihwdHIgKyBvZnMsIDE2LCAxNiwgMiwgYnVmICsgcG9zLAorCQkJCSAgIGJ1Zl9zaXplIC0gcG9zLCAwKTsKKwkJcG9zICs9IHN0cmxlbihidWYgKyBwb3MpOworCQlpZiAoYnVmX3NpemUgLSBwb3MgPiAwKQorCQkJYnVmW3BvcysrXSA9ICdcbic7CisJfQorCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfY2hhbm5lbHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbHMgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnN1cHBfYmFuZCA9IE5VTEw7CisJaW50IHBvcyA9IDAsIGksIGJ1ZnN6ID0gUEFHRV9TSVpFOworCWNoYXIgKmJ1ZjsKKwlzc2l6ZV90IHJldDsKKworCWlmICghdGVzdF9iaXQoU19HRU9fQ09ORklHVVJFRCwgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzdXBwX2JhbmQgPSBpbF9nZXRfaHdfbW9kZShpbCwgSUVFRTgwMjExX0JBTkRfMkdIWik7CisJaWYgKHN1cHBfYmFuZCkgeworCQljaGFubmVscyA9IHN1cHBfYmFuZC0+Y2hhbm5lbHM7CisKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJEaXNwbGF5aW5nICVkIGNoYW5uZWxzIGluIDIuNEdIeiBiYW5kIDgwMi4xMWJnKTpcbiIsCisJCQkgICAgICBzdXBwX2JhbmQtPm5fY2hhbm5lbHMpOworCisJCWZvciAoaSA9IDA7IGkgPCBzdXBwX2JhbmQtPm5fY2hhbm5lbHM7IGkrKykKKwkJCXBvcyArPQorCQkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJCSAgICAgICIlZDogJWRkQm06IEJTUyVzJXMsICVzLlxuIiwKKwkJCQkgICAgICBjaGFubmVsc1tpXS5od192YWx1ZSwKKwkJCQkgICAgICBjaGFubmVsc1tpXS5tYXhfcG93ZXIsCisJCQkJICAgICAgY2hhbm5lbHNbaV0uCisJCQkJICAgICAgZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUiA/CisJCQkJICAgICAgIiAoSUVFRSA4MDIuMTFoIHJlcXVpcmVkKSIgOiAiIiwKKwkJCQkgICAgICAoKGNoYW5uZWxzW2ldLgorCQkJCQlmbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lCU1MpIHx8CisJCQkJICAgICAgIChjaGFubmVsc1tpXS4KKwkJCQkJZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUikpID8gIiIgOgorCQkJCSAgICAgICIsIElCU1MiLAorCQkJCSAgICAgIGNoYW5uZWxzW2ldLgorCQkJCSAgICAgIGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOID8KKwkJCQkgICAgICAicGFzc2l2ZSBvbmx5IiA6ICJhY3RpdmUvcGFzc2l2ZSIpOworCX0KKwlzdXBwX2JhbmQgPSBpbF9nZXRfaHdfbW9kZShpbCwgSUVFRTgwMjExX0JBTkRfNUdIWik7CisJaWYgKHN1cHBfYmFuZCkgeworCQljaGFubmVscyA9IHN1cHBfYmFuZC0+Y2hhbm5lbHM7CisKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJEaXNwbGF5aW5nICVkIGNoYW5uZWxzIGluIDUuMkdIeiBiYW5kICg4MDIuMTFhKVxuIiwKKwkJCSAgICAgIHN1cHBfYmFuZC0+bl9jaGFubmVscyk7CisKKwkJZm9yIChpID0gMDsgaSA8IHN1cHBfYmFuZC0+bl9jaGFubmVsczsgaSsrKQorCQkJcG9zICs9CisJCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkJICAgICAgIiVkOiAlZGRCbTogQlNTJXMlcywgJXMuXG4iLAorCQkJCSAgICAgIGNoYW5uZWxzW2ldLmh3X3ZhbHVlLAorCQkJCSAgICAgIGNoYW5uZWxzW2ldLm1heF9wb3dlciwKKwkJCQkgICAgICBjaGFubmVsc1tpXS4KKwkJCQkgICAgICBmbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSID8KKwkJCQkgICAgICAiIChJRUVFIDgwMi4xMWggcmVxdWlyZWQpIiA6ICIiLAorCQkJCSAgICAgICgoY2hhbm5lbHNbaV0uCisJCQkJCWZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSUJTUykgfHwKKwkJCQkgICAgICAgKGNoYW5uZWxzW2ldLgorCQkJCQlmbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSKSkgPyAiIiA6CisJCQkJICAgICAgIiwgSUJTUyIsCisJCQkJICAgICAgY2hhbm5lbHNbaV0uCisJCQkJICAgICAgZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gPworCQkJCSAgICAgICJwYXNzaXZlIG9ubHkiIDogImFjdGl2ZS9wYXNzaXZlIik7CisJfQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICAgICBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbNTEyXTsKKwlpbnQgcG9zID0gMDsKKwljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfSENNRF9BQ1RJVkU6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfSENNRF9BQ1RJVkUsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19JTlRfRU5BQkxFRDpcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1JGX0tJTExfSFc6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX0NUX0tJTEw6XHRcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19DVF9LSUxMLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfSU5JVDpcdFx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX0lOSVQsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19BTElWRTpcdFx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX0FMSVZFLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfUkVBRFk6XHRcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1RFTVBFUkFUVVJFOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX1RFTVBFUkFUVVJFLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfR0VPX0NPTkZJR1VSRUQ6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19FWElUX1BFTkRJTkc6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfU1RBVFM6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfU1RBVFMsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19TQ0FOTklORzpcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1NDQU5fQUJPUlRJTkc6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfU0NBTl9BQk9SVElORywgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1NDQU5fSFc6XHRcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfUE9XRVJfUE1JOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX1BPV0VSX1BNSSwgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX0ZXX0VSUk9SOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX0ZXX0VSUk9SLCAmaWwtPnN0YXR1cykpOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX2ludGVycnVwdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJCWxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwlpbnQgY250ID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0gMjQgKiA2NDsJLyogMjQgaXRlbXMgKiA2NCBjaGFyIHBlciBpdGVtICovCisJc3NpemVfdCByZXQ7CisKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiSW50ZXJydXB0IFN0YXRpc3RpY3MgUmVwb3J0OlxuIik7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJIVyBFcnJvcjpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGlsLT5pc3Jfc3RhdHMuaHcpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNXIEVycm9yOlx0XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy5zdyk7CisJaWYgKGlsLT5pc3Jfc3RhdHMuc3cgfHwgaWwtPmlzcl9zdGF0cy5odykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICAgICAgIlx0TGFzdCBSZXN0YXJ0aW5nIENvZGU6ICAweCVYXG4iLAorCQkJICAgICAgaWwtPmlzcl9zdGF0cy5lcnJfY29kZSk7CisJfQorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkZyYW1lIHRyYW5zbWl0dGVkOlx0XHQgJXVcbiIsCisJCSAgICAgIGlsLT5pc3Jfc3RhdHMuc2NoKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJBbGl2ZSBpbnRlcnJ1cHQ6XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy5hbGl2ZSk7CisjZW5kaWYKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICJIVyBSRiBLSUxMIHN3aXRjaCB0b2dnbGVkOlx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLnJma2lsbCk7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJDVCBLSUxMOlx0XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy5jdGtpbGwpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiV2FrZXVwIEludGVycnVwdDpcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLndha2V1cCk7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJSeCBjb21tYW5kIHJlc3BvbnNlczpcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLnJ4KTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IElMX0NOX01BWDsgY250KyspIHsKKwkJaWYgKGlsLT5pc3Jfc3RhdHMuaGFuZGxlcnNbY250XSA+IDApCisJCQlwb3MgKz0KKwkJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkgICAgICAiXHRSeCBoYW5kbGVyWyUzNnNdOlx0XHQgJXVcbiIsCisJCQkJICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY250KSwKKwkJCQkgICAgICBpbC0+aXNyX3N0YXRzLmhhbmRsZXJzW2NudF0pOworCX0KKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlR4L0ZIIGludGVycnVwdDpcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLnR4KTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlVuZXhwZWN0ZWQgSU5UQTpcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLnVuaGFuZGxlZCk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19pbnRlcnJ1cHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbOF07CisJaW50IGJ1Zl9zaXplOworCXUzMiByZXNldF9mbGFnOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzc2NhbmYoYnVmLCAiJXgiLCAmcmVzZXRfZmxhZykgIT0gMSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHJlc2V0X2ZsYWcgPT0gMCkKKwkJaWxfY2xlYXJfaXNyX3N0YXRzKGlsKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3Fvc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCWludCBwb3MgPSAwLCBpOworCWNoYXIgYnVmWzI1Nl07CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjb250ZXh0ICVkOlxuIiwgY3R4LT5jdHhpZCk7CisJZm9yIChpID0gMDsgaSA8IEFDX05VTTsgaSsrKSB7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAiXHRjd19taW5cdGN3X21heFx0YWlmc25cdHR4b3BcbiIpOworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICAgICAgIkFDWyVkXVx0JXVcdCV1XHQldVx0JXVcbiIsIGksCisJCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5jd19taW4sCisJCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5jd19tYXgsCisJCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5haWZzbiwKKwkJCSAgICAgIGN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW2ldLmVkY2FfdHhvcCk7CisJfQorCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfZGlzYWJsZV9odDQwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwlpbnQgaHQ0MDsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmh0NDApICE9IDEpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghaWxfaXNfYW55X2Fzc29jaWF0ZWQoaWwpKQorCQlpbC0+ZGlzYWJsZV9odDQwID0gaHQ0MCA/IHRydWUgOiBmYWxzZTsKKwllbHNlIHsKKwkJSUxfRVJSKCJTdGEgYXNzb2NpYXRlZCB3aXRoIEFQIC0gIgorCQkgICAgICAgIkNoYW5nZSB0byA0ME1IeiBjaGFubmVsIHN1cHBvcnQgaXMgbm90IGFsbG93ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19kaXNhYmxlX2h0NDBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzEwMF07CisJaW50IHBvcyA9IDA7CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIxMW4gNDBNSHogTW9kZTogJXNcbiIsCisJCSAgICAgIGlsLT5kaXNhYmxlX2h0NDAgPyAiRGlzYWJsZWQiIDogIkVuYWJsZWQiKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Cit9CisKK0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhzcmFtKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhudm0pOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHN0YXRpb25zKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhjaGFubmVscyk7CitERUJVR0ZTX1JFQURfRklMRV9PUFMoc3RhdHVzKTsKK0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhpbnRlcnJ1cHQpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHFvcyk7CitERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoZGlzYWJsZV9odDQwKTsKKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3RyYWZmaWNfbG9nX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwLCBvZnMgPSAwOworCWludCBjbnQgPSAwLCBlbnRyeTsKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnE7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0KKwkgICAgKChJTF9UUkFGRklDX0VOVFJJRVMgKiBJTF9UUkFGRklDX0VOVFJZX1NJWkUgKiA2NCkgKiAyKSArCisJICAgIChpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqIDMyICogOCkgKyA0MDA7CisJY29uc3QgdTggKnB0cjsKKwlzc2l6ZV90IHJldDsKKworCWlmICghaWwtPnR4cSkgeworCQlJTF9FUlIoInR4cSBub3QgcmVhZHlcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIGJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJUeCBRdWV1ZVxuIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBjbnQrKykgeworCQl0eHEgPSAmaWwtPnR4cVtjbnRdOworCQlxID0gJnR4cS0+cTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJxWyVkXTogcmVhZF9wdHI6ICV1LCB3cml0ZV9wdHI6ICV1XG4iLCBjbnQsCisJCQkgICAgICBxLT5yZWFkX3B0ciwgcS0+d3JpdGVfcHRyKTsKKwl9CisJaWYgKGlsLT50eF90cmFmZmljICYmIChpbF9kZWJ1Z19sZXZlbCAmIElMX0RMX1RYKSkgeworCQlwdHIgPSBpbC0+dHhfdHJhZmZpYzsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlR4IFRyYWZmaWMgaWR4OiAldVxuIiwKKwkJCSAgICAgIGlsLT50eF90cmFmZmljX2lkeCk7CisJCWZvciAoY250ID0gMCwgb2ZzID0gMDsgY250IDwgSUxfVFJBRkZJQ19FTlRSSUVTOyBjbnQrKykgeworCQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgSUxfVFJBRkZJQ19FTlRSWV9TSVpFIC8gMTY7CisJCQkgICAgIGVudHJ5KyssIG9mcyArPSAxNikgeworCQkJCXBvcyArPQorCQkJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIjB4JS40eCAiLAorCQkJCQkgICAgICBvZnMpOworCQkJCWhleF9kdW1wX3RvX2J1ZmZlcihwdHIgKyBvZnMsIDE2LCAxNiwgMiwKKwkJCQkJCSAgIGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIDApOworCQkJCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKKwkJCQlpZiAoYnVmc3ogLSBwb3MgPiAwKQorCQkJCQlidWZbcG9zKytdID0gJ1xuJzsKKwkJCX0KKwkJfQorCX0KKworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlJ4IFF1ZXVlXG4iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJyZWFkOiAldSwgd3JpdGU6ICV1XG4iLAorCQkgICAgICByeHEtPnJlYWQsIHJ4cS0+d3JpdGUpOworCisJaWYgKGlsLT5yeF90cmFmZmljICYmIChpbF9kZWJ1Z19sZXZlbCAmIElMX0RMX1JYKSkgeworCQlwdHIgPSBpbC0+cnhfdHJhZmZpYzsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlJ4IFRyYWZmaWMgaWR4OiAldVxuIiwKKwkJCSAgICAgIGlsLT5yeF90cmFmZmljX2lkeCk7CisJCWZvciAoY250ID0gMCwgb2ZzID0gMDsgY250IDwgSUxfVFJBRkZJQ19FTlRSSUVTOyBjbnQrKykgeworCQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgSUxfVFJBRkZJQ19FTlRSWV9TSVpFIC8gMTY7CisJCQkgICAgIGVudHJ5KyssIG9mcyArPSAxNikgeworCQkJCXBvcyArPQorCQkJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIjB4JS40eCAiLAorCQkJCQkgICAgICBvZnMpOworCQkJCWhleF9kdW1wX3RvX2J1ZmZlcihwdHIgKyBvZnMsIDE2LCAxNiwgMiwKKwkJCQkJCSAgIGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIDApOworCQkJCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKKwkJCQlpZiAoYnVmc3ogLSBwb3MgPiAwKQorCQkJCQlidWZbcG9zKytdID0gJ1xuJzsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3RyYWZmaWNfbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbOF07CisJaW50IGJ1Zl9zaXplOworCWludCB0cmFmZmljX2xvZzsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnRyYWZmaWNfbG9nKSAhPSAxKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodHJhZmZpY19sb2cgPT0gMCkKKwkJaWxfcmVzZXRfdHJhZmZpY19sb2coaWwpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfdHhfcXVldWVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHE7CisJc3RydWN0IGlsX3F1ZXVlICpxOworCWNoYXIgKmJ1ZjsKKwlpbnQgcG9zID0gMDsKKwlpbnQgY250OworCWludCByZXQ7CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0KKwkgICAgc2l6ZW9mKGNoYXIpICogNjQgKiBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKworCWlmICghaWwtPnR4cSkgeworCQlJTF9FUlIoInR4cSBub3QgcmVhZHlcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBjbnQrKykgeworCQl0eHEgPSAmaWwtPnR4cVtjbnRdOworCQlxID0gJnR4cS0+cTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJod3EgJS4yZDogcmVhZD0ldSB3cml0ZT0ldSBzdG9wPSVkIgorCQkJICAgICAgIiBzd3FfaWQ9JSMuMnggKGFjICVkL2h3cSAlZClcbiIsIGNudCwKKwkJCSAgICAgIHEtPnJlYWRfcHRyLCBxLT53cml0ZV9wdHIsCisJCQkgICAgICAhIXRlc3RfYml0KGNudCwgaWwtPnF1ZXVlX3N0b3BwZWQpLAorCQkJICAgICAgdHhxLT5zd3FfaWQsIHR4cS0+c3dxX2lkICYgMywKKwkJCSAgICAgICh0eHEtPnN3cV9pZCA+PiAyKSAmIDB4MWYpOworCQlpZiAoY250ID49IDQpCisJCQljb250aW51ZTsKKwkJLyogZm9yIHRoZSBBQ3MsIGRpc3BsYXkgdGhlIHN0b3AgY291bnQgdG9vICovCisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAiICAgICAgICBzdG9wLWNvdW50OiAlZFxuIiwKKwkJCSAgICAgIGF0b21pY19yZWFkKCZpbC0+cXVldWVfc3RvcF9jb3VudFtjbnRdKSk7CisJfQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3J4X3F1ZXVlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJY2hhciBidWZbMjU2XTsKKwlpbnQgcG9zID0gMDsKKwljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKKworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgInJlYWQ6ICV1XG4iLCByeHEtPnJlYWQpOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIndyaXRlOiAldVxuIiwgcnhxLT53cml0ZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiZnJlZV9jb3VudDogJXVcbiIsCisJCSAgICAgIHJ4cS0+ZnJlZV9jb3VudCk7CisJaWYgKHJ4cS0+cmJfc3R0cykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2xvc2VkX3JiX251bTogJXVcbiIsCisJCQkgICAgICBsZTE2X3RvX2NwdShyeHEtPnJiX3N0dHMtPgorCQkJCQkgIGNsb3NlZF9yYl9udW0pICYgMHgwRkZGKTsKKwl9IGVsc2UgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICAgICAgImNsb3NlZF9yYl9udW06IE5vdCBBbGxvY2F0ZWRcbiIpOworCX0KKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc191Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gaWwtPmNmZy0+b3BzLT5saWItPmRlYnVnZnNfb3BzLnJ4X3N0YXRzX3JlYWQoZmlsZSwgdXNlcl9idWYsCisJCQkJCQkJICAgIGNvdW50LCBwcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3Vjb2RlX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBpbC0+Y2ZnLT5vcHMtPmxpYi0+ZGVidWdmc19vcHMudHhfc3RhdHNfcmVhZChmaWxlLCB1c2VyX2J1ZiwKKwkJCQkJCQkgICAgY291bnQsIHBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIGlsLT5jZmctPm9wcy0+bGliLT5kZWJ1Z2ZzX29wcy5nZW5lcmFsX3N0YXRzX3JlYWQoZmlsZSwgdXNlcl9idWYsCisJCQkJCQkJCSBjb3VudCwgcHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19zZW5zaXRpdml0eV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWludCBjbnQgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEpICogNCArIDEwMDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YTsKKworCWRhdGEgPSAmaWwtPnNlbnNpdGl2aXR5X2RhdGE7CisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+YXV0b19jb3JyX29mZG0pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtX21yYzpcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtX3gxOlx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmF1dG9fY29ycl9vZmRtX3gxKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJhdXRvX2NvcnJfb2ZkbV9tcmNfeDE6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJhdXRvX2NvcnJfY2NrOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+YXV0b19jb3JyX2Njayk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYXV0b19jb3JyX2Nja19tcmM6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+YXV0b19jb3JyX2Nja19tcmMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgImxhc3RfYmFkX3BsY3BfY250X29mZG06XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibGFzdF9mYV9jbnRfb2ZkbTpcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5sYXN0X2ZhX2NudF9vZmRtKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJsYXN0X2JhZF9wbGNwX2NudF9jY2s6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJsYXN0X2ZhX2NudF9jY2s6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bGFzdF9mYV9jbnRfY2NrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfY3Vycl9zdGF0ZTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ19jdXJyX3N0YXRlKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfcHJldl9zdGF0ZTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ19wcmV2X3N0YXRlKTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfdmFsdWU6XHRcdFx0Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCAxMDsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiAldSIsCisJCQkgICAgICBkYXRhLT5ucmdfdmFsdWVbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfcnNzaTpcdFx0Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBOUkdfTlVNX1BSRVZfU1RBVF9MOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiICV1IiwKKwkJCSAgICAgIGRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfcmVmOlx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ19zaWxlbmNlX3JlZik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX2VuZXJneV9pZHg6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfZW5lcmd5X2lkeCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfaWR4Olx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ19zaWxlbmNlX2lkeCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3RoX2NjazpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ190aF9jY2spOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmOlx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnVtX2luX2Nja19ub19mYTpcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5udW1faW5fY2NrX25vX2ZhKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfdGhfb2ZkbTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ190aF9vZmRtKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX2NoYWluX25vaXNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDA7CisJaW50IGNudCA9IDA7CisJY2hhciAqYnVmOworCWludCBidWZzeiA9IHNpemVvZihzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSkgKiA0ICsgMTAwOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhOworCisJZGF0YSA9ICZpbC0+Y2hhaW5fbm9pc2VfZGF0YTsKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYWN0aXZlX2NoYWluczpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmFjdGl2ZV9jaGFpbnMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX25vaXNlX2E6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5jaGFpbl9ub2lzZV9hKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9ub2lzZV9iOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+Y2hhaW5fbm9pc2VfYik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2hhaW5fbm9pc2VfYzpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmNoYWluX25vaXNlX2MpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX3NpZ25hbF9hOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+Y2hhaW5fc2lnbmFsX2EpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX3NpZ25hbF9iOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+Y2hhaW5fc2lnbmFsX2IpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX3NpZ25hbF9jOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+Y2hhaW5fc2lnbmFsX2MpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImJlYWNvbl9jb3VudDpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmJlYWNvbl9jb3VudCk7CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJkaXNjb25uX2FycmF5Olx0XHRcdCIpOworCWZvciAoY250ID0gMDsgY250IDwgTlVNX1JYX0NIQUlOUzsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiAldSIsCisJCQkgICAgICBkYXRhLT5kaXNjb25uX2FycmF5W2NudF0pOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImRlbHRhX2dhaW5fY29kZTpcdFx0Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fUlhfQ0hBSU5TOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiICV1IiwKKwkJCSAgICAgIGRhdGEtPmRlbHRhX2dhaW5fY29kZVtjbnRdKTsKKwl9CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJyYWRpb193cml0ZTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPnJhZGlvX3dyaXRlKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJzdGF0ZTpcdFx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+c3RhdGUpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfcG93ZXJfc2F2ZV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1Zls2MF07CisJaW50IHBvcyA9IDA7CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisJdTMyIHB3cnNhdmVfc3RhdHVzOworCisJcHdyc2F2ZV9zdGF0dXMgPQorCSAgICBfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfUkVHX1BPV0VSX1NBVkVfU1RBVFVTX01TSzsKKworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlBvd2VyIFNhdmUgU3RhdHVzOiAiKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlc1xuIiwKKwkJICAgICAgKHB3cnNhdmVfc3RhdHVzID09IENTUl9HUF9SRUdfTk9fUE9XRVJfU0FWRSkgPyAibm9uZSIgOgorCQkgICAgICAocHdyc2F2ZV9zdGF0dXMgPT0gQ1NSX0dQX1JFR19NQUNfUE9XRVJfU0FWRSkgPyAiTUFDIiA6CisJCSAgICAgIChwd3JzYXZlX3N0YXR1cyA9PSBDU1JfR1BfUkVHX1BIWV9QT1dFUl9TQVZFKSA/ICJQSFkiIDoKKwkJICAgICAgImVycm9yIik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19jbGVhcl91Y29kZV9zdGF0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbOF07CisJaW50IGJ1Zl9zaXplOworCWludCBjbGVhcjsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmNsZWFyKSAhPSAxKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIG1ha2UgcmVxdWVzdCB0byB1Q29kZSB0byByZXRyaWV2ZSBzdGF0cyBpbmZvcm1hdGlvbiAqLworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWxfc2VuZF9zdGF0c19yZXF1ZXN0KGlsLCBDTURfU1lOQywgdHJ1ZSk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfcnhvbl9mbGFnc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IGxlbiA9IDA7CisJY2hhciBidWZbMjBdOworCisJbGVuID0gc3ByaW50ZihidWYsICIweCUwNFhcbiIsIGxlMzJfdG9fY3B1KGlsLT5jdHguYWN0aXZlLmZsYWdzKSk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfcnhvbl9maWx0ZXJfZmxhZ3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBsZW4gPSAwOworCWNoYXIgYnVmWzIwXTsKKworCWxlbiA9CisJICAgIHNwcmludGYoYnVmLCAiMHglMDRYXG4iLCBsZTMyX3RvX2NwdShpbC0+Y3R4LmFjdGl2ZS5maWx0ZXJfZmxhZ3MpKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19maF9yZWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpidWY7CisJaW50IHBvcyA9IDA7CisJc3NpemVfdCByZXQgPSAtRUZBVUxUOworCisJaWYgKGlsLT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKSB7CisJCXJldCA9IHBvcyA9IGlsLT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKGlsLCAmYnVmLCB0cnVlKTsKKwkJaWYgKGJ1ZikgeworCQkJcmV0ID0KKwkJCSAgICBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwKKwkJCQkJCSAgICBwb3MpOworCQkJa2ZyZWUoYnVmKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19taXNzZWRfYmVhY29uX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyIGJ1ZlsxMl07CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlZFxuIiwKKwkJICAgICAgaWwtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX21pc3NlZF9iZWFjb25fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwlpbnQgbWlzc2VkOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmbWlzc2VkKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtaXNzZWQgPCBJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9NSU4gfHwKKwkgICAgbWlzc2VkID4gSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUFYKQorCQlpbC0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUY7CisJZWxzZQorCQlpbC0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBtaXNzZWQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19mb3JjZV9yZXNldF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWNoYXIgYnVmWzMwMF07CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisJc3RydWN0IGlsX2ZvcmNlX3Jlc2V0ICpmb3JjZV9yZXNldDsKKworCWZvcmNlX3Jlc2V0ID0gJmlsLT5mb3JjZV9yZXNldDsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0bnVtYmVyIG9mIHJlc2V0IHJlcXVlc3Q6ICVkXG4iLAorCQkgICAgICBmb3JjZV9yZXNldC0+cmVzZXRfcmVxdWVzdF9jb3VudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiXHRudW1iZXIgb2YgcmVzZXQgcmVxdWVzdCBzdWNjZXNzOiAlZFxuIiwKKwkJICAgICAgZm9yY2VfcmVzZXQtPnJlc2V0X3N1Y2Nlc3NfY291bnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIlx0bnVtYmVyIG9mIHJlc2V0IHJlcXVlc3QgcmVqZWN0OiAlZFxuIiwKKwkJICAgICAgZm9yY2VfcmVzZXQtPnJlc2V0X3JlamVjdF9jb3VudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRyZXNldCBkdXJhdGlvbjogJWx1XG4iLAorCQkgICAgICBmb3JjZV9yZXNldC0+cmVzZXRfZHVyYXRpb24pOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfZm9yY2VfcmVzZXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJaW50IHJldDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXQgPSBpbF9mb3JjZV9yZXNldChpbCwgdHJ1ZSk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc193ZF90aW1lb3V0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwlpbnQgdGltZW91dDsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnRpbWVvdXQpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0aW1lb3V0IDwgMCB8fCB0aW1lb3V0ID4gSUxfTUFYX1dEX1RJTUVPVVQpCisJCXRpbWVvdXQgPSBJTF9ERUZfV0RfVElNRU9VVDsKKworCWlsLT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0ID0gdGltZW91dDsKKwlpbF9zZXR1cF93YXRjaGRvZyhpbCk7CisJcmV0dXJuIGNvdW50OworfQorCitERUJVR0ZTX1JFQURfRklMRV9PUFMocnhfc3RhdHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHR4X3N0YXRzKTsKK0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyh0cmFmZmljX2xvZyk7CitERUJVR0ZTX1JFQURfRklMRV9PUFMocnhfcXVldWUpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHR4X3F1ZXVlKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyh1Y29kZV9yeF9zdGF0cyk7CitERUJVR0ZTX1JFQURfRklMRV9PUFModWNvZGVfdHhfc3RhdHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHVjb2RlX2dlbmVyYWxfc3RhdHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHNlbnNpdGl2aXR5KTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhjaGFpbl9ub2lzZSk7CitERUJVR0ZTX1JFQURfRklMRV9PUFMocG93ZXJfc2F2ZV9zdGF0dXMpOworREVCVUdGU19XUklURV9GSUxFX09QUyhjbGVhcl91Y29kZV9zdGF0cyk7CitERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKGNsZWFyX3RyYWZmaWNfc3RhdHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKGZoX3JlZyk7CitERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMobWlzc2VkX2JlYWNvbik7CitERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoZm9yY2VfcmVzZXQpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4b25fZmxhZ3MpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4b25fZmlsdGVyX2ZsYWdzKTsKK0RFQlVHRlNfV1JJVEVfRklMRV9PUFMod2RfdGltZW91dCk7CisKKy8qCisgKiBDcmVhdGUgdGhlIGRlYnVnZnMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisgKgorICovCitpbnQKK2lsX2RiZ2ZzX3JlZ2lzdGVyKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwaHlkID0gaWwtPmh3LT53aXBoeS0+ZGVidWdmc2RpcjsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXJfZHJ2LCAqZGlyX2RhdGEsICpkaXJfcmYsICpkaXJfZGVidWc7CisKKwlkaXJfZHJ2ID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHBoeWQpOworCWlmICghZGlyX2RydikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbC0+ZGVidWdmc19kaXIgPSBkaXJfZHJ2OworCisJZGlyX2RhdGEgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRhdGEiLCBkaXJfZHJ2KTsKKwlpZiAoIWRpcl9kYXRhKQorCQlnb3RvIGVycjsKKwlkaXJfcmYgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInJmIiwgZGlyX2Rydik7CisJaWYgKCFkaXJfcmYpCisJCWdvdG8gZXJyOworCWRpcl9kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZGVidWciLCBkaXJfZHJ2KTsKKwlpZiAoIWRpcl9kZWJ1ZykKKwkJZ290byBlcnI7CisKKwlERUJVR0ZTX0FERF9GSUxFKG52bSwgZGlyX2RhdGEsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoc3JhbSwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHN0YXRpb25zLCBkaXJfZGF0YSwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShjaGFubmVscywgZGlyX2RhdGEsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoc3RhdHVzLCBkaXJfZGF0YSwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShpbnRlcnJ1cHQsIGRpcl9kYXRhLCBTX0lXVVNSIHwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShxb3MsIGRpcl9kYXRhLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKGRpc2FibGVfaHQ0MCwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHJ4X3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUodHhfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRSh0cmFmZmljX2xvZywgZGlyX2RlYnVnLCBTX0lXVVNSIHwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShyeF9xdWV1ZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHR4X3F1ZXVlLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUocG93ZXJfc2F2ZV9zdGF0dXMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShjbGVhcl91Y29kZV9zdGF0cywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKGNsZWFyX3RyYWZmaWNfc3RhdHMsIGRpcl9kZWJ1ZywgU19JV1VTUik7CisJREVCVUdGU19BRERfRklMRShmaF9yZWcsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShtaXNzZWRfYmVhY29uLCBkaXJfZGVidWcsIFNfSVdVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoZm9yY2VfcmVzZXQsIGRpcl9kZWJ1ZywgU19JV1VTUiB8IFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUodWNvZGVfcnhfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRSh1Y29kZV90eF9zdGF0cywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHVjb2RlX2dlbmVyYWxfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisKKwlpZiAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcikKKwkJREVCVUdGU19BRERfRklMRShzZW5zaXRpdml0eSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlpZiAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcikKKwkJREVCVUdGU19BRERfRklMRShjaGFpbl9ub2lzZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHJ4b25fZmxhZ3MsIGRpcl9kZWJ1ZywgU19JV1VTUik7CisJREVCVUdGU19BRERfRklMRShyeG9uX2ZpbHRlcl9mbGFncywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHdkX3RpbWVvdXQsIGRpcl9kZWJ1ZywgU19JV1VTUik7CisJaWYgKGlsLT5jZmctPmJhc2VfcGFyYW1zLT5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIpCisJCURFQlVHRlNfQUREX0JPT0woZGlzYWJsZV9zZW5zaXRpdml0eSwgZGlyX3JmLAorCQkJCSAmaWwtPmRpc2FibGVfc2Vuc19jYWwpOworCWlmIChpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfY2FsaWJfYnlfZHJpdmVyKQorCQlERUJVR0ZTX0FERF9CT09MKGRpc2FibGVfY2hhaW5fbm9pc2UsIGRpcl9yZiwKKwkJCQkgJmlsLT5kaXNhYmxlX2NoYWluX25vaXNlX2NhbCk7CisJREVCVUdGU19BRERfQk9PTChkaXNhYmxlX3R4X3Bvd2VyLCBkaXJfcmYsICZpbC0+ZGlzYWJsZV90eF9wb3dlcl9jYWwpOworCXJldHVybiAwOworCitlcnI6CisJSUxfRVJSKCJDYW4ndCBjcmVhdGUgdGhlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKKwlpbF9kYmdmc191bnJlZ2lzdGVyKGlsKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KK0VYUE9SVF9TWU1CT0woaWxfZGJnZnNfcmVnaXN0ZXIpOworCisvKioKKyAqIFJlbW92ZSB0aGUgZGVidWdmcyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyAqCisgKi8KK3ZvaWQKK2lsX2RiZ2ZzX3VucmVnaXN0ZXIoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlmICghaWwtPmRlYnVnZnNfZGlyKQorCQlyZXR1cm47CisKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaWwtPmRlYnVnZnNfZGlyKTsKKwlpbC0+ZGVidWdmc19kaXIgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChpbF9kYmdmc191bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWRlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWRlYnVnZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhYmIzOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1kZWJ1Z2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIml3bC0zOTQ1LWRlYnVnZnMuaCIKLQotCi1zdGF0aWMgaW50IGl3bDM5NDVfc3RhdGlzdGljc19mbGFnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY2hhciAqYnVmLCBpbnQgYnVmc3opCi17Ci0JaW50IHAgPSAwOwotCi0JcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiU3RhdGlzdGljcyBGbGFnKDB4JVgpOlxuIiwKLQkJICAgICAgIGxlMzJfdG9fY3B1KHByaXYtPl8zOTQ1LnN0YXRpc3RpY3MuZmxhZykpOwotCWlmIChsZTMyX3RvX2NwdShwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmZsYWcpICYKLQkJCVVDT0RFX1NUQVRJU1RJQ1NfQ0xFQVJfTVNLKQotCQlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsCi0JCQkgICAgICAgIlx0U3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7Ci0JcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiXHRPcGVyYXRpb25hbCBGcmVxdWVuY3k6ICVzXG4iLAotCQkgICAgICAgKGxlMzJfdG9fY3B1KHByaXYtPl8zOTQ1LnN0YXRpc3RpY3MuZmxhZykgJgotCQkJVUNPREVfU1RBVElTVElDU19GUkVRVUVOQ1lfTVNLKQotCQkJPyAiMi40IEdIeiIgOiAiNS4yIEdIeiIpOwotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKLQkJICAgICAgIChsZTMyX3RvX2NwdShwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmZsYWcpICYKLQkJCVVDT0RFX1NUQVRJU1RJQ1NfTkFSUk9XX0JBTkRfTVNLKQotCQkJPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQlyZXR1cm4gcDsKLX0KLQotc3NpemVfdCBpd2wzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfcnhfcGh5KSAqIDQwICsKLQkJICAgIHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9ub25fcGh5KSAqIDQwICsgNDAwOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X3BoeSAqb2ZkbSwgKmFjY3VtX29mZG0sICpkZWx0YV9vZmRtLAotCQkJCQkqbWF4X29mZG07Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfcnhfcGh5ICpjY2ssICphY2N1bV9jY2ssICpkZWx0YV9jY2ssICptYXhfY2NrOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X25vbl9waHkgKmdlbmVyYWwsICphY2N1bV9nZW5lcmFsOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X25vbl9waHkgKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbGl2ZShwcml2KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qCi0JICogVGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgKiB0aGUgbGFzdCBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCi0JICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKLQkgKi8KLQlvZmRtID0gJnByaXYtPl8zOTQ1LnN0YXRpc3RpY3Mucngub2ZkbTsKLQljY2sgPSAmcHJpdi0+XzM5NDUuc3RhdGlzdGljcy5yeC5jY2s7Ci0JZ2VuZXJhbCA9ICZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLnJ4LmdlbmVyYWw7Ci0JYWNjdW1fb2ZkbSA9ICZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLnJ4Lm9mZG07Ci0JYWNjdW1fY2NrID0gJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MucnguY2NrOwotCWFjY3VtX2dlbmVyYWwgPSAmcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5yeC5nZW5lcmFsOwotCWRlbHRhX29mZG0gPSAmcHJpdi0+XzM5NDUuZGVsdGFfc3RhdGlzdGljcy5yeC5vZmRtOwotCWRlbHRhX2NjayA9ICZwcml2LT5fMzk0NS5kZWx0YV9zdGF0aXN0aWNzLnJ4LmNjazsKLQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3MucnguZ2VuZXJhbDsKLQltYXhfb2ZkbSA9ICZwcml2LT5fMzk0NS5tYXhfZGVsdGEucngub2ZkbTsKLQltYXhfY2NrID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS5yeC5jY2s7Ci0JbWF4X2dlbmVyYWwgPSAmcHJpdi0+XzM5NDUubWF4X2RlbHRhLnJ4LmdlbmVyYWw7Ci0KLQlwb3MgKz0gaXdsMzk0NV9zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJS0zMnMgICAgIGN1cnJlbnQiCi0JCQkgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAotCQkJICJTdGF0aXN0aWNzX1J4IC0gT0ZETToiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiaW5hX2NudDoiLCBsZTMyX3RvX2NwdShvZmRtLT5pbmFfY250KSwKLQkJCSBhY2N1bV9vZmRtLT5pbmFfY250LAotCQkJIGRlbHRhX29mZG0tPmluYV9jbnQsIG1heF9vZmRtLT5pbmFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiZmluYV9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5maW5hX2NudCksIGFjY3VtX29mZG0tPmZpbmFfY250LAotCQkJIGRlbHRhX29mZG0tPmZpbmFfY250LCBtYXhfb2ZkbS0+ZmluYV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2VyciksIGFjY3VtX29mZG0tPnBsY3BfZXJyLAotCQkJIGRlbHRhX29mZG0tPnBsY3BfZXJyLCBtYXhfb2ZkbS0+cGxjcF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAgImNyYzMyX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmNyYzMyX2VyciksIGFjY3VtX29mZG0tPmNyYzMyX2VyciwKLQkJCSBkZWx0YV9vZmRtLT5jcmMzMl9lcnIsIG1heF9vZmRtLT5jcmMzMl9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5vdmVycnVuX2VyciksCi0JCQkgYWNjdW1fb2ZkbS0+b3ZlcnJ1bl9lcnIsIGRlbHRhX29mZG0tPm92ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImVhcmx5X292ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIGRlbHRhX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5lYXJseV9vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImNyYzMyX2dvb2Q6IiwgbGUzMl90b19jcHUob2ZkbS0+Y3JjMzJfZ29vZCksCi0JCQkgYWNjdW1fb2ZkbS0+Y3JjMzJfZ29vZCwgZGVsdGFfb2ZkbS0+Y3JjMzJfZ29vZCwKLQkJCSBtYXhfb2ZkbS0+Y3JjMzJfZ29vZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJmYWxzZV9hbGFybV9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpLAotCQkJIGFjY3VtX29mZG0tPmZhbHNlX2FsYXJtX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsCi0JCQkgbWF4X29mZG0tPmZhbHNlX2FsYXJtX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZpbmFfc3luY19lcnJfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpLAotCQkJIGFjY3VtX29mZG0tPmZpbmFfc3luY19lcnJfY250LAotCQkJIGRlbHRhX29mZG0tPmZpbmFfc3luY19lcnJfY250LAotCQkJIG1heF9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInNmZF90aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+c2ZkX3RpbWVvdXQpLAotCQkJIGFjY3VtX29mZG0tPnNmZF90aW1lb3V0LAotCQkJIGRlbHRhX29mZG0tPnNmZF90aW1lb3V0LAotCQkJIG1heF9vZmRtLT5zZmRfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZpbmFfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfdGltZW91dCksCi0JCQkgYWNjdW1fb2ZkbS0+ZmluYV90aW1lb3V0LAotCQkJIGRlbHRhX29mZG0tPmZpbmFfdGltZW91dCwKLQkJCSBtYXhfb2ZkbS0+ZmluYV90aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAidW5yZXNwb25kZWRfcnRzOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9vZmRtLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgZGVsdGFfb2ZkbS0+dW5yZXNwb25kZWRfcnRzLAotCQkJIG1heF9vZmRtLT51bnJlc3BvbmRlZF9ydHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJyeGVfZnJhbWVfbG10X292cnVuOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAotCQkJIGFjY3VtX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIGRlbHRhX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIG1heF9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInNlbnRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYWNrX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9hY2tfY250LAotCQkJIGRlbHRhX29mZG0tPnNlbnRfYWNrX2NudCwKLQkJCSBtYXhfb2ZkbS0+c2VudF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAic2VudF9jdHNfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+c2VudF9jdHNfY250KSwKLQkJCSBhY2N1bV9vZmRtLT5zZW50X2N0c19jbnQsCi0JCQkgZGVsdGFfb2ZkbS0+c2VudF9jdHNfY250LCBtYXhfb2ZkbS0+c2VudF9jdHNfY250KTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiUtMzJzICAgICBjdXJyZW50IgotCQkJICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKLQkJCSAiU3RhdGlzdGljc19SeCAtIENDSzoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiaW5hX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+aW5hX2NudCksIGFjY3VtX2Njay0+aW5hX2NudCwKLQkJCSBkZWx0YV9jY2stPmluYV9jbnQsIG1heF9jY2stPmluYV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmaW5hX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZmluYV9jbnQpLCBhY2N1bV9jY2stPmZpbmFfY250LAotCQkJIGRlbHRhX2Njay0+ZmluYV9jbnQsIG1heF9jY2stPmZpbmFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPnBsY3BfZXJyKSwgYWNjdW1fY2NrLT5wbGNwX2VyciwKLQkJCSBkZWx0YV9jY2stPnBsY3BfZXJyLCBtYXhfY2NrLT5wbGNwX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImNyYzMyX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+Y3JjMzJfZXJyKSwgYWNjdW1fY2NrLT5jcmMzMl9lcnIsCi0JCQkgZGVsdGFfY2NrLT5jcmMzMl9lcnIsIG1heF9jY2stPmNyYzMyX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgIm92ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5vdmVycnVuX2VyciksCi0JCQkgYWNjdW1fY2NrLT5vdmVycnVuX2VyciwKLQkJCSBkZWx0YV9jY2stPm92ZXJydW5fZXJyLCBtYXhfY2NrLT5vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImVhcmx5X292ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5lYXJseV9vdmVycnVuX2VyciksCi0JCQkgYWNjdW1fY2NrLT5lYXJseV9vdmVycnVuX2VyciwKLQkJCSBkZWx0YV9jY2stPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIG1heF9jY2stPmVhcmx5X292ZXJydW5fZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiY3JjMzJfZ29vZDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+Y3JjMzJfZ29vZCksIGFjY3VtX2Njay0+Y3JjMzJfZ29vZCwKLQkJCSBkZWx0YV9jY2stPmNyYzMyX2dvb2QsCi0JCQkgbWF4X2Njay0+Y3JjMzJfZ29vZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZhbHNlX2FsYXJtX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZmFsc2VfYWxhcm1fY250KSwKLQkJCSBhY2N1bV9jY2stPmZhbHNlX2FsYXJtX2NudCwKLQkJCSBkZWx0YV9jY2stPmZhbHNlX2FsYXJtX2NudCwgbWF4X2Njay0+ZmFsc2VfYWxhcm1fY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiZmluYV9zeW5jX2Vycl9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfc3luY19lcnJfY250KSwKLQkJCSBhY2N1bV9jY2stPmZpbmFfc3luY19lcnJfY250LAotCQkJIGRlbHRhX2Njay0+ZmluYV9zeW5jX2Vycl9jbnQsCi0JCQkgbWF4X2Njay0+ZmluYV9zeW5jX2Vycl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJzZmRfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2ZkX3RpbWVvdXQpLAotCQkJIGFjY3VtX2Njay0+c2ZkX3RpbWVvdXQsCi0JCQkgZGVsdGFfY2NrLT5zZmRfdGltZW91dCwgbWF4X2Njay0+c2ZkX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmaW5hX3RpbWVvdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfdGltZW91dCksCi0JCQkgYWNjdW1fY2NrLT5maW5hX3RpbWVvdXQsCi0JCQkgZGVsdGFfY2NrLT5maW5hX3RpbWVvdXQsIG1heF9jY2stPmZpbmFfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInVucmVzcG9uZGVkX3J0czoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9jY2stPnVucmVzcG9uZGVkX3J0cywKLQkJCSBkZWx0YV9jY2stPnVucmVzcG9uZGVkX3J0cywKLQkJCSBtYXhfY2NrLT51bnJlc3BvbmRlZF9ydHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJyeGVfZnJhbWVfbG10X292cnVuOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biksCi0JCQkgYWNjdW1fY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKLQkJCSBkZWx0YV9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIG1heF9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAic2VudF9hY2tfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5zZW50X2Fja19jbnQpLAotCQkJIGFjY3VtX2Njay0+c2VudF9hY2tfY250LAotCQkJIGRlbHRhX2Njay0+c2VudF9hY2tfY250LAotCQkJIG1heF9jY2stPnNlbnRfYWNrX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInNlbnRfY3RzX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2VudF9jdHNfY250KSwKLQkJCSBhY2N1bV9jY2stPnNlbnRfY3RzX2NudCwKLQkJCSBkZWx0YV9jY2stPnNlbnRfY3RzX2NudCwKLQkJCSBtYXhfY2NrLT5zZW50X2N0c19jbnQpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJS0zMnMgICAgIGN1cnJlbnQiCi0JCQkgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAotCQkJICJTdGF0aXN0aWNzX1J4IC0gR0VORVJBTDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYm9ndXNfY3RzOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+Ym9ndXNfY3RzKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5ib2d1c19jdHMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfY3RzLCBtYXhfZ2VuZXJhbC0+Ym9ndXNfY3RzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYm9ndXNfYWNrOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+Ym9ndXNfYWNrKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5ib2d1c19hY2ssCi0JCQkgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfYWNrLCBtYXhfZ2VuZXJhbC0+Ym9ndXNfYWNrKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAibm9uX2Jzc2lkX2ZyYW1lczoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMpLAotCQkJIGFjY3VtX2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcywKLQkJCSBtYXhfZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZpbHRlcmVkX2ZyYW1lczoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcyksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzLAotCQkJIGRlbHRhX2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcywKLQkJCSBtYXhfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAibm9uX2NoYW5uZWxfYmVhY29uczoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMpLAotCQkJIGFjY3VtX2dlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucywKLQkJCSBtYXhfZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3QgaXdsMzk0NV91Y29kZV90eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMDsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6ID0gKHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc190eCkgKiA0OCkgKyAyNTA7Ci0Jc3NpemVfdCByZXQ7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfdHggKnR4LCAqYWNjdW1fdHgsICpkZWx0YV90eCwgKm1heF90eDsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbGl2ZShwcml2KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qCi0JICogVGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgKiB0aGUgbGFzdCBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCi0JICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKLQkgKi8KLQl0eCA9ICZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLnR4OwotCWFjY3VtX3R4ID0gJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MudHg7Ci0JZGVsdGFfdHggPSAmcHJpdi0+XzM5NDUuZGVsdGFfc3RhdGlzdGljcy50eDsKLQltYXhfdHggPSAmcHJpdi0+XzM5NDUubWF4X2RlbHRhLnR4OwotCXBvcyArPSBpd2wzOTQ1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlLTMycyAgICAgY3VycmVudCIKLQkJCSAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCi0JCQkgIlN0YXRpc3RpY3NfVHg6Iik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInByZWFtYmxlOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPnByZWFtYmxlX2NudCksCi0JCQkgYWNjdW1fdHgtPnByZWFtYmxlX2NudCwKLQkJCSBkZWx0YV90eC0+cHJlYW1ibGVfY250LCBtYXhfdHgtPnByZWFtYmxlX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInJ4X2RldGVjdGVkX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5yeF9kZXRlY3RlZF9jbnQpLAotCQkJIGFjY3VtX3R4LT5yeF9kZXRlY3RlZF9jbnQsCi0JCQkgZGVsdGFfdHgtPnJ4X2RldGVjdGVkX2NudCwgbWF4X3R4LT5yeF9kZXRlY3RlZF9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJidF9wcmlvX2RlZmVyX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5idF9wcmlvX2RlZmVyX2NudCksCi0JCQkgYWNjdW1fdHgtPmJ0X3ByaW9fZGVmZXJfY250LAotCQkJIGRlbHRhX3R4LT5idF9wcmlvX2RlZmVyX2NudCwKLQkJCSBtYXhfdHgtPmJ0X3ByaW9fZGVmZXJfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYnRfcHJpb19raWxsX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5idF9wcmlvX2tpbGxfY250KSwKLQkJCSBhY2N1bV90eC0+YnRfcHJpb19raWxsX2NudCwKLQkJCSBkZWx0YV90eC0+YnRfcHJpb19raWxsX2NudCwKLQkJCSBtYXhfdHgtPmJ0X3ByaW9fa2lsbF9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmZXdfYnl0ZXNfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmZld19ieXRlc19jbnQpLAotCQkJIGFjY3VtX3R4LT5mZXdfYnl0ZXNfY250LAotCQkJIGRlbHRhX3R4LT5mZXdfYnl0ZXNfY250LCBtYXhfdHgtPmZld19ieXRlc19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJjdHNfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5jdHNfdGltZW91dCksIGFjY3VtX3R4LT5jdHNfdGltZW91dCwKLQkJCSBkZWx0YV90eC0+Y3RzX3RpbWVvdXQsIG1heF90eC0+Y3RzX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJhY2tfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hY2tfdGltZW91dCksCi0JCQkgYWNjdW1fdHgtPmFja190aW1lb3V0LAotCQkJIGRlbHRhX3R4LT5hY2tfdGltZW91dCwgbWF4X3R4LT5hY2tfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImV4cGVjdGVkX2Fja19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+ZXhwZWN0ZWRfYWNrX2NudCksCi0JCQkgYWNjdW1fdHgtPmV4cGVjdGVkX2Fja19jbnQsCi0JCQkgZGVsdGFfdHgtPmV4cGVjdGVkX2Fja19jbnQsCi0JCQkgbWF4X3R4LT5leHBlY3RlZF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYWN0dWFsX2Fja19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YWN0dWFsX2Fja19jbnQpLAotCQkJIGFjY3VtX3R4LT5hY3R1YWxfYWNrX2NudCwKLQkJCSBkZWx0YV90eC0+YWN0dWFsX2Fja19jbnQsCi0JCQkgbWF4X3R4LT5hY3R1YWxfYWNrX2NudCk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3QgaXdsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHBvcyA9IDA7Ci0JY2hhciAqYnVmOwotCWludCBidWZzeiA9IHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19nZW5lcmFsKSAqIDEwICsgMzAwOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2dlbmVyYWwgKmdlbmVyYWwsICphY2N1bV9nZW5lcmFsOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2dlbmVyYWwgKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgKmRiZywgKmFjY3VtX2RiZywgKmRlbHRhX2RiZywgKm1heF9kYmc7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfZGl2ICpkaXYsICphY2N1bV9kaXYsICpkZWx0YV9kaXYsICptYXhfZGl2OwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyoKLQkgKiBUaGUgc3RhdGlzdGljIGluZm9ybWF0aW9uIGRpc3BsYXkgaGVyZSBpcyBiYXNlZCBvbgotCSAqIHRoZSBsYXN0IHN0YXRpc3RpY3Mgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKLQkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQotCSAqLwotCWdlbmVyYWwgPSAmcHJpdi0+XzM5NDUuc3RhdGlzdGljcy5nZW5lcmFsOwotCWRiZyA9ICZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmdlbmVyYWwuZGJnOwotCWRpdiA9ICZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmdlbmVyYWwuZGl2OwotCWFjY3VtX2dlbmVyYWwgPSAmcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsOwotCWRlbHRhX2dlbmVyYWwgPSAmcHJpdi0+XzM5NDUuZGVsdGFfc3RhdGlzdGljcy5nZW5lcmFsOwotCW1heF9nZW5lcmFsID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS5nZW5lcmFsOwotCWFjY3VtX2RiZyA9ICZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuZGJnOwotCWRlbHRhX2RiZyA9ICZwcml2LT5fMzk0NS5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWwuZGJnOwotCW1heF9kYmcgPSAmcHJpdi0+XzM5NDUubWF4X2RlbHRhLmdlbmVyYWwuZGJnOwotCWFjY3VtX2RpdiA9ICZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuZGl2OwotCWRlbHRhX2RpdiA9ICZwcml2LT5fMzk0NS5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWwuZGl2OwotCW1heF9kaXYgPSAmcHJpdi0+XzM5NDUubWF4X2RlbHRhLmdlbmVyYWwuZGl2OwotCXBvcyArPSBpd2wzOTQ1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlLTMycyAgICAgY3VycmVudCIKLQkJCSAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCi0JCQkgIlN0YXRpc3RpY3NfR2VuZXJhbDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYnVyc3RfY2hlY2s6IiwKLQkJCSBsZTMyX3RvX2NwdShkYmctPmJ1cnN0X2NoZWNrKSwKLQkJCSBhY2N1bV9kYmctPmJ1cnN0X2NoZWNrLAotCQkJIGRlbHRhX2RiZy0+YnVyc3RfY2hlY2ssIG1heF9kYmctPmJ1cnN0X2NoZWNrKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYnVyc3RfY291bnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShkYmctPmJ1cnN0X2NvdW50KSwKLQkJCSBhY2N1bV9kYmctPmJ1cnN0X2NvdW50LAotCQkJIGRlbHRhX2RiZy0+YnVyc3RfY291bnQsIG1heF9kYmctPmJ1cnN0X2NvdW50KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAic2xlZXBfdGltZToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsZWVwX3RpbWUpLAotCQkJIGFjY3VtX2dlbmVyYWwtPnNsZWVwX3RpbWUsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xlZXBfdGltZSwgbWF4X2dlbmVyYWwtPnNsZWVwX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJzbG90c19vdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbG90c19vdXQpLAotCQkJIGFjY3VtX2dlbmVyYWwtPnNsb3RzX291dCwKLQkJCSBkZWx0YV9nZW5lcmFsLT5zbG90c19vdXQsIG1heF9nZW5lcmFsLT5zbG90c19vdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJzbG90c19pZGxlOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfaWRsZSksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+c2xvdHNfaWRsZSwKLQkJCSBkZWx0YV9nZW5lcmFsLT5zbG90c19pZGxlLCBtYXhfZ2VuZXJhbC0+c2xvdHNfaWRsZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAidHRsX3RpbWVzdGFtcDpcdFx0XHQldVxuIiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT50dGxfdGltZXN0YW1wKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInR4X29uX2E6IiwKLQkJCSBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2EpLCBhY2N1bV9kaXYtPnR4X29uX2EsCi0JCQkgZGVsdGFfZGl2LT50eF9vbl9hLCBtYXhfZGl2LT50eF9vbl9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAidHhfb25fYjoiLAotCQkJIGxlMzJfdG9fY3B1KGRpdi0+dHhfb25fYiksIGFjY3VtX2Rpdi0+dHhfb25fYiwKLQkJCSBkZWx0YV9kaXYtPnR4X29uX2IsIG1heF9kaXYtPnR4X29uX2IpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJleGVjX3RpbWU6IiwKLQkJCSBsZTMyX3RvX2NwdShkaXYtPmV4ZWNfdGltZSksIGFjY3VtX2Rpdi0+ZXhlY190aW1lLAotCQkJIGRlbHRhX2Rpdi0+ZXhlY190aW1lLCBtYXhfZGl2LT5leGVjX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJwcm9iZV90aW1lOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT5wcm9iZV90aW1lKSwgYWNjdW1fZGl2LT5wcm9iZV90aW1lLAotCQkJIGRlbHRhX2Rpdi0+cHJvYmVfdGltZSwgbWF4X2Rpdi0+cHJvYmVfdGltZSk7Ci0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtZGVidWdmcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtZGVidWdmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmVmNGIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWRlYnVnZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi1zc2l6ZV90IGl3bDM5NDVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci1zc2l6ZV90IGl3bDM5NDVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci1zc2l6ZV90IGl3bDM5NDVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCi0JCQkJCSBsb2ZmX3QgKnBwb3MpOwotI2Vsc2UKLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCi0JCQkJCSAgIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCi0JCQkJCSAgIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWZoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1maC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZjOTkxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWZoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9faXdsXzM5NDVfZmhfaF9fCi0jZGVmaW5lIF9faXdsXzM5NDVfZmhfaF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBpd2wzOTQ1IEZsb3cgSGFuZGxlciBEZWZpbml0aW9ucyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBUaGlzIEkvTyBhcmVhIGlzIGRpcmVjdGx5IHJlYWQvd3JpdGFibGUgYnkgZHJpdmVyIChlLmcuIExpbnV4IHVzZXMgd3JpdGVsKCkpCi0gKiBBZGRyZXNzZXMgYXJlIG9mZnNldHMgZnJvbSBkZXZpY2UncyBQQ0kgaGFyZHdhcmUgYmFzZSBhZGRyZXNzLgotICovCi0jZGVmaW5lIEZIMzlfTUVNX0xPV0VSX0JPVU5EICAgICAgICAgICAgICAgICAgICgweDA4MDApCi0jZGVmaW5lIEZIMzlfTUVNX1VQUEVSX0JPVU5EICAgICAgICAgICAgICAgICAgICgweDEwMDApCi0KLSNkZWZpbmUgRkgzOV9DQkNDX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDE0MCkKLSNkZWZpbmUgRkgzOV9URkRCX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDE4MCkKLSNkZWZpbmUgRkgzOV9SQ1NSX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDQwMCkKLSNkZWZpbmUgRkgzOV9SU1NSX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDRjMCkKLSNkZWZpbmUgRkgzOV9UQ1NSX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDUwMCkKLSNkZWZpbmUgRkgzOV9UU1NSX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDY4MCkKLQotLyogVEZEQiAoVHJhbnNtaXQgRnJhbWUgQnVmZmVyIERlc2NyaXB0b3IpICovCi0jZGVmaW5lIEZIMzlfVEZEQihfY2gsIGJ1ZikJCQkoRkgzOV9URkRCX1RBQkxFICsgXAotCQkJCQkJICgoX2NoKSAqIDIgKyAoYnVmKSkgKiAweDI4KQotI2RlZmluZSBGSDM5X1RGREJfQ0hOTF9CVUZfQ1RSTF9SRUcoX2NoKQkoRkgzOV9URkRCX1RBQkxFICsgMHg1MCAqIChfY2gpKQotCi0vKiBDQkNDIGNoYW5uZWwgaXMgWzAsMl0gKi8KLSNkZWZpbmUgRkgzOV9DQkNDKF9jaCkJCShGSDM5X0NCQ0NfVEFCTEUgKyAoX2NoKSAqIDB4OCkKLSNkZWZpbmUgRkgzOV9DQkNDX0NUUkwoX2NoKQkoRkgzOV9DQkNDKF9jaCkgKyAweDAwKQotI2RlZmluZSBGSDM5X0NCQ0NfQkFTRShfY2gpCShGSDM5X0NCQ0MoX2NoKSArIDB4MDQpCi0KLS8qIFJDU1IgY2hhbm5lbCBpcyBbMCwyXSAqLwotI2RlZmluZSBGSDM5X1JDU1IoX2NoKQkJCShGSDM5X1JDU1JfVEFCTEUgKyAoX2NoKSAqIDB4NDApCi0jZGVmaW5lIEZIMzlfUkNTUl9DT05GSUcoX2NoKQkJKEZIMzlfUkNTUihfY2gpICsgMHgwMCkKLSNkZWZpbmUgRkgzOV9SQ1NSX1JCRF9CQVNFKF9jaCkJCShGSDM5X1JDU1IoX2NoKSArIDB4MDQpCi0jZGVmaW5lIEZIMzlfUkNTUl9XUFRSKF9jaCkJCShGSDM5X1JDU1IoX2NoKSArIDB4MjApCi0jZGVmaW5lIEZIMzlfUkNTUl9SUFRSX0FERFIoX2NoKQkoRkgzOV9SQ1NSKF9jaCkgKyAweDI0KQotCi0jZGVmaW5lIEZIMzlfUlNDU1JfQ0hOTDBfV1BUUgkJKEZIMzlfUkNTUl9XUFRSKDApKQotCi0vKiBSU1NSICovCi0jZGVmaW5lIEZIMzlfUlNTUl9DVFJMCQkJKEZIMzlfUlNTUl9UQUJMRSArIDB4MDAwKQotI2RlZmluZSBGSDM5X1JTU1JfU1RBVFVTCQkoRkgzOV9SU1NSX1RBQkxFICsgMHgwMDQpCi0KLS8qIFRDU1IgKi8KLSNkZWZpbmUgRkgzOV9UQ1NSKF9jaCkJCQkoRkgzOV9UQ1NSX1RBQkxFICsgKF9jaCkgKiAweDIwKQotI2RlZmluZSBGSDM5X1RDU1JfQ09ORklHKF9jaCkJCShGSDM5X1RDU1IoX2NoKSArIDB4MDApCi0jZGVmaW5lIEZIMzlfVENTUl9DUkVESVQoX2NoKQkJKEZIMzlfVENTUihfY2gpICsgMHgwNCkKLSNkZWZpbmUgRkgzOV9UQ1NSX0JVRkZfU1RUUyhfY2gpCShGSDM5X1RDU1IoX2NoKSArIDB4MDgpCi0KLS8qIFRTU1IgKi8KLSNkZWZpbmUgRkgzOV9UU1NSX0NCQl9CQVNFICAgICAgICAoRkgzOV9UU1NSX1RBQkxFICsgMHgwMDApCi0jZGVmaW5lIEZIMzlfVFNTUl9NU0dfQ09ORklHICAgICAgKEZIMzlfVFNTUl9UQUJMRSArIDB4MDA4KQotI2RlZmluZSBGSDM5X1RTU1JfVFhfU1RBVFVTICAgICAgIChGSDM5X1RTU1JfVEFCTEUgKyAweDAxMCkKLQotCi0vKiBEQk0gKi8KLQotI2RlZmluZSBGSDM5X1NSVkNfQ0hOTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNikKLQotI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfUkJEQ19TSVpFICAgICAoMjApCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1BPU19JUlFfUkJUSCAgICAgICg0KQotCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX0JJVF9XUl9TVFRTX0VOICAgICgweDA4MDAwMDAwKQotCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTl9FTkFCTEUgICAgICAgICgweDgwMDAwMDAwKQotCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SRFJCRF9FTl9FTkFCTEUgICAgICAgICAgICgweDIwMDAwMDAwKQotCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOAkJKDB4MDEwMDAwMDApCi0KLSNkZWZpbmUgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX0lSUV9ERVNUX0lOVF9IT1NUCQkoMHgwMDAwMTAwMCkKLQotI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfRkgJCQkoMHgwMDAwMDAwMCkKLQotI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfVFhGCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0RSSVZFUgkJKDB4MDAwMDAwMDEpCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRElTQUJMRV9WQUwJKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwJKDB4MDAwMDAwMDgpCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9JRlRGRAkJKDB4MDAyMDAwMDApCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfUlRDX05PSU5UCQkoMHgwMDAwMDAwMCkKLQotI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfUEFVU0UJCSgweDAwMDAwMDAwKQotI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFCQkoMHg4MDAwMDAwMCkKLQotI2RlZmluZSBGSDM5X1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9WQUxJRAkJKDB4MDAwMDQwMDApCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfQklUX1RGREJfV1BUUgkJKDB4MDAwMDAwMDEpCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9UWFBEX09OCSgweEZGMDAwMDAwKQotI2RlZmluZSBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JEX1RYUERfT04JKDB4MDBGRjAwMDApCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOEIJKDB4MDAwMDA0MDApCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9URkRfT04JCSgweDAwMDAwMTAwKQotI2RlZmluZSBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JEX0NCQl9PTgkJKDB4MDAwMDAwODApCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SU1BfV0FJVF9USAkoMHgwMDAwMDAyMCkKLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9SU1BfV0FJVF9USAkJKDB4MDAwMDAwMDUpCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfQklUX0JVRlNfRU1QVFkoX2NoKQkoQklUKF9jaCkgPDwgMjQpCi0jZGVmaW5lIEZIMzlfVFNTUl9UWF9TVEFUVVNfUkVHX0JJVF9OT19QRU5EX1JFUShfY2gpCShCSVQoX2NoKSA8PCAxNikKLQotI2RlZmluZSBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKF9jaCkgXAotCShGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfQlVGU19FTVBUWShfY2gpIHwgXAotCSBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfTk9fUEVORF9SRVEoX2NoKSkKLQotI2RlZmluZSBGSDM5X1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRQkJCSgweDAxMDAwMDAwKQotCi1zdHJ1Y3QgaXdsMzk0NV90ZmRfdGIgewotCV9fbGUzMiBhZGRyOwotCV9fbGUzMiBsZW47Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsMzk0NV90ZmQgewotCV9fbGUzMiBjb250cm9sX2ZsYWdzOwotCXN0cnVjdCBpd2wzOTQ1X3RmZF90YiB0YnNbNF07Ci0JdTggX19wYWRbMjhdOwotfSBfX3BhY2tlZDsKLQotCi0jZW5kaWYgLyogX19pd2xfMzk0NV9maF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWh3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1ody5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNhNjhkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWh3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUGxlYXNlIHVzZSB0aGlzIGZpbGUgKGl3bC0zOTQ1LWh3LmgpIG9ubHkgZm9yIGhhcmR3YXJlLXJlbGF0ZWQgZGVmaW5pdGlvbnMuCi0gKiBQbGVhc2UgdXNlIGl3bC1jb21tYW5kcy5oIGZvciB1Q29kZSBBUEkgZGVmaW5pdGlvbnMuCi0gKiBQbGVhc2UgdXNlIGl3bC0zOTQ1LmggZm9yIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBkZWZpbml0aW9ucy4KLSAqLwotCi0jaWZuZGVmIF9faXdsXzM5NDVfaHdfXwotI2RlZmluZSBfX2l3bF8zOTQ1X2h3X18KLQotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLQotLyogUlNTSSB0byBkQm0gKi8KLSNkZWZpbmUgSVdMMzlfUlNTSV9PRkZTRVQJOTUKLQotLyoKLSAqIEVFUFJPTSByZWxhdGVkIGNvbnN0YW50cywgZW51bXMsIGFuZCBzdHJ1Y3R1cmVzLgotICovCi0jZGVmaW5lIEVFUFJPTV9TS1VfQ0FQX09QX01PREVfTVJDICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDcpCi0KLS8qCi0gKiBNYXBwaW5nIG9mIGEgVHggcG93ZXIgbGV2ZWwsIGF0IGZhY3RvcnkgY2FsaWJyYXRpb24gdGVtcGVyYXR1cmUsCi0gKiAgIHRvIGEgcmFkaW8vRFNQIGdhaW4gdGFibGUgaW5kZXguCi0gKiBPbmUgZm9yIGVhY2ggb2YgNSAic2FtcGxlIiBwb3dlciBsZXZlbHMgaW4gZWFjaCBiYW5kLgotICogdl9kZXQgaXMgbWVhc3VyZWQgYXQgdGhlIGZhY3RvcnksIHVzaW5nIHRoZSAzOTQ1J3MgYnVpbHQtaW4gcG93ZXIgYW1wbGlmaWVyCi0gKiAgIChQQSkgb3V0cHV0IHZvbHRhZ2UgZGV0ZWN0b3IuICBUaGlzIHNhbWUgZGV0ZWN0b3IgaXMgdXNlZCBkdXJpbmcgVHggb2YKLSAqICAgbG9uZyBwYWNrZXRzIGluIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJvdmlkZSBmZWVkYmFjayBhcyB0byBwcm9wZXIgb3V0cHV0Ci0gKiAgIGxldmVsLgotICogRGF0YSBjb3BpZWQgZnJvbSBFRVBST00uCi0gKiBETyBOT1QgQUxURVIgVEhJUyBTVFJVQ1RVUkUhISEKLSAqLwotc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfc2FtcGxlIHsKLQl1OCBnYWluX2luZGV4OwkJLyogaW5kZXggaW50byBwb3dlciAoZ2Fpbikgc2V0dXAgdGFibGUgLi4uICovCi0JczggcG93ZXI7CQkvKiAuLi4gZm9yIHRoaXMgcHdyIGxldmVsIGZvciB0aGlzIGNobmwgZ3JvdXAgKi8KLQl1MTYgdl9kZXQ7CQkvKiBQQSBvdXRwdXQgdm9sdGFnZSAqLwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIE1hcHBpbmdzIG9mIFR4IHBvd2VyIGxldmVscyAtPiBub21pbmFsIHJhZGlvL0RTUCBnYWluIHRhYmxlIGluZGV4ZXMuCi0gKiBPbmUgZm9yIGVhY2ggY2hhbm5lbCBncm91cCAoYS5rLmEuICJiYW5kIikgKDEgZm9yIEJHLCA0IGZvciBBKS4KLSAqIFR4IHBvd2VyIHNldHVwIGNvZGUgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIDUgInNhbXBsZSIgcG93ZXIgbGV2ZWxzCi0gKiAgICB0byBkZXRlcm1pbmUgdGhlIG5vbWluYWwgc2V0dXAgZm9yIGEgcmVxdWVzdGVkIHBvd2VyIGxldmVsLgotICogRGF0YSBjb3BpZWQgZnJvbSBFRVBST00uCi0gKiBETyBOT1QgQUxURVIgVEhJUyBTVFJVQ1RVUkUhISEKLSAqLwotc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgewotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX3NhbXBsZSBzYW1wbGVzWzVdOyAgLyogNSBwb3dlciBsZXZlbHMgKi8KLQlzMzIgYSwgYiwgYywgZCwgZTsJLyogY29lZmZpY2llbnRzIGZvciB2b2x0YWdlLT5wb3dlcgotCQkJCSAqIGZvcm11bGEgKHNpZ25lZCkgKi8KLQlzMzIgRmEsIEZiLCBGYywgRmQsIEZlOwkvKiB0aGVzZSBtb2RpZnkgY29lZmZzIGJhc2VkIG9uCi0JCQkJICogZnJlcXVlbmN5IChzaWduZWQpICovCi0Jczggc2F0dXJhdGlvbl9wb3dlcjsJLyogaGlnaGVzdCBwb3dlciBwb3NzaWJsZSBieSBoL3cgaW4gdGhpcwotCQkJCSAqIGJhbmQgKi8KLQl1OCBncm91cF9jaGFubmVsOwkvKiAicmVwcmVzZW50YXRpdmUiIGNoYW5uZWwgIyBpbiB0aGlzIGJhbmQgKi8KLQlzMTYgdGVtcGVyYXR1cmU7CS8qIGgvdyB0ZW1wZXJhdHVyZSBhdCBmYWN0b3J5IGNhbGliIHRoaXMgYmFuZAotCQkJCSAqIChzaWduZWQpICovCi19IF9fcGFja2VkOwotCi0vKgotICogVGVtcGVyYXR1cmUtYmFzZWQgVHgtcG93ZXIgY29tcGVuc2F0aW9uIGRhdGEsIG5vdCBiYW5kLXNwZWNpZmljLgotICogVGhlc2UgY29lZmZpY2llbnRzIGFyZSB1c2UgdG8gbW9kaWZ5IGEvYi9jL2QvZSBjb2VmZnMgYmFzZWQgb24KLSAqICAgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgdGVtcGVyYXR1cmUgYW5kIGZhY3RvcnkgY2FsaWIgdGVtcGVyYXR1cmUuCi0gKiBEYXRhIGNvcGllZCBmcm9tIEVFUFJPTS4KLSAqLwotc3RydWN0IGl3bDM5NDVfZWVwcm9tX3RlbXBlcmF0dXJlX2NvcnIgewotCXUzMiBUYTsKLQl1MzIgVGI7Ci0JdTMyIFRjOwotCXUzMiBUZDsKLQl1MzIgVGU7Ci19IF9fcGFja2VkOwotCi0vKgotICogRUVQUk9NIG1hcAotICovCi1zdHJ1Y3QgaXdsMzk0NV9lZXByb20gewotCXU4IHJlc2VydmVkMFsxNl07Ci0JdTE2IGRldmljZV9pZDsJLyogYWJzLm9mczogMTYgKi8KLQl1OCByZXNlcnZlZDFbMl07Ci0JdTE2IHBtYzsJCS8qIGFicy5vZnM6IDIwICovCi0JdTggcmVzZXJ2ZWQyWzIwXTsKLQl1OCBtYWNfYWRkcmVzc1s2XTsJLyogYWJzLm9mczogNDIgKi8KLQl1OCByZXNlcnZlZDNbNThdOwotCXUxNiBib2FyZF9yZXZpc2lvbjsJLyogYWJzLm9mczogMTA2ICovCi0JdTggcmVzZXJ2ZWQ0WzExXTsKLQl1OCBib2FyZF9wYmFfbnVtYmVyWzldOwkvKiBhYnMub2ZzOiAxMTkgKi8KLQl1OCByZXNlcnZlZDVbOF07Ci0JdTE2IHZlcnNpb247CQkvKiBhYnMub2ZzOiAxMzYgKi8KLQl1OCBza3VfY2FwOwkJLyogYWJzLm9mczogMTM4ICovCi0JdTggbGVkc19tb2RlOwkJLyogYWJzLm9mczogMTM5ICovCi0JdTE2IG9lbV9tb2RlOwotCXUxNiB3b3dsYW5fbW9kZTsJLyogYWJzLm9mczogMTQyICovCi0JdTE2IGxlZHNfdGltZV9pbnRlcnZhbDsJLyogYWJzLm9mczogMTQ0ICovCi0JdTggbGVkc19vZmZfdGltZTsJLyogYWJzLm9mczogMTQ2ICovCi0JdTggbGVkc19vbl90aW1lOwkvKiBhYnMub2ZzOiAxNDcgKi8KLQl1OCBhbG1nb3JfbV92ZXJzaW9uOwkvKiBhYnMub2ZzOiAxNDggKi8KLQl1OCBhbnRlbm5hX3N3aXRjaF90eXBlOwkvKiBhYnMub2ZzOiAxNDkgKi8KLQl1OCByZXNlcnZlZDZbNDJdOwotCXU4IHNrdV9pZFs0XTsJCS8qIGFicy5vZnM6IDE5MiAqLwotCi0vKgotICogUGVyLWNoYW5uZWwgcmVndWxhdG9yeSBkYXRhLgotICoKLSAqIEVhY2ggY2hhbm5lbCB0aGF0ICptaWdodCogYmUgc3VwcG9ydGVkIGJ5IDM5NDUgaGFzIGEgZml4ZWQgbG9jYXRpb24KLSAqIGluIEVFUFJPTSBjb250YWluaW5nIEVFUFJPTV9DSEFOTkVMXyogdXNhZ2UgZmxhZ3MgKExTQikgYW5kIG1heCByZWd1bGF0b3J5Ci0gKiB0eHBvd2VyIChNU0IpLgotICoKLSAqIEVudHJpZXMgaW1tZWRpYXRlbHkgYmVsb3cgYXJlIGZvciAyMCBNSHogY2hhbm5lbCB3aWR0aC4KLSAqCi0gKiAyLjQgR0h6IGNoYW5uZWxzIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNAotICovCi0JdTE2IGJhbmRfMV9jb3VudDsJLyogYWJzLm9mczogMTk2ICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBiYW5kXzFfY2hhbm5lbHNbMTRdOyAgLyogYWJzLm9mczogMTk4ICovCi0KLS8qCi0gKiA0LjkgR0h6IGNoYW5uZWxzIDE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODksIDE5MiwgMTk2LAotICogNS4wIEdIeiBjaGFubmVscyA3LCA4LCAxMSwgMTIsIDE2Ci0gKiAoNDkxNS01MDgwTUh6KSAobm9uZSBvZiB0aGVzZSBpcyBldmVyIHN1cHBvcnRlZCkKLSAqLwotCXUxNiBiYW5kXzJfY291bnQ7CS8qIGFicy5vZnM6IDIyNiAqLwotCXN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgYmFuZF8yX2NoYW5uZWxzWzEzXTsgIC8qIGFicy5vZnM6IDIyOCAqLwotCi0vKgotICogNS4yIEdIeiBjaGFubmVscyAzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUyLCA1NiwgNjAsIDY0Ci0gKiAoNTE3MC01MzIwTUh6KQotICovCi0JdTE2IGJhbmRfM19jb3VudDsJLyogYWJzLm9mczogMjU0ICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBiYW5kXzNfY2hhbm5lbHNbMTJdOyAgLyogYWJzLm9mczogMjU2ICovCi0KLS8qCi0gKiA1LjUgR0h6IGNoYW5uZWxzIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCi0gKiAoNTUwMC01NzAwTUh6KQotICovCi0JdTE2IGJhbmRfNF9jb3VudDsJLyogYWJzLm9mczogMjgwICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBiYW5kXzRfY2hhbm5lbHNbMTFdOyAgLyogYWJzLm9mczogMjgyICovCi0KLS8qCi0gKiA1LjcgR0h6IGNoYW5uZWxzIDE0NSwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSAqICg1NzI1LTU4MjVNSHopCi0gKi8KLQl1MTYgYmFuZF81X2NvdW50OwkvKiBhYnMub2ZzOiAzMDQgKi8KLQlzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsIGJhbmRfNV9jaGFubmVsc1s2XTsgIC8qIGFicy5vZnM6IDMwNiAqLwotCi0JdTggcmVzZXJ2ZWQ5WzE5NF07Ci0KLS8qCi0gKiAzOTQ1IFR4cG93ZXIgY2FsaWJyYXRpb24gZGF0YS4KLSAqLwotI2RlZmluZSBJV0xfTlVNX1RYX0NBTElCX0dST1VQUyA1Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgZ3JvdXBzW0lXTF9OVU1fVFhfQ0FMSUJfR1JPVVBTXTsKLS8qIGFicy5vZnM6IDUxMiAqLwotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90ZW1wZXJhdHVyZV9jb3JyIGNvcnJlY3Rpb25zOyAgLyogYWJzLm9mczogODMyICovCi0JdTggcmVzZXJ2ZWQxNlsxNzJdOwkvKiBmaWxsIG91dCB0byBmdWxsIDEwMjQgYnl0ZSBibG9jayAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBJV0wzOTQ1X0VFUFJPTV9JTUdfU0laRSAxMDI0Ci0KLS8qIEVuZCBvZiBFRVBST00gKi8KLQotI2RlZmluZSBQQ0lfQ0ZHX1JFVl9JRF9CSVRfQkFTSUNfU0tVICAgICAgICAgICAgICAgICgweDQwKQkvKiBiaXQgNiAgICAqLwotI2RlZmluZSBQQ0lfQ0ZHX1JFVl9JRF9CSVRfUlRQICAgICAgICAgICAgICAgICAgICAgICgweDgwKQkvKiBiaXQgNyAgICAqLwotCi0vKiA0IERBVEEgKyAxIENNRC4gVGhlcmUgYXJlIDIgSENDQSBxdWV1ZXMgdGhhdCBhcmUgbm90IHVzZWQuICovCi0jZGVmaW5lIElXTDM5X05VTV9RVUVVRVMgICAgICAgIDUKLSNkZWZpbmUgSVdMMzlfQ01EX1FVRVVFX05VTQk0Ci0KLSNkZWZpbmUgSVdMX0RFRkFVTFRfVFhfUkVUUlkgIDE1Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUkZEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE5VTV9URkRfQ0hVTktTICAgICAgICAgICAgICAgICAgICAgICAgNAotCi0jZGVmaW5lIFJYX1FVRVVFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIFJYX1FVRVVFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMjU1Ci0jZGVmaW5lIFJYX1FVRVVFX1NJWkVfTE9HICAgICAgICAgICAgICAgICAgICAgOAotCi0jZGVmaW5lIFUzMl9QQUQobikJCSgoNC0obikpJjB4MykKLQotI2RlZmluZSBURkRfQ1RMX0NPVU5UX1NFVChuKSAgICAgICAobiA8PCAyNCkKLSNkZWZpbmUgVEZEX0NUTF9DT1VOVF9HRVQoY3RsKSAgICAgKChjdGwgPj4gMjQpICYgNykKLSNkZWZpbmUgVEZEX0NUTF9QQURfU0VUKG4pICAgICAgICAgKG4gPDwgMjgpCi0jZGVmaW5lIFRGRF9DVExfUEFEX0dFVChjdGwpICAgICAgIChjdGwgPj4gMjgpCi0KLS8qIFNpemVzIGFuZCBhZGRyZXNzZXMgZm9yIGluc3RydWN0aW9uIGFuZCBkYXRhIG1lbW9yeSAoU1JBTSkgaW4KLSAqIDM5NDUncyBlbWJlZGRlZCBwcm9jZXNzb3IuICBEcml2ZXIgYWNjZXNzIGlzIHZpYSBIQlVTX1RBUkdfTUVNXyogcmVncy4gKi8KLSNkZWZpbmUgSVdMMzlfUlRDX0lOU1RfTE9XRVJfQk9VTkQJCSgweDAwMDAwMCkKLSNkZWZpbmUgSVdMMzlfUlRDX0lOU1RfVVBQRVJfQk9VTkQJCSgweDAxNDAwMCkKLQotI2RlZmluZSBJV0wzOV9SVENfREFUQV9MT1dFUl9CT1VORAkJKDB4ODAwMDAwKQotI2RlZmluZSBJV0wzOV9SVENfREFUQV9VUFBFUl9CT1VORAkJKDB4ODA4MDAwKQotCi0jZGVmaW5lIElXTDM5X1JUQ19JTlNUX1NJWkUgKElXTDM5X1JUQ19JTlNUX1VQUEVSX0JPVU5EIC0gXAotCQkJCUlXTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKQotI2RlZmluZSBJV0wzOV9SVENfREFUQV9TSVpFIChJV0wzOV9SVENfREFUQV9VUFBFUl9CT1VORCAtIFwKLQkJCQlJV0wzOV9SVENfREFUQV9MT1dFUl9CT1VORCkKLQotI2RlZmluZSBJV0wzOV9NQVhfSU5TVF9TSVpFIElXTDM5X1JUQ19JTlNUX1NJWkUKLSNkZWZpbmUgSVdMMzlfTUFYX0RBVEFfU0laRSBJV0wzOV9SVENfREFUQV9TSVpFCi0KLS8qIFNpemUgb2YgdUNvZGUgaW5zdHJ1Y3Rpb24gbWVtb3J5IGluIGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lICovCi0jZGVmaW5lIElXTDM5X01BWF9CU01fU0laRSBJV0wzOV9SVENfSU5TVF9TSVpFCi0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bDM5NDVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkcih1MzIgYWRkcikKLXsKLQlyZXR1cm4gKGFkZHIgPj0gSVdMMzlfUlRDX0RBVEFfTE9XRVJfQk9VTkQpICYmCi0JICAgICAgIChhZGRyIDwgSVdMMzlfUlRDX0RBVEFfVVBQRVJfQk9VTkQpOwotfQotCi0vKiBCYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgaXdsMzk0NV9zaGFyZWQgaXMgcHJvdmlkZWQgdG8gRkhfVFNTUl9DQkJfQkFTRQotICogYW5kICZpd2wzOTQ1X3NoYXJlZC5yeF9yZWFkX3B0clswXSBpcyBwcm92aWRlZCB0byBGSF9SQ1NSX1JQVFJfQUREUigwKSAqLwotc3RydWN0IGl3bDM5NDVfc2hhcmVkIHsKLQlfX2xlMzIgdHhfYmFzZV9wdHJbOF07Ci19IF9fcGFja2VkOwotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDM5NDVfaHdfZ2V0X3JhdGUoX19sZTE2IHJhdGVfbl9mbGFncykKLXsKLQlyZXR1cm4gbGUxNl90b19jcHUocmF0ZV9uX2ZsYWdzKSAmIDB4RkY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IGl3bDM5NDVfaHdfZ2V0X3JhdGVfbl9mbGFncyhfX2xlMTYgcmF0ZV9uX2ZsYWdzKQotewotCXJldHVybiBsZTE2X3RvX2NwdShyYXRlX25fZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIF9fbGUxNiBpd2wzOTQ1X2h3X3NldF9yYXRlX25fZmxhZ3ModTggcmF0ZSwgdTE2IGZsYWdzKQotewotCXJldHVybiBjcHVfdG9fbGUxNigodTE2KXJhdGV8ZmxhZ3MpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWxlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTdmMGYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWxlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtMzk0NS1sZWQuaCIKLQotCi0vKiBTZW5kIGxlZCBjb21tYW5kICovCi1zdGF0aWMgaW50IGl3bDM5NDVfc2VuZF9sZWRfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX2xlZF9jbWQgKmxlZF9jbWQpCi17Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX0xFRFNfQ01ELAotCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpd2xfbGVkX2NtZCksCi0JCS5kYXRhID0gbGVkX2NtZCwKLQkJLmZsYWdzID0gQ01EX0FTWU5DLAotCQkuY2FsbGJhY2sgPSBOVUxMLAotCX07Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZChwcml2LCAmY21kKTsKLX0KLQotY29uc3Qgc3RydWN0IGl3bF9sZWRfb3BzIGl3bDM5NDVfbGVkX29wcyA9IHsKLQkuY21kID0gaXdsMzk0NV9zZW5kX2xlZF9jbWQsCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtbGVkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1sZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3MTYyNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1sZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9faXdsXzM5NDVfbGVkX2hfXwotI2RlZmluZSBfX2l3bF8zOTQ1X2xlZF9oX18KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfbGVkX29wcyBpd2wzOTQ1X2xlZF9vcHM7Ci0KLSNlbmRpZiAvKiBfX2l3bF8zOTQ1X2xlZF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1ycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmFlYWYyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0KLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKLSNpbmNsdWRlICJpd2wtMzk0NS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLQotI2RlZmluZSBSU19OQU1FICJpd2wtMzk0NS1ycyIKLQotc3RhdGljIHMzMiBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9nW0lXTF9SQVRFX0NPVU5UXzM5NDVdID0gewotCTcsIDEzLCAzNSwgNTgsIDAsIDAsIDc2LCAxMDQsIDEzMCwgMTY4LCAxOTEsIDIwMgotfTsKLQotc3RhdGljIHMzMiBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9nX3Byb3RbSVdMX1JBVEVfQ09VTlRfMzk0NV0gPSB7Ci0JNywgMTMsIDM1LCA1OCwgMCwgMCwgMCwgODAsIDkzLCAxMTMsIDEyMywgMTI1Ci19OwotCi1zdGF0aWMgczMyIGl3bDM5NDVfZXhwZWN0ZWRfdHB0X2FbSVdMX1JBVEVfQ09VTlRfMzk0NV0gPSB7Ci0JMCwgMCwgMCwgMCwgNDAsIDU3LCA3MiwgOTgsIDEyMSwgMTU0LCAxNzcsIDE4NgotfTsKLQotc3RhdGljIHMzMiBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9iW0lXTF9SQVRFX0NPVU5UXzM5NDVdID0gewotCTcsIDEzLCAzNSwgNTgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLXN0cnVjdCBpd2wzOTQ1X3RwdF9lbnRyeSB7Ci0JczggbWluX3Jzc2k7Ci0JdTggaW5kZXg7Ci19OwotCi1zdGF0aWMgc3RydWN0IGl3bDM5NDVfdHB0X2VudHJ5IGl3bDM5NDVfdHB0X3RhYmxlX2FbXSA9IHsKLQl7LTYwLCBJV0xfUkFURV81NE1fSU5ERVh9LAotCXstNjQsIElXTF9SQVRFXzQ4TV9JTkRFWH0sCi0Jey03MiwgSVdMX1JBVEVfMzZNX0lOREVYfSwKLQl7LTgwLCBJV0xfUkFURV8yNE1fSU5ERVh9LAotCXstODQsIElXTF9SQVRFXzE4TV9JTkRFWH0sCi0Jey04NSwgSVdMX1JBVEVfMTJNX0lOREVYfSwKLQl7LTg3LCBJV0xfUkFURV85TV9JTkRFWH0sCi0Jey04OSwgSVdMX1JBVEVfNk1fSU5ERVh9Ci19OwotCi1zdGF0aWMgc3RydWN0IGl3bDM5NDVfdHB0X2VudHJ5IGl3bDM5NDVfdHB0X3RhYmxlX2dbXSA9IHsKLQl7LTYwLCBJV0xfUkFURV81NE1fSU5ERVh9LAotCXstNjQsIElXTF9SQVRFXzQ4TV9JTkRFWH0sCi0Jey02OCwgSVdMX1JBVEVfMzZNX0lOREVYfSwKLQl7LTgwLCBJV0xfUkFURV8yNE1fSU5ERVh9LAotCXstODQsIElXTF9SQVRFXzE4TV9JTkRFWH0sCi0Jey04NSwgSVdMX1JBVEVfMTJNX0lOREVYfSwKLQl7LTg2LCBJV0xfUkFURV8xMU1fSU5ERVh9LAotCXstODgsIElXTF9SQVRFXzVNX0lOREVYfSwKLQl7LTkwLCBJV0xfUkFURV8yTV9JTkRFWH0sCi0Jey05MiwgSVdMX1JBVEVfMU1fSU5ERVh9Ci19OwotCi0jZGVmaW5lIElXTF9SQVRFX01BWF9XSU5ET1cgICAgICAgICAgNjIKLSNkZWZpbmUgSVdMX1JBVEVfRkxVU0gJCSgzKkhaKQotI2RlZmluZSBJV0xfUkFURV9XSU5fRkxVU0ggICAgICAgKEhaLzIpCi0jZGVmaW5lIElXTDM5X1JBVEVfSElHSF9USCAgICAgICAgICAxMTUyMAotI2RlZmluZSBJV0xfU1VDQ0VTU19VUF9USAkgICA4OTYwCi0jZGVmaW5lIElXTF9TVUNDRVNTX0RPV05fVEgJICAxMDg4MAotI2RlZmluZSBJV0xfUkFURV9NSU5fRkFJTFVSRV9USCAgICAgICA2Ci0jZGVmaW5lIElXTF9SQVRFX01JTl9TVUNDRVNTX1RIICAgICAgIDgKLSNkZWZpbmUgSVdMX1JBVEVfREVDUkVBU0VfVEggICAgICAgMTkyMAotI2RlZmluZSBJV0xfUkFURV9SRVRSWV9USAkgICAgIDE1Ci0KLXN0YXRpYyB1OCBpd2wzOTQ1X2dldF9yYXRlX2luZGV4X2J5X3Jzc2koczMyIHJzc2ksIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQl1MzIgaW5kZXggPSAwOwotCXUzMiB0YWJsZV9zaXplID0gMDsKLQlzdHJ1Y3QgaXdsMzk0NV90cHRfZW50cnkgKnRwdF90YWJsZSA9IE5VTEw7Ci0KLQlpZiAoKHJzc2kgPCBJV0xfTUlOX1JTU0lfVkFMKSB8fCAocnNzaSA+IElXTF9NQVhfUlNTSV9WQUwpKQotCQlyc3NpID0gSVdMX01JTl9SU1NJX1ZBTDsKLQotCXN3aXRjaCAoYmFuZCkgewotCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKLQkJdHB0X3RhYmxlID0gaXdsMzk0NV90cHRfdGFibGVfZzsKLQkJdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoaXdsMzk0NV90cHRfdGFibGVfZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQl0cHRfdGFibGUgPSBpd2wzOTQ1X3RwdF90YWJsZV9hOwotCQl0YWJsZV9zaXplID0gQVJSQVlfU0laRShpd2wzOTQ1X3RwdF90YWJsZV9hKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJYnJlYWs7Ci0JfQotCi0Jd2hpbGUgKChpbmRleCA8IHRhYmxlX3NpemUpICYmIChyc3NpIDwgdHB0X3RhYmxlW2luZGV4XS5taW5fcnNzaSkpCi0JCWluZGV4Kys7Ci0KLQlpbmRleCA9IG1pbihpbmRleCwgKHRhYmxlX3NpemUgLSAxKSk7Ci0KLQlyZXR1cm4gdHB0X3RhYmxlW2luZGV4XS5pbmRleDsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9jbGVhcl93aW5kb3coc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cpCi17Ci0Jd2luZG93LT5kYXRhID0gMDsKLQl3aW5kb3ctPnN1Y2Nlc3NfY291bnRlciA9IDA7Ci0Jd2luZG93LT5zdWNjZXNzX3JhdGlvID0gLTE7Ci0Jd2luZG93LT5jb3VudGVyID0gMDsKLQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0Jd2luZG93LT5zdGFtcCA9IDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yYXRlX3NjYWxlX2ZsdXNoX3dpbmRvd3MgLSBmbHVzaCBvdXQgdGhlIHJhdGUgc2NhbGUgd2luZG93cwotICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3aW5kb3dzIHRoYXQgaGF2ZSBnYXRoZXJlZCBkYXRhIGJ1dCB3ZXJlCi0gKiBub3QgZmx1c2hlZC4gIElmIHRoZXJlIHdlcmUgYW55IHRoYXQgd2VyZSBub3QgZmx1c2hlZCwgdGhlbgotICogcmVzY2hlZHVsZSB0aGUgcmF0ZSBmbHVzaGluZyByb3V0aW5lLgotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfcmF0ZV9zY2FsZV9mbHVzaF93aW5kb3dzKHN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhKQotewotCWludCB1bmZsdXNoZWQgPSAwOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2IF9fbWF5YmVfdW51c2VkID0gcnNfc3RhLT5wcml2OwotCi0JLyoKLQkgKiBGb3IgZWFjaCByYXRlLCBpZiB3ZSBoYXZlIGNvbGxlY3RlZCBkYXRhIG9uIHRoYXQgcmF0ZQotCSAqIGFuZCBpdCBoYXMgYmVlbiBtb3JlIHRoYW4gSVdMX1JBVEVfV0lOX0ZMVVNICi0JICogc2luY2Ugd2UgZmx1c2hlZCwgY2xlYXIgb3V0IHRoZSBnYXRoZXJlZCBzdGF0aXN0aWNzCi0JICovCi0JZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UXzM5NDU7IGkrKykgewotCQlpZiAoIXJzX3N0YS0+d2luW2ldLmNvdW50ZXIpCi0JCQljb250aW51ZTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHJzX3N0YS0+d2luW2ldLnN0YW1wICsKLQkJCSAgICAgICBJV0xfUkFURV9XSU5fRkxVU0gpKSB7Ci0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiZmx1c2hpbmcgJWQgc2FtcGxlcyBvZiByYXRlICIKLQkJCQkgICAgICAgImluZGV4ICVkXG4iLAotCQkJCSAgICAgICByc19zdGEtPndpbltpXS5jb3VudGVyLCBpKTsKLQkJCWl3bDM5NDVfY2xlYXJfd2luZG93KCZyc19zdGEtPndpbltpXSk7Ci0JCX0gZWxzZQotCQkJdW5mbHVzaGVkKys7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiB1bmZsdXNoZWQ7Ci19Ci0KLSNkZWZpbmUgSVdMX1JBVEVfRkxVU0hfTUFYICAgICAgICAgICAgICA1MDAwCS8qIG1zZWMgKi8KLSNkZWZpbmUgSVdMX1JBVEVfRkxVU0hfTUlOICAgICAgICAgICAgICA1MAkvKiBtc2VjICovCi0jZGVmaW5lIElXTF9BVkVSQUdFX1BBQ0tFVFMgICAgICAgICAgICAgMTUwMAotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2JnX3JhdGVfc2NhbGVfZmx1c2godW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhID0gKHZvaWQgKilkYXRhOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+cHJpdjsKLQlpbnQgdW5mbHVzaGVkID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBwYWNrZXRfY291bnQsIGR1cmF0aW9uLCBwcHM7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiZW50ZXJcbiIpOwotCi0JdW5mbHVzaGVkID0gaXdsMzk0NV9yYXRlX3NjYWxlX2ZsdXNoX3dpbmRvd3MocnNfc3RhKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCS8qIE51bWJlciBvZiBwYWNrZXRzIFJ4J2Qgc2luY2UgbGFzdCB0aW1lIHRoaXMgdGltZXIgcmFuICovCi0JcGFja2V0X2NvdW50ID0gKHJzX3N0YS0+dHhfcGFja2V0cyAtIHJzX3N0YS0+bGFzdF90eF9wYWNrZXRzKSArIDE7Ci0KLQlyc19zdGEtPmxhc3RfdHhfcGFja2V0cyA9IHJzX3N0YS0+dHhfcGFja2V0cyArIDE7Ci0KLQlpZiAodW5mbHVzaGVkKSB7Ci0JCWR1cmF0aW9uID0KLQkJICAgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHJzX3N0YS0+bGFzdF9wYXJ0aWFsX2ZsdXNoKTsKLQotCQlJV0xfREVCVUdfUkFURShwcml2LCAiVHgnZCAlZCBwYWNrZXRzIGluICVkbXNcbiIsCi0JCQkgICAgICAgcGFja2V0X2NvdW50LCBkdXJhdGlvbik7Ci0KLQkJLyogRGV0ZXJtaW5lIHBhY2tldHMgcGVyIHNlY29uZCAqLwotCQlpZiAoZHVyYXRpb24pCi0JCQlwcHMgPSAocGFja2V0X2NvdW50ICogMTAwMCkgLyBkdXJhdGlvbjsKLQkJZWxzZQotCQkJcHBzID0gMDsKLQotCQlpZiAocHBzKSB7Ci0JCQlkdXJhdGlvbiA9IChJV0xfQVZFUkFHRV9QQUNLRVRTICogMTAwMCkgLyBwcHM7Ci0JCQlpZiAoZHVyYXRpb24gPCBJV0xfUkFURV9GTFVTSF9NSU4pCi0JCQkJZHVyYXRpb24gPSBJV0xfUkFURV9GTFVTSF9NSU47Ci0JCQllbHNlIGlmIChkdXJhdGlvbiA+IElXTF9SQVRFX0ZMVVNIX01BWCkKLQkJCQlkdXJhdGlvbiA9IElXTF9SQVRFX0ZMVVNIX01BWDsKLQkJfSBlbHNlCi0JCQlkdXJhdGlvbiA9IElXTF9SQVRFX0ZMVVNIX01BWDsKLQotCQlyc19zdGEtPmZsdXNoX3RpbWUgPSBtc2Vjc190b19qaWZmaWVzKGR1cmF0aW9uKTsKLQotCQlJV0xfREVCVUdfUkFURShwcml2LCAibmV3IGZsdXNoIHBlcmlvZDogJWQgbXNlYyBhdmUgJWRcbiIsCi0JCQkgICAgICAgZHVyYXRpb24sIHBhY2tldF9jb3VudCk7Ci0KLQkJbW9kX3RpbWVyKCZyc19zdGEtPnJhdGVfc2NhbGVfZmx1c2gsIGppZmZpZXMgKwotCQkJICByc19zdGEtPmZsdXNoX3RpbWUpOwotCi0JCXJzX3N0YS0+bGFzdF9wYXJ0aWFsX2ZsdXNoID0gamlmZmllczsKLQl9IGVsc2UgewotCQlyc19zdGEtPmZsdXNoX3RpbWUgPSBJV0xfUkFURV9GTFVTSDsKLQkJcnNfc3RhLT5mbHVzaF9wZW5kaW5nID0gMDsKLQl9Ci0JLyogSWYgdGhlcmUgd2VyZW4ndCBhbnkgdW5mbHVzaGVkIGVudHJpZXMsIHdlIGRvbid0IHNjaGVkdWxlIHRoZSB0aW1lcgotCSAqIHRvIHJ1biBhZ2FpbiAqLwotCi0JcnNfc3RhLT5sYXN0X2ZsdXNoID0gamlmZmllczsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2NvbGxlY3RfdHhfZGF0YSAtIFVwZGF0ZSB0aGUgc3VjY2Vzcy9mYWlsdXJlIHNsaWRpbmcgd2luZG93Ci0gKgotICogV2Uga2VlcCBhIHNsaWRpbmcgd2luZG93IG9mIHRoZSBsYXN0IDY0IHBhY2tldHMgdHJhbnNtaXR0ZWQKLSAqIGF0IHRoaXMgcmF0ZS4gIHdpbmRvdy0+ZGF0YSBjb250YWlucyB0aGUgYml0bWFzayBvZiBzdWNjZXNzZnVsCi0gKiBwYWNrZXRzLgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2NvbGxlY3RfdHhfZGF0YShzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YSwKLQkJCQlzdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdywKLQkJCQlpbnQgc3VjY2VzcywgaW50IHJldHJpZXMsIGludCBpbmRleCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXMzMiBmYWlsX2NvdW50OwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+cHJpdjsKLQotCWlmICghcmV0cmllcykgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmU6IHJldHJpZXMgPT0gMCAtLSBzaG91bGQgYmUgYXQgbGVhc3QgMVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIEtlZXAgdHJhY2sgb2Ygb25seSB0aGUgbGF0ZXN0IDYyIHR4IGZyYW1lIGF0dGVtcHRzIGluIHRoaXMgcmF0ZSdzCi0JICogaGlzdG9yeSB3aW5kb3c7IGFueXRoaW5nIG9sZGVyIGlzbid0IHJlYWxseSByZWxldmFudCBhbnkgbW9yZS4KLQkgKiBJZiB3ZSBoYXZlIGZpbGxlZCB1cCB0aGUgc2xpZGluZyB3aW5kb3csIGRyb3AgdGhlIG9sZGVzdCBhdHRlbXB0OwotCSAqIGlmIHRoZSBvbGRlc3QgYXR0ZW1wdCAoaGlnaGVzdCBiaXQgaW4gYml0bWFwKSBzaG93cyAic3VjY2VzcyIsCi0JICogc3VidHJhY3QgIjEiIGZyb20gdGhlIHN1Y2Nlc3MgY291bnRlciAodGhpcyBpcyB0aGUgbWFpbiByZWFzb24KLQkgKiB3ZSBrZWVwIHRoZXNlIGJpdG1hcHMhKS4KLQkgKiAqLwotCXdoaWxlIChyZXRyaWVzID4gMCkgewotCQlpZiAod2luZG93LT5jb3VudGVyID49IElXTF9SQVRFX01BWF9XSU5ET1cpIHsKLQotCQkJLyogcmVtb3ZlIGVhcmxpZXN0ICovCi0JCQl3aW5kb3ctPmNvdW50ZXIgPSBJV0xfUkFURV9NQVhfV0lORE9XIC0gMTsKLQotCQkJaWYgKHdpbmRvdy0+ZGF0YSAmICgxVUxMIDw8IChJV0xfUkFURV9NQVhfV0lORE9XIC0gMSkpKSB7Ci0JCQkJd2luZG93LT5kYXRhICY9IH4oMVVMTCA8PCAoSVdMX1JBVEVfTUFYX1dJTkRPVyAtIDEpKTsKLQkJCQl3aW5kb3ctPnN1Y2Nlc3NfY291bnRlci0tOwotCQkJfQotCQl9Ci0KLQkJLyogSW5jcmVtZW50IGZyYW1lcy1hdHRlbXB0ZWQgY291bnRlciAqLwotCQl3aW5kb3ctPmNvdW50ZXIrKzsKLQotCQkvKiBTaGlmdCBiaXRtYXAgYnkgb25lIGZyYW1lICh0aHJvdyBhd2F5IG9sZGVzdCBoaXN0b3J5KSwKLQkJICogT1IgaW4gIjEiLCBhbmQgaW5jcmVtZW50ICJzdWNjZXNzIiBpZiB0aGlzCi0JCSAqIGZyYW1lIHdhcyBzdWNjZXNzZnVsLiAqLwotCQl3aW5kb3ctPmRhdGEgPDw9IDE7Ci0JCWlmIChzdWNjZXNzID4gMCkgewotCQkJd2luZG93LT5zdWNjZXNzX2NvdW50ZXIrKzsKLQkJCXdpbmRvdy0+ZGF0YSB8PSAweDE7Ci0JCQlzdWNjZXNzLS07Ci0JCX0KLQotCQlyZXRyaWVzLS07Ci0JfQotCi0JLyogQ2FsY3VsYXRlIGN1cnJlbnQgc3VjY2VzcyByYXRpbywgYXZvaWQgZGl2aWRlLWJ5LTAhICovCi0JaWYgKHdpbmRvdy0+Y291bnRlciA+IDApCi0JCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA9IDEyOCAqICgxMDAgKiB3aW5kb3ctPnN1Y2Nlc3NfY291bnRlcikKLQkJCQkJLyB3aW5kb3ctPmNvdW50ZXI7Ci0JZWxzZQotCQl3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPSBJV0xfSU5WQUxJRF9WQUxVRTsKLQotCWZhaWxfY291bnQgPSB3aW5kb3ctPmNvdW50ZXIgLSB3aW5kb3ctPnN1Y2Nlc3NfY291bnRlcjsKLQotCS8qIENhbGN1bGF0ZSBhdmVyYWdlIHRocm91Z2hwdXQsIGlmIHdlIGhhdmUgZW5vdWdoIGhpc3RvcnkuICovCi0JaWYgKChmYWlsX2NvdW50ID49IElXTF9SQVRFX01JTl9GQUlMVVJFX1RIKSB8fAotCSAgICAod2luZG93LT5zdWNjZXNzX2NvdW50ZXIgPj0gSVdMX1JBVEVfTUlOX1NVQ0NFU1NfVEgpKQotCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gKCh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gKgotCQkJCXJzX3N0YS0+ZXhwZWN0ZWRfdHB0W2luZGV4XSArIDY0KSAvIDEyOCk7Ci0JZWxzZQotCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0KLQkvKiBUYWcgdGhpcyB3aW5kb3cgYXMgaGF2aW5nIGJlZW4gdXBkYXRlZCAqLwotCXdpbmRvdy0+c3RhbXAgPSBqaWZmaWVzOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Ci0KLX0KLQotLyoKLSAqIENhbGxlZCBhZnRlciBhZGRpbmcgYSBuZXcgc3RhdGlvbiB0byBpbml0aWFsaXplIHJhdGUgc2NhbGluZwotICovCi12b2lkIGl3bDM5NDVfcnNfcmF0ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggc3RhX2lkKQotewotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJnByaXYtPmh3LT5jb25mOwotCXN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2ICpwc3RhOwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhOwotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCWludCBpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImVudGVyXG4iKTsKLQlpZiAoc3RhX2lkID09IHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCkKLQkJZ290byBvdXQ7Ci0KLQlwc3RhID0gKHN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2ICopIHN0YS0+ZHJ2X3ByaXY7Ci0JcnNfc3RhID0gJnBzdGEtPnJzX3N0YTsKLQlzYmFuZCA9IGh3LT53aXBoeS0+YmFuZHNbY29uZi0+Y2hhbm5lbC0+YmFuZF07Ci0KLQlyc19zdGEtPnByaXYgPSBwcml2OwotCi0JcnNfc3RhLT5zdGFydF9yYXRlID0gSVdMX1JBVEVfSU5WQUxJRDsKLQotCS8qIGRlZmF1bHQgdG8ganVzdCA4MDIuMTFiICovCi0JcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9iOwotCi0JcnNfc3RhLT5sYXN0X3BhcnRpYWxfZmx1c2ggPSBqaWZmaWVzOwotCXJzX3N0YS0+bGFzdF9mbHVzaCA9IGppZmZpZXM7Ci0JcnNfc3RhLT5mbHVzaF90aW1lID0gSVdMX1JBVEVfRkxVU0g7Ci0JcnNfc3RhLT5sYXN0X3R4X3BhY2tldHMgPSAwOwotCi0JcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoLmRhdGEgPSAodW5zaWduZWQgbG9uZylyc19zdGE7Ci0JcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoLmZ1bmN0aW9uID0gaXdsMzk0NV9iZ19yYXRlX3NjYWxlX2ZsdXNoOwotCi0JZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UXzM5NDU7IGkrKykKLQkJaXdsMzk0NV9jbGVhcl93aW5kb3coJnJzX3N0YS0+d2luW2ldKTsKLQotCS8qIFRPRE86IHdoYXQgaXMgYSBnb29kIHN0YXJ0aW5nIHJhdGUgZm9yIFNUQT8gQWJvdXQgbWlkZGxlPyBNYXliZSBub3QKLQkgKiB0aGUgbG93ZXN0IG9yIHRoZSBoaWdoZXN0IHJhdGUuLiBDb3VsZCBjb25zaWRlciB1c2luZyBSU1NJIGZyb20KLQkgKiBwcmV2aW91cyBwYWNrZXRzPyBOZWVkIHRvIGhhdmUgSUVFRSA4MDIuMVggYXV0aCBzdWNjZWVkIGltbWVkaWF0ZWx5Ci0JICogYWZ0ZXIgYXNzb2MuLiAqLwotCi0JZm9yIChpID0gc2JhbmQtPm5fYml0cmF0ZXMgLSAxOyBpID49IDA7IGktLSkgewotCQlpZiAoc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXSAmICgxIDw8IGkpKSB7Ci0JCQlyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByaXYtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXTsKLQkvKiBGb3IgNSBHSHogYmFuZCBpdCBzdGFydCBhdCBJV0xfRklSU1RfT0ZETV9SQVRFICovCi0JaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKLQkJcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHggKz0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJcHJpdi0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgPSBwcml2LT5fMzk0NS5zdGFfc3VwcF9yYXRlcyA8PAotCQkJCQkJSVdMX0ZJUlNUX09GRE1fUkFURTsKLQl9Ci0KLW91dDoKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkICppd2wzOTQ1X3JzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQotewotCXJldHVybiBody0+cHJpdjsKLX0KLQotLyogcmF0ZSBzY2FsZSByZXF1aXJlcyBmcmVlIGZ1bmN0aW9uIHRvIGJlIGltcGxlbWVudGVkICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3JzX2ZyZWUodm9pZCAqcHJpdikKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkICppd2wzOTQ1X3JzX2FsbG9jX3N0YSh2b2lkICppd2xfcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgZ2ZwX3QgZ2ZwKQotewotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhOwotCXN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2ICpwc3RhID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSBpd2xfcHJpdjsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJlbnRlclxuIik7Ci0KLQlyc19zdGEgPSAmcHN0YS0+cnNfc3RhOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnJzX3N0YS0+bG9jayk7Ci0JaW5pdF90aW1lcigmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gcnNfc3RhOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3JzX2ZyZWVfc3RhKHZvaWQgKml3bF9wcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJdm9pZCAqcHJpdl9zdGEpCi17Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGEgPSBwcml2X3N0YTsKLQotCS8qCi0JICogQmUgY2FyZWZ1bCBub3QgdG8gdXNlIGFueSBtZW1iZXJzIG9mIGl3bDM5NDVfcnNfc3RhIChsaWtlIHRyeWluZwotCSAqIHRvIHVzZSBpd2xfcHJpdiB0byBwcmludCBvdXQgZGVidWdnaW5nKSBzaW5jZSBpdCBtYXkgbm90IGJlIGZ1bGx5Ci0JICogaW5pdGlhbGl6ZWQgYXQgdGhpcyBwb2ludC4KLQkgKi8KLQlkZWxfdGltZXJfc3luYygmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoKTsKLX0KLQotCi0vKioKLSAqIGl3bDM5NDVfcnNfdHhfc3RhdHVzIC0gVXBkYXRlIHJhdGUgY29udHJvbCB2YWx1ZXMgYmFzZWQgb24gVHggcmVzdWx0cwotICoKLSAqIE5PVEU6IFVzZXMgaXdsX3ByaXYtPnJldHJ5X3JhdGUgZm9yIHRoZSAjIG9mIHJldHJpZXMgYXR0ZW1wdGVkIGJ5Ci0gKiB0aGUgaGFyZHdhcmUgZm9yIGVhY2ggcmF0ZS4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yc190eF9zdGF0dXModm9pZCAqcHJpdl9yYXRlLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXM4IHJldHJpZXMgPSAwLCBjdXJyZW50X2NvdW50OwotCWludCBzY2FsZV9yYXRlX2luZGV4LCBmaXJzdF9pbmRleCwgbGFzdF9pbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilwcml2X3JhdGU7Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGEgPSBwcml2X3N0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiZW50ZXJcbiIpOwotCi0JcmV0cmllcyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudDsKLQkvKiBTYW5pdHkgQ2hlY2sgZm9yIHJldHJpZXMgKi8KLQlpZiAocmV0cmllcyA+IElXTF9SQVRFX1JFVFJZX1RIKQotCQlyZXRyaWVzID0gSVdMX1JBVEVfUkVUUllfVEg7Ci0KLQlmaXJzdF9pbmRleCA9IHNiYW5kLT5iaXRyYXRlc1tpbmZvLT5zdGF0dXMucmF0ZXNbMF0uaWR4XS5od192YWx1ZTsKLQlpZiAoKGZpcnN0X2luZGV4IDwgMCkgfHwgKGZpcnN0X2luZGV4ID49IElXTF9SQVRFX0NPVU5UXzM5NDUpKSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZTogUmF0ZSBvdXQgb2YgYm91bmRzOiAlZFxuIiwgZmlyc3RfaW5kZXgpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFwcml2X3N0YSkgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmU6IE5vIFNUQSBwcml2IGRhdGEgdG8gdXBkYXRlIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBUcmVhdCB1bmluaXRpYWxpemVkIHJhdGUgc2NhbGluZyBkYXRhIHNhbWUgYXMgbm9uLWV4aXN0aW5nLiAqLwotCWlmICghcnNfc3RhLT5wcml2KSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZTogU1RBIHByaXYgZGF0YSB1bmluaXRpYWxpemVkIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQotCXJzX3N0YS0+dHhfcGFja2V0cysrOwotCi0Jc2NhbGVfcmF0ZV9pbmRleCA9IGZpcnN0X2luZGV4OwotCWxhc3RfaW5kZXggPSBmaXJzdF9pbmRleDsKLQotCS8qCi0JICogVXBkYXRlIHRoZSB3aW5kb3cgZm9yIGVhY2ggcmF0ZS4gIFdlIGRldGVybWluZSB3aGljaCByYXRlcwotCSAqIHdlcmUgVHgnZCBiYXNlZCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIHJldHJpZXMgdnMuIHRoZSBudW1iZXIKLQkgKiBvZiByZXRyaWVzIGNvbmZpZ3VyZWQgZm9yIGVhY2ggcmF0ZSAtLSBjdXJyZW50bHkgc2V0IHRvIHRoZQotCSAqIHByaXYgdmFsdWUgJ3JldHJ5X3JhdGUnIHZzLiByYXRlIHNwZWNpZmljCi0JICoKLQkgKiBPbiBleGl0IGZyb20gdGhpcyB3aGlsZSBsb29wIGxhc3RfaW5kZXggaW5kaWNhdGVzIHRoZSByYXRlCi0JICogYXQgd2hpY2ggdGhlIGZyYW1lIHdhcyBmaW5hbGx5IHRyYW5zbWl0dGVkIChvciBmYWlsZWQgaWYgbm8KLQkgKiBBQ0spCi0JICovCi0Jd2hpbGUgKHJldHJpZXMgPiAxKSB7Ci0JCWlmICgocmV0cmllcyAtIDEpIDwgcHJpdi0+cmV0cnlfcmF0ZSkgewotCQkJY3VycmVudF9jb3VudCA9IChyZXRyaWVzIC0gMSk7Ci0JCQlsYXN0X2luZGV4ID0gc2NhbGVfcmF0ZV9pbmRleDsKLQkJfSBlbHNlIHsKLQkJCWN1cnJlbnRfY291bnQgPSBwcml2LT5yZXRyeV9yYXRlOwotCQkJbGFzdF9pbmRleCA9IGl3bDM5NDVfcnNfbmV4dF9yYXRlKHByaXYsCi0JCQkJCQkJIHNjYWxlX3JhdGVfaW5kZXgpOwotCQl9Ci0KLQkJLyogVXBkYXRlIHRoaXMgcmF0ZSBhY2NvdW50aW5nIGZvciBhcyBtYW55IHJldHJpZXMKLQkJICogYXMgd2FzIHVzZWQgZm9yIGl0IChwZXIgY3VycmVudF9jb3VudCkgKi8KLQkJaXdsMzk0NV9jb2xsZWN0X3R4X2RhdGEocnNfc3RhLAotCQkJCSAgICAmcnNfc3RhLT53aW5bc2NhbGVfcmF0ZV9pbmRleF0sCi0JCQkJICAgIDAsIGN1cnJlbnRfY291bnQsIHNjYWxlX3JhdGVfaW5kZXgpOwotCQlJV0xfREVCVUdfUkFURShwcml2LCAiVXBkYXRlIHJhdGUgJWQgZm9yICVkIHJldHJpZXMuXG4iLAotCQkJICAgICAgIHNjYWxlX3JhdGVfaW5kZXgsIGN1cnJlbnRfY291bnQpOwotCi0JCXJldHJpZXMgLT0gY3VycmVudF9jb3VudDsKLQotCQlzY2FsZV9yYXRlX2luZGV4ID0gbGFzdF9pbmRleDsKLQl9Ci0KLQotCS8qIFVwZGF0ZSB0aGUgbGFzdCBpbmRleCB3aW5kb3cgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgYmFzZWQgb24gQUNLICovCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIlVwZGF0ZSByYXRlICVkIHdpdGggJXMuXG4iLAotCQkgICAgICAgbGFzdF9pbmRleCwKLQkJICAgICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSykgPwotCQkgICAgICAgInN1Y2Nlc3MiIDogImZhaWx1cmUiKTsKLQlpd2wzOTQ1X2NvbGxlY3RfdHhfZGF0YShyc19zdGEsCi0JCQkgICAgJnJzX3N0YS0+d2luW2xhc3RfaW5kZXhdLAotCQkJICAgIGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLLCAxLCBsYXN0X2luZGV4KTsKLQotCS8qIFdlIHVwZGF0ZWQgdGhlIHJhdGUgc2NhbGUgd2luZG93IC0tIGlmIGl0cyBiZWVuIG1vcmUgdGhhbgotCSAqIGZsdXNoX3RpbWUgc2luY2UgdGhlIGxhc3QgcnVuLCBzY2hlZHVsZSB0aGUgZmx1c2gKLQkgKiBhZ2FpbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCWlmICghcnNfc3RhLT5mbHVzaF9wZW5kaW5nICYmCi0JICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcnNfc3RhLT5sYXN0X2ZsdXNoICsKLQkJICAgICAgIHJzX3N0YS0+Zmx1c2hfdGltZSkpIHsKLQotCQlyc19zdGEtPmxhc3RfcGFydGlhbF9mbHVzaCA9IGppZmZpZXM7Ci0JCXJzX3N0YS0+Zmx1c2hfcGVuZGluZyA9IDE7Ci0JCW1vZF90aW1lcigmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoLAotCQkJICBqaWZmaWVzICsgcnNfc3RhLT5mbHVzaF90aW1lKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXN0YXRpYyB1MTYgaXdsMzk0NV9nZXRfYWRqYWNlbnRfcmF0ZShzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YSwKLQkJCQkgdTggaW5kZXgsIHUxNiByYXRlX21hc2ssIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQl1OCBoaWdoID0gSVdMX1JBVEVfSU5WQUxJRDsKLQl1OCBsb3cgPSBJV0xfUkFURV9JTlZBTElEOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+cHJpdjsKLQotCS8qIDgwMi4xMUEgd2Fsa3MgdG8gdGhlIG5leHQgbGl0ZXJhbCBhZGphY2VudCByYXRlIGluCi0JICogdGhlIHJhdGUgdGFibGUgKi8KLQlpZiAodW5saWtlbHkoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSkgewotCQlpbnQgaTsKLQkJdTMyIG1hc2s7Ci0KLQkJLyogRmluZCB0aGUgcHJldmlvdXMgcmF0ZSB0aGF0IGlzIGluIHRoZSByYXRlIG1hc2sgKi8KLQkJaSA9IGluZGV4IC0gMTsKLQkJZm9yIChtYXNrID0gKDEgPDwgaSk7IGkgPj0gMDsgaS0tLCBtYXNrID4+PSAxKSB7Ci0JCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgewotCQkJCWxvdyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBGaW5kIHRoZSBuZXh0IHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCi0JCWkgPSBpbmRleCArIDE7Ci0JCWZvciAobWFzayA9ICgxIDw8IGkpOyBpIDwgSVdMX1JBVEVfQ09VTlRfMzk0NTsKLQkJICAgICBpKyssIG1hc2sgPDw9IDEpIHsKLQkJCWlmIChyYXRlX21hc2sgJiBtYXNrKSB7Ci0JCQkJaGlnaCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGhpZ2ggPDwgOCkgfCBsb3c7Ci0JfQotCi0JbG93ID0gaW5kZXg7Ci0Jd2hpbGUgKGxvdyAhPSBJV0xfUkFURV9JTlZBTElEKSB7Ci0JCWlmIChyc19zdGEtPnRnZykKLQkJCWxvdyA9IGl3bDM5NDVfcmF0ZXNbbG93XS5wcmV2X3JzX3RnZzsKLQkJZWxzZQotCQkJbG93ID0gaXdsMzk0NV9yYXRlc1tsb3ddLnByZXZfcnM7Ci0JCWlmIChsb3cgPT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJCWJyZWFrOwotCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgbG93KSkKLQkJCWJyZWFrOwotCQlJV0xfREVCVUdfUkFURShwcml2LCAiU2tpcHBpbmcgbWFza2VkIGxvd2VyIHJhdGU6ICVkXG4iLCBsb3cpOwotCX0KLQotCWhpZ2ggPSBpbmRleDsKLQl3aGlsZSAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEKSB7Ci0JCWlmIChyc19zdGEtPnRnZykKLQkJCWhpZ2ggPSBpd2wzOTQ1X3JhdGVzW2hpZ2hdLm5leHRfcnNfdGdnOwotCQllbHNlCi0JCQloaWdoID0gaXdsMzk0NV9yYXRlc1toaWdoXS5uZXh0X3JzOwotCQlpZiAoaGlnaCA9PSBJV0xfUkFURV9JTlZBTElEKQotCQkJYnJlYWs7Ci0JCWlmIChyYXRlX21hc2sgJiAoMSA8PCBoaWdoKSkKLQkJCWJyZWFrOwotCQlJV0xfREVCVUdfUkFURShwcml2LCAiU2tpcHBpbmcgbWFza2VkIGhpZ2hlciByYXRlOiAlZFxuIiwgaGlnaCk7Ci0JfQotCi0JcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OwotfQotCi0vKioKLSAqIGl3bDM5NDVfcnNfZ2V0X3JhdGUgLSBmaW5kIHRoZSByYXRlIGZvciB0aGUgcmVxdWVzdGVkIHBhY2tldAotICoKLSAqIFJldHVybnMgdGhlIGllZWU4MDIxMV9yYXRlIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlci4KLSAqCi0gKiBUaGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBoYXMgbm8gaW50ZXJuYWwgbWFwcGluZyBiZXR3ZWVuIGh3X21vZGUncwotICogcmF0ZSBvcmRlcmluZyBhbmQgdGhlIHJhdGUgb3JkZXJpbmcgdXNlZCBieSB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobS4KLSAqCi0gKiBUaGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSB1c2VzIGEgc2luZ2xlIHRhYmxlIG9mIHJhdGVzIHRoYXQgZ29lcyBhY3Jvc3MKLSAqIHRoZSBlbnRpcmUgQS9CL0cgc3BlY3RydW0gdnMuIGJlaW5nIGxpbWl0ZWQgdG8ganVzdCBvbmUgcGFydGljdWxhcgotICogaHdfbW9kZS4KLSAqCi0gKiBBcyBzdWNoLCB3ZSBjYW4ndCBjb252ZXJ0IHRoZSBpbmRleCBvYnRhaW5lZCBiZWxvdyBpbnRvIHRoZSBod19tb2RlJ3MKLSAqIHJhdGUgdGFibGUgYW5kIG11c3QgcmVmZXJlbmNlIHRoZSBkcml2ZXIgYWxsb2NhdGVkIHJhdGUgdGFibGUKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnNfZ2V0X3JhdGUodm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJdm9pZCAqcHJpdl9zdGEsCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9jb250cm9sICp0eHJjKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0gdHhyYy0+c2JhbmQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cmMtPnNrYjsKLQl1OCBsb3cgPSBJV0xfUkFURV9JTlZBTElEOwotCXU4IGhpZ2ggPSBJV0xfUkFURV9JTlZBTElEOwotCXUxNiBoaWdoX2xvdzsKLQlpbnQgaW5kZXg7Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGEgPSBwcml2X3N0YTsKLQlzdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdyA9IE5VTEw7Ci0JaW50IGN1cnJlbnRfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JaW50IGxvd190cHQgPSBJV0xfSU5WQUxJRF9WQUxVRTsKLQlpbnQgaGlnaF90cHQgPSBJV0xfSU5WQUxJRF9WQUxVRTsKLQl1MzIgZmFpbF9jb3VudDsKLQlzOCBzY2FsZV9hY3Rpb24gPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IHJhdGVfbWFzazsKLQlzOCBtYXhfcmF0ZV9pZHggPSAtMTsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSAoc3RydWN0IGl3bF9wcml2ICopcHJpdl9yOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJlbnRlclxuIik7Ci0KLQkvKiBUcmVhdCB1bmluaXRpYWxpemVkIHJhdGUgc2NhbGluZyBkYXRhIHNhbWUgYXMgbm9uLWV4aXN0aW5nLiAqLwotCWlmIChyc19zdGEgJiYgIXJzX3N0YS0+cHJpdikgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAiUmF0ZSBzY2FsaW5nIGluZm9ybWF0aW9uIG5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKLQkJcHJpdl9zdGEgPSBOVUxMOwotCX0KLQotCWlmIChyYXRlX2NvbnRyb2xfc2VuZF9sb3coc3RhLCBwcml2X3N0YSwgdHhyYykpCi0JCXJldHVybjsKLQotCXJhdGVfbWFzayA9IHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF07Ci0KLQkvKiBnZXQgdXNlciBtYXggcmF0ZSBpZiBzZXQgKi8KLQltYXhfcmF0ZV9pZHggPSB0eHJjLT5tYXhfcmF0ZV9pZHg7Ci0JaWYgKChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSAmJiAobWF4X3JhdGVfaWR4ICE9IC0xKSkKLQkJbWF4X3JhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JaWYgKChtYXhfcmF0ZV9pZHggPCAwKSB8fCAobWF4X3JhdGVfaWR4ID49IElXTF9SQVRFX0NPVU5UKSkKLQkJbWF4X3JhdGVfaWR4ID0gLTE7Ci0KLQlpbmRleCA9IG1pbihyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCAmIDB4ZmZmZiwgSVdMX1JBVEVfQ09VTlRfMzk0NSAtIDEpOwotCi0JaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXJhdGVfbWFzayA9IHJhdGVfbWFzayA8PCBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JLyogZm9yIHJlY2VudCBhc3NvYywgY2hvb3NlIGJlc3QgcmF0ZSByZWdhcmRpbmcKLQkgKiB0byByc3NpIHZhbHVlCi0JICovCi0JaWYgKHJzX3N0YS0+c3RhcnRfcmF0ZSAhPSBJV0xfUkFURV9JTlZBTElEKSB7Ci0JCWlmIChyc19zdGEtPnN0YXJ0X3JhdGUgPCBpbmRleCAmJgotCQkgICAocmF0ZV9tYXNrICYgKDEgPDwgcnNfc3RhLT5zdGFydF9yYXRlKSkpCi0JCQlpbmRleCA9IHJzX3N0YS0+c3RhcnRfcmF0ZTsKLQkJcnNfc3RhLT5zdGFydF9yYXRlID0gSVdMX1JBVEVfSU5WQUxJRDsKLQl9Ci0KLQkvKiBmb3JjZSB1c2VyIG1heCByYXRlIGlmIHNldCBieSB1c2VyICovCi0JaWYgKChtYXhfcmF0ZV9pZHggIT0gLTEpICYmIChtYXhfcmF0ZV9pZHggPCBpbmRleCkpIHsKLQkJaWYgKHJhdGVfbWFzayAmICgxIDw8IG1heF9yYXRlX2lkeCkpCi0JCQlpbmRleCA9IG1heF9yYXRlX2lkeDsKLQl9Ci0KLQl3aW5kb3cgPSAmKHJzX3N0YS0+d2luW2luZGV4XSk7Ci0KLQlmYWlsX2NvdW50ID0gd2luZG93LT5jb3VudGVyIC0gd2luZG93LT5zdWNjZXNzX2NvdW50ZXI7Ci0KLQlpZiAoKChmYWlsX2NvdW50IDwgSVdMX1JBVEVfTUlOX0ZBSUxVUkVfVEgpICYmCi0JICAgICAod2luZG93LT5zdWNjZXNzX2NvdW50ZXIgPCBJV0xfUkFURV9NSU5fU1VDQ0VTU19USCkpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJJbnZhbGlkIGF2ZXJhZ2VfdHB0IG9uIHJhdGUgJWQ6ICIKLQkJCSAgICAgICAiY291bnRlcjogJWQsIHN1Y2Nlc3NfY291bnRlcjogJWQsICIKLQkJCSAgICAgICAiZXhwZWN0ZWRfdHB0IGlzICVzTlVMTFxuIiwKLQkJCSAgICAgICBpbmRleCwKLQkJCSAgICAgICB3aW5kb3ctPmNvdW50ZXIsCi0JCQkgICAgICAgd2luZG93LT5zdWNjZXNzX2NvdW50ZXIsCi0JCQkgICAgICAgcnNfc3RhLT5leHBlY3RlZF90cHQgPyAibm90ICIgOiAiIik7Ci0KLQkgICAvKiBDYW4ndCBjYWxjdWxhdGUgdGhpcyB5ZXQ7IG5vdCBlbm91Z2ggaGlzdG9yeSAqLwotCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JCWdvdG8gb3V0OwotCi0JfQotCi0JY3VycmVudF90cHQgPSB3aW5kb3ctPmF2ZXJhZ2VfdHB0OwotCi0JaGlnaF9sb3cgPSBpd2wzOTQ1X2dldF9hZGphY2VudF9yYXRlKHJzX3N0YSwgaW5kZXgsIHJhdGVfbWFzaywKLQkJCQkJICAgICBzYmFuZC0+YmFuZCk7Ci0JbG93ID0gaGlnaF9sb3cgJiAweGZmOwotCWhpZ2ggPSAoaGlnaF9sb3cgPj4gOCkgJiAweGZmOwotCi0JLyogSWYgdXNlciBzZXQgbWF4IHJhdGUsIGRvbnQgYWxsb3cgaGlnaGVyIHRoYW4gdXNlciBjb25zdHJhaW4gKi8KLQlpZiAoKG1heF9yYXRlX2lkeCAhPSAtMSkgJiYgKG1heF9yYXRlX2lkeCA8IGhpZ2gpKQotCQloaWdoID0gSVdMX1JBVEVfSU5WQUxJRDsKLQotCS8qIENvbGxlY3QgTWVhc3VyZWQgdGhyb3VnaHB1dHMgb2YgYWRqYWNlbnQgcmF0ZXMgKi8KLQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCWxvd190cHQgPSByc19zdGEtPndpbltsb3ddLmF2ZXJhZ2VfdHB0OwotCi0JaWYgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJaGlnaF90cHQgPSByc19zdGEtPndpbltoaWdoXS5hdmVyYWdlX3RwdDsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0Jc2NhbGVfYWN0aW9uID0gMDsKLQotCS8qIExvdyBzdWNjZXNzIHJhdGlvICwgbmVlZCB0byBkcm9wIHRoZSByYXRlICovCi0JaWYgKCh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPCBJV0xfUkFURV9ERUNSRUFTRV9USCkgfHwgIWN1cnJlbnRfdHB0KSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHN1Y2Nlc3NfcmF0aW9cbiIpOwotCQlzY2FsZV9hY3Rpb24gPSAtMTsKLQkvKiBObyB0aHJvdWdocHV0IG1lYXN1cmVkIHlldCBmb3IgYWRqYWNlbnQgcmF0ZXMsCi0JICogdHJ5IGluY3JlYXNlICovCi0JfSBlbHNlIGlmICgobG93X3RwdCA9PSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJICAgKGhpZ2hfdHB0ID09IElXTF9JTlZBTElEX1ZBTFVFKSkgewotCi0JCWlmIChoaWdoICE9IElXTF9SQVRFX0lOVkFMSUQgJiYgd2luZG93LT5zdWNjZXNzX3JhdGlvID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKQotCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJZWxzZSBpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlzY2FsZV9hY3Rpb24gPSAwOwotCi0JLyogQm90aCBhZGphY2VudCB0aHJvdWdocHV0cyBhcmUgbWVhc3VyZWQsIGJ1dCBuZWl0aGVyIG9uZSBoYXMKLQkgKiBiZXR0ZXIgdGhyb3VnaHB1dDsgd2UncmUgdXNpbmcgdGhlIGJlc3QgcmF0ZSwgZG9uJ3QgY2hhbmdlCi0JICogaXQhICovCi0JfSBlbHNlIGlmICgobG93X3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChoaWdoX3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChsb3dfdHB0IDwgY3VycmVudF90cHQpICYmIChoaWdoX3RwdCA8IGN1cnJlbnRfdHB0KSkgewotCi0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJObyBhY3Rpb24gLS0gbG93IFslZF0gJiBoaWdoIFslZF0gPCAiCi0JCQkgICAgICAgImN1cnJlbnRfdHB0IFslZF1cbiIsCi0JCQkgICAgICAgbG93X3RwdCwgaGlnaF90cHQsIGN1cnJlbnRfdHB0KTsKLQkJc2NhbGVfYWN0aW9uID0gMDsKLQotCS8qIEF0IGxlYXN0IG9uZSBvZiB0aGUgcmF0ZXMgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCi0JfSBlbHNlIHsKLQkJaWYgKGhpZ2hfdHB0ICE9IElXTF9JTlZBTElEX1ZBTFVFKSB7Ci0KLQkJCS8qIEhpZ2ggcmF0ZSBoYXMgYmV0dGVyIHRocm91Z2hwdXQsIEluY3JlYXNlCi0JCQkgKiByYXRlICovCi0JCQlpZiAoaGlnaF90cHQgPiBjdXJyZW50X3RwdCAmJgotCQkJCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUkFURV9JTkNSRUFTRV9USCkKLQkJCQlzY2FsZV9hY3Rpb24gPSAxOwotCQkJZWxzZSB7Ci0JCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkgICAgImRlY3JlYXNlIHJhdGUgYmVjYXVzZSBvZiBoaWdoIHRwdFxuIik7Ci0JCQkJc2NhbGVfYWN0aW9uID0gMDsKLQkJCX0KLQkJfSBlbHNlIGlmIChsb3dfdHB0ICE9IElXTF9JTlZBTElEX1ZBTFVFKSB7Ci0JCQlpZiAobG93X3RwdCA+IGN1cnJlbnRfdHB0KSB7Ci0JCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkgICAgImRlY3JlYXNlIHJhdGUgYmVjYXVzZSBvZiBsb3cgdHB0XG4iKTsKLQkJCQlzY2FsZV9hY3Rpb24gPSAtMTsKLQkJCX0gZWxzZSBpZiAod2luZG93LT5zdWNjZXNzX3JhdGlvID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKSB7Ci0JCQkJLyogTG93ZXIgcmF0ZSBoYXMgYmV0dGVyCi0JCQkJICogdGhyb3VnaHB1dCxkZWNyZWFzZSByYXRlICovCi0JCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFNhbml0eSBjaGVjazsgYXNrZWQgZm9yIGRlY3JlYXNlLCBidXQgc3VjY2VzcyByYXRlIG9yIHRocm91Z2hwdXQKLQkgKiBoYXMgYmVlbiBnb29kIGF0IG9sZCByYXRlLiAgRG9uJ3QgY2hhbmdlIGl0LiAqLwotCWlmICgoc2NhbGVfYWN0aW9uID09IC0xKSAmJiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpICYmCi0JCSAgICAoKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+IElXTF9SQVRFX0hJR0hfVEgpIHx8Ci0JCSAgICAgKGN1cnJlbnRfdHB0ID4gKDEwMCAqIHJzX3N0YS0+ZXhwZWN0ZWRfdHB0W2xvd10pKSkpCi0JCXNjYWxlX2FjdGlvbiA9IDA7Ci0KLQlzd2l0Y2ggKHNjYWxlX2FjdGlvbikgewotCWNhc2UgLTE6Ci0KLQkJLyogRGVjcmVzZSByYXRlICovCi0JCWlmIChsb3cgIT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJCWluZGV4ID0gbG93OwotCQlicmVhazsKLQotCWNhc2UgMToKLQkJLyogSW5jcmVhc2UgcmF0ZSAqLwotCQlpZiAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEKQotCQkJaW5kZXggPSBoaWdoOwotCi0JCWJyZWFrOwotCi0JY2FzZSAwOgotCWRlZmF1bHQ6Ci0JCS8qIE5vIGNoYW5nZSAqLwotCQlicmVhazsKLQl9Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiU2VsZWN0ZWQgJWQgKGFjdGlvbiAlZCkgLSBsb3cgJWQgaGlnaCAlZFxuIiwKLQkJICAgICAgIGluZGV4LCBzY2FsZV9hY3Rpb24sIGxvdywgaGlnaCk7Ci0KLSBvdXQ6Ci0KLQlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgewotCQlpZiAoV0FSTl9PTl9PTkNFKGluZGV4IDwgSVdMX0ZJUlNUX09GRE1fUkFURSkpCi0JCQlpbmRleCA9IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaW5kZXg7Ci0JCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gaW5kZXggLSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCX0gZWxzZSB7Ci0JCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaW5kZXg7Ci0JCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHg7Ci0JfQotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImxlYXZlOiAlZFxuIiwgaW5kZXgpOwotfQotCi0jaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKLXN0YXRpYyBpbnQgaXdsMzk0NV9vcGVuX2ZpbGVfZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3N0YV9kYmdmc19zdGF0c190YWJsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgKmJ1ZmY7Ci0JaW50IGRlc2MgPSAwOwotCWludCBqOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MgKz0gc3ByaW50ZihidWZmICsgZGVzYywgInR4IHBhY2tldHM9JWQgbGFzdCByYXRlIGluZGV4PSVkXG4iCi0JCQkicmF0ZT0weCVYIGZsdXNoIHRpbWUgJWRcbiIsCi0JCQlscV9zdGEtPnR4X3BhY2tldHMsCi0JCQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCwKLQkJCWxxX3N0YS0+c3RhcnRfcmF0ZSwgamlmZmllc190b19tc2VjcyhscV9zdGEtPmZsdXNoX3RpbWUpKTsKLQlmb3IgKGogPSAwOyBqIDwgSVdMX1JBVEVfQ09VTlRfMzk0NTsgaisrKSB7Ci0JCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkJImNvdW50ZXI9JWQgc3VjY2Vzcz0lZCAlJT0lZFxuIiwKLQkJCQlscV9zdGEtPndpbltqXS5jb3VudGVyLAotCQkJCWxxX3N0YS0+d2luW2pdLnN1Y2Nlc3NfY291bnRlciwKLQkJCQlscV9zdGEtPndpbltqXS5zdWNjZXNzX3JhdGlvKTsKLQl9Ci0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKLQlrZnJlZShidWZmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzID0gewotCS5yZWFkID0gaXdsMzk0NV9zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZCwKLQkub3BlbiA9IGl3bDM5NDVfb3Blbl9maWxlX2dlbmVyaWMsCi0JLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAotfTsKLQotc3RhdGljIHZvaWQgaXdsMzk0NV9hZGRfZGVidWdmcyh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSwKLQkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpCi17Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpscV9zdGEgPSBwcml2X3N0YTsKLQotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUgPQotCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3N0YXRzX3RhYmxlIiwgMDYwMCwgZGlyLAotCQlscV9zdGEsICZyc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzKTsKLQotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3JlbW92ZV9kZWJ1Z2ZzKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhKQotewotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0JZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZSk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIEluaXRpYWxpemF0aW9uIG9mIHJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBpcyBkb25lIGJ5IGRyaXZlciBhZnRlcgotICogdGhlIHN0YXRpb24gaXMgYWRkZWQuIFNpbmNlIG1hYzgwMjExIGNhbGxzIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGEKLSAqIHN0YXRpb24gaXMgYWRkZWQgd2UgaWdub3JlIGl0LgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3JzX3JhdGVfaW5pdF9zdHViKHZvaWQgKnByaXZfciwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhKQotewotfQotCi1zdGF0aWMgc3RydWN0IHJhdGVfY29udHJvbF9vcHMgcnNfb3BzID0gewotCS5tb2R1bGUgPSBOVUxMLAotCS5uYW1lID0gUlNfTkFNRSwKLQkudHhfc3RhdHVzID0gaXdsMzk0NV9yc190eF9zdGF0dXMsCi0JLmdldF9yYXRlID0gaXdsMzk0NV9yc19nZXRfcmF0ZSwKLQkucmF0ZV9pbml0ID0gaXdsMzk0NV9yc19yYXRlX2luaXRfc3R1YiwKLQkuYWxsb2MgPSBpd2wzOTQ1X3JzX2FsbG9jLAotCS5mcmVlID0gaXdsMzk0NV9yc19mcmVlLAotCS5hbGxvY19zdGEgPSBpd2wzOTQ1X3JzX2FsbG9jX3N0YSwKLQkuZnJlZV9zdGEgPSBpd2wzOTQ1X3JzX2ZyZWVfc3RhLAotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JLmFkZF9zdGFfZGVidWdmcyA9IGl3bDM5NDVfYWRkX2RlYnVnZnMsCi0JLnJlbW92ZV9zdGFfZGVidWdmcyA9IGl3bDM5NDVfcmVtb3ZlX2RlYnVnZnMsCi0jZW5kaWYKLQotfTsKLXZvaWQgaXdsMzk0NV9yYXRlX3NjYWxlX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHMzMiBzdGFfaWQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JczMyIHJzc2kgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKLQlzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiAqcHN0YTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJlbnRlclxuIik7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEocHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10udmlmLAotCQkJCSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7Ci0JaWYgKCFzdGEpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlVuYWJsZSB0byBmaW5kIHN0YXRpb24gdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcuXG4iKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwc3RhID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKLQlyc19zdGEgPSAmcHN0YS0+cnNfc3RhOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JcnNfc3RhLT50Z2cgPSAwOwotCXN3aXRjaCAocHJpdi0+YmFuZCkgewotCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKLQkJLyogVE9ETzogdGhpcyBhbHdheXMgZG9lcyBHLCBub3QgYSByZWdyZXNzaW9uICovCi0JCWlmIChwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5hY3RpdmUuZmxhZ3MgJgotCQkJCQkJUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLKSB7Ci0JCQlyc19zdGEtPnRnZyA9IDE7Ci0JCQlyc19zdGEtPmV4cGVjdGVkX3RwdCA9IGl3bDM5NDVfZXhwZWN0ZWRfdHB0X2dfcHJvdDsKLQkJfSBlbHNlCi0JCQlyc19zdGEtPmV4cGVjdGVkX3RwdCA9IGl3bDM5NDVfZXhwZWN0ZWRfdHB0X2c7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQlyc19zdGEtPmV4cGVjdGVkX3RwdCA9IGl3bDM5NDVfZXhwZWN0ZWRfdHB0X2E7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX05VTV9CQU5EUzoKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JcnNzaSA9IHByaXYtPl8zOTQ1Lmxhc3RfcnhfcnNzaTsKLQlpZiAocnNzaSA9PSAwKQotCQlyc3NpID0gSVdMX01JTl9SU1NJX1ZBTDsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJOZXR3b3JrIFJTU0k6ICVkXG4iLCByc3NpKTsKLQotCXJzX3N0YS0+c3RhcnRfcmF0ZSA9IGl3bDM5NDVfZ2V0X3JhdGVfaW5kZXhfYnlfcnNzaShyc3NpLCBwcml2LT5iYW5kKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZTogcnNzaSAlZCBhc3NpZ24gcmF0ZSBpbmRleDogIgotCQkgICAgICAgIiVkIChwbGNwIDB4JXgpXG4iLCByc3NpLCByc19zdGEtPnN0YXJ0X3JhdGUsCi0JCSAgICAgICBpd2wzOTQ1X3JhdGVzW3JzX3N0YS0+c3RhcnRfcmF0ZV0ucGxjcCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLWludCBpd2wzOTQ1X3JhdGVfY29udHJvbF9yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiBpZWVlODAyMTFfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCZyc19vcHMpOwotfQotCi12b2lkIGl3bDM5NDVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIodm9pZCkKLXsKLQlpZWVlODAyMTFfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoJnJzX29wcyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjMGE3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1maC5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LWZoLmgiCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LmgiCi0jaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtbGVkLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUtbGVkLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUtZGVidWdmcy5oIgotCi0jZGVmaW5lIElXTF9ERUNMQVJFX1JBVEVfSU5GTyhyLCBpcCwgaW4sIHJwLCBybiwgcHAsIG5wKSAgICBcCi0JW0lXTF9SQVRFXyMjciMjTV9JTkRFWF0gPSB7IElXTF9SQVRFXyMjciMjTV9QTENQLCAgIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNyIyNNX0lFRUUsICAgXAotCQkJCSAgICBJV0xfUkFURV8jI2lwIyNNX0lOREVYLCBcCi0JCQkJICAgIElXTF9SQVRFXyMjaW4jI01fSU5ERVgsIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNycCMjTV9JTkRFWCwgXAotCQkJCSAgICBJV0xfUkFURV8jI3JuIyNNX0lOREVYLCBcCi0JCQkJICAgIElXTF9SQVRFXyMjcHAjI01fSU5ERVgsIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNucCMjTV9JTkRFWCwgXAotCQkJCSAgICBJV0xfUkFURV8jI3IjI01fSU5ERVhfVEFCTEUsIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNpcCMjTV9JTkRFWF9UQUJMRSB9Ci0KLS8qCi0gKiBQYXJhbWV0ZXIgb3JkZXI6Ci0gKiAgIHJhdGUsIHByZXYgcmF0ZSwgbmV4dCByYXRlLCBwcmV2IHRnZyByYXRlLCBuZXh0IHRnZyByYXRlCi0gKgotICogSWYgdGhlcmUgaXNuJ3QgYSB2YWxpZCBuZXh0IG9yIHByZXZpb3VzIHJhdGUgdGhlbiBJTlYgaXMgdXNlZCB3aGljaAotICogbWFwcyB0byBJV0xfUkFURV9JTlZBTElECi0gKgotICovCi1jb25zdCBzdHJ1Y3QgaXdsMzk0NV9yYXRlX2luZm8gaXdsMzk0NV9yYXRlc1tJV0xfUkFURV9DT1VOVF8zOTQ1XSA9IHsKLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMSwgSU5WLCAyLCBJTlYsIDIsIElOViwgMiksICAgIC8qICAxbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTygyLCAxLCA1LCAxLCA1LCAxLCA1KSwgICAgICAgICAgLyogIDJtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDUsIDIsIDYsIDIsIDExLCAyLCAxMSksICAgICAgICAvKjUuNW1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTEsIDksIDEyLCA1LCAxMiwgNSwgMTgpLCAgICAgIC8qIDExbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg2LCA1LCA5LCA1LCAxMSwgNSwgMTEpLCAgICAgICAgLyogIDZtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDksIDYsIDExLCA1LCAxMSwgNSwgMTEpLCAgICAgICAvKiAgOW1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTIsIDExLCAxOCwgMTEsIDE4LCAxMSwgMTgpLCAgIC8qIDEybWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTygxOCwgMTIsIDI0LCAxMiwgMjQsIDExLCAyNCksICAgLyogMThtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDI0LCAxOCwgMzYsIDE4LCAzNiwgMTgsIDM2KSwgICAvKiAyNG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMzYsIDI0LCA0OCwgMjQsIDQ4LCAyNCwgNDgpLCAgIC8qIDM2bWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg0OCwgMzYsIDU0LCAzNiwgNTQsIDM2LCA1NCksICAgLyogNDhtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDU0LCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA1NG1icHMgKi8KLX07Ci0KLXN0YXRpYyBpbmxpbmUgdTggaXdsMzk0NV9nZXRfcHJldl9pZWVlX3JhdGUodTggcmF0ZV9pbmRleCkKLXsKLQl1OCByYXRlID0gaXdsMzk0NV9yYXRlc1tyYXRlX2luZGV4XS5wcmV2X2llZWU7Ci0KLQlpZiAocmF0ZSA9PSBJV0xfUkFURV9JTlZBTElEKQotCQlyYXRlID0gcmF0ZV9pbmRleDsKLQlyZXR1cm4gcmF0ZTsKLX0KLQotLyogMSA9IGVuYWJsZSB0aGUgaXdsMzk0NV9kaXNhYmxlX2V2ZW50cygpIGZ1bmN0aW9uICovCi0jZGVmaW5lIElXTF9FVlRfRElTQUJMRSAoMCkKLSNkZWZpbmUgSVdMX0VWVF9ESVNBQkxFX1NJWkUgKDE1MzIvMzIpCi0KLS8qKgotICogaXdsMzk0NV9kaXNhYmxlX2V2ZW50cyAtIERpc2FibGUgc2VsZWN0ZWQgZXZlbnRzIGluIHVDb2RlIGV2ZW50IGxvZwotICoKLSAqIERpc2FibGUgYW4gZXZlbnQgYnkgd3JpdGluZyAiMSJzIGludG8gImRpc2FibGUiCi0gKiAgIGJpdG1hcCBpbiBTUkFNLiAgQml0IHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIEV2ZW50ICMgKGlkL3R5cGUpLgotICogICBEZWZhdWx0IHZhbHVlcyBvZiAwIGVuYWJsZSB1Q29kZSBldmVudHMgdG8gYmUgbG9nZ2VkLgotICogVXNlIGZvciBvbmx5IHNwZWNpYWwgZGVidWdnaW5nLiAgVGhpcyBmdW5jdGlvbiBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgYXMtaXMsCi0gKiAgIHlvdSdsbCBuZWVkIHRvIHByb3ZpZGUgdGhlIHNwZWNpYWwgYml0cyEgLi4uCi0gKiAgIC4uLiBhbmQgc2V0IElXTF9FVlRfRElTQUJMRSB0byAxLiAqLwotdm9pZCBpd2wzOTQ1X2Rpc2FibGVfZXZlbnRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgaTsKLQl1MzIgYmFzZTsJCS8qIFNSQU0gYWRkcmVzcyBvZiBldmVudCBsb2cgaGVhZGVyICovCi0JdTMyIGRpc2FibGVfcHRyOwkvKiBTUkFNIGFkZHJlc3Mgb2YgZXZlbnQtZGlzYWJsZSBiaXRtYXAgYXJyYXkgKi8KLQl1MzIgYXJyYXlfc2l6ZTsJCS8qICMgb2YgdTMyIGVudHJpZXMgaW4gYXJyYXkgKi8KLQlzdGF0aWMgY29uc3QgdTMyIGV2dF9kaXNhYmxlW0lXTF9FVlRfRElTQUJMRV9TSVpFXSA9IHsKLQkJMHgwMDAwMDAwMCwJLyogICAzMSAtICAgIDAgIEV2ZW50IGlkIG51bWJlcnMgKi8KLQkJMHgwMDAwMDAwMCwJLyogICA2MyAtICAgMzIgKi8KLQkJMHgwMDAwMDAwMCwJLyogICA5NSAtICAgNjQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDEyNyAtICAgOTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDE1OSAtICAxMjggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDE5MSAtICAxNjAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDIyMyAtICAxOTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDI1NSAtICAyMjQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDI4NyAtICAyNTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDMxOSAtICAyODggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDM1MSAtICAzMjAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDM4MyAtICAzNTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDQxNSAtICAzODQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDQ0NyAtICA0MTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDQ3OSAtICA0NDggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDUxMSAtICA0ODAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDU0MyAtICA1MTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDU3NSAtICA1NDQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDYwNyAtICA1NzYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDYzOSAtICA2MDggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDY3MSAtICA2NDAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDcwMyAtICA2NzIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDczNSAtICA3MDQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDc2NyAtICA3MzYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDc5OSAtICA3NjggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDgzMSAtICA4MDAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDg2MyAtICA4MzIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDg5NSAtICA4NjQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDkyNyAtICA4OTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDk1OSAtICA5MjggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDk5MSAtICA5NjAgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTAyMyAtICA5OTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTA1NSAtIDEwMjQgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTA4NyAtIDEwNTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTExOSAtIDEwODggKi8KLQkJMHgwMDAwMDAwMCwJLyogMTE1MSAtIDExMjAgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTE4MyAtIDExNTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTIxNSAtIDExODQgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTI0NyAtIDEyMTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTI3OSAtIDEyNDggKi8KLQkJMHgwMDAwMDAwMCwJLyogMTMxMSAtIDEyODAgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTM0MyAtIDEzMTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTM3NSAtIDEzNDQgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTQwNyAtIDEzNzYgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTQzOSAtIDE0MDggKi8KLQkJMHgwMDAwMDAwMCwJLyogMTQ3MSAtIDE0NDAgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTUwMyAtIDE0NzIgKi8KLQl9OwotCi0JYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmUubG9nX2V2ZW50X3RhYmxlX3B0cik7Ci0JaWYgKCFpd2wzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKLQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBldmVudCBsb2cgcG9pbnRlciAweCUwOFhcbiIsIGJhc2UpOwotCQlyZXR1cm47Ci0JfQotCi0JZGlzYWJsZV9wdHIgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArICg0ICogc2l6ZW9mKHUzMikpKTsKLQlhcnJheV9zaXplID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAoNSAqIHNpemVvZih1MzIpKSk7Ci0KLQlpZiAoSVdMX0VWVF9ESVNBQkxFICYmIChhcnJheV9zaXplID09IElXTF9FVlRfRElTQUJMRV9TSVpFKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRGlzYWJsaW5nIHNlbGVjdGVkIHVDb2RlIGxvZyBldmVudHMgYXQgMHgleFxuIiwKLQkJCSAgICAgICBkaXNhYmxlX3B0cik7Ci0JCWZvciAoaSA9IDA7IGkgPCBJV0xfRVZUX0RJU0FCTEVfU0laRTsgaSsrKQotCQkJaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LAotCQkJCQkgICBkaXNhYmxlX3B0ciArIChpICogc2l6ZW9mKHUzMikpLAotCQkJCQkgICBldnRfZGlzYWJsZVtpXSk7Ci0KLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2VsZWN0ZWQgdUNvZGUgbG9nIGV2ZW50cyBtYXkgYmUgZGlzYWJsZWRcbiIpOwotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiICBieSB3cml0aW5nIFwiMVwicyBpbnRvIGRpc2FibGUgYml0bWFwXG4iKTsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIiAgaW4gU1JBTSBhdCAweCV4LCBzaXplICVkIHUzMnNcbiIsCi0JCQkgICAgICAgZGlzYWJsZV9wdHIsIGFycmF5X3NpemUpOwotCX0KLQotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfaHdyYXRlX3RvX3BsY3BfaWR4KHU4IHBsY3ApCi17Ci0JaW50IGlkeDsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgSVdMX1JBVEVfQ09VTlRfMzk0NTsgaWR4KyspCi0JCWlmIChpd2wzOTQ1X3JhdGVzW2lkeF0ucGxjcCA9PSBwbGNwKQotCQkJcmV0dXJuIGlkeDsKLQlyZXR1cm4gLTE7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLSNkZWZpbmUgVFhfU1RBVFVTX0VOVFJZKHgpIGNhc2UgVFhfMzk0NV9TVEFUVVNfRkFJTF8gIyMgeDogcmV0dXJuICN4Ci0KLXN0YXRpYyBjb25zdCBjaGFyICppd2wzOTQ1X2dldF90eF9mYWlsX3JlYXNvbih1MzIgc3RhdHVzKQotewotCXN3aXRjaCAoc3RhdHVzICYgVFhfU1RBVFVTX01TSykgewotCWNhc2UgVFhfMzk0NV9TVEFUVVNfU1VDQ0VTUzoKLQkJcmV0dXJuICJTVUNDRVNTIjsKLQkJVFhfU1RBVFVTX0VOVFJZKFNIT1JUX0xJTUlUKTsKLQkJVFhfU1RBVFVTX0VOVFJZKExPTkdfTElNSVQpOwotCQlUWF9TVEFUVVNfRU5UUlkoRklGT19VTkRFUlJVTik7Ci0JCVRYX1NUQVRVU19FTlRSWShNR01OVF9BQk9SVCk7Ci0JCVRYX1NUQVRVU19FTlRSWShORVhUX0ZSQUcpOwotCQlUWF9TVEFUVVNfRU5UUlkoTElGRV9FWFBJUkUpOwotCQlUWF9TVEFUVVNfRU5UUlkoREVTVF9QUyk7Ci0JCVRYX1NUQVRVU19FTlRSWShBQk9SVEVEKTsKLQkJVFhfU1RBVFVTX0VOVFJZKEJUX1JFVFJZKTsKLQkJVFhfU1RBVFVTX0VOVFJZKFNUQV9JTlZBTElEKTsKLQkJVFhfU1RBVFVTX0VOVFJZKEZSQUdfRFJPUFBFRCk7Ci0JCVRYX1NUQVRVU19FTlRSWShUSURfRElTQUJMRSk7Ci0JCVRYX1NUQVRVU19FTlRSWShGUkFNRV9GTFVTSEVEKTsKLQkJVFhfU1RBVFVTX0VOVFJZKElOU1VGRklDSUVOVF9DRl9QT0xMKTsKLQkJVFhfU1RBVFVTX0VOVFJZKFRYX0xPQ0tFRCk7Ci0JCVRYX1NUQVRVU19FTlRSWShOT19CRUFDT05fT05fUkFEQVIpOwotCX0KLQotCXJldHVybiAiVU5LTk9XTiI7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICppd2wzOTQ1X2dldF90eF9mYWlsX3JlYXNvbih1MzIgc3RhdHVzKQotewotCXJldHVybiAiIjsKLX0KLSNlbmRpZgotCi0vKgotICogZ2V0IGllZWUgcHJldiByYXRlIGZyb20gcmF0ZSBzY2FsZSB0YWJsZS4KLSAqIGZvciBBIGFuZCBCIG1vZGUgd2UgbmVlZCB0byBvdmVycmlnaHQgcHJldgotICogdmFsdWUKLSAqLwotaW50IGl3bDM5NDVfcnNfbmV4dF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHJhdGUpCi17Ci0JaW50IG5leHRfcmF0ZSA9IGl3bDM5NDVfZ2V0X3ByZXZfaWVlZV9yYXRlKHJhdGUpOwotCi0Jc3dpdGNoIChwcml2LT5iYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQlpZiAocmF0ZSA9PSBJV0xfUkFURV8xMk1fSU5ERVgpCi0JCQluZXh0X3JhdGUgPSBJV0xfUkFURV85TV9JTkRFWDsKLQkJZWxzZSBpZiAocmF0ZSA9PSBJV0xfUkFURV82TV9JTkRFWCkKLQkJCW5leHRfcmF0ZSA9IElXTF9SQVRFXzZNX0lOREVYOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6Ci0JCWlmICghKHByaXYtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzICYgSVdMX09GRE1fUkFURVNfTUFTSykgJiYKLQkJICAgIGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkgewotCQkJaWYgKHJhdGUgPT0gSVdMX1JBVEVfMTFNX0lOREVYKQotCQkJCW5leHRfcmF0ZSA9IElXTF9SQVRFXzVNX0lOREVYOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIG5leHRfcmF0ZTsKLX0KLQotCi0vKioKLSAqIGl3bDM5NDVfdHhfcXVldWVfcmVjbGFpbSAtIFJlY2xhaW0gVHggcXVldWUgZW50cmllcyBhbHJlYWR5IFR4J2QKLSAqCi0gKiBXaGVuIEZXIGFkdmFuY2VzICdSJyBpbmRleCwgYWxsIGVudHJpZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyAnUicgaW5kZXgKLSAqIG5lZWQgdG8gYmUgcmVjbGFpbWVkLiBBcyByZXN1bHQsIHNvbWUgZnJlZSBzcGFjZSBmb3Jtcy4gSWYgdGhlcmUgaXMKLSAqIGVub3VnaCBmcmVlIHNwYWNlICg+IGxvdyBtYXJrKSwgd2FrZSB0aGUgc3RhY2sgdGhhdCBmZWVkcyB1cy4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV90eF9xdWV1ZV9yZWNsYWltKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgIGludCB0eHFfaWQsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7Ci0Jc3RydWN0IGl3bF90eF9pbmZvICp0eF9pbmZvOwotCi0JQlVHX09OKHR4cV9pZCA9PSBJV0wzOV9DTURfUVVFVUVfTlVNKTsKLQotCWZvciAoaW5kZXggPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKGluZGV4LCBxLT5uX2JkKTsKLQkJcS0+cmVhZF9wdHIgIT0gaW5kZXg7Ci0JCXEtPnJlYWRfcHRyID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKLQotCQl0eF9pbmZvID0gJnR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl07Ci0JCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShwcml2LT5odywgdHhfaW5mby0+c2tiKTsKLQkJdHhfaW5mby0+c2tiID0gTlVMTDsKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2ZyZWVfdGZkKHByaXYsIHR4cSk7Ci0JfQotCi0JaWYgKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UocSkgPiBxLT5sb3dfbWFyayAmJiAodHhxX2lkID49IDApICYmCi0JCQkodHhxX2lkICE9IElXTDM5X0NNRF9RVUVVRV9OVU0pICYmCi0JCQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKQotCQlpd2xfbGVnYWN5X3dha2VfcXVldWUocHJpdiwgdHhxKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3J4X3JlcGx5X3R4IC0gSGFuZGxlIFR4IHJlc3BvbnNlCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfcmVwbHlfdHgoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXUxNiBzZXF1ZW5jZSA9IGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKTsKLQlpbnQgdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcXVlbmNlKTsKLQlpbnQgaW5kZXggPSBTRVFfVE9fSU5ERVgoc2VxdWVuY2UpOwotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87Ci0Jc3RydWN0IGl3bDM5NDVfdHhfcmVzcCAqdHhfcmVzcCA9ICh2b2lkICopJnBrdC0+dS5yYXdbMF07Ci0JdTMyICBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0eF9yZXNwLT5zdGF0dXMpOwotCWludCByYXRlX2lkeDsKLQlpbnQgZmFpbDsKLQotCWlmICgoaW5kZXggPj0gdHhxLT5xLm5fYmQpIHx8IChpd2xfbGVnYWN5X3F1ZXVlX3VzZWQoJnR4cS0+cSwgaW5kZXgpID09IDApKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpbmRleCAlZCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkXG4iLCB0eHFfaWQsCi0JCQkgIGluZGV4LCB0eHEtPnEubl9iZCwgdHhxLT5xLndyaXRlX3B0ciwKLQkJCSAgdHhxLT5xLnJlYWRfcHRyKTsKLQkJcmV0dXJuOwotCX0KLQotCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7Ci0JaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IpOwotCWllZWU4MDIxMV90eF9pbmZvX2NsZWFyX3N0YXR1cyhpbmZvKTsKLQotCS8qIEZpbGwgdGhlIE1SUiBjaGFpbiB3aXRoIHNvbWUgaW5mbyBhYm91dCBvbi1jaGlwIHJldHJhbnNtaXNzaW9ucyAqLwotCXJhdGVfaWR4ID0gaXdsMzk0NV9od3JhdGVfdG9fcGxjcF9pZHgodHhfcmVzcC0+cmF0ZSk7Ci0JaWYgKGluZm8tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJcmF0ZV9pZHggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQotCWZhaWwgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lOwotCi0JaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeCA9IHJhdGVfaWR4OwotCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IGZhaWwgKyAxOyAvKiBhZGQgZmluYWwgYXR0ZW1wdCAqLwotCi0JLyogdHhfc3RhdHVzLT5ydHNfcmV0cnlfY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX3J0czsgKi8KLQlpbmZvLT5mbGFncyB8PSAoKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spID09IFRYX1NUQVRVU19TVUNDRVNTKSA/Ci0JCQkJSUVFRTgwMjExX1RYX1NUQVRfQUNLIDogMDsKLQotCUlXTF9ERUJVR19UWChwcml2LCAiVHggcXVldWUgJWQgU3RhdHVzICVzICgweCUwOHgpIHBsY3AgcmF0ZSAlZCByZXRyaWVzICVkXG4iLAotCQkJdHhxX2lkLCBpd2wzOTQ1X2dldF90eF9mYWlsX3JlYXNvbihzdGF0dXMpLCBzdGF0dXMsCi0JCQl0eF9yZXNwLT5yYXRlLCB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lKTsKLQotCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiVHggcXVldWUgcmVjbGFpbSAlZFxuIiwgaW5kZXgpOwotCWl3bDM5NDVfdHhfcXVldWVfcmVjbGFpbShwcml2LCB0eHFfaWQsIGluZGV4KTsKLQotCWlmIChzdGF0dXMgJiBUWF9BQk9SVF9SRVFVSVJFRF9NU0spCi0JCUlXTF9FUlIocHJpdiwgIlRPRE86ICBJbXBsZW1lbnQgVHggQUJPUlQgUkVRVUlSRUQhISFcbiIpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogSW50ZWwgUFJPL1dpcmVsZXNzIDM5NDVBQkcvQkcgTmV0d29yayBDb25uZWN0aW9uCi0gKgotICogIFJYIGhhbmRsZXIgaW1wbGVtZW50YXRpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIF9fbGUzMiAqc3RhdHMpCi17Ci0JaW50IGk7Ci0JX19sZTMyICpwcmV2X3N0YXRzOwotCXUzMiAqYWNjdW1fc3RhdHM7Ci0JdTMyICpkZWx0YSwgKm1heF9kZWx0YTsKLQotCXByZXZfc3RhdHMgPSAoX19sZTMyICopJnByaXYtPl8zOTQ1LnN0YXRpc3RpY3M7Ci0JYWNjdW1fc3RhdHMgPSAodTMyICopJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3M7Ci0JZGVsdGEgPSAodTMyICopJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3M7Ci0JbWF4X2RlbHRhID0gKHUzMiAqKSZwcml2LT5fMzk0NS5tYXhfZGVsdGE7Ci0KLQlmb3IgKGkgPSBzaXplb2YoX19sZTMyKTsgaSA8IHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzKTsKLQkgICAgIGkgKz0gc2l6ZW9mKF9fbGUzMiksIHN0YXRzKyssIHByZXZfc3RhdHMrKywgZGVsdGErKywKLQkgICAgIG1heF9kZWx0YSsrLCBhY2N1bV9zdGF0cysrKSB7Ci0JCWlmIChsZTMyX3RvX2NwdSgqc3RhdHMpID4gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKSB7Ci0JCQkqZGVsdGEgPSAobGUzMl90b19jcHUoKnN0YXRzKSAtCi0JCQkJbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKTsKLQkJCSphY2N1bV9zdGF0cyArPSAqZGVsdGE7Ci0JCQlpZiAoKmRlbHRhID4gKm1heF9kZWx0YSkKLQkJCQkqbWF4X2RlbHRhID0gKmRlbHRhOwotCQl9Ci0JfQotCi0JLyogcmVzZXQgYWNjdW11bGF0aXZlIHN0YXRpc3RpY3MgZm9yICJuby1jb3VudGVyIiB0eXBlIHN0YXRpc3RpY3MgKi8KLQlwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwudGVtcGVyYXR1cmUgPQotCQlwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmdlbmVyYWwudGVtcGVyYXR1cmU7Ci0JcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsLnR0bF90aW1lc3RhbXAgPQotCQlwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmdlbmVyYWwudHRsX3RpbWVzdGFtcDsKLX0KLSNlbmRpZgotCi12b2lkIGl3bDM5NDVfaHdfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKLQkJICAgICAoaW50KXNpemVvZihzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzKSwKLQkJICAgICBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIEZIX1JTQ1NSX0ZSQU1FX1NJWkVfTVNLKTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotCWl3bDM5NDVfYWNjdW11bGF0aXZlX3N0YXRpc3RpY3MocHJpdiwgKF9fbGUzMiAqKSZwa3QtPnUucmF3KTsKLSNlbmRpZgotCi0JbWVtY3B5KCZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLCBwa3QtPnUucmF3LCBzaXplb2YocHJpdi0+XzM5NDUuc3RhdGlzdGljcykpOwotfQotCi12b2lkIGl3bDM5NDVfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlfX2xlMzIgKmZsYWcgPSAoX19sZTMyICopJnBrdC0+dS5yYXc7Ci0KLQlpZiAobGUzMl90b19jcHUoKmZsYWcpICYgVUNPREVfU1RBVElTVElDU19DTEVBUl9NU0spIHsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotCQltZW1zZXQoJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MsIDAsCi0JCQlzaXplb2Yoc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcykpOwotCQltZW1zZXQoJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3MsIDAsCi0JCQlzaXplb2Yoc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcykpOwotCQltZW1zZXQoJnByaXYtPl8zOTQ1Lm1heF9kZWx0YSwgMCwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzKSk7Ci0jZW5kaWYKLQkJSVdMX0RFQlVHX1JYKHByaXYsICJTdGF0aXN0aWNzIGhhdmUgYmVlbiBjbGVhcmVkXG4iKTsKLQl9Ci0JaXdsMzk0NV9od19yeF9zdGF0aXN0aWNzKHByaXYsIHJ4Yik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1pc2MuIGludGVybmFsIHN0YXRlIGFuZCBoZWxwZXIgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBpcyBuZWNlc3Nhcnkgb25seSBmb3IgYSBudW1iZXIgb2Ygc3RhdGlzdGljcywgc2VlIHRoZSBjYWxsZXIuICovCi1zdGF0aWMgaW50IGl3bDM5NDVfaXNfbmV0d29ya19wYWNrZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQotewotCS8qIEZpbHRlciBpbmNvbWluZyBwYWNrZXRzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSB0YXJnZXRlZCB0b3dhcmQKLQkgKiB0aGlzIG5ldHdvcmssIGRpc2NhcmRpbmcgcGFja2V0cyBjb21pbmcgZnJvbSBvdXJzZWx2ZXMgKi8KLQlzd2l0Y2ggKHByaXYtPml3X21vZGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOiAvKiBIZWFkZXI6IERlc3QuIHwgU291cmNlICAgIHwgQlNTSUQgKi8KLQkJLyogcGFja2V0cyB0byBvdXIgSUJTUyB1cGRhdGUgaW5mb3JtYXRpb24gKi8KLQkJcmV0dXJuICFjb21wYXJlX2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMywgcHJpdi0+YnNzaWQpOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjogLyogSGVhZGVyOiBEZXN0LiB8IEFQe0JTU0lEfSB8IFNvdXJjZSAqLwotCQkvKiBwYWNrZXRzIHRvIG91ciBJQlNTIHVwZGF0ZSBpbmZvcm1hdGlvbiAqLwotCQlyZXR1cm4gIWNvbXBhcmVfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIyLCBwcml2LT5ic3NpZCk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDE7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHMpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKUlXTF9SWF9EQVRBKHBrdCk7Ci0Jc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfaGRyICpyeF9oZHIgPSBJV0xfUlhfSERSKHBrdCk7Ci0Jc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfZW5kICpyeF9lbmQgPSBJV0xfUlhfRU5EKHBrdCk7Ci0JdTE2IGxlbiA9IGxlMTZfdG9fY3B1KHJ4X2hkci0+bGVuKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKLQotCS8qIFdlIHJlY2VpdmVkIGRhdGEgZnJvbSB0aGUgSFcsIHNvIHN0b3AgdGhlIHdhdGNoZG9nICovCi0JaWYgKHVubGlrZWx5KGxlbiArIElXTDM5X1JYX0ZSQU1FX1NJWkUgPgotCQkgICAgIFBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcikpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgIkNvcnJ1cHRpb24gZGV0ZWN0ZWQhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFdlIG9ubHkgcHJvY2VzcyBkYXRhIHBhY2tldHMgaWYgdGhlIGludGVyZmFjZSBpcyBvcGVuICovCi0JaWYgKHVubGlrZWx5KCFwcml2LT5pc19vcGVuKSkgewotCQlJV0xfREVCVUdfRFJPUF9MSU1JVChwcml2LAotCQkJIkRyb3BwaW5nIHBhY2tldCB3aGlsZSBpbnRlcmZhY2UgaXMgbm90IG9wZW4uXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKLQlpZiAoIXNrYikgewotCQlJV0xfRVJSKHByaXYsICJkZXZfYWxsb2Nfc2tiIGZhaWxlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIWl3bDM5NDVfbW9kX3BhcmFtcy5zd19jcnlwdG8pCi0JCWl3bF9sZWdhY3lfc2V0X2RlY3J5cHRlZF9mbGFnKHByaXYsCi0JCQkJICAgICAgIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXJ4Yl9hZGRyKHJ4YiksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KHJ4X2VuZC0+c3RhdHVzKSwgc3RhdHMpOwotCi0Jc2tiX2FkZF9yeF9mcmFnKHNrYiwgMCwgcnhiLT5wYWdlLAotCQkJKHZvaWQgKilyeF9oZHItPnBheWxvYWQgLSAodm9pZCAqKXBrdCwgbGVuKTsKLQotCWl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzKHByaXYsIGZhbHNlLCBmYywgbGVuKTsKLQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHNrYiksIHN0YXRzLCBzaXplb2YoKnN0YXRzKSk7Ci0KLQlpZWVlODAyMTFfcngocHJpdi0+aHcsIHNrYik7Ci0JcHJpdi0+YWxsb2NfcnhiX3BhZ2UtLTsKLQlyeGItPnBhZ2UgPSBOVUxMOwotfQotCi0jZGVmaW5lIElXTF9ERUxBWV9ORVhUX1NDQU5fQUZURVJfQVNTT0MgKEhaKjYpCi0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfcmVwbHlfcngoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX3N0YXRzICpyeF9zdGF0cyA9IElXTF9SWF9TVEFUUyhwa3QpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2hkciAqcnhfaGRyID0gSVdMX1JYX0hEUihwa3QpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2VuZCAqcnhfZW5kID0gSVdMX1JYX0VORChwa3QpOwotCXUxNiByeF9zdGF0c19zaWdfYXZnIF9fbWF5YmVfdW51c2VkID0gbGUxNl90b19jcHUocnhfc3RhdHMtPnNpZ19hdmcpOwotCXUxNiByeF9zdGF0c19ub2lzZV9kaWZmIF9fbWF5YmVfdW51c2VkID0gbGUxNl90b19jcHUocnhfc3RhdHMtPm5vaXNlX2RpZmYpOwotCXU4IG5ldHdvcmtfcGFja2V0OwotCi0Jcnhfc3RhdHVzLmZsYWcgPSAwOwotCXJ4X3N0YXR1cy5tYWN0aW1lID0gbGU2NF90b19jcHUocnhfZW5kLT50aW1lc3RhbXApOwotCXJ4X3N0YXR1cy5iYW5kID0gKHJ4X2hkci0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19CQU5EXzI0X01TSykgPwotCQkJCUlFRUU4MDIxMV9CQU5EXzJHSFogOiBJRUVFODAyMTFfQkFORF81R0haOwotCXJ4X3N0YXR1cy5mcmVxID0KLQkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGxlMTZfdG9fY3B1KHJ4X2hkci0+Y2hhbm5lbCksCi0JCQkJCSAgICAgICByeF9zdGF0dXMuYmFuZCk7Ci0KLQlyeF9zdGF0dXMucmF0ZV9pZHggPSBpd2wzOTQ1X2h3cmF0ZV90b19wbGNwX2lkeChyeF9oZHItPnJhdGUpOwotCWlmIChyeF9zdGF0dXMuYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlyeF9zdGF0dXMucmF0ZV9pZHggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQotCXJ4X3N0YXR1cy5hbnRlbm5hID0gKGxlMTZfdG9fY3B1KHJ4X2hkci0+cGh5X2ZsYWdzKSAmCi0JCQkJCVJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spID4+IDQ7Ci0KLQkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KLQlpZiAocnhfaGRyLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX1NIT1JUX1BSRUFNQkxFX01TSykKLQkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19TSE9SVFBSRTsKLQotCWlmICgodW5saWtlbHkocnhfc3RhdHMtPnBoeV9jb3VudCA+IDIwKSkpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgImRzcCBzaXplIG91dCBvZiByYW5nZSBbMCwyMF06ICVkL24iLAotCQkJCXJ4X3N0YXRzLT5waHlfY291bnQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEocnhfZW5kLT5zdGF0dXMgJiBSWF9SRVNfU1RBVFVTX05PX0NSQzMyX0VSUk9SKQotCSAgICB8fCAhKHJ4X2VuZC0+c3RhdHVzICYgUlhfUkVTX1NUQVRVU19OT19SWEVfT1ZFUkZMT1cpKSB7Ci0JCUlXTF9ERUJVR19SWChwcml2LCAiQmFkIENSQyBvciBGSUZPOiAweCUwOFguXG4iLCByeF9lbmQtPnN0YXR1cyk7Ci0JCXJldHVybjsKLQl9Ci0KLQotCi0JLyogQ29udmVydCAzOTQ1J3MgcnNzaSBpbmRpY2F0b3IgdG8gZEJtICovCi0Jcnhfc3RhdHVzLnNpZ25hbCA9IHJ4X3N0YXRzLT5yc3NpIC0gSVdMMzlfUlNTSV9PRkZTRVQ7Ci0KLQlJV0xfREVCVUdfU1RBVFMocHJpdiwgIlJzc2kgJWQgc2lnX2F2ZyAlZCBub2lzZV9kaWZmICVkXG4iLAotCQkJcnhfc3RhdHVzLnNpZ25hbCwgcnhfc3RhdHNfc2lnX2F2ZywKLQkJCXJ4X3N0YXRzX25vaXNlX2RpZmYpOwotCi0JaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopSVdMX1JYX0RBVEEocGt0KTsKLQotCW5ldHdvcmtfcGFja2V0ID0gaXdsMzk0NV9pc19uZXR3b3JrX3BhY2tldChwcml2LCBoZWFkZXIpOwotCi0JSVdMX0RFQlVHX1NUQVRTX0xJTUlUKHByaXYsICJbJWNdICVkIFJTU0k6JWQgU2lnbmFsOiV1LCBSYXRlOiV1XG4iLAotCQkJICAgICAgbmV0d29ya19wYWNrZXQgPyAnKicgOiAnICcsCi0JCQkgICAgICBsZTE2X3RvX2NwdShyeF9oZHItPmNoYW5uZWwpLAotCQkJICAgICAgcnhfc3RhdHVzLnNpZ25hbCwgcnhfc3RhdHVzLnNpZ25hbCwKLQkJCSAgICAgIHJ4X3N0YXR1cy5yYXRlX2lkeCk7Ci0KLQlpd2xfbGVnYWN5X2RiZ19sb2dfcnhfZGF0YV9mcmFtZShwcml2LCBsZTE2X3RvX2NwdShyeF9oZHItPmxlbiksCi0JCQkJCQloZWFkZXIpOwotCi0JaWYgKG5ldHdvcmtfcGFja2V0KSB7Ci0JCXByaXYtPl8zOTQ1Lmxhc3RfYmVhY29uX3RpbWUgPQotCQkJbGUzMl90b19jcHUocnhfZW5kLT5iZWFjb25fdGltZXN0YW1wKTsKLQkJcHJpdi0+XzM5NDUubGFzdF90c2YgPSBsZTY0X3RvX2NwdShyeF9lbmQtPnRpbWVzdGFtcCk7Ci0JCXByaXYtPl8zOTQ1Lmxhc3RfcnhfcnNzaSA9IHJ4X3N0YXR1cy5zaWduYWw7Ci0JfQotCi0JaXdsMzk0NV9wYXNzX3BhY2tldF90b19tYWM4MDIxMShwcml2LCByeGIsICZyeF9zdGF0dXMpOwotfQotCi1pbnQgaXdsMzk0NV9od190eHFfYXR0YWNoX2J1Zl90b190ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkJCSAgICAgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLCB1OCByZXNldCwgdTggcGFkKQotewotCWludCBjb3VudDsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwotCXN0cnVjdCBpd2wzOTQ1X3RmZCAqdGZkLCAqdGZkX3RtcDsKLQotCXEgPSAmdHhxLT5xOwotCXRmZF90bXAgPSAoc3RydWN0IGl3bDM5NDVfdGZkICopdHhxLT50ZmRzOwotCXRmZCA9ICZ0ZmRfdG1wW3EtPndyaXRlX3B0cl07Ci0KLQlpZiAocmVzZXQpCi0JCW1lbXNldCh0ZmQsIDAsIHNpemVvZigqdGZkKSk7Ci0KLQljb3VudCA9IFRGRF9DVExfQ09VTlRfR0VUKGxlMzJfdG9fY3B1KHRmZC0+Y29udHJvbF9mbGFncykpOwotCi0JaWYgKChjb3VudCA+PSBOVU1fVEZEX0NIVU5LUykgfHwgKGNvdW50IDwgMCkpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3IgY2FuIG5vdCBzZW5kIG1vcmUgdGhhbiAlZCBjaHVua3NcbiIsCi0JCQkgIE5VTV9URkRfQ0hVTktTKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdGZkLT50YnNbY291bnRdLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKLQl0ZmQtPnRic1tjb3VudF0ubGVuID0gY3B1X3RvX2xlMzIobGVuKTsKLQotCWNvdW50Kys7Ci0KLQl0ZmQtPmNvbnRyb2xfZmxhZ3MgPSBjcHVfdG9fbGUzMihURkRfQ1RMX0NPVU5UX1NFVChjb3VudCkgfAotCQkJCQkgVEZEX0NUTF9QQURfU0VUKHBhZCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od190eHFfZnJlZV90ZmQgLSBGcmVlIG9uZSBURkQsIHRob3NlIGF0IGluZGV4IFt0eHEtPnEucmVhZF9wdHJdCi0gKgotICogRG9lcyBOT1QgYWR2YW5jZSBhbnkgaW5kZXhlcwotICovCi12b2lkIGl3bDM5NDVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQotewotCXN0cnVjdCBpd2wzOTQ1X3RmZCAqdGZkX3RtcCA9IChzdHJ1Y3QgaXdsMzk0NV90ZmQgKil0eHEtPnRmZHM7Ci0JaW50IGluZGV4ID0gdHhxLT5xLnJlYWRfcHRyOwotCXN0cnVjdCBpd2wzOTQ1X3RmZCAqdGZkID0gJnRmZF90bXBbaW5kZXhdOwotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBwcml2LT5wY2lfZGV2OwotCWludCBpOwotCWludCBjb3VudGVyOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JY291bnRlciA9IFRGRF9DVExfQ09VTlRfR0VUKGxlMzJfdG9fY3B1KHRmZC0+Y29udHJvbF9mbGFncykpOwotCWlmIChjb3VudGVyID4gTlVNX1RGRF9DSFVOS1MpIHsKLQkJSVdMX0VSUihwcml2LCAiVG9vIG1hbnkgY2h1bmtzOiAlaVxuIiwgY291bnRlcik7Ci0JCS8qIEB0b2RvIGlzc3VlIGZhdGFsIGVycm9yLCBpdCBpcyBxdWl0ZSBzZXJpb3VzIHNpdHVhdGlvbiAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogVW5tYXAgdHhfY21kICovCi0JaWYgKGNvdW50ZXIpCi0JCXBjaV91bm1hcF9zaW5nbGUoZGV2LAotCQkJCWRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaW5kZXhdLCBtYXBwaW5nKSwKLQkJCQlkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaW5kZXhdLCBsZW4pLAotCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JLyogdW5tYXAgY2h1bmtzIGlmIGFueSAqLwotCi0JZm9yIChpID0gMTsgaSA8IGNvdW50ZXI7IGkrKykKLQkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGxlMzJfdG9fY3B1KHRmZC0+dGJzW2ldLmFkZHIpLAotCQkJIGxlMzJfdG9fY3B1KHRmZC0+dGJzW2ldLmxlbiksIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JLyogZnJlZSBTS0IgKi8KLQlpZiAodHhxLT50eGIpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCQlza2IgPSB0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYjsKLQotCQkvKiBjYW4gYmUgY2FsbGVkIGZyb20gaXJxcy1kaXNhYmxlZCBjb250ZXh0ICovCi0JCWlmIChza2IpIHsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQl0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYiA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19idWlsZF90eF9jbWRfcmF0ZSAtIEFkZCByYXRlIHBvcnRpb24gdG8gVFhfQ01EOgotICoKLSovCi12b2lkIGl3bDM5NDVfaHdfYnVpbGRfdHhfY21kX3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJCSAgaW50IHN0YV9pZCwgaW50IHR4X2lkKQotewotCXUxNiBod192YWx1ZSA9IGllZWU4MDIxMV9nZXRfdHhfcmF0ZShwcml2LT5odywgaW5mbyktPmh3X3ZhbHVlOwotCXUxNiByYXRlX2luZGV4ID0gbWluKGh3X3ZhbHVlICYgMHhmZmZmLCBJV0xfUkFURV9DT1VOVF8zOTQ1KTsKLQl1MTYgcmF0ZV9tYXNrOwotCWludCByYXRlOwotCXU4IHJ0c19yZXRyeV9saW1pdDsKLQl1OCBkYXRhX3JldHJ5X2xpbWl0OwotCV9fbGUzMiB0eF9mbGFnczsKLQlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0Jc3RydWN0IGl3bDM5NDVfdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IGl3bDM5NDVfdHhfY21kICopY21kLT5jbWQucGF5bG9hZDsKLQotCXJhdGUgPSBpd2wzOTQ1X3JhdGVzW3JhdGVfaW5kZXhdLnBsY3A7Ci0JdHhfZmxhZ3MgPSB0eF9jbWQtPnR4X2ZsYWdzOwotCi0JLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBnZXQgdGhlIHN0YS0+c3VwcF9yYXRlcyB3aGlsZQotCSAqIGluIHRoaXMgcnVubmluZyBjb250ZXh0ICovCi0JcmF0ZV9tYXNrID0gSVdMX1JBVEVTX01BU0tfMzk0NTsKLQotCS8qIFNldCByZXRyeSBsaW1pdCBvbiBEQVRBIHBhY2tldHMgYW5kIFByb2JlIFJlc3BvbnNlcyovCi0JaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSkKLQkJZGF0YV9yZXRyeV9saW1pdCA9IDM7Ci0JZWxzZQotCQlkYXRhX3JldHJ5X2xpbWl0ID0gSVdMX0RFRkFVTFRfVFhfUkVUUlk7Ci0JdHhfY21kLT5kYXRhX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKLQotCWlmICh0eF9pZCA+PSBJV0wzOV9DTURfUVVFVUVfTlVNKQotCQlydHNfcmV0cnlfbGltaXQgPSAzOwotCWVsc2UKLQkJcnRzX3JldHJ5X2xpbWl0ID0gNzsKLQotCWlmIChkYXRhX3JldHJ5X2xpbWl0IDwgcnRzX3JldHJ5X2xpbWl0KQotCQlydHNfcmV0cnlfbGltaXQgPSBkYXRhX3JldHJ5X2xpbWl0OwotCXR4X2NtZC0+cnRzX3JldHJ5X2xpbWl0ID0gcnRzX3JldHJ5X2xpbWl0OwotCi0JdHhfY21kLT5yYXRlID0gcmF0ZTsKLQl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7Ci0KLQkvKiBPRkRNICovCi0JdHhfY21kLT5zdXBwX3JhdGVzWzBdID0KLQkgICAoKHJhdGVfbWFzayAmIElXTF9PRkRNX1JBVEVTX01BU0spID4+IElXTF9GSVJTVF9PRkRNX1JBVEUpICYgMHhGRjsKLQotCS8qIENDSyAqLwotCXR4X2NtZC0+c3VwcF9yYXRlc1sxXSA9IChyYXRlX21hc2sgJiAweEYpOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIlR4IHN0YSBpZDogJWQsIHJhdGU6ICVkIChwbGNwKSwgZmxhZ3M6IDB4JTRYICIKLQkJICAgICAgICJjY2svb2ZkbSBtYXNrOiAweCV4LzB4JXhcbiIsIHN0YV9pZCwKLQkJICAgICAgIHR4X2NtZC0+cmF0ZSwgbGUzMl90b19jcHUodHhfY21kLT50eF9mbGFncyksCi0JCSAgICAgICB0eF9jbWQtPnN1cHBfcmF0ZXNbMV0sIHR4X2NtZC0+c3VwcF9yYXRlc1swXSk7Ci19Ci0KLXN0YXRpYyB1OCBpd2wzOTQ1X3N5bmNfc3RhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHN0YV9pZCwgdTE2IHR4X3JhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKLQotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikKLQkJcmV0dXJuIElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCXN0YXRpb24gPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXTsKLQotCXN0YXRpb24tPnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX1RYX1JBVEVfTVNLOwotCXN0YXRpb24tPnN0YS5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUxNih0eF9yYXRlKTsKLQlzdGF0aW9uLT5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YXRpb24tPnN0YSwgQ01EX0FTWU5DKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiU0NBTEUgc3luYyBzdGF0aW9uICVkIHRvIHJhdGUgJWRcbiIsCi0JCQlzdGFfaWQsIHR4X3JhdGUpOwotCXJldHVybiBzdGFfaWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfc2V0X3B3cl92bWFpbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0vKgotICogKGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzKQotICogdG8gc2V0IHBvd2VyIHRvIFZfQVVYLCBkbwotCi0JCWlmIChwY2lfcG1lX2NhcGFibGUocHJpdi0+cGNpX2RldiwgUENJX0QzY29sZCkpIHsKLQkJCWl3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQkJCUFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WQVVYLAotCQkJCQl+QVBNR19QU19DVFJMX01TS19QV1JfU1JDKTsKLQotCQkJaXdsX3BvbGxfYml0KHByaXYsIENTUl9HUElPX0lOLAotCQkJCSAgICAgQ1NSX0dQSU9fSU5fVkFMX1ZBVVhfUFdSX1NSQywKLQkJCQkgICAgIENTUl9HUElPX0lOX0JJVF9BVVhfUE9XRVIsIDUwMDApOwotCQl9Ci0gKi8KLQotCWl3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQlBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVk1BSU4sCi0JCQl+QVBNR19QU19DVFJMX01TS19QV1JfU1JDKTsKLQotCWl3bF9wb2xsX2JpdChwcml2LCBDU1JfR1BJT19JTiwgQ1NSX0dQSU9fSU5fVkFMX1ZNQUlOX1BXUl9TUkMsCi0JCSAgICAgQ1NSX0dQSU9fSU5fQklUX0FVWF9QT1dFUiwgNTAwMCk7CS8qIHVTICovCi19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9yeF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9SQ1NSX1JCRF9CQVNFKDApLCByeHEtPmJkX2RtYSk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X1JDU1JfUlBUUl9BRERSKDApLAotCQkJCQlyeHEtPnJiX3N0dHNfZG1hKTsKLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfUkNTUl9XUFRSKDApLCAwKTsKLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfUkNTUl9DT05GSUcoMCksCi0JCUZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTl9FTkFCTEUgfAotCQlGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkRSQkRfRU5fRU5BQkxFIHwKLQkJRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfQklUX1dSX1NUVFNfRU4gfAotCQlGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjggfAotCQkoUlhfUVVFVUVfU0laRV9MT0cgPDwgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfUE9TX1JCRENfU0laRSkgfAotCQlGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfSVJRX0RFU1RfSU5UX0hPU1QgfAotCQkoMSA8PCBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfSVJRX1JCVEgpIHwKLQkJRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0ZIKTsKLQotCS8qIGZha2UgcmVhZCB0byBmbHVzaCBhbGwgcHJldiBJL08gKi8KLQlpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgRkgzOV9SU1NSX0NUUkwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV90eF9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0KLQkvKiBieXBhc3MgbW9kZSAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBTE1fU0NEX01PREVfUkVHLCAweDIpOwotCi0JLyogUkEgMCBpcyBhY3RpdmUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9BUkFTVEFUX1JFRywgMHgwMSk7Ci0KLQkvKiBhbGwgNiBmaWZvIGFyZSBhY3RpdmUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9UWEZBQ1RfUkVHLCAweDNmKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBTE1fU0NEX1NCWVBfTU9ERV8xX1JFRywgMHgwMTAwMDApOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBTE1fU0NEX1NCWVBfTU9ERV8yX1JFRywgMHgwMzAwMDIpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBTE1fU0NEX1RYRjRNRl9SRUcsIDB4MDAwMDA0KTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9UWEY1TUZfUkVHLCAweDAwMDAwNSk7Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfVFNTUl9DQkJfQkFTRSwKLQkJCSAgICAgcHJpdi0+XzM5NDUuc2hhcmVkX3BoeXMpOwotCi0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X1RTU1JfTVNHX0NPTkZJRywKLQkJRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9UWFBEX09OIHwKLQkJRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SRF9UWFBEX09OIHwKLQkJRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOEIgfAotCQlGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX1NOT09QX1JEX1RGRF9PTiB8Ci0JCUZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUkRfQ0JCX09OIHwKLQkJRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SU1BfV0FJVF9USCB8Ci0JCUZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfUlNQX1dBSVRfVEgpOwotCi0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3R4cV9jdHhfcmVzZXQgLSBSZXNldCBUWCBxdWV1ZSBjb250ZXh0Ci0gKgotICogRGVzdHJveXMgYWxsIERNQSBzdHJ1Y3R1cmVzIGFuZCBpbml0aWFsaXplIHRoZW0gYWdhaW4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3R4cV9jdHhfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByYzsKLQlpbnQgdHhxX2lkLCBzbG90c19udW07Ci0KLQlpd2wzOTQ1X2h3X3R4cV9jdHhfZnJlZShwcml2KTsKLQotCS8qIGFsbG9jYXRlIHR4IHF1ZXVlIHN0cnVjdHVyZSAqLwotCXJjID0gaXdsX2xlZ2FjeV9hbGxvY190eHFfbWVtKHByaXYpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JLyogVHggQ01EIHF1ZXVlICovCi0JcmMgPSBpd2wzOTQ1X3R4X3Jlc2V0KHByaXYpOwotCWlmIChyYykKLQkJZ290byBlcnJvcjsKLQotCS8qIFR4IHF1ZXVlKHMpICovCi0JZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKSB7Ci0JCXNsb3RzX251bSA9ICh0eHFfaWQgPT0gSVdMMzlfQ01EX1FVRVVFX05VTSkgPwotCQkJCVRGRF9DTURfU0xPVFMgOiBURkRfVFhfQ01EX1NMT1RTOwotCQlyYyA9IGl3bF9sZWdhY3lfdHhfcXVldWVfaW5pdChwcml2LCAmcHJpdi0+dHhxW3R4cV9pZF0sCi0JCQkJCQlzbG90c19udW0sIHR4cV9pZCk7Ci0JCWlmIChyYykgewotCQkJSVdMX0VSUihwcml2LCAiVHggJWQgcXVldWUgaW5pdCBmYWlsZWRcbiIsIHR4cV9pZCk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJjOwotCi0gZXJyb3I6Ci0JaXdsMzk0NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0JcmV0dXJuIHJjOwotfQotCi0KLS8qCi0gKiBTdGFydCB1cCAzOTQ1J3MgYmFzaWMgZnVuY3Rpb25hbGl0eSBhZnRlciBpdCBoYXMgYmVlbiByZXNldAotICogKGUuZy4gYWZ0ZXIgcGxhdGZvcm0gYm9vdCwgb3Igc2h1dGRvd24gdmlhIGl3bF9sZWdhY3lfYXBtX3N0b3AoKSkKLSAqIE5PVEU6ICBUaGlzIGRvZXMgbm90IGxvYWQgdUNvZGUgbm9yIHN0YXJ0IHRoZSBlbWJlZGRlZCBwcm9jZXNzb3IKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X2FwbV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gaXdsX2xlZ2FjeV9hcG1faW5pdChwcml2KTsKLQotCS8qIENsZWFyIEFQTUcgKE5JQydzIGludGVybmFsIHBvd2VyIG1hbmFnZW1lbnQpIGludGVycnVwdHMgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQVBNR19SVENfSU5UX01TS19SRUcsIDB4MCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFQTUdfUlRDX0lOVF9TVFRfUkVHLCAweEZGRkZGRkZGKTsKLQotCS8qIFJlc2V0IHJhZGlvIGNoaXAgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXRzX3BycGgocHJpdiwgQVBNR19QU19DVFJMX1JFRywKLQkJCQlBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUSk7Ci0JdWRlbGF5KDUpOwotCWl3bF9sZWdhY3lfY2xlYXJfYml0c19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQkJQVBNR19QU19DVFJMX1ZBTF9SRVNFVF9SRVEpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9uaWNfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCByZXZfaWQgPSBwcml2LT5wY2lfZGV2LT5yZXZpc2lvbjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBEZXRlcm1pbmUgSFcgdHlwZSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJIVyBSZXZpc2lvbiBJRCA9IDB4JVhcbiIsIHJldl9pZCk7Ci0KLQlpZiAocmV2X2lkICYgUENJX0NGR19SRVZfSURfQklUX1JUUCkKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJUUCB0eXBlXG4iKTsKLQllbHNlIGlmIChyZXZfaWQgJiBQQ0lfQ0ZHX1JFVl9JRF9CSVRfQkFTSUNfU0tVKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICIzOTQ1IFJBRElPLU1CIHR5cGVcbiIpOwotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfMzk0NV9NQik7Ci0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIjM5NDUgUkFESU8tTU0gdHlwZVxuIik7Ci0JCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCSAgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF8zOTQ1X01NKTsKLQl9Ci0KLQlpZiAoRUVQUk9NX1NLVV9DQVBfT1BfTU9ERV9NUkMgPT0gZWVwcm9tLT5za3VfY2FwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJTS1UgT1AgbW9kZSBpcyBtcmNcbiIpOwotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfU0tVX01SQyk7Ci0JfSBlbHNlCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJTS1UgT1AgbW9kZSBpcyBiYXNpY1xuIik7Ci0KLQlpZiAoKGVlcHJvbS0+Ym9hcmRfcmV2aXNpb24gJiAweEYwKSA9PSAweEQwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICIzOTQ1QUJHIHJldmlzaW9uIGlzIDB4JVhcbiIsCi0JCQkgICAgICAgZWVwcm9tLT5ib2FyZF9yZXZpc2lvbik7Ci0JCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCSAgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF9CT0FSRF9UWVBFKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiMzk0NUFCRyByZXZpc2lvbiBpcyAweCVYXG4iLAotCQkJICAgICAgIGVlcHJvbS0+Ym9hcmRfcmV2aXNpb24pOwotCQlpd2xfbGVnYWN5X2NsZWFyX2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCSAgICAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUX0JPQVJEX1RZUEUpOwotCX0KLQotCWlmIChlZXByb20tPmFsbWdvcl9tX3ZlcnNpb24gPD0gMSkgewotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9BKTsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNhcmQgTSB0eXBlIEEgdmVyc2lvbiBpcyAweCVYXG4iLAotCQkJICAgICAgIGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbik7Ci0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNhcmQgTSB0eXBlIEIgdmVyc2lvbiBpcyAweCVYXG4iLAotCQkJICAgICAgIGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbik7Ci0JCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCSAgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVFNfU0lMSUNPTl9UWVBFX0IpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZWVwcm9tLT5za3VfY2FwICYgRUVQUk9NX1NLVV9DQVBfU1dfUkZfS0lMTF9FTkFCTEUpCi0JCUlXTF9ERUJVR19SRl9LSUxMKHByaXYsICJTVyBSRiBLSUxMIHN1cHBvcnRlZCBpbiBFRVBST00uXG4iKTsKLQotCWlmIChlZXByb20tPnNrdV9jYXAgJiBFRVBST01fU0tVX0NBUF9IV19SRl9LSUxMX0VOQUJMRSkKLQkJSVdMX0RFQlVHX1JGX0tJTEwocHJpdiwgIkhXIFJGIEtJTEwgc3VwcG9ydGVkIGluIEVFUFJPTS5cbiIpOwotfQotCi1pbnQgaXdsMzk0NV9od19uaWNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWl3bDM5NDVfc2V0X3B3cl92bWFpbihwcml2KTsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuY29uZmlnKHByaXYpOwotCi0JLyogQWxsb2NhdGUgdGhlIFJYIHF1ZXVlLCBvciByZXNldCBpZiBpdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLwotCWlmICghcnhxLT5iZCkgewotCQlyYyA9IGl3bF9sZWdhY3lfcnhfcXVldWVfYWxsb2MocHJpdik7Ci0JCWlmIChyYykgewotCQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXRpYWxpemUgUnggcXVldWVcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9IGVsc2UKLQkJaXdsMzk0NV9yeF9xdWV1ZV9yZXNldChwcml2LCByeHEpOwotCi0JaXdsMzk0NV9yeF9yZXBsZW5pc2gocHJpdik7Ci0KLQlpd2wzOTQ1X3J4X2luaXQocHJpdiwgcnhxKTsKLQotCi0JLyogTG9vayBhdCB1c2luZyB0aGlzIGluc3RlYWQ6Ci0JcnhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JaXdsX2xlZ2FjeV9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHJ4cSk7Ci0JKi8KLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9SQ1NSX1dQVFIoMCksIHJ4cS0+d3JpdGUgJiB+Nyk7Ci0KLQlyYyA9IGl3bDM5NDVfdHhxX2N0eF9yZXNldChwcml2KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCXNldF9iaXQoU1RBVFVTX0lOSVQsICZwcml2LT5zdGF0dXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od190eHFfY3R4X2ZyZWUgLSBGcmVlIFRYUSBDb250ZXh0Ci0gKgotICogRGVzdHJveSBhbGwgVFggRE1BIHF1ZXVlcyBhbmQgc3RydWN0dXJlcwotICovCi12b2lkIGl3bDM5NDVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgdHhxX2lkOwotCi0JLyogVHggcXVldWVzICovCi0JaWYgKHByaXYtPnR4cSkKLQkJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07Ci0JCSAgICAgdHhxX2lkKyspCi0JCQlpZiAodHhxX2lkID09IElXTDM5X0NNRF9RVUVVRV9OVU0pCi0JCQkJaXdsX2xlZ2FjeV9jbWRfcXVldWVfZnJlZShwcml2KTsKLQkJCWVsc2UKLQkJCQlpd2xfbGVnYWN5X3R4X3F1ZXVlX2ZyZWUocHJpdiwgdHhxX2lkKTsKLQotCS8qIGZyZWUgdHggcXVldWUgc3RydWN0dXJlICovCi0JaXdsX2xlZ2FjeV90eHFfbWVtKHByaXYpOwotfQotCi12b2lkIGl3bDM5NDVfaHdfdHhxX2N0eF9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgdHhxX2lkOwotCi0JLyogc3RvcCBTQ0QgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9NT0RFX1JFRywgMCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFMTV9TQ0RfVFhGQUNUX1JFRywgMCk7Ci0KLQkvKiByZXNldCBURkQgcXVldWVzICovCi0JZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKSB7Ci0JCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9UQ1NSX0NPTkZJRyh0eHFfaWQpLCAweDApOwotCQlpd2xfcG9sbF9kaXJlY3RfYml0KHByaXYsIEZIMzlfVFNTUl9UWF9TVEFUVVMsCi0JCQkJRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRSh0eHFfaWQpLAotCQkJCTEwMDApOwotCX0KLQotCWl3bDM5NDVfaHdfdHhxX2N0eF9mcmVlKHByaXYpOwotfQotCi0vKioKLSAqIGl3bDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wCi0gKiByZXR1cm4gaW5kZXggZGVsdGEgaW50byBwb3dlciBnYWluIHNldHRpbmdzIHRhYmxlCi0qLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ19hZGp1c3RfcG93ZXJfYnlfdGVtcChpbnQgbmV3X3JlYWRpbmcsIGludCBvbGRfcmVhZGluZykKLXsKLQlyZXR1cm4gKG5ld19yZWFkaW5nIC0gb2xkX3JlYWRpbmcpICogKC0xMSkgLyAxMDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfdGVtcF9vdXRfb2ZfcmFuZ2UgLSBLZWVwIHRlbXBlcmF0dXJlIGluIHNhbmUgcmFuZ2UKLSAqLwotc3RhdGljIGlubGluZSBpbnQgaXdsMzk0NV9od19yZWdfdGVtcF9vdXRfb2ZfcmFuZ2UoaW50IHRlbXBlcmF0dXJlKQotewotCXJldHVybiAoKHRlbXBlcmF0dXJlIDwgLTI2MCkgfHwgKHRlbXBlcmF0dXJlID4gMjUpKSA/IDEgOiAwOwotfQotCi1pbnQgaXdsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AyKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2h3X3JlZ190eHBvd2VyX2dldF90ZW1wZXJhdHVyZQotICogZ2V0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGJ5IHJlYWRpbmcgZnJvbSBOSUMKLSovCi1zdGF0aWMgaW50IGl3bDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JaW50IHRlbXBlcmF0dXJlOwotCi0JdGVtcGVyYXR1cmUgPSBpd2wzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShwcml2KTsKLQotCS8qIGRyaXZlcidzIG9rYXkgcmFuZ2UgaXMgLTI2MCB0byArMjUuCi0JICogICBodW1hbiByZWFkYWJsZSBva2F5IHJhbmdlIGlzIDAgdG8gKzI4NSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJUZW1wZXJhdHVyZTogJWRcbiIsIHRlbXBlcmF0dXJlICsgSVdMX1RFTVBfQ09OVkVSVCk7Ci0KLQkvKiBoYW5kbGUgaW5zYW5lIHRlbXAgcmVhZGluZyAqLwotCWlmIChpd2wzOTQ1X2h3X3JlZ190ZW1wX291dF9vZl9yYW5nZSh0ZW1wZXJhdHVyZSkpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3IgYmFkIHRlbXBlcmF0dXJlIHZhbHVlICAlZFxuIiwgdGVtcGVyYXR1cmUpOwotCi0JCS8qIGlmIHJlYWxseSByZWFsbHkgaG90KD8pLAotCQkgKiAgIHN1YnN0aXR1dGUgdGhlIDNyZCBiYW5kL2dyb3VwJ3MgdGVtcCBtZWFzdXJlZCBhdCBmYWN0b3J5ICovCi0JCWlmIChwcml2LT5sYXN0X3RlbXBlcmF0dXJlID4gMTAwKQotCQkJdGVtcGVyYXR1cmUgPSBlZXByb20tPmdyb3Vwc1syXS50ZW1wZXJhdHVyZTsKLQkJZWxzZSAvKiBlbHNlIHVzZSBtb3N0IHJlY2VudCAic2FuZSIgdmFsdWUgZnJvbSBkcml2ZXIgKi8KLQkJCXRlbXBlcmF0dXJlID0gcHJpdi0+bGFzdF90ZW1wZXJhdHVyZTsKLQl9Ci0KLQlyZXR1cm4gdGVtcGVyYXR1cmU7CS8qIHJhdywgbm90ICJodW1hbiByZWFkYWJsZSIgKi8KLX0KLQotLyogQWRqdXN0IFR4cG93ZXIgb25seSBpZiB0ZW1wZXJhdHVyZSB2YXJpYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLgotICoKLSAqIEJvdGggYXJlIGxvd2VyIHRoYW4gb2xkZXIgdmVyc2lvbnMnIDkgZGVncmVlcyAqLwotI2RlZmluZSBJV0xfVEVNUEVSQVRVUkVfTElNSVRfVElNRVIgICA2Ci0KLS8qKgotICogaXdsMzk0NV9pc190ZW1wX2NhbGliX25lZWRlZCAtIGRldGVybWluZXMgaWYgbmV3IGNhbGlicmF0aW9uIGlzIG5lZWRlZAotICoKLSAqIHJlY29yZHMgbmV3IHRlbXBlcmF0dXJlIGluIHR4X21nci0+dGVtcGVyYXR1cmUuCi0gKiByZXBsYWNlcyB0eF9tZ3ItPmxhc3RfdGVtcGVyYXR1cmUgKm9ubHkqIGlmIGNhbGliIG5lZWRlZAotICogICAgKGFzc3VtZXMgY2FsbGVyIHdpbGwgYWN0dWFsbHkgZG8gdGhlIGNhbGlicmF0aW9uISkuICovCi1zdGF0aWMgaW50IGl3bDM5NDVfaXNfdGVtcF9jYWxpYl9uZWVkZWQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0ZW1wX2RpZmY7Ci0KLQlwcml2LT50ZW1wZXJhdHVyZSA9IGl3bDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKHByaXYpOwotCXRlbXBfZGlmZiA9IHByaXYtPnRlbXBlcmF0dXJlIC0gcHJpdi0+bGFzdF90ZW1wZXJhdHVyZTsKLQotCS8qIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLwotCWlmICh0ZW1wX2RpZmYgPCAwKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiR2V0dGluZyBjb29sZXIsIGRlbHRhICVkLFxuIiwgdGVtcF9kaWZmKTsKLQkJdGVtcF9kaWZmID0gLXRlbXBfZGlmZjsKLQl9IGVsc2UgaWYgKHRlbXBfZGlmZiA9PSAwKQotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlNhbWUgdGVtcCxcbiIpOwotCWVsc2UKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJHZXR0aW5nIHdhcm1lciwgZGVsdGEgJWQsXG4iLCB0ZW1wX2RpZmYpOwotCi0JLyogaWYgd2UgZG9uJ3QgbmVlZCBjYWxpYnJhdGlvbiwgKmRvbid0KiB1cGRhdGUgbGFzdF90ZW1wZXJhdHVyZSAqLwotCWlmICh0ZW1wX2RpZmYgPCBJV0xfVEVNUEVSQVRVUkVfTElNSVRfVElNRVIpIHsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJUaW1lZCB0aGVybWFsIGNhbGliIG5vdCBuZWVkZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlRpbWVkIHRoZXJtYWwgY2FsaWIgbmVlZGVkXG4iKTsKLQotCS8qIGFzc3VtZSB0aGF0IGNhbGxlciB3aWxsIGFjdHVhbGx5IGRvIGNhbGliIC4uLgotCSAqICAgdXBkYXRlIHRoZSAibGFzdCB0ZW1wZXJhdHVyZSIgdmFsdWUgKi8KLQlwcml2LT5sYXN0X3RlbXBlcmF0dXJlID0gcHJpdi0+dGVtcGVyYXR1cmU7Ci0JcmV0dXJuIDE7Ci19Ci0KLSNkZWZpbmUgSVdMX01BWF9HQUlOX0VOVFJJRVMgNzgKLSNkZWZpbmUgSVdMX0NDS19GUk9NX09GRE1fUE9XRVJfRElGRiAgLTUKLSNkZWZpbmUgSVdMX0NDS19GUk9NX09GRE1fSU5ERVhfRElGRiAoMTApCi0KLS8qIHJhZGlvIGFuZCBEU1AgcG93ZXIgdGFibGUsIGVhY2ggc3RlcCBpcyAxLzIgZEIuCi0gKiAxc3QgbnVtYmVyIGlzIGZvciBSRiBhbmFsb2cgZ2FpbiwgMm5kIG51bWJlciBpcyBmb3IgRFNQIHByZS1EQUMgZ2Fpbi4gKi8KLXN0YXRpYyBzdHJ1Y3QgaXdsMzk0NV90eF9wb3dlciBwb3dlcl9nYWluX3RhYmxlWzJdW0lXTF9NQVhfR0FJTl9FTlRSSUVTXSA9IHsKLQl7Ci0JIHsyNTEsIDEyN30sCQkvKiAyLjQgR0h6LCBoaWdoZXN0IHBvd2VyICovCi0JIHsyNTEsIDEyN30sCi0JIHsyNTEsIDEyN30sCi0JIHsyNTEsIDEyN30sCi0JIHsyNTEsIDEyNX0sCi0JIHsyNTEsIDExMH0sCi0JIHsyNTEsIDEwNX0sCi0JIHsyNTEsIDk4fSwKLQkgezE4NywgMTI1fSwKLQkgezE4NywgMTE1fSwKLQkgezE4NywgMTA4fSwKLQkgezE4NywgOTl9LAotCSB7MjQzLCAxMTl9LAotCSB7MjQzLCAxMTF9LAotCSB7MjQzLCAxMDV9LAotCSB7MjQzLCA5N30sCi0JIHsyNDMsIDkyfSwKLQkgezIxMSwgMTA2fSwKLQkgezIxMSwgMTAwfSwKLQkgezE3OSwgMTIwfSwKLQkgezE3OSwgMTEzfSwKLQkgezE3OSwgMTA3fSwKLQkgezE0NywgMTI1fSwKLQkgezE0NywgMTE5fSwKLQkgezE0NywgMTEyfSwKLQkgezE0NywgMTA2fSwKLQkgezE0NywgMTAxfSwKLQkgezE0NywgOTd9LAotCSB7MTQ3LCA5MX0sCi0JIHsxMTUsIDEwN30sCi0JIHsyMzUsIDEyMX0sCi0JIHsyMzUsIDExNX0sCi0JIHsyMzUsIDEwOX0sCi0JIHsyMDMsIDEyN30sCi0JIHsyMDMsIDEyMX0sCi0JIHsyMDMsIDExNX0sCi0JIHsyMDMsIDEwOH0sCi0JIHsyMDMsIDEwMn0sCi0JIHsyMDMsIDk2fSwKLQkgezIwMywgOTJ9LAotCSB7MTcxLCAxMTB9LAotCSB7MTcxLCAxMDR9LAotCSB7MTcxLCA5OH0sCi0JIHsxMzksIDExNn0sCi0JIHsyMjcsIDEyNX0sCi0JIHsyMjcsIDExOX0sCi0JIHsyMjcsIDExM30sCi0JIHsyMjcsIDEwN30sCi0JIHsyMjcsIDEwMX0sCi0JIHsyMjcsIDk2fSwKLQkgezE5NSwgMTEzfSwKLQkgezE5NSwgMTA2fSwKLQkgezE5NSwgMTAyfSwKLQkgezE5NSwgOTV9LAotCSB7MTYzLCAxMTN9LAotCSB7MTYzLCAxMDZ9LAotCSB7MTYzLCAxMDJ9LAotCSB7MTYzLCA5NX0sCi0JIHsxMzEsIDExM30sCi0JIHsxMzEsIDEwNn0sCi0JIHsxMzEsIDEwMn0sCi0JIHsxMzEsIDk1fSwKLQkgezk5LCAxMTN9LAotCSB7OTksIDEwNn0sCi0JIHs5OSwgMTAyfSwKLQkgezk5LCA5NX0sCi0JIHs2NywgMTEzfSwKLQkgezY3LCAxMDZ9LAotCSB7NjcsIDEwMn0sCi0JIHs2NywgOTV9LAotCSB7MzUsIDExM30sCi0JIHszNSwgMTA2fSwKLQkgezM1LCAxMDJ9LAotCSB7MzUsIDk1fSwKLQkgezMsIDExM30sCi0JIHszLCAxMDZ9LAotCSB7MywgMTAyfSwKLQkgezMsIDk1fSB9LAkJLyogMi40IEdIeiwgbG93ZXN0IHBvd2VyICovCi0JewotCSB7MjUxLCAxMjd9LAkJLyogNS54IEdIeiwgaGlnaGVzdCBwb3dlciAqLwotCSB7MjUxLCAxMjB9LAotCSB7MjUxLCAxMTR9LAotCSB7MjE5LCAxMTl9LAotCSB7MjE5LCAxMDF9LAotCSB7MTg3LCAxMTN9LAotCSB7MTg3LCAxMDJ9LAotCSB7MTU1LCAxMTR9LAotCSB7MTU1LCAxMDN9LAotCSB7MTIzLCAxMTd9LAotCSB7MTIzLCAxMDd9LAotCSB7MTIzLCA5OX0sCi0JIHsxMjMsIDkyfSwKLQkgezkxLCAxMDh9LAotCSB7NTksIDEyNX0sCi0JIHs1OSwgMTE4fSwKLQkgezU5LCAxMDl9LAotCSB7NTksIDEwMn0sCi0JIHs1OSwgOTZ9LAotCSB7NTksIDkwfSwKLQkgezI3LCAxMDR9LAotCSB7MjcsIDk4fSwKLQkgezI3LCA5Mn0sCi0JIHsxMTUsIDExOH0sCi0JIHsxMTUsIDExMX0sCi0JIHsxMTUsIDEwNH0sCi0JIHs4MywgMTI2fSwKLQkgezgzLCAxMjF9LAotCSB7ODMsIDExM30sCi0JIHs4MywgMTA1fSwKLQkgezgzLCA5OX0sCi0JIHs1MSwgMTE4fSwKLQkgezUxLCAxMTF9LAotCSB7NTEsIDEwNH0sCi0JIHs1MSwgOTh9LAotCSB7MTksIDExNn0sCi0JIHsxOSwgMTA5fSwKLQkgezE5LCAxMDJ9LAotCSB7MTksIDk4fSwKLQkgezE5LCA5M30sCi0JIHsxNzEsIDExM30sCi0JIHsxNzEsIDEwN30sCi0JIHsxNzEsIDk5fSwKLQkgezEzOSwgMTIwfSwKLQkgezEzOSwgMTEzfSwKLQkgezEzOSwgMTA3fSwKLQkgezEzOSwgOTl9LAotCSB7MTA3LCAxMjB9LAotCSB7MTA3LCAxMTN9LAotCSB7MTA3LCAxMDd9LAotCSB7MTA3LCA5OX0sCi0JIHs3NSwgMTIwfSwKLQkgezc1LCAxMTN9LAotCSB7NzUsIDEwN30sCi0JIHs3NSwgOTl9LAotCSB7NDMsIDEyMH0sCi0JIHs0MywgMTEzfSwKLQkgezQzLCAxMDd9LAotCSB7NDMsIDk5fSwKLQkgezExLCAxMjB9LAotCSB7MTEsIDExM30sCi0JIHsxMSwgMTA3fSwKLQkgezExLCA5OX0sCi0JIHsxMzEsIDEwN30sCi0JIHsxMzEsIDk5fSwKLQkgezk5LCAxMjB9LAotCSB7OTksIDExM30sCi0JIHs5OSwgMTA3fSwKLQkgezk5LCA5OX0sCi0JIHs2NywgMTIwfSwKLQkgezY3LCAxMTN9LAotCSB7NjcsIDEwN30sCi0JIHs2NywgOTl9LAotCSB7MzUsIDEyMH0sCi0JIHszNSwgMTEzfSwKLQkgezM1LCAxMDd9LAotCSB7MzUsIDk5fSwKLQkgezMsIDEyMH0gfQkJLyogNS54IEdIeiwgbG93ZXN0IHBvd2VyICovCi19OwotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pbmRleChpbnQgaW5kZXgpCi17Ci0JaWYgKGluZGV4IDwgMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKGluZGV4ID49IElXTF9NQVhfR0FJTl9FTlRSSUVTKQotCQlyZXR1cm4gSVdMX01BWF9HQUlOX0VOVFJJRVMgLSAxOwotCXJldHVybiAodTgpIGluZGV4OwotfQotCi0vKiBLaWNrIG9mZiB0aGVybWFsIHJlY2FsaWJyYXRpb24gY2hlY2sgZXZlcnkgNjAgc2Vjb25kcyAqLwotI2RlZmluZSBSRUdfUkVDQUxJQl9QRVJJT0QgKDYwKQotCi0vKioKLSAqIGl3bDM5NDVfaHdfcmVnX3NldF9zY2FuX3Bvd2VyIC0gU2V0IFR4IHBvd2VyIGZvciBzY2FuIHByb2JlIHJlcXVlc3RzCi0gKgotICogU2V0IChpbiBvdXIgY2hhbm5lbCBpbmZvIGRhdGFiYXNlKSB0aGUgZGlyZWN0IHNjYW4gVHggcG93ZXIgZm9yIDEgTWJpdCAoQ0NLKQotICogb3IgNiBNYml0IChPRkRNKSByYXRlcy4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9od19yZWdfc2V0X3NjYW5fcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgc2Nhbl90YmxfaW5kZXgsCi0JCQkgICAgICAgczMyIHJhdGVfaW5kZXgsIGNvbnN0IHM4ICpjbGlwX3B3cnMsCi0JCQkgICAgICAgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8sCi0JCQkgICAgICAgaW50IGJhbmRfaW5kZXgpCi17Ci0Jc3RydWN0IGl3bDM5NDVfc2Nhbl9wb3dlcl9pbmZvICpzY2FuX3Bvd2VyX2luZm87Ci0JczggcG93ZXI7Ci0JdTggcG93ZXJfaW5kZXg7Ci0KLQlzY2FuX3Bvd2VyX2luZm8gPSAmY2hfaW5mby0+c2Nhbl9wd3JfaW5mb1tzY2FuX3RibF9pbmRleF07Ci0KLQkvKiB1c2UgdGhpcyBjaGFubmVsIGdyb3VwJ3MgNk1iaXQgY2xpcHBpbmcvc2F0dXJhdGlvbiBwd3IsCi0JICogICBidXQgY2FwIGF0IHJlZ3VsYXRvcnkgc2NhbiBwb3dlciByZXN0cmljdGlvbiAoc2V0IGR1cmluZyBpbml0Ci0JICogICBiYXNlZCBvbiBlZXByb20gY2hhbm5lbCBkYXRhKSBmb3IgdGhpcyBjaGFubmVsLiAgKi8KLQlwb3dlciA9IG1pbihjaF9pbmZvLT5zY2FuX3Bvd2VyLCBjbGlwX3B3cnNbSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEVdKTsKLQotCXBvd2VyID0gbWluKHBvd2VyLCBwcml2LT50eF9wb3dlcl91c2VyX2xtdCk7Ci0Jc2Nhbl9wb3dlcl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwb3dlcjsKLQotCS8qIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIG5ldyBzY2FuICpwb3dlciogYW5kIGN1cnJlbnQgIm5vcm1hbCIKLQkgKiAgIFR4ICpwb3dlciogZm9yIDZNYi4gIFVzZSB0aGlzIGRpZmZlcmVuY2UgKHgyKSB0byBhZGp1c3QgdGhlCi0JICogICBjdXJyZW50ICJub3JtYWwiIHRlbXBlcmF0dXJlLWNvbXBlbnNhdGVkIFR4IHBvd2VyICppbmRleCogZm9yCi0JICogICB0aGlzIHJhdGUgKDFNYiBvciA2TWIpIHRvIHlpZWxkIG5ldyB0ZW1wLWNvbXBlbnNhdGVkIHNjYW4gcG93ZXIKLQkgKiAgICppbmRleCouICovCi0JcG93ZXJfaW5kZXggPSBjaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaW5kZXhdLnBvd2VyX3RhYmxlX2luZGV4Ci0JICAgIC0gKHBvd2VyIC0gY2hfaW5mby0+cG93ZXJfaW5mbwotCSAgICAgICBbSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEVdLnJlcXVlc3RlZF9wb3dlcikgKiAyOwotCi0JLyogc3RvcmUgcmVmZXJlbmNlIGluZGV4IHRoYXQgd2UgdXNlIHdoZW4gYWRqdXN0aW5nICphbGwqIHNjYW4KLQkgKiAgIHBvd2Vycy4gIFNvIHdlIGNhbiBhY2NvbW1vZGF0ZSB1c2VyIChhbGwgY2hhbm5lbCkgb3Igc3BlY3RydW0KLQkgKiAgIG1hbmFnZW1lbnQgKHNpbmdsZSBjaGFubmVsKSBwb3dlciBjaGFuZ2VzICJiZXR3ZWVuIiB0ZW1wZXJhdHVyZQotCSAqICAgZmVlZGJhY2sgY29tcGVuc2F0aW9uIHByb2NlZHVyZXMuCi0JICogZG9uJ3QgZm9yY2UgZml0IHRoaXMgcmVmZXJlbmNlIGluZGV4IGludG8gZ2FpbiB0YWJsZTsgaXQgbWF5IGJlIGEKLQkgKiAgIG5lZ2F0aXZlIG51bWJlci4gIFRoaXMgd2lsbCBoZWxwIGF2b2lkIGVycm9ycyB3aGVuIHdlJ3JlIGF0Ci0JICogICB0aGUgbG93ZXIgYm91bmRzIChoaWdoZXN0IGdhaW5zLCBmb3Igd2FybWVzdCB0ZW1wZXJhdHVyZXMpCi0JICogICBvZiB0aGUgdGFibGUuICovCi0KLQkvKiBkb24ndCBleGNlZWQgdGFibGUgYm91bmRzIGZvciAicmVhbCIgc2V0dGluZyAqLwotCXBvd2VyX2luZGV4ID0gaXdsMzk0NV9od19yZWdfZml4X3Bvd2VyX2luZGV4KHBvd2VyX2luZGV4KTsKLQotCXNjYW5fcG93ZXJfaW5mby0+cG93ZXJfdGFibGVfaW5kZXggPSBwb3dlcl9pbmRleDsKLQlzY2FuX3Bvd2VyX2luZm8tPnRwYy50eF9nYWluID0KLQkgICAgcG93ZXJfZ2Fpbl90YWJsZVtiYW5kX2luZGV4XVtwb3dlcl9pbmRleF0udHhfZ2FpbjsKLQlzY2FuX3Bvd2VyX2luZm8tPnRwYy5kc3BfYXR0ZW4gPQotCSAgICBwb3dlcl9nYWluX3RhYmxlW2JhbmRfaW5kZXhdW3Bvd2VyX2luZGV4XS5kc3BfYXR0ZW47Ci19Ci0KLS8qKgotICogaXdsMzk0NV9zZW5kX3R4X3Bvd2VyIC0gZmlsbCBpbiBUeCBQb3dlciBjb21tYW5kIHdpdGggZ2FpbiBzZXR0aW5ncwotICoKLSAqIENvbmZpZ3VyZXMgcG93ZXIgc2V0dGluZ3MgZm9yIGFsbCByYXRlcyBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbCwKLSAqIHVzaW5nIHZhbHVlcyBmcm9tIGNoYW5uZWwgaW5mbyBzdHJ1Y3QsIGFuZCBzZW5kIHRvIE5JQwotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJhdGVfaWR4LCBpOwotCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgaXdsMzk0NV90eHBvd2VydGFibGVfY21kIHR4cG93ZXIgPSB7Ci0JCS5jaGFubmVsID0gcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWN0aXZlLmNoYW5uZWwsCi0JfTsKLQl1MTYgY2hhbjsKLQotCWlmIChXQVJOX09OQ0UodGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zdGF0dXMpLAotCQkgICAgICAiVFggUG93ZXIgcmVxdWVzdGVkIHdoaWxlIHNjYW5uaW5nIVxuIikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JY2hhbiA9IGxlMTZfdG9fY3B1KHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5jaGFubmVsKTsKLQotCXR4cG93ZXIuYmFuZCA9IChwcml2LT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopID8gMCA6IDE7Ci0JY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBwcml2LT5iYW5kLCBjaGFuKTsKLQlpZiAoIWNoX2luZm8pIHsKLQkJSVdMX0VSUihwcml2LAotCQkJIkZhaWxlZCB0byBnZXQgY2hhbm5lbCBpbmZvIGZvciBjaGFubmVsICVkIFslZF1cbiIsCi0JCQljaGFuLCBwcml2LT5iYW5kKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJOb3QgY2FsbGluZyBUWF9QV1JfVEFCTEVfQ01EIG9uICIKLQkJCQkibm9uLVR4IGNoYW5uZWwuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZmlsbCBjbWQgd2l0aCBwb3dlciBzZXR0aW5ncyBmb3IgYWxsIHJhdGVzIGZvciBjdXJyZW50IGNoYW5uZWwgKi8KLQkvKiBGaWxsIE9GRE0gcmF0ZSAqLwotCWZvciAocmF0ZV9pZHggPSBJV0xfRklSU1RfT0ZETV9SQVRFLCBpID0gMDsKLQkgICAgIHJhdGVfaWR4IDw9IElXTDM5X0xBU1RfT0ZETV9SQVRFOyByYXRlX2lkeCsrLCBpKyspIHsKLQotCQl0eHBvd2VyLnBvd2VyW2ldLnRwYyA9IGNoX2luZm8tPnBvd2VyX2luZm9baV0udHBjOwotCQl0eHBvd2VyLnBvd2VyW2ldLnJhdGUgPSBpd2wzOTQ1X3JhdGVzW3JhdGVfaWR4XS5wbGNwOwotCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiY2ggJWQ6JWQgcmYgJWQgZHNwICUzZCByYXRlIGNvZGUgMHglMDJ4XG4iLAotCQkJCWxlMTZfdG9fY3B1KHR4cG93ZXIuY2hhbm5lbCksCi0JCQkJdHhwb3dlci5iYW5kLAotCQkJCXR4cG93ZXIucG93ZXJbaV0udHBjLnR4X2dhaW4sCi0JCQkJdHhwb3dlci5wb3dlcltpXS50cGMuZHNwX2F0dGVuLAotCQkJCXR4cG93ZXIucG93ZXJbaV0ucmF0ZSk7Ci0JfQotCS8qIEZpbGwgQ0NLIHJhdGVzICovCi0JZm9yIChyYXRlX2lkeCA9IElXTF9GSVJTVF9DQ0tfUkFURTsKLQkgICAgIHJhdGVfaWR4IDw9IElXTF9MQVNUX0NDS19SQVRFOyByYXRlX2lkeCsrLCBpKyspIHsKLQkJdHhwb3dlci5wb3dlcltpXS50cGMgPSBjaF9pbmZvLT5wb3dlcl9pbmZvW2ldLnRwYzsKLQkJdHhwb3dlci5wb3dlcltpXS5yYXRlID0gaXdsMzk0NV9yYXRlc1tyYXRlX2lkeF0ucGxjcDsKLQotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgImNoICVkOiVkIHJmICVkIGRzcCAlM2QgcmF0ZSBjb2RlIDB4JTAyeFxuIiwKLQkJCQlsZTE2X3RvX2NwdSh0eHBvd2VyLmNoYW5uZWwpLAotCQkJCXR4cG93ZXIuYmFuZCwKLQkJCQl0eHBvd2VyLnBvd2VyW2ldLnRwYy50eF9nYWluLAotCQkJCXR4cG93ZXIucG93ZXJbaV0udHBjLmRzcF9hdHRlbiwKLQkJCQl0eHBvd2VyLnBvd2VyW2ldLnJhdGUpOwotCX0KLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELAotCQkJCXNpemVvZihzdHJ1Y3QgaXdsMzk0NV90eHBvd2VydGFibGVfY21kKSwKLQkJCQkmdHhwb3dlcik7Ci0KLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2h3X3JlZ19zZXRfbmV3X3Bvd2VyIC0gQ29uZmlndXJlcyBwb3dlciB0YWJsZXMgYXQgbmV3IGxldmVscwotICogQGNoX2luZm86IENoYW5uZWwgdG8gdXBkYXRlLiAgVXNlcyBwb3dlcl9pbmZvLnJlcXVlc3RlZF9wb3dlci4KLSAqCi0gKiBSZXBsYWNlIHJlcXVlc3RlZF9wb3dlciBhbmQgYmFzZV9wb3dlcl9pbmRleCBjaF9pbmZvIGZpZWxkcyBmb3IKLSAqIG9uZSBjaGFubmVsLgotICoKLSAqIENhbGxlZCBpZiB1c2VyIG9yIHNwZWN0cnVtIG1hbmFnZW1lbnQgY2hhbmdlcyBwb3dlciBwcmVmZXJlbmNlcy4KLSAqIFRha2VzIGludG8gYWNjb3VudCBoL3cgYW5kIG1vZHVsYXRpb24gbGltaXRhdGlvbnMgKGNsaXAgcG93ZXIpLgotICoKLSAqIFRoaXMgZG9lcyAqbm90KiBzZW5kIGFueXRoaW5nIHRvIE5JQywganVzdCBzZXRzIHVwIGNoX2luZm8gZm9yIG9uZSBjaGFubmVsLgotICoKLSAqIE5PVEU6IHJlZ19jb21wZW5zYXRlX2Zvcl90ZW1wZXJhdHVyZV9kaWYoKSAqbXVzdCogYmUgcnVuIGFmdGVyIHRoaXMgdG8KLSAqCSBwcm9wZXJseSBmaWxsIG91dCB0aGUgc2NhbiBwb3dlcnMsIGFuZCBhY3R1YWwgaC93IGdhaW4gc2V0dGluZ3MsCi0gKgkgYW5kIHNlbmQgY2hhbmdlcyB0byBOSUMKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ19zZXRfbmV3X3Bvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8pCi17Ci0Jc3RydWN0IGl3bDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvICpwb3dlcl9pbmZvOwotCWludCBwb3dlcl9jaGFuZ2VkID0gMDsKLQlpbnQgaTsKLQljb25zdCBzOCAqY2xpcF9wd3JzOwotCWludCBwb3dlcjsKLQotCS8qIEdldCB0aGlzIGNobmxncnAncyByYXRlLXRvLW1heC9jbGlwLXBvd2VycyB0YWJsZSAqLwotCWNsaXBfcHdycyA9IHByaXYtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2luZGV4XS5jbGlwX3Bvd2VyczsKLQotCS8qIEdldCB0aGlzIGNoYW5uZWwncyByYXRlLXRvLWN1cnJlbnQtcG93ZXIgc2V0dGluZ3MgdGFibGUgKi8KLQlwb3dlcl9pbmZvID0gY2hfaW5mby0+cG93ZXJfaW5mbzsKLQotCS8qIHVwZGF0ZSBPRkRNIFR4cG93ZXIgc2V0dGluZ3MgKi8KLQlmb3IgKGkgPSBJV0xfUkFURV82TV9JTkRFWF9UQUJMRTsgaSA8PSBJV0xfUkFURV81NE1fSU5ERVhfVEFCTEU7Ci0JICAgICBpKyssICsrcG93ZXJfaW5mbykgewotCQlpbnQgZGVsdGFfaWR4OwotCi0JCS8qIGxpbWl0IG5ldyBwb3dlciB0byBiZSBubyBtb3JlIHRoYW4gaC93IGNhcGFiaWxpdHkgKi8KLQkJcG93ZXIgPSBtaW4oY2hfaW5mby0+Y3Vycl90eHBvdywgY2xpcF9wd3JzW2ldKTsKLQkJaWYgKHBvd2VyID09IHBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlcikKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IHJlcXVlc3RlZCBwb3dlcnMsCi0JCSAqICAgIHVwZGF0ZSBiYXNlIChub24tdGVtcC1jb21wZW5zYXRlZCkgcG93ZXIgaW5kZXggKi8KLQkJZGVsdGFfaWR4ID0gKHBvd2VyIC0gcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyKSAqIDI7Ci0JCXBvd2VyX2luZm8tPmJhc2VfcG93ZXJfaW5kZXggLT0gZGVsdGFfaWR4OwotCi0JCS8qIHNhdmUgbmV3IHJlcXVlc3RlZCBwb3dlciB2YWx1ZSAqLwotCQlwb3dlcl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwb3dlcjsKLQotCQlwb3dlcl9jaGFuZ2VkID0gMTsKLQl9Ci0KLQkvKiB1cGRhdGUgQ0NLIFR4cG93ZXIgc2V0dGluZ3MsIGJhc2VkIG9uIE9GRE0gMTJNIHNldHRpbmcgLi4uCi0JICogICAgLi4uIGFsbCBDQ0sgcG93ZXIgc2V0dGluZ3MgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBhcmUgdGhlICpzYW1lKi4gKi8KLQlpZiAocG93ZXJfY2hhbmdlZCkgewotCQlwb3dlciA9Ci0JCSAgICBjaF9pbmZvLT5wb3dlcl9pbmZvW0lXTF9SQVRFXzEyTV9JTkRFWF9UQUJMRV0uCi0JCSAgICByZXF1ZXN0ZWRfcG93ZXIgKyBJV0xfQ0NLX0ZST01fT0ZETV9QT1dFUl9ESUZGOwotCi0JCS8qIGRvIGFsbCBDQ0sgcmF0ZXMnIGl3bDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvIHN0cnVjdHVyZXMgKi8KLQkJZm9yIChpID0gSVdMX1JBVEVfMU1fSU5ERVhfVEFCTEU7IGkgPD0gSVdMX1JBVEVfMTFNX0lOREVYX1RBQkxFOyBpKyspIHsKLQkJCXBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlciA9IHBvd2VyOwotCQkJcG93ZXJfaW5mby0+YmFzZV9wb3dlcl9pbmRleCA9Ci0JCQkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tJV0xfUkFURV8xMk1fSU5ERVhfVEFCTEVdLgotCQkJICAgIGJhc2VfcG93ZXJfaW5kZXggKyBJV0xfQ0NLX0ZST01fT0ZETV9JTkRFWF9ESUZGOwotCQkJKytwb3dlcl9pbmZvOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfZ2V0X2NoX3R4cG93ZXJfbGltaXQgLSByZXR1cm5zIG5ldyBwb3dlciBsaW1pdCBmb3IgY2hhbm5lbAotICoKLSAqIE5PVEU6IFJldHVybmVkIHBvd2VyIGxpbWl0IG1heSBiZSBsZXNzIChidXQgbm90IG1vcmUpIHRoYW4gcmVxdWVzdGVkLAotICoJIGJhc2VkIHN0cmljdGx5IG9uIHJlZ3VsYXRvcnkgKGVlcHJvbSBhbmQgc3BlY3RydW0gbWd0KSBsaW1pdGF0aW9ucwotICoJIChubyBjb25zaWRlcmF0aW9uIGZvciBoL3cgY2xpcHBpbmcgbGltaXRhdGlvbnMpLgotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfaHdfcmVnX2dldF9jaF90eHBvd2VyX2xpbWl0KHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQotewotCXM4IG1heF9wb3dlcjsKLQotI2lmIDAKLQkvKiBpZiB3ZSdyZSB1c2luZyBUR2QgbGltaXRzLCB1c2UgbG93ZXIgb2YgVEdkIG9yIEVFUFJPTSAqLwotCWlmIChjaF9pbmZvLT50Z2RfZGF0YS5tYXhfcG93ZXIgIT0gMCkKLQkJbWF4X3Bvd2VyID0gbWluKGNoX2luZm8tPnRnZF9kYXRhLm1heF9wb3dlciwKLQkJCQljaF9pbmZvLT5lZXByb20ubWF4X3Bvd2VyX2F2Zyk7Ci0KLQkvKiBlbHNlIGp1c3QgdXNlIEVFUFJPTSBsaW1pdHMgKi8KLQllbHNlCi0jZW5kaWYKLQkJbWF4X3Bvd2VyID0gY2hfaW5mby0+ZWVwcm9tLm1heF9wb3dlcl9hdmc7Ci0KLQlyZXR1cm4gbWluKG1heF9wb3dlciwgY2hfaW5mby0+bWF4X3Bvd2VyX2F2Zyk7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfY29tcF90eHBvd2VyX3RlbXAgLSBDb21wZW5zYXRlIGZvciB0ZW1wZXJhdHVyZQotICoKLSAqIENvbXBlbnNhdGUgdHhwb3dlciBzZXR0aW5ncyBvZiAqYWxsKiBjaGFubmVscyBmb3IgdGVtcGVyYXR1cmUuCi0gKiBUaGlzIG9ubHkgYWNjb3VudHMgZm9yIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCB0ZW1wZXJhdHVyZQotICogICBhbmQgdGhlIGZhY3RvcnkgY2FsaWJyYXRpb24gdGVtcGVyYXR1cmVzLCBhbmQgYmFzZXMgdGhlIG5ldyBzZXR0aW5ncwotICogICBvbiB0aGUgY2hhbm5lbCdzIGJhc2VfcG93ZXJfaW5kZXguCi0gKgotICogSWYgUnhPbiBpcyAiYXNzb2NpYXRlZCIsIHRoaXMgc2VuZHMgdGhlIG5ldyBUeHBvd2VyIHRvIE5JQyEKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8gPSBOVUxMOwotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpd2wzOTQ1X2VlcHJvbSAqKXByaXYtPmVlcHJvbTsKLQlpbnQgZGVsdGFfaW5kZXg7Ci0JY29uc3QgczggKmNsaXBfcHdyczsgLyogYXJyYXkgb2YgaC93IG1heCBwb3dlciBsZXZlbHMgZm9yIGVhY2ggcmF0ZSAqLwotCXU4IGFfYmFuZDsKLQl1OCByYXRlX2luZGV4OwotCXU4IHNjYW5fdGJsX2luZGV4OwotCXU4IGk7Ci0JaW50IHJlZl90ZW1wOwotCWludCB0ZW1wZXJhdHVyZSA9IHByaXYtPnRlbXBlcmF0dXJlOwotCi0JaWYgKHByaXYtPmRpc2FibGVfdHhfcG93ZXJfY2FsIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpIHsKLQkJLyogZG8gbm90IHBlcmZvcm0gdHggcG93ZXIgY2FsaWJyYXRpb24gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCS8qIHNldCB1cCBuZXcgVHggcG93ZXIgaW5mbyBmb3IgZWFjaCBhbmQgZXZlcnkgY2hhbm5lbCwgMi40IGFuZCA1LnggKi8KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7Ci0JCWNoX2luZm8gPSAmcHJpdi0+Y2hhbm5lbF9pbmZvW2ldOwotCQlhX2JhbmQgPSBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pOwotCi0JCS8qIEdldCB0aGlzIGNobmxncnAncyBmYWN0b3J5IGNhbGlicmF0aW9uIHRlbXBlcmF0dXJlICovCi0JCXJlZl90ZW1wID0gKHMxNillZXByb20tPmdyb3Vwc1tjaF9pbmZvLT5ncm91cF9pbmRleF0uCi0JCSAgICB0ZW1wZXJhdHVyZTsKLQotCQkvKiBnZXQgcG93ZXIgaW5kZXggYWRqdXN0bWVudCBiYXNlZCBvbiBjdXJyZW50IGFuZCBmYWN0b3J5Ci0JCSAqIHRlbXBzICovCi0JCWRlbHRhX2luZGV4ID0gaXdsMzk0NV9od19yZWdfYWRqdXN0X3Bvd2VyX2J5X3RlbXAodGVtcGVyYXR1cmUsCi0JCQkJCQkJICAgICAgcmVmX3RlbXApOwotCi0JCS8qIHNldCB0eCBwb3dlciB2YWx1ZSBmb3IgYWxsIHJhdGVzLCBPRkRNIGFuZCBDQ0sgKi8KLQkJZm9yIChyYXRlX2luZGV4ID0gMDsgcmF0ZV9pbmRleCA8IElXTF9SQVRFX0NPVU5UXzM5NDU7Ci0JCSAgICAgcmF0ZV9pbmRleCsrKSB7Ci0JCQlpbnQgcG93ZXJfaWR4ID0KLQkJCSAgICBjaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaW5kZXhdLmJhc2VfcG93ZXJfaW5kZXg7Ci0KLQkJCS8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGUgKi8KLQkJCXBvd2VyX2lkeCArPSBkZWx0YV9pbmRleDsKLQotCQkJLyogc3RheSB3aXRoaW4gdGFibGUgcmFuZ2UgKi8KLQkJCXBvd2VyX2lkeCA9IGl3bDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pbmRleChwb3dlcl9pZHgpOwotCQkJY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2luZGV4XS4KLQkJCSAgICBwb3dlcl90YWJsZV9pbmRleCA9ICh1OCkgcG93ZXJfaWR4OwotCQkJY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2luZGV4XS50cGMgPQotCQkJICAgIHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwb3dlcl9pZHhdOwotCQl9Ci0KLQkJLyogR2V0IHRoaXMgY2hubGdycCdzIHJhdGUtdG8tbWF4L2NsaXAtcG93ZXJzIHRhYmxlICovCi0JCWNsaXBfcHdycyA9IHByaXYtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2luZGV4XS5jbGlwX3Bvd2VyczsKLQotCQkvKiBzZXQgc2NhbiB0eCBwb3dlciwgMU1iaXQgZm9yIENDSywgNk1iaXQgZm9yIE9GRE0gKi8KLQkJZm9yIChzY2FuX3RibF9pbmRleCA9IDA7Ci0JCSAgICAgc2Nhbl90YmxfaW5kZXggPCBJV0xfTlVNX1NDQU5fUkFURVM7IHNjYW5fdGJsX2luZGV4KyspIHsKLQkJCXMzMiBhY3R1YWxfaW5kZXggPSAoc2Nhbl90YmxfaW5kZXggPT0gMCkgPwotCQkJICAgIElXTF9SQVRFXzFNX0lOREVYX1RBQkxFIDogSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEU7Ci0JCQlpd2wzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlcihwcml2LCBzY2FuX3RibF9pbmRleCwKLQkJCQkJICAgYWN0dWFsX2luZGV4LCBjbGlwX3B3cnMsCi0JCQkJCSAgIGNoX2luZm8sIGFfYmFuZCk7Ci0JCX0KLQl9Ci0KLQkvKiBzZW5kIFR4cG93ZXIgY29tbWFuZCBmb3IgY3VycmVudCBjaGFubmVsIHRvIHVjb2RlICovCi0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPnNlbmRfdHhfcG93ZXIocHJpdik7Ci19Ci0KLWludCBpd2wzOTQ1X2h3X3JlZ19zZXRfdHhwb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHM4IHBvd2VyKQotewotCXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCXM4IG1heF9wb3dlcjsKLQl1OCBhX2JhbmQ7Ci0JdTggaTsKLQotCWlmIChwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9PSBwb3dlcikgewotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlJlcXVlc3RlZCBUeCBwb3dlciBzYW1lIGFzIGN1cnJlbnQgIgotCQkJCSJsaW1pdDogJWRkQm0uXG4iLCBwb3dlcik7Ci0JCXJldHVybiAwOwotCX0KLQotCUlXTF9ERUJVR19QT1dFUihwcml2LCAiU2V0dGluZyB1cHBlciBsaW1pdCBjbGFtcCB0byAlZGRCbS5cbiIsIHBvd2VyKTsKLQlwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9IHBvd2VyOwotCi0JLyogc2V0IHVwIG5ldyBUeCBwb3dlcnMgZm9yIGVhY2ggYW5kIGV2ZXJ5IGNoYW5uZWwsIDIuNCBhbmQgNS54ICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7Ci0JCWNoX2luZm8gPSAmcHJpdi0+Y2hhbm5lbF9pbmZvW2ldOwotCQlhX2JhbmQgPSBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pOwotCi0JCS8qIGZpbmQgbWluaW11bSBwb3dlciBvZiBhbGwgdXNlciBhbmQgcmVndWxhdG9yeSBjb25zdHJhaW50cwotCQkgKiAgICAoZG9lcyBub3QgY29uc2lkZXIgaC93IGNsaXBwaW5nIGxpbWl0YXRpb25zKSAqLwotCQltYXhfcG93ZXIgPSBpd2wzOTQ1X2h3X3JlZ19nZXRfY2hfdHhwb3dlcl9saW1pdChjaF9pbmZvKTsKLQkJbWF4X3Bvd2VyID0gbWluKHBvd2VyLCBtYXhfcG93ZXIpOwotCQlpZiAobWF4X3Bvd2VyICE9IGNoX2luZm8tPmN1cnJfdHhwb3cpIHsKLQkJCWNoX2luZm8tPmN1cnJfdHhwb3cgPSBtYXhfcG93ZXI7Ci0KLQkJCS8qIHRoaXMgY29uc2lkZXJzIHRoZSBoL3cgY2xpcHBpbmcgbGltaXRhdGlvbnMgKi8KLQkJCWl3bDM5NDVfaHdfcmVnX3NldF9uZXdfcG93ZXIocHJpdiwgY2hfaW5mbyk7Ci0JCX0KLQl9Ci0KLQkvKiB1cGRhdGUgdHhwb3dlciBzZXR0aW5ncyBmb3IgYWxsIGNoYW5uZWxzLAotCSAqICAgc2VuZCB0byBOSUMgaWYgYXNzb2NpYXRlZC4gKi8KLQlpd2wzOTQ1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKHByaXYpOwotCWl3bDM5NDVfaHdfcmVnX2NvbXBfdHhwb3dlcl90ZW1wKHByaXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9zZW5kX3J4b25fYXNzb2Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwotCXN0cnVjdCBpd2wzOTQ1X3J4b25fYXNzb2NfY21kIHJ4b25fYXNzb2M7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1JYT05fQVNTT0MsCi0JCS5sZW4gPSBzaXplb2Yocnhvbl9hc3NvYyksCi0JCS5mbGFncyA9IENNRF9XQU5UX1NLQiwKLQkJLmRhdGEgPSAmcnhvbl9hc3NvYywKLQl9OwotCWNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpyeG9uMSA9ICZjdHgtPnN0YWdpbmc7Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24yID0gJmN0eC0+YWN0aXZlOwotCi0JaWYgKChyeG9uMS0+ZmxhZ3MgPT0gcnhvbjItPmZsYWdzKSAmJgotCSAgICAocnhvbjEtPmZpbHRlcl9mbGFncyA9PSByeG9uMi0+ZmlsdGVyX2ZsYWdzKSAmJgotCSAgICAocnhvbjEtPmNja19iYXNpY19yYXRlcyA9PSByeG9uMi0+Y2NrX2Jhc2ljX3JhdGVzKSAmJgotCSAgICAocnhvbjEtPm9mZG1fYmFzaWNfcmF0ZXMgPT0gcnhvbjItPm9mZG1fYmFzaWNfcmF0ZXMpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJVc2luZyBjdXJyZW50IFJYT05fQVNTT0MuICBOb3QgcmVzZW5kaW5nLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXJ4b25fYXNzb2MuZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmxhZ3M7Ci0Jcnhvbl9hc3NvYy5maWx0ZXJfZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzOwotCXJ4b25fYXNzb2Mub2ZkbV9iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzOwotCXJ4b25fYXNzb2MuY2NrX2Jhc2ljX3JhdGVzID0gY3R4LT5zdGFnaW5nLmNja19iYXNpY19yYXRlczsKLQlyeG9uX2Fzc29jLnJlc2VydmVkID0gMDsKLQotCXJjID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHByaXYsICZjbWQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcGt0ID0gKHN0cnVjdCBpd2xfcnhfcGFja2V0ICopY21kLnJlcGx5X3BhZ2U7Ci0JaWYgKHBrdC0+aGRyLmZsYWdzICYgSVdMX0NNRF9GQUlMRURfTVNLKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkJhZCByZXR1cm4gZnJvbSBSRVBMWV9SWE9OX0FTU09DIGNvbW1hbmRcbiIpOwotCQlyYyA9IC1FSU87Ci0JfQotCi0JaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIGNtZC5yZXBseV9wYWdlKTsKLQotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2NvbW1pdF9yeG9uIC0gY29tbWl0IHN0YWdpbmdfcnhvbiB0byBoYXJkd2FyZQotICoKLSAqIFRoZSBSWE9OIGNvbW1hbmQgaW4gc3RhZ2luZ19yeG9uIGlzIGNvbW1pdHRlZCB0byB0aGUgaGFyZHdhcmUgYW5kCi0gKiB0aGUgYWN0aXZlX3J4b24gc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGRhdGEuICBUaGlzCi0gKiBmdW5jdGlvbiBjb3JyZWN0bHkgdHJhbnNpdGlvbnMgb3V0IG9mIHRoZSBSWE9OX0FTU09DX01TSyBzdGF0ZSBpZgotICogYSBIVyB0dW5lIGlzIHJlcXVpcmVkIGJhc2VkIG9uIHRoZSBSWE9OIHN0cnVjdHVyZSBjaGFuZ2VzLgotICovCi1pbnQgaXdsMzk0NV9jb21taXRfcnhvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JLyogY2FzdCBhd2F5IHRoZSBjb25zdCBmb3IgYWN0aXZlX3J4b24gaW4gdGhpcyBmdW5jdGlvbiAqLwotCXN0cnVjdCBpd2wzOTQ1X3J4b25fY21kICphY3RpdmVfcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOwotCXN0cnVjdCBpd2wzOTQ1X3J4b25fY21kICpzdGFnaW5nX3J4b24gPSAodm9pZCAqKSZjdHgtPnN0YWdpbmc7Ci0JaW50IHJjID0gMDsKLQlib29sIG5ld19hc3NvYyA9ICEhKHN0YWdpbmdfcnhvbi0+ZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLKTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtMTsKLQotCS8qIGFsd2F5cyBnZXQgdGltZXN0YW1wIHdpdGggUnggZnJhbWUgKi8KLQlzdGFnaW5nX3J4b24tPmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKLQotCS8qIHNlbGVjdCBhbnRlbm5hICovCi0Jc3RhZ2luZ19yeG9uLT5mbGFncyAmPQotCSAgICB+KFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX1NFTF9NU0spOwotCXN0YWdpbmdfcnhvbi0+ZmxhZ3MgfD0gaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhwcml2KTsKLQotCXJjID0gaXdsX2xlZ2FjeV9jaGVja19yeG9uX2NtZChwcml2LCBjdHgpOwotCWlmIChyYykgewotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIFJYT04gY29uZmlndXJhdGlvbi4gIE5vdCBjb21taXR0aW5nLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIElmIHdlIGRvbid0IG5lZWQgdG8gc2VuZCBhIGZ1bGwgUlhPTiwgd2UgY2FuIHVzZQotCSAqIGl3bDM5NDVfcnhvbl9hc3NvY19jbWQgd2hpY2ggaXMgdXNlZCB0byByZWNvbmZpZ3VyZSBmaWx0ZXIKLQkgKiBhbmQgb3RoZXIgZmxhZ3MgZm9yIHRoZSBjdXJyZW50IHJhZGlvIGNvbmZpZ3VyYXRpb24uICovCi0JaWYgKCFpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZChwcml2LAotCQkJJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKSkgewotCQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX2Fzc29jKHByaXYsCi0JCQkJCSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10pOwotCQlpZiAocmMpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkVycm9yIHNldHRpbmcgUlhPTl9BU1NPQyAiCi0JCQkJICAiY29uZmlndXJhdGlvbiAoJWQpLlxuIiwgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJbWVtY3B5KGFjdGl2ZV9yeG9uLCBzdGFnaW5nX3J4b24sIHNpemVvZigqYWN0aXZlX3J4b24pKTsKLQkJLyoKLQkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAotCQkgKiBkbyBpdCBub3cgaWYgdHggcG93ZXIgY2hhbmdlZC4KLQkJICovCi0JCWl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGFuZCB0aGUgbmV3IGNvbmZpZyByZXF1aXJlcwotCSAqIGFuIFJYT05fQVNTT0MgYW5kIHRoZSBuZXcgY29uZmlnIHdhbnRzIHRoZSBhc3NvY2lhdGVkIG1hc2sgZW5hYmxlZCwKLQkgKiB3ZSBtdXN0IGNsZWFyIHRoZSBhc3NvY2lhdGVkIGZyb20gdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCi0JICogYmVmb3JlIHdlIGFwcGx5IHRoZSBuZXcgY29uZmlnICovCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSAmJiBuZXdfYXNzb2MpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlRvZ2dsaW5nIGFzc29jaWF0ZWQgYml0IG9uIGN1cnJlbnQgUlhPTlxuIik7Ci0JCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQotCQkvKgotCQkgKiByZXNlcnZlZDQgYW5kIDUgY291bGQgaGF2ZSBiZWVuIGZpbGxlZCBieSB0aGUgaXdsY29yZSBjb2RlLgotCQkgKiBMZXQncyBjbGVhciB0aGVtIGJlZm9yZSBwdXNoaW5nIHRvIHRoZSAzOTQ1LgotCQkgKi8KLQkJYWN0aXZlX3J4b24tPnJlc2VydmVkNCA9IDA7Ci0JCWFjdGl2ZV9yeG9uLT5yZXNlcnZlZDUgPSAwOwotCQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1JYT04sCi0JCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3J4b25fY21kKSwKLQkJCQkgICAgICAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWN0aXZlKTsKLQotCQkvKiBJZiB0aGUgbWFzayBjbGVhcmluZyBmYWlsZWQgdGhlbiB3ZSBzZXQKLQkJICogYWN0aXZlX3J4b24gYmFjayB0byB3aGF0IGl0IHdhcyBwcmV2aW91c2x5ICovCi0JCWlmIChyYykgewotCQkJYWN0aXZlX3J4b24tPmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JCQlJV0xfRVJSKHByaXYsICJFcnJvciBjbGVhcmluZyBBU1NPQ19NU0sgb24gY3VycmVudCAiCi0JCQkJICAiY29uZmlndXJhdGlvbiAoJWQpLlxuIiwgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMocHJpdiwKLQkJCQkJICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0JCWl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucyhwcml2LAotCQkJCQkgJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2VuZGluZyBSWE9OXG4iCi0JCSAgICAgICAiKiB3aXRoJXMgUlhPTl9GSUxURVJfQVNTT0NfTVNLXG4iCi0JCSAgICAgICAiKiBjaGFubmVsID0gJWRcbiIKLQkJICAgICAgICIqIGJzc2lkID0gJXBNXG4iLAotCQkgICAgICAgKG5ld19hc3NvYyA/ICIiIDogIm91dCIpLAotCQkgICAgICAgbGUxNl90b19jcHUoc3RhZ2luZ19yeG9uLT5jaGFubmVsKSwKLQkJICAgICAgIHN0YWdpbmdfcnhvbi0+YnNzaWRfYWRkcik7Ci0KLQkvKgotCSAqIHJlc2VydmVkNCBhbmQgNSBjb3VsZCBoYXZlIGJlZW4gZmlsbGVkIGJ5IHRoZSBpd2xjb3JlIGNvZGUuCi0JICogTGV0J3MgY2xlYXIgdGhlbSBiZWZvcmUgcHVzaGluZyB0byB0aGUgMzk0NS4KLQkgKi8KLQlzdGFnaW5nX3J4b24tPnJlc2VydmVkNCA9IDA7Ci0Jc3RhZ2luZ19yeG9uLT5yZXNlcnZlZDUgPSAwOwotCi0JaXdsX2xlZ2FjeV9zZXRfcnhvbl9od2NyeXB0byhwcml2LCBjdHgsICFpd2wzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvKTsKLQotCS8qIEFwcGx5IHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLwotCXJjID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfUlhPTiwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9yeG9uX2NtZCksCi0JCQkgICAgICBzdGFnaW5nX3J4b24pOwotCWlmIChyYykgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIG5ldyBjb25maWd1cmF0aW9uICglZCkuXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQltZW1jcHkoYWN0aXZlX3J4b24sIHN0YWdpbmdfcnhvbiwgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwotCi0JaWYgKCFuZXdfYXNzb2MpIHsKLQkJaXdsX2xlZ2FjeV9jbGVhcl91Y29kZV9zdGF0aW9ucyhwcml2LAotCQkJCQkgJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKLQkJaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKHByaXYsCi0JCQkJCSZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0JfQotCi0JLyogSWYgd2UgaXNzdWUgYSBuZXcgUlhPTiBjb21tYW5kIHdoaWNoIHJlcXVpcmVkIGEgdHVuZSB0aGVuIHdlIG11c3QKLQkgKiBzZW5kIGEgbmV3IFRYUE9XRVIgY29tbWFuZCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIFR4IGFueSBmcmFtZXMgKi8KLQlyYyA9IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIHRydWUpOwotCWlmIChyYykgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIFR4IHBvd2VyICglZCkuXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBJbml0IHRoZSBoYXJkd2FyZSdzIHJhdGUgZmFsbGJhY2sgb3JkZXIgYmFzZWQgb24gdGhlIGJhbmQgKi8KLQlyYyA9IGl3bDM5NDVfaW5pdF9od19yYXRlX3RhYmxlKHByaXYpOwotCWlmIChyYykgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIEhXIHJhdGUgdGFibGU6ICUwMlhcbiIsIHJjKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyAtICBjYWxsZWQgd2hlbiB0aW1lIHRvIGNoZWNrIG91ciB0ZW1wZXJhdHVyZS4KLSAqCi0gKiAtLSByZXNldCBwZXJpb2RpYyB0aW1lcgotICogLS0gc2VlIGlmIHRlbXAgaGFzIGNoYW5nZWQgZW5vdWdoIHRvIHdhcnJhbnQgcmUtY2FsaWJyYXRpb24gLi4uIGlmIHNvOgotICogICAgIC0tIGNvcnJlY3QgY29lZmZzIGZvciB0ZW1wIChjYW4gcmVzZXQgdGVtcCB0aW1lcikKLSAqICAgICAtLSBzYXZlIHRoaXMgdGVtcCBhcyAibGFzdCIsCi0gKiAgICAgLS0gc2VuZCBuZXcgc2V0IG9mIGdhaW4gc2V0dGluZ3MgdG8gTklDCi0gKiBOT1RFOiAgVGhpcyBzaG91bGQgY29udGludWUgd29ya2luZywgZXZlbiB3aGVuIHdlJ3JlIG5vdCBhc3NvY2lhdGVkLAotICogICBzbyB3ZSBjYW4ga2VlcCBvdXIgaW50ZXJuYWwgdGFibGUgb2Ygc2NhbiBwb3dlcnMgY3VycmVudC4gKi8KLXZvaWQgaXdsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogVGhpcyB3aWxsIGtpY2sgaW4gdGhlICJicnV0ZSBmb3JjZSIKLQkgKiBpd2wzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcCgpIGJlbG93ICovCi0JaWYgKCFpd2wzOTQ1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKHByaXYpKQotCQlnb3RvIHJlc2NoZWR1bGU7Ci0KLQkvKiBTZXQgdXAgYSBuZXcgc2V0IG9mIHRlbXAtYWRqdXN0ZWQgVHhQb3dlcnMsIHNlbmQgdG8gTklDLgotCSAqIFRoaXMgaXMgYmFzZWQgKm9ubHkqIG9uIGN1cnJlbnQgdGVtcGVyYXR1cmUsCi0JICogaWdub3JpbmcgYW55IHByZXZpb3VzIHBvd2VyIG1lYXN1cmVtZW50cyAqLwotCWl3bDM5NDVfaHdfcmVnX2NvbXBfdHhwb3dlcl90ZW1wKHByaXYpOwotCi0gcmVzY2hlZHVsZToKLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJICAgJnByaXYtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMsIFJFR19SRUNBTElCX1BFUklPRCAqIEhaKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9iZ19yZWdfdHhwb3dlcl9wZXJpb2RpYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpd2xfcHJpdiwKLQkJCQkJICAgICBfMzk0NS50aGVybWFsX3BlcmlvZGljLndvcmspOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXdsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhwcml2KTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2h3X3JlZ19nZXRfY2hfZ3JwX2luZGV4IC0gZmluZCB0aGUgY2hhbm5lbC1ncm91cCBpbmRleCAoMC00KQotICogCQkJCSAgIGZvciB0aGUgY2hhbm5lbC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgY2hhbm5lbC1pbmZvIHN0cnVjdHMuCi0gKgotICogTk9URTogVGhlc2UgY2hhbm5lbCBncm91cHMgZG8gKk5PVCogbWF0Y2ggdGhlIGJhbmRzIGFib3ZlIQotICoJIFRoZXNlIGNoYW5uZWwgZ3JvdXBzIGFyZSBiYXNlZCBvbiBmYWN0b3J5LXRlc3RlZCBjaGFubmVsczsKLSAqCSBvbiBBLWJhbmQsIEVFUFJPTSdzICJncm91cCBmcmVxdWVuY3kiIGVudHJpZXMgcmVwcmVzZW50IHRoZSB0b3AKLSAqCSBjaGFubmVsIGluIGVhY2ggZ3JvdXAgMS00LiAgR3JvdXAgNSBBbGwgQi9HIGNoYW5uZWxzIGFyZSBpbiBncm91cCAwLgotICovCi1zdGF0aWMgdTE2IGl3bDM5NDVfaHdfcmVnX2dldF9jaF9ncnBfaW5kZXgoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbykKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgKmNoX2dycCA9ICZlZXByb20tPmdyb3Vwc1swXTsKLQl1OCBncm91cDsKLQl1MTYgZ3JvdXBfaW5kZXggPSAwOwkvKiBiYXNlZCBvbiBmYWN0b3J5IGNhbGliIGZyZXF1ZW5jaWVzICovCi0JdTggZ3JwX2NoYW5uZWw7Ci0KLQkvKiBGaW5kIHRoZSBncm91cCBpbmRleCBmb3IgdGhlIGNoYW5uZWwgLi4uIGRvbid0IHVzZSBpbmRleCAxKD8pICovCi0JaWYgKGl3bF9sZWdhY3lfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbykpIHsKLQkJZm9yIChncm91cCA9IDE7IGdyb3VwIDwgNTsgZ3JvdXArKykgewotCQkJZ3JwX2NoYW5uZWwgPSBjaF9ncnBbZ3JvdXBdLmdyb3VwX2NoYW5uZWw7Ci0JCQlpZiAoY2hfaW5mby0+Y2hhbm5lbCA8PSBncnBfY2hhbm5lbCkgewotCQkJCWdyb3VwX2luZGV4ID0gZ3JvdXA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLyogZ3JvdXAgNCBoYXMgYSBmZXcgY2hhbm5lbHMgKmFib3ZlKiBpdHMgZmFjdG9yeSBjYWwgZnJlcSAqLwotCQlpZiAoZ3JvdXAgPT0gNSkKLQkJCWdyb3VwX2luZGV4ID0gNDsKLQl9IGVsc2UKLQkJZ3JvdXBfaW5kZXggPSAwOwkvKiAyLjQgR0h6LCBncm91cCAwICovCi0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkNobmwgJWQgbWFwcGVkIHRvIGdycCAlZFxuIiwgY2hfaW5mby0+Y2hhbm5lbCwKLQkJCWdyb3VwX2luZGV4KTsKLQlyZXR1cm4gZ3JvdXBfaW5kZXg7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfZ2V0X21hdGNoZWRfcG93ZXJfaW5kZXggLSBJbnRlcnBvbGF0ZSB0byBnZXQgbm9taW5hbCBpbmRleAotICoKLSAqIEludGVycG9sYXRlIHRvIGdldCBub21pbmFsIChpLmUuIGF0IGZhY3RvcnkgY2FsaWJyYXRpb24gdGVtcGVyYXR1cmUpIGluZGV4Ci0gKiAgIGludG8gcmFkaW8vRFNQIGdhaW4gc2V0dGluZ3MgdGFibGUgZm9yIHJlcXVlc3RlZCBwb3dlci4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ19nZXRfbWF0Y2hlZF9wb3dlcl9pbmRleChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHM4IHJlcXVlc3RlZF9wb3dlciwKLQkJCQkgICAgICAgczMyIHNldHRpbmdfaW5kZXgsIHMzMiAqbmV3X2luZGV4KQotewotCWNvbnN0IHN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwICpjaG5sX2dycCA9IE5VTEw7Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCXMzMiBpbmRleDAsIGluZGV4MTsKLQlzMzIgcG93ZXIgPSAyICogcmVxdWVzdGVkX3Bvd2VyOwotCXMzMiBpOwotCWNvbnN0IHN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX3NhbXBsZSAqc2FtcGxlczsKLQlzMzIgZ2FpbnMwLCBnYWluczE7Ci0JczMyIHJlczsKLQlzMzIgZGVub21pbmF0b3I7Ci0KLQljaG5sX2dycCA9ICZlZXByb20tPmdyb3Vwc1tzZXR0aW5nX2luZGV4XTsKLQlzYW1wbGVzID0gY2hubF9ncnAtPnNhbXBsZXM7Ci0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZiAocG93ZXIgPT0gc2FtcGxlc1tpXS5wb3dlcikgewotCQkJKm5ld19pbmRleCA9IHNhbXBsZXNbaV0uZ2Fpbl9pbmRleDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JaWYgKHBvd2VyID4gc2FtcGxlc1sxXS5wb3dlcikgewotCQlpbmRleDAgPSAwOwotCQlpbmRleDEgPSAxOwotCX0gZWxzZSBpZiAocG93ZXIgPiBzYW1wbGVzWzJdLnBvd2VyKSB7Ci0JCWluZGV4MCA9IDE7Ci0JCWluZGV4MSA9IDI7Ci0JfSBlbHNlIGlmIChwb3dlciA+IHNhbXBsZXNbM10ucG93ZXIpIHsKLQkJaW5kZXgwID0gMjsKLQkJaW5kZXgxID0gMzsKLQl9IGVsc2UgewotCQlpbmRleDAgPSAzOwotCQlpbmRleDEgPSA0OwotCX0KLQotCWRlbm9taW5hdG9yID0gKHMzMikgc2FtcGxlc1tpbmRleDFdLnBvd2VyIC0gKHMzMikgc2FtcGxlc1tpbmRleDBdLnBvd2VyOwotCWlmIChkZW5vbWluYXRvciA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlnYWluczAgPSAoczMyKSBzYW1wbGVzW2luZGV4MF0uZ2Fpbl9pbmRleCAqICgxIDw8IDE5KTsKLQlnYWluczEgPSAoczMyKSBzYW1wbGVzW2luZGV4MV0uZ2Fpbl9pbmRleCAqICgxIDw8IDE5KTsKLQlyZXMgPSBnYWluczAgKyAoZ2FpbnMxIC0gZ2FpbnMwKSAqCi0JICAgICgoczMyKSBwb3dlciAtIChzMzIpIHNhbXBsZXNbaW5kZXgwXS5wb3dlcikgLyBkZW5vbWluYXRvciArCi0JICAgICgxIDw8IDE4KTsKLQkqbmV3X2luZGV4ID0gcmVzID4+IDE5OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2h3X3JlZ19pbml0X2NoYW5uZWxfZ3JvdXBzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MzIgaTsKLQlzMzIgcmF0ZV9pbmRleDsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JY29uc3Qgc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgKmdyb3VwOwotCi0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJJbml0aWFsaXppbmcgZmFjdG9yeSBjYWxpYiBpbmZvIGZyb20gRUVQUk9NXG4iKTsKLQotCWZvciAoaSA9IDA7IGkgPCBJV0xfTlVNX1RYX0NBTElCX0dST1VQUzsgaSsrKSB7Ci0JCXM4ICpjbGlwX3B3cnM7CS8qIHRhYmxlIG9mIHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlICovCi0JCXM4IHNhdHVyX3B3cjsJLyogc2F0dXJhdGlvbiBwb3dlciBmb3IgZWFjaCBjaG5sIGdyb3VwICovCi0JCWdyb3VwID0gJmVlcHJvbS0+Z3JvdXBzW2ldOwotCi0JCS8qIHNhbml0eSBjaGVjayBvbiBmYWN0b3J5IHNhdHVyYXRpb24gcG93ZXIgdmFsdWUgKi8KLQkJaWYgKGdyb3VwLT5zYXR1cmF0aW9uX3Bvd2VyIDwgNDApIHsKLQkJCUlXTF9XQVJOKHByaXYsICJFcnJvcjogc2F0dXJhdGlvbiBwb3dlciBpcyAlZCwgIgotCQkJCSAgICAibGVzcyB0aGFuIG1pbmltdW0gZXhwZWN0ZWQgNDBcbiIsCi0JCQkJICAgIGdyb3VwLT5zYXR1cmF0aW9uX3Bvd2VyKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qCi0JCSAqIERlcml2ZSByZXF1ZXN0ZWQgcG93ZXIgbGV2ZWxzIGZvciBlYWNoIHJhdGUsIGJhc2VkIG9uCi0JCSAqICAgaGFyZHdhcmUgY2FwYWJpbGl0aWVzIChzYXR1cmF0aW9uIHBvd2VyIGZvciBiYW5kKS4KLQkJICogQmFzaWMgdmFsdWUgaXMgM2RCIGRvd24gZnJvbSBzYXR1cmF0aW9uLCB3aXRoIGZ1cnRoZXIKLQkJICogICBwb3dlciByZWR1Y3Rpb25zIGZvciBoaWdoZXN0IDMgZGF0YSByYXRlcy4gIFRoZXNlCi0JCSAqICAgYmFja29mZnMgcHJvdmlkZSBoZWFkcm9vbSBmb3IgaGlnaCByYXRlIG1vZHVsYXRpb24KLQkJICogICBwb3dlciBwZWFrcywgd2l0aG91dCB0b28gbXVjaCBkaXN0b3J0aW9uIChjbGlwcGluZykuCi0JCSAqLwotCQkvKiB3ZSdsbCBmaWxsIGluIHRoaXMgYXJyYXkgd2l0aCBoL3cgbWF4IHBvd2VyIGxldmVscyAqLwotCQljbGlwX3B3cnMgPSAoczggKikgcHJpdi0+XzM5NDUuY2xpcF9ncm91cHNbaV0uY2xpcF9wb3dlcnM7Ci0KLQkJLyogZGl2aWRlIGZhY3Rvcnkgc2F0dXJhdGlvbiBwb3dlciBieSAyIHRvIGZpbmQgLTNkQiBsZXZlbCAqLwotCQlzYXR1cl9wd3IgPSAoczgpIChncm91cC0+c2F0dXJhdGlvbl9wb3dlciA+PiAxKTsKLQotCQkvKiBmaWxsIGluIGNoYW5uZWwgZ3JvdXAncyBub21pbmFsIHBvd2VycyBmb3IgZWFjaCByYXRlICovCi0JCWZvciAocmF0ZV9pbmRleCA9IDA7Ci0JCSAgICAgcmF0ZV9pbmRleCA8IElXTF9SQVRFX0NPVU5UXzM5NDU7IHJhdGVfaW5kZXgrKywgY2xpcF9wd3JzKyspIHsKLQkJCXN3aXRjaCAocmF0ZV9pbmRleCkgewotCQkJY2FzZSBJV0xfUkFURV8zNk1fSU5ERVhfVEFCTEU6Ci0JCQkJaWYgKGkgPT0gMCkJLyogQi9HICovCi0JCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3I7Ci0JCQkJZWxzZQkvKiBBICovCi0JCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSA1OwotCQkJCWJyZWFrOwotCQkJY2FzZSBJV0xfUkFURV80OE1fSU5ERVhfVEFCTEU6Ci0JCQkJaWYgKGkgPT0gMCkKLQkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDc7Ci0JCQkJZWxzZQotCQkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyIC0gMTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElXTF9SQVRFXzU0TV9JTkRFWF9UQUJMRToKLQkJCQlpZiAoaSA9PSAwKQotCQkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyIC0gOTsKLQkJCQllbHNlCi0JCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSAxMjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3cjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tIC0gU2V0IGNoYW5uZWwgcG93ZXIgaW5mbyBiYXNlZCBvbiBFRVBST00KLSAqCi0gKiBTZWNvbmQgcGFzcyAoZHVyaW5nIGluaXQpIHRvIHNldCB1cCBwcml2LT5jaGFubmVsX2luZm8KLSAqCi0gKiBTZXQgdXAgVHgtcG93ZXIgc2V0dGluZ3MgaW4gb3VyIGNoYW5uZWwgaW5mbyBkYXRhYmFzZSBmb3IgZWFjaCBWQUxJRAotICogKGZvciB0aGlzIGdlby9TS1UpIGNoYW5uZWwsIGF0IGFsbCBUeCBkYXRhIHJhdGVzLCBiYXNlZCBvbiBlZXByb20gdmFsdWVzCi0gKiBhbmQgY3VycmVudCB0ZW1wZXJhdHVyZS4KLSAqCi0gKiBTaW5jZSB0aGlzIGlzIGJhc2VkIG9uIGN1cnJlbnQgdGVtcGVyYXR1cmUgKGF0IGluaXQgdGltZSksIHRoZXNlIHZhbHVlcyBtYXkKLSAqIG5vdCBiZSB2YWxpZCBmb3IgdmVyeSBsb25nLCBidXQgaXQgZ2l2ZXMgdXMgYSBzdGFydGluZy9kZWZhdWx0IHBvaW50LAotICogYW5kIGFsbG93cyB1cyB0byBhY3RpdmUgKGkuZS4gdXNpbmcgVHgpIHNjYW4uCi0gKgotICogVGhpcyBkb2VzICpub3QqIHdyaXRlIHZhbHVlcyB0byBOSUMsIGp1c3Qgc2V0cyB1cCBvdXIgaW50ZXJuYWwgdGFibGUuCi0gKi8KLWludCBpd2wzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGl3bDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvICpwd3JfaW5mbzsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JaW50IGRlbHRhX2luZGV4OwotCXU4IHJhdGVfaW5kZXg7Ci0JdTggc2Nhbl90YmxfaW5kZXg7Ci0JY29uc3QgczggKmNsaXBfcHdyczsJLyogYXJyYXkgb2YgcG93ZXIgbGV2ZWxzIGZvciBlYWNoIHJhdGUgKi8KLQl1OCBnYWluLCBkc3BfYXR0ZW47Ci0JczggcG93ZXI7Ci0JdTggcHdyX2luZGV4LCBiYXNlX3B3cl9pbmRleCwgYV9iYW5kOwotCXU4IGk7Ci0JaW50IHRlbXBlcmF0dXJlOwotCi0JLyogc2F2ZSB0ZW1wZXJhdHVyZSByZWZlcmVuY2UsCi0JICogICBzbyB3ZSBjYW4gZGV0ZXJtaW5lIG5leHQgdGltZSB0byBjYWxpYnJhdGUgKi8KLQl0ZW1wZXJhdHVyZSA9IGl3bDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKHByaXYpOwotCXByaXYtPmxhc3RfdGVtcGVyYXR1cmUgPSB0ZW1wZXJhdHVyZTsKLQotCWl3bDM5NDVfaHdfcmVnX2luaXRfY2hhbm5lbF9ncm91cHMocHJpdik7Ci0KLQkvKiBpbml0aWFsaXplIFR4IHBvd2VyIGluZm8gZm9yIGVhY2ggYW5kIGV2ZXJ5IGNoYW5uZWwsIDIuNCBhbmQgNS54ICovCi0JZm9yIChpID0gMCwgY2hfaW5mbyA9IHByaXYtPmNoYW5uZWxfaW5mbzsgaSA8IHByaXYtPmNoYW5uZWxfY291bnQ7Ci0JICAgICBpKyssIGNoX2luZm8rKykgewotCQlhX2JhbmQgPSBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pOwotCQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGZpbmQgdGhpcyBjaGFubmVsJ3MgY2hhbm5lbCBncm91cCAoKm5vdCogImJhbmQiKSBpbmRleCAqLwotCQljaF9pbmZvLT5ncm91cF9pbmRleCA9Ci0JCQlpd2wzOTQ1X2h3X3JlZ19nZXRfY2hfZ3JwX2luZGV4KHByaXYsIGNoX2luZm8pOwotCi0JCS8qIEdldCB0aGlzIGNobmxncnAncyByYXRlLT5tYXgvY2xpcC1wb3dlcnMgdGFibGUgKi8KLQkJY2xpcF9wd3JzID0gcHJpdi0+XzM5NDUuY2xpcF9ncm91cHNbY2hfaW5mby0+Z3JvdXBfaW5kZXhdLmNsaXBfcG93ZXJzOwotCi0JCS8qIGNhbGN1bGF0ZSBwb3dlciBpbmRleCAqYWRqdXN0bWVudCogdmFsdWUgYWNjb3JkaW5nIHRvCi0JCSAqICBkaWZmIGJldHdlZW4gY3VycmVudCB0ZW1wZXJhdHVyZSBhbmQgZmFjdG9yeSB0ZW1wZXJhdHVyZSAqLwotCQlkZWx0YV9pbmRleCA9IGl3bDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wKHRlbXBlcmF0dXJlLAotCQkJCWVlcHJvbS0+Z3JvdXBzW2NoX2luZm8tPmdyb3VwX2luZGV4XS4KLQkJCQl0ZW1wZXJhdHVyZSk7Ci0KLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJEZWx0YSBpbmRleCBmb3IgY2hhbm5lbCAlZDogJWQgWyVkXVxuIiwKLQkJCQljaF9pbmZvLT5jaGFubmVsLCBkZWx0YV9pbmRleCwgdGVtcGVyYXR1cmUgKwotCQkJCUlXTF9URU1QX0NPTlZFUlQpOwotCi0JCS8qIHNldCB0eCBwb3dlciB2YWx1ZSBmb3IgYWxsIE9GRE0gcmF0ZXMgKi8KLQkJZm9yIChyYXRlX2luZGV4ID0gMDsgcmF0ZV9pbmRleCA8IElXTF9PRkRNX1JBVEVTOwotCQkgICAgIHJhdGVfaW5kZXgrKykgewotCQkJczMyIHVuaW5pdGlhbGl6ZWRfdmFyKHBvd2VyX2lkeCk7Ci0JCQlpbnQgcmM7Ci0KLQkJCS8qIHVzZSBjaGFubmVsIGdyb3VwJ3MgY2xpcC1wb3dlciB0YWJsZSwKLQkJCSAqICAgYnV0IGRvbid0IGV4Y2VlZCBjaGFubmVsJ3MgbWF4IHBvd2VyICovCi0JCQlzOCBwd3IgPSBtaW4oY2hfaW5mby0+bWF4X3Bvd2VyX2F2ZywKLQkJCQkgICAgIGNsaXBfcHdyc1tyYXRlX2luZGV4XSk7Ci0KLQkJCXB3cl9pbmZvID0gJmNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pbmRleF07Ci0KLQkJCS8qIGdldCBiYXNlIChpLmUuIGF0IGZhY3RvcnktbWVhc3VyZWQgdGVtcGVyYXR1cmUpCi0JCQkgKiAgICBwb3dlciB0YWJsZSBpbmRleCBmb3IgdGhpcyByYXRlJ3MgcG93ZXIgKi8KLQkJCXJjID0gaXdsMzk0NV9od19yZWdfZ2V0X21hdGNoZWRfcG93ZXJfaW5kZXgocHJpdiwgcHdyLAotCQkJCQkJCSBjaF9pbmZvLT5ncm91cF9pbmRleCwKLQkJCQkJCQkgJnBvd2VyX2lkeCk7Ci0JCQlpZiAocmMpIHsKLQkJCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIHBvd2VyIGluZGV4XG4iKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCQlwd3JfaW5mby0+YmFzZV9wb3dlcl9pbmRleCA9ICh1OCkgcG93ZXJfaWR4OwotCi0JCQkvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRlICovCi0JCQlwb3dlcl9pZHggKz0gZGVsdGFfaW5kZXg7Ci0KLQkJCS8qIHN0YXkgd2l0aGluIHJhbmdlIG9mIGdhaW4gdGFibGUgKi8KLQkJCXBvd2VyX2lkeCA9IGl3bDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pbmRleChwb3dlcl9pZHgpOwotCi0JCQkvKiBmaWxsIDEgT0ZETSByYXRlJ3MgaXdsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gc3RydWN0ICovCi0JCQlwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcHdyOwotCQkJcHdyX2luZm8tPnBvd2VyX3RhYmxlX2luZGV4ID0gKHU4KSBwb3dlcl9pZHg7Ci0JCQlwd3JfaW5mby0+dHBjLnR4X2dhaW4gPQotCQkJICAgIHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwb3dlcl9pZHhdLnR4X2dhaW47Ci0JCQlwd3JfaW5mby0+dHBjLmRzcF9hdHRlbiA9Ci0JCQkgICAgcG93ZXJfZ2Fpbl90YWJsZVthX2JhbmRdW3Bvd2VyX2lkeF0uZHNwX2F0dGVuOwotCQl9Ci0KLQkJLyogc2V0IHR4IHBvd2VyIGZvciBDQ0sgcmF0ZXMsIGJhc2VkIG9uIE9GRE0gMTIgTWJpdCBzZXR0aW5ncyovCi0JCXB3cl9pbmZvID0gJmNoX2luZm8tPnBvd2VyX2luZm9bSVdMX1JBVEVfMTJNX0lOREVYX1RBQkxFXTsKLQkJcG93ZXIgPSBwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyICsKLQkJCUlXTF9DQ0tfRlJPTV9PRkRNX1BPV0VSX0RJRkY7Ci0JCXB3cl9pbmRleCA9IHB3cl9pbmZvLT5wb3dlcl90YWJsZV9pbmRleCArCi0JCQlJV0xfQ0NLX0ZST01fT0ZETV9JTkRFWF9ESUZGOwotCQliYXNlX3B3cl9pbmRleCA9IHB3cl9pbmZvLT5iYXNlX3Bvd2VyX2luZGV4ICsKLQkJCUlXTF9DQ0tfRlJPTV9PRkRNX0lOREVYX0RJRkY7Ci0KLQkJLyogc3RheSB3aXRoaW4gdGFibGUgcmFuZ2UgKi8KLQkJcHdyX2luZGV4ID0gaXdsMzk0NV9od19yZWdfZml4X3Bvd2VyX2luZGV4KHB3cl9pbmRleCk7Ci0JCWdhaW4gPSBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcHdyX2luZGV4XS50eF9nYWluOwotCQlkc3BfYXR0ZW4gPSBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcHdyX2luZGV4XS5kc3BfYXR0ZW47Ci0KLQkJLyogZmlsbCBlYWNoIENDSyByYXRlJ3MgaXdsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gc3RydWN0dXJlCi0JCSAqIE5PVEU6ICBBbGwgQ0NLLXJhdGUgVHhwd3JzIGFyZSB0aGUgc2FtZSBmb3IgYSBnaXZlbiBjaG5sIQotCQkgKiBOT1RFOiAgQ0NLIHJhdGVzIHN0YXJ0IGF0IGVuZCBvZiBPRkRNIHJhdGVzISAqLwotCQlmb3IgKHJhdGVfaW5kZXggPSAwOwotCQkgICAgIHJhdGVfaW5kZXggPCBJV0xfQ0NLX1JBVEVTOyByYXRlX2luZGV4KyspIHsKLQkJCXB3cl9pbmZvID0gJmNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pbmRleCtJV0xfT0ZETV9SQVRFU107Ci0JCQlwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcG93ZXI7Ci0JCQlwd3JfaW5mby0+cG93ZXJfdGFibGVfaW5kZXggPSBwd3JfaW5kZXg7Ci0JCQlwd3JfaW5mby0+YmFzZV9wb3dlcl9pbmRleCA9IGJhc2VfcHdyX2luZGV4OwotCQkJcHdyX2luZm8tPnRwYy50eF9nYWluID0gZ2FpbjsKLQkJCXB3cl9pbmZvLT50cGMuZHNwX2F0dGVuID0gZHNwX2F0dGVuOwotCQl9Ci0KLQkJLyogc2V0IHNjYW4gdHggcG93ZXIsIDFNYml0IGZvciBDQ0ssIDZNYml0IGZvciBPRkRNICovCi0JCWZvciAoc2Nhbl90YmxfaW5kZXggPSAwOwotCQkgICAgIHNjYW5fdGJsX2luZGV4IDwgSVdMX05VTV9TQ0FOX1JBVEVTOyBzY2FuX3RibF9pbmRleCsrKSB7Ci0JCQlzMzIgYWN0dWFsX2luZGV4ID0gKHNjYW5fdGJsX2luZGV4ID09IDApID8KLQkJCQlJV0xfUkFURV8xTV9JTkRFWF9UQUJMRSA6IElXTF9SQVRFXzZNX0lOREVYX1RBQkxFOwotCQkJaXdsMzk0NV9od19yZWdfc2V0X3NjYW5fcG93ZXIocHJpdiwgc2Nhbl90YmxfaW5kZXgsCi0JCQkJYWN0dWFsX2luZGV4LCBjbGlwX3B3cnMsIGNoX2luZm8sIGFfYmFuZCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bDM5NDVfaHdfcnhxX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByYzsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9SQ1NSX0NPTkZJRygwKSwgMCk7Ci0JcmMgPSBpd2xfcG9sbF9kaXJlY3RfYml0KHByaXYsIEZIMzlfUlNTUl9TVEFUVVMsCi0JCQlGSDM5X1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRSwgMTAwMCk7Ci0JaWYgKHJjIDwgMCkKLQkJSVdMX0VSUihwcml2LCAiQ2FuJ3Qgc3RvcCBSeCBETUEuXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsMzk0NV9od190eF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQotewotCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7Ci0KLQlzdHJ1Y3QgaXdsMzk0NV9zaGFyZWQgKnNoYXJlZF9kYXRhID0gcHJpdi0+XzM5NDUuc2hhcmVkX3ZpcnQ7Ci0KLQlzaGFyZWRfZGF0YS0+dHhfYmFzZV9wdHJbdHhxX2lkXSA9IGNwdV90b19sZTMyKCh1MzIpdHhxLT5xLmRtYV9hZGRyKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9DQkNDX0NUUkwodHhxX2lkKSwgMCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X0NCQ0NfQkFTRSh0eHFfaWQpLCAwKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9UQ1NSX0NPTkZJRyh0eHFfaWQpLAotCQlGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9SVENfTk9JTlQgfAotCQlGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfVFhGIHwKLQkJRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9JRlRGRCB8Ci0JCUZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwgfAotCQlGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFKTsKLQotCS8qIGZha2UgcmVhZCB0byBmbHVzaCBhbGwgcHJldi4gd3JpdGVzICovCi0JaXdsX3JlYWQzMihwcml2LCBGSDM5X1RTU1JfQ0JCX0JBU0UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBIQ01EIHV0aWxzCi0gKi8KLXN0YXRpYyB1MTYgaXdsMzk0NV9nZXRfaGNtZF9zaXplKHU4IGNtZF9pZCwgdTE2IGxlbikKLXsKLQlzd2l0Y2ggKGNtZF9pZCkgewotCWNhc2UgUkVQTFlfUlhPTjoKLQkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9yeG9uX2NtZCk7Ci0JY2FzZSBQT1dFUl9UQUJMRV9DTUQ6Ci0JCXJldHVybiBzaXplb2Yoc3RydWN0IGl3bDM5NDVfcG93ZXJ0YWJsZV9jbWQpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBsZW47Ci0JfQotfQotCi0KLXN0YXRpYyB1MTYgaXdsMzk0NV9idWlsZF9hZGRzdGFfaGNtZChjb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kICpjbWQsCi0JCQkJCQkJCXU4ICpkYXRhKQotewotCXN0cnVjdCBpd2wzOTQ1X2FkZHN0YV9jbWQgKmFkZHN0YSA9IChzdHJ1Y3QgaXdsMzk0NV9hZGRzdGFfY21kICopZGF0YTsKLQlhZGRzdGEtPm1vZGUgPSBjbWQtPm1vZGU7Ci0JbWVtY3B5KCZhZGRzdGEtPnN0YSwgJmNtZC0+c3RhLCBzaXplb2Yoc3RydWN0IHN0YV9pZF9tb2RpZnkpKTsKLQltZW1jcHkoJmFkZHN0YS0+a2V5LCAmY21kLT5rZXksIHNpemVvZihzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvKSk7Ci0JYWRkc3RhLT5zdGF0aW9uX2ZsYWdzID0gY21kLT5zdGF0aW9uX2ZsYWdzOwotCWFkZHN0YS0+c3RhdGlvbl9mbGFnc19tc2sgPSBjbWQtPnN0YXRpb25fZmxhZ3NfbXNrOwotCWFkZHN0YS0+dGlkX2Rpc2FibGVfdHggPSBjcHVfdG9fbGUxNigwKTsKLQlhZGRzdGEtPnJhdGVfbl9mbGFncyA9IGNtZC0+cmF0ZV9uX2ZsYWdzOwotCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfdGlkOwotCWFkZHN0YS0+cmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOwotCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV9zc24gPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfc3NuOwotCi0JcmV0dXJuICh1MTYpc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X2FkZHN0YV9jbWQpOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfYWRkX2Jzc2lkX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgY29uc3QgdTggKmFkZHIsIHU4ICpzdGFfaWRfcikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc3RhX2lkX3IpCi0JCSpzdGFfaWRfciA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X2FkZF9zdGF0aW9uX2NvbW1vbihwcml2LCBjdHgsIGFkZHIsIDAsIE5VTEwsICZzdGFfaWQpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwgYWRkcik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKHN0YV9pZF9yKQotCQkqc3RhX2lkX3IgPSBzdGFfaWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSVdMX1NUQV9MT0NBTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IGl3bDM5NDVfbWFuYWdlX2lic3Nfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGJvb2wgYWRkKQotewotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCWludCByZXQ7Ci0KLQlpZiAoYWRkKSB7Ci0JCXJldCA9IGl3bDM5NDVfYWRkX2Jzc2lkX3N0YXRpb24ocHJpdiwgdmlmLT5ic3NfY29uZi5ic3NpZCwKLQkJCQkJCSZ2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlpd2wzOTQ1X3N5bmNfc3RhKHByaXYsIHZpZl9wcml2LT5pYnNzX2Jzc2lkX3N0YV9pZCwKLQkJCQkgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgPwotCQkJCSBJV0xfUkFURV82TV9QTENQIDogSVdMX1JBVEVfMU1fUExDUCk7Ci0JCWl3bDM5NDVfcmF0ZV9zY2FsZV9pbml0KHByaXYtPmh3LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOwotCi0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBpd2xfbGVnYWN5X3JlbW92ZV9zdGF0aW9uKHByaXYsIHZpZl9wcml2LT5pYnNzX2Jzc2lkX3N0YV9pZCwKLQkJCQkgIHZpZi0+YnNzX2NvbmYuYnNzaWQpOwotfQotCi0vKioKLSAqIGl3bDM5NDVfaW5pdF9od19yYXRlX3RhYmxlIC0gSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgcmF0ZSBmYWxsYmFjayB0YWJsZQotICovCi1pbnQgaXdsMzk0NV9pbml0X2h3X3JhdGVfdGFibGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByYywgaSwgaW5kZXgsIHByZXZfaW5kZXg7Ci0Jc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsaW5nX2NtZCByYXRlX2NtZCA9IHsKLQkJLnJlc2VydmVkID0gezAsIDAsIDB9LAotCX07Ci0Jc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsaW5nX2luZm8gKnRhYmxlID0gcmF0ZV9jbWQudGFibGU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpd2wzOTQ1X3JhdGVzKTsgaSsrKSB7Ci0JCWluZGV4ID0gaXdsMzk0NV9yYXRlc1tpXS50YWJsZV9yc19pbmRleDsKLQotCQl0YWJsZVtpbmRleF0ucmF0ZV9uX2ZsYWdzID0KLQkJCWl3bDM5NDVfaHdfc2V0X3JhdGVfbl9mbGFncyhpd2wzOTQ1X3JhdGVzW2ldLnBsY3AsIDApOwotCQl0YWJsZVtpbmRleF0udHJ5X2NudCA9IHByaXYtPnJldHJ5X3JhdGU7Ci0JCXByZXZfaW5kZXggPSBpd2wzOTQ1X2dldF9wcmV2X2llZWVfcmF0ZShpKTsKLQkJdGFibGVbaW5kZXhdLm5leHRfcmF0ZV9pbmRleCA9Ci0JCQkJaXdsMzk0NV9yYXRlc1twcmV2X2luZGV4XS50YWJsZV9yc19pbmRleDsKLQl9Ci0KLQlzd2l0Y2ggKHByaXYtPmJhbmQpIHsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJTZWxlY3QgQSBtb2RlIHJhdGUgc2NhbGVcbiIpOwotCQkvKiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBDQ0sgcmF0ZXMgaXMgdXNlZCwKLQkJICogaGF2ZSBpdCBmYWxsIGJhY2sgdG8gdGhlIDZNIE9GRE0gcmF0ZSAqLwotCQlmb3IgKGkgPSBJV0xfUkFURV8xTV9JTkRFWF9UQUJMRTsKLQkJCWkgPD0gSVdMX1JBVEVfMTFNX0lOREVYX1RBQkxFOyBpKyspCi0JCQl0YWJsZVtpXS5uZXh0X3JhdGVfaW5kZXggPQotCQkJICBpd2wzOTQ1X3JhdGVzW0lXTF9GSVJTVF9PRkRNX1JBVEVdLnRhYmxlX3JzX2luZGV4OwotCi0JCS8qIERvbid0IGZhbGwgYmFjayB0byBDQ0sgcmF0ZXMgKi8KLQkJdGFibGVbSVdMX1JBVEVfMTJNX0lOREVYX1RBQkxFXS5uZXh0X3JhdGVfaW5kZXggPQotCQkJCQkJSVdMX1JBVEVfOU1fSU5ERVhfVEFCTEU7Ci0KLQkJLyogRG9uJ3QgZHJvcCBvdXQgb2YgT0ZETSByYXRlcyAqLwotCQl0YWJsZVtJV0xfUkFURV82TV9JTkRFWF9UQUJMRV0ubmV4dF9yYXRlX2luZGV4ID0KLQkJICAgIGl3bDM5NDVfcmF0ZXNbSVdMX0ZJUlNUX09GRE1fUkFURV0udGFibGVfcnNfaW5kZXg7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlJV0xfREVCVUdfUkFURShwcml2LCAiU2VsZWN0IEIvRyBtb2RlIHJhdGUgc2NhbGVcbiIpOwotCQkvKiBJZiBhbiBPRkRNIHJhdGUgaXMgdXNlZCwgaGF2ZSBpdCBmYWxsIGJhY2sgdG8gdGhlCi0JCSAqIDFNIENDSyByYXRlcyAqLwotCi0JCWlmICghKHByaXYtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzICYgSVdMX09GRE1fUkFURVNfTUFTSykgJiYKLQkJICAgIGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkgewotCi0JCQlpbmRleCA9IElXTF9GSVJTVF9DQ0tfUkFURTsKLQkJCWZvciAoaSA9IElXTF9SQVRFXzZNX0lOREVYX1RBQkxFOwotCQkJICAgICBpIDw9IElXTF9SQVRFXzU0TV9JTkRFWF9UQUJMRTsgaSsrKQotCQkJCXRhYmxlW2ldLm5leHRfcmF0ZV9pbmRleCA9Ci0JCQkJCWl3bDM5NDVfcmF0ZXNbaW5kZXhdLnRhYmxlX3JzX2luZGV4OwotCi0JCQlpbmRleCA9IElXTF9SQVRFXzExTV9JTkRFWF9UQUJMRTsKLQkJCS8qIENDSyBzaG91bGRuJ3QgZmFsbCBiYWNrIHRvIE9GRE0uLi4gKi8KLQkJCXRhYmxlW2luZGV4XS5uZXh0X3JhdGVfaW5kZXggPSBJV0xfUkFURV81TV9JTkRFWF9UQUJMRTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCVdBUk5fT04oMSk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFVwZGF0ZSB0aGUgcmF0ZSBzY2FsaW5nIGZvciBjb250cm9sIGZyYW1lIFR4ICovCi0JcmF0ZV9jbWQudGFibGVfaWQgPSAwOwotCXJjID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfUkFURV9TQ0FMRSwgc2l6ZW9mKHJhdGVfY21kKSwKLQkJCSAgICAgICZyYXRlX2NtZCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBVcGRhdGUgdGhlIHJhdGUgc2NhbGluZyBmb3IgZGF0YSBmcmFtZSBUeCAqLwotCXJhdGVfY21kLnRhYmxlX2lkID0gMTsKLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfUkFURV9TQ0FMRSwgc2l6ZW9mKHJhdGVfY21kKSwKLQkJCQkmcmF0ZV9jbWQpOwotfQotCi0vKiBDYWxsZWQgd2hlbiBpbml0aWFsaXppbmcgZHJpdmVyICovCi1pbnQgaXdsMzk0NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQltZW1zZXQoKHZvaWQgKikmcHJpdi0+aHdfcGFyYW1zLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9od19wYXJhbXMpKTsKLQotCXByaXYtPl8zOTQ1LnNoYXJlZF92aXJ0ID0KLQkJZG1hX2FsbG9jX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3NoYXJlZCksCi0JCQkJICAgJnByaXYtPl8zOTQ1LnNoYXJlZF9waHlzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPl8zOTQ1LnNoYXJlZF92aXJ0KSB7Ci0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogQXNzaWduIG51bWJlciBvZiBVc2FibGUgVFggcXVldWVzICovCi0JcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKLQotCXByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsMzk0NV90ZmQpOwotCXByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID0gZ2V0X29yZGVyKElXTF9SWF9CVUZfU0laRV8zSyk7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9yeHFfc2l6ZSA9IFJYX1FVRVVFX1NJWkU7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9yeHFfbG9nID0gUlhfUVVFVUVfU0laRV9MT0c7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9ucyA9IElXTDM5NDVfU1RBVElPTl9DT1VOVDsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5iY2FzdF9zdGFfaWQgPSBJV0wzOTQ1X0JST0FEQ0FTVF9JRDsKLQotCXByaXYtPnN0YV9rZXlfbWF4X251bSA9IFNUQV9LRVlfTUFYX05VTTsKLQotCXByaXYtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZIMzlfUlNDU1JfQ0hOTDBfV1BUUjsKLQlwcml2LT5od19wYXJhbXMubWF4X2JlYWNvbl9pdHJ2bCA9IElXTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUw7Ci0JcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzID0gSVdMMzk0NV9FWFRfQkVBQ09OX1RJTUVfUE9TOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGludCBpd2wzOTQ1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgc3RydWN0IGl3bDM5NDVfZnJhbWUgKmZyYW1lLCB1OCByYXRlKQotewotCXN0cnVjdCBpd2wzOTQ1X3R4X2JlYWNvbl9jbWQgKnR4X2JlYWNvbl9jbWQ7Ci0JdW5zaWduZWQgaW50IGZyYW1lX3NpemU7Ci0KLQl0eF9iZWFjb25fY21kID0gKHN0cnVjdCBpd2wzOTQ1X3R4X2JlYWNvbl9jbWQgKikmZnJhbWUtPnU7Ci0JbWVtc2V0KHR4X2JlYWNvbl9jbWQsIDAsIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOwotCi0JdHhfYmVhY29uX2NtZC0+dHguc3RhX2lkID0KLQkJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYmNhc3Rfc3RhX2lkOwotCXR4X2JlYWNvbl9jbWQtPnR4LnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOwotCi0JZnJhbWVfc2l6ZSA9IGl3bDM5NDVfZmlsbF9iZWFjb25fZnJhbWUocHJpdiwKLQkJCQl0eF9iZWFjb25fY21kLT5mcmFtZSwKLQkJCQlzaXplb2YoZnJhbWUtPnUpIC0gc2l6ZW9mKCp0eF9iZWFjb25fY21kKSk7Ci0KLQlCVUdfT04oZnJhbWVfc2l6ZSA+IE1BWF9NUERVX1NJWkUpOwotCXR4X2JlYWNvbl9jbWQtPnR4LmxlbiA9IGNwdV90b19sZTE2KCh1MTYpZnJhbWVfc2l6ZSk7Ci0KLQl0eF9iZWFjb25fY21kLT50eC5yYXRlID0gcmF0ZTsKLQl0eF9iZWFjb25fY21kLT50eC50eF9mbGFncyA9IChUWF9DTURfRkxHX1NFUV9DVExfTVNLIHwKLQkJCQkgICAgICBUWF9DTURfRkxHX1RTRl9NU0spOwotCi0JLyogc3VwcF9yYXRlc1swXSA9PSBPRkRNIHN0YXJ0IGF0IElXTF9GSVJTVF9PRkRNX1JBVEUqLwotCXR4X2JlYWNvbl9jbWQtPnR4LnN1cHBfcmF0ZXNbMF0gPQotCQkoSVdMX09GRE1fQkFTSUNfUkFURVNfTUFTSyA+PiBJV0xfRklSU1RfT0ZETV9SQVRFKSAmIDB4RkY7Ci0KLQl0eF9iZWFjb25fY21kLT50eC5zdXBwX3JhdGVzWzFdID0KLQkJKElXTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyAmIDB4Rik7Ci0KLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3R4X2JlYWNvbl9jbWQpICsgZnJhbWVfc2l6ZTsKLX0KLQotdm9pZCBpd2wzOTQ1X2h3X3J4X2hhbmRsZXJfc2V0dXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1RYXSA9IGl3bDM5NDVfcnhfcmVwbHlfdHg7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfMzk0NV9SWF0gPSBpd2wzOTQ1X3J4X3JlcGx5X3J4OwotfQotCi12b2lkIGl3bDM5NDVfaHdfc2V0dXBfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMsCi0JCQkgIGl3bDM5NDVfYmdfcmVnX3R4cG93ZXJfcGVyaW9kaWMpOwotfQotCi12b2lkIGl3bDM5NDVfaHdfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMpOwotfQotCi0vKiBjaGVjayBjb250ZW50cyBvZiBzcGVjaWFsIGJvb3RzdHJhcCB1Q29kZSBTUkFNICovCi1zdGF0aWMgaW50IGl3bDM5NDVfdmVyaWZ5X2JzbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi0gewotCV9fbGUzMiAqaW1hZ2UgPSBwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQl1MzIgbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JdTMyIHJlZzsKLQl1MzIgdmFsOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJlZ2luIHZlcmlmeSBic21cbiIpOwotCi0JLyogdmVyaWZ5IEJTTSBTUkFNIGNvbnRlbnRzICovCi0JdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgQlNNX1dSX0RXQ09VTlRfUkVHKTsKLQlmb3IgKHJlZyA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOwotCSAgICAgcmVnIDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWcgKz0gc2l6ZW9mKHUzMiksIGltYWdlKyspIHsKLQkJdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgcmVnKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJCU00gdUNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZCBhdCAiCi0JCQkJICAiYWRkciAweCUwOFgrJXUgKG9mICV1KSwgaXMgMHgleCwgcy9iIDB4JXhcbiIsCi0JCQkJICBCU01fU1JBTV9MT1dFUl9CT1VORCwKLQkJCQkgIHJlZyAtIEJTTV9TUkFNX0xPV0VSX0JPVU5ELCBsZW4sCi0JCQkJICB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlNNIGJvb3RzdHJhcCB1Q29kZSBpbWFnZSBPS1xuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRUVQUk9NIHJlbGF0ZWQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENsZWFyIHRoZSBPV05FUl9NU0ssIHRvIGVzdGFibGlzaCBkcml2ZXIgKGluc3RlYWQgb2YgdUNvZGUgcnVubmluZyBvbgotICogZW1iZWRkZWQgY29udHJvbGxlcikgYXMgRUVQUk9NIHJlYWRlcjsgZWFjaCByZWFkIGlzIGEgc2VyaWVzIG9mIHB1bHNlcwotICogdG8vZnJvbSB0aGUgRUVQUk9NIGNoaXAsIG5vdCBhIHNpbmdsZSBldmVudCwgc28gZXZlbiByZWFkcyBjb3VsZCBjb25mbGljdAotICogaWYgdGhleSB3ZXJlbid0IGFyYml0cmF0ZWQgYnkgc29tZSBvd25lcnNoaXAgbWVjaGFuaXNtLiAgSGVyZSwgdGhlIGRyaXZlcgotICogc2ltcGx5IGNsYWltcyBvd25lcnNoaXAsIHdoaWNoIHNob3VsZCBiZSBzYWZlIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKLSAqIChpLmUuIGJlZm9yZSBsb2FkaW5nIHVDb2RlISkuCi0gKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCV9pd2xfbGVnYWN5X2NsZWFyX2JpdChwcml2LCBDU1JfRUVQUk9NX0dQLCBDU1JfRUVQUk9NX0dQX0lGX09XTkVSX01TSyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybjsKLX0KLQotIC8qKgotICAqIGl3bDM5NDVfbG9hZF9ic20gLSBMb2FkIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMKLSAgKgotICAqIEJTTSBvcGVyYXRpb246Ci0gICoKLSAgKiBUaGUgQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUgKEJTTSkgc3RvcmVzIGEgc2hvcnQgYm9vdHN0cmFwIHVDb2RlIHByb2dyYW0KLSAgKiBpbiBzcGVjaWFsIFNSQU0gdGhhdCBkb2VzIG5vdCBwb3dlciBkb3duIGR1cmluZyBSRktJTEwuICBXaGVuIHBvd2VyaW5nIGJhY2sKLSAgKiB1cCBhZnRlciBwb3dlci1zYXZpbmcgc2xlZXBzIChvciBkdXJpbmcgaW5pdGlhbCB1Q29kZSBsb2FkKSwgdGhlIEJTTSBsb2FkcwotICAqIHRoZSBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsIGFuZCBzdGFydHMgaXQuCi0gICoKLSAgKiBUaGUgYm9vdHN0cmFwIHByb2dyYW0gbG9hZHMgKHZpYSBETUEpIGluc3RydWN0aW9ucyBhbmQgZGF0YSBmb3IgYSBuZXcKLSAgKiBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIGhvc3QgZHJpdmVyIGluIHRoZQotICAqIEJTTV9EUkFNXyogcmVnaXN0ZXJzLiAgT25jZSB0aGUgbmV3IHByb2dyYW0gaXMgbG9hZGVkLCBpdCBzdGFydHMKLSAgKiBhdXRvbWF0aWNhbGx5LgotICAqCi0gICogV2hlbiBpbml0aWFsaXppbmcgdGhlIE5JQywgdGhlIGhvc3QgZHJpdmVyIHBvaW50cyB0aGUgQlNNIHRvIHRoZQotICAqICJpbml0aWFsaXplIiB1Q29kZSBpbWFnZS4gIFRoaXMgdUNvZGUgc2V0cyB1cCBzb21lIGludGVybmFsIGRhdGEsIHRoZW4KLSAgKiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgdGhhdCBpdCBpcyBjb21wbGV0ZS4KLSAgKgotICAqIFRoZSBob3N0IHRoZW4gcmVwbGFjZXMgdGhlIEJTTV9EUkFNXyogcG9pbnRlciB2YWx1ZXMgdG8gcG9pbnQgdG8gdGhlCi0gICogbm9ybWFsIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCBhIGJhY2t1cCB1Q29kZSBkYXRhIGNhY2hlIGJ1ZmZlcgotICAqIChmaWxsZWQgaW5pdGlhbGx5IHdpdGggc3RhcnRpbmcgZGF0YSB2YWx1ZXMgZm9yIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IpLAotICAqIHRoZW4gdHJpZ2dlcnMgdGhlICJpbml0aWFsaXplIiB1Q29kZSB0byBsb2FkIGFuZCBsYXVuY2ggdGhlIHJ1bnRpbWUgdUNvZGUsCi0gICogd2hpY2ggYmVnaW5zIG5vcm1hbCBvcGVyYXRpb24uCi0gICoKLSAgKiBXaGVuIGRvaW5nIGEgcG93ZXItc2F2ZSBzaHV0ZG93biwgcnVudGltZSB1Q29kZSBzYXZlcyBkYXRhIFNSQU0gaW50bwotICAqIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbiBEUkFNIGJlZm9yZSBTUkFNIGlzIHBvd2VyZWQgZG93bi4KLSAgKgotICAqIFdoZW4gcG93ZXJpbmcgYmFjayB1cCwgdGhlIEJTTSBsb2FkcyB0aGUgYm9vdHN0cmFwIHByb2dyYW0uICBUaGlzIHJlbG9hZHMKLSAgKiB0aGUgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbnRvIFNSQU0sCi0gICogYW5kIHJlLWxhdW5jaGVzIHRoZSBydW50aW1lIHVDb2RlIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYuCi0gICovCi1zdGF0aWMgaW50IGl3bDM5NDVfbG9hZF9ic20oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCV9fbGUzMiAqaW1hZ2UgPSBwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQl1MzIgbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JZG1hX2FkZHJfdCBwaW5zdDsKLQlkbWFfYWRkcl90IHBkYXRhOwotCXUzMiBpbnN0X2xlbjsKLQl1MzIgZGF0YV9sZW47Ci0JaW50IHJjOwotCWludCBpOwotCXUzMiBkb25lOwotCXUzMiByZWdfb2Zmc2V0OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJlZ2luIGxvYWQgYnNtXG4iKTsKLQotCS8qIG1ha2Ugc3VyZSBib290c3RyYXAgcHJvZ3JhbSBpcyBubyBsYXJnZXIgdGhhbiBCU00ncyBTUkFNIHNpemUgKi8KLQlpZiAobGVuID4gSVdMMzlfTUFYX0JTTV9TSVpFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFRlbGwgYm9vdHN0cmFwIHVDb2RlIHdoZXJlIHRvIGZpbmQgdGhlICJJbml0aWFsaXplIiB1Q29kZQotCSogICBpbiBob3N0IERSQU0gLi4uIGhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgMzE6MCBmb3IgMzk0NS4KLQkqIE5PVEU6ICBpd2wzOTQ1X2luaXRpYWxpemVfYWxpdmVfc3RhcnQoKSB3aWxsIHJlcGxhY2UgdGhlc2UgdmFsdWVzLAotCSogICAgICAgIGFmdGVyIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgaGFzIHJ1biwgdG8gcG9pbnQgdG8KLQkqICAgICAgICBydW50aW1lL3Byb3RvY29sIGluc3RydWN0aW9ucyBhbmQgYmFja3VwIGRhdGEgY2FjaGUuICovCi0JcGluc3QgPSBwcml2LT51Y29kZV9pbml0LnBfYWRkcjsKLQlwZGF0YSA9IHByaXYtPnVjb2RlX2luaXRfZGF0YS5wX2FkZHI7Ci0JaW5zdF9sZW4gPSBwcml2LT51Y29kZV9pbml0LmxlbjsKLQlkYXRhX2xlbiA9IHByaXYtPnVjb2RlX2luaXRfZGF0YS5sZW47Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcsIGluc3RfbGVuKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLCBkYXRhX2xlbik7Ci0KLQkvKiBGaWxsIEJTTSBtZW1vcnkgd2l0aCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zICovCi0JZm9yIChyZWdfb2Zmc2V0ID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7Ci0JICAgICByZWdfb2Zmc2V0IDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWdfb2Zmc2V0ICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKQotCQlfaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZ19vZmZzZXQsCi0JCQkJCSAgbGUzMl90b19jcHUoKmltYWdlKSk7Ci0KLQlyYyA9IGl3bDM5NDVfdmVyaWZ5X2JzbShwcml2KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIFRlbGwgQlNNIHRvIGNvcHkgZnJvbSBCU00gU1JBTSBpbnRvIGluc3RydWN0aW9uIFNSQU0sIHdoZW4gYXNrZWQgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX1dSX01FTV9TUkNfUkVHLCAweDApOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fV1JfTUVNX0RTVF9SRUcsCi0JCQkJIElXTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX1dSX0RXQ09VTlRfUkVHLCBsZW4gLyBzaXplb2YodTMyKSk7Ci0KLQkvKiBMb2FkIGJvb3RzdHJhcCBjb2RlIGludG8gaW5zdHJ1Y3Rpb24gU1JBTSBub3csCi0JICogICB0byBwcmVwYXJlIHRvIGxvYWQgImluaXRpYWxpemUiIHVDb2RlICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9XUl9DVFJMX1JFRywKLQkJQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCk7Ci0KLQkvKiBXYWl0IGZvciBsb2FkIG9mIGJvb3RzdHJhcCB1Q29kZSB0byBmaW5pc2ggKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJZG9uZSA9IGl3bF9sZWdhY3lfcmVhZF9wcnBoKHByaXYsIEJTTV9XUl9DVFJMX1JFRyk7Ci0JCWlmICghKGRvbmUgJiBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMTApOwotCX0KLQlpZiAoaSA8IDEwMCkKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJTTSB3cml0ZSBjb21wbGV0ZSwgcG9sbCAlZCBpdGVyYXRpb25zXG4iLCBpKTsKLQllbHNlIHsKLQkJSVdMX0VSUihwcml2LCAiQlNNIHdyaXRlIGRpZCBub3QgY29tcGxldGUhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogRW5hYmxlIGZ1dHVyZSBib290IGxvYWRzIHdoZW5ldmVyIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCB0cmlnZ2VycyBpdAotCSAqICAgKGUuZy4gd2hlbiBwb3dlcmluZyBiYWNrIHVwIGFmdGVyIHBvd2VyLXNhdmUgc2h1dGRvd24pICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9XUl9DVFJMX1JFRywKLQkJQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpd2xfaGNtZF9vcHMgaXdsMzk0NV9oY21kID0gewotCS5yeG9uX2Fzc29jID0gaXdsMzk0NV9zZW5kX3J4b25fYXNzb2MsCi0JLmNvbW1pdF9yeG9uID0gaXdsMzk0NV9jb21taXRfcnhvbiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2xpYl9vcHMgaXdsMzk0NV9saWIgPSB7Ci0JLnR4cV9hdHRhY2hfYnVmX3RvX3RmZCA9IGl3bDM5NDVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkLAotCS50eHFfZnJlZV90ZmQgPSBpd2wzOTQ1X2h3X3R4cV9mcmVlX3RmZCwKLQkudHhxX2luaXQgPSBpd2wzOTQ1X2h3X3R4X3F1ZXVlX2luaXQsCi0JLmxvYWRfdWNvZGUgPSBpd2wzOTQ1X2xvYWRfYnNtLAotCS5kdW1wX25pY19lcnJvcl9sb2cgPSBpd2wzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZywKLQkuYXBtX29wcyA9IHsKLQkJLmluaXQgPSBpd2wzOTQ1X2FwbV9pbml0LAotCQkuY29uZmlnID0gaXdsMzk0NV9uaWNfY29uZmlnLAotCX0sCi0JLmVlcHJvbV9vcHMgPSB7Ci0JCS5yZWd1bGF0b3J5X2JhbmRzID0gewotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xX0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zX0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF80X0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF81X0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwLAotCQl9LAotCQkuYWNxdWlyZV9zZW1hcGhvcmUgPSBpd2wzOTQ1X2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZSwKLQkJLnJlbGVhc2Vfc2VtYXBob3JlID0gaXdsMzk0NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUsCi0JfSwKLQkuc2VuZF90eF9wb3dlcgk9IGl3bDM5NDVfc2VuZF90eF9wb3dlciwKLQkuaXNfdmFsaWRfcnRjX2RhdGFfYWRkciA9IGl3bDM5NDVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkciwKLQotCS5kZWJ1Z2ZzX29wcyA9IHsKLQkJLnJ4X3N0YXRzX3JlYWQgPSBpd2wzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQsCi0JCS50eF9zdGF0c19yZWFkID0gaXdsMzk0NV91Y29kZV90eF9zdGF0c19yZWFkLAotCQkuZ2VuZXJhbF9zdGF0c19yZWFkID0gaXdsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9vcHMgaXdsMzk0NV9sZWdhY3lfb3BzID0gewotCS5wb3N0X2Fzc29jaWF0ZSA9IGl3bDM5NDVfcG9zdF9hc3NvY2lhdGUsCi0JLmNvbmZpZ19hcCA9IGl3bDM5NDVfY29uZmlnX2FwLAotCS5tYW5hZ2VfaWJzc19zdGF0aW9uID0gaXdsMzk0NV9tYW5hZ2VfaWJzc19zdGF0aW9uLAotfTsKLQotc3RhdGljIHN0cnVjdCBpd2xfaGNtZF91dGlsc19vcHMgaXdsMzk0NV9oY21kX3V0aWxzID0gewotCS5nZXRfaGNtZF9zaXplID0gaXdsMzk0NV9nZXRfaGNtZF9zaXplLAotCS5idWlsZF9hZGRzdGFfaGNtZCA9IGl3bDM5NDVfYnVpbGRfYWRkc3RhX2hjbWQsCi0JLnJlcXVlc3Rfc2NhbiA9IGl3bDM5NDVfcmVxdWVzdF9zY2FuLAotCS5wb3N0X3NjYW4gPSBpd2wzOTQ1X3Bvc3Rfc2NhbiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX29wcyBpd2wzOTQ1X29wcyA9IHsKLQkubGliID0gJml3bDM5NDVfbGliLAotCS5oY21kID0gJml3bDM5NDVfaGNtZCwKLQkudXRpbHMgPSAmaXdsMzk0NV9oY21kX3V0aWxzLAotCS5sZWQgPSAmaXdsMzk0NV9sZWRfb3BzLAotCS5sZWdhY3kgPSAmaXdsMzk0NV9sZWdhY3lfb3BzLAotCS5pZWVlODAyMTFfb3BzID0gJml3bDM5NDVfaHdfb3BzLAotfTsKLQotc3RhdGljIHN0cnVjdCBpd2xfYmFzZV9wYXJhbXMgaXdsMzk0NV9iYXNlX3BhcmFtcyA9IHsKLQkuZWVwcm9tX3NpemUgPSBJV0wzOTQ1X0VFUFJPTV9JTUdfU0laRSwKLQkubnVtX29mX3F1ZXVlcyA9IElXTDM5X05VTV9RVUVVRVMsCi0JLnBsbF9jZmdfdmFsID0gQ1NSMzlfQU5BX1BMTF9DRkdfVkFMLAotCS5zZXRfbDBzID0gZmFsc2UsCi0JLnVzZV9ic20gPSB0cnVlLAotCS5sZWRfY29tcGVuc2F0aW9uID0gNjQsCi0JLndkX3RpbWVvdXQgPSBJV0xfREVGX1dEX1RJTUVPVVQsCi19OwotCi1zdGF0aWMgc3RydWN0IGl3bF9jZmcgaXdsMzk0NV9iZ19jZmcgPSB7Ci0JLm5hbWUgPSAiMzk0NUJHIiwKLQkuZndfbmFtZV9wcmUgPSBJV0wzOTQ1X0ZXX1BSRSwKLQkudWNvZGVfYXBpX21heCA9IElXTDM5NDVfVUNPREVfQVBJX01BWCwKLQkudWNvZGVfYXBpX21pbiA9IElXTDM5NDVfVUNPREVfQVBJX01JTiwKLQkuc2t1ID0gSVdMX1NLVV9HLAotCS5lZXByb21fdmVyID0gRUVQUk9NXzM5NDVfRUVQUk9NX1ZFUlNJT04sCi0JLm9wcyA9ICZpd2wzOTQ1X29wcywKLQkubW9kX3BhcmFtcyA9ICZpd2wzOTQ1X21vZF9wYXJhbXMsCi0JLmJhc2VfcGFyYW1zID0gJml3bDM5NDVfYmFzZV9wYXJhbXMsCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2NmZyBpd2wzOTQ1X2FiZ19jZmcgPSB7Ci0JLm5hbWUgPSAiMzk0NUFCRyIsCi0JLmZ3X25hbWVfcHJlID0gSVdMMzk0NV9GV19QUkUsCi0JLnVjb2RlX2FwaV9tYXggPSBJV0wzOTQ1X1VDT0RFX0FQSV9NQVgsCi0JLnVjb2RlX2FwaV9taW4gPSBJV0wzOTQ1X1VDT0RFX0FQSV9NSU4sCi0JLnNrdSA9IElXTF9TS1VfQXxJV0xfU0tVX0csCi0JLmVlcHJvbV92ZXIgPSBFRVBST01fMzk0NV9FRVBST01fVkVSU0lPTiwKLQkub3BzID0gJml3bDM5NDVfb3BzLAotCS5tb2RfcGFyYW1zID0gJml3bDM5NDVfbW9kX3BhcmFtcywKLQkuYmFzZV9wYXJhbXMgPSAmaXdsMzk0NV9iYXNlX3BhcmFtcywKLQkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LLAotfTsKLQotREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaXdsMzk0NV9od19jYXJkX2lkcykgPSB7Ci0Je0lXTF9QQ0lfREVWSUNFKDB4NDIyMiwgMHgxMDA1LCBpd2wzOTQ1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMjIsIDB4MTAzNCwgaXdsMzk0NV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjIyLCAweDEwNDQsIGl3bDM5NDVfYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIyNywgMHgxMDE0LCBpd2wzOTQ1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMjIsIFBDSV9BTllfSUQsIGl3bDM5NDVfYWJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMjcsIFBDSV9BTllfSUQsIGl3bDM5NDVfYWJnX2NmZyl9LAotCXswfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGl3bDM5NDVfaHdfY2FyZF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMThiNTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLTM5NDUuaCkgZm9yIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBkZWZpbml0aW9ucy4KLSAqIFBsZWFzZSB1c2UgaXdsLTM5NDUtY29tbWFuZHMuaCBmb3IgdUNvZGUgQVBJIGRlZmluaXRpb25zLgotICogUGxlYXNlIHVzZSBpd2wtMzk0NS1ody5oIGZvciBoYXJkd2FyZS1yZWxhdGVkIGRlZmluaXRpb25zLgotICovCi0KLSNpZm5kZWYgX19pd2xfMzk0NV9oX18KLSNkZWZpbmUgX19pd2xfMzk0NV9oX18KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPiAvKiBmb3Igc3RydWN0IHBjaV9kZXZpY2VfaWQgKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+Ci0KLS8qIEhhcmR3YXJlIHNwZWNpZmljIGZpbGUgZGVmaW5lcyB0aGUgUENJIElEcyB0YWJsZSBmb3IgdGhhdCBoYXJkd2FyZSBtb2R1bGUgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpd2wzOTQ1X2h3X2NhcmRfaWRzW107Ci0KLSNpbmNsdWRlICJpd2wtY3NyLmgiCi0jaW5jbHVkZSAiaXdsLXBycGguaCIKLSNpbmNsdWRlICJpd2wtZmguaCIKLSNpbmNsdWRlICJpd2wtMzk0NS1ody5oIgotI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgotI2luY2x1ZGUgIml3bC1wb3dlci5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtbGVkLmgiCi0KLS8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDM5NDVfVUNPREVfQVBJX01BWCAyCi0KLS8qIExvd2VzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMMzk0NV9VQ09ERV9BUElfTUlOIDEKLQotI2RlZmluZSBJV0wzOTQ1X0ZXX1BSRQkiaXdsd2lmaS0zOTQ1LSIKLSNkZWZpbmUgX0lXTDM5NDVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMzk0NV9GV19QUkUgI2FwaSAiLnVjb2RlIgotI2RlZmluZSBJV0wzOTQ1X01PRFVMRV9GSVJNV0FSRShhcGkpIF9JV0wzOTQ1X01PRFVMRV9GSVJNV0FSRShhcGkpCi0KLS8qIERlZmF1bHQgbm9pc2UgbGV2ZWwgdG8gcmVwb3J0IHdoZW4gbm9pc2UgbWVhc3VyZW1lbnQgaXMgbm90IGF2YWlsYWJsZS4KLSAqICAgVGhpcyBtYXkgYmUgYmVjYXVzZSB3ZSdyZToKLSAqICAgMSkgIE5vdCBhc3NvY2lhdGVkICg0OTY1LCBubyBiZWFjb24gc3RhdGlzdGljcyBiZWluZyBzZW50IHRvIGRyaXZlcikKLSAqICAgMikgIFNjYW5uaW5nIChub2lzZSBtZWFzdXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBhc3NvY2lhdGVkIGNoYW5uZWwpCi0gKiAgIDMpICBSZWNlaXZpbmcgQ0NLICgzOTQ1IGRlbGl2ZXJzIG5vaXNlIGluZm8gb25seSBmb3IgT0ZETSBmcmFtZXMpCi0gKiBVc2UgZGVmYXVsdCBub2lzZSB2YWx1ZSBvZiAtMTI3IC4uLiB0aGlzIGlzIGJlbG93IHRoZSByYW5nZSBvZiBtZWFzdXJhYmxlCi0gKiAgIFJ4IGRCbSBmb3IgZWl0aGVyIDM5NDUgb3IgNDk2NSwgc28gaXQgY2FuIGluZGljYXRlICJ1bm1lYXN1cmFibGUiIHRvIHVzZXIuCi0gKiAgIEFsc28sIC0xMjcgd29ya3MgYmV0dGVyIHRoYW4gMCB3aGVuIGF2ZXJhZ2luZyBmcmFtZXMgd2l0aC93aXRob3V0Ci0gKiAgIG5vaXNlIGluZm8gKGUuZy4gYXZlcmFnaW5nIG1pZ2h0IGJlIGRvbmUgaW4gYXBwKTsgbWVhc3VyZWQgZEJtIHZhbHVlcyBhcmUKLSAqICAgYWx3YXlzIG5lZ2F0aXZlIC4uLiB1c2luZyBhIG5lZ2F0aXZlIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGtlZXBzIGFsbAotICogICBhdmVyYWdlcyB3aXRoaW4gYW4gczgncyAodXNlZCBpbiBzb21lIGFwcHMpIHJhbmdlIG9mIG5lZ2F0aXZlIHZhbHVlcy4gKi8KLSNkZWZpbmUgSVdMX05PSVNFX01FQVNfTk9UX0FWQUlMQUJMRSAoLTEyNykKLQotLyogTW9kdWxlIHBhcmFtZXRlcnMgYWNjZXNzaWJsZSBmcm9tIGl3bC0qLmMgKi8KLWV4dGVybiBzdHJ1Y3QgaXdsX21vZF9wYXJhbXMgaXdsMzk0NV9tb2RfcGFyYW1zOwotCi1zdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxlX2RhdGEgewotCXU2NCBkYXRhOwotCXMzMiBzdWNjZXNzX2NvdW50ZXI7Ci0JczMyIHN1Y2Nlc3NfcmF0aW87Ci0JczMyIGNvdW50ZXI7Ci0JczMyIGF2ZXJhZ2VfdHB0OwotCXVuc2lnbmVkIGxvbmcgc3RhbXA7Ci19OwotCi1zdHJ1Y3QgaXdsMzk0NV9yc19zdGEgewotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0JczMyICpleHBlY3RlZF90cHQ7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3BhcnRpYWxfZmx1c2g7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X2ZsdXNoOwotCXUzMiBmbHVzaF90aW1lOwotCXUzMiBsYXN0X3R4X3BhY2tldHM7Ci0JdTMyIHR4X3BhY2tldHM7Ci0JdTggdGdnOwotCXU4IGZsdXNoX3BlbmRpbmc7Ci0JdTggc3RhcnRfcmF0ZTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCByYXRlX3NjYWxlX2ZsdXNoOwotCXN0cnVjdCBpd2wzOTQ1X3JhdGVfc2NhbGVfZGF0YSB3aW5bSVdMX1JBVEVfQ09VTlRfMzk0NV07Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKLQlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZTsKLSNlbmRpZgotCi0JLyogdXNlZCB0byBiZSBpbiBzdGFfaW5mbyAqLwotCWludCBsYXN0X3R4cmF0ZV9pZHg7Ci19OwotCi0KLS8qCi0gKiBUaGUgY29tbW9uIHN0cnVjdCBNVVNUIGJlIGZpcnN0IGJlY2F1c2UgaXQgaXMgc2hhcmVkIGJldHdlZW4KLSAqIDM5NDUgYW5kIDQ5NjUhCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2IHsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdl9jb21tb24gY29tbW9uOwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSByc19zdGE7Ci19OwotCi1lbnVtIGl3bDM5NDVfYW50ZW5uYSB7Ci0JSVdMX0FOVEVOTkFfRElWRVJTSVRZLAotCUlXTF9BTlRFTk5BX01BSU4sCi0JSVdMX0FOVEVOTkFfQVVYCi19OwotCi0vKgotICogUlRTIHRocmVzaG9sZCBoZXJlIGlzIHRvdGFsIHNpemUgWzIzNDddIG1pbnVzIDQgRkNTIGJ5dGVzCi0gKiBQZXIgc3BlYzoKLSAqICAgYSB2YWx1ZSBvZiAwIG1lYW5zIFJUUyBvbiBhbGwgZGF0YS9tYW5hZ2VtZW50IHBhY2tldHMKLSAqICAgYSB2YWx1ZSA+IG1heCBNU0RVIHNpemUgbWVhbnMgbm8gUlRTCi0gKiBlbHNlIFJUUyBmb3IgZGF0YS9tYW5hZ2VtZW50IGZyYW1lcyB3aGVyZSBNUERVIGlzIGxhcmdlcgotICogICB0aGFuIFJUUyB2YWx1ZS4KLSAqLwotI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgICAgIDIzNDdVCi0jZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEICAgICAgICAgMFUKLSNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAyMzQ3VQotI2RlZmluZSBNQVhfTVNEVV9TSVpFCQkgIDIzMDRVCi0jZGVmaW5lIE1BWF9NUERVX1NJWkUJCSAgMjM0NlUKLSNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwgICAxMDBVCi0jZGVmaW5lCURFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQgN1UKLSNkZWZpbmUJREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUICA0VQotCi0jZGVmaW5lIElXTF9UWF9GSUZPX0FDMAkwCi0jZGVmaW5lIElXTF9UWF9GSUZPX0FDMQkxCi0jZGVmaW5lIElXTF9UWF9GSUZPX0FDMgkyCi0jZGVmaW5lIElXTF9UWF9GSUZPX0FDMwkzCi0jZGVmaW5lIElXTF9UWF9GSUZPX0hDQ0FfMQk1Ci0jZGVmaW5lIElXTF9UWF9GSUZPX0hDQ0FfMgk2Ci0jZGVmaW5lIElXTF9UWF9GSUZPX05PTkUJNwotCi0jZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTiAgICAgICAgICAgICAgMjMwNAotI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOICAgICAgICAgICAgIDMwCi0jZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCi0jZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQotCi1zdHJ1Y3QgaXdsMzk0NV9mcmFtZSB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciBmcmFtZTsKLQkJc3RydWN0IGl3bDM5NDVfdHhfYmVhY29uX2NtZCBiZWFjb247Ci0JCXU4IHJhd1tJRUVFODAyMTFfRlJBTUVfTEVOXTsKLQkJdTggY21kWzM2MF07Ci0JfSB1OwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07Ci0KLSNkZWZpbmUgU0VRX1RPX1NOKHNlcSkgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKLSNkZWZpbmUgU05fVE9fU0VRKHNzbikgKCgoc3NuKSA8PCA0KSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKLSNkZWZpbmUgTUFYX1NOICgoSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQotCi0jZGVmaW5lIFNVUF9SQVRFXzExQV9NQVhfTlVNX0NIQU5ORUxTICA4Ci0jZGVmaW5lIFNVUF9SQVRFXzExQl9NQVhfTlVNX0NIQU5ORUxTICA0Ci0jZGVmaW5lIFNVUF9SQVRFXzExR19NQVhfTlVNX0NIQU5ORUxTICAxMgotCi0jZGVmaW5lIElXTF9TVVBQT1JURURfUkFURVNfSUVfTEVOICAgICAgICAgOAotCi0jZGVmaW5lIFNDQU5fSU5URVJWQUwgMTAwCi0KLSNkZWZpbmUgTUFYX1RJRF9DT1VOVCAgICAgICAgOQotCi0jZGVmaW5lIElXTF9JTlZBTElEX1JBVEUgICAgIDB4RkYKLSNkZWZpbmUgSVdMX0lOVkFMSURfVkFMVUUgICAgLTEKLQotI2RlZmluZSBTVEFfUFNfU1RBVFVTX1dBS0UgICAgICAgICAgICAgMAotI2RlZmluZSBTVEFfUFNfU1RBVFVTX1NMRUVQICAgICAgICAgICAgMQotCi1zdHJ1Y3QgaXdsMzk0NV9pYnNzX3NlcSB7Ci0JdTggbWFjW0VUSF9BTEVOXTsKLQl1MTYgc2VxX251bTsKLQl1MTYgZnJhZ19udW07Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi0jZGVmaW5lIElXTF9SWF9IRFIoeCkgKChzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9oZHIgKikoXAotCQkgICAgICAgeC0+dS5yeF9mcmFtZS5zdGF0cy5wYXlsb2FkICsgXAotCQkgICAgICAgeC0+dS5yeF9mcmFtZS5zdGF0cy5waHlfY291bnQpKQotI2RlZmluZSBJV0xfUlhfRU5EKHgpICgoc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfZW5kICopKFwKLQkJICAgICAgIElXTF9SWF9IRFIoeCktPnBheWxvYWQgKyBcCi0JCSAgICAgICBsZTE2X3RvX2NwdShJV0xfUlhfSERSKHgpLT5sZW4pKSkKLSNkZWZpbmUgSVdMX1JYX1NUQVRTKHgpICgmeC0+dS5yeF9mcmFtZS5zdGF0cykKLSNkZWZpbmUgSVdMX1JYX0RBVEEoeCkgKElXTF9SWF9IRFIoeCktPnBheWxvYWQpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBpd2wzOTQ1LWJhc2UuYyB3aGljaCBhcmUgZm9yd2FyZCBkZWNsYXJlZCBoZXJlCi0gKiBmb3IgdXNlIGJ5IGl3bC0qLmMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gaW50IGl3bDM5NDVfY2FsY19kYl9mcm9tX3JhdGlvKGludCBzaWdfcmF0aW8pOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9yeF9yZXBsZW5pc2godm9pZCAqZGF0YSk7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgaXdsMzk0NV9maWxsX2JlYWNvbl9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIGludCBsZWZ0KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9kdW1wX25pY19ldmVudF9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGZ1bGxfbG9nLAotCQkJCSAgICAgICBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBpd2wtWzM0XSouYyB3aGljaCBhcmUgZm9yd2FyZCBkZWNsYXJlZCBoZXJlCi0gKiBmb3IgdXNlIGJ5IGl3bDM5NDUtYmFzZS5jCi0gKgotICogTk9URTogIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGhhcmR3YXJlIHNwZWNpZmljCi0gKiB3aGljaCBpcyB3aHkgdGhleSBhcmUgaW4gdGhlIGhhcmR3YXJlIHNwZWNpZmljIGZpbGVzICh2cy4gaXdsLWJhc2UuYykKLSAqCi0gKiBOYW1pbmcgY29udmVudGlvbiAtLQotICogaXdsMzk0NV8gICAgICAgICA8LS0gSXRzIHBhcnQgb2YgaXdsd2lmaSAoc2hvdWxkIGJlIGNoYW5nZWQgdG8gaXdsMzk0NV8pCi0gKiBpd2wzOTQ1X2h3XyAgICAgIDwtLSBIYXJkd2FyZSBzcGVjaWZpYyAoaW1wbGVtZW50ZWQgaW4gaXdsLVhYWFguYyBieSBhbGwgSFcpCi0gKiBpd2xYWFhYXyAgICAgPC0tIEhhcmR3YXJlIHNwZWNpZmljIChpbXBsZW1lbnRlZCBpbiBpd2wtWFhYWC5jIGZvciBYWFhYKQotICogaXdsMzk0NV9iZ18gICAgICA8LS0gQ2FsbGVkIGZyb20gd29yayBxdWV1ZSBjb250ZXh0Ci0gKiBpd2wzOTQ1X21hY18gICAgIDwtLSBtYWM4MDIxMSBjYWxsYmFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9od19yeF9oYW5kbGVyX3NldHVwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X2h3X3NldHVwX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfaHdfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9od19yeHFfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X3NldF9od19wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9od19uaWNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X25pY19zdG9wX21hc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9od190eHFfY3R4X2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfaHdfdHhxX2N0eF9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gaW50IGl3bDM5NDVfaHdfbmljX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gaW50IGl3bDM5NDVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkJICAgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwKLQkJCQkJICAgIHU4IHJlc2V0LCB1OCBwYWQpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9od190eHFfZnJlZV90ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGl3bDM5NDVfaHdfZ2V0X2JlYWNvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsMzk0NV9mcmFtZSAqZnJhbWUsIHU4IHJhdGUpOwotdm9pZCBpd2wzOTQ1X2h3X2J1aWxkX3R4X2NtZF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKLQkJCQkgIGludCBzdGFfaWQsIGludCB0eF9pZCk7Ci1leHRlcm4gaW50IGl3bDM5NDVfaHdfcmVnX3NlbmRfdHhwb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X3JlZ19zZXRfdHhwb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHM4IHBvd2VyKTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfaHdfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLXZvaWQgaXdsMzk0NV9yZXBseV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfZGlzYWJsZV9ldmVudHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsNDk2NV9nZXRfdGVtcGVyYXR1cmUoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfcG9zdF9hc3NvY2lhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfY29uZmlnX2FwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLWV4dGVybiBpbnQgaXdsMzk0NV9jb21taXRfcnhvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci0KLS8qKgotICogaXdsMzk0NV9od19maW5kX3N0YXRpb24gLSBGaW5kIHN0YXRpb24gaWQgZm9yIGEgZ2l2ZW4gQlNTSUQKLSAqIEBic3NpZDogTUFDIGFkZHJlc3Mgb2Ygc3RhdGlvbiBJRCB0byBmaW5kCi0gKgotICogTk9URTogIFRoaXMgc2hvdWxkIG5vdCBiZSBoYXJkd2FyZSBzcGVjaWZpYyBidXQgdGhlIGNvZGUgaGFzCi0gKiBub3QgeWV0IGJlZW4gbWVyZ2VkIGludG8gYSBzaW5nbGUgY29tbW9uIGxheWVyIGZvciBtYW5hZ2luZyB0aGUKLSAqIHN0YXRpb24gdGFibGVzLgotICovCi1leHRlcm4gdTggaXdsMzk0NV9od19maW5kX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCB1OCAqYnNzaWQpOwotCi1leHRlcm4gc3RydWN0IGllZWU4MDIxMV9vcHMgaXdsMzk0NV9od19vcHM7Ci0KLS8qCi0gKiBGb3J3YXJkIGRlY2xhcmUgaXdsLTM5NDUuYyBmdW5jdGlvbnMgZm9yIGl3bDM5NDUtYmFzZS5jCi0gKi8KLWV4dGVybiBfX2xlMzIgaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2luaXRfaHdfcmF0ZV90YWJsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqaXdsMzk0NV9nZXRfY2hhbm5lbF9pbmZvKAotCWNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLCB1MTYgY2hhbm5lbCk7Ci0KLWV4dGVybiBpbnQgaXdsMzk0NV9yc19uZXh0X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgcmF0ZSk7Ci0KLS8qIHNjYW5uaW5nICovCi1pbnQgaXdsMzk0NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLXZvaWQgaXdsMzk0NV9wb3N0X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotLyogcmF0ZXMgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsMzk0NV9yYXRlX2luZm8gaXdsMzk0NV9yYXRlc1tJV0xfUkFURV9DT1VOVF8zOTQ1XTsKLQotLyogUmVxdWlyZXMgZnVsbCBkZWNsYXJhdGlvbiBvZiBpd2xfcHJpdiBiZWZvcmUgaW5jbHVkaW5nICovCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWNhbGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmQ4NzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDk2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJTklUIGNhbGlicmF0aW9ucyBmcmFtZXdvcmsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9kYXRhIHsKLQl1MzIgYmVhY29uX3NpbGVuY2VfcnNzaV9hOwotCXUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2I7Ci0JdTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYzsKLQl1MzIgYmVhY29uX2VuZXJneV9hOwotCXUzMiBiZWFjb25fZW5lcmd5X2I7Ci0JdTMyIGJlYWNvbl9lbmVyZ3lfYzsKLX07Ci0KLXZvaWQgaXdsNDk2NV9jYWxpYl9mcmVlX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IElXTF9DQUxJQl9NQVg7IGkrKykgewotCQlrZnJlZShwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zik7Ci0JCXByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmID0gTlVMTDsKLQkJcHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWZfbGVuID0gMDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUlVOVElNRSBjYWxpYnJhdGlvbnMgZnJhbWV3b3JrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qICJmYWxzZSBhbGFybXMiIGFyZSBzaWduYWxzIHRoYXQgb3VyIERTUCB0cmllcyB0byBsb2NrIG9udG8sCi0gKiAgIGJ1dCB0aGVuIGRldGVybWluZXMgdGhhdCB0aGV5IGFyZSBlaXRoZXIgbm9pc2UsIG9yIHRyYW5zbWlzc2lvbnMKLSAqICAgZnJvbSBhIGRpc3RhbnQgd2lyZWxlc3MgbmV0d29yayAoYWxzbyAibm9pc2UiLCByZWFsbHkpIHRoYXQgZ2V0Ci0gKiAgICJzdGVwcGVkIG9uIiBieSBzdHJvbmdlciB0cmFuc21pc3Npb25zIHdpdGhpbiBvdXIgb3duIG5ldHdvcmsuCi0gKiBUaGlzIGFsZ29yaXRobSBhdHRlbXB0cyB0byBzZXQgYSBzZW5zaXRpdml0eSBsZXZlbCB0aGF0IGlzIGhpZ2gKLSAqICAgZW5vdWdoIHRvIHJlY2VpdmUgYWxsIG9mIG91ciBvd24gbmV0d29yayB0cmFmZmljLCBidXQgbm90IHNvCi0gKiAgIGhpZ2ggdGhhdCBvdXIgRFNQIGdldHMgdG9vIGJ1c3kgdHJ5aW5nIHRvIGxvY2sgb250byBub24tbmV0d29yawotICogICBhY3Rpdml0eS9ub2lzZS4gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZW5zX2VuZXJneV9jY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHUzMiBub3JtX2ZhLAotCQkJCSAgIHUzMiByeF9lbmFibGVfdGltZSwKLQkJCQkgICBzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2RhdGEgKnJ4X2luZm8pCi17Ci0JdTMyIG1heF9ucmdfY2NrID0gMDsKLQlpbnQgaSA9IDA7Ci0JdTggbWF4X3NpbGVuY2VfcnNzaSA9IDA7Ci0JdTMyIHNpbGVuY2VfcmVmID0gMDsKLQl1OCBzaWxlbmNlX3Jzc2lfYSA9IDA7Ci0JdTggc2lsZW5jZV9yc3NpX2IgPSAwOwotCXU4IHNpbGVuY2VfcnNzaV9jID0gMDsKLQl1MzIgdmFsOwotCi0JLyogImZhbHNlX2FsYXJtcyIgdmFsdWVzIGJlbG93IGFyZSBjcm9zcy1tdWx0aXBsaWNhdGlvbnMgdG8gYXNzZXNzIHRoZQotCSAqICAgbnVtYmVycyBvZiBmYWxzZSBhbGFybXMgd2l0aGluIHRoZSBtZWFzdXJlZCBwZXJpb2Qgb2YgYWN0dWFsIFJ4Ci0JICogICAoUnggaXMgb2ZmIHdoZW4gd2UncmUgdHhpbmcpLCB2cyB0aGUgbWluL21heCBleHBlY3RlZCBmYWxzZSBhbGFybXMKLQkgKiAgIChzb21lIHNob3VsZCBiZSBleHBlY3RlZCBpZiByeCBpcyBzZW5zaXRpdmUgZW5vdWdoKSBpbiBhCi0JICogICBoeXBvdGhldGljYWwgbGlzdGVuaW5nIHBlcmlvZCBvZiAyMDAgdGltZSB1bml0cyAoVFUpLCAyMDQuOCBtc2VjOgotCSAqCi0JICogTUlOX0ZBL2ZpeGVkLXRpbWUgPCBmYWxzZV9hbGFybXMvYWN0dWFsLXJ4LXRpbWUgPCBNQVhfRkEvYmVhY29uLXRpbWUKLQkgKgotCSAqICovCi0JdTMyIGZhbHNlX2FsYXJtcyA9IG5vcm1fZmEgKiAyMDAgKiAxMDI0OwotCXUzMiBtYXhfZmFsc2VfYWxhcm1zID0gTUFYX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOwotCXUzMiBtaW5fZmFsc2VfYWxhcm1zID0gTUlOX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgKnJhbmdlcyA9IHByaXYtPmh3X3BhcmFtcy5zZW5zOwotCi0JZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7Ci0KLQlkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA9IDA7Ci0KLQkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYW1vbmcgYWxsIDMgcmVjZWl2ZXJzLgotCSAqIFRoaXMgaXMgYmFja2dyb3VuZCBub2lzZSwgd2hpY2ggbWF5IGluY2x1ZGUgdHJhbnNtaXNzaW9ucyBmcm9tIG90aGVyCi0JICogICAgbmV0d29ya3MsIG1lYXN1cmVkIGR1cmluZyBzaWxlbmNlIGJlZm9yZSBvdXIgbmV0d29yaydzIGJlYWNvbiAqLwotCXNpbGVuY2VfcnNzaV9hID0gKHU4KSgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hICYKLQkJCSAgICBBTExfQkFORF9GSUxURVIpID4+IDgpOwotCXNpbGVuY2VfcnNzaV9iID0gKHU4KSgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iICYKLQkJCSAgICBBTExfQkFORF9GSUxURVIpID4+IDgpOwotCXNpbGVuY2VfcnNzaV9jID0gKHU4KSgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jICYKLQkJCSAgICBBTExfQkFORF9GSUxURVIpID4+IDgpOwotCi0JdmFsID0gbWF4KHNpbGVuY2VfcnNzaV9iLCBzaWxlbmNlX3Jzc2lfYyk7Ci0JbWF4X3NpbGVuY2VfcnNzaSA9IG1heChzaWxlbmNlX3Jzc2lfYSwgKHU4KSB2YWwpOwotCi0JLyogU3RvcmUgc2lsZW5jZSByc3NpIGluIDIwLWJlYWNvbiBoaXN0b3J5IHRhYmxlICovCi0JZGF0YS0+bnJnX3NpbGVuY2VfcnNzaVtkYXRhLT5ucmdfc2lsZW5jZV9pZHhdID0gbWF4X3NpbGVuY2VfcnNzaTsKLQlkYXRhLT5ucmdfc2lsZW5jZV9pZHgrKzsKLQlpZiAoZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID49IE5SR19OVU1fUFJFVl9TVEFUX0wpCi0JCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCA9IDA7Ci0KLQkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYWNyb3NzIDIwIGJlYWNvbiBoaXN0b3J5ICovCi0JZm9yIChpID0gMDsgaSA8IE5SR19OVU1fUFJFVl9TVEFUX0w7IGkrKykgewotCQl2YWwgPSBkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2ldOwotCQlzaWxlbmNlX3JlZiA9IG1heChzaWxlbmNlX3JlZiwgdmFsKTsKLQl9Ci0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJzaWxlbmNlIGEgJXUsIGIgJXUsIGMgJXUsIDIwLWJjbiBtYXggJXVcbiIsCi0JCQlzaWxlbmNlX3Jzc2lfYSwgc2lsZW5jZV9yc3NpX2IsIHNpbGVuY2VfcnNzaV9jLAotCQkJc2lsZW5jZV9yZWYpOwotCi0JLyogRmluZCBtYXggcnggZW5lcmd5IChtaW4gdmFsdWUhKSBhbW9uZyBhbGwgMyByZWNlaXZlcnMsCi0JICogICBtZWFzdXJlZCBkdXJpbmcgYmVhY29uIGZyYW1lLgotCSAqIFNhdmUgaXQgaW4gMTAtYmVhY29uIGhpc3RvcnkgdGFibGUuICovCi0JaSA9IGRhdGEtPm5yZ19lbmVyZ3lfaWR4OwotCXZhbCA9IG1pbihyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2IsIHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYyk7Ci0JZGF0YS0+bnJnX3ZhbHVlW2ldID0gbWluKHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYSwgdmFsKTsKLQotCWRhdGEtPm5yZ19lbmVyZ3lfaWR4Kys7Ci0JaWYgKGRhdGEtPm5yZ19lbmVyZ3lfaWR4ID49IDEwKQotCQlkYXRhLT5ucmdfZW5lcmd5X2lkeCA9IDA7Ci0KLQkvKiBGaW5kIG1pbiByeCBlbmVyZ3kgKG1heCB2YWx1ZSkgYWNyb3NzIDEwIGJlYWNvbiBoaXN0b3J5LgotCSAqIFRoaXMgaXMgdGhlIG1pbmltdW0gc2lnbmFsIGxldmVsIHRoYXQgd2Ugd2FudCB0byByZWNlaXZlIHdlbGwuCi0JICogQWRkIGJhY2tvZmYgKG1hcmdpbiBzbyB3ZSBkb24ndCBtaXNzIHNsaWdodGx5IGxvd2VyIGVuZXJneSBmcmFtZXMpLgotCSAqIFRoaXMgZXN0YWJsaXNoZXMgYW4gdXBwZXIgYm91bmQgKG1pbiB2YWx1ZSkgZm9yIGVuZXJneSB0aHJlc2hvbGQuICovCi0JbWF4X25yZ19jY2sgPSBkYXRhLT5ucmdfdmFsdWVbMF07Ci0JZm9yIChpID0gMTsgaSA8IDEwOyBpKyspCi0JCW1heF9ucmdfY2NrID0gKHUzMikgbWF4KG1heF9ucmdfY2NrLCAoZGF0YS0+bnJnX3ZhbHVlW2ldKSk7Ci0JbWF4X25yZ19jY2sgKz0gNjsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAicnggZW5lcmd5IGEgJXUsIGIgJXUsIGMgJXUsIDEwLWJjbiBtYXgvbWluICV1XG4iLAotCQkJcnhfaW5mby0+YmVhY29uX2VuZXJneV9hLCByeF9pbmZvLT5iZWFjb25fZW5lcmd5X2IsCi0JCQlyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2MsIG1heF9ucmdfY2NrIC0gNik7Ci0KLQkvKiBDb3VudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmVhY29ucyB3aXRoIGZld2VyLXRoYW4tZGVzaXJlZAotCSAqICAgZmFsc2UgYWxhcm1zLiAqLwotCWlmIChmYWxzZV9hbGFybXMgPCBtaW5fZmFsc2VfYWxhcm1zKQotCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhKys7Ci0JZWxzZQotCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhID0gMDsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNvbnNlY3V0aXZlIGJjbnMgd2l0aCBmZXcgZmFsc2UgYWxhcm1zID0gJXVcbiIsCi0JCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhKTsKLQotCS8qIElmIHdlIGdvdCB0b28gbWFueSBmYWxzZSBhbGFybXMgdGhpcyB0aW1lLCByZWR1Y2Ugc2Vuc2l0aXZpdHkgKi8KLQlpZiAoKGZhbHNlX2FsYXJtcyA+IG1heF9mYWxzZV9hbGFybXMpICYmCi0JCShkYXRhLT5hdXRvX2NvcnJfY2NrID4gQVVUT19DT1JSX01BWF9USF9DQ0spKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAibm9ybSBGQSAldSA+IG1heCBGQSAldVxuIiwKLQkJICAgICBmYWxzZV9hbGFybXMsIG1heF9mYWxzZV9hbGFybXMpOwotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIi4uLiByZWR1Y2luZyBzZW5zaXRpdml0eVxuIik7Ci0JCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSVdMX0ZBX1RPT19NQU5ZOwotCQkvKiBTdG9yZSBmb3IgImZld2VyIHRoYW4gZGVzaXJlZCIgb24gbGF0ZXIgYmVhY29uICovCi0JCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IHNpbGVuY2VfcmVmOwotCi0JCS8qIGluY3JlYXNlIGVuZXJneSB0aHJlc2hvbGQgKHJlZHVjZSBucmcgdmFsdWUpCi0JCSAqICAgdG8gZGVjcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KLQkJZGF0YS0+bnJnX3RoX2NjayA9IGRhdGEtPm5yZ190aF9jY2sgLSBOUkdfU1RFUF9DQ0s7Ci0JLyogRWxzZSBpZiB3ZSBnb3QgZmV3ZXIgdGhhbiBkZXNpcmVkLCBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLwotCX0gZWxzZSBpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykgewotCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElXTF9GQV9UT09fRkVXOwotCi0JCS8qIENvbXBhcmUgc2lsZW5jZSBsZXZlbCB3aXRoIHNpbGVuY2UgbGV2ZWwgZm9yIG1vc3QgcmVjZW50Ci0JCSAqICAgaGVhbHRoeSBudW1iZXIgb3IgdG9vIG1hbnkgZmFsc2UgYWxhcm1zICovCi0JCWRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmID0gKHMzMilkYXRhLT5ucmdfc2lsZW5jZV9yZWYgLQotCQkJCQkJICAgKHMzMilzaWxlbmNlX3JlZjsKLQotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKLQkJCSAibm9ybSBGQSAldSA8IG1pbiBGQSAldSwgc2lsZW5jZSBkaWZmICVkXG4iLAotCQkJIGZhbHNlX2FsYXJtcywgbWluX2ZhbHNlX2FsYXJtcywKLQkJCSBkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZik7Ci0KLQkJLyogSW5jcmVhc2UgdmFsdWUgdG8gaW5jcmVhc2Ugc2Vuc2l0aXZpdHksIGJ1dCBvbmx5IGlmOgotCQkgKiAxYSkgcHJldmlvdXMgYmVhY29uIGRpZCAqbm90KiBoYXZlICp0b28gbWFueSogZmFsc2UgYWxhcm1zCi0JCSAqIDFiKSBBTkQgdGhlcmUncyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gUnggbGV2ZWxzCi0JCSAqICAgICAgZnJvbSBhIHByZXZpb3VzIGJlYWNvbiB3aXRoIHRvbyBtYW55LCBvciBoZWFsdGh5ICMgRkFzCi0JCSAqIE9SIDIpIFdlJ3ZlIHNlZW4gYSBsb3Qgb2YgYmVhY29ucyAoMTAwKSB3aXRoIHRvbyBmZXcKLQkJICogICAgICAgZmFsc2UgYWxhcm1zICovCi0JCWlmICgoZGF0YS0+bnJnX3ByZXZfc3RhdGUgIT0gSVdMX0ZBX1RPT19NQU5ZKSAmJgotCQkJKChkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA+IE5SR19ESUZGKSB8fAotCQkJKGRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPiBNQVhfTlVNQkVSX0NDS19OT19GQSkpKSB7Ci0KLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiLi4uIGluY3JlYXNpbmcgc2Vuc2l0aXZpdHlcbiIpOwotCQkJLyogSW5jcmVhc2UgbnJnIHZhbHVlIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCi0JCQl2YWwgPSBkYXRhLT5ucmdfdGhfY2NrICsgTlJHX1NURVBfQ0NLOwotCQkJZGF0YS0+bnJnX3RoX2NjayA9IG1pbigodTMyKXJhbmdlcy0+bWluX25yZ19jY2ssIHZhbCk7Ci0JCX0gZWxzZSB7Ci0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKLQkJCQkJICIuLi4gYnV0IG5vdCBjaGFuZ2luZyBzZW5zaXRpdml0eVxuIik7Ci0JCX0KLQotCS8qIEVsc2Ugd2UgZ290IGEgaGVhbHRoeSBudW1iZXIgb2YgZmFsc2UgYWxhcm1zLCBrZWVwIHN0YXR1cyBxdW8gKi8KLQl9IGVsc2UgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIiBGQSBpbiBzYWZlIHpvbmVcbiIpOwotCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElXTF9GQV9HT09EX1JBTkdFOwotCi0JCS8qIFN0b3JlIGZvciB1c2UgaW4gImZld2VyIHRoYW4gZGVzaXJlZCIgd2l0aCBsYXRlciBiZWFjb24gKi8KLQkJZGF0YS0+bnJnX3NpbGVuY2VfcmVmID0gc2lsZW5jZV9yZWY7Ci0KLQkJLyogSWYgcHJldmlvdXMgYmVhY29uIGhhZCB0b28gbWFueSBmYWxzZSBhbGFybXMsCi0JCSAqICAgZ2l2ZSBpdCBzb21lIGV4dHJhIG1hcmdpbiBieSByZWR1Y2luZyBzZW5zaXRpdml0eSBhZ2FpbgotCQkgKiAgIChidXQgZG9uJ3QgZ28gYmVsb3cgbWVhc3VyZWQgZW5lcmd5IG9mIGRlc2lyZWQgUngpICovCi0JCWlmIChJV0xfRkFfVE9PX01BTlkgPT0gZGF0YS0+bnJnX3ByZXZfc3RhdGUpIHsKLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiLi4uIGluY3JlYXNpbmcgbWFyZ2luXG4iKTsKLQkJCWlmIChkYXRhLT5ucmdfdGhfY2NrID4gKG1heF9ucmdfY2NrICsgTlJHX01BUkdJTikpCi0JCQkJZGF0YS0+bnJnX3RoX2NjayAtPSBOUkdfTUFSR0lOOwotCQkJZWxzZQotCQkJCWRhdGEtPm5yZ190aF9jY2sgPSBtYXhfbnJnX2NjazsKLQkJfQotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGUgZW5lcmd5IHRocmVzaG9sZCBkb2VzIG5vdCBnbyBhYm92ZSB0aGUgbWVhc3VyZWQKLQkgKiBlbmVyZ3kgb2YgdGhlIGRlc2lyZWQgUnggc2lnbmFscyAocmVkdWNlZCBieSBiYWNrb2ZmIG1hcmdpbiksCi0JICogb3IgZWxzZSB3ZSBtaWdodCBzdGFydCBtaXNzaW5nIFJ4IGZyYW1lcy4KLQkgKiBMb3dlciB2YWx1ZSBpcyBoaWdoZXIgZW5lcmd5LCBzbyB3ZSB1c2UgbWF4KCkhCi0JICovCi0JZGF0YS0+bnJnX3RoX2NjayA9IG1heChtYXhfbnJnX2NjaywgZGF0YS0+bnJnX3RoX2Njayk7Ci0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJuZXcgbnJnX3RoX2NjayAldVxuIiwgZGF0YS0+bnJnX3RoX2Njayk7Ci0KLQlkYXRhLT5ucmdfcHJldl9zdGF0ZSA9IGRhdGEtPm5yZ19jdXJyX3N0YXRlOwotCi0JLyogQXV0by1jb3JyZWxhdGlvbiBDQ0sgYWxnb3JpdGhtICovCi0JaWYgKGZhbHNlX2FsYXJtcyA+IG1pbl9mYWxzZV9hbGFybXMpIHsKLQotCQkvKiBpbmNyZWFzZSBhdXRvX2NvcnIgdmFsdWVzIHRvIGRlY3JlYXNlIHNlbnNpdGl2aXR5Ci0JCSAqIHNvIHRoZSBEU1Agd29uJ3QgYmUgZGlzdHVyYmVkIGJ5IHRoZSBub2lzZQotCQkgKi8KLQkJaWYgKGRhdGEtPmF1dG9fY29ycl9jY2sgPCBBVVRPX0NPUlJfTUFYX1RIX0NDSykKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPSBBVVRPX0NPUlJfTUFYX1RIX0NDSyArIDE7Ci0JCWVsc2UgewotCQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2NjayArIEFVVE9fQ09SUl9TVEVQX0NDSzsKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPQotCQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9jY2ssIHZhbCk7Ci0JCX0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgKyBBVVRPX0NPUlJfU1RFUF9DQ0s7Ci0JCWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjID0KLQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9jY2tfbXJjLCB2YWwpOwotCX0gZWxzZSBpZiAoKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpICYmCi0JICAgKChkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA+IE5SR19ESUZGKSB8fAotCSAgIChkYXRhLT5udW1faW5fY2NrX25vX2ZhID4gTUFYX05VTUJFUl9DQ0tfTk9fRkEpKSkgewotCi0JCS8qIERlY3JlYXNlIGF1dG9fY29yciB2YWx1ZXMgdG8gaW5jcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2NjayAtIEFVVE9fQ09SUl9TVEVQX0NDSzsKLQkJZGF0YS0+YXV0b19jb3JyX2NjayA9Ci0JCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fY2NrLCB2YWwpOwotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyAtIEFVVE9fQ09SUl9TVEVQX0NDSzsKLQkJZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgPQotCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX2Nja19tcmMsIHZhbCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBpd2w0OTY1X3NlbnNfYXV0b19jb3JyX29mZG0oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICB1MzIgbm9ybV9mYSwKLQkJCQkgICAgICAgdTMyIHJ4X2VuYWJsZV90aW1lKQotewotCXUzMiB2YWw7Ci0JdTMyIGZhbHNlX2FsYXJtcyA9IG5vcm1fZmEgKiAyMDAgKiAxMDI0OwotCXUzMiBtYXhfZmFsc2VfYWxhcm1zID0gTUFYX0ZBX09GRE0gKiByeF9lbmFibGVfdGltZTsKLQl1MzIgbWluX2ZhbHNlX2FsYXJtcyA9IE1JTl9GQV9PRkRNICogcnhfZW5hYmxlX3RpbWU7Ci0Jc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlcyAqcmFuZ2VzID0gcHJpdi0+aHdfcGFyYW1zLnNlbnM7Ci0KLQlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKLQotCS8qIElmIHdlIGdvdCB0b28gbWFueSBmYWxzZSBhbGFybXMgdGhpcyB0aW1lLCByZWR1Y2Ugc2Vuc2l0aXZpdHkgKi8KLQlpZiAoZmFsc2VfYWxhcm1zID4gbWF4X2ZhbHNlX2FsYXJtcykgewotCi0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAibm9ybSBGQSAldSA+IG1heCBGQSAldSlcbiIsCi0JCQkgICAgIGZhbHNlX2FsYXJtcywgbWF4X2ZhbHNlX2FsYXJtcyk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG0gKyBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbSA9Ci0JCQltaW4oKHUzMilyYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbSwgdmFsKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgKyBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgPQotCQkJbWluKCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG1fbXJjLCB2YWwpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX3gxICsgQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1feDEgPQotCQkJbWluKCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG1feDEsIHZhbCk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxICsgQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxID0KLQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9vZmRtX21yY194MSwgdmFsKTsKLQl9Ci0KLQkvKiBFbHNlIGlmIHdlIGdvdCBmZXdlciB0aGFuIGRlc2lyZWQsIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCi0JZWxzZSBpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykgewotCi0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAibm9ybSBGQSAldSA8IG1pbiBGQSAldVxuIiwKLQkJCSAgICAgZmFsc2VfYWxhcm1zLCBtaW5fZmFsc2VfYWxhcm1zKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbSAtIEFVVE9fQ09SUl9TVEVQX09GRE07Ci0JCWRhdGEtPmF1dG9fY29ycl9vZmRtID0KLQkJCW1heCgodTMyKXJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtLCB2YWwpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyAtIEFVVE9fQ09SUl9TVEVQX09GRE07Ci0JCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyA9Ci0JCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV9tcmMsIHZhbCk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1feDEgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSA9Ci0JCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV94MSwgdmFsKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPQotCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxLCB2YWwpOwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAibWluIEZBICV1IDwgbm9ybSBGQSAldSA8IG1heCBGQSAldSBPS1xuIiwKLQkJCSBtaW5fZmFsc2VfYWxhcm1zLCBmYWxzZV9hbGFybXMsIG1heF9mYWxzZV9hbGFybXMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9wcmVwYXJlX2xlZ2FjeV9zZW5zaXRpdml0eV90Ymwoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSwKLQkJCQlfX2xlMTYgKnRibCkKLXsKLQl0YmxbSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG0pOwotCXRibFtIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX01SQ19JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjKTsKLQl0YmxbSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG1feDEpOwotCXRibFtIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxKTsKLQotCXRibFtIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5hdXRvX2NvcnJfY2NrKTsKLQl0YmxbSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjKTsKLQotCXRibFtIRF9NSU5fRU5FUkdZX0NDS19ERVRfSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPm5yZ190aF9jY2spOwotCXRibFtIRF9NSU5fRU5FUkdZX09GRE1fREVUX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5ucmdfdGhfb2ZkbSk7Ci0KLQl0YmxbSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KGRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbik7Ci0JdGJsW0hEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fTVJDX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoZGF0YS0+YmFya2VyX2NvcnJfdGhfbWluX21yYyk7Ci0JdGJsW0hEX09GRE1fRU5FUkdZX1RIX0lOX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoZGF0YS0+bnJnX3RoX2NjYSk7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm9mZG06IGFjICV1IG1yYyAldSB4MSAldSBtcmNfeDEgJXUgdGhyZXNoICV1XG4iLAotCQkJZGF0YS0+YXV0b19jb3JyX29mZG0sIGRhdGEtPmF1dG9fY29ycl9vZmRtX21yYywKLQkJCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxLCBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEsCi0JCQlkYXRhLT5ucmdfdGhfb2ZkbSk7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNjazogYWMgJXUgbXJjICV1IHRocmVzaCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2ssIGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjLAotCQkJZGF0YS0+bnJnX3RoX2Njayk7Ci19Ci0KLS8qIFByZXBhcmUgYSBTRU5TSVRJVklUWV9DTUQsIHNlbmQgdG8gdUNvZGUgaWYgdmFsdWVzIGhhdmUgY2hhbmdlZCAqLwotc3RhdGljIGludCBpd2w0OTY1X3NlbnNpdGl2aXR5X3dyaXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCBjbWQ7Ci0Jc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZF9vdXQgPSB7Ci0JCS5pZCA9IFNFTlNJVElWSVRZX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCksCi0JCS5mbGFncyA9IENNRF9BU1lOQywKLQkJLmRhdGEgPSAmY21kLAotCX07Ci0KLQlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQlpd2w0OTY1X3ByZXBhcmVfbGVnYWN5X3NlbnNpdGl2aXR5X3RibChwcml2LCBkYXRhLCAmY21kLnRhYmxlWzBdKTsKLQotCS8qIFVwZGF0ZSB1Q29kZSdzICJ3b3JrIiB0YWJsZSwgYW5kIGNvcHkgaXQgdG8gRFNQICovCi0JY21kLmNvbnRyb2wgPSBTRU5TSVRJVklUWV9DTURfQ09OVFJPTF9XT1JLX1RBQkxFOwotCi0JLyogRG9uJ3Qgc2VuZCBjb21tYW5kIHRvIHVDb2RlIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgKi8KLQlpZiAoIW1lbWNtcCgmY21kLnRhYmxlWzBdLCAmKHByaXYtPnNlbnNpdGl2aXR5X3RibFswXSksCi0JCSAgICBzaXplb2YodTE2KSpIRF9UQUJMRV9TSVpFKSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIk5vIGNoYW5nZSBpbiBTRU5TSVRJVklUWV9DTURcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBDb3B5IHRhYmxlIGZvciBjb21wYXJpc29uIG5leHQgdGltZSAqLwotCW1lbWNweSgmKHByaXYtPnNlbnNpdGl2aXR5X3RibFswXSksICYoY21kLnRhYmxlWzBdKSwKLQkgICAgICAgc2l6ZW9mKHUxNikqSERfVEFCTEVfU0laRSk7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZChwcml2LCAmY21kX291dCk7Ci19Ci0KLXZvaWQgaXdsNDk2NV9pbml0X3NlbnNpdGl2aXR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaTsKLQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBwcml2LT5od19wYXJhbXMuc2VuczsKLQotCWlmIChwcml2LT5kaXNhYmxlX3NlbnNfY2FsKQotCQlyZXR1cm47Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlN0YXJ0IGl3bDQ5NjVfaW5pdF9zZW5zaXRpdml0eVxuIik7Ci0KLQkvKiBDbGVhciBkcml2ZXIncyBzZW5zaXRpdml0eSBhbGdvIGRhdGEgKi8KLQlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKLQotCWlmIChyYW5nZXMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEpKTsKLQotCWRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPSAwOwotCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSVdMX0ZBX1RPT19NQU5ZOwotCWRhdGEtPm5yZ19wcmV2X3N0YXRlID0gSVdMX0ZBX1RPT19NQU5ZOwotCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IDA7Ci0JZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID0gMDsKLQlkYXRhLT5ucmdfZW5lcmd5X2lkeCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQkJZGF0YS0+bnJnX3ZhbHVlW2ldID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBOUkdfTlVNX1BSRVZfU1RBVF9MOyBpKyspCi0JCWRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbaV0gPSAwOwotCi0JZGF0YS0+YXV0b19jb3JyX29mZG0gPSAgcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG07Ci0JZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjID0gcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1fbXJjOwotCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxICA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX3gxOwotCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yY194MTsKLQlkYXRhLT5hdXRvX2NvcnJfY2NrID0gQVVUT19DT1JSX0NDS19NSU5fVkFMX0RFRjsKLQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9jY2tfbXJjOwotCWRhdGEtPm5yZ190aF9jY2sgPSByYW5nZXMtPm5yZ190aF9jY2s7Ci0JZGF0YS0+bnJnX3RoX29mZG0gPSByYW5nZXMtPm5yZ190aF9vZmRtOwotCWRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbiA9IHJhbmdlcy0+YmFya2VyX2NvcnJfdGhfbWluOwotCWRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmMgPSByYW5nZXMtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmM7Ci0JZGF0YS0+bnJnX3RoX2NjYSA9IHJhbmdlcy0+bnJnX3RoX2NjYTsKLQotCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPSAwOwotCWRhdGEtPmxhc3RfZmFfY250X29mZG0gPSAwOwotCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayA9IDA7Ci0JZGF0YS0+bGFzdF9mYV9jbnRfY2NrID0gMDsKLQotCXJldCB8PSBpd2w0OTY1X3NlbnNpdGl2aXR5X3dyaXRlKHByaXYpOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDxyZXR1cm4gMHglWFxuIiwgcmV0KTsKLX0KLQotdm9pZCBpd2w0OTY1X3NlbnNpdGl2aXR5X2NhbGlicmF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdm9pZCAqcmVzcCkKLXsKLQl1MzIgcnhfZW5hYmxlX3RpbWU7Ci0JdTMyIGZhX2NjazsKLQl1MzIgZmFfb2ZkbTsKLQl1MzIgYmFkX3BsY3BfY2NrOwotCXUzMiBiYWRfcGxjcF9vZmRtOwotCXUzMiBub3JtX2ZhX29mZG07Ci0JdTMyIG5vcm1fZmFfY2NrOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSAqcnhfaW5mbzsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkgKm9mZG0sICpjY2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2RhdGEgc3RhdGlzOwotCi0JaWYgKHByaXYtPmRpc2FibGVfc2Vuc19jYWwpCi0JCXJldHVybjsKLQotCWRhdGEgPSAmKHByaXYtPnNlbnNpdGl2aXR5X2RhdGEpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDwgLSBub3QgYXNzb2NpYXRlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JcnhfaW5mbyA9ICYoKChzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKilyZXNwKS0+cnguZ2VuZXJhbCk7Ci0Jb2ZkbSA9ICYoKChzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKilyZXNwKS0+cngub2ZkbSk7Ci0JY2NrID0gJigoKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyAqKXJlc3ApLT5yeC5jY2spOwotCi0JaWYgKHJ4X2luZm8tPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcgIT0gSU5URVJGRVJFTkNFX0RBVEFfQVZBSUxBQkxFKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDwgaW52YWxpZCBkYXRhLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEV4dHJhY3QgU3RhdGlzdGljczogKi8KLQlyeF9lbmFibGVfdGltZSA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmNoYW5uZWxfbG9hZCk7Ci0JZmFfY2NrID0gbGUzMl90b19jcHUoY2NrLT5mYWxzZV9hbGFybV9jbnQpOwotCWZhX29mZG0gPSBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpOwotCWJhZF9wbGNwX2NjayA9IGxlMzJfdG9fY3B1KGNjay0+cGxjcF9lcnIpOwotCWJhZF9wbGNwX29mZG0gPSBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2Vycik7Ci0KLQlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9hID0KLQkJCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSk7Ci0Jc3RhdGlzLmJlYWNvbl9zaWxlbmNlX3Jzc2lfYiA9Ci0JCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpOwotCXN0YXRpcy5iZWFjb25fc2lsZW5jZV9yc3NpX2MgPQotCQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jKTsKLQlzdGF0aXMuYmVhY29uX2VuZXJneV9hID0KLQkJCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYSk7Ci0Jc3RhdGlzLmJlYWNvbl9lbmVyZ3lfYiA9Ci0JCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2IpOwotCXN0YXRpcy5iZWFjb25fZW5lcmd5X2MgPQotCQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9jKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAicnhfZW5hYmxlX3RpbWUgPSAldSB1c2Vjc1xuIiwgcnhfZW5hYmxlX3RpbWUpOwotCi0JaWYgKCFyeF9lbmFibGVfdGltZSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIjw8IFJYIEVuYWJsZSBUaW1lID09IDAhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRoZXNlIHN0YXRpc3RpY3MgaW5jcmVhc2UgbW9ub3RvbmljYWxseSwgYW5kIGRvIG5vdCByZXNldAotCSAqICAgYXQgZWFjaCBiZWFjb24uICBDYWxjdWxhdGUgZGlmZmVyZW5jZSBmcm9tIGxhc3QgdmFsdWUsIG9yIGp1c3QKLQkgKiAgIHVzZSB0aGUgbmV3IHN0YXRpc3RpY3MgdmFsdWUgaWYgaXQgaGFzIHJlc2V0IG9yIHdyYXBwZWQgYXJvdW5kLiAqLwotCWlmIChkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPiBiYWRfcGxjcF9jY2spCi0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayA9IGJhZF9wbGNwX2NjazsKLQllbHNlIHsKLQkJYmFkX3BsY3BfY2NrIC09IGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjazsKLQkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrICs9IGJhZF9wbGNwX2NjazsKLQl9Ci0KLQlpZiAoZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSA+IGJhZF9wbGNwX29mZG0pCi0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPSBiYWRfcGxjcF9vZmRtOwotCWVsc2UgewotCQliYWRfcGxjcF9vZmRtIC09IGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG07Ci0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gKz0gYmFkX3BsY3Bfb2ZkbTsKLQl9Ci0KLQlpZiAoZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbSA+IGZhX29mZG0pCi0JCWRhdGEtPmxhc3RfZmFfY250X29mZG0gPSBmYV9vZmRtOwotCWVsc2UgewotCQlmYV9vZmRtIC09IGRhdGEtPmxhc3RfZmFfY250X29mZG07Ci0JCWRhdGEtPmxhc3RfZmFfY250X29mZG0gKz0gZmFfb2ZkbTsKLQl9Ci0KLQlpZiAoZGF0YS0+bGFzdF9mYV9jbnRfY2NrID4gZmFfY2NrKQotCQlkYXRhLT5sYXN0X2ZhX2NudF9jY2sgPSBmYV9jY2s7Ci0JZWxzZSB7Ci0JCWZhX2NjayAtPSBkYXRhLT5sYXN0X2ZhX2NudF9jY2s7Ci0JCWRhdGEtPmxhc3RfZmFfY250X2NjayArPSBmYV9jY2s7Ci0JfQotCi0JLyogVG90YWwgYWJvcnRlZCBzaWduYWwgbG9ja3MgKi8KLQlub3JtX2ZhX29mZG0gPSBmYV9vZmRtICsgYmFkX3BsY3Bfb2ZkbTsKLQlub3JtX2ZhX2NjayA9IGZhX2NjayArIGJhZF9wbGNwX2NjazsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LAotCQkJICJjY2s6IGZhICV1IGJhZHAgJXUgIG9mZG06IGZhICV1IGJhZHAgJXVcbiIsIGZhX2NjaywKLQkJCWJhZF9wbGNwX2NjaywgZmFfb2ZkbSwgYmFkX3BsY3Bfb2ZkbSk7Ci0KLQlpd2w0OTY1X3NlbnNfYXV0b19jb3JyX29mZG0ocHJpdiwgbm9ybV9mYV9vZmRtLCByeF9lbmFibGVfdGltZSk7Ci0JaXdsNDk2NV9zZW5zX2VuZXJneV9jY2socHJpdiwgbm9ybV9mYV9jY2ssIHJ4X2VuYWJsZV90aW1lLCAmc3RhdGlzKTsKLQotCWl3bDQ5NjVfc2Vuc2l0aXZpdHlfd3JpdGUocHJpdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggaXdsNDk2NV9maW5kX2ZpcnN0X2NoYWluKHU4IG1hc2spCi17Ci0JaWYgKG1hc2sgJiBBTlRfQSkKLQkJcmV0dXJuIENIQUlOX0E7Ci0JaWYgKG1hc2sgJiBBTlRfQikKLQkJcmV0dXJuIENIQUlOX0I7Ci0JcmV0dXJuIENIQUlOX0M7Ci19Ci0KLS8qKgotICogUnVuIGRpc2Nvbm5lY3RlZCBhbnRlbm5hIGFsZ29yaXRobSB0byBmaW5kIG91dCB3aGljaCBhbnRlbm5hcyBhcmUKLSAqIGRpc2Nvbm5lY3RlZC4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfZmluZF9kaXNjb25uX2FudGVubmEoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIqIGF2ZXJhZ2Vfc2lnLAotCQkJCSAgICAgc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhKQotewotCXUzMiBhY3RpdmVfY2hhaW5zID0gMDsKLQl1MzIgbWF4X2F2ZXJhZ2Vfc2lnOwotCXUxNiBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pOwotCXU4IG51bV90eF9jaGFpbnM7Ci0JdTggZmlyc3RfY2hhaW47Ci0JdTE2IGkgPSAwOwotCi0JYXZlcmFnZV9zaWdbMF0gPSBkYXRhLT5jaGFpbl9zaWduYWxfYSAvCi0JCQkgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0JYXZlcmFnZV9zaWdbMV0gPSBkYXRhLT5jaGFpbl9zaWduYWxfYiAvCi0JCQkgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0JYXZlcmFnZV9zaWdbMl0gPSBkYXRhLT5jaGFpbl9zaWduYWxfYyAvCi0JCQkgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0KLQlpZiAoYXZlcmFnZV9zaWdbMF0gPj0gYXZlcmFnZV9zaWdbMV0pIHsKLQkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMF07Ci0JCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAwOwotCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0JfSBlbHNlIHsKLQkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMV07Ci0JCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAxOwotCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0JfQotCi0JaWYgKGF2ZXJhZ2Vfc2lnWzJdID49IG1heF9hdmVyYWdlX3NpZykgewotCQltYXhfYXZlcmFnZV9zaWcgPSBhdmVyYWdlX3NpZ1syXTsKLQkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSA9IDI7Ci0JCWFjdGl2ZV9jaGFpbnMgPSAoMSA8PCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKLQl9Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImF2ZXJhZ2Vfc2lnOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJICAgICBhdmVyYWdlX3NpZ1swXSwgYXZlcmFnZV9zaWdbMV0sIGF2ZXJhZ2Vfc2lnWzJdKTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm1heF9hdmVyYWdlX3NpZyA9ICVkLCBhbnRlbm5hICVkXG4iLAotCQkgICAgIG1heF9hdmVyYWdlX3NpZywgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0KLQkvKiBDb21wYXJlIHNpZ25hbCBzdHJlbmd0aHMgZm9yIGFsbCAzIHJlY2VpdmVycy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7Ci0JCWlmIChpICE9IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpIHsKLQkJCXMzMiByc3NpX2RlbHRhID0gKG1heF9hdmVyYWdlX3NpZyAtIGF2ZXJhZ2Vfc2lnW2ldKTsKLQotCQkJLyogSWYgc2lnbmFsIGlzIHZlcnkgd2VhaywgY29tcGFyZWQgd2l0aAotCQkJICogc3Ryb25nZXN0LCBtYXJrIGl0IGFzIGRpc2Nvbm5lY3RlZC4gKi8KLQkJCWlmIChyc3NpX2RlbHRhID4gTUFYSU1VTV9BTExPV0VEX1BBVEhMT1NTKQotCQkJCWRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0gPSAxOwotCQkJZWxzZQotCQkJCWFjdGl2ZV9jaGFpbnMgfD0gKDEgPDwgaSk7Ci0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImkgPSAlZCAgcnNzaURlbHRhID0gJWQgICIKLQkJCSAgICAgImRpc2Nvbm5fYXJyYXlbaV0gPSAlZFxuIiwKLQkJCSAgICAgaSwgcnNzaV9kZWx0YSwgZGF0YS0+ZGlzY29ubl9hcnJheVtpXSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBhYm92ZSBhbGdvcml0aG0gc29tZXRpbWVzIGZhaWxzIHdoZW4gdGhlIHVjb2RlCi0JICogcmVwb3J0cyAwIGZvciBhbGwgY2hhaW5zLiBJdCdzIG5vdCBjbGVhciB3aHkgdGhhdAotCSAqIGhhcHBlbnMgdG8gc3RhcnQgd2l0aCwgYnV0IGl0IGlzIHRoZW4gY2F1c2luZyB0cm91YmxlCi0JICogYmVjYXVzZSB0aGlzIGNhbiBtYWtlIHVzIGVuYWJsZSBtb3JlIGNoYWlucyB0aGFuIHRoZQotCSAqIGhhcmR3YXJlIHJlYWxseSBoYXMuCi0JICoKLQkgKiBUbyBiZSBzYWZlLCBzaW1wbHkgbWFzayBvdXQgYW55IGNoYWlucyB0aGF0IHdlIGtub3cKLQkgKiBhcmUgbm90IG9uIHRoZSBkZXZpY2UuCi0JICovCi0JYWN0aXZlX2NoYWlucyAmPSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OwotCi0JbnVtX3R4X2NoYWlucyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgewotCQkvKiBsb29wcyBvbiBhbGwgdGhlIGJpdHMgb2YKLQkJICogcHJpdi0+aHdfc2V0dGluZy52YWxpZF90eF9hbnQgKi8KLQkJdTggYW50X21zayA9ICgxIDw8IGkpOwotCQlpZiAoIShwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgYW50X21zaykpCi0JCQljb250aW51ZTsKLQotCQludW1fdHhfY2hhaW5zKys7Ci0JCWlmIChkYXRhLT5kaXNjb25uX2FycmF5W2ldID09IDApCi0JCQkvKiB0aGVyZSBpcyBhIFR4IGFudGVubmEgY29ubmVjdGVkICovCi0JCQlicmVhazsKLQkJaWYgKG51bV90eF9jaGFpbnMgPT0gcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW0gJiYKLQkJICAgIGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pIHsKLQkJCS8qCi0JCQkgKiBJZiBhbGwgY2hhaW5zIGFyZSBkaXNjb25uZWN0ZWQKLQkJCSAqIGNvbm5lY3QgdGhlIGZpcnN0IHZhbGlkIHR4IGNoYWluCi0JCQkgKi8KLQkJCWZpcnN0X2NoYWluID0KLQkJCWl3bDQ5NjVfZmluZF9maXJzdF9jaGFpbihwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JCQlkYXRhLT5kaXNjb25uX2FycmF5W2ZpcnN0X2NoYWluXSA9IDA7Ci0JCQlhY3RpdmVfY2hhaW5zIHw9IEJJVChmaXJzdF9jaGFpbik7Ci0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKLQkJCQkJIkFsbCBUeCBjaGFpbnMgYXJlIGRpc2Nvbm5lY3RlZCBXL0EgLSBkZWNsYXJlICVkIGFzIGNvbm5lY3RlZFxuIiwKLQkJCQkJZmlyc3RfY2hhaW4pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoYWN0aXZlX2NoYWlucyAhPSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50ICYmCi0JICAgIGFjdGl2ZV9jaGFpbnMgIT0gcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKQotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKLQkJCQkiRGV0ZWN0ZWQgdGhhdCBub3QgYWxsIGFudGVubmFzIGFyZSBjb25uZWN0ZWQhICIKLQkJCQkiQ29ubmVjdGVkOiAlI3gsIHZhbGlkOiAlI3guXG4iLAotCQkJCWFjdGl2ZV9jaGFpbnMsIHByaXYtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQpOwotCi0JLyogU2F2ZSBmb3IgdXNlIHdpdGhpbiBSWE9OLCBUWCwgU0NBTiBjb21tYW5kcywgZXRjLiAqLwotCWRhdGEtPmFjdGl2ZV9jaGFpbnMgPSBhY3RpdmVfY2hhaW5zOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiYWN0aXZlX2NoYWlucyAoYml0d2lzZSkgPSAweCV4XG4iLAotCQkJYWN0aXZlX2NoYWlucyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfZ2Fpbl9jb21wdXRhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCXUzMiAqYXZlcmFnZV9ub2lzZSwKLQkJdTE2IG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSwKLQkJdTMyIG1pbl9hdmVyYWdlX25vaXNlLAotCQl1OCBkZWZhdWx0X2NoYWluKQotewotCWludCBpLCByZXQ7Ci0Jc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gJnByaXYtPmNoYWluX25vaXNlX2RhdGE7Ci0KLQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pXSA9IDA7Ci0KLQlmb3IgKGkgPSBkZWZhdWx0X2NoYWluOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7Ci0JCXMzMiBkZWx0YV9nID0gMDsKLQotCQlpZiAoIShkYXRhLT5kaXNjb25uX2FycmF5W2ldKSAmJgotCQkgICAgKGRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9PQotCQkJICAgICBDSEFJTl9OT0lTRV9ERUxUQV9HQUlOX0lOSVRfVkFMKSkgewotCQkJZGVsdGFfZyA9IGF2ZXJhZ2Vfbm9pc2VbaV0gLSBtaW5fYXZlcmFnZV9ub2lzZTsKLQkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9ICh1OCkoKGRlbHRhX2cgKiAxMCkgLyAxNSk7Ci0JCQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0gPQotCQkJCW1pbihkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0sCi0JCQkJKHU4KSBDSEFJTl9OT0lTRV9NQVhfREVMVEFfR0FJTl9DT0RFKTsKLQotCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0KLQkJCQkoZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldIHwgKDEgPDwgMikpOwotCQl9IGVsc2UgewotCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0gMDsKLQkJfQotCX0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImRlbHRhX2dhaW5fY29kZXM6IGEgJWQgYiAlZCBjICVkXG4iLAotCQkgICAgIGRhdGEtPmRlbHRhX2dhaW5fY29kZVswXSwKLQkJICAgICBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMV0sCi0JCSAgICAgZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzJdKTsKLQotCS8qIERpZmZlcmVudGlhbCBnYWluIGdldHMgc2VudCB0byB1Q29kZSBvbmx5IG9uY2UgKi8KLQlpZiAoIWRhdGEtPnJhZGlvX3dyaXRlKSB7Ci0JCXN0cnVjdCBpd2xfY2FsaWJfZGlmZl9nYWluX2NtZCBjbWQ7Ci0JCWRhdGEtPnJhZGlvX3dyaXRlID0gMTsKLQotCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCQljbWQuaGRyLm9wX2NvZGUgPSBJV0xfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01EOwotCQljbWQuZGlmZl9nYWluX2EgPSBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMF07Ci0JCWNtZC5kaWZmX2dhaW5fYiA9IGRhdGEtPmRlbHRhX2dhaW5fY29kZVsxXTsKLQkJY21kLmRpZmZfZ2Fpbl9jID0gZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzJdOwotCQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAotCQkJCSAgICAgIHNpemVvZihjbWQpLCAmY21kKTsKLQkJaWYgKHJldCkKLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiZmFpbCBzZW5kaW5nIGNtZCAiCi0JCQkJICAgICAiUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRFxuIik7Ci0KLQkJLyogVE9ETyB3ZSBtaWdodCB3YW50IHJlY2FsY3VsYXRlCi0JCSAqIHJ4X2NoYWluIGluIHJ4b24gY21kICovCi0KLQkJLyogTWFyayBzbyB3ZSBydW4gdGhpcyBhbGdvIG9ubHkgb25jZSEgKi8KLQkJZGF0YS0+c3RhdGUgPSBJV0xfQ0hBSU5fTk9JU0VfQ0FMSUJSQVRFRDsKLQl9Ci19Ci0KLQotCi0vKgotICogQWNjdW11bGF0ZSAxNiBiZWFjb25zIG9mIHNpZ25hbCBhbmQgbm9pc2Ugc3RhdGlzdGljcyBmb3IgZWFjaCBvZgotICogICAzIHJlY2VpdmVycy9hbnRlbm5hcy9yeC1jaGFpbnMsIHRoZW4gZmlndXJlIG91dDoKLSAqIDEpICBXaGljaCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkLgotICogMikgIERpZmZlcmVudGlhbCByeCBnYWluIHNldHRpbmdzIHRvIGJhbGFuY2UgdGhlIDMgcmVjZWl2ZXJzLgotICovCi12b2lkIGl3bDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCB2b2lkICpzdGF0X3Jlc3ApCi17Ci0Jc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gTlVMTDsKLQotCXUzMiBjaGFpbl9ub2lzZV9hOwotCXUzMiBjaGFpbl9ub2lzZV9iOwotCXUzMiBjaGFpbl9ub2lzZV9jOwotCXUzMiBjaGFpbl9zaWdfYTsKLQl1MzIgY2hhaW5fc2lnX2I7Ci0JdTMyIGNoYWluX3NpZ19jOwotCXUzMiBhdmVyYWdlX3NpZ1tOVU1fUlhfQ0hBSU5TXSA9IHtJTklUSUFMSVpBVElPTl9WQUxVRX07Ci0JdTMyIGF2ZXJhZ2Vfbm9pc2VbTlVNX1JYX0NIQUlOU10gPSB7SU5JVElBTElaQVRJT05fVkFMVUV9OwotCXUzMiBtaW5fYXZlcmFnZV9ub2lzZSA9IE1JTl9BVkVSQUdFX05PSVNFX01BWF9WQUxVRTsKLQl1MTYgbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pID0gSU5JVElBTElaQVRJT05fVkFMVUU7Ci0JdTE2IGkgPSAwOwotCXUxNiByeG9uX2NobnVtID0gSU5JVElBTElaQVRJT05fVkFMVUU7Ci0JdTE2IHN0YXRfY2hudW0gPSBJTklUSUFMSVpBVElPTl9WQUxVRTsKLQl1OCByeG9uX2JhbmQyNDsKLQl1OCBzdGF0X2JhbmQyNDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkgKnJ4X2luZm87Ci0KLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JaWYgKHByaXYtPmRpc2FibGVfY2hhaW5fbm9pc2VfY2FsKQotCQlyZXR1cm47Ci0KLQlkYXRhID0gJihwcml2LT5jaGFpbl9ub2lzZV9kYXRhKTsKLQotCS8qCi0JICogQWNjdW11bGF0ZSBqdXN0IHRoZSBmaXJzdCAiY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMiIGFmdGVyCi0JICogdGhlIGZpcnN0IGFzc29jaWF0aW9uLCB0aGVuIHdlJ3JlIGRvbmUgZm9yZXZlci4KLQkgKi8KLQlpZiAoZGF0YS0+c3RhdGUgIT0gSVdMX0NIQUlOX05PSVNFX0FDQ1VNVUxBVEUpIHsKLQkJaWYgKGRhdGEtPnN0YXRlID09IElXTF9DSEFJTl9OT0lTRV9BTElWRSkKLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiV2FpdCBmb3Igbm9pc2UgY2FsaWIgcmVzZXRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJ4X2luZm8gPSAmKCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopc3RhdF9yZXNwKS0+Ci0JCSAgICAgIHJ4LmdlbmVyYWwpOwotCi0JaWYgKHJ4X2luZm8tPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcgIT0gSU5URVJGRVJFTkNFX0RBVEFfQVZBSUxBQkxFKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiIDw8IEludGVyZmVyZW5jZSBkYXRhIHVuYXZhaWxhYmxlXG4iKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0Jcnhvbl9iYW5kMjQgPSAhIShjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spOwotCXJ4b25fY2hudW0gPSBsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCk7Ci0KLQlzdGF0X2JhbmQyNCA9ICEhKCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopCi0JCQkgc3RhdF9yZXNwKS0+ZmxhZyAmCi0JCQkgU1RBVElTVElDU19SRVBMWV9GTEdfQkFORF8yNEdfTVNLKTsKLQlzdGF0X2NobnVtID0gbGUzMl90b19jcHUoKChzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKikKLQkJCQkgc3RhdF9yZXNwKS0+ZmxhZykgPj4gMTY7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgYWNjdW11bGF0ZSBkYXRhIGZvciBqdXN0IHRoZSBhc3NvY2lhdGVkIGNoYW5uZWwKLQkgKiAgIChldmVuIGlmIHNjYW5uaW5nKS4gKi8KLQlpZiAoKHJ4b25fY2hudW0gIT0gc3RhdF9jaG51bSkgfHwgKHJ4b25fYmFuZDI0ICE9IHN0YXRfYmFuZDI0KSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlN0YXRzIG5vdCBmcm9tIGNoYW49JWQsIGJhbmQyND0lZFxuIiwKLQkJCQlyeG9uX2NobnVtLCByeG9uX2JhbmQyNCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogIEFjY3VtdWxhdGUgYmVhY29uIHN0YXRpc3RpY3MgdmFsdWVzIGFjcm9zcwotCSAqICJjaGFpbl9ub2lzZV9udW1fYmVhY29ucyIKLQkgKi8KLQljaGFpbl9ub2lzZV9hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKSAmCi0JCQkJSU5fQkFORF9GSUxURVI7Ci0JY2hhaW5fbm9pc2VfYiA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYikgJgotCQkJCUlOX0JBTkRfRklMVEVSOwotCWNoYWluX25vaXNlX2MgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpICYKLQkJCQlJTl9CQU5EX0ZJTFRFUjsKLQotCWNoYWluX3NpZ19hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3Jzc2lfYSkgJiBJTl9CQU5EX0ZJTFRFUjsKLQljaGFpbl9zaWdfYiA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7Ci0JY2hhaW5fc2lnX2MgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fcnNzaV9jKSAmIElOX0JBTkRfRklMVEVSOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JZGF0YS0+YmVhY29uX2NvdW50Kys7Ci0KLQlkYXRhLT5jaGFpbl9ub2lzZV9hID0gKGNoYWluX25vaXNlX2EgKyBkYXRhLT5jaGFpbl9ub2lzZV9hKTsKLQlkYXRhLT5jaGFpbl9ub2lzZV9iID0gKGNoYWluX25vaXNlX2IgKyBkYXRhLT5jaGFpbl9ub2lzZV9iKTsKLQlkYXRhLT5jaGFpbl9ub2lzZV9jID0gKGNoYWluX25vaXNlX2MgKyBkYXRhLT5jaGFpbl9ub2lzZV9jKTsKLQotCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gKGNoYWluX3NpZ19hICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2EpOwotCWRhdGEtPmNoYWluX3NpZ25hbF9iID0gKGNoYWluX3NpZ19iICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2IpOwotCWRhdGEtPmNoYWluX3NpZ25hbF9jID0gKGNoYWluX3NpZ19jICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2MpOwotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJjaGFuPSVkLCBiYW5kMjQ9JWQsIGJlYWNvbj0lZFxuIiwKLQkJCXJ4b25fY2hudW0sIHJ4b25fYmFuZDI0LCBkYXRhLT5iZWFjb25fY291bnQpOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY2hhaW5fc2lnOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJCWNoYWluX3NpZ19hLCBjaGFpbl9zaWdfYiwgY2hhaW5fc2lnX2MpOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY2hhaW5fbm9pc2U6IGEgJWQgYiAlZCBjICVkXG4iLAotCQkJY2hhaW5fbm9pc2VfYSwgY2hhaW5fbm9pc2VfYiwgY2hhaW5fbm9pc2VfYyk7Ci0KLQkvKiBJZiB0aGlzIGlzIHRoZSAiY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMiLCBkZXRlcm1pbmU6Ci0JICogMSkgIERpc2Nvbm5lY3RlZCBhbnRlbm5hcyAodXNpbmcgc2lnbmFsIHN0cmVuZ3RocykKLQkgKiAyKSAgRGlmZmVyZW50aWFsIGdhaW4gKHVzaW5nIHNpbGVuY2Ugbm9pc2UpIHRvIGJhbGFuY2UgcmVjZWl2ZXJzICovCi0JaWYgKGRhdGEtPmJlYWNvbl9jb3VudCAhPQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29ucykKLQkJcmV0dXJuOwotCi0JLyogQW5hbHl6ZSBzaWduYWwgZm9yIGRpc2Nvbm5lY3RlZCBhbnRlbm5hICovCi0JaXdsNDk2NV9maW5kX2Rpc2Nvbm5fYW50ZW5uYShwcml2LCBhdmVyYWdlX3NpZywgZGF0YSk7Ci0KLQkvKiBBbmFseXplIG5vaXNlIGZvciByeCBiYWxhbmNlICovCi0JYXZlcmFnZV9ub2lzZVswXSA9IGRhdGEtPmNoYWluX25vaXNlX2EgLwotCQkJICAgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0JYXZlcmFnZV9ub2lzZVsxXSA9IGRhdGEtPmNoYWluX25vaXNlX2IgLwotCQkJICAgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0JYXZlcmFnZV9ub2lzZVsyXSA9IGRhdGEtPmNoYWluX25vaXNlX2MgLwotCQkJICAgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7Ci0JCWlmICghKGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pICYmCi0JCSAgIChhdmVyYWdlX25vaXNlW2ldIDw9IG1pbl9hdmVyYWdlX25vaXNlKSkgewotCQkJLyogVGhpcyBtZWFucyB0aGF0IGNoYWluIGkgaXMgYWN0aXZlIGFuZCBoYXMKLQkJCSAqIGxvd2VyIG5vaXNlIHZhbHVlcyBzbyBmYXI6ICovCi0JCQltaW5fYXZlcmFnZV9ub2lzZSA9IGF2ZXJhZ2Vfbm9pc2VbaV07Ci0JCQltaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kgPSBpOwotCQl9Ci0JfQotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJhdmVyYWdlX25vaXNlOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJCWF2ZXJhZ2Vfbm9pc2VbMF0sIGF2ZXJhZ2Vfbm9pc2VbMV0sCi0JCQlhdmVyYWdlX25vaXNlWzJdKTsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAibWluX2F2ZXJhZ2Vfbm9pc2UgPSAlZCwgYW50ZW5uYSAlZFxuIiwKLQkJCW1pbl9hdmVyYWdlX25vaXNlLCBtaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kpOwotCi0JaXdsNDk2NV9nYWluX2NvbXB1dGF0aW9uKHByaXYsIGF2ZXJhZ2Vfbm9pc2UsCi0JCQltaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2ksIG1pbl9hdmVyYWdlX25vaXNlLAotCQkJaXdsNDk2NV9maW5kX2ZpcnN0X2NoYWluKHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KSk7Ci0KLQkvKiBTb21lIHBvd2VyIGNoYW5nZXMgbWF5IGhhdmUgYmVlbiBtYWRlIGR1cmluZyB0aGUgY2FsaWJyYXRpb24uCi0JICogVXBkYXRlIGFuZCBjb21taXQgdGhlIFJYT04KLQkgKi8KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQotCQlwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MocHJpdik7Ci0KLQlkYXRhLT5zdGF0ZSA9IElXTF9DSEFJTl9OT0lTRV9ET05FOwotCWl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgZmFsc2UpOwotfQotCi12b2lkIGl3bDQ5NjVfcmVzZXRfcnVuX3RpbWVfY2FsaWIoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCBpOwotCW1lbXNldCgmKHByaXYtPnNlbnNpdGl2aXR5X2RhdGEpLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhKSk7Ci0JbWVtc2V0KCYocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YSksIDAsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2NoYWluX25vaXNlX2RhdGEpKTsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKQotCQlwcml2LT5jaGFpbl9ub2lzZV9kYXRhLmRlbHRhX2dhaW5fY29kZVtpXSA9Ci0JCQkJQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTDsKLQotCS8qIEFzayBmb3Igc3RhdGlzdGljcyBub3csIHRoZSB1Q29kZSB3aWxsIHNlbmQgbm90aWZpY2F0aW9uCi0JICogcGVyaW9kaWNhbGx5IGFmdGVyIGFzc29jaWF0aW9uICovCi0JaXdsX2xlZ2FjeV9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChwcml2LCBDTURfQVNZTkMsIHRydWUpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWNhbGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NmM4MGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgotICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKiBCU0QgTElDRU5TRQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9faXdsXzQ5NjVfY2FsaWJfaF9fCi0jZGVmaW5lIF9faXdsXzQ5NjVfY2FsaWJfaF9fCi0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKLQotdm9pZCBpd2w0OTY1X2NoYWluX25vaXNlX2NhbGlicmF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdm9pZCAqc3RhdF9yZXNwKTsKLXZvaWQgaXdsNDk2NV9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnJlc3ApOwotdm9pZCBpd2w0OTY1X2luaXRfc2Vuc2l0aXZpdHkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsNDk2NV9yZXNldF9ydW5fdGltZV9jYWxpYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0jZW5kaWYgLyogX19pd2xfNDk2NV9jYWxpYl9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5MzY2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1kZWJ1Z2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0qCi0qIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qCi0qIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0qIFVTQQotKgotKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0qCi0qIENvbnRhY3QgSW5mb3JtYXRpb246Ci0qICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1kZWJ1Z2ZzLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpmbXRfdmFsdWUgPSAiICAlLTMwcyAlMTB1XG4iOwotc3RhdGljIGNvbnN0IGNoYXIgKmZtdF90YWJsZSA9ICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiI7Ci1zdGF0aWMgY29uc3QgY2hhciAqZm10X2hlYWRlciA9Ci0JIiUtMzJzICAgIGN1cnJlbnQgIGN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiI7Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zdGF0aXN0aWNzX2ZsYWcoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICpidWYsIGludCBidWZzeikKLXsKLQlpbnQgcCA9IDA7Ci0JdTMyIGZsYWc7Ci0KLQlmbGFnID0gbGUzMl90b19jcHUocHJpdi0+XzQ5NjUuc3RhdGlzdGljcy5mbGFnKTsKLQotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlN0YXRpc3RpY3MgRmxhZygweCVYKTpcbiIsIGZsYWcpOwotCWlmIChmbGFnICYgVUNPREVfU1RBVElTVElDU19DTEVBUl9NU0spCi0JCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwKLQkJIlx0U3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7Ci0JcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiXHRPcGVyYXRpb25hbCBGcmVxdWVuY3k6ICVzXG4iLAotCQkoZmxhZyAmIFVDT0RFX1NUQVRJU1RJQ1NfRlJFUVVFTkNZX01TSykKLQkJPyAiMi40IEdIeiIgOiAiNS4yIEdIeiIpOwotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKLQkJKGZsYWcgJiBVQ09ERV9TVEFUSVNUSUNTX05BUlJPV19CQU5EX01TSykKLQkJID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0KLQlyZXR1cm4gcDsKLX0KLQotc3NpemVfdCBpd2w0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHBvcyA9IDA7Ci0JY2hhciAqYnVmOwotCWludCBidWZzeiA9IHNpemVvZihzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkpICogNDAgKwotCQkgICAgc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkpICogNDAgKwotCQkgICAgc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX3J4X2h0X3BoeSkgKiA0MCArIDQwMDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkgKm9mZG0sICphY2N1bV9vZmRtLCAqZGVsdGFfb2ZkbSwgKm1heF9vZmRtOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSAqY2NrLCAqYWNjdW1fY2NrLCAqZGVsdGFfY2NrLCAqbWF4X2NjazsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5ICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5ICpkZWx0YV9nZW5lcmFsLCAqbWF4X2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfcnhfaHRfcGh5ICpodCwgKmFjY3VtX2h0LCAqZGVsdGFfaHQsICptYXhfaHQ7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKgotCSAqIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCi0JICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5Ci0JICovCi0Jb2ZkbSA9ICZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLnJ4Lm9mZG07Ci0JY2NrID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MucnguY2NrOwotCWdlbmVyYWwgPSAmcHJpdi0+XzQ5NjUuc3RhdGlzdGljcy5yeC5nZW5lcmFsOwotCWh0ID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3Mucngub2ZkbV9odDsKLQlhY2N1bV9vZmRtID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3Mucngub2ZkbTsKLQlhY2N1bV9jY2sgPSAmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcy5yeC5jY2s7Ci0JYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzLnJ4LmdlbmVyYWw7Ci0JYWNjdW1faHQgPSAmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcy5yeC5vZmRtX2h0OwotCWRlbHRhX29mZG0gPSAmcHJpdi0+XzQ5NjUuZGVsdGFfc3RhdGlzdGljcy5yeC5vZmRtOwotCWRlbHRhX2NjayA9ICZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLnJ4LmNjazsKLQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl80OTY1LmRlbHRhX3N0YXRpc3RpY3MucnguZ2VuZXJhbDsKLQlkZWx0YV9odCA9ICZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLnJ4Lm9mZG1faHQ7Ci0JbWF4X29mZG0gPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLnJ4Lm9mZG07Ci0JbWF4X2NjayA9ICZwcml2LT5fNDk2NS5tYXhfZGVsdGEucnguY2NrOwotCW1heF9nZW5lcmFsID0gJnByaXYtPl80OTY1Lm1heF9kZWx0YS5yeC5nZW5lcmFsOwotCW1heF9odCA9ICZwcml2LT5fNDk2NS5tYXhfZGVsdGEucngub2ZkbV9odDsKLQotCXBvcyArPSBpd2w0OTY1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfUnggLSBPRkRNOiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+aW5hX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+aW5hX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5pbmFfY250LCBtYXhfb2ZkbS0+aW5hX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmluYV9jbnQpLCBhY2N1bV9vZmRtLT5maW5hX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5maW5hX2NudCwgbWF4X29mZG0tPmZpbmFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2VyciksIGFjY3VtX29mZG0tPnBsY3BfZXJyLAotCQkJIGRlbHRhX29mZG0tPnBsY3BfZXJyLCBtYXhfb2ZkbS0+cGxjcF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjcmMzMl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9lcnIpLCBhY2N1bV9vZmRtLT5jcmMzMl9lcnIsCi0JCQkgZGVsdGFfb2ZkbS0+Y3JjMzJfZXJyLCBtYXhfb2ZkbS0+Y3JjMzJfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5vdmVycnVuX2VyciksCi0JCQkgYWNjdW1fb2ZkbS0+b3ZlcnJ1bl9lcnIsIGRlbHRhX29mZG0tPm92ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImVhcmx5X292ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIGRlbHRhX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5lYXJseV9vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImNyYzMyX2dvb2Q6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9nb29kKSwKLQkJCSBhY2N1bV9vZmRtLT5jcmMzMl9nb29kLCBkZWx0YV9vZmRtLT5jcmMzMl9nb29kLAotCQkJIG1heF9vZmRtLT5jcmMzMl9nb29kKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmFsc2VfYWxhcm1fY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmFsc2VfYWxhcm1fY250KSwKLQkJCSBhY2N1bV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsCi0JCQkgZGVsdGFfb2ZkbS0+ZmFsc2VfYWxhcm1fY250LAotCQkJIG1heF9vZmRtLT5mYWxzZV9hbGFybV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJmaW5hX3N5bmNfZXJyX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfc3luY19lcnJfY250KSwKLQkJCSBhY2N1bV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKLQkJCSBtYXhfb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJzZmRfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNmZF90aW1lb3V0KSwKLQkJCSBhY2N1bV9vZmRtLT5zZmRfdGltZW91dCwgZGVsdGFfb2ZkbS0+c2ZkX3RpbWVvdXQsCi0JCQkgbWF4X29mZG0tPnNmZF90aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmluYV90aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmluYV90aW1lb3V0KSwKLQkJCSBhY2N1bV9vZmRtLT5maW5hX3RpbWVvdXQsIGRlbHRhX29mZG0tPmZpbmFfdGltZW91dCwKLQkJCSBtYXhfb2ZkbS0+ZmluYV90aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAidW5yZXNwb25kZWRfcnRzOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9vZmRtLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgZGVsdGFfb2ZkbS0+dW5yZXNwb25kZWRfcnRzLAotCQkJIG1heF9vZmRtLT51bnJlc3BvbmRlZF9ydHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyeGVfZnJhbWVfbG10X292cnVuOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAotCQkJIGFjY3VtX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIGRlbHRhX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIG1heF9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYWNrX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9hY2tfY250LCBkZWx0YV9vZmRtLT5zZW50X2Fja19jbnQsCi0JCQkgbWF4X29mZG0tPnNlbnRfYWNrX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfY3RzX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfY3RzX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9jdHNfY250LCBkZWx0YV9vZmRtLT5zZW50X2N0c19jbnQsCi0JCQkgbWF4X29mZG0tPnNlbnRfY3RzX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfYmFfcnNwX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYmFfcnNwX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9iYV9yc3BfY250LAotCQkJIGRlbHRhX29mZG0tPnNlbnRfYmFfcnNwX2NudCwKLQkJCSBtYXhfb2ZkbS0+c2VudF9iYV9yc3BfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZHNwX3NlbGZfa2lsbDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmRzcF9zZWxmX2tpbGwpLAotCQkJIGFjY3VtX29mZG0tPmRzcF9zZWxmX2tpbGwsCi0JCQkgZGVsdGFfb2ZkbS0+ZHNwX3NlbGZfa2lsbCwKLQkJCSBtYXhfb2ZkbS0+ZHNwX3NlbGZfa2lsbCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5taF9mb3JtYXRfZXJyKSwKLQkJCSBhY2N1bV9vZmRtLT5taF9mb3JtYXRfZXJyLAotCQkJIGRlbHRhX29mZG0tPm1oX2Zvcm1hdF9lcnIsCi0JCQkgbWF4X29mZG0tPm1oX2Zvcm1hdF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyZV9hY3FfbWFpbl9yc3NpX3N1bToiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnJlX2FjcV9tYWluX3Jzc2lfc3VtKSwKLQkJCSBhY2N1bV9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKLQkJCSBkZWx0YV9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKLQkJCSBtYXhfb2ZkbS0+cmVfYWNxX21haW5fcnNzaV9zdW0pOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF9oZWFkZXIsICJTdGF0aXN0aWNzX1J4IC0gQ0NLOiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5pbmFfY250KSwgYWNjdW1fY2NrLT5pbmFfY250LAotCQkJIGRlbHRhX2Njay0+aW5hX2NudCwgbWF4X2Njay0+aW5hX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5maW5hX2NudCksIGFjY3VtX2Njay0+ZmluYV9jbnQsCi0JCQkgZGVsdGFfY2NrLT5maW5hX2NudCwgbWF4X2Njay0+ZmluYV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJwbGNwX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cGxjcF9lcnIpLCBhY2N1bV9jY2stPnBsY3BfZXJyLAotCQkJIGRlbHRhX2Njay0+cGxjcF9lcnIsIG1heF9jY2stPnBsY3BfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiY3JjMzJfZXJyOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5jcmMzMl9lcnIpLCBhY2N1bV9jY2stPmNyYzMyX2VyciwKLQkJCSBkZWx0YV9jY2stPmNyYzMyX2VyciwgbWF4X2Njay0+Y3JjMzJfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPm92ZXJydW5fZXJyKSwKLQkJCSBhY2N1bV9jY2stPm92ZXJydW5fZXJyLCBkZWx0YV9jY2stPm92ZXJydW5fZXJyLAotCQkJIG1heF9jY2stPm92ZXJydW5fZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZWFybHlfb3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmVhcmx5X292ZXJydW5fZXJyKSwKLQkJCSBhY2N1bV9jY2stPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIGRlbHRhX2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIsCi0JCQkgbWF4X2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjcmMzMl9nb29kOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5jcmMzMl9nb29kKSwgYWNjdW1fY2NrLT5jcmMzMl9nb29kLAotCQkJIGRlbHRhX2Njay0+Y3JjMzJfZ29vZCwgbWF4X2Njay0+Y3JjMzJfZ29vZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZhbHNlX2FsYXJtX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZmFsc2VfYWxhcm1fY250KSwKLQkJCSBhY2N1bV9jY2stPmZhbHNlX2FsYXJtX2NudCwKLQkJCSBkZWx0YV9jY2stPmZhbHNlX2FsYXJtX2NudCwgbWF4X2Njay0+ZmFsc2VfYWxhcm1fY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmluYV9zeW5jX2Vycl9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfc3luY19lcnJfY250KSwKLQkJCSBhY2N1bV9jY2stPmZpbmFfc3luY19lcnJfY250LAotCQkJIGRlbHRhX2Njay0+ZmluYV9zeW5jX2Vycl9jbnQsCi0JCQkgbWF4X2Njay0+ZmluYV9zeW5jX2Vycl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJzZmRfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2ZkX3RpbWVvdXQpLAotCQkJIGFjY3VtX2Njay0+c2ZkX3RpbWVvdXQsIGRlbHRhX2Njay0+c2ZkX3RpbWVvdXQsCi0JCQkgbWF4X2Njay0+c2ZkX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJmaW5hX3RpbWVvdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfdGltZW91dCksCi0JCQkgYWNjdW1fY2NrLT5maW5hX3RpbWVvdXQsIGRlbHRhX2Njay0+ZmluYV90aW1lb3V0LAotCQkJIG1heF9jY2stPmZpbmFfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInVucmVzcG9uZGVkX3J0czoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9jY2stPnVucmVzcG9uZGVkX3J0cywgZGVsdGFfY2NrLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgbWF4X2Njay0+dW5yZXNwb25kZWRfcnRzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicnhlX2ZyYW1lX2xtdF9vdnJ1bjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAotCQkJIGFjY3VtX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCi0JCQkgZGVsdGFfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKLQkJCSBtYXhfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2VudF9hY2tfY250KSwKLQkJCSBhY2N1bV9jY2stPnNlbnRfYWNrX2NudCwgZGVsdGFfY2NrLT5zZW50X2Fja19jbnQsCi0JCQkgbWF4X2Njay0+c2VudF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAic2VudF9jdHNfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5zZW50X2N0c19jbnQpLAotCQkJIGFjY3VtX2Njay0+c2VudF9jdHNfY250LCBkZWx0YV9jY2stPnNlbnRfY3RzX2NudCwKLQkJCSBtYXhfY2NrLT5zZW50X2N0c19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJzZW50X2JhX3JzcF9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPnNlbnRfYmFfcnNwX2NudCksCi0JCQkgYWNjdW1fY2NrLT5zZW50X2JhX3JzcF9jbnQsCi0JCQkgZGVsdGFfY2NrLT5zZW50X2JhX3JzcF9jbnQsCi0JCQkgbWF4X2Njay0+c2VudF9iYV9yc3BfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZHNwX3NlbGZfa2lsbDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZHNwX3NlbGZfa2lsbCksCi0JCQkgYWNjdW1fY2NrLT5kc3Bfc2VsZl9raWxsLCBkZWx0YV9jY2stPmRzcF9zZWxmX2tpbGwsCi0JCQkgbWF4X2Njay0+ZHNwX3NlbGZfa2lsbCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPm1oX2Zvcm1hdF9lcnIpLAotCQkJIGFjY3VtX2Njay0+bWhfZm9ybWF0X2VyciwgZGVsdGFfY2NrLT5taF9mb3JtYXRfZXJyLAotCQkJIG1heF9jY2stPm1oX2Zvcm1hdF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyZV9hY3FfbWFpbl9yc3NpX3N1bToiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cmVfYWNxX21haW5fcnNzaV9zdW0pLAotCQkJIGFjY3VtX2Njay0+cmVfYWNxX21haW5fcnNzaV9zdW0sCi0JCQkgZGVsdGFfY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKLQkJCSBtYXhfY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfUnggLSBHRU5FUkFMOiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJib2d1c19jdHM6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19jdHMpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2N0cywgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfY3RzLAotCQkJIG1heF9nZW5lcmFsLT5ib2d1c19jdHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJib2d1c19hY2s6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19hY2spLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2FjaywgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfYWNrLAotCQkJIG1heF9nZW5lcmFsLT5ib2d1c19hY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJub25fYnNzaWRfZnJhbWVzOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcyksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcywKLQkJCSBkZWx0YV9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzLAotCQkJIG1heF9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmlsdGVyZWRfZnJhbWVzOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzLAotCQkJIG1heF9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJub25fY2hhbm5lbF9iZWFjb25zOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucywKLQkJCSBkZWx0YV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAotCQkJIG1heF9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiY2hhbm5lbF9iZWFjb25zOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zLAotCQkJIG1heF9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJudW1fbWlzc2VkX2Jjb246IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5udW1fbWlzc2VkX2Jjb24pLAotCQkJIGFjY3VtX2dlbmVyYWwtPm51bV9taXNzZWRfYmNvbiwKLQkJCSBkZWx0YV9nZW5lcmFsLT5udW1fbWlzc2VkX2Jjb24sCi0JCQkgbWF4X2dlbmVyYWwtPm51bV9taXNzZWRfYmNvbik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFkY19yeF9zYXR1cmF0aW9uX3RpbWU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5hZGNfcnhfc2F0dXJhdGlvbl90aW1lKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5hZGNfcnhfc2F0dXJhdGlvbl90aW1lLAotCQkJIGRlbHRhX2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUsCi0JCQkgbWF4X2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJpbmFfZGV0ZWN0X3NlYXJjaF90bToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+aW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZSwKLQkJCSBtYXhfZ2VuZXJhbC0+aW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJlYWNvbl9zaWxlbmNlX3Jzc2lfYToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSwKLQkJCSBtYXhfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYmVhY29uX3NpbGVuY2VfcnNzaV9iOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iLAotCQkJIG1heF9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJiZWFjb25fc2lsZW5jZV9yc3NpX2M6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYywKLQkJCSBkZWx0YV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MsCi0JCQkgbWF4X2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImludGVyZmVyZW5jZV9kYXRhX2ZsYWc6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnLAotCQkJIGRlbHRhX2dlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcsCi0JCQkgbWF4X2dlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjaGFubmVsX2xvYWQ6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5jaGFubmVsX2xvYWQpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmNoYW5uZWxfbG9hZCwKLQkJCSBkZWx0YV9nZW5lcmFsLT5jaGFubmVsX2xvYWQsCi0JCQkgbWF4X2dlbmVyYWwtPmNoYW5uZWxfbG9hZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImRzcF9mYWxzZV9hbGFybXM6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zLAotCQkJIGRlbHRhX2dlbmVyYWwtPmRzcF9mYWxzZV9hbGFybXMsCi0JCQkgbWF4X2dlbmVyYWwtPmRzcF9mYWxzZV9hbGFybXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJiZWFjb25fcnNzaV9hOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSwKLQkJCSBkZWx0YV9nZW5lcmFsLT5iZWFjb25fcnNzaV9hLAotCQkJIG1heF9nZW5lcmFsLT5iZWFjb25fcnNzaV9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYmVhY29uX3Jzc2lfYjoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9yc3NpX2IpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9yc3NpX2IsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYiwKLQkJCSBtYXhfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJlYWNvbl9yc3NpX2M6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fcnNzaV9jKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5iZWFjb25fcnNzaV9jLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9yc3NpX2MsCi0JCQkgbWF4X2dlbmVyYWwtPmJlYWNvbl9yc3NpX2MpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJiZWFjb25fZW5lcmd5X2E6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fZW5lcmd5X2EpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSwKLQkJCSBkZWx0YV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2EsCi0JCQkgbWF4X2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJlYWNvbl9lbmVyZ3lfYjoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9iLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiwKLQkJCSBtYXhfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYmVhY29uX2VuZXJneV9jOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jLAotCQkJIG1heF9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF9oZWFkZXIsICJTdGF0aXN0aWNzX1J4IC0gT0ZETV9IVDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+cGxjcF9lcnIpLCBhY2N1bV9odC0+cGxjcF9lcnIsCi0JCQkgZGVsdGFfaHQtPnBsY3BfZXJyLCBtYXhfaHQtPnBsY3BfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9odC0+b3ZlcnJ1bl9lcnIsCi0JCQkgZGVsdGFfaHQtPm92ZXJydW5fZXJyLCBtYXhfaHQtPm92ZXJydW5fZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZWFybHlfb3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX2h0LT5lYXJseV9vdmVycnVuX2VyciwKLQkJCSBkZWx0YV9odC0+ZWFybHlfb3ZlcnJ1bl9lcnIsCi0JCQkgbWF4X2h0LT5lYXJseV9vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImNyYzMyX2dvb2Q6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+Y3JjMzJfZ29vZCksIGFjY3VtX2h0LT5jcmMzMl9nb29kLAotCQkJIGRlbHRhX2h0LT5jcmMzMl9nb29kLCBtYXhfaHQtPmNyYzMyX2dvb2QpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjcmMzMl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+Y3JjMzJfZXJyKSwgYWNjdW1faHQtPmNyYzMyX2VyciwKLQkJCSBkZWx0YV9odC0+Y3JjMzJfZXJyLCBtYXhfaHQtPmNyYzMyX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+bWhfZm9ybWF0X2VyciksCi0JCQkgYWNjdW1faHQtPm1oX2Zvcm1hdF9lcnIsCi0JCQkgZGVsdGFfaHQtPm1oX2Zvcm1hdF9lcnIsIG1heF9odC0+bWhfZm9ybWF0X2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZ19jcmMzMl9nb29kOiIsCi0JCQkgbGUzMl90b19jcHUoaHQtPmFnZ19jcmMzMl9nb29kKSwKLQkJCSBhY2N1bV9odC0+YWdnX2NyYzMyX2dvb2QsCi0JCQkgZGVsdGFfaHQtPmFnZ19jcmMzMl9nb29kLCBtYXhfaHQtPmFnZ19jcmMzMl9nb29kKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYWdnX21wZHVfY250OiIsCi0JCQkgbGUzMl90b19jcHUoaHQtPmFnZ19tcGR1X2NudCksCi0JCQkgYWNjdW1faHQtPmFnZ19tcGR1X2NudCwKLQkJCSBkZWx0YV9odC0+YWdnX21wZHVfY250LCBtYXhfaHQtPmFnZ19tcGR1X2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZ19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+YWdnX2NudCksIGFjY3VtX2h0LT5hZ2dfY250LAotCQkJIGRlbHRhX2h0LT5hZ2dfY250LCBtYXhfaHQtPmFnZ19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJ1bnN1cHBvcnRfbWNzOiIsCi0JCQkgbGUzMl90b19jcHUoaHQtPnVuc3VwcG9ydF9tY3MpLAotCQkJIGFjY3VtX2h0LT51bnN1cHBvcnRfbWNzLAotCQkJIGRlbHRhX2h0LT51bnN1cHBvcnRfbWNzLCBtYXhfaHQtPnVuc3VwcG9ydF9tY3MpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90IGl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX3R4KSAqIDQ4KSArIDI1MDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc190eCAqdHgsICphY2N1bV90eCwgKmRlbHRhX3R4LCAqbWF4X3R4OwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQotCSAgKi8KLQl0eCA9ICZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLnR4OwotCWFjY3VtX3R4ID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3MudHg7Ci0JZGVsdGFfdHggPSAmcHJpdi0+XzQ5NjUuZGVsdGFfc3RhdGlzdGljcy50eDsKLQltYXhfdHggPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLnR4OwotCi0JcG9zICs9IGl3bDQ5NjVfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfaGVhZGVyLCAiU3RhdGlzdGljc19UeDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicHJlYW1ibGU6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+cHJlYW1ibGVfY250KSwKLQkJCSBhY2N1bV90eC0+cHJlYW1ibGVfY250LAotCQkJIGRlbHRhX3R4LT5wcmVhbWJsZV9jbnQsIG1heF90eC0+cHJlYW1ibGVfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicnhfZGV0ZWN0ZWRfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPnJ4X2RldGVjdGVkX2NudCksCi0JCQkgYWNjdW1fdHgtPnJ4X2RldGVjdGVkX2NudCwKLQkJCSBkZWx0YV90eC0+cnhfZGV0ZWN0ZWRfY250LCBtYXhfdHgtPnJ4X2RldGVjdGVkX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJ0X3ByaW9fZGVmZXJfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fZGVmZXJfY250KSwKLQkJCSBhY2N1bV90eC0+YnRfcHJpb19kZWZlcl9jbnQsCi0JCQkgZGVsdGFfdHgtPmJ0X3ByaW9fZGVmZXJfY250LAotCQkJIG1heF90eC0+YnRfcHJpb19kZWZlcl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJidF9wcmlvX2tpbGxfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fa2lsbF9jbnQpLAotCQkJIGFjY3VtX3R4LT5idF9wcmlvX2tpbGxfY250LAotCQkJIGRlbHRhX3R4LT5idF9wcmlvX2tpbGxfY250LAotCQkJIG1heF90eC0+YnRfcHJpb19raWxsX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZld19ieXRlc19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+ZmV3X2J5dGVzX2NudCksCi0JCQkgYWNjdW1fdHgtPmZld19ieXRlc19jbnQsCi0JCQkgZGVsdGFfdHgtPmZld19ieXRlc19jbnQsIG1heF90eC0+ZmV3X2J5dGVzX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImN0c190aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmN0c190aW1lb3V0KSwgYWNjdW1fdHgtPmN0c190aW1lb3V0LAotCQkJIGRlbHRhX3R4LT5jdHNfdGltZW91dCwgbWF4X3R4LT5jdHNfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFja190aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFja190aW1lb3V0KSwKLQkJCSBhY2N1bV90eC0+YWNrX3RpbWVvdXQsCi0JCQkgZGVsdGFfdHgtPmFja190aW1lb3V0LCBtYXhfdHgtPmFja190aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZXhwZWN0ZWRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5leHBlY3RlZF9hY2tfY250KSwKLQkJCSBhY2N1bV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwKLQkJCSBkZWx0YV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwKLQkJCSBtYXhfdHgtPmV4cGVjdGVkX2Fja19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhY3R1YWxfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hY3R1YWxfYWNrX2NudCksCi0JCQkgYWNjdW1fdHgtPmFjdHVhbF9hY2tfY250LAotCQkJIGRlbHRhX3R4LT5hY3R1YWxfYWNrX2NudCwKLQkJCSBtYXhfdHgtPmFjdHVhbF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZHVtcF9tc2R1X2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5kdW1wX21zZHVfY250KSwKLQkJCSBhY2N1bV90eC0+ZHVtcF9tc2R1X2NudCwKLQkJCSBkZWx0YV90eC0+ZHVtcF9tc2R1X2NudCwKLQkJCSBtYXhfdHgtPmR1bXBfbXNkdV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhYm9ydF9ueHRfZnJhbWVfbWlzbWF0Y2g6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQpLAotCQkJIGFjY3VtX3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCwKLQkJCSBkZWx0YV90eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQsCi0JCQkgbWF4X3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFib3J0X21pc3Npbmdfbnh0X2ZyYW1lOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmJ1cnN0X2Fib3J0X21pc3NpbmdfbmV4dF9mcmFtZV9jbnQpLAotCQkJIGFjY3VtX3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250LAotCQkJIGRlbHRhX3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250LAotCQkJIG1heF90eC0+YnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImN0c190aW1lb3V0X2NvbGxpc2lvbjoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5jdHNfdGltZW91dF9jb2xsaXNpb24pLAotCQkJIGFjY3VtX3R4LT5jdHNfdGltZW91dF9jb2xsaXNpb24sCi0JCQkgZGVsdGFfdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbiwKLQkJCSBtYXhfdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFja19iYV90aW1lb3V0X2NvbGxpc2lvbjoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24pLAotCQkJIGFjY3VtX3R4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24sCi0JCQkgZGVsdGFfdHgtPmFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbiwKLQkJCSBtYXhfdHgtPmFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyBiYV90aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5iYV90aW1lb3V0KSwKLQkJCSBhY2N1bV90eC0+YWdnLmJhX3RpbWVvdXQsCi0JCQkgZGVsdGFfdHgtPmFnZy5iYV90aW1lb3V0LAotCQkJIG1heF90eC0+YWdnLmJhX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgYmFfcmVzY2hlZF9mcmFtZXM6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YWdnLmJhX3Jlc2NoZWR1bGVfZnJhbWVzKSwKLQkJCSBhY2N1bV90eC0+YWdnLmJhX3Jlc2NoZWR1bGVfZnJhbWVzLAotCQkJIGRlbHRhX3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMsCi0JCQkgbWF4X3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgc2NkX3F1ZXJ5X2FnZ19mcmFtZToiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQpLAotCQkJIGFjY3VtX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQsCi0JCQkgZGVsdGFfdHgtPmFnZy5zY2RfcXVlcnlfYWdnX2ZyYW1lX2NudCwKLQkJCSBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfYWdnX2ZyYW1lX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyBzY2RfcXVlcnlfbm9fYWdnOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5zY2RfcXVlcnlfbm9fYWdnKSwKLQkJCSBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2csCi0JCQkgZGVsdGFfdHgtPmFnZy5zY2RfcXVlcnlfbm9fYWdnLAotCQkJIG1heF90eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2cpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgc2NkX3F1ZXJ5X2FnZzoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X2FnZyksCi0JCQkgYWNjdW1fdHgtPmFnZy5zY2RfcXVlcnlfYWdnLAotCQkJIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZywKLQkJCSBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfYWdnKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYWdnIHNjZF9xdWVyeV9taXNtYXRjaDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X21pc21hdGNoKSwKLQkJCSBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9taXNtYXRjaCwKLQkJCSBkZWx0YV90eC0+YWdnLnNjZF9xdWVyeV9taXNtYXRjaCwKLQkJCSBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfbWlzbWF0Y2gpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgZnJhbWVfbm90X3JlYWR5OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5mcmFtZV9ub3RfcmVhZHkpLAotCQkJIGFjY3VtX3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5LAotCQkJIGRlbHRhX3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5LAotCQkJIG1heF90eC0+YWdnLmZyYW1lX25vdF9yZWFkeSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyB1bmRlcnJ1bjoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cudW5kZXJydW4pLAotCQkJIGFjY3VtX3R4LT5hZ2cudW5kZXJydW4sCi0JCQkgZGVsdGFfdHgtPmFnZy51bmRlcnJ1biwgbWF4X3R4LT5hZ2cudW5kZXJydW4pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgYnRfcHJpb19raWxsOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5idF9wcmlvX2tpbGwpLAotCQkJIGFjY3VtX3R4LT5hZ2cuYnRfcHJpb19raWxsLAotCQkJIGRlbHRhX3R4LT5hZ2cuYnRfcHJpb19raWxsLAotCQkJIG1heF90eC0+YWdnLmJ0X3ByaW9fa2lsbCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyByeF9iYV9yc3BfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5yeF9iYV9yc3BfY250KSwKLQkJCSBhY2N1bV90eC0+YWdnLnJ4X2JhX3JzcF9jbnQsCi0JCQkgZGVsdGFfdHgtPmFnZy5yeF9iYV9yc3BfY250LAotCQkJIG1heF90eC0+YWdnLnJ4X2JhX3JzcF9jbnQpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90Ci1pd2w0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbCkgKiAxMCArIDMwMDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9jb21tb24gKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgKmRiZywgKmFjY3VtX2RiZywgKmRlbHRhX2RiZywgKm1heF9kYmc7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZGl2ICpkaXYsICphY2N1bV9kaXYsICpkZWx0YV9kaXYsICptYXhfZGl2OwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQotCSAgKi8KLQlnZW5lcmFsID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JZGJnID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24uZGJnOwotCWRpdiA9ICZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRpdjsKLQlhY2N1bV9nZW5lcmFsID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JYWNjdW1fZGJnID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24uZGJnOwotCWFjY3VtX2RpdiA9ICZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRpdjsKLQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl80OTY1LmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JbWF4X2dlbmVyYWwgPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLmdlbmVyYWwuY29tbW9uOwotCWRlbHRhX2RiZyA9ICZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRiZzsKLQltYXhfZGJnID0gJnByaXYtPl80OTY1Lm1heF9kZWx0YS5nZW5lcmFsLmNvbW1vbi5kYmc7Ci0JZGVsdGFfZGl2ID0gJnByaXYtPl80OTY1LmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24uZGl2OwotCW1heF9kaXYgPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLmdlbmVyYWwuY29tbW9uLmRpdjsKLQotCXBvcyArPSBpd2w0OTY1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfR2VuZXJhbDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3ZhbHVlLCAidGVtcGVyYXR1cmU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT50ZW1wZXJhdHVyZSkpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdmFsdWUsICJ0dGxfdGltZXN0YW1wOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+dHRsX3RpbWVzdGFtcCkpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJidXJzdF9jaGVjazoiLAotCQkJIGxlMzJfdG9fY3B1KGRiZy0+YnVyc3RfY2hlY2spLAotCQkJIGFjY3VtX2RiZy0+YnVyc3RfY2hlY2ssCi0JCQkgZGVsdGFfZGJnLT5idXJzdF9jaGVjaywgbWF4X2RiZy0+YnVyc3RfY2hlY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJidXJzdF9jb3VudDoiLAotCQkJIGxlMzJfdG9fY3B1KGRiZy0+YnVyc3RfY291bnQpLAotCQkJIGFjY3VtX2RiZy0+YnVyc3RfY291bnQsCi0JCQkgZGVsdGFfZGJnLT5idXJzdF9jb3VudCwgbWF4X2RiZy0+YnVyc3RfY291bnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJ3YWl0X2Zvcl9zaWxlbmNlX3RpbWVvdXRfY291bnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShkYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQpLAotCQkJIGFjY3VtX2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCwKLQkJCSBkZWx0YV9kYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQsCi0JCQkgbWF4X2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNsZWVwX3RpbWU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbGVlcF90aW1lKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5zbGVlcF90aW1lLAotCQkJIGRlbHRhX2dlbmVyYWwtPnNsZWVwX3RpbWUsIG1heF9nZW5lcmFsLT5zbGVlcF90aW1lKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAic2xvdHNfb3V0OiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfb3V0KSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5zbG90c19vdXQsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfb3V0LCBtYXhfZ2VuZXJhbC0+c2xvdHNfb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAic2xvdHNfaWRsZToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsb3RzX2lkbGUpLAotCQkJIGFjY3VtX2dlbmVyYWwtPnNsb3RzX2lkbGUsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfaWRsZSwgbWF4X2dlbmVyYWwtPnNsb3RzX2lkbGUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJ0eF9vbl9hOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT50eF9vbl9hKSwgYWNjdW1fZGl2LT50eF9vbl9hLAotCQkJIGRlbHRhX2Rpdi0+dHhfb25fYSwgbWF4X2Rpdi0+dHhfb25fYSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInR4X29uX2I6IiwKLQkJCSBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2IpLCBhY2N1bV9kaXYtPnR4X29uX2IsCi0JCQkgZGVsdGFfZGl2LT50eF9vbl9iLCBtYXhfZGl2LT50eF9vbl9iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZXhlY190aW1lOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT5leGVjX3RpbWUpLCBhY2N1bV9kaXYtPmV4ZWNfdGltZSwKLQkJCSBkZWx0YV9kaXYtPmV4ZWNfdGltZSwgbWF4X2Rpdi0+ZXhlY190aW1lKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicHJvYmVfdGltZToiLAotCQkJIGxlMzJfdG9fY3B1KGRpdi0+cHJvYmVfdGltZSksIGFjY3VtX2Rpdi0+cHJvYmVfdGltZSwKLQkJCSBkZWx0YV9kaXYtPnByb2JlX3RpbWUsIG1heF9kaXYtPnByb2JlX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyeF9lbmFibGVfY291bnRlcjoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnJ4X2VuYWJsZV9jb3VudGVyKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciwKLQkJCSBkZWx0YV9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciwKLQkJCSBtYXhfZ2VuZXJhbC0+cnhfZW5hYmxlX2NvdW50ZXIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJudW1fb2Zfc29zX3N0YXRlczoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm51bV9vZl9zb3Nfc3RhdGVzKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcywKLQkJCSBkZWx0YV9nZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcywKLQkJCSBtYXhfZ2VuZXJhbC0+bnVtX29mX3Nvc19zdGF0ZXMpOwotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4ZTM1My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1kZWJ1Z2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotc3NpemVfdCBpd2w0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci1zc2l6ZV90IGl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLXNzaXplX3QgaXdsNDk2NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLSNlbHNlCi1zdGF0aWMgc3NpemVfdAotaXdsNDk2NV91Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiAwOwotfQotc3RhdGljIHNzaXplX3QKLWl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzc2l6ZV90Ci1pd2w0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWVlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOWJhYWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtZWVwcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEVFUFJPTSByZWxhdGVkIGZ1bmN0aW9ucwotICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRoZSBkZXZpY2UncyBFRVBST00gc2VtYXBob3JlIHByZXZlbnRzIGNvbmZsaWN0cyBiZXR3ZWVuIGRyaXZlciBhbmQgdUNvZGUKLSAqIHdoZW4gYWNjZXNzaW5nIHRoZSBFRVBST007IGVhY2ggYWNjZXNzIGlzIGEgc2VyaWVzIG9mIHB1bHNlcyB0by9mcm9tIHRoZQotICogRUVQUk9NIGNoaXAsIG5vdCBhIHNpbmdsZSBldmVudCwgc28gZXZlbiByZWFkcyBjb3VsZCBjb25mbGljdCBpZiB0aGV5Ci0gKiB3ZXJlbid0IGFyYml0cmF0ZWQgYnkgdGhlIHNlbWFwaG9yZS4KLSAqLwotaW50IGl3bDQ5NjVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MTYgY291bnQ7Ci0JaW50IHJldDsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEVFUFJPTV9TRU1fUkVUUllfTElNSVQ7IGNvdW50KyspIHsKLQkJLyogUmVxdWVzdCBzZW1hcGhvcmUgKi8KLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSk7Ci0KLQkJLyogU2VlIGlmIHdlIGdvdCBpdCAqLwotCQlyZXQgPSBpd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNLAotCQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSwKLQkJCQlFRVBST01fU0VNX1RJTUVPVVQpOwotCQlpZiAocmV0ID49IDApIHsKLQkJCUlXTF9ERUJVR19JTyhwcml2LAotCQkJCSJBY3F1aXJlZCBzZW1hcGhvcmUgYWZ0ZXIgJWQgdHJpZXMuXG4iLAotCQkJCWNvdW50KzEpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaXdsNDk2NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWl3bF9sZWdhY3lfY2xlYXJfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0pOwotCi19Ci0KLWludCBpd2w0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MTYgZWVwcm9tX3ZlcjsKLQl1MTYgY2FsaWJfdmVyOwotCi0JZWVwcm9tX3ZlciA9IGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1ZFUlNJT04pOwotCWNhbGliX3ZlciA9IGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYocHJpdiwKLQkJCUVFUFJPTV80OTY1X0NBTElCX1ZFUlNJT05fT0ZGU0VUKTsKLQotCWlmIChlZXByb21fdmVyIDwgcHJpdi0+Y2ZnLT5lZXByb21fdmVyIHx8Ci0JICAgIGNhbGliX3ZlciA8IHByaXYtPmNmZy0+ZWVwcm9tX2NhbGliX3ZlcikKLQkJZ290byBlcnI7Ci0KLQlJV0xfSU5GTyhwcml2LCAiZGV2aWNlIEVFUFJPTSBWRVI9MHgleCwgQ0FMSUI9MHgleFxuIiwKLQkJIGVlcHJvbV92ZXIsIGNhbGliX3Zlcik7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlJV0xfRVJSKHByaXYsICJVbnN1cHBvcnRlZCAodG9vIG9sZCkgRUVQUk9NIFZFUj0weCV4IDwgMHgleCAiCi0JCSAgIkNBTElCPTB4JXggPCAweCV4XG4iLAotCQkgIGVlcHJvbV92ZXIsIHByaXYtPmNmZy0+ZWVwcm9tX3ZlciwKLQkJICBjYWxpYl92ZXIsICBwcml2LT5jZmctPmVlcHJvbV9jYWxpYl92ZXIpOwotCXJldHVybiAtRUlOVkFMOwotCi19Ci0KLXZvaWQgaXdsNDk2NV9lZXByb21fZ2V0X21hYyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4ICptYWMpCi17Ci0JY29uc3QgdTggKmFkZHIgPSBpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsCi0JCQkJCUVFUFJPTV9NQUNfQUREUkVTUyk7Ci0JbWVtY3B5KG1hYywgYWRkciwgRVRIX0FMRU4pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWh3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNmZhMjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtaHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLTQ5NjUtaHcuaCkgb25seSBmb3IgaGFyZHdhcmUtcmVsYXRlZCBkZWZpbml0aW9ucy4KLSAqIFVzZSBpd2wtY29tbWFuZHMuaCBmb3IgdUNvZGUgQVBJIGRlZmluaXRpb25zLgotICogVXNlIGl3bC1kZXYuaCBmb3IgZHJpdmVyIGltcGxlbWVudGF0aW9uIGRlZmluaXRpb25zLgotICovCi0KLSNpZm5kZWYgX19pd2xfNDk2NV9od19oX18KLSNkZWZpbmUgX19pd2xfNDk2NV9od19oX18KLQotI2luY2x1ZGUgIml3bC1maC5oIgotCi0vKiBFRVBST00gKi8KLSNkZWZpbmUgSVdMNDk2NV9FRVBST01fSU1HX1NJWkUJCQkxMDI0Ci0KLS8qCi0gKiB1Q29kZSBxdWV1ZSBtYW5hZ2VtZW50IGRlZmluaXRpb25zIC4uLgotICogVGhlIGZpcnN0IHF1ZXVlIHVzZWQgZm9yIGJsb2NrLWFjayBhZ2dyZWdhdGlvbiBpcyAjNyAoNDk2NSBvbmx5KS4KLSAqIEFsbCBibG9jay1hY2sgYWdncmVnYXRpb24gcXVldWVzIHNob3VsZCBtYXAgdG8gVHggRE1BL0ZJRk8gY2hhbm5lbCA3LgotICovCi0jZGVmaW5lIElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFCTcKLQotLyogU2l6ZXMgYW5kIGFkZHJlc3NlcyBmb3IgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgbWVtb3J5IChTUkFNKSBpbgotICogNDk2NSdzIGVtYmVkZGVkIHByb2Nlc3Nvci4gIERyaXZlciBhY2Nlc3MgaXMgdmlhIEhCVVNfVEFSR19NRU1fKiByZWdzLiAqLwotI2RlZmluZSBJV0w0OV9SVENfSU5TVF9MT1dFUl9CT1VORAkJKDB4MDAwMDAwKQotI2RlZmluZSBJV0w0OV9SVENfSU5TVF9VUFBFUl9CT1VORAkJKDB4MDE4MDAwKQotCi0jZGVmaW5lIElXTDQ5X1JUQ19EQVRBX0xPV0VSX0JPVU5ECQkoMHg4MDAwMDApCi0jZGVmaW5lIElXTDQ5X1JUQ19EQVRBX1VQUEVSX0JPVU5ECQkoMHg4MEEwMDApCi0KLSNkZWZpbmUgSVdMNDlfUlRDX0lOU1RfU0laRSAgKElXTDQ5X1JUQ19JTlNUX1VQUEVSX0JPVU5EIC0gXAotCQkJCUlXTDQ5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKQotI2RlZmluZSBJV0w0OV9SVENfREFUQV9TSVpFICAoSVdMNDlfUlRDX0RBVEFfVVBQRVJfQk9VTkQgLSBcCi0JCQkJSVdMNDlfUlRDX0RBVEFfTE9XRVJfQk9VTkQpCi0KLSNkZWZpbmUgSVdMNDlfTUFYX0lOU1RfU0laRSBJV0w0OV9SVENfSU5TVF9TSVpFCi0jZGVmaW5lIElXTDQ5X01BWF9EQVRBX1NJWkUgSVdMNDlfUlRDX0RBVEFfU0laRQotCi0vKiBTaXplIG9mIHVDb2RlIGluc3RydWN0aW9uIG1lbW9yeSBpbiBib290c3RyYXAgc3RhdGUgbWFjaGluZSAqLwotI2RlZmluZSBJV0w0OV9NQVhfQlNNX1NJWkUgQlNNX1NSQU1fU0laRQotCi1zdGF0aWMgaW5saW5lIGludCBpd2w0OTY1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIodTMyIGFkZHIpCi17Ci0JcmV0dXJuIChhZGRyID49IElXTDQ5X1JUQ19EQVRBX0xPV0VSX0JPVU5EKSAmJgotCSAgICAgICAoYWRkciA8IElXTDQ5X1JUQ19EQVRBX1VQUEVSX0JPVU5EKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBURU1QRVJBVFVSRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIDQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24uCi0gKgotICogVGhlIGRyaXZlciBtdXN0IGNhbGN1bGF0ZSB0aGUgZGV2aWNlIHRlbXBlcmF0dXJlIGJlZm9yZSBjYWxjdWxhdGluZwotICogYSB0eHBvd2VyIHNldHRpbmcgKGFtcGxpZmllciBnYWluIGlzIHRlbXBlcmF0dXJlIGRlcGVuZGVudCkuICBUaGUKLSAqIGNhbGN1bGF0aW9uIHVzZXMgNCBtZWFzdXJlbWVudHMsIDMgb2Ygd2hpY2ggKFIxLCBSMiwgUjMpIGFyZSBjYWxpYnJhdGlvbgotICogdmFsdWVzIHVzZWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBkcml2ZXIsIGFuZCBvbmUgb2Ygd2hpY2ggKFI0KSBpcyB0aGUKLSAqIHJlYWwtdGltZSB0ZW1wZXJhdHVyZSBpbmRpY2F0b3IuCi0gKgotICogdUNvZGUgcHJvdmlkZXMgYWxsIDQgdmFsdWVzIHRvIHRoZSBkcml2ZXIgdmlhIHRoZSAiaW5pdGlhbGl6ZSBhbGl2ZSIKLSAqIG5vdGlmaWNhdGlvbiAoc2VlIHN0cnVjdCBpd2w0OTY1X2luaXRfYWxpdmVfcmVzcCkuICBBZnRlciB0aGUgcnVudGltZSB1Q29kZQotICogaW1hZ2UgbG9hZHMsIHVDb2RlIHVwZGF0ZXMgdGhlIFI0IHZhbHVlIHZpYSBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbnMKLSAqIChzZWUgU1RBVElTVElDU19OT1RJRklDQVRJT04pLCB3aGljaCBvY2N1ciBhZnRlciBlYWNoIHJlY2VpdmVkIGJlYWNvbgotICogd2hlbiBhc3NvY2lhdGVkLCBvciBjYW4gYmUgcmVxdWVzdGVkIHZpYSBSRVBMWV9TVEFUSVNUSUNTX0NNRC4KLSAqCi0gKiBOT1RFOiAgdUNvZGUgcHJvdmlkZXMgdGhlIFI0IHZhbHVlIGFzIGEgMjMtYml0IHNpZ25lZCB2YWx1ZS4gIERyaXZlcgotICogICAgICAgIG11c3Qgc2lnbi1leHRlbmQgdG8gMzIgYml0cyBiZWZvcmUgYXBwbHlpbmcgZm9ybXVsYSBiZWxvdy4KLSAqCi0gKiBGb3JtdWxhOgotICoKLSAqIGRlZ3JlZXMgS2VsdmluID0gKCg5NyAqIDI1OSAqIChSNCAtIFIyKSAvIChSMyAtIFIxKSkgLyAxMDApICsgOAotICoKLSAqIE5PVEU6ICBUaGUgYmFzaWMgZm9ybXVsYSBpcyAyNTkgKiAoUjQtUjIpIC8gKFIzLVIxKS4gIFRoZSA5Ny8xMDAgaXMKLSAqIGFuIGFkZGl0aW9uYWwgY29ycmVjdGlvbiwgd2hpY2ggc2hvdWxkIGJlIGNlbnRlcmVkIGFyb3VuZCAwIGRlZ3JlZXMKLSAqIENlbHNpdXMgKDI3MyBkZWdyZWVzIEtlbHZpbikuICBUaGUgOCAoMyBwZXJjZW50IG9mIDI3MykgY29tcGVuc2F0ZXMgZm9yCi0gKiBjZW50ZXJpbmcgdGhlIDk3LzEwMCBjb3JyZWN0aW9uIGFyb3VuZCAwIGRlZ3JlZXMgSy4KLSAqCi0gKiBBZGQgMjczIHRvIEtlbHZpbiB2YWx1ZSB0byBmaW5kIGRlZ3JlZXMgQ2Vsc2l1cywgZm9yIGNvbXBhcmluZyBjdXJyZW50Ci0gKiB0ZW1wZXJhdHVyZSB3aXRoIGZhY3RvcnktbWVhc3VyZWQgdGVtcGVyYXR1cmVzIHdoZW4gY2FsY3VsYXRpbmcgdHhwb3dlcgotICogc2V0dGluZ3MuCi0gKi8KLSNkZWZpbmUgVEVNUEVSQVRVUkVfQ0FMSUJfS0VMVklOX09GRlNFVCA4Ci0jZGVmaW5lIFRFTVBFUkFUVVJFX0NBTElCX0FfVkFMIDI1OQotCi0vKiBMaW1pdCByYW5nZSBvZiBjYWxjdWxhdGVkIHRlbXBlcmF0dXJlIHRvIGJlIGJldHdlZW4gdGhlc2UgS2VsdmluIHZhbHVlcyAqLwotI2RlZmluZSBJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUlOICAoMjYzKQotI2RlZmluZSBJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUFYICAoNDEwKQotCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9PVVRfT0ZfUkFOR0UodCkgXAotCSgoKHQpIDwgSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01JTikgfHwgXAotCSAoKHQpID4gSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01BWCkpCi0KLS8qKioqKioqKioqKioqKioqKioqKiogRU5EIFRFTVBFUkFUVVJFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBUWFBPV0VSICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIDQ5NjUgdHhwb3dlciBjYWxjdWxhdGlvbnMgcmVseSBvbiBpbmZvcm1hdGlvbiBmcm9tIHRocmVlIHNvdXJjZXM6Ci0gKgotICogICAgIDEpIEVFUFJPTQotICogICAgIDIpICJpbml0aWFsaXplIiBhbGl2ZSBub3RpZmljYXRpb24KLSAqICAgICAzKSBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbnMKLSAqCi0gKiBFRVBST00gZGF0YSBjb25zaXN0cyBvZjoKLSAqCi0gKiAxKSAgUmVndWxhdG9yeSBpbmZvcm1hdGlvbiAobWF4IHR4cG93ZXIgYW5kIGNoYW5uZWwgdXNhZ2UgZmxhZ3MpIGlzIHByb3ZpZGVkCi0gKiAgICAgc2VwYXJhdGVseSBmb3IgZWFjaCBjaGFubmVsIHRoYXQgY2FuIHBvc3NpYmx5IHN1cHBvcnRlZCBieSA0OTY1LgotICogICAgIDQwIE1IeiB3aWRlICguMTFuIEhUNDApIGNoYW5uZWxzIGFyZSBsaXN0ZWQgc2VwYXJhdGVseSBmcm9tIDIwIE1IegotICogICAgIChsZWdhY3kpIGNoYW5uZWxzLgotICoKLSAqICAgICBTZWUgc3RydWN0IGl3bDQ5NjVfZWVwcm9tX2NoYW5uZWwgZm9yIGZvcm1hdCwgYW5kIHN0cnVjdCBpd2w0OTY1X2VlcHJvbQotICogICAgIGZvciBsb2NhdGlvbnMgaW4gRUVQUk9NLgotICoKLSAqIDIpICBGYWN0b3J5IHR4cG93ZXIgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgc2VwYXJhdGVseSBmb3IKLSAqICAgICBzdWItYmFuZHMgb2YgY29udGlndW91cyBjaGFubmVscy4gIDIuNEdIeiBoYXMganVzdCBvbmUgc3ViLWJhbmQsCi0gKiAgICAgYnV0IDUgR0h6IGhhcyBzZXZlcmFsIHN1Yi1iYW5kcy4KLSAqCi0gKiAgICAgSW4gYWRkaXRpb24sIHBlci1iYW5kICgyLjQgYW5kIDUgR2h6KSBzYXR1cmF0aW9uIHR4cG93ZXJzIGFyZSBwcm92aWRlZC4KLSAqCi0gKiAgICAgU2VlIHN0cnVjdCBpd2w0OTY1X2VlcHJvbV9jYWxpYl9pbmZvIChhbmQgdGhlIHRyZWUgb2Ygc3RydWN0dXJlcwotICogICAgIGNvbnRhaW5lZCB3aXRoaW4gaXQpIGZvciBmb3JtYXQsIGFuZCBzdHJ1Y3QgaXdsNDk2NV9lZXByb20gZm9yCi0gKiAgICAgbG9jYXRpb25zIGluIEVFUFJPTS4KLSAqCi0gKiAiSW5pdGlhbGl6YXRpb24gYWxpdmUiIG5vdGlmaWNhdGlvbiAoc2VlIHN0cnVjdCBpd2w0OTY1X2luaXRfYWxpdmVfcmVzcCkKLSAqIGNvbnNpc3RzIG9mOgotICoKLSAqIDEpICBUZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiBwYXJhbWV0ZXJzLgotICoKLSAqIDIpICBQb3dlciBzdXBwbHkgdm9sdGFnZSBtZWFzdXJlbWVudC4KLSAqCi0gKiAzKSAgVHggZ2FpbiBjb21wZW5zYXRpb24gdG8gYmFsYW5jZSAyIHRyYW5zbWl0dGVycyBmb3IgTUlNTyB1c2UuCi0gKgotICogU3RhdGlzdGljcyBub3RpZmljYXRpb25zIGRlbGl2ZXI6Ci0gKgotICogMSkgIEN1cnJlbnQgdmFsdWVzIGZvciB0ZW1wZXJhdHVyZSBwYXJhbSBSNC4KLSAqLwotCi0vKioKLSAqIFRvIGNhbGN1bGF0ZSBhIHR4cG93ZXIgc2V0dGluZyBmb3IgYSBnaXZlbiBkZXNpcmVkIHRhcmdldCB0eHBvd2VyLCBjaGFubmVsLAotICogbW9kdWxhdGlvbiBiaXQgcmF0ZSwgYW5kIHRyYW5zbWl0dGVyIGNoYWluICg0OTY1IGhhcyAyIHRyYW5zbWl0dGVycyB0bwotICogc3VwcG9ydCBNSU1PIGFuZCB0cmFuc21pdCBkaXZlcnNpdHkpLCBkcml2ZXIgbXVzdCBkbyB0aGUgZm9sbG93aW5nOgotICoKLSAqIDEpICBDb21wYXJlIGRlc2lyZWQgdHhwb3dlciB2cy4gKEVFUFJPTSkgcmVndWxhdG9yeSBsaW1pdCBmb3IgdGhpcyBjaGFubmVsLgotICogICAgIERvIG5vdCBleGNlZWQgcmVndWxhdG9yeSBsaW1pdDsgcmVkdWNlIHRhcmdldCB0eHBvd2VyIGlmIG5lY2Vzc2FyeS4KLSAqCi0gKiAgICAgSWYgc2V0dGluZyB1cCB0eHBvd2VycyBmb3IgTUlNTyByYXRlcyAocmF0ZSBpbmRleGVzIDgtMTUsIDI0LTMxKSwKLSAqICAgICAyIHRyYW5zbWl0dGVycyB3aWxsIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHk7IGRyaXZlciBtdXN0IHJlZHVjZSB0aGUKLSAqICAgICByZWd1bGF0b3J5IGxpbWl0IGJ5IDMgZEIgKGhhbGYtcG93ZXIpIGZvciBlYWNoIHRyYW5zbWl0dGVyLCBzbyB0aGUKLSAqICAgICBjb21iaW5lZCB0b3RhbCBvdXRwdXQgb2YgdGhlIDIgdHJhbnNtaXR0ZXJzIGlzIHdpdGhpbiByZWd1bGF0b3J5IGxpbWl0cy4KLSAqCi0gKgotICogMikgIENvbXBhcmUgdGFyZ2V0IHR4cG93ZXIgdnMuIChFRVBST00pIHNhdHVyYXRpb24gdHhwb3dlciAqcmVkdWNlZCBieQotICogICAgIGJhY2tvZmYgZm9yIHRoaXMgYml0IHJhdGUqLiAgRG8gbm90IGV4Y2VlZCAoc2F0dXJhdGlvbiAtIGJhY2tvZmZbcmF0ZV0pOwotICogICAgIHJlZHVjZSB0YXJnZXQgdHhwb3dlciBpZiBuZWNlc3NhcnkuCi0gKgotICogICAgIEJhY2tvZmYgdmFsdWVzIGJlbG93IGFyZSBpbiAxLzIgZEIgdW5pdHMgKGVxdWl2YWxlbnQgdG8gc3RlcHMgaW4KLSAqICAgICB0eHBvd2VyIGdhaW4gdGFibGVzKToKLSAqCi0gKiAgICAgT0ZETSA2IC0gMzYgTUJpdDogIDEwIHN0ZXBzICg1IGRCKQotICogICAgIE9GRE0gNDggTUJpdDogICAgICAxNSBzdGVwcyAoNy41IGRCKQotICogICAgIE9GRE0gNTQgTUJpdDogICAgICAxNyBzdGVwcyAoOC41IGRCKQotICogICAgIE9GRE0gNjAgTUJpdDogICAgICAyMCBzdGVwcyAoMTAgZEIpCi0gKiAgICAgQ0NLIGFsbCByYXRlczogICAgIDEwIHN0ZXBzICg1IGRCKQotICoKLSAqICAgICBCYWNrb2ZmIHZhbHVlcyBhcHBseSB0byBzYXR1cmF0aW9uIHR4cG93ZXIgb24gYSBwZXItdHJhbnNtaXR0ZXIgYmFzaXM7Ci0gKiAgICAgd2hlbiB1c2luZyBNSU1PICgyIHRyYW5zbWl0dGVycyksIGVhY2ggdHJhbnNtaXR0ZXIgdXNlcyB0aGUgc2FtZQotICogICAgIHNhdHVyYXRpb24gbGV2ZWwgcHJvdmlkZWQgaW4gRUVQUk9NLCBhbmQgdGhlIHNhbWUgYmFja29mZiB2YWx1ZXM7Ci0gKiAgICAgbm8gcmVkdWN0aW9uIChzdWNoIGFzIHdpdGggcmVndWxhdG9yeSB0eHBvd2VyIGxpbWl0cykgaXMgcmVxdWlyZWQuCi0gKgotICogICAgIFNhdHVyYXRpb24gYW5kIEJhY2tvZmYgdmFsdWVzIGFwcGx5IGVxdWFsbHkgdG8gMjAgTWh6IChsZWdhY3kpIGNoYW5uZWwKLSAqICAgICB3aWR0aHMgYW5kIDQwIE1oeiAoLjExbiBIVDQwKSBjaGFubmVsIHdpZHRoczsgdGhlcmUgaXMgbm8gc2VwYXJhdGUKLSAqICAgICBmYWN0b3J5IG1lYXN1cmVtZW50IGZvciBodDQwIGNoYW5uZWxzLgotICoKLSAqICAgICBUaGUgcmVzdWx0IG9mIHRoaXMgc3RlcCBpcyB0aGUgZmluYWwgdGFyZ2V0IHR4cG93ZXIuICBUaGUgcmVzdCBvZgotICogICAgIHRoZSBzdGVwcyBmaWd1cmUgb3V0IHRoZSBwcm9wZXIgc2V0dGluZ3MgZm9yIHRoZSBkZXZpY2UgdG8gYWNoaWV2ZQotICogICAgIHRoYXQgdGFyZ2V0IHR4cG93ZXIuCi0gKgotICoKLSAqIDMpICBEZXRlcm1pbmUgKEVFUFJPTSkgY2FsaWJyYXRpb24gc3ViIGJhbmQgZm9yIHRoZSB0YXJnZXQgY2hhbm5lbCwgYnkKLSAqICAgICBjb21wYXJpbmcgYWdhaW5zdCBmaXJzdCBhbmQgbGFzdCBjaGFubmVscyBpbiBlYWNoIHN1YiBiYW5kCi0gKiAgICAgKHNlZSBzdHJ1Y3QgaXdsNDk2NV9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvKS4KLSAqCi0gKgotICogNCkgIExpbmVhcmx5IGludGVycG9sYXRlIChFRVBST00pIGZhY3RvcnkgY2FsaWJyYXRpb24gbWVhc3VyZW1lbnQgc2V0cywKLSAqICAgICByZWZlcmVuY2luZyB0aGUgMiBmYWN0b3J5LW1lYXN1cmVkIChzYW1wbGUpIGNoYW5uZWxzIHdpdGhpbiB0aGUgc3ViIGJhbmQuCi0gKgotICogICAgIEludGVycG9sYXRpb24gaXMgYmFzZWQgb24gZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFubmVsJ3MgZnJlcXVlbmN5Ci0gKiAgICAgYW5kIHRoZSBzYW1wbGUgY2hhbm5lbHMnIGZyZXF1ZW5jaWVzLiAgU2luY2UgY2hhbm5lbCBudW1iZXJzIGFyZSBiYXNlZAotICogICAgIG9uIGZyZXF1ZW5jeSAoNSBNSHogYmV0d2VlbiBlYWNoIGNoYW5uZWwgbnVtYmVyKSwgdGhpcyBpcyBlcXVpdmFsZW50Ci0gKiAgICAgdG8gaW50ZXJwb2xhdGluZyBiYXNlZCBvbiBjaGFubmVsIG51bWJlciBkaWZmZXJlbmNlcy4KLSAqCi0gKiAgICAgTm90ZSB0aGF0IHRoZSBzYW1wbGUgY2hhbm5lbHMgbWF5IG9yIG1heSBub3QgYmUgdGhlIGNoYW5uZWxzIGF0IHRoZQotICogICAgIGVkZ2VzIG9mIHRoZSBzdWIgYmFuZC4gIFRoZSB0YXJnZXQgY2hhbm5lbCBtYXkgYmUgIm91dHNpZGUiIG9mIHRoZQotICogICAgIHNwYW4gb2YgdGhlIHNhbXBsZWQgY2hhbm5lbHMuCi0gKgotICogICAgIERyaXZlciBtYXkgY2hvb3NlIHRoZSBwYWlyIChmb3IgMiBUeCBjaGFpbnMpIG9mIG1lYXN1cmVtZW50cyAoc2VlCi0gKiAgICAgc3RydWN0IGl3bDQ5NjVfZWVwcm9tX2NhbGliX2NoX2luZm8pIGZvciB3aGljaCB0aGUgYWN0dWFsIG1lYXN1cmVkCi0gKiAgICAgdHhwb3dlciBjb21lcyBjbG9zZXN0IHRvIHRoZSBkZXNpcmVkIHR4cG93ZXIuICBVc3VhbGx5LCB0aG91Z2gsCi0gKiAgICAgdGhlIG1pZGRsZSBzZXQgb2YgbWVhc3VyZW1lbnRzIGlzIGNsb3Nlc3QgdG8gdGhlIHJlZ3VsYXRvcnkgbGltaXRzLAotICogICAgIGFuZCBpcyB0aGVyZWZvcmUgYSBnb29kIGNob2ljZSBmb3IgYWxsIHR4cG93ZXIgY2FsY3VsYXRpb25zICh0aGlzCi0gKiAgICAgYXNzdW1lcyB0aGF0IGhpZ2ggYWNjdXJhY3kgaXMgbmVlZGVkIGZvciBtYXhpbWl6aW5nIGxlZ2FsIHR4cG93ZXIsCi0gKiAgICAgd2hpbGUgbG93ZXIgdHhwb3dlciBjb25maWd1cmF0aW9ucyBkbyBub3QgbmVlZCBhcyBtdWNoIGFjY3VyYWN5KS4KLSAqCi0gKiAgICAgRHJpdmVyIHNob3VsZCBpbnRlcnBvbGF0ZSBib3RoIG1lbWJlcnMgb2YgdGhlIGNob3NlbiBtZWFzdXJlbWVudCBwYWlyLAotICogICAgIGkuZS4gZm9yIGJvdGggVHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlcnMpLCB1bmxlc3MgdGhlIGRyaXZlciBrbm93cwotICogICAgIHRoYXQgb25seSBvbmUgb2YgdGhlIGNoYWlucyB3aWxsIGJlIHVzZWQgKGUuZy4gb25seSBvbmUgdHggYW50ZW5uYQotICogICAgIGNvbm5lY3RlZCwgYnV0IHRoaXMgc2hvdWxkIGJlIHVudXN1YWwpLiAgVGhlIHJhdGUgc2NhbGluZyBhbGdvcml0aG0KLSAqICAgICBzd2l0Y2hlcyBhbnRlbm5hcyB0byBmaW5kIGJlc3QgcGVyZm9ybWFuY2UsIHNvIGJvdGggVHggY2hhaW5zIHdpbGwKLSAqICAgICBiZSB1c2VkIChhbHRob3VnaCBvbmx5IG9uZSBhdCBhIHRpbWUpIGV2ZW4gZm9yIG5vbi1NSU1PIHRyYW5zbWlzc2lvbnMuCi0gKgotICogICAgIERyaXZlciBzaG91bGQgaW50ZXJwb2xhdGUgZmFjdG9yeSB2YWx1ZXMgZm9yIHRlbXBlcmF0dXJlLCBnYWluIHRhYmxlCi0gKiAgICAgaW5kZXgsIGFuZCBhY3R1YWwgcG93ZXIuICBUaGUgcG93ZXIgYW1wbGlmaWVyIGRldGVjdG9yIHZhbHVlcyBhcmUKLSAqICAgICBub3QgdXNlZCBieSB0aGUgZHJpdmVyLgotICoKLSAqICAgICBTYW5pdHkgY2hlY2s6ICBJZiB0aGUgdGFyZ2V0IGNoYW5uZWwgaGFwcGVucyB0byBiZSBvbmUgb2YgdGhlIHNhbXBsZQotICogICAgIGNoYW5uZWxzLCB0aGUgcmVzdWx0cyBzaG91bGQgYWdyZWUgd2l0aCB0aGUgc2FtcGxlIGNoYW5uZWwncwotICogICAgIG1lYXN1cmVtZW50cyEKLSAqCi0gKgotICogNSkgIEZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlc2lyZWQgdHhwb3dlciBhbmQgKGludGVycG9sYXRlZCkKLSAqICAgICBmYWN0b3J5LW1lYXN1cmVkIHR4cG93ZXIuICBVc2luZyAoaW50ZXJwb2xhdGVkKSBmYWN0b3J5IGdhaW4gdGFibGUgaW5kZXgKLSAqICAgICAoc2hvd24gZWxzZXdoZXJlKSBhcyBhIHN0YXJ0aW5nIHBvaW50LCBhZGp1c3QgdGhpcyBpbmRleCBsb3dlciB0bwotICogICAgIGluY3JlYXNlIHR4cG93ZXIsIG9yIGhpZ2hlciB0byBkZWNyZWFzZSB0eHBvd2VyLCB1bnRpbCB0aGUgdGFyZ2V0Ci0gKiAgICAgdHhwb3dlciBpcyByZWFjaGVkLiAgRWFjaCBzdGVwIGluIHRoZSBnYWluIHRhYmxlIGlzIDEvMiBkQi4KLSAqCi0gKiAgICAgRm9yIGV4YW1wbGUsIGlmIGZhY3RvcnkgbWVhc3VyZWQgdHhwb3dlciBpcyAxNiBkQm0sIGFuZCB0YXJnZXQgdHhwb3dlcgotICogICAgIGlzIDEzIGRCbSwgYWRkIDYgc3RlcHMgdG8gdGhlIGZhY3RvcnkgZ2FpbiBpbmRleCB0byByZWR1Y2UgdHhwb3dlcgotICogICAgIGJ5IDMgZEIuCi0gKgotICoKLSAqIDYpICBGaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGRldmljZSB0ZW1wZXJhdHVyZSBhbmQgKGludGVycG9sYXRlZCkKLSAqICAgICBmYWN0b3J5LW1lYXN1cmVkIHRlbXBlcmF0dXJlIGZvciBzdWItYmFuZC4gIEZhY3RvcnkgdmFsdWVzIGFyZSBpbgotICogICAgIGRlZ3JlZXMgQ2Vsc2l1cy4gIFRvIGNhbGN1bGF0ZSBjdXJyZW50IHRlbXBlcmF0dXJlLCBzZWUgY29tbWVudHMgZm9yCi0gKiAgICAgIjQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24iLgotICoKLSAqICAgICBJZiBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIGhpZ2hlciB0aGFuIGZhY3RvcnkgdGVtcGVyYXR1cmUsIGRyaXZlciBtdXN0Ci0gKiAgICAgaW5jcmVhc2UgZ2FpbiAobG93ZXIgZ2FpbiB0YWJsZSBpbmRleCksIGFuZCB2aWNlIHZlcnNlLgotICoKLSAqICAgICBUZW1wZXJhdHVyZSBhZmZlY3RzIGdhaW4gZGlmZmVyZW50bHkgZm9yIGRpZmZlcmVudCBjaGFubmVsczoKLSAqCi0gKiAgICAgMi40IEdIeiBhbGwgY2hhbm5lbHM6ICAzLjUgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCi0gKiAgICAgNSBHSHogY2hhbm5lbHMgMzQtNDM6ICA0LjUgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCi0gKiAgICAgNSBHSHogY2hhbm5lbHMgPj0gNDQ6ICA0LjAgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCi0gKgotICogICAgIE5PVEU6ICBUZW1wZXJhdHVyZSBjYW4gaW5jcmVhc2UgcmFwaWRseSB3aGVuIHRyYW5zbWl0dGluZywgZXNwZWNpYWxseQotICogICAgICAgICAgICB3aXRoIGhlYXZ5IHRyYWZmaWMgYXQgaGlnaCB0eHBvd2Vycy4gIERyaXZlciBzaG91bGQgdXBkYXRlCi0gKiAgICAgICAgICAgIHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9ucyBvZnRlbiB1bmRlciB0aGVzZSBjb25kaXRpb25zIHRvCi0gKiAgICAgICAgICAgIG1haW50YWluIHN0cm9uZyB0eHBvd2VyIGluIHRoZSBmYWNlIG9mIHJpc2luZyB0ZW1wZXJhdHVyZS4KLSAqCi0gKgotICogNykgIEZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgaW5kaWNhdG9yCi0gKiAgICAgKGZyb20gImluaXRpYWxpemUgYWxpdmUiKSBhbmQgZmFjdG9yeS1tZWFzdXJlZCBwb3dlciBzdXBwbHkgdm9sdGFnZQotICogICAgIGluZGljYXRvciAoRUVQUk9NKS4KLSAqCi0gKiAgICAgSWYgdGhlIGN1cnJlbnQgdm9sdGFnZSBpcyBoaWdoZXIgKGluZGljYXRvciBpcyBsb3dlcikgdGhhbiBmYWN0b3J5Ci0gKiAgICAgdm9sdGFnZSwgZ2FpbiBzaG91bGQgYmUgcmVkdWNlZCAoZ2FpbiB0YWJsZSBpbmRleCBpbmNyZWFzZWQpIGJ5OgotICoKLSAqICAgICAoZWVwcm9tIC0gY3VycmVudCkgLyA3Ci0gKgotICogICAgIElmIHRoZSBjdXJyZW50IHZvbHRhZ2UgaXMgbG93ZXIgKGluZGljYXRvciBpcyBoaWdoZXIpIHRoYW4gZmFjdG9yeQotICogICAgIHZvbHRhZ2UsIGdhaW4gc2hvdWxkIGJlIGluY3JlYXNlZCAoZ2FpbiB0YWJsZSBpbmRleCBkZWNyZWFzZWQpIGJ5OgotICoKLSAqICAgICAyICogKGN1cnJlbnQgLSBlZXByb20pIC8gNwotICoKLSAqICAgICBJZiBudW1iZXIgb2YgaW5kZXggc3RlcHMgaW4gZWl0aGVyIGRpcmVjdGlvbiB0dXJucyBvdXQgdG8gYmUgPiAyLAotICogICAgIHNvbWV0aGluZyBpcyB3cm9uZyAuLi4ganVzdCB1c2UgMC4KLSAqCi0gKiAgICAgTk9URTogIFZvbHRhZ2UgY29tcGVuc2F0aW9uIGlzIGluZGVwZW5kZW50IG9mIGJhbmQvY2hhbm5lbC4KLSAqCi0gKiAgICAgTk9URTogICJJbml0aWFsaXplIiB1Q29kZSBtZWFzdXJlcyBjdXJyZW50IHZvbHRhZ2UsIHdoaWNoIGlzIGFzc3VtZWQKLSAqICAgICAgICAgICAgdG8gYmUgY29uc3RhbnQgYWZ0ZXIgdGhpcyBpbml0aWFsIG1lYXN1cmVtZW50LiAgVm9sdGFnZQotICogICAgICAgICAgICBjb21wZW5zYXRpb24gZm9yIHR4cG93ZXIgKG51bWJlciBvZiBzdGVwcyBpbiBnYWluIHRhYmxlKQotICogICAgICAgICAgICBtYXkgYmUgY2FsY3VsYXRlZCBvbmNlIGFuZCB1c2VkIHVudGlsIHRoZSBuZXh0IHVDb2RlIGJvb3Rsb2FkLgotICoKLSAqCi0gKiA4KSAgSWYgc2V0dGluZyB1cCB0eHBvd2VycyBmb3IgTUlNTyByYXRlcyAocmF0ZSBpbmRleGVzIDgtMTUsIDI0LTMxKSwKLSAqICAgICBhZGp1c3QgdHhwb3dlciBmb3IgZWFjaCB0cmFuc21pdHRlciBjaGFpbiwgc28gdHhwb3dlciBpcyBiYWxhbmNlZAotICogICAgIGJldHdlZW4gdGhlIHR3byBjaGFpbnMuICBUaGVyZSBhcmUgNSBwYWlycyBvZiB0eF9hdHRlbltncm91cF1bY2hhaW5dCi0gKiAgICAgdmFsdWVzIGluICJpbml0aWFsaXplIGFsaXZlIiwgb25lIHBhaXIgZm9yIGVhY2ggb2YgNSBjaGFubmVsIHJhbmdlczoKLSAqCi0gKiAgICAgR3JvdXAgMDogIDUgR0h6IGNoYW5uZWwgMzQtNDMKLSAqICAgICBHcm91cCAxOiAgNSBHSHogY2hhbm5lbCA0NC03MAotICogICAgIEdyb3VwIDI6ICA1IEdIeiBjaGFubmVsIDcxLTEyNAotICogICAgIEdyb3VwIDM6ICA1IEdIeiBjaGFubmVsIDEyNS0yMDAKLSAqICAgICBHcm91cCA0OiAgMi40IEdIeiBhbGwgY2hhbm5lbHMKLSAqCi0gKiAgICAgQWRkIHRoZSB0eF9hdHRlbltncm91cF1bY2hhaW5dIHZhbHVlIHRvIHRoZSBpbmRleCBmb3IgdGhlIHRhcmdldCBjaGFpbi4KLSAqICAgICBUaGUgdmFsdWVzIGFyZSBzaWduZWQsIGJ1dCBhcmUgaW4gcGFpcnMgb2YgMCBhbmQgYSBub24tbmVnYXRpdmUgbnVtYmVyLAotICogICAgIHNvIGFzIHRvIHJlZHVjZSBnYWluIChpZiBuZWNlc3NhcnkpIG9mIHRoZSAiaG90dGVyIiBjaGFubmVsLiAgVGhpcwotICogICAgIGF2b2lkcyBhbnkgbmVlZCB0byBkb3VibGUtY2hlY2sgZm9yIHJlZ3VsYXRvcnkgY29tcGxpYW5jZSBhZnRlcgotICogICAgIHRoaXMgc3RlcC4KLSAqCi0gKgotICogOSkgIElmIHNldHRpbmcgdXAgZm9yIGEgQ0NLIHJhdGUsIGxvd2VyIHRoZSBnYWluIGJ5IGFkZGluZyBhIENDSyBjb21wZW5zYXRpb24KLSAqICAgICB2YWx1ZSB0byB0aGUgaW5kZXg6Ci0gKgotICogICAgIEhhcmR3YXJlIHJldiBCOiAgOSBzdGVwcyAoNC41IGRCKQotICogICAgIEhhcmR3YXJlIHJldiBDOiAgNSBzdGVwcyAoMi41IGRCKQotICoKLSAqICAgICBIYXJkd2FyZSByZXYgZm9yIDQ5NjUgY2FuIGJlIGRldGVybWluZWQgYnkgcmVhZGluZyBDU1JfSFdfUkVWX1dBX1JFRywKLSAqICAgICBiaXRzIFszOjJdLCAxID0gQiwgMiA9IEMuCi0gKgotICogICAgIE5PVEU6ICBUaGlzIGNvbXBlbnNhdGlvbiBpcyBpbiBhZGRpdGlvbiB0byBhbnkgc2F0dXJhdGlvbiBiYWNrb2ZmIHRoYXQKLSAqICAgICAgICAgICAgbWlnaHQgaGF2ZSBiZWVuIGFwcGxpZWQgaW4gYW4gZWFybGllciBzdGVwLgotICoKLSAqCi0gKiAxMCkgU2VsZWN0IHRoZSBnYWluIHRhYmxlLCBiYXNlZCBvbiBiYW5kICgyLjQgdnMgNSBHSHopLgotICoKLSAqICAgICBMaW1pdCB0aGUgYWRqdXN0ZWQgaW5kZXggdG8gc3RheSB3aXRoaW4gdGhlIHRhYmxlIQotICoKLSAqCi0gKiAxMSkgUmVhZCBnYWluIHRhYmxlIGVudHJpZXMgZm9yIERTUCBhbmQgcmFkaW8gZ2FpbiwgcGxhY2UgaW50byBhcHByb3ByaWF0ZQotICogICAgIGxvY2F0aW9uKHMpIGluIGNvbW1hbmQgKHN0cnVjdCBpd2w0OTY1X3R4cG93ZXJ0YWJsZV9jbWQpLgotICovCi0KLS8qKgotICogV2hlbiBNSU1PIGlzIHVzZWQgKDIgdHJhbnNtaXR0ZXJzIG9wZXJhdGluZyBzaW11bHRhbmVvdXNseSksIGRyaXZlciBzaG91bGQKLSAqIGxpbWl0IGVhY2ggdHJhbnNtaXR0ZXIgdG8gZGVsaXZlciBhIG1heCBvZiAzIGRCIGJlbG93IHRoZSByZWd1bGF0b3J5IGxpbWl0Ci0gKiBmb3IgdGhlIGRldmljZS4gIFRoYXQgaXMsIHVzZSBoYWxmIHBvd2VyIGZvciBlYWNoIHRyYW5zbWl0dGVyLCBzbyB0b3RhbAotICogdHhwb3dlciBpcyB3aXRoaW4gcmVndWxhdG9yeSBsaW1pdHMuCi0gKgotICogVGhlIHZhbHVlICI2IiByZXByZXNlbnRzIG51bWJlciBvZiBzdGVwcyBpbiBnYWluIHRhYmxlIHRvIHJlZHVjZSBwb3dlciAzIGRCLgotICogRWFjaCBzdGVwIGlzIDEvMiBkQi4KLSAqLwotI2RlZmluZSBJV0xfVFhfUE9XRVJfTUlNT19SRUdVTEFUT1JZX0NPTVBFTlNBVElPTiAoNikKLQotLyoqCi0gKiBDQ0sgZ2FpbiBjb21wZW5zYXRpb24uCi0gKgotICogV2hlbiBjYWxjdWxhdGluZyB0eHBvd2VycyBmb3IgQ0NLLCBhZnRlciBtYWtpbmcgc3VyZSB0aGF0IHRoZSB0YXJnZXQgcG93ZXIKLSAqIGlzIHdpdGhpbiByZWd1bGF0b3J5IGFuZCBzYXR1cmF0aW9uIGxpbWl0cywgZHJpdmVyIG11c3QgYWRkaXRpb25hbGx5Ci0gKiBiYWNrIG9mZiBnYWluIGJ5IGFkZGluZyB0aGVzZSB2YWx1ZXMgdG8gdGhlIGdhaW4gdGFibGUgaW5kZXguCi0gKgotICogSGFyZHdhcmUgcmV2IGZvciA0OTY1IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgQ1NSX0hXX1JFVl9XQV9SRUcsCi0gKiBiaXRzIFszOjJdLCAxID0gQiwgMiA9IEMuCi0gKi8KLSNkZWZpbmUgSVdMX1RYX1BPV0VSX0NDS19DT01QRU5TQVRJT05fQl9TVEVQICg5KQotI2RlZmluZSBJV0xfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9DX1NURVAgKDUpCi0KLS8qCi0gKiA0OTY1IHBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXBlbnNhdGlvbiBmb3IgdHhwb3dlcgotICovCi0jZGVmaW5lIFRYX1BPV0VSX0lXTF9WT0xUQUdFX0NPREVTX1BFUl8wM1YgICAoNykKLQotLyoqCi0gKiBHYWluIHRhYmxlcy4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHRhYmxlcyBjb250YWluIHBhaXIgb2YgdmFsdWVzIGZvciBzZXR0aW5nIHR4cG93ZXIsIGkuZS4KLSAqIGdhaW4gc2V0dGluZ3MgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIGRldmljZSdzIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciAoRFNQKSwKLSAqIGFuZCBmb3IgdGhlIGFuYWxvZyBnYWluIHN0cnVjdHVyZSBvZiB0aGUgdHJhbnNtaXR0ZXIuCi0gKgotICogRWFjaCBlbnRyeSBpbiB0aGUgZ2FpbiB0YWJsZXMgcmVwcmVzZW50cyBhIHN0ZXAgb2YgMS8yIGRCLiAgTm90ZSB0aGF0IHRoZXNlCi0gKiBhcmUgKnJlbGF0aXZlKiBzdGVwcywgbm90IGluZGljYXRpb25zIG9mIGFic29sdXRlIG91dHB1dCBwb3dlci4gIE91dHB1dAotICogcG93ZXIgdmFyaWVzIHdpdGggdGVtcGVyYXR1cmUsIHZvbHRhZ2UsIGFuZCBjaGFubmVsIGZyZXF1ZW5jeSwgYW5kIGFsc28KLSAqIHJlcXVpcmVzIGNvbnNpZGVyYXRpb24gb2YgYXZlcmFnZSBwb3dlciAodG8gc2F0aXNmeSByZWd1bGF0b3J5IGNvbnN0cmFpbnRzKSwKLSAqIGFuZCBwZWFrIHBvd2VyICh0byBhdm9pZCBkaXN0b3J0aW9uIG9mIHRoZSBvdXRwdXQgc2lnbmFsKS4KLSAqCi0gKiBFYWNoIGVudHJ5IGNvbnRhaW5zIHR3byB2YWx1ZXM6Ci0gKiAxKSAgRFNQIGdhaW4gKG9yIHNvbWV0aW1lcyBjYWxsZWQgRFNQIGF0dGVudWF0aW9uKS4gIFRoaXMgaXMgYSBmaW5lLWdyYWluZWQKLSAqICAgICBsaW5lYXIgdmFsdWUgdGhhdCBtdWx0aXBsaWVzIHRoZSBvdXRwdXQgb2YgdGhlIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciwKLSAqICAgICBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgYW5hbG9nIHJhZGlvLgotICogMikgIFJhZGlvIGdhaW4uICBUaGlzIHNldHMgdGhlIGFuYWxvZyBnYWluIG9mIHRoZSByYWRpbyBUeCBwYXRoLgotICogICAgIEl0IGlzIGEgY29hcnNlciBzZXR0aW5nLCBhbmQgYmVoYXZlcyBpbiBhIGxvZ2FyaXRobWljIChkQikgZmFzaGlvbi4KLSAqCi0gKiBFRVBST00gY29udGFpbnMgZmFjdG9yeSBjYWxpYnJhdGlvbiBkYXRhIGZvciB0eHBvd2VyLiAgVGhpcyBtYXBzIGFjdHVhbAotICogbWVhc3VyZWQgdHhwb3dlciBsZXZlbHMgdG8gZ2FpbiBzZXR0aW5ncyBpbiB0aGUgIndlbGwga25vd24iIHRhYmxlcwotICogYmVsb3cgKCJ3ZWxsLWtub3duIiBtZWFucyBoZXJlIHRoYXQgYm90aCBmYWN0b3J5IGNhbGlicmF0aW9uICphbmQqIHRoZQotICogZHJpdmVyIHdvcmsgd2l0aCB0aGUgc2FtZSB0YWJsZSkuCi0gKgotICogVGhlcmUgYXJlIHNlcGFyYXRlIHRhYmxlcyBmb3IgMi40IEdIeiBhbmQgNSBHSHogYmFuZHMuICBUaGUgNSBHSHogdGFibGUKLSAqIGhhcyBhbiBleHRlbnNpb24gKGludG8gbmVnYXRpdmUgaW5kZXhlcyksIGluIGNhc2UgdGhlIGRyaXZlciBuZWVkcyB0bwotICogYm9vc3QgcG93ZXIgc2V0dGluZyBmb3IgaGlnaCBkZXZpY2UgdGVtcGVyYXR1cmVzIChoaWdoZXIgdGhhbiB3b3VsZCBiZQotICogcHJlc2VudCBkdXJpbmcgZmFjdG9yeSBjYWxpYnJhdGlvbikuICBBIDUgR2h6IEVFUFJPTSBpbmRleCBvZiAiNDAiCi0gKiBjb3JyZXNwb25kcyB0byB0aGUgNDl0aCBlbnRyeSBpbiB0aGUgdGFibGUgdXNlZCBieSB0aGUgZHJpdmVyLgotICovCi0jZGVmaW5lIE1JTl9UWF9HQUlOX0lOREVYCQkoMCkgIC8qIGhpZ2hlc3QgZ2FpbiwgbG93ZXN0IGlkeCwgMi40ICovCi0jZGVmaW5lIE1JTl9UWF9HQUlOX0lOREVYXzUyR0haX0VYVAkoLTkpIC8qIGhpZ2hlc3QgZ2FpbiwgbG93ZXN0IGlkeCwgNSAqLwotCi0vKioKLSAqIDIuNCBHSHogZ2FpbiB0YWJsZQotICoKLSAqIEluZGV4ICAgIERzcCBnYWluICAgUmFkaW8gZ2FpbgotICogICAwICAgICAgICAxMTAgICAgICAgICAweDNmICAgICAgKGhpZ2hlc3QgZ2FpbikKLSAqICAgMSAgICAgICAgMTA0ICAgICAgICAgMHgzZgotICogICAyICAgICAgICAgOTggICAgICAgICAweDNmCi0gKiAgIDMgICAgICAgIDExMCAgICAgICAgIDB4M2UKLSAqICAgNCAgICAgICAgMTA0ICAgICAgICAgMHgzZQotICogICA1ICAgICAgICAgOTggICAgICAgICAweDNlCi0gKiAgIDYgICAgICAgIDExMCAgICAgICAgIDB4M2QKLSAqICAgNyAgICAgICAgMTA0ICAgICAgICAgMHgzZAotICogICA4ICAgICAgICAgOTggICAgICAgICAweDNkCi0gKiAgIDkgICAgICAgIDExMCAgICAgICAgIDB4M2MKLSAqICAxMCAgICAgICAgMTA0ICAgICAgICAgMHgzYwotICogIDExICAgICAgICAgOTggICAgICAgICAweDNjCi0gKiAgMTIgICAgICAgIDExMCAgICAgICAgIDB4M2IKLSAqICAxMyAgICAgICAgMTA0ICAgICAgICAgMHgzYgotICogIDE0ICAgICAgICAgOTggICAgICAgICAweDNiCi0gKiAgMTUgICAgICAgIDExMCAgICAgICAgIDB4M2EKLSAqICAxNiAgICAgICAgMTA0ICAgICAgICAgMHgzYQotICogIDE3ICAgICAgICAgOTggICAgICAgICAweDNhCi0gKiAgMTggICAgICAgIDExMCAgICAgICAgIDB4MzkKLSAqICAxOSAgICAgICAgMTA0ICAgICAgICAgMHgzOQotICogIDIwICAgICAgICAgOTggICAgICAgICAweDM5Ci0gKiAgMjEgICAgICAgIDExMCAgICAgICAgIDB4MzgKLSAqICAyMiAgICAgICAgMTA0ICAgICAgICAgMHgzOAotICogIDIzICAgICAgICAgOTggICAgICAgICAweDM4Ci0gKiAgMjQgICAgICAgIDExMCAgICAgICAgIDB4MzcKLSAqICAyNSAgICAgICAgMTA0ICAgICAgICAgMHgzNwotICogIDI2ICAgICAgICAgOTggICAgICAgICAweDM3Ci0gKiAgMjcgICAgICAgIDExMCAgICAgICAgIDB4MzYKLSAqICAyOCAgICAgICAgMTA0ICAgICAgICAgMHgzNgotICogIDI5ICAgICAgICAgOTggICAgICAgICAweDM2Ci0gKiAgMzAgICAgICAgIDExMCAgICAgICAgIDB4MzUKLSAqICAzMSAgICAgICAgMTA0ICAgICAgICAgMHgzNQotICogIDMyICAgICAgICAgOTggICAgICAgICAweDM1Ci0gKiAgMzMgICAgICAgIDExMCAgICAgICAgIDB4MzQKLSAqICAzNCAgICAgICAgMTA0ICAgICAgICAgMHgzNAotICogIDM1ICAgICAgICAgOTggICAgICAgICAweDM0Ci0gKiAgMzYgICAgICAgIDExMCAgICAgICAgIDB4MzMKLSAqICAzNyAgICAgICAgMTA0ICAgICAgICAgMHgzMwotICogIDM4ICAgICAgICAgOTggICAgICAgICAweDMzCi0gKiAgMzkgICAgICAgIDExMCAgICAgICAgIDB4MzIKLSAqICA0MCAgICAgICAgMTA0ICAgICAgICAgMHgzMgotICogIDQxICAgICAgICAgOTggICAgICAgICAweDMyCi0gKiAgNDIgICAgICAgIDExMCAgICAgICAgIDB4MzEKLSAqICA0MyAgICAgICAgMTA0ICAgICAgICAgMHgzMQotICogIDQ0ICAgICAgICAgOTggICAgICAgICAweDMxCi0gKiAgNDUgICAgICAgIDExMCAgICAgICAgIDB4MzAKLSAqICA0NiAgICAgICAgMTA0ICAgICAgICAgMHgzMAotICogIDQ3ICAgICAgICAgOTggICAgICAgICAweDMwCi0gKiAgNDggICAgICAgIDExMCAgICAgICAgICAweDYKLSAqICA0OSAgICAgICAgMTA0ICAgICAgICAgIDB4NgotICogIDUwICAgICAgICAgOTggICAgICAgICAgMHg2Ci0gKiAgNTEgICAgICAgIDExMCAgICAgICAgICAweDUKLSAqICA1MiAgICAgICAgMTA0ICAgICAgICAgIDB4NQotICogIDUzICAgICAgICAgOTggICAgICAgICAgMHg1Ci0gKiAgNTQgICAgICAgIDExMCAgICAgICAgICAweDQKLSAqICA1NSAgICAgICAgMTA0ICAgICAgICAgIDB4NAotICogIDU2ICAgICAgICAgOTggICAgICAgICAgMHg0Ci0gKiAgNTcgICAgICAgIDExMCAgICAgICAgICAweDMKLSAqICA1OCAgICAgICAgMTA0ICAgICAgICAgIDB4MwotICogIDU5ICAgICAgICAgOTggICAgICAgICAgMHgzCi0gKiAgNjAgICAgICAgIDExMCAgICAgICAgICAweDIKLSAqICA2MSAgICAgICAgMTA0ICAgICAgICAgIDB4MgotICogIDYyICAgICAgICAgOTggICAgICAgICAgMHgyCi0gKiAgNjMgICAgICAgIDExMCAgICAgICAgICAweDEKLSAqICA2NCAgICAgICAgMTA0ICAgICAgICAgIDB4MQotICogIDY1ICAgICAgICAgOTggICAgICAgICAgMHgxCi0gKiAgNjYgICAgICAgIDExMCAgICAgICAgICAweDAKLSAqICA2NyAgICAgICAgMTA0ICAgICAgICAgIDB4MAotICogIDY4ICAgICAgICAgOTggICAgICAgICAgMHgwCi0gKiAgNjkgICAgICAgICA5NyAgICAgICAgICAgIDAKLSAqICA3MCAgICAgICAgIDk2ICAgICAgICAgICAgMAotICogIDcxICAgICAgICAgOTUgICAgICAgICAgICAwCi0gKiAgNzIgICAgICAgICA5NCAgICAgICAgICAgIDAKLSAqICA3MyAgICAgICAgIDkzICAgICAgICAgICAgMAotICogIDc0ICAgICAgICAgOTIgICAgICAgICAgICAwCi0gKiAgNzUgICAgICAgICA5MSAgICAgICAgICAgIDAKLSAqICA3NiAgICAgICAgIDkwICAgICAgICAgICAgMAotICogIDc3ICAgICAgICAgODkgICAgICAgICAgICAwCi0gKiAgNzggICAgICAgICA4OCAgICAgICAgICAgIDAKLSAqICA3OSAgICAgICAgIDg3ICAgICAgICAgICAgMAotICogIDgwICAgICAgICAgODYgICAgICAgICAgICAwCi0gKiAgODEgICAgICAgICA4NSAgICAgICAgICAgIDAKLSAqICA4MiAgICAgICAgIDg0ICAgICAgICAgICAgMAotICogIDgzICAgICAgICAgODMgICAgICAgICAgICAwCi0gKiAgODQgICAgICAgICA4MiAgICAgICAgICAgIDAKLSAqICA4NSAgICAgICAgIDgxICAgICAgICAgICAgMAotICogIDg2ICAgICAgICAgODAgICAgICAgICAgICAwCi0gKiAgODcgICAgICAgICA3OSAgICAgICAgICAgIDAKLSAqICA4OCAgICAgICAgIDc4ICAgICAgICAgICAgMAotICogIDg5ICAgICAgICAgNzcgICAgICAgICAgICAwCi0gKiAgOTAgICAgICAgICA3NiAgICAgICAgICAgIDAKLSAqICA5MSAgICAgICAgIDc1ICAgICAgICAgICAgMAotICogIDkyICAgICAgICAgNzQgICAgICAgICAgICAwCi0gKiAgOTMgICAgICAgICA3MyAgICAgICAgICAgIDAKLSAqICA5NCAgICAgICAgIDcyICAgICAgICAgICAgMAotICogIDk1ICAgICAgICAgNzEgICAgICAgICAgICAwCi0gKiAgOTYgICAgICAgICA3MCAgICAgICAgICAgIDAKLSAqICA5NyAgICAgICAgIDY5ICAgICAgICAgICAgMAotICogIDk4ICAgICAgICAgNjggICAgICAgICAgICAwCi0gKi8KLQotLyoqCi0gKiA1IEdIeiBnYWluIHRhYmxlCi0gKgotICogSW5kZXggICAgRHNwIGdhaW4gICBSYWRpbyBnYWluCi0gKiAgLTkgCSAgICAgIDEyMyAgICAgICAgIDB4M0YgICAgICAoaGlnaGVzdCBnYWluKQotICogIC04IAkgICAgICAxMTcgICAgICAgICAweDNGCi0gKiAgLTcgICAgICAgIDExMCAgICAgICAgIDB4M0YKLSAqICAtNiAgICAgICAgMTA0ICAgICAgICAgMHgzRgotICogIC01ICAgICAgICAgOTggICAgICAgICAweDNGCi0gKiAgLTQgICAgICAgIDExMCAgICAgICAgIDB4M0UKLSAqICAtMyAgICAgICAgMTA0ICAgICAgICAgMHgzRQotICogIC0yICAgICAgICAgOTggICAgICAgICAweDNFCi0gKiAgLTEgICAgICAgIDExMCAgICAgICAgIDB4M0QKLSAqICAgMCAgICAgICAgMTA0ICAgICAgICAgMHgzRAotICogICAxICAgICAgICAgOTggICAgICAgICAweDNECi0gKiAgIDIgICAgICAgIDExMCAgICAgICAgIDB4M0MKLSAqICAgMyAgICAgICAgMTA0ICAgICAgICAgMHgzQwotICogICA0ICAgICAgICAgOTggICAgICAgICAweDNDCi0gKiAgIDUgICAgICAgIDExMCAgICAgICAgIDB4M0IKLSAqICAgNiAgICAgICAgMTA0ICAgICAgICAgMHgzQgotICogICA3ICAgICAgICAgOTggICAgICAgICAweDNCCi0gKiAgIDggICAgICAgIDExMCAgICAgICAgIDB4M0EKLSAqICAgOSAgICAgICAgMTA0ICAgICAgICAgMHgzQQotICogIDEwICAgICAgICAgOTggICAgICAgICAweDNBCi0gKiAgMTEgICAgICAgIDExMCAgICAgICAgIDB4MzkKLSAqICAxMiAgICAgICAgMTA0ICAgICAgICAgMHgzOQotICogIDEzICAgICAgICAgOTggICAgICAgICAweDM5Ci0gKiAgMTQgICAgICAgIDExMCAgICAgICAgIDB4MzgKLSAqICAxNSAgICAgICAgMTA0ICAgICAgICAgMHgzOAotICogIDE2ICAgICAgICAgOTggICAgICAgICAweDM4Ci0gKiAgMTcgICAgICAgIDExMCAgICAgICAgIDB4MzcKLSAqICAxOCAgICAgICAgMTA0ICAgICAgICAgMHgzNwotICogIDE5ICAgICAgICAgOTggICAgICAgICAweDM3Ci0gKiAgMjAgICAgICAgIDExMCAgICAgICAgIDB4MzYKLSAqICAyMSAgICAgICAgMTA0ICAgICAgICAgMHgzNgotICogIDIyICAgICAgICAgOTggICAgICAgICAweDM2Ci0gKiAgMjMgICAgICAgIDExMCAgICAgICAgIDB4MzUKLSAqICAyNCAgICAgICAgMTA0ICAgICAgICAgMHgzNQotICogIDI1ICAgICAgICAgOTggICAgICAgICAweDM1Ci0gKiAgMjYgICAgICAgIDExMCAgICAgICAgIDB4MzQKLSAqICAyNyAgICAgICAgMTA0ICAgICAgICAgMHgzNAotICogIDI4ICAgICAgICAgOTggICAgICAgICAweDM0Ci0gKiAgMjkgICAgICAgIDExMCAgICAgICAgIDB4MzMKLSAqICAzMCAgICAgICAgMTA0ICAgICAgICAgMHgzMwotICogIDMxICAgICAgICAgOTggICAgICAgICAweDMzCi0gKiAgMzIgICAgICAgIDExMCAgICAgICAgIDB4MzIKLSAqICAzMyAgICAgICAgMTA0ICAgICAgICAgMHgzMgotICogIDM0ICAgICAgICAgOTggICAgICAgICAweDMyCi0gKiAgMzUgICAgICAgIDExMCAgICAgICAgIDB4MzEKLSAqICAzNiAgICAgICAgMTA0ICAgICAgICAgMHgzMQotICogIDM3ICAgICAgICAgOTggICAgICAgICAweDMxCi0gKiAgMzggICAgICAgIDExMCAgICAgICAgIDB4MzAKLSAqICAzOSAgICAgICAgMTA0ICAgICAgICAgMHgzMAotICogIDQwICAgICAgICAgOTggICAgICAgICAweDMwCi0gKiAgNDEgICAgICAgIDExMCAgICAgICAgIDB4MjUKLSAqICA0MiAgICAgICAgMTA0ICAgICAgICAgMHgyNQotICogIDQzICAgICAgICAgOTggICAgICAgICAweDI1Ci0gKiAgNDQgICAgICAgIDExMCAgICAgICAgIDB4MjQKLSAqICA0NSAgICAgICAgMTA0ICAgICAgICAgMHgyNAotICogIDQ2ICAgICAgICAgOTggICAgICAgICAweDI0Ci0gKiAgNDcgICAgICAgIDExMCAgICAgICAgIDB4MjMKLSAqICA0OCAgICAgICAgMTA0ICAgICAgICAgMHgyMwotICogIDQ5ICAgICAgICAgOTggICAgICAgICAweDIzCi0gKiAgNTAgICAgICAgIDExMCAgICAgICAgIDB4MjIKLSAqICA1MSAgICAgICAgMTA0ICAgICAgICAgMHgxOAotICogIDUyICAgICAgICAgOTggICAgICAgICAweDE4Ci0gKiAgNTMgICAgICAgIDExMCAgICAgICAgIDB4MTcKLSAqICA1NCAgICAgICAgMTA0ICAgICAgICAgMHgxNwotICogIDU1ICAgICAgICAgOTggICAgICAgICAweDE3Ci0gKiAgNTYgICAgICAgIDExMCAgICAgICAgIDB4MTYKLSAqICA1NyAgICAgICAgMTA0ICAgICAgICAgMHgxNgotICogIDU4ICAgICAgICAgOTggICAgICAgICAweDE2Ci0gKiAgNTkgICAgICAgIDExMCAgICAgICAgIDB4MTUKLSAqICA2MCAgICAgICAgMTA0ICAgICAgICAgMHgxNQotICogIDYxICAgICAgICAgOTggICAgICAgICAweDE1Ci0gKiAgNjIgICAgICAgIDExMCAgICAgICAgIDB4MTQKLSAqICA2MyAgICAgICAgMTA0ICAgICAgICAgMHgxNAotICogIDY0ICAgICAgICAgOTggICAgICAgICAweDE0Ci0gKiAgNjUgICAgICAgIDExMCAgICAgICAgIDB4MTMKLSAqICA2NiAgICAgICAgMTA0ICAgICAgICAgMHgxMwotICogIDY3ICAgICAgICAgOTggICAgICAgICAweDEzCi0gKiAgNjggICAgICAgIDExMCAgICAgICAgIDB4MTIKLSAqICA2OSAgICAgICAgMTA0ICAgICAgICAgMHgwOAotICogIDcwICAgICAgICAgOTggICAgICAgICAweDA4Ci0gKiAgNzEgICAgICAgIDExMCAgICAgICAgIDB4MDcKLSAqICA3MiAgICAgICAgMTA0ICAgICAgICAgMHgwNwotICogIDczICAgICAgICAgOTggICAgICAgICAweDA3Ci0gKiAgNzQgICAgICAgIDExMCAgICAgICAgIDB4MDYKLSAqICA3NSAgICAgICAgMTA0ICAgICAgICAgMHgwNgotICogIDc2ICAgICAgICAgOTggICAgICAgICAweDA2Ci0gKiAgNzcgICAgICAgIDExMCAgICAgICAgIDB4MDUKLSAqICA3OCAgICAgICAgMTA0ICAgICAgICAgMHgwNQotICogIDc5ICAgICAgICAgOTggICAgICAgICAweDA1Ci0gKiAgODAgICAgICAgIDExMCAgICAgICAgIDB4MDQKLSAqICA4MSAgICAgICAgMTA0ICAgICAgICAgMHgwNAotICogIDgyICAgICAgICAgOTggICAgICAgICAweDA0Ci0gKiAgODMgICAgICAgIDExMCAgICAgICAgIDB4MDMKLSAqICA4NCAgICAgICAgMTA0ICAgICAgICAgMHgwMwotICogIDg1ICAgICAgICAgOTggICAgICAgICAweDAzCi0gKiAgODYgICAgICAgIDExMCAgICAgICAgIDB4MDIKLSAqICA4NyAgICAgICAgMTA0ICAgICAgICAgMHgwMgotICogIDg4ICAgICAgICAgOTggICAgICAgICAweDAyCi0gKiAgODkgICAgICAgIDExMCAgICAgICAgIDB4MDEKLSAqICA5MCAgICAgICAgMTA0ICAgICAgICAgMHgwMQotICogIDkxICAgICAgICAgOTggICAgICAgICAweDAxCi0gKiAgOTIgICAgICAgIDExMCAgICAgICAgIDB4MDAKLSAqICA5MyAgICAgICAgMTA0ICAgICAgICAgMHgwMAotICogIDk0ICAgICAgICAgOTggICAgICAgICAweDAwCi0gKiAgOTUgICAgICAgICA5MyAgICAgICAgIDB4MDAKLSAqICA5NiAgICAgICAgIDg4ICAgICAgICAgMHgwMAotICogIDk3ICAgICAgICAgODMgICAgICAgICAweDAwCi0gKiAgOTggICAgICAgICA3OCAgICAgICAgIDB4MDAKLSAqLwotCi0KLS8qKgotICogU2FuaXR5IGNoZWNrcyBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIEVFUFJPTSByZWd1bGF0b3J5IGxldmVscy4KLSAqIElmIEVFUFJPTSB2YWx1ZXMgZmFsbCBvdXRzaWRlIE1JTi9NQVggcmFuZ2UsIHVzZSBkZWZhdWx0IHZhbHVlcy4KLSAqCi0gKiBSZWd1bGF0b3J5IGxpbWl0cyByZWZlciB0byB0aGUgbWF4aW11bSBhdmVyYWdlIHR4cG93ZXIgYWxsb3dlZCBieQotICogcmVndWxhdG9yeSBhZ2VuY2llcyBpbiB0aGUgZ2VvZ3JhcGhpZXMgaW4gd2hpY2ggdGhlIGRldmljZSBpcyBtZWFudAotICogdG8gYmUgb3BlcmF0ZWQuICBUaGVzZSBsaW1pdHMgYXJlIFNLVS1zcGVjaWZpYyAoaS5lLiBnZW9ncmFwaHktc3BlY2lmaWMpLAotICogYW5kIGNoYW5uZWwtc3BlY2lmaWM7IGVhY2ggY2hhbm5lbCBoYXMgYW4gaW5kaXZpZHVhbCByZWd1bGF0b3J5IGxpbWl0Ci0gKiBsaXN0ZWQgaW4gdGhlIEVFUFJPTS4KLSAqCi0gKiBVbml0cyBhcmUgaW4gaGFsZi1kQm0gKGkuZS4gIjM0IiBtZWFucyAxNyBkQm0pLgotICovCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfMjQgICAoMzQpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfNTIgICAoMzQpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9SRUdVTEFUT1JZX01JTiAgICAgICAgICAoMCkKLSNkZWZpbmUgSVdMX1RYX1BPV0VSX1JFR1VMQVRPUllfTUFYICAgICAgICAgICgzNCkKLQotLyoqCi0gKiBTYW5pdHkgY2hlY2tzIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgRUVQUk9NIHNhdHVyYXRpb24gbGV2ZWxzLgotICogSWYgRUVQUk9NIHZhbHVlcyBmYWxsIG91dHNpZGUgTUlOL01BWCByYW5nZSwgdXNlIGRlZmF1bHQgdmFsdWVzLgotICoKLSAqIFNhdHVyYXRpb24gaXMgdGhlIGhpZ2hlc3QgbGV2ZWwgdGhhdCB0aGUgb3V0cHV0IHBvd2VyIGFtcGxpZmllciBjYW4gcHJvZHVjZQotICogd2l0aG91dCBzaWduaWZpY2FudCBjbGlwcGluZyBkaXN0b3J0aW9uLiAgVGhpcyBpcyBhICJwZWFrIiBwb3dlciBsZXZlbC4KLSAqIERpZmZlcmVudCB0eXBlcyBvZiBtb2R1bGF0aW9uIChpLmUuIHZhcmlvdXMgInJhdGVzIiwgYW5kIE9GRE0gdnMuIENDSykKLSAqIHJlcXVpcmUgZGlmZmVyaW5nIGFtb3VudHMgb2YgYmFja29mZiwgcmVsYXRpdmUgdG8gdGhlaXIgYXZlcmFnZSBwb3dlciBvdXRwdXQsCi0gKiBpbiBvcmRlciB0byBhdm9pZCBjbGlwcGluZyBkaXN0b3J0aW9uLgotICoKLSAqIERyaXZlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHZpb2xhdGluZyBuZWl0aGVyIHRoZSBzYXR1cmF0aW9uIGxpbWl0LAotICogbm9yIHRoZSByZWd1bGF0b3J5IGxpbWl0LCB3aGVuIGNhbGN1bGF0aW5nIFR4IHBvd2VyIHNldHRpbmdzIGZvciB2YXJpb3VzCi0gKiByYXRlcy4KLSAqCi0gKiBVbml0cyBhcmUgaW4gaGFsZi1kQm0gKGkuZS4gIjM4IiBtZWFucyAxOSBkQm0pLgotICovCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fMjQgICAoMzgpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fNTIgICAoMzgpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01JTiAgICAgICAgICAoMjApCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01BWCAgICAgICAgICAoNTApCi0KLS8qKgotICogQ2hhbm5lbCBncm91cHMgdXNlZCBmb3IgVHggQXR0ZW51YXRpb24gY2FsaWJyYXRpb24gKE1JTU8gdHggY2hhbm5lbCBiYWxhbmNlKQotICogYW5kIHRoZXJtYWwgVHhwb3dlciBjYWxpYnJhdGlvbi4KLSAqCi0gKiBXaGVuIGNhbGN1bGF0aW5nIHR4cG93ZXIsIGRyaXZlciBtdXN0IGNvbXBlbnNhdGUgZm9yIGN1cnJlbnQgZGV2aWNlCi0gKiB0ZW1wZXJhdHVyZTsgaGlnaGVyIHRlbXBlcmF0dXJlIHJlcXVpcmVzIGhpZ2hlciBnYWluLiAgRHJpdmVyIG11c3QgY2FsY3VsYXRlCi0gKiBjdXJyZW50IHRlbXBlcmF0dXJlIChzZWUgIjQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24iKSwgdGhlbiBjb21wYXJlIHZzLgotICogZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSBpbiBFRVBST007IGlmIGN1cnJlbnQgdGVtcGVyYXR1cmUgaXMgaGlnaGVyCi0gKiB0aGFuIGZhY3RvcnkgdGVtcGVyYXR1cmUsIGRyaXZlciBtdXN0ICppbmNyZWFzZSogZ2FpbiBieSBwcm9wb3J0aW9ucyBzaG93bgotICogaW4gdGFibGUgYmVsb3cuICBJZiBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIGxvd2VyIHRoYW4gZmFjdG9yeSwgZHJpdmVyIG11c3QKLSAqICpkZWNyZWFzZSogZ2Fpbi4KLSAqCi0gKiBEaWZmZXJlbnQgZnJlcXVlbmN5IHJhbmdlcyByZXF1aXJlIGRpZmZlcmVudCBjb21wZW5zYXRpb24sIGFzIHNob3duIGJlbG93LgotICovCi0vKiBHcm91cCAwLCA1LjIgR0h6IGNoIDM0LTQzOiAgNC41IGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSMV9GQ0ggMzQKLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSMV9MQ0ggNDMKLQotLyogR3JvdXAgMSwgNS4zIEdIeiBjaCA0NC03MDogIDQuMCBkZWdyZWVzIHBlciAxLzIgZEIuICovCi0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjJfRkNIIDQ0Ci0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjJfTENIIDcwCi0KLS8qIEdyb3VwIDIsIDUuNSBHSHogY2ggNzEtMTI0OiAgNC4wIGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSM19GQ0ggNzEKLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSM19MQ0ggMTI0Ci0KLS8qIEdyb3VwIDMsIDUuNyBHSHogY2ggMTI1LTIwMDogIDQuMCBkZWdyZWVzIHBlciAxLzIgZEIuICovCi0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjRfRkNIIDEyNQotI2RlZmluZSBDQUxJQl9JV0xfVFhfQVRURU5fR1I0X0xDSCAyMDAKLQotLyogR3JvdXAgNCwgMi40IEdIeiBhbGwgY2hhbm5lbHM6ICAzLjUgZGVncmVlcyBwZXIgMS8yIGRCLiAqLwotI2RlZmluZSBDQUxJQl9JV0xfVFhfQVRURU5fR1I1X0ZDSCAxCi0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjVfTENIIDIwCi0KLWVudW0gewotCUNBTElCX0NIX0dST1VQXzEgPSAwLAotCUNBTElCX0NIX0dST1VQXzIgPSAxLAotCUNBTElCX0NIX0dST1VQXzMgPSAyLAotCUNBTElCX0NIX0dST1VQXzQgPSAzLAotCUNBTElCX0NIX0dST1VQXzUgPSA0LAotCUNBTElCX0NIX0dST1VQX01BWAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiBFTkQgVFhQT1dFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioKLSAqIFR4L1J4IFF1ZXVlcwotICoKLSAqIE1vc3QgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGRyaXZlciBhbmQgNDk2NSBpcyB2aWEgcXVldWVzIG9mIGRhdGEgYnVmZmVycy4KLSAqIEZvciBleGFtcGxlLCBhbGwgY29tbWFuZHMgdGhhdCB0aGUgZHJpdmVyIGlzc3VlcyB0byBkZXZpY2UncyBlbWJlZGRlZAotICogY29udHJvbGxlciAodUNvZGUpIGFyZSB2aWEgdGhlIGNvbW1hbmQgcXVldWUgKG9uZSBvZiB0aGUgVHggcXVldWVzKS4gIEFsbAotICogdUNvZGUgY29tbWFuZCByZXNwb25zZXMvcmVwbGllcy9ub3RpZmljYXRpb25zLCBpbmNsdWRpbmcgUnggZnJhbWVzLCBhcmUKLSAqIGNvbnZleWVkIGZyb20gdUNvZGUgdG8gZHJpdmVyIHZpYSB0aGUgUnggcXVldWUuCi0gKgotICogTW9zdCBzdXBwb3J0IGZvciB0aGVzZSBxdWV1ZXMsIGluY2x1ZGluZyBoYW5kc2hha2Ugc3VwcG9ydCwgcmVzaWRlcyBpbgotICogc3RydWN0dXJlcyBpbiBob3N0IERSQU0sIHNoYXJlZCBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIHRoZSBkZXZpY2UuICBXaGVuCi0gKiBhbGxvY2F0aW5nIHRoaXMgbWVtb3J5LCB0aGUgZHJpdmVyIG11c3QgbWFrZSBzdXJlIHRoYXQgZGF0YSB3cml0dGVuIGJ5Ci0gKiB0aGUgaG9zdCBDUFUgdXBkYXRlcyBEUkFNIGltbWVkaWF0ZWx5IChhbmQgZG9lcyBub3QgZ2V0ICJzdHVjayIgaW4gQ1BVJ3MKLSAqIGNhY2hlIG1lbW9yeSksIHNvIERSQU0gYW5kIGNhY2hlIGFyZSBjb25zaXN0ZW50LCBhbmQgdGhlIGRldmljZSBjYW4KLSAqIGltbWVkaWF0ZWx5IHNlZSBjaGFuZ2VzIG1hZGUgYnkgdGhlIGRyaXZlci4KLSAqCi0gKiA0OTY1IHN1cHBvcnRzIHVwIHRvIDE2IERSQU0tYmFzZWQgVHggcXVldWVzLCBhbmQgc2VydmljZXMgdGhlc2UgcXVldWVzIHZpYQotICogdXAgdG8gNyBETUEgY2hhbm5lbHMgKEZJRk9zKS4gIEVhY2ggVHggcXVldWUgaXMgc3VwcG9ydGVkIGJ5IGEgY2lyY3VsYXIgYXJyYXkKLSAqIGluIERSQU0gY29udGFpbmluZyAyNTYgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvcnMgKFRGRHMpLgotICovCi0jZGVmaW5lIElXTDQ5X05VTV9GSUZPUyAJNwotI2RlZmluZSBJV0w0OV9DTURfRklGT19OVU0JNAotI2RlZmluZSBJV0w0OV9OVU1fUVVFVUVTCTE2Ci0jZGVmaW5lIElXTDQ5X05VTV9BTVBEVV9RVUVVRVMJOAotCi0KLS8qKgotICogc3RydWN0IGl3bDQ5NjVfc2NoZWRxX2JjX3RibAotICoKLSAqIEJ5dGUgQ291bnQgdGFibGUKLSAqCi0gKiBFYWNoIFR4IHF1ZXVlIHVzZXMgYSBieXRlLWNvdW50IHRhYmxlIGNvbnRhaW5pbmcgMzIwIGVudHJpZXM6Ci0gKiBvbmUgMTYtYml0IGVudHJ5IGZvciBlYWNoIG9mIDI1NiBURkRzLCBwbHVzIGFuIGFkZGl0aW9uYWwgNjQgZW50cmllcyB0aGF0Ci0gKiBkdXBsaWNhdGUgdGhlIGZpcnN0IDY0IGVudHJpZXMgKHRvIGF2b2lkIHdyYXAtYXJvdW5kIHdpdGhpbiBhIFR4IHdpbmRvdzsKLSAqIG1heCBUeCB3aW5kb3cgaXMgNjQgVEZEcykuCi0gKgotICogV2hlbiBkcml2ZXIgc2V0cyB1cCBhIG5ldyBURkQsIGl0IG11c3QgYWxzbyBlbnRlciB0aGUgdG90YWwgYnl0ZSBjb3VudAotICogb2YgdGhlIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIGJ5dGUKLSAqIGNvdW50IHRhYmxlIGZvciB0aGUgY2hvc2VuIFR4IHF1ZXVlLiAgSWYgdGhlIFRGRCBpbmRleCBpcyAwLTYzLCB0aGUgZHJpdmVyCi0gKiBtdXN0IGR1cGxpY2F0ZSB0aGUgYnl0ZSBjb3VudCBlbnRyeSBpbiBjb3JyZXNwb25kaW5nIGluZGV4IDI1Ni0zMTkuCi0gKgotICogcGFkZGluZyBwdXRzIGVhY2ggYnl0ZSBjb3VudCB0YWJsZSBvbiBhIDEwMjQtYnl0ZSBib3VuZGFyeTsKLSAqIDQ5NjUgYXNzdW1lcyB0YWJsZXMgYXJlIHNlcGFyYXRlZCBieSAxMDI0IGJ5dGVzLgotICovCi1zdHJ1Y3QgaXdsNDk2NV9zY2RfYmNfdGJsIHsKLQlfX2xlMTYgdGZkX29mZnNldFtURkRfUVVFVUVfQkNfU0laRV07Ci0JdTggcGFkWzEwMjQgLSAoVEZEX1FVRVVFX0JDX1NJWkUpICogc2l6ZW9mKF9fbGUxNildOwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIElXTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQJCSgweDAwMDAwMCkKLQotLyogUlNTSSB0byBkQm0gKi8KLSNkZWZpbmUgSVdMNDk2NV9SU1NJX09GRlNFVAk0NAotCi0vKiBQQ0kgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBDSV9DRkdfUkVUUllfVElNRU9VVAkweDA0MQotCi0vKiBQQ0kgcmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMFNfRU4JMHgwMQotI2RlZmluZSBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4JMHgwMgotCi0jZGVmaW5lIElXTDQ5NjVfREVGQVVMVF9UWF9SRVRSWSAgMTUKLQotLyogRUVQUk9NICovCi0jZGVmaW5lIElXTDQ5NjVfRklSU1RfQU1QRFVfUVVFVUUJMTAKLQotCi0jZW5kaWYgLyogIV9faXdsXzQ5NjVfaHdfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODYyZmRjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtbGVkLmgiCi0KLS8qIFNlbmQgbGVkIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQKLWl3bDQ5NjVfc2VuZF9sZWRfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9sZWRfY21kICpsZWRfY21kKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9MRURTX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX2xlZF9jbWQpLAotCQkuZGF0YSA9IGxlZF9jbWQsCi0JCS5mbGFncyA9IENNRF9BU1lOQywKLQkJLmNhbGxiYWNrID0gTlVMTCwKLQl9OwotCXUzMiByZWc7Ci0KLQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9MRURfUkVHKTsKLQlpZiAocmVnICE9IChyZWcgJiBDU1JfTEVEX0JTTV9DVFJMX01TSykpCi0JCWl3bF93cml0ZTMyKHByaXYsIENTUl9MRURfUkVHLCByZWcgJiBDU1JfTEVEX0JTTV9DVFJMX01TSyk7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZChwcml2LCAmY21kKTsKLX0KLQotLyogU2V0IGxlZCByZWdpc3RlciBvZmYgKi8KLXZvaWQgaXdsNDk2NV9sZWRfZW5hYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfTEVEX1JFRywgQ1NSX0xFRF9SRUdfVFJVTl9PTik7Ci19Ci0KLWNvbnN0IHN0cnVjdCBpd2xfbGVkX29wcyBpd2w0OTY1X2xlZF9vcHMgPSB7Ci0JLmNtZCA9IGl3bDQ5NjVfc2VuZF9sZWRfY21kLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDM2MTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF80OTY1X2xlZF9oX18KLSNkZWZpbmUgX19pd2xfNDk2NV9sZWRfaF9fCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2xlZF9vcHMgaXdsNDk2NV9sZWRfb3BzOwotdm9pZCBpd2w0OTY1X2xlZF9lbmFibGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotI2VuZGlmIC8qIF9faXdsXzQ5NjVfbGVkX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlNmQ5ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYworKysgL2Rldi9udWxsCkBAIC0xLDExOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtaHcuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLQotdm9pZCBpd2w0OTY1X2NoZWNrX2Fib3J0X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgdTggZnJhbWVfY291bnQsIHUzMiBzdGF0dXMpCi17Ci0JaWYgKGZyYW1lX2NvdW50ID09IDEgJiYgc3RhdHVzID09IFRYX1NUQVRVU19GQUlMX1JGS0lMTF9GTFVTSCkgewotCQlJV0xfRVJSKHByaXYsICJUeCBmbHVzaCBjb21tYW5kIHRvIGZsdXNoIG91dCBhbGwgZnJhbWVzXG4iKTsKLQkJaWYgKCF0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dHhfZmx1c2gpOwotCX0KLX0KLQotLyoKLSAqIEVFUFJPTQotICovCi1zdHJ1Y3QgaXdsX21vZF9wYXJhbXMgaXdsNDk2NV9tb2RfcGFyYW1zID0gewotCS5hbXNkdV9zaXplXzhLID0gMSwKLQkucmVzdGFydF9mdyA9IDEsCi0JLyogdGhlIHJlc3QgYXJlIDAgYnkgZGVmYXVsdCAqLwotfTsKLQotdm9pZCBpd2w0OTY1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X2ZyZWUpOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X3VzZWQpOwotCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspIHsKLQkJLyogSW4gdGhlIHJlc2V0IGZ1bmN0aW9uLCB0aGVzZSBidWZmZXJzIG1heSBoYXZlIGJlZW4gYWxsb2NhdGVkCi0JCSAqIHRvIGFuIFNLQiwgc28gd2UgbmVlZCB0byB1bm1hcCBhbmQgZnJlZSBwb3RlbnRpYWwgc3RvcmFnZSAqLwotCQlpZiAocnhxLT5wb29sW2ldLnBhZ2UgIT0gTlVMTCkgewotCQkJcGNpX3VubWFwX3BhZ2UocHJpdi0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJX19pd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgcnhxLT5wb29sW2ldLnBhZ2UpOwotCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRTsgaSsrKQotCQlyeHEtPnF1ZXVlW2ldID0gTlVMTDsKLQotCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQotCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLwotCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOwotCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKLQlyeHEtPmZyZWVfY291bnQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotfQotCi1pbnQgaXdsNDk2NV9yeF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCXUzMiByYl9zaXplOwotCWNvbnN0IHUzMiByZmRubG9nID0gUlhfUVVFVUVfU0laRV9MT0c7IC8qIDI1NiBSQkRzICovCi0JdTMyIHJiX3RpbWVvdXQgPSAwOwotCi0JaWYgKHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKLQkJcmJfc2l6ZSA9IEZIX1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV84SzsKLQllbHNlCi0JCXJiX3NpemUgPSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfNEs7Ci0KLQkvKiBTdG9wIFJ4IERNQSAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywgMCk7Ci0KLQkvKiBSZXNldCBkcml2ZXIncyBSeCBxdWV1ZSB3cml0ZSBpbmRleCAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcsIDApOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBSQkQgY2lyY3VsYXIgYnVmZmVyIGluIERSQU0gKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHLAotCQkJICAgKHUzMikocnhxLT5iZF9kbWEgPj4gOCkpOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgaW4gRFJBTSB0byB1cGRhdGUgaXRzIFJ4IHN0YXR1cyAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRywKLQkJCSAgIHJ4cS0+cmJfc3R0c19kbWEgPj4gNCk7Ci0KLQkvKiBFbmFibGUgUnggRE1BCi0JICogRGlyZWN0IHJ4IGludGVycnVwdHMgdG8gaG9zdHMKLQkgKiBSeCBidWZmZXIgc2l6ZSA0IG9yIDhrCi0JICogUkIgdGltZW91dCAweDEwCi0JICogMjU2IFJCRHMKLQkgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsCi0JCQkgICBGSF9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX0VOQUJMRV9WQUwgfAotCQkJICAgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMIHwKLQkJCSAgIEZIX1JDU1JfQ0hOTDBfUlhfQ09ORklHX1NJTkdMRV9GUkFNRV9NU0sgfAotCQkJICAgcmJfc2l6ZXwKLQkJCSAgIChyYl90aW1lb3V0IDw8IEZIX1JDU1JfUlhfQ09ORklHX1JFR19JUlFfUkJUSF9QT1MpfAotCQkJICAgKHJmZG5sb2cgPDwgRkhfUkNTUl9SWF9DT05GSUdfUkJEQ0JfU0laRV9QT1MpKTsKLQotCS8qIFNldCBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lciB0byBkZWZhdWx0ICgyMDQ4IHVzZWNzKSAqLwotCWl3bF93cml0ZTgocHJpdiwgQ1NSX0lOVF9DT0FMRVNDSU5HLCBJV0xfSE9TVF9JTlRfVElNRU9VVF9ERUYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfc2V0X3B3cl92bWFpbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0vKgotICogKGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzKQotICogdG8gc2V0IHBvd2VyIHRvIFZfQVVYLCBkbzoKLQotCQlpZiAocGNpX3BtZV9jYXBhYmxlKHByaXYtPnBjaV9kZXYsIFBDSV9EM2NvbGQpKQotCQkJaXdsX2xlZ2FjeV9zZXRfYml0c19tYXNrX3BycGgocHJpdiwgQVBNR19QU19DVFJMX1JFRywKLQkJCQkJICAgICAgIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WQVVYLAotCQkJCQkgICAgICAgfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7Ci0gKi8KLQotCWl3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQkgICAgICAgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZNQUlOLAotCQkJICAgICAgIH5BUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMpOwotfQotCi1pbnQgaXdsNDk2NV9od19uaWNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCWludCByZXQ7Ci0KLQkvKiBuaWNfaW5pdCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KHByaXYpOwotCi0JLyogU2V0IGludGVycnVwdCBjb2FsZXNjaW5nIGNhbGlicmF0aW9uIHRpbWVyIHRvIGRlZmF1bHQgKDUxMiB1c2VjcykgKi8KLQlpd2xfd3JpdGU4KHByaXYsIENTUl9JTlRfQ09BTEVTQ0lORywgSVdMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfREVGKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWl3bDQ5NjVfc2V0X3B3cl92bWFpbihwcml2KTsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuY29uZmlnKHByaXYpOwotCi0JLyogQWxsb2NhdGUgdGhlIFJYIHF1ZXVlLCBvciByZXNldCBpZiBpdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLwotCWlmICghcnhxLT5iZCkgewotCQlyZXQgPSBpd2xfbGVnYWN5X3J4X3F1ZXVlX2FsbG9jKHByaXYpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBSeCBxdWV1ZVxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCX0gZWxzZQotCQlpd2w0OTY1X3J4X3F1ZXVlX3Jlc2V0KHByaXYsIHJ4cSk7Ci0KLQlpd2w0OTY1X3J4X3JlcGxlbmlzaChwcml2KTsKLQotCWl3bDQ5NjVfcnhfaW5pdChwcml2LCByeHEpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJ4cS0+bmVlZF91cGRhdGUgPSAxOwotCWl3bF9sZWdhY3lfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCByeHEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWxsb2NhdGUgb3IgcmVzZXQgYW5kIGluaXQgYWxsIFR4IGFuZCBDb21tYW5kIHF1ZXVlcyAqLwotCWlmICghcHJpdi0+dHhxKSB7Ci0JCXJldCA9IGl3bDQ5NjVfdHhxX2N0eF9hbGxvYyhwcml2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfSBlbHNlCi0JCWl3bDQ5NjVfdHhxX2N0eF9yZXNldChwcml2KTsKLQotCXNldF9iaXQoU1RBVFVTX0lOSVQsICZwcml2LT5zdGF0dXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9kbWFfYWRkcjJyYmRfcHRyIC0gY29udmVydCBhIERNQSBhZGRyZXNzIHRvIGEgdUNvZGUgcmVhZCBidWZmZXIgcHRyCi0gKi8KLXN0YXRpYyBpbmxpbmUgX19sZTMyIGl3bDQ5NjVfZG1hX2FkZHIycmJkX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgZG1hX2FkZHJfdCBkbWFfYWRkcikKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMzIoKHUzMikoZG1hX2FkZHIgPj4gOCkpOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayAtIHJlZmlsbCBSWCBxdWV1ZSBmcm9tIHByZS1hbGxvY2F0ZWQgcG9vbAotICoKLSAqIElmIHRoZXJlIGFyZSBzbG90cyBpbiB0aGUgUlggcXVldWUgdGhhdCBuZWVkIHRvIGJlIHJlc3RvY2tlZCwKLSAqIGFuZCB3ZSBoYXZlIGZyZWUgcHJlLWFsbG9jYXRlZCBidWZmZXJzLCBmaWxsIHRoZSByYW5rcyBhcyBtdWNoCi0gKiBhcyB3ZSBjYW4sIHB1bGxpbmcgZnJvbSByeF9mcmVlLgotICoKLSAqIFRoaXMgbW92ZXMgdGhlICd3cml0ZScgaW5kZXggZm9yd2FyZCB0byBjYXRjaCB1cCB3aXRoICdwcm9jZXNzZWQnLCBhbmQKLSAqIGFsc28gdXBkYXRlcyB0aGUgbWVtb3J5IGFkZHJlc3MgaW4gdGhlIGZpcm13YXJlIHRvIHJlZmVyZW5jZSB0aGUgbmV3Ci0gKiB0YXJnZXQgYnVmZmVyLgotICovCi12b2lkIGl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKChpd2xfbGVnYWN5X3J4X3F1ZXVlX3NwYWNlKHJ4cSkgPiAwKSAmJiAocnhxLT5mcmVlX2NvdW50KSkgewotCQkvKiBUaGUgb3ZlcndyaXR0ZW4gcnhiIG11c3QgYmUgYSB1c2VkIG9uZSAqLwotCQlyeGIgPSByeHEtPnF1ZXVlW3J4cS0+d3JpdGVdOwotCQlCVUdfT04ocnhiICYmIHJ4Yi0+cGFnZSk7Ci0KLQkJLyogR2V0IG5leHQgZnJlZSBSeCBidWZmZXIsIHJlbW92ZSBmcm9tIGZyZWUgbGlzdCAqLwotCQllbGVtZW50ID0gcnhxLT5yeF9mcmVlLm5leHQ7Ci0JCXJ4YiA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9kZWwoZWxlbWVudCk7Ci0KLQkJLyogUG9pbnQgdG8gUnggYnVmZmVyIHZpYSBuZXh0IFJCRCBpbiBjaXJjdWxhciBidWZmZXIgKi8KLQkJcnhxLT5iZFtyeHEtPndyaXRlXSA9IGl3bDQ5NjVfZG1hX2FkZHIycmJkX3B0cihwcml2LAotCQkJCQkJCSAgICAgIHJ4Yi0+cGFnZV9kbWEpOwotCQlyeHEtPnF1ZXVlW3J4cS0+d3JpdGVdID0gcnhiOwotCQlyeHEtPndyaXRlID0gKHJ4cS0+d3JpdGUgKyAxKSAmIFJYX1FVRVVFX01BU0s7Ci0JCXJ4cS0+ZnJlZV9jb3VudC0tOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkvKiBJZiB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXIgcG9vbCBpcyBkcm9wcGluZyBsb3csIHNjaGVkdWxlIHRvCi0JICogcmVmaWxsIGl0ICovCi0JaWYgKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKQotCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJ4X3JlcGxlbmlzaCk7Ci0KLQotCS8qIElmIHdlJ3ZlIGFkZGVkIG1vcmUgc3BhY2UgZm9yIHRoZSBmaXJtd2FyZSB0byBwbGFjZSBkYXRhLCB0ZWxsIGl0LgotCSAqIEluY3JlbWVudCBkZXZpY2UncyB3cml0ZSBwb2ludGVyIGluIG11bHRpcGxlcyBvZiA4LiAqLwotCWlmIChyeHEtPndyaXRlX2FjdHVhbCAhPSAocnhxLT53cml0ZSAmIH4weDcpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJcnhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQlpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgcnhxKTsKLQl9Ci19Ci0KLS8qKgotICogaXdsNDk2NV9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQotICoKLSAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCi0gKgotICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaXdsX3J4X3F1ZXVlX3Jlc3RvY2suCi0gKiBUaGlzIGlzIGNhbGxlZCBhcyBhIHNjaGVkdWxlZCB3b3JrIGl0ZW0gKGV4Y2VwdCBmb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uKQotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3J4X2FsbG9jYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZ2ZwX3QgcHJpb3JpdHkpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JZ2ZwX3QgZ2ZwX21hc2sgPSBwcmlvcml0eTsKLQotCXdoaWxlICgxKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChyeHEtPmZyZWVfY291bnQgPiBSWF9MT1dfV0FURVJNQVJLKQotCQkJZ2ZwX21hc2sgfD0gX19HRlBfTk9XQVJOOwotCi0JCWlmIChwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA+IDApCi0JCQlnZnBfbWFzayB8PSBfX0dGUF9DT01QOwotCi0JCS8qIEFsbG9jIGEgbmV3IHJlY2VpdmUgYnVmZmVyICovCi0JCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnBfbWFzaywgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOwotCQlpZiAoIXBhZ2UpIHsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgImFsbG9jX3BhZ2VzIGZhaWxlZCwgIgotCQkJCQkgICAgICAgIm9yZGVyOiAlZFxuIiwKLQkJCQkJICAgICAgIHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKLQotCQkJaWYgKChyeHEtPmZyZWVfY291bnQgPD0gUlhfTE9XX1dBVEVSTUFSSykgJiYKLQkJCSAgICBuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJSVdMX0NSSVQocHJpdiwKLQkJCQkJIkZhaWxlZCB0byBhbGxvY19wYWdlcyB3aXRoICVzLiAiCi0JCQkJCSJPbmx5ICV1IGZyZWUgYnVmZmVycyByZW1haW5pbmcuXG4iLAotCQkJCQkgcHJpb3JpdHkgPT0gR0ZQX0FUT01JQyA/Ci0JCQkJCQkgIkdGUF9BVE9NSUMiIDogIkdGUF9LRVJORUwiLAotCQkJCQkgcnhxLT5mcmVlX2NvdW50KTsKLQkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCi0JCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKLQkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJCV9fZnJlZV9wYWdlcyhwYWdlLCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxlbWVudCA9IHJ4cS0+cnhfdXNlZC5uZXh0OwotCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCUJVR19PTihyeGItPnBhZ2UpOwotCQlyeGItPnBhZ2UgPSBwYWdlOwotCQkvKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUkIgKi8KLQkJcnhiLT5wYWdlX2RtYSA9IHBjaV9tYXBfcGFnZShwcml2LT5wY2lfZGV2LCBwYWdlLCAwLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkvKiBkbWEgYWRkcmVzcyBtdXN0IGJlIG5vIG1vcmUgdGhhbiAzNiBiaXRzICovCi0JCUJVR19PTihyeGItPnBhZ2VfZG1hICYgfkRNQV9CSVRfTUFTSygzNikpOwotCQkvKiBhbmQgYWxzbyAyNTYgYnl0ZSBhbGlnbmVkISAqLwotCQlCVUdfT04ocnhiLT5wYWdlX2RtYSAmIERNQV9CSVRfTUFTSyg4KSk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7Ci0JCXJ4cS0+ZnJlZV9jb3VudCsrOwotCQlwcml2LT5hbGxvY19yeGJfcGFnZSsrOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCX0KLX0KLQotdm9pZCBpd2w0OTY1X3J4X3JlcGxlbmlzaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWl3bDQ5NjVfcnhfYWxsb2NhdGUocHJpdiwgR0ZQX0tFUk5FTCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgaXdsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2w0OTY1X3J4X2FsbG9jYXRlKHByaXYsIEdGUF9BVE9NSUMpOwotCi0JaXdsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrKHByaXYpOwotfQotCi0vKiBBc3N1bWVzIHRoYXQgdGhlIHNrYiBmaWVsZCBvZiB0aGUgYnVmZmVycyBpbiAncG9vbCcgaXMga2VwdCBhY2N1cmF0ZS4KLSAqIElmIGFuIFNLQiBoYXMgYmVlbiBkZXRhY2hlZCwgdGhlIFBPT0wgbmVlZHMgdG8gaGF2ZSBpdHMgU0tCIHNldCB0byBOVUxMCi0gKiBUaGlzIGZyZWUgcm91dGluZSB3YWxrcyB0aGUgbGlzdCBvZiBQT09MIGVudHJpZXMgYW5kIGlmIFNLQiBpcyBzZXQgdG8KLSAqIG5vbiBOVUxMIGl0IGlzIHVubWFwcGVkIGFuZCBmcmVlZAotICovCi12b2lkIGl3bDQ5NjVfcnhfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRSArIFJYX0ZSRUVfQlVGRkVSUzsgaSsrKSB7Ci0JCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZShwcml2LT5wY2lfZGV2LCByeHEtPnBvb2xbaV0ucGFnZV9kbWEsCi0JCQkJUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlfX2l3bF9sZWdhY3lfZnJlZV9wYWdlcyhwcml2LCByeHEtPnBvb2xbaV0ucGFnZSk7Ci0JCQlyeHEtPnBvb2xbaV0ucGFnZSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgcnhxLT5iZCwKLQkJCSAgcnhxLT5iZF9kbWEpOwotCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgaXdsX3JiX3N0YXR1cyksCi0JCQkgIHJ4cS0+cmJfc3R0cywgcnhxLT5yYl9zdHRzX2RtYSk7Ci0JcnhxLT5iZCA9IE5VTEw7Ci0JcnhxLT5yYl9zdHRzICA9IE5VTEw7Ci19Ci0KLWludCBpd2w0OTY1X3J4cV9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQotCS8qIHN0b3AgUnggRE1BICovCi0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLCAwKTsKLQlpd2xfcG9sbF9kaXJlY3RfYml0KHByaXYsIEZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcsCi0JCQkgICAgRkhfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFLCAxMDAwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHUzMiByYXRlX25fZmxhZ3MsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQlpbnQgaWR4ID0gMDsKLQlpbnQgYmFuZF9vZmZzZXQgPSAwOwotCi0JLyogSFQgcmF0ZSBmb3JtYXQ6IG1hYzgwMjExIHdhbnRzIGFuIE1DUyBudW1iZXIsIHdoaWNoIGlzIGp1c3QgTFNCICovCi0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgewotCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7Ci0JCXJldHVybiBpZHg7Ci0JLyogTGVnYWN5IHJhdGUgZm9ybWF0LCBzZWFyY2ggZm9yIG1hdGNoIGluIHRhYmxlICovCi0JfSBlbHNlIHsKLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCWJhbmRfb2Zmc2V0ID0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJZm9yIChpZHggPSBiYW5kX29mZnNldDsgaWR4IDwgSVdMX1JBVEVfQ09VTlRfTEVHQUNZOyBpZHgrKykKLQkJCWlmIChpd2xlZ2FjeV9yYXRlc1tpZHhdLnBsY3AgPT0gKHJhdGVfbl9mbGFncyAmIDB4RkYpKQotCQkJCXJldHVybiBpZHggLSBiYW5kX29mZnNldDsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9jYWxjX3Jzc2koc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgaXdsX3J4X3BoeV9yZXMgKnJ4X3Jlc3ApCi17Ci0JLyogZGF0YSBmcm9tIFBIWS9EU1AgcmVnYXJkaW5nIHNpZ25hbCBzdHJlbmd0aCwgZXRjLiwKLQkgKiAgIGNvbnRlbnRzIGFyZSBhbHdheXMgdGhlcmUsIG5vdCBjb25maWd1cmFibGUgYnkgaG9zdC4gICovCi0Jc3RydWN0IGl3bDQ5NjVfcnhfbm9uX2NmZ19waHkgKm5jcGh5ID0KLQkgICAgKHN0cnVjdCBpd2w0OTY1X3J4X25vbl9jZmdfcGh5ICopcnhfcmVzcC0+bm9uX2NmZ19waHlfYnVmOwotCXUzMiBhZ2MgPSAobGUxNl90b19jcHUobmNwaHktPmFnY19pbmZvKSAmIElXTDQ5X0FHQ19EQl9NQVNLKQotCQkJPj4gSVdMNDlfQUdDX0RCX1BPUzsKLQotCXUzMiB2YWxpZF9hbnRlbm5hZSA9Ci0JICAgIChsZTE2X3RvX2NwdShyeF9yZXNwLT5waHlfZmxhZ3MpICYgSVdMNDlfUlhfUEhZX0ZMQUdTX0FOVEVOTkFFX01BU0spCi0JCQk+PiBJV0w0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfT0ZGU0VUOwotCXU4IG1heF9yc3NpID0gMDsKLQl1MzIgaTsKLQotCS8qIEZpbmQgbWF4IHJzc2kgYW1vbmcgMyBwb3NzaWJsZSByZWNlaXZlcnMuCi0JICogVGhlc2UgdmFsdWVzIGFyZSBtZWFzdXJlZCBieSB0aGUgZGlnaXRhbCBzaWduYWwgcHJvY2Vzc29yIChEU1ApLgotCSAqIFRoZXkgc2hvdWxkIHN0YXkgZmFpcmx5IGNvbnN0YW50IGV2ZW4gYXMgdGhlIHNpZ25hbCBzdHJlbmd0aCB2YXJpZXMsCi0JICogICBpZiB0aGUgcmFkaW8ncyBhdXRvbWF0aWMgZ2FpbiBjb250cm9sIChBR0MpIGlzIHdvcmtpbmcgcmlnaHQuCi0JICogQUdDIHZhbHVlIChzZWUgYmVsb3cpIHdpbGwgcHJvdmlkZSB0aGUgImludGVyZXN0aW5nIiBpbmZvLiAqLwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JCWlmICh2YWxpZF9hbnRlbm5hZSAmICgxIDw8IGkpKQotCQkJbWF4X3Jzc2kgPSBtYXgobmNwaHktPnJzc2lfaW5mb1tpIDw8IDFdLCBtYXhfcnNzaSk7Ci0KLQlJV0xfREVCVUdfU1RBVFMocHJpdiwgIlJzc2kgSW4gQSAlZCBCICVkIEMgJWQgTWF4ICVkIEFHQyBkQiAlZFxuIiwKLQkJbmNwaHktPnJzc2lfaW5mb1swXSwgbmNwaHktPnJzc2lfaW5mb1syXSwgbmNwaHktPnJzc2lfaW5mb1s0XSwKLQkJbWF4X3Jzc2ksIGFnYyk7Ci0KLQkvKiBkQm0gPSBtYXhfcnNzaSBkQiAtIGFnYyBkQiAtIGNvbnN0YW50LgotCSAqIEhpZ2hlciBBR0MgKGhpZ2hlciByYWRpbyBnYWluKSBtZWFucyBsb3dlciBzaWduYWwuICovCi0JcmV0dXJuIG1heF9yc3NpIC0gYWdjIC0gSVdMNDk2NV9SU1NJX09GRlNFVDsKLX0KLQotCi1zdGF0aWMgdTMyIGl3bDQ5NjVfdHJhbnNsYXRlX3J4X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBkZWNyeXB0X2luKQotewotCXUzMiBkZWNyeXB0X291dCA9IDA7Ci0KLQlpZiAoKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NUQVRJT05fRk9VTkQpID09Ci0JCQkJCVJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCkKLQkJZGVjcnlwdF9vdXQgfD0gKFJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCB8Ci0JCQkJUlhfUkVTX1NUQVRVU19OT19TVEFUSU9OX0lORk9fTUlTTUFUQ0gpOwotCi0JZGVjcnlwdF9vdXQgfD0gKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSyk7Ci0KLQkvKiBwYWNrZXQgd2FzIG5vdCBlbmNyeXB0ZWQgKi8KLQlpZiAoKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSykgPT0KLQkJCQkJUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9OT05FKQotCQlyZXR1cm4gZGVjcnlwdF9vdXQ7Ci0KLQkvKiBwYWNrZXQgd2FzIGVuY3J5cHRlZCB3aXRoIHVua25vd24gYWxnICovCi0JaWYgKChkZWNyeXB0X2luICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spID09Ci0JCQkJCVJYX1JFU19TVEFUVVNfU0VDX1RZUEVfRVJSKQotCQlyZXR1cm4gZGVjcnlwdF9vdXQ7Ci0KLQkvKiBkZWNyeXB0aW9uIHdhcyBub3QgZG9uZSBpbiBIVyAqLwotCWlmICgoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0spICE9Ci0JCQkJCVJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0spCi0JCXJldHVybiBkZWNyeXB0X291dDsKLQotCXN3aXRjaCAoZGVjcnlwdF9pbiAmIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLKSB7Ci0KLQljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfQ0NNUDoKLQkJLyogYWxnIGlzIENDTTogY2hlY2sgTUlDIG9ubHkgKi8KLQkJaWYgKCEoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19NSUNfT0spKQotCQkJLyogQmFkIE1JQyAqLwotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQzsKLQkJZWxzZQotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LOwotCi0JCWJyZWFrOwotCi0JY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1RLSVA6Ci0JCWlmICghKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfVFRBS19PSykpIHsKLQkJCS8qIEJhZCBUVEFLICovCi0JCQlkZWNyeXB0X291dCB8PSBSWF9SRVNfU1RBVFVTX0JBRF9LRVlfVFRBSzsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIGZhbGwgdGhyb3VnaCBpZiBUVEFLIE9LICovCi0JZGVmYXVsdDoKLQkJaWYgKCEoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19JQ1ZfT0spKQotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQzsKLQkJZWxzZQotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LOwotCQlicmVhazsKLQl9Ci0KLQlJV0xfREVCVUdfUlgocHJpdiwgImRlY3J5cHRfaW46MHgleCAgZGVjcnlwdF9vdXQgPSAweCV4XG4iLAotCQkJCQlkZWNyeXB0X2luLCBkZWNyeXB0X291dCk7Ci0KLQlyZXR1cm4gZGVjcnlwdF9vdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJCQl1MTYgbGVuLAotCQkJCQl1MzIgYW1wZHVfc3RhdHVzLAotCQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YiwKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOwotCi0JLyogV2Ugb25seSBwcm9jZXNzIGRhdGEgcGFja2V0cyBpZiB0aGUgaW50ZXJmYWNlIGlzIG9wZW4gKi8KLQlpZiAodW5saWtlbHkoIXByaXYtPmlzX29wZW4pKSB7Ci0JCUlXTF9ERUJVR19EUk9QX0xJTUlUKHByaXYsCi0JCSAgICAiRHJvcHBpbmcgcGFja2V0IHdoaWxlIGludGVyZmFjZSBpcyBub3Qgb3Blbi5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSW4gY2FzZSBvZiBIVyBhY2NlbGVyYXRlZCBjcnlwdG8gYW5kIGJhZCBkZWNyeXB0aW9uLCBkcm9wICovCi0JaWYgKCFwcml2LT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0byAmJgotCSAgICBpd2xfbGVnYWN5X3NldF9kZWNyeXB0ZWRfZmxhZyhwcml2LCBoZHIsIGFtcGR1X3N0YXR1cywgc3RhdHMpKQotCQlyZXR1cm47Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7Ci0JaWYgKCFza2IpIHsKLQkJSVdMX0VSUihwcml2LCAiZGV2X2FsbG9jX3NrYiBmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2tiX2FkZF9yeF9mcmFnKHNrYiwgMCwgcnhiLT5wYWdlLCAodm9pZCAqKWhkciAtIHJ4Yl9hZGRyKHJ4YiksIGxlbik7Ci0KLQlpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhwcml2LCBmYWxzZSwgZmMsIGxlbik7Ci0JbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpOwotCi0JaWVlZTgwMjExX3J4KHByaXYtPmh3LCBza2IpOwotCXByaXYtPmFsbG9jX3J4Yl9wYWdlLS07Ci0JcnhiLT5wYWdlID0gTlVMTDsKLX0KLQotLyogQ2FsbGVkIGZvciBSRVBMWV9SWCAobGVnYWN5IEFCRyBmcmFtZXMpLCBvcgotICogUkVQTFlfUlhfTVBEVV9DTUQgKEhUIGhpZ2gtdGhyb3VnaHB1dCBOIGZyYW1lcykuICovCi12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfcngoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfcnhfcGh5X3JlcyAqcGh5X3JlczsKLQlfX2xlMzIgcnhfcGt0X3N0YXR1czsKLQlzdHJ1Y3QgaXdsX3J4X21wZHVfcmVzX3N0YXJ0ICphbXNkdTsKLQl1MzIgbGVuOwotCXUzMiBhbXBkdV9zdGF0dXM7Ci0JdTMyIHJhdGVfbl9mbGFnczsKLQotCS8qKgotCSAqIFJFUExZX1JYIGFuZCBSRVBMWV9SWF9NUERVX0NNRCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseS4KLQkgKglSRVBMWV9SWDogcGh5c2ljYWwgbGF5ZXIgaW5mbyBpcyBpbiB0aGlzIGJ1ZmZlcgotCSAqCVJFUExZX1JYX01QRFVfQ01EOiBwaHlzaWNhbCBsYXllciBpbmZvIHdhcyBzZW50IGluIHNlcGFyYXRlCi0JICoJCWNvbW1hbmQgYW5kIGNhY2hlZCBpbiBwcml2LT5sYXN0X3BoeV9yZXMKLQkgKgotCSAqIEhlcmUgd2Ugc2V0IHVwIGxvY2FsIHZhcmlhYmxlcyBkZXBlbmRpbmcgb24gd2hpY2ggY29tbWFuZCBpcwotCSAqIHJlY2VpdmVkLgotCSAqLwotCWlmIChwa3QtPmhkci5jbWQgPT0gUkVQTFlfUlgpIHsKLQkJcGh5X3JlcyA9IChzdHJ1Y3QgaXdsX3J4X3BoeV9yZXMgKilwa3QtPnUucmF3OwotCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikocGt0LT51LnJhdyArIHNpemVvZigqcGh5X3JlcykKLQkJCQkrIHBoeV9yZXMtPmNmZ19waHlfY250KTsKLQotCQlsZW4gPSBsZTE2X3RvX2NwdShwaHlfcmVzLT5ieXRlX2NvdW50KTsKLQkJcnhfcGt0X3N0YXR1cyA9ICooX19sZTMyICopKHBrdC0+dS5yYXcgKyBzaXplb2YoKnBoeV9yZXMpICsKLQkJCQlwaHlfcmVzLT5jZmdfcGh5X2NudCArIGxlbik7Ci0JCWFtcGR1X3N0YXR1cyA9IGxlMzJfdG9fY3B1KHJ4X3BrdF9zdGF0dXMpOwotCX0gZWxzZSB7Ci0JCWlmICghcHJpdi0+XzQ5NjUubGFzdF9waHlfcmVzX3ZhbGlkKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJNUERVIGZyYW1lIHdpdGhvdXQgY2FjaGVkIFBIWSBkYXRhXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlwaHlfcmVzID0gJnByaXYtPl80OTY1Lmxhc3RfcGh5X3JlczsKLQkJYW1zZHUgPSAoc3RydWN0IGl3bF9yeF9tcGR1X3Jlc19zdGFydCAqKXBrdC0+dS5yYXc7Ci0JCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkpOwotCQlsZW4gPSBsZTE2X3RvX2NwdShhbXNkdS0+Ynl0ZV9jb3VudCk7Ci0JCXJ4X3BrdF9zdGF0dXMgPSAqKF9fbGUzMiAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkgKyBsZW4pOwotCQlhbXBkdV9zdGF0dXMgPSBpd2w0OTY1X3RyYW5zbGF0ZV9yeF9zdGF0dXMocHJpdiwKLQkJCQlsZTMyX3RvX2NwdShyeF9wa3Rfc3RhdHVzKSk7Ci0JfQotCi0JaWYgKCh1bmxpa2VseShwaHlfcmVzLT5jZmdfcGh5X2NudCA+IDIwKSkpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgImRzcCBzaXplIG91dCBvZiByYW5nZSBbMCwyMF06ICVkL24iLAotCQkJCXBoeV9yZXMtPmNmZ19waHlfY250KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghKHJ4X3BrdF9zdGF0dXMgJiBSWF9SRVNfU1RBVFVTX05PX0NSQzMyX0VSUk9SKSB8fAotCSAgICAhKHJ4X3BrdF9zdGF0dXMgJiBSWF9SRVNfU1RBVFVTX05PX1JYRV9PVkVSRkxPVykpIHsKLQkJSVdMX0RFQlVHX1JYKHByaXYsICJCYWQgQ1JDIG9yIEZJRk86IDB4JTA4WC5cbiIsCi0JCQkJbGUzMl90b19jcHUocnhfcGt0X3N0YXR1cykpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogVGhpcyB3aWxsIGJlIHVzZWQgaW4gc2V2ZXJhbCBwbGFjZXMgbGF0ZXIgKi8KLQlyYXRlX25fZmxhZ3MgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5yYXRlX25fZmxhZ3MpOwotCi0JLyogcnhfc3RhdHVzIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2tldCB0byBtYWM4MDIxMSAqLwotCXJ4X3N0YXR1cy5tYWN0aW1lID0gbGU2NF90b19jcHUocGh5X3Jlcy0+dGltZXN0YW1wKTsKLQlyeF9zdGF0dXMuYmFuZCA9IChwaHlfcmVzLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX0JBTkRfMjRfTVNLKSA/Ci0JCQkJSUVFRTgwMjExX0JBTkRfMkdIWiA6IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci0Jcnhfc3RhdHVzLmZyZXEgPQotCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kobGUxNl90b19jcHUocGh5X3Jlcy0+Y2hhbm5lbCksCi0JCQkJCQkJcnhfc3RhdHVzLmJhbmQpOwotCXJ4X3N0YXR1cy5yYXRlX2lkeCA9Ci0JCWl3bDQ5NjVfaHdyYXRlX3RvX21hYzgwMjExX2lkeChyYXRlX25fZmxhZ3MsIHJ4X3N0YXR1cy5iYW5kKTsKLQlyeF9zdGF0dXMuZmxhZyA9IDA7Ci0KLQkvKiBUU0YgaXNuJ3QgcmVsaWFibGUuIEluIG9yZGVyIHRvIGFsbG93IHNtb290aCB1c2VyIGV4cGVyaWVuY2UsCi0JICogdGhpcyBXL0EgZG9lc24ndCBwcm9wYWdhdGUgaXQgdG8gdGhlIG1hYzgwMjExICovCi0JLypyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX01BQ1RJTUVfTVBEVTsqLwotCi0JcHJpdi0+dWNvZGVfYmVhY29uX3RpbWUgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5iZWFjb25fdGltZV9zdGFtcCk7Ci0KLQkvKiBGaW5kIG1heCBzaWduYWwgc3RyZW5ndGggKGRCbSkgYW1vbmcgMyBhbnRlbm5hL3JlY2VpdmVyIGNoYWlucyAqLwotCXJ4X3N0YXR1cy5zaWduYWwgPSBpd2w0OTY1X2NhbGNfcnNzaShwcml2LCBwaHlfcmVzKTsKLQotCWl3bF9sZWdhY3lfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHByaXYsIGxlbiwgaGVhZGVyKTsKLQlJV0xfREVCVUdfU1RBVFNfTElNSVQocHJpdiwgIlJzc2kgJWQsIFRTRiAlbGx1XG4iLAotCQlyeF9zdGF0dXMuc2lnbmFsLCAodW5zaWduZWQgbG9uZyBsb25nKXJ4X3N0YXR1cy5tYWN0aW1lKTsKLQotCS8qCi0JICogImFudGVubmEgbnVtYmVyIgotCSAqCi0JICogSXQgc2VlbXMgdGhhdCB0aGUgYW50ZW5uYSBmaWVsZCBpbiB0aGUgcGh5IGZsYWdzIHZhbHVlCi0JICogaXMgYWN0dWFsbHkgYSBiaXQgZmllbGQuIFRoaXMgaXMgdW5kZWZpbmVkIGJ5IHJhZGlvdGFwLAotCSAqIGl0IHdhbnRzIGFuIGFjdHVhbCBhbnRlbm5hIG51bWJlciBidXQgSSBhbHdheXMgZ2V0ICI3IgotCSAqIGZvciBtb3N0IGxlZ2FjeSBmcmFtZXMgSSByZWNlaXZlIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzYW1lIGZyYW1lIHdhcyByZWNlaXZlZCBvbiBhbGwgdGhyZWUgUlggY2hhaW5zLgotCSAqCi0JICogSSB0aGluayB0aGlzIGZpZWxkIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGEKLQkgKiBuZXcgODAyLjExbiByYWRpb3RhcCBmaWVsZCAiUlggY2hhaW5zIiB0aGF0IGlzIGRlZmluZWQKLQkgKiBhcyBhIGJpdG1hc2suCi0JICovCi0Jcnhfc3RhdHVzLmFudGVubmEgPQotCQkobGUxNl90b19jcHUocGh5X3Jlcy0+cGh5X2ZsYWdzKSAmIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spCi0JCT4+IFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9QT1M7Ci0KLQkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KLQlpZiAocGh5X3Jlcy0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0spCi0JCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7Ci0KLQkvKiBTZXQgdXAgdGhlIEhUIHBoeSBmbGFncyAqLwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCi0JCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSFQ7Ci0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUNDBfTVNLKQotCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHXzQwTUhaOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQotCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX1NIT1JUX0dJOwotCi0JaXdsNDk2NV9wYXNzX3BhY2tldF90b19tYWM4MDIxMShwcml2LCBoZWFkZXIsIGxlbiwgYW1wZHVfc3RhdHVzLAotCQkJCSAgICByeGIsICZyeF9zdGF0dXMpOwotfQotCi0vKiBDYWNoZSBwaHkgZGF0YSAoUnggc2lnbmFsIHN0cmVuZ3RoLCBldGMpIGZvciBIVCBmcmFtZSAoUkVQTFlfUlhfUEhZX0NNRCkuCi0gKiBUaGlzIHdpbGwgYmUgdXNlZCBsYXRlciBpbiBpd2xfcnhfcmVwbHlfcngoKSBmb3IgUkVQTFlfUlhfTVBEVV9DTUQuICovCi12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfcnhfcGh5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlwcml2LT5fNDk2NS5sYXN0X3BoeV9yZXNfdmFsaWQgPSB0cnVlOwotCW1lbWNweSgmcHJpdi0+XzQ5NjUubGFzdF9waHlfcmVzLCBwa3QtPnUucmF3LAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9yeF9waHlfcmVzKSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgICAgIHU4IGlzX2FjdGl2ZSwgdTggbl9wcm9iZXMsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCAqc2Nhbl9jaCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTE2IHBhc3NpdmVfZHdlbGwgPSAwOwotCXUxNiBhY3RpdmVfZHdlbGwgPSAwOwotCWludCBhZGRlZCwgaTsKLQl1MTYgY2hhbm5lbDsKLQotCXNiYW5kID0gaXdsX2dldF9od19tb2RlKHByaXYsIGJhbmQpOwotCWlmICghc2JhbmQpCi0JCXJldHVybiAwOwotCi0JYWN0aXZlX2R3ZWxsID0gaXdsX2xlZ2FjeV9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgbl9wcm9iZXMpOwotCXBhc3NpdmVfZHdlbGwgPSBpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgdmlmKTsKLQotCWlmIChwYXNzaXZlX2R3ZWxsIDw9IGFjdGl2ZV9kd2VsbCkKLQkJcGFzc2l2ZV9kd2VsbCA9IGFjdGl2ZV9kd2VsbCArIDE7Ci0KLQlmb3IgKGkgPSAwLCBhZGRlZCA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fY2hhbm5lbHM7IGkrKykgewotCQljaGFuID0gcHJpdi0+c2Nhbl9yZXF1ZXN0LT5jaGFubmVsc1tpXTsKLQotCQlpZiAoY2hhbi0+YmFuZCAhPSBiYW5kKQotCQkJY29udGludWU7Ci0KLQkJY2hhbm5lbCA9IGNoYW4tPmh3X3ZhbHVlOwotCQlzY2FuX2NoLT5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7Ci0KLQkJY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBiYW5kLCBjaGFubmVsKTsKLQkJaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkJICJDaGFubmVsICVkIGlzIElOVkFMSUQgZm9yIHRoaXMgYmFuZC5cbiIsCi0JCQkJCWNoYW5uZWwpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIWlzX2FjdGl2ZSB8fCBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfcGFzc2l2ZShjaF9pbmZvKSB8fAotCQkgICAgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSkKLQkJCXNjYW5fY2gtPnR5cGUgPSBTQ0FOX0NIQU5ORUxfVFlQRV9QQVNTSVZFOwotCQllbHNlCi0JCQlzY2FuX2NoLT50eXBlID0gU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFOwotCi0JCWlmIChuX3Byb2JlcykKLQkJCXNjYW5fY2gtPnR5cGUgfD0gSVdMX1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7Ci0KLQkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYoYWN0aXZlX2R3ZWxsKTsKLQkJc2Nhbl9jaC0+cGFzc2l2ZV9kd2VsbCA9IGNwdV90b19sZTE2KHBhc3NpdmVfZHdlbGwpOwotCi0JCS8qIFNldCB0eHBvd2VyIGxldmVscyB0byBkZWZhdWx0cyAqLwotCQlzY2FuX2NoLT5kc3BfYXR0ZW4gPSAxMTA7Ci0KLQkJLyogTk9URTogaWYgd2Ugd2VyZSBkb2luZyA2TWIgT0ZETSBmb3Igc2NhbnMgd2UnZCB1c2UKLQkJICogcG93ZXIgbGV2ZWw6Ci0JCSAqIHNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMiA8PCAzKSkgfCAzOwotCQkgKi8KLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCXNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMyA8PCAzKSkgfCAzOwotCQllbHNlCi0JCQlzY2FuX2NoLT50eF9nYWluID0gKCgxIDw8IDUpIHwgKDUgPDwgMykpOwotCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FubmluZyBjaD0lZCBwcm9iPTB4JVggWyVzICVkXVxuIiwKLQkJCSAgICAgICBjaGFubmVsLCBsZTMyX3RvX2NwdShzY2FuX2NoLT50eXBlKSwKLQkJCSAgICAgICAoc2Nhbl9jaC0+dHlwZSAmIFNDQU5fQ0hBTk5FTF9UWVBFX0FDVElWRSkgPwotCQkJCSJBQ1RJVkUiIDogIlBBU1NJVkUiLAotCQkJICAgICAgIChzY2FuX2NoLT50eXBlICYgU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFKSA/Ci0JCQkgICAgICAgYWN0aXZlX2R3ZWxsIDogcGFzc2l2ZV9kd2VsbCk7Ci0KLQkJc2Nhbl9jaCsrOwotCQlhZGRlZCsrOwotCX0KLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJ0b3RhbCBjaGFubmVscyB0byBzY2FuICVkXG4iLCBhZGRlZCk7Ci0JcmV0dXJuIGFkZGVkOwotfQotCi1pbnQgaXdsNDk2NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9TQ0FOX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3NjYW5fY21kKSwKLQkJLmZsYWdzID0gQ01EX1NJWkVfSFVHRSwKLQl9OwotCXN0cnVjdCBpd2xfc2Nhbl9jbWQgKnNjYW47Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQl1MzIgcmF0ZV9mbGFncyA9IDA7Ci0JdTE2IGNtZF9sZW47Ci0JdTE2IHJ4X2NoYWluID0gMDsKLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7Ci0JdTggbl9wcm9iZXMgPSAwOwotCXU4IHJ4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQ7Ci0JdTggcmF0ZTsKLQlib29sIGlzX2FjdGl2ZSA9IGZhbHNlOwotCWludCAgY2hhbl9tb2Q7Ci0JdTggYWN0aXZlX2NoYWluczsKLQl1OCBzY2FuX3R4X2FudGVubmFzID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHZpZikKLQkJY3R4ID0gaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwotCi0JaWYgKCFwcml2LT5zY2FuX2NtZCkgewotCQlwcml2LT5zY2FuX2NtZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9jbWQpICsKLQkJCQkJIElXTF9NQVhfU0NBTl9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwcml2LT5zY2FuX2NtZCkgewotCQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwKLQkJCQkgICAgICAgImZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzY2FuXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCXNjYW4gPSBwcml2LT5zY2FuX2NtZDsKLQltZW1zZXQoc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9jbWQpICsgSVdMX01BWF9TQ0FOX1NJWkUpOwotCi0Jc2Nhbi0+cXVpZXRfcGxjcF90aCA9IElXTF9QTENQX1FVSUVUX1RIUkVTSDsKLQlzY2FuLT5xdWlldF90aW1lID0gSVdMX0FDVElWRV9RVUlFVF9USU1FOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYW55X2Fzc29jaWF0ZWQocHJpdikpIHsKLQkJdTE2IGludGVydmFsOwotCQl1MzIgZXh0cmE7Ci0JCXUzMiBzdXNwZW5kX3RpbWUgPSAxMDA7Ci0JCXUzMiBzY2FuX3N1c3BlbmRfdGltZSA9IDEwMDsKLQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2Nhbm5pbmcgd2hpbGUgYXNzb2NpYXRlZC4uLlxuIik7Ci0JCWludGVydmFsID0gdmlmLT5ic3NfY29uZi5iZWFjb25faW50OwotCi0JCXNjYW4tPnN1c3BlbmRfdGltZSA9IDA7Ci0JCXNjYW4tPm1heF9vdXRfdGltZSA9IGNwdV90b19sZTMyKDIwMCAqIDEwMjQpOwotCQlpZiAoIWludGVydmFsKQotCQkJaW50ZXJ2YWwgPSBzdXNwZW5kX3RpbWU7Ci0KLQkJZXh0cmEgPSAoc3VzcGVuZF90aW1lIC8gaW50ZXJ2YWwpIDw8IDIyOwotCQlzY2FuX3N1c3BlbmRfdGltZSA9IChleHRyYSB8Ci0JCSAgICAoKHN1c3BlbmRfdGltZSAlIGludGVydmFsKSAqIDEwMjQpKTsKLQkJc2Nhbi0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl9zdXNwZW5kX3RpbWUpOwotCQlJV0xfREVCVUdfU0NBTihwcml2LCAic3VzcGVuZF90aW1lIDB4JVggYmVhY29uIGludGVydmFsICVkXG4iLAotCQkJICAgICAgIHNjYW5fc3VzcGVuZF90aW1lLCBpbnRlcnZhbCk7Ci0JfQotCi0JaWYgKHByaXYtPnNjYW5fcmVxdWVzdC0+bl9zc2lkcykgewotCQlpbnQgaSwgcCA9IDA7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJLaWNraW5nIG9mZiBhY3RpdmUgc2NhblxuIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fc3NpZHM7IGkrKykgewotCQkJLyogYWx3YXlzIGRvZXMgd2lsZGNhcmQgYW55d2F5ICovCi0JCQlpZiAoIXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pCi0JCQkJY29udGludWU7Ci0JCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5pZCA9IFdMQU5fRUlEX1NTSUQ7Ci0JCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5sZW4gPQotCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW47Ci0JCQltZW1jcHkoc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uc3NpZCwKLQkJCSAgICAgICBwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWQsCi0JCQkgICAgICAgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbik7Ci0JCQluX3Byb2JlcysrOwotCQkJcCsrOwotCQl9Ci0JCWlzX2FjdGl2ZSA9IHRydWU7Ci0JfSBlbHNlCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTdGFydCBwYXNzaXZlIHNjYW4uXG4iKTsKLQotCXNjYW4tPnR4X2NtZC50eF9mbGFncyA9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7Ci0Jc2Nhbi0+dHhfY21kLnN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOwotCXNjYW4tPnR4X2NtZC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKLQotCXN3aXRjaCAocHJpdi0+c2Nhbl9iYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlzY2FuLT5mbGFncyA9IFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSzsKLQkJY2hhbl9tb2QgPSBsZTMyX3RvX2NwdSgKLQkJCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5mbGFncyAmCi0JCQkJCQlSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLKQotCQkJCSAgICAgICA+PiBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TOwotCQlpZiAoY2hhbl9tb2QgPT0gQ0hBTk5FTF9NT0RFX1BVUkVfNDApIHsKLQkJCXJhdGUgPSBJV0xfUkFURV82TV9QTENQOwotCQl9IGVsc2UgewotCQkJcmF0ZSA9IElXTF9SQVRFXzFNX1BMQ1A7Ci0JCQlyYXRlX2ZsYWdzID0gUkFURV9NQ1NfQ0NLX01TSzsKLQkJfQotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6Ci0JCXJhdGUgPSBJV0xfUkFURV82TV9QTENQOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfV0FSTihwcml2LCAiSW52YWxpZCBzY2FuIGJhbmRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqIElmIGFjdGl2ZSBzY2FubmluZyBpcyByZXF1ZXN0ZWQgYnV0IGEgY2VydGFpbiBjaGFubmVsIGlzCi0JICogbWFya2VkIHBhc3NpdmUsIHdlIGNhbiBkbyBhY3RpdmUgc2Nhbm5pbmcgaWYgd2UgZGV0ZWN0Ci0JICogdHJhbnNtaXNzaW9ucy4KLQkgKgotCSAqIFRoZXJlIGlzIGFuIGlzc3VlIHdpdGggc29tZSBmaXJtd2FyZSB2ZXJzaW9ucyB0aGF0IHRyaWdnZXJzCi0JICogYSBzeXNhc3NlcnQgb24gYSAiZ29vZCBDUkMgdGhyZXNob2xkIiBvZiB6ZXJvICg9PSBkaXNhYmxlZCksCi0JICogb24gYSByYWRhciBjaGFubmVsIGV2ZW4gdGhvdWdoIHRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgTk9UCi0JICogc2VuZCBwcm9iZXMuCi0JICoKLQkgKiBUaGUgImdvb2QgQ1JDIHRocmVzaG9sZCIgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3ZQotCSAqIG5lZWQgdG8gcmVjZWl2ZSBkdXJpbmcgb3VyIGR3ZWxsIHRpbWUgb24gYSBjaGFubmVsIGJlZm9yZQotCSAqIHNlbmRpbmcgb3V0IHByb2JlcyAtLSBzZXR0aW5nIHRoaXMgdG8gYSBodWdlIHZhbHVlIHdpbGwKLQkgKiBtZWFuIHdlIG5ldmVyIHJlYWNoIGl0LCBidXQgYXQgdGhlIHNhbWUgdGltZSB3b3JrIGFyb3VuZAotCSAqIHRoZSBhZm9yZW1lbnRpb25lZCBpc3N1ZS4gVGh1cyB1c2UgSVdMX0dPT0RfQ1JDX1RIX05FVkVSCi0JICogaGVyZSBpbnN0ZWFkIG9mIElXTF9HT09EX0NSQ19USF9ESVNBQkxFRC4KLQkgKi8KLQlzY2FuLT5nb29kX0NSQ190aCA9IGlzX2FjdGl2ZSA/IElXTF9HT09EX0NSQ19USF9ERUZBVUxUIDoKLQkJCQkJSVdMX0dPT0RfQ1JDX1RIX05FVkVSOwotCi0JYmFuZCA9IHByaXYtPnNjYW5fYmFuZDsKLQotCWlmIChwcml2LT5jZmctPnNjYW5fcnhfYW50ZW5uYXNbYmFuZF0pCi0JCXJ4X2FudCA9IHByaXYtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXTsKLQotCXByaXYtPnNjYW5fdHhfYW50W2JhbmRdID0gaXdsNDk2NV90b2dnbGVfdHhfYW50KHByaXYsCi0JCQkJCQlwcml2LT5zY2FuX3R4X2FudFtiYW5kXSwKLQkJCQkJCSAgICBzY2FuX3R4X2FudGVubmFzKTsKLQlyYXRlX2ZsYWdzIHw9IGl3bDQ5NjVfYW50X2lkeF90b19mbGFncyhwcml2LT5zY2FuX3R4X2FudFtiYW5kXSk7Ci0Jc2Nhbi0+dHhfY21kLnJhdGVfbl9mbGFncyA9IGl3bDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlLCByYXRlX2ZsYWdzKTsKLQotCS8qIEluIHBvd2VyIHNhdmUgbW9kZSB1c2Ugb25lIGNoYWluLCBvdGhlcndpc2UgdXNlIGFsbCBjaGFpbnMgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cykpIHsKLQkJLyogcnhfYW50IGhhcyBiZWVuIHNldCB0byBhbGwgdmFsaWQgY2hhaW5zIHByZXZpb3VzbHkgKi8KLQkJYWN0aXZlX2NoYWlucyA9IHJ4X2FudCAmCi0JCQkJKCh1OCkocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKSk7Ci0JCWlmICghYWN0aXZlX2NoYWlucykKLQkJCWFjdGl2ZV9jaGFpbnMgPSByeF9hbnQ7Ci0KLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgImNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWluczogJXVcbiIsCi0JCQkJcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKTsKLQotCQlyeF9hbnQgPSBpd2w0OTY1X2ZpcnN0X2FudGVubmEoYWN0aXZlX2NoYWlucyk7Ci0JfQotCi0JLyogTUlNTyBpcyBub3QgdXNlZCBoZXJlLCBidXQgdmFsdWUgaXMgcmVxdWlyZWQgKi8KLQlyeF9jaGFpbiB8PSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50IDw8IFJYT05fUlhfQ0hBSU5fVkFMSURfUE9TOwotCXJ4X2NoYWluIHw9IHJ4X2FudCA8PCBSWE9OX1JYX0NIQUlOX0ZPUkNFX01JTU9fU0VMX1BPUzsKLQlyeF9jaGFpbiB8PSByeF9hbnQgPDwgUlhPTl9SWF9DSEFJTl9GT1JDRV9TRUxfUE9TOwotCXJ4X2NoYWluIHw9IDB4MSA8PCBSWE9OX1JYX0NIQUlOX0RSSVZFUl9GT1JDRV9QT1M7Ci0Jc2Nhbi0+cnhfY2hhaW4gPSBjcHVfdG9fbGUxNihyeF9jaGFpbik7Ci0KLQljbWRfbGVuID0gaXdsX2xlZ2FjeV9maWxsX3Byb2JlX3JlcShwcml2LAotCQkJCQkoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2Nhbi0+ZGF0YSwKLQkJCQkJdmlmLT5hZGRyLAotCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllLAotCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllX2xlbiwKLQkJCQkJSVdMX01BWF9TQ0FOX1NJWkUgLSBzaXplb2YoKnNjYW4pKTsKLQlzY2FuLT50eF9jbWQubGVuID0gY3B1X3RvX2xlMTYoY21kX2xlbik7Ci0KLQlzY2FuLT5maWx0ZXJfZmxhZ3MgfD0gKFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLIHwKLQkJCSAgICAgICBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyk7Ci0KLQlzY2FuLT5jaGFubmVsX2NvdW50ID0gaXdsNDk2NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4ocHJpdiwgdmlmLCBiYW5kLAotCQkJCQkJaXNfYWN0aXZlLCBuX3Byb2JlcywKLQkJCQkJCSh2b2lkICopJnNjYW4tPmRhdGFbY21kX2xlbl0pOwotCWlmIChzY2FuLT5jaGFubmVsX2NvdW50ID09IDApIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgImNoYW5uZWwgY291bnQgJWRcbiIsIHNjYW4tPmNoYW5uZWxfY291bnQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQljbWQubGVuICs9IGxlMTZfdG9fY3B1KHNjYW4tPnR4X2NtZC5sZW4pICsKLQkgICAgc2Nhbi0+Y2hhbm5lbF9jb3VudCAqIHNpemVvZihzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCk7Ci0JY21kLmRhdGEgPSBzY2FuOwotCXNjYW4tPmxlbiA9IGNwdV90b19sZTE2KGNtZC5sZW4pOwotCi0Jc2V0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJY2xlYXJfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBpd2w0OTY1X21hbmFnZV9pYnNzX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGJvb2wgYWRkKQotewotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCi0JaWYgKGFkZCkKLQkJcmV0dXJuIGl3bDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24ocHJpdiwgdmlmX3ByaXYtPmN0eCwKLQkJCQkJCXZpZi0+YnNzX2NvbmYuYnNzaWQsCi0JCQkJCQkmdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkKTsKLQlyZXR1cm4gaXdsX2xlZ2FjeV9yZW1vdmVfc3RhdGlvbihwcml2LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQsCi0JCQkJICB2aWYtPmJzc19jb25mLmJzc2lkKTsKLX0KLQotdm9pZCBpd2w0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnN0YV9sb2NrKTsKLQotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgPj0gZnJlZWQpCi0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSAtPSBmcmVlZDsKLQllbHNlIHsKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJmcmVlIG1vcmUgdGhhbiB0ZmRzX2luX3F1ZXVlICgldTolZClcbiIsCi0JCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUsCi0JCQlmcmVlZCk7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSA9IDA7Ci0JfQotfQotCi0jZGVmaW5lIElXTF9UWF9RVUVVRV9NU0sJMHhmZmZmZgotCi1zdGF0aWMgYm9vbCBpd2w0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID09IElFRUU4MDIxMV9TTVBTX1NUQVRJQyB8fAotCSAgICAgICBwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zaW5nbGVfY2hhaW5fc3VmZmljaWVudDsKLX0KLQotI2RlZmluZSBJV0xfTlVNX1JYX0NIQUlOU19NVUxUSVBMRQkzCi0jZGVmaW5lIElXTF9OVU1fUlhfQ0hBSU5TX1NJTkdMRQkyCi0jZGVmaW5lIElXTF9OVU1fSURMRV9DSEFJTlNfRFVBTAkyCi0jZGVmaW5lIElXTF9OVU1fSURMRV9DSEFJTlNfU0lOR0xFCTEKLQotLyoKLSAqIERldGVybWluZSBob3cgbWFueSByZWNlaXZlci9hbnRlbm5hIGNoYWlucyB0byB1c2UuCi0gKgotICogTW9yZSBwcm92aWRlcyBiZXR0ZXIgcmVjZXB0aW9uIHZpYSBkaXZlcnNpdHkuICBGZXdlciBzYXZlcyBwb3dlcgotICogYXQgdGhlIGV4cGVuc2Ugb2YgdGhyb3VnaHB1dCwgYnV0IG9ubHkgd2hlbiBub3QgaW4gcG93ZXJzYXZlIHRvCi0gKiBzdGFydCB3aXRoLgotICoKLSAqIE1JTU8gKGR1YWwgc3RyZWFtKSByZXF1aXJlcyBhdCBsZWFzdCAyLCBidXQgd29ya3MgYmV0dGVyIHdpdGggMy4KLSAqIFRoaXMgZG9lcyBub3QgZGV0ZXJtaW5lICp3aGljaCogY2hhaW5zIHRvIHVzZSwganVzdCBob3cgbWFueS4KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X2dldF9hY3RpdmVfcnhfY2hhaW5fY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qICMgb2YgUnggY2hhaW5zIHRvIHVzZSB3aGVuIGV4cGVjdGluZyBNSU1PLiAqLwotCWlmIChpd2w0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0ocHJpdikpCi0JCXJldHVybiBJV0xfTlVNX1JYX0NIQUlOU19TSU5HTEU7Ci0JZWxzZQotCQlyZXR1cm4gSVdMX05VTV9SWF9DSEFJTlNfTVVMVElQTEU7Ci19Ci0KLS8qCi0gKiBXaGVuIHdlIGFyZSBpbiBwb3dlciBzYXZpbmcgbW9kZSwgdW5sZXNzIGRldmljZSBzdXBwb3J0IHNwYXRpYWwKLSAqIG11bHRpcGxleGluZyBwb3dlciBzYXZlLCB1c2UgdGhlIGFjdGl2ZSBjb3VudCBmb3IgcnggY2hhaW4gY291bnQuCi0gKi8KLXN0YXRpYyBpbnQKLWl3bDQ5NjVfZ2V0X2lkbGVfcnhfY2hhaW5fY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgYWN0aXZlX2NudCkKLXsKLQkvKiAjIFJ4IGNoYWlucyB3aGVuIGlkbGluZywgZGVwZW5kaW5nIG9uIFNNUFMgbW9kZSAqLwotCXN3aXRjaCAocHJpdi0+Y3VycmVudF9odF9jb25maWcuc21wcykgewotCWNhc2UgSUVFRTgwMjExX1NNUFNfU1RBVElDOgotCWNhc2UgSUVFRTgwMjExX1NNUFNfRFlOQU1JQzoKLQkJcmV0dXJuIElXTF9OVU1fSURMRV9DSEFJTlNfU0lOR0xFOwotCWNhc2UgSUVFRTgwMjExX1NNUFNfT0ZGOgotCQlyZXR1cm4gYWN0aXZlX2NudDsKLQlkZWZhdWx0OgotCQlXQVJOKDEsICJpbnZhbGlkIFNNUFMgbW9kZSAlZCIsCi0JCSAgICAgcHJpdi0+Y3VycmVudF9odF9jb25maWcuc21wcyk7Ci0JCXJldHVybiBhY3RpdmVfY250OwotCX0KLX0KLQotLyogdXAgdG8gNCBjaGFpbnMgKi8KLXN0YXRpYyB1OCBpd2w0OTY1X2NvdW50X2NoYWluX2JpdG1hcCh1MzIgY2hhaW5fYml0bWFwKQotewotCXU4IHJlczsKLQlyZXMgPSAoY2hhaW5fYml0bWFwICYgQklUKDApKSA+PiAwOwotCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDEpKSA+PiAxOwotCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDIpKSA+PiAyOwotCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDMpKSA+PiAzOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9zZXRfcnhvbl9jaGFpbiAtIFNldCB1cCBSeCBjaGFpbiB1c2FnZSBpbiAic3RhZ2luZyIgUlhPTiBpbWFnZQotICoKLSAqIFNlbGVjdHMgaG93IG1hbnkgYW5kIHdoaWNoIFJ4IHJlY2VpdmVycy9hbnRlbm5hcy9jaGFpbnMgdG8gdXNlLgotICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIHNjYW4gY29tbWFuZCAuLi4gaXQgcHV0cyBkYXRhIGluIHdyb25nIHBsYWNlLgotICovCi12b2lkIGl3bDQ5NjVfc2V0X3J4b25fY2hhaW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWJvb2wgaXNfc2luZ2xlID0gaXdsNDk2NV9pc19zaW5nbGVfcnhfc3RyZWFtKHByaXYpOwotCWJvb2wgaXNfY2FtID0gIXRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpOwotCXU4IGlkbGVfcnhfY250LCBhY3RpdmVfcnhfY250LCB2YWxpZF9yeF9jbnQ7Ci0JdTMyIGFjdGl2ZV9jaGFpbnM7Ci0JdTE2IHJ4X2NoYWluOwotCi0JLyogVGVsbCB1Q29kZSB3aGljaCBhbnRlbm5hcyBhcmUgYWN0dWFsbHkgY29ubmVjdGVkLgotCSAqIEJlZm9yZSBmaXJzdCBhc3NvY2lhdGlvbiwgd2UgYXNzdW1lIGFsbCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkLgotCSAqIEp1c3QgYWZ0ZXIgZmlyc3QgYXNzb2NpYXRpb24sIGl3bDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oKQotCSAqICAgIGNoZWNrcyB3aGljaCBhbnRlbm5hcyBhY3R1YWxseSAqYXJlKiBjb25uZWN0ZWQuICovCi0JaWYgKHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykKLQkJYWN0aXZlX2NoYWlucyA9IHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWluczsKLQllbHNlCi0JCWFjdGl2ZV9jaGFpbnMgPSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OwotCi0JcnhfY2hhaW4gPSBhY3RpdmVfY2hhaW5zIDw8IFJYT05fUlhfQ0hBSU5fVkFMSURfUE9TOwotCi0JLyogSG93IG1hbnkgcmVjZWl2ZXJzIHNob3VsZCB3ZSB1c2U/ICovCi0JYWN0aXZlX3J4X2NudCA9IGl3bDQ5NjVfZ2V0X2FjdGl2ZV9yeF9jaGFpbl9jb3VudChwcml2KTsKLQlpZGxlX3J4X2NudCA9IGl3bDQ5NjVfZ2V0X2lkbGVfcnhfY2hhaW5fY291bnQocHJpdiwgYWN0aXZlX3J4X2NudCk7Ci0KLQotCS8qIGNvcnJlY3QgcnggY2hhaW4gY291bnQgYWNjb3JkaW5nIGh3IHNldHRpbmdzCi0JICogYW5kIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uCi0JICovCi0JdmFsaWRfcnhfY250ID0gaXdsNDk2NV9jb3VudF9jaGFpbl9iaXRtYXAoYWN0aXZlX2NoYWlucyk7Ci0JaWYgKHZhbGlkX3J4X2NudCA8IGFjdGl2ZV9yeF9jbnQpCi0JCWFjdGl2ZV9yeF9jbnQgPSB2YWxpZF9yeF9jbnQ7Ci0KLQlpZiAodmFsaWRfcnhfY250IDwgaWRsZV9yeF9jbnQpCi0JCWlkbGVfcnhfY250ID0gdmFsaWRfcnhfY250OwotCi0JcnhfY2hhaW4gfD0gYWN0aXZlX3J4X2NudCA8PCBSWE9OX1JYX0NIQUlOX01JTU9fQ05UX1BPUzsKLQlyeF9jaGFpbiB8PSBpZGxlX3J4X2NudCAgPDwgUlhPTl9SWF9DSEFJTl9DTlRfUE9TOwotCi0JY3R4LT5zdGFnaW5nLnJ4X2NoYWluID0gY3B1X3RvX2xlMTYocnhfY2hhaW4pOwotCi0JaWYgKCFpc19zaW5nbGUgJiYgKGFjdGl2ZV9yeF9jbnQgPj0gSVdMX05VTV9SWF9DSEFJTlNfU0lOR0xFKSAmJiBpc19jYW0pCi0JCWN0eC0+c3RhZ2luZy5yeF9jaGFpbiB8PSBSWE9OX1JYX0NIQUlOX01JTU9fRk9SQ0VfTVNLOwotCWVsc2UKLQkJY3R4LT5zdGFnaW5nLnJ4X2NoYWluICY9IH5SWE9OX1JYX0NIQUlOX01JTU9fRk9SQ0VfTVNLOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJyeF9jaGFpbj0weCVYIGFjdGl2ZT0lZCBpZGxlPSVkXG4iLAotCQkJY3R4LT5zdGFnaW5nLnJ4X2NoYWluLAotCQkJYWN0aXZlX3J4X2NudCwgaWRsZV9yeF9jbnQpOwotCi0JV0FSTl9PTihhY3RpdmVfcnhfY250ID09IDAgfHwgaWRsZV9yeF9jbnQgPT0gMCB8fAotCQlhY3RpdmVfcnhfY250IDwgaWRsZV9yeF9jbnQpOwotfQotCi11OCBpd2w0OTY1X3RvZ2dsZV90eF9hbnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBhbnQsIHU4IHZhbGlkKQotewotCWludCBpOwotCXU4IGluZCA9IGFudDsKLQotCWZvciAoaSA9IDA7IGkgPCBSQVRFX0FOVF9OVU0gLSAxOyBpKyspIHsKLQkJaW5kID0gKGluZCArIDEpIDwgUkFURV9BTlRfTlVNID8gIGluZCArIDEgOiAwOwotCQlpZiAodmFsaWQgJiBCSVQoaW5kKSkKLQkJCXJldHVybiBpbmQ7Ci0JfQotCXJldHVybiBhbnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICppd2w0OTY1X2dldF9maF9zdHJpbmcoaW50IGNtZCkKLXsKLQlzd2l0Y2ggKGNtZCkgewotCUlXTF9DTUQoRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRyk7Ci0JSVdMX0NNRChGSF9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRyk7Ci0JSVdMX0NNRChGSF9SU0NTUl9DSE5MMF9XUFRSKTsKLQlJV0xfQ01EKEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcpOwotCUlXTF9DTUQoRkhfTUVNX1JTU1JfU0hBUkVEX0NUUkxfUkVHKTsKLQlJV0xfQ01EKEZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcpOwotCUlXTF9DTUQoRkhfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWKTsKLQlJV0xfQ01EKEZIX1RTU1JfVFhfU1RBVFVTX1JFRyk7Ci0JSVdMX0NNRChGSF9UU1NSX1RYX0VSUk9SX1JFRyk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJVTktOT1dOIjsKLQl9Ci19Ci0KLWludCBpd2w0OTY1X2R1bXBfZmgoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpCi17Ci0JaW50IGk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaW50IHBvcyA9IDA7Ci0Jc2l6ZV90IGJ1ZnN6ID0gMDsKLSNlbmRpZgotCXN0YXRpYyBjb25zdCB1MzIgZmhfdGJsW10gPSB7Ci0JCUZIX1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcsCi0JCUZIX1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHLAotCQlGSF9SU0NTUl9DSE5MMF9XUFRSLAotCQlGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLAotCQlGSF9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcsCi0JCUZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcsCi0JCUZIX01FTV9SU1NSX1JYX0VOQUJMRV9FUlJfSVJRMkRSViwKLQkJRkhfVFNTUl9UWF9TVEFUVVNfUkVHLAotCQlGSF9UU1NSX1RYX0VSUk9SX1JFRwotCX07Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGRpc3BsYXkpIHsKLQkJYnVmc3ogPSBBUlJBWV9TSVpFKGZoX3RibCkgKiA0OCArIDQwOwotCQkqYnVmID0ga21hbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghKmJ1ZikKLQkJCXJldHVybiAtRU5PTUVNOwotCQlwb3MgKz0gc2NucHJpbnRmKCpidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJGSCByZWdpc3RlciB2YWx1ZXM6XG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmhfdGJsKTsgaSsrKSB7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKCpidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIgICUzNHM6IDBYJTA4eFxuIiwKLQkJCQlpd2w0OTY1X2dldF9maF9zdHJpbmcoZmhfdGJsW2ldKSwKLQkJCQlpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgZmhfdGJsW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0jZW5kaWYKLQlJV0xfRVJSKHByaXYsICJGSCByZWdpc3RlciB2YWx1ZXM6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgIEFSUkFZX1NJWkUoZmhfdGJsKTsgaSsrKSB7Ci0JCUlXTF9FUlIocHJpdiwgIiAgJTM0czogMFglMDh4XG4iLAotCQkJaXdsNDk2NV9nZXRfZmhfc3RyaW5nKGZoX3RibFtpXSksCi0JCQlpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgZmhfdGJsW2ldKSk7Ci0JfQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZWJlMjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0KLSNkZWZpbmUgSVdMNDk2NV9SU19OQU1FICJpd2wtNDk2NS1ycyIKLQotI2RlZmluZSBOVU1fVFJZX0JFRk9SRV9BTlRfVE9HR0xFIDEKLSNkZWZpbmUgSVdMX05VTUJFUl9UUlkgICAgICAxCi0jZGVmaW5lIElXTF9IVF9OVU1CRVJfVFJZICAgMwotCi0jZGVmaW5lIElXTF9SQVRFX01BWF9XSU5ET1cJCTYyCS8qICMgdHggaW4gaGlzdG9yeSB3aW5kb3cgKi8KLSNkZWZpbmUgSVdMX1JBVEVfTUlOX0ZBSUxVUkVfVEgJCTYJLyogbWluIGZhaWx1cmVzIHRvIGNhbGMgdHB0ICovCi0jZGVmaW5lIElXTF9SQVRFX01JTl9TVUNDRVNTX1RICQk4CS8qIG1pbiBzdWNjZXNzZXMgdG8gY2FsYyB0cHQgKi8KLQotLyogbWF4IGFsbG93ZWQgcmF0ZSBtaXNzIGJlZm9yZSBzeW5jIExRIGNtZCAqLwotI2RlZmluZSBJV0xfTUlTU0VEX1JBVEVfTUFYCQkxNQotLyogbWF4IHRpbWUgdG8gYWNjdW0gaGlzdG9yeSAyIHNlY29uZHMgKi8KLSNkZWZpbmUgSVdMX1JBVEVfU0NBTEVfRkxVU0hfSU5UVkwgICAoMypIWikKLQotc3RhdGljIHU4IHJzX2h0X3RvX2xlZ2FjeVtdID0gewotCUlXTF9SQVRFXzZNX0lOREVYLCBJV0xfUkFURV82TV9JTkRFWCwKLQlJV0xfUkFURV82TV9JTkRFWCwgSVdMX1JBVEVfNk1fSU5ERVgsCi0JSVdMX1JBVEVfNk1fSU5ERVgsCi0JSVdMX1JBVEVfNk1fSU5ERVgsIElXTF9SQVRFXzlNX0lOREVYLAotCUlXTF9SQVRFXzEyTV9JTkRFWCwgSVdMX1JBVEVfMThNX0lOREVYLAotCUlXTF9SQVRFXzI0TV9JTkRFWCwgSVdMX1JBVEVfMzZNX0lOREVYLAotCUlXTF9SQVRFXzQ4TV9JTkRFWCwgSVdMX1JBVEVfNTRNX0lOREVYCi19OwotCi1zdGF0aWMgY29uc3QgdTggYW50X3RvZ2dsZV9sb29rdXBbXSA9IHsKLQkvKkFOVF9OT05FIC0+ICovIEFOVF9OT05FLAotCS8qQU5UX0EgICAgLT4gKi8gQU5UX0IsCi0JLypBTlRfQiAgICAtPiAqLyBBTlRfQywKLQkvKkFOVF9BQiAgIC0+ICovIEFOVF9CQywKLQkvKkFOVF9DICAgIC0+ICovIEFOVF9BLAotCS8qQU5UX0FDICAgLT4gKi8gQU5UX0FCLAotCS8qQU5UX0JDICAgLT4gKi8gQU5UX0FDLAotCS8qQU5UX0FCQyAgLT4gKi8gQU5UX0FCQywKLX07Ci0KLSNkZWZpbmUgSVdMX0RFQ0xBUkVfUkFURV9JTkZPKHIsIHMsIGlwLCBpbiwgcnAsIHJuLCBwcCwgbnApICAgIFwKLQlbSVdMX1JBVEVfIyNyIyNNX0lOREVYXSA9IHsgSVdMX1JBVEVfIyNyIyNNX1BMQ1AsICAgICAgXAotCQkJCSAgICBJV0xfUkFURV9TSVNPXyMjcyMjTV9QTENQLCBcCi0JCQkJICAgIElXTF9SQVRFX01JTU8yXyMjcyMjTV9QTENQLFwKLQkJCQkgICAgSVdMX1JBVEVfIyNyIyNNX0lFRUUsICAgICAgXAotCQkJCSAgICBJV0xfUkFURV8jI2lwIyNNX0lOREVYLCAgICBcCi0JCQkJICAgIElXTF9SQVRFXyMjaW4jI01fSU5ERVgsICAgIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNycCMjTV9JTkRFWCwgICAgXAotCQkJCSAgICBJV0xfUkFURV8jI3JuIyNNX0lOREVYLCAgICBcCi0JCQkJICAgIElXTF9SQVRFXyMjcHAjI01fSU5ERVgsICAgIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNucCMjTV9JTkRFWCB9Ci0KLS8qCi0gKiBQYXJhbWV0ZXIgb3JkZXI6Ci0gKiAgIHJhdGUsIGh0IHJhdGUsIHByZXYgcmF0ZSwgbmV4dCByYXRlLCBwcmV2IHRnZyByYXRlLCBuZXh0IHRnZyByYXRlCi0gKgotICogSWYgdGhlcmUgaXNuJ3QgYSB2YWxpZCBuZXh0IG9yIHByZXZpb3VzIHJhdGUgdGhlbiBJTlYgaXMgdXNlZCB3aGljaAotICogbWFwcyB0byBJV0xfUkFURV9JTlZBTElECi0gKgotICovCi1jb25zdCBzdHJ1Y3QgaXdsX3JhdGVfaW5mbyBpd2xlZ2FjeV9yYXRlc1tJV0xfUkFURV9DT1VOVF0gPSB7Ci0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDEsIElOViwgSU5WLCAyLCBJTlYsIDIsIElOViwgMiksICAgIC8qICAxbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTygyLCBJTlYsIDEsIDUsIDEsIDUsIDEsIDUpLCAgICAgICAgICAvKiAgMm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNSwgSU5WLCAyLCA2LCAyLCAxMSwgMiwgMTEpLCAgICAgICAgLyo1LjVtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDExLCBJTlYsIDksIDEyLCA5LCAxMiwgNSwgMTgpLCAgICAgIC8qIDExbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg2LCA2LCA1LCA5LCA1LCAxMSwgNSwgMTEpLCAgICAgICAgLyogIDZtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDksIDYsIDYsIDExLCA2LCAxMSwgNSwgMTEpLCAgICAgICAvKiAgOW1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTIsIDEyLCAxMSwgMTgsIDExLCAxOCwgMTEsIDE4KSwgICAvKiAxMm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTgsIDE4LCAxMiwgMjQsIDEyLCAyNCwgMTEsIDI0KSwgICAvKiAxOG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMjQsIDI0LCAxOCwgMzYsIDE4LCAzNiwgMTgsIDM2KSwgICAvKiAyNG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMzYsIDM2LCAyNCwgNDgsIDI0LCA0OCwgMjQsIDQ4KSwgICAvKiAzNm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNDgsIDQ4LCAzNiwgNTQsIDM2LCA1NCwgMzYsIDU0KSwgICAvKiA0OG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNTQsIDU0LCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA1NG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNjAsIDYwLCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA2MG1icHMgKi8KLX07Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgodTMyIHJhdGVfbl9mbGFncykKLXsKLQlpbnQgaWR4ID0gMDsKLQotCS8qIEhUIHJhdGUgZm9ybWF0ICovCi0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgewotCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7Ci0KLQkJaWYgKGlkeCA+PSBJV0xfUkFURV9NSU1PMl82TV9QTENQKQotCQkJaWR4ID0gaWR4IC0gSVdMX1JBVEVfTUlNTzJfNk1fUExDUDsKLQotCQlpZHggKz0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJLyogc2tpcCA5TSBub3Qgc3VwcG9ydGVkIGluIGh0Ki8KLQkJaWYgKGlkeCA+PSBJV0xfUkFURV85TV9JTkRFWCkKLQkJCWlkeCArPSAxOwotCQlpZiAoKGlkeCA+PSBJV0xfRklSU1RfT0ZETV9SQVRFKSAmJiAoaWR4IDw9IElXTF9MQVNUX09GRE1fUkFURSkpCi0JCQlyZXR1cm4gaWR4OwotCi0JLyogbGVnYWN5IHJhdGUgZm9ybWF0LCBzZWFyY2ggZm9yIG1hdGNoIGluIHRhYmxlICovCi0JfSBlbHNlIHsKLQkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKGl3bGVnYWN5X3JhdGVzKTsgaWR4KyspCi0JCQlpZiAoaXdsZWdhY3lfcmF0ZXNbaWR4XS5wbGNwID09IChyYXRlX25fZmxhZ3MgJiAweEZGKSkKLQkJCQlyZXR1cm4gaWR4OwotCX0KLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19yYXRlX3NjYWxlX3BlcmZvcm0oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQkgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhKTsKLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfZmlsbF9saW5rX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIHUzMiByYXRlX25fZmxhZ3MpOwotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJCWJvb2wgZm9yY2Vfc2VhcmNoKTsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3Moc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgdTMyICpyYXRlX25fZmxhZ3MsIGludCBpbmRleCk7Ci0jZWxzZQotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19kYmdmc19zZXRfbWNzKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkgICAgIHUzMiAqcmF0ZV9uX2ZsYWdzLCBpbnQgaW5kZXgpCi17fQotI2VuZGlmCi0KLS8qKgotICogVGhlIGZvbGxvd2luZyB0YWJsZXMgY29udGFpbiB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBtZXRyaWNzIGZvciBhbGwgcmF0ZXMKLSAqCi0gKgkxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA2MCBNQml0cwotICoKLSAqIHdoZXJlIGludmFsaWQgZW50cmllcyBhcmUgemVyb3MuCi0gKgotICogQ0NLIHJhdGVzIGFyZSBvbmx5IHZhbGlkIGluIGxlZ2FjeSB0YWJsZSBhbmQgd2lsbCBvbmx5IGJlIHVzZWQgaW4gRwotICogKDIuNCBHSHopIGJhbmQuCi0gKi8KLQotc3RhdGljIHMzMiBleHBlY3RlZF90cHRfbGVnYWN5W0lXTF9SQVRFX0NPVU5UXSA9IHsKLQk3LCAxMywgMzUsIDU4LCA0MCwgNTcsIDcyLCA5OCwgMTIxLCAxNTQsIDE3NywgMTg2LCAwCi19OwotCi1zdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9zaXNvMjBNSHpbNF1bSVdMX1JBVEVfQ09VTlRdID0gewotCXswLCAwLCAwLCAwLCA0MiwgMCwgIDc2LCAxMDIsIDEyNCwgMTU4LCAxODMsIDE5MywgMjAyfSwgLyogTm9ybSAqLwotCXswLCAwLCAwLCAwLCA0NiwgMCwgIDgyLCAxMTAsIDEzMiwgMTY3LCAxOTIsIDIwMiwgMjEwfSwgLyogU0dJICovCi0JezAsIDAsIDAsIDAsIDQ4LCAwLCAgOTMsIDEzNSwgMTc2LCAyNTEsIDMxOSwgMzUxLCAzODF9LCAvKiBBR0cgKi8KLQl7MCwgMCwgMCwgMCwgNTMsIDAsIDEwMiwgMTQ5LCAxOTMsIDI3NSwgMzQ4LCAzODEsIDQxM30sIC8qIEFHRytTR0kgKi8KLX07Ci0KLXN0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X3Npc280ME1Iels0XVtJV0xfUkFURV9DT1VOVF0gPSB7Ci0JezAsIDAsIDAsIDAsICA3NywgMCwgMTI3LCAxNjAsIDE4NCwgMjIwLCAyNDIsIDI1MCwgMjU3fSwgLyogTm9ybSAqLwotCXswLCAwLCAwLCAwLCAgODMsIDAsIDEzNSwgMTY5LCAxOTMsIDIyOSwgMjUwLCAyNTcsIDI2NH0sIC8qIFNHSSAqLwotCXswLCAwLCAwLCAwLCAgOTYsIDAsIDE4MiwgMjU5LCAzMjgsIDQ1MSwgNTUzLCA1OTgsIDY0MH0sIC8qIEFHRyAqLwotCXswLCAwLCAwLCAwLCAxMDYsIDAsIDE5OSwgMjgyLCAzNTcsIDQ4NywgNTkzLCA2NDAsIDY4M30sIC8qIEFHRytTR0kgKi8KLX07Ci0KLXN0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X21pbW8yXzIwTUh6WzRdW0lXTF9SQVRFX0NPVU5UXSA9IHsKLQl7MCwgMCwgMCwgMCwgIDc0LCAwLCAxMjMsIDE1NSwgMTc5LCAyMTMsIDIzNSwgMjQzLCAyNTB9LCAvKiBOb3JtICovCi0JezAsIDAsIDAsIDAsICA4MSwgMCwgMTMxLCAxNjQsIDE4NywgMjIxLCAyNDIsIDI1MCwgMjU2fSwgLyogU0dJICovCi0JezAsIDAsIDAsIDAsICA5MiwgMCwgMTc1LCAyNTAsIDMxNywgNDM2LCA1MzQsIDU3OCwgNjE5fSwgLyogQUdHICovCi0JezAsIDAsIDAsIDAsIDEwMiwgMCwgMTkyLCAyNzMsIDM0NCwgNDcwLCA1NzMsIDYxOSwgNjYwfSwgLyogQUdHK1NHSSovCi19OwotCi1zdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9taW1vMl80ME1Iels0XVtJV0xfUkFURV9DT1VOVF0gPSB7Ci0JezAsIDAsIDAsIDAsIDEyMywgMCwgMTgyLCAyMTQsIDIzNSwgMjY0LCAyNzksIDI4NSwgMjg5fSwgLyogTm9ybSAqLwotCXswLCAwLCAwLCAwLCAxMzEsIDAsIDE5MSwgMjIyLCAyNDIsIDI3MCwgMjg0LCAyODksIDI5M30sIC8qIFNHSSAqLwotCXswLCAwLCAwLCAwLCAxODAsIDAsIDMyNywgNDQ2LCA1NDUsIDcwOCwgODI4LCA4NzgsIDkyMn0sIC8qIEFHRyAqLwotCXswLCAwLCAwLCAwLCAxOTcsIDAsIDM1NSwgNDgxLCA1ODQsIDc1MiwgODcyLCA5MjIsIDk2Nn0sIC8qIEFHRytTR0kgKi8KLX07Ci0KLS8qIG1icHMsIG1jcyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfcmF0ZV9tY3NfaW5mbyBpd2xfcmF0ZV9tY3NbSVdMX1JBVEVfQ09VTlRdID0gewotCXsgICIxIiwgIkJQU0sgRFNTUyJ9LAotCXsgICIyIiwgIlFQU0sgRFNTUyJ9LAotCXsiNS41IiwgIkJQU0sgQ0NLIn0sCi0JeyAiMTEiLCAiUVBTSyBDQ0sifSwKLQl7ICAiNiIsICJCUFNLIDEvMiJ9LAotCXsgICI5IiwgIkJQU0sgMS8yIn0sCi0JeyAiMTIiLCAiUVBTSyAxLzIifSwKLQl7ICIxOCIsICJRUFNLIDMvNCJ9LAotCXsgIjI0IiwgIjE2UUFNIDEvMiJ9LAotCXsgIjM2IiwgIjE2UUFNIDMvNCJ9LAotCXsgIjQ4IiwgIjY0UUFNIDIvMyJ9LAotCXsgIjU0IiwgIjY0UUFNIDMvNCJ9LAotCXsgIjYwIiwgIjY0UUFNIDUvNiJ9LAotfTsKLQotI2RlZmluZSBNQ1NfSU5ERVhfUEVSX1NUUkVBTQkoOCkKLQotc3RhdGljIGlubGluZSB1OCBpd2w0OTY1X3JzX2V4dHJhY3RfcmF0ZSh1MzIgcmF0ZV9uX2ZsYWdzKQotewotCXJldHVybiAodTgpKHJhdGVfbl9mbGFncyAmIDB4RkYpOwotfQotCi1zdGF0aWMgdm9pZAotaXdsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdyhzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSAqd2luZG93KQotewotCXdpbmRvdy0+ZGF0YSA9IDA7Ci0Jd2luZG93LT5zdWNjZXNzX2NvdW50ZXIgPSAwOwotCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA9IElXTF9JTlZBTElEX1ZBTFVFOwotCXdpbmRvdy0+Y291bnRlciA9IDA7Ci0Jd2luZG93LT5hdmVyYWdlX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCXdpbmRvdy0+c3RhbXAgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDQ5NjVfcnNfaXNfdmFsaWRfYW50KHU4IHZhbGlkX2FudGVubmEsIHU4IGFudF90eXBlKQotewotCXJldHVybiAoYW50X3R5cGUgJiB2YWxpZF9hbnRlbm5hKSA9PSBhbnRfdHlwZTsKLX0KLQotLyoKLSAqCXJlbW92ZXMgdGhlIG9sZCBkYXRhIGZyb20gdGhlIHN0YXRpc3RpY3MuIEFsbCBkYXRhIHRoYXQgaXMgb2xkZXIgdGhhbgotICoJVElEX01BWF9USU1FX0RJRkYsIHdpbGwgYmUgZGVsZXRlZC4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfcnNfdGxfcm1fb2xkX3N0YXRzKHN0cnVjdCBpd2xfdHJhZmZpY19sb2FkICp0bCwgdTMyIGN1cnJfdGltZSkKLXsKLQkvKiBUaGUgb2xkZXN0IGFnZSB3ZSB3YW50IHRvIGtlZXAgKi8KLQl1MzIgb2xkZXN0X3RpbWUgPSBjdXJyX3RpbWUgLSBUSURfTUFYX1RJTUVfRElGRjsKLQotCXdoaWxlICh0bC0+cXVldWVfY291bnQgJiYKLQkgICAgICAgKHRsLT50aW1lX3N0YW1wIDwgb2xkZXN0X3RpbWUpKSB7Ci0JCXRsLT50b3RhbCAtPSB0bC0+cGFja2V0X2NvdW50W3RsLT5oZWFkXTsKLQkJdGwtPnBhY2tldF9jb3VudFt0bC0+aGVhZF0gPSAwOwotCQl0bC0+dGltZV9zdGFtcCArPSBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HOwotCQl0bC0+cXVldWVfY291bnQtLTsKLQkJdGwtPmhlYWQrKzsKLQkJaWYgKHRsLT5oZWFkID49IFRJRF9RVUVVRV9NQVhfU0laRSkKLQkJCXRsLT5oZWFkID0gMDsKLQl9Ci19Ci0KLS8qCi0gKglpbmNyZW1lbnQgdHJhZmZpYyBsb2FkIHZhbHVlIGZvciB0aWQgYW5kIGFsc28gcmVtb3ZlCi0gKglhbnkgb2xkIHZhbHVlcyBpZiBwYXNzZWQgdGhlIGNlcnRhaW4gdGltZSBwZXJpb2QKLSAqLwotc3RhdGljIHU4IGl3bDQ5NjVfcnNfdGxfYWRkX3BhY2tldChzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfZGF0YSwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCi17Ci0JdTMyIGN1cnJfdGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyk7Ci0JdTMyIHRpbWVfZGlmZjsKLQlzMzIgaW5kZXg7Ci0Jc3RydWN0IGl3bF90cmFmZmljX2xvYWQgKnRsID0gTlVMTDsKLQl1OCB0aWQ7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXRpZCA9IHFjWzBdICYgMHhmOwotCX0gZWxzZQotCQlyZXR1cm4gTUFYX1RJRF9DT1VOVDsKLQotCWlmICh1bmxpa2VseSh0aWQgPj0gVElEX01BWF9MT0FEX0NPVU5UKSkKLQkJcmV0dXJuIE1BWF9USURfQ09VTlQ7Ci0KLQl0bCA9ICZscV9kYXRhLT5sb2FkW3RpZF07Ci0KLQljdXJyX3RpbWUgLT0gY3Vycl90aW1lICUgVElEX1JPVU5EX1ZBTFVFOwotCi0JLyogSGFwcGVucyBvbmx5IGZvciB0aGUgZmlyc3QgcGFja2V0LiBJbml0aWFsaXplIHRoZSBkYXRhICovCi0JaWYgKCEodGwtPnF1ZXVlX2NvdW50KSkgewotCQl0bC0+dG90YWwgPSAxOwotCQl0bC0+dGltZV9zdGFtcCA9IGN1cnJfdGltZTsKLQkJdGwtPnF1ZXVlX2NvdW50ID0gMTsKLQkJdGwtPmhlYWQgPSAwOwotCQl0bC0+cGFja2V0X2NvdW50WzBdID0gMTsKLQkJcmV0dXJuIE1BWF9USURfQ09VTlQ7Ci0JfQotCi0JdGltZV9kaWZmID0gVElNRV9XUkFQX0FST1VORCh0bC0+dGltZV9zdGFtcCwgY3Vycl90aW1lKTsKLQlpbmRleCA9IHRpbWVfZGlmZiAvIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkc7Ci0KLQkvKiBUaGUgaGlzdG9yeSBpcyB0b28gbG9uZzogcmVtb3ZlIGRhdGEgdGhhdCBpcyBvbGRlciB0aGFuICovCi0JLyogVElEX01BWF9USU1FX0RJRkYgKi8KLQlpZiAoaW5kZXggPj0gVElEX1FVRVVFX01BWF9TSVpFKQotCQlpd2w0OTY1X3JzX3RsX3JtX29sZF9zdGF0cyh0bCwgY3Vycl90aW1lKTsKLQotCWluZGV4ID0gKHRsLT5oZWFkICsgaW5kZXgpICUgVElEX1FVRVVFX01BWF9TSVpFOwotCXRsLT5wYWNrZXRfY291bnRbaW5kZXhdID0gdGwtPnBhY2tldF9jb3VudFtpbmRleF0gKyAxOwotCXRsLT50b3RhbCA9IHRsLT50b3RhbCArIDE7Ci0KLQlpZiAoKGluZGV4ICsgMSkgPiB0bC0+cXVldWVfY291bnQpCi0JCXRsLT5xdWV1ZV9jb3VudCA9IGluZGV4ICsgMTsKLQotCXJldHVybiB0aWQ7Ci19Ci0KLS8qCi0JZ2V0IHRoZSB0cmFmZmljIGxvYWQgdmFsdWUgZm9yIHRpZAotKi8KLXN0YXRpYyB1MzIgaXdsNDk2NV9yc190bF9nZXRfbG9hZChzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfZGF0YSwgdTggdGlkKQotewotCXUzMiBjdXJyX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOwotCXUzMiB0aW1lX2RpZmY7Ci0JczMyIGluZGV4OwotCXN0cnVjdCBpd2xfdHJhZmZpY19sb2FkICp0bCA9IE5VTEw7Ci0KLQlpZiAodGlkID49IFRJRF9NQVhfTE9BRF9DT1VOVCkKLQkJcmV0dXJuIDA7Ci0KLQl0bCA9ICYobHFfZGF0YS0+bG9hZFt0aWRdKTsKLQotCWN1cnJfdGltZSAtPSBjdXJyX3RpbWUgJSBUSURfUk9VTkRfVkFMVUU7Ci0KLQlpZiAoISh0bC0+cXVldWVfY291bnQpKQotCQlyZXR1cm4gMDsKLQotCXRpbWVfZGlmZiA9IFRJTUVfV1JBUF9BUk9VTkQodGwtPnRpbWVfc3RhbXAsIGN1cnJfdGltZSk7Ci0JaW5kZXggPSB0aW1lX2RpZmYgLyBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HOwotCi0JLyogVGhlIGhpc3RvcnkgaXMgdG9vIGxvbmc6IHJlbW92ZSBkYXRhIHRoYXQgaXMgb2xkZXIgdGhhbiAqLwotCS8qIFRJRF9NQVhfVElNRV9ESUZGICovCi0JaWYgKGluZGV4ID49IFRJRF9RVUVVRV9NQVhfU0laRSkKLQkJaXdsNDk2NV9yc190bF9ybV9vbGRfc3RhdHModGwsIGN1cnJfdGltZSk7Ci0KLQlyZXR1cm4gdGwtPnRvdGFsOwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfdGxfdHVybl9vbl9hZ2dfZm9yX3RpZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX2RhdGEsIHU4IHRpZCwKLQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCWludCByZXQgPSAtRUFHQUlOOwotCXUzMiBsb2FkOwotCi0JbG9hZCA9IGl3bDQ5NjVfcnNfdGxfZ2V0X2xvYWQobHFfZGF0YSwgdGlkKTsKLQotCWlmIChsb2FkID4gSVdMX0FHR19MT0FEX1RIUkVTSE9MRCkgewotCQlJV0xfREVCVUdfSFQocHJpdiwgIlN0YXJ0aW5nIFR4IGFnZzogU1RBOiAlcE0gdGlkOiAlZFxuIiwKLQkJCQlzdGEtPmFkZHIsIHRpZCk7Ci0JCXJldCA9IGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkLCA1MDAwKTsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCQkvKgotCQkJICogZHJpdmVyIGFuZCBtYWM4MDIxMSBpcyBvdXQgb2Ygc3luYwotCQkJICogdGhpcyBtaWdodCBiZSBjYXVzZSBieSByZWxvYWRpbmcgZmlybXdhcmUKLQkJCSAqIHN0b3AgdGhlIHR4IGJhIHNlc3Npb24gaGVyZQotCQkJICovCi0JCQlJV0xfRVJSKHByaXYsICJGYWlsIHN0YXJ0IFR4IGFnZyBvbiB0aWQ6ICVkXG4iLAotCQkJCXRpZCk7Ci0JCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkKTsKLQkJfQotCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkFnZ3JlZ2F0aW9uIG5vdCBlbmFibGVkIGZvciB0aWQgJWQgIgotCQkJImJlY2F1c2UgbG9hZCA9ICV1XG4iLCB0aWQsIGxvYWQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX3RsX3R1cm5fb25fYWdnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggdGlkLAotCQkJICAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX2RhdGEsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCWlmICh0aWQgPCBUSURfTUFYX0xPQURfQ09VTlQpCi0JCWl3bDQ5NjVfcnNfdGxfdHVybl9vbl9hZ2dfZm9yX3RpZChwcml2LCBscV9kYXRhLCB0aWQsIHN0YSk7Ci0JZWxzZQotCQlJV0xfRVJSKHByaXYsICJ0aWQgZXhjZWVkcyBtYXggbG9hZCBjb3VudDogJWQvJWRcbiIsCi0JCQl0aWQsIFRJRF9NQVhfTE9BRF9DT1VOVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bDQ5NjVfZ2V0X2l3bDQ5NjVfbnVtX29mX2FudF9mcm9tX3JhdGUodTMyIHJhdGVfbl9mbGFncykKLXsKLQlyZXR1cm4gISEocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FfTVNLKSArCi0JICAgICAgICEhKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9CX01TSykgKwotCSAgICAgICAhIShyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19BTlRfQ19NU0spOwotfQotCi0vKgotICogU3RhdGljIGZ1bmN0aW9uIHRvIGdldCB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBmcm9tIGFuIGl3bF9zY2FsZV90YmxfaW5mbwotICogdGhhdCB3cmFwcyBhIE5VTEwgcG9pbnRlciBjaGVjawotICovCi1zdGF0aWMgczMyCi1pd2w0OTY1X2dldF9leHBlY3RlZF90cHQoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgcnNfaW5kZXgpCi17Ci0JaWYgKHRibC0+ZXhwZWN0ZWRfdHB0KQotCQlyZXR1cm4gdGJsLT5leHBlY3RlZF90cHRbcnNfaW5kZXhdOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhIC0gVXBkYXRlIHRoZSBzdWNjZXNzL2ZhaWx1cmUgc2xpZGluZyB3aW5kb3cKLSAqCi0gKiBXZSBrZWVwIGEgc2xpZGluZyB3aW5kb3cgb2YgdGhlIGxhc3QgNjIgcGFja2V0cyB0cmFuc21pdHRlZAotICogYXQgdGhpcyByYXRlLiAgd2luZG93LT5kYXRhIGNvbnRhaW5zIHRoZSBiaXRtYXNrIG9mIHN1Y2Nlc3NmdWwKLSAqIHBhY2tldHMuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9yc19jb2xsZWN0X3R4X2RhdGEoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAotCQkJICAgICAgaW50IHNjYWxlX2luZGV4LCBpbnQgYXR0ZW1wdHMsIGludCBzdWNjZXNzZXMpCi17Ci0Jc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdyA9IE5VTEw7Ci0Jc3RhdGljIGNvbnN0IHU2NCBtYXNrID0gKCgodTY0KTEpIDw8IChJV0xfUkFURV9NQVhfV0lORE9XIC0gMSkpOwotCXMzMiBmYWlsX2NvdW50LCB0cHQ7Ci0KLQlpZiAoc2NhbGVfaW5kZXggPCAwIHx8IHNjYWxlX2luZGV4ID49IElXTF9SQVRFX0NPVU5UKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFNlbGVjdCB3aW5kb3cgZm9yIGN1cnJlbnQgdHggYml0IHJhdGUgKi8KLQl3aW5kb3cgPSAmKHRibC0+d2luW3NjYWxlX2luZGV4XSk7Ci0KLQkvKiBHZXQgZXhwZWN0ZWQgdGhyb3VnaHB1dCAqLwotCXRwdCA9IGl3bDQ5NjVfZ2V0X2V4cGVjdGVkX3RwdCh0YmwsIHNjYWxlX2luZGV4KTsKLQotCS8qCi0JICogS2VlcCB0cmFjayBvZiBvbmx5IHRoZSBsYXRlc3QgNjIgdHggZnJhbWUgYXR0ZW1wdHMgaW4gdGhpcyByYXRlJ3MKLQkgKiBoaXN0b3J5IHdpbmRvdzsgYW55dGhpbmcgb2xkZXIgaXNuJ3QgcmVhbGx5IHJlbGV2YW50IGFueSBtb3JlLgotCSAqIElmIHdlIGhhdmUgZmlsbGVkIHVwIHRoZSBzbGlkaW5nIHdpbmRvdywgZHJvcCB0aGUgb2xkZXN0IGF0dGVtcHQ7Ci0JICogaWYgdGhlIG9sZGVzdCBhdHRlbXB0IChoaWdoZXN0IGJpdCBpbiBiaXRtYXApIHNob3dzICJzdWNjZXNzIiwKLQkgKiBzdWJ0cmFjdCAiMSIgZnJvbSB0aGUgc3VjY2VzcyBjb3VudGVyICh0aGlzIGlzIHRoZSBtYWluIHJlYXNvbgotCSAqIHdlIGtlZXAgdGhlc2UgYml0bWFwcyEpLgotCSAqLwotCXdoaWxlIChhdHRlbXB0cyA+IDApIHsKLQkJaWYgKHdpbmRvdy0+Y291bnRlciA+PSBJV0xfUkFURV9NQVhfV0lORE9XKSB7Ci0KLQkJCS8qIHJlbW92ZSBlYXJsaWVzdCAqLwotCQkJd2luZG93LT5jb3VudGVyID0gSVdMX1JBVEVfTUFYX1dJTkRPVyAtIDE7Ci0KLQkJCWlmICh3aW5kb3ctPmRhdGEgJiBtYXNrKSB7Ci0JCQkJd2luZG93LT5kYXRhICY9IH5tYXNrOwotCQkJCXdpbmRvdy0+c3VjY2Vzc19jb3VudGVyLS07Ci0JCQl9Ci0JCX0KLQotCQkvKiBJbmNyZW1lbnQgZnJhbWVzLWF0dGVtcHRlZCBjb3VudGVyICovCi0JCXdpbmRvdy0+Y291bnRlcisrOwotCi0JCS8qIFNoaWZ0IGJpdG1hcCBieSBvbmUgZnJhbWUgdG8gdGhyb3cgYXdheSBvbGRlc3QgaGlzdG9yeSAqLwotCQl3aW5kb3ctPmRhdGEgPDw9IDE7Ci0KLQkJLyogTWFyayB0aGUgbW9zdCByZWNlbnQgI3N1Y2Nlc3NlcyBhdHRlbXB0cyBhcyBzdWNjZXNzZnVsICovCi0JCWlmIChzdWNjZXNzZXMgPiAwKSB7Ci0JCQl3aW5kb3ctPnN1Y2Nlc3NfY291bnRlcisrOwotCQkJd2luZG93LT5kYXRhIHw9IDB4MTsKLQkJCXN1Y2Nlc3Nlcy0tOwotCQl9Ci0KLQkJYXR0ZW1wdHMtLTsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgY3VycmVudCBzdWNjZXNzIHJhdGlvLCBhdm9pZCBkaXZpZGUtYnktMCEgKi8KLQlpZiAod2luZG93LT5jb3VudGVyID4gMCkKLQkJd2luZG93LT5zdWNjZXNzX3JhdGlvID0gMTI4ICogKDEwMCAqIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyKQotCQkJCQkvIHdpbmRvdy0+Y291bnRlcjsKLQllbHNlCi0JCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA9IElXTF9JTlZBTElEX1ZBTFVFOwotCi0JZmFpbF9jb3VudCA9IHdpbmRvdy0+Y291bnRlciAtIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyOwotCi0JLyogQ2FsY3VsYXRlIGF2ZXJhZ2UgdGhyb3VnaHB1dCwgaWYgd2UgaGF2ZSBlbm91Z2ggaGlzdG9yeS4gKi8KLQlpZiAoKGZhaWxfY291bnQgPj0gSVdMX1JBVEVfTUlOX0ZBSUxVUkVfVEgpIHx8Ci0JICAgICh3aW5kb3ctPnN1Y2Nlc3NfY291bnRlciA+PSBJV0xfUkFURV9NSU5fU1VDQ0VTU19USCkpCi0JCXdpbmRvdy0+YXZlcmFnZV90cHQgPSAod2luZG93LT5zdWNjZXNzX3JhdGlvICogdHB0ICsgNjQpIC8gMTI4OwotCWVsc2UKLQkJd2luZG93LT5hdmVyYWdlX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCi0JLyogVGFnIHRoaXMgd2luZG93IGFzIGhhdmluZyBiZWVuIHVwZGF0ZWQgKi8KLQl3aW5kb3ctPnN0YW1wID0gamlmZmllczsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRmlsbCB1Q29kZSBBUEkgcmF0ZV9uX2ZsYWdzIGZpZWxkLCBiYXNlZCBvbiAic2VhcmNoIiBvciAiYWN0aXZlIiB0YWJsZS4KLSAqLwotc3RhdGljIHUzMiBpd2w0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwKLQkJCQkgaW50IGluZGV4LCB1OCB1c2VfZ3JlZW4pCi17Ci0JdTMyIHJhdGVfbl9mbGFncyA9IDA7Ci0KLQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKLQkJcmF0ZV9uX2ZsYWdzID0gaXdsZWdhY3lfcmF0ZXNbaW5kZXhdLnBsY3A7Ci0JCWlmIChpbmRleCA+PSBJV0xfRklSU1RfQ0NLX1JBVEUgJiYgaW5kZXggPD0gSVdMX0xBU1RfQ0NLX1JBVEUpCi0JCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKLQotCX0gZWxzZSBpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgewotCQlpZiAoaW5kZXggPiBJV0xfTEFTVF9PRkRNX1JBVEUpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkludmFsaWQgSFQgcmF0ZSBpbmRleCAlZFxuIiwgaW5kZXgpOwotCQkJaW5kZXggPSBJV0xfTEFTVF9PRkRNX1JBVEU7Ci0JCX0KLQkJcmF0ZV9uX2ZsYWdzID0gUkFURV9NQ1NfSFRfTVNLOwotCi0JCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCi0JCQlyYXRlX25fZmxhZ3MgfD0JaXdsZWdhY3lfcmF0ZXNbaW5kZXhdLnBsY3Bfc2lzbzsKLQkJZWxzZQotCQkJcmF0ZV9uX2ZsYWdzIHw9CWl3bGVnYWN5X3JhdGVzW2luZGV4XS5wbGNwX21pbW8yOwotCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgdGJsLT5scV90eXBlICVkXG4iLCB0YmwtPmxxX3R5cGUpOwotCX0KLQotCXJhdGVfbl9mbGFncyB8PSAoKHRibC0+YW50X3R5cGUgPDwgUkFURV9NQ1NfQU5UX1BPUykgJgotCQkJCQkJICAgICBSQVRFX01DU19BTlRfQUJDX01TSyk7Ci0KLQlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgewotCQlpZiAodGJsLT5pc19odDQwKSB7Ci0JCQlpZiAodGJsLT5pc19kdXApCi0JCQkJcmF0ZV9uX2ZsYWdzIHw9IFJBVEVfTUNTX0RVUF9NU0s7Ci0JCQllbHNlCi0JCQkJcmF0ZV9uX2ZsYWdzIHw9IFJBVEVfTUNTX0hUNDBfTVNLOwotCQl9Ci0JCWlmICh0YmwtPmlzX1NHSSkKLQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19TR0lfTVNLOwotCi0JCWlmICh1c2VfZ3JlZW4pIHsKLQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19HRl9NU0s7Ci0JCQlpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpICYmIHRibC0+aXNfU0dJKSB7Ci0JCQkJcmF0ZV9uX2ZsYWdzICY9IH5SQVRFX01DU19TR0lfTVNLOwotCQkJCUlXTF9FUlIocHJpdiwgIkdGIHdhcyBzZXQgd2l0aCBTR0k6U0lTT1xuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJhdGVfbl9mbGFnczsKLX0KLQotLyoKLSAqIEludGVycHJldCB1Q29kZSBBUEkncyByYXRlX25fZmxhZ3MgZm9ybWF0LAotICogZmlsbCAic2VhcmNoIiBvciAiYWN0aXZlIiB0eCBtb2RlIHRhYmxlLgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKGNvbnN0IHUzMiByYXRlX25fZmxhZ3MsCi0JCQkJICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgICAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAotCQkJCSAgICBpbnQgKnJhdGVfaWR4KQotewotCXUzMiBhbnRfbXNrID0gKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9BQkNfTVNLKTsKLQl1OCBpd2w0OTY1X251bV9vZl9hbnQgPSBpd2w0OTY1X2dldF9pd2w0OTY1X251bV9vZl9hbnRfZnJvbV9yYXRlKHJhdGVfbl9mbGFncyk7Ci0JdTggbWNzOwotCi0JbWVtc2V0KHRibCwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8pKTsKLQkqcmF0ZV9pZHggPSBpd2w0OTY1X2h3cmF0ZV90b19wbGNwX2lkeChyYXRlX25fZmxhZ3MpOwotCi0JaWYgKCpyYXRlX2lkeCAgPT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQkqcmF0ZV9pZHggPSAtMTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXRibC0+aXNfU0dJID0gMDsJLyogZGVmYXVsdCBsZWdhY3kgc2V0dXAgKi8KLQl0YmwtPmlzX2h0NDAgPSAwOwotCXRibC0+aXNfZHVwID0gMDsKLQl0YmwtPmFudF90eXBlID0gKGFudF9tc2sgPj4gUkFURV9NQ1NfQU5UX1BPUyk7Ci0JdGJsLT5scV90eXBlID0gTFFfTk9ORTsKLQl0YmwtPm1heF9zZWFyY2ggPSBJV0xfTUFYX1NFQVJDSDsKLQotCS8qIGxlZ2FjeSByYXRlIGZvcm1hdCAqLwotCWlmICghKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykpIHsKLQkJaWYgKGl3bDQ5NjVfbnVtX29mX2FudCA9PSAxKSB7Ci0JCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJCXRibC0+bHFfdHlwZSA9IExRX0E7Ci0JCQllbHNlCi0JCQkJdGJsLT5scV90eXBlID0gTFFfRzsKLQkJfQotCS8qIEhUIHJhdGUgZm9ybWF0ICovCi0JfSBlbHNlIHsKLQkJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX1NHSV9NU0spCi0JCQl0YmwtPmlzX1NHSSA9IDE7Ci0KLQkJaWYgKChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykgfHwKLQkJICAgIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19EVVBfTVNLKSkKLQkJCXRibC0+aXNfaHQ0MCA9IDE7Ci0KLQkJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0RVUF9NU0spCi0JCQl0YmwtPmlzX2R1cCA9IDE7Ci0KLQkJbWNzID0gaXdsNDk2NV9yc19leHRyYWN0X3JhdGUocmF0ZV9uX2ZsYWdzKTsKLQotCQkvKiBTSVNPICovCi0JCWlmIChtY3MgPD0gSVdMX1JBVEVfU0lTT182ME1fUExDUCkgewotCQkJaWYgKGl3bDQ5NjVfbnVtX29mX2FudCA9PSAxKQotCQkJCXRibC0+bHFfdHlwZSA9IExRX1NJU087IC8qZWxzZSBOT05FKi8KLQkJLyogTUlNTzIgKi8KLQkJfSBlbHNlIHsKLQkJCWlmIChpd2w0OTY1X251bV9vZl9hbnQgPT0gMikKLQkJCQl0YmwtPmxxX3R5cGUgPSBMUV9NSU1PMjsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogc3dpdGNoIHRvIGFub3RoZXIgYW50ZW5uYS9hbnRlbm5hcyBhbmQgcmV0dXJuIDEgKi8KLS8qIGlmIG5vIG90aGVyIHZhbGlkIGFudGVubmEgZm91bmQsIHJldHVybiAwICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodTMyIHZhbGlkX2FudCwgdTMyICpyYXRlX25fZmxhZ3MsCi0JCQkgICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCkKLXsKLQl1OCBuZXdfYW50X3R5cGU7Ci0KLQlpZiAoIXRibC0+YW50X3R5cGUgfHwgdGJsLT5hbnRfdHlwZSA+IEFOVF9BQkMpCi0JCXJldHVybiAwOwotCi0JaWYgKCFpd2w0OTY1X3JzX2lzX3ZhbGlkX2FudCh2YWxpZF9hbnQsIHRibC0+YW50X3R5cGUpKQotCQlyZXR1cm4gMDsKLQotCW5ld19hbnRfdHlwZSA9IGFudF90b2dnbGVfbG9va3VwW3RibC0+YW50X3R5cGVdOwotCi0Jd2hpbGUgKChuZXdfYW50X3R5cGUgIT0gdGJsLT5hbnRfdHlwZSkgJiYKLQkgICAgICAgIWl3bDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX2FudCwgbmV3X2FudF90eXBlKSkKLQkJbmV3X2FudF90eXBlID0gYW50X3RvZ2dsZV9sb29rdXBbbmV3X2FudF90eXBlXTsKLQotCWlmIChuZXdfYW50X3R5cGUgPT0gdGJsLT5hbnRfdHlwZSkKLQkJcmV0dXJuIDA7Ci0KLQl0YmwtPmFudF90eXBlID0gbmV3X2FudF90eXBlOwotCSpyYXRlX25fZmxhZ3MgJj0gflJBVEVfTUNTX0FOVF9BQkNfTVNLOwotCSpyYXRlX25fZmxhZ3MgfD0gbmV3X2FudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1M7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogR3JlZW4tZmllbGQgbW9kZSBpcyB2YWxpZCBpZiB0aGUgc3RhdGlvbiBzdXBwb3J0cyBpdCBhbmQKLSAqIHRoZXJlIGFyZSBubyBub24tR0Ygc3RhdGlvbnMgcHJlc2VudCBpbiB0aGUgQlNTLgotICovCi1zdGF0aWMgYm9vbCBpd2w0OTY1X3JzX3VzZV9ncmVlbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7Ci0KLQlyZXR1cm4gKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCkgJiYKLQkJIShjdHgtPmh0Lm5vbl9nZl9zdGFfcHJlc2VudCk7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9yc19nZXRfc3VwcG9ydGVkX3JhdGVzIC0gZ2V0IHRoZSBhdmFpbGFibGUgcmF0ZXMKLSAqCi0gKiBpZiBtYW5hZ2VtZW50IGZyYW1lIG9yIGJyb2FkY2FzdCBmcmFtZSBvbmx5IHJldHVybgotICogYmFzaWMgYXZhaWxhYmxlIHJhdGVzLgotICoKLSAqLwotc3RhdGljIHUxNiBpd2w0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMoc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJICBlbnVtIGl3bF90YWJsZV90eXBlIHJhdGVfdHlwZSkKLXsKLQlpZiAoaXNfbGVnYWN5KHJhdGVfdHlwZSkpIHsKLQkJcmV0dXJuIGxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlOwotCX0gZWxzZSB7Ci0JCWlmIChpc19zaXNvKHJhdGVfdHlwZSkpCi0JCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlOwotCQllbHNlCi0JCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZTsKLQl9Ci19Ci0KLXN0YXRpYyB1MTYKLWl3bDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBpbmRleCwgdTE2IHJhdGVfbWFzaywKLQkJCQlpbnQgcmF0ZV90eXBlKQotewotCXU4IGhpZ2ggPSBJV0xfUkFURV9JTlZBTElEOwotCXU4IGxvdyA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0KLQkvKiA4MDIuMTFBIG9yIGh0IHdhbGtzIHRvIHRoZSBuZXh0IGxpdGVyYWwgYWRqYWNlbnQgcmF0ZSBpbgotCSAqIHRoZSByYXRlIHRhYmxlICovCi0JaWYgKGlzX2FfYmFuZChyYXRlX3R5cGUpIHx8ICFpc19sZWdhY3kocmF0ZV90eXBlKSkgewotCQlpbnQgaTsKLQkJdTMyIG1hc2s7Ci0KLQkJLyogRmluZCB0aGUgcHJldmlvdXMgcmF0ZSB0aGF0IGlzIGluIHRoZSByYXRlIG1hc2sgKi8KLQkJaSA9IGluZGV4IC0gMTsKLQkJZm9yIChtYXNrID0gKDEgPDwgaSk7IGkgPj0gMDsgaS0tLCBtYXNrID4+PSAxKSB7Ci0JCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgewotCQkJCWxvdyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBGaW5kIHRoZSBuZXh0IHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCi0JCWkgPSBpbmRleCArIDE7Ci0JCWZvciAobWFzayA9ICgxIDw8IGkpOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKywgbWFzayA8PD0gMSkgewotCQkJaWYgKHJhdGVfbWFzayAmIG1hc2spIHsKLQkJCQloaWdoID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKLQl9Ci0KLQlsb3cgPSBpbmRleDsKLQl3aGlsZSAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJbG93ID0gaXdsZWdhY3lfcmF0ZXNbbG93XS5wcmV2X3JzOwotCQlpZiAobG93ID09IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlicmVhazsKLQkJaWYgKHJhdGVfbWFzayAmICgxIDw8IGxvdykpCi0JCQlicmVhazsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNraXBwaW5nIG1hc2tlZCBsb3dlciByYXRlOiAlZFxuIiwgbG93KTsKLQl9Ci0KLQloaWdoID0gaW5kZXg7Ci0Jd2hpbGUgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQloaWdoID0gaXdsZWdhY3lfcmF0ZXNbaGlnaF0ubmV4dF9yczsKLQkJaWYgKGhpZ2ggPT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJCWJyZWFrOwotCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgaGlnaCkpCi0JCQlicmVhazsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNraXBwaW5nIG1hc2tlZCBoaWdoZXIgcmF0ZTogJWRcbiIsIGhpZ2gpOwotCX0KLQotCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKLX0KLQotc3RhdGljIHUzMiBpd2w0OTY1X3JzX2dldF9sb3dlcl9yYXRlKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkgICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwKLQkJCSAgICAgdTggc2NhbGVfaW5kZXgsIHU4IGh0X3Bvc3NpYmxlKQotewotCXMzMiBsb3c7Ci0JdTE2IHJhdGVfbWFzazsKLQl1MTYgaGlnaF9sb3c7Ci0JdTggc3dpdGNoX3RvX2xlZ2FjeSA9IDA7Ci0JdTggaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGxxX3N0YS0+ZHJ2OwotCi0JLyogY2hlY2sgaWYgd2UgbmVlZCB0byBzd2l0Y2ggZnJvbSBIVCB0byBsZWdhY3kgcmF0ZXMuCi0JICogYXNzdW1wdGlvbiBpcyB0aGF0IG1hbmRhdG9yeSByYXRlcyAoMU1icHMgb3IgNk1icHMpCi0JICogYXJlIGFsd2F5cyBzdXBwb3J0ZWQgKHNwZWMgZGVtYW5kKSAqLwotCWlmICghaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkgJiYgKCFodF9wb3NzaWJsZSB8fCAhc2NhbGVfaW5kZXgpKSB7Ci0JCXN3aXRjaF90b19sZWdhY3kgPSAxOwotCQlzY2FsZV9pbmRleCA9IHJzX2h0X3RvX2xlZ2FjeVtzY2FsZV9pbmRleF07Ci0JCWlmIChscV9zdGEtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCXRibC0+bHFfdHlwZSA9IExRX0E7Ci0JCWVsc2UKLQkJCXRibC0+bHFfdHlwZSA9IExRX0c7Ci0KLQkJaWYgKGl3bDQ5NjVfbnVtX29mX2FudCh0YmwtPmFudF90eXBlKSA+IDEpCi0JCQl0YmwtPmFudF90eXBlID0KLQkJCQlpd2w0OTY1X2ZpcnN0X2FudGVubmEocHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCk7Ci0KLQkJdGJsLT5pc19odDQwID0gMDsKLQkJdGJsLT5pc19TR0kgPSAwOwotCQl0YmwtPm1heF9zZWFyY2ggPSBJV0xfTUFYX1NFQVJDSDsKLQl9Ci0KLQlyYXRlX21hc2sgPSBpd2w0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMobHFfc3RhLCBOVUxMLCB0YmwtPmxxX3R5cGUpOwotCi0JLyogTWFzayB3aXRoIHN0YXRpb24gcmF0ZSByZXN0cmljdGlvbiAqLwotCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgewotCQkvKiBzdXBwX3JhdGVzIGhhcyBubyBDQ0sgYml0cyBpbiBBIG1vZGUgKi8KLQkJaWYgKGxxX3N0YS0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJcmF0ZV9tYXNrICA9ICh1MTYpKHJhdGVfbWFzayAmCi0JCQkgICAobHFfc3RhLT5zdXBwX3JhdGVzIDw8IElXTF9GSVJTVF9PRkRNX1JBVEUpKTsKLQkJZWxzZQotCQkJcmF0ZV9tYXNrID0gKHUxNikocmF0ZV9tYXNrICYgbHFfc3RhLT5zdXBwX3JhdGVzKTsKLQl9Ci0KLQkvKiBJZiB3ZSBzd2l0Y2hlZCBmcm9tIEhUIHRvIGxlZ2FjeSwgY2hlY2sgY3VycmVudCByYXRlICovCi0JaWYgKHN3aXRjaF90b19sZWdhY3kgJiYgKHJhdGVfbWFzayAmICgxIDw8IHNjYWxlX2luZGV4KSkpIHsKLQkJbG93ID0gc2NhbGVfaW5kZXg7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWhpZ2hfbG93ID0gaXdsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShscV9zdGEtPmRydiwKLQkJCQkJc2NhbGVfaW5kZXgsIHJhdGVfbWFzaywKLQkJCQkJdGJsLT5scV90eXBlKTsKLQlsb3cgPSBoaWdoX2xvdyAmIDB4ZmY7Ci0KLQlpZiAobG93ID09IElXTF9SQVRFX0lOVkFMSUQpCi0JCWxvdyA9IHNjYWxlX2luZGV4OwotCi1vdXQ6Ci0JcmV0dXJuIGl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGxxX3N0YS0+ZHJ2LCB0YmwsIGxvdywgaXNfZ3JlZW4pOwotfQotCi0vKgotICogU2ltcGxlIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIHJhdGUgc2NhbGUgdGFibGUgdHlwZXMKLSAqLwotc3RhdGljIGJvb2wgaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqYSwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICpiKQotewotCXJldHVybiAoYS0+bHFfdHlwZSA9PSBiLT5scV90eXBlKSAmJiAoYS0+YW50X3R5cGUgPT0gYi0+YW50X3R5cGUpICYmCi0JCShhLT5pc19TR0kgPT0gYi0+aXNfU0dJKTsKLX0KLQotLyoKLSAqIG1hYzgwMjExIHNlbmRzIHVzIFR4IHN0YXR1cwotICovCi1zdGF0aWMgdm9pZAotaXdsNDk2NV9yc190eF9zdGF0dXModm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWludCBsZWdhY3lfc3VjY2VzczsKLQlpbnQgcmV0cmllczsKLQlpbnQgcnNfaW5kZXgsIG1hY19pbmRleCwgaTsKLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0Jc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICp0YWJsZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilwcml2X3I7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCWVudW0gbWFjODAyMTFfcmF0ZV9jb250cm9sX2ZsYWdzIG1hY19mbGFnczsKLQl1MzIgdHhfcmF0ZTsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIHRibF90eXBlOwotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKmN1cnJfdGJsLCAqb3RoZXJfdGJsLCAqdG1wX3RibDsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OwotCi0JSVdMX0RFQlVHX1JBVEVfTElNSVQocHJpdiwKLQkJImdldCBmcmFtZSBhY2sgcmVzcG9uc2UsIHVwZGF0ZSByYXRlIHNjYWxlIHdpbmRvd1xuIik7Ci0KLQkvKiBUcmVhdCB1bmluaXRpYWxpemVkIHJhdGUgc2NhbGluZyBkYXRhIHNhbWUgYXMgbm9uLWV4aXN0aW5nLiAqLwotCWlmICghbHFfc3RhKSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJTdGF0aW9uIHJhdGUgc2NhbGluZyBub3QgY3JlYXRlZCB5ZXQuXG4iKTsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoIWxxX3N0YS0+ZHJ2KSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJSYXRlIHNjYWxpbmcgbm90IGluaXRpYWxpemVkIHlldC5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpIHx8Ci0JICAgIGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spCi0JCXJldHVybjsKLQotCS8qIFRoaXMgcGFja2V0IHdhcyBhZ2dyZWdhdGVkIGJ1dCBkb2Vzbid0IGNhcnJ5IHN0YXR1cyBpbmZvICovCi0JaWYgKChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpICYmCi0JICAgICEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVSkpCi0JCXJldHVybjsKLQotCS8qCi0JICogSWdub3JlIHRoaXMgVHggZnJhbWUgcmVzcG9uc2UgaWYgaXRzIGluaXRpYWwgcmF0ZSBkb2Vzbid0IG1hdGNoCi0JICogdGhhdCBvZiBsYXRlc3QgTGluayBRdWFsaXR5IGNvbW1hbmQuICBUaGVyZSBtYXkgYmUgc3RyYWdnbGVycwotCSAqIGZyb20gYSBwcmV2aW91cyBMaW5rIFF1YWxpdHkgY29tbWFuZCwgYnV0IHdlJ3JlIG5vIGxvbmdlciBpbnRlcmVzdGVkCi0JICogaW4gdGhvc2U7IHRoZXkncmUgZWl0aGVyIGZyb20gdGhlICJhY3RpdmUiIG1vZGUgd2hpbGUgd2UncmUgdHJ5aW5nCi0JICogdG8gY2hlY2sgInNlYXJjaCIgbW9kZSwgb3IgYSBwcmlvciAic2VhcmNoIiBtb2RlIGFmdGVyIHdlJ3ZlIG1vdmVkCi0JICogdG8gYSBuZXcgInNlYXJjaCIgbW9kZSAod2hpY2ggbWlnaHQgYmVjb21lIHRoZSBuZXcgImFjdGl2ZSIgbW9kZSkuCi0JICovCi0JdGFibGUgPSAmbHFfc3RhLT5scTsKLQl0eF9yYXRlID0gbGUzMl90b19jcHUodGFibGUtPnJzX3RhYmxlWzBdLnJhdGVfbl9mbGFncyk7Ci0JaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwKLQkJCSBwcml2LT5iYW5kLCAmdGJsX3R5cGUsICZyc19pbmRleCk7Ci0JaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJcnNfaW5kZXggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQltYWNfZmxhZ3MgPSBpbmZvLT5zdGF0dXMucmF0ZXNbMF0uZmxhZ3M7Ci0JbWFjX2luZGV4ID0gaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeDsKLQkvKiBGb3IgSFQgcGFja2V0cywgbWFwIE1DUyB0byBQTENQICovCi0JaWYgKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKLQkJbWFjX2luZGV4ICY9IFJBVEVfTUNTX0NPREVfTVNLOwkvKiBSZW1vdmUgIyBvZiBzdHJlYW1zICovCi0JCWlmIChtYWNfaW5kZXggPj0gKElXTF9SQVRFXzlNX0lOREVYIC0gSVdMX0ZJUlNUX09GRE1fUkFURSkpCi0JCQltYWNfaW5kZXgrKzsKLQkJLyoKLQkJICogbWFjODAyMTEgSFQgaW5kZXggaXMgYWx3YXlzIHplcm8taW5kZXhlZDsgd2UgbmVlZCB0byBtb3ZlCi0JCSAqIEhUIE9GRE0gcmF0ZXMgYWZ0ZXIgQ0NLIHJhdGVzIGluIDIuNCBHSHogYmFuZAotCQkgKi8KLQkJaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKLQkJCW1hY19pbmRleCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCX0KLQkvKiBIZXJlIHdlIGFjdHVhbGx5IGNvbXBhcmUgdGhpcyByYXRlIHRvIHRoZSBsYXRlc3QgTFEgY29tbWFuZCAqLwotCWlmICgobWFjX2luZGV4IDwgMCkgfHwKLQkgICAgKHRibF90eXBlLmlzX1NHSSAhPQotCQkJISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKSkgfHwKLQkgICAgKHRibF90eXBlLmlzX2h0NDAgIT0KLQkJCSEhKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpKSB8fAotCSAgICAodGJsX3R5cGUuaXNfZHVwICE9Ci0JCQkhIShtYWNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfRFVQX0RBVEEpKSB8fAotCSAgICAodGJsX3R5cGUuYW50X3R5cGUgIT0gaW5mby0+YW50ZW5uYV9zZWxfdHgpIHx8Ci0JICAgICghISh0eF9yYXRlICYgUkFURV9NQ1NfSFRfTVNLKSAhPQotCQkJISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykpIHx8Ci0JICAgICghISh0eF9yYXRlICYgUkFURV9NQ1NfR0ZfTVNLKSAhPQotCQkJISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEKSkgfHwKLQkgICAgKHJzX2luZGV4ICE9IG1hY19pbmRleCkpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJImluaXRpYWwgcmF0ZSAlZCBkb2VzIG5vdCBtYXRjaCAlZCAoMHgleClcbiIsCi0JCQkgbWFjX2luZGV4LCByc19pbmRleCwgdHhfcmF0ZSk7Ci0JCS8qCi0JCSAqIFNpbmNlIHJhdGVzIG1pcy1tYXRjaCwgdGhlIGxhc3QgTFEgY29tbWFuZCBtYXkgaGF2ZSBmYWlsZWQuCi0JCSAqIEFmdGVyIElXTF9NSVNTRURfUkFURV9NQVggbWlzLW1hdGNoZXMsIHJlc3luYyB0aGUgdUNvZGUgd2l0aAotCQkgKiAuLi4gZHJpdmVyLgotCQkgKi8KLQkJbHFfc3RhLT5taXNzZWRfcmF0ZV9jb3VudGVyKys7Ci0JCWlmIChscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPiBJV0xfTUlTU0VEX1JBVEVfTUFYKSB7Ci0JCQlscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPSAwOwotCQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLAotCQkJCQkJCUNNRF9BU1lOQywgZmFsc2UpOwotCQl9Ci0JCS8qIFJlZ2FyZGxlc3MsIGlnbm9yZSB0aGlzIHN0YXR1cyBpbmZvIGZvciBvdXRkYXRlZCByYXRlICovCi0JCXJldHVybjsKLQl9IGVsc2UKLQkJLyogUmF0ZSBkaWQgbWF0Y2gsIHNvIHJlc2V0IHRoZSBtaXNzZWRfcmF0ZV9jb3VudGVyICovCi0JCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IDA7Ci0KLQkvKiBGaWd1cmUgb3V0IGlmIHJhdGUgc2NhbGUgYWxnb3JpdGhtIGlzIGluIGFjdGl2ZSBvciBzZWFyY2ggdGFibGUgKi8KLQlpZiAoaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLAotCQkJCSYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pKSkgewotCQljdXJyX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCQlvdGhlcl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JfSBlbHNlIGlmIChpd2w0OTY1X3RhYmxlX3R5cGVfbWF0Y2hlcygmdGJsX3R5cGUsCi0JCQkJJmxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSkpIHsKLQkJY3Vycl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JCW90aGVyX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkiTmVpdGhlciBhY3RpdmUgbm9yIHNlYXJjaCBtYXRjaGVzIHR4IHJhdGVcbiIpOwotCQl0bXBfdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJhY3RpdmUtIGxxOiV4LCBhbnQ6JXgsIFNHSTolZFxuIiwKLQkJCXRtcF90YmwtPmxxX3R5cGUsIHRtcF90YmwtPmFudF90eXBlLCB0bXBfdGJsLT5pc19TR0kpOwotCQl0bXBfdGJsID0gJihscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pOwotCQlJV0xfREVCVUdfUkFURShwcml2LCAic2VhcmNoLSBscToleCwgYW50OiV4LCBTR0k6JWRcbiIsCi0JCQl0bXBfdGJsLT5scV90eXBlLCB0bXBfdGJsLT5hbnRfdHlwZSwgdG1wX3RibC0+aXNfU0dJKTsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgImFjdHVhbC0gbHE6JXgsIGFudDoleCwgU0dJOiVkXG4iLAotCQkJdGJsX3R5cGUubHFfdHlwZSwgdGJsX3R5cGUuYW50X3R5cGUsIHRibF90eXBlLmlzX1NHSSk7Ci0JCS8qCi0JCSAqIG5vIG1hdGNoaW5nIHRhYmxlIGZvdW5kLCBsZXQncyBieS1wYXNzIHRoZSBkYXRhIGNvbGxlY3Rpb24KLQkJICogYW5kIGNvbnRpbnVlIHRvIHBlcmZvcm0gcmF0ZSBzY2FsZSB0byBmaW5kIHRoZSByYXRlIHRhYmxlCi0JCSAqLwotCQlpd2w0OTY1X3JzX3N0YXlfaW5fdGFibGUobHFfc3RhLCB0cnVlKTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qCi0JICogVXBkYXRpbmcgdGhlIGZyYW1lIGhpc3RvcnkgZGVwZW5kcyBvbiB3aGV0aGVyIHBhY2tldHMgd2VyZQotCSAqIGFnZ3JlZ2F0ZWQuCi0JICoKLQkgKiBGb3IgYWdncmVnYXRpb24sIGFsbCBwYWNrZXRzIHdlcmUgdHJhbnNtaXR0ZWQgYXQgdGhlIHNhbWUgcmF0ZSwgdGhlCi0JICogZmlyc3QgaW5kZXggaW50byByYXRlIHNjYWxlIHRhYmxlLgotCSAqLwotCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVKSB7Ci0JCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbMF0ucmF0ZV9uX2ZsYWdzKTsKLQkJaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwgcHJpdi0+YmFuZCwgJnRibF90eXBlLAotCQkJCSZyc19pbmRleCk7Ci0JCWl3bDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhKGN1cnJfdGJsLCByc19pbmRleCwKLQkJCQkgICBpbmZvLT5zdGF0dXMuYW1wZHVfbGVuLAotCQkJCSAgIGluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuKTsKLQotCQkvKiBVcGRhdGUgc3VjY2Vzcy9mYWlsIGNvdW50cyBpZiBub3Qgc2VhcmNoaW5nIGZvciBuZXcgbW9kZSAqLwotCQlpZiAobHFfc3RhLT5zdGF5X2luX3RibCkgewotCQkJbHFfc3RhLT50b3RhbF9zdWNjZXNzICs9IGluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuOwotCQkJbHFfc3RhLT50b3RhbF9mYWlsZWQgKz0gKGluZm8tPnN0YXR1cy5hbXBkdV9sZW4gLQotCQkJCQlpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbik7Ci0JCX0KLQl9IGVsc2UgewotCS8qCi0JICogRm9yIGxlZ2FjeSwgdXBkYXRlIGZyYW1lIGhpc3Rvcnkgd2l0aCBmb3IgZWFjaCBUeCByZXRyeS4KLQkgKi8KLQkJcmV0cmllcyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCAtIDE7Ci0JCS8qIEhXIGRvZXNuJ3Qgc2VuZCBtb3JlIHRoYW4gMTUgcmV0cmllcyAqLwotCQlyZXRyaWVzID0gbWluKHJldHJpZXMsIDE1KTsKLQotCQkvKiBUaGUgbGFzdCB0cmFuc21pc3Npb24gbWF5IGhhdmUgYmVlbiBzdWNjZXNzZnVsICovCi0JCWxlZ2FjeV9zdWNjZXNzID0gISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spOwotCQkvKiBDb2xsZWN0IGRhdGEgZm9yIGVhY2ggcmF0ZSB1c2VkIGR1cmluZyBmYWlsZWQgVFggYXR0ZW1wdHMgKi8KLQkJZm9yIChpID0gMDsgaSA8PSByZXRyaWVzOyArK2kpIHsKLQkJCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzKTsKLQkJCWl3bDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKHR4X3JhdGUsIHByaXYtPmJhbmQsCi0JCQkJCSZ0YmxfdHlwZSwgJnJzX2luZGV4KTsKLQkJCS8qCi0JCQkgKiBPbmx5IGNvbGxlY3Qgc3RhdHMgaWYgcmV0cmllZCByYXRlIGlzIGluIHRoZSBzYW1lIFJTCi0JCQkgKiB0YWJsZSBhcyBhY3RpdmUvc2VhcmNoLgotCQkJICovCi0JCQlpZiAoaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLCBjdXJyX3RibCkpCi0JCQkJdG1wX3RibCA9IGN1cnJfdGJsOwotCQkJZWxzZSBpZiAoaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLAotCQkJCQkJCQkgb3RoZXJfdGJsKSkKLQkJCQl0bXBfdGJsID0gb3RoZXJfdGJsOwotCQkJZWxzZQotCQkJCWNvbnRpbnVlOwotCQkJaXdsNDk2NV9yc19jb2xsZWN0X3R4X2RhdGEodG1wX3RibCwgcnNfaW5kZXgsIDEsCi0JCQkJCSAgIGkgPCByZXRyaWVzID8gMCA6IGxlZ2FjeV9zdWNjZXNzKTsKLQkJfQotCi0JCS8qIFVwZGF0ZSBzdWNjZXNzL2ZhaWwgY291bnRzIGlmIG5vdCBzZWFyY2hpbmcgZm9yIG5ldyBtb2RlICovCi0JCWlmIChscV9zdGEtPnN0YXlfaW5fdGJsKSB7Ci0JCQlscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgKz0gbGVnYWN5X3N1Y2Nlc3M7Ci0JCQlscV9zdGEtPnRvdGFsX2ZhaWxlZCArPSByZXRyaWVzICsgKDEgLSBsZWdhY3lfc3VjY2Vzcyk7Ci0JCX0KLQl9Ci0JLyogVGhlIGxhc3QgVFggcmF0ZSBpcyBjYWNoZWQgaW4gbHFfc3RhOyBpdCdzIHNldCBpbiBpZi9lbHNlIGFib3ZlICovCi0JbHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyA9IHR4X3JhdGU7Ci1kb25lOgotCS8qIFNlZSBpZiB0aGVyZSdzIGEgYmV0dGVyIHJhdGUgb3IgbW9kdWxhdGlvbiBtb2RlIHRvIHRyeS4gKi8KLQlpZiAoc3RhICYmIHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0pCi0JCWl3bDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHByaXYsIHNrYiwgc3RhLCBscV9zdGEpOwotfQotCi0vKgotICogQmVnaW4gYSBwZXJpb2Qgb2Ygc3RheWluZyB3aXRoIGEgc2VsZWN0ZWQgbW9kdWxhdGlvbiBtb2RlLgotICogU2V0ICJzdGF5X2luX3RibCIgZmxhZyB0byBwcmV2ZW50IGFueSBtb2RlIHN3aXRjaGVzLgotICogU2V0IGZyYW1lIHR4IHN1Y2Nlc3MgbGltaXRzIGFjY29yZGluZyB0byBsZWdhY3kgdnMuIGhpZ2gtdGhyb3VnaHB1dCwKLSAqIGFuZCByZXNldCBvdmVyYWxsIChzcGFubmluZyBhbGwgcmF0ZXMpIHR4IHN1Y2Nlc3MgaGlzdG9yeSBzdGF0aXN0aWNzLgotICogVGhlc2UgY29udHJvbCBob3cgbG9uZyB3ZSBzdGF5IHVzaW5nIHNhbWUgbW9kdWxhdGlvbiBtb2RlIGJlZm9yZQotICogc2VhcmNoaW5nIGZvciBhIG5ldyBtb2RlLgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX3NldF9zdGF5X2luX3RhYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaXNfbGVnYWN5LAotCQkJCSBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhKQotewotCUlXTF9ERUJVR19SQVRFKHByaXYsICJ3ZSBhcmUgc3RheWluZyBpbiB0aGUgc2FtZSB0YWJsZVxuIik7Ci0JbHFfc3RhLT5zdGF5X2luX3RibCA9IDE7CS8qIG9ubHkgcGxhY2UgdGhpcyBnZXRzIHNldCAqLwotCWlmIChpc19sZWdhY3kpIHsKLQkJbHFfc3RhLT50YWJsZV9jb3VudF9saW1pdCA9IElXTF9MRUdBQ1lfVEFCTEVfQ09VTlQ7Ci0JCWxxX3N0YS0+bWF4X2ZhaWx1cmVfbGltaXQgPSBJV0xfTEVHQUNZX0ZBSUxVUkVfTElNSVQ7Ci0JCWxxX3N0YS0+bWF4X3N1Y2Nlc3NfbGltaXQgPSBJV0xfTEVHQUNZX1NVQ0NFU1NfTElNSVQ7Ci0JfSBlbHNlIHsKLQkJbHFfc3RhLT50YWJsZV9jb3VudF9saW1pdCA9IElXTF9OT05FX0xFR0FDWV9UQUJMRV9DT1VOVDsKLQkJbHFfc3RhLT5tYXhfZmFpbHVyZV9saW1pdCA9IElXTF9OT05FX0xFR0FDWV9GQUlMVVJFX0xJTUlUOwotCQlscV9zdGEtPm1heF9zdWNjZXNzX2xpbWl0ID0gSVdMX05PTkVfTEVHQUNZX1NVQ0NFU1NfTElNSVQ7Ci0JfQotCWxxX3N0YS0+dGFibGVfY291bnQgPSAwOwotCWxxX3N0YS0+dG90YWxfZmFpbGVkID0gMDsKLQlscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgPSAwOwotCWxxX3N0YS0+Zmx1c2hfdGltZXIgPSBqaWZmaWVzOwotCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOwotfQotCi0vKgotICogRmluZCBjb3JyZWN0IHRocm91Z2hwdXQgdGFibGUgZm9yIGdpdmVuIG1vZGUgb2YgbW9kdWxhdGlvbgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUoc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwpCi17Ci0JLyogVXNlZCB0byBjaG9vc2UgYW1vbmcgSFQgdGFibGVzICovCi0JczMyICgqaHRfdGJsX3BvaW50ZXIpW0lXTF9SQVRFX0NPVU5UXTsKLQotCS8qIENoZWNrIGZvciBpbnZhbGlkIExRIHR5cGUgKi8KLQlpZiAoV0FSTl9PTl9PTkNFKCFpc19sZWdhY3kodGJsLT5scV90eXBlKSAmJiAhaXNfSHQodGJsLT5scV90eXBlKSkpIHsKLQkJdGJsLT5leHBlY3RlZF90cHQgPSBleHBlY3RlZF90cHRfbGVnYWN5OwotCQlyZXR1cm47Ci0JfQotCi0JLyogTGVnYWN5IHJhdGVzIGhhdmUgb25seSBvbmUgdGFibGUgKi8KLQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKLQkJdGJsLT5leHBlY3RlZF90cHQgPSBleHBlY3RlZF90cHRfbGVnYWN5OwotCQlyZXR1cm47Ci0JfQotCi0JLyogQ2hvb3NlIGFtb25nIG1hbnkgSFQgdGFibGVzIGRlcGVuZGluZyBvbiBudW1iZXIgb2Ygc3RyZWFtcwotCSAqIChTSVNPL01JTU8yKSwgY2hhbm5lbCB3aWR0aCAoMjAvNDApLCBTR0ksIGFuZCBhZ2dyZWdhdGlvbgotCSAqIHN0YXR1cyAqLwotCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkgJiYgKCF0YmwtPmlzX2h0NDAgfHwgbHFfc3RhLT5pc19kdXApKQotCQlodF90YmxfcG9pbnRlciA9IGV4cGVjdGVkX3RwdF9zaXNvMjBNSHo7Ci0JZWxzZSBpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpKQotCQlodF90YmxfcG9pbnRlciA9IGV4cGVjdGVkX3RwdF9zaXNvNDBNSHo7Ci0JZWxzZSBpZiAoaXNfbWltbzIodGJsLT5scV90eXBlKSAmJiAoIXRibC0+aXNfaHQ0MCB8fCBscV9zdGEtPmlzX2R1cCkpCi0JCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X21pbW8yXzIwTUh6OwotCWVsc2UgLyogaWYgKGlzX21pbW8yKHRibC0+bHFfdHlwZSkpIDwtLSBtdXN0IGJlIHRydWUgKi8KLQkJaHRfdGJsX3BvaW50ZXIgPSBleHBlY3RlZF90cHRfbWltbzJfNDBNSHo7Ci0KLQlpZiAoIXRibC0+aXNfU0dJICYmICFscV9zdGEtPmlzX2FnZykJCS8qIE5vcm1hbCAqLwotCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzBdOwotCWVsc2UgaWYgKHRibC0+aXNfU0dJICYmICFscV9zdGEtPmlzX2FnZykJLyogU0dJICovCi0JCXRibC0+ZXhwZWN0ZWRfdHB0ID0gaHRfdGJsX3BvaW50ZXJbMV07Ci0JZWxzZSBpZiAoIXRibC0+aXNfU0dJICYmIGxxX3N0YS0+aXNfYWdnKQkvKiBBR0cgKi8KLQkJdGJsLT5leHBlY3RlZF90cHQgPSBodF90YmxfcG9pbnRlclsyXTsKLQllbHNlCQkJCQkJLyogQUdHK1NHSSAqLwotCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzNdOwotfQotCi0vKgotICogRmluZCBzdGFydGluZyByYXRlIGZvciBuZXcgInNlYXJjaCIgaGlnaC10aHJvdWdocHV0IG1vZGUgb2YgbW9kdWxhdGlvbi4KLSAqIEdvYWwgaXMgdG8gZmluZCBsb3dlc3QgZXhwZWN0ZWQgcmF0ZSAodW5kZXIgcGVyZmVjdCBjb25kaXRpb25zKSB0aGF0IGlzCi0gKiBhYm92ZSB0aGUgY3VycmVudCBtZWFzdXJlZCB0aHJvdWdocHV0IG9mICJhY3RpdmUiIG1vZGUsIHRvIGdpdmUgbmV3IG1vZGUKLSAqIGEgZmFpciBjaGFuY2UgdG8gcHJvdmUgaXRzZWxmIHdpdGhvdXQgdG9vIG1hbnkgY2hhbGxlbmdlcy4KLSAqCi0gKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gdHJhbnNpdGlvbmluZyB0byBtb3JlIGFnZ3Jlc3NpdmUgbW9kdWxhdGlvbgotICogKGkuZS4gbGVnYWN5IHRvIFNJU08gb3IgTUlNTywgb3IgU0lTTyB0byBNSU1PKSwgYXMgd2VsbCBhcyBsZXNzIGFnZ3Jlc3NpdmUKLSAqIChpLmUuIE1JTU8gdG8gU0lTTykuICBXaGVuIG1vdmluZyB0byBNSU1PLCBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkCi0gKiB0byBkZWNyZWFzZSB0byBtYXRjaCAiYWN0aXZlIiB0aHJvdWdocHV0LiAgV2hlbiBtb3ZpbmcgZnJvbSBNSU1PIHRvIFNJU08sCi0gKiBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkIHRvIGluY3JlYXNlLCBidXQgbm90IGlmIHBlcmZvcm1hbmNlIHdhcyBiYWQuCi0gKi8KLXN0YXRpYyBzMzIgaXdsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhLAotCQkJICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwJLyogInNlYXJjaCIgKi8KLQkJCSAgICB1MTYgcmF0ZV9tYXNrLCBzOCBpbmRleCkKLXsKLQkvKiAiYWN0aXZlIiB2YWx1ZXMgKi8KLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICphY3RpdmVfdGJsID0KLQkgICAgJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JczMyIGFjdGl2ZV9zciA9IGFjdGl2ZV90YmwtPndpbltpbmRleF0uc3VjY2Vzc19yYXRpbzsKLQlzMzIgYWN0aXZlX3RwdCA9IGFjdGl2ZV90YmwtPmV4cGVjdGVkX3RwdFtpbmRleF07Ci0KLQkvKiBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICovCi0JczMyICp0cHRfdGJsID0gdGJsLT5leHBlY3RlZF90cHQ7Ci0KLQlzMzIgbmV3X3JhdGUsIGhpZ2gsIGxvdywgc3RhcnRfaGk7Ci0JdTE2IGhpZ2hfbG93OwotCXM4IHJhdGUgPSBpbmRleDsKLQotCW5ld19yYXRlID0gaGlnaCA9IGxvdyA9IHN0YXJ0X2hpID0gSVdMX1JBVEVfSU5WQUxJRDsKLQotCWZvciAoOyA7KSB7Ci0JCWhpZ2hfbG93ID0gaXdsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShwcml2LCByYXRlLCByYXRlX21hc2ssCi0JCQkJCQl0YmwtPmxxX3R5cGUpOwotCi0JCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKLQkJaGlnaCA9IChoaWdoX2xvdyA+PiA4KSAmIDB4ZmY7Ci0KLQkJLyoKLQkJICogTG93ZXIgdGhlICJzZWFyY2giIGJpdCByYXRlLCB0byBnaXZlIG5ldyAic2VhcmNoIiBtb2RlCi0JCSAqIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgdGhyb3VnaHB1dCBhcyAiYWN0aXZlIiBpZjoKLQkJICoKLQkJICogMSkgIkFjdGl2ZSIgbW9kZSBoYXMgYmVlbiB3b3JraW5nIG1vZGVzdGx5IHdlbGwgKGJ1dCBub3QKLQkJICogICAgZ3JlYXQpLCBhbmQgZXhwZWN0ZWQgInNlYXJjaCIgdGhyb3VnaHB1dCAodW5kZXIgcGVyZmVjdAotCQkgKiAgICBjb25kaXRpb25zKSBhdCBjYW5kaWRhdGUgcmF0ZSBpcyBhYm92ZSB0aGUgYWN0dWFsCi0JCSAqICAgIG1lYXN1cmVkICJhY3RpdmUiIHRocm91Z2hwdXQgKGJ1dCBsZXNzIHRoYW4gZXhwZWN0ZWQKLQkJICogICAgImFjdGl2ZSIgdGhyb3VnaHB1dCB1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpLgotCQkgKiBPUgotCQkgKiAyKSAiQWN0aXZlIiBtb2RlIGhhcyBiZWVuIHdvcmtpbmcgcGVyZmVjdGx5IG9yIHZlcnkgd2VsbAotCQkgKiAgICBhbmQgZXhwZWN0ZWQgInNlYXJjaCIgdGhyb3VnaHB1dCAodW5kZXIgcGVyZmVjdAotCQkgKiAgICBjb25kaXRpb25zKSBhdCBjYW5kaWRhdGUgcmF0ZSBpcyBhYm92ZSBleHBlY3RlZAotCQkgKiAgICAiYWN0aXZlIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpLgotCQkgKi8KLQkJaWYgKCgoKDEwMCAqIHRwdF90YmxbcmF0ZV0pID4gbHFfc3RhLT5sYXN0X3RwdCkgJiYKLQkJICAgICAoKGFjdGl2ZV9zciA+IElXTF9SQVRFX0RFQ1JFQVNFX1RIKSAmJgotCQkgICAgICAoYWN0aXZlX3NyIDw9IElXTF9SQVRFX0hJR0hfVEgpICYmCi0JCSAgICAgICh0cHRfdGJsW3JhdGVdIDw9IGFjdGl2ZV90cHQpKSkgfHwKLQkJICAgICgoYWN0aXZlX3NyID49IElXTF9SQVRFX1NDQUxFX1NXSVRDSCkgJiYKLQkJICAgICAodHB0X3RibFtyYXRlXSA+IGFjdGl2ZV90cHQpKSkgewotCi0JCQkvKiAoMm5kIG9yIGxhdGVyIHBhc3MpCi0JCQkgKiBJZiB3ZSd2ZSBhbHJlYWR5IHRyaWVkIHRvIHJhaXNlIHRoZSByYXRlLCBhbmQgYXJlCi0JCQkgKiBub3cgdHJ5aW5nIHRvIGxvd2VyIGl0LCB1c2UgdGhlIGhpZ2hlciByYXRlLiAqLwotCQkJaWYgKHN0YXJ0X2hpICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJCQluZXdfcmF0ZSA9IHN0YXJ0X2hpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQluZXdfcmF0ZSA9IHJhdGU7Ci0KLQkJCS8qIExvb3AgYWdhaW4gd2l0aCBsb3dlciByYXRlICovCi0JCQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQkJcmF0ZSA9IGxvdzsKLQotCQkJLyogTG93ZXIgcmF0ZSBub3QgYXZhaWxhYmxlLCB1c2UgdGhlIG9yaWdpbmFsICovCi0JCQllbHNlCi0JCQkJYnJlYWs7Ci0KLQkJLyogRWxzZSB0cnkgdG8gcmFpc2UgdGhlICJzZWFyY2giIHJhdGUgdG8gbWF0Y2ggImFjdGl2ZSIgKi8KLQkJfSBlbHNlIHsKLQkJCS8qICgybmQgb3IgbGF0ZXIgcGFzcykKLQkJCSAqIElmIHdlJ3ZlIGFscmVhZHkgdHJpZWQgdG8gbG93ZXIgdGhlIHJhdGUsIGFuZCBhcmUKLQkJCSAqIG5vdyB0cnlpbmcgdG8gcmFpc2UgaXQsIHVzZSB0aGUgbG93ZXIgcmF0ZS4gKi8KLQkJCWlmIChuZXdfcmF0ZSAhPSBJV0xfUkFURV9JTlZBTElEKQotCQkJCWJyZWFrOwotCi0JCQkvKiBMb29wIGFnYWluIHdpdGggaGlnaGVyIHJhdGUgKi8KLQkJCWVsc2UgaWYgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQkJCXN0YXJ0X2hpID0gaGlnaDsKLQkJCQlyYXRlID0gaGlnaDsKLQotCQkJLyogSGlnaGVyIHJhdGUgbm90IGF2YWlsYWJsZSwgdXNlIHRoZSBvcmlnaW5hbCAqLwotCQkJfSBlbHNlIHsKLQkJCQluZXdfcmF0ZSA9IHJhdGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3X3JhdGU7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgc2VhcmNoIHRhYmxlIGZvciBNSU1PMgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfc3dpdGNoX3RvX21pbW8yKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwsIGludCBpbmRleCkKLXsKLQl1MTYgcmF0ZV9tYXNrOwotCXMzMiByYXRlOwotCXM4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OwotCi0JaWYgKCFjb25mX2lzX2h0KGNvbmYpIHx8ICFzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpCi0JCXJldHVybiAtMTsKLQotCWlmICgoKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU01fUFMpID4+IDIpCi0JCQkJCQk9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpCi0JCXJldHVybiAtMTsKLQotCS8qIE5lZWQgYm90aCBUeCBjaGFpbnMvYW50ZW5uYXMgdG8gc3VwcG9ydCBNSU1PICovCi0JaWYgKHByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtIDwgMikKLQkJcmV0dXJuIC0xOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiB0cnkgdG8gc3dpdGNoIHRvIE1JTU8yXG4iKTsKLQotCXRibC0+bHFfdHlwZSA9IExRX01JTU8yOwotCXRibC0+aXNfZHVwID0gbHFfc3RhLT5pc19kdXA7Ci0JdGJsLT5hY3Rpb24gPSAwOwotCXRibC0+bWF4X3NlYXJjaCA9IElXTF9NQVhfU0VBUkNIOwotCXJhdGVfbWFzayA9IGxxX3N0YS0+YWN0aXZlX21pbW8yX3JhdGU7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19odDQwX3R4X2FsbG93ZWQocHJpdiwgY3R4LCAmc3RhLT5odF9jYXApKQotCQl0YmwtPmlzX2h0NDAgPSAxOwotCWVsc2UKLQkJdGJsLT5pc19odDQwID0gMDsKLQotCWl3bDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHRibCk7Ci0KLQlyYXRlID0gaXdsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHByaXYsIGxxX3N0YSwgdGJsLCByYXRlX21hc2ssIGluZGV4KTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogTUlNTzIgYmVzdCByYXRlICVkIG1hc2sgJVhcbiIsCi0JCQkJcmF0ZSwgcmF0ZV9tYXNrKTsKLQlpZiAoKHJhdGUgPT0gSVdMX1JBVEVfSU5WQUxJRCkgfHwgISgoMSA8PCByYXRlKSAmIHJhdGVfbWFzaykpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkiQ2FuJ3Qgc3dpdGNoIHdpdGggaW5kZXggJWQgcmF0ZSBtYXNrICV4XG4iLAotCQkJCQkJcmF0ZSwgcmF0ZV9tYXNrKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl0YmwtPmN1cnJlbnRfcmF0ZSA9IGl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHByaXYsCi0JCQkJCQkgdGJsLCByYXRlLCBpc19ncmVlbik7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFN3aXRjaCB0byBuZXcgbWNzICVYIGluZGV4IGlzIGdyZWVuICVYXG4iLAotCQkgICAgIHRibC0+Y3VycmVudF9yYXRlLCBpc19ncmVlbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgc2VhcmNoIHRhYmxlIGZvciBTSVNPCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9yc19zd2l0Y2hfdG9fc2lzbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgaW5kZXgpCi17Ci0JdTE2IHJhdGVfbWFzazsKLQl1OCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47Ci0JczMyIHJhdGU7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKLQotCWlmICghY29uZl9pc19odChjb25mKSB8fCAhc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKQotCQlyZXR1cm4gLTE7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IHRyeSB0byBzd2l0Y2ggdG8gU0lTT1xuIik7Ci0KLQl0YmwtPmlzX2R1cCA9IGxxX3N0YS0+aXNfZHVwOwotCXRibC0+bHFfdHlwZSA9IExRX1NJU087Ci0JdGJsLT5hY3Rpb24gPSAwOwotCXRibC0+bWF4X3NlYXJjaCA9IElXTF9NQVhfU0VBUkNIOwotCXJhdGVfbWFzayA9IGxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZChwcml2LCBjdHgsICZzdGEtPmh0X2NhcCkpCi0JCXRibC0+aXNfaHQ0MCA9IDE7Ci0JZWxzZQotCQl0YmwtPmlzX2h0NDAgPSAwOwotCi0JaWYgKGlzX2dyZWVuKQotCQl0YmwtPmlzX1NHSSA9IDA7IC8qMTFuIHNwZWM6IG5vIFNHSSBpbiBTSVNPK0dyZWVuZmllbGQqLwotCi0JaXdsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgdGJsKTsKLQlyYXRlID0gaXdsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHByaXYsIGxxX3N0YSwgdGJsLCByYXRlX21hc2ssIGluZGV4KTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogZ2V0IGJlc3QgcmF0ZSAlZCBtYXNrICVYXG4iLCByYXRlLCByYXRlX21hc2spOwotCWlmICgocmF0ZSA9PSBJV0xfUkFURV9JTlZBTElEKSB8fCAhKCgxIDw8IHJhdGUpICYgcmF0ZV9tYXNrKSkgewotCQlJV0xfREVCVUdfUkFURShwcml2LAotCQkJImNhbiBub3Qgc3dpdGNoIHdpdGggaW5kZXggJWQgcmF0ZSBtYXNrICV4XG4iLAotCQkJICAgICByYXRlLCByYXRlX21hc2spOwotCQlyZXR1cm4gLTE7Ci0JfQotCXRibC0+Y3VycmVudF9yYXRlID0gaXdsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwocHJpdiwKLQkJCQkJCXRibCwgcmF0ZSwgaXNfZ3JlZW4pOwotCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogU3dpdGNoIHRvIG5ldyBtY3MgJVggaW5kZXggaXMgZ3JlZW4gJVhcbiIsCi0JCSAgICAgdGJsLT5jdXJyZW50X3JhdGUsIGlzX2dyZWVuKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRyeSB0byBzd2l0Y2ggdG8gbmV3IG1vZHVsYXRpb24gbW9kZSBmcm9tIGxlZ2FjeQotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfbW92ZV9sZWdhY3lfb3RoZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJaW50IGluZGV4KQotewotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnNlYXJjaF90YmwgPQotCQkJCSYobHFfc3RhLT5scV9pbmZvWygxIC0gbHFfc3RhLT5hY3RpdmVfdGJsKV0pOwotCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cgPSAmKHRibC0+d2luW2luZGV4XSk7Ci0JdTMyIHN6ID0gKHNpemVvZihzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvKSAtCi0JCSAgKHNpemVvZihzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSkgKiBJV0xfUkFURV9DT1VOVCkpOwotCXU4IHN0YXJ0X2FjdGlvbjsKLQl1OCB2YWxpZF90eF9hbnQgPSBwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OwotCXU4IHR4X2NoYWluc19udW0gPSBwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKLQlpbnQgcmV0ID0gMDsKLQl1OCB1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMDsKLQotCXRibC0+YWN0aW9uID0gSVdMX0xFR0FDWV9TV0lUQ0hfU0lTTzsKLQotCXN0YXJ0X2FjdGlvbiA9IHRibC0+YWN0aW9uOwotCWZvciAoOyA7KSB7Ci0JCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKLQkJc3dpdGNoICh0YmwtPmFjdGlvbikgewotCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOgotCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkEyOgotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBMZWdhY3kgdG9nZ2xlIEFudGVubmFcbiIpOwotCi0JCQlpZiAoKHRibC0+YWN0aW9uID09IElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExICYmCi0JCQkJCQkJdHhfY2hhaW5zX251bSA8PSAxKSB8fAotCQkJICAgICh0YmwtPmFjdGlvbiA9PSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMiAmJgotCQkJCQkJCXR4X2NoYWluc19udW0gPD0gMikpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIERvbid0IGNoYW5nZSBhbnRlbm5hIGlmIHN1Y2Nlc3MgaGFzIGJlZW4gZ3JlYXQgKi8KLQkJCWlmICh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPj0gSVdMX1JTX0dPT0RfUkFUSU8pCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIFNldCB1cCBzZWFyY2ggdGFibGUgdG8gdHJ5IG90aGVyIGFudGVubmEgKi8KLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQotCQkJaWYgKGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCSZzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUsIHNlYXJjaF90YmwpKSB7Ci0JCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7Ci0JCQkJaXdsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwKLQkJCQkJCQkJc2VhcmNoX3RibCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9TSVNPOgotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBMZWdhY3kgc3dpdGNoIHRvIFNJU09cbiIpOwotCi0JCQkvKiBTZXQgdXAgc2VhcmNoIHRhYmxlIHRvIHRyeSBTSVNPICovCi0JCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7Ci0JCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAwOwotCQkJcmV0ID0gaXdsNDk2NV9yc19zd2l0Y2hfdG9fc2lzbyhwcml2LCBscV9zdGEsIGNvbmYsIHN0YSwKLQkJCQkJCSBzZWFyY2hfdGJsLCBpbmRleCk7Ci0JCQlpZiAoIXJldCkgewotCQkJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQlicmVhazsKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQjoKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQzoKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQzoKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogTGVnYWN5IHN3aXRjaCB0byBNSU1PMlxuIik7Ci0KLQkJCS8qIFNldCB1cCBzZWFyY2ggdGFibGUgdG8gdHJ5IE1JTU8gKi8KLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7Ci0KLQkJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQikKLQkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BQjsKLQkJCWVsc2UgaWYgKHRibC0+YWN0aW9uID09IElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FDKQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0FDOwotCQkJZWxzZQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0JDOwotCi0JCQlpZiAoIWl3bDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX3R4X2FudCwKLQkJCQkJCXNlYXJjaF90YmwtPmFudF90eXBlKSkKLQkJCQlicmVhazsKLQotCQkJcmV0ID0gaXdsNDk2NV9yc19zd2l0Y2hfdG9fbWltbzIocHJpdiwgbHFfc3RhLAotCQkJCQkJY29uZiwgc3RhLAotCQkJCQkJIHNlYXJjaF90YmwsIGluZGV4KTsKLQkJCWlmICghcmV0KSB7Ci0JCQkJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQl0YmwtPmFjdGlvbisrOwotCQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQykKLQkJCXRibC0+YWN0aW9uID0gSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTE7Ci0KLQkJaWYgKHRibC0+YWN0aW9uID09IHN0YXJ0X2FjdGlvbikKLQkJCWJyZWFrOwotCi0JfQotCXNlYXJjaF90YmwtPmxxX3R5cGUgPSBMUV9OT05FOwotCXJldHVybiAwOwotCi1vdXQ6Ci0JbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7Ci0JdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQykKLQkJdGJsLT5hY3Rpb24gPSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMTsKLQlpZiAodXBkYXRlX3NlYXJjaF90YmxfY291bnRlcikKLQkJc2VhcmNoX3RibC0+YWN0aW9uID0gdGJsLT5hY3Rpb247Ci0JcmV0dXJuIDA7Ci0KLX0KLQotLyoKLSAqIFRyeSB0byBzd2l0Y2ggdG8gbmV3IG1vZHVsYXRpb24gbW9kZSBmcm9tIFNJU08KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3JzX21vdmVfc2lzb190b19vdGhlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgaW50IGluZGV4KQotewotCXU4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICpzZWFyY2hfdGJsID0KLQkJCQkmKGxxX3N0YS0+bHFfaW5mb1soMSAtIGxxX3N0YS0+YWN0aXZlX3RibCldKTsKLQlzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSAqd2luZG93ID0gJih0YmwtPndpbltpbmRleF0pOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnN0YS0+aHRfY2FwOwotCXUzMiBzeiA9IChzaXplb2Yoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbykgLQotCQkgIChzaXplb2Yoc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEpICogSVdMX1JBVEVfQ09VTlQpKTsKLQl1OCBzdGFydF9hY3Rpb247Ci0JdTggdmFsaWRfdHhfYW50ID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQl1OCB0eF9jaGFpbnNfbnVtID0gcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW07Ci0JdTggdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDA7Ci0JaW50IHJldDsKLQotCXN0YXJ0X2FjdGlvbiA9IHRibC0+YWN0aW9uOwotCi0JZm9yICg7OykgewotCQlscV9zdGEtPmFjdGlvbl9jb3VudGVyKys7Ci0JCXN3aXRjaCAodGJsLT5hY3Rpb24pIHsKLQkJY2FzZSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQTE6Ci0JCWNhc2UgSVdMX1NJU09fU1dJVENIX0FOVEVOTkEyOgotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBTSVNPIHRvZ2dsZSBBbnRlbm5hXG4iKTsKLQkJCWlmICgodGJsLT5hY3Rpb24gPT0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExICYmCi0JCQkJCQl0eF9jaGFpbnNfbnVtIDw9IDEpIHx8Ci0JCQkgICAgKHRibC0+YWN0aW9uID09IElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMiAmJgotCQkJCQkJdHhfY2hhaW5zX251bSA8PSAyKSkKLQkJCQlicmVhazsKLQotCQkJaWYgKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUlNfR09PRF9SQVRJTykKLQkJCQlicmVhazsKLQotCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOwotCQkJaWYgKGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCSAgICAgICAmc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlLCBzZWFyY2hfdGJsKSkgewotCQkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSVdMX1NJU09fU1dJVENIX01JTU8yX0FCOgotCQljYXNlIElXTF9TSVNPX1NXSVRDSF9NSU1PMl9BQzoKLQkJY2FzZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQkM6Ci0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFNJU08gc3dpdGNoIHRvIE1JTU8yXG4iKTsKLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7Ci0KLQkJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUIpCi0JCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUI7Ci0JCQllbHNlIGlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUMpCi0JCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUM7Ci0JCQllbHNlCi0JCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQkM7Ci0KLQkJCWlmICghaXdsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LAotCQkJCQkJIHNlYXJjaF90YmwtPmFudF90eXBlKSkKLQkJCQlicmVhazsKLQotCQkJcmV0ID0gaXdsNDk2NV9yc19zd2l0Y2hfdG9fbWltbzIocHJpdiwgbHFfc3RhLAotCQkJCQkJY29uZiwgc3RhLAotCQkJCQkJIHNlYXJjaF90YmwsIGluZGV4KTsKLQkJCWlmICghcmV0KQotCQkJCWdvdG8gb3V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgSVdMX1NJU09fU1dJVENIX0dJOgotCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYgIShodF9jYXAtPmNhcCAmCi0JCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAodGJsLT5pc19odDQwICYmICEoaHRfY2FwLT5jYXAgJgotCQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQotCQkJCWJyZWFrOwotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFNJU08gdG9nZ2xlIFNHSS9OR0lcbiIpOwotCi0JCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7Ci0JCQlpZiAoaXNfZ3JlZW4pIHsKLQkJCQlpZiAoIXRibC0+aXNfU0dJKQotCQkJCQlicmVhazsKLQkJCQllbHNlCi0JCQkJCUlXTF9FUlIocHJpdiwKLQkJCQkJCSJTR0kgd2FzIHNldCBpbiBHRitTSVNPXG4iKTsKLQkJCX0KLQkJCXNlYXJjaF90YmwtPmlzX1NHSSA9ICF0YmwtPmlzX1NHSTsKLQkJCWl3bDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHNlYXJjaF90YmwpOwotCQkJaWYgKHRibC0+aXNfU0dJKSB7Ci0JCQkJczMyIHRwdCA9IGxxX3N0YS0+bGFzdF90cHQgLyAxMDA7Ci0JCQkJaWYgKHRwdCA+PSBzZWFyY2hfdGJsLT5leHBlY3RlZF90cHRbaW5kZXhdKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSA9Ci0JCQkJaXdsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwocHJpdiwgc2VhcmNoX3RibCwKLQkJCQkJCSAgICAgIGluZGV4LCBpc19ncmVlbik7Ci0JCQl1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXRibC0+YWN0aW9uKys7Ci0JCWlmICh0YmwtPmFjdGlvbiA+IElXTF9TSVNPX1NXSVRDSF9HSSkKLQkJCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOwotCi0JCWlmICh0YmwtPmFjdGlvbiA9PSBzdGFydF9hY3Rpb24pCi0JCQlicmVhazsKLQl9Ci0Jc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7Ci0JcmV0dXJuIDA7Ci0KLSBvdXQ6Ci0JbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7Ci0JdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfU0lTT19TV0lUQ0hfR0kpCi0JCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOwotCWlmICh1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyKQotCQlzZWFyY2hfdGJsLT5hY3Rpb24gPSB0YmwtPmFjdGlvbjsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogVHJ5IHRvIHN3aXRjaCB0byBuZXcgbW9kdWxhdGlvbiBtb2RlIGZyb20gTUlNTzIKLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3JzX21vdmVfbWltbzJfdG9fb3RoZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhLAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpbmRleCkKLXsKLQlzOCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqc2VhcmNoX3RibCA9Ci0JCQkJJihscV9zdGEtPmxxX2luZm9bKDEgLSBscV9zdGEtPmFjdGl2ZV90YmwpXSk7Ci0Jc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdyA9ICYodGJsLT53aW5baW5kZXhdKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKLQl1MzIgc3ogPSAoc2l6ZW9mKHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8pIC0KLQkJICAoc2l6ZW9mKHN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhKSAqIElXTF9SQVRFX0NPVU5UKSk7Ci0JdTggc3RhcnRfYWN0aW9uOwotCXU4IHZhbGlkX3R4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7Ci0JdTggdHhfY2hhaW5zX251bSA9IHByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtOwotCXU4IHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAwOwotCWludCByZXQ7Ci0KLQlzdGFydF9hY3Rpb24gPSB0YmwtPmFjdGlvbjsKLQlmb3IgKDs7KSB7Ci0JCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKLQkJc3dpdGNoICh0YmwtPmFjdGlvbikgewotCQljYXNlIElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE6Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9BTlRFTk5BMjoKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogTUlNTzIgdG9nZ2xlIEFudGVubmFzXG4iKTsKLQotCQkJaWYgKHR4X2NoYWluc19udW0gPD0gMikKLQkJCQlicmVhazsKLQotCQkJaWYgKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUlNfR09PRF9SQVRJTykKLQkJCQlicmVhazsKLQotCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOwotCQkJaWYgKGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCSAgICAgICAmc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlLCBzZWFyY2hfdGJsKSkgewotCQkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0E6Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0I6Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0M6Ci0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IE1JTU8yIHN3aXRjaCB0byBTSVNPXG4iKTsKLQotCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIFNJU08gKi8KLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQotCQkJaWYgKHRibC0+YWN0aW9uID09IElXTF9NSU1PMl9TV0lUQ0hfU0lTT19BKQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0E7Ci0JCQllbHNlIGlmICh0YmwtPmFjdGlvbiA9PSBJV0xfTUlNTzJfU1dJVENIX1NJU09fQikKLQkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9COwotCQkJZWxzZQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0M7Ci0KLQkJCWlmICghaXdsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LAotCQkJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUpKQotCQkJCWJyZWFrOwotCi0JCQlyZXQgPSBpd2w0OTY1X3JzX3N3aXRjaF90b19zaXNvKHByaXYsIGxxX3N0YSwKLQkJCQkJCWNvbmYsIHN0YSwKLQkJCQkJCSBzZWFyY2hfdGJsLCBpbmRleCk7Ci0JCQlpZiAoIXJldCkKLQkJCQlnb3RvIG91dDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJV0xfTUlNTzJfU1dJVENIX0dJOgotCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYgIShodF9jYXAtPmNhcCAmCi0JCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAodGJsLT5pc19odDQwICYmICEoaHRfY2FwLT5jYXAgJgotCQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQotCQkJCWJyZWFrOwotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IE1JTU8yIHRvZ2dsZSBTR0kvTkdJXG4iKTsKLQotCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIE1JTU8yICovCi0JCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7Ci0JCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAhdGJsLT5pc19TR0k7Ci0JCQlpd2w0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUobHFfc3RhLCBzZWFyY2hfdGJsKTsKLQkJCS8qCi0JCQkgKiBJZiBhY3RpdmUgdGFibGUgYWxyZWFkeSB1c2VzIHRoZSBmYXN0ZXN0IHBvc3NpYmxlCi0JCQkgKiBtb2R1bGF0aW9uIChkdWFsIHN0cmVhbSB3aXRoIHNob3J0IGd1YXJkIGludGVydmFsKSwKLQkJCSAqIGFuZCBpdCdzIHdvcmtpbmcgd2VsbCwgdGhlcmUncyBubyBuZWVkIHRvIGxvb2sKLQkJCSAqIGZvciBhIGJldHRlciB0eXBlIG9mIG1vZHVsYXRpb24hCi0JCQkgKi8KLQkJCWlmICh0YmwtPmlzX1NHSSkgewotCQkJCXMzMiB0cHQgPSBscV9zdGEtPmxhc3RfdHB0IC8gMTAwOwotCQkJCWlmICh0cHQgPj0gc2VhcmNoX3RibC0+ZXhwZWN0ZWRfdHB0W2luZGV4XSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUgPQotCQkJCWl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHByaXYsIHNlYXJjaF90YmwsCi0JCQkJCQkgICAgICBpbmRleCwgaXNfZ3JlZW4pOwotCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7Ci0JCQlnb3RvIG91dDsKLQotCQl9Ci0JCXRibC0+YWN0aW9uKys7Ci0JCWlmICh0YmwtPmFjdGlvbiA+IElXTF9NSU1PMl9TV0lUQ0hfR0kpCi0JCQl0YmwtPmFjdGlvbiA9IElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE7Ci0KLQkJaWYgKHRibC0+YWN0aW9uID09IHN0YXJ0X2FjdGlvbikKLQkJCWJyZWFrOwotCX0KLQlzZWFyY2hfdGJsLT5scV90eXBlID0gTFFfTk9ORTsKLQlyZXR1cm4gMDsKLSBvdXQ6Ci0JbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7Ci0JdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTUlNTzJfU1dJVENIX0dJKQotCQl0YmwtPmFjdGlvbiA9IElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE7Ci0JaWYgKHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIpCi0JCXNlYXJjaF90YmwtPmFjdGlvbiA9IHRibC0+YWN0aW9uOwotCi0JcmV0dXJuIDA7Ci0KLX0KLQotLyoKLSAqIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGNvbnRpbnVlIHVzaW5nIHNhbWUgbW9kdWxhdGlvbiBtb2RlLCBvcgotICogYmVnaW4gc2VhcmNoIGZvciBhIG5ldyBtb2RlLCBiYXNlZCBvbjoKLSAqIDEpICMgdHggc3VjY2Vzc2VzIG9yIGZhaWx1cmVzIHdoaWxlIHVzaW5nIHRoaXMgbW9kZQotICogMikgIyB0aW1lcyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KLSAqIDMpIGVsYXBzZWQgdGltZSBpbiB0aGlzIG1vZGUgKG5vdCB1c2VkLCBmb3Igbm93KQotICovCi1zdGF0aWMgdm9pZAotaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIGJvb2wgZm9yY2Vfc2VhcmNoKQotewotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibDsKLQlpbnQgaTsKLQlpbnQgYWN0aXZlX3RibDsKLQlpbnQgZmx1c2hfaW50ZXJ2YWxfcGFzc2VkID0gMDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0JYWN0aXZlX3RibCA9IGxxX3N0YS0+YWN0aXZlX3RibDsKLQotCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKLQotCS8qIElmIHdlJ3ZlIGJlZW4gZGlzYWxsb3dpbmcgc2VhcmNoLCBzZWUgaWYgd2Ugc2hvdWxkIG5vdyBhbGxvdyBpdCAqLwotCWlmIChscV9zdGEtPnN0YXlfaW5fdGJsKSB7Ci0KLQkJLyogRWxhcHNlZCB0aW1lIHVzaW5nIGN1cnJlbnQgbW9kdWxhdGlvbiBtb2RlICovCi0JCWlmIChscV9zdGEtPmZsdXNoX3RpbWVyKQotCQkJZmx1c2hfaW50ZXJ2YWxfcGFzc2VkID0KLQkJCXRpbWVfYWZ0ZXIoamlmZmllcywKLQkJCQkJKHVuc2lnbmVkIGxvbmcpKGxxX3N0YS0+Zmx1c2hfdGltZXIgKwotCQkJCQlJV0xfUkFURV9TQ0FMRV9GTFVTSF9JTlRWTCkpOwotCi0JCS8qCi0JCSAqIENoZWNrIGlmIHdlIHNob3VsZCBhbGxvdyBzZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUuCi0JCSAqIElmIG1hbnkgZnJhbWVzIGhhdmUgZmFpbGVkIG9yIHN1Y2NlZWRlZCwgb3Igd2UndmUgdXNlZAotCQkgKiB0aGlzIHNhbWUgbW9kdWxhdGlvbiBmb3IgYSBsb25nIHRpbWUsIGFsbG93IHNlYXJjaCwgYW5kCi0JCSAqIHJlc2V0IGhpc3Rvcnkgc3RhdHMgdGhhdCBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2Ugc2hvdWxkCi0JCSAqIGFsbG93IGEgbmV3IHNlYXJjaC4gIEFsc28gKGJlbG93KSByZXNldCBhbGwgYml0bWFwcyBhbmQKLQkJICogc3RhdHMgaW4gYWN0aXZlIGhpc3RvcnkuCi0JCSAqLwotCQlpZiAoZm9yY2Vfc2VhcmNoIHx8Ci0JCSAgICAobHFfc3RhLT50b3RhbF9mYWlsZWQgPiBscV9zdGEtPm1heF9mYWlsdXJlX2xpbWl0KSB8fAotCQkgICAgKGxxX3N0YS0+dG90YWxfc3VjY2VzcyA+IGxxX3N0YS0+bWF4X3N1Y2Nlc3NfbGltaXQpIHx8Ci0JCSAgICAoKCFscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSAmJiAobHFfc3RhLT5mbHVzaF90aW1lcikKLQkJICAgICAmJiAoZmx1c2hfaW50ZXJ2YWxfcGFzc2VkKSkpIHsKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogc3RheSBpcyBleHBpcmVkICVkICVkICVkXG46IiwKLQkJCQkgICAgIGxxX3N0YS0+dG90YWxfZmFpbGVkLAotCQkJCSAgICAgbHFfc3RhLT50b3RhbF9zdWNjZXNzLAotCQkJCSAgICAgZmx1c2hfaW50ZXJ2YWxfcGFzc2VkKTsKLQotCQkJLyogQWxsb3cgc2VhcmNoIGZvciBuZXcgbW9kZSAqLwotCQkJbHFfc3RhLT5zdGF5X2luX3RibCA9IDA7CS8qIG9ubHkgcGxhY2UgcmVzZXQgKi8KLQkJCWxxX3N0YS0+dG90YWxfZmFpbGVkID0gMDsKLQkJCWxxX3N0YS0+dG90YWxfc3VjY2VzcyA9IDA7Ci0JCQlscV9zdGEtPmZsdXNoX3RpbWVyID0gMDsKLQotCQkvKgotCQkgKiBFbHNlIGlmIHdlJ3ZlIHVzZWQgdGhpcyBtb2R1bGF0aW9uIG1vZGUgZW5vdWdoIHJlcGV0aXRpb25zCi0JCSAqIChyZWdhcmRsZXNzIG9mIGVsYXBzZWQgdGltZSBvciBzdWNjZXNzL2ZhaWx1cmUpLCByZXNldAotCQkgKiBoaXN0b3J5IGJpdG1hcHMgYW5kIHJhdGUtc3BlY2lmaWMgc3RhdHMgZm9yIGFsbCByYXRlcyBpbgotCQkgKiBhY3RpdmUgdGFibGUuCi0JCSAqLwotCQl9IGVsc2UgewotCQkJbHFfc3RhLT50YWJsZV9jb3VudCsrOwotCQkJaWYgKGxxX3N0YS0+dGFibGVfY291bnQgPj0KLQkJCSAgICBscV9zdGEtPnRhYmxlX2NvdW50X2xpbWl0KSB7Ci0JCQkJbHFfc3RhLT50YWJsZV9jb3VudCA9IDA7Ci0KLQkJCQlJV0xfREVCVUdfUkFURShwcml2LAotCQkJCQkiTFE6IHN0YXkgaW4gdGFibGUgY2xlYXIgd2luXG4iKTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKykKLQkJCQkJaXdsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdygKLQkJCQkJCSYodGJsLT53aW5baV0pKTsKLQkJCX0KLQkJfQotCi0JCS8qIElmIHRyYW5zaXRpb25pbmcgdG8gYWxsb3cgInNlYXJjaCIsIHJlc2V0IGFsbCBoaXN0b3J5Ci0JCSAqIGJpdG1hcHMgYW5kIHN0YXRzIGluIGFjdGl2ZSB0YWJsZSAodGhpcyB3aWxsIGJlY29tZSB0aGUgbmV3Ci0JCSAqICJzZWFyY2giIHRhYmxlKS4gKi8KLQkJaWYgKCFscV9zdGEtPnN0YXlfaW5fdGJsKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKykKLQkJCQlpd2w0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luZG93KAotCQkJCQkJCSYodGJsLT53aW5baV0pKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIHNldHVwIHJhdGUgdGFibGUgaW4gdUNvZGUKLSAqIHJldHVybiByYXRlX25fZmxhZ3MgYXMgdXNlZCBpbiB0aGUgdGFibGUKLSAqLwotc3RhdGljIHUzMiBpd2w0OTY1X3JzX3VwZGF0ZV9yYXRlX3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAotCQkJCWludCBpbmRleCwgdTggaXNfZ3JlZW4pCi17Ci0JdTMyIHJhdGU7Ci0KLQkvKiBVcGRhdGUgdUNvZGUncyByYXRlIHRhYmxlLiAqLwotCXJhdGUgPSBpd2w0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChwcml2LCB0YmwsIGluZGV4LCBpc19ncmVlbik7Ci0JaXdsNDk2NV9yc19maWxsX2xpbmtfY21kKHByaXYsIGxxX3N0YSwgcmF0ZSk7Ci0JaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKLQotCXJldHVybiByYXRlOwotfQotCi0vKgotICogRG8gcmF0ZSBzY2FsaW5nIGFuZCBzZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCSAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlpbnQgbG93ID0gSVdMX1JBVEVfSU5WQUxJRDsKLQlpbnQgaGlnaCA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0JaW50IGluZGV4OwotCWludCBpOwotCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cgPSBOVUxMOwotCWludCBjdXJyZW50X3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCWludCBsb3dfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JaW50IGhpZ2hfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JdTMyIGZhaWxfY291bnQ7Ci0Jczggc2NhbGVfYWN0aW9uID0gMDsKLQl1MTYgcmF0ZV9tYXNrOwotCXU4IHVwZGF0ZV9scSA9IDA7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCAqdGJsMTsKLQl1MTYgcmF0ZV9zY2FsZV9pbmRleF9tc2sgPSAwOwotCXUzMiByYXRlOwotCXU4IGlzX2dyZWVuID0gMDsKLQl1OCBhY3RpdmVfdGJsID0gMDsKLQl1OCBkb25lX3NlYXJjaCA9IDA7Ci0JdTE2IGhpZ2hfbG93OwotCXMzMiBzcjsKLQl1OCB0aWQgPSBNQVhfVElEX0NPVU5UOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAicmF0ZSBzY2FsZSBjYWxjdWxhdGUgbmV3IHJhdGUgZm9yIHNrYlxuIik7Ci0KLQkvKiBTZW5kIG1hbmFnZW1lbnQgZnJhbWVzIGFuZCBOT19BQ0sgZGF0YSB1c2luZyBsb3dlc3QgcmF0ZS4gKi8KLQkvKiBUT0RPOiB0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGltcHJvdmVkLi4gKi8KLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKLQkgICAgaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykKLQkJcmV0dXJuOwotCi0JaWYgKCFzdGEgfHwgIWxxX3N0YSkKLQkJcmV0dXJuOwotCi0JbHFfc3RhLT5zdXBwX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW2xxX3N0YS0+YmFuZF07Ci0KLQl0aWQgPSBpd2w0OTY1X3JzX3RsX2FkZF9wYWNrZXQobHFfc3RhLCBoZHIpOwotCWlmICgodGlkICE9IE1BWF9USURfQ09VTlQpICYmIChscV9zdGEtPnR4X2FnZ190aWRfZW4gJiAoMSA8PCB0aWQpKSkgewotCQl0aWRfZGF0YSA9ICZwcml2LT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0udGlkW3RpZF07Ci0JCWlmICh0aWRfZGF0YS0+YWdnLnN0YXRlID09IElXTF9BR0dfT0ZGKQotCQkJbHFfc3RhLT5pc19hZ2cgPSAwOwotCQllbHNlCi0JCQlscV9zdGEtPmlzX2FnZyA9IDE7Ci0JfSBlbHNlCi0JCWxxX3N0YS0+aXNfYWdnID0gMDsKLQotCS8qCi0JICogU2VsZWN0IHJhdGUtc2NhbGUgLyBtb2R1bGF0aW9uLW1vZGUgdGFibGUgdG8gd29yayB3aXRoIGluCi0JICogdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbjogICJzZWFyY2giIGlmIHNlYXJjaGluZyBmb3IgYmV0dGVyCi0JICogbW9kdWxhdGlvbiBtb2RlLCBvciAiYWN0aXZlIiBpZiBkb2luZyByYXRlIHNjYWxpbmcgd2l0aGluIGEgbW9kZS4KLQkgKi8KLQlpZiAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpCi0JCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7Ci0JZWxzZQotCQlhY3RpdmVfdGJsID0gMSAtIGxxX3N0YS0+YWN0aXZlX3RibDsKLQotCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKLQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpCi0JCWxxX3N0YS0+aXNfZ3JlZW4gPSAwOwotCWVsc2UKLQkJbHFfc3RhLT5pc19ncmVlbiA9IGl3bDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7Ci0JaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOwotCi0JLyogY3VycmVudCB0eCByYXRlICovCi0JaW5kZXggPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJSYXRlIHNjYWxlIGluZGV4ICVkIGZvciB0eXBlICVkXG4iLCBpbmRleCwKLQkJICAgICAgIHRibC0+bHFfdHlwZSk7Ci0KLQkvKiByYXRlcyBhdmFpbGFibGUgZm9yIHRoaXMgYXNzb2NpYXRpb24sIGFuZCBmb3IgbW9kdWxhdGlvbiBtb2RlICovCi0JcmF0ZV9tYXNrID0gaXdsNDk2NV9yc19nZXRfc3VwcG9ydGVkX3JhdGVzKGxxX3N0YSwgaGRyLCB0YmwtPmxxX3R5cGUpOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIm1hc2sgMHglMDRYXG4iLCByYXRlX21hc2spOwotCi0JLyogbWFzayB3aXRoIHN0YXRpb24gcmF0ZSByZXN0cmljdGlvbiAqLwotCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgewotCQlpZiAobHFfc3RhLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCQkvKiBzdXBwX3JhdGVzIGhhcyBubyBDQ0sgYml0cyBpbiBBIG1vZGUgKi8KLQkJCXJhdGVfc2NhbGVfaW5kZXhfbXNrID0gKHUxNikgKHJhdGVfbWFzayAmCi0JCQkJKGxxX3N0YS0+c3VwcF9yYXRlcyA8PCBJV0xfRklSU1RfT0ZETV9SQVRFKSk7Ci0JCWVsc2UKLQkJCXJhdGVfc2NhbGVfaW5kZXhfbXNrID0gKHUxNikgKHJhdGVfbWFzayAmCi0JCQkJCQkgICAgICBscV9zdGEtPnN1cHBfcmF0ZXMpOwotCi0JfSBlbHNlCi0JCXJhdGVfc2NhbGVfaW5kZXhfbXNrID0gcmF0ZV9tYXNrOwotCi0JaWYgKCFyYXRlX3NjYWxlX2luZGV4X21zaykKLQkJcmF0ZV9zY2FsZV9pbmRleF9tc2sgPSByYXRlX21hc2s7Ci0KLQlpZiAoISgoMSA8PCBpbmRleCkgJiByYXRlX3NjYWxlX2luZGV4X21zaykpIHsKLQkJSVdMX0VSUihwcml2LCAiQ3VycmVudCBSYXRlIGlzIG5vdCB2YWxpZFxuIik7Ci0JCWlmIChscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSB7Ci0JCQkvKiByZXZlcnQgdG8gYWN0aXZlIHRhYmxlIGlmIHNlYXJjaCB0YWJsZSBpcyBub3QgdmFsaWQqLwotCQkJdGJsLT5scV90eXBlID0gTFFfTk9ORTsKLQkJCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAwOwotCQkJdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JCQkvKiBnZXQgImFjdGl2ZSIgcmF0ZSBpbmZvICovCi0JCQlpbmRleCA9IGl3bDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHRibC0+Y3VycmVudF9yYXRlKTsKLQkJCXJhdGUgPSBpd2w0OTY1X3JzX3VwZGF0ZV9yYXRlX3RibChwcml2LCBjdHgsIGxxX3N0YSwKLQkJCQkJCSAgdGJsLCBpbmRleCwgaXNfZ3JlZW4pOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBHZXQgZXhwZWN0ZWQgdGhyb3VnaHB1dCB0YWJsZSBhbmQgaGlzdG9yeSB3aW5kb3cgZm9yIGN1cnJlbnQgcmF0ZSAqLwotCWlmICghdGJsLT5leHBlY3RlZF90cHQpIHsKLQkJSVdMX0VSUihwcml2LCAidGJsLT5leHBlY3RlZF90cHQgaXMgTlVMTFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBmb3JjZSB1c2VyIG1heCByYXRlIGlmIHNldCBieSB1c2VyICovCi0JaWYgKChscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSkgJiYKLQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaW5kZXgpKSB7Ci0JCWluZGV4ID0gbHFfc3RhLT5tYXhfcmF0ZV9pZHg7Ci0JCXVwZGF0ZV9scSA9IDE7Ci0JCXdpbmRvdyA9ICYodGJsLT53aW5baW5kZXhdKTsKLQkJZ290byBscV91cGRhdGU7Ci0JfQotCi0Jd2luZG93ID0gJih0YmwtPndpbltpbmRleF0pOwotCi0JLyoKLQkgKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGhpc3RvcnkgdG8gY2FsY3VsYXRlIGFjdHVhbCBhdmVyYWdlCi0JICogdGhyb3VnaHB1dCwga2VlcCBhbmFseXppbmcgcmVzdWx0cyBvZiBtb3JlIHR4IGZyYW1lcywgd2l0aG91dAotCSAqIGNoYW5naW5nIHJhdGUgb3IgbW9kZSAoYnlwYXNzIG1vc3Qgb2YgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbikuCi0JICogU2V0IHVwIG5ldyByYXRlIHRhYmxlIGluIHVDb2RlIG9ubHkgaWYgb2xkIHJhdGUgaXMgbm90IHN1cHBvcnRlZAotCSAqIGluIGN1cnJlbnQgYXNzb2NpYXRpb24gKHVzZSBuZXcgcmF0ZSBmb3VuZCBhYm92ZSkuCi0JICovCi0JZmFpbF9jb3VudCA9IHdpbmRvdy0+Y291bnRlciAtIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyOwotCWlmICgoZmFpbF9jb3VudCA8IElXTF9SQVRFX01JTl9GQUlMVVJFX1RIKSAmJgotCQkJKHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyIDwgSVdMX1JBVEVfTUlOX1NVQ0NFU1NfVEgpKSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogc3RpbGwgYmVsb3cgVEguIHN1Y2M9JWQgdG90YWw9JWQgIgotCQkJICAgICAgICJmb3IgaW5kZXggJWRcbiIsCi0JCQkgICAgICAgd2luZG93LT5zdWNjZXNzX2NvdW50ZXIsIHdpbmRvdy0+Y291bnRlciwgaW5kZXgpOwotCi0JCS8qIENhbid0IGNhbGN1bGF0ZSB0aGlzIHlldDsgbm90IGVub3VnaCBoaXN0b3J5ICovCi0JCXdpbmRvdy0+YXZlcmFnZV90cHQgPSBJV0xfSU5WQUxJRF9WQUxVRTsKLQotCQkvKiBTaG91bGQgd2Ugc3RheSB3aXRoIHRoaXMgbW9kdWxhdGlvbiBtb2RlLAotCQkgKiBvciBzZWFyY2ggZm9yIGEgbmV3IG9uZT8gKi8KLQkJaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKGxxX3N0YSwgZmFsc2UpOwotCi0JCWdvdG8gb3V0OwotCX0KLQkvKiBFbHNlIHdlIGhhdmUgZW5vdWdoIHNhbXBsZXM7IGNhbGN1bGF0ZSBlc3RpbWF0ZSBvZgotCSAqIGFjdHVhbCBhdmVyYWdlIHRocm91Z2hwdXQgKi8KLQlpZiAod2luZG93LT5hdmVyYWdlX3RwdCAhPSAoKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyAqCi0JCQl0YmwtPmV4cGVjdGVkX3RwdFtpbmRleF0gKyA2NCkgLyAxMjgpKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSAiZXhwZWN0ZWRfdHB0IHNob3VsZCBoYXZlIGJlZW4gY2FsY3VsYXRlZCBieSBub3dcbiIpOwotCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gKCh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gKgotCQkJCQl0YmwtPmV4cGVjdGVkX3RwdFtpbmRleF0gKyA2NCkgLyAxMjgpOwotCX0KLQotCS8qIElmIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGJldHRlciBtb2R1bGF0aW9uIG1vZGUsIGNoZWNrIHN1Y2Nlc3MuICovCi0JaWYgKGxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpIHsKLQkJLyogSWYgZ29vZCBzdWNjZXNzLCBjb250aW51ZSB1c2luZyB0aGUgInNlYXJjaCIgbW9kZTsKLQkJICogbm8gbmVlZCB0byBzZW5kIG5ldyBsaW5rIHF1YWxpdHkgY29tbWFuZCwgc2luY2Ugd2UncmUKLQkJICogY29udGludWluZyB0byB1c2UgdGhlIHNldHVwIHRoYXQgd2UndmUgYmVlbiB0cnlpbmcuICovCi0JCWlmICh3aW5kb3ctPmF2ZXJhZ2VfdHB0ID4gbHFfc3RhLT5sYXN0X3RwdCkgewotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFNXSVRDSElORyBUTyBORVcgVEFCTEUgIgotCQkJCQkic3VjPSVkIGN1ci10cHQ9JWQgb2xkLXRwdD0lZFxuIiwKLQkJCQkJd2luZG93LT5zdWNjZXNzX3JhdGlvLAotCQkJCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0LAotCQkJCQlscV9zdGEtPmxhc3RfdHB0KTsKLQotCQkJaWYgKCFpc19sZWdhY3kodGJsLT5scV90eXBlKSkKLQkJCQlscV9zdGEtPmVuYWJsZV9jb3VudGVyID0gMTsKLQotCQkJLyogU3dhcCB0YWJsZXM7ICJzZWFyY2giIGJlY29tZXMgImFjdGl2ZSIgKi8KLQkJCWxxX3N0YS0+YWN0aXZlX3RibCA9IGFjdGl2ZV90Ymw7Ci0JCQljdXJyZW50X3RwdCA9IHdpbmRvdy0+YXZlcmFnZV90cHQ7Ci0KLQkJLyogRWxzZSBwb29yIHN1Y2Nlc3M7IGdvIGJhY2sgdG8gbW9kZSBpbiAiYWN0aXZlIiB0YWJsZSAqLwotCQl9IGVsc2UgewotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IEdPSU5HIEJBQ0sgVE8gVEhFIE9MRCBUQUJMRSAiCi0JCQkJCSJzdWM9JWQgY3VyLXRwdD0lZCBvbGQtdHB0PSVkXG4iLAotCQkJCQl3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8sCi0JCQkJCXdpbmRvdy0+YXZlcmFnZV90cHQsCi0JCQkJCWxxX3N0YS0+bGFzdF90cHQpOwotCi0JCQkvKiBOdWxsaWZ5ICJzZWFyY2giIHRhYmxlICovCi0JCQl0YmwtPmxxX3R5cGUgPSBMUV9OT05FOwotCi0JCQkvKiBSZXZlcnQgdG8gImFjdGl2ZSIgdGFibGUgKi8KLQkJCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7Ci0JCQl0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1thY3RpdmVfdGJsXSk7Ci0KLQkJCS8qIFJldmVydCB0byAiYWN0aXZlIiByYXRlIGFuZCB0aHJvdWdocHV0IGluZm8gKi8KLQkJCWluZGV4ID0gaXdsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgodGJsLT5jdXJyZW50X3JhdGUpOwotCQkJY3VycmVudF90cHQgPSBscV9zdGEtPmxhc3RfdHB0OwotCi0JCQkvKiBOZWVkIHRvIHNldCB1cCBhIG5ldyByYXRlIHRhYmxlIGluIHVDb2RlICovCi0JCQl1cGRhdGVfbHEgPSAxOwotCQl9Ci0KLQkJLyogRWl0aGVyIHdheSwgd2UndmUgbWFkZSBhIGRlY2lzaW9uOyBtb2R1bGF0aW9uIG1vZGUKLQkJICogc2VhcmNoIGlzIGRvbmUsIGFsbG93IHJhdGUgYWRqdXN0bWVudCBuZXh0IHRpbWUuICovCi0JCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAwOwotCQlkb25lX3NlYXJjaCA9IDE7CS8qIERvbid0IHN3aXRjaCBtb2RlcyBiZWxvdyEgKi8KLQkJZ290byBscV91cGRhdGU7Ci0JfQotCi0JLyogKEVsc2UpIG5vdCBpbiBzZWFyY2ggb2YgYmV0dGVyIG1vZHVsYXRpb24gbW9kZSwgdHJ5IGZvciBiZXR0ZXIKLQkgKiBzdGFydGluZyByYXRlLCB3aGlsZSBzdGF5aW5nIGluIHRoaXMgbW9kZS4gKi8KLQloaWdoX2xvdyA9IGl3bDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUocHJpdiwgaW5kZXgsCi0JCQkJCXJhdGVfc2NhbGVfaW5kZXhfbXNrLAotCQkJCQl0YmwtPmxxX3R5cGUpOwotCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKLQloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKLQotCS8qIElmIHVzZXIgc2V0IG1heCByYXRlLCBkb250IGFsbG93IGhpZ2hlciB0aGFuIHVzZXIgY29uc3RyYWluICovCi0JaWYgKChscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSkgJiYKLQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaGlnaCkpCi0JCWhpZ2ggPSBJV0xfUkFURV9JTlZBTElEOwotCi0Jc3IgPSB3aW5kb3ctPnN1Y2Nlc3NfcmF0aW87Ci0KLQkvKiBDb2xsZWN0IG1lYXN1cmVkIHRocm91Z2hwdXRzIGZvciBjdXJyZW50IGFuZCBhZGphY2VudCByYXRlcyAqLwotCWN1cnJlbnRfdHB0ID0gd2luZG93LT5hdmVyYWdlX3RwdDsKLQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCWxvd190cHQgPSB0YmwtPndpbltsb3ddLmF2ZXJhZ2VfdHB0OwotCWlmIChoaWdoICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCWhpZ2hfdHB0ID0gdGJsLT53aW5baGlnaF0uYXZlcmFnZV90cHQ7Ci0KLQlzY2FsZV9hY3Rpb24gPSAwOwotCi0JLyogVG9vIG1hbnkgZmFpbHVyZXMsIGRlY3JlYXNlIHJhdGUgKi8KLQlpZiAoKHNyIDw9IElXTF9SQVRFX0RFQ1JFQVNFX1RIKSB8fCAoY3VycmVudF90cHQgPT0gMCkpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCSJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHN1Y2Nlc3NfcmF0aW9cbiIpOwotCQlzY2FsZV9hY3Rpb24gPSAtMTsKLQotCS8qIE5vIHRocm91Z2hwdXQgbWVhc3VyZWQgeWV0IGZvciBhZGphY2VudCByYXRlczsgdHJ5IGluY3JlYXNlLiAqLwotCX0gZWxzZSBpZiAoKGxvd190cHQgPT0gSVdMX0lOVkFMSURfVkFMVUUpICYmCi0JCSAgIChoaWdoX3RwdCA9PSBJV0xfSU5WQUxJRF9WQUxVRSkpIHsKLQotCQlpZiAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEICYmIHNyID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKQotCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJZWxzZSBpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlzY2FsZV9hY3Rpb24gPSAwOwotCX0KLQotCS8qIEJvdGggYWRqYWNlbnQgdGhyb3VnaHB1dHMgYXJlIG1lYXN1cmVkLCBidXQgbmVpdGhlciBvbmUgaGFzIGJldHRlcgotCSAqIHRocm91Z2hwdXQ7IHdlJ3JlIHVzaW5nIHRoZSBiZXN0IHJhdGUsIGRvbid0IGNoYW5nZSBpdCEgKi8KLQllbHNlIGlmICgobG93X3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChoaWdoX3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChsb3dfdHB0IDwgY3VycmVudF90cHQpICYmCi0JCSAoaGlnaF90cHQgPCBjdXJyZW50X3RwdCkpCi0JCXNjYWxlX2FjdGlvbiA9IDA7Ci0KLQkvKiBBdCBsZWFzdCBvbmUgYWRqYWNlbnQgcmF0ZSdzIHRocm91Z2hwdXQgaXMgbWVhc3VyZWQsCi0JICogYW5kIG1heSBoYXZlIGJldHRlciBwZXJmb3JtYW5jZS4gKi8KLQllbHNlIHsKLQkJLyogSGlnaGVyIGFkamFjZW50IHJhdGUncyB0aHJvdWdocHV0IGlzIG1lYXN1cmVkICovCi0JCWlmIChoaWdoX3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgewotCQkJLyogSGlnaGVyIHJhdGUgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCi0JCQlpZiAoaGlnaF90cHQgPiBjdXJyZW50X3RwdCAmJgotCQkJCQlzciA+PSBJV0xfUkFURV9JTkNSRUFTRV9USCkgewotCQkJCXNjYWxlX2FjdGlvbiA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCXNjYWxlX2FjdGlvbiA9IDA7Ci0JCQl9Ci0KLQkJLyogTG93ZXIgYWRqYWNlbnQgcmF0ZSdzIHRocm91Z2hwdXQgaXMgbWVhc3VyZWQgKi8KLQkJfSBlbHNlIGlmIChsb3dfdHB0ICE9IElXTF9JTlZBTElEX1ZBTFVFKSB7Ci0JCQkvKiBMb3dlciByYXRlIGhhcyBiZXR0ZXIgdGhyb3VnaHB1dCAqLwotCQkJaWYgKGxvd190cHQgPiBjdXJyZW50X3RwdCkgewotCQkJCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkJICAgICJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHRwdFxuIik7Ci0JCQkJc2NhbGVfYWN0aW9uID0gLTE7Ci0JCQl9IGVsc2UgaWYgKHNyID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKSB7Ci0JCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFNhbml0eSBjaGVjazsgYXNrZWQgZm9yIGRlY3JlYXNlLCBidXQgc3VjY2VzcyByYXRlIG9yIHRocm91Z2hwdXQKLQkgKiBoYXMgYmVlbiBnb29kIGF0IG9sZCByYXRlLiAgRG9uJ3QgY2hhbmdlIGl0LiAqLwotCWlmICgoc2NhbGVfYWN0aW9uID09IC0xKSAmJiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpICYmCi0JCSAgICAoKHNyID4gSVdMX1JBVEVfSElHSF9USCkgfHwKLQkJICAgICAoY3VycmVudF90cHQgPiAoMTAwICogdGJsLT5leHBlY3RlZF90cHRbbG93XSkpKSkKLQkJc2NhbGVfYWN0aW9uID0gMDsKLQotCXN3aXRjaCAoc2NhbGVfYWN0aW9uKSB7Ci0JY2FzZSAtMToKLQkJLyogRGVjcmVhc2Ugc3RhcnRpbmcgcmF0ZSwgdXBkYXRlIHVDb2RlJ3MgcmF0ZSB0YWJsZSAqLwotCQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJCXVwZGF0ZV9scSA9IDE7Ci0JCQlpbmRleCA9IGxvdzsKLQkJfQotCi0JCWJyZWFrOwotCWNhc2UgMToKLQkJLyogSW5jcmVhc2Ugc3RhcnRpbmcgcmF0ZSwgdXBkYXRlIHVDb2RlJ3MgcmF0ZSB0YWJsZSAqLwotCQlpZiAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEKSB7Ci0JCQl1cGRhdGVfbHEgPSAxOwotCQkJaW5kZXggPSBoaWdoOwotCQl9Ci0KLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQkvKiBObyBjaGFuZ2UgKi8KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiY2hvb3NlIHJhdGUgc2NhbGUgaW5kZXggJWQgYWN0aW9uICVkIGxvdyAlZCAiCi0JCSAgICAiaGlnaCAlZCB0eXBlICVkXG4iLAotCQkgICAgIGluZGV4LCBzY2FsZV9hY3Rpb24sIGxvdywgaGlnaCwgdGJsLT5scV90eXBlKTsKLQotbHFfdXBkYXRlOgotCS8qIFJlcGxhY2UgdUNvZGUncyByYXRlIHRhYmxlIGZvciB0aGUgZGVzdGluYXRpb24gc3RhdGlvbi4gKi8KLQlpZiAodXBkYXRlX2xxKQotCQlyYXRlID0gaXdsNDk2NV9yc191cGRhdGVfcmF0ZV90YmwocHJpdiwgY3R4LCBscV9zdGEsCi0JCQkJCSAgdGJsLCBpbmRleCwgaXNfZ3JlZW4pOwotCi0JLyogU2hvdWxkIHdlIHN0YXkgd2l0aCB0aGlzIG1vZHVsYXRpb24gbW9kZSwKLQkgKiBvciBzZWFyY2ggZm9yIGEgbmV3IG9uZT8gKi8KLQkgaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKGxxX3N0YSwgZmFsc2UpOwotCi0JLyoKLQkgKiBTZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUgaWYgd2UncmU6Ci0JICogMSkgIE5vdCBjaGFuZ2luZyByYXRlcyByaWdodCBub3cKLQkgKiAyKSAgTm90IGp1c3QgZmluaXNoaW5nIHVwIGEgc2VhcmNoCi0JICogMykgIEFsbG93aW5nIGEgbmV3IHNlYXJjaAotCSAqLwotCWlmICghdXBkYXRlX2xxICYmICFkb25lX3NlYXJjaCAmJgotCQkhbHFfc3RhLT5zdGF5X2luX3RibCAmJiB3aW5kb3ctPmNvdW50ZXIpIHsKLQkJLyogU2F2ZSBjdXJyZW50IHRocm91Z2hwdXQgdG8gY29tcGFyZSB3aXRoICJzZWFyY2giIHRocm91Z2hwdXQqLwotCQlscV9zdGEtPmxhc3RfdHB0ID0gY3VycmVudF90cHQ7Ci0KLQkJLyogU2VsZWN0IGEgbmV3ICJzZWFyY2giIG1vZHVsYXRpb24gbW9kZSB0byB0cnkuCi0JCSAqIElmIG9uZSBpcyBmb3VuZCwgc2V0IHVwIHRoZSBuZXcgInNlYXJjaCIgdGFibGUuICovCi0JCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkKLQkJCWl3bDQ5NjVfcnNfbW92ZV9sZWdhY3lfb3RoZXIocHJpdiwgbHFfc3RhLAotCQkJCQkJCWNvbmYsIHN0YSwgaW5kZXgpOwotCQllbHNlIGlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCi0JCQlpd2w0OTY1X3JzX21vdmVfc2lzb190b19vdGhlcihwcml2LCBscV9zdGEsCi0JCQkJCQkJY29uZiwgc3RhLCBpbmRleCk7Ci0JCWVsc2UgLyogKGlzX21pbW8yKHRibC0+bHFfdHlwZSkpICovCi0JCQlpd2w0OTY1X3JzX21vdmVfbWltbzJfdG9fb3RoZXIocHJpdiwgbHFfc3RhLAotCQkJCQkJCWNvbmYsIHN0YSwgaW5kZXgpOwotCi0JCS8qIElmIG5ldyAic2VhcmNoIiBtb2RlIHdhcyBzZWxlY3RlZCwgc2V0IHVwIGluIHVDb2RlIHRhYmxlICovCi0JCWlmIChscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSB7Ci0JCQkvKiBBY2Nlc3MgdGhlICJzZWFyY2giIHRhYmxlLCBjbGVhciBpdHMgaGlzdG9yeS4gKi8KLQkJCXRibCA9ICYobHFfc3RhLT5scV9pbmZvWygxIC0gbHFfc3RhLT5hY3RpdmVfdGJsKV0pOwotCQkJZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UOyBpKyspCi0JCQkJaXdsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdygKLQkJCQkJCQkmKHRibC0+d2luW2ldKSk7Ci0KLQkJCS8qIFVzZSBuZXcgInNlYXJjaCIgc3RhcnQgcmF0ZSAqLwotCQkJaW5kZXggPSBpd2w0OTY1X2h3cmF0ZV90b19wbGNwX2lkeCh0YmwtPmN1cnJlbnRfcmF0ZSk7Ci0KLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkJIlN3aXRjaCBjdXJyZW50ICBtY3M6ICVYIGluZGV4OiAlZFxuIiwKLQkJCQkgICAgIHRibC0+Y3VycmVudF9yYXRlLCBpbmRleCk7Ci0JCQlpd2w0OTY1X3JzX2ZpbGxfbGlua19jbWQocHJpdiwgbHFfc3RhLAotCQkJCQkJdGJsLT5jdXJyZW50X3JhdGUpOwotCQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsCi0JCQkJCQkmbHFfc3RhLT5scSwgQ01EX0FTWU5DLCBmYWxzZSk7Ci0JCX0gZWxzZQotCQkJZG9uZV9zZWFyY2ggPSAxOwotCX0KLQotCWlmIChkb25lX3NlYXJjaCAmJiAhbHFfc3RhLT5zdGF5X2luX3RibCkgewotCQkvKiBJZiB0aGUgImFjdGl2ZSIgKG5vbi1zZWFyY2gpIG1vZGUgd2FzIGxlZ2FjeSwKLQkJICogYW5kIHdlJ3ZlIHRyaWVkIHN3aXRjaGluZyBhbnRlbm5hcywKLQkJICogYnV0IHdlIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRyeSBIVCBtb2RlcyAobm90IGF2YWlsYWJsZSksCi0JCSAqIHN0YXkgd2l0aCBiZXN0IGFudGVubmEgbGVnYWN5IG1vZHVsYXRpb24gZm9yIGEgd2hpbGUKLQkJICogYmVmb3JlIG5leHQgcm91bmQgb2YgbW9kZSBjb21wYXJpc29ucy4gKi8KLQkJdGJsMSA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCQlpZiAoaXNfbGVnYWN5KHRibDEtPmxxX3R5cGUpICYmICFjb25mX2lzX2h0KGNvbmYpICYmCi0JCSAgICBscV9zdGEtPmFjdGlvbl9jb3VudGVyID4gdGJsMS0+bWF4X3NlYXJjaCkgewotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBTVEFZIGluIGxlZ2FjeSB0YWJsZVxuIik7Ci0JCQlpd2w0OTY1X3JzX3NldF9zdGF5X2luX3RhYmxlKHByaXYsIDEsIGxxX3N0YSk7Ci0JCX0KLQotCQkvKiBJZiB3ZSdyZSBpbiBhbiBIVCBtb2RlLCBhbmQgYWxsIDMgbW9kZSBzd2l0Y2ggYWN0aW9ucwotCQkgKiBoYXZlIGJlZW4gdHJpZWQgYW5kIGNvbXBhcmVkLCBzdGF5IGluIHRoaXMgYmVzdCBtb2R1bGF0aW9uCi0JCSAqIG1vZGUgZm9yIGEgd2hpbGUgYmVmb3JlIG5leHQgcm91bmQgb2YgbW9kZSBjb21wYXJpc29ucy4gKi8KLQkJaWYgKGxxX3N0YS0+ZW5hYmxlX2NvdW50ZXIgJiYKLQkJICAgIChscV9zdGEtPmFjdGlvbl9jb3VudGVyID49IHRibDEtPm1heF9zZWFyY2gpKSB7Ci0JCQlpZiAoKGxxX3N0YS0+bGFzdF90cHQgPiBJV0xfQUdHX1RQVF9USFJFSE9MRCkgJiYKLQkJCSAgICAobHFfc3RhLT50eF9hZ2dfdGlkX2VuICYgKDEgPDwgdGlkKSkgJiYKLQkJCSAgICAodGlkICE9IE1BWF9USURfQ09VTlQpKSB7Ci0JCQkJdGlkX2RhdGEgPQotCQkJCSAgICZwcml2LT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0udGlkW3RpZF07Ci0JCQkJaWYgKHRpZF9kYXRhLT5hZ2cuc3RhdGUgPT0gSVdMX0FHR19PRkYpIHsKLQkJCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkJCSAgICAgICAidHJ5IHRvIGFnZ3JlZ2F0ZSB0aWQgJWRcbiIsCi0JCQkJCQkgICAgICAgdGlkKTsKLQkJCQkJaXdsNDk2NV9yc190bF90dXJuX29uX2FnZyhwcml2LCB0aWQsCi0JCQkJCQkJICBscV9zdGEsIHN0YSk7Ci0JCQkJfQotCQkJfQotCQkJaXdsNDk2NV9yc19zZXRfc3RheV9pbl90YWJsZShwcml2LCAwLCBscV9zdGEpOwotCQl9Ci0JfQotCi1vdXQ6Ci0JdGJsLT5jdXJyZW50X3JhdGUgPSBpd2w0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChwcml2LCB0YmwsCi0JCQkJCQkJaW5kZXgsIGlzX2dyZWVuKTsKLQlpID0gaW5kZXg7Ci0JbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnNfaW5pdGlhbGl6ZV9scSAtIEluaXRpYWxpemUgYSBzdGF0aW9uJ3MgaGFyZHdhcmUgcmF0ZSB0YWJsZQotICoKLSAqIFRoZSB1Q29kZSdzIHN0YXRpb24gdGFibGUgY29udGFpbnMgYSB0YWJsZSBvZiBmYWxsYmFjayByYXRlcwotICogZm9yIGF1dG9tYXRpYyBmYWxsYmFjayBkdXJpbmcgdHJhbnNtaXNzaW9uLgotICoKLSAqIE5PVEU6IFRoaXMgc2V0cyB1cCBhIGRlZmF1bHQgc2V0IG9mIHZhbHVlcy4gIFRoZXNlIHdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIKLSAqICAgICAgIGlmIHRoZSBkcml2ZXIncyBpd2wtNDk2NS1ycyByYXRlIHNjYWxpbmcgYWxnb3JpdGhtIGlzIHVzZWQsIGluc3RlYWQgb2YKLSAqICAgICAgIHJjODAyMTFfc2ltcGxlLgotICoKLSAqIE5PVEU6IFJ1biBSRVBMWV9BRERfU1RBIGNvbW1hbmQgdG8gc2V0IHVwIHN0YXRpb24gdGFibGUgZW50cnksIGJlZm9yZQotICogICAgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICh3aGljaCBydW5zIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQsCi0gKiAgICAgICB3aGljaCByZXF1aXJlcyBzdGF0aW9uIHRhYmxlIGVudHJ5IHRvIGV4aXN0KS4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19pbml0aWFsaXplX2xxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhKQotewotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibDsKLQlpbnQgcmF0ZV9pZHg7Ci0JaW50IGk7Ci0JdTMyIHJhdGU7Ci0JdTggdXNlX2dyZWVuID0gaXdsNDk2NV9yc191c2VfZ3JlZW4oc3RhKTsKLQl1OCBhY3RpdmVfdGJsID0gMDsKLQl1OCB2YWxpZF90eF9hbnQ7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlpZiAoIXN0YSB8fCAhbHFfc3RhKQotCQlyZXR1cm47Ci0KLQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQljdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKLQotCWkgPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKLQotCXZhbGlkX3R4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7Ci0KLQlpZiAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpCi0JCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7Ci0JZWxzZQotCQlhY3RpdmVfdGJsID0gMSAtIGxxX3N0YS0+YWN0aXZlX3RibDsKLQotCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKLQotCWlmICgoaSA8IDApIHx8IChpID49IElXTF9SQVRFX0NPVU5UKSkKLQkJaSA9IDA7Ci0KLQlyYXRlID0gaXdsZWdhY3lfcmF0ZXNbaV0ucGxjcDsKLQl0YmwtPmFudF90eXBlID0gaXdsNDk2NV9maXJzdF9hbnRlbm5hKHZhbGlkX3R4X2FudCk7Ci0JcmF0ZSB8PSB0YmwtPmFudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1M7Ci0KLQlpZiAoaSA+PSBJV0xfRklSU1RfQ0NLX1JBVEUgJiYgaSA8PSBJV0xfTEFTVF9DQ0tfUkFURSkKLQkJcmF0ZSB8PSBSQVRFX01DU19DQ0tfTVNLOwotCi0JaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MocmF0ZSwgcHJpdi0+YmFuZCwgdGJsLCAmcmF0ZV9pZHgpOwotCWlmICghaXdsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LCB0YmwtPmFudF90eXBlKSkKLQkJaXdsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsICZyYXRlLCB0YmwpOwotCi0JcmF0ZSA9IGl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHByaXYsIHRibCwgcmF0ZV9pZHgsIHVzZV9ncmVlbik7Ci0JdGJsLT5jdXJyZW50X3JhdGUgPSByYXRlOwotCWl3bDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHRibCk7Ci0JaXdsNDk2NV9yc19maWxsX2xpbmtfY21kKE5VTEwsIGxxX3N0YSwgcmF0ZSk7Ci0JcHJpdi0+c3RhdGlvbnNbbHFfc3RhLT5scS5zdGFfaWRdLmxxID0gJmxxX3N0YS0+bHE7Ci0JaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLCBDTURfU1lOQywgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pd2w0OTY1X3JzX2dldF9yYXRlKHZvaWQgKnByaXZfciwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGVfY29udHJvbCAqdHhyYykKLXsKLQotCXN0cnVjdCBza19idWZmICpza2IgPSB0eHJjLT5za2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPSB0eHJjLT5zYmFuZDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSAoc3RydWN0IGl3bF9wcml2ICopcHJpdl9yOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0JaW50IHJhdGVfaWR4OwotCi0JSVdMX0RFQlVHX1JBVEVfTElNSVQocHJpdiwgInJhdGUgc2NhbGUgY2FsY3VsYXRlIG5ldyByYXRlIGZvciBza2JcbiIpOwotCi0JLyogR2V0IG1heCByYXRlIGlmIHVzZXIgc2V0IG1heCByYXRlICovCi0JaWYgKGxxX3N0YSkgewotCQlscV9zdGEtPm1heF9yYXRlX2lkeCA9IHR4cmMtPm1heF9yYXRlX2lkeDsKLQkJaWYgKChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSAmJgotCQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ICE9IC0xKSkKLQkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JCWlmICgobHFfc3RhLT5tYXhfcmF0ZV9pZHggPCAwKSB8fAotCQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ID49IElXTF9SQVRFX0NPVU5UKSkKLQkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ID0gLTE7Ci0JfQotCi0JLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KLQlpZiAobHFfc3RhICYmICFscV9zdGEtPmRydikgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAiUmF0ZSBzY2FsaW5nIG5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKLQkJcHJpdl9zdGEgPSBOVUxMOwotCX0KLQotCS8qIFNlbmQgbWFuYWdlbWVudCBmcmFtZXMgYW5kIE5PX0FDSyBkYXRhIHVzaW5nIGxvd2VzdCByYXRlLiAqLwotCWlmIChyYXRlX2NvbnRyb2xfc2VuZF9sb3coc3RhLCBwcml2X3N0YSwgdHhyYykpCi0JCXJldHVybjsKLQotCWlmICghbHFfc3RhKQotCQlyZXR1cm47Ci0KLQlyYXRlX2lkeCAgPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKLQotCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFRfTVNLKSB7Ci0JCXJhdGVfaWR4IC09IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JCS8qIDZNIGFuZCA5TSBzaGFyZWQgc2FtZSBNQ1MgaW5kZXggKi8KLQkJcmF0ZV9pZHggPSAocmF0ZV9pZHggPiAwKSA/IChyYXRlX2lkeCAtIDEpIDogMDsKLQkJaWYgKGl3bDQ5NjVfcnNfZXh0cmFjdF9yYXRlKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MpID49Ci0JCQkgSVdMX1JBVEVfTUlNTzJfNk1fUExDUCkKLQkJCXJhdGVfaWR4ID0gcmF0ZV9pZHggKyBNQ1NfSU5ERVhfUEVSX1NUUkVBTTsKLQkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyA9IElFRUU4MDIxMV9UWF9SQ19NQ1M7Ci0JCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfU0dJX01TSykKLQkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KLQkJCQkJSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJOwotCQlpZiAobHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0RVUF9NU0spCi0JCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9Ci0JCQkJCUlFRUU4MDIxMV9UWF9SQ19EVVBfREFUQTsKLQkJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykKLQkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KLQkJCQkJSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKLQkJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19HRl9NU0spCi0JCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9Ci0JCQkJCUlFRUU4MDIxMV9UWF9SQ19HUkVFTl9GSUVMRDsKLQl9IGVsc2UgewotCQkvKiBDaGVjayBmb3IgaW52YWxpZCByYXRlcyAqLwotCQlpZiAoKHJhdGVfaWR4IDwgMCkgfHwgKHJhdGVfaWR4ID49IElXTF9SQVRFX0NPVU5UX0xFR0FDWSkgfHwKLQkJCQkoKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopICYmCi0JCQkJIChyYXRlX2lkeCA8IElXTF9GSVJTVF9PRkRNX1JBVEUpKSkKLQkJCXJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgoc2JhbmQsIHN0YSk7Ci0JCS8qIE9uIHZhbGlkIDUgR0h6IHJhdGUsIGFkanVzdCBpbmRleCAqLwotCQllbHNlIGlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJcmF0ZV9pZHggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyA9IDA7Ci0JfQotCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gcmF0ZV9pZHg7Ci0KLX0KLQotc3RhdGljIHZvaWQgKml3bDQ5NjVfcnNfYWxsb2Nfc3RhKHZvaWQgKnByaXZfcmF0ZSwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgZ2ZwX3QgZ2ZwKQotewotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGE7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0KLQkJCQkoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKikgc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0KLQlwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKXByaXZfcmF0ZTsKLQlJV0xfREVCVUdfUkFURShwcml2LCAiY3JlYXRlIHN0YXRpb24gcmF0ZSBzY2FsZSB3aW5kb3dcbiIpOwotCi0JbHFfc3RhID0gJnN0YV9wcml2LT5scV9zdGE7Ci0KLQlyZXR1cm4gbHFfc3RhOwotfQotCi0vKgotICogQ2FsbGVkIGFmdGVyIGFkZGluZyBhIG5ldyBzdGF0aW9uIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nCi0gKi8KLXZvaWQKLWl3bDQ5NjVfcnNfcmF0ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQl1OCBzdGFfaWQpCi17Ci0JaW50IGksIGo7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwcml2LT5odzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmcHJpdi0+aHctPmNvbmY7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAgPSAmc3RhLT5odF9jYXA7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OwotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0KLQlzdGFfcHJpdiA9IChzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqKSBzdGEtPmRydl9wcml2OwotCWxxX3N0YSA9ICZzdGFfcHJpdi0+bHFfc3RhOwotCXNiYW5kID0gaHctPndpcGh5LT5iYW5kc1tjb25mLT5jaGFubmVsLT5iYW5kXTsKLQotCi0JbHFfc3RhLT5scS5zdGFfaWQgPSBzdGFfaWQ7Ci0KLQlmb3IgKGogPSAwOyBqIDwgTFFfU0laRTsgaisrKQotCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKykKLQkJCWl3bDQ5NjVfcnNfcmF0ZV9zY2FsZV9jbGVhcl93aW5kb3coCi0JCQkJCSZscV9zdGEtPmxxX2luZm9bal0ud2luW2ldKTsKLQotCWxxX3N0YS0+Zmx1c2hfdGltZXIgPSAwOwotCWxxX3N0YS0+c3VwcF9yYXRlcyA9IHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF07Ci0JZm9yIChqID0gMDsgaiA8IExRX1NJWkU7IGorKykKLQkJZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UOyBpKyspCi0JCQlpd2w0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luZG93KAotCQkJCQkmbHFfc3RhLT5scV9pbmZvW2pdLndpbltpXSk7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IgotCQkJIioqKiByYXRlIHNjYWxlIHN0YXRpb24gZ2xvYmFsIGluaXQgZm9yIHN0YXRpb24gJWQgKioqXG4iLAotCQkgICAgICAgc3RhX2lkKTsKLQkvKiBUT0RPOiB3aGF0IGlzIGEgZ29vZCBzdGFydGluZyByYXRlIGZvciBTVEE/IEFib3V0IG1pZGRsZT8gTWF5YmUgbm90Ci0JICogdGhlIGxvd2VzdCBvciB0aGUgaGlnaGVzdCByYXRlLi4gQ291bGQgY29uc2lkZXIgdXNpbmcgUlNTSSBmcm9tCi0JICogcHJldmlvdXMgcGFja2V0cz8gTmVlZCB0byBoYXZlIElFRUUgODAyLjFYIGF1dGggc3VjY2VlZCBpbW1lZGlhdGVseQotCSAqIGFmdGVyIGFzc29jLi4gKi8KLQotCWxxX3N0YS0+aXNfZHVwID0gMDsKLQlscV9zdGEtPm1heF9yYXRlX2lkeCA9IC0xOwotCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IElXTF9NSVNTRURfUkFURV9NQVg7Ci0JbHFfc3RhLT5pc19ncmVlbiA9IGl3bDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7Ci0JbHFfc3RhLT5hY3RpdmVfbGVnYWN5X3JhdGUgPSBwcml2LT5hY3RpdmVfcmF0ZSAmIH4oMHgxMDAwKTsKLQlscV9zdGEtPmJhbmQgPSBwcml2LT5iYW5kOwotCS8qCi0JICogYWN0aXZlX3Npc29fcmF0ZSBtYXNrIGluY2x1ZGVzIDkgTUJpdHMgKGJpdCA1KSwgYW5kIENDSyAoYml0cyAwLTMpLAotCSAqIHN1cHBfcmF0ZXNbXSBkb2VzIG5vdDsgc2hpZnQgdG8gY29udmVydCBmb3JtYXQsIGZvcmNlIDkgTUJpdHMgb2ZmLgotCSAqLwotCWxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPDwgMTsKLQlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgfD0gaHRfY2FwLT5tY3MucnhfbWFza1swXSAmIDB4MTsKLQlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgJj0gfigodTE2KTB4Mik7Ci0JbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlIDw8PSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0JLyogU2FtZSBoZXJlICovCi0JbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPDwgMTsKLQlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlIHw9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gJiAweDE7Ci0JbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSAmPSB+KCh1MTYpMHgyKTsKLQlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlIDw8PSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0JLyogVGhlc2UgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBsYXRlciAqLwotCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrID0KLQkJaXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9Ci0JCXByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJgotCQl+aXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCWlmICghbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKSB7Ci0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9IEFOVF9BQjsKLQl9IGVsc2UgaWYgKGl3bDQ5NjVfbnVtX29mX2FudChwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50KSA9PSAyKSB7Ci0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9Ci0JCQlwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OwotCX0KLQotCS8qIGFzIGRlZmF1bHQgYWxsb3cgYWdncmVnYXRpb24gZm9yIGFsbCB0aWRzICovCi0JbHFfc3RhLT50eF9hZ2dfdGlkX2VuID0gSVdMX0FHR19BTExfVElEOwotCWxxX3N0YS0+ZHJ2ID0gcHJpdjsKLQotCS8qIFNldCBsYXN0X3R4cmF0ZV9pZHggdG8gbG93ZXN0IHJhdGUgKi8KLQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOwotCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCWxxX3N0YS0+aXNfYWdnID0gMDsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7Ci0jZW5kaWYKLQotCWl3bDQ5NjVfcnNfaW5pdGlhbGl6ZV9scShwcml2LCBjb25mLCBzdGEsIGxxX3N0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfZmlsbF9saW5rX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIHUzMiBuZXdfcmF0ZSkKLXsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIHRibF90eXBlOwotCWludCBpbmRleCA9IDA7Ci0JaW50IHJhdGVfaWR4OwotCWludCByZXBlYXRfcmF0ZSA9IDA7Ci0JdTggYW50X3RvZ2dsZV9jbnQgPSAwOwotCXU4IHVzZV9odF9wb3NzaWJsZSA9IDE7Ci0JdTggdmFsaWRfdHhfYW50ID0gMDsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxxX2NtZCA9ICZscV9zdGEtPmxxOwotCi0JLyogT3ZlcnJpZGUgc3RhcnRpbmcgcmF0ZSAoaW5kZXggMCkgaWYgbmVlZGVkIGZvciBkZWJ1ZyBwdXJwb3NlcyAqLwotCWl3bDQ5NjVfcnNfZGJnZnNfc2V0X21jcyhscV9zdGEsICZuZXdfcmF0ZSwgaW5kZXgpOwotCi0JLyogSW50ZXJwcmV0IG5ld19yYXRlIChyYXRlX25fZmxhZ3MpICovCi0JaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MobmV3X3JhdGUsIGxxX3N0YS0+YmFuZCwKLQkJCQkgICZ0YmxfdHlwZSwgJnJhdGVfaWR4KTsKLQotCS8qIEhvdyBtYW55IHRpbWVzIHNob3VsZCB3ZSByZXBlYXQgdGhlIGluaXRpYWwgcmF0ZT8gKi8KLQlpZiAoaXNfbGVnYWN5KHRibF90eXBlLmxxX3R5cGUpKSB7Ci0JCWFudF90b2dnbGVfY250ID0gMTsKLQkJcmVwZWF0X3JhdGUgPSBJV0xfTlVNQkVSX1RSWTsKLQl9IGVsc2UgewotCQlyZXBlYXRfcmF0ZSA9IElXTF9IVF9OVU1CRVJfVFJZOwotCX0KLQotCWxxX2NtZC0+Z2VuZXJhbF9wYXJhbXMubWltb19kZWxpbWl0ZXIgPQotCQkJaXNfbWltbyh0YmxfdHlwZS5scV90eXBlKSA/IDEgOiAwOwotCi0JLyogRmlsbCAxc3QgdGFibGUgZW50cnkgKGluZGV4IDApICovCi0JbHFfY21kLT5yc190YWJsZVtpbmRleF0ucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIobmV3X3JhdGUpOwotCi0JaWYgKGl3bDQ5NjVfbnVtX29mX2FudCh0YmxfdHlwZS5hbnRfdHlwZSkgPT0gMSkgewotCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zayA9Ci0JCQkJCQl0YmxfdHlwZS5hbnRfdHlwZTsKLQl9IGVsc2UgaWYgKGl3bDQ5NjVfbnVtX29mX2FudCh0YmxfdHlwZS5hbnRfdHlwZSkgPT0gMikgewotCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQotCQkJCQkJdGJsX3R5cGUuYW50X3R5cGU7Ci0JfSAvKiBvdGhlcndpc2Ugd2UgZG9uJ3QgbW9kaWZ5IHRoZSBleGlzdGluZyB2YWx1ZSAqLwotCi0JaW5kZXgrKzsKLQlyZXBlYXRfcmF0ZS0tOwotCWlmIChwcml2KQotCQl2YWxpZF90eF9hbnQgPSBwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OwotCi0JLyogRmlsbCByZXN0IG9mIHJhdGUgdGFibGUgKi8KLQl3aGlsZSAoaW5kZXggPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSkgewotCQkvKiBSZXBlYXQgaW5pdGlhbC9uZXh0IHJhdGUuCi0JCSAqIEZvciBsZWdhY3kgSVdMX05VTUJFUl9UUlkgPT0gMSwgdGhpcyBsb29wIHdpbGwgbm90IGV4ZWN1dGUuCi0JCSAqIEZvciBIVCBJV0xfSFRfTlVNQkVSX1RSWSA9PSAzLCB0aGlzIGV4ZWN1dGVzIHR3aWNlLiAqLwotCQl3aGlsZSAocmVwZWF0X3JhdGUgPiAwICYmIChpbmRleCA8IExJTktfUVVBTF9NQVhfUkVUUllfTlVNKSkgewotCQkJaWYgKGlzX2xlZ2FjeSh0YmxfdHlwZS5scV90eXBlKSkgewotCQkJCWlmIChhbnRfdG9nZ2xlX2NudCA8IE5VTV9UUllfQkVGT1JFX0FOVF9UT0dHTEUpCi0JCQkJCWFudF90b2dnbGVfY250Kys7Ci0JCQkJZWxzZSBpZiAocHJpdiAmJgotCQkJCQkgaXdsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsCi0JCQkJCQkJJm5ld19yYXRlLCAmdGJsX3R5cGUpKQotCQkJCQlhbnRfdG9nZ2xlX2NudCA9IDE7Ci0JCQl9Ci0KLQkJCS8qIE92ZXJyaWRlIG5leHQgcmF0ZSBpZiBuZWVkZWQgZm9yIGRlYnVnIHB1cnBvc2VzICovCi0JCQlpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGluZGV4KTsKLQotCQkJLyogRmlsbCBuZXh0IHRhYmxlIGVudHJ5ICovCi0JCQlscV9jbWQtPnJzX3RhYmxlW2luZGV4XS5yYXRlX25fZmxhZ3MgPQotCQkJCQljcHVfdG9fbGUzMihuZXdfcmF0ZSk7Ci0JCQlyZXBlYXRfcmF0ZS0tOwotCQkJaW5kZXgrKzsKLQkJfQotCi0JCWl3bDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKG5ld19yYXRlLAotCQkJCQkJbHFfc3RhLT5iYW5kLCAmdGJsX3R5cGUsCi0JCQkJCQkmcmF0ZV9pZHgpOwotCi0JCS8qIEluZGljYXRlIHRvIHVDb2RlIHdoaWNoIGVudHJpZXMgbWlnaHQgYmUgTUlNTy4KLQkJICogSWYgaW5pdGlhbCByYXRlIHdhcyBNSU1PLCB0aGlzIHdpbGwgZmluYWxseSBlbmQgdXAKLQkJICogYXMgKElXTF9IVF9OVU1CRVJfVFJZICogMiksIGFmdGVyIDJuZCBwYXNzLCBvdGhlcndpc2UgMC4gKi8KLQkJaWYgKGlzX21pbW8odGJsX3R5cGUubHFfdHlwZSkpCi0JCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLm1pbW9fZGVsaW1pdGVyID0gaW5kZXg7Ci0KLQkJLyogR2V0IG5leHQgcmF0ZSAqLwotCQluZXdfcmF0ZSA9IGl3bDQ5NjVfcnNfZ2V0X2xvd2VyX3JhdGUobHFfc3RhLAotCQkJCQkmdGJsX3R5cGUsIHJhdGVfaWR4LAotCQkJCQkgICAgIHVzZV9odF9wb3NzaWJsZSk7Ci0KLQkJLyogSG93IG1hbnkgdGltZXMgc2hvdWxkIHdlIHJlcGVhdCB0aGUgbmV4dCByYXRlPyAqLwotCQlpZiAoaXNfbGVnYWN5KHRibF90eXBlLmxxX3R5cGUpKSB7Ci0JCQlpZiAoYW50X3RvZ2dsZV9jbnQgPCBOVU1fVFJZX0JFRk9SRV9BTlRfVE9HR0xFKQotCQkJCWFudF90b2dnbGVfY250Kys7Ci0JCQllbHNlIGlmIChwcml2ICYmCi0JCQkJIGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCQkJICAgJm5ld19yYXRlLCAmdGJsX3R5cGUpKQotCQkJCWFudF90b2dnbGVfY250ID0gMTsKLQotCQkJcmVwZWF0X3JhdGUgPSBJV0xfTlVNQkVSX1RSWTsKLQkJfSBlbHNlIHsKLQkJCXJlcGVhdF9yYXRlID0gSVdMX0hUX05VTUJFUl9UUlk7Ci0JCX0KLQotCQkvKiBEb24ndCBhbGxvdyBIVCByYXRlcyBhZnRlciBuZXh0IHBhc3MuCi0JCSAqIGl3bDQ5NjVfcnNfZ2V0X2xvd2VyX3JhdGUoKSB3aWxsIGNoYW5nZSB0eXBlIHRvIExRX0Egb3IgTFFfRy4gKi8KLQkJdXNlX2h0X3Bvc3NpYmxlID0gMDsKLQotCQkvKiBPdmVycmlkZSBuZXh0IHJhdGUgaWYgbmVlZGVkIGZvciBkZWJ1ZyBwdXJwb3NlcyAqLwotCQlpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGluZGV4KTsKLQotCQkvKiBGaWxsIG5leHQgdGFibGUgZW50cnkgKi8KLQkJbHFfY21kLT5yc190YWJsZVtpbmRleF0ucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIobmV3X3JhdGUpOwotCi0JCWluZGV4Kys7Ci0JCXJlcGVhdF9yYXRlLS07Ci0JfQotCi0JbHFfY21kLT5hZ2dfcGFyYW1zLmFnZ19mcmFtZV9jbnRfbGltaXQgPSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKLQlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCA9IExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUY7Ci0KLQlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX3RpbWVfbGltaXQgPQotCQljcHVfdG9fbGUxNihMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfREVGKTsKLX0KLQotc3RhdGljIHZvaWQKLSppd2w0OTY1X3JzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQotewotCXJldHVybiBody0+cHJpdjsKLX0KLS8qIHJhdGUgc2NhbGUgcmVxdWlyZXMgZnJlZSBmdW5jdGlvbiB0byBiZSBpbXBsZW1lbnRlZCAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19mcmVlKHZvaWQgKnByaXZfcmF0ZSkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfZnJlZV9zdGEodm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJdm9pZCAqcHJpdl9zdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2IF9fbWF5YmVfdW51c2VkID0gcHJpdl9yOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImVudGVyXG4iKTsKLQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmVcbiIpOwotfQotCi0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUwotc3RhdGljIGludCBpd2w0OTY1X29wZW5fZmlsZV9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3Moc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgdTMyICpyYXRlX25fZmxhZ3MsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0JdTggdmFsaWRfdHhfYW50OwotCXU4IGFudF9zZWxfdHg7Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0JdmFsaWRfdHhfYW50ID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQlpZiAobHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSkgewotCQlhbnRfc2VsX3R4ID0KLQkJICAoKGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgJiBSQVRFX01DU19BTlRfQUJDX01TSykKLQkJICA+PiBSQVRFX01DU19BTlRfUE9TKTsKLQkJaWYgKCh2YWxpZF90eF9hbnQgJiBhbnRfc2VsX3R4KSA9PSBhbnRfc2VsX3R4KSB7Ci0JCQkqcmF0ZV9uX2ZsYWdzID0gbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZTsKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJGaXhlZCByYXRlIE9OXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSAwOwotCQkJSVdMX0VSUihwcml2LAotCQkJICAgICJJbnZhbGlkIGFudGVubmEgc2VsZWN0aW9uIDB4JVgsIFZhbGlkIGlzIDB4JVhcbiIsCi0JCQkgICAgYW50X3NlbF90eCwgdmFsaWRfdHhfYW50KTsKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJGaXhlZCByYXRlIE9GRlxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAiRml4ZWQgcmF0ZSBPRkZcbiIpOwotCX0KLX0KLQotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OwotCWNoYXIgYnVmWzY0XTsKLQlzaXplX3QgYnVmX3NpemU7Ci0JdTMyIHBhcnNlZF9yYXRlOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9Ci0JCWNvbnRhaW5lcl9vZihscV9zdGEsIHN0cnVjdCBpd2xfc3RhdGlvbl9wcml2LCBscV9zdGEpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKLQotCXByaXYgPSBscV9zdGEtPmRydjsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKHNzY2FuZihidWYsICIleCIsICZwYXJzZWRfcmF0ZSkgPT0gMSkKLQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IHBhcnNlZF9yYXRlOwotCWVsc2UKLQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7Ci0KLQlscV9zdGEtPmFjdGl2ZV9sZWdhY3lfcmF0ZSA9IDB4MEZGRjsJLyogMSAtIDU0IE1CaXRzLCBpbmNsdWRlcyBDQ0sgKi8KLQlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgICA9IDB4MUZEMDsJLyogNiAtIDYwIE1CaXRzLCBubyA5LCBubyBDQ0sgKi8KLQlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlICA9IDB4MUZEMDsJLyogNiAtIDYwIE1CaXRzLCBubyA5LCBubyBDQ0sgKi8KLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJzdGFfaWQgJWQgcmF0ZSAweCVYXG4iLAotCQlscV9zdGEtPmxxLnN0YV9pZCwgbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSk7Ci0KLQlpZiAobHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSkgewotCQlpd2w0OTY1X3JzX2ZpbGxfbGlua19jbWQoTlVMTCwgbHFfc3RhLCBscV9zdGEtPmRiZ19maXhlZF9yYXRlKTsKLQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChscV9zdGEtPmRydiwgY3R4LCAmbHFfc3RhLT5scSwgQ01EX0FTWU5DLAotCQkJCWZhbHNlKTsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgKmJ1ZmY7Ci0JaW50IGRlc2MgPSAwOwotCWludCBpID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCXNzaXplX3QgcmV0OwotCi0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0JYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJzdGFfaWQgJWRcbiIsIGxxX3N0YS0+bHEuc3RhX2lkKTsKLQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiZmFpbGVkPSVkIHN1Y2Nlc3M9JWQgcmF0ZT0wJVhcbiIsCi0JCQlscV9zdGEtPnRvdGFsX2ZhaWxlZCwgbHFfc3RhLT50b3RhbF9zdWNjZXNzLAotCQkJbHFfc3RhLT5hY3RpdmVfbGVnYWN5X3JhdGUpOwotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJmaXhlZCByYXRlIDB4JVhcbiIsCi0JCQlscV9zdGEtPmRiZ19maXhlZF9yYXRlKTsKLQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAidmFsaWRfdHhfYW50ICVzJXMlc1xuIiwKLQkgICAgKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiBBTlRfQSkgPyAiQU5UX0EsIiA6ICIiLAotCSAgICAocHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCAmIEFOVF9CKSA/ICJBTlRfQiwiIDogIiIsCi0JICAgIChwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgQU5UX0MpID8gIkFOVF9DIiA6ICIiKTsKLQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAibHEgdHlwZSAlc1xuIiwKLQkgICAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpID8gImxlZ2FjeSIgOiAiSFQiKTsKLQlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgewotCQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiICVzIiwKLQkJICAgKGlzX3Npc28odGJsLT5scV90eXBlKSkgPyAiU0lTTyIgOiAiTUlNTzIiKTsKLQkJICAgZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgIiAlcyIsCi0JCSAgICh0YmwtPmlzX2h0NDApID8gIjQwTUh6IiA6ICIyME1IeiIpOwotCQkgICBkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiICVzICVzICVzXG4iLAotCQkJKHRibC0+aXNfU0dJKSA/ICJTR0kiIDogIiIsCi0JCSAgIChscV9zdGEtPmlzX2dyZWVuKSA/ICJHRiBlbmFibGVkIiA6ICIiLAotCQkgICAobHFfc3RhLT5pc19hZ2cpID8gIkFHRyBvbiIgOiAiIik7Ci0JfQotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJsYXN0IHR4IHJhdGU9MHglWFxuIiwKLQkJbHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyk7Ci0JZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgImdlbmVyYWw6IgotCQkiZmxhZ3M9MHglWCBtaW1vLWQ9JWQgcy1hbnQweCV4IGQtYW50PTB4JXhcbiIsCi0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZmxhZ3MsCi0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMubWltb19kZWxpbWl0ZXIsCi0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrLAotCQlscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spOwotCi0JZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgImFnZzoiCi0JCQkidGltZV9saW1pdD0lZCBkaXN0X3N0YXJ0X3RoPSVkIGZyYW1lX2NudF9saW1pdD0lZFxuIiwKLQkJCWxlMTZfdG9fY3B1KGxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCksCi0JCQlscV9zdGEtPmxxLmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCwKLQkJCWxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfZnJhbWVfY250X2xpbWl0KTsKLQotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkiU3RhcnQgaWR4IFswXT0weCV4IFsxXT0weCV4IFsyXT0weCV4IFszXT0weCV4XG4iLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzBdLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzFdLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzJdLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzNdKTsKLQotCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKSB7Ci0JCWluZGV4ID0gaXdsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgoCi0JCQlsZTMyX3RvX2NwdShscV9zdGEtPmxxLnJzX3RhYmxlW2ldLnJhdGVfbl9mbGFncykpOwotCQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKLQkJCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICIgcmF0ZVslZF0gMHglWCAlc21icHNcbiIsCi0JCQlpLAotCQkJbGUzMl90b19jcHUobHFfc3RhLT5scS5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpLAotCQkJaXdsX3JhdGVfbWNzW2luZGV4XS5tYnBzKTsKLQkJfSBlbHNlIHsKLQkJCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkiIHJhdGVbJWRdIDB4JVggJXNtYnBzICglcylcbiIsCi0JCQlpLAotCQkJbGUzMl90b19jcHUobHFfc3RhLT5scS5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpLAotCQkJaXdsX3JhdGVfbWNzW2luZGV4XS5tYnBzLCBpd2xfcmF0ZV9tY3NbaW5kZXhdLm1jcyk7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZmYsIGRlc2MpOwotCWtmcmVlKGJ1ZmYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9vcHMgPSB7Ci0JLndyaXRlID0gaXdsNDk2NV9yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfd3JpdGUsCi0JLnJlYWQgPSBpd2w0OTY1X3JzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9yZWFkLAotCS5vcGVuID0gaXdsNDk2NV9vcGVuX2ZpbGVfZ2VuZXJpYywKLQkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCi19Owotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCWNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciAqYnVmZjsKLQlpbnQgZGVzYyA9IDA7Ci0JaW50IGksIGo7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBMUV9TSVpFOyBpKyspIHsKLQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKLQkJCQkiJXMgdHlwZT0lZCBTR0k9JWQgSFQ0MD0lZCBEVVA9JWQgR0Y9JWRcbiIKLQkJCQkicmF0ZT0weCVYXG4iLAotCQkJCWxxX3N0YS0+YWN0aXZlX3RibCA9PSBpID8gIioiIDogIngiLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS5scV90eXBlLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS5pc19TR0ksCi0JCQkJbHFfc3RhLT5scV9pbmZvW2ldLmlzX2h0NDAsCi0JCQkJbHFfc3RhLT5scV9pbmZvW2ldLmlzX2R1cCwKLQkJCQlscV9zdGEtPmlzX2dyZWVuLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS5jdXJyZW50X3JhdGUpOwotCQlmb3IgKGogPSAwOyBqIDwgSVdMX1JBVEVfQ09VTlQ7IGorKykgewotCQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKLQkJCQkiY291bnRlcj0lZCBzdWNjZXNzPSVkICUlPSVkXG4iLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS53aW5bal0uY291bnRlciwKLQkJCQlscV9zdGEtPmxxX2luZm9baV0ud2luW2pdLnN1Y2Nlc3NfY291bnRlciwKLQkJCQlscV9zdGEtPmxxX2luZm9baV0ud2luW2pdLnN1Y2Nlc3NfcmF0aW8pOwotCQl9Ci0JfQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmZiwgZGVzYyk7Ci0Ja2ZyZWUoYnVmZik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX29wcyA9IHsKLQkucmVhZCA9IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX3JlYWQsCi0JLm9wZW4gPSBpd2w0OTY1X29wZW5fZmlsZV9nZW5lcmljLAotCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyIGJ1ZmZbMTIwXTsKLQlpbnQgZGVzYyA9IDA7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmbHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF07Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0KLQlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkKLQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKLQkJCQkiQml0IFJhdGU9ICVkIE1iL3NcbiIsCi0JCQkJdGJsLT5leHBlY3RlZF90cHRbbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHhdKTsKLQllbHNlCi0JCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkJIkJpdCBSYXRlPSAlZCBNYi9zXG4iLAotCQkJCWl3bGVnYWN5X3JhdGVzW2xxX3N0YS0+bGFzdF90eHJhdGVfaWR4XS5pZWVlID4+IDEpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX29wcyA9IHsKLQkucmVhZCA9IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9yZWFkLAotCS5vcGVuID0gaXdsNDk2NV9vcGVuX2ZpbGVfZ2VuZXJpYywKLQkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCi19OwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX2FkZF9kZWJ1Z2ZzKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhLAotCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpCi17Ci0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IHByaXZfc3RhOwotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGUgPQotCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3NjYWxlX3RhYmxlIiwgU19JUlVTUiB8IFNfSVdVU1IsIGRpciwKLQkJCQlscV9zdGEsICZyc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfb3BzKTsKLQlscV9zdGEtPnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlID0KLQkJZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zdGF0c190YWJsZSIsIFNfSVJVU1IsIGRpciwKLQkJCWxxX3N0YSwgJnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9vcHMpOwotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9maWxlID0KLQkJZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zY2FsZV9kYXRhIiwgU19JUlVTUiwgZGlyLAotCQkJbHFfc3RhLCAmcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9vcHMpOwotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3R4X2FnZ190aWRfZW5fZmlsZSA9Ci0JCWRlYnVnZnNfY3JlYXRlX3U4KCJ0eF9hZ2dfdGlkX2VuYWJsZSIsIFNfSVJVU1IgfCBTX0lXVVNSLCBkaXIsCi0JCSZscV9zdGEtPnR4X2FnZ190aWRfZW4pOwotCi19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfcmVtb3ZlX2RlYnVnZnModm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEpCi17Ci0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IHByaXZfc3RhOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGUpOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUpOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9maWxlKTsKLQlkZWJ1Z2ZzX3JlbW92ZShscV9zdGEtPnJzX3N0YV9kYmdmc190eF9hZ2dfdGlkX2VuX2ZpbGUpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBJbml0aWFsaXphdGlvbiBvZiByYXRlIHNjYWxpbmcgaW5mb3JtYXRpb24gaXMgZG9uZSBieSBkcml2ZXIgYWZ0ZXIKLSAqIHRoZSBzdGF0aW9uIGlzIGFkZGVkLiBTaW5jZSBtYWM4MDIxMSBjYWxscyB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhCi0gKiBzdGF0aW9uIGlzIGFkZGVkIHdlIGlnbm9yZSBpdC4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfcnNfcmF0ZV9pbml0X3N0dWIodm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSkKLXsKLX0KLXN0YXRpYyBzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyByc180OTY1X29wcyA9IHsKLQkubW9kdWxlID0gTlVMTCwKLQkubmFtZSA9IElXTDQ5NjVfUlNfTkFNRSwKLQkudHhfc3RhdHVzID0gaXdsNDk2NV9yc190eF9zdGF0dXMsCi0JLmdldF9yYXRlID0gaXdsNDk2NV9yc19nZXRfcmF0ZSwKLQkucmF0ZV9pbml0ID0gaXdsNDk2NV9yc19yYXRlX2luaXRfc3R1YiwKLQkuYWxsb2MgPSBpd2w0OTY1X3JzX2FsbG9jLAotCS5mcmVlID0gaXdsNDk2NV9yc19mcmVlLAotCS5hbGxvY19zdGEgPSBpd2w0OTY1X3JzX2FsbG9jX3N0YSwKLQkuZnJlZV9zdGEgPSBpd2w0OTY1X3JzX2ZyZWVfc3RhLAotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JLmFkZF9zdGFfZGVidWdmcyA9IGl3bDQ5NjVfcnNfYWRkX2RlYnVnZnMsCi0JLnJlbW92ZV9zdGFfZGVidWdmcyA9IGl3bDQ5NjVfcnNfcmVtb3ZlX2RlYnVnZnMsCi0jZW5kaWYKLX07Ci0KLWludCBpd2w0OTY1X3JhdGVfY29udHJvbF9yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiBpZWVlODAyMTFfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCZyc180OTY1X29wcyk7Ci19Ci0KLXZvaWQgaXdsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKQotewotCWllZWU4MDIxMV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigmcnNfNDk2NV9vcHMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMTQ0YmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnguYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1ody5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0KLXZvaWQgaXdsNDk2NV9yeF9taXNzZWRfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfbWlzc2VkX2JlYWNvbl9ub3RpZiAqbWlzc2VkX2JlYWNvbjsKLQotCW1pc3NlZF9iZWFjb24gPSAmcGt0LT51Lm1pc3NlZF9iZWFjb247Ci0JaWYgKGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPmNvbnNlY3V0aXZlX21pc3NlZF9iZWFjb25zKSA+Ci0JICAgIHByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LAotCQkgICAgIm1pc3NlZCBiY24gY25zcSAlZCB0b3RsICVkIHJjZCAlZCBleHBjdGQgJWRcbiIsCi0JCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5jb25zZWN1dGl2ZV9taXNzZWRfYmVhY29ucyksCi0JCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT50b3RhbF9taXNzZWRfYmVjb25zKSwKLQkJICAgIGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9yZWN2ZF9iZWFjb25zKSwKLQkJICAgIGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9leHBlY3RlZF9iZWFjb25zKSk7Ci0JCWlmICghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJCWl3bDQ5NjVfaW5pdF9zZW5zaXRpdml0eShwcml2KTsKLQl9Ci19Ci0KLS8qIENhbGN1bGF0ZSBub2lzZSBsZXZlbCwgYmFzZWQgb24gbWVhc3VyZW1lbnRzIGR1cmluZyBuZXR3b3JrIHNpbGVuY2UganVzdAotICogICBiZWZvcmUgYXJyaXZpbmcgYmVhY29uLiAgVGhpcyBtZWFzdXJlbWVudCBjYW4gYmUgZG9uZSBvbmx5IGlmIHdlIGtub3cKLSAqICAgZXhhY3RseSB3aGVuIHRvIGV4cGVjdCBiZWFjb25zLCB0aGVyZWZvcmUgb25seSB3aGVuIHdlJ3JlIGFzc29jaWF0ZWQuICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3J4X2NhbGNfbm9pc2Uoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkgKnJ4X2luZm87Ci0JaW50IG51bV9hY3RpdmVfcnggPSAwOwotCWludCB0b3RhbF9zaWxlbmNlID0gMDsKLQlpbnQgYmNuX3NpbGVuY2VfYSwgYmNuX3NpbGVuY2VfYiwgYmNuX3NpbGVuY2VfYzsKLQlpbnQgbGFzdF9yeF9ub2lzZTsKLQotCXJ4X2luZm8gPSAmKHByaXYtPl80OTY1LnN0YXRpc3RpY3MucnguZ2VuZXJhbCk7Ci0JYmNuX3NpbGVuY2VfYSA9Ci0JCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSkgJiBJTl9CQU5EX0ZJTFRFUjsKLQliY25fc2lsZW5jZV9iID0KLQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKSAmIElOX0JBTkRfRklMVEVSOwotCWJjbl9zaWxlbmNlX2MgPQotCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpICYgSU5fQkFORF9GSUxURVI7Ci0KLQlpZiAoYmNuX3NpbGVuY2VfYSkgewotCQl0b3RhbF9zaWxlbmNlICs9IGJjbl9zaWxlbmNlX2E7Ci0JCW51bV9hY3RpdmVfcngrKzsKLQl9Ci0JaWYgKGJjbl9zaWxlbmNlX2IpIHsKLQkJdG90YWxfc2lsZW5jZSArPSBiY25fc2lsZW5jZV9iOwotCQludW1fYWN0aXZlX3J4Kys7Ci0JfQotCWlmIChiY25fc2lsZW5jZV9jKSB7Ci0JCXRvdGFsX3NpbGVuY2UgKz0gYmNuX3NpbGVuY2VfYzsKLQkJbnVtX2FjdGl2ZV9yeCsrOwotCX0KLQotCS8qIEF2ZXJhZ2UgYW1vbmcgYWN0aXZlIGFudGVubmFzICovCi0JaWYgKG51bV9hY3RpdmVfcngpCi0JCWxhc3Rfcnhfbm9pc2UgPSAodG90YWxfc2lsZW5jZSAvIG51bV9hY3RpdmVfcngpIC0gMTA3OwotCWVsc2UKLQkJbGFzdF9yeF9ub2lzZSA9IElXTF9OT0lTRV9NRUFTX05PVF9BVkFJTEFCTEU7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImluYmFuZCBzaWxlbmNlIGEgJXUsIGIgJXUsIGMgJXUsIGRCbSAlZFxuIiwKLQkJCWJjbl9zaWxlbmNlX2EsIGJjbl9zaWxlbmNlX2IsIGJjbl9zaWxlbmNlX2MsCi0JCQlsYXN0X3J4X25vaXNlKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0vKgotICogIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIG9mIGFsbCBzdGF0aXN0aWNzIGNvdW50ZXIgYXJlIGluIERXT1JECi0gKiAgRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgZm9yIGRlYnVnZ2luZywgZG8gbm90IGRlYWwgd2l0aAotICogIHRoZSBjYXNlIG9mIGNvdW50ZXJzIHJvbGwtb3Zlci4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9hY2N1bXVsYXRpdmVfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCV9fbGUzMiAqc3RhdHMpCi17Ci0JaW50IGksIHNpemU7Ci0JX19sZTMyICpwcmV2X3N0YXRzOwotCXUzMiAqYWNjdW1fc3RhdHM7Ci0JdTMyICpkZWx0YSwgKm1heF9kZWx0YTsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfdHggKnR4LCAqYWNjdW1fdHg7Ci0KLQlwcmV2X3N0YXRzID0gKF9fbGUzMiAqKSZwcml2LT5fNDk2NS5zdGF0aXN0aWNzOwotCWFjY3VtX3N0YXRzID0gKHUzMiAqKSZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzKTsKLQlnZW5lcmFsID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uOwotCXR4ID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MudHg7Ci0JYWNjdW1fdHggPSAmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcy50eDsKLQlkZWx0YSA9ICh1MzIgKikmcHJpdi0+XzQ5NjUuZGVsdGFfc3RhdGlzdGljczsKLQltYXhfZGVsdGEgPSAodTMyICopJnByaXYtPl80OTY1Lm1heF9kZWx0YTsKLQotCWZvciAoaSA9IHNpemVvZihfX2xlMzIpOyBpIDwgc2l6ZTsKLQkgICAgIGkgKz0gc2l6ZW9mKF9fbGUzMiksIHN0YXRzKyssIHByZXZfc3RhdHMrKywgZGVsdGErKywKLQkgICAgIG1heF9kZWx0YSsrLCBhY2N1bV9zdGF0cysrKSB7Ci0JCWlmIChsZTMyX3RvX2NwdSgqc3RhdHMpID4gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKSB7Ci0JCQkqZGVsdGEgPSAobGUzMl90b19jcHUoKnN0YXRzKSAtCi0JCQkJbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKTsKLQkJCSphY2N1bV9zdGF0cyArPSAqZGVsdGE7Ci0JCQlpZiAoKmRlbHRhID4gKm1heF9kZWx0YSkKLQkJCQkqbWF4X2RlbHRhID0gKmRlbHRhOwotCQl9Ci0JfQotCi0JLyogcmVzZXQgYWNjdW11bGF0aXZlIHN0YXRpc3RpY3MgZm9yICJuby1jb3VudGVyIiB0eXBlIHN0YXRpc3RpY3MgKi8KLQlhY2N1bV9nZW5lcmFsLT50ZW1wZXJhdHVyZSA9IGdlbmVyYWwtPnRlbXBlcmF0dXJlOwotCWFjY3VtX2dlbmVyYWwtPnR0bF90aW1lc3RhbXAgPSBnZW5lcmFsLT50dGxfdGltZXN0YW1wOwotfQotI2VuZGlmCi0KLSNkZWZpbmUgUkVHX1JFQ0FMSUJfUEVSSU9EICg2MCkKLQotdm9pZCBpd2w0OTY1X3J4X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0JaW50IGNoYW5nZTsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCUlXTF9ERUJVR19SWChwcml2LAotCQkgICAgICJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKLQkJICAgICAoaW50KXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpLAotCQkgICAgIGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYKLQkJICAgICBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSyk7Ci0KLQljaGFuZ2UgPSAoKHByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUgIT0KLQkJICAgcGt0LT51LnN0YXRzLmdlbmVyYWwuY29tbW9uLnRlbXBlcmF0dXJlKSB8fAotCQkgICAoKHByaXYtPl80OTY1LnN0YXRpc3RpY3MuZmxhZyAmCi0JCSAgIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spICE9Ci0JCSAgIChwa3QtPnUuc3RhdHMuZmxhZyAmCi0JCSAgIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spKSk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQlpd2w0OTY1X2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHByaXYsIChfX2xlMzIgKikmcGt0LT51LnN0YXRzKTsKLSNlbmRpZgotCi0JLyogVE9ETzogcmVhZGluZyBzb21lIG9mIHN0YXRpc3RpY3MgaXMgdW5uZWVkZWQgKi8KLQltZW1jcHkoJnByaXYtPl80OTY1LnN0YXRpc3RpY3MsICZwa3QtPnUuc3RhdHMsCi0JCXNpemVvZihwcml2LT5fNDk2NS5zdGF0aXN0aWNzKSk7Ci0KLQlzZXRfYml0KFNUQVRVU19TVEFUSVNUSUNTLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIFJlc2NoZWR1bGUgdGhlIHN0YXRpc3RpY3MgdGltZXIgdG8gb2NjdXIgaW4KLQkgKiBSRUdfUkVDQUxJQl9QRVJJT0Qgc2Vjb25kcyB0byBlbnN1cmUgd2UgZ2V0IGEKLQkgKiB0aGVybWFsIHVwZGF0ZSBldmVuIGlmIHRoZSB1Q29kZSBkb2Vzbid0IGdpdmUKLQkgKiB1cyBvbmUgKi8KLQltb2RfdGltZXIoJnByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMsIGppZmZpZXMgKwotCQkgIG1zZWNzX3RvX2ppZmZpZXMoUkVHX1JFQ0FMSUJfUEVSSU9EICogMTAwMCkpOwotCi0JaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSAmJgotCSAgICAocGt0LT5oZHIuY21kID09IFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OKSkgewotCQlpd2w0OTY1X3J4X2NhbGNfbm9pc2UocHJpdik7Ci0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cnVuX3RpbWVfY2FsaWJfd29yayk7Ci0JfQotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50ZW1wX29wcy50ZW1wZXJhdHVyZSAmJiBjaGFuZ2UpCi0JCXByaXYtPmNmZy0+b3BzLT5saWItPnRlbXBfb3BzLnRlbXBlcmF0dXJlKHByaXYpOwotfQotCi12b2lkIGl3bDQ5NjVfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCWlmIChsZTMyX3RvX2NwdShwa3QtPnUuc3RhdHMuZmxhZykgJiBVQ09ERV9TVEFUSVNUSUNTX0NMRUFSX01TSykgewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JCW1lbXNldCgmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcywgMCwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpKTsKLQkJbWVtc2V0KCZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcykpOwotCQltZW1zZXQoJnByaXYtPl80OTY1Lm1heF9kZWx0YSwgMCwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpKTsKLSNlbmRpZgotCQlJV0xfREVCVUdfUlgocHJpdiwgIlN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOwotCX0KLQlpd2w0OTY1X3J4X3N0YXRpc3RpY3MocHJpdiwgcnhiKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXN0YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtc3RhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjJjMjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtc3RhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLQotc3RhdGljIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqCi1pd2w0OTY1X3N0YV9hbGxvY19scShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKLXsKLQlpbnQgaSwgcjsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOwotCXUzMiByYXRlX2ZsYWdzID0gMDsKLQlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwotCi0JbGlua19jbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxpbmtfY21kKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIExRIGNtZC5cbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogU2V0IHVwIHRoZSByYXRlIHNjYWxpbmcgdG8gc3RhcnQgYXQgc2VsZWN0ZWQgcmF0ZSwgZmFsbCBiYWNrCi0JICogYWxsIHRoZSB3YXkgZG93biB0byAxTSBpbiBJRUVFIG9yZGVyLCBhbmQgdGhlbiBzcGluIG9uIDFNICovCi0JaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJciA9IElXTF9SQVRFXzZNX0lOREVYOwotCWVsc2UKLQkJciA9IElXTF9SQVRFXzFNX0lOREVYOwotCi0JaWYgKHIgPj0gSVdMX0ZJUlNUX0NDS19SQVRFICYmIHIgPD0gSVdMX0xBU1RfQ0NLX1JBVEUpCi0JCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKLQotCXJhdGVfZmxhZ3MgfD0gaXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpIDw8Ci0JCQkJUkFURV9NQ1NfQU5UX1BPUzsKLQlyYXRlX25fZmxhZ3MgPSBpd2w0OTY1X2h3X3NldF9yYXRlX25fZmxhZ3MoaXdsZWdhY3lfcmF0ZXNbcl0ucGxjcCwKLQkJCQkJCSAgIHJhdGVfZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKQotCQlsaW5rX2NtZC0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzID0gcmF0ZV9uX2ZsYWdzOwotCi0JbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zayA9Ci0JCQkJaXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCi0JbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQotCQlwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYKLQkJfml3bDQ5NjVfZmlyc3RfYW50ZW5uYShwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKLQlpZiAoIWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKSB7Ci0JCWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0gQU5UX0FCOwotCX0gZWxzZSBpZiAoaXdsNDk2NV9udW1fb2ZfYW50KHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpID09IDIpIHsKLQkJbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQotCQkJcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQl9Ci0KLQlsaW5rX2NtZC0+YWdnX3BhcmFtcy5hZ2dfZGlzX3N0YXJ0X3RoID0gTElOS19RVUFMX0FHR19ESVNBQkxFX1NUQVJUX0RFRjsKLQlsaW5rX2NtZC0+YWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCA9Ci0JCWNwdV90b19sZTE2KExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9ERUYpOwotCi0JbGlua19jbWQtPnN0YV9pZCA9IHN0YV9pZDsKLQotCXJldHVybiBsaW5rX2NtZDsKLX0KLQotLyoKLSAqIGl3bDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24gLSBBZGQgdGhlIHNwZWNpYWwgSUJTUyBCU1NJRCBzdGF0aW9uCi0gKgotICogRnVuY3Rpb24gc2xlZXBzLgotICovCi1pbnQKLWl3bDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgICBjb25zdCB1OCAqYWRkciwgdTggKnN0YV9pZF9yKQotewotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzdGFfaWRfcikKLQkJKnN0YV9pZF9yID0gSVdMX0lOVkFMSURfU1RBVElPTjsKLQotCXJldCA9IGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uKHByaXYsIGN0eCwgYWRkciwgMCwgTlVMTCwgJnN0YV9pZCk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBhZGRyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoc3RhX2lkX3IpCi0JCSpzdGFfaWRfciA9IHN0YV9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJV0xfU1RBX0xPQ0FMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQkvKiBTZXQgdXAgZGVmYXVsdCByYXRlIHNjYWxpbmcgdGFibGUgaW4gZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCWxpbmtfY21kID0gaXdsNDk2NV9zdGFfYWxsb2NfbHEocHJpdiwgc3RhX2lkKTsKLQlpZiAoIWxpbmtfY21kKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIHN0YXRpb24gJXBNLlxuIiwKLQkJCWFkZHIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfbHFfY21kKHByaXYsIGN0eCwgbGlua19jbWQsIENNRF9TWU5DLCB0cnVlKTsKLQlpZiAocmV0KQotCQlJV0xfRVJSKHByaXYsICJMaW5rIHF1YWxpdHkgY29tbWFuZCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBsaW5rX2NtZDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkgICAgICBib29sIHNlbmRfaWZfZW1wdHkpCi17Ci0JaW50IGksIG5vdF9lbXB0eSA9IDA7Ci0JdTggYnVmZltzaXplb2Yoc3RydWN0IGl3bF93ZXBfY21kKSArCi0JCXNpemVvZihzdHJ1Y3QgaXdsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYXTsKLQlzdHJ1Y3QgaXdsX3dlcF9jbWQgKndlcF9jbWQgPSAoc3RydWN0IGl3bF93ZXBfY21kICopYnVmZjsKLQlzaXplX3QgY21kX3NpemUgID0gc2l6ZW9mKHN0cnVjdCBpd2xfd2VwX2NtZCk7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IGN0eC0+d2VwX2tleV9jbWQsCi0JCS5kYXRhID0gd2VwX2NtZCwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCi0JfTsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQltZW1zZXQod2VwX2NtZCwgMCwgY21kX3NpemUgKwotCQkJKHNpemVvZihzdHJ1Y3QgaXdsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVNfTUFYIDsgaSsrKSB7Ci0JCXdlcF9jbWQtPmtleVtpXS5rZXlfaW5kZXggPSBpOwotCQlpZiAoY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZSkgewotCQkJd2VwX2NtZC0+a2V5W2ldLmtleV9vZmZzZXQgPSBpOwotCQkJbm90X2VtcHR5ID0gMTsKLQkJfSBlbHNlIHsKLQkJCXdlcF9jbWQtPmtleVtpXS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOwotCQl9Ci0KLQkJd2VwX2NtZC0+a2V5W2ldLmtleV9zaXplID0gY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZTsKLQkJbWVtY3B5KCZ3ZXBfY21kLT5rZXlbaV0ua2V5WzNdLCBjdHgtPndlcF9rZXlzW2ldLmtleSwKLQkJCQljdHgtPndlcF9rZXlzW2ldLmtleV9zaXplKTsKLQl9Ci0KLQl3ZXBfY21kLT5nbG9iYWxfa2V5X3R5cGUgPSBXRVBfS0VZX1dFUF9UWVBFOwotCXdlcF9jbWQtPm51bV9rZXlzID0gV0VQX0tFWVNfTUFYOwotCi0JY21kX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBpd2xfd2VwX2tleSkgKiBXRVBfS0VZU19NQVg7Ci0KLQljbWQubGVuID0gY21kX3NpemU7Ci0KLQlpZiAobm90X2VtcHR5IHx8IHNlbmRfaWZfZW1wdHkpCi0JCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kKHByaXYsICZjbWQpOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLWludCBpd2w0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIGl3bDQ5NjVfc3RhdGljX3dlcGtleV9jbWQocHJpdiwgY3R4LCBmYWxzZSk7Ci19Ci0KLWludCBpd2w0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZikKLXsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX1dFUChwcml2LCAiUmVtb3ZpbmcgZGVmYXVsdCBXRVAga2V5OiBpZHg9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmtleWlkeCk7Ci0KLQltZW1zZXQoJmN0eC0+d2VwX2tleXNba2V5Y29uZi0+a2V5aWR4XSwgMCwgc2l6ZW9mKGN0eC0+d2VwX2tleXNbMF0pKTsKLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJSVdMX0RFQlVHX1dFUChwcml2LAotCQkiTm90IHNlbmRpbmcgUkVQTFlfV0VQS0VZIGNvbW1hbmQgZHVlIHRvIFJGS0lMTC5cbiIpOwotCQkvKiBidXQga2V5cyBpbiBkZXZpY2UgYXJlIGNsZWFyIGFueXdheSBzbyByZXR1cm4gc3VjY2VzcyAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0ID0gaXdsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChwcml2LCBjdHgsIDEpOwotCUlXTF9ERUJVR19XRVAocHJpdiwgIlJlbW92ZSBkZWZhdWx0IFdFUCBrZXk6IGlkeD0lZCByZXQ9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmtleWlkeCwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBpd2w0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZikKLXsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKGtleWNvbmYtPmtleWxlbiAhPSBXRVBfS0VZX0xFTl8xMjggJiYKLQkgICAga2V5Y29uZi0+a2V5bGVuICE9IFdFUF9LRVlfTEVOXzY0KSB7Ci0JCUlXTF9ERUJVR19XRVAocHJpdiwgIkJhZCBXRVAga2V5IGxlbmd0aCAlZFxuIiwga2V5Y29uZi0+a2V5bGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Ja2V5Y29uZi0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQlrZXljb25mLT5od19rZXlfaWR4ID0gSFdfS0VZX0RFRkFVTFQ7Ci0JcHJpdi0+c3RhdGlvbnNbY3R4LT5hcF9zdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOwotCi0JY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleV9zaXplID0ga2V5Y29uZi0+a2V5bGVuOwotCW1lbWNweSgmY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleSwgJmtleWNvbmYtPmtleSwKLQkJCQkJCQlrZXljb25mLT5rZXlsZW4pOwotCi0JcmV0ID0gaXdsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChwcml2LCBjdHgsIGZhbHNlKTsKLQlJV0xfREVCVUdfV0VQKHByaXYsICJTZXQgZGVmYXVsdCBXRVAga2V5OiBsZW49JWQgaWR4PSVkIHJldD0lZFxuIiwKLQkJa2V5Y29uZi0+a2V5bGVuLCBrZXljb25mLT5rZXlpZHgsIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2V0X3dlcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCQkJdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTE2IGtleV9mbGFncyA9IDA7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0Ja2V5Y29uZi0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQotCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfV0VQIHwgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0spOwotCWtleV9mbGFncyB8PSBjcHVfdG9fbGUxNihrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKTsKLQlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0KLQlpZiAoa2V5Y29uZi0+a2V5bGVuID09IFdFUF9LRVlfTEVOXzEyOCkKLQkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfRkxHX0tFWV9TSVpFX01TSzsKLQotCWlmIChzdGFfaWQgPT0gY3R4LT5iY2FzdF9zdGFfaWQpCi0JCWtleV9mbGFncyB8PSBTVEFfS0VZX01VTFRJQ0FTVF9NU0s7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleWxlbiA9IGtleWNvbmYtPmtleWxlbjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5aWR4ID0ga2V5Y29uZi0+a2V5aWR4OwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksCi0JCQkJa2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOwotCi0JbWVtY3B5KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5WzNdLAotCQkJCWtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKLQotCWlmICgocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyAmIFNUQV9LRVlfRkxHX0VOQ1JZUFRfTVNLKQotCQkJPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9Ci0JCQkJIGl3bF9sZWdhY3lfZ2V0X2ZyZWVfdWNvZGVfa2V5X2luZGV4KHByaXYpOwotCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCi0JICogaW4gdUNvZGUuICovCi0KLQlXQVJOKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKLQkJIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCQkgdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTE2IGtleV9mbGFncyA9IDA7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0Ja2V5X2ZsYWdzIHw9IChTVEFfS0VZX0ZMR19DQ01QIHwgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0spOwotCWtleV9mbGFncyB8PSBjcHVfdG9fbGUxNihrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKTsKLQlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0KLQlpZiAoc3RhX2lkID09IGN0eC0+YmNhc3Rfc3RhX2lkKQotCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9NVUxUSUNBU1RfTVNLOwotCi0Ja2V5Y29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0ga2V5Y29uZi0+a2V5bGVuOwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwKLQkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKLQotCW1lbWNweShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksCi0JICAgICAgIGtleWNvbmYtPmtleWxlbik7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChwcml2KTsKLQkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQotCSAqIGluIHVDb2RlLiAqLwotCi0JV0FSTihwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCi0JCSJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7Ci0KLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0KLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCSBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YV9jbWQsIENNRF9TWU5DKTsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJCSB1OCBzdGFfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQlfX2xlMTYga2V5X2ZsYWdzID0gMDsKLQotCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfVEtJUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKLQlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7Ci0Ja2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOwotCi0JaWYgKHN0YV9pZCA9PSBjdHgtPmJjYXN0X3N0YV9pZCkKLQkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfTVVMVElDQVNUX01TSzsKLQotCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0gMTY7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChwcml2KTsKLQkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQotCSAqIGluIHVDb2RlLiAqLwotCi0JV0FSTihwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCi0JCSJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7Ci0KLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOwotCi0KLQkvKiBUaGlzIGNvcHkgaXMgYWN1dGFsbHkgbm90IG5lZWRlZDogd2UgZ2V0IHRoZSBrZXkgd2l0aCBlYWNoIFRYICovCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwgMTYpOwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXksIGtleWNvbmYtPmtleSwgMTYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaXdsNDk2NV91cGRhdGVfdGtpcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpCi17Ci0JdTggc3RhX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbChwcml2KSkgewotCQkvKiBjYW5jZWwgc2NhbiBmYWlsZWQsIGp1c3QgbGl2ZSB3LyBiYWQga2V5IGFuZCByZWx5Ci0JCSAgIGJyaWVmbHkgb24gU1cgZGVjcnlwdGlvbiAqLwotCQlyZXR1cm47Ci0JfQotCi0Jc3RhX2lkID0gaXdsX2xlZ2FjeV9zdGFfaWRfb3JfYnJvYWRjYXN0KHByaXYsIGN0eCwgc3RhKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHNjX2J5dGUyID0gKHU4KSBpdjMyOwotCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHRha1tpXSA9Ci0JCQljcHVfdG9fbGUxNihwaGFzZTFrZXlbaV0pOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCWl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLX0KLQotaW50IGl3bDQ5NjVfcmVtb3ZlX2R5bmFtaWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJICAgdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IGtleV9mbGFnczsKLQl1OCBrZXlpZHg7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JY3R4LT5rZXlfbWFwcGluZ19rZXlzLS07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlrZXlfZmxhZ3MgPSBsZTE2X3RvX2NwdShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzKTsKLQlrZXlpZHggPSAoa2V5X2ZsYWdzID4+IFNUQV9LRVlfRkxHX0tFWUlEX1BPUykgJiAweDM7Ci0KLQlJV0xfREVCVUdfV0VQKHByaXYsICJSZW1vdmUgZHluYW1pYyBrZXk6IGlkeD0lZCBzdGE9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmtleWlkeCwgc3RhX2lkKTsKLQotCWlmIChrZXljb25mLT5rZXlpZHggIT0ga2V5aWR4KSB7Ci0JCS8qIFdlIG5lZWQgdG8gcmVtb3ZlIGEga2V5IHdpdGggaW5kZXggZGlmZmVyZW50IHRoYXQgdGhlIG9uZQotCQkgKiBpbiB0aGUgdUNvZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUga2V5IHdlIG5lZWQgdG8gcmVtb3ZlIGhhcwotCQkgKiBiZWVuIHJlcGxhY2VkIGJ5IGFub3RoZXIgb25lIHdpdGggZGlmZmVyZW50IGluZGV4LgotCQkgKiBEb24ndCBkbyBhbnl0aGluZyBhbmQgcmV0dXJuIG9rCi0JCSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VUKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJSZW1vdmluZyB3cm9uZyBrZXkgJWQgMHgleFxuIiwKLQkJCSAgICBrZXljb25mLT5rZXlpZHgsIGtleV9mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0LAotCQkmcHJpdi0+dWNvZGVfa2V5X3RhYmxlKSkKLQkJSVdMX0VSUihwcml2LCAiaW5kZXggJWQgbm90IHVzZWQgaW4gdUNvZGUga2V5IHRhYmxlLlxuIiwKLQkJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0KTsKLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mbywgMCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfaHdfa2V5KSk7Ci0JbWVtc2V0KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXksIDAsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvKSk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9Ci0JCQlTVEFfS0VZX0ZMR19OT19FTkMgfCBTVEFfS0VZX0ZMR19JTlZBTElEOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJSVdMX0RFQlVHX1dFUChwcml2LAotCQkgIk5vdCBzZW5kaW5nIFJFUExZX0FERF9TVEEgY29tbWFuZCBiZWNhdXNlIFJGS0lMTCBlbmFibGVkLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwotfQotCi1pbnQgaXdsNDk2NV9zZXRfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQotewotCWludCByZXQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQljdHgtPmtleV9tYXBwaW5nX2tleXMrKzsKLQlrZXljb25mLT5od19rZXlfaWR4ID0gSFdfS0VZX0RZTkFNSUM7Ci0KLQlzd2l0Y2ggKGtleWNvbmYtPmNpcGhlcikgewotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJcmV0ID0gaXdsNDk2NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHByaXYsIGN0eCwKLQkJCQkJCQlrZXljb25mLCBzdGFfaWQpOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCXJldCA9IGl3bDQ5NjVfc2V0X3RraXBfZHluYW1pY19rZXlfaW5mbyhwcml2LCBjdHgsCi0JCQkJCQkJa2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJcmV0ID0gaXdsNDk2NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8ocHJpdiwgY3R4LAotCQkJCQkJCWtleWNvbmYsIHN0YV9pZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJVbmtub3duIGFsZzogJXMgY2lwaGVyID0gJXhcbiIsIF9fZnVuY19fLAotCQkJa2V5Y29uZi0+Y2lwaGVyKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlJV0xfREVCVUdfV0VQKHByaXYsCi0JCSJTZXQgZHluYW1pYyBrZXk6IGNpcGhlcj0leCBsZW49JWQgaWR4PSVkIHN0YT0lZCByZXQ9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmNpcGhlciwga2V5Y29uZi0+a2V5bGVuLCBrZXljb25mLT5rZXlpZHgsCi0JCSAgICAgIHN0YV9pZCwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uIC0gYWRkIGJyb2FkY2FzdCBzdGF0aW9uIGludG8gZHJpdmVyJ3Mgc3RhdGlvbiB0YWJsZS4KLSAqCi0gKiBUaGlzIGFkZHMgdGhlIGJyb2FkY2FzdCBzdGF0aW9uIGludG8gdGhlIGRyaXZlcidzIHN0YXRpb24gdGFibGUKLSAqIGFuZCBtYXJrcyBpdCBkcml2ZXIgYWN0aXZlLCBzbyB0aGF0IGl0IHdpbGwgYmUgcmVzdG9yZWQgdG8gdGhlCi0gKiBkZXZpY2UgYXQgdGhlIG5leHQgYmVzdCB0aW1lLgotICovCi1pbnQgaXdsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBzdGFfaWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3ByZXBfc3RhdGlvbihwcml2LCBjdHgsIGl3bGVnYWN5X2JjYXN0X2FkZHIsCi0JCQkJCQkJCWZhbHNlLCBOVUxMKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIHByZXBhcmUgYnJvYWRjYXN0IHN0YXRpb25cbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJV0xfU1RBX0RSSVZFUl9BQ1RJVkU7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfQkNBU1Q7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCWxpbmtfY21kID0gaXdsNDk2NV9zdGFfYWxsb2NfbHEocHJpdiwgc3RhX2lkKTsKLQlpZiAoIWxpbmtfY21kKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIGJjYXN0IHN0YXRpb24uXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9uIC0gdXBkYXRlIGJyb2FkY2FzdCBzdGF0aW9uJ3MgTFEgY29tbWFuZAotICoKLSAqIE9ubHkgdXNlZCBieSBpd2w0OTY1LiBQbGFjZWQgaGVyZSB0byBoYXZlIGFsbCBiY2FzdCBzdGF0aW9uIG1hbmFnZW1lbnQKLSAqIGNvZGUgdG9nZXRoZXIuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOwotCXU4IHN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOwotCi0JbGlua19jbWQgPSBpd2w0OTY1X3N0YV9hbGxvY19scShwcml2LCBzdGFfaWQpOwotCWlmICghbGlua19jbWQpIHsKLQkJSVdMX0VSUihwcml2LAotCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nIGZvciBiY2FzdCBzdGF0aW9uLlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxKQotCQlrZnJlZShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxKTsKLQllbHNlCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCSJCY2FzdCBzdGF0aW9uIHJhdGUgc2NhbGluZyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LlxuIik7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCWludCByZXQgPSAwOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJcmV0ID0gaXdsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbihwcml2LCBjdHgpOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZCAtIEVuYWJsZSBUeCBmb3IgdGhpcyBUSUQgaW4gc3RhdGlvbiB0YWJsZQotICovCi1pbnQgaXdsNDk2NV9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgdGlkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JLyogUmVtb3ZlICJkaXNhYmxlIiBmbGFnLCB0byBlbmFibGUgVHggZm9yIHRoaXMgVElEICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9USURfRElTQUJMRV9UWDsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS50aWRfZGlzYWJsZV90eCAmPSBjcHVfdG9fbGUxNih+KDEgPDwgdGlkKSk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwotfQotCi1pbnQgaXdsNDk2NV9zdGFfcnhfYWdnX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSBpbnQgdGlkLCB1MTYgc3NuKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YV9pZDsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YV9jbWQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gMDsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0FEREJBX1RJRF9NU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuYWRkX2ltbWVkaWF0ZV9iYV90aWQgPSAodTgpdGlkOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmFkZF9pbW1lZGlhdGVfYmFfc3NuID0gY3B1X3RvX2xlMTYoc3NuKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLWludCBpd2w0OTY1X3N0YV9yeF9hZ2dfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQlpbnQgdGlkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YV9pZDsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YV9jbWQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikgewotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIHN0YXRpb24gZm9yIEFHRyB0aWQgJWRcbiIsIHRpZCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSAwOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfREVMQkFfVElEX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZCA9ICh1OCl0aWQ7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLXZvaWQKLWl3bDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBzdGFfaWQsIGludCBjbnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3MgfD0gU1RBX0ZMR19QV1JfU0FWRV9NU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSBTVEFfRkxHX1BXUl9TQVZFX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPQotCQkJCQlTVEFfTU9ESUZZX1NMRUVQX1RYX0NPVU5UX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zbGVlcF90eF9jb3VudCA9IGNwdV90b19sZTE2KGNudCk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwKLQkJCQkmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMTJlMzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdHguYworKysgL2Rldi9udWxsCkBAIC0xLDEzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotI2luY2x1ZGUgIml3bC00OTY1LWh3LmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLQotLyoKLSAqIG1hYzgwMjExIHF1ZXVlcywgQUNzLCBoYXJkd2FyZSBxdWV1ZXMsIEZJRk9zLgotICoKLSAqIENmLiBodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi9kZXZlbG9wZXJzL0RvY3VtZW50YXRpb24vbWFjODAyMTEvcXVldWVzCi0gKgotICogTWFjODAyMTEgdXNlcyB0aGUgZm9sbG93aW5nIG51bWJlcnMsIHdoaWNoIHdlIGdldCBhcyBmcm9tIGl0Ci0gKiBieSB3YXkgb2Ygc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik6Ci0gKgotICoJVk8JMAotICoJVkkJMQotICoJQkUJMgotICoJQksJMwotICoKLSAqCi0gKiBSZWd1bGFyIChub3QgQS1NUERVKSBmcmFtZXMgYXJlIHB1dCBpbnRvIGhhcmR3YXJlIHF1ZXVlcyBjb3JyZXNwb25kaW5nCi0gKiB0byB0aGUgRklGT3MsIHNlZSBjb21tZW50cyBpbiBpd2wtcHJwaC5oLiBBZ2dyZWdhdGVkIGZyYW1lcyBnZXQgdGhlaXIKLSAqIG93biBxdWV1ZSBwZXIgYWdncmVnYXRpb24gc2Vzc2lvbiAoUkEvVElEIGNvbWJpbmF0aW9uKSwgc3VjaCBxdWV1ZXMgYXJlCi0gKiBzZXQgdXAgdG8gbWFwIGludG8gRklGT3MgdG9vLCBmb3Igd2hpY2ggd2UgbmVlZCBhbiBBQy0+RklGTyBtYXBwaW5nLiBJbgotICogb3JkZXIgdG8gbWFwIGZyYW1lcyB0byB0aGUgcmlnaHQgcXVldWUsIHdlIGFsc28gbmVlZCBhbiBBQy0+aHcgcXVldWUKLSAqIG1hcHBpbmcuIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZS4KLSAqCi0gKiBEdWUgdG8gdGhlIHdheSBodyBxdWV1ZXMgYXJlIHNldCB1cCAoYnkgdGhlIGh3IHNwZWNpZmljIG1vZHVsZXMgbGlrZQotICogaXdsLTQ5NjUuYyksIHRoZSBBQy0+aHcgcXVldWUgbWFwcGluZyBpcyB0aGUgaWRlbnRpdHkKLSAqIG1hcHBpbmcuCi0gKi8KLQotc3RhdGljIGNvbnN0IHU4IHRpZF90b19hY1tdID0gewotCUlFRUU4MDIxMV9BQ19CRSwKLQlJRUVFODAyMTFfQUNfQkssCi0JSUVFRTgwMjExX0FDX0JLLAotCUlFRUU4MDIxMV9BQ19CRSwKLQlJRUVFODAyMTFfQUNfVkksCi0JSUVFRTgwMjExX0FDX1ZJLAotCUlFRUU4MDIxMV9BQ19WTywKLQlJRUVFODAyMTFfQUNfVk8KLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bDQ5NjVfZ2V0X2FjX2Zyb21fdGlkKHUxNiB0aWQpCi17Ci0JaWYgKGxpa2VseSh0aWQgPCBBUlJBWV9TSVpFKHRpZF90b19hYykpKQotCQlyZXR1cm4gdGlkX3RvX2FjW3RpZF07Ci0KLQkvKiBubyBzdXBwb3J0IGZvciBUSURzIDgtMTUgeWV0ICovCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pd2w0OTY1X2dldF9maWZvX2Zyb21fdGlkKHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsIHUxNiB0aWQpCi17Ci0JaWYgKGxpa2VseSh0aWQgPCBBUlJBWV9TSVpFKHRpZF90b19hYykpKQotCQlyZXR1cm4gY3R4LT5hY190b19maWZvW3RpZF90b19hY1t0aWRdXTsKLQotCS8qIG5vIHN1cHBvcnQgZm9yIFRJRHMgOC0xNSB5ZXQgKi8KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyoKLSAqIGhhbmRsZSBidWlsZCBSRVBMWV9UWCBjb21tYW5kIG5vdGlmaWNhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV90eF9jbWRfYnVpbGRfYmFzaWMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQlzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kLAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJCXU4IHN0ZF9pZCkKLXsKLQlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0JX19sZTMyIHR4X2ZsYWdzID0gdHhfY21kLT50eF9mbGFnczsKLQotCXR4X2NtZC0+c3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7Ci0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpIHsKLQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLOwotCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQotCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSAmJgotCQkgICAgIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIDB4ZikpCi0JCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1RTRl9NU0s7Ci0JfSBlbHNlIHsKLQkJdHhfZmxhZ3MgJj0gKH5UWF9DTURfRkxHX0FDS19NU0spOwotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCWlmIChpZWVlODAyMTFfaXNfYmFja19yZXEoZmMpKQotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX0FDS19NU0sgfCBUWF9DTURfRkxHX0lNTV9CQV9SU1BfTUFTSzsKLQotCXR4X2NtZC0+c3RhX2lkID0gc3RkX2lkOwotCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCi0JCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTU9SRV9GUkFHX01TSzsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7Ci0JCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwotCQl0eF9jbWQtPnRpZF90c3BlYyA9IHFjWzBdICYgMHhmOwotCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQl9IGVsc2UgewotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCWl3bF9sZWdhY3lfdHhfY21kX3Byb3RlY3Rpb24ocHJpdiwgaW5mbywgZmMsICZ0eF9mbGFncyk7Ci0KLQl0eF9mbGFncyAmPSB+KFRYX0NNRF9GTEdfQU5UX1NFTF9NU0spOwotCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpIHsKLQkJaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpIHx8IGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDMpOwotCQllbHNlCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDIpOwotCX0gZWxzZSB7Ci0JCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gMDsKLQl9Ci0KLQl0eF9jbWQtPmRyaXZlcl90eG9wID0gMDsKLQl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7Ci0JdHhfY21kLT5uZXh0X2ZyYW1lX2xlbiA9IDA7Ci19Ci0KLSNkZWZpbmUgUlRTX0RGQVVMVF9SRVRSWV9MSU1JVAkJNjAKLQotc3RhdGljIHZvaWQgaXdsNDk2NV90eF9jbWRfYnVpbGRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJICAgICAgX19sZTE2IGZjKQotewotCXUzMiByYXRlX2ZsYWdzOwotCWludCByYXRlX2lkeDsKLQl1OCBydHNfcmV0cnlfbGltaXQ7Ci0JdTggZGF0YV9yZXRyeV9saW1pdDsKLQl1OCByYXRlX3BsY3A7Ci0KLQkvKiBTZXQgcmV0cnkgbGltaXQgb24gREFUQSBwYWNrZXRzIGFuZCBQcm9iZSBSZXNwb25zZXMqLwotCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCi0JCWRhdGFfcmV0cnlfbGltaXQgPSAzOwotCWVsc2UKLQkJZGF0YV9yZXRyeV9saW1pdCA9IElXTDQ5NjVfREVGQVVMVF9UWF9SRVRSWTsKLQl0eF9jbWQtPmRhdGFfcmV0cnlfbGltaXQgPSBkYXRhX3JldHJ5X2xpbWl0OwotCi0JLyogU2V0IHJldHJ5IGxpbWl0IG9uIFJUUyBwYWNrZXRzICovCi0JcnRzX3JldHJ5X2xpbWl0ID0gUlRTX0RGQVVMVF9SRVRSWV9MSU1JVDsKLQlpZiAoZGF0YV9yZXRyeV9saW1pdCA8IHJ0c19yZXRyeV9saW1pdCkKLQkJcnRzX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKLQl0eF9jbWQtPnJ0c19yZXRyeV9saW1pdCA9IHJ0c19yZXRyeV9saW1pdDsKLQotCS8qIERBVEEgcGFja2V0cyB3aWxsIHVzZSB0aGUgdUNvZGUgc3RhdGlvbiB0YWJsZSBmb3IgcmF0ZS9hbnRlbm5hCi0JICogc2VsZWN0aW9uICovCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgewotCQl0eF9jbWQtPmluaXRpYWxfcmF0ZV9pbmRleCA9IDA7Ci0JCXR4X2NtZC0+dHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TVEFfUkFURV9NU0s7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCBUWCByYXRlIHN0b3JlZCBpbiBtYWM4MDIxMSBoYXMgdGhlIE1DUyBiaXQgc2V0LCBpdCdzCi0JICogbm90IHJlYWxseSBhIFRYIHJhdGUuICBUaHVzLCB3ZSB1c2UgdGhlIGxvd2VzdCBzdXBwb3J0ZWQgcmF0ZSBmb3IKLQkgKiB0aGlzIGJhbmQuICBBbHNvIHVzZSB0aGUgbG93ZXN0IHN1cHBvcnRlZCByYXRlIGlmIHRoZSBzdG9yZWQgcmF0ZQotCSAqIGluZGV4IGlzIGludmFsaWQuCi0JICovCi0JcmF0ZV9pZHggPSBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeDsKLQlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MgfHwKLQkJCShyYXRlX2lkeCA8IDApIHx8IChyYXRlX2lkeCA+IElXTF9SQVRFX0NPVU5UX0xFR0FDWSkpCi0JCXJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgoJnByaXYtPmJhbmRzW2luZm8tPmJhbmRdLAotCQkJCWluZm8tPmNvbnRyb2wuc3RhKTsKLQkvKiBGb3IgNSBHSFogYmFuZCwgcmVtYXAgbWFjODAyMTEgcmF0ZSBpbmRpY2VzIGludG8gZHJpdmVyIGluZGljZXMgKi8KLQlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlyYXRlX2lkeCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCS8qIEdldCBQTENQIHJhdGUgZm9yIHR4X2NtZC0+cmF0ZV9uX2ZsYWdzICovCi0JcmF0ZV9wbGNwID0gaXdsZWdhY3lfcmF0ZXNbcmF0ZV9pZHhdLnBsY3A7Ci0JLyogWmVybyBvdXQgZmxhZ3MgZm9yIHRoaXMgcGFja2V0ICovCi0JcmF0ZV9mbGFncyA9IDA7Ci0KLQkvKiBTZXQgQ0NLIGZsYWcgYXMgbmVlZGVkICovCi0JaWYgKChyYXRlX2lkeCA+PSBJV0xfRklSU1RfQ0NLX1JBVEUpICYmIChyYXRlX2lkeCA8PSBJV0xfTEFTVF9DQ0tfUkFURSkpCi0JCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKLQotCS8qIFNldCB1cCBhbnRlbm5hcyAqLwotCXByaXYtPm1nbXRfdHhfYW50ID0gaXdsNDk2NV90b2dnbGVfdHhfYW50KHByaXYsIHByaXYtPm1nbXRfdHhfYW50LAotCQkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCi0JcmF0ZV9mbGFncyB8PSBpd2w0OTY1X2FudF9pZHhfdG9fZmxhZ3MocHJpdi0+bWdtdF90eF9hbnQpOwotCi0JLyogU2V0IHRoZSByYXRlIGluIHRoZSBUWCBjbWQgKi8KLQl0eF9jbWQtPnJhdGVfbl9mbGFncyA9IGl3bDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlX3BsY3AsIHJhdGVfZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3R4X2NtZF9idWlsZF9od2NyeXB0byhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQsCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnLAotCQkJCSAgICAgIGludCBzdGFfaWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiA9IGluZm8tPmNvbnRyb2wuaHdfa2V5OwotCi0Jc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfQ0NNOwotCQltZW1jcHkodHhfY21kLT5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKLQkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKLQkJCXR4X2NtZC0+dHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BR0dfQ0NNUF9NU0s7Ci0JCUlXTF9ERUJVR19UWChwcml2LCAidHhfY21kIHdpdGggQUVTIGh3Y3J5cHRvXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfVEtJUDsKLQkJaWVlZTgwMjExX2dldF90a2lwX3AyayhrZXljb25mLCBza2JfZnJhZywgdHhfY21kLT5rZXkpOwotCQlJV0xfREVCVUdfVFgocHJpdiwgInR4X2NtZCB3aXRoIHRraXAgaHdjcnlwdG9cbiIpOwotCQlicmVhazsKLQotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQl0eF9jbWQtPnNlY19jdGwgfD0gVFhfQ01EX1NFQ19LRVkxMjg7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCXR4X2NtZC0+c2VjX2N0bCB8PSAoVFhfQ01EX1NFQ19XRVAgfAotCQkJKGtleWNvbmYtPmtleWlkeCAmIFRYX0NNRF9TRUNfTVNLKSA8PCBUWF9DTURfU0VDX1NISUZUKTsKLQotCQltZW1jcHkoJnR4X2NtZC0+a2V5WzNdLCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7Ci0KLQkJSVdMX0RFQlVHX1RYKHByaXYsICJDb25maWd1cmluZyBwYWNrZXQgZm9yIFdFUCBlbmNyeXB0aW9uICIKLQkJCSAgICAgIndpdGgga2V5ICVkXG4iLCBrZXljb25mLT5rZXlpZHgpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIlVua25vd24gZW5jb2RlIGNpcGhlciAleFxuIiwga2V5Y29uZi0+Y2lwaGVyKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogc3RhcnQgUkVQTFlfVFggY29tbWFuZCBwcm9jZXNzCi0gKi8KLWludCBpd2w0OTY1X3R4X3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IGluZm8tPmNvbnRyb2wuc3RhOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9IE5VTEw7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwotCXN0cnVjdCBpd2xfcXVldWUgKnE7Ci0Jc3RydWN0IGl3bF9kZXZpY2VfY21kICpvdXRfY21kOwotCXN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhOwotCXN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQ7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlpbnQgdHhxX2lkOwotCWRtYV9hZGRyX3QgcGh5c19hZGRyOwotCWRtYV9hZGRyX3QgdHhjbWRfcGh5czsKLQlkbWFfYWRkcl90IHNjcmF0Y2hfcGh5czsKLQl1MTYgbGVuLCBmaXJzdGxlbiwgc2Vjb25kbGVuOwotCXUxNiBzZXFfbnVtYmVyID0gMDsKLQlfX2xlMTYgZmM7Ci0JdTggaGRyX2xlbjsKLQl1OCBzdGFfaWQ7Ci0JdTggd2FpdF93cml0ZV9wdHIgPSAwOwotCXU4IHRpZCA9IDA7Ci0JdTggKnFjID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWJvb2wgaXNfYWdnID0gZmFsc2U7Ci0KLQlpZiAoaW5mby0+Y29udHJvbC52aWYpCi0JCWN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYoaW5mby0+Y29udHJvbC52aWYpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgIkRyb3BwaW5nIC0gUkYgS0lMTFxuIik7Ci0JCWdvdG8gZHJvcF91bmxvY2s7Ci0JfQotCi0JZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaWVlZTgwMjExX2lzX2F1dGgoZmMpKQotCQlJV0xfREVCVUdfVFgocHJpdiwgIlNlbmRpbmcgQVVUSCBmcmFtZVxuIik7Ci0JZWxzZSBpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykpCi0JCUlXTF9ERUJVR19UWChwcml2LCAiU2VuZGluZyBBU1NPQyBmcmFtZVxuIik7Ci0JZWxzZSBpZiAoaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJTZW5kaW5nIFJFQVNTT0MgZnJhbWVcbiIpOwotI2VuZGlmCi0KLQloZHJfbGVuID0gaWVlZTgwMjExX2hkcmxlbihmYyk7Ci0KLQkvKiBGb3IgbWFuYWdlbWVudCBmcmFtZXMgdXNlIGJyb2FkY2FzdCBpZCB0byBkbyBub3QgYnJlYWsgYWdncmVnYXRpb24gKi8KLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGZjKSkKLQkJc3RhX2lkID0gY3R4LT5iY2FzdF9zdGFfaWQ7Ci0JZWxzZSB7Ci0JCS8qIEZpbmQgaW5kZXggaW50byBzdGF0aW9uIHRhYmxlIGZvciBkZXN0aW5hdGlvbiBzdGF0aW9uICovCi0JCXN0YV9pZCA9IGl3bF9sZWdhY3lfc3RhX2lkX29yX2Jyb2FkY2FzdChwcml2LCBjdHgsIGluZm8tPmNvbnRyb2wuc3RhKTsKLQotCQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKLQkJCUlXTF9ERUJVR19EUk9QKHByaXYsICJEcm9wcGluZyAtIElOVkFMSUQgU1RBVElPTjogJXBNXG4iLAotCQkJCSAgICAgICBoZHItPmFkZHIxKTsKLQkJCWdvdG8gZHJvcF91bmxvY2s7Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfVFgocHJpdiwgInN0YXRpb24gSWQgJWRcbiIsIHN0YV9pZCk7Ci0KLQlpZiAoc3RhKQotCQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQotCWlmIChzdGFfcHJpdiAmJiBzdGFfcHJpdi0+YXNsZWVwICYmCi0JICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUE9MTF9SRVNQT05TRSkpIHsKLQkJLyoKLQkJICogVGhpcyBzZW5kcyBhbiBhc3luY2hyb25vdXMgY29tbWFuZCB0byB0aGUgZGV2aWNlLAotCQkgKiBidXQgd2UgY2FuIHJlbHkgb24gaXQgYmVpbmcgcHJvY2Vzc2VkIGJlZm9yZSB0aGUKLQkJICogbmV4dCBmcmFtZSBpcyBwcm9jZXNzZWQgLS0gYW5kIHRoZSBuZXh0IGZyYW1lIHRvCi0JCSAqIHRoaXMgc3RhdGlvbiBpcyB0aGUgb25lIHRoYXQgd2lsbCBjb25zdW1lIHRoaXMKLQkJICogY291bnRlci4KLQkJICogRm9yIG5vdyBzZXQgdGhlIGNvdW50ZXIgdG8ganVzdCAxIHNpbmNlIHdlIGRvIG5vdAotCQkgKiBzdXBwb3J0IHVBUFNEIHlldC4KLQkJICovCi0JCWl3bDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChwcml2LCBzdGFfaWQsIDEpOwotCX0KLQotCS8qCi0JICogU2VuZCB0aGlzIGZyYW1lIGFmdGVyIERUSU0gLS0gdGhlcmUncyBhIHNwZWNpYWwgcXVldWUKLQkgKiByZXNlcnZlZCBmb3IgdGhpcyBmb3IgY29udGV4dHMgdGhhdCBzdXBwb3J0IEFQIG1vZGUuCi0JICovCi0JaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9TRU5EX0FGVEVSX0RUSU0pIHsKLQkJdHhxX2lkID0gY3R4LT5tY2FzdF9xdWV1ZTsKLQkJLyoKLQkJICogVGhlIG1pY3JvY29kZSB3aWxsIGNsZWFyIHRoZSBtb3JlIGRhdGEKLQkJICogYml0IGluIHRoZSBsYXN0IGZyYW1lIGl0IHRyYW5zbWl0cy4KLQkJICovCi0JCWhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfTU9SRURBVEEpOwotCX0gZWxzZQotCQl0eHFfaWQgPSBjdHgtPmFjX3RvX3F1ZXVlW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXTsKLQotCS8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC9zYXZlZCBhYm92ZSB3aGVuIGxvY2tpbmcgcHJpdi0+bG9jayAqLwotCXNwaW5fbG9jaygmcHJpdi0+c3RhX2xvY2spOwotCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKLQkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKLQkJaWYgKFdBUk5fT05fT05DRSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpIHsKLQkJCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7Ci0JCQlnb3RvIGRyb3BfdW5sb2NrOwotCQl9Ci0JCXNlcV9udW1iZXIgPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnNlcV9udW1iZXI7Ci0JCXNlcV9udW1iZXIgJj0gSUVFRTgwMjExX1NDVExfU0VROwotCQloZHItPnNlcV9jdHJsID0gaGRyLT5zZXFfY3RybCAmCi0JCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRyk7Ci0JCWhkci0+c2VxX2N0cmwgfD0gY3B1X3RvX2xlMTYoc2VxX251bWJlcik7Ci0JCXNlcV9udW1iZXIgKz0gMHgxMDsKLQkJLyogYWdncmVnYXRpb24gaXMgb24gZm9yIHRoaXMgPHN0YSx0aWQ+ICovCi0JCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUgJiYKLQkJICAgIHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID09IElXTF9BR0dfT04pIHsKLQkJCXR4cV9pZCA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnR4cV9pZDsKLQkJCWlzX2FnZyA9IHRydWU7Ci0JCX0KLQl9Ci0KLQl0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0JcSA9ICZ0eHEtPnE7Ci0KLQlpZiAodW5saWtlbHkoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyaykpIHsKLQkJc3Bpbl91bmxvY2soJnByaXYtPnN0YV9sb2NrKTsKLQkJZ290byBkcm9wX3VubG9jazsKLQl9Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUrKzsKLQkJaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCi0JCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnNlcV9udW1iZXIgPSBzZXFfbnVtYmVyOwotCX0KLQotCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7Ci0KLQkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCi0JbWVtc2V0KCYodHhxLT50eGJbcS0+d3JpdGVfcHRyXSksIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R4X2luZm8pKTsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLnNrYiA9IHNrYjsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLmN0eCA9IGN0eDsKLQotCS8qIFNldCB1cCBmaXJzdCBlbXB0eSBlbnRyeSBpbiBxdWV1ZSdzIGFycmF5IG9mIFR4L2NtZCBidWZmZXJzICovCi0Jb3V0X2NtZCA9IHR4cS0+Y21kW3EtPndyaXRlX3B0cl07Ci0Jb3V0X21ldGEgPSAmdHhxLT5tZXRhW3EtPndyaXRlX3B0cl07Ci0JdHhfY21kID0gJm91dF9jbWQtPmNtZC50eDsKLQltZW1zZXQoJm91dF9jbWQtPmhkciwgMCwgc2l6ZW9mKG91dF9jbWQtPmhkcikpOwotCW1lbXNldCh0eF9jbWQsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R4X2NtZCkpOwotCi0JLyoKLQkgKiBTZXQgdXAgdGhlIFR4LWNvbW1hbmQgKG5vdCBNQUMhKSBoZWFkZXIuCi0JICogU3RvcmUgdGhlIGNob3NlbiBUeCBxdWV1ZSBhbmQgVEZEIGluZGV4IHdpdGhpbiB0aGUgc2VxdWVuY2UgZmllbGQ7Ci0JICogYWZ0ZXIgVHgsIHVDb2RlJ3MgVHggcmVzcG9uc2Ugd2lsbCByZXR1cm4gdGhpcyB2YWx1ZSBzbyBkcml2ZXIgY2FuCi0JICogbG9jYXRlIHRoZSBmcmFtZSB3aXRoaW4gdGhlIHR4IHF1ZXVlIGFuZCBkbyBwb3N0LXR4IHByb2Nlc3NpbmcuCi0JICovCi0Jb3V0X2NtZC0+aGRyLmNtZCA9IFJFUExZX1RYOwotCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9IGNwdV90b19sZTE2KCh1MTYpKFFVRVVFX1RPX1NFUSh0eHFfaWQpIHwKLQkJCQlJTkRFWF9UT19TRVEocS0+d3JpdGVfcHRyKSkpOwotCi0JLyogQ29weSBNQUMgaGVhZGVyIGZyb20gc2tiIGludG8gY29tbWFuZCBidWZmZXIgKi8KLQltZW1jcHkodHhfY21kLT5oZHIsIGhkciwgaGRyX2xlbik7Ci0KLQotCS8qIFRvdGFsICMgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KLQlsZW4gPSAodTE2KXNrYi0+bGVuOwotCXR4X2NtZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKLQotCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSkKLQkJaXdsNDk2NV90eF9jbWRfYnVpbGRfaHdjcnlwdG8ocHJpdiwgaW5mbywgdHhfY21kLCBza2IsIHN0YV9pZCk7Ci0KLQkvKiBUT0RPIG5lZWQgdGhpcyBmb3IgYnVyc3QgbW9kZSBsYXRlciBvbiAqLwotCWl3bDQ5NjVfdHhfY21kX2J1aWxkX2Jhc2ljKHByaXYsIHNrYiwgdHhfY21kLCBpbmZvLCBoZHIsIHN0YV9pZCk7Ci0JaXdsX2xlZ2FjeV9kYmdfbG9nX3R4X2RhdGFfZnJhbWUocHJpdiwgbGVuLCBoZHIpOwotCi0JaXdsNDk2NV90eF9jbWRfYnVpbGRfcmF0ZShwcml2LCB0eF9jbWQsIGluZm8sIGZjKTsKLQotCWl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzKHByaXYsIHRydWUsIGZjLCBsZW4pOwotCS8qCi0JICogVXNlIHRoZSBmaXJzdCBlbXB0eSBlbnRyeSBpbiB0aGlzIHF1ZXVlJ3MgY29tbWFuZCBidWZmZXIgYXJyYXkKLQkgKiB0byBjb250YWluIHRoZSBUeCBjb21tYW5kIGFuZCBNQUMgaGVhZGVyIGNvbmNhdGVuYXRlZCB0b2dldGhlcgotCSAqIChwYXlsb2FkIGRhdGEgd2lsbCBiZSBpbiBhbm90aGVyIGJ1ZmZlcikuCi0JICogU2l6ZSBvZiB0aGlzIHZhcmllcywgZHVlIHRvIHZhcnlpbmcgTUFDIGhlYWRlciBsZW5ndGguCi0JICogSWYgZW5kIGlzIG5vdCBkd29yZCBhbGlnbmVkLCB3ZSdsbCBoYXZlIDIgZXh0cmEgYnl0ZXMgYXQgdGhlIGVuZAotCSAqIG9mIHRoZSBNQUMgaGVhZGVyIChkZXZpY2UgcmVhZHMgb24gZHdvcmQgYm91bmRhcmllcykuCi0JICogV2UnbGwgdGVsbCBkZXZpY2UgYWJvdXQgdGhpcyBwYWRkaW5nIGxhdGVyLgotCSAqLwotCWxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3R4X2NtZCkgKwotCQlzaXplb2Yoc3RydWN0IGl3bF9jbWRfaGVhZGVyKSArIGhkcl9sZW47Ci0JZmlyc3RsZW4gPSAobGVuICsgMykgJiB+MzsKLQotCS8qIFRlbGwgTklDIGFib3V0IGFueSAyLWJ5dGUgcGFkZGluZyBhZnRlciBNQUMgaGVhZGVyICovCi0JaWYgKGZpcnN0bGVuICE9IGxlbikKLQkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX01IX1BBRF9NU0s7Ci0KLQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgVHggY29tbWFuZCdzIGhlYWRlciAobm90IE1BQyBoZWFkZXIhKSwKLQkgKiB3aXRoaW4gY29tbWFuZCBidWZmZXIgYXJyYXkuICovCi0JdHhjbWRfcGh5cyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCi0JCQkJICAgICZvdXRfY21kLT5oZHIsIGZpcnN0bGVuLAotCQkJCSAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCWRtYV91bm1hcF9hZGRyX3NldChvdXRfbWV0YSwgbWFwcGluZywgdHhjbWRfcGh5cyk7Ci0JZG1hX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgZmlyc3RsZW4pOwotCS8qIEFkZCBidWZmZXIgY29udGFpbmluZyBUeCBjb21tYW5kIGFuZCBNQUMoISkgaGVhZGVyIHRvIFRGRCdzCi0JICogZmlyc3QgZW50cnkgKi8KLQlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQocHJpdiwgdHhxLAotCQkJCQkJICAgdHhjbWRfcGh5cywgZmlyc3RsZW4sIDEsIDApOwotCi0JaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXR4cS0+bmVlZF91cGRhdGUgPSAxOwotCX0gZWxzZSB7Ci0JCXdhaXRfd3JpdGVfcHRyID0gMTsKLQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0JfQotCi0JLyogU2V0IHVwIFRGRCdzIDJuZCBlbnRyeSB0byBwb2ludCBkaXJlY3RseSB0byByZW1haW5kZXIgb2Ygc2tiLAotCSAqIGlmIGFueSAoODAyLjExIG51bGwgZnJhbWVzIGhhdmUgbm8gcGF5bG9hZCkuICovCi0Jc2Vjb25kbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOwotCWlmIChzZWNvbmRsZW4gPiAwKSB7Ci0JCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIGhkcl9sZW4sCi0JCQkJCSAgIHNlY29uZGxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChwcml2LCB0eHEsCi0JCQkJCQkJICAgcGh5c19hZGRyLCBzZWNvbmRsZW4sCi0JCQkJCQkJICAgMCwgMCk7Ci0JfQotCi0Jc2NyYXRjaF9waHlzID0gdHhjbWRfcGh5cyArIHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIpICsKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgaXdsX3R4X2NtZCwgc2NyYXRjaCk7Ci0KLQkvKiB0YWtlIGJhY2sgb3duZXJzaGlwIG9mIERNQSBidWZmZXIgdG8gZW5hYmxlIHVwZGF0ZSAqLwotCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwcml2LT5wY2lfZGV2LCB0eGNtZF9waHlzLAotCQkJCSAgICBmaXJzdGxlbiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQl0eF9jbWQtPmRyYW1fbHNiX3B0ciA9IGNwdV90b19sZTMyKHNjcmF0Y2hfcGh5cyk7Ci0JdHhfY21kLT5kcmFtX21zYl9wdHIgPSBpd2xfbGVnYWN5X2dldF9kbWFfaGlfYWRkcihzY3JhdGNoX3BoeXMpOwotCi0JSVdMX0RFQlVHX1RYKHByaXYsICJzZXF1ZW5jZSBuciA9IDBYJXhcbiIsCi0JCSAgICAgbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSk7Ci0JSVdMX0RFQlVHX1RYKHByaXYsICJ0eF9mbGFncyA9IDBYJXhcbiIsIGxlMzJfdG9fY3B1KHR4X2NtZC0+dHhfZmxhZ3MpKTsKLQlpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgSVdMX0RMX1RYLCAodTggKil0eF9jbWQsIHNpemVvZigqdHhfY21kKSk7Ci0JaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9UWCwgKHU4ICopdHhfY21kLT5oZHIsIGhkcl9sZW4pOwotCi0JLyogU2V0IHVwIGVudHJ5IGZvciB0aGlzIFRGRCBpbiBUeCBieXRlLWNvdW50IGFycmF5ICovCi0JaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX3VwZGF0ZV9ieXRlX2NudF90YmwocHJpdiwgdHhxLAotCQkJCQkJICAgICBsZTE2X3RvX2NwdSh0eF9jbWQtPmxlbikpOwotCi0JcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHByaXYtPnBjaV9kZXYsIHR4Y21kX3BoeXMsCi0JCQkJICAgICAgIGZpcnN0bGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X3R4KHByaXYsCi0JCQkgICAgICYoKHN0cnVjdCBpd2xfdGZkICopdHhxLT50ZmRzKVt0eHEtPnEud3JpdGVfcHRyXSwKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKSwKLQkJCSAgICAgJm91dF9jbWQtPmhkciwgZmlyc3RsZW4sCi0JCQkgICAgIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHNlY29uZGxlbik7Ci0KLQkvKiBUZWxsIGRldmljZSB0aGUgd3JpdGUgaW5kZXggKmp1c3QgcGFzdCogdGhpcyBsYXRlc3QgZmlsbGVkIFRGRCAqLwotCXEtPndyaXRlX3B0ciA9IGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyLCBxLT5uX2JkKTsKLQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHR4cSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyAidHJhbnNtaXR0ZWQiIHN1Y2Nlc3NmdWxseQotCSAqIGFuZCB3ZSB3aWxsIGdldCBhIFRYIHN0YXR1cyBub3RpZmljYXRpb24gZXZlbnR1YWxseSwKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiByZXQuICJyZXQiIG9ubHkgaW5kaWNhdGVzCi0JICogd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlci4KLQkgKi8KLQotCS8qCi0JICogQXZvaWQgYXRvbWljIG9wcyBpZiBpdCBpc24ndCBhbiBhc3NvY2lhdGVkIGNsaWVudC4KLQkgKiBBbHNvLCBpZiB0aGlzIGlzIGEgcGFja2V0IGZvciBhZ2dyZWdhdGlvbiwgZG9uJ3QKLQkgKiBpbmNyZWFzZSB0aGUgY291bnRlciBiZWNhdXNlIHRoZSB1Y29kZSB3aWxsIHN0b3AKLQkgKiBhZ2dyZWdhdGlvbiBxdWV1ZXMgd2hlbiB0aGVpciByZXNwZWN0aXZlIHN0YXRpb24KLQkgKiBnb2VzIHRvIHNsZWVwLgotCSAqLwotCWlmIChzdGFfcHJpdiAmJiBzdGFfcHJpdi0+Y2xpZW50ICYmICFpc19hZ2cpCi0JCWF0b21pY19pbmMoJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcyk7Ci0KLQlpZiAoKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspICYmCi0JCQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKSB7Ci0JCWlmICh3YWl0X3dyaXRlX3B0cikgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXR4cS0+bmVlZF91cGRhdGUgPSAxOwotCQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCB0eHEpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQl9IGVsc2UgewotCQkJaXdsX2xlZ2FjeV9zdG9wX3F1ZXVlKHByaXYsIHR4cSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZHJvcF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsNDk2NV9hbGxvY19kbWFfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9kbWFfcHRyICpwdHIsIHNpemVfdCBzaXplKQotewotCXB0ci0+YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCBzaXplLCAmcHRyLT5kbWEsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghcHRyLT5hZGRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwdHItPnNpemUgPSBzaXplOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsNDk2NV9mcmVlX2RtYV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaXdsX2RtYV9wdHIgKnB0cikKLXsKLQlpZiAodW5saWtlbHkoIXB0ci0+YWRkcikpCi0JCXJldHVybjsKLQotCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIHB0ci0+c2l6ZSwgcHRyLT5hZGRyLCBwdHItPmRtYSk7Ci0JbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKCpwdHIpKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2h3X3R4cV9jdHhfZnJlZSAtIEZyZWUgVFhRIENvbnRleHQKLSAqCi0gKiBEZXN0cm95IGFsbCBUWCBETUEgcXVldWVzIGFuZCBzdHJ1Y3R1cmVzCi0gKi8KLXZvaWQgaXdsNDk2NV9od190eHFfY3R4X2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0eHFfaWQ7Ci0KLQkvKiBUeCBxdWV1ZXMgKi8KLQlpZiAocHJpdi0+dHhxKSB7Ci0JCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKLQkJCWlmICh0eHFfaWQgPT0gcHJpdi0+Y21kX3F1ZXVlKQotCQkJCWl3bF9sZWdhY3lfY21kX3F1ZXVlX2ZyZWUocHJpdik7Ci0JCQllbHNlCi0JCQkJaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKHByaXYsIHR4cV9pZCk7Ci0JfQotCWl3bDQ5NjVfZnJlZV9kbWFfcHRyKHByaXYsICZwcml2LT5rdyk7Ci0KLQlpd2w0OTY1X2ZyZWVfZG1hX3B0cihwcml2LCAmcHJpdi0+c2NkX2JjX3RibHMpOwotCi0JLyogZnJlZSB0eCBxdWV1ZSBzdHJ1Y3R1cmUgKi8KLQlpd2xfbGVnYWN5X3R4cV9tZW0ocHJpdik7Ci19Ci0KLS8qKgotICogaXdsNDk2NV90eHFfY3R4X2FsbG9jIC0gYWxsb2NhdGUgVFggcXVldWUgY29udGV4dAotICogQWxsb2NhdGUgYWxsIFR4IERNQSBzdHJ1Y3R1cmVzIGFuZCBpbml0aWFsaXplIHRoZW0KLSAqCi0gKiBAcGFyYW0gcHJpdgotICogQHJldHVybiBlcnJvciBjb2RlCi0gKi8KLWludCBpd2w0OTY1X3R4cV9jdHhfYWxsb2Moc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQ7Ci0JaW50IHR4cV9pZCwgc2xvdHNfbnVtOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBGcmVlIGFsbCB0eC9jbWQgcXVldWVzIGFuZCBrZWVwLXdhcm0gYnVmZmVyICovCi0JaXdsNDk2NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0KLQlyZXQgPSBpd2w0OTY1X2FsbG9jX2RtYV9wdHIocHJpdiwgJnByaXYtPnNjZF9iY190YmxzLAotCQkJCXByaXYtPmh3X3BhcmFtcy5zY2RfYmNfdGJsc19zaXplKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlNjaGVkdWxlciBCQyBUYWJsZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3JfYmNfdGJsczsKLQl9Ci0JLyogQWxsb2Mga2VlcC13YXJtIGJ1ZmZlciAqLwotCXJldCA9IGl3bDQ5NjVfYWxsb2NfZG1hX3B0cihwcml2LCAmcHJpdi0+a3csIElXTF9LV19TSVpFKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIktlZXAgV2FybSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3Jfa3c7Ci0JfQotCi0JLyogYWxsb2NhdGUgdHggcXVldWUgc3RydWN0dXJlICovCi0JcmV0ID0gaXdsX2xlZ2FjeV9hbGxvY190eHFfbWVtKHByaXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLwotCWl3bDQ5NjVfdHhxX3NldF9zY2hlZChwcml2LCAwKTsKLQotCS8qIFRlbGwgTklDIHdoZXJlIHRvIGZpbmQgdGhlICJrZWVwIHdhcm0iIGJ1ZmZlciAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfS1dfTUVNX0FERFJfUkVHLCBwcml2LT5rdy5kbWEgPj4gNCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBBbGxvYyBhbmQgaW5pdCBhbGwgVHggcXVldWVzLCBpbmNsdWRpbmcgdGhlIGNvbW1hbmQgcXVldWUgKCM0LyM5KSAqLwotCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykgewotCQlzbG90c19udW0gPSAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkgPwotCQkJCQlURkRfQ01EX1NMT1RTIDogVEZEX1RYX0NNRF9TTE9UUzsKLQkJcmV0ID0gaXdsX2xlZ2FjeV90eF9xdWV1ZV9pbml0KHByaXYsCi0JCQkJCSZwcml2LT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLAotCQkJCSAgICAgICB0eHFfaWQpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJUeCAlZCBxdWV1ZSBpbml0IGZhaWxlZFxuIiwgdHhxX2lkKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi0gZXJyb3I6Ci0JaXdsNDk2NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0JaXdsNDk2NV9mcmVlX2RtYV9wdHIocHJpdiwgJnByaXYtPmt3KTsKLSBlcnJvcl9rdzoKLQlpd2w0OTY1X2ZyZWVfZG1hX3B0cihwcml2LCAmcHJpdi0+c2NkX2JjX3RibHMpOwotIGVycm9yX2JjX3RibHM6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBpd2w0OTY1X3R4cV9jdHhfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0eHFfaWQsIHNsb3RzX251bTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIFR1cm4gb2ZmIGFsbCBUeCBETUEgZmlmb3MgKi8KLQlpd2w0OTY1X3R4cV9zZXRfc2NoZWQocHJpdiwgMCk7Ci0KLQkvKiBUZWxsIE5JQyB3aGVyZSB0byBmaW5kIHRoZSAia2VlcCB3YXJtIiBidWZmZXIgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX0tXX01FTV9BRERSX1JFRywgcHJpdi0+a3cuZG1hID4+IDQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWxsb2MgYW5kIGluaXQgYWxsIFR4IHF1ZXVlcywgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlICgjNCkgKi8KLQlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKLQkJc2xvdHNfbnVtID0gdHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSA/Ci0JCQkgICAgVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7Ci0JCWl3bF9sZWdhY3lfdHhfcXVldWVfcmVzZXQocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLAotCQkJCQkJc2xvdHNfbnVtLCB0eHFfaWQpOwotCX0KLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4cV9jdHhfc3RvcCAtIFN0b3AgYWxsIFR4IERNQSBjaGFubmVscwotICovCi12b2lkIGl3bDQ5NjVfdHhxX2N0eF9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgY2gsIHR4cV9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpd2w0OTY1X3R4cV9zZXRfc2NoZWQocHJpdiwgMCk7Ci0KLQkvKiBTdG9wIGVhY2ggVHggRE1BIGNoYW5uZWwsIGFuZCB3YWl0IGZvciBpdCB0byBiZSBpZGxlICovCi0JZm9yIChjaCA9IDA7IGNoIDwgcHJpdi0+aHdfcGFyYW1zLmRtYV9jaG5sX251bTsgY2grKykgewotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsCi0JCQkJRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2gpLCAweDApOwotCQlpZiAoaXdsX3BvbGxfZGlyZWN0X2JpdChwcml2LCBGSF9UU1NSX1RYX1NUQVRVU19SRUcsCi0JCQkJICAgIEZIX1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKGNoKSwKLQkJCQkgICAgMTAwMCkpCi0JCQlJV0xfRVJSKHByaXYsICJGYWlsaW5nIG9uIHRpbWVvdXQgd2hpbGUgc3RvcHBpbmciCi0JCQkgICAgIiBETUEgY2hhbm5lbCAlZCBbMHglMDh4XSIsIGNoLAotCQkJICAgIGl3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LAotCQkJCQlGSF9UU1NSX1RYX1NUQVRVU19SRUcpKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCFwcml2LT50eHEpCi0JCXJldHVybjsKLQotCS8qIFVubWFwIERNQSBmcm9tIGhvc3Qgc3lzdGVtIGFuZCBmcmVlIHNrYidzICovCi0JZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKQotCQlpZiAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkKLQkJCWl3bF9sZWdhY3lfY21kX3F1ZXVlX3VubWFwKHByaXYpOwotCQllbHNlCi0JCQlpd2xfbGVnYWN5X3R4X3F1ZXVlX3VubWFwKHByaXYsIHR4cV9pZCk7Ci19Ci0KLS8qCi0gKiBGaW5kIGZpcnN0IGF2YWlsYWJsZSAobG93ZXN0IHVudXNlZCkgVHggUXVldWUsIG1hcmsgaXQgImFjdGl2ZSIuCi0gKiBDYWxsZWQgb25seSB3aGVuIGZpbmRpbmcgcXVldWUgZm9yIGFnZ3JlZ2F0aW9uLgotICogU2hvdWxkIG5ldmVyIHJldHVybiBhbnl0aGluZyA8IDcsIGJlY2F1c2UgdGhleSBzaG91bGQgYWxyZWFkeQotICogYmUgaW4gdXNlIGFzIEVEQ0EgQUMgKDAtMyksIENvbW1hbmQgKDQpLCByZXNlcnZlZCAoNSwgNikKLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3R4cV9jdHhfYWN0aXZhdGVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHR4cV9pZDsKLQotCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHR4cV9pZCwgJnByaXYtPnR4cV9jdHhfYWN0aXZlX21zaykpCi0JCQlyZXR1cm4gdHhxX2lkOwotCXJldHVybiAtMTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4X3F1ZXVlX3N0b3Bfc2NoZWR1bGVyIC0gU3RvcCBxdWV1ZSwgYnV0IGtlZXAgY29uZmlndXJhdGlvbgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3R4X3F1ZXVlX3N0b3Bfc2NoZWR1bGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHUxNiB0eHFfaWQpCi17Ci0JLyogU2ltcGx5IHN0b3AgdGhlIHF1ZXVlLCBidXQgZG9uJ3QgY2hhbmdlIGFueSBjb25maWd1cmF0aW9uOwotCSAqIHRoZSBTQ0RfQUNUX0VOIGJpdCBpcyB0aGUgd3JpdGUtZW5hYmxlIG1hc2sgZm9yIHRoZSBBQ1RJVkUgYml0LiAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LAotCQlJV0w0OV9TQ0RfUVVFVUVfU1RBVFVTX0JJVFModHhxX2lkKSwKLQkJKDAgPDwgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUpfAotCQkoMSA8PCBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ1RfRU4pKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4X3F1ZXVlX3NldF9xMnJhdGlkIC0gTWFwIHVuaXF1ZSByZWNlaXZlci90aWQgY29tYmluYXRpb24gdG8gYSBxdWV1ZQotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhfcXVldWVfc2V0X3EycmF0aWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgcmFfdGlkLAotCQkJCQl1MTYgdHhxX2lkKQotewotCXUzMiB0YmxfZHdfYWRkcjsKLQl1MzIgdGJsX2R3OwotCXUxNiBzY2RfcTJyYXRpZDsKLQotCXNjZF9xMnJhdGlkID0gcmFfdGlkICYgSVdMX1NDRF9RVUVVRV9SQV9USURfTUFQX1JBVElEX01TSzsKLQotCXRibF9kd19hZGRyID0gcHJpdi0+c2NkX2Jhc2VfYWRkciArCi0JCQlJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUodHhxX2lkKTsKLQotCXRibF9kdyA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCB0YmxfZHdfYWRkcik7Ci0KLQlpZiAodHhxX2lkICYgMHgxKQotCQl0YmxfZHcgPSAoc2NkX3EycmF0aWQgPDwgMTYpIHwgKHRibF9kdyAmIDB4MDAwMEZGRkYpOwotCWVsc2UKLQkJdGJsX2R3ID0gc2NkX3EycmF0aWQgfCAodGJsX2R3ICYgMHhGRkZGMDAwMCk7Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIHRibF9kd19hZGRyLCB0YmxfZHcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV90eF9xdWV1ZV9hZ2dfZW5hYmxlIC0gU2V0IHVwICYgZW5hYmxlIGFnZ3JlZ2F0aW9uIGZvciBzZWxlY3RlZCBxdWV1ZQotICoKLSAqIE5PVEU6ICB0eHFfaWQgbXVzdCBiZSBncmVhdGVyIHRoYW4gSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUsCi0gKiAgICAgICAgaS5lLiBpdCBtdXN0IGJlIG9uZSBvZiB0aGUgaGlnaGVyIHF1ZXVlcyB1c2VkIGZvciBhZ2dyZWdhdGlvbgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhxX2FnZ19lbmFibGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkLAotCQkJCSAgaW50IHR4X2ZpZm8sIGludCBzdGFfaWQsIGludCB0aWQsIHUxNiBzc25faWR4KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IHJhX3RpZDsKLQlpbnQgcmV0OwotCi0JaWYgKChJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKLQkgICAgKElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlcyA8PSB0eHFfaWQpKSB7Ci0JCUlXTF9XQVJOKHByaXYsCi0JCQkicXVldWUgbnVtYmVyIG91dCBvZiByYW5nZTogJWQsIG11c3QgYmUgJWQgdG8gJWRcbiIsCi0JCQl0eHFfaWQsIElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFLAotCQkJSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUgKwotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlcyAtIDEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYV90aWQgPSBCVUlMRF9SQXhUSUQoc3RhX2lkLCB0aWQpOwotCi0JLyogTW9kaWZ5IGRldmljZSdzIHN0YXRpb24gdGFibGUgdG8gVHggdGhpcyBUSUQgKi8KLQlyZXQgPSBpd2w0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChwcml2LCBzdGFfaWQsIHRpZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBTdG9wIHRoaXMgVHggcXVldWUgYmVmb3JlIGNvbmZpZ3VyaW5nIGl0ICovCi0JaXdsNDk2NV90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihwcml2LCB0eHFfaWQpOwotCi0JLyogTWFwIHJlY2VpdmVyLWFkZHJlc3MgLyB0cmFmZmljLUlEIHRvIHRoaXMgcXVldWUgKi8KLQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9xMnJhdGlkKHByaXYsIHJhX3RpZCwgdHhxX2lkKTsKLQotCS8qIFNldCB0aGlzIHF1ZXVlIGFzIGEgY2hhaW4tYnVpbGRpbmcgcXVldWUgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXRzX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFQ0hBSU5fU0VMLCAoMSA8PCB0eHFfaWQpKTsKLQotCS8qIFBsYWNlIGZpcnN0IFRGRCBhdCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHN0YXJ0IHNlcXVlbmNlIG51bWJlci4KLQkgKiBBc3N1bWVzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCi0JcHJpdi0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc25faWR4ICYgMHhmZik7Ci0JcHJpdi0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOwotCWl3bDQ5NjVfc2V0X3dyX3B0cnMocHJpdiwgdHhxX2lkLCBzc25faWR4KTsKLQotCS8qIFNldCB1cCBUeCB3aW5kb3cgc2l6ZSBhbmQgZnJhbWUgbGltaXQgZm9yIHRoaXMgcXVldWUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsCi0JCXByaXYtPnNjZF9iYXNlX2FkZHIgKyBJV0w0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQodHhxX2lkKSwKLQkJKFNDRF9XSU5fU0laRSA8PCBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfUE9TKSAmCi0JCUlXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9NU0spOwotCi0JaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LCBwcml2LT5zY2RfYmFzZV9hZGRyICsKLQkJSVdMNDlfU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHR4cV9pZCkgKyBzaXplb2YodTMyKSwKLQkJKFNDRF9GUkFNRV9MSU1JVCA8PCBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfUE9TKQotCQkmIElXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0spOwotCi0JaXdsX2xlZ2FjeV9zZXRfYml0c19wcnBoKHByaXYsIElXTDQ5X1NDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7Ci0KLQkvKiBTZXQgdXAgU3RhdHVzIGFyZWEgaW4gU1JBTSwgbWFwIHRvIFR4IERNQS9GSUZPLCBhY3RpdmF0ZSB0aGUgcXVldWUgKi8KLQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLCB0eF9maWZvLCAxKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0KLWludCBpd2w0OTY1X3R4X2FnZ19zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbikKLXsKLQlpbnQgc3RhX2lkOwotCWludCB0eF9maWZvOwotCWludCB0eHFfaWQ7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCi0JdHhfZmlmbyA9IGl3bDQ5NjVfZ2V0X2ZpZm9fZnJvbV90aWQoaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLCB0aWQpOwotCWlmICh1bmxpa2VseSh0eF9maWZvIDwgMCkpCi0JCXJldHVybiB0eF9maWZvOwotCi0JSVdMX1dBUk4ocHJpdiwgIiVzIG9uIHJhID0gJXBNIHRpZCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHN0YS0+YWRkciwgdGlkKTsKLQotCXN0YV9pZCA9IGl3bF9sZWdhY3lfc3RhX2lkKHN0YSk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlN0YXJ0IEFHRyBvbiBpbnZhbGlkIHN0YXRpb25cbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlpZiAodW5saWtlbHkodGlkID49IE1BWF9USURfQ09VTlQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSAhPSBJV0xfQUdHX09GRikgewotCQlJV0xfRVJSKHByaXYsICJTdGFydCBBR0cgd2hlbiBzdGF0ZSBpcyBub3QgSVdMX0FHR19PRkYgIVxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JdHhxX2lkID0gaXdsNDk2NV90eHFfY3R4X2FjdGl2YXRlX2ZyZWUocHJpdik7Ci0JaWYgKHR4cV9pZCA9PSAtMSkgewotCQlJV0xfRVJSKHByaXYsICJObyBmcmVlIGFnZ3JlZ2F0aW9uIHF1ZXVlIGF2YWlsYWJsZVxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JdGlkX2RhdGEgPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKLQkqc3NuID0gU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKTsKLQl0aWRfZGF0YS0+YWdnLnR4cV9pZCA9IHR4cV9pZDsKLQlpd2xfbGVnYWN5X3NldF9zd3FfaWQoJnByaXYtPnR4cVt0eHFfaWRdLAotCQkJCWl3bDQ5NjVfZ2V0X2FjX2Zyb21fdGlkKHRpZCksIHR4cV9pZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldCA9IGl3bDQ5NjVfdHhxX2FnZ19lbmFibGUocHJpdiwgdHhxX2lkLCB0eF9maWZvLAotCQkJCQkJICBzdGFfaWQsIHRpZCwgKnNzbik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXRpZF9kYXRhID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07Ci0JaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJIVyBxdWV1ZSBpcyBlbXB0eVxuIik7Ci0JCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJV0xfQUdHX09OOwotCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSFQocHJpdiwKLQkJCSJIVyBxdWV1ZSBpcyBOT1QgZW1wdHk6ICVkIHBhY2tldHMgaW4gSFcgcXVldWVcbiIsCi0JCQkgICAgIHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlKTsKLQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIHR4cV9pZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRQotICogcHJpdi0+bG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlcgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhxX2FnZ19kaXNhYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IHR4cV9pZCwKLQkJCQkgICB1MTYgc3NuX2lkeCwgdTggdHhfZmlmbykKLXsKLQlpZiAoKElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFID4gdHhxX2lkKSB8fAotCSAgICAoSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUgKwotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIDw9IHR4cV9pZCkpIHsKLQkJSVdMX1dBUk4ocHJpdiwKLQkJCSJxdWV1ZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlZCwgbXVzdCBiZSAlZCB0byAlZFxuIiwKLQkJCXR4cV9pZCwgSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUsCi0JCQlJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRSArCi0JCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIC0gMSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWl3bDQ5NjVfdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIocHJpdiwgdHhxX2lkKTsKLQotCWl3bF9sZWdhY3lfY2xlYXJfYml0c19wcnBoKHByaXYsCi0JCQlJV0w0OV9TQ0RfUVVFVUVDSEFJTl9TRUwsICgxIDw8IHR4cV9pZCkpOwotCi0JcHJpdi0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc25faWR4ICYgMHhmZik7Ci0JcHJpdi0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOwotCS8qIHN1cHBvc2VzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCi0JaXdsNDk2NV9zZXRfd3JfcHRycyhwcml2LCB0eHFfaWQsIHNzbl9pZHgpOwotCi0JaXdsX2xlZ2FjeV9jbGVhcl9iaXRzX3BycGgocHJpdiwKLQkJCSBJV0w0OV9TQ0RfSU5URVJSVVBUX01BU0ssICgxIDw8IHR4cV9pZCkpOwotCWl3bF90eHFfY3R4X2RlYWN0aXZhdGUocHJpdiwgdHhxX2lkKTsKLQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLCB0eF9maWZvLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsNDk2NV90eF9hZ2dfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKQotewotCWludCB0eF9maWZvX2lkLCB0eHFfaWQsIHN0YV9pZCwgc3NuOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCWludCB3cml0ZV9wdHIsIHJlYWRfcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl0eF9maWZvX2lkID0gaXdsNDk2NV9nZXRfZmlmb19mcm9tX3RpZChpd2xfbGVnYWN5X3J4b25fY3R4X2Zyb21fdmlmKHZpZiksIHRpZCk7Ci0JaWYgKHVubGlrZWx5KHR4X2ZpZm9faWQgPCAwKSkKLQkJcmV0dXJuIHR4X2ZpZm9faWQ7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCi0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgc3RhdGlvbiBmb3IgQUdHIHRpZCAlZFxuIiwgdGlkKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXRpZF9kYXRhID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07Ci0Jc3NuID0gKHRpZF9kYXRhLT5zZXFfbnVtYmVyICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0OwotCXR4cV9pZCA9IHRpZF9kYXRhLT5hZ2cudHhxX2lkOwotCi0Jc3dpdGNoIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgewotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgotCQkvKgotCQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHBlZXIgc3RvcHMgYWdncmVnYXRpb24KLQkJICogYWdhaW4gYmVmb3JlIHdlJ3ZlIGhhZCBhIGNoYW5jZSB0byBkcmFpbiB0aGUKLQkJICogcXVldWUgd2Ugc2VsZWN0ZWQgcHJldmlvdXNseSwgaS5lLiBiZWZvcmUgdGhlCi0JCSAqIHNlc3Npb24gd2FzIHJlYWxseSBzdGFydGVkIGNvbXBsZXRlbHkuCi0JCSAqLwotCQlJV0xfREVCVUdfSFQocHJpdiwgIkFHRyBzdG9wIGJlZm9yZSBzZXR1cCBkb25lXG4iKTsKLQkJZ290byB0dXJuX29mZjsKLQljYXNlIElXTF9BR0dfT046Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9XQVJOKHByaXYsICJTdG9wcGluZyBBR0cgd2hpbGUgc3RhdGUgbm90IE9OIG9yIHN0YXJ0aW5nXG4iKTsKLQl9Ci0KLQl3cml0ZV9wdHIgPSBwcml2LT50eHFbdHhxX2lkXS5xLndyaXRlX3B0cjsKLQlyZWFkX3B0ciA9IHByaXYtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHI7Ci0KLQkvKiBUaGUgcXVldWUgaXMgbm90IGVtcHR5ICovCi0JaWYgKHdyaXRlX3B0ciAhPSByZWFkX3B0cikgewotCQlJV0xfREVCVUdfSFQocHJpdiwgIlN0b3BwaW5nIGEgbm9uIGVtcHR5IEFHRyBIVyBRVUVVRVxuIik7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID0KLQkJCQlJV0xfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCUlXTF9ERUJVR19IVChwcml2LCAiSFcgcXVldWUgaXMgZW1wdHlcbiIpOwotIHR1cm5fb2ZmOgotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID0gSVdMX0FHR19PRkY7Ci0KLQkvKiBkbyBub3QgcmVzdG9yZS9zYXZlIGlycXMgKi8KLQlzcGluX3VubG9jaygmcHJpdi0+c3RhX2xvY2spOwotCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7Ci0KLQkvKgotCSAqIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGNhbGwgY2FuIGZhaWwgaXMgcXVldWUgbnVtYmVyIG91dCBvZiByYW5nZSwKLQkgKiB3aGljaCBjYW4gaGFwcGVuIGlmIHVDb2RlIGlzIHJlbG9hZGVkIGFuZCBhbGwgdGhlIHN0YXRpb24KLQkgKiBpbmZvcm1hdGlvbiBhcmUgbG9zdC4gaWYgaXQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UsIHRoZXJlIGlzIG5vIG5lZWQKLQkgKiB0byBkZWFjdGl2YXRlIHRoZSB1Q29kZSBxdWV1ZSwganVzdCByZXR1cm4gInN1Y2Nlc3MiIHRvIGFsbG93Ci0JICogIG1hYzgwMjExIHRvIGNsZWFuIHVwIGl0IG93biBkYXRhLgotCSAqLwotCWl3bDQ5NjVfdHhxX2FnZ19kaXNhYmxlKHByaXYsIHR4cV9pZCwgc3NuLCB0eF9maWZvX2lkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2w0OTY1X3R4cV9jaGVja19lbXB0eShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICBpbnQgc3RhX2lkLCB1OCB0aWQsIGludCB0eHFfaWQpCi17Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZwcml2LT50eHFbdHhxX2lkXS5xOwotCXU4ICphZGRyID0gcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHI7Ci0Jc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGEgPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCi0JY3R4ID0gJnByaXYtPmNvbnRleHRzW3ByaXYtPnN0YXRpb25zW3N0YV9pZF0uY3R4aWRdOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c3RhX2xvY2spOwotCi0Jc3dpdGNoIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgewotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOgotCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlICovCi0JCS8qIGFnZ3JlZ2F0ZWQgSFcgcXVldWUgKi8KLQkJaWYgKCh0eHFfaWQgID09IHRpZF9kYXRhLT5hZ2cudHhxX2lkKSAmJgotCQkgICAgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikpIHsKLQkJCXUxNiBzc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOwotCQkJaW50IHR4X2ZpZm8gPSBpd2w0OTY1X2dldF9maWZvX2Zyb21fdGlkKGN0eCwgdGlkKTsKLQkJCUlXTF9ERUJVR19IVChwcml2LAotCQkJCSJIVyBxdWV1ZSBlbXB0eTogY29udGludWUgREVMQkEgZmxvd1xuIik7Ci0JCQlpd2w0OTY1X3R4cV9hZ2dfZGlzYWJsZShwcml2LCB0eHFfaWQsIHNzbiwgdHhfZmlmbyk7Ci0JCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0FHR19PRkY7Ci0JCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKGN0eC0+dmlmLCBhZGRyLCB0aWQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgotCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlIHF1ZXVlICovCi0JCWlmICh0aWRfZGF0YS0+dGZkc19pbl9xdWV1ZSA9PSAwKSB7Ci0JCQlJV0xfREVCVUdfSFQocHJpdiwKLQkJCQkiSFcgcXVldWUgZW1wdHk6IGNvbnRpbnVlIEFEREJBIGZsb3dcbiIpOwotCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT047Ci0JCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZShjdHgtPnZpZiwgYWRkciwgdGlkKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9ub25fYWdnX3R4X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJCSAgICAgY29uc3QgdTggKmFkZHIxKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YShjdHgtPnZpZiwgYWRkcjEpOwotCWlmIChzdGEpIHsKLQkJc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0JCS8qIGF2b2lkIGF0b21pYyBvcHMgaWYgdGhpcyBpc24ndCBhIGNsaWVudCAqLwotCQlpZiAoc3RhX3ByaXYtPmNsaWVudCAmJgotCQkgICAgYXRvbWljX2RlY19yZXR1cm4oJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcykgPT0gMCkKLQkJCWllZWU4MDIxMV9zdGFfYmxvY2tfYXdha2UocHJpdi0+aHcsIHN0YSwgZmFsc2UpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotc3RhdGljIHZvaWQKLWl3bDQ5NjVfdHhfc3RhdHVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9pbmZvICp0eF9pbmZvLAotCQkJICAgICBib29sIGlzX2FnZykKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHR4X2luZm8tPnNrYi0+ZGF0YTsKLQotCWlmICghaXNfYWdnKQotCQlpd2w0OTY1X25vbl9hZ2dfdHhfc3RhdHVzKHByaXYsIHR4X2luZm8tPmN0eCwgaGRyLT5hZGRyMSk7Ci0KLQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUocHJpdi0+aHcsIHR4X2luZm8tPnNrYik7Ci19Ci0KLWludCBpd2w0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCXN0cnVjdCBpd2xfdHhfaW5mbyAqdHhfaW5mbzsKLQlpbnQgbmZyZWVkID0gMDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwotCi0JaWYgKChpbmRleCA+PSBxLT5uX2JkKSB8fCAoaXdsX2xlZ2FjeV9xdWV1ZV91c2VkKHEsIGluZGV4KSA9PSAwKSkgewotCQlJV0xfRVJSKHByaXYsICJSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGluZGV4ICVkLCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwgdHhxX2lkLAotCQkJICBpbmRleCwgcS0+bl9iZCwgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaW5kZXggPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKGluZGV4LCBxLT5uX2JkKTsKLQkgICAgIHEtPnJlYWRfcHRyICE9IGluZGV4OwotCSAgICAgcS0+cmVhZF9wdHIgPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgewotCi0JCXR4X2luZm8gPSAmdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXTsKLQotCQlpZiAoV0FSTl9PTl9PTkNFKHR4X2luZm8tPnNrYiA9PSBOVUxMKSkKLQkJCWNvbnRpbnVlOwotCi0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXR4X2luZm8tPnNrYi0+ZGF0YTsKLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJbmZyZWVkKys7Ci0KLQkJaXdsNDk2NV90eF9zdGF0dXMocHJpdiwgdHhfaW5mbywKLQkJCQkgdHhxX2lkID49IElXTDQ5NjVfRklSU1RfQU1QRFVfUVVFVUUpOwotCQl0eF9pbmZvLT5za2IgPSBOVUxMOwotCi0JCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChwcml2LCB0eHEpOwotCX0KLQlyZXR1cm4gbmZyZWVkOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEgLSBVcGRhdGUgdHggc3RhdHVzIGZyb20gYmxvY2stYWNrCi0gKgotICogR28gdGhyb3VnaCBibG9jay1hY2sncyBiaXRtYXAgb2YgQUNLJ2QgZnJhbWVzLCB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mCi0gKiBBQ0sgdnMuIG5vdC4gIFRoaXMgZ2V0cyBzZW50IHRvIG1hYzgwMjExLCB0aGVuIHRvIHJhdGUgc2NhbGluZyBhbGdvLgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnLAotCQkJCSBzdHJ1Y3QgaXdsX2NvbXByZXNzZWRfYmFfcmVzcCAqYmFfcmVzcCkKLQotewotCWludCBpLCBzaCwgYWNrOwotCXUxNiBzZXFfY3RsID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2VxX2N0bCk7Ci0JdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOwotCWludCBzdWNjZXNzZXMgPSAwOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKLQl1NjQgYml0bWFwLCBzZW50X2JpdG1hcDsKLQotCWlmICh1bmxpa2VseSghYWdnLT53YWl0X2Zvcl9iYSkpICB7Ci0JCWlmICh1bmxpa2VseShiYV9yZXNwLT5iaXRtYXApKQotCQkJSVdMX0VSUihwcml2LCAiUmVjZWl2ZWQgQkEgd2hlbiBub3QgZXhwZWN0ZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBNYXJrIHRoYXQgdGhlIGV4cGVjdGVkIGJsb2NrLWFjayByZXNwb25zZSBhcnJpdmVkICovCi0JYWdnLT53YWl0X2Zvcl9iYSA9IDA7Ci0JSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJCQSAlZCAlZFxuIiwgYWdnLT5zdGFydF9pZHgsCi0JCQkJCQkJYmFfcmVzcC0+c2VxX2N0bCk7Ci0KLQkvKiBDYWxjdWxhdGUgc2hpZnQgdG8gYWxpZ24gYmxvY2stYWNrIGJpdHMgd2l0aCBvdXIgVHggd2luZG93IGJpdHMgKi8KLQlzaCA9IGFnZy0+c3RhcnRfaWR4IC0gU0VRX1RPX0lOREVYKHNlcV9jdGwgPj4gNCk7Ci0JaWYgKHNoIDwgMCkgLyogdGJ3IHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGluZGljZXMgKi8KLQkJc2ggKz0gMHgxMDA7Ci0KLQlpZiAoYWdnLT5mcmFtZV9jb3VudCA+ICg2NCAtIHNoKSkgewotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIm1vcmUgZnJhbWVzIHRoYW4gYml0bWFwIHNpemUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGRvbid0IHVzZSA2NC1iaXQgdmFsdWVzIGZvciBub3cgKi8KLQliaXRtYXAgPSBsZTY0X3RvX2NwdShiYV9yZXNwLT5iaXRtYXApID4+IHNoOwotCi0JLyogY2hlY2sgZm9yIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhY2NvcmRpbmcgdG8gdGhlCi0JICogdHJhbnNtaXR0ZWQgYml0bWFwIGFuZCBibG9jay1hY2sgYml0bWFwICovCi0Jc2VudF9iaXRtYXAgPSBiaXRtYXAgJiBhZ2ctPmJpdG1hcDsKLQotCS8qIEZvciBlYWNoIGZyYW1lIGF0dGVtcHRlZCBpbiBhZ2dyZWdhdGlvbiwKLQkgKiB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mIHR4IGZyYW1lJ3Mgc3RhdHVzLiAqLwotCWkgPSAwOwotCXdoaWxlIChzZW50X2JpdG1hcCkgewotCQlhY2sgPSBzZW50X2JpdG1hcCAmIDFVTEw7Ci0JCXN1Y2Nlc3NlcyArPSBhY2s7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiJXMgT04gaT0lZCBpZHg9JWQgcmF3PSVkXG4iLAotCQkJYWNrID8gIkFDSyIgOiAiTkFDSyIsIGksCi0JCQkoYWdnLT5zdGFydF9pZHggKyBpKSAmIDB4ZmYsCi0JCQlhZ2ctPnN0YXJ0X2lkeCArIGkpOwotCQlzZW50X2JpdG1hcCA+Pj0gMTsKLQkJKytpOwotCX0KLQotCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiQml0bWFwICVsbHhcbiIsCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXApOwotCi0JaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IocHJpdi0+dHhxW3NjZF9mbG93XS50eGJbYWdnLT5zdGFydF9pZHhdLnNrYik7Ci0JbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKLQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7Ci0JaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQU1QRFU7Ci0JaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW4gPSBzdWNjZXNzZXM7Ci0JaW5mby0+c3RhdHVzLmFtcGR1X2xlbiA9IGFnZy0+ZnJhbWVfY291bnQ7Ci0JaXdsNDk2NV9od3JhdGVfdG9fdHhfY29udHJvbChwcml2LCBhZ2ctPnJhdGVfbl9mbGFncywgaW5mbyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB0cmFuc2xhdGUgdWNvZGUgcmVzcG9uc2UgdG8gbWFjODAyMTEgdHggc3RhdHVzIGNvbnRyb2wgdmFsdWVzCi0gKi8KLXZvaWQgaXdsNDk2NV9od3JhdGVfdG9fdHhfY29udHJvbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByYXRlX25fZmxhZ3MsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICpyID0gJmluZm8tPmNvbnRyb2wucmF0ZXNbMF07Ci0KLQlpbmZvLT5hbnRlbm5hX3NlbF90eCA9Ci0JCSgocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FCQ19NU0spID4+IFJBVEVfTUNTX0FOVF9QT1MpOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCi0JCXItPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19NQ1M7Ci0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0dGX01TSykKLQkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykKLQkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKLQlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykKLQkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0RVUF9EQVRBOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQotCQlyLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7Ci0Jci0+aWR4ID0gaXdsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHJhdGVfbl9mbGFncywgaW5mby0+YmFuZCk7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9yeF9yZXBseV9jb21wcmVzc2VkX2JhIC0gSGFuZGxlciBmb3IgUkVQTFlfQ09NUFJFU1NFRF9CQQotICoKLSAqIEhhbmRsZXMgYmxvY2stYWNrbm93bGVkZ2Ugbm90aWZpY2F0aW9uIGZyb20gZGV2aWNlLCB3aGljaCByZXBvcnRzIHN1Y2Nlc3MKLSAqIG9mIGZyYW1lcyBzZW50IHZpYSBhZ2dyZWdhdGlvbi4KLSAqLwotdm9pZCBpd2w0OTY1X3J4X3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX2NvbXByZXNzZWRfYmFfcmVzcCAqYmFfcmVzcCA9ICZwa3QtPnUuY29tcHJlc3NlZF9iYTsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSBOVUxMOwotCXN0cnVjdCBpd2xfaHRfYWdnICphZ2c7Ci0JaW50IGluZGV4OwotCWludCBzdGFfaWQ7Ci0JaW50IHRpZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogImZsb3ciIGNvcnJlc3BvbmRzIHRvIFR4IHF1ZXVlICovCi0JdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOwotCi0JLyogInNzbiIgaXMgc3RhcnQgb2YgYmxvY2stYWNrIFR4IHdpbmRvdywgY29ycmVzcG9uZHMgdG8gaW5kZXgKLQkgKiAoaW4gVHggcXVldWUncyBjaXJjdWxhciBidWZmZXIpIG9mIGZpcnN0IFRGRC9mcmFtZSBpbiB3aW5kb3cgKi8KLQl1MTYgYmFfcmVzcF9zY2Rfc3NuID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX3Nzbik7Ci0KLQlpZiAoc2NkX2Zsb3cgPj0gcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJCVUdfT04gc2NkX2Zsb3cgaXMgYmlnZ2VyIHRoYW4gbnVtYmVyIG9mIHF1ZXVlc1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQl0eHEgPSAmcHJpdi0+dHhxW3NjZF9mbG93XTsKLQlzdGFfaWQgPSBiYV9yZXNwLT5zdGFfaWQ7Ci0JdGlkID0gYmFfcmVzcC0+dGlkOwotCWFnZyA9ICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZzsKLQlpZiAodW5saWtlbHkoYWdnLT50eHFfaWQgIT0gc2NkX2Zsb3cpKSB7Ci0JCS8qCi0JCSAqIEZJWE1FOiB0aGlzIGlzIGEgdUNvZGUgYnVnIHdoaWNoIG5lZWQgdG8gYmUgYWRkcmVzc2VkLAotCQkgKiBsb2cgdGhlIGluZm9ybWF0aW9uIGFuZCByZXR1cm4gZm9yIG5vdyEKLQkJICogc2luY2UgaXQgaXMgcG9zc2libGUgaGFwcGVuIHZlcnkgb2Z0ZW4gYW5kIGluIG9yZGVyCi0JCSAqIG5vdCB0byBmaWxsIHRoZSBzeXNsb2csIGRvbid0IGVuYWJsZSB0aGUgbG9nZ2luZyBieSBkZWZhdWx0Ci0JCSAqLwotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwKLQkJCSJCQSBzY2RfZmxvdyAlZCBkb2VzIG5vdCBtYXRjaCB0eHFfaWQgJWRcbiIsCi0JCQlzY2RfZmxvdywgYWdnLT50eHFfaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRmluZCBpbmRleCBqdXN0IGJlZm9yZSBibG9jay1hY2sgd2luZG93ICovCi0JaW5kZXggPSBpd2xfbGVnYWN5X3F1ZXVlX2RlY193cmFwKGJhX3Jlc3Bfc2NkX3NzbiAmIDB4ZmYsIHR4cS0+cS5uX2JkKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJSRVBMWV9DT01QUkVTU0VEX0JBIFslZF0gUmVjZWl2ZWQgZnJvbSAlcE0sICIKLQkJCSAgICJzdGFfaWQgPSAlZFxuIiwKLQkJCSAgIGFnZy0+d2FpdF9mb3JfYmEsCi0JCQkgICAodTggKikgJmJhX3Jlc3AtPnN0YV9hZGRyX2xvMzIsCi0JCQkgICBiYV9yZXNwLT5zdGFfaWQpOwotCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiVElEID0gJWQsIFNlcUN0bCA9ICVkLCBiaXRtYXAgPSAweCVsbHgsIgotCQkJInNjZF9mbG93ID0gIgotCQkJICAgIiVkLCBzY2Rfc3NuID0gJWRcbiIsCi0JCQkgICBiYV9yZXNwLT50aWQsCi0JCQkgICBiYV9yZXNwLT5zZXFfY3RsLAotCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShiYV9yZXNwLT5iaXRtYXApLAotCQkJICAgYmFfcmVzcC0+c2NkX2Zsb3csCi0JCQkgICBiYV9yZXNwLT5zY2Rfc3NuKTsKLQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkRBVCBzdGFydF9pZHggPSAlZCwgYml0bWFwID0gMHglbGx4XG4iLAotCQkJICAgYWdnLT5zdGFydF9pZHgsCi0JCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWFnZy0+Yml0bWFwKTsKLQotCS8qIFVwZGF0ZSBkcml2ZXIncyByZWNvcmQgb2YgQUNLIHZzLiBub3QgZm9yIGVhY2ggZnJhbWUgaW4gd2luZG93ICovCi0JaXdsNDk2NV90eF9zdGF0dXNfcmVwbHlfY29tcHJlc3NlZF9iYShwcml2LCBhZ2csIGJhX3Jlc3ApOwotCi0JLyogUmVsZWFzZSBhbGwgVEZEcyBiZWZvcmUgdGhlIFNTTiwgaS5lLiBhbGwgVEZEcyBpbiBmcm9udCBvZgotCSAqIGJsb2NrLWFjayB3aW5kb3cgKHdlIGFzc3VtZSB0aGF0IHRoZXkndmUgYmVlbiBzdWNjZXNzZnVsbHkKLQkgKiB0cmFuc21pdHRlZCAuLi4gaWYgbm90LCBpdCdzIHRvbyBsYXRlIGFueXdheSkuICovCi0JaWYgKHR4cS0+cS5yZWFkX3B0ciAhPSAoYmFfcmVzcF9zY2Rfc3NuICYgMHhmZikpIHsKLQkJLyogY2FsY3VsYXRlIG1hYzgwMjExIGFtcGR1IHN3IHF1ZXVlIHRvIHdha2UgKi8KLQkJaW50IGZyZWVkID0gaXdsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHByaXYsIHNjZF9mbG93LCBpbmRleCk7Ci0JCWl3bDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHByaXYsIHN0YV9pZCwgdGlkLCBmcmVlZCk7Ci0KLQkJaWYgKChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrKSAmJgotCQkgICAgcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCAmJgotCQkgICAgKGFnZy0+c3RhdGUgIT0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKSkKLQkJCWl3bF9sZWdhY3lfd2FrZV9xdWV1ZShwcml2LCB0eHEpOwotCi0JCWl3bDQ5NjVfdHhxX2NoZWNrX2VtcHR5KHByaXYsIHN0YV9pZCwgdGlkLCBzY2RfZmxvdyk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotY29uc3QgY2hhciAqaXdsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKLXsKLSNkZWZpbmUgVFhfU1RBVFVTX0ZBSUwoeCkgY2FzZSBUWF9TVEFUVVNfRkFJTF8gIyMgeDogcmV0dXJuICN4Ci0jZGVmaW5lIFRYX1NUQVRVU19QT1NUUE9ORSh4KSBjYXNlIFRYX1NUQVRVU19QT1NUUE9ORV8gIyMgeDogcmV0dXJuICN4Ci0KLQlzd2l0Y2ggKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spIHsKLQljYXNlIFRYX1NUQVRVU19TVUNDRVNTOgotCQlyZXR1cm4gIlNVQ0NFU1MiOwotCVRYX1NUQVRVU19QT1NUUE9ORShERUxBWSk7Ci0JVFhfU1RBVFVTX1BPU1RQT05FKEZFV19CWVRFUyk7Ci0JVFhfU1RBVFVTX1BPU1RQT05FKFFVSUVUX1BFUklPRCk7Ci0JVFhfU1RBVFVTX1BPU1RQT05FKENBTENfVFRBSyk7Ci0JVFhfU1RBVFVTX0ZBSUwoSU5URVJOQUxfQ1JPU1NFRF9SRVRSWSk7Ci0JVFhfU1RBVFVTX0ZBSUwoU0hPUlRfTElNSVQpOwotCVRYX1NUQVRVU19GQUlMKExPTkdfTElNSVQpOwotCVRYX1NUQVRVU19GQUlMKEZJRk9fVU5ERVJSVU4pOwotCVRYX1NUQVRVU19GQUlMKERSQUlOX0ZMT1cpOwotCVRYX1NUQVRVU19GQUlMKFJGS0lMTF9GTFVTSCk7Ci0JVFhfU1RBVFVTX0ZBSUwoTElGRV9FWFBJUkUpOwotCVRYX1NUQVRVU19GQUlMKERFU1RfUFMpOwotCVRYX1NUQVRVU19GQUlMKEhPU1RfQUJPUlRFRCk7Ci0JVFhfU1RBVFVTX0ZBSUwoQlRfUkVUUlkpOwotCVRYX1NUQVRVU19GQUlMKFNUQV9JTlZBTElEKTsKLQlUWF9TVEFUVVNfRkFJTChGUkFHX0RST1BQRUQpOwotCVRYX1NUQVRVU19GQUlMKFRJRF9ESVNBQkxFKTsKLQlUWF9TVEFUVVNfRkFJTChGSUZPX0ZMVVNIRUQpOwotCVRYX1NUQVRVU19GQUlMKElOU1VGRklDSUVOVF9DRl9QT0xMKTsKLQlUWF9TVEFUVVNfRkFJTChQQVNTSVZFX05PX1JYKTsKLQlUWF9TVEFUVVNfRkFJTChOT19CRUFDT05fT05fUkFEQVIpOwotCX0KLQotCXJldHVybiAiVU5LTk9XTiI7Ci0KLSN1bmRlZiBUWF9TVEFUVVNfRkFJTAotI3VuZGVmIFRYX1NUQVRVU19QT1NUUE9ORQotfQotI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdWNvZGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMWQxNDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdWNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1ody5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLQotI2RlZmluZSBJV0xfQUNfVU5TRVQgLTEKLQotLyoqCi0gKiBpd2xfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKLSAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKLSAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KLSAqLwotc3RhdGljIGludAotaXdsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LCBfX2xlMzIgKmltYWdlLCB1MzIgbGVuKQotewotCXUzMiB2YWw7Ci0JaW50IHJldCA9IDA7Ci0JdTMyIGVycmNudCA9IDA7Ci0JdTMyIGk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxMDAsIGltYWdlICs9IDEwMC9zaXplb2YodTMyKSkgewotCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KLQkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCi0JCSAqIGlmIElXTF9ETF9JTyBpcyBzZXQgKi8KLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLAotCQkJaSArIElXTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCQl2YWwgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgewotCQkJcmV0ID0gLUVJTzsKLQkJCWVycmNudCsrOwotCQkJaWYgKGVycmNudCA+PSAzKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3ZlcmlmeV9pbnN0X2Z1bGwgLSB2ZXJpZnkgcnVudGltZSB1Q29kZSBpbWFnZSBpbiBjYXJkIHZzLiBob3N0LAotICogICAgIGxvb2tpbmcgYXQgYWxsIGRhdGEuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV92ZXJpZnlfaW5zdF9mdWxsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgX19sZTMyICppbWFnZSwKLQkJCQkgdTMyIGxlbikKLXsKLQl1MzIgdmFsOwotCXUzMiBzYXZlX2xlbiA9IGxlbjsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgZXJyY250OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwKLQkJCSAgIElXTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCi0JZXJyY250ID0gMDsKLQlmb3IgKDsgbGVuID4gMDsgbGVuIC09IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7Ci0JCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLwotCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKLQkJICogaWYgSVdMX0RMX0lPIGlzIHNldCAqLwotCQl2YWwgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgewotCQkJSVdMX0VSUihwcml2LCAidUNvZGUgSU5TVCBzZWN0aW9uIGlzIGludmFsaWQgYXQgIgotCQkJCSAgIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwKLQkJCQkgIHNhdmVfbGVuIC0gbGVuLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWVycmNudCsrOwotCQkJaWYgKGVycmNudCA+PSAyMCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCWlmICghZXJyY250KQotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkgICAgInVjb2RlIGltYWdlIGluIElOU1RSVUNUSU9OIG1lbW9yeSBpcyBnb29kXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogaXdsNDk2NV92ZXJpZnlfdWNvZGUgLSBkZXRlcm1pbmUgd2hpY2ggaW5zdHJ1Y3Rpb24gaW1hZ2UgaXMgaW4gU1JBTSwKLSAqICAgIGFuZCB2ZXJpZnkgaXRzIGNvbnRlbnRzCi0gKi8KLWludCBpd2w0OTY1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JX19sZTMyICppbWFnZTsKLQl1MzIgbGVuOwotCWludCByZXQ7Ci0KLQkvKiBUcnkgYm9vdHN0cmFwICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JcmV0ID0gaXdsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKCFyZXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJvb3RzdHJhcCB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIFRyeSBpbml0aWFsaXplICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfaW5pdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfaW5pdC5sZW47Ci0JcmV0ID0gaXdsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKCFyZXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBUcnkgcnVudGltZS9wcm90b2NvbCAqLwotCWltYWdlID0gKF9fbGUzMiAqKXByaXYtPnVjb2RlX2NvZGUudl9hZGRyOwotCWxlbiA9IHByaXYtPnVjb2RlX2NvZGUubGVuOwotCXJldCA9IGl3bDQ5NjVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOwotCWlmICghcmV0KSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0VSUihwcml2LCAiTk8gVkFMSUQgVUNPREUgSU1BR0UgSU4gSU5TVFJVQ1RJT04gU1JBTSEhXG4iKTsKLQotCS8qIFNpbmNlIG5vdGhpbmcgc2VlbXMgdG8gbWF0Y2gsIHNob3cgZmlyc3Qgc2V2ZXJhbCBkYXRhIGVudHJpZXMgaW4KLQkgKiBpbnN0cnVjdGlvbiBTUkFNLCBzbyBtYXliZSB2aXN1YWwgaW5zcGVjdGlvbiB3aWxsIGdpdmUgYSBjbHVlLgotCSAqIFNlbGVjdGlvbiBvZiBib290c3RyYXAgaW1hZ2UgKHZzLiBvdGhlciBpbWFnZXMpIGlzIGFyYml0cmFyeS4gKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9ib290LmxlbjsKLQlyZXQgPSBpd2w0OTY1X3ZlcmlmeV9pbnN0X2Z1bGwocHJpdiwgaW1hZ2UsIGxlbik7Ci0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjRmY2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDIxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1jYWxpYi5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1sZWQuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS5oIgotI2luY2x1ZGUgIml3bC00OTY1LWRlYnVnZnMuaCIKLQotc3RhdGljIGludCBpd2w0OTY1X3NlbmRfdHhfcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXN0YXRpYyBpbnQgaXdsNDk2NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMNDk2NV9VQ09ERV9BUElfTUFYIDIKLQotLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w0OTY1X1VDT0RFX0FQSV9NSU4gMgotCi0jZGVmaW5lIElXTDQ5NjVfRldfUFJFICJpd2x3aWZpLTQ5NjUtIgotI2RlZmluZSBfSVdMNDk2NV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w0OTY1X0ZXX1BSRSAjYXBpICIudWNvZGUiCi0jZGVmaW5lIElXTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgX0lXTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkKLQotLyogY2hlY2sgY29udGVudHMgb2Ygc3BlY2lhbCBib290c3RyYXAgdUNvZGUgU1JBTSAqLwotc3RhdGljIGludCBpd2w0OTY1X3ZlcmlmeV9ic20oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCV9fbGUzMiAqaW1hZ2UgPSBwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQl1MzIgbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JdTMyIHJlZzsKLQl1MzIgdmFsOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJlZ2luIHZlcmlmeSBic21cbiIpOwotCi0JLyogdmVyaWZ5IEJTTSBTUkFNIGNvbnRlbnRzICovCi0JdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgQlNNX1dSX0RXQ09VTlRfUkVHKTsKLQlmb3IgKHJlZyA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOwotCSAgICAgcmVnIDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWcgKz0gc2l6ZW9mKHUzMiksIGltYWdlKyspIHsKLQkJdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgcmVnKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJCU00gdUNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZCBhdCAiCi0JCQkJICAiYWRkciAweCUwOFgrJXUgKG9mICV1KSwgaXMgMHgleCwgcy9iIDB4JXhcbiIsCi0JCQkJICBCU01fU1JBTV9MT1dFUl9CT1VORCwKLQkJCQkgIHJlZyAtIEJTTV9TUkFNX0xPV0VSX0JPVU5ELCBsZW4sCi0JCQkJICB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlNNIGJvb3RzdHJhcCB1Q29kZSBpbWFnZSBPS1xuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2xvYWRfYnNtIC0gTG9hZCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zCi0gKgotICogQlNNIG9wZXJhdGlvbjoKLSAqCi0gKiBUaGUgQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUgKEJTTSkgc3RvcmVzIGEgc2hvcnQgYm9vdHN0cmFwIHVDb2RlIHByb2dyYW0KLSAqIGluIHNwZWNpYWwgU1JBTSB0aGF0IGRvZXMgbm90IHBvd2VyIGRvd24gZHVyaW5nIFJGS0lMTC4gIFdoZW4gcG93ZXJpbmcgYmFjawotICogdXAgYWZ0ZXIgcG93ZXItc2F2aW5nIHNsZWVwcyAob3IgZHVyaW5nIGluaXRpYWwgdUNvZGUgbG9hZCksIHRoZSBCU00gbG9hZHMKLSAqIHRoZSBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsIGFuZCBzdGFydHMgaXQuCi0gKgotICogVGhlIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzICh2aWEgRE1BKSBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgZm9yIGEgbmV3Ci0gKiBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIGhvc3QgZHJpdmVyIGluIHRoZQotICogQlNNX0RSQU1fKiByZWdpc3RlcnMuICBPbmNlIHRoZSBuZXcgcHJvZ3JhbSBpcyBsb2FkZWQsIGl0IHN0YXJ0cwotICogYXV0b21hdGljYWxseS4KLSAqCi0gKiBXaGVuIGluaXRpYWxpemluZyB0aGUgTklDLCB0aGUgaG9zdCBkcml2ZXIgcG9pbnRzIHRoZSBCU00gdG8gdGhlCi0gKiAiaW5pdGlhbGl6ZSIgdUNvZGUgaW1hZ2UuICBUaGlzIHVDb2RlIHNldHMgdXAgc29tZSBpbnRlcm5hbCBkYXRhLCB0aGVuCi0gKiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgdGhhdCBpdCBpcyBjb21wbGV0ZS4KLSAqCi0gKiBUaGUgaG9zdCB0aGVuIHJlcGxhY2VzIHRoZSBCU01fRFJBTV8qIHBvaW50ZXIgdmFsdWVzIHRvIHBvaW50IHRvIHRoZQotICogbm9ybWFsIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCBhIGJhY2t1cCB1Q29kZSBkYXRhIGNhY2hlIGJ1ZmZlcgotICogKGZpbGxlZCBpbml0aWFsbHkgd2l0aCBzdGFydGluZyBkYXRhIHZhbHVlcyBmb3IgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciksCi0gKiB0aGVuIHRyaWdnZXJzIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gbG9hZCBhbmQgbGF1bmNoIHRoZSBydW50aW1lIHVDb2RlLAotICogd2hpY2ggYmVnaW5zIG5vcm1hbCBvcGVyYXRpb24uCi0gKgotICogV2hlbiBkb2luZyBhIHBvd2VyLXNhdmUgc2h1dGRvd24sIHJ1bnRpbWUgdUNvZGUgc2F2ZXMgZGF0YSBTUkFNIGludG8KLSAqIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbiBEUkFNIGJlZm9yZSBTUkFNIGlzIHBvd2VyZWQgZG93bi4KLSAqCi0gKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgVGhpcyByZWxvYWRzCi0gKiB0aGUgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbnRvIFNSQU0sCi0gKiBhbmQgcmUtbGF1bmNoZXMgdGhlIHJ1bnRpbWUgdUNvZGUgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X2xvYWRfYnNtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfX2xlMzIgKmltYWdlID0gcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JdTMyIGxlbiA9IHByaXYtPnVjb2RlX2Jvb3QubGVuOwotCWRtYV9hZGRyX3QgcGluc3Q7Ci0JZG1hX2FkZHJfdCBwZGF0YTsKLQl1MzIgaW5zdF9sZW47Ci0JdTMyIGRhdGFfbGVuOwotCWludCBpOwotCXUzMiBkb25lOwotCXUzMiByZWdfb2Zmc2V0OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQmVnaW4gbG9hZCBic21cbiIpOwotCi0JcHJpdi0+dWNvZGVfdHlwZSA9IFVDT0RFX1JUOwotCi0JLyogbWFrZSBzdXJlIGJvb3RzdHJhcCBwcm9ncmFtIGlzIG5vIGxhcmdlciB0aGFuIEJTTSdzIFNSQU0gc2l6ZSAqLwotCWlmIChsZW4gPiBJV0w0OV9NQVhfQlNNX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCB0aGUgIkluaXRpYWxpemUiIHVDb2RlCi0JICogICBpbiBob3N0IERSQU0gLi4uIGhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgMzU6NCBmb3IgNDk2NS4KLQkgKiBOT1RFOiAgaXdsX2luaXRfYWxpdmVfc3RhcnQoKSB3aWxsIHJlcGxhY2UgdGhlc2UgdmFsdWVzLAotCSAqICAgICAgICBhZnRlciB0aGUgImluaXRpYWxpemUiIHVDb2RlIGhhcyBydW4sIHRvIHBvaW50IHRvCi0JICogICAgICAgIHJ1bnRpbWUvcHJvdG9jb2wgaW5zdHJ1Y3Rpb25zIGFuZCBiYWNrdXAgZGF0YSBjYWNoZS4KLQkgKi8KLQlwaW5zdCA9IHByaXYtPnVjb2RlX2luaXQucF9hZGRyID4+IDQ7Ci0JcGRhdGEgPSBwcml2LT51Y29kZV9pbml0X2RhdGEucF9hZGRyID4+IDQ7Ci0JaW5zdF9sZW4gPSBwcml2LT51Y29kZV9pbml0LmxlbjsKLQlkYXRhX2xlbiA9IHByaXYtPnVjb2RlX2luaXRfZGF0YS5sZW47Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcsIGluc3RfbGVuKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLCBkYXRhX2xlbik7Ci0KLQkvKiBGaWxsIEJTTSBtZW1vcnkgd2l0aCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zICovCi0JZm9yIChyZWdfb2Zmc2V0ID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7Ci0JICAgICByZWdfb2Zmc2V0IDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWdfb2Zmc2V0ICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKQotCQlfaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZ19vZmZzZXQsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCi0JcmV0ID0gaXdsNDk2NV92ZXJpZnlfYnNtKHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBUZWxsIEJTTSB0byBjb3B5IGZyb20gQlNNIFNSQU0gaW50byBpbnN0cnVjdGlvbiBTUkFNLCB3aGVuIGFza2VkICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9XUl9NRU1fU1JDX1JFRywgMHgwKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwKLQkJCUJTTV9XUl9NRU1fRFNUX1JFRywgSVdMNDlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fV1JfRFdDT1VOVF9SRUcsIGxlbiAvIHNpemVvZih1MzIpKTsKLQotCS8qIExvYWQgYm9vdHN0cmFwIGNvZGUgaW50byBpbnN0cnVjdGlvbiBTUkFNIG5vdywKLQkgKiAgIHRvIHByZXBhcmUgdG8gbG9hZCAiaW5pdGlhbGl6ZSIgdUNvZGUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX1dSX0NUUkxfUkVHLCBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKTsKLQotCS8qIFdhaXQgZm9yIGxvYWQgb2YgYm9vdHN0cmFwIHVDb2RlIHRvIGZpbmlzaCAqLwotCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQlkb25lID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgQlNNX1dSX0NUUkxfUkVHKTsKLQkJaWYgKCEoZG9uZSAmIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQpKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCWlmIChpIDwgMTAwKQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlNNIHdyaXRlIGNvbXBsZXRlLCBwb2xsICVkIGl0ZXJhdGlvbnNcbiIsIGkpOwotCWVsc2UgewotCQlJV0xfRVJSKHByaXYsICJCU00gd3JpdGUgZGlkIG5vdCBjb21wbGV0ZSFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBFbmFibGUgZnV0dXJlIGJvb3QgbG9hZHMgd2hlbmV2ZXIgcG93ZXIgbWFuYWdlbWVudCB1bml0IHRyaWdnZXJzIGl0Ci0JICogICAoZS5nLiB3aGVuIHBvd2VyaW5nIGJhY2sgdXAgYWZ0ZXIgcG93ZXItc2F2ZSBzaHV0ZG93bikgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwKLQkJCUJTTV9XUl9DVFJMX1JFRywgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTik7Ci0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfc2V0X3Vjb2RlX3B0cnMgLSBTZXQgdUNvZGUgYWRkcmVzcyBsb2NhdGlvbgotICoKLSAqIFRlbGwgaW5pdGlhbGl6YXRpb24gdUNvZGUgd2hlcmUgdG8gZmluZCBydW50aW1lIHVDb2RlLgotICoKLSAqIEJTTSByZWdpc3RlcnMgaW5pdGlhbGx5IGNvbnRhaW4gcG9pbnRlcnMgdG8gaW5pdGlhbGl6YXRpb24gdUNvZGUuCi0gKiBXZSBuZWVkIHRvIHJlcGxhY2UgdGhlbSB0byBsb2FkIHJ1bnRpbWUgdUNvZGUgaW5zdCBhbmQgZGF0YSwKLSAqIGFuZCB0byBzYXZlIHJ1bnRpbWUgZGF0YSB3aGVuIHBvd2VyaW5nIGRvd24uCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZXRfdWNvZGVfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JZG1hX2FkZHJfdCBwaW5zdDsKLQlkbWFfYWRkcl90IHBkYXRhOwotCWludCByZXQgPSAwOwotCi0JLyogYml0cyAzNTo0IGZvciA0OTY1ICovCi0JcGluc3QgPSBwcml2LT51Y29kZV9jb2RlLnBfYWRkciA+PiA0OwotCXBkYXRhID0gcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAucF9hZGRyID4+IDQ7Ci0KLQkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIGltYWdlIHRvIGxvYWQgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsCi0JCQkJIHByaXYtPnVjb2RlX2RhdGEubGVuKTsKLQotCS8qIEluc3QgYnl0ZSBjb3VudCBtdXN0IGJlIGxhc3QgdG8gc2V0IHVwLCBiaXQgMzEgc2lnbmFscyB1Q29kZQotCSAqICAgdGhhdCBhbGwgbmV3IHB0ci9zaXplIGluZm8gaXMgaW4gcGxhY2UgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9CWVRFQ09VTlRfUkVHLAotCQkJCSBwcml2LT51Y29kZV9jb2RlLmxlbiB8IEJTTV9EUkFNX0lOU1RfTE9BRCk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJ1bnRpbWUgdUNvZGUgcG9pbnRlcnMgYXJlIHNldC5cbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2luaXRfYWxpdmVfc3RhcnQgLSBDYWxsZWQgYWZ0ZXIgUkVQTFlfQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCi0gKgotICogQ2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tICJpbml0aWFsaXplIiB1Q29kZS4KLSAqCi0gKiBUaGUgNDk2NSAiaW5pdGlhbGl6ZSIgQUxJVkUgcmVwbHkgY29udGFpbnMgY2FsaWJyYXRpb24gZGF0YSBmb3I6Ci0gKiAgIFZvbHRhZ2UsIHRlbXBlcmF0dXJlLCBhbmQgTUlNTyB0eCBnYWluIGNvcnJlY3Rpb24sIG5vdyBzdG9yZWQgaW4gcHJpdgotICogICAoMzk0NSBkb2VzIG5vdCBjb250YWluIHRoaXMgZGF0YSkuCi0gKgotICogVGVsbCAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gZ28gYWhlYWQgYW5kIGxvYWQgdGhlIHJ1bnRpbWUgdUNvZGUuCi0qLwotc3RhdGljIHZvaWQgaXdsNDk2NV9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiBCb290c3RyYXAgdUNvZGUgaGFzIGxvYWRlZCBpbml0aWFsaXplIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KLQkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQotCSAqICJpbml0aWFsaXplIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KLQlpZiAoaXdsNDk2NV92ZXJpZnlfdWNvZGUocHJpdikpIHsKLQkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJhZCBcImluaXRpYWxpemVcIiB1Q29kZSBsb2FkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgdGVtcGVyYXR1cmUgKi8KLQlwcml2LT50ZW1wZXJhdHVyZSA9IGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHByaXYpOwotCi0JLyogU2VuZCBwb2ludGVycyB0byBwcm90b2NvbC9ydW50aW1lIHVDb2RlIGltYWdlIC4uLiBpbml0IGNvZGUgd2lsbAotCSAqIGxvYWQgYW5kIGxhdW5jaCBydW50aW1lIHVDb2RlLCB3aGljaCB3aWxsIHNlbmQgdXMgYW5vdGhlciAiQWxpdmUiCi0JICogbm90aWZpY2F0aW9uLiAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCWlmIChpd2w0OTY1X3NldF91Y29kZV9wdHJzKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3b24ndCBoYXBwZW47Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNvdWxkbid0IHNldCB1cCB1Q29kZSBwb2ludGVycy5cbiIpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCXJldHVybjsKLQotcmVzdGFydDoKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotfQotCi1zdGF0aWMgYm9vbCBpdzQ5NjVfaXNfaHQ0MF9jaGFubmVsKF9fbGUzMiByeG9uX2ZsYWdzKQotewotCWludCBjaGFuX21vZCA9IGxlMzJfdG9fY3B1KHJ4b25fZmxhZ3MgJiBSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLKQotCQkJCSAgICA+PiBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TOwotCXJldHVybiAoKGNoYW5fbW9kID09IENIQU5ORUxfTU9ERV9QVVJFXzQwKSB8fAotCQkgIChjaGFuX21vZCA9PSBDSEFOTkVMX01PREVfTUlYRUQpKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9uaWNfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUxNiByYWRpb19jZmc7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JcmFkaW9fY2ZnID0gaXdsX2xlZ2FjeV9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fUkFESU9fQ09ORklHKTsKLQotCS8qIHdyaXRlIHJhZGlvIGNvbmZpZyB2YWx1ZXMgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoRUVQUk9NX1JGX0NGR19UWVBFX01TSyhyYWRpb19jZmcpID09IEVFUFJPTV80OTY1X1JGX0NGR19UWVBFX01BWCkKLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIEVFUFJPTV9SRl9DRkdfVFlQRV9NU0socmFkaW9fY2ZnKSB8Ci0JCQkgICAgRUVQUk9NX1JGX0NGR19TVEVQX01TSyhyYWRpb19jZmcpIHwKLQkJCSAgICBFRVBST01fUkZfQ0ZHX0RBU0hfTVNLKHJhZGlvX2NmZykpOwotCi0JLyogc2V0IENTUl9IV19DT05GSUdfUkVHIGZvciB1Q29kZSB1c2UgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCSAgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfUkFESU9fU0kgfAotCQkgICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX01BQ19TSSk7Ci0KLQlwcml2LT5jYWxpYl9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2luZm8gKikKLQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LAotCQkJCUVFUFJPTV80OTY1X0NBTElCX1RYUE9XRVJfT0ZGU0VUKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLX0KLQotLyogUmVzZXQgZGlmZmVyZW50aWFsIFJ4IGdhaW5zIGluIE5JQyB0byBwcmVwYXJlIGZvciBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbi4KLSAqIENhbGxlZCBhZnRlciBldmVyeSBhc3NvY2lhdGlvbiwgYnV0IHRoaXMgcnVucyBvbmx5IG9uY2UhCi0gKiAgLi4uIG9uY2UgY2hhaW4gbm9pc2UgaXMgY2FsaWJyYXRlZCB0aGUgZmlyc3QgdGltZSwgaXQncyBnb29kIGZvcmV2ZXIuICAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9jaGFpbl9ub2lzZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gJihwcml2LT5jaGFpbl9ub2lzZV9kYXRhKTsKLQotCWlmICgoZGF0YS0+c3RhdGUgPT0gSVdMX0NIQUlOX05PSVNFX0FMSVZFKSAmJgotCSAgICBpd2xfbGVnYWN5X2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKSB7Ci0JCXN0cnVjdCBpd2xfY2FsaWJfZGlmZl9nYWluX2NtZCBjbWQ7Ci0KLQkJLyogY2xlYXIgZGF0YSBmb3IgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gYWxnb3JpdGhtICovCi0JCWRhdGEtPmNoYWluX25vaXNlX2EgPSAwOwotCQlkYXRhLT5jaGFpbl9ub2lzZV9iID0gMDsKLQkJZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IDA7Ci0JCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gMDsKLQkJZGF0YS0+Y2hhaW5fc2lnbmFsX2IgPSAwOwotCQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IDA7Ci0JCWRhdGEtPmJlYWNvbl9jb3VudCA9IDA7Ci0KLQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQkJY21kLmhkci5vcF9jb2RlID0gSVdMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRDsKLQkJY21kLmRpZmZfZ2Fpbl9hID0gMDsKLQkJY21kLmRpZmZfZ2Fpbl9iID0gMDsKLQkJY21kLmRpZmZfZ2Fpbl9jID0gMDsKLQkJaWYgKGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQsCi0JCQkJIHNpemVvZihjbWQpLCAmY21kKSkKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiQ291bGQgbm90IHNlbmQgUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRFxuIik7Ci0JCWRhdGEtPnN0YXRlID0gSVdMX0NIQUlOX05PSVNFX0FDQ1VNVUxBVEU7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiUnVuIGNoYWluX25vaXNlX2NhbGlicmF0ZVxuIik7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgaXdsNDk2NV9zZW5zaXRpdml0eSA9IHsKLQkubWluX25yZ19jY2sgPSA5NywKLQkubWF4X25yZ19jY2sgPSAwLCAvKiBub3QgdXNlZCwgc2V0IHRvIDAgKi8KLQotCS5hdXRvX2NvcnJfbWluX29mZG0gPSA4NSwKLQkuYXV0b19jb3JyX21pbl9vZmRtX21yYyA9IDE3MCwKLQkuYXV0b19jb3JyX21pbl9vZmRtX3gxID0gMTA1LAotCS5hdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxID0gMjIwLAotCi0JLmF1dG9fY29ycl9tYXhfb2ZkbSA9IDEyMCwKLQkuYXV0b19jb3JyX21heF9vZmRtX21yYyA9IDIxMCwKLQkuYXV0b19jb3JyX21heF9vZmRtX3gxID0gMTQwLAotCS5hdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxID0gMjcwLAotCi0JLmF1dG9fY29ycl9taW5fY2NrID0gMTI1LAotCS5hdXRvX2NvcnJfbWF4X2NjayA9IDIwMCwKLQkuYXV0b19jb3JyX21pbl9jY2tfbXJjID0gMjAwLAotCS5hdXRvX2NvcnJfbWF4X2Nja19tcmMgPSA0MDAsCi0KLQkubnJnX3RoX2NjayA9IDEwMCwKLQkubnJnX3RoX29mZG0gPSAxMDAsCi0KLQkuYmFya2VyX2NvcnJfdGhfbWluID0gMTkwLAotCS5iYXJrZXJfY29ycl90aF9taW5fbXJjID0gMzkwLAotCS5ucmdfdGhfY2NhID0gNjIsCi19OwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3NldF9jdF90aHJlc2hvbGQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIHdhbnQgS2VsdmluICovCi0JcHJpdi0+aHdfcGFyYW1zLmN0X2tpbGxfdGhyZXNob2xkID0KLQkJQ0VMU0lVU19UT19LRUxWSU4oQ1RfS0lMTF9USFJFU0hPTERfTEVHQUNZKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2h3X3NldF9od19wYXJhbXMKLSAqCi0gKiBDYWxsZWQgd2hlbiBpbml0aWFsaXppbmcgZHJpdmVyCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpZiAocHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5udW1fb2ZfcXVldWVzID49IElXTF9NSU5fTlVNX1FVRVVFUyAmJgotCSAgICBwcml2LT5jZmctPm1vZF9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPD0gSVdMNDlfTlVNX1FVRVVFUykKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9Ci0JCQlwcml2LT5jZmctPm1vZF9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7Ci0KLQlwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwotCXByaXYtPmh3X3BhcmFtcy5kbWFfY2hubF9udW0gPSBGSDQ5X1RDU1JfQ0hOTF9OVU07Ci0JcHJpdi0+aHdfcGFyYW1zLnNjZF9iY190YmxzX3NpemUgPQotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqCi0JCQlzaXplb2Yoc3RydWN0IGl3bDQ5NjVfc2NkX2JjX3RibCk7Ci0JcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKTsKLQlwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zID0gSVdMNDk2NV9TVEFUSU9OX0NPVU5UOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCA9IElXTDQ5NjVfQlJPQURDQVNUX0lEOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplID0gSVdMNDlfUlRDX0RBVEFfU0laRTsKLQlwcml2LT5od19wYXJhbXMubWF4X2luc3Rfc2l6ZSA9IElXTDQ5X1JUQ19JTlNUX1NJWkU7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9ic21fc2l6ZSA9IEJTTV9TUkFNX1NJWkU7Ci0JcHJpdi0+aHdfcGFyYW1zLmh0NDBfY2hhbm5lbCA9IEJJVChJRUVFODAyMTFfQkFORF81R0haKTsKLQotCXByaXYtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZIX1JTQ1NSX0NITkwwX1dQVFI7Ci0KLQlwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bSA9IGl3bDQ5NjVfbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JcHJpdi0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW0gPSBpd2w0OTY1X251bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOwotCXByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3R4X2FudDsKLQlwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQ7Ci0KLQlpd2w0OTY1X3NldF9jdF90aHJlc2hvbGQocHJpdik7Ci0KLQlwcml2LT5od19wYXJhbXMuc2VucyA9ICZpd2w0OTY1X3NlbnNpdGl2aXR5OwotCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyA9IElXTDQ5NjVfRVhUX0JFQUNPTl9USU1FX1BPUzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgczMyIGl3bDQ5NjVfbWF0aF9kaXZfcm91bmQoczMyIG51bSwgczMyIGRlbm9tLCBzMzIgKnJlcykKLXsKLQlzMzIgc2lnbiA9IDE7Ci0KLQlpZiAobnVtIDwgMCkgewotCQlzaWduID0gLXNpZ247Ci0JCW51bSA9IC1udW07Ci0JfQotCWlmIChkZW5vbSA8IDApIHsKLQkJc2lnbiA9IC1zaWduOwotCQlkZW5vbSA9IC1kZW5vbTsKLQl9Ci0JKnJlcyA9IDE7Ci0JKnJlcyA9ICgobnVtICogMiArIGRlbm9tKSAvIChkZW5vbSAqIDIpKSAqIHNpZ247Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2dldF92b2x0YWdlX2NvbXBlbnNhdGlvbiAtIFBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXAgZm9yIHR4cG93ZXIKLSAqCi0gKiBEZXRlcm1pbmVzIHBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXBlbnNhdGlvbiBmb3IgdHhwb3dlciBjYWxjdWxhdGlvbnMuCi0gKiBSZXR1cm5zIG51bWJlciBvZiAxLzItZEIgc3RlcHMgdG8gc3VidHJhY3QgZnJvbSBnYWluIHRhYmxlIGluZGV4LAotICogdG8gY29tcGVuc2F0ZSBmb3IgZGlmZmVyZW5jZSBiZXR3ZWVuIHBvd2VyIHN1cHBseSB2b2x0YWdlIGR1cmluZwotICogZmFjdG9yeSBtZWFzdXJlbWVudHMsIHZzLiBjdXJyZW50IHBvd2VyIHN1cHBseSB2b2x0YWdlLgotICoKLSAqIFZvbHRhZ2UgaW5kaWNhdGlvbiBpcyBoaWdoZXIgZm9yIGxvd2VyIHZvbHRhZ2UuCi0gKiBMb3dlciB2b2x0YWdlIHJlcXVpcmVzIG1vcmUgZ2FpbiAobG93ZXIgZ2FpbiB0YWJsZSBpbmRleCkuCi0gKi8KLXN0YXRpYyBzMzIgaXdsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24oczMyIGVlcHJvbV92b2x0YWdlLAotCQkJCQkgICAgczMyIGN1cnJlbnRfdm9sdGFnZSkKLXsKLQlzMzIgY29tcCA9IDA7Ci0KLQlpZiAoKFRYX1BPV0VSX0lXTF9JTExFR0FMX1ZPTFRBR0UgPT0gZWVwcm9tX3ZvbHRhZ2UpIHx8Ci0JICAgIChUWF9QT1dFUl9JV0xfSUxMRUdBTF9WT0xUQUdFID09IGN1cnJlbnRfdm9sdGFnZSkpCi0JCXJldHVybiAwOwotCi0JaXdsNDk2NV9tYXRoX2Rpdl9yb3VuZChjdXJyZW50X3ZvbHRhZ2UgLSBlZXByb21fdm9sdGFnZSwKLQkJCSAgICAgICBUWF9QT1dFUl9JV0xfVk9MVEFHRV9DT0RFU19QRVJfMDNWLCAmY29tcCk7Ci0KLQlpZiAoY3VycmVudF92b2x0YWdlID4gZWVwcm9tX3ZvbHRhZ2UpCi0JCWNvbXAgKj0gMjsKLQlpZiAoKGNvbXAgPCAtMikgfHwgKGNvbXAgPiAyKSkKLQkJY29tcCA9IDA7Ci0KLQlyZXR1cm4gY29tcDsKLX0KLQotc3RhdGljIHMzMiBpd2w0OTY1X2dldF90eF9hdHRlbl9ncnAodTE2IGNoYW5uZWwpCi17Ci0JaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSVdMX1RYX0FUVEVOX0dSNV9GQ0ggJiYKLQkgICAgY2hhbm5lbCA8PSBDQUxJQl9JV0xfVFhfQVRURU5fR1I1X0xDSCkKLQkJcmV0dXJuIENBTElCX0NIX0dST1VQXzU7Ci0KLQlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JV0xfVFhfQVRURU5fR1IxX0ZDSCAmJgotCSAgICBjaGFubmVsIDw9IENBTElCX0lXTF9UWF9BVFRFTl9HUjFfTENIKQotCQlyZXR1cm4gQ0FMSUJfQ0hfR1JPVVBfMTsKLQotCWlmIChjaGFubmVsID49IENBTElCX0lXTF9UWF9BVFRFTl9HUjJfRkNIICYmCi0JICAgIGNoYW5uZWwgPD0gQ0FMSUJfSVdMX1RYX0FUVEVOX0dSMl9MQ0gpCi0JCXJldHVybiBDQUxJQl9DSF9HUk9VUF8yOwotCi0JaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSVdMX1RYX0FUVEVOX0dSM19GQ0ggJiYKLQkgICAgY2hhbm5lbCA8PSBDQUxJQl9JV0xfVFhfQVRURU5fR1IzX0xDSCkKLQkJcmV0dXJuIENBTElCX0NIX0dST1VQXzM7Ci0KLQlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JV0xfVFhfQVRURU5fR1I0X0ZDSCAmJgotCSAgICBjaGFubmVsIDw9IENBTElCX0lXTF9UWF9BVFRFTl9HUjRfTENIKQotCQlyZXR1cm4gQ0FMSUJfQ0hfR1JPVVBfNDsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdTMyIGl3bDQ5NjVfZ2V0X3N1Yl9iYW5kKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGNoYW5uZWwpCi17Ci0JczMyIGIgPSAtMTsKLQotCWZvciAoYiA9IDA7IGIgPCBFRVBST01fVFhfUE9XRVJfQkFORFM7IGIrKykgewotCQlpZiAocHJpdi0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW2JdLmNoX2Zyb20gPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgoY2hhbm5lbCA+PSBwcml2LT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bYl0uY2hfZnJvbSkKLQkJICAgICYmIChjaGFubmVsIDw9IHByaXYtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tiXS5jaF90bykpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYjsKLX0KLQotc3RhdGljIHMzMiBpd2w0OTY1X2ludGVycG9sYXRlX3ZhbHVlKHMzMiB4LCBzMzIgeDEsIHMzMiB5MSwgczMyIHgyLCBzMzIgeTIpCi17Ci0JczMyIHZhbDsKLQotCWlmICh4MiA9PSB4MSkKLQkJcmV0dXJuIHkxOwotCWVsc2UgewotCQlpd2w0OTY1X21hdGhfZGl2X3JvdW5kKCh4MiAtIHgpICogKHkxIC0geTIpLCAoeDIgLSB4MSksICZ2YWwpOwotCQlyZXR1cm4gdmFsICsgeTI7Ci0JfQotfQotCi0vKioKLSAqIGl3bDQ5NjVfaW50ZXJwb2xhdGVfY2hhbiAtIEludGVycG9sYXRlIGZhY3RvcnkgbWVhc3VyZW1lbnRzIGZvciBvbmUgY2hhbm5lbAotICoKLSAqIEludGVycG9sYXRlcyBmYWN0b3J5IG1lYXN1cmVtZW50cyBmcm9tIHRoZSB0d28gc2FtcGxlIGNoYW5uZWxzIHdpdGhpbiBhCi0gKiBzdWItYmFuZCwgdG8gYXBwbHkgdG8gY2hhbm5lbCBvZiBpbnRlcmVzdC4gIEludGVycG9sYXRpb24gaXMgcHJvcG9ydGlvbmFsIHRvCi0gKiBkaWZmZXJlbmNlcyBpbiBjaGFubmVsIGZyZXF1ZW5jaWVzLCB3aGljaCBpcyBwcm9wb3J0aW9uYWwgdG8gZGlmZmVyZW5jZXMKLSAqIGluIGNoYW5uZWwgbnVtYmVyLgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfaW50ZXJwb2xhdGVfY2hhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBjaGFubmVsLAotCQkJCSAgICBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9jaF9pbmZvICpjaGFuX2luZm8pCi17Ci0JczMyIHMgPSAtMTsKLQl1MzIgYzsKLQl1MzIgbTsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptMTsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptMjsKLQlzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICpvbWVhczsKLQl1MzIgY2hfaTE7Ci0JdTMyIGNoX2kyOwotCi0JcyA9IGl3bDQ5NjVfZ2V0X3N1Yl9iYW5kKHByaXYsIGNoYW5uZWwpOwotCWlmIChzID49IEVFUFJPTV9UWF9QT1dFUl9CQU5EUykgewotCQlJV0xfRVJSKHByaXYsICJUeCBQb3dlciBjYW4gbm90IGZpbmQgY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQljaF9pMSA9IHByaXYtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tzXS5jaDEuY2hfbnVtOwotCWNoX2kyID0gcHJpdi0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW3NdLmNoMi5jaF9udW07Ci0JY2hhbl9pbmZvLT5jaF9udW0gPSAodTgpIGNoYW5uZWw7Ci0KLQlJV0xfREVCVUdfVFhQT1dFUihwcml2LCAiY2hhbm5lbCAlZCBzdWJiYW5kICVkIGZhY3RvcnkgY2FsIGNoICVkICYgJWRcbiIsCi0JCQkgIGNoYW5uZWwsIHMsIGNoX2kxLCBjaF9pMik7Ci0KLQlmb3IgKGMgPSAwOyBjIDwgRUVQUk9NX1RYX1BPV0VSX1RYX0NIQUlOUzsgYysrKSB7Ci0JCWZvciAobSA9IDA7IG0gPCBFRVBST01fVFhfUE9XRVJfTUVBU1VSRU1FTlRTOyBtKyspIHsKLQkJCW0xID0gJihwcml2LT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gxLgotCQkJICAgICAgIG1lYXN1cmVtZW50c1tjXVttXSk7Ci0JCQltMiA9ICYocHJpdi0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW3NdLmNoMi4KLQkJCSAgICAgICBtZWFzdXJlbWVudHNbY11bbV0pOwotCQkJb21lYXMgPSAmKGNoYW5faW5mby0+bWVhc3VyZW1lbnRzW2NdW21dKTsKLQotCQkJb21lYXMtPmFjdHVhbF9wb3cgPQotCQkJICAgICh1OCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+YWN0dWFsX3BvdywKLQkJCQkJCQkgICBjaF9pMiwKLQkJCQkJCQkgICBtMi0+YWN0dWFsX3Bvdyk7Ci0JCQlvbWVhcy0+Z2Fpbl9pZHggPQotCQkJICAgICh1OCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+Z2Fpbl9pZHgsIGNoX2kyLAotCQkJCQkJCSAgIG0yLT5nYWluX2lkeCk7Ci0JCQlvbWVhcy0+dGVtcGVyYXR1cmUgPQotCQkJICAgICh1OCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+dGVtcGVyYXR1cmUsCi0JCQkJCQkJICAgY2hfaTIsCi0JCQkJCQkJICAgbTItPnRlbXBlcmF0dXJlKTsKLQkJCW9tZWFzLT5wYV9kZXQgPQotCQkJICAgIChzOCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+cGFfZGV0LCBjaF9pMiwKLQkJCQkJCQkgICBtMi0+cGFfZGV0KTsKLQotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCBBUDE9JWQgQVAyPSVkIEFQPSVkXG4iLCBjLCBtLAotCQkJCW0xLT5hY3R1YWxfcG93LCBtMi0+YWN0dWFsX3Bvdywgb21lYXMtPmFjdHVhbF9wb3cpOwotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCBOSTE9JWQgTkkyPSVkIE5JPSVkXG4iLCBjLCBtLAotCQkJCW0xLT5nYWluX2lkeCwgbTItPmdhaW5faWR4LCBvbWVhcy0+Z2Fpbl9pZHgpOwotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCBQQTE9JWQgUEEyPSVkIFBBPSVkXG4iLCBjLCBtLAotCQkJCW0xLT5wYV9kZXQsIG0yLT5wYV9kZXQsIG9tZWFzLT5wYV9kZXQpOwotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCAgVDE9JWQgIFQyPSVkICBUPSVkXG4iLCBjLCBtLAotCQkJCW0xLT50ZW1wZXJhdHVyZSwgbTItPnRlbXBlcmF0dXJlLAotCQkJCW9tZWFzLT50ZW1wZXJhdHVyZSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogYml0LXJhdGUtZGVwZW5kZW50IHRhYmxlIHRvIHByZXZlbnQgVHggZGlzdG9ydGlvbiwgaW4gaGFsZi1kQiB1bml0cywKLSAqIGZvciBPRkRNIDYsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDYwIE1CaXQsIGFuZCBDQ0sgYWxsIHJhdGVzLiAqLwotc3RhdGljIHMzMiBiYWNrX29mZl90YWJsZVtdID0gewotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDIwIE1IeiAqLwotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDIwIE1IeiAqLwotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDQwIE1IeiAqLwotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDQwIE1IeiAqLwotCTEwCQkJLyogQ0NLICovCi19OwotCi0vKiBUaGVybWFsIGNvbXBlbnNhdGlvbiB2YWx1ZXMgZm9yIHR4cG93ZXIgZm9yIHZhcmlvdXMgZnJlcXVlbmN5IHJhbmdlcyAuLi4KLSAqICAgcmF0aW9zIGZyb20gMzoxIHRvIDQuNToxIG9mIGRlZ3JlZXMgKENlbHNpdXMpIHBlciBoYWxmLWRCIGdhaW4gYWRqdXN0ICovCi1zdGF0aWMgc3RydWN0IGl3bDQ5NjVfdHhwb3dlcl9jb21wX2VudHJ5IHsKLQlzMzIgZGVncmVlc19wZXJfMDVkYl9hOwotCXMzMiBkZWdyZWVzX3Blcl8wNWRiX2FfZGVub207Ci19IHR4X3Bvd2VyX2NtcF90YmxlW0NBTElCX0NIX0dST1VQX01BWF0gPSB7Ci0JezksIDJ9LAkJCS8qIGdyb3VwIDAgNS4yLCBjaCAgMzQtNDMgKi8KLQl7NCwgMX0sCQkJLyogZ3JvdXAgMSA1LjIsIGNoICA0NC03MCAqLwotCXs0LCAxfSwJCQkvKiBncm91cCAyIDUuMiwgY2ggIDcxLTEyNCAqLwotCXs0LCAxfSwJCQkvKiBncm91cCAzIDUuMiwgY2ggMTI1LTIwMCAqLwotCXszLCAxfQkJCS8qIGdyb3VwIDQgMi40LCBjaCAgIGFsbCAqLwotfTsKLQotc3RhdGljIHMzMiBnZXRfbWluX3Bvd2VyX2luZGV4KHMzMiByYXRlX3Bvd2VyX2luZGV4LCB1MzIgYmFuZCkKLXsKLQlpZiAoIWJhbmQpIHsKLQkJaWYgKChyYXRlX3Bvd2VyX2luZGV4ICYgNykgPD0gNCkKLQkJCXJldHVybiBNSU5fVFhfR0FJTl9JTkRFWF81MkdIWl9FWFQ7Ci0JfQotCXJldHVybiBNSU5fVFhfR0FJTl9JTkRFWDsKLX0KLQotc3RydWN0IGdhaW5fZW50cnkgewotCXU4IGRzcDsKLQl1OCByYWRpbzsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2Fpbl9lbnRyeSBnYWluX3RhYmxlWzJdWzEwOF0gPSB7Ci0JLyogNS4yR0h6IHBvd2VyIGdhaW4gaW5kZXggdGFibGUgKi8KLQl7Ci0JIHsxMjMsIDB4M0Z9LAkJLyogaGlnaGVzdCB0eHBvd2VyICovCi0JIHsxMTcsIDB4M0Z9LAotCSB7MTEwLCAweDNGfSwKLQkgezEwNCwgMHgzRn0sCi0JIHs5OCwgMHgzRn0sCi0JIHsxMTAsIDB4M0V9LAotCSB7MTA0LCAweDNFfSwKLQkgezk4LCAweDNFfSwKLQkgezExMCwgMHgzRH0sCi0JIHsxMDQsIDB4M0R9LAotCSB7OTgsIDB4M0R9LAotCSB7MTEwLCAweDNDfSwKLQkgezEwNCwgMHgzQ30sCi0JIHs5OCwgMHgzQ30sCi0JIHsxMTAsIDB4M0J9LAotCSB7MTA0LCAweDNCfSwKLQkgezk4LCAweDNCfSwKLQkgezExMCwgMHgzQX0sCi0JIHsxMDQsIDB4M0F9LAotCSB7OTgsIDB4M0F9LAotCSB7MTEwLCAweDM5fSwKLQkgezEwNCwgMHgzOX0sCi0JIHs5OCwgMHgzOX0sCi0JIHsxMTAsIDB4Mzh9LAotCSB7MTA0LCAweDM4fSwKLQkgezk4LCAweDM4fSwKLQkgezExMCwgMHgzN30sCi0JIHsxMDQsIDB4Mzd9LAotCSB7OTgsIDB4Mzd9LAotCSB7MTEwLCAweDM2fSwKLQkgezEwNCwgMHgzNn0sCi0JIHs5OCwgMHgzNn0sCi0JIHsxMTAsIDB4MzV9LAotCSB7MTA0LCAweDM1fSwKLQkgezk4LCAweDM1fSwKLQkgezExMCwgMHgzNH0sCi0JIHsxMDQsIDB4MzR9LAotCSB7OTgsIDB4MzR9LAotCSB7MTEwLCAweDMzfSwKLQkgezEwNCwgMHgzM30sCi0JIHs5OCwgMHgzM30sCi0JIHsxMTAsIDB4MzJ9LAotCSB7MTA0LCAweDMyfSwKLQkgezk4LCAweDMyfSwKLQkgezExMCwgMHgzMX0sCi0JIHsxMDQsIDB4MzF9LAotCSB7OTgsIDB4MzF9LAotCSB7MTEwLCAweDMwfSwKLQkgezEwNCwgMHgzMH0sCi0JIHs5OCwgMHgzMH0sCi0JIHsxMTAsIDB4MjV9LAotCSB7MTA0LCAweDI1fSwKLQkgezk4LCAweDI1fSwKLQkgezExMCwgMHgyNH0sCi0JIHsxMDQsIDB4MjR9LAotCSB7OTgsIDB4MjR9LAotCSB7MTEwLCAweDIzfSwKLQkgezEwNCwgMHgyM30sCi0JIHs5OCwgMHgyM30sCi0JIHsxMTAsIDB4MjJ9LAotCSB7MTA0LCAweDE4fSwKLQkgezk4LCAweDE4fSwKLQkgezExMCwgMHgxN30sCi0JIHsxMDQsIDB4MTd9LAotCSB7OTgsIDB4MTd9LAotCSB7MTEwLCAweDE2fSwKLQkgezEwNCwgMHgxNn0sCi0JIHs5OCwgMHgxNn0sCi0JIHsxMTAsIDB4MTV9LAotCSB7MTA0LCAweDE1fSwKLQkgezk4LCAweDE1fSwKLQkgezExMCwgMHgxNH0sCi0JIHsxMDQsIDB4MTR9LAotCSB7OTgsIDB4MTR9LAotCSB7MTEwLCAweDEzfSwKLQkgezEwNCwgMHgxM30sCi0JIHs5OCwgMHgxM30sCi0JIHsxMTAsIDB4MTJ9LAotCSB7MTA0LCAweDA4fSwKLQkgezk4LCAweDA4fSwKLQkgezExMCwgMHgwN30sCi0JIHsxMDQsIDB4MDd9LAotCSB7OTgsIDB4MDd9LAotCSB7MTEwLCAweDA2fSwKLQkgezEwNCwgMHgwNn0sCi0JIHs5OCwgMHgwNn0sCi0JIHsxMTAsIDB4MDV9LAotCSB7MTA0LCAweDA1fSwKLQkgezk4LCAweDA1fSwKLQkgezExMCwgMHgwNH0sCi0JIHsxMDQsIDB4MDR9LAotCSB7OTgsIDB4MDR9LAotCSB7MTEwLCAweDAzfSwKLQkgezEwNCwgMHgwM30sCi0JIHs5OCwgMHgwM30sCi0JIHsxMTAsIDB4MDJ9LAotCSB7MTA0LCAweDAyfSwKLQkgezk4LCAweDAyfSwKLQkgezExMCwgMHgwMX0sCi0JIHsxMDQsIDB4MDF9LAotCSB7OTgsIDB4MDF9LAotCSB7MTEwLCAweDAwfSwKLQkgezEwNCwgMHgwMH0sCi0JIHs5OCwgMHgwMH0sCi0JIHs5MywgMHgwMH0sCi0JIHs4OCwgMHgwMH0sCi0JIHs4MywgMHgwMH0sCi0JIHs3OCwgMHgwMH0sCi0JIH0sCi0JLyogMi40R0h6IHBvd2VyIGdhaW4gaW5kZXggdGFibGUgKi8KLQl7Ci0JIHsxMTAsIDB4M2Z9LAkJLyogaGlnaGVzdCB0eHBvd2VyICovCi0JIHsxMDQsIDB4M2Z9LAotCSB7OTgsIDB4M2Z9LAotCSB7MTEwLCAweDNlfSwKLQkgezEwNCwgMHgzZX0sCi0JIHs5OCwgMHgzZX0sCi0JIHsxMTAsIDB4M2R9LAotCSB7MTA0LCAweDNkfSwKLQkgezk4LCAweDNkfSwKLQkgezExMCwgMHgzY30sCi0JIHsxMDQsIDB4M2N9LAotCSB7OTgsIDB4M2N9LAotCSB7MTEwLCAweDNifSwKLQkgezEwNCwgMHgzYn0sCi0JIHs5OCwgMHgzYn0sCi0JIHsxMTAsIDB4M2F9LAotCSB7MTA0LCAweDNhfSwKLQkgezk4LCAweDNhfSwKLQkgezExMCwgMHgzOX0sCi0JIHsxMDQsIDB4Mzl9LAotCSB7OTgsIDB4Mzl9LAotCSB7MTEwLCAweDM4fSwKLQkgezEwNCwgMHgzOH0sCi0JIHs5OCwgMHgzOH0sCi0JIHsxMTAsIDB4Mzd9LAotCSB7MTA0LCAweDM3fSwKLQkgezk4LCAweDM3fSwKLQkgezExMCwgMHgzNn0sCi0JIHsxMDQsIDB4MzZ9LAotCSB7OTgsIDB4MzZ9LAotCSB7MTEwLCAweDM1fSwKLQkgezEwNCwgMHgzNX0sCi0JIHs5OCwgMHgzNX0sCi0JIHsxMTAsIDB4MzR9LAotCSB7MTA0LCAweDM0fSwKLQkgezk4LCAweDM0fSwKLQkgezExMCwgMHgzM30sCi0JIHsxMDQsIDB4MzN9LAotCSB7OTgsIDB4MzN9LAotCSB7MTEwLCAweDMyfSwKLQkgezEwNCwgMHgzMn0sCi0JIHs5OCwgMHgzMn0sCi0JIHsxMTAsIDB4MzF9LAotCSB7MTA0LCAweDMxfSwKLQkgezk4LCAweDMxfSwKLQkgezExMCwgMHgzMH0sCi0JIHsxMDQsIDB4MzB9LAotCSB7OTgsIDB4MzB9LAotCSB7MTEwLCAweDZ9LAotCSB7MTA0LCAweDZ9LAotCSB7OTgsIDB4Nn0sCi0JIHsxMTAsIDB4NX0sCi0JIHsxMDQsIDB4NX0sCi0JIHs5OCwgMHg1fSwKLQkgezExMCwgMHg0fSwKLQkgezEwNCwgMHg0fSwKLQkgezk4LCAweDR9LAotCSB7MTEwLCAweDN9LAotCSB7MTA0LCAweDN9LAotCSB7OTgsIDB4M30sCi0JIHsxMTAsIDB4Mn0sCi0JIHsxMDQsIDB4Mn0sCi0JIHs5OCwgMHgyfSwKLQkgezExMCwgMHgxfSwKLQkgezEwNCwgMHgxfSwKLQkgezk4LCAweDF9LAotCSB7MTEwLCAweDB9LAotCSB7MTA0LCAweDB9LAotCSB7OTgsIDB4MH0sCi0JIHs5NywgMH0sCi0JIHs5NiwgMH0sCi0JIHs5NSwgMH0sCi0JIHs5NCwgMH0sCi0JIHs5MywgMH0sCi0JIHs5MiwgMH0sCi0JIHs5MSwgMH0sCi0JIHs5MCwgMH0sCi0JIHs4OSwgMH0sCi0JIHs4OCwgMH0sCi0JIHs4NywgMH0sCi0JIHs4NiwgMH0sCi0JIHs4NSwgMH0sCi0JIHs4NCwgMH0sCi0JIHs4MywgMH0sCi0JIHs4MiwgMH0sCi0JIHs4MSwgMH0sCi0JIHs4MCwgMH0sCi0JIHs3OSwgMH0sCi0JIHs3OCwgMH0sCi0JIHs3NywgMH0sCi0JIHs3NiwgMH0sCi0JIHs3NSwgMH0sCi0JIHs3NCwgMH0sCi0JIHs3MywgMH0sCi0JIHs3MiwgMH0sCi0JIHs3MSwgMH0sCi0JIHs3MCwgMH0sCi0JIHs2OSwgMH0sCi0JIHs2OCwgMH0sCi0JIHs2NywgMH0sCi0JIHs2NiwgMH0sCi0JIHs2NSwgMH0sCi0JIHs2NCwgMH0sCi0JIHs2MywgMH0sCi0JIHs2MiwgMH0sCi0JIHs2MSwgMH0sCi0JIHs2MCwgMH0sCi0JIHs1OSwgMH0sCi0JIH0KLX07Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9maWxsX3R4cG93ZXJfdGJsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYmFuZCwgdTE2IGNoYW5uZWwsCi0JCQkJICAgIHU4IGlzX2h0NDAsIHU4IGN0cmxfY2hhbl9oaWdoLAotCQkJCSAgICBzdHJ1Y3QgaXdsNDk2NV90eF9wb3dlcl9kYiAqdHhfcG93ZXJfdGJsKQotewotCXU4IHNhdHVyYXRpb25fcG93ZXI7Ci0JczMyIHRhcmdldF9wb3dlcjsKLQlzMzIgdXNlcl90YXJnZXRfcG93ZXI7Ci0JczMyIHBvd2VyX2xpbWl0OwotCXMzMiBjdXJyZW50X3RlbXA7Ci0JczMyIHJlZ19saW1pdDsKLQlzMzIgY3VycmVudF9yZWd1bGF0b3J5OwotCXMzMiB0eGF0dGVuX2dycCA9IENBTElCX0NIX0dST1VQX01BWDsKLQlpbnQgaTsKLQlpbnQgYzsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaF9lZXByb21faW5mbzsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptZWFzdXJlbWVudDsKLQlzMTYgdm9sdGFnZTsKLQlzMzIgaW5pdF92b2x0YWdlOwotCXMzMiB2b2x0YWdlX2NvbXBlbnNhdGlvbjsKLQlzMzIgZGVncmVlc19wZXJfMDVkYl9udW07Ci0JczMyIGRlZ3JlZXNfcGVyXzA1ZGJfZGVub207Ci0JczMyIGZhY3RvcnlfdGVtcDsKLQlzMzIgdGVtcGVyYXR1cmVfY29tcFsyXTsKLQlzMzIgZmFjdG9yeV9nYWluX2luZGV4WzJdOwotCXMzMiBmYWN0b3J5X2FjdHVhbF9wd3JbMl07Ci0JczMyIHBvd2VyX2luZGV4OwotCi0JLyogdHhfcG93ZXJfdXNlcl9sbXQgaXMgaW4gZEJtLCBjb252ZXJ0IHRvIGhhbGYtZEJtIChoYWxmLWRCIHVuaXRzCi0JICogICBhcmUgdXNlZCBmb3IgaW5kZXhpbmcgaW50byB0eHBvd2VyIHRhYmxlKSAqLwotCXVzZXJfdGFyZ2V0X3Bvd2VyID0gMiAqIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10OwotCi0JLyogR2V0IGN1cnJlbnQgKFJYT04pIGNoYW5uZWwsIGJhbmQsIHdpZHRoICovCi0JSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYW4gJWQgYmFuZCAlZCBpc19odDQwICVkXG4iLCBjaGFubmVsLCBiYW5kLAotCQkJICBpc19odDQwKTsKLQotCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgcHJpdi0+YmFuZCwgY2hhbm5lbCk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBnZXQgdHhhdHRlbiBncm91cCwgdXNlZCB0byBzZWxlY3QgMSkgdGhlcm1hbCB0eHBvd2VyIGFkanVzdG1lbnQKLQkgKiAgIGFuZCAyKSBtaW1vIHR4cG93ZXIgYmFsYW5jZSBiZXR3ZWVuIFR4IGNoYWlucy4gKi8KLQl0eGF0dGVuX2dycCA9IGl3bDQ5NjVfZ2V0X3R4X2F0dGVuX2dycChjaGFubmVsKTsKLQlpZiAodHhhdHRlbl9ncnAgPCAwKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbid0IGZpbmQgdHhhdHRlbiBncm91cCBmb3IgY2hhbm5lbCAlZC5cbiIsCi0JCQkgIGNoYW5uZWwpOwotCQlyZXR1cm4gdHhhdHRlbl9ncnA7Ci0JfQotCi0JSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYW5uZWwgJWQgYmVsb25ncyB0byB0eGF0dGVuIGdyb3VwICVkXG4iLAotCQkJICBjaGFubmVsLCB0eGF0dGVuX2dycCk7Ci0KLQlpZiAoaXNfaHQ0MCkgewotCQlpZiAoY3RybF9jaGFuX2hpZ2gpCi0JCQljaGFubmVsIC09IDI7Ci0JCWVsc2UKLQkJCWNoYW5uZWwgKz0gMjsKLQl9Ci0KLQkvKiBoYXJkd2FyZSB0eHBvd2VyIGxpbWl0cyAuLi4KLQkgKiBzYXR1cmF0aW9uIChjbGlwcGluZyBkaXN0b3J0aW9uKSB0eHBvd2VycyBhcmUgaW4gaGFsZi1kQm0gKi8KLQlpZiAoYmFuZCkKLQkJc2F0dXJhdGlvbl9wb3dlciA9IHByaXYtPmNhbGliX2luZm8tPnNhdHVyYXRpb25fcG93ZXIyNDsKLQllbHNlCi0JCXNhdHVyYXRpb25fcG93ZXIgPSBwcml2LT5jYWxpYl9pbmZvLT5zYXR1cmF0aW9uX3Bvd2VyNTI7Ci0KLQlpZiAoc2F0dXJhdGlvbl9wb3dlciA8IElXTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01JTiB8fAotCSAgICBzYXR1cmF0aW9uX3Bvd2VyID4gSVdMX1RYX1BPV0VSX1NBVFVSQVRJT05fTUFYKSB7Ci0JCWlmIChiYW5kKQotCQkJc2F0dXJhdGlvbl9wb3dlciA9IElXTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fMjQ7Ci0JCWVsc2UKLQkJCXNhdHVyYXRpb25fcG93ZXIgPSBJV0xfVFhfUE9XRVJfREVGQVVMVF9TQVRVUkFUSU9OXzUyOwotCX0KLQotCS8qIHJlZ3VsYXRvcnkgdHhwb3dlciBsaW1pdHMgLi4uIHJlZ19saW1pdCB2YWx1ZXMgYXJlIGluIGhhbGYtZEJtLAotCSAqICAgbWF4X3Bvd2VyX2F2ZyB2YWx1ZXMgYXJlIGluIGRCbSwgY29udmVydCAqIDIgKi8KLQlpZiAoaXNfaHQ0MCkKLQkJcmVnX2xpbWl0ID0gY2hfaW5mby0+aHQ0MF9tYXhfcG93ZXJfYXZnICogMjsKLQllbHNlCi0JCXJlZ19saW1pdCA9IGNoX2luZm8tPm1heF9wb3dlcl9hdmcgKiAyOwotCi0JaWYgKChyZWdfbGltaXQgPCBJV0xfVFhfUE9XRVJfUkVHVUxBVE9SWV9NSU4pIHx8Ci0JICAgIChyZWdfbGltaXQgPiBJV0xfVFhfUE9XRVJfUkVHVUxBVE9SWV9NQVgpKSB7Ci0JCWlmIChiYW5kKQotCQkJcmVnX2xpbWl0ID0gSVdMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV8yNDsKLQkJZWxzZQotCQkJcmVnX2xpbWl0ID0gSVdMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV81MjsKLQl9Ci0KLQkvKiBJbnRlcnBvbGF0ZSB0eHBvd2VyIGNhbGlicmF0aW9uIHZhbHVlcyBmb3IgdGhpcyBjaGFubmVsLAotCSAqICAgYmFzZWQgb24gZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZXN0cyBvbiBzcGFjZWQgY2hhbm5lbHMuICovCi0JaXdsNDk2NV9pbnRlcnBvbGF0ZV9jaGFuKHByaXYsIGNoYW5uZWwsICZjaF9lZXByb21faW5mbyk7Ci0KLQkvKiBjYWxjdWxhdGUgdHggZ2FpbiBhZGp1c3RtZW50IGJhc2VkIG9uIHBvd2VyIHN1cHBseSB2b2x0YWdlICovCi0Jdm9sdGFnZSA9IGxlMTZfdG9fY3B1KHByaXYtPmNhbGliX2luZm8tPnZvbHRhZ2UpOwotCWluaXRfdm9sdGFnZSA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnZvbHRhZ2UpOwotCXZvbHRhZ2VfY29tcGVuc2F0aW9uID0KLQkgICAgaXdsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24odm9sdGFnZSwgaW5pdF92b2x0YWdlKTsKLQotCUlXTF9ERUJVR19UWFBPV0VSKHByaXYsICJjdXJyIHZvbHQgJWQgZWVwcm9tIHZvbHQgJWQgdm9sdCBjb21wICVkXG4iLAotCQkJICBpbml0X3ZvbHRhZ2UsCi0JCQkgIHZvbHRhZ2UsIHZvbHRhZ2VfY29tcGVuc2F0aW9uKTsKLQotCS8qIGdldCBjdXJyZW50IHRlbXBlcmF0dXJlIChDZWxzaXVzKSAqLwotCWN1cnJlbnRfdGVtcCA9IG1heChwcml2LT50ZW1wZXJhdHVyZSwgSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01JTik7Ci0JY3VycmVudF90ZW1wID0gbWluKHByaXYtPnRlbXBlcmF0dXJlLCBJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUFYKTsKLQljdXJyZW50X3RlbXAgPSBLRUxWSU5fVE9fQ0VMU0lVUyhjdXJyZW50X3RlbXApOwotCi0JLyogc2VsZWN0IHRoZXJtYWwgdHhwb3dlciBhZGp1c3RtZW50IHBhcmFtcywgYmFzZWQgb24gY2hhbm5lbCBncm91cAotCSAqICAgKHNhbWUgZnJlcXVlbmN5IGdyb3VwIHVzZWQgZm9yIG1pbW8gdHhhdHRlbiBhZGp1c3RtZW50KSAqLwotCWRlZ3JlZXNfcGVyXzA1ZGJfbnVtID0KLQkgICAgdHhfcG93ZXJfY21wX3RibGVbdHhhdHRlbl9ncnBdLmRlZ3JlZXNfcGVyXzA1ZGJfYTsKLQlkZWdyZWVzX3Blcl8wNWRiX2Rlbm9tID0KLQkgICAgdHhfcG93ZXJfY21wX3RibGVbdHhhdHRlbl9ncnBdLmRlZ3JlZXNfcGVyXzA1ZGJfYV9kZW5vbTsKLQotCS8qIGdldCBwZXItY2hhaW4gdHhwb3dlciB2YWx1ZXMgZnJvbSBmYWN0b3J5IG1lYXN1cmVtZW50cyAqLwotCWZvciAoYyA9IDA7IGMgPCAyOyBjKyspIHsKLQkJbWVhc3VyZW1lbnQgPSAmY2hfZWVwcm9tX2luZm8ubWVhc3VyZW1lbnRzW2NdWzFdOwotCi0JCS8qIHR4Z2FpbiBhZGp1c3RtZW50IChpbiBoYWxmLWRCIHN0ZXBzKSBiYXNlZCBvbiBkaWZmZXJlbmNlCi0JCSAqICAgYmV0d2VlbiBmYWN0b3J5IGFuZCBjdXJyZW50IHRlbXBlcmF0dXJlICovCi0JCWZhY3RvcnlfdGVtcCA9IG1lYXN1cmVtZW50LT50ZW1wZXJhdHVyZTsKLQkJaXdsNDk2NV9tYXRoX2Rpdl9yb3VuZCgoY3VycmVudF90ZW1wIC0gZmFjdG9yeV90ZW1wKSAqCi0JCQkJICAgICAgIGRlZ3JlZXNfcGVyXzA1ZGJfZGVub20sCi0JCQkJICAgICAgIGRlZ3JlZXNfcGVyXzA1ZGJfbnVtLAotCQkJCSAgICAgICAmdGVtcGVyYXR1cmVfY29tcFtjXSk7Ci0KLQkJZmFjdG9yeV9nYWluX2luZGV4W2NdID0gbWVhc3VyZW1lbnQtPmdhaW5faWR4OwotCQlmYWN0b3J5X2FjdHVhbF9wd3JbY10gPSBtZWFzdXJlbWVudC0+YWN0dWFsX3BvdzsKLQotCQlJV0xfREVCVUdfVFhQT1dFUihwcml2LCAiY2hhaW4gPSAlZFxuIiwgYyk7Ci0JCUlXTF9ERUJVR19UWFBPV0VSKHByaXYsICJmY3RyeSB0bXAgJWQsICIKLQkJCQkgICJjdXJyIHRtcCAlZCwgY29tcCAlZCBzdGVwc1xuIiwKLQkJCQkgIGZhY3RvcnlfdGVtcCwgY3VycmVudF90ZW1wLAotCQkJCSAgdGVtcGVyYXR1cmVfY29tcFtjXSk7Ci0KLQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImZjdHJ5IGlkeCAlZCwgZmN0cnkgcHdyICVkXG4iLAotCQkJCSAgZmFjdG9yeV9nYWluX2luZGV4W2NdLAotCQkJCSAgZmFjdG9yeV9hY3R1YWxfcHdyW2NdKTsKLQl9Ci0KLQkvKiBmb3IgZWFjaCBvZiAzMyBiaXQtcmF0ZXMgKGluY2x1ZGluZyAxIGZvciBDQ0spICovCi0JZm9yIChpID0gMDsgaSA8IFBPV0VSX1RBQkxFX05VTV9FTlRSSUVTOyBpKyspIHsKLQkJdTggaXNfbWltb19yYXRlOwotCQl1bmlvbiBpd2w0OTY1X3R4X3Bvd2VyX2R1YWxfc3RyZWFtIHR4X3Bvd2VyOwotCi0JCS8qIGZvciBtaW1vLCByZWR1Y2UgZWFjaCBjaGFpbidzIHR4cG93ZXIgYnkgaGFsZgotCQkgKiAoM2RCLCA2IHN0ZXBzKSwgc28gdG90YWwgb3V0cHV0IHBvd2VyIGlzIHJlZ3VsYXRvcnkKLQkJICogY29tcGxpYW50LiAqLwotCQlpZiAoaSAmIDB4OCkgewotCQkJY3VycmVudF9yZWd1bGF0b3J5ID0gcmVnX2xpbWl0IC0KLQkJCSAgICBJV0xfVFhfUE9XRVJfTUlNT19SRUdVTEFUT1JZX0NPTVBFTlNBVElPTjsKLQkJCWlzX21pbW9fcmF0ZSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQljdXJyZW50X3JlZ3VsYXRvcnkgPSByZWdfbGltaXQ7Ci0JCQlpc19taW1vX3JhdGUgPSAwOwotCQl9Ci0KLQkJLyogZmluZCB0eHBvd2VyIGxpbWl0LCBlaXRoZXIgaGFyZHdhcmUgb3IgcmVndWxhdG9yeSAqLwotCQlwb3dlcl9saW1pdCA9IHNhdHVyYXRpb25fcG93ZXIgLSBiYWNrX29mZl90YWJsZVtpXTsKLQkJaWYgKHBvd2VyX2xpbWl0ID4gY3VycmVudF9yZWd1bGF0b3J5KQotCQkJcG93ZXJfbGltaXQgPSBjdXJyZW50X3JlZ3VsYXRvcnk7Ci0KLQkJLyogcmVkdWNlIHVzZXIncyB0eHBvd2VyIHJlcXVlc3QgaWYgbmVjZXNzYXJ5Ci0JCSAqIGZvciB0aGlzIHJhdGUgb24gdGhpcyBjaGFubmVsICovCi0JCXRhcmdldF9wb3dlciA9IHVzZXJfdGFyZ2V0X3Bvd2VyOwotCQlpZiAodGFyZ2V0X3Bvd2VyID4gcG93ZXJfbGltaXQpCi0JCQl0YXJnZXRfcG93ZXIgPSBwb3dlcl9saW1pdDsKLQotCQlJV0xfREVCVUdfVFhQT1dFUihwcml2LCAicmF0ZSAlZCBzYXQgJWQgcmVnICVkIHVzciAlZCB0Z3QgJWRcbiIsCi0JCQkJICBpLCBzYXR1cmF0aW9uX3Bvd2VyIC0gYmFja19vZmZfdGFibGVbaV0sCi0JCQkJICBjdXJyZW50X3JlZ3VsYXRvcnksIHVzZXJfdGFyZ2V0X3Bvd2VyLAotCQkJCSAgdGFyZ2V0X3Bvd2VyKTsKLQotCQkvKiBmb3IgZWFjaCBvZiAyIFR4IGNoYWlucyAocmFkaW8gdHJhbnNtaXR0ZXJzKSAqLwotCQlmb3IgKGMgPSAwOyBjIDwgMjsgYysrKSB7Ci0JCQlzMzIgYXR0ZW5fdmFsdWU7Ci0KLQkJCWlmIChpc19taW1vX3JhdGUpCi0JCQkJYXR0ZW5fdmFsdWUgPQotCQkJCSAgICAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC4KLQkJCQkgICAgdHhfYXR0ZW5bdHhhdHRlbl9ncnBdW2NdKTsKLQkJCWVsc2UKLQkJCQlhdHRlbl92YWx1ZSA9IDA7Ci0KLQkJCS8qIGNhbGN1bGF0ZSBpbmRleDsgaGlnaGVyIGluZGV4IG1lYW5zIGxvd2VyIHR4cG93ZXIgKi8KLQkJCXBvd2VyX2luZGV4ID0gKHU4KSAoZmFjdG9yeV9nYWluX2luZGV4W2NdIC0KLQkJCQkJICAgICh0YXJnZXRfcG93ZXIgLQotCQkJCQkgICAgIGZhY3RvcnlfYWN0dWFsX3B3cltjXSkgLQotCQkJCQkgICAgdGVtcGVyYXR1cmVfY29tcFtjXSAtCi0JCQkJCSAgICB2b2x0YWdlX2NvbXBlbnNhdGlvbiArCi0JCQkJCSAgICBhdHRlbl92YWx1ZSk7Ci0KLS8qCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNhbGN1bGF0ZWQgdHhwb3dlciBpbmRleCAlZFxuIiwKLQkJCQkJCXBvd2VyX2luZGV4KTsgKi8KLQotCQkJaWYgKHBvd2VyX2luZGV4IDwgZ2V0X21pbl9wb3dlcl9pbmRleChpLCBiYW5kKSkKLQkJCQlwb3dlcl9pbmRleCA9IGdldF9taW5fcG93ZXJfaW5kZXgoaSwgYmFuZCk7Ci0KLQkJCS8qIGFkanVzdCA1IEdIeiBpbmRleCB0byBzdXBwb3J0IG5lZ2F0aXZlIGluZGV4ZXMgKi8KLQkJCWlmICghYmFuZCkKLQkJCQlwb3dlcl9pbmRleCArPSA5OwotCi0JCQkvKiBDQ0ssIHJhdGUgMzIsIHJlZHVjZSB0eHBvd2VyIGZvciBDQ0sgKi8KLQkJCWlmIChpID09IFBPV0VSX1RBQkxFX0NDS19FTlRSWSkKLQkJCQlwb3dlcl9pbmRleCArPQotCQkJCSAgICBJV0xfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9DX1NURVA7Ci0KLQkJCS8qIHN0YXkgd2l0aGluIHRoZSB0YWJsZSEgKi8KLQkJCWlmIChwb3dlcl9pbmRleCA+IDEwNykgewotCQkJCUlXTF9XQVJOKHByaXYsICJ0eHBvd2VyIGluZGV4ICVkID4gMTA3XG4iLAotCQkJCQkgICAgcG93ZXJfaW5kZXgpOwotCQkJCXBvd2VyX2luZGV4ID0gMTA3OwotCQkJfQotCQkJaWYgKHBvd2VyX2luZGV4IDwgMCkgewotCQkJCUlXTF9XQVJOKHByaXYsICJ0eHBvd2VyIGluZGV4ICVkIDwgMFxuIiwKLQkJCQkJICAgIHBvd2VyX2luZGV4KTsKLQkJCQlwb3dlcl9pbmRleCA9IDA7Ci0JCQl9Ci0KLQkJCS8qIGZpbGwgdHhwb3dlciBjb21tYW5kIGZvciB0aGlzIHJhdGUvY2hhaW4gKi8KLQkJCXR4X3Bvd2VyLnMucmFkaW9fdHhfZ2FpbltjXSA9Ci0JCQkJZ2Fpbl90YWJsZVtiYW5kXVtwb3dlcl9pbmRleF0ucmFkaW87Ci0JCQl0eF9wb3dlci5zLmRzcF9wcmVkaXNfYXR0ZW5bY10gPQotCQkJCWdhaW5fdGFibGVbYmFuZF1bcG93ZXJfaW5kZXhdLmRzcDsKLQotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYWluICVkIG1pbW8gJWQgaW5kZXggJWQgIgotCQkJCQkgICJnYWluIDB4JTAyeCBkc3AgJWRcbiIsCi0JCQkJCSAgYywgYXR0ZW5fdmFsdWUsIHBvd2VyX2luZGV4LAotCQkJCQl0eF9wb3dlci5zLnJhZGlvX3R4X2dhaW5bY10sCi0JCQkJCXR4X3Bvd2VyLnMuZHNwX3ByZWRpc19hdHRlbltjXSk7Ci0JCX0gLyogZm9yIGVhY2ggY2hhaW4gKi8KLQotCQl0eF9wb3dlcl90YmwtPnBvd2VyX3RibFtpXS5kdyA9IGNwdV90b19sZTMyKHR4X3Bvd2VyLmR3KTsKLQotCX0gLyogZm9yIGVhY2ggcmF0ZSAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9zZW5kX3R4X3Bvd2VyIC0gQ29uZmlndXJlIHRoZSBUWFBPV0VSIGxldmVsIHVzZXIgbGltaXQKLSAqCi0gKiBVc2VzIHRoZSBhY3RpdmUgUlhPTiBmb3IgY2hhbm5lbCwgYmFuZCwgYW5kIGNoYXJhY3RlcmlzdGljcyAoaHQ0MCwgaGlnaCkKLSAqIFRoZSBwb3dlciBsaW1pdCBpcyB0YWtlbiBmcm9tIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10LgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bDQ5NjVfdHhwb3dlcnRhYmxlX2NtZCBjbWQgPSB7IDAgfTsKLQlpbnQgcmV0OwotCXU4IGJhbmQgPSAwOwotCWJvb2wgaXNfaHQ0MCA9IGZhbHNlOwotCXU4IGN0cmxfY2hhbl9oaWdoID0gMDsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JaWYgKFdBUk5fT05DRSh0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyksCi0JCSAgICAgICJUWCBQb3dlciByZXF1ZXN0ZWQgd2hpbGUgc2Nhbm5pbmchXG4iKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQliYW5kID0gcHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haOwotCi0JaXNfaHQ0MCA9IGl3NDk2NV9pc19odDQwX2NoYW5uZWwoY3R4LT5hY3RpdmUuZmxhZ3MpOwotCi0JaWYgKGlzX2h0NDAgJiYgKGN0eC0+YWN0aXZlLmZsYWdzICYgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0spKQotCQljdHJsX2NoYW5faGlnaCA9IDE7Ci0KLQljbWQuYmFuZCA9IGJhbmQ7Ci0JY21kLmNoYW5uZWwgPSBjdHgtPmFjdGl2ZS5jaGFubmVsOwotCi0JcmV0ID0gaXdsNDk2NV9maWxsX3R4cG93ZXJfdGJsKHByaXYsIGJhbmQsCi0JCQkJbGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCksCi0JCQkJaXNfaHQ0MCwgY3RybF9jaGFuX2hpZ2gsICZjbWQudHhfcG93ZXIpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwKLQkJCSBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELCBzaXplb2YoY21kKSwgJmNtZCk7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2VuZF9yeG9uX2Fzc29jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBpd2w0OTY1X3J4b25fYXNzb2NfY21kIHJ4b25fYXNzb2M7Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24xID0gJmN0eC0+c3RhZ2luZzsKLQljb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqcnhvbjIgPSAmY3R4LT5hY3RpdmU7Ci0KLQlpZiAoKHJ4b24xLT5mbGFncyA9PSByeG9uMi0+ZmxhZ3MpICYmCi0JICAgIChyeG9uMS0+ZmlsdGVyX2ZsYWdzID09IHJ4b24yLT5maWx0ZXJfZmxhZ3MpICYmCi0JICAgIChyeG9uMS0+Y2NrX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5jY2tfYmFzaWNfcmF0ZXMpICYmCi0JICAgIChyeG9uMS0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzID09Ci0JICAgICByeG9uMi0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzKSAmJgotCSAgICAocnhvbjEtPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPT0KLQkgICAgIHJ4b24yLT5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzKSAmJgotCSAgICAocnhvbjEtPnJ4X2NoYWluID09IHJ4b24yLT5yeF9jaGFpbikgJiYKLQkgICAgKHJ4b24xLT5vZmRtX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5vZmRtX2Jhc2ljX3JhdGVzKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVXNpbmcgY3VycmVudCBSWE9OX0FTU09DLiAgTm90IHJlc2VuZGluZy5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyeG9uX2Fzc29jLmZsYWdzID0gY3R4LT5zdGFnaW5nLmZsYWdzOwotCXJ4b25fYXNzb2MuZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKLQlyeG9uX2Fzc29jLm9mZG1fYmFzaWNfcmF0ZXMgPSBjdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlczsKLQlyeG9uX2Fzc29jLmNja19iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXM7Ci0Jcnhvbl9hc3NvYy5yZXNlcnZlZCA9IDA7Ci0Jcnhvbl9hc3NvYy5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPQotCSAgICBjdHgtPnN0YWdpbmcub2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXJ4b25fYXNzb2Mub2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyA9Ci0JICAgIGN0eC0+c3RhZ2luZy5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXJ4b25fYXNzb2MucnhfY2hhaW5fc2VsZWN0X2ZsYWdzID0gY3R4LT5zdGFnaW5nLnJ4X2NoYWluOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMocHJpdiwgUkVQTFlfUlhPTl9BU1NPQywKLQkJCQkgICAgIHNpemVvZihyeG9uX2Fzc29jKSwgJnJ4b25fYXNzb2MsIE5VTEwpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X2NvbW1pdF9yeG9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQkvKiBjYXN0IGF3YXkgdGhlIGNvbnN0IGZvciBhY3RpdmVfcnhvbiBpbiB0aGlzIGZ1bmN0aW9uICovCi0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKmFjdGl2ZV9yeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7Ci0JaW50IHJldDsKLQlib29sIG5ld19hc3NvYyA9Ci0JCSEhKGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKCFjdHgtPmlzX2FjdGl2ZSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBhbHdheXMgZ2V0IHRpbWVzdGFtcCB3aXRoIFJ4IGZyYW1lICovCi0JY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKLQotCXJldCA9IGl3bF9sZWdhY3lfY2hlY2tfcnhvbl9jbWQocHJpdiwgY3R4KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgUlhPTiBjb25maWd1cmF0aW9uLiAgTm90IGNvbW1pdHRpbmcuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiByZWNlaXZlIGNvbW1pdF9yeG9uIHJlcXVlc3QKLQkgKiBhYm9ydCBhbnkgcHJldmlvdXMgY2hhbm5lbCBzd2l0Y2ggaWYgc3RpbGwgaW4gcHJvY2VzcwotCSAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykgJiYKLQkgICAgKHByaXYtPnN3aXRjaF9jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgewotCQlJV0xfREVCVUdfMTFIKHByaXYsICJhYm9ydCBjaGFubmVsIHN3aXRjaCBvbiAlZFxuIiwKLQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX2NoYW5uZWwpKTsKLQkJaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKLQl9Ci0KLQkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgYSBmdWxsIFJYT04sIHdlIGNhbiB1c2UKLQkgKiBpd2xfcnhvbl9hc3NvY19jbWQgd2hpY2ggaXMgdXNlZCB0byByZWNvbmZpZ3VyZSBmaWx0ZXIKLQkgKiBhbmQgb3RoZXIgZmxhZ3MgZm9yIHRoZSBjdXJyZW50IHJhZGlvIGNvbmZpZ3VyYXRpb24uICovCi0JaWYgKCFpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZChwcml2LCBjdHgpKSB7Ci0JCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX2Fzc29jKHByaXYsIGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkVycm9yIHNldHRpbmcgUlhPTl9BU1NPQyAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwotCQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQkJLyoKLQkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAotCQkgKiBkbyBpdCBub3cgaWYgdHggcG93ZXIgY2hhbmdlZC4KLQkJICovCi0JCWl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGFuZCB0aGUgbmV3IGNvbmZpZyByZXF1aXJlcwotCSAqIGFuIFJYT05fQVNTT0MgYW5kIHRoZSBuZXcgY29uZmlnIHdhbnRzIHRoZSBhc3NvY2lhdGVkIG1hc2sgZW5hYmxlZCwKLQkgKiB3ZSBtdXN0IGNsZWFyIHRoZSBhc3NvY2lhdGVkIGZyb20gdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCi0JICogYmVmb3JlIHdlIGFwcGx5IHRoZSBuZXcgY29uZmlnICovCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSAmJiBuZXdfYXNzb2MpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlRvZ2dsaW5nIGFzc29jaWF0ZWQgYml0IG9uIGN1cnJlbnQgUlhPTlxuIik7Ci0JCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQotCQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnJ4b25fY21kLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQpLAotCQkJCSAgICAgICBhY3RpdmVfcnhvbik7Ci0KLQkJLyogSWYgdGhlIG1hc2sgY2xlYXJpbmcgZmFpbGVkIHRoZW4gd2Ugc2V0Ci0JCSAqIGFjdGl2ZV9yeG9uIGJhY2sgdG8gd2hhdCBpdCB3YXMgcHJldmlvdXNseSAqLwotCQlpZiAocmV0KSB7Ci0JCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJCUlXTF9FUlIocHJpdiwgIkVycm9yIGNsZWFyaW5nIEFTU09DX01TSyAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zKHByaXYsIGN0eCk7Ci0JCWl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucyhwcml2LCBjdHgpOwotCQlyZXQgPSBpd2w0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhwcml2LCBjdHgpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gcmVzdG9yZSBXRVAga2V5cyAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJTZW5kaW5nIFJYT05cbiIKLQkJICAgICAgICIqIHdpdGglcyBSWE9OX0ZJTFRFUl9BU1NPQ19NU0tcbiIKLQkJICAgICAgICIqIGNoYW5uZWwgPSAlZFxuIgotCQkgICAgICAgIiogYnNzaWQgPSAlcE1cbiIsCi0JCSAgICAgICAobmV3X2Fzc29jID8gIiIgOiAib3V0IiksCi0JCSAgICAgICBsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCksCi0JCSAgICAgICBjdHgtPnN0YWdpbmcuYnNzaWRfYWRkcik7Ci0KLQlpd2xfbGVnYWN5X3NldF9yeG9uX2h3Y3J5cHRvKHByaXYsIGN0eCwKLQkJCQkhcHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5zd19jcnlwdG8pOwotCi0JLyogQXBwbHkgdGhlIG5ldyBjb25maWd1cmF0aW9uCi0JICogUlhPTiB1bmFzc29jIGNsZWFycyB0aGUgc3RhdGlvbiB0YWJsZSBpbiB1Q29kZSBzbyByZXN0b3JhdGlvbiBvZgotCSAqIHN0YXRpb25zIGlzIG5lZWRlZCBhZnRlciBpdCAodGhlIFJYT04gY29tbWFuZCkgY29tcGxldGVzCi0JICovCi0JaWYgKCFuZXdfYXNzb2MpIHsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIG5ldyBSWE9OICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSZXR1cm4gZnJvbSAhbmV3X2Fzc29jIFJYT04uXG4iKTsKLQkJbWVtY3B5KGFjdGl2ZV9yeG9uLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7Ci0JCWl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMocHJpdiwgY3R4KTsKLQkJaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKHByaXYsIGN0eCk7Ci0JCXJldCA9IGl3bDQ5NjVfcmVzdG9yZV9kZWZhdWx0X3dlcF9rZXlzKHByaXYsIGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZXN0b3JlIFdFUCBrZXlzICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCWlmIChuZXdfYXNzb2MpIHsKLQkJcHJpdi0+c3RhcnRfY2FsaWIgPSAwOwotCQkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KLQkJICogUlhPTiBhc3NvYyBkb2Vzbid0IGNsZWFyIHRoZSBzdGF0aW9uIHRhYmxlIGluIHVDb2RlLAotCQkgKi8KLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIG5ldyBSWE9OICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwotCX0KLQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQotCWl3bDQ5NjVfaW5pdF9zZW5zaXRpdml0eShwcml2KTsKLQotCS8qIElmIHdlIGlzc3VlIGEgbmV3IFJYT04gY29tbWFuZCB3aGljaCByZXF1aXJlZCBhIHR1bmUgdGhlbiB3ZSBtdXN0Ci0JICogc2VuZCBhIG5ldyBUWFBPV0VSIGNvbW1hbmQgb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byBUeCBhbnkgZnJhbWVzICovCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZXRfdHhfcG93ZXIocHJpdiwgcHJpdi0+dHhfcG93ZXJfbmV4dCwgdHJ1ZSk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZW5kaW5nIFRYIHBvd2VyICglZClcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9od19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlpbnQgcmM7Ci0JdTggYmFuZCA9IDA7Ci0JYm9vbCBpc19odDQwID0gZmFsc2U7Ci0JdTggY3RybF9jaGFuX2hpZ2ggPSAwOwotCXN0cnVjdCBpd2w0OTY1X2NoYW5uZWxfc3dpdGNoX2NtZCBjbWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOwotCXUxNiBjaDsKLQl1MzIgdHNmX2xvdzsKLQl1OCBzd2l0Y2hfY291bnQ7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCWJhbmQgPSBwcml2LT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0KLQlpc19odDQwID0gaXc0OTY1X2lzX2h0NDBfY2hhbm5lbChjdHgtPnN0YWdpbmcuZmxhZ3MpOwotCi0JaWYgKGlzX2h0NDAgJiYKLQkgICAgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLKSkKLQkJY3RybF9jaGFuX2hpZ2ggPSAxOwotCi0JY21kLmJhbmQgPSBiYW5kOwotCWNtZC5leHBlY3RfYmVhY29uID0gMDsKLQljaCA9IGNoX3N3aXRjaC0+Y2hhbm5lbC0+aHdfdmFsdWU7Ci0JY21kLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7Ci0JY21kLnJ4b25fZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmxhZ3M7Ci0JY21kLnJ4b25fZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKLQlzd2l0Y2hfY291bnQgPSBjaF9zd2l0Y2gtPmNvdW50OwotCXRzZl9sb3cgPSBjaF9zd2l0Y2gtPnRpbWVzdGFtcCAmIDB4MGZmZmZmZmZmOwotCS8qCi0JICogY2FsY3VsYXRlIHRoZSB1Y29kZSBjaGFubmVsIHN3aXRjaCB0aW1lCi0JICogYWRkaW5nIFRTRiBhcyBvbmUgb2YgdGhlIGZhY3RvciBmb3Igd2hlbiB0byBzd2l0Y2gKLQkgKi8KLQlpZiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lID4gdHNmX2xvdykgJiYgYmVhY29uX2ludGVydmFsKSB7Ci0JCWlmIChzd2l0Y2hfY291bnQgPiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lIC0gdHNmX2xvdykgLwotCQkgICAgYmVhY29uX2ludGVydmFsKSkgewotCQkJc3dpdGNoX2NvdW50IC09IChwcml2LT51Y29kZV9iZWFjb25fdGltZSAtCi0JCQkJdHNmX2xvdykgLyBiZWFjb25faW50ZXJ2YWw7Ci0JCX0gZWxzZQotCQkJc3dpdGNoX2NvdW50ID0gMDsKLQl9Ci0JaWYgKHN3aXRjaF9jb3VudCA8PSAxKQotCQljbWQuc3dpdGNoX3RpbWUgPSBjcHVfdG9fbGUzMihwcml2LT51Y29kZV9iZWFjb25fdGltZSk7Ci0JZWxzZSB7Ci0JCXN3aXRjaF90aW1lX2luX3VzZWMgPQotCQkJdmlmLT5ic3NfY29uZi5iZWFjb25faW50ICogc3dpdGNoX2NvdW50ICogVElNRV9VTklUOwotCQl1Y29kZV9zd2l0Y2hfdGltZSA9IGl3bF9sZWdhY3lfdXNlY3NfdG9fYmVhY29ucyhwcml2LAotCQkJCQkJCSBzd2l0Y2hfdGltZV9pbl91c2VjLAotCQkJCQkJCSBiZWFjb25faW50ZXJ2YWwpOwotCQljbWQuc3dpdGNoX3RpbWUgPSBpd2xfbGVnYWN5X2FkZF9iZWFjb25fdGltZShwcml2LAotCQkJCQkJICAgICAgcHJpdi0+dWNvZGVfYmVhY29uX3RpbWUsCi0JCQkJCQkgICAgICB1Y29kZV9zd2l0Y2hfdGltZSwKLQkJCQkJCSAgICAgIGJlYWNvbl9pbnRlcnZhbCk7Ci0JfQotCUlXTF9ERUJVR18xMUgocHJpdiwgInVDb2RlIHRpbWUgZm9yIHRoZSBzd2l0Y2ggaXMgMHgleFxuIiwKLQkJICAgICAgY21kLnN3aXRjaF90aW1lKTsKLQljaF9pbmZvID0gaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIHByaXYtPmJhbmQsIGNoKTsKLQlpZiAoY2hfaW5mbykKLQkJY21kLmV4cGVjdF9iZWFjb24gPSBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfcmFkYXIoY2hfaW5mbyk7Ci0JZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgImludmFsaWQgY2hhbm5lbCBzd2l0Y2ggZnJvbSAldSB0byAldVxuIiwKLQkJCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmMgPSBpd2w0OTY1X2ZpbGxfdHhwb3dlcl90YmwocHJpdiwgYmFuZCwgY2gsIGlzX2h0NDAsCi0JCQkJICAgICAgY3RybF9jaGFuX2hpZ2gsICZjbWQudHhfcG93ZXIpOwotCWlmIChyYykgewotCQlJV0xfREVCVUdfMTFIKHByaXYsICJlcnJvcjolZCAgZmlsbCB0eHBvd2VyX3RibFxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsCi0JCQkgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsIHNpemVvZihjbWQpLCAmY21kKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsIC0gU2V0IHVwIGVudHJ5IGluIFR4IGJ5dGUtY291bnQgYXJyYXkKLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV90eHFfdXBkYXRlX2J5dGVfY250X3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJCSAgICB1MTYgYnl0ZV9jbnQpCi17Ci0Jc3RydWN0IGl3bDQ5NjVfc2NkX2JjX3RibCAqc2NkX2JjX3RibCA9IHByaXYtPnNjZF9iY190YmxzLmFkZHI7Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKLQlpbnQgd3JpdGVfcHRyID0gdHhxLT5xLndyaXRlX3B0cjsKLQlpbnQgbGVuID0gYnl0ZV9jbnQgKyBJV0xfVFhfQ1JDX1NJWkUgKyBJV0xfVFhfREVMSU1JVEVSX1NJWkU7Ci0JX19sZTE2IGJjX2VudDsKLQotCVdBUk5fT04obGVuID4gMHhGRkYgfHwgd3JpdGVfcHRyID49IFRGRF9RVUVVRV9TSVpFX01BWCk7Ci0KLQliY19lbnQgPSBjcHVfdG9fbGUxNihsZW4gJiAweEZGRik7Ci0JLyogU2V0IHVwIGJ5dGUgY291bnQgd2l0aGluIGZpcnN0IDI1NiBlbnRyaWVzICovCi0Jc2NkX2JjX3RibFt0eHFfaWRdLnRmZF9vZmZzZXRbd3JpdGVfcHRyXSA9IGJjX2VudDsKLQotCS8qIElmIHdpdGhpbiBmaXJzdCA2NCBlbnRyaWVzLCBkdXBsaWNhdGUgYXQgZW5kICovCi0JaWYgKHdyaXRlX3B0ciA8IFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKLQkJc2NkX2JjX3RibFt0eHFfaWRdLgotCQkJdGZkX29mZnNldFtURkRfUVVFVUVfU0laRV9NQVggKyB3cml0ZV9wdHJdID0gYmNfZW50OwotfQotCi0vKioKLSAqIGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlIC0gcmV0dXJuIHRoZSBjYWxpYnJhdGVkIHRlbXBlcmF0dXJlIChpbiBLZWx2aW4pCi0gKiBAc3RhdGlzdGljczogUHJvdmlkZXMgdGhlIHRlbXBlcmF0dXJlIHJlYWRpbmcgZnJvbSB0aGUgdUNvZGUKLSAqCi0gKiBBIHJldHVybiBvZiA8MCBpbmRpY2F0ZXMgYm9ndXMgZGF0YSBpbiB0aGUgc3RhdGlzdGljcwotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzMzIgdGVtcGVyYXR1cmU7Ci0JczMyIHZ0OwotCXMzMiBSMSwgUjIsIFIzOwotCXUzMiBSNDsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfVEVNUEVSQVRVUkUsICZwcml2LT5zdGF0dXMpICYmCi0JICAgIChwcml2LT5fNDk2NS5zdGF0aXN0aWNzLmZsYWcgJgotCQkJU1RBVElTVElDU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSykpIHsKLQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlJ1bm5pbmcgSFQ0MCB0ZW1wZXJhdHVyZSBjYWxpYnJhdGlvblxuIik7Ci0JCVIxID0gKHMzMilsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjFbMV0pOwotCQlSMiA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IyWzFdKTsKLQkJUjMgPSAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yM1sxXSk7Ci0JCVI0ID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3I0WzFdKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfVEVNUChwcml2LCAiUnVubmluZyB0ZW1wZXJhdHVyZSBjYWxpYnJhdGlvblxuIik7Ci0JCVIxID0gKHMzMilsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjFbMF0pOwotCQlSMiA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IyWzBdKTsKLQkJUjMgPSAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yM1swXSk7Ci0JCVI0ID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3I0WzBdKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBlcmF0dXJlIGlzIG9ubHkgMjMgYml0cywgc28gc2lnbiBleHRlbmQgb3V0IHRvIDMyLgotCSAqCi0JICogTk9URSBJZiB3ZSBoYXZlbid0IHJlY2VpdmVkIGEgc3RhdGlzdGljcyBub3RpZmljYXRpb24geWV0Ci0JICogd2l0aCBhbiB1cGRhdGVkIHRlbXBlcmF0dXJlLCB1c2UgUjQgcHJvdmlkZWQgdG8gdXMgaW4gdGhlCi0JICogImluaXRpYWxpemUiIEFMSVZFIHJlc3BvbnNlLgotCSAqLwotCWlmICghdGVzdF9iaXQoU1RBVFVTX1RFTVBFUkFUVVJFLCAmcHJpdi0+c3RhdHVzKSkKLQkJdnQgPSBzaWduX2V4dGVuZDMyKFI0LCAyMyk7Ci0JZWxzZQotCQl2dCA9IHNpZ25fZXh0ZW5kMzIobGUzMl90b19jcHUocHJpdi0+XzQ5NjUuc3RhdGlzdGljcy4KLQkJCQkgZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUpLCAyMyk7Ci0KLQlJV0xfREVCVUdfVEVNUChwcml2LCAiQ2FsaWIgdmFsdWVzIFJbMS0zXTogJWQgJWQgJWQgUjQ6ICVkXG4iLCBSMSwgUjIsIFIzLCB2dCk7Ci0KLQlpZiAoUjMgPT0gUjEpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FsaWJyYXRpb24gY29uZmxpY3QgUjEgPT0gUjNcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgS2VsdmluLCBhZGp1c3QgYnkgOTclLgotCSAqIEFkZCBvZmZzZXQgdG8gY2VudGVyIHRoZSBhZGp1c3RtZW50IGFyb3VuZCAwIGRlZ3JlZXMgQ2VudGlncmFkZS4gKi8KLQl0ZW1wZXJhdHVyZSA9IFRFTVBFUkFUVVJFX0NBTElCX0FfVkFMICogKHZ0IC0gUjIpOwotCXRlbXBlcmF0dXJlIC89IChSMyAtIFIxKTsKLQl0ZW1wZXJhdHVyZSA9ICh0ZW1wZXJhdHVyZSAqIDk3KSAvIDEwMCArIFRFTVBFUkFUVVJFX0NBTElCX0tFTFZJTl9PRkZTRVQ7Ci0KLQlJV0xfREVCVUdfVEVNUChwcml2LCAiQ2FsaWJyYXRlZCB0ZW1wZXJhdHVyZTogJWRLLCAlZENcbiIsCi0JCQl0ZW1wZXJhdHVyZSwgS0VMVklOX1RPX0NFTFNJVVModGVtcGVyYXR1cmUpKTsKLQotCXJldHVybiB0ZW1wZXJhdHVyZTsKLX0KLQotLyogQWRqdXN0IFR4cG93ZXIgb25seSBpZiB0ZW1wZXJhdHVyZSB2YXJpYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLiAqLwotI2RlZmluZSBJV0xfVEVNUEVSQVRVUkVfVEhSRVNIT0xEICAgMwotCi0vKioKLSAqIGl3bDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQgLSBkZXRlcm1pbmVzIGlmIG5ldyBjYWxpYnJhdGlvbiBpcyBuZWVkZWQKLSAqCi0gKiBJZiB0aGUgdGVtcGVyYXR1cmUgY2hhbmdlZCBoYXMgY2hhbmdlZCBzdWZmaWNpZW50bHksIHRoZW4gYSByZWNhbGlicmF0aW9uCi0gKiBpcyBuZWVkZWQuCi0gKgotICogQXNzdW1lcyBjYWxsZXIgd2lsbCByZXBsYWNlIHByaXYtPmxhc3RfdGVtcGVyYXR1cmUgb25jZSBjYWxpYnJhdGlvbgotICogZXhlY3V0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9pc190ZW1wX2NhbGliX25lZWRlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHRlbXBfZGlmZjsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1NUQVRJU1RJQ1MsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVR19URU1QKHByaXYsICJUZW1wZXJhdHVyZSBub3QgdXBkYXRlZCAtLSBubyBzdGF0aXN0aWNzLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXRlbXBfZGlmZiA9IHByaXYtPnRlbXBlcmF0dXJlIC0gcHJpdi0+bGFzdF90ZW1wZXJhdHVyZTsKLQotCS8qIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLwotCWlmICh0ZW1wX2RpZmYgPCAwKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiR2V0dGluZyBjb29sZXIsIGRlbHRhICVkXG4iLCB0ZW1wX2RpZmYpOwotCQl0ZW1wX2RpZmYgPSAtdGVtcF9kaWZmOwotCX0gZWxzZSBpZiAodGVtcF9kaWZmID09IDApCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiVGVtcGVyYXR1cmUgdW5jaGFuZ2VkXG4iKTsKLQllbHNlCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiR2V0dGluZyB3YXJtZXIsIGRlbHRhICVkXG4iLCB0ZW1wX2RpZmYpOwotCi0JaWYgKHRlbXBfZGlmZiA8IElXTF9URU1QRVJBVFVSRV9USFJFU0hPTEQpIHsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICIgPT4gdGhlcm1hbCB0eHBvd2VyIGNhbGliIG5vdCBuZWVkZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIiA9PiB0aGVybWFsIHR4cG93ZXIgY2FsaWIgbmVlZGVkXG4iKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3RlbXBlcmF0dXJlX2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzMzIgdGVtcDsKLQotCXRlbXAgPSBpd2w0OTY1X2h3X2dldF90ZW1wZXJhdHVyZShwcml2KTsKLQlpZiAoSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX09VVF9PRl9SQU5HRSh0ZW1wKSkKLQkJcmV0dXJuOwotCi0JaWYgKHByaXYtPnRlbXBlcmF0dXJlICE9IHRlbXApIHsKLQkJaWYgKHByaXYtPnRlbXBlcmF0dXJlKQotCQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlRlbXBlcmF0dXJlIGNoYW5nZWQgIgotCQkJCSAgICAgICAiZnJvbSAlZEMgdG8gJWRDXG4iLAotCQkJCSAgICAgICBLRUxWSU5fVE9fQ0VMU0lVUyhwcml2LT50ZW1wZXJhdHVyZSksCi0JCQkJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKHRlbXApKTsKLQkJZWxzZQotCQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlRlbXBlcmF0dXJlICIKLQkJCQkgICAgICAgImluaXRpYWxpemVkIHRvICVkQ1xuIiwKLQkJCQkgICAgICAgS0VMVklOX1RPX0NFTFNJVVModGVtcCkpOwotCX0KLQotCXByaXYtPnRlbXBlcmF0dXJlID0gdGVtcDsKLQlzZXRfYml0KFNUQVRVU19URU1QRVJBVFVSRSwgJnByaXYtPnN0YXR1cyk7Ci0KLQlpZiAoIXByaXYtPmRpc2FibGVfdHhfcG93ZXJfY2FsICYmCi0JICAgICB1bmxpa2VseSghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgJiYKLQkgICAgIGl3bDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQocHJpdikpCi0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dHhwb3dlcl93b3JrKTsKLX0KLQotc3RhdGljIHUxNiBpd2w0OTY1X2dldF9oY21kX3NpemUodTggY21kX2lkLCB1MTYgbGVuKQotewotCXN3aXRjaCAoY21kX2lkKSB7Ci0JY2FzZSBSRVBMWV9SWE9OOgotCQlyZXR1cm4gKHUxNikgc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X3J4b25fY21kKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gbGVuOwotCX0KLX0KLQotc3RhdGljIHUxNiBpd2w0OTY1X2J1aWxkX2FkZHN0YV9oY21kKGNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgKmNtZCwKLQkJCQkJCQkJdTggKmRhdGEpCi17Ci0Jc3RydWN0IGl3bDQ5NjVfYWRkc3RhX2NtZCAqYWRkc3RhID0gKHN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQgKilkYXRhOwotCWFkZHN0YS0+bW9kZSA9IGNtZC0+bW9kZTsKLQltZW1jcHkoJmFkZHN0YS0+c3RhLCAmY21kLT5zdGEsIHNpemVvZihzdHJ1Y3Qgc3RhX2lkX21vZGlmeSkpOwotCW1lbWNweSgmYWRkc3RhLT5rZXksICZjbWQtPmtleSwgc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X2tleWluZm8pKTsKLQlhZGRzdGEtPnN0YXRpb25fZmxhZ3MgPSBjbWQtPnN0YXRpb25fZmxhZ3M7Ci0JYWRkc3RhLT5zdGF0aW9uX2ZsYWdzX21zayA9IGNtZC0+c3RhdGlvbl9mbGFnc19tc2s7Ci0JYWRkc3RhLT50aWRfZGlzYWJsZV90eCA9IGNtZC0+dGlkX2Rpc2FibGVfdHg7Ci0JYWRkc3RhLT5hZGRfaW1tZWRpYXRlX2JhX3RpZCA9IGNtZC0+YWRkX2ltbWVkaWF0ZV9iYV90aWQ7Ci0JYWRkc3RhLT5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZCA9IGNtZC0+cmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQ7Ci0JYWRkc3RhLT5hZGRfaW1tZWRpYXRlX2JhX3NzbiA9IGNtZC0+YWRkX2ltbWVkaWF0ZV9iYV9zc247Ci0JYWRkc3RhLT5zbGVlcF90eF9jb3VudCA9IGNtZC0+c2xlZXBfdHhfY291bnQ7Ci0JYWRkc3RhLT5yZXNlcnZlZDEgPSBjcHVfdG9fbGUxNigwKTsKLQlhZGRzdGEtPnJlc2VydmVkMiA9IGNwdV90b19sZTE2KDApOwotCi0JcmV0dXJuICh1MTYpc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBpd2w0OTY1X2dldF9zY2Rfc3NuKHN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgKnR4X3Jlc3ApCi17Ci0JcmV0dXJuIGxlMzJfdG9fY3B1cCgmdHhfcmVzcC0+dS5zdGF0dXMgKyB0eF9yZXNwLT5mcmFtZV9jb3VudCkgJiBNQVhfU047Ci19Ci0KLS8qKgotICogaXdsNDk2NV90eF9zdGF0dXNfcmVwbHlfdHggLSBIYW5kbGUgVHggcmVzcG9uc2UgZm9yIGZyYW1lcyBpbiBhZ2dyZWdhdGlvbiBxdWV1ZQotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X3R4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnLAotCQkJCSAgICAgIHN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgKnR4X3Jlc3AsCi0JCQkJICAgICAgaW50IHR4cV9pZCwgdTE2IHN0YXJ0X2lkeCkKLXsKLQl1MTYgc3RhdHVzOwotCXN0cnVjdCBhZ2dfdHhfc3RhdHVzICpmcmFtZV9zdGF0dXMgPSB0eF9yZXNwLT51LmFnZ19zdGF0dXM7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gTlVMTDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gTlVMTDsKLQl1MzIgcmF0ZV9uX2ZsYWdzID0gbGUzMl90b19jcHUodHhfcmVzcC0+cmF0ZV9uX2ZsYWdzKTsKLQlpbnQgaSwgc2gsIGlkeDsKLQl1MTYgc2VxOwotCWlmIChhZ2ctPndhaXRfZm9yX2JhKQotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgImdvdCB0eCByZXNwb25zZSB3L28gYmxvY2stYWNrXG4iKTsKLQotCWFnZy0+ZnJhbWVfY291bnQgPSB0eF9yZXNwLT5mcmFtZV9jb3VudDsKLQlhZ2ctPnN0YXJ0X2lkeCA9IHN0YXJ0X2lkeDsKLQlhZ2ctPnJhdGVfbl9mbGFncyA9IHJhdGVfbl9mbGFnczsKLQlhZ2ctPmJpdG1hcCA9IDA7Ci0KLQkvKiBudW0gZnJhbWVzIGF0dGVtcHRlZCBieSBUeCBjb21tYW5kICovCi0JaWYgKGFnZy0+ZnJhbWVfY291bnQgPT0gMSkgewotCQkvKiBPbmx5IG9uZSBmcmFtZSB3YXMgYXR0ZW1wdGVkOyBubyBibG9jay1hY2sgd2lsbCBhcnJpdmUgKi8KLQkJc3RhdHVzID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzWzBdLnN0YXR1cyk7Ci0JCWlkeCA9IHN0YXJ0X2lkeDsKLQotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkZyYW1lQ250ID0gJWQsIFN0YXJ0SWR4PSVkIGlkeD0lZFxuIiwKLQkJCQkgICBhZ2ctPmZyYW1lX2NvdW50LCBhZ2ctPnN0YXJ0X2lkeCwgaWR4KTsKLQotCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2IpOwotCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lICsgMTsKLQkJaW5mby0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9UWF9DVExfQU1QRFU7Ci0JCWluZm8tPmZsYWdzIHw9IGl3bDQ5NjVfdHhfc3RhdHVzX3RvX21hYzgwMjExKHN0YXR1cyk7Ci0JCWl3bDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2wocHJpdiwgcmF0ZV9uX2ZsYWdzLCBpbmZvKTsKLQotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIjEgRnJhbWUgMHgleCBmYWlsdXJlIDolZFxuIiwKLQkJCQkgICAgc3RhdHVzICYgMHhmZiwgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiUmF0ZSBJbmZvIHJhdGVfbl9mbGFncz0leFxuIiwgcmF0ZV9uX2ZsYWdzKTsKLQotCQlhZ2ctPndhaXRfZm9yX2JhID0gMDsKLQl9IGVsc2UgewotCQkvKiBUd28gb3IgbW9yZSBmcmFtZXMgd2VyZSBhdHRlbXB0ZWQ7IGV4cGVjdCBibG9jay1hY2sgKi8KLQkJdTY0IGJpdG1hcCA9IDA7Ci0JCWludCBzdGFydCA9IGFnZy0+c3RhcnRfaWR4OwotCi0JCS8qIENvbnN0cnVjdCBiaXQtbWFwIG9mIHBlbmRpbmcgZnJhbWVzIHdpdGhpbiBUeCB3aW5kb3cgKi8KLQkJZm9yIChpID0gMDsgaSA8IGFnZy0+ZnJhbWVfY291bnQ7IGkrKykgewotCQkJdTE2IHNjOwotCQkJc3RhdHVzID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzW2ldLnN0YXR1cyk7Ci0JCQlzZXEgID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzW2ldLnNlcXVlbmNlKTsKLQkJCWlkeCA9IFNFUV9UT19JTkRFWChzZXEpOwotCQkJdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcSk7Ci0KLQkJCWlmIChzdGF0dXMgJiAoQUdHX1RYX1NUQVRFX0ZFV19CWVRFU19NU0sgfAotCQkJCSAgICAgIEFHR19UWF9TVEFURV9BQk9SVF9NU0spKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkZyYW1lQ250ID0gJWQsIHR4cV9pZD0lZCBpZHg9JWRcbiIsCi0JCQkJCSAgIGFnZy0+ZnJhbWVfY291bnQsIHR4cV9pZCwgaWR4KTsKLQotCQkJaGRyID0gaXdsX2xlZ2FjeV90eF9xdWV1ZV9nZXRfaGRyKHByaXYsIHR4cV9pZCwgaWR4KTsKLQkJCWlmICghaGRyKSB7Ci0JCQkJSVdMX0VSUihwcml2LAotCQkJCQkiQlVHX09OIGlkeCBkb2Vzbid0IHBvaW50IHRvIHZhbGlkIHNrYiIKLQkJCQkJIiBpZHg9JWQsIHR4cV9pZD0lZFxuIiwgaWR4LCB0eHFfaWQpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKTsKLQkJCWlmIChpZHggIT0gKFNFUV9UT19TTihzYykgJiAweGZmKSkgewotCQkJCUlXTF9FUlIocHJpdiwKLQkJCQkJIkJVR19PTiBpZHggZG9lc24ndCBtYXRjaCBzZXEgY29udHJvbCIKLQkJCQkJIiBpZHg9JWQsIHNlcV9pZHg9JWQsIHNlcT0lZFxuIiwKLQkJCQkJaWR4LCBTRVFfVE9fU04oc2MpLCBoZHItPnNlcV9jdHJsKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiQUdHIEZyYW1lIGk9JWQgaWR4ICVkIHNlcT0lZFxuIiwKLQkJCQkJICAgaSwgaWR4LCBTRVFfVE9fU04oc2MpKTsKLQotCQkJc2ggPSBpZHggLSBzdGFydDsKLQkJCWlmIChzaCA+IDY0KSB7Ci0JCQkJc2ggPSAoc3RhcnQgLSBpZHgpICsgMHhmZjsKLQkJCQliaXRtYXAgPSBiaXRtYXAgPDwgc2g7Ci0JCQkJc2ggPSAwOwotCQkJCXN0YXJ0ID0gaWR4OwotCQkJfSBlbHNlIGlmIChzaCA8IC02NCkKLQkJCQlzaCAgPSAweGZmIC0gKHN0YXJ0IC0gaWR4KTsKLQkJCWVsc2UgaWYgKHNoIDwgMCkgewotCQkJCXNoID0gc3RhcnQgLSBpZHg7Ci0JCQkJc3RhcnQgPSBpZHg7Ci0JCQkJYml0bWFwID0gYml0bWFwIDw8IHNoOwotCQkJCXNoID0gMDsKLQkJCX0KLQkJCWJpdG1hcCB8PSAxVUxMIDw8IHNoOwotCQkJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJzdGFydD0lZCBiaXRtYXA9MHglbGx4XG4iLAotCQkJCQkgICBzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXApOwotCQl9Ci0KLQkJYWdnLT5iaXRtYXAgPSBiaXRtYXA7Ci0JCWFnZy0+c3RhcnRfaWR4ID0gc3RhcnQ7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiRnJhbWVzICVkIHN0YXJ0X2lkeD0lZCBiaXRtYXA9MHglbGx4XG4iLAotCQkJCSAgIGFnZy0+ZnJhbWVfY291bnQsIGFnZy0+c3RhcnRfaWR4LAotCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWdnLT5iaXRtYXApOwotCi0JCWlmIChiaXRtYXApCi0JCQlhZ2ctPndhaXRfZm9yX2JhID0gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1OCBpd2w0OTY1X2ZpbmRfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IHU4ICphZGRyKQotewotCWludCBpOwotCWludCBzdGFydCA9IDA7Ci0JaW50IHJldCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykpCi0JCXN0YXJ0ID0gSVdMX1NUQV9JRDsKLQotCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihhZGRyKSkKLQkJcmV0dXJuIHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IHN0YXJ0OyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKQotCQlpZiAocHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmJgotCQkgICAgKCFjb21wYXJlX2V0aGVyX2FkZHIocHJpdi0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyLAotCQkJCQkgYWRkcikpKSB7Ci0JCQlyZXQgPSBpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCUlXTF9ERUJVR19BU1NPQ19MSU1JVChwcml2LCAiY2FuIG5vdCBmaW5kIFNUQSAlcE0gdG90YWwgJWRcbiIsCi0JCQkgICAgICBhZGRyLCBwcml2LT5udW1fc3RhdGlvbnMpOwotCi0gb3V0OgotCS8qCi0JICogSXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgbW9yZSBjb21tYW5kcyBpbnRlcmFjdGluZyB3aXRoIHN0YXRpb25zCi0JICogYXJyaXZlIGJlZm9yZSB3ZSBjb21wbGV0ZWQgcHJvY2Vzc2luZyB0aGUgYWRkaW5nIG9mCi0JICogc3RhdGlvbgotCSAqLwotCWlmIChyZXQgIT0gSVdMX0lOVkFMSURfU1RBVElPTiAmJgotCSAgICAoIShwcml2LT5zdGF0aW9uc1tyZXRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkgfHwKLQkgICAgICgocHJpdi0+c3RhdGlvbnNbcmV0XS51c2VkICYgSVdMX1NUQV9VQ09ERV9BQ1RJVkUpICYmCi0JICAgICAgKHByaXYtPnN0YXRpb25zW3JldF0udXNlZCAmIElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpKSkgewotCQlJV0xfRVJSKHByaXYsICJSZXF1ZXN0ZWQgc3RhdGlvbiBpbmZvIGZvciBzdGEgJWQgYmVmb3JlIHJlYWR5LlxuIiwKLQkJCXJldCk7Ci0JCXJldCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X2dldF9yYV9zdGFfaWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQotewotCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKLQkJcmV0dXJuIElXTF9BUF9JRDsKLQl9IGVsc2UgewotCQl1OCAqZGEgPSBpZWVlODAyMTFfZ2V0X0RBKGhkcik7Ci0JCXJldHVybiBpd2w0OTY1X2ZpbmRfc3RhdGlvbihwcml2LCBkYSk7Ci0JfQotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnhfcmVwbHlfdHggLSBIYW5kbGUgc3RhbmRhcmQgKG5vbi1hZ2dyZWdhdGlvbikgVHggcmVzcG9uc2UKLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yeF9yZXBseV90eChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0JdTE2IHNlcXVlbmNlID0gbGUxNl90b19jcHUocGt0LT5oZHIuc2VxdWVuY2UpOwotCWludCB0eHFfaWQgPSBTRVFfVE9fUVVFVUUoc2VxdWVuY2UpOwotCWludCBpbmRleCA9IFNFUV9UT19JTkRFWChzZXF1ZW5jZSk7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwotCXN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgKnR4X3Jlc3AgPSAodm9pZCAqKSZwa3QtPnUucmF3WzBdOwotCXUzMiAgc3RhdHVzID0gbGUzMl90b19jcHUodHhfcmVzcC0+dS5zdGF0dXMpOwotCWludCB1bmluaXRpYWxpemVkX3Zhcih0aWQpOwotCWludCBzdGFfaWQ7Ci0JaW50IGZyZWVkOwotCXU4ICpxYyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoaW5kZXggPj0gdHhxLT5xLm5fYmQpIHx8IChpd2xfbGVnYWN5X3F1ZXVlX3VzZWQoJnR4cS0+cSwgaW5kZXgpID09IDApKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpbmRleCAlZCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkXG4iLCB0eHFfaWQsCi0JCQkgIGluZGV4LCB0eHEtPnEubl9iZCwgdHhxLT5xLndyaXRlX3B0ciwKLQkJCSAgdHhxLT5xLnJlYWRfcHRyKTsKLQkJcmV0dXJuOwotCX0KLQotCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7Ci0JaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IpOwotCW1lbXNldCgmaW5mby0+c3RhdHVzLCAwLCBzaXplb2YoaW5mby0+c3RhdHVzKSk7Ci0KLQloZHIgPSBpd2xfbGVnYWN5X3R4X3F1ZXVlX2dldF9oZHIocHJpdiwgdHhxX2lkLCBpbmRleCk7Ci0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXRpZCA9IHFjWzBdICYgMHhmOwotCX0KLQotCXN0YV9pZCA9IGl3bDQ5NjVfZ2V0X3JhX3N0YV9pZChwcml2LCBoZHIpOwotCWlmICh0eHEtPnNjaGVkX3JldHJ5ICYmIHVubGlrZWx5KHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkgewotCQlJV0xfRVJSKHByaXYsICJTdGF0aW9uIG5vdCBrbm93blxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlpZiAodHhxLT5zY2hlZF9yZXRyeSkgewotCQljb25zdCB1MzIgc2NkX3NzbiA9IGl3bDQ5NjVfZ2V0X3NjZF9zc24odHhfcmVzcCk7Ci0JCXN0cnVjdCBpd2xfaHRfYWdnICphZ2cgPSBOVUxMOwotCQlXQVJOX09OKCFxYyk7Ci0KLQkJYWdnID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnOwotCi0JCWl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X3R4KHByaXYsIGFnZywgdHhfcmVzcCwgdHhxX2lkLCBpbmRleCk7Ci0KLQkJLyogY2hlY2sgaWYgQkFSIGlzIG5lZWRlZCAqLwotCQlpZiAoKHR4X3Jlc3AtPmZyYW1lX2NvdW50ID09IDEpICYmICFpd2w0OTY1X2lzX3R4X3N1Y2Nlc3Moc3RhdHVzKSkKLQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FNUERVX05PX0JBQ0s7Ci0KLQkJaWYgKHR4cS0+cS5yZWFkX3B0ciAhPSAoc2NkX3NzbiAmIDB4ZmYpKSB7Ci0JCQlpbmRleCA9IGl3bF9sZWdhY3lfcXVldWVfZGVjX3dyYXAoc2NkX3NzbiAmIDB4ZmYsCi0JCQkJCQkJCXR4cS0+cS5uX2JkKTsKLQkJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiUmV0cnkgc2NoZWR1bGVyIHJlY2xhaW0gc2NkX3NzbiAiCi0JCQkJCSAgICIlZCBpbmRleCAlZFxuIiwgc2NkX3NzbiAsIGluZGV4KTsKLQkJCWZyZWVkID0gaXdsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHByaXYsIHR4cV9pZCwgaW5kZXgpOwotCQkJaWYgKHFjKQotCQkJCWl3bDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHByaXYsIHN0YV9pZCwKLQkJCQkJCSAgICAgICB0aWQsIGZyZWVkKTsKLQotCQkJaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgJiYKLQkJCSAgICAoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZSgmdHhxLT5xKSA+IHR4cS0+cS5sb3dfbWFyaykKLQkJCQkgJiYgKGFnZy0+c3RhdGUgIT0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKSkKLQkJCQlpd2xfbGVnYWN5X3dha2VfcXVldWUocHJpdiwgdHhxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUgKyAxOwotCQlpbmZvLT5mbGFncyB8PSBpd2w0OTY1X3R4X3N0YXR1c190b19tYWM4MDIxMShzdGF0dXMpOwotCQlpd2w0OTY1X2h3cmF0ZV90b190eF9jb250cm9sKHByaXYsCi0JCQkJCWxlMzJfdG9fY3B1KHR4X3Jlc3AtPnJhdGVfbl9mbGFncyksCi0JCQkJCWluZm8pOwotCi0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiVFhRICVkIHN0YXR1cyAlcyAoMHglMDh4KSAiCi0JCQkJICAgInJhdGVfbl9mbGFncyAweCV4IHJldHJpZXMgJWRcbiIsCi0JCQkJICAgdHhxX2lkLAotCQkJCSAgIGl3bDQ5NjVfZ2V0X3R4X2ZhaWxfcmVhc29uKHN0YXR1cyksIHN0YXR1cywKLQkJCQkgICBsZTMyX3RvX2NwdSh0eF9yZXNwLT5yYXRlX25fZmxhZ3MpLAotCQkJCSAgIHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUpOwotCi0JCWZyZWVkID0gaXdsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHByaXYsIHR4cV9pZCwgaW5kZXgpOwotCQlpZiAocWMgJiYgbGlrZWx5KHN0YV9pZCAhPSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKLQkJCWl3bDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHByaXYsIHN0YV9pZCwgdGlkLCBmcmVlZCk7Ci0JCWVsc2UgaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQotCQkJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJTdGF0aW9uIG5vdCBrbm93blxuIik7Ci0KLQkJaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgJiYKLQkJICAgIChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrKSkKLQkJCWl3bF9sZWdhY3lfd2FrZV9xdWV1ZShwcml2LCB0eHEpOwotCX0KLQlpZiAocWMgJiYgbGlrZWx5KHN0YV9pZCAhPSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKLQkJaXdsNDk2NV90eHFfY2hlY2tfZW1wdHkocHJpdiwgc3RhX2lkLCB0aWQsIHR4cV9pZCk7Ci0KLQlpd2w0OTY1X2NoZWNrX2Fib3J0X3N0YXR1cyhwcml2LCB0eF9yZXNwLT5mcmFtZV9jb3VudCwgc3RhdHVzKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnhfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bDQ5NjVfYmVhY29uX25vdGlmICpiZWFjb24gPSAodm9pZCAqKXBrdC0+dS5yYXc7Ci0JdTggcmF0ZSBfX21heWJlX3VudXNlZCA9Ci0JCWl3bDQ5NjVfaHdfZ2V0X3JhdGUoYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5yYXRlX25fZmxhZ3MpOwotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJiZWFjb24gc3RhdHVzICUjeCwgcmV0cmllczolZCBpYnNzbWdyOiVkICIKLQkJInRzZjoweCUuOHglLjh4IHJhdGU6JWRcbiIsCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIudS5zdGF0dXMpICYgVFhfU1RBVFVTX01TSywKLQkJYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5mYWlsdXJlX2ZyYW1lLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyksCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+aGlnaF90c2YpLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmxvd190c2YpLCByYXRlKTsKLQotCXByaXYtPmlic3NfbWFuYWdlciA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKTsKLX0KLQotLyogU2V0IHVwIDQ5NjUtc3BlY2lmaWMgUnggZnJhbWUgcmVwbHkgaGFuZGxlcnMgKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnhfaGFuZGxlcl9zZXR1cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogTGVnYWN5IFJ4IGZyYW1lcyAqLwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1JYXSA9IGl3bDQ5NjVfcnhfcmVwbHlfcng7Ci0JLyogVHggcmVzcG9uc2UgKi8KLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9UWF0gPSBpd2w0OTY1X3J4X3JlcGx5X3R4OwotCXByaXYtPnJ4X2hhbmRsZXJzW0JFQUNPTl9OT1RJRklDQVRJT05dID0gaXdsNDk2NV9yeF9iZWFjb25fbm90aWY7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2hjbWRfb3BzIGl3bDQ5NjVfaGNtZCA9IHsKLQkucnhvbl9hc3NvYyA9IGl3bDQ5NjVfc2VuZF9yeG9uX2Fzc29jLAotCS5jb21taXRfcnhvbiA9IGl3bDQ5NjVfY29tbWl0X3J4b24sCi0JLnNldF9yeG9uX2NoYWluID0gaXdsNDk2NV9zZXRfcnhvbl9jaGFpbiwKLX07Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcG9zdF9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JLyoKLQkgKiBTaW5jZSBzZXR0aW5nIHRoZSBSWE9OIG1heSBoYXZlIGJlZW4gZGVmZXJyZWQgd2hpbGUKLQkgKiBwZXJmb3JtaW5nIHRoZSBzY2FuLCBmaXJlIG9uZSBvZmYgaWYgbmVlZGVkCi0JICovCi0JaWYgKG1lbWNtcCgmY3R4LT5zdGFnaW5nLCAmY3R4LT5hY3RpdmUsIHNpemVvZihjdHgtPnN0YWdpbmcpKSkKLQkJaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3Bvc3RfYXNzb2NpYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSBOVUxMOwotCWludCByZXQgPSAwOwotCi0JaWYgKCF2aWYgfHwgIXByaXYtPmlzX29wZW4pCi0JCXJldHVybjsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7Ci0KLQljb25mID0gaXdsX2xlZ2FjeV9pZWVlODAyMTFfZ2V0X2h3X2NvbmYocHJpdi0+aHcpOwotCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCWl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhwcml2LCBjdHgpOwotCWlmIChyZXQpCi0JCUlXTF9XQVJOKHByaXYsICJSWE9OIHRpbWluZyAtICIKLQkJCSAgICAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOwotCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0KLQlpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHByaXYsICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZyk7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQotCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQotCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IGNwdV90b19sZTE2KHZpZi0+YnNzX2NvbmYuYWlkKTsKLQotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiYXNzb2MgaWQgJWQgYmVhY29uIGludGVydmFsICVkXG4iLAotCQkJdmlmLT5ic3NfY29uZi5haWQsIHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCk7Ci0KLQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCi0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JZWxzZQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQotCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spIHsKLQkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JfQotCi0JaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJBc3NvY2lhdGVkIGFzICVkIHRvOiAlcE1cbiIsCi0JCQl2aWYtPmJzc19jb25mLmFpZCwgY3R4LT5hY3RpdmUuYnNzaWRfYWRkcik7Ci0KLQlzd2l0Y2ggKHZpZi0+dHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJaXdsNDk2NV9zZW5kX2JlYWNvbl9jbWQocHJpdik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIiVzIFNob3VsZCBub3QgYmUgY2FsbGVkIGluICVkIG1vZGVcbiIsCi0JCQkgIF9fZnVuY19fLCB2aWYtPnR5cGUpOwotCQlicmVhazsKLQl9Ci0KLQkvKiB0aGUgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gd2lsbCBlbmFibGVkIFBNIHVwb24gY29tcGxldGlvbgotCSAqIElmIGNoYWluIG5vaXNlIGhhcyBhbHJlYWR5IGJlZW4gcnVuLCB0aGVuIHdlIG5lZWQgdG8gZW5hYmxlCi0JICogcG93ZXIgbWFuYWdlbWVudCBoZXJlICovCi0JaWYgKHByaXYtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUgPT0gSVdMX0NIQUlOX05PSVNFX0RPTkUpCi0JCWl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgZmFsc2UpOwotCi0JLyogRW5hYmxlIFJ4IGRpZmZlcmVudGlhbCBnYWluIGFuZCBzZW5zaXRpdml0eSBjYWxpYnJhdGlvbnMgKi8KLQlpd2w0OTY1X2NoYWluX25vaXNlX3Jlc2V0KHByaXYpOwotCXByaXYtPnN0YXJ0X2NhbGliID0gMTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9jb25maWdfYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCWludCByZXQgPSAwOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQkvKiBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSBkb25lIG9ubHkgYXQgQVAgYnJpbmcgdXAgKi8KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgewotCi0JCS8qIFJYT04gLSB1bmFzc29jICh0byBzZXQgdGltaW5nIGNvbW1hbmQpICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JCS8qIFJYT04gVGltaW5nICovCi0JCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhwcml2LCBjdHgpOwotCQlpZiAocmV0KQotCQkJSVdMX1dBUk4ocHJpdiwgIlJYT04gdGltaW5nIGZhaWxlZCAtICIKLQkJCQkJIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKLQotCQkvKiBBUCBoYXMgYWxsIGFudGVubmFzICovCi0JCXByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucyA9Ci0JCQlwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OwotCQlpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHByaXYsICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZyk7Ci0JCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQotCQljdHgtPnN0YWdpbmcuYXNzb2NfaWQgPSAwOwotCi0JCWlmICh2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PQotCQkJCVJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQkJZWxzZQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCQkJflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQotCQlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7Ci0JCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKLQkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0KLQkJCQkJUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCQllbHNlCi0JCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCQkJCX5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQkJfQotCQkvKiBuZWVkIHRvIHNlbmQgYmVhY29uIGNtZCBiZWZvcmUgY29tbWl0dGluZyBhc3NvYyBSWE9OISAqLwotCQlpd2w0OTY1X3NlbmRfYmVhY29uX2NtZChwcml2KTsKLQkJLyogcmVzdG9yZSBSWE9OIGFzc29jICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCQlpd2xfbGVnYWN5X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JfQotCWl3bDQ5NjVfc2VuZF9iZWFjb25fY21kKHByaXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGl3bF9oY21kX3V0aWxzX29wcyBpd2w0OTY1X2hjbWRfdXRpbHMgPSB7Ci0JLmdldF9oY21kX3NpemUgPSBpd2w0OTY1X2dldF9oY21kX3NpemUsCi0JLmJ1aWxkX2FkZHN0YV9oY21kID0gaXdsNDk2NV9idWlsZF9hZGRzdGFfaGNtZCwKLQkucmVxdWVzdF9zY2FuID0gaXdsNDk2NV9yZXF1ZXN0X3NjYW4sCi0JLnBvc3Rfc2NhbiA9IGl3bDQ5NjVfcG9zdF9zY2FuLAotfTsKLQotc3RhdGljIHN0cnVjdCBpd2xfbGliX29wcyBpd2w0OTY1X2xpYiA9IHsKLQkuc2V0X2h3X3BhcmFtcyA9IGl3bDQ5NjVfaHdfc2V0X2h3X3BhcmFtcywKLQkudHhxX3VwZGF0ZV9ieXRlX2NudF90YmwgPSBpd2w0OTY1X3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsLAotCS50eHFfYXR0YWNoX2J1Zl90b190ZmQgPSBpd2w0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZCwKLQkudHhxX2ZyZWVfdGZkID0gaXdsNDk2NV9od190eHFfZnJlZV90ZmQsCi0JLnR4cV9pbml0ID0gaXdsNDk2NV9od190eF9xdWV1ZV9pbml0LAotCS5yeF9oYW5kbGVyX3NldHVwID0gaXdsNDk2NV9yeF9oYW5kbGVyX3NldHVwLAotCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaXdsNDk2NV9od192YWxpZF9ydGNfZGF0YV9hZGRyLAotCS5pbml0X2FsaXZlX3N0YXJ0ID0gaXdsNDk2NV9pbml0X2FsaXZlX3N0YXJ0LAotCS5sb2FkX3Vjb2RlID0gaXdsNDk2NV9sb2FkX2JzbSwKLQkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsNDk2NV9kdW1wX25pY19lcnJvcl9sb2csCi0JLmR1bXBfZmggPSBpd2w0OTY1X2R1bXBfZmgsCi0JLnNldF9jaGFubmVsX3N3aXRjaCA9IGl3bDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2gsCi0JLmFwbV9vcHMgPSB7Ci0JCS5pbml0ID0gaXdsX2xlZ2FjeV9hcG1faW5pdCwKLQkJLmNvbmZpZyA9IGl3bDQ5NjVfbmljX2NvbmZpZywKLQl9LAotCS5lZXByb21fb3BzID0gewotCQkucmVndWxhdG9yeV9iYW5kcyA9IHsKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMV9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMl9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfM19DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNF9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUywKLQkJCUVFUFJPTV80OTY1X1JFR1VMQVRPUllfQkFORF8yNF9IVDQwX0NIQU5ORUxTLAotCQkJRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzUyX0hUNDBfQ0hBTk5FTFMKLQkJfSwKLQkJLmFjcXVpcmVfc2VtYXBob3JlID0gaXdsNDk2NV9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUsCi0JCS5yZWxlYXNlX3NlbWFwaG9yZSA9IGl3bDQ5NjVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlLAotCX0sCi0JLnNlbmRfdHhfcG93ZXIJPSBpd2w0OTY1X3NlbmRfdHhfcG93ZXIsCi0JLnVwZGF0ZV9jaGFpbl9mbGFncyA9IGl3bDQ5NjVfdXBkYXRlX2NoYWluX2ZsYWdzLAotCS50ZW1wX29wcyA9IHsKLQkJLnRlbXBlcmF0dXJlID0gaXdsNDk2NV90ZW1wZXJhdHVyZV9jYWxpYiwKLQl9LAotCS5kZWJ1Z2ZzX29wcyA9IHsKLQkJLnJ4X3N0YXRzX3JlYWQgPSBpd2w0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQsCi0JCS50eF9zdGF0c19yZWFkID0gaXdsNDk2NV91Y29kZV90eF9zdGF0c19yZWFkLAotCQkuZ2VuZXJhbF9zdGF0c19yZWFkID0gaXdsNDk2NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9vcHMgaXdsNDk2NV9sZWdhY3lfb3BzID0gewotCS5wb3N0X2Fzc29jaWF0ZSA9IGl3bDQ5NjVfcG9zdF9hc3NvY2lhdGUsCi0JLmNvbmZpZ19hcCA9IGl3bDQ5NjVfY29uZmlnX2FwLAotCS5tYW5hZ2VfaWJzc19zdGF0aW9uID0gaXdsNDk2NV9tYW5hZ2VfaWJzc19zdGF0aW9uLAotCS51cGRhdGVfYmNhc3Rfc3RhdGlvbnMgPSBpd2w0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9ucywKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bDQ5NjVfaHdfb3BzID0gewotCS50eCA9IGl3bDQ5NjVfbWFjX3R4LAotCS5zdGFydCA9IGl3bDQ5NjVfbWFjX3N0YXJ0LAotCS5zdG9wID0gaXdsNDk2NV9tYWNfc3RvcCwKLQkuYWRkX2ludGVyZmFjZSA9IGl3bF9sZWdhY3lfbWFjX2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UgPSBpd2xfbGVnYWN5X21hY19yZW1vdmVfaW50ZXJmYWNlLAotCS5jaGFuZ2VfaW50ZXJmYWNlID0gaXdsX2xlZ2FjeV9tYWNfY2hhbmdlX2ludGVyZmFjZSwKLQkuY29uZmlnID0gaXdsX2xlZ2FjeV9tYWNfY29uZmlnLAotCS5jb25maWd1cmVfZmlsdGVyID0gaXdsNDk2NV9jb25maWd1cmVfZmlsdGVyLAotCS5zZXRfa2V5ID0gaXdsNDk2NV9tYWNfc2V0X2tleSwKLQkudXBkYXRlX3RraXBfa2V5ID0gaXdsNDk2NV9tYWNfdXBkYXRlX3RraXBfa2V5LAotCS5jb25mX3R4ID0gaXdsX2xlZ2FjeV9tYWNfY29uZl90eCwKLQkucmVzZXRfdHNmID0gaXdsX2xlZ2FjeV9tYWNfcmVzZXRfdHNmLAotCS5ic3NfaW5mb19jaGFuZ2VkID0gaXdsX2xlZ2FjeV9tYWNfYnNzX2luZm9fY2hhbmdlZCwKLQkuYW1wZHVfYWN0aW9uID0gaXdsNDk2NV9tYWNfYW1wZHVfYWN0aW9uLAotCS5od19zY2FuID0gaXdsX2xlZ2FjeV9tYWNfaHdfc2NhbiwKLQkuc3RhX2FkZCA9IGl3bDQ5NjVfbWFjX3N0YV9hZGQsCi0JLnN0YV9yZW1vdmUgPSBpd2xfbGVnYWN5X21hY19zdGFfcmVtb3ZlLAotCS5jaGFubmVsX3N3aXRjaCA9IGl3bDQ5NjVfbWFjX2NoYW5uZWxfc3dpdGNoLAotCS50eF9sYXN0X2JlYWNvbiA9IGl3bF9sZWdhY3lfbWFjX3R4X2xhc3RfYmVhY29uLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfb3BzIGl3bDQ5NjVfb3BzID0gewotCS5saWIgPSAmaXdsNDk2NV9saWIsCi0JLmhjbWQgPSAmaXdsNDk2NV9oY21kLAotCS51dGlscyA9ICZpd2w0OTY1X2hjbWRfdXRpbHMsCi0JLmxlZCA9ICZpd2w0OTY1X2xlZF9vcHMsCi0JLmxlZ2FjeSA9ICZpd2w0OTY1X2xlZ2FjeV9vcHMsCi0JLmllZWU4MDIxMV9vcHMgPSAmaXdsNDk2NV9od19vcHMsCi19OwotCi1zdGF0aWMgc3RydWN0IGl3bF9iYXNlX3BhcmFtcyBpd2w0OTY1X2Jhc2VfcGFyYW1zID0gewotCS5lZXByb21fc2l6ZSA9IElXTDQ5NjVfRUVQUk9NX0lNR19TSVpFLAotCS5udW1fb2ZfcXVldWVzID0gSVdMNDlfTlVNX1FVRVVFUywKLQkubnVtX29mX2FtcGR1X3F1ZXVlcyA9IElXTDQ5X05VTV9BTVBEVV9RVUVVRVMsCi0JLnBsbF9jZmdfdmFsID0gMCwKLQkuc2V0X2wwcyA9IHRydWUsCi0JLnVzZV9ic20gPSB0cnVlLAotCS5sZWRfY29tcGVuc2F0aW9uID0gNjEsCi0JLmNoYWluX25vaXNlX251bV9iZWFjb25zID0gSVdMNDk2NV9DQUxfTlVNX0JFQUNPTlMsCi0JLndkX3RpbWVvdXQgPSBJV0xfREVGX1dEX1RJTUVPVVQsCi0JLnRlbXBlcmF0dXJlX2tlbHZpbiA9IHRydWUsCi0JLnVjb2RlX3RyYWNpbmcgPSB0cnVlLAotCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAotCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAotfTsKLQotc3RydWN0IGl3bF9jZmcgaXdsNDk2NV9jZmcgPSB7Ci0JLm5hbWUgPSAiSW50ZWwoUikgV2lyZWxlc3MgV2lGaSBMaW5rIDQ5NjVBR04iLAotCS5md19uYW1lX3ByZSA9IElXTDQ5NjVfRldfUFJFLAotCS51Y29kZV9hcGlfbWF4ID0gSVdMNDk2NV9VQ09ERV9BUElfTUFYLAotCS51Y29kZV9hcGlfbWluID0gSVdMNDk2NV9VQ09ERV9BUElfTUlOLAotCS5za3UgPSBJV0xfU0tVX0F8SVdMX1NLVV9HfElXTF9TS1VfTiwKLQkudmFsaWRfdHhfYW50ID0gQU5UX0FCLAotCS52YWxpZF9yeF9hbnQgPSBBTlRfQUJDLAotCS5lZXByb21fdmVyID0gRUVQUk9NXzQ5NjVfRUVQUk9NX1ZFUlNJT04sCi0JLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNDk2NV9UWF9QT1dFUl9WRVJTSU9OLAotCS5vcHMgPSAmaXdsNDk2NV9vcHMsCi0JLm1vZF9wYXJhbXMgPSAmaXdsNDk2NV9tb2RfcGFyYW1zLAotCS5iYXNlX3BhcmFtcyA9ICZpd2w0OTY1X2Jhc2VfcGFyYW1zLAotCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCi0JLyoKLQkgKiBGb3JjZSB1c2Ugb2YgY2hhaW5zIEIgYW5kIEMgZm9yIHNjYW4gUlggb24gNSBHSHogYmFuZAotCSAqIGJlY2F1c2UgdGhlIGRldmljZSBoYXMgb2ZmLWNoYW5uZWwgcmVjZXB0aW9uIG9uIGNoYWluIEEuCi0JICovCi0JLnNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBBTlRfQkMsCi19OwotCi0vKiBNb2R1bGUgZmlybXdhcmUgKi8KLU1PRFVMRV9GSVJNV0FSRShJV0w0OTY1X01PRFVMRV9GSVJNV0FSRShJV0w0OTY1X1VDT0RFX0FQSV9NQVgpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY4MTYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF80OTY1X2hfXwotI2RlZmluZSBfX2l3bF80OTY1X2hfXwotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotCi0vKiBjb25maWd1cmF0aW9uIGZvciB0aGUgXzQ5NjUgZGV2aWNlcyAqLwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDQ5NjVfY2ZnOwotCi1leHRlcm4gc3RydWN0IGl3bF9tb2RfcGFyYW1zIGl3bDQ5NjVfbW9kX3BhcmFtczsKLQotZXh0ZXJuIHN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bDQ5NjVfaHdfb3BzOwotCi0vKiB0eCBxdWV1ZSAqLwotdm9pZCBpd2w0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKTsKLQotLyogUlhPTiAqLwotdm9pZCBpd2w0OTY1X3NldF9yeG9uX2NoYWluKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLQotLyogdUNvZGUgKi8KLWludCBpd2w0OTY1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKiBsaWIgKi8KLXZvaWQgaXdsNDk2NV9jaGVja19hYm9ydF9zdGF0dXMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHU4IGZyYW1lX2NvdW50LCB1MzIgc3RhdHVzKTsKLQotdm9pZCBpd2w0OTY1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKTsKLWludCBpd2w0OTY1X3J4X2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEpOwotaW50IGl3bDQ5NjVfaHdfbmljX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2w0OTY1X2R1bXBfZmgoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOwotCi0vKiByeCAqLwotdm9pZCBpd2w0OTY1X3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsNDk2NV9yeF9yZXBsZW5pc2goc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bDQ5NjVfcnhfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSk7Ci1pbnQgaXdsNDk2NV9yeHFfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bDQ5NjVfaHdyYXRlX3RvX21hYzgwMjExX2lkeCh1MzIgcmF0ZV9uX2ZsYWdzLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpOwotdm9pZCBpd2w0OTY1X3J4X3JlcGx5X3J4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfcnhfcGh5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDQ5NjVfcnhfaGFuZGxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qIHR4ICovCi12b2lkIGl3bDQ5NjVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKLWludCBpd2w0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLCB1OCByZXNldCwgdTggcGFkKTsKLWludCBpd2w0OTY1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7Ci12b2lkIGl3bDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmF0ZV9uX2ZsYWdzLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvKTsKLWludCBpd2w0OTY1X3R4X3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IGl3bDQ5NjVfdHhfYWdnX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuKTsKLWludCBpd2w0OTY1X3R4X2FnZ19zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpOwotaW50IGl3bDQ5NjVfdHhxX2NoZWNrX2VtcHR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIGludCBzdGFfaWQsIHU4IHRpZCwgaW50IHR4cV9pZCk7Ci12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfY29tcHJlc3NlZF9iYShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotaW50IGl3bDQ5NjVfdHhfcXVldWVfcmVjbGFpbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIGludCBpbmRleCk7Ci12b2lkIGl3bDQ5NjVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsNDk2NV90eHFfY3R4X2FsbG9jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bDQ5NjVfdHhxX2N0eF9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X3R4cV9jdHhfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X3R4cV9zZXRfc2NoZWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgbWFzayk7Ci0KLS8qCi0gKiBBY3F1aXJlIHByaXYtPmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhCi0gKi8KLXZvaWQgaXdsNDk2NV9zZXRfd3JfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIHUzMiBpbmRleCk7Ci0vKioKLSAqIGl3bDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyAtIChvcHRpb25hbGx5KSBzdGFydCBUeC9DbWQgcXVldWUKLSAqIEB0eF9maWZvX2lkOiBUeCBETUEvRklGTyBjaGFubmVsIChyYW5nZSAwLTcpIHRoYXQgdGhlIHF1ZXVlIHdpbGwgZmVlZAotICogQHNjZF9yZXRyeTogKDEpIEluZGljYXRlcyBxdWV1ZSB3aWxsIGJlIHVzZWQgaW4gYWdncmVnYXRpb24gbW9kZQotICoKLSAqIE5PVEU6ICBBY3F1aXJlIHByaXYtPmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhCi0gKi8KLXZvaWQgaXdsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkJCQlpbnQgdHhfZmlmb19pZCwgaW50IHNjZF9yZXRyeSk7Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGl3bDQ5NjVfdHhfc3RhdHVzX3RvX21hYzgwMjExKHUzMiBzdGF0dXMpCi17Ci0Jc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7Ci0KLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgVFhfU1RBVFVTX1NVQ0NFU1M6Ci0JY2FzZSBUWF9TVEFUVVNfRElSRUNUX0RPTkU6Ci0JCXJldHVybiBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7Ci0JY2FzZSBUWF9TVEFUVVNfRkFJTF9ERVNUX1BTOgotCQlyZXR1cm4gSUVFRTgwMjExX1RYX1NUQVRfVFhfRklMVEVSRUQ7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXdsNDk2NV9pc190eF9zdWNjZXNzKHUzMiBzdGF0dXMpCi17Ci0Jc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7Ci0JcmV0dXJuIChzdGF0dXMgPT0gVFhfU1RBVFVTX1NVQ0NFU1MpIHx8Ci0JICAgICAgIChzdGF0dXMgPT0gVFhfU1RBVFVTX0RJUkVDVF9ET05FKTsKLX0KLQotdTggaXdsNDk2NV90b2dnbGVfdHhfYW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYW50X2lkeCwgdTggdmFsaWQpOwotCi0vKiByeCAqLwotdm9pZCBpd2w0OTY1X3J4X21pc3NlZF9iZWFjb25fbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLWJvb2wgaXdsNDk2NV9nb29kX3BsY3BfaGVhbHRoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCk7Ci12b2lkIGl3bDQ5NjVfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDQ5NjVfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLQotLyogc2NhbiAqLwotaW50IGl3bDQ5NjVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci0KLS8qIHN0YXRpb24gbWdtdCAqLwotaW50IGl3bDQ5NjVfbWFuYWdlX2lic3Nfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBhZGQpOwotCi0vKiBoY21kICovCi1pbnQgaXdsNDk2NV9zZW5kX2JlYWNvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotY29uc3QgY2hhciAqaXdsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKLWl3bDQ5NjVfZ2V0X3R4X2ZhaWxfcmVhc29uKHUzMiBzdGF0dXMpIHsgcmV0dXJuICIiOyB9Ci0jZW5kaWYKLQotLyogc3RhdGlvbiBtYW5hZ2VtZW50ICovCi1pbnQgaXdsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLWludCBpd2w0OTY1X2FkZF9ic3NpZF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgICBjb25zdCB1OCAqYWRkciwgdTggKnN0YV9pZF9yKTsKLWludCBpd2w0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKLWludCBpd2w0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKLWludCBpd2w0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotaW50IGl3bDQ5NjVfc2V0X2R5bmFtaWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksIHU4IHN0YV9pZCk7Ci1pbnQgaXdsNDk2NV9yZW1vdmVfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgdTggc3RhX2lkKTsKLXZvaWQgaXdsNDk2NV91cGRhdGVfdGtpcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpOwotaW50IGl3bDQ5NjVfc3RhX3R4X21vZGlmeV9lbmFibGVfdGlkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCWludCBzdGFfaWQsIGludCB0aWQpOwotaW50IGl3bDQ5NjVfc3RhX3J4X2FnZ19zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkgaW50IHRpZCwgdTE2IHNzbik7Ci1pbnQgaXdsNDk2NV9zdGFfcnhfYWdnX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJaW50IHRpZCk7Ci12b2lkIGl3bDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlpbnQgc3RhX2lkLCBpbnQgY250KTsKLWludCBpd2w0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKiByYXRlICovCi1zdGF0aWMgaW5saW5lIHUzMiBpd2w0OTY1X2FudF9pZHhfdG9fZmxhZ3ModTggYW50X2lkeCkKLXsKLQlyZXR1cm4gQklUKGFudF9pZHgpIDw8IFJBVEVfTUNTX0FOVF9QT1M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggaXdsNDk2NV9od19nZXRfcmF0ZShfX2xlMzIgcmF0ZV9uX2ZsYWdzKQotewotCXJldHVybiBsZTMyX3RvX2NwdShyYXRlX25fZmxhZ3MpICYgMHhGRjsKLX0KLQotc3RhdGljIGlubGluZSBfX2xlMzIgaXdsNDk2NV9od19zZXRfcmF0ZV9uX2ZsYWdzKHU4IHJhdGUsIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMzIoZmxhZ3N8KHUzMilyYXRlKTsKLX0KLQotLyogZWVwcm9tICovCi12b2lkIGl3bDQ5NjVfZWVwcm9tX2dldF9tYWMoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCAqbWFjKTsKLWludCBpd2w0OTY1X2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50ICBpd2w0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qIG1hYzgwMjExIGhhbmRsZXJzIChmb3IgNDk2NSkgKi8KLXZvaWQgaXdsNDk2NV9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IGl3bDQ5NjVfbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLXZvaWQgaXdsNDk2NV9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci12b2lkIGl3bDQ5NjVfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCi0JCQkgICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCi0JCQkgICAgIHU2NCBtdWx0aWNhc3QpOwotaW50IGl3bDQ5NjVfbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7Ci12b2lkIGl3bDQ5NjVfbWFjX3VwZGF0ZV90a2lwX2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQl1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpOwotaW50IGl3bDQ5NjVfbWFjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbiwKLQkJCSAgICB1OCBidWZfc2l6ZSk7Ci1pbnQgaXdsNDk2NV9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKLXZvaWQgaXdsNDk2NV9tYWNfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKTsKLQotI2VuZGlmIC8qIF9faXdsXzQ5NjVfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29tbWFuZHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb21tYW5kcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTkwNDA1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb21tYW5kcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLWNvbW1hbmRzLmgpIG9ubHkgZm9yIHVDb2RlIEFQSSBkZWZpbml0aW9ucy4KLSAqIFBsZWFzZSB1c2UgaXdsLXh4eHgtaHcuaCBmb3IgaGFyZHdhcmUtcmVsYXRlZCBkZWZpbml0aW9ucy4KLSAqIFBsZWFzZSB1c2UgaXdsLWRldi5oIGZvciBkcml2ZXIgaW1wbGVtZW50YXRpb24gZGVmaW5pdGlvbnMuCi0gKi8KLQotI2lmbmRlZiBfX2l3bF9sZWdhY3lfY29tbWFuZHNfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9jb21tYW5kc19oX18KLQotc3RydWN0IGl3bF9wcml2OwotCi0vKiB1Q29kZSB2ZXJzaW9uIGNvbnRhaW5zIDQgdmFsdWVzOiBNYWpvci9NaW5vci9BUEkvU2VyaWFsICovCi0jZGVmaW5lIElXTF9VQ09ERV9NQUpPUih2ZXIpCSgoKHZlcikgJiAweEZGMDAwMDAwKSA+PiAyNCkKLSNkZWZpbmUgSVdMX1VDT0RFX01JTk9SKHZlcikJKCgodmVyKSAmIDB4MDBGRjAwMDApID4+IDE2KQotI2RlZmluZSBJV0xfVUNPREVfQVBJKHZlcikJKCgodmVyKSAmIDB4MDAwMEZGMDApID4+IDgpCi0jZGVmaW5lIElXTF9VQ09ERV9TRVJJQUwodmVyKQkoKHZlcikgJiAweDAwMDAwMEZGKQotCi0KLS8qIFR4IHJhdGVzICovCi0jZGVmaW5lIElXTF9DQ0tfUkFURVMJNAotI2RlZmluZSBJV0xfT0ZETV9SQVRFUwk4Ci0jZGVmaW5lIElXTF9NQVhfUkFURVMJKElXTF9DQ0tfUkFURVMgKyBJV0xfT0ZETV9SQVRFUykKLQotZW51bSB7Ci0JUkVQTFlfQUxJVkUgPSAweDEsCi0JUkVQTFlfRVJST1IgPSAweDIsCi0KLQkvKiBSWE9OIGFuZCBRT1MgY29tbWFuZHMgKi8KLQlSRVBMWV9SWE9OID0gMHgxMCwKLQlSRVBMWV9SWE9OX0FTU09DID0gMHgxMSwKLQlSRVBMWV9RT1NfUEFSQU0gPSAweDEzLAotCVJFUExZX1JYT05fVElNSU5HID0gMHgxNCwKLQotCS8qIE11bHRpLVN0YXRpb24gc3VwcG9ydCAqLwotCVJFUExZX0FERF9TVEEgPSAweDE4LAotCVJFUExZX1JFTU9WRV9TVEEgPSAweDE5LAotCi0JLyogU2VjdXJpdHkgKi8KLQlSRVBMWV9XRVBLRVkgPSAweDIwLAotCi0JLyogUlgsIFRYLCBMRURzICovCi0JUkVQTFlfMzk0NV9SWCA9IDB4MWIsICAgICAgICAgICAvKiAzOTQ1IG9ubHkgKi8KLQlSRVBMWV9UWCA9IDB4MWMsCi0JUkVQTFlfUkFURV9TQ0FMRSA9IDB4NDcsCS8qIDM5NDUgb25seSAqLwotCVJFUExZX0xFRFNfQ01EID0gMHg0OCwKLQlSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSwgLyogZm9yIDQ5NjUgYW5kIHVwICovCi0KLQkvKiA4MDIuMTFoIHJlbGF0ZWQgKi8KLQlSRVBMWV9DSEFOTkVMX1NXSVRDSCA9IDB4NzIsCi0JQ0hBTk5FTF9TV0lUQ0hfTk9USUZJQ0FUSU9OID0gMHg3MywKLQlSRVBMWV9TUEVDVFJVTV9NRUFTVVJFTUVOVF9DTUQgPSAweDc0LAotCVNQRUNUUlVNX01FQVNVUkVfTk9USUZJQ0FUSU9OID0gMHg3NSwKLQotCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KLQlQT1dFUl9UQUJMRV9DTUQgPSAweDc3LAotCVBNX1NMRUVQX05PVElGSUNBVElPTiA9IDB4N0EsCi0JUE1fREVCVUdfU1RBVElTVElDX05PVElGSUMgPSAweDdCLAotCi0JLyogU2NhbiBjb21tYW5kcyBhbmQgbm90aWZpY2F0aW9ucyAqLwotCVJFUExZX1NDQU5fQ01EID0gMHg4MCwKLQlSRVBMWV9TQ0FOX0FCT1JUX0NNRCA9IDB4ODEsCi0JU0NBTl9TVEFSVF9OT1RJRklDQVRJT04gPSAweDgyLAotCVNDQU5fUkVTVUxUU19OT1RJRklDQVRJT04gPSAweDgzLAotCVNDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OID0gMHg4NCwKLQotCS8qIElCU1MvQVAgY29tbWFuZHMgKi8KLQlCRUFDT05fTk9USUZJQ0FUSU9OID0gMHg5MCwKLQlSRVBMWV9UWF9CRUFDT04gPSAweDkxLAotCi0JLyogTWlzY2VsbGFuZW91cyBjb21tYW5kcyAqLwotCVJFUExZX1RYX1BXUl9UQUJMRV9DTUQgPSAweDk3LAotCi0JLyogQmx1ZXRvb3RoIGRldmljZSBjb2V4aXN0ZW5jZSBjb25maWcgY29tbWFuZCAqLwotCVJFUExZX0JUX0NPTkZJRyA9IDB4OWIsCi0KLQkvKiBTdGF0aXN0aWNzICovCi0JUkVQTFlfU1RBVElTVElDU19DTUQgPSAweDljLAotCVNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OID0gMHg5ZCwKLQotCS8qIFJGLUtJTEwgY29tbWFuZHMgYW5kIG5vdGlmaWNhdGlvbnMgKi8KLQlDQVJEX1NUQVRFX05PVElGSUNBVElPTiA9IDB4YTEsCi0KLQkvKiBNaXNzZWQgYmVhY29ucyBub3RpZmljYXRpb24gKi8KLQlNSVNTRURfQkVBQ09OU19OT1RJRklDQVRJT04gPSAweGEyLAotCi0JUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EID0gMHhhNCwKLQlTRU5TSVRJVklUWV9DTUQgPSAweGE4LAotCVJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQgPSAweGIwLAotCVJFUExZX1JYX1BIWV9DTUQgPSAweGMwLAotCVJFUExZX1JYX01QRFVfQ01EID0gMHhjMSwKLQlSRVBMWV9SWCA9IDB4YzMsCi0JUkVQTFlfQ09NUFJFU1NFRF9CQSA9IDB4YzUsCi0KLQlSRVBMWV9NQVggPSAweGZmCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoMCkKLSAqIENvbW1vbmx5IHVzZWQgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnM6Ci0gKiBDb21tYW5kIGhlYWRlciwgcmF0ZV9uX2ZsYWdzLCB0eHBvd2VyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBpd2xfY21kX2hlYWRlciBmbGFncyB2YWx1ZSAqLwotI2RlZmluZSBJV0xfQ01EX0ZBSUxFRF9NU0sgMHg0MAotCi0jZGVmaW5lIFNFUV9UT19RVUVVRShzKQkoKChzKSA+PiA4KSAmIDB4MWYpCi0jZGVmaW5lIFFVRVVFX1RPX1NFUShxKQkoKChxKSAmIDB4MWYpIDw8IDgpCi0jZGVmaW5lIFNFUV9UT19JTkRFWChzKQkoKHMpICYgMHhmZikKLSNkZWZpbmUgSU5ERVhfVE9fU0VRKGkpCSgoaSkgJiAweGZmKQotI2RlZmluZSBTRVFfSFVHRV9GUkFNRQljcHVfdG9fbGUxNigweDQwMDApCi0jZGVmaW5lIFNFUV9SWF9GUkFNRQljcHVfdG9fbGUxNigweDgwMDApCi0KLS8qKgotICogc3RydWN0IGl3bF9jbWRfaGVhZGVyCi0gKgotICogVGhpcyBoZWFkZXIgZm9ybWF0IGFwcGVhcnMgaW4gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGNvbW1hbmQgc2VudCBmcm9tIHRoZQotICogZHJpdmVyLCBhbmQgZWFjaCByZXNwb25zZS9ub3RpZmljYXRpb24gcmVjZWl2ZWQgZnJvbSB1Q29kZS4KLSAqLwotc3RydWN0IGl3bF9jbWRfaGVhZGVyIHsKLQl1OCBjbWQ7CQkvKiBDb21tYW5kIElEOiAgUkVQTFlfUlhPTiwgZXRjLiAqLwotCXU4IGZsYWdzOwkvKiAwOjUgcmVzZXJ2ZWQsIDYgYWJvcnQsIDcgaW50ZXJuYWwgKi8KLQkvKgotCSAqIFRoZSBkcml2ZXIgc2V0cyB1cCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIHZhbHVlcyBvZiBpdHMgY2hvb3NpbmcuCi0JICogdUNvZGUgZG9lcyBub3QgdXNlIHRoaXMgdmFsdWUsIGJ1dCBwYXNzZXMgaXQgYmFjayB0byB0aGUgZHJpdmVyCi0JICogd2hlbiBzZW5kaW5nIHRoZSByZXNwb25zZSB0byBlYWNoIGRyaXZlci1vcmlnaW5hdGVkIGNvbW1hbmQsIHNvCi0JICogdGhlIGRyaXZlciBjYW4gbWF0Y2ggdGhlIHJlc3BvbnNlIHRvIHRoZSBjb21tYW5kLiAgU2luY2UgdGhlIHZhbHVlcwotCSAqIGRvbid0IGdldCB1c2VkIGJ5IHVDb2RlLCB0aGUgZHJpdmVyIG1heSBzZXQgdXAgYW4gYXJiaXRyYXJ5IGZvcm1hdC4KLQkgKgotCSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb246ICB1Q29kZSBzZXRzIGJpdCAxNSB3aGVuIGl0IG9yaWdpbmF0ZXMKLQkgKiB0aGUgcmVzcG9uc2Uvbm90aWZpY2F0aW9uLCBpLmUuIHdoZW4gdGhlIHJlc3BvbnNlL25vdGlmaWNhdGlvbgotCSAqIGlzIG5vdCBhIGRpcmVjdCByZXNwb25zZSB0byBhIGNvbW1hbmQgc2VudCBieSB0aGUgZHJpdmVyLiAgRm9yCi0JICogZXhhbXBsZSwgdUNvZGUgaXNzdWVzIFJFUExZXzM5NDVfUlggd2hlbiBpdCBzZW5kcyBhIHJlY2VpdmVkIGZyYW1lCi0JICogdG8gdGhlIGRyaXZlcjsgaXQgaXMgbm90IGEgZGlyZWN0IHJlc3BvbnNlIHRvIGFueSBkcml2ZXIgY29tbWFuZC4KLQkgKgotCSAqIFRoZSBMaW51eCBkcml2ZXIgdXNlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLQkgKgotCSAqICAwOjcJCXRmZCBpbmRleCAtIHBvc2l0aW9uIHdpdGhpbiBUWCBxdWV1ZQotCSAqICA4OjEyCVRYIHF1ZXVlIGlkCi0JICogIDEzCQlyZXNlcnZlZAotCSAqICAxNAkJaHVnZSAtIGRyaXZlciBzZXRzIHRoaXMgdG8gaW5kaWNhdGUgY29tbWFuZCBpcyBpbiB0aGUKLQkgKiAgCQknaHVnZScgc3RvcmFnZSBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGJ1ZmZlcnMKLQkgKiAgMTUJCXVuc29saWNpdGVkIFJYIG9yIHVDb2RlLW9yaWdpbmF0ZWQgbm90aWZpY2F0aW9uCi0JKi8KLQlfX2xlMTYgc2VxdWVuY2U7Ci0KLQkvKiBjb21tYW5kIG9yIHJlc3BvbnNlL25vdGlmaWNhdGlvbiBkYXRhIGZvbGxvd3MgaW1tZWRpYXRlbHkgKi8KLQl1OCBkYXRhWzBdOwotfSBfX3BhY2tlZDsKLQotCi0vKioKLSAqIHN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyCi0gKgotICogVXNlZCBpbiBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELCBSRVBMWV9TQ0FOX0NNRCwgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gKLSAqCi0gKiBFYWNoIGVudHJ5IGNvbnRhaW5zIHR3byB2YWx1ZXM6Ci0gKiAxKSAgRFNQIGdhaW4gKG9yIHNvbWV0aW1lcyBjYWxsZWQgRFNQIGF0dGVudWF0aW9uKS4gIFRoaXMgaXMgYSBmaW5lLWdyYWluZWQKLSAqICAgICBsaW5lYXIgdmFsdWUgdGhhdCBtdWx0aXBsaWVzIHRoZSBvdXRwdXQgb2YgdGhlIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciwKLSAqICAgICBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgYW5hbG9nIHJhZGlvLgotICogMikgIFJhZGlvIGdhaW4uICBUaGlzIHNldHMgdGhlIGFuYWxvZyBnYWluIG9mIHRoZSByYWRpbyBUeCBwYXRoLgotICogICAgIEl0IGlzIGEgY29hcnNlciBzZXR0aW5nLCBhbmQgYmVoYXZlcyBpbiBhIGxvZ2FyaXRobWljIChkQikgZmFzaGlvbi4KLSAqCi0gKiBEcml2ZXIgb2J0YWlucyB2YWx1ZXMgZnJvbSBzdHJ1Y3QgaXdsMzk0NV90eF9wb3dlciBwb3dlcl9nYWluX3RhYmxlW11bXS4KLSAqLwotc3RydWN0IGl3bDM5NDVfdHhfcG93ZXIgewotCXU4IHR4X2dhaW47CQkvKiBnYWluIGZvciBhbmFsb2cgcmFkaW8gKi8KLQl1OCBkc3BfYXR0ZW47CQkvKiBnYWluIGZvciBEU1AgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogc3RydWN0IGl3bDM5NDVfcG93ZXJfcGVyX3JhdGUKLSAqCi0gKiBVc2VkIGluIFJFUExZX1RYX1BXUl9UQUJMRV9DTUQsIFJFUExZX0NIQU5ORUxfU1dJVENICi0gKi8KLXN0cnVjdCBpd2wzOTQ1X3Bvd2VyX3Blcl9yYXRlIHsKLQl1OCByYXRlOwkJLyogcGxjcCAqLwotCXN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyIHRwYzsKLQl1OCByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogaXdsNDk2NSByYXRlX25fZmxhZ3MgYml0IGZpZWxkcwotICoKLSAqIHJhdGVfbl9mbGFncyBmb3JtYXQgaXMgdXNlZCBpbiBmb2xsb3dpbmcgaXdsNDk2NSBjb21tYW5kczoKLSAqICBSRVBMWV9SWCAocmVzcG9uc2Ugb25seSkKLSAqICBSRVBMWV9SWF9NUERVIChyZXNwb25zZSBvbmx5KQotICogIFJFUExZX1RYIChib3RoIGNvbW1hbmQgYW5kIHJlc3BvbnNlKQotICogIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQKLSAqCi0gKiBIaWdoLXRocm91Z2hwdXQgKEhUKSByYXRlIGZvcm1hdCBmb3IgYml0cyA3OjAgKGJpdCA4IG11c3QgYmUgIjEiKToKLSAqICAyLTA6ICAwKSAgIDYgTWJwcwotICogICAgICAgIDEpICAxMiBNYnBzCi0gKiAgICAgICAgMikgIDE4IE1icHMKLSAqICAgICAgICAzKSAgMjQgTWJwcwotICogICAgICAgIDQpICAzNiBNYnBzCi0gKiAgICAgICAgNSkgIDQ4IE1icHMKLSAqICAgICAgICA2KSAgNTQgTWJwcwotICogICAgICAgIDcpICA2MCBNYnBzCi0gKgotICogIDQtMzogIDApICBTaW5nbGUgc3RyZWFtIChTSVNPKQotICogICAgICAgIDEpICBEdWFsIHN0cmVhbSAoTUlNTykKLSAqICAgICAgICAyKSAgVHJpcGxlIHN0cmVhbSAoTUlNTykKLSAqCi0gKiAgICA1OiAgVmFsdWUgb2YgMHgyMCBpbiBiaXRzIDc6MCBpbmRpY2F0ZXMgNiBNYnBzIEhUNDAgZHVwbGljYXRlIGRhdGEKLSAqCi0gKiBMZWdhY3kgT0ZETSByYXRlIGZvcm1hdCBmb3IgYml0cyA3OjAgKGJpdCA4IG11c3QgYmUgIjAiLCBiaXQgOSAiMCIpOgotICogIDMtMDogIDB4RCkgICA2IE1icHMKLSAqICAgICAgICAweEYpICAgOSBNYnBzCi0gKiAgICAgICAgMHg1KSAgMTIgTWJwcwotICogICAgICAgIDB4NykgIDE4IE1icHMKLSAqICAgICAgICAweDkpICAyNCBNYnBzCi0gKiAgICAgICAgMHhCKSAgMzYgTWJwcwotICogICAgICAgIDB4MSkgIDQ4IE1icHMKLSAqICAgICAgICAweDMpICA1NCBNYnBzCi0gKgotICogTGVnYWN5IENDSyByYXRlIGZvcm1hdCBmb3IgYml0cyA3OjAgKGJpdCA4IG11c3QgYmUgIjAiLCBiaXQgOSAiMSIpOgotICogIDYtMDogICAxMCkgIDEgTWJwcwotICogICAgICAgICAyMCkgIDIgTWJwcwotICogICAgICAgICA1NSkgIDUuNSBNYnBzCi0gKiAgICAgICAgMTEwKSAgMTEgTWJwcwotICovCi0jZGVmaW5lIFJBVEVfTUNTX0NPREVfTVNLIDB4NwotI2RlZmluZSBSQVRFX01DU19TUEFUSUFMX1BPUyAzCi0jZGVmaW5lIFJBVEVfTUNTX1NQQVRJQUxfTVNLIDB4MTgKLSNkZWZpbmUgUkFURV9NQ1NfSFRfRFVQX1BPUyA1Ci0jZGVmaW5lIFJBVEVfTUNTX0hUX0RVUF9NU0sgMHgyMAotCi0vKiBCaXQgODogKDEpIEhUIGZvcm1hdCwgKDApIGxlZ2FjeSBmb3JtYXQgaW4gYml0cyA3OjAgKi8KLSNkZWZpbmUgUkFURV9NQ1NfRkxBR1NfUE9TIDgKLSNkZWZpbmUgUkFURV9NQ1NfSFRfUE9TIDgKLSNkZWZpbmUgUkFURV9NQ1NfSFRfTVNLIDB4MTAwCi0KLS8qIEJpdCA5OiAoMSkgQ0NLLCAoMCkgT0ZETS4gIEhUIChiaXQgOCkgbXVzdCBiZSAiMCIgZm9yIHRoaXMgYml0IHRvIGJlIHZhbGlkICovCi0jZGVmaW5lIFJBVEVfTUNTX0NDS19QT1MgOQotI2RlZmluZSBSQVRFX01DU19DQ0tfTVNLIDB4MjAwCi0KLS8qIEJpdCAxMDogKDEpIFVzZSBHcmVlbiBGaWVsZCBwcmVhbWJsZSAqLwotI2RlZmluZSBSQVRFX01DU19HRl9QT1MgMTAKLSNkZWZpbmUgUkFURV9NQ1NfR0ZfTVNLIDB4NDAwCi0KLS8qIEJpdCAxMTogKDEpIFVzZSA0ME1oeiBIVDQwIGNobmwgd2lkdGgsICgwKSB1c2UgMjAgTUh6IGxlZ2FjeSBjaG5sIHdpZHRoICovCi0jZGVmaW5lIFJBVEVfTUNTX0hUNDBfUE9TIDExCi0jZGVmaW5lIFJBVEVfTUNTX0hUNDBfTVNLIDB4ODAwCi0KLS8qIEJpdCAxMjogKDEpIER1cGxpY2F0ZSBkYXRhIG9uIGJvdGggMjBNSHogY2hubHMuIEhUNDAgKGJpdCAxMSkgbXVzdCBiZSBzZXQuICovCi0jZGVmaW5lIFJBVEVfTUNTX0RVUF9QT1MgMTIKLSNkZWZpbmUgUkFURV9NQ1NfRFVQX01TSyAweDEwMDAKLQotLyogQml0IDEzOiAoMSkgU2hvcnQgZ3VhcmQgaW50ZXJ2YWwgKDAuNCB1c2VjKSwgKDApIG5vcm1hbCBHSSAoMC44IHVzZWMpICovCi0jZGVmaW5lIFJBVEVfTUNTX1NHSV9QT1MgMTMKLSNkZWZpbmUgUkFURV9NQ1NfU0dJX01TSyAweDIwMDAKLQotLyoqCi0gKiByYXRlX25fZmxhZ3MgVHggYW50ZW5uYSBtYXNrcwotICogNDk2NSBoYXMgMiB0cmFuc21pdHRlcnMKLSAqIGJpdDE0OjE2Ci0gKi8KLSNkZWZpbmUgUkFURV9NQ1NfQU5UX1BPUwkxNAotI2RlZmluZSBSQVRFX01DU19BTlRfQV9NU0sJMHgwNDAwMAotI2RlZmluZSBSQVRFX01DU19BTlRfQl9NU0sJMHgwODAwMAotI2RlZmluZSBSQVRFX01DU19BTlRfQ19NU0sJMHgxMDAwMAotI2RlZmluZSBSQVRFX01DU19BTlRfQUJfTVNLCShSQVRFX01DU19BTlRfQV9NU0sgfCBSQVRFX01DU19BTlRfQl9NU0spCi0jZGVmaW5lIFJBVEVfTUNTX0FOVF9BQkNfTVNLCShSQVRFX01DU19BTlRfQUJfTVNLIHwgUkFURV9NQ1NfQU5UX0NfTVNLKQotI2RlZmluZSBSQVRFX0FOVF9OVU0gMwotCi0jZGVmaW5lIFBPV0VSX1RBQkxFX05VTV9FTlRSSUVTCQkJMzMKLSNkZWZpbmUgUE9XRVJfVEFCTEVfTlVNX0hUX09GRE1fRU5UUklFUwkJMzIKLSNkZWZpbmUgUE9XRVJfVEFCTEVfQ0NLX0VOVFJZCQkJMzIKLQotI2RlZmluZSBJV0xfUFdSX05VTV9IVF9PRkRNX0VOVFJJRVMJCTI0Ci0jZGVmaW5lIElXTF9QV1JfQ0NLX0VOVFJJRVMJCQkyCi0KLS8qKgotICogdW5pb24gaXdsNDk2NV90eF9wb3dlcl9kdWFsX3N0cmVhbQotICoKLSAqIEhvc3QgZm9ybWF0IHVzZWQgZm9yIFJFUExZX1RYX1BXUl9UQUJMRV9DTUQsIFJFUExZX0NIQU5ORUxfU1dJVENICi0gKiBVc2UgX19sZTMyIHZlcnNpb24gKHN0cnVjdCB0eF9wb3dlcl9kdWFsX3N0cmVhbSkgd2hlbiBidWlsZGluZyBjb21tYW5kLgotICoKLSAqIERyaXZlciBwcm92aWRlcyByYWRpbyBnYWluIGFuZCBEU1AgYXR0ZW51YXRpb24gc2V0dGluZ3MgdG8gZGV2aWNlIGluIHBhaXJzLAotICogb25lIHZhbHVlIGZvciBlYWNoIHRyYW5zbWl0dGVyIGNoYWluLiAgVGhlIGZpcnN0IHZhbHVlIGlzIGZvciB0cmFuc21pdHRlciBBLAotICogc2Vjb25kIGZvciB0cmFuc21pdHRlciBCLgotICoKLSAqIEZvciBTSVNPIGJpdCByYXRlcywgYm90aCB2YWx1ZXMgaW4gYSBwYWlyIHNob3VsZCBiZSBpZGVudGljYWwuCi0gKiBGb3IgTUlNTyByYXRlcywgb25lIHZhbHVlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIsCi0gKiBpbiBvcmRlciB0byBiYWxhbmNlIHRoZSBUeCBvdXRwdXQgYmV0d2VlbiB0aGUgdHdvIHRyYW5zbWl0dGVycy4KLSAqCi0gKiBTZWUgbW9yZSBkZXRhaWxzIGluIGRvYyBmb3IgVFhQT1dFUiBpbiBpd2wtNDk2NS1ody5oLgotICovCi11bmlvbiBpd2w0OTY1X3R4X3Bvd2VyX2R1YWxfc3RyZWFtIHsKLQlzdHJ1Y3QgewotCQl1OCByYWRpb190eF9nYWluWzJdOwotCQl1OCBkc3BfcHJlZGlzX2F0dGVuWzJdOwotCX0gczsKLQl1MzIgZHc7Ci19OwotCi0vKioKLSAqIHN0cnVjdCB0eF9wb3dlcl9kdWFsX3N0cmVhbQotICoKLSAqIFRhYmxlIGVudHJpZXMgaW4gUkVQTFlfVFhfUFdSX1RBQkxFX0NNRCwgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gKLSAqCi0gKiBTYW1lIGZvcm1hdCBhcyBpd2xfdHhfcG93ZXJfZHVhbF9zdHJlYW0sIGJ1dCBfX2xlMzIKLSAqLwotc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtIHsKLQlfX2xlMzIgZHc7Ci19IF9fcGFja2VkOwotCi0vKioKLSAqIHN0cnVjdCBpd2w0OTY1X3R4X3Bvd2VyX2RiCi0gKgotICogRW50aXJlIHRhYmxlIHdpdGhpbiBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELCBSRVBMWV9DSEFOTkVMX1NXSVRDSAotICovCi1zdHJ1Y3QgaXdsNDk2NV90eF9wb3dlcl9kYiB7Ci0Jc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtIHBvd2VyX3RibFtQT1dFUl9UQUJMRV9OVU1fRU5UUklFU107Ci19IF9fcGFja2VkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoMGEpCi0gKiBBbGl2ZSBhbmQgRXJyb3IgQ29tbWFuZHMgJiBSZXNwb25zZXM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFVDT0RFX1ZBTElEX09LCWNwdV90b19sZTMyKDB4MSkKLSNkZWZpbmUgSU5JVElBTElaRV9TVUJUWVBFICAgICg5KQotCi0vKgotICogKCJJbml0aWFsaXplIikgUkVQTFlfQUxJVkUgPSAweDEgKHJlc3BvbnNlIG9ubHksIG5vdCBhIGNvbW1hbmQpCi0gKgotICogdUNvZGUgaXNzdWVzIHRoaXMgImluaXRpYWxpemUgYWxpdmUiIG5vdGlmaWNhdGlvbiBvbmNlIHRoZSBpbml0aWFsaXphdGlvbgotICogdUNvZGUgaW1hZ2UgaGFzIGNvbXBsZXRlZCBpdHMgd29yaywgYW5kIGlzIHJlYWR5IHRvIGxvYWQgdGhlIHJ1bnRpbWUgaW1hZ2UuCi0gKiBUaGlzIGlzIHRoZSAqZmlyc3QqICJhbGl2ZSIgbm90aWZpY2F0aW9uIHRoYXQgdGhlIGRyaXZlciB3aWxsIHJlY2VpdmUgYWZ0ZXIKLSAqIHJlYm9vdGluZyB1Q29kZTsgdGhlICJpbml0aWFsaXplIiBhbGl2ZSBpcyBpbmRpY2F0ZWQgYnkgc3VidHlwZSBmaWVsZCA9PSA5LgotICoKLSAqIFNlZSBjb21tZW50cyBkb2N1bWVudGluZyAiQlNNIiAoYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUpLgotICoKLSAqIEZvciA0OTY1LCB0aGlzIG5vdGlmaWNhdGlvbiBjb250YWlucyBpbXBvcnRhbnQgY2FsaWJyYXRpb24gZGF0YSBmb3IKLSAqIGNhbGN1bGF0aW5nIHR4cG93ZXIgc2V0dGluZ3M6Ci0gKgotICogMSkgIFBvd2VyIHN1cHBseSB2b2x0YWdlIGluZGljYXRpb24uICBUaGUgdm9sdGFnZSBzZW5zb3Igb3V0cHV0cyBoaWdoZXIKLSAqICAgICB2YWx1ZXMgZm9yIGxvd2VyIHZvbHRhZ2UsIGFuZCB2aWNlIHZlcnNlLgotICoKLSAqIDIpICBUZW1wZXJhdHVyZSBtZWFzdXJlbWVudCBwYXJhbWV0ZXJzLCBmb3IgZWFjaCBvZiB0d28gY2hhbm5lbCB3aWR0aHMKLSAqICAgICAoMjAgTUh6IGFuZCA0MCBNSHopIHN1cHBvcnRlZCBieSB0aGUgcmFkaW9zLiAgVGVtcGVyYXR1cmUgc2Vuc2luZwotICogICAgIGlzIGRvbmUgdmlhIG9uZSBvZiB0aGUgcmVjZWl2ZXIgY2hhaW5zLCBhbmQgY2hhbm5lbCB3aWR0aCBpbmZsdWVuY2VzCi0gKiAgICAgdGhlIHJlc3VsdHMuCi0gKgotICogMykgIFR4IGdhaW4gY29tcGVuc2F0aW9uIHRvIGJhbGFuY2UgNDk2NSdzIDIgVHggY2hhaW5zIGZvciBNSU1PIG9wZXJhdGlvbiwKLSAqICAgICBmb3IgZWFjaCBvZiA1IGZyZXF1ZW5jeSByYW5nZXMuCi0gKi8KLXN0cnVjdCBpd2xfaW5pdF9hbGl2ZV9yZXNwIHsKLQl1OCB1Y29kZV9taW5vcjsKLQl1OCB1Y29kZV9tYWpvcjsKLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCXU4IHN3X3Jldls4XTsKLQl1OCB2ZXJfdHlwZTsKLQl1OCB2ZXJfc3VidHlwZTsJCS8qICI5IiBmb3IgaW5pdGlhbGl6ZSBhbGl2ZSAqLwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JX19sZTMyIGxvZ19ldmVudF90YWJsZV9wdHI7Ci0JX19sZTMyIGVycm9yX2V2ZW50X3RhYmxlX3B0cjsKLQlfX2xlMzIgdGltZXN0YW1wOwotCV9fbGUzMiBpc192YWxpZDsKLQotCS8qIGNhbGlicmF0aW9uIHZhbHVlcyBmcm9tICJpbml0aWFsaXplIiB1Q29kZSAqLwotCV9fbGUzMiB2b2x0YWdlOwkJLyogc2lnbmVkLCBoaWdoZXIgdmFsdWUgaXMgbG93ZXIgdm9sdGFnZSAqLwotCV9fbGUzMiB0aGVybV9yMVsyXTsJLyogc2lnbmVkLCAxc3QgZm9yIG5vcm1hbCwgMm5kIGZvciBIVDQwICovCi0JX19sZTMyIHRoZXJtX3IyWzJdOwkvKiBzaWduZWQgKi8KLQlfX2xlMzIgdGhlcm1fcjNbMl07CS8qIHNpZ25lZCAqLwotCV9fbGUzMiB0aGVybV9yNFsyXTsJLyogc2lnbmVkICovCi0JX19sZTMyIHR4X2F0dGVuWzVdWzJdOwkvKiBzaWduZWQgTUlNTyBnYWluIGNvbXAsIDUgZnJlcSBncm91cHMsCi0JCQkJICogMiBUeCBjaGFpbnMgKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyoqCi0gKiBSRVBMWV9BTElWRSA9IDB4MSAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKLSAqCi0gKiB1Q29kZSBpc3N1ZXMgdGhpcyAiYWxpdmUiIG5vdGlmaWNhdGlvbiBvbmNlIHRoZSBydW50aW1lIGltYWdlIGlzIHJlYWR5Ci0gKiB0byByZWNlaXZlIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlci4gIFRoaXMgaXMgdGhlICpzZWNvbmQqICJhbGl2ZSIKLSAqIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBkcml2ZXIgd2lsbCByZWNlaXZlIGFmdGVyIHJlYm9vdGluZyB1Q29kZTsKLSAqIHRoaXMgImFsaXZlIiBpcyBpbmRpY2F0ZWQgYnkgc3VidHlwZSBmaWVsZCAhPSA5LgotICoKLSAqIFNlZSBjb21tZW50cyBkb2N1bWVudGluZyAiQlNNIiAoYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUpLgotICoKLSAqIFRoaXMgcmVzcG9uc2UgaW5jbHVkZXMgdHdvIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgd2l0aGluIHRoZSBkZXZpY2UncwotICogZGF0YSBTUkFNIChhY2Nlc3MgdmlhIEhCVVNfVEFSR19NRU1fKiByZWdzKSB0aGF0IGFyZSB1c2VmdWwgZm9yIGRlYnVnZ2luZzoKLSAqCi0gKiAxKSAgbG9nX2V2ZW50X3RhYmxlX3B0ciBpbmRpY2F0ZXMgYmFzZSBvZiB0aGUgZXZlbnQgbG9nLiAgVGhpcyB0cmFjZXMKLSAqICAgICBhIDI1Ni1lbnRyeSBoaXN0b3J5IG9mIHVDb2RlIGV4ZWN1dGlvbiB3aXRoaW4gYSBjaXJjdWxhciBidWZmZXIuCi0gKiAgICAgSXRzIGhlYWRlciBmb3JtYXQgaXM6Ci0gKgotICoJX19sZTMyIGxvZ19zaXplOyAgICAgbG9nIGNhcGFjaXR5IChpbiBudW1iZXIgb2YgZW50cmllcykKLSAqCV9fbGUzMiB0eXBlOyAgICAgICAgICgxKSB0aW1lc3RhbXAgd2l0aCBlYWNoIGVudHJ5LCAoMCkgbm8gdGltZXN0YW1wCi0gKglfX2xlMzIgd3JhcHM7ICAgICAgICAjIHRpbWVzIHVDb2RlIGhhcyB3cmFwcGVkIHRvIHRvcCBvZiBjaXJjdWxhciBidWZmZXIKLSAqICAgICAgX19sZTMyIHdyaXRlX2luZGV4OyAgbmV4dCBjaXJjdWxhciBidWZmZXIgZW50cnkgdGhhdCB1Q29kZSB3b3VsZCBmaWxsCi0gKgotICogICAgIFRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgdGhlIGNpcmN1bGFyIGJ1ZmZlciBvZiBsb2cgZW50cmllcy4gIEVudHJpZXMKLSAqICAgICB3aXRoIHRpbWVzdGFtcHMgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLSAqCi0gKglfX2xlMzIgZXZlbnRfaWQ7ICAgICByYW5nZSAwIC0gMTUwMAotICoJX19sZTMyIHRpbWVzdGFtcDsgICAgbG93IDMyIGJpdHMgb2YgVFNGIChvZiBuZXR3b3JrLCBpZiBhc3NvY2lhdGVkKQotICoJX19sZTMyIGRhdGE7ICAgICAgICAgZXZlbnRfaWQtc3BlY2lmaWMgZGF0YSB2YWx1ZQotICoKLSAqICAgICBFbnRyaWVzIHdpdGhvdXQgdGltZXN0YW1wcyBjb250YWluIG9ubHkgZXZlbnRfaWQgYW5kIGRhdGEuCi0gKgotICoKLSAqIDIpICBlcnJvcl9ldmVudF90YWJsZV9wdHIgaW5kaWNhdGVzIGJhc2Ugb2YgdGhlIGVycm9yIGxvZy4gIFRoaXMgY29udGFpbnMKLSAqICAgICBpbmZvcm1hdGlvbiBhYm91dCBhbnkgdUNvZGUgZXJyb3IgdGhhdCBvY2N1cnMuICBGb3IgNDk2NSwgdGhlIGZvcm1hdAotICogICAgIG9mIHRoZSBlcnJvciBsb2cgaXM6Ci0gKgotICoJX19sZTMyIHZhbGlkOyAgICAgICAgKG5vbnplcm8pIHZhbGlkLCAoMCkgbG9nIGlzIGVtcHR5Ci0gKglfX2xlMzIgZXJyb3JfaWQ7ICAgICB0eXBlIG9mIGVycm9yCi0gKglfX2xlMzIgcGM7ICAgICAgICAgICBwcm9ncmFtIGNvdW50ZXIKLSAqCV9fbGUzMiBibGluazE7ICAgICAgIGJyYW5jaCBsaW5rCi0gKglfX2xlMzIgYmxpbmsyOyAgICAgICBicmFuY2ggbGluawotICoJX19sZTMyIGlsaW5rMTsgICAgICAgaW50ZXJydXB0IGxpbmsKLSAqCV9fbGUzMiBpbGluazI7ICAgICAgIGludGVycnVwdCBsaW5rCi0gKglfX2xlMzIgZGF0YTE7ICAgICAgICBlcnJvci1zcGVjaWZpYyBkYXRhCi0gKglfX2xlMzIgZGF0YTI7ICAgICAgICBlcnJvci1zcGVjaWZpYyBkYXRhCi0gKglfX2xlMzIgbGluZTsgICAgICAgICBzb3VyY2UgY29kZSBsaW5lIG9mIGVycm9yCi0gKglfX2xlMzIgYmNvbl90aW1lOyAgICBiZWFjb24gdGltZXIKLSAqCV9fbGUzMiB0c2ZfbG93OyAgICAgIG5ldHdvcmsgdGltZXN0YW1wIGZ1bmN0aW9uIHRpbWVyCi0gKglfX2xlMzIgdHNmX2hpOyAgICAgICBuZXR3b3JrIHRpbWVzdGFtcCBmdW5jdGlvbiB0aW1lcgotICoJX19sZTMyIGdwMTsgICAgICAgICAgR1AxIHRpbWVyIHJlZ2lzdGVyCi0gKglfX2xlMzIgZ3AyOyAgICAgICAgICBHUDIgdGltZXIgcmVnaXN0ZXIKLSAqCV9fbGUzMiBncDM7ICAgICAgICAgIEdQMyB0aW1lciByZWdpc3RlcgotICoJX19sZTMyIHVjb2RlX3ZlcjsgICAgdUNvZGUgdmVyc2lvbgotICoJX19sZTMyIGh3X3ZlcjsgICAgICAgSFcgU2lsaWNvbiB2ZXJzaW9uCi0gKglfX2xlMzIgYnJkX3ZlcjsgICAgICBIVyBib2FyZCB2ZXJzaW9uCi0gKglfX2xlMzIgbG9nX3BjOyAgICAgICBsb2cgcHJvZ3JhbSBjb3VudGVyCi0gKglfX2xlMzIgZnJhbWVfcHRyOyAgICBmcmFtZSBwb2ludGVyCi0gKglfX2xlMzIgc3RhY2tfcHRyOyAgICBzdGFjayBwb2ludGVyCi0gKglfX2xlMzIgaGNtZDsgICAgICAgICBsYXN0IGhvc3QgY29tbWFuZAotICoJX19sZTMyIGlzcjA7ICAgICAgICAgaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IwOiByeHR4X2ZsYWcKLSAqCV9fbGUzMiBpc3IxOyAgICAgICAgIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMTogaG9zdF9mbGFnCi0gKglfX2xlMzIgaXNyMjsgICAgICAgICBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjI6IGVuY19mbGFnCi0gKglfX2xlMzIgaXNyMzsgICAgICAgICBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjM6IHRpbWVfZmxhZwotICoJX19sZTMyIGlzcjQ7ICAgICAgICAgaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1I0OiB3aWNvIGludGVycnVwdAotICoJX19sZTMyIGlzcl9wcmVmOyAgICAgaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19QUkVGX1NUQVQKLSAqCV9fbGUzMiB3YWl0X2V2ZW50OyAgIHdhaXQgZXZlbnQoKSBjYWxsZXIgYWRkcmVzcwotICoJX19sZTMyIGwycF9jb250cm9sOyAgTDJwQ29udHJvbEZpZWxkCi0gKglfX2xlMzIgbDJwX2R1cmF0aW9uOyBMMnBEdXJhdGlvbkZpZWxkCi0gKglfX2xlMzIgbDJwX21odmFsaWQ7ICBMMnBNaFZhbGlkQml0cwotICoJX19sZTMyIGwycF9hZGRyX21hdGNoOyBMMnBBZGRyTWF0Y2hTdGF0Ci0gKglfX2xlMzIgbG1wbV9wbWdfc2VsOyBpbmRpY2F0ZSB3aGljaCBjbG9ja3MgYXJlIHR1cm5lZCBvbiAoTE1QTV9QTUdfU0VMKQotICoJX19sZTMyIHVfdGltZXN0YW1wOyAgaW5kaWNhdGUgd2hlbiB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgY29tcGlsYXRpb24KLSAqCV9fbGUzMiByZXNlcnZlZDsKLSAqCi0gKiBUaGUgTGludXggZHJpdmVyIGNhbiBwcmludCBib3RoIGxvZ3MgdG8gdGhlIHN5c3RlbSBsb2cgd2hlbiBhIHVDb2RlIGVycm9yCi0gKiBvY2N1cnMuCi0gKi8KLXN0cnVjdCBpd2xfYWxpdmVfcmVzcCB7Ci0JdTggdWNvZGVfbWlub3I7Ci0JdTggdWNvZGVfbWFqb3I7Ci0JX19sZTE2IHJlc2VydmVkMTsKLQl1OCBzd19yZXZbOF07Ci0JdTggdmVyX3R5cGU7Ci0JdTggdmVyX3N1YnR5cGU7CQkJLyogbm90ICI5IiBmb3IgcnVudGltZSBhbGl2ZSAqLwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JX19sZTMyIGxvZ19ldmVudF90YWJsZV9wdHI7CS8qIFNSQU0gYWRkcmVzcyBmb3IgZXZlbnQgbG9nICovCi0JX19sZTMyIGVycm9yX2V2ZW50X3RhYmxlX3B0cjsJLyogU1JBTSBhZGRyZXNzIGZvciBlcnJvciBsb2cgKi8KLQlfX2xlMzIgdGltZXN0YW1wOwotCV9fbGUzMiBpc192YWxpZDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV9FUlJPUiA9IDB4MiAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKLSAqLwotc3RydWN0IGl3bF9lcnJvcl9yZXNwIHsKLQlfX2xlMzIgZXJyb3JfdHlwZTsKLQl1OCBjbWRfaWQ7Ci0JdTggcmVzZXJ2ZWQxOwotCV9fbGUxNiBiYWRfY21kX3NlcV9udW07Ci0JX19sZTMyIGVycm9yX2luZm87Ci0JX19sZTY0IHRpbWVzdGFtcDsKLX0gX19wYWNrZWQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICgxKQotICogUlhPTiBDb21tYW5kcyAmIFJlc3BvbnNlczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBSeCBjb25maWcgZGVmaW5lcyAmIHN0cnVjdHVyZQotICovCi0vKiByeF9jb25maWcgZGV2aWNlIHR5cGVzICAqLwotZW51bSB7Ci0JUlhPTl9ERVZfVFlQRV9BUCA9IDEsCi0JUlhPTl9ERVZfVFlQRV9FU1MgPSAzLAotCVJYT05fREVWX1RZUEVfSUJTUyA9IDQsCi0JUlhPTl9ERVZfVFlQRV9TTklGRkVSID0gNiwKLX07Ci0KLQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0RSSVZFUl9GT1JDRV9NU0sJCWNwdV90b19sZTE2KDB4MSA8PCAwKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0RSSVZFUl9GT1JDRV9QT1MJCSgwKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX1ZBTElEX01TSwkJCWNwdV90b19sZTE2KDB4NyA8PCAxKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX1ZBTElEX1BPUwkJCSgxKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0ZPUkNFX1NFTF9NU0sJCWNwdV90b19sZTE2KDB4NyA8PCA0KQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0ZPUkNFX1NFTF9QT1MJCSg0KQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0ZPUkNFX01JTU9fU0VMX01TSwljcHVfdG9fbGUxNigweDcgPDwgNykKLSNkZWZpbmUgUlhPTl9SWF9DSEFJTl9GT1JDRV9NSU1PX1NFTF9QT1MJKDcpCi0jZGVmaW5lIFJYT05fUlhfQ0hBSU5fQ05UX01TSwkJCWNwdV90b19sZTE2KDB4MyA8PCAxMCkKLSNkZWZpbmUgUlhPTl9SWF9DSEFJTl9DTlRfUE9TCQkJKDEwKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX01JTU9fQ05UX01TSwkJY3B1X3RvX2xlMTYoMHgzIDw8IDEyKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX01JTU9fQ05UX1BPUwkJKDEyKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX01JTU9fRk9SQ0VfTVNLCQljcHVfdG9fbGUxNigweDEgPDwgMTQpCi0jZGVmaW5lIFJYT05fUlhfQ0hBSU5fTUlNT19GT1JDRV9QT1MJCSgxNCkKLQotLyogcnhfY29uZmlnIGZsYWdzICovCi0vKiBiYW5kICYgbW9kdWxhdGlvbiBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgUlhPTl9GTEdfQkFORF8yNEdfTVNLICAgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDApCi0jZGVmaW5lIFJYT05fRkxHX0NDS19NU0sgICAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAxKQotLyogYXV0byBkZXRlY3Rpb24gZW5hYmxlICovCi0jZGVmaW5lIFJYT05fRkxHX0FVVE9fREVURUNUX01TSyAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAyKQotLyogVEdnIHByb3RlY3Rpb24gd2hlbiB0eCAqLwotI2RlZmluZSBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0sgICAgICAgIGNwdV90b19sZTMyKDEgPDwgMykKLS8qIGNjayBzaG9ydCBzbG90ICYgcHJlYW1ibGUgKi8KLSNkZWZpbmUgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0sgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCA0KQotI2RlZmluZSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0sgICAgIGNwdV90b19sZTMyKDEgPDwgNSkKLS8qIGFudGVubmEgc2VsZWN0aW9uICovCi0jZGVmaW5lIFJYT05fRkxHX0RJU19ESVZfTVNLICAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCA3KQotI2RlZmluZSBSWE9OX0ZMR19BTlRfU0VMX01TSyAgICAgICAgICAgIGNwdV90b19sZTMyKDB4MGYwMCkKLSNkZWZpbmUgUlhPTl9GTEdfQU5UX0FfTVNLICAgICAgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDgpCi0jZGVmaW5lIFJYT05fRkxHX0FOVF9CX01TSyAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCA5KQotLyogcmFkYXIgZGV0ZWN0aW9uIGVuYWJsZSAqLwotI2RlZmluZSBSWE9OX0ZMR19SQURBUl9ERVRFQ1RfTVNLICAgICAgIGNwdV90b19sZTMyKDEgPDwgMTIpCi0jZGVmaW5lIFJYT05fRkxHX1RHSl9OQVJST1dfQkFORF9NU0sgICAgY3B1X3RvX2xlMzIoMSA8PCAxMykKLS8qIHJ4IHJlc3BvbnNlIHRvIGhvc3Qgd2l0aCA4LWJ5dGUgVFNGCi0qIChhY2NvcmRpbmcgdG8gT05fQUlSIGRlYXNzZXJ0aW9uKSAqLwotI2RlZmluZSBSWE9OX0ZMR19UU0YySE9TVF9NU0sgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgMTUpCi0KLQotLyogSFQgZmxhZ3MgKi8KLSNkZWZpbmUgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19QT1MJCSgyMikKLSNkZWZpbmUgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0sJY3B1X3RvX2xlMzIoMHgxIDw8IDIyKQotCi0jZGVmaW5lIFJYT05fRkxHX0hUX09QRVJBVElOR19NT0RFX1BPUwkJKDIzKQotCi0jZGVmaW5lIFJYT05fRkxHX0hUX1BST1RfTVNLCQkJY3B1X3RvX2xlMzIoMHgxIDw8IDIzKQotI2RlZmluZSBSWE9OX0ZMR19IVDQwX1BST1RfTVNLCQkJY3B1X3RvX2xlMzIoMHgyIDw8IDIzKQotCi0jZGVmaW5lIFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QT1MJCSgyNSkKLSNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01TSwkJY3B1X3RvX2xlMzIoMHgzIDw8IDI1KQotCi0vKiBjaGFubmVsIG1vZGUgKi8KLWVudW0gewotCUNIQU5ORUxfTU9ERV9MRUdBQ1kgPSAwLAotCUNIQU5ORUxfTU9ERV9QVVJFXzQwID0gMSwKLQlDSEFOTkVMX01PREVfTUlYRUQgPSAyLAotCUNIQU5ORUxfTU9ERV9SRVNFUlZFRCA9IDMsCi19OwotI2RlZmluZSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTEVHQUNZCQkJXAotCWNwdV90b19sZTMyKENIQU5ORUxfTU9ERV9MRUdBQ1kgPDwgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUykKLSNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BVUkVfNDAJCQlcCi0JY3B1X3RvX2xlMzIoQ0hBTk5FTF9NT0RFX1BVUkVfNDAgPDwgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUykKLSNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01JWEVECQkJXAotCWNwdV90b19sZTMyKENIQU5ORUxfTU9ERV9NSVhFRCA8PCBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TKQotCi0vKiBDVFMgdG8gc2VsZiAoaWYgc3BlYyBhbGxvd3MpIGZsYWcgKi8KLSNkZWZpbmUgUlhPTl9GTEdfU0VMRl9DVFNfRU4JCQljcHVfdG9fbGUzMigweDE8PDMwKQotCi0vKiByeF9jb25maWcgZmlsdGVyIGZsYWdzICovCi0vKiBhY2NlcHQgYWxsIGRhdGEgZnJhbWVzICovCi0jZGVmaW5lIFJYT05fRklMVEVSX1BST01JU0NfTVNLICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAwKQotLyogcGFzcyBjb250cm9sICYgbWFuYWdlbWVudCB0byBob3N0ICovCi0jZGVmaW5lIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAxKQotLyogYWNjZXB0IG11bHRpLWNhc3QgKi8KLSNkZWZpbmUgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0sgICAgICBjcHVfdG9fbGUzMigxIDw8IDIpCi0vKiBkb24ndCBkZWNyeXB0IHVuaS1jYXN0IGZyYW1lcyAqLwotI2RlZmluZSBSWE9OX0ZJTFRFUl9ESVNfREVDUllQVF9NU0sgICAgIGNwdV90b19sZTMyKDEgPDwgMykKLS8qIGRvbid0IGRlY3J5cHQgbXVsdGktY2FzdCBmcmFtZXMgKi8KLSNkZWZpbmUgUlhPTl9GSUxURVJfRElTX0dSUF9ERUNSWVBUX01TSyBjcHVfdG9fbGUzMigxIDw8IDQpCi0vKiBTVEEgaXMgYXNzb2NpYXRlZCAqLwotI2RlZmluZSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0sgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgNSkKLS8qIHRyYW5zZmVyIHRvIGhvc3Qgbm9uIGJzc2lkIGJlYWNvbnMgaW4gYXNzb2NpYXRlZCBzdGF0ZSAqLwotI2RlZmluZSBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyAgICAgIGNwdV90b19sZTMyKDEgPDwgNikKLQotLyoqCi0gKiBSRVBMWV9SWE9OID0gMHgxMCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICoKLSAqIFJYT04gdHVuZXMgdGhlIHJhZGlvIHR1bmVyIHRvIGEgc2VydmljZSBjaGFubmVsLCBhbmQgc2V0cyB1cCBhIG51bWJlcgotICogb2YgcGFyYW1ldGVycyB0aGF0IGFyZSB1c2VkIHByaW1hcmlseSBmb3IgUngsIGJ1dCBhbHNvIGZvciBUeCBvcGVyYXRpb25zLgotICoKLSAqIE5PVEU6ICBXaGVuIHR1bmluZyB0byBhIG5ldyBjaGFubmVsLCBkcml2ZXIgbXVzdCBzZXQgdGhlCi0gKiAgICAgICAgUlhPTl9GSUxURVJfQVNTT0NfTVNLIHRvIDAuICBUaGlzIHdpbGwgY2xlYXIgc3RhdGlvbi1kZXBlbmRlbnQKLSAqICAgICAgICBpbmZvIHdpdGhpbiB0aGUgZGV2aWNlLCBpbmNsdWRpbmcgdGhlIHN0YXRpb24gdGFibGVzLCB0eCByZXRyeQotICogICAgICAgIHJhdGUgdGFibGVzLCBhbmQgdHhwb3dlciB0YWJsZXMuICBEcml2ZXIgbXVzdCBidWlsZCBhIG5ldyBzdGF0aW9uCi0gKiAgICAgICAgdGFibGUgYW5kIHR4cG93ZXIgdGFibGUgYmVmb3JlIHRyYW5zbWl0dGluZyBhbnl0aGluZyBvbiB0aGUgUlhPTgotICogICAgICAgIGNoYW5uZWwuCi0gKgotICogTk9URTogIEFsbCBSWE9OcyB3aXBlIGNsZWFuIHRoZSBpbnRlcm5hbCB0eHBvd2VyIHRhYmxlLiAgRHJpdmVyIG11c3QKLSAqICAgICAgICBpc3N1ZSBhIG5ldyBSRVBMWV9UWF9QV1JfVEFCTEVfQ01EIGFmdGVyIGVhY2ggUkVQTFlfUlhPTiAoMHgxMCksCi0gKiAgICAgICAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIFJYT05fRklMVEVSX0FTU09DX01TSyBpcyBzZXQuCi0gKi8KLQotc3RydWN0IGl3bDM5NDVfcnhvbl9jbWQgewotCXU4IG5vZGVfYWRkcls2XTsKLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCXU4IGJzc2lkX2FkZHJbNl07Ci0JX19sZTE2IHJlc2VydmVkMjsKLQl1OCB3bGFwX2Jzc2lkX2FkZHJbNl07Ci0JX19sZTE2IHJlc2VydmVkMzsKLQl1OCBkZXZfdHlwZTsKLQl1OCBhaXJfcHJvcGFnYXRpb247Ci0JX19sZTE2IHJlc2VydmVkNDsKLQl1OCBvZmRtX2Jhc2ljX3JhdGVzOwotCXU4IGNja19iYXNpY19yYXRlczsKLQlfX2xlMTYgYXNzb2NfaWQ7Ci0JX19sZTMyIGZsYWdzOwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7Ci0JX19sZTE2IGNoYW5uZWw7Ci0JX19sZTE2IHJlc2VydmVkNTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2w0OTY1X3J4b25fY21kIHsKLQl1OCBub2RlX2FkZHJbNl07Ci0JX19sZTE2IHJlc2VydmVkMTsKLQl1OCBic3NpZF9hZGRyWzZdOwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JdTggd2xhcF9ic3NpZF9hZGRyWzZdOwotCV9fbGUxNiByZXNlcnZlZDM7Ci0JdTggZGV2X3R5cGU7Ci0JdTggYWlyX3Byb3BhZ2F0aW9uOwotCV9fbGUxNiByeF9jaGFpbjsKLQl1OCBvZmRtX2Jhc2ljX3JhdGVzOwotCXU4IGNja19iYXNpY19yYXRlczsKLQlfX2xlMTYgYXNzb2NfaWQ7Ci0JX19sZTMyIGZsYWdzOwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7Ci0JX19sZTE2IGNoYW5uZWw7Ci0JdTggb2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXU4IG9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXM7Ci19IF9fcGFja2VkOwotCi0vKiBDcmVhdGUgYSBjb21tb24gcnhvbiBjbWQgd2hpY2ggd2lsbCBiZSB0eXBlY2FzdCBpbnRvIHRoZSAzOTQ1IG9yIDQ5NjUKLSAqIHNwZWNpZmljIHJ4b24gY21kLCBkZXBlbmRpbmcgb24gd2hlcmUgaXQgaXMgY2FsbGVkIGZyb20uCi0gKi8KLXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kIHsKLQl1OCBub2RlX2FkZHJbNl07Ci0JX19sZTE2IHJlc2VydmVkMTsKLQl1OCBic3NpZF9hZGRyWzZdOwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JdTggd2xhcF9ic3NpZF9hZGRyWzZdOwotCV9fbGUxNiByZXNlcnZlZDM7Ci0JdTggZGV2X3R5cGU7Ci0JdTggYWlyX3Byb3BhZ2F0aW9uOwotCV9fbGUxNiByeF9jaGFpbjsKLQl1OCBvZmRtX2Jhc2ljX3JhdGVzOwotCXU4IGNja19iYXNpY19yYXRlczsKLQlfX2xlMTYgYXNzb2NfaWQ7Ci0JX19sZTMyIGZsYWdzOwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7Ci0JX19sZTE2IGNoYW5uZWw7Ci0JdTggb2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXU4IG9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXM7Ci0JdTggcmVzZXJ2ZWQ0OwotCXU4IHJlc2VydmVkNTsKLX0gX19wYWNrZWQ7Ci0KLQotLyoKLSAqIFJFUExZX1JYT05fQVNTT0MgPSAweDExIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X3J4b25fYXNzb2NfY21kIHsKLQlfX2xlMzIgZmxhZ3M7Ci0JX19sZTMyIGZpbHRlcl9mbGFnczsKLQl1OCBvZmRtX2Jhc2ljX3JhdGVzOwotCXU4IGNja19iYXNpY19yYXRlczsKLQlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsNDk2NV9yeG9uX2Fzc29jX2NtZCB7Ci0JX19sZTMyIGZsYWdzOwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7Ci0JdTggb2ZkbV9iYXNpY19yYXRlczsKLQl1OCBjY2tfYmFzaWNfcmF0ZXM7Ci0JdTggb2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXU4IG9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXM7Ci0JX19sZTE2IHJ4X2NoYWluX3NlbGVjdF9mbGFnczsKLQlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIElXTF9DT05OX01BWF9MSVNURU5fSU5URVJWQUwJMTAKLSNkZWZpbmUgSVdMX01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJNCAvKiA0MDk2ICovCi0jZGVmaW5lIElXTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJMSAvKiAxMDI0ICovCi0KLS8qCi0gKiBSRVBMWV9SWE9OX1RJTUlORyA9IDB4MTQgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqLwotc3RydWN0IGl3bF9yeG9uX3RpbWVfY21kIHsKLQlfX2xlNjQgdGltZXN0YW1wOwotCV9fbGUxNiBiZWFjb25faW50ZXJ2YWw7Ci0JX19sZTE2IGF0aW1fd2luZG93OwotCV9fbGUzMiBiZWFjb25faW5pdF92YWw7Ci0JX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKLQl1OCBkdGltX3BlcmlvZDsKLQl1OCBkZWx0YV9jcF9ic3NfdGJ0dHM7Ci19IF9fcGFja2VkOwotCi0vKgotICogUkVQTFlfQ0hBTk5FTF9TV0lUQ0ggPSAweDcyIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X2NoYW5uZWxfc3dpdGNoX2NtZCB7Ci0JdTggYmFuZDsKLQl1OCBleHBlY3RfYmVhY29uOwotCV9fbGUxNiBjaGFubmVsOwotCV9fbGUzMiByeG9uX2ZsYWdzOwotCV9fbGUzMiByeG9uX2ZpbHRlcl9mbGFnczsKLQlfX2xlMzIgc3dpdGNoX3RpbWU7Ci0Jc3RydWN0IGl3bDM5NDVfcG93ZXJfcGVyX3JhdGUgcG93ZXJbSVdMX01BWF9SQVRFU107Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsNDk2NV9jaGFubmVsX3N3aXRjaF9jbWQgewotCXU4IGJhbmQ7Ci0JdTggZXhwZWN0X2JlYWNvbjsKLQlfX2xlMTYgY2hhbm5lbDsKLQlfX2xlMzIgcnhvbl9mbGFnczsKLQlfX2xlMzIgcnhvbl9maWx0ZXJfZmxhZ3M7Ci0JX19sZTMyIHN3aXRjaF90aW1lOwotCXN0cnVjdCBpd2w0OTY1X3R4X3Bvd2VyX2RiIHR4X3Bvd2VyOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIENIQU5ORUxfU1dJVENIX05PVElGSUNBVElPTiA9IDB4NzMgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX2NzYV9ub3RpZmljYXRpb24gewotCV9fbGUxNiBiYW5kOwotCV9fbGUxNiBjaGFubmVsOwotCV9fbGUzMiBzdGF0dXM7CQkvKiAwIC0gT0ssIDEgLSBmYWlsICovCi19IF9fcGFja2VkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoMikKLSAqIFF1YWxpdHktb2YtU2VydmljZSAoUU9TKSBDb21tYW5kcyAmIFJlc3BvbnNlczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogc3RydWN0IGl3bF9hY19xb3MgLS0gUU9TIHRpbWluZyBwYXJhbXMgZm9yIFJFUExZX1FPU19QQVJBTQotICogT25lIGZvciBlYWNoIG9mIDQgRURDQSBhY2Nlc3MgY2F0ZWdvcmllcyBpbiBzdHJ1Y3QgaXdsX3Fvc3BhcmFtX2NtZAotICoKLSAqIEBjd19taW46IENvbnRlbnRpb24gd2luZG93LCBzdGFydCB2YWx1ZSBpbiBudW1iZXJzIG9mIHNsb3RzLgotICogICAgICAgICAgU2hvdWxkIGJlIGEgcG93ZXItb2YtMiwgbWludXMgMS4gIERldmljZSdzIGRlZmF1bHQgaXMgMHgwZi4KLSAqIEBjd19tYXg6IENvbnRlbnRpb24gd2luZG93LCBtYXggdmFsdWUgaW4gbnVtYmVycyBvZiBzbG90cy4KLSAqICAgICAgICAgIFNob3VsZCBiZSBhIHBvd2VyLW9mLTIsIG1pbnVzIDEuICBEZXZpY2UncyBkZWZhdWx0IGlzIDB4M2YuCi0gKiBAYWlmc246ICBOdW1iZXIgb2Ygc2xvdHMgaW4gQXJiaXRyYXRpb24gSW50ZXJmcmFtZSBTcGFjZSAoYmVmb3JlCi0gKiAgICAgICAgICBwZXJmb3JtaW5nIHJhbmRvbSBiYWNrb2ZmIHRpbWluZyBwcmlvciB0byBUeCkuICBEZXZpY2UgZGVmYXVsdCAxLgotICogQGVkY2FfdHhvcDogIExlbmd0aCBvZiBUeCBvcHBvcnR1bml0eSwgaW4gdVNlY3MuICBEZXZpY2UgZGVmYXVsdCBpcyAwLgotICoKLSAqIERldmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2UgY29udGVudGlvbiB3aW5kb3cgYnkgKDIqQ1cpICsgMSBmb3IgZWFjaAotICogdHJhbnNtaXNzaW9uIHJldHJ5LiAgRGV2aWNlIHVzZXMgY3dfbWF4IGFzIGEgYml0IG1hc2ssIEFORGVkIHdpdGggbmV3IENXCi0gKiB2YWx1ZSwgdG8gY2FwIHRoZSBDVyB2YWx1ZS4KLSAqLwotc3RydWN0IGl3bF9hY19xb3MgewotCV9fbGUxNiBjd19taW47Ci0JX19sZTE2IGN3X21heDsKLQl1OCBhaWZzbjsKLQl1OCByZXNlcnZlZDE7Ci0JX19sZTE2IGVkY2FfdHhvcDsKLX0gX19wYWNrZWQ7Ci0KLS8qIFFvUyBmbGFncyBkZWZpbmVzICovCi0jZGVmaW5lIFFPU19QQVJBTV9GTEdfVVBEQVRFX0VEQ0FfTVNLCWNwdV90b19sZTMyKDB4MDEpCi0jZGVmaW5lIFFPU19QQVJBTV9GTEdfVEdOX01TSwkJY3B1X3RvX2xlMzIoMHgwMikKLSNkZWZpbmUgUU9TX1BBUkFNX0ZMR19UWE9QX1RZUEVfTVNLCWNwdV90b19sZTMyKDB4MTApCi0KLS8qIE51bWJlciBvZiBBY2Nlc3MgQ2F0ZWdvcmllcyAoQUMpIChFRENBKSwgcXVldWVzIDAuLjMgKi8KLSNkZWZpbmUgQUNfTlVNICAgICAgICAgICAgICAgIDQKLQotLyoKLSAqIFJFUExZX1FPU19QQVJBTSA9IDB4MTMgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBUaGlzIGNvbW1hbmQgc2V0cyB1cCB0aW1pbmdzIGZvciBlYWNoIG9mIHRoZSA0IHByaW9yaXRpemVkIEVEQ0EgVHggRklGT3MKLSAqIDA6IEJhY2tncm91bmQsIDE6IEJlc3QgRWZmb3J0LCAyOiBWaWRlbywgMzogVm9pY2UuCi0gKi8KLXN0cnVjdCBpd2xfcW9zcGFyYW1fY21kIHsKLQlfX2xlMzIgcW9zX2ZsYWdzOwotCXN0cnVjdCBpd2xfYWNfcW9zIGFjW0FDX05VTV07Ci19IF9fcGFja2VkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoMykKLSAqIEFkZC9Nb2RpZnkgU3RhdGlvbnMgQ29tbWFuZHMgJiBSZXNwb25zZXM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIE11bHRpIHN0YXRpb24gc3VwcG9ydAotICovCi0KLS8qIFNwZWNpYWwsIGRlZGljYXRlZCBsb2NhdGlvbnMgd2l0aGluIGRldmljZSdzIHN0YXRpb24gdGFibGUgKi8KLSNkZWZpbmUJSVdMX0FQX0lECQkwCi0jZGVmaW5lCUlXTF9TVEFfSUQJCTIKLSNkZWZpbmUJSVdMMzk0NV9CUk9BRENBU1RfSUQJMjQKLSNkZWZpbmUgSVdMMzk0NV9TVEFUSU9OX0NPVU5UCTI1Ci0jZGVmaW5lIElXTDQ5NjVfQlJPQURDQVNUX0lECTMxCi0jZGVmaW5lCUlXTDQ5NjVfU1RBVElPTl9DT1VOVAkzMgotCi0jZGVmaW5lCUlXTF9TVEFUSU9OX0NPVU5UCTMyIAkvKiBNQVgoMzk0NSw0OTY1KSovCi0jZGVmaW5lCUlXTF9JTlZBTElEX1NUQVRJT04JMjU1Ci0KLSNkZWZpbmUgU1RBX0ZMR19UWF9SQVRFX01TSwkJY3B1X3RvX2xlMzIoMSA8PCAyKQotI2RlZmluZSBTVEFfRkxHX1BXUl9TQVZFX01TSwkJY3B1X3RvX2xlMzIoMSA8PCA4KQotI2RlZmluZSBTVEFfRkxHX1JUU19NSU1PX1BST1RfTVNLCWNwdV90b19sZTMyKDEgPDwgMTcpCi0jZGVmaW5lIFNUQV9GTEdfQUdHX01QRFVfOFVTX01TSwljcHVfdG9fbGUzMigxIDw8IDE4KQotI2RlZmluZSBTVEFfRkxHX01BWF9BR0dfU0laRV9QT1MJKDE5KQotI2RlZmluZSBTVEFfRkxHX01BWF9BR0dfU0laRV9NU0sJY3B1X3RvX2xlMzIoMyA8PCAxOSkKLSNkZWZpbmUgU1RBX0ZMR19IVDQwX0VOX01TSwkJY3B1X3RvX2xlMzIoMSA8PCAyMSkKLSNkZWZpbmUgU1RBX0ZMR19NSU1PX0RJU19NU0sJCWNwdV90b19sZTMyKDEgPDwgMjIpCi0jZGVmaW5lIFNUQV9GTEdfQUdHX01QRFVfREVOU0lUWV9QT1MJKDIzKQotI2RlZmluZSBTVEFfRkxHX0FHR19NUERVX0RFTlNJVFlfTVNLCWNwdV90b19sZTMyKDcgPDwgMjMpCi0KLS8qIFVzZSBpbiBtb2RlIGZpZWxkLiAgMTogbW9kaWZ5IGV4aXN0aW5nIGVudHJ5LCAwOiBhZGQgbmV3IHN0YXRpb24gZW50cnkgKi8KLSNkZWZpbmUgU1RBX0NPTlRST0xfTU9ESUZZX01TSwkJMHgwMQotCi0vKiBrZXkgZmxhZ3MgX19sZTE2Ki8KLSNkZWZpbmUgU1RBX0tFWV9GTEdfRU5DUllQVF9NU0sJY3B1X3RvX2xlMTYoMHgwMDA3KQotI2RlZmluZSBTVEFfS0VZX0ZMR19OT19FTkMJY3B1X3RvX2xlMTYoMHgwMDAwKQotI2RlZmluZSBTVEFfS0VZX0ZMR19XRVAJCWNwdV90b19sZTE2KDB4MDAwMSkKLSNkZWZpbmUgU1RBX0tFWV9GTEdfQ0NNUAljcHVfdG9fbGUxNigweDAwMDIpCi0jZGVmaW5lIFNUQV9LRVlfRkxHX1RLSVAJY3B1X3RvX2xlMTYoMHgwMDAzKQotCi0jZGVmaW5lIFNUQV9LRVlfRkxHX0tFWUlEX1BPUwk4Ci0jZGVmaW5lIFNUQV9LRVlfRkxHX0lOVkFMSUQJY3B1X3RvX2xlMTYoMHgwODAwKQotLyogd2VwIGtleSBpcyBlaXRoZXIgZnJvbSBnbG9iYWwga2V5ICgwKSBvciBmcm9tIHN0YXRpb24gaW5mbyBhcnJheSAoMSkgKi8KLSNkZWZpbmUgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0sJY3B1X3RvX2xlMTYoMHgwMDA4KQotCi0vKiB3ZXAga2V5IGluIFNUQTogNS1ieXRlcyAoMCkgb3IgMTMtYnl0ZXMgKDEpICovCi0jZGVmaW5lIFNUQV9LRVlfRkxHX0tFWV9TSVpFX01TSwljcHVfdG9fbGUxNigweDEwMDApCi0jZGVmaW5lIFNUQV9LRVlfTVVMVElDQVNUX01TSwkJY3B1X3RvX2xlMTYoMHg0MDAwKQotI2RlZmluZSBTVEFfS0VZX01BWF9OVU0JCTgKLQotLyogRmxhZ3MgaW5kaWNhdGUgd2hldGhlciB0byBtb2RpZnkgdnMuIGRvbid0IGNoYW5nZSB2YXJpb3VzIHN0YXRpb24gcGFyYW1zICovCi0jZGVmaW5lCVNUQV9NT0RJRllfS0VZX01BU0sJCTB4MDEKLSNkZWZpbmUJU1RBX01PRElGWV9USURfRElTQUJMRV9UWAkweDAyCi0jZGVmaW5lCVNUQV9NT0RJRllfVFhfUkFURV9NU0sJCTB4MDQKLSNkZWZpbmUgU1RBX01PRElGWV9BRERCQV9USURfTVNLCTB4MDgKLSNkZWZpbmUgU1RBX01PRElGWV9ERUxCQV9USURfTVNLCTB4MTAKLSNkZWZpbmUgU1RBX01PRElGWV9TTEVFUF9UWF9DT1VOVF9NU0sJMHgyMAotCi0vKiBSZWNlaXZlciBhZGRyZXNzIChhY3R1YWxseSwgUnggc3RhdGlvbidzIGluZGV4IGludG8gc3RhdGlvbiB0YWJsZSksCi0gKiBjb21iaW5lZCB3aXRoIFRyYWZmaWMgSUQgKFFPUyBwcmlvcml0eSksIGluIGZvcm1hdCB1c2VkIGJ5IFR4IFNjaGVkdWxlciAqLwotI2RlZmluZSBCVUlMRF9SQXhUSUQoc3RhX2lkLCB0aWQpCSgoKHN0YV9pZCkgPDwgNCkgKyAodGlkKSkKLQotc3RydWN0IGl3bDQ5NjVfa2V5aW5mbyB7Ci0JX19sZTE2IGtleV9mbGFnczsKLQl1OCB0a2lwX3J4X3RzY19ieXRlMjsJLyogVFNDWzJdIGZvciBrZXkgbWl4IHBoMSBkZXRlY3Rpb24gKi8KLQl1OCByZXNlcnZlZDE7Ci0JX19sZTE2IHRraXBfcnhfdHRha1s1XTsJLyogMTAtYnl0ZSB1bmljYXN0IFRLSVAgVFRBSyAqLwotCXU4IGtleV9vZmZzZXQ7Ci0JdTggcmVzZXJ2ZWQyOwotCXU4IGtleVsxNl07CQkvKiAxNi1ieXRlIHVuaWNhc3QgZGVjcnlwdGlvbiBrZXkgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogc3RydWN0IHN0YV9pZF9tb2RpZnkKLSAqIEBhZGRyW0VUSF9BTEVOXTogc3RhdGlvbidzIE1BQyBhZGRyZXNzCi0gKiBAc3RhX2lkOiBpbmRleCBvZiBzdGF0aW9uIGluIHVDb2RlJ3Mgc3RhdGlvbiB0YWJsZQotICogQG1vZGlmeV9tYXNrOiBTVEFfTU9ESUZZXyosIDE6IG1vZGlmeSwgMDogZG9uJ3QgY2hhbmdlCi0gKgotICogRHJpdmVyIHNlbGVjdHMgdW51c2VkIHRhYmxlIGluZGV4IHdoZW4gYWRkaW5nIG5ldyBzdGF0aW9uLAotICogb3IgdGhlIGluZGV4IHRvIGEgcHJlLWV4aXN0aW5nIHN0YXRpb24gZW50cnkgd2hlbiBtb2RpZnlpbmcgdGhhdCBzdGF0aW9uLgotICogU29tZSBpbmRleGVzIGhhdmUgc3BlY2lhbCBwdXJwb3NlcyAoSVdMX0FQX0lELCBpbmRleCAwLCBpcyBmb3IgQVApLgotICoKLSAqIG1vZGlmeV9tYXNrIGZsYWdzIHNlbGVjdCB3aGljaCBwYXJhbWV0ZXJzIHRvIG1vZGlmeSB2cy4gbGVhdmUgYWxvbmUuCi0gKi8KLXN0cnVjdCBzdGFfaWRfbW9kaWZ5IHsKLQl1OCBhZGRyW0VUSF9BTEVOXTsKLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCXU4IHN0YV9pZDsKLQl1OCBtb2RpZnlfbWFzazsKLQlfX2xlMTYgcmVzZXJ2ZWQyOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFJFUExZX0FERF9TVEEgPSAweDE4IChjb21tYW5kKQotICoKLSAqIFRoZSBkZXZpY2UgY29udGFpbnMgYW4gaW50ZXJuYWwgdGFibGUgb2YgcGVyLXN0YXRpb24gaW5mb3JtYXRpb24sCi0gKiB3aXRoIGluZm8gb24gc2VjdXJpdHkga2V5cywgYWdncmVnYXRpb24gcGFyYW1ldGVycywgYW5kIFR4IHJhdGVzIGZvcgotICogaW5pdGlhbCBUeCBhdHRlbXB0IGFuZCBhbnkgcmV0cmllcyAoNDk2NSBkZXZpY2VzIHVzZXMKLSAqIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQsCi0gKiAzOTQ1IHVzZXMgUkVQTFlfUkFURV9TQ0FMRSB0byBzZXQgdXAgcmF0ZSB0YWJsZXMpLgotICoKLSAqIFJFUExZX0FERF9TVEEgc2V0cyB1cCB0aGUgdGFibGUgZW50cnkgZm9yIG9uZSBzdGF0aW9uLCBlaXRoZXIgY3JlYXRpbmcKLSAqIGEgbmV3IGVudHJ5LCBvciBtb2RpZnlpbmcgYSBwcmUtZXhpc3Rpbmcgb25lLgotICoKLSAqIE5PVEU6ICBSWE9OIGNvbW1hbmQgKHdpdGhvdXQgImFzc29jaWF0ZWQiIGJpdCBzZXQpIHdpcGVzIHRoZSBzdGF0aW9uIHRhYmxlCi0gKiAgICAgICAgY2xlYW4uICBNb3ZpbmcgaW50byBSRl9LSUxMIHN0YXRlIGRvZXMgdGhpcyBhbHNvLiAgRHJpdmVyIG11c3Qgc2V0IHVwCi0gKiAgICAgICAgbmV3IHN0YXRpb24gdGFibGUgYmVmb3JlIHRyYW5zbWl0dGluZyBhbnl0aGluZyBvbiB0aGUgUlhPTiBjaGFubmVsCi0gKiAgICAgICAgKGV4Y2VwdCBhY3RpdmUgc2NhbnMgb3IgYWN0aXZlIG1lYXN1cmVtZW50czsgdGhvc2UgY29tbWFuZHMgY2FycnkKLSAqICAgICAgICB0aGVpciBvd24gdHhwb3dlci9yYXRlIHNldHVwIGRhdGEpLgotICoKLSAqICAgICAgICBXaGVuIGdldHRpbmcgc3RhcnRlZCBvbiBhIG5ldyBjaGFubmVsLCBkcml2ZXIgbXVzdCBzZXQgdXAgdGhlCi0gKiAgICAgICAgSVdMX0JST0FEQ0FTVF9JRCBlbnRyeSAobGFzdCBlbnRyeSBpbiB0aGUgdGFibGUpLiAgRm9yIGEgY2xpZW50Ci0gKiAgICAgICAgc3RhdGlvbiBpbiBhIEJTUywgb25jZSBhbiBBUCBpcyBzZWxlY3RlZCwgZHJpdmVyIHNldHMgdXAgdGhlIEFQIFNUQQotICogICAgICAgIGluIHRoZSBJV0xfQVBfSUQgZW50cnkgKDFzdCBlbnRyeSBpbiB0aGUgdGFibGUpLiAgQlJPQURDQVNUIGFuZCBBUAotICogICAgICAgIGFyZSBhbGwgdGhhdCBhcmUgbmVlZGVkIGZvciBhIEJTUyBjbGllbnQgc3RhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKLSAqICAgICAgICB1c2VkIGFzIEFQLCBvciBpbiBhbiBJQlNTIG5ldHdvcmssIGRyaXZlciBtdXN0IHNldCB1cCBzdGF0aW9uIHRhYmxlCi0gKiAgICAgICAgZW50cmllcyBmb3IgYWxsIFNUQXMgaW4gbmV0d29yaywgc3RhcnRpbmcgd2l0aCBpbmRleCBJV0xfU1RBX0lELgotICovCi0KLXN0cnVjdCBpd2wzOTQ1X2FkZHN0YV9jbWQgewotCXU4IG1vZGU7CQkvKiAxOiBtb2RpZnkgZXhpc3RpbmcsIDA6IGFkZCBuZXcgc3RhdGlvbiAqLwotCXU4IHJlc2VydmVkWzNdOwotCXN0cnVjdCBzdGFfaWRfbW9kaWZ5IHN0YTsKLQlzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvIGtleTsKLQlfX2xlMzIgc3RhdGlvbl9mbGFnczsJCS8qIFNUQV9GTEdfKiAqLwotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzX21zazsJLyogU1RBX0ZMR18qICovCi0KLQkvKiBiaXQgZmllbGQgdG8gZGlzYWJsZSAoMSkgb3IgZW5hYmxlICgwKSBUeCBmb3IgVHJhZmZpYyBJRCAoVElEKQotCSAqIGNvcnJlc3BvbmRpbmcgdG8gYml0IChlLmcuIGJpdCA1IGNvbnRyb2xzIFRJRCA1KS4KLQkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFggdG8gdXNlIHRoaXMgZmllbGQuICovCi0JX19sZTE2IHRpZF9kaXNhYmxlX3R4OwotCi0JX19sZTE2IHJhdGVfbl9mbGFnczsKLQotCS8qIFRJRCBmb3Igd2hpY2ggdG8gYWRkIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCXU4IGFkZF9pbW1lZGlhdGVfYmFfdGlkOwotCi0JLyogVElEIGZvciB3aGljaCB0byByZW1vdmUgYmxvY2stYWNrIHN1cHBvcnQuCi0JICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0RFTEJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCi0JdTggcmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQ7Ci0KLQkvKiBTdGFydGluZyBTZXF1ZW5jZSBOdW1iZXIgZm9yIGFkZGVkIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCV9fbGUxNiBhZGRfaW1tZWRpYXRlX2JhX3NzbjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQgewotCXU4IG1vZGU7CQkvKiAxOiBtb2RpZnkgZXhpc3RpbmcsIDA6IGFkZCBuZXcgc3RhdGlvbiAqLwotCXU4IHJlc2VydmVkWzNdOwotCXN0cnVjdCBzdGFfaWRfbW9kaWZ5IHN0YTsKLQlzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvIGtleTsKLQlfX2xlMzIgc3RhdGlvbl9mbGFnczsJCS8qIFNUQV9GTEdfKiAqLwotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzX21zazsJLyogU1RBX0ZMR18qICovCi0KLQkvKiBiaXQgZmllbGQgdG8gZGlzYWJsZSAoMSkgb3IgZW5hYmxlICgwKSBUeCBmb3IgVHJhZmZpYyBJRCAoVElEKQotCSAqIGNvcnJlc3BvbmRpbmcgdG8gYml0IChlLmcuIGJpdCA1IGNvbnRyb2xzIFRJRCA1KS4KLQkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFggdG8gdXNlIHRoaXMgZmllbGQuICovCi0JX19sZTE2IHRpZF9kaXNhYmxlX3R4OwotCi0JX19sZTE2CXJlc2VydmVkMTsKLQotCS8qIFRJRCBmb3Igd2hpY2ggdG8gYWRkIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCXU4IGFkZF9pbW1lZGlhdGVfYmFfdGlkOwotCi0JLyogVElEIGZvciB3aGljaCB0byByZW1vdmUgYmxvY2stYWNrIHN1cHBvcnQuCi0JICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0RFTEJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCi0JdTggcmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQ7Ci0KLQkvKiBTdGFydGluZyBTZXF1ZW5jZSBOdW1iZXIgZm9yIGFkZGVkIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCV9fbGUxNiBhZGRfaW1tZWRpYXRlX2JhX3NzbjsKLQotCS8qCi0JICogTnVtYmVyIG9mIHBhY2tldHMgT0sgdG8gdHJhbnNtaXQgdG8gc3RhdGlvbiBldmVuIHRob3VnaAotCSAqIGl0IGlzIGFzbGVlcCAtLSB1c2VkIHRvIHN5bmNocm9uaXNlIFBTLXBvbGwgYW5kIHUtQVBTRAotCSAqIHJlc3BvbnNlcyB3aGlsZSB1Y29kZSBrZWVwcyB0cmFjayBvZiBTVEEgc2xlZXAgc3RhdGUuCi0JICovCi0JX19sZTE2IHNsZWVwX3R4X2NvdW50OwotCi0JX19sZTE2IHJlc2VydmVkMjsKLX0gX19wYWNrZWQ7Ci0KLS8qIFdyYXBwZXIgc3RydWN0IGZvciAzOTQ1IGFuZCA0OTY1IGFkZHN0YV9jbWQgc3RydWN0dXJlcyAqLwotc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCB7Ci0JdTggbW9kZTsJCS8qIDE6IG1vZGlmeSBleGlzdGluZywgMDogYWRkIG5ldyBzdGF0aW9uICovCi0JdTggcmVzZXJ2ZWRbM107Ci0Jc3RydWN0IHN0YV9pZF9tb2RpZnkgc3RhOwotCXN0cnVjdCBpd2w0OTY1X2tleWluZm8ga2V5OwotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOwkJLyogU1RBX0ZMR18qICovCi0JX19sZTMyIHN0YXRpb25fZmxhZ3NfbXNrOwkvKiBTVEFfRkxHXyogKi8KLQotCS8qIGJpdCBmaWVsZCB0byBkaXNhYmxlICgxKSBvciBlbmFibGUgKDApIFR4IGZvciBUcmFmZmljIElEIChUSUQpCi0JICogY29ycmVzcG9uZGluZyB0byBiaXQgKGUuZy4gYml0IDUgY29udHJvbHMgVElEIDUpLgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9USURfRElTQUJMRV9UWCB0byB1c2UgdGhpcyBmaWVsZC4gKi8KLQlfX2xlMTYgdGlkX2Rpc2FibGVfdHg7Ci0KLQlfX2xlMTYJcmF0ZV9uX2ZsYWdzOwkJLyogMzk0NSBvbmx5ICovCi0KLQkvKiBUSUQgZm9yIHdoaWNoIHRvIGFkZCBibG9jay1hY2sgc3VwcG9ydC4KLQkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KLQl1OCBhZGRfaW1tZWRpYXRlX2JhX3RpZDsKLQotCS8qIFRJRCBmb3Igd2hpY2ggdG8gcmVtb3ZlIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9ERUxCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCXU4IHJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOwotCi0JLyogU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyIGZvciBhZGRlZCBibG9jay1hY2sgc3VwcG9ydC4KLQkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KLQlfX2xlMTYgYWRkX2ltbWVkaWF0ZV9iYV9zc247Ci0KLQkvKgotCSAqIE51bWJlciBvZiBwYWNrZXRzIE9LIHRvIHRyYW5zbWl0IHRvIHN0YXRpb24gZXZlbiB0aG91Z2gKLQkgKiBpdCBpcyBhc2xlZXAgLS0gdXNlZCB0byBzeW5jaHJvbmlzZSBQUy1wb2xsIGFuZCB1LUFQU0QKLQkgKiByZXNwb25zZXMgd2hpbGUgdWNvZGUga2VlcHMgdHJhY2sgb2YgU1RBIHNsZWVwIHN0YXRlLgotCSAqLwotCV9fbGUxNiBzbGVlcF90eF9jb3VudDsKLQotCV9fbGUxNiByZXNlcnZlZDI7Ci19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgQUREX1NUQV9TVUNDRVNTX01TSwkJMHgxCi0jZGVmaW5lIEFERF9TVEFfTk9fUk9PTV9JTl9UQUJMRQkweDIKLSNkZWZpbmUgQUREX1NUQV9OT19CTE9DS19BQ0tfUkVTT1VSQ0UJMHg0Ci0jZGVmaW5lIEFERF9TVEFfTU9ESUZZX05PTl9FWElTVF9TVEEJMHg4Ci0vKgotICogUkVQTFlfQUREX1NUQSA9IDB4MTggKHJlc3BvbnNlKQotICovCi1zdHJ1Y3QgaXdsX2FkZF9zdGFfcmVzcCB7Ci0JdTggc3RhdHVzOwkvKiBBRERfU1RBXyogKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgUkVNX1NUQV9TVUNDRVNTX01TSyAgICAgICAgICAgICAgMHgxCi0vKgotICogIFJFUExZX1JFTV9TVEEgPSAweDE5IChyZXNwb25zZSkKLSAqLwotc3RydWN0IGl3bF9yZW1fc3RhX3Jlc3AgewotCXU4IHN0YXR1czsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiAgUkVQTFlfUkVNX1NUQSA9IDB4MTkgKGNvbW1hbmQpCi0gKi8KLXN0cnVjdCBpd2xfcmVtX3N0YV9jbWQgewotCXU4IG51bV9zdGE7ICAgICAvKiBudW1iZXIgb2YgcmVtb3ZlZCBzdGF0aW9ucyAqLwotCXU4IHJlc2VydmVkWzNdOwotCXU4IGFkZHJbRVRIX0FMRU5dOyAvKiBNQUMgYWRkciBvZiB0aGUgZmlyc3Qgc3RhdGlvbiAqLwotCXU4IHJlc2VydmVkMlsyXTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgSVdMX1RYX0ZJRk9fQktfTVNLCQljcHVfdG9fbGUzMihCSVQoMCkpCi0jZGVmaW5lIElXTF9UWF9GSUZPX0JFX01TSwkJY3B1X3RvX2xlMzIoQklUKDEpKQotI2RlZmluZSBJV0xfVFhfRklGT19WSV9NU0sJCWNwdV90b19sZTMyKEJJVCgyKSkKLSNkZWZpbmUgSVdMX1RYX0ZJRk9fVk9fTVNLCQljcHVfdG9fbGUzMihCSVQoMykpCi0jZGVmaW5lIElXTF9BR0dfVFhfUVVFVUVfTVNLCQljcHVfdG9fbGUzMigweGZmYzAwKQotCi0jZGVmaW5lIElXTF9EUk9QX1NJTkdMRQkJMAotI2RlZmluZSBJV0xfRFJPUF9TRUxFQ1RFRAkxCi0jZGVmaW5lIElXTF9EUk9QX0FMTAkJMgotCi0vKgotICogUkVQTFlfV0VQX0tFWSA9IDB4MjAKLSAqLwotc3RydWN0IGl3bF93ZXBfa2V5IHsKLQl1OCBrZXlfaW5kZXg7Ci0JdTgga2V5X29mZnNldDsKLQl1OCByZXNlcnZlZDFbMl07Ci0JdTgga2V5X3NpemU7Ci0JdTggcmVzZXJ2ZWQyWzNdOwotCXU4IGtleVsxNl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsX3dlcF9jbWQgewotCXU4IG51bV9rZXlzOwotCXU4IGdsb2JhbF9rZXlfdHlwZTsKLQl1OCBmbGFnczsKLQl1OCByZXNlcnZlZDsKLQlzdHJ1Y3QgaXdsX3dlcF9rZXkga2V5WzBdOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBXRVBfS0VZX1dFUF9UWVBFIDEKLSNkZWZpbmUgV0VQX0tFWVNfTUFYIDQKLSNkZWZpbmUgV0VQX0lOVkFMSURfT0ZGU0VUIDB4ZmYKLSNkZWZpbmUgV0VQX0tFWV9MRU5fNjQgNQotI2RlZmluZSBXRVBfS0VZX0xFTl8xMjggMTMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDQpCi0gKiBSeCBSZXNwb25zZXM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFJYX1JFU19TVEFUVVNfTk9fQ1JDMzJfRVJST1IJY3B1X3RvX2xlMzIoMSA8PCAwKQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX05PX1JYRV9PVkVSRkxPVwljcHVfdG9fbGUzMigxIDw8IDEpCi0KLSNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19CQU5EXzI0X01TSwljcHVfdG9fbGUxNigxIDw8IDApCi0jZGVmaW5lIFJYX1JFU19QSFlfRkxBR1NfTU9EX0NDS19NU0sJCWNwdV90b19sZTE2KDEgPDwgMSkKLSNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0sJY3B1X3RvX2xlMTYoMSA8PCAyKQotI2RlZmluZSBSWF9SRVNfUEhZX0ZMQUdTX05BUlJPV19CQU5EX01TSwljcHVfdG9fbGUxNigxIDw8IDMpCi0jZGVmaW5lIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0sJCTB4ZjAKLSNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX1BPUwkJNAotCi0jZGVmaW5lIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLCSgweDcgPDwgOCkKLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9OT05FCSgweDAgPDwgOCkKLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9XRVAJKDB4MSA8PCA4KQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX0NDTVAJKDB4MiA8PCA4KQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1RLSVAJKDB4MyA8PCA4KQotI2RlZmluZQlSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX0VSUgkoMHg3IDw8IDgpCi0KLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19TVEFUSU9OX0ZPVU5ECSgxPDw2KQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX05PX1NUQVRJT05fSU5GT19NSVNNQVRDSAkoMTw8NykKLQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX0RFQ1JZUFRfVFlQRV9NU0sJKDB4MyA8PCAxMSkKLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19OT1RfREVDUllQVAkoMHgwIDw8IDExKQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX0RFQ1JZUFRfT0sJKDB4MyA8PCAxMSkKLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQwkoMHgxIDw8IDExKQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX0JBRF9LRVlfVFRBSwkoMHgyIDw8IDExKQotCi0jZGVmaW5lIFJYX01QRFVfUkVTX1NUQVRVU19JQ1ZfT0sJKDB4MjApCi0jZGVmaW5lIFJYX01QRFVfUkVTX1NUQVRVU19NSUNfT0sJKDB4NDApCi0jZGVmaW5lIFJYX01QRFVfUkVTX1NUQVRVU19UVEFLX09LCSgxIDw8IDcpCi0jZGVmaW5lIFJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0sJKDB4ODAwKQotCi0KLXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX3N0YXRzIHsKLQl1OCBwaHlfY291bnQ7Ci0JdTggaWQ7Ci0JdTggcnNzaTsKLQl1OCBhZ2M7Ci0JX19sZTE2IHNpZ19hdmc7Ci0JX19sZTE2IG5vaXNlX2RpZmY7Ci0JdTggcGF5bG9hZFswXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2hkciB7Ci0JX19sZTE2IGNoYW5uZWw7Ci0JX19sZTE2IHBoeV9mbGFnczsKLQl1OCByZXNlcnZlZDE7Ci0JdTggcmF0ZTsKLQlfX2xlMTYgbGVuOwotCXU4IHBheWxvYWRbMF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9lbmQgewotCV9fbGUzMiBzdGF0dXM7Ci0JX19sZTY0IHRpbWVzdGFtcDsKLQlfX2xlMzIgYmVhY29uX3RpbWVzdGFtcDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV8zOTQ1X1JYID0gMHgxYiAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKLSAqCi0gKiBOT1RFOiAgRE8gTk9UIGRlcmVmZXJlbmNlIGZyb20gY2FzdHMgdG8gdGhpcyBzdHJ1Y3R1cmUKLSAqIEl0IGlzIHByb3ZpZGVkIG9ubHkgZm9yIGNhbGN1bGF0aW5nIG1pbmltdW0gZGF0YSBzZXQgc2l6ZS4KLSAqIFRoZSBhY3R1YWwgb2Zmc2V0cyBvZiB0aGUgaGRyIGFuZCBlbmQgYXJlIGR5bmFtaWMgYmFzZWQgb24KLSAqIHN0YXRzLnBoeV9jb3VudAotICovCi1zdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZSB7Ci0Jc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfaGRyIGhkcjsKLQlzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9lbmQgZW5kOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBJV0wzOV9SWF9GUkFNRV9TSVpFCSg0ICsgc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lKSkKLQotLyogRml4ZWQgKG5vbi1jb25maWd1cmFibGUpIHJ4IGRhdGEgZnJvbSBwaHkgKi8KLQotI2RlZmluZSBJV0w0OV9SWF9SRVNfUEhZX0NOVCAxNAotI2RlZmluZSBJV0w0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfT0ZGU0VUCSg0KQotI2RlZmluZSBJV0w0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfTUFTSwkoMHg3MCkKLSNkZWZpbmUgSVdMNDlfQUdDX0RCX01BU0sJCQkoMHgzZjgwKQkvKiBNQVNLKDcsMTMpICovCi0jZGVmaW5lIElXTDQ5X0FHQ19EQl9QT1MJCQkoNykKLXN0cnVjdCBpd2w0OTY1X3J4X25vbl9jZmdfcGh5IHsKLQlfX2xlMTYgYW50X3NlbGVjdGlvbjsJLyogYW50IEEgYml0IDQsIGFudCBCIGJpdCA1LCBhbnQgQyBiaXQgNiAqLwotCV9fbGUxNiBhZ2NfaW5mbzsJLyogYWdjIGNvZGUgMDo2LCBhZ2MgZEIgNzoxMywgcmVzZXJ2ZWQgMTQ6MTUgKi8KLQl1OCByc3NpX2luZm9bNl07CS8qIHdlIHVzZSBldmVuIGVudHJpZXMsIDAvMi80IGZvciBBL0IvQyByc3NpICovCi0JdTggcGFkWzBdOwotfSBfX3BhY2tlZDsKLQotCi0vKgotICogUkVQTFlfUlggPSAweGMzIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQotICogVXNlZCBvbmx5IGZvciBsZWdhY3kgKG5vbiAxMW4pIGZyYW1lcy4KLSAqLwotc3RydWN0IGl3bF9yeF9waHlfcmVzIHsKLQl1OCBub25fY2ZnX3BoeV9jbnQ7ICAgICAvKiBub24gY29uZmlndXJhYmxlIERTUCBwaHkgZGF0YSBieXRlIGNvdW50ICovCi0JdTggY2ZnX3BoeV9jbnQ7CQkvKiBjb25maWd1cmFibGUgRFNQIHBoeSBkYXRhIGJ5dGUgY291bnQgKi8KLQl1OCBzdGF0X2lkOwkJLyogY29uZmlndXJhYmxlIERTUCBwaHkgZGF0YSBzZXQgSUQgKi8KLQl1OCByZXNlcnZlZDE7Ci0JX19sZTY0IHRpbWVzdGFtcDsJLyogVFNGIGF0IG9uIGFpciByaXNlICovCi0JX19sZTMyIGJlYWNvbl90aW1lX3N0YW1wOyAvKiBiZWFjb24gYXQgb24tYWlyIHJpc2UgKi8KLQlfX2xlMTYgcGh5X2ZsYWdzOwkvKiBnZW5lcmFsIHBoeSBmbGFnczogYmFuZCwgbW9kdWxhdGlvbiwgLi4uICovCi0JX19sZTE2IGNoYW5uZWw7CQkvKiBjaGFubmVsIG51bWJlciAqLwotCXU4IG5vbl9jZmdfcGh5X2J1ZlszMl07IC8qIGZvciB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyBvZiBub25fY2ZnX3BoeSAqLwotCV9fbGUzMiByYXRlX25fZmxhZ3M7CS8qIFJBVEVfTUNTXyogKi8KLQlfX2xlMTYgYnl0ZV9jb3VudDsJLyogZnJhbWUncyBieXRlLWNvdW50ICovCi0JX19sZTE2IGZyYW1lX3RpbWU7CS8qIGZyYW1lJ3MgdGltZSBvbiB0aGUgYWlyICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsX3J4X21wZHVfcmVzX3N0YXJ0IHsKLQlfX2xlMTYgYnl0ZV9jb3VudDsKLQlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICg1KQotICogVHggQ29tbWFuZHMgJiBSZXNwb25zZXM6Ci0gKgotICogRHJpdmVyIG11c3QgcGxhY2UgZWFjaCBSRVBMWV9UWCBjb21tYW5kIGludG8gb25lIG9mIHRoZSBwcmlvcml0aXplZCBUeAotICogcXVldWVzIGluIGhvc3QgRFJBTSwgc2hhcmVkIGJldHdlZW4gZHJpdmVyIGFuZCBkZXZpY2UgKHNlZSBjb21tZW50cyBmb3IKLSAqIFNDRCByZWdpc3RlcnMgYW5kIFR4L1J4IFF1ZXVlcykuICBXaGVuIHRoZSBkZXZpY2UncyBUeCBzY2hlZHVsZXIgYW5kIHVDb2RlCi0gKiBhcmUgcHJlcGFyaW5nIHRvIHRyYW5zbWl0LCB0aGUgZGV2aWNlIHB1bGxzIHRoZSBUeCBjb21tYW5kIG92ZXIgdGhlIFBDSQotICogYnVzIHZpYSBvbmUgb2YgdGhlIGRldmljZSdzIFR4IERNQSBjaGFubmVscywgdG8gZmlsbCBhbiBpbnRlcm5hbCBGSUZPCi0gKiBmcm9tIHdoaWNoIGRhdGEgd2lsbCBiZSB0cmFuc21pdHRlZC4KLSAqCi0gKiB1Q29kZSBoYW5kbGVzIGFsbCB0aW1pbmcgYW5kIHByb3RvY29sIHJlbGF0ZWQgdG8gY29udHJvbCBmcmFtZXMKLSAqIChSVFMvQ1RTL0FDSyksIGJhc2VkIG9uIGZsYWdzIGluIHRoZSBUeCBjb21tYW5kLiAgdUNvZGUgYW5kIFR4IHNjaGVkdWxlcgotICogaGFuZGxlIHJlY2VwdGlvbiBvZiBibG9jay1hY2tzOyB1Q29kZSB1cGRhdGVzIHRoZSBob3N0IGRyaXZlciB2aWEKLSAqIFJFUExZX0NPTVBSRVNTRURfQkEuCi0gKgotICogdUNvZGUgaGFuZGxlcyByZXRyeWluZyBUeCB3aGVuIGFuIEFDSyBpcyBleHBlY3RlZCBidXQgbm90IHJlY2VpdmVkLgotICogVGhpcyBpbmNsdWRlcyB0cnlpbmcgbG93ZXIgZGF0YSByYXRlcyB0aGFuIHRoZSBvbmUgcmVxdWVzdGVkIGluIHRoZSBUeAotICogY29tbWFuZCwgYXMgc2V0IHVwIGJ5IHRoZSBSRVBMWV9SQVRFX1NDQUxFIChmb3IgMzk0NSkgb3IKLSAqIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQgKDQ5NjUpLgotICoKLSAqIERyaXZlciBzZXRzIHVwIHRyYW5zbWl0IHBvd2VyIGZvciB2YXJpb3VzIHJhdGVzIHZpYSBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELgotICogVGhpcyBjb21tYW5kIG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZXZlcnkgUlhPTiBjb21tYW5kLCBiZWZvcmUgVHggY2FuIG9jY3VyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBSRVBMWV9UWCBUeCBmbGFncyBmaWVsZCAqLwotCi0vKgotICogMTogVXNlIFJlcXVlc3QtVG8tU2VuZCBwcm90b2NvbCBiZWZvcmUgdGhpcyBmcmFtZS4KLSAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB2cy4gVFhfQ01EX0ZMR19DVFNfTVNLLgotICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfUlRTX01TSyBjcHVfdG9fbGUzMigxIDw8IDEpCi0KLS8qCi0gKiAxOiBUcmFuc21pdCBDbGVhci1Uby1TZW5kIHRvIHNlbGYgYmVmb3JlIHRoaXMgZnJhbWUuCi0gKiBEcml2ZXIgc2hvdWxkIHNldCB0aGlzIGZvciBBVVRIL0RFQVVUSC9BU1NPQy1SRVEvUkVBU1NPQyBtZ21udCBmcmFtZXMuCi0gKiBNdXR1YWxseSBleGNsdXNpdmUgdnMuIFRYX0NNRF9GTEdfUlRTX01TSy4KLSAqLwotI2RlZmluZSBUWF9DTURfRkxHX0NUU19NU0sgY3B1X3RvX2xlMzIoMSA8PCAyKQotCi0vKiAxOiBFeHBlY3QgQUNLIGZyb20gcmVjZWl2aW5nIHN0YXRpb24KLSAqIDA6IERvbid0IGV4cGVjdCBBQ0sgKE1BQyBoZWFkZXIncyBkdXJhdGlvbiBmaWVsZCBzL2IgMCkKLSAqIFNldCB0aGlzIGZvciB1bmljYXN0IGZyYW1lcywgYnV0IG5vdCBicm9hZGNhc3QvbXVsdGljYXN0LiAqLwotI2RlZmluZSBUWF9DTURfRkxHX0FDS19NU0sgY3B1X3RvX2xlMzIoMSA8PCAzKQotCi0vKiBGb3IgNDk2NSBkZXZpY2VzOgotICogMTogVXNlIHJhdGUgc2NhbGUgdGFibGUgKHNlZSBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EKS4KLSAqICAgIFR4IGNvbW1hbmQncyBpbml0aWFsX3JhdGVfaW5kZXggaW5kaWNhdGVzIGZpcnN0IHJhdGUgdG8gdHJ5OwotICogICAgdUNvZGUgd2Fsa3MgdGhyb3VnaCB0YWJsZSBmb3IgYWRkaXRpb25hbCBUeCBhdHRlbXB0cy4KLSAqIDA6IFVzZSBUeCByYXRlL01DUyBmcm9tIFR4IGNvbW1hbmQncyByYXRlX25fZmxhZ3MgZmllbGQuCi0gKiAgICBUaGlzIHJhdGUgd2lsbCBiZSB1c2VkIGZvciBhbGwgVHggYXR0ZW1wdHM7IGl0IHdpbGwgbm90IGJlIHNjYWxlZC4gKi8KLSNkZWZpbmUgVFhfQ01EX0ZMR19TVEFfUkFURV9NU0sgY3B1X3RvX2xlMzIoMSA8PCA0KQotCi0vKiAxOiBFeHBlY3QgaW1tZWRpYXRlIGJsb2NrLWFjay4KLSAqIFNldCB3aGVuIFR4aW5nIGEgYmxvY2stYWNrIHJlcXVlc3QgZnJhbWUuICBBbHNvIHNldCBUWF9DTURfRkxHX0FDS19NU0suICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfSU1NX0JBX1JTUF9NQVNLICBjcHVfdG9fbGUzMigxIDw8IDYpCi0KLS8qCi0gKiAxOiBGcmFtZSByZXF1aXJlcyBmdWxsIFR4LU9wIHByb3RlY3Rpb24uCi0gKiBTZXQgdGhpcyBpZiBlaXRoZXIgUlRTIG9yIENUUyBUeCBGbGFnIGdldHMgc2V0LgotICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfRlVMTF9UWE9QX1BST1RfTVNLIGNwdV90b19sZTMyKDEgPDwgNykKLQotLyogVHggYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQ7IHVzZWQgb25seSBmb3IgMzk0NSwgcmVzZXJ2ZWQgKDApIGZvciA0OTY1IGRldmljZXMuCi0gKiBTZXQgZmllbGQgdG8gIjAiIHRvIGFsbG93IDM5NDUgdUNvZGUgdG8gc2VsZWN0IGFudGVubmEgKG5vcm1hbCB1c2FnZSkuICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfQU5UX1NFTF9NU0sgY3B1X3RvX2xlMzIoMHhmMDApCi0jZGVmaW5lIFRYX0NNRF9GTEdfQU5UX0FfTVNLIGNwdV90b19sZTMyKDEgPDwgOCkKLSNkZWZpbmUgVFhfQ01EX0ZMR19BTlRfQl9NU0sgY3B1X3RvX2xlMzIoMSA8PCA5KQotCi0vKiAxOiB1Q29kZSBvdmVycmlkZXMgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpbiBNQUMgaGVhZGVyLgotICogMDogRHJpdmVyIHByb3ZpZGVzIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaW4gTUFDIGhlYWRlci4KLSAqIFNldCB0aGlzIGZvciBtYW5hZ2VtZW50IGZyYW1lcywgbm9uLVFPUyBkYXRhIGZyYW1lcywgbm9uLXVuaWNhc3QgZnJhbWVzLAotICogYW5kIGFsc28gaW4gVHggY29tbWFuZCBlbWJlZGRlZCBpbiBSRVBMWV9TQ0FOX0NNRCBmb3IgYWN0aXZlIHNjYW5zLiAqLwotI2RlZmluZSBUWF9DTURfRkxHX1NFUV9DVExfTVNLIGNwdV90b19sZTMyKDEgPDwgMTMpCi0KLS8qIDE6IFRoaXMgZnJhbWUgaXMgbm9uLWxhc3QgTVBEVTsgbW9yZSBmcmFnbWVudHMgYXJlIGNvbWluZy4KLSAqIDA6IExhc3QgZnJhZ21lbnQsIG9yIG5vdCB1c2luZyBmcmFnbWVudGF0aW9uLiAqLwotI2RlZmluZSBUWF9DTURfRkxHX01PUkVfRlJBR19NU0sgY3B1X3RvX2xlMzIoMSA8PCAxNCkKLQotLyogMTogdUNvZGUgY2FsY3VsYXRlcyBhbmQgaW5zZXJ0cyBUaW1lc3RhbXAgRnVuY3Rpb24gKFRTRikgaW4gb3V0Z29pbmcgZnJhbWUuCi0gKiAwOiBObyBUU0YgcmVxdWlyZWQgaW4gb3V0Z29pbmcgZnJhbWUuCi0gKiBTZXQgdGhpcyBmb3IgdHJhbnNtaXR0aW5nIGJlYWNvbnMgYW5kIHByb2JlIHJlc3BvbnNlcy4gKi8KLSNkZWZpbmUgVFhfQ01EX0ZMR19UU0ZfTVNLIGNwdV90b19sZTMyKDEgPDwgMTYpCi0KLS8qIDE6IERyaXZlciBpbnNlcnRlZCAyIGJ5dGVzIHBhZCBhZnRlciB0aGUgTUFDIGhlYWRlciwgZm9yIChyZXF1aXJlZCkgZHdvcmQKLSAqICAgIGFsaWdubWVudCBvZiBmcmFtZSdzIHBheWxvYWQgZGF0YSBmaWVsZC4KLSAqIDA6IE5vIHBhZAotICogU2V0IHRoaXMgZm9yIE1BQyBoZWFkZXJzIHdpdGggMjYgb3IgMzAgYnl0ZXMsIGkuZS4gdGhvc2Ugd2l0aCBRT1Mgb3IgQUREUjQKLSAqIGZpZWxkIChidXQgbm90IGJvdGgpLiAgRHJpdmVyIG11c3QgYWxpZ24gZnJhbWUgZGF0YSAoaS5lLiBkYXRhIGZvbGxvd2luZwotICogTUFDIGhlYWRlcikgdG8gRFdPUkQgYm91bmRhcnkuICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfTUhfUEFEX01TSyBjcHVfdG9fbGUzMigxIDw8IDIwKQotCi0vKiBhY2NlbGVyYXRlIGFnZ3JlZ2F0aW9uIHN1cHBvcnQKLSAqIDAgLSBubyBDQ01QIGVuY3J5cHRpb247IDEgLSBDQ01QIGVuY3J5cHRpb24gKi8KLSNkZWZpbmUgVFhfQ01EX0ZMR19BR0dfQ0NNUF9NU0sgY3B1X3RvX2xlMzIoMSA8PCAyMikKLQotLyogSENDQS1BUCAtIGRpc2FibGUgZHVyYXRpb24gb3ZlcndyaXRpbmcuICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfRFVSX01TSyBjcHVfdG9fbGUzMigxIDw8IDI1KQotCi0KLS8qCi0gKiBUWCBjb21tYW5kIHNlY3VyaXR5IGNvbnRyb2wKLSAqLwotI2RlZmluZSBUWF9DTURfU0VDX1dFUAkJMHgwMQotI2RlZmluZSBUWF9DTURfU0VDX0NDTQkJMHgwMgotI2RlZmluZSBUWF9DTURfU0VDX1RLSVAJCTB4MDMKLSNkZWZpbmUgVFhfQ01EX1NFQ19NU0sJCTB4MDMKLSNkZWZpbmUgVFhfQ01EX1NFQ19TSElGVAk2Ci0jZGVmaW5lIFRYX0NNRF9TRUNfS0VZMTI4CTB4MDgKLQotLyoKLSAqIHNlY3VyaXR5IG92ZXJoZWFkIHNpemVzCi0gKi8KLSNkZWZpbmUgV0VQX0lWX0xFTiA0Ci0jZGVmaW5lIFdFUF9JQ1ZfTEVOIDQKLSNkZWZpbmUgQ0NNUF9NSUNfTEVOIDgKLSNkZWZpbmUgVEtJUF9JQ1ZfTEVOIDQKLQotLyoKLSAqIFJFUExZX1RYID0gMHgxYyAoY29tbWFuZCkKLSAqLwotCi1zdHJ1Y3QgaXdsMzk0NV90eF9jbWQgewotCS8qCi0JICogTVBEVSBieXRlIGNvdW50OgotCSAqIE1BQyBoZWFkZXIgKDI0LzI2LzMwLzMyIGJ5dGVzKSArIDIgYnl0ZXMgcGFkIGlmIDI2LzMwIGhlYWRlciBzaXplLAotCSAqICsgOCBieXRlIElWIGZvciBDQ00gb3IgVEtJUCAobm90IHVzZWQgZm9yIFdFUCkKLQkgKiArIERhdGEgcGF5bG9hZAotCSAqICsgOC1ieXRlIE1JQyAobm90IHVzZWQgZm9yIENDTS9XRVApCi0JICogTk9URTogIERvZXMgbm90IGluY2x1ZGUgVHggY29tbWFuZCBieXRlcywgcG9zdC1NQUMgcGFkIGJ5dGVzLAotCSAqICAgICAgICBNSUMgKENDTSkgOCBieXRlcywgSUNWIChXRVAvVEtJUC9DS0lQKSA0IGJ5dGVzLCBDUkMgNCBieXRlcy5pCi0JICogUmFuZ2U6IDE0LTIzNDIgYnl0ZXMuCi0JICovCi0JX19sZTE2IGxlbjsKLQotCS8qCi0JICogTVBEVSBvciBNU0RVIGJ5dGUgY291bnQgZm9yIG5leHQgZnJhbWUuCi0JICogVXNlZCBmb3IgZnJhZ21lbnRhdGlvbiBhbmQgYnVyc3RpbmcsIGJ1dCBub3QgMTFuIGFnZ3JlZ2F0aW9uLgotCSAqIFNhbWUgYXMgImxlbiIsIGJ1dCBmb3IgbmV4dCBmcmFtZS4gIFNldCB0byAwIGlmIG5vdCBhcHBsaWNhYmxlLgotCSAqLwotCV9fbGUxNiBuZXh0X2ZyYW1lX2xlbjsKLQotCV9fbGUzMiB0eF9mbGFnczsJLyogVFhfQ01EX0ZMR18qICovCi0KLQl1OCByYXRlOwotCi0JLyogSW5kZXggb2YgcmVjaXBpZW50IHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlICovCi0JdTggc3RhX2lkOwotCXU4IHRpZF90c3BlYzsKLQl1OCBzZWNfY3RsOwotCXU4IGtleVsxNl07Ci0JdW5pb24gewotCQl1OCBieXRlWzhdOwotCQlfX2xlMTYgd29yZFs0XTsKLQkJX19sZTMyIGR3WzJdOwotCX0gdGtpcF9taWM7Ci0JX19sZTMyIG5leHRfZnJhbWVfaW5mbzsKLQl1bmlvbiB7Ci0JCV9fbGUzMiBsaWZlX3RpbWU7Ci0JCV9fbGUzMiBhdHRlbXB0OwotCX0gc3RvcF90aW1lOwotCXU4IHN1cHBfcmF0ZXNbMl07Ci0JdTggcnRzX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTAgKi8KLQl1OCBkYXRhX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTEgKi8KLQl1bmlvbiB7Ci0JCV9fbGUxNiBwbV9mcmFtZV90aW1lb3V0OwotCQlfX2xlMTYgYXR0ZW1wdF9kdXJhdGlvbjsKLQl9IHRpbWVvdXQ7Ci0KLQkvKgotCSAqIER1cmF0aW9uIG9mIEVEQ0EgYnVyc3QgVHggT3Bwb3J0dW5pdHksIGluIDMyLXVzZWMgdW5pdHMuCi0JICogU2V0IHRoaXMgaWYgdHhvcCB0aW1lIGlzIG5vdCBzcGVjaWZpZWQgYnkgSENDQSBwcm90b2NvbCAoZS5nLiBieSBBUCkuCi0JICovCi0JX19sZTE2IGRyaXZlcl90eG9wOwotCi0JLyoKLQkgKiBNQUMgaGVhZGVyIGdvZXMgaGVyZSwgZm9sbG93ZWQgYnkgMiBieXRlcyBwYWRkaW5nIGlmIE1BQyBoZWFkZXIKLQkgKiBsZW5ndGggaXMgMjYgb3IgMzAgYnl0ZXMsIGZvbGxvd2VkIGJ5IHBheWxvYWQgZGF0YQotCSAqLwotCXU4IHBheWxvYWRbMF07Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgaGRyWzBdOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFJFUExZX1RYID0gMHgxYyAocmVzcG9uc2UpCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X3R4X3Jlc3AgewotCXU4IGZhaWx1cmVfcnRzOwotCXU4IGZhaWx1cmVfZnJhbWU7Ci0JdTggYnRfa2lsbF9jb3VudDsKLQl1OCByYXRlOwotCV9fbGUzMiB3aXJlbGVzc19tZWRpYV90aW1lOwotCV9fbGUzMiBzdGF0dXM7CQkvKiBUWCBzdGF0dXMgKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyoKLSAqIDQ5NjUgdUNvZGUgdXBkYXRlcyB0aGVzZSBUeCBhdHRlbXB0IGNvdW50IHZhbHVlcyBpbiBob3N0IERSQU0uCi0gKiBVc2VkIGZvciBtYW5hZ2luZyBUeCByZXRyaWVzIHdoZW4gZXhwZWN0aW5nIGJsb2NrLWFja3MuCi0gKiBEcml2ZXIgc2hvdWxkIHNldCB0aGVzZSBmaWVsZHMgdG8gMC4KLSAqLwotc3RydWN0IGl3bF9kcmFtX3NjcmF0Y2ggewotCXU4IHRyeV9jbnQ7CQkvKiBUeCBhdHRlbXB0cyAqLwotCXU4IGJ0X2tpbGxfY250OwkJLyogVHggYXR0ZW1wdHMgYmxvY2tlZCBieSBCbHVldG9vdGggZGV2aWNlICovCi0JX19sZTE2IHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bF90eF9jbWQgewotCS8qCi0JICogTVBEVSBieXRlIGNvdW50OgotCSAqIE1BQyBoZWFkZXIgKDI0LzI2LzMwLzMyIGJ5dGVzKSArIDIgYnl0ZXMgcGFkIGlmIDI2LzMwIGhlYWRlciBzaXplLAotCSAqICsgOCBieXRlIElWIGZvciBDQ00gb3IgVEtJUCAobm90IHVzZWQgZm9yIFdFUCkKLQkgKiArIERhdGEgcGF5bG9hZAotCSAqICsgOC1ieXRlIE1JQyAobm90IHVzZWQgZm9yIENDTS9XRVApCi0JICogTk9URTogIERvZXMgbm90IGluY2x1ZGUgVHggY29tbWFuZCBieXRlcywgcG9zdC1NQUMgcGFkIGJ5dGVzLAotCSAqICAgICAgICBNSUMgKENDTSkgOCBieXRlcywgSUNWIChXRVAvVEtJUC9DS0lQKSA0IGJ5dGVzLCBDUkMgNCBieXRlcy5pCi0JICogUmFuZ2U6IDE0LTIzNDIgYnl0ZXMuCi0JICovCi0JX19sZTE2IGxlbjsKLQotCS8qCi0JICogTVBEVSBvciBNU0RVIGJ5dGUgY291bnQgZm9yIG5leHQgZnJhbWUuCi0JICogVXNlZCBmb3IgZnJhZ21lbnRhdGlvbiBhbmQgYnVyc3RpbmcsIGJ1dCBub3QgMTFuIGFnZ3JlZ2F0aW9uLgotCSAqIFNhbWUgYXMgImxlbiIsIGJ1dCBmb3IgbmV4dCBmcmFtZS4gIFNldCB0byAwIGlmIG5vdCBhcHBsaWNhYmxlLgotCSAqLwotCV9fbGUxNiBuZXh0X2ZyYW1lX2xlbjsKLQotCV9fbGUzMiB0eF9mbGFnczsJLyogVFhfQ01EX0ZMR18qICovCi0KLQkvKiB1Q29kZSBtYXkgbW9kaWZ5IHRoaXMgZmllbGQgb2YgdGhlIFR4IGNvbW1hbmQgKGluIGhvc3QgRFJBTSEpLgotCSAqIERyaXZlciBtdXN0IGFsc28gc2V0IGRyYW1fbHNiX3B0ciBhbmQgZHJhbV9tc2JfcHRyIGluIHRoaXMgY21kLiAqLwotCXN0cnVjdCBpd2xfZHJhbV9zY3JhdGNoIHNjcmF0Y2g7Ci0KLQkvKiBSYXRlIGZvciAqYWxsKiBUeCBhdHRlbXB0cywgaWYgVFhfQ01EX0ZMR19TVEFfUkFURV9NU0sgaXMgY2xlYXJlZC4gKi8KLQlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwkvKiBSQVRFX01DU18qICovCi0KLQkvKiBJbmRleCBvZiBkZXN0aW5hdGlvbiBzdGF0aW9uIGluIHVDb2RlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCXU4IHN0YV9pZDsKLQotCS8qIFR5cGUgb2Ygc2VjdXJpdHkgZW5jcnlwdGlvbjogIENDTSBvciBUS0lQICovCi0JdTggc2VjX2N0bDsJCS8qIFRYX0NNRF9TRUNfKiAqLwotCi0JLyoKLQkgKiBJbmRleCBpbnRvIHJhdGUgdGFibGUgKHNlZSBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EKSBmb3IgaW5pdGlhbAotCSAqIFR4IGF0dGVtcHQsIGlmIFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLIGlzIHNldC4gIE5vcm1hbGx5ICIwIiBmb3IKLQkgKiBkYXRhIGZyYW1lcywgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCB0byBzZWxlY3RpdmVseSByZWR1Y2UgaW5pdGlhbAotCSAqIHJhdGUgKHZpYSBub24tMCB2YWx1ZSkgZm9yIHNwZWNpYWwgZnJhbWVzIChlLmcuIG1hbmFnZW1lbnQpLCB3aGlsZQotCSAqIHN0aWxsIHN1cHBvcnRpbmcgcmF0ZSBzY2FsaW5nIGZvciBhbGwgZnJhbWVzLgotCSAqLwotCXU4IGluaXRpYWxfcmF0ZV9pbmRleDsKLQl1OCByZXNlcnZlZDsKLQl1OCBrZXlbMTZdOwotCV9fbGUxNiBuZXh0X2ZyYW1lX2ZsYWdzOwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JdW5pb24gewotCQlfX2xlMzIgbGlmZV90aW1lOwotCQlfX2xlMzIgYXR0ZW1wdDsKLQl9IHN0b3BfdGltZTsKLQotCS8qIEhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIHBvaW50ZXIgdG8gInNjcmF0Y2giIGluIHRoaXMgY29tbWFuZC4KLQkgKiBNdXN0IGJlIGR3b3JkIGFsaWduZWQuICAiMCIgaW4gZHJhbV9sc2JfcHRyIGRpc2FibGVzIHVzYWdlLiAqLwotCV9fbGUzMiBkcmFtX2xzYl9wdHI7Ci0JdTggZHJhbV9tc2JfcHRyOwotCi0JdTggcnRzX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTAgKi8KLQl1OCBkYXRhX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTEgKi8KLQl1OCB0aWRfdHNwZWM7Ci0JdW5pb24gewotCQlfX2xlMTYgcG1fZnJhbWVfdGltZW91dDsKLQkJX19sZTE2IGF0dGVtcHRfZHVyYXRpb247Ci0JfSB0aW1lb3V0OwotCi0JLyoKLQkgKiBEdXJhdGlvbiBvZiBFRENBIGJ1cnN0IFR4IE9wcG9ydHVuaXR5LCBpbiAzMi11c2VjIHVuaXRzLgotCSAqIFNldCB0aGlzIGlmIHR4b3AgdGltZSBpcyBub3Qgc3BlY2lmaWVkIGJ5IEhDQ0EgcHJvdG9jb2wgKGUuZy4gYnkgQVApLgotCSAqLwotCV9fbGUxNiBkcml2ZXJfdHhvcDsKLQotCS8qCi0JICogTUFDIGhlYWRlciBnb2VzIGhlcmUsIGZvbGxvd2VkIGJ5IDIgYnl0ZXMgcGFkZGluZyBpZiBNQUMgaGVhZGVyCi0JICogbGVuZ3RoIGlzIDI2IG9yIDMwIGJ5dGVzLCBmb2xsb3dlZCBieSBwYXlsb2FkIGRhdGEKLQkgKi8KLQl1OCBwYXlsb2FkWzBdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyIGhkclswXTsKLX0gX19wYWNrZWQ7Ci0KLS8qIFRYIGNvbW1hbmQgcmVzcG9uc2UgaXMgc2VudCBhZnRlciAqMzk0NSogdHJhbnNtaXNzaW9uIGF0dGVtcHRzLgotICoKLSAqIE5PVEVTOgotICoKLSAqIFRYX1NUQVRVU19GQUlMX05FWFRfRlJBRwotICoKLSAqIElmIHRoZSBmcmFnbWVudCBmbGFnIGluIHRoZSBNQUMgaGVhZGVyIGZvciB0aGUgZnJhbWUgYmVpbmcgdHJhbnNtaXR0ZWQKLSAqIGlzIHNldCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IHRpbWUgdG8gdHJhbnNtaXQgdGhlIG5leHQgZnJhbWUsIHRoZQotICogVFggc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCAnVFhfU1RBVFVTX0ZBSUxfTkVYVF9GUkFHJy4KLSAqCi0gKiBUWF9TVEFUVVNfRklGT19VTkRFUlJVTgotICoKLSAqIEluZGljYXRlcyB0aGUgaG9zdCBkaWQgbm90IHByb3ZpZGUgYnl0ZXMgdG8gdGhlIEZJRk8gZmFzdCBlbm91Z2ggd2hpbGUKLSAqIGEgVFggd2FzIGluIHByb2dyZXNzLgotICoKLSAqIFRYX1NUQVRVU19GQUlMX01HTU5UX0FCT1JUCi0gKgotICogVGhpcyBzdGF0dXMgaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgQUJPUlQgT04gTUdNVCBSWCBwYXJhbWV0ZXIgd2FzCi0gKiBzZXQgdG8gdHJ1ZSB3aXRoIHRoZSBUWCBjb21tYW5kLgotICoKLSAqIElmIHRoZSBNU0Igb2YgdGhlIHN0YXR1cyBwYXJhbWV0ZXIgaXMgc2V0IHRoZW4gYW4gYWJvcnQgc2VxdWVuY2UgaXMKLSAqIHJlcXVpcmVkLiAgVGhpcyBzZXF1ZW5jZSBjb25zaXN0cyBvZiB0aGUgaG9zdCBhY3RpdmF0aW5nIHRoZSBUWCBBYm9ydAotICogY29udHJvbCBsaW5lLCBhbmQgdGhlbiB3YWl0aW5nIGZvciB0aGUgVFggQWJvcnQgY29tbWFuZCByZXNwb25zZS4gIFRoaXMKLSAqIGluZGljYXRlcyB0aGF0IGEgdGhlIGRldmljZSBpcyBubyBsb25nZXIgaW4gYSB0cmFuc21pdCBzdGF0ZSwgYW5kIHRoYXQgdGhlCi0gKiBjb21tYW5kIEZJRk8gaGFzIGJlZW4gY2xlYXJlZC4gIFRoZSBob3N0IG11c3QgdGhlbiBkZWFjdGl2YXRlIHRoZSBUWCBBYm9ydAotICogY29udHJvbCBsaW5lLiAgUmVjZWl2aW5nIGlzIHN0aWxsIGFsbG93ZWQgaW4gdGhpcyBjYXNlLgotICovCi1lbnVtIHsKLQlUWF8zOTQ1X1NUQVRVU19TVUNDRVNTID0gMHgwMSwKLQlUWF8zOTQ1X1NUQVRVU19ESVJFQ1RfRE9ORSA9IDB4MDIsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9TSE9SVF9MSU1JVCA9IDB4ODIsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9MT05HX0xJTUlUID0gMHg4MywKLQlUWF8zOTQ1X1NUQVRVU19GQUlMX0ZJRk9fVU5ERVJSVU4gPSAweDg0LAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfTUdNTlRfQUJPUlQgPSAweDg1LAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfTkVYVF9GUkFHID0gMHg4NiwKLQlUWF8zOTQ1X1NUQVRVU19GQUlMX0xJRkVfRVhQSVJFID0gMHg4NywKLQlUWF8zOTQ1X1NUQVRVU19GQUlMX0RFU1RfUFMgPSAweDg4LAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfQUJPUlRFRCA9IDB4ODksCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9CVF9SRVRSWSA9IDB4OGEsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9TVEFfSU5WQUxJRCA9IDB4OGIsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9GUkFHX0RST1BQRUQgPSAweDhjLAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfVElEX0RJU0FCTEUgPSAweDhkLAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfRlJBTUVfRkxVU0hFRCA9IDB4OGUsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9JTlNVRkZJQ0lFTlRfQ0ZfUE9MTCA9IDB4OGYsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9UWF9MT0NLRUQgPSAweDkwLAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfTk9fQkVBQ09OX09OX1JBREFSID0gMHg5MSwKLX07Ci0KLS8qCi0gKiBUWCBjb21tYW5kIHJlc3BvbnNlIGlzIHNlbnQgYWZ0ZXIgKjQ5NjUqIHRyYW5zbWlzc2lvbiBhdHRlbXB0cy4KLSAqCi0gKiBib3RoIHBvc3Rwb25lIGFuZCBhYm9ydCBzdGF0dXMgYXJlIGV4cGVjdGVkIGJlaGF2aW9yIGZyb20gdUNvZGUuIHRoZXJlIGlzCi0gKiBubyBzcGVjaWFsIG9wZXJhdGlvbiByZXF1aXJlZCBmcm9tIGRyaXZlcjsgZXhjZXB0IGZvciBSRktJTExfRkxVU0gsCi0gKiB3aGljaCByZXF1aXJlZCB0eCBmbHVzaCBob3N0IGNvbW1hbmQgdG8gZmx1c2ggYWxsIHRoZSB0eCBmcmFtZXMgaW4gcXVldWVzCi0gKi8KLWVudW0gewotCVRYX1NUQVRVU19TVUNDRVNTID0gMHgwMSwKLQlUWF9TVEFUVVNfRElSRUNUX0RPTkUgPSAweDAyLAotCS8qIHBvc3Rwb25lIFRYICovCi0JVFhfU1RBVFVTX1BPU1RQT05FX0RFTEFZID0gMHg0MCwKLQlUWF9TVEFUVVNfUE9TVFBPTkVfRkVXX0JZVEVTID0gMHg0MSwKLQlUWF9TVEFUVVNfUE9TVFBPTkVfUVVJRVRfUEVSSU9EID0gMHg0MywKLQlUWF9TVEFUVVNfUE9TVFBPTkVfQ0FMQ19UVEFLID0gMHg0NCwKLQkvKiBhYm9ydCBUWCAqLwotCVRYX1NUQVRVU19GQUlMX0lOVEVSTkFMX0NST1NTRURfUkVUUlkgPSAweDgxLAotCVRYX1NUQVRVU19GQUlMX1NIT1JUX0xJTUlUID0gMHg4MiwKLQlUWF9TVEFUVVNfRkFJTF9MT05HX0xJTUlUID0gMHg4MywKLQlUWF9TVEFUVVNfRkFJTF9GSUZPX1VOREVSUlVOID0gMHg4NCwKLQlUWF9TVEFUVVNfRkFJTF9EUkFJTl9GTE9XID0gMHg4NSwKLQlUWF9TVEFUVVNfRkFJTF9SRktJTExfRkxVU0ggPSAweDg2LAotCVRYX1NUQVRVU19GQUlMX0xJRkVfRVhQSVJFID0gMHg4NywKLQlUWF9TVEFUVVNfRkFJTF9ERVNUX1BTID0gMHg4OCwKLQlUWF9TVEFUVVNfRkFJTF9IT1NUX0FCT1JURUQgPSAweDg5LAotCVRYX1NUQVRVU19GQUlMX0JUX1JFVFJZID0gMHg4YSwKLQlUWF9TVEFUVVNfRkFJTF9TVEFfSU5WQUxJRCA9IDB4OGIsCi0JVFhfU1RBVFVTX0ZBSUxfRlJBR19EUk9QUEVEID0gMHg4YywKLQlUWF9TVEFUVVNfRkFJTF9USURfRElTQUJMRSA9IDB4OGQsCi0JVFhfU1RBVFVTX0ZBSUxfRklGT19GTFVTSEVEID0gMHg4ZSwKLQlUWF9TVEFUVVNfRkFJTF9JTlNVRkZJQ0lFTlRfQ0ZfUE9MTCA9IDB4OGYsCi0JVFhfU1RBVFVTX0ZBSUxfUEFTU0lWRV9OT19SWCA9IDB4OTAsCi0JVFhfU1RBVFVTX0ZBSUxfTk9fQkVBQ09OX09OX1JBREFSID0gMHg5MSwKLX07Ci0KLSNkZWZpbmUJVFhfUEFDS0VUX01PREVfUkVHVUxBUgkJMHgwMDAwCi0jZGVmaW5lCVRYX1BBQ0tFVF9NT0RFX0JVUlNUX1NFUQkweDAxMDAKLSNkZWZpbmUJVFhfUEFDS0VUX01PREVfQlVSU1RfRklSU1QJMHgwMjAwCi0KLWVudW0gewotCVRYX1BPV0VSX1BBX05PVF9BQ1RJVkUgPSAweDAsCi19OwotCi1lbnVtIHsKLQlUWF9TVEFUVVNfTVNLID0gMHgwMDAwMDBmZiwJCS8qIGJpdHMgMDo3ICovCi0JVFhfU1RBVFVTX0RFTEFZX01TSyA9IDB4MDAwMDAwNDAsCi0JVFhfU1RBVFVTX0FCT1JUX01TSyA9IDB4MDAwMDAwODAsCi0JVFhfUEFDS0VUX01PREVfTVNLID0gMHgwMDAwZmYwMCwJLyogYml0cyA4OjE1ICovCi0JVFhfRklGT19OVU1CRVJfTVNLID0gMHgwMDA3MDAwMCwJLyogYml0cyAxNjoxOCAqLwotCVRYX1JFU0VSVkVEID0gMHgwMDc4MDAwMCwJCS8qIGJpdHMgMTk6MjIgKi8KLQlUWF9QT1dFUl9QQV9ERVRFQ1RfTVNLID0gMHg3ZjgwMDAwMCwJLyogYml0cyAyMzozMCAqLwotCVRYX0FCT1JUX1JFUVVJUkVEX01TSyA9IDB4ODAwMDAwMDAsCS8qIGJpdHMgMzE6MzEgKi8KLX07Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRYIGFnZ3JlZ2F0aW9uIHN0YXR1cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotZW51bSB7Ci0JQUdHX1RYX1NUQVRFX1RSQU5TTUlUVEVEID0gMHgwMCwKLQlBR0dfVFhfU1RBVEVfVU5ERVJSVU5fTVNLID0gMHgwMSwKLQlBR0dfVFhfU1RBVEVfRkVXX0JZVEVTX01TSyA9IDB4MDQsCi0JQUdHX1RYX1NUQVRFX0FCT1JUX01TSyA9IDB4MDgsCi0JQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9UVExfTVNLID0gMHgxMCwKLQlBR0dfVFhfU1RBVEVfTEFTVF9TRU5UX1RSWV9DTlRfTVNLID0gMHgyMCwKLQlBR0dfVFhfU1RBVEVfU0NEX1FVRVJZX01TSyA9IDB4ODAsCi0JQUdHX1RYX1NUQVRFX1RFU1RfQkFEX0NSQzMyX01TSyA9IDB4MTAwLAotCUFHR19UWF9TVEFURV9SRVNQT05TRV9NU0sgPSAweDFmZiwKLQlBR0dfVFhfU1RBVEVfRFVNUF9UWF9NU0sgPSAweDIwMCwKLQlBR0dfVFhfU1RBVEVfREVMQVlfVFhfTVNLID0gMHg0MDAKLX07Ci0KLSNkZWZpbmUgQUdHX1RYX1NUQVRVU19NU0sJMHgwMDAwMGZmZgkvKiBiaXRzIDA6MTEgKi8KLSNkZWZpbmUgQUdHX1RYX1RSWV9NU0sJCTB4MDAwMGYwMDAJLyogYml0cyAxMjoxNSAqLwotCi0jZGVmaW5lIEFHR19UWF9TVEFURV9MQVNUX1NFTlRfTVNLICAoQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9UVExfTVNLIHwgXAotCQkJCSAgICAgQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9UUllfQ05UX01TSykKLQotLyogIyB0eCBhdHRlbXB0cyBmb3IgZmlyc3QgZnJhbWUgaW4gYWdncmVnYXRpb24gKi8KLSNkZWZpbmUgQUdHX1RYX1NUQVRFX1RSWV9DTlRfUE9TIDEyCi0jZGVmaW5lIEFHR19UWF9TVEFURV9UUllfQ05UX01TSyAweGYwMDAKLQotLyogQ29tbWFuZCBJRCBhbmQgc2VxdWVuY2UgbnVtYmVyIG9mIFR4IGNvbW1hbmQgZm9yIHRoaXMgZnJhbWUgKi8KLSNkZWZpbmUgQUdHX1RYX1NUQVRFX1NFUV9OVU1fUE9TIDE2Ci0jZGVmaW5lIEFHR19UWF9TVEFURV9TRVFfTlVNX01TSyAweGZmZmYwMDAwCi0KLS8qCi0gKiBSRVBMWV9UWCA9IDB4MWMgKHJlc3BvbnNlKQotICoKLSAqIFRoaXMgcmVzcG9uc2UgbWF5IGJlIGluIG9uZSBvZiB0d28gc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm1hdHMsIGluZGljYXRlZAotICogYnkgdGhlIGZyYW1lX2NvdW50IGZpZWxkOgotICoKLSAqIDEpICBObyBhZ2dyZWdhdGlvbiAoZnJhbWVfY291bnQgPT0gMSkuICBUaGlzIHJlcG9ydHMgVHggcmVzdWx0cyBmb3IKLSAqICAgICBhIHNpbmdsZSBmcmFtZS4gIE11bHRpcGxlIGF0dGVtcHRzLCBhdCB2YXJpb3VzIGJpdCByYXRlcywgbWF5IGhhdmUKLSAqICAgICBiZWVuIG1hZGUgZm9yIHRoaXMgZnJhbWUuCi0gKgotICogMikgIEFnZ3JlZ2F0aW9uIChmcmFtZV9jb3VudCA+IDEpLiAgVGhpcyByZXBvcnRzIFR4IHJlc3VsdHMgZm9yCi0gKiAgICAgMiBvciBtb3JlIGZyYW1lcyB0aGF0IHVzZWQgYmxvY2stYWNrbm93bGVkZ2UuICBBbGwgZnJhbWVzIHdlcmUKLSAqICAgICB0cmFuc21pdHRlZCBhdCBzYW1lIHJhdGUuICBSYXRlIHNjYWxpbmcgbWF5IGhhdmUgYmVlbiB1c2VkIGlmIGZpcnN0Ci0gKiAgICAgZnJhbWUgaW4gdGhpcyBuZXcgYWdnIGJsb2NrIGZhaWxlZCBpbiBwcmV2aW91cyBhZ2cgYmxvY2socykuCi0gKgotICogICAgIE5vdGUgdGhhdCwgZm9yIGFnZ3JlZ2F0aW9uLCBBQ0sgKGJsb2NrLWFjaykgc3RhdHVzIGlzIG5vdCBkZWxpdmVyZWQgaGVyZTsKLSAqICAgICBibG9jay1hY2sgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIGJ5IHRoZSB0aW1lIHRoZSA0OTY1IGRldmljZSByZWNvcmRzCi0gKiAgICAgdGhpcyBzdGF0dXMuCi0gKiAgICAgVGhpcyBzdGF0dXMgcmVsYXRlcyB0byByZWFzb25zIHRoZSB0eCBtaWdodCBoYXZlIGJlZW4gYmxvY2tlZCBvciBhYm9ydGVkCi0gKiAgICAgd2l0aGluIHRoZSBzZW5kaW5nIHN0YXRpb24gKHRoaXMgNDk2NSBkZXZpY2UpLCByYXRoZXIgdGhhbiB3aGV0aGVyIGl0IHdhcwotICogICAgIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSBieSB0aGUgZGVzdGluYXRpb24gc3RhdGlvbi4KLSAqLwotc3RydWN0IGFnZ190eF9zdGF0dXMgewotCV9fbGUxNiBzdGF0dXM7Ci0JX19sZTE2IHNlcXVlbmNlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bDQ5NjVfdHhfcmVzcCB7Ci0JdTggZnJhbWVfY291bnQ7CQkvKiAxIG5vIGFnZ3JlZ2F0aW9uLCA+MSBhZ2dyZWdhdGlvbiAqLwotCXU4IGJ0X2tpbGxfY291bnQ7CS8qICMgYmxvY2tlZCBieSBibHVldG9vdGggKHVudXNlZCBmb3IgYWdnKSAqLwotCXU4IGZhaWx1cmVfcnRzOwkJLyogIyBmYWlsdXJlcyBkdWUgdG8gdW5zdWNjZXNzZnVsIFJUUyAqLwotCXU4IGZhaWx1cmVfZnJhbWU7CS8qICMgZmFpbHVyZXMgZHVlIHRvIG5vIEFDSyAodW51c2VkIGZvciBhZ2cpICovCi0KLQkvKiBGb3Igbm9uLWFnZzogIFJhdGUgYXQgd2hpY2ggZnJhbWUgd2FzIHN1Y2Nlc3NmdWwuCi0JICogRm9yIGFnZzogIFJhdGUgYXQgd2hpY2ggYWxsIGZyYW1lcyB3ZXJlIHRyYW5zbWl0dGVkLiAqLwotCV9fbGUzMiByYXRlX25fZmxhZ3M7CS8qIFJBVEVfTUNTXyogICovCi0KLQkvKiBGb3Igbm9uLWFnZzogIFJUUyArIENUUyArIGZyYW1lIHR4IGF0dGVtcHRzIHRpbWUgKyBBQ0suCi0JICogRm9yIGFnZzogIFJUUyArIENUUyArIGFnZ3JlZ2F0aW9uIHR4IHRpbWUgKyBibG9jay1hY2sgdGltZS4gKi8KLQlfX2xlMTYgd2lyZWxlc3NfbWVkaWFfdGltZTsJLyogdVNlY3MgKi8KLQotCV9fbGUxNiByZXNlcnZlZDsKLQlfX2xlMzIgcGFfcG93ZXIxOwkvKiBSRiBwb3dlciBhbXBsaWZpZXIgbWVhc3VyZW1lbnQgKG5vdCB1c2VkKSAqLwotCV9fbGUzMiBwYV9wb3dlcjI7Ci0KLQkvKgotCSAqIEZvciBub24tYWdnOiAgZnJhbWUgc3RhdHVzIFRYX1NUQVRVU18qCi0JICogRm9yIGFnZzogIHN0YXR1cyBvZiAxc3QgZnJhbWUsIEFHR19UWF9TVEFURV8qOyBvdGhlciBmcmFtZSBzdGF0dXMKLQkgKiAgICAgICAgICAgZmllbGRzIGZvbGxvdyB0aGlzIG9uZSwgdXAgdG8gZnJhbWVfY291bnQuCi0JICogICAgICAgICAgIEJpdCBmaWVsZHM6Ci0JICogICAgICAgICAgIDExLSAwOiAgQUdHX1RYX1NUQVRFXyogc3RhdHVzIGNvZGUKLQkgKiAgICAgICAgICAgMTUtMTI6ICBSZXRyeSBjb3VudCBmb3IgMXN0IGZyYW1lIGluIGFnZ3JlZ2F0aW9uIChyZXRyaWVzCi0JICogICAgICAgICAgICAgICAgICAgb2NjdXIgaWYgdHggZmFpbGVkIGZvciB0aGlzIGZyYW1lIHdoZW4gaXQgd2FzIGEKLQkgKiAgICAgICAgICAgICAgICAgICBtZW1iZXIgb2YgYSBwcmV2aW91cyBhZ2dyZWdhdGlvbiBibG9jaykuICBJZiByYXRlCi0JICogICAgICAgICAgICAgICAgICAgc2NhbGluZyBpcyB1c2VkLCByZXRyeSBjb3VudCBpbmRpY2F0ZXMgdGhlIHJhdGUKLQkgKiAgICAgICAgICAgICAgICAgICB0YWJsZSBlbnRyeSB1c2VkIGZvciBhbGwgZnJhbWVzIGluIHRoZSBuZXcgYWdnLgotCSAqICAgICAgICAgICAzMS0xNjogIFNlcXVlbmNlICMgZm9yIHRoaXMgZnJhbWUncyBUeCBjbWQgKG5vdCBTU04hKQotCSAqLwotCXVuaW9uIHsKLQkJX19sZTMyIHN0YXR1czsKLQkJc3RydWN0IGFnZ190eF9zdGF0dXMgYWdnX3N0YXR1c1swXTsgLyogZm9yIGVhY2ggYWdnIGZyYW1lICovCi0JfSB1OwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFJFUExZX0NPTVBSRVNTRURfQkEgPSAweGM1IChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQotICoKLSAqIFJlcG9ydHMgQmxvY2stQWNrbm93bGVkZ2UgZnJvbSByZWNpcGllbnQgc3RhdGlvbgotICovCi1zdHJ1Y3QgaXdsX2NvbXByZXNzZWRfYmFfcmVzcCB7Ci0JX19sZTMyIHN0YV9hZGRyX2xvMzI7Ci0JX19sZTE2IHN0YV9hZGRyX2hpMTY7Ci0JX19sZTE2IHJlc2VydmVkOwotCi0JLyogSW5kZXggb2YgcmVjaXBpZW50IChCQS1zZW5kaW5nKSBzdGF0aW9uIGluIHVDb2RlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCXU4IHN0YV9pZDsKLQl1OCB0aWQ7Ci0JX19sZTE2IHNlcV9jdGw7Ci0JX19sZTY0IGJpdG1hcDsKLQlfX2xlMTYgc2NkX2Zsb3c7Ci0JX19sZTE2IHNjZF9zc247Ci19IF9fcGFja2VkOwotCi0vKgotICogUkVQTFlfVFhfUFdSX1RBQkxFX0NNRCA9IDB4OTcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBTZWUgZGV0YWlscyB1bmRlciAiVFhQT1dFUiIgaW4gaXdsLTQ5NjUtaHcuaC4KLSAqLwotCi1zdHJ1Y3QgaXdsMzk0NV90eHBvd2VydGFibGVfY21kIHsKLQl1OCBiYW5kOwkJLyogMDogNSBHSHosIDE6IDIuNCBHSHogKi8KLQl1OCByZXNlcnZlZDsKLQlfX2xlMTYgY2hhbm5lbDsKLQlzdHJ1Y3QgaXdsMzk0NV9wb3dlcl9wZXJfcmF0ZSBwb3dlcltJV0xfTUFYX1JBVEVTXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2w0OTY1X3R4cG93ZXJ0YWJsZV9jbWQgewotCXU4IGJhbmQ7CQkvKiAwOiA1IEdIeiwgMTogMi40IEdIeiAqLwotCXU4IHJlc2VydmVkOwotCV9fbGUxNiBjaGFubmVsOwotCXN0cnVjdCBpd2w0OTY1X3R4X3Bvd2VyX2RiIHR4X3Bvd2VyOwotfSBfX3BhY2tlZDsKLQotCi0vKioKLSAqIHN0cnVjdCBpd2wzOTQ1X3JhdGVfc2NhbGluZ19jbWQgLSBSYXRlIFNjYWxpbmcgQ29tbWFuZCAmIFJlc3BvbnNlCi0gKgotICogUkVQTFlfUkFURV9TQ0FMRSA9IDB4NDcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBOT1RFOiBUaGUgdGFibGUgb2YgcmF0ZXMgcGFzc2VkIHRvIHRoZSB1Q29kZSB2aWEgdGhlCi0gKiBSQVRFX1NDQUxFIGNvbW1hbmQgc2V0cyB1cCB0aGUgY29ycmVzcG9uZGluZyBvcmRlciBvZgotICogcmF0ZXMgdXNlZCBmb3IgYWxsIHJlbGF0ZWQgY29tbWFuZHMsIGluY2x1ZGluZyByYXRlCi0gKiBtYXNrcywgZXRjLgotICoKLSAqIEZvciBleGFtcGxlLCBpZiB5b3Ugc2V0IDlNQiAoUExDUCAweDBmKSBhcyB0aGUgZmlyc3QKLSAqIHJhdGUgaW4gdGhlIHJhdGUgdGFibGUsIHRoZSBiaXQgbWFzayBmb3IgdGhhdCByYXRlCi0gKiB3aGVuIHBhc3NlZCB0aHJvdWdoIG9mZG1fYmFzaWNfcmF0ZXMgb24gdGhlIFJFUExZX1JYT04KLSAqIGNvbW1hbmQgd291bGQgYmUgYml0IDAgKDEgPDwgMCkKLSAqLwotc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsaW5nX2luZm8gewotCV9fbGUxNiByYXRlX25fZmxhZ3M7Ci0JdTggdHJ5X2NudDsKLQl1OCBuZXh0X3JhdGVfaW5kZXg7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxpbmdfY21kIHsKLQl1OCB0YWJsZV9pZDsKLQl1OCByZXNlcnZlZFszXTsKLQlzdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxpbmdfaW5mbyB0YWJsZVtJV0xfTUFYX1JBVEVTXTsKLX0gX19wYWNrZWQ7Ci0KLQotLypSU19ORVdfQVBJOiBvbmx5IFRMQ19SVFMgcmVtYWlucyBhbmQgbW92ZWQgdG8gYml0IDAgKi8KLSNkZWZpbmUgIExJTktfUVVBTF9GTEFHU19TRVRfU1RBX1RMQ19SVFNfTVNLCSgxIDw8IDApCi0KLS8qICMgb2YgRURDQSBwcmlvcml0aXplZCB0eCBmaWZvcyAqLwotI2RlZmluZSAgTElOS19RVUFMX0FDX05VTSBBQ19OVU0KLQotLyogIyBlbnRyaWVzIGluIHJhdGUgc2NhbGUgdGFibGUgdG8gc3VwcG9ydCBUeCByZXRyaWVzICovCi0jZGVmaW5lICBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSAxNgotCi0vKiBUeCBhbnRlbm5hIHNlbGVjdGlvbiB2YWx1ZXMgKi8KLSNkZWZpbmUgIExJTktfUVVBTF9BTlRfQV9NU0sgKDEgPDwgMCkKLSNkZWZpbmUgIExJTktfUVVBTF9BTlRfQl9NU0sgKDEgPDwgMSkKLSNkZWZpbmUgIExJTktfUVVBTF9BTlRfTVNLICAgKExJTktfUVVBTF9BTlRfQV9NU0t8TElOS19RVUFMX0FOVF9CX01TSykKLQotCi0vKioKLSAqIHN0cnVjdCBpd2xfbGlua19xdWFsX2dlbmVyYWxfcGFyYW1zCi0gKgotICogVXNlZCBpbiBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01ECi0gKi8KLXN0cnVjdCBpd2xfbGlua19xdWFsX2dlbmVyYWxfcGFyYW1zIHsKLQl1OCBmbGFnczsKLQotCS8qIE5vIGVudHJpZXMgYXQgb3IgYWJvdmUgdGhpcyAoZHJpdmVyIGNob3NlbikgaW5kZXggY29udGFpbiBNSU1PICovCi0JdTggbWltb19kZWxpbWl0ZXI7Ci0KLQkvKiBCZXN0IHNpbmdsZSBhbnRlbm5hIHRvIHVzZSBmb3Igc2luZ2xlIHN0cmVhbSAobGVnYWN5LCBTSVNPKS4gKi8KLQl1OCBzaW5nbGVfc3RyZWFtX2FudF9tc2s7CS8qIExJTktfUVVBTF9BTlRfKiAqLwotCi0JLyogQmVzdCBhbnRlbm5hcyB0byB1c2UgZm9yIE1JTU8gKHVudXNlZCBmb3IgNDk2NSwgYXNzdW1lcyBib3RoKS4gKi8KLQl1OCBkdWFsX3N0cmVhbV9hbnRfbXNrOwkJLyogTElOS19RVUFMX0FOVF8qICovCi0KLQkvKgotCSAqIElmIGRyaXZlciBuZWVkcyB0byB1c2UgZGlmZmVyZW50IGluaXRpYWwgcmF0ZXMgZm9yIGRpZmZlcmVudAotCSAqIEVEQ0EgUU9TIGFjY2VzcyBjYXRlZ29yaWVzIChhcyBpbXBsZW1lbnRlZCBieSB0eCBmaWZvcyAwLTMpLAotCSAqIHRoaXMgdGFibGUgd2lsbCBzZXQgdGhhdCB1cCwgYnkgaW5kaWNhdGluZyB0aGUgaW5kZXhlcyBpbiB0aGUKLQkgKiByc190YWJsZVtMSU5LX1FVQUxfTUFYX1JFVFJZX05VTV0gcmF0ZSB0YWJsZSBhdCB3aGljaCB0byBzdGFydC4KLQkgKiBPdGhlcndpc2UsIGRyaXZlciBzaG91bGQgc2V0IGFsbCBlbnRyaWVzIHRvIDAuCi0JICoKLQkgKiBFbnRyeSB1c2FnZToKLQkgKiAwID0gQmFja2dyb3VuZCwgMSA9IEJlc3QgRWZmb3J0IChub3JtYWwpLCAyID0gVmlkZW8sIDMgPSBWb2ljZQotCSAqIFRYIEZJRk9zIGFib3ZlIDMgdXNlIHNhbWUgdmFsdWUgKHR5cGljYWxseSAwKSBhcyBUWCBGSUZPIDMuCi0JICovCi0JdTggc3RhcnRfcmF0ZV9pbmRleFtMSU5LX1FVQUxfQUNfTlVNXTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX0RFRgkoNDAwMCkgLyogNCBtaWxsaXNlY29uZHMgKi8KLSNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX01BWAkoODAwMCkKLSNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX01JTgkoMTAwKQotCi0jZGVmaW5lIExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUYJKDMpCi0jZGVmaW5lIExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9NQVgJKDI1NSkKLSNkZWZpbmUgTElOS19RVUFMX0FHR19ESVNBQkxFX1NUQVJUX01JTgkoMCkKLQotI2RlZmluZSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRgkoMzEpCi0jZGVmaW5lIExJTktfUVVBTF9BR0dfRlJBTUVfTElNSVRfTUFYCSg2MykKLSNkZWZpbmUgTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9NSU4JKDApCi0KLS8qKgotICogc3RydWN0IGl3bF9saW5rX3F1YWxfYWdnX3BhcmFtcwotICoKLSAqIFVzZWQgaW4gUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRAotICovCi1zdHJ1Y3QgaXdsX2xpbmtfcXVhbF9hZ2dfcGFyYW1zIHsKLQotCS8qCi0JICpNYXhpbXVtIG51bWJlciBvZiB1U2VjIGluIGFnZ3JlZ2F0aW9uLgotCSAqIGRlZmF1bHQgc2V0IHRvIDQwMDAgKDQgbWlsbGlzZWNvbmRzKSBpZiBub3QgY29uZmlndXJlZCBpbiAuY2ZnCi0JICovCi0JX19sZTE2IGFnZ190aW1lX2xpbWl0OwotCi0JLyoKLQkgKiBOdW1iZXIgb2YgVHggcmV0cmllcyBhbGxvd2VkIGZvciBhIGZyYW1lLCBiZWZvcmUgdGhhdCBmcmFtZSB3aWxsCi0JICogbm8gbG9uZ2VyIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBzdGFydCBvZiBhbiBhZ2dyZWdhdGlvbiBzZXF1ZW5jZQotCSAqIChzY2hlZHVsZXIgd2lsbCB0aGVuIHRyeSB0byB0eCBpdCBhcyBzaW5nbGUgZnJhbWUpLgotCSAqIERyaXZlciBzaG91bGQgc2V0IHRoaXMgdG8gMy4KLQkgKi8KLQl1OCBhZ2dfZGlzX3N0YXJ0X3RoOwotCi0JLyoKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgaW4gYWdncmVnYXRpb24uCi0JICogMCA9IG5vIGxpbWl0IChkZWZhdWx0KS4gIDEgPSBubyBhZ2dyZWdhdGlvbi4KLQkgKiBPdGhlciB2YWx1ZXMgPSBtYXggIyBmcmFtZXMgaW4gYWdncmVnYXRpb24uCi0JICovCi0JdTggYWdnX2ZyYW1lX2NudF9saW1pdDsKLQotCV9fbGUzMiByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICoKLSAqIEZvciA0OTY1IGRldmljZXMgb25seTsgMzk0NSB1c2VzIFJFUExZX1JBVEVfU0NBTEUuCi0gKgotICogRWFjaCBzdGF0aW9uIGluIHRoZSA0OTY1IGRldmljZSdzIGludGVybmFsIHN0YXRpb24gdGFibGUgaGFzIGl0cyBvd24gdGFibGUKLSAqIG9mIDE2Ci0gKiBUeCByYXRlcyBhbmQgbW9kdWxhdGlvbiBtb2RlcyAoZS5nLiBsZWdhY3kvU0lTTy9NSU1PKSBmb3IgcmV0cnlpbmcgVHggd2hlbgotICogYW4gQUNLIGlzIG5vdCByZWNlaXZlZC4gIFRoaXMgY29tbWFuZCByZXBsYWNlcyB0aGUgZW50aXJlIHRhYmxlIGZvcgotICogb25lIHN0YXRpb24uCi0gKgotICogTk9URTogIFN0YXRpb24gbXVzdCBhbHJlYWR5IGJlIGluIDQ5NjUgZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZS4KLSAqCSAgVXNlIFJFUExZX0FERF9TVEEuCi0gKgotICogVGhlIHJhdGUgc2NhbGluZyBwcm9jZWR1cmVzIGRlc2NyaWJlZCBiZWxvdyB3b3JrIHdlbGwuICBPZiBjb3Vyc2UsIG90aGVyCi0gKiBwcm9jZWR1cmVzIGFyZSBwb3NzaWJsZSwgYW5kIG1heSB3b3JrIGJldHRlciBmb3IgcGFydGljdWxhciBlbnZpcm9ubWVudHMuCi0gKgotICoKLSAqIEZJTExJTkcgVEhFIFJBVEUgVEFCTEUKLSAqCi0gKiBHaXZlbiBhIHBhcnRpY3VsYXIgaW5pdGlhbCByYXRlIGFuZCBtb2RlLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSByYXRlCi0gKiBzY2FsaW5nIGFsZ29yaXRobSBkZXNjcmliZWQgYmVsb3csIHRoZSBMaW51eCBkcml2ZXIgdXNlcyB0aGUgZm9sbG93aW5nCi0gKiBmb3JtdWxhIHRvIGZpbGwgdGhlIHJzX3RhYmxlW0xJTktfUVVBTF9NQVhfUkVUUllfTlVNXSByYXRlIHRhYmxlIGluIHRoZQotICogTGluayBRdWFsaXR5IGNvbW1hbmQ6Ci0gKgotICoKLSAqIDEpICBJZiB1c2luZyBIaWdoLXRocm91Z2hwdXQgKEhUKSAoU0lTTyBvciBNSU1PKSBpbml0aWFsIHJhdGU6Ci0gKiAgICAgYSkgVXNlIHRoaXMgc2FtZSBpbml0aWFsIHJhdGUgZm9yIGZpcnN0IDMgZW50cmllcy4KLSAqICAgICBiKSBGaW5kIG5leHQgbG93ZXIgYXZhaWxhYmxlIHJhdGUgdXNpbmcgc2FtZSBtb2RlIChTSVNPIG9yIE1JTU8pLAotICogICAgICAgIHVzZSBmb3IgbmV4dCAzIGVudHJpZXMuICBJZiBubyBsb3dlciByYXRlIGF2YWlsYWJsZSwgc3dpdGNoIHRvCi0gKiAgICAgICAgbGVnYWN5IG1vZGUgKG5vIEhUNDAgY2hhbm5lbCwgbm8gTUlNTywgbm8gc2hvcnQgZ3VhcmQgaW50ZXJ2YWwpLgotICogICAgIGMpIElmIHVzaW5nIE1JTU8sIHNldCBjb21tYW5kJ3MgbWltb19kZWxpbWl0ZXIgdG8gbnVtYmVyIG9mIGVudHJpZXMKLSAqICAgICAgICB1c2luZyBNSU1PICgzIG9yIDYpLgotICogICAgIGQpIEFmdGVyIHRyeWluZyAyIEhUIHJhdGVzLCBzd2l0Y2ggdG8gbGVnYWN5IG1vZGUgKG5vIEhUNDAgY2hhbm5lbCwKLSAqICAgICAgICBubyBNSU1PLCBubyBzaG9ydCBndWFyZCBpbnRlcnZhbCksIGF0IHRoZSBuZXh0IGxvd2VyIGJpdCByYXRlCi0gKiAgICAgICAgKGUuZy4gaWYgc2Vjb25kIEhUIGJpdCByYXRlIHdhcyA1NCwgdHJ5IDQ4IGxlZ2FjeSksIGFuZCBmb2xsb3cKLSAqICAgICAgICBsZWdhY3kgcHJvY2VkdXJlIGZvciByZW1haW5pbmcgdGFibGUgZW50cmllcy4KLSAqCi0gKiAyKSAgSWYgdXNpbmcgbGVnYWN5IGluaXRpYWwgcmF0ZToKLSAqICAgICBhKSBVc2UgdGhlIGluaXRpYWwgcmF0ZSBmb3Igb25seSBvbmUgZW50cnkuCi0gKiAgICAgYikgRm9yIGVhY2ggZm9sbG93aW5nIGVudHJ5LCByZWR1Y2UgdGhlIHJhdGUgdG8gbmV4dCBsb3dlciBhdmFpbGFibGUKLSAqICAgICAgICByYXRlLCB1bnRpbCByZWFjaGluZyB0aGUgbG93ZXN0IGF2YWlsYWJsZSByYXRlLgotICogICAgIGMpIFdoZW4gcmVkdWNpbmcgcmF0ZSwgYWxzbyBzd2l0Y2ggYW50ZW5uYSBzZWxlY3Rpb24uCi0gKiAgICAgZCkgT25jZSBsb3dlc3QgYXZhaWxhYmxlIHJhdGUgaXMgcmVhY2hlZCwgcmVwZWF0IHRoaXMgcmF0ZSB1bnRpbAotICogICAgICAgIHJhdGUgdGFibGUgaXMgZmlsbGVkICgxNiBlbnRyaWVzKSwgc3dpdGNoaW5nIGFudGVubmEgZWFjaCBlbnRyeS4KLSAqCi0gKgotICogQUNDVU1VTEFUSU5HIEhJU1RPUlkKLSAqCi0gKiBUaGUgcmF0ZSBzY2FsaW5nIGFsZ29yaXRobSBmb3IgNDk2NSBkZXZpY2VzLCBhcyBpbXBsZW1lbnRlZCBpbiBMaW51eCBkcml2ZXIsCi0gKiB1c2VzIHR3byBzZXRzIG9mIGZyYW1lIFR4IHN1Y2Nlc3MgaGlzdG9yeTogIE9uZSBmb3IgdGhlIGN1cnJlbnQvYWN0aXZlCi0gKiBtb2R1bGF0aW9uIG1vZGUsIGFuZCBvbmUgZm9yIGEgc3BlY3VsYXRpdmUvc2VhcmNoIG1vZGUgdGhhdCBpcyBiZWluZwotICogYXR0ZW1wdGVkLiBJZiB0aGUgc3BlY3VsYXRpdmUgbW9kZSB0dXJucyBvdXQgdG8gYmUgbW9yZSBlZmZlY3RpdmUgKGkuZS4KLSAqIGFjdHVhbCB0cmFuc2ZlciByYXRlIGlzIGJldHRlciksIHRoZW4gdGhlIGRyaXZlciBjb250aW51ZXMgdG8gdXNlIHRoZQotICogc3BlY3VsYXRpdmUgbW9kZSBhcyB0aGUgbmV3IGN1cnJlbnQgYWN0aXZlIG1vZGUuCi0gKgotICogRWFjaCBoaXN0b3J5IHNldCBjb250YWlucywgc2VwYXJhdGVseSBmb3IgZWFjaCBwb3NzaWJsZSByYXRlLCBkYXRhIGZvciBhCi0gKiBzbGlkaW5nIHdpbmRvdyBvZiB0aGUgNjIgbW9zdCByZWNlbnQgdHggYXR0ZW1wdHMgYXQgdGhhdCByYXRlLiAgVGhlIGRhdGEKLSAqIGluY2x1ZGVzIGEgc2hpZnRpbmcgYml0bWFwIG9mIHN1Y2Nlc3MoMSkvZmFpbHVyZSgwKSwgYW5kIHN1bXMgb2Ygc3VjY2Vzc2Z1bAotICogYW5kIGF0dGVtcHRlZCBmcmFtZXMsIGZyb20gd2hpY2ggdGhlIGRyaXZlciBjYW4gYWRkaXRpb25hbGx5IGNhbGN1bGF0ZSBhCi0gKiBzdWNjZXNzIHJhdGlvIChzdWNjZXNzIC8gYXR0ZW1wdGVkKSBhbmQgbnVtYmVyIG9mIGZhaWx1cmVzCi0gKiAoYXR0ZW1wdGVkIC0gc3VjY2VzcyksIGFuZCBjb250cm9sIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cgKGF0dGVtcHRlZCkuCi0gKiBUaGUgZHJpdmVyIHVzZXMgdGhlIGJpdCBtYXAgdG8gcmVtb3ZlIHN1Y2Nlc3NlcyBmcm9tIHRoZSBzdWNjZXNzIHN1bSwgYXMKLSAqIHRoZSBvbGRlc3QgdHggYXR0ZW1wdHMgZmFsbCBvdXQgb2YgdGhlIHdpbmRvdy4KLSAqCi0gKiBXaGVuIHRoZSA0OTY1IGRldmljZSBtYWtlcyBtdWx0aXBsZSB0eCBhdHRlbXB0cyBmb3IgYSBnaXZlbiBmcmFtZSwgZWFjaAotICogYXR0ZW1wdCBtaWdodCBiZSBhdCBhIGRpZmZlcmVudCByYXRlLCBhbmQgaGF2ZSBkaWZmZXJlbnQgbW9kdWxhdGlvbgotICogY2hhcmFjdGVyaXN0aWNzIChlLmcuIGFudGVubmEsIGZhdCBjaGFubmVsLCBzaG9ydCBndWFyZCBpbnRlcnZhbCksIGFzIHNldAotICogdXAgaW4gdGhlIHJhdGUgc2NhbGluZyB0YWJsZSBpbiB0aGUgTGluayBRdWFsaXR5IGNvbW1hbmQuICBUaGUgZHJpdmVyIG11c3QKLSAqIGRldGVybWluZSB3aGljaCByYXRlIHRhYmxlIGVudHJ5IHdhcyB1c2VkIGZvciBlYWNoIHR4IGF0dGVtcHQsIHRvIGRldGVybWluZQotICogd2hpY2ggcmF0ZS1zcGVjaWZpYyBoaXN0b3J5IHRvIHVwZGF0ZSwgYW5kIHJlY29yZCBvbmx5IHRob3NlIGF0dGVtcHRzIHRoYXQKLSAqIG1hdGNoIHRoZSBtb2R1bGF0aW9uIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgaGlzdG9yeSBzZXQuCi0gKgotICogV2hlbiB1c2luZyBibG9jay1hY2sgKGFnZ3JlZ2F0aW9uKSwgYWxsIGZyYW1lcyBhcmUgdHJhbnNtaXR0ZWQgYXQgdGhlIHNhbWUKLSAqIHJhdGUsIHNpbmNlIHRoZXJlIGlzIG5vIHBlci1hdHRlbXB0IGFja25vd2xlZGdtZW50IGZyb20gdGhlIGRlc3RpbmF0aW9uCi0gKiBzdGF0aW9uLiAgVGhlIFR4IHJlc3BvbnNlIHN0cnVjdCBpd2xfdHhfcmVzcCBpbmRpY2F0ZXMgdGhlIFR4IHJhdGUgaW4KLSAqIHJhdGVfbl9mbGFncyBmaWVsZC4gIEFmdGVyIHJlY2VpdmluZyBhIGJsb2NrLWFjaywgdGhlIGRyaXZlciBjYW4gdXBkYXRlCi0gKiBoaXN0b3J5IGZvciB0aGUgZW50aXJlIGJsb2NrIGFsbCBhdCBvbmNlLgotICoKLSAqCi0gKiBGSU5ESU5HIEJFU1QgU1RBUlRJTkcgUkFURToKLSAqCi0gKiBXaGVuIHdvcmtpbmcgd2l0aCBhIHNlbGVjdGVkIGluaXRpYWwgbW9kdWxhdGlvbiBtb2RlIChzZWUgYmVsb3cpLCB0aGUKLSAqIGRyaXZlciBhdHRlbXB0cyB0byBmaW5kIGEgYmVzdCBpbml0aWFsIHJhdGUuICBUaGUgaW5pdGlhbCByYXRlIGlzIHRoZQotICogZmlyc3QgZW50cnkgaW4gdGhlIExpbmsgUXVhbGl0eSBjb21tYW5kJ3MgcmF0ZSB0YWJsZS4KLSAqCi0gKiAxKSAgQ2FsY3VsYXRlIGFjdHVhbCB0aHJvdWdocHV0IChzdWNjZXNzIHJhdGlvICogZXhwZWN0ZWQgdGhyb3VnaHB1dCwgc2VlCi0gKiAgICAgdGFibGUgYmVsb3cpIGZvciBjdXJyZW50IGluaXRpYWwgcmF0ZS4gIERvIHRoaXMgb25seSBpZiBlbm91Z2ggZnJhbWVzCi0gKiAgICAgaGF2ZSBiZWVuIGF0dGVtcHRlZCB0byBtYWtlIHRoZSB2YWx1ZSBtZWFuaW5nZnVsOiAgYXQgbGVhc3QgNiBmYWlsZWQKLSAqICAgICB0eCBhdHRlbXB0cywgb3IgYXQgbGVhc3QgOCBzdWNjZXNzZXMuICBJZiBub3QgZW5vdWdoLCBkb24ndCB0cnkgcmF0ZQotICogICAgIHNjYWxpbmcgeWV0LgotICoKLSAqIDIpICBGaW5kIGF2YWlsYWJsZSByYXRlcyBhZGphY2VudCB0byBjdXJyZW50IGluaXRpYWwgcmF0ZS4gIEF2YWlsYWJsZSBtZWFuczoKLSAqICAgICBhKSAgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlICYmCi0gKiAgICAgYikgIHN1cHBvcnRlZCBieSBhc3NvY2lhdGlvbiAmJgotICogICAgIGMpICB3aXRoaW4gYW55IGNvbnN0cmFpbnRzIHNlbGVjdGVkIGJ5IHVzZXIKLSAqCi0gKiAzKSAgR2F0aGVyIG1lYXN1cmVkIHRocm91Z2hwdXRzIGZvciBhZGphY2VudCByYXRlcy4gIFRoZXNlIG1pZ2h0IG5vdCBoYXZlCi0gKiAgICAgZW5vdWdoIGhpc3RvcnkgdG8gY2FsY3VsYXRlIGEgdGhyb3VnaHB1dC4gIFRoYXQncyBva2F5LCB3ZSBtaWdodCB0cnkKLSAqICAgICB1c2luZyBvbmUgb2YgdGhlbSBhbnl3YXkhCi0gKgotICogNCkgIFRyeSBkZWNyZWFzaW5nIHJhdGUgaWYsIGZvciBjdXJyZW50IHJhdGU6Ci0gKiAgICAgYSkgIHN1Y2Nlc3MgcmF0aW8gaXMgPCAxNSUgfHwKLSAqICAgICBiKSAgbG93ZXIgYWRqYWNlbnQgcmF0ZSBoYXMgYmV0dGVyIG1lYXN1cmVkIHRocm91Z2hwdXQgfHwKLSAqICAgICBjKSAgaGlnaGVyIGFkamFjZW50IHJhdGUgaGFzIHdvcnNlIHRocm91Z2hwdXQsIGFuZCBsb3dlciBpcyB1bm1lYXN1cmVkCi0gKgotICogICAgIEFzIGEgc2FuaXR5IGNoZWNrLCBpZiBkZWNyZWFzZSB3YXMgZGV0ZXJtaW5lZCBhYm92ZSwgbGVhdmUgcmF0ZQotICogICAgIHVuY2hhbmdlZCBpZjoKLSAqICAgICBhKSAgbG93ZXIgcmF0ZSB1bmF2YWlsYWJsZQotICogICAgIGIpICBzdWNjZXNzIHJhdGlvIGF0IGN1cnJlbnQgcmF0ZSA+IDg1JSAodmVyeSBnb29kKQotICogICAgIGMpICBjdXJyZW50IG1lYXN1cmVkIHRocm91Z2hwdXQgaXMgYmV0dGVyIHRoYW4gZXhwZWN0ZWQgdGhyb3VnaHB1dAotICogICAgICAgICBvZiBsb3dlciByYXRlICh1bmRlciBwZXJmZWN0IDEwMCUgdHggY29uZGl0aW9ucywgc2VlIHRhYmxlIGJlbG93KQotICoKLSAqIDUpICBUcnkgaW5jcmVhc2luZyByYXRlIGlmLCBmb3IgY3VycmVudCByYXRlOgotICogICAgIGEpICBzdWNjZXNzIHJhdGlvIGlzIDwgMTUlIHx8Ci0gKiAgICAgYikgIGJvdGggYWRqYWNlbnQgcmF0ZXMnIHRocm91Z2hwdXRzIGFyZSB1bm1lYXN1cmVkICh0cnkgaXQhKSB8fAotICogICAgIGIpICBoaWdoZXIgYWRqYWNlbnQgcmF0ZSBoYXMgYmV0dGVyIG1lYXN1cmVkIHRocm91Z2hwdXQgfHwKLSAqICAgICBjKSAgbG93ZXIgYWRqYWNlbnQgcmF0ZSBoYXMgd29yc2UgdGhyb3VnaHB1dCwgYW5kIGhpZ2hlciBpcyB1bm1lYXN1cmVkCi0gKgotICogICAgIEFzIGEgc2FuaXR5IGNoZWNrLCBpZiBpbmNyZWFzZSB3YXMgZGV0ZXJtaW5lZCBhYm92ZSwgbGVhdmUgcmF0ZQotICogICAgIHVuY2hhbmdlZCBpZjoKLSAqICAgICBhKSAgc3VjY2VzcyByYXRpbyBhdCBjdXJyZW50IHJhdGUgPCA3MCUuICBUaGlzIGlzIG5vdCBwYXJ0aWN1bGFybHkKLSAqICAgICAgICAgZ29vZCBwZXJmb3JtYW5jZTsgaGlnaGVyIHJhdGUgaXMgc3VyZSB0byBoYXZlIHBvb3JlciBzdWNjZXNzLgotICoKLSAqIDYpICBSZS1ldmFsdWF0ZSB0aGUgcmF0ZSBhZnRlciBlYWNoIHR4IGZyYW1lLiAgSWYgd29ya2luZyB3aXRoIGJsb2NrLQotICogICAgIGFja25vd2xlZGdlLCBoaXN0b3J5IGFuZCBzdGF0aXN0aWNzIG1heSBiZSBjYWxjdWxhdGVkIGZvciB0aGUgZW50aXJlCi0gKiAgICAgYmxvY2sgKGluY2x1ZGluZyBwcmlvciBoaXN0b3J5IHRoYXQgZml0cyB3aXRoaW4gdGhlIGhpc3Rvcnkgd2luZG93cyksCi0gKiAgICAgYmVmb3JlIHJlLWV2YWx1YXRpb24uCi0gKgotICogRklORElORyBCRVNUIFNUQVJUSU5HIE1PRFVMQVRJT04gTU9ERToKLSAqCi0gKiBBZnRlciB3b3JraW5nIHdpdGggYSBtb2R1bGF0aW9uIG1vZGUgZm9yIGEgIndoaWxlIiAoYW5kIGRvaW5nIHJhdGUgc2NhbGluZyksCi0gKiB0aGUgZHJpdmVyIHNlYXJjaGVzIGZvciBhIG5ldyBpbml0aWFsIG1vZGUgaW4gYW4gYXR0ZW1wdCB0byBpbXByb3ZlCi0gKiB0aHJvdWdocHV0LiAgVGhlICJ3aGlsZSIgaXMgbWVhc3VyZWQgYnkgbnVtYmVycyBvZiBhdHRlbXB0ZWQgZnJhbWVzOgotICoKLSAqIEZvciBsZWdhY3kgbW9kZSwgc2VhcmNoIGZvciBuZXcgbW9kZSBhZnRlcjoKLSAqICAgNDgwIHN1Y2Nlc3NmdWwgZnJhbWVzLCBvciAxNjAgZmFpbGVkIGZyYW1lcwotICogRm9yIGhpZ2gtdGhyb3VnaHB1dCBtb2RlcyAoU0lTTyBvciBNSU1PKSwgc2VhcmNoIGZvciBuZXcgbW9kZSBhZnRlcjoKLSAqICAgNDUwMCBzdWNjZXNzZnVsIGZyYW1lcywgb3IgNDAwIGZhaWxlZCBmcmFtZXMKLSAqCi0gKiBNb2RlIHN3aXRjaCBwb3NzaWJpbGl0aWVzIGFyZSAoMyBmb3IgZWFjaCBtb2RlKToKLSAqCi0gKiBGb3IgbGVnYWN5OgotICogICBDaGFuZ2UgYW50ZW5uYSwgdHJ5IFNJU08gKGlmIEhUIGFzc29jaWF0aW9uKSwgdHJ5IE1JTU8gKGlmIEhUIGFzc29jaWF0aW9uKQotICogRm9yIFNJU086Ci0gKiAgIENoYW5nZSBhbnRlbm5hLCB0cnkgTUlNTywgdHJ5IHNob3J0ZW5lZCBndWFyZCBpbnRlcnZhbCAoU0dJKQotICogRm9yIE1JTU86Ci0gKiAgIFRyeSBTSVNPIGFudGVubmEgQSwgU0lTTyBhbnRlbm5hIEIsIHRyeSBzaG9ydGVuZWQgZ3VhcmQgaW50ZXJ2YWwgKFNHSSkKLSAqCi0gKiBXaGVuIHRyeWluZyBhIG5ldyBtb2RlLCB1c2UgdGhlIHNhbWUgYml0IHJhdGUgYXMgdGhlIG9sZC9jdXJyZW50IG1vZGUgd2hlbgotICogdHJ5aW5nIGFudGVubmEgc3dpdGNoZXMgYW5kIHNob3J0ZW5lZCBndWFyZCBpbnRlcnZhbC4gIFdoZW4gc3dpdGNoaW5nIHRvCi0gKiBTSVNPIGZyb20gTUlNTyBvciBsZWdhY3ksIG9yIHRvIE1JTU8gZnJvbSBTSVNPIG9yIGxlZ2FjeSwgdXNlIGEgcmF0ZQotICogZm9yIHdoaWNoIHRoZSBleHBlY3RlZCB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpIGlzIGFib3V0IHRoZQotICogc2FtZSBvciBzbGlnaHRseSBiZXR0ZXIgdGhhbiB0aGUgYWN0dWFsIG1lYXN1cmVkIHRocm91Z2hwdXQgZGVsaXZlcmVkIGJ5Ci0gKiB0aGUgb2xkL2N1cnJlbnQgbW9kZS4KLSAqCi0gKiBBY3R1YWwgdGhyb3VnaHB1dCBjYW4gYmUgZXN0aW1hdGVkIGJ5IG11bHRpcGx5aW5nIHRoZSBleHBlY3RlZCB0aHJvdWdocHV0Ci0gKiBieSB0aGUgc3VjY2VzcyByYXRpbyAoc3VjY2Vzc2Z1bCAvIGF0dGVtcHRlZCB0eCBmcmFtZXMpLiAgRnJhbWUgc2l6ZSBpcwotICogbm90IGNvbnNpZGVyZWQgaW4gdGhpcyBjYWxjdWxhdGlvbjsgaXQgYXNzdW1lcyB0aGF0IGZyYW1lIHNpemUgd2lsbCBhdmVyYWdlCi0gKiBvdXQgdG8gYmUgZmFpcmx5IGNvbnNpc3RlbnQgb3ZlciBzZXZlcmFsIHNhbXBsZXMuICBUaGUgZm9sbG93aW5nIGFyZQotICogbWV0cmljIHZhbHVlcyBmb3IgZXhwZWN0ZWQgdGhyb3VnaHB1dCBhc3N1bWluZyAxMDAlIHN1Y2Nlc3MgcmF0aW8uCi0gKiBPbmx5IEcgYmFuZCBoYXMgc3VwcG9ydCBmb3IgQ0NLIHJhdGVzOgotICoKLSAqICAgICAgICAgICBSQVRFOiAgMSAgICAyICAgIDUgICAxMSAgICA2ICAgOSAgIDEyICAgMTggICAyNCAgIDM2ICAgNDggICA1NCAgIDYwCi0gKgotICogICAgICAgICAgICAgIEc6ICA3ICAgMTMgICAzNSAgIDU4ICAgNDAgIDU3ICAgNzIgICA5OCAgMTIxICAxNTQgIDE3NyAgMTg2ICAxODYKLSAqICAgICAgICAgICAgICBBOiAgMCAgICAwICAgIDAgICAgMCAgIDQwICA1NyAgIDcyICAgOTggIDEyMSAgMTU0ICAxNzcgIDE4NiAgMTg2Ci0gKiAgICAgU0lTTyAyME1IejogIDAgICAgMCAgICAwICAgIDAgICA0MiAgNDIgICA3NiAgMTAyICAxMjQgIDE1OSAgMTgzICAxOTMgIDIwMgotICogU0dJIFNJU08gMjBNSHo6ICAwICAgIDAgICAgMCAgICAwICAgNDYgIDQ2ICAgODIgIDExMCAgMTMyICAxNjggIDE5MiAgMjAyICAyMTEKLSAqICAgICBNSU1PIDIwTUh6OiAgMCAgICAwICAgIDAgICAgMCAgIDc0ICA3NCAgMTIzICAxNTUgIDE3OSAgMjE0ICAyMzYgIDI0NCAgMjUxCi0gKiBTR0kgTUlNTyAyME1IejogIDAgICAgMCAgICAwICAgIDAgICA4MSAgODEgIDEzMSAgMTY0ICAxODggIDIyMiAgMjQzICAyNTEgIDI1NwotICogICAgIFNJU08gNDBNSHo6ICAwICAgIDAgICAgMCAgICAwICAgNzcgIDc3ICAxMjcgIDE2MCAgMTg0ICAyMjAgIDI0MiAgMjUwICAyNTcKLSAqIFNHSSBTSVNPIDQwTUh6OiAgMCAgICAwICAgIDAgICAgMCAgIDgzICA4MyAgMTM1ICAxNjkgIDE5MyAgMjI5ICAyNTAgIDI1NyAgMjY0Ci0gKiAgICAgTUlNTyA0ME1IejogIDAgICAgMCAgICAwICAgIDAgIDEyMyAxMjMgIDE4MiAgMjE0ICAyMzUgIDI2NCAgMjc5ICAyODUgIDI4OQotICogU0dJIE1JTU8gNDBNSHo6ICAwICAgIDAgICAgMCAgICAwICAxMzEgMTMxICAxOTEgIDIyMiAgMjQyICAyNzAgIDI4NCAgMjg5ICAyOTMKLSAqCi0gKiBBZnRlciB0aGUgbmV3IG1vZGUgaGFzIGJlZW4gdHJpZWQgZm9yIGEgc2hvcnQgd2hpbGUgKG1pbmltdW0gb2YgNiBmYWlsZWQKLSAqIGZyYW1lcyBvciA4IHN1Y2Nlc3NmdWwgZnJhbWVzKSwgY29tcGFyZSBzdWNjZXNzIHJhdGlvIGFuZCBhY3R1YWwgdGhyb3VnaHB1dAotICogZXN0aW1hdGUgb2YgdGhlIG5ldyBtb2RlIHdpdGggdGhlIG9sZC4gIElmIGVpdGhlciBpcyBiZXR0ZXIgd2l0aCB0aGUgbmV3Ci0gKiBtb2RlLCBjb250aW51ZSB0byB1c2UgdGhlIG5ldyBtb2RlLgotICoKLSAqIENvbnRpbnVlIGNvbXBhcmluZyBtb2RlcyB1bnRpbCBhbGwgMyBwb3NzaWJpbGl0aWVzIGhhdmUgYmVlbiB0cmllZC4KLSAqIElmIG1vdmluZyBmcm9tIGxlZ2FjeSB0byBIVCwgdHJ5IGFsbCAzIHBvc3NpYmlsaXRpZXMgZnJvbSB0aGUgbmV3IEhUCi0gKiBtb2RlLiAgQWZ0ZXIgdHJ5aW5nIGFsbCAzLCBhIGJlc3QgbW9kZSBpcyBmb3VuZC4gIENvbnRpbnVlIHRvIHVzZSB0aGlzIG1vZGUKLSAqIGZvciB0aGUgbG9uZ2VyICJ3aGlsZSIgZGVzY3JpYmVkIGFib3ZlIChlLmcuIDQ4MCBzdWNjZXNzZnVsIGZyYW1lcyBmb3IKLSAqIGxlZ2FjeSksIGFuZCB0aGVuIHJlcGVhdCB0aGUgc2VhcmNoIHByb2Nlc3MuCi0gKgotICovCi1zdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgewotCi0JLyogSW5kZXggb2YgZGVzdGluYXRpb24vcmVjaXBpZW50IHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlICovCi0JdTggc3RhX2lkOwotCXU4IHJlc2VydmVkMTsKLQlfX2xlMTYgY29udHJvbDsJCS8qIG5vdCB1c2VkICovCi0Jc3RydWN0IGl3bF9saW5rX3F1YWxfZ2VuZXJhbF9wYXJhbXMgZ2VuZXJhbF9wYXJhbXM7Ci0Jc3RydWN0IGl3bF9saW5rX3F1YWxfYWdnX3BhcmFtcyBhZ2dfcGFyYW1zOwotCi0JLyoKLQkgKiBSYXRlIGluZm87IHdoZW4gdXNpbmcgcmF0ZS1zY2FsaW5nLCBUeCBjb21tYW5kJ3MgaW5pdGlhbF9yYXRlX2luZGV4Ci0JICogc3BlY2lmaWVzIDFzdCBUeCByYXRlIGF0dGVtcHRlZCwgdmlhIGluZGV4IGludG8gdGhpcyB0YWJsZS4KLQkgKiA0OTY1IGRldmljZXMgd29ya3MgaXRzIHdheSB0aHJvdWdoIHRhYmxlIHdoZW4gcmV0cnlpbmcgVHguCi0JICovCi0Jc3RydWN0IHsKLQkJX19sZTMyIHJhdGVfbl9mbGFnczsJLyogUkFURV9NQ1NfKiwgSVdMX1JBVEVfKiAqLwotCX0gcnNfdGFibGVbTElOS19RVUFMX01BWF9SRVRSWV9OVU1dOwotCV9fbGUzMiByZXNlcnZlZDI7Ci19IF9fcGFja2VkOwotCi0vKgotICogQlQgY29uZmlndXJhdGlvbiBlbmFibGUgZmxhZ3M6Ci0gKiAgIGJpdCAwIC0gMTogQlQgY2hhbm5lbCBhbm5vdW5jZW1lbnQgZW5hYmxlZAotICogICAgICAgICAgIDA6IGRpc2FibGUKLSAqICAgYml0IDEgLSAxOiBwcmlvcml0eSBvZiBCVCBkZXZpY2UgZW5hYmxlZAotICogICAgICAgICAgIDA6IGRpc2FibGUKLSAqLwotI2RlZmluZSBCVF9DT0VYX0RJU0FCTEUgKDB4MCkKLSNkZWZpbmUgQlRfRU5BQkxFX0NIQU5ORUxfQU5OT1VOQ0UgQklUKDApCi0jZGVmaW5lIEJUX0VOQUJMRV9QUklPUklUWQkgICBCSVQoMSkKLQotI2RlZmluZSBCVF9DT0VYX0VOQUJMRSAgKEJUX0VOQUJMRV9DSEFOTkVMX0FOTk9VTkNFIHwgQlRfRU5BQkxFX1BSSU9SSVRZKQotCi0jZGVmaW5lIEJUX0xFQURfVElNRV9ERUYgKDB4MUUpCi0KLSNkZWZpbmUgQlRfTUFYX0tJTExfREVGICgweDUpCi0KLS8qCi0gKiBSRVBMWV9CVF9DT05GSUcgPSAweDliIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCi0gKgotICogMzk0NSBhbmQgNDk2NSBkZXZpY2VzIHN1cHBvcnQgaGFyZHdhcmUgaGFuZHNoYWtlIHdpdGggQmx1ZXRvb3RoIGRldmljZSBvbgotICogc2FtZSBwbGF0Zm9ybS4gIEJsdWV0b290aCBkZXZpY2UgYWxlcnRzIHdpcmVsZXNzIGRldmljZSB3aGVuIGl0IHdpbGwgVHg7Ci0gKiB3aXJlbGVzcyBkZXZpY2UgY2FuIGRlbGF5IG9yIGtpbGwgaXRzIG93biBUeCB0byBhY2NvbW1vZGF0ZS4KLSAqLwotc3RydWN0IGl3bF9idF9jbWQgewotCXU4IGZsYWdzOwotCXU4IGxlYWRfdGltZTsKLQl1OCBtYXhfa2lsbDsKLQl1OCByZXNlcnZlZDsKLQlfX2xlMzIga2lsbF9hY2tfbWFzazsKLQlfX2xlMzIga2lsbF9jdHNfbWFzazsKLX0gX19wYWNrZWQ7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDYpCi0gKiBTcGVjdHJ1bSBNYW5hZ2VtZW50ICg4MDIuMTFoKSBDb21tYW5kcywgUmVzcG9uc2VzLCBOb3RpZmljYXRpb25zOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFNwZWN0cnVtIE1hbmFnZW1lbnQKLSAqLwotI2RlZmluZSBNRUFTVVJFTUVOVF9GSUxURVJfRkxBRyAoUlhPTl9GSUxURVJfUFJPTUlTQ19NU0sgICAgICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLICAgICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0sgICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfRElTX0dSUF9ERUNSWVBUX01TSyB8IFwKLQkJCQkgUlhPTl9GSUxURVJfQVNTT0NfTVNLICAgICAgICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0spCi0KLXN0cnVjdCBpd2xfbWVhc3VyZV9jaGFubmVsIHsKLQlfX2xlMzIgZHVyYXRpb247CS8qIG1lYXN1cmVtZW50IGR1cmF0aW9uIGluIGV4dGVuZGVkIGJlYWNvbgotCQkJCSAqIGZvcm1hdCAqLwotCXU4IGNoYW5uZWw7CQkvKiBjaGFubmVsIHRvIG1lYXN1cmUgKi8KLQl1OCB0eXBlOwkJLyogc2VlIGVudW0gaXdsX21lYXN1cmVfdHlwZSAqLwotCV9fbGUxNiByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV9TUEVDVFJVTV9NRUFTVVJFTUVOVF9DTUQgPSAweDc0IChjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX3NwZWN0cnVtX2NtZCB7Ci0JX19sZTE2IGxlbjsJCS8qIG51bWJlciBvZiBieXRlcyBzdGFydGluZyBmcm9tIHRva2VuICovCi0JdTggdG9rZW47CQkvKiB0b2tlbiBpZCAqLwotCXU4IGlkOwkJCS8qIG1lYXN1cmVtZW50IGlkIC0tIDAgb3IgMSAqLwotCXU4IG9yaWdpbjsJCS8qIDAgPSBUR2gsIDEgPSBvdGhlciwgMiA9IFRHayAqLwotCXU4IHBlcmlvZGljOwkJLyogMSA9IHBlcmlvZGljICovCi0JX19sZTE2IHBhdGhfbG9zc190aW1lb3V0OwotCV9fbGUzMiBzdGFydF90aW1lOwkvKiBzdGFydCB0aW1lIGluIGV4dGVuZGVkIGJlYWNvbiBmb3JtYXQgKi8KLQlfX2xlMzIgcmVzZXJ2ZWQyOwotCV9fbGUzMiBmbGFnczsJCS8qIHJ4b24gZmxhZ3MgKi8KLQlfX2xlMzIgZmlsdGVyX2ZsYWdzOwkvKiByeG9uIGZpbHRlciBmbGFncyAqLwotCV9fbGUxNiBjaGFubmVsX2NvdW50OwkvKiBtaW5pbXVtIDEsIG1heGltdW0gMTAgKi8KLQlfX2xlMTYgcmVzZXJ2ZWQzOwotCXN0cnVjdCBpd2xfbWVhc3VyZV9jaGFubmVsIGNoYW5uZWxzWzEwXTsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV9TUEVDVFJVTV9NRUFTVVJFTUVOVF9DTUQgPSAweDc0IChyZXNwb25zZSkKLSAqLwotc3RydWN0IGl3bF9zcGVjdHJ1bV9yZXNwIHsKLQl1OCB0b2tlbjsKLQl1OCBpZDsJCQkvKiBpZCBvZiB0aGUgcHJpb3IgY29tbWFuZCByZXBsYWNlZCwgb3IgMHhmZiAqLwotCV9fbGUxNiBzdGF0dXM7CQkvKiAwIC0gY29tbWFuZCB3aWxsIGJlIGhhbmRsZWQKLQkJCQkgKiAxIC0gY2Fubm90IGhhbmRsZSAoY29uZmxpY3RzIHdpdGggYW5vdGhlcgotCQkJCSAqICAgICBtZWFzdXJlbWVudCkgKi8KLX0gX19wYWNrZWQ7Ci0KLWVudW0gaXdsX21lYXN1cmVtZW50X3N0YXRlIHsKLQlJV0xfTUVBU1VSRU1FTlRfU1RBUlQgPSAwLAotCUlXTF9NRUFTVVJFTUVOVF9TVE9QID0gMSwKLX07Ci0KLWVudW0gaXdsX21lYXN1cmVtZW50X3N0YXR1cyB7Ci0JSVdMX01FQVNVUkVNRU5UX09LID0gMCwKLQlJV0xfTUVBU1VSRU1FTlRfQ09OQ1VSUkVOVCA9IDEsCi0JSVdMX01FQVNVUkVNRU5UX0NTQV9DT05GTElDVCA9IDIsCi0JSVdMX01FQVNVUkVNRU5UX1RHSF9DT05GTElDVCA9IDMsCi0JLyogNC01IHJlc2VydmVkICovCi0JSVdMX01FQVNVUkVNRU5UX1NUT1BQRUQgPSA2LAotCUlXTF9NRUFTVVJFTUVOVF9USU1FT1VUID0gNywKLQlJV0xfTUVBU1VSRU1FTlRfUEVSSU9ESUNfRkFJTEVEID0gOCwKLX07Ci0KLSNkZWZpbmUgTlVNX0VMRU1FTlRTX0lOX0hJU1RPR1JBTSA4Ci0KLXN0cnVjdCBpd2xfbWVhc3VyZW1lbnRfaGlzdG9ncmFtIHsKLQlfX2xlMzIgb2ZkbVtOVU1fRUxFTUVOVFNfSU5fSElTVE9HUkFNXTsJLyogaW4gMC44dXNlYyBjb3VudHMgKi8KLQlfX2xlMzIgY2NrW05VTV9FTEVNRU5UU19JTl9ISVNUT0dSQU1dOwkvKiBpbiAxdXNlYyBjb3VudHMgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIGNsZWFyIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNvdW50ZXJzICovCi1zdHJ1Y3QgaXdsX21lYXN1cmVtZW50X2NjYV9jb3VudGVycyB7Ci0JX19sZTMyIG9mZG07Ci0JX19sZTMyIGNjazsKLX0gX19wYWNrZWQ7Ci0KLWVudW0gaXdsX21lYXN1cmVfdHlwZSB7Ci0JSVdMX01FQVNVUkVfQkFTSUMgPSAoMSA8PCAwKSwKLQlJV0xfTUVBU1VSRV9DSEFOTkVMX0xPQUQgPSAoMSA8PCAxKSwKLQlJV0xfTUVBU1VSRV9ISVNUT0dSQU1fUlBJID0gKDEgPDwgMiksCi0JSVdMX01FQVNVUkVfSElTVE9HUkFNX05PSVNFID0gKDEgPDwgMyksCi0JSVdMX01FQVNVUkVfRlJBTUUgPSAoMSA8PCA0KSwKLQkvKiBiaXRzIDU6NiBhcmUgcmVzZXJ2ZWQgKi8KLQlJV0xfTUVBU1VSRV9JRExFID0gKDEgPDwgNyksCi19OwotCi0vKgotICogU1BFQ1RSVU1fTUVBU1VSRV9OT1RJRklDQVRJT04gPSAweDc1IChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKLSAqLwotc3RydWN0IGl3bF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gewotCXU4IGlkOwkJCS8qIG1lYXN1cmVtZW50IGlkIC0tIDAgb3IgMSAqLwotCXU4IHRva2VuOwotCXU4IGNoYW5uZWxfaW5kZXg7CS8qIGluZGV4IGluIG1lYXN1cmVtZW50IGNoYW5uZWwgbGlzdCAqLwotCXU4IHN0YXRlOwkJLyogMCAtIHN0YXJ0LCAxIC0gc3RvcCAqLwotCV9fbGUzMiBzdGFydF90aW1lOwkvKiBsb3dlciAzMi1iaXRzIG9mIFRTRiAqLwotCXU4IGJhbmQ7CQkvKiAwIC0gNS4yR0h6LCAxIC0gMi40R0h6ICovCi0JdTggY2hhbm5lbDsKLQl1OCB0eXBlOwkJLyogc2VlIGVudW0gaXdsX21lYXN1cmVtZW50X3R5cGUgKi8KLQl1OCByZXNlcnZlZDE7Ci0JLyogTk9URTogIGNjYV9vZmRtLCBjY2FfY2NrLCBiYXNpY190eXBlLCBhbmQgaGlzdG9ncmFtIGFyZSBvbmx5IG9ubHkKLQkgKiB2YWxpZCBpZiBhcHBsaWNhYmxlIGZvciBtZWFzdXJlbWVudCB0eXBlIHJlcXVlc3RlZC4gKi8KLQlfX2xlMzIgY2NhX29mZG07CS8qIGNjYSBmcmFjdGlvbiB0aW1lIGluIDQwTWh6IGNsb2NrIHBlcmlvZHMgKi8KLQlfX2xlMzIgY2NhX2NjazsJCS8qIGNjYSBmcmFjdGlvbiB0aW1lIGluIDQ0TWh6IGNsb2NrIHBlcmlvZHMgKi8KLQlfX2xlMzIgY2NhX3RpbWU7CS8qIGNoYW5uZWwgbG9hZCB0aW1lIGluIHVzZWNzICovCi0JdTggYmFzaWNfdHlwZTsJCS8qIDAgLSBic3MsIDEgLSBvZmRtIHByZWFtYmxlLCAyIC0KLQkJCQkgKiB1bmlkZW50aWZpZWQgKi8KLQl1OCByZXNlcnZlZDJbM107Ci0Jc3RydWN0IGl3bF9tZWFzdXJlbWVudF9oaXN0b2dyYW0gaGlzdG9ncmFtOwotCV9fbGUzMiBzdG9wX3RpbWU7CS8qIGxvd2VyIDMyLWJpdHMgb2YgVFNGICovCi0JX19sZTMyIHN0YXR1czsJCS8qIHNlZSBpd2xfbWVhc3VyZW1lbnRfc3RhdHVzICovCi19IF9fcGFja2VkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoNykKLSAqIFBvd2VyIE1hbmFnZW1lbnQgQ29tbWFuZHMsIFJlc3BvbnNlcywgTm90aWZpY2F0aW9uczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCAtIFBvd2VyIFRhYmxlIENvbW1hbmQKLSAqIEBmbGFnczogU2VlIGJlbG93OgotICoKLSAqIFBPV0VSX1RBQkxFX0NNRCA9IDB4NzcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBQTSBhbGxvdzoKLSAqICAgYml0IDAgLSAnMCcgRHJpdmVyIG5vdCBhbGxvdyBwb3dlciBtYW5hZ2VtZW50Ci0gKiAgICAgICAgICAgJzEnIERyaXZlciBhbGxvdyBQTSAodXNlIHJlc3Qgb2YgcGFyYW1ldGVycykKLSAqCi0gKiB1Q29kZSBzZW5kIHNsZWVwIG5vdGlmaWNhdGlvbnM6Ci0gKiAgIGJpdCAxIC0gJzAnIERvbid0IHNlbmQgc2xlZXAgbm90aWZpY2F0aW9uCi0gKiAgICAgICAgICAgJzEnIHNlbmQgc2xlZXAgbm90aWZpY2F0aW9uIChTRU5EX1BNX05PVElGSUNBVElPTikKLSAqCi0gKiBTbGVlcCBvdmVyIERUSU0KLSAqICAgYml0IDIgLSAnMCcgUE0gaGF2ZSB0byB3YWxrIHVwIGV2ZXJ5IERUSU0KLSAqICAgICAgICAgICAnMScgUE0gY291bGQgc2xlZXAgb3ZlciBEVElNIHRpbGwgbGlzdGVuIEludGVydmFsLgotICoKLSAqIFBDSSBwb3dlciBtYW5hZ2VkCi0gKiAgIGJpdCAzIC0gJzAnIChQQ0lfQ0ZHX0xJTktfQ1RSTCAmIDB4MSkKLSAqICAgICAgICAgICAnMScgIShQQ0lfQ0ZHX0xJTktfQ1RSTCAmIDB4MSkKLSAqCi0gKiBGYXN0IFBECi0gKiAgIGJpdCA0IC0gJzEnIFB1dCByYWRpbyB0byBzbGVlcCB3aGVuIHJlY2VpdmluZyBmcmFtZSBmb3Igb3RoZXJzCi0gKgotICogRm9yY2Ugc2xlZXAgTW9kZXMKLSAqICAgYml0IDMxLzMwLSAnMDAnIHVzZSBib3RoIG1hYy94dGFsIHNsZWVwcwotICogICAgICAgICAgICAgICcwMScgZm9yY2UgTWFjIHNsZWVwCi0gKiAgICAgICAgICAgICAgJzEwJyBmb3JjZSB4dGFsIHNsZWVwCi0gKiAgICAgICAgICAgICAgJzExJyBJbGxlZ2FsIHNldAotICoKLSAqIE5PVEU6IGlmIHNsZWVwX2ludGVydmFsW1NMRUVQX0lOVFJWTF9UQUJMRV9TSVpFLTFdID4gRFRJTSBwZXJpb2QgdGhlbgotICogdWNvZGUgYXNzdW1lIHNsZWVwIG92ZXIgRFRJTSBpcyBhbGxvd2VkIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHdha2UgdXAKLSAqIGZvciBldmVyeSBEVElNLgotICovCi0jZGVmaW5lIElXTF9QT1dFUl9WRUNfU0laRSA1Ci0KLSNkZWZpbmUgSVdMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0sJY3B1X3RvX2xlMTYoQklUKDApKQotI2RlZmluZSBJV0xfUE9XRVJfUENJX1BNX01TSwkJCWNwdV90b19sZTE2KEJJVCgzKSkKLQotc3RydWN0IGl3bDM5NDVfcG93ZXJ0YWJsZV9jbWQgewotCV9fbGUxNiBmbGFnczsKLQl1OCByZXNlcnZlZFsyXTsKLQlfX2xlMzIgcnhfZGF0YV90aW1lb3V0OwotCV9fbGUzMiB0eF9kYXRhX3RpbWVvdXQ7Ci0JX19sZTMyIHNsZWVwX2ludGVydmFsW0lXTF9QT1dFUl9WRUNfU0laRV07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kIHsKLQlfX2xlMTYgZmxhZ3M7Ci0JdTgga2VlcF9hbGl2ZV9zZWNvbmRzOwkJLyogMzk0NSByZXNlcnZlZCAqLwotCXU4IGRlYnVnX2ZsYWdzOwkJCS8qIDM5NDUgcmVzZXJ2ZWQgKi8KLQlfX2xlMzIgcnhfZGF0YV90aW1lb3V0OwotCV9fbGUzMiB0eF9kYXRhX3RpbWVvdXQ7Ci0JX19sZTMyIHNsZWVwX2ludGVydmFsW0lXTF9QT1dFUl9WRUNfU0laRV07Ci0JX19sZTMyIGtlZXBfYWxpdmVfYmVhY29uczsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBQTV9TTEVFUF9OT1RJRklDQVRJT04gPSAweDdBIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKLSAqIGFsbCBkZXZpY2VzIGlkZW50aWNhbC4KLSAqLwotc3RydWN0IGl3bF9zbGVlcF9ub3RpZmljYXRpb24gewotCXU4IHBtX3NsZWVwX21vZGU7Ci0JdTggcG1fd2FrZXVwX3NyYzsKLQlfX2xlMTYgcmVzZXJ2ZWQ7Ci0JX19sZTMyIHNsZWVwX3RpbWU7Ci0JX19sZTMyIHRzZl9sb3c7Ci0JX19sZTMyIGJjb25fdGltZXI7Ci19IF9fcGFja2VkOwotCi0vKiBTbGVlcCBzdGF0ZXMuICBhbGwgZGV2aWNlcyBpZGVudGljYWwuICovCi1lbnVtIHsKLQlJV0xfUE1fTk9fU0xFRVAgPSAwLAotCUlXTF9QTV9TTFBfTUFDID0gMSwKLQlJV0xfUE1fU0xQX0ZVTExfTUFDX1VOQVNTT0NJQVRFID0gMiwKLQlJV0xfUE1fU0xQX0ZVTExfTUFDX0NBUkRfU1RBVEUgPSAzLAotCUlXTF9QTV9TTFBfUEhZID0gNCwKLQlJV0xfUE1fU0xQX1JFUEVOVCA9IDUsCi0JSVdMX1BNX1dBS0VVUF9CWV9USU1FUiA9IDYsCi0JSVdMX1BNX1dBS0VVUF9CWV9EUklWRVIgPSA3LAotCUlXTF9QTV9XQUtFVVBfQllfUkZLSUxMID0gOCwKLQkvKiAzIHJlc2VydmVkICovCi0JSVdMX1BNX05VTV9PRl9NT0RFUyA9IDEyLAotfTsKLQotLyoKLSAqIENBUkRfU1RBVEVfTk9USUZJQ0FUSU9OID0gMHhhMSAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCi0gKi8KLXN0cnVjdCBpd2xfY2FyZF9zdGF0ZV9ub3RpZiB7Ci0JX19sZTMyIGZsYWdzOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBIV19DQVJEX0RJU0FCTEVEICAgMHgwMQotI2RlZmluZSBTV19DQVJEX0RJU0FCTEVEICAgMHgwMgotI2RlZmluZSBDVF9DQVJEX0RJU0FCTEVEICAgMHgwNAotI2RlZmluZSBSWE9OX0NBUkRfRElTQUJMRUQgMHgxMAotCi1zdHJ1Y3QgaXdsX2N0X2tpbGxfY29uZmlnIHsKLQlfX2xlMzIgICByZXNlcnZlZDsKLQlfX2xlMzIgICBjcml0aWNhbF90ZW1wZXJhdHVyZV9NOwotCV9fbGUzMiAgIGNyaXRpY2FsX3RlbXBlcmF0dXJlX1I7Ci19ICBfX3BhY2tlZDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDgpCi0gKiBTY2FuIENvbW1hbmRzLCBSZXNwb25zZXMsIE5vdGlmaWNhdGlvbnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNDQU5fQ0hBTk5FTF9UWVBFX1BBU1NJVkUgY3B1X3RvX2xlMzIoMCkKLSNkZWZpbmUgU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFICBjcHVfdG9fbGUzMigxKQotCi0vKioKLSAqIHN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsIC0gZW50cnkgaW4gUkVQTFlfU0NBTl9DTUQgY2hhbm5lbCB0YWJsZQotICoKLSAqIE9uZSBmb3IgZWFjaCBjaGFubmVsIGluIHRoZSBzY2FuIGxpc3QuCi0gKiBFYWNoIGNoYW5uZWwgY2FuIGluZGVwZW5kZW50bHkgc2VsZWN0OgotICogMSkgIFNTSUQgZm9yIGRpcmVjdGVkIGFjdGl2ZSBzY2FucwotICogMikgIFR4cG93ZXIgc2V0dGluZyAoZm9yIHJhdGUgc3BlY2lmaWVkIHdpdGhpbiBUeCBjb21tYW5kKQotICogMykgIEhvdyBsb25nIHRvIHN0YXkgb24tY2hhbm5lbCAoYmVoYXZpb3IgbWF5IGJlIG1vZGlmaWVkIGJ5IHF1aWV0X3RpbWUsCi0gKiAgICAgcXVpZXRfcGxjcF90aCwgZ29vZF9DUkNfdGgpCi0gKgotICogVG8gYXZvaWQgdUNvZGUgZXJyb3JzLCBtYWtlIHN1cmUgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZSAoc2VlIGNvbW1lbnRzCi0gKiB1bmRlciBzdHJ1Y3QgaXdsX3NjYW5fY21kIGFib3V0IG1heF9vdXRfdGltZSBhbmQgcXVpZXRfdGltZSk6Ci0gKiAxKSAgSWYgdXNpbmcgcGFzc2l2ZV9kd2VsbCAoaS5lLiBwYXNzaXZlX2R3ZWxsICE9IDApOgotICogICAgIGFjdGl2ZV9kd2VsbCA8PSBwYXNzaXZlX2R3ZWxsICg8IG1heF9vdXRfdGltZSBpZiBtYXhfb3V0X3RpbWUgIT0gMCkKLSAqIDIpICBxdWlldF90aW1lIDw9IGFjdGl2ZV9kd2VsbAotICogMykgIElmIHJlc3RyaWN0aW5nIG9mZi1jaGFubmVsIHRpbWUgKGkuZS4gbWF4X291dF90aW1lICE9MCk6Ci0gKiAgICAgcGFzc2l2ZV9kd2VsbCA8IG1heF9vdXRfdGltZQotICogICAgIGFjdGl2ZV9kd2VsbCA8IG1heF9vdXRfdGltZQotICovCi1zdHJ1Y3QgaXdsMzk0NV9zY2FuX2NoYW5uZWwgewotCS8qCi0JICogdHlwZSBpcyBkZWZpbmVkIGFzOgotCSAqIDA6MCAxID0gYWN0aXZlLCAwID0gcGFzc2l2ZQotCSAqIDE6NCBTU0lEIGRpcmVjdCBiaXQgbWFwOyBpZiBhIGJpdCBpcyBzZXQsIHRoZW4gY29ycmVzcG9uZGluZwotCSAqICAgICBTU0lEIElFIGlzIHRyYW5zbWl0dGVkIGluIHByb2JlIHJlcXVlc3QuCi0JICogNTo3IHJlc2VydmVkCi0JICovCi0JdTggdHlwZTsKLQl1OCBjaGFubmVsOwkvKiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGl3bDM5NDVfc2Nhbl9jbWQgImZsYWdzIiBmaWVsZCAqLwotCXN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyIHRwYzsKLQlfX2xlMTYgYWN0aXZlX2R3ZWxsOwkvKiBpbiAxMDI0LXVTZWMgVFUgKHRpbWUgdW5pdHMpLCB0eXAgNS01MCAqLwotCV9fbGUxNiBwYXNzaXZlX2R3ZWxsOwkvKiBpbiAxMDI0LXVTZWMgVFUgKHRpbWUgdW5pdHMpLCB0eXAgMjAtNTAwICovCi19IF9fcGFja2VkOwotCi0vKiBzZXQgbnVtYmVyIG9mIGRpcmVjdCBwcm9iZXMgdTggdHlwZSAqLwotI2RlZmluZSBJV0wzOV9TQ0FOX1BST0JFX01BU0sobikgKChCSVQobikgfCAoQklUKG4pIC0gQklUKDEpKSkpCi0KLXN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsIHsKLQkvKgotCSAqIHR5cGUgaXMgZGVmaW5lZCBhczoKLQkgKiAwOjAgMSA9IGFjdGl2ZSwgMCA9IHBhc3NpdmUKLQkgKiAxOjIwIFNTSUQgZGlyZWN0IGJpdCBtYXA7IGlmIGEgYml0IGlzIHNldCwgdGhlbiBjb3JyZXNwb25kaW5nCi0JICogICAgIFNTSUQgSUUgaXMgdHJhbnNtaXR0ZWQgaW4gcHJvYmUgcmVxdWVzdC4KLQkgKiAyMTozMSByZXNlcnZlZAotCSAqLwotCV9fbGUzMiB0eXBlOwotCV9fbGUxNiBjaGFubmVsOwkvKiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGl3bF9zY2FuX2NtZCAiZmxhZ3MiIGZpZWxkICovCi0JdTggdHhfZ2FpbjsJCS8qIGdhaW4gZm9yIGFuYWxvZyByYWRpbyAqLwotCXU4IGRzcF9hdHRlbjsJCS8qIGdhaW4gZm9yIERTUCAqLwotCV9fbGUxNiBhY3RpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCA1LTUwICovCi0JX19sZTE2IHBhc3NpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCAyMC01MDAgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIHNldCBudW1iZXIgb2YgZGlyZWN0IHByb2JlcyBfX2xlMzIgdHlwZSAqLwotI2RlZmluZSBJV0xfU0NBTl9QUk9CRV9NQVNLKG4pCWNwdV90b19sZTMyKChCSVQobikgfCAoQklUKG4pIC0gQklUKDEpKSkpCi0KLS8qKgotICogc3RydWN0IGl3bF9zc2lkX2llIC0gZGlyZWN0ZWQgc2NhbiBuZXR3b3JrIGluZm9ybWF0aW9uIGVsZW1lbnQKLSAqCi0gKiBVcCB0byAyMCBvZiB0aGVzZSBtYXkgYXBwZWFyIGluIFJFUExZX1NDQU5fQ01EIChOb3RlOiBPbmx5IDQgYXJlIGluCi0gKiAzOTQ1IFNDQU4gYXBpKSwgc2VsZWN0ZWQgYnkgInR5cGUiIGJpdCBmaWVsZCBpbiBzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbDsKLSAqIGVhY2ggY2hhbm5lbCBtYXkgc2VsZWN0IGRpZmZlcmVudCBzc2lkcyBmcm9tIGFtb25nIHRoZSAyMCAoNCkgZW50cmllcy4KLSAqIFNTSUQgSUVzIGdldCB0cmFuc21pdHRlZCBpbiByZXZlcnNlIG9yZGVyIG9mIGVudHJ5LgotICovCi1zdHJ1Y3QgaXdsX3NzaWRfaWUgewotCXU4IGlkOwotCXU4IGxlbjsKLQl1OCBzc2lkWzMyXTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgUFJPQkVfT1BUSU9OX01BWF8zOTQ1CQk0Ci0jZGVmaW5lIFBST0JFX09QVElPTl9NQVgJCTIwCi0jZGVmaW5lIFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEUJY3B1X3RvX2xlMzIoMHhGRkZGRkZGRikKLSNkZWZpbmUgSVdMX0dPT0RfQ1JDX1RIX0RJU0FCTEVECTAKLSNkZWZpbmUgSVdMX0dPT0RfQ1JDX1RIX0RFRkFVTFQJCWNwdV90b19sZTE2KDEpCi0jZGVmaW5lIElXTF9HT09EX0NSQ19USF9ORVZFUgkJY3B1X3RvX2xlMTYoMHhmZmZmKQotI2RlZmluZSBJV0xfTUFYX1NDQU5fU0laRSAxMDI0Ci0jZGVmaW5lIElXTF9NQVhfQ01EX1NJWkUgNDA5NgotCi0vKgotICogUkVQTFlfU0NBTl9DTUQgPSAweDgwIChjb21tYW5kKQotICoKLSAqIFRoZSBoYXJkd2FyZSBzY2FuIGNvbW1hbmQgaXMgdmVyeSBwb3dlcmZ1bDsgdGhlIGRyaXZlciBjYW4gc2V0IGl0IHVwIHRvCi0gKiBtYWludGFpbiAocmVsYXRpdmVseSkgbm9ybWFsIG5ldHdvcmsgdHJhZmZpYyB3aGlsZSBkb2luZyBhIHNjYW4gaW4gdGhlCi0gKiBiYWNrZ3JvdW5kLiAgVGhlIG1heF9vdXRfdGltZSBhbmQgc3VzcGVuZF90aW1lIGNvbnRyb2wgdGhlIHJhdGlvIG9mIGhvdwotICogbG9uZyB0aGUgZGV2aWNlIHN0YXlzIG9uIGFuIGFzc29jaWF0ZWQgbmV0d29yayBjaGFubmVsICgic2VydmljZSBjaGFubmVsIikKLSAqIHZzLiBob3cgbG9uZyBpdCdzIGF3YXkgZnJvbSB0aGUgc2VydmljZSBjaGFubmVsLCBpLmUuIHR1bmVkIHRvIG90aGVyIGNoYW5uZWxzCi0gKiBmb3Igc2Nhbm5pbmcuCi0gKgotICogbWF4X291dF90aW1lIGlzIHRoZSBtYXggdGltZSBvZmYtY2hhbm5lbCAoaW4gdXNlYyksIGFuZCBzdXNwZW5kX3RpbWUKLSAqIGlzIGhvdyBsb25nIChpbiAiZXh0ZW5kZWQgYmVhY29uIiBmb3JtYXQpIHRoYXQgdGhlIHNjYW4gaXMgInN1c3BlbmRlZCIKLSAqIGFmdGVyIHJldHVybmluZyB0byB0aGUgc2VydmljZSBjaGFubmVsLiAgVGhhdCBpcywgc3VzcGVuZF90aW1lIGlzIHRoZQotICogdGltZSB0aGF0IHdlIHN0YXkgb24gdGhlIHNlcnZpY2UgY2hhbm5lbCwgZG9pbmcgbm9ybWFsIHdvcmssIGJldHdlZW4KLSAqIHNjYW4gc2VnbWVudHMuICBUaGUgZHJpdmVyIG1heSBzZXQgdGhlc2UgcGFyYW1ldGVycyBkaWZmZXJlbnRseSB0byBzdXBwb3J0Ci0gKiBzY2FubmluZyB3aGVuIGFzc29jaWF0ZWQgdnMuIG5vdCBhc3NvY2lhdGVkLCBhbmQgbGlnaHQgdnMuIGhlYXZ5IHRyYWZmaWMKLSAqIGxvYWRzIHdoZW4gYXNzb2NpYXRlZC4KLSAqCi0gKiBBZnRlciByZWNlaXZpbmcgdGhpcyBjb21tYW5kLCB0aGUgZGV2aWNlJ3Mgc2NhbiBlbmdpbmUgZG9lcyB0aGUgZm9sbG93aW5nOwotICoKLSAqIDEpICBTZW5kcyBTQ0FOX1NUQVJUIG5vdGlmaWNhdGlvbiB0byBkcml2ZXIKLSAqIDIpICBDaGVja3MgdG8gc2VlIGlmIGl0IGhhcyB0aW1lIHRvIGRvIHNjYW4gZm9yIG9uZSBjaGFubmVsCi0gKiAzKSAgU2VuZHMgTlVMTCBwYWNrZXQsIHdpdGggcG93ZXItc2F2ZSAoUFMpIGJpdCBzZXQgdG8gMSwKLSAqICAgICB0byB0ZWxsIEFQIHRoYXQgd2UncmUgZ29pbmcgb2ZmLWNoYW5uZWwKLSAqIDQpICBUdW5lcyB0byBmaXJzdCBjaGFubmVsIGluIHNjYW4gbGlzdCwgZG9lcyBhY3RpdmUgb3IgcGFzc2l2ZSBzY2FuCi0gKiA1KSAgU2VuZHMgU0NBTl9SRVNVTFQgbm90aWZpY2F0aW9uIHRvIGRyaXZlcgotICogNikgIENoZWNrcyB0byBzZWUgaWYgaXQgaGFzIHRpbWUgdG8gZG8gc2NhbiBvbiAqbmV4dCogY2hhbm5lbCBpbiBsaXN0Ci0gKiA3KSAgUmVwZWF0cyA0LTYgdW50aWwgaXQgbm8gbG9uZ2VyIGhhcyB0aW1lIHRvIHNjYW4gdGhlIG5leHQgY2hhbm5lbAotICogICAgIGJlZm9yZSBtYXhfb3V0X3RpbWUgZXhwaXJlcwotICogOCkgIFJldHVybnMgdG8gc2VydmljZSBjaGFubmVsCi0gKiA5KSAgU2VuZHMgTlVMTCBwYWNrZXQgd2l0aCBQUz0wIHRvIHRlbGwgQVAgdGhhdCB3ZSdyZSBiYWNrCi0gKiAxMCkgU3RheXMgb24gc2VydmljZSBjaGFubmVsIHVudGlsIHN1c3BlbmRfdGltZSBleHBpcmVzCi0gKiAxMSkgUmVwZWF0cyBlbnRpcmUgcHJvY2VzcyAyLTEwIHVudGlsIGxpc3QgaXMgY29tcGxldGUKLSAqIDEyKSBTZW5kcyBTQ0FOX0NPTVBMRVRFIG5vdGlmaWNhdGlvbgotICoKLSAqIEZvciBmYXN0LCBlZmZpY2llbnQgc2NhbnMsIHRoZSBzY2FuIGNvbW1hbmQgYWxzbyBoYXMgc3VwcG9ydCBmb3Igc3RheWluZyBvbgotICogYSBjaGFubmVsIGZvciBqdXN0IGEgc2hvcnQgdGltZSwgaWYgZG9pbmcgYWN0aXZlIHNjYW5uaW5nIGFuZCBnZXR0aW5nIG5vCi0gKiByZXNwb25zZXMgdG8gdGhlIHRyYW5zbWl0dGVkIHByb2JlIHJlcXVlc3QuICBUaGlzIHRpbWUgaXMgY29udHJvbGxlZCBieQotICogcXVpZXRfdGltZSwgYW5kIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyBiZWxvdyB3aGljaCBhIGNoYW5uZWwgaXMKLSAqIGNvbnNpZGVyZWQgInF1aWV0IiBpcyBjb250cm9sbGVkIGJ5IHF1aWV0X3BsY3BfdGhyZXNob2xkLgotICoKLSAqIEZvciBhY3RpdmUgc2Nhbm5pbmcgb24gY2hhbm5lbHMgdGhhdCBoYXZlIHJlZ3VsYXRvcnkgcmVzdHJpY3Rpb25zIGFnYWluc3QKLSAqIGJsaW5kbHkgdHJhbnNtaXR0aW5nLCB0aGUgc2NhbiBjYW4gbGlzdGVuIGJlZm9yZSB0cmFuc21pdHRpbmcsIHRvIG1ha2Ugc3VyZQotICogdGhhdCB0aGVyZSBpcyBhbHJlYWR5IGxlZ2l0aW1hdGUgYWN0aXZpdHkgb24gdGhlIGNoYW5uZWwuICBJZiBlbm91Z2gKLSAqIHBhY2tldHMgYXJlIGNsZWFubHkgcmVjZWl2ZWQgb24gdGhlIGNoYW5uZWwgKGNvbnRyb2xsZWQgYnkgZ29vZF9DUkNfdGgsCi0gKiB0eXBpY2FsIHZhbHVlIDEpLCB0aGUgc2NhbiBlbmdpbmUgc3RhcnRzIHRyYW5zbWl0dGluZyBwcm9iZSByZXF1ZXN0cy4KLSAqCi0gKiBEcml2ZXIgbXVzdCB1c2Ugc2VwYXJhdGUgc2NhbiBjb21tYW5kcyBmb3IgMi40IHZzLiA1IEdIeiBiYW5kcy4KLSAqCi0gKiBUbyBhdm9pZCB1Q29kZSBlcnJvcnMsIHNlZSB0aW1pbmcgcmVzdHJpY3Rpb25zIGRlc2NyaWJlZCB1bmRlcgotICogc3RydWN0IGl3bF9zY2FuX2NoYW5uZWwuCi0gKi8KLQotc3RydWN0IGl3bDM5NDVfc2Nhbl9jbWQgewotCV9fbGUxNiBsZW47Ci0JdTggcmVzZXJ2ZWQwOwotCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgY2hhbm5lbHMgaW4gY2hhbm5lbCBsaXN0ICovCi0JX19sZTE2IHF1aWV0X3RpbWU7CS8qIGR3ZWxsIG9ubHkgdGhpcyAjIG1pbGxpc2VjcyBvbiBxdWlldCBjaGFubmVsCi0JCQkJICogKG9ubHkgZm9yIGFjdGl2ZSBzY2FuKSAqLwotCV9fbGUxNiBxdWlldF9wbGNwX3RoOwkvKiBxdWlldCBjaG5sIGlzIDwgdGhpcyAjIHBrdHMgKHR5cC4gMSkgKi8KLQlfX2xlMTYgZ29vZF9DUkNfdGg7CS8qIHBhc3NpdmUgLT4gYWN0aXZlIHByb21vdGlvbiB0aHJlc2hvbGQgKi8KLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCV9fbGUzMiBtYXhfb3V0X3RpbWU7CS8qIG1heCB1c2VjIHRvIGJlIGF3YXkgZnJvbSBhc3NvY2lhdGVkIChzZXJ2aWNlKQotCQkJCSAqIGNoYW5uZWwgKi8KLQlfX2xlMzIgc3VzcGVuZF90aW1lOwkvKiBwYXVzZSBzY2FuIHRoaXMgbG9uZyAoaW4gImV4dGVuZGVkIGJlYWNvbgotCQkJCSAqIGZvcm1hdCIpIHdoZW4gcmV0dXJuaW5nIHRvIHNlcnZpY2UgY2hhbm5lbDoKLQkJCQkgKiAzOTQ1OyAzMToyNCAjIGJlYWNvbnMsIDE5OjAgYWRkaXRpb25hbCB1c2VjLAotCQkJCSAqIDQ5NjU7IDMxOjIyICMgYmVhY29ucywgMjE6MCBhZGRpdGlvbmFsIHVzZWMuCi0JCQkJICovCi0JX19sZTMyIGZsYWdzOwkJLyogUlhPTl9GTEdfKiAqLwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7CS8qIFJYT05fRklMVEVSXyogKi8KLQotCS8qIEZvciBhY3RpdmUgc2NhbnMgKHNldCB0byBhbGwtMHMgZm9yIHBhc3NpdmUgc2NhbnMpLgotCSAqIERvZXMgbm90IGluY2x1ZGUgcGF5bG9hZC4gIE11c3Qgc3BlY2lmeSBUeCByYXRlOyBubyByYXRlIHNjYWxpbmcuICovCi0Jc3RydWN0IGl3bDM5NDVfdHhfY21kIHR4X2NtZDsKLQotCS8qIEZvciBkaXJlY3RlZCBhY3RpdmUgc2NhbnMgKHNldCB0byBhbGwtMHMgb3RoZXJ3aXNlKSAqLwotCXN0cnVjdCBpd2xfc3NpZF9pZSBkaXJlY3Rfc2NhbltQUk9CRV9PUFRJT05fTUFYXzM5NDVdOwotCi0JLyoKLQkgKiBQcm9iZSByZXF1ZXN0IGZyYW1lLCBmb2xsb3dlZCBieSBjaGFubmVsIGxpc3QuCi0JICoKLQkgKiBTaXplIG9mIHByb2JlIHJlcXVlc3QgZnJhbWUgaXMgc3BlY2lmaWVkIGJ5IGJ5dGUgY291bnQgaW4gdHhfY21kLgotCSAqIENoYW5uZWwgbGlzdCBmb2xsb3dzIGltbWVkaWF0ZWx5IGFmdGVyIHByb2JlIHJlcXVlc3QgZnJhbWUuCi0JICogTnVtYmVyIG9mIGNoYW5uZWxzIGluIGxpc3QgaXMgc3BlY2lmaWVkIGJ5IGNoYW5uZWxfY291bnQuCi0JICogRWFjaCBjaGFubmVsIGluIGxpc3QgaXMgb2YgdHlwZToKLQkgKgotCSAqIHN0cnVjdCBpd2wzOTQ1X3NjYW5fY2hhbm5lbCBjaGFubmVsc1swXTsKLQkgKgotCSAqIE5PVEU6ICBPbmx5IG9uZSBiYW5kIG9mIGNoYW5uZWxzIGNhbiBiZSBzY2FubmVkIHBlciBwYXNzLiAgWW91Ci0JICogbXVzdCBub3QgbWl4IDIuNEdIeiBjaGFubmVscyBhbmQgNS4yR0h6IGNoYW5uZWxzLCBhbmQgeW91IG11c3Qgd2FpdAotCSAqIGZvciBvbmUgc2NhbiB0byBjb21wbGV0ZSAoaS5lLiByZWNlaXZlIFNDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OKQotCSAqIGJlZm9yZSByZXF1ZXN0aW5nIGFub3RoZXIgc2Nhbi4KLQkgKi8KLQl1OCBkYXRhWzBdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bF9zY2FuX2NtZCB7Ci0JX19sZTE2IGxlbjsKLQl1OCByZXNlcnZlZDA7Ci0JdTggY2hhbm5lbF9jb3VudDsJLyogIyBjaGFubmVscyBpbiBjaGFubmVsIGxpc3QgKi8KLQlfX2xlMTYgcXVpZXRfdGltZTsJLyogZHdlbGwgb25seSB0aGlzICMgbWlsbGlzZWNzIG9uIHF1aWV0IGNoYW5uZWwKLQkJCQkgKiAob25seSBmb3IgYWN0aXZlIHNjYW4pICovCi0JX19sZTE2IHF1aWV0X3BsY3BfdGg7CS8qIHF1aWV0IGNobmwgaXMgPCB0aGlzICMgcGt0cyAodHlwLiAxKSAqLwotCV9fbGUxNiBnb29kX0NSQ190aDsJLyogcGFzc2l2ZSAtPiBhY3RpdmUgcHJvbW90aW9uIHRocmVzaG9sZCAqLwotCV9fbGUxNiByeF9jaGFpbjsJLyogUlhPTl9SWF9DSEFJTl8qICovCi0JX19sZTMyIG1heF9vdXRfdGltZTsJLyogbWF4IHVzZWMgdG8gYmUgYXdheSBmcm9tIGFzc29jaWF0ZWQgKHNlcnZpY2UpCi0JCQkJICogY2hhbm5lbCAqLwotCV9fbGUzMiBzdXNwZW5kX3RpbWU7CS8qIHBhdXNlIHNjYW4gdGhpcyBsb25nIChpbiAiZXh0ZW5kZWQgYmVhY29uCi0JCQkJICogZm9ybWF0Iikgd2hlbiByZXR1cm5pbmcgdG8gc2VydmljZSBjaG5sOgotCQkJCSAqIDM5NDU7IDMxOjI0ICMgYmVhY29ucywgMTk6MCBhZGRpdGlvbmFsIHVzZWMsCi0JCQkJICogNDk2NTsgMzE6MjIgIyBiZWFjb25zLCAyMTowIGFkZGl0aW9uYWwgdXNlYy4KLQkJCQkgKi8KLQlfX2xlMzIgZmxhZ3M7CQkvKiBSWE9OX0ZMR18qICovCi0JX19sZTMyIGZpbHRlcl9mbGFnczsJLyogUlhPTl9GSUxURVJfKiAqLwotCi0JLyogRm9yIGFjdGl2ZSBzY2FucyAoc2V0IHRvIGFsbC0wcyBmb3IgcGFzc2l2ZSBzY2FucykuCi0JICogRG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkLiAgTXVzdCBzcGVjaWZ5IFR4IHJhdGU7IG5vIHJhdGUgc2NhbGluZy4gKi8KLQlzdHJ1Y3QgaXdsX3R4X2NtZCB0eF9jbWQ7Ci0KLQkvKiBGb3IgZGlyZWN0ZWQgYWN0aXZlIHNjYW5zIChzZXQgdG8gYWxsLTBzIG90aGVyd2lzZSkgKi8KLQlzdHJ1Y3QgaXdsX3NzaWRfaWUgZGlyZWN0X3NjYW5bUFJPQkVfT1BUSU9OX01BWF07Ci0KLQkvKgotCSAqIFByb2JlIHJlcXVlc3QgZnJhbWUsIGZvbGxvd2VkIGJ5IGNoYW5uZWwgbGlzdC4KLQkgKgotCSAqIFNpemUgb2YgcHJvYmUgcmVxdWVzdCBmcmFtZSBpcyBzcGVjaWZpZWQgYnkgYnl0ZSBjb3VudCBpbiB0eF9jbWQuCi0JICogQ2hhbm5lbCBsaXN0IGZvbGxvd3MgaW1tZWRpYXRlbHkgYWZ0ZXIgcHJvYmUgcmVxdWVzdCBmcmFtZS4KLQkgKiBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gbGlzdCBpcyBzcGVjaWZpZWQgYnkgY2hhbm5lbF9jb3VudC4KLQkgKiBFYWNoIGNoYW5uZWwgaW4gbGlzdCBpcyBvZiB0eXBlOgotCSAqCi0JICogc3RydWN0IGl3bF9zY2FuX2NoYW5uZWwgY2hhbm5lbHNbMF07Ci0JICoKLQkgKiBOT1RFOiAgT25seSBvbmUgYmFuZCBvZiBjaGFubmVscyBjYW4gYmUgc2Nhbm5lZCBwZXIgcGFzcy4gIFlvdQotCSAqIG11c3Qgbm90IG1peCAyLjRHSHogY2hhbm5lbHMgYW5kIDUuMkdIeiBjaGFubmVscywgYW5kIHlvdSBtdXN0IHdhaXQKLQkgKiBmb3Igb25lIHNjYW4gdG8gY29tcGxldGUgKGkuZS4gcmVjZWl2ZSBTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTikKLQkgKiBiZWZvcmUgcmVxdWVzdGluZyBhbm90aGVyIHNjYW4uCi0JICovCi0JdTggZGF0YVswXTsKLX0gX19wYWNrZWQ7Ci0KLS8qIENhbiBhYm9ydCB3aWxsIG5vdGlmeSBieSBjb21wbGV0ZSBub3RpZmljYXRpb24gd2l0aCBhYm9ydCBzdGF0dXMuICovCi0jZGVmaW5lIENBTl9BQk9SVF9TVEFUVVMJY3B1X3RvX2xlMzIoMHgxKQotLyogY29tcGxldGUgbm90aWZpY2F0aW9uIHN0YXR1c2VzICovCi0jZGVmaW5lIEFCT1JUX1NUQVRVUyAgICAgICAgICAgIDB4MgotCi0vKgotICogUkVQTFlfU0NBTl9DTUQgPSAweDgwIChyZXNwb25zZSkKLSAqLwotc3RydWN0IGl3bF9zY2FucmVxX25vdGlmaWNhdGlvbiB7Ci0JX19sZTMyIHN0YXR1czsJCS8qIDE6IG9rYXksIDI6IGNhbm5vdCBmdWxmaWxsIHJlcXVlc3QgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBTQ0FOX1NUQVJUX05PVElGSUNBVElPTiA9IDB4ODIgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX3NjYW5zdGFydF9ub3RpZmljYXRpb24gewotCV9fbGUzMiB0c2ZfbG93OwotCV9fbGUzMiB0c2ZfaGlnaDsKLQlfX2xlMzIgYmVhY29uX3RpbWVyOwotCXU4IGNoYW5uZWw7Ci0JdTggYmFuZDsKLQl1OCByZXNlcnZlZFsyXTsKLQlfX2xlMzIgc3RhdHVzOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSAgU0NBTl9PV05FUl9TVEFUVVMgMHgxCi0jZGVmaW5lICBNRUFTVVJFX09XTkVSX1NUQVRVUyAweDIKLQotI2RlZmluZSBJV0xfUFJPQkVfU1RBVFVTX09LCQkwCi0jZGVmaW5lIElXTF9QUk9CRV9TVEFUVVNfVFhfRkFJTEVECUJJVCgwKQotLyogZXJyb3Igc3RhdHVzZXMgY29tYmluZWQgd2l0aCBUWF9GQUlMRUQgKi8KLSNkZWZpbmUgSVdMX1BST0JFX1NUQVRVU19GQUlMX1RUTAlCSVQoMSkKLSNkZWZpbmUgSVdMX1BST0JFX1NUQVRVU19GQUlMX0JUCUJJVCgyKQotCi0jZGVmaW5lIE5VTUJFUl9PRl9TVEFUSVNUSUNTIDEJLyogZmlyc3QgX19sZTMyIGlzIGdvb2QgQ1JDICovCi0vKgotICogU0NBTl9SRVNVTFRTX05PVElGSUNBVElPTiA9IDB4ODMgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX3NjYW5yZXN1bHRzX25vdGlmaWNhdGlvbiB7Ci0JdTggY2hhbm5lbDsKLQl1OCBiYW5kOwotCXU4IHByb2JlX3N0YXR1czsKLQl1OCBudW1fcHJvYmVfbm90X3NlbnQ7IC8qIG5vdCBlbm91Z2ggdGltZSB0byBzZW5kICovCi0JX19sZTMyIHRzZl9sb3c7Ci0JX19sZTMyIHRzZl9oaWdoOwotCV9fbGUzMiBzdGF0aXN0aWNzW05VTUJFUl9PRl9TVEFUSVNUSUNTXTsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTiA9IDB4ODQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX3NjYW5jb21wbGV0ZV9ub3RpZmljYXRpb24gewotCXU4IHNjYW5uZWRfY2hhbm5lbHM7Ci0JdTggc3RhdHVzOwotCXU4IGxhc3RfY2hhbm5lbDsKLQlfX2xlMzIgdHNmX2xvdzsKLQlfX2xlMzIgdHNmX2hpZ2g7Ci19IF9fcGFja2VkOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICg5KQotICogSUJTUy9BUCBDb21tYW5kcyBhbmQgTm90aWZpY2F0aW9uczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWVudW0gaXdsX2lic3NfbWFuYWdlciB7Ci0JSVdMX05PVF9JQlNTX01BTkFHRVIgPSAwLAotCUlXTF9JQlNTX01BTkFHRVIgPSAxLAotfTsKLQotLyoKLSAqIEJFQUNPTl9OT1RJRklDQVRJT04gPSAweDkwIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKLSAqLwotCi1zdHJ1Y3QgaXdsMzk0NV9iZWFjb25fbm90aWYgewotCXN0cnVjdCBpd2wzOTQ1X3R4X3Jlc3AgYmVhY29uX25vdGlmeV9oZHI7Ci0JX19sZTMyIGxvd190c2Y7Ci0JX19sZTMyIGhpZ2hfdHNmOwotCV9fbGUzMiBpYnNzX21ncl9zdGF0dXM7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsNDk2NV9iZWFjb25fbm90aWYgewotCXN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgYmVhY29uX25vdGlmeV9oZHI7Ci0JX19sZTMyIGxvd190c2Y7Ci0JX19sZTMyIGhpZ2hfdHNmOwotCV9fbGUzMiBpYnNzX21ncl9zdGF0dXM7Ci19IF9fcGFja2VkOwotCi0vKgotICogUkVQTFlfVFhfQkVBQ09OID0gMHg5MSAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICovCi0KLXN0cnVjdCBpd2wzOTQ1X3R4X2JlYWNvbl9jbWQgewotCXN0cnVjdCBpd2wzOTQ1X3R4X2NtZCB0eDsKLQlfX2xlMTYgdGltX2lkeDsKLQl1OCB0aW1fc2l6ZTsKLQl1OCByZXNlcnZlZDE7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWVbMF07CS8qIGJlYWNvbiBmcmFtZSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bF90eF9iZWFjb25fY21kIHsKLQlzdHJ1Y3QgaXdsX3R4X2NtZCB0eDsKLQlfX2xlMTYgdGltX2lkeDsKLQl1OCB0aW1fc2l6ZTsKLQl1OCByZXNlcnZlZDE7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWVbMF07CS8qIGJlYWNvbiBmcmFtZSAqLwotfSBfX3BhY2tlZDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDEwKQotICogU3RhdGlzdGljcyBDb21tYW5kcyBhbmQgTm90aWZpY2F0aW9uczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSVdMX1RFTVBfQ09OVkVSVCAyNjAKLQotI2RlZmluZSBTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMUyAgOAotI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgNAotI2RlZmluZSBTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMUyAgMTIKLQotLyogVXNlZCBmb3IgcGFzc2luZyB0byBkcml2ZXIgbnVtYmVyIG9mIHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMgcGVyIHJhdGUgKi8KLXN0cnVjdCByYXRlX2hpc3RvZ3JhbSB7Ci0JdW5pb24gewotCQlfX2xlMzIgYVtTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMU107Ci0JCV9fbGUzMiBiW1NVUF9SQVRFXzExQl9NQVhfTlVNX0NIQU5ORUxTXTsKLQkJX19sZTMyIGdbU1VQX1JBVEVfMTFHX01BWF9OVU1fQ0hBTk5FTFNdOwotCX0gc3VjY2VzczsKLQl1bmlvbiB7Ci0JCV9fbGUzMiBhW1NVUF9SQVRFXzExQV9NQVhfTlVNX0NIQU5ORUxTXTsKLQkJX19sZTMyIGJbU1VQX1JBVEVfMTFCX01BWF9OVU1fQ0hBTk5FTFNdOwotCQlfX2xlMzIgZ1tTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMU107Ci0JfSBmYWlsZWQ7Ci19IF9fcGFja2VkOwotCi0vKiBzdGF0aXN0aWNzIGNvbW1hbmQgcmVzcG9uc2UgKi8KLQotc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfcnhfcGh5IHsKLQlfX2xlMzIgaW5hX2NudDsKLQlfX2xlMzIgZmluYV9jbnQ7Ci0JX19sZTMyIHBsY3BfZXJyOwotCV9fbGUzMiBjcmMzMl9lcnI7Ci0JX19sZTMyIG92ZXJydW5fZXJyOwotCV9fbGUzMiBlYXJseV9vdmVycnVuX2VycjsKLQlfX2xlMzIgY3JjMzJfZ29vZDsKLQlfX2xlMzIgZmFsc2VfYWxhcm1fY250OwotCV9fbGUzMiBmaW5hX3N5bmNfZXJyX2NudDsKLQlfX2xlMzIgc2ZkX3RpbWVvdXQ7Ci0JX19sZTMyIGZpbmFfdGltZW91dDsKLQlfX2xlMzIgdW5yZXNwb25kZWRfcnRzOwotCV9fbGUzMiByeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bjsKLQlfX2xlMzIgc2VudF9hY2tfY250OwotCV9fbGUzMiBzZW50X2N0c19jbnQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9ub25fcGh5IHsKLQlfX2xlMzIgYm9ndXNfY3RzOwkvKiBDVFMgcmVjZWl2ZWQgd2hlbiBub3QgZXhwZWN0aW5nIENUUyAqLwotCV9fbGUzMiBib2d1c19hY2s7CS8qIEFDSyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQUNLICovCi0JX19sZTMyIG5vbl9ic3NpZF9mcmFtZXM7CS8qIG51bWJlciBvZiBmcmFtZXMgd2l0aCBCU1NJRCB0aGF0Ci0JCQkJCSAqIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBTVEEgQlNTSUQgKi8KLQlfX2xlMzIgZmlsdGVyZWRfZnJhbWVzOwkvKiBjb3VudCBmcmFtZXMgdGhhdCB3ZXJlIGR1bXBlZCBpbiB0aGUKLQkJCQkgKiBmaWx0ZXJpbmcgcHJvY2VzcyAqLwotCV9fbGUzMiBub25fY2hhbm5lbF9iZWFjb25zOwkvKiBiZWFjb25zIHdpdGggb3VyIGJzcyBpZCBidXQgbm90IG9uCi0JCQkJCSAqIG91ciBzZXJ2aW5nIGNoYW5uZWwgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4IHsKLQlzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9waHkgb2ZkbTsKLQlzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9waHkgY2NrOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X25vbl9waHkgZ2VuZXJhbDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3R4IHsKLQlfX2xlMzIgcHJlYW1ibGVfY250OwotCV9fbGUzMiByeF9kZXRlY3RlZF9jbnQ7Ci0JX19sZTMyIGJ0X3ByaW9fZGVmZXJfY250OwotCV9fbGUzMiBidF9wcmlvX2tpbGxfY250OwotCV9fbGUzMiBmZXdfYnl0ZXNfY250OwotCV9fbGUzMiBjdHNfdGltZW91dDsKLQlfX2xlMzIgYWNrX3RpbWVvdXQ7Ci0JX19sZTMyIGV4cGVjdGVkX2Fja19jbnQ7Ci0JX19sZTMyIGFjdHVhbF9hY2tfY250OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHN0YXRpc3RpY3NfZGJnIHsKLQlfX2xlMzIgYnVyc3RfY2hlY2s7Ci0JX19sZTMyIGJ1cnN0X2NvdW50OwotCV9fbGUzMiB3YWl0X2Zvcl9zaWxlbmNlX3RpbWVvdXRfY250OwotCV9fbGUzMiByZXNlcnZlZFszXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2RpdiB7Ci0JX19sZTMyIHR4X29uX2E7Ci0JX19sZTMyIHR4X29uX2I7Ci0JX19sZTMyIGV4ZWNfdGltZTsKLQlfX2xlMzIgcHJvYmVfdGltZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2dlbmVyYWwgewotCV9fbGUzMiB0ZW1wZXJhdHVyZTsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgZGJnOwotCV9fbGUzMiBzbGVlcF90aW1lOwotCV9fbGUzMiBzbG90c19vdXQ7Ci0JX19sZTMyIHNsb3RzX2lkbGU7Ci0JX19sZTMyIHR0bF90aW1lc3RhbXA7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfZGl2IGRpdjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSB7Ci0JX19sZTMyIGluYV9jbnQ7Ci0JX19sZTMyIGZpbmFfY250OwotCV9fbGUzMiBwbGNwX2VycjsKLQlfX2xlMzIgY3JjMzJfZXJyOwotCV9fbGUzMiBvdmVycnVuX2VycjsKLQlfX2xlMzIgZWFybHlfb3ZlcnJ1bl9lcnI7Ci0JX19sZTMyIGNyYzMyX2dvb2Q7Ci0JX19sZTMyIGZhbHNlX2FsYXJtX2NudDsKLQlfX2xlMzIgZmluYV9zeW5jX2Vycl9jbnQ7Ci0JX19sZTMyIHNmZF90aW1lb3V0OwotCV9fbGUzMiBmaW5hX3RpbWVvdXQ7Ci0JX19sZTMyIHVucmVzcG9uZGVkX3J0czsKLQlfX2xlMzIgcnhlX2ZyYW1lX2xpbWl0X292ZXJydW47Ci0JX19sZTMyIHNlbnRfYWNrX2NudDsKLQlfX2xlMzIgc2VudF9jdHNfY250OwotCV9fbGUzMiBzZW50X2JhX3JzcF9jbnQ7Ci0JX19sZTMyIGRzcF9zZWxmX2tpbGw7Ci0JX19sZTMyIG1oX2Zvcm1hdF9lcnI7Ci0JX19sZTMyIHJlX2FjcV9tYWluX3Jzc2lfc3VtOwotCV9fbGUzMiByZXNlcnZlZDM7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3RhdGlzdGljc19yeF9odF9waHkgewotCV9fbGUzMiBwbGNwX2VycjsKLQlfX2xlMzIgb3ZlcnJ1bl9lcnI7Ci0JX19sZTMyIGVhcmx5X292ZXJydW5fZXJyOwotCV9fbGUzMiBjcmMzMl9nb29kOwotCV9fbGUzMiBjcmMzMl9lcnI7Ci0JX19sZTMyIG1oX2Zvcm1hdF9lcnI7Ci0JX19sZTMyIGFnZ19jcmMzMl9nb29kOwotCV9fbGUzMiBhZ2dfbXBkdV9jbnQ7Ci0JX19sZTMyIGFnZ19jbnQ7Ci0JX19sZTMyIHVuc3VwcG9ydF9tY3M7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSAgICAgIGNwdV90b19sZTMyKDEpCi0KLXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkgewotCV9fbGUzMiBib2d1c19jdHM7CS8qIENUUyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQ1RTICovCi0JX19sZTMyIGJvZ3VzX2FjazsJLyogQUNLIHJlY2VpdmVkIHdoZW4gbm90IGV4cGVjdGluZyBBQ0sgKi8KLQlfX2xlMzIgbm9uX2Jzc2lkX2ZyYW1lczsJLyogbnVtYmVyIG9mIGZyYW1lcyB3aXRoIEJTU0lEIHRoYXQKLQkJCQkJICogZG9lc24ndCBiZWxvbmcgdG8gdGhlIFNUQSBCU1NJRCAqLwotCV9fbGUzMiBmaWx0ZXJlZF9mcmFtZXM7CS8qIGNvdW50IGZyYW1lcyB0aGF0IHdlcmUgZHVtcGVkIGluIHRoZQotCQkJCSAqIGZpbHRlcmluZyBwcm9jZXNzICovCi0JX19sZTMyIG5vbl9jaGFubmVsX2JlYWNvbnM7CS8qIGJlYWNvbnMgd2l0aCBvdXIgYnNzIGlkIGJ1dCBub3Qgb24KLQkJCQkJICogb3VyIHNlcnZpbmcgY2hhbm5lbCAqLwotCV9fbGUzMiBjaGFubmVsX2JlYWNvbnM7CS8qIGJlYWNvbnMgd2l0aCBvdXIgYnNzIGlkIGFuZCBpbiBvdXIKLQkJCQkgKiBzZXJ2aW5nIGNoYW5uZWwgKi8KLQlfX2xlMzIgbnVtX21pc3NlZF9iY29uOwkvKiBudW1iZXIgb2YgbWlzc2VkIGJlYWNvbnMgKi8KLQlfX2xlMzIgYWRjX3J4X3NhdHVyYXRpb25fdGltZTsJLyogY291bnQgaW4gMC44dXMgdW5pdHMgdGhlIHRpbWUgdGhlCi0JCQkJCSAqIEFEQyB3YXMgaW4gc2F0dXJhdGlvbiAqLwotCV9fbGUzMiBpbmFfZGV0ZWN0aW9uX3NlYXJjaF90aW1lOy8qIHRvdGFsIHRpbWUgKGluIDAuOHVzKSBzZWFyY2hlZAotCQkJCQkgICogZm9yIElOQSAqLwotCV9fbGUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2E7CS8qIFJTU0kgc2lsZW5jZSBhZnRlciBiZWFjb24gZnJhbWUgKi8KLQlfX2xlMzIgYmVhY29uX3NpbGVuY2VfcnNzaV9iOwkvKiBSU1NJIHNpbGVuY2UgYWZ0ZXIgYmVhY29uIGZyYW1lICovCi0JX19sZTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYzsJLyogUlNTSSBzaWxlbmNlIGFmdGVyIGJlYWNvbiBmcmFtZSAqLwotCV9fbGUzMiBpbnRlcmZlcmVuY2VfZGF0YV9mbGFnOwkvKiBmbGFnIGZvciBpbnRlcmZlcmVuY2UgZGF0YQotCQkJCQkgKiBhdmFpbGFiaWxpdHkuIDEgd2hlbiBkYXRhIGlzCi0JCQkJCSAqIGF2YWlsYWJsZS4gKi8KLQlfX2xlMzIgY2hhbm5lbF9sb2FkOwkJLyogY291bnRzIFJYIEVuYWJsZSB0aW1lIGluIHVTZWMgKi8KLQlfX2xlMzIgZHNwX2ZhbHNlX2FsYXJtczsJLyogRFNQIGZhbHNlIGFsYXJtIChib3RoIE9GRE0KLQkJCQkJICogYW5kIENDSykgY291bnRlciAqLwotCV9fbGUzMiBiZWFjb25fcnNzaV9hOwotCV9fbGUzMiBiZWFjb25fcnNzaV9iOwotCV9fbGUzMiBiZWFjb25fcnNzaV9jOwotCV9fbGUzMiBiZWFjb25fZW5lcmd5X2E7Ci0JX19sZTMyIGJlYWNvbl9lbmVyZ3lfYjsKLQlfX2xlMzIgYmVhY29uX2VuZXJneV9jOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHN0YXRpc3RpY3NfcnggewotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSBvZmRtOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSBjY2s7Ci0Jc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSBnZW5lcmFsOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X2h0X3BoeSBvZmRtX2h0OwotfSBfX3BhY2tlZDsKLQotLyoqCi0gKiBzdHJ1Y3Qgc3RhdGlzdGljc190eF9wb3dlciAtIGN1cnJlbnQgdHggcG93ZXIKLSAqCi0gKiBAYW50X2E6IGN1cnJlbnQgdHggcG93ZXIgb24gY2hhaW4gYSBpbiAxLzIgZEIgc3RlcAotICogQGFudF9iOiBjdXJyZW50IHR4IHBvd2VyIG9uIGNoYWluIGIgaW4gMS8yIGRCIHN0ZXAKLSAqIEBhbnRfYzogY3VycmVudCB0eCBwb3dlciBvbiBjaGFpbiBjIGluIDEvMiBkQiBzdGVwCi0gKi8KLXN0cnVjdCBzdGF0aXN0aWNzX3R4X3Bvd2VyIHsKLQl1OCBhbnRfYTsKLQl1OCBhbnRfYjsKLQl1OCBhbnRfYzsKLQl1OCByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX3R4X25vbl9waHlfYWdnIHsKLQlfX2xlMzIgYmFfdGltZW91dDsKLQlfX2xlMzIgYmFfcmVzY2hlZHVsZV9mcmFtZXM7Ci0JX19sZTMyIHNjZF9xdWVyeV9hZ2dfZnJhbWVfY250OwotCV9fbGUzMiBzY2RfcXVlcnlfbm9fYWdnOwotCV9fbGUzMiBzY2RfcXVlcnlfYWdnOwotCV9fbGUzMiBzY2RfcXVlcnlfbWlzbWF0Y2g7Ci0JX19sZTMyIGZyYW1lX25vdF9yZWFkeTsKLQlfX2xlMzIgdW5kZXJydW47Ci0JX19sZTMyIGJ0X3ByaW9fa2lsbDsKLQlfX2xlMzIgcnhfYmFfcnNwX2NudDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX3R4IHsKLQlfX2xlMzIgcHJlYW1ibGVfY250OwotCV9fbGUzMiByeF9kZXRlY3RlZF9jbnQ7Ci0JX19sZTMyIGJ0X3ByaW9fZGVmZXJfY250OwotCV9fbGUzMiBidF9wcmlvX2tpbGxfY250OwotCV9fbGUzMiBmZXdfYnl0ZXNfY250OwotCV9fbGUzMiBjdHNfdGltZW91dDsKLQlfX2xlMzIgYWNrX3RpbWVvdXQ7Ci0JX19sZTMyIGV4cGVjdGVkX2Fja19jbnQ7Ci0JX19sZTMyIGFjdHVhbF9hY2tfY250OwotCV9fbGUzMiBkdW1wX21zZHVfY250OwotCV9fbGUzMiBidXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudDsKLQlfX2xlMzIgYnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudDsKLQlfX2xlMzIgY3RzX3RpbWVvdXRfY29sbGlzaW9uOwotCV9fbGUzMiBhY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb247Ci0Jc3RydWN0IHN0YXRpc3RpY3NfdHhfbm9uX3BoeV9hZ2cgYWdnOwotCi0JX19sZTMyIHJlc2VydmVkMTsKLX0gX19wYWNrZWQ7Ci0KLQotc3RydWN0IHN0YXRpc3RpY3NfZGl2IHsKLQlfX2xlMzIgdHhfb25fYTsKLQlfX2xlMzIgdHhfb25fYjsKLQlfX2xlMzIgZXhlY190aW1lOwotCV9fbGUzMiBwcm9iZV90aW1lOwotCV9fbGUzMiByZXNlcnZlZDE7Ci0JX19sZTMyIHJlc2VydmVkMjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfY29tbW9uIHsKLQlfX2xlMzIgdGVtcGVyYXR1cmU7ICAgLyogcmFkaW8gdGVtcGVyYXR1cmUgKi8KLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgZGJnOwotCV9fbGUzMiBzbGVlcF90aW1lOwotCV9fbGUzMiBzbG90c19vdXQ7Ci0JX19sZTMyIHNsb3RzX2lkbGU7Ci0JX19sZTMyIHR0bF90aW1lc3RhbXA7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZGl2IGRpdjsKLQlfX2xlMzIgcnhfZW5hYmxlX2NvdW50ZXI7Ci0JLyoKLQkgKiBudW1fb2Zfc29zX3N0YXRlczoKLQkgKiAgY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBoYXZlIHRvIHJlLXR1bmUKLQkgKiAgaW4gb3JkZXIgdG8gZ2V0IG91dCBvZiBiYWQgUEhZIHN0YXR1cwotCSAqLwotCV9fbGUzMiBudW1fb2Zfc29zX3N0YXRlczsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWwgewotCXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfY29tbW9uIGNvbW1vbjsKLQlfX2xlMzIgcmVzZXJ2ZWQyOwotCV9fbGUzMiByZXNlcnZlZDM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIFVDT0RFX1NUQVRJU1RJQ1NfQ0xFQVJfTVNLCQkoMHgxIDw8IDApCi0jZGVmaW5lIFVDT0RFX1NUQVRJU1RJQ1NfRlJFUVVFTkNZX01TSwkJKDB4MSA8PCAxKQotI2RlZmluZSBVQ09ERV9TVEFUSVNUSUNTX05BUlJPV19CQU5EX01TSwkoMHgxIDw8IDIpCi0KLS8qCi0gKiBSRVBMWV9TVEFUSVNUSUNTX0NNRCA9IDB4OWMsCi0gKiBhbGwgZGV2aWNlcyBpZGVudGljYWwuCi0gKgotICogVGhpcyBjb21tYW5kIHRyaWdnZXJzIGFuIGltbWVkaWF0ZSByZXNwb25zZSBjb250YWluaW5nIHVDb2RlIHN0YXRpc3RpY3MuCi0gKiBUaGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OIDB4OWQsIGJlbG93LgotICoKLSAqIElmIHRoZSBDTEVBUl9TVEFUUyBjb25maWd1cmF0aW9uIGZsYWcgaXMgc2V0LCB1Q29kZSB3aWxsIGNsZWFyIGl0cwotICogaW50ZXJuYWwgY29weSBvZiB0aGUgc3RhdGlzdGljcyAoY291bnRlcnMpIGFmdGVyIGlzc3VpbmcgdGhlIHJlc3BvbnNlLgotICogVGhpcyBmbGFnIGRvZXMgbm90IGFmZmVjdCBTVEFUSVNUSUNTX05PVElGSUNBVElPTnMgYWZ0ZXIgYmVhY29ucyAoc2VlIGJlbG93KS4KLSAqCi0gKiBJZiB0aGUgRElTQUJMRV9OT1RJRiBjb25maWd1cmF0aW9uIGZsYWcgaXMgc2V0LCB1Q29kZSB3aWxsIG5vdCBpc3N1ZQotICogU1RBVElTVElDU19OT1RJRklDQVRJT05zIGFmdGVyIHJlY2VpdmVkIGJlYWNvbnMgKHNlZSBiZWxvdykuICBUaGlzIGZsYWcKLSAqIGRvZXMgbm90IGFmZmVjdCB0aGUgcmVzcG9uc2UgdG8gdGhlIFJFUExZX1NUQVRJU1RJQ1NfQ01EIDB4OWMgaXRzZWxmLgotICovCi0jZGVmaW5lIElXTF9TVEFUU19DT05GX0NMRUFSX1NUQVRTIGNwdV90b19sZTMyKDB4MSkJLyogc2VlIGFib3ZlICovCi0jZGVmaW5lIElXTF9TVEFUU19DT05GX0RJU0FCTEVfTk9USUYgY3B1X3RvX2xlMzIoMHgyKS8qIHNlZSBhYm92ZSAqLwotc3RydWN0IGl3bF9zdGF0aXN0aWNzX2NtZCB7Ci0JX19sZTMyIGNvbmZpZ3VyYXRpb25fZmxhZ3M7CS8qIElXTF9TVEFUU19DT05GXyogKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBTVEFUSVNUSUNTX05PVElGSUNBVElPTiA9IDB4OWQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICoKLSAqIEJ5IGRlZmF1bHQsIHVDb2RlIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBhZnRlciByZWNlaXZpbmcgYSBiZWFjb24KLSAqIHdoaWxlIGFzc29jaWF0ZWQuICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHNldCBESVNBQkxFX05PVElGIGZsYWcgaW4gdGhlCi0gKiBSRVBMWV9TVEFUSVNUSUNTX0NNRCAweDljLCBhYm92ZS4KLSAqCi0gKiBTdGF0aXN0aWNzIGNvdW50ZXJzIGNvbnRpbnVlIHRvIGluY3JlbWVudCBiZWFjb24gYWZ0ZXIgYmVhY29uLCBidXQgYXJlCi0gKiBjbGVhcmVkIHdoZW4gY2hhbmdpbmcgY2hhbm5lbHMgb3Igd2hlbiBkcml2ZXIgaXNzdWVzIFJFUExZX1NUQVRJU1RJQ1NfQ01ECi0gKiAweDljIHdpdGggQ0xFQVJfU1RBVFMgYml0IHNldCAoc2VlIGFib3ZlKS4KLSAqCi0gKiB1Q29kZSBhbHNvIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBkdXJpbmcgc2NhbnMuICB1Q29kZSBjbGVhcnMgc3RhdGlzdGljcwotICogYXBwcm9wcmlhdGVseSBzbyB0aGF0IGVhY2ggbm90aWZpY2F0aW9uIGNvbnRhaW5zIHN0YXRpc3RpY3MgZm9yIG9ubHkgdGhlCi0gKiBvbmUgY2hhbm5lbCB0aGF0IGhhcyBqdXN0IGJlZW4gc2Nhbm5lZC4KLSAqLwotI2RlZmluZSBTVEFUSVNUSUNTX1JFUExZX0ZMR19CQU5EXzI0R19NU0sgICAgICAgICBjcHVfdG9fbGUzMigweDIpCi0jZGVmaW5lIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0sgICAgICAgIGNwdV90b19sZTMyKDB4OCkKLQotc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyB7Ci0JX19sZTMyIGZsYWc7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3Nfcnggcng7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfdHggdHg7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfZ2VuZXJhbCBnZW5lcmFsOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIHsKLQlfX2xlMzIgZmxhZzsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeCByeDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc190eCB0eDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsIGdlbmVyYWw7Ci19IF9fcGFja2VkOwotCi0vKgotICogTUlTU0VEX0JFQUNPTlNfTk9USUZJQ0FUSU9OID0gMHhhMiAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCi0gKgotICogdUNvZGUgc2VuZCBNSVNTRURfQkVBQ09OU19OT1RJRklDQVRJT04gdG8gZHJpdmVyIHdoZW4gZGV0ZWN0IGJlYWNvbiBtaXNzZWQKLSAqIGluIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgbWlzc2VkIGJlYWNvbnMsIHdoaWNoIG1lYW4gd2hlbiBkcml2ZXIgcmVjZWl2ZSB0aGUKLSAqIG5vdGlmaWNhdGlvbiwgaW5zaWRlIHRoZSBjb21tYW5kLCBpdCBjYW4gZmluZCBhbGwgdGhlIGJlYWNvbnMgaW5mb3JtYXRpb24KLSAqIHdoaWNoIGluY2x1ZGUgbnVtYmVyIG9mIHRvdGFsIG1pc3NlZCBiZWFjb25zLCBudW1iZXIgb2YgY29uc2VjdXRpdmUgbWlzc2VkCi0gKiBiZWFjb25zLCBudW1iZXIgb2YgYmVhY29ucyByZWNlaXZlZCBhbmQgbnVtYmVyIG9mIGJlYWNvbnMgZXhwZWN0ZWQgdG8KLSAqIHJlY2VpdmUuCi0gKgotICogSWYgdUNvZGUgZGV0ZWN0ZWQgY29uc2VjdXRpdmVfbWlzc2VkX2JlYWNvbnMgPiA1LCBpdCB3aWxsIHJlc2V0IHRoZSByYWRpbwotICogaW4gb3JkZXIgdG8gYnJpbmcgdGhlIHJhZGlvL1BIWSBiYWNrIHRvIHdvcmtpbmcgc3RhdGU7IHdoaWNoIGhhcyBubyByZWxhdGlvbgotICogdG8gd2hlbiBkcml2ZXIgd2lsbCBwZXJmb3JtIHNlbnNpdGl2aXR5IGNhbGlicmF0aW9uLgotICoKLSAqIERyaXZlciBzaG91bGQgc2V0IGl0IG93biBtaXNzZWRfYmVhY29uX3RocmVzaG9sZCB0byBkZWNpZGUgd2hlbiB0byBwZXJmb3JtCi0gKiBzZW5zaXRpdml0eSBjYWxpYnJhdGlvbiBiYXNlZCBvbiBudW1iZXIgb2YgY29uc2VjdXRpdmUgbWlzc2VkIGJlYWNvbnMgaW4KLSAqIG9yZGVyIHRvIGltcHJvdmUgb3ZlcmFsbCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBpbiBub2lzeSBlbnZpcm9ubWVudC4KLSAqCi0gKi8KLQotI2RlZmluZSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUlOCSgxKQotI2RlZmluZSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGCSg1KQotI2RlZmluZSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUFYCUlXTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUYKLQotc3RydWN0IGl3bF9taXNzZWRfYmVhY29uX25vdGlmIHsKLQlfX2xlMzIgY29uc2VjdXRpdmVfbWlzc2VkX2JlYWNvbnM7Ci0JX19sZTMyIHRvdGFsX21pc3NlZF9iZWNvbnM7Ci0JX19sZTMyIG51bV9leHBlY3RlZF9iZWFjb25zOwotCV9fbGUzMiBudW1fcmVjdmRfYmVhY29uczsKLX0gX19wYWNrZWQ7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDExKQotICogUnggQ2FsaWJyYXRpb24gQ29tbWFuZHM6Ci0gKgotICogV2l0aCB0aGUgdUNvZGUgdXNlZCBmb3Igb3BlbiBzb3VyY2UgZHJpdmVycywgbW9zdCBUeCBjYWxpYnJhdGlvbiAoZXhjZXB0Ci0gKiBmb3IgVHggUG93ZXIpIGFuZCBtb3N0IFJ4IGNhbGlicmF0aW9uIGlzIGRvbmUgYnkgdUNvZGUgZHVyaW5nIHRoZQotICogImluaXRpYWxpemUiIHBoYXNlIG9mIHVDb2RlIGJvb3QuICBEcml2ZXIgbXVzdCBjYWxpYnJhdGUgb25seToKLSAqCi0gKiAxKSAgVHggcG93ZXIgKGRlcGVuZHMgb24gdGVtcGVyYXR1cmUpLCBkZXNjcmliZWQgZWxzZXdoZXJlCi0gKiAyKSAgUmVjZWl2ZXIgZ2FpbiBiYWxhbmNlIChvcHRpbWl6ZSBNSU1PLCBhbmQgZGV0ZWN0IGRpc2Nvbm5lY3RlZCBhbnRlbm5hcykKLSAqIDMpICBSZWNlaXZlciBzZW5zaXRpdml0eSAodG8gb3B0aW1pemUgc2lnbmFsIGRldGVjdGlvbikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogU0VOU0lUSVZJVFlfQ01EID0gMHhhOCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICoKLSAqIFRoaXMgY29tbWFuZCBzZXRzIHVwIHRoZSBSeCBzaWduYWwgZGV0ZWN0b3IgZm9yIGEgc2Vuc2l0aXZpdHkgbGV2ZWwgdGhhdAotICogaXMgaGlnaCBlbm91Z2ggdG8gbG9jayBvbnRvIGFsbCBzaWduYWxzIHdpdGhpbiB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrLAotICogYnV0IGxvdyBlbm91Z2ggdG8gaWdub3JlIHNpZ25hbHMgdGhhdCBhcmUgYmVsb3cgYSBjZXJ0YWluIHRocmVzaG9sZCwgc28gYXMKLSAqIG5vdCB0byBoYXZlIHRvbyBtYW55ICJmYWxzZSBhbGFybXMiLiAgRmFsc2UgYWxhcm1zIGFyZSBzaWduYWxzIHRoYXQgdGhlCi0gKiBSeCBEU1AgdHJpZXMgdG8gbG9jayBvbnRvLCBidXQgdGhlbiBkaXNjYXJkcyBhZnRlciBkZXRlcm1pbmluZyB0aGF0IHRoZXkKLSAqIGFyZSBub2lzZS4KLSAqCi0gKiBUaGUgb3B0aW11bSBudW1iZXIgb2YgZmFsc2UgYWxhcm1zIGlzIGJldHdlZW4gNSBhbmQgNTAgcGVyIDIwMCBUVXMKLSAqICgyMDAgKiAxMDI0IHVTZWNzLCBpLmUuIDIwNC44IG1pbGxpc2Vjb25kcykgb2YgYWN0dWFsIFJ4IHRpbWUgKGkuZS4KLSAqIHRpbWUgbGlzdGVuaW5nLCBub3QgdHJhbnNtaXR0aW5nKS4gIERyaXZlciBtdXN0IGFkanVzdCBzZW5zaXRpdml0eSBzbyB0aGF0Ci0gKiB0aGUgcmF0aW8gb2YgYWN0dWFsIGZhbHNlIGFsYXJtcyB0byBhY3R1YWwgUnggdGltZSBmYWxscyB3aXRoaW4gdGhpcyByYW5nZS4KLSAqCi0gKiBXaGlsZSBhc3NvY2lhdGVkLCB1Q29kZSBkZWxpdmVycyBTVEFUSVNUSUNTX05PVElGSUNBVElPTnMgYWZ0ZXIgZWFjaAotICogcmVjZWl2ZWQgYmVhY29uLiAgVGhlc2UgcHJvdmlkZSBpbmZvcm1hdGlvbiB0byB0aGUgZHJpdmVyIHRvIGFuYWx5emUgdGhlCi0gKiBzZW5zaXRpdml0eS4gIERvbid0IGFuYWx5emUgc3RhdGlzdGljcyB0aGF0IGNvbWUgaW4gZnJvbSBzY2FubmluZywgb3IgYW55Ci0gKiBvdGhlciBub24tYXNzb2NpYXRlZC1uZXR3b3JrIHNvdXJjZS4gIFBlcnRpbmVudCBzdGF0aXN0aWNzIGluY2x1ZGU6Ci0gKgotICogRnJvbSAiZ2VuZXJhbCIgc3RhdGlzdGljcyAoc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSk6Ci0gKgotICogKGJlYWNvbl9lbmVyZ3lfW2FiY10gJiAweDBGRjAwKSA+PiA4ICh1bnNpZ25lZCwgaGlnaGVyIHZhbHVlIGlzIGxvd2VyIGxldmVsKQotICogICBNZWFzdXJlIG9mIGVuZXJneSBvZiBkZXNpcmVkIHNpZ25hbC4gIFVzZWQgZm9yIGVzdGFibGlzaGluZyBhIGxldmVsCi0gKiAgIGJlbG93IHdoaWNoIHRoZSBkZXZpY2UgZG9lcyBub3QgZGV0ZWN0IHNpZ25hbHMuCi0gKgotICogKGJlYWNvbl9zaWxlbmNlX3Jzc2lfW2FiY10gJiAweDBGRjAwKSA+PiA4ICh1bnNpZ25lZCwgdW5pdHMgaW4gZEIpCi0gKiAgIE1lYXN1cmUgb2YgYmFja2dyb3VuZCBub2lzZSBpbiBzaWxlbnQgcGVyaW9kIGFmdGVyIGJlYWNvbi4KLSAqCi0gKiBjaGFubmVsX2xvYWQKLSAqICAgdVNlY3Mgb2YgYWN0dWFsIFJ4IHRpbWUgZHVyaW5nIGJlYWNvbiBwZXJpb2QgKHZhcmllcyBhY2NvcmRpbmcgdG8KLSAqICAgaG93IG11Y2ggdGltZSB3YXMgc3BlbnQgdHJhbnNtaXR0aW5nKS4KLSAqCi0gKiBGcm9tICJjY2siIGFuZCAib2ZkbSIgc3RhdGlzdGljcyAoc3RydWN0IHN0YXRpc3RpY3NfcnhfcGh5KSwgc2VwYXJhdGVseToKLSAqCi0gKiBmYWxzZV9hbGFybV9jbnQKLSAqICAgU2lnbmFsIGxvY2tzIGFiYW5kb25lZCBlYXJseSAoYmVmb3JlIHBoeS1sZXZlbCBoZWFkZXIpLgotICoKLSAqIHBsY3BfZXJyCi0gKiAgIFNpZ25hbCBsb2NrcyBhYmFuZG9uZWQgbGF0ZSAoZHVyaW5nIHBoeS1sZXZlbCBoZWFkZXIpLgotICoKLSAqIE5PVEU6ICBCb3RoIGZhbHNlX2FsYXJtX2NudCBhbmQgcGxjcF9lcnIgaW5jcmVtZW50IG1vbm90b25pY2FsbHkgZnJvbQotICogICAgICAgIGJlYWNvbiB0byBiZWFjb24sIGkuZS4gZWFjaCB2YWx1ZSBpcyBhbiBhY2N1bXVsYXRpb24gb2YgYWxsIGVycm9ycwotICogICAgICAgIGJlZm9yZSBhbmQgaW5jbHVkaW5nIHRoZSBsYXRlc3QgYmVhY29uLiAgVmFsdWVzIHdpbGwgd3JhcCBhcm91bmQgdG8gMAotICogICAgICAgIGFmdGVyIGNvdW50aW5nIHVwIHRvIDJeMzIgLSAxLiAgRHJpdmVyIG11c3QgZGlmZmVyZW50aWF0ZSB2cy4KLSAqICAgICAgICBwcmV2aW91cyBiZWFjb24ncyB2YWx1ZXMgdG8gZGV0ZXJtaW5lICMgZmFsc2UgYWxhcm1zIGluIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgYmVhY29uIHBlcmlvZC4KLSAqCi0gKiBUb3RhbCBudW1iZXIgb2YgZmFsc2UgYWxhcm1zID0gZmFsc2VfYWxhcm1zICsgcGxjcF9lcnJzCi0gKgotICogRm9yIE9GRE0sIGFkanVzdCB0aGUgZm9sbG93aW5nIHRhYmxlIGVudHJpZXMgaW4gc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQKLSAqIChub3RpY2UgdGhhdCB0aGUgc3RhcnQgcG9pbnRzIGZvciBPRkRNIGFyZSBhdCBvciBjbG9zZSB0byBzZXR0aW5ncyBmb3IKLSAqIG1heGltdW0gc2Vuc2l0aXZpdHkpOgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlQgIC8gIE1JTiAgLyAgTUFYCi0gKiAgIEhEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fSU5ERVggICAgICAgICAgOTAgICAvICAgODUgIC8gIDEyMAotICogICBIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JTkRFWCAgICAgMTcwICAgLyAgMTcwICAvICAyMTAKLSAqICAgSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9JTkRFWCAgICAgICAgIDEwNSAgIC8gIDEwNSAgLyAgMTQwCi0gKiAgIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fTVJDX0lOREVYICAgICAyMjAgICAvICAyMjAgIC8gIDI3MAotICoKLSAqICAgSWYgYWN0dWFsIHJhdGUgb2YgT0ZETSBmYWxzZSBhbGFybXMgKCsgcGxjcF9lcnJvcnMpIGlzIHRvbyBoaWdoCi0gKiAgIChncmVhdGVyIHRoYW4gNTAgZm9yIGVhY2ggMjA0LjggbXNlY3MgbGlzdGVuaW5nKSwgcmVkdWNlIHNlbnNpdGl2aXR5Ci0gKiAgIGJ5ICphZGRpbmcqIDEgdG8gYWxsIDQgb2YgdGhlIHRhYmxlIGVudHJpZXMgYWJvdmUsIHVwIHRvIHRoZSBtYXggZm9yCi0gKiAgIGVhY2ggZW50cnkuICBDb252ZXJzZWx5LCBpZiBmYWxzZSBhbGFybSByYXRlIGlzIHRvbyBsb3cgKGxlc3MgdGhhbiA1Ci0gKiAgIGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyksICpzdWJ0cmFjdCogMSBmcm9tIGVhY2ggZW50cnkgdG8KLSAqICAgaW5jcmVhc2Ugc2Vuc2l0aXZpdHkuCi0gKgotICogRm9yIENDSyBzZW5zaXRpdml0eSwga2VlcCB0cmFjayBvZiB0aGUgZm9sbG93aW5nOgotICoKLSAqICAgMSkuICAyMC1iZWFjb24gaGlzdG9yeSBvZiBtYXhpbXVtIGJhY2tncm91bmQgbm9pc2UsIGluZGljYXRlZCBieQotICogICAgICAgIChiZWFjb25fc2lsZW5jZV9yc3NpX1thYmNdICYgMHgwRkYwMCksIHVuaXRzIGluIGRCLCBhY3Jvc3MgdGhlCi0gKiAgICAgICAgMyByZWNlaXZlcnMuICBGb3IgYW55IGdpdmVuIGJlYWNvbiwgdGhlICJzaWxlbmNlIHJlZmVyZW5jZSIgaXMKLSAqICAgICAgICB0aGUgbWF4aW11bSBvZiBsYXN0IDYwIHNhbXBsZXMgKDIwIGJlYWNvbnMgKiAzIHJlY2VpdmVycykuCi0gKgotICogICAyKS4gIDEwLWJlYWNvbiBoaXN0b3J5IG9mIHN0cm9uZ2VzdCBzaWduYWwgbGV2ZWwsIGFzIGluZGljYXRlZAotICogICAgICAgIGJ5IChiZWFjb25fZW5lcmd5X1thYmNdICYgMHgwRkYwMCkgPj4gOCwgYWNyb3NzIHRoZSAzIHJlY2VpdmVycywKLSAqICAgICAgICBpLmUuIHRoZSBzdHJlbmd0aCBvZiB0aGUgc2lnbmFsIHRocm91Z2ggdGhlIGJlc3QgcmVjZWl2ZXIgYXQgdGhlCi0gKiAgICAgICAgbW9tZW50LiAgVGhlc2UgbWVhc3VyZW1lbnRzIGFyZSAidXBzaWRlIGRvd24iLCB3aXRoIGxvd2VyIHZhbHVlcwotICogICAgICAgIGZvciBzdHJvbmdlciBzaWduYWxzLCBzbyBtYXggZW5lcmd5IHdpbGwgYmUgKm1pbmltdW0qIHZhbHVlLgotICoKLSAqICAgICAgICBUaGVuIGZvciBhbnkgZ2l2ZW4gYmVhY29uLCB0aGUgZHJpdmVyIG11c3QgZGV0ZXJtaW5lIHRoZSAqd2Vha2VzdCoKLSAqICAgICAgICBvZiB0aGUgc3Ryb25nZXN0IHNpZ25hbHM7IHRoaXMgaXMgdGhlIG1pbmltdW0gbGV2ZWwgdGhhdCBuZWVkcyB0byBiZQotICogICAgICAgIHN1Y2Nlc3NmdWxseSBkZXRlY3RlZCwgd2hlbiB1c2luZyB0aGUgYmVzdCByZWNlaXZlciBhdCB0aGUgbW9tZW50LgotICogICAgICAgICJNYXggY2NrIGVuZXJneSIgaXMgdGhlIG1heGltdW0gKGhpZ2hlciB2YWx1ZSBtZWFucyBsb3dlciBlbmVyZ3khKQotICogICAgICAgIG9mIHRoZSBsYXN0IDEwIG1pbmltYS4gIE9uY2UgdGhpcyBpcyBkZXRlcm1pbmVkLCBkcml2ZXIgbXVzdCBhZGQKLSAqICAgICAgICBhIGxpdHRsZSBtYXJnaW4gYnkgYWRkaW5nICI2IiB0byBpdC4KLSAqCi0gKiAgIDMpLiAgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJlYWNvbiBwZXJpb2RzIHdpdGggdG9vIGZldyBmYWxzZSBhbGFybXMuCi0gKiAgICAgICAgUmVzZXQgdGhpcyB0byAwIGF0IHRoZSBmaXJzdCBiZWFjb24gcGVyaW9kIHRoYXQgZmFsbHMgd2l0aGluIHRoZQotICogICAgICAgICJnb29kIiByYW5nZSAoNSB0byA1MCBmYWxzZSBhbGFybXMgcGVyIDIwNC44IG1pbGxpc2Vjb25kcyByeCkuCi0gKgotICogVGhlbiwgYWRqdXN0IHRoZSBmb2xsb3dpbmcgQ0NLIHRhYmxlIGVudHJpZXMgaW4gc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQKLSAqIChub3RpY2UgdGhhdCB0aGUgc3RhcnQgcG9pbnRzIGZvciBDQ0sgYXJlIGF0IG1heGltdW0gc2Vuc2l0aXZpdHkpOgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlQgIC8gIE1JTiAgLyAgTUFYCi0gKiAgIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSU5ERVggICAgICAgICAxMjUgICAvICAxMjUgIC8gIDIwMAotICogICBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JTkRFWCAgICAgMjAwICAgLyAgMjAwICAvICA0MDAKLSAqICAgSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYICAgICAgICAgICAgICAgIDEwMCAgIC8gICAgMCAgLyAgMTAwCi0gKgotICogICBJZiBhY3R1YWwgcmF0ZSBvZiBDQ0sgZmFsc2UgYWxhcm1zICgrIHBsY3BfZXJyb3JzKSBpcyB0b28gaGlnaAotICogICAoZ3JlYXRlciB0aGFuIDUwIGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyksIG1ldGhvZCBmb3IgcmVkdWNpbmcKLSAqICAgc2Vuc2l0aXZpdHkgaXM6Ci0gKgotICogICAxKSAgKkFkZCogMyB0byB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JTkRFWCwKLSAqICAgICAgIHVwIHRvIG1heCA0MDAuCi0gKgotICogICAyKSAgSWYgY3VycmVudCB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lOREVYIGlzIDwgMTYwLAotICogICAgICAgc2Vuc2l0aXZpdHkgaGFzIGJlZW4gcmVkdWNlZCBhIHNpZ25pZmljYW50IGFtb3VudDsgYnJpbmcgaXQgdXAgdG8KLSAqICAgICAgIGEgbW9kZXJhdGUgMTYxLiAgT3RoZXJ3aXNlLCAqYWRkKiAzLCB1cCB0byBtYXggMjAwLgotICoKLSAqICAgMykgIGEpICBJZiBjdXJyZW50IHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSU5ERVggaXMgPiAxNjAsCi0gKiAgICAgICBzZW5zaXRpdml0eSBoYXMgYmVlbiByZWR1Y2VkIG9ubHkgYSBtb2RlcmF0ZSBvciBzbWFsbCBhbW91bnQ7Ci0gKiAgICAgICAqc3VidHJhY3QqIDIgZnJvbSB2YWx1ZSBpbiBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSU5ERVgsCi0gKiAgICAgICBkb3duIHRvIG1pbiAwLiAgT3RoZXJ3aXNlIChpZiBnYWluIGhhcyBiZWVuIHNpZ25pZmljYW50bHkgcmVkdWNlZCksCi0gKiAgICAgICBkb24ndCBjaGFuZ2UgdGhlIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JTkRFWCB2YWx1ZS4KLSAqCi0gKiAgICAgICBiKSAgU2F2ZSBhIHNuYXBzaG90IG9mIHRoZSAic2lsZW5jZSByZWZlcmVuY2UiLgotICoKLSAqICAgSWYgYWN0dWFsIHJhdGUgb2YgQ0NLIGZhbHNlIGFsYXJtcyAoKyBwbGNwX2Vycm9ycykgaXMgdG9vIGxvdwotICogICAobGVzcyB0aGFuIDUgZm9yIGVhY2ggMjA0LjggbXNlY3MgbGlzdGVuaW5nKSwgbWV0aG9kIGZvciBpbmNyZWFzaW5nCi0gKiAgIHNlbnNpdGl2aXR5IGlzIHVzZWQgb25seSBpZjoKLSAqCi0gKiAgIDFhKSAgUHJldmlvdXMgYmVhY29uIGRpZCBub3QgaGF2ZSB0b28gbWFueSBmYWxzZSBhbGFybXMKLSAqICAgMWIpICBBTkQgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZXZpb3VzICJzaWxlbmNlIHJlZmVyZW5jZSIgYW5kIGN1cnJlbnQKLSAqICAgICAgICAic2lsZW5jZSByZWZlcmVuY2UiIChwcmV2IC0gY3VycmVudCkgaXMgMiBvciBtb3JlLAotICogICBPUiAyKSAgMTAwIG9yIG1vcmUgY29uc2VjdXRpdmUgYmVhY29uIHBlcmlvZHMgaGF2ZSBoYWQgcmF0ZSBvZgotICogICAgICAgICAgbGVzcyB0aGFuIDUgZmFsc2UgYWxhcm1zIHBlciAyMDQuOCBtaWxsaXNlY29uZHMgcnggdGltZS4KLSAqCi0gKiAgIE1ldGhvZCBmb3IgaW5jcmVhc2luZyBzZW5zaXRpdml0eToKLSAqCi0gKiAgIDEpICAqU3VidHJhY3QqIDMgZnJvbSB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lOREVYLAotICogICAgICAgZG93biB0byBtaW4gMTI1LgotICoKLSAqICAgMikgICpTdWJ0cmFjdCogMyBmcm9tIHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fTVJDX0lOREVYLAotICogICAgICAgZG93biB0byBtaW4gMjAwLgotICoKLSAqICAgMykgICpBZGQqIDIgdG8gdmFsdWUgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYLCB1cCB0byBtYXggMTAwLgotICoKLSAqICAgSWYgYWN0dWFsIHJhdGUgb2YgQ0NLIGZhbHNlIGFsYXJtcyAoKyBwbGNwX2Vycm9ycykgaXMgd2l0aGluIGdvb2QgcmFuZ2UKLSAqICAgKGJldHdlZW4gNSBhbmQgNTAgZm9yIGVhY2ggMjA0LjggbXNlY3MgbGlzdGVuaW5nKToKLSAqCi0gKiAgIDEpICBTYXZlIGEgc25hcHNob3Qgb2YgdGhlIHNpbGVuY2UgcmVmZXJlbmNlLgotICoKLSAqICAgMikgIElmIHByZXZpb3VzIGJlYWNvbiBoYWQgdG9vIG1hbnkgQ0NLIGZhbHNlIGFsYXJtcyAoKyBwbGNwX2Vycm9ycyksCi0gKiAgICAgICBnaXZlIHNvbWUgZXh0cmEgbWFyZ2luIHRvIGVuZXJneSB0aHJlc2hvbGQgYnkgKnN1YnRyYWN0aW5nKiA4Ci0gKiAgICAgICBmcm9tIHZhbHVlIGluIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JTkRFWC4KLSAqCi0gKiAgIEZvciBhbGwgY2FzZXMgKHRvbyBmZXcsIHRvbyBtYW55LCBnb29kIHJhbmdlKSwgbWFrZSBzdXJlIHRoYXQgdGhlIENDSwotICogICBkZXRlY3Rpb24gdGhyZXNob2xkIChlbmVyZ3kpIGlzIGJlbG93IHRoZSBlbmVyZ3kgbGV2ZWwgZm9yIHJvYnVzdAotICogICBkZXRlY3Rpb24gb3ZlciB0aGUgcGFzdCAxMCBiZWFjb24gcGVyaW9kcywgdGhlICJNYXggY2NrIGVuZXJneSIuCi0gKiAgIExvd2VyIHZhbHVlcyBtZWFuIGhpZ2hlciBlbmVyZ3k7IHRoaXMgbWVhbnMgbWFraW5nIHN1cmUgdGhhdCB0aGUgdmFsdWUKLSAqICAgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYIGlzIGF0IG9yICphYm92ZSogIk1heCBjY2sgZW5lcmd5Ii4KLSAqCi0gKi8KLQotLyoKLSAqIFRhYmxlIGVudHJpZXMgaW4gU0VOU0lUSVZJVFlfQ01EIChzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCkKLSAqLwotI2RlZmluZSBIRF9UQUJMRV9TSVpFICAoMTEpCS8qIG51bWJlciBvZiBlbnRyaWVzICovCi0jZGVmaW5lIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JTkRFWCAgICAgICAgICAgICAgICAgKDApCS8qIHRhYmxlIGluZGV4ZXMgKi8KLSNkZWZpbmUgSERfTUlOX0VORVJHWV9PRkRNX0RFVF9JTkRFWCAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9JTkRFWCAgICAgICAgICAoMikKLSNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9NUkNfSU5ERVggICAgICAoMykKLSNkZWZpbmUgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSU5ERVggICAgICAoNCkKLSNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9JTkRFWCAgICAgICAgICAoNSkKLSNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9NUkNfSU5ERVggICAgICAoNikKLSNkZWZpbmUgSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9JTkRFWCAgICAgICAgICAgICAoNykKLSNkZWZpbmUgSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9NUkNfSU5ERVggICAgICAgICAoOCkKLSNkZWZpbmUgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JTkRFWCAgICAgICAgICAoOSkKLSNkZWZpbmUgSERfT0ZETV9FTkVSR1lfVEhfSU5fSU5ERVggICAgICAgICAgICAgICAgICAoMTApCi0KLS8qIENvbnRyb2wgZmllbGQgaW4gc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQgKi8KLSNkZWZpbmUgU0VOU0lUSVZJVFlfQ01EX0NPTlRST0xfREVGQVVMVF9UQUJMRQljcHVfdG9fbGUxNigwKQotI2RlZmluZSBTRU5TSVRJVklUWV9DTURfQ09OVFJPTF9XT1JLX1RBQkxFCWNwdV90b19sZTE2KDEpCi0KLS8qKgotICogc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQKLSAqIEBjb250cm9sOiAgKDEpIHVwZGF0ZXMgd29ya2luZyB0YWJsZSwgKDApIHVwZGF0ZXMgZGVmYXVsdCB0YWJsZQotICogQHRhYmxlOiAgZW5lcmd5IHRocmVzaG9sZCB2YWx1ZXMsIHVzZSBIRF8qIGFzIGluZGV4IGludG8gdGFibGUKLSAqCi0gKiBBbHdheXMgdXNlICIxIiBpbiAiY29udHJvbCIgdG8gdXBkYXRlIHVDb2RlJ3Mgd29ya2luZyB0YWJsZSBhbmQgRFNQLgotICovCi1zdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCB7Ci0JX19sZTE2IGNvbnRyb2w7CQkJLyogYWx3YXlzIHVzZSAiMSIgKi8KLQlfX2xlMTYgdGFibGVbSERfVEFCTEVfU0laRV07CS8qIHVzZSBIRF8qIGFzIGluZGV4ICovCi19IF9fcGFja2VkOwotCi0KLS8qKgotICogUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRCA9IDB4YjAgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBUaGlzIGNvbW1hbmQgc2V0cyB0aGUgcmVsYXRpdmUgZ2FpbnMgb2YgNDk2NSBkZXZpY2UncyAzIHJhZGlvIHJlY2VpdmVyIGNoYWlucy4KLSAqCi0gKiBBZnRlciB0aGUgZmlyc3QgYXNzb2NpYXRpb24sIGRyaXZlciBzaG91bGQgYWNjdW11bGF0ZSBzaWduYWwgYW5kIG5vaXNlCi0gKiBzdGF0aXN0aWNzIGZyb20gdGhlIFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OcyB0aGF0IGZvbGxvdyB0aGUgZmlyc3QgMjAKLSAqIGJlYWNvbnMgZnJvbSB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrIChkb24ndCBjb2xsZWN0IHN0YXRpc3RpY3MgdGhhdCBjb21lCi0gKiBpbiBmcm9tIHNjYW5uaW5nLCBvciBhbnkgb3RoZXIgbm9uLW5ldHdvcmsgc291cmNlKS4KLSAqCi0gKiBESVNDT05ORUNURUQgQU5URU5OQToKLSAqCi0gKiBEcml2ZXIgc2hvdWxkIGRldGVybWluZSB3aGljaCBhbnRlbm5hcyBhcmUgYWN0dWFsbHkgY29ubmVjdGVkLCBieSBjb21wYXJpbmcKLSAqIGF2ZXJhZ2UgYmVhY29uIHNpZ25hbCBsZXZlbHMgZm9yIHRoZSAzIFJ4IGNoYWlucy4gIEFjY3VtdWxhdGUgKGFkZCkgdGhlCi0gKiBmb2xsb3dpbmcgdmFsdWVzIG92ZXIgMjAgYmVhY29ucywgb25lIGFjY3VtdWxhdG9yIGZvciBlYWNoIG9mIHRoZSBjaGFpbnMKLSAqIGEvYi9jLCBmcm9tIHN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHk6Ci0gKgotICogYmVhY29uX3Jzc2lfW2FiY10gJiAweDBGRiAodW5zaWduZWQsIHVuaXRzIGluIGRCKQotICoKLSAqIEZpbmQgdGhlIHN0cm9uZ2VzdCBzaWduYWwgZnJvbSBhbW9uZyBhL2IvYy4gIENvbXBhcmUgdGhlIG90aGVyIHR3byB0byB0aGUKLSAqIHN0cm9uZ2VzdC4gIElmIGFueSBzaWduYWwgaXMgbW9yZSB0aGFuIDE1IGRCICh0aW1lcyAyMCwgdW5sZXNzIHlvdQotICogZGl2aWRlIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMgYnkgMjApIGJlbG93IHRoZSBzdHJvbmdlc3QsIHRoZSBkcml2ZXIKLSAqIGNvbnNpZGVycyB0aGF0IGFudGVubmEgdG8gYmUgZGlzY29ubmVjdGVkLCBhbmQgc2hvdWxkIG5vdCB0cnkgdG8gdXNlIHRoYXQKLSAqIGFudGVubmEvY2hhaW4gZm9yIFJ4IG9yIFR4LiAgSWYgYm90aCBBIGFuZCBCIHNlZW0gdG8gYmUgZGlzY29ubmVjdGVkLAotICogZHJpdmVyIHNob3VsZCBkZWNsYXJlIHRoZSBzdHJvbmdlciBvbmUgYXMgY29ubmVjdGVkLCBhbmQgYXR0ZW1wdCB0byB1c2UgaXQKLSAqIChBIGFuZCBCIGFyZSB0aGUgb25seSAyIFR4IGNoYWlucyEpLgotICoKLSAqCi0gKiBSWCBCQUxBTkNFOgotICoKLSAqIERyaXZlciBzaG91bGQgYmFsYW5jZSB0aGUgMyByZWNlaXZlcnMgKGJ1dCBqdXN0IHRoZSBvbmVzIHRoYXQgYXJlIGNvbm5lY3RlZAotICogdG8gYW50ZW5uYXMsIHNlZSBhYm92ZSkgZm9yIGdhaW4sIGJ5IGNvbXBhcmluZyB0aGUgYXZlcmFnZSBzaWduYWwgbGV2ZWxzCi0gKiBkZXRlY3RlZCBkdXJpbmcgdGhlIHNpbGVuY2UgYWZ0ZXIgZWFjaCBiZWFjb24gKGJhY2tncm91bmQgbm9pc2UpLgotICogQWNjdW11bGF0ZSAoYWRkKSB0aGUgZm9sbG93aW5nIHZhbHVlcyBvdmVyIDIwIGJlYWNvbnMsIG9uZSBhY2N1bXVsYXRvciBmb3IKLSAqIGVhY2ggb2YgdGhlIGNoYWlucyBhL2IvYywgZnJvbSBzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5OgotICoKLSAqIGJlYWNvbl9zaWxlbmNlX3Jzc2lfW2FiY10gJiAweDBGRiAodW5zaWduZWQsIHVuaXRzIGluIGRCKQotICoKLSAqIEZpbmQgdGhlIHdlYWtlc3QgYmFja2dyb3VuZCBub2lzZSBsZXZlbCBmcm9tIGFtb25nIGEvYi9jLiAgVGhpcyBSeCBjaGFpbgotICogd2lsbCBiZSB0aGUgcmVmZXJlbmNlLCB3aXRoIDAgZ2FpbiBhZGp1c3RtZW50LiAgQXR0ZW51YXRlIG90aGVyIGNoYW5uZWxzIGJ5Ci0gKiBmaW5kaW5nIG5vaXNlIGRpZmZlcmVuY2U6Ci0gKgotICogKGFjY3VtX25vaXNlW2ldIC0gYWNjdW1fbm9pc2VbcmVmZXJlbmNlXSkgLyAzMAotICoKLSAqIFRoZSAiMzAiIGFkanVzdHMgdGhlIGRCIGluIHRoZSAyMCBhY2N1bXVsYXRlZCBzYW1wbGVzIHRvIHVuaXRzIG9mIDEuNSBkQi4KLSAqIEZvciB1c2UgaW4gZGlmZl9nYWluX1thYmNdIGZpZWxkcyBvZiBzdHJ1Y3QgaXdsX2NhbGlicmF0aW9uX2NtZCwgdGhlCi0gKiBkcml2ZXIgc2hvdWxkIGxpbWl0IHRoZSBkaWZmZXJlbmNlIHJlc3VsdHMgdG8gYSByYW5nZSBvZiAwLTMgKDAtNC41IGRCKSwKLSAqIGFuZCBzZXQgYml0IDIgdG8gaW5kaWNhdGUgInJlZHVjZSBnYWluIi4gIFRoZSB2YWx1ZSBmb3IgdGhlIHJlZmVyZW5jZQotICogKHdlYWtlc3QpIGNoYWluIHNob3VsZCBiZSAiMCIuCi0gKgotICogZGlmZl9nYWluX1thYmNdIGJpdCBmaWVsZHM6Ci0gKiAgIDI6ICgxKSByZWR1Y2UgZ2FpbiwgKDApIGluY3JlYXNlIGdhaW4KLSAqIDEtMDogYW1vdW50IG9mIGdhaW4sIHVuaXRzIG9mIDEuNSBkQgotICovCi0KLS8qIFBoeSBjYWxpYnJhdGlvbiBjb21tYW5kIGZvciBzZXJpZXMgKi8KLS8qIFRoZSBkZWZhdWx0IGNhbGlicmF0ZSB0YWJsZSBzaXplIGlmIG5vdCBzcGVjaWZpZWQgYnkgZmlybXdhcmUgKi8KLSNkZWZpbmUgSVdMX0RFRkFVTFRfU1RBTkRBUkRfUEhZX0NBTElCUkFURV9UQkxfU0laRQkxOAotZW51bSB7Ci0JSVdMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRAkJPSA3LAotCUlXTF9NQVhfU1RBTkRBUkRfUEhZX0NBTElCUkFURV9UQkxfU0laRQk9IDE5LAotfTsKLQotI2RlZmluZSBJV0xfTUFYX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkUJCSgyNTMpCi0KLXN0cnVjdCBpd2xfY2FsaWJfaGRyIHsKLQl1OCBvcF9jb2RlOwotCXU4IGZpcnN0X2dyb3VwOwotCXU4IGdyb3Vwc19udW07Ci0JdTggZGF0YV92YWxpZDsKLX0gX19wYWNrZWQ7Ci0KLS8qIElXTF9QSFlfQ0FMSUJSQVRFX0RJRkZfR0FJTl9DTUQgKDcpICovCi1zdHJ1Y3QgaXdsX2NhbGliX2RpZmZfZ2Fpbl9jbWQgewotCXN0cnVjdCBpd2xfY2FsaWJfaGRyIGhkcjsKLQlzOCBkaWZmX2dhaW5fYTsJCS8qIHNlZSBhYm92ZSAqLwotCXM4IGRpZmZfZ2Fpbl9iOwotCXM4IGRpZmZfZ2Fpbl9jOwotCXU4IHJlc2VydmVkMTsKLX0gX19wYWNrZWQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICgxMikKLSAqIE1pc2NlbGxhbmVvdXMgQ29tbWFuZHM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogTEVEcyBDb21tYW5kICYgUmVzcG9uc2UKLSAqIFJFUExZX0xFRFNfQ01EID0gMHg0OCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICoKLSAqIEZvciBlYWNoIG9mIDMgcG9zc2libGUgTEVEcyAoQWN0aXZpdHkvTGluay9UZWNoLCBzZWxlY3RlZCBieSAiaWQiIGZpZWxkKSwKLSAqIHRoaXMgY29tbWFuZCB0dXJucyBpdCBvbiBvciBvZmYsIG9yIHNldHMgdXAgYSBwZXJpb2RpYyBibGlua2luZyBjeWNsZS4KLSAqLwotc3RydWN0IGl3bF9sZWRfY21kIHsKLQlfX2xlMzIgaW50ZXJ2YWw7CS8qICJpbnRlcnZhbCIgaW4gdVNlYyAqLwotCXU4IGlkOwkJCS8qIDE6IEFjdGl2aXR5LCAyOiBMaW5rLCAzOiBUZWNoICovCi0JdTggb2ZmOwkJCS8qICMgaW50ZXJ2YWxzIG9mZiB3aGlsZSBibGlua2luZzsKLQkJCQkgKiAiMCIsIHdpdGggPjAgIm9uIiB2YWx1ZSwgdHVybnMgTEVEIG9uICovCi0JdTggb247CQkJLyogIyBpbnRlcnZhbHMgb24gd2hpbGUgYmxpbmtpbmc7Ci0JCQkJICogIjAiLCByZWdhcmRsZXNzIG9mICJvZmYiLCB0dXJucyBMRUQgb2ZmICovCi0JdTggcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICgxMykKLSAqIFVuaW9uIG9mIGFsbCBleHBlY3RlZCBub3RpZmljYXRpb25zL3Jlc3BvbnNlczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBpd2xfcnhfcGFja2V0IHsKLQkvKgotCSAqIFRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBSWCBmcmFtZSBoZWFkZXIgY29udGFpbiBib3RoIHRoZSBSWCBmcmFtZQotCSAqIHNpemUgYW5kIHNvbWUgZmxhZ3MuCi0JICogQml0IGZpZWxkczoKLQkgKiAzMTogICAgZmxhZyBmbHVzaCBSQiByZXF1ZXN0Ci0JICogMzA6ICAgIGZsYWcgaWdub3JlIFRDICh0ZXJtaW5hbCBjb3VudGVyKSByZXF1ZXN0Ci0JICogMjk6ICAgIGZsYWcgZmFzdCBJUlEgcmVxdWVzdAotCSAqIDI4LTE0OiBSZXNlcnZlZAotCSAqIDEzLTAwOiBSWCBmcmFtZSBzaXplCi0JICovCi0JX19sZTMyIGxlbl9uX2ZsYWdzOwotCXN0cnVjdCBpd2xfY21kX2hlYWRlciBoZHI7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZSByeF9mcmFtZTsKLQkJc3RydWN0IGl3bDM5NDVfdHhfcmVzcCB0eF9yZXNwOwotCQlzdHJ1Y3QgaXdsMzk0NV9iZWFjb25fbm90aWYgYmVhY29uX3N0YXR1czsKLQotCQlzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgYWxpdmVfZnJhbWU7Ci0JCXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uIHNwZWN0cnVtX25vdGlmOwotCQlzdHJ1Y3QgaXdsX2NzYV9ub3RpZmljYXRpb24gY3NhX25vdGlmOwotCQlzdHJ1Y3QgaXdsX2Vycm9yX3Jlc3AgZXJyX3Jlc3A7Ci0JCXN0cnVjdCBpd2xfY2FyZF9zdGF0ZV9ub3RpZiBjYXJkX3N0YXRlX25vdGlmOwotCQlzdHJ1Y3QgaXdsX2FkZF9zdGFfcmVzcCBhZGRfc3RhOwotCQlzdHJ1Y3QgaXdsX3JlbV9zdGFfcmVzcCByZW1fc3RhOwotCQlzdHJ1Y3QgaXdsX3NsZWVwX25vdGlmaWNhdGlvbiBzbGVlcF9ub3RpZjsKLQkJc3RydWN0IGl3bF9zcGVjdHJ1bV9yZXNwIHNwZWN0cnVtOwotCQlzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3Mgc3RhdHM7Ci0JCXN0cnVjdCBpd2xfY29tcHJlc3NlZF9iYV9yZXNwIGNvbXByZXNzZWRfYmE7Ci0JCXN0cnVjdCBpd2xfbWlzc2VkX2JlYWNvbl9ub3RpZiBtaXNzZWRfYmVhY29uOwotCQlfX2xlMzIgc3RhdHVzOwotCQl1OCByYXdbMF07Ci0JfSB1OwotfSBfX3BhY2tlZDsKLQotI2VuZGlmCQkJCS8qIF9faXdsX2xlZ2FjeV9jb21tYW5kc19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQ1NjU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1wb3dlci5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotCi0KLU1PRFVMRV9ERVNDUklQVElPTigiaXdsLWxlZ2FjeTogY29tbW9uIGZ1bmN0aW9ucyBmb3IgMzk0NSBhbmQgNDk2NSIpOwotTU9EVUxFX1ZFUlNJT04oSVdMV0lGSV9WRVJTSU9OKTsKLU1PRFVMRV9BVVRIT1IoRFJWX0NPUFlSSUdIVCAiICIgRFJWX0FVVEhPUik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLS8qCi0gKiBzZXQgYnRfY29leF9hY3RpdmUgdG8gdHJ1ZSwgdUNvZGUgd2lsbCBkbyBraWxsL2RlZmVyCi0gKiBldmVyeSB0aW1lIHRoZSBwcmlvcml0eSBsaW5lIGlzIGFzc2VydGVkIChCVCBpcyBzZW5kaW5nIHNpZ25hbHMgb24gdGhlCi0gKiBwcmlvcml0eSBsaW5lIGluIHRoZSBQQ0l4KS4KLSAqIHNldCBidF9jb2V4X2FjdGl2ZSB0byBmYWxzZSwgdUNvZGUgd2lsbCBpZ25vcmUgdGhlIEJUIGFjdGl2aXR5IGFuZAotICogcGVyZm9ybSB0aGUgbm9ybWFsIG9wZXJhdGlvbgotICoKLSAqIFVzZXIgbWlnaHQgZXhwZXJpZW5jZSB0cmFuc21pdCBpc3N1ZSBvbiBzb21lIHBsYXRmb3JtIGR1ZSB0byBXaUZpL0JUCi0gKiBjby1leGlzdCBwcm9ibGVtLiBUaGUgcG9zc2libGUgYmVoYXZpb3JzIGFyZToKLSAqICAgQWJsZSB0byBzY2FuIGFuZCBmaW5kaW5nIGFsbCB0aGUgYXZhaWxhYmxlIEFQCi0gKiAgIE5vdCBhYmxlIHRvIGFzc29jaWF0ZSB3aXRoIGFueSBBUAotICogT24gdGhvc2UgcGxhdGZvcm1zLCBXaUZpIGNvbW11bmljYXRpb24gY2FuIGJlIHJlc3RvcmVkIGJ5IHNldAotICogImJ0X2NvZXhfYWN0aXZlIiBtb2R1bGUgcGFyYW1ldGVyIHRvICJmYWxzZSIKLSAqCi0gKiBkZWZhdWx0OiBidF9jb2V4X2FjdGl2ZSA9IHRydWUgKEJUX0NPRVhfRU5BQkxFKQotICovCi1zdGF0aWMgYm9vbCBidF9jb2V4X2FjdGl2ZSA9IHRydWU7Ci1tb2R1bGVfcGFyYW0oYnRfY29leF9hY3RpdmUsIGJvb2wsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhidF9jb2V4X2FjdGl2ZSwgImVuYWJsZSB3aWZpL2JsdWV0b290aCBjby1leGlzdCIpOwotCi11MzIgaXdsZWdhY3lfZGVidWdfbGV2ZWw7Ci1FWFBPUlRfU1lNQk9MKGl3bGVnYWN5X2RlYnVnX2xldmVsKTsKLQotY29uc3QgdTggaXdsZWdhY3lfYmNhc3RfYWRkcltFVEhfQUxFTl0gPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKLUVYUE9SVF9TWU1CT0woaXdsZWdhY3lfYmNhc3RfYWRkcik7Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBib3RoIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgaHcgYW5kIHByaXYuICovCi1zdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfbGVnYWN5X2FsbG9jX2FsbChzdHJ1Y3QgaXdsX2NmZyAqY2ZnKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKLQkvKiBtYWM4MDIxMSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGlzIGRldmljZSBpbnN0YW5jZSwgaW5jbHVkaW5nCi0JICogICBzcGFjZSBmb3IgdGhpcyBkcml2ZXIncyBwcml2YXRlIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCi0JaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBpd2xfcHJpdiksCi0JCQkJY2ZnLT5vcHMtPmllZWU4MDIxMV9vcHMpOwotCWlmIChodyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IENhbiBub3QgYWxsb2NhdGUgbmV0d29yayBkZXZpY2VcbiIsCi0JCSAgICAgICBjZmctPm5hbWUpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwcml2ID0gaHctPnByaXY7Ci0JcHJpdi0+aHcgPSBodzsKLQotb3V0OgotCXJldHVybiBodzsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9hbGxvY19hbGwpOwotCi0jZGVmaW5lIE1BWF9CSVRfUkFURV80MF9NSFogMTUwIC8qIE1icHMgKi8KLSNkZWZpbmUgTUFYX0JJVF9SQVRFXzIwX01IWiA3MiAvKiBNYnBzICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2luaXRfaHRfaHdfY2FwYWIoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9pbmZvLAotCQkJICAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQotewotCXUxNiBtYXhfYml0X3JhdGUgPSAwOwotCXU4IHJ4X2NoYWluc19udW0gPSBwcml2LT5od19wYXJhbXMucnhfY2hhaW5zX251bTsKLQl1OCB0eF9jaGFpbnNfbnVtID0gcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW07Ci0KLQlodF9pbmZvLT5jYXAgPSAwOwotCW1lbXNldCgmaHRfaW5mby0+bWNzLCAwLCBzaXplb2YoaHRfaW5mby0+bWNzKSk7Ci0KLQlodF9pbmZvLT5odF9zdXBwb3J0ZWQgPSB0cnVlOwotCi0JaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOwotCW1heF9iaXRfcmF0ZSA9IE1BWF9CSVRfUkFURV8yMF9NSFo7Ci0JaWYgKHByaXYtPmh3X3BhcmFtcy5odDQwX2NoYW5uZWwgJiBCSVQoYmFuZCkpIHsKLQkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOwotCQlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7Ci0JCWh0X2luZm8tPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKLQkJbWF4X2JpdF9yYXRlID0gTUFYX0JJVF9SQVRFXzQwX01IWjsKLQl9Ci0KLQlpZiAocHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5hbXNkdV9zaXplXzhLKQotCQlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFU7Ci0KLQlodF9pbmZvLT5hbXBkdV9mYWN0b3IgPSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SX0RFRjsKLQlodF9pbmZvLT5hbXBkdV9kZW5zaXR5ID0gQ0ZHX0hUX01QRFVfREVOU0lUWV9ERUY7Ci0KLQlodF9pbmZvLT5tY3MucnhfbWFza1swXSA9IDB4RkY7Ci0JaWYgKHJ4X2NoYWluc19udW0gPj0gMikKLQkJaHRfaW5mby0+bWNzLnJ4X21hc2tbMV0gPSAweEZGOwotCWlmIChyeF9jaGFpbnNfbnVtID49IDMpCi0JCWh0X2luZm8tPm1jcy5yeF9tYXNrWzJdID0gMHhGRjsKLQotCS8qIEhpZ2hlc3Qgc3VwcG9ydGVkIFJ4IGRhdGEgcmF0ZSAqLwotCW1heF9iaXRfcmF0ZSAqPSByeF9jaGFpbnNfbnVtOwotCVdBUk5fT04obWF4X2JpdF9yYXRlICYgfklFRUU4MDIxMV9IVF9NQ1NfUlhfSElHSEVTVF9NQVNLKTsKLQlodF9pbmZvLT5tY3MucnhfaGlnaGVzdCA9IGNwdV90b19sZTE2KG1heF9iaXRfcmF0ZSk7Ci0KLQkvKiBUeCBNQ1MgY2FwYWJpbGl0aWVzICovCi0JaHRfaW5mby0+bWNzLnR4X3BhcmFtcyA9IElFRUU4MDIxMV9IVF9NQ1NfVFhfREVGSU5FRDsKLQlpZiAodHhfY2hhaW5zX251bSAhPSByeF9jaGFpbnNfbnVtKSB7Ci0JCWh0X2luZm8tPm1jcy50eF9wYXJhbXMgfD0gSUVFRTgwMjExX0hUX01DU19UWF9SWF9ESUZGOwotCQlodF9pbmZvLT5tY3MudHhfcGFyYW1zIHw9ICgodHhfY2hhaW5zX251bSAtIDEpIDw8Ci0JCQkJSUVFRTgwMjExX0hUX01DU19UWF9NQVhfU1RSRUFNU19TSElGVCk7Ci0JfQotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfaW5pdF9nZW9zIC0gSW5pdGlhbGl6ZSBtYWM4MDIxMSdzIGdlby9jaGFubmVsIGluZm8gYmFzZWQgZnJvbSBlZXByb20KLSAqLwotaW50IGl3bF9sZWdhY3lfaW5pdF9nZW9zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2g7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsczsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmdlb19jaDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGVzOwotCWludCBpID0gMDsKLQlzOCBtYXhfdHhfcG93ZXIgPSAwOwotCi0JaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fYml0cmF0ZXMgfHwKLQkgICAgcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9iaXRyYXRlcykgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiR2VvZ3JhcGh5IG1vZGVzIGFscmVhZHkgaW5pdGlhbGl6ZWQuXG4iKTsKLQkJc2V0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljaGFubmVscyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCkgKgotCQkJICAgcHJpdi0+Y2hhbm5lbF9jb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGFubmVscykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyYXRlcyA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhdGUpICogSVdMX1JBVEVfQ09VTlRfTEVHQUNZKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmICghcmF0ZXMpIHsKLQkJa2ZyZWUoY2hhbm5lbHMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiA1LjJHSHogY2hhbm5lbHMgc3RhcnQgYWZ0ZXIgdGhlIDIuNEdIeiBjaGFubmVscyAqLwotCXNiYW5kID0gJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOwotCXNiYW5kLT5jaGFubmVscyA9ICZjaGFubmVsc1tBUlJBWV9TSVpFKGl3bGVnYWN5X2VlcHJvbV9iYW5kXzEpXTsKLQkvKiBqdXN0IE9GRE0gKi8KLQlzYmFuZC0+Yml0cmF0ZXMgPSAmcmF0ZXNbSVdMX0ZJUlNUX09GRE1fUkFURV07Ci0Jc2JhbmQtPm5fYml0cmF0ZXMgPSBJV0xfUkFURV9DT1VOVF9MRUdBQ1kgLSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0JaWYgKHByaXYtPmNmZy0+c2t1ICYgSVdMX1NLVV9OKQotCQlpd2xfbGVnYWN5X2luaXRfaHRfaHdfY2FwYWIocHJpdiwgJnNiYW5kLT5odF9jYXAsCi0JCQkJCSBJRUVFODAyMTFfQkFORF81R0haKTsKLQotCXNiYW5kID0gJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOwotCXNiYW5kLT5jaGFubmVscyA9IGNoYW5uZWxzOwotCS8qIE9GRE0gJiBDQ0sgKi8KLQlzYmFuZC0+Yml0cmF0ZXMgPSByYXRlczsKLQlzYmFuZC0+bl9iaXRyYXRlcyA9IElXTF9SQVRFX0NPVU5UX0xFR0FDWTsKLQotCWlmIChwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfTikKLQkJaXdsX2xlZ2FjeV9pbml0X2h0X2h3X2NhcGFiKHByaXYsICZzYmFuZC0+aHRfY2FwLAotCQkJCQkgSUVFRTgwMjExX0JBTkRfMkdIWik7Ci0KLQlwcml2LT5pZWVlX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0JcHJpdi0+aWVlZV9yYXRlcyA9IHJhdGVzOwotCi0JZm9yIChpID0gMDsgIGkgPCBwcml2LT5jaGFubmVsX2NvdW50OyBpKyspIHsKLQkJY2ggPSAmcHJpdi0+Y2hhbm5lbF9pbmZvW2ldOwotCi0JCWlmICghaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNiYW5kID0gJnByaXYtPmJhbmRzW2NoLT5iYW5kXTsKLQotCQlnZW9fY2ggPSAmc2JhbmQtPmNoYW5uZWxzW3NiYW5kLT5uX2NoYW5uZWxzKytdOwotCi0JCWdlb19jaC0+Y2VudGVyX2ZyZXEgPQotCQkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoLT5jaGFubmVsLCBjaC0+YmFuZCk7Ci0JCWdlb19jaC0+bWF4X3Bvd2VyID0gY2gtPm1heF9wb3dlcl9hdmc7Ci0JCWdlb19jaC0+bWF4X2FudGVubmFfZ2FpbiA9IDB4ZmY7Ci0JCWdlb19jaC0+aHdfdmFsdWUgPSBjaC0+Y2hhbm5lbDsKLQotCQlpZiAoaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoKSkgewotCQkJaWYgKCEoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfSUJTUykpCi0JCQkJZ2VvX2NoLT5mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT19JQlNTOwotCi0JCQlpZiAoIShjaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9BQ1RJVkUpKQotCQkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOOwotCi0JCQlpZiAoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfUkFEQVIpCi0JCQkJZ2VvX2NoLT5mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9SQURBUjsKLQotCQkJZ2VvX2NoLT5mbGFncyB8PSBjaC0+aHQ0MF9leHRlbnNpb25fY2hhbm5lbDsKLQotCQkJaWYgKGNoLT5tYXhfcG93ZXJfYXZnID4gbWF4X3R4X3Bvd2VyKQotCQkJCW1heF90eF9wb3dlciA9IGNoLT5tYXhfcG93ZXJfYXZnOwotCQl9IGVsc2UgewotCQkJZ2VvX2NoLT5mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRDsKLQkJfQotCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJDaGFubmVsICVkIEZyZXE9JWRbJXNHSHpdICVzIGZsYWc9MHglWFxuIiwKLQkJCQljaC0+Y2hhbm5lbCwgZ2VvX2NoLT5jZW50ZXJfZnJlcSwKLQkJCQlpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoKSA/ICAiNS4yIiA6ICIyLjQiLAotCQkJCWdlb19jaC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCA/Ci0JCQkJInJlc3RyaWN0ZWQiIDogInZhbGlkIiwKLQkJCQkgZ2VvX2NoLT5mbGFncyk7Ci0JfQotCi0JcHJpdi0+dHhfcG93ZXJfZGV2aWNlX2xtdCA9IG1heF90eF9wb3dlcjsKLQlwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9IG1heF90eF9wb3dlcjsKLQlwcml2LT50eF9wb3dlcl9uZXh0ID0gbWF4X3R4X3Bvd2VyOwotCi0JaWYgKChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzID09IDApICYmCi0JICAgICBwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfQSkgewotCQlJV0xfSU5GTyhwcml2LCAiSW5jb3JyZWN0bHkgZGV0ZWN0ZWQgQkcgY2FyZCBhcyBBQkcuICIKLQkJCSJQbGVhc2Ugc2VuZCB5b3VyIFBDSSBJRCAweCUwNFg6MHglMDRYIHRvIG1haW50YWluZXIuXG4iLAotCQkJICAgcHJpdi0+cGNpX2Rldi0+ZGV2aWNlLAotCQkJICAgcHJpdi0+cGNpX2Rldi0+c3Vic3lzdGVtX2RldmljZSk7Ci0JCXByaXYtPmNmZy0+c2t1ICY9IH5JV0xfU0tVX0E7Ci0JfQotCi0JSVdMX0lORk8ocHJpdiwgIlR1bmFibGUgY2hhbm5lbHM6ICVkIDgwMi4xMWJnLCAlZCA4MDIuMTFhIGNoYW5uZWxzXG4iLAotCQkgICBwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2NoYW5uZWxzLAotCQkgICBwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKTsKLQotCXNldF9iaXQoU1RBVFVTX0dFT19DT05GSUdVUkVELCAmcHJpdi0+c3RhdHVzKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2luaXRfZ2Vvcyk7Ci0KLS8qCi0gKiBpd2xfbGVnYWN5X2ZyZWVfZ2VvcyAtIHVuZG8gYWxsb2NhdGlvbnMgaW4gaXdsX2xlZ2FjeV9pbml0X2dlb3MKLSAqLwotdm9pZCBpd2xfbGVnYWN5X2ZyZWVfZ2VvcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Ja2ZyZWUocHJpdi0+aWVlZV9jaGFubmVscyk7Ci0Ja2ZyZWUocHJpdi0+aWVlZV9yYXRlcyk7Ci0JY2xlYXJfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZnJlZV9nZW9zKTsKLQotc3RhdGljIGJvb2wgaXdsX2xlZ2FjeV9pc19jaGFubmVsX2V4dGVuc2lvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkJICAgICB1MTYgY2hhbm5lbCwgdTggZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0KQotewotCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCi0JY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBiYW5kLCBjaGFubmVsKTsKLQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGV4dGVuc2lvbl9jaGFuX29mZnNldCA9PSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRSkKLQkJcmV0dXJuICEoY2hfaW5mby0+aHQ0MF9leHRlbnNpb25fY2hhbm5lbCAmCi0JCQkJCUlFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKTsKLQllbHNlIGlmIChleHRlbnNpb25fY2hhbl9vZmZzZXQgPT0gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1cpCi0JCXJldHVybiAhKGNoX2luZm8tPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgJgotCQkJCQlJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGl3bF9sZWdhY3lfaXNfaHQ0MF90eF9hbGxvd2VkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKQotewotCWlmICghY3R4LT5odC5lbmFibGVkIHx8ICFjdHgtPmh0LmlzXzQwbWh6KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKgotCSAqIFdlIGRvIG5vdCBjaGVjayBmb3IgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDAKLQkgKiB0aGUgYml0IHdpbGwgbm90IHNldCBpZiBpdCBpcyBwdXJlIDQwTUh6IGNhc2UKLQkgKi8KLQlpZiAoaHRfY2FwICYmICFodF9jYXAtPmh0X3N1cHBvcnRlZCkKLQkJcmV0dXJuIGZhbHNlOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQlpZiAocHJpdi0+ZGlzYWJsZV9odDQwKQotCQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotCXJldHVybiBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfZXh0ZW5zaW9uKHByaXYsIHByaXYtPmJhbmQsCi0JCQlsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCksCi0JCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfaXNfaHQ0MF90eF9hbGxvd2VkKTsKLQotc3RhdGljIHUxNiBpd2xfbGVnYWN5X2FkanVzdF9iZWFjb25faW50ZXJ2YWwodTE2IGJlYWNvbl92YWwsIHUxNiBtYXhfYmVhY29uX3ZhbCkKLXsKLQl1MTYgbmV3X3ZhbDsKLQl1MTYgYmVhY29uX2ZhY3RvcjsKLQotCS8qCi0JICogSWYgbWFjODAyMTEgaGFzbid0IGdpdmVuIHVzIGEgYmVhY29uIGludGVydmFsLCBwcm9ncmFtCi0JICogdGhlIGRlZmF1bHQgaW50byB0aGUgZGV2aWNlLgotCSAqLwotCWlmICghYmVhY29uX3ZhbCkKLQkJcmV0dXJuIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMOwotCi0JLyoKLQkgKiBJZiB0aGUgYmVhY29uIGludGVydmFsIHdlIG9idGFpbmVkIGZyb20gdGhlIHBlZXIKLQkgKiBpcyB0b28gbGFyZ2UsIHdlJ2xsIGhhdmUgdG8gd2FrZSB1cCBtb3JlIG9mdGVuCi0JICogKGFuZCBpbiBJQlNTIGNhc2UsIHdlJ2xsIGJlYWNvbiB0b28gbXVjaCkKLQkgKgotCSAqIEZvciBleGFtcGxlLCBpZiBtYXhfYmVhY29uX3ZhbCBpcyA0MDk2LCBhbmQgdGhlCi0JICogcmVxdWVzdGVkIGJlYWNvbiBpbnRlcnZhbCBpcyA3MDAwLCB3ZSdsbCBoYXZlIHRvCi0JICogdXNlIDM1MDAgdG8gYmUgYWJsZSB0byB3YWtlIHVwIG9uIHRoZSBiZWFjb25zLgotCSAqCi0JICogVGhpcyBjb3VsZCBiYWRseSBpbmZsdWVuY2UgYmVhY29uIGRldGVjdGlvbiBzdGF0cy4KLQkgKi8KLQotCWJlYWNvbl9mYWN0b3IgPSAoYmVhY29uX3ZhbCArIG1heF9iZWFjb25fdmFsKSAvIG1heF9iZWFjb25fdmFsOwotCW5ld192YWwgPSBiZWFjb25fdmFsIC8gYmVhY29uX2ZhY3RvcjsKLQotCWlmICghbmV3X3ZhbCkKLQkJbmV3X3ZhbCA9IG1heF9iZWFjb25fdmFsOwotCi0JcmV0dXJuIG5ld192YWw7Ci19Ci0KLWludAotaXdsX2xlZ2FjeV9zZW5kX3J4b25fdGltaW5nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQl1NjQgdHNmOwotCXMzMiBpbnRlcnZhbF90bSwgcmVtOwotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7Ci0JdTE2IGJlYWNvbl9pbnQ7Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCi0JY29uZiA9IGl3bF9sZWdhY3lfaWVlZTgwMjExX2dldF9od19jb25mKHByaXYtPmh3KTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCW1lbXNldCgmY3R4LT50aW1pbmcsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3J4b25fdGltZV9jbWQpKTsKLQotCWN0eC0+dGltaW5nLnRpbWVzdGFtcCA9IGNwdV90b19sZTY0KHByaXYtPnRpbWVzdGFtcCk7Ci0JY3R4LT50aW1pbmcubGlzdGVuX2ludGVydmFsID0gY3B1X3RvX2xlMTYoY29uZi0+bGlzdGVuX2ludGVydmFsKTsKLQotCWJlYWNvbl9pbnQgPSB2aWYgPyB2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgOiAwOwotCi0JLyoKLQkgKiBUT0RPOiBGb3IgSUJTUyB3ZSBuZWVkIHRvIGdldCBhdGltX3dpbmRvdyBmcm9tIG1hYzgwMjExLAotCSAqCSBmb3Igbm93IGp1c3QgYWx3YXlzIHVzZSAwCi0JICovCi0JY3R4LT50aW1pbmcuYXRpbV93aW5kb3cgPSAwOwotCi0JYmVhY29uX2ludCA9IGl3bF9sZWdhY3lfYWRqdXN0X2JlYWNvbl9pbnRlcnZhbChiZWFjb25faW50LAotCQkJcHJpdi0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgKiBUSU1FX1VOSVQpOwotCWN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGJlYWNvbl9pbnQpOwotCi0JdHNmID0gcHJpdi0+dGltZXN0YW1wOyAvKiB0c2YgaXMgbW9kaWZlZCBieSBkb19kaXY6IGNvcHkgaXQgKi8KLQlpbnRlcnZhbF90bSA9IGJlYWNvbl9pbnQgKiBUSU1FX1VOSVQ7Ci0JcmVtID0gZG9fZGl2KHRzZiwgaW50ZXJ2YWxfdG0pOwotCWN0eC0+dGltaW5nLmJlYWNvbl9pbml0X3ZhbCA9IGNwdV90b19sZTMyKGludGVydmFsX3RtIC0gcmVtKTsKLQotCWN0eC0+dGltaW5nLmR0aW1fcGVyaW9kID0gdmlmID8gKHZpZi0+YnNzX2NvbmYuZHRpbV9wZXJpb2QgPzogMSkgOiAxOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsCi0JCQkiYmVhY29uIGludGVydmFsICVkIGJlYWNvbiB0aW1lciAlZCBiZWFjb24gdGltICVkXG4iLAotCQkJbGUxNl90b19jcHUoY3R4LT50aW1pbmcuYmVhY29uX2ludGVydmFsKSwKLQkJCWxlMzJfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbml0X3ZhbCksCi0JCQlsZTE2X3RvX2NwdShjdHgtPnRpbWluZy5hdGltX3dpbmRvdykpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIGN0eC0+cnhvbl90aW1pbmdfY21kLAotCQkJCXNpemVvZihjdHgtPnRpbWluZyksICZjdHgtPnRpbWluZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyk7Ci0KLXZvaWQKLWl3bF9sZWdhY3lfc2V0X3J4b25faHdjcnlwdG8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkJaW50IGh3X2RlY3J5cHQpCi17Ci0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24gPSAmY3R4LT5zdGFnaW5nOwotCi0JaWYgKGh3X2RlY3J5cHQpCi0JCXJ4b24tPmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLOwotCWVsc2UKLQkJcnhvbi0+ZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0RJU19ERUNSWVBUX01TSzsKLQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldF9yeG9uX2h3Y3J5cHRvKTsKLQotLyogdmFsaWRhdGUgUlhPTiBzdHJ1Y3R1cmUgaXMgdmFsaWQgKi8KLWludAotaXdsX2xlZ2FjeV9jaGVja19yeG9uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24gPSAmY3R4LT5zdGFnaW5nOwotCWJvb2wgZXJyb3IgPSBmYWxzZTsKLQotCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgewotCQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19UR0pfTkFSUk9XX0JBTkRfTVNLKSB7Ci0JCQlJV0xfV0FSTihwcml2LCAiY2hlY2sgMi40Rzogd3JvbmcgbmFycm93XG4iKTsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJfQotCQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19SQURBUl9ERVRFQ1RfTVNLKSB7Ci0JCQlJV0xfV0FSTihwcml2LCAiY2hlY2sgMi40Rzogd3JvbmcgcmFkYXJcbiIpOwotCQkJZXJyb3IgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCEocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSykpIHsKLQkJCUlXTF9XQVJOKHByaXYsICJjaGVjayA1LjJHOiBub3Qgc2hvcnQgc2xvdCFcbiIpOwotCQkJZXJyb3IgPSB0cnVlOwotCQl9Ci0JCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX0NDS19NU0spIHsKLQkJCUlXTF9XQVJOKHByaXYsICJjaGVjayA1LjJHOiBDQ0shXG4iKTsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJfQotCX0KLQlpZiAoKHJ4b24tPm5vZGVfYWRkclswXSB8IHJ4b24tPmJzc2lkX2FkZHJbMF0pICYgMHgxKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJtYWMvYnNzaWQgbWNhc3QhXG4iKTsKLQkJZXJyb3IgPSB0cnVlOwotCX0KLQotCS8qIG1ha2Ugc3VyZSBiYXNpYyByYXRlcyA2TWJwcyBhbmQgMU1icHMgYXJlIHN1cHBvcnRlZCAqLwotCWlmICgocnhvbi0+b2ZkbV9iYXNpY19yYXRlcyAmIElXTF9SQVRFXzZNX01BU0spID09IDAgJiYKLQkgICAgKHJ4b24tPmNja19iYXNpY19yYXRlcyAmIElXTF9SQVRFXzFNX01BU0spID09IDApIHsKLQkJSVdMX1dBUk4ocHJpdiwgIm5laXRoZXIgMSBub3IgNiBhcmUgYmFzaWNcbiIpOwotCQllcnJvciA9IHRydWU7Ci0JfQotCi0JaWYgKGxlMTZfdG9fY3B1KHJ4b24tPmFzc29jX2lkKSA+IDIwMDcpIHsKLQkJSVdMX1dBUk4ocHJpdiwgImFpZCA+IDIwMDdcbiIpOwotCQllcnJvciA9IHRydWU7Ci0JfQotCi0JaWYgKChyeG9uLT5mbGFncyAmIChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0spKQotCQkJPT0gKFJYT05fRkxHX0NDS19NU0sgfCBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSykpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIkNDSyBhbmQgc2hvcnQgc2xvdFxuIik7Ci0JCWVycm9yID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoKHJ4b24tPmZsYWdzICYgKFJYT05fRkxHX0NDS19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0spKQotCQkJPT0gKFJYT05fRkxHX0NDS19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0spKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJDQ0sgYW5kIGF1dG8gZGV0ZWN0Iik7Ci0JCWVycm9yID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoKHJ4b24tPmZsYWdzICYgKFJYT05fRkxHX0FVVE9fREVURUNUX01TSyB8Ci0JCQkgICAgUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLKSkgPT0KLQkJCSAgICBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0spIHsKLQkJSVdMX1dBUk4ocHJpdiwgIlRHZyBidXQgbm8gYXV0by1kZXRlY3RcbiIpOwotCQllcnJvciA9IHRydWU7Ci0JfQotCi0JaWYgKGVycm9yKQotCQlJV0xfV0FSTihwcml2LCAiVHVuaW5nIHRvIGNoYW5uZWwgJWRcbiIsCi0JCQkgICAgbGUxNl90b19jcHUocnhvbi0+Y2hhbm5lbCkpOwotCi0JaWYgKGVycm9yKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgUlhPTlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9jaGVja19yeG9uX2NtZCk7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9mdWxsX3J4b25fcmVxdWlyZWQgLSBjaGVjayBpZiBmdWxsIFJYT04gKHZzIFJYT05fQVNTT0MpIGNtZCBpcyBuZWVkZWQKLSAqIEBwcml2OiBzdGFnaW5nX3J4b24gaXMgY29tcGFyZWQgdG8gYWN0aXZlX3J4b24KLSAqCi0gKiBJZiB0aGUgUlhPTiBzdHJ1Y3R1cmUgaXMgY2hhbmdpbmcgZW5vdWdoIHRvIHJlcXVpcmUgYSBuZXcgdHVuZSwKLSAqIG9yIGlzIGNsZWFyaW5nIHRoZSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0ssIHRoZW4gcmV0dXJuIDEgdG8gaW5kaWNhdGUgdGhhdAotICogYSBuZXcgdHVuZSAoZnVsbCBSWE9OIGNvbW1hbmQsIHJhdGhlciB0aGFuIFJYT05fQVNTT0MgY21kKSBpcyByZXF1aXJlZC4KLSAqLwotaW50IGl3bF9sZWdhY3lfZnVsbF9yeG9uX3JlcXVpcmVkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnN0YWdpbmcgPSAmY3R4LT5zdGFnaW5nOwotCWNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICphY3RpdmUgPSAmY3R4LT5hY3RpdmU7Ci0KLSNkZWZpbmUgQ0hLKGNvbmQpCQkJCQkJCVwKLQlpZiAoKGNvbmQpKSB7CQkJCQkJCVwKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIm5lZWQgZnVsbCBSWE9OIC0gIiAjY29uZCAiXG4iKTsJXAotCQlyZXR1cm4gMTsJCQkJCQlcCi0JfQotCi0jZGVmaW5lIENIS19ORVEoYzEsIGMyKQkJCQkJCVwKLQlpZiAoKGMxKSAhPSAoYzIpKSB7CQkJCQlcCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJuZWVkIGZ1bGwgUlhPTiAtICIJXAotCQkJICAgICAgICNjMSAiICE9ICIgI2MyICIgLSAlZCAhPSAlZFxuIiwJXAotCQkJICAgICAgIChjMSksIChjMikpOwkJCVwKLQkJcmV0dXJuIDE7CQkJCQlcCi0JfQotCi0JLyogVGhlc2UgaXRlbXMgYXJlIG9ubHkgc2V0dGFibGUgZnJvbSB0aGUgZnVsbCBSWE9OIGNvbW1hbmQgKi8KLQlDSEsoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSk7Ci0JQ0hLKGNvbXBhcmVfZXRoZXJfYWRkcihzdGFnaW5nLT5ic3NpZF9hZGRyLCBhY3RpdmUtPmJzc2lkX2FkZHIpKTsKLQlDSEsoY29tcGFyZV9ldGhlcl9hZGRyKHN0YWdpbmctPm5vZGVfYWRkciwgYWN0aXZlLT5ub2RlX2FkZHIpKTsKLQlDSEsoY29tcGFyZV9ldGhlcl9hZGRyKHN0YWdpbmctPndsYXBfYnNzaWRfYWRkciwKLQkJCQlhY3RpdmUtPndsYXBfYnNzaWRfYWRkcikpOwotCUNIS19ORVEoc3RhZ2luZy0+ZGV2X3R5cGUsIGFjdGl2ZS0+ZGV2X3R5cGUpOwotCUNIS19ORVEoc3RhZ2luZy0+Y2hhbm5lbCwgYWN0aXZlLT5jaGFubmVsKTsKLQlDSEtfTkVRKHN0YWdpbmctPmFpcl9wcm9wYWdhdGlvbiwgYWN0aXZlLT5haXJfcHJvcGFnYXRpb24pOwotCUNIS19ORVEoc3RhZ2luZy0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzLAotCQlhY3RpdmUtPm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyk7Ci0JQ0hLX05FUShzdGFnaW5nLT5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzLAotCQlhY3RpdmUtPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMpOwotCUNIS19ORVEoc3RhZ2luZy0+YXNzb2NfaWQsIGFjdGl2ZS0+YXNzb2NfaWQpOwotCi0JLyogZmxhZ3MsIGZpbHRlcl9mbGFncywgb2ZkbV9iYXNpY19yYXRlcywgYW5kIGNja19iYXNpY19yYXRlcyBjYW4KLQkgKiBiZSB1cGRhdGVkIHdpdGggdGhlIFJYT05fQVNTT0MgY29tbWFuZCAtLSBob3dldmVyIG9ubHkgc29tZQotCSAqIGZsYWcgdHJhbnNpdGlvbnMgYXJlIGFsbG93ZWQgdXNpbmcgUlhPTl9BU1NPQyAqLwotCi0JLyogQ2hlY2sgaWYgd2UgYXJlIG5vdCBzd2l0Y2hpbmcgYmFuZHMgKi8KLQlDSEtfTkVRKHN0YWdpbmctPmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLLAotCQlhY3RpdmUtPmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKTsKLQotCS8qIENoZWNrIGlmIHdlIGFyZSBzd2l0Y2hpbmcgYXNzb2NpYXRpb24gdG9nZ2xlICovCi0JQ0hLX05FUShzdGFnaW5nLT5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0ssCi0JCWFjdGl2ZS0+ZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLKTsKLQotI3VuZGVmIENISwotI3VuZGVmIENIS19ORVEKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZCk7Ci0KLXU4IGl3bF9sZWdhY3lfZ2V0X2xvd2VzdF9wbGNwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCS8qCi0JICogQXNzaWduIHRoZSBsb3dlc3QgcmF0ZSAtLSBzaG91bGQgcmVhbGx5IGdldCB0aGlzIGZyb20KLQkgKiB0aGUgYmVhY29uIHNrYiBmcm9tIG1hYzgwMjExLgotCSAqLwotCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spCi0JCXJldHVybiBJV0xfUkFURV8xTV9QTENQOwotCWVsc2UKLQkJcmV0dXJuIElXTF9SQVRFXzZNX1BMQ1A7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZ2V0X2xvd2VzdF9wbGNwKTsKLQotc3RhdGljIHZvaWQgX2l3bF9sZWdhY3lfc2V0X3J4b25faHQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiwKLQkJCSAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqcnhvbiA9ICZjdHgtPnN0YWdpbmc7Ci0KLQlpZiAoIWN0eC0+aHQuZW5hYmxlZCkgewotCQlyeG9uLT5mbGFncyAmPSB+KFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NU0sgfAotCQkJUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0sgfAotCQkJUlhPTl9GTEdfSFQ0MF9QUk9UX01TSyB8Ci0JCQlSWE9OX0ZMR19IVF9QUk9UX01TSyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlyeG9uLT5mbGFncyB8PSBjcHVfdG9fbGUzMihjdHgtPmh0LnByb3RlY3Rpb24gPDwKLQkJCQkJUlhPTl9GTEdfSFRfT1BFUkFUSU5HX01PREVfUE9TKTsKLQotCS8qIFNldCB1cCBjaGFubmVsIGJhbmR3aWR0aDoKLQkgKiAyMCBNSHogb25seSwgMjAvNDAgbWl4ZWQgb3IgcHVyZSA0MCBpZiBodDQwIG9rICovCi0JLyogY2xlYXIgdGhlIEhUIGNoYW5uZWwgbW9kZSBiZWZvcmUgc2V0IHRoZSBtb2RlICovCi0Jcnhvbi0+ZmxhZ3MgJj0gfihSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLIHwKLQkJCSBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSyk7Ci0JaWYgKGl3bF9sZWdhY3lfaXNfaHQ0MF90eF9hbGxvd2VkKHByaXYsIGN0eCwgTlVMTCkpIHsKLQkJLyogcHVyZSBodDQwICovCi0JCWlmIChjdHgtPmh0LnByb3RlY3Rpb24gPT0KLQkJCQlJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OXzIwTUhaKSB7Ci0JCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DSEFOTkVMX01PREVfUFVSRV80MDsKLQkJCS8qIE5vdGU6IGNvbnRyb2wgY2hhbm5lbCBpcyBvcHBvc2l0ZSBvZiBleHRlbnNpb24gY2hhbm5lbCAqLwotCQkJc3dpdGNoIChjdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCkgewotCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKLQkJCQlyeG9uLT5mbGFncyAmPQotCQkJCQl+UlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0s7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgotCQkJCXJ4b24tPmZsYWdzIHw9Ci0JCQkJCVJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogTm90ZTogY29udHJvbCBjaGFubmVsIGlzIG9wcG9zaXRlIG9mIGV4dGVuc2lvbiBjaGFubmVsICovCi0JCQlzd2l0Y2ggKGN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0KSB7Ci0JCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgotCQkJCXJ4b24tPmZsYWdzICY9Ci0JCQkJCX4oUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0spOwotCQkJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c6Ci0JCQkJcnhvbi0+ZmxhZ3MgfD0KLQkJCQkJUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0s7Ci0JCQkJcnhvbi0+ZmxhZ3MgfD0gUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01JWEVEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOgotCQkJZGVmYXVsdDoKLQkJCQkvKiBjaGFubmVsIGxvY2F0aW9uIG9ubHkgdmFsaWQgaWYgaW4gTWl4ZWQgbW9kZSAqLwotCQkJCUlXTF9FUlIocHJpdiwKLQkJCQkJImludmFsaWQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0XG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9MRUdBQ1k7Ci0JfQotCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7Ci0KLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgInJ4b24gZmxhZ3MgMHglWCBvcGVyYXRpb24gbW9kZSA6MHglWCAiCi0JCQkiZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IDB4JXhcbiIsCi0JCQlsZTMyX3RvX2NwdShyeG9uLT5mbGFncyksIGN0eC0+aHQucHJvdGVjdGlvbiwKLQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0KTsKLX0KLQotdm9pZCBpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9odF9jb25maWcgKmh0X2NvbmYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KQotCQlfaXdsX2xlZ2FjeV9zZXRfcnhvbl9odChwcml2LCBodF9jb25mLCBjdHgpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldF9yeG9uX2h0KTsKLQotLyogUmV0dXJuIHZhbGlkLCB1bnVzZWQsIGNoYW5uZWwgZm9yIGEgcGFzc2l2ZSBzY2FuIHRvIHJlc2V0IHRoZSBSRiAqLwotdTggaXdsX2xlZ2FjeV9nZXRfc2luZ2xlX2NoYW5uZWxfbnVtYmVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQotewotCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCWludCBpOwotCXU4IGNoYW5uZWwgPSAwOwotCXU4IG1pbiwgbWF4OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7Ci0JCW1pbiA9IDE0OwotCQltYXggPSBwcml2LT5jaGFubmVsX2NvdW50OwotCX0gZWxzZSB7Ci0JCW1pbiA9IDA7Ci0JCW1heCA9IDE0OwotCX0KLQotCWZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKSB7Ci0JCWJvb2wgYnVzeSA9IGZhbHNlOwotCi0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCQlidXN5ID0gcHJpdi0+Y2hhbm5lbF9pbmZvW2ldLmNoYW5uZWwgPT0KLQkJCQlsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCk7Ci0JCQlpZiAoYnVzeSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChidXN5KQotCQkJY29udGludWU7Ci0KLQkJY2hhbm5lbCA9IHByaXYtPmNoYW5uZWxfaW5mb1tpXS5jaGFubmVsOwotCQljaF9pbmZvID0gaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGJhbmQsIGNoYW5uZWwpOwotCQlpZiAoaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGNoYW5uZWw7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZ2V0X3NpbmdsZV9jaGFubmVsX251bWJlcik7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9zZXRfcnhvbl9jaGFubmVsIC0gU2V0IHRoZSBiYW5kIGFuZCBjaGFubmVsIHZhbHVlcyBpbiBzdGFnaW5nIFJYT04KLSAqIEBjaDogcmVxdWVzdGVkIGNoYW5uZWwgYXMgYSBwb2ludGVyIHRvIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAotCi0gKiBOT1RFOiAgRG9lcyBub3QgY29tbWl0IHRvIHRoZSBoYXJkd2FyZTsgaXQgc2V0cyBhcHByb3ByaWF0ZSBiaXQgZmllbGRzCi0gKiBpbiB0aGUgc3RhZ2luZyBSWE9OIGZsYWcgc3RydWN0dXJlIGJhc2VkIG9uIHRoZSBjaC0+YmFuZAotICovCi1pbnQKLWl3bF9sZWdhY3lfc2V0X3J4b25fY2hhbm5lbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2gsCi0JCQkgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSBjaC0+YmFuZDsKLQl1MTYgY2hhbm5lbCA9IGNoLT5od192YWx1ZTsKLQotCWlmICgobGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpID09IGNoYW5uZWwpICYmCi0JICAgIChwcml2LT5iYW5kID09IGJhbmQpKQotCQlyZXR1cm4gMDsKLQotCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7Ci0JaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19CQU5EXzI0R19NU0s7Ci0JZWxzZQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfQkFORF8yNEdfTVNLOwotCi0JcHJpdi0+YmFuZCA9IGJhbmQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU3RhZ2luZyBjaGFubmVsIHNldCB0byAlZCBbJWRdXG4iLCBjaGFubmVsLCBiYW5kKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldF9yeG9uX2NoYW5uZWwpOwotCi12b2lkIGl3bF9sZWdhY3lfc2V0X2ZsYWdzX2Zvcl9iYW5kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKLQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCSAgICB+KFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSwotCQkgICAgICB8IFJYT05fRkxHX0NDS19NU0spOwotCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JfSBlbHNlIHsKLQkJLyogQ29waWVkIGZyb20gaXdsX3Bvc3RfYXNzb2NpYXRlKCkgKi8KLQkJaWYgKHZpZiAmJiB2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwotCQllbHNlCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwotCi0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19CQU5EXzI0R19NU0s7Ci0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0s7Ci0JCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfQ0NLX01TSzsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2V0X2ZsYWdzX2Zvcl9iYW5kKTsKLQotLyoKLSAqIGluaXRpYWxpemUgcnhvbiBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcyBmcm9tIGVlcHJvbQotICovCi12b2lkIGl3bF9sZWdhY3lfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQotCW1lbXNldCgmY3R4LT5zdGFnaW5nLCAwLCBzaXplb2YoY3R4LT5zdGFnaW5nKSk7Ci0KLQlpZiAoIWN0eC0+dmlmKSB7Ci0JCWN0eC0+c3RhZ2luZy5kZXZfdHlwZSA9IGN0eC0+dW51c2VkX2RldnR5cGU7Ci0JfSBlbHNlCi0Jc3dpdGNoIChjdHgtPnZpZi0+dHlwZSkgewotCi0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQljdHgtPnN0YWdpbmcuZGV2X3R5cGUgPSBjdHgtPnN0YXRpb25fZGV2dHlwZTsKLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyA9IFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLOwotCQlicmVhazsKLQotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCWN0eC0+c3RhZ2luZy5kZXZfdHlwZSA9IGN0eC0+aWJzc19kZXZ0eXBlOwotCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgPSBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyB8Ci0JCQkJCQkgIFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIlVuc3VwcG9ydGVkIGludGVyZmFjZSB0eXBlICVkXG4iLAotCQkJY3R4LT52aWYtPnR5cGUpOwotCQlicmVhazsKLQl9Ci0KLSNpZiAwCi0JLyogVE9ETzogIEZpZ3VyZSBvdXQgd2hlbiBzaG9ydF9wcmVhbWJsZSB3b3VsZCBiZSBzZXQgYW5kIGNhY2hlIGZyb20KLQkgKiB0aGF0ICovCi0JaWYgKCFod190b19sb2NhbChwcml2LT5odyktPnNob3J0X3ByZWFtYmxlKQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQllbHNlCi0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0jZW5kaWYKLQotCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgcHJpdi0+YmFuZCwKLQkJCQkgICAgICAgbGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCkpOwotCi0JaWYgKCFjaF9pbmZvKQotCQljaF9pbmZvID0gJnByaXYtPmNoYW5uZWxfaW5mb1swXTsKLQotCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hfaW5mby0+Y2hhbm5lbCk7Ci0JcHJpdi0+YmFuZCA9IGNoX2luZm8tPmJhbmQ7Ci0KLQlpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIHByaXYtPmJhbmQsIGN0eC0+dmlmKTsKLQotCWN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KLQkgICAgKElXTF9PRkRNX1JBVEVTX01BU0sgPj4gSVdMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOwotCWN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXMgPQotCSAgICAoSVdMX0NDS19SQVRFU19NQVNLID4+IElXTF9GSVJTVF9DQ0tfUkFURSkgJiAweEY7Ci0KLQkvKiBjbGVhciBib3RoIE1JWCBhbmQgUFVSRTQwIG1vZGUgZmxhZyAqLwotCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+KFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRCB8Ci0JCQkJCVJYT05fRkxHX0NIQU5ORUxfTU9ERV9QVVJFXzQwKTsKLQlpZiAoY3R4LT52aWYpCi0JCW1lbWNweShjdHgtPnN0YWdpbmcubm9kZV9hZGRyLCBjdHgtPnZpZi0+YWRkciwgRVRIX0FMRU4pOwotCi0JY3R4LT5zdGFnaW5nLm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyA9IDB4ZmY7Ci0JY3R4LT5zdGFnaW5nLm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPSAweGZmOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcpOwotCi12b2lkIGl3bF9sZWdhY3lfc2V0X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmh3ID0gTlVMTDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGU7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQlpbnQgaTsKLQotCWh3ID0gaXdsX2dldF9od19tb2RlKHByaXYsIHByaXYtPmJhbmQpOwotCWlmICghaHcpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHNldCByYXRlOiB1bmFibGUgdG8gZ2V0IGh3IG1vZGVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpdi0+YWN0aXZlX3JhdGUgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGh3LT5uX2JpdHJhdGVzOyBpKyspIHsKLQkJcmF0ZSA9ICYoaHctPmJpdHJhdGVzW2ldKTsKLQkJaWYgKHJhdGUtPmh3X3ZhbHVlIDwgSVdMX1JBVEVfQ09VTlRfTEVHQUNZKQotCQkJcHJpdi0+YWN0aXZlX3JhdGUgfD0gKDEgPDwgcmF0ZS0+aHdfdmFsdWUpOwotCX0KLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJTZXQgYWN0aXZlX3JhdGUgPSAlMHhcbiIsIHByaXYtPmFjdGl2ZV9yYXRlKTsKLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCWN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXMgPQotCQkgICAgKElXTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyA+PiBJV0xfRklSU1RfQ0NLX1JBVEUpICYgMHhGOwotCi0JCWN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KLQkJICAgKElXTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgPj4gSVdMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXRfcmF0ZSk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBpc19zdWNjZXNzKQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZShjdHgtPnZpZiwgaXNfc3VjY2Vzcyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZSk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9yeF9jc2Eoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX2NzYV9ub3RpZmljYXRpb24gKmNzYSA9ICYocGt0LT51LmNzYV9ub3RpZik7Ci0KLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpyeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7Ci0KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFsZTMyX3RvX2NwdShjc2EtPnN0YXR1cykgJiYgY3NhLT5jaGFubmVsID09IHByaXYtPnN3aXRjaF9jaGFubmVsKSB7Ci0JCXJ4b24tPmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7Ci0JCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3NhLT5jaGFubmVsOwotCQlJV0xfREVCVUdfMTFIKHByaXYsICJDU0Egbm90aWY6IGNoYW5uZWwgJWRcbiIsCi0JCQkgICAgICBsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKLQkJaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHByaXYsIHRydWUpOwotCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNTQSBub3RpZiAoZmFpbCkgOiBjaGFubmVsICVkXG4iLAotCQkJbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCBmYWxzZSk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X2NzYSk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXZvaWQgaXdsX2xlZ2FjeV9wcmludF9yeF9jb25maWdfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqcnhvbiA9ICZjdHgtPnN0YWdpbmc7Ci0KLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgIlJYIENPTkZJRzpcbiIpOwotCWl3bF9wcmludF9oZXhfZHVtcChwcml2LCBJV0xfRExfUkFESU8sICh1OCAqKSByeG9uLCBzaXplb2YoKnJ4b24pKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInUxNiBjaGFubmVsOiAweCV4XG4iLAotCQkJCWxlMTZfdG9fY3B1KHJ4b24tPmNoYW5uZWwpKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInUzMiBmbGFnczogMHglMDhYXG4iLCBsZTMyX3RvX2NwdShyeG9uLT5mbGFncykpOwotCUlXTF9ERUJVR19SQURJTyhwcml2LCAidTMyIGZpbHRlcl9mbGFnczogMHglMDh4XG4iLAotCQkJCWxlMzJfdG9fY3B1KHJ4b24tPmZpbHRlcl9mbGFncykpOwotCUlXTF9ERUJVR19SQURJTyhwcml2LCAidTggZGV2X3R5cGU6IDB4JXhcbiIsIHJ4b24tPmRldl90eXBlKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInU4IG9mZG1fYmFzaWNfcmF0ZXM6IDB4JTAyeFxuIiwKLQkJCXJ4b24tPm9mZG1fYmFzaWNfcmF0ZXMpOwotCUlXTF9ERUJVR19SQURJTyhwcml2LCAidTggY2NrX2Jhc2ljX3JhdGVzOiAweCUwMnhcbiIsCi0JCQkJcnhvbi0+Y2NrX2Jhc2ljX3JhdGVzKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInU4WzZdIG5vZGVfYWRkcjogJXBNXG4iLCByeG9uLT5ub2RlX2FkZHIpOwotCUlXTF9ERUJVR19SQURJTyhwcml2LCAidThbNl0gYnNzaWRfYWRkcjogJXBNXG4iLCByeG9uLT5ic3NpZF9hZGRyKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInUxNiBhc3NvY19pZDogMHgleFxuIiwKLQkJCQlsZTE2X3RvX2NwdShyeG9uLT5hc3NvY19pZCkpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQpOwotI2VuZGlmCi0vKioKLSAqIGl3bF9sZWdhY3lfaXJxX2hhbmRsZV9lcnJvciAtIGNhbGxlZCBmb3IgSFcgb3IgU1cgZXJyb3IgaW50ZXJydXB0IGZyb20gY2FyZAotICovCi12b2lkIGl3bF9sZWdhY3lfaXJxX2hhbmRsZV9lcnJvcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogU2V0IHRoZSBGVyBlcnJvciBmbGFnIC0tIGNsZWFyZWQgb24gaXdsX2Rvd24gKi8KLQlzZXRfYml0KFNUQVRVU19GV19FUlJPUiwgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBDYW5jZWwgY3VycmVudGx5IHF1ZXVlZCBjb21tYW5kLiAqLwotCWNsZWFyX2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpOwotCi0JSVdMX0VSUihwcml2LCAiTG9hZGVkIGZpcm13YXJlIHZlcnNpb246ICVzXG4iLAotCQlwcml2LT5ody0+d2lwaHktPmZ3X3ZlcnNpb24pOwotCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9uaWNfZXJyb3JfbG9nKHByaXYpOwotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKQotCQlwcml2LT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKHByaXYsIE5VTEwsIGZhbHNlKTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBJV0xfRExfRldfRVJST1JTKQotCQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwKLQkJCQkJJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKLSNlbmRpZgotCi0Jd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQotCS8qIEtlZXAgdGhlIHJlc3RhcnQgcHJvY2VzcyBmcm9tIHRyeWluZyB0byBzZW5kIGhvc3QKLQkgKiBjb21tYW5kcyBieSBjbGVhcmluZyB0aGUgSU5JVCBzdGF0dXMgYml0ICovCi0JY2xlYXJfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cyk7Ci0KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVRyhwcml2LCBJV0xfRExfRldfRVJST1JTLAotCQkJICAiUmVzdGFydGluZyBhZGFwdGVyIGR1ZSB0byB1Q29kZSBlcnJvci5cbiIpOwotCi0JCWlmIChwcml2LT5jZmctPm1vZF9wYXJhbXMtPnJlc3RhcnRfZncpCi0JCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9pcnFfaGFuZGxlX2Vycm9yKTsKLQotc3RhdGljIGludCBpd2xfbGVnYWN5X2FwbV9zdG9wX21hc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBzdG9wIGRldmljZSdzIGJ1c21hc3RlciBETUEgYWN0aXZpdHkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfU1RPUF9NQVNURVIpOwotCi0JcmV0ID0gaXdsX3BvbGxfYml0KHByaXYsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX01BU1RFUl9ESVNBQkxFRCwKLQkJCUNTUl9SRVNFVF9SRUdfRkxBR19NQVNURVJfRElTQUJMRUQsIDEwMCk7Ci0JaWYgKHJldCkKLQkJSVdMX1dBUk4ocHJpdiwgIk1hc3RlciBEaXNhYmxlIFRpbWVkIE91dCwgMTAwIHVzZWNcbiIpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInN0b3AgbWFzdGVyXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9hcG1fc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlN0b3AgY2FyZCwgcHV0IGluIGxvdyBwb3dlciBzdGF0ZVxuIik7Ci0KLQkvKiBTdG9wIGRldmljZSdzIERNQSBhY3Rpdml0eSAqLwotCWl3bF9sZWdhY3lfYXBtX3N0b3BfbWFzdGVyKHByaXYpOwotCi0JLyogUmVzZXQgdGhlIGVudGlyZSBkZXZpY2UgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfU1dfUkVTRVQpOwotCi0JdWRlbGF5KDEwKTsKLQotCS8qCi0JICogQ2xlYXIgImluaXRpYWxpemF0aW9uIGNvbXBsZXRlIiBiaXQgdG8gbW92ZSBhZGFwdGVyIGZyb20KLQkgKiBEMEEqIChwb3dlcmVkLXVwIEFjdGl2ZSkgLS0+IEQwVSogKFVuaW5pdGlhbGl6ZWQpIHN0YXRlLgotCSAqLwotCWl3bF9sZWdhY3lfY2xlYXJfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKLQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSU5JVF9ET05FKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9hcG1fc3RvcCk7Ci0KLQotLyoKLSAqIFN0YXJ0IHVwIE5JQydzIGJhc2ljIGZ1bmN0aW9uYWxpdHkgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVzZXQKLSAqIChlLmcuIGFmdGVyIHBsYXRmb3JtIGJvb3QsIG9yIHNodXRkb3duIHZpYSBpd2xfbGVnYWN5X2FwbV9zdG9wKCkpCi0gKiBOT1RFOiAgVGhpcyBkb2VzIG5vdCBsb2FkIHVDb2RlIG5vciBzdGFydCB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yCi0gKi8KLWludCBpd2xfbGVnYWN5X2FwbV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gMDsKLQl1MTYgbGN0bDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0IGNhcmQncyBiYXNpYyBmdW5jdGlvbnNcbiIpOwotCi0JLyoKLQkgKiBVc2UgInNldF9iaXQiIGJlbG93IHJhdGhlciB0aGFuICJ3cml0ZSIsIHRvIHByZXNlcnZlIGFueSBoYXJkd2FyZQotCSAqIGJpdHMgYWxyZWFkeSBzZXQgYnkgZGVmYXVsdCBhZnRlciByZXNldC4KLQkgKi8KLQotCS8qIERpc2FibGUgTDBTIGV4aXQgdGltZXIgKHBsYXRmb3JtIE5NSSBXb3JrL0Fyb3VuZCkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0dJT19DSElDS0VOX0JJVFMsCi0JCQkgIENTUl9HSU9fQ0hJQ0tFTl9CSVRTX1JFR19CSVRfRElTX0wwU19FWElUX1RJTUVSKTsKLQotCS8qCi0JICogRGlzYWJsZSBMMHMgd2l0aG91dCBhZmZlY3RpbmcgTDE7Ci0JICogIGRvbid0IHdhaXQgZm9yIElDSCBMMHMgKElDSCBidWcgVy9BKQotCSAqLwotCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfR0lPX0NISUNLRU5fQklUUywKLQkJCSAgQ1NSX0dJT19DSElDS0VOX0JJVFNfUkVHX0JJVF9MMUFfTk9fTDBTX1JYKTsKLQotCS8qIFNldCBGSCB3YWl0IHRocmVzaG9sZCB0byBtYXhpbXVtIChIVyBlcnJvciBkdXJpbmcgc3RyZXNzIFcvQSkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0RCR19IUEVUX01FTV9SRUcsCi0JCQkJCUNTUl9EQkdfSFBFVF9NRU1fUkVHX1ZBTCk7Ci0KLQkvKgotCSAqIEVuYWJsZSBIQVAgSU5UQSAoaW50ZXJydXB0IGZyb20gbWFuYWdlbWVudCBidXMpIHRvCi0JICogd2FrZSBkZXZpY2UncyBQQ0kgRXhwcmVzcyBsaW5rIEwxYSAtPiBMMHMKLQkgKiBOT1RFOiAgVGhpcyBpcyBuby1vcCBmb3IgMzk0NSAobm9uLWV4aXN0ZW50IGJpdCkKLQkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9IQVBfV0FLRV9MMUEpOwotCi0JLyoKLQkgKiBIVyBidWcgVy9BIGZvciBpbnN0YWJpbGl0eSBpbiBQQ0llIGJ1cyBMMC0+TDBTLT5MMSB0cmFuc2l0aW9uLgotCSAqIENoZWNrIGlmIEJJT1MgKG9yIE9TKSBlbmFibGVkIEwxLUFTUE0gb24gdGhpcyBkZXZpY2UuCi0JICogSWYgc28gKGxpa2VseSksIGRpc2FibGUgTDBTLCBzbyBkZXZpY2UgbW92ZXMgZGlyZWN0bHkgTDAtPkwxOwotCSAqICAgIGNvc3RzIG5lZ2xpZ2libGUgYW1vdW50IG9mIHBvd2VyIHNhdmluZ3MuCi0JICogSWYgbm90ICh1bmxpa2VseSksIGVuYWJsZSBMMFMsIHNvIHRoZXJlIGlzIGF0IGxlYXN0IHNvbWUKLQkgKiAgICBwb3dlciBzYXZpbmdzLCBldmVuIHdpdGhvdXQgTDEuCi0JICovCi0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnNldF9sMHMpIHsKLQkJbGN0bCA9IGl3bF9sZWdhY3lfcGNpZV9saW5rX2N0bChwcml2KTsKLQkJaWYgKChsY3RsICYgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wxX0VOKSA9PQotCQkJCQlQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4pIHsKLQkJCS8qIEwxLUFTUE0gZW5hYmxlZDsgZGlzYWJsZSghKSBMMFMgICovCi0JCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0dJT19SRUcsCi0JCQkJCUNTUl9HSU9fUkVHX1ZBTF9MMFNfRU5BQkxFRCk7Ci0JCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkwxIEVuYWJsZWQ7IERpc2FibGluZyBMMFNcbiIpOwotCQl9IGVsc2UgewotCQkJLyogTDEtQVNQTSBkaXNhYmxlZDsgZW5hYmxlKCEpIEwwUyAqLwotCQkJaXdsX2xlZ2FjeV9jbGVhcl9iaXQocHJpdiwgQ1NSX0dJT19SRUcsCi0JCQkJCUNTUl9HSU9fUkVHX1ZBTF9MMFNfRU5BQkxFRCk7Ci0JCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkwxIERpc2FibGVkOyBFbmFibGluZyBMMFNcbiIpOwotCQl9Ci0JfQotCi0JLyogQ29uZmlndXJlIGFuYWxvZyBwaGFzZS1sb2NrLWxvb3AgYmVmb3JlIGFjdGl2YXRpbmcgdG8gRDBBICovCi0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKQotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0FOQV9QTExfQ0ZHLAotCQkJICAgIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKTsKLQotCS8qCi0JICogU2V0ICJpbml0aWFsaXphdGlvbiBjb21wbGV0ZSIgYml0IHRvIG1vdmUgYWRhcHRlciBmcm9tCi0JICogRDBVKiAtLT4gRDBBKiAocG93ZXJlZC11cCBhY3RpdmUpIHN0YXRlLgotCSAqLwotCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfR1BfQ05UUkwsIENTUl9HUF9DTlRSTF9SRUdfRkxBR19JTklUX0RPTkUpOwotCi0JLyoKLQkgKiBXYWl0IGZvciBjbG9jayBzdGFiaWxpemF0aW9uOyBvbmNlIHN0YWJpbGl6ZWQsIGFjY2VzcyB0bwotCSAqIGRldmljZS1pbnRlcm5hbCByZXNvdXJjZXMgaXMgc3VwcG9ydGVkLCBlLmcuIGl3bF9sZWdhY3lfd3JpdGVfcHJwaCgpCi0JICogYW5kIGFjY2Vzc2VzIHRvIHVDb2RlIFNSQU0uCi0JICovCi0JcmV0ID0gaXdsX3BvbGxfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKLQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQ0xPQ0tfUkVBRFksCi0JCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZLCAyNTAwMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkZhaWxlZCB0byBpbml0IHRoZSBjYXJkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBFbmFibGUgRE1BIGFuZCBCU00gKGlmIHVzZWQpIGNsb2Nrcywgd2FpdCBmb3IgdGhlbSB0byBzdGFiaWxpemUuCi0JICogQlNNIChCb29zdHJhcCBTdGF0ZSBNYWNoaW5lKSBpcyBvbmx5IGluIDM5NDUgYW5kIDQ5NjUuCi0JICoKLQkgKiBXcml0ZSB0byAiQ0xLX0VOX1JFRyI7ICIxIiBiaXRzIGVuYWJsZSBjbG9ja3MsIHdoaWxlICIwIiBiaXRzCi0JICogZG8gbm90IGRpc2FibGUgY2xvY2tzLiAgVGhpcyBwcmVzZXJ2ZXMgYW55IGhhcmR3YXJlIGJpdHMgYWxyZWFkeQotCSAqIHNldCBieSBkZWZhdWx0IGluICJDTEtfQ1RSTF9SRUciIGFmdGVyIHJlc2V0LgotCSAqLwotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT51c2VfYnNtKQotCQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQVBNR19DTEtfRU5fUkVHLAotCQkJQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUIHwgQVBNR19DTEtfVkFMX0JTTV9DTEtfUlFUKTsKLQllbHNlCi0JCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBUE1HX0NMS19FTl9SRUcsCi0JCQlBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOwotCXVkZWxheSgyMCk7Ci0KLQkvKiBEaXNhYmxlIEwxLUFjdGl2ZSAqLwotCWl3bF9sZWdhY3lfc2V0X2JpdHNfcHJwaChwcml2LCBBUE1HX1BDSURFVl9TVFRfUkVHLAotCQkJICBBUE1HX1BDSURFVl9TVFRfVkFMX0wxX0FDVF9ESVMpOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9hcG1faW5pdCk7Ci0KLQotaW50IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgczggdHhfcG93ZXIsIGJvb2wgZm9yY2UpCi17Ci0JaW50IHJldDsKLQlzOCBwcmV2X3R4X3Bvd2VyOwotCWJvb2wgZGVmZXI7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCWlmIChwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9PSB0eF9wb3dlciAmJiAhZm9yY2UpCi0JCXJldHVybiAwOwotCi0JaWYgKCFwcml2LT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkvKiAwIGRCbSBtZWFuIDEgbWlsbGl3YXR0ICovCi0JaWYgKHR4X3Bvd2VyIDwgMCkgewotCQlJV0xfV0FSTihwcml2LAotCQkJICJSZXF1ZXN0ZWQgdXNlciBUWFBPV0VSICVkIGJlbG93IDEgbVcuXG4iLAotCQkJIHR4X3Bvd2VyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHR4X3Bvd2VyID4gcHJpdi0+dHhfcG93ZXJfZGV2aWNlX2xtdCkgewotCQlJV0xfV0FSTihwcml2LAotCQkJIlJlcXVlc3RlZCB1c2VyIFRYUE9XRVIgJWQgYWJvdmUgdXBwZXIgbGltaXQgJWQuXG4iLAotCQkJIHR4X3Bvd2VyLCBwcml2LT50eF9wb3dlcl9kZXZpY2VfbG10KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qIHNjYW4gY29tcGxldGUgYW5kIGNvbW1pdF9yeG9uIHVzZSB0eF9wb3dlcl9uZXh0IHZhbHVlLAotCSAqIGl0IGFsd2F5cyBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIG5ld2VzdCByZXF1ZXN0ICovCi0JcHJpdi0+dHhfcG93ZXJfbmV4dCA9IHR4X3Bvd2VyOwotCi0JLyogZG8gbm90IHNldCB0eCBwb3dlciB3aGVuIHNjYW5uaW5nIG9yIGNoYW5uZWwgY2hhbmdpbmcgKi8KLQlkZWZlciA9IHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykgfHwKLQkJbWVtY21wKCZjdHgtPmFjdGl2ZSwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKGN0eC0+c3RhZ2luZykpOwotCWlmIChkZWZlciAmJiAhZm9yY2UpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkRlZmVycmluZyB0eCBwb3dlciBzZXRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcmV2X3R4X3Bvd2VyID0gcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQ7Ci0JcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQgPSB0eF9wb3dlcjsKLQotCXJldCA9IHByaXYtPmNmZy0+b3BzLT5saWItPnNlbmRfdHhfcG93ZXIocHJpdik7Ci0KLQkvKiBpZiBmYWlsIHRvIHNldCB0eF9wb3dlciwgcmVzdG9yZSB0aGUgb3JpZy4gdHggcG93ZXIgKi8KLQlpZiAocmV0KSB7Ci0JCXByaXYtPnR4X3Bvd2VyX3VzZXJfbG10ID0gcHJldl90eF9wb3dlcjsKLQkJcHJpdi0+dHhfcG93ZXJfbmV4dCA9IHByZXZfdHhfcG93ZXI7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKTsKLQotdm9pZCBpd2xfbGVnYWN5X3NlbmRfYnRfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2J0X2NtZCBidF9jbWQgPSB7Ci0JCS5sZWFkX3RpbWUgPSBCVF9MRUFEX1RJTUVfREVGLAotCQkubWF4X2tpbGwgPSBCVF9NQVhfS0lMTF9ERUYsCi0JCS5raWxsX2Fja19tYXNrID0gMCwKLQkJLmtpbGxfY3RzX21hc2sgPSAwLAotCX07Ci0KLQlpZiAoIWJ0X2NvZXhfYWN0aXZlKQotCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0RJU0FCTEU7Ci0JZWxzZQotCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0VOQUJMRTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJCVCBjb2V4ICVzXG4iLAotCQkoYnRfY21kLmZsYWdzID09IEJUX0NPRVhfRElTQUJMRSkgPyAiZGlzYWJsZSIgOiAiYWN0aXZlIik7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfQlRfQ09ORklHLAotCQkJICAgICBzaXplb2Yoc3RydWN0IGl3bF9idF9jbWQpLCAmYnRfY21kKSkKLQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNlbmQgQlQgQ29leCBDb25maWdcbiIpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfYnRfY29uZmlnKTsKLQotaW50IGl3bF9sZWdhY3lfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3Qoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBmbGFncywgYm9vbCBjbGVhcikKLXsKLQlzdHJ1Y3QgaXdsX3N0YXRpc3RpY3NfY21kIHN0YXRpc3RpY3NfY21kID0gewotCQkuY29uZmlndXJhdGlvbl9mbGFncyA9Ci0JCQljbGVhciA/IElXTF9TVEFUU19DT05GX0NMRUFSX1NUQVRTIDogMCwKLQl9OwotCi0JaWYgKGZsYWdzICYgQ01EX0FTWU5DKQotCQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMocHJpdiwgUkVQTFlfU1RBVElTVElDU19DTUQsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsX3N0YXRpc3RpY3NfY21kKSwKLQkJCQkJJnN0YXRpc3RpY3NfY21kLCBOVUxMKTsKLQllbHNlCi0JCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9TVEFUSVNUSUNTX0NNRCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfc3RhdGlzdGljc19jbWQpLAotCQkJCQkmc3RhdGlzdGljc19jbWQpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfc3RhdGlzdGljc19yZXF1ZXN0KTsKLQotdm9pZCBpd2xfbGVnYWN5X3J4X3BtX3NsZWVwX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc2xlZXBfbm90aWZpY2F0aW9uICpzbGVlcCA9ICYocGt0LT51LnNsZWVwX25vdGlmKTsKLQlJV0xfREVCVUdfUlgocHJpdiwgInNsZWVwIG1vZGU6ICVkLCBzcmM6ICVkXG4iLAotCQkgICAgIHNsZWVwLT5wbV9zbGVlcF9tb2RlLCBzbGVlcC0+cG1fd2FrZXVwX3NyYyk7Ci0jZW5kaWYKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9wbV9zbGVlcF9ub3RpZik7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9yeF9wbV9kZWJ1Z19zdGF0aXN0aWNzX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQl1MzIgbGVuID0gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSzsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgIkR1bXBpbmcgJWQgYnl0ZXMgb2YgdW5oYW5kbGVkICIKLQkJCSJub3RpZmljYXRpb24gZm9yICVzOlxuIiwgbGVuLAotCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpKTsKLQlpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgSVdMX0RMX1JBRElPLCBwa3QtPnUucmF3LCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3BtX2RlYnVnX3N0YXRpc3RpY3Nfbm90aWYpOwotCi12b2lkIGl3bF9sZWdhY3lfcnhfcmVwbHlfZXJyb3Ioc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0KLQlJV0xfRVJSKHByaXYsICJFcnJvciBSZXBseSB0eXBlIDB4JTA4WCBjbWQgJXMgKDB4JTAyWCkgIgotCQkic2VxIDB4JTA0WCBzZXIgMHglMDhYXG4iLAotCQlsZTMyX3RvX2NwdShwa3QtPnUuZXJyX3Jlc3AuZXJyb3JfdHlwZSksCi0JCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcocGt0LT51LmVycl9yZXNwLmNtZF9pZCksCi0JCXBrdC0+dS5lcnJfcmVzcC5jbWRfaWQsCi0JCWxlMTZfdG9fY3B1KHBrdC0+dS5lcnJfcmVzcC5iYWRfY21kX3NlcV9udW0pLAotCQlsZTMyX3RvX2NwdShwa3QtPnUuZXJyX3Jlc3AuZXJyb3JfaW5mbykpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3JlcGx5X2Vycm9yKTsKLQotdm9pZCBpd2xfbGVnYWN5X2NsZWFyX2lzcl9zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JbWVtc2V0KCZwcml2LT5pc3Jfc3RhdHMsIDAsIHNpemVvZihwcml2LT5pc3Jfc3RhdHMpKTsKLX0KLQotaW50IGl3bF9sZWdhY3lfbWFjX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCi0JCQkgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBSRiBub3QgcmVhZHlcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAocXVldWUgPj0gQUNfTlVNKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBxdWV1ZSA+PSBBQ19OVU0gJWRcbiIsIHF1ZXVlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcSA9IEFDX05VTSAtIDEgLSBxdWV1ZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5jd19taW4gPQotCQkJY3B1X3RvX2xlMTYocGFyYW1zLT5jd19taW4pOwotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5jd19tYXggPQotCQkJY3B1X3RvX2xlMTYocGFyYW1zLT5jd19tYXgpOwotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5haWZzbiA9IHBhcmFtcy0+YWlmczsKLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uZWRjYV90eG9wID0KLQkJCQljcHVfdG9fbGUxNigocGFyYW1zLT50eG9wICogMzIpKTsKLQotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5yZXNlcnZlZDEgPSAwOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19jb25mX3R4KTsKLQotaW50IGl3bF9sZWdhY3lfbWFjX3R4X2xhc3RfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JcmV0dXJuIHByaXYtPmlic3NfbWFuYWdlciA9PSBJV0xfSUJTU19NQU5BR0VSOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXdsX2xlZ2FjeV9tYWNfdHhfbGFzdF9iZWFjb24pOwotCi1zdGF0aWMgaW50Ci1pd2xfbGVnYWN5X3NldF9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlpd2xfbGVnYWN5X2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcocHJpdiwgY3R4KTsKLQotCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLX0KLQotc3RhdGljIGludCBpd2xfbGVnYWN5X3NldHVwX2ludGVyZmFjZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gY3R4LT52aWY7Ci0JaW50IGVycjsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCS8qCi0JICogVGhpcyB2YXJpYWJsZSB3aWxsIGJlIGNvcnJlY3Qgb25seSB3aGVuIHRoZXJlJ3MganVzdAotCSAqIGEgc2luZ2xlIGNvbnRleHQsIGJ1dCBhbGwgY29kZSB1c2luZyBpdCBpcyBmb3IgaGFyZHdhcmUKLQkgKiB0aGF0IHN1cHBvcnRzIG9ubHkgb25lIGNvbnRleHQuCi0JICovCi0JcHJpdi0+aXdfbW9kZSA9IHZpZi0+dHlwZTsKLQotCWN0eC0+aXNfYWN0aXZlID0gdHJ1ZTsKLQotCWVyciA9IGl3bF9sZWdhY3lfc2V0X21vZGUocHJpdiwgY3R4KTsKLQlpZiAoZXJyKSB7Ci0JCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQotCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1pd2xfbGVnYWN5X21hY19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXAsICpjdHggPSBOVUxMOwotCWludCBlcnI7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyOiB0eXBlICVkLCBhZGRyICVwTVxuIiwKLQkJCSAgIHZpZi0+dHlwZSwgdmlmLT5hZGRyKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihwcml2KSkgewotCQlJV0xfV0FSTihwcml2LCAiVHJ5IHRvIGFkZCBpbnRlcmZhY2Ugd2hlbiBkZXZpY2Ugbm90IHJlYWR5XG4iKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCB0bXApIHsKLQkJdTMyIHBvc3NpYmxlX21vZGVzID0KLQkJCXRtcC0+aW50ZXJmYWNlX21vZGVzIHwgdG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOwotCi0JCWlmICh0bXAtPnZpZikgewotCQkJLyogY2hlY2sgaWYgdGhpcyBidXN5IGNvbnRleHQgaXMgZXhjbHVzaXZlICovCi0JCQlpZiAodG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYKLQkJCQkJCUJJVCh0bXAtPnZpZi0+dHlwZSkpIHsKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIShwb3NzaWJsZV9tb2RlcyAmIEJJVCh2aWYtPnR5cGUpKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGhhdmUgbWF5YmUgdXNhYmxlIGNvbnRleHQgdy9vIGludGVyZmFjZSAqLwotCQljdHggPSB0bXA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICghY3R4KSB7Ci0JCWVyciA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl2aWZfcHJpdi0+Y3R4ID0gY3R4OwotCWN0eC0+dmlmID0gdmlmOwotCi0JZXJyID0gaXdsX2xlZ2FjeV9zZXR1cF9pbnRlcmZhY2UocHJpdiwgY3R4KTsKLQlpZiAoIWVycikKLQkJZ290byBvdXQ7Ci0KLQljdHgtPnZpZiA9IE5VTEw7Ci0JcHJpdi0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfYWRkX2ludGVyZmFjZSk7Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfdGVhcmRvd25faW50ZXJmYWNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgIGJvb2wgbW9kZV9jaGFuZ2UpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCWlmIChwcml2LT5zY2FuX3ZpZiA9PSB2aWYpIHsKLQkJaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7Ci0JCWl3bF9sZWdhY3lfZm9yY2Vfc2Nhbl9lbmQocHJpdik7Ci0JfQotCi0JaWYgKCFtb2RlX2NoYW5nZSkgewotCQlpd2xfbGVnYWN5X3NldF9tb2RlKHByaXYsIGN0eCk7Ci0JCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQotCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKLQl9Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9tYWNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JV0FSTl9PTihjdHgtPnZpZiAhPSB2aWYpOwotCWN0eC0+dmlmID0gTlVMTDsKLQotCWl3bF9sZWdhY3lfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgZmFsc2UpOwotCi0JbWVtc2V0KHByaXYtPmJzc2lkLCAwLCBFVEhfQUxFTik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19yZW1vdmVfaW50ZXJmYWNlKTsKLQotaW50IGl3bF9sZWdhY3lfYWxsb2NfdHhxX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKCFwcml2LT50eHEpCi0JCXByaXYtPnR4cSA9IGt6YWxsb2MoCi0JCQlzaXplb2Yoc3RydWN0IGl3bF90eF9xdWV1ZSkgKgotCQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMsCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPnR4cSkgewotCQlJV0xfRVJSKHByaXYsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdHhxXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2FsbG9jX3R4cV9tZW0pOwotCi12b2lkIGl3bF9sZWdhY3lfdHhxX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Ja2ZyZWUocHJpdi0+dHhxKTsKLQlwcml2LT50eHEgPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4cV9tZW0pOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQotI2RlZmluZSBJV0xfVFJBRkZJQ19EVU1QX1NJWkUJKElXTF9UUkFGRklDX0VOVFJZX1NJWkUgKiBJV0xfVFJBRkZJQ19FTlRSSUVTKQotCi12b2lkIGl3bF9sZWdhY3lfcmVzZXRfdHJhZmZpY19sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXByaXYtPnR4X3RyYWZmaWNfaWR4ID0gMDsKLQlwcml2LT5yeF90cmFmZmljX2lkeCA9IDA7Ci0JaWYgKHByaXYtPnR4X3RyYWZmaWMpCi0JCW1lbXNldChwcml2LT50eF90cmFmZmljLCAwLCBJV0xfVFJBRkZJQ19EVU1QX1NJWkUpOwotCWlmIChwcml2LT5yeF90cmFmZmljKQotCQltZW1zZXQocHJpdi0+cnhfdHJhZmZpYywgMCwgSVdMX1RSQUZGSUNfRFVNUF9TSVpFKTsKLX0KLQotaW50IGl3bF9sZWdhY3lfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiB0cmFmZmljX3NpemUgPSBJV0xfVFJBRkZJQ19EVU1QX1NJWkU7Ci0KLQlpZiAoaXdsZWdhY3lfZGVidWdfbGV2ZWwgJiBJV0xfRExfVFgpIHsKLQkJaWYgKCFwcml2LT50eF90cmFmZmljKSB7Ci0JCQlwcml2LT50eF90cmFmZmljID0KLQkJCQlremFsbG9jKHRyYWZmaWNfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXByaXYtPnR4X3RyYWZmaWMpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0JaWYgKGl3bGVnYWN5X2RlYnVnX2xldmVsICYgSVdMX0RMX1JYKSB7Ci0JCWlmICghcHJpdi0+cnhfdHJhZmZpYykgewotCQkJcHJpdi0+cnhfdHJhZmZpYyA9Ci0JCQkJa3phbGxvYyh0cmFmZmljX3NpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFwcml2LT5yeF90cmFmZmljKQotCQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCWl3bF9sZWdhY3lfcmVzZXRfdHJhZmZpY19sb2cocHJpdik7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYWxsb2NfdHJhZmZpY19tZW0pOwotCi12b2lkIGl3bF9sZWdhY3lfZnJlZV90cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Ja2ZyZWUocHJpdi0+dHhfdHJhZmZpYyk7Ci0JcHJpdi0+dHhfdHJhZmZpYyA9IE5VTEw7Ci0KLQlrZnJlZShwcml2LT5yeF90cmFmZmljKTsKLQlwcml2LT5yeF90cmFmZmljID0gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKTsKLQotdm9pZCBpd2xfbGVnYWN5X2RiZ19sb2dfdHhfZGF0YV9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgIHUxNiBsZW5ndGgsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCi17Ci0JX19sZTE2IGZjOwotCXUxNiBsZW47Ci0KLQlpZiAobGlrZWx5KCEoaXdsZWdhY3lfZGVidWdfbGV2ZWwgJiBJV0xfRExfVFgpKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFwcml2LT50eF90cmFmZmljKQotCQlyZXR1cm47Ci0KLQlmYyA9IGhlYWRlci0+ZnJhbWVfY29udHJvbDsKLQlpZiAoaWVlZTgwMjExX2lzX2RhdGEoZmMpKSB7Ci0JCWxlbiA9IChsZW5ndGggPiBJV0xfVFJBRkZJQ19FTlRSWV9TSVpFKQotCQkgICAgICAgPyBJV0xfVFJBRkZJQ19FTlRSWV9TSVpFIDogbGVuZ3RoOwotCQltZW1jcHkoKHByaXYtPnR4X3RyYWZmaWMgKwotCQkgICAgICAgKHByaXYtPnR4X3RyYWZmaWNfaWR4ICogSVdMX1RSQUZGSUNfRU5UUllfU0laRSkpLAotCQkgICAgICAgaGVhZGVyLCBsZW4pOwotCQlwcml2LT50eF90cmFmZmljX2lkeCA9Ci0JCQkocHJpdi0+dHhfdHJhZmZpY19pZHggKyAxKSAlIElXTF9UUkFGRklDX0VOVFJJRVM7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2RiZ19sb2dfdHhfZGF0YV9mcmFtZSk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9kYmdfbG9nX3J4X2RhdGFfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICB1MTYgbGVuZ3RoLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQotewotCV9fbGUxNiBmYzsKLQl1MTYgbGVuOwotCi0JaWYgKGxpa2VseSghKGl3bGVnYWN5X2RlYnVnX2xldmVsICYgSVdMX0RMX1JYKSkpCi0JCXJldHVybjsKLQotCWlmICghcHJpdi0+cnhfdHJhZmZpYykKLQkJcmV0dXJuOwotCi0JZmMgPSBoZWFkZXItPmZyYW1lX2NvbnRyb2w7Ci0JaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgewotCQlsZW4gPSAobGVuZ3RoID4gSVdMX1RSQUZGSUNfRU5UUllfU0laRSkKLQkJICAgICAgID8gSVdMX1RSQUZGSUNfRU5UUllfU0laRSA6IGxlbmd0aDsKLQkJbWVtY3B5KChwcml2LT5yeF90cmFmZmljICsKLQkJICAgICAgIChwcml2LT5yeF90cmFmZmljX2lkeCAqIElXTF9UUkFGRklDX0VOVFJZX1NJWkUpKSwKLQkJICAgICAgIGhlYWRlciwgbGVuKTsKLQkJcHJpdi0+cnhfdHJhZmZpY19pZHggPQotCQkJKHByaXYtPnJ4X3RyYWZmaWNfaWR4ICsgMSkgJSBJV0xfVFJBRkZJQ19FTlRSSUVTOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9kYmdfbG9nX3J4X2RhdGFfZnJhbWUpOwotCi1jb25zdCBjaGFyICppd2xfbGVnYWN5X2dldF9tZ210X3N0cmluZyhpbnQgY21kKQotewotCXN3aXRjaCAoY21kKSB7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9BU1NPQ19SRVEpOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfQVNTT0NfUkVTUCk7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9SRUFTU09DX1JFUSk7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9SRUFTU09DX1JFU1ApOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfUFJPQkVfUkVRKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX1BST0JFX1JFU1ApOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfQkVBQ09OKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX0FUSU0pOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfRElTQVNTT0MpOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfQVVUSCk7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9ERUFVVEgpOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfQUNUSU9OKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gIlVOS05PV04iOwotCi0JfQotfQotCi1jb25zdCBjaGFyICppd2xfbGVnYWN5X2dldF9jdHJsX3N0cmluZyhpbnQgY21kKQotewotCXN3aXRjaCAoY21kKSB7Ci0JCUlXTF9DTUQoQ09OVFJPTF9CQUNLX1JFUSk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9CQUNLKTsKLQkJSVdMX0NNRChDT05UUk9MX1BTUE9MTCk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9SVFMpOwotCQlJV0xfQ01EKENPTlRST0xfQ1RTKTsKLQkJSVdMX0NNRChDT05UUk9MX0FDSyk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9DRkVORCk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9DRkVOREFDSyk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJVTktOT1dOIjsKLQotCX0KLX0KLQotdm9pZCBpd2xfbGVnYWN5X2NsZWFyX3RyYWZmaWNfc3RhdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCW1lbXNldCgmcHJpdi0+dHhfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgdHJhZmZpY19zdGF0cykpOwotCW1lbXNldCgmcHJpdi0+cnhfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgdHJhZmZpY19zdGF0cykpOwotfQotCi0vKgotICogaWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMgZGVmaW5lZCwKLSAqIGl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzIGZ1bmN0aW9uIHdpbGwKLSAqIHJlY29yZCBhbGwgdGhlIE1HTVQsIENUUkwgYW5kIERBVEEgcGt0IGZvciBib3RoIFRYIGFuZCBSeCBwYXNzCi0gKiBVc2UgZGVidWdGcyB0byBkaXNwbGF5IHRoZSByeC9yeF9zdGF0aXN0aWNzCi0gKiBpZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUyBub3QgYmVpbmcgZGVmaW5lZCwgdGhlbiBubyBNR01UIGFuZCBDVFJMCi0gKiBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlY29yZGVkLCBidXQgREFUQSBwa3Qgc3RpbGwgd2lsbCBiZSByZWNvcmRlZAotICogZm9yIHRoZSByZWFzb24gb2YgaXdsX2xlZC5jIG5lZWQgdG8gY29udHJvbCB0aGUgbGVkIGJsaW5raW5nIGJhc2VkIG9uCi0gKiBudW1iZXIgb2YgdHggYW5kIHJ4IGRhdGEuCi0gKgotICovCi12b2lkCi1pd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgaXNfdHgsIF9fbGUxNiBmYywgdTE2IGxlbikKLXsKLQlzdHJ1Y3QgdHJhZmZpY19zdGF0cwkqc3RhdHM7Ci0KLQlpZiAoaXNfdHgpCi0JCXN0YXRzID0gJnByaXYtPnR4X3N0YXRzOwotCWVsc2UKLQkJc3RhdHMgPSAmcHJpdi0+cnhfc3RhdHM7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKSB7Ci0JCXN3aXRjaCAoZmMgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9TVFlQRSkpIHsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQVNTT0NfUkVRXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BU1NPQ19SRVNQXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUkVBU1NPQ19SRVFdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUkVBU1NPQ19SRVNQXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX1BST0JFX1JFUV0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUFJPQkVfUkVTUF0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9CRUFDT05dKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVRJTSk6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0FUSU1dKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MpOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9ESVNBU1NPQ10rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVVRIKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQVVUSF0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9ERUFVVEhdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQUNUSU9OKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQUNUSU9OXSsrOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19jdGwoZmMpKSB7Ci0JCXN3aXRjaCAoZmMgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9TVFlQRSkpIHsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQkFDS19SRVEpOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9CQUNLX1JFUV0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CQUNLKToKLQkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQkFDS10rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QU1BPTEwpOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9QU1BPTExdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUlRTKToKLQkJCXN0YXRzLT5jdHJsW0NPTlRST0xfUlRTXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0NUUyk6Ci0JCQlzdGF0cy0+Y3RybFtDT05UUk9MX0NUU10rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BQ0spOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9BQ0tdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQ0ZFTkQpOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9DRkVORF0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9DRkVOREFDSyk6Ci0JCQlzdGF0cy0+Y3RybFtDT05UUk9MX0NGRU5EQUNLXSsrOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBkYXRhICovCi0JCXN0YXRzLT5kYXRhX2NudCsrOwotCQlzdGF0cy0+ZGF0YV9ieXRlcyArPSBsZW47Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyk7Ci0jZW5kaWYKLQotaW50IGl3bF9sZWdhY3lfZm9yY2VfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGV4dGVybmFsKQotewotCXN0cnVjdCBpd2xfZm9yY2VfcmVzZXQgKmZvcmNlX3Jlc2V0OwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZvcmNlX3Jlc2V0ID0gJnByaXYtPmZvcmNlX3Jlc2V0OwotCWZvcmNlX3Jlc2V0LT5yZXNldF9yZXF1ZXN0X2NvdW50Kys7Ci0JaWYgKCFleHRlcm5hbCkgewotCQlpZiAoZm9yY2VfcmVzZXQtPmxhc3RfZm9yY2VfcmVzZXRfamlmZmllcyAmJgotCQkgICAgdGltZV9hZnRlcihmb3JjZV9yZXNldC0+bGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzICsKLQkJICAgIGZvcmNlX3Jlc2V0LT5yZXNldF9kdXJhdGlvbiwgamlmZmllcykpIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJmb3JjZSByZXNldCByZWplY3RlZFxuIik7Ci0JCQlmb3JjZV9yZXNldC0+cmVzZXRfcmVqZWN0X2NvdW50Kys7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCX0KLQlmb3JjZV9yZXNldC0+cmVzZXRfc3VjY2Vzc19jb3VudCsrOwotCWZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgPSBqaWZmaWVzOwotCi0JLyoKLQkgKiBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGV4dGVybmFsKGV4OiBkZWJ1Z2ZzKSwKLQkgKiB0aGVuIGFsd2F5cyBwZXJmb3JtIHRoZSByZXF1ZXN0IGluIHJlZ2FyZGxlc3MgdGhlIG1vZHVsZQotCSAqIHBhcmFtZXRlciBzZXR0aW5nCi0JICogaWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBpbnRlcm5hbCAodUNvZGUgZXJyb3Igb3IgZHJpdmVyCi0JICogZGV0ZWN0IGZhaWx1cmUpLCB0aGVuIGZ3X3Jlc3RhcnQgbW9kdWxlIHBhcmFtZXRlcgotCSAqIG5lZWQgdG8gYmUgY2hlY2sgYmVmb3JlIHBlcmZvcm1pbmcgZmlybXdhcmUgcmVsb2FkCi0JICovCi0KLQlpZiAoIWV4dGVybmFsICYmICFwcml2LT5jZmctPm1vZF9wYXJhbXMtPnJlc3RhcnRfZncpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNhbmNlbCBmaXJtd2FyZSByZWxvYWQgYmFzZWQgb24gIgotCQkJICAgICAgICJtb2R1bGUgcGFyYW1ldGVyIHNldHRpbmdcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfRVJSKHByaXYsICJPbiBkZW1hbmQgZmlybXdhcmUgcmVsb2FkXG4iKTsKLQotCS8qIFNldCB0aGUgRlcgZXJyb3IgZmxhZyAtLSBjbGVhcmVkIG9uIGl3bF9kb3duICovCi0Jc2V0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpOwotCXdha2VfdXAoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0JLyoKLQkgKiBLZWVwIHRoZSByZXN0YXJ0IHByb2Nlc3MgZnJvbSB0cnlpbmcgdG8gc2VuZCBob3N0Ci0JICogY29tbWFuZHMgYnkgY2xlYXJpbmcgdGhlIElOSVQgc3RhdHVzIGJpdAotCSAqLwotCWNsZWFyX2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpOwotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzdGFydCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1pd2xfbGVnYWN5X21hY19jaGFuZ2VfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wOwotCXUzMiBpbnRlcmZhY2VfbW9kZXM7Ci0JaW50IGVycjsKLQotCW5ld3R5cGUgPSBpZWVlODAyMTFfaWZ0eXBlX3AycChuZXd0eXBlLCBuZXdwMnApOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCFjdHgtPnZpZiB8fCAhaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihwcml2KSkgewotCQkvKgotCQkgKiBIdWg/IEJ1dCB3YWl0IC4uLiB0aGlzIGNhbiBtYXliZSBoYXBwZW4gd2hlbgotCQkgKiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZmlybXdhcmUgcmVzdGFydCEKLQkJICovCi0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaW50ZXJmYWNlX21vZGVzID0gY3R4LT5pbnRlcmZhY2VfbW9kZXMgfCBjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7Ci0KLQlpZiAoIShpbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpKSB7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSkgewotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkgewotCQkJaWYgKGN0eCA9PSB0bXApCi0JCQkJY29udGludWU7Ci0KLQkJCWlmICghdG1wLT52aWYpCi0JCQkJY29udGludWU7Ci0KLQkJCS8qCi0JCQkgKiBUaGUgY3VycmVudCBtb2RlIHN3aXRjaCB3b3VsZCBiZSBleGNsdXNpdmUsIGJ1dAotCQkJICogYW5vdGhlciBjb250ZXh0IGlzIGFjdGl2ZSAuLi4gcmVmdXNlIHRoZSBzd2l0Y2guCi0JCQkgKi8KLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JLyogc3VjY2VzcyAqLwotCWl3bF9sZWdhY3lfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgdHJ1ZSk7Ci0JdmlmLT50eXBlID0gbmV3dHlwZTsKLQl2aWYtPnAycCA9IG5ld3AycDsKLQllcnIgPSBpd2xfbGVnYWN5X3NldHVwX2ludGVyZmFjZShwcml2LCBjdHgpOwotCVdBUk5fT04oZXJyKTsKLQkvKgotCSAqIFdlJ3ZlIHN3aXRjaGVkIGludGVybmFsbHksIGJ1dCBzdWJtaXR0aW5nIHRvIHRoZQotCSAqIGRldmljZSBtYXkgaGF2ZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLiBNYXNrIHRoaXMKLQkgKiBlcnJvciwgYmVjYXVzZSBvdGhlcndpc2UgbWFjODAyMTEgd2lsbCBub3Qgc3dpdGNoCi0JICogKGFuZCBzZXQgdGhlIGludGVyZmFjZSB0eXBlIGJhY2spIGFuZCB3ZSdsbCBiZQotCSAqIG91dCBvZiBzeW5jIHdpdGggaXQuCi0JICovCi0JZXJyID0gMDsKLQotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19jaGFuZ2VfaW50ZXJmYWNlKTsKLQotLyoKLSAqIE9uIGV2ZXJ5IHdhdGNoZG9nIHRpY2sgd2UgY2hlY2sgKGxhdGVzdCkgdGltZSBzdGFtcC4gSWYgaXQgZG9lcyBub3QKLSAqIGNoYW5nZSBkdXJpbmcgdGltZW91dCBwZXJpb2QgYW5kIHF1ZXVlIGlzIG5vdCBlbXB0eSB3ZSByZXNldCBmaXJtd2FyZS4KLSAqLwotc3RhdGljIGludCBpd2xfbGVnYWN5X2NoZWNrX3N0dWNrX3F1ZXVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IGNudCkKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW2NudF07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCByZXQ7Ci0KLQlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyKSB7Ci0JCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7Ci0JCXJldHVybiAwOwotCX0KLQotCXRpbWVvdXQgPSB0eHEtPnRpbWVfc3RhbXAgKwotCQkgIG1zZWNzX3RvX2ppZmZpZXMocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCk7Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlJV0xfRVJSKHByaXYsICJRdWV1ZSAlZCBzdHVjayBmb3IgJXUgbXMuXG4iLAotCQkJCXEtPmlkLCBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0KTsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9mb3JjZV9yZXNldChwcml2LCBmYWxzZSk7Ci0JCXJldHVybiAocmV0ID09IC1FQUdBSU4pID8gMCA6IDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBNYWtpbmcgd2F0Y2hkb2cgdGljayBiZSBhIHF1YXJ0ZXIgb2YgdGltZW91dCBhc3N1cmUgd2Ugd2lsbAotICogZGlzY292ZXIgdGhlIHF1ZXVlIGh1bmcgYmV0d2VlbiB0aW1lb3V0IGFuZCAxLjI1KnRpbWVvdXQKLSAqLwotI2RlZmluZSBJV0xfV0RfVElDSyh0aW1lb3V0KSAoKHRpbWVvdXQpIC8gNCkKLQotLyoKLSAqIFdhdGNoZG9nIHRpbWVyIGNhbGxiYWNrLCB3ZSBjaGVjayBlYWNoIHR4IHF1ZXVlIGZvciBzdHVjaywgaWYgaWYgaHVuZwotICogd2UgcmVzZXQgdGhlIGZpcm13YXJlLiBJZiBldmVyeXRoaW5nIGlzIGZpbmUganVzdCByZWFybSB0aGUgdGltZXIuCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV9iZ193YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKWRhdGE7Ci0JaW50IGNudDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCXRpbWVvdXQgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OwotCWlmICh0aW1lb3V0ID09IDApCi0JCXJldHVybjsKLQotCS8qIG1vbml0b3IgYW5kIGNoZWNrIGZvciBzdHVjayBjbWQgcXVldWUgKi8KLQlpZiAoaXdsX2xlZ2FjeV9jaGVja19zdHVja19xdWV1ZShwcml2LCBwcml2LT5jbWRfcXVldWUpKQotCQlyZXR1cm47Ci0KLQkvKiBtb25pdG9yIGFuZCBjaGVjayBmb3Igb3RoZXIgc3R1Y2sgcXVldWVzICovCi0JaWYgKGl3bF9sZWdhY3lfaXNfYW55X2Fzc29jaWF0ZWQocHJpdikpIHsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IGNudCsrKSB7Ci0JCQkvKiBza2lwIGFzIHdlIGFscmVhZHkgY2hlY2tlZCB0aGUgY29tbWFuZCBxdWV1ZSAqLwotCQkJaWYgKGNudCA9PSBwcml2LT5jbWRfcXVldWUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaXdsX2xlZ2FjeV9jaGVja19zdHVja19xdWV1ZShwcml2LCBjbnQpKQotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCW1vZF90aW1lcigmcHJpdi0+d2F0Y2hkb2csIGppZmZpZXMgKwotCQkgIG1zZWNzX3RvX2ppZmZpZXMoSVdMX1dEX1RJQ0sodGltZW91dCkpKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9iZ193YXRjaGRvZyk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9zZXR1cF93YXRjaGRvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgaW50IHRpbWVvdXQgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OwotCi0JaWYgKHRpbWVvdXQpCi0JCW1vZF90aW1lcigmcHJpdi0+d2F0Y2hkb2csCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKElXTF9XRF9USUNLKHRpbWVvdXQpKSk7Ci0JZWxzZQotCQlkZWxfdGltZXIoJnByaXYtPndhdGNoZG9nKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXR1cF93YXRjaGRvZyk7Ci0KLS8qCi0gKiBleHRlbmRlZCBiZWFjb24gdGltZSBmb3JtYXQKLSAqIHRpbWUgaW4gdXNlYyB3aWxsIGJlIGNoYW5nZWQgaW50byBhIDMyLWJpdCB2YWx1ZSBpbiBleHRlbmRlZDppbnRlcm5hbCBmb3JtYXQKLSAqIHRoZSBleHRlbmRlZCBwYXJ0IGlzIHRoZSBiZWFjb24gY291bnRzCi0gKiB0aGUgaW50ZXJuYWwgcGFydCBpcyB0aGUgdGltZSBpbiB1c2VjIHdpdGhpbiBvbmUgYmVhY29uIGludGVydmFsCi0gKi8KLXUzMgotaXdsX2xlZ2FjeV91c2Vjc190b19iZWFjb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJdTMyIHVzZWMsIHUzMiBiZWFjb25faW50ZXJ2YWwpCi17Ci0JdTMyIHF1b3Q7Ci0JdTMyIHJlbTsKLQl1MzIgaW50ZXJ2YWwgPSBiZWFjb25faW50ZXJ2YWwgKiBUSU1FX1VOSVQ7Ci0KLQlpZiAoIWludGVydmFsIHx8ICF1c2VjKQotCQlyZXR1cm4gMDsKLQotCXF1b3QgPSAodXNlYyAvIGludGVydmFsKSAmCi0JCShpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfaGlnaChwcml2LAotCQlwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpID4+Ci0JCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7Ci0JcmVtID0gKHVzZWMgJSBpbnRlcnZhbCkgJiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfbG93KHByaXYsCi0JCQkJICAgcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKLQotCXJldHVybiAocXVvdCA8PCBwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpICsgcmVtOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3VzZWNzX3RvX2JlYWNvbnMpOwotCi0vKiBiYXNlIGlzIHVzdWFsbHkgd2hhdCB3ZSBnZXQgZnJvbSB1Y29kZSB3aXRoIGVhY2ggcmVjZWl2ZWQgZnJhbWUsCi0gKiB0aGUgc2FtZSBhcyBIVyB0aW1lciBjb3VudGVyIGNvdW50aW5nIGRvd24KLSAqLwotX19sZTMyIGl3bF9sZWdhY3lfYWRkX2JlYWNvbl90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGJhc2UsCi0JCQkgICB1MzIgYWRkb24sIHUzMiBiZWFjb25faW50ZXJ2YWwpCi17Ci0JdTMyIGJhc2VfbG93ID0gYmFzZSAmIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19sb3cocHJpdiwKLQkJCQkJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKLQl1MzIgYWRkb25fbG93ID0gYWRkb24gJiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfbG93KHByaXYsCi0JCQkJCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7Ci0JdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogVElNRV9VTklUOwotCXUzMiByZXMgPSAoYmFzZSAmIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19oaWdoKHByaXYsCi0JCQkJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKSkgKwotCQkJCShhZGRvbiAmIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19oaWdoKHByaXYsCi0JCQkJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKSk7Ci0KLQlpZiAoYmFzZV9sb3cgPiBhZGRvbl9sb3cpCi0JCXJlcyArPSBiYXNlX2xvdyAtIGFkZG9uX2xvdzsKLQllbHNlIGlmIChiYXNlX2xvdyA8IGFkZG9uX2xvdykgewotCQlyZXMgKz0gaW50ZXJ2YWwgKyBiYXNlX2xvdyAtIGFkZG9uX2xvdzsKLQkJcmVzICs9ICgxIDw8IHByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7Ci0JfSBlbHNlCi0JCXJlcyArPSAoMSA8PCBwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOwotCi0JcmV0dXJuIGNwdV90b19sZTMyKHJlcyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYWRkX2JlYWNvbl90aW1lKTsKLQotI2lmZGVmIENPTkZJR19QTQotCi1pbnQgaXdsX2xlZ2FjeV9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JLyoKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHN5c3RlbSBnb2VzIGludG8gc3VzcGVuZCBzdGF0ZQotCSAqIG1hYzgwMjExIHdpbGwgY2FsbCBpd2xfbWFjX3N0b3AoKSBmcm9tIHRoZSBtYWM4MDIxMSBzdXNwZW5kIGZ1bmN0aW9uCi0JICogZmlyc3QgYnV0IHNpbmNlIGl3bF9tYWNfc3RvcCgpIGhhcyBubyBrbm93bGVkZ2Ugb2Ygd2hvIHRoZSBjYWxsZXIgaXMsCi0JICogaXQgd2lsbCBub3QgY2FsbCBhcG1fb3BzLnN0b3AoKSB0byBzdG9wIHRoZSBETUEgb3BlcmF0aW9uLgotCSAqIENhbGxpbmcgYXBtX29wcy5zdG9wIGhlcmUgdG8gbWFrZSBzdXJlIHdlIHN0b3AgdGhlIERNQS4KLQkgKi8KLQlpd2xfbGVnYWN5X2FwbV9zdG9wKHByaXYpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcGNpX3N1c3BlbmQpOwotCi1pbnQgaXdsX2xlZ2FjeV9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JYm9vbCBod19yZmtpbGwgPSBmYWxzZTsKLQotCS8qCi0JICogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAotCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUuCi0JICovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkdfUkVUUllfVElNRU9VVCwgMHgwMCk7Ci0KLQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCi0JaWYgKCEoaXdsX3JlYWQzMihwcml2LCBDU1JfR1BfQ05UUkwpICYKLQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykpCi0JCWh3X3Jma2lsbCA9IHRydWU7Ci0KLQlpZiAoaHdfcmZraWxsKQotCQlzZXRfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQllbHNlCi0JCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwgaHdfcmZraWxsKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3BjaV9yZXN1bWUpOwotCi1jb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpd2xfbGVnYWN5X3BtX29wcyA9IHsKLQkuc3VzcGVuZCA9IGl3bF9sZWdhY3lfcGNpX3N1c3BlbmQsCi0JLnJlc3VtZSA9IGl3bF9sZWdhY3lfcGNpX3Jlc3VtZSwKLQkuZnJlZXplID0gaXdsX2xlZ2FjeV9wY2lfc3VzcGVuZCwKLQkudGhhdyA9IGl3bF9sZWdhY3lfcGNpX3Jlc3VtZSwKLQkucG93ZXJvZmYgPSBpd2xfbGVnYWN5X3BjaV9zdXNwZW5kLAotCS5yZXN0b3JlID0gaXdsX2xlZ2FjeV9wY2lfcmVzdW1lLAotfTsKLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9wbV9vcHMpOwotCi0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KLXN0YXRpYyB2b2lkCi1pd2xfbGVnYWN5X3VwZGF0ZV9xb3Moc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFjdHgtPmlzX2FjdGl2ZSkKLQkJcmV0dXJuOwotCi0JY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzID0gMDsKLQotCWlmIChjdHgtPnFvc19kYXRhLnFvc19hY3RpdmUpCi0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyB8PQotCQkJUU9TX1BBUkFNX0ZMR19VUERBVEVfRURDQV9NU0s7Ci0KLQlpZiAoY3R4LT5odC5lbmFibGVkKQotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MgfD0gUU9TX1BBUkFNX0ZMR19UR05fTVNLOwotCi0JSVdMX0RFQlVHX1FPUyhwcml2LCAic2VuZCBRb1MgY21kIHdpdGggUW9zIGFjdGl2ZT0lZCBGTEFHUz0weCVYXG4iLAotCQkgICAgICBjdHgtPnFvc19kYXRhLnFvc19hY3RpdmUsCi0JCSAgICAgIGN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyk7Ci0KLQlpd2xfbGVnYWN5X3NlbmRfY21kX3BkdV9hc3luYyhwcml2LCBjdHgtPnFvc19jbWQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfcW9zcGFyYW1fY21kKSwKLQkJCSAgICAgICAmY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0sIE5VTEwpOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfbWFjX2NvbmZpZyAtIG1hYzgwMjExIGNvbmZpZyBjYWxsYmFjawotICovCi1pbnQgaXdsX2xlZ2FjeV9tYWNfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gY29uZi0+Y2hhbm5lbDsKLQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZzsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCWludCByZXQgPSAwOwotCXUxNiBjaDsKLQlpbnQgc2Nhbl9hY3RpdmUgPSAwOwotCWJvb2wgaHRfY2hhbmdlZFtOVU1fSVdMX1JYT05fQ1RYXSA9IHt9OwotCi0JaWYgKFdBUk5fT04oIXByaXYtPmNmZy0+b3BzLT5sZWdhY3kpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyIHRvIGNoYW5uZWwgJWQgY2hhbmdlZCAweCVYXG4iLAotCQkJCQljaGFubmVsLT5od192YWx1ZSwgY2hhbmdlZCk7Ci0KLQlpZiAodW5saWtlbHkodGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkpIHsKLQkJc2Nhbl9hY3RpdmUgPSAxOwotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgInNjYW4gYWN0aXZlXG4iKTsKLQl9Ci0KLQlpZiAoY2hhbmdlZCAmIChJRUVFODAyMTFfQ09ORl9DSEFOR0VfU01QUyB8Ci0JCSAgICAgICBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkpIHsKLQkJLyogbWFjODAyMTEgdXNlcyBzdGF0aWMgZm9yIG5vbi1IVCB3aGljaCBpcyB3aGF0IHdlIHdhbnQgKi8KLQkJcHJpdi0+Y3VycmVudF9odF9jb25maWcuc21wcyA9IGNvbmYtPnNtcHNfbW9kZTsKLQotCQkvKgotCQkgKiBSZWNhbGN1bGF0ZSBjaGFpbiBjb3VudHMuCi0JCSAqCi0JCSAqIElmIG1vbml0b3IgbW9kZSBpcyBlbmFibGVkIHRoZW4gbWFjODAyMTEgd2lsbAotCQkgKiBzZXQgdXAgdGhlIFNNIFBTIG1vZGUgdG8gT0ZGIGlmIGFuIEhUIGNoYW5uZWwgaXMKLQkJICogY29uZmlndXJlZC4KLQkJICovCi0JCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkKLQkJCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQl9Ci0KLQkvKiBkdXJpbmcgc2Nhbm5pbmcgbWFjODAyMTEgd2lsbCBkZWxheSBjaGFubmVsIHNldHRpbmcgdW50aWwKLQkgKiBzY2FuIGZpbmlzaCB3aXRoIGNoYW5nZWQgPSAwCi0JICovCi0JaWYgKCFjaGFuZ2VkIHx8IChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpKSB7Ci0JCWlmIChzY2FuX2FjdGl2ZSkKLQkJCWdvdG8gc2V0X2NoX291dDsKLQotCQljaCA9IGNoYW5uZWwtPmh3X3ZhbHVlOwotCQljaF9pbmZvID0gaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGNoYW5uZWwtPmJhbmQsIGNoKTsKLQkJaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBpbnZhbGlkIGNoYW5uZWxcbiIpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gc2V0X2NoX291dDsKLQkJfQotCi0JCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCi0JCSAgICAhaXdsX2xlZ2FjeV9pc19jaGFubmVsX2lic3MoY2hfaW5mbykpIHsKLQkJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBub3QgSUJTUyBjaGFubmVsXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIHNldF9jaF9vdXQ7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCQkvKiBDb25maWd1cmUgSFQ0MCBjaGFubmVscyAqLwotCQkJaWYgKGN0eC0+aHQuZW5hYmxlZCAhPSBjb25mX2lzX2h0KGNvbmYpKSB7Ci0JCQkJY3R4LT5odC5lbmFibGVkID0gY29uZl9pc19odChjb25mKTsKLQkJCQlodF9jaGFuZ2VkW2N0eC0+Y3R4aWRdID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKLQkJCQlpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKSB7Ci0JCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7Ci0JCQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKLQkJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKLQkJCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOwotCQkJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOwotCi0JCQkvKgotCQkJICogRGVmYXVsdCB0byBubyBwcm90ZWN0aW9uLiBQcm90ZWN0aW9uIG1vZGUgd2lsbAotCQkJICogbGF0ZXIgYmUgc2V0IGZyb20gQlNTIGNvbmZpZyBpbiBpd2xfaHRfY29uZgotCQkJICovCi0JCQljdHgtPmh0LnByb3RlY3Rpb24gPQotCQkJCQlJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OX05PTkU7Ci0KLQkJCS8qIGlmIHdlIGFyZSBzd2l0Y2hpbmcgZnJvbSBodCB0byAyLjQgY2xlYXIgZmxhZ3MKLQkJCSAqIGZyb20gYW55IGh0IHJlbGF0ZWQgaW5mbyBzaW5jZSAyLjQgZG9lcyBub3QKLQkJCSAqIHN1cHBvcnQgaHQgKi8KLQkJCWlmICgobGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpICE9IGNoKSkKLQkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOwotCi0JCQlpd2xfbGVnYWN5X3NldF9yeG9uX2NoYW5uZWwocHJpdiwgY2hhbm5lbCwgY3R4KTsKLQkJCWl3bF9sZWdhY3lfc2V0X3J4b25faHQocHJpdiwgaHRfY29uZik7Ci0KLQkJCWl3bF9sZWdhY3lfc2V0X2ZsYWdzX2Zvcl9iYW5kKHByaXYsIGN0eCwgY2hhbm5lbC0+YmFuZCwKLQkJCQkJICAgICAgIGN0eC0+dmlmKTsKLQkJfQotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxlZ2FjeS0+dXBkYXRlX2JjYXN0X3N0YXRpb25zKQotCQkJcmV0ID0KLQkJCXByaXYtPmNmZy0+b3BzLT5sZWdhY3ktPnVwZGF0ZV9iY2FzdF9zdGF0aW9ucyhwcml2KTsKLQotIHNldF9jaF9vdXQ6Ci0JCS8qIFRoZSBsaXN0IG9mIHN1cHBvcnRlZCByYXRlcyBhbmQgcmF0ZSBtYXNrIGNhbiBiZSBkaWZmZXJlbnQKLQkJICogZm9yIGVhY2ggYmFuZDsgc2luY2UgdGhlIGJhbmQgbWF5IGhhdmUgY2hhbmdlZCwgcmVzZXQKLQkJICogdGhlIHJhdGUgbWFzayB0byB3aGF0IG1hYzgwMjExIGxpc3RzICovCi0JCWl3bF9sZWdhY3lfc2V0X3JhdGUocHJpdik7Ci0JfQotCi0JaWYgKGNoYW5nZWQgJiAoSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTIHwKLQkJCUlFRUU4MDIxMV9DT05GX0NIQU5HRV9JRExFKSkgewotCQlyZXQgPSBpd2xfbGVnYWN5X3Bvd2VyX3VwZGF0ZV9tb2RlKHByaXYsIGZhbHNlKTsKLQkJaWYgKHJldCkKLQkJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiRXJyb3Igc2V0dGluZyBzbGVlcCBsZXZlbFxuIik7Ci0JfQotCi0JaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUE9XRVIpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJUWCBQb3dlciBvbGQ9JWQgbmV3PSVkXG4iLAotCQkJcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQsIGNvbmYtPnBvd2VyX2xldmVsKTsKLQotCQlpd2xfbGVnYWN5X3NldF90eF9wb3dlcihwcml2LCBjb25mLT5wb3dlcl9sZXZlbCwgZmFsc2UpOwotCX0KLQotCWlmICghaXdsX2xlZ2FjeV9pc19yZWFkeShwcml2KSkgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gbm90IHJlYWR5XG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHNjYW5fYWN0aXZlKQotCQlnb3RvIG91dDsKLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCWlmIChtZW1jbXAoJmN0eC0+YWN0aXZlLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoY3R4LT5zdGFnaW5nKSkpCi0JCQlpd2xfbGVnYWN5X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JCWVsc2UKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJIk5vdCByZS1zZW5kaW5nIHNhbWUgUlhPTiBjb25maWd1cmF0aW9uLlxuIik7Ci0JCWlmIChodF9jaGFuZ2VkW2N0eC0+Y3R4aWRdKQotCQkJaXdsX2xlZ2FjeV91cGRhdGVfcW9zKHByaXYsIGN0eCk7Ci0JfQotCi1vdXQ6Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfY29uZmlnKTsKLQotdm9pZCBpd2xfbGVnYWN5X21hY19yZXNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JLyogSUJTUyBjYW4gb25seSBiZSB0aGUgSVdMX1JYT05fQ1RYX0JTUyBjb250ZXh0ICovCi0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCWlmIChXQVJOX09OKCFwcml2LT5jZmctPm9wcy0+bGVnYWN5KSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQltZW1zZXQoJnByaXYtPmN1cnJlbnRfaHRfY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9odF9jb25maWcpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogbmV3IGFzc29jaWF0aW9uIGdldCByaWQgb2YgaWJzcyBiZWFjb24gc2tiICovCi0JaWYgKHByaXYtPmJlYWNvbl9za2IpCi0JCWRldl9rZnJlZV9za2IocHJpdi0+YmVhY29uX3NrYik7Ci0KLQlwcml2LT5iZWFjb25fc2tiID0gTlVMTDsKLQotCXByaXYtPnRpbWVzdGFtcCA9IDA7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKTsKLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIG5vdCByZWFkeVxuIik7Ci0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogd2UgYXJlIHJlc3RhcnRpbmcgYXNzb2NpYXRpb24gcHJvY2VzcwotCSAqIGNsZWFyIFJYT05fRklMVEVSX0FTU09DX01TSyBiaXQKLQkgKi8KLQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JaXdsX2xlZ2FjeV9zZXRfcmF0ZShwcml2KTsKLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfbWFjX3Jlc2V0X3RzZik7Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfaHRfY29uZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfaHRfY29uZmlnICpodF9jb25mID0gJnByaXYtPmN1cnJlbnRfaHRfY29uZmlnOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmdmlmLT5ic3NfY29uZjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJlbnRlcjpcbiIpOwotCi0JaWYgKCFjdHgtPmh0LmVuYWJsZWQpCi0JCXJldHVybjsKLQotCWN0eC0+aHQucHJvdGVjdGlvbiA9Ci0JCWJzc19jb25mLT5odF9vcGVyYXRpb25fbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT047Ci0JY3R4LT5odC5ub25fZ2Zfc3RhX3ByZXNlbnQgPQotCQkhIShic3NfY29uZi0+aHRfb3BlcmF0aW9uX21vZGUgJgotCQkJCUlFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9HRl9TVEFfUFJTTlQpOwotCi0JaHRfY29uZi0+c2luZ2xlX2NoYWluX3N1ZmZpY2llbnQgPSBmYWxzZTsKLQotCXN3aXRjaCAodmlmLT50eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh2aWYsIGJzc19jb25mLT5ic3NpZCk7Ci0JCWlmIChzdGEpIHsKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnN0YS0+aHRfY2FwOwotCQkJaW50IG1heHN0cmVhbXM7Ci0KLQkJCW1heHN0cmVhbXMgPSAoaHRfY2FwLT5tY3MudHhfcGFyYW1zICYKLQkJCSAgICAgIElFRUU4MDIxMV9IVF9NQ1NfVFhfTUFYX1NUUkVBTVNfTUFTSykKLQkJCQk+PiBJRUVFODAyMTFfSFRfTUNTX1RYX01BWF9TVFJFQU1TX1NISUZUOwotCQkJbWF4c3RyZWFtcyArPSAxOwotCi0JCQlpZiAoKGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPT0gMCkgJiYKLQkJCSAgICAoaHRfY2FwLT5tY3MucnhfbWFza1syXSA9PSAwKSkKLQkJCQlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9IHRydWU7Ci0JCQlpZiAobWF4c3RyZWFtcyA8PSAxKQotCQkJCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJZiBhdCBhbGwsIHRoaXMgY2FuIG9ubHkgaGFwcGVuIHRocm91Z2ggYSByYWNlCi0JCQkgKiB3aGVuIHRoZSBBUCBkaXNjb25uZWN0cyB1cyB3aGlsZSB3ZSdyZSBzdGlsbAotCQkJICogc2V0dGluZyB1cCB0aGUgY29ubmVjdGlvbiwgaW4gdGhhdCBjYXNlIG1hYzgwMjExCi0JCQkgKiB3aWxsIHNvb24gdGVsbCB1cyBhYm91dCB0aGF0LgotCQkJICovCi0JCQlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9IHRydWU7Ci0JCX0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3NldF9ub19hc3NvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCS8qCi0JICogaW5mb3JtIHRoZSB1Y29kZSB0aGF0IHRoZXJlIGlzIG5vIGxvbmdlciBhbgotCSAqIGFzc29jaWF0aW9uIGFuZCB0aGF0IG5vIG1vcmUgcGFja2V0cyBzaG91bGQgYmUKLQkgKiBzZW50Ci0JICovCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IDA7Ci0JaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2JlYWNvbl91cGRhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTY0IHRpbWVzdGFtcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcsIHZpZik7Ci0KLQlpZiAoIXNrYikKLQkJcmV0dXJuOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoIXByaXYtPmJlYWNvbl9jdHgpIHsKLQkJSVdMX0VSUihwcml2LCAidXBkYXRlIGJlYWNvbiBidXQgbm8gYmVhY29uIGNvbnRleHQhXG4iKTsKLQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChwcml2LT5iZWFjb25fc2tiKQotCQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCi0JcHJpdi0+YmVhY29uX3NrYiA9IHNrYjsKLQotCXRpbWVzdGFtcCA9ICgoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2tiLT5kYXRhKS0+dS5iZWFjb24udGltZXN0YW1wOwotCXByaXYtPnRpbWVzdGFtcCA9IGxlNjRfdG9fY3B1KHRpbWVzdGFtcCk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIFJGIG5vdCByZWFkeVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2LT5jZmctPm9wcy0+bGVnYWN5LT5wb3N0X2Fzc29jaWF0ZShwcml2KTsKLX0KLQotdm9pZCBpd2xfbGVnYWN5X21hY19ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAotCQkJCSAgICAgdTMyIGNoYW5nZXMpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQlpbnQgcmV0OwotCi0JaWYgKFdBUk5fT04oIXByaXYtPmNmZy0+b3BzLT5sZWdhY3kpKQotCQlyZXR1cm47Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImNoYW5nZXMgPSAweCVYXG4iLCBjaGFuZ2VzKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbGl2ZShwcml2KSkgewotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfUU9TKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlID0gYnNzX2NvbmYtPnFvczsKLQkJaXdsX2xlZ2FjeV91cGRhdGVfcW9zKHByaXYsIGN0eCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKSB7Ci0JCS8qCi0JCSAqIHRoZSBhZGRfaW50ZXJmYWNlIGNvZGUgbXVzdCBtYWtlIHN1cmUgd2Ugb25seSBldmVyCi0JCSAqIGhhdmUgYSBzaW5nbGUgaW50ZXJmYWNlIHRoYXQgY291bGQgYmUgYmVhY29uaW5nIGF0Ci0JCSAqIGFueSB0aW1lLgotCQkgKi8KLQkJaWYgKHZpZi0+YnNzX2NvbmYuZW5hYmxlX2JlYWNvbikKLQkJCXByaXYtPmJlYWNvbl9jdHggPSBjdHg7Ci0JCWVsc2UKLQkJCXByaXYtPmJlYWNvbl9jdHggPSBOVUxMOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQlNTSUQpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJCU1NJRCAlcE1cbiIsIGJzc19jb25mLT5ic3NpZCk7Ci0KLQkJLyoKLQkJICogSWYgdGhlcmUgaXMgY3VycmVudGx5IGEgSFcgc2NhbiBnb2luZyBvbiBpbiB0aGUKLQkJICogYmFja2dyb3VuZCB0aGVuIHdlIG5lZWQgdG8gY2FuY2VsIGl0IGVsc2UgdGhlIFJYT04KLQkJICogYmVsb3cvaW4gcG9zdF9hc3NvY2lhdGUgd2lsbCBmYWlsLgotCQkgKi8KLQkJaWYgKGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApKSB7Ci0JCQlJV0xfV0FSTihwcml2LAotCQkJCSJBYm9ydGVkIHNjYW4gc3RpbGwgaW4gcHJvZ3Jlc3MgYWZ0ZXIgMTAwbXNcbiIpOwotCQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsCi0JCQkJImxlYXZpbmcgLSBzY2FuIGFib3J0IGZhaWxlZC5cbiIpOwotCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBtYWM4MDIxMSBvbmx5IHNldHMgYXNzb2Mgd2hlbiBpbiBTVEFUSU9OIG1vZGUgKi8KLQkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fCBic3NfY29uZi0+YXNzb2MpIHsKLQkJCW1lbWNweShjdHgtPnN0YWdpbmcuYnNzaWRfYWRkciwKLQkJCSAgICAgICBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKLQotCQkJLyogY3VycmVudGx5IG5lZWRlZCBpbiBhIGZldyBwbGFjZXMgKi8KLQkJCW1lbWNweShwcml2LT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JCX0gZWxzZSB7Ci0JCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9Ci0JCQkJflJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiBUaGlzIG5lZWRzIHRvIGJlIGFmdGVyIHNldHRpbmcgdGhlIEJTU0lEIGluIGNhc2UKLQkgKiBtYWM4MDIxMSBkZWNpZGVzIHRvIGRvIGJvdGggY2hhbmdlcyBhdCBvbmNlIGJlY2F1c2UKLQkgKiBpdCB3aWxsIGludm9rZSBwb3N0X2Fzc29jaWF0ZS4KLQkgKi8KLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmIGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CRUFDT04pCi0JCWl3bF9sZWdhY3lfYmVhY29uX3VwZGF0ZShodywgdmlmKTsKLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfRVJQX1BSRUFNQkxFKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiRVJQX1BSRUFNQkxFICVkXG4iLAotCQkJCSAgIGJzc19jb25mLT51c2Vfc2hvcnRfcHJlYW1ibGUpOwotCQlpZiAoYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSkKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LAotCQkJIkVSUF9DVFMgJWRcbiIsIGJzc19jb25mLT51c2VfY3RzX3Byb3QpOwotCQlpZiAoYnNzX2NvbmYtPnVzZV9jdHNfcHJvdCAmJgotCQkJKHByaXYtPmJhbmQgIT0gSUVFRTgwMjExX0JBTkRfNUdIWikpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLOwotCQllbHNlCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKLQkJaWYgKGJzc19jb25mLT51c2VfY3RzX3Byb3QpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0VMRl9DVFNfRU47Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0VMRl9DVFNfRU47Ci0JfQotCi0JaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CQVNJQ19SQVRFUykgewotCQkvKiBYWFggdXNlIHRoaXMgaW5mb3JtYXRpb24KLQkJICoKLQkJICogVG8gZG8gdGhhdCwgcmVtb3ZlIGNvZGUgZnJvbSBpd2xfbGVnYWN5X3NldF9yYXRlKCkgYW5kIHB1dCBzb21ldGhpbmcKLQkJICogbGlrZSB0aGlzIGhlcmU6Ci0JCSAqCi0JCWlmIChBLWJhbmQpCi0JCQljdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9Ci0JCQkJYnNzX2NvbmYtPmJhc2ljX3JhdGVzOwotCQllbHNlCi0JCQljdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9Ci0JCQkJYnNzX2NvbmYtPmJhc2ljX3JhdGVzID4+IDQ7Ci0JCQljdHgtPnN0YWdpbmcuY2NrX2Jhc2ljX3JhdGVzID0KLQkJCQlic3NfY29uZi0+YmFzaWNfcmF0ZXMgJiAweEY7Ci0JCSAqLwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfSFQpIHsKLQkJaXdsX2xlZ2FjeV9odF9jb25mKHByaXYsIHZpZik7Ci0KLQkJaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJBU1NPQyAlZFxuIiwgYnNzX2NvbmYtPmFzc29jKTsKLQkJaWYgKGJzc19jb25mLT5hc3NvYykgewotCQkJcHJpdi0+dGltZXN0YW1wID0gYnNzX2NvbmYtPnRpbWVzdGFtcDsKLQotCQkJaWYgKCFpd2xfbGVnYWN5X2lzX3Jma2lsbChwcml2KSkKLQkJCQlwcml2LT5jZmctPm9wcy0+bGVnYWN5LT5wb3N0X2Fzc29jaWF0ZShwcml2KTsKLQkJfSBlbHNlCi0JCQlpd2xfbGVnYWN5X3NldF9ub19hc3NvYyhwcml2LCB2aWYpOwotCX0KLQotCWlmIChjaGFuZ2VzICYmIGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSAmJiBic3NfY29uZi0+YWlkKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiQ2hhbmdlcyAoJSN4KSB3aGlsZSBhc3NvY2lhdGVkXG4iLAotCQkJCSAgIGNoYW5nZXMpOwotCQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfcnhvbl9hc3NvYyhwcml2LCBjdHgpOwotCQlpZiAoIXJldCkgewotCQkJLyogU3luYyBhY3RpdmVfcnhvbiB3aXRoIGxhdGVzdCBjaGFuZ2UuICovCi0JCQltZW1jcHkoKHZvaWQgKikmY3R4LT5hY3RpdmUsCi0JCQkJJmN0eC0+c3RhZ2luZywKLQkJCQlzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQpKTsKLQkJfQotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpIHsKLQkJaWYgKHZpZi0+YnNzX2NvbmYuZW5hYmxlX2JlYWNvbikgewotCQkJbWVtY3B5KGN0eC0+c3RhZ2luZy5ic3NpZF9hZGRyLAotCQkJICAgICAgIGJzc19jb25mLT5ic3NpZCwgRVRIX0FMRU4pOwotCQkJbWVtY3B5KHByaXYtPmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKLQkJCXByaXYtPmNmZy0+b3BzLT5sZWdhY3ktPmNvbmZpZ19hcChwcml2KTsKLQkJfSBlbHNlCi0JCQlpd2xfbGVnYWN5X3NldF9ub19hc3NvYyhwcml2LCB2aWYpOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfSUJTUykgewotCQlyZXQgPSBwcml2LT5jZmctPm9wcy0+bGVnYWN5LT5tYW5hZ2VfaWJzc19zdGF0aW9uKHByaXYsIHZpZiwKLQkJCQkJCQlic3NfY29uZi0+aWJzc19qb2luZWQpOwotCQlpZiAocmV0KQotCQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvICVzIElCU1Mgc3RhdGlvbiAlcE1cbiIsCi0JCQkJYnNzX2NvbmYtPmlic3Nfam9pbmVkID8gImFkZCIgOiAicmVtb3ZlIiwKLQkJCQlic3NfY29uZi0+YnNzaWQpOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfbWFjX2Jzc19pbmZvX2NoYW5nZWQpOwotCi1pcnFyZXR1cm5fdCBpd2xfbGVnYWN5X2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRhdGE7Ci0JdTMyIGludGEsIGludGFfbWFzazsKLQl1MzIgaW50YV9maDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWlmICghcHJpdikKLQkJcmV0dXJuIElSUV9OT05FOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIERpc2FibGUgKGJ1dCBkb24ndCBjbGVhciEpIGludGVycnVwdHMgaGVyZSB0byBhdm9pZAotCSAqICAgIGJhY2stdG8tYmFjayBJU1JzIGFuZCBzcG9yYWRpYyBpbnRlcnJ1cHRzIGZyb20gb3VyIE5JQy4KLQkgKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyB0byBzZXJ2aWNlLCB0aGUgdGFza2xldCB3aWxsIHJlLWVuYWJsZSBpbnRzLgotCSAqIElmIHdlICpkb24ndCogaGF2ZSBzb21ldGhpbmcsIHdlJ2xsIHJlLWVuYWJsZSBiZWZvcmUgbGVhdmluZyBoZXJlLiAqLwotCWludGFfbWFzayA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVF9NQVNLKTsgIC8qIGp1c3QgZm9yIGRlYnVnICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVF9NQVNLLCAweDAwMDAwMDAwKTsKLQotCS8qIERpc2NvdmVyIHdoaWNoIGludGVycnVwdHMgYXJlIGFjdGl2ZS9wZW5kaW5nICovCi0JaW50YSA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVCk7Ci0JaW50YV9maCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMpOwotCi0JLyogSWdub3JlIGludGVycnVwdCBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gTklDIHRvIHNlcnZpY2UuCi0JICogVGhpcyBtYXkgYmUgZHVlIHRvIElSUSBzaGFyZWQgd2l0aCBhbm90aGVyIGRldmljZSwKLQkgKiBvciBkdWUgdG8gc3BvcmFkaWMgaW50ZXJydXB0cyB0aHJvd24gZnJvbSBvdXIgTklDLiAqLwotCWlmICghaW50YSAmJiAhaW50YV9maCkgewotCQlJV0xfREVCVUdfSVNSKHByaXYsCi0JCQkiSWdub3JlIGludGVycnVwdCwgaW50YSA9PSAwLCBpbnRhX2ZoID09IDBcbiIpOwotCQlnb3RvIG5vbmU7Ci0JfQotCi0JaWYgKChpbnRhID09IDB4RkZGRkZGRkYpIHx8ICgoaW50YSAmIDB4RkZGRkZGRjApID09IDB4YTVhNWE1YTApKSB7Ci0JCS8qIEhhcmR3YXJlIGRpc2FwcGVhcmVkLiBJdCBtaWdodCBoYXZlIGFscmVhZHkgcmFpc2VkCi0JCSAqIGFuIGludGVycnVwdCAqLwotCQlJV0xfV0FSTihwcml2LCAiSEFSRFdBUkUgR09ORT8/IElOVEEgPT0gMHglMDh4XG4iLCBpbnRhKTsKLQkJZ290byB1bnBsdWdnZWQ7Ci0JfQotCi0JSVdMX0RFQlVHX0lTUihwcml2LCAiSVNSIGludGEgMHglMDh4LCBlbmFibGVkIDB4JTA4eCwgZmggMHglMDh4XG4iLAotCQkgICAgICBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgpOwotCi0JaW50YSAmPSB+Q1NSX0lOVF9CSVRfU0NEOwotCi0JLyogaXdsX2lycV90YXNrbGV0KCkgd2lsbCBzZXJ2aWNlIGludGVycnVwdHMgYW5kIHJlLWVuYWJsZSB0aGVtICovCi0JaWYgKGxpa2VseShpbnRhIHx8IGludGFfZmgpKQotCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfdGFza2xldCk7Ci0KLXVucGx1Z2dlZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotCi1ub25lOgotCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGhlcmUgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBzZXJ2aWNlLiAqLwotCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpKQotCQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfaXNyKTsKLQotLyoKLSAqICBpd2xfbGVnYWN5X3R4X2NtZF9wcm90ZWN0aW9uOiBTZXQgcnRzL2N0cy4gMzk0NSBhbmQgNDk2NSBvbmx5IHNoYXJlIHRoaXMKLSAqICBmdW5jdGlvbi4KLSAqLwotdm9pZCBpd2xfbGVnYWN5X3R4X2NtZF9wcm90ZWN0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkgICAgICAgX19sZTE2IGZjLCBfX2xlMzIgKnR4X2ZsYWdzKQotewotCWlmIChpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7Ci0JCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX1JUU19NU0s7Ci0JCSp0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19DVFNfTVNLOwotCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19GVUxMX1RYT1BfUFJPVF9NU0s7Ci0KLQkJaWYgKCFpZWVlODAyMTFfaXNfbWdtdChmYykpCi0JCQlyZXR1cm47Ci0KLQkJc3dpdGNoIChmYyAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1NUWVBFKSkgewotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVVRIKToKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfREVBVVRIKToKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRKToKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEpOgotCQkJKnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX1JUU19NU0s7Ci0JCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19DVFNfTVNLOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJgotCQkgICBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUKSB7Ci0JCSp0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19SVFNfTVNLOwotCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19DVFNfTVNLOwotCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19GVUxMX1RYT1BfUFJPVF9NU0s7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4X2NtZF9wcm90ZWN0aW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTI3MWZlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF9sZWdhY3lfY29yZV9oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X2NvcmVfaF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGZvcndhcmQgZGVjbGFyYXRpb25zICoKLSAqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgaXdsX2hvc3RfY21kOwotc3RydWN0IGl3bF9jbWQ7Ci0KLQotI2RlZmluZSBJV0xXSUZJX1ZFUlNJT04gImluLXRyZWU6IgotI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0yMDExIEludGVsIENvcnBvcmF0aW9uIgotI2RlZmluZSBEUlZfQVVUSE9SICAgICAiPGlsd0BsaW51eC5pbnRlbC5jb20+IgotCi0jZGVmaW5lIElXTF9QQ0lfREVWSUNFKGRldiwgc3ViZGV2LCBjZmcpIFwKLQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwgIC5kZXZpY2UgPSAoZGV2KSwgXAotCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCAuc3ViZGV2aWNlID0gKHN1YmRldiksIFwKLQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpJihjZmcpCi0KLSNkZWZpbmUgVElNRV9VTklUCQkxMDI0Ci0KLSNkZWZpbmUgSVdMX1NLVV9HICAgICAgIDB4MQotI2RlZmluZSBJV0xfU0tVX0EgICAgICAgMHgyCi0jZGVmaW5lIElXTF9TS1VfTiAgICAgICAweDgKLQotI2RlZmluZSBJV0xfQ01EKHgpIGNhc2UgeDogcmV0dXJuICN4Ci0KLXN0cnVjdCBpd2xfaGNtZF9vcHMgewotCWludCAoKnJ4b25fYXNzb2MpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci0JaW50ICgqY29tbWl0X3J4b24pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci0Jdm9pZCAoKnNldF9yeG9uX2NoYWluKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci19OwotCi1zdHJ1Y3QgaXdsX2hjbWRfdXRpbHNfb3BzIHsKLQl1MTYgKCpnZXRfaGNtZF9zaXplKSh1OCBjbWRfaWQsIHUxNiBsZW4pOwotCXUxNiAoKmJ1aWxkX2FkZHN0YV9oY21kKShjb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kICpjbWQsCi0JCQkJCQkJCXU4ICpkYXRhKTsKLQlpbnQgKCpyZXF1ZXN0X3NjYW4pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci0Jdm9pZCAoKnBvc3Rfc2Nhbikoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLX07Ci0KLXN0cnVjdCBpd2xfYXBtX29wcyB7Ci0JaW50ICgqaW5pdCkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQl2b2lkICgqY29uZmlnKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotfTsKLQotc3RydWN0IGl3bF9kZWJ1Z2ZzX29wcyB7Ci0Jc3NpemVfdCAoKnJ4X3N0YXRzX3JlYWQpKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLQlzc2l6ZV90ICgqdHhfc3RhdHNfcmVhZCkoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCXNzaXplX3QgKCpnZW5lcmFsX3N0YXRzX3JlYWQpKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotfTsKLQotc3RydWN0IGl3bF90ZW1wX29wcyB7Ci0Jdm9pZCAoKnRlbXBlcmF0dXJlKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotfTsKLQotc3RydWN0IGl3bF9saWJfb3BzIHsKLQkvKiBzZXQgaHcgZGVwZW5kZW50IHBhcmFtZXRlcnMgKi8KLQlpbnQgKCpzZXRfaHdfcGFyYW1zKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIEhhbmRsaW5nIFRYICovCi0Jdm9pZCAoKnR4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkJdTE2IGJ5dGVfY250KTsKLQlpbnQgKCp0eHFfYXR0YWNoX2J1Zl90b190ZmQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkgICAgIGRtYV9hZGRyX3QgYWRkciwKLQkJCQkgICAgIHUxNiBsZW4sIHU4IHJlc2V0LCB1OCBwYWQpOwotCXZvaWQgKCp0eHFfZnJlZV90ZmQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKLQlpbnQgKCp0eHFfaW5pdCkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKLQkvKiBzZXR1cCBSeCBoYW5kbGVyICovCi0Jdm9pZCAoKnJ4X2hhbmRsZXJfc2V0dXApKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0JLyogYWxpdmUgbm90aWZpY2F0aW9uIGFmdGVyIGluaXQgdUNvZGUgbG9hZCAqLwotCXZvaWQgKCppbml0X2FsaXZlX3N0YXJ0KShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIGNoZWNrIHZhbGlkaXR5IG9mIHJ0YyBkYXRhIGFkZHJlc3MgKi8KLQlpbnQgKCppc192YWxpZF9ydGNfZGF0YV9hZGRyKSh1MzIgYWRkcik7Ci0JLyogMXN0IHVjb2RlIGxvYWQgKi8KLQlpbnQgKCpsb2FkX3Vjb2RlKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0Jdm9pZCAoKmR1bXBfbmljX2Vycm9yX2xvZykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQlpbnQgKCpkdW1wX2ZoKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNoYXIgKipidWYsIGJvb2wgZGlzcGxheSk7Ci0JaW50ICgqc2V0X2NoYW5uZWxfc3dpdGNoKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpOwotCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KLQlzdHJ1Y3QgaXdsX2FwbV9vcHMgYXBtX29wczsKLQotCS8qIHBvd2VyICovCi0JaW50ICgqc2VuZF90eF9wb3dlcikgKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0Jdm9pZCAoKnVwZGF0ZV9jaGFpbl9mbGFncykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotCS8qIGVlcHJvbSBvcGVyYXRpb25zIChhcyBkZWZpbmVkIGluIGl3bC1lZXByb20uaCkgKi8KLQlzdHJ1Y3QgaXdsX2VlcHJvbV9vcHMgZWVwcm9tX29wczsKLQotCS8qIHRlbXBlcmF0dXJlICovCi0Jc3RydWN0IGl3bF90ZW1wX29wcyB0ZW1wX29wczsKLQotCXN0cnVjdCBpd2xfZGVidWdmc19vcHMgZGVidWdmc19vcHM7Ci0KLX07Ci0KLXN0cnVjdCBpd2xfbGVkX29wcyB7Ci0JaW50ICgqY21kKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfbGVkX2NtZCAqbGVkX2NtZCk7Ci19OwotCi1zdHJ1Y3QgaXdsX2xlZ2FjeV9vcHMgewotCXZvaWQgKCpwb3N0X2Fzc29jaWF0ZSkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQl2b2lkICgqY29uZmlnX2FwKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIHN0YXRpb24gbWFuYWdlbWVudCAqLwotCWludCAoKnVwZGF0ZV9iY2FzdF9zdGF0aW9ucykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQlpbnQgKCptYW5hZ2VfaWJzc19zdGF0aW9uKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBhZGQpOwotfTsKLQotc3RydWN0IGl3bF9vcHMgewotCWNvbnN0IHN0cnVjdCBpd2xfbGliX29wcyAqbGliOwotCWNvbnN0IHN0cnVjdCBpd2xfaGNtZF9vcHMgKmhjbWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9oY21kX3V0aWxzX29wcyAqdXRpbHM7Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWRfb3BzICpsZWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9uaWNfb3BzICpuaWM7Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfb3BzICpsZWdhY3k7Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgKmllZWU4MDIxMV9vcHM7Ci19OwotCi1zdHJ1Y3QgaXdsX21vZF9wYXJhbXMgewotCWludCBzd19jcnlwdG87CQkvKiBkZWY6IDAgPSB1c2luZyBoYXJkd2FyZSBlbmNyeXB0aW9uICovCi0JaW50IGRpc2FibGVfaHdfc2NhbjsJLyogZGVmOiAwID0gdXNlIGgvdyBzY2FuICovCi0JaW50IG51bV9vZl9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCi0JaW50IGRpc2FibGVfMTFuOwkvKiBkZWY6IDAgPSAxMW4gY2FwYWJpbGl0aWVzIGVuYWJsZWQgKi8KLQlpbnQgYW1zZHVfc2l6ZV84SzsJLyogZGVmOiAxID0gZW5hYmxlIDhLIGFtc2R1IHNpemUgKi8KLQlpbnQgYW50ZW5uYTsgIAkJLyogZGVmOiAwID0gYm90aCBhbnRlbm5hcyAodXNlIGRpdmVyc2l0eSkgKi8KLQlpbnQgcmVzdGFydF9mdzsJCS8qIGRlZjogMSA9IHJlc3RhcnQgZmlybXdhcmUgKi8KLX07Ci0KLS8qCi0gKiBAbGVkX2NvbXBlbnNhdGlvbjogY29tcGVuc2F0ZSBvbiB0aGUgbGVkIG9uL29mZiB0aW1lIHBlciBIVyBhY2NvcmRpbmcKLSAqCXRvIHRoZSBkZXZpYXRpb24gdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBsZWQgZnJlcXVlbmN5LgotICoJVGhlIGRldGFpbCBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIGl3bC1sZWQuYwotICogQGNoYWluX25vaXNlX251bV9iZWFjb25zOiBudW1iZXIgb2YgYmVhY29ucyB1c2VkIHRvIGNvbXB1dGUgY2hhaW4gbm9pc2UKLSAqIEB3ZF90aW1lb3V0OiBUWCBxdWV1ZXMgd2F0Y2hkb2cgdGltZW91dAotICogQHRlbXBlcmF0dXJlX2tlbHZpbjogdGVtcGVyYXR1cmUgcmVwb3J0IGJ5IHVDb2RlIGluIGtlbHZpbgotICogQHVjb2RlX3RyYWNpbmc6IHN1cHBvcnQgdWNvZGUgY29udGludW91cyB0cmFjaW5nCi0gKiBAc2Vuc2l0aXZpdHlfY2FsaWJfYnlfZHJpdmVyOiBkcml2ZXIgaGFzIHRoZSBjYXBhYmlsaXR5IHRvIHBlcmZvcm0KLSAqCXNlbnNpdGl2aXR5IGNhbGlicmF0aW9uIG9wZXJhdGlvbgotICogQGNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcjogZHJpdmVyIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBwZXJmb3JtCi0gKgljaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBvcGVyYXRpb24KLSAqLwotc3RydWN0IGl3bF9iYXNlX3BhcmFtcyB7Ci0JaW50IGVlcHJvbV9zaXplOwotCWludCBudW1fb2ZfcXVldWVzOwkvKiBkZWY6IEhXIGRlcGVuZGVudCAqLwotCWludCBudW1fb2ZfYW1wZHVfcXVldWVzOy8qIGRlZjogSFcgZGVwZW5kZW50ICovCi0JLyogZm9yIGl3bF9sZWdhY3lfYXBtX2luaXQoKSAqLwotCXUzMiBwbGxfY2ZnX3ZhbDsKLQlib29sIHNldF9sMHM7Ci0JYm9vbCB1c2VfYnNtOwotCi0JdTE2IGxlZF9jb21wZW5zYXRpb247Ci0JaW50IGNoYWluX25vaXNlX251bV9iZWFjb25zOwotCXVuc2lnbmVkIGludCB3ZF90aW1lb3V0OwotCWJvb2wgdGVtcGVyYXR1cmVfa2VsdmluOwotCWNvbnN0IGJvb2wgdWNvZGVfdHJhY2luZzsKLQljb25zdCBib29sIHNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcjsKLQljb25zdCBib29sIGNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcjsKLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF9jZmcKLSAqIEBmd19uYW1lX3ByZTogRmlybXdhcmUgZmlsZW5hbWUgcHJlZml4LiBUaGUgYXBpIHZlcnNpb24gYW5kIGV4dGVuc2lvbgotICoJKC51Y29kZSkgd2lsbCBiZSBhZGRlZCB0byBmaWxlbmFtZSBiZWZvcmUgbG9hZGluZyBmcm9tIGRpc2suIFRoZQotICoJZmlsZW5hbWUgaXMgY29uc3RydWN0ZWQgYXMgZndfbmFtZV9wcmU8YXBpPi51Y29kZS4KLSAqIEB1Y29kZV9hcGlfbWF4OiBIaWdoZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCi0gKiBAdWNvZGVfYXBpX21pbjogTG93ZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCi0gKiBAc2Nhbl9hbnRlbm5hczogYXZhaWxhYmxlIGFudGVubmEgZm9yIHNjYW4gb3BlcmF0aW9uCi0gKiBAbGVkX21vZGU6IDA9YmxpbmtpbmcsIDE9T24oUkYgT24pL09mZihSRiBPZmYpCi0gKgotICogV2UgZW5hYmxlIHRoZSBkcml2ZXIgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3cnQgQVBJIHZlcnNpb24uIFRoZQotICogZHJpdmVyIHNwZWNpZmllcyB3aGljaCBBUElzIGl0IHN1cHBvcnRzICh3aXRoIEB1Y29kZV9hcGlfbWF4IGJlaW5nIHRoZQotICogaGlnaGVzdCBhbmQgQHVjb2RlX2FwaV9taW4gdGhlIGxvd2VzdCkuIEZpcm13YXJlIHdpbGwgb25seSBiZSBsb2FkZWQgaWYKLSAqIGl0IGhhcyBhIHN1cHBvcnRlZCBBUEkgdmVyc2lvbi4gVGhlIGZpcm13YXJlJ3MgQVBJIHZlcnNpb24gd2lsbCBiZQotICogc3RvcmVkIGluIEBpd2xfcHJpdiwgZW5hYmxpbmcgdGhlIGRyaXZlciB0byBtYWtlIHJ1bnRpbWUgY2hhbmdlcyBiYXNlZAotICogb24gZmlybXdhcmUgdmVyc2lvbiB1c2VkLgotICoKLSAqIEZvciBleGFtcGxlLAotICogaWYgKElXTF9VQ09ERV9BUEkocHJpdi0+dWNvZGVfdmVyKSA+PSAyKSB7Ci0gKglEcml2ZXIgaW50ZXJhY3RzIHdpdGggRmlybXdhcmUgQVBJIHZlcnNpb24gPj0gMi4KLSAqIH0gZWxzZSB7Ci0gKglEcml2ZXIgaW50ZXJhY3RzIHdpdGggRmlybXdhcmUgQVBJIHZlcnNpb24gMS4KLSAqIH0KLSAqCi0gKiBUaGUgaWRlYWwgdXNhZ2Ugb2YgdGhpcyBpbmZyYXN0cnVjdHVyZSBpcyB0byB0cmVhdCBhIG5ldyB1Y29kZSBBUEkKLSAqIHJlbGVhc2UgYXMgYSBuZXcgaGFyZHdhcmUgcmV2aXNpb24uIFRoYXQgaXMsIHRocm91Z2ggdXRpbGl6aW5nIHRoZQotICogaXdsX2hjbWRfdXRpbHNfb3BzIGV0Yy4gd2UgYWNjb21tb2RhdGUgZGlmZmVyZW50IGNvbW1hbmQgc3RydWN0dXJlcwotICogYW5kIGZsb3dzIGJldHdlZW4gaGFyZHdhcmUgdmVyc2lvbnMgYXMgd2VsbCBhcyB0aGVpciBBUEkKLSAqIHZlcnNpb25zLgotICoKLSAqLwotc3RydWN0IGl3bF9jZmcgewotCS8qIHBhcmFtcyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIGRldmljZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCi0JY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICpmd19uYW1lX3ByZTsKLQljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21heDsKLQljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21pbjsKLQl1OCAgIHZhbGlkX3R4X2FudDsKLQl1OCAgIHZhbGlkX3J4X2FudDsKLQl1bnNpZ25lZCBpbnQgc2t1OwotCXUxNiAgZWVwcm9tX3ZlcjsKLQl1MTYgIGVlcHJvbV9jYWxpYl92ZXI7Ci0JY29uc3Qgc3RydWN0IGl3bF9vcHMgKm9wczsKLQkvKiBtb2R1bGUgYmFzZWQgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgc2V0IGZyb20gbW9kcHJvYmUgY21kICovCi0JY29uc3Qgc3RydWN0IGl3bF9tb2RfcGFyYW1zICptb2RfcGFyYW1zOwotCS8qIHBhcmFtcyBub3QgbGlrZWx5IHRvIGNoYW5nZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCi0Jc3RydWN0IGl3bF9iYXNlX3BhcmFtcyAqYmFzZV9wYXJhbXM7Ci0JLyogcGFyYW1zIGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLwotCXU4IHNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX05VTV9CQU5EU107Ci0JZW51bSBpd2xfbGVkX21vZGUgbGVkX21vZGU7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgIEwgaSBiICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfbGVnYWN5X2FsbG9jX2FsbChzdHJ1Y3QgaXdsX2NmZyAqY2ZnKTsKLWludCBpd2xfbGVnYWN5X21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTE2IHF1ZXVlLAotCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcyk7Ci1pbnQgaXdsX2xlZ2FjeV9tYWNfdHhfbGFzdF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotdm9pZCBpd2xfbGVnYWN5X3NldF9yeG9uX2h3Y3J5cHRvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQlpbnQgaHdfZGVjcnlwdCk7Ci1pbnQgaXdsX2xlZ2FjeV9jaGVja19yeG9uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLWludCBpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLWludCBpd2xfbGVnYWN5X3NldF9yeG9uX2NoYW5uZWwoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaCwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotdm9pZCBpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCSAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci11OCBpd2xfbGVnYWN5X2dldF9zaW5nbGVfY2hhbm5lbF9udW1iZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKTsKLXZvaWQgaXdsX2xlZ2FjeV9zZXRfcnhvbl9odChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZik7Ci1ib29sIGl3bF9sZWdhY3lfaXNfaHQ0MF90eF9hbGxvd2VkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKTsKLXZvaWQgaXdsX2xlZ2FjeV9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLXZvaWQgaXdsX2xlZ2FjeV9zZXRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfc2V0X2RlY3J5cHRlZF9mbGFnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkgICB1MzIgZGVjcnlwdF9yZXMsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHMpOwotdm9pZCBpd2xfbGVnYWN5X2lycV9oYW5kbGVfZXJyb3Ioc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X21hY19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLXZvaWQgaXdsX2xlZ2FjeV9tYWNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotaW50IGl3bF9sZWdhY3lfbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApOwotaW50IGl3bF9sZWdhY3lfYWxsb2NfdHhxX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X3R4cV9tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi1pbnQgaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9yZXNldF90cmFmZmljX2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X2RiZ19sb2dfdHhfZGF0YV9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJdTE2IGxlbmd0aCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcik7Ci12b2lkIGl3bF9sZWdhY3lfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQl1MTYgbGVuZ3RoLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKTsKLWNvbnN0IGNoYXIgKml3bF9sZWdhY3lfZ2V0X21nbXRfc3RyaW5nKGludCBjbWQpOwotY29uc3QgY2hhciAqaXdsX2xlZ2FjeV9nZXRfY3RybF9zdHJpbmcoaW50IGNtZCk7Ci12b2lkIGl3bF9sZWdhY3lfY2xlYXJfdHJhZmZpY19zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgaXNfdHgsIF9fbGUxNiBmYywKLQkJICAgICAgdTE2IGxlbik7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3Jlc2V0X3RyYWZmaWNfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2RiZ19sb2dfdHhfZGF0YV9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgIHUxNiBsZW5ndGgsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCi17Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9kYmdfbG9nX3J4X2RhdGFfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICB1MTYgbGVuZ3RoLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQotewotfQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBpc190eCwKLQkJCQkgICAgX19sZTE2IGZjLCB1MTYgbGVuKQotewotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJYIGhhbmRsZXJzLgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bF9sZWdhY3lfcnhfcG1fc2xlZXBfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotdm9pZCBpd2xfbGVnYWN5X3J4X3BtX2RlYnVnX3N0YXRpc3RpY3Nfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLXZvaWQgaXdsX2xlZ2FjeV9yeF9yZXBseV9lcnJvcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBSWAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpd2xfbGVnYWN5X2NtZF9xdWV1ZV91bm1hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X2NtZF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2xlZ2FjeV9yeF9xdWV1ZV9hbGxvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcSk7Ci1pbnQgaXdsX2xlZ2FjeV9yeF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpxKTsKLXZvaWQgaXdsX2xlZ2FjeV90eF9jbWRfY29tcGxldGUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLS8qIEhhbmRsZXJzICovCi12b2lkIGl3bF9sZWdhY3lfcnhfc3BlY3RydW1fbWVhc3VyZV9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotdm9pZCBpd2xfbGVnYWN5X3JlY292ZXJfZnJvbV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KTsKLXZvaWQgaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBpc19zdWNjZXNzKTsKLXZvaWQgaXdsX2xlZ2FjeV9yeF9jc2Eoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci0KLS8qIFRYIGhlbHBlcnMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFRYCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bF9sZWdhY3lfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwotaW50IGl3bF9sZWdhY3lfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJICAgICAgaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCk7Ci12b2lkIGl3bF9sZWdhY3lfdHhfcXVldWVfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkJaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCk7Ci12b2lkIGl3bF9sZWdhY3lfdHhfcXVldWVfdW5tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKTsKLXZvaWQgaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCk7Ci12b2lkIGl3bF9sZWdhY3lfc2V0dXBfd2F0Y2hkb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVFggcG93ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgczggdHhfcG93ZXIsIGJvb2wgZm9yY2UpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTggaXdsX2xlZ2FjeV9nZXRfbG93ZXN0X3BsY3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2Nhbm5pbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bF9sZWdhY3lfaW5pdF9zY2FuX3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWwoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1bnNpZ25lZCBsb25nIG1zKTsKLXZvaWQgaXdsX2xlZ2FjeV9mb3JjZV9zY2FuX2VuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKTsKLXZvaWQgaXdsX2xlZ2FjeV9pbnRlcm5hbF9zaG9ydF9od19zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2xlZ2FjeV9mb3JjZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgZXh0ZXJuYWwpOwotdTE2IGl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICpmcmFtZSwKLQkJICAgICAgIGNvbnN0IHU4ICp0YSwgY29uc3QgdTggKmllLCBpbnQgaWVfbGVuLCBpbnQgbGVmdCk7Ci12b2lkIGl3bF9sZWdhY3lfc2V0dXBfcnhfc2Nhbl9oYW5kbGVycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdTE2IGl3bF9sZWdhY3lfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCSAgICAgIHU4IG5fcHJvYmVzKTsKLXUxNiBpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLXZvaWQgaXdsX2xlZ2FjeV9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qIEZvciBmYXN0ZXIgYWN0aXZlIHNjYW5uaW5nLCBzY2FuIHdpbGwgbW92ZSB0byB0aGUgbmV4dCBjaGFubmVsIGlmIGZld2VyIHRoYW4KLSAqIFBMQ1BfUVVJRVRfVEhSRVNIIHBhY2tldHMgYXJlIGhlYXJkIG9uIHRoaXMgY2hhbm5lbCB3aXRoaW4KLSAqIEFDVElWRV9RVUlFVF9USU1FIGFmdGVyIHNlbmRpbmcgcHJvYmUgcmVxdWVzdC4gIFRoaXMgc2hvcnRlbnMgdGhlIGR3ZWxsCi0gKiB0aW1lIGlmIGl0J3MgYSBxdWlldCBjaGFubmVsIChub3RoaW5nIHJlc3BvbmRlZCB0byBvdXIgcHJvYmUsIGFuZCB0aGVyZSdzCi0gKiBubyBvdGhlciB0cmFmZmljKS4KLSAqIERpc2FibGUgInF1aWV0IiBmZWF0dXJlIGJ5IHNldHRpbmcgUExDUF9RVUlFVF9USFJFU0ggdG8gMC4gKi8KLSNkZWZpbmUgSVdMX0FDVElWRV9RVUlFVF9USU1FICAgICAgIGNwdV90b19sZTE2KDEwKSAgLyogbXNlYyAqLwotI2RlZmluZSBJV0xfUExDUF9RVUlFVF9USFJFU0ggICAgICAgY3B1X3RvX2xlMTYoMSkgIC8qIHBhY2tldHMgKi8KLQotI2RlZmluZSBJV0xfU0NBTl9DSEVDS19XQVRDSERPRwkJKEhaICogNykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgIFMgZSBuIGQgaSBuIGcgICAgIEggbyBzIHQgICAgIEMgbyBtIG0gYSBuIGQgcyAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgY2hhciAqaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyh1OCBjbWQpOwotaW50IF9fbXVzdF9jaGVjayBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCk7Ci1pbnQgaXdsX2xlZ2FjeV9zZW5kX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCk7Ci1pbnQgX19tdXN0X2NoZWNrIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaWQsCi0JCQkJICB1MTYgbGVuLCBjb25zdCB2b2lkICpkYXRhKTsKLWludCBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdV9hc3luYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IGlkLCB1MTYgbGVuLAotCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCSAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KSk7Ci0KLWludCBpd2xfbGVnYWN5X2VucXVldWVfaGNtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQQ0kJCQkJCQkgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGlubGluZSB1MTYgaXdsX2xlZ2FjeV9wY2llX2xpbmtfY3RsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcG9zOwotCXUxNiBwY2lfbG5rX2N0bDsKLQlwb3MgPSBwY2lfcGNpZV9jYXAocHJpdi0+cGNpX2Rldik7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQocHJpdi0+cGNpX2RldiwgcG9zICsgUENJX0VYUF9MTktDVEwsICZwY2lfbG5rX2N0bCk7Ci0JcmV0dXJuIHBjaV9sbmtfY3RsOwotfQotCi12b2lkIGl3bF9sZWdhY3lfYmdfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKTsKLXUzMiBpd2xfbGVnYWN5X3VzZWNzX3RvX2JlYWNvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQl1MzIgdXNlYywgdTMyIGJlYWNvbl9pbnRlcnZhbCk7Ci1fX2xlMzIgaXdsX2xlZ2FjeV9hZGRfYmVhY29uX3RpbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgYmFzZSwKLQkJCSAgIHUzMiBhZGRvbiwgdTMyIGJlYWNvbl9pbnRlcnZhbCk7Ci0KLSNpZmRlZiBDT05GSUdfUE0KLWludCBpd2xfbGVnYWN5X3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7Ci1pbnQgaXdsX2xlZ2FjeV9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaXdsX2xlZ2FjeV9wbV9vcHM7Ci0KLSNkZWZpbmUgSVdMX0xFR0FDWV9QTV9PUFMJKCZpd2xfbGVnYWN5X3BtX29wcykKLQotI2Vsc2UgLyogIUNPTkZJR19QTSAqLwotCi0jZGVmaW5lIElXTF9MRUdBQ1lfUE1fT1BTCU5VTEwKLQotI2VuZGlmIC8qICFDT05GSUdfUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBFcnJvciBIYW5kbGluZyBEZWJ1Z2dpbmcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaXdsNDk2NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXZvaWQgaXdsX2xlZ2FjeV9wcmludF9yeF9jb25maWdfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfcHJpbnRfcnhfY29uZmlnX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci19Ci0jZW5kaWYKLQotdm9pZCBpd2xfbGVnYWN5X2NsZWFyX2lzcl9zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIEdFT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBpd2xfbGVnYWN5X2luaXRfZ2VvcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X2ZyZWVfZ2VvcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKioqKioqKioqKioqKioqIERSSVZFUiBTVEFUVVMgRlVOQ1RJT05TICAgKioqKiovCi0KLSNkZWZpbmUgU1RBVFVTX0hDTURfQUNUSVZFCTAJLyogaG9zdCBjb21tYW5kIGluIHByb2dyZXNzICovCi0vKiAxIGlzIHVudXNlZCAodXNlZCB0byBiZSBTVEFUVVNfSENNRF9TWU5DX0FDVElWRSkgKi8KLSNkZWZpbmUgU1RBVFVTX0lOVF9FTkFCTEVECTIKLSNkZWZpbmUgU1RBVFVTX1JGX0tJTExfSFcJMwotI2RlZmluZSBTVEFUVVNfQ1RfS0lMTAkJNAotI2RlZmluZSBTVEFUVVNfSU5JVAkJNQotI2RlZmluZSBTVEFUVVNfQUxJVkUJCTYKLSNkZWZpbmUgU1RBVFVTX1JFQURZCQk3Ci0jZGVmaW5lIFNUQVRVU19URU1QRVJBVFVSRQk4Ci0jZGVmaW5lIFNUQVRVU19HRU9fQ09ORklHVVJFRAk5Ci0jZGVmaW5lIFNUQVRVU19FWElUX1BFTkRJTkcJMTAKLSNkZWZpbmUgU1RBVFVTX1NUQVRJU1RJQ1MJMTIKLSNkZWZpbmUgU1RBVFVTX1NDQU5OSU5HCQkxMwotI2RlZmluZSBTVEFUVVNfU0NBTl9BQk9SVElORwkxNAotI2RlZmluZSBTVEFUVVNfU0NBTl9IVwkJMTUKLSNkZWZpbmUgU1RBVFVTX1BPV0VSX1BNSQkxNgotI2RlZmluZSBTVEFUVVNfRldfRVJST1IJCTE3Ci0jZGVmaW5lIFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE4Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIFRoZSBhZGFwdGVyIGlzICdyZWFkeScgaWYgUkVBRFkgYW5kIEdFT19DT05GSUdVUkVEIGJpdHMgYXJlCi0JICogc2V0IGJ1dCBFWElUX1BFTkRJTkcgaXMgbm90ICovCi0JcmV0dXJuIHRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cykgJiYKLQkgICAgICAgdGVzdF9iaXQoU1RBVFVTX0dFT19DT05GSUdVUkVELCAmcHJpdi0+c3RhdHVzKSAmJgotCSAgICAgICAhdGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfYWxpdmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiB0ZXN0X2JpdChTVEFUVVNfQUxJVkUsICZwcml2LT5zdGF0dXMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiB0ZXN0X2JpdChTVEFUVVNfSU5JVCwgJnByaXYtPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfcmZraWxsX2h3KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlyZXR1cm4gdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX3Jma2lsbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIGl3bF9sZWdhY3lfaXNfcmZraWxsX2h3KHByaXYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX2N0a2lsbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIHRlc3RfYml0KFNUQVRVU19DVF9LSUxMLCAmcHJpdi0+c3RhdHVzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfaXNfcmVhZHkocHJpdik7Ci19Ci0KLWV4dGVybiB2b2lkIGl3bF9sZWdhY3lfc2VuZF9idF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsX2xlZ2FjeV9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHU4IGZsYWdzLCBib29sIGNsZWFyKTsKLXZvaWQgaXdsX2xlZ2FjeV9hcG1fc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfYXBtX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotaW50IGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3NlbmRfcnhvbl9hc3NvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlyZXR1cm4gcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnJ4b25fYXNzb2MocHJpdiwgY3R4KTsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfY29tbWl0X3J4b24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5oY21kLT5jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICppd2xfZ2V0X2h3X21vZGUoCi0JCQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQlyZXR1cm4gcHJpdi0+aHctPndpcGh5LT5iYW5kc1tiYW5kXTsKLX0KLQotLyogbWFjODAyMTEgaGFuZGxlcnMgKi8KLWludCBpd2xfbGVnYWN5X21hY19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKTsKLXZvaWQgaXdsX2xlZ2FjeV9tYWNfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci12b2lkIGl3bF9sZWdhY3lfbWFjX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYsCi0JCQkJICAgICB1MzIgY2hhbmdlcyk7Ci12b2lkIGl3bF9sZWdhY3lfdHhfY21kX3Byb3RlY3Rpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKLQkJCQlfX2xlMTYgZmMsIF9fbGUzMiAqdHhfZmxhZ3MpOwotCi1pcnFyZXR1cm5fdCBpd2xfbGVnYWN5X2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKTsKLQotI2VuZGlmIC8qIF9faXdsX2xlZ2FjeV9jb3JlX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNzci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNzci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjhhOTYxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jc3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2Nzcl9oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X2Nzcl9oX18KLS8qCi0gKiBDU1IgKGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcnMpCi0gKgotICogQ1NSIHJlZ2lzdGVycyBhcmUgbWFwcGVkIGRpcmVjdGx5IGludG8gUENJIGJ1cyBzcGFjZSwgYW5kIGFyZSBhY2Nlc3NpYmxlCi0gKiB3aGVuZXZlciBwbGF0Zm9ybSBzdXBwbGllcyBwb3dlciB0byBkZXZpY2UsIGV2ZW4gd2hlbiBkZXZpY2UgaXMgaW4KLSAqIGxvdyBwb3dlciBzdGF0ZXMgZHVlIHRvIGRyaXZlci1pbnZva2VkIGRldmljZSByZXNldHMKLSAqIChlLmcuIENTUl9SRVNFVF9SRUdfRkxBR19TV19SRVNFVCkgb3IgdUNvZGUtZHJpdmVuIHBvd2VyLXNhdmluZyBtb2Rlcy4KLSAqCi0gKiBVc2UgaXdsX3dyaXRlMzIoKSBhbmQgaXdsX3JlYWQzMigpIGZhbWlseSB0byBhY2Nlc3MgdGhlc2UgcmVnaXN0ZXJzOwotICogdGhlc2UgcHJvdmlkZSBzaW1wbGUgUENJIGJ1cyBhY2Nlc3MsIHdpdGhvdXQgd2FraW5nIHVwIHRoZSBNQUMuCi0gKiBEbyBub3QgdXNlIGl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIoKSBmYW1pbHkgZm9yIHRoZXNlIHJlZ2lzdGVyczsKLSAqIG5vIG5lZWQgdG8gImdyYWIgbmljIGFjY2VzcyIgdmlhIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUS4KLSAqIFRoZSBNQUMgKHVDb2RlIHByb2Nlc3NvciwgZXRjLikgZG9lcyBub3QgbmVlZCB0byBiZSBwb3dlcmVkIHVwIGZvciBhY2Nlc3NpbmcKLSAqIHRoZSBDU1IgcmVnaXN0ZXJzLgotICoKLSAqIE5PVEU6ICBEZXZpY2UgZG9lcyBuZWVkIHRvIGJlIGF3YWtlIGluIG9yZGVyIHRvIHJlYWQgdGhpcyBtZW1vcnkKLSAqICAgICAgICB2aWEgQ1NSX0VFUFJPTSByZWdpc3RlcgotICovCi0jZGVmaW5lIENTUl9CQVNFICAgICgweDAwMCkKLQotI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFRyAgICAoQ1NSX0JBU0UrMHgwMDApIC8qIGhhcmR3YXJlIGludGVyZmFjZSBjb25maWcgKi8KLSNkZWZpbmUgQ1NSX0lOVF9DT0FMRVNDSU5HICAgICAgKENTUl9CQVNFKzB4MDA0KSAvKiBhY2N1bSBpbnRzLCAzMi11c2VjIHVuaXRzICovCi0jZGVmaW5lIENTUl9JTlQgICAgICAgICAgICAgICAgIChDU1JfQkFTRSsweDAwOCkgLyogaG9zdCBpbnRlcnJ1cHQgc3RhdHVzL2FjayAqLwotI2RlZmluZSBDU1JfSU5UX01BU0sgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMGMpIC8qIGhvc3QgaW50ZXJydXB0IGVuYWJsZSAqLwotI2RlZmluZSBDU1JfRkhfSU5UX1NUQVRVUyAgICAgICAoQ1NSX0JBU0UrMHgwMTApIC8qIGJ1c21hc3RlciBpbnQgc3RhdHVzL2FjayovCi0jZGVmaW5lIENTUl9HUElPX0lOICAgICAgICAgICAgIChDU1JfQkFTRSsweDAxOCkgLyogcmVhZCBleHRlcm5hbCBjaGlwIHBpbnMgKi8KLSNkZWZpbmUgQ1NSX1JFU0VUICAgICAgICAgICAgICAgKENTUl9CQVNFKzB4MDIwKSAvKiBidXNtYXN0ZXIgZW5hYmxlLCBOTUksIGV0YyovCi0jZGVmaW5lIENTUl9HUF9DTlRSTCAgICAgICAgICAgIChDU1JfQkFTRSsweDAyNCkKLQotLyogMm5kIGJ5dGUgb2YgQ1NSX0lOVF9DT0FMRVNDSU5HLCBub3QgYWNjZXNzaWJsZSB2aWEgaXdsX3dyaXRlMzIoKSEgKi8KLSNkZWZpbmUgQ1NSX0lOVF9QRVJJT0RJQ19SRUcJKENTUl9CQVNFKzB4MDA1KQotCi0vKgotICogSGFyZHdhcmUgcmV2aXNpb24gaW5mbwotICogQml0IGZpZWxkczoKLSAqIDMxLTg6ICBSZXNlcnZlZAotICogIDctNDogIFR5cGUgb2YgZGV2aWNlOiAgc2VlIENTUl9IV19SRVZfVFlQRV94eHggZGVmaW5pdGlvbnMKLSAqICAzLTI6ICBSZXZpc2lvbiBzdGVwOiAgMCA9IEEsIDEgPSBCLCAyID0gQywgMyA9IEQKLSAqICAxLTA6ICAiRGFzaCIgKC0pIHZhbHVlLCBhcyBpbiBBLTEsIGV0Yy4KLSAqCi0gKiBOT1RFOiAgUmV2aXNpb24gc3RlcCBhZmZlY3RzIGNhbGN1bGF0aW9uIG9mIENDSyB0eHBvd2VyIGZvciA0OTY1LgotICogTk9URTogIFNlZSBhbHNvIENTUl9IV19SRVZfV0FfUkVHICh3b3JrLWFyb3VuZCBmb3IgYnVnIGluIDQ5NjUpLgotICovCi0jZGVmaW5lIENTUl9IV19SRVYgICAgICAgICAgICAgIChDU1JfQkFTRSsweDAyOCkKLQotLyoKLSAqIEVFUFJPTSBtZW1vcnkgcmVhZHMKLSAqCi0gKiBOT1RFOiAgRGV2aWNlIG11c3QgYmUgYXdha2UsIGluaXRpYWxpemVkIHZpYSBhcG1fb3BzLmluaXQoKSwKLSAqICAgICAgICBpbiBvcmRlciB0byByZWFkLgotICovCi0jZGVmaW5lIENTUl9FRVBST01fUkVHICAgICAgICAgIChDU1JfQkFTRSsweDAyYykKLSNkZWZpbmUgQ1NSX0VFUFJPTV9HUCAgICAgICAgICAgKENTUl9CQVNFKzB4MDMwKQotCi0jZGVmaW5lIENTUl9HSU9fUkVHCQkoQ1NSX0JBU0UrMHgwM0MpCi0jZGVmaW5lIENTUl9HUF9VQ09ERV9SRUcJKENTUl9CQVNFKzB4MDQ4KQotI2RlZmluZSBDU1JfR1BfRFJJVkVSX1JFRwkoQ1NSX0JBU0UrMHgwNTApCi0KLS8qCi0gKiBVQ09ERS1EUklWRVIgR1AgKGdlbmVyYWwgcHVycG9zZSkgbWFpbGJveCByZWdpc3RlcnMuCi0gKiBTRVQvQ0xSIHJlZ2lzdGVycyBzZXQvY2xlYXIgYml0KHMpIGlmICIxIiBpcyB3cml0dGVuLgotICovCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxICAgICAgIChDU1JfQkFTRSsweDA1NCkKLSNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDFfU0VUICAgKENTUl9CQVNFKzB4MDU4KQotI2RlZmluZSBDU1JfVUNPREVfRFJWX0dQMV9DTFIgICAoQ1NSX0JBU0UrMHgwNWMpCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AyICAgICAgIChDU1JfQkFTRSsweDA2MCkKLQotI2RlZmluZSBDU1JfTEVEX1JFRyAgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwOTQpCi0jZGVmaW5lIENTUl9EUkFNX0lOVF9UQkxfUkVHCShDU1JfQkFTRSsweDBBMCkKLQotLyogR0lPIENoaWNrZW4gQml0cyAoUENJIEV4cHJlc3MgYnVzIGxpbmsgcG93ZXIgbWFuYWdlbWVudCkgKi8KLSNkZWZpbmUgQ1NSX0dJT19DSElDS0VOX0JJVFMgICAgKENTUl9CQVNFKzB4MTAwKQotCi0vKiBBbmFsb2cgcGhhc2UtbG9jay1sb29wIGNvbmZpZ3VyYXRpb24gICovCi0jZGVmaW5lIENTUl9BTkFfUExMX0NGRyAgICAgICAgIChDU1JfQkFTRSsweDIwYykKLQotLyoKLSAqIENTUiBIYXJkd2FyZSBSZXZpc2lvbiBXb3JrYXJvdW5kIFJlZ2lzdGVyLiAgSW5kaWNhdGVzIGhhcmR3YXJlIHJldjsKLSAqICJzdGVwIiBkZXRlcm1pbmVzIENDSyBiYWNrb2ZmIGZvciB0eHBvd2VyIGNhbGN1bGF0aW9uLiAgVXNlZCBmb3IgNDk2NSBvbmx5LgotICogU2VlIGFsc28gQ1NSX0hXX1JFViByZWdpc3Rlci4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAgMy0yOiAgMCA9IEEsIDEgPSBCLCAyID0gQywgMyA9IEQgc3RlcAotICogIDEtMDogICJEYXNoIiAoLSkgdmFsdWUsIGFzIGluIEMtMSwgZXRjLgotICovCi0jZGVmaW5lIENTUl9IV19SRVZfV0FfUkVHCQkoQ1NSX0JBU0UrMHgyMkMpCi0KLSNkZWZpbmUgQ1NSX0RCR19IUEVUX01FTV9SRUcJCShDU1JfQkFTRSsweDI0MCkKLSNkZWZpbmUgQ1NSX0RCR19MSU5LX1BXUl9NR01UX1JFRwkoQ1NSX0JBU0UrMHgyNTApCi0KLS8qIEJpdHMgZm9yIENTUl9IV19JRl9DT05GSUdfUkVHICovCi0jZGVmaW5lIENTUjQ5X0hXX0lGX0NPTkZJR19SRUdfQklUXzQ5NjVfUgkoMHgwMDAwMDAxMCkKLSNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfTVNLX0JPQVJEX1ZFUgkoMHgwMDAwMEMwMCkKLSNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX01BQ19TSSAJKDB4MDAwMDAxMDApCi0jZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9SQURJT19TSQkoMHgwMDAwMDIwMCkKLQotI2RlZmluZSBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF8zOTQ1X01CICAgICAgICAgKDB4MDAwMDAxMDApCi0jZGVmaW5lIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUXzM5NDVfTU0gICAgICAgICAoMHgwMDAwMDIwMCkKLSNkZWZpbmUgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfU0tVX01SQyAgICAgICAgICAgICgweDAwMDAwNDAwKQotI2RlZmluZSBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF9CT0FSRF9UWVBFICAgICAgICAgKDB4MDAwMDA4MDApCi0jZGVmaW5lIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUU19TSUxJQ09OX1RZUEVfQSAgICAoMHgwMDAwMDAwMCkKLSNkZWZpbmUgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9CICAgICgweDAwMDAxMDAwKQotCi0jZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9IQVBfV0FLRV9MMUEJKDB4MDAwODAwMDApCi0jZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTQkoMHgwMDIwMDAwMCkKLSNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19SRUFEWQkoMHgwMDQwMDAwMCkgLyogUENJX09XTl9TRU0gKi8KLSNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUgKDB4MDIwMDAwMDApIC8qIE1FX09XTiAqLwotI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19QUkVQQVJFCQkgICgweDA4MDAwMDAwKSAvKiBXQUtFX01FICovCi0KLSNkZWZpbmUgQ1NSX0lOVF9QRVJJT0RJQ19ESVMJCQkoMHgwMCkgLyogZGlzYWJsZSBwZXJpb2RpYyBpbnQqLwotI2RlZmluZSBDU1JfSU5UX1BFUklPRElDX0VOQQkJCSgweEZGKSAvKiAyNTUqMzIgdXNlYyB+IDggbXNlYyovCi0KLS8qIGludGVycnVwdCBmbGFncyBpbiBJTlRBLCBzZXQgYnkgdUNvZGUgb3IgaGFyZHdhcmUgKGUuZy4gZG1hKSwKLSAqIGFja25vd2xlZGdlZCAocmVzZXQpIGJ5IGhvc3Qgd3JpdGluZyAiMSIgdG8gZmxhZ2dlZCBiaXRzLiAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9GSF9SWCAgICAgICAgKDEgPDwgMzEpIC8qIFJ4IERNQSwgY21kIHJlc3BvbnNlcywgRkhfSU5UWzE3OjE2XSAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9IV19FUlIgICAgICAgKDEgPDwgMjkpIC8qIERNQSBoYXJkd2FyZSBlcnJvciBGSF9JTlRbMzFdICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1JYX1BFUklPRElDCSAoMSA8PCAyOCkgLyogUnggcGVyaW9kaWMgKi8KLSNkZWZpbmUgQ1NSX0lOVF9CSVRfRkhfVFggICAgICAgICgxIDw8IDI3KSAvKiBUeCBETUEgRkhfSU5UWzE6MF0gKi8KLSNkZWZpbmUgQ1NSX0lOVF9CSVRfU0NEICAgICAgICAgICgxIDw8IDI2KSAvKiBUWFEgcG9pbnRlciBhZHZhbmNlZCAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9TV19FUlIgICAgICAgKDEgPDwgMjUpIC8qIHVDb2RlIGVycm9yICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1JGX0tJTEwgICAgICAoMSA8PCA3KSAgLyogSFcgUkZLSUxMIHN3aXRjaCBHUF9DTlRSTFsyN10gdG9nZ2xlZCAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9DVF9LSUxMICAgICAgKDEgPDwgNikgIC8qIENyaXRpY2FsIHRlbXAgKGNoaXAgdG9vIGhvdCkgcmZraWxsICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1NXX1JYICAgICAgICAoMSA8PCAzKSAgLyogUngsIGNvbW1hbmQgcmVzcG9uc2VzLCAzOTQ1ICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1dBS0VVUCAgICAgICAoMSA8PCAxKSAgLyogTklDIGNvbnRyb2xsZXIgd2FraW5nIHVwIChwd3IgbWdtdCkgKi8KLSNkZWZpbmUgQ1NSX0lOVF9CSVRfQUxJVkUgICAgICAgICgxIDw8IDApICAvKiB1Q29kZSBpbnRlcnJ1cHRzIG9uY2UgaXQgaW5pdGlhbGl6ZXMgKi8KLQotI2RlZmluZSBDU1JfSU5JX1NFVF9NQVNLCShDU1JfSU5UX0JJVF9GSF9SWCAgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9IV19FUlIgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9GSF9UWCAgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9TV19FUlIgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9SRl9LSUxMIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9TV19SWCAgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9XQUtFVVAgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9BTElWRSkKLQotLyogaW50ZXJydXB0IGZsYWdzIGluIEZIIChmbG93IGhhbmRsZXIpIChQQ0kgYnVzbWFzdGVyIERNQSkgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfRVJSICAgICAgICgxIDw8IDMxKSAvKiBFcnJvciAqLwotI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9ISV9QUklPUiAgKDEgPDwgMzApIC8qIEhpZ2ggcHJpb3JpdHkgUngsIGJ5cGFzcyBjb2FsZXNjaW5nICovCi0jZGVmaW5lIENTUjM5X0ZIX0lOVF9CSVRfUlhfQ0hOTDIgICgxIDw8IDE4KSAvKiBSeCBjaGFubmVsIDIgKDM5NDUgb25seSkgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDEgICgxIDw8IDE3KSAvKiBSeCBjaGFubmVsIDEgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDAgICgxIDw8IDE2KSAvKiBSeCBjaGFubmVsIDAgKi8KLSNkZWZpbmUgQ1NSMzlfRkhfSU5UX0JJVF9UWF9DSE5MNiAgKDEgPDwgNikgIC8qIFR4IGNoYW5uZWwgNiAoMzk0NSBvbmx5KSAqLwotI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMSAgKDEgPDwgMSkgIC8qIFR4IGNoYW5uZWwgMSAqLwotI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCAgKDEgPDwgMCkgIC8qIFR4IGNoYW5uZWwgMCAqLwotCi0jZGVmaW5lIENTUjM5X0ZIX0lOVF9SWF9NQVNLCShDU1JfRkhfSU5UX0JJVF9ISV9QUklPUiB8IFwKLQkJCQkgQ1NSMzlfRkhfSU5UX0JJVF9SWF9DSE5MMiB8IFwKLQkJCQkgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDEgfCBcCi0JCQkJIENTUl9GSF9JTlRfQklUX1JYX0NITkwwKQotCi0KLSNkZWZpbmUgQ1NSMzlfRkhfSU5UX1RYX01BU0sJKENTUjM5X0ZIX0lOVF9CSVRfVFhfQ0hOTDYgfCBcCi0JCQkJIENTUl9GSF9JTlRfQklUX1RYX0NITkwxIHwgXAotCQkJCSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCkKLQotI2RlZmluZSBDU1I0OV9GSF9JTlRfUlhfTUFTSwkoQ1NSX0ZIX0lOVF9CSVRfSElfUFJJT1IgfCBcCi0JCQkJIENTUl9GSF9JTlRfQklUX1JYX0NITkwxIHwgXAotCQkJCSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMCkKLQotI2RlZmluZSBDU1I0OV9GSF9JTlRfVFhfTUFTSwkoQ1NSX0ZIX0lOVF9CSVRfVFhfQ0hOTDEgfCBcCi0JCQkJIENTUl9GSF9JTlRfQklUX1RYX0NITkwwKQotCi0vKiBHUElPICovCi0jZGVmaW5lIENTUl9HUElPX0lOX0JJVF9BVVhfUE9XRVIgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCi0jZGVmaW5lIENTUl9HUElPX0lOX1ZBTF9WQVVYX1BXUl9TUkMgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCi0jZGVmaW5lIENTUl9HUElPX0lOX1ZBTF9WTUFJTl9QV1JfU1JDICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCi0KLS8qIFJFU0VUICovCi0jZGVmaW5lIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQotI2RlZmluZSBDU1JfUkVTRVRfUkVHX0ZMQUdfRk9SQ0VfTk1JICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKLSNkZWZpbmUgQ1NSX1JFU0VUX1JFR19GTEFHX1NXX1JFU0VUICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwODApCi0jZGVmaW5lIENTUl9SRVNFVF9SRUdfRkxBR19NQVNURVJfRElTQUJMRUQgICAgICAgICAgICgweDAwMDAwMTAwKQotI2RlZmluZSBDU1JfUkVTRVRfUkVHX0ZMQUdfU1RPUF9NQVNURVIgICAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKLSNkZWZpbmUgQ1NSX1JFU0VUX0xJTktfUFdSX01HTVRfRElTQUJMRUQgICAgICAgICAgICAgKDB4ODAwMDAwMDApCi0KLS8qCi0gKiBHUCAoZ2VuZXJhbCBwdXJwb3NlKSBDT05UUk9MIFJFR0lTVEVSCi0gKiBCaXQgZmllbGRzOgotICogICAgMjc6ICBIV19SRl9LSUxMX1NXCi0gKiAgICAgICAgIEluZGljYXRlcyBzdGF0ZSBvZiAocGxhdGZvcm0ncykgaGFyZHdhcmUgUkYtS2lsbCBzd2l0Y2gKLSAqIDI2LTI0OiAgUE9XRVJfU0FWRV9UWVBFCi0gKiAgICAgICAgIEluZGljYXRlcyBjdXJyZW50IHBvd2VyLXNhdmluZyBtb2RlOgotICogICAgICAgICAwMDAgLS0gTm8gcG93ZXIgc2F2aW5nCi0gKiAgICAgICAgIDAwMSAtLSBNQUMgcG93ZXItZG93bgotICogICAgICAgICAwMTAgLS0gUEhZIChyYWRpbykgcG93ZXItZG93bgotICogICAgICAgICAwMTEgLS0gRXJyb3IKLSAqICAgOS02OiAgU1lTX0NPTkZJRwotICogICAgICAgICBJbmRpY2F0ZXMgY3VycmVudCBzeXN0ZW0gY29uZmlndXJhdGlvbiwgcmVmbGVjdGluZyBwaW5zIG9uIGNoaXAKLSAqICAgICAgICAgYXMgZm9yY2VkIGhpZ2gvbG93IGJ5IGRldmljZSBjaXJjdWl0IGJvYXJkLgotICogICAgIDQ6ICBHT0lOR19UT19TTEVFUAotICogICAgICAgICBJbmRpY2F0ZXMgTUFDIGlzIGVudGVyaW5nIGEgcG93ZXItc2F2aW5nIHNsZWVwIHBvd2VyLWRvd24uCi0gKiAgICAgICAgIE5vdCBhIGdvb2QgdGltZSB0byBhY2Nlc3MgZGV2aWNlLWludGVybmFsIHJlc291cmNlcy4KLSAqICAgICAzOiAgTUFDX0FDQ0VTU19SRVEKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcmVxdWVzdCBhbmQgbWFpbnRhaW4gTUFDIHdha2V1cCwgdG8gYWxsb3cgaG9zdAotICogICAgICAgICBhY2Nlc3MgdG8gZGV2aWNlLWludGVybmFsIHJlc291cmNlcy4gIEhvc3QgbXVzdCB3YWl0IGZvcgotICogICAgICAgICBNQUNfQ0xPQ0tfUkVBRFkgKGFuZCAhR09JTkdfVE9fU0xFRVApIGJlZm9yZSBhY2Nlc3Npbmcgbm9uLUNTUgotICogICAgICAgICBkZXZpY2UgcmVnaXN0ZXJzLgotICogICAgIDI6ICBJTklUX0RPTkUKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcHV0IGRldmljZSBpbnRvIGZ1bGx5IG9wZXJhdGlvbmFsIEQwIHBvd2VyIG1vZGUuCi0gKiAgICAgICAgIEhvc3QgcmVzZXRzIHRoaXMgYWZ0ZXIgU1dfUkVTRVQgdG8gcHV0IGRldmljZSBpbnRvIGxvdyBwb3dlciBtb2RlLgotICogICAgIDA6ICBNQUNfQ0xPQ0tfUkVBRFkKLSAqICAgICAgICAgSW5kaWNhdGVzIE1BQyAodWNvZGUgcHJvY2Vzc29yLCBldGMuKSBpcyBwb3dlcmVkIHVwIGFuZCBjYW4gcnVuLgotICogICAgICAgICBJbnRlcm5hbCByZXNvdXJjZXMgYXJlIGFjY2Vzc2libGUuCi0gKiAgICAgICAgIE5PVEU6ICBUaGlzIGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBhY3R1YWxseSBydW5uaW5nLgotICogICAgICAgICBOT1RFOiAgVGhpcyBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IDQ5NjUgb3IgMzk0NSBoYXMgY29tcGxldGVkCi0gKiAgICAgICAgICAgICAgICBpbml0IG9yIHBvc3QtcG93ZXItZG93biByZXN0b3JlIG9mIGludGVybmFsIFNSQU0gbWVtb3J5LgotICogICAgICAgICAgICAgICAgVXNlIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVAgYXMgaW5kaWNhdGlvbiB0aGF0Ci0gKiAgICAgICAgICAgICAgICBTUkFNIGlzIHJlc3RvcmVkIGFuZCB1Q29kZSBpcyBpbiBub3JtYWwgb3BlcmF0aW9uIG1vZGUuCi0gKiAgICAgICAgICAgICAgICBMYXRlciBkZXZpY2VzICg1eHh4LzZ4eHgvMXh4eCkgdXNlIG5vbi12b2xhdGlsZSBTUkFNLCBhbmQKLSAqICAgICAgICAgICAgICAgIGRvIG5vdCBuZWVkIHRvIHNhdmUvcmVzdG9yZSBpdC4KLSAqICAgICAgICAgTk9URTogIEFmdGVyIGRldmljZSByZXNldCwgdGhpcyBiaXQgcmVtYWlucyAiMCIgdW50aWwgaG9zdCBzZXRzCi0gKiAgICAgICAgICAgICAgICBJTklUX0RPTkUKLSAqLwotI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZICAgICAgICAoMHgwMDAwMDAwMSkKLSNkZWZpbmUgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0lOSVRfRE9ORSAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCi0jZGVmaW5lIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSAgICAgICAgICgweDAwMDAwMDA4KQotI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfR09JTkdfVE9fU0xFRVAgICAgICAgICAoMHgwMDAwMDAxMCkKLQotI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX1ZBTF9NQUNfQUNDRVNTX0VOICAgICAgICAgICAoMHgwMDAwMDAwMSkKLQotI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX01TS19QT1dFUl9TQVZFX1RZUEUgICAgICAgICAoMHgwNzAwMDAwMCkKLSNkZWZpbmUgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19QT1dFUl9TQVZFICAgICAgICAgKDB4MDQwMDAwMDApCi0jZGVmaW5lIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXICAgICAgICAgICgweDA4MDAwMDAwKQotCi0KLS8qIEVFUFJPTSBSRUcgKi8KLSNkZWZpbmUgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0sJKDB4MDAwMDAwMDEpCi0jZGVmaW5lIENTUl9FRVBST01fUkVHX0JJVF9DTUQJCSgweDAwMDAwMDAyKQotI2RlZmluZSBDU1JfRUVQUk9NX1JFR19NU0tfQUREUgkJKDB4MDAwMEZGRkMpCi0jZGVmaW5lIENTUl9FRVBST01fUkVHX01TS19EQVRBCQkoMHhGRkZGMDAwMCkKLQotLyogRUVQUk9NIEdQICovCi0jZGVmaW5lIENTUl9FRVBST01fR1BfVkFMSURfTVNLCQkoMHgwMDAwMDAwNykgLyogc2lnbmF0dXJlICovCi0jZGVmaW5lIENTUl9FRVBST01fR1BfSUZfT1dORVJfTVNLCSgweDAwMDAwMTgwKQotI2RlZmluZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9MRVNTX1RIQU5fNEsJCSgweDAwMDAwMDAyKQotI2RlZmluZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9NT1JFX1RIQU5fNEsJCSgweDAwMDAwMDA0KQotCi0vKiBHUCBSRUcgKi8KLSNkZWZpbmUgQ1NSX0dQX1JFR19QT1dFUl9TQVZFX1NUQVRVU19NU0sgICAgICAgICAgICAoMHgwMzAwMDAwMCkgLyogYml0IDI0LzI1ICovCi0jZGVmaW5lIENTUl9HUF9SRUdfTk9fUE9XRVJfU0FWRSAgICAgICAgICAgICgweDAwMDAwMDAwKQotI2RlZmluZSBDU1JfR1BfUkVHX01BQ19QT1dFUl9TQVZFICAgICAgICAgICAoMHgwMTAwMDAwMCkKLSNkZWZpbmUgQ1NSX0dQX1JFR19QSFlfUE9XRVJfU0FWRSAgICAgICAgICAgKDB4MDIwMDAwMDApCi0jZGVmaW5lIENTUl9HUF9SRUdfUE9XRVJfU0FWRV9FUlJPUiAgICAgICAgICgweDAzMDAwMDAwKQotCi0KLS8qIENTUiBHSU8gKi8KLSNkZWZpbmUgQ1NSX0dJT19SRUdfVkFMX0wwU19FTkFCTEVECSgweDAwMDAwMDAyKQotCi0vKgotICogVUNPREUtRFJJVkVSIEdQIChnZW5lcmFsIHB1cnBvc2UpIG1haWxib3ggcmVnaXN0ZXIgMQotICogSG9zdCBkcml2ZXIgYW5kIHVDb2RlIHdyaXRlIGFuZC9vciByZWFkIHRoaXMgcmVnaXN0ZXIgdG8gY29tbXVuaWNhdGUgd2l0aAotICogZWFjaCBvdGhlci4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAgICAgNDogIFVDT0RFX0RJU0FCTEUKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcmVxdWVzdCBwZXJtYW5lbnQgaGFsdCBvZiB1Q29kZSwgc2FtZSBhcwotICogICAgICAgICBzZW5kaW5nIENBUkRfU1RBVEUgY29tbWFuZCB3aXRoICJoYWx0IiBiaXQgc2V0LgotICogICAgIDM6ICBDVF9LSUxMX0VYSVQKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcmVxdWVzdCBleGl0IGZyb20gQ1RfS0lMTCBzdGF0ZSwgaS5lLiBob3N0IHRoaW5rcwotICogICAgICAgICBkZXZpY2UgdGVtcGVyYXR1cmUgaXMgbG93IGVub3VnaCB0byBjb250aW51ZSBub3JtYWwgb3BlcmF0aW9uLgotICogICAgIDI6ICBDTURfQkxPQ0tFRAotICogICAgICAgICBIb3N0IHNldHMgdGhpcyBkdXJpbmcgUkYgS0lMTCBwb3dlci1kb3duIHNlcXVlbmNlIChIVywgU1csIENUIEtJTEwpCi0gKiAgICAgICAgIHRvIHJlbGVhc2UgdUNvZGUgdG8gY2xlYXIgYWxsIFR4IGFuZCBjb21tYW5kIHF1ZXVlcywgZW50ZXIKLSAqICAgICAgICAgdW5hc3NvY2lhdGVkIG1vZGUsIGFuZCBwb3dlciBkb3duLgotICogICAgICAgICBOT1RFOiAgU29tZSBkZXZpY2VzIGFsc28gdXNlIEhCVVNfVEFSR19NQlhfQyByZWdpc3RlciBmb3IgdGhpcyBiaXQuCi0gKiAgICAgMTogIFNXX0JJVF9SRktJTEwKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgd2hlbiBpc3N1aW5nIENBUkRfU1RBVEUgY29tbWFuZCB0byByZXF1ZXN0Ci0gKiAgICAgICAgIGRldmljZSBzbGVlcC4KLSAqICAgICAwOiAgTUFDX1NMRUVQCi0gKiAgICAgICAgIHVDb2RlIHNldHMgdGhpcyB3aGVuIHByZXBhcmluZyBhIHBvd2VyLXNhdmluZyBwb3dlci1kb3duLgotICogICAgICAgICB1Q29kZSByZXNldHMgdGhpcyB3aGVuIHBvd2VyLXVwIGlzIGNvbXBsZXRlIGFuZCBTUkFNIGlzIHNhbmUuCi0gKiAgICAgICAgIE5PVEU6ICAzOTQ1LzQ5NjUgc2F2ZXMgaW50ZXJuYWwgU1JBTSBkYXRhIHRvIGhvc3Qgd2hlbiBwb3dlcmluZyBkb3duLAotICogICAgICAgICAgICAgICAgYW5kIG11c3QgcmVzdG9yZSB0aGlzIGRhdGEgYWZ0ZXIgcG93ZXJpbmcgYmFjayB1cC4KLSAqICAgICAgICAgICAgICAgIE1BQ19TTEVFUCBpcyB0aGUgYmVzdCBpbmRpY2F0aW9uIHRoYXQgcmVzdG9yZSBpcyBjb21wbGV0ZS4KLSAqICAgICAgICAgICAgICAgIExhdGVyIGRldmljZXMgKDV4eHgvNnh4eC8xeHh4KSB1c2Ugbm9uLXZvbGF0aWxlIFNSQU0sIGFuZAotICogICAgICAgICAgICAgICAgZG8gbm90IG5lZWQgdG8gc2F2ZS9yZXN0b3JlIGl0LgotICovCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCi0jZGVmaW5lIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCAgICAgICAgICAgKDB4MDAwMDAwMDQpCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX1JFR19CSVRfQ1RfS0lMTF9FWElUICAgICAgKDB4MDAwMDAwMDgpCi0KLS8qIEdJTyBDaGlja2VuIEJpdHMgKFBDSSBFeHByZXNzIGJ1cyBsaW5rIHBvd2VyIG1hbmFnZW1lbnQpICovCi0jZGVmaW5lIENTUl9HSU9fQ0hJQ0tFTl9CSVRTX1JFR19CSVRfTDFBX05PX0wwU19SWCAgKDB4MDA4MDAwMDApCi0jZGVmaW5lIENTUl9HSU9fQ0hJQ0tFTl9CSVRTX1JFR19CSVRfRElTX0wwU19FWElUX1RJTUVSICAoMHgyMDAwMDAwMCkKLQotLyogTEVEICovCi0jZGVmaW5lIENTUl9MRURfQlNNX0NUUkxfTVNLICgweEZGRkZGRkRGKQotI2RlZmluZSBDU1JfTEVEX1JFR19UUlVOX09OICgweDc4KQotI2RlZmluZSBDU1JfTEVEX1JFR19UUlVOX09GRiAoMHgzOCkKLQotLyogQU5BX1BMTCAqLwotI2RlZmluZSBDU1IzOV9BTkFfUExMX0NGR19WQUwgICAgICAgICgweDAxMDAwMDAwKQotCi0vKiBIUEVUIE1FTSBkZWJ1ZyAqLwotI2RlZmluZSBDU1JfREJHX0hQRVRfTUVNX1JFR19WQUwJKDB4RkZGRjAwMDApCi0KLS8qIERSQU0gSU5UIFRBQkxFICovCi0jZGVmaW5lIENTUl9EUkFNX0lOVF9UQkxfRU5BQkxFCQkoMSA8PCAzMSkKLSNkZWZpbmUgQ1NSX0RSQU1fSU5JVF9UQkxfV1JBUF9DSEVDSwkoMSA8PCAyNykKLQotLyoKLSAqIEhCVVMgKEhvc3Qtc2lkZSBCdXMpCi0gKgotICogSEJVUyByZWdpc3RlcnMgYXJlIG1hcHBlZCBkaXJlY3RseSBpbnRvIFBDSSBidXMgc3BhY2UsIGJ1dCBhcmUgdXNlZAotICogdG8gaW5kaXJlY3RseSBhY2Nlc3MgZGV2aWNlJ3MgaW50ZXJuYWwgbWVtb3J5IG9yIHJlZ2lzdGVycyB0aGF0Ci0gKiBtYXkgYmUgcG93ZXJlZC1kb3duLgotICoKLSAqIFVzZSBpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKCkvaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKCkgZmFtaWx5Ci0gKiBmb3IgdGhlc2UgcmVnaXN0ZXJzOwotICogaG9zdCBtdXN0ICJncmFiIG5pYyBhY2Nlc3MiIHZpYSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEKLSAqIHRvIG1ha2Ugc3VyZSB0aGUgTUFDICh1Q29kZSBwcm9jZXNzb3IsIGV0Yy4pIGlzIHBvd2VyZWQgdXAgZm9yIGFjY2Vzc2luZwotICogaW50ZXJuYWwgcmVzb3VyY2VzLgotICoKLSAqIERvIG5vdCB1c2UgaXdsX3dyaXRlMzIoKS9pd2xfcmVhZDMyKCkgZmFtaWx5IHRvIGFjY2VzcyB0aGVzZSByZWdpc3RlcnM7Ci0gKiB0aGVzZSBwcm92aWRlIG9ubHkgc2ltcGxlIFBDSSBidXMgYWNjZXNzLCB3aXRob3V0IHdha2luZyB1cCB0aGUgTUFDLgotICovCi0jZGVmaW5lIEhCVVNfQkFTRQkoMHg0MDApCi0KLS8qCi0gKiBSZWdpc3RlcnMgZm9yIGFjY2Vzc2luZyBkZXZpY2UncyBpbnRlcm5hbCBTUkFNIG1lbW9yeSAoZS5nLiBTQ0QgU1JBTQotICogc3RydWN0dXJlcywgZXJyb3IgbG9nLCBldmVudCBsb2csIHZlcmlmeWluZyB1Q29kZSBsb2FkKS4KLSAqIEZpcnN0IHdyaXRlIHRvIGFkZHJlc3MgcmVnaXN0ZXIsIHRoZW4gcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGRhdGEgcmVnaXN0ZXIKLSAqIHRvIGNvbXBsZXRlIHRoZSBqb2IuICBPbmNlIHRoZSBhZGRyZXNzIHJlZ2lzdGVyIGlzIHNldCB1cCwgYWNjZXNzZXMgdG8KLSAqIGRhdGEgcmVnaXN0ZXJzIGF1dG8taW5jcmVtZW50IHRoZSBhZGRyZXNzIGJ5IG9uZSBkd29yZC4KLSAqIEJpdCB1c2FnZSBmb3IgYWRkcmVzcyByZWdpc3RlcnMgKHJlYWQgb3Igd3JpdGUpOgotICogIDAtMzE6ICBtZW1vcnkgYWRkcmVzcyB3aXRoaW4gZGV2aWNlCi0gKi8KLSNkZWZpbmUgSEJVU19UQVJHX01FTV9SQUREUiAgICAgKEhCVVNfQkFTRSsweDAwYykKLSNkZWZpbmUgSEJVU19UQVJHX01FTV9XQUREUiAgICAgKEhCVVNfQkFTRSsweDAxMCkKLSNkZWZpbmUgSEJVU19UQVJHX01FTV9XREFUICAgICAgKEhCVVNfQkFTRSsweDAxOCkKLSNkZWZpbmUgSEJVU19UQVJHX01FTV9SREFUICAgICAgKEhCVVNfQkFTRSsweDAxYykKLQotLyogTWFpbGJveCBDLCB1c2VkIGFzIHdvcmthcm91bmQgYWx0ZXJuYXRpdmUgdG8gQ1NSX1VDT0RFX0RSVl9HUDEgbWFpbGJveCAqLwotI2RlZmluZSBIQlVTX1RBUkdfTUJYX0MgICAgICAgICAoSEJVU19CQVNFKzB4MDMwKQotI2RlZmluZSBIQlVTX1RBUkdfTUJYX0NfUkVHX0JJVF9DTURfQkxPQ0tFRCAgICAgICAgICgweDAwMDAwMDA0KQotCi0vKgotICogUmVnaXN0ZXJzIGZvciBhY2Nlc3NpbmcgZGV2aWNlJ3MgaW50ZXJuYWwgcGVyaXBoZXJhbCByZWdpc3RlcnMKLSAqIChlLmcuIFNDRCwgQlNNLCBldGMuKS4gIEZpcnN0IHdyaXRlIHRvIGFkZHJlc3MgcmVnaXN0ZXIsCi0gKiB0aGVuIHJlYWQgZnJvbSBvciB3cml0ZSB0byBkYXRhIHJlZ2lzdGVyIHRvIGNvbXBsZXRlIHRoZSBqb2IuCi0gKiBCaXQgdXNhZ2UgZm9yIGFkZHJlc3MgcmVnaXN0ZXJzIChyZWFkIG9yIHdyaXRlKToKLSAqICAwLTE1OiAgcmVnaXN0ZXIgYWRkcmVzcyAob2Zmc2V0KSB3aXRoaW4gZGV2aWNlCi0gKiAyNC0yNTogICgjIGJ5dGVzIC0gMSkgdG8gcmVhZCBvciB3cml0ZSAoZS5nLiAzIGZvciBkd29yZCkKLSAqLwotI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9XQUREUiAgICAoSEJVU19CQVNFKzB4MDQ0KQotI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9SQUREUiAgICAoSEJVU19CQVNFKzB4MDQ4KQotI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9XREFUICAgICAoSEJVU19CQVNFKzB4MDRjKQotI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9SREFUICAgICAoSEJVU19CQVNFKzB4MDUwKQotCi0vKgotICogUGVyLVR4LXF1ZXVlIHdyaXRlIHBvaW50ZXIgKGluZGV4LCByZWFsbHkhKQotICogSW5kaWNhdGVzIGluZGV4IHRvIG5leHQgVEZEIHRoYXQgZHJpdmVyIHdpbGwgZmlsbCAoMSBwYXN0IGxhdGVzdCBmaWxsZWQpLgotICogQml0IHVzYWdlOgotICogIDAtNzogIHF1ZXVlIHdyaXRlIGluZGV4Ci0gKiAxMS04OiAgcXVldWUgc2VsZWN0b3IKLSAqLwotI2RlZmluZSBIQlVTX1RBUkdfV1JQVFIgICAgICAgICAoSEJVU19CQVNFKzB4MDYwKQotCi0jZW5kaWYgLyogIV9faXdsX2xlZ2FjeV9jc3JfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEzMTEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2RlYnVnX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfZGVidWdfaF9fCi0KLXN0cnVjdCBpd2xfcHJpdjsKLWV4dGVybiB1MzIgaXdsZWdhY3lfZGVidWdfbGV2ZWw7Ci0KLSNkZWZpbmUgSVdMX0VSUihwLCBmLCBhLi4uKSBkZXZfZXJyKCYoKHApLT5wY2lfZGV2LT5kZXYpLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfV0FSTihwLCBmLCBhLi4uKSBkZXZfd2FybigmKChwKS0+cGNpX2Rldi0+ZGV2KSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0lORk8ocCwgZiwgYS4uLikgZGV2X2luZm8oJigocCktPnBjaV9kZXYtPmRldiksIGYsICMjIGEpCi0jZGVmaW5lIElXTF9DUklUKHAsIGYsIGEuLi4pIGRldl9jcml0KCYoKHApLT5wY2lfZGV2LT5kZXYpLCBmLCAjIyBhKQotCi0jZGVmaW5lIGl3bF9wcmludF9oZXhfZXJyb3IocHJpdiwgcCwgbGVuKQkJCQkgXAotZG8gewkJCQkJCQkJCVwKLQlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgIml3bCBkYXRhOiAiLAkJCQlcCi0JCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLCBwLCBsZW4sIDEpOwkJXAotfSB3aGlsZSAoMCkKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotI2RlZmluZSBJV0xfREVCVUcoX19wcml2LCBsZXZlbCwgZm10LCBhcmdzLi4uKQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChfX3ByaXYpICYgKGxldmVsKSkJCQlcCi0JCWRldl9wcmludGsoS0VSTl9FUlIsICYoX19wcml2LT5ody0+d2lwaHktPmRldiksCQlcCi0JCQkgIiVjICVzICIgZm10LCBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywJXAotCQkJX19mdW5jX18gLCAjIyBhcmdzKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBJV0xfREVCVUdfTElNSVQoX19wcml2LCBsZXZlbCwgZm10LCBhcmdzLi4uKQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChfX3ByaXYpICYgKGxldmVsKSkgJiYgbmV0X3JhdGVsaW1pdCgpKQlcCi0JCWRldl9wcmludGsoS0VSTl9FUlIsICYoX19wcml2LT5ody0+d2lwaHktPmRldiksCQlcCi0JCQkiJWMgJXMgIiBmbXQsIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLAlcCi0JCQkgX19mdW5jX18gLCAjIyBhcmdzKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgbGV2ZWwsIHAsIGxlbikgCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBsZXZlbCkJCQkJXAotCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiaXdsIGRhdGE6ICIsCQlcCi0JCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwgcCwgbGVuLCAxKTsJXAotfSB3aGlsZSAoMCkKLQotI2Vsc2UKLSNkZWZpbmUgSVdMX0RFQlVHKF9fcHJpdiwgbGV2ZWwsIGZtdCwgYXJncy4uLikKLSNkZWZpbmUgSVdMX0RFQlVHX0xJTUlUKF9fcHJpdiwgbGV2ZWwsIGZtdCwgYXJncy4uLikKLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfcHJpbnRfaGV4X2R1bXAoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgbGV2ZWwsCi0JCQkJICAgICAgY29uc3Qgdm9pZCAqcCwgdTMyIGxlbikKLXt9Ci0jZW5kaWYJCQkJLyogQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHICovCi0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotaW50IGl3bF9sZWdhY3lfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgaXdsX2xlZ2FjeV9kYmdmc191bnJlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQKLWl3bF9sZWdhY3lfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZGJnZnNfdW5yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci19Ci0jZW5kaWYJCQkJLyogQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMgKi8KLQotLyoKLSAqIFRvIHVzZSB0aGUgZGVidWcgc3lzdGVtOgotICoKLSAqIElmIHlvdSBhcmUgZGVmaW5pbmcgYSBuZXcgZGVidWcgY2xhc3NpZmljYXRpb24sIHNpbXBseSBhZGQgaXQgdG8gdGhlICNkZWZpbmUKLSAqIGxpc3QgaGVyZSBpbiB0aGUgZm9ybSBvZgotICoKLSAqICNkZWZpbmUgSVdMX0RMX3h4eHggVkFMVUUKLSAqCi0gKiB3aGVyZSB4eHh4IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NpZmljYXRpb24gKGZvciBleGFtcGxlLCBXRVApLgotICoKLSAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElXTF94eHh4X0RFQlVHKCkgbWFjcm8gZGVmaW5pdGlvbiBmb3IgeW91cgotICogY2xhc3NpZmljYXRpb24sIG9yIHVzZSBJV0xfREVCVUcoSVdMX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKLSAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCi0gKgotICogVGhlIGFjdGl2ZSBkZWJ1ZyBsZXZlbHMgY2FuIGJlIGFjY2Vzc2VkIHZpYSBmaWxlcwotICoKLSAqIAkvc3lzL21vZHVsZS9pd2w0OTY1L3BhcmFtZXRlcnMvZGVidWd7NTB9Ci0gKgkvc3lzL21vZHVsZS9pd2wzOTQ1L3BhcmFtZXRlcnMvZGVidWcKLSAqIAkvc3lzL2NsYXNzL25ldC93bGFuMC9kZXZpY2UvZGVidWdfbGV2ZWwKLSAqCi0gKiB3aGVuIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRz15LgotICovCi0KLS8qIDB4MDAwMDAwMEYgLSAweDAwMDAwMDAxICovCi0jZGVmaW5lIElXTF9ETF9JTkZPCQkoMSA8PCAwKQotI2RlZmluZSBJV0xfRExfTUFDODAyMTEJCSgxIDw8IDEpCi0jZGVmaW5lIElXTF9ETF9IQ01ECQkoMSA8PCAyKQotI2RlZmluZSBJV0xfRExfU1RBVEUJCSgxIDw8IDMpCi0vKiAweDAwMDAwMEYwIC0gMHgwMDAwMDAxMCAqLwotI2RlZmluZSBJV0xfRExfTUFDRFVNUAkJKDEgPDwgNCkKLSNkZWZpbmUgSVdMX0RMX0hDTURfRFVNUAkoMSA8PCA1KQotI2RlZmluZSBJV0xfRExfRUVQUk9NCQkoMSA8PCA2KQotI2RlZmluZSBJV0xfRExfUkFESU8JCSgxIDw8IDcpCi0vKiAweDAwMDAwRjAwIC0gMHgwMDAwMDEwMCAqLwotI2RlZmluZSBJV0xfRExfUE9XRVIJCSgxIDw8IDgpCi0jZGVmaW5lIElXTF9ETF9URU1QCQkoMSA8PCA5KQotI2RlZmluZSBJV0xfRExfTk9USUYJCSgxIDw8IDEwKQotI2RlZmluZSBJV0xfRExfU0NBTgkJKDEgPDwgMTEpCi0vKiAweDAwMDBGMDAwIC0gMHgwMDAwMTAwMCAqLwotI2RlZmluZSBJV0xfRExfQVNTT0MJCSgxIDw8IDEyKQotI2RlZmluZSBJV0xfRExfRFJPUAkJKDEgPDwgMTMpCi0jZGVmaW5lIElXTF9ETF9UWFBPV0VSCQkoMSA8PCAxNCkKLSNkZWZpbmUgSVdMX0RMX0FQCQkoMSA8PCAxNSkKLS8qIDB4MDAwRjAwMDAgLSAweDAwMDEwMDAwICovCi0jZGVmaW5lIElXTF9ETF9GVwkJKDEgPDwgMTYpCi0jZGVmaW5lIElXTF9ETF9SRl9LSUxMCQkoMSA8PCAxNykKLSNkZWZpbmUgSVdMX0RMX0ZXX0VSUk9SUwkoMSA8PCAxOCkKLSNkZWZpbmUgSVdMX0RMX0xFRAkJKDEgPDwgMTkpCi0vKiAweDAwRjAwMDAwIC0gMHgwMDEwMDAwMCAqLwotI2RlZmluZSBJV0xfRExfUkFURQkJKDEgPDwgMjApCi0jZGVmaW5lIElXTF9ETF9DQUxJQgkJKDEgPDwgMjEpCi0jZGVmaW5lIElXTF9ETF9XRVAJCSgxIDw8IDIyKQotI2RlZmluZSBJV0xfRExfVFgJCSgxIDw8IDIzKQotLyogMHgwRjAwMDAwMCAtIDB4MDEwMDAwMDAgKi8KLSNkZWZpbmUgSVdMX0RMX1JYCQkoMSA8PCAyNCkKLSNkZWZpbmUgSVdMX0RMX0lTUgkJKDEgPDwgMjUpCi0jZGVmaW5lIElXTF9ETF9IVAkJKDEgPDwgMjYpCi0jZGVmaW5lIElXTF9ETF9JTwkJKDEgPDwgMjcpCi0vKiAweEYwMDAwMDAwIC0gMHgxMDAwMDAwMCAqLwotI2RlZmluZSBJV0xfRExfMTFICQkoMSA8PCAyOCkKLSNkZWZpbmUgSVdMX0RMX1NUQVRTCQkoMSA8PCAyOSkKLSNkZWZpbmUgSVdMX0RMX1RYX1JFUExZCQkoMSA8PCAzMCkKLSNkZWZpbmUgSVdMX0RMX1FPUwkJKDEgPDwgMzEpCi0KLSNkZWZpbmUgSVdMX0RFQlVHX0lORk8ocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9JTkZPLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfTUFDODAyMTEocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9NQUM4MDIxMSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX01BQ0RVTVAocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9NQUNEVU1QLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfVEVNUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RFTVAsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19TQ0FOKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfU0NBTiwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1JYKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUlgsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19UWChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RYLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfSVNSKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfSVNSLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfTEVEKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfTEVELCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfV0VQKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfV0VQLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfSEMocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9IQ01ELCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfSENfRFVNUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0hDTURfRFVNUCwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0VFUFJPTShwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0VFUFJPTSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0NBTElCKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfQ0FMSUIsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19GVyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0ZXLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfUkZfS0lMTChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1JGX0tJTEwsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19EUk9QKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfRFJPUCwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0RST1BfTElNSVQocCwgZiwgYS4uLikJXAotCQlJV0xfREVCVUdfTElNSVQocCwgSVdMX0RMX0RST1AsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19BUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0FQLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfVFhQT1dFUihwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RYUE9XRVIsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19JTyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0lPLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfUkFURShwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1JBVEUsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19SQVRFX0xJTUlUKHAsIGYsIGEuLi4pCVwKLQkJSVdMX0RFQlVHX0xJTUlUKHAsIElXTF9ETF9SQVRFLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfTk9USUYocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9OT1RJRiwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0FTU09DKHAsIGYsIGEuLi4pCVwKLQkJSVdMX0RFQlVHKHAsIElXTF9ETF9BU1NPQyB8IElXTF9ETF9JTkZPLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfQVNTT0NfTElNSVQocCwgZiwgYS4uLikJXAotCQlJV0xfREVCVUdfTElNSVQocCwgSVdMX0RMX0FTU09DIHwgSVdMX0RMX0lORk8sIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19IVChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0hULCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfU1RBVFMocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9TVEFUUywgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1NUQVRTX0xJTUlUKHAsIGYsIGEuLi4pCVwKLQkJSVdMX0RFQlVHX0xJTUlUKHAsIElXTF9ETF9TVEFUUywgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1RYX1JFUExZKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfVFhfUkVQTFksIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19UWF9SRVBMWV9MSU1JVChwLCBmLCBhLi4uKSBcCi0JCUlXTF9ERUJVR19MSU1JVChwLCBJV0xfRExfVFhfUkVQTFksIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19RT1MocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9RT1MsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19SQURJTyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1JBRElPLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfUE9XRVIocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9QT1dFUiwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHXzExSChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMXzExSCwgZiwgIyMgYSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRlYnVnZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2OTk2YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGVidWdmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLQotLyogY3JlYXRlIGFuZCByZW1vdmUgb2YgZmlsZXMgKi8KLSNkZWZpbmUgREVCVUdGU19BRERfRklMRShuYW1lLCBwYXJlbnQsIG1vZGUpIGRvIHsJCQlcCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCNuYW1lLCBtb2RlLCBwYXJlbnQsIHByaXYsCQlcCi0JCQkgJml3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfb3BzKSkJCVwKLQkJZ290byBlcnI7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBERUJVR0ZTX0FERF9CT09MKG5hbWUsIHBhcmVudCwgcHRyKSBkbyB7CQkJXAotCXN0cnVjdCBkZW50cnkgKl9fdG1wOwkJCQkJCVwKLQlfX3RtcCA9IGRlYnVnZnNfY3JlYXRlX2Jvb2woI25hbWUsIFNfSVdVU1IgfCBTX0lSVVNSLAkJXAotCQkJCSAgICBwYXJlbnQsIHB0cik7CQkJXAotCWlmIChJU19FUlIoX190bXApIHx8ICFfX3RtcCkJCQkJCVwKLQkJZ290byBlcnI7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBERUJVR0ZTX0FERF9YMzIobmFtZSwgcGFyZW50LCBwdHIpIGRvIHsJCQkJXAotCXN0cnVjdCBkZW50cnkgKl9fdG1wOwkJCQkJCVwKLQlfX3RtcCA9IGRlYnVnZnNfY3JlYXRlX3gzMigjbmFtZSwgU19JV1VTUiB8IFNfSVJVU1IsCQlcCi0JCQkJICAgcGFyZW50LCBwdHIpOwkJCVwKLQlpZiAoSVNfRVJSKF9fdG1wKSB8fCAhX190bXApCQkJCQlcCi0JCWdvdG8gZXJyOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qIGZpbGUgb3BlcmF0aW9uICovCi0jZGVmaW5lIERFQlVHRlNfUkVBRF9GVU5DKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsICAgICAgICAgICAgICAgXAotCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsICAgICAgICAgIFwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCi0jZGVmaW5lIERFQlVHRlNfV1JJVEVfRlVOQyhuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCAgICAgICAgICAgICAgXAotCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsICAgIFwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCi0KLXN0YXRpYyBpbnQKLWl3bF9sZWdhY3lfZGJnZnNfb3Blbl9maWxlX2dlbmVyaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBERUJVR0ZTX1JFQURfRklMRV9PUFMobmFtZSkgCQkJCVwKLQlERUJVR0ZTX1JFQURfRlVOQyhuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXdsX2xlZ2FjeV9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKLQkucmVhZCA9IGl3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfcmVhZCwJCQkJXAotCS5vcGVuID0gaXdsX2xlZ2FjeV9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywgICAgICAgICAgICAgICAgICAgIAlcCi0JLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCQlcCi19OwotCi0jZGVmaW5lIERFQlVHRlNfV1JJVEVfRklMRV9PUFMobmFtZSkgCQkJCVwKLQlERUJVR0ZTX1dSSVRFX0ZVTkMobmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXdsX2xlZ2FjeV9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKLQkud3JpdGUgPSBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX3dyaXRlLAkJCVwKLQkub3BlbiA9IGl3bF9sZWdhY3lfZGJnZnNfb3Blbl9maWxlX2dlbmVyaWMsICAgICAgICAgICAgICAgICAgICAJXAotCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQkJXAotfTsKLQotI2RlZmluZSBERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JREVCVUdGU19SRUFEX0ZVTkMobmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlERUJVR0ZTX1dSSVRFX0ZVTkMobmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXdsX2xlZ2FjeV9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKLQkud3JpdGUgPSBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX3dyaXRlLAkJCVwKLQkucmVhZCA9IGl3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfcmVhZCwJCQkJXAotCS5vcGVuID0gaXdsX2xlZ2FjeV9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywJCQlcCi0JLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCQlcCi19OwotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3R4X3N0YXRpc3RpY3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqYnVmOwotCWludCBwb3MgPSAwOwotCi0JaW50IGNudDsKLQlzc2l6ZV90IHJldDsKLQljb25zdCBzaXplX3QgYnVmc3ogPSAxMDAgKwotCQlzaXplb2YoY2hhcikgKiA1MCAqIChNQU5BR0VNRU5UX01BWCArIENPTlRST0xfTUFYKTsKLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiTWFuYWdlbWVudDpcbiIpOwotCWZvciAoY250ID0gMDsgY250IDwgTUFOQUdFTUVOVF9NQVg7IGNudCsrKSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkgIlx0JTI1c1x0XHQ6ICV1XG4iLAotCQkJCSBpd2xfbGVnYWN5X2dldF9tZ210X3N0cmluZyhjbnQpLAotCQkJCSBwcml2LT50eF9zdGF0cy5tZ210W2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJDb250cm9sXG4iKTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IENPTlRST0xfTUFYOyBjbnQrKykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJICJcdCUyNXNcdFx0OiAldVxuIiwKLQkJCQkgaXdsX2xlZ2FjeV9nZXRfY3RybF9zdHJpbmcoY250KSwKLQkJCQkgcHJpdi0+dHhfc3RhdHMuY3RybFtjbnRdKTsKLQl9Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiRGF0YTpcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0Y250OiAldVxuIiwKLQkJCSBwcml2LT50eF9zdGF0cy5kYXRhX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRieXRlczogJWxsdVxuIiwKLQkJCSBwcml2LT50eF9zdGF0cy5kYXRhX2J5dGVzKTsKLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1pd2xfbGVnYWN5X2RiZ2ZzX2NsZWFyX3RyYWZmaWNfc3RhdGlzdGljc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdTMyIGNsZWFyX2ZsYWc7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiV4IiwgJmNsZWFyX2ZsYWcpICE9IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCWl3bF9sZWdhY3lfY2xlYXJfdHJhZmZpY19zdGF0cyhwcml2KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19yeF9zdGF0aXN0aWNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKmJ1ZjsKLQlpbnQgcG9zID0gMDsKLQlpbnQgY250OwotCXNzaXplX3QgcmV0OwotCWNvbnN0IHNpemVfdCBidWZzeiA9IDEwMCArCi0JCXNpemVvZihjaGFyKSAqIDUwICogKE1BTkFHRU1FTlRfTUFYICsgQ09OVFJPTF9NQVgpOwotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIk1hbmFnZW1lbnQ6XG4iKTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IE1BTkFHRU1FTlRfTUFYOyBjbnQrKykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJICJcdCUyNXNcdFx0OiAldVxuIiwKLQkJCQkgaXdsX2xlZ2FjeV9nZXRfbWdtdF9zdHJpbmcoY250KSwKLQkJCQkgcHJpdi0+cnhfc3RhdHMubWdtdFtjbnRdKTsKLQl9Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiQ29udHJvbDpcbiIpOwotCWZvciAoY250ID0gMDsgY250IDwgQ09OVFJPTF9NQVg7IGNudCsrKSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkgIlx0JTI1c1x0XHQ6ICV1XG4iLAotCQkJCSBpd2xfbGVnYWN5X2dldF9jdHJsX3N0cmluZyhjbnQpLAotCQkJCSBwcml2LT5yeF9zdGF0cy5jdHJsW2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJEYXRhOlxuIik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRjbnQ6ICV1XG4iLAotCQkJIHByaXYtPnJ4X3N0YXRzLmRhdGFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdGJ5dGVzOiAlbGx1XG4iLAotCQkJIHByaXYtPnJ4X3N0YXRzLmRhdGFfYnl0ZXMpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIEJZVEUxX01BU0sgMHgwMDAwMDBmZjsKLSNkZWZpbmUgQllURTJfTUFTSyAweDAwMDBmZmZmOwotI2RlZmluZSBCWVRFM19NQVNLIDB4MDBmZmZmZmY7Ci1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3NyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQl1MzIgdmFsOwotCWNoYXIgKmJ1ZjsKLQlzc2l6ZV90IHJldDsKLQlpbnQgaTsKLQlpbnQgcG9zID0gMDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc2l6ZV90IGJ1ZnN6OwotCi0JLyogZGVmYXVsdCBpcyB0byBkdW1wIHRoZSBlbnRpcmUgZGF0YSBzZWdtZW50ICovCi0JaWYgKCFwcml2LT5kYmdmc19zcmFtX29mZnNldCAmJiAhcHJpdi0+ZGJnZnNfc3JhbV9sZW4pIHsKLQkJcHJpdi0+ZGJnZnNfc3JhbV9vZmZzZXQgPSAweDgwMDAwMDsKLQkJaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkKLQkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gcHJpdi0+dWNvZGVfaW5pdF9kYXRhLmxlbjsKLQkJZWxzZQotCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gPSBwcml2LT51Y29kZV9kYXRhLmxlbjsKLQl9Ci0JYnVmc3ogPSAgMzAgKyBwcml2LT5kYmdmc19zcmFtX2xlbiAqIHNpemVvZihjaGFyKSAqIDEwOwotCWJ1ZiA9IGttYWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJzcmFtX2xlbjogMHgleFxuIiwKLQkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJzcmFtX29mZnNldDogMHgleFxuIiwKLQkJCXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0KTsKLQlmb3IgKGkgPSBwcml2LT5kYmdmc19zcmFtX2xlbjsgaSA+IDA7IGkgLT0gNCkgewotCQl2YWwgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgcHJpdi0+ZGJnZnNfc3JhbV9vZmZzZXQgKyBcCi0JCQkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuIC0gaSk7Ci0JCWlmIChpIDwgNCkgewotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIDE6Ci0JCQkJdmFsICY9IEJZVEUxX01BU0s7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJdmFsICY9IEJZVEUyX01BU0s7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJdmFsICY9IEJZVEUzX01BU0s7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCEoaSAlIDE2KSkKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIjB4JTA4eCAiLCB2YWwpOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3NyYW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzY0XTsKLQlpbnQgYnVmX3NpemU7Ci0JdTMyIG9mZnNldCwgbGVuOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChzc2NhbmYoYnVmLCAiJXgsJXgiLCAmb2Zmc2V0LCAmbGVuKSA9PSAyKSB7Ci0JCXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0ID0gb2Zmc2V0OwotCQlwcml2LT5kYmdmc19zcmFtX2xlbiA9IGxlbjsKLQl9IGVsc2UgewotCQlwcml2LT5kYmdmc19zcmFtX29mZnNldCA9IDA7Ci0JCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gMDsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1pd2xfbGVnYWN5X2RiZ2ZzX3N0YXRpb25zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKLQlpbnQgbWF4X3N0YSA9IHByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7Ci0JY2hhciAqYnVmOwotCWludCBpLCBqLCBwb3MgPSAwOwotCXNzaXplX3QgcmV0OwotCS8qIEFkZCAzMCBmb3IgaW5pdGlhbCBzdHJpbmcgKi8KLQljb25zdCBzaXplX3QgYnVmc3ogPSAzMCArIHNpemVvZihjaGFyKSAqIDUwMCAqIChwcml2LT5udW1fc3RhdGlvbnMpOwotCi0JYnVmID0ga21hbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnVtIG9mIHN0YXRpb25zOiAlZFxuXG4iLAotCQkJcHJpdi0+bnVtX3N0YXRpb25zKTsKLQotCWZvciAoaSA9IDA7IGkgPCBtYXhfc3RhOyBpKyspIHsKLQkJc3RhdGlvbiA9ICZwcml2LT5zdGF0aW9uc1tpXTsKLQkJaWYgKCFzdGF0aW9uLT51c2VkKQotCQkJY29udGludWU7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkgInN0YXRpb24gJWQgLSBhZGRyOiAlcE0sIGZsYWdzOiAlI3hcbiIsCi0JCQkJIGksIHN0YXRpb24tPnN0YS5zdGEuYWRkciwKLQkJCQkgc3RhdGlvbi0+c3RhLnN0YXRpb25fZmxhZ3NfbXNrKTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJUSURcdHNlcV9udW1cdHR4cV9pZFx0ZnJhbWVzXHR0ZmRzXHQiKTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJzdGFydF9pZHhcdGJpdG1hcFx0XHRcdHJhdGVfbl9mbGFnc1xuIik7Ci0KLQkJZm9yIChqID0gMDsgaiA8IE1BWF9USURfQ09VTlQ7IGorKykgewotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIlZDpcdCUjeFx0JSN4XHQldVx0JXVcdCV1XHRcdCUjLjE2bGx4XHQlI3giLAotCQkJCWosIHN0YXRpb24tPnRpZFtqXS5zZXFfbnVtYmVyLAotCQkJCXN0YXRpb24tPnRpZFtqXS5hZ2cudHhxX2lkLAotCQkJCXN0YXRpb24tPnRpZFtqXS5hZ2cuZnJhbWVfY291bnQsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLnRmZHNfaW5fcXVldWUsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy5zdGFydF9pZHgsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy5iaXRtYXAsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy5yYXRlX25fZmxhZ3MpOwotCi0JCQlpZiAoc3RhdGlvbi0+dGlkW2pdLmFnZy53YWl0X2Zvcl9iYSkKLQkJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJCQkgIiAtIHdhaXRmb3JiYSIpOwotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKLQkJfQotCi0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0JfQotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX252bV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICAgIHNpemVfdCBjb3VudCwKLQkJCQkgICAgICAgbG9mZl90ICpwcG9zKQotewotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMCwgb2ZzID0gMCwgYnVmX3NpemUgPSAwOwotCWNvbnN0IHU4ICpwdHI7Ci0JY2hhciAqYnVmOwotCXUxNiBlZXByb21fdmVyOwotCXNpemVfdCBlZXByb21fbGVuID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemU7Ci0JYnVmX3NpemUgPSA0ICogZWVwcm9tX2xlbiArIDI1NjsKLQotCWlmIChlZXByb21fbGVuICUgMTYpIHsKLQkJSVdMX0VSUihwcml2LCAiTlZNIHNpemUgaXMgbm90IG11bHRpcGxlIG9mIDE2LlxuIik7Ci0JCXJldHVybiAtRU5PREFUQTsKLQl9Ci0KLQlwdHIgPSBwcml2LT5lZXByb207Ci0JaWYgKCFwdHIpIHsKLQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBFRVBST00gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogNCBjaGFyYWN0ZXJzIGZvciBieXRlIDB4WVkgKi8KLQlidWYgPSBremFsbG9jKGJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQllZXByb21fdmVyID0gaXdsX2xlZ2FjeV9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fVkVSU0lPTik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1Zl9zaXplIC0gcG9zLCAiRUVQUk9NICIKLQkJCSJ2ZXJzaW9uOiAweCV4XG4iLCBlZXByb21fdmVyKTsKLQlmb3IgKG9mcyA9IDAgOyBvZnMgPCBlZXByb21fbGVuIDsgb2ZzICs9IDE2KSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZfc2l6ZSAtIHBvcywgIjB4JS40eCAiLCBvZnMpOwotCQloZXhfZHVtcF90b19idWZmZXIocHRyICsgb2ZzLCAxNiAsIDE2LCAyLCBidWYgKyBwb3MsCi0JCQkJICAgYnVmX3NpemUgLSBwb3MsIDApOwotCQlwb3MgKz0gc3RybGVuKGJ1ZiArIHBvcyk7Ci0JCWlmIChidWZfc2l6ZSAtIHBvcyA+IDApCi0JCQlidWZbcG9zKytdID0gJ1xuJzsKLQl9Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1pd2xfbGVnYWN5X2RiZ2ZzX2NoYW5uZWxzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbHMgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnN1cHBfYmFuZCA9IE5VTEw7Ci0JaW50IHBvcyA9IDAsIGksIGJ1ZnN6ID0gUEFHRV9TSVpFOwotCWNoYXIgKmJ1ZjsKLQlzc2l6ZV90IHJldDsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX0dFT19DT05GSUdVUkVELCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXN1cHBfYmFuZCA9IGl3bF9nZXRfaHdfbW9kZShwcml2LCBJRUVFODAyMTFfQkFORF8yR0haKTsKLQlpZiAoc3VwcF9iYW5kKSB7Ci0JCWNoYW5uZWxzID0gc3VwcF9iYW5kLT5jaGFubmVsczsKLQotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIkRpc3BsYXlpbmcgJWQgY2hhbm5lbHMgaW4gMi40R0h6IGJhbmQgODAyLjExYmcpOlxuIiwKLQkJCQlzdXBwX2JhbmQtPm5fY2hhbm5lbHMpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBzdXBwX2JhbmQtPm5fY2hhbm5lbHM7IGkrKykKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiJWQ6ICVkZEJtOiBCU1MlcyVzLCAlcy5cbiIsCi0JCQkJY2hhbm5lbHNbaV0uaHdfdmFsdWUsCi0JCQkJY2hhbm5lbHNbaV0ubWF4X3Bvd2VyLAotCQkJCWNoYW5uZWxzW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVIgPwotCQkJCSIgKElFRUUgODAyLjExaCByZXF1aXJlZCkiIDogIiIsCi0JCQkJKChjaGFubmVsc1tpXS5mbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lCU1MpCi0JCQkJfHwgKGNoYW5uZWxzW2ldLmZsYWdzICYKLQkJCQlJRUVFODAyMTFfQ0hBTl9SQURBUikpID8gIiIgOgotCQkJCSIsIElCU1MiLAotCQkJCWNoYW5uZWxzW2ldLmZsYWdzICYKLQkJCQlJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gPwotCQkJCSJwYXNzaXZlIG9ubHkiIDogImFjdGl2ZS9wYXNzaXZlIik7Ci0JfQotCXN1cHBfYmFuZCA9IGl3bF9nZXRfaHdfbW9kZShwcml2LCBJRUVFODAyMTFfQkFORF81R0haKTsKLQlpZiAoc3VwcF9iYW5kKSB7Ci0JCWNoYW5uZWxzID0gc3VwcF9iYW5kLT5jaGFubmVsczsKLQotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIkRpc3BsYXlpbmcgJWQgY2hhbm5lbHMgaW4gNS4yR0h6IGJhbmQgKDgwMi4xMWEpXG4iLAotCQkJCXN1cHBfYmFuZC0+bl9jaGFubmVscyk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHN1cHBfYmFuZC0+bl9jaGFubmVsczsgaSsrKQotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIlZDogJWRkQm06IEJTUyVzJXMsICVzLlxuIiwKLQkJCQljaGFubmVsc1tpXS5od192YWx1ZSwKLQkJCQljaGFubmVsc1tpXS5tYXhfcG93ZXIsCi0JCQkJY2hhbm5lbHNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUiA/Ci0JCQkJIiAoSUVFRSA4MDIuMTFoIHJlcXVpcmVkKSIgOiAiIiwKLQkJCQkoKGNoYW5uZWxzW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSUJTUykKLQkJCQl8fCAoY2hhbm5lbHNbaV0uZmxhZ3MgJgotCQkJCUlFRUU4MDIxMV9DSEFOX1JBREFSKSkgPyAiIiA6Ci0JCQkJIiwgSUJTUyIsCi0JCQkJY2hhbm5lbHNbaV0uZmxhZ3MgJgotCQkJCUlFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiA/Ci0JCQkJInBhc3NpdmUgb25seSIgOiAiYWN0aXZlL3Bhc3NpdmUiKTsKLQl9Ci0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls1MTJdOwotCWludCBwb3MgPSAwOwotCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX0hDTURfQUNUSVZFOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfSU5UX0VOQUJMRUQ6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19SRl9LSUxMX0hXOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19DVF9LSUxMOlx0XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19DVF9LSUxMLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX0lOSVQ6XHRcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX0lOSVQsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfQUxJVkU6XHRcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX0FMSVZFLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX1JFQURZOlx0XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19URU1QRVJBVFVSRTpcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX1RFTVBFUkFUVVJFLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX0dFT19DT05GSUdVUkVEOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfRVhJVF9QRU5ESU5HOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX1NUQVRJU1RJQ1M6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19TVEFUSVNUSUNTLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX1NDQU5OSU5HOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfU0NBTl9BQk9SVElORzpcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfU0NBTl9IVzpcdFx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19QT1dFUl9QTUk6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfRldfRVJST1I6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19GV19FUlJPUiwgJnByaXYtPnN0YXR1cykpOwotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19pbnRlcnJ1cHRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWludCBjbnQgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSAyNCAqIDY0OyAvKiAyNCBpdGVtcyAqIDY0IGNoYXIgcGVyIGl0ZW0gKi8KLQlzc2l6ZV90IHJldDsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIkludGVycnVwdCBTdGF0aXN0aWNzIFJlcG9ydDpcbiIpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiSFcgRXJyb3I6XHRcdFx0ICV1XG4iLAotCQlwcml2LT5pc3Jfc3RhdHMuaHcpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNXIEVycm9yOlx0XHRcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLnN3KTsKLQlpZiAocHJpdi0+aXNyX3N0YXRzLnN3IHx8IHByaXYtPmlzcl9zdGF0cy5odykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiXHRMYXN0IFJlc3RhcnRpbmcgQ29kZTogIDB4JVhcbiIsCi0JCQlwcml2LT5pc3Jfc3RhdHMuZXJyX2NvZGUpOwotCX0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJGcmFtZSB0cmFuc21pdHRlZDpcdFx0ICV1XG4iLAotCQlwcml2LT5pc3Jfc3RhdHMuc2NoKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJBbGl2ZSBpbnRlcnJ1cHQ6XHRcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLmFsaXZlKTsKLSNlbmRpZgotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJIkhXIFJGIEtJTEwgc3dpdGNoIHRvZ2dsZWQ6XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy5yZmtpbGwpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiQ1QgS0lMTDpcdFx0XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy5jdGtpbGwpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiV2FrZXVwIEludGVycnVwdDpcdFx0ICV1XG4iLAotCQlwcml2LT5pc3Jfc3RhdHMud2FrZXVwKTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJIlJ4IGNvbW1hbmQgcmVzcG9uc2VzOlx0XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy5yeCk7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBSRVBMWV9NQVg7IGNudCsrKSB7Ci0JCWlmIChwcml2LT5pc3Jfc3RhdHMucnhfaGFuZGxlcnNbY250XSA+IDApCi0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIlx0UnggaGFuZGxlclslMzZzXTpcdFx0ICV1XG4iLAotCQkJCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY250KSwKLQkJCQlwcml2LT5pc3Jfc3RhdHMucnhfaGFuZGxlcnNbY250XSk7Ci0JfQotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiVHgvRkggaW50ZXJydXB0Olx0XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy50eCk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJVbmV4cGVjdGVkIElOVEE6XHRcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLnVuaGFuZGxlZCk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfaW50ZXJydXB0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzhdOwotCWludCBidWZfc2l6ZTsKLQl1MzIgcmVzZXRfZmxhZzsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAgMSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHNzY2FuZihidWYsICIleCIsICZyZXNldF9mbGFnKSAhPSAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAocmVzZXRfZmxhZyA9PSAwKQotCQlpd2xfbGVnYWN5X2NsZWFyX2lzcl9zdGF0cyhwcml2KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QKLWl3bF9sZWdhY3lfZGJnZnNfcW9zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JaW50IHBvcyA9IDAsIGk7Ci0JY2hhciBidWZbMjU2ICogTlVNX0lXTF9SWE9OX0NUWF07Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjb250ZXh0ICVkOlxuIiwKLQkJCQkgY3R4LT5jdHhpZCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBQ19OVU07IGkrKykgewotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJcdGN3X21pblx0Y3dfbWF4XHRhaWZzblx0dHhvcFxuIik7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIkFDWyVkXVx0JXVcdCV1XHQldVx0JXVcbiIsIGksCi0JCQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbaV0uY3dfbWluLAotCQkJCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW2ldLmN3X21heCwKLQkJCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5haWZzbiwKLQkJCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5lZGNhX3R4b3ApOwotCQl9Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0JfQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19kaXNhYmxlX2h0NDBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCWludCBodDQwOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmh0NDApICE9IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICghaXdsX2xlZ2FjeV9pc19hbnlfYXNzb2NpYXRlZChwcml2KSkKLQkJcHJpdi0+ZGlzYWJsZV9odDQwID0gaHQ0MCA/IHRydWUgOiBmYWxzZTsKLQllbHNlIHsKLQkJSVdMX0VSUihwcml2LCAiU3RhIGFzc29jaWF0ZWQgd2l0aCBBUCAtICIKLQkJCSJDaGFuZ2UgdG8gNDBNSHogY2hhbm5lbCBzdXBwb3J0IGlzIG5vdCBhbGxvd2VkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2Rpc2FibGVfaHQ0MF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzEwMF07Ci0JaW50IHBvcyA9IDA7Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiMTFuIDQwTUh6IE1vZGU6ICVzXG4iLAotCQkJcHJpdi0+ZGlzYWJsZV9odDQwID8gIkRpc2FibGVkIiA6ICJFbmFibGVkIik7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotfQotCi1ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoc3JhbSk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMobnZtKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhzdGF0aW9ucyk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMoY2hhbm5lbHMpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHN0YXR1cyk7Ci1ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoaW50ZXJydXB0KTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhxb3MpOwotREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGRpc2FibGVfaHQ0MCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdHJhZmZpY19sb2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMCwgb2ZzID0gMDsKLQlpbnQgY250ID0gMCwgZW50cnk7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwotCXN0cnVjdCBpd2xfcXVldWUgKnE7Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6ID0gKChJV0xfVFJBRkZJQ19FTlRSSUVTICogSVdMX1RSQUZGSUNfRU5UUllfU0laRSAqIDY0KSAqIDIpICsKLQkJKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgKiAzMiAqIDgpICsgNDAwOwotCWNvbnN0IHU4ICpwdHI7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlpZiAoIXByaXYtPnR4cSkgewotCQlJV0xfRVJSKHByaXYsICJ0eHEgbm90IHJlYWR5XG4iKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlR4IFF1ZXVlXG4iKTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgY250KyspIHsKLQkJdHhxID0gJnByaXYtPnR4cVtjbnRdOwotCQlxID0gJnR4cS0+cTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJxWyVkXTogcmVhZF9wdHI6ICV1LCB3cml0ZV9wdHI6ICV1XG4iLAotCQkJCWNudCwgcS0+cmVhZF9wdHIsIHEtPndyaXRlX3B0cik7Ci0JfQotCWlmIChwcml2LT50eF90cmFmZmljICYmIChpd2xlZ2FjeV9kZWJ1Z19sZXZlbCAmIElXTF9ETF9UWCkpIHsKLQkJcHRyID0gcHJpdi0+dHhfdHJhZmZpYzsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJUeCBUcmFmZmljIGlkeDogJXVcbiIsCXByaXYtPnR4X3RyYWZmaWNfaWR4KTsKLQkJZm9yIChjbnQgPSAwLCBvZnMgPSAwOyBjbnQgPCBJV0xfVFJBRkZJQ19FTlRSSUVTOyBjbnQrKykgewotCQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgSVdMX1RSQUZGSUNfRU5UUllfU0laRSAvIDE2OwotCQkJICAgICBlbnRyeSsrLCAgb2ZzICs9IDE2KSB7Ci0JCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCQkJIjB4JS40eCAiLCBvZnMpOwotCQkJCWhleF9kdW1wX3RvX2J1ZmZlcihwdHIgKyBvZnMsIDE2LCAxNiwgMiwKLQkJCQkJCSAgIGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIDApOwotCQkJCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKLQkJCQlpZiAoYnVmc3ogLSBwb3MgPiAwKQotCQkJCQlidWZbcG9zKytdID0gJ1xuJzsKLQkJCX0KLQkJfQotCX0KLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlJ4IFF1ZXVlXG4iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkicmVhZDogJXUsIHdyaXRlOiAldVxuIiwKLQkJCSByeHEtPnJlYWQsIHJ4cS0+d3JpdGUpOwotCi0JaWYgKHByaXYtPnJ4X3RyYWZmaWMgJiYgKGl3bGVnYWN5X2RlYnVnX2xldmVsICYgSVdMX0RMX1JYKSkgewotCQlwdHIgPSBwcml2LT5yeF90cmFmZmljOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIlJ4IFRyYWZmaWMgaWR4OiAldVxuIiwJcHJpdi0+cnhfdHJhZmZpY19pZHgpOwotCQlmb3IgKGNudCA9IDAsIG9mcyA9IDA7IGNudCA8IElXTF9UUkFGRklDX0VOVFJJRVM7IGNudCsrKSB7Ci0JCQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBJV0xfVFJBRkZJQ19FTlRSWV9TSVpFIC8gMTY7Ci0JCQkgICAgIGVudHJ5KyssICBvZnMgKz0gMTYpIHsKLQkJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJCQkiMHglLjR4ICIsIG9mcyk7Ci0JCQkJaGV4X2R1bXBfdG9fYnVmZmVyKHB0ciArIG9mcywgMTYsIDE2LCAyLAotCQkJCQkJICAgYnVmICsgcG9zLCBidWZzeiAtIHBvcywgMCk7Ci0JCQkJcG9zICs9IHN0cmxlbihidWYgKyBwb3MpOwotCQkJCWlmIChidWZzeiAtIHBvcyA+IDApCi0JCQkJCWJ1Zltwb3MrK10gPSAnXG4nOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3RyYWZmaWNfbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzhdOwotCWludCBidWZfc2l6ZTsKLQlpbnQgdHJhZmZpY19sb2c7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmdHJhZmZpY19sb2cpICE9IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICh0cmFmZmljX2xvZyA9PSAwKQotCQlpd2xfbGVnYWN5X3Jlc2V0X3RyYWZmaWNfbG9nKHByaXYpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3R4X3F1ZXVlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwotCWNoYXIgKmJ1ZjsKLQlpbnQgcG9zID0gMDsKLQlpbnQgY250OwotCWludCByZXQ7Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGNoYXIpICogNjQgKgotCQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7Ci0KLQlpZiAoIXByaXYtPnR4cSkgewotCQlJV0xfRVJSKHByaXYsICJ0eHEgbm90IHJlYWR5XG4iKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoY250ID0gMDsgY250IDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBjbnQrKykgewotCQl0eHEgPSAmcHJpdi0+dHhxW2NudF07Ci0JCXEgPSAmdHhxLT5xOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJImh3cSAlLjJkOiByZWFkPSV1IHdyaXRlPSV1IHN0b3A9JWQiCi0JCQkJIiBzd3FfaWQ9JSMuMnggKGFjICVkL2h3cSAlZClcbiIsCi0JCQkJY250LCBxLT5yZWFkX3B0ciwgcS0+d3JpdGVfcHRyLAotCQkJCSEhdGVzdF9iaXQoY250LCBwcml2LT5xdWV1ZV9zdG9wcGVkKSwKLQkJCQl0eHEtPnN3cV9pZCwgdHhxLT5zd3FfaWQgJiAzLAotCQkJCSh0eHEtPnN3cV9pZCA+PiAyKSAmIDB4MWYpOwotCQlpZiAoY250ID49IDQpCi0JCQljb250aW51ZTsKLQkJLyogZm9yIHRoZSBBQ3MsIGRpc3BsYXkgdGhlIHN0b3AgY291bnQgdG9vICovCi0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiICAgICAgICBzdG9wLWNvdW50OiAlZFxuIiwKLQkJCQlhdG9taWNfcmVhZCgmcHJpdi0+cXVldWVfc3RvcF9jb3VudFtjbnRdKSk7Ci0JfQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19yeF9xdWV1ZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCWNoYXIgYnVmWzI1Nl07Ci0JaW50IHBvcyA9IDA7Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJyZWFkOiAldVxuIiwKLQkJCQkJCXJ4cS0+cmVhZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAid3JpdGU6ICV1XG4iLAotCQkJCQkJcnhxLT53cml0ZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiZnJlZV9jb3VudDogJXVcbiIsCi0JCQkJCQlyeHEtPmZyZWVfY291bnQpOwotCWlmIChyeHEtPnJiX3N0dHMpIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2xvc2VkX3JiX251bTogJXVcbiIsCi0JCQkgbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT5jbG9zZWRfcmJfbnVtKSAmICAweDBGRkYpOwotCX0gZWxzZSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJImNsb3NlZF9yYl9udW06IE5vdCBBbGxvY2F0ZWRcbiIpOwotCX0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPmRlYnVnZnNfb3BzLnJ4X3N0YXRzX3JlYWQoZmlsZSwKLQkJCXVzZXJfYnVmLCBjb3VudCwgcHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPmRlYnVnZnNfb3BzLnR4X3N0YXRzX3JlYWQoZmlsZSwKLQkJCXVzZXJfYnVmLCBjb3VudCwgcHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZGVidWdmc19vcHMuZ2VuZXJhbF9zdGF0c19yZWFkKGZpbGUsCi0JCQl1c2VyX2J1ZiwgY291bnQsIHBwb3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3NlbnNpdGl2aXR5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMDsKLQlpbnQgY250ID0gMDsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSkgKiA0ICsgMTAwOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YTsKLQotCWRhdGEgPSAmcHJpdi0+c2Vuc2l0aXZpdHlfZGF0YTsKLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9vZmRtKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiYXV0b19jb3JyX29mZG1fbXJjOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtX3gxOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJImF1dG9fY29ycl9vZmRtX21yY194MTpcdFx0ICV1XG4iLAotCQkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJhdXRvX2NvcnJfY2NrOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9jY2tfbXJjOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJImxhc3RfYmFkX3BsY3BfY250X29mZG06XHRcdCAldVxuIiwKLQkJCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImxhc3RfZmFfY250X29mZG06XHRcdCAldVxuIiwKLQkJCWRhdGEtPmxhc3RfZmFfY250X29mZG0pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSJsYXN0X2JhZF9wbGNwX2NudF9jY2s6XHRcdCAldVxuIiwKLQkJCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2Njayk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibGFzdF9mYV9jbnRfY2NrOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5sYXN0X2ZhX2NudF9jY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19jdXJyX3N0YXRlOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPm5yZ19jdXJyX3N0YXRlKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfcHJldl9zdGF0ZTpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5ucmdfcHJldl9zdGF0ZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3ZhbHVlOlx0XHRcdCIpOwotCWZvciAoY250ID0gMDsgY250IDwgMTA7IGNudCsrKSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiAldSIsCi0JCQkJZGF0YS0+bnJnX3ZhbHVlW2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19zaWxlbmNlX3Jzc2k6XHRcdCIpOwotCWZvciAoY250ID0gMDsgY250IDwgTlJHX05VTV9QUkVWX1NUQVRfTDsgY250KyspIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiICV1IiwKLQkJCQlkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19zaWxlbmNlX3JlZjpcdFx0ICV1XG4iLAotCQkJZGF0YS0+bnJnX3NpbGVuY2VfcmVmKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfZW5lcmd5X2lkeDpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5ucmdfZW5lcmd5X2lkeCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfaWR4Olx0XHQgJXVcbiIsCi0JCQlkYXRhLT5ucmdfc2lsZW5jZV9pZHgpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ190aF9jY2s6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+bnJnX3RoX2Njayk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmOlx0ICV1XG4iLAotCQkJZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm51bV9pbl9jY2tfbm9fZmE6XHRcdCAldVxuIiwKLQkJCWRhdGEtPm51bV9pbl9jY2tfbm9fZmEpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ190aF9vZmRtOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPm5yZ190aF9vZmRtKTsKLQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2NoYWluX25vaXNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMDsKLQlpbnQgY250ID0gMDsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSkgKiA0ICsgMTAwOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YTsKLQotCWRhdGEgPSAmcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YTsKLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImFjdGl2ZV9jaGFpbnM6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+YWN0aXZlX2NoYWlucyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2hhaW5fbm9pc2VfYTpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5jaGFpbl9ub2lzZV9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9ub2lzZV9iOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmNoYWluX25vaXNlX2IpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX25vaXNlX2M6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+Y2hhaW5fbm9pc2VfYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2hhaW5fc2lnbmFsX2E6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+Y2hhaW5fc2lnbmFsX2EpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX3NpZ25hbF9iOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmNoYWluX3NpZ25hbF9iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9zaWduYWxfYzpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5jaGFpbl9zaWduYWxfYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYmVhY29uX2NvdW50Olx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmJlYWNvbl9jb3VudCk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJkaXNjb25uX2FycmF5Olx0XHRcdCIpOwotCWZvciAoY250ID0gMDsgY250IDwgTlVNX1JYX0NIQUlOUzsgY250KyspIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiICV1IiwKLQkJCQlkYXRhLT5kaXNjb25uX2FycmF5W2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImRlbHRhX2dhaW5fY29kZTpcdFx0Iik7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fUlhfQ0hBSU5TOyBjbnQrKykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIgJXUiLAotCQkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtjbnRdKTsKLQl9Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJyYWRpb193cml0ZTpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5yYWRpb193cml0ZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAic3RhdGU6XHRcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5zdGF0ZSk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfcG93ZXJfc2F2ZV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJCSAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzYwXTsKLQlpbnQgcG9zID0gMDsKLQljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKLQl1MzIgcHdyc2F2ZV9zdGF0dXM7Ci0KLQlwd3JzYXZlX3N0YXR1cyA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCi0JCQlDU1JfR1BfUkVHX1BPV0VSX1NBVkVfU1RBVFVTX01TSzsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlBvd2VyIFNhdmUgU3RhdHVzOiAiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlc1xuIiwKLQkJKHB3cnNhdmVfc3RhdHVzID09IENTUl9HUF9SRUdfTk9fUE9XRVJfU0FWRSkgPyAibm9uZSIgOgotCQkocHdyc2F2ZV9zdGF0dXMgPT0gQ1NSX0dQX1JFR19NQUNfUE9XRVJfU0FWRSkgPyAiTUFDIiA6Ci0JCShwd3JzYXZlX3N0YXR1cyA9PSBDU1JfR1BfUkVHX1BIWV9QT1dFUl9TQVZFKSA/ICJQSFkiIDoKLQkJImVycm9yIik7Ci0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfY2xlYXJfdWNvZGVfc3RhdGlzdGljc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls4XTsKLQlpbnQgYnVmX3NpemU7Ci0JaW50IGNsZWFyOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmNsZWFyKSAhPSAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qIG1ha2UgcmVxdWVzdCB0byB1Q29kZSB0byByZXRyaWV2ZSBzdGF0aXN0aWNzIGluZm9ybWF0aW9uICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bF9sZWdhY3lfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3QocHJpdiwgQ01EX1NZTkMsIHRydWUpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3J4b25fZmxhZ3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IGxlbiA9IDA7Ci0JY2hhciBidWZbMjBdOwotCi0JbGVuID0gc3ByaW50ZihidWYsICIweCUwNFhcbiIsCi0JCWxlMzJfdG9fY3B1KHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5mbGFncykpOwotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19yeG9uX2ZpbHRlcl9mbGFnc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgbGVuID0gMDsKLQljaGFyIGJ1ZlsyMF07Ci0KLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjB4JTA0WFxuIiwKLQlsZTMyX3RvX2NwdShwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5hY3RpdmUuZmlsdGVyX2ZsYWdzKSk7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2ZoX3JlZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKmJ1ZjsKLQlpbnQgcG9zID0gMDsKLQlzc2l6ZV90IHJldCA9IC1FRkFVTFQ7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maCkgewotCQlyZXQgPSBwb3MgPSBwcml2LT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKHByaXYsICZidWYsIHRydWUpOwotCQlpZiAoYnVmKSB7Ci0JCQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwKLQkJCQkJCSAgICAgIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0JCQlrZnJlZShidWYpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19taXNzZWRfYmVhY29uX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMDsKLQljaGFyIGJ1ZlsxMl07Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlZFxuIiwKLQkJCXByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkKTsKLQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19taXNzZWRfYmVhY29uX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzhdOwotCWludCBidWZfc2l6ZTsKLQlpbnQgbWlzc2VkOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJm1pc3NlZCkgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobWlzc2VkIDwgSVdMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX01JTiB8fAotCSAgICBtaXNzZWQgPiBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUFYKQotCQlwcml2LT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCA9Ci0JCQlJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOwotCWVsc2UKLQkJcHJpdi0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBtaXNzZWQ7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfZm9yY2VfcmVzZXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgYnVmWzMwMF07Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0Jc3RydWN0IGl3bF9mb3JjZV9yZXNldCAqZm9yY2VfcmVzZXQ7Ci0KLQlmb3JjZV9yZXNldCA9ICZwcml2LT5mb3JjZV9yZXNldDsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0OiAlZFxuIiwKLQkJCWZvcmNlX3Jlc2V0LT5yZXNldF9yZXF1ZXN0X2NvdW50KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiXHRudW1iZXIgb2YgcmVzZXQgcmVxdWVzdCBzdWNjZXNzOiAlZFxuIiwKLQkJCWZvcmNlX3Jlc2V0LT5yZXNldF9zdWNjZXNzX2NvdW50KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiXHRudW1iZXIgb2YgcmVzZXQgcmVxdWVzdCByZWplY3Q6ICVkXG4iLAotCQkJZm9yY2VfcmVzZXQtPnJlc2V0X3JlamVjdF9jb3VudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIlx0cmVzZXQgZHVyYXRpb246ICVsdVxuIiwKLQkJCWZvcmNlX3Jlc2V0LT5yZXNldF9kdXJhdGlvbik7Ci0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfZm9yY2VfcmVzZXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCWludCByZXQ7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9mb3JjZV9yZXNldChwcml2LCB0cnVlKTsKLQotCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc193ZF90aW1lb3V0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCWludCB0aW1lb3V0OwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnRpbWVvdXQpICE9IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh0aW1lb3V0IDwgMCB8fCB0aW1lb3V0ID4gSVdMX01BWF9XRF9USU1FT1VUKQotCQl0aW1lb3V0ID0gSVdMX0RFRl9XRF9USU1FT1VUOwotCi0JcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCA9IHRpbWVvdXQ7Ci0JaXdsX2xlZ2FjeV9zZXR1cF93YXRjaGRvZyhwcml2KTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLURFQlVHRlNfUkVBRF9GSUxFX09QUyhyeF9zdGF0aXN0aWNzKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyh0eF9zdGF0aXN0aWNzKTsKLURFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyh0cmFmZmljX2xvZyk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMocnhfcXVldWUpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHR4X3F1ZXVlKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyh1Y29kZV9yeF9zdGF0cyk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFModWNvZGVfdHhfc3RhdHMpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHVjb2RlX2dlbmVyYWxfc3RhdHMpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHNlbnNpdGl2aXR5KTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhjaGFpbl9ub2lzZSk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMocG93ZXJfc2F2ZV9zdGF0dXMpOwotREVCVUdGU19XUklURV9GSUxFX09QUyhjbGVhcl91Y29kZV9zdGF0aXN0aWNzKTsKLURFQlVHRlNfV1JJVEVfRklMRV9PUFMoY2xlYXJfdHJhZmZpY19zdGF0aXN0aWNzKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhmaF9yZWcpOwotREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKG1pc3NlZF9iZWFjb24pOwotREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGZvcmNlX3Jlc2V0KTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhyeG9uX2ZsYWdzKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhyeG9uX2ZpbHRlcl9mbGFncyk7Ci1ERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKHdkX3RpbWVvdXQpOwotCi0vKgotICogQ3JlYXRlIHRoZSBkZWJ1Z2ZzIGZpbGVzIGFuZCBkaXJlY3RvcmllcwotICoKLSAqLwotaW50IGl3bF9sZWdhY3lfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBkZW50cnkgKnBoeWQgPSBwcml2LT5ody0+d2lwaHktPmRlYnVnZnNkaXI7Ci0Jc3RydWN0IGRlbnRyeSAqZGlyX2RydiwgKmRpcl9kYXRhLCAqZGlyX3JmLCAqZGlyX2RlYnVnOwotCi0JZGlyX2RydiA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCBwaHlkKTsKLQlpZiAoIWRpcl9kcnYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJpdi0+ZGVidWdmc19kaXIgPSBkaXJfZHJ2OwotCi0JZGlyX2RhdGEgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRhdGEiLCBkaXJfZHJ2KTsKLQlpZiAoIWRpcl9kYXRhKQotCQlnb3RvIGVycjsKLQlkaXJfcmYgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInJmIiwgZGlyX2Rydik7Ci0JaWYgKCFkaXJfcmYpCi0JCWdvdG8gZXJyOwotCWRpcl9kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZGVidWciLCBkaXJfZHJ2KTsKLQlpZiAoIWRpcl9kZWJ1ZykKLQkJZ290byBlcnI7Ci0KLQlERUJVR0ZTX0FERF9GSUxFKG52bSwgZGlyX2RhdGEsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoc3JhbSwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHN0YXRpb25zLCBkaXJfZGF0YSwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShjaGFubmVscywgZGlyX2RhdGEsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoc3RhdHVzLCBkaXJfZGF0YSwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShpbnRlcnJ1cHQsIGRpcl9kYXRhLCBTX0lXVVNSIHwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShxb3MsIGRpcl9kYXRhLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGRpc2FibGVfaHQ0MCwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHJ4X3N0YXRpc3RpY3MsIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRSh0eF9zdGF0aXN0aWNzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUodHJhZmZpY19sb2csIGRpcl9kZWJ1ZywgU19JV1VTUiB8IFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUocnhfcXVldWUsIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRSh0eF9xdWV1ZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHBvd2VyX3NhdmVfc3RhdHVzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoY2xlYXJfdWNvZGVfc3RhdGlzdGljcywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGNsZWFyX3RyYWZmaWNfc3RhdGlzdGljcywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGZoX3JlZywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKG1pc3NlZF9iZWFjb24sIGRpcl9kZWJ1ZywgU19JV1VTUik7Ci0JREVCVUdGU19BRERfRklMRShmb3JjZV9yZXNldCwgZGlyX2RlYnVnLCBTX0lXVVNSIHwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRSh1Y29kZV9yeF9zdGF0cywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHVjb2RlX3R4X3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUodWNvZGVfZ2VuZXJhbF9zdGF0cywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIpCi0JCURFQlVHRlNfQUREX0ZJTEUoc2Vuc2l0aXZpdHksIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcikKLQkJREVCVUdGU19BRERfRklMRShjaGFpbl9ub2lzZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHJ4b25fZmxhZ3MsIGRpcl9kZWJ1ZywgU19JV1VTUik7Ci0JREVCVUdGU19BRERfRklMRShyeG9uX2ZpbHRlcl9mbGFncywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHdkX3RpbWVvdXQsIGRpcl9kZWJ1ZywgU19JV1VTUik7Ci0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcikKLQkJREVCVUdGU19BRERfQk9PTChkaXNhYmxlX3NlbnNpdGl2aXR5LCBkaXJfcmYsCi0JCQkJICZwcml2LT5kaXNhYmxlX3NlbnNfY2FsKTsKLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfY2FsaWJfYnlfZHJpdmVyKQotCQlERUJVR0ZTX0FERF9CT09MKGRpc2FibGVfY2hhaW5fbm9pc2UsIGRpcl9yZiwKLQkJCQkgJnByaXYtPmRpc2FibGVfY2hhaW5fbm9pc2VfY2FsKTsKLQlERUJVR0ZTX0FERF9CT09MKGRpc2FibGVfdHhfcG93ZXIsIGRpcl9yZiwKLQkJCQkmcHJpdi0+ZGlzYWJsZV90eF9wb3dlcl9jYWwpOwotCXJldHVybiAwOwotCi1lcnI6Ci0JSVdMX0VSUihwcml2LCAiQ2FuJ3QgY3JlYXRlIHRoZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7Ci0JaXdsX2xlZ2FjeV9kYmdmc191bnJlZ2lzdGVyKHByaXYpOwotCXJldHVybiAtRU5PTUVNOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2RiZ2ZzX3JlZ2lzdGVyKTsKLQotLyoqCi0gKiBSZW1vdmUgdGhlIGRlYnVnZnMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCi0gKgotICovCi12b2lkIGl3bF9sZWdhY3lfZGJnZnNfdW5yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKCFwcml2LT5kZWJ1Z2ZzX2RpcikKLQkJcmV0dXJuOwotCi0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHByaXYtPmRlYnVnZnNfZGlyKTsKLQlwcml2LT5kZWJ1Z2ZzX2RpciA9IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZGJnZnNfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNzg2ZWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLWRldi5oKSBmb3IgZHJpdmVyIGltcGxlbWVudGF0aW9uIGRlZmluaXRpb25zLgotICogUGxlYXNlIHVzZSBpd2wtY29tbWFuZHMuaCBmb3IgdUNvZGUgQVBJIGRlZmluaXRpb25zLgotICogUGxlYXNlIHVzZSBpd2wtNDk2NS1ody5oIGZvciBoYXJkd2FyZS1yZWxhdGVkIGRlZmluaXRpb25zLgotICovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2Rldl9oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X2Rldl9oX18KLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPiAvKiBmb3Igc3RydWN0IHBjaV9kZXZpY2VfaWQgKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KLQotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtY3NyLmgiCi0jaW5jbHVkZSAiaXdsLXBycGguaCIKLSNpbmNsdWRlICJpd2wtZmguaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1ody5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LWh3LmgiCi0jaW5jbHVkZSAiaXdsLWxlZC5oIgotI2luY2x1ZGUgIml3bC1wb3dlci5oIgotI2luY2x1ZGUgIml3bC1sZWdhY3ktcnMuaCIKLQotc3RydWN0IGl3bF90eF9xdWV1ZTsKLQotLyogQ1QtS0lMTCBjb25zdGFudHMgKi8KLSNkZWZpbmUgQ1RfS0lMTF9USFJFU0hPTERfTEVHQUNZICAgMTEwIC8qIGluIENlbHNpdXMgKi8KLQotLyogRGVmYXVsdCBub2lzZSBsZXZlbCB0byByZXBvcnQgd2hlbiBub2lzZSBtZWFzdXJlbWVudCBpcyBub3QgYXZhaWxhYmxlLgotICogICBUaGlzIG1heSBiZSBiZWNhdXNlIHdlJ3JlOgotICogICAxKSAgTm90IGFzc29jaWF0ZWQgKDQ5NjUsIG5vIGJlYWNvbiBzdGF0aXN0aWNzIGJlaW5nIHNlbnQgdG8gZHJpdmVyKQotICogICAyKSAgU2Nhbm5pbmcgKG5vaXNlIG1lYXN1cmVtZW50IGRvZXMgbm90IGFwcGx5IHRvIGFzc29jaWF0ZWQgY2hhbm5lbCkKLSAqICAgMykgIFJlY2VpdmluZyBDQ0sgKDM5NDUgZGVsaXZlcnMgbm9pc2UgaW5mbyBvbmx5IGZvciBPRkRNIGZyYW1lcykKLSAqIFVzZSBkZWZhdWx0IG5vaXNlIHZhbHVlIG9mIC0xMjcgLi4uIHRoaXMgaXMgYmVsb3cgdGhlIHJhbmdlIG9mIG1lYXN1cmFibGUKLSAqICAgUnggZEJtIGZvciBlaXRoZXIgMzk0NSBvciA0OTY1LCBzbyBpdCBjYW4gaW5kaWNhdGUgInVubWVhc3VyYWJsZSIgdG8gdXNlci4KLSAqICAgQWxzbywgLTEyNyB3b3JrcyBiZXR0ZXIgdGhhbiAwIHdoZW4gYXZlcmFnaW5nIGZyYW1lcyB3aXRoL3dpdGhvdXQKLSAqICAgbm9pc2UgaW5mbyAoZS5nLiBhdmVyYWdpbmcgbWlnaHQgYmUgZG9uZSBpbiBhcHApOyBtZWFzdXJlZCBkQm0gdmFsdWVzIGFyZQotICogICBhbHdheXMgbmVnYXRpdmUgLi4uIHVzaW5nIGEgbmVnYXRpdmUgdmFsdWUgYXMgdGhlIGRlZmF1bHQga2VlcHMgYWxsCi0gKiAgIGF2ZXJhZ2VzIHdpdGhpbiBhbiBzOCdzICh1c2VkIGluIHNvbWUgYXBwcykgcmFuZ2Ugb2YgbmVnYXRpdmUgdmFsdWVzLiAqLwotI2RlZmluZSBJV0xfTk9JU0VfTUVBU19OT1RfQVZBSUxBQkxFICgtMTI3KQotCi0vKgotICogUlRTIHRocmVzaG9sZCBoZXJlIGlzIHRvdGFsIHNpemUgWzIzNDddIG1pbnVzIDQgRkNTIGJ5dGVzCi0gKiBQZXIgc3BlYzoKLSAqICAgYSB2YWx1ZSBvZiAwIG1lYW5zIFJUUyBvbiBhbGwgZGF0YS9tYW5hZ2VtZW50IHBhY2tldHMKLSAqICAgYSB2YWx1ZSA+IG1heCBNU0RVIHNpemUgbWVhbnMgbm8gUlRTCi0gKiBlbHNlIFJUUyBmb3IgZGF0YS9tYW5hZ2VtZW50IGZyYW1lcyB3aGVyZSBNUERVIGlzIGxhcmdlcgotICogICB0aGFuIFJUUyB2YWx1ZS4KLSAqLwotI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgICAgIDIzNDdVCi0jZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEICAgICAgICAgMFUKLSNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAyMzQ3VQotI2RlZmluZSBNQVhfTVNEVV9TSVpFCQkgIDIzMDRVCi0jZGVmaW5lIE1BWF9NUERVX1NJWkUJCSAgMjM0NlUKLSNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwgICAxMDBVCi0jZGVmaW5lCURFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQgN1UKLSNkZWZpbmUJREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUICA0VQotCi1zdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgewotCWRtYV9hZGRyX3QgcGFnZV9kbWE7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfTsKLQotI2RlZmluZSByeGJfYWRkcihyKSBwYWdlX2FkZHJlc3Moci0+cGFnZSkKLQotLyogZGVmaW5lZCBiZWxvdyAqLwotc3RydWN0IGl3bF9kZXZpY2VfY21kOwotCi1zdHJ1Y3QgaXdsX2NtZF9tZXRhIHsKLQkvKiBvbmx5IGZvciBTWU5DIGNvbW1hbmRzLCBpZmYgdGhlIHJlcGx5IHNrYiBpcyB3YW50ZWQgKi8KLQlzdHJ1Y3QgaXdsX2hvc3RfY21kICpzb3VyY2U7Ci0JLyoKLQkgKiBvbmx5IGZvciBBU1lOQyBjb21tYW5kcwotCSAqICh3aGljaCBpcyBzb21ld2hhdCBzdHVwaWQgLS0gbG9vayBhdCBpd2wtc3RhLmMgZm9yIGluc3RhbmNlCi0JICogd2hpY2ggZHVwbGljYXRlcyBhIGJ1bmNoIG9mIGNvZGUgYmVjYXVzZSB0aGUgY2FsbGJhY2sgaXNuJ3QKLQkgKiBpbnZva2VkIGZvciBTWU5DIGNvbW1hbmRzLCBpZiBpdCB3ZXJlIGFuZCBpdHMgcmVzdWx0IHBhc3NlZAotCSAqIHRocm91Z2ggaXQgd291bGQgYmUgc2ltcGxlci4uLikKLQkgKi8KLQl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCwKLQkJCSBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KTsKLQotCS8qIFRoZSBDTURfU0laRV9IVUdFIGZsYWcgYml0IGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kCi0JICogc3RydWN0dXJlIGlzIHN0b3JlZCBhdCB0aGUgZW5kIG9mIHRoZSBzaGFyZWQgcXVldWUgbWVtb3J5LiAqLwotCXUzMiBmbGFnczsKLQotCURFRklORV9ETUFfVU5NQVBfQUREUihtYXBwaW5nKTsKLQlERUZJTkVfRE1BX1VOTUFQX0xFTihsZW4pOwotfTsKLQotLyoKLSAqIEdlbmVyaWMgcXVldWUgc3RydWN0dXJlCi0gKgotICogQ29udGFpbnMgY29tbW9uIGRhdGEgZm9yIFJ4IGFuZCBUeCBxdWV1ZXMKLSAqLwotc3RydWN0IGl3bF9xdWV1ZSB7Ci0JaW50IG5fYmQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgQkRzIGluIHRoaXMgcXVldWUgKi8KLQlpbnQgd3JpdGVfcHRyOyAgICAgICAvKiAxLXN0IGVtcHR5IGVudHJ5IChpbmRleCkgaG9zdF93Ki8KLQlpbnQgcmVhZF9wdHI7ICAgICAgICAgLyogbGFzdCB1c2VkIGVudHJ5IChpbmRleCkgaG9zdF9yKi8KLQkvKiB1c2UgZm9yIG1vbml0b3JpbmcgYW5kIHJlY292ZXJpbmcgdGhlIHN0dWNrIHF1ZXVlICovCi0JZG1hX2FkZHJfdCBkbWFfYWRkcjsgICAvKiBwaHlzaWNhbCBhZGRyIGZvciBCRCdzICovCi0JaW50IG5fd2luZG93OwkgICAgICAgLyogc2FmZSBxdWV1ZSB3aW5kb3cgKi8KLQl1MzIgaWQ7Ci0JaW50IGxvd19tYXJrOwkgICAgICAgLyogbG93IHdhdGVybWFyaywgcmVzdW1lIHF1ZXVlIGlmIGZyZWUKLQkJCQkqIHNwYWNlIG1vcmUgdGhhbiB0aGlzICovCi0JaW50IGhpZ2hfbWFyazsgICAgICAgICAvKiBoaWdoIHdhdGVybWFyaywgc3RvcCBxdWV1ZSBpZiBmcmVlCi0JCQkJKiBzcGFjZSBsZXNzIHRoYW4gdGhpcyAqLwotfTsKLQotLyogT25lIGZvciBlYWNoIFRGRCAqLwotc3RydWN0IGl3bF90eF9pbmZvIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpd2xfdHhfcXVldWUgLSBUeCBRdWV1ZSBmb3IgRE1BCi0gKiBAcTogZ2VuZXJpYyBSeC9UeCBxdWV1ZSBkZXNjcmlwdG9yCi0gKiBAYmQ6IGJhc2Ugb2YgY2lyY3VsYXIgYnVmZmVyIG9mIFRGRHMKLSAqIEBjbWQ6IGFycmF5IG9mIGNvbW1hbmQvVFggYnVmZmVyIHBvaW50ZXJzCi0gKiBAbWV0YTogYXJyYXkgb2YgbWV0YSBkYXRhIGZvciBlYWNoIGNvbW1hbmQvdHggYnVmZmVyCi0gKiBAZG1hX2FkZHJfY21kOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGNtZC90eCBidWZmZXIgYXJyYXkKLSAqIEB0eGI6IGFycmF5IG9mIHBlci1URkQgZHJpdmVyIGRhdGEKLSAqIEB0aW1lX3N0YW1wOiB0aW1lIChpbiBqaWZmaWVzKSBvZiBsYXN0IHJlYWRfcHRyIGNoYW5nZQotICogQG5lZWRfdXBkYXRlOiBpbmRpY2F0ZXMgbmVlZCB0byB1cGRhdGUgcmVhZC93cml0ZSBpbmRleAotICogQHNjaGVkX3JldHJ5OiBpbmRpY2F0ZXMgcXVldWUgaXMgaGlnaC10aHJvdWdocHV0IGFnZ3JlZ2F0aW9uIChIVCBBR0cpIGVuYWJsZWQKLSAqCi0gKiBBIFR4IHF1ZXVlIGNvbnNpc3RzIG9mIGNpcmN1bGFyIGJ1ZmZlciBvZiBCRHMgKGEuay5hLiBURkRzLCB0cmFuc21pdCBmcmFtZQotICogZGVzY3JpcHRvcnMpIGFuZCByZXF1aXJlZCBsb2NraW5nIHN0cnVjdHVyZXMuCi0gKi8KLSNkZWZpbmUgVEZEX1RYX0NNRF9TTE9UUyAyNTYKLSNkZWZpbmUgVEZEX0NNRF9TTE9UUyAzMgotCi1zdHJ1Y3QgaXdsX3R4X3F1ZXVlIHsKLQlzdHJ1Y3QgaXdsX3F1ZXVlIHE7Ci0Jdm9pZCAqdGZkczsKLQlzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKipjbWQ7Ci0Jc3RydWN0IGl3bF9jbWRfbWV0YSAqbWV0YTsKLQlzdHJ1Y3QgaXdsX3R4X2luZm8gKnR4YjsKLQl1bnNpZ25lZCBsb25nIHRpbWVfc3RhbXA7Ci0JdTggbmVlZF91cGRhdGU7Ci0JdTggc2NoZWRfcmV0cnk7Ci0JdTggYWN0aXZlOwotCXU4IHN3cV9pZDsKLX07Ci0KLSNkZWZpbmUgSVdMX05VTV9TQ0FOX1JBVEVTICAgICAgICAgKDIpCi0KLXN0cnVjdCBpd2w0OTY1X2NoYW5uZWxfdGdkX2luZm8gewotCXU4IHR5cGU7Ci0JczggbWF4X3Bvd2VyOwotfTsKLQotc3RydWN0IGl3bDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB7Ci0JczY0IGxhc3RfcmFkYXJfdGltZTsKLX07Ci0KLSNkZWZpbmUgSVdMNDk2NV9NQVhfUkFURSAoMzMpCi0KLXN0cnVjdCBpd2wzOTQ1X2NsaXBfZ3JvdXAgewotCS8qIG1heGltdW0gcG93ZXIgbGV2ZWwgdG8gcHJldmVudCBjbGlwcGluZyBmb3IgZWFjaCByYXRlLCBkZXJpdmVkIGJ5Ci0JICogICB1cyBmcm9tIHRoaXMgYmFuZCdzIHNhdHVyYXRpb24gcG93ZXIgaW4gRUVQUk9NICovCi0JY29uc3QgczggY2xpcF9wb3dlcnNbSVdMX01BWF9SQVRFU107Ci19OwotCi0vKiBjdXJyZW50IFR4IHBvd2VyIHZhbHVlcyB0byB1c2UsIG9uZSBmb3IgZWFjaCByYXRlIGZvciBlYWNoIGNoYW5uZWwuCi0gKiByZXF1ZXN0ZWQgcG93ZXIgaXMgbGltaXRlZCBieToKLSAqIC0tIHJlZ3VsYXRvcnkgRUVQUk9NIGxpbWl0cyBmb3IgdGhpcyBjaGFubmVsCi0gKiAtLSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgKGNsaXAtcG93ZXJzKQotICogLS0gc3BlY3RydW0gbWFuYWdlbWVudAotICogLS0gdXNlciBwcmVmZXJlbmNlIChlLmcuIGl3Y29uZmlnKQotICogd2hlbiByZXF1ZXN0ZWQgcG93ZXIgaXMgc2V0LCBiYXNlIHBvd2VyIGluZGV4IG11c3QgYWxzbyBiZSBzZXQuICovCi1zdHJ1Y3QgaXdsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gewotCXN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyIHRwYzsJLyogYWN0dWFsIHJhZGlvIGFuZCBEU1AgZ2FpbiBzZXR0aW5ncyAqLwotCXM4IHBvd2VyX3RhYmxlX2luZGV4OwkvKiBhY3R1YWwgKGNvbXBlbnN0J2QpIGluZGV4IGludG8gZ2FpbiB0YWJsZSAqLwotCXM4IGJhc2VfcG93ZXJfaW5kZXg7CS8qIGdhaW4gaW5kZXggZm9yIHBvd2VyIGF0IGZhY3RvcnkgdGVtcC4gKi8KLQlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHBvd2VyIChkQm0pIHJlcXVlc3RlZCBmb3IgdGhpcyBjaG5sL3JhdGUgKi8KLX07Ci0KLS8qIGN1cnJlbnQgc2NhbiBUeCBwb3dlciB2YWx1ZXMgdG8gdXNlLCBvbmUgZm9yIGVhY2ggc2NhbiByYXRlIGZvciBlYWNoCi0gKiBjaGFubmVsLiAqLwotc3RydWN0IGl3bDM5NDVfc2Nhbl9wb3dlcl9pbmZvIHsKLQlzdHJ1Y3QgaXdsMzk0NV90eF9wb3dlciB0cGM7CS8qIGFjdHVhbCByYWRpbyBhbmQgRFNQIGdhaW4gc2V0dGluZ3MgKi8KLQlzOCBwb3dlcl90YWJsZV9pbmRleDsJLyogYWN0dWFsIChjb21wZW5zdCdkKSBpbmRleCBpbnRvIGdhaW4gdGFibGUgKi8KLQlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHNjYW4gcHdyIChkQm0pIHJlcXVlc3RlZCBmb3IgY2hubC9yYXRlICovCi19OwotCi0vKgotICogT25lIGZvciBlYWNoIGNoYW5uZWwsIGhvbGRzIGFsbCBjaGFubmVsIHNldHVwIGRhdGEKLSAqIFNvbWUgb2YgdGhlIGZpZWxkcyAoZS5nLiBlZXByb20gYW5kIGZsYWdzL21heF9wb3dlcl9hdmcpIGFyZSByZWR1bmRhbnQKLSAqICAgICB3aXRoIG9uZSBhbm90aGVyIQotICovCi1zdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyB7Ci0Jc3RydWN0IGl3bDQ5NjVfY2hhbm5lbF90Z2RfaW5mbyB0Z2Q7Ci0Jc3RydWN0IGl3bDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB0Z2g7Ci0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBlZXByb207CS8qIEVFUFJPTSByZWd1bGF0b3J5IGxpbWl0ICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBodDQwX2VlcHJvbTsJLyogRUVQUk9NIHJlZ3VsYXRvcnkgbGltaXQgZm9yCi0JCQkJCQkgKiBIVDQwIGNoYW5uZWwgKi8KLQotCXU4IGNoYW5uZWw7CSAgLyogY2hhbm5lbCBudW1iZXIgKi8KLQl1OCBmbGFnczsJICAvKiBmbGFncyBjb3BpZWQgZnJvbSBFRVBST00gKi8KLQlzOCBtYXhfcG93ZXJfYXZnOyAvKiAoZEJtKSByZWd1bC4gZWVwcm9tLCBub3JtYWwgVHgsIGFueSByYXRlICovCi0JczggY3Vycl90eHBvdzsJICAvKiAoZEJtKSByZWd1bGF0b3J5L3NwZWN0cnVtL3VzZXIgKG5vdCBoL3cpIGxpbWl0ICovCi0JczggbWluX3Bvd2VyOwkgIC8qIGFsd2F5cyAwICovCi0Jczggc2Nhbl9wb3dlcjsJICAvKiAoZEJtKSByZWd1bC4gZWVwcm9tLCBkaXJlY3Qgc2NhbnMsIGFueSByYXRlICovCi0KLQl1OCBncm91cF9pbmRleDsJICAvKiAwLTQsIG1hcHMgY2hhbm5lbCB0byBncm91cDEvMi8zLzQvNSAqLwotCXU4IGJhbmRfaW5kZXg7CSAgLyogMC00LCBtYXBzIGNoYW5uZWwgdG8gYmFuZDEvMi8zLzQvNSAqLwotCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKLQotCS8qIEhUNDAgY2hhbm5lbCBpbmZvICovCi0JczggaHQ0MF9tYXhfcG93ZXJfYXZnOwkvKiAoZEJtKSByZWd1bC4gZWVwcm9tLCBub3JtYWwgVHgsIGFueSByYXRlICovCi0JdTggaHQ0MF9mbGFnczsJCS8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLwotCXU4IGh0NDBfZXh0ZW5zaW9uX2NoYW5uZWw7IC8qIEhUX0lFX0VYVF9DSEFOTkVMXyogKi8KLQotCS8qIFJhZGlvL0RTUCBnYWluIHNldHRpbmdzIGZvciBlYWNoICJub3JtYWwiIGRhdGEgVHggcmF0ZS4KLQkgKiBUaGVzZSBpbmNsdWRlLCBpbiBhZGRpdGlvbiB0byBSRiBhbmQgRFNQIGdhaW4sIGEgZmV3IGZpZWxkcyBmb3IKLQkgKiAgIHJlbWVtYmVyaW5nL21vZGlmeWluZyBnYWluIHNldHRpbmdzIChpbmRleGVzKS4gKi8KLQlzdHJ1Y3QgaXdsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gcG93ZXJfaW5mb1tJV0w0OTY1X01BWF9SQVRFXTsKLQotCS8qIFJhZGlvL0RTUCBnYWluIHNldHRpbmdzIGZvciBlYWNoIHNjYW4gcmF0ZSwgZm9yIGRpcmVjdGVkIHNjYW5zLiAqLwotCXN0cnVjdCBpd2wzOTQ1X3NjYW5fcG93ZXJfaW5mbyBzY2FuX3B3cl9pbmZvW0lXTF9OVU1fU0NBTl9SQVRFU107Ci19OwotCi0jZGVmaW5lIElXTF9UWF9GSUZPX0JLCQkwCS8qIHNoYXJlZCAqLwotI2RlZmluZSBJV0xfVFhfRklGT19CRQkJMQotI2RlZmluZSBJV0xfVFhfRklGT19WSQkJMgkvKiBzaGFyZWQgKi8KLSNkZWZpbmUgSVdMX1RYX0ZJRk9fVk8JCTMKLSNkZWZpbmUgSVdMX1RYX0ZJRk9fVU5VU0VECS0xCi0KLS8qIE1pbmltdW0gbnVtYmVyIG9mIHF1ZXVlcy4gTUFYX05VTSBpcyBkZWZpbmVkIGluIGh3IHNwZWNpZmljIGZpbGVzLgotICogU2V0IHRoZSBtaW5pbXVtIHRvIGFjY29tbW9kYXRlIHRoZSA0IHN0YW5kYXJkIFRYIHF1ZXVlcywgMSBjb21tYW5kCi0gKiBxdWV1ZSwgMiAodW51c2VkKSBIQ0NBIHF1ZXVlcywgYW5kIDQgSFQgcXVldWVzIChvbmUgZm9yIGVhY2ggQUMpICovCi0jZGVmaW5lIElXTF9NSU5fTlVNX1FVRVVFUwkxMAotCi0jZGVmaW5lIElXTF9ERUZBVUxUX0NNRF9RVUVVRV9OVU0JNAotCi0jZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTiAgICAgICAgICAgICAgMjMwNAotI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOICAgICAgICAgICAgIDMwCi0jZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCi0jZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQotCi1zdHJ1Y3QgaXdsX2ZyYW1lIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfaGRyIGZyYW1lOwotCQlzdHJ1Y3QgaXdsX3R4X2JlYWNvbl9jbWQgYmVhY29uOwotCQl1OCByYXdbSUVFRTgwMjExX0ZSQU1FX0xFTl07Ci0JCXU4IGNtZFszNjBdOwotCX0gdTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi0jZGVmaW5lIFNFUV9UT19TTihzZXEpICgoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCi0jZGVmaW5lIFNOX1RPX1NFUShzc24pICgoKHNzbikgPDwgNCkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCi0jZGVmaW5lIE1BWF9TTiAoKElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKLQotZW51bSB7Ci0JQ01EX1NZTkMgPSAwLAotCUNNRF9TSVpFX05PUk1BTCA9IDAsCi0JQ01EX05PX1NLQiA9IDAsCi0JQ01EX1NJWkVfSFVHRSA9ICgxIDw8IDApLAotCUNNRF9BU1lOQyA9ICgxIDw8IDEpLAotCUNNRF9XQU5UX1NLQiA9ICgxIDw8IDIpLAotCUNNRF9NQVBQRUQgPSAoMSA8PCAzKSwKLX07Ci0KLSNkZWZpbmUgREVGX0NNRF9QQVlMT0FEX1NJWkUgMzIwCi0KLS8qKgotICogc3RydWN0IGl3bF9kZXZpY2VfY21kCi0gKgotICogRm9yIGFsbG9jYXRpb24gb2YgdGhlIGNvbW1hbmQgYW5kIHR4IHF1ZXVlcywgdGhpcyBlc3RhYmxpc2hlcyB0aGUgb3ZlcmFsbAotICogc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjb21tYW5kIHdlIHNlbmQgdG8gdUNvZGUsIGV4Y2VwdCBmb3IgYSBzY2FuIGNvbW1hbmQKLSAqICh3aGljaCBpcyByZWxhdGl2ZWx5IGh1Z2U7IHNwYWNlIGlzIGFsbG9jYXRlZCBzZXBhcmF0ZWx5KS4KLSAqLwotc3RydWN0IGl3bF9kZXZpY2VfY21kIHsKLQlzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIgaGRyOwkvKiB1Q29kZSBBUEkgKi8KLQl1bmlvbiB7Ci0JCXUzMiBmbGFnczsKLQkJdTggdmFsODsKLQkJdTE2IHZhbDE2OwotCQl1MzIgdmFsMzI7Ci0JCXN0cnVjdCBpd2xfdHhfY21kIHR4OwotCQl1OCBwYXlsb2FkW0RFRl9DTURfUEFZTE9BRF9TSVpFXTsKLQl9IF9fcGFja2VkIGNtZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgVEZEX01BWF9QQVlMT0FEX1NJWkUgKHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQpKQotCi0KLXN0cnVjdCBpd2xfaG9zdF9jbWQgewotCWNvbnN0IHZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgbG9uZyByZXBseV9wYWdlOwotCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpOwotCXUzMiBmbGFnczsKLQl1MTYgbGVuOwotCXU4IGlkOwotfTsKLQotI2RlZmluZSBTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMUyAgOAotI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgNAotI2RlZmluZSBTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMUyAgMTIKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX3J4X3F1ZXVlIC0gUnggcXVldWUKLSAqIEBiZDogZHJpdmVyJ3MgcG9pbnRlciB0byBidWZmZXIgb2YgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMgKHJiZCkKLSAqIEBiZF9kbWE6IGJ1cyBhZGRyZXNzIG9mIGJ1ZmZlciBvZiByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9ycyAocmJkKQotICogQHJlYWQ6IFNoYXJlZCBpbmRleCB0byBuZXdlc3QgYXZhaWxhYmxlIFJ4IGJ1ZmZlcgotICogQHdyaXRlOiBTaGFyZWQgaW5kZXggdG8gb2xkZXN0IHdyaXR0ZW4gUnggcGFja2V0Ci0gKiBAZnJlZV9jb3VudDogTnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgYnVmZmVycyBpbiByeF9mcmVlCi0gKiBAcnhfZnJlZTogbGlzdCBvZiBmcmVlIFNLQnMgZm9yIHVzZQotICogQHJ4X3VzZWQ6IExpc3Qgb2YgUnggYnVmZmVycyB3aXRoIG5vIFNLQgotICogQG5lZWRfdXBkYXRlOiBmbGFnIHRvIGluZGljYXRlIHdlIG5lZWQgdG8gdXBkYXRlIHJlYWQvd3JpdGUgaW5kZXgKLSAqIEByYl9zdHRzOiBkcml2ZXIncyBwb2ludGVyIHRvIHJlY2VpdmUgYnVmZmVyIHN0YXR1cwotICogQHJiX3N0dHNfZG1hOiBidXMgYWRkcmVzcyBvZiByZWNlaXZlIGJ1ZmZlciBzdGF0dXMKLSAqCi0gKiBOT1RFOiAgcnhfZnJlZSBhbmQgcnhfdXNlZCBhcmUgdXNlZCBhcyBhIEZJRk8gZm9yIGl3bF9yeF9tZW1fYnVmZmVycwotICovCi1zdHJ1Y3QgaXdsX3J4X3F1ZXVlIHsKLQlfX2xlMzIgKmJkOwotCWRtYV9hZGRyX3QgYmRfZG1hOwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciBwb29sW1JYX1FVRVVFX1NJWkUgKyBSWF9GUkVFX0JVRkZFUlNdOwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcXVldWVbUlhfUVVFVUVfU0laRV07Ci0JdTMyIHJlYWQ7Ci0JdTMyIHdyaXRlOwotCXUzMiBmcmVlX2NvdW50OwotCXUzMiB3cml0ZV9hY3R1YWw7Ci0Jc3RydWN0IGxpc3RfaGVhZCByeF9mcmVlOwotCXN0cnVjdCBsaXN0X2hlYWQgcnhfdXNlZDsKLQlpbnQgbmVlZF91cGRhdGU7Ci0Jc3RydWN0IGl3bF9yYl9zdGF0dXMgKnJiX3N0dHM7Ci0JZG1hX2FkZHJfdCByYl9zdHRzX2RtYTsKLQlzcGlubG9ja190IGxvY2s7Ci19OwotCi0jZGVmaW5lIElXTF9TVVBQT1JURURfUkFURVNfSUVfTEVOICAgICAgICAgOAotCi0jZGVmaW5lIE1BWF9USURfQ09VTlQgICAgICAgIDkKLQotI2RlZmluZSBJV0xfSU5WQUxJRF9SQVRFICAgICAweEZGCi0jZGVmaW5lIElXTF9JTlZBTElEX1ZBTFVFICAgIC0xCi0KLS8qKgotICogc3RydWN0IGl3bF9odF9hZ2cgLS0gYWdncmVnYXRpb24gc3RhdHVzIHdoaWxlIHdhaXRpbmcgZm9yIGJsb2NrLWFjawotICogQHR4cV9pZDogVHggcXVldWUgdXNlZCBmb3IgVHggYXR0ZW1wdAotICogQGZyYW1lX2NvdW50OiAjIGZyYW1lcyBhdHRlbXB0ZWQgYnkgVHggY29tbWFuZAotICogQHdhaXRfZm9yX2JhOiBFeHBlY3QgYmxvY2stYWNrIGJlZm9yZSBuZXh0IFR4IHJlcGx5Ci0gKiBAc3RhcnRfaWR4OiBJbmRleCBvZiAxc3QgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKSBpbiBUeCB3aW5kb3cKLSAqIEBiaXRtYXAwOiBMb3cgb3JkZXIgYml0bWFwLCBvbmUgYml0IGZvciBlYWNoIGZyYW1lIHBlbmRpbmcgQUNLIGluIFR4IHdpbmRvdwotICogQGJpdG1hcDE6IEhpZ2ggb3JkZXIsIG9uZSBiaXQgZm9yIGVhY2ggZnJhbWUgcGVuZGluZyBBQ0sgaW4gVHggd2luZG93Ci0gKiBAcmF0ZV9uX2ZsYWdzOiBSYXRlIGF0IHdoaWNoIFR4IHdhcyBhdHRlbXB0ZWQKLSAqCi0gKiBJZiBSRVBMWV9UWCBpbmRpY2F0ZXMgdGhhdCBhZ2dyZWdhdGlvbiB3YXMgYXR0ZW1wdGVkLCBkcml2ZXIgbXVzdCB3YWl0Ci0gKiBmb3IgYmxvY2sgYWNrIChSRVBMWV9DT01QUkVTU0VEX0JBKS4gIFRoaXMgc3RydWN0IHN0b3JlcyB0eCByZXBseSBpbmZvCi0gKiB1bnRpbCBibG9jayBhY2sgYXJyaXZlcy4KLSAqLwotc3RydWN0IGl3bF9odF9hZ2cgewotCXUxNiB0eHFfaWQ7Ci0JdTE2IGZyYW1lX2NvdW50OwotCXUxNiB3YWl0X2Zvcl9iYTsKLQl1MTYgc3RhcnRfaWR4OwotCXU2NCBiaXRtYXA7Ci0JdTMyIHJhdGVfbl9mbGFnczsKLSNkZWZpbmUgSVdMX0FHR19PRkYgMAotI2RlZmluZSBJV0xfQUdHX09OIDEKLSNkZWZpbmUgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBIDIKLSNkZWZpbmUgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBIDMKLQl1OCBzdGF0ZTsKLX07Ci0KLQotc3RydWN0IGl3bF90aWRfZGF0YSB7Ci0JdTE2IHNlcV9udW1iZXI7IC8qIDQ5NjUgb25seSAqLwotCXUxNiB0ZmRzX2luX3F1ZXVlOwotCXN0cnVjdCBpd2xfaHRfYWdnIGFnZzsKLX07Ci0KLXN0cnVjdCBpd2xfaHdfa2V5IHsKLQl1MzIgY2lwaGVyOwotCWludCBrZXlsZW47Ci0JdTgga2V5aWR4OwotCXU4IGtleVszMl07Ci19OwotCi11bmlvbiBpd2xfaHRfcmF0ZV9zdXBwIHsKLQl1MTYgcmF0ZXM7Ci0Jc3RydWN0IHsKLQkJdTggc2lzb19yYXRlOwotCQl1OCBtaW1vX3JhdGU7Ci0JfTsKLX07Ci0KLSNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl84SyAgICgweDApCi0jZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfMTZLICAoMHgxKQotI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzMySyAgKDB4MikKLSNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsgICgweDMpCi0jZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfREVGICBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzY0SwotI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SX01BWCAgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsKLSNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl9NSU4gIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfOEsKLQotLyoKLSAqIE1heGltYWwgTVBEVSBkZW5zaXR5IGZvciBUWCBhZ2dyZWdhdGlvbgotICogNCAtIDJ1cyBkZW5zaXR5Ci0gKiA1IC0gNHVzIGRlbnNpdHkKLSAqIDYgLSA4dXMgZGVuc2l0eQotICogNyAtIDE2dXMgZGVuc2l0eQotICovCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMlVTRUMgICAoMHg0KQotI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDICAgKDB4NSkKLSNkZWZpbmUgQ0ZHX0hUX01QRFVfREVOU0lUWV84VVNFQyAgICgweDYpCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDICAoMHg3KQotI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZX0RFRiBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUFYIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUlOICAgICAoMHgxKQotCi1zdHJ1Y3QgaXdsX2h0X2NvbmZpZyB7Ci0JYm9vbCBzaW5nbGVfY2hhaW5fc3VmZmljaWVudDsKLQllbnVtIGllZWU4MDIxMV9zbXBzX21vZGUgc21wczsgLyogY3VycmVudCBzbXBzIG1vZGUgKi8KLX07Ci0KLS8qIFFvUyBzdHJ1Y3R1cmVzICovCi1zdHJ1Y3QgaXdsX3Fvc19pbmZvIHsKLQlpbnQgcW9zX2FjdGl2ZTsKLQlzdHJ1Y3QgaXdsX3Fvc3BhcmFtX2NtZCBkZWZfcW9zX3Bhcm07Ci19OwotCi0vKgotICogU3RydWN0dXJlIHNob3VsZCBiZSBhY2Nlc3NlZCB3aXRoIHN0YV9sb2NrIGhlbGQuIFdoZW4gc3RhdGlvbiBhZGRpdGlvbgotICogaXMgaW4gcHJvZ3Jlc3MgKElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykgaXQgaXMgcG9zc2libGUgdG8gYWNjZXNzIG9ubHkKLSAqIHRoZSBjb21tYW5kcyAoaXdsX2xlZ2FjeV9hZGRzdGFfY21kIGFuZCBpd2xfbGlua19xdWFsaXR5X2NtZCkgd2l0aG91dAotICogc3RhX2xvY2sgaGVsZC4KLSAqLwotc3RydWN0IGl3bF9zdGF0aW9uX2VudHJ5IHsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YTsKLQlzdHJ1Y3QgaXdsX3RpZF9kYXRhIHRpZFtNQVhfVElEX0NPVU5UXTsKLQl1OCB1c2VkLCBjdHhpZDsKLQlzdHJ1Y3QgaXdsX2h3X2tleSBrZXlpbmZvOwotCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHE7Ci19OwotCi1zdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdl9jb21tb24gewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JdTggc3RhX2lkOwotfTsKLQotLyoKLSAqIGl3bF9zdGF0aW9uX3ByaXY6IERyaXZlcidzIHByaXZhdGUgc3RhdGlvbiBpbmZvcm1hdGlvbgotICoKLSAqIFdoZW4gbWFjODAyMTEgY3JlYXRlcyBhIHN0YXRpb24gaXQgcmVzZXJ2ZXMgc29tZSBzcGFjZSAoaHctPnN0YV9kYXRhX3NpemUpCi0gKiBpbiB0aGUgc3RydWN0dXJlIGZvciB1c2UgYnkgZHJpdmVyLiBUaGlzIHN0cnVjdHVyZSBpcyBwbGFjZXMgaW4gdGhhdAotICogc3BhY2UuCi0gKgotICogVGhlIGNvbW1vbiBzdHJ1Y3QgTVVTVCBiZSBmaXJzdCBiZWNhdXNlIGl0IGlzIHNoYXJlZCBiZXR3ZWVuCi0gKiAzOTQ1IGFuZCA0OTY1IQotICovCi1zdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiB7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXZfY29tbW9uIGNvbW1vbjsKLQlzdHJ1Y3QgaXdsX2xxX3N0YSBscV9zdGE7Ci0JYXRvbWljX3QgcGVuZGluZ19mcmFtZXM7Ci0JYm9vbCBjbGllbnQ7Ci0JYm9vbCBhc2xlZXA7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpd2xfdmlmX3ByaXYgLSBkcml2ZXIncyBwcml2YXRlIHBlci1pbnRlcmZhY2UgaW5mb3JtYXRpb24KLSAqCi0gKiBXaGVuIG1hYzgwMjExIGFsbG9jYXRlcyBhIHZpcnR1YWwgaW50ZXJmYWNlLCBpdCBjYW4gYWxsb2NhdGUKLSAqIHNwYWNlIGZvciB1cyB0byBwdXQgZGF0YSBpbnRvLgotICovCi1zdHJ1Y3QgaXdsX3ZpZl9wcml2IHsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCXU4IGlic3NfYnNzaWRfc3RhX2lkOwotfTsKLQotLyogb25lIGZvciBlYWNoIHVDb2RlIGltYWdlIChpbnN0L2RhdGEsIGJvb3QvaW5pdC9ydW50aW1lKSAqLwotc3RydWN0IGZ3X2Rlc2MgewotCXZvaWQgKnZfYWRkcjsJCS8qIGFjY2VzcyBieSBkcml2ZXIgKi8KLQlkbWFfYWRkcl90IHBfYWRkcjsJLyogYWNjZXNzIGJ5IGNhcmQncyBidXNtYXN0ZXIgRE1BICovCi0JdTMyIGxlbjsJCS8qIGJ5dGVzICovCi19OwotCi0vKiB1Q29kZSBmaWxlIGxheW91dCAqLwotc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgewotCV9fbGUzMiB2ZXI7CS8qIG1ham9yL21pbm9yL0FQSS9zZXJpYWwgKi8KLQlzdHJ1Y3QgewotCQlfX2xlMzIgaW5zdF9zaXplOwkvKiBieXRlcyBvZiBydW50aW1lIGNvZGUgKi8KLQkJX19sZTMyIGRhdGFfc2l6ZTsJLyogYnl0ZXMgb2YgcnVudGltZSBkYXRhICovCi0JCV9fbGUzMiBpbml0X3NpemU7CS8qIGJ5dGVzIG9mIGluaXQgY29kZSAqLwotCQlfX2xlMzIgaW5pdF9kYXRhX3NpemU7CS8qIGJ5dGVzIG9mIGluaXQgZGF0YSAqLwotCQlfX2xlMzIgYm9vdF9zaXplOwkvKiBieXRlcyBvZiBib290c3RyYXAgY29kZSAqLwotCQl1OCBkYXRhWzBdOwkJLyogaW4gc2FtZSBvcmRlciBhcyBzaXplcyAqLwotCX0gdjE7Ci19OwotCi1zdHJ1Y3QgaXdsNDk2NV9pYnNzX3NlcSB7Ci0JdTggbWFjW0VUSF9BTEVOXTsKLQl1MTYgc2VxX251bTsKLQl1MTYgZnJhZ19udW07Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlcyB7Ci0JdTE2IG1pbl9ucmdfY2NrOwotCXUxNiBtYXhfbnJnX2NjazsKLQotCXUxNiBucmdfdGhfY2NrOwotCXUxNiBucmdfdGhfb2ZkbTsKLQotCXUxNiBhdXRvX2NvcnJfbWluX29mZG07Ci0JdTE2IGF1dG9fY29ycl9taW5fb2ZkbV9tcmM7Ci0JdTE2IGF1dG9fY29ycl9taW5fb2ZkbV94MTsKLQl1MTYgYXV0b19jb3JyX21pbl9vZmRtX21yY194MTsKLQotCXUxNiBhdXRvX2NvcnJfbWF4X29mZG07Ci0JdTE2IGF1dG9fY29ycl9tYXhfb2ZkbV9tcmM7Ci0JdTE2IGF1dG9fY29ycl9tYXhfb2ZkbV94MTsKLQl1MTYgYXV0b19jb3JyX21heF9vZmRtX21yY194MTsKLQotCXUxNiBhdXRvX2NvcnJfbWF4X2NjazsKLQl1MTYgYXV0b19jb3JyX21heF9jY2tfbXJjOwotCXUxNiBhdXRvX2NvcnJfbWluX2NjazsKLQl1MTYgYXV0b19jb3JyX21pbl9jY2tfbXJjOwotCi0JdTE2IGJhcmtlcl9jb3JyX3RoX21pbjsKLQl1MTYgYmFya2VyX2NvcnJfdGhfbWluX21yYzsKLQl1MTYgbnJnX3RoX2NjYTsKLX07Ci0KLQotI2RlZmluZSBLRUxWSU5fVE9fQ0VMU0lVUyh4KSAoKHgpLTI3MykKLSNkZWZpbmUgQ0VMU0lVU19UT19LRUxWSU4oeCkgKCh4KSsyNzMpCi0KLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX2h3X3BhcmFtcwotICogQG1heF90eHFfbnVtOiBNYXggIyBUeCBxdWV1ZXMgc3VwcG9ydGVkCi0gKiBAZG1hX2NobmxfbnVtOiBOdW1iZXIgb2YgVHggRE1BL0ZJRk8gY2hhbm5lbHMKLSAqIEBzY2RfYmNfdGJsc19zaXplOiBzaXplIG9mIHNjaGVkdWxlciBieXRlIGNvdW50IHRhYmxlcwotICogQHRmZF9zaXplOiBURkQgc2l6ZQotICogQHR4L3J4X2NoYWluc19udW06IE51bWJlciBvZiBUWC9SWCBjaGFpbnMKLSAqIEB2YWxpZF90eC9yeF9hbnQ6IHVzYWJsZSBhbnRlbm5hcwotICogQG1heF9yeHFfc2l6ZTogTWF4ICMgUnggZnJhbWVzIGluIFJ4IHF1ZXVlIChtdXN0IGJlIHBvd2VyLW9mLTIpCi0gKiBAbWF4X3J4cV9sb2c6IExvZy1iYXNlLTIgb2YgbWF4X3J4cV9zaXplCi0gKiBAcnhfcGFnZV9vcmRlcjogUnggYnVmZmVyIHBhZ2Ugb3JkZXIKLSAqIEByeF93cnRfcHRyX3JlZzogRkh7Mzl9X1JTQ1NSX0NITkwwX1dQVFIKLSAqIEBtYXhfc3RhdGlvbnM6Ci0gKiBAaHQ0MF9jaGFubmVsOiBpcyA0ME1IeiB3aWR0aCBwb3NzaWJsZSBpbiBiYW5kIDIuNAotICogQklUKElFRUU4MDIxMV9CQU5EXzVHSFopIEJJVChJRUVFODAyMTFfQkFORF81R0haKQotICogQHN3X2NyeXB0bzogMCBmb3IgaHcsIDEgZm9yIHN3Ci0gKiBAbWF4X3h4eF9zaXplOiBmb3IgdWNvZGUgdXNlcwotICogQGN0X2tpbGxfdGhyZXNob2xkOiB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQKLSAqIEBiZWFjb25fdGltZV90c2ZfYml0czogbnVtYmVyIG9mIHZhbGlkIHRzZiBiaXRzIGZvciBiZWFjb24gdGltZQotICogQHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzOiByYW5nZSBvZiBzZW5zaXRpdml0eSB2YWx1ZXMKLSAqLwotc3RydWN0IGl3bF9od19wYXJhbXMgewotCXU4IG1heF90eHFfbnVtOwotCXU4IGRtYV9jaG5sX251bTsKLQl1MTYgc2NkX2JjX3RibHNfc2l6ZTsKLQl1MzIgdGZkX3NpemU7Ci0JdTggIHR4X2NoYWluc19udW07Ci0JdTggIHJ4X2NoYWluc19udW07Ci0JdTggIHZhbGlkX3R4X2FudDsKLQl1OCAgdmFsaWRfcnhfYW50OwotCXUxNiBtYXhfcnhxX3NpemU7Ci0JdTE2IG1heF9yeHFfbG9nOwotCXUzMiByeF9wYWdlX29yZGVyOwotCXUzMiByeF93cnRfcHRyX3JlZzsKLQl1OCAgbWF4X3N0YXRpb25zOwotCXU4ICBodDQwX2NoYW5uZWw7Ci0JdTggIG1heF9iZWFjb25faXRydmw7CS8qIGluIDEwMjQgbXMgKi8KLQl1MzIgbWF4X2luc3Rfc2l6ZTsKLQl1MzIgbWF4X2RhdGFfc2l6ZTsKLQl1MzIgbWF4X2JzbV9zaXplOwotCXUzMiBjdF9raWxsX3RocmVzaG9sZDsgLyogdmFsdWUgaW4gaHctZGVwZW5kZW50IHVuaXRzICovCi0JdTE2IGJlYWNvbl90aW1lX3RzZl9iaXRzOwotCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpzZW5zOwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGNvcmUgbW9kdWxlIHdoaWNoIGFyZSBmb3J3YXJkIGRlY2xhcmVkIGhlcmUKLSAqIGZvciB1c2UgYnkgaXdsLVs0LTVdLmMKLSAqCi0gKiBOT1RFOiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGhhcmR3YXJlIHNwZWNpZmljCi0gKiB3aGljaCBpcyB3aHkgdGhleSBhcmUgaW4gdGhlIGNvcmUgbW9kdWxlIGZpbGVzLgotICoKLSAqIE5hbWluZyBjb252ZW50aW9uIC0tCi0gKiBpd2xfICAgICAgICAgPC0tIElzIHBhcnQgb2YgaXdsd2lmaQotICogaXdsWFhYWF8gICAgIDwtLSBIYXJkd2FyZSBzcGVjaWZpYyAoaW1wbGVtZW50ZWQgaW4gaXdsLVhYWFguYyBmb3IgWFhYWCkKLSAqIGl3bDQ5NjVfYmdfICAgICAgPC0tIENhbGxlZCBmcm9tIHdvcmsgcXVldWUgY29udGV4dAotICogaXdsNDk2NV9tYWNfICAgICA8LS0gbWFjODAyMTEgY2FsbGJhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGl3bDQ5NjVfdXBkYXRlX2NoYWluX2ZsYWdzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gY29uc3QgdTggaXdsZWdhY3lfYmNhc3RfYWRkcltFVEhfQUxFTl07Ci1leHRlcm4gaW50IGl3bF9sZWdhY3lfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGl3bF9xdWV1ZSAqcSk7Ci1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3F1ZXVlX3VzZWQoY29uc3Qgc3RydWN0IGl3bF9xdWV1ZSAqcSwgaW50IGkpCi17Ci0JcmV0dXJuIHEtPndyaXRlX3B0ciA+PSBxLT5yZWFkX3B0ciA/Ci0JCShpID49IHEtPnJlYWRfcHRyICYmIGkgPCBxLT53cml0ZV9wdHIpIDoKLQkJIShpIDwgcS0+cmVhZF9wdHIgJiYgaSA+PSBxLT53cml0ZV9wdHIpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTggaXdsX2xlZ2FjeV9nZXRfY21kX2luZGV4KHN0cnVjdCBpd2xfcXVldWUgKnEsIHUzMiBpbmRleCwKLQkJCQkJCQkJaW50IGlzX2h1Z2UpCi17Ci0JLyoKLQkgKiBUaGlzIGlzIGZvciBpbml0IGNhbGlicmF0aW9uIHJlc3VsdCBhbmQgc2NhbiBjb21tYW5kIHdoaWNoCi0JICogcmVxdWlyZWQgYnVmZmVyID4gVEZEX01BWF9QQVlMT0FEX1NJWkUsCi0JICogdGhlIGJpZyBidWZmZXIgYXQgZW5kIG9mIGNvbW1hbmQgYXJyYXkKLQkgKi8KLQlpZiAoaXNfaHVnZSkKLQkJcmV0dXJuIHEtPm5fd2luZG93OwkvKiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KLQotCS8qIE90aGVyd2lzZSwgdXNlIG5vcm1hbCBzaXplIGJ1ZmZlcnMgKi8KLQlyZXR1cm4gaW5kZXggJiAocS0+bl93aW5kb3cgLSAxKTsKLX0KLQotCi1zdHJ1Y3QgaXdsX2RtYV9wdHIgewotCWRtYV9hZGRyX3QgZG1hOwotCXZvaWQgKmFkZHI7Ci0Jc2l6ZV90IHNpemU7Ci19OwotCi0jZGVmaW5lIElXTF9PUEVSQVRJT05fTU9ERV9BVVRPICAgICAwCi0jZGVmaW5lIElXTF9PUEVSQVRJT05fTU9ERV9IVF9PTkxZICAxCi0jZGVmaW5lIElXTF9PUEVSQVRJT05fTU9ERV9NSVhFRCAgICAyCi0jZGVmaW5lIElXTF9PUEVSQVRJT05fTU9ERV8yME1IWiAgICAzCi0KLSNkZWZpbmUgSVdMX1RYX0NSQ19TSVpFIDQKLSNkZWZpbmUgSVdMX1RYX0RFTElNSVRFUl9TSVpFIDQKLQotI2RlZmluZSBUWF9QT1dFUl9JV0xfSUxMRUdBTF9WT0xUQUdFIC0xMDAwMAotCi0vKiBTZW5zaXRpdml0eSBhbmQgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gKi8KLSNkZWZpbmUgSU5JVElBTElaQVRJT05fVkFMVUUJCTB4RkZGRgotI2RlZmluZSBJV0w0OTY1X0NBTF9OVU1fQkVBQ09OUwkJMjAKLSNkZWZpbmUgSVdMX0NBTF9OVU1fQkVBQ09OUwkJMTYKLSNkZWZpbmUgTUFYSU1VTV9BTExPV0VEX1BBVEhMT1NTCTE1Ci0KLSNkZWZpbmUgQ0hBSU5fTk9JU0VfTUFYX0RFTFRBX0dBSU5fQ09ERSAzCi0KLSNkZWZpbmUgTUFYX0ZBX09GRE0gIDUwCi0jZGVmaW5lIE1JTl9GQV9PRkRNICA1Ci0jZGVmaW5lIE1BWF9GQV9DQ0sgICA1MAotI2RlZmluZSBNSU5fRkFfQ0NLICAgNQotCi0jZGVmaW5lIEFVVE9fQ09SUl9TVEVQX09GRE0gICAgICAgMQotCi0jZGVmaW5lIEFVVE9fQ09SUl9TVEVQX0NDSyAgICAgMwotI2RlZmluZSBBVVRPX0NPUlJfTUFYX1RIX0NDSyAgIDE2MAotCi0jZGVmaW5lIE5SR19ESUZGICAgICAgICAgICAgICAgMgotI2RlZmluZSBOUkdfU1RFUF9DQ0sgICAgICAgICAgIDIKLSNkZWZpbmUgTlJHX01BUkdJTiAgICAgICAgICAgICA4Ci0jZGVmaW5lIE1BWF9OVU1CRVJfQ0NLX05PX0ZBIDEwMAotCi0jZGVmaW5lIEFVVE9fQ09SUl9DQ0tfTUlOX1ZBTF9ERUYgICAgKDEyNSkKLQotI2RlZmluZSBDSEFJTl9BICAgICAgICAgICAgIDAKLSNkZWZpbmUgQ0hBSU5fQiAgICAgICAgICAgICAxCi0jZGVmaW5lIENIQUlOX0MgICAgICAgICAgICAgMgotI2RlZmluZSBDSEFJTl9OT0lTRV9ERUxUQV9HQUlOX0lOSVRfVkFMIDQKLSNkZWZpbmUgQUxMX0JBTkRfRklMVEVSCQkJMHhGRjAwCi0jZGVmaW5lIElOX0JBTkRfRklMVEVSCQkJMHhGRgotI2RlZmluZSBNSU5fQVZFUkFHRV9OT0lTRV9NQVhfVkFMVUUJMHhGRkZGRkZGRgotCi0jZGVmaW5lIE5SR19OVU1fUFJFVl9TVEFUX0wgICAgIDIwCi0jZGVmaW5lIE5VTV9SWF9DSEFJTlMgICAgICAgICAgIDMKLQotZW51bSBpd2w0OTY1X2ZhbHNlX2FsYXJtX3N0YXRlIHsKLQlJV0xfRkFfVE9PX01BTlkgPSAwLAotCUlXTF9GQV9UT09fRkVXID0gMSwKLQlJV0xfRkFfR09PRF9SQU5HRSA9IDIsCi19OwotCi1lbnVtIGl3bDQ5NjVfY2hhaW5fbm9pc2Vfc3RhdGUgewotCUlXTF9DSEFJTl9OT0lTRV9BTElWRSA9IDAsICAvKiBtdXN0IGJlIDAgKi8KLQlJV0xfQ0hBSU5fTk9JU0VfQUNDVU1VTEFURSwKLQlJV0xfQ0hBSU5fTk9JU0VfQ0FMSUJSQVRFRCwKLQlJV0xfQ0hBSU5fTk9JU0VfRE9ORSwKLX07Ci0KLWVudW0gaXdsNDk2NV9jYWxpYl9lbmFibGVkX3N0YXRlIHsKLQlJV0xfQ0FMSUJfRElTQUJMRUQgPSAwLCAgLyogbXVzdCBiZSAwICovCi0JSVdMX0NBTElCX0VOQUJMRUQgPSAxLAotfTsKLQotLyoKLSAqIGVudW0gaXdsX2NhbGliCi0gKiBkZWZpbmVzIHRoZSBvcmRlciBpbiB3aGljaCByZXN1bHRzIG9mIGluaXRpYWwgY2FsaWJyYXRpb25zCi0gKiBzaG91bGQgYmUgc2VudCB0byB0aGUgcnVudGltZSB1Q29kZQotICovCi1lbnVtIGl3bF9jYWxpYiB7Ci0JSVdMX0NBTElCX01BWCwKLX07Ci0KLS8qIE9wYXF1ZSBjYWxpYnJhdGlvbiByZXN1bHRzICovCi1zdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCB7Ci0Jdm9pZCAqYnVmOwotCXNpemVfdCBidWZfbGVuOwotfTsKLQotZW51bSB1Y29kZV90eXBlIHsKLQlVQ09ERV9OT05FID0gMCwKLQlVQ09ERV9JTklULAotCVVDT0RFX1JUCi19OwotCi0vKiBTZW5zaXRpdml0eSBjYWxpYiBkYXRhICovCi1zdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgewotCXUzMiBhdXRvX2NvcnJfb2ZkbTsKLQl1MzIgYXV0b19jb3JyX29mZG1fbXJjOwotCXUzMiBhdXRvX2NvcnJfb2ZkbV94MTsKLQl1MzIgYXV0b19jb3JyX29mZG1fbXJjX3gxOwotCXUzMiBhdXRvX2NvcnJfY2NrOwotCXUzMiBhdXRvX2NvcnJfY2NrX21yYzsKLQotCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9vZmRtOwotCXUzMiBsYXN0X2ZhX2NudF9vZmRtOwotCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9jY2s7Ci0JdTMyIGxhc3RfZmFfY250X2NjazsKLQotCXUzMiBucmdfY3Vycl9zdGF0ZTsKLQl1MzIgbnJnX3ByZXZfc3RhdGU7Ci0JdTMyIG5yZ192YWx1ZVsxMF07Ci0JdTggIG5yZ19zaWxlbmNlX3Jzc2lbTlJHX05VTV9QUkVWX1NUQVRfTF07Ci0JdTMyIG5yZ19zaWxlbmNlX3JlZjsKLQl1MzIgbnJnX2VuZXJneV9pZHg7Ci0JdTMyIG5yZ19zaWxlbmNlX2lkeDsKLQl1MzIgbnJnX3RoX2NjazsKLQlzMzIgbnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmY7Ci0JdTMyIG51bV9pbl9jY2tfbm9fZmE7Ci0JdTMyIG5yZ190aF9vZmRtOwotCi0JdTE2IGJhcmtlcl9jb3JyX3RoX21pbjsKLQl1MTYgYmFya2VyX2NvcnJfdGhfbWluX21yYzsKLQl1MTYgbnJnX3RoX2NjYTsKLX07Ci0KLS8qIENoYWluIG5vaXNlIChkaWZmZXJlbnRpYWwgUnggZ2FpbikgY2FsaWIgZGF0YSAqLwotc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhIHsKLQl1MzIgYWN0aXZlX2NoYWluczsKLQl1MzIgY2hhaW5fbm9pc2VfYTsKLQl1MzIgY2hhaW5fbm9pc2VfYjsKLQl1MzIgY2hhaW5fbm9pc2VfYzsKLQl1MzIgY2hhaW5fc2lnbmFsX2E7Ci0JdTMyIGNoYWluX3NpZ25hbF9iOwotCXUzMiBjaGFpbl9zaWduYWxfYzsKLQl1MTYgYmVhY29uX2NvdW50OwotCXU4IGRpc2Nvbm5fYXJyYXlbTlVNX1JYX0NIQUlOU107Ci0JdTggZGVsdGFfZ2Fpbl9jb2RlW05VTV9SWF9DSEFJTlNdOwotCXU4IHJhZGlvX3dyaXRlOwotCXU4IHN0YXRlOwotfTsKLQotI2RlZmluZQlFRVBST01fU0VNX1RJTUVPVVQgMTAJCS8qIG1pbGxpc2Vjb25kcyAqLwotI2RlZmluZSBFRVBST01fU0VNX1JFVFJZX0xJTUlUIDEwMDAJLyogbnVtYmVyIG9mIGF0dGVtcHRzIChub3QgdGltZSkgKi8KLQotI2RlZmluZSBJV0xfVFJBRkZJQ19FTlRSSUVTCSgyNTYpCi0jZGVmaW5lIElXTF9UUkFGRklDX0VOVFJZX1NJWkUgICg2NCkKLQotZW51bSB7Ci0JTUVBU1VSRU1FTlRfUkVBRFkgPSAoMSA8PCAwKSwKLQlNRUFTVVJFTUVOVF9BQ1RJVkUgPSAoMSA8PCAxKSwKLX07Ci0KLS8qIGludGVycnVwdCBzdGF0aXN0aWNzICovCi1zdHJ1Y3QgaXNyX3N0YXRpc3RpY3MgewotCXUzMiBodzsKLQl1MzIgc3c7Ci0JdTMyIGVycl9jb2RlOwotCXUzMiBzY2g7Ci0JdTMyIGFsaXZlOwotCXUzMiByZmtpbGw7Ci0JdTMyIGN0a2lsbDsKLQl1MzIgd2FrZXVwOwotCXUzMiByeDsKLQl1MzIgcnhfaGFuZGxlcnNbUkVQTFlfTUFYXTsKLQl1MzIgdHg7Ci0JdTMyIHVuaGFuZGxlZDsKLX07Ci0KLS8qIG1hbmFnZW1lbnQgc3RhdGlzdGljcyAqLwotZW51bSBpd2xfbWdtdF9zdGF0cyB7Ci0JTUFOQUdFTUVOVF9BU1NPQ19SRVEgPSAwLAotCU1BTkFHRU1FTlRfQVNTT0NfUkVTUCwKLQlNQU5BR0VNRU5UX1JFQVNTT0NfUkVRLAotCU1BTkFHRU1FTlRfUkVBU1NPQ19SRVNQLAotCU1BTkFHRU1FTlRfUFJPQkVfUkVRLAotCU1BTkFHRU1FTlRfUFJPQkVfUkVTUCwKLQlNQU5BR0VNRU5UX0JFQUNPTiwKLQlNQU5BR0VNRU5UX0FUSU0sCi0JTUFOQUdFTUVOVF9ESVNBU1NPQywKLQlNQU5BR0VNRU5UX0FVVEgsCi0JTUFOQUdFTUVOVF9ERUFVVEgsCi0JTUFOQUdFTUVOVF9BQ1RJT04sCi0JTUFOQUdFTUVOVF9NQVgsCi19OwotLyogY29udHJvbCBzdGF0aXN0aWNzICovCi1lbnVtIGl3bF9jdHJsX3N0YXRzIHsKLQlDT05UUk9MX0JBQ0tfUkVRID0gIDAsCi0JQ09OVFJPTF9CQUNLLAotCUNPTlRST0xfUFNQT0xMLAotCUNPTlRST0xfUlRTLAotCUNPTlRST0xfQ1RTLAotCUNPTlRST0xfQUNLLAotCUNPTlRST0xfQ0ZFTkQsCi0JQ09OVFJPTF9DRkVOREFDSywKLQlDT05UUk9MX01BWCwKLX07Ci0KLXN0cnVjdCB0cmFmZmljX3N0YXRzIHsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotCXUzMiBtZ210W01BTkFHRU1FTlRfTUFYXTsKLQl1MzIgY3RybFtDT05UUk9MX01BWF07Ci0JdTMyIGRhdGFfY250OwotCXU2NCBkYXRhX2J5dGVzOwotI2VuZGlmCi19OwotCi0vKgotICogaG9zdCBpbnRlcnJ1cHQgdGltZW91dCB2YWx1ZQotICogdXNlZCB3aXRoIHNldHRpbmcgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZXIKLSAqIHRoZSBDU1JfSU5UX0NPQUxFU0NJTkcgaXMgYW4gOCBiaXQgcmVnaXN0ZXIgaW4gMzItdXNlYyB1bml0Ci0gKgotICogZGVmYXVsdCBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lciBpcyA2NCB4IDMyID0gMjA0OCB1c2VjcwotICogZGVmYXVsdCBpbnRlcnJ1cHQgY29hbGVzY2luZyBjYWxpYnJhdGlvbiB0aW1lciBpcyAxNiB4IDMyID0gNTEyIHVzZWNzCi0gKi8KLSNkZWZpbmUgSVdMX0hPU1RfSU5UX1RJTUVPVVRfTUFYCSgweEZGKQotI2RlZmluZSBJV0xfSE9TVF9JTlRfVElNRU9VVF9ERUYJKDB4NDApCi0jZGVmaW5lIElXTF9IT1NUX0lOVF9USU1FT1VUX01JTgkoMHgwKQotI2RlZmluZSBJV0xfSE9TVF9JTlRfQ0FMSUJfVElNRU9VVF9NQVgJKDB4RkYpCi0jZGVmaW5lIElXTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX0RFRgkoMHgxMCkKLSNkZWZpbmUgSVdMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfTUlOCSgweDApCi0KLSNkZWZpbmUgSVdMX0RFTEFZX05FWFRfRk9SQ0VfRldfUkVMT0FEIChIWio1KQotCi0vKiBUWCBxdWV1ZSB3YXRjaGRvZyB0aW1lb3V0cyBpbiBtU2VjcyAqLwotI2RlZmluZSBJV0xfREVGX1dEX1RJTUVPVVQJKDIwMDApCi0jZGVmaW5lIElXTF9MT05HX1dEX1RJTUVPVVQJKDEwMDAwKQotI2RlZmluZSBJV0xfTUFYX1dEX1RJTUVPVVQJKDEyMDAwMCkKLQotc3RydWN0IGl3bF9mb3JjZV9yZXNldCB7Ci0JaW50IHJlc2V0X3JlcXVlc3RfY291bnQ7Ci0JaW50IHJlc2V0X3N1Y2Nlc3NfY291bnQ7Ci0JaW50IHJlc2V0X3JlamVjdF9jb3VudDsKLQl1bnNpZ25lZCBsb25nIHJlc2V0X2R1cmF0aW9uOwotCXVuc2lnbmVkIGxvbmcgbGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzOwotfTsKLQotLyogZXh0ZW5kIGJlYWNvbiB0aW1lIGZvcm1hdCBiaXQgc2hpZnRpbmcgICovCi0vKgotICogZm9yIF8zOTQ1IGRldmljZXMKLSAqIGJpdHMgMzE6MjQgLSBleHRlbmRlZAotICogYml0cyAyMzowICAtIGludGVydmFsCi0gKi8KLSNkZWZpbmUgSVdMMzk0NV9FWFRfQkVBQ09OX1RJTUVfUE9TCTI0Ci0vKgotICogZm9yIF80OTY1IGRldmljZXMKLSAqIGJpdHMgMzE6MjIgLSBleHRlbmRlZAotICogYml0cyAyMTowICAtIGludGVydmFsCi0gKi8KLSNkZWZpbmUgSVdMNDk2NV9FWFRfQkVBQ09OX1RJTUVfUE9TCTIyCi0KLWVudW0gaXdsX3J4b25fY29udGV4dF9pZCB7Ci0JSVdMX1JYT05fQ1RYX0JTUywKLQotCU5VTV9JV0xfUlhPTl9DVFgKLX07Ci0KLXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0IHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwotCi0JY29uc3QgdTggKmFjX3RvX2ZpZm87Ci0JY29uc3QgdTggKmFjX3RvX3F1ZXVlOwotCXU4IG1jYXN0X3F1ZXVlOwotCi0JLyoKLQkgKiBXZSBjb3VsZCB1c2UgdGhlIHZpZiB0byBpbmRpY2F0ZSBhY3RpdmUsIGJ1dCB3ZQotCSAqIGFsc28gbmVlZCBpdCB0byBiZSBhY3RpdmUgZHVyaW5nIGRpc2FibGluZyB3aGVuCi0JICogd2UgYWxyZWFkeSByZW1vdmVkIHRoZSB2aWYgZm9yIHR5cGUgc2V0dGluZy4KLQkgKi8KLQlib29sIGFsd2F5c19hY3RpdmUsIGlzX2FjdGl2ZTsKLQotCWJvb2wgaHRfbmVlZF9tdWx0aXBsZV9jaGFpbnM7Ci0KLQllbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4aWQ7Ci0KLQl1MzIgaW50ZXJmYWNlX21vZGVzLCBleGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOwotCXU4IHVudXNlZF9kZXZ0eXBlLCBhcF9kZXZ0eXBlLCBpYnNzX2RldnR5cGUsIHN0YXRpb25fZGV2dHlwZTsKLQotCS8qCi0JICogV2UgZGVjbGFyZSB0aGlzIGNvbnN0IHNvIGl0IGNhbiBvbmx5IGJlCi0JICogY2hhbmdlZCB2aWEgZXhwbGljaXQgY2FzdCB3aXRoaW4gdGhlCi0JICogcm91dGluZXMgdGhhdCBhY3R1YWxseSB1cGRhdGUgdGhlIHBoeXNpY2FsCi0JICogaGFyZHdhcmUuCi0JICovCi0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgYWN0aXZlOwotCXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kIHN0YWdpbmc7Ci0KLQlzdHJ1Y3QgaXdsX3J4b25fdGltZV9jbWQgdGltaW5nOwotCi0Jc3RydWN0IGl3bF9xb3NfaW5mbyBxb3NfZGF0YTsKLQotCXU4IGJjYXN0X3N0YV9pZCwgYXBfc3RhX2lkOwotCi0JdTggcnhvbl9jbWQsIHJ4b25fYXNzb2NfY21kLCByeG9uX3RpbWluZ19jbWQ7Ci0JdTggcW9zX2NtZDsKLQl1OCB3ZXBfa2V5X2NtZDsKLQotCXN0cnVjdCBpd2xfd2VwX2tleSB3ZXBfa2V5c1tXRVBfS0VZU19NQVhdOwotCXU4IGtleV9tYXBwaW5nX2tleXM7Ci0KLQlfX2xlMzIgc3RhdGlvbl9mbGFnczsKLQotCXN0cnVjdCB7Ci0JCWJvb2wgbm9uX2dmX3N0YV9wcmVzZW50OwotCQl1OCBwcm90ZWN0aW9uOwotCQlib29sIGVuYWJsZWQsIGlzXzQwbWh6OwotCQl1OCBleHRlbnNpb25fY2hhbl9vZmZzZXQ7Ci0JfSBodDsKLX07Ci0KLXN0cnVjdCBpd2xfcHJpdiB7Ci0KLQkvKiBpZWVlIGRldmljZSB1c2VkIGJ5IGdlbmVyaWMgaWVlZSBwcm9jZXNzaW5nIGNvZGUgKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmllZWVfY2hhbm5lbHM7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYXRlICppZWVlX3JhdGVzOwotCXN0cnVjdCBpd2xfY2ZnICpjZmc7Ci0KLQkvKiB0ZW1wb3JhcnkgZnJhbWUgc3RvcmFnZSBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2ZyYW1lczsKLQlpbnQgZnJhbWVzX2NvdW50OwotCi0JZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwotCWludCBhbGxvY19yeGJfcGFnZTsKLQotCXZvaWQgKCpyeF9oYW5kbGVyc1tSRVBMWV9NQVhdKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLQotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZHNbSUVFRTgwMjExX05VTV9CQU5EU107Ci0KLQkvKiBzcGVjdHJ1bSBtZWFzdXJlbWVudCByZXBvcnQgY2FjaGluZyAqLwotCXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uIG1lYXN1cmVfcmVwb3J0OwotCXU4IG1lYXN1cmVtZW50X3N0YXR1czsKLQotCS8qIHVjb2RlIGJlYWNvbiB0aW1lICovCi0JdTMyIHVjb2RlX2JlYWNvbl90aW1lOwotCWludCBtaXNzZWRfYmVhY29uX3RocmVzaG9sZDsKLQotCS8qIHRyYWNrIElCU1MgbWFuYWdlciAobGFzdCBiZWFjb24pIHN0YXR1cyAqLwotCXUzMiBpYnNzX21hbmFnZXI7Ci0KLQkvKiBmb3JjZSByZXNldCAqLwotCXN0cnVjdCBpd2xfZm9yY2VfcmVzZXQgZm9yY2VfcmVzZXQ7Ci0KLQkvKiB3ZSBhbGxvY2F0ZSBhcnJheSBvZiBpd2xfY2hhbm5lbF9pbmZvIGZvciBOSUMncyB2YWxpZCBjaGFubmVscy4KLQkgKiAgICBBY2Nlc3MgdmlhIGNoYW5uZWwgIyB1c2luZyBpbmRpcmVjdCBpbmRleCBhcnJheSAqLwotCXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaGFubmVsX2luZm87CS8qIGNoYW5uZWwgaW5mbyBhcnJheSAqLwotCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgb2YgY2hhbm5lbHMgKi8KLQotCS8qIHRoZXJtYWwgY2FsaWJyYXRpb24gKi8KLQlzMzIgdGVtcGVyYXR1cmU7CS8qIGRlZ3JlZXMgS2VsdmluICovCi0JczMyIGxhc3RfdGVtcGVyYXR1cmU7Ci0KLQkvKiBpbml0IGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KLQlzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCBjYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9NQVhdOwotCi0JLyogU2NhbiByZWxhdGVkIHZhcmlhYmxlcyAqLwotCXVuc2lnbmVkIGxvbmcgc2Nhbl9zdGFydDsKLQl1bnNpZ25lZCBsb25nIHNjYW5fc3RhcnRfdHNmOwotCXZvaWQgKnNjYW5fY21kOwotCWVudW0gaWVlZTgwMjExX2JhbmQgc2Nhbl9iYW5kOwotCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnNjYW5fcmVxdWVzdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqc2Nhbl92aWY7Ci0JdTggc2Nhbl90eF9hbnRbSUVFRTgwMjExX05VTV9CQU5EU107Ci0JdTggbWdtdF90eF9hbnQ7Ci0KLQkvKiBzcGlubG9jayAqLwotCXNwaW5sb2NrX3QgbG9jazsJLyogcHJvdGVjdCBnZW5lcmFsIHNoYXJlZCBkYXRhICovCi0Jc3BpbmxvY2tfdCBoY21kX2xvY2s7CS8qIHByb3RlY3QgaGNtZCAqLwotCXNwaW5sb2NrX3QgcmVnX2xvY2s7CS8qIHByb3RlY3QgaHcgcmVnaXN0ZXIgYWNjZXNzICovCi0Jc3RydWN0IG11dGV4IG11dGV4OwotCi0JLyogYmFzaWMgcGNpLW5ldHdvcmsgZHJpdmVyIHN0dWZmICovCi0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Ci0KLQkvKiBwY2kgaGFyZHdhcmUgYWRkcmVzcyBzdXBwb3J0ICovCi0Jdm9pZCBfX2lvbWVtICpod19iYXNlOwotCXUzMiAgaHdfcmV2OwotCXUzMiAgaHdfd2FfcmV2OwotCXU4ICAgcmV2X2lkOwotCi0JLyogbWljcm9jb2RlL2RldmljZSBzdXBwb3J0cyBtdWx0aXBsZSBjb250ZXh0cyAqLwotCXU4IHZhbGlkX2NvbnRleHRzOwotCi0JLyogY29tbWFuZCBxdWV1ZSBudW1iZXIgKi8KLQl1OCBjbWRfcXVldWU7Ci0KLQkvKiBtYXggbnVtYmVyIG9mIHN0YXRpb24ga2V5cyAqLwotCXU4IHN0YV9rZXlfbWF4X251bTsKLQotCS8qIEVFUFJPTSBNQUMgYWRkcmVzc2VzICovCi0Jc3RydWN0IG1hY19hZGRyZXNzIGFkZHJlc3Nlc1sxXTsKLQotCS8qIHVDb2RlIGltYWdlcywgc2F2ZSB0byByZWxvYWQgaW4gY2FzZSBvZiBmYWlsdXJlICovCi0JaW50IGZ3X2luZGV4OwkJCS8qIGZpcm13YXJlIHdlJ3JlIHRyeWluZyB0byBsb2FkICovCi0JdTMyIHVjb2RlX3ZlcjsJCQkvKiB2ZXJzaW9uIG9mIHVjb2RlLCBjb3B5IG9mCi0JCQkJCSAgIGl3bF91Y29kZS52ZXIgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9jb2RlOwkvKiBydW50aW1lIGluc3QgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhOwkvKiBydW50aW1lIGRhdGEgb3JpZ2luYWwgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhX2JhY2t1cDsJLyogcnVudGltZSBkYXRhIHNhdmUvcmVzdG9yZSAqLwotCXN0cnVjdCBmd19kZXNjIHVjb2RlX2luaXQ7CS8qIGluaXRpYWxpemF0aW9uIGluc3QgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9pbml0X2RhdGE7CS8qIGluaXRpYWxpemF0aW9uIGRhdGEgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9ib290OwkvKiBib290c3RyYXAgaW5zdCAqLwotCWVudW0gdWNvZGVfdHlwZSB1Y29kZV90eXBlOwotCXU4IHVjb2RlX3dyaXRlX2NvbXBsZXRlOwkvKiB0aGUgaW1hZ2Ugd3JpdGUgaXMgY29tcGxldGUgKi8KLQljaGFyIGZpcm13YXJlX25hbWVbMjVdOwotCi0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgY29udGV4dHNbTlVNX0lXTF9SWE9OX0NUWF07Ci0KLQlfX2xlMTYgc3dpdGNoX2NoYW5uZWw7Ci0KLQkvKiAxc3QgcmVzcG9uc2VzIGZyb20gaW5pdGlhbGl6ZSBhbmQgcnVudGltZSB1Q29kZSBpbWFnZXMuCi0JICogXzQ5NjUncyBpbml0aWFsaXplIGFsaXZlIHJlc3BvbnNlIGNvbnRhaW5zIHNvbWUgY2FsaWJyYXRpb24gZGF0YS4gKi8KLQlzdHJ1Y3QgaXdsX2luaXRfYWxpdmVfcmVzcCBjYXJkX2FsaXZlX2luaXQ7Ci0Jc3RydWN0IGl3bF9hbGl2ZV9yZXNwIGNhcmRfYWxpdmU7Ci0KLQl1MTYgYWN0aXZlX3JhdGU7Ci0KLQl1OCBzdGFydF9jYWxpYjsKLQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgc2Vuc2l0aXZpdHlfZGF0YTsKLQlzdHJ1Y3QgaXdsX2NoYWluX25vaXNlX2RhdGEgY2hhaW5fbm9pc2VfZGF0YTsKLQlfX2xlMTYgc2Vuc2l0aXZpdHlfdGJsW0hEX1RBQkxFX1NJWkVdOwotCi0Jc3RydWN0IGl3bF9odF9jb25maWcgY3VycmVudF9odF9jb25maWc7Ci0KLQkvKiBSYXRlIHNjYWxpbmcgZGF0YSAqLwotCXU4IHJldHJ5X3JhdGU7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2NvbW1hbmRfcXVldWU7Ci0KLQlpbnQgYWN0aXZpdHlfdGltZXJfYWN0aXZlOwotCi0JLyogUnggYW5kIFR4IERNQSBwcm9jZXNzaW5nIHF1ZXVlcyAqLwotCXN0cnVjdCBpd2xfcnhfcXVldWUgcnhxOwotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cTsKLQl1bnNpZ25lZCBsb25nIHR4cV9jdHhfYWN0aXZlX21zazsKLQlzdHJ1Y3QgaXdsX2RtYV9wdHIgIGt3OwkvKiBrZWVwIHdhcm0gYWRkcmVzcyAqLwotCXN0cnVjdCBpd2xfZG1hX3B0ciAgc2NkX2JjX3RibHM7Ci0KLQl1MzIgc2NkX2Jhc2VfYWRkcjsJLyogc2NoZWR1bGVyIHNyYW0gYmFzZSBhZGRyZXNzICovCi0KLQl1bnNpZ25lZCBsb25nIHN0YXR1czsKLQotCS8qIGNvdW50cyBtZ210LCBjdGwsIGFuZCBkYXRhIHBhY2tldHMgKi8KLQlzdHJ1Y3QgdHJhZmZpY19zdGF0cyB0eF9zdGF0czsKLQlzdHJ1Y3QgdHJhZmZpY19zdGF0cyByeF9zdGF0czsKLQotCS8qIGNvdW50cyBpbnRlcnJ1cHRzICovCi0Jc3RydWN0IGlzcl9zdGF0aXN0aWNzIGlzcl9zdGF0czsKLQotCXN0cnVjdCBpd2xfcG93ZXJfbWdyIHBvd2VyX2RhdGE7Ci0KLQkvKiBjb250ZXh0IGluZm9ybWF0aW9uICovCi0JdTggYnNzaWRbRVRIX0FMRU5dOyAvKiB1c2VkIG9ubHkgb24gMzk0NSBidXQgZmlsbGVkIGJ5IGNvcmUgKi8KLQotCS8qIHN0YXRpb24gdGFibGUgdmFyaWFibGVzICovCi0KLQkvKiBOb3RlOiBpZiBsb2NrIGFuZCBzdGFfbG9jayBhcmUgbmVlZGVkLCBsb2NrIG11c3QgYmUgYWNxdWlyZWQgZmlyc3QgKi8KLQlzcGlubG9ja190IHN0YV9sb2NrOwotCWludCBudW1fc3RhdGlvbnM7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX2VudHJ5IHN0YXRpb25zW0lXTF9TVEFUSU9OX0NPVU5UXTsKLQl1bnNpZ25lZCBsb25nIHVjb2RlX2tleV90YWJsZTsKLQotCS8qIHF1ZXVlIHJlZmNvdW50cyAqLwotI2RlZmluZSBJV0xfTUFYX0hXX1FVRVVFUwkzMgotCXVuc2lnbmVkIGxvbmcgcXVldWVfc3RvcHBlZFtCSVRTX1RPX0xPTkdTKElXTF9NQVhfSFdfUVVFVUVTKV07Ci0JLyogZm9yIGVhY2ggQUMgKi8KLQlhdG9taWNfdCBxdWV1ZV9zdG9wX2NvdW50WzRdOwotCi0JLyogSW5kaWNhdGlvbiBpZiBpZWVlODAyMTFfb3BzLT5vcGVuIGhhcyBiZWVuIGNhbGxlZCAqLwotCXU4IGlzX29wZW47Ci0KLQl1OCBtYWM4MDIxMV9yZWdpc3RlcmVkOwotCi0JLyogZWVwcm9tIC0tIHRoaXMgaXMgaW4gdGhlIGNhcmQncyBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgKi8KLQl1OCAqZWVwcm9tOwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2luZm8gKmNhbGliX2luZm87Ci0KLQllbnVtIG5sODAyMTFfaWZ0eXBlIGl3X21vZGU7Ci0KLQkvKiBMYXN0IFJ4J2QgYmVhY29uIHRpbWVzdGFtcCAqLwotCXU2NCB0aW1lc3RhbXA7Ci0KLQl1bmlvbiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVdMMzk0NSkgfHwgZGVmaW5lZChDT05GSUdfSVdMMzk0NV9NT0RVTEUpCi0JCXN0cnVjdCB7Ci0JCQl2b2lkICpzaGFyZWRfdmlydDsKLQkJCWRtYV9hZGRyX3Qgc2hhcmVkX3BoeXM7Ci0KLQkJCXN0cnVjdCBkZWxheWVkX3dvcmsgdGhlcm1hbF9wZXJpb2RpYzsKLQkJCXN0cnVjdCBkZWxheWVkX3dvcmsgcmZraWxsX3BvbGw7Ci0KLQkJCXN0cnVjdCBpd2wzOTQ1X25vdGlmX3N0YXRpc3RpY3Mgc3RhdGlzdGljczsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotCQkJc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyBhY2N1bV9zdGF0aXN0aWNzOwotCQkJc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyBkZWx0YV9zdGF0aXN0aWNzOwotCQkJc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyBtYXhfZGVsdGE7Ci0jZW5kaWYKLQotCQkJdTMyIHN0YV9zdXBwX3JhdGVzOwotCQkJaW50IGxhc3RfcnhfcnNzaTsJLyogRnJvbSBSeCBwYWNrZXQgc3RhdGlzdGljcyAqLwotCi0JCQkvKiBSeCdkIHBhY2tldCB0aW1pbmcgaW5mb3JtYXRpb24gKi8KLQkJCXUzMiBsYXN0X2JlYWNvbl90aW1lOwotCQkJdTY0IGxhc3RfdHNmOwotCi0JCQkvKgotCQkJICogZWFjaCBjYWxpYnJhdGlvbiBjaGFubmVsIGdyb3VwIGluIHRoZQotCQkJICogRUVQUk9NIGhhcyBhIGRlcml2ZWQgY2xpcCBzZXR0aW5nIGZvcgotCQkJICogZWFjaCByYXRlLgotCQkJICovCi0JCQljb25zdCBzdHJ1Y3QgaXdsMzk0NV9jbGlwX2dyb3VwIGNsaXBfZ3JvdXBzWzVdOwotCi0JCX0gXzM5NDU7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19JV0w0OTY1KSB8fCBkZWZpbmVkKENPTkZJR19JV0w0OTY1X01PRFVMRSkKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpd2xfcnhfcGh5X3JlcyBsYXN0X3BoeV9yZXM7Ci0JCQlib29sIGxhc3RfcGh5X3Jlc192YWxpZDsKLQotCQkJc3RydWN0IGNvbXBsZXRpb24gZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZTsKLQotCQkJLyoKLQkJCSAqIGNoYWluIG5vaXNlIHJlc2V0IGFuZCBnYWluIGNvbW1hbmRzIGFyZSB0aGUKLQkJCSAqIHR3byBleHRyYSBjYWxpYnJhdGlvbiBjb21tYW5kcyBmb2xsb3dzIHRoZSBzdGFuZGFyZAotCQkJICogcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzCi0JCQkgKi8KLQkJCXU4IHBoeV9jYWxpYl9jaGFpbl9ub2lzZV9yZXNldF9jbWQ7Ci0JCQl1OCBwaHlfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQ7Ci0KLQkJCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyBzdGF0aXN0aWNzOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JCQlzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgYWNjdW1fc3RhdGlzdGljczsKLQkJCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyBkZWx0YV9zdGF0aXN0aWNzOwotCQkJc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIG1heF9kZWx0YTsKLSNlbmRpZgotCi0JCX0gXzQ5NjU7Ci0jZW5kaWYKLQl9OwotCi0Jc3RydWN0IGl3bF9od19wYXJhbXMgaHdfcGFyYW1zOwotCi0JdTMyIGludGFfbWFzazsKLQotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzdGFydDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2Nhbl9jb21wbGV0ZWQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHJ4X3JlcGxlbmlzaDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWJvcnRfc2NhbjsKLQotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpiZWFjb25fY3R4OwotCXN0cnVjdCBza19idWZmICpiZWFjb25fc2tiOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0IHR4X2ZsdXNoOwotCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90YXNrbGV0OwotCi0Jc3RydWN0IGRlbGF5ZWRfd29yayBpbml0X2FsaXZlX3N0YXJ0OwotCXN0cnVjdCBkZWxheWVkX3dvcmsgYWxpdmVfc3RhcnQ7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBzY2FuX2NoZWNrOwotCi0JLyogVFggUG93ZXIgKi8KLQlzOCB0eF9wb3dlcl91c2VyX2xtdDsKLQlzOCB0eF9wb3dlcl9kZXZpY2VfbG10OwotCXM4IHR4X3Bvd2VyX25leHQ7Ci0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCS8qIGRlYnVnZ2luZyBpbmZvICovCi0JdTMyIGRlYnVnX2xldmVsOyAvKiBwZXIgZGV2aWNlIGRlYnVnZ2luZyB3aWxsIG92ZXJyaWRlIGdsb2JhbAotCQkJICAgIGl3bGVnYWN5X2RlYnVnX2xldmVsIGlmIHNldCAqLwotI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRyAqLwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JLyogZGVidWdmcyAqLwotCXUxNiB0eF90cmFmZmljX2lkeDsKLQl1MTYgcnhfdHJhZmZpY19pZHg7Ci0JdTggKnR4X3RyYWZmaWM7Ci0JdTggKnJ4X3RyYWZmaWM7Ci0Jc3RydWN0IGRlbnRyeSAqZGVidWdmc19kaXI7Ci0JdTMyIGRiZ2ZzX3NyYW1fb2Zmc2V0LCBkYmdmc19zcmFtX2xlbjsKLQlib29sIGRpc2FibGVfaHQ0MDsKLSNlbmRpZiAvKiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUyAqLwotCi0Jc3RydWN0IHdvcmtfc3RydWN0IHR4cG93ZXJfd29yazsKLQl1MzIgZGlzYWJsZV9zZW5zX2NhbDsKLQl1MzIgZGlzYWJsZV9jaGFpbl9ub2lzZV9jYWw7Ci0JdTMyIGRpc2FibGVfdHhfcG93ZXJfY2FsOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBydW5fdGltZV9jYWxpYl93b3JrOwotCXN0cnVjdCB0aW1lcl9saXN0IHN0YXRpc3RpY3NfcGVyaW9kaWM7Ci0Jc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2c7Ci0JYm9vbCBod19yZWFkeTsKLQotCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkOwotCXVuc2lnbmVkIGxvbmcgYmxpbmtfb24sIGJsaW5rX29mZjsKLQlib29sIGxlZF9yZWdpc3RlcmVkOwotfTsgLyppd2xfcHJpdiAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX3R4cV9jdHhfYWN0aXZhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKQotewotCXNldF9iaXQodHhxX2lkLCAmcHJpdi0+dHhxX2N0eF9hY3RpdmVfbXNrKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF90eHFfY3R4X2RlYWN0aXZhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKQotewotCWNsZWFyX2JpdCh0eHFfaWQsICZwcml2LT50eHFfY3R4X2FjdGl2ZV9tc2spOwotfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0vKgotICogaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWw6IFJldHVybiBhY3RpdmUgZGVidWcgbGV2ZWwgZm9yIGRldmljZQotICoKLSAqIFVzaW5nIHN5c2ZzIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBwZXIgZGV2aWNlIGRlYnVnIGxldmVsLiBUaGlzIGRlYnVnCi0gKiBsZXZlbCB3aWxsIGJlIHVzZWQgaWYgc2V0LCBvdGhlcndpc2UgdGhlIGdsb2JhbCBkZWJ1ZyBsZXZlbCB3aGljaCBjYW4gYmUKLSAqIHNldCB2aWEgbW9kdWxlIHBhcmFtZXRlciBpcyB1c2VkLgotICovCi1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKHByaXYtPmRlYnVnX2xldmVsKQotCQlyZXR1cm4gcHJpdi0+ZGVidWdfbGV2ZWw7Ci0JZWxzZQotCQlyZXR1cm4gaXdsZWdhY3lfZGVidWdfbGV2ZWw7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB1MzIgaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBpd2xlZ2FjeV9kZWJ1Z19sZXZlbDsKLX0KLSNlbmRpZgotCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9oZHIgKgotaXdsX2xlZ2FjeV90eF9xdWV1ZV9nZXRfaGRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJCSBpbnQgdHhxX2lkLCBpbnQgaWR4KQotewotCWlmIChwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2IpCi0JCXJldHVybiAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwcml2LT50eHFbdHhxX2lkXS4KLQkJCQl0eGJbaWR4XS5za2ItPmRhdGE7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKgotaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZihzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCi0JcmV0dXJuIHZpZl9wcml2LT5jdHg7Ci19Ci0KLSNkZWZpbmUgZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpCQkJCVwKLQlmb3IgKGN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsJCVwKLQkgICAgIGN0eCA8ICZwcml2LT5jb250ZXh0c1tOVU1fSVdMX1JYT05fQ1RYXTsgY3R4KyspCVwKLQkJaWYgKHByaXYtPnZhbGlkX2NvbnRleHRzICYgQklUKGN0eC0+Y3R4aWQpKQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4aWQpCi17Ci0JcmV0dXJuIChwcml2LT5jb250ZXh0c1tjdHhpZF0uYWN0aXZlLmZpbHRlcl9mbGFncyAmCi0JCQlSWE9OX0ZJTFRFUl9BU1NPQ19NU0spID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfYW55X2Fzc29jaWF0ZWQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlyZXR1cm4gKGN0eC0+YWN0aXZlLmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSykgPyAxIDogMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQotewotCWlmIChjaF9pbmZvID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiAoY2hfaW5mby0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9WQUxJRCkgPyAxIDogMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19jaGFubmVsX3JhZGFyKGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQotewotCXJldHVybiAoY2hfaW5mby0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikgPyAxIDogMDsKLX0KLQotc3RhdGljIGlubGluZSB1OCBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQotewotCXJldHVybiBjaF9pbmZvLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pd2xfbGVnYWN5X2lzX2NoYW5uZWxfcGFzc2l2ZShjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2gpCi17Ci0JcmV0dXJuICghKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0FDVElWRSkpID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pd2xfbGVnYWN5X2lzX2NoYW5uZWxfaWJzcyhjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2gpCi17Ci0JcmV0dXJuIChjaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9JQlNTKSA/IDEgOiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JX19mcmVlX3BhZ2VzKHBhZ2UsIHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKLQlwcml2LT5hbGxvY19yeGJfcGFnZS0tOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgbG9uZyBwYWdlKQotewotCWZyZWVfcGFnZXMocGFnZSwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOwotCXByaXYtPmFsbG9jX3J4Yl9wYWdlLS07Ci19Ci0jZW5kaWYJCQkJLyogX19pd2xfbGVnYWN5X2Rldl9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXZ0cmFjZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldnRyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZWM5OTEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldnRyYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDkgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0vKiBzcGFyc2UgZG9lc24ndCBsaWtlIHRyYWNlcG9pbnQgbWFjcm9zICovCi0jaWZuZGVmIF9fQ0hFQ0tFUl9fCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotCi0jZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKLSNpbmNsdWRlICJpd2wtZGV2dHJhY2UuaCIKLQotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl9pb3dyaXRlOCk7Ci1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9sZWdhY3lfZGV2X2lvcmVhZDMyKTsKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2xlZ2FjeV9kZXZfaW93cml0ZTMyKTsKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2xlZ2FjeV9kZXZfcngpOwotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl90eCk7Ci1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9sZWdhY3lfZGV2X3Vjb2RlX2Vycm9yKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldnRyYWNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0MzcyNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDkgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmICFkZWZpbmVkKF9fSVdMV0lGSV9MRUdBQ1lfREVWSUNFX1RSQUNFKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQotI2RlZmluZSBfX0lXTFdJRklfTEVHQUNZX0RFVklDRV9UUkFDRQotCi0jaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgotCi0jaWYgIWRlZmluZWQoQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFVklDRV9UUkFDSU5HKSB8fCBkZWZpbmVkKF9fQ0hFQ0tFUl9fKQotI3VuZGVmIFRSQUNFX0VWRU5UCi0jZGVmaW5lIFRSQUNFX0VWRU5UKG5hbWUsIHByb3RvLCAuLi4pIFwKLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZV8gIyMgbmFtZShwcm90bykge30KLSNlbmRpZgotCi0KLSNkZWZpbmUgUFJJVl9FTlRSWQlfX2ZpZWxkKHN0cnVjdCBpd2xfcHJpdiAqLCBwcml2KQotI2RlZmluZSBQUklWX0FTU0lHTgkoX19lbnRyeS0+cHJpdiA9IHByaXYpCi0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGl3bHdpZmlfbGVnYWN5X2lvCi0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl9pb3JlYWQzMiwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKLQlUUF9BUkdTKHByaXYsIG9mZnMsIHZhbCksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgb2ZmcykKLQkJX19maWVsZCh1MzIsIHZhbCkKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlQUklWX0FTU0lHTjsKLQkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7Ci0JCV9fZW50cnktPnZhbCA9IHZhbDsKLQkpLAotCVRQX3ByaW50aygiWyVwXSByZWFkIGlvWyUjeF0gPSAlI3giLCBfX2VudHJ5LT5wcml2LAotCQkJCQlfX2VudHJ5LT5vZmZzLCBfX2VudHJ5LT52YWwpCi0pOwotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2xlZ2FjeV9kZXZfaW93cml0ZTgsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgb2ZmcywgdTggdmFsKSwKLQlUUF9BUkdTKHByaXYsIG9mZnMsIHZhbCksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgb2ZmcykKLQkJX19maWVsZCh1OCwgdmFsKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQlfX2VudHJ5LT5vZmZzID0gb2ZmczsKLQkJX19lbnRyeS0+dmFsID0gdmFsOwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIHdyaXRlIGlvWyUjeF0gPSAlI3gpIiwgX19lbnRyeS0+cHJpdiwKLQkJCQkJX19lbnRyeS0+b2ZmcywgX19lbnRyeS0+dmFsKQotKTsKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9sZWdhY3lfZGV2X2lvd3JpdGUzMiwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKLQlUUF9BUkdTKHByaXYsIG9mZnMsIHZhbCksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgb2ZmcykKLQkJX19maWVsZCh1MzIsIHZhbCkKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlQUklWX0FTU0lHTjsKLQkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7Ci0JCV9fZW50cnktPnZhbCA9IHZhbDsKLQkpLAotCVRQX3ByaW50aygiWyVwXSB3cml0ZSBpb1slI3hdID0gJSN4KSIsIF9fZW50cnktPnByaXYsCi0JCQkJCV9fZW50cnktPm9mZnMsIF9fZW50cnktPnZhbCkKLSk7Ci0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGl3bHdpZmlfbGVnYWN5X3Vjb2RlCi0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGl3bHdpZmkKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9sZWdhY3lfZGV2X2hjbWQsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB2b2lkICpoY21kLCBzaXplX3QgbGVuLCB1MzIgZmxhZ3MpLAotCVRQX0FSR1MocHJpdiwgaGNtZCwgbGVuLCBmbGFncyksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIGhjbWQsIGxlbikKLQkJX19maWVsZCh1MzIsIGZsYWdzKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQltZW1jcHkoX19nZXRfZHluYW1pY19hcnJheShoY21kKSwgaGNtZCwgbGVuKTsKLQkJX19lbnRyeS0+ZmxhZ3MgPSBmbGFnczsKLQkpLAotCVRQX3ByaW50aygiWyVwXSBoY21kICUjLjJ4ICglc3N5bmMpIiwKLQkJICBfX2VudHJ5LT5wcml2LCAoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShoY21kKSlbMF0sCi0JCSAgX19lbnRyeS0+ZmxhZ3MgJiBDTURfQVNZTkMgPyAiYSIgOiAiIikKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl9yeCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnJ4YnVmLCBzaXplX3QgbGVuKSwKLQlUUF9BUkdTKHByaXYsIHJ4YnVmLCBsZW4pLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCVBSSVZfRU5UUlkKLQkJX19keW5hbWljX2FycmF5KHU4LCByeGJ1ZiwgbGVuKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQltZW1jcHkoX19nZXRfZHluYW1pY19hcnJheShyeGJ1ZiksIHJ4YnVmLCBsZW4pOwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIFJYIGNtZCAlIy4yeCIsCi0JCSAgX19lbnRyeS0+cHJpdiwgKCh1OCAqKV9fZ2V0X2R5bmFtaWNfYXJyYXkocnhidWYpKVs0XSkKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl90eCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnRmZCwgc2l6ZV90IHRmZGxlbiwKLQkJIHZvaWQgKmJ1ZjAsIHNpemVfdCBidWYwX2xlbiwKLQkJIHZvaWQgKmJ1ZjEsIHNpemVfdCBidWYxX2xlbiksCi0JVFBfQVJHUyhwcml2LCB0ZmQsIHRmZGxlbiwgYnVmMCwgYnVmMF9sZW4sIGJ1ZjEsIGJ1ZjFfbGVuKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlQUklWX0VOVFJZCi0KLQkJX19maWVsZChzaXplX3QsIGZyYW1lbGVuKQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIHRmZCwgdGZkbGVuKQotCi0JCS8qCi0JCSAqIERvIG5vdCBpbnNlcnQgYmV0d2VlbiBvciBiZWxvdyB0aGVzZSBpdGVtcywKLQkJICogd2Ugd2FudCB0byBrZWVwIHRoZSBmcmFtZSB0b2dldGhlciAoZXhjZXB0Ci0JCSAqIGZvciB0aGUgcG9zc2libGUgcGFkZGluZykuCi0JCSAqLwotCQlfX2R5bmFtaWNfYXJyYXkodTgsIGJ1ZjAsIGJ1ZjBfbGVuKQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIGJ1ZjEsIGJ1ZjFfbGVuKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQlfX2VudHJ5LT5mcmFtZWxlbiA9IGJ1ZjBfbGVuICsgYnVmMV9sZW47Ci0JCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KHRmZCksIHRmZCwgdGZkbGVuKTsKLQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMCksIGJ1ZjAsIGJ1ZjBfbGVuKTsKLQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMSksIGJ1ZjEsIGJ1ZjFfbGVuKTsKLQkpLAotCVRQX3ByaW50aygiWyVwXSBUWCAlLjJ4ICglenUgYnl0ZXMpIiwKLQkJICBfX2VudHJ5LT5wcml2LAotCQkgICgodTggKilfX2dldF9keW5hbWljX2FycmF5KGJ1ZjApKVswXSwKLQkJICBfX2VudHJ5LT5mcmFtZWxlbikKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV9lcnJvciwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBkZXNjLCB1MzIgdGltZSwKLQkJIHUzMiBkYXRhMSwgdTMyIGRhdGEyLCB1MzIgbGluZSwgdTMyIGJsaW5rMSwKLQkJIHUzMiBibGluazIsIHUzMiBpbGluazEsIHUzMiBpbGluazIpLAotCVRQX0FSR1MocHJpdiwgZGVzYywgdGltZSwgZGF0YTEsIGRhdGEyLCBsaW5lLAotCQlibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazIpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCVBSSVZfRU5UUlkKLQkJX19maWVsZCh1MzIsIGRlc2MpCi0JCV9fZmllbGQodTMyLCB0aW1lKQotCQlfX2ZpZWxkKHUzMiwgZGF0YTEpCi0JCV9fZmllbGQodTMyLCBkYXRhMikKLQkJX19maWVsZCh1MzIsIGxpbmUpCi0JCV9fZmllbGQodTMyLCBibGluazEpCi0JCV9fZmllbGQodTMyLCBibGluazIpCi0JCV9fZmllbGQodTMyLCBpbGluazEpCi0JCV9fZmllbGQodTMyLCBpbGluazIpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJUFJJVl9BU1NJR047Ci0JCV9fZW50cnktPmRlc2MgPSBkZXNjOwotCQlfX2VudHJ5LT50aW1lID0gdGltZTsKLQkJX19lbnRyeS0+ZGF0YTEgPSBkYXRhMTsKLQkJX19lbnRyeS0+ZGF0YTIgPSBkYXRhMjsKLQkJX19lbnRyeS0+bGluZSA9IGxpbmU7Ci0JCV9fZW50cnktPmJsaW5rMSA9IGJsaW5rMTsKLQkJX19lbnRyeS0+YmxpbmsyID0gYmxpbmsyOwotCQlfX2VudHJ5LT5pbGluazEgPSBpbGluazE7Ci0JCV9fZW50cnktPmlsaW5rMiA9IGlsaW5rMjsKLQkpLAotCVRQX3ByaW50aygiWyVwXSAjJTAyZCAlMDEwdSBkYXRhIDB4JTA4WCAweCUwOFggbGluZSAldSwgIgotCQkgICJibGluayAweCUwNVggMHglMDVYIGlsaW5rIDB4JTA1WCAweCUwNVgiLAotCQkgIF9fZW50cnktPnByaXYsIF9fZW50cnktPmRlc2MsIF9fZW50cnktPnRpbWUsIF9fZW50cnktPmRhdGExLAotCQkgIF9fZW50cnktPmRhdGEyLCBfX2VudHJ5LT5saW5lLCBfX2VudHJ5LT5ibGluazEsCi0JCSAgX19lbnRyeS0+YmxpbmsyLCBfX2VudHJ5LT5pbGluazEsIF9fZW50cnktPmlsaW5rMikKLSk7Ci0KLSNlbmRpZiAvKiBfX0lXTFdJRklfREVWSUNFX1RSQUNFICovCi0KLSN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKLSNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KLSN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKLSNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIGl3bC1kZXZ0cmFjZQotI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmYzZjQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1lZXByb20uYworKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBFRVBST00gQkFORFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoZSBpd2xlZ2FjeV9lZXByb21fYmFuZCBkZWZpbml0aW9ucyBiZWxvdyBwcm92aWRlIHRoZSBtYXBwaW5nIGZyb20gdGhlCi0gKiBFRVBST00gY29udGVudHMgdG8gdGhlIHNwZWNpZmljIGNoYW5uZWwgbnVtYmVyIHN1cHBvcnRlZCBmb3IgZWFjaAotICogYmFuZC4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgaXdsX3ByaXYtPmVlcHJvbS5iYW5kXzNfY2hhbm5lbHNbNF0gZnJvbSB0aGUgYmFuZF8zCi0gKiBkZWZpbml0aW9uIGJlbG93IG1hcHMgdG8gcGh5c2ljYWwgY2hhbm5lbCA0MiBpbiB0aGUgNS4yR0h6IHNwZWN0cnVtLgotICogVGhlIHNwZWNpZmljIGdlb2dyYXBoeSBhbmQgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoYXQgY2hhbm5lbAotICogaXMgY29udGFpbmVkIGluIHRoZSBlZXByb20gbWFwIGl0c2VsZi4KLSAqCi0gKiBEdXJpbmcgaW5pdCwgd2UgY29weSB0aGUgZWVwcm9tIGluZm9ybWF0aW9uIGFuZCBjaGFubmVsIG1hcAotICogaW5mb3JtYXRpb24gaW50byBwcml2LT5jaGFubmVsX2luZm9fMjQvNTIgYW5kIHByaXYtPmNoYW5uZWxfbWFwXzI0LzUyCi0gKgotICogY2hhbm5lbF9tYXBfMjQvNTIgcHJvdmlkZXMgdGhlIGluZGV4IGluIHRoZSBjaGFubmVsX2luZm8gYXJyYXkgZm9yIGEKLSAqIGdpdmVuIGNoYW5uZWwuICBXZSBoYXZlIHRvIGhhdmUgdHdvIHNlcGFyYXRlIG1hcHMgYXMgdGhlcmUgaXMgY2hhbm5lbAotICogb3ZlcmxhcCB3aXRoIHRoZSAyLjRHSHogYW5kIDUuMkdIeiBzcGVjdHJ1bSBhcyBzZWVuIGluIGJhbmRfMSBhbmQKLSAqIGJhbmRfMgotICoKLSAqIEEgdmFsdWUgb2YgMHhmZiBzdG9yZWQgaW4gdGhlIGNoYW5uZWxfbWFwIGluZGljYXRlcyB0aGF0IHRoZSBjaGFubmVsCi0gKiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSBhdCBhbGwuCi0gKgotICogQSB2YWx1ZSBvZiAweGZlIGluIHRoZSBjaGFubmVsX21hcCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hhbm5lbCBpcyBub3QKLSAqIHZhbGlkIGZvciBUeCB3aXRoIHRoZSBjdXJyZW50IGhhcmR3YXJlLiAgVGhpcyBtZWFucyB0aGF0Ci0gKiB3aGlsZSB0aGUgc3lzdGVtIGNhbiB0dW5lIGFuZCByZWNlaXZlIG9uIGEgZ2l2ZW4gY2hhbm5lbCwgaXQgbWF5IG5vdAotICogYmUgYWJsZSB0byBhc3NvY2lhdGUgb3IgdHJhbnNtaXQgYW55IGZyYW1lcyBvbiB0aGF0Ci0gKiBjaGFubmVsLiAgVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uIGZvciB0aGF0Ci0gKiBlbnRyeS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAyLjQgR0h6ICovCi1jb25zdCB1OCBpd2xlZ2FjeV9lZXByb21fYmFuZF8xWzE0XSA9IHsKLQkxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKLX07Ci0KLS8qIDUuMiBHSHogYmFuZHMgKi8KLXN0YXRpYyBjb25zdCB1OCBpd2xlZ2FjeV9lZXByb21fYmFuZF8yW10gPSB7CS8qIDQ5MTUtNTA4ME1IeiAqLwotCTE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODksIDE5MiwgMTk2LCA3LCA4LCAxMSwgMTIsIDE2Ci19OwotCi1zdGF0aWMgY29uc3QgdTggaXdsZWdhY3lfZWVwcm9tX2JhbmRfM1tdID0gewkvKiA1MTcwLTUzMjBNSHogKi8KLQkzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUyLCA1NiwgNjAsIDY0Ci19OwotCi1zdGF0aWMgY29uc3QgdTggaXdsZWdhY3lfZWVwcm9tX2JhbmRfNFtdID0gewkvKiA1NTAwLTU3MDBNSHogKi8KLQkxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAotfTsKLQotc3RhdGljIGNvbnN0IHU4IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzVbXSA9IHsJLyogNTcyNS01ODI1TUh6ICovCi0JMTQ1LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotfTsKLQotc3RhdGljIGNvbnN0IHU4IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzZbXSA9IHsgICAgICAgLyogMi40IGh0NDAgY2hhbm5lbCAqLwotCTEsIDIsIDMsIDQsIDUsIDYsIDcKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCBpd2xlZ2FjeV9lZXByb21fYmFuZF83W10gPSB7ICAgICAgIC8qIDUuMiBodDQwIGNoYW5uZWwgKi8KLQkzNiwgNDQsIDUyLCA2MCwgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzIsIDE0OSwgMTU3Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRUVQUk9NIHJlbGF0ZWQgZnVuY3Rpb25zCi0gKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfZWVwcm9tX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBncCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0VFUFJPTV9HUCkgJiBDU1JfRUVQUk9NX0dQX1ZBTElEX01TSzsKLQlpbnQgcmV0ID0gMDsKLQotCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIkVFUFJPTSBzaWduYXR1cmU9MHglMDh4XG4iLCBncCk7Ci0Jc3dpdGNoIChncCkgewotCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTEVTU19USEFOXzRLOgotCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTU9SRV9USEFOXzRLOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJiYWQgRUVQUk9NIHNpZ25hdHVyZSwiCi0JCQkiRUVQUk9NX0dQPTB4JTA4eFxuIiwgZ3ApOwotCQlyZXQgPSAtRU5PRU5UOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotY29uc3QgdTgKLSppd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCkKLXsKLQlCVUdfT04ob2Zmc2V0ID49IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplKTsKLQlyZXR1cm4gJnByaXYtPmVlcHJvbVtvZmZzZXRdOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKTsKLQotdTE2IGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCBzaXplX3Qgb2Zmc2V0KQotewotCWlmICghcHJpdi0+ZWVwcm9tKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gKHUxNilwcml2LT5lZXByb21bb2Zmc2V0XSB8ICgodTE2KXByaXYtPmVlcHJvbVtvZmZzZXQgKyAxXSA8PCA4KTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9lZXByb21fcXVlcnkxNik7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9lZXByb21faW5pdCAtIHJlYWQgRUVQUk9NIGNvbnRlbnRzCi0gKgotICogTG9hZCB0aGUgRUVQUk9NIGNvbnRlbnRzIGZyb20gYWRhcHRlciBpbnRvIHByaXYtPmVlcHJvbQotICoKLSAqIE5PVEU6ICBUaGlzIHJvdXRpbmUgdXNlcyB0aGUgbm9uLWRlYnVnIElPIGFjY2VzcyBmdW5jdGlvbnMuCi0gKi8KLWludCBpd2xfbGVnYWN5X2VlcHJvbV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfX2xlMTYgKmU7Ci0JdTMyIGdwID0gaXdsX3JlYWQzMihwcml2LCBDU1JfRUVQUk9NX0dQKTsKLQlpbnQgc3o7Ci0JaW50IHJldDsKLQl1MTYgYWRkcjsKLQotCS8qIGFsbG9jYXRlIGVlcHJvbSAqLwotCXN6ID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemU7Ci0JSVdMX0RFQlVHX0VFUFJPTShwcml2LCAiTlZNIHNpemUgPSAlZFxuIiwgc3opOwotCXByaXYtPmVlcHJvbSA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+ZWVwcm9tKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gYWxsb2NfZXJyOwotCX0KLQllID0gKF9fbGUxNiAqKXByaXYtPmVlcHJvbTsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuaW5pdChwcml2KTsKLQotCXJldCA9IGl3bF9sZWdhY3lfZWVwcm9tX3ZlcmlmeV9zaWduYXR1cmUocHJpdik7Ci0JaWYgKHJldCA8IDApIHsKLQkJSVdMX0VSUihwcml2LCAiRUVQUk9NIG5vdCBmb3VuZCwgRUVQUk9NX0dQPTB4JTA4eFxuIiwgZ3ApOwotCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBNYWtlIHN1cmUgZHJpdmVyIChpbnN0ZWFkIG9mIHVDb2RlKSBpcyBhbGxvd2VkIHRvIHJlYWQgRUVQUk9NICovCi0JcmV0ID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5hY3F1aXJlX3NlbWFwaG9yZShwcml2KTsKLQlpZiAocmV0IDwgMCkgewotCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gYWNxdWlyZSBFRVBST00gc2VtYXBob3JlLlxuIik7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIGVlcHJvbSBpcyBhbiBhcnJheSBvZiAxNmJpdCB2YWx1ZXMgKi8KLQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgc3o7IGFkZHIgKz0gc2l6ZW9mKHUxNikpIHsKLQkJdTMyIHI7Ci0KLQkJX2l3bF9sZWdhY3lfd3JpdGUzMihwcml2LCBDU1JfRUVQUk9NX1JFRywKLQkJCSAgICAgQ1NSX0VFUFJPTV9SRUdfTVNLX0FERFIgJiAoYWRkciA8PCAxKSk7Ci0KLQkJcmV0ID0gaXdsX3BvbGxfYml0KHByaXYsIENTUl9FRVBST01fUkVHLAotCQkJCQkgIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLLAotCQkJCQkgIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLLAotCQkJCQkgIElXTF9FRVBST01fQUNDRVNTX1RJTUVPVVQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJSVdMX0VSUihwcml2LCAiVGltZSBvdXQgcmVhZGluZyBFRVBST01bJWRdXG4iLAotCQkJCQkJCWFkZHIpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXIgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIENTUl9FRVBST01fUkVHKTsKLQkJZVthZGRyIC8gMl0gPSBjcHVfdG9fbGUxNihyID4+IDE2KTsKLQl9Ci0KLQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJOVk0gVHlwZTogJXMsIHZlcnNpb246IDB4JXhcbiIsCi0JCSAgICAgICAiRUVQUk9NIiwKLQkJICAgICAgIGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1ZFUlNJT04pKTsKLQotCXJldCA9IDA7Ci1kb25lOgotCXByaXYtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVsZWFzZV9zZW1hcGhvcmUocHJpdik7Ci0KLWVycjoKLQlpZiAocmV0KQotCQlpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKHByaXYpOwotCS8qIFJlc2V0IGNoaXAgdG8gc2F2ZSBwb3dlciB1bnRpbCB3ZSBsb2FkIHVDb2RlIGR1cmluZyAidXAiLiAqLwotCWl3bF9sZWdhY3lfYXBtX3N0b3AocHJpdik7Ci1hbGxvY19lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9lZXByb21faW5pdCk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9lZXByb21fZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Ja2ZyZWUocHJpdi0+ZWVwcm9tKTsKLQlwcml2LT5lZXByb20gPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKTsKLQotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9pbml0X2JhbmRfcmVmZXJlbmNlKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCWludCBlZXBfYmFuZCwgaW50ICplZXByb21fY2hfY291bnQsCi0JCQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICoqZWVwcm9tX2NoX2luZm8sCi0JCQljb25zdCB1OCAqKmVlcHJvbV9jaF9pbmRleCkKLXsKLQl1MzIgb2Zmc2V0ID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+Ci0JCQllZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbZWVwX2JhbmQgLSAxXTsKLQlzd2l0Y2ggKGVlcF9iYW5kKSB7Ci0JY2FzZSAxOgkJLyogMi40R0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfMSk7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfMTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgkJLyogNC45R0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfMik7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfMjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgkJLyogNS4yR0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfMyk7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfMzsKLQkJYnJlYWs7Ci0JY2FzZSA0OgkJLyogNS41R0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfNCk7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfNDsKLQkJYnJlYWs7Ci0JY2FzZSA1OgkJLyogNS43R0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfNSk7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfNTsKLQkJYnJlYWs7Ci0JY2FzZSA2OgkJLyogMi40R0h6IGh0NDAgY2hhbm5lbHMgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfNik7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfNjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgkJLyogNSBHSHogaHQ0MCBjaGFubmVscyAqLwotCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF83KTsKLQkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7Ci0JCSplZXByb21fY2hfaW5kZXggPSBpd2xlZ2FjeV9lZXByb21fYmFuZF83OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci19Ci0KLSNkZWZpbmUgQ0hFQ0tfQU5EX1BSSU5UKHgpICgoZWVwcm9tX2NoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMXyMjeCkgXAotCQkJICAgID8gIyB4ICIgIiA6ICIiKQotLyoqCi0gKiBpd2xfbGVnYWN5X21vZF9odDQwX2NoYW5faW5mbyAtIENvcHkgaHQ0MCBjaGFubmVsIGluZm8gaW50byBkcml2ZXIncyBwcml2LgotICoKLSAqIERvZXMgbm90IHNldCB1cCBhIGNvbW1hbmQsIG9yIHRvdWNoIGhhcmR3YXJlLgotICovCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfbW9kX2h0NDBfY2hhbl9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgdTE2IGNoYW5uZWwsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICplZXByb21fY2gsCi0JCQkgICAgICB1OCBjbGVhcl9odDQwX2V4dGVuc2lvbl9jaGFubmVsKQotewotCXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCi0JY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqKQotCQkJaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGJhbmQsIGNoYW5uZWwpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpCi0JCXJldHVybiAtMTsKLQotCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIkhUNDAgQ2guICVkIFslc0dIel0gJXMlcyVzJXMlcygweCUwMnggJWRkQm0pOiIKLQkJCSIgQWQtSG9jICVzc3VwcG9ydGVkXG4iLAotCQkJY2hfaW5mby0+Y2hhbm5lbCwKLQkJCWl3bF9sZWdhY3lfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbykgPwotCQkJIjUuMiIgOiAiMi40IiwKLQkJCUNIRUNLX0FORF9QUklOVChJQlNTKSwKLQkJCUNIRUNLX0FORF9QUklOVChBQ1RJVkUpLAotCQkJQ0hFQ0tfQU5EX1BSSU5UKFJBREFSKSwKLQkJCUNIRUNLX0FORF9QUklOVChXSURFKSwKLQkJCUNIRUNLX0FORF9QUklOVChERlMpLAotCQkJZWVwcm9tX2NoLT5mbGFncywKLQkJCWVlcHJvbV9jaC0+bWF4X3Bvd2VyX2F2ZywKLQkJCSgoZWVwcm9tX2NoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpCi0JCQkgJiYgIShlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfUkFEQVIpKSA/Ci0JCQkiIiA6ICJub3QgIik7Ci0KLQljaF9pbmZvLT5odDQwX2VlcHJvbSA9ICplZXByb21fY2g7Ci0JY2hfaW5mby0+aHQ0MF9tYXhfcG93ZXJfYXZnID0gZWVwcm9tX2NoLT5tYXhfcG93ZXJfYXZnOwotCWNoX2luZm8tPmh0NDBfZmxhZ3MgPSBlZXByb21fY2gtPmZsYWdzOwotCWlmIChlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfVkFMSUQpCi0JCWNoX2luZm8tPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgJj0KLQkJCQkJfmNsZWFyX2h0NDBfZXh0ZW5zaW9uX2NoYW5uZWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBDSEVDS19BTkRfUFJJTlRfSSh4KSAoKGVlcHJvbV9jaF9pbmZvW2NoXS5mbGFncyAmIEVFUFJPTV9DSEFOTkVMXyMjeCkgXAotCQkJICAgID8gIyB4ICIgIiA6ICIiKQotCi0vKioKLSAqIGl3bF9sZWdhY3lfaW5pdF9jaGFubmVsX21hcCAtIFNldCB1cCBkcml2ZXIncyBpbmZvIGZvciBhbGwgcG9zc2libGUgY2hhbm5lbHMKLSAqLwotaW50IGl3bF9sZWdhY3lfaW5pdF9jaGFubmVsX21hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IGVlcHJvbV9jaF9jb3VudCA9IDA7Ci0JY29uc3QgdTggKmVlcHJvbV9jaF9pbmRleCA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCAqZWVwcm9tX2NoX2luZm8gPSBOVUxMOwotCWludCBiYW5kLCBjaDsKLQlzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQotCWlmIChwcml2LT5jaGFubmVsX2NvdW50KSB7Ci0JCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIkNoYW5uZWwgbWFwIGFscmVhZHkgaW5pdGlhbGl6ZWQuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0RFQlVHX0VFUFJPTShwcml2LCAiSW5pdGlhbGl6aW5nIHJlZ3VsYXRvcnkgaW5mbyBmcm9tIEVFUFJPTVxuIik7Ci0KLQlwcml2LT5jaGFubmVsX2NvdW50ID0KLQkgICAgQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF8xKSArCi0JICAgIEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfMikgKwotCSAgICBBUlJBWV9TSVpFKGl3bGVnYWN5X2VlcHJvbV9iYW5kXzMpICsKLQkgICAgQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF80KSArCi0JICAgIEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfNSk7Ci0KLQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJQYXJzaW5nIGRhdGEgZm9yICVkIGNoYW5uZWxzLlxuIiwKLQkJCXByaXYtPmNoYW5uZWxfY291bnQpOwotCi0JcHJpdi0+Y2hhbm5lbF9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl3bF9jaGFubmVsX2luZm8pICoKLQkJCQkgICAgIHByaXYtPmNoYW5uZWxfY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+Y2hhbm5lbF9pbmZvKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBjaGFubmVsX2luZm9cbiIpOwotCQlwcml2LT5jaGFubmVsX2NvdW50ID0gMDsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JY2hfaW5mbyA9IHByaXYtPmNoYW5uZWxfaW5mbzsKLQotCS8qIExvb3AgdGhyb3VnaCB0aGUgNSBFRVBST00gYmFuZHMgYWRkaW5nIHRoZW0gaW4gb3JkZXIgdG8gdGhlCi0JICogY2hhbm5lbCBtYXAgd2UgbWFpbnRhaW4gKHRoYXQgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGFuCi0JICogd2hhdCBqdXN0IGluIHRoZSBFRVBST00pICovCi0JZm9yIChiYW5kID0gMTsgYmFuZCA8PSA1OyBiYW5kKyspIHsKLQotCQlpd2xfbGVnYWN5X2luaXRfYmFuZF9yZWZlcmVuY2UocHJpdiwgYmFuZCwgJmVlcHJvbV9jaF9jb3VudCwKLQkJCQkJJmVlcHJvbV9jaF9pbmZvLCAmZWVwcm9tX2NoX2luZGV4KTsKLQotCQkvKiBMb29wIHRocm91Z2ggZWFjaCBiYW5kIGFkZGluZyBlYWNoIG9mIHRoZSBjaGFubmVscyAqLwotCQlmb3IgKGNoID0gMDsgY2ggPCBlZXByb21fY2hfY291bnQ7IGNoKyspIHsKLQkJCWNoX2luZm8tPmNoYW5uZWwgPSBlZXByb21fY2hfaW5kZXhbY2hdOwotCQkJY2hfaW5mby0+YmFuZCA9IChiYW5kID09IDEpID8gSUVFRTgwMjExX0JBTkRfMkdIWiA6Ci0JCQkgICAgSUVFRTgwMjExX0JBTkRfNUdIWjsKLQotCQkJLyogcGVybWFuZW50bHkgc3RvcmUgRUVQUk9NJ3MgY2hhbm5lbCByZWd1bGF0b3J5IGZsYWdzCi0JCQkgKiAgIGFuZCBtYXggcG93ZXIgaW4gY2hhbm5lbCBpbmZvIGRhdGFiYXNlLiAqLwotCQkJY2hfaW5mby0+ZWVwcm9tID0gZWVwcm9tX2NoX2luZm9bY2hdOwotCi0JCQkvKiBDb3B5IHRoZSBydW4tdGltZSBmbGFncyBzbyB0aGV5IGFyZSB0aGVyZSBldmVuIG9uCi0JCQkgKiBpbnZhbGlkIGNoYW5uZWxzICovCi0JCQljaF9pbmZvLT5mbGFncyA9IGVlcHJvbV9jaF9pbmZvW2NoXS5mbGFnczsKLQkJCS8qIEZpcnN0IHdyaXRlIHRoYXQgaHQ0MCBpcyBub3QgZW5hYmxlZCwgYW5kIHRoZW4gZW5hYmxlCi0JCQkgKiBvbmUgYnkgb25lICovCi0JCQljaF9pbmZvLT5odDQwX2V4dGVuc2lvbl9jaGFubmVsID0KLQkJCQkJSUVFRTgwMjExX0NIQU5fTk9fSFQ0MDsKLQotCQkJaWYgKCEoaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSkgewotCQkJCUlXTF9ERUJVR19FRVBST00ocHJpdiwKLQkJCQkJICAgICAgICJDaC4gJWQgRmxhZ3MgJXggWyVzR0h6XSAtICIKLQkJCQkJICAgICAgICJObyB0cmFmZmljXG4iLAotCQkJCQkgICAgICAgY2hfaW5mby0+Y2hhbm5lbCwKLQkJCQkJICAgICAgIGNoX2luZm8tPmZsYWdzLAotCQkJCQkgICAgICAgaXdsX2xlZ2FjeV9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSA/Ci0JCQkJCSAgICAgICAiNS4yIiA6ICIyLjQiKTsKLQkJCQljaF9pbmZvKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIEluaXRpYWxpemUgcmVndWxhdG9yeS1iYXNlZCBydW4tdGltZSBkYXRhICovCi0JCQljaF9pbmZvLT5tYXhfcG93ZXJfYXZnID0gY2hfaW5mby0+Y3Vycl90eHBvdyA9Ci0JCQkgICAgZWVwcm9tX2NoX2luZm9bY2hdLm1heF9wb3dlcl9hdmc7Ci0JCQljaF9pbmZvLT5zY2FuX3Bvd2VyID0gZWVwcm9tX2NoX2luZm9bY2hdLm1heF9wb3dlcl9hdmc7Ci0JCQljaF9pbmZvLT5taW5fcG93ZXIgPSAwOwotCi0JCQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJDaC4gJWQgWyVzR0h6XSAiCi0JCQkJICAgICAgICIlcyVzJXMlcyVzJXMoMHglMDJ4ICVkZEJtKToiCi0JCQkJICAgICAgICIgQWQtSG9jICVzc3VwcG9ydGVkXG4iLAotCQkJCSAgICAgICBjaF9pbmZvLT5jaGFubmVsLAotCQkJCSAgICAgICBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pID8KLQkJCQkgICAgICAgIjUuMiIgOiAiMi40IiwKLQkJCQkgICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koVkFMSUQpLAotCQkJCSAgICAgICBDSEVDS19BTkRfUFJJTlRfSShJQlNTKSwKLQkJCQkgICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koQUNUSVZFKSwKLQkJCQkgICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koUkFEQVIpLAotCQkJCSAgICAgICBDSEVDS19BTkRfUFJJTlRfSShXSURFKSwKLQkJCQkgICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koREZTKSwKLQkJCQkgICAgICAgZWVwcm9tX2NoX2luZm9bY2hdLmZsYWdzLAotCQkJCSAgICAgICBlZXByb21fY2hfaW5mb1tjaF0ubWF4X3Bvd2VyX2F2ZywKLQkJCQkgICAgICAgKChlZXByb21fY2hfaW5mb1tjaF0uCi0JCQkJCSBmbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpCi0JCQkJCSYmICEoZWVwcm9tX2NoX2luZm9bY2hdLgotCQkJCQkgICAgIGZsYWdzICYgRUVQUk9NX0NIQU5ORUxfUkFEQVIpKQotCQkJCSAgICAgICA/ICIiIDogIm5vdCAiKTsKLQotCQkJY2hfaW5mbysrOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgaWYgd2UgZG8gaGF2ZSBIVDQwIGNoYW5uZWxzICovCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s1XSA9PQotCSAgICBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDAgJiYKLQkgICAgcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzWzZdID09Ci0JICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBUd28gYWRkaXRpb25hbCBFRVBST00gYmFuZHMgZm9yIDIuNCBhbmQgNSBHSHogSFQ0MCBjaGFubmVscyAqLwotCWZvciAoYmFuZCA9IDY7IGJhbmQgPD0gNzsgYmFuZCsrKSB7Ci0JCWVudW0gaWVlZTgwMjExX2JhbmQgaWVlZWJhbmQ7Ci0KLQkJaXdsX2xlZ2FjeV9pbml0X2JhbmRfcmVmZXJlbmNlKHByaXYsIGJhbmQsICZlZXByb21fY2hfY291bnQsCi0JCQkJCSZlZXByb21fY2hfaW5mbywgJmVlcHJvbV9jaF9pbmRleCk7Ci0KLQkJLyogRUVQUk9NIGJhbmQgNiBpcyAyLjQsIGJhbmQgNyBpcyA1IEdIeiAqLwotCQlpZWVlYmFuZCA9Ci0JCQkoYmFuZCA9PSA2KSA/IElFRUU4MDIxMV9CQU5EXzJHSFogOiBJRUVFODAyMTFfQkFORF81R0haOwotCi0JCS8qIExvb3AgdGhyb3VnaCBlYWNoIGJhbmQgYWRkaW5nIGVhY2ggb2YgdGhlIGNoYW5uZWxzICovCi0JCWZvciAoY2ggPSAwOyBjaCA8IGVlcHJvbV9jaF9jb3VudDsgY2grKykgewotCQkJLyogU2V0IHVwIGRyaXZlcidzIGluZm8gZm9yIGxvd2VyIGhhbGYgKi8KLQkJCWl3bF9sZWdhY3lfbW9kX2h0NDBfY2hhbl9pbmZvKHByaXYsIGllZWViYW5kLAotCQkJCQkJZWVwcm9tX2NoX2luZGV4W2NoXSwKLQkJCQkJCSZlZXByb21fY2hfaW5mb1tjaF0sCi0JCQkJCQlJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyk7Ci0KLQkJCS8qIFNldCB1cCBkcml2ZXIncyBpbmZvIGZvciB1cHBlciBoYWxmICovCi0JCQlpd2xfbGVnYWN5X21vZF9odDQwX2NoYW5faW5mbyhwcml2LCBpZWVlYmFuZCwKLQkJCQkJCWVlcHJvbV9jaF9pbmRleFtjaF0gKyA0LAotCQkJCQkJJmVlcHJvbV9jaF9pbmZvW2NoXSwKLQkJCQkJCUlFRUU4MDIxMV9DSEFOX05PX0hUNDBNSU5VUyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9pbml0X2NoYW5uZWxfbWFwKTsKLQotLyoKLSAqIGl3bF9sZWdhY3lfZnJlZV9jaGFubmVsX21hcCAtIHVuZG8gYWxsb2NhdGlvbnMgaW4gaXdsX2xlZ2FjeV9pbml0X2NoYW5uZWxfbWFwCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV9mcmVlX2NoYW5uZWxfbWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlrZnJlZShwcml2LT5jaGFubmVsX2luZm8pOwotCXByaXYtPmNoYW5uZWxfY291bnQgPSAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXApOwotCi0vKioKLSAqIGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyAtIEZpbmQgZHJpdmVyJ3MgcHJpdmF0ZSBjaGFubmVsIGluZm8KLSAqCi0gKiBCYXNlZCBvbiBiYW5kIGFuZCBjaGFubmVsIG51bWJlci4KLSAqLwotY29uc3Qgc3RydWN0Ci1pd2xfY2hhbm5lbF9pbmZvICppd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8oY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsIHUxNiBjaGFubmVsKQotewotCWludCBpOwotCi0Jc3dpdGNoIChiYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQlmb3IgKGkgPSAxNDsgaSA8IHByaXYtPmNoYW5uZWxfY291bnQ7IGkrKykgewotCQkJaWYgKHByaXYtPmNoYW5uZWxfaW5mb1tpXS5jaGFubmVsID09IGNoYW5uZWwpCi0JCQkJcmV0dXJuICZwcml2LT5jaGFubmVsX2luZm9baV07Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlpZiAoY2hhbm5lbCA+PSAxICYmIGNoYW5uZWwgPD0gMTQpCi0JCQlyZXR1cm4gJnByaXYtPmNoYW5uZWxfaW5mb1tjaGFubmVsIC0gMV07Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTljODEwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1lZXByb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9faXdsX2xlZ2FjeV9lZXByb21faF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9lZXByb21faF9fCi0KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotc3RydWN0IGl3bF9wcml2OwotCi0vKgotICogRUVQUk9NIGFjY2VzcyB0aW1lIHZhbHVlczoKLSAqCi0gKiBEcml2ZXIgaW5pdGlhdGVzIEVFUFJPTSByZWFkIGJ5IHdyaXRpbmcgYnl0ZSBhZGRyZXNzIDw8IDEgdG8gQ1NSX0VFUFJPTV9SRUcuCi0gKiBEcml2ZXIgdGhlbiBwb2xscyBDU1JfRUVQUk9NX1JFRyBmb3IgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0sgKDB4MSkuCi0gKiBXaGVuIHBvbGxpbmcsIHdhaXQgMTAgdVNlYyBiZXR3ZWVuIHBvbGxpbmcgbG9vcHMsIHVwIHRvIGEgbWF4aW11bSA1MDAwIHVTZWMuCi0gKiBEcml2ZXIgcmVhZHMgMTYtYml0IHZhbHVlIGZyb20gYml0cyAzMS0xNiBvZiBDU1JfRUVQUk9NX1JFRy4KLSAqLwotI2RlZmluZSBJV0xfRUVQUk9NX0FDQ0VTU19USU1FT1VUCTUwMDAgLyogdVNlYyAqLwotCi0jZGVmaW5lIElXTF9FRVBST01fU0VNX1RJTUVPVVQJCTEwICAgLyogbWljcm9zZWNvbmRzICovCi0jZGVmaW5lIElXTF9FRVBST01fU0VNX1JFVFJZX0xJTUlUCTEwMDAgLyogbnVtYmVyIG9mIGF0dGVtcHRzIChub3QgdGltZSkgKi8KLQotCi0vKgotICogUmVndWxhdG9yeSBjaGFubmVsIHVzYWdlIGZsYWdzIGluIEVFUFJPTSBzdHJ1Y3QgaXdsNDk2NV9lZXByb21fY2hhbm5lbC5mbGFncy4KLSAqCi0gKiBJQlNTIGFuZC9vciBBUCBvcGVyYXRpb24gaXMgYWxsb3dlZCAqb25seSogb24gdGhvc2UgY2hhbm5lbHMgd2l0aAotICogKFZBTElEICYmIElCU1MgJiYgQUNUSVZFICYmICFSQURBUikuICBUaGlzIHJlc3RyaWN0aW9uIGlzIGluIHBsYWNlIGJlY2F1c2UKLSAqIFJBREFSIGRldGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSA0OTY1IGRyaXZlciwgYnV0IGlzIGEKLSAqIHJlcXVpcmVtZW50IGZvciBlc3RhYmxpc2hpbmcgYSBuZXcgbmV0d29yayBmb3IgbGVnYWwgb3BlcmF0aW9uIG9uIGNoYW5uZWxzCi0gKiByZXF1aXJpbmcgUkFEQVIgZGV0ZWN0aW9uIG9yIHJlc3RyaWN0aW5nIEFDVElWRSBzY2FubmluZy4KLSAqCi0gKiBOT1RFOiAgIldJREUiIGZsYWcgZG9lcyBub3QgaW5kaWNhdGUgYW55dGhpbmcgYWJvdXQgIkhUNDAiIDQwIE1IeiBjaGFubmVscy4KLSAqICAgICAgICBJdCBvbmx5IGluZGljYXRlcyB0aGF0IDIwIE1IeiBjaGFubmVsIHVzZSBpcyBzdXBwb3J0ZWQ7IEhUNDAgY2hhbm5lbAotICogICAgICAgIHVzYWdlIGlzIGluZGljYXRlZCBieSBhIHNlcGFyYXRlIHNldCBvZiByZWd1bGF0b3J5IGZsYWdzIGZvciBlYWNoCi0gKiAgICAgICAgSFQ0MCBjaGFubmVsIHBhaXIuCi0gKgotICogTk9URTogIFVzaW5nIGEgY2hhbm5lbCBpbmFwcHJvcHJpYXRlbHkgd2lsbCByZXN1bHQgaW4gYSB1Q29kZSBlcnJvciEKLSAqLwotI2RlZmluZSBJV0xfTlVNX1RYX0NBTElCX0dST1VQUyA1Ci1lbnVtIHsKLQlFRVBST01fQ0hBTk5FTF9WQUxJRCA9ICgxIDw8IDApLAkvKiB1c2FibGUgZm9yIHRoaXMgU0tVL2dlbyAqLwotCUVFUFJPTV9DSEFOTkVMX0lCU1MgPSAoMSA8PCAxKSwJCS8qIHVzYWJsZSBhcyBhbiBJQlNTIGNoYW5uZWwgKi8KLQkvKiBCaXQgMiBSZXNlcnZlZCAqLwotCUVFUFJPTV9DSEFOTkVMX0FDVElWRSA9ICgxIDw8IDMpLAkvKiBhY3RpdmUgc2Nhbm5pbmcgYWxsb3dlZCAqLwotCUVFUFJPTV9DSEFOTkVMX1JBREFSID0gKDEgPDwgNCksCS8qIHJhZGFyIGRldGVjdGlvbiByZXF1aXJlZCAqLwotCUVFUFJPTV9DSEFOTkVMX1dJREUgPSAoMSA8PCA1KSwJCS8qIDIwIE1IeiBjaGFubmVsIG9rYXkgKi8KLQkvKiBCaXQgNiBSZXNlcnZlZCAod2FzIE5hcnJvdyBDaGFubmVsKSAqLwotCUVFUFJPTV9DSEFOTkVMX0RGUyA9ICgxIDw8IDcpLAkvKiBkeW5hbWljIGZyZXEgc2VsZWN0aW9uIGNhbmRpZGF0ZSAqLwotfTsKLQotLyogU0tVIENhcGFiaWxpdGllcyAqLwotLyogMzk0NSBvbmx5ICovCi0jZGVmaW5lIEVFUFJPTV9TS1VfQ0FQX1NXX1JGX0tJTExfRU5BQkxFICAgICAgICAgICAgICAgICgxIDw8IDApCi0jZGVmaW5lIEVFUFJPTV9TS1VfQ0FQX0hXX1JGX0tJTExfRU5BQkxFICAgICAgICAgICAgICAgICgxIDw8IDEpCi0KLS8qICpyZWd1bGF0b3J5KiBjaGFubmVsIGRhdGEgZm9ybWF0IGluIGVlcHJvbSwgb25lIGZvciBlYWNoIGNoYW5uZWwuCi0gKiBUaGVyZSBhcmUgc2VwYXJhdGUgZW50cmllcyBmb3IgSFQ0MCAoNDAgTUh6KSB2cy4gbm9ybWFsICgyMCBNSHopIGNoYW5uZWxzLiAqLwotc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCB7Ci0JdTggZmxhZ3M7CQkvKiBFRVBST01fQ0hBTk5FTF8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLwotCXM4IG1heF9wb3dlcl9hdmc7CS8qIG1heCBwb3dlciAoZEJtKSBvbiB0aGlzIGNobmwsIGxpbWl0IDMxICovCi19IF9fcGFja2VkOwotCi0vKiAzOTQ1IFNwZWNpZmljICovCi0jZGVmaW5lIEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OCSgweDJmKQotCi0vKiA0OTY1IGhhcyB0d28gcmFkaW8gdHJhbnNtaXR0ZXJzIChhbmQgMyByYWRpbyByZWNlaXZlcnMpICovCi0jZGVmaW5lIEVFUFJPTV9UWF9QT1dFUl9UWF9DSEFJTlMgICAgICAoMikKLQotLyogNDk2NSBoYXMgcm9vbSBmb3IgdXAgdG8gOCBzZXRzIG9mIHR4cG93ZXIgY2FsaWJyYXRpb24gZGF0YSAqLwotI2RlZmluZSBFRVBST01fVFhfUE9XRVJfQkFORFMgICAgICAgICAgKDgpCi0KLS8qIDQ5NjUgZmFjdG9yeSBjYWxpYnJhdGlvbiBtZWFzdXJlcyB0eHBvd2VyIGdhaW4gc2V0dGluZ3MgZm9yCi0gKiBlYWNoIG9mIDMgdGFyZ2V0IG91dHB1dCBsZXZlbHMgKi8KLSNkZWZpbmUgRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UUyAgICgzKQotCi0vKiA0OTY1IFNwZWNpZmljICovCi0vKiA0OTY1IGRyaXZlciBkb2VzIG5vdCB3b3JrIHdpdGggdHhwb3dlciBjYWxpYnJhdGlvbiB2ZXJzaW9uIDwgNSAqLwotI2RlZmluZSBFRVBST01fNDk2NV9UWF9QT1dFUl9WRVJTSU9OICAgICg1KQotI2RlZmluZSBFRVBST01fNDk2NV9FRVBST01fVkVSU0lPTgkoMHgyZikKLSNkZWZpbmUgRUVQUk9NXzQ5NjVfQ0FMSUJfVkVSU0lPTl9PRkZTRVQgICAgICAgKDIqMHhCNikgLyogMiBieXRlcyAqLwotI2RlZmluZSBFRVBST01fNDk2NV9DQUxJQl9UWFBPV0VSX09GRlNFVCAgICAgICAoMioweEU4KSAvKiA0OCAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NXzQ5NjVfQk9BUkRfUkVWSVNJT04gICAgICAgICAgICAgKDIqMHg0RikgLyogMiBieXRlcyAqLwotI2RlZmluZSBFRVBST01fNDk2NV9CT0FSRF9QQkEgICAgICAgICAgICAgICAgICAoMioweDU2KzEpIC8qIDkgYnl0ZXMgKi8KLQotLyogMi40IEdIeiAqLwotZXh0ZXJuIGNvbnN0IHU4IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzFbMTRdOwotCi0vKgotICogZmFjdG9yeSBjYWxpYnJhdGlvbiBkYXRhIGZvciBvbmUgdHhwb3dlciBsZXZlbCwgb24gb25lIGNoYW5uZWwsCi0gKiBtZWFzdXJlZCBvbiBvbmUgb2YgdGhlIDIgdHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlciBhbmQgYXNzb2NpYXRlZAotICogYW50ZW5uYSkuICBFRVBST00gY29udGFpbnM6Ci0gKgotICogMSkgIFRlbXBlcmF0dXJlIChkZWdyZWVzIENlbHNpdXMpIG9mIGRldmljZSB3aGVuIG1lYXN1cmVtZW50IHdhcyBtYWRlLgotICoKLSAqIDIpICBHYWluIHRhYmxlIGluZGV4IHVzZWQgdG8gYWNoaWV2ZSB0aGUgdGFyZ2V0IG1lYXN1cmVtZW50IHBvd2VyLgotICogICAgIFRoaXMgcmVmZXJzIHRvIHRoZSAid2VsbC1rbm93biIgZ2FpbiB0YWJsZXMgKHNlZSBpd2wtNDk2NS1ody5oKS4KLSAqCi0gKiAzKSAgQWN0dWFsIG1lYXN1cmVkIG91dHB1dCBwb3dlciwgaW4gaGFsZi1kQm0gKCIzNCIgPSAxNyBkQm0pLgotICoKLSAqIDQpICBSRiBwb3dlciBhbXBsaWZpZXIgZGV0ZWN0b3IgbGV2ZWwgbWVhc3VyZW1lbnQgKG5vdCB1c2VkKS4KLSAqLwotc3RydWN0IGl3bF9lZXByb21fY2FsaWJfbWVhc3VyZSB7Ci0JdTggdGVtcGVyYXR1cmU7CQkvKiBEZXZpY2UgdGVtcGVyYXR1cmUgKENlbHNpdXMpICovCi0JdTggZ2Fpbl9pZHg7CQkvKiBJbmRleCBpbnRvIGdhaW4gdGFibGUgKi8KLQl1OCBhY3R1YWxfcG93OwkJLyogTWVhc3VyZWQgUkYgb3V0cHV0IHBvd2VyLCBoYWxmLWRCbSAqLwotCXM4IHBhX2RldDsJCS8qIFBvd2VyIGFtcCBkZXRlY3RvciBsZXZlbCAobm90IHVzZWQpICovCi19IF9fcGFja2VkOwotCi0KLS8qCi0gKiBtZWFzdXJlbWVudCBzZXQgZm9yIG9uZSBjaGFubmVsLiAgRUVQUk9NIGNvbnRhaW5zOgotICoKLSAqIDEpICBDaGFubmVsIG51bWJlciBtZWFzdXJlZAotICoKLSAqIDIpICBNZWFzdXJlbWVudHMgZm9yIGVhY2ggb2YgMyBwb3dlciBsZXZlbHMgZm9yIGVhY2ggb2YgMiByYWRpbyB0cmFuc21pdHRlcnMKLSAqICAgICAoYS5rLmEuICJ0eCBjaGFpbnMiKSAoNiBtZWFzdXJlbWVudHMgYWx0b2dldGhlcikKLSAqLwotc3RydWN0IGl3bF9lZXByb21fY2FsaWJfY2hfaW5mbyB7Ci0JdTggY2hfbnVtOwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX21lYXN1cmUKLQkJbWVhc3VyZW1lbnRzW0VFUFJPTV9UWF9QT1dFUl9UWF9DSEFJTlNdCi0JCQlbRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UU107Ci19IF9fcGFja2VkOwotCi0vKgotICogdHhwb3dlciBzdWJiYW5kIGluZm8uCi0gKgotICogRm9yIGVhY2ggZnJlcXVlbmN5IHN1YmJhbmQsIEVFUFJPTSBjb250YWlucyB0aGUgZm9sbG93aW5nOgotICoKLSAqIDEpICBGaXJzdCBhbmQgbGFzdCBjaGFubmVscyB3aXRoaW4gcmFuZ2Ugb2YgdGhlIHN1YmJhbmQuICAiMCIgdmFsdWVzCi0gKiAgICAgaW5kaWNhdGUgdGhhdCB0aGlzIHNhbXBsZSBzZXQgaXMgbm90IGJlaW5nIHVzZWQuCi0gKgotICogMikgIFNhbXBsZSBtZWFzdXJlbWVudCBzZXRzIGZvciAyIGNoYW5uZWxzIGNsb3NlIHRvIHRoZSByYW5nZSBlbmRwb2ludHMuCi0gKi8KLXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX3N1YmJhbmRfaW5mbyB7Ci0JdTggY2hfZnJvbTsJLyogY2hhbm5lbCBudW1iZXIgb2YgbG93ZXN0IGNoYW5uZWwgaW4gc3ViYmFuZCAqLwotCXU4IGNoX3RvOwkvKiBjaGFubmVsIG51bWJlciBvZiBoaWdoZXN0IGNoYW5uZWwgaW4gc3ViYmFuZCAqLwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2NoX2luZm8gY2gxOwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2NoX2luZm8gY2gyOwotfSBfX3BhY2tlZDsKLQotCi0vKgotICogdHhwb3dlciBjYWxpYnJhdGlvbiBpbmZvLiAgRUVQUk9NIGNvbnRhaW5zOgotICoKLSAqIDEpICBGYWN0b3J5LW1lYXN1cmVkIHNhdHVyYXRpb24gcG93ZXIgbGV2ZWxzIChtYXhpbXVtIGxldmVscyBhdCB3aGljaAotICogICAgIHR4IHBvd2VyIGFtcGxpZmllciBjYW4gb3V0cHV0IGEgc2lnbmFsIHdpdGhvdXQgdG9vIG11Y2ggZGlzdG9ydGlvbikuCi0gKiAgICAgVGhlcmUgaXMgb25lIGxldmVsIGZvciAyLjQgR0h6IGJhbmQgYW5kIG9uZSBmb3IgNSBHSHogYmFuZC4gIFRoZXNlCi0gKiAgICAgdmFsdWVzIGFwcGx5IHRvIGFsbCBjaGFubmVscyB3aXRoaW4gZWFjaCBvZiB0aGUgYmFuZHMuCi0gKgotICogMikgIEZhY3RvcnktbWVhc3VyZWQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgbGV2ZWwuICBUaGlzIGlzIGFzc3VtZWQgdG8gYmUKLSAqICAgICBjb25zdGFudCAoaS5lLiBzYW1lIHZhbHVlIGFwcGxpZXMgdG8gYWxsIGNoYW5uZWxzL2JhbmRzKSB3aGlsZSB0aGUKLSAqICAgICBmYWN0b3J5IG1lYXN1cmVtZW50cyBhcmUgYmVpbmcgbWFkZS4KLSAqCi0gKiAzKSAgVXAgdG8gOCBzZXRzIG9mIGZhY3RvcnktbWVhc3VyZWQgdHhwb3dlciBjYWxpYnJhdGlvbiB2YWx1ZXMuCi0gKiAgICAgVGhlc2UgYXJlIGZvciBkaWZmZXJlbnQgZnJlcXVlbmN5IHJhbmdlcywgc2luY2UgdHhwb3dlciBnYWluCi0gKiAgICAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBhbmFsb2cgcmFkaW8gY2lyY3VpdHJ5IHZhcnkgd2l0aCBmcmVxdWVuY3kuCi0gKgotICogICAgIE5vdCBhbGwgc2V0cyBuZWVkIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGE7Ci0gKiAgICAgc3RydWN0IGl3bF9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvIGNvbnRhaW5zIHJhbmdlIG9mIGNoYW5uZWxzCi0gKiAgICAgKDAgaWYgdW51c2VkKSBmb3IgZWFjaCBzZXQgb2YgZGF0YS4KLSAqLwotc3RydWN0IGl3bF9lZXByb21fY2FsaWJfaW5mbyB7Ci0JdTggc2F0dXJhdGlvbl9wb3dlcjI0OwkvKiBoYWxmLWRCbSAoZS5nLiAiMzQiID0gMTcgZEJtKSAqLwotCXU4IHNhdHVyYXRpb25fcG93ZXI1MjsJLyogaGFsZi1kQm0gKi8KLQlfX2xlMTYgdm9sdGFnZTsJCS8qIHNpZ25lZCAqLwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX3N1YmJhbmRfaW5mbwotCQliYW5kX2luZm9bRUVQUk9NX1RYX1BPV0VSX0JBTkRTXTsKLX0gX19wYWNrZWQ7Ci0KLQotLyogR2VuZXJhbCAqLwotI2RlZmluZSBFRVBST01fREVWSUNFX0lEICAgICAgICAgICAgICAgICAgICAoMioweDA4KQkvKiAyIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICgyKjB4MTUpCS8qIDYgIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV9CT0FSRF9SRVZJU0lPTiAgICAgICAgICAgICAgICgyKjB4MzUpCS8qIDIgIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV9CT0FSRF9QQkFfTlVNQkVSICAgICAgICAgICAgICgyKjB4M0IrMSkJLyogOSAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgKDIqMHg0NCkJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1NLVV9DQVAgICAgICAgICAgICAgICAgICAgICAgKDIqMHg0NSkJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX09FTV9NT0RFICAgICAgICAgICAgICAgICAgICAgKDIqMHg0NikJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1dPV0xBTl9NT0RFICAgICAgICAgICAgICAgICAgKDIqMHg0NykJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JBRElPX0NPTkZJRyAgICAgICAgICAgICAgICAgKDIqMHg0OCkJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX05VTV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgKDIqMHg0QykJLyogMiAgYnl0ZXMgKi8KLQotLyogVGhlIGZvbGxvd2luZyBtYXNrcyBhcmUgdG8gYmUgYXBwbGllZCBvbiBFRVBST01fUkFESU9fQ09ORklHICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfVFlQRV9NU0soeCkgICAoeCAmIDB4MykgICAgICAgICAvKiBiaXRzIDAtMSAgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfU1RFUF9NU0soeCkgICAoKHggPj4gMikgICYgMHgzKSAvKiBiaXRzIDItMyAgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfREFTSF9NU0soeCkgICAoKHggPj4gNCkgICYgMHgzKSAvKiBiaXRzIDQtNSAgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfUE5VTV9NU0soeCkgICAoKHggPj4gNikgICYgMHgzKSAvKiBiaXRzIDYtNyAgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfVFhfQU5UX01TSyh4KSAoKHggPj4gOCkgICYgMHhGKSAvKiBiaXRzIDgtMTEgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfUlhfQU5UX01TSyh4KSAoKHggPj4gMTIpICYgMHhGKSAvKiBiaXRzIDEyLTE1ICovCi0KLSNkZWZpbmUgRUVQUk9NXzM5NDVfUkZfQ0ZHX1RZUEVfTUFYICAweDAKLSNkZWZpbmUgRUVQUk9NXzQ5NjVfUkZfQ0ZHX1RZUEVfTUFYICAweDEKLQotLyoKLSAqIFBlci1jaGFubmVsIHJlZ3VsYXRvcnkgZGF0YS4KLSAqCi0gKiBFYWNoIGNoYW5uZWwgdGhhdCAqbWlnaHQqIGJlIHN1cHBvcnRlZCBieSBpd2wgaGFzIGEgZml4ZWQgbG9jYXRpb24KLSAqIGluIEVFUFJPTSBjb250YWluaW5nIEVFUFJPTV9DSEFOTkVMXyogdXNhZ2UgZmxhZ3MgKExTQikgYW5kIG1heCByZWd1bGF0b3J5Ci0gKiB0eHBvd2VyIChNU0IpLgotICoKLSAqIEVudHJpZXMgaW1tZWRpYXRlbHkgYmVsb3cgYXJlIGZvciAyMCBNSHogY2hhbm5lbCB3aWR0aC4gIEhUNDAgKDQwIE1IeikKLSAqIGNoYW5uZWxzIChvbmx5IGZvciA0OTY1LCBub3Qgc3VwcG9ydGVkIGJ5IDM5NDUpIGFwcGVhciBsYXRlciBpbiB0aGUgRUVQUk9NLgotICoKLSAqIDIuNCBHSHogY2hhbm5lbHMgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0Ci0gKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfU0tVX0lEICAgICAgICAgICAgKDIqMHg2MCkgICAgLyogNCAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xICAgICAgICAgICAgKDIqMHg2MikJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xX0NIQU5ORUxTICAgKDIqMHg2MykJLyogMjggYnl0ZXMgKi8KLQotLyoKLSAqIDQuOSBHSHogY2hhbm5lbHMgMTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OSwgMTkyLCAxOTYsCi0gKiA1LjAgR0h6IGNoYW5uZWxzIDcsIDgsIDExLCAxMiwgMTYKLSAqICg0OTE1LTUwODBNSHopIChub25lIG9mIHRoZXNlIGlzIGV2ZXIgc3VwcG9ydGVkKQotICovCi0jZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMiAgICAgICAgICAgICgyKjB4NzEpCS8qIDIgIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMl9DSEFOTkVMUyAgICgyKjB4NzIpCS8qIDI2IGJ5dGVzICovCi0KLS8qCi0gKiA1LjIgR0h6IGNoYW5uZWxzIDM0LCAzNiwgMzgsIDQwLCA0MiwgNDQsIDQ2LCA0OCwgNTIsIDU2LCA2MCwgNjQKLSAqICg1MTcwLTUzMjBNSHopCi0gKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zICAgICAgICAgICAgKDIqMHg3RikJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zX0NIQU5ORUxTICAgKDIqMHg4MCkJLyogMjQgYnl0ZXMgKi8KLQotLyoKLSAqIDUuNSBHSHogY2hhbm5lbHMgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAKLSAqICg1NTAwLTU3MDBNSHopCi0gKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF80ICAgICAgICAgICAgKDIqMHg4QykJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF80X0NIQU5ORUxTICAgKDIqMHg4RCkJLyogMjIgYnl0ZXMgKi8KLQotLyoKLSAqIDUuNyBHSHogY2hhbm5lbHMgMTQ1LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotICogKDU3MjUtNTgyNU1IeikKLSAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzUgICAgICAgICAgICAoMioweDk4KQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzVfQ0hBTk5FTFMgICAoMioweDk5KQkvKiAxMiBieXRlcyAqLwotCi0vKgotICogMi40IEdIeiBIVDQwIGNoYW5uZWxzIDEgKDUpLCAyICg2KSwgMyAoNyksIDQgKDgpLCA1ICg5KSwgNiAoMTApLCA3ICgxMSkKLSAqCi0gKiBUaGUgY2hhbm5lbCBsaXN0ZWQgaXMgdGhlIGNlbnRlciBvZiB0aGUgbG93ZXIgMjAgTUh6IGhhbGYgb2YgdGhlIGNoYW5uZWwuCi0gKiBUaGUgb3ZlcmFsbCBjZW50ZXIgZnJlcXVlbmN5IGlzIGFjdHVhbGx5IDIgY2hhbm5lbHMgKDEwIE1IeikgYWJvdmUgdGhhdCwKLSAqIGFuZCB0aGUgdXBwZXIgaGFsZiBvZiBlYWNoIEhUNDAgY2hhbm5lbCBpcyBjZW50ZXJlZCA0IGNoYW5uZWxzICgyMCBNSHopIGF3YXkKLSAqIGZyb20gdGhlIGxvd2VyIGhhbGY7IGUuZy4gdGhlIHVwcGVyIGhhbGYgb2YgSFQ0MCBjaGFubmVsIDEgaXMgY2hhbm5lbCA1LAotICogYW5kIHRoZSBvdmVyYWxsIEhUNDAgY2hhbm5lbCB3aWR0aCBjZW50ZXJzIG9uIGNoYW5uZWwgMy4KLSAqCi0gKiBOT1RFOiAgVGhlIFJYT04gY29tbWFuZCB1c2VzIDIwIE1IeiBjaGFubmVsIG51bWJlcnMgdG8gc3BlY2lmeSB0aGUKLSAqICAgICAgICBjb250cm9sIGNoYW5uZWwgdG8gd2hpY2ggdG8gdHVuZS4gIFJYT04gYWxzbyBzcGVjaWZpZXMgd2hldGhlciB0aGUKLSAqICAgICAgICBjb250cm9sIGNoYW5uZWwgaXMgdGhlIHVwcGVyIG9yIGxvd2VyIGhhbGYgb2YgYSBIVDQwIGNoYW5uZWwuCi0gKgotICogTk9URTogIDQ5NjUgZG9lcyBub3Qgc3VwcG9ydCBIVDQwIGNoYW5uZWxzIG9uIDIuNCBHSHouCi0gKi8KLSNkZWZpbmUgRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzI0X0hUNDBfQ0hBTk5FTFMgKDIqMHhBMCkJLyogMTQgYnl0ZXMgKi8KLQotLyoKLSAqIDUuMiBHSHogSFQ0MCBjaGFubmVscyAzNiAoNDApLCA0NCAoNDgpLCA1MiAoNTYpLCA2MCAoNjQpLAotICogMTAwICgxMDQpLCAxMDggKDExMiksIDExNiAoMTIwKSwgMTI0ICgxMjgpLCAxMzIgKDEzNiksIDE0OSAoMTUzKSwgMTU3ICgxNjEpCi0gKi8KLSNkZWZpbmUgRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzUyX0hUNDBfQ0hBTk5FTFMgKDIqMHhBOCkJLyogMjIgYnl0ZXMgKi8KLQotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDAJCQkoMCkKLQotc3RydWN0IGl3bF9lZXByb21fb3BzIHsKLQljb25zdCB1MzIgcmVndWxhdG9yeV9iYW5kc1s3XTsKLQlpbnQgKCphY3F1aXJlX3NlbWFwaG9yZSkgKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0Jdm9pZCAoKnJlbGVhc2Vfc2VtYXBob3JlKSAoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLX07Ci0KLQotaW50IGl3bF9sZWdhY3lfZWVwcm9tX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9lZXByb21fZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotY29uc3QgdTggKml3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5X2FkZHIoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzaXplX3Qgb2Zmc2V0KTsKLXUxNiBpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeTE2KGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCk7Ci1pbnQgaXdsX2xlZ2FjeV9pbml0X2NoYW5uZWxfbWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bF9sZWdhY3lfZnJlZV9jaGFubmVsX21hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKml3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbygKLQkJY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsIHUxNiBjaGFubmVsKTsKLQotI2VuZGlmICAvKiBfX2l3bF9sZWdhY3lfZWVwcm9tX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWZoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZmguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2MDkxOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZmguaAorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2ZoX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfZmhfaF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRmxvdyBIYW5kbGVyIERlZmluaXRpb25zICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBUaGlzIEkvTyBhcmVhIGlzIGRpcmVjdGx5IHJlYWQvd3JpdGFibGUgYnkgZHJpdmVyIChlLmcuIExpbnV4IHVzZXMgd3JpdGVsKCkpCi0gKiBBZGRyZXNzZXMgYXJlIG9mZnNldHMgZnJvbSBkZXZpY2UncyBQQ0kgaGFyZHdhcmUgYmFzZSBhZGRyZXNzLgotICovCi0jZGVmaW5lIEZIX01FTV9MT1dFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgxMDAwKQotI2RlZmluZSBGSF9NRU1fVVBQRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MjAwMCkKLQotLyoqCi0gKiBLZWVwLVdhcm0gKEtXKSBidWZmZXIgYmFzZSBhZGRyZXNzLgotICoKLSAqIERyaXZlciBtdXN0IGFsbG9jYXRlIGEgNEtCeXRlIGJ1ZmZlciB0aGF0IGlzIHVzZWQgYnkgNDk2NSBmb3Iga2VlcGluZyB0aGUKLSAqIGhvc3QgRFJBTSBwb3dlcmVkIG9uICh2aWEgZHVtbXkgYWNjZXNzZXMgdG8gRFJBTSkgdG8gbWFpbnRhaW4gbG93LWxhdGVuY3kKLSAqIERSQU0gYWNjZXNzIHdoZW4gNDk2NSBpcyBUeGluZyBvciBSeGluZy4gIFRoZSBkdW1teSBhY2Nlc3NlcyBwcmV2ZW50IGhvc3QKLSAqIGZyb20gZ29pbmcgaW50byBhIHBvd2VyLXNhdmluZ3MgbW9kZSB0aGF0IHdvdWxkIGNhdXNlIGhpZ2hlciBEUkFNIGxhdGVuY3ksCi0gKiBhbmQgcG9zc2libGUgZGF0YSBvdmVyL3VuZGVyLXJ1bnMsIGJlZm9yZSBhbGwgVHgvUnggaXMgY29tcGxldGUuCi0gKgotICogRHJpdmVyIGxvYWRzIEZIX0tXX01FTV9BRERSX1JFRyB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDM1OjQpCi0gKiBvZiB0aGUgYnVmZmVyLCB3aGljaCBtdXN0IGJlIDRLIGFsaWduZWQuICBPbmNlIHRoaXMgaXMgc2V0IHVwLCB0aGUgNDk2NQotICogYXV0b21hdGljYWxseSBpbnZva2VzIGtlZXAtd2FybSBhY2Nlc3NlcyB3aGVuIG5vcm1hbCBhY2Nlc3NlcyBtaWdodCBub3QKLSAqIGJlIHN1ZmZpY2llbnQgdG8gbWFpbnRhaW4gZmFzdCBEUkFNIHJlc3BvbnNlLgotICoKLSAqIEJpdCBmaWVsZHM6Ci0gKiAgMzEtMDogIEtlZXAtd2FybSBidWZmZXIgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo0XSwgbXVzdCBiZSA0SyBhbGlnbmVkCi0gKi8KLSNkZWZpbmUgRkhfS1dfTUVNX0FERFJfUkVHCQkgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDk3QykKLQotCi0vKioKLSAqIFRGRCBDaXJjdWxhciBCdWZmZXJzIEJhc2UgKENCQkMpIGFkZHJlc3NlcwotICoKLSAqIDQ5NjUgaGFzIDE2IGJhc2UgcG9pbnRlciByZWdpc3RlcnMsIG9uZSBmb3IgZWFjaCBvZiAxNiBob3N0LURSQU0tcmVzaWRlbnQKLSAqIGNpcmN1bGFyIGJ1ZmZlcnMgKENCcy9xdWV1ZXMpIGNvbnRhaW5pbmcgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvcnMgKFRGRHMpCi0gKiAoc2VlIHN0cnVjdCBpd2xfdGZkX2ZyYW1lKS4gIFRoZXNlIDE2IHBvaW50ZXIgcmVnaXN0ZXJzIGFyZSBvZmZzZXQgYnkgMHgwNAotICogYnl0ZXMgZnJvbSBvbmUgYW5vdGhlci4gIEVhY2ggVEZEIGNpcmN1bGFyIGJ1ZmZlciBpbiBEUkFNIG11c3QgYmUgMjU2LWJ5dGUKLSAqIGFsaWduZWQgKGFkZHJlc3MgYml0cyAwLTcgbXVzdCBiZSAwKS4KLSAqCi0gKiBCaXQgZmllbGRzIGluIGVhY2ggcG9pbnRlciByZWdpc3RlcjoKLSAqICAyNy0wOiBURkQgQ0IgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo4XSwgbXVzdCBiZSAyNTYtYnl0ZSBhbGlnbmVkCi0gKi8KLSNkZWZpbmUgRkhfTUVNX0NCQkNfTE9XRVJfQk9VTkQgICAgICAgICAgKEZIX01FTV9MT1dFUl9CT1VORCArIDB4OUQwKQotI2RlZmluZSBGSF9NRU1fQ0JCQ19VUFBFUl9CT1VORCAgICAgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhBMTApCi0KLS8qIEZpbmQgVEZEIENCIGJhc2UgcG9pbnRlciBmb3IgZ2l2ZW4gcXVldWUgKHJhbmdlIDAtMTUpLiAqLwotI2RlZmluZSBGSF9NRU1fQ0JCQ19RVUVVRSh4KSAgKEZIX01FTV9DQkJDX0xPV0VSX0JPVU5EICsgKHgpICogMHg0KQotCi0KLS8qKgotICogUnggU1JBTSBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXJzIChSU0NTUikKLSAqCi0gKiBUaGVzZSByZWdpc3RlcnMgcHJvdmlkZSBoYW5kc2hha2UgYmV0d2VlbiBkcml2ZXIgYW5kIDQ5NjUgZm9yIHRoZSBSeCBxdWV1ZQotICogKHRoaXMgcXVldWUgaGFuZGxlcyAqYWxsKiBjb21tYW5kIHJlc3BvbnNlcywgbm90aWZpY2F0aW9ucywgUnggZGF0YSwgZXRjLgotICogc2VudCBmcm9tIDQ5NjUgdUNvZGUgdG8gaG9zdCBkcml2ZXIpLiAgVW5saWtlIFR4LCB0aGVyZSBpcyBvbmx5IG9uZSBSeAotICogcXVldWUsIGFuZCBvbmx5IG9uZSBSeCBETUEvRklGTyBjaGFubmVsLiAgQWxzbyB1bmxpa2UgVHgsIHdoaWNoIGNhbgotICogY29uY2F0ZW5hdGUgdXAgdG8gMjAgRFJBTSBidWZmZXJzIHRvIGZvcm0gYSBUeCBmcmFtZSwgZWFjaCBSZWNlaXZlIEJ1ZmZlcgotICogRGVzY3JpcHRvciAoUkJEKSBwb2ludHMgdG8gb25seSBvbmUgUnggQnVmZmVyIChSQik7IHRoZXJlIGlzIGEgMToxCi0gKiBtYXBwaW5nIGJldHdlZW4gUkJEcyBhbmQgUkJzLgotICoKLSAqIERyaXZlciBtdXN0IGFsbG9jYXRlIGhvc3QgRFJBTSBtZW1vcnkgZm9yIHRoZSBmb2xsb3dpbmcsIGFuZCBzZXQgdGhlCi0gKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGVhY2ggaW50byA0OTY1IHJlZ2lzdGVyczoKLSAqCi0gKiAxKSAgUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvciAoUkJEKSBjaXJjdWxhciBidWZmZXIgKENCKSwgdHlwaWNhbGx5IHdpdGggMjU2Ci0gKiAgICAgZW50cmllcyAoYWx0aG91Z2ggYW55IHBvd2VyIG9mIDIsIHVwIHRvIDQwOTYsIGlzIHNlbGVjdGFibGUgYnkgZHJpdmVyKS4KLSAqICAgICBFYWNoIGVudHJ5ICgxIGR3b3JkKSBwb2ludHMgdG8gYSByZWNlaXZlIGJ1ZmZlciAoUkIpIG9mIGNvbnNpc3RlbnQgc2l6ZQotICogICAgICh0eXBpY2FsbHkgNEssIGFsdGhvdWdoIDhLIG9yIDE2SyBhcmUgYWxzbyBzZWxlY3RhYmxlIGJ5IGRyaXZlcikuCi0gKiAgICAgRHJpdmVyIHNldHMgdXAgUkIgc2l6ZSBhbmQgbnVtYmVyIG9mIFJCRHMgaW4gdGhlIENCIHZpYSBSeCBjb25maWcKLSAqICAgICByZWdpc3RlciBGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLgotICoKLSAqICAgICBCaXQgZmllbGRzIHdpdGhpbiBvbmUgUkJEOgotICogICAgIDI3LTA6ICBSZWNlaXZlIEJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgWzM1OjhdLCAyNTYtYnl0ZSBhbGlnbmVkCi0gKgotICogICAgIERyaXZlciBzZXRzIHBoeXNpY2FsIGFkZHJlc3MgWzM1OjhdIG9mIGJhc2Ugb2YgUkJEIGNpcmN1bGFyIGJ1ZmZlcgotICogICAgIGludG8gRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcgWzI3OjBdLgotICoKLSAqIDIpICBSeCBzdGF0dXMgYnVmZmVyLCA4IGJ5dGVzLCBpbiB3aGljaCA0OTY1IGluZGljYXRlcyB3aGljaCBSeCBCdWZmZXJzCi0gKiAgICAgKFJCcykgaGF2ZSBiZWVuIGZpbGxlZCwgdmlhIGEgIndyaXRlIHBvaW50ZXIiLCBhY3R1YWxseSB0aGUgaW5kZXggb2YKLSAqICAgICB0aGUgUkIncyBjb3JyZXNwb25kaW5nIFJCRCB3aXRoaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlci4gIERyaXZlciBzZXRzCi0gKiAgICAgcGh5c2ljYWwgYWRkcmVzcyBbMzU6NF0gaW50byBGSF9SU0NTUl9DSE5MMF9TVFRTX1dQVFJfUkVHIFszMTowXS4KLSAqCi0gKiAgICAgQml0IGZpZWxkcyBpbiBsb3dlciBkd29yZCBvZiBSeCBzdGF0dXMgYnVmZmVyICh1cHBlciBkd29yZCBub3QgdXNlZAotICogICAgIGJ5IGRyaXZlcjsgc2VlIHN0cnVjdCBpd2w0OTY1X3NoYXJlZCwgdmFsMCk6Ci0gKiAgICAgMzEtMTI6ICBOb3QgdXNlZCBieSBkcml2ZXIKLSAqICAgICAxMS0gMDogIEluZGV4IG9mIGxhc3QgZmlsbGVkIFJ4IGJ1ZmZlciBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAoNDk2NSB3cml0ZXMsIGRyaXZlciByZWFkcyB0aGlzIHZhbHVlKQotICoKLSAqIEFzIHRoZSBkcml2ZXIgcHJlcGFyZXMgUmVjZWl2ZSBCdWZmZXJzIChSQnMpIGZvciA0OTY1IHRvIGZpbGwsIGRyaXZlciBtdXN0Ci0gKiBlbnRlciBwb2ludGVycyB0byB0aGVzZSBSQnMgaW50byBjb250aWd1b3VzIFJCRCBjaXJjdWxhciBidWZmZXIgZW50cmllcywKLSAqIGFuZCB1cGRhdGUgdGhlIDQ5NjUncyAid3JpdGUiIGluZGV4IHJlZ2lzdGVyLAotICogRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcuCi0gKgotICogVGhpcyAid3JpdGUiIGluZGV4IGNvcnJlc3BvbmRzIHRvIHRoZSAqbmV4dCogUkJEIHRoYXQgdGhlIGRyaXZlciB3aWxsIG1ha2UKLSAqIGF2YWlsYWJsZSwgaS5lLiBvbmUgUkJEIHBhc3QgdGhlIHRhaWwgb2YgdGhlIHJlYWR5LXRvLWZpbGwgUkJEcyB3aXRoaW4KLSAqIHRoZSBjaXJjdWxhciBidWZmZXIuICBUaGlzIHZhbHVlIHNob3VsZCBpbml0aWFsbHkgYmUgMCAoYmVmb3JlIHByZXBhcmluZyBhbnkKLSAqIFJCcyksIHNob3VsZCBiZSA4IGFmdGVyIHByZXBhcmluZyB0aGUgZmlyc3QgOCBSQnMgKGZvciBleGFtcGxlKSwgYW5kIG11c3QKLSAqIHdyYXAgYmFjayB0byAwIGF0IHRoZSBlbmQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciAoYnV0IGRvbid0IHdyYXAgYmVmb3JlCi0gKiAicmVhZCIgaW5kZXggaGFzIGFkdmFuY2VkIHBhc3QgMSEgIFNlZSBiZWxvdykuCi0gKiBOT1RFOiAgNDk2NSBFWFBFQ1RTIFRIRSBXUklURSBJTkRFWCBUTyBCRSBJTkNSRU1FTlRFRCBJTiBNVUxUSVBMRVMgT0YgOC4KLSAqCi0gKiBBcyB0aGUgNDk2NSBmaWxscyBSQnMgKHJlZmVyZW5jZWQgZnJvbSBjb250aWd1b3VzIFJCRHMgd2l0aGluIHRoZSBjaXJjdWxhcgotICogYnVmZmVyKSwgaXQgdXBkYXRlcyB0aGUgUnggc3RhdHVzIGJ1ZmZlciBpbiBob3N0IERSQU0sIDIpIGRlc2NyaWJlZCBhYm92ZSwKLSAqIHRvIHRlbGwgdGhlIGRyaXZlciB0aGUgaW5kZXggb2YgdGhlIGxhdGVzdCBmaWxsZWQgUkJELiAgVGhlIGRyaXZlciBtdXN0Ci0gKiByZWFkIHRoaXMgInJlYWQiIGluZGV4IGZyb20gRFJBTSBhZnRlciByZWNlaXZpbmcgYW4gUnggaW50ZXJydXB0IGZyb20gNDk2NS4KLSAqCi0gKiBUaGUgZHJpdmVyIG11c3QgYWxzbyBpbnRlcm5hbGx5IGtlZXAgdHJhY2sgb2YgYSB0aGlyZCBpbmRleCwgd2hpY2ggaXMgdGhlCi0gKiBuZXh0IFJCRCB0byBwcm9jZXNzLiAgV2hlbiByZWNlaXZpbmcgYW4gUnggaW50ZXJydXB0LCBkcml2ZXIgc2hvdWxkIHByb2Nlc3MKLSAqIGFsbCBmaWxsZWQgYnV0IHVucHJvY2Vzc2VkIFJCcyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBSQgotICogY29ycmVzcG9uZGluZyB0byB0aGUgInJlYWQiIGluZGV4LiAgRm9yIGV4YW1wbGUsIGlmICJyZWFkIiBpbmRleCBiZWNvbWVzICIxIiwKLSAqIGRyaXZlciBtYXkgcHJvY2VzcyB0aGUgUkIgcG9pbnRlZCB0byBieSBSQkQgMC4gIERlcGVuZGluZyBvbiB2b2x1bWUgb2YKLSAqIHRyYWZmaWMsIHRoZXJlIG1heSBiZSBtYW55IFJCcyB0byBwcm9jZXNzLgotICoKLSAqIElmIHJlYWQgaW5kZXggPT0gd3JpdGUgaW5kZXgsIDQ5NjUgdGhpbmtzIHRoZXJlIGlzIG5vIHJvb20gdG8gcHV0IG5ldyBkYXRhLgotICogRHVlIHRvIHRoaXMsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxsZWQgUkJzIGlzIDI1NSwgaW5zdGVhZCBvZiAyNTYuICBUbwotICogYmUgc2FmZSwgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYSBnYXAgb2YgYXQgbGVhc3QgMiBSQkRzIGJldHdlZW4gIndyaXRlIgotICogYW5kICJyZWFkIiBpbmRleGVzOyB0aGF0IGlzLCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDI1NAotICogYnVmZmVycyB3YWl0aW5nIHRvIGJlIGZpbGxlZC4KLSAqLwotI2RlZmluZSBGSF9NRU1fUlNDU1JfTE9XRVJfQk9VTkQJKEZIX01FTV9MT1dFUl9CT1VORCArIDB4QkMwKQotI2RlZmluZSBGSF9NRU1fUlNDU1JfVVBQRVJfQk9VTkQJKEZIX01FTV9MT1dFUl9CT1VORCArIDB4QzAwKQotI2RlZmluZSBGSF9NRU1fUlNDU1JfQ0hOTDAJCShGSF9NRU1fUlNDU1JfTE9XRVJfQk9VTkQpCi0KLS8qKgotICogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIDgtYnl0ZSBSeCBTdGF0dXMgYnVmZmVyLgotICogQml0IGZpZWxkczoKLSAqICAzMS0wOiBSeCBzdGF0dXMgYnVmZmVyIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBbMzU6NF0sIG11c3QgMTYtYnl0ZSBhbGlnbmVkLgotICovCi0jZGVmaW5lIEZIX1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcJKEZIX01FTV9SU0NTUl9DSE5MMCkKLQotLyoqCi0gKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgUnggQnVmZmVyIERlc2NyaXB0b3IgQ2lyY3VsYXIgQnVmZmVyLgotICogQml0IGZpZWxkczoKLSAqICAyNy0wOiAgUkJEIENEIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBbMzU6OF0sIG11c3QgYmUgMjU2LWJ5dGUgYWxpZ25lZC4KLSAqLwotI2RlZmluZSBGSF9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRwkoRkhfTUVNX1JTQ1NSX0NITkwwICsgMHgwMDQpCi0KLS8qKgotICogUnggd3JpdGUgcG9pbnRlciAoaW5kZXgsIHJlYWxseSEpLgotICogQml0IGZpZWxkczoKLSAqICAxMS0wOiAgSW5kZXggb2YgZHJpdmVyJ3MgbW9zdCByZWNlbnQgcHJlcGFyZWQtdG8tYmUtZmlsbGVkIFJCRCwgKyAxLgotICogICAgICAgICBOT1RFOiAgRm9yIDI1Ni1lbnRyeSBjaXJjdWxhciBidWZmZXIsIHVzZSBvbmx5IGJpdHMgWzc6MF0uCi0gKi8KLSNkZWZpbmUgRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcJKEZIX01FTV9SU0NTUl9DSE5MMCArIDB4MDA4KQotI2RlZmluZSBGSF9SU0NTUl9DSE5MMF9XUFRSICAgICAgICAoRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcpCi0KLQotLyoqCi0gKiBSeCBDb25maWcvU3RhdHVzIFJlZ2lzdGVycyAoUkNTUikKLSAqIFJ4IENvbmZpZyBSZWcgZm9yIGNoYW5uZWwgMCAob25seSBjaGFubmVsIHVzZWQpCi0gKgotICogRHJpdmVyIG11c3QgaW5pdGlhbGl6ZSBGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHIGFzIGZvbGxvd3MgZm9yCi0gKiBub3JtYWwgb3BlcmF0aW9uIChzZWUgYml0IGZpZWxkcykuCi0gKgotICogQ2xlYXJpbmcgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRyB0byAwIHR1cm5zIG9mZiBSeCBETUEuCi0gKiBEcml2ZXIgc2hvdWxkIHBvbGwgRkhfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRwlmb3IKLSAqIEZIX1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRSAoYml0IDI0KSBiZWZvcmUgY29udGludWluZy4KLSAqCi0gKiBCaXQgZmllbGRzOgotICogMzEtMzA6IFJ4IERNQSBjaGFubmVsIGVuYWJsZTogJzAwJyBvZmYvcGF1c2UsICcwMScgcGF1c2UgYXQgZW5kIG9mIGZyYW1lLAotICogICAgICAgICcxMCcgb3BlcmF0ZSBub3JtYWxseQotICogMjktMjQ6IHJlc2VydmVkCi0gKiAyMy0yMDogIyBSQkRzIGluIGNpcmN1bGFyIGJ1ZmZlciA9IDJedmFsdWU7IHVzZSAiOCIgZm9yIDI1NiBSQkRzIChub3JtYWwpLAotICogICAgICAgIG1pbiAiNSIgZm9yIDMyIFJCRHMsIG1heCAiMTIiIGZvciA0MDk2IFJCRHMuCi0gKiAxOS0xODogcmVzZXJ2ZWQKLSAqIDE3LTE2OiBzaXplIG9mIGVhY2ggcmVjZWl2ZSBidWZmZXI7ICcwMCcgNEsgKG5vcm1hbCksICcwMScgOEssCi0gKiAgICAgICAgJzEwJyAxMkssICcxMScgMTZLLgotICogMTUtMTQ6IHJlc2VydmVkCi0gKiAxMy0xMjogSVJRIGRlc3RpbmF0aW9uOyAnMDAnIG5vbmUsICcwMScgaG9zdCBkcml2ZXIgKG5vcm1hbCBvcGVyYXRpb24pCi0gKiAxMS0gNDogdGltZW91dCBmb3IgY2xvc2luZyBSeCBidWZmZXIgYW5kIGludGVycnVwdGluZyBob3N0ICh1bml0cyAzMiB1c2VjKQotICogICAgICAgIHR5cGljYWwgdmFsdWUgMHgxMCAoYWJvdXQgMS8yIG1zZWMpCi0gKiAgMy0gMDogcmVzZXJ2ZWQKLSAqLwotI2RlZmluZSBGSF9NRU1fUkNTUl9MT1dFUl9CT1VORCAgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEMwMCkKLSNkZWZpbmUgRkhfTUVNX1JDU1JfVVBQRVJfQk9VTkQgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhDQzApCi0jZGVmaW5lIEZIX01FTV9SQ1NSX0NITkwwICAgICAgICAgICAgKEZIX01FTV9SQ1NSX0xPV0VSX0JPVU5EKQotCi0jZGVmaW5lIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcJKEZIX01FTV9SQ1NSX0NITkwwKQotCi0jZGVmaW5lIEZIX1JDU1JfQ0hOTDBfUlhfQ09ORklHX1JCX1RJTUVPVVRfTVNLICgweDAwMDAwRkYwKSAvKiBiaXRzIDQtMTEgKi8KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfTVNLICAgKDB4MDAwMDEwMDApIC8qIGJpdHMgMTIgKi8KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfU0lOR0xFX0ZSQU1FX01TSyAoMHgwMDAwODAwMCkgLyogYml0IDE1ICovCi0jZGVmaW5lIEZIX1JDU1JfQ0hOTDBfUlhfQ09ORklHX1JCX1NJWkVfTVNLICAgKDB4MDAwMzAwMDApIC8qIGJpdHMgMTYtMTcgKi8KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfUkJEQkNfU0laRV9NU0sgKDB4MDBGMDAwMDApIC8qIGJpdHMgMjAtMjMgKi8KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfRE1BX0NITkxfRU5fTVNLICgweEMwMDAwMDAwKSAvKiBiaXRzIDMwLTMxKi8KLQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SQkRDQl9TSVpFX1BPUwkoMjApCi0jZGVmaW5lIEZIX1JDU1JfUlhfQ09ORklHX1JFR19JUlFfUkJUSF9QT1MJKDQpCi0jZGVmaW5lIFJYX1JCX1RJTUVPVVQJKDB4MTApCi0KLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9QQVVTRV9WQUwgICAgICAgICAoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9QQVVTRV9FT0ZfVkFMICAgICAoMHg0MDAwMDAwMCkKLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9FTkFCTEVfVkFMICAgICAgICAoMHg4MDAwMDAwMCkKLQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfNEsgICAgKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIX1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV84SyAgICAoMHgwMDAxMDAwMCkKLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzEySyAgICgweDAwMDIwMDAwKQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfMTZLICAgKDB4MDAwMzAwMDApCi0KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9JR05PUkVfUlhGX0VNUFRZICAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfTk9fSU5UX1ZBTCAgICAoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMICAoMHgwMDAwMTAwMCkKLQotI2RlZmluZSBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSwkoMHgwMDAwM0ZGRikJLyogYml0cyAwLTEzICovCi0KLS8qKgotICogUnggU2hhcmVkIFN0YXR1cyBSZWdpc3RlcnMgKFJTU1IpCi0gKgotICogQWZ0ZXIgc3RvcHBpbmcgUnggRE1BIGNoYW5uZWwgKHdyaXRpbmcgMCB0bwotICogRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRyksIGRyaXZlciBtdXN0IHBvbGwKLSAqIEZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcgdW50aWwgUnggY2hhbm5lbCBpcyBpZGxlLgotICoKLSAqIEJpdCBmaWVsZHM6Ci0gKiAgMjQ6ICAxID0gQ2hhbm5lbCAwIGlzIGlkbGUKLSAqCi0gKiBGSF9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcgYW5kIEZIX01FTV9SU1NSX1JYX0VOQUJMRV9FUlJfSVJRMkRSVgotICogY29udGFpbiBkZWZhdWx0IHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYmUgYWx0ZXJlZCBieSB0aGUgZHJpdmVyLgotICovCi0jZGVmaW5lIEZIX01FTV9SU1NSX0xPV0VSX0JPVU5EICAgICAgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhDNDApCi0jZGVmaW5lIEZIX01FTV9SU1NSX1VQUEVSX0JPVU5EICAgICAgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhEMDApCi0KLSNkZWZpbmUgRkhfTUVNX1JTU1JfU0hBUkVEX0NUUkxfUkVHICAgICAgIChGSF9NRU1fUlNTUl9MT1dFUl9CT1VORCkKLSNkZWZpbmUgRkhfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRwkoRkhfTUVNX1JTU1JfTE9XRVJfQk9VTkQgKyAweDAwNCkKLSNkZWZpbmUgRkhfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWXAotCQkJCQkoRkhfTUVNX1JTU1JfTE9XRVJfQk9VTkQgKyAweDAwOCkKLQotI2RlZmluZSBGSF9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUJKDB4MDEwMDAwMDApCi0KLSNkZWZpbmUgRkhfTUVNX1RGRElCX1JFRzFfQUREUl9CSVRTSElGVAkyOAotCi0vKiBURkRCICBBcmVhIC0gVEZEcyBidWZmZXIgdGFibGUgKi8KLSNkZWZpbmUgRkhfTUVNX1RGRElCX0RSQU1fQUREUl9MU0JfTVNLICAgICAgKDB4RkZGRkZGRkYpCi0jZGVmaW5lIEZIX1RGRElCX0xPV0VSX0JPVU5EICAgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDkwMCkKLSNkZWZpbmUgRkhfVEZESUJfVVBQRVJfQk9VTkQgICAgICAgKEZIX01FTV9MT1dFUl9CT1VORCArIDB4OTU4KQotI2RlZmluZSBGSF9URkRJQl9DVFJMMF9SRUcoX2NobmwpICAoRkhfVEZESUJfTE9XRVJfQk9VTkQgKyAweDggKiAoX2NobmwpKQotI2RlZmluZSBGSF9URkRJQl9DVFJMMV9SRUcoX2NobmwpICAoRkhfVEZESUJfTE9XRVJfQk9VTkQgKyAweDggKiAoX2NobmwpICsgMHg0KQotCi0vKioKLSAqIFRyYW5zbWl0IERNQSBDaGFubmVsIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVycyAoVENTUikKLSAqCi0gKiA0OTY1IGhhcyBvbmUgY29uZmlndXJhdGlvbiByZWdpc3RlciBmb3IgZWFjaCBvZiA4IFR4IERNQS9GSUZPIGNoYW5uZWxzCi0gKiBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUgKGRvbid0IGNvbmZ1c2UgdGhlc2Ugd2l0aCB0aGUgMTYgVHggcXVldWVzIGluIERSQU0sCi0gKiB3aGljaCBmZWVkIHRoZSBETUEvRklGTyBjaGFubmVscyk7IGNvbmZpZyByZWdzIGFyZSBzZXBhcmF0ZWQgYnkgMHgyMCBieXRlcy4KLSAqCi0gKiBUbyB1c2UgYSBUeCBETUEgY2hhbm5lbCwgZHJpdmVyIG11c3QgaW5pdGlhbGl6ZSBpdHMKLSAqIEZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNobmwpIHdpdGg6Ci0gKgotICogRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUgfAotICogRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwKLSAqCi0gKiBBbGwgb3RoZXIgYml0cyBzaG91bGQgYmUgMC4KLSAqCi0gKiBCaXQgZmllbGRzOgotICogMzEtMzA6IFR4IERNQSBjaGFubmVsIGVuYWJsZTogJzAwJyBvZmYvcGF1c2UsICcwMScgcGF1c2UgYXQgZW5kIG9mIGZyYW1lLAotICogICAgICAgICcxMCcgb3BlcmF0ZSBub3JtYWxseQotICogMjktIDQ6IFJlc2VydmVkLCBzZXQgdG8gIjAiCi0gKiAgICAgMzogRW5hYmxlIGludGVybmFsIERNQSByZXF1ZXN0cyAoMSwgbm9ybWFsIG9wZXJhdGlvbiksIGRpc2FibGUgKDApCi0gKiAgMi0gMDogUmVzZXJ2ZWQsIHNldCB0byAiMCIKLSAqLwotI2RlZmluZSBGSF9UQ1NSX0xPV0VSX0JPVU5EICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhEMDApCi0jZGVmaW5lIEZIX1RDU1JfVVBQRVJfQk9VTkQgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEU2MCkKLQotLyogRmluZCBDb250cm9sL1N0YXR1cyByZWcgZm9yIGdpdmVuIFR4IERNQS9GSUZPIGNoYW5uZWwgKi8KLSNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICg3KQotI2RlZmluZSBGSDUwX1RDU1JfQ0hOTF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDgpCi0KLS8qIFRDU1I6IHR4X2NvbmZpZyByZWdpc3RlciB2YWx1ZXMgKi8KLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoX2NobmwpCVwKLQkJKEZIX1RDU1JfTE9XRVJfQk9VTkQgKyAweDIwICogKF9jaG5sKSkKLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0NSRURJVF9SRUcoX2NobmwpCVwKLQkJKEZIX1RDU1JfTE9XRVJfQk9VTkQgKyAweDIwICogKF9jaG5sKSArIDB4NCkKLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHKF9jaG5sKQlcCi0JCShGSF9UQ1NSX0xPV0VSX0JPVU5EICsgMHgyMCAqIChfY2hubCkgKyAweDgpCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9UWEYJCSgweDAwMDAwMDAwKQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0RSVgkJKDB4MDAwMDAwMDEpCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0RJU0FCTEUJKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9FTkFCTEUJKDB4MDAwMDAwMDgpCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfTk9JTlQJKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9IT1NUX0VORFRGRAkoMHgwMDEwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfSUZURkQJKDB4MDAyMDAwMDApCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19OT0lOVAkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19FTkRURkQJKDB4MDA0MDAwMDApCi0jZGVmaW5lIEZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9SVENfSUZURkQJKDB4MDA4MDAwMDApCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9QQVVTRQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9QQVVTRV9FT0YJKDB4NDAwMDAwMDApCi0jZGVmaW5lIEZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFCSgweDgwMDAwMDAwKQotCi0jZGVmaW5lIEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9FTVBUWQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX1dBSVQJKDB4MDAwMDIwMDApCi0jZGVmaW5lIEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9WQUxJRAkoMHgwMDAwMDAwMykKLQotI2RlZmluZSBGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfUE9TX1RCX05VTQkJKDIwKQotI2RlZmluZSBGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfUE9TX1RCX0lEWAkJKDEyKQotCi0vKioKLSAqIFR4IFNoYXJlZCBTdGF0dXMgUmVnaXN0ZXJzIChUU1NSKQotICoKLSAqIEFmdGVyIHN0b3BwaW5nIFR4IERNQSBjaGFubmVsICh3cml0aW5nIDAgdG8KLSAqIEZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNobmwpKSwgZHJpdmVyIG11c3QgcG9sbAotICogRkhfVFNTUl9UWF9TVEFUVVNfUkVHIHVudGlsIHNlbGVjdGVkIFR4IGNoYW5uZWwgaXMgaWRsZQotICogKGNoYW5uZWwncyBidWZmZXJzIGVtcHR5IHwgbm8gcGVuZGluZyByZXF1ZXN0cykuCi0gKgotICogQml0IGZpZWxkczoKLSAqIDMxLTI0OiAgMSA9IENoYW5uZWwgYnVmZmVycyBlbXB0eSAoY2hhbm5lbCA3OjApCi0gKiAyMy0xNjogIDEgPSBObyBwZW5kaW5nIHJlcXVlc3RzIChjaGFubmVsIDc6MCkKLSAqLwotI2RlZmluZSBGSF9UU1NSX0xPV0VSX0JPVU5ECQkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhFQTApCi0jZGVmaW5lIEZIX1RTU1JfVVBQRVJfQk9VTkQJCShGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEVDMCkKLQotI2RlZmluZSBGSF9UU1NSX1RYX1NUQVRVU19SRUcJCShGSF9UU1NSX0xPV0VSX0JPVU5EICsgMHgwMTApCi0KLS8qKgotICogQml0IGZpZWxkcyBmb3IgVFNTUihUeCBTaGFyZWQgU3RhdHVzICYgQ29udHJvbCkgZXJyb3Igc3RhdHVzIHJlZ2lzdGVyOgotICogMzE6ICBJbmRpY2F0ZXMgYW4gYWRkcmVzcyBlcnJvciB3aGVuIGFjY2Vzc2VkIHRvIGludGVybmFsIG1lbW9yeQotICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZwotICogMzA6ICBJbmRpY2F0ZXMgdGhhdCBIb3N0IGRpZCBub3Qgc2VuZCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGR3b3JkcyB0byBGSAotICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZwotICogMTYtOTpFYWNoIHN0YXR1cyBiaXQgaXMgZm9yIG9uZSBjaGFubmVsLiBJbmRpY2F0ZXMgdGhhdCBhbiAoRXJyb3IpIEFjdERNQQotICoJY29tbWFuZCB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2NoZWR1bGVyIHdoaWxlIHRoZSBUUkIgd2FzIGFscmVhZHkgZnVsbAotICoJd2l0aCBwcmV2aW91cyBjb21tYW5kCi0gKgl1Q29kZS9kcml2ZXIgbXVzdCB3cml0ZSAiMSIgaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBmbGFnCi0gKiA3LTA6IEVhY2ggc3RhdHVzIGJpdCBpbmRpY2F0ZXMgYSBjaGFubmVsJ3MgVHhDcmVkaXQgZXJyb3IuIFdoZW4gYW4gZXJyb3IKLSAqCWJpdCBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBGSCBoYXMgcmVjZWl2ZWQgYSBmdWxsIGluZGljYXRpb24KLSAqCWZyb20gdGhlIFJUQyBUeEZJRk8gYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBUeENyZWRpdCBjb3VudGVyIHdhcwotICoJbm90IGVxdWFsIHRvIHplcm8uIFRoaXMgbWVhbiB0aGF0IHRoZSBjcmVkaXQgbWVjaGFuaXNtIHdhcyBub3QKLSAqCXN5bmNocm9uaXplZCB0byB0aGUgVHhGSUZPIHN0YXR1cwotICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZwotICovCi0jZGVmaW5lIEZIX1RTU1JfVFhfRVJST1JfUkVHCQkoRkhfVFNTUl9MT1dFUl9CT1VORCArIDB4MDE4KQotCi0jZGVmaW5lIEZIX1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKF9jaG5sKSAoKDEgPDwgKF9jaG5sKSkgPDwgMTYpCi0KLS8qIFR4IHNlcnZpY2UgY2hhbm5lbHMgKi8KLSNkZWZpbmUgRkhfU1JWQ19DSE5MCQkoOSkKLSNkZWZpbmUgRkhfU1JWQ19MT1dFUl9CT1VORAkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHg5QzgpCi0jZGVmaW5lIEZIX1NSVkNfVVBQRVJfQk9VTkQJKEZIX01FTV9MT1dFUl9CT1VORCArIDB4OUQwKQotI2RlZmluZSBGSF9TUlZDX0NITkxfU1JBTV9BRERSX1JFRyhfY2hubCkgXAotCQkoRkhfU1JWQ19MT1dFUl9CT1VORCArICgoX2NobmwpIC0gOSkgKiAweDQpCi0KLSNkZWZpbmUgRkhfVFhfQ0hJQ0tFTl9CSVRTX1JFRwkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhFOTgpCi0vKiBJbnN0cnVjdCBGSCB0byBpbmNyZW1lbnQgdGhlIHJldHJ5IGNvdW50IG9mIGEgcGFja2V0IHdoZW4KLSAqIGl0IGlzIGJyb3VnaHQgZnJvbSB0aGUgbWVtb3J5IHRvIFRYLUZJRk8KLSAqLwotI2RlZmluZSBGSF9UWF9DSElDS0VOX0JJVFNfU0NEX0FVVE9fUkVUUllfRU4JKDB4MDAwMDAwMDIpCi0KLSNkZWZpbmUgUlhfUVVFVUVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgUlhfUVVFVUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAyNTUKLSNkZWZpbmUgUlhfUVVFVUVfU0laRV9MT0cgICAgICAgICAgICAgICAgICAgICA4Ci0KLS8qCi0gKiBSWCByZWxhdGVkIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucwotICovCi0jZGVmaW5lIFJYX0ZSRUVfQlVGRkVSUyA2NAotI2RlZmluZSBSWF9MT1dfV0FURVJNQVJLIDgKLQotLyogU2l6ZSBvZiBvbmUgUnggYnVmZmVyIGluIGhvc3QgRFJBTSAqLwotI2RlZmluZSBJV0xfUlhfQlVGX1NJWkVfM0sgKDMgKiAxMDAwKSAvKiAzOTQ1IG9ubHkgKi8KLSNkZWZpbmUgSVdMX1JYX0JVRl9TSVpFXzRLICg0ICogMTAyNCkKLSNkZWZpbmUgSVdMX1JYX0JVRl9TSVpFXzhLICg4ICogMTAyNCkKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX3JiX3N0YXR1cyAtIHJlc2V2ZSBidWZmZXIgc3RhdHVzCi0gKiAJaG9zdCBtZW1vcnkgbWFwcGVkIEZIIHJlZ2lzdGVycwotICogQGNsb3NlZF9yYl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgUkIgd2hpY2ggd2FzIGNsb3NlZAotICogQGNsb3NlZF9mcl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgUlggRnJhbWUgd2hpY2ggd2FzIGNsb3NlZAotICogQGZpbmlzaGVkX3JiX251bSBbMDoxMV0gLSBJbmRpY2F0ZXMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IFJCCi0gKiAJaW4gd2hpY2ggdGhlIGxhc3QgZnJhbWUgd2FzIHdyaXR0ZW4gdG8KLSAqIEBmaW5pc2hlZF9mcl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgUlggRnJhbWUKLSAqIAl3aGljaCB3YXMgdHJhbnNmZXJyZWQKLSAqLwotc3RydWN0IGl3bF9yYl9zdGF0dXMgewotCV9fbGUxNiBjbG9zZWRfcmJfbnVtOwotCV9fbGUxNiBjbG9zZWRfZnJfbnVtOwotCV9fbGUxNiBmaW5pc2hlZF9yYl9udW07Ci0JX19sZTE2IGZpbmlzaGVkX2ZyX25hbTsKLQlfX2xlMzIgX191bnVzZWQ7IC8qIDM5NDUgb25seSAqLwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIFRGRF9RVUVVRV9TSVpFX01BWCAgICAgICgyNTYpCi0jZGVmaW5lIFRGRF9RVUVVRV9TSVpFX0JDX0RVUAkoNjQpCi0jZGVmaW5lIFRGRF9RVUVVRV9CQ19TSVpFCShURkRfUVVFVUVfU0laRV9NQVggKyBURkRfUVVFVUVfU0laRV9CQ19EVVApCi0jZGVmaW5lIElXTF9UWF9ETUFfTUFTSyAgICAgICAgRE1BX0JJVF9NQVNLKDM2KQotI2RlZmluZSBJV0xfTlVNX09GX1RCUwkJMjAKLQotc3RhdGljIGlubGluZSB1OCBpd2xfbGVnYWN5X2dldF9kbWFfaGlfYWRkcihkbWFfYWRkcl90IGFkZHIpCi17Ci0JcmV0dXJuIChzaXplb2YoYWRkcikgPiBzaXplb2YodTMyKSA/IChhZGRyID4+IDE2KSA+PiAxNiA6IDApICYgMHhGOwotfQotLyoqCi0gKiBzdHJ1Y3QgaXdsX3RmZF90YiB0cmFuc21pdCBidWZmZXIgZGVzY3JpcHRvciB3aXRoaW4gdHJhbnNtaXQgZnJhbWUgZGVzY3JpcHRvcgotICoKLSAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGRtYSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdHJhbnNtaXNzaW9uIGFkZHJlc3MKLSAqCi0gKiBAbG86IGxvdyBbMzE6MF0gcG9ydGlvbiBvZiB0aGUgZG1hIGFkZHJlc3Mgb2YgVFggYnVmZmVyCi0gKiAJZXZlcnkgZXZlbiBpcyB1bmFsaWduZWQgb24gMTYgYml0IGJvdW5kYXJ5Ci0gKiBAaGlfbl9sZW4gMC0zIFszNTozMl0gcG9ydGlvbiBvZiBkbWEKLSAqCSAgICAgNC0xNSBsZW5ndGggb2YgdGhlIHR4IGJ1ZmZlcgotICovCi1zdHJ1Y3QgaXdsX3RmZF90YiB7Ci0JX19sZTMyIGxvOwotCV9fbGUxNiBoaV9uX2xlbjsKLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogc3RydWN0IGl3bF90ZmQKLSAqCi0gKiBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9yIChURkQpCi0gKgotICogQCBfX3Jlc2VydmVkMVszXSByZXNlcnZlZAotICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicwotICoJICAgICA1ICAgcmVzZXJ2ZWQKLSAqIAkgICAgIDYtNyBwYWRkaW5nIChub3QgdXNlZCkKLSAqIEAgdGJzWzIwXQl0cmFuc21pdCBmcmFtZSBidWZmZXIgZGVzY3JpcHRvcnMKLSAqIEAgX19wYWQgCXBhZGRpbmcKLSAqCi0gKiBFYWNoIFR4IHF1ZXVlIHVzZXMgYSBjaXJjdWxhciBidWZmZXIgb2YgMjU2IFRGRHMgc3RvcmVkIGluIGhvc3QgRFJBTS4KLSAqIEJvdGggZHJpdmVyIGFuZCBkZXZpY2Ugc2hhcmUgdGhlc2UgY2lyY3VsYXIgYnVmZmVycywgZWFjaCBvZiB3aGljaCBtdXN0IGJlCi0gKiBjb250aWd1b3VzIDI1NiBURkRzIHggMTI4IGJ5dGVzLXBlci1URkQgPSAzMiBLQnl0ZXMKLSAqCi0gKiBEcml2ZXIgbXVzdCBpbmRpY2F0ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYmFzZSBvZiBlYWNoCi0gKiBjaXJjdWxhciBidWZmZXIgdmlhIHRoZSBGSF9NRU1fQ0JCQ19RVUVVRSByZWdpc3RlcnMuCi0gKgotICogRWFjaCBURkQgY29udGFpbnMgcG9pbnRlci9zaXplIGluZm9ybWF0aW9uIGZvciB1cCB0byAyMCBkYXRhIGJ1ZmZlcnMKLSAqIGluIGhvc3QgRFJBTS4gIFRoZXNlIGJ1ZmZlcnMgY29sbGVjdGl2ZWx5IGNvbnRhaW4gdGhlIChvbmUpIGZyYW1lIGRlc2NyaWJlZAotICogYnkgdGhlIFRGRC4gIEVhY2ggYnVmZmVyIG11c3QgYmUgYSBzaW5nbGUgY29udGlndW91cyBibG9jayBvZiBtZW1vcnkgd2l0aGluCi0gKiBpdHNlbGYsIGJ1dCBidWZmZXJzIG1heSBiZSBzY2F0dGVyZWQgaW4gaG9zdCBEUkFNLiAgRWFjaCBidWZmZXIgaGFzIG1heCBzaXplCi0gKiBvZiAoNEsgLSA0KS4gIFRoZSBjb25jYXRlbmF0ZXMgYWxsIG9mIGEgVEZEJ3MgYnVmZmVycyBpbnRvIGEgc2luZ2xlCi0gKiBUeCBmcmFtZSwgdXAgdG8gOCBLQnl0ZXMgaW4gc2l6ZS4KLSAqCi0gKiBBIG1heGltdW0gb2YgMjU1IChub3QgMjU2ISkgVEZEcyBtYXkgYmUgb24gYSBxdWV1ZSB3YWl0aW5nIGZvciBUeC4KLSAqLwotc3RydWN0IGl3bF90ZmQgewotCXU4IF9fcmVzZXJ2ZWQxWzNdOwotCXU4IG51bV90YnM7Ci0Jc3RydWN0IGl3bF90ZmRfdGIgdGJzW0lXTF9OVU1fT0ZfVEJTXTsKLQlfX2xlMzIgX19wYWQ7Ci19IF9fcGFja2VkOwotCi0vKiBLZWVwIFdhcm0gU2l6ZSAqLwotI2RlZmluZSBJV0xfS1dfU0laRSAweDEwMDAJLyogNGsgKi8KLQotI2VuZGlmIC8qICFfX2l3bF9sZWdhY3lfZmhfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaGNtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWhjbWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxZmM5Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaGNtZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotCi0KLWNvbnN0IGNoYXIgKml3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcodTggY21kKQotewotCXN3aXRjaCAoY21kKSB7Ci0JCUlXTF9DTUQoUkVQTFlfQUxJVkUpOwotCQlJV0xfQ01EKFJFUExZX0VSUk9SKTsKLQkJSVdMX0NNRChSRVBMWV9SWE9OKTsKLQkJSVdMX0NNRChSRVBMWV9SWE9OX0FTU09DKTsKLQkJSVdMX0NNRChSRVBMWV9RT1NfUEFSQU0pOwotCQlJV0xfQ01EKFJFUExZX1JYT05fVElNSU5HKTsKLQkJSVdMX0NNRChSRVBMWV9BRERfU1RBKTsKLQkJSVdMX0NNRChSRVBMWV9SRU1PVkVfU1RBKTsKLQkJSVdMX0NNRChSRVBMWV9XRVBLRVkpOwotCQlJV0xfQ01EKFJFUExZXzM5NDVfUlgpOwotCQlJV0xfQ01EKFJFUExZX1RYKTsKLQkJSVdMX0NNRChSRVBMWV9SQVRFX1NDQUxFKTsKLQkJSVdMX0NNRChSRVBMWV9MRURTX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfQ0hBTk5FTF9TV0lUQ0gpOwotCQlJV0xfQ01EKENIQU5ORUxfU1dJVENIX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUkVQTFlfU1BFQ1RSVU1fTUVBU1VSRU1FTlRfQ01EKTsKLQkJSVdMX0NNRChTUEVDVFJVTV9NRUFTVVJFX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUE9XRVJfVEFCTEVfQ01EKTsKLQkJSVdMX0NNRChQTV9TTEVFUF9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKFBNX0RFQlVHX1NUQVRJU1RJQ19OT1RJRklDKTsKLQkJSVdMX0NNRChSRVBMWV9TQ0FOX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfU0NBTl9BQk9SVF9DTUQpOwotCQlJV0xfQ01EKFNDQU5fU1RBUlRfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChTQ0FOX1JFU1VMVFNfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoQkVBQ09OX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUkVQTFlfVFhfQkVBQ09OKTsKLQkJSVdMX0NNRChSRVBMWV9UWF9QV1JfVEFCTEVfQ01EKTsKLQkJSVdMX0NNRChSRVBMWV9CVF9DT05GSUcpOwotCQlJV0xfQ01EKFJFUExZX1NUQVRJU1RJQ1NfQ01EKTsKLQkJSVdMX0NNRChTVEFUSVNUSUNTX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoQ0FSRF9TVEFURV9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKE1JU1NFRF9CRUFDT05TX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EKTsKLQkJSVdMX0NNRChTRU5TSVRJVklUWV9DTUQpOwotCQlJV0xfQ01EKFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQpOwotCQlJV0xfQ01EKFJFUExZX1JYX1BIWV9DTUQpOwotCQlJV0xfQ01EKFJFUExZX1JYX01QRFVfQ01EKTsKLQkJSVdMX0NNRChSRVBMWV9SWCk7Ci0JCUlXTF9DTUQoUkVQTFlfQ09NUFJFU1NFRF9CQSk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJVTktOT1dOIjsKLQotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyk7Ci0KLSNkZWZpbmUgSE9TVF9DT01QTEVURV9USU1FT1VUIChIWiAvIDIpCi0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfZ2VuZXJpY19jbWRfY2FsbGJhY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KQotewotCWlmIChwa3QtPmhkci5mbGFncyAmIElXTF9DTURfRkFJTEVEX01TSykgewotCQlJV0xfRVJSKHByaXYsICJCYWQgcmV0dXJuIGZyb20gJXMgKDB4JTA4WClcbiIsCi0JCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0Jc3dpdGNoIChjbWQtPmhkci5jbWQpIHsKLQljYXNlIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQ6Ci0JY2FzZSBTRU5TSVRJVklUWV9DTUQ6Ci0JCUlXTF9ERUJVR19IQ19EVU1QKHByaXYsICJiYWNrIGZyb20gJXMgKDB4JTA4WClcbiIsCi0JCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfREVCVUdfSEMocHJpdiwgImJhY2sgZnJvbSAlcyAoMHglMDhYKVxuIiwKLQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7Ci0JfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQKLWl3bF9sZWdhY3lfc2VuZF9jbWRfYXN5bmMoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpCi17Ci0JaW50IHJldDsKLQotCUJVR19PTighKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpKTsKLQotCS8qIEFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGNhbiBub3QgZXhwZWN0IGFuIFNLQiB0byBiZSBzZXQuICovCi0JQlVHX09OKGNtZC0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpOwotCi0JLyogQXNzaWduIGEgZ2VuZXJpYyBjYWxsYmFjayBpZiBvbmUgaXMgbm90IHByb3ZpZGVkICovCi0JaWYgKCFjbWQtPmNhbGxiYWNrKQotCQljbWQtPmNhbGxiYWNrID0gaXdsX2xlZ2FjeV9nZW5lcmljX2NtZF9jYWxsYmFjazsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJldCA9IGl3bF9sZWdhY3lfZW5xdWV1ZV9oY21kKHByaXYsIGNtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCi0JCQkgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kKQotewotCWludCBjbWRfaWR4OwotCWludCByZXQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlCVUdfT04oY21kLT5mbGFncyAmIENNRF9BU1lOQyk7Ci0KLQkgLyogQSBzeW5jaHJvbm91cyBjb21tYW5kIGNhbiBub3QgaGF2ZSBhIGNhbGxiYWNrIHNldC4gKi8KLQlCVUdfT04oY21kLT5jYWxsYmFjayk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQXR0ZW1wdGluZyB0byBzZW5kIHN5bmMgY29tbWFuZCAlc1xuIiwKLQkJCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCi0Jc2V0X2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJTZXR0aW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAotCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0KLQljbWRfaWR4ID0gaXdsX2xlZ2FjeV9lbnF1ZXVlX2hjbWQocHJpdiwgY21kKTsKLQlpZiAoY21kX2lkeCA8IDApIHsKLQkJcmV0ID0gY21kX2lkeDsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCi0JCQkgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksIHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwcml2LT53YWl0X2NvbW1hbmRfcXVldWUsCi0JCQkhdGVzdF9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKSwKLQkJCUhPU1RfQ09NUExFVEVfVElNRU9VVCk7Ci0JaWYgKCFyZXQpIHsKLQkJaWYgKHRlc3RfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnByaXYtPnN0YXR1cykpIHsKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiRXJyb3Igc2VuZGluZyAlczogdGltZSBvdXQgYWZ0ZXIgJWRtcy5cbiIsCi0JCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKEhPU1RfQ09NUExFVEVfVElNRU9VVCkpOwotCi0JCQljbGVhcl9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKTsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJIkNsZWFyaW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAotCQkJCSAgICAgICBpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCQlnb3RvIGNhbmNlbDsKLQkJfQotCX0KLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX0VSUihwcml2LCAiQ29tbWFuZCAlcyBhYm9ydGVkOiBSRiBLSUxMIFN3aXRjaFxuIiwKLQkJCSAgICAgICBpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQkJcmV0ID0gLUVDQU5DRUxFRDsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfRVJSKHByaXYsICJDb21tYW5kICVzIGZhaWxlZDogRlcgRXJyb3JcbiIsCi0JCQkgICAgICAgaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKChjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSAmJiAhY21kLT5yZXBseV9wYWdlKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yOiBSZXNwb25zZSBOVUxMIGluICclcydcbiIsCi0JCQkgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGNhbmNlbDsKLQl9Ci0KLQlyZXQgPSAwOwotCWdvdG8gb3V0OwotCi1jYW5jZWw6Ci0JaWYgKGNtZC0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpIHsKLQkJLyoKLQkJICogQ2FuY2VsIHRoZSBDTURfV0FOVF9TS0IgZmxhZyBmb3IgdGhlIGNtZCBpbiB0aGUKLQkJICogVFggY21kIHF1ZXVlLiBPdGhlcndpc2UgaW4gY2FzZSB0aGUgY21kIGNvbWVzCi0JCSAqIGluIGxhdGVyLCBpdCB3aWxsIHBvc3NpYmx5IHNldCBhbiBpbnZhbGlkCi0JCSAqIGFkZHJlc3MgKGNtZC0+bWV0YS5zb3VyY2UpLgotCQkgKi8KLQkJcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV0ubWV0YVtjbWRfaWR4XS5mbGFncyAmPQotCQkJCQkJCX5DTURfV0FOVF9TS0I7Ci0JfQotZmFpbDoKLQlpZiAoY21kLT5yZXBseV9wYWdlKSB7Ci0JCWl3bF9sZWdhY3lfZnJlZV9wYWdlcyhwcml2LCBjbWQtPnJlcGx5X3BhZ2UpOwotCQljbWQtPnJlcGx5X3BhZ2UgPSAwOwotCX0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMpOwotCi1pbnQgaXdsX2xlZ2FjeV9zZW5kX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKLXsKLQlpZiAoY21kLT5mbGFncyAmIENNRF9BU1lOQykKLQkJcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfYXN5bmMocHJpdiwgY21kKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMocHJpdiwgY21kKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZW5kX2NtZCk7Ci0KLWludAotaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gaWQsCi0JCS5sZW4gPSBsZW4sCi0JCS5kYXRhID0gZGF0YSwKLQl9OwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfc3luYyhwcml2LCAmY21kKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUpOwotCi1pbnQgaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgdTggaWQsIHUxNiBsZW4sIGNvbnN0IHZvaWQgKmRhdGEsCi0JCQkgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJCQkgICAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkpCi17Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IGlkLAotCQkubGVuID0gbGVuLAotCQkuZGF0YSA9IGRhdGEsCi0JfTsKLQotCWNtZC5mbGFncyB8PSBDTURfQVNZTkM7Ci0JY21kLmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9hc3luYyhwcml2LCAmY21kKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWhlbHBlcnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1oZWxwZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjIzZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWhlbHBlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2hlbHBlcnNfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9oZWxwZXJzX2hfXwotCi0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1pby5oIgotCi0jZGVmaW5lIElXTF9NQVNLKGxvLCBoaSkgKCgxIDw8IChoaSkpIHwgKCgxIDw8IChoaSkpIC0gKDEgPDwgKGxvKSkpKQotCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9jb25mICppd2xfbGVnYWN5X2llZWU4MDIxMV9nZXRfaHdfY29uZigKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlyZXR1cm4gJmh3LT5jb25mOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAgLSBpbmNyZW1lbnQgcXVldWUgaW5kZXgsIHdyYXAgYmFjayB0byBiZWdpbm5pbmcKLSAqIEBpbmRleCAtLSBjdXJyZW50IGluZGV4Ci0gKiBAbl9iZCAtLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBxdWV1ZSAobXVzdCBiZSBwb3dlciBvZiAyKQotICovCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKGludCBpbmRleCwgaW50IG5fYmQpCi17Ci0JcmV0dXJuICsraW5kZXggJiAobl9iZCAtIDEpOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfcXVldWVfZGVjX3dyYXAgLSBkZWNyZW1lbnQgcXVldWUgaW5kZXgsIHdyYXAgYmFjayB0byBlbmQKLSAqIEBpbmRleCAtLSBjdXJyZW50IGluZGV4Ci0gKiBAbl9iZCAtLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBxdWV1ZSAobXVzdCBiZSBwb3dlciBvZiAyKQotICovCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3F1ZXVlX2RlY193cmFwKGludCBpbmRleCwgaW50IG5fYmQpCi17Ci0JcmV0dXJuIC0taW5kZXggJiAobl9iZCAtIDEpOwotfQotCi0vKiBUT0RPOiBNb3ZlIGZ3X2Rlc2MgZnVuY3Rpb25zIHRvIGl3bC1wY2kua28gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKLQkJCQkgICAgc3RydWN0IGZ3X2Rlc2MgKmRlc2MpCi17Ci0JaWYgKGRlc2MtPnZfYWRkcikKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJnBjaV9kZXYtPmRldiwgZGVzYy0+bGVuLAotCQkJCSAgZGVzYy0+dl9hZGRyLCBkZXNjLT5wX2FkZHIpOwotCWRlc2MtPnZfYWRkciA9IE5VTEw7Ci0JZGVzYy0+bGVuID0gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAotCQkJCSAgICBzdHJ1Y3QgZndfZGVzYyAqZGVzYykKLXsKLQlpZiAoIWRlc2MtPmxlbikgewotCQlkZXNjLT52X2FkZHIgPSBOVUxMOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXNjLT52X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBjaV9kZXYtPmRldiwgZGVzYy0+bGVuLAotCQkJCQkgICZkZXNjLT5wX2FkZHIsIEdGUF9LRVJORUwpOwotCXJldHVybiAoZGVzYy0+dl9hZGRyICE9IE5VTEwpID8gMCA6IC1FTk9NRU07Ci19Ci0KLS8qCi0gKiB3ZSBoYXZlIDggYml0cyB1c2VkIGxpa2UgdGhpczoKLSAqCi0gKiA3IDYgNSA0IDMgMiAxIDAKLSAqIHwgfCB8IHwgfCB8IHwgfAotICogfCB8IHwgfCB8IHwgKy0rLS0tLS0tLS0gQUMgcXVldWUgKDAtMykKLSAqIHwgfCB8IHwgfCB8Ci0gKiB8ICstKy0rLSstKy0tLS0tLS0tLS0tLSBIVyBxdWV1ZSBJRAotICogfAotICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdW51c2VkCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXdsX2xlZ2FjeV9zZXRfc3dxX2lkKHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwgdTggYWMsIHU4IGh3cSkKLXsKLQlCVUdfT04oYWMgPiAzKTsgICAvKiBvbmx5IGhhdmUgMiBiaXRzICovCi0JQlVHX09OKGh3cSA+IDMxKTsgLyogb25seSB1c2UgNSBiaXRzICovCi0KLQl0eHEtPnN3cV9pZCA9IChod3EgPDwgMikgfCBhYzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfd2FrZV9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0JdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKLQl1OCBhYyA9IHF1ZXVlICYgMzsKLQl1OCBod3EgPSAocXVldWUgPj4gMikgJiAweDFmOwotCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChod3EsIHByaXYtPnF1ZXVlX3N0b3BwZWQpKQotCQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJnByaXYtPnF1ZXVlX3N0b3BfY291bnRbYWNdKSA8PSAwKQotCQkJaWVlZTgwMjExX3dha2VfcXVldWUocHJpdi0+aHcsIGFjKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfc3RvcF9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0JdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKLQl1OCBhYyA9IHF1ZXVlICYgMzsKLQl1OCBod3EgPSAocXVldWUgPj4gMikgJiAweDFmOwotCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGh3cSwgcHJpdi0+cXVldWVfc3RvcHBlZCkpCi0JCWlmIChhdG9taWNfaW5jX3JldHVybigmcHJpdi0+cXVldWVfc3RvcF9jb3VudFthY10pID4gMCkKLQkJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmh3LCBhYyk7Ci19Ci0KLSNpZmRlZiBpZWVlODAyMTFfc3RvcF9xdWV1ZQotI3VuZGVmIGllZWU4MDIxMV9zdG9wX3F1ZXVlCi0jZW5kaWYKLQotI2RlZmluZSBpZWVlODAyMTFfc3RvcF9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV9zdG9wX3F1ZXVlCi0KLSNpZmRlZiBpZWVlODAyMTFfd2FrZV9xdWV1ZQotI3VuZGVmIGllZWU4MDIxMV93YWtlX3F1ZXVlCi0jZW5kaWYKLQotI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV93YWtlX3F1ZXVlCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JY2xlYXJfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBkaXNhYmxlIGludGVycnVwdHMgZnJvbSB1Q29kZS9OSUMgdG8gaG9zdCAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlRfTUFTSywgMHgwMDAwMDAwMCk7Ci0KLQkvKiBhY2tub3dsZWRnZS9jbGVhci9yZXNldCBhbnkgaW50ZXJydXB0cyBzdGlsbCBwZW5kaW5nCi0JICogZnJvbSB1Q29kZSBvciBmbG93IGhhbmRsZXIgKFJ4L1R4IERNQSkgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweGZmZmZmZmZmKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUywgMHhmZmZmZmZmZik7Ci0JSVdMX0RFQlVHX0lTUihwcml2LCAiRGlzYWJsZWQgaW50ZXJydXB0c1xuIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2VuYWJsZV9yZmtpbGxfaW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlJV0xfREVCVUdfSVNSKHByaXYsICJFbmFibGluZyByZmtpbGwgaW50ZXJydXB0XG4iKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5UX01BU0ssIENTUl9JTlRfQklUX1JGX0tJTEwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JSVdMX0RFQlVHX0lTUihwcml2LCAiRW5hYmxpbmcgaW50ZXJydXB0c1xuIik7Ci0Jc2V0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlRfTUFTSywgcHJpdi0+aW50YV9tYXNrKTsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfbG93IC0gbWFzayBvZiBsb3dlciAzMiBiaXQgb2YgYmVhY29uIHRpbWUKLSAqIEBwcml2IC0tIHBvaW50ZXIgdG8gaXdsX3ByaXYgZGF0YSBzdHJ1Y3R1cmUKLSAqIEB0c2ZfYml0cyAtLSBudW1iZXIgb2YgYml0cyBuZWVkIHRvIHNoaWZ0IGZvciBtYXNraW5nKQotICovCi1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfbG93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgdTE2IHRzZl9iaXRzKQotewotCXJldHVybiAoMSA8PCB0c2ZfYml0cykgLSAxOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19oaWdoIC0gbWFzayBvZiBoaWdoZXIgMzIgYml0IG9mIGJlYWNvbiB0aW1lCi0gKiBAcHJpdiAtLSBwb2ludGVyIHRvIGl3bF9wcml2IGRhdGEgc3RydWN0dXJlCi0gKiBAdHNmX2JpdHMgLS0gbnVtYmVyIG9mIGJpdHMgbmVlZCB0byBzaGlmdCBmb3IgbWFza2luZykKLSAqLwotc3RhdGljIGlubGluZSB1MzIgaXdsX2xlZ2FjeV9iZWFjb25fdGltZV9tYXNrX2hpZ2goc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgdTE2IHRzZl9iaXRzKQotewotCXJldHVybiAoKDEgPDwgKDMyIC0gdHNmX2JpdHMpKSAtIDEpIDw8IHRzZl9iaXRzOwotfQotCi0jZW5kaWYJCQkJLyogX19pd2xfbGVnYWN5X2hlbHBlcnNfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaW8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2M1ZDM0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1pby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2lvX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfaW9faF9fCi0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgotI2luY2x1ZGUgIml3bC1kZXZ0cmFjZS5oIgotCi0vKgotICogSU8sIHJlZ2lzdGVyLCBhbmQgTklDIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zCi0gKgotICogTk9URSBvbiBuYW1pbmcgY29udmVudGlvbiBhbmQgbWFjcm8gdXNhZ2UgZm9yIHRoZXNlCi0gKgotICogQSBzaW5nbGUgXyBwcmVmaXggYmVmb3JlIGEgYW4gYWNjZXNzIGZ1bmN0aW9uIG1lYW5zIHRoYXQgbm8gc3RhdGUKLSAqIGNoZWNrIG9yIGRlYnVnIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgd2hlbiB0aGF0IGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAqCi0gKiBBIGRvdWJsZSBfXyBwcmVmaXggYmVmb3JlIGFuIGFjY2VzcyBmdW5jdGlvbiBtZWFucyB0aGF0IHN0YXRlIGlzIGNoZWNrZWQKLSAqIGFuZCB0aGUgY3VycmVudCBsaW5lIG51bWJlciBhbmQgY2FsbGVyIGZ1bmN0aW9uIG5hbWUgYXJlIHByaW50ZWQgaW4gYWRkaXRpb24KLSAqIHRvIGFueSBvdGhlciBkZWJ1ZyBvdXRwdXQuCi0gKgotICogVGhlIG5vbi1wcmVmaXhlZCBuYW1lIGlzIHRoZSAjZGVmaW5lIHRoYXQgbWFwcyB0aGUgY2FsbGVyIGludG8gYQotICogI2RlZmluZSB0aGF0IHByb3ZpZGVzIHRoZSBjYWxsZXIncyBuYW1lIGFuZCBfX0xJTkVfXyB0byB0aGUgZG91YmxlCi0gKiBwcmVmaXggdmVyc2lvbi4KLSAqCi0gKiBJZiB5b3Ugd2lzaCB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRob3V0IGFueSBkZWJ1ZyBvciBzdGF0ZSBjaGVja2luZywKLSAqIHlvdSBzaG91bGQgdXNlIHRoZSBzaW5nbGUgXyBwcmVmaXggdmVyc2lvbiAoYXMgaXMgdXNlZCBieSBkZXBlbmRlbnQgSU8KLSAqIHJvdXRpbmVzLCBmb3IgZXhhbXBsZSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyIGNhbGxzIHRoZSBub24tY2hlY2sgdmVyc2lvbiBvZgotICogX2l3bF9sZWdhY3lfcmVhZDMyLikKLSAqCi0gKiBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlICpleHRyZW1lbHkqIHVzZWZ1bCBpbiBxdWlja2x5IGlzb2xhdGluZyBjb2RlIGRlbHRhcwotICogd2hpY2ggcmVzdWx0IGluIG1pc2NvbmZpZ3VyYXRpb24gb2YgdGhlIGhhcmR3YXJlIEkvTy4gIEluIGNvbWJpbmF0aW9uIHdpdGgKLSAqIGdpdC1iaXNlY3QgYW5kIHRoZSBJTyBkZWJ1ZyBsZXZlbCB5b3UgY2FuIHF1aWNrbHkgZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYwotICogY29tbWl0IHdoaWNoIGJyZWFrcyB0aGUgSU8gc2VxdWVuY2UgdG8gdGhlIGhhcmR3YXJlLgotICoKLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2l3bF9sZWdhY3lfd3JpdGU4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mcywgdTggdmFsKQotewotCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl9pb3dyaXRlOChwcml2LCBvZnMsIHZhbCk7Ci0JaW93cml0ZTgodmFsLCBwcml2LT5od19iYXNlICsgb2ZzKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSB2b2lkCi1fX2l3bF9sZWdhY3lfd3JpdGU4KGNvbnN0IGNoYXIgKmYsIHUzMiBsLCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHUzMiBvZnMsIHU4IHZhbCkKLXsKLQlJV0xfREVCVUdfSU8ocHJpdiwgIndyaXRlOCgweCUwOFgsIDB4JTAyWCkgLSAlcyAlZFxuIiwgb2ZzLCB2YWwsIGYsIGwpOwotCV9pd2xfbGVnYWN5X3dyaXRlOChwcml2LCBvZnMsIHZhbCk7Ci19Ci0jZGVmaW5lIGl3bF93cml0ZTgocHJpdiwgb2ZzLCB2YWwpIFwKLQlfX2l3bF9sZWdhY3lfd3JpdGU4KF9fRklMRV9fLCBfX0xJTkVfXywgcHJpdiwgb2ZzLCB2YWwpCi0jZWxzZQotI2RlZmluZSBpd2xfd3JpdGU4KHByaXYsIG9mcywgdmFsKSBfaXdsX2xlZ2FjeV93cml0ZTgocHJpdiwgb2ZzLCB2YWwpCi0jZW5kaWYKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2l3bF9sZWdhY3lfd3JpdGUzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZnMsIHUzMiB2YWwpCi17Ci0JdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X2lvd3JpdGUzMihwcml2LCBvZnMsIHZhbCk7Ci0JaW93cml0ZTMyKHZhbCwgcHJpdi0+aHdfYmFzZSArIG9mcyk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19pd2xfbGVnYWN5X3dyaXRlMzIoY29uc3QgY2hhciAqZiwgdTMyIGwsIHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgdTMyIG9mcywgdTMyIHZhbCkKLXsKLQlJV0xfREVCVUdfSU8ocHJpdiwgIndyaXRlMzIoMHglMDhYLCAweCUwOFgpIC0gJXMgJWRcbiIsIG9mcywgdmFsLCBmLCBsKTsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIG9mcywgdmFsKTsKLX0KLSNkZWZpbmUgaXdsX3dyaXRlMzIocHJpdiwgb2ZzLCB2YWwpIFwKLQlfX2l3bF9sZWdhY3lfd3JpdGUzMihfX0ZJTEVfXywgX19MSU5FX18sIHByaXYsIG9mcywgdmFsKQotI2Vsc2UKLSNkZWZpbmUgaXdsX3dyaXRlMzIocHJpdiwgb2ZzLCB2YWwpIF9pd2xfbGVnYWN5X3dyaXRlMzIocHJpdiwgb2ZzLCB2YWwpCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB1MzIgX2l3bF9sZWdhY3lfcmVhZDMyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mcykKLXsKLQl1MzIgdmFsID0gaW9yZWFkMzIocHJpdi0+aHdfYmFzZSArIG9mcyk7Ci0JdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X2lvcmVhZDMyKHByaXYsIG9mcywgdmFsKTsKLQlyZXR1cm4gdmFsOwotfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIHUzMgotX19pd2xfbGVnYWN5X3JlYWQzMihjaGFyICpmLCB1MzIgbCwgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgb2ZzKQotewotCUlXTF9ERUJVR19JTyhwcml2LCAicmVhZF9kaXJlY3QzMigweCUwOFgpIC0gJXMgJWRcbiIsIG9mcywgZiwgbCk7Ci0JcmV0dXJuIF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCBvZnMpOwotfQotI2RlZmluZSBpd2xfcmVhZDMyKHByaXYsIG9mcykgX19pd2xfbGVnYWN5X3JlYWQzMihfX0ZJTEVfXywgX19MSU5FX18sIHByaXYsIG9mcykKLSNlbHNlCi0jZGVmaW5lIGl3bF9yZWFkMzIocCwgbykgX2l3bF9sZWdhY3lfcmVhZDMyKHAsIG8pCi0jZW5kaWYKLQotI2RlZmluZSBJV0xfUE9MTF9JTlRFUlZBTCAxMAkvKiBtaWNyb3NlY29uZHMgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1faXdsX2xlZ2FjeV9wb2xsX2JpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyLAotCQkJCXUzMiBiaXRzLCB1MzIgbWFzaywgaW50IHRpbWVvdXQpCi17Ci0JaW50IHQgPSAwOwotCi0JZG8gewotCQlpZiAoKF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCBhZGRyKSAmIG1hc2spID09IChiaXRzICYgbWFzaykpCi0JCQlyZXR1cm4gdDsKLQkJdWRlbGF5KElXTF9QT0xMX0lOVEVSVkFMKTsKLQkJdCArPSBJV0xfUE9MTF9JTlRFUlZBTDsKLQl9IHdoaWxlICh0IDwgdGltZW91dCk7Ci0KLQlyZXR1cm4gLUVUSU1FRE9VVDsKLX0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyBpbmxpbmUgaW50IF9faXdsX2xlZ2FjeV9wb2xsX2JpdChjb25zdCBjaGFyICpmLCB1MzIgbCwKLQkJCQkgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgYWRkciwKLQkJCQkgdTMyIGJpdHMsIHUzMiBtYXNrLCBpbnQgdGltZW91dCkKLXsKLQlpbnQgcmV0ID0gX2l3bF9sZWdhY3lfcG9sbF9iaXQocHJpdiwgYWRkciwgYml0cywgbWFzaywgdGltZW91dCk7Ci0JSVdMX0RFQlVHX0lPKHByaXYsICJwb2xsX2JpdCgweCUwOFgsIDB4JTA4WCwgMHglMDhYKSAtICVzLSAlcyAlZFxuIiwKLQkJICAgICBhZGRyLCBiaXRzLCBtYXNrLAotCQkgICAgIHVubGlrZWx5KHJldCAgPT0gLUVUSU1FRE9VVCkgPyAidGltZW91dCIgOiAiIiwgZiwgbCk7Ci0JcmV0dXJuIHJldDsKLX0KLSNkZWZpbmUgaXdsX3BvbGxfYml0KHByaXYsIGFkZHIsIGJpdHMsIG1hc2ssIHRpbWVvdXQpIFwKLQlfX2l3bF9sZWdhY3lfcG9sbF9iaXQoX19GSUxFX18sIF9fTElORV9fLCBwcml2LCBhZGRyLCBcCi0JYml0cywgbWFzaywgdGltZW91dCkKLSNlbHNlCi0jZGVmaW5lIGl3bF9wb2xsX2JpdChwLCBhLCBiLCBtLCB0KSBfaXdsX2xlZ2FjeV9wb2xsX2JpdChwLCBhLCBiLCBtLCB0KQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfaXdsX2xlZ2FjeV9zZXRfYml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIG1hc2spCi17Ci0JX2l3bF9sZWdhY3lfd3JpdGUzMihwcml2LCByZWcsIF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCByZWcpIHwgbWFzayk7Ci19Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pd2xfbGVnYWN5X3NldF9iaXQoY29uc3QgY2hhciAqZiwgdTMyIGwsCi0JCQkJIHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIG1hc2spCi17Ci0JdTMyIHZhbCA9IF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCByZWcpIHwgbWFzazsKLQlJV0xfREVCVUdfSU8ocHJpdiwgInNldF9iaXQoMHglMDhYLCAweCUwOFgpID0gMHglMDhYXG4iLCByZWcsCi0JCQkJCQkJbWFzaywgdmFsKTsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIHJlZywgdmFsKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3NldF9iaXQoc3RydWN0IGl3bF9wcml2ICpwLCB1MzIgciwgdTMyIG0pCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JX19pd2xfbGVnYWN5X3NldF9iaXQoX19GSUxFX18sIF9fTElORV9fLCBwLCByLCBtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9zZXRfYml0KHN0cnVjdCBpd2xfcHJpdiAqcCwgdTMyIHIsIHUzMiBtKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCV9pd2xfbGVnYWN5X3NldF9iaXQocCwgciwgbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkCi1faXdsX2xlZ2FjeV9jbGVhcl9iaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKLXsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIHJlZywgX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIHJlZykgJiB+bWFzayk7Ci19Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXdsX2xlZ2FjeV9jbGVhcl9iaXQoY29uc3QgY2hhciAqZiwgdTMyIGwsCi0JCQkJICAgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKLXsKLQl1MzIgdmFsID0gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIHJlZykgJiB+bWFzazsKLQlJV0xfREVCVUdfSU8ocHJpdiwgImNsZWFyX2JpdCgweCUwOFgsIDB4JTA4WCkgPSAweCUwOFhcbiIsIHJlZywgbWFzaywgdmFsKTsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIHJlZywgdmFsKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2NsZWFyX2JpdChzdHJ1Y3QgaXdsX3ByaXYgKnAsIHUzMiByLCB1MzIgbSkKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlfX2l3bF9sZWdhY3lfY2xlYXJfYml0KF9fRklMRV9fLCBfX0xJTkVfXywgcCwgciwgbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfY2xlYXJfYml0KHN0cnVjdCBpd2xfcHJpdiAqcCwgdTMyIHIsIHUzMiBtKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCV9pd2xfbGVnYWN5X2NsZWFyX2JpdChwLCByLCBtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCBfaXdsX2xlZ2FjeV9ncmFiX25pY19hY2Nlc3Moc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQ7Ci0JdTMyIHZhbDsKLQotCS8qIHRoaXMgYml0IHdha2VzIHVwIHRoZSBOSUMgKi8KLQlfaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKLQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwotCi0JLyoKLQkgKiBUaGVzZSBiaXRzIHNheSB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcsIGFuZCBzaG91bGQga2VlcCBydW5uaW5nIGZvcgotCSAqIGF0IGxlYXN0IGEgc2hvcnQgd2hpbGUgKGF0IGxlYXN0IGFzIGxvbmcgYXMgTUFDX0FDQ0VTU19SRVEgc3RheXMgMSksCi0JICogYnV0IHRoZXkgZG8gbm90IGluZGljYXRlIHRoYXQgZW1iZWRkZWQgU1JBTSBpcyByZXN0b3JlZCB5ZXQ7Ci0JICogMzk0NSBhbmQgNDk2NSBoYXZlIHZvbGF0aWxlIFNSQU0sIGFuZCBtdXN0IHNhdmUvcmVzdG9yZSBjb250ZW50cwotCSAqIHRvL2Zyb20gaG9zdCBEUkFNIHdoZW4gc2xlZXBpbmcvd2FraW5nIGZvciBwb3dlci1zYXZpbmcuCi0JICogRWFjaCBkaXJlY3Rpb24gdGFrZXMgYXBwcm94aW1hdGVseSAxLzQgbWlsbGlzZWNvbmQ7IHdpdGggdGhpcwotCSAqIG92ZXJoZWFkLCBpdCdzIGEgZ29vZCBpZGVhIHRvIGdyYWIgYW5kIGhvbGQgTUFDX0FDQ0VTU19SRVFVRVNUIGlmIGEKLQkgKiBzZXJpZXMgb2YgcmVnaXN0ZXIgYWNjZXNzZXMgYXJlIGV4cGVjdGVkIChlLmcuIHJlYWRpbmcgRXZlbnQgTG9nKSwKLQkgKiB0byBrZWVwIGRldmljZSBmcm9tIHNsZWVwaW5nLgotCSAqCi0JICogQ1NSX1VDT0RFX0RSVl9HUDEgcmVnaXN0ZXIgYml0IE1BQ19TTEVFUCA9PSAwIGluZGljYXRlcyB0aGF0Ci0JICogU1JBTSBpcyBva2F5L3Jlc3RvcmVkLiAgV2UgZG9uJ3QgY2hlY2sgdGhhdCBoZXJlIGJlY2F1c2UgdGhpcyBjYWxsCi0JICogaXMganVzdCBmb3IgaGFyZHdhcmUgcmVnaXN0ZXIgYWNjZXNzOyBidXQgR1AxIE1BQ19TTEVFUCBjaGVjayBpcyBhCi0JICogZ29vZCBpZGVhIGJlZm9yZSBhY2Nlc3NpbmcgMzk0NS80OTY1IFNSQU0gKGUuZy4gcmVhZGluZyBFdmVudCBMb2cpLgotCSAqCi0JICovCi0JcmV0ID0gX2l3bF9sZWdhY3lfcG9sbF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAotCQkJICAgQ1NSX0dQX0NOVFJMX1JFR19WQUxfTUFDX0FDQ0VTU19FTiwKLQkJCSAgIChDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZIHwKLQkJCSAgICBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfR09JTkdfVE9fU0xFRVApLCAxNTAwMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJdmFsID0gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIENTUl9HUF9DTlRSTCk7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJNQUMgaXMgaW4gZGVlcCBzbGVlcCEuICBDU1JfR1BfQ05UUkwgPSAweCUwOFhcbiIsIHZhbCk7Ci0JCV9pd2xfbGVnYWN5X3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULAotCQkJCUNTUl9SRVNFVF9SRUdfRkxBR19GT1JDRV9OTUkpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSBpbnQgX19pd2xfbGVnYWN5X2dyYWJfbmljX2FjY2Vzcyhjb25zdCBjaGFyICpmLCB1MzIgbCwKLQkJCQkJICAgICAgIHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlJV0xfREVCVUdfSU8ocHJpdiwgImdyYWJiaW5nIG5pYyBhY2Nlc3MgLSAlcyAlZFxuIiwgZiwgbCk7Ci0JcmV0dXJuIF9pd2xfbGVnYWN5X2dyYWJfbmljX2FjY2Vzcyhwcml2KTsKLX0KLSNkZWZpbmUgaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KSBcCi0JX19pd2xfbGVnYWN5X2dyYWJfbmljX2FjY2VzcyhfX0ZJTEVfXywgX19MSU5FX18sIHByaXYpCi0jZWxzZQotI2RlZmluZSBpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpIFwKLQlfaXdsX2xlZ2FjeV9ncmFiX25pY19hY2Nlc3MocHJpdikKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2l3bF9sZWdhY3lfcmVsZWFzZV9uaWNfYWNjZXNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfaXdsX2xlZ2FjeV9jbGVhcl9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAotCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKLX0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2l3bF9sZWdhY3lfcmVsZWFzZV9uaWNfYWNjZXNzKGNvbnN0IGNoYXIgKmYsIHUzMiBsLAotCQkJCQkgICAgc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCi0JSVdMX0RFQlVHX0lPKHByaXYsICJyZWxlYXNpbmcgbmljIGFjY2VzcyAtICVzICVkXG4iLCBmLCBsKTsKLQlfaXdsX2xlZ2FjeV9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci19Ci0jZGVmaW5lIGl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdikgXAotCV9faXdsX2xlZ2FjeV9yZWxlYXNlX25pY19hY2Nlc3MoX19GSUxFX18sIF9fTElORV9fLCBwcml2KQotI2Vsc2UKLSNkZWZpbmUgaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KSBcCi0JX2l3bF9sZWdhY3lfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB1MzIgX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcpCi17Ci0JcmV0dXJuIF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCByZWcpOwotfQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSB1MzIgX19pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIoY29uc3QgY2hhciAqZiwgdTMyIGwsCi0JCQkJCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZykKLXsKLQl1MzIgdmFsdWUgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIHJlZyk7Ci0JSVdMX0RFQlVHX0lPKHByaXYsCi0JCQkicmVhZF9kaXJlY3QzMigweCU0WCkgPSAweCUwOHggLSAlcyAlZFxuIiwgcmVnLCB2YWx1ZSwKLQkJICAgICBmLCBsKTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnKQotewotCXUzMiB2YWx1ZTsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotCXZhbHVlID0gX19pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIoX19GSUxFX18sIF9fTElORV9fLCBwcml2LCByZWcpOwotCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi0jZWxzZQotc3RhdGljIGlubGluZSB1MzIgaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZykKLXsKLQl1MzIgdmFsdWU7Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KTsKLQl2YWx1ZSA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgcmVnKTsKLQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCXJldHVybiB2YWx1ZTsKLQotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSB1MzIgcmVnLCB1MzIgdmFsdWUpCi17Ci0JX2l3bF9sZWdhY3lfd3JpdGUzMihwcml2LCByZWcsIHZhbHVlKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpZiAoIWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdikpIHsKLQkJX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgcmVnLCB2YWx1ZSk7Ci0JCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV93cml0ZV9yZWdfYnVmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgICAgIHUzMiByZWcsIHUzMiBsZW4sIHUzMiAqdmFsdWVzKQotewotCXUzMiBjb3VudCA9IHNpemVvZih1MzIpOwotCi0JaWYgKChwcml2ICE9IE5VTEwpICYmICh2YWx1ZXMgIT0gTlVMTCkpIHsKLQkJZm9yICg7IDAgPCBsZW47IGxlbiAtPSBjb3VudCwgcmVnICs9IGNvdW50LCB2YWx1ZXMrKykKLQkJCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgcmVnLCAqdmFsdWVzKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9pd2xfbGVnYWN5X3BvbGxfZGlyZWN0X2JpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyLAotCQkJCSAgICAgICB1MzIgbWFzaywgaW50IHRpbWVvdXQpCi17Ci0JaW50IHQgPSAwOwotCi0JZG8gewotCQlpZiAoKGl3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCBhZGRyKSAmIG1hc2spID09IG1hc2spCi0JCQlyZXR1cm4gdDsKLQkJdWRlbGF5KElXTF9QT0xMX0lOVEVSVkFMKTsKLQkJdCArPSBJV0xfUE9MTF9JTlRFUlZBTDsKLQl9IHdoaWxlICh0IDwgdGltZW91dCk7Ci0KLQlyZXR1cm4gLUVUSU1FRE9VVDsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSBpbnQgX19pd2xfbGVnYWN5X3BvbGxfZGlyZWN0X2JpdChjb25zdCBjaGFyICpmLCB1MzIgbCwKLQkJCQkJICAgIHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHUzMiBhZGRyLCB1MzIgbWFzaywgaW50IHRpbWVvdXQpCi17Ci0JaW50IHJldCAgPSBfaXdsX2xlZ2FjeV9wb2xsX2RpcmVjdF9iaXQocHJpdiwgYWRkciwgbWFzaywgdGltZW91dCk7Ci0KLQlpZiAodW5saWtlbHkocmV0ID09IC1FVElNRURPVVQpKQotCQlJV0xfREVCVUdfSU8ocHJpdiwgInBvbGxfZGlyZWN0X2JpdCgweCUwOFgsIDB4JTA4WCkgLSAiCi0JCQkgICAgICJ0aW1lZG91dCAtICVzICVkXG4iLCBhZGRyLCBtYXNrLCBmLCBsKTsKLQllbHNlCi0JCUlXTF9ERUJVR19JTyhwcml2LCAicG9sbF9kaXJlY3RfYml0KDB4JTA4WCwgMHglMDhYKSA9IDB4JTA4WCAiCi0JCQkgICAgICItICVzICVkXG4iLCBhZGRyLCBtYXNrLCByZXQsIGYsIGwpOwotCXJldHVybiByZXQ7Ci19Ci0jZGVmaW5lIGl3bF9wb2xsX2RpcmVjdF9iaXQocHJpdiwgYWRkciwgbWFzaywgdGltZW91dCkgXAotX19pd2xfbGVnYWN5X3BvbGxfZGlyZWN0X2JpdChfX0ZJTEVfXywgX19MSU5FX18sIHByaXYsIGFkZHIsIG1hc2ssIHRpbWVvdXQpCi0jZWxzZQotI2RlZmluZSBpd2xfcG9sbF9kaXJlY3RfYml0IF9pd2xfbGVnYWN5X3BvbGxfZGlyZWN0X2JpdAotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdTMyIF9pd2xfbGVnYWN5X3JlYWRfcHJwaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcpCi17Ci0JX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1BSUEhfUkFERFIsIHJlZyB8ICgzIDw8IDI0KSk7Ci0Jcm1iKCk7Ci0JcmV0dXJuIF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1BSUEhfUkRBVCk7Ci19Ci1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X3JlYWRfcHJwaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcpCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0JdTMyIHZhbDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotCXZhbCA9IF9pd2xfbGVnYWN5X3JlYWRfcHJwaChwcml2LCByZWcpOwotCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9pd2xfbGVnYWN5X3dyaXRlX3BycGgoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgIHUzMiBhZGRyLCB1MzIgdmFsKQotewotCV9pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19QUlBIX1dBRERSLAotCQkJICAgICAgKChhZGRyICYgMHgwMDAwRkZGRikgfCAoMyA8PCAyNCkpKTsKLQl3bWIoKTsKLQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfUFJQSF9XREFULCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWl3bF9sZWdhY3lfd3JpdGVfcHJwaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1MzIgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWlmICghaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KSkgewotCQlfaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIGFkZHIsIHZhbCk7Ci0JCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotCi0jZGVmaW5lIF9pd2xfbGVnYWN5X3NldF9iaXRzX3BycGgocHJpdiwgcmVnLCBtYXNrKSBcCi1faXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZywgKF9pd2xfbGVnYWN5X3JlYWRfcHJwaChwcml2LCByZWcpIHwgbWFzaykpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXdsX2xlZ2FjeV9zZXRfYml0c19wcnBoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIG1hc2spCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KTsKLQlfaXdsX2xlZ2FjeV9zZXRfYml0c19wcnBoKHByaXYsIHJlZywgbWFzayk7Ci0JaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLQotI2RlZmluZSBfaXdsX2xlZ2FjeV9zZXRfYml0c19tYXNrX3BycGgocHJpdiwgcmVnLCBiaXRzLCBtYXNrKSBcCi1faXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZywJCQkJXAotCQkgKChfaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgcmVnKSAmIG1hc2spIHwgYml0cykpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3NldF9iaXRzX21hc2tfcHJwaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcsCi0JCQkJdTMyIGJpdHMsIHUzMiBtYXNrKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdik7Ci0JX2l3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHByaXYsIHJlZywgYml0cywgbWFzayk7Ci0JaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfY2xlYXJfYml0c19wcnBoKHN0cnVjdCBpd2xfcHJpdgotCQkJCQkJICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQl1MzIgdmFsOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdik7Ci0JdmFsID0gX2l3bF9sZWdhY3lfcmVhZF9wcnBoKHByaXYsIHJlZyk7Ci0JX2l3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCByZWcsICh2YWwgJiB+bWFzaykpOwotCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCXUzMiB2YWx1ZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotCi0JX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwgYWRkcik7Ci0Jcm1iKCk7Ci0JdmFsdWUgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0KLQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUzMiB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaWYgKCFpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpKSB7Ci0JCV9pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fV0FERFIsIGFkZHIpOwotCQl3bWIoKTsKLQkJX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9XREFULCB2YWwpOwotCQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtX2J1ZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyLAotCQkJCQkgIHUzMiBsZW4sIHUzMiAqdmFsdWVzKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWlmICghaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KSkgewotCQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1dBRERSLCBhZGRyKTsKLQkJd21iKCk7Ci0JCWZvciAoOyAwIDwgbGVuOyBsZW4gLT0gc2l6ZW9mKHUzMiksIHZhbHVlcysrKQotCQkJX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwKLQkJCQkJSEJVU19UQVJHX01FTV9XREFULCAqdmFsdWVzKTsKLQotCQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzU2OGE0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1sZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotCi0vKiBkZWZhdWx0OiBJV0xfTEVEX0JMSU5LKDApIHVzaW5nIGJsaW5raW5nIGluZGV4IHRhYmxlICovCi1zdGF0aWMgaW50IGxlZF9tb2RlOwotbW9kdWxlX3BhcmFtKGxlZF9tb2RlLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhsZWRfbW9kZSwgIjA9c3lzdGVtIGRlZmF1bHQsICIKLQkJIjE9T24oUkYgT24pL09mZihSRiBPZmYpLCAyPWJsaW5raW5nIik7Ci0KLS8qIFRocm91Z2hwdXQJCU9GRiB0aW1lKG1zKQlPTiB0aW1lIChtcykKLSAqCT4zMDAJCQkyNQkJMjUKLSAqCT4yMDAgdG8gMzAwCQk0MAkJNDAKLSAqCT4xMDAgdG8gMjAwCQk1NQkJNTUKLSAqCT43MCB0byAxMDAJCTY1CQk2NQotICoJPjUwIHRvIDcwCQk3NQkJNzUKLSAqCT4yMCB0byA1MAkJODUJCTg1Ci0gKgk+MTAgdG8gMjAJCTk1CQk5NQotICoJPjUgdG8gMTAJCTExMAkJMTEwCi0gKgk+MSB0byA1CQkJMTMwCQkxMzAKLSAqCT4wIHRvIDEJCQkxNjcJCTE2NwotICoJPD0wCQkJCQlTT0xJRCBPTgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90cHRfYmxpbmsgaXdsX2JsaW5rW10gPSB7Ci0JeyAudGhyb3VnaHB1dCA9IDAsIC5ibGlua190aW1lID0gMzM0IH0sCi0JeyAudGhyb3VnaHB1dCA9IDEgKiAxMDI0IC0gMSwgLmJsaW5rX3RpbWUgPSAyNjAgfSwKLQl7IC50aHJvdWdocHV0ID0gNSAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDIyMCB9LAotCXsgLnRocm91Z2hwdXQgPSAxMCAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDE5MCB9LAotCXsgLnRocm91Z2hwdXQgPSAyMCAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDE3MCB9LAotCXsgLnRocm91Z2hwdXQgPSA1MCAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDE1MCB9LAotCXsgLnRocm91Z2hwdXQgPSA3MCAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDEzMCB9LAotCXsgLnRocm91Z2hwdXQgPSAxMDAgKiAxMDI0IC0gMSwgLmJsaW5rX3RpbWUgPSAxMTAgfSwKLQl7IC50aHJvdWdocHV0ID0gMjAwICogMTAyNCAtIDEsIC5ibGlua190aW1lID0gODAgfSwKLQl7IC50aHJvdWdocHV0ID0gMzAwICogMTAyNCAtIDEsIC5ibGlua190aW1lID0gNTAgfSwKLX07Ci0KLS8qCi0gKiBBZGp1c3QgbGVkIGJsaW5rIHJhdGUgdG8gY29tcGVuc2F0ZSBvbiBhIE1BQyBDbG9jayBkaWZmZXJlbmNlIG9uIGV2ZXJ5IEhXCi0gKiBMZWQgYmxpbmsgcmF0ZSBhbmFseXNpcyBzaG93ZWQgYW4gYXZlcmFnZSBkZXZpYXRpb24gb2YgMCUgb24gMzk0NSwKLSAqIDUlIG9uIDQ5NjUgSFcuCi0gKiBOZWVkIHRvIGNvbXBlbnNhdGUgb24gdGhlIGxlZCBvbi9vZmYgdGltZSBwZXIgSFcgYWNjb3JkaW5nIHRvIHRoZSBkZXZpYXRpb24KLSAqIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgbGVkIGZyZXF1ZW5jeQotICogVGhlIGNhbGN1bGF0aW9uIGlzOiAoMTAwLWF2ZXJhZ2VEZXZpYXRpb24pLzEwMCAqIGJsaW5rVGltZQotICogRm9yIGNvZGUgZWZmaWNpZW5jeSB0aGUgY2FsY3VsYXRpb24gd2lsbCBiZToKLSAqICAgICBjb21wZW5zYXRpb24gPSAoMTAwIC0gYXZlcmFnZURldmlhdGlvbikgKiA2NCAvIDEwMAotICogICAgIE5ld0JsaW5rVGltZSA9IChjb21wZW5zYXRpb24gKiBCbGlua1RpbWUpIC8gNjQKLSAqLwotc3RhdGljIGlubGluZSB1OCBpd2xfbGVnYWN5X2JsaW5rX2NvbXBlbnNhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHU4IHRpbWUsIHUxNiBjb21wZW5zYXRpb24pCi17Ci0JaWYgKCFjb21wZW5zYXRpb24pIHsKLQkJSVdMX0VSUihwcml2LCAidW5kZWZpbmVkIGJsaW5rIGNvbXBlbnNhdGlvbjogIgotCQkJInVzZSBwcmUtZGVmaW5lZCBibGlua2luZyB0aW1lXG4iKTsKLQkJcmV0dXJuIHRpbWU7Ci0JfQotCi0JcmV0dXJuICh1OCkoKHRpbWUgKiBjb21wZW5zYXRpb24pID4+IDYpOwotfQotCi0vKiBTZXQgbGVkIHBhdHRlcm4gY29tbWFuZCAqLwotc3RhdGljIGludCBpd2xfbGVnYWN5X2xlZF9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBvbiwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2ZmKQotewotCXN0cnVjdCBpd2xfbGVkX2NtZCBsZWRfY21kID0gewotCQkuaWQgPSBJV0xfTEVEX0xJTkssCi0JCS5pbnRlcnZhbCA9IElXTF9ERUZfTEVEX0lOVFJWTAotCX07Ci0JaW50IHJldDsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWlmIChwcml2LT5ibGlua19vbiA9PSBvbiAmJiBwcml2LT5ibGlua19vZmYgPT0gb2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmIChvZmYgPT0gMCkgewotCQkvKiBsZWQgaXMgU09MSURfT04gKi8KLQkJb24gPSBJV0xfTEVEX1NPTElEOwotCX0KLQotCUlXTF9ERUJVR19MRUQocHJpdiwgIkxlZCBibGluayB0aW1lIGNvbXBlbnNhdGlvbj0ldVxuIiwKLQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmxlZF9jb21wZW5zYXRpb24pOwotCWxlZF9jbWQub24gPSBpd2xfbGVnYWN5X2JsaW5rX2NvbXBlbnNhdGlvbihwcml2LCBvbiwKLQkJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKLQlsZWRfY21kLm9mZiA9IGl3bF9sZWdhY3lfYmxpbmtfY29tcGVuc2F0aW9uKHByaXYsIG9mZiwKLQkJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKLQotCXJldCA9IHByaXYtPmNmZy0+b3BzLT5sZWQtPmNtZChwcml2LCAmbGVkX2NtZCk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJpdi0+Ymxpbmtfb24gPSBvbjsKLQkJcHJpdi0+Ymxpbmtfb2ZmID0gb2ZmOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKLQkJCQkgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgaXdsX3ByaXYsIGxlZCk7Ci0JdW5zaWduZWQgbG9uZyBvbiA9IDA7Ci0KLQlpZiAoYnJpZ2h0bmVzcyA+IDApCi0JCW9uID0gSVdMX0xFRF9TT0xJRDsKLQotCWl3bF9sZWdhY3lfbGVkX2NtZChwcml2LCBvbiwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9sZWRfYmxpbmtfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAotCQkJICAgICB1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGl3bF9wcml2LCBsZWQpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfbGVkX2NtZChwcml2LCAqZGVsYXlfb24sICpkZWxheV9vZmYpOwotfQotCi12b2lkIGl3bF9sZWdhY3lfbGVkc19pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgbW9kZSA9IGxlZF9tb2RlOwotCWludCByZXQ7Ci0KLQlpZiAobW9kZSA9PSBJV0xfTEVEX0RFRkFVTFQpCi0JCW1vZGUgPSBwcml2LT5jZmctPmxlZF9tb2RlOwotCi0JcHJpdi0+bGVkLm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzLWxlZCIsCi0JCQkJICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpKTsKLQlwcml2LT5sZWQuYnJpZ2h0bmVzc19zZXQgPSBpd2xfbGVnYWN5X2xlZF9icmlnaHRuZXNzX3NldDsKLQlwcml2LT5sZWQuYmxpbmtfc2V0ID0gaXdsX2xlZ2FjeV9sZWRfYmxpbmtfc2V0OwotCXByaXYtPmxlZC5tYXhfYnJpZ2h0bmVzcyA9IDE7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIElXTF9MRURfREVGQVVMVDoKLQkJV0FSTl9PTigxKTsKLQkJYnJlYWs7Ci0JY2FzZSBJV0xfTEVEX0JMSU5LOgotCQlwcml2LT5sZWQuZGVmYXVsdF90cmlnZ2VyID0KLQkJCWllZWU4MDIxMV9jcmVhdGVfdHB0X2xlZF90cmlnZ2VyKHByaXYtPmh3LAotCQkJCQlJRUVFODAyMTFfVFBUX0xFRFRSSUdfRkxfQ09OTkVDVEVELAotCQkJCQlpd2xfYmxpbmssIEFSUkFZX1NJWkUoaXdsX2JsaW5rKSk7Ci0JCWJyZWFrOwotCWNhc2UgSVdMX0xFRF9SRl9TVEFURToKLQkJcHJpdi0+bGVkLmRlZmF1bHRfdHJpZ2dlciA9Ci0JCQlpZWVlODAyMTFfZ2V0X3JhZGlvX2xlZF9uYW1lKHByaXYtPmh3KTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwcml2LT5wY2lfZGV2LT5kZXYsICZwcml2LT5sZWQpOwotCWlmIChyZXQpIHsKLQkJa2ZyZWUocHJpdi0+bGVkLm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpdi0+bGVkX3JlZ2lzdGVyZWQgPSB0cnVlOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2xlZHNfaW5pdCk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9sZWRzX2V4aXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWlmICghcHJpdi0+bGVkX3JlZ2lzdGVyZWQpCi0JCXJldHVybjsKLQotCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZwcml2LT5sZWQpOwotCWtmcmVlKHByaXYtPmxlZC5uYW1lKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9sZWRzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDc5MWY3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1sZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9faXdsX2xlZ2FjeV9sZWRzX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfbGVkc19oX18KLQotCi1zdHJ1Y3QgaXdsX3ByaXY7Ci0KLSNkZWZpbmUgSVdMX0xFRF9TT0xJRCAxMQotI2RlZmluZSBJV0xfREVGX0xFRF9JTlRSVkwgY3B1X3RvX2xlMzIoMTAwMCkKLQotI2RlZmluZSBJV0xfTEVEX0FDVElWSVRZICAgICAgICgwPDwxKQotI2RlZmluZSBJV0xfTEVEX0xJTksgICAgICAgICAgICgxPDwxKQotCi0vKgotICogTEVEIG1vZGUKLSAqICAgIElXTF9MRURfREVGQVVMVDogIHVzZSBkZXZpY2UgZGVmYXVsdAotICogICAgSVdMX0xFRF9SRl9TVEFURTogdHVybiBMRUQgb24vb2ZmIGJhc2VkIG9uIFJGIHN0YXRlCi0gKgkJCUxFRCBPTiAgPSBSRiBPTgotICoJCQlMRUQgT0ZGID0gUkYgT0ZGCi0gKiAgICBJV0xfTEVEX0JMSU5LOiAgICBhZGp1c3QgbGVkIGJsaW5rIHJhdGUgYmFzZWQgb24gYmxpbmsgdGFibGUKLSAqLwotZW51bSBpd2xfbGVkX21vZGUgewotCUlXTF9MRURfREVGQVVMVCwKLQlJV0xfTEVEX1JGX1NUQVRFLAotCUlXTF9MRURfQkxJTkssCi19OwotCi12b2lkIGl3bF9sZWdhY3lfbGVkc19pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bF9sZWdhY3lfbGVkc19leGl0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLSNlbmRpZiAvKiBfX2l3bF9sZWdhY3lfbGVkc19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1sZWdhY3ktcnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1sZWdhY3ktcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2NDdlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtbGVnYWN5LXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X3JzX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfcnNfaF9fCi0KLXN0cnVjdCBpd2xfcmF0ZV9pbmZvIHsKLQl1OCBwbGNwOwkvKiB1Q29kZSBBUEk6ICBJV0xfUkFURV82TV9QTENQLCBldGMuICovCi0JdTggcGxjcF9zaXNvOwkvKiB1Q29kZSBBUEk6ICBJV0xfUkFURV9TSVNPXzZNX1BMQ1AsIGV0Yy4gKi8KLQl1OCBwbGNwX21pbW8yOwkvKiB1Q29kZSBBUEk6ICBJV0xfUkFURV9NSU1PMl82TV9QTENQLCBldGMuICovCi0JdTggaWVlZTsJLyogTUFDIGhlYWRlcjogIElXTF9SQVRFXzZNX0lFRUUsIGV0Yy4gKi8KLQl1OCBwcmV2X2llZWU7ICAgIC8qIHByZXZpb3VzIHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KLQl1OCBuZXh0X2llZWU7ICAgIC8qIG5leHQgcmF0ZSBpbiBJRUVFIHNwZWVkcyAqLwotCXU4IHByZXZfcnM7ICAgICAgLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KLQl1OCBuZXh0X3JzOyAgICAgIC8qIG5leHQgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KLQl1OCBwcmV2X3JzX3RnZzsgIC8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLwotCXU4IG5leHRfcnNfdGdnOyAgLyogbmV4dCByYXRlIHVzZWQgaW4gVEdHIHJzIGFsZ28gKi8KLX07Ci0KLXN0cnVjdCBpd2wzOTQ1X3JhdGVfaW5mbyB7Ci0JdTggcGxjcDsJCS8qIHVDb2RlIEFQSTogIElXTF9SQVRFXzZNX1BMQ1AsIGV0Yy4gKi8KLQl1OCBpZWVlOwkJLyogTUFDIGhlYWRlcjogIElXTF9SQVRFXzZNX0lFRUUsIGV0Yy4gKi8KLQl1OCBwcmV2X2llZWU7CQkvKiBwcmV2aW91cyByYXRlIGluIElFRUUgc3BlZWRzICovCi0JdTggbmV4dF9pZWVlOwkJLyogbmV4dCByYXRlIGluIElFRUUgc3BlZWRzICovCi0JdTggcHJldl9yczsJCS8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBycyBhbGdvICovCi0JdTggbmV4dF9yczsJCS8qIG5leHQgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KLQl1OCBwcmV2X3JzX3RnZzsJCS8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLwotCXU4IG5leHRfcnNfdGdnOwkJLyogbmV4dCByYXRlIHVzZWQgaW4gVEdHIHJzIGFsZ28gKi8KLQl1OCB0YWJsZV9yc19pbmRleDsJLyogaW5kZXggaW4gcmF0ZSBzY2FsZSB0YWJsZSBjbWQgKi8KLQl1OCBwcmV2X3RhYmxlX3JzOwkvKiBwcmV2IGluIHJhdGUgdGFibGUgY21kICovCi19OwotCi0KLS8qCi0gKiBUaGVzZSBzZXJ2ZSBhcyBpbmRleGVzIGludG8KLSAqIHN0cnVjdCBpd2xfcmF0ZV9pbmZvIGl3bGVnYWN5X3JhdGVzW0lXTF9SQVRFX0NPVU5UXTsKLSAqLwotZW51bSB7Ci0JSVdMX1JBVEVfMU1fSU5ERVggPSAwLAotCUlXTF9SQVRFXzJNX0lOREVYLAotCUlXTF9SQVRFXzVNX0lOREVYLAotCUlXTF9SQVRFXzExTV9JTkRFWCwKLQlJV0xfUkFURV82TV9JTkRFWCwKLQlJV0xfUkFURV85TV9JTkRFWCwKLQlJV0xfUkFURV8xMk1fSU5ERVgsCi0JSVdMX1JBVEVfMThNX0lOREVYLAotCUlXTF9SQVRFXzI0TV9JTkRFWCwKLQlJV0xfUkFURV8zNk1fSU5ERVgsCi0JSVdMX1JBVEVfNDhNX0lOREVYLAotCUlXTF9SQVRFXzU0TV9JTkRFWCwKLQlJV0xfUkFURV82ME1fSU5ERVgsCi0JSVdMX1JBVEVfQ09VTlQsCi0JSVdMX1JBVEVfQ09VTlRfTEVHQUNZID0gSVdMX1JBVEVfQ09VTlQgLSAxLAkvKiBFeGNsdWRpbmcgNjBNICovCi0JSVdMX1JBVEVfQ09VTlRfMzk0NSA9IElXTF9SQVRFX0NPVU5UIC0gMSwKLQlJV0xfUkFURV9JTlZNX0lOREVYID0gSVdMX1JBVEVfQ09VTlQsCi0JSVdMX1JBVEVfSU5WQUxJRCA9IElXTF9SQVRFX0NPVU5ULAotfTsKLQotZW51bSB7Ci0JSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEUgPSAwLAotCUlXTF9SQVRFXzlNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzEyTV9JTkRFWF9UQUJMRSwKLQlJV0xfUkFURV8xOE1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfMjRNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzM2TV9JTkRFWF9UQUJMRSwKLQlJV0xfUkFURV80OE1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfNTRNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzFNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzJNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzVNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzExTV9JTkRFWF9UQUJMRSwKLQlJV0xfUkFURV9JTlZNX0lOREVYX1RBQkxFID0gSVdMX1JBVEVfSU5WTV9JTkRFWCAtIDEsCi19OwotCi1lbnVtIHsKLQlJV0xfRklSU1RfT0ZETV9SQVRFID0gSVdMX1JBVEVfNk1fSU5ERVgsCi0JSVdMMzlfTEFTVF9PRkRNX1JBVEUgPSBJV0xfUkFURV81NE1fSU5ERVgsCi0JSVdMX0xBU1RfT0ZETV9SQVRFID0gSVdMX1JBVEVfNjBNX0lOREVYLAotCUlXTF9GSVJTVF9DQ0tfUkFURSA9IElXTF9SQVRFXzFNX0lOREVYLAotCUlXTF9MQVNUX0NDS19SQVRFID0gSVdMX1JBVEVfMTFNX0lOREVYLAotfTsKLQotLyogI2RlZmluZSB2cy4gZW51bSB0byBrZWVwIGZyb20gZGVmYXVsdGluZyB0byAnbGFyZ2UgaW50ZWdlcicgKi8KLSNkZWZpbmUJSVdMX1JBVEVfNk1fTUFTSyAgICgxIDw8IElXTF9SQVRFXzZNX0lOREVYKQotI2RlZmluZQlJV0xfUkFURV85TV9NQVNLICAgKDEgPDwgSVdMX1JBVEVfOU1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzEyTV9NQVNLICAoMSA8PCBJV0xfUkFURV8xMk1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzE4TV9NQVNLICAoMSA8PCBJV0xfUkFURV8xOE1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzI0TV9NQVNLICAoMSA8PCBJV0xfUkFURV8yNE1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzM2TV9NQVNLICAoMSA8PCBJV0xfUkFURV8zNk1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzQ4TV9NQVNLICAoMSA8PCBJV0xfUkFURV80OE1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzU0TV9NQVNLICAoMSA8PCBJV0xfUkFURV81NE1fSU5ERVgpCi0jZGVmaW5lIElXTF9SQVRFXzYwTV9NQVNLICAoMSA8PCBJV0xfUkFURV82ME1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzFNX01BU0sgICAoMSA8PCBJV0xfUkFURV8xTV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfMk1fTUFTSyAgICgxIDw8IElXTF9SQVRFXzJNX0lOREVYKQotI2RlZmluZQlJV0xfUkFURV81TV9NQVNLICAgKDEgPDwgSVdMX1JBVEVfNU1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzExTV9NQVNLICAoMSA8PCBJV0xfUkFURV8xMU1fSU5ERVgpCi0KLS8qIHVDb2RlIEFQSSB2YWx1ZXMgZm9yIGxlZ2FjeSBiaXQgcmF0ZXMsIGJvdGggT0ZETSBhbmQgQ0NLICovCi1lbnVtIHsKLQlJV0xfUkFURV82TV9QTENQICA9IDEzLAotCUlXTF9SQVRFXzlNX1BMQ1AgID0gMTUsCi0JSVdMX1JBVEVfMTJNX1BMQ1AgPSA1LAotCUlXTF9SQVRFXzE4TV9QTENQID0gNywKLQlJV0xfUkFURV8yNE1fUExDUCA9IDksCi0JSVdMX1JBVEVfMzZNX1BMQ1AgPSAxMSwKLQlJV0xfUkFURV80OE1fUExDUCA9IDEsCi0JSVdMX1JBVEVfNTRNX1BMQ1AgPSAzLAotCUlXTF9SQVRFXzYwTV9QTENQID0gMywvKkZJWE1FOlJTOnNob3VsZCBiZSByZW1vdmVkKi8KLQlJV0xfUkFURV8xTV9QTENQICA9IDEwLAotCUlXTF9SQVRFXzJNX1BMQ1AgID0gMjAsCi0JSVdMX1JBVEVfNU1fUExDUCAgPSA1NSwKLQlJV0xfUkFURV8xMU1fUExDUCA9IDExMCwKLQkvKkZJWE1FOlJTOmFkZCBJV0xfUkFURV9MRUdBQ1lfSU5WTV9QTENQID0gMCwqLwotfTsKLQotLyogdUNvZGUgQVBJIHZhbHVlcyBmb3IgT0ZETSBoaWdoLXRocm91Z2hwdXQgKEhUKSBiaXQgcmF0ZXMgKi8KLWVudW0gewotCUlXTF9SQVRFX1NJU09fNk1fUExDUCA9IDAsCi0JSVdMX1JBVEVfU0lTT18xMk1fUExDUCA9IDEsCi0JSVdMX1JBVEVfU0lTT18xOE1fUExDUCA9IDIsCi0JSVdMX1JBVEVfU0lTT18yNE1fUExDUCA9IDMsCi0JSVdMX1JBVEVfU0lTT18zNk1fUExDUCA9IDQsCi0JSVdMX1JBVEVfU0lTT180OE1fUExDUCA9IDUsCi0JSVdMX1JBVEVfU0lTT181NE1fUExDUCA9IDYsCi0JSVdMX1JBVEVfU0lTT182ME1fUExDUCA9IDcsCi0JSVdMX1JBVEVfTUlNTzJfNk1fUExDUCAgPSAweDgsCi0JSVdMX1JBVEVfTUlNTzJfMTJNX1BMQ1AgPSAweDksCi0JSVdMX1JBVEVfTUlNTzJfMThNX1BMQ1AgPSAweGEsCi0JSVdMX1JBVEVfTUlNTzJfMjRNX1BMQ1AgPSAweGIsCi0JSVdMX1JBVEVfTUlNTzJfMzZNX1BMQ1AgPSAweGMsCi0JSVdMX1JBVEVfTUlNTzJfNDhNX1BMQ1AgPSAweGQsCi0JSVdMX1JBVEVfTUlNTzJfNTRNX1BMQ1AgPSAweGUsCi0JSVdMX1JBVEVfTUlNTzJfNjBNX1BMQ1AgPSAweGYsCi0JSVdMX1JBVEVfU0lTT19JTlZNX1BMQ1AsCi0JSVdMX1JBVEVfTUlNTzJfSU5WTV9QTENQID0gSVdMX1JBVEVfU0lTT19JTlZNX1BMQ1AsCi19OwotCi0vKiBNQUMgaGVhZGVyIHZhbHVlcyBmb3IgYml0IHJhdGVzICovCi1lbnVtIHsKLQlJV0xfUkFURV82TV9JRUVFICA9IDEyLAotCUlXTF9SQVRFXzlNX0lFRUUgID0gMTgsCi0JSVdMX1JBVEVfMTJNX0lFRUUgPSAyNCwKLQlJV0xfUkFURV8xOE1fSUVFRSA9IDM2LAotCUlXTF9SQVRFXzI0TV9JRUVFID0gNDgsCi0JSVdMX1JBVEVfMzZNX0lFRUUgPSA3MiwKLQlJV0xfUkFURV80OE1fSUVFRSA9IDk2LAotCUlXTF9SQVRFXzU0TV9JRUVFID0gMTA4LAotCUlXTF9SQVRFXzYwTV9JRUVFID0gMTIwLAotCUlXTF9SQVRFXzFNX0lFRUUgID0gMiwKLQlJV0xfUkFURV8yTV9JRUVFICA9IDQsCi0JSVdMX1JBVEVfNU1fSUVFRSAgPSAxMSwKLQlJV0xfUkFURV8xMU1fSUVFRSA9IDIyLAotfTsKLQotI2RlZmluZSBJV0xfQ0NLX0JBU0lDX1JBVEVTX01BU0sgICAgXAotCShJV0xfUkFURV8xTV9NQVNLICAgICAgICAgIHwgXAotCUlXTF9SQVRFXzJNX01BU0spCi0KLSNkZWZpbmUgSVdMX0NDS19SQVRFU19NQVNLICAgICAgICAgIFwKLQkoSVdMX0NDS19CQVNJQ19SQVRFU19NQVNLICB8IFwKLQlJV0xfUkFURV81TV9NQVNLICAgICAgICAgIHwgXAotCUlXTF9SQVRFXzExTV9NQVNLKQotCi0jZGVmaW5lIElXTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgICBcCi0JKElXTF9SQVRFXzZNX01BU0sgICAgICAgICB8IFwKLQlJV0xfUkFURV8xMk1fTUFTSyAgICAgICAgIHwgXAotCUlXTF9SQVRFXzI0TV9NQVNLKQotCi0jZGVmaW5lIElXTF9PRkRNX1JBVEVTX01BU0sgICAgICAgICBcCi0JKElXTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCi0JSVdMX1JBVEVfOU1fTUFTSyAgICAgICAgICB8IFwKLQlJV0xfUkFURV8xOE1fTUFTSyAgICAgICAgIHwgXAotCUlXTF9SQVRFXzM2TV9NQVNLICAgICAgICAgfCBcCi0JSVdMX1JBVEVfNDhNX01BU0sgICAgICAgICB8IFwKLQlJV0xfUkFURV81NE1fTUFTSykKLQotI2RlZmluZSBJV0xfQkFTSUNfUkFURVNfTUFTSyAgICAgICAgIFwKLQkoSVdMX09GRE1fQkFTSUNfUkFURVNfTUFTSyB8IFwKLQkgSVdMX0NDS19CQVNJQ19SQVRFU19NQVNLKQotCi0jZGVmaW5lIElXTF9SQVRFU19NQVNLICgoMSA8PCBJV0xfUkFURV9DT1VOVCkgLSAxKQotI2RlZmluZSBJV0xfUkFURVNfTUFTS18zOTQ1ICgoMSA8PCBJV0xfUkFURV9DT1VOVF8zOTQ1KSAtIDEpCi0KLSNkZWZpbmUgSVdMX0lOVkFMSURfVkFMVUUgICAgLTEKLQotI2RlZmluZSBJV0xfTUlOX1JTU0lfVkFMICAgICAgICAgICAgICAgICAtMTAwCi0jZGVmaW5lIElXTF9NQVhfUlNTSV9WQUwgICAgICAgICAgICAgICAgICAgIDAKLQotLyogVGhlc2UgdmFsdWVzIHNwZWNpZnkgaG93IG1hbnkgVHggZnJhbWUgYXR0ZW1wdHMgYmVmb3JlCi0gKiBzZWFyY2hpbmcgZm9yIGEgbmV3IG1vZHVsYXRpb24gbW9kZSAqLwotI2RlZmluZSBJV0xfTEVHQUNZX0ZBSUxVUkVfTElNSVQJMTYwCi0jZGVmaW5lIElXTF9MRUdBQ1lfU1VDQ0VTU19MSU1JVAk0ODAKLSNkZWZpbmUgSVdMX0xFR0FDWV9UQUJMRV9DT1VOVAkJMTYwCi0KLSNkZWZpbmUgSVdMX05PTkVfTEVHQUNZX0ZBSUxVUkVfTElNSVQJNDAwCi0jZGVmaW5lIElXTF9OT05FX0xFR0FDWV9TVUNDRVNTX0xJTUlUCTQ1MDAKLSNkZWZpbmUgSVdMX05PTkVfTEVHQUNZX1RBQkxFX0NPVU5UCTE1MDAKLQotLyogU3VjY2VzcyByYXRpbyAoQUNLZWQgLyBhdHRlbXB0ZWQgdHggZnJhbWVzKSB2YWx1ZXMgKHBlcmZlY3QgaXMgMTI4ICogMTAwKSAqLwotI2RlZmluZSBJV0xfUlNfR09PRF9SQVRJTwkJMTI4MDAJLyogMTAwJSAqLwotI2RlZmluZSBJV0xfUkFURV9TQ0FMRV9TV0lUQ0gJCTEwODgwCS8qICA4NSUgKi8KLSNkZWZpbmUgSVdMX1JBVEVfSElHSF9USAkJMTA4ODAJLyogIDg1JSAqLwotI2RlZmluZSBJV0xfUkFURV9JTkNSRUFTRV9USAkJNjQwMAkvKiAgNTAlICovCi0jZGVmaW5lIElXTF9SQVRFX0RFQ1JFQVNFX1RICQkxOTIwCS8qICAxNSUgKi8KLQotLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIGxlZ2FjeSBtb2RlICovCi0jZGVmaW5lIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExICAgICAgMAotI2RlZmluZSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMiAgICAgIDEKLSNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfU0lTTyAgICAgICAgICAyCi0jZGVmaW5lIElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FCICAgICAgMwotI2RlZmluZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQyAgICAgIDQKLSNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQkMgICAgICA1Ci0KLS8qIHBvc3NpYmxlIGFjdGlvbnMgd2hlbiBpbiBzaXNvIG1vZGUgKi8KLSNkZWZpbmUgSVdMX1NJU09fU1dJVENIX0FOVEVOTkExICAgICAgICAwCi0jZGVmaW5lIElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMiAgICAgICAgMQotI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUIgICAgICAgIDIKLSNkZWZpbmUgSVdMX1NJU09fU1dJVENIX01JTU8yX0FDICAgICAgICAzCi0jZGVmaW5lIElXTF9TSVNPX1NXSVRDSF9NSU1PMl9CQyAgICAgICAgNAotI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfR0kgICAgICAgICAgICAgIDUKLQotLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIG1pbW8gbW9kZSAqLwotI2RlZmluZSBJV0xfTUlNTzJfU1dJVENIX0FOVEVOTkExICAgICAgIDAKLSNkZWZpbmUgSVdMX01JTU8yX1NXSVRDSF9BTlRFTk5BMiAgICAgICAxCi0jZGVmaW5lIElXTF9NSU1PMl9TV0lUQ0hfU0lTT19BICAgICAgICAgMgotI2RlZmluZSBJV0xfTUlNTzJfU1dJVENIX1NJU09fQiAgICAgICAgIDMKLSNkZWZpbmUgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0MgICAgICAgICA0Ci0jZGVmaW5lIElXTF9NSU1PMl9TV0lUQ0hfR0kgICAgICAgICAgICAgNQotCi0jZGVmaW5lIElXTF9NQVhfU0VBUkNIIElXTF9NSU1PMl9TV0lUQ0hfR0kKLQotI2RlZmluZSBJV0xfQUNUSU9OX0xJTUlUCQkzCS8qICMgcG9zc2libGUgYWN0aW9ucyAqLwotCi0jZGVmaW5lIExRX1NJWkUJCTIJLyogMiBtb2RlIHRhYmxlczogICJBY3RpdmUiIGFuZCAiU2VhcmNoIiAqLwotCi0vKiBsb2FkIHBlciB0aWQgZGVmaW5lcyBmb3IgQS1NUERVIGFjdGl2YXRpb24gKi8KLSNkZWZpbmUgSVdMX0FHR19UUFRfVEhSRUhPTEQJMAotI2RlZmluZSBJV0xfQUdHX0xPQURfVEhSRVNIT0xECTEwCi0jZGVmaW5lIElXTF9BR0dfQUxMX1RJRAkJMHhmZgotI2RlZmluZSBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HCTUwCS8qbVMgKi8KLSNkZWZpbmUgVElEX1FVRVVFX01BWF9TSVpFCTIwCi0jZGVmaW5lIFRJRF9ST1VORF9WQUxVRQkJNQkvKiBtUyAqLwotI2RlZmluZSBUSURfTUFYX0xPQURfQ09VTlQJOAotCi0jZGVmaW5lIFRJRF9NQVhfVElNRV9ESUZGICgoVElEX1FVRVVFX01BWF9TSVpFIC0gMSkgKiBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HKQotI2RlZmluZSBUSU1FX1dSQVBfQVJPVU5EKHgsIHkpICgoKHkpID4gKHgpKSA/ICh5KSAtICh4KSA6ICgwLSh4KSkgKyAoeSkpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX3JhdGVfaW5mbyBpd2xlZ2FjeV9yYXRlc1tJV0xfUkFURV9DT1VOVF07Ci0KLWVudW0gaXdsX3RhYmxlX3R5cGUgewotCUxRX05PTkUsCi0JTFFfRywJCS8qIGxlZ2FjeSB0eXBlcyAqLwotCUxRX0EsCi0JTFFfU0lTTywJLyogaGlnaC10aHJvdWdocHV0IHR5cGVzICovCi0JTFFfTUlNTzIsCi0JTFFfTUFYLAotfTsKLQotI2RlZmluZSBpc19sZWdhY3kodGJsKSAoKCh0YmwpID09IExRX0cpIHx8ICgodGJsKSA9PSBMUV9BKSkKLSNkZWZpbmUgaXNfc2lzbyh0YmwpICgodGJsKSA9PSBMUV9TSVNPKQotI2RlZmluZSBpc19taW1vMih0YmwpICgodGJsKSA9PSBMUV9NSU1PMikKLSNkZWZpbmUgaXNfbWltbyh0YmwpIChpc19taW1vMih0YmwpKQotI2RlZmluZSBpc19IdCh0YmwpIChpc19zaXNvKHRibCkgfHwgaXNfbWltbyh0YmwpKQotI2RlZmluZSBpc19hX2JhbmQodGJsKSAoKHRibCkgPT0gTFFfQSkKLSNkZWZpbmUgaXNfZ19hbmQodGJsKSAoKHRibCkgPT0gTFFfRykKLQotI2RlZmluZQlBTlRfTk9ORQkweDAKLSNkZWZpbmUJQU5UX0EJCUJJVCgwKQotI2RlZmluZQlBTlRfQgkJQklUKDEpCi0jZGVmaW5lCUFOVF9BQgkJKEFOVF9BIHwgQU5UX0IpCi0jZGVmaW5lIEFOVF9DCQlCSVQoMikKLSNkZWZpbmUJQU5UX0FDCQkoQU5UX0EgfCBBTlRfQykKLSNkZWZpbmUgQU5UX0JDCQkoQU5UX0IgfCBBTlRfQykKLSNkZWZpbmUgQU5UX0FCQwkJKEFOVF9BQiB8IEFOVF9DKQotCi0jZGVmaW5lIElXTF9NQVhfTUNTX0RJU1BMQVlfU0laRQkxMgotCi1zdHJ1Y3QgaXdsX3JhdGVfbWNzX2luZm8gewotCWNoYXIJbWJwc1tJV0xfTUFYX01DU19ESVNQTEFZX1NJWkVdOwotCWNoYXIJbWNzW0lXTF9NQVhfTUNTX0RJU1BMQVlfU0laRV07Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhIC0tIHR4IHN1Y2Nlc3MgaGlzdG9yeSBmb3Igb25lIHJhdGUKLSAqLwotc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgewotCXU2NCBkYXRhOwkJLyogYml0bWFwIG9mIHN1Y2Nlc3NmdWwgZnJhbWVzICovCi0JczMyIHN1Y2Nlc3NfY291bnRlcjsJLyogbnVtYmVyIG9mIGZyYW1lcyBzdWNjZXNzZnVsICovCi0JczMyIHN1Y2Nlc3NfcmF0aW87CS8qIHBlci1jZW50ICogMTI4ICAqLwotCXMzMiBjb3VudGVyOwkJLyogbnVtYmVyIG9mIGZyYW1lcyBhdHRlbXB0ZWQgKi8KLQlzMzIgYXZlcmFnZV90cHQ7CS8qIHN1Y2Nlc3MgcmF0aW8gKiBleHBlY3RlZCB0aHJvdWdocHV0ICovCi0JdW5zaWduZWQgbG9uZyBzdGFtcDsKLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAtLSB0eCBwYXJhbXMgYW5kIHN1Y2Nlc3MgaGlzdG9yeSBmb3IgYWxsIHJhdGVzCi0gKgotICogVGhlcmUgYXJlIHR3byBvZiB0aGVzZSBpbiBzdHJ1Y3QgaXdsX2xxX3N0YSwKLSAqIG9uZSBmb3IgImFjdGl2ZSIsIGFuZCBvbmUgZm9yICJzZWFyY2giLgotICovCi1zdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIHsKLQllbnVtIGl3bF90YWJsZV90eXBlIGxxX3R5cGU7Ci0JdTggYW50X3R5cGU7Ci0JdTggaXNfU0dJOwkvKiAxID0gc2hvcnQgZ3VhcmQgaW50ZXJ2YWwgKi8KLQl1OCBpc19odDQwOwkvKiAxID0gNDAgTUh6IGNoYW5uZWwgd2lkdGggKi8KLQl1OCBpc19kdXA7CS8qIDEgPSBkdXBsaWNhdGVkIGRhdGEgc3RyZWFtcyAqLwotCXU4IGFjdGlvbjsJLyogY2hhbmdlIG1vZHVsYXRpb247IElXTF9bTEVHQUNZL1NJU08vTUlNT11fU1dJVENIXyogKi8KLQl1OCBtYXhfc2VhcmNoOwkvKiBtYXhpbXVuIG51bWJlciBvZiB0YWJsZXMgd2UgY2FuIHNlYXJjaCAqLwotCXMzMiAqZXhwZWN0ZWRfdHB0OwkvKiB0aHJvdWdocHV0IG1ldHJpY3M7IGV4cGVjdGVkX3RwdF9HLCBldGMuICovCi0JdTMyIGN1cnJlbnRfcmF0ZTsgIC8qIHJhdGVfbl9mbGFncywgdUNvZGUgQVBJIGZvcm1hdCAqLwotCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhIHdpbltJV0xfUkFURV9DT1VOVF07IC8qIHJhdGUgaGlzdG9yaWVzICovCi19OwotCi1zdHJ1Y3QgaXdsX3RyYWZmaWNfbG9hZCB7Ci0JdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOwkvKiBhZ2Ugb2YgdGhlIG9sZGVzdCBzdGF0aXN0aWNzICovCi0JdTMyIHBhY2tldF9jb3VudFtUSURfUVVFVUVfTUFYX1NJWkVdOyAgIC8qIHBhY2tldCBjb3VudCBpbiB0aGlzIHRpbWUKLQkJCQkJCSAqIHNsaWNlICovCi0JdTMyIHRvdGFsOwkJCS8qIHRvdGFsIG51bSBvZiBwYWNrZXRzIGR1cmluZyB0aGUKLQkJCQkJICogbGFzdCBUSURfTUFYX1RJTUVfRElGRiAqLwotCXU4IHF1ZXVlX2NvdW50OwkJCS8qIG51bWJlciBvZiBxdWV1ZXMgdGhhdCBoYXMKLQkJCQkJICogYmVlbiB1c2VkIHNpbmNlIHRoZSBsYXN0IGNsZWFudXAgKi8KLQl1OCBoZWFkOwkJCS8qIHN0YXJ0IG9mIHRoZSBjaXJjdWxhciBidWZmZXIgKi8KLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF9scV9zdGEgLS0gZHJpdmVyJ3MgcmF0ZSBzY2FsaW5nIHByaXZhdGUgc3RydWN0dXJlCi0gKgotICogUG9pbnRlciB0byB0aGlzIGdldHMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gZHJpdmVyIGFuZCBtYWM4MDIxMS4KLSAqLwotc3RydWN0IGl3bF9scV9zdGEgewotCXU4IGFjdGl2ZV90Ymw7CQkvKiBpbmRleCBvZiBhY3RpdmUgdGFibGUsIHJhbmdlIDAtMSAqLwotCXU4IGVuYWJsZV9jb3VudGVyOwkvKiBpbmRpY2F0ZXMgSFQgbW9kZSAqLwotCXU4IHN0YXlfaW5fdGJsOwkJLyogMTogZGlzYWxsb3csIDA6IGFsbG93IHNlYXJjaCBmb3IgbmV3IG1vZGUgKi8KLQl1OCBzZWFyY2hfYmV0dGVyX3RibDsJLyogMTogY3VycmVudGx5IHRyeWluZyBhbHRlcm5hdGUgbW9kZSAqLwotCXMzMiBsYXN0X3RwdDsKLQotCS8qIFRoZSBmb2xsb3dpbmcgZGV0ZXJtaW5lIHdoZW4gdG8gc2VhcmNoIGZvciBhIG5ldyBtb2RlICovCi0JdTMyIHRhYmxlX2NvdW50X2xpbWl0OwotCXUzMiBtYXhfZmFpbHVyZV9saW1pdDsJLyogIyBmYWlsZWQgZnJhbWVzIGJlZm9yZSBuZXcgc2VhcmNoICovCi0JdTMyIG1heF9zdWNjZXNzX2xpbWl0OwkvKiAjIHN1Y2Nlc3NmdWwgZnJhbWVzIGJlZm9yZSBuZXcgc2VhcmNoICovCi0JdTMyIHRhYmxlX2NvdW50OwotCXUzMiB0b3RhbF9mYWlsZWQ7CS8qIHRvdGFsIGZhaWxlZCBmcmFtZXMsIGFueS9hbGwgcmF0ZXMgKi8KLQl1MzIgdG90YWxfc3VjY2VzczsJLyogdG90YWwgc3VjY2Vzc2Z1bCBmcmFtZXMsIGFueS9hbGwgcmF0ZXMgKi8KLQl1NjQgZmx1c2hfdGltZXI7CS8qIHRpbWUgc3RheWluZyBpbiBtb2RlIGJlZm9yZSBuZXcgc2VhcmNoICovCi0KLQl1OCBhY3Rpb25fY291bnRlcjsJLyogIyBtb2RlLXN3aXRjaCBhY3Rpb25zIHRyaWVkICovCi0JdTggaXNfZ3JlZW47Ci0JdTggaXNfZHVwOwotCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKLQotCS8qIFRoZSBmb2xsb3dpbmcgYXJlIGJpdG1hcHMgb2YgcmF0ZXM7IElXTF9SQVRFXzZNX01BU0ssIGV0Yy4gKi8KLQl1MzIgc3VwcF9yYXRlczsKLQl1MTYgYWN0aXZlX2xlZ2FjeV9yYXRlOwotCXUxNiBhY3RpdmVfc2lzb19yYXRlOwotCXUxNiBhY3RpdmVfbWltbzJfcmF0ZTsKLQlzOCBtYXhfcmF0ZV9pZHg7ICAgICAvKiBNYXggcmF0ZSBzZXQgYnkgdXNlciAqLwotCXU4IG1pc3NlZF9yYXRlX2NvdW50ZXI7Ci0KLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgbHE7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyBscV9pbmZvW0xRX1NJWkVdOyAvKiAiYWN0aXZlIiwgInNlYXJjaCIgKi8KLQlzdHJ1Y3QgaXdsX3RyYWZmaWNfbG9hZCBsb2FkW1RJRF9NQVhfTE9BRF9DT1VOVF07Ci0JdTggdHhfYWdnX3RpZF9lbjsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUwotCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9maWxlOwotCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlOwotCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19yYXRlX3NjYWxlX2RhdGFfZmlsZTsKLQlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfdHhfYWdnX3RpZF9lbl9maWxlOwotCXUzMiBkYmdfZml4ZWRfcmF0ZTsKLSNlbmRpZgotCXN0cnVjdCBpd2xfcHJpdiAqZHJ2OwotCi0JLyogdXNlZCB0byBiZSBpbiBzdGFfaW5mbyAqLwotCWludCBsYXN0X3R4cmF0ZV9pZHg7Ci0JLyogbGFzdCB0eCByYXRlX25fZmxhZ3MgKi8KLQl1MzIgbGFzdF9yYXRlX25fZmxhZ3M7Ci0JLyogcGFja2V0cyBkZXN0aW5lZCBmb3IgdGhpcyBTVEEgYXJlIGFnZ3JlZ2F0ZWQgKi8KLQl1OCBpc19hZ2c7Ci19OwotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDQ5NjVfbnVtX29mX2FudCh1OCBtYXNrKQotewotCXJldHVybiAgISEoKG1hc2spICYgQU5UX0EpICsKLQkJISEoKG1hc2spICYgQU5UX0IpICsKLQkJISEoKG1hc2spICYgQU5UX0MpOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDQ5NjVfZmlyc3RfYW50ZW5uYSh1OCBtYXNrKQotewotCWlmIChtYXNrICYgQU5UX0EpCi0JCXJldHVybiBBTlRfQTsKLQlpZiAobWFzayAmIEFOVF9CKQotCQlyZXR1cm4gQU5UX0I7Ci0JcmV0dXJuIEFOVF9DOwotfQotCi0KLS8qKgotICogaXdsMzk0NV9yYXRlX3NjYWxlX2luaXQgLSBJbml0aWFsaXplIHRoZSByYXRlIHNjYWxlIHRhYmxlIGJhc2VkIG9uIGFzc29jIGluZm8KLSAqCi0gKiBUaGUgc3BlY2lmaWMgdGhyb3VnaHB1dCB0YWJsZSB1c2VkIGlzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIG5ldHdvcmsKLSAqIHRoZSBhc3NvY2lhdGVkIHdpdGgsIGluY2x1ZGluZyBBLCBCLCBHLCBhbmQgRyB3LyBUR0cgcHJvdGVjdGlvbgotICovCi1leHRlcm4gdm9pZCBpd2wzOTQ1X3JhdGVfc2NhbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgczMyIHN0YV9pZCk7Ci0KLS8qIEluaXRpYWxpemUgc3RhdGlvbidzIHJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBhZnRlciBhZGRpbmcgc3RhdGlvbiAqLwotZXh0ZXJuIHZvaWQgaXdsNDk2NV9yc19yYXRlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCBzdGFfaWQpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9yc19yYXRlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCBzdGFfaWQpOwotCi0vKioKLSAqIGl3bF9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIgLSBSZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBjYWxsYmFja3MKLSAqCi0gKiBTaW5jZSB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBpcyBoYXJkd2FyZSBzcGVjaWZpYywgdGhlcmUgaXMgbm8gbmVlZAotICogb3IgcmVhc29uIHRvIHBsYWNlIGl0IGFzIGEgc3RhbmQgYWxvbmUgbW9kdWxlLiAgVGhlIGRyaXZlciBjYW4gY2FsbAotICogaXdsX3JhdGVfY29udHJvbF9yZWdpc3RlciBpbiBvcmRlciB0byByZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGNhbGxiYWNrcwotICogd2l0aCB0aGUgbWFjODAyMTEgc3Vic3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgcGVyZm9ybWVkIHByaW9yIHRvIGNhbGxpbmcKLSAqIGllZWU4MDIxMV9yZWdpc3Rlcl9odwotICoKLSAqLwotZXh0ZXJuIGludCBpd2w0OTY1X3JhdGVfY29udHJvbF9yZWdpc3Rlcih2b2lkKTsKLWV4dGVybiBpbnQgaXdsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCk7Ci0KLS8qKgotICogaXdsX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyIC0gVW5yZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGNhbGxiYWNrcwotICoKLSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3LCBidXQgYmVmb3JlCi0gKiB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLgotICovCi1leHRlcm4gdm9pZCBpd2w0OTY1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKTsKLQotI2VuZGlmIC8qIF9faXdsX2xlZ2FjeV9yc19fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcG93ZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1wb3dlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDNlZjBkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1wb3dlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAotICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLXBvd2VyLmgiCi0KLS8qCi0gKiBTZXR0aW5nIHBvd2VyIGxldmVsIGFsbG93cyB0aGUgY2FyZCB0byBnbyB0byBzbGVlcCB3aGVuIG5vdCBidXN5LgotICoKLSAqIFdlIGNhbGN1bGF0ZSBhIHNsZWVwIGNvbW1hbmQgYmFzZWQgb24gdGhlIHJlcXVpcmVkIGxhdGVuY3ksIHdoaWNoCi0gKiB3ZSBnZXQgZnJvbSBtYWM4MDIxMS4gSW4gb3JkZXIgdG8gaGFuZGxlIHRoZXJtYWwgdGhyb3R0bGluZywgd2UgY2FuCi0gKiBhbHNvIHVzZSBwcmUtZGVmaW5lZCBwb3dlciBsZXZlbHMuCi0gKi8KLQotLyoKLSAqIFRoaXMgZGVmaW5lcyB0aGUgb2xkIHBvd2VyIGxldmVscy4gVGhleSBhcmUgc3RpbGwgdXNlZCBieSBkZWZhdWx0Ci0gKiAobGV2ZWwgMSkgYW5kIGZvciB0aGVybWFsIHRocm90dGxlIChsZXZlbHMgMyB0aHJvdWdoIDUpCi0gKi8KLQotc3RydWN0IGl3bF9wb3dlcl92ZWNfZW50cnkgewotCXN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgY21kOwotCXU4IG5vX2R0aW07CS8qIG51bWJlciBvZiBza2lwIGR0aW0gKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfcG93ZXJfc2xlZXBfY2FtX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgKmNtZCkKLXsKLQltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOwotCi0JaWYgKHByaXYtPnBvd2VyX2RhdGEucGNpX3BtKQotCQljbWQtPmZsYWdzIHw9IElXTF9QT1dFUl9QQ0lfUE1fTVNLOwotCi0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJTbGVlcCBjb21tYW5kIGZvciBDQU1cbiIpOwotfQotCi1zdGF0aWMgaW50Ci1pd2xfbGVnYWN5X3NldF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgKmNtZCkKLXsKLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlNlbmRpbmcgcG93ZXIvc2xlZXAgY29tbWFuZFxuIik7Ci0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJGbGFncyB2YWx1ZSA9IDB4JTA4WFxuIiwgY21kLT5mbGFncyk7Ci0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJUeCB0aW1lb3V0ID0gJXVcbiIsCi0JCQkJCWxlMzJfdG9fY3B1KGNtZC0+dHhfZGF0YV90aW1lb3V0KSk7Ci0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJSeCB0aW1lb3V0ID0gJXVcbiIsCi0JCQkJCWxlMzJfdG9fY3B1KGNtZC0+cnhfZGF0YV90aW1lb3V0KSk7Ci0JSVdMX0RFQlVHX1BPV0VSKHByaXYsCi0JCQkiU2xlZXAgaW50ZXJ2YWwgdmVjdG9yID0geyAlZCAsICVkICwgJWQgLCAlZCAsICVkIH1cbiIsCi0JCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzBdKSwKLQkJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbMV0pLAotCQkJbGUzMl90b19jcHUoY21kLT5zbGVlcF9pbnRlcnZhbFsyXSksCi0JCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzNdKSwKLQkJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbNF0pKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBQT1dFUl9UQUJMRV9DTUQsCi0JCQkJc2l6ZW9mKHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQpLCBjbWQpOwotfQotCi1pbnQKLWl3bF9sZWdhY3lfcG93ZXJfc2V0X21vZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kICpjbWQsCi0JCSAgICAgICBib29sIGZvcmNlKQotewotCWludCByZXQ7Ci0JYm9vbCB1cGRhdGVfY2hhaW5zOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JLyogRG9uJ3QgdXBkYXRlIHRoZSBSWCBjaGFpbiB3aGVuIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uIGlzIHJ1bm5pbmcgKi8KLQl1cGRhdGVfY2hhaW5zID0gcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5zdGF0ZSA9PSBJV0xfQ0hBSU5fTk9JU0VfRE9ORSB8fAotCQkJcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5zdGF0ZSA9PSBJV0xfQ0hBSU5fTk9JU0VfQUxJVkU7Ci0KLQlpZiAoIW1lbWNtcCgmcHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWQsIGNtZCwgc2l6ZW9mKCpjbWQpKSAmJiAhZm9yY2UpCi0JCXJldHVybiAwOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qIHNjYW4gY29tcGxldGUgdXNlIHNsZWVwX3Bvd2VyX25leHQsIG5lZWQgdG8gYmUgdXBkYXRlZCAqLwotCW1lbWNweSgmcHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWRfbmV4dCwgY21kLCBzaXplb2YoKmNtZCkpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpICYmICFmb3JjZSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRGVmZXIgcG93ZXIgc2V0IG1vZGUgd2hpbGUgc2Nhbm5pbmdcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY21kLT5mbGFncyAmIElXTF9QT1dFUl9EUklWRVJfQUxMT1dfU0xFRVBfTVNLKQotCQlzZXRfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZXRfcG93ZXIocHJpdiwgY21kKTsKLQlpZiAoIXJldCkgewotCQlpZiAoIShjbWQtPmZsYWdzICYgSVdMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0spKQotCQkJY2xlYXJfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpOwotCi0JCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MgJiYgdXBkYXRlX2NoYWlucykKLQkJCXByaXYtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyhwcml2KTsKLQkJZWxzZSBpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQotCQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsCi0JCQkJCSJDYW5ub3QgdXBkYXRlIHRoZSBwb3dlciwgY2hhaW4gbm9pc2UgIgotCQkJCQkiY2FsaWJyYXRpb24gcnVubmluZzogJWRcbiIsCi0JCQkJCXByaXYtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUpOwotCi0JCW1lbWNweSgmcHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKLQl9IGVsc2UKLQkJSVdMX0VSUihwcml2LCAic2V0IHBvd2VyIGZhaWwsIHJldCA9ICVkIiwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBpd2xfbGVnYWN5X3Bvd2VyX3VwZGF0ZV9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmb3JjZSkKLXsKLQlzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kIGNtZDsKLQotCWl3bF9sZWdhY3lfcG93ZXJfc2xlZXBfY2FtX2NtZChwcml2LCAmY21kKTsKLQlyZXR1cm4gaXdsX2xlZ2FjeV9wb3dlcl9zZXRfbW9kZShwcml2LCAmY21kLCBmb3JjZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUpOwotCi0vKiBpbml0aWFsaXplIHRvIGRlZmF1bHQgKi8KLXZvaWQgaXdsX2xlZ2FjeV9wb3dlcl9pbml0aWFsaXplKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MTYgbGN0bCA9IGl3bF9sZWdhY3lfcGNpZV9saW5rX2N0bChwcml2KTsKLQotCXByaXYtPnBvd2VyX2RhdGEucGNpX3BtID0gIShsY3RsICYgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wwU19FTik7Ci0KLQlwcml2LT5wb3dlcl9kYXRhLmRlYnVnX3NsZWVwX2xldmVsX292ZXJyaWRlID0gLTE7Ci0KLQltZW1zZXQoJnByaXYtPnBvd2VyX2RhdGEuc2xlZXBfY21kLCAwLAotCQlzaXplb2YocHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9wb3dlcl9pbml0aWFsaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1wb3dlci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBvd2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGIzNmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBvd2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19pd2xfbGVnYWN5X3Bvd2VyX3NldHRpbmdfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9wb3dlcl9zZXR0aW5nX2hfXwotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0KLWVudW0gaXdsX3Bvd2VyX2xldmVsIHsKLQlJV0xfUE9XRVJfSU5ERVhfMSwKLQlJV0xfUE9XRVJfSU5ERVhfMiwKLQlJV0xfUE9XRVJfSU5ERVhfMywKLQlJV0xfUE9XRVJfSU5ERVhfNCwKLQlJV0xfUE9XRVJfSU5ERVhfNSwKLQlJV0xfUE9XRVJfTlVNCi19OwotCi1zdHJ1Y3QgaXdsX3Bvd2VyX21nciB7Ci0Jc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCBzbGVlcF9jbWQ7Ci0Jc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCBzbGVlcF9jbWRfbmV4dDsKLQlpbnQgZGVidWdfc2xlZXBfbGV2ZWxfb3ZlcnJpZGU7Ci0JYm9vbCBwY2lfcG07Ci19OwotCi1pbnQKLWl3bF9sZWdhY3lfcG93ZXJfc2V0X21vZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kICpjbWQsCi0JCSAgICAgICBib29sIGZvcmNlKTsKLWludCBpd2xfbGVnYWN5X3Bvd2VyX3VwZGF0ZV9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmb3JjZSk7Ci12b2lkIGl3bF9sZWdhY3lfcG93ZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0jZW5kaWYgIC8qIF9faXdsX2xlZ2FjeV9wb3dlcl9zZXR0aW5nX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBycGguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1wcnBoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTQ5MzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBycGguaAorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmCV9faXdsX2xlZ2FjeV9wcnBoX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfcHJwaF9oX18KLQotLyoKLSAqIFJlZ2lzdGVycyBpbiB0aGlzIGZpbGUgYXJlIGludGVybmFsLCBub3QgUENJIGJ1cyBtZW1vcnkgbWFwcGVkLgotICogRHJpdmVyIGFjY2Vzc2VzIHRoZXNlIHZpYSBIQlVTX1RBUkdfUFJQSF8qIHJlZ2lzdGVycy4KLSAqLwotI2RlZmluZSBQUlBIX0JBU0UJKDB4MDAwMDApCi0jZGVmaW5lIFBSUEhfRU5ECSgweEZGRkZGKQotCi0vKiBBUE1HIChwb3dlciBtYW5hZ2VtZW50KSBjb25zdGFudHMgKi8KLSNkZWZpbmUgQVBNR19CQVNFCQkJKFBSUEhfQkFTRSArIDB4MzAwMCkKLSNkZWZpbmUgQVBNR19DTEtfQ1RSTF9SRUcJCShBUE1HX0JBU0UgKyAweDAwMDApCi0jZGVmaW5lIEFQTUdfQ0xLX0VOX1JFRwkJCShBUE1HX0JBU0UgKyAweDAwMDQpCi0jZGVmaW5lIEFQTUdfQ0xLX0RJU19SRUcJCShBUE1HX0JBU0UgKyAweDAwMDgpCi0jZGVmaW5lIEFQTUdfUFNfQ1RSTF9SRUcJCShBUE1HX0JBU0UgKyAweDAwMGMpCi0jZGVmaW5lIEFQTUdfUENJREVWX1NUVF9SRUcJCShBUE1HX0JBU0UgKyAweDAwMTApCi0jZGVmaW5lIEFQTUdfUkZLSUxMX1JFRwkJCShBUE1HX0JBU0UgKyAweDAwMTQpCi0jZGVmaW5lIEFQTUdfUlRDX0lOVF9TVFRfUkVHCQkoQVBNR19CQVNFICsgMHgwMDFjKQotI2RlZmluZSBBUE1HX1JUQ19JTlRfTVNLX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAyMCkKLSNkZWZpbmUgQVBNR19ESUdJVEFMX1NWUl9SRUcJCShBUE1HX0JBU0UgKyAweDAwNTgpCi0jZGVmaW5lIEFQTUdfQU5BTE9HX1NWUl9SRUcJCShBUE1HX0JBU0UgKyAweDAwNkMpCi0KLSNkZWZpbmUgQVBNU19DTEtfVkFMX01SQl9GVU5DX01PREUJKDB4MDAwMDAwMDEpCi0jZGVmaW5lIEFQTUdfQ0xLX1ZBTF9ETUFfQ0xLX1JRVAkoMHgwMDAwMDIwMCkKLSNkZWZpbmUgQVBNR19DTEtfVkFMX0JTTV9DTEtfUlFUCSgweDAwMDAwODAwKQotCi0jZGVmaW5lIEFQTUdfUFNfQ1RSTF9FQVJMWV9QV1JfT0ZGX1JFU0VUX0RJUwkoMHgwMDQwMDAwMCkKLSNkZWZpbmUgQVBNR19QU19DVFJMX1ZBTF9SRVNFVF9SRVEJCSgweDA0MDAwMDAwKQotI2RlZmluZSBBUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMJCSgweDAzMDAwMDAwKQotI2RlZmluZSBBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVk1BSU4JCSgweDAwMDAwMDAwKQotI2RlZmluZSBBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfTUFYCQkoMHgwMTAwMDAwMCkgLyogMzk0NSBvbmx5ICovCi0jZGVmaW5lIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WQVVYCQkoMHgwMjAwMDAwMCkKLSNkZWZpbmUgQVBNR19TVlJfVk9MVEFHRV9DT05GSUdfQklUX01TSwkoMHgwMDAwMDFFMCkgLyogYml0IDg6NSAqLwotI2RlZmluZSBBUE1HX1NWUl9ESUdJVEFMX1ZPTFRBR0VfMV8zMgkJKDB4MDAwMDAwNjApCi0KLSNkZWZpbmUgQVBNR19QQ0lERVZfU1RUX1ZBTF9MMV9BQ1RfRElTCQkoMHgwMDAwMDgwMCkKLQotLyoqCi0gKiBCU00gKEJvb3RzdHJhcCBTdGF0ZSBNYWNoaW5lKQotICoKLSAqIFRoZSBCb290c3RyYXAgU3RhdGUgTWFjaGluZSAoQlNNKSBzdG9yZXMgYSBzaG9ydCBib290c3RyYXAgdUNvZGUgcHJvZ3JhbQotICogaW4gc3BlY2lhbCBTUkFNIHRoYXQgZG9lcyBub3QgcG93ZXIgZG93biB3aGVuIHRoZSBlbWJlZGRlZCBjb250cm9sCi0gKiBwcm9jZXNzb3IgaXMgc2xlZXBpbmcgKGUuZy4gZm9yIHBlcmlvZGljIHBvd2VyLXNhdmluZyBzaHV0ZG93bnMgb2YgcmFkaW8pLgotICoKLSAqIFdoZW4gcG93ZXJpbmcgYmFjayB1cCBhZnRlciBzbGVlcHMgKG9yIGR1cmluZyBpbml0aWFsIHVDb2RlIGxvYWQpLCB0aGUgQlNNCi0gKiBpbnRlcm5hbGx5IGxvYWRzIHRoZSBzaG9ydCBib290c3RyYXAgcHJvZ3JhbSBmcm9tIHRoZSBzcGVjaWFsIFNSQU0gaW50byB0aGUKLSAqIGVtYmVkZGVkIHByb2Nlc3NvcidzIGluc3RydWN0aW9uIFNSQU0sIGFuZCBzdGFydHMgdGhlIHByb2Nlc3NvciBzbyBpdCBydW5zCi0gKiB0aGUgYm9vdHN0cmFwIHByb2dyYW0uCi0gKgotICogVGhpcyBib290c3RyYXAgcHJvZ3JhbSBsb2FkcyAodmlhIFBDSSBidXNtYXN0ZXIgRE1BKSBpbnN0cnVjdGlvbnMgYW5kIGRhdGEKLSAqIGltYWdlcyBmb3IgYSB1Q29kZSBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucy4gIFRoZSBob3N0IGRyaXZlcgotICogaW5kaWNhdGVzIERSQU0gbG9jYXRpb25zIGFuZCBzaXplcyBmb3IgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgaW1hZ2VzIHZpYSB0aGUKLSAqIGZvdXIgQlNNX0RSQU1fKiByZWdpc3RlcnMuICBPbmNlIHRoZSBib290c3RyYXAgcHJvZ3JhbSBsb2FkcyB0aGUgbmV3IHByb2dyYW0sCi0gKiB0aGUgbmV3IHByb2dyYW0gc3RhcnRzIGF1dG9tYXRpY2FsbHkuCi0gKgotICogVGhlIHVDb2RlIHVzZWQgZm9yIG9wZW4tc291cmNlIGRyaXZlcnMgaW5jbHVkZXMgdHdvIHByb2dyYW1zOgotICoKLSAqIDEpICBJbml0aWFsaXphdGlvbiAtLSBwZXJmb3JtcyBoYXJkd2FyZSBjYWxpYnJhdGlvbiBhbmQgc2V0cyB1cCBzb21lCi0gKiAgICAgaW50ZXJuYWwgZGF0YSwgdGhlbiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgbm90aWZpY2F0aW9uCi0gKiAgICAgKHN0cnVjdCBpd2xfaW5pdF9hbGl2ZV9yZXNwKSB0aGF0IGl0IGhhcyBjb21wbGV0ZWQgYWxsIG9mIGl0cyB3b3JrLgotICogICAgIEFmdGVyIHNpZ25hbCBmcm9tIGhvc3QsIGl0IHRoZW4gbG9hZHMgYW5kIHN0YXJ0cyB0aGUgcnVudGltZSBwcm9ncmFtLgotICogICAgIFRoZSBpbml0aWFsaXphdGlvbiBwcm9ncmFtIG11c3QgYmUgdXNlZCB3aGVuIGluaXRpYWxseSBzZXR0aW5nIHVwIHRoZQotICogICAgIE5JQyBhZnRlciBsb2FkaW5nIHRoZSBkcml2ZXIuCi0gKgotICogMikgIFJ1bnRpbWUvUHJvdG9jb2wgLS0gcGVyZm9ybXMgYWxsIG5vcm1hbCBydW50aW1lIG9wZXJhdGlvbnMuICBUaGlzCi0gKiAgICAgbm90aWZpZXMgaG9zdCB2aWEgImFsaXZlIiBub3RpZmljYXRpb24gKHN0cnVjdCBpd2xfYWxpdmVfcmVzcCkgdGhhdCBpdAotICogICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCi0gKgotICogV2hlbiBpbml0aWFsaXppbmcgdGhlIE5JQywgdGhlIGhvc3QgZHJpdmVyIGRvZXMgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmU6Ci0gKgotICogMSkgIExvYWQgYm9vdHN0cmFwIHByb2dyYW0gKGluc3RydWN0aW9ucyBvbmx5LCBubyBkYXRhIGltYWdlIGZvciBib290c3RyYXApCi0gKiAgICAgaW50byBib290c3RyYXAgbWVtb3J5LiAgVXNlIGR3b3JkIHdyaXRlcyBzdGFydGluZyBhdCBCU01fU1JBTV9MT1dFUl9CT1VORAotICoKLSAqIDIpICBQb2ludCAodmlhIEJTTV9EUkFNXyopIHRvIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24KLSAqICAgICBpbWFnZXMgaW4gaG9zdCBEUkFNLgotICoKLSAqIDMpICBTZXQgdXAgQlNNIHRvIGNvcHkgZnJvbSBCU00gU1JBTSBpbnRvIHVDb2RlIGluc3RydWN0aW9uIFNSQU0gd2hlbiBhc2tlZDoKLSAqICAgICBCU01fV1JfTUVNX1NSQ19SRUcgPSAwCi0gKiAgICAgQlNNX1dSX01FTV9EU1RfUkVHID0gUlRDX0lOU1RfTE9XRVJfQk9VTkQKLSAqICAgICBCU01fV1JfTUVNX0RXQ09VTlRfUkVHID0gIyBkd29yZHMgaW4gYm9vdHN0cmFwIGluc3RydWN0aW9uIGltYWdlCi0gKgotICogNCkgIExvYWQgYm9vdHN0cmFwIGludG8gaW5zdHJ1Y3Rpb24gU1JBTToKLSAqICAgICBCU01fV1JfQ1RSTF9SRUcgPSBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUCi0gKgotICogNSkgIFdhaXQgZm9yIGxvYWQgY29tcGxldGlvbjoKLSAqICAgICBQb2xsIEJTTV9XUl9DVFJMX1JFRyBmb3IgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCA9IDAKLSAqCi0gKiA2KSAgRW5hYmxlIGZ1dHVyZSBib290IGxvYWRzIHdoZW5ldmVyIE5JQydzIHBvd2VyIG1hbmFnZW1lbnQgdHJpZ2dlcnMgaXQ6Ci0gKiAgICAgQlNNX1dSX0NUUkxfUkVHID0gQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTgotICoKLSAqIDcpICBTdGFydCB0aGUgTklDIGJ5IHJlbW92aW5nIGFsbCByZXNldCBiaXRzOgotICogICAgIENTUl9SRVNFVCA9IDAKLSAqCi0gKiAgICAgVGhlIGJvb3RzdHJhcCB1Q29kZSAoYWxyZWFkeSBpbiBpbnN0cnVjdGlvbiBTUkFNKSBsb2FkcyBpbml0aWFsaXphdGlvbgotICogICAgIHVDb2RlLiAgSW5pdGlhbGl6YXRpb24gdUNvZGUgcGVyZm9ybXMgZGF0YSBpbml0aWFsaXphdGlvbiwgc2VuZHMKLSAqICAgICAiaW5pdGlhbGl6ZSBhbGl2ZSIgbm90aWZpY2F0aW9uIHRvIGhvc3QsIGFuZCB3YWl0cyBmb3IgYSBzaWduYWwgZnJvbQotICogICAgIGhvc3QgdG8gbG9hZCBydW50aW1lIGNvZGUuCi0gKgotICogNCkgIFBvaW50ICh2aWEgQlNNX0RSQU1fKikgdG8gdGhlICJydW50aW1lIiB1Q29kZSBkYXRhIGFuZCBpbnN0cnVjdGlvbgotICogICAgIGltYWdlcyBpbiBob3N0IERSQU0uICBUaGUgbGFzdCByZWdpc3RlciBsb2FkZWQgbXVzdCBiZSB0aGUgaW5zdHJ1Y3Rpb24KLSAqICAgICBieXRlIGNvdW50IHJlZ2lzdGVyICgiMSIgaW4gTVNiaXQgdGVsbHMgaW5pdGlhbGl6YXRpb24gdUNvZGUgdG8gbG9hZAotICogICAgIHRoZSBydW50aW1lIHVDb2RlKToKLSAqICAgICBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcgPSBieXRlIGNvdW50IHwgQlNNX0RSQU1fSU5TVF9MT0FECi0gKgotICogNSkgIFdhaXQgZm9yICJhbGl2ZSIgbm90aWZpY2F0aW9uLCB0aGVuIGlzc3VlIG5vcm1hbCBydW50aW1lIGNvbW1hbmRzLgotICoKLSAqIERhdGEgY2FjaGluZyBkdXJpbmcgcG93ZXItZG93bnM6Ci0gKgotICogSnVzdCBiZWZvcmUgdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIgcG93ZXJzIGRvd24gKGUuZyBmb3IgYXV0b21hdGljCi0gKiBwb3dlci1zYXZpbmcgbW9kZXMsIG9yIGZvciBSRktJTEwpLCB1Q29kZSBzdG9yZXMgKHZpYSBQQ0kgYnVzbWFzdGVyIERNQSkKLSAqIGEgY3VycmVudCBzbmFwc2hvdCBvZiB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yJ3MgZGF0YSBTUkFNIGludG8gaG9zdCBEUkFNLgotICogVGhpcyBjYWNoZXMgdGhlIGRhdGEgd2hpbGUgdGhlIGVtYmVkZGVkIHByb2Nlc3NvcidzIG1lbW9yeSBpcyBwb3dlcmVkIGRvd24uCi0gKiBMb2NhdGlvbiBhbmQgc2l6ZSBhcmUgY29udHJvbGxlZCBieSBCU01fRFJBTV9EQVRBXyogcmVnaXN0ZXJzLgotICoKLSAqIE5PVEU6ICBJbnN0cnVjdGlvbiBTUkFNIGRvZXMgbm90IG5lZWQgdG8gYmUgc2F2ZWQsIHNpbmNlIHRoYXQgZG9lc24ndAotICogICAgICAgIGNoYW5nZSBkdXJpbmcgb3BlcmF0aW9uOyB0aGUgb3JpZ2luYWwgaW1hZ2UgKGZyb20gdUNvZGUgZGlzdHJpYnV0aW9uCi0gKiAgICAgICAgZmlsZSkgY2FuIGJlIHVzZWQgZm9yIHJlbG9hZC4KLSAqCi0gKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgQm9vdHN0cmFwIGxvb2tzCi0gKiBhdCB0aGUgQlNNX0RSQU1fKiByZWdpc3RlcnMsIHdoaWNoIG5vdyBwb2ludCB0byB0aGUgcnVudGltZSBpbnN0cnVjdGlvbgotICogaW1hZ2UgYW5kIHRoZSBjYWNoZWQgKG1vZGlmaWVkKSBydW50aW1lIGRhdGEgKCpub3QqIHRoZSBpbml0aWFsaXphdGlvbgotICogdUNvZGUpLiAgQm9vdHN0cmFwIHJlbG9hZHMgdGhlc2UgcnVudGltZSBpbWFnZXMgaW50byBTUkFNLCBhbmQgcmVzdGFydHMgdGhlCi0gKiB1Q29kZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmIGJlZm9yZSB0aGUgcG93ZXItZG93bi4KLSAqCi0gKiBOT1RFOiAgSW5pdGlhbGl6YXRpb24gdUNvZGUgZG9lcyAqbm90KiBydW4gYXMgcGFydCBvZiB0aGUgc2F2ZS9yZXN0b3JlCi0gKiAgICAgICAgcHJvY2VkdXJlLgotICoKLSAqIFRoaXMgc2F2ZS9yZXN0b3JlIG1ldGhvZCBpcyBtb3N0bHkgZm9yIGF1dG9ub21vdXMgcG93ZXIgbWFuYWdlbWVudCBkdXJpbmcKLSAqIG5vcm1hbCBvcGVyYXRpb24gKHJlc3VsdCBvZiBQT1dFUl9UQUJMRV9DTUQpLiAgUGxhdGZvcm0gc3VzcGVuZC9yZXN1bWUgYW5kCi0gKiBSRktJTEwgc2hvdWxkIHVzZSBjb21wbGV0ZSByZXN0YXJ0cyAod2l0aCB0b3RhbCByZS1pbml0aWFsaXphdGlvbikgb2YgdUNvZGUsCi0gKiBhbGxvd2luZyB0b3RhbCBzaHV0ZG93biAoaW5jbHVkaW5nIEJTTSBtZW1vcnkpLgotICoKLSAqIE5vdGUgdGhhdCwgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24sIHRoZSBob3N0IERSQU0gdGhhdCBoZWxkIHRoZSBpbml0aWFsCi0gKiBzdGFydHVwIGRhdGEgZm9yIHRoZSBydW50aW1lIGNvZGUgaXMgbm93IGJlaW5nIHVzZWQgYXMgYSBiYWNrdXAgZGF0YSBjYWNoZQotICogZm9yIG1vZGlmaWVkIGRhdGEhICBJZiB5b3UgbmVlZCB0byBjb21wbGV0ZWx5IHJlLWluaXRpYWxpemUgdGhlIE5JQywgbWFrZQotICogc3VyZSB0aGF0IHlvdSB1c2UgdGhlIHJ1bnRpbWUgZGF0YSBpbWFnZSBmcm9tIHRoZSB1Q29kZSBkaXN0cmlidXRpb24gZmlsZSwKLSAqIG5vdCB0aGUgbW9kaWZpZWQvc2F2ZWQgcnVudGltZSBkYXRhLiAgWW91IG1heSB3YW50IHRvIHN0b3JlIGEgc2VwYXJhdGUKLSAqICJjbGVhbiIgcnVudGltZSBkYXRhIGltYWdlIGluIERSQU0gdG8gYXZvaWQgZGlzayByZWFkcyBvZiBkaXN0cmlidXRpb24gZmlsZS4KLSAqLwotCi0vKiBCU00gYml0IGZpZWxkcyAqLwotI2RlZmluZSBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUICAgICAoMHg4MDAwMDAwMCkgLyogc3RhcnQgYm9vdCBsb2FkIG5vdyAqLwotI2RlZmluZSBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUX0VOICAoMHg0MDAwMDAwMCkgLyogZW5hYmxlIGJvb3QgYWZ0ZXIgcHdydXAqLwotI2RlZmluZSBCU01fRFJBTV9JTlNUX0xPQUQgICAgICAgICAgICAoMHg4MDAwMDAwMCkgLyogc3RhcnQgcHJvZ3JhbSBsb2FkIG5vdyAqLwotCi0vKiBCU00gYWRkcmVzc2VzICovCi0jZGVmaW5lIEJTTV9CQVNFICAgICAgICAgICAgICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzQwMCkKLSNkZWZpbmUgQlNNX0VORCAgICAgICAgICAgICAgICAgICAgICAoUFJQSF9CQVNFICsgMHgzODAwKQotCi0jZGVmaW5lIEJTTV9XUl9DVFJMX1JFRyAgICAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDApIC8qIGN0bCBhbmQgc3RhdHVzICovCi0jZGVmaW5lIEJTTV9XUl9NRU1fU1JDX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDQpIC8qIHNvdXJjZSBpbiBCU00gbWVtICovCi0jZGVmaW5lIEJTTV9XUl9NRU1fRFNUX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDgpIC8qIGRlc3QgaW4gU1JBTSBtZW0gKi8KLSNkZWZpbmUgQlNNX1dSX0RXQ09VTlRfUkVHICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAwQykgLyogYnl0ZXMgKi8KLSNkZWZpbmUgQlNNX1dSX1NUQVRVU19SRUcgICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAxMCkgLyogYml0IDA6ICAxID09IGRvbmUgKi8KLQotLyoKLSAqIFBvaW50ZXJzIGFuZCBzaXplIHJlZ3MgZm9yIGJvb3RzdHJhcCBsb2FkIGFuZCBkYXRhIFNSQU0gc2F2ZS9yZXN0b3JlLgotICogTk9URTogIDM5NDUgcG9pbnRlcnMgdXNlIGJpdHMgMzE6MCBvZiBEUkFNIGFkZHJlc3MuCi0gKiAgICAgICAgNDk2NSBwb2ludGVycyB1c2UgYml0cyAzNTo0IG9mIERSQU0gYWRkcmVzcy4KLSAqLwotI2RlZmluZSBCU01fRFJBTV9JTlNUX1BUUl9SRUcgICAgICAgIChCU01fQkFTRSArIDB4MDkwKQotI2RlZmluZSBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcgIChCU01fQkFTRSArIDB4MDk0KQotI2RlZmluZSBCU01fRFJBTV9EQVRBX1BUUl9SRUcgICAgICAgIChCU01fQkFTRSArIDB4MDk4KQotI2RlZmluZSBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcgIChCU01fQkFTRSArIDB4MDlDKQotCi0vKgotICogQlNNIHNwZWNpYWwgbWVtb3J5LCBzdGF5cyBwb3dlcmVkIG9uIGR1cmluZyBwb3dlci1zYXZlIHNsZWVwcy4KLSAqIFJlYWQvd3JpdGUsIGFkZHJlc3MgcmFuZ2UgZnJvbSBMT1dFUl9CT1VORCB0byAoTE9XRVJfQk9VTkQgKyBTSVpFIC0xKQotICovCi0jZGVmaW5lIEJTTV9TUkFNX0xPV0VSX0JPVU5EICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzgwMCkKLSNkZWZpbmUgQlNNX1NSQU1fU0laRQkJCSgxMDI0KSAvKiBieXRlcyAqLwotCi0KLS8qIDM5NDUgVHggc2NoZWR1bGVyIHJlZ2lzdGVycyAqLwotI2RlZmluZSBBTE1fU0NEX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAoUFJQSF9CQVNFICsgMHgyRTAwKQotI2RlZmluZSBBTE1fU0NEX01PREVfUkVHICAgICAgICAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMDApCi0jZGVmaW5lIEFMTV9TQ0RfQVJBU1RBVF9SRUcgICAgICAgICAgICAgICAgIChBTE1fU0NEX0JBU0UgKyAweDAwNCkKLSNkZWZpbmUgQUxNX1NDRF9UWEZBQ1RfUkVHICAgICAgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDEwKQotI2RlZmluZSBBTE1fU0NEX1RYRjRNRl9SRUcgICAgICAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMTQpCi0jZGVmaW5lIEFMTV9TQ0RfVFhGNU1GX1JFRyAgICAgICAgICAgICAgICAgIChBTE1fU0NEX0JBU0UgKyAweDAyMCkKLSNkZWZpbmUgQUxNX1NDRF9TQllQX01PREVfMV9SRUcgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDJDKQotI2RlZmluZSBBTE1fU0NEX1NCWVBfTU9ERV8yX1JFRyAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMzApCi0KLS8qKgotICogVHggU2NoZWR1bGVyCi0gKgotICogVGhlIFR4IFNjaGVkdWxlciBzZWxlY3RzIHRoZSBuZXh0IGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLCBjaG9vc2luZyBURkRzCi0gKiAoVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvcnMpIGZyb20gdXAgdG8gMTYgY2lyY3VsYXIgVHggcXVldWVzIHJlc2lkZW50IGluCi0gKiBob3N0IERSQU0uICBJdCBzdGVlcnMgZWFjaCBmcmFtZSdzIFR4IGNvbW1hbmQgKHdoaWNoIGNvbnRhaW5zIHRoZSBmcmFtZQotICogZGF0YSkgaW50byBvbmUgb2YgdXAgdG8gNyBwcmlvcml0aXplZCBUeCBETUEgRklGTyBjaGFubmVscyB3aXRoaW4gdGhlCi0gKiBkZXZpY2UuICBBIHF1ZXVlIG1hcHMgdG8gb25seSBvbmUgKHNlbGVjdGFibGUgYnkgZHJpdmVyKSBUeCBETUEgY2hhbm5lbCwKLSAqIGJ1dCBvbmUgRE1BIGNoYW5uZWwgbWF5IHRha2UgaW5wdXQgZnJvbSBzZXZlcmFsIHF1ZXVlcy4KLSAqCi0gKiBUeCBETUEgRklGT3MgaGF2ZSBkZWRpY2F0ZWQgcHVycG9zZXMuICBGb3IgNDk2NSwgdGhleSBhcmUgdXNlZCBhcyBmb2xsb3dzCi0gKiAoY2YuIGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmbyBpbiBpd2wtNDk2NS5jKToKLSAqCi0gKiAwIC0tIEVEQ0EgQksgKGJhY2tncm91bmQpIGZyYW1lcywgbG93ZXN0IHByaW9yaXR5Ci0gKiAxIC0tIEVEQ0EgQkUgKGJlc3QgZWZmb3J0KSBmcmFtZXMsIG5vcm1hbCBwcmlvcml0eQotICogMiAtLSBFRENBIFZJICh2aWRlbykgZnJhbWVzLCBoaWdoZXIgcHJpb3JpdHkKLSAqIDMgLS0gRURDQSBWTyAodm9pY2UpIGFuZCBtYW5hZ2VtZW50IGZyYW1lcywgaGlnaGVzdCBwcmlvcml0eQotICogNCAtLSBDb21tYW5kcyAoZS5nLiBSWE9OLCBldGMuKQotICogNSAtLSB1bnVzZWQgKEhDQ0EpCi0gKiA2IC0tIHVudXNlZCAoSENDQSkKLSAqIDcgLS0gbm90IHVzZWQgYnkgZHJpdmVyIChkZXZpY2UtaW50ZXJuYWwgb25seSkKLSAqCi0gKgotICogRHJpdmVyIHNob3VsZCBub3JtYWxseSBtYXAgcXVldWVzIDAtNiB0byBUeCBETUEvRklGTyBjaGFubmVscyAwLTYuCi0gKiBJbiBhZGRpdGlvbiwgZHJpdmVyIGNhbiBtYXAgdGhlIHJlbWFpbmluZyBxdWV1ZXMgdG8gVHggRE1BL0ZJRk8KLSAqIGNoYW5uZWxzIDAtMyB0byBzdXBwb3J0IDExbiBhZ2dyZWdhdGlvbiB2aWEgRURDQSBETUEgY2hhbm5lbHMuCi0gKgotICogVGhlIGRyaXZlciBzZXRzIHVwIGVhY2ggcXVldWUgdG8gd29yayBpbiBvbmUgb2YgdHdvIG1vZGVzOgotICoKLSAqIDEpICBTY2hlZHVsZXItQWNrLCBpbiB3aGljaCB0aGUgc2NoZWR1bGVyIGF1dG9tYXRpY2FsbHkgc3VwcG9ydHMgYQotICogICAgIGJsb2NrLWFjayAoQkEpIHdpbmRvdyBvZiB1cCB0byA2NCBURkRzLiAgSW4gdGhpcyBtb2RlLCBlYWNoIHF1ZXVlCi0gKiAgICAgY29udGFpbnMgVEZEcyBmb3IgYSB1bmlxdWUgY29tYmluYXRpb24gb2YgUmVjaXBpZW50IEFkZHJlc3MgKFJBKQotICogICAgIGFuZCBUcmFmZmljIElkZW50aWZpZXIgKFRJRCksIHRoYXQgaXMsIHRyYWZmaWMgb2YgYSBnaXZlbgotICogICAgIFF1YWxpdHktT2YtU2VydmljZSAoUU9TKSBwcmlvcml0eSwgZGVzdGluZWQgZm9yIGEgc2luZ2xlIHN0YXRpb24uCi0gKgotICogICAgIEluIHNjaGVkdWxlci1hY2sgbW9kZSwgdGhlIHNjaGVkdWxlciBrZWVwcyB0cmFjayBvZiB0aGUgVHggc3RhdHVzIG9mCi0gKiAgICAgZWFjaCBmcmFtZSB3aXRoaW4gdGhlIEJBIHdpbmRvdywgaW5jbHVkaW5nIHdoZXRoZXIgaXQncyBiZWVuIHRyYW5zbWl0dGVkLAotICogICAgIGFuZCB3aGV0aGVyIGl0J3MgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlIHJlY2VpdmluZyBzdGF0aW9uLiAgVGhlIGRldmljZQotICogICAgIGF1dG9tYXRpY2FsbHkgcHJvY2Vzc2VzIGJsb2NrLWFja3MgcmVjZWl2ZWQgZnJvbSB0aGUgcmVjZWl2aW5nIFNUQSwKLSAqICAgICBhbmQgcmVzY2hlZHVsZXMgdW4tYWNrZWQgZnJhbWVzIHRvIGJlIHJldHJhbnNtaXR0ZWQgKHN1Y2Nlc3NmdWwKLSAqICAgICBUeCBjb21wbGV0aW9uIG1heSBlbmQgdXAgYmVpbmcgb3V0LW9mLW9yZGVyKS4KLSAqCi0gKiAgICAgVGhlIGRyaXZlciBtdXN0IG1haW50YWluIHRoZSBxdWV1ZSdzIEJ5dGUgQ291bnQgdGFibGUgaW4gaG9zdCBEUkFNCi0gKiAgICAgKHN0cnVjdCBpd2w0OTY1X3NjaGVkX3F1ZXVlX2J5dGVfY250X3RibCkgZm9yIHRoaXMgbW9kZS4KLSAqICAgICBUaGlzIG1vZGUgZG9lcyBub3Qgc3VwcG9ydCBmcmFnbWVudGF0aW9uLgotICoKLSAqIDIpICBGSUZPIChhLmsuYS4gbm9uLVNjaGVkdWxlci1BQ0spLCBpbiB3aGljaCBlYWNoIFRGRCBpcyBwcm9jZXNzZWQgaW4gb3JkZXIuCi0gKiAgICAgVGhlIGRldmljZSBtYXkgYXV0b21hdGljYWxseSByZXRyeSBUeCwgYnV0IHdpbGwgcmV0cnkgb25seSBvbmUgZnJhbWUKLSAqICAgICBhdCBhIHRpbWUsIHVudGlsIHJlY2VpdmluZyBBQ0sgZnJvbSByZWNlaXZpbmcgc3RhdGlvbiwgb3IgcmVhY2hpbmcKLSAqICAgICByZXRyeSBsaW1pdCBhbmQgZ2l2aW5nIHVwLgotICoKLSAqICAgICBUaGUgY29tbWFuZCBxdWV1ZSAoIzQvIzkpIG11c3QgdXNlIHRoaXMgbW9kZSEKLSAqICAgICBUaGlzIG1vZGUgZG9lcyBub3QgcmVxdWlyZSB1c2Ugb2YgdGhlIEJ5dGUgQ291bnQgdGFibGUgaW4gaG9zdCBEUkFNLgotICoKLSAqIERyaXZlciBjb250cm9scyBzY2hlZHVsZXIgb3BlcmF0aW9uIHZpYSAzIG1lYW5zOgotICogMSkgIFNjaGVkdWxlciByZWdpc3RlcnMKLSAqIDIpICBTaGFyZWQgc2NoZWR1bGVyIGRhdGEgYmFzZSBpbiBpbnRlcm5hbCA0OTU2IFNSQU0KLSAqIDMpICBTaGFyZWQgZGF0YSBpbiBob3N0IERSQU0KLSAqCi0gKiBJbml0aWFsaXphdGlvbjoKLSAqCi0gKiBXaGVuIGxvYWRpbmcsIGRyaXZlciBzaG91bGQgYWxsb2NhdGUgbWVtb3J5IGZvcjoKLSAqIDEpICAxNiBURkQgY2lyY3VsYXIgYnVmZmVycywgZWFjaCB3aXRoIHNwYWNlIGZvciAodHlwaWNhbGx5KSAyNTYgVEZEcy4KLSAqIDIpICAxNiBCeXRlIENvdW50IGNpcmN1bGFyIGJ1ZmZlcnMgaW4gMTYgS0J5dGVzIGNvbnRpZ3VvdXMgbWVtb3J5Ci0gKiAgICAgKDEwMjQgYnl0ZXMgZm9yIGVhY2ggcXVldWUpLgotICoKLSAqIEFmdGVyIHJlY2VpdmluZyAiQWxpdmUiIHJlc3BvbnNlIGZyb20gdUNvZGUsIGRyaXZlciBtdXN0IGluaXRpYWxpemUKLSAqIHRoZSBzY2hlZHVsZXIgKGVzcGVjaWFsbHkgZm9yIHF1ZXVlICM0LyM5LCB0aGUgY29tbWFuZCBxdWV1ZSwgb3RoZXJ3aXNlCi0gKiB0aGUgZHJpdmVyIGNhbid0IGlzc3VlIGNvbW1hbmRzISk6Ci0gKi8KLQotLyoqCi0gKiBNYXggVHggd2luZG93IHNpemUgaXMgdGhlIG1heCBudW1iZXIgb2YgY29udGlndW91cyBURkRzIHRoYXQgdGhlIHNjaGVkdWxlcgotICogY2FuIGtlZXAgdHJhY2sgb2YgYXQgb25lIHRpbWUgd2hlbiBjcmVhdGluZyBibG9jay1hY2sgY2hhaW5zIG9mIGZyYW1lcy4KLSAqIE5vdGUgdGhhdCAiNjQiIG1hdGNoZXMgdGhlIG51bWJlciBvZiBhY2sgYml0cyBpbiBhIGJsb2NrLWFjayBwYWNrZXQuCi0gKiBEcml2ZXIgc2hvdWxkIHVzZSBTQ0RfV0lOX1NJWkUgYW5kIFNDRF9GUkFNRV9MSU1JVCB2YWx1ZXMgdG8gaW5pdGlhbGl6ZQotICogSVdMNDlfU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHgpIHZhbHVlcy4KLSAqLwotI2RlZmluZSBTQ0RfV0lOX1NJWkUJCQkJNjQKLSNkZWZpbmUgU0NEX0ZSQU1FX0xJTUlUCQkJCTY0Ci0KLS8qIFNDRCByZWdpc3RlcnMgYXJlIGludGVybmFsLCBtdXN0IGJlIGFjY2Vzc2VkIHZpYSBIQlVTX1RBUkdfUFJQSCByZWdzICovCi0jZGVmaW5lIElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQJCTB4YTAyYzAwCi0KLS8qCi0gKiA0OTY1IHRlbGxzIGRyaXZlciBTUkFNIGFkZHJlc3MgZm9yIGludGVybmFsIHNjaGVkdWxlciBzdHJ1Y3RzIHZpYSB0aGlzIHJlZy4KLSAqIFZhbHVlIGlzIHZhbGlkIG9ubHkgYWZ0ZXIgIkFsaXZlIiByZXNwb25zZSBmcm9tIHVDb2RlLgotICovCi0jZGVmaW5lIElXTDQ5X1NDRF9TUkFNX0JBU0VfQUREUiAgICAgICAgICAgKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDApCi0KLS8qCi0gKiBEcml2ZXIgbWF5IG5lZWQgdG8gdXBkYXRlIHF1ZXVlLWVtcHR5IGJpdHMgYWZ0ZXIgY2hhbmdpbmcgcXVldWUncwotICogd3JpdGUgYW5kIHJlYWQgcG9pbnRlcnMgKGluZGV4ZXMpIGR1cmluZyAocmUtKWluaXRpYWxpemF0aW9uIChpLmUuIHdoZW4KLSAqIHNjaGVkdWxlciBpcyBub3QgdHJhY2tpbmcgd2hhdCdzIGhhcHBlbmluZykuCi0gKiBCaXQgZmllbGRzOgotICogMzEtMTY6ICBXcml0ZSBtYXNrIC0tIDE6IHVwZGF0ZSBlbXB0eSBiaXQsIDA6IGRvbid0IGNoYW5nZSBlbXB0eSBiaXQKLSAqIDE1LTAwOiAgRW1wdHkgc3RhdGUsIG9uZSBmb3IgZWFjaCBxdWV1ZSAtLSAxOiBlbXB0eSwgMDogbm9uLWVtcHR5Ci0gKiBOT1RFOiAgVGhpcyByZWdpc3RlciBpcyBub3QgdXNlZCBieSBMaW51eCBkcml2ZXIuCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0VNUFRZX0JJVFMgICAgICAgICAgICAgICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4NCkKLQotLyoKLSAqIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiBhcnJheSBvZiBieXRlIGNvdW50IChCQykgY2lyY3VsYXIgYnVmZmVycyAoQ0JzKS4KLSAqIEVhY2ggVHggcXVldWUgaGFzIGEgQkMgQ0IgaW4gaG9zdCBEUkFNIHRvIHN1cHBvcnQgU2NoZWR1bGVyLUFDSyBtb2RlLgotICogVGhpcyByZWdpc3RlciBwb2ludHMgdG8gQkMgQ0IgZm9yIHF1ZXVlIDAsIG11c3QgYmUgb24gMTAyNC1ieXRlIGJvdW5kYXJ5LgotICogT3RoZXJzIGFyZSBzcGFjZWQgYnkgMTAyNCBieXRlcy4KLSAqIEVhY2ggQkMgQ0IgaXMgMiBieXRlcyAqICgyNTYgKyA2NCkgPSA3NDAgYnl0ZXMsIGZvbGxvd2VkIGJ5IDM4NCBieXRlcyBwYWQuCi0gKiAoSW5kZXggaW50byBhIHF1ZXVlJ3MgQkMgQ0IpID0gKGluZGV4IGludG8gcXVldWUncyBURkQgQ0IpID0gKFNTTiAmIDB4ZmYpLgotICogQml0IGZpZWxkczoKLSAqIDI1LTAwOiAgQnl0ZSBDb3VudCBDQiBwaHlzaWNhbCBhZGRyZXNzIFszNToxMF0sIG11c3QgYmUgMTAyNC1ieXRlIGFsaWduZWQuCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0RSQU1fQkFTRV9BRERSICAgICAgICAgICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MTApCi0KLS8qCi0gKiBFbmFibGVzIGFueS9hbGwgVHggRE1BL0ZJRk8gY2hhbm5lbHMuCi0gKiBTY2hlZHVsZXIgZ2VuZXJhdGVzIHJlcXVlc3RzIGZvciBvbmx5IHRoZSBhY3RpdmUgY2hhbm5lbHMuCi0gKiBTZXQgdGhpcyB0byAweGZmIHRvIGVuYWJsZSBhbGwgOCBjaGFubmVscyAobm9ybWFsIHVzYWdlKS4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAgNy0gMDogIEVuYWJsZSAoMSksIGRpc2FibGUgKDApLCBvbmUgYml0IGZvciBlYWNoIGNoYW5uZWwgMC03Ci0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1RYRkFDVCAgICAgICAgICAgICAgICAgICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MWMpCi0vKgotICogUXVldWUgKHgpIFdyaXRlIFBvaW50ZXJzIChpbmRleGVzLCByZWFsbHkhKSwgb25lIGZvciBlYWNoIFR4IHF1ZXVlLgotICogSW5pdGlhbGl6ZWQgYW5kIHVwZGF0ZWQgYnkgZHJpdmVyIGFzIG5ldyBURkRzIGFyZSBhZGRlZCB0byBxdWV1ZS4KLSAqIE5PVEU6ICBJZiB1c2luZyBCbG9jayBBY2ssIGluZGV4IG11c3QgY29ycmVzcG9uZCB0byBmcmFtZSdzCi0gKiAgICAgICAgU3RhcnQgU2VxdWVuY2UgTnVtYmVyOyBpbmRleCA9IChTU04gJiAweGZmKQotICogTk9URTogIEFsdGVybmF0aXZlIHRvIEhCVVNfVEFSR19XUlBUUiwgd2hpY2ggaXMgd2hhdCBMaW51eCBkcml2ZXIgdXNlcz8KLSAqLwotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfV1JQVFIoeCkgIChJV0w0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgyNCArICh4KSAqIDQpCi0KLS8qCi0gKiBRdWV1ZSAoeCkgUmVhZCBQb2ludGVycyAoaW5kZXhlcywgcmVhbGx5ISksIG9uZSBmb3IgZWFjaCBUeCBxdWV1ZS4KLSAqIEZvciBGSUZPIG1vZGUsIGluZGV4IGluZGljYXRlcyBuZXh0IGZyYW1lIHRvIHRyYW5zbWl0LgotICogRm9yIFNjaGVkdWxlci1BQ0sgbW9kZSwgaW5kZXggaW5kaWNhdGVzIGZpcnN0IGZyYW1lIGluIFR4IHdpbmRvdy4KLSAqIEluaXRpYWxpemVkIGJ5IGRyaXZlciwgdXBkYXRlZCBieSBzY2hlZHVsZXIuCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX1JEUFRSKHgpICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4NjQgKyAoeCkgKiA0KQotCi0vKgotICogU2VsZWN0IHdoaWNoIHF1ZXVlcyB3b3JrIGluIGNoYWluIG1vZGUgKDEpIHZzLiBub3QgKDApLgotICogVXNlIGNoYWluIG1vZGUgdG8gYnVpbGQgY2hhaW5zIG9mIGFnZ3JlZ2F0ZWQgZnJhbWVzLgotICogQml0IGZpZWxkczoKLSAqIDMxLTE2OiAgUmVzZXJ2ZWQKLSAqIDE1LTAwOiAgTW9kZSwgb25lIGJpdCBmb3IgZWFjaCBxdWV1ZSAtLSAxOiBDaGFpbiBtb2RlLCAwOiBvbmUtYXQtYS10aW1lCi0gKiBOT1RFOiAgSWYgZHJpdmVyIHNldHMgdXAgcXVldWUgZm9yIGNoYWluIG1vZGUsIGl0IHNob3VsZCBiZSBhbHNvIHNldCB1cAotICogICAgICAgIFNjaGVkdWxlci1BQ0sgbW9kZSBhcyB3ZWxsLCB2aWEgU0NEX1FVRVVFX1NUQVRVU19CSVRTKHgpLgotICovCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRUNIQUlOX1NFTCAgKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweGQwKQotCi0vKgotICogU2VsZWN0IHdoaWNoIHF1ZXVlcyBpbnRlcnJ1cHQgZHJpdmVyIHdoZW4gc2NoZWR1bGVyIGluY3JlbWVudHMKLSAqIGEgcXVldWUncyByZWFkIHBvaW50ZXIgKGluZGV4KS4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAzMS0xNjogIFJlc2VydmVkCi0gKiAxNS0wMDogIEludGVycnVwdCBlbmFibGUsIG9uZSBiaXQgZm9yIGVhY2ggcXVldWUgLS0gMTogZW5hYmxlZCwgMDogZGlzYWJsZWQKLSAqIE5PVEU6ICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgYXBwYXJlbnRseSBhIG5vLW9wOyBkcml2ZXIgcmVsaWVzIG9uIGludGVycnVwdHMKLSAqICAgICAgICBmcm9tIFJ4IHF1ZXVlIHRvIHJlYWQgVHggY29tbWFuZCByZXNwb25zZXMgYW5kIHVwZGF0ZSBUeCBxdWV1ZXMuCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0lOVEVSUlVQVF9NQVNLICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4ZTQpCi0KLS8qCi0gKiBRdWV1ZSBzZWFyY2ggc3RhdHVzIHJlZ2lzdGVycy4gIE9uZSBmb3IgZWFjaCBxdWV1ZS4KLSAqIFNldHMgdXAgcXVldWUgbW9kZSBhbmQgYXNzaWducyBxdWV1ZSB0byBUeCBETUEgY2hhbm5lbC4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAxOS0xMDogV3JpdGUgbWFzay9lbmFibGUgYml0cyBmb3IgYml0cyAwLTkKLSAqICAgICA5OiBEcml2ZXIgc2hvdWxkIGluaXQgdG8gIjAiCi0gKiAgICAgODogU2NoZWR1bGVyLUFDSyBtb2RlICgxKSwgbm9uLVNjaGVkdWxlci1BQ0sgKGkuZS4gRklGTykgbW9kZSAoMCkuCi0gKiAgICAgICAgRHJpdmVyIHNob3VsZCBpbml0IHRvICIxIiBmb3IgYWdncmVnYXRpb24gbW9kZSwgb3IgIjAiIG90aGVyd2lzZS4KLSAqICAgNy02OiBEcml2ZXIgc2hvdWxkIGluaXQgdG8gIjAiCi0gKiAgICAgNTogV2luZG93IFNpemUgTGVmdDsgaW5kaWNhdGVzIHdoZXRoZXIgc2NoZWR1bGVyIGNhbiByZXF1ZXN0Ci0gKiAgICAgICAgYW5vdGhlciBURkQsIGJhc2VkIG9uIHdpbmRvdyBzaXplLCBldGMuICBEcml2ZXIgc2hvdWxkIGluaXQKLSAqICAgICAgICB0aGlzIGJpdCB0byAiMSIgZm9yIGFnZ3JlZ2F0aW9uIG1vZGUsIG9yICIwIiBmb3Igbm9uLWFnZy4KLSAqICAgNC0xOiBUeCBGSUZPIHRvIHVzZSAocmFuZ2UgMC03KS4KLSAqICAgICAwOiBRdWV1ZSBpcyBhY3RpdmUgKDEpLCBub3QgYWN0aXZlICgwKS4KLSAqIE90aGVyIGJpdHMgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgIjAiCi0gKgotICogTk9URTogIElmIGVuYWJsaW5nIFNjaGVkdWxlci1BQ0sgbW9kZSwgY2hhaW4gbW9kZSBzaG91bGQgYWxzbyBiZSBlbmFibGVkCi0gKiAgICAgICAgdmlhIFNDRF9RVUVVRUNIQUlOX1NFTC4KLSAqLwotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfU1RBVFVTX0JJVFMoeClcCi0JKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDEwNCArICh4KSAqIDQpCi0KLS8qIEJpdCBmaWVsZCBwb3NpdGlvbnMgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUJKDApCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfVFhGCSgxKQotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1dTTAkoNSkKLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19TQ0RfQUNLCSg4KQotCi0vKiBXcml0ZSBtYXNrcyAqLwotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ1RfRU4JKDEwKQotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfTVNLCQkoMHgwMDA3RkMwMCkKLQotLyoqCi0gKiA0OTY1IGludGVybmFsIFNSQU0gc3RydWN0dXJlcyBmb3Igc2NoZWR1bGVyLCBzaGFyZWQgd2l0aCBkcml2ZXIgLi4uCi0gKgotICogRHJpdmVyIHNob3VsZCBjbGVhciBhbmQgaW5pdGlhbGl6ZSB0aGUgZm9sbG93aW5nIGFyZWFzIGFmdGVyIHJlY2VpdmluZwotICogIkFsaXZlIiByZXNwb25zZSBmcm9tIDQ5NjUgdUNvZGUsIGkuZS4gYWZ0ZXIgaW5pdGlhbAotICogdUNvZGUgbG9hZCwgb3IgYWZ0ZXIgYSB1Q29kZSBsb2FkIGRvbmUgZm9yIGVycm9yIHJlY292ZXJ5OgotICoKLSAqIFNDRF9DT05URVhUX0RBVEFfT0ZGU0VUIChzaXplIDEyOCBieXRlcykKLSAqIFNDRF9UWF9TVFRTX0JJVE1BUF9PRkZTRVQgKHNpemUgMjU2IGJ5dGVzKQotICogU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUIChzaXplIDMyIGJ5dGVzKQotICoKLSAqIERyaXZlciBhY2Nlc3NlcyBTUkFNIHZpYSBIQlVTX1RBUkdfTUVNXyogcmVnaXN0ZXJzLgotICogRHJpdmVyIHJlYWRzIGJhc2UgYWRkcmVzcyBvZiB0aGlzIHNjaGVkdWxlciBhcmVhIGZyb20gU0NEX1NSQU1fQkFTRV9BRERSLgotICogQWxsIE9GRlNFVCB2YWx1ZXMgbXVzdCBiZSBhZGRlZCB0byB0aGlzIGJhc2UgYWRkcmVzcy4KLSAqLwotCi0vKgotICogUXVldWUgY29udGV4dC4gIE9uZSA4LWJ5dGUgZW50cnkgZm9yIGVhY2ggb2YgMTYgcXVldWVzLgotICoKLSAqIERyaXZlciBzaG91bGQgY2xlYXIgdGhpcyBlbnRpcmUgYXJlYSAoc2l6ZSAweDgwKSB0byAwIGFmdGVyIHJlY2VpdmluZwotICogIkFsaXZlIiBub3RpZmljYXRpb24gZnJvbSB1Q29kZS4gIEFkZGl0aW9uYWxseSwgZHJpdmVyIHNob3VsZCBpbml0Ci0gKiBlYWNoIHF1ZXVlJ3MgZW50cnkgYXMgZm9sbG93czoKLSAqCi0gKiBMUyBEd29yZCBiaXQgZmllbGRzOgotICogIDAtMDY6ICBNYXggVHggd2luZG93IHNpemUgZm9yIFNjaGVkdWxlci1BQ0suICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gNjQuCi0gKgotICogTVMgRHdvcmQgYml0IGZpZWxkczoKLSAqIDE2LTIyOiAgRnJhbWUgbGltaXQuICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gMTAgKDB4YSkuCi0gKgotICogRHJpdmVyIHNob3VsZCBpbml0IGFsbCBvdGhlciBiaXRzIHRvIDAuCi0gKgotICogSW5pdCBtdXN0IGJlIGRvbmUgYWZ0ZXIgZHJpdmVyIHJlY2VpdmVzICJBbGl2ZSIgcmVzcG9uc2UgZnJvbSA0OTY1IHVDb2RlLAotICogYW5kIHdoZW4gc2V0dGluZyB1cCBxdWV1ZSBmb3IgYWdncmVnYXRpb24uCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0NPTlRFWFRfREFUQV9PRkZTRVQJCQkweDM4MAotI2RlZmluZSBJV0w0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoeCkgXAotCQkJKElXTDQ5X1NDRF9DT05URVhUX0RBVEFfT0ZGU0VUICsgKCh4KSAqIDgpKQotCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9QT1MJCSgwKQotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfTVNLCQkoMHgwMDAwMDA3RikKLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX1BPUwkoMTYpCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0sJKDB4MDA3RjAwMDApCi0KLS8qCi0gKiBUeCBTdGF0dXMgQml0bWFwCi0gKgotICogRHJpdmVyIHNob3VsZCBjbGVhciB0aGlzIGVudGlyZSBhcmVhIChzaXplIDB4MTAwKSB0byAwIGFmdGVyIHJlY2VpdmluZwotICogIkFsaXZlIiBub3RpZmljYXRpb24gZnJvbSB1Q29kZS4gIEFyZWEgaXMgdXNlZCBvbmx5IGJ5IGRldmljZSBpdHNlbGY7Ci0gKiBubyBvdGhlciBzdXBwb3J0IChiZXNpZGVzIGNsZWFyaW5nKSBpcyByZXF1aXJlZCBmcm9tIGRyaXZlci4KLSAqLwotI2RlZmluZSBJV0w0OV9TQ0RfVFhfU1RUU19CSVRNQVBfT0ZGU0VUCQkweDQwMAotCi0vKgotICogUkF4VElEIHRvIHF1ZXVlIHRyYW5zbGF0aW9uIG1hcHBpbmcuCi0gKgotICogV2hlbiBxdWV1ZSBpcyBpbiBTY2hlZHVsZXItQUNLIG1vZGUsIGZyYW1lcyBwbGFjZWQgaW4gYSB0aGF0IHF1ZXVlIG11c3QgYmUKLSAqIGZvciBvbmx5IG9uZSBjb21iaW5hdGlvbiBvZiByZWNlaXZlciBhZGRyZXNzIChSQSkgYW5kIHRyYWZmaWMgSUQgKFRJRCksIGkuZS4KLSAqIG9uZSBRT1MgcHJpb3JpdHkgbGV2ZWwgZGVzdGluZWQgZm9yIG9uZSBzdGF0aW9uIChmb3IgdGhpcyB3aXJlbGVzcyBsaW5rLAotICogbm90IGZpbmFsIGRlc3RpbmF0aW9uKS4gIFRoZSBTQ0RfVFJBTlNMQVRFX1RBQkxFIGFyZWEgcHJvdmlkZXMgMTYgMTYtYml0Ci0gKiBtYXBwaW5ncywgb25lIGZvciBlYWNoIG9mIHRoZSAxNiBxdWV1ZXMuICBJZiBxdWV1ZSBpcyBub3QgaW4gU2NoZWR1bGVyLUFDSwotICogbW9kZSwgdGhlIGRldmljZSBpZ25vcmVzIHRoZSBtYXBwaW5nIHZhbHVlLgotICoKLSAqIEJpdCBmaWVsZHMsIGZvciBlYWNoIDE2LWJpdCBtYXA6Ci0gKiAxNS05OiAgUmVzZXJ2ZWQsIHNldCB0byAwCi0gKiAgOC00OiAgSW5kZXggaW50byBkZXZpY2UncyBzdGF0aW9uIHRhYmxlIGZvciByZWNpcGllbnQgc3RhdGlvbgotICogIDMtMDogIFRyYWZmaWMgSUQgKHRpZCksIHJhbmdlIDAtMTUKLSAqCi0gKiBEcml2ZXIgc2hvdWxkIGNsZWFyIHRoaXMgZW50aXJlIGFyZWEgKHNpemUgMzIgYnl0ZXMpIHRvIDAgYWZ0ZXIgcmVjZWl2aW5nCi0gKiAiQWxpdmUiIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlLiAgVG8gdXBkYXRlIGEgMTYtYml0IG1hcCB2YWx1ZSwgZHJpdmVyCi0gKiBtdXN0IHJlYWQgYSBkd29yZC1hbGlnbmVkIHZhbHVlIGZyb20gZGV2aWNlIFNSQU0sIHJlcGxhY2UgdGhlIDE2LWJpdCBtYXAKLSAqIHZhbHVlIG9mIGludGVyZXN0LCBhbmQgd3JpdGUgdGhlIGR3b3JkIHZhbHVlIGJhY2sgaW50byBkZXZpY2UgU1JBTS4KLSAqLwotI2RlZmluZSBJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVQJCTB4NTAwCi0KLS8qIEZpbmQgdHJhbnNsYXRpb24gdGFibGUgZHdvcmQgdG8gcmVhZC93cml0ZSBmb3IgZ2l2ZW4gcXVldWUgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUX1FVRVVFKHgpIFwKLQkoKElXTDQ5X1NDRF9UUkFOU0xBVEVfVEJMX09GRlNFVCArICgoeCkgKiAyKSkgJiAweGZmZmZmZmZjKQotCi0jZGVmaW5lIElXTF9TQ0RfVFhGSUZPX1BPU19USUQJCQkoMCkKLSNkZWZpbmUgSVdMX1NDRF9UWEZJRk9fUE9TX1JBCQkJKDQpCi0jZGVmaW5lIElXTF9TQ0RfUVVFVUVfUkFfVElEX01BUF9SQVRJRF9NU0sJKDB4MDFGRikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqIEVORCBUWCBTQ0hFRFVMRVIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmCQkJCS8qIF9faXdsX2xlZ2FjeV9wcnBoX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1ZDBhYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcnguYworKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0jaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFJYLUZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFJ4IHRoZW9yeSBvZiBvcGVyYXRpb24KLSAqCi0gKiBEcml2ZXIgYWxsb2NhdGVzIGEgY2lyY3VsYXIgYnVmZmVyIG9mIFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3JzIChSQkRzKSwKLSAqIGVhY2ggb2Ygd2hpY2ggcG9pbnQgdG8gUmVjZWl2ZSBCdWZmZXJzIHRvIGJlIGZpbGxlZCBieSB0aGUgTklDLiAgVGhlc2UgZ2V0Ci0gKiB1c2VkIG5vdCBvbmx5IGZvciBSeCBmcmFtZXMsIGJ1dCBmb3IgYW55IGNvbW1hbmQgcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uCi0gKiBmcm9tIHRoZSBOSUMuICBUaGUgZHJpdmVyIGFuZCBOSUMgbWFuYWdlIHRoZSBSeCBidWZmZXJzIGJ5IG1lYW5zCi0gKiBvZiBpbmRleGVzIGludG8gdGhlIGNpcmN1bGFyIGJ1ZmZlci4KLSAqCi0gKiBSeCBRdWV1ZSBJbmRleGVzCi0gKiBUaGUgaG9zdC9maXJtd2FyZSBzaGFyZSB0d28gaW5kZXggcmVnaXN0ZXJzIGZvciBtYW5hZ2luZyB0aGUgUnggYnVmZmVycy4KLSAqCi0gKiBUaGUgUkVBRCBpbmRleCBtYXBzIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiB0aGF0IHRoZSBmaXJtd2FyZSBtYXkgYmUgd3JpdGluZwotICogdG8gLS0gdGhlIGRyaXZlciBjYW4gcmVhZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoaXMgcG9zaXRpb24gYW5kIGdldAotICogZ29vZCBkYXRhLgotICogVGhlIFJFQUQgaW5kZXggaXMgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUgb25jZSB0aGUgY2FyZCBpcyBlbmFibGVkLgotICoKLSAqIFRoZSBXUklURSBpbmRleCBtYXBzIHRvIHRoZSBsYXN0IHBvc2l0aW9uIHRoZSBkcml2ZXIgaGFzIHJlYWQgZnJvbSAtLSB0aGUKLSAqIHBvc2l0aW9uIHByZWNlZGluZyBXUklURSBpcyB0aGUgbGFzdCBzbG90IHRoZSBmaXJtd2FyZSBjYW4gcGxhY2UgYSBwYWNrZXQuCi0gKgotICogVGhlIHF1ZXVlIGlzIGVtcHR5IChubyBnb29kIGRhdGEpIGlmIFdSSVRFID0gUkVBRCAtIDEsIGFuZCBpcyBmdWxsIGlmCi0gKiBXUklURSA9IFJFQUQuCi0gKgotICogRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgaG9zdCBzZXRzIHVwIHRoZSBSRUFEIHF1ZXVlIHBvc2l0aW9uIHRvIHRoZSBmaXJzdAotICogSU5ERVggcG9zaXRpb24sIGFuZCBXUklURSB0byB0aGUgbGFzdCAoUkVBRCAtIDEgd3JhcHBlZCkKLSAqCi0gKiBXaGVuIHRoZSBmaXJtd2FyZSBwbGFjZXMgYSBwYWNrZXQgaW4gYSBidWZmZXIsIGl0IHdpbGwgYWR2YW5jZSB0aGUgUkVBRCBpbmRleAotICogYW5kIGZpcmUgdGhlIFJYIGludGVycnVwdC4gIFRoZSBkcml2ZXIgY2FuIHRoZW4gcXVlcnkgdGhlIFJFQUQgaW5kZXggYW5kCi0gKiBwcm9jZXNzIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZSwgbW92aW5nIHRoZSBXUklURSBpbmRleCBmb3J3YXJkIGFzIGl0Ci0gKiByZXNldHMgdGhlIFJ4IHF1ZXVlIGJ1ZmZlcnMgd2l0aCBuZXcgbWVtb3J5LgotICoKLSAqIFRoZSBtYW5hZ2VtZW50IGluIHRoZSBkcml2ZXIgaXMgYXMgZm9sbG93czoKLSAqICsgQSBsaXN0IG9mIHByZS1hbGxvY2F0ZWQgU0tCcyBpcyBzdG9yZWQgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUuICBXaGVuCi0gKiAgIGl3bC0+cnhxLT5mcmVlX2NvdW50IGRyb3BzIHRvIG9yIGJlbG93IFJYX0xPV19XQVRFUk1BUkssIHdvcmsgaXMgc2NoZWR1bGVkCi0gKiAgIHRvIHJlcGxlbmlzaCB0aGUgaXdsLT5yeHEtPnJ4X2ZyZWUuCi0gKiArIEluIGl3bF9yeF9yZXBsZW5pc2ggKHNjaGVkdWxlZCkgaWYgJ3Byb2Nlc3NlZCcgIT0gJ3JlYWQnIHRoZW4gdGhlCi0gKiAgIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGFuZCB0aGUgUkVBRCBJTkRFWCBpcyB1cGRhdGVkICh1cGRhdGluZyB0aGUKLSAqICAgJ3Byb2Nlc3NlZCcgYW5kICdyZWFkJyBkcml2ZXIgaW5kZXhlcyBhcyB3ZWxsKQotICogKyBBIHJlY2VpdmVkIHBhY2tldCBpcyBwcm9jZXNzZWQgYW5kIGhhbmRlZCB0byB0aGUga2VybmVsIG5ldHdvcmsgc3RhY2ssCi0gKiAgIGRldGFjaGVkIGZyb20gdGhlIGl3bC0+cnhxLiAgVGhlIGRyaXZlciAncHJvY2Vzc2VkJyBpbmRleCBpcyB1cGRhdGVkLgotICogKyBUaGUgSG9zdC9GaXJtd2FyZSBpd2wtPnJ4cSBpcyByZXBsZW5pc2hlZCBhdCB0YXNrbGV0IHRpbWUgZnJvbSB0aGUgcnhfZnJlZQotICogICBsaXN0LiBJZiB0aGVyZSBhcmUgbm8gYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUsIHRoZSBSRUFECi0gKiAgIElOREVYIGlzIG5vdCBpbmNyZW1lbnRlZCBhbmQgaXdsLT5zdGF0dXMoUlhfU1RBTExFRCkgaXMgc2V0LiAgSWYgdGhlcmUKLSAqICAgd2VyZSBlbm91Z2ggZnJlZSBidWZmZXJzIGFuZCBSWF9TVEFMTEVEIGlzIHNldCBpdCBpcyBjbGVhcmVkLgotICoKLSAqCi0gKiBEcml2ZXIgc2VxdWVuY2U6Ci0gKgotICogaXdsX2xlZ2FjeV9yeF9xdWV1ZV9hbGxvYygpICAgQWxsb2NhdGVzIHJ4X2ZyZWUKLSAqIGl3bF9yeF9yZXBsZW5pc2goKSAgICAgUmVwbGVuaXNoZXMgcnhfZnJlZSBsaXN0IGZyb20gcnhfdXNlZCwgYW5kIGNhbGxzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpd2xfcnhfcXVldWVfcmVzdG9jawotICogaXdsX3J4X3F1ZXVlX3Jlc3RvY2soKSBNb3ZlcyBhdmFpbGFibGUgYnVmZmVycyBmcm9tIHJ4X2ZyZWUgaW50byBSeAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsIHVwZGF0ZXMgZmlybXdhcmUgcG9pbnRlcnMsIGFuZCB1cGRhdGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgV1JJVEUgaW5kZXguICBJZiBpbnN1ZmZpY2llbnQgcnhfZnJlZSBidWZmZXJzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlLCBzY2hlZHVsZXMgaXdsX3J4X3JlcGxlbmlzaAotICoKLSAqIC0tIGVuYWJsZSBpbnRlcnJ1cHRzIC0tCi0gKiBJU1IgLSBpd2xfcngoKSAgICAgICAgIERldGFjaCBpd2xfcnhfbWVtX2J1ZmZlcnMgZnJvbSBwb29sIHVwIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRCBJTkRFWCwgZGV0YWNoaW5nIHRoZSBTS0IgZnJvbSB0aGUgcG9vbC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVzIHRoZSBwYWNrZXQgYnVmZmVyIGZyb20gcXVldWUgdG8gcnhfdXNlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxzIGl3bF9yeF9xdWV1ZV9yZXN0b2NrIHRvIHJlZmlsbCBhbnkgZW1wdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzLgotICogLi4uCi0gKgotICovCi0KLS8qKgotICogaXdsX2xlZ2FjeV9yeF9xdWV1ZV9zcGFjZSAtIFJldHVybiBudW1iZXIgb2YgZnJlZSBzbG90cyBhdmFpbGFibGUgaW4gcXVldWUuCi0gKi8KLWludCBpd2xfbGVnYWN5X3J4X3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpd2xfcnhfcXVldWUgKnEpCi17Ci0JaW50IHMgPSBxLT5yZWFkIC0gcS0+d3JpdGU7Ci0JaWYgKHMgPD0gMCkKLQkJcyArPSBSWF9RVUVVRV9TSVpFOwotCS8qIGtlZXAgc29tZSBidWZmZXIgdG8gbm90IGNvbmZ1c2UgZnVsbCBhbmQgZW1wdHkgcXVldWUgKi8KLQlzIC09IDI7Ci0JaWYgKHMgPCAwKQotCQlzID0gMDsKLQlyZXR1cm4gczsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9xdWV1ZV9zcGFjZSk7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyIC0gVXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyIGZvciB0aGUgUlggcXVldWUKLSAqLwotdm9pZAotaXdsX2xlZ2FjeV9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJc3RydWN0IGl3bF9yeF9xdWV1ZSAqcSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiByeF93cnRfcHRyX3JlZyA9IHByaXYtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZzsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChxLT5uZWVkX3VwZGF0ZSA9PSAwKQotCQlnb3RvIGV4aXRfdW5sb2NrOwotCi0JLyogSWYgcG93ZXItc2F2aW5nIGlzIGluIHVzZSwgbWFrZSBzdXJlIGRldmljZSBpcyBhd2FrZSAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9XRVJfUE1JLCAmcHJpdi0+c3RhdHVzKSkgewotCQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxKTsKLQotCQlpZiAocmVnICYgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX01BQ19TTEVFUCkgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkiUnggcXVldWUgcmVxdWVzdGluZyB3YWtldXAsIgotCQkJCSIgR1AxID0gMHgleFxuIiwgcmVnKTsKLQkJCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfR1BfQ05UUkwsCi0JCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKLQkJCWdvdG8gZXhpdF91bmxvY2s7Ci0JCX0KLQotCQlxLT53cml0ZV9hY3R1YWwgPSAocS0+d3JpdGUgJiB+MHg3KTsKLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCByeF93cnRfcHRyX3JlZywKLQkJCQlxLT53cml0ZV9hY3R1YWwpOwotCi0JLyogRWxzZSBkZXZpY2UgaXMgYXNzdW1lZCB0byBiZSBhd2FrZSAqLwotCX0gZWxzZSB7Ci0JCS8qIERldmljZSBleHBlY3RzIGEgbXVsdGlwbGUgb2YgOCAqLwotCQlxLT53cml0ZV9hY3R1YWwgPSAocS0+d3JpdGUgJiB+MHg3KTsKLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCByeF93cnRfcHRyX3JlZywKLQkJCXEtPndyaXRlX2FjdHVhbCk7Ci0JfQotCi0JcS0+bmVlZF91cGRhdGUgPSAwOwotCi0gZXhpdF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIpOwotCi1pbnQgaXdsX2xlZ2FjeV9yeF9xdWV1ZV9hbGxvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+cGNpX2Rldi0+ZGV2OwotCWludCBpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnJ4cS0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfZnJlZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfdXNlZCk7Ci0KLQkvKiBBbGxvYyB0aGUgY2lyY3VsYXIgYnVmZmVyIG9mIFJlYWQgQnVmZmVyIERlc2NyaXB0b3JzIChSQkRzKSAqLwotCXJ4cS0+YmQgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgJnJ4cS0+YmRfZG1hLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyeHEtPmJkKQotCQlnb3RvIGVycl9iZDsKLQotCXJ4cS0+cmJfc3R0cyA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemVvZihzdHJ1Y3QgaXdsX3JiX3N0YXR1cyksCi0JCQkJCSAgJnJ4cS0+cmJfc3R0c19kbWEsIEdGUF9LRVJORUwpOwotCWlmICghcnhxLT5yYl9zdHRzKQotCQlnb3RvIGVycl9yYjsKLQotCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspCi0JCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKLQotCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQotCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLwotCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOwotCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKLQlyeHEtPmZyZWVfY291bnQgPSAwOwotCXJ4cS0+bmVlZF91cGRhdGUgPSAwOwotCXJldHVybiAwOwotCi1lcnJfcmI6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwgNCAqIFJYX1FVRVVFX1NJWkUsIHJ4cS0+YmQsCi0JCQkgIHJ4cS0+YmRfZG1hKTsKLWVycl9iZDoKLQlyZXR1cm4gLUVOT01FTTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9xdWV1ZV9hbGxvYyk7Ci0KLQotdm9pZCBpd2xfbGVnYWN5X3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uICpyZXBvcnQgPSAmKHBrdC0+dS5zcGVjdHJ1bV9ub3RpZik7Ci0KLQlpZiAoIXJlcG9ydC0+c3RhdGUpIHsKLQkJSVdMX0RFQlVHXzExSChwcml2LAotCQkJIlNwZWN0cnVtIE1lYXN1cmUgTm90aWZpY2F0aW9uOiBTdGFydFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1jcHkoJnByaXYtPm1lYXN1cmVfcmVwb3J0LCByZXBvcnQsIHNpemVvZigqcmVwb3J0KSk7Ci0JcHJpdi0+bWVhc3VyZW1lbnRfc3RhdHVzIHw9IE1FQVNVUkVNRU5UX1JFQURZOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWYpOwotCi0vKgotICogcmV0dXJucyBub24temVybyBpZiBwYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQKLSAqLwotaW50IGl3bF9sZWdhY3lfc2V0X2RlY3J5cHRlZF9mbGFnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkgICB1MzIgZGVjcnlwdF9yZXMsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHMpCi17Ci0JdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKTsKLQotCS8qCi0JICogQWxsIGNvbnRleHRzIGhhdmUgdGhlIHNhbWUgc2V0dGluZyBoZXJlIGR1ZSB0byBpdCBiZWluZwotCSAqIGEgbW9kdWxlIHBhcmFtZXRlciwgc28gT0sgdG8gY2hlY2sgYW55IGNvbnRleHQuCi0JICovCi0JaWYgKHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5maWx0ZXJfZmxhZ3MgJgotCQkJCQkJUlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLKQotCQlyZXR1cm4gMDsKLQotCWlmICghKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSkKLQkJcmV0dXJuIDA7Ci0KLQlJV0xfREVCVUdfUlgocHJpdiwgImRlY3J5cHRfcmVzOjB4JXhcbiIsIGRlY3J5cHRfcmVzKTsKLQlzd2l0Y2ggKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spIHsKLQljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfVEtJUDoKLQkJLyogVGhlIHVDb2RlIGhhcyBnb3QgYSBiYWQgcGhhc2UgMSBLZXksIHB1c2hlcyB0aGUgcGFja2V0LgotCQkgKiBEZWNyeXB0aW9uIHdpbGwgYmUgZG9uZSBpbiBTVy4gKi8KLQkJaWYgKChkZWNyeXB0X3JlcyAmIFJYX1JFU19TVEFUVVNfREVDUllQVF9UWVBFX01TSykgPT0KLQkJICAgIFJYX1JFU19TVEFUVVNfQkFEX0tFWV9UVEFLKQotCQkJYnJlYWs7Ci0KLQljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfV0VQOgotCQlpZiAoKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19ERUNSWVBUX1RZUEVfTVNLKSA9PQotCQkgICAgUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQykgewotCQkJLyogYmFkIElDViwgdGhlIHBhY2tldCBpcyBkZXN0cm95ZWQgc2luY2UgdGhlCi0JCQkgKiBkZWNyeXB0aW9uIGlzIGlucGxhY2UsIGRyb3AgaXQgKi8KLQkJCUlXTF9ERUJVR19SWChwcml2LCAiUGFja2V0IGRlc3Ryb3llZFxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfQ0NNUDoKLQkJaWYgKChkZWNyeXB0X3JlcyAmIFJYX1JFU19TVEFUVVNfREVDUllQVF9UWVBFX01TSykgPT0KLQkJICAgIFJYX1JFU19TVEFUVVNfREVDUllQVF9PSykgewotCQkJSVdMX0RFQlVHX1JYKHByaXYsICJodyBkZWNyeXB0IHN1Y2Nlc3NmdWxseSEhIVxuIik7Ci0JCQlzdGF0cy0+ZmxhZyB8PSBSWF9GTEFHX0RFQ1JZUFRFRDsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXRfZGVjcnlwdGVkX2ZsYWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXNjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zY2FuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjUyMjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXNjYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0KLS8qIEZvciBhY3RpdmUgc2NhbiwgbGlzdGVuIEFDVElWRV9EV0VMTF9USU1FIChtc2VjKSBvbiBlYWNoIGNoYW5uZWwgYWZ0ZXIKLSAqIHNlbmRpbmcgcHJvYmUgcmVxLiAgVGhpcyBzaG91bGQgYmUgc2V0IGxvbmcgZW5vdWdoIHRvIGhlYXIgcHJvYmUgcmVzcG9uc2VzCi0gKiBmcm9tIG1vcmUgdGhhbiBvbmUgQVAuICAqLwotI2RlZmluZSBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfMjQgICAgKDMwKSAgICAgICAvKiBhbGwgdGltZXMgaW4gbXNlYyAqLwotI2RlZmluZSBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfNTIgICAgKDIwKQotCi0jZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzI0R0haICgzKQotI2RlZmluZSBJV0xfQUNUSVZFX0RXRUxMX0ZBQ1RPUl81MkdIWiAoMikKLQotLyogRm9yIHBhc3NpdmUgc2NhbiwgbGlzdGVuIFBBU1NJVkVfRFdFTExfVElNRSAobXNlYykgb24gZWFjaCBjaGFubmVsLgotICogTXVzdCBiZSBzZXQgbG9uZ2VyIHRoYW4gYWN0aXZlIGR3ZWxsIHRpbWUuCi0gKiBGb3IgdGhlIG1vc3QgcmVsaWFibGUgc2Nhbiwgc2V0ID4gQVAgYmVhY29uIGludGVydmFsICh0eXBpY2FsbHkgMTAwbXNlYykuICovCi0jZGVmaW5lIElXTF9QQVNTSVZFX0RXRUxMX1RJTUVfMjQgICAoMjApICAgICAgIC8qIGFsbCB0aW1lcyBpbiBtc2VjICovCi0jZGVmaW5lIElXTF9QQVNTSVZFX0RXRUxMX1RJTUVfNTIgICAoMTApCi0jZGVmaW5lIElXTF9QQVNTSVZFX0RXRUxMX0JBU0UgICAgICAoMTAwKQotI2RlZmluZSBJV0xfQ0hBTk5FTF9UVU5FX1RJTUUgICAgICAgNQotCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfc2VuZF9zY2FuX2Fib3J0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1NDQU5fQUJPUlRfQ01ELAotCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCi0JfTsKLQotCS8qIEV4aXQgaW5zdGFudGx5IHdpdGggZXJyb3Igd2hlbiBkZXZpY2UgaXMgbm90IHJlYWR5Ci0JICogdG8gcmVjZWl2ZSBzY2FuIGFib3J0IGNvbW1hbmQgb3IgaXQgZG9lcyBub3QgcGVyZm9ybQotCSAqIGhhcmR3YXJlIHNjYW4gY3VycmVudGx5ICovCi0JaWYgKCF0ZXN0X2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgICF0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgICF0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXBrdCA9IChzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqKWNtZC5yZXBseV9wYWdlOwotCWlmIChwa3QtPnUuc3RhdHVzICE9IENBTl9BQk9SVF9TVEFUVVMpIHsKLQkJLyogVGhlIHNjYW4gYWJvcnQgd2lsbCByZXR1cm4gMSBmb3Igc3VjY2VzcyBvcgotCQkgKiAyIGZvciAiZmFpbHVyZSIuICBBIGZhaWx1cmUgY29uZGl0aW9uIGNhbiBiZQotCQkgKiBkdWUgdG8gc2ltcGx5IG5vdCBiZWluZyBpbiBhbiBhY3RpdmUgc2NhbiB3aGljaAotCQkgKiBjYW4gb2NjdXIgaWYgd2Ugc2VuZCB0aGUgc2NhbiBhYm9ydCBiZWZvcmUgd2UKLQkJICogdGhlIG1pY3JvY29kZSBoYXMgbm90aWZpZWQgdXMgdGhhdCBhIHNjYW4gaXMKLQkJICogY29tcGxldGVkLiAqLwotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU0NBTl9BQk9SVCByZXQgJWQuXG4iLCBwa3QtPnUuc3RhdHVzKTsKLQkJcmV0ID0gLUVJTzsKLQl9Ci0KLQlpd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgY21kLnJlcGx5X3BhZ2UpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfY29tcGxldGVfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgYWJvcnRlZCkKLXsKLQkvKiBjaGVjayBpZiBzY2FuIHdhcyByZXF1ZXN0ZWQgZnJvbSBtYWM4MDIxMSAqLwotCWlmIChwcml2LT5zY2FuX3JlcXVlc3QpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkNvbXBsZXRlIHNjYW4gaW4gbWFjODAyMTFcbiIpOwotCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQocHJpdi0+aHcsIGFib3J0ZWQpOwotCX0KLQotCXByaXYtPnNjYW5fdmlmID0gTlVMTDsKLQlwcml2LT5zY2FuX3JlcXVlc3QgPSBOVUxMOwotfQotCi12b2lkIGl3bF9sZWdhY3lfZm9yY2Vfc2Nhbl9lbmQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiRm9yY2luZyBzY2FuIGVuZCB3aGlsZSBub3Qgc2Nhbm5pbmdcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkZvcmNpbmcgc2NhbiBlbmRcbiIpOwotCWNsZWFyX2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpOwotCWNsZWFyX2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0JY2xlYXJfYml0KFNUQVRVU19TQ0FOX0FCT1JUSU5HLCAmcHJpdi0+c3RhdHVzKTsKLQlpd2xfbGVnYWN5X2NvbXBsZXRlX3NjYW4ocHJpdiwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfZG9fc2Nhbl9hYm9ydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiTm90IHBlcmZvcm1pbmcgc2NhbiB0byBhYm9ydFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodGVzdF9hbmRfc2V0X2JpdChTVEFUVVNfU0NBTl9BQk9SVElORywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gYWJvcnQgaW4gcHJvZ3Jlc3NcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX3NjYW5fYWJvcnQocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2VuZCBzY2FuIGFib3J0IGZhaWxlZCAlZFxuIiwgcmV0KTsKLQkJaXdsX2xlZ2FjeV9mb3JjZV9zY2FuX2VuZChwcml2KTsKLQl9IGVsc2UKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlN1Y2Nlc3NmdWxseSBzZW5kIHNjYW4gYWJvcnRcbiIpOwotfQotCi0vKioKLSAqIGl3bF9zY2FuX2NhbmNlbCAtIENhbmNlbCBhbnkgY3VycmVudGx5IGV4ZWN1dGluZyBIVyBzY2FuCi0gKi8KLWludCBpd2xfbGVnYWN5X3NjYW5fY2FuY2VsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlJV0xfREVCVUdfU0NBTihwcml2LCAiUXVldWluZyBhYm9ydCBzY2FuXG4iKTsKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmFib3J0X3NjYW4pOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NjYW5fY2FuY2VsKTsKLQotLyoqCi0gKiBpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQgLSBDYW5jZWwgYW55IGN1cnJlbnRseSBleGVjdXRpbmcgSFcgc2NhbgotICogQG1zOiBhbW91bnQgb2YgdGltZSB0byB3YWl0IChpbiBtaWxsaXNlY29uZHMpIGZvciBzY2FuIHRvIGFib3J0Ci0gKgotICovCi1pbnQgaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgbG9uZyBtcykKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtcyk7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBjYW5jZWwgdGltZW91dFxuIik7Ci0KLQlpd2xfbGVnYWN5X2RvX3NjYW5fYWJvcnQocHJpdik7Ci0KLQl3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgdGltZW91dCkpIHsKLQkJaWYgKCF0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cykpCi0JCQlicmVhazsKLQkJbXNsZWVwKDIwKTsKLQl9Ci0KLQlyZXR1cm4gdGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zdGF0dXMpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQpOwotCi0vKiBTZXJ2aWNlIHJlc3BvbnNlIHRvIFJFUExZX1NDQU5fQ01EICgweDgwKSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9yeF9yZXBseV9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc2NhbnJlcV9ub3RpZmljYXRpb24gKm5vdGlmID0KLQkgICAgKHN0cnVjdCBpd2xfc2NhbnJlcV9ub3RpZmljYXRpb24gKilwa3QtPnUucmF3OwotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gcmVxdWVzdCBzdGF0dXMgPSAweCV4XG4iLCBub3RpZi0+c3RhdHVzKTsKLSNlbmRpZgotfQotCi0vKiBTZXJ2aWNlIFNDQU5fU1RBUlRfTk9USUZJQ0FUSU9OICgweDgyKSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9yeF9zY2FuX3N0YXJ0X25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9zY2Fuc3RhcnRfbm90aWZpY2F0aW9uICpub3RpZiA9Ci0JICAgIChzdHJ1Y3QgaXdsX3NjYW5zdGFydF9ub3RpZmljYXRpb24gKilwa3QtPnUucmF3OwotCXByaXYtPnNjYW5fc3RhcnRfdHNmID0gbGUzMl90b19jcHUobm90aWYtPnRzZl9sb3cpOwotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIHN0YXJ0OiAiCi0JCSAgICAgICAiJWQgWzgwMi4xMSVzXSAiCi0JCSAgICAgICAiKFRTRjogMHglMDhYOiUwOFgpIC0gJWQgKGJlYWNvbiB0aW1lciAldSlcbiIsCi0JCSAgICAgICBub3RpZi0+Y2hhbm5lbCwKLQkJICAgICAgIG5vdGlmLT5iYW5kID8gImJnIiA6ICJhIiwKLQkJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfaGlnaCksCi0JCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdyksCi0JCSAgICAgICBub3RpZi0+c3RhdHVzLCBub3RpZi0+YmVhY29uX3RpbWVyKTsKLX0KLQotLyogU2VydmljZSBTQ0FOX1JFU1VMVFNfTk9USUZJQ0FUSU9OICgweDgzKSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9yeF9zY2FuX3Jlc3VsdHNfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc2NhbnJlc3VsdHNfbm90aWZpY2F0aW9uICpub3RpZiA9Ci0JICAgIChzdHJ1Y3QgaXdsX3NjYW5yZXN1bHRzX25vdGlmaWNhdGlvbiAqKXBrdC0+dS5yYXc7Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBjaC5yZXM6ICIKLQkJICAgICAgICIlZCBbODAyLjExJXNdICIKLQkJICAgICAgICIoVFNGOiAweCUwOFg6JTA4WCkgLSAlZCAiCi0JCSAgICAgICAiZWxhcHNlZD0lbHUgdXNlY1xuIiwKLQkJICAgICAgIG5vdGlmLT5jaGFubmVsLAotCQkgICAgICAgbm90aWYtPmJhbmQgPyAiYmciIDogImEiLAotCQkgICAgICAgbGUzMl90b19jcHUobm90aWYtPnRzZl9oaWdoKSwKLQkJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfbG93KSwKLQkJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT5zdGF0aXN0aWNzWzBdKSwKLQkJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfbG93KSAtIHByaXYtPnNjYW5fc3RhcnRfdHNmKTsKLSNlbmRpZgotfQotCi0vKiBTZXJ2aWNlIFNDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OICgweDg0KSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9yeF9zY2FuX2NvbXBsZXRlX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX3NjYW5jb21wbGV0ZV9ub3RpZmljYXRpb24gKnNjYW5fbm90aWYgPSAodm9pZCAqKXBrdC0+dS5yYXc7Ci0jZW5kaWYKLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkiU2NhbiBjb21wbGV0ZTogJWQgY2hhbm5lbHMgKFRTRiAweCUwOFg6JTA4WCkgLSAlZFxuIiwKLQkJICAgICAgIHNjYW5fbm90aWYtPnNjYW5uZWRfY2hhbm5lbHMsCi0JCSAgICAgICBzY2FuX25vdGlmLT50c2ZfbG93LAotCQkgICAgICAgc2Nhbl9ub3RpZi0+dHNmX2hpZ2gsIHNjYW5fbm90aWYtPnN0YXR1cyk7Ci0KLQkvKiBUaGUgSFcgaXMgbm8gbG9uZ2VyIHNjYW5uaW5nICovCi0JY2xlYXJfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIG9uICVzR0h6IHRvb2sgJWRtc1xuIiwKLQkJICAgICAgIChwcml2LT5zY2FuX2JhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgPyAiMi40IiA6ICI1LjIiLAotCQkgICAgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gcHJpdi0+c2Nhbl9zdGFydCkpOwotCi0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5zY2FuX2NvbXBsZXRlZCk7Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiBzY2FuIGhhbmRsZXJzICovCi0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfU0NBTl9DTURdID0gaXdsX2xlZ2FjeV9yeF9yZXBseV9zY2FuOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NDQU5fU1RBUlRfTk9USUZJQ0FUSU9OXSA9Ci0JCQkJCWl3bF9sZWdhY3lfcnhfc2Nhbl9zdGFydF9ub3RpZjsKLQlwcml2LT5yeF9oYW5kbGVyc1tTQ0FOX1JFU1VMVFNfTk9USUZJQ0FUSU9OXSA9Ci0JCQkJCWl3bF9sZWdhY3lfcnhfc2Nhbl9yZXN1bHRzX25vdGlmOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OXSA9Ci0JCQkJCWl3bF9sZWdhY3lfcnhfc2Nhbl9jb21wbGV0ZV9ub3RpZjsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKTsKLQotaW5saW5lIHUxNiBpd2xfbGVnYWN5X2dldF9hY3RpdmVfZHdlbGxfdGltZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkJICAgICB1OCBuX3Byb2JlcykKLXsKLQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlyZXR1cm4gSVdMX0FDVElWRV9EV0VMTF9USU1FXzUyICsKLQkJCUlXTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzUyR0haICogKG5fcHJvYmVzICsgMSk7Ci0JZWxzZQotCQlyZXR1cm4gSVdMX0FDVElWRV9EV0VMTF9USU1FXzI0ICsKLQkJCUlXTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzI0R0haICogKG5fcHJvYmVzICsgMSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKTsKLQotdTE2IGl3bF9sZWdhY3lfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQl1MTYgcGFzc2l2ZSA9IChiYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopID8KLQkgICAgSVdMX1BBU1NJVkVfRFdFTExfQkFTRSArIElXTF9QQVNTSVZFX0RXRUxMX1RJTUVfMjQgOgotCSAgICBJV0xfUEFTU0lWRV9EV0VMTF9CQVNFICsgSVdMX1BBU1NJVkVfRFdFTExfVElNRV81MjsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKSB7Ci0JCS8qCi0JCSAqIElmIHdlJ3JlIGFzc29jaWF0ZWQsIHdlIGNsYW1wIHRoZSBtYXhpbXVtIHBhc3NpdmUKLQkJICogZHdlbGwgdGltZSB0byBiZSA5OCUgb2YgdGhlIHNtYWxsZXN0IGJlYWNvbiBpbnRlcnZhbAotCQkgKiAobWludXMgMiAqIGNoYW5uZWwgdHVuZSB0aW1lKQotCQkgKi8KLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJCXUxNiB2YWx1ZTsKLQotCQkJaWYgKCFpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCi0JCQkJY29udGludWU7Ci0JCQl2YWx1ZSA9IGN0eC0+dmlmID8gY3R4LT52aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgOiAwOwotCQkJaWYgKCh2YWx1ZSA+IElXTF9QQVNTSVZFX0RXRUxMX0JBU0UpIHx8ICF2YWx1ZSkKLQkJCQl2YWx1ZSA9IElXTF9QQVNTSVZFX0RXRUxMX0JBU0U7Ci0JCQl2YWx1ZSA9ICh2YWx1ZSAqIDk4KSAvIDEwMCAtIElXTF9DSEFOTkVMX1RVTkVfVElNRSAqIDI7Ci0JCQlwYXNzaXZlID0gbWluKHZhbHVlLCBwYXNzaXZlKTsKLQkJfQotCX0KLQotCXJldHVybiBwYXNzaXZlOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUpOwotCi12b2lkIGl3bF9sZWdhY3lfaW5pdF9zY2FuX3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTggYW50X2lkeCA9IGZscyhwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50KSAtIDE7Ci0JaWYgKCFwcml2LT5zY2FuX3R4X2FudFtJRUVFODAyMTFfQkFORF81R0haXSkKLQkJcHJpdi0+c2Nhbl90eF9hbnRbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBhbnRfaWR4OwotCWlmICghcHJpdi0+c2Nhbl90eF9hbnRbSUVFRTgwMjExX0JBTkRfMkdIWl0pCi0JCXByaXYtPnNjYW5fdHhfYW50W0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gYW50X2lkeDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9pbml0X3NjYW5fcGFyYW1zKTsKLQotc3RhdGljIGludCBpd2xfbGVnYWN5X3NjYW5faW5pdGlhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCWludCByZXQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoV0FSTl9PTighcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5yZXF1ZXN0X3NjYW4pKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX2NoZWNrKTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihwcml2KSkgewotCQlJV0xfV0FSTihwcml2LCAiUmVxdWVzdCBzY2FuIGNhbGxlZCB3aGVuIGRyaXZlciBub3QgcmVhZHkuXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LAotCQkJIk11bHRpcGxlIGNvbmN1cnJlbnQgc2NhbiByZXF1ZXN0cyBpbiBwYXJhbGxlbC5cbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTl9BQk9SVElORywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gcmVxdWVzdCB3aGlsZSBhYm9ydCBwZW5kaW5nLlxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlN0YXJ0aW5nIHNjYW4uLi5cbiIpOwotCi0Jc2V0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpOwotCXByaXYtPnNjYW5fc3RhcnQgPSBqaWZmaWVzOwotCi0JcmV0ID0gcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5yZXF1ZXN0X3NjYW4ocHJpdiwgdmlmKTsKLQlpZiAocmV0KSB7Ci0JCWNsZWFyX2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5zY2FuX2NoZWNrLAotCQkJICAgSVdMX1NDQU5fQ0hFQ0tfV0FUQ0hET0cpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2xfbGVnYWN5X21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpZiAocmVxLT5uX2NoYW5uZWxzID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gYWxyZWFkeSBpbiBwcm9ncmVzcy5cbiIpOwotCQlyZXQgPSAtRUFHQUlOOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JLyogbWFjODAyMTEgd2lsbCBvbmx5IGFzayBmb3Igb25lIGJhbmQgYXQgYSB0aW1lICovCi0JcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxOwotCXByaXYtPnNjYW5fdmlmID0gdmlmOwotCXByaXYtPnNjYW5fYmFuZCA9IHJlcS0+Y2hhbm5lbHNbMF0tPmJhbmQ7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NjYW5faW5pdGlhdGUocHJpdiwgdmlmKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfaHdfc2Nhbik7Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfYmdfc2Nhbl9jaGVjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgc2Nhbl9jaGVjay53b3JrKTsKLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIGNoZWNrIHdvcmtcbiIpOwotCi0JLyogU2luY2Ugd2UgYXJlIGhlcmUgZmlybXdhcmUgZG9lcyBub3QgZmluaXNoIHNjYW4gYW5kCi0JICogbW9zdCBsaWtlbHkgaXMgaW4gYmFkIHNoYXBlLCBzbyB3ZSBkb24ndCBib3RoZXIgdG8KLQkgKiBzZW5kIGFib3J0IGNvbW1hbmQsIGp1c3QgZm9yY2Ugc2NhbiBjb21wbGV0ZSB0byBtYWM4MDIxMSAqLwotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpd2xfbGVnYWN5X2ZvcmNlX3NjYW5fZW5kKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEgLSBmaWxsIGluIGFsbCByZXF1aXJlZCBmaWVsZHMgYW5kIElFIGZvciBwcm9iZSByZXF1ZXN0Ci0gKi8KLQotdTE2Ci1pd2xfbGVnYWN5X2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9tZ210ICpmcmFtZSwKLQkJICAgICAgIGNvbnN0IHU4ICp0YSwgY29uc3QgdTggKmllcywgaW50IGllX2xlbiwgaW50IGxlZnQpCi17Ci0JaW50IGxlbiA9IDA7Ci0JdTggKnBvcyA9IE5VTEw7Ci0KLQkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgcHJvYmUgcmVxdWVzdCwKLQkgKiB0d28gbWFuZGF0b3J5IElFcyBhbmQgdGhlIGRhdGEgKi8KLQlsZWZ0IC09IDI0OwotCWlmIChsZWZ0IDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQlmcmFtZS0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOwotCW1lbWNweShmcmFtZS0+ZGEsIGl3bGVnYWN5X2JjYXN0X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkoZnJhbWUtPnNhLCB0YSwgRVRIX0FMRU4pOwotCW1lbWNweShmcmFtZS0+YnNzaWQsIGl3bGVnYWN5X2JjYXN0X2FkZHIsIEVUSF9BTEVOKTsKLQlmcmFtZS0+c2VxX2N0cmwgPSAwOwotCi0JbGVuICs9IDI0OwotCi0JLyogLi4ubmV4dCBJRS4uLiAqLwotCXBvcyA9ICZmcmFtZS0+dS5wcm9iZV9yZXEudmFyaWFibGVbMF07Ci0KLQkvKiBmaWxsIGluIG91ciBpbmRpcmVjdCBTU0lEIElFICovCi0JbGVmdCAtPSAyOwotCWlmIChsZWZ0IDwgMCkKLQkJcmV0dXJuIDA7Ci0JKnBvcysrID0gV0xBTl9FSURfU1NJRDsKLQkqcG9zKysgPSAwOwotCi0JbGVuICs9IDI7Ci0KLQlpZiAoV0FSTl9PTihsZWZ0IDwgaWVfbGVuKSkKLQkJcmV0dXJuIGxlbjsKLQotCWlmIChpZXMgJiYgaWVfbGVuKSB7Ci0JCW1lbWNweShwb3MsIGllcywgaWVfbGVuKTsKLQkJbGVuICs9IGllX2xlbjsKLQl9Ci0KLQlyZXR1cm4gKHUxNilsZW47Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEpOwotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2JnX2Fib3J0X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsIGFib3J0X3NjYW4pOwotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkFib3J0IHNjYW4gd29ya1xuIik7Ci0KLQkvKiBXZSBrZWVwIHNjYW5fY2hlY2sgd29yayBxdWV1ZWQgaW4gY2FzZSB3aGVuIGZpcm13YXJlIHdpbGwgbm90Ci0JICogcmVwb3J0IGJhY2sgc2NhbiBjb21wbGV0ZWQgbm90aWZpY2F0aW9uICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2JnX3NjYW5fY29tcGxldGVkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPQotCSAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGl3bF9wcml2LCBzY2FuX2NvbXBsZXRlZCk7Ci0JYm9vbCBhYm9ydGVkOwotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkNvbXBsZXRlZCBzY2FuLlxuIik7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX2NoZWNrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWFib3J0ZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZwcml2LT5zdGF0dXMpOwotCWlmIChhYm9ydGVkKQotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiQWJvcnRlZCBzY2FuIGNvbXBsZXRlZC5cbiIpOwotCi0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBhbHJlYWR5IGNvbXBsZXRlZC5cbiIpOwotCQlnb3RvIG91dF9zZXR0aW5nczsKLQl9Ci0KLQlpd2xfbGVnYWN5X2NvbXBsZXRlX3NjYW4ocHJpdiwgYWJvcnRlZCk7Ci0KLW91dF9zZXR0aW5nczoKLQkvKiBDYW4gd2Ugc3RpbGwgdGFsayB0byBmaXJtd2FyZSA/ICovCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKQotCQlnb3RvIG91dDsKLQotCS8qCi0JICogV2UgZG8gbm90IGNvbW1pdCBwb3dlciBzZXR0aW5ncyB3aGlsZSBzY2FuIGlzIHBlbmRpbmcsCi0JICogZG8gaXQgbm93IGlmIHRoZSBzZXR0aW5ncyBjaGFuZ2VkLgotCSAqLwotCWl3bF9sZWdhY3lfcG93ZXJfc2V0X21vZGUocHJpdiwgJnByaXYtPnBvd2VyX2RhdGEuc2xlZXBfY21kX25leHQsIGZhbHNlKTsKLQlpd2xfbGVnYWN5X3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl9uZXh0LCBmYWxzZSk7Ci0KLQlwcml2LT5jZmctPm9wcy0+dXRpbHMtPnBvc3Rfc2Nhbihwcml2KTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi12b2lkIGl3bF9sZWdhY3lfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlJTklUX1dPUksoJnByaXYtPnNjYW5fY29tcGxldGVkLCBpd2xfbGVnYWN5X2JnX3NjYW5fY29tcGxldGVkKTsKLQlJTklUX1dPUksoJnByaXYtPmFib3J0X3NjYW4sIGl3bF9sZWdhY3lfYmdfYWJvcnRfc2Nhbik7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnNjYW5fY2hlY2ssIGl3bF9sZWdhY3lfYmdfc2Nhbl9jaGVjayk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKTsKLQotdm9pZCBpd2xfbGVnYWN5X2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPmFib3J0X3NjYW4pOwotCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPnNjYW5fY29tcGxldGVkKTsKLQotCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnNjYW5fY2hlY2spKSB7Ci0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJaXdsX2xlZ2FjeV9mb3JjZV9zY2FuX2VuZChwcml2KTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXNwZWN0cnVtLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3BlY3RydW0uaAppbmRleCA5ZjcwYTQ3Li44NWZlNDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3BlY3RydW0uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3BlY3RydW0uaApAQCAtMjYsOCArMjYsOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfX2l3bF9sZWdhY3lfc3BlY3RydW1faF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9zcGVjdHJ1bV9oX18KKyNpZm5kZWYgX19pbF9zcGVjdHJ1bV9oX18KKyNkZWZpbmUgX19pbF9zcGVjdHJ1bV9oX18KIGVudW0gewkJCQkvKiBpZWVlODAyMTFfYmFzaWNfcmVwb3J0Lm1hcCAqLwogCUlFRUU4MDIxMV9CQVNJQ19NQVBfQlNTID0gKDEgPDwgMCksCiAJSUVFRTgwMjExX0JBU0lDX01BUF9PRkRNID0gKDEgPDwgMSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3RhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3RhLmMKaW5kZXggNjZmMGZiMi4uNzVmZTMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXN0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zdGEuYwpAQCAtMzEsODEgKzMxLDgyIEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIml3bC1kZXYuaCIKICNpbmNsdWRlICJpd2wtY29yZS5oIgogI2luY2x1ZGUgIml3bC1zdGEuaCIKIAotLyogcHJpdi0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X3N0YV91Y29kZV9hY3RpdmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKKy8qIGlsLT5zdGFfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGlsX3N0YV91Y29kZV9hY3RpdmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IHN0YV9pZCkKIHsKIAotCWlmICghKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkpCi0JCUlXTF9FUlIocHJpdiwKKwlpZiAoIShpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpKQorCQlJTF9FUlIoCiAJCQkiQUNUSVZBVEUgYSBub24gRFJJVkVSIGFjdGl2ZSBzdGF0aW9uIGlkICV1IGFkZHIgJXBNXG4iLAotCQkJc3RhX2lkLCBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJCQlzdGFfaWQsIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CiAKLQlpZiAocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9VQ09ERV9BQ1RJVkUpIHsKLQkJSVdMX0RFQlVHX0FTU09DKHByaXYsCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSB7CisJCURfQVNTT0MoCiAJCQkiU1RBIGlkICV1IGFkZHIgJXBNIGFscmVhZHkgcHJlc2VudCIKIAkJCSIgaW4gdUNvZGUgKGFjY29yZGluZyB0byBkcml2ZXIpXG4iLAotCQkJc3RhX2lkLCBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJCQlzdGFfaWQsIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CiAJfSBlbHNlIHsKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfVUNPREVfQUNUSVZFOwotCQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIkFkZGVkIFNUQSBpZCAldSBhZGRyICVwTSB0byB1Q29kZVxuIiwKLQkJCQlzdGFfaWQsIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyKTsKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfVUNPREVfQUNUSVZFOworCQlEX0FTU09DKCJBZGRlZCBTVEEgaWQgJXUgYWRkciAlcE0gdG8gdUNvZGVcbiIsCisJCQkJc3RhX2lkLCBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOwogCX0KIH0KIAotc3RhdGljIGludCBpd2xfbGVnYWN5X3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqYWRkc3RhLAotCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAorc3RhdGljIGludCBpbF9wcm9jZXNzX2FkZF9zdGFfcmVzcChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJICAgIHN0cnVjdCBpbF9hZGRzdGFfY21kICphZGRzdGEsCisJCQkJICAgIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCwKIAkJCQkgICAgYm9vbCBzeW5jKQogewogCXU4IHN0YV9pZCA9IGFkZHN0YS0+c3RhLnN0YV9pZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAtRUlPOwogCi0JaWYgKHBrdC0+aGRyLmZsYWdzICYgSVdMX0NNRF9GQUlMRURfTVNLKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkJhZCByZXR1cm4gZnJvbSBSRVBMWV9BRERfU1RBICgweCUwOFgpXG4iLAorCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tIENfQUREX1NUQSAoMHglMDhYKVxuIiwKIAkJCXBrdC0+aGRyLmZsYWdzKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUHJvY2Vzc2luZyByZXNwb25zZSBmb3IgYWRkaW5nIHN0YXRpb24gJXVcbiIsCisJRF9JTkZPKCJQcm9jZXNzaW5nIHJlc3BvbnNlIGZvciBhZGRpbmcgc3RhdGlvbiAldVxuIiwKIAkJICAgICAgIHN0YV9pZCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CiAKIAlzd2l0Y2ggKHBrdC0+dS5hZGRfc3RhLnN0YXR1cykgewogCWNhc2UgQUREX1NUQV9TVUNDRVNTX01TSzoKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJFUExZX0FERF9TVEEgUEFTU0VEXG4iKTsKLQkJaXdsX2xlZ2FjeV9zdGFfdWNvZGVfYWN0aXZhdGUocHJpdiwgc3RhX2lkKTsKKwkJRF9JTkZPKCJDX0FERF9TVEEgUEFTU0VEXG4iKTsKKwkJaWxfc3RhX3Vjb2RlX2FjdGl2YXRlKGlsLCBzdGFfaWQpOwogCQlyZXQgPSAwOwogCQlicmVhazsKLQljYXNlIEFERF9TVEFfTk9fUk9PTV9JTl9UQUJMRToKLQkJSVdMX0VSUihwcml2LCAiQWRkaW5nIHN0YXRpb24gJWQgZmFpbGVkLCBubyByb29tIGluIHRhYmxlLlxuIiwKKwljYXNlIEFERF9TVEFfTk9fUk9PTV9JTl9UQkw6CisJCUlMX0VSUigiQWRkaW5nIHN0YXRpb24gJWQgZmFpbGVkLCBubyByb29tIGluIHRhYmxlLlxuIiwKIAkJCXN0YV9pZCk7CiAJCWJyZWFrOwogCWNhc2UgQUREX1NUQV9OT19CTE9DS19BQ0tfUkVTT1VSQ0U6Ci0JCUlXTF9FUlIocHJpdiwKKwkJSUxfRVJSKAogCQkJIkFkZGluZyBzdGF0aW9uICVkIGZhaWxlZCwgbm8gYmxvY2sgYWNrIHJlc291cmNlLlxuIiwKIAkJCXN0YV9pZCk7CiAJCWJyZWFrOwogCWNhc2UgQUREX1NUQV9NT0RJRllfTk9OX0VYSVNUX1NUQToKLQkJSVdMX0VSUihwcml2LCAiQXR0ZW1wdGluZyB0byBtb2RpZnkgbm9uLWV4aXN0aW5nIHN0YXRpb24gJWRcbiIsCisJCUlMX0VSUigiQXR0ZW1wdGluZyB0byBtb2RpZnkgbm9uLWV4aXN0aW5nIHN0YXRpb24gJWRcbiIsCiAJCQlzdGFfaWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlY2VpdmVkIFJFUExZX0FERF9TVEE6KDB4JTA4WClcbiIsCisJCURfQVNTT0MoIlJlY2VpdmVkIENfQUREX1NUQTooMHglMDhYKVxuIiwKIAkJCQlwa3QtPnUuYWRkX3N0YS5zdGF0dXMpOwogCQlicmVhazsKIAl9CiAKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiJXMgc3RhdGlvbiBpZCAldSBhZGRyICVwTVxuIiwKLQkJICAgICAgIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPT0KKwlEX0lORk8oIiVzIHN0YXRpb24gaWQgJXUgYWRkciAlcE1cbiIsCisJCSAgICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9PQogCQkgICAgICAgU1RBX0NPTlRST0xfTU9ESUZZX01TSyA/ICAiTW9kaWZpZWQiIDogIkFkZGVkIiwKLQkJICAgICAgIHN0YV9pZCwgcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCQkgICAgICAgc3RhX2lkLCBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOwogCiAJLyoKIAkgKiBYWFg6IFRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgY29tbWFuZCBidWZmZXIgaXMgb2Z0ZW4gY2hhbmdlZCBmcm9tCkBAIC0xMTUsNjggKzExNiw2OCBAQAogCSAqIGlzc3VlIGhhcyBub3QgeWV0IGJlZW4gcmVzb2x2ZWQgYW5kIHRoaXMgZGVidWdnaW5nIGlzIGxlZnQgdG8KIAkgKiBvYnNlcnZlIHRoZSBwcm9ibGVtLgogCSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICIlcyBzdGF0aW9uIGFjY29yZGluZyB0byBjbWQgYnVmZmVyICVwTVxuIiwKLQkJICAgICAgIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPT0KKwlEX0lORk8oIiVzIHN0YXRpb24gYWNjb3JkaW5nIHRvIGNtZCBidWZmZXIgJXBNXG4iLAorCQkgICAgICAgaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPT0KIAkJICAgICAgIFNUQV9DT05UUk9MX01PRElGWV9NU0sgPyAiTW9kaWZpZWQiIDogIkFkZGVkIiwKIAkJICAgICAgIGFkZHN0YS0+c3RhLmFkZHIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2FkZF9zdGFfY2FsbGJhY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCwKLQkJCQkgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKK3N0YXRpYyB2b2lkIGlsX2FkZF9zdGFfY2FsbGJhY2soc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJCSBzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QpCiB7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqYWRkc3RhID0KLQkJKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgKiljbWQtPmNtZC5wYXlsb2FkOworCXN0cnVjdCBpbF9hZGRzdGFfY21kICphZGRzdGEgPQorCQkoc3RydWN0IGlsX2FkZHN0YV9jbWQgKiljbWQtPmNtZC5wYXlsb2FkOwogCi0JaXdsX2xlZ2FjeV9wcm9jZXNzX2FkZF9zdGFfcmVzcChwcml2LCBhZGRzdGEsIHBrdCwgZmFsc2UpOworCWlsX3Byb2Nlc3NfYWRkX3N0YV9yZXNwKGlsLCBhZGRzdGEsIHBrdCwgZmFsc2UpOwogCiB9CiAKLWludCBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqc3RhLCB1OCBmbGFncykKK2ludCBpbF9zZW5kX2FkZF9zdGEoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkgICAgIHN0cnVjdCBpbF9hZGRzdGFfY21kICpzdGEsIHU4IGZsYWdzKQogewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSBOVUxMOworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAJdTggZGF0YVtzaXplb2YoKnN0YSldOwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9BRERfU1RBLAorCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfQUREX1NUQSwKIAkJLmZsYWdzID0gZmxhZ3MsCiAJCS5kYXRhID0gZGF0YSwKIAl9OwogCXU4IHN0YV9pZCBfX21heWJlX3VudXNlZCA9IHN0YS0+c3RhLnN0YV9pZDsKIAotCUlXTF9ERUJVR19JTkZPKHByaXYsICJBZGRpbmcgc3RhICV1ICglcE0pICVzc3luY2hyb25vdXNseVxuIiwKKwlEX0lORk8oIkFkZGluZyBzdGEgJXUgKCVwTSkgJXNzeW5jaHJvbm91c2x5XG4iLAogCQkgICAgICAgc3RhX2lkLCBzdGEtPnN0YS5hZGRyLCBmbGFncyAmIENNRF9BU1lOQyA/ICAiYSIgOiAiIik7CiAKIAlpZiAoZmxhZ3MgJiBDTURfQVNZTkMpCi0JCWNtZC5jYWxsYmFjayA9IGl3bF9sZWdhY3lfYWRkX3N0YV9jYWxsYmFjazsKKwkJY21kLmNhbGxiYWNrID0gaWxfYWRkX3N0YV9jYWxsYmFjazsKIAllbHNlIHsKIAkJY21kLmZsYWdzIHw9IENNRF9XQU5UX1NLQjsKIAkJbWlnaHRfc2xlZXAoKTsKIAl9CiAKLQljbWQubGVuID0gcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5idWlsZF9hZGRzdGFfaGNtZChzdGEsIGRhdGEpOwotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWQocHJpdiwgJmNtZCk7CisJY21kLmxlbiA9IGlsLT5jZmctPm9wcy0+dXRpbHMtPmJ1aWxkX2FkZHN0YV9oY21kKHN0YSwgZGF0YSk7CisJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOwogCiAJaWYgKHJldCB8fCAoZmxhZ3MgJiBDTURfQVNZTkMpKQogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHJldCA9PSAwKSB7Ci0JCXBrdCA9IChzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqKWNtZC5yZXBseV9wYWdlOwotCQlyZXQgPSBpd2xfbGVnYWN5X3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHByaXYsIHN0YSwgcGt0LCB0cnVlKTsKKwkJcGt0ID0gKHN0cnVjdCBpbF9yeF9wa3QgKiljbWQucmVwbHlfcGFnZTsKKwkJcmV0ID0gaWxfcHJvY2Vzc19hZGRfc3RhX3Jlc3AoaWwsIHN0YSwgcGt0LCB0cnVlKTsKIAl9Ci0JaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIGNtZC5yZXBseV9wYWdlKTsKKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YSk7CitFWFBPUlRfU1lNQk9MKGlsX3NlbmRfYWRkX3N0YSk7CiAKLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfc2V0X2h0X2FkZF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaW5kZXgsCitzdGF0aWMgdm9pZCBpbF9zZXRfaHRfYWRkX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZHgsCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQorCQkJCSAgIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKnN0YV9odF9pbmYgPSAmc3RhLT5odF9jYXA7CiAJX19sZTMyIHN0YV9mbGFnczsKQEAgLTE4NiwxMyArMTg3LDEzIEBACiAJCWdvdG8gZG9uZTsKIAogCW1pbW9fcHNfbW9kZSA9IChzdGFfaHRfaW5mLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA+PiAyOwotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAic3BhdGlhbCBtdWx0aXBsZXhpbmcgcG93ZXIgc2F2ZSBtb2RlOiAlc1xuIiwKKwlEX0FTU09DKCJzcGF0aWFsIG11bHRpcGxleGluZyBwb3dlciBzYXZlIG1vZGU6ICVzXG4iLAogCQkJKG1pbW9fcHNfbW9kZSA9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpID8KIAkJCSJzdGF0aWMiIDoKIAkJCShtaW1vX3BzX21vZGUgPT0gV0xBTl9IVF9DQVBfU01fUFNfRFlOQU1JQykgPwogCQkJImR5bmFtaWMiIDogImRpc2FibGVkIik7CiAKLQlzdGFfZmxhZ3MgPSBwcml2LT5zdGF0aW9uc1tpbmRleF0uc3RhLnN0YXRpb25fZmxhZ3M7CisJc3RhX2ZsYWdzID0gaWwtPnN0YXRpb25zW2lkeF0uc3RhLnN0YXRpb25fZmxhZ3M7CiAKIAlzdGFfZmxhZ3MgJj0gfihTVEFfRkxHX1JUU19NSU1PX1BST1RfTVNLIHwgU1RBX0ZMR19NSU1PX0RJU19NU0spOwogCkBAIC0yMDYsNyArMjA3LDcgQEAKIAljYXNlIFdMQU5fSFRfQ0FQX1NNX1BTX0RJU0FCTEVEOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlJV0xfV0FSTihwcml2LCAiSW52YWxpZCBNSU1PIFBTIG1vZGUgJWRcbiIsIG1pbW9fcHNfbW9kZSk7CisJCUlMX1dBUk4oIkludmFsaWQgTUlNTyBQUyBtb2RlICVkXG4iLCBtaW1vX3BzX21vZGUpOwogCQlicmVhazsKIAl9CiAKQEAgLTIxNiwyNyArMjE3LDI3IEBACiAJc3RhX2ZsYWdzIHw9IGNwdV90b19sZTMyKAogCSAgICAgICh1MzIpc3RhX2h0X2luZi0+YW1wZHVfZGVuc2l0eSA8PCBTVEFfRkxHX0FHR19NUERVX0RFTlNJVFlfUE9TKTsKIAotCWlmIChpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZChwcml2LCBjdHgsICZzdGEtPmh0X2NhcCkpCisJaWYgKGlsX2lzX2h0NDBfdHhfYWxsb3dlZChpbCwgY3R4LCAmc3RhLT5odF9jYXApKQogCQlzdGFfZmxhZ3MgfD0gU1RBX0ZMR19IVDQwX0VOX01TSzsKIAllbHNlCiAJCXN0YV9mbGFncyAmPSB+U1RBX0ZMR19IVDQwX0VOX01TSzsKIAotCXByaXYtPnN0YXRpb25zW2luZGV4XS5zdGEuc3RhdGlvbl9mbGFncyA9IHN0YV9mbGFnczsKKwlpbC0+c3RhdGlvbnNbaWR4XS5zdGEuc3RhdGlvbl9mbGFncyA9IHN0YV9mbGFnczsKICBkb25lOgogCXJldHVybjsKIH0KIAogLyoqCi0gKiBpd2xfbGVnYWN5X3ByZXBfc3RhdGlvbiAtIFByZXBhcmUgc3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYWRkaXRpb24KKyAqIGlsX3ByZXBfc3RhdGlvbiAtIFByZXBhcmUgc3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYWRkaXRpb24KICAqCiAgKiBzaG91bGQgYmUgY2FsbGVkIHdpdGggc3RhX2xvY2sgaGVsZAogICovCi11OCBpd2xfbGVnYWN5X3ByZXBfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCit1OCBpbF9wcmVwX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCiAJCSAgICBjb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkgKnN0YXRpb247CisJc3RydWN0IGlsX3N0YXRpb25fZW50cnkgKnN0YXRpb247CiAJaW50IGk7Ci0JdTggc3RhX2lkID0gSVdMX0lOVkFMSURfU1RBVElPTjsKKwl1OCBzdGFfaWQgPSBJTF9JTlZBTElEX1NUQVRJT047CiAJdTE2IHJhdGU7CiAKIAlpZiAoaXNfYXApCkBAIC0yNDQsMTUgKzI0NSwxNSBAQAogCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHIpKQogCQlzdGFfaWQgPSBjdHgtPmJjYXN0X3N0YV9pZDsKIAllbHNlCi0JCWZvciAoaSA9IElXTF9TVEFfSUQ7IGkgPCBwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKLQkJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPnN0YXRpb25zW2ldLnN0YS5zdGEuYWRkciwKKwkJZm9yIChpID0gSUxfU1RBX0lEOyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgeworCQkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoaWwtPnN0YXRpb25zW2ldLnN0YS5zdGEuYWRkciwKIAkJCQkJCWFkZHIpKSB7CiAJCQkJc3RhX2lkID0gaTsKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJaWYgKCFwcml2LT5zdGF0aW9uc1tpXS51c2VkICYmCi0JCQkgICAgc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCisJCQlpZiAoIWlsLT5zdGF0aW9uc1tpXS51c2VkICYmCisJCQkgICAgc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikKIAkJCQlzdGFfaWQgPSBpOwogCQl9CiAKQEAgLTI2MCw3ICsyNjEsNyBAQAogCSAqIFRoZXNlIHR3byBjb25kaXRpb25zIGhhdmUgdGhlIHNhbWUgb3V0Y29tZSwgYnV0IGtlZXAgdGhlbQogCSAqIHNlcGFyYXRlCiAJICovCi0JaWYgKHVubGlrZWx5KHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKKwlpZiAodW5saWtlbHkoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikpCiAJCXJldHVybiBzdGFfaWQ7CiAKIAkvKgpAQCAtMjY4LDMwICsyNjksMzAgQEAKIAkgKiBzdGF0aW9uLiBLZWVwIHRyYWNrIGlmIG9uZSBpcyBpbiBwcm9ncmVzcyBzbyB0aGF0IHdlIGRvIG5vdCBzZW5kCiAJICogYW5vdGhlci4KIAkgKi8KLQlpZiAocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUykgeworCQlEX0lORk8oCiAJCQkJIlNUQSAlZCBhbHJlYWR5IGluIHByb2Nlc3Mgb2YgYmVpbmcgYWRkZWQuXG4iLAogCQkJCXN0YV9pZCk7CiAJCXJldHVybiBzdGFfaWQ7CiAJfQogCi0JaWYgKChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCi0JICAgIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkgJiYKLQkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkciwgYWRkcikpIHsKLQkJSVdMX0RFQlVHX0FTU09DKHByaXYsCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCisJICAgIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkgJiYKKwkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIsIGFkZHIpKSB7CisJCURfQVNTT0MoCiAJCQkJIlNUQSAlZCAoJXBNKSBhbHJlYWR5IGFkZGVkLCBub3QgYWRkaW5nIGFnYWluLlxuIiwKIAkJCQlzdGFfaWQsIGFkZHIpOwogCQlyZXR1cm4gc3RhX2lkOwogCX0KIAotCXN0YXRpb24gPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXTsKLQlzdGF0aW9uLT51c2VkID0gSVdMX1NUQV9EUklWRVJfQUNUSVZFOwotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiQWRkIFNUQSB0byBkcml2ZXIgSUQgJWQ6ICVwTVxuIiwKKwlzdGF0aW9uID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdOworCXN0YXRpb24tPnVzZWQgPSBJTF9TVEFfRFJJVkVSX0FDVElWRTsKKwlEX0FTU09DKCJBZGQgU1RBIHRvIGRyaXZlciBJRCAlZDogJXBNXG4iLAogCQkJc3RhX2lkLCBhZGRyKTsKLQlwcml2LT5udW1fc3RhdGlvbnMrKzsKKwlpbC0+bnVtX3N0YXRpb25zKys7CiAKLQkvKiBTZXQgdXAgdGhlIFJFUExZX0FERF9TVEEgY29tbWFuZCB0byBzZW5kIHRvIGRldmljZSAqLwotCW1lbXNldCgmc3RhdGlvbi0+c3RhLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOworCS8qIFNldCB1cCB0aGUgQ19BRERfU1RBIGNvbW1hbmQgdG8gc2VuZCB0byBkZXZpY2UgKi8KKwltZW1zZXQoJnN0YXRpb24tPnN0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CiAJbWVtY3B5KHN0YXRpb24tPnN0YS5zdGEuYWRkciwgYWRkciwgRVRIX0FMRU4pOwogCXN0YXRpb24tPnN0YS5tb2RlID0gMDsKIAlzdGF0aW9uLT5zdGEuc3RhLnN0YV9pZCA9IHN0YV9pZDsKQEAgLTI5OSw3ICszMDAsNyBAQAogCXN0YXRpb24tPmN0eGlkID0gY3R4LT5jdHhpZDsKIAogCWlmIChzdGEpIHsKLQkJc3RydWN0IGl3bF9zdGF0aW9uX3ByaXZfY29tbW9uICpzdGFfcHJpdjsKKwkJc3RydWN0IGlsX3N0YXRpb25fcHJpdl9jb21tb24gKnN0YV9wcml2OwogCiAJCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OwogCQlzdGFfcHJpdi0+Y3R4ID0gY3R4OwpAQCAtMzEwLDQyICszMTEsNDIgQEAKIAkgKiBTVEEgYW5kIGJyb2FkY2FzdCBTVEEpIHBhc3MgaW4gYSBOVUxMIHN0YSwgYW5kIG1hYzgwMjExCiAJICogZG9lc24ndCBhbGxvdyBIVCBJQlNTLgogCSAqLwotCWl3bF9sZWdhY3lfc2V0X2h0X2FkZF9zdGF0aW9uKHByaXYsIHN0YV9pZCwgc3RhLCBjdHgpOworCWlsX3NldF9odF9hZGRfc3RhdGlvbihpbCwgc3RhX2lkLCBzdGEsIGN0eCk7CiAKIAkvKiAzOTQ1IG9ubHkgKi8KLQlyYXRlID0gKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgPwotCQlJV0xfUkFURV82TV9QTENQIDogSVdMX1JBVEVfMU1fUExDUDsKKwlyYXRlID0gKGlsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopID8KKwkJUkFURV82TV9QTENQIDogUkFURV8xTV9QTENQOwogCS8qIFR1cm4gb24gYm90aCBhbnRlbm5hcyBmb3IgdGhlIHN0YXRpb24uLi4gKi8KIAlzdGF0aW9uLT5zdGEucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMTYocmF0ZSB8IFJBVEVfTUNTX0FOVF9BQl9NU0spOwogCiAJcmV0dXJuIHN0YV9pZDsKIAogfQotRVhQT1JUX1NZTUJPTF9HUEwoaXdsX2xlZ2FjeV9wcmVwX3N0YXRpb24pOworRVhQT1JUX1NZTUJPTF9HUEwoaWxfcHJlcF9zdGF0aW9uKTsKIAogI2RlZmluZSBTVEFfV0FJVF9USU1FT1VUIChIWi8yKQogCiAvKioKLSAqIGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uIC0KKyAqIGlsX2FkZF9zdGF0aW9uX2NvbW1vbiAtCiAgKi8KIGludAotaXdsX2xlZ2FjeV9hZGRfc3RhdGlvbl9jb21tb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKK2lsX2FkZF9zdGF0aW9uX2NvbW1vbihzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCiAJCQkgICBjb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwKIAkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4ICpzdGFfaWRfcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CiAJaW50IHJldCA9IDA7CiAJdTggc3RhX2lkOwotCXN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgc3RhX2NtZDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOwogCiAJKnN0YV9pZF9yID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCXN0YV9pZCA9IGl3bF9sZWdhY3lfcHJlcF9zdGF0aW9uKHByaXYsIGN0eCwgYWRkciwgaXNfYXAsIHN0YSk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBwcmVwYXJlIHN0YXRpb24gJXBNIGZvciBhZGRpdGlvblxuIiwKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlzdGFfaWQgPSBpbF9wcmVwX3N0YXRpb24oaWwsIGN0eCwgYWRkciwgaXNfYXAsIHN0YSk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gcHJlcGFyZSBzdGF0aW9uICVwTSBmb3IgYWRkaXRpb25cbiIsCiAJCQlhZGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM1NCw3NSArMzU1LDc1IEBACiAJICogc3RhdGlvbi4gS2VlcCB0cmFjayBpZiBvbmUgaXMgaW4gcHJvZ3Jlc3Mgc28gdGhhdCB3ZSBkbyBub3Qgc2VuZAogCSAqIGFub3RoZXIuCiAJICovCi0JaWYgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MpIHsKKwkJRF9JTkZPKAogCQkJIlNUQSAlZCBhbHJlYWR5IGluIHByb2Nlc3Mgb2YgYmVpbmcgYWRkZWQuXG4iLAogCQkgICAgICAgc3RhX2lkKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCQlyZXR1cm4gLUVFWElTVDsKIAl9CiAKLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKLQkgICAgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfVUNPREVfQUNUSVZFKSkgewotCQlJV0xfREVCVUdfQVNTT0MocHJpdiwKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKKwkgICAgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSkgeworCQlEX0FTU09DKAogCQkJIlNUQSAlZCAoJXBNKSBhbHJlYWR5IGFkZGVkLCBub3QgYWRkaW5nIGFnYWluLlxuIiwKIAkJCXN0YV9pZCwgYWRkcik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQogCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCQlzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKKwkJCQlzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCiAJLyogQWRkIHN0YXRpb24gdG8gZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CisJcmV0ID0gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOwogCWlmIChyZXQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJSVdMX0VSUihwcml2LCAiQWRkaW5nIHN0YXRpb24gJXBNIGZhaWxlZC5cbiIsCi0JCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9EUklWRVJfQUNUSVZFOwotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJSUxfRVJSKCJBZGRpbmcgc3RhdGlvbiAlcE0gZmFpbGVkLlxuIiwKKwkJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9EUklWRVJfQUNUSVZFOworCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAl9CiAJKnN0YV9pZF9yID0gc3RhX2lkOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uKTsKK0VYUE9SVF9TWU1CT0woaWxfYWRkX3N0YXRpb25fY29tbW9uKTsKIAogLyoqCi0gKiBpd2xfbGVnYWN5X3N0YV91Y29kZV9kZWFjdGl2YXRlIC0gZGVhY3RpdmF0ZSB1Y29kZSBzdGF0dXMgZm9yIGEgc3RhdGlvbgorICogaWxfc3RhX3Vjb2RlX2RlYWN0aXZhdGUgLSBkZWFjdGl2YXRlIHVjb2RlIHN0YXR1cyBmb3IgYSBzdGF0aW9uCiAgKgotICogcHJpdi0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkCisgKiBpbC0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkCiAgKi8KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfc3RhX3Vjb2RlX2RlYWN0aXZhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBzdGFfaWQpCitzdGF0aWMgdm9pZCBpbF9zdGFfdWNvZGVfZGVhY3RpdmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IHN0YV9pZCkKIHsKIAkvKiBVY29kZSBtdXN0IGJlIGFjdGl2ZSBhbmQgZHJpdmVyIG11c3QgYmUgbm9uIGFjdGl2ZSAqLwotCWlmICgocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYKLQkgICAgIChJV0xfU1RBX1VDT0RFX0FDVElWRSB8IElXTF9TVEFfRFJJVkVSX0FDVElWRSkpICE9Ci0JCQkJCQlJV0xfU1RBX1VDT0RFX0FDVElWRSkKLQkJSVdMX0VSUihwcml2LCAicmVtb3ZlZCBub24gYWN0aXZlIFNUQSAldVxuIiwgc3RhX2lkKTsKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJgorCSAgICAgKElMX1NUQV9VQ09ERV9BQ1RJVkUgfCBJTF9TVEFfRFJJVkVSX0FDVElWRSkpICE9CisJCQkJCQlJTF9TVEFfVUNPREVfQUNUSVZFKQorCQlJTF9FUlIoInJlbW92ZWQgbm9uIGFjdGl2ZSBTVEEgJXVcbiIsIHN0YV9pZCk7CiAKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfQUNUSVZFOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9VQ09ERV9BQ1RJVkU7CiAKLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0sIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkpKTsKLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlbW92ZWQgU1RBICV1XG4iLCBzdGFfaWQpOworCW1lbXNldCgmaWwtPnN0YXRpb25zW3N0YV9pZF0sIDAsIHNpemVvZihzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSkpOworCURfQVNTT0MoIlJlbW92ZWQgU1RBICV1XG4iLCBzdGFfaWQpOwogfQogCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfc2VuZF9yZW1vdmVfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCitzdGF0aWMgaW50IGlsX3NlbmRfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLAogCQkJCSAgIGNvbnN0IHU4ICphZGRyLCBpbnQgc3RhX2lkLAogCQkJCSAgIGJvb2wgdGVtcG9yYXJ5KQogewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0OwogCWludCByZXQ7CiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47Ci0Jc3RydWN0IGl3bF9yZW1fc3RhX2NtZCBybV9zdGFfY21kOworCXN0cnVjdCBpbF9yZW1fc3RhX2NtZCBybV9zdGFfY21kOwogCi0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1JFTU9WRV9TVEEsCi0JCS5sZW4gPSBzaXplb2Yoc3RydWN0IGl3bF9yZW1fc3RhX2NtZCksCisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gQ19SRU1fU1RBLAorCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpbF9yZW1fc3RhX2NtZCksCiAJCS5mbGFncyA9IENNRF9TWU5DLAogCQkuZGF0YSA9ICZybV9zdGFfY21kLAogCX07CkBAIC00MzMsMTQgKzQzNCwxNCBAQAogCiAJY21kLmZsYWdzIHw9IENNRF9XQU5UX1NLQjsKIAotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWQocHJpdiwgJmNtZCk7CisJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXBrdCA9IChzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqKWNtZC5yZXBseV9wYWdlOwotCWlmIChwa3QtPmhkci5mbGFncyAmIElXTF9DTURfRkFJTEVEX01TSykgewotCQlJV0xfRVJSKHByaXYsICJCYWQgcmV0dXJuIGZyb20gUkVQTFlfUkVNT1ZFX1NUQSAoMHglMDhYKVxuIiwKKwlwa3QgPSAoc3RydWN0IGlsX3J4X3BrdCAqKWNtZC5yZXBseV9wYWdlOworCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tIENfUkVNX1NUQSAoMHglMDhYKVxuIiwKIAkJCSAgcGt0LT5oZHIuZmxhZ3MpOwogCQlyZXQgPSAtRUlPOwogCX0KQEAgLTQ0OSwzNCArNDUwLDM0IEBACiAJCXN3aXRjaCAocGt0LT51LnJlbV9zdGEuc3RhdHVzKSB7CiAJCWNhc2UgUkVNX1NUQV9TVUNDRVNTX01TSzoKIAkJCWlmICghdGVtcG9yYXJ5KSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJCQlpd2xfbGVnYWN5X3N0YV91Y29kZV9kZWFjdGl2YXRlKHByaXYsIHN0YV9pZCk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCQkJaWxfc3RhX3Vjb2RlX2RlYWN0aXZhdGUoaWwsIHN0YV9pZCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLAogCQkJCQkJCQlmbGFnc19zcGluKTsKIAkJCX0KLQkJCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiUkVQTFlfUkVNT1ZFX1NUQSBQQVNTRURcbiIpOworCQkJRF9BU1NPQygiQ19SRU1fU1RBIFBBU1NFRFxuIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldCA9IC1FSU87Ci0JCQlJV0xfRVJSKHByaXYsICJSRVBMWV9SRU1PVkVfU1RBIGZhaWxlZFxuIik7CisJCQlJTF9FUlIoIkNfUkVNX1NUQSBmYWlsZWRcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIGNtZC5yZXBseV9wYWdlKTsKKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiAvKioKLSAqIGl3bF9sZWdhY3lfcmVtb3ZlX3N0YXRpb24gLSBSZW1vdmUgZHJpdmVyJ3Mga25vd2xlZGdlIG9mIHN0YXRpb24uCisgKiBpbF9yZW1vdmVfc3RhdGlvbiAtIFJlbW92ZSBkcml2ZXIncyBrbm93bGVkZ2Ugb2Ygc3RhdGlvbi4KICAqLwotaW50IGl3bF9sZWdhY3lfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCB1OCBzdGFfaWQsCitpbnQgaWxfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCB1OCBzdGFfaWQsCiAJCSAgICAgICBjb25zdCB1OCAqYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5KHByaXYpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCisJaWYgKCFpbF9pc19yZWFkeShpbCkpIHsKKwkJRF9JTkZPKAogCQkJIlVuYWJsZSB0byByZW1vdmUgc3RhdGlvbiAlcE0sIGRldmljZSBub3QgcmVhZHkuXG4iLAogCQkJYWRkcik7CiAJCS8qCkBAIC00ODcsODUgKzQ4OCw4NSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlbW92aW5nIFNUQSBmcm9tIGRyaXZlcjolZCAgJXBNXG4iLAorCURfQVNTT0MoIlJlbW92aW5nIFNUQSBmcm9tIGRyaXZlcjolZCAgJXBNXG4iLAogCQkJc3RhX2lkLCBhZGRyKTsKIAotCWlmIChXQVJOX09OKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKKwlpZiAoV0FSTl9PTihzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoIShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX0RSSVZFUl9BQ1RJVkUpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSZW1vdmluZyAlcE0gYnV0IG5vbiBEUklWRVIgYWN0aXZlXG4iLAorCWlmICghKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkpIHsKKwkJRF9JTkZPKCJSZW1vdmluZyAlcE0gYnV0IG5vbiBEUklWRVIgYWN0aXZlXG4iLAogCQkJCWFkZHIpOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCi0JaWYgKCEocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9VQ09ERV9BQ1RJVkUpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSZW1vdmluZyAlcE0gYnV0IG5vbiBVQ09ERSBhY3RpdmVcbiIsCisJaWYgKCEoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpKSB7CisJCURfSU5GTygiUmVtb3ZpbmcgJXBNIGJ1dCBub24gVUNPREUgYWN0aXZlXG4iLAogCQkJCWFkZHIpOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCi0JaWYgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfTE9DQUwpIHsKLQkJa2ZyZWUocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSk7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBOVUxMOworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0xPQ0FMKSB7CisJCWtmcmVlKGlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxKTsKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBOVUxMOwogCX0KIAotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9EUklWRVJfQUNUSVZFOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9EUklWRVJfQUNUSVZFOwogCi0JcHJpdi0+bnVtX3N0YXRpb25zLS07CisJaWwtPm51bV9zdGF0aW9ucy0tOwogCi0JQlVHX09OKHByaXYtPm51bV9zdGF0aW9ucyA8IDApOworCUJVR19PTihpbC0+bnVtX3N0YXRpb25zIDwgMCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9yZW1vdmVfc3RhdGlvbihwcml2LCBhZGRyLCBzdGFfaWQsIGZhbHNlKTsKKwlyZXR1cm4gaWxfc2VuZF9yZW1vdmVfc3RhdGlvbihpbCwgYWRkciwgc3RhX2lkLCBmYWxzZSk7CiBvdXRfZXJyOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpd2xfbGVnYWN5X3JlbW92ZV9zdGF0aW9uKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlsX3JlbW92ZV9zdGF0aW9uKTsKIAogLyoqCi0gKiBpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zIC0gY2xlYXIgdWNvZGUgc3RhdGlvbiB0YWJsZSBiaXRzCisgKiBpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyAtIGNsZWFyIHVjb2RlIHN0YXRpb24gdGFibGUgYml0cwogICoKICAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIGFsbCB0aGUgYml0cyBpbiB0aGUgZHJpdmVyIGluZGljYXRpbmcKICAqIHdoaWNoIHN0YXRpb25zIGFyZSBhY3RpdmUgaW4gdGhlIHVjb2RlLiBDYWxsIHdoZW4gc29tZXRoaW5nCiAgKiBvdGhlciB0aGFuIGV4cGxpY2l0IHN0YXRpb24gbWFuYWdlbWVudCB3b3VsZCBjYXVzZSB0aGlzIGluCiAgKiB0aGUgdWNvZGUsIGUuZy4gdW5hc3NvY2lhdGVkIFJYT04uCiAgKi8KLXZvaWQgaXdsX2xlZ2FjeV9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQordm9pZCBpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkgICAgICBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOwogCWJvb2wgY2xlYXJlZCA9IGZhbHNlOwogCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNsZWFyaW5nIHVjb2RlIHN0YXRpb25zIGluIGRyaXZlclxuIik7CisJRF9JTkZPKCJDbGVhcmluZyB1Y29kZSBzdGF0aW9ucyBpbiBkcml2ZXJcbiIpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmIChjdHggJiYgY3R4LT5jdHhpZCAhPSBwcml2LT5zdGF0aW9uc1tpXS5jdHhpZCkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgeworCQlpZiAoY3R4ICYmIGN0eC0+Y3R4aWQgIT0gaWwtPnN0YXRpb25zW2ldLmN0eGlkKQogCQkJY29udGludWU7CiAKLQkJaWYgKHByaXYtPnN0YXRpb25zW2ldLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJaWYgKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkgeworCQkJRF9JTkZPKAogCQkJCSJDbGVhcmluZyB1Y29kZSBhY3RpdmUgZm9yIHN0YXRpb24gJWRcbiIsIGkpOwotCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9BQ1RJVkU7CisJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0FDVElWRTsKIAkJCWNsZWFyZWQgPSB0cnVlOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCiAJaWYgKCFjbGVhcmVkKQotCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQlEX0lORk8oCiAJCQkiTm8gYWN0aXZlIHN0YXRpb25zIGZvdW5kIHRvIGJlIGNsZWFyZWRcbiIpOwogfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zKTsKK0VYUE9SVF9TWU1CT0woaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMpOwogCiAvKioKLSAqIGl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucygpIC0gUmVzdG9yZSBkcml2ZXIga25vd24gc3RhdGlvbnMgdG8gZGV2aWNlCisgKiBpbF9yZXN0b3JlX3N0YXRpb25zKCkgLSBSZXN0b3JlIGRyaXZlciBrbm93biBzdGF0aW9ucyB0byBkZXZpY2UKICAqCiAgKiBBbGwgc3RhdGlvbnMgY29uc2lkZXJlZCBhY3RpdmUgYnkgZHJpdmVyLCBidXQgbm90IHByZXNlbnQgaW4gdWNvZGUsIGlzCiAgKiByZXN0b3JlZC4KQEAgLTU3Myw1OCArNTc0LDU4IEBACiAgKiBGdW5jdGlvbiBzbGVlcHMuCiAgKi8KIHZvaWQKLWl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCitpbF9yZXN0b3JlX3N0YXRpb25zKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQogewotCXN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgc3RhX2NtZDsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgbHE7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCBscTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CiAJaW50IGk7CiAJYm9vbCBmb3VuZCA9IGZhbHNlOwogCWludCByZXQ7CiAJYm9vbCBzZW5kX2xxOwogCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5KHByaXYpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCisJaWYgKCFpbF9pc19yZWFkeShpbCkpIHsKKwkJRF9JTkZPKAogCQkJIk5vdCByZWFkeSB5ZXQsIG5vdCByZXN0b3JpbmcgYW55IHN0YXRpb25zLlxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlc3RvcmluZyBhbGwga25vd24gc3RhdGlvbnMgLi4uIHN0YXJ0LlxuIik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmIChjdHgtPmN0eGlkICE9IHByaXYtPnN0YXRpb25zW2ldLmN0eGlkKQorCURfQVNTT0MoIlJlc3RvcmluZyBhbGwga25vd24gc3RhdGlvbnMgLi4uIHN0YXJ0LlxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKKwkJaWYgKGN0eC0+Y3R4aWQgIT0gaWwtPnN0YXRpb25zW2ldLmN0eGlkKQogCQkJY29udGludWU7Ci0JCWlmICgocHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKLQkJCSAgICAhKHByaXYtPnN0YXRpb25zW2ldLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkpIHsKLQkJCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiUmVzdG9yaW5nIHN0YSAlcE1cbiIsCi0JCQkJCXByaXYtPnN0YXRpb25zW2ldLnN0YS5zdGEuYWRkcik7Ci0JCQlwcml2LT5zdGF0aW9uc1tpXS5zdGEubW9kZSA9IDA7Ci0JCQlwcml2LT5zdGF0aW9uc1tpXS51c2VkIHw9IElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKKwkJaWYgKChpbC0+c3RhdGlvbnNbaV0udXNlZCAmIElMX1NUQV9EUklWRVJfQUNUSVZFKSAmJgorCQkgICAgIShpbC0+c3RhdGlvbnNbaV0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpKSB7CisJCQlEX0FTU09DKCJSZXN0b3Jpbmcgc3RhICVwTVxuIiwKKwkJCQkJaWwtPnN0YXRpb25zW2ldLnN0YS5zdGEuYWRkcik7CisJCQlpbC0+c3RhdGlvbnNbaV0uc3RhLm1vZGUgPSAwOworCQkJaWwtPnN0YXRpb25zW2ldLnVzZWQgfD0gSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CiAJCQlmb3VuZCA9IHRydWU7CiAJCX0KIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmICgocHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmIElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpIHsKLQkJCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW2ldLnN0YSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOworCWZvciAoaSA9IDA7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7CisJCWlmICgoaWwtPnN0YXRpb25zW2ldLnVzZWQgJiBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpIHsKKwkJCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tpXS5zdGEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CiAJCQlzZW5kX2xxID0gZmFsc2U7Ci0JCQlpZiAocHJpdi0+c3RhdGlvbnNbaV0ubHEpIHsKLQkJCQltZW1jcHkoJmxxLCBwcml2LT5zdGF0aW9uc1tpXS5scSwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCkpOworCQkJaWYgKGlsLT5zdGF0aW9uc1tpXS5scSkgeworCQkJCW1lbWNweSgmbHEsIGlsLT5zdGF0aW9uc1tpXS5scSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kKSk7CiAJCQkJc2VuZF9scSA9IHRydWU7CiAJCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JCQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCXJldCA9IGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKIAkJCWlmIChyZXQpIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCQkJCUlXTF9FUlIocHJpdiwgIkFkZGluZyBzdGF0aW9uICVwTSBmYWlsZWQuXG4iLAotCQkJCQlwcml2LT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIpOwotCQkJCXByaXYtPnN0YXRpb25zW2ldLnVzZWQgJj0KLQkJCQkJCX5JV0xfU1RBX0RSSVZFUl9BQ1RJVkU7Ci0JCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPQotCQkJCQkJfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCQlJTF9FUlIoIkFkZGluZyBzdGF0aW9uICVwTSBmYWlsZWQuXG4iLAorCQkJCQlpbC0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyKTsKKwkJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPQorCQkJCQkJfklMX1NUQV9EUklWRVJfQUNUSVZFOworCQkJCWlsLT5zdGF0aW9uc1tpXS51c2VkICY9CisJCQkJCQl+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLAogCQkJCQkJCQlmbGFnc19zcGluKTsKIAkJCX0KIAkJCS8qCkBAIC02MzIsNzggKzYzMyw3OCBAQAogCQkJICogY3VycmVudCBMUSBjb21tYW5kCiAJCQkgKi8KIAkJCWlmIChzZW5kX2xxKQotCQkJCWl3bF9sZWdhY3lfc2VuZF9scV9jbWQocHJpdiwgY3R4LCAmbHEsCisJCQkJaWxfc2VuZF9scV9jbWQoaWwsIGN0eCwgJmxxLAogCQkJCQkJCQlDTURfU1lOQywgdHJ1ZSk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CiAJCX0KIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAlpZiAoIWZvdW5kKQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUmVzdG9yaW5nIGFsbCBrbm93biBzdGF0aW9ucyIKKwkJRF9JTkZPKCJSZXN0b3JpbmcgYWxsIGtub3duIHN0YXRpb25zIgogCQkJCSIgLi4uLiBubyBzdGF0aW9ucyB0byBiZSByZXN0b3JlZC5cbiIpOwogCWVsc2UKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJlc3RvcmluZyBhbGwga25vd24gc3RhdGlvbnMiCisJCURfSU5GTygiUmVzdG9yaW5nIGFsbCBrbm93biBzdGF0aW9ucyIKIAkJCQkiIC4uLi4gY29tcGxldGUuXG4iKTsKIH0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKTsKK0VYUE9SVF9TWU1CT0woaWxfcmVzdG9yZV9zdGF0aW9ucyk7CiAKLWludCBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitpbnQgaWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChzdHJ1Y3QgaWxfcHJpdiAqaWwpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+c3RhX2tleV9tYXhfbnVtOyBpKyspCi0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChpLCAmcHJpdi0+dWNvZGVfa2V5X3RhYmxlKSkKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPnN0YV9rZXlfbWF4X251bTsgaSsrKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJmlsLT51Y29kZV9rZXlfdGFibGUpKQogCQkJcmV0dXJuIGk7CiAKIAlyZXR1cm4gV0VQX0lOVkFMSURfT0ZGU0VUOwogfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleCk7CitFWFBPUlRfU1lNQk9MKGlsX2dldF9mcmVlX3Vjb2RlX2tleV9pZHgpOwogCi12b2lkIGl3bF9sZWdhY3lfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit2b2lkIGlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmICghKHByaXYtPnN0YXRpb25zW2ldLnVzZWQgJiBJV0xfU1RBX0JDQVNUKSkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKKwkJaWYgKCEoaWwtPnN0YXRpb25zW2ldLnVzZWQgJiBJTF9TVEFfQkNBU1QpKQogCQkJY29udGludWU7CiAKLQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9BQ1RJVkU7Ci0JCXByaXYtPm51bV9zdGF0aW9ucy0tOwotCQlCVUdfT04ocHJpdi0+bnVtX3N0YXRpb25zIDwgMCk7Ci0JCWtmcmVlKHByaXYtPnN0YXRpb25zW2ldLmxxKTsKLQkJcHJpdi0+c3RhdGlvbnNbaV0ubHEgPSBOVUxMOworCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0FDVElWRTsKKwkJaWwtPm51bV9zdGF0aW9ucy0tOworCQlCVUdfT04oaWwtPm51bV9zdGF0aW9ucyA8IDApOworCQlrZnJlZShpbC0+c3RhdGlvbnNbaV0ubHEpOworCQlpbC0+c3RhdGlvbnNbaV0ubHEgPSBOVUxMOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaXdsX2xlZ2FjeV9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMpOwogCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2R1bXBfbHFfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHEpCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCitzdGF0aWMgdm9pZCBpbF9kdW1wX2xxX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkgICBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEpCiB7CiAJaW50IGk7Ci0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImxxIHN0YXRpb24gaWQgMHgleFxuIiwgbHEtPnN0YV9pZCk7Ci0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImxxIGFudCAweCVYIDB4JVhcbiIsCisJRF9SQVRFKCJscSBzdGF0aW9uIGlkIDB4JXhcbiIsIGxxLT5zdGFfaWQpOworCURfUkFURSgibHEgYW50IDB4JVggMHglWFxuIiwKIAkJICAgICAgIGxxLT5nZW5lcmFsX3BhcmFtcy5zaW5nbGVfc3RyZWFtX2FudF9tc2ssCiAJCSAgICAgICBscS0+Z2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTElOS19RVUFMX01BWF9SRVRSWV9OVU07IGkrKykKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgImxxIGluZGV4ICVkIDB4JVhcbiIsCisJCURfUkFURSgibHEgaWR4ICVkIDB4JVhcbiIsCiAJCQkgICAgICAgaSwgbHEtPnJzX3RhYmxlW2ldLnJhdGVfbl9mbGFncyk7CiB9CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZHVtcF9scV9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHEpCitzdGF0aWMgaW5saW5lIHZvaWQgaWxfZHVtcF9scV9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgIHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscSkKIHsKIH0KICNlbmRpZgogCiAvKioKLSAqIGl3bF9sZWdhY3lfaXNfbHFfdGFibGVfdmFsaWQoKSAtIFRlc3Qgb25lIGFzcGVjdCBvZiBMUSBjbWQgZm9yIHZhbGlkaXR5CisgKiBpbF9pc19scV90YWJsZV92YWxpZCgpIC0gVGVzdCBvbmUgYXNwZWN0IG9mIExRIGNtZCBmb3IgdmFsaWRpdHkKICAqCiAgKiBJdCBzb21ldGltZXMgaGFwcGVucyB3aGVuIGEgSFQgcmF0ZSBoYXMgYmVlbiBpbiB1c2UgYW5kIHdlCiAgKiBsb29zZSBjb25uZWN0aXZpdHkgd2l0aCBBUCB0aGVuIG1hYzgwMjExIHdpbGwgZmlyc3QgdGVsbCB1cyB0aGF0IHRoZQpAQCAtNzEzLDIyICs3MTQsMjIgQEAKICAqIFRlc3QgZm9yIHRoaXMgdG8gcHJldmVudCBkcml2ZXIgZnJvbSBzZW5kaW5nIExRIGNvbW1hbmQgYmV0d2VlbiB0aGUgdGltZQogICogUlhPTiBmbGFncyBhcmUgdXBkYXRlZCBhbmQgd2hlbiBMUSBjb21tYW5kIGlzIHVwZGF0ZWQuCiAgKi8KLXN0YXRpYyBib29sIGl3bF9sZWdhY3lfaXNfbHFfdGFibGVfdmFsaWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCSAgICAgIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHEpCitzdGF0aWMgYm9vbCBpbF9pc19scV90YWJsZV92YWxpZChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkgICAgICBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICAgICBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEpCiB7CiAJaW50IGk7CiAKIAlpZiAoY3R4LT5odC5lbmFibGVkKQogCQlyZXR1cm4gdHJ1ZTsKIAotCUlXTF9ERUJVR19JTkZPKHByaXYsICJDaGFubmVsICV1IGlzIG5vdCBhbiBIVCBjaGFubmVsXG4iLAorCURfSU5GTygiQ2hhbm5lbCAldSBpcyBub3QgYW4gSFQgY2hhbm5lbFxuIiwKIAkJICAgICAgIGN0eC0+YWN0aXZlLmNoYW5uZWwpOwogCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKSB7CiAJCWlmIChsZTMyX3RvX2NwdShscS0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzKSAmCiAJCQkJCQlSQVRFX01DU19IVF9NU0spIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJICAgICAgICJpbmRleCAlZCBvZiBMUSBleHBlY3RzIEhUIGNoYW5uZWxcbiIsCisJCQlEX0lORk8oCisJCQkJICAgICAgICJpZHggJWQgb2YgTFEgZXhwZWN0cyBIVCBjaGFubmVsXG4iLAogCQkJCSAgICAgICBpKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtNzM3LDcgKzczOCw3IEBACiB9CiAKIC8qKgotICogaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZCgpIC0gU2VuZCBsaW5rIHF1YWxpdHkgY29tbWFuZAorICogaWxfc2VuZF9scV9jbWQoKSAtIFNlbmQgbGluayBxdWFsaXR5IGNvbW1hbmQKICAqIEBpbml0OiBUaGlzIGNvbW1hbmQgaXMgc2VudCBhcyBwYXJ0IG9mIHN0YXRpb24gaW5pdGlhbGl6YXRpb24gcmlnaHQKICAqICAgICAgICBhZnRlciBzdGF0aW9uIGhhcyBiZWVuIGFkZGVkLgogICoKQEAgLTc0NiwzNSArNzQ3LDM1IEBACiAgKiB0aGlzIGNhc2UgdG8gY2xlYXIgdGhlIHN0YXRlIGluZGljYXRpbmcgdGhhdCBzdGF0aW9uIGNyZWF0aW9uIGlzIGluCiAgKiBwcm9ncmVzcy4KICAqLwotaW50IGl3bF9sZWdhY3lfc2VuZF9scV9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkgICAgc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICpscSwgdTggZmxhZ3MsIGJvb2wgaW5pdCkKK2ludCBpbF9zZW5kX2xxX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgIHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscSwgdTggZmxhZ3MsIGJvb2wgaW5pdCkKIHsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CiAKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQpLAorCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfVFhfTElOS19RVUFMSVRZX0NNRCwKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCksCiAJCS5mbGFncyA9IGZsYWdzLAogCQkuZGF0YSA9IGxxLAogCX07CiAKLQlpZiAoV0FSTl9PTihscS0+c3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pKQorCWlmIChXQVJOX09OKGxxLT5zdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JaWYgKCEocHJpdi0+c3RhdGlvbnNbbHEtPnN0YV9pZF0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCWlmICghKGlsLT5zdGF0aW9uc1tscS0+c3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAotCWl3bF9sZWdhY3lfZHVtcF9scV9jbWQocHJpdiwgbHEpOworCWlsX2R1bXBfbHFfY21kKGlsLCBscSk7CiAJQlVHX09OKGluaXQgJiYgKGNtZC5mbGFncyAmIENNRF9BU1lOQykpOwogCi0JaWYgKGl3bF9sZWdhY3lfaXNfbHFfdGFibGVfdmFsaWQocHJpdiwgY3R4LCBscSkpCi0JCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWQocHJpdiwgJmNtZCk7CisJaWYgKGlsX2lzX2xxX3RhYmxlX3ZhbGlkKGlsLCBjdHgsIGxxKSkKKwkJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOwogCWVsc2UKIAkJcmV0ID0gLUVJTlZBTDsKIApAQCAtNzgyLDM1ICs3ODMsMzUgQEAKIAkJcmV0dXJuIHJldDsKIAogCWlmIChpbml0KSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJpbml0IExRIGNvbW1hbmQgY29tcGxldGUsIgorCQlEX0lORk8oImluaXQgTFEgY29tbWFuZCBjb21wbGV0ZSwiCiAJCQkJIiBjbGVhcmluZyBzdGEgYWRkaXRpb24gc3RhdHVzIGZvciBzdGEgJWRcbiIsCiAJCQkgICAgICAgbHEtPnN0YV9pZCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JCXByaXYtPnN0YXRpb25zW2xxLT5zdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJaWwtPnN0YXRpb25zW2xxLT5zdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCX0KIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfbHFfY21kKTsKK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9scV9jbWQpOwogCi1pbnQgaXdsX2xlZ2FjeV9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKK2ludCBpbF9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2X2NvbW1vbiAqc3RhX2NvbW1vbiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2X2NvbW1vbiAqc3RhX2NvbW1vbiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKIAlpbnQgcmV0OwogCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInJlY2VpdmVkIHJlcXVlc3QgdG8gcmVtb3ZlIHN0YXRpb24gJXBNXG4iLAorCURfSU5GTygicmVjZWl2ZWQgcmVxdWVzdCB0byByZW1vdmUgc3RhdGlvbiAlcE1cbiIsCiAJCQlzdGEtPmFkZHIpOwotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byByZW1vdmUgc3RhdGlvbiAlcE1cbiIsCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlEX0lORk8oInByb2NlZWRpbmcgdG8gcmVtb3ZlIHN0YXRpb24gJXBNXG4iLAogCQkJc3RhLT5hZGRyKTsKLQlyZXQgPSBpd2xfbGVnYWN5X3JlbW92ZV9zdGF0aW9uKHByaXYsIHN0YV9jb21tb24tPnN0YV9pZCwgc3RhLT5hZGRyKTsKKwlyZXQgPSBpbF9yZW1vdmVfc3RhdGlvbihpbCwgc3RhX2NvbW1vbi0+c3RhX2lkLCBzdGEtPmFkZHIpOwogCWlmIChyZXQpCi0JCUlXTF9FUlIocHJpdiwgIkVycm9yIHJlbW92aW5nIHN0YXRpb24gJXBNXG4iLAorCQlJTF9FUlIoIkVycm9yIHJlbW92aW5nIHN0YXRpb24gJXBNXG4iLAogCQkJc3RhLT5hZGRyKTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfc3RhX3JlbW92ZSk7CitFWFBPUlRfU1lNQk9MKGlsX21hY19zdGFfcmVtb3ZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zdGEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiZDc1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3RhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX2l3bF9sZWdhY3lfc3RhX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfc3RhX2hfXwotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotCi0jZGVmaW5lIEhXX0tFWV9EWU5BTUlDIDAKLSNkZWZpbmUgSFdfS0VZX0RFRkFVTFQgMQotCi0jZGVmaW5lIElXTF9TVEFfRFJJVkVSX0FDVElWRSBCSVQoMCkgLyogZHJpdmVyIGVudHJ5IGlzIGFjdGl2ZSAqLwotI2RlZmluZSBJV0xfU1RBX1VDT0RFX0FDVElWRSAgQklUKDEpIC8qIHVjb2RlIGVudHJ5IGlzIGFjdGl2ZSAqLwotI2RlZmluZSBJV0xfU1RBX1VDT0RFX0lOUFJPR1JFU1MgIEJJVCgyKSAvKiB1Y29kZSBlbnRyeSBpcyBpbiBwcm9jZXNzIG9mCi0JCQkJCSAgICBiZWluZyBhY3RpdmF0ZWQgKi8KLSNkZWZpbmUgSVdMX1NUQV9MT0NBTCBCSVQoMykgLyogc3RhdGlvbiBzdGF0ZSBub3QgZGlyZWN0ZWQgYnkgbWFjODAyMTE7Ci0JCQkJKHRoaXMgaXMgZm9yIHRoZSBJQlNTIEJTU0lEIHN0YXRpb25zKSAqLwotI2RlZmluZSBJV0xfU1RBX0JDQVNUIEJJVCg0KSAvKiB0aGlzIHN0YXRpb24gaXMgdGhlIHNwZWNpYWwgYmNhc3Qgc3RhdGlvbiAqLwotCi0KLXZvaWQgaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLXZvaWQgaXdsX2xlZ2FjeV9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLXZvaWQgaXdsX2xlZ2FjeV9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2xlZ2FjeV9nZXRfZnJlZV91Y29kZV9rZXlfaW5kZXgoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kICpzdGEsIHU4IGZsYWdzKTsKLWludCBpd2xfbGVnYWN5X2FkZF9zdGF0aW9uX2NvbW1vbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJY29uc3QgdTggKmFkZHIsIGJvb2wgaXNfYXAsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCAqc3RhX2lkX3IpOwotaW50IGl3bF9sZWdhY3lfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJY29uc3QgdTggc3RhX2lkLAotCQkJY29uc3QgdTggKmFkZHIpOwotaW50IGl3bF9sZWdhY3lfbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7Ci0KLXU4IGl3bF9sZWdhY3lfcHJlcF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQljb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwotCi1pbnQgaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICpscSwKLQkJCXU4IGZsYWdzLCBib29sIGluaXQpOwotCi0vKioKLSAqIGl3bF9sZWdhY3lfY2xlYXJfZHJpdmVyX3N0YXRpb25zIC0gY2xlYXIga25vd2xlZGdlIG9mIGFsbCBzdGF0aW9ucyBmcm9tIGRyaXZlcgotICogQHByaXY6IGl3bCBwcml2IHN0cnVjdAotICoKLSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBpd2xfZG93bigpIHRvIG1ha2Ugc3VyZSB0aGF0IGluIHRoZSBjYXNlCi0gKiB3ZSdyZSBjb21pbmcgdGhlcmUgZnJvbSBhIGhhcmR3YXJlIHJlc3RhcnQgbWFjODAyMTEgd2lsbCBiZQotICogYWJsZSB0byByZWNvbmZpZ3VyZSBzdGF0aW9ucyAtLSBpZiB3ZSdyZSBnZXR0aW5nIHRoZXJlIGluIHRoZQotICogbm9ybWFsIGRvd24gZmxvdyB0aGVuIHRoZSBzdGF0aW9ucyB3aWxsIGFscmVhZHkgYmUgY2xlYXJlZC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfY2xlYXJfZHJpdmVyX3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQltZW1zZXQocHJpdi0+c3RhdGlvbnMsIDAsIHNpemVvZihwcml2LT5zdGF0aW9ucykpOwotCXByaXYtPm51bV9zdGF0aW9ucyA9IDA7Ci0KLQlwcml2LT51Y29kZV9rZXlfdGFibGUgPSAwOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJLyoKLQkJICogUmVtb3ZlIGFsbCBrZXkgaW5mb3JtYXRpb24gdGhhdCBpcyBub3Qgc3RvcmVkIGFzIHBhcnQKLQkJICogb2Ygc3RhdGlvbiBpbmZvcm1hdGlvbiBzaW5jZSBtYWM4MDIxMSBtYXkgbm90IGhhdmUgaGFkCi0JCSAqIGEgY2hhbmNlIHRvIHJlbW92ZSBhbGwgdGhlIGtleXMuIFdoZW4gZGV2aWNlIGlzCi0JCSAqIHJlY29uZmlndXJlZCBieSBtYWM4MDIxMSBhZnRlciBhbiBlcnJvciBhbGwga2V5cyB3aWxsCi0JCSAqIGJlIHJlY29uZmlndXJlZC4KLQkJICovCi0JCW1lbXNldChjdHgtPndlcF9rZXlzLCAwLCBzaXplb2YoY3R4LT53ZXBfa2V5cykpOwotCQljdHgtPmtleV9tYXBwaW5nX2tleXMgPSAwOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfc3RhX2lkKHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCi17Ci0JaWYgKFdBUk5fT04oIXN0YSkpCi0JCXJldHVybiBJV0xfSU5WQUxJRF9TVEFUSU9OOwotCi0JcmV0dXJuICgoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXZfY29tbW9uICopc3RhLT5kcnZfcHJpdiktPnN0YV9pZDsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X3N0YV9pZF9vcl9icm9hZGNhc3QgLSByZXR1cm4gc3RhX2lkIG9yIGJyb2FkY2FzdCBzdGEKLSAqIEBwcml2OiBpd2wgcHJpdgotICogQGNvbnRleHQ6IHRoZSBjdXJyZW50IGNvbnRleHQKLSAqIEBzdGE6IG1hYzgwMjExIHN0YXRpb24KLSAqCi0gKiBJbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgbWFjODAyMTEgcGFzc2VzIGEgc3RhdGlvbiBwb2ludGVyCi0gKiB0aGF0IG1heSBiZSAlTlVMTCwgZm9yIGV4YW1wbGUgZHVyaW5nIFRYIG9yIGtleSBzZXR1cC4gSW4KLSAqIHRoYXQgY2FzZSwgd2UgbmVlZCB0byB1c2UgdGhlIGJyb2FkY2FzdCBzdGF0aW9uLCBzbyB0aGlzCi0gKiBpbmxpbmUgd3JhcHMgdGhhdCBwYXR0ZXJuLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3N0YV9pZF9vcl9icm9hZGNhc3Qoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjb250ZXh0LAotCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCi17Ci0JaW50IHN0YV9pZDsKLQotCWlmICghc3RhKQotCQlyZXR1cm4gY29udGV4dC0+YmNhc3Rfc3RhX2lkOwotCi0Jc3RhX2lkID0gaXdsX2xlZ2FjeV9zdGFfaWQoc3RhKTsKLQotCS8qCi0JICogbWFjODAyMTEgc2hvdWxkIG5vdCBiZSBwYXNzaW5nIGEgcGFydGlhbGx5Ci0JICogaW5pdGlhbGlzZWQgc3RhdGlvbiEKLQkgKi8KLQlXQVJOX09OKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKTsKLQotCXJldHVybiBzdGFfaWQ7Ci19Ci0jZW5kaWYgLyogX19pd2xfbGVnYWN5X3N0YV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC10eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOWUyNjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0KLS8qKgotICogaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0ciAtIFNlbmQgbmV3IHdyaXRlIGluZGV4IHRvIGhhcmR3YXJlCi0gKi8KLXZvaWQKLWl3bF9sZWdhY3lfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0JdTMyIHJlZyA9IDA7Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKLQotCWlmICh0eHEtPm5lZWRfdXBkYXRlID09IDApCi0JCXJldHVybjsKLQotCS8qIGlmIHdlJ3JlIHRyeWluZyB0byBzYXZlIHBvd2VyICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpKSB7Ci0JCS8qIHdha2UgdXAgbmljIGlmIGl0J3MgcG93ZXJlZCBkb3duIC4uLgotCQkgKiB1Q29kZSB3aWxsIHdha2UgdXAsIGFuZCBpbnRlcnJ1cHQgdXMgYWdhaW4sIHNvIG5leHQKLQkJICogdGltZSB3ZSdsbCBza2lwIHRoaXMgcGFydC4gKi8KLQkJcmVnID0gaXdsX3JlYWQzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMSk7Ci0KLQkJaWYgKHJlZyAmIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVApIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJCSJUeCBxdWV1ZSAlZCByZXF1ZXN0aW5nIHdha2V1cCwiCi0JCQkJCSIgR1AxID0gMHgleFxuIiwgdHhxX2lkLCByZWcpOwotCQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKLQkJCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1dSUFRSLAotCQkJCXR4cS0+cS53cml0ZV9wdHIgfCAodHhxX2lkIDw8IDgpKTsKLQotCQkvKgotCQkgKiBlbHNlIG5vdCBpbiBwb3dlci1zYXZlIG1vZGUsCi0JCSAqIHVDb2RlIHdpbGwgbmV2ZXIgc2xlZXAgd2hlbiB3ZSdyZQotCQkgKiB0cnlpbmcgdG8gdHggKGR1cmluZyBSRktJTEwsIHdlJ3JlIG5vdCB0cnlpbmcgdG8gdHgpLgotCQkgKi8KLQl9IGVsc2UKLQkJaXdsX3dyaXRlMzIocHJpdiwgSEJVU19UQVJHX1dSUFRSLAotCQkJICAgIHR4cS0+cS53cml0ZV9wdHIgfCAodHhxX2lkIDw8IDgpKTsKLQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cik7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV90eF9xdWV1ZV91bm1hcCAtICBVbm1hcCBhbnkgcmVtYWluaW5nIERNQSBtYXBwaW5ncyBhbmQgZnJlZSBza2IncwotICovCi12b2lkIGl3bF9sZWdhY3lfdHhfcXVldWVfdW5tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKLQotCWlmIChxLT5uX2JkID09IDApCi0JCXJldHVybjsKLQotCXdoaWxlIChxLT53cml0ZV9wdHIgIT0gcS0+cmVhZF9wdHIpIHsKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2ZyZWVfdGZkKHByaXYsIHR4cSk7Ci0JCXEtPnJlYWRfcHRyID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4X3F1ZXVlX3VubWFwKTsKLQotLyoqCi0gKiBpd2xfbGVnYWN5X3R4X3F1ZXVlX2ZyZWUgLSBEZWFsbG9jYXRlIERNQSBxdWV1ZS4KLSAqIEB0eHE6IFRyYW5zbWl0IHF1ZXVlIHRvIGRlYWxsb2NhdGUuCi0gKgotICogRW1wdHkgcXVldWUgYnkgcmVtb3ZpbmcgYW5kIGRlc3Ryb3lpbmcgYWxsIEJEJ3MuCi0gKiBGcmVlIGFsbCBidWZmZXJzLgotICogMC1maWxsLCBidXQgZG8gbm90IGZyZWUgInR4cSIgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCkKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBjaV9kZXYtPmRldjsKLQlpbnQgaTsKLQotCWl3bF9sZWdhY3lfdHhfcXVldWVfdW5tYXAocHJpdiwgdHhxX2lkKTsKLQotCS8qIERlLWFsbG9jIGFycmF5IG9mIGNvbW1hbmQvdHggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBURkRfVFhfQ01EX1NMT1RTOyBpKyspCi0JCWtmcmVlKHR4cS0+Y21kW2ldKTsKLQotCS8qIERlLWFsbG9jIGNpcmN1bGFyIGJ1ZmZlciBvZiBURkRzICovCi0JaWYgKHR4cS0+cS5uX2JkKQotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqCi0JCQkJICB0eHEtPnEubl9iZCwgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOwotCi0JLyogRGUtYWxsb2MgYXJyYXkgb2YgcGVyLVRGRCBkcml2ZXIgZGF0YSAqLwotCWtmcmVlKHR4cS0+dHhiKTsKLQl0eHEtPnR4YiA9IE5VTEw7Ci0KLQkvKiBkZWFsbG9jYXRlIGFycmF5cyAqLwotCWtmcmVlKHR4cS0+Y21kKTsKLQlrZnJlZSh0eHEtPm1ldGEpOwotCXR4cS0+Y21kID0gTlVMTDsKLQl0eHEtPm1ldGEgPSBOVUxMOwotCi0JLyogMC1maWxsIHF1ZXVlIGRlc2NyaXB0b3Igc3RydWN0dXJlICovCi0JbWVtc2V0KHR4cSwgMCwgc2l6ZW9mKCp0eHEpKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKTsKLQotLyoqCi0gKiBpd2xfY21kX3F1ZXVlX3VubWFwIC0gVW5tYXAgYW55IHJlbWFpbmluZyBETUEgbWFwcGluZ3MgZnJvbSBjb21tYW5kIHF1ZXVlCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV9jbWRfcXVldWVfdW5tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKLQlpbnQgaTsKLQotCWlmIChxLT5uX2JkID09IDApCi0JCXJldHVybjsKLQotCXdoaWxlIChxLT5yZWFkX3B0ciAhPSBxLT53cml0ZV9wdHIpIHsKLQkJaSA9IGl3bF9sZWdhY3lfZ2V0X2NtZF9pbmRleChxLCBxLT5yZWFkX3B0ciwgMCk7Ci0KLQkJaWYgKHR4cS0+bWV0YVtpXS5mbGFncyAmIENNRF9NQVBQRUQpIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKLQkJCQkJIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaV0sIG1hcHBpbmcpLAotCQkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2ldLCBsZW4pLAotCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQkJCXR4cS0+bWV0YVtpXS5mbGFncyA9IDA7Ci0JCX0KLQotCQlxLT5yZWFkX3B0ciA9IGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIsIHEtPm5fYmQpOwotCX0KLQotCWkgPSBxLT5uX3dpbmRvdzsKLQlpZiAodHhxLT5tZXRhW2ldLmZsYWdzICYgQ01EX01BUFBFRCkgewotCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCi0JCQkJIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaV0sIG1hcHBpbmcpLAotCQkJCSBkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaV0sIGxlbiksCi0JCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JCXR4cS0+bWV0YVtpXS5mbGFncyA9IDA7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2NtZF9xdWV1ZV91bm1hcCk7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9jbWRfcXVldWVfZnJlZSAtIERlYWxsb2NhdGUgRE1BIHF1ZXVlLgotICogQHR4cTogVHJhbnNtaXQgcXVldWUgdG8gZGVhbGxvY2F0ZS4KLSAqCi0gKiBFbXB0eSBxdWV1ZSBieSByZW1vdmluZyBhbmQgZGVzdHJveWluZyBhbGwgQkQncy4KLSAqIEZyZWUgYWxsIGJ1ZmZlcnMuCi0gKiAwLWZpbGwsIGJ1dCBkbyBub3QgZnJlZSAidHhxIiBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KLSAqLwotdm9pZCBpd2xfbGVnYWN5X2NtZF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV07Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBjaV9kZXYtPmRldjsKLQlpbnQgaTsKLQotCWl3bF9sZWdhY3lfY21kX3F1ZXVlX3VubWFwKHByaXYpOwotCi0JLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8PSBURkRfQ01EX1NMT1RTOyBpKyspCi0JCWtmcmVlKHR4cS0+Y21kW2ldKTsKLQotCS8qIERlLWFsbG9jIGNpcmN1bGFyIGJ1ZmZlciBvZiBURkRzICovCi0JaWYgKHR4cS0+cS5uX2JkKQotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqIHR4cS0+cS5uX2JkLAotCQkJCSAgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOwotCi0JLyogZGVhbGxvY2F0ZSBhcnJheXMgKi8KLQlrZnJlZSh0eHEtPmNtZCk7Ci0Ja2ZyZWUodHhxLT5tZXRhKTsKLQl0eHEtPmNtZCA9IE5VTEw7Ci0JdHhxLT5tZXRhID0gTlVMTDsKLQotCS8qIDAtZmlsbCBxdWV1ZSBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLwotCW1lbXNldCh0eHEsIDAsIHNpemVvZigqdHhxKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfY21kX3F1ZXVlX2ZyZWUpOwotCi0vKioqKioqKioqKioqKioqIERNQS1RVUVVRS1HRU5FUkFMLUZVTkNUSU9OUyAgKioqKioKLSAqIERNQSBzZXJ2aWNlcwotICoKLSAqIFRoZW9yeSBvZiBvcGVyYXRpb24KLSAqCi0gKiBBIFR4IG9yIFJ4IHF1ZXVlIHJlc2lkZXMgaW4gaG9zdCBEUkFNLCBhbmQgaXMgY29tcHJpc2VkIG9mIGEgY2lyY3VsYXIgYnVmZmVyCi0gKiBvZiBidWZmZXIgZGVzY3JpcHRvcnMsIGVhY2ggb2Ygd2hpY2ggcG9pbnRzIHRvIG9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyBmb3IKLSAqIHRoZSBkZXZpY2UgdG8gcmVhZCBmcm9tIG9yIGZpbGwuICBEcml2ZXIgYW5kIGRldmljZSBleGNoYW5nZSBzdGF0dXMgb2YgZWFjaAotICogcXVldWUgdmlhICJyZWFkIiBhbmQgIndyaXRlIiBwb2ludGVycy4gIERyaXZlciBrZWVwcyBtaW5pbXVtIG9mIDIgZW1wdHkKLSAqIGVudHJpZXMgaW4gZWFjaCBjaXJjdWxhciBidWZmZXIsIHRvIHByb3RlY3QgYWdhaW5zdCBjb25mdXNpbmcgZW1wdHkgYW5kIGZ1bGwKLSAqIHF1ZXVlIHN0YXRlcy4KLSAqCi0gKiBUaGUgZGV2aWNlIHJlYWRzIG9yIHdyaXRlcyB0aGUgZGF0YSBpbiB0aGUgcXVldWVzIHZpYSB0aGUgZGV2aWNlJ3Mgc2V2ZXJhbAotICogRE1BL0ZJRk8gY2hhbm5lbHMuICBFYWNoIHF1ZXVlIGlzIG1hcHBlZCB0byBhIHNpbmdsZSBETUEgY2hhbm5lbC4KLSAqCi0gKiBGb3IgVHggcXVldWUsIHRoZXJlIGFyZSBsb3cgbWFyayBhbmQgaGlnaCBtYXJrIGxpbWl0cy4gSWYsIGFmdGVyIHF1ZXVpbmcKLSAqIHRoZSBwYWNrZXQgZm9yIFR4LCBmcmVlIHNwYWNlIGJlY29tZSA8IGxvdyBtYXJrLCBUeCBxdWV1ZSBzdG9wcGVkLiBXaGVuCi0gKiByZWNsYWltaW5nIHBhY2tldHMgKG9uICd0eCBkb25lIElSUSksIGlmIGZyZWUgc3BhY2UgYmVjb21lID4gaGlnaCBtYXJrLAotICogVHggcXVldWUgcmVzdW1lZC4KLSAqCi0gKiBTZWUgbW9yZSBkZXRhaWxlZCBpbmZvIGluIGl3bC00OTY1LWh3LmguCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3F1ZXVlICpxKQotewotCWludCBzID0gcS0+cmVhZF9wdHIgLSBxLT53cml0ZV9wdHI7Ci0KLQlpZiAocS0+cmVhZF9wdHIgPiBxLT53cml0ZV9wdHIpCi0JCXMgLT0gcS0+bl9iZDsKLQotCWlmIChzIDw9IDApCi0JCXMgKz0gcS0+bl93aW5kb3c7Ci0JLyoga2VlcCBzb21lIHJlc2VydmUgdG8gbm90IGNvbmZ1c2UgZW1wdHkgYW5kIGZ1bGwgc2l0dWF0aW9ucyAqLwotCXMgLT0gMjsKLQlpZiAocyA8IDApCi0JCXMgPSAwOwotCXJldHVybiBzOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKTsKLQotCi0vKioKLSAqIGl3bF9sZWdhY3lfcXVldWVfaW5pdCAtIEluaXRpYWxpemUgcXVldWUncyBoaWdoL2xvdy13YXRlciBhbmQgcmVhZC93cml0ZSBpbmRleGVzCi0gKi8KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9xdWV1ZSAqcSwKLQkJCSAgaW50IGNvdW50LCBpbnQgc2xvdHNfbnVtLCB1MzIgaWQpCi17Ci0JcS0+bl9iZCA9IGNvdW50OwotCXEtPm5fd2luZG93ID0gc2xvdHNfbnVtOwotCXEtPmlkID0gaWQ7Ci0KLQkvKiBjb3VudCBtdXN0IGJlIHBvd2VyLW9mLXR3byBzaXplLCBvdGhlcndpc2UgaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcAotCSAqIGFuZCBpd2xfbGVnYWN5X3F1ZXVlX2RlY193cmFwIGFyZSBicm9rZW4uICovCi0JQlVHX09OKCFpc19wb3dlcl9vZl8yKGNvdW50KSk7Ci0KLQkvKiBzbG90c19udW0gbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlCi0JICogaXdsX2xlZ2FjeV9nZXRfY21kX2luZGV4IGlzIGJyb2tlbi4gKi8KLQlCVUdfT04oIWlzX3Bvd2VyX29mXzIoc2xvdHNfbnVtKSk7Ci0KLQlxLT5sb3dfbWFyayA9IHEtPm5fd2luZG93IC8gNDsKLQlpZiAocS0+bG93X21hcmsgPCA0KQotCQlxLT5sb3dfbWFyayA9IDQ7Ci0KLQlxLT5oaWdoX21hcmsgPSBxLT5uX3dpbmRvdyAvIDg7Ci0JaWYgKHEtPmhpZ2hfbWFyayA8IDIpCi0JCXEtPmhpZ2hfbWFyayA9IDI7Ci0KLQlxLT53cml0ZV9wdHIgPSBxLT5yZWFkX3B0ciA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X3R4X3F1ZXVlX2FsbG9jIC0gQWxsb2MgZHJpdmVyIGRhdGEgYW5kIFRGRCBDQiBmb3Igb25lIFR4L2NtZCBxdWV1ZQotICovCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfdHhfcXVldWVfYWxsb2Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLCB1MzIgaWQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBjaV9kZXYtPmRldjsKLQlzaXplX3QgdGZkX3N6ID0gcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplICogVEZEX1FVRVVFX1NJWkVfTUFYOwotCi0JLyogRHJpdmVyIHByaXZhdGUgZGF0YSwgb25seSBmb3IgVHggKG5vdCBjb21tYW5kKSBxdWV1ZXMsCi0JICogbm90IHNoYXJlZCB3aXRoIGRldmljZS4gKi8KLQlpZiAoaWQgIT0gcHJpdi0+Y21kX3F1ZXVlKSB7Ci0JCXR4cS0+dHhiID0ga3phbGxvYyhzaXplb2YodHhxLT50eGJbMF0pICoKLQkJCQkgICBURkRfUVVFVUVfU0laRV9NQVgsIEdGUF9LRVJORUwpOwotCQlpZiAoIXR4cS0+dHhiKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJrbWFsbG9jIGZvciBhdXhpbGlhcnkgQkQgIgotCQkJCSAgInN0cnVjdHVyZXMgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9IGVsc2UgewotCQl0eHEtPnR4YiA9IE5VTEw7Ci0JfQotCi0JLyogQ2lyY3VsYXIgYnVmZmVyIG9mIHRyYW5zbWl0IGZyYW1lIGRlc2NyaXB0b3JzIChURkRzKSwKLQkgKiBzaGFyZWQgd2l0aCBkZXZpY2UgKi8KLQl0eHEtPnRmZHMgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCB0ZmRfc3osICZ0eHEtPnEuZG1hX2FkZHIsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghdHhxLT50ZmRzKSB7Ci0JCUlXTF9FUlIocHJpdiwgInBjaV9hbGxvY19jb25zaXN0ZW50KCV6ZCkgZmFpbGVkXG4iLCB0ZmRfc3opOwotCQlnb3RvIGVycm9yOwotCX0KLQl0eHEtPnEuaWQgPSBpZDsKLQotCXJldHVybiAwOwotCi0gZXJyb3I6Ci0Ja2ZyZWUodHhxLT50eGIpOwotCXR4cS0+dHhiID0gTlVMTDsKLQotCXJldHVybiAtRU5PTUVNOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfdHhfcXVldWVfaW5pdCAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG9uZSB0eC9jbWQgcXVldWUKLSAqLwotaW50IGl3bF9sZWdhY3lfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJICAgICAgaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCkKLXsKLQlpbnQgaSwgbGVuOwotCWludCByZXQ7Ci0JaW50IGFjdHVhbF9zbG90cyA9IHNsb3RzX251bTsKLQotCS8qCi0JICogQWxsb2MgYnVmZmVyIGFycmF5IGZvciBjb21tYW5kcyAoVHggb3Igb3RoZXIgdHlwZXMgb2YgY29tbWFuZHMpLgotCSAqIEZvciB0aGUgY29tbWFuZCBxdWV1ZSAoIzQvIzkpLCBhbGxvY2F0ZSBjb21tYW5kIHNwYWNlICsgb25lIGJpZwotCSAqIGNvbW1hbmQgZm9yIHNjYW4sIHNpbmNlIHNjYW4gY29tbWFuZCBpcyB2ZXJ5IGh1Z2U7IHRoZSBzeXN0ZW0gd2lsbAotCSAqIG5vdCBoYXZlIHR3byBzY2FucyBhdCB0aGUgc2FtZSB0aW1lLCBzbyBvbmx5IG9uZSBpcyBuZWVkZWQuCi0JICogRm9yIG5vcm1hbCBUeCBxdWV1ZXMgKGFsbCBvdGhlciBxdWV1ZXMpLCBubyBzdXBlci1zaXplIGNvbW1hbmQKLQkgKiBzcGFjZSBpcyBuZWVkZWQuCi0JICovCi0JaWYgKHR4cV9pZCA9PSBwcml2LT5jbWRfcXVldWUpCi0JCWFjdHVhbF9zbG90cysrOwotCi0JdHhxLT5tZXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl3bF9jbWRfbWV0YSkgKiBhY3R1YWxfc2xvdHMsCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0JdHhxLT5jbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKikgKiBhY3R1YWxfc2xvdHMsCi0JCQkgICBHRlBfS0VSTkVMKTsKLQotCWlmICghdHhxLT5tZXRhIHx8ICF0eHEtPmNtZCkKLQkJZ290byBvdXRfZnJlZV9hcnJheXM7Ci0KLQlsZW4gPSBzaXplb2Yoc3RydWN0IGl3bF9kZXZpY2VfY21kKTsKLQlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsX3Nsb3RzOyBpKyspIHsKLQkJLyogb25seSBoYXBwZW5zIGZvciBjbWQgcXVldWUgKi8KLQkJaWYgKGkgPT0gc2xvdHNfbnVtKQotCQkJbGVuID0gSVdMX01BWF9DTURfU0laRTsKLQotCQl0eHEtPmNtZFtpXSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0eHEtPmNtZFtpXSkKLQkJCWdvdG8gZXJyOwotCX0KLQotCS8qIEFsbG9jIGRyaXZlciBkYXRhIGFycmF5IGFuZCBURkQgY2lyY3VsYXIgYnVmZmVyICovCi0JcmV0ID0gaXdsX2xlZ2FjeV90eF9xdWV1ZV9hbGxvYyhwcml2LCB0eHEsIHR4cV9pZCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKLQotCS8qCi0JICogRm9yIHRoZSBkZWZhdWx0IHF1ZXVlcyAwLTMsIHNldCB1cCB0aGUgc3dxX2lkCi0JICogYWxyZWFkeSAtLSBhbGwgb3RoZXJzIG5lZWQgdG8gZ2V0IG9uZSBsYXRlcgotCSAqIChpZiB0aGV5IG5lZWQgb25lIGF0IGFsbCkuCi0JICovCi0JaWYgKHR4cV9pZCA8IDQpCi0JCWl3bF9sZWdhY3lfc2V0X3N3cV9pZCh0eHEsIHR4cV9pZCwgdHhxX2lkKTsKLQotCS8qIFRGRF9RVUVVRV9TSVpFX01BWCBtdXN0IGJlIHBvd2VyLW9mLXR3byBzaXplLCBvdGhlcndpc2UKLQkgKiBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwIGFuZCBpd2xfbGVnYWN5X3F1ZXVlX2RlY193cmFwIGFyZSBicm9rZW4uICovCi0JQlVJTERfQlVHX09OKFRGRF9RVUVVRV9TSVpFX01BWCAmIChURkRfUVVFVUVfU0laRV9NQVggLSAxKSk7Ci0KLQkvKiBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgbWFya3MsIGFuZCBoZWFkL3RhaWwgaW5kZXhlcyAqLwotCWl3bF9sZWdhY3lfcXVldWVfaW5pdChwcml2LCAmdHhxLT5xLAotCQkJCVRGRF9RVUVVRV9TSVpFX01BWCwgc2xvdHNfbnVtLCB0eHFfaWQpOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBxdWV1ZSAqLwotCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9pbml0KHByaXYsIHR4cSk7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsX3Nsb3RzOyBpKyspCi0JCWtmcmVlKHR4cS0+Y21kW2ldKTsKLW91dF9mcmVlX2FycmF5czoKLQlrZnJlZSh0eHEtPm1ldGEpOwotCWtmcmVlKHR4cS0+Y21kKTsKLQotCXJldHVybiAtRU5PTUVNOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4X3F1ZXVlX2luaXQpOwotCi12b2lkIGl3bF9sZWdhY3lfdHhfcXVldWVfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQlpbnQgc2xvdHNfbnVtLCB1MzIgdHhxX2lkKQotewotCWludCBhY3R1YWxfc2xvdHMgPSBzbG90c19udW07Ci0KLQlpZiAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkKLQkJYWN0dWFsX3Nsb3RzKys7Ci0KLQltZW1zZXQodHhxLT5tZXRhLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9jbWRfbWV0YSkgKiBhY3R1YWxfc2xvdHMpOwotCi0JdHhxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0KLQkvKiBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgbWFya3MsIGFuZCBoZWFkL3RhaWwgaW5kZXhlcyAqLwotCWl3bF9sZWdhY3lfcXVldWVfaW5pdChwcml2LCAmdHhxLT5xLAotCQkJCVRGRF9RVUVVRV9TSVpFX01BWCwgc2xvdHNfbnVtLCB0eHFfaWQpOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBxdWV1ZSAqLwotCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9pbml0KHByaXYsIHR4cSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfdHhfcXVldWVfcmVzZXQpOwotCi0vKioqKioqKioqKioqKioqIEhPU1QgQ09NTUFORCBRVUVVRSBGVU5DVElPTlMgICAqKioqKi8KLQotLyoqCi0gKiBpd2xfbGVnYWN5X2VucXVldWVfaGNtZCAtIGVucXVldWUgYSB1Q29kZSBjb21tYW5kCi0gKiBAcHJpdjogZGV2aWNlIHByaXZhdGUgZGF0YSBwb2ludAotICogQGNtZDogYSBwb2ludCB0byB0aGUgdWNvZGUgY29tbWFuZCBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyA8IDAgdmFsdWVzIHRvIGluZGljYXRlIHRoZSBvcGVyYXRpb24gaXMKLSAqIGZhaWxlZC4gT24gc3VjY2VzcywgaXQgdHVybnMgdGhlIGluZGV4ICg+IDApIG9mIGNvbW1hbmQgaW4gdGhlCi0gKiBjb21tYW5kIHF1ZXVlLgotICovCi1pbnQgaXdsX2xlZ2FjeV9lbnF1ZXVlX2hjbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqb3V0X2NtZDsKLQlzdHJ1Y3QgaXdsX2NtZF9tZXRhICpvdXRfbWV0YTsKLQlkbWFfYWRkcl90IHBoeXNfYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBsZW47Ci0JdTMyIGlkeDsKLQl1MTYgZml4X3NpemU7Ci0KLQljbWQtPmxlbiA9IHByaXYtPmNmZy0+b3BzLT51dGlscy0+Z2V0X2hjbWRfc2l6ZShjbWQtPmlkLCBjbWQtPmxlbik7Ci0JZml4X3NpemUgPSAodTE2KShjbWQtPmxlbiArIHNpemVvZihvdXRfY21kLT5oZHIpKTsKLQotCS8qIElmIGFueSBvZiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmVzIGVuZCB1cCBiZWluZyBsYXJnZXIgdGhhbgotCSAqIHRoZSBURkRfTUFYX1BBWUxPQURfU0laRSwgYW5kIGl0IHNlbnQgYXMgYSAnc21hbGwnIGNvbW1hbmQgdGhlbgotCSAqIHdlIHdpbGwgbmVlZCB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgVEZEIGVudHJpZXMKLQkgKiBBbHNvLCBjaGVjayB0byBzZWUgaWYgY29tbWFuZCBidWZmZXIgc2hvdWxkIG5vdCBleGNlZWQgdGhlIHNpemUKLQkgKiBvZiBkZXZpY2VfY21kIGFuZCBtYXhfY21kX3NpemUuICovCi0JQlVHX09OKChmaXhfc2l6ZSA+IFRGRF9NQVhfUEFZTE9BRF9TSVpFKSAmJgotCSAgICAgICAhKGNtZC0+ZmxhZ3MgJiBDTURfU0laRV9IVUdFKSk7Ci0JQlVHX09OKGZpeF9zaXplID4gSVdMX01BWF9DTURfU0laRSk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikgfHwgaXdsX2xlZ2FjeV9pc19jdGtpbGwocHJpdikpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIk5vdCBzZW5kaW5nIGNvbW1hbmQgLSAlcyBLSUxMXG4iLAotCQkJIGl3bF9sZWdhY3lfaXNfcmZraWxsKHByaXYpID8gIlJGIiA6ICJDVCIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShxKSA8ICgoY21kLT5mbGFncyAmIENNRF9BU1lOQykgPyAyIDogMSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci0KLQkJSVdMX0VSUihwcml2LCAiUmVzdGFydGluZyBhZGFwdGVyIGR1ZSB0byBjb21tYW5kIHF1ZXVlIGZ1bGxcbiIpOwotCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotCQlyZXR1cm4gLUVOT1NQQzsKLQl9Ci0KLQlpZHggPSBpd2xfbGVnYWN5X2dldF9jbWRfaW5kZXgocSwgcS0+d3JpdGVfcHRyLCBjbWQtPmZsYWdzICYgQ01EX1NJWkVfSFVHRSk7Ci0Jb3V0X2NtZCA9IHR4cS0+Y21kW2lkeF07Ci0Jb3V0X21ldGEgPSAmdHhxLT5tZXRhW2lkeF07Ci0KLQlpZiAoV0FSTl9PTihvdXRfbWV0YS0+ZmxhZ3MgJiBDTURfTUFQUEVEKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5oY21kX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTk9TUEM7Ci0JfQotCi0JbWVtc2V0KG91dF9tZXRhLCAwLCBzaXplb2YoKm91dF9tZXRhKSk7CS8qIHJlLWluaXRpYWxpemUgdG8gTlVMTCAqLwotCW91dF9tZXRhLT5mbGFncyA9IGNtZC0+ZmxhZ3MgfCBDTURfTUFQUEVEOwotCWlmIChjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKQotCQlvdXRfbWV0YS0+c291cmNlID0gY21kOwotCWlmIChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKQotCQlvdXRfbWV0YS0+Y2FsbGJhY2sgPSBjbWQtPmNhbGxiYWNrOwotCi0Jb3V0X2NtZC0+aGRyLmNtZCA9IGNtZC0+aWQ7Ci0JbWVtY3B5KCZvdXRfY21kLT5jbWQucGF5bG9hZCwgY21kLT5kYXRhLCBjbWQtPmxlbik7Ci0KLQkvKiBBdCB0aGlzIHBvaW50LCB0aGUgb3V0X2NtZCBub3cgaGFzIGFsbCBvZiB0aGUgaW5jb21pbmcgY21kCi0JICogaW5mb3JtYXRpb24gKi8KLQotCW91dF9jbWQtPmhkci5mbGFncyA9IDA7Ci0Jb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0gY3B1X3RvX2xlMTYoUVVFVUVfVE9fU0VRKHByaXYtPmNtZF9xdWV1ZSkgfAotCQkJSU5ERVhfVE9fU0VRKHEtPndyaXRlX3B0cikpOwotCWlmIChjbWQtPmZsYWdzICYgQ01EX1NJWkVfSFVHRSkKLQkJb3V0X2NtZC0+aGRyLnNlcXVlbmNlIHw9IFNFUV9IVUdFX0ZSQU1FOwotCWxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQpOwotCWlmIChpZHggPT0gVEZEX0NNRF9TTE9UUykKLQkJbGVuID0gSVdMX01BWF9DTURfU0laRTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN3aXRjaCAob3V0X2NtZC0+aGRyLmNtZCkgewotCWNhc2UgUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRDoKLQljYXNlIFNFTlNJVElWSVRZX0NNRDoKLQkJSVdMX0RFQlVHX0hDX0RVTVAocHJpdiwKLQkJCQkiU2VuZGluZyBjb21tYW5kICVzICgjJXgpLCBzZXE6IDB4JTA0WCwgIgotCQkJCSIlZCBieXRlcyBhdCAlZFslZF06JWRcbiIsCi0JCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhvdXRfY21kLT5oZHIuY21kKSwKLQkJCQlvdXRfY21kLT5oZHIuY21kLAotCQkJCWxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSksIGZpeF9zaXplLAotCQkJCXEtPndyaXRlX3B0ciwgaWR4LCBwcml2LT5jbWRfcXVldWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfREVCVUdfSEMocHJpdiwgIlNlbmRpbmcgY29tbWFuZCAlcyAoIyV4KSwgc2VxOiAweCUwNFgsICIKLQkJCQkiJWQgYnl0ZXMgYXQgJWRbJWRdOiVkXG4iLAotCQkJCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcob3V0X2NtZC0+aGRyLmNtZCksCi0JCQkJb3V0X2NtZC0+aGRyLmNtZCwKLQkJCQlsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpLCBmaXhfc2l6ZSwKLQkJCQlxLT53cml0ZV9wdHIsIGlkeCwgcHJpdi0+Y21kX3F1ZXVlKTsKLQl9Ci0jZW5kaWYKLQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKLQotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50eHFfdXBkYXRlX2J5dGVfY250X3RibCkKLQkJLyogU2V0IHVwIGVudHJ5IGluIHF1ZXVlJ3MgYnl0ZSBjb3VudCBjaXJjdWxhciBidWZmZXIgKi8KLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX3VwZGF0ZV9ieXRlX2NudF90YmwocHJpdiwgdHhxLCAwKTsKLQotCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsICZvdXRfY21kLT5oZHIsCi0JCQkJICAgZml4X3NpemUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JZG1hX3VubWFwX2FkZHJfc2V0KG91dF9tZXRhLCBtYXBwaW5nLCBwaHlzX2FkZHIpOwotCWRtYV91bm1hcF9sZW5fc2V0KG91dF9tZXRhLCBsZW4sIGZpeF9zaXplKTsKLQotCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl9oY21kKHByaXYsICZvdXRfY21kLT5oZHIsCi0JCQkJCQlmaXhfc2l6ZSwgY21kLT5mbGFncyk7Ci0KLQlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQocHJpdiwgdHhxLAotCQkJCQkJICAgcGh5c19hZGRyLCBmaXhfc2l6ZSwgMSwKLQkJCQkJCSAgIFUzMl9QQUQoY21kLT5sZW4pKTsKLQotCS8qIEluY3JlbWVudCBhbmQgdXBkYXRlIHF1ZXVlJ3Mgd3JpdGUgaW5kZXggKi8KLQlxLT53cml0ZV9wdHIgPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKHEtPndyaXRlX3B0ciwgcS0+bl9iZCk7Ci0JaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCB0eHEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGlkeDsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X2hjbWRfcXVldWVfcmVjbGFpbSAtIFJlY2xhaW0gVFggY29tbWFuZCBxdWV1ZSBlbnRyaWVzIGFscmVhZHkgVHgnZAotICoKLSAqIFdoZW4gRlcgYWR2YW5jZXMgJ1InIGluZGV4LCBhbGwgZW50cmllcyBiZXR3ZWVuIG9sZCBhbmQgbmV3ICdSJyBpbmRleAotICogbmVlZCB0byBiZSByZWNsYWltZWQuIEFzIHJlc3VsdCwgc29tZSBmcmVlIHNwYWNlIGZvcm1zLiAgSWYgdGhlcmUgaXMKLSAqIGVub3VnaCBmcmVlIHNwYWNlICg+IGxvdyBtYXJrKSwgd2FrZSB0aGUgc3RhY2sgdGhhdCBmZWVkcyB1cy4KLSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9oY21kX3F1ZXVlX3JlY2xhaW0oc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkLAotCQkJCSAgIGludCBpZHgsIGludCBjbWRfaWR4KQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKLQlpbnQgbmZyZWVkID0gMDsKLQotCWlmICgoaWR4ID49IHEtPm5fYmQpIHx8IChpd2xfbGVnYWN5X3F1ZXVlX3VzZWQocSwgaWR4KSA9PSAwKSkgewotCQlJV0xfRVJSKHByaXYsICJSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGluZGV4ICVkLCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwgdHhxX2lkLAotCQkJICBpZHgsIHEtPm5fYmQsIHEtPndyaXRlX3B0ciwgcS0+cmVhZF9wdHIpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChpZHggPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKGlkeCwgcS0+bl9iZCk7IHEtPnJlYWRfcHRyICE9IGlkeDsKLQkgICAgIHEtPnJlYWRfcHRyID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKLQotCQlpZiAobmZyZWVkKysgPiAwKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJIQ01EIHNraXBwZWQ6IGluZGV4ICglZCkgJWQgJWRcbiIsIGlkeCwKLQkJCQkJcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7Ci0JCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotCQl9Ci0KLQl9Ci19Ci0KLS8qKgotICogaXdsX2xlZ2FjeV90eF9jbWRfY29tcGxldGUgLSBQdWxsIHVudXNlZCBidWZmZXJzIG9mZiB0aGUgcXVldWUgYW5kIHJlY2xhaW0gdGhlbQotICogQHJ4YjogUnggYnVmZmVyIHRvIHJlY2xhaW0KLSAqCi0gKiBJZiBhbiBSeCBidWZmZXIgaGFzIGFuIGFzeW5jIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCBpdCB0aGUgY2FsbGJhY2sKLSAqIHdpbGwgYmUgZXhlY3V0ZWQuICBUaGUgYXR0YWNoZWQgc2tiIChpZiBwcmVzZW50KSB3aWxsIG9ubHkgYmUgZnJlZWQKLSAqIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIDEKLSAqLwotdm9pZAotaXdsX2xlZ2FjeV90eF9jbWRfY29tcGxldGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQl1MTYgc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7Ci0JaW50IHR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXF1ZW5jZSk7Ci0JaW50IGluZGV4ID0gU0VRX1RPX0lOREVYKHNlcXVlbmNlKTsKLQlpbnQgY21kX2luZGV4OwotCWJvb2wgaHVnZSA9ICEhKHBrdC0+aGRyLnNlcXVlbmNlICYgU0VRX0hVR0VfRlJBTUUpOwotCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kOwotCXN0cnVjdCBpd2xfY21kX21ldGEgKm1ldGE7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBJZiBhIFR4IGNvbW1hbmQgaXMgYmVpbmcgaGFuZGxlZCBhbmQgaXQgaXNuJ3QgaW4gdGhlIGFjdHVhbAotCSAqIGNvbW1hbmQgcXVldWUgdGhlbiB0aGVyZSBhIGNvbW1hbmQgcm91dGluZyBidWcgaGFzIGJlZW4gaW50cm9kdWNlZAotCSAqIGluIHRoZSBxdWV1ZSBtYW5hZ2VtZW50IGNvZGUuICovCi0JaWYgKFdBUk4odHhxX2lkICE9IHByaXYtPmNtZF9xdWV1ZSwKLQkJICJ3cm9uZyBjb21tYW5kIHF1ZXVlICVkIChzaG91bGQgYmUgJWQpLCBzZXF1ZW5jZSAweCVYIHJlYWRwPSVkIHdyaXRlcD0lZFxuIiwKLQkJICB0eHFfaWQsIHByaXYtPmNtZF9xdWV1ZSwgc2VxdWVuY2UsCi0JCSAgcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV0ucS5yZWFkX3B0ciwKLQkJICBwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXS5xLndyaXRlX3B0cikpIHsKLQkJaXdsX3ByaW50X2hleF9lcnJvcihwcml2LCBwa3QsIDMyKTsKLQkJcmV0dXJuOwotCX0KLQotCWNtZF9pbmRleCA9IGl3bF9sZWdhY3lfZ2V0X2NtZF9pbmRleCgmdHhxLT5xLCBpbmRleCwgaHVnZSk7Ci0JY21kID0gdHhxLT5jbWRbY21kX2luZGV4XTsKLQltZXRhID0gJnR4cS0+bWV0YVtjbWRfaW5kZXhdOwotCi0JdHhxLT50aW1lX3N0YW1wID0gamlmZmllczsKLQotCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKLQkJCSBkbWFfdW5tYXBfYWRkcihtZXRhLCBtYXBwaW5nKSwKLQkJCSBkbWFfdW5tYXBfbGVuKG1ldGEsIGxlbiksCi0JCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQotCS8qIElucHV0IGVycm9yIGNoZWNraW5nIGlzIGRvbmUgd2hlbiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gcXVldWUuICovCi0JaWYgKG1ldGEtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSB7Ci0JCW1ldGEtPnNvdXJjZS0+cmVwbHlfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXJ4Yl9hZGRyKHJ4Yik7Ci0JCXJ4Yi0+cGFnZSA9IE5VTEw7Ci0JfSBlbHNlIGlmIChtZXRhLT5jYWxsYmFjaykKLQkJbWV0YS0+Y2FsbGJhY2socHJpdiwgY21kLCBwa3QpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOwotCi0JaXdsX2xlZ2FjeV9oY21kX3F1ZXVlX3JlY2xhaW0ocHJpdiwgdHhxX2lkLCBpbmRleCwgY21kX2luZGV4KTsKLQotCWlmICghKG1ldGEtPmZsYWdzICYgQ01EX0FTWU5DKSkgewotCQljbGVhcl9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKTsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNsZWFyaW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAotCQkJICAgICAgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSk7Ci0JCXdha2VfdXAoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0JfQotCi0JLyogTWFyayBhcyB1bm1hcHBlZCAqLwotCW1ldGEtPmZsYWdzID0gMDsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4X2NtZF9jb21wbGV0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wzOTQ1LWJhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDM5NDUtYmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjgyZDg2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDM5NDUtYmFzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0KLSNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQotI2RlZmluZSBEUlZfTkFNRQkiaXdsMzk0NSIKLQotI2luY2x1ZGUgIml3bC1maC5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LWZoLmgiCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtc3BlY3RydW0uaCIKLQotLyoKLSAqIG1vZHVsZSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4KLSAqLwotCi0jZGVmaW5lIERSVl9ERVNDUklQVElPTglcCi0iSW50ZWwoUikgUFJPL1dpcmVsZXNzIDM5NDVBQkcvQkcgTmV0d29yayBDb25uZWN0aW9uIGRyaXZlciBmb3IgTGludXgiCi0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLSNkZWZpbmUgVkQgImQiCi0jZWxzZQotI2RlZmluZSBWRAotI2VuZGlmCi0KLS8qCi0gKiBhZGQgInMiIHRvIGluZGljYXRlIHNwZWN0cnVtIG1lYXN1cmVtZW50IGluY2x1ZGVkLgotICogd2UgYWRkIGl0IGhlcmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHByZXZpb3VzIHJlbGVhc2VzIGluIHdoaWNoCi0gKiB0aGlzIHdhcyBjb25maWd1cmFibGUuCi0gKi8KLSNkZWZpbmUgRFJWX1ZFUlNJT04gIElXTFdJRklfVkVSU0lPTiBWRCAicyIKLSNkZWZpbmUgRFJWX0NPUFlSSUdIVAkiQ29weXJpZ2h0KGMpIDIwMDMtMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbiIKLSNkZWZpbmUgRFJWX0FVVEhPUiAgICAgIjxpbHdAbGludXguaW50ZWwuY29tPiIKLQotTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7Ci1NT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7Ci1NT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQgIiAiIERSVl9BVVRIT1IpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0gLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KLXN0cnVjdCBpd2xfbW9kX3BhcmFtcyBpd2wzOTQ1X21vZF9wYXJhbXMgPSB7Ci0JLnN3X2NyeXB0byA9IDEsCi0JLnJlc3RhcnRfZncgPSAxLAotCS5kaXNhYmxlX2h3X3NjYW4gPSAxLAotCS8qIHRoZSByZXN0IGFyZSAwIGJ5IGRlZmF1bHQgKi8KLX07Ci0KLS8qKgotICogaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyAtIEdldCBhbnRlbm5hIGZsYWdzIGZvciBSWE9OIGNvbW1hbmQKLSAqIEBwcml2OiBlZXByb20gYW5kIGFudGVubmEgZmllbGRzIGFyZSB1c2VkIHRvIGRldGVybWluZSBhbnRlbm5hIGZsYWdzCi0gKgotICogcHJpdi0+ZWVwcm9tMzkgIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFudGVubmEgQVVYL01BSU4gYXJlIHJldmVyc2VkCi0gKiBpd2wzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSBzcGVjaWZpZXMgdGhlIGFudGVubmEgZGl2ZXJzaXR5IG1vZGU6Ci0gKgotICogSVdMX0FOVEVOTkFfRElWRVJTSVRZIC0gTklDIHNlbGVjdHMgYmVzdCBhbnRlbm5hIGJ5IGl0c2VsZgotICogSVdMX0FOVEVOTkFfTUFJTiAgICAgIC0gRm9yY2UgTUFJTiBhbnRlbm5hCi0gKiBJV0xfQU5URU5OQV9BVVggICAgICAgLSBGb3JjZSBBVVggYW50ZW5uYQotICovCi1fX2xlMzIgaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCi0Jc3dpdGNoIChpd2wzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSkgewotCWNhc2UgSVdMX0FOVEVOTkFfRElWRVJTSVRZOgotCQlyZXR1cm4gMDsKLQotCWNhc2UgSVdMX0FOVEVOTkFfTUFJTjoKLQkJaWYgKGVlcHJvbS0+YW50ZW5uYV9zd2l0Y2hfdHlwZSkKLQkJCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9CX01TSzsKLQkJcmV0dXJuIFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX0FfTVNLOwotCi0JY2FzZSBJV0xfQU5URU5OQV9BVVg6Ci0JCWlmIChlZXByb20tPmFudGVubmFfc3dpdGNoX3R5cGUpCi0JCQlyZXR1cm4gUlhPTl9GTEdfRElTX0RJVl9NU0sgfCBSWE9OX0ZMR19BTlRfQV9NU0s7Ci0JCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9CX01TSzsKLQl9Ci0KLQkvKiBiYWQgYW50ZW5uYSBzZWxlY3RvciB2YWx1ZSAqLwotCUlXTF9FUlIocHJpdiwgIkJhZCBhbnRlbm5hIHNlbGVjdG9yIHZhbHVlICgweCV4KVxuIiwKLQkJaXdsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEpOwotCi0JcmV0dXJuIDA7CQkvKiAiZGl2ZXJzaXR5IiBpcyBkZWZhdWx0IGlmIGVycm9yICovCi19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCSAgIHU4IHN0YV9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCV9fbGUxNiBrZXlfZmxhZ3MgPSAwOwotCWludCByZXQ7Ci0KLQlrZXlfZmxhZ3MgfD0gKFNUQV9LRVlfRkxHX0NDTVAgfCBTVEFfS0VZX0ZMR19NQVBfS0VZX01TSyk7Ci0Ja2V5X2ZsYWdzIHw9IGNwdV90b19sZTE2KGtleWNvbmYtPmtleWlkeCA8PCBTVEFfS0VZX0ZMR19LRVlJRF9QT1MpOwotCi0JaWYgKHN0YV9pZCA9PSBwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5iY2FzdF9zdGFfaWQpCi0JCWtleV9mbGFncyB8PSBTVEFfS0VZX01VTFRJQ0FTVF9NU0s7Ci0KLQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7Ci0Ja2V5Y29uZi0+aHdfa2V5X2lkeCA9IGtleWNvbmYtPmtleWlkeDsKLQlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlsZW4gPSBrZXljb25mLT5rZXlsZW47Ci0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwKLQkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKLQotCW1lbWNweShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksCi0JICAgICAgIGtleWNvbmYtPmtleWxlbik7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChwcml2KTsKLQkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQotCSogaW4gdUNvZGUuICovCi0KLQlXQVJOKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKLQkJIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJod2NyeXB0bzogbW9kaWZ5IHVjb2RlIHN0YXRpb24ga2V5IGluZm9cbiIpOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwKLQkJCQkmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCQkgIHU4IHN0YV9pZCkKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCQkgIHU4IHN0YV9pZCkKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9jbGVhcl9zdGFfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBzdGFfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YV9jbWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfaHdfa2V5KSk7Ci0JbWVtc2V0KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXksIDAsCi0JCXNpemVvZihzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvKSk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IFNUQV9LRVlfRkxHX05PX0VOQzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOwotCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiaHdjcnlwdG86IGNsZWFyIHVjb2RlIHN0YXRpb24ga2V5IGluZm9cbiIpOwotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfc2V0X2R5bmFtaWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsIHU4IHN0YV9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWtleWNvbmYtPmh3X2tleV9pZHggPSBIV19LRVlfRFlOQU1JQzsKLQotCXN3aXRjaCAoa2V5Y29uZi0+Y2lwaGVyKSB7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQlyZXQgPSBpd2wzOTQ1X3NldF9jY21wX2R5bmFtaWNfa2V5X2luZm8ocHJpdiwga2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQlyZXQgPSBpd2wzOTQ1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8ocHJpdiwga2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJcmV0ID0gaXdsMzk0NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8ocHJpdiwga2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJSVdMX0VSUihwcml2LCAiVW5rbm93biBhbGc6ICVzIGFsZz0leFxuIiwgX19mdW5jX18sCi0JCQlrZXljb25mLT5jaXBoZXIpOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCUlXTF9ERUJVR19XRVAocHJpdiwgIlNldCBkeW5hbWljIGtleTogYWxnPSV4IGxlbj0lZCBpZHg9JWQgc3RhPSVkIHJldD0lZFxuIiwKLQkJICAgICAga2V5Y29uZi0+Y2lwaGVyLCBrZXljb25mLT5rZXlsZW4sIGtleWNvbmYtPmtleWlkeCwKLQkJICAgICAgc3RhX2lkLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X3JlbW92ZV9zdGF0aWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfc2V0X3N0YXRpY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKLXsKLQlpZiAoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlJV0xfRVJSKHByaXYsICJTdGF0aWMga2V5IGludmFsaWQ6IGNpcGhlciAleFxuIiwga2V5LT5jaXBoZXIpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2NsZWFyX2ZyZWVfZnJhbWVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIiVkIGZyYW1lcyBvbiBwcmUtYWxsb2NhdGVkIGhlYXAgb24gY2xlYXIuXG4iLAotCQkgICAgICAgcHJpdi0+ZnJhbWVzX2NvdW50KTsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmcHJpdi0+ZnJlZV9mcmFtZXMpKSB7Ci0JCWVsZW1lbnQgPSBwcml2LT5mcmVlX2ZyYW1lcy5uZXh0OwotCQlsaXN0X2RlbChlbGVtZW50KTsKLQkJa2ZyZWUobGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXdsMzk0NV9mcmFtZSwgbGlzdCkpOwotCQlwcml2LT5mcmFtZXNfY291bnQtLTsKLQl9Ci0KLQlpZiAocHJpdi0+ZnJhbWVzX2NvdW50KSB7Ci0JCUlXTF9XQVJOKHByaXYsICIlZCBmcmFtZXMgc3RpbGwgaW4gdXNlLiAgRGlkIHdlIGxvc2Ugb25lP1xuIiwKLQkJCSAgICBwcml2LT5mcmFtZXNfY291bnQpOwotCQlwcml2LT5mcmFtZXNfY291bnQgPSAwOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBpd2wzOTQ1X2ZyYW1lICppd2wzOTQ1X2dldF9mcmVlX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9mcmFtZSAqZnJhbWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKLQlpZiAobGlzdF9lbXB0eSgmcHJpdi0+ZnJlZV9mcmFtZXMpKSB7Ci0JCWZyYW1lID0ga3phbGxvYyhzaXplb2YoKmZyYW1lKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZnJhbWUpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZSFcbiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQlwcml2LT5mcmFtZXNfY291bnQrKzsKLQkJcmV0dXJuIGZyYW1lOwotCX0KLQotCWVsZW1lbnQgPSBwcml2LT5mcmVlX2ZyYW1lcy5uZXh0OwotCWxpc3RfZGVsKGVsZW1lbnQpOwotCXJldHVybiBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2wzOTQ1X2ZyYW1lLCBsaXN0KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9mcmVlX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bDM5NDVfZnJhbWUgKmZyYW1lKQotewotCW1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKCpmcmFtZSkpOwotCWxpc3RfYWRkKCZmcmFtZS0+bGlzdCwgJnByaXYtPmZyZWVfZnJhbWVzKTsKLX0KLQotdW5zaWduZWQgaW50IGl3bDM5NDVfZmlsbF9iZWFjb25fZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJaW50IGxlZnQpCi17Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSB8fCAhcHJpdi0+YmVhY29uX3NrYikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocHJpdi0+YmVhY29uX3NrYi0+bGVuID4gbGVmdCkKLQkJcmV0dXJuIDA7Ci0KLQltZW1jcHkoaGRyLCBwcml2LT5iZWFjb25fc2tiLT5kYXRhLCBwcml2LT5iZWFjb25fc2tiLT5sZW4pOwotCi0JcmV0dXJuIHByaXYtPmJlYWNvbl9za2ItPmxlbjsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X3NlbmRfYmVhY29uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bDM5NDVfZnJhbWUgKmZyYW1lOwotCXVuc2lnbmVkIGludCBmcmFtZV9zaXplOwotCWludCByYzsKLQl1OCByYXRlOwotCi0JZnJhbWUgPSBpd2wzOTQ1X2dldF9mcmVlX2ZyYW1lKHByaXYpOwotCi0JaWYgKCFmcmFtZSkgewotCQlJV0xfRVJSKHByaXYsICJDb3VsZCBub3Qgb2J0YWluIGZyZWUgZnJhbWUgYnVmZmVyIGZvciBiZWFjb24gIgotCQkJICAiY29tbWFuZC5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyYXRlID0gaXdsX2xlZ2FjeV9nZXRfbG93ZXN0X3BsY3AocHJpdiwKLQkJCQkmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10pOwotCi0JZnJhbWVfc2l6ZSA9IGl3bDM5NDVfaHdfZ2V0X2JlYWNvbl9jbWQocHJpdiwgZnJhbWUsIHJhdGUpOwotCi0JcmMgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9UWF9CRUFDT04sIGZyYW1lX3NpemUsCi0JCQkgICAgICAmZnJhbWUtPnUuY21kWzBdKTsKLQotCWl3bDM5NDVfZnJlZV9mcmFtZShwcml2LCBmcmFtZSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfdW5zZXRfaHdfcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpZiAocHJpdi0+XzM5NDUuc2hhcmVkX3ZpcnQpCi0JCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsCi0JCQkJICBzaXplb2Yoc3RydWN0IGl3bDM5NDVfc2hhcmVkKSwKLQkJCQkgIHByaXYtPl8zOTQ1LnNoYXJlZF92aXJ0LAotCQkJCSAgcHJpdi0+XzM5NDUuc2hhcmVkX3BoeXMpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2J1aWxkX3R4X2NtZF9od2NyeXB0byhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2JfZnJhZywKLQkJCQkgICAgICBpbnQgc3RhX2lkKQotewotCXN0cnVjdCBpd2wzOTQ1X3R4X2NtZCAqdHhfY21kID0gKHN0cnVjdCBpd2wzOTQ1X3R4X2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7Ci0Jc3RydWN0IGl3bF9od19rZXkgKmtleWluZm8gPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvOwotCi0JdHhfY21kLT5zZWNfY3RsID0gMDsKLQotCXN3aXRjaCAoa2V5aW5mby0+Y2lwaGVyKSB7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQl0eF9jbWQtPnNlY19jdGwgPSBUWF9DTURfU0VDX0NDTTsKLQkJbWVtY3B5KHR4X2NtZC0+a2V5LCBrZXlpbmZvLT5rZXksIGtleWluZm8tPmtleWxlbik7Ci0JCUlXTF9ERUJVR19UWChwcml2LCAidHhfY21kIHdpdGggQUVTIGh3Y3J5cHRvXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCWJyZWFrOwotCi0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCXR4X2NtZC0+c2VjX2N0bCB8PSBUWF9DTURfU0VDX0tFWTEyODsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJdHhfY21kLT5zZWNfY3RsIHw9IFRYX0NNRF9TRUNfV0VQIHwKLQkJICAgIChpbmZvLT5jb250cm9sLmh3X2tleS0+aHdfa2V5X2lkeCAmIFRYX0NNRF9TRUNfTVNLKSA8PCBUWF9DTURfU0VDX1NISUZUOwotCi0JCW1lbWNweSgmdHhfY21kLT5rZXlbM10sIGtleWluZm8tPmtleSwga2V5aW5mby0+a2V5bGVuKTsKLQotCQlJV0xfREVCVUdfVFgocHJpdiwgIkNvbmZpZ3VyaW5nIHBhY2tldCBmb3IgV0VQIGVuY3J5cHRpb24gIgotCQkJICAgICAid2l0aCBrZXkgJWRcbiIsIGluZm8tPmNvbnRyb2wuaHdfa2V5LT5od19rZXlfaWR4KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJVbmtub3duIGVuY29kZSBjaXBoZXIgJXhcbiIsIGtleWluZm8tPmNpcGhlcik7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIGhhbmRsZSBidWlsZCBSRVBMWV9UWCBjb21tYW5kIG5vdGlmaWNhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9idWlsZF90eF9jbWRfYmFzaWMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCB1OCBzdGRfaWQpCi17Ci0Jc3RydWN0IGl3bDM5NDVfdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IGl3bDM5NDVfdHhfY21kICopY21kLT5jbWQucGF5bG9hZDsKLQlfX2xlMzIgdHhfZmxhZ3MgPSB0eF9jbWQtPnR4X2ZsYWdzOwotCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKLQotCXR4X2NtZC0+c3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7Ci0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpIHsKLQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLOwotCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQotCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSAmJgotCQkgICAgIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIDB4ZikpCi0JCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1RTRl9NU0s7Ci0JfSBlbHNlIHsKLQkJdHhfZmxhZ3MgJj0gKH5UWF9DTURfRkxHX0FDS19NU0spOwotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCXR4X2NtZC0+c3RhX2lkID0gc3RkX2lkOwotCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCi0JCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTU9SRV9GUkFHX01TSzsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7Ci0JCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwotCQl0eF9jbWQtPnRpZF90c3BlYyA9IHFjWzBdICYgMHhmOwotCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQl9IGVsc2UgewotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCWl3bF9sZWdhY3lfdHhfY21kX3Byb3RlY3Rpb24ocHJpdiwgaW5mbywgZmMsICZ0eF9mbGFncyk7Ci0KLQl0eF9mbGFncyAmPSB+KFRYX0NNRF9GTEdfQU5UX1NFTF9NU0spOwotCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpIHsKLQkJaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpIHx8IGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDMpOwotCQllbHNlCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDIpOwotCX0gZWxzZSB7Ci0JCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gMDsKLQl9Ci0KLQl0eF9jbWQtPmRyaXZlcl90eG9wID0gMDsKLQl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7Ci0JdHhfY21kLT5uZXh0X2ZyYW1lX2xlbiA9IDA7Ci19Ci0KLS8qCi0gKiBzdGFydCBSRVBMWV9UWCBjb21tYW5kIHByb2Nlc3MKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3R4X3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0Jc3RydWN0IGl3bDM5NDVfdHhfY21kICp0eF9jbWQ7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gTlVMTDsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gTlVMTDsKLQlzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKm91dF9jbWQ7Ci0Jc3RydWN0IGl3bF9jbWRfbWV0YSAqb3V0X21ldGE7Ci0JZG1hX2FkZHJfdCBwaHlzX2FkZHI7Ci0JZG1hX2FkZHJfdCB0eGNtZF9waHlzOwotCWludCB0eHFfaWQgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKLQl1MTYgbGVuLCBpZHgsIGhkcl9sZW47Ci0JdTggaWQ7Ci0JdTggdW5pY2FzdDsKLQl1OCBzdGFfaWQ7Ci0JdTggdGlkID0gMDsKLQlfX2xlMTYgZmM7Ci0JdTggd2FpdF93cml0ZV9wdHIgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWlmIChpd2xfbGVnYWN5X2lzX3Jma2lsbChwcml2KSkgewotCQlJV0xfREVCVUdfRFJPUChwcml2LCAiRHJvcHBpbmcgLSBSRiBLSUxMXG4iKTsKLQkJZ290byBkcm9wX3VubG9jazsKLQl9Ci0KLQlpZiAoKGllZWU4MDIxMV9nZXRfdHhfcmF0ZShwcml2LT5odywgaW5mbyktPmh3X3ZhbHVlICYgMHhGRikgPT0gSVdMX0lOVkFMSURfUkFURSkgewotCQlJV0xfRVJSKHByaXYsICJFUlJPUjogTm8gVFggcmF0ZSBhdmFpbGFibGUuXG4iKTsKLQkJZ290byBkcm9wX3VubG9jazsKLQl9Ci0KLQl1bmljYXN0ID0gIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpOwotCWlkID0gMDsKLQotCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGllZWU4MDIxMV9pc19hdXRoKGZjKSkKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJTZW5kaW5nIEFVVEggZnJhbWVcbiIpOwotCWVsc2UgaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpKQotCQlJV0xfREVCVUdfVFgocHJpdiwgIlNlbmRpbmcgQVNTT0MgZnJhbWVcbiIpOwotCWVsc2UgaWYgKGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCi0JCUlXTF9ERUJVR19UWChwcml2LCAiU2VuZGluZyBSRUFTU09DIGZyYW1lXG4iKTsKLSNlbmRpZgotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOwotCi0JLyogRmluZCBpbmRleCBpbnRvIHN0YXRpb24gdGFibGUgZm9yIGRlc3RpbmF0aW9uIHN0YXRpb24gKi8KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZF9vcl9icm9hZGNhc3QoCi0JCQlwcml2LCAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10sCi0JCQlpbmZvLT5jb250cm9sLnN0YSk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9ERUJVR19EUk9QKHByaXYsICJEcm9wcGluZyAtIElOVkFMSUQgU1RBVElPTjogJXBNXG4iLAotCQkJICAgICAgIGhkci0+YWRkcjEpOwotCQlnb3RvIGRyb3A7Ci0JfQotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgInN0YXRpb24gSWQgJWRcbiIsIHN0YV9pZCk7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewotCQl1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKLQkJaWYgKHVubGlrZWx5KHRpZCA+PSBNQVhfVElEX0NPVU5UKSkKLQkJCWdvdG8gZHJvcDsKLQl9Ci0KLQkvKiBEZXNjcmlwdG9yIGZvciBjaG9zZW4gVHggcXVldWUgKi8KLQl0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0JcSA9ICZ0eHEtPnE7Ci0KLQlpZiAoKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspKQotCQlnb3RvIGRyb3A7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaWR4ID0gaXdsX2xlZ2FjeV9nZXRfY21kX2luZGV4KHEsIHEtPndyaXRlX3B0ciwgMCk7Ci0KLQkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCi0JbWVtc2V0KCYodHhxLT50eGJbcS0+d3JpdGVfcHRyXSksIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R4X2luZm8pKTsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLnNrYiA9IHNrYjsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCS8qIEluaXQgZmlyc3QgZW1wdHkgZW50cnkgaW4gcXVldWUncyBhcnJheSBvZiBUeC9jbWQgYnVmZmVycyAqLwotCW91dF9jbWQgPSB0eHEtPmNtZFtpZHhdOwotCW91dF9tZXRhID0gJnR4cS0+bWV0YVtpZHhdOwotCXR4X2NtZCA9IChzdHJ1Y3QgaXdsMzk0NV90eF9jbWQgKilvdXRfY21kLT5jbWQucGF5bG9hZDsKLQltZW1zZXQoJm91dF9jbWQtPmhkciwgMCwgc2l6ZW9mKG91dF9jbWQtPmhkcikpOwotCW1lbXNldCh0eF9jbWQsIDAsIHNpemVvZigqdHhfY21kKSk7Ci0KLQkvKgotCSAqIFNldCB1cCB0aGUgVHgtY29tbWFuZCAobm90IE1BQyEpIGhlYWRlci4KLQkgKiBTdG9yZSB0aGUgY2hvc2VuIFR4IHF1ZXVlIGFuZCBURkQgaW5kZXggd2l0aGluIHRoZSBzZXF1ZW5jZSBmaWVsZDsKLQkgKiBhZnRlciBUeCwgdUNvZGUncyBUeCByZXNwb25zZSB3aWxsIHJldHVybiB0aGlzIHZhbHVlIHNvIGRyaXZlciBjYW4KLQkgKiBsb2NhdGUgdGhlIGZyYW1lIHdpdGhpbiB0aGUgdHggcXVldWUgYW5kIGRvIHBvc3QtdHggcHJvY2Vzc2luZy4KLQkgKi8KLQlvdXRfY21kLT5oZHIuY21kID0gUkVQTFlfVFg7Ci0Jb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0gY3B1X3RvX2xlMTYoKHUxNikoUVVFVUVfVE9fU0VRKHR4cV9pZCkgfAotCQkJCUlOREVYX1RPX1NFUShxLT53cml0ZV9wdHIpKSk7Ci0KLQkvKiBDb3B5IE1BQyBoZWFkZXIgZnJvbSBza2IgaW50byBjb21tYW5kIGJ1ZmZlciAqLwotCW1lbWNweSh0eF9jbWQtPmhkciwgaGRyLCBoZHJfbGVuKTsKLQotCi0JaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5KQotCQlpd2wzOTQ1X2J1aWxkX3R4X2NtZF9od2NyeXB0byhwcml2LCBpbmZvLCBvdXRfY21kLCBza2IsIHN0YV9pZCk7Ci0KLQkvKiBUT0RPIG5lZWQgdGhpcyBmb3IgYnVyc3QgbW9kZSBsYXRlciBvbiAqLwotCWl3bDM5NDVfYnVpbGRfdHhfY21kX2Jhc2ljKHByaXYsIG91dF9jbWQsIGluZm8sIGhkciwgc3RhX2lkKTsKLQotCS8qIHNldCBpc19oY2NhIHRvIDA7IGl0IHByb2JhYmx5IHdpbGwgbmV2ZXIgYmUgaW1wbGVtZW50ZWQgKi8KLQlpd2wzOTQ1X2h3X2J1aWxkX3R4X2NtZF9yYXRlKHByaXYsIG91dF9jbWQsIGluZm8sIGhkciwgc3RhX2lkLCAwKTsKLQotCS8qIFRvdGFsICMgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KLQlsZW4gPSAodTE2KXNrYi0+bGVuOwotCXR4X2NtZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKLQotCWl3bF9sZWdhY3lfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKHByaXYsIGxlbiwgaGRyKTsKLQlpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhwcml2LCB0cnVlLCBmYywgbGVuKTsKLQl0eF9jbWQtPnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX0FOVF9BX01TSzsKLQl0eF9jbWQtPnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX0FOVF9CX01TSzsKLQotCWlmICghaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKLQl9IGVsc2UgewotCQl3YWl0X3dyaXRlX3B0ciA9IDE7Ci0JCXR4cS0+bmVlZF91cGRhdGUgPSAwOwotCX0KLQotCUlXTF9ERUJVR19UWChwcml2LCAic2VxdWVuY2UgbnIgPSAwWCV4XG4iLAotCQkgICAgIGxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSkpOwotCUlXTF9ERUJVR19UWChwcml2LCAidHhfZmxhZ3MgPSAwWCV4XG4iLCBsZTMyX3RvX2NwdSh0eF9jbWQtPnR4X2ZsYWdzKSk7Ci0JaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9UWCwgdHhfY21kLCBzaXplb2YoKnR4X2NtZCkpOwotCWl3bF9wcmludF9oZXhfZHVtcChwcml2LCBJV0xfRExfVFgsICh1OCAqKXR4X2NtZC0+aGRyLAotCQkJICAgaWVlZTgwMjExX2hkcmxlbihmYykpOwotCi0JLyoKLQkgKiBVc2UgdGhlIGZpcnN0IGVtcHR5IGVudHJ5IGluIHRoaXMgcXVldWUncyBjb21tYW5kIGJ1ZmZlciBhcnJheQotCSAqIHRvIGNvbnRhaW4gdGhlIFR4IGNvbW1hbmQgYW5kIE1BQyBoZWFkZXIgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyCi0JICogKHBheWxvYWQgZGF0YSB3aWxsIGJlIGluIGFub3RoZXIgYnVmZmVyKS4KLQkgKiBTaXplIG9mIHRoaXMgdmFyaWVzLCBkdWUgdG8gdmFyeWluZyBNQUMgaGVhZGVyIGxlbmd0aC4KLQkgKiBJZiBlbmQgaXMgbm90IGR3b3JkIGFsaWduZWQsIHdlJ2xsIGhhdmUgMiBleHRyYSBieXRlcyBhdCB0aGUgZW5kCi0JICogb2YgdGhlIE1BQyBoZWFkZXIgKGRldmljZSByZWFkcyBvbiBkd29yZCBib3VuZGFyaWVzKS4KLQkgKiBXZSdsbCB0ZWxsIGRldmljZSBhYm91dCB0aGlzIHBhZGRpbmcgbGF0ZXIuCi0JICovCi0JbGVuID0gc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3R4X2NtZCkgKwotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfY21kX2hlYWRlcikgKyBoZHJfbGVuOwotCWxlbiA9IChsZW4gKyAzKSAmIH4zOwotCi0JLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIFR4IGNvbW1hbmQncyBoZWFkZXIgKG5vdCBNQUMgaGVhZGVyISksCi0JICogd2l0aGluIGNvbW1hbmQgYnVmZmVyIGFycmF5LiAqLwotCXR4Y21kX3BoeXMgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LCAmb3V0X2NtZC0+aGRyLAotCQkJCSAgICBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCS8qIHdlIGRvIG5vdCBtYXAgbWV0YSBkYXRhIC4uLiBzbyB3ZSBjYW4gc2FmZWx5IGFjY2VzcyBhZGRyZXNzIHRvCi0JICogcHJvdmlkZSB0byB1bm1hcCBjb21tYW5kKi8KLQlkbWFfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHR4Y21kX3BoeXMpOwotCWRtYV91bm1hcF9sZW5fc2V0KG91dF9tZXRhLCBsZW4sIGxlbik7Ci0KLQkvKiBBZGQgYnVmZmVyIGNvbnRhaW5pbmcgVHggY29tbWFuZCBhbmQgTUFDKCEpIGhlYWRlciB0byBURkQncwotCSAqIGZpcnN0IGVudHJ5ICovCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2F0dGFjaF9idWZfdG9fdGZkKHByaXYsIHR4cSwKLQkJCQkJCSAgIHR4Y21kX3BoeXMsIGxlbiwgMSwgMCk7Ci0KLQotCS8qIFNldCB1cCBURkQncyAybmQgZW50cnkgdG8gcG9pbnQgZGlyZWN0bHkgdG8gcmVtYWluZGVyIG9mIHNrYiwKLQkgKiBpZiBhbnkgKDgwMi4xMSBudWxsIGZyYW1lcyBoYXZlIG5vIHBheWxvYWQpLiAqLwotCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKLQlpZiAobGVuKSB7Ci0JCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIGhkcl9sZW4sCi0JCQkJCSAgIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChwcml2LCB0eHEsCi0JCQkJCQkJICAgcGh5c19hZGRyLCBsZW4sCi0JCQkJCQkJICAgMCwgVTMyX1BBRChsZW4pKTsKLQl9Ci0KLQotCS8qIFRlbGwgZGV2aWNlIHRoZSB3cml0ZSBpbmRleCAqanVzdCBwYXN0KiB0aGlzIGxhdGVzdCBmaWxsZWQgVEZEICovCi0JcS0+d3JpdGVfcHRyID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOwotCWl3bF9sZWdhY3lfdHhxX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgdHhxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspCi0JICAgICYmIHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKLQkJaWYgKHdhaXRfd3JpdGVfcHRyKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHR4cSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlpd2xfbGVnYWN5X3N0b3BfcXVldWUocHJpdiwgdHhxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZHJvcF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotZHJvcDoKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9nZXRfbWVhc3VyZW1lbnQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgICAgdTggdHlwZSkKLXsKLQlzdHJ1Y3QgaXdsX3NwZWN0cnVtX2NtZCBzcGVjdHJ1bTsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9TUEVDVFJVTV9NRUFTVVJFTUVOVF9DTUQsCi0JCS5kYXRhID0gKHZvaWQgKikmc3BlY3RydW0sCi0JCS5mbGFncyA9IENNRF9XQU5UX1NLQiwKLQl9OwotCXUzMiBhZGRfdGltZSA9IGxlNjRfdG9fY3B1KHBhcmFtcy0+c3RhcnRfdGltZSk7Ci0JaW50IHJjOwotCWludCBzcGVjdHJ1bV9yZXNwX3N0YXR1czsKLQlpbnQgZHVyYXRpb24gPSBsZTE2X3RvX2NwdShwYXJhbXMtPmR1cmF0aW9uKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkKLQkJYWRkX3RpbWUgPSBpd2xfbGVnYWN5X3VzZWNzX3RvX2JlYWNvbnMocHJpdiwKLQkJCWxlNjRfdG9fY3B1KHBhcmFtcy0+c3RhcnRfdGltZSkgLSBwcml2LT5fMzk0NS5sYXN0X3RzZiwKLQkJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCkpOwotCi0JbWVtc2V0KCZzcGVjdHJ1bSwgMCwgc2l6ZW9mKHNwZWN0cnVtKSk7Ci0KLQlzcGVjdHJ1bS5jaGFubmVsX2NvdW50ID0gY3B1X3RvX2xlMTYoMSk7Ci0Jc3BlY3RydW0uZmxhZ3MgPQotCSAgICBSWE9OX0ZMR19UU0YySE9TVF9NU0sgfCBSWE9OX0ZMR19BTlRfQV9NU0sgfCBSWE9OX0ZMR19ESVNfRElWX01TSzsKLQlzcGVjdHJ1bS5maWx0ZXJfZmxhZ3MgPSBNRUFTVVJFTUVOVF9GSUxURVJfRkxBRzsKLQljbWQubGVuID0gc2l6ZW9mKHNwZWN0cnVtKTsKLQlzcGVjdHJ1bS5sZW4gPSBjcHVfdG9fbGUxNihjbWQubGVuIC0gc2l6ZW9mKHNwZWN0cnVtLmxlbikpOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkKLQkJc3BlY3RydW0uc3RhcnRfdGltZSA9Ci0JCQlpd2xfbGVnYWN5X2FkZF9iZWFjb25fdGltZShwcml2LAotCQkJCXByaXYtPl8zOTQ1Lmxhc3RfYmVhY29uX3RpbWUsIGFkZF90aW1lLAotCQkJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCkpOwotCWVsc2UKLQkJc3BlY3RydW0uc3RhcnRfdGltZSA9IDA7Ci0KLQlzcGVjdHJ1bS5jaGFubmVsc1swXS5kdXJhdGlvbiA9IGNwdV90b19sZTMyKGR1cmF0aW9uICogVElNRV9VTklUKTsKLQlzcGVjdHJ1bS5jaGFubmVsc1swXS5jaGFubmVsID0gcGFyYW1zLT5jaGFubmVsOwotCXNwZWN0cnVtLmNoYW5uZWxzWzBdLnR5cGUgPSB0eXBlOwotCWlmIChjdHgtPmFjdGl2ZS5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykKLQkJc3BlY3RydW0uZmxhZ3MgfD0gUlhPTl9GTEdfQkFORF8yNEdfTVNLIHwKLQkJICAgIFJYT05fRkxHX0FVVE9fREVURUNUX01TSyB8IFJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKLQotCXJjID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHByaXYsICZjbWQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcGt0ID0gKHN0cnVjdCBpd2xfcnhfcGFja2V0ICopY21kLnJlcGx5X3BhZ2U7Ci0JaWYgKHBrdC0+aGRyLmZsYWdzICYgSVdMX0NNRF9GQUlMRURfTVNLKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkJhZCByZXR1cm4gZnJvbSBSRVBMWV9SWF9PTl9BU1NPQyBjb21tYW5kXG4iKTsKLQkJcmMgPSAtRUlPOwotCX0KLQotCXNwZWN0cnVtX3Jlc3Bfc3RhdHVzID0gbGUxNl90b19jcHUocGt0LT51LnNwZWN0cnVtLnN0YXR1cyk7Ci0Jc3dpdGNoIChzcGVjdHJ1bV9yZXNwX3N0YXR1cykgewotCWNhc2UgMDoJCS8qIENvbW1hbmQgd2lsbCBiZSBoYW5kbGVkICovCi0JCWlmIChwa3QtPnUuc3BlY3RydW0uaWQgIT0gMHhmZikgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJlcGxhY2VkIGV4aXN0aW5nIG1lYXN1cmVtZW50OiAlZFxuIiwKLQkJCQkJCXBrdC0+dS5zcGVjdHJ1bS5pZCk7Ci0JCQlwcml2LT5tZWFzdXJlbWVudF9zdGF0dXMgJj0gfk1FQVNVUkVNRU5UX1JFQURZOwotCQl9Ci0JCXByaXYtPm1lYXN1cmVtZW50X3N0YXR1cyB8PSBNRUFTVVJFTUVOVF9BQ1RJVkU7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIDE6CQkvKiBDb21tYW5kIHdpbGwgbm90IGJlIGhhbmRsZWQgKi8KLQkJcmMgPSAtRUFHQUlOOwotCQlicmVhazsKLQl9Ci0KLQlpd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgY21kLnJlcGx5X3BhZ2UpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X3JlcGx5X2FsaXZlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgKnBhbGl2ZTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpwd29yazsKLQotCXBhbGl2ZSA9ICZwa3QtPnUuYWxpdmVfZnJhbWU7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQWxpdmUgdWNvZGUgc3RhdHVzIDB4JTA4WCByZXZpc2lvbiAiCi0JCSAgICAgICAiMHglMDFYIDB4JTAxWFxuIiwKLQkJICAgICAgIHBhbGl2ZS0+aXNfdmFsaWQsIHBhbGl2ZS0+dmVyX3R5cGUsCi0JCSAgICAgICBwYWxpdmUtPnZlcl9zdWJ0eXBlKTsKLQotCWlmIChwYWxpdmUtPnZlcl9zdWJ0eXBlID09IElOSVRJQUxJWkVfU1VCVFlQRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdGlhbGl6YXRpb24gQWxpdmUgcmVjZWl2ZWQuXG4iKTsKLQkJbWVtY3B5KCZwcml2LT5jYXJkX2FsaXZlX2luaXQsICZwa3QtPnUuYWxpdmVfZnJhbWUsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9hbGl2ZV9yZXNwKSk7Ci0JCXB3b3JrID0gJnByaXYtPmluaXRfYWxpdmVfc3RhcnQ7Ci0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJ1bnRpbWUgQWxpdmUgcmVjZWl2ZWQuXG4iKTsKLQkJbWVtY3B5KCZwcml2LT5jYXJkX2FsaXZlLCAmcGt0LT51LmFsaXZlX2ZyYW1lLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfYWxpdmVfcmVzcCkpOwotCQlwd29yayA9ICZwcml2LT5hbGl2ZV9zdGFydDsKLQkJaXdsMzk0NV9kaXNhYmxlX2V2ZW50cyhwcml2KTsKLQl9Ci0KLQkvKiBXZSBkZWxheSB0aGUgQUxJVkUgcmVzcG9uc2UgYnkgNW1zIHRvCi0JICogZ2l2ZSB0aGUgSFcgUkYgS2lsbCB0aW1lIHRvIGFjdGl2YXRlLi4uICovCi0JaWYgKHBhbGl2ZS0+aXNfdmFsaWQgPT0gVUNPREVfVkFMSURfT0spCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsIHB3b3JrLAotCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoNSkpOwotCWVsc2UKLQkJSVdMX1dBUk4ocHJpdiwgInVDb2RlIGRpZCBub3QgcmVzcG9uZCBPSy5cbiIpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X3JlcGx5X2FkZF9zdGEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLSNlbmRpZgotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJSZWNlaXZlZCBSRVBMWV9BRERfU1RBOiAweCUwMlhcbiIsIHBrdC0+dS5zdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X2JlYWNvbl9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bDM5NDVfYmVhY29uX25vdGlmICpiZWFjb24gPSAmKHBrdC0+dS5iZWFjb25fc3RhdHVzKTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQl1OCByYXRlID0gYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5yYXRlOwotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJiZWFjb24gc3RhdHVzICV4IHJldHJpZXMgJWQgaXNzICVkICIKLQkJInRzZiAlZCAlZCByYXRlICVkXG4iLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLnN0YXR1cykgJiBUWF9TVEFUVVNfTVNLLAotCQliZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLmZhaWx1cmVfZnJhbWUsCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKSwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5oaWdoX3RzZiksCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+bG93X3RzZiksIHJhdGUpOwotI2VuZGlmCi0KLQlwcml2LT5pYnNzX21hbmFnZXIgPSBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyk7Ci0KLX0KLQotLyogSGFuZGxlIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlIHRoYXQgY2FyZCdzIHBvd2VyIHN0YXRlIGlzIGNoYW5naW5nCi0gKiBkdWUgdG8gc29mdHdhcmUsIGhhcmR3YXJlLCBvciBjcml0aWNhbCB0ZW1wZXJhdHVyZSBSRktJTEwgKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfY2FyZF9zdGF0ZV9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXUzMiBmbGFncyA9IGxlMzJfdG9fY3B1KHBrdC0+dS5jYXJkX3N0YXRlX25vdGlmLmZsYWdzKTsKLQl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IHByaXYtPnN0YXR1czsKLQotCUlXTF9XQVJOKHByaXYsICJDYXJkIHN0YXRlIHJlY2VpdmVkOiBIVzolcyBTVzolc1xuIiwKLQkJCSAgKGZsYWdzICYgSFdfQ0FSRF9ESVNBQkxFRCkgPyAiS2lsbCIgOiAiT24iLAotCQkJICAoZmxhZ3MgJiBTV19DQVJEX0RJU0FCTEVEKSA/ICJLaWxsIiA6ICJPbiIpOwotCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfU0VULAotCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKLQotCWlmIChmbGFncyAmIEhXX0NBUkRfRElTQUJMRUQpCi0JCXNldF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCWVsc2UKLQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCi0JaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbChwcml2KTsKLQotCWlmICgodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZzdGF0dXMpICE9Ci0JICAgICB0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpKQotCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwKLQkJCQl0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpOwotCWVsc2UKLQkJd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3NldHVwX3J4X2hhbmRsZXJzIC0gSW5pdGlhbGl6ZSBSeCBoYW5kbGVyIGNhbGxiYWNrcwotICoKLSAqIFNldHVwIHRoZSBSWCBoYW5kbGVycyBmb3IgZWFjaCBvZiB0aGUgcmVwbHkgdHlwZXMgc2VudCBmcm9tIHRoZSB1Q29kZQotICogdG8gdGhlIGhvc3QuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjaGFpbnMgaW50byB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgZmlsZXMgZm9yIHRoZW0gdG8gc2V0dXAKLSAqIGFueSBoYXJkd2FyZSBzcGVjaWZpYyBoYW5kbGVycyBhcyB3ZWxsLgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3NldHVwX3J4X2hhbmRsZXJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9BTElWRV0gPSBpd2wzOTQ1X3J4X3JlcGx5X2FsaXZlOwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX0FERF9TVEFdID0gaXdsMzk0NV9yeF9yZXBseV9hZGRfc3RhOwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX0VSUk9SXSA9IGl3bF9sZWdhY3lfcnhfcmVwbHlfZXJyb3I7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbQ0hBTk5FTF9TV0lUQ0hfTk9USUZJQ0FUSU9OXSA9IGl3bF9sZWdhY3lfcnhfY3NhOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NQRUNUUlVNX01FQVNVUkVfTk9USUZJQ0FUSU9OXSA9Ci0JCQlpd2xfbGVnYWN5X3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUE1fU0xFRVBfTk9USUZJQ0FUSU9OXSA9IGl3bF9sZWdhY3lfcnhfcG1fc2xlZXBfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUE1fREVCVUdfU1RBVElTVElDX05PVElGSUNdID0KLQkgICAgaXdsX2xlZ2FjeV9yeF9wbV9kZWJ1Z19zdGF0aXN0aWNzX25vdGlmOwotCXByaXYtPnJ4X2hhbmRsZXJzW0JFQUNPTl9OT1RJRklDQVRJT05dID0gaXdsMzk0NV9yeF9iZWFjb25fbm90aWY7Ci0KLQkvKgotCSAqIFRoZSBzYW1lIGhhbmRsZXIgaXMgdXNlZCBmb3IgYm90aCB0aGUgUkVQTFkgdG8gYSBkaXNjcmV0ZQotCSAqIHN0YXRpc3RpY3MgcmVxdWVzdCBmcm9tIHRoZSBob3N0IGFzIHdlbGwgYXMgZm9yIHRoZSBwZXJpb2RpYwotCSAqIHN0YXRpc3RpY3Mgbm90aWZpY2F0aW9ucyAoYWZ0ZXIgcmVjZWl2ZWQgYmVhY29ucykgZnJvbSB0aGUgdUNvZGUuCi0JICovCi0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfU1RBVElTVElDU19DTURdID0gaXdsMzk0NV9yZXBseV9zdGF0aXN0aWNzOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OXSA9IGl3bDM5NDVfaHdfcnhfc3RhdGlzdGljczsKLQotCWl3bF9sZWdhY3lfc2V0dXBfcnhfc2Nhbl9oYW5kbGVycyhwcml2KTsKLQlwcml2LT5yeF9oYW5kbGVyc1tDQVJEX1NUQVRFX05PVElGSUNBVElPTl0gPSBpd2wzOTQ1X3J4X2NhcmRfc3RhdGVfbm90aWY7Ci0KLQkvKiBTZXQgdXAgaGFyZHdhcmUgc3BlY2lmaWMgUnggaGFuZGxlcnMgKi8KLQlpd2wzOTQ1X2h3X3J4X2hhbmRsZXJfc2V0dXAocHJpdik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBSWC1GVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCB0aGVvcnkgb2Ygb3BlcmF0aW9uCi0gKgotICogVGhlIGhvc3QgYWxsb2NhdGVzIDMyIERNQSB0YXJnZXQgYWRkcmVzc2VzIGFuZCBwYXNzZXMgdGhlIGhvc3QgYWRkcmVzcwotICogdG8gdGhlIGZpcm13YXJlIGF0IHJlZ2lzdGVyIElXTF9SRkRTX1RBQkxFX0xPV0VSICsgTiAqIFJGRF9TSVpFIHdoZXJlIE4gaXMKLSAqIDAgdG8gMzEKLSAqCi0gKiBSeCBRdWV1ZSBJbmRleGVzCi0gKiBUaGUgaG9zdC9maXJtd2FyZSBzaGFyZSB0d28gaW5kZXggcmVnaXN0ZXJzIGZvciBtYW5hZ2luZyB0aGUgUnggYnVmZmVycy4KLSAqCi0gKiBUaGUgUkVBRCBpbmRleCBtYXBzIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiB0aGF0IHRoZSBmaXJtd2FyZSBtYXkgYmUgd3JpdGluZwotICogdG8gLS0gdGhlIGRyaXZlciBjYW4gcmVhZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoaXMgcG9zaXRpb24gYW5kIGdldAotICogZ29vZCBkYXRhLgotICogVGhlIFJFQUQgaW5kZXggaXMgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUgb25jZSB0aGUgY2FyZCBpcyBlbmFibGVkLgotICoKLSAqIFRoZSBXUklURSBpbmRleCBtYXBzIHRvIHRoZSBsYXN0IHBvc2l0aW9uIHRoZSBkcml2ZXIgaGFzIHJlYWQgZnJvbSAtLSB0aGUKLSAqIHBvc2l0aW9uIHByZWNlZGluZyBXUklURSBpcyB0aGUgbGFzdCBzbG90IHRoZSBmaXJtd2FyZSBjYW4gcGxhY2UgYSBwYWNrZXQuCi0gKgotICogVGhlIHF1ZXVlIGlzIGVtcHR5IChubyBnb29kIGRhdGEpIGlmIFdSSVRFID0gUkVBRCAtIDEsIGFuZCBpcyBmdWxsIGlmCi0gKiBXUklURSA9IFJFQUQuCi0gKgotICogRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgaG9zdCBzZXRzIHVwIHRoZSBSRUFEIHF1ZXVlIHBvc2l0aW9uIHRvIHRoZSBmaXJzdAotICogSU5ERVggcG9zaXRpb24sIGFuZCBXUklURSB0byB0aGUgbGFzdCAoUkVBRCAtIDEgd3JhcHBlZCkKLSAqCi0gKiBXaGVuIHRoZSBmaXJtd2FyZSBwbGFjZXMgYSBwYWNrZXQgaW4gYSBidWZmZXIsIGl0IHdpbGwgYWR2YW5jZSB0aGUgUkVBRCBpbmRleAotICogYW5kIGZpcmUgdGhlIFJYIGludGVycnVwdC4gIFRoZSBkcml2ZXIgY2FuIHRoZW4gcXVlcnkgdGhlIFJFQUQgaW5kZXggYW5kCi0gKiBwcm9jZXNzIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZSwgbW92aW5nIHRoZSBXUklURSBpbmRleCBmb3J3YXJkIGFzIGl0Ci0gKiByZXNldHMgdGhlIFJ4IHF1ZXVlIGJ1ZmZlcnMgd2l0aCBuZXcgbWVtb3J5LgotICoKLSAqIFRoZSBtYW5hZ2VtZW50IGluIHRoZSBkcml2ZXIgaXMgYXMgZm9sbG93czoKLSAqICsgQSBsaXN0IG9mIHByZS1hbGxvY2F0ZWQgU0tCcyBpcyBzdG9yZWQgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUuICBXaGVuCi0gKiAgIGl3bC0+cnhxLT5mcmVlX2NvdW50IGRyb3BzIHRvIG9yIGJlbG93IFJYX0xPV19XQVRFUk1BUkssIHdvcmsgaXMgc2NoZWR1bGVkCi0gKiAgIHRvIHJlcGxlbmlzaCB0aGUgaXdsLT5yeHEtPnJ4X2ZyZWUuCi0gKiArIEluIGl3bDM5NDVfcnhfcmVwbGVuaXNoIChzY2hlZHVsZWQpIGlmICdwcm9jZXNzZWQnICE9ICdyZWFkJyB0aGVuIHRoZQotICogICBpd2wtPnJ4cSBpcyByZXBsZW5pc2hlZCBhbmQgdGhlIFJFQUQgSU5ERVggaXMgdXBkYXRlZCAodXBkYXRpbmcgdGhlCi0gKiAgICdwcm9jZXNzZWQnIGFuZCAncmVhZCcgZHJpdmVyIGluZGV4ZXMgYXMgd2VsbCkKLSAqICsgQSByZWNlaXZlZCBwYWNrZXQgaXMgcHJvY2Vzc2VkIGFuZCBoYW5kZWQgdG8gdGhlIGtlcm5lbCBuZXR3b3JrIHN0YWNrLAotICogICBkZXRhY2hlZCBmcm9tIHRoZSBpd2wtPnJ4cS4gIFRoZSBkcml2ZXIgJ3Byb2Nlc3NlZCcgaW5kZXggaXMgdXBkYXRlZC4KLSAqICsgVGhlIEhvc3QvRmlybXdhcmUgaXdsLT5yeHEgaXMgcmVwbGVuaXNoZWQgYXQgdGFza2xldCB0aW1lIGZyb20gdGhlIHJ4X2ZyZWUKLSAqICAgbGlzdC4gSWYgdGhlcmUgYXJlIG5vIGFsbG9jYXRlZCBidWZmZXJzIGluIGl3bC0+cnhxLT5yeF9mcmVlLCB0aGUgUkVBRAotICogICBJTkRFWCBpcyBub3QgaW5jcmVtZW50ZWQgYW5kIGl3bC0+c3RhdHVzKFJYX1NUQUxMRUQpIGlzIHNldC4gIElmIHRoZXJlCi0gKiAgIHdlcmUgZW5vdWdoIGZyZWUgYnVmZmVycyBhbmQgUlhfU1RBTExFRCBpcyBzZXQgaXQgaXMgY2xlYXJlZC4KLSAqCi0gKgotICogRHJpdmVyIHNlcXVlbmNlOgotICoKLSAqIGl3bDM5NDVfcnhfcmVwbGVuaXNoKCkgICAgIFJlcGxlbmlzaGVzIHJ4X2ZyZWUgbGlzdCBmcm9tIHJ4X3VzZWQsIGFuZCBjYWxscwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXdsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrCi0gKiBpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2soKSBNb3ZlcyBhdmFpbGFibGUgYnVmZmVycyBmcm9tIHJ4X2ZyZWUgaW50byBSeAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsIHVwZGF0ZXMgZmlybXdhcmUgcG9pbnRlcnMsIGFuZCB1cGRhdGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgV1JJVEUgaW5kZXguICBJZiBpbnN1ZmZpY2llbnQgcnhfZnJlZSBidWZmZXJzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlLCBzY2hlZHVsZXMgaXdsMzk0NV9yeF9yZXBsZW5pc2gKLSAqCi0gKiAtLSBlbmFibGUgaW50ZXJydXB0cyAtLQotICogSVNSIC0gaXdsMzk0NV9yeCgpICAgICAgICAgRGV0YWNoIGl3bF9yeF9tZW1fYnVmZmVycyBmcm9tIHBvb2wgdXAgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFEIElOREVYLCBkZXRhY2hpbmcgdGhlIFNLQiBmcm9tIHRoZSBwb29sLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW92ZXMgdGhlIHBhY2tldCBidWZmZXIgZnJvbSBxdWV1ZSB0byByeF91c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbHMgaXdsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrIHRvIHJlZmlsbCBhbnkgZW1wdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzLgotICogLi4uCi0gKgotICovCi0KLS8qKgotICogaXdsMzk0NV9kbWFfYWRkcjJyYmRfcHRyIC0gY29udmVydCBhIERNQSBhZGRyZXNzIHRvIGEgdUNvZGUgcmVhZCBidWZmZXIgcHRyCi0gKi8KLXN0YXRpYyBpbmxpbmUgX19sZTMyIGl3bDM5NDVfZG1hX2FkZHIycmJkX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgZG1hX2FkZHJfdCBkbWFfYWRkcikKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMzIoKHUzMilkbWFfYWRkcik7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrIC0gcmVmaWxsIFJYIHF1ZXVlIGZyb20gcHJlLWFsbG9jYXRlZCBwb29sCi0gKgotICogSWYgdGhlcmUgYXJlIHNsb3RzIGluIHRoZSBSWCBxdWV1ZSB0aGF0IG5lZWQgdG8gYmUgcmVzdG9ja2VkLAotICogYW5kIHdlIGhhdmUgZnJlZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMsIGZpbGwgdGhlIHJhbmtzIGFzIG11Y2gKLSAqIGFzIHdlIGNhbiwgcHVsbGluZyBmcm9tIHJ4X2ZyZWUuCi0gKgotICogVGhpcyBtb3ZlcyB0aGUgJ3dyaXRlJyBpbmRleCBmb3J3YXJkIHRvIGNhdGNoIHVwIHdpdGggJ3Byb2Nlc3NlZCcsIGFuZAotICogYWxzbyB1cGRhdGVzIHRoZSBtZW1vcnkgYWRkcmVzcyBpbiB0aGUgZmlybXdhcmUgdG8gcmVmZXJlbmNlIHRoZSBuZXcKLSAqIHRhcmdldCBidWZmZXIuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHdyaXRlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCXdyaXRlID0gcnhxLT53cml0ZSAmIH4weDc7Ci0Jd2hpbGUgKChpd2xfbGVnYWN5X3J4X3F1ZXVlX3NwYWNlKHJ4cSkgPiAwKSAmJiAocnhxLT5mcmVlX2NvdW50KSkgewotCQkvKiBHZXQgbmV4dCBmcmVlIFJ4IGJ1ZmZlciwgcmVtb3ZlIGZyb20gZnJlZSBsaXN0ICovCi0JCWVsZW1lbnQgPSByeHEtPnJ4X2ZyZWUubmV4dDsKLQkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIsIGxpc3QpOwotCQlsaXN0X2RlbChlbGVtZW50KTsKLQotCQkvKiBQb2ludCB0byBSeCBidWZmZXIgdmlhIG5leHQgUkJEIGluIGNpcmN1bGFyIGJ1ZmZlciAqLwotCQlyeHEtPmJkW3J4cS0+d3JpdGVdID0gaXdsMzk0NV9kbWFfYWRkcjJyYmRfcHRyKHByaXYsIHJ4Yi0+cGFnZV9kbWEpOwotCQlyeHEtPnF1ZXVlW3J4cS0+d3JpdGVdID0gcnhiOwotCQlyeHEtPndyaXRlID0gKHJ4cS0+d3JpdGUgKyAxKSAmIFJYX1FVRVVFX01BU0s7Ci0JCXJ4cS0+ZnJlZV9jb3VudC0tOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkvKiBJZiB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXIgcG9vbCBpcyBkcm9wcGluZyBsb3csIHNjaGVkdWxlIHRvCi0JICogcmVmaWxsIGl0ICovCi0JaWYgKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKQotCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJ4X3JlcGxlbmlzaCk7Ci0KLQotCS8qIElmIHdlJ3ZlIGFkZGVkIG1vcmUgc3BhY2UgZm9yIHRoZSBmaXJtd2FyZSB0byBwbGFjZSBkYXRhLCB0ZWxsIGl0LgotCSAqIEluY3JlbWVudCBkZXZpY2UncyB3cml0ZSBwb2ludGVyIGluIG11bHRpcGxlcyBvZiA4LiAqLwotCWlmICgocnhxLT53cml0ZV9hY3R1YWwgIT0gKHJ4cS0+d3JpdGUgJiB+MHg3KSkKLQkgICAgfHwgKGFicyhyeHEtPndyaXRlIC0gcnhxLT5yZWFkKSA+IDcpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJcnhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQlpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgcnhxKTsKLQl9Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQotICoKLSAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCi0gKgotICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaXdsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrLgotICogVGhpcyBpcyBjYWxsZWQgYXMgYSBzY2hlZHVsZWQgd29yayBpdGVtIChleGNlcHQgZm9yIGR1cmluZyBpbml0aWFsaXphdGlvbikKLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yeF9hbGxvY2F0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGdmcF90IHByaW9yaXR5KQotewotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKLQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWdmcF90IGdmcF9tYXNrID0gcHJpb3JpdHk7Ci0KLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChyeHEtPmZyZWVfY291bnQgPiBSWF9MT1dfV0FURVJNQVJLKQotCQkJZ2ZwX21hc2sgfD0gX19HRlBfTk9XQVJOOwotCi0JCWlmIChwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA+IDApCi0JCQlnZnBfbWFzayB8PSBfX0dGUF9DT01QOwotCi0JCS8qIEFsbG9jIGEgbmV3IHJlY2VpdmUgYnVmZmVyICovCi0JCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnBfbWFzaywgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOwotCQlpZiAoIXBhZ2UpIHsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBTS0IgYnVmZmVyLlxuIik7Ci0JCQlpZiAoKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKSAmJgotCQkJICAgIG5ldF9yYXRlbGltaXQoKSkKLQkJCQlJV0xfQ1JJVChwcml2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIFNLQiBidWZmZXIgd2l0aCAlcy4gT25seSAldSBmcmVlIGJ1ZmZlcnMgcmVtYWluaW5nLlxuIiwKLQkJCQkJIHByaW9yaXR5ID09IEdGUF9BVE9NSUMgPyAgIkdGUF9BVE9NSUMiIDogIkdGUF9LRVJORUwiLAotCQkJCQkgcnhxLT5mcmVlX2NvdW50KTsKLQkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCi0JCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKLQkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJCV9fZnJlZV9wYWdlcyhwYWdlLCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxlbWVudCA9IHJ4cS0+cnhfdXNlZC5uZXh0OwotCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQotCQlyeGItPnBhZ2UgPSBwYWdlOwotCQkvKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBSQi9TS0IgKi8KLQkJcnhiLT5wYWdlX2RtYSA9IHBjaV9tYXBfcGFnZShwcml2LT5wY2lfZGV2LCBwYWdlLCAwLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQotCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOwotCQlyeHEtPmZyZWVfY291bnQrKzsKLQkJcHJpdi0+YWxsb2NfcnhiX3BhZ2UrKzsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQl9Ci19Ci0KLXZvaWQgaXdsMzk0NV9yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF9mcmVlKTsKLQlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF91c2VkKTsKLQkvKiBGaWxsIHRoZSByeF91c2VkIHF1ZXVlIHdpdGggX2FsbF8gb2YgdGhlIFJ4IGJ1ZmZlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgUlhfRlJFRV9CVUZGRVJTICsgUlhfUVVFVUVfU0laRTsgaSsrKSB7Ci0JCS8qIEluIHRoZSByZXNldCBmdW5jdGlvbiwgdGhlc2UgYnVmZmVycyBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZAotCQkgKiB0byBhbiBTS0IsIHNvIHdlIG5lZWQgdG8gdW5tYXAgYW5kIGZyZWUgcG90ZW50aWFsIHN0b3JhZ2UgKi8KLQkJaWYgKHJ4cS0+cG9vbFtpXS5wYWdlICE9IE5VTEwpIHsKLQkJCXBjaV91bm1hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5wYWdlX2RtYSwKLQkJCQlQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCV9faXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIHJ4cS0+cG9vbFtpXS5wYWdlKTsKLQkJCXJ4cS0+cG9vbFtpXS5wYWdlID0gTlVMTDsKLQkJfQotCQlsaXN0X2FkZF90YWlsKCZyeHEtPnBvb2xbaV0ubGlzdCwgJnJ4cS0+cnhfdXNlZCk7Ci0JfQotCi0JLyogU2V0IHVzIHNvIHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgYW5kIHVzZWQgYWxsIGJ1ZmZlcnMsIGJ1dCBoYXZlCi0JICogbm90IHJlc3RvY2tlZCB0aGUgUnggcXVldWUgd2l0aCBmcmVzaCBidWZmZXJzICovCi0JcnhxLT5yZWFkID0gcnhxLT53cml0ZSA9IDA7Ci0JcnhxLT53cml0ZV9hY3R1YWwgPSAwOwotCXJ4cS0+ZnJlZV9jb3VudCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgaXdsMzk0NV9yeF9yZXBsZW5pc2godm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpd2wzOTQ1X3J4X2FsbG9jYXRlKHByaXYsIEdGUF9LRVJORUwpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X3JlcGxlbmlzaF9ub3coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWl3bDM5NDVfcnhfYWxsb2NhdGUocHJpdiwgR0ZQX0FUT01JQyk7Ci0KLQlpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7Ci19Ci0KLQotLyogQXNzdW1lcyB0aGF0IHRoZSBza2IgZmllbGQgb2YgdGhlIGJ1ZmZlcnMgaW4gJ3Bvb2wnIGlzIGtlcHQgYWNjdXJhdGUuCi0gKiBJZiBhbiBTS0IgaGFzIGJlZW4gZGV0YWNoZWQsIHRoZSBQT09MIG5lZWRzIHRvIGhhdmUgaXRzIFNLQiBzZXQgdG8gTlVMTAotICogVGhpcyBmcmVlIHJvdXRpbmUgd2Fsa3MgdGhlIGxpc3Qgb2YgUE9PTCBlbnRyaWVzIGFuZCBpZiBTS0IgaXMgc2V0IHRvCi0gKiBub24gTlVMTCBpdCBpcyB1bm1hcHBlZCBhbmQgZnJlZWQKLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yeF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9TSVpFICsgUlhfRlJFRV9CVUZGRVJTOyBpKyspIHsKLQkJaWYgKHJ4cS0+cG9vbFtpXS5wYWdlICE9IE5VTEwpIHsKLQkJCXBjaV91bm1hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5wYWdlX2RtYSwKLQkJCQlQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCV9faXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIHJ4cS0+cG9vbFtpXS5wYWdlKTsKLQkJCXJ4cS0+cG9vbFtpXS5wYWdlID0gTlVMTDsKLQkJfQotCX0KLQotCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIDQgKiBSWF9RVUVVRV9TSVpFLCByeHEtPmJkLAotCQkJICByeHEtPmJkX2RtYSk7Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBpd2xfcmJfc3RhdHVzKSwKLQkJCSAgcnhxLT5yYl9zdHRzLCByeHEtPnJiX3N0dHNfZG1hKTsKLQlyeHEtPmJkID0gTlVMTDsKLQlyeHEtPnJiX3N0dHMgID0gTlVMTDsKLX0KLQotCi0vKiBDb252ZXJ0IGxpbmVhciBzaWduYWwtdG8tbm9pc2UgcmF0aW8gaW50byBkQiAqLwotc3RhdGljIHU4IHJhdGlvMmRCWzEwMF0gPSB7Ci0vKgkgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAqLwotCSAwLCAgMCwgIDYsIDEwLCAxMiwgMTQsIDE2LCAxNywgMTgsIDE5LCAvKiAwMCAtIDA5ICovCi0JMjAsIDIxLCAyMiwgMjIsIDIzLCAyMywgMjQsIDI1LCAyNiwgMjYsIC8qIDEwIC0gMTkgKi8KLQkyNiwgMjYsIDI2LCAyNywgMjcsIDI4LCAyOCwgMjgsIDI5LCAyOSwgLyogMjAgLSAyOSAqLwotCTI5LCAzMCwgMzAsIDMwLCAzMSwgMzEsIDMxLCAzMSwgMzIsIDMyLCAvKiAzMCAtIDM5ICovCi0JMzIsIDMyLCAzMiwgMzMsIDMzLCAzMywgMzMsIDMzLCAzNCwgMzQsIC8qIDQwIC0gNDkgKi8KLQkzNCwgMzQsIDM0LCAzNCwgMzUsIDM1LCAzNSwgMzUsIDM1LCAzNSwgLyogNTAgLSA1OSAqLwotCTM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNywgMzcsIDM3LCAvKiA2MCAtIDY5ICovCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzOCwgMzgsIDM4LCAzOCwgMzgsIC8qIDcwIC0gNzkgKi8KLQkzOCwgMzgsIDM4LCAzOCwgMzgsIDM5LCAzOSwgMzksIDM5LCAzOSwgLyogODAgLSA4OSAqLwotCTM5LCAzOSwgMzksIDM5LCAzOSwgNDAsIDQwLCA0MCwgNDAsIDQwICAvKiA5MCAtIDk5ICovCi19OwotCi0vKiBDYWxjdWxhdGVzIGEgcmVsYXRpdmUgZEIgdmFsdWUgZnJvbSBhIHJhdGlvIG9mIGxpbmVhcgotICogICAoaS5lLiBub3QgZEIpIHNpZ25hbCBsZXZlbHMuCi0gKiBDb252ZXJzaW9uIGFzc3VtZXMgdGhhdCBsZXZlbHMgYXJlIHZvbHRhZ2VzICgyMCpsb2cpLCBub3QgcG93ZXJzICgxMCpsb2cpLiAqLwotaW50IGl3bDM5NDVfY2FsY19kYl9mcm9tX3JhdGlvKGludCBzaWdfcmF0aW8pCi17Ci0JLyogMTAwMDoxIG9yIGhpZ2hlciBqdXN0IHJlcG9ydCBhcyA2MCBkQiAqLwotCWlmIChzaWdfcmF0aW8gPj0gMTAwMCkKLQkJcmV0dXJuIDYwOwotCi0JLyogMTAwOjEgb3IgaGlnaGVyLCBkaXZpZGUgYnkgMTAgYW5kIHVzZSB0YWJsZSwKLQkgKiAgIGFkZCAyMCBkQiB0byBtYWtlIHVwIGZvciBkaXZpZGUgYnkgMTAgKi8KLQlpZiAoc2lnX3JhdGlvID49IDEwMCkKLQkJcmV0dXJuIDIwICsgKGludClyYXRpbzJkQltzaWdfcmF0aW8vMTBdOwotCi0JLyogV2Ugc2hvdWxkbid0IHNlZSB0aGlzICovCi0JaWYgKHNpZ19yYXRpbyA8IDEpCi0JCXJldHVybiAwOwotCi0JLyogVXNlIHRhYmxlIGZvciByYXRpb3MgMToxIC0gOTk6MSAqLwotCXJldHVybiAoaW50KXJhdGlvMmRCW3NpZ19yYXRpb107Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yeF9oYW5kbGUgLSBNYWluIGVudHJ5IGZ1bmN0aW9uIGZvciByZWNlaXZpbmcgcmVzcG9uc2VzIGZyb20gdUNvZGUKLSAqCi0gKiBVc2VzIHRoZSBwcml2LT5yeF9oYW5kbGVycyBjYWxsYmFjayBmdW5jdGlvbiBhcnJheSB0byBpbnZva2UKLSAqIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVycywgaW5jbHVkaW5nIGNvbW1hbmQgcmVzcG9uc2VzLAotICogZnJhbWUtcmVjZWl2ZWQgbm90aWZpY2F0aW9ucywgYW5kIG90aGVyIG5vdGlmaWNhdGlvbnMuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfaGFuZGxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0JdTMyIHIsIGk7Ci0JaW50IHJlY2xhaW07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBmaWxsX3J4ID0gMDsKLQl1MzIgY291bnQgPSA4OwotCWludCB0b3RhbF9lbXB0eSA9IDA7Ci0KLQkvKiB1Q29kZSdzIHJlYWQgaW5kZXggKHN0b3JlZCBpbiBzaGFyZWQgRFJBTSkgaW5kaWNhdGVzIHRoZSBsYXN0IFJ4Ci0JICogYnVmZmVyIHRoYXQgdGhlIGRyaXZlciBtYXkgcHJvY2VzcyAobGFzdCBidWZmZXIgZmlsbGVkIGJ5IHVjb2RlKS4gKi8KLQlyID0gbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT5jbG9zZWRfcmJfbnVtKSAmICAweDBGRkY7Ci0JaSA9IHJ4cS0+cmVhZDsKLQotCS8qIGNhbGN1bGF0ZSB0b3RhbCBmcmFtZXMgbmVlZCB0byBiZSByZXN0b2NrIGFmdGVyIGhhbmRsaW5nIFJYICovCi0JdG90YWxfZW1wdHkgPSByIC0gcnhxLT53cml0ZV9hY3R1YWw7Ci0JaWYgKHRvdGFsX2VtcHR5IDwgMCkKLQkJdG90YWxfZW1wdHkgKz0gUlhfUVVFVUVfU0laRTsKLQotCWlmICh0b3RhbF9lbXB0eSA+IChSWF9RVUVVRV9TSVpFIC8gMikpCi0JCWZpbGxfcnggPSAxOwotCS8qIFJ4IGludGVycnVwdCwgYnV0IG5vdGhpbmcgc2VudCBmcm9tIHVDb2RlICovCi0JaWYgKGkgPT0gcikKLQkJSVdMX0RFQlVHX1JYKHByaXYsICJyID0gJWQsIGkgPSAlZFxuIiwgciwgaSk7Ci0KLQl3aGlsZSAoaSAhPSByKSB7Ci0JCWludCBsZW47Ci0KLQkJcnhiID0gcnhxLT5xdWV1ZVtpXTsKLQotCQkvKiBJZiBhbiBSWEIgZG9lc24ndCBoYXZlIGEgUnggcXVldWUgc2xvdCBhc3NvY2lhdGVkIHdpdGggaXQsCi0JCSAqIHRoZW4gYSBidWcgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiB0aGUgcXVldWUgcmVmaWxsaW5nCi0JCSAqIHJvdXRpbmVzIC0tIGNhdGNoIGl0IGhlcmUgKi8KLQkJQlVHX09OKHJ4YiA9PSBOVUxMKTsKLQotCQlyeHEtPnF1ZXVlW2ldID0gTlVMTDsKLQotCQlwY2lfdW5tYXBfcGFnZShwcml2LT5wY2lfZGV2LCByeGItPnBhZ2VfZG1hLAotCQkJICAgICAgIFBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlwa3QgPSByeGJfYWRkcihyeGIpOwotCi0JCWxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgRkhfUlNDU1JfRlJBTUVfU0laRV9NU0s7Ci0JCWxlbiArPSBzaXplb2YodTMyKTsgLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KLQkJdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X3J4KHByaXYsIHBrdCwgbGVuKTsKLQotCQkvKiBSZWNsYWltIGEgY29tbWFuZCBidWZmZXIgb25seSBpZiB0aGlzIHBhY2tldCBpcyBhIHJlc3BvbnNlCi0JCSAqICAgdG8gYSAoZHJpdmVyLW9yaWdpbmF0ZWQpIGNvbW1hbmQuCi0JCSAqIElmIHRoZSBwYWNrZXQgKGUuZy4gUnggZnJhbWUpIG9yaWdpbmF0ZWQgZnJvbSB1Q29kZSwKLQkJICogICB0aGVyZSBpcyBubyBjb21tYW5kIGJ1ZmZlciB0byByZWNsYWltLgotCQkgKiBVY29kZSBzaG91bGQgc2V0IFNFUV9SWF9GUkFNRSBiaXQgaWYgdWNvZGUtb3JpZ2luYXRlZCwKLQkJICogICBidXQgYXBwYXJlbnRseSBhIGZldyBkb24ndCBnZXQgc2V0OyBjYXRjaCB0aGVtIGhlcmUuICovCi0JCXJlY2xhaW0gPSAhKHBrdC0+aGRyLnNlcXVlbmNlICYgU0VRX1JYX0ZSQU1FKSAmJgotCQkJKHBrdC0+aGRyLmNtZCAhPSBTVEFUSVNUSUNTX05PVElGSUNBVElPTikgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gUkVQTFlfVFgpOwotCi0JCS8qIEJhc2VkIG9uIHR5cGUgb2YgY29tbWFuZCByZXNwb25zZSBvciBub3RpZmljYXRpb24sCi0JCSAqICAgaGFuZGxlIHRob3NlIHRoYXQgbmVlZCBoYW5kbGluZyB2aWEgZnVuY3Rpb24gaW4KLQkJICogICByeF9oYW5kbGVycyB0YWJsZS4gIFNlZSBpd2wzOTQ1X3NldHVwX3J4X2hhbmRsZXJzKCkgKi8KLQkJaWYgKHByaXYtPnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0pIHsKLQkJCUlXTF9ERUJVR19SWChwcml2LCAiciA9ICVkLCBpID0gJWQsICVzLCAweCUwMnhcbiIsIHIsIGksCi0JCQlpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksIHBrdC0+aGRyLmNtZCk7Ci0JCQlwcml2LT5pc3Jfc3RhdHMucnhfaGFuZGxlcnNbcGt0LT5oZHIuY21kXSsrOwotCQkJcHJpdi0+cnhfaGFuZGxlcnNbcGt0LT5oZHIuY21kXSAocHJpdiwgcnhiKTsKLQkJfSBlbHNlIHsKLQkJCS8qIE5vIGhhbmRsaW5nIG5lZWRlZCAqLwotCQkJSVdMX0RFQlVHX1JYKHByaXYsCi0JCQkJInIgJWQgaSAlZCBObyBoYW5kbGVyIG5lZWRlZCBmb3IgJXMsIDB4JTAyeFxuIiwKLQkJCQlyLCBpLCBpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksCi0JCQkJcGt0LT5oZHIuY21kKTsKLQkJfQotCi0JCS8qCi0JCSAqIFhYWDogQWZ0ZXIgaGVyZSwgd2Ugc2hvdWxkIGFsd2F5cyBjaGVjayByeGItPnBhZ2UKLQkJICogYWdhaW5zdCBOVUxMIGJlZm9yZSB0b3VjaGluZyBpdCBvciBpdHMgdmlydHVhbAotCQkgKiBtZW1vcnkgKHBrdCkuIEJlY2F1c2Ugc29tZSByeF9oYW5kbGVyIG1pZ2h0IGhhdmUKLQkJICogYWxyZWFkeSB0YWtlbiBvciBmcmVlZCB0aGUgcGFnZXMuCi0JCSAqLwotCi0JCWlmIChyZWNsYWltKSB7Ci0JCQkvKiBJbnZva2UgYW55IGNhbGxiYWNrcywgdHJhbnNmZXIgdGhlIGJ1ZmZlciB0byBjYWxsZXIsCi0JCQkgKiBhbmQgZmlyZSBvZmYgdGhlIChwb3NzaWJseSkgYmxvY2tpbmcgaXdsX2xlZ2FjeV9zZW5kX2NtZCgpCi0JCQkgKiBhcyB3ZSByZWNsYWltIHRoZSBkcml2ZXIgY29tbWFuZCBxdWV1ZSAqLwotCQkJaWYgKHJ4Yi0+cGFnZSkKLQkJCQlpd2xfbGVnYWN5X3R4X2NtZF9jb21wbGV0ZShwcml2LCByeGIpOwotCQkJZWxzZQotCQkJCUlXTF9XQVJOKHByaXYsICJDbGFpbSBudWxsIHJ4Yj9cbiIpOwotCQl9Ci0KLQkJLyogUmV1c2UgdGhlIHBhZ2UgaWYgcG9zc2libGUuIEZvciBub3RpZmljYXRpb24gcGFja2V0cyBhbmQKLQkJICogU0tCcyB0aGF0IGZhaWwgdG8gUnggY29ycmVjdGx5LCBhZGQgdGhlbSBiYWNrIGludG8gdGhlCi0JCSAqIHJ4X2ZyZWUgbGlzdCBmb3IgcmV1c2UgbGF0ZXIuICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKHJ4Yi0+cGFnZSAhPSBOVUxMKSB7Ci0JCQlyeGItPnBhZ2VfZG1hID0gcGNpX21hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4Yi0+cGFnZSwKLQkJCQkwLCBQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7Ci0JCQlyeHEtPmZyZWVfY291bnQrKzsKLQkJfSBlbHNlCi0JCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X3VzZWQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWkgPSAoaSArIDEpICYgUlhfUVVFVUVfTUFTSzsKLQkJLyogSWYgdGhlcmUgYXJlIGEgbG90IG9mIHVudXNlZCBmcmFtZXMsCi0JCSAqIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHNvIHVjb2RlIHdvbid0IGFzc2VydC4gKi8KLQkJaWYgKGZpbGxfcngpIHsKLQkJCWNvdW50Kys7Ci0JCQlpZiAoY291bnQgPj0gOCkgewotCQkJCXJ4cS0+cmVhZCA9IGk7Ci0JCQkJaXdsMzk0NV9yeF9yZXBsZW5pc2hfbm93KHByaXYpOwotCQkJCWNvdW50ID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEJhY2t0cmFjayBvbmUgZW50cnkgKi8KLQlyeHEtPnJlYWQgPSBpOwotCWlmIChmaWxsX3J4KQotCQlpd2wzOTQ1X3J4X3JlcGxlbmlzaF9ub3cocHJpdik7Ci0JZWxzZQotCQlpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7Ci19Ci0KLS8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmbHVzaCBhbnkgc2NoZWR1bGVkIHRhc2tsZXQgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2wzOTQ1X3N5bmNocm9uaXplX2lycShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogd2FpdCB0byBtYWtlIHN1cmUgd2UgZmx1c2ggcGVuZGluZyB0YXNrbGV0Ki8KLQlzeW5jaHJvbml6ZV9pcnEocHJpdi0+cGNpX2Rldi0+aXJxKTsKLQl0YXNrbGV0X2tpbGwoJnByaXYtPmlycV90YXNrbGV0KTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKml3bDM5NDVfZGVzY19sb29rdXAoaW50IGkpCi17Ci0Jc3dpdGNoIChpKSB7Ci0JY2FzZSAxOgotCQlyZXR1cm4gIkZBSUwiOwotCWNhc2UgMjoKLQkJcmV0dXJuICJCQURfUEFSQU0iOwotCWNhc2UgMzoKLQkJcmV0dXJuICJCQURfQ0hFQ0tTVU0iOwotCWNhc2UgNDoKLQkJcmV0dXJuICJOTUlfSU5URVJSVVBUIjsKLQljYXNlIDU6Ci0JCXJldHVybiAiU1lTQVNTRVJUIjsKLQljYXNlIDY6Ci0JCXJldHVybiAiRkFUQUxfRVJST1IiOwotCX0KLQotCXJldHVybiAiVU5LTk9XTiI7Ci19Ci0KLSNkZWZpbmUgRVJST1JfU1RBUlRfT0ZGU0VUICAoMSAqIHNpemVvZih1MzIpKQotI2RlZmluZSBFUlJPUl9FTEVNX1NJWkUgICAgICg3ICogc2l6ZW9mKHUzMikpCi0KLXZvaWQgaXdsMzk0NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBpOwotCXUzMiBkZXNjLCB0aW1lLCBjb3VudCwgYmFzZSwgZGF0YTE7Ci0JdTMyIGJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMjsKLQotCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlLmVycm9yX2V2ZW50X3RhYmxlX3B0cik7Ci0KLQlpZiAoIWl3bDM5NDVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewotCQlJV0xfRVJSKHByaXYsICJOb3QgdmFsaWQgZXJyb3IgbG9nIHBvaW50ZXIgMHglMDhYXG4iLCBiYXNlKTsKLQkJcmV0dXJuOwotCX0KLQotCi0JY291bnQgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSk7Ci0KLQlpZiAoRVJST1JfU1RBUlRfT0ZGU0VUIDw9IGNvdW50ICogRVJST1JfRUxFTV9TSVpFKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlN0YXJ0IElXTCBFcnJvciBMb2cgRHVtcDpcbiIpOwotCQlJV0xfRVJSKHByaXYsICJTdGF0dXM6IDB4JTA4bFgsIGNvdW50OiAlZFxuIiwKLQkJCXByaXYtPnN0YXR1cywgY291bnQpOwotCX0KLQotCUlXTF9FUlIocHJpdiwgIkRlc2MgICAgICAgVGltZSAgICAgICBhc3J0UEMgIGJsaW5rMiAiCi0JCSAgImlsaW5rMSAgbm1pUEMgICBMaW5lXG4iKTsKLQlmb3IgKGkgPSBFUlJPUl9TVEFSVF9PRkZTRVQ7Ci0JICAgICBpIDwgKGNvdW50ICogRVJST1JfRUxFTV9TSVpFKSArIEVSUk9SX1NUQVJUX09GRlNFVDsKLQkgICAgIGkgKz0gRVJST1JfRUxFTV9TSVpFKSB7Ci0JCWRlc2MgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkpOwotCQl0aW1lID0KLQkJICAgIGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgaSArIDEgKiBzaXplb2YodTMyKSk7Ci0JCWJsaW5rMSA9Ci0JCSAgICBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkgKyAyICogc2l6ZW9mKHUzMikpOwotCQlibGluazIgPQotCQkgICAgaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyBpICsgMyAqIHNpemVvZih1MzIpKTsKLQkJaWxpbmsxID0KLQkJICAgIGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgaSArIDQgKiBzaXplb2YodTMyKSk7Ci0JCWlsaW5rMiA9Ci0JCSAgICBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkgKyA1ICogc2l6ZW9mKHUzMikpOwotCQlkYXRhMSA9Ci0JCSAgICBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkgKyA2ICogc2l6ZW9mKHUzMikpOwotCi0JCUlXTF9FUlIocHJpdiwKLQkJCSIlLTEzcyAoMHglWCkgJTAxMHUgMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYICV1XG5cbiIsCi0JCQlpd2wzOTQ1X2Rlc2NfbG9va3VwKGRlc2MpLCBkZXNjLCB0aW1lLCBibGluazEsIGJsaW5rMiwKLQkJCWlsaW5rMSwgaWxpbmsyLCBkYXRhMSk7Ci0JCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV9lcnJvcihwcml2LCBkZXNjLCB0aW1lLCBkYXRhMSwgMCwKLQkJCQkJMCwgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfaXJxX3Rhc2tsZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBpbnRhLCBoYW5kbGVkID0gMDsKLQl1MzIgaW50YV9maDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXUzMiBpbnRhX21hc2s7Ci0jZW5kaWYKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyB1Q29kZSBpbnRlcnJ1cHRzLgotCSAqIE5vdGU6ICBTb21lIGJpdHMgaW4gQ1NSX0lOVCBhcmUgIk9SIiBvZiBiaXRzIGluIENTUl9GSF9JTlRfU1RBVFVTLAotCSAqICBhbmQgd2lsbCBjbGVhciBvbmx5IHdoZW4gQ1NSX0ZIX0lOVF9TVEFUVVMgZ2V0cyBjbGVhcmVkLiAqLwotCWludGEgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9JTlQpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIGludGEpOwotCi0JLyogQWNrL2NsZWFyL3Jlc2V0IHBlbmRpbmcgZmxvdy1oYW5kbGVyIChETUEpIGludGVycnVwdHMuCi0JICogQW55IG5ldyBpbnRlcnJ1cHRzIHRoYXQgaGFwcGVuIGFmdGVyIHRoaXMsIGVpdGhlciB3aGlsZSB3ZSdyZQotCSAqIGluIHRoaXMgdGFza2xldCwgb3IgbGF0ZXIsIHdpbGwgc2hvdyB1cCBpbiBuZXh0IElTUi90YXNrbGV0LiAqLwotCWludGFfZmggPSBpd2xfcmVhZDMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUywgaW50YV9maCk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBJV0xfRExfSVNSKSB7Ci0JCS8qIGp1c3QgZm9yIGRlYnVnICovCi0JCWludGFfbWFzayA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVF9NQVNLKTsKLQkJSVdMX0RFQlVHX0lTUihwcml2LCAiaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHhcbiIsCi0JCQkgICAgICBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgpOwotCX0KLSNlbmRpZgotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogU2luY2UgQ1NSX0lOVCBhbmQgQ1NSX0ZIX0lOVF9TVEFUVVMgcmVhZHMgYW5kIGNsZWFycyBhcmUgbm90Ci0JICogYXRvbWljLCBtYWtlIHN1cmUgdGhhdCBpbnRhIGNvdmVycyBhbGwgdGhlIGludGVycnVwdHMgdGhhdAotCSAqIHdlJ3ZlIGRpc2NvdmVyZWQsIGV2ZW4gaWYgRkggaW50ZXJydXB0IGNhbWUgaW4ganVzdCBhZnRlcgotCSAqIHJlYWRpbmcgQ1NSX0lOVC4gKi8KLQlpZiAoaW50YV9maCAmIENTUjM5X0ZIX0lOVF9SWF9NQVNLKQotCQlpbnRhIHw9IENTUl9JTlRfQklUX0ZIX1JYOwotCWlmIChpbnRhX2ZoICYgQ1NSMzlfRkhfSU5UX1RYX01BU0spCi0JCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7Ci0KLQkvKiBOb3cgc2VydmljZSBhbGwgaW50ZXJydXB0IGJpdHMgZGlzY292ZXJlZCBhYm92ZS4gKi8KLQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0hXX0VSUikgewotCQlJV0xfRVJSKHByaXYsICJIYXJkd2FyZSBlcnJvciBkZXRlY3RlZC4gIFJlc3RhcnRpbmcuXG4iKTsKLQotCQkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KLQkJaXdsX2xlZ2FjeV9kaXNhYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLQkJcHJpdi0+aXNyX3N0YXRzLmh3Kys7Ci0JCWl3bF9sZWdhY3lfaXJxX2hhbmRsZV9lcnJvcihwcml2KTsKLQotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX0hXX0VSUjsKLQotCQlyZXR1cm47Ci0JfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKHByaXYpICYgKElXTF9ETF9JU1IpKSB7Ci0JCS8qIE5JQyBmaXJlcyB0aGlzLCBidXQgd2UgZG9uJ3QgdXNlIGl0LCByZWR1bmRhbnQgd2l0aCBXQUtFVVAgKi8KLQkJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9TQ0QpIHsKLQkJCUlXTF9ERUJVR19JU1IocHJpdiwgIlNjaGVkdWxlciBmaW5pc2hlZCB0byB0cmFuc21pdCAiCi0JCQkJICAgICAgInRoZSBmcmFtZS9mcmFtZXMuXG4iKTsKLQkJCXByaXYtPmlzcl9zdGF0cy5zY2grKzsKLQkJfQotCi0JCS8qIEFsaXZlIG5vdGlmaWNhdGlvbiB2aWEgUnggaW50ZXJydXB0IHdpbGwgZG8gdGhlIHJlYWwgd29yayAqLwotCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0FMSVZFKSB7Ci0JCQlJV0xfREVCVUdfSVNSKHByaXYsICJBbGl2ZSBpbnRlcnJ1cHRcbiIpOwotCQkJcHJpdi0+aXNyX3N0YXRzLmFsaXZlKys7Ci0JCX0KLQl9Ci0jZW5kaWYKLQkvKiBTYWZlbHkgaWdub3JlIHRoZXNlIGJpdHMgZm9yIGRlYnVnIGNoZWNrcyBiZWxvdyAqLwotCWludGEgJj0gfihDU1JfSU5UX0JJVF9TQ0QgfCBDU1JfSU5UX0JJVF9BTElWRSk7Ci0KLQkvKiBFcnJvciBkZXRlY3RlZCBieSB1Q29kZSAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU1dfRVJSKSB7Ci0JCUlXTF9FUlIocHJpdiwgIk1pY3JvY29kZSBTVyBlcnJvciBkZXRlY3RlZC4gIgotCQkJIlJlc3RhcnRpbmcgMHglWC5cbiIsIGludGEpOwotCQlwcml2LT5pc3Jfc3RhdHMuc3crKzsKLQkJaXdsX2xlZ2FjeV9pcnFfaGFuZGxlX2Vycm9yKHByaXYpOwotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1NXX0VSUjsKLQl9Ci0KLQkvKiB1Q29kZSB3YWtlcyB1cCBhZnRlciBwb3dlci1kb3duIHNsZWVwICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9XQUtFVVApIHsKLQkJSVdMX0RFQlVHX0lTUihwcml2LCAiV2FrZXVwIGludGVycnVwdFxuIik7Ci0JCWl3bF9sZWdhY3lfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+cnhxKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzBdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzFdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzJdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzNdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzRdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzVdKTsKLQotCQlwcml2LT5pc3Jfc3RhdHMud2FrZXVwKys7Ci0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfV0FLRVVQOwotCX0KLQotCS8qIEFsbCB1Q29kZSBjb21tYW5kIHJlc3BvbnNlcywgaW5jbHVkaW5nIFR4IGNvbW1hbmQgcmVzcG9uc2VzLAotCSAqIFJ4ICJyZXNwb25zZXMiIChmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb24pLCBhbmQgb3RoZXIKLQkgKiBub3RpZmljYXRpb25zIGZyb20gdUNvZGUgY29tZSB0aHJvdWdoIGhlcmUqLwotCWlmIChpbnRhICYgKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpKSB7Ci0JCWl3bDM5NDVfcnhfaGFuZGxlKHByaXYpOwotCQlwcml2LT5pc3Jfc3RhdHMucngrKzsKLQkJaGFuZGxlZCB8PSAoQ1NSX0lOVF9CSVRfRkhfUlggfCBDU1JfSU5UX0JJVF9TV19SWCk7Ci0JfQotCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9GSF9UWCkgewotCQlJV0xfREVCVUdfSVNSKHByaXYsICJUeCBpbnRlcnJ1cHRcbiIpOwotCQlwcml2LT5pc3Jfc3RhdHMudHgrKzsKLQotCQlpd2xfd3JpdGUzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUywgKDEgPDwgNikpOwotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfVENTUl9DUkVESVQKLQkJCQkJKEZIMzlfU1JWQ19DSE5MKSwgMHgwKTsKLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKLQl9Ci0KLQlpZiAoaW50YSAmIH5oYW5kbGVkKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuaGFuZGxlZCBJTlRBIGJpdHMgMHglMDh4XG4iLCBpbnRhICYgfmhhbmRsZWQpOwotCQlwcml2LT5pc3Jfc3RhdHMudW5oYW5kbGVkKys7Ci0JfQotCi0JaWYgKGludGEgJiB+cHJpdi0+aW50YV9tYXNrKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJEaXNhYmxlZCBJTlRBIGJpdHMgMHglMDh4IHdlcmUgcGVuZGluZ1xuIiwKLQkJCSBpbnRhICYgfnByaXYtPmludGFfbWFzayk7Ci0JCUlXTF9XQVJOKHByaXYsICIgICB3aXRoIEZIX0lOVCA9IDB4JTA4eFxuIiwgaW50YV9maCk7Ci0JfQotCi0JLyogUmUtZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0JLyogb25seSBSZS1lbmFibGUgaWYgZGlzYWJsZWQgYnkgaXJxICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykpCi0JCWl3bF9sZWdhY3lfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiAoSVdMX0RMX0lTUikpIHsKLQkJaW50YSA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVCk7Ci0JCWludGFfbWFzayA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVF9NQVNLKTsKLQkJaW50YV9maCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMpOwotCQlJV0xfREVCVUdfSVNSKHByaXYsICJFbmQgaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHgsICIKLQkJCSJmbGFncyAweCUwOGx4XG4iLCBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgsIGZsYWdzKTsKLQl9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X2dldF9jaGFubmVsc19mb3Jfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkJICAgICB1OCBpc19hY3RpdmUsIHU4IG5fcHJvYmVzLAotCQkJCSAgICAgc3RydWN0IGl3bDM5NDVfc2Nhbl9jaGFubmVsICpzY2FuX2NoLAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTE2IHBhc3NpdmVfZHdlbGwgPSAwOwotCXUxNiBhY3RpdmVfZHdlbGwgPSAwOwotCWludCBhZGRlZCwgaTsKLQotCXNiYW5kID0gaXdsX2dldF9od19tb2RlKHByaXYsIGJhbmQpOwotCWlmICghc2JhbmQpCi0JCXJldHVybiAwOwotCi0JYWN0aXZlX2R3ZWxsID0gaXdsX2xlZ2FjeV9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgbl9wcm9iZXMpOwotCXBhc3NpdmVfZHdlbGwgPSBpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgdmlmKTsKLQotCWlmIChwYXNzaXZlX2R3ZWxsIDw9IGFjdGl2ZV9kd2VsbCkKLQkJcGFzc2l2ZV9kd2VsbCA9IGFjdGl2ZV9kd2VsbCArIDE7Ci0KLQlmb3IgKGkgPSAwLCBhZGRlZCA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fY2hhbm5lbHM7IGkrKykgewotCQljaGFuID0gcHJpdi0+c2Nhbl9yZXF1ZXN0LT5jaGFubmVsc1tpXTsKLQotCQlpZiAoY2hhbi0+YmFuZCAhPSBiYW5kKQotCQkJY29udGludWU7Ci0KLQkJc2Nhbl9jaC0+Y2hhbm5lbCA9IGNoYW4tPmh3X3ZhbHVlOwotCi0JCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgYmFuZCwKLQkJCQkJCQlzY2FuX2NoLT5jaGFubmVsKTsKLQkJaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkJIkNoYW5uZWwgJWQgaXMgSU5WQUxJRCBmb3IgdGhpcyBiYW5kLlxuIiwKLQkJCSAgICAgICBzY2FuX2NoLT5jaGFubmVsKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYoYWN0aXZlX2R3ZWxsKTsKLQkJc2Nhbl9jaC0+cGFzc2l2ZV9kd2VsbCA9IGNwdV90b19sZTE2KHBhc3NpdmVfZHdlbGwpOwotCQkvKiBJZiBwYXNzaXZlICwgc2V0IHVwIGZvciBhdXRvLXN3aXRjaAotCQkgKiAgYW5kIHVzZSBsb25nIGFjdGl2ZV9kd2VsbCB0aW1lLgotCQkgKi8KLQkJaWYgKCFpc19hY3RpdmUgfHwgaXdsX2xlZ2FjeV9pc19jaGFubmVsX3Bhc3NpdmUoY2hfaW5mbykgfHwKLQkJICAgIChjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikpIHsKLQkJCXNjYW5fY2gtPnR5cGUgPSAwOwkvKiBwYXNzaXZlICovCi0JCQlpZiAoSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpID09IDEpCi0JCQkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYocGFzc2l2ZV9kd2VsbCAtIDEpOwotCQl9IGVsc2UgewotCQkJc2Nhbl9jaC0+dHlwZSA9IDE7CS8qIGFjdGl2ZSAqLwotCQl9Ci0KLQkJLyogU2V0IGRpcmVjdCBwcm9iZSBiaXRzLiBUaGVzZSBtYXkgYmUgdXNlZCBib3RoIGZvciBhY3RpdmUKLQkJICogc2NhbiBjaGFubmVscyAocHJvYmVzIGdldHMgc2VudCByaWdodCBhd2F5KSwKLQkJICogb3IgZm9yIHBhc3NpdmUgY2hhbm5lbHMgKHByb2JlcyBnZXQgc2Ugc2VudCBvbmx5IGFmdGVyCi0JCSAqIGhlYXJpbmcgY2xlYXIgUnggcGFja2V0KS4qLwotCQlpZiAoSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpID49IDIpIHsKLQkJCWlmIChuX3Byb2JlcykKLQkJCQlzY2FuX2NoLT50eXBlIHw9IElXTDM5X1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiB1Q29kZSB2MSBkb2VzIG5vdCBhbGxvdyBzZXR0aW5nIGRpcmVjdCBwcm9iZSBiaXRzIG9uCi0JCQkgKiBwYXNzaXZlIGNoYW5uZWwuICovCi0JCQlpZiAoKHNjYW5fY2gtPnR5cGUgJiAxKSAmJiBuX3Byb2JlcykKLQkJCQlzY2FuX2NoLT50eXBlIHw9IElXTDM5X1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7Ci0JCX0KLQotCQkvKiBTZXQgdHhwb3dlciBsZXZlbHMgdG8gZGVmYXVsdHMgKi8KLQkJc2Nhbl9jaC0+dHBjLmRzcF9hdHRlbiA9IDExMDsKLQkJLyogc2Nhbl9wd3JfaW5mby0+dHBjLmRzcF9hdHRlbjsgKi8KLQotCQkvKnNjYW5fcHdyX2luZm8tPnRwYy50eF9nYWluOyAqLwotCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJc2Nhbl9jaC0+dHBjLnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMyA8PCAzKSkgfCAzOwotCQllbHNlIHsKLQkJCXNjYW5fY2gtPnRwYy50eF9nYWluID0gKCgxIDw8IDUpIHwgKDUgPDwgMykpOwotCQkJLyogTk9URTogaWYgd2Ugd2VyZSBkb2luZyA2TWIgT0ZETSBmb3Igc2NhbnMgd2UnZCB1c2UKLQkJCSAqIHBvd2VyIGxldmVsOgotCQkJICogc2Nhbl9jaC0+dHBjLnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMiA8PCAzKSkgfCAzOwotCQkJICovCi0JCX0KLQotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2Nhbm5pbmcgJWQgWyVzICVkXVxuIiwKLQkJCSAgICAgICBzY2FuX2NoLT5jaGFubmVsLAotCQkJICAgICAgIChzY2FuX2NoLT50eXBlICYgMSkgPyAiQUNUSVZFIiA6ICJQQVNTSVZFIiwKLQkJCSAgICAgICAoc2Nhbl9jaC0+dHlwZSAmIDEpID8KLQkJCSAgICAgICBhY3RpdmVfZHdlbGwgOiBwYXNzaXZlX2R3ZWxsKTsKLQotCQlzY2FuX2NoKys7Ci0JCWFkZGVkKys7Ci0JfQotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgInRvdGFsIGNoYW5uZWxzIHRvIHNjYW4gJWRcbiIsIGFkZGVkKTsKLQlyZXR1cm4gYWRkZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfaW5pdF9od19yYXRlcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGVzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UX0xFR0FDWTsgaSsrKSB7Ci0JCXJhdGVzW2ldLmJpdHJhdGUgPSBpd2wzOTQ1X3JhdGVzW2ldLmllZWUgKiA1OwotCQlyYXRlc1tpXS5od192YWx1ZSA9IGk7IC8qIFJhdGUgc2NhbGluZyB3aWxsIHdvcmsgb24gaW5kZXhlcyAqLwotCQlyYXRlc1tpXS5od192YWx1ZV9zaG9ydCA9IGk7Ci0JCXJhdGVzW2ldLmZsYWdzID0gMDsKLQkJaWYgKChpID4gSVdMMzlfTEFTVF9PRkRNX1JBVEUpIHx8IChpIDwgSVdMX0ZJUlNUX09GRE1fUkFURSkpIHsKLQkJCS8qCi0JCQkgKiBJZiBDQ0sgIT0gMU0gdGhlbiBzZXQgc2hvcnQgcHJlYW1ibGUgcmF0ZSBmbGFnLgotCQkJICovCi0JCQlyYXRlc1tpXS5mbGFncyB8PSAoaXdsMzk0NV9yYXRlc1tpXS5wbGNwID09IDEwKSA/Ci0JCQkJMCA6IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFOwotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogdUNvZGUgZG93bmxvYWQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9kZWFsbG9jX3Vjb2RlX3BjaShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaXdsX2xlZ2FjeV9mcmVlX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2NvZGUpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhKTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXApOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0KTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfaW5pdF9kYXRhKTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfYm9vdCk7Ci19Ci0KLS8qKgotICogaXdsMzk0NV92ZXJpZnlfaW5zdF9mdWxsIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKLSAqICAgICBsb29raW5nIGF0IGFsbCBkYXRhLgotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfdmVyaWZ5X2luc3RfZnVsbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIF9fbGUzMiAqaW1hZ2UsIHUzMiBsZW4pCi17Ci0JdTMyIHZhbDsKLQl1MzIgc2F2ZV9sZW4gPSBsZW47Ci0JaW50IHJjID0gMDsKLQl1MzIgZXJyY250OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwKLQkJCSAgICAgICBJV0wzOV9SVENfSU5TVF9MT1dFUl9CT1VORCk7Ci0KLQllcnJjbnQgPSAwOwotCWZvciAoOyBsZW4gPiAwOyBsZW4gLT0gc2l6ZW9mKHUzMiksIGltYWdlKyspIHsKLQkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCi0JCS8qIE5PVEU6IFVzZSB0aGUgZGVidWdsZXNzIHJlYWQgc28gd2UgZG9uJ3QgZmxvb2Qga2VybmVsIGxvZwotCQkgKiBpZiBJV0xfRExfSU8gaXMgc2V0ICovCi0JCXZhbCA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SREFUKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJ1Q29kZSBJTlNUIHNlY3Rpb24gaXMgaW52YWxpZCBhdCAiCi0JCQkJICAib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAotCQkJCSAgc2F2ZV9sZW4gLSBsZW4sIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7Ci0JCQlyYyA9IC1FSU87Ci0JCQllcnJjbnQrKzsKLQkJCWlmIChlcnJjbnQgPj0gMjApCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQotCWlmICghZXJyY250KQotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJInVjb2RlIGltYWdlIGluIElOU1RSVUNUSU9OIG1lbW9yeSBpcyBnb29kXG4iKTsKLQotCXJldHVybiByYzsKLX0KLQotCi0vKioKLSAqIGl3bDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKLSAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKLSAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3ZlcmlmeV9pbnN0X3NwYXJzZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIF9fbGUzMiAqaW1hZ2UsIHUzMiBsZW4pCi17Ci0JdTMyIHZhbDsKLQlpbnQgcmMgPSAwOwotCXUzMiBlcnJjbnQgPSAwOwotCXUzMiBpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTAwLCBpbWFnZSArPSAxMDAvc2l6ZW9mKHUzMikpIHsKLQkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCi0JCS8qIE5PVEU6IFVzZSB0aGUgZGVidWdsZXNzIHJlYWQgc28gd2UgZG9uJ3QgZmxvb2Qga2VybmVsIGxvZwotCQkgKiBpZiBJV0xfRExfSU8gaXMgc2V0ICovCi0JCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwKLQkJCWkgKyBJV0wzOV9SVENfSU5TVF9MT1dFUl9CT1VORCk7Ci0JCXZhbCA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SREFUKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0jaWYgMCAvKiBFbmFibGUgdGhpcyBpZiB5b3Ugd2FudCB0byBzZWUgZGV0YWlscyAqLwotCQkJSVdMX0VSUihwcml2LCAidUNvZGUgSU5TVCBzZWN0aW9uIGlzIGludmFsaWQgYXQgIgotCQkJCSAgIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwKLQkJCQkgIGksIHZhbCwgKmltYWdlKTsKLSNlbmRpZgotCQkJcmMgPSAtRUlPOwotCQkJZXJyY250Kys7Ci0JCQlpZiAoZXJyY250ID49IDMpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotLyoqCi0gKiBpd2wzOTQ1X3ZlcmlmeV91Y29kZSAtIGRldGVybWluZSB3aGljaCBpbnN0cnVjdGlvbiBpbWFnZSBpcyBpbiBTUkFNLAotICogICAgYW5kIHZlcmlmeSBpdHMgY29udGVudHMKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JX19sZTMyICppbWFnZTsKLQl1MzIgbGVuOwotCWludCByYyA9IDA7Ci0KLQkvKiBUcnkgYm9vdHN0cmFwICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JcmMgPSBpd2wzOTQ1X3ZlcmlmeV9pbnN0X3NwYXJzZShwcml2LCBpbWFnZSwgbGVuKTsKLQlpZiAocmMgPT0gMCkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQm9vdHN0cmFwIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVHJ5IGluaXRpYWxpemUgKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9pbml0LnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9pbml0LmxlbjsKLQlyYyA9IGl3bDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOwotCWlmIChyYyA9PSAwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXplIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVHJ5IHJ1bnRpbWUvcHJvdG9jb2wgKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9jb2RlLnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9jb2RlLmxlbjsKLQlyYyA9IGl3bDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOwotCWlmIChyYyA9PSAwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0VSUihwcml2LCAiTk8gVkFMSUQgVUNPREUgSU1BR0UgSU4gSU5TVFJVQ1RJT04gU1JBTSEhXG4iKTsKLQotCS8qIFNpbmNlIG5vdGhpbmcgc2VlbXMgdG8gbWF0Y2gsIHNob3cgZmlyc3Qgc2V2ZXJhbCBkYXRhIGVudHJpZXMgaW4KLQkgKiBpbnN0cnVjdGlvbiBTUkFNLCBzbyBtYXliZSB2aXN1YWwgaW5zcGVjdGlvbiB3aWxsIGdpdmUgYSBjbHVlLgotCSAqIFNlbGVjdGlvbiBvZiBib290c3RyYXAgaW1hZ2UgKHZzLiBvdGhlciBpbWFnZXMpIGlzIGFyYml0cmFyeS4gKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9ib290LmxlbjsKLQlyYyA9IGl3bDM5NDVfdmVyaWZ5X2luc3RfZnVsbChwcml2LCBpbWFnZSwgbGVuKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9uaWNfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIFJlbW92ZSBhbGwgcmVzZXRzIHRvIGFsbG93IE5JQyB0byBvcGVyYXRlICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCAwKTsKLX0KLQotI2RlZmluZSBJV0wzOTQ1X1VDT0RFX0dFVChpdGVtKQkJCQkJCVwKLXN0YXRpYyB1MzIgaXdsMzk0NV91Y29kZV9nZXRfIyNpdGVtKGNvbnN0IHN0cnVjdCBpd2xfdWNvZGVfaGVhZGVyICp1Y29kZSlcCi17CQkJCQkJCQkJXAotCXJldHVybiBsZTMyX3RvX2NwdSh1Y29kZS0+djEuaXRlbSk7CQkJCVwKLX0KLQotc3RhdGljIHUzMiBpd2wzOTQ1X3Vjb2RlX2dldF9oZWFkZXJfc2l6ZSh1MzIgYXBpX3ZlcikKLXsKLQlyZXR1cm4gMjQ7Ci19Ci0KLXN0YXRpYyB1OCAqaXdsMzk0NV91Y29kZV9nZXRfZGF0YShjb25zdCBzdHJ1Y3QgaXdsX3Vjb2RlX2hlYWRlciAqdWNvZGUpCi17Ci0JcmV0dXJuICh1OCAqKSB1Y29kZS0+djEuZGF0YTsKLX0KLQotSVdMMzk0NV9VQ09ERV9HRVQoaW5zdF9zaXplKTsKLUlXTDM5NDVfVUNPREVfR0VUKGRhdGFfc2l6ZSk7Ci1JV0wzOTQ1X1VDT0RFX0dFVChpbml0X3NpemUpOwotSVdMMzk0NV9VQ09ERV9HRVQoaW5pdF9kYXRhX3NpemUpOwotSVdMMzk0NV9VQ09ERV9HRVQoYm9vdF9zaXplKTsKLQotLyoqCi0gKiBpd2wzOTQ1X3JlYWRfdWNvZGUgLSBSZWFkIHVDb2RlIGltYWdlcyBmcm9tIGRpc2sgZmlsZS4KLSAqCi0gKiBDb3B5IGludG8gYnVmZmVycyBmb3IgY2FyZCB0byBmZXRjaCB2aWEgYnVzLW1hc3RlcmluZwotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfcmVhZF91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JY29uc3Qgc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgKnVjb2RlOwotCWludCByZXQgPSAtRUlOVkFMLCBpbmRleDsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3JhdzsKLQkvKiBmaXJtd2FyZSBmaWxlIG5hbWUgY29udGFpbnMgdUNvZGUvZHJpdmVyIGNvbXBhdGliaWxpdHkgdmVyc2lvbiAqLwotCWNvbnN0IGNoYXIgKm5hbWVfcHJlID0gcHJpdi0+Y2ZnLT5md19uYW1lX3ByZTsKLQljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21heCA9IHByaXYtPmNmZy0+dWNvZGVfYXBpX21heDsKLQljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21pbiA9IHByaXYtPmNmZy0+dWNvZGVfYXBpX21pbjsKLQljaGFyIGJ1ZlsyNV07Ci0JdTggKnNyYzsKLQlzaXplX3QgbGVuOwotCXUzMiBhcGlfdmVyLCBpbnN0X3NpemUsIGRhdGFfc2l6ZSwgaW5pdF9zaXplLCBpbml0X2RhdGFfc2l6ZSwgYm9vdF9zaXplOwotCi0JLyogQXNrIGtlcm5lbCBmaXJtd2FyZV9jbGFzcyBtb2R1bGUgdG8gZ2V0IHRoZSBib290IGZpcm13YXJlIG9mZiBkaXNrLgotCSAqIHJlcXVlc3RfZmlybXdhcmUoKSBpcyBzeW5jaHJvbm91cywgZmlsZSBpcyBpbiBtZW1vcnkgb24gcmV0dXJuLiAqLwotCWZvciAoaW5kZXggPSBhcGlfbWF4OyBpbmRleCA+PSBhcGlfbWluOyBpbmRleC0tKSB7Ci0JCXNwcmludGYoYnVmLCAiJXMldSVzIiwgbmFtZV9wcmUsIGluZGV4LCAiLnVjb2RlIik7Ci0JCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJnVjb2RlX3JhdywgYnVmLCAmcHJpdi0+cGNpX2Rldi0+ZGV2KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCUlXTF9FUlIocHJpdiwgIiVzIGZpcm13YXJlIGZpbGUgcmVxIGZhaWxlZDogJWRcbiIsCi0JCQkJICBidWYsIHJldCk7Ci0JCQlpZiAocmV0ID09IC1FTk9FTlQpCi0JCQkJY29udGludWU7Ci0JCQllbHNlCi0JCQkJZ290byBlcnJvcjsKLQkJfSBlbHNlIHsKLQkJCWlmIChpbmRleCA8IGFwaV9tYXgpCi0JCQkJSVdMX0VSUihwcml2LCAiTG9hZGVkIGZpcm13YXJlICVzLCAiCi0JCQkJCSJ3aGljaCBpcyBkZXByZWNhdGVkLiAiCi0JCQkJCSIgUGxlYXNlIHVzZSBBUEkgdiV1IGluc3RlYWQuXG4iLAotCQkJCQkgIGJ1ZiwgYXBpX21heCk7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiR290IGZpcm13YXJlICclcycgZmlsZSAiCi0JCQkJICAgICAgICIoJXpkIGJ5dGVzKSBmcm9tIGRpc2tcbiIsCi0JCQkJICAgICAgIGJ1ZiwgdWNvZGVfcmF3LT5zaXplKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBnb3QgYXQgbGVhc3Qgb3VyIGhlYWRlciEgKi8KLQlpZiAodWNvZGVfcmF3LT5zaXplIDwgIGl3bDM5NDVfdWNvZGVfZ2V0X2hlYWRlcl9zaXplKDEpKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZpbGUgc2l6ZSB3YXkgdG9vIHNtYWxsIVxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JlbGVhc2U7Ci0JfQotCi0JLyogRGF0YSBmcm9tIHVjb2RlIGZpbGU6ICBoZWFkZXIgZm9sbG93ZWQgYnkgdUNvZGUgaW1hZ2VzICovCi0JdWNvZGUgPSAoc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgKil1Y29kZV9yYXctPmRhdGE7Ci0KLQlwcml2LT51Y29kZV92ZXIgPSBsZTMyX3RvX2NwdSh1Y29kZS0+dmVyKTsKLQlhcGlfdmVyID0gSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpOwotCWluc3Rfc2l6ZSA9IGl3bDM5NDVfdWNvZGVfZ2V0X2luc3Rfc2l6ZSh1Y29kZSk7Ci0JZGF0YV9zaXplID0gaXdsMzk0NV91Y29kZV9nZXRfZGF0YV9zaXplKHVjb2RlKTsKLQlpbml0X3NpemUgPSBpd2wzOTQ1X3Vjb2RlX2dldF9pbml0X3NpemUodWNvZGUpOwotCWluaXRfZGF0YV9zaXplID0gaXdsMzk0NV91Y29kZV9nZXRfaW5pdF9kYXRhX3NpemUodWNvZGUpOwotCWJvb3Rfc2l6ZSA9IGl3bDM5NDVfdWNvZGVfZ2V0X2Jvb3Rfc2l6ZSh1Y29kZSk7Ci0Jc3JjID0gaXdsMzk0NV91Y29kZV9nZXRfZGF0YSh1Y29kZSk7Ci0KLQkvKiBhcGlfdmVyIHNob3VsZCBtYXRjaCB0aGUgYXBpIHZlcnNpb24gZm9ybWluZyBwYXJ0IG9mIHRoZQotCSAqIGZpcm13YXJlIGZpbGVuYW1lIC4uLiBidXQgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoYXQgYW5kIG9ubHkgcmVseQotCSAqIG9uIHRoZSBBUEkgdmVyc2lvbiByZWFkIGZyb20gZmlybXdhcmUgaGVhZGVyIGZyb20gaGVyZSBvbiBmb3J3YXJkICovCi0KLQlpZiAoYXBpX3ZlciA8IGFwaV9taW4gfHwgYXBpX3ZlciA+IGFwaV9tYXgpIHsKLQkJSVdMX0VSUihwcml2LCAiRHJpdmVyIHVuYWJsZSB0byBzdXBwb3J0IHlvdXIgZmlybXdhcmUgQVBJLiAiCi0JCQkgICJEcml2ZXIgc3VwcG9ydHMgdiV1LCBmaXJtd2FyZSBpcyB2JXUuXG4iLAotCQkJICBhcGlfbWF4LCBhcGlfdmVyKTsKLQkJcHJpdi0+dWNvZGVfdmVyID0gMDsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0JaWYgKGFwaV92ZXIgIT0gYXBpX21heCkKLQkJSVdMX0VSUihwcml2LCAiRmlybXdhcmUgaGFzIG9sZCBBUEkgdmVyc2lvbi4gRXhwZWN0ZWQgJXUsICIKLQkJCSAgImdvdCAldS4gTmV3IGZpcm13YXJlIGNhbiBiZSBvYnRhaW5lZCAiCi0JCQkgICJmcm9tIGh0dHA6Ly93d3cuaW50ZWxsaW51eHdpcmVsZXNzLm9yZy5cbiIsCi0JCQkgIGFwaV9tYXgsIGFwaV92ZXIpOwotCi0JSVdMX0lORk8ocHJpdiwgImxvYWRlZCBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1LiV1XG4iLAotCQlJV0xfVUNPREVfTUFKT1IocHJpdi0+dWNvZGVfdmVyKSwKLQkJSVdMX1VDT0RFX01JTk9SKHByaXYtPnVjb2RlX3ZlciksCi0JCUlXTF9VQ09ERV9BUEkocHJpdi0+dWNvZGVfdmVyKSwKLQkJSVdMX1VDT0RFX1NFUklBTChwcml2LT51Y29kZV92ZXIpKTsKLQotCXNucHJpbnRmKHByaXYtPmh3LT53aXBoeS0+ZndfdmVyc2lvbiwKLQkJIHNpemVvZihwcml2LT5ody0+d2lwaHktPmZ3X3ZlcnNpb24pLAotCQkgIiV1LiV1LiV1LiV1IiwKLQkJIElXTF9VQ09ERV9NQUpPUihwcml2LT51Y29kZV92ZXIpLAotCQkgSVdMX1VDT0RFX01JTk9SKHByaXYtPnVjb2RlX3ZlciksCi0JCSBJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3ZlciksCi0JCSBJV0xfVUNPREVfU0VSSUFMKHByaXYtPnVjb2RlX3ZlcikpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciB1Y29kZSB2ZXJzaW9uIHJhdyA9IDB4JXhcbiIsCi0JCSAgICAgICBwcml2LT51Y29kZV92ZXIpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgcnVudGltZSBpbnN0IHNpemUgPSAldVxuIiwKLQkJICAgICAgIGluc3Rfc2l6ZSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGRhdGEgc2l6ZSA9ICV1XG4iLAotCQkgICAgICAgZGF0YV9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIGluaXQgaW5zdCBzaXplID0gJXVcbiIsCi0JCSAgICAgICBpbml0X3NpemUpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgaW5pdCBkYXRhIHNpemUgPSAldVxuIiwKLQkJICAgICAgIGluaXRfZGF0YV9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIGJvb3QgaW5zdCBzaXplID0gJXVcbiIsCi0JCSAgICAgICBib290X3NpemUpOwotCi0KLQkvKiBWZXJpZnkgc2l6ZSBvZiBmaWxlIHZzLiBpbWFnZSBzaXplIGluZm8gaW4gZmlsZSdzIGhlYWRlciAqLwotCWlmICh1Y29kZV9yYXctPnNpemUgIT0gaXdsMzk0NV91Y29kZV9nZXRfaGVhZGVyX3NpemUoYXBpX3ZlcikgKwotCQlpbnN0X3NpemUgKyBkYXRhX3NpemUgKyBpbml0X3NpemUgKwotCQlpbml0X2RhdGFfc2l6ZSArIGJvb3Rfc2l6ZSkgewotCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkidUNvZGUgZmlsZSBzaXplICV6ZCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBzaXplXG4iLAotCQkJdWNvZGVfcmF3LT5zaXplKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0KLQkvKiBWZXJpZnkgdGhhdCB1Q29kZSBpbWFnZXMgd2lsbCBmaXQgaW4gY2FyZCdzIFNSQU0gKi8KLQlpZiAoaW5zdF9zaXplID4gSVdMMzlfTUFYX0lOU1RfU0laRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidUNvZGUgaW5zdHIgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQkgICAgICAgaW5zdF9zaXplKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0KLQlpZiAoZGF0YV9zaXplID4gSVdMMzlfTUFYX0RBVEFfU0laRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidUNvZGUgZGF0YSBsZW4gJWQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKLQkJCSAgICAgICBkYXRhX3NpemUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZWxlYXNlOwotCX0KLQlpZiAoaW5pdF9zaXplID4gSVdMMzlfTUFYX0lOU1RfU0laRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJ1Q29kZSBpbml0IGluc3RyIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJCWluaXRfc2l6ZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JlbGVhc2U7Ci0JfQotCWlmIChpbml0X2RhdGFfc2l6ZSA+IElXTDM5X01BWF9EQVRBX1NJWkUpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkidUNvZGUgaW5pdCBkYXRhIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJCWluaXRfZGF0YV9zaXplKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0JaWYgKGJvb3Rfc2l6ZSA+IElXTDM5X01BWF9CU01fU0laRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJ1Q29kZSBib290IGluc3RyIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJCWJvb3Rfc2l6ZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JlbGVhc2U7Ci0JfQotCi0JLyogQWxsb2NhdGUgdWNvZGUgYnVmZmVycyBmb3IgY2FyZCdzIGJ1cy1tYXN0ZXIgbG9hZGluZyAuLi4gKi8KLQotCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIGFuZCAyIGNvcGllcyBvZiBkYXRhOgotCSAqIDEpIHVubW9kaWZpZWQgZnJvbSBkaXNrCi0JICogMikgYmFja3VwIGNhY2hlIGZvciBzYXZlL3Jlc3RvcmUgZHVyaW5nIHBvd2VyLWRvd25zICovCi0JcHJpdi0+dWNvZGVfY29kZS5sZW4gPSBpbnN0X3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9jb2RlKTsKLQotCXByaXYtPnVjb2RlX2RhdGEubGVuID0gZGF0YV9zaXplOwotCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfZGF0YSk7Ci0KLQlwcml2LT51Y29kZV9kYXRhX2JhY2t1cC5sZW4gPSBkYXRhX3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhX2JhY2t1cCk7Ci0KLQlpZiAoIXByaXYtPnVjb2RlX2NvZGUudl9hZGRyIHx8ICFwcml2LT51Y29kZV9kYXRhLnZfYWRkciB8fAotCSAgICAhcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyKQotCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0KLQkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgKi8KLQlpZiAoaW5pdF9zaXplICYmIGluaXRfZGF0YV9zaXplKSB7Ci0JCXByaXYtPnVjb2RlX2luaXQubGVuID0gaW5pdF9zaXplOwotCQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2luaXQpOwotCi0JCXByaXYtPnVjb2RlX2luaXRfZGF0YS5sZW4gPSBpbml0X2RhdGFfc2l6ZTsKLQkJaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0X2RhdGEpOwotCi0JCWlmICghcHJpdi0+dWNvZGVfaW5pdC52X2FkZHIgfHwgIXByaXYtPnVjb2RlX2luaXRfZGF0YS52X2FkZHIpCi0JCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0JfQotCi0JLyogQm9vdHN0cmFwIChpbnN0cnVjdGlvbnMgb25seSwgbm8gZGF0YSkgKi8KLQlpZiAoYm9vdF9zaXplKSB7Ci0JCXByaXYtPnVjb2RlX2Jvb3QubGVuID0gYm9vdF9zaXplOwotCQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2Jvb3QpOwotCi0JCWlmICghcHJpdi0+dWNvZGVfYm9vdC52X2FkZHIpCi0JCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0JfQotCi0JLyogQ29weSBpbWFnZXMgaW50byBidWZmZXJzIGZvciBjYXJkJ3MgYnVzLW1hc3RlciByZWFkcyAuLi4gKi8KLQotCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIChmaXJzdCBibG9jayBvZiBkYXRhIGluIGZpbGUpICovCi0JbGVuID0gaW5zdF9zaXplOwotCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCSJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGluc3RyIGxlbiAlemRcbiIsIGxlbik7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2NvZGUudl9hZGRyLCBzcmMsIGxlbik7Ci0Jc3JjICs9IGxlbjsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Q29kZSBpbnN0ciBidWYgdmFkZHIgPSAweCVwLCBwYWRkciA9IDB4JTA4eFxuIiwKLQkJcHJpdi0+dWNvZGVfY29kZS52X2FkZHIsICh1MzIpcHJpdi0+dWNvZGVfY29kZS5wX2FkZHIpOwotCi0JLyogUnVudGltZSBkYXRhICgybmQgYmxvY2spCi0JICogTk9URTogIENvcHkgaW50byBiYWNrdXAgYnVmZmVyIHdpbGwgYmUgZG9uZSBpbiBpd2wzOTQ1X3VwKCkgICovCi0JbGVuID0gZGF0YV9zaXplOwotCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCSJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGRhdGEgbGVuICV6ZFxuIiwgbGVuKTsKLQltZW1jcHkocHJpdi0+dWNvZGVfZGF0YS52X2FkZHIsIHNyYywgbGVuKTsKLQltZW1jcHkocHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyLCBzcmMsIGxlbik7Ci0Jc3JjICs9IGxlbjsKLQotCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyAoM3JkIGJsb2NrKSAqLwotCWlmIChpbml0X3NpemUpIHsKLQkJbGVuID0gaW5pdF9zaXplOwotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBpbnN0ciBsZW4gJXpkXG4iLCBsZW4pOwotCQltZW1jcHkocHJpdi0+dWNvZGVfaW5pdC52X2FkZHIsIHNyYywgbGVuKTsKLQkJc3JjICs9IGxlbjsKLQl9Ci0KLQkvKiBJbml0aWFsaXphdGlvbiBkYXRhICg0dGggYmxvY2spICovCi0JaWYgKGluaXRfZGF0YV9zaXplKSB7Ci0JCWxlbiA9IGluaXRfZGF0YV9zaXplOwotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBkYXRhIGxlbiAlemRcbiIsIGxlbik7Ci0JCW1lbWNweShwcml2LT51Y29kZV9pbml0X2RhdGEudl9hZGRyLCBzcmMsIGxlbik7Ci0JCXNyYyArPSBsZW47Ci0JfQotCi0JLyogQm9vdHN0cmFwIGluc3RydWN0aW9ucyAoNXRoIGJsb2NrKSAqLwotCWxlbiA9IGJvb3Rfc2l6ZTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBib290IGluc3RyIGxlbiAlemRcbiIsIGxlbik7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2Jvb3Qudl9hZGRyLCBzcmMsIGxlbik7Ci0KLQkvKiBXZSBoYXZlIG91ciBjb3BpZXMgbm93LCBhbGxvdyBPUyByZWxlYXNlIGl0cyBjb3BpZXMgKi8KLQlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlX3Jhdyk7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJfcGNpX2FsbG9jOgotCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKLQlyZXQgPSAtRU5PTUVNOwotCWl3bDM5NDVfZGVhbGxvY191Y29kZV9wY2kocHJpdik7Ci0KLSBlcnJfcmVsZWFzZToKLQlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlX3Jhdyk7Ci0KLSBlcnJvcjoKLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qKgotICogaXdsMzk0NV9zZXRfdWNvZGVfcHRycyAtIFNldCB1Q29kZSBhZGRyZXNzIGxvY2F0aW9uCi0gKgotICogVGVsbCBpbml0aWFsaXphdGlvbiB1Q29kZSB3aGVyZSB0byBmaW5kIHJ1bnRpbWUgdUNvZGUuCi0gKgotICogQlNNIHJlZ2lzdGVycyBpbml0aWFsbHkgY29udGFpbiBwb2ludGVycyB0byBpbml0aWFsaXphdGlvbiB1Q29kZS4KLSAqIFdlIG5lZWQgdG8gcmVwbGFjZSB0aGVtIHRvIGxvYWQgcnVudGltZSB1Q29kZSBpbnN0IGFuZCBkYXRhLAotICogYW5kIHRvIHNhdmUgcnVudGltZSBkYXRhIHdoZW4gcG93ZXJpbmcgZG93bi4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3NldF91Y29kZV9wdHJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlkbWFfYWRkcl90IHBpbnN0OwotCWRtYV9hZGRyX3QgcGRhdGE7Ci0KLQkvKiBiaXRzIDMxOjAgZm9yIDM5NDUgKi8KLQlwaW5zdCA9IHByaXYtPnVjb2RlX2NvZGUucF9hZGRyOwotCXBkYXRhID0gcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAucF9hZGRyOwotCi0JLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCBpbWFnZSB0byBsb2FkICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0lOU1RfUFRSX1JFRywgcGluc3QpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9EQVRBX1BUUl9SRUcsIHBkYXRhKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLAotCQkJCSBwcml2LT51Y29kZV9kYXRhLmxlbik7Ci0KLQkvKiBJbnN0IGJ5dGUgY291bnQgbXVzdCBiZSBsYXN0IHRvIHNldCB1cCwgYml0IDMxIHNpZ25hbHMgdUNvZGUKLQkgKiAgIHRoYXQgYWxsIG5ldyBwdHIvc2l6ZSBpbmZvIGlzIGluIHBsYWNlICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0lOU1RfQllURUNPVU5UX1JFRywKLQkJCQkgcHJpdi0+dWNvZGVfY29kZS5sZW4gfCBCU01fRFJBTV9JTlNUX0xPQUQpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJ1bnRpbWUgdUNvZGUgcG9pbnRlcnMgYXJlIHNldC5cbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9pbml0X2FsaXZlX3N0YXJ0IC0gQ2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZAotICoKLSAqIENhbGxlZCBhZnRlciBSRVBMWV9BTElWRSBub3RpZmljYXRpb24gcmVjZWl2ZWQgZnJvbSAiaW5pdGlhbGl6ZSIgdUNvZGUuCi0gKgotICogVGVsbCAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gZ28gYWhlYWQgYW5kIGxvYWQgdGhlIHJ1bnRpbWUgdUNvZGUuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfaW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogQ2hlY2sgYWxpdmUgcmVzcG9uc2UgZm9yICJ2YWxpZCIgc2lnbiBmcm9tIHVDb2RlICovCi0JaWYgKHByaXYtPmNhcmRfYWxpdmVfaW5pdC5pc192YWxpZCAhPSBVQ09ERV9WQUxJRF9PSykgewotCQkvKiBXZSBoYWQgYW4gZXJyb3IgYnJpbmdpbmcgdXAgdGhlIGhhcmR3YXJlLCBzbyB0YWtlIGl0Ci0JCSAqIGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXplIEFsaXZlIGZhaWxlZC5cbiIpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCi0JLyogQm9vdHN0cmFwIHVDb2RlIGhhcyBsb2FkZWQgaW5pdGlhbGl6ZSB1Q29kZSAuLi4gdmVyaWZ5IGluc3QgaW1hZ2UuCi0JICogVGhpcyBpcyBhIHBhcmFub2lkIGNoZWNrLCBiZWNhdXNlIHdlIHdvdWxkIG5vdCBoYXZlIGdvdHRlbiB0aGUKLQkgKiAiaW5pdGlhbGl6ZSIgYWxpdmUgaWYgY29kZSB3ZXJlbid0IHByb3Blcmx5IGxvYWRlZC4gICovCi0JaWYgKGl3bDM5NDVfdmVyaWZ5X3Vjb2RlKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3YXMgYmFkOwotCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJCYWQgXCJpbml0aWFsaXplXCIgdUNvZGUgbG9hZC5cbiIpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCi0JLyogU2VuZCBwb2ludGVycyB0byBwcm90b2NvbC9ydW50aW1lIHVDb2RlIGltYWdlIC4uLiBpbml0IGNvZGUgd2lsbAotCSAqIGxvYWQgYW5kIGxhdW5jaCBydW50aW1lIHVDb2RlLCB3aGljaCB3aWxsIHNlbmQgdXMgYW5vdGhlciAiQWxpdmUiCi0JICogbm90aWZpY2F0aW9uLiAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCWlmIChpd2wzOTQ1X3NldF91Y29kZV9wdHJzKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3b24ndCBoYXBwZW47Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNvdWxkbid0IHNldCB1cCB1Q29kZSBwb2ludGVycy5cbiIpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCXJldHVybjsKLQotIHJlc3RhcnQ6Ci0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXN0YXJ0KTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2FsaXZlX3N0YXJ0IC0gY2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZAotICogICAgICAgICAgICAgICAgICAgZnJvbSBwcm90b2NvbC9ydW50aW1lIHVDb2RlIChpbml0aWFsaXphdGlvbiB1Q29kZSdzCi0gKiAgICAgICAgICAgICAgICAgICBBbGl2ZSBnZXRzIGhhbmRsZWQgYnkgaXdsMzk0NV9pbml0X2FsaXZlX3N0YXJ0KCkpLgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgdGhlcm1hbF9zcGluID0gMDsKLQl1MzIgcmZraWxsOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUnVudGltZSBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCi0JaWYgKHByaXYtPmNhcmRfYWxpdmUuaXNfdmFsaWQgIT0gVUNPREVfVkFMSURfT0spIHsKLQkJLyogV2UgaGFkIGFuIGVycm9yIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSwgc28gdGFrZSBpdAotCQkgKiBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLwotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQWxpdmUgZmFpbGVkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHVDb2RlIGhhcyBsb2FkZWQgUnVudGltZSB1Q29kZSAuLi4gdmVyaWZ5IGluc3QgaW1hZ2UuCi0JICogVGhpcyBpcyBhIHBhcmFub2lkIGNoZWNrLCBiZWNhdXNlIHdlIHdvdWxkIG5vdCBoYXZlIGdvdHRlbiB0aGUKLQkgKiAicnVudGltZSIgYWxpdmUgaWYgY29kZSB3ZXJlbid0IHByb3Blcmx5IGxvYWRlZC4gICovCi0JaWYgKGl3bDM5NDVfdmVyaWZ5X3Vjb2RlKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3YXMgYmFkOwotCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJCYWQgcnVudGltZSB1Q29kZSBsb2FkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQlyZmtpbGwgPSBpd2xfbGVnYWN5X3JlYWRfcHJwaChwcml2LCBBUE1HX1JGS0lMTF9SRUcpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJSRktJTEwgc3RhdHVzOiAweCV4XG4iLCByZmtpbGwpOwotCi0JaWYgKHJma2lsbCAmIDB4MSkgewotCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCQkvKiBpZiBSRktJTEwgaXMgbm90IG9uLCB0aGVuIHdhaXQgZm9yIHRoZXJtYWwKLQkJICogc2Vuc29yIGluIGFkYXB0ZXIgdG8ga2ljayBpbiAqLwotCQl3aGlsZSAoaXdsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUocHJpdikgPT0gMCkgewotCQkJdGhlcm1hbF9zcGluKys7Ci0JCQl1ZGVsYXkoMTApOwotCQl9Ci0KLQkJaWYgKHRoZXJtYWxfc3BpbikKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJUaGVybWFsIGNhbGlicmF0aW9uIHRvb2sgJWR1c1xuIiwKLQkJCQkgICAgICAgdGhlcm1hbF9zcGluICogMTApOwotCX0gZWxzZQotCQlzZXRfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIEFmdGVyIHRoZSBBTElWRSByZXNwb25zZSwgd2UgY2FuIHNlbmQgY29tbWFuZHMgdG8gMzk0NSB1Q29kZSAqLwotCXNldF9iaXQoU1RBVFVTX0FMSVZFLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIEVuYWJsZSB3YXRjaGRvZyB0byBtb25pdG9yIHRoZSBkcml2ZXIgdHggcXVldWVzICovCi0JaXdsX2xlZ2FjeV9zZXR1cF93YXRjaGRvZyhwcml2KTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX3Jma2lsbChwcml2KSkKLQkJcmV0dXJuOwotCi0JaWVlZTgwMjExX3dha2VfcXVldWVzKHByaXYtPmh3KTsKLQotCXByaXYtPmFjdGl2ZV9yYXRlID0gSVdMX1JBVEVTX01BU0tfMzk0NTsKLQotCWl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkKHByaXYsIElXTF9SWE9OX0NUWF9CU1MpKSB7Ci0JCXN0cnVjdCBpd2wzOTQ1X3J4b25fY21kICphY3RpdmVfcnhvbiA9Ci0JCQkJKHN0cnVjdCBpd2wzOTQ1X3J4b25fY21kICopKCZjdHgtPmFjdGl2ZSk7Ci0KLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQl9IGVsc2UgewotCQkvKiBJbml0aWFsaXplIG91ciByeF9jb25maWcgZGF0YSAqLwotCQlpd2xfbGVnYWN5X2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcocHJpdiwgY3R4KTsKLQl9Ci0KLQkvKiBDb25maWd1cmUgQmx1ZXRvb3RoIGRldmljZSBjb2V4aXN0ZW5jZSBzdXBwb3J0ICovCi0JaXdsX2xlZ2FjeV9zZW5kX2J0X2NvbmZpZyhwcml2KTsKLQotCXNldF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIENvbmZpZ3VyZSB0aGUgYWRhcHRlciBmb3IgdW5hc3NvY2lhdGVkIG9wZXJhdGlvbiAqLwotCWl3bDM5NDVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCWl3bDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMocHJpdik7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQUxJVkUgcHJvY2Vzc2luZyBjb21wbGV0ZS5cbiIpOwotCXdha2VfdXAoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0KLQlyZXR1cm47Ci0KLSByZXN0YXJ0OgotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzdGFydCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotc3RhdGljIHZvaWQgX19pd2wzOTQ1X2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGV4aXRfcGVuZGluZzsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsIERSVl9OQU1FICIgaXMgZ29pbmcgZG93blxuIik7Ci0KLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQotCWV4aXRfcGVuZGluZyA9IHRlc3RfYW5kX3NldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBTdG9wIFRYIHF1ZXVlcyB3YXRjaGRvZy4gV2UgbmVlZCB0byBoYXZlIFNUQVRVU19FWElUX1BFTkRJTkcgYml0IHNldAotCSAqIHRvIHByZXZlbnQgcmVhcm0gdGltZXIgKi8KLQlkZWxfdGltZXJfc3luYygmcHJpdi0+d2F0Y2hkb2cpOwotCi0JLyogU3RhdGlvbiBpbmZvcm1hdGlvbiB3aWxsIG5vdyBiZSBjbGVhcmVkIGluIGRldmljZSAqLwotCWl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMocHJpdiwgTlVMTCk7Ci0JaXdsX2xlZ2FjeV9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHByaXYpOwotCWl3bF9sZWdhY3lfY2xlYXJfZHJpdmVyX3N0YXRpb25zKHByaXYpOwotCi0JLyogVW5ibG9jayBhbnkgd2FpdGluZyBjYWxscyAqLwotCXdha2VfdXBfYWxsKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotCi0JLyogV2lwZSBvdXQgdGhlIEVYSVRfUEVORElORyBzdGF0dXMgYml0IGlmIHdlIGFyZSBub3QgYWN0dWFsbHkKLQkgKiBleGl0aW5nIHRoZSBtb2R1bGUgKi8KLQlpZiAoIWV4aXRfcGVuZGluZykKLQkJY2xlYXJfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCi0JLyogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX05FVk9fUkVTRVQpOwotCi0JLyogdGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaXdsMzk0NV9zeW5jaHJvbml6ZV9pcnEocHJpdik7Ci0KLQlpZiAocHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKLQkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKLQotCS8qIElmIHdlIGhhdmUgbm90IHByZXZpb3VzbHkgY2FsbGVkIGl3bDM5NDVfaW5pdCgpIHRoZW4KLQkgKiBjbGVhciBhbGwgYml0cyBidXQgdGhlIFJGIEtpbGwgYml0cyBhbmQgcmV0dXJuICovCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2luaXQocHJpdikpIHsKLQkJcHJpdi0+c3RhdHVzID0gdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJCVNUQVRVU19SRl9LSUxMX0hXIHwKLQkJCSAgICAgICB0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJCVNUQVRVU19HRU9fQ09ORklHVVJFRCB8Ci0JCQkJdGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgPDwKLQkJCQkJU1RBVFVTX0VYSVRfUEVORElORzsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIC4uLm90aGVyd2lzZSBjbGVhciBvdXQgYWxsIHRoZSBzdGF0dXMgYml0cyBidXQgdGhlIFJGIEtpbGwKLQkgKiBiaXQgYW5kIGNvbnRpbnVlIHRha2luZyB0aGUgTklDIGRvd24uICovCi0JcHJpdi0+c3RhdHVzICY9IHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19SRl9LSUxMX0hXIHwKLQkJCXRlc3RfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cykgPDwKLQkJCQlTVEFUVVNfR0VPX0NPTkZJR1VSRUQgfAotCQkJdGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19GV19FUlJPUiB8Ci0JCQl0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19FWElUX1BFTkRJTkc7Ci0KLQlpd2wzOTQ1X2h3X3R4cV9jdHhfc3RvcChwcml2KTsKLQlpd2wzOTQ1X2h3X3J4cV9zdG9wKHByaXYpOwotCi0JLyogUG93ZXItZG93biBkZXZpY2UncyBidXNtYXN0ZXIgRE1BIGNsb2NrcyAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBUE1HX0NMS19ESVNfUkVHLCBBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOwotCXVkZWxheSg1KTsKLQotCS8qIFN0b3AgdGhlIGRldmljZSwgYW5kIHB1dCBpdCBpbiBsb3cgcG93ZXIgc3RhdGUgKi8KLQlpd2xfbGVnYWN5X2FwbV9zdG9wKHByaXYpOwotCi0gZXhpdDoKLQltZW1zZXQoJnByaXYtPmNhcmRfYWxpdmUsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3ApKTsKLQotCWlmIChwcml2LT5iZWFjb25fc2tiKQotCQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCXByaXYtPmJlYWNvbl9za2IgPSBOVUxMOwotCi0JLyogY2xlYXIgb3V0IGFueSBmcmVlIGZyYW1lcyAqLwotCWl3bDM5NDVfY2xlYXJfZnJlZV9mcmFtZXMocHJpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCV9faXdsMzk0NV9kb3duKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaXdsMzk0NV9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKLX0KLQotI2RlZmluZSBNQVhfSFdfUkVTVEFSVFMgNQotCi1zdGF0aWMgaW50IGl3bDM5NDVfYWxsb2NfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXU4IHN0YV9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXN0YV9pZCA9IGl3bF9sZWdhY3lfcHJlcF9zdGF0aW9uKHByaXYsIGN0eCwKLQkJCQkJaXdsZWdhY3lfYmNhc3RfYWRkciwgZmFsc2UsIE5VTEwpOwotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gcHJlcGFyZSBicm9hZGNhc3Qgc3RhdGlvblxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfRFJJVkVSX0FDVElWRTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSVdMX1NUQV9CQ0FTVDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pd2wzOTQ1X3VwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmMsIGk7Ci0KLQlyYyA9IGl3bDM5NDVfYWxsb2NfYmNhc3Rfc3RhdGlvbihwcml2KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfV0FSTihwcml2LCAiRXhpdCBwZW5kaW5nOyB3aWxsIG5vdCBicmluZyB0aGUgTklDIHVwXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKCFwcml2LT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIgfHwgIXByaXYtPnVjb2RlX2RhdGEudl9hZGRyKSB7Ci0JCUlXTF9FUlIocHJpdiwgInVjb2RlIG5vdCBhdmFpbGFibGUgZm9yIGRldmljZSBicmluZyB1cFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qIElmIHBsYXRmb3JtJ3MgUkZfS0lMTCBzd2l0Y2ggaXMgTk9UIHNldCB0byBLSUxMICovCi0JaWYgKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCi0JCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpCi0JCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JZWxzZSB7Ci0JCXNldF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCQlJV0xfV0FSTihwcml2LCAiUmFkaW8gZGlzYWJsZWQgYnkgSFcgUkYgS2lsbCBzd2l0Y2hcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQotCXJjID0gaXdsMzk0NV9od19uaWNfaW5pdChwcml2KTsKLQlpZiAocmMpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGludCBuaWNcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwKLQkJICAgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7Ci0KLQkvKiBjbGVhciAoYWdhaW4pLCB0aGVuIGVuYWJsZSBob3N0IGludGVycnVwdHMgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCi0JLyogcmVhbGx5IG1ha2Ugc3VyZSByZmtpbGwgaGFuZHNoYWtlIGJpdHMgYXJlIGNsZWFyZWQgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKLQotCS8qIENvcHkgb3JpZ2luYWwgdWNvZGUgZGF0YSBpbWFnZSBmcm9tIGRpc2sgaW50byBiYWNrdXAgY2FjaGUuCi0JICogVGhpcyB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgb24tYm9hcmQgcHJvY2Vzc29yJ3MKLQkgKiBkYXRhIFNSQU0gZm9yIGEgY2xlYW4gc3RhcnQgd2hlbiB0aGUgcnVudGltZSBwcm9ncmFtIGZpcnN0IGxvYWRzLiAqLwotCW1lbWNweShwcml2LT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIHByaXYtPnVjb2RlX2RhdGEudl9hZGRyLAotCSAgICAgICBwcml2LT51Y29kZV9kYXRhLmxlbik7Ci0KLQkvKiBXZSByZXR1cm4gc3VjY2VzcyB3aGVuIHdlIHJlc3VtZSBmcm9tIHN1c3BlbmQgYW5kIHJmX2tpbGwgaXMgb24uICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXX1JFU1RBUlRTOyBpKyspIHsKLQotCQkvKiBsb2FkIGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lLAotCQkgKiBsb2FkIGJvb3RzdHJhcCBwcm9ncmFtIGludG8gcHJvY2Vzc29yJ3MgbWVtb3J5LAotCQkgKiBwcmVwYXJlIHRvIGxvYWQgdGhlICJpbml0aWFsaXplIiB1Q29kZSAqLwotCQlyYyA9IHByaXYtPmNmZy0+b3BzLT5saWItPmxvYWRfdWNvZGUocHJpdik7Ci0KLQkJaWYgKHJjKSB7Ci0JCQlJV0xfRVJSKHByaXYsCi0JCQkJIlVuYWJsZSB0byBzZXQgdXAgYm9vdHN0cmFwIHVDb2RlOiAlZFxuIiwgcmMpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBzdGFydCBjYXJkOyAiaW5pdGlhbGl6ZSIgd2lsbCBsb2FkIHJ1bnRpbWUgdWNvZGUgKi8KLQkJaXdsMzk0NV9uaWNfc3RhcnQocHJpdik7Ci0KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgRFJWX05BTUUgIiBpcyBjb21pbmcgdXBcbiIpOwotCi0JCXJldHVybiAwOwotCX0KLQotCXNldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0JX19pd2wzOTQ1X2Rvd24ocHJpdik7Ci0JY2xlYXJfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCi0JLyogdHJpZWQgdG8gcmVzdGFydCBhbmQgY29uZmlnIHRoZSBkZXZpY2UgZm9yIGFzIGxvbmcgYXMgb3VyCi0JICogcGF0aWVuY2UgY291bGQgd2l0aHN0YW5kICovCi0JSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlIGFmdGVyICVkIGF0dGVtcHRzLlxuIiwgaSk7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogV29ya3F1ZXVlIGNhbGxiYWNrcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9iZ19pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPQotCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGl3bF9wcml2LCBpbml0X2FsaXZlX3N0YXJ0LndvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJZ290byBvdXQ7Ci0KLQlpd2wzOTQ1X2luaXRfYWxpdmVfc3RhcnQocHJpdik7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfYmdfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIGFsaXZlX3N0YXJ0LndvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJZ290byBvdXQ7Ci0KLQlpd2wzOTQ1X2FsaXZlX3N0YXJ0KHByaXYpOwotb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi0vKgotICogMzk0NSBjYW5ub3QgaW50ZXJydXB0IGRyaXZlciB3aGVuIGhhcmR3YXJlIHJmIGtpbGwgc3dpdGNoIHRvZ2dsZXM7Ci0gKiBkcml2ZXIgbXVzdCBwb2xsIENTUl9HUF9DTlRSTF9SRUcgcmVnaXN0ZXIgZm9yIGNoYW5nZS4gIFRoaXMgcmVnaXN0ZXIKLSAqICppcyogcmVhZGFibGUgZXZlbiB3aGVuIGRldmljZSBoYXMgYmVlbiBTV19SRVNFVCBpbnRvIGxvdyBwb3dlciBtb2RlCi0gKiAoZS5nLiBkdXJpbmcgUkYgS0lMTCkuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcmZraWxsX3BvbGwoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIF8zOTQ1LnJma2lsbF9wb2xsLndvcmspOwotCWJvb2wgb2xkX3Jma2lsbCA9IHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQlib29sIG5ld19yZmtpbGwgPSAhKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKQotCQkJJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVyk7Ci0KLQlpZiAobmV3X3Jma2lsbCAhPSBvbGRfcmZraWxsKSB7Ci0JCWlmIChuZXdfcmZraWxsKQotCQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JCWVsc2UKLQkJCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShwcml2LT5ody0+d2lwaHksIG5ld19yZmtpbGwpOwotCi0JCUlXTF9ERUJVR19SRl9LSUxMKHByaXYsICJSRl9LSUxMIGJpdCB0b2dnbGVkIHRvICVzLlxuIiwKLQkJCQluZXdfcmZraWxsID8gImRpc2FibGUgcmFkaW8iIDogImVuYWJsZSByYWRpbyIpOwotCX0KLQotCS8qIEtlZXAgdGhpcyBydW5uaW5nLCBldmVuIGlmIHJhZGlvIG5vdyBlbmFibGVkLiAgVGhpcyB3aWxsIGJlCi0JICogY2FuY2VsbGVkIGluIG1hY19zdGFydCgpIGlmIHN5c3RlbSBkZWNpZGVzIHRvIHN0YXJ0IGFnYWluICovCi0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsLAotCQkJICAgcm91bmRfamlmZmllc19yZWxhdGl2ZSgyICogSFopKTsKLQotfQotCi1pbnQgaXdsMzk0NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9TQ0FOX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9zY2FuX2NtZCksCi0JCS5mbGFncyA9IENNRF9TSVpFX0hVR0UsCi0JfTsKLQlzdHJ1Y3QgaXdsMzk0NV9zY2FuX2NtZCAqc2NhbjsKLQl1OCBuX3Byb2JlcyA9IDA7Ci0JZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwotCWJvb2wgaXNfYWN0aXZlID0gZmFsc2U7Ci0JaW50IHJldDsKLQl1MTYgbGVuOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCFwcml2LT5zY2FuX2NtZCkgewotCQlwcml2LT5zY2FuX2NtZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3NjYW5fY21kKSArCi0JCQkJCSBJV0xfTUFYX1NDQU5fU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHJpdi0+c2Nhbl9jbWQpIHsKLQkJCUlXTF9ERUJVR19TQ0FOKHByaXYsICJGYWlsIHRvIGFsbG9jYXRlIHNjYW4gbWVtb3J5XG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCXNjYW4gPSBwcml2LT5zY2FuX2NtZDsKLQltZW1zZXQoc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3NjYW5fY21kKSArIElXTF9NQVhfU0NBTl9TSVpFKTsKLQotCXNjYW4tPnF1aWV0X3BsY3BfdGggPSBJV0xfUExDUF9RVUlFVF9USFJFU0g7Ci0Jc2Nhbi0+cXVpZXRfdGltZSA9IElXTF9BQ1RJVkVfUVVJRVRfVElNRTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUykpIHsKLQkJdTE2IGludGVydmFsOwotCQl1MzIgZXh0cmE7Ci0JCXUzMiBzdXNwZW5kX3RpbWUgPSAxMDA7Ci0JCXUzMiBzY2FuX3N1c3BlbmRfdGltZSA9IDEwMDsKLQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2Nhbm5pbmcgd2hpbGUgYXNzb2NpYXRlZC4uLlxuIik7Ci0KLQkJaW50ZXJ2YWwgPSB2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQ7Ci0KLQkJc2Nhbi0+c3VzcGVuZF90aW1lID0gMDsKLQkJc2Nhbi0+bWF4X291dF90aW1lID0gY3B1X3RvX2xlMzIoMjAwICogMTAyNCk7Ci0JCWlmICghaW50ZXJ2YWwpCi0JCQlpbnRlcnZhbCA9IHN1c3BlbmRfdGltZTsKLQkJLyoKLQkJICogc3VzcGVuZCB0aW1lIGZvcm1hdDoKLQkJICogIDAtMTk6IGJlYWNvbiBpbnRlcnZhbCBpbiB1c2VjICh0aW1lIGJlZm9yZSBleGVjLikKLQkJICogMjAtMjM6IDAKLQkJICogMjQtMzE6IG51bWJlciBvZiBiZWFjb25zIChzdXNwZW5kIGJldHdlZW4gY2hhbm5lbHMpCi0JCSAqLwotCi0JCWV4dHJhID0gKHN1c3BlbmRfdGltZSAvIGludGVydmFsKSA8PCAyNDsKLQkJc2Nhbl9zdXNwZW5kX3RpbWUgPSAweEZGMEZGRkZGICYKLQkJICAgIChleHRyYSB8ICgoc3VzcGVuZF90aW1lICUgaW50ZXJ2YWwpICogMTAyNCkpOwotCi0JCXNjYW4tPnN1c3BlbmRfdGltZSA9IGNwdV90b19sZTMyKHNjYW5fc3VzcGVuZF90aW1lKTsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgInN1c3BlbmRfdGltZSAweCVYIGJlYWNvbiBpbnRlcnZhbCAlZFxuIiwKLQkJCSAgICAgICBzY2FuX3N1c3BlbmRfdGltZSwgaW50ZXJ2YWwpOwotCX0KLQotCWlmIChwcml2LT5zY2FuX3JlcXVlc3QtPm5fc3NpZHMpIHsKLQkJaW50IGksIHAgPSAwOwotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiS2lja2luZyBvZmYgYWN0aXZlIHNjYW5cbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKLQkJCS8qIGFsd2F5cyBkb2VzIHdpbGRjYXJkIGFueXdheSAqLwotCQkJaWYgKCFwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuKQotCQkJCWNvbnRpbnVlOwotCQkJc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uaWQgPSBXTEFOX0VJRF9TU0lEOwotCQkJc2Nhbi0+ZGlyZWN0X3NjYW5bcF0ubGVuID0KLQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuOwotCQkJbWVtY3B5KHNjYW4tPmRpcmVjdF9zY2FuW3BdLnNzaWQsCi0JCQkgICAgICAgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLAotCQkJICAgICAgIHByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pOwotCQkJbl9wcm9iZXMrKzsKLQkJCXArKzsKLQkJfQotCQlpc19hY3RpdmUgPSB0cnVlOwotCX0gZWxzZQotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiS2lja2luZyBvZmYgcGFzc2l2ZSBzY2FuLlxuIik7Ci0KLQkvKiBXZSBkb24ndCBidWlsZCBhIGRpcmVjdCBzY2FuIHByb2JlIHJlcXVlc3Q7IHRoZSB1Q29kZSB3aWxsIGRvCi0JICogdGhhdCBiYXNlZCBvbiB0aGUgZGlyZWN0X21hc2sgYWRkZWQgdG8gZWFjaCBjaGFubmVsIGVudHJ5ICovCi0Jc2Nhbi0+dHhfY21kLnR4X2ZsYWdzID0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQlzY2FuLT50eF9jbWQuc3RhX2lkID0gcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYmNhc3Rfc3RhX2lkOwotCXNjYW4tPnR4X2NtZC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKLQotCS8qIGZsYWdzICsgcmF0ZSBzZWxlY3Rpb24gKi8KLQotCXN3aXRjaCAocHJpdi0+c2Nhbl9iYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlzY2FuLT5mbGFncyA9IFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSzsKLQkJc2Nhbi0+dHhfY21kLnJhdGUgPSBJV0xfUkFURV8xTV9QTENQOwotCQliYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQlzY2FuLT50eF9jbWQucmF0ZSA9IElXTF9SQVRFXzZNX1BMQ1A7Ci0JCWJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfV0FSTihwcml2LCAiSW52YWxpZCBzY2FuIGJhbmRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqIElmIGFjdGl2ZSBzY2FuaW5nIGlzIHJlcXVlc3RlZCBidXQgYSBjZXJ0YWluIGNoYW5uZWwKLQkgKiBpcyBtYXJrZWQgcGFzc2l2ZSwgd2UgY2FuIGRvIGFjdGl2ZSBzY2FubmluZyBpZiB3ZQotCSAqIGRldGVjdCB0cmFuc21pc3Npb25zLgotCSAqLwotCXNjYW4tPmdvb2RfQ1JDX3RoID0gaXNfYWN0aXZlID8gSVdMX0dPT0RfQ1JDX1RIX0RFRkFVTFQgOgotCQkJCQlJV0xfR09PRF9DUkNfVEhfRElTQUJMRUQ7Ci0KLQlsZW4gPSBpd2xfbGVnYWN5X2ZpbGxfcHJvYmVfcmVxKHByaXYsIChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilzY2FuLT5kYXRhLAotCQkJCQl2aWYtPmFkZHIsIHByaXYtPnNjYW5fcmVxdWVzdC0+aWUsCi0JCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+aWVfbGVuLAotCQkJCQlJV0xfTUFYX1NDQU5fU0laRSAtIHNpemVvZigqc2NhbikpOwotCXNjYW4tPnR4X2NtZC5sZW4gPSBjcHVfdG9fbGUxNihsZW4pOwotCi0JLyogc2VsZWN0IFJ4IGFudGVubmFzICovCi0Jc2Nhbi0+ZmxhZ3MgfD0gaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhwcml2KTsKLQotCXNjYW4tPmNoYW5uZWxfY291bnQgPSBpd2wzOTQ1X2dldF9jaGFubmVsc19mb3Jfc2Nhbihwcml2LCBiYW5kLCBpc19hY3RpdmUsIG5fcHJvYmVzLAotCQkJCQkJCSAgICAodm9pZCAqKSZzY2FuLT5kYXRhW2xlbl0sIHZpZik7Ci0JaWYgKHNjYW4tPmNoYW5uZWxfY291bnQgPT0gMCkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiY2hhbm5lbCBjb3VudCAlZFxuIiwgc2Nhbi0+Y2hhbm5lbF9jb3VudCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWNtZC5sZW4gKz0gbGUxNl90b19jcHUoc2Nhbi0+dHhfY21kLmxlbikgKwotCSAgICBzY2FuLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3NjYW5fY2hhbm5lbCk7Ci0JY21kLmRhdGEgPSBzY2FuOwotCXNjYW4tPmxlbiA9IGNwdV90b19sZTE2KGNtZC5sZW4pOwotCi0Jc2V0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHByaXYsICZjbWQpOwotCWlmIChyZXQpCi0JCWNsZWFyX2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBpd2wzOTQ1X3Bvc3Rfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCS8qCi0JICogU2luY2Ugc2V0dGluZyB0aGUgUlhPTiBtYXkgaGF2ZSBiZWVuIGRlZmVycmVkIHdoaWxlCi0JICogcGVyZm9ybWluZyB0aGUgc2NhbiwgZmlyZSBvbmUgb2ZmIGlmIG5lZWRlZAotCSAqLwotCWlmIChtZW1jbXAoJmN0eC0+c3RhZ2luZywgJmN0eC0+YWN0aXZlLCBzaXplb2YoY3R4LT5zdGFnaW5nKSkpCi0JCWl3bDM5NDVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9iZ19yZXN0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGl3bF9wcml2LCByZXN0YXJ0KTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpKSB7Ci0JCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpCi0JCQljdHgtPnZpZiA9IE5VTEw7Ci0JCXByaXYtPmlzX29wZW4gPSAwOwotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJaXdsMzk0NV9kb3duKHByaXYpOwotCQlpZWVlODAyMTFfcmVzdGFydF9odyhwcml2LT5odyk7Ci0JfSBlbHNlIHsKLQkJaXdsMzk0NV9kb3duKHByaXYpOwotCi0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCV9faXdsMzk0NV91cChwcml2KTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2JnX3J4X3JlcGxlbmlzaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgcnhfcmVwbGVuaXNoKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCWdvdG8gb3V0OwotCi0JaXdsMzk0NV9yeF9yZXBsZW5pc2gocHJpdik7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXZvaWQgaXdsMzk0NV9wb3N0X2Fzc29jaWF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSBOVUxMOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlpZiAoIWN0eC0+dmlmIHx8ICFwcml2LT5pc19vcGVuKQotCQlyZXR1cm47Ci0KLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIkFzc29jaWF0ZWQgYXMgJWQgdG86ICVwTVxuIiwKLQkJCWN0eC0+dmlmLT5ic3NfY29uZi5haWQsIGN0eC0+YWN0aXZlLmJzc2lkX2FkZHIpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQotCWNvbmYgPSBpd2xfbGVnYWN5X2llZWU4MDIxMV9nZXRfaHdfY29uZihwcml2LT5odyk7Ci0KLQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JaXdsMzk0NV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JcmMgPSBpd2xfbGVnYWN5X3NlbmRfcnhvbl90aW1pbmcocHJpdiwgY3R4KTsKLQlpZiAocmMpCi0JCUlXTF9XQVJOKHByaXYsICJSRVBMWV9SWE9OX1RJTUlORyBmYWlsZWQgLSAiCi0JCQkgICAgIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKLQotCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCi0JY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gY3B1X3RvX2xlMTYoY3R4LT52aWYtPmJzc19jb25mLmFpZCk7Ci0KLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgImFzc29jIGlkICVkIGJlYWNvbiBpbnRlcnZhbCAlZFxuIiwKLQkJCWN0eC0+dmlmLT5ic3NfY29uZi5haWQsIGN0eC0+dmlmLT5ic3NfY29uZi5iZWFjb25faW50KTsKLQotCWlmIChjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwotCWVsc2UKLQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0KLQlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7Ci0JCWlmIChjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JfQotCi0JaXdsMzk0NV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0Jc3dpdGNoIChjdHgtPnZpZi0+dHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJaXdsMzk0NV9yYXRlX3NjYWxlX2luaXQocHJpdi0+aHcsIElXTF9BUF9JRCk7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCWl3bDM5NDVfc2VuZF9iZWFjb25fY21kKHByaXYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICIlcyBTaG91bGQgbm90IGJlIGNhbGxlZCBpbiAlZCBtb2RlXG4iLAotCQkJX19mdW5jX18sIGN0eC0+dmlmLT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgVUNPREVfUkVBRFlfVElNRU9VVAkoMiAqIEhaKQotCi1zdGF0aWMgaW50IGl3bDM5NDVfbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCS8qIHdlIHNob3VsZCBiZSB2ZXJpZnlpbmcgdGhlIGRldmljZSBpcyByZWFkeSB0byBiZSBvcGVuZWQgKi8KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQkvKiBmZXRjaCB1Y29kZSBmaWxlIGZyb20gZGlzaywgYWxsb2MgYW5kIGNvcHkgdG8gYnVzLW1hc3RlciBidWZmZXJzIC4uLgotCSAqIHVjb2RlIGZpbGVuYW1lIGFuZCBtYXggc2l6ZXMgYXJlIGNhcmQtc3BlY2lmaWMuICovCi0KLQlpZiAoIXByaXYtPnVjb2RlX2NvZGUubGVuKSB7Ci0JCXJldCA9IGl3bDM5NDVfcmVhZF91Y29kZShwcml2KTsKLQkJaWYgKHJldCkgewotCQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IHJlYWQgbWljcm9jb2RlOiAlZFxuIiwgcmV0KTsKLQkJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQkJZ290byBvdXRfcmVsZWFzZV9pcnE7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBfX2l3bDM5NDVfdXAocHJpdik7Ci0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3JlbGVhc2VfaXJxOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlN0YXJ0IFVQIHdvcmsuXG4iKTsKLQotCS8qIFdhaXQgZm9yIFNUQVJUX0FMSVZFIGZyb20gdWNvZGUuIE90aGVyd2lzZSBjYWxsYmFja3MgZnJvbQotCSAqIG1hYzgwMjExIHdpbGwgbm90IGJlIHJ1biBzdWNjZXNzZnVsbHkuICovCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSwKLQkJCXRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cyksCi0JCQlVQ09ERV9SRUFEWV9USU1FT1VUKTsKLQlpZiAoIXJldCkgewotCQlpZiAoIXRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cykpIHsKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiV2FpdCBmb3IgU1RBUlRfQUxJVkUgdGltZW91dCBhZnRlciAlZG1zLlxuIiwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKFVDT0RFX1JFQURZX1RJTUVPVVQpKTsKLQkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCQlnb3RvIG91dF9yZWxlYXNlX2lycTsKLQkJfQotCX0KLQotCS8qIHVjb2RlIGlzIHJ1bm5pbmcgYW5kIHdpbGwgc2VuZCByZmtpbGwgbm90aWZpY2F0aW9ucywKLQkgKiBubyBuZWVkIHRvIHBvbGwgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgYW55bW9yZSAqLwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsKTsKLQotCXByaXYtPmlzX29wZW4gPSAxOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCXJldHVybiAwOwotCi1vdXRfcmVsZWFzZV9pcnE6Ci0JcHJpdi0+aXNfb3BlbiA9IDA7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIGZhaWxlZFxuIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKCFwcml2LT5pc19vcGVuKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBza2lwXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaXYtPmlzX29wZW4gPSAwOwotCi0JaXdsMzk0NV9kb3duKHByaXYpOwotCi0JZmx1c2hfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7Ci0KLQkvKiBzdGFydCBwb2xsaW5nIHRoZSBraWxsc3dpdGNoIHN0YXRlIGFnYWluICovCi0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsLAotCQkJICAgcm91bmRfamlmZmllc19yZWxhdGl2ZSgyICogSFopKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X21hY190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JSVdMX0RFQlVHX1RYKHByaXYsICJkZXYtPnhtaXQoJWQgYnl0ZXMpIGF0IHJhdGUgMHglMDJ4XG4iLCBza2ItPmxlbiwKLQkJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKSktPmJpdHJhdGUpOwotCi0JaWYgKGl3bDM5NDVfdHhfc2tiKHByaXYsIHNrYikpCi0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotdm9pZCBpd2wzOTQ1X2NvbmZpZ19hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gY3R4LT52aWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JLyogVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgZG9uZSBvbmx5IGF0IEFQIGJyaW5nIHVwICovCi0JaWYgKCEoaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkKHByaXYsIElXTF9SWE9OX0NUWF9CU1MpKSkgewotCi0JCS8qIFJYT04gLSB1bmFzc29jICh0byBzZXQgdGltaW5nIGNvbW1hbmQpICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJaXdsMzk0NV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JCS8qIFJYT04gVGltaW5nICovCi0JCXJjID0gaXdsX2xlZ2FjeV9zZW5kX3J4b25fdGltaW5nKHByaXYsIGN0eCk7Ci0JCWlmIChyYykKLQkJCUlXTF9XQVJOKHByaXYsICJSRVBMWV9SWE9OX1RJTUlORyBmYWlsZWQgLSAiCi0JCQkJCSJBdHRlbXB0aW5nIHRvIGNvbnRpbnVlLlxuIik7Ci0KLQkJY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gMDsKLQotCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0KLQkJCQlSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPQotCQkJCX5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0KLQkJaWYgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgewotCQkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCi0JCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9Ci0JCQkJCVJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwotCQkJZWxzZQotCQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPQotCQkJCQl+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCX0KLQkJLyogcmVzdG9yZSBSWE9OIGFzc29jICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCQlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JfQotCWl3bDM5NDVfc2VuZF9iZWFjb25fY21kKHByaXYpOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JaW50IHJldCA9IDA7Ci0JdTggc3RhX2lkID0gSVdMX0lOVkFMSURfU1RBVElPTjsKLQl1OCBzdGF0aWNfa2V5OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpZiAoaXdsMzk0NV9tb2RfcGFyYW1zLnN3X2NyeXB0bykgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gaHdjcnlwdG8gZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0JLyoKLQkgKiBUbyBzdXBwb3J0IElCU1MgUlNOLCBkb24ndCBwcm9ncmFtIGdyb3VwIGtleXMgaW4gSUJTUywgdGhlCi0JICogaGFyZHdhcmUgd2lsbCB0aGVuIG5vdCBhdHRlbXB0IHRvIGRlY3J5cHQgdGhlIGZyYW1lcy4KLQkgKi8KLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCi0JICAgICEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCXN0YXRpY19rZXkgPSAhaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkKHByaXYsIElXTF9SWE9OX0NUWF9CU1MpOwotCi0JaWYgKCFzdGF0aWNfa2V5KSB7Ci0JCXN0YV9pZCA9IGl3bF9sZWdhY3lfc3RhX2lkX29yX2Jyb2FkY2FzdCgKLQkJCQlwcml2LCAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10sIHN0YSk7Ci0JCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTRVRfS0VZOgotCQlpZiAoc3RhdGljX2tleSkKLQkJCXJldCA9IGl3bDM5NDVfc2V0X3N0YXRpY19rZXkocHJpdiwga2V5KTsKLQkJZWxzZQotCQkJcmV0ID0gaXdsMzk0NV9zZXRfZHluYW1pY19rZXkocHJpdiwga2V5LCBzdGFfaWQpOwotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOwotCQlicmVhazsKLQljYXNlIERJU0FCTEVfS0VZOgotCQlpZiAoc3RhdGljX2tleSkKLQkJCXJldCA9IGl3bDM5NDVfcmVtb3ZlX3N0YXRpY19rZXkocHJpdik7Ci0JCWVsc2UKLQkJCXJldCA9IGl3bDM5NDVfY2xlYXJfc3RhX2tleV9pbmZvKHByaXYsIHN0YV9pZCk7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZGlzYWJsZSBod2NyeXB0byBrZXlcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X21hY19zdGFfYWRkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0JaW50IHJldDsKLQlib29sIGlzX2FwID0gdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0JdTggc3RhX2lkOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInJlY2VpdmVkIHJlcXVlc3QgdG8gYWRkIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInByb2NlZWRpbmcgdG8gYWRkIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQlzdGFfcHJpdi0+Y29tbW9uLnN0YV9pZCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQotCXJldCA9IGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uKHByaXYsCi0JCQkJJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLAotCQkJCSAgICAgc3RhLT5hZGRyLCBpc19hcCwgc3RhLCAmc3RhX2lkKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE0gKCVkKVxuIiwKLQkJCXN0YS0+YWRkciwgcmV0KTsKLQkJLyogU2hvdWxkIHdlIHJldHVybiBzdWNjZXNzIGlmIHJldHVybiBjb2RlIGlzIEVFWElTVCA/ICovCi0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gc3RhX2lkOwotCi0JLyogSW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdGlhbGl6aW5nIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE1cbiIsCi0JCSAgICAgICBzdGEtPmFkZHIpOwotCWl3bDM5NDVfcnNfcmF0ZV9pbml0KHByaXYsIHN0YSwgc3RhX2lkKTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKLQkJCQkgICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCi0JCQkJICAgICB1NjQgbXVsdGljYXN0KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCV9fbGUzMiBmaWx0ZXJfb3IgPSAwLCBmaWx0ZXJfbmFuZCA9IDA7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotI2RlZmluZSBDSEsodGVzdCwgZmxhZykJZG8geyBcCi0JaWYgKCp0b3RhbF9mbGFncyAmICh0ZXN0KSkJCVwKLQkJZmlsdGVyX29yIHw9IChmbGFnKTsJCVwKLQllbHNlCQkJCQlcCi0JCWZpbHRlcl9uYW5kIHw9IChmbGFnKTsJCVwKLQl9IHdoaWxlICgwKQotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsCi0JCQljaGFuZ2VkX2ZsYWdzLCAqdG90YWxfZmxhZ3MpOwotCi0JQ0hLKEZJRl9PVEhFUl9CU1MgfCBGSUZfUFJPTUlTQ19JTl9CU1MsIFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKLQlDSEsoRklGX0NPTlRST0wsIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyk7Ci0JQ0hLKEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDLCBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyk7Ci0KLSN1bmRlZiBDSEsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gfmZpbHRlcl9uYW5kOwotCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gZmlsdGVyX29yOwotCi0JLyoKLQkgKiBOb3QgY29tbWl0dGluZyBkaXJlY3RseSBiZWNhdXNlIGhhcmR3YXJlIGNhbiBwZXJmb3JtIGEgc2NhbiwKLQkgKiBidXQgZXZlbiBpZiBodyBpcyByZWFkeSwgY29tbWl0dGluZyBoZXJlIGJyZWFrcyBmb3Igc29tZSByZWFzb24sCi0JICogd2UnbGwgZXZlbnR1YWxseSBjb21taXQgdGhlIGZpbHRlciBmbGFncyBjaGFuZ2UgYW55d2F5LgotCSAqLwotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQkvKgotCSAqIFJlY2VpdmluZyBhbGwgbXVsdGljYXN0IGZyYW1lcyBpcyBhbHdheXMgZW5hYmxlZCBieSB0aGUKLQkgKiBkZWZhdWx0IGZsYWdzIHNldHVwIGluIGl3bF9sZWdhY3lfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZygpCi0JICogc2luY2Ugd2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHByb2dyYW1taW5nIG11bHRpY2FzdAotCSAqIGZpbHRlcnMgaW50byB0aGUgZGV2aWNlLgotCSAqLwotCSp0b3RhbF9mbGFncyAmPSBGSUZfT1RIRVJfQlNTIHwgRklGX0FMTE1VTFRJIHwgRklGX1BST01JU0NfSU5fQlNTIHwKLQkJCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwgRklGX0NPTlRST0w7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogc3lzZnMgYXR0cmlidXRlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCi0vKgotICogVGhlIGZvbGxvd2luZyBhZGRzIGEgbmV3IGF0dHJpYnV0ZSB0byB0aGUgc3lzZnMgcmVwcmVzZW50YXRpb24KLSAqIG9mIHRoaXMgZGV2aWNlIGRyaXZlciAoaS5lLiBhIG5ldyBmaWxlIGluIC9zeXMvYnVzL3BjaS9kcml2ZXJzL2l3bC8pCi0gKiB1c2VkIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgbGV2ZWwuCi0gKgotICogU2VlIHRoZSBsZXZlbCBkZWZpbml0aW9ucyBpbiBpd2wgZm9yIGRldGFpbHMuCi0gKgotICogVGhlIGRlYnVnX2xldmVsIGJlaW5nIG1hbmFnZWQgdXNpbmcgc3lzZnMgYmVsb3cgaXMgYSBwZXIgZGV2aWNlIGRlYnVnCi0gKiBsZXZlbCB0aGF0IGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIGRlYnVnIGxldmVsIGlmIGl0ICh0aGUgcGVyCi0gKiBkZXZpY2UgZGVidWcgbGV2ZWwpIGlzIHNldC4KLSAqLwotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDhYXG4iLCBpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSk7Ci19Ci1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3N0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKLQlpZiAocmV0KQotCQlJV0xfSU5GTyhwcml2LCAiJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOwotCWVsc2UgewotCQlwcml2LT5kZWJ1Z19sZXZlbCA9IHZhbDsKLQkJaWYgKGl3bF9sZWdhY3lfYWxsb2NfdHJhZmZpY19tZW0ocHJpdikpCi0JCQlJV0xfRVJSKHByaXYsCi0JCQkJIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGdlbmVyYXRlIHRyYWZmaWMgbG9nXG4iKTsKLQl9Ci0JcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihkZWJ1Z19sZXZlbCwgU19JV1VTUiB8IFNfSVJVR08sCi0JCQlpd2wzOTQ1X3Nob3dfZGVidWdfbGV2ZWwsIGl3bDM5NDVfc3RvcmVfZGVidWdfbGV2ZWwpOwotCi0jZW5kaWYgLyogQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHICovCi0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc2hvd190ZW1wZXJhdHVyZShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpd2wzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShwcml2KSk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wZXJhdHVyZSwgU19JUlVHTywgaXdsMzk0NV9zaG93X3RlbXBlcmF0dXJlLCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X3R4X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwcml2LT50eF9wb3dlcl91c2VyX2xtdCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc3RvcmVfdHhfcG93ZXIoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKLQl1MzIgdmFsOwotCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDEwKTsKLQlpZiAocCA9PSBidWYpCi0JCUlXTF9JTkZPKHByaXYsICI6ICVzIGlzIG5vdCBpbiBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOwotCWVsc2UKLQkJaXdsMzk0NV9od19yZWdfc2V0X3R4cG93ZXIocHJpdiwgdmFsKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHR4X3Bvd2VyLCBTX0lXVVNSIHwgU19JUlVHTywgaXdsMzk0NV9zaG93X3R4X3Bvd2VyLCBpd2wzOTQ1X3N0b3JlX3R4X3Bvd2VyKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwNFhcbiIsIGN0eC0+YWN0aXZlLmZsYWdzKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zdG9yZV9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JdTMyIGZsYWdzID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmIChsZTMyX3RvX2NwdShjdHgtPnN0YWdpbmcuZmxhZ3MpICE9IGZsYWdzKSB7Ci0JCS8qIENhbmNlbCBhbnkgY3VycmVudGx5IHJ1bm5pbmcgc2NhbnMuLi4gKi8KLQkJaWYgKGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApKQotCQkJSVdMX1dBUk4ocHJpdiwgIkNvdWxkIG5vdCBjYW5jZWwgc2Nhbi5cbiIpOwotCQllbHNlIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJDb21taXR0aW5nIHJ4b24uZmxhZ3MgPSAweCUwNFhcbiIsCi0JCQkJICAgICAgIGZsYWdzKTsKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKLQkJCWl3bDM5NDVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGZsYWdzLCBTX0lXVVNSIHwgU19JUlVHTywgaXdsMzk0NV9zaG93X2ZsYWdzLCBpd2wzOTQ1X3N0b3JlX2ZsYWdzKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X2ZpbHRlcl9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDRYXG4iLAotCQlsZTMyX3RvX2NwdShjdHgtPmFjdGl2ZS5maWx0ZXJfZmxhZ3MpKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zdG9yZV9maWx0ZXJfZmxhZ3Moc3RydWN0IGRldmljZSAqZCwKLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0JdTMyIGZpbHRlcl9mbGFncyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKGxlMzJfdG9fY3B1KGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MpICE9IGZpbHRlcl9mbGFncykgewotCQkvKiBDYW5jZWwgYW55IGN1cnJlbnRseSBydW5uaW5nIHNjYW5zLi4uICovCi0JCWlmIChpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKSkKLQkJCUlXTF9XQVJOKHByaXYsICJDb3VsZCBub3QgY2FuY2VsIHNjYW4uXG4iKTsKLQkJZWxzZSB7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ29tbWl0dGluZyByeG9uLmZpbHRlcl9mbGFncyA9ICIKLQkJCQkgICAgICAgIjB4JTA0WFxuIiwgZmlsdGVyX2ZsYWdzKTsKLQkJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgPQotCQkJCWNwdV90b19sZTMyKGZpbHRlcl9mbGFncyk7Ci0JCQlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihmaWx0ZXJfZmxhZ3MsIFNfSVdVU1IgfCBTX0lSVUdPLCBpd2wzOTQ1X3Nob3dfZmlsdGVyX2ZsYWdzLAotCQkgICBpd2wzOTQ1X3N0b3JlX2ZpbHRlcl9mbGFncyk7Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc2hvd19tZWFzdXJlbWVudChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uIG1lYXN1cmVfcmVwb3J0OwotCXUzMiBzaXplID0gc2l6ZW9mKG1lYXN1cmVfcmVwb3J0KSwgbGVuID0gMCwgb2ZzID0gMDsKLQl1OCAqZGF0YSA9ICh1OCAqKSZtZWFzdXJlX3JlcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIShwcml2LT5tZWFzdXJlbWVudF9zdGF0dXMgJiBNRUFTVVJFTUVOVF9SRUFEWSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbWVtY3B5KCZtZWFzdXJlX3JlcG9ydCwgJnByaXYtPm1lYXN1cmVfcmVwb3J0LCBzaXplKTsKLQlwcml2LT5tZWFzdXJlbWVudF9zdGF0dXMgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChzaXplICYmIChQQUdFX1NJWkUgLSBsZW4pKSB7Ci0JCWhleF9kdW1wX3RvX2J1ZmZlcihkYXRhICsgb2ZzLCBzaXplLCAxNiwgMSwgYnVmICsgbGVuLAotCQkJCSAgIFBBR0VfU0laRSAtIGxlbiwgMSk7Ci0JCWxlbiA9IHN0cmxlbihidWYpOwotCQlpZiAoUEFHRV9TSVpFIC0gbGVuKQotCQkJYnVmW2xlbisrXSA9ICdcbic7Ci0KLQkJb2ZzICs9IDE2OwotCQlzaXplIC09IG1pbihzaXplLCAxNlUpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc3RvcmVfbWVhc3VyZW1lbnQoc3RydWN0IGRldmljZSAqZCwKLQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcGFyYW1zIHBhcmFtcyA9IHsKLQkJLmNoYW5uZWwgPSBsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSwKLQkJLnN0YXJ0X3RpbWUgPSBjcHVfdG9fbGU2NChwcml2LT5fMzk0NS5sYXN0X3RzZiksCi0JCS5kdXJhdGlvbiA9IGNwdV90b19sZTE2KDEpLAotCX07Ci0JdTggdHlwZSA9IElXTF9NRUFTVVJFX0JBU0lDOwotCXU4IGJ1ZmZlclszMl07Ci0JdTggY2hhbm5lbDsKLQotCWlmIChjb3VudCkgewotCQljaGFyICpwID0gYnVmZmVyOwotCQlzdHJuY3B5KGJ1ZmZlciwgYnVmLCBtaW4oc2l6ZW9mKGJ1ZmZlciksIGNvdW50KSk7Ci0JCWNoYW5uZWwgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKLQkJaWYgKGNoYW5uZWwpCi0JCQlwYXJhbXMuY2hhbm5lbCA9IGNoYW5uZWw7Ci0KLQkJcCA9IGJ1ZmZlcjsKLQkJd2hpbGUgKCpwICYmICpwICE9ICcgJykKLQkJCXArKzsKLQkJaWYgKCpwKQotCQkJdHlwZSA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKTsKLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW52b2tpbmcgbWVhc3VyZW1lbnQgb2YgdHlwZSAlZCBvbiAiCi0JCSAgICAgICAiY2hhbm5lbCAlZCAoZm9yICclcycpXG4iLCB0eXBlLCBwYXJhbXMuY2hhbm5lbCwgYnVmKTsKLQlpd2wzOTQ1X2dldF9tZWFzdXJlbWVudChwcml2LCAmcGFyYW1zLCB0eXBlKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKG1lYXN1cmVtZW50LCBTX0lSVVNSIHwgU19JV1VTUiwKLQkJICAgaXdsMzk0NV9zaG93X21lYXN1cmVtZW50LCBpd2wzOTQ1X3N0b3JlX21lYXN1cmVtZW50KTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zdG9yZV9yZXRyeV9yYXRlKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCi0JcHJpdi0+cmV0cnlfcmF0ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7Ci0JaWYgKHByaXYtPnJldHJ5X3JhdGUgPD0gMCkKLQkJcHJpdi0+cmV0cnlfcmF0ZSA9IDE7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc2hvd19yZXRyeV9yYXRlKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCBwcml2LT5yZXRyeV9yYXRlKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHJldHJ5X3JhdGUsIFNfSVdVU1IgfCBTX0lSVVNSLCBpd2wzOTQ1X3Nob3dfcmV0cnlfcmF0ZSwKLQkJICAgaXdsMzk0NV9zdG9yZV9yZXRyeV9yYXRlKTsKLQotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Nob3dfY2hhbm5lbHMoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQkvKiBhbGwgdGhpcyBzaGl0IGRvZXNuJ3QgYmVsb25nIGludG8gc3lzZnMgYW55d2F5ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihjaGFubmVscywgU19JUlVTUiwgaXdsMzk0NV9zaG93X2NoYW5uZWxzLCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X2FudGVubmEoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbGl2ZShwcml2KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaXdsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3N0b3JlX2FudGVubmEoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpbnQgYW50OwotCi0JaWYgKGNvdW50ID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKHNzY2FuZihidWYsICIlMWkiLCAmYW50KSAhPSAxKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIpOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JaWYgKChhbnQgPj0gMCkgJiYgKGFudCA8PSAyKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2V0dGluZyBhbnRlbm5hIHNlbGVjdCB0byAlZC5cbiIsIGFudCk7Ci0JCWl3bDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hID0gKGVudW0gaXdsMzk0NV9hbnRlbm5hKWFudDsKLQl9IGVsc2UKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJhZCBhbnRlbm5hIHNlbGVjdCB2YWx1ZSAlZC5cbiIsIGFudCk7Ci0KLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGFudGVubmEsIFNfSVdVU1IgfCBTX0lSVUdPLCBpd2wzOTQ1X3Nob3dfYW50ZW5uYSwgaXdsMzk0NV9zdG9yZV9hbnRlbm5hKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIChpbnQpcHJpdi0+c3RhdHVzKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHN0YXR1cywgU19JUlVHTywgaXdsMzk0NV9zaG93X3N0YXR1cywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfZHVtcF9lcnJvcl9sb2coc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKLQotCWlmIChwWzBdID09ICcxJykKLQkJaXdsMzk0NV9kdW1wX25pY19lcnJvcl9sb2cocHJpdik7Ci0KLQlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGR1bXBfZXJyb3JzLCBTX0lXVVNSLCBOVUxMLCBpd2wzOTQ1X2R1bXBfZXJyb3JfbG9nKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyIGRvd24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfc2V0dXBfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcHJpdi0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoRFJWX05BTUUpOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQotCUlOSVRfV09SSygmcHJpdi0+cmVzdGFydCwgaXdsMzk0NV9iZ19yZXN0YXJ0KTsKLQlJTklUX1dPUksoJnByaXYtPnJ4X3JlcGxlbmlzaCwgaXdsMzk0NV9iZ19yeF9yZXBsZW5pc2gpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pbml0X2FsaXZlX3N0YXJ0LCBpd2wzOTQ1X2JnX2luaXRfYWxpdmVfc3RhcnQpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5hbGl2ZV9zdGFydCwgaXdsMzk0NV9iZ19hbGl2ZV9zdGFydCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsLCBpd2wzOTQ1X3Jma2lsbF9wb2xsKTsKLQotCWl3bF9sZWdhY3lfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHByaXYpOwotCi0JaXdsMzk0NV9od19zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOwotCi0JaW5pdF90aW1lcigmcHJpdi0+d2F0Y2hkb2cpOwotCXByaXYtPndhdGNoZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZylwcml2OwotCXByaXYtPndhdGNoZG9nLmZ1bmN0aW9uID0gaXdsX2xlZ2FjeV9iZ193YXRjaGRvZzsKLQotCXRhc2tsZXRfaW5pdCgmcHJpdi0+aXJxX3Rhc2tsZXQsICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSkKLQkJICAgICBpd2wzOTQ1X2lycV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaXdsMzk0NV9od19jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+aW5pdF9hbGl2ZV9zdGFydCk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+YWxpdmVfc3RhcnQpOwotCi0JaXdsX2xlZ2FjeV9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHByaXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXdsMzk0NV9zeXNmc19lbnRyaWVzW10gPSB7Ci0JJmRldl9hdHRyX2FudGVubmEuYXR0ciwKLQkmZGV2X2F0dHJfY2hhbm5lbHMuYXR0ciwKLQkmZGV2X2F0dHJfZHVtcF9lcnJvcnMuYXR0ciwKLQkmZGV2X2F0dHJfZmxhZ3MuYXR0ciwKLQkmZGV2X2F0dHJfZmlsdGVyX2ZsYWdzLmF0dHIsCi0JJmRldl9hdHRyX21lYXN1cmVtZW50LmF0dHIsCi0JJmRldl9hdHRyX3JldHJ5X3JhdGUuYXR0ciwKLQkmZGV2X2F0dHJfc3RhdHVzLmF0dHIsCi0JJmRldl9hdHRyX3RlbXBlcmF0dXJlLmF0dHIsCi0JJmRldl9hdHRyX3R4X3Bvd2VyLmF0dHIsCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JJmRldl9hdHRyX2RlYnVnX2xldmVsLmF0dHIsCi0jZW5kaWYKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpd2wzOTQ1X2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZSA9IE5VTEwsCQkvKiBwdXQgaW4gZGV2aWNlIGRpcmVjdG9yeSAqLwotCS5hdHRycyA9IGl3bDM5NDVfc3lzZnNfZW50cmllcywKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bDM5NDVfaHdfb3BzID0gewotCS50eCA9IGl3bDM5NDVfbWFjX3R4LAotCS5zdGFydCA9IGl3bDM5NDVfbWFjX3N0YXJ0LAotCS5zdG9wID0gaXdsMzk0NV9tYWNfc3RvcCwKLQkuYWRkX2ludGVyZmFjZSA9IGl3bF9sZWdhY3lfbWFjX2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UgPSBpd2xfbGVnYWN5X21hY19yZW1vdmVfaW50ZXJmYWNlLAotCS5jaGFuZ2VfaW50ZXJmYWNlID0gaXdsX2xlZ2FjeV9tYWNfY2hhbmdlX2ludGVyZmFjZSwKLQkuY29uZmlnID0gaXdsX2xlZ2FjeV9tYWNfY29uZmlnLAotCS5jb25maWd1cmVfZmlsdGVyID0gaXdsMzk0NV9jb25maWd1cmVfZmlsdGVyLAotCS5zZXRfa2V5ID0gaXdsMzk0NV9tYWNfc2V0X2tleSwKLQkuY29uZl90eCA9IGl3bF9sZWdhY3lfbWFjX2NvbmZfdHgsCi0JLnJlc2V0X3RzZiA9IGl3bF9sZWdhY3lfbWFjX3Jlc2V0X3RzZiwKLQkuYnNzX2luZm9fY2hhbmdlZCA9IGl3bF9sZWdhY3lfbWFjX2Jzc19pbmZvX2NoYW5nZWQsCi0JLmh3X3NjYW4gPSBpd2xfbGVnYWN5X21hY19od19zY2FuLAotCS5zdGFfYWRkID0gaXdsMzk0NV9tYWNfc3RhX2FkZCwKLQkuc3RhX3JlbW92ZSA9IGl3bF9sZWdhY3lfbWFjX3N0YV9yZW1vdmUsCi0JLnR4X2xhc3RfYmVhY29uID0gaXdsX2xlZ2FjeV9tYWNfdHhfbGFzdF9iZWFjb24sCi19OwotCi1zdGF0aWMgaW50IGl3bDM5NDVfaW5pdF9kcnYoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQ7Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCi0JcHJpdi0+cmV0cnlfcmF0ZSA9IDE7Ci0JcHJpdi0+YmVhY29uX3NrYiA9IE5VTEw7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+c3RhX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZwcml2LT5oY21kX2xvY2spOwotCi0JSU5JVF9MSVNUX0hFQUQoJnByaXYtPmZyZWVfZnJhbWVzKTsKLQotCW11dGV4X2luaXQoJnByaXYtPm11dGV4KTsKLQotCXByaXYtPmllZWVfY2hhbm5lbHMgPSBOVUxMOwotCXByaXYtPmllZWVfcmF0ZXMgPSBOVUxMOwotCXByaXYtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwotCi0JcHJpdi0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0JcHJpdi0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOwotCi0JLyogaW5pdGlhbGl6ZSBmb3JjZSByZXNldCAqLwotCXByaXYtPmZvcmNlX3Jlc2V0LnJlc2V0X2R1cmF0aW9uID0gSVdMX0RFTEFZX05FWFRfRk9SQ0VfRldfUkVMT0FEOwotCi0JaWYgKGVlcHJvbS0+dmVyc2lvbiA8IEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJVbnN1cHBvcnRlZCBFRVBST00gdmVyc2lvbjogMHglMDRYXG4iLAotCQkJIGVlcHJvbS0+dmVyc2lvbik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXQgPSBpd2xfbGVnYWN5X2luaXRfY2hhbm5lbF9tYXAocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJpbml0aWFsaXppbmcgcmVndWxhdG9yeSBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBTZXQgdXAgdHhwb3dlciBzZXR0aW5ncyBpbiBkcml2ZXIgZm9yIGFsbCBjaGFubmVscyAqLwotCWlmIChpd2wzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tKHByaXYpKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyX2ZyZWVfY2hhbm5lbF9tYXA7Ci0JfQotCi0JcmV0ID0gaXdsX2xlZ2FjeV9pbml0X2dlb3MocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJpbml0aWFsaXppbmcgZ2VvcyBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9mcmVlX2NoYW5uZWxfbWFwOwotCX0KLQlpd2wzOTQ1X2luaXRfaHdfcmF0ZXMocHJpdiwgcHJpdi0+aWVlZV9yYXRlcyk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2ZyZWVfY2hhbm5lbF9tYXA6Ci0JaXdsX2xlZ2FjeV9mcmVlX2NoYW5uZWxfbWFwKHByaXYpOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgSVdMMzk0NV9NQVhfUFJPQkVfUkVRVUVTVAkyMDAKLQotc3RhdGljIGludCBpd2wzOTQ1X3NldHVwX21hYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwotCi0JaHctPnJhdGVfY29udHJvbF9hbGdvcml0aG0gPSAiaXdsLTM5NDUtcnMiOwotCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2KTsKLQlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3ZpZl9wcml2KTsKLQotCS8qIFRlbGwgbWFjODAyMTEgb3VyIGNoYXJhY3RlcmlzdGljcyAqLwotCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKLQkJICAgIElFRUU4MDIxMV9IV19TUEVDVFJVTV9NR01UOwotCi0JaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPQotCQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5pbnRlcmZhY2VfbW9kZXM7Ci0KLQlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkgfAotCQkJICAgIFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFMgfAotCQkJICAgIFdJUEhZX0ZMQUdfSUJTU19SU047Ci0KLQlody0+d2lwaHktPm1heF9zY2FuX3NzaWRzID0gUFJPQkVfT1BUSU9OX01BWF8zOTQ1OwotCS8qIHdlIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciBhbmQgYSB6ZXJvLWxlbmd0aCBTU0lEIGVsZW1lbnQgKi8KLQlody0+d2lwaHktPm1heF9zY2FuX2llX2xlbiA9IElXTDM5NDVfTUFYX1BST0JFX1JFUVVFU1QgLSAyNCAtIDI7Ci0KLQkvKiBEZWZhdWx0IHZhbHVlOyA0IEVEQ0EgUU9TIHByaW9yaXRpZXMgKi8KLQlody0+cXVldWVzID0gNDsKLQotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2NoYW5uZWxzKQotCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0KLQkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKLQotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKQotCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0KLQkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKLQotCWl3bF9sZWdhY3lfbGVkc19pbml0KHByaXYpOwotCi0JcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KHByaXYtPmh3KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZWdpc3RlciBodyAoZXJyb3IgJWQpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQotewotCWludCBlcnIgPSAwLCBpOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQlzdHJ1Y3QgaXdsX2NmZyAqY2ZnID0gKHN0cnVjdCBpd2xfY2ZnICopKGVudC0+ZHJpdmVyX2RhdGEpOwotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbSAqZWVwcm9tOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAxLiBBbGxvY2F0aW5nIEhXIGRhdGEKLQkgKiAqKioqKioqKioqKioqKioqKioqKi8KLQotCS8qIG1hYzgwMjExIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoaXMgZGV2aWNlIGluc3RhbmNlLCBpbmNsdWRpbmcKLQkgKiAgIHNwYWNlIGZvciB0aGlzIGRyaXZlcidzIHByaXZhdGUgc3RydWN0dXJlICovCi0JaHcgPSBpd2xfbGVnYWN5X2FsbG9jX2FsbChjZmcpOwotCWlmIChodyA9PSBOVUxMKSB7Ci0JCXByX2VycigiQ2FuIG5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQlwcml2ID0gaHctPnByaXY7Ci0JU0VUX0lFRUU4MDIxMV9ERVYoaHcsICZwZGV2LT5kZXYpOwotCi0JcHJpdi0+Y21kX3F1ZXVlID0gSVdMMzlfQ01EX1FVRVVFX05VTTsKLQotCS8qIDM5NDUgaGFzIG9ubHkgb25lIHZhbGlkIGNvbnRleHQgKi8KLQlwcml2LT52YWxpZF9jb250ZXh0cyA9IEJJVChJV0xfUlhPTl9DVFhfQlNTKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fSVdMX1JYT05fQ1RYOyBpKyspCi0JCXByaXYtPmNvbnRleHRzW2ldLmN0eGlkID0gaTsKLQotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnJ4b25fY21kID0gUkVQTFlfUlhPTjsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5yeG9uX3RpbWluZ19jbWQgPSBSRVBMWV9SWE9OX1RJTUlORzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5yeG9uX2Fzc29jX2NtZCA9IFJFUExZX1JYT05fQVNTT0M7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ucW9zX2NtZCA9IFJFUExZX1FPU19QQVJBTTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5hcF9zdGFfaWQgPSBJV0xfQVBfSUQ7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ud2VwX2tleV9jbWQgPSBSRVBMWV9XRVBLRVk7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uaW50ZXJmYWNlX21vZGVzID0KLQkJQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHwKLQkJQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5pYnNzX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0lCU1M7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uc3RhdGlvbl9kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10udW51c2VkX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKLQotCS8qCi0JICogRGlzYWJsaW5nIGhhcmR3YXJlIHNjYW4gbWVhbnMgdGhhdCBtYWM4MDIxMSB3aWxsIHBlcmZvcm0gc2NhbnMKLQkgKiAidGhlIGhhcmQgd2F5IiwgcmF0aGVyIHRoYW4gdXNpbmcgZGV2aWNlJ3Mgc2Nhbi4KLQkgKi8KLQlpZiAoaXdsMzk0NV9tb2RfcGFyYW1zLmRpc2FibGVfaHdfc2NhbikgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRGlzYWJsaW5nIGh3X3NjYW5cbiIpOwotCQlpd2wzOTQ1X2h3X29wcy5od19zY2FuID0gTlVMTDsKLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiKioqIExPQUQgRFJJVkVSICoqKlxuIik7Ci0JcHJpdi0+Y2ZnID0gY2ZnOwotCXByaXYtPnBjaV9kZXYgPSBwZGV2OwotCXByaXYtPmludGFfbWFzayA9IENTUl9JTklfU0VUX01BU0s7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShwcml2KSkKLQkJSVdMX0VSUihwcml2LCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDIuIEluaXRpYWxpemluZyBQQ0kgYnVzCi0JICogKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwY2lfZGlzYWJsZV9saW5rX3N0YXRlKHBkZXYsIFBDSUVfTElOS19TVEFURV9MMFMgfCBQQ0lFX0xJTktfU1RBVEVfTDEgfAotCQkJCVBDSUVfTElOS19TVEFURV9DTEtQTSk7Ci0KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXRfaWVlZTgwMjExX2ZyZWVfaHc7Ci0JfQotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwotCWlmICghZXJyKQotCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7Ci0JaWYgKGVycikgewotCQlJV0xfV0FSTihwcml2LCAiTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOwotCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0JfQotCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwotCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X3BjaV9kaXNhYmxlX2RldmljZTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDMuIFJlYWQgUkVWIFJlZ2lzdGVyCi0JICogKioqKioqKioqKioqKioqKioqKiovCi0JcHJpdi0+aHdfYmFzZSA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKLQlpZiAoIXByaXYtPmh3X2Jhc2UpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczsKLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicGNpX3Jlc291cmNlX2xlbiA9IDB4JTA4bGx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInBjaV9yZXNvdXJjZV9iYXNlID0gJXBcbiIsIHByaXYtPmh3X2Jhc2UpOwotCi0JLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAotCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MSwgMHgwMCk7Ci0KLQkvKiB0aGVzZSBzcGluIGxvY2tzIHdpbGwgYmUgdXNlZCBpbiBhcG1fb3BzLmluaXQgYW5kIEVFUFJPTSBhY2Nlc3MKLQkgKiB3ZSBzaG91bGQgaW5pdCBub3cKLQkgKi8KLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cmVnX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKLQotCS8qCi0JICogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciBqdXN0IGluIGNhc2UgaXQgaXMgaW4gYQotCSAqIHN0cmFuZ2Ugc3RhdGUgLi4uIGxpa2UgYmVpbmcgbGVmdCBzdHJhbmRlZCBieSBhIHByaW1hcnkga2VybmVsCi0JICogYW5kIHRoaXMgaXMgbm93IHRoZSBrZHVtcCBrZXJuZWwgdHJ5aW5nIHRvIHN0YXJ0IHVwCi0JICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiA0LiBSZWFkIEVFUFJPTQotCSAqICoqKioqKioqKioqKioqKioqKioqLwotCi0JLyogUmVhZCB0aGUgRUVQUk9NICovCi0JZXJyID0gaXdsX2xlZ2FjeV9lZXByb21faW5pdChwcml2KTsKLQlpZiAoZXJyKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBpbml0IEVFUFJPTVxuIik7Ci0JCWdvdG8gb3V0X2lvdW5tYXA7Ci0JfQotCS8qIE1BQyBBZGRyZXNzIGxvY2F0aW9uIGluIEVFUFJPTSBzYW1lIGZvciAzOTQ1LzQ5NjUgKi8KLQllZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJNQUMgYWRkcmVzczogJXBNXG4iLCBlZXByb20tPm1hY19hZGRyZXNzKTsKLQlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihwcml2LT5odywgZWVwcm9tLT5tYWNfYWRkcmVzcyk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiA1LiBTZXR1cCBIVyBDb25zdGFudHMKLQkgKiAqKioqKioqKioqKioqKioqKioqKi8KLQkvKiBEZXZpY2Utc3BlY2lmaWMgc2V0dXAgKi8KLQlpZiAoaXdsMzk0NV9od19zZXRfaHdfcGFyYW1zKHByaXYpKSB7Ci0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBzZXQgaHcgc2V0dGluZ3NcbiIpOwotCQlnb3RvIG91dF9lZXByb21fZnJlZTsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiA2LiBTZXR1cCBwcml2Ci0JICogKioqKioqKioqKioqKioqKioqKiovCi0KLQllcnIgPSBpd2wzOTQ1X2luaXRfZHJ2KHByaXYpOwotCWlmIChlcnIpIHsKLQkJSVdMX0VSUihwcml2LCAiaW5pdGlhbGl6aW5nIGRyaXZlciBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF91bnNldF9od19wYXJhbXM7Ci0JfQotCi0JSVdMX0lORk8ocHJpdiwgIkRldGVjdGVkIEludGVsIFdpcmVsZXNzIFdpRmkgTGluayAlc1xuIiwKLQkJcHJpdi0+Y2ZnLT5uYW1lKTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDcuIFNldHVwIFNlcnZpY2VzCi0JICogKioqKioqKioqKioqKioqKioqKiovCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bF9sZWdhY3lfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXBjaV9lbmFibGVfbXNpKHByaXYtPnBjaV9kZXYpOwotCi0JZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+cGNpX2Rldi0+aXJxLCBpd2xfbGVnYWN5X2lzciwKLQkJCSAgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBwcml2KTsKLQlpZiAoZXJyKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBwcml2LT5wY2lfZGV2LT5pcnEpOwotCQlnb3RvIG91dF9kaXNhYmxlX21zaTsKLQl9Ci0KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaXdsMzk0NV9hdHRyaWJ1dGVfZ3JvdXApOwotCWlmIChlcnIpIHsKLQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBkZXZpY2UgYXR0cmlidXRlc1xuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfaXJxOwotCX0KLQotCWl3bF9sZWdhY3lfc2V0X3J4b25fY2hhbm5lbChwcml2LAotCQkJICAgICAmcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0uY2hhbm5lbHNbNV0sCi0JCQkgICAgICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0JaXdsMzk0NV9zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOwotCWl3bDM5NDVfc2V0dXBfcnhfaGFuZGxlcnMocHJpdik7Ci0JaXdsX2xlZ2FjeV9wb3dlcl9pbml0aWFsaXplKHByaXYpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDguIFNldHVwIGFuZCBSZWdpc3RlciBtYWM4MDIxMQotCSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCi0JZXJyID0gaXdsMzk0NV9zZXR1cF9tYWMocHJpdik7Ci0JaWYgKGVycikKLQkJZ290byAgb3V0X3JlbW92ZV9zeXNmczsKLQotCWVyciA9IGl3bF9sZWdhY3lfZGJnZnNfcmVnaXN0ZXIocHJpdiwgRFJWX05BTUUpOwotCWlmIChlcnIpCi0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBmaWxlcy4gSWdub3JpbmcgZXJyb3I6ICVkXG4iLCBlcnIpOwotCi0JLyogU3RhcnQgbW9uaXRvcmluZyB0aGUga2lsbHN3aXRjaCAqLwotCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5fMzk0NS5yZmtpbGxfcG9sbCwKLQkJCSAgIDIgKiBIWik7Ci0KLQlyZXR1cm4gMDsKLQotIG91dF9yZW1vdmVfc3lzZnM6Ci0JZGVzdHJveV93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQlwcml2LT53b3JrcXVldWUgPSBOVUxMOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpd2wzOTQ1X2F0dHJpYnV0ZV9ncm91cCk7Ci0gb3V0X3JlbGVhc2VfaXJxOgotCWZyZWVfaXJxKHByaXYtPnBjaV9kZXYtPmlycSwgcHJpdik7Ci0gb3V0X2Rpc2FibGVfbXNpOgotCXBjaV9kaXNhYmxlX21zaShwcml2LT5wY2lfZGV2KTsKLQlpd2xfbGVnYWN5X2ZyZWVfZ2Vvcyhwcml2KTsKLQlpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7Ci0gb3V0X3Vuc2V0X2h3X3BhcmFtczoKLQlpd2wzOTQ1X3Vuc2V0X2h3X3BhcmFtcyhwcml2KTsKLSBvdXRfZWVwcm9tX2ZyZWU6Ci0JaXdsX2xlZ2FjeV9lZXByb21fZnJlZShwcml2KTsKLSBvdXRfaW91bm1hcDoKLQlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5od19iYXNlKTsKLSBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U6Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLSBvdXRfaWVlZTgwMjExX2ZyZWVfaHc6Ci0JaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKHByaXYpOwotCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKLSBvdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGl3bDM5NDVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIioqKiBVTkxPQUQgRFJJVkVSICoqKlxuIik7Ci0KLQlpd2xfbGVnYWN5X2RiZ2ZzX3VucmVnaXN0ZXIocHJpdik7Ci0KLQlzZXRfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCi0JaXdsX2xlZ2FjeV9sZWRzX2V4aXQocHJpdik7Ci0KLQlpZiAocHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkgewotCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhwcml2LT5odyk7Ci0JCXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAwOwotCX0gZWxzZSB7Ci0JCWl3bDM5NDVfZG93bihwcml2KTsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBkZXZpY2UgaXMgcmVzZXQgdG8gbG93IHBvd2VyIGJlZm9yZSB1bmxvYWRpbmcgZHJpdmVyLgotCSAqIFRoaXMgbWF5IGJlIHJlZHVuZGFudCB3aXRoIGl3bF9kb3duKCksIGJ1dCB0aGVyZSBhcmUgcGF0aHMgdG8KLQkgKiBydW4gaXdsX2Rvd24oKSB3aXRob3V0IGNhbGxpbmcgYXBtX29wcy5zdG9wKCksIGFuZCB0aGVyZSBhcmUKLQkgKiBwYXRocyB0byBhdm9pZCBydW5uaW5nIGl3bF9kb3duKCkgYXQgYWxsIGJlZm9yZSBsZWF2aW5nIGRyaXZlci4KLQkgKiBUaGlzIChpbmV4cGVuc2l2ZSkgY2FsbCAqbWFrZXMgc3VyZSogZGV2aWNlIGlzIHJlc2V0LgotCSAqLwotCWl3bF9sZWdhY3lfYXBtX3N0b3AocHJpdik7Ci0KLQkvKiBtYWtlIHN1cmUgd2UgZmx1c2ggYW55IHBlbmRpbmcgaXJxIG9yCi0JICogdGFza2xldCBmb3IgdGhlIGRyaXZlcgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaXdsX2xlZ2FjeV9kaXNhYmxlX2ludGVycnVwdHMocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaXdsMzk0NV9zeW5jaHJvbml6ZV9pcnEocHJpdik7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaXdsMzk0NV9hdHRyaWJ1dGVfZ3JvdXApOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5fMzk0NS5yZmtpbGxfcG9sbCk7Ci0KLQlpd2wzOTQ1X2RlYWxsb2NfdWNvZGVfcGNpKHByaXYpOwotCi0JaWYgKHByaXYtPnJ4cS5iZCkKLQkJaXdsMzk0NV9yeF9xdWV1ZV9mcmVlKHByaXYsICZwcml2LT5yeHEpOwotCWl3bDM5NDVfaHdfdHhxX2N0eF9mcmVlKHByaXYpOwotCi0JaXdsMzk0NV91bnNldF9od19wYXJhbXMocHJpdik7Ci0KLQkvKm5ldGlmX3N0b3BfcXVldWUoZGV2KTsgKi8KLQlmbHVzaF93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQotCS8qIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IGNhbGxzIGl3bDM5NDVfbWFjX3N0b3AsIHdoaWNoIGZsdXNoZXMKLQkgKiBwcml2LT53b3JrcXVldWUuLi4gc28gd2UgY2FuJ3QgdGFrZSBkb3duIHRoZSB3b3JrcXVldWUKLQkgKiB1bnRpbCBub3cuLi4gKi8KLQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCXByaXYtPndvcmtxdWV1ZSA9IE5VTEw7Ci0JaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKHByaXYpOwotCi0JZnJlZV9pcnEocGRldi0+aXJxLCBwcml2KTsKLQlwY2lfZGlzYWJsZV9tc2kocGRldik7Ci0KLQlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5od19iYXNlKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7Ci0JaXdsX2xlZ2FjeV9mcmVlX2dlb3MocHJpdik7Ci0Ja2ZyZWUocHJpdi0+c2Nhbl9jbWQpOwotCWlmIChwcml2LT5iZWFjb25fc2tiKQotCQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCi0JaWVlZTgwMjExX2ZyZWVfaHcocHJpdi0+aHcpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGRyaXZlciBhbmQgbW9kdWxlIGVudHJ5IHBvaW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXdsMzk0NV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBEUlZfTkFNRSwKLQkuaWRfdGFibGUgPSBpd2wzOTQ1X2h3X2NhcmRfaWRzLAotCS5wcm9iZSA9IGl3bDM5NDVfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpd2wzOTQ1X3BjaV9yZW1vdmUpLAotCS5kcml2ZXIucG0gPSBJV0xfTEVHQUNZX1BNX09QUywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGl3bDM5NDVfaW5pdCh2b2lkKQotewotCi0JaW50IHJldDsKLQlwcl9pbmZvKERSVl9ERVNDUklQVElPTiAiLCAiIERSVl9WRVJTSU9OICJcbiIpOwotCXByX2luZm8oRFJWX0NPUFlSSUdIVCAiXG4iKTsKLQotCXJldCA9IGl3bDM5NDVfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciByYXRlIGNvbnRyb2wgYWxnb3JpdGhtOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpd2wzOTQ1X2RyaXZlcik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIlVuYWJsZSB0byBpbml0aWFsaXplIFBDSSBtb2R1bGVcbiIpOwotCQlnb3RvIGVycm9yX3JlZ2lzdGVyOwotCX0KLQotCXJldHVybiByZXQ7Ci0KLWVycm9yX3JlZ2lzdGVyOgotCWl3bDM5NDVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXdsMzk0NV9leGl0KHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpd2wzOTQ1X2RyaXZlcik7Ci0JaXdsMzk0NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOwotfQotCi1NT0RVTEVfRklSTVdBUkUoSVdMMzk0NV9NT0RVTEVfRklSTVdBUkUoSVdMMzk0NV9VQ09ERV9BUElfTUFYKSk7Ci0KLW1vZHVsZV9wYXJhbV9uYW1lZChhbnRlbm5hLCBpd2wzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSwgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MoYW50ZW5uYSwgInNlbGVjdCBhbnRlbm5hICgxPU1haW4sIDI9QXV4LCBkZWZhdWx0IDAgW2JvdGhdKSIpOwotbW9kdWxlX3BhcmFtX25hbWVkKHN3Y3J5cHRvLCBpd2wzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhzd2NyeXB0bywKLQkJInVzaW5nIHNvZnR3YXJlIGNyeXB0byAoZGVmYXVsdCAxIFtzb2Z0d2FyZV0pIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZV9od19zY2FuLCBpd2wzOTQ1X21vZF9wYXJhbXMuZGlzYWJsZV9od19zY2FuLAotCQlpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2h3X3NjYW4sICJkaXNhYmxlIGhhcmR3YXJlIHNjYW5uaW5nIChkZWZhdWx0IDEpIik7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGl3bGVnYWN5X2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgb3V0cHV0IG1hc2siKTsKLSNlbmRpZgotbW9kdWxlX3BhcmFtX25hbWVkKGZ3X3Jlc3RhcnQsIGl3bDM5NDVfbW9kX3BhcmFtcy5yZXN0YXJ0X2Z3LCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhmd19yZXN0YXJ0LCAicmVzdGFydCBmaXJtd2FyZSBpbiBjYXNlIG9mIGVycm9yIik7Ci0KLW1vZHVsZV9leGl0KGl3bDM5NDVfZXhpdCk7Ci1tb2R1bGVfaW5pdChpd2wzOTQ1X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsNDk2NS1iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmYmE5ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDMyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLWFzcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQotI2RlZmluZSBEUlZfTkFNRSAgICAgICAgIml3bDQ5NjUiCi0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS5oIgotI2luY2x1ZGUgIml3bC00OTY1LWxlZC5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBtb2R1bGUgYm9pbGVyIHBsYXRlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIG1vZHVsZSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4KLSAqLwotI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIkludGVsKFIpIFdpcmVsZXNzIFdpRmkgNDk2NSBkcml2ZXIgZm9yIExpbnV4IgotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0jZGVmaW5lIFZEICJkIgotI2Vsc2UKLSNkZWZpbmUgVkQKLSNlbmRpZgotCi0jZGVmaW5lIERSVl9WRVJTSU9OICAgICBJV0xXSUZJX1ZFUlNJT04gVkQKLQotCi1NT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0NSSVBUSU9OKTsKLU1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKLU1PRFVMRV9BVVRIT1IoRFJWX0NPUFlSSUdIVCAiICIgRFJWX0FVVEhPUik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVMoIml3bDQ5NjUiKTsKLQotdm9pZCBpd2w0OTY1X3VwZGF0ZV9jaGFpbl9mbGFncyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pIHsKLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCQkJaWYgKGN0eC0+YWN0aXZlLnJ4X2NoYWluICE9IGN0eC0+c3RhZ2luZy5yeF9jaGFpbikKLQkJCQlpd2xfbGVnYWN5X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfY2xlYXJfZnJlZV9mcmFtZXMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiJWQgZnJhbWVzIG9uIHByZS1hbGxvY2F0ZWQgaGVhcCBvbiBjbGVhci5cbiIsCi0JCSAgICAgICBwcml2LT5mcmFtZXNfY291bnQpOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZwcml2LT5mcmVlX2ZyYW1lcykpIHsKLQkJZWxlbWVudCA9IHByaXYtPmZyZWVfZnJhbWVzLm5leHQ7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCQlrZnJlZShsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2xfZnJhbWUsIGxpc3QpKTsKLQkJcHJpdi0+ZnJhbWVzX2NvdW50LS07Ci0JfQotCi0JaWYgKHByaXYtPmZyYW1lc19jb3VudCkgewotCQlJV0xfV0FSTihwcml2LCAiJWQgZnJhbWVzIHN0aWxsIGluIHVzZS4gIERpZCB3ZSBsb3NlIG9uZT9cbiIsCi0JCQkgICAgcHJpdi0+ZnJhbWVzX2NvdW50KTsKLQkJcHJpdi0+ZnJhbWVzX2NvdW50ID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2ZyYW1lICppd2w0OTY1X2dldF9mcmVlX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2ZyYW1lICpmcmFtZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCWlmIChsaXN0X2VtcHR5KCZwcml2LT5mcmVlX2ZyYW1lcykpIHsKLQkJZnJhbWUgPSBremFsbG9jKHNpemVvZigqZnJhbWUpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFmcmFtZSkgewotCQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lIVxuIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCXByaXYtPmZyYW1lc19jb3VudCsrOwotCQlyZXR1cm4gZnJhbWU7Ci0JfQotCi0JZWxlbWVudCA9IHByaXYtPmZyZWVfZnJhbWVzLm5leHQ7Ci0JbGlzdF9kZWwoZWxlbWVudCk7Ci0JcmV0dXJuIGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bF9mcmFtZSwgbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfZnJlZV9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfZnJhbWUgKmZyYW1lKQotewotCW1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKCpmcmFtZSkpOwotCWxpc3RfYWRkKCZmcmFtZS0+bGlzdCwgJnByaXYtPmZyZWVfZnJhbWVzKTsKLX0KLQotc3RhdGljIHUzMiBpd2w0OTY1X2ZpbGxfYmVhY29uX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKLQkJCQkgaW50IGxlZnQpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCFwcml2LT5iZWFjb25fc2tiKQotCQlyZXR1cm4gMDsKLQotCWlmIChwcml2LT5iZWFjb25fc2tiLT5sZW4gPiBsZWZ0KQotCQlyZXR1cm4gMDsKLQotCW1lbWNweShoZHIsIHByaXYtPmJlYWNvbl9za2ItPmRhdGEsIHByaXYtPmJlYWNvbl9za2ItPmxlbik7Ci0KLQlyZXR1cm4gcHJpdi0+YmVhY29uX3NrYi0+bGVuOwotfQotCi0vKiBQYXJzZSB0aGUgYmVhY29uIGZyYW1lIHRvIGZpbmQgdGhlIFRJTSBlbGVtZW50IGFuZCBzZXQgdGltX2lkeCAmIHRpbV9zaXplICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3NldF9iZWFjb25fdGltKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3R4X2JlYWNvbl9jbWQgKnR4X2JlYWNvbl9jbWQsCi0JCQkgICAgICAgdTggKmJlYWNvbiwgdTMyIGZyYW1lX3NpemUpCi17Ci0JdTE2IHRpbV9pZHg7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWJlYWNvbjsKLQotCS8qCi0JICogVGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvIGZyYW1lIHN0YXJ0IGJ1dCB3ZSBzdGFydCBsb29raW5nIGF0IHRoZQotCSAqIHZhcmlhYmxlLWxlbmd0aCBwYXJ0IG9mIHRoZSBiZWFjb24uCi0JICovCi0JdGltX2lkeCA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlIC0gYmVhY29uOwotCi0JLyogUGFyc2UgdmFyaWFibGUtbGVuZ3RoIGVsZW1lbnRzIG9mIGJlYWNvbiB0byBmaW5kIFdMQU5fRUlEX1RJTSAqLwotCXdoaWxlICgodGltX2lkeCA8IChmcmFtZV9zaXplIC0gMikpICYmCi0JCQkoYmVhY29uW3RpbV9pZHhdICE9IFdMQU5fRUlEX1RJTSkpCi0JCXRpbV9pZHggKz0gYmVhY29uW3RpbV9pZHgrMV0gKyAyOwotCi0JLyogSWYgVElNIGZpZWxkIHdhcyBmb3VuZCwgc2V0IHZhcmlhYmxlcyAqLwotCWlmICgodGltX2lkeCA8IChmcmFtZV9zaXplIC0gMSkpICYmIChiZWFjb25bdGltX2lkeF0gPT0gV0xBTl9FSURfVElNKSkgewotCQl0eF9iZWFjb25fY21kLT50aW1faWR4ID0gY3B1X3RvX2xlMTYodGltX2lkeCk7Ci0JCXR4X2JlYWNvbl9jbWQtPnRpbV9zaXplID0gYmVhY29uW3RpbV9pZHgrMV07Ci0JfSBlbHNlCi0JCUlXTF9XQVJOKHByaXYsICJVbmFibGUgdG8gZmluZCBUSU0gRWxlbWVudCBpbiBiZWFjb25cbiIpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGl3bDQ5NjVfaHdfZ2V0X2JlYWNvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICBzdHJ1Y3QgaXdsX2ZyYW1lICpmcmFtZSkKLXsKLQlzdHJ1Y3QgaXdsX3R4X2JlYWNvbl9jbWQgKnR4X2JlYWNvbl9jbWQ7Ci0JdTMyIGZyYW1lX3NpemU7Ci0JdTMyIHJhdGVfZmxhZ3M7Ci0JdTMyIHJhdGU7Ci0JLyoKLQkgKiBXZSBoYXZlIHRvIHNldCB1cCB0aGUgVFggY29tbWFuZCwgdGhlIFRYIEJlYWNvbiBjb21tYW5kLCBhbmQgdGhlCi0JICogYmVhY29uIGNvbnRlbnRzLgotCSAqLwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCFwcml2LT5iZWFjb25fY3R4KSB7Ci0JCUlXTF9FUlIocHJpdiwgInRyeWluZyB0byBidWlsZCBiZWFjb24gdy9vIGJlYWNvbiBjb250ZXh0IVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIEluaXRpYWxpemUgbWVtb3J5ICovCi0JdHhfYmVhY29uX2NtZCA9ICZmcmFtZS0+dS5iZWFjb247Ci0JbWVtc2V0KHR4X2JlYWNvbl9jbWQsIDAsIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOwotCi0JLyogU2V0IHVwIFRYIGJlYWNvbiBjb250ZW50cyAqLwotCWZyYW1lX3NpemUgPSBpd2w0OTY1X2ZpbGxfYmVhY29uX2ZyYW1lKHByaXYsIHR4X2JlYWNvbl9jbWQtPmZyYW1lLAotCQkJCXNpemVvZihmcmFtZS0+dSkgLSBzaXplb2YoKnR4X2JlYWNvbl9jbWQpKTsKLQlpZiAoV0FSTl9PTl9PTkNFKGZyYW1lX3NpemUgPiBNQVhfTVBEVV9TSVpFKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFmcmFtZV9zaXplKQotCQlyZXR1cm4gMDsKLQotCS8qIFNldCB1cCBUWCBjb21tYW5kIGZpZWxkcyAqLwotCXR4X2JlYWNvbl9jbWQtPnR4LmxlbiA9IGNwdV90b19sZTE2KCh1MTYpZnJhbWVfc2l6ZSk7Ci0JdHhfYmVhY29uX2NtZC0+dHguc3RhX2lkID0gcHJpdi0+YmVhY29uX2N0eC0+YmNhc3Rfc3RhX2lkOwotCXR4X2JlYWNvbl9jbWQtPnR4LnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOwotCXR4X2JlYWNvbl9jbWQtPnR4LnR4X2ZsYWdzID0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSyB8Ci0JCVRYX0NNRF9GTEdfVFNGX01TSyB8IFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLOwotCi0JLyogU2V0IHVwIFRYIGJlYWNvbiBjb21tYW5kIGZpZWxkcyAqLwotCWl3bDQ5NjVfc2V0X2JlYWNvbl90aW0ocHJpdiwgdHhfYmVhY29uX2NtZCwgKHU4ICopdHhfYmVhY29uX2NtZC0+ZnJhbWUsCi0JCQkgICBmcmFtZV9zaXplKTsKLQotCS8qIFNldCB1cCBwYWNrZXQgcmF0ZSBhbmQgZmxhZ3MgKi8KLQlyYXRlID0gaXdsX2xlZ2FjeV9nZXRfbG93ZXN0X3BsY3AocHJpdiwgcHJpdi0+YmVhY29uX2N0eCk7Ci0JcHJpdi0+bWdtdF90eF9hbnQgPSBpd2w0OTY1X3RvZ2dsZV90eF9hbnQocHJpdiwgcHJpdi0+bWdtdF90eF9hbnQsCi0JCQkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCXJhdGVfZmxhZ3MgPSBpd2w0OTY1X2FudF9pZHhfdG9fZmxhZ3MocHJpdi0+bWdtdF90eF9hbnQpOwotCWlmICgocmF0ZSA+PSBJV0xfRklSU1RfQ0NLX1JBVEUpICYmIChyYXRlIDw9IElXTF9MQVNUX0NDS19SQVRFKSkKLQkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOwotCXR4X2JlYWNvbl9jbWQtPnR4LnJhdGVfbl9mbGFncyA9IGl3bDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlLAotCQkJcmF0ZV9mbGFncyk7Ci0KLQlyZXR1cm4gc2l6ZW9mKCp0eF9iZWFjb25fY21kKSArIGZyYW1lX3NpemU7Ci19Ci0KLWludCBpd2w0OTY1X3NlbmRfYmVhY29uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9mcmFtZSAqZnJhbWU7Ci0JdW5zaWduZWQgaW50IGZyYW1lX3NpemU7Ci0JaW50IHJjOwotCi0JZnJhbWUgPSBpd2w0OTY1X2dldF9mcmVlX2ZyYW1lKHByaXYpOwotCWlmICghZnJhbWUpIHsKLQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IG9idGFpbiBmcmVlIGZyYW1lIGJ1ZmZlciBmb3IgYmVhY29uICIKLQkJCSAgImNvbW1hbmQuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZnJhbWVfc2l6ZSA9IGl3bDQ5NjVfaHdfZ2V0X2JlYWNvbl9jbWQocHJpdiwgZnJhbWUpOwotCWlmICghZnJhbWVfc2l6ZSkgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBjb25maWd1cmluZyB0aGUgYmVhY29uIGNvbW1hbmRcbiIpOwotCQlpd2w0OTY1X2ZyZWVfZnJhbWUocHJpdiwgZnJhbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1RYX0JFQUNPTiwgZnJhbWVfc2l6ZSwKLQkJCSAgICAgICZmcmFtZS0+dS5jbWRbMF0pOwotCi0JaXdsNDk2NV9mcmVlX2ZyYW1lKHByaXYsIGZyYW1lKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGl3bDQ5NjVfdGZkX3RiX2dldF9hZGRyKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCkKLXsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKLQotCWRtYV9hZGRyX3QgYWRkciA9IGdldF91bmFsaWduZWRfbGUzMigmdGItPmxvKTsKLQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCi0JCWFkZHIgfD0KLQkJKChkbWFfYWRkcl90KShsZTE2X3RvX2NwdSh0Yi0+aGlfbl9sZW4pICYgMHhGKSA8PCAxNikgPDwgMTY7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQotc3RhdGljIGlubGluZSB1MTYgaXdsNDk2NV90ZmRfdGJfZ2V0X2xlbihzdHJ1Y3QgaXdsX3RmZCAqdGZkLCB1OCBpZHgpCi17Ci0Jc3RydWN0IGl3bF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07Ci0KLQlyZXR1cm4gbGUxNl90b19jcHUodGItPmhpX25fbGVuKSA+PiA0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsNDk2NV90ZmRfc2V0X3RiKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCwKLQkJCQkgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbikKLXsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKLQl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKLQotCXB1dF91bmFsaWduZWRfbGUzMihhZGRyLCAmdGItPmxvKTsKLQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCi0JCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOwotCi0JdGItPmhpX25fbGVuID0gY3B1X3RvX2xlMTYoaGlfbl9sZW4pOwotCi0JdGZkLT5udW1fdGJzID0gaWR4ICsgMTsKLX0KLQotc3RhdGljIGlubGluZSB1OCBpd2w0OTY1X3RmZF9nZXRfbnVtX3RicyhzdHJ1Y3QgaXdsX3RmZCAqdGZkKQotewotCXJldHVybiB0ZmQtPm51bV90YnMgJiAweDFmOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfaHdfdHhxX2ZyZWVfdGZkIC0gRnJlZSBhbGwgY2h1bmtzIHJlZmVyZW5jZWQgYnkgVEZEIFt0eHEtPnEucmVhZF9wdHJdCi0gKiBAcHJpdiAtIGRyaXZlciBwcml2YXRlIGRhdGEKLSAqIEB0eHEgLSB0eCBxdWV1ZQotICoKLSAqIERvZXMgTk9UIGFkdmFuY2UgYW55IFRGRCBjaXJjdWxhciBidWZmZXIgcmVhZC93cml0ZSBpbmRleGVzCi0gKiBEb2VzIE5PVCBmcmVlIHRoZSBURkQgaXRzZWxmICh3aGljaCBpcyB3aXRoaW4gY2lyY3VsYXIgYnVmZmVyKQotICovCi12b2lkIGl3bDQ5NjVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQotewotCXN0cnVjdCBpd2xfdGZkICp0ZmRfdG1wID0gKHN0cnVjdCBpd2xfdGZkICopdHhxLT50ZmRzOwotCXN0cnVjdCBpd2xfdGZkICp0ZmQ7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IHByaXYtPnBjaV9kZXY7Ci0JaW50IGluZGV4ID0gdHhxLT5xLnJlYWRfcHRyOwotCWludCBpOwotCWludCBudW1fdGJzOwotCi0JdGZkID0gJnRmZF90bXBbaW5kZXhdOwotCi0JLyogU2FuaXR5IGNoZWNrIG9uIG51bWJlciBvZiBjaHVua3MgKi8KLQludW1fdGJzID0gaXdsNDk2NV90ZmRfZ2V0X251bV90YnModGZkKTsKLQotCWlmIChudW1fdGJzID49IElXTF9OVU1fT0ZfVEJTKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlRvbyBtYW55IGNodW5rczogJWlcbiIsIG51bV90YnMpOwotCQkvKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KLQkJcmV0dXJuOwotCX0KLQotCS8qIFVubWFwIHR4X2NtZCAqLwotCWlmIChudW1fdGJzKQotCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwKLQkJCQlkbWFfdW5tYXBfYWRkcigmdHhxLT5tZXRhW2luZGV4XSwgbWFwcGluZyksCi0JCQkJZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2luZGV4XSwgbGVuKSwKLQkJCQlQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JLyogVW5tYXAgY2h1bmtzLCBpZiBhbnkuICovCi0JZm9yIChpID0gMTsgaSA8IG51bV90YnM7IGkrKykKLQkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGl3bDQ5NjVfdGZkX3RiX2dldF9hZGRyKHRmZCwgaSksCi0JCQkJaXdsNDk2NV90ZmRfdGJfZ2V0X2xlbih0ZmQsIGkpLAotCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JLyogZnJlZSBTS0IgKi8KLQlpZiAodHhxLT50eGIpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCQlza2IgPSB0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYjsKLQotCQkvKiBjYW4gYmUgY2FsbGVkIGZyb20gaXJxcy1kaXNhYmxlZCBjb250ZXh0ICovCi0JCWlmIChza2IpIHsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQl0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYiA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0KLWludCBpd2w0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLAotCQkJCSB1OCByZXNldCwgdTggcGFkKQotewotCXN0cnVjdCBpd2xfcXVldWUgKnE7Ci0Jc3RydWN0IGl3bF90ZmQgKnRmZCwgKnRmZF90bXA7Ci0JdTMyIG51bV90YnM7Ci0KLQlxID0gJnR4cS0+cTsKLQl0ZmRfdG1wID0gKHN0cnVjdCBpd2xfdGZkICopdHhxLT50ZmRzOwotCXRmZCA9ICZ0ZmRfdG1wW3EtPndyaXRlX3B0cl07Ci0KLQlpZiAocmVzZXQpCi0JCW1lbXNldCh0ZmQsIDAsIHNpemVvZigqdGZkKSk7Ci0KLQludW1fdGJzID0gaXdsNDk2NV90ZmRfZ2V0X251bV90YnModGZkKTsKLQotCS8qIEVhY2ggVEZEIGNhbiBwb2ludCB0byBhIG1heGltdW0gMjAgVHggYnVmZmVycyAqLwotCWlmIChudW1fdGJzID49IElXTF9OVU1fT0ZfVEJTKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGNhbiBub3Qgc2VuZCBtb3JlIHRoYW4gJWQgY2h1bmtzXG4iLAotCQkJICBJV0xfTlVNX09GX1RCUyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCUJVR19PTihhZGRyICYgfkRNQV9CSVRfTUFTSygzNikpOwotCWlmICh1bmxpa2VseShhZGRyICYgfklXTF9UWF9ETUFfTUFTSykpCi0JCUlXTF9FUlIocHJpdiwgIlVuYWxpZ25lZCBhZGRyZXNzID0gJWxseFxuIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyKTsKLQotCWl3bDQ5NjVfdGZkX3NldF90Yih0ZmQsIG51bV90YnMsIGFkZHIsIGxlbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRlbGwgbmljIHdoZXJlIHRvIGZpbmQgY2lyY3VsYXIgYnVmZmVyIG9mIFR4IEZyYW1lIERlc2NyaXB0b3JzIGZvcgotICogZ2l2ZW4gVHggcXVldWUsIGFuZCBlbmFibGUgdGhlIERNQSBjaGFubmVsIHVzZWQgZm9yIHRoYXQgcXVldWUuCi0gKgotICogNDk2NSBzdXBwb3J0cyB1cCB0byAxNiBUeCBxdWV1ZXMgaW4gRFJBTSwgbWFwcGVkIHRvIHVwIHRvIDggVHggRE1BCi0gKiBjaGFubmVscyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuCi0gKi8KLWludCBpd2w0OTY1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKLXsKLQlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOwotCi0JLyogQ2lyY3VsYXIgYnVmZmVyIChURkQgcXVldWUgaW4gRFJBTSkgcGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCi0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9NRU1fQ0JCQ19RVUVVRSh0eHFfaWQpLAotCQkJICAgICB0eHEtPnEuZG1hX2FkZHIgPj4gOCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdlbmVyaWMgUlggaGFuZGxlciBpbXBsZW1lbnRhdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yeF9yZXBseV9hbGl2ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9hbGl2ZV9yZXNwICpwYWxpdmU7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqcHdvcms7Ci0KLQlwYWxpdmUgPSAmcGt0LT51LmFsaXZlX2ZyYW1lOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkFsaXZlIHVjb2RlIHN0YXR1cyAweCUwOFggcmV2aXNpb24gIgotCQkgICAgICAgIjB4JTAxWCAweCUwMVhcbiIsCi0JCSAgICAgICBwYWxpdmUtPmlzX3ZhbGlkLCBwYWxpdmUtPnZlcl90eXBlLAotCQkgICAgICAgcGFsaXZlLT52ZXJfc3VidHlwZSk7Ci0KLQlpZiAocGFsaXZlLT52ZXJfc3VidHlwZSA9PSBJTklUSUFMSVpFX1NVQlRZUEUpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemF0aW9uIEFsaXZlIHJlY2VpdmVkLlxuIik7Ci0JCW1lbWNweSgmcHJpdi0+Y2FyZF9hbGl2ZV9pbml0LAotCQkgICAgICAgJnBrdC0+dS5hbGl2ZV9mcmFtZSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2luaXRfYWxpdmVfcmVzcCkpOwotCQlwd29yayA9ICZwcml2LT5pbml0X2FsaXZlX3N0YXJ0OwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIEFsaXZlIHJlY2VpdmVkLlxuIik7Ci0JCW1lbWNweSgmcHJpdi0+Y2FyZF9hbGl2ZSwgJnBrdC0+dS5hbGl2ZV9mcmFtZSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3ApKTsKLQkJcHdvcmsgPSAmcHJpdi0+YWxpdmVfc3RhcnQ7Ci0JfQotCi0JLyogV2UgZGVsYXkgdGhlIEFMSVZFIHJlc3BvbnNlIGJ5IDVtcyB0bwotCSAqIGdpdmUgdGhlIEhXIFJGIEtpbGwgdGltZSB0byBhY3RpdmF0ZS4uLiAqLwotCWlmIChwYWxpdmUtPmlzX3ZhbGlkID09IFVDT0RFX1ZBTElEX09LKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCBwd29yaywKLQkJCQkgICBtc2Vjc190b19qaWZmaWVzKDUpKTsKLQllbHNlCi0JCUlXTF9XQVJOKHByaXYsICJ1Q29kZSBkaWQgbm90IHJlc3BvbmQgT0suXG4iKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2JnX3N0YXRpc3RpY3NfcGVyaW9kaWMgLSBUaW1lciBjYWxsYmFjayB0byBxdWV1ZSBzdGF0aXN0aWNzCi0gKgotICogVGhpcyBjYWxsYmFjayBpcyBwcm92aWRlZCBpbiBvcmRlciB0byBzZW5kIGEgc3RhdGlzdGljcyByZXF1ZXN0LgotICoKLSAqIFRoaXMgdGltZXIgZnVuY3Rpb24gaXMgY29udGludWFsbHkgcmVzZXQgdG8gZXhlY3V0ZSB3aXRoaW4KLSAqIFJFR19SRUNBTElCX1BFUklPRCBzZWNvbmRzIHNpbmNlIHRoZSBsYXN0IFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OCi0gKiB3YXMgcmVjZWl2ZWQuICBXZSBuZWVkIHRvIGVuc3VyZSB3ZSByZWNlaXZlIHRoZSBzdGF0aXN0aWNzIGluIG9yZGVyCi0gKiB0byB1cGRhdGUgdGhlIHRlbXBlcmF0dXJlIHVzZWQgZm9yIGNhbGlicmF0aW5nIHRoZSBUWFBPV0VSLgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX3N0YXRpc3RpY3NfcGVyaW9kaWModW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilkYXRhOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQkvKiBkb250IHNlbmQgaG9zdCBjb21tYW5kIGlmIHJmLWtpbGwgaXMgb24gKi8KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpCi0JCXJldHVybjsKLQotCWl3bF9sZWdhY3lfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3QocHJpdiwgQ01EX0FTWU5DLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnhfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsNDk2NV9iZWFjb25fbm90aWYgKmJlYWNvbiA9Ci0JCShzdHJ1Y3QgaXdsNDk2NV9iZWFjb25fbm90aWYgKilwa3QtPnUucmF3OwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXU4IHJhdGUgPSBpd2w0OTY1X2h3X2dldF9yYXRlKGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIucmF0ZV9uX2ZsYWdzKTsKLQotCUlXTF9ERUJVR19SWChwcml2LCAiYmVhY29uIHN0YXR1cyAleCByZXRyaWVzICVkIGlzcyAlZCAiCi0JCSJ0c2YgJWQgJWQgcmF0ZSAlZFxuIiwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci51LnN0YXR1cykgJiBUWF9TVEFUVVNfTVNLLAotCQliZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLmZhaWx1cmVfZnJhbWUsCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKSwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5oaWdoX3RzZiksCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+bG93X3RzZiksIHJhdGUpOwotI2VuZGlmCi0KLQlwcml2LT5pYnNzX21hbmFnZXIgPSBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcGVyZm9ybV9jdF9raWxsX3Rhc2soc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlN0b3AgYWxsIHF1ZXVlc1xuIik7Ci0KLQlpZiAocHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKLQkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKLQotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwKLQkJCUNTUl9VQ09ERV9EUlZfR1AxX1JFR19CSVRfQ1RfS0lMTF9FWElUKTsKLQlpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgZmxhZ3MpOwotCWlmICghaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KSkKLQkJaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgZmxhZ3MpOwotfQotCi0vKiBIYW5kbGUgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUgdGhhdCBjYXJkJ3MgcG93ZXIgc3RhdGUgaXMgY2hhbmdpbmcKLSAqIGR1ZSB0byBzb2Z0d2FyZSwgaGFyZHdhcmUsIG9yIGNyaXRpY2FsIHRlbXBlcmF0dXJlIFJGS0lMTCAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yeF9jYXJkX3N0YXRlX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0JdTMyIGZsYWdzID0gbGUzMl90b19jcHUocGt0LT51LmNhcmRfc3RhdGVfbm90aWYuZmxhZ3MpOwotCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gcHJpdi0+c3RhdHVzOwotCi0JSVdMX0RFQlVHX1JGX0tJTEwocHJpdiwgIkNhcmQgc3RhdGUgcmVjZWl2ZWQ6IEhXOiVzIFNXOiVzIENUOiVzXG4iLAotCQkJICAoZmxhZ3MgJiBIV19DQVJEX0RJU0FCTEVEKSA/ICJLaWxsIiA6ICJPbiIsCi0JCQkgIChmbGFncyAmIFNXX0NBUkRfRElTQUJMRUQpID8gIktpbGwiIDogIk9uIiwKLQkJCSAgKGZsYWdzICYgQ1RfQ0FSRF9ESVNBQkxFRCkgPwotCQkJICAiUmVhY2hlZCIgOiAiTm90IHJlYWNoZWQiKTsKLQotCWlmIChmbGFncyAmIChTV19DQVJEX0RJU0FCTEVEIHwgSFdfQ0FSRF9ESVNBQkxFRCB8Ci0JCSAgICAgQ1RfQ0FSRF9ESVNBQkxFRCkpIHsKLQotCQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsCi0JCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKLQotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NQlhfQywKLQkJCQkJSEJVU19UQVJHX01CWF9DX1JFR19CSVRfQ01EX0JMT0NLRUQpOwotCi0JCWlmICghKGZsYWdzICYgUlhPTl9DQVJEX0RJU0FCTEVEKSkgewotCQkJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAotCQkJCSAgICBDU1JfVUNPREVfRFJWX0dQMV9CSVRfQ01EX0JMT0NLRUQpOwotCQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUJYX0MsCi0JCQkJCUhCVVNfVEFSR19NQlhfQ19SRUdfQklUX0NNRF9CTE9DS0VEKTsKLQkJfQotCX0KLQotCWlmIChmbGFncyAmIENUX0NBUkRfRElTQUJMRUQpCi0JCWl3bDQ5NjVfcGVyZm9ybV9jdF9raWxsX3Rhc2socHJpdik7Ci0KLQlpZiAoZmxhZ3MgJiBIV19DQVJEX0RJU0FCTEVEKQotCQlzZXRfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQllbHNlCi0JCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQlpZiAoIShmbGFncyAmIFJYT05fQ0FSRF9ESVNBQkxFRCkpCi0JCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWwocHJpdik7Ci0KLQlpZiAoKHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmc3RhdHVzKSAhPQotCSAgICAgdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpKSkKLQkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShwcml2LT5ody0+d2lwaHksCi0JCQl0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpOwotCWVsc2UKLQkJd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3NldHVwX3J4X2hhbmRsZXJzIC0gSW5pdGlhbGl6ZSBSeCBoYW5kbGVyIGNhbGxiYWNrcwotICoKLSAqIFNldHVwIHRoZSBSWCBoYW5kbGVycyBmb3IgZWFjaCBvZiB0aGUgcmVwbHkgdHlwZXMgc2VudCBmcm9tIHRoZSB1Q29kZQotICogdG8gdGhlIGhvc3QuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjaGFpbnMgaW50byB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgZmlsZXMgZm9yIHRoZW0gdG8gc2V0dXAKLSAqIGFueSBoYXJkd2FyZSBzcGVjaWZpYyBoYW5kbGVycyBhcyB3ZWxsLgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3NldHVwX3J4X2hhbmRsZXJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9BTElWRV0gPSBpd2w0OTY1X3J4X3JlcGx5X2FsaXZlOwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX0VSUk9SXSA9IGl3bF9sZWdhY3lfcnhfcmVwbHlfZXJyb3I7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbQ0hBTk5FTF9TV0lUQ0hfTk9USUZJQ0FUSU9OXSA9IGl3bF9sZWdhY3lfcnhfY3NhOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NQRUNUUlVNX01FQVNVUkVfTk9USUZJQ0FUSU9OXSA9Ci0JCQlpd2xfbGVnYWN5X3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUE1fU0xFRVBfTk9USUZJQ0FUSU9OXSA9IGl3bF9sZWdhY3lfcnhfcG1fc2xlZXBfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUE1fREVCVUdfU1RBVElTVElDX05PVElGSUNdID0KLQkgICAgaXdsX2xlZ2FjeV9yeF9wbV9kZWJ1Z19zdGF0aXN0aWNzX25vdGlmOwotCXByaXYtPnJ4X2hhbmRsZXJzW0JFQUNPTl9OT1RJRklDQVRJT05dID0gaXdsNDk2NV9yeF9iZWFjb25fbm90aWY7Ci0KLQkvKgotCSAqIFRoZSBzYW1lIGhhbmRsZXIgaXMgdXNlZCBmb3IgYm90aCB0aGUgUkVQTFkgdG8gYSBkaXNjcmV0ZQotCSAqIHN0YXRpc3RpY3MgcmVxdWVzdCBmcm9tIHRoZSBob3N0IGFzIHdlbGwgYXMgZm9yIHRoZSBwZXJpb2RpYwotCSAqIHN0YXRpc3RpY3Mgbm90aWZpY2F0aW9ucyAoYWZ0ZXIgcmVjZWl2ZWQgYmVhY29ucykgZnJvbSB0aGUgdUNvZGUuCi0JICovCi0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfU1RBVElTVElDU19DTURdID0gaXdsNDk2NV9yZXBseV9zdGF0aXN0aWNzOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OXSA9IGl3bDQ5NjVfcnhfc3RhdGlzdGljczsKLQotCWl3bF9sZWdhY3lfc2V0dXBfcnhfc2Nhbl9oYW5kbGVycyhwcml2KTsKLQotCS8qIHN0YXR1cyBjaGFuZ2UgaGFuZGxlciAqLwotCXByaXYtPnJ4X2hhbmRsZXJzW0NBUkRfU1RBVEVfTk9USUZJQ0FUSU9OXSA9Ci0JCQkJCWl3bDQ5NjVfcnhfY2FyZF9zdGF0ZV9ub3RpZjsKLQotCXByaXYtPnJ4X2hhbmRsZXJzW01JU1NFRF9CRUFDT05TX05PVElGSUNBVElPTl0gPQotCSAgICBpd2w0OTY1X3J4X21pc3NlZF9iZWFjb25fbm90aWY7Ci0JLyogUnggaGFuZGxlcnMgKi8KLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9SWF9QSFlfQ01EXSA9IGl3bDQ5NjVfcnhfcmVwbHlfcnhfcGh5OwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1JYX01QRFVfQ01EXSA9IGl3bDQ5NjVfcnhfcmVwbHlfcng7Ci0JLyogYmxvY2sgYWNrICovCi0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfQ09NUFJFU1NFRF9CQV0gPSBpd2w0OTY1X3J4X3JlcGx5X2NvbXByZXNzZWRfYmE7Ci0JLyogU2V0IHVwIGhhcmR3YXJlIHNwZWNpZmljIFJ4IGhhbmRsZXJzICovCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+cnhfaGFuZGxlcl9zZXR1cChwcml2KTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3J4X2hhbmRsZSAtIE1haW4gZW50cnkgZnVuY3Rpb24gZm9yIHJlY2VpdmluZyByZXNwb25zZXMgZnJvbSB1Q29kZQotICoKLSAqIFVzZXMgdGhlIHByaXYtPnJ4X2hhbmRsZXJzIGNhbGxiYWNrIGZ1bmN0aW9uIGFycmF5IHRvIGludm9rZQotICogdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXJzLCBpbmNsdWRpbmcgY29tbWFuZCByZXNwb25zZXMsCi0gKiBmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb25zLCBhbmQgb3RoZXIgbm90aWZpY2F0aW9ucy4KLSAqLwotdm9pZCBpd2w0OTY1X3J4X2hhbmRsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGI7Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdDsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCXUzMiByLCBpOwotCWludCByZWNsYWltOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggZmlsbF9yeCA9IDA7Ci0JdTMyIGNvdW50ID0gODsKLQlpbnQgdG90YWxfZW1wdHk7Ci0KLQkvKiB1Q29kZSdzIHJlYWQgaW5kZXggKHN0b3JlZCBpbiBzaGFyZWQgRFJBTSkgaW5kaWNhdGVzIHRoZSBsYXN0IFJ4Ci0JICogYnVmZmVyIHRoYXQgdGhlIGRyaXZlciBtYXkgcHJvY2VzcyAobGFzdCBidWZmZXIgZmlsbGVkIGJ5IHVjb2RlKS4gKi8KLQlyID0gbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT5jbG9zZWRfcmJfbnVtKSAmICAweDBGRkY7Ci0JaSA9IHJ4cS0+cmVhZDsKLQotCS8qIFJ4IGludGVycnVwdCwgYnV0IG5vdGhpbmcgc2VudCBmcm9tIHVDb2RlICovCi0JaWYgKGkgPT0gcikKLQkJSVdMX0RFQlVHX1JYKHByaXYsICJyID0gJWQsIGkgPSAlZFxuIiwgciwgaSk7Ci0KLQkvKiBjYWxjdWxhdGUgdG90YWwgZnJhbWVzIG5lZWQgdG8gYmUgcmVzdG9jayBhZnRlciBoYW5kbGluZyBSWCAqLwotCXRvdGFsX2VtcHR5ID0gciAtIHJ4cS0+d3JpdGVfYWN0dWFsOwotCWlmICh0b3RhbF9lbXB0eSA8IDApCi0JCXRvdGFsX2VtcHR5ICs9IFJYX1FVRVVFX1NJWkU7Ci0KLQlpZiAodG90YWxfZW1wdHkgPiAoUlhfUVVFVUVfU0laRSAvIDIpKQotCQlmaWxsX3J4ID0gMTsKLQotCXdoaWxlIChpICE9IHIpIHsKLQkJaW50IGxlbjsKLQotCQlyeGIgPSByeHEtPnF1ZXVlW2ldOwotCi0JCS8qIElmIGFuIFJYQiBkb2Vzbid0IGhhdmUgYSBSeCBxdWV1ZSBzbG90IGFzc29jaWF0ZWQgd2l0aCBpdCwKLQkJICogdGhlbiBhIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHRoZSBxdWV1ZSByZWZpbGxpbmcKLQkJICogcm91dGluZXMgLS0gY2F0Y2ggaXQgaGVyZSAqLwotCQlCVUdfT04ocnhiID09IE5VTEwpOwotCi0JCXJ4cS0+cXVldWVbaV0gPSBOVUxMOwotCi0JCXBjaV91bm1hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4Yi0+cGFnZV9kbWEsCi0JCQkgICAgICAgUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCXBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0KLQkJbGVuID0gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSzsKLQkJbGVuICs9IHNpemVvZih1MzIpOyAvKiBhY2NvdW50IGZvciBzdGF0dXMgd29yZCAqLwotCQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfcngocHJpdiwgcGt0LCBsZW4pOwotCi0JCS8qIFJlY2xhaW0gYSBjb21tYW5kIGJ1ZmZlciBvbmx5IGlmIHRoaXMgcGFja2V0IGlzIGEgcmVzcG9uc2UKLQkJICogICB0byBhIChkcml2ZXItb3JpZ2luYXRlZCkgY29tbWFuZC4KLQkJICogSWYgdGhlIHBhY2tldCAoZS5nLiBSeCBmcmFtZSkgb3JpZ2luYXRlZCBmcm9tIHVDb2RlLAotCQkgKiAgIHRoZXJlIGlzIG5vIGNvbW1hbmQgYnVmZmVyIHRvIHJlY2xhaW0uCi0JCSAqIFVjb2RlIHNob3VsZCBzZXQgU0VRX1JYX0ZSQU1FIGJpdCBpZiB1Y29kZS1vcmlnaW5hdGVkLAotCQkgKiAgIGJ1dCBhcHBhcmVudGx5IGEgZmV3IGRvbid0IGdldCBzZXQ7IGNhdGNoIHRoZW0gaGVyZS4gKi8KLQkJcmVjbGFpbSA9ICEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfUlhfRlJBTUUpICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1JYX1BIWV9DTUQpICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1JYKSAmJgotCQkJKHBrdC0+aGRyLmNtZCAhPSBSRVBMWV9SWF9NUERVX0NNRCkgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gUkVQTFlfQ09NUFJFU1NFRF9CQSkgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gU1RBVElTVElDU19OT1RJRklDQVRJT04pICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1RYKTsKLQotCQkvKiBCYXNlZCBvbiB0eXBlIG9mIGNvbW1hbmQgcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uLAotCQkgKiAgIGhhbmRsZSB0aG9zZSB0aGF0IG5lZWQgaGFuZGxpbmcgdmlhIGZ1bmN0aW9uIGluCi0JCSAqICAgcnhfaGFuZGxlcnMgdGFibGUuICBTZWUgaXdsNDk2NV9zZXR1cF9yeF9oYW5kbGVycygpICovCi0JCWlmIChwcml2LT5yeF9oYW5kbGVyc1twa3QtPmhkci5jbWRdKSB7Ci0JCQlJV0xfREVCVUdfUlgocHJpdiwgInIgPSAlZCwgaSA9ICVkLCAlcywgMHglMDJ4XG4iLCByLAotCQkJCWksIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwKLQkJCQlwa3QtPmhkci5jbWQpOwotCQkJcHJpdi0+aXNyX3N0YXRzLnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0rKzsKLQkJCXByaXYtPnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0gKHByaXYsIHJ4Yik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBObyBoYW5kbGluZyBuZWVkZWQgKi8KLQkJCUlXTF9ERUJVR19SWChwcml2LAotCQkJCSJyICVkIGkgJWQgTm8gaGFuZGxlciBuZWVkZWQgZm9yICVzLCAweCUwMnhcbiIsCi0JCQkJciwgaSwgaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpLAotCQkJCXBrdC0+aGRyLmNtZCk7Ci0JCX0KLQotCQkvKgotCQkgKiBYWFg6IEFmdGVyIGhlcmUsIHdlIHNob3VsZCBhbHdheXMgY2hlY2sgcnhiLT5wYWdlCi0JCSAqIGFnYWluc3QgTlVMTCBiZWZvcmUgdG91Y2hpbmcgaXQgb3IgaXRzIHZpcnR1YWwKLQkJICogbWVtb3J5IChwa3QpLiBCZWNhdXNlIHNvbWUgcnhfaGFuZGxlciBtaWdodCBoYXZlCi0JCSAqIGFscmVhZHkgdGFrZW4gb3IgZnJlZWQgdGhlIHBhZ2VzLgotCQkgKi8KLQotCQlpZiAocmVjbGFpbSkgewotCQkJLyogSW52b2tlIGFueSBjYWxsYmFja3MsIHRyYW5zZmVyIHRoZSBidWZmZXIgdG8gY2FsbGVyLAotCQkJICogYW5kIGZpcmUgb2ZmIHRoZSAocG9zc2libHkpIGJsb2NraW5nIGl3bF9sZWdhY3lfc2VuZF9jbWQoKQotCQkJICogYXMgd2UgcmVjbGFpbSB0aGUgZHJpdmVyIGNvbW1hbmQgcXVldWUgKi8KLQkJCWlmIChyeGItPnBhZ2UpCi0JCQkJaXdsX2xlZ2FjeV90eF9jbWRfY29tcGxldGUocHJpdiwgcnhiKTsKLQkJCWVsc2UKLQkJCQlJV0xfV0FSTihwcml2LCAiQ2xhaW0gbnVsbCByeGI/XG4iKTsKLQkJfQotCi0JCS8qIFJldXNlIHRoZSBwYWdlIGlmIHBvc3NpYmxlLiBGb3Igbm90aWZpY2F0aW9uIHBhY2tldHMgYW5kCi0JCSAqIFNLQnMgdGhhdCBmYWlsIHRvIFJ4IGNvcnJlY3RseSwgYWRkIHRoZW0gYmFjayBpbnRvIHRoZQotCQkgKiByeF9mcmVlIGxpc3QgZm9yIHJldXNlIGxhdGVyLiAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChyeGItPnBhZ2UgIT0gTlVMTCkgewotCQkJcnhiLT5wYWdlX2RtYSA9IHBjaV9tYXBfcGFnZShwcml2LT5wY2lfZGV2LCByeGItPnBhZ2UsCi0JCQkJMCwgUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOwotCQkJcnhxLT5mcmVlX2NvdW50Kys7Ci0JCX0gZWxzZQotCQkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcnhxLT5yeF91c2VkKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQotCQlpID0gKGkgKyAxKSAmIFJYX1FVRVVFX01BU0s7Ci0JCS8qIElmIHRoZXJlIGFyZSBhIGxvdCBvZiB1bnVzZWQgZnJhbWVzLAotCQkgKiByZXN0b2NrIHRoZSBSeCBxdWV1ZSBzbyB1Y29kZSB3b250IGFzc2VydC4gKi8KLQkJaWYgKGZpbGxfcngpIHsKLQkJCWNvdW50Kys7Ci0JCQlpZiAoY291bnQgPj0gOCkgewotCQkJCXJ4cS0+cmVhZCA9IGk7Ci0JCQkJaXdsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHByaXYpOwotCQkJCWNvdW50ID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEJhY2t0cmFjayBvbmUgZW50cnkgKi8KLQlyeHEtPnJlYWQgPSBpOwotCWlmIChmaWxsX3J4KQotCQlpd2w0OTY1X3J4X3JlcGxlbmlzaF9ub3cocHJpdik7Ci0JZWxzZQotCQlpd2w0OTY1X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7Ci19Ci0KLS8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmbHVzaCBhbnkgc2NoZWR1bGVkIHRhc2tsZXQgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2w0OTY1X3N5bmNocm9uaXplX2lycShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogd2FpdCB0byBtYWtlIHN1cmUgd2UgZmx1c2ggcGVuZGluZyB0YXNrbGV0Ki8KLQlzeW5jaHJvbml6ZV9pcnEocHJpdi0+cGNpX2Rldi0+aXJxKTsKLQl0YXNrbGV0X2tpbGwoJnByaXYtPmlycV90YXNrbGV0KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9pcnFfdGFza2xldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTMyIGludGEsIGhhbmRsZWQgPSAwOwotCXUzMiBpbnRhX2ZoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JdTMyIGludGFfbWFzazsKLSNlbmRpZgotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIHVDb2RlIGludGVycnVwdHMuCi0JICogTm90ZTogIFNvbWUgYml0cyBpbiBDU1JfSU5UIGFyZSAiT1IiIG9mIGJpdHMgaW4gQ1NSX0ZIX0lOVF9TVEFUVVMsCi0JICogIGFuZCB3aWxsIGNsZWFyIG9ubHkgd2hlbiBDU1JfRkhfSU5UX1NUQVRVUyBnZXRzIGNsZWFyZWQuICovCi0JaW50YSA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVCk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVCwgaW50YSk7Ci0KLQkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyBmbG93LWhhbmRsZXIgKERNQSkgaW50ZXJydXB0cy4KLQkgKiBBbnkgbmV3IGludGVycnVwdHMgdGhhdCBoYXBwZW4gYWZ0ZXIgdGhpcywgZWl0aGVyIHdoaWxlIHdlJ3JlCi0JICogaW4gdGhpcyB0YXNrbGV0LCBvciBsYXRlciwgd2lsbCBzaG93IHVwIGluIG5leHQgSVNSL3Rhc2tsZXQuICovCi0JaW50YV9maCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTLCBpbnRhX2ZoKTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIElXTF9ETF9JU1IpIHsKLQkJLyoganVzdCBmb3IgZGVidWcgKi8KLQkJaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOwotCQlJV0xfREVCVUdfSVNSKHByaXYsICJpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eFxuIiwKLQkJCSAgICAgIGludGEsIGludGFfbWFzaywgaW50YV9maCk7Ci0JfQotI2VuZGlmCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBTaW5jZSBDU1JfSU5UIGFuZCBDU1JfRkhfSU5UX1NUQVRVUyByZWFkcyBhbmQgY2xlYXJzIGFyZSBub3QKLQkgKiBhdG9taWMsIG1ha2Ugc3VyZSB0aGF0IGludGEgY292ZXJzIGFsbCB0aGUgaW50ZXJydXB0cyB0aGF0Ci0JICogd2UndmUgZGlzY292ZXJlZCwgZXZlbiBpZiBGSCBpbnRlcnJ1cHQgY2FtZSBpbiBqdXN0IGFmdGVyCi0JICogcmVhZGluZyBDU1JfSU5ULiAqLwotCWlmIChpbnRhX2ZoICYgQ1NSNDlfRkhfSU5UX1JYX01BU0spCi0JCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfUlg7Ci0JaWYgKGludGFfZmggJiBDU1I0OV9GSF9JTlRfVFhfTUFTSykKLQkJaW50YSB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKLQotCS8qIE5vdyBzZXJ2aWNlIGFsbCBpbnRlcnJ1cHQgYml0cyBkaXNjb3ZlcmVkIGFib3ZlLiAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfSFdfRVJSKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkhhcmR3YXJlIGVycm9yIGRldGVjdGVkLiAgUmVzdGFydGluZy5cbiIpOwotCi0JCS8qIFRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLwotCQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQotCQlwcml2LT5pc3Jfc3RhdHMuaHcrKzsKLQkJaXdsX2xlZ2FjeV9pcnFfaGFuZGxlX2Vycm9yKHByaXYpOwotCi0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfSFdfRVJSOwotCi0JCXJldHVybjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiAoSVdMX0RMX0lTUikpIHsKLQkJLyogTklDIGZpcmVzIHRoaXMsIGJ1dCB3ZSBkb24ndCB1c2UgaXQsIHJlZHVuZGFudCB3aXRoIFdBS0VVUCAqLwotCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1NDRCkgewotCQkJSVdMX0RFQlVHX0lTUihwcml2LCAiU2NoZWR1bGVyIGZpbmlzaGVkIHRvIHRyYW5zbWl0ICIKLQkJCQkgICAgICAidGhlIGZyYW1lL2ZyYW1lcy5cbiIpOwotCQkJcHJpdi0+aXNyX3N0YXRzLnNjaCsrOwotCQl9Ci0KLQkJLyogQWxpdmUgbm90aWZpY2F0aW9uIHZpYSBSeCBpbnRlcnJ1cHQgd2lsbCBkbyB0aGUgcmVhbCB3b3JrICovCi0JCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQUxJVkUpIHsKLQkJCUlXTF9ERUJVR19JU1IocHJpdiwgIkFsaXZlIGludGVycnVwdFxuIik7Ci0JCQlwcml2LT5pc3Jfc3RhdHMuYWxpdmUrKzsKLQkJfQotCX0KLSNlbmRpZgotCS8qIFNhZmVseSBpZ25vcmUgdGhlc2UgYml0cyBmb3IgZGVidWcgY2hlY2tzIGJlbG93ICovCi0JaW50YSAmPSB+KENTUl9JTlRfQklUX1NDRCB8IENTUl9JTlRfQklUX0FMSVZFKTsKLQotCS8qIEhXIFJGIEtJTEwgc3dpdGNoIHRvZ2dsZWQgKi8KLQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1JGX0tJTEwpIHsKLQkJaW50IGh3X3JmX2tpbGwgPSAwOwotCQlpZiAoIShpd2xfcmVhZDMyKHByaXYsIENTUl9HUF9DTlRSTCkgJgotCQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKSkKLQkJCWh3X3JmX2tpbGwgPSAxOwotCi0JCUlXTF9XQVJOKHByaXYsICJSRl9LSUxMIGJpdCB0b2dnbGVkIHRvICVzLlxuIiwKLQkJCQlod19yZl9raWxsID8gImRpc2FibGUgcmFkaW8iIDogImVuYWJsZSByYWRpbyIpOwotCi0JCXByaXYtPmlzcl9zdGF0cy5yZmtpbGwrKzsKLQotCQkvKiBkcml2ZXIgb25seSBsb2FkcyB1Y29kZSBvbmNlIHNldHRpbmcgdGhlIGludGVyZmFjZSB1cC4KLQkJICogdGhlIGRyaXZlciBhbGxvd3MgbG9hZGluZyB0aGUgdWNvZGUgZXZlbiBpZiB0aGUgcmFkaW8KLQkJICogaXMga2lsbGVkLiBIZW5jZSB1cGRhdGUgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgaGVyZS4gVGhlCi0JCSAqIHJma2lsbCBoYW5kbGVyIHdpbGwgY2FyZSBhYm91dCByZXN0YXJ0aW5nIGlmIG5lZWRlZC4KLQkJICovCi0JCWlmICghdGVzdF9iaXQoU1RBVFVTX0FMSVZFLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJaWYgKGh3X3JmX2tpbGwpCi0JCQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JCQllbHNlCi0JCQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQkJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+aHctPndpcGh5LCBod19yZl9raWxsKTsKLQkJfQotCi0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfUkZfS0lMTDsKLQl9Ci0KLQkvKiBDaGlwIGdvdCB0b28gaG90IGFuZCBzdG9wcGVkIGl0c2VsZiAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQ1RfS0lMTCkgewotCQlJV0xfRVJSKHByaXYsICJNaWNyb2NvZGUgQ1Qga2lsbCBlcnJvciBkZXRlY3RlZC5cbiIpOwotCQlwcml2LT5pc3Jfc3RhdHMuY3RraWxsKys7Ci0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfQ1RfS0lMTDsKLQl9Ci0KLQkvKiBFcnJvciBkZXRlY3RlZCBieSB1Q29kZSAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU1dfRVJSKSB7Ci0JCUlXTF9FUlIocHJpdiwgIk1pY3JvY29kZSBTVyBlcnJvciBkZXRlY3RlZC4gIgotCQkJIiBSZXN0YXJ0aW5nIDB4JVguXG4iLCBpbnRhKTsKLQkJcHJpdi0+aXNyX3N0YXRzLnN3Kys7Ci0JCWl3bF9sZWdhY3lfaXJxX2hhbmRsZV9lcnJvcihwcml2KTsKLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9TV19FUlI7Ci0JfQotCi0JLyoKLQkgKiB1Q29kZSB3YWtlcyB1cCBhZnRlciBwb3dlci1kb3duIHNsZWVwLgotCSAqIFRlbGwgZGV2aWNlIGFib3V0IGFueSBuZXcgdHggb3IgaG9zdCBjb21tYW5kcyBlbnF1ZXVlZCwKLQkgKiBhbmQgYWJvdXQgYW55IFJ4IGJ1ZmZlcnMgbWFkZSBhdmFpbGFibGUgd2hpbGUgYXNsZWVwLgotCSAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfV0FLRVVQKSB7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgIldha2V1cCBpbnRlcnJ1cHRcbiIpOwotCQlpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgJnByaXYtPnJ4cSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IGkrKykKLQkJCWl3bF9sZWdhY3lfdHhxX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgJnByaXYtPnR4cVtpXSk7Ci0JCXByaXYtPmlzcl9zdGF0cy53YWtldXArKzsKLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9XQUtFVVA7Ci0JfQotCi0JLyogQWxsIHVDb2RlIGNvbW1hbmQgcmVzcG9uc2VzLCBpbmNsdWRpbmcgVHggY29tbWFuZCByZXNwb25zZXMsCi0JICogUnggInJlc3BvbnNlcyIgKGZyYW1lLXJlY2VpdmVkIG5vdGlmaWNhdGlvbiksIGFuZCBvdGhlcgotCSAqIG5vdGlmaWNhdGlvbnMgZnJvbSB1Q29kZSBjb21lIHRocm91Z2ggaGVyZSovCi0JaWYgKGludGEgJiAoQ1NSX0lOVF9CSVRfRkhfUlggfCBDU1JfSU5UX0JJVF9TV19SWCkpIHsKLQkJaXdsNDk2NV9yeF9oYW5kbGUocHJpdik7Ci0JCXByaXYtPmlzcl9zdGF0cy5yeCsrOwotCQloYW5kbGVkIHw9IChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKTsKLQl9Ci0KLQkvKiBUaGlzICJUeCIgRE1BIGNoYW5uZWwgaXMgdXNlZCBvbmx5IGZvciBsb2FkaW5nIHVDb2RlICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9GSF9UWCkgewotCQlJV0xfREVCVUdfSVNSKHByaXYsICJ1Q29kZSBsb2FkIGludGVycnVwdFxuIik7Ci0JCXByaXYtPmlzcl9zdGF0cy50eCsrOwotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX0ZIX1RYOwotCQkvKiBXYWtlIHVwIHVDb2RlIGxvYWQgcm91dGluZSwgbm93IHRoYXQgbG9hZCBpcyBjb21wbGV0ZSAqLwotCQlwcml2LT51Y29kZV93cml0ZV9jb21wbGV0ZSA9IDE7Ci0JCXdha2VfdXAoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0JfQotCi0JaWYgKGludGEgJiB+aGFuZGxlZCkgewotCQlJV0xfRVJSKHByaXYsICJVbmhhbmRsZWQgSU5UQSBiaXRzIDB4JTA4eFxuIiwgaW50YSAmIH5oYW5kbGVkKTsKLQkJcHJpdi0+aXNyX3N0YXRzLnVuaGFuZGxlZCsrOwotCX0KLQotCWlmIChpbnRhICYgfihwcml2LT5pbnRhX21hc2spKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJEaXNhYmxlZCBJTlRBIGJpdHMgMHglMDh4IHdlcmUgcGVuZGluZ1xuIiwKLQkJCSBpbnRhICYgfnByaXYtPmludGFfbWFzayk7Ci0JCUlXTF9XQVJOKHByaXYsICIgICB3aXRoIEZIX0lOVCA9IDB4JTA4eFxuIiwgaW50YV9maCk7Ci0JfQotCi0JLyogUmUtZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0JLyogb25seSBSZS1lbmFibGUgaWYgZGlzYWJsZWQgYnkgaXJxICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykpCi0JCWl3bF9sZWdhY3lfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0JLyogUmUtZW5hYmxlIFJGX0tJTEwgaWYgaXQgb2NjdXJyZWQgKi8KLQllbHNlIGlmIChoYW5kbGVkICYgQ1NSX0lOVF9CSVRfUkZfS0lMTCkKLQkJaXdsX2xlZ2FjeV9lbmFibGVfcmZraWxsX2ludChwcml2KTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIChJV0xfRExfSVNSKSkgewotCQlpbnRhID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UKTsKLQkJaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOwotCQlpbnRhX2ZoID0gaXdsX3JlYWQzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUyk7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwKLQkJCSJFbmQgaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHgsICIKLQkJCSJmbGFncyAweCUwOGx4XG4iLCBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgsIGZsYWdzKTsKLQl9Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogc3lzZnMgYXR0cmlidXRlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCi0vKgotICogVGhlIGZvbGxvd2luZyBhZGRzIGEgbmV3IGF0dHJpYnV0ZSB0byB0aGUgc3lzZnMgcmVwcmVzZW50YXRpb24KLSAqIG9mIHRoaXMgZGV2aWNlIGRyaXZlciAoaS5lLiBhIG5ldyBmaWxlIGluIC9zeXMvY2xhc3MvbmV0L3dsYW4wL2RldmljZS8pCi0gKiB1c2VkIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgbGV2ZWwuCi0gKgotICogU2VlIHRoZSBsZXZlbCBkZWZpbml0aW9ucyBpbiBpd2wgZm9yIGRldGFpbHMuCi0gKgotICogVGhlIGRlYnVnX2xldmVsIGJlaW5nIG1hbmFnZWQgdXNpbmcgc3lzZnMgYmVsb3cgaXMgYSBwZXIgZGV2aWNlIGRlYnVnCi0gKiBsZXZlbCB0aGF0IGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIGRlYnVnIGxldmVsIGlmIGl0ICh0aGUgcGVyCi0gKiBkZXZpY2UgZGVidWcgbGV2ZWwpIGlzIHNldC4KLSAqLwotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9zaG93X2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDhYXG4iLCBpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSk7Ci19Ci1zdGF0aWMgc3NpemVfdCBpd2w0OTY1X3N0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKLQlpZiAocmV0KQotCQlJV0xfRVJSKHByaXYsICIlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7Ci0JZWxzZSB7Ci0JCXByaXYtPmRlYnVnX2xldmVsID0gdmFsOwotCQlpZiAoaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShwcml2KSkKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOwotCX0KLQlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGRlYnVnX2xldmVsLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJCWl3bDQ5NjVfc2hvd19kZWJ1Z19sZXZlbCwgaXdsNDk2NV9zdG9yZV9kZWJ1Z19sZXZlbCk7Ci0KLQotI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRyAqLwotCi0KLXN0YXRpYyBzc2l6ZV90IGl3bDQ5NjVfc2hvd190ZW1wZXJhdHVyZShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwcml2LT50ZW1wZXJhdHVyZSk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wZXJhdHVyZSwgU19JUlVHTywgaXdsNDk2NV9zaG93X3RlbXBlcmF0dXJlLCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9zaG93X3R4X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJvZmZcbiIpOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10KTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9zdG9yZV90eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQpCi0JCUlXTF9JTkZPKHByaXYsICIlcyBpcyBub3QgaW4gZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKLQllbHNlIHsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZXRfdHhfcG93ZXIocHJpdiwgdmFsLCBmYWxzZSk7Ci0JCWlmIChyZXQpCi0JCQlJV0xfRVJSKHByaXYsICJmYWlsZWQgc2V0dGluZyB0eCBwb3dlciAoMHglZCkuXG4iLAotCQkJCXJldCk7Ci0JCWVsc2UKLQkJCXJldCA9IGNvdW50OwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIodHhfcG93ZXIsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQkJaXdsNDk2NV9zaG93X3R4X3Bvd2VyLCBpd2w0OTY1X3N0b3JlX3R4X3Bvd2VyKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKml3bF9zeXNmc19lbnRyaWVzW10gPSB7Ci0JJmRldl9hdHRyX3RlbXBlcmF0dXJlLmF0dHIsCi0JJmRldl9hdHRyX3R4X3Bvd2VyLmF0dHIsCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JJmRldl9hdHRyX2RlYnVnX2xldmVsLmF0dHIsCi0jZW5kaWYKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpd2xfYXR0cmlidXRlX2dyb3VwID0gewotCS5uYW1lID0gTlVMTCwJCS8qIHB1dCBpbiBkZXZpY2UgZGlyZWN0b3J5ICovCi0JLmF0dHJzID0gaXdsX3N5c2ZzX2VudHJpZXMsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogdUNvZGUgZG93bmxvYWQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9kZWFsbG9jX3Vjb2RlX3BjaShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaXdsX2xlZ2FjeV9mcmVlX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2NvZGUpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhKTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXApOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0KTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfaW5pdF9kYXRhKTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfYm9vdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfbmljX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiBSZW1vdmUgYWxsIHJlc2V0cyB0byBhbGxvdyBOSUMgdG8gb3BlcmF0ZSAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9SRVNFVCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfdWNvZGVfY2FsbGJhY2soY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZV9yYXcsCi0JCQkJCXZvaWQgKmNvbnRleHQpOwotc3RhdGljIGludCBpd2w0OTY1X21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCQl1MzIgbWF4X3Byb2JlX2xlbmd0aCk7Ci0KLXN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGl3bDQ5NjVfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgZmlyc3QpCi17Ci0JY29uc3QgY2hhciAqbmFtZV9wcmUgPSBwcml2LT5jZmctPmZ3X25hbWVfcHJlOwotCWNoYXIgdGFnWzhdOwotCi0JaWYgKGZpcnN0KSB7Ci0JCXByaXYtPmZ3X2luZGV4ID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWF4OwotCQlzcHJpbnRmKHRhZywgIiVkIiwgcHJpdi0+ZndfaW5kZXgpOwotCX0gZWxzZSB7Ci0JCXByaXYtPmZ3X2luZGV4LS07Ci0JCXNwcmludGYodGFnLCAiJWQiLCBwcml2LT5md19pbmRleCk7Ci0JfQotCi0JaWYgKHByaXYtPmZ3X2luZGV4IDwgcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWluKSB7Ci0JCUlXTF9FUlIocHJpdiwgIm5vIHN1aXRhYmxlIGZpcm13YXJlIGZvdW5kIVxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCXNwcmludGYocHJpdi0+ZmlybXdhcmVfbmFtZSwgIiVzJXMlcyIsIG5hbWVfcHJlLCB0YWcsICIudWNvZGUiKTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJhdHRlbXB0aW5nIHRvIGxvYWQgZmlybXdhcmUgJyVzJ1xuIiwKLQkJICAgICAgIHByaXYtPmZpcm13YXJlX25hbWUpOwotCi0JcmV0dXJuIHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCAxLCBwcml2LT5maXJtd2FyZV9uYW1lLAotCQkJCSAgICAgICAmcHJpdi0+cGNpX2Rldi0+ZGV2LCBHRlBfS0VSTkVMLCBwcml2LAotCQkJCSAgICAgICBpd2w0OTY1X3Vjb2RlX2NhbGxiYWNrKTsKLX0KLQotc3RydWN0IGl3bDQ5NjVfZmlybXdhcmVfcGllY2VzIHsKLQljb25zdCB2b2lkICppbnN0LCAqZGF0YSwgKmluaXQsICppbml0X2RhdGEsICpib290OwotCXNpemVfdCBpbnN0X3NpemUsIGRhdGFfc2l6ZSwgaW5pdF9zaXplLCBpbml0X2RhdGFfc2l6ZSwgYm9vdF9zaXplOwotfTsKLQotc3RhdGljIGludCBpd2w0OTY1X2xvYWRfZmlybXdhcmUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3JhdywKLQkJCQkgICAgICAgc3RydWN0IGl3bDQ5NjVfZmlybXdhcmVfcGllY2VzICpwaWVjZXMpCi17Ci0Jc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgKnVjb2RlID0gKHZvaWQgKil1Y29kZV9yYXctPmRhdGE7Ci0JdTMyIGFwaV92ZXIsIGhkcl9zaXplOwotCWNvbnN0IHU4ICpzcmM7Ci0KLQlwcml2LT51Y29kZV92ZXIgPSBsZTMyX3RvX2NwdSh1Y29kZS0+dmVyKTsKLQlhcGlfdmVyID0gSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpOwotCi0Jc3dpdGNoIChhcGlfdmVyKSB7Ci0JZGVmYXVsdDoKLQljYXNlIDA6Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJaGRyX3NpemUgPSAyNDsKLQkJaWYgKHVjb2RlX3Jhdy0+c2l6ZSA8IGhkcl9zaXplKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJGaWxlIHNpemUgdG9vIHNtYWxsIVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlwaWVjZXMtPmluc3Rfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5pbnN0X3NpemUpOwotCQlwaWVjZXMtPmRhdGFfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5kYXRhX3NpemUpOwotCQlwaWVjZXMtPmluaXRfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5pbml0X3NpemUpOwotCQlwaWVjZXMtPmluaXRfZGF0YV9zaXplID0KLQkJCQlsZTMyX3RvX2NwdSh1Y29kZS0+djEuaW5pdF9kYXRhX3NpemUpOwotCQlwaWVjZXMtPmJvb3Rfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5ib290X3NpemUpOwotCQlzcmMgPSB1Y29kZS0+djEuZGF0YTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogVmVyaWZ5IHNpemUgb2YgZmlsZSB2cy4gaW1hZ2Ugc2l6ZSBpbmZvIGluIGZpbGUncyBoZWFkZXIgKi8KLQlpZiAodWNvZGVfcmF3LT5zaXplICE9IGhkcl9zaXplICsgcGllY2VzLT5pbnN0X3NpemUgKwotCQkJCXBpZWNlcy0+ZGF0YV9zaXplICsgcGllY2VzLT5pbml0X3NpemUgKwotCQkJCXBpZWNlcy0+aW5pdF9kYXRhX3NpemUgKyBwaWVjZXMtPmJvb3Rfc2l6ZSkgewotCi0JCUlXTF9FUlIocHJpdiwKLQkJCSJ1Q29kZSBmaWxlIHNpemUgJWQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgc2l6ZVxuIiwKLQkJCShpbnQpdWNvZGVfcmF3LT5zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGllY2VzLT5pbnN0ID0gc3JjOwotCXNyYyArPSBwaWVjZXMtPmluc3Rfc2l6ZTsKLQlwaWVjZXMtPmRhdGEgPSBzcmM7Ci0Jc3JjICs9IHBpZWNlcy0+ZGF0YV9zaXplOwotCXBpZWNlcy0+aW5pdCA9IHNyYzsKLQlzcmMgKz0gcGllY2VzLT5pbml0X3NpemU7Ci0JcGllY2VzLT5pbml0X2RhdGEgPSBzcmM7Ci0Jc3JjICs9IHBpZWNlcy0+aW5pdF9kYXRhX3NpemU7Ci0JcGllY2VzLT5ib290ID0gc3JjOwotCXNyYyArPSBwaWVjZXMtPmJvb3Rfc2l6ZTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfdWNvZGVfY2FsbGJhY2sgLSBjYWxsYmFjayB3aGVuIGZpcm13YXJlIHdhcyBsb2FkZWQKLSAqCi0gKiBJZiBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCBjb3BpZXMgdGhlIGZpcm13YXJlIGludG8gYnVmZmVycwotICogZm9yIHRoZSBjYXJkIHRvIGZldGNoICh2aWEgRE1BKS4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfdWNvZGVfY2FsbGJhY2soY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZV9yYXcsIHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGV4dDsKLQlzdHJ1Y3QgaXdsX3Vjb2RlX2hlYWRlciAqdWNvZGU7Ci0JaW50IGVycjsKLQlzdHJ1Y3QgaXdsNDk2NV9maXJtd2FyZV9waWVjZXMgcGllY2VzOwotCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWF4ID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWF4OwotCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWluID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWluOwotCXUzMiBhcGlfdmVyOwotCi0JdTMyIG1heF9wcm9iZV9sZW5ndGggPSAyMDA7Ci0JdTMyIHN0YW5kYXJkX3BoeV9jYWxpYnJhdGlvbl9zaXplID0KLQkJCUlXTF9ERUZBVUxUX1NUQU5EQVJEX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkU7Ci0KLQltZW1zZXQoJnBpZWNlcywgMCwgc2l6ZW9mKHBpZWNlcykpOwotCi0JaWYgKCF1Y29kZV9yYXcpIHsKLQkJaWYgKHByaXYtPmZ3X2luZGV4IDw9IHByaXYtPmNmZy0+dWNvZGVfYXBpX21heCkKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkicmVxdWVzdCBmb3IgZmlybXdhcmUgZmlsZSAnJXMnIGZhaWxlZC5cbiIsCi0JCQkJcHJpdi0+ZmlybXdhcmVfbmFtZSk7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJMb2FkZWQgZmlybXdhcmUgZmlsZSAnJXMnICglemQgYnl0ZXMpLlxuIiwKLQkJICAgICAgIHByaXYtPmZpcm13YXJlX25hbWUsIHVjb2RlX3Jhdy0+c2l6ZSk7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBnb3QgYXQgbGVhc3QgdGhlIEFQSSB2ZXJzaW9uIG51bWJlciAqLwotCWlmICh1Y29kZV9yYXctPnNpemUgPCA0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZpbGUgc2l6ZSB3YXkgdG9vIHNtYWxsIVxuIik7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQotCS8qIERhdGEgZnJvbSB1Y29kZSBmaWxlOiAgaGVhZGVyIGZvbGxvd2VkIGJ5IHVDb2RlIGltYWdlcyAqLwotCXVjb2RlID0gKHN0cnVjdCBpd2xfdWNvZGVfaGVhZGVyICopdWNvZGVfcmF3LT5kYXRhOwotCi0JZXJyID0gaXdsNDk2NV9sb2FkX2Zpcm13YXJlKHByaXYsIHVjb2RlX3JhdywgJnBpZWNlcyk7Ci0KLQlpZiAoZXJyKQotCQlnb3RvIHRyeV9hZ2FpbjsKLQotCWFwaV92ZXIgPSBJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3Zlcik7Ci0KLQkvKgotCSAqIGFwaV92ZXIgc2hvdWxkIG1hdGNoIHRoZSBhcGkgdmVyc2lvbiBmb3JtaW5nIHBhcnQgb2YgdGhlCi0JICogZmlybXdhcmUgZmlsZW5hbWUgLi4uIGJ1dCB3ZSBkb24ndCBjaGVjayBmb3IgdGhhdCBhbmQgb25seSByZWx5Ci0JICogb24gdGhlIEFQSSB2ZXJzaW9uIHJlYWQgZnJvbSBmaXJtd2FyZSBoZWFkZXIgZnJvbSBoZXJlIG9uIGZvcndhcmQKLQkgKi8KLQlpZiAoYXBpX3ZlciA8IGFwaV9taW4gfHwgYXBpX3ZlciA+IGFwaV9tYXgpIHsKLQkJSVdMX0VSUihwcml2LAotCQkJIkRyaXZlciB1bmFibGUgdG8gc3VwcG9ydCB5b3VyIGZpcm13YXJlIEFQSS4gIgotCQkJIkRyaXZlciBzdXBwb3J0cyB2JXUsIGZpcm13YXJlIGlzIHYldS5cbiIsCi0JCQlhcGlfbWF4LCBhcGlfdmVyKTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JaWYgKGFwaV92ZXIgIT0gYXBpX21heCkKLQkJSVdMX0VSUihwcml2LAotCQkJIkZpcm13YXJlIGhhcyBvbGQgQVBJIHZlcnNpb24uIEV4cGVjdGVkIHYldSwgIgotCQkJImdvdCB2JXUuIE5ldyBmaXJtd2FyZSBjYW4gYmUgb2J0YWluZWQgIgotCQkJImZyb20gaHR0cDovL3d3dy5pbnRlbGxpbnV4d2lyZWxlc3Mub3JnLlxuIiwKLQkJCWFwaV9tYXgsIGFwaV92ZXIpOwotCi0JSVdMX0lORk8ocHJpdiwgImxvYWRlZCBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1LiV1XG4iLAotCQkgSVdMX1VDT0RFX01BSk9SKHByaXYtPnVjb2RlX3ZlciksCi0JCSBJV0xfVUNPREVfTUlOT1IocHJpdi0+dWNvZGVfdmVyKSwKLQkJIElXTF9VQ09ERV9BUEkocHJpdi0+dWNvZGVfdmVyKSwKLQkJIElXTF9VQ09ERV9TRVJJQUwocHJpdi0+dWNvZGVfdmVyKSk7Ci0KLQlzbnByaW50Zihwcml2LT5ody0+d2lwaHktPmZ3X3ZlcnNpb24sCi0JCSBzaXplb2YocHJpdi0+aHctPndpcGh5LT5md192ZXJzaW9uKSwKLQkJICIldS4ldS4ldS4ldSIsCi0JCSBJV0xfVUNPREVfTUFKT1IocHJpdi0+dWNvZGVfdmVyKSwKLQkJIElXTF9VQ09ERV9NSU5PUihwcml2LT51Y29kZV92ZXIpLAotCQkgSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpLAotCQkgSVdMX1VDT0RFX1NFUklBTChwcml2LT51Y29kZV92ZXIpKTsKLQotCS8qCi0JICogRm9yIGFueSBvZiB0aGUgZmFpbHVyZXMgYmVsb3cgKGJlZm9yZSBhbGxvY2F0aW5nIHBjaSBtZW1vcnkpCi0JICogd2Ugd2lsbCB0cnkgdG8gbG9hZCBhIHZlcnNpb24gd2l0aCBhIHNtYWxsZXIgQVBJIC0tIG1heWJlIHRoZQotCSAqIHVzZXIganVzdCBnb3QgYSBjb3JydXB0ZWQgdmVyc2lvbiBvZiB0aGUgbGF0ZXN0IEFQSS4KLQkgKi8KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgdWNvZGUgdmVyc2lvbiByYXcgPSAweCV4XG4iLAotCQkgICAgICAgcHJpdi0+dWNvZGVfdmVyKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIHJ1bnRpbWUgaW5zdCBzaXplID0gJVpkXG4iLAotCQkgICAgICAgcGllY2VzLmluc3Rfc2l6ZSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGRhdGEgc2l6ZSA9ICVaZFxuIiwKLQkJICAgICAgIHBpZWNlcy5kYXRhX3NpemUpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgaW5pdCBpbnN0IHNpemUgPSAlWmRcbiIsCi0JCSAgICAgICBwaWVjZXMuaW5pdF9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIGluaXQgZGF0YSBzaXplID0gJVpkXG4iLAotCQkgICAgICAgcGllY2VzLmluaXRfZGF0YV9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIGJvb3QgaW5zdCBzaXplID0gJVpkXG4iLAotCQkgICAgICAgcGllY2VzLmJvb3Rfc2l6ZSk7Ci0KLQkvKiBWZXJpZnkgdGhhdCB1Q29kZSBpbWFnZXMgd2lsbCBmaXQgaW4gY2FyZCdzIFNSQU0gKi8KLQlpZiAocGllY2VzLmluc3Rfc2l6ZSA+IHByaXYtPmh3X3BhcmFtcy5tYXhfaW5zdF9zaXplKSB7Ci0JCUlXTF9FUlIocHJpdiwgInVDb2RlIGluc3RyIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKLQkJCXBpZWNlcy5pbnN0X3NpemUpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci0KLQlpZiAocGllY2VzLmRhdGFfc2l6ZSA+IHByaXYtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplKSB7Ci0JCUlXTF9FUlIocHJpdiwgInVDb2RlIGRhdGEgbGVuICVaZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJcGllY2VzLmRhdGFfc2l6ZSk7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQotCWlmIChwaWVjZXMuaW5pdF9zaXplID4gcHJpdi0+aHdfcGFyYW1zLm1heF9pbnN0X3NpemUpIHsKLQkJSVdMX0VSUihwcml2LCAidUNvZGUgaW5pdCBpbnN0ciBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQlwaWVjZXMuaW5pdF9zaXplKTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JaWYgKHBpZWNlcy5pbml0X2RhdGFfc2l6ZSA+IHByaXYtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplKSB7Ci0JCUlXTF9FUlIocHJpdiwgInVDb2RlIGluaXQgZGF0YSBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQlwaWVjZXMuaW5pdF9kYXRhX3NpemUpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci0KLQlpZiAocGllY2VzLmJvb3Rfc2l6ZSA+IHByaXYtPmh3X3BhcmFtcy5tYXhfYnNtX3NpemUpIHsKLQkJSVdMX0VSUihwcml2LCAidUNvZGUgYm9vdCBpbnN0ciBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQlwaWVjZXMuYm9vdF9zaXplKTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JLyogQWxsb2NhdGUgdWNvZGUgYnVmZmVycyBmb3IgY2FyZCdzIGJ1cy1tYXN0ZXIgbG9hZGluZyAuLi4gKi8KLQotCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIGFuZCAyIGNvcGllcyBvZiBkYXRhOgotCSAqIDEpIHVubW9kaWZpZWQgZnJvbSBkaXNrCi0JICogMikgYmFja3VwIGNhY2hlIGZvciBzYXZlL3Jlc3RvcmUgZHVyaW5nIHBvd2VyLWRvd25zICovCi0JcHJpdi0+dWNvZGVfY29kZS5sZW4gPSBwaWVjZXMuaW5zdF9zaXplOwotCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfY29kZSk7Ci0KLQlwcml2LT51Y29kZV9kYXRhLmxlbiA9IHBpZWNlcy5kYXRhX3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhKTsKLQotCXByaXYtPnVjb2RlX2RhdGFfYmFja3VwLmxlbiA9IHBpZWNlcy5kYXRhX3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhX2JhY2t1cCk7Ci0KLQlpZiAoIXByaXYtPnVjb2RlX2NvZGUudl9hZGRyIHx8ICFwcml2LT51Y29kZV9kYXRhLnZfYWRkciB8fAotCSAgICAhcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyKQotCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0KLQkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgKi8KLQlpZiAocGllY2VzLmluaXRfc2l6ZSAmJiBwaWVjZXMuaW5pdF9kYXRhX3NpemUpIHsKLQkJcHJpdi0+dWNvZGVfaW5pdC5sZW4gPSBwaWVjZXMuaW5pdF9zaXplOwotCQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2luaXQpOwotCi0JCXByaXYtPnVjb2RlX2luaXRfZGF0YS5sZW4gPSBwaWVjZXMuaW5pdF9kYXRhX3NpemU7Ci0JCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfaW5pdF9kYXRhKTsKLQotCQlpZiAoIXByaXYtPnVjb2RlX2luaXQudl9hZGRyIHx8ICFwcml2LT51Y29kZV9pbml0X2RhdGEudl9hZGRyKQotCQkJZ290byBlcnJfcGNpX2FsbG9jOwotCX0KLQotCS8qIEJvb3RzdHJhcCAoaW5zdHJ1Y3Rpb25zIG9ubHksIG5vIGRhdGEpICovCi0JaWYgKHBpZWNlcy5ib290X3NpemUpIHsKLQkJcHJpdi0+dWNvZGVfYm9vdC5sZW4gPSBwaWVjZXMuYm9vdF9zaXplOwotCQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2Jvb3QpOwotCi0JCWlmICghcHJpdi0+dWNvZGVfYm9vdC52X2FkZHIpCi0JCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0JfQotCi0JLyogTm93IHRoYXQgd2UgY2FuIG5vIGxvbmdlciBmYWlsLCBjb3B5IGluZm9ybWF0aW9uICovCi0KLQlwcml2LT5zdGFfa2V5X21heF9udW0gPSBTVEFfS0VZX01BWF9OVU07Ci0KLQkvKiBDb3B5IGltYWdlcyBpbnRvIGJ1ZmZlcnMgZm9yIGNhcmQncyBidXMtbWFzdGVyIHJlYWRzIC4uLiAqLwotCi0JLyogUnVudGltZSBpbnN0cnVjdGlvbnMgKGZpcnN0IGJsb2NrIG9mIGRhdGEgaW4gZmlsZSkgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSB1Q29kZSBpbnN0ciBsZW4gJVpkXG4iLAotCQkJcGllY2VzLmluc3Rfc2l6ZSk7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2NvZGUudl9hZGRyLCBwaWVjZXMuaW5zdCwgcGllY2VzLmluc3Rfc2l6ZSk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAidUNvZGUgaW5zdHIgYnVmIHZhZGRyID0gMHglcCwgcGFkZHIgPSAweCUwOHhcbiIsCi0JCXByaXYtPnVjb2RlX2NvZGUudl9hZGRyLCAodTMyKXByaXYtPnVjb2RlX2NvZGUucF9hZGRyKTsKLQotCS8qCi0JICogUnVudGltZSBkYXRhCi0JICogTk9URTogIENvcHkgaW50byBiYWNrdXAgYnVmZmVyIHdpbGwgYmUgZG9uZSBpbiBpd2xfdXAoKQotCSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGRhdGEgbGVuICVaZFxuIiwKLQkJCXBpZWNlcy5kYXRhX3NpemUpOwotCW1lbWNweShwcml2LT51Y29kZV9kYXRhLnZfYWRkciwgcGllY2VzLmRhdGEsIHBpZWNlcy5kYXRhX3NpemUpOwotCW1lbWNweShwcml2LT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIHBpZWNlcy5kYXRhLCBwaWVjZXMuZGF0YV9zaXplKTsKLQotCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyAqLwotCWlmIChwaWVjZXMuaW5pdF9zaXplKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBpbnN0ciBsZW4gJVpkXG4iLAotCQkJCXBpZWNlcy5pbml0X3NpemUpOwotCQltZW1jcHkocHJpdi0+dWNvZGVfaW5pdC52X2FkZHIsIHBpZWNlcy5pbml0LCBwaWVjZXMuaW5pdF9zaXplKTsKLQl9Ci0KLQkvKiBJbml0aWFsaXphdGlvbiBkYXRhICovCi0JaWYgKHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIGluaXQgZGF0YSBsZW4gJVpkXG4iLAotCQkJICAgICAgIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSk7Ci0JCW1lbWNweShwcml2LT51Y29kZV9pbml0X2RhdGEudl9hZGRyLCBwaWVjZXMuaW5pdF9kYXRhLAotCQkgICAgICAgcGllY2VzLmluaXRfZGF0YV9zaXplKTsKLQl9Ci0KLQkvKiBCb290c3RyYXAgaW5zdHJ1Y3Rpb25zICovCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgYm9vdCBpbnN0ciBsZW4gJVpkXG4iLAotCQkJcGllY2VzLmJvb3Rfc2l6ZSk7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2Jvb3Qudl9hZGRyLCBwaWVjZXMuYm9vdCwgcGllY2VzLmJvb3Rfc2l6ZSk7Ci0KLQkvKgotCSAqIGZpZ3VyZSBvdXQgdGhlIG9mZnNldCBvZiBjaGFpbiBub2lzZSByZXNldCBhbmQgZ2FpbiBjb21tYW5kcwotCSAqIGJhc2Ugb24gdGhlIHNpemUgb2Ygc3RhbmRhcmQgcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzIHRhYmxlIHNpemUKLQkgKi8KLQlwcml2LT5fNDk2NS5waHlfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kID0KLQkJc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemU7Ci0JcHJpdi0+XzQ5NjUucGh5X2NhbGliX2NoYWluX25vaXNlX2dhaW5fY21kID0KLQkJc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemUgKyAxOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVGhpcyBpcyBzdGlsbCBwYXJ0IG9mIHByb2JlKCkgaW4gYSBzZW5zZS4uLgotCSAqCi0JICogOS4gU2V0dXAgYW5kIHJlZ2lzdGVyIHdpdGggbWFjODAyMTEgYW5kIGRlYnVnZnMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JZXJyID0gaXdsNDk2NV9tYWNfc2V0dXBfcmVnaXN0ZXIocHJpdiwgbWF4X3Byb2JlX2xlbmd0aCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfdW5iaW5kOwotCi0JZXJyID0gaXdsX2xlZ2FjeV9kYmdmc19yZWdpc3Rlcihwcml2LCBEUlZfTkFNRSk7Ci0JaWYgKGVycikKLQkJSVdMX0VSUihwcml2LAotCQkiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGZpbGVzLiBJZ25vcmluZyBlcnJvcjogJWRcbiIsIGVycik7Ci0KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnByaXYtPnBjaV9kZXYtPmRldi5rb2JqLAotCQkJCQkmaXdsX2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKGVycikgewotCQlJV0xfRVJSKHByaXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGRldmljZSBhdHRyaWJ1dGVzXG4iKTsKLQkJZ290byBvdXRfdW5iaW5kOwotCX0KLQotCS8qIFdlIGhhdmUgb3VyIGNvcGllcyBub3csIGFsbG93IE9TIHJlbGVhc2UgaXRzIGNvcGllcyAqLwotCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKLQljb21wbGV0ZSgmcHJpdi0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7Ci0JcmV0dXJuOwotCi0gdHJ5X2FnYWluOgotCS8qIHRyeSBuZXh0LCBpZiBhbnkgKi8KLQlpZiAoaXdsNDk2NV9yZXF1ZXN0X2Zpcm13YXJlKHByaXYsIGZhbHNlKSkKLQkJZ290byBvdXRfdW5iaW5kOwotCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKLQlyZXR1cm47Ci0KLSBlcnJfcGNpX2FsbG9jOgotCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKLQlpd2w0OTY1X2RlYWxsb2NfdWNvZGVfcGNpKHByaXYpOwotIG91dF91bmJpbmQ6Ci0JY29tcGxldGUoJnByaXYtPl80OTY1LmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOwotCWRldmljZV9yZWxlYXNlX2RyaXZlcigmcHJpdi0+cGNpX2Rldi0+ZGV2KTsKLQlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlX3Jhdyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVzY19sb29rdXBfdGV4dFtdID0gewotCSJPSyIsCi0JIkZBSUwiLAotCSJCQURfUEFSQU0iLAotCSJCQURfQ0hFQ0tTVU0iLAotCSJOTUlfSU5URVJSVVBUX1dERyIsCi0JIlNZU0FTU0VSVCIsCi0JIkZBVEFMX0VSUk9SIiwKLQkiQkFEX0NPTU1BTkQiLAotCSJIV19FUlJPUl9UVU5FX0xPQ0siLAotCSJIV19FUlJPUl9URU1QRVJBVFVSRSIsCi0JIklMTEVHQUxfQ0hBTl9GUkVRIiwKLQkiVkNDX05PVF9TVEFCTEUiLAotCSJGSF9FUlJPUiIsCi0JIk5NSV9JTlRFUlJVUFRfSE9TVCIsCi0JIk5NSV9JTlRFUlJVUFRfQUNUSU9OX1BUIiwKLQkiTk1JX0lOVEVSUlVQVF9VTktOT1dOIiwKLQkiVUNPREVfVkVSU0lPTl9NSVNNQVRDSCIsCi0JIkhXX0VSUk9SX0FCU19MT0NLIiwKLQkiSFdfRVJST1JfQ0FMX0xPQ0tfRkFJTCIsCi0JIk5NSV9JTlRFUlJVUFRfSU5TVF9BQ1RJT05fUFQiLAotCSJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwKLQkiTk1JX1RSTV9IV19FUiIsCi0JIk5NSV9JTlRFUlJVUFRfVFJNIiwKLQkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIsCi0JIkRFQlVHXzAiLAotCSJERUJVR18xIiwKLQkiREVCVUdfMiIsCi0JIkRFQlVHXzMiLAotfTsKLQotc3RhdGljIHN0cnVjdCB7IGNoYXIgKm5hbWU7IHU4IG51bTsgfSBhZHZhbmNlZF9sb29rdXBbXSA9IHsKLQl7ICJOTUlfSU5URVJSVVBUX1dERyIsIDB4MzQgfSwKLQl7ICJTWVNBU1NFUlQiLCAweDM1IH0sCi0JeyAiVUNPREVfVkVSU0lPTl9NSVNNQVRDSCIsIDB4MzcgfSwKLQl7ICJCQURfQ09NTUFORCIsIDB4MzggfSwKLQl7ICJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwgMHgzQyB9LAotCXsgIkZBVEFMX0VSUk9SIiwgMHgzRCB9LAotCXsgIk5NSV9UUk1fSFdfRVJSIiwgMHg0NiB9LAotCXsgIk5NSV9JTlRFUlJVUFRfVFJNIiwgMHg0QyB9LAotCXsgIk5NSV9JTlRFUlJVUFRfQlJFQUtfUE9JTlQiLCAweDU0IH0sCi0JeyAiTk1JX0lOVEVSUlVQVF9XREdfUlhGX0ZVTEwiLCAweDVDIH0sCi0JeyAiTk1JX0lOVEVSUlVQVF9XREdfTk9fUkJEX1JYRl9GVUxMIiwgMHg2NCB9LAotCXsgIk5NSV9JTlRFUlJVUFRfSE9TVCIsIDB4NjYgfSwKLQl7ICJOTUlfSU5URVJSVVBUX0FDVElPTl9QVCIsIDB4N0MgfSwKLQl7ICJOTUlfSU5URVJSVVBUX1VOS05PV04iLCAweDg0IH0sCi0JeyAiTk1JX0lOVEVSUlVQVF9JTlNUX0FDVElPTl9QVCIsIDB4ODYgfSwKLQl7ICJBRFZBTkNFRF9TWVNBU1NFUlQiLCAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqaXdsNDk2NV9kZXNjX2xvb2t1cCh1MzIgbnVtKQotewotCWludCBpOwotCWludCBtYXggPSBBUlJBWV9TSVpFKGRlc2NfbG9va3VwX3RleHQpOwotCi0JaWYgKG51bSA8IG1heCkKLQkJcmV0dXJuIGRlc2NfbG9va3VwX3RleHRbbnVtXTsKLQotCW1heCA9IEFSUkFZX1NJWkUoYWR2YW5jZWRfbG9va3VwKSAtIDE7Ci0JZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCWlmIChhZHZhbmNlZF9sb29rdXBbaV0ubnVtID09IG51bSkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gYWR2YW5jZWRfbG9va3VwW2ldLm5hbWU7Ci19Ci0KLSNkZWZpbmUgRVJST1JfU1RBUlRfT0ZGU0VUICAoMSAqIHNpemVvZih1MzIpKQotI2RlZmluZSBFUlJPUl9FTEVNX1NJWkUgICAgICg3ICogc2l6ZW9mKHUzMikpCi0KLXZvaWQgaXdsNDk2NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBkYXRhMiwgbGluZTsKLQl1MzIgZGVzYywgdGltZSwgY291bnQsIGJhc2UsIGRhdGExOwotCXUzMiBibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazI7Ci0JdTMyIHBjLCBoY21kOwotCi0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkgewotCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LmVycm9yX2V2ZW50X3RhYmxlX3B0cik7Ci0JfSBlbHNlIHsKLQkJYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmUuZXJyb3JfZXZlbnRfdGFibGVfcHRyKTsKLQl9Ci0KLQlpZiAoIXByaXYtPmNmZy0+b3BzLT5saWItPmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKLQkJSVdMX0VSUihwcml2LAotCQkJIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFggZm9yICVzIHVDb2RlXG4iLAotCQkJYmFzZSwgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkgPyAiSW5pdCIgOiAiUlQiKTsKLQkJcmV0dXJuOwotCX0KLQotCWNvdW50ID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UpOwotCi0JaWYgKEVSUk9SX1NUQVJUX09GRlNFVCA8PSBjb3VudCAqIEVSUk9SX0VMRU1fU0laRSkgewotCQlJV0xfRVJSKHByaXYsICJTdGFydCBJV0wgRXJyb3IgTG9nIER1bXA6XG4iKTsKLQkJSVdMX0VSUihwcml2LCAiU3RhdHVzOiAweCUwOGxYLCBjb3VudDogJWRcbiIsCi0JCQlwcml2LT5zdGF0dXMsIGNvdW50KTsKLQl9Ci0KLQlkZXNjID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAxICogc2l6ZW9mKHUzMikpOwotCXByaXYtPmlzcl9zdGF0cy5lcnJfY29kZSA9IGRlc2M7Ci0JcGMgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDIgKiBzaXplb2YodTMyKSk7Ci0JYmxpbmsxID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAzICogc2l6ZW9mKHUzMikpOwotCWJsaW5rMiA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgNCAqIHNpemVvZih1MzIpKTsKLQlpbGluazEgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDUgKiBzaXplb2YodTMyKSk7Ci0JaWxpbmsyID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA2ICogc2l6ZW9mKHUzMikpOwotCWRhdGExID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA3ICogc2l6ZW9mKHUzMikpOwotCWRhdGEyID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA4ICogc2l6ZW9mKHUzMikpOwotCWxpbmUgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDkgKiBzaXplb2YodTMyKSk7Ci0JdGltZSA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgMTEgKiBzaXplb2YodTMyKSk7Ci0JaGNtZCA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgMjIgKiBzaXplb2YodTMyKSk7Ci0KLQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfdWNvZGVfZXJyb3IocHJpdiwgZGVzYywKLQkJCQkJdGltZSwgZGF0YTEsIGRhdGEyLCBsaW5lLAotCQkJCSAgICAgIGJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMik7Ci0KLQlJV0xfRVJSKHByaXYsICJEZXNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgIgotCQkiZGF0YTEgICAgICBkYXRhMiAgICAgIGxpbmVcbiIpOwotCUlXTF9FUlIocHJpdiwgIiUtMjhzICgweCUwNFgpICUwMTB1IDB4JTA4WCAweCUwOFggJXVcbiIsCi0JCWl3bDQ5NjVfZGVzY19sb29rdXAoZGVzYyksIGRlc2MsIHRpbWUsIGRhdGExLCBkYXRhMiwgbGluZSk7Ci0JSVdMX0VSUihwcml2LCAicGMgICAgICBibGluazEgIGJsaW5rMiAgaWxpbmsxICBpbGluazIgIGhjbWRcbiIpOwotCUlXTF9FUlIocHJpdiwgIjB4JTA1WCAweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYXG4iLAotCQlwYywgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyLCBoY21kKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9yZl9raWxsX2N0X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jdF9raWxsX2NvbmZpZyBjbWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAotCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfUkVHX0JJVF9DVF9LSUxMX0VYSVQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWNtZC5jcml0aWNhbF90ZW1wZXJhdHVyZV9SID0KLQkJY3B1X3RvX2xlMzIocHJpdi0+aHdfcGFyYW1zLmN0X2tpbGxfdGhyZXNob2xkKTsKLQotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX0NUX0tJTExfQ09ORklHX0NNRCwKLQkJCSAgICAgICBzaXplb2YoY21kKSwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJSVdMX0VSUihwcml2LCAiUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EIGZhaWxlZFxuIik7Ci0JZWxzZQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EICIKLQkJCQkic3VjY2VlZGVkLCAiCi0JCQkJImNyaXRpY2FsIHRlbXBlcmF0dXJlIGlzICVkXG4iLAotCQkJCXByaXYtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzOCBkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm9bXSA9IHsKLQlJV0xfVFhfRklGT19WTywKLQlJV0xfVFhfRklGT19WSSwKLQlJV0xfVFhfRklGT19CRSwKLQlJV0xfVFhfRklGT19CSywKLQlJV0w0OV9DTURfRklGT19OVU0sCi0JSVdMX1RYX0ZJRk9fVU5VU0VELAotCUlXTF9UWF9GSUZPX1VOVVNFRCwKLX07Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9hbGl2ZV9ub3RpZnkoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGksIGNoYW47Ci0JdTMyIHJlZ192YWw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQ2xlYXIgNDk2NSdzIGludGVybmFsIFR4IFNjaGVkdWxlciBkYXRhIGJhc2UgKi8KLQlwcml2LT5zY2RfYmFzZV9hZGRyID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwKLQkJCQkJSVdMNDlfU0NEX1NSQU1fQkFTRV9BRERSKTsKLQlhID0gcHJpdi0+c2NkX2Jhc2VfYWRkciArIElXTDQ5X1NDRF9DT05URVhUX0RBVEFfT0ZGU0VUOwotCWZvciAoOyBhIDwgcHJpdi0+c2NkX2Jhc2VfYWRkciArIElXTDQ5X1NDRF9UWF9TVFRTX0JJVE1BUF9PRkZTRVQ7IGEgKz0gNCkKLQkJaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LCBhLCAwKTsKLQlmb3IgKDsgYSA8IHByaXYtPnNjZF9iYXNlX2FkZHIgKyBJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVQ7IGEgKz0gNCkKLQkJaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LCBhLCAwKTsKLQlmb3IgKDsgYSA8IHByaXYtPnNjZF9iYXNlX2FkZHIgKwotCSAgICAgICBJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUocHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtKTsgYSArPSA0KQotCQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIGEsIDApOwotCi0JLyogVGVsIDQ5NjUgd2hlcmUgdG8gZmluZCBUeCBieXRlIGNvdW50IHRhYmxlcyAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBJV0w0OV9TQ0RfRFJBTV9CQVNFX0FERFIsCi0JCQlwcml2LT5zY2RfYmNfdGJscy5kbWEgPj4gMTApOwotCi0JLyogRW5hYmxlIERNQSBjaGFubmVsICovCi0JZm9yIChjaGFuID0gMDsgY2hhbiA8IEZINDlfVENTUl9DSE5MX05VTSA7IGNoYW4rKykKLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LAotCQkJCUZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNoYW4pLAotCQkJCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFIHwKLQkJCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFKTsKLQotCS8qIFVwZGF0ZSBGSCBjaGlja2VuIGJpdHMgKi8KLQlyZWdfdmFsID0gaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEZIX1RYX0NISUNLRU5fQklUU19SRUcpOwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfVFhfQ0hJQ0tFTl9CSVRTX1JFRywKLQkJCSAgIHJlZ192YWwgfCBGSF9UWF9DSElDS0VOX0JJVFNfU0NEX0FVVE9fUkVUUllfRU4pOwotCi0JLyogRGlzYWJsZSBjaGFpbiBtb2RlIGZvciBhbGwgcXVldWVzICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIElXTDQ5X1NDRF9RVUVVRUNIQUlOX1NFTCwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIGVhY2ggVHggcXVldWUgKGluY2x1ZGluZyB0aGUgY29tbWFuZCBxdWV1ZSkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBpKyspIHsKLQotCQkvKiBURkQgY2lyY3VsYXIgYnVmZmVyIHJlYWQvd3JpdGUgaW5kZXhlcyAqLwotCQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFX1JEUFRSKGkpLCAwKTsKLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfV1JQVFIsIDAgfCAoaSA8PCA4KSk7Ci0KLQkJLyogTWF4IFR4IFdpbmRvdyBzaXplIGZvciBTY2hlZHVsZXItQUNLIG1vZGUgKi8KLQkJaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LCBwcml2LT5zY2RfYmFzZV9hZGRyICsKLQkJCQlJV0w0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoaSksCi0JCQkJKFNDRF9XSU5fU0laRSA8PAotCQkJCUlXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9QT1MpICYKLQkJCQlJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfTVNLKTsKLQotCQkvKiBGcmFtZSBsaW1pdCAqLwotCQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIHByaXYtPnNjZF9iYXNlX2FkZHIgKwotCQkJCUlXTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVChpKSArCi0JCQkJc2l6ZW9mKHUzMiksCi0JCQkJKFNDRF9GUkFNRV9MSU1JVCA8PAotCQkJCUlXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MpICYKLQkJCQlJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfTVNLKTsKLQotCX0KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgSVdMNDlfU0NEX0lOVEVSUlVQVF9NQVNLLAotCQkJCSAoMSA8PCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0pIC0gMSk7Ci0KLQkvKiBBY3RpdmF0ZSBhbGwgVHggRE1BL0ZJRk8gY2hhbm5lbHMgKi8KLQlpd2w0OTY1X3R4cV9zZXRfc2NoZWQocHJpdiwgSVdMX01BU0soMCwgNikpOwotCi0JaXdsNDk2NV9zZXRfd3JfcHRycyhwcml2LCBJV0xfREVGQVVMVF9DTURfUVVFVUVfTlVNLCAwKTsKLQotCS8qIG1ha2Ugc3VyZSBhbGwgcXVldWUgYXJlIG5vdCBzdG9wcGVkICovCi0JbWVtc2V0KCZwcml2LT5xdWV1ZV9zdG9wcGVkWzBdLCAwLCBzaXplb2YocHJpdi0+cXVldWVfc3RvcHBlZCkpOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCWF0b21pY19zZXQoJnByaXYtPnF1ZXVlX3N0b3BfY291bnRbaV0sIDApOwotCi0JLyogcmVzZXQgdG8gMCB0byBlbmFibGUgYWxsIHRoZSBxdWV1ZSBmaXJzdCAqLwotCXByaXYtPnR4cV9jdHhfYWN0aXZlX21zayA9IDA7Ci0JLyogTWFwIGVhY2ggVHgvY21kIHF1ZXVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGZpZm8gKi8KLQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm8pICE9IDcpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGVmYXVsdF9xdWV1ZV90b190eF9maWZvKTsgaSsrKSB7Ci0JCWludCBhYyA9IGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmb1tpXTsKLQotCQlpd2xfdHhxX2N0eF9hY3RpdmF0ZShwcml2LCBpKTsKLQotCQlpZiAoYWMgPT0gSVdMX1RYX0ZJRk9fVU5VU0VEKQotCQkJY29udGludWU7Ci0KLQkJaXdsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKHByaXYsICZwcml2LT50eHFbaV0sIGFjLCAwKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2FsaXZlX3N0YXJ0IC0gY2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZAotICogICAgICAgICAgICAgICAgICAgZnJvbSBwcm90b2NvbC9ydW50aW1lIHVDb2RlIChpbml0aWFsaXphdGlvbiB1Q29kZSdzCi0gKiAgICAgICAgICAgICAgICAgICBBbGl2ZSBnZXRzIGhhbmRsZWQgYnkgaXdsX2luaXRfYWxpdmVfc3RhcnQoKSkuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfYWxpdmVfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUnVudGltZSBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCi0JaWYgKHByaXYtPmNhcmRfYWxpdmUuaXNfdmFsaWQgIT0gVUNPREVfVkFMSURfT0spIHsKLQkJLyogV2UgaGFkIGFuIGVycm9yIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSwgc28gdGFrZSBpdAotCQkgKiBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLwotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQWxpdmUgZmFpbGVkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHVDb2RlIGhhcyBsb2FkZWQgUnVudGltZSB1Q29kZSAuLi4gdmVyaWZ5IGluc3QgaW1hZ2UuCi0JICogVGhpcyBpcyBhIHBhcmFub2lkIGNoZWNrLCBiZWNhdXNlIHdlIHdvdWxkIG5vdCBoYXZlIGdvdHRlbiB0aGUKLQkgKiAicnVudGltZSIgYWxpdmUgaWYgY29kZSB3ZXJlbid0IHByb3Blcmx5IGxvYWRlZC4gICovCi0JaWYgKGl3bDQ5NjVfdmVyaWZ5X3Vjb2RlKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3YXMgYmFkOwotCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJCYWQgcnVudGltZSB1Q29kZSBsb2FkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQlyZXQgPSBpd2w0OTY1X2FsaXZlX25vdGlmeShwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9XQVJOKHByaXYsCi0JCQkiQ291bGQgbm90IGNvbXBsZXRlIEFMSVZFIHRyYW5zaXRpb24gW250Zl06ICVkXG4iLCByZXQpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCi0KLQkvKiBBZnRlciB0aGUgQUxJVkUgcmVzcG9uc2UsIHdlIGNhbiBzZW5kIGhvc3QgY29tbWFuZHMgdG8gdGhlIHVDb2RlICovCi0Jc2V0X2JpdChTVEFUVVNfQUxJVkUsICZwcml2LT5zdGF0dXMpOwotCi0JLyogRW5hYmxlIHdhdGNoZG9nIHRvIG1vbml0b3IgdGhlIGRyaXZlciB0eCBxdWV1ZXMgKi8KLQlpd2xfbGVnYWN5X3NldHVwX3dhdGNoZG9nKHByaXYpOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfcmZraWxsKHByaXYpKQotCQlyZXR1cm47Ci0KLQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOwotCi0JcHJpdi0+YWN0aXZlX3JhdGUgPSBJV0xfUkFURVNfTUFTSzsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKLQkJc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKmFjdGl2ZV9yeG9uID0KLQkJCQkoc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKikmY3R4LT5hY3RpdmU7Ci0JCS8qIGFwcGx5IGFueSBjaGFuZ2VzIGluIHN0YWdpbmcgKi8KLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wOwotCQkvKiBJbml0aWFsaXplIG91ciByeF9jb25maWcgZGF0YSAqLwotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkKLQkJCWl3bF9sZWdhY3lfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhwcml2LCB0bXApOwotCi0JCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQl9Ci0KLQkvKiBDb25maWd1cmUgYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIGlmIGVuYWJsZWQgKi8KLQlpd2xfbGVnYWN5X3NlbmRfYnRfY29uZmlnKHByaXYpOwotCi0JaXdsNDk2NV9yZXNldF9ydW5fdGltZV9jYWxpYihwcml2KTsKLQotCXNldF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIENvbmZpZ3VyZSB0aGUgYWRhcHRlciBmb3IgdW5hc3NvY2lhdGVkIG9wZXJhdGlvbiAqLwotCWl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBOSUMgaXMgaW5pdGlhbGl6ZWQgYW5kIG9wZXJhdGlvbmFsICovCi0JaXdsNDk2NV9yZl9raWxsX2N0X2NvbmZpZyhwcml2KTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJBTElWRSBwcm9jZXNzaW5nIGNvbXBsZXRlLlxuIik7Ci0Jd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQotCWl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlVwZGF0ZWQgcG93ZXIgbW9kZVxuIik7Ci0KLQlyZXR1cm47Ci0KLSByZXN0YXJ0OgotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzdGFydCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotc3RhdGljIHZvaWQgX19pd2w0OTY1X2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGV4aXRfcGVuZGluZzsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsIERSVl9OQU1FICIgaXMgZ29pbmcgZG93blxuIik7Ci0KLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQotCWV4aXRfcGVuZGluZyA9IHRlc3RfYW5kX3NldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBTdG9wIFRYIHF1ZXVlcyB3YXRjaGRvZy4gV2UgbmVlZCB0byBoYXZlIFNUQVRVU19FWElUX1BFTkRJTkcgYml0IHNldAotCSAqIHRvIHByZXZlbnQgcmVhcm0gdGltZXIgKi8KLQlkZWxfdGltZXJfc3luYygmcHJpdi0+d2F0Y2hkb2cpOwotCi0JaXdsX2xlZ2FjeV9jbGVhcl91Y29kZV9zdGF0aW9ucyhwcml2LCBOVUxMKTsKLQlpd2xfbGVnYWN5X2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMocHJpdik7Ci0JaXdsX2xlZ2FjeV9jbGVhcl9kcml2ZXJfc3RhdGlvbnMocHJpdik7Ci0KLQkvKiBVbmJsb2NrIGFueSB3YWl0aW5nIGNhbGxzICovCi0Jd2FrZV91cF9hbGwoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0KLQkvKiBXaXBlIG91dCB0aGUgRVhJVF9QRU5ESU5HIHN0YXR1cyBiaXQgaWYgd2UgYXJlIG5vdCBhY3R1YWxseQotCSAqIGV4aXRpbmcgdGhlIG1vZHVsZSAqLwotCWlmICghZXhpdF9wZW5kaW5nKQotCQljbGVhcl9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBzdG9wIGFuZCByZXNldCB0aGUgb24tYm9hcmQgcHJvY2Vzc29yICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7Ci0KLQkvKiB0ZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bF9sZWdhY3lfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2w0OTY1X3N5bmNocm9uaXplX2lycShwcml2KTsKLQotCWlmIChwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKQotCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMocHJpdi0+aHcpOwotCi0JLyogSWYgd2UgaGF2ZSBub3QgcHJldmlvdXNseSBjYWxsZWQgaXdsX2luaXQoKSB0aGVuCi0JICogY2xlYXIgYWxsIGJpdHMgYnV0IHRoZSBSRiBLaWxsIGJpdCBhbmQgcmV0dXJuICovCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2luaXQocHJpdikpIHsKLQkJcHJpdi0+c3RhdHVzID0gdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJCVNUQVRVU19SRl9LSUxMX0hXIHwKLQkJCSAgICAgICB0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJCVNUQVRVU19HRU9fQ09ORklHVVJFRCB8Ci0JCQkgICAgICAgdGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgPDwKLQkJCQkJU1RBVFVTX0VYSVRfUEVORElORzsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIC4uLm90aGVyd2lzZSBjbGVhciBvdXQgYWxsIHRoZSBzdGF0dXMgYml0cyBidXQgdGhlIFJGIEtpbGwKLQkgKiBiaXQgYW5kIGNvbnRpbnVlIHRha2luZyB0aGUgTklDIGRvd24uICovCi0JcHJpdi0+c3RhdHVzICY9IHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19SRl9LSUxMX0hXIHwKLQkJCXRlc3RfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cykgPDwKLQkJCQlTVEFUVVNfR0VPX0NPTkZJR1VSRUQgfAotCQkJdGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19GV19FUlJPUiB8Ci0JCSAgICAgICB0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19FWElUX1BFTkRJTkc7Ci0KLQlpd2w0OTY1X3R4cV9jdHhfc3RvcChwcml2KTsKLQlpd2w0OTY1X3J4cV9zdG9wKHByaXYpOwotCi0JLyogUG93ZXItZG93biBkZXZpY2UncyBidXNtYXN0ZXIgRE1BIGNsb2NrcyAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBUE1HX0NMS19ESVNfUkVHLCBBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOwotCXVkZWxheSg1KTsKLQotCS8qIE1ha2Ugc3VyZSAocmVkdW5kYW50KSB3ZSd2ZSByZWxlYXNlZCBvdXIgcmVxdWVzdCB0byBzdGF5IGF3YWtlICovCi0JaXdsX2xlZ2FjeV9jbGVhcl9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAotCQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7Ci0KLQkvKiBTdG9wIHRoZSBkZXZpY2UsIGFuZCBwdXQgaXQgaW4gbG93IHBvd2VyIHN0YXRlICovCi0JaXdsX2xlZ2FjeV9hcG1fc3RvcChwcml2KTsKLQotIGV4aXQ6Ci0JbWVtc2V0KCZwcml2LT5jYXJkX2FsaXZlLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9hbGl2ZV9yZXNwKSk7Ci0KLQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCXByaXYtPmJlYWNvbl9za2IgPSBOVUxMOwotCi0JLyogY2xlYXIgb3V0IGFueSBmcmVlIGZyYW1lcyAqLwotCWl3bDQ5NjVfY2xlYXJfZnJlZV9mcmFtZXMocHJpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCV9faXdsNDk2NV9kb3duKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaXdsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKLX0KLQotI2RlZmluZSBIV19SRUFEWV9USU1FT1VUICg1MCkKLQotc3RhdGljIGludCBpd2w0OTY1X3NldF9od19yZWFkeShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFkpOwotCi0JLyogU2VlIGlmIHdlIGdvdCBpdCAqLwotCXJldCA9IGl3bF9wb2xsX2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZLAotCQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFksCi0JCQkJSFdfUkVBRFlfVElNRU9VVCk7Ci0JaWYgKHJldCAhPSAtRVRJTUVET1VUKQotCQlwcml2LT5od19yZWFkeSA9IHRydWU7Ci0JZWxzZQotCQlwcml2LT5od19yZWFkeSA9IGZhbHNlOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImhhcmR3YXJlICVzXG4iLAotCQkgICAgICAocHJpdi0+aHdfcmVhZHkgPT0gMSkgPyAicmVhZHkiIDogIm5vdCByZWFkeSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9wcmVwYXJlX2NhcmRfaHcoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIml3bDQ5NjVfcHJlcGFyZV9jYXJkX2h3IGVudGVyXG4iKTsKLQotCXJldCA9IGl3bDQ5NjVfc2V0X2h3X3JlYWR5KHByaXYpOwotCWlmIChwcml2LT5od19yZWFkeSkKLQkJcmV0dXJuIHJldDsKLQotCS8qIElmIEhXIGlzIG5vdCByZWFkeSwgcHJlcGFyZSB0aGUgY29uZGl0aW9ucyB0byBjaGVjayBhZ2FpbiAqLwotCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX1BSRVBBUkUpOwotCi0JcmV0ID0gaXdsX3BvbGxfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJfkNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUFJFUEFSRV9ET05FLAotCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUsIDE1MDAwMCk7Ci0KLQkvKiBIVyBzaG91bGQgYmUgcmVhZHkgYnkgbm93LCBjaGVjayBhZ2Fpbi4gKi8KLQlpZiAocmV0ICE9IC1FVElNRURPVVQpCi0JCWl3bDQ5NjVfc2V0X2h3X3JlYWR5KHByaXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBNQVhfSFdfUkVTVEFSVFMgNQotCi1zdGF0aWMgaW50IF9faXdsNDk2NV91cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQlpbnQgaTsKLQlpbnQgcmV0OwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJFeGl0IHBlbmRpbmc7IHdpbGwgbm90IGJyaW5nIHRoZSBOSUMgdXBcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAoIXByaXYtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciB8fCAhcHJpdi0+dWNvZGVfZGF0YS52X2FkZHIpIHsKLQkJSVdMX0VSUihwcml2LCAidWNvZGUgbm90IGF2YWlsYWJsZSBmb3IgZGV2aWNlIGJyaW5ndXBcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQlyZXQgPSBpd2w0OTY1X2FsbG9jX2JjYXN0X3N0YXRpb24ocHJpdiwgY3R4KTsKLQkJaWYgKHJldCkgewotCQkJaXdsX2xlZ2FjeV9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHByaXYpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCWl3bDQ5NjVfcHJlcGFyZV9jYXJkX2h3KHByaXYpOwotCi0JaWYgKCFwcml2LT5od19yZWFkeSkgewotCQlJV0xfV0FSTihwcml2LCAiRXhpdCBIVyBub3QgcmVhZHlcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBJZiBwbGF0Zm9ybSdzIFJGX0tJTEwgc3dpdGNoIGlzIE5PVCBzZXQgdG8gS0lMTCAqLwotCWlmIChpd2xfcmVhZDMyKHByaXYsCi0JCUNTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykKLQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQllbHNlCi0JCXNldF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfcmZraWxsKHByaXYpKSB7Ci0JCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+aHctPndpcGh5LCB0cnVlKTsKLQotCQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCQlJV0xfV0FSTihwcml2LCAiUmFkaW8gZGlzYWJsZWQgYnkgSFcgUkYgS2lsbCBzd2l0Y2hcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQotCS8qIG11c3QgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGl3bF9od19uaWNfaW5pdCAqLwotCXByaXYtPmNtZF9xdWV1ZSA9IElXTF9ERUZBVUxUX0NNRF9RVUVVRV9OVU07Ci0KLQlyZXQgPSBpd2w0OTY1X2h3X25pY19pbml0KHByaXYpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXQgbmljXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAotCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKLQotCS8qIGNsZWFyIChhZ2FpbiksIHRoZW4gZW5hYmxlIGhvc3QgaW50ZXJydXB0cyAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIDB4RkZGRkZGRkYpOwotCWl3bF9sZWdhY3lfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLQkvKiByZWFsbHkgbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCi0JLyogQ29weSBvcmlnaW5hbCB1Y29kZSBkYXRhIGltYWdlIGZyb20gZGlzayBpbnRvIGJhY2t1cCBjYWNoZS4KLQkgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IncwotCSAqIGRhdGEgU1JBTSBmb3IgYSBjbGVhbiBzdGFydCB3aGVuIHRoZSBydW50aW1lIHByb2dyYW0gZmlyc3QgbG9hZHMuICovCi0JbWVtY3B5KHByaXYtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciwgcHJpdi0+dWNvZGVfZGF0YS52X2FkZHIsCi0JICAgICAgIHByaXYtPnVjb2RlX2RhdGEubGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFdfUkVTVEFSVFM7IGkrKykgewotCi0JCS8qIGxvYWQgYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUsCi0JCSAqIGxvYWQgYm9vdHN0cmFwIHByb2dyYW0gaW50byBwcm9jZXNzb3IncyBtZW1vcnksCi0JCSAqIHByZXBhcmUgdG8gbG9hZCB0aGUgImluaXRpYWxpemUiIHVDb2RlICovCi0JCXJldCA9IHByaXYtPmNmZy0+b3BzLT5saWItPmxvYWRfdWNvZGUocHJpdik7Ci0KLQkJaWYgKHJldCkgewotCQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIHNldCB1cCBib290c3RyYXAgdUNvZGU6ICVkXG4iLAotCQkJCXJldCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIHN0YXJ0IGNhcmQ7ICJpbml0aWFsaXplIiB3aWxsIGxvYWQgcnVudGltZSB1Y29kZSAqLwotCQlpd2w0OTY1X25pY19zdGFydChwcml2KTsKLQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCBEUlZfTkFNRSAiIGlzIGNvbWluZyB1cFxuIik7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc2V0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKLQlfX2l3bDQ5NjVfZG93bihwcml2KTsKLQljbGVhcl9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiB0cmllZCB0byByZXN0YXJ0IGFuZCBjb25maWcgdGhlIGRldmljZSBmb3IgYXMgbG9uZyBhcyBvdXIKLQkgKiBwYXRpZW5jZSBjb3VsZCB3aXRoc3RhbmQgKi8KLQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgYWZ0ZXIgJWQgYXR0ZW1wdHMuXG4iLCBpKTsKLQlyZXR1cm4gLUVJTzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBXb3JrcXVldWUgY2FsbGJhY2tzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX2luaXRfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIGluaXRfYWxpdmVfc3RhcnQud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlnb3RvIG91dDsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmluaXRfYWxpdmVfc3RhcnQocHJpdik7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfYmdfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIGFsaXZlX3N0YXJ0LndvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJZ290byBvdXQ7Ci0KLQlpd2w0OTY1X2FsaXZlX3N0YXJ0KHByaXYpOwotb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX3J1bl90aW1lX2NhbGliX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsCi0JCQlydW5fdGltZV9jYWxpYl93b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHByaXYtPnN0YXJ0X2NhbGliKSB7Ci0JCWl3bDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24ocHJpdiwKLQkJCQkodm9pZCAqKSZwcml2LT5fNDk2NS5zdGF0aXN0aWNzKTsKLQkJaXdsNDk2NV9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihwcml2LAotCQkJCSh2b2lkICopJnByaXYtPl80OTY1LnN0YXRpc3RpY3MpOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIHJlc3RhcnQpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUQVRVU19GV19FUlJPUiwgJnByaXYtPnN0YXR1cykpIHsKLQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KQotCQkJY3R4LT52aWYgPSBOVUxMOwotCQlwcml2LT5pc19vcGVuID0gMDsKLQotCQlfX2l3bDQ5NjVfZG93bihwcml2KTsKLQotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJaXdsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKLQkJaWVlZTgwMjExX3Jlc3RhcnRfaHcocHJpdi0+aHcpOwotCX0gZWxzZSB7Ci0JCWl3bDQ5NjVfZG93bihwcml2KTsKLQotCQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlfX2l3bDQ5NjVfdXAocHJpdik7Ci0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9iZ19yeF9yZXBsZW5pc2goc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIHJ4X3JlcGxlbmlzaCk7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpd2w0OTY1X3J4X3JlcGxlbmlzaChwcml2KTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogbWFjODAyMTEgZW50cnkgcG9pbnQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFVDT0RFX1JFQURZX1RJTUVPVVQJKDQgKiBIWikKLQotLyoKLSAqIE5vdCBhIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9uLCBidXQgaXQgZml0cyBpbiB3aXRoIGFsbCB0aGUKLSAqIG90aGVyIG1hYzgwMjExIGZ1bmN0aW9ucyBncm91cGVkIGhlcmUuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9tYWNfc2V0dXBfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgdTMyIG1heF9wcm9iZV9sZW5ndGgpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlody0+cmF0ZV9jb250cm9sX2FsZ29yaXRobSA9ICJpd2wtNDk2NS1ycyI7Ci0KLQkvKiBUZWxsIG1hYzgwMjExIG91ciBjaGFyYWN0ZXJpc3RpY3MgKi8KLQlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8Ci0JCSAgICBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT04gfAotCQkgICAgSUVFRTgwMjExX0hXX05FRURfRFRJTV9QRVJJT0QgfAotCQkgICAgSUVFRTgwMjExX0hXX1NQRUNUUlVNX01HTVQgfAotCQkgICAgSUVFRTgwMjExX0hXX1JFUE9SVFNfVFhfQUNLX1NUQVRVUzsKLQotCWlmIChwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfTikKLQkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1NNUFMgfAotCQkJICAgICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfU1RBVElDX1NNUFM7Ci0KLQlody0+c3RhX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdik7Ci0JaHctPnZpZl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF92aWZfcHJpdik7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBjdHgtPmludGVyZmFjZV9tb2RlczsKLQkJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOwotCX0KLQotCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB8Ci0JCQkgICAgV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUzsKLQotCS8qCi0JICogRm9yIG5vdywgZGlzYWJsZSBQUyBieSBkZWZhdWx0IGJlY2F1c2UgaXQgYWZmZWN0cwotCSAqIFJYIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuCi0JICovCi0JaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotCi0JaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVg7Ci0JLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLwotCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gbWF4X3Byb2JlX2xlbmd0aCAtIDI0IC0gMjsKLQotCS8qIERlZmF1bHQgdmFsdWU7IDQgRURDQSBRT1MgcHJpb3JpdGllcyAqLwotCWh3LT5xdWV1ZXMgPSA0OwotCi0JaHctPm1heF9saXN0ZW5faW50ZXJ2YWwgPSBJV0xfQ09OTl9NQVhfTElTVEVOX0lOVEVSVkFMOwotCi0JaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHMpCi0JCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPQotCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOwotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKQotCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0KLQkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKLQotCWl3bF9sZWdhY3lfbGVkc19pbml0KHByaXYpOwotCi0JcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KHByaXYtPmh3KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZWdpc3RlciBodyAoZXJyb3IgJWQpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi0KLWludCBpd2w0OTY1X21hY19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQkvKiB3ZSBzaG91bGQgYmUgdmVyaWZ5aW5nIHRoZSBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgb3BlbmVkICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCXJldCA9IF9faXdsNDk2NV91cChwcml2KTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpCi0JCWdvdG8gb3V0OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlN0YXJ0IFVQIHdvcmsgZG9uZS5cbiIpOwotCi0JLyogV2FpdCBmb3IgU1RBUlRfQUxJVkUgZnJvbSBSdW4gVGltZSB1Y29kZS4gT3RoZXJ3aXNlIGNhbGxiYWNrcyBmcm9tCi0JICogbWFjODAyMTEgd2lsbCBub3QgYmUgcnVuIHN1Y2Nlc3NmdWxseS4gKi8KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlLAotCQkJdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKSwKLQkJCVVDT0RFX1JFQURZX1RJTUVPVVQpOwotCWlmICghcmV0KSB7Ci0JCWlmICghdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJSVdMX0VSUihwcml2LCAiU1RBUlRfQUxJVkUgdGltZW91dCBhZnRlciAlZG1zLlxuIiwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKFVDT0RFX1JFQURZX1RJTUVPVVQpKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JfQotCi0JaXdsNDk2NV9sZWRfZW5hYmxlKHByaXYpOwotCi1vdXQ6Ci0JcHJpdi0+aXNfb3BlbiA9IDE7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgaXdsNDk2NV9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKCFwcml2LT5pc19vcGVuKQotCQlyZXR1cm47Ci0KLQlwcml2LT5pc19vcGVuID0gMDsKLQotCWl3bDQ5NjVfZG93bihwcml2KTsKLQotCWZsdXNoX3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCi0JLyogVXNlciBzcGFjZSBzb2Z0d2FyZSBtYXkgZXhwZWN0IGdldHRpbmcgcmZraWxsIGNoYW5nZXMKLQkgKiBldmVuIGlmIGludGVyZmFjZSBpcyBkb3duICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVCwgMHhGRkZGRkZGRik7Ci0JaXdsX2xlZ2FjeV9lbmFibGVfcmZraWxsX2ludChwcml2KTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi12b2lkIGl3bDQ5NjVfbWFjX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JSVdMX0RFQlVHX01BQ0RVTVAocHJpdiwgImVudGVyXG4iKTsKLQotCUlXTF9ERUJVR19UWChwcml2LCAiZGV2LT54bWl0KCVkIGJ5dGVzKSBhdCByYXRlIDB4JTAyeFxuIiwgc2tiLT5sZW4sCi0JCSAgICAgaWVlZTgwMjExX2dldF90eF9yYXRlKGh3LCBJRUVFODAyMTFfU0tCX0NCKHNrYikpLT5iaXRyYXRlKTsKLQotCWlmIChpd2w0OTY1X3R4X3NrYihwcml2LCBza2IpKQotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCi0JSVdMX0RFQlVHX01BQ0RVTVAocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotdm9pZCBpd2w0OTY1X21hY191cGRhdGVfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJdTMyIGl2MzIsIHUxNiAqcGhhc2Uxa2V5KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpd2w0OTY1X3VwZGF0ZV90a2lwX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LCBrZXljb25mLCBzdGEsCi0JCQkgICAgaXYzMiwgcGhhc2Uxa2V5KTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi1pbnQgaXdsNDk2NV9tYWNfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSB2aWZfcHJpdi0+Y3R4OwotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCWJvb2wgaXNfZGVmYXVsdF93ZXBfa2V5ID0gZmFsc2U7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmIChwcml2LT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0bykgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gaHdjcnlwdG8gZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0Jc3RhX2lkID0gaXdsX2xlZ2FjeV9zdGFfaWRfb3JfYnJvYWRjYXN0KHByaXYsIHZpZl9wcml2LT5jdHgsIHN0YSk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKTsKLQotCS8qCi0JICogSWYgd2UgYXJlIGdldHRpbmcgV0VQIGdyb3VwIGtleSBhbmQgd2UgZGlkbid0IHJlY2VpdmUgYW55IGtleSBtYXBwaW5nCi0JICogc28gZmFyLCB3ZSBhcmUgaW4gbGVnYWN5IHdlcCBtb2RlIChncm91cCBrZXkgb25seSksIG90aGVyd2lzZSB3ZSBhcmUKLQkgKiBpbiAxWCBtb2RlLgotCSAqIEluIGxlZ2FjeSB3ZXAgbW9kZSwgd2UgdXNlIGFub3RoZXIgaG9zdCBjb21tYW5kIHRvIHRoZSB1Q29kZS4KLQkgKi8KLQlpZiAoKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8Ci0JICAgICBrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpICYmCi0JICAgICFzdGEpIHsKLQkJaWYgKGNtZCA9PSBTRVRfS0VZKQotCQkJaXNfZGVmYXVsdF93ZXBfa2V5ID0gIWN0eC0+a2V5X21hcHBpbmdfa2V5czsKLQkJZWxzZQotCQkJaXNfZGVmYXVsdF93ZXBfa2V5ID0KLQkJCQkJKGtleS0+aHdfa2V5X2lkeCA9PSBIV19LRVlfREVGQVVMVCk7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNFVF9LRVk6Ci0JCWlmIChpc19kZWZhdWx0X3dlcF9rZXkpCi0JCQlyZXQgPSBpd2w0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkocHJpdiwKLQkJCQkJCQl2aWZfcHJpdi0+Y3R4LCBrZXkpOwotCQllbHNlCi0JCQlyZXQgPSBpd2w0OTY1X3NldF9keW5hbWljX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LAotCQkJCQkJICBrZXksIHN0YV9pZCk7Ci0KLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbmFibGUgaHdjcnlwdG8ga2V5XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBESVNBQkxFX0tFWToKLQkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKLQkJCXJldCA9IGl3bDQ5NjVfcmVtb3ZlX2RlZmF1bHRfd2VwX2tleShwcml2LCBjdHgsIGtleSk7Ci0JCWVsc2UKLQkJCXJldCA9IGl3bDQ5NjVfcmVtb3ZlX2R5bmFtaWNfa2V5KHByaXYsIGN0eCwKLQkJCQkJCQlrZXksIHN0YV9pZCk7Ci0KLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJkaXNhYmxlIGh3Y3J5cHRvIGtleVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaXdsNDk2NV9tYWNfYW1wZHVfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuLAotCQkJICAgIHU4IGJ1Zl9zaXplKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JSVdMX0RFQlVHX0hUKHByaXYsICJBLU1QRFUgYWN0aW9uIG9uIGFkZHIgJXBNIHRpZCAlZFxuIiwKLQkJICAgICBzdGEtPmFkZHIsIHRpZCk7Ci0KLQlpZiAoIShwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfTikpCi0JCXJldHVybiAtRUFDQ0VTOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdGFydCBSeFxuIik7Ci0JCXJldCA9IGl3bDQ5NjVfc3RhX3J4X2FnZ19zdGFydChwcml2LCBzdGEsIHRpZCwgKnNzbik7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6Ci0JCUlXTF9ERUJVR19IVChwcml2LCAic3RvcCBSeFxuIik7Ci0JCXJldCA9IGl3bDQ5NjVfc3RhX3J4X2FnZ19zdG9wKHByaXYsIHN0YSwgdGlkKTsKLQkJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6Ci0JCUlXTF9ERUJVR19IVChwcml2LCAic3RhcnQgVHhcbiIpOwotCQlyZXQgPSBpd2w0OTY1X3R4X2FnZ19zdGFydChwcml2LCB2aWYsIHN0YSwgdGlkLCBzc24pOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QOgotCQlJV0xfREVCVUdfSFQocHJpdiwgInN0b3AgVHhcbiIpOwotCQlyZXQgPSBpd2w0OTY1X3R4X2FnZ19zdG9wKHByaXYsIHZpZiwgc3RhLCB0aWQpOwotCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCQlyZXQgPSAwOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTDoKLQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGl3bDQ5NjVfbWFjX3N0YV9hZGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7Ci0JYm9vbCBpc19hcCA9IHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInJlY2VpdmVkIHJlcXVlc3QgdG8gYWRkIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInByb2NlZWRpbmcgdG8gYWRkIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQlzdGFfcHJpdi0+Y29tbW9uLnN0YV9pZCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQlhdG9taWNfc2V0KCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMsIDApOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9hZGRfc3RhdGlvbl9jb21tb24ocHJpdiwgdmlmX3ByaXYtPmN0eCwgc3RhLT5hZGRyLAotCQkJCSAgICAgaXNfYXAsIHN0YSwgJnN0YV9pZCk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNICglZClcbiIsCi0JCQlzdGEtPmFkZHIsIHJldCk7Ci0JCS8qIFNob3VsZCB3ZSByZXR1cm4gc3VjY2VzcyBpZiByZXR1cm4gY29kZSBpcyBFRVhJU1QgPyAqLwotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzdGFfcHJpdi0+Y29tbW9uLnN0YV9pZCA9IHN0YV9pZDsKLQotCS8qIEluaXRpYWxpemUgcmF0ZSBzY2FsaW5nICovCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemluZyByYXRlIHNjYWxpbmcgZm9yIHN0YXRpb24gJXBNXG4iLAotCQkgICAgICAgc3RhLT5hZGRyKTsKLQlpd2w0OTY1X3JzX3JhdGVfaW5pdChwcml2LCBzdGEsIHN0YV9pZCk7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpd2w0OTY1X21hY19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNoX3N3aXRjaC0+Y2hhbm5lbDsKLQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZzsKLQotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0JdTE2IGNoOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlnb3RvIG91dDsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQotCQlnb3RvIG91dDsKLQotCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKQotCQlnb3RvIG91dDsKLQotCWNoID0gY2hhbm5lbC0+aHdfdmFsdWU7Ci0JaWYgKGxlMTZfdG9fY3B1KGN0eC0+YWN0aXZlLmNoYW5uZWwpID09IGNoKQotCQlnb3RvIG91dDsKLQotCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgY2hhbm5lbC0+YmFuZCwgY2gpOwotCWlmICghaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiaW52YWxpZCBjaGFubmVsXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7Ci0KLQlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOwotCi0JLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KLQljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOwotCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKLQkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgewotCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOwotCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKLQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKLQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOwotCQl9IGVsc2UgewotCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7Ci0JCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0JCX0KLQl9IGVsc2UKLQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOwotCi0JaWYgKChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgIT0gY2gpKQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOwotCi0JaXdsX2xlZ2FjeV9zZXRfcnhvbl9jaGFubmVsKHByaXYsIGNoYW5uZWwsIGN0eCk7Ci0JaXdsX2xlZ2FjeV9zZXRfcnhvbl9odChwcml2LCBodF9jb25mKTsKLQlpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW5uZWwtPmJhbmQsIGN0eC0+dmlmKTsKLQotCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7Ci0KLQlpd2xfbGVnYWN5X3NldF9yYXRlKHByaXYpOwotCS8qCi0JICogYXQgdGhpcyBwb2ludCwgc3RhZ2luZ19yeG9uIGhhcyB0aGUKLQkgKiBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsIHN3aXRjaAotCSAqLwotCXNldF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCXByaXYtPnN3aXRjaF9jaGFubmVsID0gY3B1X3RvX2xlMTYoY2gpOwotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gocHJpdiwgY2hfc3dpdGNoKSkgewotCQljbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7Ci0JCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7Ci0JfQotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXZvaWQgaXdsNDk2NV9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKLQkJCSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKLQkJCSAgICAgdTY0IG11bHRpY2FzdCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlfX2xlMzIgZmlsdGVyX29yID0gMCwgZmlsdGVyX25hbmQgPSAwOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLSNkZWZpbmUgQ0hLKHRlc3QsIGZsYWcpCWRvIHsgXAotCWlmICgqdG90YWxfZmxhZ3MgJiAodGVzdCkpCQlcCi0JCWZpbHRlcl9vciB8PSAoZmxhZyk7CQlcCi0JZWxzZQkJCQkJXAotCQlmaWx0ZXJfbmFuZCB8PSAoZmxhZyk7CQlcCi0JfSB3aGlsZSAoMCkKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiRW50ZXI6IGNoYW5nZWQ6IDB4JXgsIHRvdGFsOiAweCV4XG4iLAotCQkJY2hhbmdlZF9mbGFncywgKnRvdGFsX2ZsYWdzKTsKLQotCUNISyhGSUZfT1RIRVJfQlNTIHwgRklGX1BST01JU0NfSU5fQlNTLCBSWE9OX0ZJTFRFUl9QUk9NSVNDX01TSyk7Ci0JLyogU2V0dGluZyBfanVzdF8gUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIGNhdXNlcyBGSCBlcnJvcnMgKi8KLQlDSEsoRklGX0NPTlRST0wsIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyB8IFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKLQlDSEsoRklGX0JDTl9QUkJSRVNQX1BST01JU0MsIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKLQotI3VuZGVmIENISwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+ZmlsdGVyX25hbmQ7Ci0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gZmlsdGVyX29yOwotCi0JCS8qCi0JCSAqIE5vdCBjb21taXR0aW5nIGRpcmVjdGx5IGJlY2F1c2UgaGFyZHdhcmUgY2FuIHBlcmZvcm0gYSBzY2FuLAotCQkgKiBidXQgd2UnbGwgZXZlbnR1YWxseSBjb21taXQgdGhlIGZpbHRlciBmbGFncyBjaGFuZ2UgYW55d2F5LgotCQkgKi8KLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCS8qCi0JICogUmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIGlzIGFsd2F5cyBlbmFibGVkIGJ5IHRoZQotCSAqIGRlZmF1bHQgZmxhZ3Mgc2V0dXAgaW4gaXdsX2xlZ2FjeV9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKCkKLQkgKiBzaW5jZSB3ZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgcHJvZ3JhbW1pbmcgbXVsdGljYXN0Ci0JICogZmlsdGVycyBpbnRvIHRoZSBkZXZpY2UuCi0JICovCi0JKnRvdGFsX2ZsYWdzICY9IEZJRl9PVEhFUl9CU1MgfCBGSUZfQUxMTVVMVEkgfCBGSUZfUFJPTUlTQ19JTl9CU1MgfAotCQkJRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfCBGSUZfQ09OVFJPTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyZG93bgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9iZ190eHBvd2VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsCi0JCQl0eHBvd2VyX3dvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JLyogSWYgYSBzY2FuIGhhcHBlbmVkIHRvIHN0YXJ0IGJlZm9yZSB3ZSBnb3QgaGVyZQotCSAqIHRoZW4ganVzdCByZXR1cm47IHRoZSBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiB3aWxsCi0JICoga2ljayBvZmYgYW5vdGhlciBzY2hlZHVsZWQgd29yayB0byBjb21wZW5zYXRlIGZvcgotCSAqIGFueSB0ZW1wZXJhdHVyZSBkZWx0YSB3ZSBtaXNzZWQgaGVyZS4gKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBSZWdhcmRsZXNzIG9mIGlmIHdlIGFyZSBhc3NvY2lhdGVkLCB3ZSBtdXN0IHJlY29uZmlndXJlIHRoZQotCSAqIFRYIHBvd2VyIHNpbmNlIGZyYW1lcyBjYW4gYmUgc2VudCBvbiBub24tcmFkYXIgY2hhbm5lbHMgd2hpbGUKLQkgKiBub3QgYXNzb2NpYXRlZCAqLwotCXByaXYtPmNmZy0+b3BzLT5saWItPnNlbmRfdHhfcG93ZXIocHJpdik7Ci0KLQkvKiBVcGRhdGUgbGFzdF90ZW1wZXJhdHVyZSB0byBrZWVwIGlzX2NhbGliX25lZWRlZCBmcm9tIHJ1bm5pbmcKLQkgKiB3aGVuIGl0IGlzbid0IG5lZWRlZC4uLiAqLwotCXByaXYtPmxhc3RfdGVtcGVyYXR1cmUgPSBwcml2LT50ZW1wZXJhdHVyZTsKLW91dDoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShEUlZfTkFNRSk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotCi0JSU5JVF9XT1JLKCZwcml2LT5yZXN0YXJ0LCBpd2w0OTY1X2JnX3Jlc3RhcnQpOwotCUlOSVRfV09SSygmcHJpdi0+cnhfcmVwbGVuaXNoLCBpd2w0OTY1X2JnX3J4X3JlcGxlbmlzaCk7Ci0JSU5JVF9XT1JLKCZwcml2LT5ydW5fdGltZV9jYWxpYl93b3JrLCBpd2w0OTY1X2JnX3J1bl90aW1lX2NhbGliX3dvcmspOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pbml0X2FsaXZlX3N0YXJ0LCBpd2w0OTY1X2JnX2luaXRfYWxpdmVfc3RhcnQpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5hbGl2ZV9zdGFydCwgaXdsNDk2NV9iZ19hbGl2ZV9zdGFydCk7Ci0KLQlpd2xfbGVnYWN5X3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayhwcml2KTsKLQotCUlOSVRfV09SSygmcHJpdi0+dHhwb3dlcl93b3JrLCBpd2w0OTY1X2JnX3R4cG93ZXJfd29yayk7Ci0KLQlpbml0X3RpbWVyKCZwcml2LT5zdGF0aXN0aWNzX3BlcmlvZGljKTsKLQlwcml2LT5zdGF0aXN0aWNzX3BlcmlvZGljLmRhdGEgPSAodW5zaWduZWQgbG9uZylwcml2OwotCXByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMuZnVuY3Rpb24gPSBpd2w0OTY1X2JnX3N0YXRpc3RpY3NfcGVyaW9kaWM7Ci0KLQlpbml0X3RpbWVyKCZwcml2LT53YXRjaGRvZyk7Ci0JcHJpdi0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXByaXY7Ci0JcHJpdi0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBpd2xfbGVnYWN5X2JnX3dhdGNoZG9nOwotCi0JdGFza2xldF9pbml0KCZwcml2LT5pcnFfdGFza2xldCwgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKQotCQlpd2w0OTY1X2lycV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+dHhwb3dlcl93b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmluaXRfYWxpdmVfc3RhcnQpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmFsaXZlX3N0YXJ0KTsKLQljYW5jZWxfd29ya19zeW5jKCZwcml2LT5ydW5fdGltZV9jYWxpYl93b3JrKTsKLQotCWl3bF9sZWdhY3lfY2FuY2VsX3NjYW5fZGVmZXJyZWRfd29yayhwcml2KTsKLQotCWRlbF90aW1lcl9zeW5jKCZwcml2LT5zdGF0aXN0aWNzX3BlcmlvZGljKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9pbml0X2h3X3JhdGVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlRfTEVHQUNZOyBpKyspIHsKLQkJcmF0ZXNbaV0uYml0cmF0ZSA9IGl3bGVnYWN5X3JhdGVzW2ldLmllZWUgKiA1OwotCQlyYXRlc1tpXS5od192YWx1ZSA9IGk7IC8qIFJhdGUgc2NhbGluZyB3aWxsIHdvcmsgb24gaW5kZXhlcyAqLwotCQlyYXRlc1tpXS5od192YWx1ZV9zaG9ydCA9IGk7Ci0JCXJhdGVzW2ldLmZsYWdzID0gMDsKLQkJaWYgKChpID49IElXTF9GSVJTVF9DQ0tfUkFURSkgJiYgKGkgPD0gSVdMX0xBU1RfQ0NLX1JBVEUpKSB7Ci0JCQkvKgotCQkJICogSWYgQ0NLICE9IDFNIHRoZW4gc2V0IHNob3J0IHByZWFtYmxlIHJhdGUgZmxhZy4KLQkJCSAqLwotCQkJcmF0ZXNbaV0uZmxhZ3MgfD0KLQkJCQkoaXdsZWdhY3lfcmF0ZXNbaV0ucGxjcCA9PSBJV0xfUkFURV8xTV9QTENQKSA/Ci0JCQkJCTAgOiBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRTsKLQkJfQotCX0KLX0KLS8qCi0gKiBBY3F1aXJlIHByaXYtPmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhCi0gKi8KLXZvaWQgaXdsNDk2NV9zZXRfd3JfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIHUzMiBpbmRleCkKLXsKLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19XUlBUUiwKLQkJCSAgICAgKGluZGV4ICYgMHhmZikgfCAodHhxX2lkIDw8IDgpKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFX1JEUFRSKHR4cV9pZCksIGluZGV4KTsKLX0KLQotdm9pZCBpd2w0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJCWludCB0eF9maWZvX2lkLCBpbnQgc2NkX3JldHJ5KQotewotCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7Ci0KLQkvKiBGaW5kIG91dCB3aGV0aGVyIHRvIGFjdGl2YXRlIFR4IHF1ZXVlICovCi0JaW50IGFjdGl2ZSA9IHRlc3RfYml0KHR4cV9pZCwgJnByaXYtPnR4cV9jdHhfYWN0aXZlX21zaykgPyAxIDogMDsKLQotCS8qIFNldCB1cCBhbmQgYWN0aXZhdGUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFX1NUQVRVU19CSVRTKHR4cV9pZCksCi0JCQkgKGFjdGl2ZSA8PCBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX0FDVElWRSkgfAotCQkJICh0eF9maWZvX2lkIDw8IElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfVFhGKSB8Ci0JCQkgKHNjZF9yZXRyeSA8PCBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1dTTCkgfAotCQkJIChzY2RfcmV0cnkgPDwgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19TQ0RfQUNLKSB8Ci0JCQkgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX01TSyk7Ci0KLQl0eHEtPnNjaGVkX3JldHJ5ID0gc2NkX3JldHJ5OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIiVzICVzIFF1ZXVlICVkIG9uIEFDICVkXG4iLAotCQkgICAgICAgYWN0aXZlID8gIkFjdGl2YXRlIiA6ICJEZWFjdGl2YXRlIiwKLQkJICAgICAgIHNjZF9yZXRyeSA/ICJCQSIgOiAiQUMiLCB0eHFfaWQsIHR4X2ZpZm9faWQpOwotfQotCi0KLXN0YXRpYyBpbnQgaXdsNDk2NV9pbml0X2RydihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5zdGFfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmhjbWRfbG9jayk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmcHJpdi0+ZnJlZV9mcmFtZXMpOwotCi0JbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOwotCi0JcHJpdi0+aWVlZV9jaGFubmVscyA9IE5VTEw7Ci0JcHJpdi0+aWVlZV9yYXRlcyA9IE5VTEw7Ci0JcHJpdi0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0KLQlwcml2LT5pd19tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKLQlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gSUVFRTgwMjExX1NNUFNfU1RBVElDOwotCXByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkID0gSVdMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX0RFRjsKLQotCS8qIGluaXRpYWxpemUgZm9yY2UgcmVzZXQgKi8KLQlwcml2LT5mb3JjZV9yZXNldC5yZXNldF9kdXJhdGlvbiA9IElXTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRDsKLQotCS8qIENob29zZSB3aGljaCByZWNlaXZlcnMvYW50ZW5uYXMgdG8gdXNlICovCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKHByaXYsCi0JCQkJCSZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0KLQlpd2xfbGVnYWN5X2luaXRfc2Nhbl9wYXJhbXMocHJpdik7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X2luaXRfY2hhbm5lbF9tYXAocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJpbml0aWFsaXppbmcgcmVndWxhdG9yeSBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X2luaXRfZ2Vvcyhwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgImluaXRpYWxpemluZyBnZW9zIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2ZyZWVfY2hhbm5lbF9tYXA7Ci0JfQotCWl3bDQ5NjVfaW5pdF9od19yYXRlcyhwcml2LCBwcml2LT5pZWVlX3JhdGVzKTsKLQotCXJldHVybiAwOwotCi1lcnJfZnJlZV9jaGFubmVsX21hcDoKLQlpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV91bmluaXRfZHJ2KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2w0OTY1X2NhbGliX2ZyZWVfcmVzdWx0cyhwcml2KTsKLQlpd2xfbGVnYWN5X2ZyZWVfZ2Vvcyhwcml2KTsKLQlpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7Ci0Ja2ZyZWUocHJpdi0+c2Nhbl9jbWQpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2h3X2RldGVjdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcHJpdi0+aHdfcmV2ID0gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIENTUl9IV19SRVYpOwotCXByaXYtPmh3X3dhX3JldiA9IF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCBDU1JfSFdfUkVWX1dBX1JFRyk7Ci0JcHJpdi0+cmV2X2lkID0gcHJpdi0+cGNpX2Rldi0+cmV2aXNpb247Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkhXIFJldmlzaW9uIElEID0gMHglWFxuIiwgcHJpdi0+cmV2X2lkKTsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X3NldF9od19wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXByaXYtPmh3X3BhcmFtcy5tYXhfcnhxX3NpemUgPSBSWF9RVUVVRV9TSVpFOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfcnhxX2xvZyA9IFJYX1FVRVVFX1NJWkVfTE9HOwotCWlmIChwcml2LT5jZmctPm1vZF9wYXJhbXMtPmFtc2R1X3NpemVfOEspCi0JCXByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID0gZ2V0X29yZGVyKElXTF9SWF9CVUZfU0laRV84Syk7Ci0JZWxzZQotCQlwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA9IGdldF9vcmRlcihJV0xfUlhfQlVGX1NJWkVfNEspOwotCi0JcHJpdi0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgPSBJV0xfTUFYX1VDT0RFX0JFQUNPTl9JTlRFUlZBTDsKLQotCWlmIChwcml2LT5jZmctPm1vZF9wYXJhbXMtPmRpc2FibGVfMTFuKQotCQlwcml2LT5jZmctPnNrdSAmPSB+SVdMX1NLVV9OOwotCi0JLyogRGV2aWNlLXNwZWNpZmljIHNldHVwICovCi0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9od19wYXJhbXMocHJpdik7Ci19Ci0KLXN0YXRpYyBjb25zdCB1OCBpd2w0OTY1X2Jzc19hY190b19maWZvW10gPSB7Ci0JSVdMX1RYX0ZJRk9fVk8sCi0JSVdMX1RYX0ZJRk9fVkksCi0JSVdMX1RYX0ZJRk9fQkUsCi0JSVdMX1RYX0ZJRk9fQkssCi19OwotCi1zdGF0aWMgY29uc3QgdTggaXdsNDk2NV9ic3NfYWNfdG9fcXVldWVbXSA9IHsKLQkwLCAxLCAyLCAzLAotfTsKLQotc3RhdGljIGludAotaXdsNDk2NV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0JaW50IGVyciA9IDAsIGk7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCXN0cnVjdCBpd2xfY2ZnICpjZmcgPSAoc3RydWN0IGl3bF9jZmcgKikoZW50LT5kcml2ZXJfZGF0YSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MTYgcGNpX2NtZDsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAxLiBBbGxvY2F0aW5nIEhXIGRhdGEKLQkgKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JaHcgPSBpd2xfbGVnYWN5X2FsbG9jX2FsbChjZmcpOwotCWlmICghaHcpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCXByaXYgPSBody0+cHJpdjsKLQkvKiBBdCB0aGlzIHBvaW50IGJvdGggaHcgYW5kIHByaXYgYXJlIGFsbG9jYXRlZC4gKi8KLQotCS8qCi0JICogVGhlIGRlZmF1bHQgY29udGV4dCBpcyBhbHdheXMgdmFsaWQsCi0JICogbW9yZSBtYXkgYmUgZGlzY292ZXJlZCB3aGVuIGZpcm13YXJlCi0JICogaXMgbG9hZGVkLgotCSAqLwotCXByaXYtPnZhbGlkX2NvbnRleHRzID0gQklUKElXTF9SWE9OX0NUWF9CU1MpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9JV0xfUlhPTl9DVFg7IGkrKykKLQkJcHJpdi0+Y29udGV4dHNbaV0uY3R4aWQgPSBpOwotCi0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWx3YXlzX2FjdGl2ZSA9IHRydWU7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uaXNfYWN0aXZlID0gdHJ1ZTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5yeG9uX2NtZCA9IFJFUExZX1JYT047Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ucnhvbl90aW1pbmdfY21kID0gUkVQTFlfUlhPTl9USU1JTkc7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ucnhvbl9hc3NvY19jbWQgPSBSRVBMWV9SWE9OX0FTU09DOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnFvc19jbWQgPSBSRVBMWV9RT1NfUEFSQU07Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYXBfc3RhX2lkID0gSVdMX0FQX0lEOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLndlcF9rZXlfY21kID0gUkVQTFlfV0VQS0VZOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjX3RvX2ZpZm8gPSBpd2w0OTY1X2Jzc19hY190b19maWZvOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjX3RvX3F1ZXVlID0gaXdsNDk2NV9ic3NfYWNfdG9fcXVldWU7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyA9Ci0JCUJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uaW50ZXJmYWNlX21vZGVzID0KLQkJQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFwX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0FQOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmlic3NfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfSUJTUzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5zdGF0aW9uX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS51bnVzZWRfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfRVNTOwotCi0JQlVJTERfQlVHX09OKE5VTV9JV0xfUlhPTl9DVFggIT0gMSk7Ci0KLQlTRVRfSUVFRTgwMjExX0RFVihodywgJnBkZXYtPmRldik7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiKioqIExPQUQgRFJJVkVSICoqKlxuIik7Ci0JcHJpdi0+Y2ZnID0gY2ZnOwotCXByaXYtPnBjaV9kZXYgPSBwZGV2OwotCXByaXYtPmludGFfbWFzayA9IENTUl9JTklfU0VUX01BU0s7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShwcml2KSkKLQkJSVdMX0VSUihwcml2LCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogMi4gSW5pdGlhbGl6aW5nIFBDSSBidXMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcGNpX2Rpc2FibGVfbGlua19zdGF0ZShwZGV2LCBQQ0lFX0xJTktfU1RBVEVfTDBTIHwgUENJRV9MSU5LX1NUQVRFX0wxIHwKLQkJCQlQQ0lFX0xJTktfU1RBVEVfQ0xLUE0pOwotCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2llZWU4MDIxMV9mcmVlX2h3OwotCX0KLQotCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCi0JZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzYpKTsKLQlpZiAoIWVycikKLQkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzNikpOwotCWlmIChlcnIpIHsKLQkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQkJaWYgKCFlcnIpCi0JCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwKLQkJCQkJCQlETUFfQklUX01BU0soMzIpKTsKLQkJLyogYm90aCBhdHRlbXB0cyBmYWlsZWQ6ICovCi0JCWlmIChlcnIpIHsKLQkJCUlXTF9XQVJOKHByaXYsICJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7Ci0JCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0JCX0KLQl9Ci0KLQllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgcHJpdik7Ci0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDMuIFJlYWQgUkVWIHJlZ2lzdGVyCi0JICoqKioqKioqKioqKioqKioqKioqKioqLwotCXByaXYtPmh3X2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7Ci0JaWYgKCFwcml2LT5od19iYXNlKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM7Ci0JfQotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInBjaV9yZXNvdXJjZV9sZW4gPSAweCUwOGxseFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInBjaV9yZXNvdXJjZV9iYXNlID0gJXBcbiIsIHByaXYtPmh3X2Jhc2UpOwotCi0JLyogdGhlc2Ugc3BpbiBsb2NrcyB3aWxsIGJlIHVzZWQgaW4gYXBtX29wcy5pbml0IGFuZCBFRVBST00gYWNjZXNzCi0JICogd2Ugc2hvdWxkIGluaXQgbm93Ci0JICovCi0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJlZ19sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7Ci0KLQkvKgotCSAqIHN0b3AgYW5kIHJlc2V0IHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IganVzdCBpbiBjYXNlIGl0IGlzIGluIGEKLQkgKiBzdHJhbmdlIHN0YXRlIC4uLiBsaWtlIGJlaW5nIGxlZnQgc3RyYW5kZWQgYnkgYSBwcmltYXJ5IGtlcm5lbAotCSAqIGFuZCB0aGlzIGlzIG5vdyB0aGUga2R1bXAga2VybmVsIHRyeWluZyB0byBzdGFydCB1cAotCSAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX05FVk9fUkVTRVQpOwotCi0JaXdsNDk2NV9od19kZXRlY3QocHJpdik7Ci0JSVdMX0lORk8ocHJpdiwgIkRldGVjdGVkICVzLCBSRVY9MHglWFxuIiwKLQkJcHJpdi0+Y2ZnLT5uYW1lLCBwcml2LT5od19yZXYpOwotCi0JLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAotCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGR19SRVRSWV9USU1FT1VULCAweDAwKTsKLQotCWl3bDQ5NjVfcHJlcGFyZV9jYXJkX2h3KHByaXYpOwotCWlmICghcHJpdi0+aHdfcmVhZHkpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIkZhaWxlZCwgSFcgbm90IHJlYWR5XG4iKTsKLQkJZ290byBvdXRfaW91bm1hcDsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioKLQkgKiA0LiBSZWFkIEVFUFJPTQotCSAqKioqKioqKioqKioqKioqKi8KLQkvKiBSZWFkIHRoZSBFRVBST00gKi8KLQllcnIgPSBpd2xfbGVnYWN5X2VlcHJvbV9pbml0KHByaXYpOwotCWlmIChlcnIpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXQgRUVQUk9NXG4iKTsKLQkJZ290byBvdXRfaW91bm1hcDsKLQl9Ci0JZXJyID0gaXdsNDk2NV9lZXByb21fY2hlY2tfdmVyc2lvbihwcml2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9mcmVlX2VlcHJvbTsKLQotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOwotCi0JLyogZXh0cmFjdCBNQUMgQWRkcmVzcyAqLwotCWl3bDQ5NjVfZWVwcm9tX2dldF9tYWMocHJpdiwgcHJpdi0+YWRkcmVzc2VzWzBdLmFkZHIpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJNQUMgYWRkcmVzczogJXBNXG4iLCBwcml2LT5hZGRyZXNzZXNbMF0uYWRkcik7Ci0JcHJpdi0+aHctPndpcGh5LT5hZGRyZXNzZXMgPSBwcml2LT5hZGRyZXNzZXM7Ci0JcHJpdi0+aHctPndpcGh5LT5uX2FkZHJlc3NlcyA9IDE7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogNS4gU2V0dXAgSFcgY29uc3RhbnRzCi0JICoqKioqKioqKioqKioqKioqKioqKioqKi8KLQlpZiAoaXdsNDk2NV9zZXRfaHdfcGFyYW1zKHByaXYpKSB7Ci0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBzZXQgaHcgcGFyYW1ldGVyc1xuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqCi0JICogNi4gU2V0dXAgcHJpdgotCSAqKioqKioqKioqKioqKioqKioqLwotCi0JZXJyID0gaXdsNDk2NV9pbml0X2Rydihwcml2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9mcmVlX2VlcHJvbTsKLQkvKiBBdCB0aGlzIHBvaW50IGJvdGggaHcgYW5kIHByaXYgYXJlIGluaXRpYWxpemVkLiAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqCi0JICogNy4gU2V0dXAgc2VydmljZXMKLQkgKioqKioqKioqKioqKioqKioqKiovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlwY2lfZW5hYmxlX21zaShwcml2LT5wY2lfZGV2KTsKLQotCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPnBjaV9kZXYtPmlycSwgaXdsX2xlZ2FjeV9pc3IsCi0JCQkgIElSUUZfU0hBUkVELCBEUlZfTkFNRSwgcHJpdik7Ci0JaWYgKGVycikgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBhbGxvY2F0aW5nIElSUSAlZFxuIiwgcHJpdi0+cGNpX2Rldi0+aXJxKTsKLQkJZ290byBvdXRfZGlzYWJsZV9tc2k7Ci0JfQotCi0JaXdsNDk2NV9zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOwotCWl3bDQ5NjVfc2V0dXBfcnhfaGFuZGxlcnMocHJpdik7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogOC4gRW5hYmxlIGludGVycnVwdHMgYW5kIHJlYWQgUkZLSUxMIHN0YXRlCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCS8qIGVuYWJsZSByZmtpbGwgaW50ZXJydXB0OiBodyBidWcgdy9hICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocHJpdi0+cGNpX2RldiwgUENJX0NPTU1BTkQsICZwY2lfY21kKTsKLQlpZiAocGNpX2NtZCAmIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSkgewotCQlwY2lfY21kICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChwcml2LT5wY2lfZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NtZCk7Ci0JfQotCi0JaXdsX2xlZ2FjeV9lbmFibGVfcmZraWxsX2ludChwcml2KTsKLQotCS8qIElmIHBsYXRmb3JtJ3MgUkZfS0lMTCBzd2l0Y2ggaXMgTk9UIHNldCB0byBLSUxMICovCi0JaWYgKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCi0JCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKQotCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCWVsc2UKLQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwKLQkJdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpKTsKLQotCWl3bF9sZWdhY3lfcG93ZXJfaW5pdGlhbGl6ZShwcml2KTsKLQotCWluaXRfY29tcGxldGlvbigmcHJpdi0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7Ci0KLQllcnIgPSBpd2w0OTY1X3JlcXVlc3RfZmlybXdhcmUocHJpdiwgdHJ1ZSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfZGVzdHJveV93b3JrcXVldWU7Ci0KLQlyZXR1cm4gMDsKLQotIG91dF9kZXN0cm95X3dvcmtxdWV1ZToKLQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCXByaXYtPndvcmtxdWV1ZSA9IE5VTEw7Ci0JZnJlZV9pcnEocHJpdi0+cGNpX2Rldi0+aXJxLCBwcml2KTsKLSBvdXRfZGlzYWJsZV9tc2k6Ci0JcGNpX2Rpc2FibGVfbXNpKHByaXYtPnBjaV9kZXYpOwotCWl3bDQ5NjVfdW5pbml0X2Rydihwcml2KTsKLSBvdXRfZnJlZV9lZXByb206Ci0JaXdsX2xlZ2FjeV9lZXByb21fZnJlZShwcml2KTsKLSBvdXRfaW91bm1hcDoKLQlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5od19iYXNlKTsKLSBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLSBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOgotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLSBvdXRfaWVlZTgwMjExX2ZyZWVfaHc6Ci0JaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKHByaXYpOwotCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKLSBvdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGl3bDQ5NjVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmcHJpdi0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiKioqIFVOTE9BRCBEUklWRVIgKioqXG4iKTsKLQotCWl3bF9sZWdhY3lfZGJnZnNfdW5yZWdpc3Rlcihwcml2KTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaXdsX2F0dHJpYnV0ZV9ncm91cCk7Ci0KLQkvKiBpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyBjYWxsIHdpbCBjYXVzZSBpd2xfbWFjX3N0b3AgdG8KLQkgKiB0byBiZSBjYWxsZWQgYW5kIGl3bDQ5NjVfZG93biBzaW5jZSB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGRldmljZQotCSAqIHdlIG5lZWQgdG8gc2V0IFNUQVRVU19FWElUX1BFTkRJTkcgYml0LgotCSAqLwotCXNldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQlpd2xfbGVnYWN5X2xlZHNfZXhpdChwcml2KTsKLQotCWlmIChwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKSB7Ci0JCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHByaXYtPmh3KTsKLQkJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDA7Ci0JfSBlbHNlIHsKLQkJaXdsNDk2NV9kb3duKHByaXYpOwotCX0KLQotCS8qCi0JICogTWFrZSBzdXJlIGRldmljZSBpcyByZXNldCB0byBsb3cgcG93ZXIgYmVmb3JlIHVubG9hZGluZyBkcml2ZXIuCi0JICogVGhpcyBtYXkgYmUgcmVkdW5kYW50IHdpdGggaXdsNDk2NV9kb3duKCksIGJ1dCB0aGVyZSBhcmUgcGF0aHMgdG8KLQkgKiBydW4gaXdsNDk2NV9kb3duKCkgd2l0aG91dCBjYWxsaW5nIGFwbV9vcHMuc3RvcCgpLCBhbmQgdGhlcmUgYXJlCi0JICogcGF0aHMgdG8gYXZvaWQgcnVubmluZyBpd2w0OTY1X2Rvd24oKSBhdCBhbGwgYmVmb3JlIGxlYXZpbmcgZHJpdmVyLgotCSAqIFRoaXMgKGluZXhwZW5zaXZlKSBjYWxsICptYWtlcyBzdXJlKiBkZXZpY2UgaXMgcmVzZXQuCi0JICovCi0JaXdsX2xlZ2FjeV9hcG1fc3RvcChwcml2KTsKLQotCS8qIG1ha2Ugc3VyZSB3ZSBmbHVzaCBhbnkgcGVuZGluZyBpcnEgb3IKLQkgKiB0YXNrbGV0IGZvciB0aGUgZHJpdmVyCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpd2w0OTY1X3N5bmNocm9uaXplX2lycShwcml2KTsKLQotCWl3bDQ5NjVfZGVhbGxvY191Y29kZV9wY2kocHJpdik7Ci0KLQlpZiAocHJpdi0+cnhxLmJkKQotCQlpd2w0OTY1X3J4X3F1ZXVlX2ZyZWUocHJpdiwgJnByaXYtPnJ4cSk7Ci0JaXdsNDk2NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0KLQlpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKHByaXYpOwotCi0KLQkvKm5ldGlmX3N0b3BfcXVldWUoZGV2KTsgKi8KLQlmbHVzaF93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQotCS8qIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IGNhbGxzIGl3bF9tYWNfc3RvcCwgd2hpY2ggZmx1c2hlcwotCSAqIHByaXYtPndvcmtxdWV1ZS4uLiBzbyB3ZSBjYW4ndCB0YWtlIGRvd24gdGhlIHdvcmtxdWV1ZQotCSAqIHVudGlsIG5vdy4uLiAqLwotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7Ci0JcHJpdi0+d29ya3F1ZXVlID0gTlVMTDsKLQlpd2xfbGVnYWN5X2ZyZWVfdHJhZmZpY19tZW0ocHJpdik7Ci0KLQlmcmVlX2lycShwcml2LT5wY2lfZGV2LT5pcnEsIHByaXYpOwotCXBjaV9kaXNhYmxlX21zaShwcml2LT5wY2lfZGV2KTsKLQlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5od19iYXNlKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlpd2w0OTY1X3VuaW5pdF9kcnYocHJpdik7Ci0KLQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCi0JaWVlZTgwMjExX2ZyZWVfaHcocHJpdi0+aHcpOwotfQotCi0vKgotICogQWN0aXZhdGUvRGVhY3RpdmF0ZSBUeCBETUEvRklGTyBjaGFubmVscyBhY2NvcmRpbmcgdHggZmlmb3MgbWFzawotICogbXVzdCBiZSBjYWxsZWQgdW5kZXIgcHJpdi0+bG9jayBhbmQgbWFjIGFjY2VzcwotICovCi12b2lkIGl3bDQ5NjVfdHhxX3NldF9zY2hlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBtYXNrKQotewotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBJV0w0OV9TQ0RfVFhGQUNULCBtYXNrKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZHJpdmVyIGFuZCBtb2R1bGUgZW50cnkgcG9pbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEhhcmR3YXJlIHNwZWNpZmljIGZpbGUgZGVmaW5lcyB0aGUgUENJIElEcyB0YWJsZSBmb3IgdGhhdCBoYXJkd2FyZSBtb2R1bGUgKi8KLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShpd2w0OTY1X2h3X2NhcmRfaWRzKSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19JV0w0OTY1X01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfSVdMNDk2NSkKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjI5LCBQQ0lfQU5ZX0lELCBpd2w0OTY1X2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMzAsIFBDSV9BTllfSUQsIGl3bDQ5NjVfY2ZnKX0sCi0jZW5kaWYgLyogQ09ORklHX0lXTDQ5NjUgKi8KLQotCXswfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpd2w0OTY1X2h3X2NhcmRfaWRzKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGl3bDQ5NjVfZHJpdmVyID0gewotCS5uYW1lID0gRFJWX05BTUUsCi0JLmlkX3RhYmxlID0gaXdsNDk2NV9od19jYXJkX2lkcywKLQkucHJvYmUgPSBpd2w0OTY1X3BjaV9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoaXdsNDk2NV9wY2lfcmVtb3ZlKSwKLQkuZHJpdmVyLnBtID0gSVdMX0xFR0FDWV9QTV9PUFMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpd2w0OTY1X2luaXQodm9pZCkKLXsKLQotCWludCByZXQ7Ci0JcHJfaW5mbyhEUlZfREVTQ1JJUFRJT04gIiwgIiBEUlZfVkVSU0lPTiAiXG4iKTsKLQlwcl9pbmZvKERSVl9DT1BZUklHSFQgIlxuIik7Ci0KLQlyZXQgPSBpd2w0OTY1X3JhdGVfY29udHJvbF9yZWdpc3RlcigpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgcmF0ZSBjb250cm9sIGFsZ29yaXRobTogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaXdsNDk2NV9kcml2ZXIpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKLQkJZ290byBlcnJvcl9yZWdpc3RlcjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi1lcnJvcl9yZWdpc3RlcjoKLQlpd2w0OTY1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGl3bDQ5NjVfZXhpdCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXdsNDk2NV9kcml2ZXIpOwotCWl3bDQ5NjVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKLX0KLQotbW9kdWxlX2V4aXQoaXdsNDk2NV9leGl0KTsKLW1vZHVsZV9pbml0KGl3bDQ5NjVfaW5pdCk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaXdsZWdhY3lfZGVidWdfbGV2ZWwsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOwotI2VuZGlmCi0KLW1vZHVsZV9wYXJhbV9uYW1lZChzd2NyeXB0bywgaXdsNDk2NV9tb2RfcGFyYW1zLnN3X2NyeXB0bywgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0Moc3djcnlwdG8sICJ1c2luZyBjcnlwdG8gaW4gc29mdHdhcmUgKGRlZmF1bHQgMCBbaGFyZHdhcmVdKSIpOwotbW9kdWxlX3BhcmFtX25hbWVkKHF1ZXVlc19udW0sIGl3bDQ5NjVfbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhxdWV1ZXNfbnVtLCAibnVtYmVyIG9mIGh3IHF1ZXVlcy4iKTsKLW1vZHVsZV9wYXJhbV9uYW1lZCgxMW5fZGlzYWJsZSwgaXdsNDk2NV9tb2RfcGFyYW1zLmRpc2FibGVfMTFuLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQygxMW5fZGlzYWJsZSwgImRpc2FibGUgMTFuIGZ1bmN0aW9uYWxpdHkiKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChhbXNkdV9zaXplXzhLLCBpd2w0OTY1X21vZF9wYXJhbXMuYW1zZHVfc2l6ZV84SywKLQkJICAgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MoYW1zZHVfc2l6ZV84SywgImVuYWJsZSA4SyBhbXNkdSBzaXplIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoZndfcmVzdGFydCwgaXdsNDk2NV9tb2RfcGFyYW1zLnJlc3RhcnRfZncsIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZ3X3Jlc3RhcnQsICJyZXN0YXJ0IGZpcm13YXJlIGluIGNhc2Ugb2YgZXJyb3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L3BycGguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L3BycGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVjNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvcHJwaC5oCkBAIC0wLDAgKzEsNTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9faWxfcHJwaF9oX18KKyNkZWZpbmUgX19pbF9wcnBoX2hfXworCisvKgorICogUmVnaXN0ZXJzIGluIHRoaXMgZmlsZSBhcmUgaW50ZXJuYWwsIG5vdCBQQ0kgYnVzIG1lbW9yeSBtYXBwZWQuCisgKiBEcml2ZXIgYWNjZXNzZXMgdGhlc2UgdmlhIEhCVVNfVEFSR19QUlBIXyogcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFBSUEhfQkFTRQkoMHgwMDAwMCkKKyNkZWZpbmUgUFJQSF9FTkQJKDB4RkZGRkYpCisKKy8qIEFQTUcgKHBvd2VyIG1hbmFnZW1lbnQpIGNvbnN0YW50cyAqLworI2RlZmluZSBBUE1HX0JBU0UJCQkoUFJQSF9CQVNFICsgMHgzMDAwKQorI2RlZmluZSBBUE1HX0NMS19DVFJMX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAwMCkKKyNkZWZpbmUgQVBNR19DTEtfRU5fUkVHCQkJKEFQTUdfQkFTRSArIDB4MDAwNCkKKyNkZWZpbmUgQVBNR19DTEtfRElTX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAwOCkKKyNkZWZpbmUgQVBNR19QU19DVFJMX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAwYykKKyNkZWZpbmUgQVBNR19QQ0lERVZfU1RUX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAxMCkKKyNkZWZpbmUgQVBNR19SRktJTExfUkVHCQkJKEFQTUdfQkFTRSArIDB4MDAxNCkKKyNkZWZpbmUgQVBNR19SVENfSU5UX1NUVF9SRUcJCShBUE1HX0JBU0UgKyAweDAwMWMpCisjZGVmaW5lIEFQTUdfUlRDX0lOVF9NU0tfUkVHCQkoQVBNR19CQVNFICsgMHgwMDIwKQorI2RlZmluZSBBUE1HX0RJR0lUQUxfU1ZSX1JFRwkJKEFQTUdfQkFTRSArIDB4MDA1OCkKKyNkZWZpbmUgQVBNR19BTkFMT0dfU1ZSX1JFRwkJKEFQTUdfQkFTRSArIDB4MDA2QykKKworI2RlZmluZSBBUE1TX0NMS19WQUxfTVJCX0ZVTkNfTU9ERQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUCSgweDAwMDAwMjAwKQorI2RlZmluZSBBUE1HX0NMS19WQUxfQlNNX0NMS19SUVQJKDB4MDAwMDA4MDApCisKKyNkZWZpbmUgQVBNR19QU19DVFJMX0VBUkxZX1BXUl9PRkZfUkVTRVRfRElTCSgweDAwNDAwMDAwKQorI2RlZmluZSBBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUQkJKDB4MDQwMDAwMDApCisjZGVmaW5lIEFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQwkJKDB4MDMwMDAwMDApCisjZGVmaW5lIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WTUFJTgkJKDB4MDAwMDAwMDApCisjZGVmaW5lIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19NQVgJCSgweDAxMDAwMDAwKQkvKiAzOTQ1IG9ubHkgKi8KKyNkZWZpbmUgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZBVVgJCSgweDAyMDAwMDAwKQorI2RlZmluZSBBUE1HX1NWUl9WT0xUQUdFX0NPTkZJR19CSVRfTVNLCSgweDAwMDAwMUUwKQkvKiBiaXQgODo1ICovCisjZGVmaW5lIEFQTUdfU1ZSX0RJR0lUQUxfVk9MVEFHRV8xXzMyCQkoMHgwMDAwMDA2MCkKKworI2RlZmluZSBBUE1HX1BDSURFVl9TVFRfVkFMX0wxX0FDVF9ESVMJCSgweDAwMDAwODAwKQorCisvKioKKyAqIEJTTSAoQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUpCisgKgorICogVGhlIEJvb3RzdHJhcCBTdGF0ZSBNYWNoaW5lIChCU00pIHN0b3JlcyBhIHNob3J0IGJvb3RzdHJhcCB1Q29kZSBwcm9ncmFtCisgKiBpbiBzcGVjaWFsIFNSQU0gdGhhdCBkb2VzIG5vdCBwb3dlciBkb3duIHdoZW4gdGhlIGVtYmVkZGVkIGNvbnRyb2wKKyAqIHByb2Nlc3NvciBpcyBzbGVlcGluZyAoZS5nLiBmb3IgcGVyaW9kaWMgcG93ZXItc2F2aW5nIHNodXRkb3ducyBvZiByYWRpbykuCisgKgorICogV2hlbiBwb3dlcmluZyBiYWNrIHVwIGFmdGVyIHNsZWVwcyAob3IgZHVyaW5nIGluaXRpYWwgdUNvZGUgbG9hZCksIHRoZSBCU00KKyAqIGludGVybmFsbHkgbG9hZHMgdGhlIHNob3J0IGJvb3RzdHJhcCBwcm9ncmFtIGZyb20gdGhlIHNwZWNpYWwgU1JBTSBpbnRvIHRoZQorICogZW1iZWRkZWQgcHJvY2Vzc29yJ3MgaW5zdHJ1Y3Rpb24gU1JBTSwgYW5kIHN0YXJ0cyB0aGUgcHJvY2Vzc29yIHNvIGl0IHJ1bnMKKyAqIHRoZSBib290c3RyYXAgcHJvZ3JhbS4KKyAqCisgKiBUaGlzIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzICh2aWEgUENJIGJ1c21hc3RlciBETUEpIGluc3RydWN0aW9ucyBhbmQgZGF0YQorICogaW1hZ2VzIGZvciBhIHVDb2RlIHByb2dyYW0gZnJvbSBob3N0IERSQU0gbG9jYXRpb25zLiAgVGhlIGhvc3QgZHJpdmVyCisgKiBpbmRpY2F0ZXMgRFJBTSBsb2NhdGlvbnMgYW5kIHNpemVzIGZvciBpbnN0cnVjdGlvbiBhbmQgZGF0YSBpbWFnZXMgdmlhIHRoZQorICogZm91ciBCU01fRFJBTV8qIHJlZ2lzdGVycy4gIE9uY2UgdGhlIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzIHRoZSBuZXcgcHJvZ3JhbSwKKyAqIHRoZSBuZXcgcHJvZ3JhbSBzdGFydHMgYXV0b21hdGljYWxseS4KKyAqCisgKiBUaGUgdUNvZGUgdXNlZCBmb3Igb3Blbi1zb3VyY2UgZHJpdmVycyBpbmNsdWRlcyB0d28gcHJvZ3JhbXM6CisgKgorICogMSkgIEluaXRpYWxpemF0aW9uIC0tIHBlcmZvcm1zIGhhcmR3YXJlIGNhbGlicmF0aW9uIGFuZCBzZXRzIHVwIHNvbWUKKyAqICAgICBpbnRlcm5hbCBkYXRhLCB0aGVuIG5vdGlmaWVzIGhvc3QgdmlhICJpbml0aWFsaXplIGFsaXZlIiBub3RpZmljYXRpb24KKyAqICAgICAoc3RydWN0IGlsX2luaXRfYWxpdmVfcmVzcCkgdGhhdCBpdCBoYXMgY29tcGxldGVkIGFsbCBvZiBpdHMgd29yay4KKyAqICAgICBBZnRlciBzaWduYWwgZnJvbSBob3N0LCBpdCB0aGVuIGxvYWRzIGFuZCBzdGFydHMgdGhlIHJ1bnRpbWUgcHJvZ3JhbS4KKyAqICAgICBUaGUgaW5pdGlhbGl6YXRpb24gcHJvZ3JhbSBtdXN0IGJlIHVzZWQgd2hlbiBpbml0aWFsbHkgc2V0dGluZyB1cCB0aGUKKyAqICAgICBOSUMgYWZ0ZXIgbG9hZGluZyB0aGUgZHJpdmVyLgorICoKKyAqIDIpICBSdW50aW1lL1Byb3RvY29sIC0tIHBlcmZvcm1zIGFsbCBub3JtYWwgcnVudGltZSBvcGVyYXRpb25zLiAgVGhpcworICogICAgIG5vdGlmaWVzIGhvc3QgdmlhICJhbGl2ZSIgbm90aWZpY2F0aW9uIChzdHJ1Y3QgaWxfYWxpdmVfcmVzcCkgdGhhdCBpdAorICogICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgKgorICogV2hlbiBpbml0aWFsaXppbmcgdGhlIE5JQywgdGhlIGhvc3QgZHJpdmVyIGRvZXMgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmU6CisgKgorICogMSkgIExvYWQgYm9vdHN0cmFwIHByb2dyYW0gKGluc3RydWN0aW9ucyBvbmx5LCBubyBkYXRhIGltYWdlIGZvciBib290c3RyYXApCisgKiAgICAgaW50byBib290c3RyYXAgbWVtb3J5LiAgVXNlIGR3b3JkIHdyaXRlcyBzdGFydGluZyBhdCBCU01fU1JBTV9MT1dFUl9CT1VORAorICoKKyAqIDIpICBQb2ludCAodmlhIEJTTV9EUkFNXyopIHRvIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24KKyAqICAgICBpbWFnZXMgaW4gaG9zdCBEUkFNLgorICoKKyAqIDMpICBTZXQgdXAgQlNNIHRvIGNvcHkgZnJvbSBCU00gU1JBTSBpbnRvIHVDb2RlIGluc3RydWN0aW9uIFNSQU0gd2hlbiBhc2tlZDoKKyAqICAgICBCU01fV1JfTUVNX1NSQ19SRUcgPSAwCisgKiAgICAgQlNNX1dSX01FTV9EU1RfUkVHID0gUlRDX0lOU1RfTE9XRVJfQk9VTkQKKyAqICAgICBCU01fV1JfTUVNX0RXQ09VTlRfUkVHID0gIyBkd29yZHMgaW4gYm9vdHN0cmFwIGluc3RydWN0aW9uIGltYWdlCisgKgorICogNCkgIExvYWQgYm9vdHN0cmFwIGludG8gaW5zdHJ1Y3Rpb24gU1JBTToKKyAqICAgICBCU01fV1JfQ1RSTF9SRUcgPSBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUCisgKgorICogNSkgIFdhaXQgZm9yIGxvYWQgY29tcGxldGlvbjoKKyAqICAgICBQb2xsIEJTTV9XUl9DVFJMX1JFRyBmb3IgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCA9IDAKKyAqCisgKiA2KSAgRW5hYmxlIGZ1dHVyZSBib290IGxvYWRzIHdoZW5ldmVyIE5JQydzIHBvd2VyIG1hbmFnZW1lbnQgdHJpZ2dlcnMgaXQ6CisgKiAgICAgQlNNX1dSX0NUUkxfUkVHID0gQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTgorICoKKyAqIDcpICBTdGFydCB0aGUgTklDIGJ5IHJlbW92aW5nIGFsbCByZXNldCBiaXRzOgorICogICAgIENTUl9SRVNFVCA9IDAKKyAqCisgKiAgICAgVGhlIGJvb3RzdHJhcCB1Q29kZSAoYWxyZWFkeSBpbiBpbnN0cnVjdGlvbiBTUkFNKSBsb2FkcyBpbml0aWFsaXphdGlvbgorICogICAgIHVDb2RlLiAgSW5pdGlhbGl6YXRpb24gdUNvZGUgcGVyZm9ybXMgZGF0YSBpbml0aWFsaXphdGlvbiwgc2VuZHMKKyAqICAgICAiaW5pdGlhbGl6ZSBhbGl2ZSIgbm90aWZpY2F0aW9uIHRvIGhvc3QsIGFuZCB3YWl0cyBmb3IgYSBzaWduYWwgZnJvbQorICogICAgIGhvc3QgdG8gbG9hZCBydW50aW1lIGNvZGUuCisgKgorICogNCkgIFBvaW50ICh2aWEgQlNNX0RSQU1fKikgdG8gdGhlICJydW50aW1lIiB1Q29kZSBkYXRhIGFuZCBpbnN0cnVjdGlvbgorICogICAgIGltYWdlcyBpbiBob3N0IERSQU0uICBUaGUgbGFzdCByZWdpc3RlciBsb2FkZWQgbXVzdCBiZSB0aGUgaW5zdHJ1Y3Rpb24KKyAqICAgICBieXRlIGNvdW50IHJlZ2lzdGVyICgiMSIgaW4gTVNiaXQgdGVsbHMgaW5pdGlhbGl6YXRpb24gdUNvZGUgdG8gbG9hZAorICogICAgIHRoZSBydW50aW1lIHVDb2RlKToKKyAqICAgICBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcgPSBieXRlIGNvdW50IHwgQlNNX0RSQU1fSU5TVF9MT0FECisgKgorICogNSkgIFdhaXQgZm9yICJhbGl2ZSIgbm90aWZpY2F0aW9uLCB0aGVuIGlzc3VlIG5vcm1hbCBydW50aW1lIGNvbW1hbmRzLgorICoKKyAqIERhdGEgY2FjaGluZyBkdXJpbmcgcG93ZXItZG93bnM6CisgKgorICogSnVzdCBiZWZvcmUgdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIgcG93ZXJzIGRvd24gKGUuZyBmb3IgYXV0b21hdGljCisgKiBwb3dlci1zYXZpbmcgbW9kZXMsIG9yIGZvciBSRktJTEwpLCB1Q29kZSBzdG9yZXMgKHZpYSBQQ0kgYnVzbWFzdGVyIERNQSkKKyAqIGEgY3VycmVudCBzbmFwc2hvdCBvZiB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yJ3MgZGF0YSBTUkFNIGludG8gaG9zdCBEUkFNLgorICogVGhpcyBjYWNoZXMgdGhlIGRhdGEgd2hpbGUgdGhlIGVtYmVkZGVkIHByb2Nlc3NvcidzIG1lbW9yeSBpcyBwb3dlcmVkIGRvd24uCisgKiBMb2NhdGlvbiBhbmQgc2l6ZSBhcmUgY29udHJvbGxlZCBieSBCU01fRFJBTV9EQVRBXyogcmVnaXN0ZXJzLgorICoKKyAqIE5PVEU6ICBJbnN0cnVjdGlvbiBTUkFNIGRvZXMgbm90IG5lZWQgdG8gYmUgc2F2ZWQsIHNpbmNlIHRoYXQgZG9lc24ndAorICogICAgICAgIGNoYW5nZSBkdXJpbmcgb3BlcmF0aW9uOyB0aGUgb3JpZ2luYWwgaW1hZ2UgKGZyb20gdUNvZGUgZGlzdHJpYnV0aW9uCisgKiAgICAgICAgZmlsZSkgY2FuIGJlIHVzZWQgZm9yIHJlbG9hZC4KKyAqCisgKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgQm9vdHN0cmFwIGxvb2tzCisgKiBhdCB0aGUgQlNNX0RSQU1fKiByZWdpc3RlcnMsIHdoaWNoIG5vdyBwb2ludCB0byB0aGUgcnVudGltZSBpbnN0cnVjdGlvbgorICogaW1hZ2UgYW5kIHRoZSBjYWNoZWQgKG1vZGlmaWVkKSBydW50aW1lIGRhdGEgKCpub3QqIHRoZSBpbml0aWFsaXphdGlvbgorICogdUNvZGUpLiAgQm9vdHN0cmFwIHJlbG9hZHMgdGhlc2UgcnVudGltZSBpbWFnZXMgaW50byBTUkFNLCBhbmQgcmVzdGFydHMgdGhlCisgKiB1Q29kZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmIGJlZm9yZSB0aGUgcG93ZXItZG93bi4KKyAqCisgKiBOT1RFOiAgSW5pdGlhbGl6YXRpb24gdUNvZGUgZG9lcyAqbm90KiBydW4gYXMgcGFydCBvZiB0aGUgc2F2ZS9yZXN0b3JlCisgKiAgICAgICAgcHJvY2VkdXJlLgorICoKKyAqIFRoaXMgc2F2ZS9yZXN0b3JlIG1ldGhvZCBpcyBtb3N0bHkgZm9yIGF1dG9ub21vdXMgcG93ZXIgbWFuYWdlbWVudCBkdXJpbmcKKyAqIG5vcm1hbCBvcGVyYXRpb24gKHJlc3VsdCBvZiBDX1BPV0VSX1RCTCkuICBQbGF0Zm9ybSBzdXNwZW5kL3Jlc3VtZSBhbmQKKyAqIFJGS0lMTCBzaG91bGQgdXNlIGNvbXBsZXRlIHJlc3RhcnRzICh3aXRoIHRvdGFsIHJlLWluaXRpYWxpemF0aW9uKSBvZiB1Q29kZSwKKyAqIGFsbG93aW5nIHRvdGFsIHNodXRkb3duIChpbmNsdWRpbmcgQlNNIG1lbW9yeSkuCisgKgorICogTm90ZSB0aGF0LCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiwgdGhlIGhvc3QgRFJBTSB0aGF0IGhlbGQgdGhlIGluaXRpYWwKKyAqIHN0YXJ0dXAgZGF0YSBmb3IgdGhlIHJ1bnRpbWUgY29kZSBpcyBub3cgYmVpbmcgdXNlZCBhcyBhIGJhY2t1cCBkYXRhIGNhY2hlCisgKiBmb3IgbW9kaWZpZWQgZGF0YSEgIElmIHlvdSBuZWVkIHRvIGNvbXBsZXRlbHkgcmUtaW5pdGlhbGl6ZSB0aGUgTklDLCBtYWtlCisgKiBzdXJlIHRoYXQgeW91IHVzZSB0aGUgcnVudGltZSBkYXRhIGltYWdlIGZyb20gdGhlIHVDb2RlIGRpc3RyaWJ1dGlvbiBmaWxlLAorICogbm90IHRoZSBtb2RpZmllZC9zYXZlZCBydW50aW1lIGRhdGEuICBZb3UgbWF5IHdhbnQgdG8gc3RvcmUgYSBzZXBhcmF0ZQorICogImNsZWFuIiBydW50aW1lIGRhdGEgaW1hZ2UgaW4gRFJBTSB0byBhdm9pZCBkaXNrIHJlYWRzIG9mIGRpc3RyaWJ1dGlvbiBmaWxlLgorICovCisKKy8qIEJTTSBiaXQgZmllbGRzICovCisjZGVmaW5lIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQgICAgICgweDgwMDAwMDAwKQkvKiBzdGFydCBib290IGxvYWQgbm93ICovCisjZGVmaW5lIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlRfRU4gICgweDQwMDAwMDAwKQkvKiBlbmFibGUgYm9vdCBhZnRlciBwd3J1cCAqLworI2RlZmluZSBCU01fRFJBTV9JTlNUX0xPQUQgICAgICAgICAgICAoMHg4MDAwMDAwMCkJLyogc3RhcnQgcHJvZ3JhbSBsb2FkIG5vdyAqLworCisvKiBCU00gYWRkcmVzc2VzICovCisjZGVmaW5lIEJTTV9CQVNFICAgICAgICAgICAgICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzQwMCkKKyNkZWZpbmUgQlNNX0VORCAgICAgICAgICAgICAgICAgICAgICAoUFJQSF9CQVNFICsgMHgzODAwKQorCisjZGVmaW5lIEJTTV9XUl9DVFJMX1JFRyAgICAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDApCS8qIGN0bCBhbmQgc3RhdHVzICovCisjZGVmaW5lIEJTTV9XUl9NRU1fU1JDX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDQpCS8qIHNvdXJjZSBpbiBCU00gbWVtICovCisjZGVmaW5lIEJTTV9XUl9NRU1fRFNUX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDgpCS8qIGRlc3QgaW4gU1JBTSBtZW0gKi8KKyNkZWZpbmUgQlNNX1dSX0RXQ09VTlRfUkVHICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAwQykJLyogYnl0ZXMgKi8KKyNkZWZpbmUgQlNNX1dSX1NUQVRVU19SRUcgICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAxMCkJLyogYml0IDA6ICAxID09IGRvbmUgKi8KKworLyoKKyAqIFBvaW50ZXJzIGFuZCBzaXplIHJlZ3MgZm9yIGJvb3RzdHJhcCBsb2FkIGFuZCBkYXRhIFNSQU0gc2F2ZS9yZXN0b3JlLgorICogTk9URTogIDM5NDUgcG9pbnRlcnMgdXNlIGJpdHMgMzE6MCBvZiBEUkFNIGFkZHJlc3MuCisgKiAgICAgICAgNDk2NSBwb2ludGVycyB1c2UgYml0cyAzNTo0IG9mIERSQU0gYWRkcmVzcy4KKyAqLworI2RlZmluZSBCU01fRFJBTV9JTlNUX1BUUl9SRUcgICAgICAgIChCU01fQkFTRSArIDB4MDkwKQorI2RlZmluZSBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcgIChCU01fQkFTRSArIDB4MDk0KQorI2RlZmluZSBCU01fRFJBTV9EQVRBX1BUUl9SRUcgICAgICAgIChCU01fQkFTRSArIDB4MDk4KQorI2RlZmluZSBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcgIChCU01fQkFTRSArIDB4MDlDKQorCisvKgorICogQlNNIHNwZWNpYWwgbWVtb3J5LCBzdGF5cyBwb3dlcmVkIG9uIGR1cmluZyBwb3dlci1zYXZlIHNsZWVwcy4KKyAqIFJlYWQvd3JpdGUsIGFkZHJlc3MgcmFuZ2UgZnJvbSBMT1dFUl9CT1VORCB0byAoTE9XRVJfQk9VTkQgKyBTSVpFIC0xKQorICovCisjZGVmaW5lIEJTTV9TUkFNX0xPV0VSX0JPVU5EICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzgwMCkKKyNkZWZpbmUgQlNNX1NSQU1fU0laRQkJCSgxMDI0KQkvKiBieXRlcyAqLworCisvKiAzOTQ1IFR4IHNjaGVkdWxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUxNX1NDRF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgKFBSUEhfQkFTRSArIDB4MkUwMCkKKyNkZWZpbmUgQUxNX1NDRF9NT0RFX1JFRyAgICAgICAgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDAwKQorI2RlZmluZSBBTE1fU0NEX0FSQVNUQVRfUkVHICAgICAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMDQpCisjZGVmaW5lIEFMTV9TQ0RfVFhGQUNUX1JFRyAgICAgICAgICAgICAgICAgIChBTE1fU0NEX0JBU0UgKyAweDAxMCkKKyNkZWZpbmUgQUxNX1NDRF9UWEY0TUZfUkVHICAgICAgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDE0KQorI2RlZmluZSBBTE1fU0NEX1RYRjVNRl9SRUcgICAgICAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMjApCisjZGVmaW5lIEFMTV9TQ0RfU0JZUF9NT0RFXzFfUkVHICAgICAgICAgICAgIChBTE1fU0NEX0JBU0UgKyAweDAyQykKKyNkZWZpbmUgQUxNX1NDRF9TQllQX01PREVfMl9SRUcgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDMwKQorCisvKioKKyAqIFR4IFNjaGVkdWxlcgorICoKKyAqIFRoZSBUeCBTY2hlZHVsZXIgc2VsZWN0cyB0aGUgbmV4dCBmcmFtZSB0byBiZSB0cmFuc21pdHRlZCwgY2hvb3NpbmcgVEZEcworICogKFRyYW5zbWl0IEZyYW1lIERlc2NyaXB0b3JzKSBmcm9tIHVwIHRvIDE2IGNpcmN1bGFyIFR4IHF1ZXVlcyByZXNpZGVudCBpbgorICogaG9zdCBEUkFNLiAgSXQgc3RlZXJzIGVhY2ggZnJhbWUncyBUeCBjb21tYW5kICh3aGljaCBjb250YWlucyB0aGUgZnJhbWUKKyAqIGRhdGEpIGludG8gb25lIG9mIHVwIHRvIDcgcHJpb3JpdGl6ZWQgVHggRE1BIEZJRk8gY2hhbm5lbHMgd2l0aGluIHRoZQorICogZGV2aWNlLiAgQSBxdWV1ZSBtYXBzIHRvIG9ubHkgb25lIChzZWxlY3RhYmxlIGJ5IGRyaXZlcikgVHggRE1BIGNoYW5uZWwsCisgKiBidXQgb25lIERNQSBjaGFubmVsIG1heSB0YWtlIGlucHV0IGZyb20gc2V2ZXJhbCBxdWV1ZXMuCisgKgorICogVHggRE1BIEZJRk9zIGhhdmUgZGVkaWNhdGVkIHB1cnBvc2VzLiAgRm9yIDQ5NjUsIHRoZXkgYXJlIHVzZWQgYXMgZm9sbG93cworICogKGNmLiBkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm8gaW4gNDk2NS5jKToKKyAqCisgKiAwIC0tIEVEQ0EgQksgKGJhY2tncm91bmQpIGZyYW1lcywgbG93ZXN0IHByaW9yaXR5CisgKiAxIC0tIEVEQ0EgQkUgKGJlc3QgZWZmb3J0KSBmcmFtZXMsIG5vcm1hbCBwcmlvcml0eQorICogMiAtLSBFRENBIFZJICh2aWRlbykgZnJhbWVzLCBoaWdoZXIgcHJpb3JpdHkKKyAqIDMgLS0gRURDQSBWTyAodm9pY2UpIGFuZCBtYW5hZ2VtZW50IGZyYW1lcywgaGlnaGVzdCBwcmlvcml0eQorICogNCAtLSBDb21tYW5kcyAoZS5nLiBSWE9OLCBldGMuKQorICogNSAtLSB1bnVzZWQgKEhDQ0EpCisgKiA2IC0tIHVudXNlZCAoSENDQSkKKyAqIDcgLS0gbm90IHVzZWQgYnkgZHJpdmVyIChkZXZpY2UtaW50ZXJuYWwgb25seSkKKyAqCisgKgorICogRHJpdmVyIHNob3VsZCBub3JtYWxseSBtYXAgcXVldWVzIDAtNiB0byBUeCBETUEvRklGTyBjaGFubmVscyAwLTYuCisgKiBJbiBhZGRpdGlvbiwgZHJpdmVyIGNhbiBtYXAgdGhlIHJlbWFpbmluZyBxdWV1ZXMgdG8gVHggRE1BL0ZJRk8KKyAqIGNoYW5uZWxzIDAtMyB0byBzdXBwb3J0IDExbiBhZ2dyZWdhdGlvbiB2aWEgRURDQSBETUEgY2hhbm5lbHMuCisgKgorICogVGhlIGRyaXZlciBzZXRzIHVwIGVhY2ggcXVldWUgdG8gd29yayBpbiBvbmUgb2YgdHdvIG1vZGVzOgorICoKKyAqIDEpICBTY2hlZHVsZXItQWNrLCBpbiB3aGljaCB0aGUgc2NoZWR1bGVyIGF1dG9tYXRpY2FsbHkgc3VwcG9ydHMgYQorICogICAgIGJsb2NrLWFjayAoQkEpIHdpbiBvZiB1cCB0byA2NCBURkRzLiAgSW4gdGhpcyBtb2RlLCBlYWNoIHF1ZXVlCisgKiAgICAgY29udGFpbnMgVEZEcyBmb3IgYSB1bmlxdWUgY29tYmluYXRpb24gb2YgUmVjaXBpZW50IEFkZHJlc3MgKFJBKQorICogICAgIGFuZCBUcmFmZmljIElkZW50aWZpZXIgKFRJRCksIHRoYXQgaXMsIHRyYWZmaWMgb2YgYSBnaXZlbgorICogICAgIFF1YWxpdHktT2YtU2VydmljZSAoUU9TKSBwcmlvcml0eSwgZGVzdGluZWQgZm9yIGEgc2luZ2xlIHN0YXRpb24uCisgKgorICogICAgIEluIHNjaGVkdWxlci1hY2sgbW9kZSwgdGhlIHNjaGVkdWxlciBrZWVwcyB0cmFjayBvZiB0aGUgVHggc3RhdHVzIG9mCisgKiAgICAgZWFjaCBmcmFtZSB3aXRoaW4gdGhlIEJBIHdpbiwgaW5jbHVkaW5nIHdoZXRoZXIgaXQncyBiZWVuIHRyYW5zbWl0dGVkLAorICogICAgIGFuZCB3aGV0aGVyIGl0J3MgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlIHJlY2VpdmluZyBzdGF0aW9uLiAgVGhlIGRldmljZQorICogICAgIGF1dG9tYXRpY2FsbHkgcHJvY2Vzc2VzIGJsb2NrLWFja3MgcmVjZWl2ZWQgZnJvbSB0aGUgcmVjZWl2aW5nIFNUQSwKKyAqICAgICBhbmQgcmVzY2hlZHVsZXMgdW4tYWNrZWQgZnJhbWVzIHRvIGJlIHJldHJhbnNtaXR0ZWQgKHN1Y2Nlc3NmdWwKKyAqICAgICBUeCBjb21wbGV0aW9uIG1heSBlbmQgdXAgYmVpbmcgb3V0LW9mLW9yZGVyKS4KKyAqCisgKiAgICAgVGhlIGRyaXZlciBtdXN0IG1haW50YWluIHRoZSBxdWV1ZSdzIEJ5dGUgQ291bnQgdGFibGUgaW4gaG9zdCBEUkFNCisgKiAgICAgKHN0cnVjdCBpbDQ5NjVfc2NoZWRfcXVldWVfYnl0ZV9jbnRfdGJsKSBmb3IgdGhpcyBtb2RlLgorICogICAgIFRoaXMgbW9kZSBkb2VzIG5vdCBzdXBwb3J0IGZyYWdtZW50YXRpb24uCisgKgorICogMikgIEZJRk8gKGEuay5hLiBub24tU2NoZWR1bGVyLUFDSyksIGluIHdoaWNoIGVhY2ggVEZEIGlzIHByb2Nlc3NlZCBpbiBvcmRlci4KKyAqICAgICBUaGUgZGV2aWNlIG1heSBhdXRvbWF0aWNhbGx5IHJldHJ5IFR4LCBidXQgd2lsbCByZXRyeSBvbmx5IG9uZSBmcmFtZQorICogICAgIGF0IGEgdGltZSwgdW50aWwgcmVjZWl2aW5nIEFDSyBmcm9tIHJlY2VpdmluZyBzdGF0aW9uLCBvciByZWFjaGluZworICogICAgIHJldHJ5IGxpbWl0IGFuZCBnaXZpbmcgdXAuCisgKgorICogICAgIFRoZSBjb21tYW5kIHF1ZXVlICgjNC8jOSkgbXVzdCB1c2UgdGhpcyBtb2RlIQorICogICAgIFRoaXMgbW9kZSBkb2VzIG5vdCByZXF1aXJlIHVzZSBvZiB0aGUgQnl0ZSBDb3VudCB0YWJsZSBpbiBob3N0IERSQU0uCisgKgorICogRHJpdmVyIGNvbnRyb2xzIHNjaGVkdWxlciBvcGVyYXRpb24gdmlhIDMgbWVhbnM6CisgKiAxKSAgU2NoZWR1bGVyIHJlZ2lzdGVycworICogMikgIFNoYXJlZCBzY2hlZHVsZXIgZGF0YSBiYXNlIGluIGludGVybmFsIDQ5NTYgU1JBTQorICogMykgIFNoYXJlZCBkYXRhIGluIGhvc3QgRFJBTQorICoKKyAqIEluaXRpYWxpemF0aW9uOgorICoKKyAqIFdoZW4gbG9hZGluZywgZHJpdmVyIHNob3VsZCBhbGxvY2F0ZSBtZW1vcnkgZm9yOgorICogMSkgIDE2IFRGRCBjaXJjdWxhciBidWZmZXJzLCBlYWNoIHdpdGggc3BhY2UgZm9yICh0eXBpY2FsbHkpIDI1NiBURkRzLgorICogMikgIDE2IEJ5dGUgQ291bnQgY2lyY3VsYXIgYnVmZmVycyBpbiAxNiBLQnl0ZXMgY29udGlndW91cyBtZW1vcnkKKyAqICAgICAoMTAyNCBieXRlcyBmb3IgZWFjaCBxdWV1ZSkuCisgKgorICogQWZ0ZXIgcmVjZWl2aW5nICJBbGl2ZSIgcmVzcG9uc2UgZnJvbSB1Q29kZSwgZHJpdmVyIG11c3QgaW5pdGlhbGl6ZQorICogdGhlIHNjaGVkdWxlciAoZXNwZWNpYWxseSBmb3IgcXVldWUgIzQvIzksIHRoZSBjb21tYW5kIHF1ZXVlLCBvdGhlcndpc2UKKyAqIHRoZSBkcml2ZXIgY2FuJ3QgaXNzdWUgY29tbWFuZHMhKToKKyAqLworCisvKioKKyAqIE1heCBUeCB3aW4gc2l6ZSBpcyB0aGUgbWF4IG51bWJlciBvZiBjb250aWd1b3VzIFRGRHMgdGhhdCB0aGUgc2NoZWR1bGVyCisgKiBjYW4ga2VlcCB0cmFjayBvZiBhdCBvbmUgdGltZSB3aGVuIGNyZWF0aW5nIGJsb2NrLWFjayBjaGFpbnMgb2YgZnJhbWVzLgorICogTm90ZSB0aGF0ICI2NCIgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGFjayBiaXRzIGluIGEgYmxvY2stYWNrIHBhY2tldC4KKyAqIERyaXZlciBzaG91bGQgdXNlIFNDRF9XSU5fU0laRSBhbmQgU0NEX0ZSQU1FX0xJTUlUIHZhbHVlcyB0byBpbml0aWFsaXplCisgKiBJTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVCh4KSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgU0NEX1dJTl9TSVpFCQkJCTY0CisjZGVmaW5lIFNDRF9GUkFNRV9MSU1JVAkJCQk2NAorCisvKiBTQ0QgcmVnaXN0ZXJzIGFyZSBpbnRlcm5hbCwgbXVzdCBiZSBhY2Nlc3NlZCB2aWEgSEJVU19UQVJHX1BSUEggcmVncyAqLworI2RlZmluZSBJTDQ5X1NDRF9TVEFSVF9PRkZTRVQJCTB4YTAyYzAwCisKKy8qCisgKiA0OTY1IHRlbGxzIGRyaXZlciBTUkFNIGFkZHJlc3MgZm9yIGludGVybmFsIHNjaGVkdWxlciBzdHJ1Y3RzIHZpYSB0aGlzIHJlZy4KKyAqIFZhbHVlIGlzIHZhbGlkIG9ubHkgYWZ0ZXIgIkFsaXZlIiByZXNwb25zZSBmcm9tIHVDb2RlLgorICovCisjZGVmaW5lIElMNDlfU0NEX1NSQU1fQkFTRV9BRERSICAgICAgICAgICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgwKQorCisvKgorICogRHJpdmVyIG1heSBuZWVkIHRvIHVwZGF0ZSBxdWV1ZS1lbXB0eSBiaXRzIGFmdGVyIGNoYW5naW5nIHF1ZXVlJ3MKKyAqIHdyaXRlIGFuZCByZWFkIHBvaW50ZXJzIChpZHhlcykgZHVyaW5nIChyZS0paW5pdGlhbGl6YXRpb24gKGkuZS4gd2hlbgorICogc2NoZWR1bGVyIGlzIG5vdCB0cmFja2luZyB3aGF0J3MgaGFwcGVuaW5nKS4KKyAqIEJpdCBmaWVsZHM6CisgKiAzMS0xNjogIFdyaXRlIG1hc2sgLS0gMTogdXBkYXRlIGVtcHR5IGJpdCwgMDogZG9uJ3QgY2hhbmdlIGVtcHR5IGJpdAorICogMTUtMDA6ICBFbXB0eSBzdGF0ZSwgb25lIGZvciBlYWNoIHF1ZXVlIC0tIDE6IGVtcHR5LCAwOiBub24tZW1wdHkKKyAqIE5PVEU6ICBUaGlzIHJlZ2lzdGVyIGlzIG5vdCB1c2VkIGJ5IExpbnV4IGRyaXZlci4KKyAqLworI2RlZmluZSBJTDQ5X1NDRF9FTVBUWV9CSVRTICAgICAgICAgICAgICAgKElMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4NCkKKworLyoKKyAqIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiBhcnJheSBvZiBieXRlIGNvdW50IChCQykgY2lyY3VsYXIgYnVmZmVycyAoQ0JzKS4KKyAqIEVhY2ggVHggcXVldWUgaGFzIGEgQkMgQ0IgaW4gaG9zdCBEUkFNIHRvIHN1cHBvcnQgU2NoZWR1bGVyLUFDSyBtb2RlLgorICogVGhpcyByZWdpc3RlciBwb2ludHMgdG8gQkMgQ0IgZm9yIHF1ZXVlIDAsIG11c3QgYmUgb24gMTAyNC1ieXRlIGJvdW5kYXJ5LgorICogT3RoZXJzIGFyZSBzcGFjZWQgYnkgMTAyNCBieXRlcy4KKyAqIEVhY2ggQkMgQ0IgaXMgMiBieXRlcyAqICgyNTYgKyA2NCkgPSA3NDAgYnl0ZXMsIGZvbGxvd2VkIGJ5IDM4NCBieXRlcyBwYWQuCisgKiAoSW5kZXggaW50byBhIHF1ZXVlJ3MgQkMgQ0IpID0gKGlkeCBpbnRvIHF1ZXVlJ3MgVEZEIENCKSA9IChTU04gJiAweGZmKS4KKyAqIEJpdCBmaWVsZHM6CisgKiAyNS0wMDogIEJ5dGUgQ291bnQgQ0IgcGh5c2ljYWwgYWRkcmVzcyBbMzU6MTBdLCBtdXN0IGJlIDEwMjQtYnl0ZSBhbGlnbmVkLgorICovCisjZGVmaW5lIElMNDlfU0NEX0RSQU1fQkFTRV9BRERSICAgICAgICAgICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgxMCkKKworLyoKKyAqIEVuYWJsZXMgYW55L2FsbCBUeCBETUEvRklGTyBjaGFubmVscy4KKyAqIFNjaGVkdWxlciBnZW5lcmF0ZXMgcmVxdWVzdHMgZm9yIG9ubHkgdGhlIGFjdGl2ZSBjaGFubmVscy4KKyAqIFNldCB0aGlzIHRvIDB4ZmYgdG8gZW5hYmxlIGFsbCA4IGNoYW5uZWxzIChub3JtYWwgdXNhZ2UpLgorICogQml0IGZpZWxkczoKKyAqICA3LSAwOiAgRW5hYmxlICgxKSwgZGlzYWJsZSAoMCksIG9uZSBiaXQgZm9yIGVhY2ggY2hhbm5lbCAwLTcKKyAqLworI2RlZmluZSBJTDQ5X1NDRF9UWEZBQ1QgICAgICAgICAgICAgICAgICAgKElMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MWMpCisvKgorICogUXVldWUgKHgpIFdyaXRlIFBvaW50ZXJzIChpZHhlcywgcmVhbGx5ISksIG9uZSBmb3IgZWFjaCBUeCBxdWV1ZS4KKyAqIEluaXRpYWxpemVkIGFuZCB1cGRhdGVkIGJ5IGRyaXZlciBhcyBuZXcgVEZEcyBhcmUgYWRkZWQgdG8gcXVldWUuCisgKiBOT1RFOiAgSWYgdXNpbmcgQmxvY2sgQWNrLCBpZHggbXVzdCBjb3JyZXNwb25kIHRvIGZyYW1lJ3MKKyAqICAgICAgICBTdGFydCBTZXF1ZW5jZSBOdW1iZXI7IGlkeCA9IChTU04gJiAweGZmKQorICogTk9URTogIEFsdGVybmF0aXZlIHRvIEhCVVNfVEFSR19XUlBUUiwgd2hpY2ggaXMgd2hhdCBMaW51eCBkcml2ZXIgdXNlcz8KKyAqLworI2RlZmluZSBJTDQ5X1NDRF9RVUVVRV9XUlBUUih4KSAgKElMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MjQgKyAoeCkgKiA0KQorCisvKgorICogUXVldWUgKHgpIFJlYWQgUG9pbnRlcnMgKGlkeGVzLCByZWFsbHkhKSwgb25lIGZvciBlYWNoIFR4IHF1ZXVlLgorICogRm9yIEZJRk8gbW9kZSwgaWR4IGluZGljYXRlcyBuZXh0IGZyYW1lIHRvIHRyYW5zbWl0LgorICogRm9yIFNjaGVkdWxlci1BQ0sgbW9kZSwgaWR4IGluZGljYXRlcyBmaXJzdCBmcmFtZSBpbiBUeCB3aW4uCisgKiBJbml0aWFsaXplZCBieSBkcml2ZXIsIHVwZGF0ZWQgYnkgc2NoZWR1bGVyLgorICovCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX1JEUFRSKHgpICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHg2NCArICh4KSAqIDQpCisKKy8qCisgKiBTZWxlY3Qgd2hpY2ggcXVldWVzIHdvcmsgaW4gY2hhaW4gbW9kZSAoMSkgdnMuIG5vdCAoMCkuCisgKiBVc2UgY2hhaW4gbW9kZSB0byBidWlsZCBjaGFpbnMgb2YgYWdncmVnYXRlZCBmcmFtZXMuCisgKiBCaXQgZmllbGRzOgorICogMzEtMTY6ICBSZXNlcnZlZAorICogMTUtMDA6ICBNb2RlLCBvbmUgYml0IGZvciBlYWNoIHF1ZXVlIC0tIDE6IENoYWluIG1vZGUsIDA6IG9uZS1hdC1hLXRpbWUKKyAqIE5PVEU6ICBJZiBkcml2ZXIgc2V0cyB1cCBxdWV1ZSBmb3IgY2hhaW4gbW9kZSwgaXQgc2hvdWxkIGJlIGFsc28gc2V0IHVwCisgKiAgICAgICAgU2NoZWR1bGVyLUFDSyBtb2RlIGFzIHdlbGwsIHZpYSBTQ0RfUVVFVUVfU1RBVFVTX0JJVFMoeCkuCisgKi8KKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVDSEFJTl9TRUwgIChJTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweGQwKQorCisvKgorICogU2VsZWN0IHdoaWNoIHF1ZXVlcyBpbnRlcnJ1cHQgZHJpdmVyIHdoZW4gc2NoZWR1bGVyIGluY3JlbWVudHMKKyAqIGEgcXVldWUncyByZWFkIHBvaW50ZXIgKGlkeCkuCisgKiBCaXQgZmllbGRzOgorICogMzEtMTY6ICBSZXNlcnZlZAorICogMTUtMDA6ICBJbnRlcnJ1cHQgZW5hYmxlLCBvbmUgYml0IGZvciBlYWNoIHF1ZXVlIC0tIDE6IGVuYWJsZWQsIDA6IGRpc2FibGVkCisgKiBOT1RFOiAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGFwcGFyZW50bHkgYSBuby1vcDsgZHJpdmVyIHJlbGllcyBvbiBpbnRlcnJ1cHRzCisgKiAgICAgICAgZnJvbSBSeCBxdWV1ZSB0byByZWFkIFR4IGNvbW1hbmQgcmVzcG9uc2VzIGFuZCB1cGRhdGUgVHggcXVldWVzLgorICovCisjZGVmaW5lIElMNDlfU0NEX0lOVEVSUlVQVF9NQVNLICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHhlNCkKKworLyoKKyAqIFF1ZXVlIHNlYXJjaCBzdGF0dXMgcmVnaXN0ZXJzLiAgT25lIGZvciBlYWNoIHF1ZXVlLgorICogU2V0cyB1cCBxdWV1ZSBtb2RlIGFuZCBhc3NpZ25zIHF1ZXVlIHRvIFR4IERNQSBjaGFubmVsLgorICogQml0IGZpZWxkczoKKyAqIDE5LTEwOiBXcml0ZSBtYXNrL2VuYWJsZSBiaXRzIGZvciBiaXRzIDAtOQorICogICAgIDk6IERyaXZlciBzaG91bGQgaW5pdCB0byAiMCIKKyAqICAgICA4OiBTY2hlZHVsZXItQUNLIG1vZGUgKDEpLCBub24tU2NoZWR1bGVyLUFDSyAoaS5lLiBGSUZPKSBtb2RlICgwKS4KKyAqICAgICAgICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gIjEiIGZvciBhZ2dyZWdhdGlvbiBtb2RlLCBvciAiMCIgb3RoZXJ3aXNlLgorICogICA3LTY6IERyaXZlciBzaG91bGQgaW5pdCB0byAiMCIKKyAqICAgICA1OiBXaW5kb3cgU2l6ZSBMZWZ0OyBpbmRpY2F0ZXMgd2hldGhlciBzY2hlZHVsZXIgY2FuIHJlcXVlc3QKKyAqICAgICAgICBhbm90aGVyIFRGRCwgYmFzZWQgb24gd2luIHNpemUsIGV0Yy4gIERyaXZlciBzaG91bGQgaW5pdAorICogICAgICAgIHRoaXMgYml0IHRvICIxIiBmb3IgYWdncmVnYXRpb24gbW9kZSwgb3IgIjAiIGZvciBub24tYWdnLgorICogICA0LTE6IFR4IEZJRk8gdG8gdXNlIChyYW5nZSAwLTcpLgorICogICAgIDA6IFF1ZXVlIGlzIGFjdGl2ZSAoMSksIG5vdCBhY3RpdmUgKDApLgorICogT3RoZXIgYml0cyBzaG91bGQgYmUgd3JpdHRlbiBhcyAiMCIKKyAqCisgKiBOT1RFOiAgSWYgZW5hYmxpbmcgU2NoZWR1bGVyLUFDSyBtb2RlLCBjaGFpbiBtb2RlIHNob3VsZCBhbHNvIGJlIGVuYWJsZWQKKyAqICAgICAgICB2aWEgU0NEX1FVRVVFQ0hBSU5fU0VMLgorICovCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX1NUQVRVU19CSVRTKHgpXAorCShJTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDEwNCArICh4KSAqIDQpCisKKy8qIEJpdCBmaWVsZCBwb3NpdGlvbnMgKi8KKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX0FDVElWRQkoMCkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1RYRgkoMSkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1dTTAkoNSkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ0sJKDgpCisKKy8qIFdyaXRlIG1hc2tzICovCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19TQ0RfQUNUX0VOCSgxMCkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfTVNLCQkoMHgwMDA3RkMwMCkKKworLyoqCisgKiA0OTY1IGludGVybmFsIFNSQU0gc3RydWN0dXJlcyBmb3Igc2NoZWR1bGVyLCBzaGFyZWQgd2l0aCBkcml2ZXIgLi4uCisgKgorICogRHJpdmVyIHNob3VsZCBjbGVhciBhbmQgaW5pdGlhbGl6ZSB0aGUgZm9sbG93aW5nIGFyZWFzIGFmdGVyIHJlY2VpdmluZworICogIkFsaXZlIiByZXNwb25zZSBmcm9tIDQ5NjUgdUNvZGUsIGkuZS4gYWZ0ZXIgaW5pdGlhbAorICogdUNvZGUgbG9hZCwgb3IgYWZ0ZXIgYSB1Q29kZSBsb2FkIGRvbmUgZm9yIGVycm9yIHJlY292ZXJ5OgorICoKKyAqIFNDRF9DT05URVhUX0RBVEFfT0ZGU0VUIChzaXplIDEyOCBieXRlcykKKyAqIFNDRF9UWF9TVFRTX0JJVE1BUF9PRkZTRVQgKHNpemUgMjU2IGJ5dGVzKQorICogU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUIChzaXplIDMyIGJ5dGVzKQorICoKKyAqIERyaXZlciBhY2Nlc3NlcyBTUkFNIHZpYSBIQlVTX1RBUkdfTUVNXyogcmVnaXN0ZXJzLgorICogRHJpdmVyIHJlYWRzIGJhc2UgYWRkcmVzcyBvZiB0aGlzIHNjaGVkdWxlciBhcmVhIGZyb20gU0NEX1NSQU1fQkFTRV9BRERSLgorICogQWxsIE9GRlNFVCB2YWx1ZXMgbXVzdCBiZSBhZGRlZCB0byB0aGlzIGJhc2UgYWRkcmVzcy4KKyAqLworCisvKgorICogUXVldWUgY29udGV4dC4gIE9uZSA4LWJ5dGUgZW50cnkgZm9yIGVhY2ggb2YgMTYgcXVldWVzLgorICoKKyAqIERyaXZlciBzaG91bGQgY2xlYXIgdGhpcyBlbnRpcmUgYXJlYSAoc2l6ZSAweDgwKSB0byAwIGFmdGVyIHJlY2VpdmluZworICogIkFsaXZlIiBub3RpZmljYXRpb24gZnJvbSB1Q29kZS4gIEFkZGl0aW9uYWxseSwgZHJpdmVyIHNob3VsZCBpbml0CisgKiBlYWNoIHF1ZXVlJ3MgZW50cnkgYXMgZm9sbG93czoKKyAqCisgKiBMUyBEd29yZCBiaXQgZmllbGRzOgorICogIDAtMDY6ICBNYXggVHggd2luIHNpemUgZm9yIFNjaGVkdWxlci1BQ0suICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gNjQuCisgKgorICogTVMgRHdvcmQgYml0IGZpZWxkczoKKyAqIDE2LTIyOiAgRnJhbWUgbGltaXQuICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gMTAgKDB4YSkuCisgKgorICogRHJpdmVyIHNob3VsZCBpbml0IGFsbCBvdGhlciBiaXRzIHRvIDAuCisgKgorICogSW5pdCBtdXN0IGJlIGRvbmUgYWZ0ZXIgZHJpdmVyIHJlY2VpdmVzICJBbGl2ZSIgcmVzcG9uc2UgZnJvbSA0OTY1IHVDb2RlLAorICogYW5kIHdoZW4gc2V0dGluZyB1cCBxdWV1ZSBmb3IgYWdncmVnYXRpb24uCisgKi8KKyNkZWZpbmUgSUw0OV9TQ0RfQ09OVEVYVF9EQVRBX09GRlNFVAkJCTB4MzgwCisjZGVmaW5lIElMNDlfU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHgpIFwKKwkJCShJTDQ5X1NDRF9DT05URVhUX0RBVEFfT0ZGU0VUICsgKCh4KSAqIDgpKQorCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX1BPUwkJKDApCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX01TSwkJKDB4MDAwMDAwN0YpCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX1BPUwkoMTYpCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX01TSwkoMHgwMDdGMDAwMCkKKworLyoKKyAqIFR4IFN0YXR1cyBCaXRtYXAKKyAqCisgKiBEcml2ZXIgc2hvdWxkIGNsZWFyIHRoaXMgZW50aXJlIGFyZWEgKHNpemUgMHgxMDApIHRvIDAgYWZ0ZXIgcmVjZWl2aW5nCisgKiAiQWxpdmUiIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlLiAgQXJlYSBpcyB1c2VkIG9ubHkgYnkgZGV2aWNlIGl0c2VsZjsKKyAqIG5vIG90aGVyIHN1cHBvcnQgKGJlc2lkZXMgY2xlYXJpbmcpIGlzIHJlcXVpcmVkIGZyb20gZHJpdmVyLgorICovCisjZGVmaW5lIElMNDlfU0NEX1RYX1NUVFNfQklUTUFQX09GRlNFVAkJMHg0MDAKKworLyoKKyAqIFJBeFRJRCB0byBxdWV1ZSB0cmFuc2xhdGlvbiBtYXBwaW5nLgorICoKKyAqIFdoZW4gcXVldWUgaXMgaW4gU2NoZWR1bGVyLUFDSyBtb2RlLCBmcmFtZXMgcGxhY2VkIGluIGEgdGhhdCBxdWV1ZSBtdXN0IGJlCisgKiBmb3Igb25seSBvbmUgY29tYmluYXRpb24gb2YgcmVjZWl2ZXIgYWRkcmVzcyAoUkEpIGFuZCB0cmFmZmljIElEIChUSUQpLCBpLmUuCisgKiBvbmUgUU9TIHByaW9yaXR5IGxldmVsIGRlc3RpbmVkIGZvciBvbmUgc3RhdGlvbiAoZm9yIHRoaXMgd2lyZWxlc3MgbGluaywKKyAqIG5vdCBmaW5hbCBkZXN0aW5hdGlvbikuICBUaGUgU0NEX1RSQU5TTEFURV9UQkwgYXJlYSBwcm92aWRlcyAxNiAxNi1iaXQKKyAqIG1hcHBpbmdzLCBvbmUgZm9yIGVhY2ggb2YgdGhlIDE2IHF1ZXVlcy4gIElmIHF1ZXVlIGlzIG5vdCBpbiBTY2hlZHVsZXItQUNLCisgKiBtb2RlLCB0aGUgZGV2aWNlIGlnbm9yZXMgdGhlIG1hcHBpbmcgdmFsdWUuCisgKgorICogQml0IGZpZWxkcywgZm9yIGVhY2ggMTYtYml0IG1hcDoKKyAqIDE1LTk6ICBSZXNlcnZlZCwgc2V0IHRvIDAKKyAqICA4LTQ6ICBJbmRleCBpbnRvIGRldmljZSdzIHN0YXRpb24gdGFibGUgZm9yIHJlY2lwaWVudCBzdGF0aW9uCisgKiAgMy0wOiAgVHJhZmZpYyBJRCAodGlkKSwgcmFuZ2UgMC0xNQorICoKKyAqIERyaXZlciBzaG91bGQgY2xlYXIgdGhpcyBlbnRpcmUgYXJlYSAoc2l6ZSAzMiBieXRlcykgdG8gMCBhZnRlciByZWNlaXZpbmcKKyAqICJBbGl2ZSIgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUuICBUbyB1cGRhdGUgYSAxNi1iaXQgbWFwIHZhbHVlLCBkcml2ZXIKKyAqIG11c3QgcmVhZCBhIGR3b3JkLWFsaWduZWQgdmFsdWUgZnJvbSBkZXZpY2UgU1JBTSwgcmVwbGFjZSB0aGUgMTYtYml0IG1hcAorICogdmFsdWUgb2YgaW50ZXJlc3QsIGFuZCB3cml0ZSB0aGUgZHdvcmQgdmFsdWUgYmFjayBpbnRvIGRldmljZSBTUkFNLgorICovCisjZGVmaW5lIElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUCQkweDUwMAorCisvKiBGaW5kIHRyYW5zbGF0aW9uIHRhYmxlIGR3b3JkIHRvIHJlYWQvd3JpdGUgZm9yIGdpdmVuIHF1ZXVlICovCisjZGVmaW5lIElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUX1FVRVVFKHgpIFwKKwkoKElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUICsgKCh4KSAqIDIpKSAmIDB4ZmZmZmZmZmMpCisKKyNkZWZpbmUgSUxfU0NEX1RYRklGT19QT1NfVElECQkJKDApCisjZGVmaW5lIElMX1NDRF9UWEZJRk9fUE9TX1JBCQkJKDQpCisjZGVmaW5lIElMX1NDRF9RVUVVRV9SQV9USURfTUFQX1JBVElEX01TSwkoMHgwMUZGKQorCisvKioqKioqKioqKioqKioqKioqKioqKiogRU5EIFRYIFNDSEVEVUxFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLyogX19pbF9wcnBoX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvTWFrZWZpbGUKaW5kZXggYzczZTVlZC4uYTdhYjI4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogIyBXSUZJCiBvYmotJChDT05GSUdfSVdMV0lGSSkJKz0gaXdsd2lmaS5vCi1pd2x3aWZpLW9ianMJCTo9IGl3bC1hZ24ubyBpd2wtYWduLXJzLm8KK2l3bHdpZmktb2JqcwkJOj0gaXdsLWFnbi5vIGl3bC1hZ24tcnMubyBpd2wtbWFjODAyMTEubwogaXdsd2lmaS1vYmpzCQkrPSBpd2wtYWduLXVjb2RlLm8gaXdsLWFnbi10eC5vCiBpd2x3aWZpLW9ianMJCSs9IGl3bC1hZ24tbGliLm8gaXdsLWFnbi1jYWxpYi5vIGl3bC1pby5vCiBpd2x3aWZpLW9ianMJCSs9IGl3bC1hZ24tdHQubyBpd2wtYWduLXN0YS5vIGl3bC1hZ24tcngubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCmluZGV4IGRkMDA4YjAuLjhkM2JhZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKQEAgLTE0NywxNiArMTQ3LDcgQEAKIAlpd2wxMDAwX3NldF9jdF90aHJlc2hvbGQocHJpdik7CiAKIAkvKiBTZXQgaW5pdGlhbCBzZW5zaXRpdml0eSBwYXJhbWV0ZXJzICovCi0JLyogU2V0IGluaXRpYWwgY2FsaWJyYXRpb24gc2V0ICovCiAJaHdfcGFyYW1zKHByaXYpLnNlbnMgPSAmaXdsMTAwMF9zZW5zaXRpdml0eTsKLQlod19wYXJhbXMocHJpdikuY2FsaWJfaW5pdF9jZmcgPQotCQkJQklUKElXTF9DQUxJQl9YVEFMKQkJfAotCQkJQklUKElXTF9DQUxJQl9MTykJCXwKLQkJCUJJVChJV0xfQ0FMSUJfVFhfSVEpIAkJfAotCQkJQklUKElXTF9DQUxJQl9UWF9JUV9QRVJEKQl8Ci0JCQlCSVQoSVdMX0NBTElCX0JBU0VfQkFORCk7Ci0JaWYgKHByaXYtPmNmZy0+bmVlZF9kY19jYWxpYikKLQkJaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnIHw9IEJJVChJV0xfQ0FMSUJfREMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMKaW5kZXggNzk0MzE5Ny4uMGM0Njg4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYwpAQCAtMTQzLDE3ICsxNDMsNyBAQAogCWl3bDIwMDBfc2V0X2N0X3RocmVzaG9sZChwcml2KTsKIAogCS8qIFNldCBpbml0aWFsIHNlbnNpdGl2aXR5IHBhcmFtZXRlcnMgKi8KLQkvKiBTZXQgaW5pdGlhbCBjYWxpYnJhdGlvbiBzZXQgKi8KIAlod19wYXJhbXMocHJpdikuc2VucyA9ICZpd2wyMDAwX3NlbnNpdGl2aXR5OwotCWh3X3BhcmFtcyhwcml2KS5jYWxpYl9pbml0X2NmZyA9Ci0JCUJJVChJV0xfQ0FMSUJfWFRBTCkgICAgICAgICAgICAgfAotCQlCSVQoSVdMX0NBTElCX0xPKSAgICAgICAgICAgICAgIHwKLQkJQklUKElXTF9DQUxJQl9UWF9JUSkgICAgICAgICAgICB8Ci0JCUJJVChJV0xfQ0FMSUJfQkFTRV9CQU5EKTsKLQlpZiAocHJpdi0+Y2ZnLT5uZWVkX2RjX2NhbGliKQotCQlod19wYXJhbXMocHJpdikuY2FsaWJfcnRfY2ZnIHw9IElXTF9DQUxJQl9DRkdfRENfSURYOwotCWlmIChwcml2LT5jZmctPm5lZWRfdGVtcF9vZmZzZXRfY2FsaWIpCi0JCWh3X3BhcmFtcyhwcml2KS5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX1RFTVBfT0ZGU0VUKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjU4LDcgKzI0OCw2IEBACiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fMjAwMF9UWF9QT1dFUl9WRVJTSU9OLAlcCiAJLmxpYiA9ICZpd2wyMDAwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMjAwMF9iYXNlX3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS50ZW1wX29mZnNldF92MiA9IHRydWUsCQkJCQlcCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURSwJCQkJXApAQCAtMjcwLDExICsyNTksNiBAQAogCS5odF9wYXJhbXMgPSAmaXdsMjAwMF9odF9wYXJhbXMsCiB9OwogCi1zdHJ1Y3QgaXdsX2NmZyBpd2wyMDAwXzJiZ19jZmcgPSB7Ci0JLm5hbWUgPSAiMjAwMCBTZXJpZXMgMngyIEJHIiwKLQlJV0xfREVWSUNFXzIwMDAsCi19OwotCiBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDAwXzJiZ25fZF9jZmcgPSB7CiAJLm5hbWUgPSAiMjAwMEQgU2VyaWVzIDJ4MiBCR04iLAogCUlXTF9ERVZJQ0VfMjAwMCwKQEAgLTI5MSw3ICsyNzUsNiBAQAogCS5saWIgPSAmaXdsMjAzMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDIwMzBfYmFzZV9wYXJhbXMsCQkJXAogCS5idF9wYXJhbXMgPSAmaXdsMjAzMF9idF9wYXJhbXMsCQkJXAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubmVlZF90ZW1wX29mZnNldF9jYWxpYiA9IHRydWUsCQkJCVwKIAkudGVtcF9vZmZzZXRfdjIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKQEAgLTMwNCwxMSArMjg3LDYgQEAKIAkuaHRfcGFyYW1zID0gJml3bDIwMDBfaHRfcGFyYW1zLAogfTsKIAotc3RydWN0IGl3bF9jZmcgaXdsMjAzMF8yYmdfY2ZnID0gewotCS5uYW1lID0gIjIwMDAgU2VyaWVzIDJ4MiBCRy9CVCIsCi0JSVdMX0RFVklDRV8yMDMwLAotfTsKLQogI2RlZmluZSBJV0xfREVWSUNFXzEwNQkJCQkJCVwKIAkuZndfbmFtZV9wcmUgPSBJV0wxMDVfRldfUFJFLAkJCQlcCiAJLnVjb2RlX2FwaV9tYXggPSBJV0wxMDVfVUNPREVfQVBJX01BWCwJCQlcCkBAIC0zMTgsNyArMjk2LDYgQEAKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV8yMDAwX1RYX1BPV0VSX1ZFUlNJT04sCVwKIAkubGliID0gJml3bDIwMDBfbGliLAkJCQkJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2wyMDAwX2Jhc2VfcGFyYW1zLAkJCVwKLQkubmVlZF9kY19jYWxpYiA9IHRydWUsCQkJCQlcCiAJLm5lZWRfdGVtcF9vZmZzZXRfY2FsaWIgPSB0cnVlLAkJCQlcCiAJLnRlbXBfb2Zmc2V0X3YyID0gdHJ1ZSwJCQkJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFLAkJCQlcCkBAIC0zMjYsMTEgKzMwMyw2IEBACiAJLnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkgPSB0cnVlLAkJCQlcCiAJLmlxX2ludmVydCA9IHRydWUJCQkJCVwKIAotc3RydWN0IGl3bF9jZmcgaXdsMTA1X2JnX2NmZyA9IHsKLQkubmFtZSA9ICIxMDUgU2VyaWVzIDF4MSBCRyIsCi0JSVdMX0RFVklDRV8xMDUsCi19OwotCiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDVfYmduX2NmZyA9IHsKIAkubmFtZSA9ICIxMDUgU2VyaWVzIDF4MSBCR04iLAogCUlXTF9ERVZJQ0VfMTA1LApAQCAtMzUzLDcgKzMyNSw2IEBACiAJLmxpYiA9ICZpd2wyMDMwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMjAzMF9iYXNlX3BhcmFtcywJCQlcCiAJLmJ0X3BhcmFtcyA9ICZpd2wyMDMwX2J0X3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS50ZW1wX29mZnNldF92MiA9IHRydWUsCQkJCQlcCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURSwJCQkJXApAQCAtMzYxLDExICszMzIsNiBAQAogCS5yeF93aXRoX3Npc29fZGl2ZXJzaXR5ID0gdHJ1ZSwJCQkJXAogCS5pcV9pbnZlcnQgPSB0cnVlCQkJCQlcCiAKLXN0cnVjdCBpd2xfY2ZnIGl3bDEzNV9iZ19jZmcgPSB7Ci0JLm5hbWUgPSAiMTM1IFNlcmllcyAxeDEgQkcvQlQiLAotCUlXTF9ERVZJQ0VfMTM1LAotfTsKLQogc3RydWN0IGl3bF9jZmcgaXdsMTM1X2Jnbl9jZmcgPSB7CiAJLm5hbWUgPSAiMTM1IFNlcmllcyAxeDEgQkdOL0JUIiwKIAlJV0xfREVWSUNFXzEzNSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYwppbmRleCBmNTVmYjJkLi5jZjJmYjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCkBAIC0xODYsMTQgKzE4Niw3IEBACiAJaXdsNTAwMF9zZXRfY3RfdGhyZXNob2xkKHByaXYpOwogCiAJLyogU2V0IGluaXRpYWwgc2Vuc2l0aXZpdHkgcGFyYW1ldGVycyAqLwotCS8qIFNldCBpbml0aWFsIGNhbGlicmF0aW9uIHNldCAqLwogCWh3X3BhcmFtcyhwcml2KS5zZW5zID0gJml3bDUwMDBfc2Vuc2l0aXZpdHk7Ci0JaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnID0KLQkJQklUKElXTF9DQUxJQl9YVEFMKQkJfAotCQlCSVQoSVdMX0NBTElCX0xPKQkJfAotCQlCSVQoSVdMX0NBTElCX1RYX0lRKQkJfAotCQlCSVQoSVdMX0NBTElCX1RYX0lRX1BFUkQpCXwKLQkJQklUKElXTF9DQUxJQl9CQVNFX0JBTkQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMjIsMTQgKzIxNSw3IEBACiAJaXdsNTE1MF9zZXRfY3RfdGhyZXNob2xkKHByaXYpOwogCiAJLyogU2V0IGluaXRpYWwgc2Vuc2l0aXZpdHkgcGFyYW1ldGVycyAqLwotCS8qIFNldCBpbml0aWFsIGNhbGlicmF0aW9uIHNldCAqLwogCWh3X3BhcmFtcyhwcml2KS5zZW5zID0gJml3bDUxNTBfc2Vuc2l0aXZpdHk7Ci0JaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnID0KLQkJQklUKElXTF9DQUxJQl9MTykJCXwKLQkJQklUKElXTF9DQUxJQl9UWF9JUSkJCXwKLQkJQklUKElXTF9DQUxJQl9CQVNFX0JBTkQpOwotCWlmIChwcml2LT5jZmctPm5lZWRfZGNfY2FsaWIpCi0JCWh3X3BhcmFtcyhwcml2KS5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX0RDKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDM0LDcgKzQyMCw3IEBACiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNTA1MF9UWF9QT1dFUl9WRVJTSU9OLAlcCiAJLmxpYiA9ICZpd2w1MTUwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNTAwMF9iYXNlX3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAorCS5ub194dGFsX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LLAkJCQlcCiAJLmludGVybmFsX3dpbWF4X2NvZXggPSB0cnVlCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYwppbmRleCBjODQwYzc4Li42MTdhZDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCkBAIC00NiwxMSArNDYsMTIgQEAKICNpbmNsdWRlICJpd2wtY2ZnLmgiCiAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDYwMDBfVUNPREVfQVBJX01BWCA0CisjZGVmaW5lIElXTDYwMDBfVUNPREVfQVBJX01BWCA2CiAjZGVmaW5lIElXTDYwNTBfVUNPREVfQVBJX01BWCA1CiAjZGVmaW5lIElXTDYwMDBHMl9VQ09ERV9BUElfTUFYIDYKIAogLyogT2xkZXN0IHZlcnNpb24gd2Ugd29uJ3Qgd2FybiBhYm91dCAqLworI2RlZmluZSBJV0w2MDAwX1VDT0RFX0FQSV9PSyA0CiAjZGVmaW5lIElXTDYwMDBHMl9VQ09ERV9BUElfT0sgNQogCiAvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCkBAIC0xNjQsMTcgKzE2NSw3IEBACiAJaXdsNjAwMF9zZXRfY3RfdGhyZXNob2xkKHByaXYpOwogCiAJLyogU2V0IGluaXRpYWwgc2Vuc2l0aXZpdHkgcGFyYW1ldGVycyAqLwotCS8qIFNldCBpbml0aWFsIGNhbGlicmF0aW9uIHNldCAqLwogCWh3X3BhcmFtcyhwcml2KS5zZW5zID0gJml3bDYwMDBfc2Vuc2l0aXZpdHk7Ci0JaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnID0KLQkJQklUKElXTF9DQUxJQl9YVEFMKQkJfAotCQlCSVQoSVdMX0NBTElCX0xPKQkJfAotCQlCSVQoSVdMX0NBTElCX1RYX0lRKQkJfAotCQlCSVQoSVdMX0NBTElCX0JBU0VfQkFORCk7Ci0JaWYgKHByaXYtPmNmZy0+bmVlZF9kY19jYWxpYikKLQkJaHdfcGFyYW1zKHByaXYpLmNhbGliX3J0X2NmZyB8PSBJV0xfQ0FMSUJfQ0ZHX0RDX0lEWDsKLQlpZiAocHJpdi0+Y2ZnLT5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliKQotCQlod19wYXJhbXMocHJpdikuY2FsaWJfaW5pdF9jZmcgfD0gQklUKElXTF9DQUxJQl9URU1QX09GRlNFVCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM2NCw3ICszNTUsNiBAQAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYwMDVfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5saWIgPSAmaXdsNjAwMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDYwMDBfZzJfYmFzZV9wYXJhbXMsCQkJXAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubmVlZF90ZW1wX29mZnNldF9jYWxpYiA9IHRydWUsCQkJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFCiAKQEAgLTQwNiw3ICszOTYsNiBAQAogCS5saWIgPSAmaXdsNjAzMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDYwMDBfZzJfYmFzZV9wYXJhbXMsCQkJXAogCS5idF9wYXJhbXMgPSAmaXdsNjAwMF9idF9wYXJhbXMsCQkJXAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubmVlZF90ZW1wX29mZnNldF9jYWxpYiA9IHRydWUsCQkJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFLAkJCQlcCiAJLmFkdl9wbSA9IHRydWUJCQkJCQlcCkBAIC00MzksMTYgKzQyOCw2IEBACiAJLmh0X3BhcmFtcyA9ICZpd2w2MDAwX2h0X3BhcmFtcywKIH07CiAKLXN0cnVjdCBpd2xfY2ZnIGl3bDYwMzVfMmFiZ19jZmcgPSB7Ci0JLm5hbWUgPSAiNjAzNSBTZXJpZXMgMngyIEFCRy9CVCIsCi0JSVdMX0RFVklDRV82MDMwLAotfTsKLQotc3RydWN0IGl3bF9jZmcgaXdsNjAzNV8yYmdfY2ZnID0gewotCS5uYW1lID0gIjYwMzUgU2VyaWVzIDJ4MiBCRy9CVCIsCi0JSVdMX0RFVklDRV82MDMwLAotfTsKLQogc3RydWN0IGl3bF9jZmcgaXdsMTAzMF9iZ25fY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMTAzMCBCR04iLAogCUlXTF9ERVZJQ0VfNjAzMCwKQEAgLTQ3OSw2ICs0NTgsNyBAQAogI2RlZmluZSBJV0xfREVWSUNFXzYwMDBpCQkJCQlcCiAJLmZ3X25hbWVfcHJlID0gSVdMNjAwMF9GV19QUkUsCQkJCVwKIAkudWNvZGVfYXBpX21heCA9IElXTDYwMDBfVUNPREVfQVBJX01BWCwJCQlcCisJLnVjb2RlX2FwaV9vayA9IElXTDYwMDBfVUNPREVfQVBJX09LLAkJCVwKIAkudWNvZGVfYXBpX21pbiA9IElXTDYwMDBfVUNPREVfQVBJX01JTiwJCQlcCiAJLnZhbGlkX3R4X2FudCA9IEFOVF9CQywJCS8qIC5jZmcgb3ZlcndyaXRlICovCVwKIAkudmFsaWRfcnhfYW50ID0gQU5UX0JDLAkJLyogLmNmZyBvdmVyd3JpdGUgKi8JXApAQCAtNTE2LDcgKzQ5Niw2IEBACiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNjA1MF9FRVBST01fVkVSU0lPTiwJCVwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MDUwX1RYX1BPV0VSX1ZFUlNJT04sCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjA1MF9iYXNlX3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKIAkuaW50ZXJuYWxfd2ltYXhfY29leCA9IHRydWUKIApAQCAtNTQwLDcgKzUxOSw2IEBACiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNjE1MF9FRVBST01fVkVSU0lPTiwJCVwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MTUwX1RYX1BPV0VSX1ZFUlNJT04sCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjA1MF9iYXNlX3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKIAkuaW50ZXJuYWxfd2ltYXhfY29leCA9IHRydWUKIApAQCAtNTU5LDE3ICs1MzcsMTcgQEAKIAkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBVbHRpbWF0ZS1OIDYzMDAgQUdOIiwKIAkuZndfbmFtZV9wcmUgPSBJV0w2MDAwX0ZXX1BSRSwKIAkudWNvZGVfYXBpX21heCA9IElXTDYwMDBfVUNPREVfQVBJX01BWCwKKwkudWNvZGVfYXBpX29rID0gSVdMNjAwMF9VQ09ERV9BUElfT0ssCiAJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDAwX1VDT0RFX0FQSV9NSU4sCiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNjAwMF9FRVBST01fVkVSU0lPTiwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MDAwX1RYX1BPV0VSX1ZFUlNJT04sCiAJLmxpYiA9ICZpd2w2MDAwX2xpYiwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjAwMF9iYXNlX3BhcmFtcywKIAkuaHRfcGFyYW1zID0gJml3bDYwMDBfaHRfcGFyYW1zLAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKIAkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LLAogfTsKIAotTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfVUNPREVfQVBJX01BWCkpOworTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfVUNPREVfQVBJX09LKSk7CiBNT0RVTEVfRklSTVdBUkUoSVdMNjA1MF9NT0RVTEVfRklSTVdBUkUoSVdMNjA1MF9VQ09ERV9BUElfTUFYKSk7CiBNT0RVTEVfRklSTVdBUkUoSVdMNjAwNV9NT0RVTEVfRklSTVdBUkUoSVdMNjAwMEcyX1VDT0RFX0FQSV9NQVgpKTsKIE1PRFVMRV9GSVJNV0FSRShJV0w2MDMwX01PRFVMRV9GSVJNV0FSRShJV0w2MDAwRzJfVUNPREVfQVBJX01BWCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tY2FsaWIuYwppbmRleCAwM2JhYzQ4Li40ZDAyMTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tY2FsaWIuYwpAQCAtODQsNTQgKzg0LDYyIEBACiAKIGludCBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaSA9IDA7Ci0KIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGhjbWQgPSB7CiAJCS5pZCA9IFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQsCiAJCS5mbGFncyA9IENNRF9TWU5DLAogCX07CisJc3RydWN0IGl3bF9jYWxpYl9yZXN1bHQgKnJlczsKIAotCWZvciAoaSA9IDA7IGkgPCBJV0xfQ0FMSUJfTUFYOyBpKyspIHsKLQkJaWYgKChCSVQoaSkgJiBod19wYXJhbXMocHJpdikuY2FsaWJfaW5pdF9jZmcpICYmCi0JCSAgICBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZikgewotCQkJaGNtZC5sZW5bMF0gPSBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zl9sZW47Ci0JCQloY21kLmRhdGFbMF0gPSBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZjsKLQkJCWhjbWQuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWTsKLQkJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJmhjbWQpOwotCQkJaWYgKHJldCkgewotCQkJCUlXTF9FUlIocHJpdiwgIkVycm9yICVkIGl0ZXJhdGlvbiAlZFxuIiwKLQkJCQkJcmV0LCBpKTsKLQkJCQlicmVhazsKLQkJCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJnByaXYtPmNhbGliX3Jlc3VsdHMsIGxpc3QpIHsKKwkJaW50IHJldDsKKworCQloY21kLmxlblswXSA9IHJlcy0+Y21kX2xlbjsKKwkJaGNtZC5kYXRhWzBdID0gJnJlcy0+aGRyOworCQloY21kLmRhdGFmbGFnc1swXSA9IElXTF9IQ01EX0RGTF9OT0NPUFk7CisJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJmhjbWQpOworCQlpZiAocmV0KSB7CisJCQlJV0xfRVJSKHByaXYsICJFcnJvciAlZCBvbiBjYWxpYiBjbWQgJWRcbiIsCisJCQkJcmV0LCByZXMtPmhkci5vcF9jb2RlKTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCi1pbnQgaXdsX2NhbGliX3NldChzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCAqcmVzLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQoraW50IGl3bF9jYWxpYl9zZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkgIGNvbnN0IHN0cnVjdCBpd2xfY2FsaWJfaGRyICpjbWQsIGludCBsZW4pCiB7Ci0JaWYgKHJlcy0+YnVmX2xlbiAhPSBsZW4pIHsKLQkJa2ZyZWUocmVzLT5idWYpOwotCQlyZXMtPmJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKLQl9Ci0JaWYgKHVubGlrZWx5KHJlcy0+YnVmID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT01FTTsKKwlzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCAqcmVzLCAqdG1wOwogCi0JcmVzLT5idWZfbGVuID0gbGVuOwotCW1lbWNweShyZXMtPmJ1ZiwgYnVmLCBsZW4pOworCXJlcyA9IGttYWxsb2Moc2l6ZW9mKCpyZXMpICsgbGVuIC0gc2l6ZW9mKHN0cnVjdCBpd2xfY2FsaWJfaGRyKSwKKwkJICAgICAgR0ZQX0FUT01JQyk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweSgmcmVzLT5oZHIsIGNtZCwgbGVuKTsKKwlyZXMtPmNtZF9sZW4gPSBsZW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJnByaXYtPmNhbGliX3Jlc3VsdHMsIGxpc3QpIHsKKwkJaWYgKHRtcC0+aGRyLm9wX2NvZGUgPT0gcmVzLT5oZHIub3BfY29kZSkgeworCQkJbGlzdF9yZXBsYWNlKCZ0bXAtPmxpc3QsICZyZXMtPmxpc3QpOworCQkJa2ZyZWUodG1wKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogd2Fzbid0IGluIGxpc3QgYWxyZWFkeSAqLworCWxpc3RfYWRkX3RhaWwoJnJlcy0+bGlzdCwgJnByaXYtPmNhbGliX3Jlc3VsdHMpOworCiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgaXdsX2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IGl3bF9jYWxpYl9yZXN1bHQgKnJlcywgKnRtcDsKIAotCWZvciAoaSA9IDA7IGkgPCBJV0xfQ0FMSUJfTUFYOyBpKyspIHsKLQkJa2ZyZWUocHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWYpOwotCQlwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZiA9IE5VTEw7Ci0JCXByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmX2xlbiA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgdG1wLCAmcHJpdi0+Y2FsaWJfcmVzdWx0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmcmVzLT5saXN0KTsKKwkJa2ZyZWUocmVzKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmgKaW5kZXggYTg2OWZjOS4uNmVkODA2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmgKQEAgLTczLDcgKzczLDggQEAKIHZvaWQgaXdsX3Jlc2V0X3J1bl90aW1lX2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAKIGludCBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2NhbGliX3NldChzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCAqcmVzLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKTsKK2ludCBpd2xfY2FsaWJfc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJICBjb25zdCBzdHJ1Y3QgaXdsX2NhbGliX2hkciAqY21kLCBpbnQgbGVuKTsKIHZvaWQgaXdsX2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogCiAjZW5kaWYgLyogX19pd2xfY2FsaWJfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tbGliLmMKaW5kZXggMWE1MmVkMi4uMGJjOTYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1saWIuYwpAQCAtODI3LDYgKzgyNyw3IEBACiAJY2FzZSBJRUVFODAyMTFfU01QU19TVEFUSUM6CiAJY2FzZSBJRUVFODAyMTFfU01QU19EWU5BTUlDOgogCQlyZXR1cm4gSVdMX05VTV9JRExFX0NIQUlOU19TSU5HTEU7CisJY2FzZSBJRUVFODAyMTFfU01QU19BVVRPTUFUSUM6CiAJY2FzZSBJRUVFODAyMTFfU01QU19PRkY6CiAJCXJldHVybiBhY3RpdmVfY250OwogCWRlZmF1bHQ6CkBAIC05ODMsMyArOTg0LDM2MCBAQAogCWxpc3RfZGVsKCZ3YWl0X2VudHJ5LT5saXN0KTsKIAlzcGluX3VubG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKIH0KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIHZvaWQgaXdsYWduX2NvbnZlcnRfcDFrKHUxNiAqcDFrLCBfX2xlMTYgKm91dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJV0xBR05fUDFLX1NJWkU7IGkrKykKKwkJb3V0W2ldID0gY3B1X3RvX2xlMTYocDFrW2ldKTsKK30KKworc3RydWN0IHdvd2xhbl9rZXlfZGF0YSB7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgaXdsYWduX3dvd2xhbl9yc2NfdHNjX3BhcmFtc19jbWQgKnJzY190c2M7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fdGtpcF9wYXJhbXNfY21kICp0a2lwOworCWNvbnN0IHU4ICpic3NpZDsKKwlib29sIGVycm9yLCB1c2VfcnNjX3RzYywgdXNlX3RraXA7Cit9OworCisKK3N0YXRpYyB2b2lkIGl3bGFnbl93b3dsYW5fcHJvZ3JhbV9rZXlzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksCisJCQkgICAgICAgdm9pZCAqX2RhdGEpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IHdvd2xhbl9rZXlfZGF0YSAqZGF0YSA9IF9kYXRhOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBkYXRhLT5jdHg7CisJc3RydWN0IGFlc19zYyAqYWVzX3NjLCAqYWVzX3R4X3NjID0gTlVMTDsKKwlzdHJ1Y3QgdGtpcF9zYyAqdGtpcF9zYywgKnRraXBfdHhfc2MgPSBOVUxMOworCXN0cnVjdCBpd2xhZ25fcDFrX2NhY2hlICpyeF9wMWtzOworCXU4ICpyeF9taWNfa2V5OworCXN0cnVjdCBpZWVlODAyMTFfa2V5X3NlcSBzZXE7CisJdTMyIGN1cl9yeF9pdjMyID0gMDsKKwl1MTYgcDFrW0lXTEFHTl9QMUtfU0laRV07CisJaW50IHJldCwgaTsKKworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKKwkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYKKwkgICAgICFzdGEgJiYgIWN0eC0+a2V5X21hcHBpbmdfa2V5cykKKwkJcmV0ID0gaXdsX3NldF9kZWZhdWx0X3dlcF9rZXkocHJpdiwgY3R4LCBrZXkpOworCWVsc2UKKwkJcmV0ID0gaXdsX3NldF9keW5hbWljX2tleShwcml2LCBjdHgsIGtleSwgc3RhKTsKKworCWlmIChyZXQpIHsKKwkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2V0dGluZyBrZXkgZHVyaW5nIHN1c3BlbmQhXG4iKTsKKwkJZGF0YS0+ZXJyb3IgPSB0cnVlOworCX0KKworCXN3aXRjaCAoa2V5LT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCWlmIChzdGEpIHsKKwkJCXRraXBfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy50a2lwLnVuaWNhc3RfcnNjOworCQkJdGtpcF90eF9zYyA9ICZkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy50a2lwLnRzYzsKKworCQkJcnhfcDFrcyA9IGRhdGEtPnRraXAtPnJ4X3VuaTsKKworCQkJaWVlZTgwMjExX2dldF9rZXlfdHhfc2VxKGtleSwgJnNlcSk7CisJCQl0a2lwX3R4X3NjLT5pdjE2ID0gY3B1X3RvX2xlMTYoc2VxLnRraXAuaXYxNik7CisJCQl0a2lwX3R4X3NjLT5pdjMyID0gY3B1X3RvX2xlMzIoc2VxLnRraXAuaXYzMik7CisKKwkJCWllZWU4MDIxMV9nZXRfdGtpcF9wMWtfaXYoa2V5LCBzZXEudGtpcC5pdjMyLCBwMWspOworCQkJaXdsYWduX2NvbnZlcnRfcDFrKHAxaywgZGF0YS0+dGtpcC0+dHgucDFrKTsKKworCQkJbWVtY3B5KGRhdGEtPnRraXAtPm1pY19rZXlzLnR4LAorCQkJICAgICAgICZrZXktPmtleVtOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfVFhfTUlDX0tFWV0sCisJCQkgICAgICAgSVdMQUdOX01JQ19LRVlfU0laRSk7CisKKwkJCXJ4X21pY19rZXkgPSBkYXRhLT50a2lwLT5taWNfa2V5cy5yeF91bmljYXN0OworCQl9IGVsc2UgeworCQkJdGtpcF9zYyA9CisJCQkJZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MudGtpcC5tdWx0aWNhc3RfcnNjOworCQkJcnhfcDFrcyA9IGRhdGEtPnRraXAtPnJ4X211bHRpOworCQkJcnhfbWljX2tleSA9IGRhdGEtPnRraXAtPm1pY19rZXlzLnJ4X21jYXN0OworCQl9CisKKwkJLyoKKwkJICogRm9yIG5vbi1Rb1MgdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBib3RoIHRoZSB1Q29kZSBhbmQKKwkJICogbWFjODAyMTEgdXNlIFRJRCAwIChhcyB0aGV5IG5lZWQgdG8gdG8gYXZvaWQgcmVwbGF5IGF0dGFja3MpCisJCSAqIGZvciBjaGVja2luZyB0aGUgSVYgaW4gdGhlIGZyYW1lcy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBJV0xBR05fTlVNX1JTQzsgaSsrKSB7CisJCQlpZWVlODAyMTFfZ2V0X2tleV9yeF9zZXEoa2V5LCBpLCAmc2VxKTsKKwkJCXRraXBfc2NbaV0uaXYxNiA9IGNwdV90b19sZTE2KHNlcS50a2lwLml2MTYpOworCQkJdGtpcF9zY1tpXS5pdjMyID0gY3B1X3RvX2xlMzIoc2VxLnRraXAuaXYzMik7CisJCQkvKiB3cmFwcGluZyBpc24ndCBhbGxvd2VkLCBBUCBtdXN0IHJla2V5ICovCisJCQlpZiAoc2VxLnRraXAuaXYzMiA+IGN1cl9yeF9pdjMyKQorCQkJCWN1cl9yeF9pdjMyID0gc2VxLnRraXAuaXYzMjsKKwkJfQorCisJCWllZWU4MDIxMV9nZXRfdGtpcF9yeF9wMWsoa2V5LCBkYXRhLT5ic3NpZCwgY3VyX3J4X2l2MzIsIHAxayk7CisJCWl3bGFnbl9jb252ZXJ0X3AxayhwMWssIHJ4X3Axa3NbMF0ucDFrKTsKKwkJaWVlZTgwMjExX2dldF90a2lwX3J4X3AxayhrZXksIGRhdGEtPmJzc2lkLAorCQkJCQkgIGN1cl9yeF9pdjMyICsgMSwgcDFrKTsKKwkJaXdsYWduX2NvbnZlcnRfcDFrKHAxaywgcnhfcDFrc1sxXS5wMWspOworCisJCW1lbWNweShyeF9taWNfa2V5LAorCQkgICAgICAgJmtleS0+a2V5W05MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9SWF9NSUNfS0VZXSwKKwkJICAgICAgIElXTEFHTl9NSUNfS0VZX1NJWkUpOworCisJCWRhdGEtPnVzZV90a2lwID0gdHJ1ZTsKKwkJZGF0YS0+dXNlX3JzY190c2MgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCWlmIChzdGEpIHsKKwkJCXU4ICpwbiA9IHNlcS5jY21wLnBuOworCisJCQlhZXNfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy5hZXMudW5pY2FzdF9yc2M7CisJCQlhZXNfdHhfc2MgPSAmZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MuYWVzLnRzYzsKKworCQkJaWVlZTgwMjExX2dldF9rZXlfdHhfc2VxKGtleSwgJnNlcSk7CisJCQlhZXNfdHhfc2MtPnBuID0gY3B1X3RvX2xlNjQoCisJCQkJCSh1NjQpcG5bNV0gfAorCQkJCQkoKHU2NClwbls0XSA8PCA4KSB8CisJCQkJCSgodTY0KXBuWzNdIDw8IDE2KSB8CisJCQkJCSgodTY0KXBuWzJdIDw8IDI0KSB8CisJCQkJCSgodTY0KXBuWzFdIDw8IDMyKSB8CisJCQkJCSgodTY0KXBuWzBdIDw8IDQwKSk7CisJCX0gZWxzZQorCQkJYWVzX3NjID0gZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MuYWVzLm11bHRpY2FzdF9yc2M7CisKKwkJLyoKKwkJICogRm9yIG5vbi1Rb1MgdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBib3RoIHRoZSB1Q29kZSBhbmQKKwkJICogbWFjODAyMTEgdXNlIFRJRCAwIGZvciBjaGVja2luZyB0aGUgSVYgaW4gdGhlIGZyYW1lcy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBJV0xBR05fTlVNX1JTQzsgaSsrKSB7CisJCQl1OCAqcG4gPSBzZXEuY2NtcC5wbjsKKworCQkJaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKGtleSwgaSwgJnNlcSk7CisJCQlhZXNfc2MtPnBuID0gY3B1X3RvX2xlNjQoCisJCQkJCSh1NjQpcG5bNV0gfAorCQkJCQkoKHU2NClwbls0XSA8PCA4KSB8CisJCQkJCSgodTY0KXBuWzNdIDw8IDE2KSB8CisJCQkJCSgodTY0KXBuWzJdIDw8IDI0KSB8CisJCQkJCSgodTY0KXBuWzFdIDw8IDMyKSB8CisJCQkJCSgodTY0KXBuWzBdIDw8IDQwKSk7CisJCX0KKwkJZGF0YS0+dXNlX3JzY190c2MgPSB0cnVlOworCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKK30KKworaW50IGl3bGFnbl9zZW5kX3BhdHRlcm5zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCXN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvd2xhbikKK3sKKwlzdHJ1Y3QgaXdsYWduX3dvd2xhbl9wYXR0ZXJuc19jbWQgKnBhdHRlcm5fY21kOworCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBSRVBMWV9XT1dMQU5fUEFUVEVSTlMsCisJCS5kYXRhZmxhZ3NbMF0gPSBJV0xfSENNRF9ERkxfTk9DT1BZLAorCQkuZmxhZ3MgPSBDTURfU1lOQywKKwl9OworCWludCBpLCBlcnI7CisKKwlpZiAoIXdvd2xhbi0+bl9wYXR0ZXJucykKKwkJcmV0dXJuIDA7CisKKwljbWQubGVuWzBdID0gc2l6ZW9mKCpwYXR0ZXJuX2NtZCkgKworCQl3b3dsYW4tPm5fcGF0dGVybnMgKiBzaXplb2Yoc3RydWN0IGl3bGFnbl93b3dsYW5fcGF0dGVybik7CisKKwlwYXR0ZXJuX2NtZCA9IGttYWxsb2MoY21kLmxlblswXSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXR0ZXJuX2NtZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwYXR0ZXJuX2NtZC0+bl9wYXR0ZXJucyA9IGNwdV90b19sZTMyKHdvd2xhbi0+bl9wYXR0ZXJucyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd293bGFuLT5uX3BhdHRlcm5zOyBpKyspIHsKKwkJaW50IG1hc2tfbGVuID0gRElWX1JPVU5EX1VQKHdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4sIDgpOworCisJCW1lbWNweSgmcGF0dGVybl9jbWQtPnBhdHRlcm5zW2ldLm1hc2ssCisJCQl3b3dsYW4tPnBhdHRlcm5zW2ldLm1hc2ssIG1hc2tfbGVuKTsKKwkJbWVtY3B5KCZwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ucGF0dGVybiwKKwkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybiwKKwkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4pOworCQlwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ubWFza19zaXplID0gbWFza19sZW47CisJCXBhdHRlcm5fY21kLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX3NpemUgPQorCQkJd293bGFuLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX2xlbjsKKwl9CisKKwljbWQuZGF0YVswXSA9IHBhdHRlcm5fY21kOworCWVyciA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJmNtZCk7CisJa2ZyZWUocGF0dGVybl9jbWQpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBpd2xhZ25fc3VzcGVuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pCit7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fd2FrZXVwX2ZpbHRlcl9jbWQgd2FrZXVwX2ZpbHRlcl9jbWQ7CisJc3RydWN0IGl3bF9yeG9uX2NtZCByeG9uOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CisJc3RydWN0IGl3bGFnbl93b3dsYW5fa2VrX2tja19tYXRlcmlhbF9jbWQga2VrX2tja19jbWQ7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fdGtpcF9wYXJhbXNfY21kIHRraXBfY21kID0ge307CisJc3RydWN0IGl3bGFnbl9kM19jb25maWdfY21kIGQzX2NmZ19jbWQgPSB7fTsKKwlzdHJ1Y3Qgd293bGFuX2tleV9kYXRhIGtleV9kYXRhID0geworCQkuY3R4ID0gY3R4LAorCQkuYnNzaWQgPSBjdHgtPmFjdGl2ZS5ic3NpZF9hZGRyLAorCQkudXNlX3JzY190c2MgPSBmYWxzZSwKKwkJLnRraXAgPSAmdGtpcF9jbWQsCisJCS51c2VfdGtpcCA9IGZhbHNlLAorCX07CisJaW50IHJldCwgaTsKKwl1MTYgc2VxOworCisJa2V5X2RhdGEucnNjX3RzYyA9IGt6YWxsb2Moc2l6ZW9mKCprZXlfZGF0YS5yc2NfdHNjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrZXlfZGF0YS5yc2NfdHNjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCgmd2FrZXVwX2ZpbHRlcl9jbWQsIDAsIHNpemVvZih3YWtldXBfZmlsdGVyX2NtZCkpOworCisJLyoKKwkgKiBXZSBrbm93IHRoZSBsYXN0IHVzZWQgc2Vxbm8sIGFuZCB0aGUgdUNvZGUgZXhwZWN0cyB0byBrbm93IHRoYXQKKwkgKiBvbmUsIGl0IHdpbGwgaW5jcmVtZW50IGJlZm9yZSBUWC4KKwkgKi8KKwlzZXEgPSBsZTE2X3RvX2NwdShwcml2LT5sYXN0X3NlcV9jdGwpICYgSUVFRTgwMjExX1NDVExfU0VROworCXdha2V1cF9maWx0ZXJfY21kLm5vbl9xb3Nfc2VxID0gY3B1X3RvX2xlMTYoc2VxKTsKKworCS8qCisJICogRm9yIFFvUyBjb3VudGVycywgd2Ugc3RvcmUgdGhlIG9uZSB0byB1c2UgbmV4dCwgc28gc3VidHJhY3QgMHgxMAorCSAqIHNpbmNlIHRoZSB1Q29kZSB3aWxsIGFkZCAweDEwIGJlZm9yZSB1c2luZyB0aGUgdmFsdWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlzZXEgPSBwcml2LT5zaHJkLT50aWRfZGF0YVtJV0xfQVBfSURdW2ldLnNlcV9udW1iZXI7CisJCXNlcSAtPSAweDEwOworCQl3YWtldXBfZmlsdGVyX2NtZC5xb3Nfc2VxW2ldID0gY3B1X3RvX2xlMTYoc2VxKTsKKwl9CisKKwlpZiAod293bGFuLT5kaXNjb25uZWN0KQorCQl3YWtldXBfZmlsdGVyX2NtZC5lbmFibGVkIHw9CisJCQljcHVfdG9fbGUzMihJV0xBR05fV09XTEFOX1dBS0VVUF9CRUFDT05fTUlTUyB8CisJCQkJICAgIElXTEFHTl9XT1dMQU5fV0FLRVVQX0xJTktfQ0hBTkdFKTsKKwlpZiAod293bGFuLT5tYWdpY19wa3QpCisJCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX01BR0lDX1BBQ0tFVCk7CisJaWYgKHdvd2xhbi0+Z3RrX3Jla2V5X2ZhaWx1cmUpCisJCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0dUS19SRUtFWV9GQUlMKTsKKwlpZiAod293bGFuLT5lYXBfaWRlbnRpdHlfcmVxKQorCQl3YWtldXBfZmlsdGVyX2NtZC5lbmFibGVkIHw9CisJCQljcHVfdG9fbGUzMihJV0xBR05fV09XTEFOX1dBS0VVUF9FQVBfSURFTlRfUkVRKTsKKwlpZiAod293bGFuLT5mb3VyX3dheV9oYW5kc2hha2UpCisJCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQXzRXQVlfSEFORFNIQUtFKTsKKwlpZiAod293bGFuLT5uX3BhdHRlcm5zKQorCQl3YWtldXBfZmlsdGVyX2NtZC5lbmFibGVkIHw9CisJCQljcHVfdG9fbGUzMihJV0xBR05fV09XTEFOX1dBS0VVUF9QQVRURVJOX01BVENIKTsKKworCWlmICh3b3dsYW4tPnJma2lsbF9yZWxlYXNlKQorCQlkM19jZmdfY21kLndha2V1cF9mbGFncyB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX0QzX1dBS0VVUF9SRktJTEwpOworCisJaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKKworCW1lbWNweSgmcnhvbiwgJmN0eC0+YWN0aXZlLCBzaXplb2YocnhvbikpOworCisJaXdsX3RyYW5zX3N0b3BfZGV2aWNlKHRyYW5zKHByaXYpKTsKKworCXByaXYtPnNocmQtPndvd2xhbiA9IHRydWU7CisKKwlyZXQgPSBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHByaXYsIElXTF9VQ09ERV9XT1dMQU4pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogbm93IGNvbmZpZ3VyZSBXb1dMQU4gdWNvZGUgKi8KKwlyZXQgPSBpd2xfYWxpdmVfc3RhcnQocHJpdik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwltZW1jcHkoJmN0eC0+c3RhZ2luZywgJnJ4b24sIHNpemVvZihyeG9uKSk7CisJcmV0ID0gaXdsYWduX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWl3bGFnbl9tb2RfcGFyYW1zLnN3X2NyeXB0bykgeworCQkvKiBtYXJrIGFsbCBrZXlzIGNsZWFyICovCisJCXByaXYtPnVjb2RlX2tleV90YWJsZSA9IDA7CisJCWN0eC0+a2V5X21hcHBpbmdfa2V5cyA9IDA7CisKKwkJLyoKKwkJICogVGhpcyBuZWVkcyB0byBiZSB1bmxvY2tlZCBkdWUgdG8gbG9jayBvcmRlcmluZworCQkgKiBjb25zdHJhaW50cy4gU2luY2Ugd2UncmUgaW4gdGhlIHN1c3BlbmQgcGF0aAorCQkgKiB0aGF0IGlzbid0IHJlYWxseSBhIHByb2JsZW0gdGhvdWdoLgorCQkgKi8KKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJCWllZWU4MDIxMV9pdGVyX2tleXMocHJpdi0+aHcsIGN0eC0+dmlmLAorCQkJCSAgICBpd2xhZ25fd293bGFuX3Byb2dyYW1fa2V5cywKKwkJCQkgICAgJmtleV9kYXRhKTsKKwkJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCQlpZiAoa2V5X2RhdGEuZXJyb3IpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChrZXlfZGF0YS51c2VfcnNjX3RzYykgeworCQkJc3RydWN0IGl3bF9ob3N0X2NtZCByc2NfdHNjX2NtZCA9IHsKKwkJCQkuaWQgPSBSRVBMWV9XT1dMQU5fVFNDX1JTQ19QQVJBTVMsCisJCQkJLmZsYWdzID0gQ01EX1NZTkMsCisJCQkJLmRhdGFbMF0gPSBrZXlfZGF0YS5yc2NfdHNjLAorCQkJCS5kYXRhZmxhZ3NbMF0gPSBJV0xfSENNRF9ERkxfTk9DT1BZLAorCQkJCS5sZW5bMF0gPSBzaXplb2Yoa2V5X2RhdGEucnNjX3RzYyksCisJCQl9OworCisJCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWQodHJhbnMocHJpdiksICZyc2NfdHNjX2NtZCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGtleV9kYXRhLnVzZV90a2lwKSB7CisJCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLAorCQkJCQkJIFJFUExZX1dPV0xBTl9US0lQX1BBUkFNUywKKwkJCQkJCSBDTURfU1lOQywgc2l6ZW9mKHRraXBfY21kKSwKKwkJCQkJCSAmdGtpcF9jbWQpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChwcml2LT5oYXZlX3Jla2V5X2RhdGEpIHsKKwkJCW1lbXNldCgma2VrX2tja19jbWQsIDAsIHNpemVvZihrZWtfa2NrX2NtZCkpOworCQkJbWVtY3B5KGtla19rY2tfY21kLmtjaywgcHJpdi0+a2NrLCBOTDgwMjExX0tDS19MRU4pOworCQkJa2VrX2tja19jbWQua2NrX2xlbiA9IGNwdV90b19sZTE2KE5MODAyMTFfS0NLX0xFTik7CisJCQltZW1jcHkoa2VrX2tja19jbWQua2VrLCBwcml2LT5rZWssIE5MODAyMTFfS0VLX0xFTik7CisJCQlrZWtfa2NrX2NtZC5rZWtfbGVuID0gY3B1X3RvX2xlMTYoTkw4MDIxMV9LRUtfTEVOKTsKKwkJCWtla19rY2tfY21kLnJlcGxheV9jdHIgPSBwcml2LT5yZXBsYXlfY3RyOworCisJCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLAorCQkJCQkJIFJFUExZX1dPV0xBTl9LRUtfS0NLX01BVEVSSUFMLAorCQkJCQkJIENNRF9TWU5DLCBzaXplb2Yoa2VrX2tja19jbWQpLAorCQkJCQkJICZrZWtfa2NrX2NtZCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucyhwcml2KSwgUkVQTFlfRDNfQ09ORklHLCBDTURfU1lOQywKKwkJCQkgICAgIHNpemVvZihkM19jZmdfY21kKSwgJmQzX2NmZ19jbWQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucyhwcml2KSwgUkVQTFlfV09XTEFOX1dBS0VVUF9GSUxURVIsCisJCQkJIENNRF9TWU5DLCBzaXplb2Yod2FrZXVwX2ZpbHRlcl9jbWQpLAorCQkJCSAmd2FrZXVwX2ZpbHRlcl9jbWQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaXdsYWduX3NlbmRfcGF0dGVybnMocHJpdiwgd293bGFuKTsKKyBvdXQ6CisJa2ZyZWUoa2V5X2RhdGEucnNjX3RzYyk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYwppbmRleCA2NjExOGNlLi4zNTljNDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYwpAQCAtMTQ1OCwxMCArMTQ1OCw4IEBACiAJCWJyZWFrOwogCWNhc2UgSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0xPVzoKIAkJLyogYXZvaWQgYW50ZW5uYSBCIHVubGVzcyBNSU1PICovCi0JCXZhbGlkX3R4X2FudCA9Ci0JCQlmaXJzdF9hbnRlbm5hKGh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQpOwogCQlpZiAodGJsLT5hY3Rpb24gPT0gSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTIpCi0JCQl0YmwtPmFjdGlvbiA9IElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOworCQkJdGJsLT5hY3Rpb24gPSBJV0xfTEVHQUNZX1NXSVRDSF9TSVNPOwogCQlicmVhazsKIAljYXNlIElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9ISUdIOgogCWNhc2UgSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0NPTlRJTlVPVVM6CkBAIC0xNjM2LDEwICsxNjM0LDggQEAKIAkJYnJlYWs7CiAJY2FzZSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfTE9XOgogCQkvKiBhdm9pZCBhbnRlbm5hIEIgdW5sZXNzIE1JTU8gKi8KLQkJdmFsaWRfdHhfYW50ID0KLQkJCWZpcnN0X2FudGVubmEoaHdfcGFyYW1zKHByaXYpLnZhbGlkX3R4X2FudCk7CiAJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQTIpCi0JCQl0YmwtPmFjdGlvbiA9IElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMTsKKwkJCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX01JTU8yX0FCOwogCQlicmVhazsKIAljYXNlIElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9ISUdIOgogCWNhc2UgSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0NPTlRJTlVPVVM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeC5jCmluZGV4IDVhZjllNjIuLjA4N2ZkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeC5jCkBAIC0xMTcsNiArMTE3LDcgQEAKIAkJSVdMX0NNRChSRVBMWV9XT1dMQU5fVEtJUF9QQVJBTVMpOwogCQlJV0xfQ01EKFJFUExZX1dPV0xBTl9LRUtfS0NLX01BVEVSSUFMKTsKIAkJSVdMX0NNRChSRVBMWV9XT1dMQU5fR0VUX1NUQVRVUyk7CisJCUlXTF9DTUQoUkVQTFlfRDNfQ09ORklHKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gIlVOS05PV04iOwogCkBAIC04MDAsNyArODAxLDggQEAKIAkJCQkJICAgICAgIGN0eC0+YWN0aXZlLmJzc2lkX2FkZHIpKQogCQkJCWNvbnRpbnVlOwogCQkJY3R4LT5sYXN0X3R4X3JlamVjdGVkID0gZmFsc2U7Ci0JCQlpd2xfdHJhbnNfd2FrZV9hbnlfcXVldWUodHJhbnMocHJpdiksIGN0eC0+Y3R4aWQpOworCQkJaXdsX3RyYW5zX3dha2VfYW55X3F1ZXVlKHRyYW5zKHByaXYpLCBjdHgtPmN0eGlkLAorCQkJCSJjaGFubmVsIGdvdCBhY3RpdmUiKTsKIAkJfQogCX0KIApAQCAtMTAzMiw2ICsxMDM0LDUwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaXdsYWduX3J4X25vYV9ub3RpZmljYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiLAorCQkJCSAgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKQoreworCXN0cnVjdCBpd2xfd2lwYW5fbm9hX2RhdGEgKm5ld19kYXRhLCAqb2xkX2RhdGE7CisJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGl3bF93aXBhbl9ub2Ffbm90aWZpY2F0aW9uICpub2Ffbm90aWYgPSAodm9pZCAqKXBrdC0+dS5yYXc7CisKKwkvKiBubyBjb25kaXRpb24gLS0gd2UncmUgaW4gc29mdGlycSAqLworCW9sZF9kYXRhID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcml2LT5ub2FfZGF0YSwgdHJ1ZSk7CisKKwlpZiAobm9hX25vdGlmLT5ub2FfYWN0aXZlKSB7CisJCXUzMiBsZW4gPSBsZTE2X3RvX2NwdShub2Ffbm90aWYtPm5vYV9hdHRyaWJ1dGUubGVuZ3RoKTsKKwkJdTMyIGNvcHlsZW4gPSBsZW47CisKKwkJLyogRUlELCBsZW4sIE9VSSwgc3VidHlwZSAqLworCQlsZW4gKz0gMSArIDEgKyAzICsgMTsKKwkJLyogUDJQIGlkLCBQMlAgbGVuZ3RoICovCisJCWxlbiArPSAxICsgMjsKKwkJY29weWxlbiArPSAxICsgMjsKKworCQluZXdfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfZGF0YSkgKyBsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAobmV3X2RhdGEpIHsKKwkJCW5ld19kYXRhLT5sZW5ndGggPSBsZW47CisJCQluZXdfZGF0YS0+ZGF0YVswXSA9IFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzsKKwkJCW5ld19kYXRhLT5kYXRhWzFdID0gbGVuIC0gMjsgLyogbm90IGNvdW50aW5nIEVJRCwgbGVuICovCisJCQluZXdfZGF0YS0+ZGF0YVsyXSA9IChXTEFOX09VSV9XRkEgPj4gMTYpICYgMHhmZjsKKwkJCW5ld19kYXRhLT5kYXRhWzNdID0gKFdMQU5fT1VJX1dGQSA+PiA4KSAmIDB4ZmY7CisJCQluZXdfZGF0YS0+ZGF0YVs0XSA9IChXTEFOX09VSV9XRkEgPj4gMCkgJiAweGZmOworCQkJbmV3X2RhdGEtPmRhdGFbNV0gPSBXTEFOX09VSV9UWVBFX1dGQV9QMlA7CisJCQltZW1jcHkoJm5ld19kYXRhLT5kYXRhWzZdLCAmbm9hX25vdGlmLT5ub2FfYXR0cmlidXRlLAorCQkJICAgICAgIGNvcHlsZW4pOworCQl9CisJfSBlbHNlCisJCW5ld19kYXRhID0gTlVMTDsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihwcml2LT5ub2FfZGF0YSwgbmV3X2RhdGEpOworCisJaWYgKG9sZF9kYXRhKQorCQlrZnJlZV9yY3Uob2xkX2RhdGEsIHJjdV9oZWFkKTsKKworCXJldHVybiAwOworfQorCiAvKioKICAqIGl3bF9zZXR1cF9yeF9oYW5kbGVycyAtIEluaXRpYWxpemUgUnggaGFuZGxlciBjYWxsYmFja3MKICAqCkBAIC0xMDU1LDYgKzExMDEsOCBAQAogCWhhbmRsZXJzW0JFQUNPTl9OT1RJRklDQVRJT05dCQk9IGl3bGFnbl9yeF9iZWFjb25fbm90aWY7CiAJaGFuZGxlcnNbUkVQTFlfQUREX1NUQV0JCQk9IGl3bF9hZGRfc3RhX2NhbGxiYWNrOwogCisJaGFuZGxlcnNbUkVQTFlfV0lQQU5fTk9BX05PVElGSUNBVElPTl0JPSBpd2xhZ25fcnhfbm9hX25vdGlmaWNhdGlvbjsKKwogCS8qCiAJICogVGhlIHNhbWUgaGFuZGxlciBpcyB1c2VkIGZvciBib3RoIHRoZSBSRVBMWSB0byBhIGRpc2NyZXRlCiAJICogc3RhdGlzdGljcyByZXF1ZXN0IGZyb20gdGhlIGhvc3QgYXMgd2VsbCBhcyBmb3IgdGhlIHBlcmlvZGljCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnhvbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYwppbmRleCBhN2E2ZGVmLi4wMGIzODcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnhvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeG9uLmMKQEAgLTQ1LDcgKzQ1LDggQEAKIAlzZW5kLT5maWx0ZXJfZmxhZ3MgPSBvbGRfZmlsdGVyOwogCiAJaWYgKHJldCkKLQkJSVdMX0VSUihwcml2LCAiRXJyb3IgY2xlYXJpbmcgQVNTT0NfTVNLIG9uIEJTUyAoJWQpXG4iLCByZXQpOworCQlJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHByaXYsCisJCQkiRXJyb3IgY2xlYXJpbmcgQVNTT0NfTVNLIG9uIEJTUyAoJWQpXG4iLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTExNiw3ICsxMTcsNyBAQAogCWlmIChjdHgtPmh0LmVuYWJsZWQpCiAJCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyB8PSBRT1NfUEFSQU1fRkxHX1RHTl9NU0s7CiAKLQlJV0xfREVCVUdfUU9TKHByaXYsICJzZW5kIFFvUyBjbWQgd2l0aCBRb3MgYWN0aXZlPSVkIEZMQUdTPTB4JVhcbiIsCisJSVdMX0RFQlVHX0lORk8ocHJpdiwgInNlbmQgUW9TIGNtZCB3aXRoIFFvcyBhY3RpdmU9JWQgRkxBR1M9MHglWFxuIiwKIAkJICAgICAgY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlLAogCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MpOwogCkBAIC0xMjQsNyArMTI1LDcgQEAKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9xb3NwYXJhbV9jbWQpLAogCQkJICAgICAgICZjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybSk7CiAJaWYgKHJldCkKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHVwZGF0ZSBRb1NcbiIpOworCQlJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHByaXYsICJGYWlsZWQgdG8gdXBkYXRlIFFvU1xuIik7CiB9CiAKIHN0YXRpYyBpbnQgaXdsYWduX3VwZGF0ZV9iZWFjb24oc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtNTU5LDYgKzU2MCw5IEBACiAKIAltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CiAKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCiAJaWYgKHVubGlrZWx5KHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnNocmQtPnN0YXR1cykpKSB7CiAJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBzY2FubmluZ1xuIik7CiAJCWdvdG8gb3V0OwpAQCAtODUwLDcgKzg1NCw4IEBACiAJCQlpZiAoY3R4LT5sYXN0X3R4X3JlamVjdGVkKSB7CiAJCQkJY3R4LT5sYXN0X3R4X3JlamVjdGVkID0gZmFsc2U7CiAJCQkJaXdsX3RyYW5zX3dha2VfYW55X3F1ZXVlKHRyYW5zKHByaXYpLAotCQkJCQkJCSBjdHgtPmN0eGlkKTsKKwkJCQkJCQkgY3R4LT5jdHhpZCwKKwkJCQkJCQkgIkRpc2Fzc29jOiBmbHVzaCBxdWV1ZSIpOwogCQkJfQogCQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tc3RhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tc3RhLmMKaW5kZXggNGIyYWExZC4uNjI2ZWQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXN0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1zdGEuYwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgc3RhX2NtZDsKIAlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgbHE7Ci0JYm9vbCBhY3RpdmU7CisJYm9vbCBhY3RpdmUsIGhhdmVfbHEgPSBmYWxzZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwogCWlmICghKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkpIHsKQEAgLTY1Nyw3ICs2NTcsMTAgQEAKIAogCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBzaXplb2Yoc3RhX2NtZCkpOwogCXN0YV9jbWQubW9kZSA9IDA7Ci0JbWVtY3B5KCZscSwgcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSwgc2l6ZW9mKGxxKSk7CisJaWYgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEpIHsKKwkJbWVtY3B5KCZscSwgcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSwgc2l6ZW9mKGxxKSk7CisJCWhhdmVfbHEgPSB0cnVlOworCX0KIAogCWFjdGl2ZSA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfVUNPREVfQUNUSVZFOwogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9EUklWRVJfQUNUSVZFOwpAQCAtNjc5LDcgKzY4Miw4IEBACiAJaWYgKHJldCkKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHJlLWFkZCBTVEEgJXBNICglZClcbiIsCiAJCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkciwgcmV0KTsKLQlpd2xfc2VuZF9scV9jbWQocHJpdiwgY3R4LCAmbHEsIENNRF9TWU5DLCB0cnVlKTsKKwlpZiAoaGF2ZV9scSkKKwkJaXdsX3NlbmRfbHFfY21kKHByaXYsIGN0eCwgJmxxLCBDTURfU1lOQywgdHJ1ZSk7CiB9CiAKIGludCBpd2xfZ2V0X2ZyZWVfdWNvZGVfa2V5X29mZnNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCkBAIC04MjUsMjggKzgyOSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGl3bGFnbl9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlpbnQgcmV0OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlcjogcmVjZWl2ZWQgcmVxdWVzdCB0byByZW1vdmUgIgotCQkJICAgInN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byByZW1vdmUgc3RhdGlvbiAlcE1cbiIsCi0JCQlzdGEtPmFkZHIpOwotCXJldCA9IGl3bF9yZW1vdmVfc3RhdGlvbihwcml2LCBzdGFfcHJpdi0+c3RhX2lkLCBzdGEtPmFkZHIpOwotCWlmIChyZXQpCi0JCUlXTF9FUlIocHJpdiwgIkVycm9yIHJlbW92aW5nIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiByZXQ7Ci19CiAKIHZvaWQgaXdsX3N0YV9maWxsX2xxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKIAkJICAgICB1OCBzdGFfaWQsIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQpCkBAIC0xNDU5LDIwICsxNDQxLDcgQEAKIAlyZXR1cm4gaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwogfQogCi1zdGF0aWMgdm9pZCBpd2xfc3RhX21vZGlmeV9wc193YWtlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHN0YV9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFncyAmPSB+U1RBX0ZMR19QV1JfU0FWRV9NU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSBTVEFfRkxHX1BXUl9TQVZFX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSAwOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnNsZWVwX3R4X2NvdW50ID0gMDsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQlpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwotCi19CiAKIHZvaWQgaXdsX3N0YV9tb2RpZnlfc2xlZXBfdHhfY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgY250KQogewpAQCAtMTQ4OSwzNiArMTQ1OCwzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKIAogfQotCi12b2lkIGl3bGFnbl9tYWNfc3RhX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICBlbnVtIHN0YV9ub3RpZnlfY21kIGNtZCwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OwotCWludCBzdGFfaWQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTVEFfTk9USUZZX1NMRUVQOgotCQlXQVJOX09OKCFzdGFfcHJpdi0+Y2xpZW50KTsKLQkJc3RhX3ByaXYtPmFzbGVlcCA9IHRydWU7Ci0JCWlmIChhdG9taWNfcmVhZCgmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzKSA+IDApCi0JCQlpZWVlODAyMTFfc3RhX2Jsb2NrX2F3YWtlKGh3LCBzdGEsIHRydWUpOwotCQlicmVhazsKLQljYXNlIFNUQV9OT1RJRllfQVdBS0U6Ci0JCVdBUk5fT04oIXN0YV9wcml2LT5jbGllbnQpOwotCQlpZiAoIXN0YV9wcml2LT5hc2xlZXApCi0JCQlicmVhazsKLQkJc3RhX3ByaXYtPmFzbGVlcCA9IGZhbHNlOwotCQlzdGFfaWQgPSBpd2xfc3RhX2lkKHN0YSk7Ci0JCWlmIChzdGFfaWQgIT0gSVdMX0lOVkFMSURfU1RBVElPTikKLQkJCWl3bF9zdGFfbW9kaWZ5X3BzX3dha2UocHJpdiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXR4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYwppbmRleCAzNWE2YjcxLi5hMWE5NWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYwpAQCAtMjgzLDYgKzI4MywxOSBAQAogCQlJV0xfREVCVUdfVFgocHJpdiwgIlNlbmRpbmcgUkVBU1NPQyBmcmFtZVxuIik7CiAjZW5kaWYKIAorCWlmICh1bmxpa2VseShpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpKSB7CisJCXN0cnVjdCBpd2xfd2lwYW5fbm9hX2RhdGEgKm5vYV9kYXRhID0KKwkJCXJjdV9kZXJlZmVyZW5jZShwcml2LT5ub2FfZGF0YSk7CisKKwkJaWYgKG5vYV9kYXRhICYmCisJCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgbm9hX2RhdGEtPmxlbmd0aCwKKwkJCQkgICAgIEdGUF9BVE9NSUMpID09IDApIHsKKwkJCW1lbWNweShza2JfcHV0KHNrYiwgbm9hX2RhdGEtPmxlbmd0aCksCisJCQkgICAgICAgbm9hX2RhdGEtPmRhdGEsIG5vYV9kYXRhLT5sZW5ndGgpOworCQkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCQl9CisJfQorCiAJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOwogCiAJLyogRm9yIG1hbmFnZW1lbnQgZnJhbWVzIHVzZSBicm9hZGNhc3QgaWQgdG8gZG8gbm90IGJyZWFrIGFnZ3JlZ2F0aW9uICovCkBAIC03NzcsNiArNzkwLDcgQEAKIAkJaXdsX3J4X3JlcGx5X3R4X2FnZyhwcml2LCB0eF9yZXNwKTsKIAogCWlmICh0eF9yZXNwLT5mcmFtZV9jb3VudCA9PSAxKSB7CisJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiUSAlZCwgc3NuICVkIiwgdHhxX2lkLCBzc24pOwogCQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnNrYnMpOwogCQkvKndlIGNhbiBmcmVlIHVudGlsIHNzbiAlIHEubl9iZCBub3QgaW5jbHVzaXZlICovCiAJCWl3bF90cmFuc19yZWNsYWltKHRyYW5zKHByaXYpLCBzdGFfaWQsIHRpZCwgdHhxX2lkLApAQCAtODAwLDcgKzgxNCw4IEBACiAJCQkgICAgaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkgJiYgY3R4LT52aWYgJiYKIAkJCSAgICBjdHgtPnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CiAJCQkJY3R4LT5sYXN0X3R4X3JlamVjdGVkID0gdHJ1ZTsKLQkJCQlpd2xfdHJhbnNfc3RvcF9xdWV1ZSh0cmFucyhwcml2KSwgdHhxX2lkKTsKKwkJCQlpd2xfdHJhbnNfc3RvcF9xdWV1ZSh0cmFucyhwcml2KSwgdHhxX2lkLAorCQkJCQkiVHggb24gcGFzc2l2ZSBjaGFubmVsIik7CiAKIAkJCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwKIAkJCQkJICAgIlRYUSAlZCBzdGF0dXMgJXMgKDB4JTA4eCkgIgpAQCAtOTA2LDExICs5MjEsOSBAQAogCQkJICAgYmFfcmVzcC0+c3RhX2lkKTsKIAlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIlRJRCA9ICVkLCBTZXFDdGwgPSAlZCwgYml0bWFwID0gMHglbGx4LCAiCiAJCQkgICAic2NkX2Zsb3cgPSAlZCwgc2NkX3NzbiA9ICVkXG4iLAotCQkJICAgYmFfcmVzcC0+dGlkLAotCQkJICAgYmFfcmVzcC0+c2VxX2N0bCwKKwkJCSAgIGJhX3Jlc3AtPnRpZCwgYmFfcmVzcC0+c2VxX2N0bCwKIAkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYmFfcmVzcC0+Yml0bWFwKSwKLQkJCSAgIGJhX3Jlc3AtPnNjZF9mbG93LAotCQkJICAgYmFfcmVzcC0+c2NkX3Nzbik7CisJCQkgICBzY2RfZmxvdywgYmFfcmVzcF9zY2Rfc3NuKTsKIAogCS8qIE1hcmsgdGhhdCB0aGUgZXhwZWN0ZWQgYmxvY2stYWNrIHJlc3BvbnNlIGFycml2ZWQgKi8KIAlhZ2ctPndhaXRfZm9yX2JhID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdWNvZGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi11Y29kZS5jCmluZGV4IDhiYTBkZDUuLjc2OTQ5MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi11Y29kZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi11Y29kZS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgIml3bC1kZXYuaCIKICNpbmNsdWRlICJpd2wtY29yZS5oIgpAQCAtNzIsNTEgKzczLDk4IEBACiAJe0NPRVhfQ1VfUlNSVkQyX1JQLCBDT0VYX0NVX1JTUlZEMl9XUCwgMCwgQ09FWF9SU1JWRDJfRkxBR1N9CiB9OwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdUNvZGUgZG93bmxvYWQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgaXdsX2ZyZWVfZndfZGVzYyhzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBzdHJ1Y3QgZndfZGVzYyAqZGVzYykKK3sKKwlpZiAoZGVzYy0+dl9hZGRyKQorCQlkbWFfZnJlZV9jb2hlcmVudChidXMtPmRldiwgZGVzYy0+bGVuLAorCQkJCSAgZGVzYy0+dl9hZGRyLCBkZXNjLT5wX2FkZHIpOworCWRlc2MtPnZfYWRkciA9IE5VTEw7CisJZGVzYy0+bGVuID0gMDsKK30KKworc3RhdGljIHZvaWQgaXdsX2ZyZWVfZndfaW1nKHN0cnVjdCBpd2xfYnVzICpidXMsIHN0cnVjdCBmd19pbWcgKmltZykKK3sKKwlpd2xfZnJlZV9md19kZXNjKGJ1cywgJmltZy0+Y29kZSk7CisJaXdsX2ZyZWVfZndfZGVzYyhidXMsICZpbWctPmRhdGEpOworfQorCit2b2lkIGl3bF9kZWFsbG9jX3Vjb2RlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCWl3bF9mcmVlX2Z3X2ltZyhidXModHJhbnMpLCAmdHJhbnMtPnVjb2RlX3J0KTsKKwlpd2xfZnJlZV9md19pbWcoYnVzKHRyYW5zKSwgJnRyYW5zLT51Y29kZV9pbml0KTsKKwlpd2xfZnJlZV9md19pbWcoYnVzKHRyYW5zKSwgJnRyYW5zLT51Y29kZV93b3dsYW4pOworfQorCitpbnQgaXdsX2FsbG9jX2Z3X2Rlc2Moc3RydWN0IGl3bF9idXMgKmJ1cywgc3RydWN0IGZ3X2Rlc2MgKmRlc2MsCisJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJaWYgKCFsZW4pIHsKKwkJZGVzYy0+dl9hZGRyID0gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGVzYy0+dl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGJ1cy0+ZGV2LCBsZW4sCisJCQkJCSAgJmRlc2MtPnBfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXNjLT52X2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVzYy0+bGVuID0gbGVuOworCW1lbWNweShkZXNjLT52X2FkZHIsIGRhdGEsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiB1Y29kZQogICovCi1zdGF0aWMgaW50IGl3bGFnbl9sb2FkX3NlY3Rpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCBjaGFyICpuYW1lLAorc3RhdGljIGludCBpd2xhZ25fbG9hZF9zZWN0aW9uKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBjb25zdCBjaGFyICpuYW1lLAogCQkJCXN0cnVjdCBmd19kZXNjICppbWFnZSwgdTMyIGRzdF9hZGRyKQogeworCXN0cnVjdCBpd2xfYnVzICpidXMgPSBidXModHJhbnMpOwogCWRtYV9hZGRyX3QgcGh5X2FkZHIgPSBpbWFnZS0+cF9hZGRyOwogCXUzMiBieXRlX2NudCA9IGltYWdlLT5sZW47CiAJaW50IHJldDsKIAotCXByaXYtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMDsKKwl0cmFucy0+dWNvZGVfd3JpdGVfY29tcGxldGUgPSAwOwogCi0JaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwKKwlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzLAogCQlGSF9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhGSF9TUlZDX0NITkwpLAogCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX1BBVVNFKTsKIAotCWl3bF93cml0ZV9kaXJlY3QzMihidXMocHJpdiksCisJaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cywKIAkJRkhfU1JWQ19DSE5MX1NSQU1fQUREUl9SRUcoRkhfU1JWQ19DSE5MKSwgZHN0X2FkZHIpOwogCi0JaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwKKwlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzLAogCQlGSF9URkRJQl9DVFJMMF9SRUcoRkhfU1JWQ19DSE5MKSwKIAkJcGh5X2FkZHIgJiBGSF9NRU1fVEZESUJfRFJBTV9BRERSX0xTQl9NU0spOwogCi0JaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwKKwlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzLAogCQlGSF9URkRJQl9DVFJMMV9SRUcoRkhfU1JWQ19DSE5MKSwKIAkJKGl3bF9nZXRfZG1hX2hpX2FkZHIocGh5X2FkZHIpCiAJCQk8PCBGSF9NRU1fVEZESUJfUkVHMV9BRERSX0JJVFNISUZUKSB8IGJ5dGVfY250KTsKIAotCWl3bF93cml0ZV9kaXJlY3QzMihidXMocHJpdiksCisJaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cywKIAkJRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHKEZIX1NSVkNfQ0hOTCksCiAJCTEgPDwgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1BPU19UQl9OVU0gfAogCQkxIDw8IEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19QT1NfVEJfSURYIHwKIAkJRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX1ZBTElEKTsKIAotCWl3bF93cml0ZV9kaXJlY3QzMihidXMocHJpdiksCisJaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cywKIAkJRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoRkhfU1JWQ19DSE5MKSwKIAkJRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUJfAogCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRElTQUJMRQl8CiAJCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9IT1NUX0VORFRGRCk7CiAKLQlJV0xfREVCVUdfRlcocHJpdiwgIiVzIHVDb2RlIHNlY3Rpb24gYmVpbmcgbG9hZGVkLi4uXG4iLCBuYW1lKTsKLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocHJpdi0+c2hyZC0+d2FpdF9jb21tYW5kX3F1ZXVlLAotCQkJCSBwcml2LT51Y29kZV93cml0ZV9jb21wbGV0ZSwgNSAqIEhaKTsKKwlJV0xfREVCVUdfRlcoYnVzLCAiJXMgdUNvZGUgc2VjdGlvbiBiZWluZyBsb2FkZWQuLi5cbiIsIG5hbWUpOworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0cmFucy0+c2hyZC0+d2FpdF9jb21tYW5kX3F1ZXVlLAorCQkJCSB0cmFucy0+dWNvZGVfd3JpdGVfY29tcGxldGUsIDUgKiBIWik7CiAJaWYgKCFyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IGxvYWQgdGhlICVzIHVDb2RlIHNlY3Rpb25cbiIsCisJCUlXTF9FUlIodHJhbnMsICJDb3VsZCBub3QgbG9hZCB0aGUgJXMgdUNvZGUgc2VjdGlvblxuIiwKIAkJCW5hbWUpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CkBAIC0xMjQsMTcgKzE3Miw0MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGl3bGFnbl9sb2FkX2dpdmVuX3Vjb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgZndfaW1nICppbWFnZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZ3X2ltZyAqaXdsX2dldF91Y29kZV9pbWFnZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKKwkJCQkJZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQoreworCXN3aXRjaCAodWNvZGVfdHlwZSkgeworCWNhc2UgSVdMX1VDT0RFX0lOSVQ6CisJCXJldHVybiAmdHJhbnMtPnVjb2RlX2luaXQ7CisJY2FzZSBJV0xfVUNPREVfV09XTEFOOgorCQlyZXR1cm4gJnRyYW5zLT51Y29kZV93b3dsYW47CisJY2FzZSBJV0xfVUNPREVfUkVHVUxBUjoKKwkJcmV0dXJuICZ0cmFucy0+dWNvZGVfcnQ7CisJY2FzZSBJV0xfVUNPREVfTk9ORToKKwkJYnJlYWs7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9sb2FkX2dpdmVuX3Vjb2RlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCSAgIGVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSkKIHsKIAlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZndfaW1nICppbWFnZSA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UodHJhbnMsIHVjb2RlX3R5cGUpOwogCi0JcmV0ID0gaXdsYWduX2xvYWRfc2VjdGlvbihwcml2LCAiSU5TVCIsICZpbWFnZS0+Y29kZSwKKworCWlmICghaW1hZ2UpIHsKKwkJSVdMX0VSUih0cmFucywgIkludmFsaWQgdWNvZGUgcmVxdWVzdGVkICglZClcbiIsCisJCQl1Y29kZV90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gaXdsYWduX2xvYWRfc2VjdGlvbih0cmFucywgIklOU1QiLCAmaW1hZ2UtPmNvZGUsCiAJCQkJICAgSVdMQUdOX1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIGl3bGFnbl9sb2FkX3NlY3Rpb24ocHJpdiwgIkRBVEEiLCAmaW1hZ2UtPmRhdGEsCisJcmV0dXJuIGl3bGFnbl9sb2FkX3NlY3Rpb24odHJhbnMsICJEQVRBIiwgJmltYWdlLT5kYXRhLAogCQkJCSAgICBJV0xBR05fUlRDX0RBVEFfTE9XRVJfQk9VTkQpOwogfQogCkBAIC0xNTAsOCArMjIyLDcgQEAKIAlpd2xfc2V0X2NhbGliX2hkcigmY21kLmhkciwgSVdMX1BIWV9DQUxJQlJBVEVfQ1JZU1RBTF9GUlFfQ01EKTsKIAljbWQuY2FwX3BpbjEgPSBsZTE2X3RvX2NwdSh4dGFsX2NhbGliWzBdKTsKIAljbWQuY2FwX3BpbjIgPSBsZTE2X3RvX2NwdSh4dGFsX2NhbGliWzFdKTsKLQlyZXR1cm4gaXdsX2NhbGliX3NldCgmcHJpdi0+Y2FsaWJfcmVzdWx0c1tJV0xfQ0FMSUJfWFRBTF0sCi0JCQkgICAgICh1OCAqKSZjbWQsIHNpemVvZihjbWQpKTsKKwlyZXR1cm4gaXdsX2NhbGliX3NldChwcml2LCAodm9pZCAqKSZjbWQsIHNpemVvZihjbWQpKTsKIH0KIAogc3RhdGljIGludCBpd2xhZ25fc2V0X3RlbXBlcmF0dXJlX29mZnNldF9jYWxpYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCkBAIC0xNjgsOCArMjM5LDcgQEAKIAogCUlXTF9ERUJVR19DQUxJQihwcml2LCAiUmFkaW8gc2Vuc29yIG9mZnNldDogJWRcbiIsCiAJCQlsZTE2X3RvX2NwdShjbWQucmFkaW9fc2Vuc29yX29mZnNldCkpOwotCXJldHVybiBpd2xfY2FsaWJfc2V0KCZwcml2LT5jYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9URU1QX09GRlNFVF0sCi0JCQkgICAgICh1OCAqKSZjbWQsIHNpemVvZihjbWQpKTsKKwlyZXR1cm4gaXdsX2NhbGliX3NldChwcml2LCAodm9pZCAqKSZjbWQsIHNpemVvZihjbWQpKTsKIH0KIAogc3RhdGljIGludCBpd2xhZ25fc2V0X3RlbXBlcmF0dXJlX29mZnNldF9jYWxpYl92MihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCkBAIC0yMDQsOCArMjc0LDcgQEAKIAlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlZvbHRhZ2UgUmVmOiAlZFxuIiwKIAkJCWxlMTZfdG9fY3B1KGNtZC5idXJudFZvbHRhZ2VSZWYpKTsKIAotCXJldHVybiBpd2xfY2FsaWJfc2V0KCZwcml2LT5jYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9URU1QX09GRlNFVF0sCi0JCQkgICAgICh1OCAqKSZjbWQsIHNpemVvZihjbWQpKTsKKwlyZXR1cm4gaXdsX2NhbGliX3NldChwcml2LCAodm9pZCAqKSZjbWQsIHNpemVvZihjbWQpKTsKIH0KIAogc3RhdGljIGludCBpd2xhZ25fc2VuZF9jYWxpYl9jZmcoc3RydWN0IGl3bF9wcml2ICpwcml2KQpAQCAtMjM0LDM3ICszMDMsMTQgQEAKIAlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKIAlzdHJ1Y3QgaXdsX2NhbGliX2hkciAqaGRyID0gKHN0cnVjdCBpd2xfY2FsaWJfaGRyICopcGt0LT51LnJhdzsKIAlpbnQgbGVuID0gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSzsKLQlpbnQgaW5kZXg7CiAKIAkvKiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYgKi8KIAlsZW4gLT0gNDsKIAotCS8qIERlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHJlc3VsdHMgd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lCi0JICogdUNvZGUuIGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMgc2VuZHMgdGhlbSBpbiBhIHJvdyBhY2NvcmRpbmcgdG8KLQkgKiB0aGVpciBpbmRleC4gV2Ugc29ydCB0aGVtIGhlcmUKLQkgKi8KLQlzd2l0Y2ggKGhkci0+b3BfY29kZSkgewotCWNhc2UgSVdMX1BIWV9DQUxJQlJBVEVfRENfQ01EOgotCQlpbmRleCA9IElXTF9DQUxJQl9EQzsKLQkJYnJlYWs7Ci0JY2FzZSBJV0xfUEhZX0NBTElCUkFURV9MT19DTUQ6Ci0JCWluZGV4ID0gSVdMX0NBTElCX0xPOwotCQlicmVhazsKLQljYXNlIElXTF9QSFlfQ0FMSUJSQVRFX1RYX0lRX0NNRDoKLQkJaW5kZXggPSBJV0xfQ0FMSUJfVFhfSVE7Ci0JCWJyZWFrOwotCWNhc2UgSVdMX1BIWV9DQUxJQlJBVEVfVFhfSVFfUEVSRF9DTUQ6Ci0JCWluZGV4ID0gSVdMX0NBTElCX1RYX0lRX1BFUkQ7Ci0JCWJyZWFrOwotCWNhc2UgSVdMX1BIWV9DQUxJQlJBVEVfQkFTRV9CQU5EX0NNRDoKLQkJaW5kZXggPSBJV0xfQ0FMSUJfQkFTRV9CQU5EOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJVbmtub3duIGNhbGlicmF0aW9uIG5vdGlmaWNhdGlvbiAlZFxuIiwKLQkJCSAgaGRyLT5vcF9jb2RlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpd2xfY2FsaWJfc2V0KCZwcml2LT5jYWxpYl9yZXN1bHRzW2luZGV4XSwgcGt0LT51LnJhdywgbGVuKTsKKwlpZiAoaXdsX2NhbGliX3NldChwcml2LCBoZHIsIGxlbikpCisJCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZWNvcmQgY2FsaWJyYXRpb24gZGF0YSAlZFxuIiwKKwkJCWhkci0+b3BfY29kZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDA1LDkgKzQ1MSwxMSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpd2xhZ25fc2V0X1h0YWxfY2FsaWIocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpZiAoIXByaXYtPmNmZy0+bm9feHRhbF9jYWxpYikgeworCQlyZXQgPSBpd2xhZ25fc2V0X1h0YWxfY2FsaWIocHJpdik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHByaXYpOwogfQpAQCAtNDE4LDcgKzQ2Niw3IEBACiAgKiAgIHVzaW5nIHNhbXBsZSBkYXRhIDEwMCBieXRlcyBhcGFydC4gIElmIHRoZXNlIHNhbXBsZSBwb2ludHMgYXJlIGdvb2QsCiAgKiAgIGl0J3MgYSBwcmV0dHkgZ29vZCBiZXQgdGhhdCBldmVyeXRoaW5nIGJldHdlZW4gdGhlbSBpcyBnb29kLCB0b28uCiAgKi8KLXN0YXRpYyBpbnQgaXdsX3ZlcmlmeV9pbnN0X3NwYXJzZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCitzdGF0aWMgaW50IGl3bF92ZXJpZnlfaW5zdF9zcGFyc2Uoc3RydWN0IGl3bF9idXMgKmJ1cywKIAkJCQkgICAgICBzdHJ1Y3QgZndfZGVzYyAqZndfZGVzYykKIHsKIAlfX2xlMzIgKmltYWdlID0gKF9fbGUzMiAqKWZ3X2Rlc2MtPnZfYWRkcjsKQEAgLTQyNiwxNSArNDc0LDE1IEBACiAJdTMyIHZhbDsKIAl1MzIgaTsKIAotCUlXTF9ERUJVR19GVyhwcml2LCAidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOworCUlXTF9ERUJVR19GVyhidXMsICJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDEwMCwgaW1hZ2UgKz0gMTAwL3NpemVvZih1MzIpKSB7CiAJCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLwogCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKIAkJICogaWYgSVdMX0RMX0lPIGlzIHNldCAqLwotCQlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzKHByaXYpLCBIQlVTX1RBUkdfTUVNX1JBRERSLAorCQlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzLCBIQlVTX1RBUkdfTUVNX1JBRERSLAogCQkJaSArIElXTEFHTl9SVENfSU5TVF9MT1dFUl9CT1VORCk7Ci0JCXZhbCA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCQl2YWwgPSBpd2xfcmVhZDMyKGJ1cywgSEJVU19UQVJHX01FTV9SREFUKTsKIAkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKQogCQkJcmV0dXJuIC1FSU87CiAJfQpAQCAtNDQyLDcgKzQ5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bF9wcmludF9taXNtYXRjaF9pbnN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKK3N0YXRpYyB2b2lkIGl3bF9wcmludF9taXNtYXRjaF9pbnN0KHN0cnVjdCBpd2xfYnVzICpidXMsCiAJCQkJICAgIHN0cnVjdCBmd19kZXNjICpmd19kZXNjKQogewogCV9fbGUzMiAqaW1hZ2UgPSAoX19sZTMyICopZndfZGVzYy0+dl9hZGRyOwpAQCAtNDUxLDE4ICs0OTksMTggQEAKIAl1MzIgb2ZmczsKIAlpbnQgZXJyb3JzID0gMDsKIAotCUlXTF9ERUJVR19GVyhwcml2LCAidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOworCUlXTF9ERUJVR19GVyhidXMsICJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7CiAKLQlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzKHByaXYpLCBIQlVTX1RBUkdfTUVNX1JBRERSLAorCWl3bF93cml0ZV9kaXJlY3QzMihidXMsIEhCVVNfVEFSR19NRU1fUkFERFIsCiAJCQkgICBJV0xBR05fUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwogCiAJZm9yIChvZmZzID0gMDsKIAkgICAgIG9mZnMgPCBsZW4gJiYgZXJyb3JzIDwgMjA7CiAJICAgICBvZmZzICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7CiAJCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLwotCQl2YWwgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SREFUKTsKKwkJdmFsID0gaXdsX3JlYWQzMihidXMsIEhCVVNfVEFSR19NRU1fUkRBVCk7CiAJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgewotCQkJSVdMX0VSUihwcml2LCAidUNvZGUgSU5TVCBzZWN0aW9uIGF0ICIKKwkJCUlXTF9FUlIoYnVzLCAidUNvZGUgSU5TVCBzZWN0aW9uIGF0ICIKIAkJCQkib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAogCQkJCW9mZnMsIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7CiAJCQllcnJvcnMrKzsKQEAgLTQ3NCwxNiArNTIyLDI0IEBACiAgKiBpd2xfdmVyaWZ5X3Vjb2RlIC0gZGV0ZXJtaW5lIHdoaWNoIGluc3RydWN0aW9uIGltYWdlIGlzIGluIFNSQU0sCiAgKiAgICBhbmQgdmVyaWZ5IGl0cyBjb250ZW50cwogICovCi1zdGF0aWMgaW50IGl3bF92ZXJpZnlfdWNvZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgZndfaW1nICppbWcpCitzdGF0aWMgaW50IGl3bF92ZXJpZnlfdWNvZGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkgICAgZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQogewotCWlmICghaXdsX3ZlcmlmeV9pbnN0X3NwYXJzZShwcml2LCAmaW1nLT5jb2RlKSkgewotCQlJV0xfREVCVUdfRlcocHJpdiwgInVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKKwlzdHJ1Y3QgZndfaW1nICppbWcgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKHRyYW5zLCB1Y29kZV90eXBlKTsKKworCWlmICghaW1nKSB7CisJCUlXTF9FUlIodHJhbnMsICJJbnZhbGlkIHVjb2RlIHJlcXVlc3RlZCAoJWQpXG4iLCB1Y29kZV90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFpd2xfdmVyaWZ5X2luc3Rfc3BhcnNlKGJ1cyh0cmFucyksICZpbWctPmNvZGUpKSB7CisJCUlXTF9ERUJVR19GVyh0cmFucywgInVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JSVdMX0VSUihwcml2LCAiVUNPREUgSU1BR0UgSU4gSU5TVFJVQ1RJT04gU1JBTSBOT1QgVkFMSUQhIVxuIik7CisJSVdMX0VSUih0cmFucywgIlVDT0RFIElNQUdFIElOIElOU1RSVUNUSU9OIFNSQU0gTk9UIFZBTElEISFcbiIpOwogCi0JaXdsX3ByaW50X21pc21hdGNoX2luc3QocHJpdiwgJmltZy0+Y29kZSk7CisJaXdsX3ByaW50X21pc21hdGNoX2luc3QoYnVzKHRyYW5zKSwgJmltZy0+Y29kZSk7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTUxOSwxMyArNTc1LDEyIEBACiAjZGVmaW5lIFVDT0RFX0NBTElCX1RJTUVPVVQJKDIqSFopCiAKIGludCBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgc3RydWN0IGZ3X2ltZyAqaW1hZ2UsCi0JCQkJIGVudW0gaXdsYWduX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSkKKwkJCQkgZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQogewogCXN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgYWxpdmVfd2FpdDsKIAlzdHJ1Y3QgaXdsYWduX2FsaXZlX2RhdGEgYWxpdmVfZGF0YTsKIAlpbnQgcmV0OwotCWVudW0gaXdsYWduX3Vjb2RlX3R5cGUgb2xkX3R5cGU7CisJZW51bSBpd2xfdWNvZGVfdHlwZSBvbGRfdHlwZTsKIAogCXJldCA9IGl3bF90cmFuc19zdGFydF9kZXZpY2UodHJhbnMocHJpdikpOwogCWlmIChyZXQpCkBAIC01MzcsNyArNTkyLDcgQEAKIAlvbGRfdHlwZSA9IHByaXYtPnVjb2RlX3R5cGU7CiAJcHJpdi0+dWNvZGVfdHlwZSA9IHVjb2RlX3R5cGU7CiAKLQlyZXQgPSBpd2xhZ25fbG9hZF9naXZlbl91Y29kZShwcml2LCBpbWFnZSk7CisJcmV0ID0gaXdsYWduX2xvYWRfZ2l2ZW5fdWNvZGUodHJhbnMocHJpdiksIHVjb2RlX3R5cGUpOwogCWlmIChyZXQpIHsKIAkJcHJpdi0+dWNvZGVfdHlwZSA9IG9sZF90eXBlOwogCQlpd2xhZ25fcmVtb3ZlX25vdGlmaWNhdGlvbihwcml2LCAmYWxpdmVfd2FpdCk7CkBAIC01NjgsNyArNjIzLDcgQEAKIAkgKiBza2lwIGl0IGZvciBXb1dMQU4uCiAJICovCiAJaWYgKHVjb2RlX3R5cGUgIT0gSVdMX1VDT0RFX1dPV0xBTikgewotCQlyZXQgPSBpd2xfdmVyaWZ5X3Vjb2RlKHByaXYsIGltYWdlKTsKKwkJcmV0ID0gaXdsX3ZlcmlmeV91Y29kZSh0cmFucyhwcml2KSwgdWNvZGVfdHlwZSk7CiAJCWlmIChyZXQpIHsKIAkJCXByaXYtPnVjb2RlX3R5cGUgPSBvbGRfdHlwZTsKIAkJCXJldHVybiByZXQ7CkBAIC01OTcsNyArNjUyLDcgQEAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5zaHJkLT5tdXRleCk7CiAKIAkvKiBObyBpbml0IHVjb2RlIHJlcXVpcmVkPyBDdXJpb3VzLCBidXQgbWF5YmUgb2sgKi8KLQlpZiAoIXByaXYtPnVjb2RlX2luaXQuY29kZS5sZW4pCisJaWYgKCF0cmFucyhwcml2KS0+dWNvZGVfaW5pdC5jb2RlLmxlbikKIAkJcmV0dXJuIDA7CiAKIAlpZiAocHJpdi0+dWNvZGVfdHlwZSAhPSBJV0xfVUNPREVfTk9ORSkKQEAgLTYwOCw4ICs2NjMsNyBAQAogCQkJCSAgICAgIE5VTEwsIE5VTEwpOwogCiAJLyogV2lsbCBhbHNvIHN0YXJ0IHRoZSBkZXZpY2UgKi8KLQlyZXQgPSBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHByaXYsICZwcml2LT51Y29kZV9pbml0LAotCQkJCQkgICBJV0xfVUNPREVfSU5JVCk7CisJcmV0ID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LCBJV0xfVUNPREVfSU5JVCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYwppbmRleCBiYWNjMDZjLi40ZDIwYmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC00NTIsNTIgKzQ1MSw2IEBACiAJaXdsYWduX2Rldl90eGZpZm9fZmx1c2gocHJpdiwgSVdMX0RST1BfQUxMKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIHVDb2RlIGRvd25sb2FkIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGl3bF9mcmVlX2Z3X2Rlc2Moc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgZndfZGVzYyAqZGVzYykKLXsKLQlpZiAoZGVzYy0+dl9hZGRyKQotCQlkbWFfZnJlZV9jb2hlcmVudChidXMocHJpdiktPmRldiwgZGVzYy0+bGVuLAotCQkJCSAgZGVzYy0+dl9hZGRyLCBkZXNjLT5wX2FkZHIpOwotCWRlc2MtPnZfYWRkciA9IE5VTEw7Ci0JZGVzYy0+bGVuID0gMDsKLX0KLQotc3RhdGljIHZvaWQgaXdsX2ZyZWVfZndfaW1nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGZ3X2ltZyAqaW1nKQotewotCWl3bF9mcmVlX2Z3X2Rlc2MocHJpdiwgJmltZy0+Y29kZSk7Ci0JaXdsX2ZyZWVfZndfZGVzYyhwcml2LCAmaW1nLT5kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsX2RlYWxsb2NfdWNvZGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWl3bF9mcmVlX2Z3X2ltZyhwcml2LCAmcHJpdi0+dWNvZGVfcnQpOwotCWl3bF9mcmVlX2Z3X2ltZyhwcml2LCAmcHJpdi0+dWNvZGVfaW5pdCk7Ci0JaXdsX2ZyZWVfZndfaW1nKHByaXYsICZwcml2LT51Y29kZV93b3dsYW4pOwotfQotCi1zdGF0aWMgaW50IGl3bF9hbGxvY19md19kZXNjKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGZ3X2Rlc2MgKmRlc2MsCi0JCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCi17Ci0JaWYgKCFsZW4pIHsKLQkJZGVzYy0+dl9hZGRyID0gTlVMTDsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGVzYy0+dl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGJ1cyhwcml2KS0+ZGV2LCBsZW4sCi0JCQkJCSAgJmRlc2MtPnBfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjLT52X2FkZHIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGVzYy0+bGVuID0gbGVuOwotCW1lbWNweShkZXNjLT52X2FkZHIsIGRhdGEsIGxlbik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGl3bF9pbml0X2NvbnRleHQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgdWNvZGVfZmxhZ3MpCiB7CiAJaW50IGk7CkBAIC01NTUsMTYgKzUwOCw3IEBACiAJQlVJTERfQlVHX09OKE5VTV9JV0xfUlhPTl9DVFggIT0gMik7CiB9CiAKLQotc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgewotCXUzMiBtYXhfcHJvYmVfbGVuZ3RoOwotCXUzMiBzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZTsKLQl1MzIgZmxhZ3M7Ci19OwotCiBzdGF0aWMgdm9pZCBpd2xfdWNvZGVfY2FsbGJhY2soY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZV9yYXcsIHZvaWQgKmNvbnRleHQpOwotc3RhdGljIGludCBpd2xhZ25fbWFjX3NldHVwX3JlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBpd2xhZ25fdWNvZGVfY2FwYWJpbGl0aWVzICpjYXBhKTsKIAogI2RlZmluZSBVQ09ERV9FWFBFUklNRU5UQUxfSU5ERVgJMTAwCiAjZGVmaW5lIFVDT0RFX0VYUEVSSU1FTlRBTF9UQUcJCSJleHAiCkBAIC0xMDQwLDMwICs5ODQsMzIgQEAKIAkvKiBSdW50aW1lIGluc3RydWN0aW9ucyBhbmQgMiBjb3BpZXMgb2YgZGF0YToKIAkgKiAxKSB1bm1vZGlmaWVkIGZyb20gZGlzawogCSAqIDIpIGJhY2t1cCBjYWNoZSBmb3Igc2F2ZS9yZXN0b3JlIGR1cmluZyBwb3dlci1kb3ducyAqLwotCWlmIChpd2xfYWxsb2NfZndfZGVzYyhwcml2LCAmcHJpdi0+dWNvZGVfcnQuY29kZSwKKwlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MoYnVzKHByaXYpLCAmdHJhbnMocHJpdiktPnVjb2RlX3J0LmNvZGUsCiAJCQkgICAgICBwaWVjZXMuaW5zdCwgcGllY2VzLmluc3Rfc2l6ZSkpCiAJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdiwgJnByaXYtPnVjb2RlX3J0LmRhdGEsCisJaWYgKGl3bF9hbGxvY19md19kZXNjKGJ1cyhwcml2KSwgJnRyYW5zKHByaXYpLT51Y29kZV9ydC5kYXRhLAogCQkJICAgICAgcGllY2VzLmRhdGEsIHBpZWNlcy5kYXRhX3NpemUpKQogCQlnb3RvIGVycl9wY2lfYWxsb2M7CiAKIAkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgKi8KIAlpZiAocGllY2VzLmluaXRfc2l6ZSAmJiBwaWVjZXMuaW5pdF9kYXRhX3NpemUpIHsKLQkJaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYsICZwcml2LT51Y29kZV9pbml0LmNvZGUsCisJCWlmIChpd2xfYWxsb2NfZndfZGVzYyhidXMocHJpdiksICZ0cmFucyhwcml2KS0+dWNvZGVfaW5pdC5jb2RlLAogCQkJCSAgICAgIHBpZWNlcy5pbml0LCBwaWVjZXMuaW5pdF9zaXplKSkKIAkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQkJaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYsICZwcml2LT51Y29kZV9pbml0LmRhdGEsCisJCWlmIChpd2xfYWxsb2NfZndfZGVzYyhidXMocHJpdiksICZ0cmFucyhwcml2KS0+dWNvZGVfaW5pdC5kYXRhLAogCQkJCSAgICAgIHBpZWNlcy5pbml0X2RhdGEsIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkpCiAJCQlnb3RvIGVycl9wY2lfYWxsb2M7CiAJfQogCiAJLyogV29XTEFOIGluc3RydWN0aW9ucyBhbmQgZGF0YSAqLwogCWlmIChwaWVjZXMud293bGFuX2luc3Rfc2l6ZSAmJiBwaWVjZXMud293bGFuX2RhdGFfc2l6ZSkgewotCQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdiwgJnByaXYtPnVjb2RlX3dvd2xhbi5jb2RlLAorCQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MoYnVzKHByaXYpLAorCQkJCSAgICAgICZ0cmFucyhwcml2KS0+dWNvZGVfd293bGFuLmNvZGUsCiAJCQkJICAgICAgcGllY2VzLndvd2xhbl9pbnN0LAogCQkJCSAgICAgIHBpZWNlcy53b3dsYW5faW5zdF9zaXplKSkKIAkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQkJaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYsICZwcml2LT51Y29kZV93b3dsYW4uZGF0YSwKKwkJaWYgKGl3bF9hbGxvY19md19kZXNjKGJ1cyhwcml2KSwKKwkJCQkgICAgICAmdHJhbnMocHJpdiktPnVjb2RlX3dvd2xhbi5kYXRhLAogCQkJCSAgICAgIHBpZWNlcy53b3dsYW5fZGF0YSwKIAkJCQkgICAgICBwaWVjZXMud293bGFuX2RhdGFfc2l6ZSkpCiAJCQlnb3RvIGVycl9wY2lfYWxsb2M7CkBAIC0xMTU2LDcgKzExMDIsNyBAQAogCiAgZXJyX3BjaV9hbGxvYzoKIAlJV0xfRVJSKHByaXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcGNpIG1lbW9yeVxuIik7Ci0JaXdsX2RlYWxsb2NfdWNvZGUocHJpdik7CisJaXdsX2RlYWxsb2NfdWNvZGUodHJhbnMocHJpdikpOwogIG91dF91bmJpbmQ6CiAJY29tcGxldGUoJnByaXYtPmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOwogCWRldmljZV9yZWxlYXNlX2RyaXZlcihidXMocHJpdiktPmRldik7CkBAIC0xMzUyLDcgKzEyOTgsNyBAQAogCiBzdGF0aWMgdm9pZCBpd2xfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIAotc3RhdGljIHZvaWQgX19pd2xfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit2b2lkIF9faXdsX2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCWludCBleGl0X3BlbmRpbmc7CiAKQEAgLTE0MTUsNyArMTM2MSw3IEBACiAJcHJpdi0+YmVhY29uX3NrYiA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bF9kb3duKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3ZvaWQgaXdsX2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKIAlfX2l3bF9kb3duKHByaXYpOwpAQCAtMTQyNCw1NyArMTM3MCw2IEBACiAJaXdsX2NhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOwogfQogCi0jZGVmaW5lIE1BWF9IV19SRVNUQVJUUyA1Ci0KLXN0YXRpYyBpbnQgX19pd2xfdXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JaW50IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkgewotCQlJV0xfV0FSTihwcml2LCAiRXhpdCBwZW5kaW5nOyB3aWxsIG5vdCBicmluZyB0aGUgTklDIHVwXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJcmV0ID0gaXdsYWduX2FsbG9jX2JjYXN0X3N0YXRpb24ocHJpdiwgY3R4KTsKLQkJaWYgKHJldCkgewotCQkJaXdsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMocHJpdik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcmV0ID0gaXdsYWduX3J1bl9pbml0X3Vjb2RlKHByaXYpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHJ1biBJTklUIHVjb2RlOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXQgPSBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHByaXYsCi0JCQkJCSAgICZwcml2LT51Y29kZV9ydCwKLQkJCQkJICAgSVdMX1VDT0RFX1JFR1VMQVIpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHN0YXJ0IFJUIHVjb2RlOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXQgPSBpd2xfYWxpdmVfc3RhcnQocHJpdik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQlyZXR1cm4gMDsKLQotIGVycm9yOgotCXNldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7Ci0JX19pd2xfZG93bihwcml2KTsKLQljbGVhcl9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7Ci0KLQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UuXG4iKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFdvcmtxdWV1ZSBjYWxsYmFja3MKQEAgLTE1MDIsNyArMTM5Nyw3IEBACiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQordm9pZCBpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwogCWJvb2wgYnRfZnVsbF9jb25jdXJyZW50OwpAQCAtMTU1OSwxMTcyICsxNDU0LDggQEAKIAl9CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduX3N0YV9hcF9saW1pdHNbXSA9IHsKLQl7Ci0JCS5tYXggPSAxLAotCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCi0JfSwKLQl7Ci0JCS5tYXggPSAxLAotCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fMnN0YV9saW1pdHNbXSA9IHsKLQl7Ci0JCS5tYXggPSAyLAotCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGl3bGFnbl9wMnBfc3RhX2dvX2xpbWl0c1tdID0gewotCXsKLQkJLm1heCA9IDEsCi0JCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSwKLQl9LAotCXsKLQkJLm1heCA9IDEsCi0JCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKLQkJCSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fcDJwXzJzdGFfbGltaXRzW10gPSB7Ci0JewotCQkubWF4ID0gMiwKLQkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAotCX0sCi0JewotCQkubWF4ID0gMSwKLQkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9jb21iaW5hdGlvbgotaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19kdWFsbW9kZVtdID0gewotCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAotCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKLQkgIC5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKLQkgIC5saW1pdHMgPSBpd2xhZ25fc3RhX2FwX2xpbWl0cywKLQkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduX3N0YV9hcF9saW1pdHMpLAotCX0sCi0JeyAubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCi0JICAubWF4X2ludGVyZmFjZXMgPSAyLAotCSAgLmxpbWl0cyA9IGl3bGFnbl8yc3RhX2xpbWl0cywKLQkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduXzJzdGFfbGltaXRzKSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24KLWl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwW10gPSB7Ci0JeyAubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCi0JICAubWF4X2ludGVyZmFjZXMgPSAyLAotCSAgLmJlYWNvbl9pbnRfaW5mcmFfbWF0Y2ggPSB0cnVlLAotCSAgLmxpbWl0cyA9IGl3bGFnbl9wMnBfc3RhX2dvX2xpbWl0cywKLQkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduX3AycF9zdGFfZ29fbGltaXRzKSwKLQl9LAotCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAotCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKLQkgIC5saW1pdHMgPSBpd2xhZ25fcDJwXzJzdGFfbGltaXRzLAotCSAgLm5fbGltaXRzID0gQVJSQVlfU0laRShpd2xhZ25fcDJwXzJzdGFfbGltaXRzKSwKLQl9LAotfTsKLQotLyoKLSAqIE5vdCBhIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9uLCBidXQgaXQgZml0cyBpbiB3aXRoIGFsbCB0aGUKLSAqIG90aGVyIG1hYzgwMjExIGZ1bmN0aW9ucyBncm91cGVkIGhlcmUuCi0gKi8KLXN0YXRpYyBpbnQgaXdsYWduX21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaXdsYWduX3Vjb2RlX2NhcGFiaWxpdGllcyAqY2FwYSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIml3bC1hZ24tcnMiOwotCi0JLyogVGVsbCBtYWM4MDIxMSBvdXIgY2hhcmFjdGVyaXN0aWNzICovCi0JaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAotCQkgICAgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OIHwKLQkJICAgIElFRUU4MDIxMV9IV19ORUVEX0RUSU1fUEVSSU9EIHwKLQkJICAgIElFRUU4MDIxMV9IV19TUEVDVFJVTV9NR01UIHwKLQkJICAgIElFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVM7Ci0KLQkvKgotCSAqIEluY2x1ZGluZyB0aGUgZm9sbG93aW5nIGxpbmUgd2lsbCBjcmFzaCBzb21lIEFQJ3MuICBUaGlzCi0JICogd29ya2Fyb3VuZCByZW1vdmVzIHRoZSBzdGltdWx1cyB3aGljaCBjYXVzZXMgdGhlIGNyYXNoIHVudGlsCi0JICogdGhlIEFQIHNvZnR3YXJlIGNhbiBiZSBmaXhlZC4KLQlody0+bWF4X3R4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lcyA9IExJTktfUVVBTF9BR0dfRlJBTUVfTElNSVRfREVGOwotCSAqLwotCi0JaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19QUyB8Ci0JCSAgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfUFM7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKQotCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfU01QUyB8Ci0JCQkgICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19TVEFUSUNfU01QUzsKLQotCWlmIChjYXBhLT5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfTUZQKQotCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX01GUF9DQVBBQkxFOwotCi0JaHctPnN0YV9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYpOwotCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdmlmX3ByaXYpOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gY3R4LT5pbnRlcmZhY2VfbW9kZXM7Ci0JCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKLQl9Ci0KLQlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAyKTsKLQotCWlmIChody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSkgewotCQlody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9ucyA9IGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwOwotCQlody0+d2lwaHktPm5faWZhY2VfY29tYmluYXRpb25zID0KLQkJCUFSUkFZX1NJWkUoaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19wMnApOwotCX0gZWxzZSBpZiAoaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfQVApKSB7Ci0JCWh3LT53aXBoeS0+aWZhY2VfY29tYmluYXRpb25zID0gaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19kdWFsbW9kZTsKLQkJaHctPndpcGh5LT5uX2lmYWNlX2NvbWJpbmF0aW9ucyA9Ci0JCQlBUlJBWV9TSVpFKGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfZHVhbG1vZGUpOwotCX0KLQotCWh3LT53aXBoeS0+bWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uID0gMTAwMDsKLQotCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB8Ci0JCQkgICAgV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUyB8Ci0JCQkgICAgV0lQSFlfRkxBR19JQlNTX1JTTjsKLQotCWlmIChwcml2LT51Y29kZV93b3dsYW4uY29kZS5sZW4gJiYgZGV2aWNlX2Nhbl93YWtldXAoYnVzKHByaXYpLT5kZXYpKSB7Ci0JCWh3LT53aXBoeS0+d293bGFuLmZsYWdzID0gV0lQSFlfV09XTEFOX01BR0lDX1BLVCB8Ci0JCQkJCSAgV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1QgfAotCQkJCQkgIFdJUEhZX1dPV0xBTl9FQVBfSURFTlRJVFlfUkVRIHwKLQkJCQkJICBXSVBIWV9XT1dMQU5fUkZLSUxMX1JFTEVBU0U7Ci0JCWlmICghaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKQotCQkJaHctPndpcGh5LT53b3dsYW4uZmxhZ3MgfD0KLQkJCQlXSVBIWV9XT1dMQU5fU1VQUE9SVFNfR1RLX1JFS0VZIHwKLQkJCQlXSVBIWV9XT1dMQU5fR1RLX1JFS0VZX0ZBSUxVUkU7Ci0KLQkJaHctPndpcGh5LT53b3dsYW4ubl9wYXR0ZXJucyA9IElXTEFHTl9XT1dMQU5fTUFYX1BBVFRFUk5TOwotCQlody0+d2lwaHktPndvd2xhbi5wYXR0ZXJuX21pbl9sZW4gPQotCQkJCQlJV0xBR05fV09XTEFOX01JTl9QQVRURVJOX0xFTjsKLQkJaHctPndpcGh5LT53b3dsYW4ucGF0dGVybl9tYXhfbGVuID0KLQkJCQkJSVdMQUdOX1dPV0xBTl9NQVhfUEFUVEVSTl9MRU47Ci0JfQotCi0JaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnBvd2VyX3NhdmUpCi0JCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotCWVsc2UKLQkJaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotCi0JaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVg7Ci0JLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLwotCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gY2FwYS0+bWF4X3Byb2JlX2xlbmd0aCAtIDI0IC0gMjsKLQotCS8qIERlZmF1bHQgdmFsdWU7IDQgRURDQSBRT1MgcHJpb3JpdGllcyAqLwotCWh3LT5xdWV1ZXMgPSA0OwotCi0JaHctPm1heF9saXN0ZW5faW50ZXJ2YWwgPSBJV0xfQ09OTl9NQVhfTElTVEVOX0lOVEVSVkFMOwotCi0JaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHMpCi0JCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPQotCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOwotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKQotCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0KLQkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKLQotCWl3bF9sZWRzX2luaXQocHJpdik7Ci0KLQlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcocHJpdi0+aHcpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGh3IChlcnJvciAlZClcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCS8qIHdlIHNob3VsZCBiZSB2ZXJpZnlpbmcgdGhlIGRldmljZSBpcyByZWFkeSB0byBiZSBvcGVuZWQgKi8KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JcmV0ID0gX19pd2xfdXAocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJTdGFydCBVUCB3b3JrIGRvbmUuXG4iKTsKLQotCS8qIE5vdyB3ZSBzaG91bGQgYmUgZG9uZSwgYW5kIHRoZSBSRUFEWSBiaXQgc2hvdWxkIGJlIHNldC4gKi8KLQlpZiAoV0FSTl9PTighdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkpCi0JCXJldCA9IC1FSU87Ci0KLQlpd2xhZ25fbGVkX2VuYWJsZShwcml2KTsKLQotCXByaXYtPmlzX29wZW4gPSAxOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmICghcHJpdi0+aXNfb3BlbikKLQkJcmV0dXJuOwotCi0JcHJpdi0+aXNfb3BlbiA9IDA7Ci0KLQlpd2xfZG93bihwcml2KTsKLQotCWZsdXNoX3dvcmtxdWV1ZShwcml2LT5zaHJkLT53b3JrcXVldWUpOwotCi0JLyogVXNlciBzcGFjZSBzb2Z0d2FyZSBtYXkgZXhwZWN0IGdldHRpbmcgcmZraWxsIGNoYW5nZXMKLQkgKiBldmVuIGlmIGludGVyZmFjZSBpcyBkb3duICovCi0JaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQlpd2xfZW5hYmxlX3Jma2lsbF9pbnQocHJpdik7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBpd2xhZ25fc2VuZF9wYXR0ZXJucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKQotewotCXN0cnVjdCBpd2xhZ25fd293bGFuX3BhdHRlcm5zX2NtZCAqcGF0dGVybl9jbWQ7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1dPV0xBTl9QQVRURVJOUywKLQkJLmRhdGFmbGFnc1swXSA9IElXTF9IQ01EX0RGTF9OT0NPUFksCi0JCS5mbGFncyA9IENNRF9TWU5DLAotCX07Ci0JaW50IGksIGVycjsKLQotCWlmICghd293bGFuLT5uX3BhdHRlcm5zKQotCQlyZXR1cm4gMDsKLQotCWNtZC5sZW5bMF0gPSBzaXplb2YoKnBhdHRlcm5fY21kKSArCi0JCQl3b3dsYW4tPm5fcGF0dGVybnMgKiBzaXplb2Yoc3RydWN0IGl3bGFnbl93b3dsYW5fcGF0dGVybik7Ci0KLQlwYXR0ZXJuX2NtZCA9IGttYWxsb2MoY21kLmxlblswXSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXR0ZXJuX2NtZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwYXR0ZXJuX2NtZC0+bl9wYXR0ZXJucyA9IGNwdV90b19sZTMyKHdvd2xhbi0+bl9wYXR0ZXJucyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgd293bGFuLT5uX3BhdHRlcm5zOyBpKyspIHsKLQkJaW50IG1hc2tfbGVuID0gRElWX1JPVU5EX1VQKHdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4sIDgpOwotCi0JCW1lbWNweSgmcGF0dGVybl9jbWQtPnBhdHRlcm5zW2ldLm1hc2ssCi0JCQl3b3dsYW4tPnBhdHRlcm5zW2ldLm1hc2ssIG1hc2tfbGVuKTsKLQkJbWVtY3B5KCZwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ucGF0dGVybiwKLQkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybiwKLQkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4pOwotCQlwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ubWFza19zaXplID0gbWFza19sZW47Ci0JCXBhdHRlcm5fY21kLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX3NpemUgPQotCQkJd293bGFuLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX2xlbjsKLQl9Ci0KLQljbWQuZGF0YVswXSA9IHBhdHRlcm5fY21kOwotCWVyciA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJmNtZCk7Ci0Ja2ZyZWUocGF0dGVybl9jbWQpOwotCXJldHVybiBlcnI7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgaXdsYWduX21hY19zZXRfcmVrZXlfZGF0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9ndGtfcmVrZXlfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5zd19jcnlwdG8pCi0JCXJldHVybjsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmIChwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS52aWYgIT0gdmlmKQotCQlnb3RvIG91dDsKLQotCW1lbWNweShwcml2LT5rZWssIGRhdGEtPmtlaywgTkw4MDIxMV9LRUtfTEVOKTsKLQltZW1jcHkocHJpdi0+a2NrLCBkYXRhLT5rY2ssIE5MODAyMTFfS0NLX0xFTik7Ci0JcHJpdi0+cmVwbGF5X2N0ciA9IGNwdV90b19sZTY0KGJlNjRfdG9fY3B1cCgoX19iZTY0ICopJmRhdGEtPnJlcGxheV9jdHIpKTsKLQlwcml2LT5oYXZlX3Jla2V5X2RhdGEgPSB0cnVlOwotCi0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi1zdHJ1Y3Qgd293bGFuX2tleV9kYXRhIHsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCXN0cnVjdCBpd2xhZ25fd293bGFuX3JzY190c2NfcGFyYW1zX2NtZCAqcnNjX3RzYzsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl90a2lwX3BhcmFtc19jbWQgKnRraXA7Ci0JY29uc3QgdTggKmJzc2lkOwotCWJvb2wgZXJyb3IsIHVzZV9yc2NfdHNjLCB1c2VfdGtpcDsKLX07Ci0KLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyB2b2lkIGl3bGFnbl9jb252ZXJ0X3Axayh1MTYgKnAxaywgX19sZTE2ICpvdXQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVdMQUdOX1AxS19TSVpFOyBpKyspCi0JCW91dFtpXSA9IGNwdV90b19sZTE2KHAxa1tpXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl93b3dsYW5fcHJvZ3JhbV9rZXlzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksCi0JCQkJICAgICAgIHZvaWQgKl9kYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCB3b3dsYW5fa2V5X2RhdGEgKmRhdGEgPSBfZGF0YTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gZGF0YS0+Y3R4OwotCXN0cnVjdCBhZXNfc2MgKmFlc19zYywgKmFlc190eF9zYyA9IE5VTEw7Ci0Jc3RydWN0IHRraXBfc2MgKnRraXBfc2MsICp0a2lwX3R4X3NjID0gTlVMTDsKLQlzdHJ1Y3QgaXdsYWduX3Axa19jYWNoZSAqcnhfcDFrczsKLQl1OCAqcnhfbWljX2tleTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9zZXEgc2VxOwotCXUzMiBjdXJfcnhfaXYzMiA9IDA7Ci0JdTE2IHAxa1tJV0xBR05fUDFLX1NJWkVdOwotCWludCByZXQsIGk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAoKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8Ci0JICAgICBrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpICYmCi0JICAgICAhc3RhICYmICFjdHgtPmtleV9tYXBwaW5nX2tleXMpCi0JCXJldCA9IGl3bF9zZXRfZGVmYXVsdF93ZXBfa2V5KHByaXYsIGN0eCwga2V5KTsKLQllbHNlCi0JCXJldCA9IGl3bF9zZXRfZHluYW1pY19rZXkocHJpdiwgY3R4LCBrZXksIHN0YSk7Ci0KLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIHNldHRpbmcga2V5IGR1cmluZyBzdXNwZW5kIVxuIik7Ci0JCWRhdGEtPmVycm9yID0gdHJ1ZTsKLQl9Ci0KLQlzd2l0Y2ggKGtleS0+Y2lwaGVyKSB7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQlpZiAoc3RhKSB7Ci0JCQl0a2lwX3NjID0gZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MudGtpcC51bmljYXN0X3JzYzsKLQkJCXRraXBfdHhfc2MgPSAmZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MudGtpcC50c2M7Ci0KLQkJCXJ4X3Axa3MgPSBkYXRhLT50a2lwLT5yeF91bmk7Ci0KLQkJCWllZWU4MDIxMV9nZXRfa2V5X3R4X3NlcShrZXksICZzZXEpOwotCQkJdGtpcF90eF9zYy0+aXYxNiA9IGNwdV90b19sZTE2KHNlcS50a2lwLml2MTYpOwotCQkJdGtpcF90eF9zYy0+aXYzMiA9IGNwdV90b19sZTMyKHNlcS50a2lwLml2MzIpOwotCi0JCQlpZWVlODAyMTFfZ2V0X3RraXBfcDFrX2l2KGtleSwgc2VxLnRraXAuaXYzMiwgcDFrKTsKLQkJCWl3bGFnbl9jb252ZXJ0X3AxayhwMWssIGRhdGEtPnRraXAtPnR4LnAxayk7Ci0KLQkJCW1lbWNweShkYXRhLT50a2lwLT5taWNfa2V5cy50eCwKLQkJCSAgICAgICAma2V5LT5rZXlbTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1RYX01JQ19LRVldLAotCQkJICAgICAgIElXTEFHTl9NSUNfS0VZX1NJWkUpOwotCi0JCQlyeF9taWNfa2V5ID0gZGF0YS0+dGtpcC0+bWljX2tleXMucnhfdW5pY2FzdDsKLQkJfSBlbHNlIHsKLQkJCXRraXBfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy50a2lwLm11bHRpY2FzdF9yc2M7Ci0JCQlyeF9wMWtzID0gZGF0YS0+dGtpcC0+cnhfbXVsdGk7Ci0JCQlyeF9taWNfa2V5ID0gZGF0YS0+dGtpcC0+bWljX2tleXMucnhfbWNhc3Q7Ci0JCX0KLQotCQkvKgotCQkgKiBGb3Igbm9uLVFvUyB0aGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGJvdGggdGhlIHVDb2RlIGFuZAotCQkgKiBtYWM4MDIxMSB1c2UgVElEIDAgKGFzIHRoZXkgbmVlZCB0byB0byBhdm9pZCByZXBsYXkgYXR0YWNrcykKLQkJICogZm9yIGNoZWNraW5nIHRoZSBJViBpbiB0aGUgZnJhbWVzLgotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IElXTEFHTl9OVU1fUlNDOyBpKyspIHsKLQkJCWllZWU4MDIxMV9nZXRfa2V5X3J4X3NlcShrZXksIGksICZzZXEpOwotCQkJdGtpcF9zY1tpXS5pdjE2ID0gY3B1X3RvX2xlMTYoc2VxLnRraXAuaXYxNik7Ci0JCQl0a2lwX3NjW2ldLml2MzIgPSBjcHVfdG9fbGUzMihzZXEudGtpcC5pdjMyKTsKLQkJCS8qIHdyYXBwaW5nIGlzbid0IGFsbG93ZWQsIEFQIG11c3QgcmVrZXkgKi8KLQkJCWlmIChzZXEudGtpcC5pdjMyID4gY3VyX3J4X2l2MzIpCi0JCQkJY3VyX3J4X2l2MzIgPSBzZXEudGtpcC5pdjMyOwotCQl9Ci0KLQkJaWVlZTgwMjExX2dldF90a2lwX3J4X3AxayhrZXksIGRhdGEtPmJzc2lkLCBjdXJfcnhfaXYzMiwgcDFrKTsKLQkJaXdsYWduX2NvbnZlcnRfcDFrKHAxaywgcnhfcDFrc1swXS5wMWspOwotCQlpZWVlODAyMTFfZ2V0X3RraXBfcnhfcDFrKGtleSwgZGF0YS0+YnNzaWQsCi0JCQkJCSAgY3VyX3J4X2l2MzIgKyAxLCBwMWspOwotCQlpd2xhZ25fY29udmVydF9wMWsocDFrLCByeF9wMWtzWzFdLnAxayk7Ci0KLQkJbWVtY3B5KHJ4X21pY19rZXksCi0JCSAgICAgICAma2V5LT5rZXlbTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1JYX01JQ19LRVldLAotCQkgICAgICAgSVdMQUdOX01JQ19LRVlfU0laRSk7Ci0KLQkJZGF0YS0+dXNlX3RraXAgPSB0cnVlOwotCQlkYXRhLT51c2VfcnNjX3RzYyA9IHRydWU7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJaWYgKHN0YSkgewotCQkJdTggKnBuID0gc2VxLmNjbXAucG47Ci0KLQkJCWFlc19zYyA9IGRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLmFlcy51bmljYXN0X3JzYzsKLQkJCWFlc190eF9zYyA9ICZkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy5hZXMudHNjOwotCi0JCQlpZWVlODAyMTFfZ2V0X2tleV90eF9zZXEoa2V5LCAmc2VxKTsKLQkJCWFlc190eF9zYy0+cG4gPSBjcHVfdG9fbGU2NCgKLQkJCQkJKHU2NClwbls1XSB8Ci0JCQkJCSgodTY0KXBuWzRdIDw8IDgpIHwKLQkJCQkJKCh1NjQpcG5bM10gPDwgMTYpIHwKLQkJCQkJKCh1NjQpcG5bMl0gPDwgMjQpIHwKLQkJCQkJKCh1NjQpcG5bMV0gPDwgMzIpIHwKLQkJCQkJKCh1NjQpcG5bMF0gPDwgNDApKTsKLQkJfSBlbHNlCi0JCQlhZXNfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy5hZXMubXVsdGljYXN0X3JzYzsKLQotCQkvKgotCQkgKiBGb3Igbm9uLVFvUyB0aGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGJvdGggdGhlIHVDb2RlIGFuZAotCQkgKiBtYWM4MDIxMSB1c2UgVElEIDAgZm9yIGNoZWNraW5nIHRoZSBJViBpbiB0aGUgZnJhbWVzLgotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IElXTEFHTl9OVU1fUlNDOyBpKyspIHsKLQkJCXU4ICpwbiA9IHNlcS5jY21wLnBuOwotCi0JCQlpZWVlODAyMTFfZ2V0X2tleV9yeF9zZXEoa2V5LCBpLCAmc2VxKTsKLQkJCWFlc19zYy0+cG4gPSBjcHVfdG9fbGU2NCgKLQkJCQkJKHU2NClwbls1XSB8Ci0JCQkJCSgodTY0KXBuWzRdIDw8IDgpIHwKLQkJCQkJKCh1NjQpcG5bM10gPDwgMTYpIHwKLQkJCQkJKCh1NjQpcG5bMl0gPDwgMjQpIHwKLQkJCQkJKCh1NjQpcG5bMV0gPDwgMzIpIHwKLQkJCQkJKCh1NjQpcG5bMF0gPDwgNDApKTsKLQkJfQotCQlkYXRhLT51c2VfcnNjX3RzYyA9IHRydWU7Ci0JCWJyZWFrOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfc3VzcGVuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvd2xhbikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl93YWtldXBfZmlsdGVyX2NtZCB3YWtldXBfZmlsdGVyX2NtZDsKLQlzdHJ1Y3QgaXdsX3J4b25fY21kIHJ4b247Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl9rZWtfa2NrX21hdGVyaWFsX2NtZCBrZWtfa2NrX2NtZDsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl90a2lwX3BhcmFtc19jbWQgdGtpcF9jbWQgPSB7fTsKLQlzdHJ1Y3Qgd293bGFuX2tleV9kYXRhIGtleV9kYXRhID0gewotCQkuY3R4ID0gY3R4LAotCQkuYnNzaWQgPSBjdHgtPmFjdGl2ZS5ic3NpZF9hZGRyLAotCQkudXNlX3JzY190c2MgPSBmYWxzZSwKLQkJLnRraXAgPSAmdGtpcF9jbWQsCi0JCS51c2VfdGtpcCA9IGZhbHNlLAotCX07Ci0JaW50IHJldCwgaTsKLQl1MTYgc2VxOwotCi0JaWYgKFdBUk5fT04oIXdvd2xhbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JLyogRG9uJ3QgYXR0ZW1wdCBXb1dMQU4gd2hlbiBub3QgYXNzb2NpYXRlZCwgdGVhciBkb3duIGluc3RlYWQuICovCi0JaWYgKCFjdHgtPnZpZiB8fCBjdHgtPnZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8Ci0JICAgICFpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgewotCQlyZXQgPSAxOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlrZXlfZGF0YS5yc2NfdHNjID0ga3phbGxvYyhzaXplb2YoKmtleV9kYXRhLnJzY190c2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleV9kYXRhLnJzY190c2MpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbWVtc2V0KCZ3YWtldXBfZmlsdGVyX2NtZCwgMCwgc2l6ZW9mKHdha2V1cF9maWx0ZXJfY21kKSk7Ci0KLQkvKgotCSAqIFdlIGtub3cgdGhlIGxhc3QgdXNlZCBzZXFubywgYW5kIHRoZSB1Q29kZSBleHBlY3RzIHRvIGtub3cgdGhhdAotCSAqIG9uZSwgaXQgd2lsbCBpbmNyZW1lbnQgYmVmb3JlIFRYLgotCSAqLwotCXNlcSA9IGxlMTZfdG9fY3B1KHByaXYtPmxhc3Rfc2VxX2N0bCkgJiBJRUVFODAyMTFfU0NUTF9TRVE7Ci0Jd2FrZXVwX2ZpbHRlcl9jbWQubm9uX3Fvc19zZXEgPSBjcHVfdG9fbGUxNihzZXEpOwotCi0JLyoKLQkgKiBGb3IgUW9TIGNvdW50ZXJzLCB3ZSBzdG9yZSB0aGUgb25lIHRvIHVzZSBuZXh0LCBzbyBzdWJ0cmFjdCAweDEwCi0JICogc2luY2UgdGhlIHVDb2RlIHdpbGwgYWRkIDB4MTAgYmVmb3JlIHVzaW5nIHRoZSB2YWx1ZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNlcSA9IHByaXYtPnNocmQtPnRpZF9kYXRhW0lXTF9BUF9JRF1baV0uc2VxX251bWJlcjsKLQkJc2VxIC09IDB4MTA7Ci0JCXdha2V1cF9maWx0ZXJfY21kLnFvc19zZXFbaV0gPSBjcHVfdG9fbGUxNihzZXEpOwotCX0KLQotCWlmICh3b3dsYW4tPmRpc2Nvbm5lY3QpCi0JCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KLQkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0JFQUNPTl9NSVNTIHwKLQkJCQkgICAgSVdMQUdOX1dPV0xBTl9XQUtFVVBfTElOS19DSEFOR0UpOwotCWlmICh3b3dsYW4tPm1hZ2ljX3BrdCkKLQkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQotCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfTUFHSUNfUEFDS0VUKTsKLQlpZiAod293bGFuLT5ndGtfcmVrZXlfZmFpbHVyZSkKLQkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQotCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfR1RLX1JFS0VZX0ZBSUwpOwotCWlmICh3b3dsYW4tPmVhcF9pZGVudGl0eV9yZXEpCi0JCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KLQkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0VBUF9JREVOVF9SRVEpOwotCWlmICh3b3dsYW4tPmZvdXJfd2F5X2hhbmRzaGFrZSkKLQkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQotCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfNFdBWV9IQU5EU0hBS0UpOwotCWlmICh3b3dsYW4tPnJma2lsbF9yZWxlYXNlKQotCQl3YWtldXBfZmlsdGVyX2NtZC5lbmFibGVkIHw9Ci0JCQljcHVfdG9fbGUzMihJV0xBR05fV09XTEFOX1dBS0VVUF9SRktJTEwpOwotCWlmICh3b3dsYW4tPm5fcGF0dGVybnMpCi0JCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KLQkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX1BBVFRFUk5fTUFUQ0gpOwotCi0JaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQotCW1lbWNweSgmcnhvbiwgJmN0eC0+YWN0aXZlLCBzaXplb2YocnhvbikpOwotCi0JaXdsX3RyYW5zX3N0b3BfZGV2aWNlKHRyYW5zKHByaXYpKTsKLQotCXByaXYtPnNocmQtPndvd2xhbiA9IHRydWU7Ci0KLQlyZXQgPSBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHByaXYsICZwcml2LT51Y29kZV93b3dsYW4sCi0JCQkJCSAgIElXTF9VQ09ERV9XT1dMQU4pOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBub3cgY29uZmlndXJlIFdvV0xBTiB1Y29kZSAqLwotCXJldCA9IGl3bF9hbGl2ZV9zdGFydChwcml2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yOwotCi0JbWVtY3B5KCZjdHgtPnN0YWdpbmcsICZyeG9uLCBzaXplb2YocnhvbikpOwotCXJldCA9IGl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCWlmICghaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7Ci0JCS8qIG1hcmsgYWxsIGtleXMgY2xlYXIgKi8KLQkJcHJpdi0+dWNvZGVfa2V5X3RhYmxlID0gMDsKLQkJY3R4LT5rZXlfbWFwcGluZ19rZXlzID0gMDsKLQotCQkvKgotCQkgKiBUaGlzIG5lZWRzIHRvIGJlIHVubG9ja2VkIGR1ZSB0byBsb2NrIG9yZGVyaW5nCi0JCSAqIGNvbnN0cmFpbnRzLiBTaW5jZSB3ZSdyZSBpbiB0aGUgc3VzcGVuZCBwYXRoCi0JCSAqIHRoYXQgaXNuJ3QgcmVhbGx5IGEgcHJvYmxlbSB0aG91Z2guCi0JCSAqLwotCQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQkJaWVlZTgwMjExX2l0ZXJfa2V5cyhwcml2LT5odywgY3R4LT52aWYsCi0JCQkJICAgIGl3bGFnbl93b3dsYW5fcHJvZ3JhbV9rZXlzLAotCQkJCSAgICAma2V5X2RhdGEpOwotCQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JCWlmIChrZXlfZGF0YS5lcnJvcikgewotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQlpZiAoa2V5X2RhdGEudXNlX3JzY190c2MpIHsKLQkJCXN0cnVjdCBpd2xfaG9zdF9jbWQgcnNjX3RzY19jbWQgPSB7Ci0JCQkJLmlkID0gUkVQTFlfV09XTEFOX1RTQ19SU0NfUEFSQU1TLAotCQkJCS5mbGFncyA9IENNRF9TWU5DLAotCQkJCS5kYXRhWzBdID0ga2V5X2RhdGEucnNjX3RzYywKLQkJCQkuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWSwKLQkJCQkubGVuWzBdID0gc2l6ZW9mKCprZXlfZGF0YS5yc2NfdHNjKSwKLQkJCX07Ci0KLQkJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJnJzY190c2NfY21kKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWlmIChrZXlfZGF0YS51c2VfdGtpcCkgewotCQkJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucyhwcml2KSwKLQkJCQkJCSBSRVBMWV9XT1dMQU5fVEtJUF9QQVJBTVMsCi0JCQkJCQkgQ01EX1NZTkMsIHNpemVvZih0a2lwX2NtZCksCi0JCQkJCQkgJnRraXBfY21kKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWlmIChwcml2LT5oYXZlX3Jla2V5X2RhdGEpIHsKLQkJCW1lbXNldCgma2VrX2tja19jbWQsIDAsIHNpemVvZihrZWtfa2NrX2NtZCkpOwotCQkJbWVtY3B5KGtla19rY2tfY21kLmtjaywgcHJpdi0+a2NrLCBOTDgwMjExX0tDS19MRU4pOwotCQkJa2VrX2tja19jbWQua2NrX2xlbiA9IGNwdV90b19sZTE2KE5MODAyMTFfS0NLX0xFTik7Ci0JCQltZW1jcHkoa2VrX2tja19jbWQua2VrLCBwcml2LT5rZWssIE5MODAyMTFfS0VLX0xFTik7Ci0JCQlrZWtfa2NrX2NtZC5rZWtfbGVuID0gY3B1X3RvX2xlMTYoTkw4MDIxMV9LRUtfTEVOKTsKLQkJCWtla19rY2tfY21kLnJlcGxheV9jdHIgPSBwcml2LT5yZXBsYXlfY3RyOwotCi0JCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLAotCQkJCQkJIFJFUExZX1dPV0xBTl9LRUtfS0NLX01BVEVSSUFMLAotCQkJCQkJIENNRF9TWU5DLCBzaXplb2Yoa2VrX2tja19jbWQpLAotCQkJCQkJICZrZWtfa2NrX2NtZCk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLCBSRVBMWV9XT1dMQU5fV0FLRVVQX0ZJTFRFUiwKLQkJCQkgQ01EX1NZTkMsIHNpemVvZih3YWtldXBfZmlsdGVyX2NtZCksCi0JCQkJICZ3YWtldXBfZmlsdGVyX2NtZCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCXJldCA9IGl3bGFnbl9zZW5kX3BhdHRlcm5zKHByaXYsIHdvd2xhbik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShidXMocHJpdiktPmRldiwgdHJ1ZSk7Ci0KLQkvKiBOb3cgbGV0IHRoZSB1Y29kZSBvcGVyYXRlIG9uIGl0cyBvd24gKi8KLQlpd2xfd3JpdGUzMihidXMocHJpdiksIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwKLQkJCSAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0QzX0NGR19DT01QTEVURSk7Ci0KLQlnb3RvIG91dDsKLQotIGVycm9yOgotCXByaXYtPnNocmQtPndvd2xhbiA9IGZhbHNlOwotCWl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQocHJpdik7Ci0JaWVlZTgwMjExX3Jlc3RhcnRfaHcocHJpdi0+aHcpOwotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlrZnJlZShrZXlfZGF0YS5yc2NfdHNjKTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX21hY19yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGJhc2UsIHN0YXR1cyA9IDB4ZmZmZmZmZmY7Ci0JaW50IHJldCA9IC1FSU87Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpd2xfd3JpdGUzMihidXMocHJpdiksIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwKLQkJCSAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0QzX0NGR19DT01QTEVURSk7Ci0KLQliYXNlID0gcHJpdi0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlOwotCWlmIChpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnVzKHByaXYpLT5yZWdfbG9jaywgZmxhZ3MpOwotCQlyZXQgPSBpd2xfZ3JhYl9uaWNfYWNjZXNzX3NpbGVudChidXMocHJpdikpOwotCQlpZiAocmV0ID09IDApIHsKLQkJCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SQUREUiwgYmFzZSk7Ci0JCQlzdGF0dXMgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SREFUKTsKLQkJCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MoYnVzKHByaXYpKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidXMocHJpdiktPnJlZ19sb2NrLCBmbGFncyk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCi0JCWlmIChyZXQgPT0gMCkgewotCQkJaWYgKCFwcml2LT53b3dsYW5fc3JhbSkKLQkJCQlwcml2LT53b3dsYW5fc3JhbSA9Ci0JCQkJCWt6YWxsb2MocHJpdi0+dWNvZGVfd293bGFuLmRhdGEubGVuLAotCQkJCQkJR0ZQX0tFUk5FTCk7Ci0KLQkJCWlmIChwcml2LT53b3dsYW5fc3JhbSkKLQkJCQlfaXdsX3JlYWRfdGFyZ19tZW1fd29yZHMoCi0JCQkJCWJ1cyhwcml2KSwgMHg4MDAwMDAsIHByaXYtPndvd2xhbl9zcmFtLAotCQkJCQlwcml2LT51Y29kZV93b3dsYW4uZGF0YS5sZW4gLyA0KTsKLQkJfQotI2VuZGlmCi0JfQotCi0JLyogd2UnbGwgY2xlYXIgY3R4LT52aWYgZHVyaW5nIGl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQoKSAqLwotCXZpZiA9IGN0eC0+dmlmOwotCi0JcHJpdi0+c2hyZC0+d293bGFuID0gZmFsc2U7Ci0KLQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoYnVzKHByaXYpLT5kZXYsIGZhbHNlKTsKLQotCWl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQocHJpdik7Ci0KLQltZW1zZXQoKHZvaWQgKikmY3R4LT5hY3RpdmUsIDAsIHNpemVvZihjdHgtPmFjdGl2ZSkpOwotCWl3bF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHByaXYsIGN0eCk7Ci0JaXdsYWduX3NldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7Ci0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCWllZWU4MDIxMV9yZXN1bWVfZGlzY29ubmVjdCh2aWYpOwotCi0JcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgaXdsYWduX21hY190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCUlXTF9ERUJVR19NQUNEVU1QKHByaXYsICJlbnRlclxuIik7Ci0KLQlJV0xfREVCVUdfVFgocHJpdiwgImRldi0+eG1pdCglZCBieXRlcykgYXQgcmF0ZSAweCUwMnhcbiIsIHNrYi0+bGVuLAotCQkgICAgIGllZWU4MDIxMV9nZXRfdHhfcmF0ZShodywgSUVFRTgwMjExX1NLQl9DQihza2IpKS0+Yml0cmF0ZSk7Ci0KLQlpZiAoaXdsYWduX3R4X3NrYihwcml2LCBza2IpKQotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCi0JSVdMX0RFQlVHX01BQ0RVTVAocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX21hY191cGRhdGVfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJICAgICAgIHUzMiBpdjMyLCB1MTYgKnBoYXNlMWtleSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCWl3bF91cGRhdGVfdGtpcF9rZXkocHJpdiwgdmlmLCBrZXljb25mLCBzdGEsIGl2MzIsIHBoYXNlMWtleSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX21hY19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSB2aWZfcHJpdi0+Y3R4OwotCWludCByZXQ7Ci0JYm9vbCBpc19kZWZhdWx0X3dlcF9rZXkgPSBmYWxzZTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnN3X2NyeXB0bykgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gaHdjcnlwdG8gZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0Jc3dpdGNoIChrZXktPmNpcGhlcikgewotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBXZSBjb3VsZCBwcm9ncmFtIHRoZXNlIGtleXMgaW50byB0aGUgaGFyZHdhcmUgYXMgd2VsbCwgYnV0IHdlCi0JICogZG9uJ3QgZXhwZWN0IG11Y2ggbXVsdGljYXN0IHRyYWZmaWMgaW4gSUJTUyBhbmQgaGF2aW5nIGtleXMKLQkgKiBmb3IgbW9yZSBzdGF0aW9ucyBpcyBwcm9iYWJseSBtb3JlIHVzZWZ1bC4KLQkgKgotCSAqIE1hcmsga2V5IFRYLW9ubHkgYW5kIHJldHVybiAwLgotCSAqLwotCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKLQkgICAgIShrZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSkgewotCQlrZXktPmh3X2tleV9pZHggPSBXRVBfSU5WQUxJRF9PRkZTRVQ7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIElmIHRoZXkga2V5IHdhcyBUWC1vbmx5LCBhY2NlcHQgZGVsZXRpb24gKi8KLQlpZiAoY21kID09IERJU0FCTEVfS0VZICYmIGtleS0+aHdfa2V5X2lkeCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQpCi0JCXJldHVybiAwOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCWl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDEwMCk7Ci0KLQlCVUlMRF9CVUdfT04oV0VQX0lOVkFMSURfT0ZGU0VUID09IElXTEFHTl9IV19LRVlfREVGQVVMVCk7Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBnZXR0aW5nIFdFUCBncm91cCBrZXkgYW5kIHdlIGRpZG4ndCByZWNlaXZlIGFueSBrZXkgbWFwcGluZwotCSAqIHNvIGZhciwgd2UgYXJlIGluIGxlZ2FjeSB3ZXAgbW9kZSAoZ3JvdXAga2V5IG9ubHkpLCBvdGhlcndpc2Ugd2UgYXJlCi0JICogaW4gMVggbW9kZS4KLQkgKiBJbiBsZWdhY3kgd2VwIG1vZGUsIHdlIHVzZSBhbm90aGVyIGhvc3QgY29tbWFuZCB0byB0aGUgdUNvZGUuCi0JICovCi0JaWYgKChrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCSAgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSAmJiAhc3RhKSB7Ci0JCWlmIChjbWQgPT0gU0VUX0tFWSkKLQkJCWlzX2RlZmF1bHRfd2VwX2tleSA9ICFjdHgtPmtleV9tYXBwaW5nX2tleXM7Ci0JCWVsc2UKLQkJCWlzX2RlZmF1bHRfd2VwX2tleSA9Ci0JCQkJa2V5LT5od19rZXlfaWR4ID09IElXTEFHTl9IV19LRVlfREVGQVVMVDsKLQl9Ci0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTRVRfS0VZOgotCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KSB7Ci0JCQlyZXQgPSBpd2xfc2V0X2RlZmF1bHRfd2VwX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LCBrZXkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0ID0gaXdsX3NldF9keW5hbWljX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LCBrZXksIHN0YSk7Ci0JCWlmIChyZXQpIHsKLQkJCS8qCi0JCQkgKiBjYW4ndCBhZGQga2V5IGZvciBSWCwgYnV0IHdlIGRvbid0IG5lZWQgaXQKLQkJCSAqIGluIHRoZSBkZXZpY2UgZm9yIFRYIHNvIHN0aWxsIHJldHVybiAwCi0JCQkgKi8KLQkJCXJldCA9IDA7Ci0JCQlrZXktPmh3X2tleV9pZHggPSBXRVBfSU5WQUxJRF9PRkZTRVQ7Ci0JCX0KLQotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOwotCQlicmVhazsKLQljYXNlIERJU0FCTEVfS0VZOgotCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KQotCQkJcmV0ID0gaXdsX3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkocHJpdiwgY3R4LCBrZXkpOwotCQllbHNlCi0JCQlyZXQgPSBpd2xfcmVtb3ZlX2R5bmFtaWNfa2V5KHByaXYsIGN0eCwga2V5LCBzdGEpOwotCi0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZGlzYWJsZSBod2NyeXB0byBrZXlcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbiwKLQkJCQkgICB1OCBidWZfc2l6ZSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKSBzdGEtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAgaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7Ci0KLQlJV0xfREVCVUdfSFQocHJpdiwgIkEtTVBEVSBhY3Rpb24gb24gYWRkciAlcE0gdGlkICVkXG4iLAotCQkgICAgIHN0YS0+YWRkciwgdGlkKTsKLQotCWlmICghKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkpCi0JCXJldHVybiAtRUFDQ0VTOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdGFydCBSeFxuIik7Ci0JCXJldCA9IGl3bF9zdGFfcnhfYWdnX3N0YXJ0KHByaXYsIHN0YSwgdGlkLCAqc3NuKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdG9wIFJ4XG4iKTsKLQkJcmV0ID0gaXdsX3N0YV9yeF9hZ2dfc3RvcChwcml2LCBzdGEsIHRpZCk7Ci0JCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkKLQkJCXJldCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOgotCQlJV0xfREVCVUdfSFQocHJpdiwgInN0YXJ0IFR4XG4iKTsKLQkJcmV0ID0gaXdsYWduX3R4X2FnZ19zdGFydChwcml2LCB2aWYsIHN0YSwgdGlkLCBzc24pOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QOgotCQlJV0xfREVCVUdfSFQocHJpdiwgInN0b3AgVHhcbiIpOwotCQlyZXQgPSBpd2xhZ25fdHhfYWdnX3N0b3AocHJpdiwgdmlmLCBzdGEsIHRpZCk7Ci0JCWlmICgocmV0ID09IDApICYmIChwcml2LT5hZ2dfdGlkc19jb3VudCA+IDApKSB7Ci0JCQlwcml2LT5hZ2dfdGlkc19jb3VudC0tOwotCQkJSVdMX0RFQlVHX0hUKHByaXYsICJwcml2LT5hZ2dfdGlkc19jb3VudCA9ICV1XG4iLAotCQkJCSAgICAgcHJpdi0+YWdnX3RpZHNfY291bnQpOwotCQl9Ci0JCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkKLQkJCXJldCA9IDA7Ci0JCWlmICghcHJpdi0+YWdnX3RpZHNfY291bnQgJiYgcHJpdi0+Y2ZnLT5odF9wYXJhbXMgJiYKLQkJICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbikgewotCQkJLyoKLQkJCSAqIHN3aXRjaCBvZmYgUlRTL0NUUyBpZiBpdCB3YXMgcHJldmlvdXNseSBlbmFibGVkCi0JCQkgKi8KLQkJCXN0YV9wcml2LT5scV9zdGEubHEuZ2VuZXJhbF9wYXJhbXMuZmxhZ3MgJj0KLQkJCQl+TElOS19RVUFMX0ZMQUdTX1NFVF9TVEFfVExDX1JUU19NU0s7Ci0JCQlpd2xfc2VuZF9scV9jbWQocHJpdiwgaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZiksCi0JCQkJCSZzdGFfcHJpdi0+bHFfc3RhLmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKLQkJfQotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTDoKLQkJYnVmX3NpemUgPSBtaW5fdChpbnQsIGJ1Zl9zaXplLCBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRik7Ci0KLQkJaXdsX3RyYW5zX3R4X2FnZ19zZXR1cCh0cmFucyhwcml2KSwgY3R4LT5jdHhpZCwgaXdsX3N0YV9pZChzdGEpLAotCQkJCXRpZCwgYnVmX3NpemUpOwotCi0JCS8qCi0JCSAqIElmIHRoZSBsaW1pdCBpcyAwLCB0aGVuIGl0IHdhc24ndCBpbml0aWFsaXNlZCB5ZXQsCi0JCSAqIHVzZSB0aGUgZGVmYXVsdC4gV2UgY2FuIGRvIHRoYXQgc2luY2Ugd2UgdGFrZSB0aGUKLQkJICogbWluaW11bSBiZWxvdywgYW5kIHdlIGRvbid0IHdhbnQgdG8gZ28gYWJvdmUgb3VyCi0JCSAqIGRlZmF1bHQgZHVlIHRvIGhhcmR3YXJlIHJlc3RyaWN0aW9ucy4KLQkJICovCi0JCWlmIChzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplID09IDApCi0JCQlzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplID0KLQkJCQlMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKLQotCQkvKgotCQkgKiBFdmVuIHRob3VnaCBpbiB0aGVvcnkgdGhlIHBlZXIgY291bGQgaGF2ZSBkaWZmZXJlbnQKLQkJICogYWdncmVnYXRpb24gcmVvcmRlciBidWZmZXIgc2l6ZXMgZm9yIGRpZmZlcmVudCBzZXNzaW9ucywKLQkJICogb3VyIHVjb2RlIGRvZXNuJ3QgYWxsb3cgZm9yIHRoYXQgYW5kIGhhcyBhIGdsb2JhbCBsaW1pdAotCQkgKiBmb3IgZWFjaCBzdGF0aW9uLiBUaGVyZWZvcmUsIHVzZSB0aGUgbWluaW11bSBvZiBhbGwgdGhlCi0JCSAqIGFnZ3JlZ2F0aW9uIHNlc3Npb25zIGFuZCBvdXIgZGVmYXVsdCB2YWx1ZS4KLQkJICovCi0JCXN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemUgPQotCQkJbWluKHN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemUsIGJ1Zl9zaXplKTsKLQotCQlpZiAocHJpdi0+Y2ZnLT5odF9wYXJhbXMgJiYKLQkJICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbikgewotCQkJLyoKLQkJCSAqIHN3aXRjaCB0byBSVFMvQ1RTIGlmIGl0IGlzIHRoZSBwcmVmZXIgcHJvdGVjdGlvbgotCQkJICogbWV0aG9kIGZvciBIVCB0cmFmZmljCi0JCQkgKi8KLQotCQkJc3RhX3ByaXYtPmxxX3N0YS5scS5nZW5lcmFsX3BhcmFtcy5mbGFncyB8PQotCQkJCUxJTktfUVVBTF9GTEFHU19TRVRfU1RBX1RMQ19SVFNfTVNLOwotCQl9Ci0JCXByaXYtPmFnZ190aWRzX2NvdW50Kys7Ci0JCUlXTF9ERUJVR19IVChwcml2LCAicHJpdi0+YWdnX3RpZHNfY291bnQgPSAldVxuIiwKLQkJCSAgICAgcHJpdi0+YWdnX3RpZHNfY291bnQpOwotCi0JCXN0YV9wcml2LT5scV9zdGEubHEuYWdnX3BhcmFtcy5hZ2dfZnJhbWVfY250X2xpbWl0ID0KLQkJCXN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemU7Ci0KLQkJaXdsX3NlbmRfbHFfY21kKHByaXYsIGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLAotCQkJCSZzdGFfcHJpdi0+bHFfc3RhLmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKLQotCQlJV0xfSU5GTyhwcml2LCAiVHggYWdncmVnYXRpb24gZW5hYmxlZCBvbiByYSA9ICVwTSB0aWQgPSAlZFxuIiwKLQkJCSBzdGEtPmFkZHIsIHRpZCk7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCX0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlib29sIGlzX2FwID0gdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0JaW50IHJldCA9IDA7Ci0JdTggc3RhX2lkOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJyZWNlaXZlZCByZXF1ZXN0IHRvIGFkZCBzdGF0aW9uICVwTVxuIiwKLQkJCXN0YS0+YWRkcik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJwcm9jZWVkaW5nIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwKLQkJCXN0YS0+YWRkcik7Ci0Jc3RhX3ByaXYtPnN0YV9pZCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQlhdG9taWNfc2V0KCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMsIDApOwotCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCi0JCXN0YV9wcml2LT5jbGllbnQgPSB0cnVlOwotCi0JcmV0ID0gaXdsX2FkZF9zdGF0aW9uX2NvbW1vbihwcml2LCB2aWZfcHJpdi0+Y3R4LCBzdGEtPmFkZHIsCi0JCQkJICAgICBpc19hcCwgc3RhLCAmc3RhX2lkKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE0gKCVkKVxuIiwKLQkJCXN0YS0+YWRkciwgcmV0KTsKLQkJLyogU2hvdWxkIHdlIHJldHVybiBzdWNjZXNzIGlmIHJldHVybiBjb2RlIGlzIEVFWElTVCA/ICovCi0JCWdvdG8gb3V0OwotCX0KLQotCXN0YV9wcml2LT5zdGFfaWQgPSBzdGFfaWQ7Ci0KLQkvKiBJbml0aWFsaXplIHJhdGUgc2NhbGluZyAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXppbmcgcmF0ZSBzY2FsaW5nIGZvciBzdGF0aW9uICVwTVxuIiwKLQkJICAgICAgIHN0YS0+YWRkcik7Ci0JaXdsX3JzX3JhdGVfaW5pdChwcml2LCBzdGEsIHN0YV9pZCk7Ci0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX21hY19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNoX3N3aXRjaC0+Y2hhbm5lbDsKLQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZzsKLQkvKgotCSAqIE1VTFRJLUZJWE1FCi0JICogV2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW50ZXJmYWNlcywgd2UgbmVlZCB0bwotCSAqIHJldmlzaXQgdGhpcy4gVGhlIGNoYW5uZWwgc3dpdGNoIGNvbW1hbmQgaW4gdGhlIGRldmljZQotCSAqIG9ubHkgYWZmZWN0cyB0aGUgQlNTIGNvbnRleHQsIGJ1dCB3aGF0IGRvZXMgdGhhdCByZWFsbHkKLQkgKiBtZWFuPyBBbmQgd2hhdCBpZiB3ZSBnZXQgYSBDU0Egb24gdGhlIHNlY29uZCBpbnRlcmZhY2U/Ci0JICogVGhpcyBuZWVkcyBhIGxvdCBvZiB3b3JrLgotCSAqLwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0JdTE2IGNoOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAoaXdsX2lzX3Jma2lsbChwcml2LT5zaHJkKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCFpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoIXByaXYtPmNmZy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gpCi0JCWdvdG8gb3V0OwotCi0JY2ggPSBjaGFubmVsLT5od192YWx1ZTsKLQlpZiAobGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCkgPT0gY2gpCi0JCWdvdG8gb3V0OwotCi0JY2hfaW5mbyA9IGl3bF9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGNoYW5uZWwtPmJhbmQsIGNoKTsKLQlpZiAoIWlzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJpbnZhbGlkIGNoYW5uZWxcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxKCZwcml2LT5zaHJkLT5sb2NrKTsKLQotCXByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBjb25mLT5zbXBzX21vZGU7Ci0KLQkvKiBDb25maWd1cmUgSFQ0MCBjaGFubmVscyAqLwotCWN0eC0+aHQuZW5hYmxlZCA9IGNvbmZfaXNfaHQoY29uZik7Ci0JaWYgKGN0eC0+aHQuZW5hYmxlZCkKLQkJaXdsYWduX2NvbmZpZ19odDQwKGNvbmYsIGN0eCk7Ci0JZWxzZQotCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0KLQlpZiAoKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSAhPSBjaCkpCi0JCWN0eC0+c3RhZ2luZy5mbGFncyA9IDA7Ci0KLQlpd2xfc2V0X3J4b25fY2hhbm5lbChwcml2LCBjaGFubmVsLCBjdHgpOwotCWl3bF9zZXRfcnhvbl9odChwcml2LCBodF9jb25mKTsKLQlpd2xfc2V0X2ZsYWdzX2Zvcl9iYW5kKHByaXYsIGN0eCwgY2hhbm5lbC0+YmFuZCwgY3R4LT52aWYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5zaHJkLT5sb2NrKTsKLQotCWl3bF9zZXRfcmF0ZShwcml2KTsKLQkvKgotCSAqIGF0IHRoaXMgcG9pbnQsIHN0YWdpbmdfcnhvbiBoYXMgdGhlCi0JICogY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCBzd2l0Y2gKLQkgKi8KLQlzZXRfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKTsKLQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKLQlpZiAocHJpdi0+Y2ZnLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LCBjaF9zd2l0Y2gpKSB7Ci0JCWNsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7Ci0JCXByaXYtPnN3aXRjaF9jaGFubmVsID0gMDsKLQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKLQl9Ci0KLW91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAotCQkJCSAgICB1NjQgbXVsdGljYXN0KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCV9fbGUzMiBmaWx0ZXJfb3IgPSAwLCBmaWx0ZXJfbmFuZCA9IDA7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotI2RlZmluZSBDSEsodGVzdCwgZmxhZykJZG8geyBcCi0JaWYgKCp0b3RhbF9mbGFncyAmICh0ZXN0KSkJCVwKLQkJZmlsdGVyX29yIHw9IChmbGFnKTsJCVwKLQllbHNlCQkJCQlcCi0JCWZpbHRlcl9uYW5kIHw9IChmbGFnKTsJCVwKLQl9IHdoaWxlICgwKQotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsCi0JCQljaGFuZ2VkX2ZsYWdzLCAqdG90YWxfZmxhZ3MpOwotCi0JQ0hLKEZJRl9PVEhFUl9CU1MgfCBGSUZfUFJPTUlTQ19JTl9CU1MsIFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKLQkvKiBTZXR0aW5nIF9qdXN0XyBSWE9OX0ZJTFRFUl9DVEwySE9TVF9NU0sgY2F1c2VzIEZIIGVycm9ycyAqLwotCUNISyhGSUZfQ09OVFJPTCwgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIHwgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOwotCUNISyhGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQywgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0spOwotCi0jdW5kZWYgQ0hLCi0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5maWx0ZXJfbmFuZDsKLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBmaWx0ZXJfb3I7Ci0KLQkJLyoKLQkJICogTm90IGNvbW1pdHRpbmcgZGlyZWN0bHkgYmVjYXVzZSBoYXJkd2FyZSBjYW4gcGVyZm9ybSBhIHNjYW4sCi0JCSAqIGJ1dCB3ZSdsbCBldmVudHVhbGx5IGNvbW1pdCB0aGUgZmlsdGVyIGZsYWdzIGNoYW5nZSBhbnl3YXkuCi0JCSAqLwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JLyoKLQkgKiBSZWNlaXZpbmcgYWxsIG11bHRpY2FzdCBmcmFtZXMgaXMgYWx3YXlzIGVuYWJsZWQgYnkgdGhlCi0JICogZGVmYXVsdCBmbGFncyBzZXR1cCBpbiBpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZygpCi0JICogc2luY2Ugd2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHByb2dyYW1taW5nIG11bHRpY2FzdAotCSAqIGZpbHRlcnMgaW50byB0aGUgZGV2aWNlLgotCSAqLwotCSp0b3RhbF9mbGFncyAmPSBGSUZfT1RIRVJfQlNTIHwgRklGX0FMTE1VTFRJIHwgRklGX1BST01JU0NfSU5fQlNTIHwKLQkJCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwgRklGX0NPTlRST0w7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl9tYWNfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZHJvcCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKIAotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfVFgocHJpdiwgIkFib3J0aW5nIGZsdXNoIGR1ZSB0byBkZXZpY2Ugc2h1dGRvd25cbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChpd2xfaXNfcmZraWxsKHByaXYtPnNocmQpKSB7Ci0JCUlXTF9ERUJVR19UWChwcml2LCAiQWJvcnRpbmcgZmx1c2ggZHVlIHRvIFJGIEtpbGxcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQogCi0JLyoKLQkgKiBtYWM4MDIxMSB3aWxsIG5vdCBwdXNoIGFueSBtb3JlIGZyYW1lcyBmb3IgdHJhbnNtaXQKLQkgKiB1bnRpbCB0aGUgZmx1c2ggaXMgY29tcGxldGVkCi0JICovCi0JaWYgKGRyb3ApIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJzZW5kIGZsdXNoIGNvbW1hbmRcbiIpOwotCQlpZiAoaXdsYWduX3R4Zmlmb19mbHVzaChwcml2LCBJV0xfRFJPUF9BTEwpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJmbHVzaCByZXF1ZXN0IGZhaWxcbiIpOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAid2FpdCB0cmFuc21pdC9mbHVzaCBhbGwgZnJhbWVzXG4iKTsKLQlpd2xfdHJhbnNfd2FpdF90eF9xdWV1ZV9lbXB0eSh0cmFucyhwcml2KSk7Ci1kb25lOgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQogCiB2b2lkIGl3bGFnbl9kaXNhYmxlX3JvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CkBAIC0yNzU4LDE2MCArMTQ4OSw2IEBACiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CiB9CiAKLXN0YXRpYyBpbnQgaXdsYWduX21hY19yZW1haW5fb25fY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQkgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAotCQkJCSAgICAgaW50IGR1cmF0aW9uKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX1BBTl07Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAoIShwcml2LT5zaHJkLT52YWxpZF9jb250ZXh0cyAmIEJJVChJV0xfUlhPTl9DVFhfUEFOKSkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCWlmICghKGN0eC0+aW50ZXJmYWNlX21vZGVzICYgQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpKSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXByaXYtPmh3X3JvY19jaGFubmVsID0gY2hhbm5lbDsKLQlwcml2LT5od19yb2NfY2hhbnR5cGUgPSBjaGFubmVsX3R5cGU7Ci0JcHJpdi0+aHdfcm9jX2R1cmF0aW9uID0gZHVyYXRpb247Ci0JcHJpdi0+aHdfcm9jX3N0YXJ0X25vdGlmaWVkID0gZmFsc2U7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aHdfcm9jX2Rpc2FibGVfd29yayk7Ci0KLQlpZiAoIWN0eC0+aXNfYWN0aXZlKSB7Ci0JCWN0eC0+aXNfYWN0aXZlID0gdHJ1ZTsKLQkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gUlhPTl9ERVZfVFlQRV9QMlA7Ci0JCW1lbWNweShjdHgtPnN0YWdpbmcubm9kZV9hZGRyLAotCQkgICAgICAgcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uc3RhZ2luZy5ub2RlX2FkZHIsCi0JCSAgICAgICBFVEhfQUxFTik7Ci0JCW1lbWNweShjdHgtPnN0YWdpbmcuYnNzaWRfYWRkciwKLQkJICAgICAgIHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnN0YWdpbmcubm9kZV9hZGRyLAotCQkgICAgICAgRVRIX0FMRU4pOwotCQllcnIgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0OwotCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSyB8Ci0JCQkJCSAgICAgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0sgfAotCQkJCQkgICAgIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSzsKLQotCQllcnIgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQkJaWYgKGVycikgewotCQkJaXdsYWduX2Rpc2FibGVfcm9jKHByaXYpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJcHJpdi0+aHdfcm9jX3NldHVwID0gdHJ1ZTsKLQl9Ci0KLQllcnIgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCBjdHgtPnZpZiwgSVdMX1NDQU5fUk9DLCBjaGFubmVsLT5iYW5kKTsKLQlpZiAoZXJyKQotCQlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7Ci0KLSBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JaWYgKCEocHJpdi0+c2hyZC0+dmFsaWRfY29udGV4dHMgJiBCSVQoSVdMX1JYT05fQ1RYX1BBTikpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgcHJpdi0+aHdfcm9jX2R1cmF0aW9uKTsKLQlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX3R4X3N5bmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgICAgY29uc3QgdTggKmJzc2lkLAotCQkJICAgICAgZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHR5cGUpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHZpZl9wcml2LT5jdHg7Ci0JaW50IHJldDsKLQl1OCBzdGFfaWQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAoaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKLQkJcmV0ID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGN0eC0+cHJlYXV0aF9ic3NpZCB8fCB0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBpd2xfYWRkX3N0YXRpb25fY29tbW9uKHByaXYsIGN0eCwgYnNzaWQsIHRydWUsIE5VTEwsICZzdGFfaWQpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JaWYgKFdBUk5fT04oc3RhX2lkICE9IGN0eC0+YXBfc3RhX2lkKSkgewotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dF9yZW1vdmVfc3RhOwotCX0KLQotCW1lbWNweShjdHgtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwotCWN0eC0+cHJlYXV0aF9ic3NpZCA9IHRydWU7Ci0KLQlyZXQgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCWlmIChyZXQgPT0gMCkKLQkJZ290byBvdXQ7Ci0KLSBvdXRfcmVtb3ZlX3N0YToKLQlpd2xfcmVtb3ZlX3N0YXRpb24ocHJpdiwgc3RhX2lkLCBic3NpZCk7Ci0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX21hY19maW5pc2hfdHhfc3luYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgIGNvbnN0IHU4ICpic3NpZCwKLQkJCQkgICBlbnVtIGllZWU4MDIxMV90eF9zeW5jX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmIChpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKLQkJZ290byBvdXQ7Ci0KLQlpd2xfcmVtb3ZlX3N0YXRpb24ocHJpdiwgY3R4LT5hcF9zdGFfaWQsIGJzc2lkKTsKLQljdHgtPnByZWF1dGhfYnNzaWQgPSBmYWxzZTsKLQkvKiBubyBuZWVkIHRvIGNvbW1pdCAqLwotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyZG93bgpAQCAtMjk5OCw2ICsxNTc1LDggQEAKIAogCW11dGV4X2luaXQoJnByaXYtPnNocmQtPm11dGV4KTsKIAorCUlOSVRfTElTVF9IRUFEKCZwcml2LT5jYWxpYl9yZXN1bHRzKTsKKwogCXByaXYtPmllZWVfY2hhbm5lbHMgPSBOVUxMOwogCXByaXYtPmllZWVfcmF0ZXMgPSBOVUxMOwogCXByaXYtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwpAQCAtMzA2MSw4MSArMTY0MCwxMyBAQAogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocHJpdi0+dHhfY21kX3Bvb2wpOwogCWtmcmVlKHByaXYtPnNjYW5fY21kKTsKIAlrZnJlZShwcml2LT5iZWFjb25fY21kKTsKKwlrZnJlZShyY3VfZGVyZWZlcmVuY2VfcmF3KHByaXYtPm5vYV9kYXRhKSk7CiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogCWtmcmVlKHByaXYtPndvd2xhbl9zcmFtKTsKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3Jzc2lfY2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50IHJzc2lfZXZlbnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CiAKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkJCXByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KSB7Ci0JCWlmIChyc3NpX2V2ZW50ID09IFJTU0lfRVZFTlRfTE9XKQotCQkJcHJpdi0+YnRfZW5hYmxlX3BzcG9sbCA9IHRydWU7Ci0JCWVsc2UgaWYgKHJzc2lfZXZlbnQgPT0gUlNTSV9FVkVOVF9ISUdIKQotCQkJcHJpdi0+YnRfZW5hYmxlX3BzcG9sbCA9IGZhbHNlOwotCi0JCWl3bGFnbl9zZW5kX2FkdmFuY2VfYnRfY29uZmlnKHByaXYpOwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiQWR2YW5jZWQgQlQgY29leCBkaXNhYmxlZCwiCi0JCQkJImlnbm9yaW5nIFJTU0kgY2FsbGJhY2tcbiIpOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfc2V0X3RpbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGJvb2wgc2V0KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JcXVldWVfd29yayhwcml2LT5zaHJkLT53b3JrcXVldWUsICZwcml2LT5iZWFjb25fdXBkYXRlKTsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgaWVlZTgwMjExX29wcyBpd2xhZ25faHdfb3BzID0gewotCS50eCA9IGl3bGFnbl9tYWNfdHgsCi0JLnN0YXJ0ID0gaXdsYWduX21hY19zdGFydCwKLQkuc3RvcCA9IGl3bGFnbl9tYWNfc3RvcCwKLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLQkuc3VzcGVuZCA9IGl3bGFnbl9tYWNfc3VzcGVuZCwKLQkucmVzdW1lID0gaXdsYWduX21hY19yZXN1bWUsCi0jZW5kaWYKLQkuYWRkX2ludGVyZmFjZSA9IGl3bGFnbl9tYWNfYWRkX2ludGVyZmFjZSwKLQkucmVtb3ZlX2ludGVyZmFjZSA9IGl3bGFnbl9tYWNfcmVtb3ZlX2ludGVyZmFjZSwKLQkuY2hhbmdlX2ludGVyZmFjZSA9IGl3bGFnbl9tYWNfY2hhbmdlX2ludGVyZmFjZSwKLQkuY29uZmlnID0gaXdsYWduX21hY19jb25maWcsCi0JLmNvbmZpZ3VyZV9maWx0ZXIgPSBpd2xhZ25fY29uZmlndXJlX2ZpbHRlciwKLQkuc2V0X2tleSA9IGl3bGFnbl9tYWNfc2V0X2tleSwKLQkudXBkYXRlX3RraXBfa2V5ID0gaXdsYWduX21hY191cGRhdGVfdGtpcF9rZXksCi0JLnNldF9yZWtleV9kYXRhID0gaXdsYWduX21hY19zZXRfcmVrZXlfZGF0YSwKLQkuY29uZl90eCA9IGl3bGFnbl9tYWNfY29uZl90eCwKLQkuYnNzX2luZm9fY2hhbmdlZCA9IGl3bGFnbl9ic3NfaW5mb19jaGFuZ2VkLAotCS5hbXBkdV9hY3Rpb24gPSBpd2xhZ25fbWFjX2FtcGR1X2FjdGlvbiwKLQkuaHdfc2NhbiA9IGl3bGFnbl9tYWNfaHdfc2NhbiwKLQkuc3RhX25vdGlmeSA9IGl3bGFnbl9tYWNfc3RhX25vdGlmeSwKLQkuc3RhX2FkZCA9IGl3bGFnbl9tYWNfc3RhX2FkZCwKLQkuc3RhX3JlbW92ZSA9IGl3bGFnbl9tYWNfc3RhX3JlbW92ZSwKLQkuY2hhbm5lbF9zd2l0Y2ggPSBpd2xhZ25fbWFjX2NoYW5uZWxfc3dpdGNoLAotCS5mbHVzaCA9IGl3bGFnbl9tYWNfZmx1c2gsCi0JLnR4X2xhc3RfYmVhY29uID0gaXdsYWduX21hY190eF9sYXN0X2JlYWNvbiwKLQkucmVtYWluX29uX2NoYW5uZWwgPSBpd2xhZ25fbWFjX3JlbWFpbl9vbl9jaGFubmVsLAotCS5jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwgPSBpd2xhZ25fbWFjX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbCwKLQkucnNzaV9jYWxsYmFjayA9IGl3bGFnbl9tYWNfcnNzaV9jYWxsYmFjaywKLQlDRkc4MDIxMV9URVNUTU9ERV9DTUQoaXdsYWduX21hY190ZXN0bW9kZV9jbWQpCi0JQ0ZHODAyMTFfVEVTVE1PREVfRFVNUChpd2xhZ25fbWFjX3Rlc3Rtb2RlX2R1bXApCi0JLnR4X3N5bmMgPSBpd2xhZ25fbWFjX3R4X3N5bmMsCi0JLmZpbmlzaF90eF9zeW5jID0gaXdsYWduX21hY19maW5pc2hfdHhfc3luYywKLQkuc2V0X3RpbSA9IGl3bGFnbl9tYWNfc2V0X3RpbSwKLX07CiAKIHN0YXRpYyB1MzIgaXdsX2h3X2RldGVjdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CkBAIC0zMTY5LDI2ICsxNjgwLDM1IEBACiAJcmV0dXJuIHByaXYtPmNmZy0+bGliLT5zZXRfaHdfcGFyYW1zKHByaXYpOwogfQogCi0vKiBUaGlzIGZ1bmN0aW9uIGJvdGggYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBodyBhbmQgcHJpdi4gKi8KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfYWxsb2NfYWxsKHN0cnVjdCBpd2xfY2ZnICpjZmcpCisKKworc3RhdGljIHZvaWQgaXdsX2RlYnVnX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OwotCS8qIG1hYzgwMjExIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoaXMgZGV2aWNlIGluc3RhbmNlLCBpbmNsdWRpbmcKLQkgKiAgIHNwYWNlIGZvciB0aGlzIGRyaXZlcidzIHByaXZhdGUgc3RydWN0dXJlICovCi0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sIGJ1cyhwcml2KS0+ZGV2LCAiQ09ORklHX0lXTFdJRklfREVCVUcgIgorI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCisJCSJlbmFibGVkXG4iKTsKKyNlbHNlCisJCSJkaXNhYmxlZFxuIik7CisjZW5kaWYKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgYnVzKHByaXYpLT5kZXYsICJDT05GSUdfSVdMV0lGSV9ERUJVR0ZTICIKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCisJCSJlbmFibGVkXG4iKTsKKyNlbHNlCisJCSJkaXNhYmxlZFxuIik7CisjZW5kaWYKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgYnVzKHByaXYpLT5kZXYsICJDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVFJBQ0lORyAiCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcKKwkJImVuYWJsZWRcbiIpOworI2Vsc2UKKwkJImRpc2FibGVkXG4iKTsKKyNlbmRpZgogCi0JaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBpd2xfcHJpdiksICZpd2xhZ25faHdfb3BzKTsKLQlpZiAoaHcgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBDYW4gbm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iLAotCQkgICAgICAgY2ZnLT5uYW1lKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcHJpdiA9IGh3LT5wcml2OwotCXByaXYtPmh3ID0gaHc7Ci0KLW91dDoKLQlyZXR1cm4gaHc7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sIGJ1cyhwcml2KS0+ZGV2LCAiQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTCAiCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTAorCQkiZW5hYmxlZFxuIik7CisjZWxzZQorCQkiZGlzYWJsZWRcbiIpOworI2VuZGlmCiB9CiAKIGludCBpd2xfcHJvYmUoc3RydWN0IGl3bF9idXMgKmJ1cywgY29uc3Qgc3RydWN0IGl3bF90cmFuc19vcHMgKnRyYW5zX29wcywKQEAgLTMyMDMsOCArMTcyMyw5IEBACiAJLyoqKioqKioqKioqKioqKioqKioqKioqKgogCSAqIDEuIEFsbG9jYXRpbmcgSFcgZGF0YQogCSAqKioqKioqKioqKioqKioqKioqKioqKiovCi0JaHcgPSBpd2xfYWxsb2NfYWxsKGNmZyk7CisJaHcgPSBpd2xfYWxsb2NfYWxsKCk7CiAJaWYgKCFodykgeworCQlwcl9lcnIoIiVzOiBDYW5ub3QgYWxsb2NhdGUgbmV0d29yayBkZXZpY2VcbiIsIGNmZy0+bmFtZSk7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMyMjUsNiArMTc0Niw5IEBACiAKIAlTRVRfSUVFRTgwMjExX0RFVihodywgYnVzKHByaXYpLT5kZXYpOwogCisJLyogd2hhdCBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzIHdlIGhhdmUgKi8KKwlpd2xfZGVidWdfY29uZmlnKHByaXYpOworCiAJSVdMX0RFQlVHX0lORk8ocHJpdiwgIioqKiBMT0FEIERSSVZFUiAqKipcbiIpOwogCXByaXYtPmNmZyA9IGNmZzsKIApAQCAtMzM5Niw3ICsxOTIwLDcgQEAKIAkvKlRoaXMgd2lsbCBzdG9wIHRoZSBxdWV1ZXMsIG1vdmUgdGhlIGRldmljZSB0byBsb3cgcG93ZXIgc3RhdGUgKi8KIAlpd2xfdHJhbnNfc3RvcF9kZXZpY2UodHJhbnMocHJpdikpOwogCi0JaXdsX2RlYWxsb2NfdWNvZGUocHJpdik7CisJaXdsX2RlYWxsb2NfdWNvZGUodHJhbnMocHJpdikpOwogCiAJaXdsX2VlcHJvbV9mcmVlKHByaXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCmluZGV4IDM4NTZhYmEuLjJmNDQ2YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCkBAIC02NSw2ICs2NSwxMiBAQAogCiAjaW5jbHVkZSAiaXdsLWRldi5oIgogCitzdHJ1Y3QgaXdsYWduX3Vjb2RlX2NhcGFiaWxpdGllcyB7CisJdTMyIG1heF9wcm9iZV9sZW5ndGg7CisJdTMyIHN0YW5kYXJkX3BoeV9jYWxpYnJhdGlvbl9zaXplOworCXUzMiBmbGFnczsKK307CisKIGV4dGVybiBzdHJ1Y3QgaWVlZTgwMjExX29wcyBpd2xhZ25faHdfb3BzOwogCiBpbnQgaXdsX3Jlc2V0X2ljdChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyk7CkBAIC03Nyw2ICs4MywxNSBAQAogCWhkci0+ZGF0YV92YWxpZCA9IDE7CiB9CiAKK3ZvaWQgX19pd2xfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwordm9pZCBpd2xfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwordm9pZCBpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisKKy8qIE1BQzgwMjExICovCitzdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfYWxsb2NfYWxsKHZvaWQpOworaW50IGl3bGFnbl9tYWNfc2V0dXBfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICAgICAgc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgKmNhcGEpOworCiAvKiBSWE9OICovCiBpbnQgaXdsYWduX3NldF9wYW5fcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBpbnQgaXdsYWduX2NvbW1pdF9yeG9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7CkBAIC05Nyw4ICsxMTIsNyBAQAogdm9pZCBpd2xhZ25fc2VuZF9wcmlvX3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bGFnbl9ydW5faW5pdF91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bGFnbl9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgZndfaW1nICppbWFnZSwKLQkJCQkgZW51bSBpd2xhZ25fdWNvZGVfdHlwZSB1Y29kZV90eXBlKTsKKwkJCQkgZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKTsKIAogLyogbGliICovCiBpbnQgaXdsYWduX3NlbmRfdHhfcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKQEAgLTEwNyw2ICsxMjEsMTIgQEAKIGludCBpd2xhZ25fdHhmaWZvX2ZsdXNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGZsdXNoX2NvbnRyb2wpOwogdm9pZCBpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiBmbHVzaF9jb250cm9sKTsKIGludCBpd2xhZ25fc2VuZF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitpbnQgaXdsYWduX3NlbmRfcGF0dGVybnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvd2xhbik7CitpbnQgaXdsYWduX3N1c3BlbmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKTsKKyNlbmRpZgogCiAvKiByeCAqLwogaW50IGl3bGFnbl9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHUzMiByYXRlX25fZmxhZ3MsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCk7CkBAIC0xOTgsOSArMjE4LDYgQEAKIAkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4ICpzdGFfaWRfcik7CiBpbnQgaXdsX3JlbW92ZV9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY29uc3QgdTggc3RhX2lkLAogCQkgICAgICAgY29uc3QgdTggKmFkZHIpOwotaW50IGl3bGFnbl9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwotCiB1OCBpd2xfcHJlcF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKIAkJICAgIGNvbnN0IHU4ICphZGRyLCBib29sIGlzX2FwLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKIApAQCAtMzE4LDEwICszMzUsNiBAQAogaW50IGl3bF91cGRhdGVfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwogaW50IGl3bF91cGRhdGVfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsYWduX21hY19zdGFfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgIGVudW0gc3RhX25vdGlmeV9jbWQgY21kLAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CiAKIC8qIHJhdGUgKi8KIHN0YXRpYyBpbmxpbmUgdTMyIGl3bF9hbnRfaWR4X3RvX2ZsYWdzKHU4IGFudF9pZHgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jZmcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNmZy5oCmluZGV4IDJhMmRjNDUuLmUxZDc4MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNmZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNmZy5oCkBAIC0xMDEsMTcgKzEwMSwxMSBAQAogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEzMF9iZ25fY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEzMF9iZ19jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMjAwMF8yYmduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDAwXzJiZ19jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMjAwMF8yYmduX2RfY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDIwMzBfMmJnbl9jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMjAzMF8yYmdfY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwMzVfMmFnbl9jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjAzNV8yYWJnX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDM1XzJiZ19jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMTA1X2JnX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDVfYmduX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDVfYmduX2RfY2ZnOwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEzNV9iZ19jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMTM1X2Jnbl9jZmc7CiAKICNlbmRpZiAvKiBfX2l3bF9wY2lfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaAppbmRleCA2OWQ1Zjg1Li5mNGVjY2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmgKQEAgLTE5OCw2ICsxOTgsNyBAQAogCVJFUExZX1dPV0xBTl9US0lQX1BBUkFNUyA9IDB4ZTMsCiAJUkVQTFlfV09XTEFOX0tFS19LQ0tfTUFURVJJQUwgPSAweGU0LAogCVJFUExZX1dPV0xBTl9HRVRfU1RBVFVTID0gMHhlNSwKKwlSRVBMWV9EM19DT05GSUcgPSAweGQzLAogCiAJUkVQTFlfTUFYID0gMHhmZgogfTsKQEAgLTM4MDEsNiArMzgwMiwxOSBAQAogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKKyAqIFJFUExZX0QzX0NPTkZJRworICovCitlbnVtIGl3bGFnbl9kM193YWtldXBfZmlsdGVycyB7CisJSVdMQUdOX0QzX1dBS0VVUF9SRktJTEwJCT0gQklUKDApLAorCUlXTEFHTl9EM19XQUtFVVBfU1lTQVNTRVJUCT0gQklUKDEpLAorfTsKKworc3RydWN0IGl3bGFnbl9kM19jb25maWdfY21kIHsKKwlfX2xlMzIgbWluX3NsZWVwX3RpbWU7CisJX19sZTMyIHdha2V1cF9mbGFnczsKK30gX19wYWNrZWQ7CisKKy8qCiAgKiBSRVBMWV9XT1dMQU5fUEFUVEVSTlMKICAqLwogI2RlZmluZSBJV0xBR05fV09XTEFOX01JTl9QQVRURVJOX0xFTgkxNgpAQCAtMzgzMCwxOSArMzg0NCwxNiBAQAogCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0JFQUNPTl9NSVNTCT0gQklUKDIpLAogCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0xJTktfQ0hBTkdFCT0gQklUKDMpLAogCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0dUS19SRUtFWV9GQUlMCT0gQklUKDQpLAotCUlXTEFHTl9XT1dMQU5fV0FLRVVQX1JGS0lMTAkJPSBCSVQoNSksCi0JSVdMQUdOX1dPV0xBTl9XQUtFVVBfVUNPREVfRVJST1IJPSBCSVQoNiksCi0JSVdMQUdOX1dPV0xBTl9XQUtFVVBfRUFQX0lERU5UX1JFUQk9IEJJVCg3KSwKLQlJV0xBR05fV09XTEFOX1dBS0VVUF80V0FZX0hBTkRTSEFLRQk9IEJJVCg4KSwKLQlJV0xBR05fV09XTEFOX1dBS0VVUF9BTFdBWVMJCT0gQklUKDkpLAotCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0VOQUJMRV9ORVRfREVURUNUCT0gQklUKDEwKSwKKwlJV0xBR05fV09XTEFOX1dBS0VVUF9FQVBfSURFTlRfUkVRCT0gQklUKDUpLAorCUlXTEFHTl9XT1dMQU5fV0FLRVVQXzRXQVlfSEFORFNIQUtFCT0gQklUKDYpLAorCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0FMV0FZUwkJPSBCSVQoNyksCisJSVdMQUdOX1dPV0xBTl9XQUtFVVBfRU5BQkxFX05FVF9ERVRFQ1QJPSBCSVQoOCksCiB9OwogCiBzdHJ1Y3QgaXdsYWduX3dvd2xhbl93YWtldXBfZmlsdGVyX2NtZCB7CiAJX19sZTMyIGVuYWJsZWQ7CiAJX19sZTE2IG5vbl9xb3Nfc2VxOwotCXU4IG1pbl9zbGVlcF9zZWNvbmRzOwotCXU4IHJlc2VydmVkOworCV9fbGUxNiByZXNlcnZlZDsKIAlfX2xlMTYgcW9zX3NlcVs4XTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYwppbmRleCBmY2Y1NDE2Li5iMjQ2MjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCkBAIC0xMTIwLDIyOSArMTEyMCw4IEBACiAJCQkJCSZzdGF0aXN0aWNzX2NtZCk7CiB9CiAKLWludCBpd2xhZ25fbWFjX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCi0JCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcTsKIAotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwogCi0JaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdi0+c2hyZCkpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIFJGIG5vdCByZWFkeVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWlmIChxdWV1ZSA+PSBBQ19OVU0pIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIHF1ZXVlID49IEFDX05VTSAlZFxuIiwgcXVldWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlxID0gQUNfTlVNIC0gMSAtIHF1ZXVlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNocmQtPmxvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogTVVMVEktRklYTUUKLQkgKiBUaGlzIG1heSBuZWVkIHRvIGJlIGRvbmUgcGVyIGludGVyZmFjZSBpbiBubDgwMjExL2NmZzgwMjExL21hYzgwMjExLgotCSAqLwotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmN3X21pbiA9Ci0JCQljcHVfdG9fbGUxNihwYXJhbXMtPmN3X21pbik7Ci0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmN3X21heCA9Ci0JCQljcHVfdG9fbGUxNihwYXJhbXMtPmN3X21heCk7Ci0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmFpZnNuID0gcGFyYW1zLT5haWZzOwotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5lZGNhX3R4b3AgPQotCQkJCWNwdV90b19sZTE2KChwYXJhbXMtPnR4b3AgKiAzMikpOwotCi0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLnJlc2VydmVkMSA9IDA7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+bG9jaywgZmxhZ3MpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2xhZ25fbWFjX3R4X2xhc3RfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JcmV0dXJuIHByaXYtPmlic3NfbWFuYWdlciA9PSBJV0xfSUJTU19NQU5BR0VSOwotfQotCi1zdGF0aWMgaW50IGl3bF9zZXRfbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcocHJpdiwgY3R4KTsKLQotCWl3bGFnbl9zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCi0JcmV0dXJuIGl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotCi1zdGF0aWMgaW50IGl3bF9zZXR1cF9pbnRlcmZhY2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCWludCBlcnI7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQkvKgotCSAqIFRoaXMgdmFyaWFibGUgd2lsbCBiZSBjb3JyZWN0IG9ubHkgd2hlbiB0aGVyZSdzIGp1c3QKLQkgKiBhIHNpbmdsZSBjb250ZXh0LCBidXQgYWxsIGNvZGUgdXNpbmcgaXQgaXMgZm9yIGhhcmR3YXJlCi0JICogdGhhdCBzdXBwb3J0cyBvbmx5IG9uZSBjb250ZXh0LgotCSAqLwotCXByaXYtPml3X21vZGUgPSB2aWYtPnR5cGU7Ci0KLQljdHgtPmlzX2FjdGl2ZSA9IHRydWU7Ci0KLQllcnIgPSBpd2xfc2V0X21vZGUocHJpdiwgY3R4KTsKLQlpZiAoZXJyKSB7Ci0JCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQotCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKLQkgICAgdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCS8qCi0JCSAqIHByZXRlbmQgdG8gaGF2ZSBoaWdoIEJUIHRyYWZmaWMgYXMgbG9uZyBhcyB3ZQotCQkgKiBhcmUgb3BlcmF0aW5nIGluIElCU1MgbW9kZSwgYXMgdGhpcyB3aWxsIGNhdXNlCi0JCSAqIHRoZSByYXRlIHNjYWxpbmcgZXRjLiB0byBiZWhhdmUgYXMgaW50ZW5kZWQuCi0JCSAqLwotCQlwcml2LT5idF90cmFmZmljX2xvYWQgPSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfSElHSDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bGFnbl9tYWNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wLCAqY3R4ID0gTlVMTDsKLQlpbnQgZXJyOwotCWVudW0gbmw4MDIxMV9pZnR5cGUgdmlmdHlwZSA9IGllZWU4MDIxMV92aWZfdHlwZV9wMnAodmlmKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXI6IHR5cGUgJWQsIGFkZHIgJXBNXG4iLAotCQkJICAgdmlmdHlwZSwgdmlmLT5hZGRyKTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+aHdfcm9jX2Rpc2FibGVfd29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7Ci0KLQlpZiAoIWl3bF9pc19yZWFkeV9yZihwcml2LT5zaHJkKSkgewotCQlJV0xfV0FSTihwcml2LCAiVHJ5IHRvIGFkZCBpbnRlcmZhY2Ugd2hlbiBkZXZpY2Ugbm90IHJlYWR5XG4iKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCB0bXApIHsKLQkJdTMyIHBvc3NpYmxlX21vZGVzID0KLQkJCXRtcC0+aW50ZXJmYWNlX21vZGVzIHwgdG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOwotCi0JCWlmICh0bXAtPnZpZikgewotCQkJLyogY2hlY2sgaWYgdGhpcyBidXN5IGNvbnRleHQgaXMgZXhjbHVzaXZlICovCi0JCQlpZiAodG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYKLQkJCQkJCUJJVCh0bXAtPnZpZi0+dHlwZSkpIHsKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIShwb3NzaWJsZV9tb2RlcyAmIEJJVCh2aWZ0eXBlKSkpCi0JCQljb250aW51ZTsKLQotCQkvKiBoYXZlIG1heWJlIHVzYWJsZSBjb250ZXh0IHcvbyBpbnRlcmZhY2UgKi8KLQkJY3R4ID0gdG1wOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIWN0eCkgewotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JdmlmX3ByaXYtPmN0eCA9IGN0eDsKLQljdHgtPnZpZiA9IHZpZjsKLQotCWVyciA9IGl3bF9zZXR1cF9pbnRlcmZhY2UocHJpdiwgY3R4KTsKLQlpZiAoIWVycikKLQkJZ290byBvdXQ7Ci0KLQljdHgtPnZpZiA9IE5VTEw7Ci0JcHJpdi0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgaXdsX3RlYXJkb3duX2ludGVyZmFjZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICBib29sIG1vZGVfY2hhbmdlKQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmIChwcml2LT5zY2FuX3ZpZiA9PSB2aWYpIHsKLQkJaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQkJaXdsX2ZvcmNlX3NjYW5fZW5kKHByaXYpOwotCX0KLQotCWlmICghbW9kZV9jaGFuZ2UpIHsKLQkJaXdsX3NldF9tb2RlKHByaXYsIGN0eCk7Ci0JCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQotCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIFdoZW4gcmVtb3ZpbmcgdGhlIElCU1MgaW50ZXJmYWNlLCBvdmVyd3JpdGUgdGhlCi0JICogQlQgdHJhZmZpYyBsb2FkIHdpdGggdGhlIHN0b3JlZCBvbmUgZnJvbSB0aGUgbGFzdAotCSAqIG5vdGlmaWNhdGlvbiwgaWYgYW55LiBJZiB0aGlzIGlzIGEgZGV2aWNlIHRoYXQKLQkgKiBkb2Vzbid0IGltcGxlbWVudCB0aGlzLCB0aGlzIGhhcyBubyBlZmZlY3Qgc2luY2UKLQkgKiBib3RoIHZhbHVlcyBhcmUgdGhlIHNhbWUgYW5kIHplcm8uCi0JICovCi0JaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJcHJpdi0+YnRfdHJhZmZpY19sb2FkID0gcHJpdi0+bGFzdF9idF90cmFmZmljX2xvYWQ7Ci19Ci0KLXZvaWQgaXdsYWduX21hY19yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmIChXQVJOX09OKGN0eC0+dmlmICE9IHZpZikpIHsKLQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKnRtcDsKLQkJSVdMX0VSUihwcml2LCAiY3R4LT52aWYgPSAlcCwgdmlmID0gJXBcbiIsIGN0eC0+dmlmLCB2aWYpOwotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkKLQkJCUlXTF9FUlIocHJpdiwgIlx0SUQgPSAlZDpcdGN0eCA9ICVwXHRjdHgtPnZpZiA9ICVwXG4iLAotCQkJCXRtcC0+Y3R4aWQsIHRtcCwgdG1wLT52aWYpOwotCX0KLQljdHgtPnZpZiA9IE5VTEw7Ci0KLQlpd2xfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgZmFsc2UpOwotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotfQogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogCkBAIC0xNjQ5LDk3ICsxNDI4LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpd2xhZ25fbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQllbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3R5cGUsIGJvb2wgbmV3cDJwKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqYnNzX2N0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wOwotCWVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dmlmdHlwZSA9IG5ld3R5cGU7Ci0JdTMyIGludGVyZmFjZV9tb2RlczsKLQlpbnQgZXJyOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQluZXd0eXBlID0gaWVlZTgwMjExX2lmdHlwZV9wMnAobmV3dHlwZSwgbmV3cDJwKTsKLQotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmICghY3R4LT52aWYgfHwgIWl3bF9pc19yZWFkeV9yZihwcml2LT5zaHJkKSkgewotCQkvKgotCQkgKiBIdWg/IEJ1dCB3YWl0IC4uLiB0aGlzIGNhbiBtYXliZSBoYXBwZW4gd2hlbgotCQkgKiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZmlybXdhcmUgcmVzdGFydCEKLQkJICovCi0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaW50ZXJmYWNlX21vZGVzID0gY3R4LT5pbnRlcmZhY2VfbW9kZXMgfCBjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7Ci0KLQlpZiAoIShpbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpKSB7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBSZWZ1c2UgYSBjaGFuZ2UgdGhhdCBzaG91bGQgYmUgZG9uZSBieSBtb3ZpbmcgZnJvbSB0aGUgUEFOCi0JICogY29udGV4dCB0byB0aGUgQlNTIGNvbnRleHQgaW5zdGVhZCwgaWYgdGhlIEJTUyBjb250ZXh0IGlzCi0JICogYXZhaWxhYmxlIGFuZCBjYW4gc3VwcG9ydCB0aGUgbmV3IGludGVyZmFjZSB0eXBlLgotCSAqLwotCWlmIChjdHgtPmN0eGlkID09IElXTF9SWE9OX0NUWF9QQU4gJiYgIWJzc19jdHgtPnZpZiAmJgotCSAgICAoYnNzX2N0eC0+aW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpIHx8Ci0JICAgICBic3NfY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpKSkgewotCQlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAyKTsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpKSB7Ci0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgdG1wKSB7Ci0JCQlpZiAoY3R4ID09IHRtcCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCF0bXAtPnZpZikKLQkJCQljb250aW51ZTsKLQotCQkJLyoKLQkJCSAqIFRoZSBjdXJyZW50IG1vZGUgc3dpdGNoIHdvdWxkIGJlIGV4Y2x1c2l2ZSwgYnV0Ci0JCQkgKiBhbm90aGVyIGNvbnRleHQgaXMgYWN0aXZlIC4uLiByZWZ1c2UgdGhlIHN3aXRjaC4KLQkJCSAqLwotCQkJZXJyID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBzdWNjZXNzICovCi0JaXdsX3RlYXJkb3duX2ludGVyZmFjZShwcml2LCB2aWYsIHRydWUpOwotCXZpZi0+dHlwZSA9IG5ld3ZpZnR5cGU7Ci0JdmlmLT5wMnAgPSBuZXdwMnA7Ci0JZXJyID0gaXdsX3NldHVwX2ludGVyZmFjZShwcml2LCBjdHgpOwotCVdBUk5fT04oZXJyKTsKLQkvKgotCSAqIFdlJ3ZlIHN3aXRjaGVkIGludGVybmFsbHksIGJ1dCBzdWJtaXR0aW5nIHRvIHRoZQotCSAqIGRldmljZSBtYXkgaGF2ZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLiBNYXNrIHRoaXMKLQkgKiBlcnJvciwgYmVjYXVzZSBvdGhlcndpc2UgbWFjODAyMTEgd2lsbCBub3Qgc3dpdGNoCi0JICogKGFuZCBzZXQgdGhlIGludGVyZmFjZSB0eXBlIGJhY2spIGFuZCB3ZSdsbCBiZQotCSAqIG91dCBvZiBzeW5jIHdpdGggaXQuCi0JICovCi0JZXJyID0gMDsKLQotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiBlcnI7Ci19CiAKIGludCBpd2xfY21kX2VjaG9fdGVzdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKIAkJLmlkID0gUkVQTFlfRUNITywKKwkJLmxlbiA9IHsgMCB9LAogCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKaW5kZXggZjJmYzI4OC4uNmRhNTNhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaApAQCAtMTg2LDggKzE4Niw5IEBACiAgKiBAaHRfcGFyYW1zOiBwb2ludCB0byBodCBwYXRhbWV0ZXJzCiAgKiBAYnRfcGFyYW1zOiBwb2ludGVyIHRvIGJ0IHBhcmFtZXRlcnMKICAqIEBwYV90eXBlOiB1c2VkIGJ5IDYwMDAgc2VyaWVzIG9ubHkgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgUG93ZXIgQW1wbGlmaWVyCi0gKiBAbmVlZF9kY19jYWxpYjogbmVlZCB0byBwZXJmb3JtIGluaXQgZGMgY2FsaWJyYXRpb24KICAqIEBuZWVkX3RlbXBfb2Zmc2V0X2NhbGliOiBuZWVkIHRvIHBlcmZvcm0gdGVtcGVyYXR1cmUgb2Zmc2V0IGNhbGlicmF0aW9uCisgKiBAbm9feHRhbF9jYWxpYjogc29tZSBkZXZpY2VzIGRvIG5vdCBuZWVkIGNyeXN0YWwgY2FsaWJyYXRpb24gZGF0YSwKKyAqCWRvbid0IHNlbmQgaXQgdG8gdGhvc2UKICAqIEBzY2FuX2FudGVubmFzOiBhdmFpbGFibGUgYW50ZW5uYSBmb3Igc2NhbiBvcGVyYXRpb24KICAqIEBsZWRfbW9kZTogMD1ibGlua2luZywgMT1PbihSRiBPbikvT2ZmKFJGIE9mZikKICAqIEBhZHZfcG06IGFkdmFuY2UgcG93ZXIgbWFuYWdlbWVudApAQCAtMjI0LDggKzIyNSw4IEBACiAJc3RydWN0IGl3bF9odF9wYXJhbXMgKmh0X3BhcmFtczsKIAlzdHJ1Y3QgaXdsX2J0X3BhcmFtcyAqYnRfcGFyYW1zOwogCWVudW0gaXdsX3BhX3R5cGUgcGFfdHlwZTsJICAvKiBpZiB1c2VkIHNldCB0byBJV0xfUEFfU1lTVEVNICovCi0JY29uc3QgYm9vbCBuZWVkX2RjX2NhbGliOwkgIC8qIGlmIHVzZWQgc2V0IHRvIHRydWUgKi8KIAljb25zdCBib29sIG5lZWRfdGVtcF9vZmZzZXRfY2FsaWI7IC8qIGlmIHVzZWQgc2V0IHRvIHRydWUgKi8KKwljb25zdCBib29sIG5vX3h0YWxfY2FsaWI7CiAJdTggc2Nhbl9yeF9hbnRlbm5hc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKIAllbnVtIGl3bF9sZWRfbW9kZSBsZWRfbW9kZTsKIAljb25zdCBib29sIGFkdl9wbTsKQEAgLTIzOSwxMCArMjQwLDYgQEAKICAqICAgTCBpIGIgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludCBpd2xhZ25fbWFjX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCi0JCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKTsKLWludCBpd2xhZ25fbWFjX3R4X2xhc3RfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHZvaWQgaXdsX3NldF9yeG9uX2h3Y3J5cHRvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKIAkJCSAgIGludCBod19kZWNyeXB0KTsKIGludCBpd2xfY2hlY2tfcnhvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKQEAgLTI2MiwxMyArMjU5LDYgQEAKIHZvaWQgaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwogdm9pZCBpd2xfc2V0X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xhZ25fbWFjX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotdm9pZCBpd2xhZ25fbWFjX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLWludCBpd2xhZ25fbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApOwogaW50IGl3bF9jbWRfZWNob190ZXN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogaW50IGl3bF9hbGxvY190cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwpAQCAtMzI1LDkgKzMxNSw2IEBACiBpbnQgaXdsX3NjYW5fY2FuY2VsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgbG9uZyBtcyk7CiB2b2lkIGl3bF9mb3JjZV9zY2FuX2VuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bGFnbl9tYWNfaHdfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpOwogdm9pZCBpd2xfaW50ZXJuYWxfc2hvcnRfaHdfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bF9mb3JjZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBtb2RlLCBib29sIGV4dGVybmFsKTsKIHUxNiBpd2xfZmlsbF9wcm9iZV9yZXEoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKmZyYW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY3NyLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jc3IuaAppbmRleCBiOWYzMjY3Li5mYmMzMDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jc3IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jc3IuaApAQCAtMjg0LDggKzI4NCw4IEBACiAjZGVmaW5lIENTUl9IV19SRVZfVFlQRV82eDM1CSAgICAgICBDU1JfSFdfUkVWX1RZUEVfNngwNQogI2RlZmluZSBDU1JfSFdfUkVWX1RZUEVfMngzMAkgICAgICAgKDB4MDAwMDBDMCkKICNkZWZpbmUgQ1NSX0hXX1JFVl9UWVBFXzJ4MDAJICAgICAgICgweDAwMDAxMDApCi0jZGVmaW5lIENTUl9IV19SRVZfVFlQRV8yMDAJICAgICAgICgweDAwMDAxMTApCi0jZGVmaW5lIENTUl9IV19SRVZfVFlQRV8yMzAJICAgICAgICgweDAwMDAxMjApCisjZGVmaW5lIENTUl9IV19SRVZfVFlQRV8xMDUJICAgICAgICgweDAwMDAxMTApCisjZGVmaW5lIENTUl9IV19SRVZfVFlQRV8xMzUJICAgICAgICgweDAwMDAxMjApCiAjZGVmaW5lIENTUl9IV19SRVZfVFlQRV9OT05FICAgICAgICAgICAoMHgwMDAwMUYwKQogCiAvKiBFRVBST00gUkVHICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWcuaAppbmRleCA2OWE3N2UyLi40NGE3YmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmgKQEAgLTQ3LDIwICs0NywyMSBAQAogfSB3aGlsZSAoMCkKIAogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCi0jZGVmaW5lIElXTF9ERUJVRyhtLCBsZXZlbCwgZm10LCBhcmdzLi4uKQkJCQlcCisjZGVmaW5lIElXTF9ERUJVRyhtLCBsZXZlbCwgZm10LCAuLi4pCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogCWlmIChpd2xfZ2V0X2RlYnVnX2xldmVsKChtKS0+c2hyZCkgJiAobGV2ZWwpKQkJCVwKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgYnVzKG0pLT5kZXYsCQkJXAotCQkJICIlYyAlcyAiIGZtdCwgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsCVwKLQkJCV9fZnVuY19fICwgIyMgYXJncyk7CQkJCVwKKwkJZGV2X2VycihidXMobSktPmRldiwgIiVjICVzICIgZm10LAkJCVwKKwkJCWluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX2Z1bmNfXywJCVwKKwkJCSMjX19WQV9BUkdTX18pOwkJCQkJXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBJV0xfREVCVUdfTElNSVQobSwgbGV2ZWwsIGZtdCwgYXJncy4uLikJCQkJXAorI2RlZmluZSBJV0xfREVCVUdfTElNSVQobSwgbGV2ZWwsIGZtdCwgLi4uKQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotCWlmIChpd2xfZ2V0X2RlYnVnX2xldmVsKChtKS0+c2hyZCkgJiAobGV2ZWwpICYmIG5ldF9yYXRlbGltaXQoKSlcCi0JCWRldl9wcmludGsoS0VSTl9FUlIsIGJ1cyhtKS0+ZGV2LAkJCVwKLQkJCSIlYyAlcyAiIGZtdCwgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsCVwKLQkJCSBfX2Z1bmNfXyAsICMjIGFyZ3MpOwkJCQlcCisJaWYgKGl3bF9nZXRfZGVidWdfbGV2ZWwoKG0pLT5zaHJkKSAmIChsZXZlbCkgJiYJCQlcCisJICAgIG5ldF9yYXRlbGltaXQoKSkJCQkJCQlcCisJCWRldl9lcnIoYnVzKG0pLT5kZXYsICIlYyAlcyAiIGZtdCwJCQlcCisJCQlpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18sCQlcCisJCQkjI19fVkFfQVJHU19fKTsJCQkJCVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgaXdsX3ByaW50X2hleF9kdW1wKG0sIGxldmVsLCBwLCBsZW4pCQkJCVwKQEAgLTcwLDEwICs3MSwyOSBAQAogCQkJICAgICAgIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsIHAsIGxlbiwgMSk7CVwKIH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgSVdMX0RFQlVHX1FVSUVUX1JGS0lMTChwLCBmbXQsIC4uLikJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoIWl3bF9pc19yZmtpbGwocC0+c2hyZCkpCQkJCQlcCisJCWRldl9lcnIoYnVzKHApLT5kZXYsICIlcyVjICVzICIgZm10LAkJCVwKKwkJCSIiLAkJCQkJCVwKKwkJCWluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX2Z1bmNfXywJCVwKKwkJCSMjX19WQV9BUkdTX18pOwkJCQkJXAorCWVsc2UgaWYJKGl3bF9nZXRfZGVidWdfbGV2ZWwocC0+c2hyZCkgJiBJV0xfRExfUkFESU8pCQlcCisJCWRldl9lcnIoYnVzKHApLT5kZXYsICIlcyVjICVzICIgZm10LAkJCVwKKwkJCSIoUkZLSUxMKSAiLAkJCQkJXAorCQkJaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fZnVuY19fLAkJXAorCQkJIyNfX1ZBX0FSR1NfXyk7CQkJCQlcCit9IHdoaWxlICgwKQorCiAjZWxzZQogI2RlZmluZSBJV0xfREVCVUcobSwgbGV2ZWwsIGZtdCwgYXJncy4uLikKICNkZWZpbmUgSVdMX0RFQlVHX0xJTUlUKG0sIGxldmVsLCBmbXQsIGFyZ3MuLi4pCiAjZGVmaW5lIGl3bF9wcmludF9oZXhfZHVtcChtLCBsZXZlbCwgcCwgbGVuKQorI2RlZmluZSBJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHAsIGZtdCwgYXJncy4uLikJXAorZG8gewkJCQkJCQlcCisJaWYgKCFpd2xfaXNfcmZraWxsKHAtPnNocmQpKQkJCVwKKwkJSVdMX0VSUihwLCBmbXQsICMjYXJncyk7CQlcCit9IHdoaWxlICgwKQogI2VuZGlmCQkJCS8qIENPTkZJR19JV0xXSUZJX0RFQlVHICovCiAKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCkBAIC0xNTEsNyArMTcxLDcgQEAKICNkZWZpbmUgSVdMX0RMXzExSAkJKDEgPDwgMjgpCiAjZGVmaW5lIElXTF9ETF9TVEFUUwkJKDEgPDwgMjkpCiAjZGVmaW5lIElXTF9ETF9UWF9SRVBMWQkJKDEgPDwgMzApCi0jZGVmaW5lIElXTF9ETF9RT1MJCSgxIDw8IDMxKQorI2RlZmluZSBJV0xfRExfVFhfUVVFVUVTCSgxIDw8IDMxKQogCiAjZGVmaW5lIElXTF9ERUJVR19JTkZPKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfSU5GTywgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX01BQzgwMjExKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfTUFDODAyMTEsIGYsICMjIGEpCkBAIC0xODgsNyArMjA4LDcgQEAKICNkZWZpbmUgSVdMX0RFQlVHX1RYX1JFUExZKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfVFhfUkVQTFksIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19UWF9SRVBMWV9MSU1JVChwLCBmLCBhLi4uKSBcCiAJCUlXTF9ERUJVR19MSU1JVChwLCBJV0xfRExfVFhfUkVQTFksIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19RT1MocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9RT1MsIGYsICMjIGEpCisjZGVmaW5lIElXTF9ERUJVR19UWF9RVUVVRVMocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9UWF9RVUVVRVMsIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19SQURJTyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1JBRElPLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfUE9XRVIocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9QT1dFUiwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHXzExSChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMXzExSCwgZiwgIyMgYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnZnMuYwppbmRleCBhMTY3MGUzLi42OGIwNGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWdmcy5jCkBAIC0yMzYsOSArMjM2LDkgQEAKIAlpZiAoIXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0ICYmICFwcml2LT5kYmdmc19zcmFtX2xlbikgewogCQlwcml2LT5kYmdmc19zcmFtX29mZnNldCA9IDB4ODAwMDAwOwogCQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkKLQkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gcHJpdi0+dWNvZGVfaW5pdC5kYXRhLmxlbjsKKwkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gdHJhbnMocHJpdiktPnVjb2RlX2luaXQuZGF0YS5sZW47CiAJCWVsc2UKLQkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gcHJpdi0+dWNvZGVfcnQuZGF0YS5sZW47CisJCQlwcml2LT5kYmdmc19zcmFtX2xlbiA9IHRyYW5zKHByaXYpLT51Y29kZV9ydC5kYXRhLmxlbjsKIAl9CiAJbGVuID0gcHJpdi0+ZGJnZnNfc3JhbV9sZW47CiAKQEAgLTM0MSw3ICszNDEsNyBAQAogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywKIAkJCQkgICAgICAgcHJpdi0+d293bGFuX3NyYW0sCi0JCQkJICAgICAgIHByaXYtPnVjb2RlX3dvd2xhbi5kYXRhLmxlbik7CisJCQkJICAgICAgIHRyYW5zKHByaXYpLT51Y29kZV93b3dsYW4uZGF0YS5sZW4pOwogfQogc3RhdGljIHNzaXplX3QgaXdsX2RiZ2ZzX3N0YXRpb25zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC00MzAsNyArNDMwLDcgQEAKIAllZXByb21fdmVyID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9WRVJTSU9OKTsKIAlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmX3NpemUgLSBwb3MsICJOVk0gVHlwZTogJXMsICIKIAkJCSJ2ZXJzaW9uOiAweCV4XG4iLAotCQkJKHByaXYtPm52bV9kZXZpY2VfdHlwZSA9PSBOVk1fREVWSUNFX1RZUEVfT1RQKQorCQkJKHRyYW5zKHByaXYpLT5udm1fZGV2aWNlX3R5cGUgPT0gTlZNX0RFVklDRV9UWVBFX09UUCkKIAkJCSA/ICJPVFAiIDogIkVFUFJPTSIsIGVlcHJvbV92ZXIpOwogCWZvciAob2ZzID0gMCA7IG9mcyA8IGVlcHJvbV9sZW4gOyBvZnMgKz0gMTYpIHsKIAkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1Zl9zaXplIC0gcG9zLCAiMHglLjR4ICIsIG9mcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oCmluZGV4IDZjMDBhNDQuLjBjOTVhZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oCkBAIC0yMzAsMTcgKzIzMCw2IEBACiAJdTggaWJzc19ic3NpZF9zdGFfaWQ7CiB9OwogCi0vKiBvbmUgZm9yIGVhY2ggdUNvZGUgaW1hZ2UgKGluc3QvZGF0YSwgYm9vdC9pbml0L3J1bnRpbWUpICovCi1zdHJ1Y3QgZndfZGVzYyB7Ci0Jdm9pZCAqdl9hZGRyOwkJLyogYWNjZXNzIGJ5IGRyaXZlciAqLwotCWRtYV9hZGRyX3QgcF9hZGRyOwkvKiBhY2Nlc3MgYnkgY2FyZCdzIGJ1c21hc3RlciBETUEgKi8KLQl1MzIgbGVuOwkJLyogYnl0ZXMgKi8KLX07Ci0KLXN0cnVjdCBmd19pbWcgewotCXN0cnVjdCBmd19kZXNjIGNvZGUsIGRhdGE7Ci19OwotCiAvKiB2MS92MiB1Q29kZSBmaWxlIGxheW91dCAqLwogc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgewogCV9fbGUzMiB2ZXI7CS8qIG1ham9yL21pbm9yL0FQSS9zZXJpYWwgKi8KQEAgLTQ1MywyNiArNDQyLDEyIEBACiB9OwogCiAKLS8qCi0gKiBlbnVtIGl3bF9jYWxpYgotICogZGVmaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggcmVzdWx0cyBvZiBpbml0aWFsIGNhbGlicmF0aW9ucwotICogc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgdUNvZGUKLSAqLwotZW51bSBpd2xfY2FsaWIgewotCUlXTF9DQUxJQl9YVEFMLAotCUlXTF9DQUxJQl9EQywKLQlJV0xfQ0FMSUJfTE8sCi0JSVdMX0NBTElCX1RYX0lRLAotCUlXTF9DQUxJQl9UWF9JUV9QRVJELAotCUlXTF9DQUxJQl9CQVNFX0JBTkQsCi0JSVdMX0NBTElCX1RFTVBfT0ZGU0VULAotCUlXTF9DQUxJQl9NQVgKLX07Ci0KIC8qIE9wYXF1ZSBjYWxpYnJhdGlvbiByZXN1bHRzICovCiBzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCB7Ci0Jdm9pZCAqYnVmOwotCXNpemVfdCBidWZfbGVuOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzaXplX3QgY21kX2xlbjsKKwlzdHJ1Y3QgaXdsX2NhbGliX2hkciBoZHI7CisJLyogZGF0YSBmb2xsb3dzICovCiB9OwogCiAvKiBTZW5zaXRpdml0eSBjYWxpYiBkYXRhICovCkBAIC04MDUsMTMgKzc4MCw2IEBACiAJSVdMX1NDQU5fUk9DLAogfTsKIAotZW51bSBpd2xhZ25fdWNvZGVfdHlwZSB7Ci0JSVdMX1VDT0RFX05PTkUsCi0JSVdMX1VDT0RFX1JFR1VMQVIsCi0JSVdMX1VDT0RFX0lOSVQsCi0JSVdMX1VDT0RFX1dPV0xBTiwKLX07Ci0KICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfU1ZUT09MCiBzdHJ1Y3QgaXdsX3Rlc3Rtb2RlX3RyYWNlIHsKIAl1MzIgYnVmZl9zaXplOwpAQCAtODI0LDYgKzc5MiwxMiBAQAogfTsKICNlbmRpZgogCitzdHJ1Y3QgaXdsX3dpcGFuX25vYV9kYXRhIHsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CisJdTMyIGxlbmd0aDsKKwl1OCBkYXRhW107Cit9OworCiBzdHJ1Y3QgaXdsX3ByaXYgewogCiAJLypkYXRhIHNoYXJlZCBhbW9uZyBhbGwgdGhlIGRyaXZlcidzIGxheWVycyAqLwpAQCAtODgxLDcgKzg1NSw5IEBACiAJczMyIGxhc3RfdGVtcGVyYXR1cmU7CiAKIAkvKiBpbml0IGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KLQlzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCBjYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9NQVhdOworCXN0cnVjdCBsaXN0X2hlYWQgY2FsaWJfcmVzdWx0czsKKworCXN0cnVjdCBpd2xfd2lwYW5fbm9hX2RhdGEgX19yY3UgKm5vYV9kYXRhOwogCiAJLyogU2NhbiByZWxhdGVkIHZhcmlhYmxlcyAqLwogCXVuc2lnbmVkIGxvbmcgc2Nhbl9zdGFydDsKQEAgLTkwNywxMiArODgzLDcgQEAKIAl1MzIgdWNvZGVfdmVyOwkJCS8qIHZlcnNpb24gb2YgdWNvZGUsIGNvcHkgb2YKIAkJCQkJICAgaXdsX3Vjb2RlLnZlciAqLwogCi0Jc3RydWN0IGZ3X2ltZyB1Y29kZV9ydDsKLQlzdHJ1Y3QgZndfaW1nIHVjb2RlX2luaXQ7Ci0Jc3RydWN0IGZ3X2ltZyB1Y29kZV93b3dsYW47Ci0KLQllbnVtIGl3bGFnbl91Y29kZV90eXBlIHVjb2RlX3R5cGU7Ci0JdTggdWNvZGVfd3JpdGVfY29tcGxldGU7CS8qIHRoZSBpbWFnZSB3cml0ZSBpcyBjb21wbGV0ZSAqLworCWVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZTsKIAljaGFyIGZpcm13YXJlX25hbWVbMjVdOwogCiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgY29udGV4dHNbTlVNX0lXTF9SWE9OX0NUWF07CkBAIC05NTksNyArOTMwLDYgQEAKIAogCS8qIGVlcHJvbSAtLSB0aGlzIGlzIGluIHRoZSBjYXJkJ3MgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyICovCiAJdTggKmVlcHJvbTsKLQlpbnQgICAgbnZtX2RldmljZV90eXBlOwogCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2luZm8gKmNhbGliX2luZm87CiAKIAllbnVtIG5sODAyMTFfaWZ0eXBlIGl3X21vZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UuYwppbmRleCBhNjM1YTdlLi4yYTJjOGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldnRyYWNlLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAogLyogc3BhcnNlIGRvZXNuJ3QgbGlrZSB0cmFjZXBvaW50IG1hY3JvcyAqLwogI2lmbmRlZiBfX0NIRUNLRVJfXwotI2luY2x1ZGUgIml3bC1kZXYuaCIKKyNpbmNsdWRlICJpd2wtdHJhbnMuaCIKIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAiaXdsLWRldnRyYWNlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UuaAppbmRleCA4YTUxYzVjLi5mOWQzMzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldnRyYWNlLmgKQEAgLTI5LDcgKzI5LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KIAotc3RydWN0IGl3bF9wcml2OwogCiAjaWYgIWRlZmluZWQoQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcpIHx8IGRlZmluZWQoX19DSEVDS0VSX18pCiAjdW5kZWYgVFJBQ0VfRVZFTlQKQEAgLTM3LDE0ICszNiwxNCBAQAogc3RhdGljIGlubGluZSB2b2lkIHRyYWNlXyAjIyBuYW1lKHByb3RvKSB7fQogI2VuZGlmCiAKLSNkZWZpbmUgUFJJVl9FTlRSWQlfX2ZpZWxkKHN0cnVjdCBpd2xfcHJpdiAqLCBwcml2KQorI2RlZmluZSBQUklWX0VOVFJZCV9fZmllbGQodm9pZCAqLCBwcml2KQogI2RlZmluZSBQUklWX0FTU0lHTglfX2VudHJ5LT5wcml2ID0gcHJpdgogCiAjdW5kZWYgVFJBQ0VfU1lTVEVNCiAjZGVmaW5lIFRSQUNFX1NZU1RFTSBpd2x3aWZpX2lvCiAKIFRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X2lvcmVhZDMyLAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mZnMsIHUzMiB2YWwpLAorCVRQX1BST1RPKHZvaWQgKnByaXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKIAlUUF9BUkdTKHByaXYsIG9mZnMsIHZhbCksCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJUFJJVl9FTlRSWQpAQCAtNjAsNyArNTksNyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfaW93cml0ZTgsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgb2ZmcywgdTggdmFsKSwKKwlUUF9QUk9UTyh2b2lkICpwcml2LCB1MzIgb2ZmcywgdTggdmFsKSwKIAlUUF9BUkdTKHByaXYsIG9mZnMsIHZhbCksCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJUFJJVl9FTlRSWQpAQCAtNzYsNyArNzUsNyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfaW93cml0ZTMyLAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mZnMsIHUzMiB2YWwpLAorCVRQX1BST1RPKHZvaWQgKnByaXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKIAlUUF9BUkdTKHByaXYsIG9mZnMsIHZhbCksCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJUFJJVl9FTlRSWQpAQCAtOTUsNyArOTQsNyBAQAogI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV91Y29kZQogCiBUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl91Y29kZV9jb250X2V2ZW50LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHRpbWUsIHUzMiBkYXRhLCB1MzIgZXYpLAorCVRQX1BST1RPKHZvaWQgKnByaXYsIHUzMiB0aW1lLCB1MzIgZGF0YSwgdTMyIGV2KSwKIAlUUF9BUkdTKHByaXYsIHRpbWUsIGRhdGEsIGV2KSwKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlQUklWX0VOVFJZCkBAIC0xMTUsNyArMTE0LDcgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X3Vjb2RlX3dyYXBfZXZlbnQsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgd3JhcHMsIHUzMiBuX2VudHJ5LCB1MzIgcF9lbnRyeSksCisJVFBfUFJPVE8odm9pZCAqcHJpdiwgdTMyIHdyYXBzLCB1MzIgbl9lbnRyeSwgdTMyIHBfZW50cnkpLAogCVRQX0FSR1MocHJpdiwgd3JhcHMsIG5fZW50cnksIHBfZW50cnkpLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVBSSVZfRU5UUlkKQEAgLTEzOSw3ICsxMzgsNyBAQAogI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaQogCiBUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9oY21kLAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGZsYWdzLAorCVRQX1BST1RPKHZvaWQgKnByaXYsIHUzMiBmbGFncywKIAkJIGNvbnN0IHZvaWQgKmhjbWQwLCBzaXplX3QgbGVuMCwKIAkJIGNvbnN0IHZvaWQgKmhjbWQxLCBzaXplX3QgbGVuMSwKIAkJIGNvbnN0IHZvaWQgKmhjbWQyLCBzaXplX3QgbGVuMiksCkBAIC0xNjQsNyArMTYzLDcgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X3J4LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdm9pZCAqcnhidWYsIHNpemVfdCBsZW4pLAorCVRQX1BST1RPKHZvaWQgKnByaXYsIHZvaWQgKnJ4YnVmLCBzaXplX3QgbGVuKSwKIAlUUF9BUkdTKHByaXYsIHJ4YnVmLCBsZW4pLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVBSSVZfRU5UUlkKQEAgLTE3OSw3ICsxNzgsNyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfdHgsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB2b2lkICp0ZmQsIHNpemVfdCB0ZmRsZW4sCisJVFBfUFJPVE8odm9pZCAqcHJpdiwgdm9pZCAqdGZkLCBzaXplX3QgdGZkbGVuLAogCQkgdm9pZCAqYnVmMCwgc2l6ZV90IGJ1ZjBfbGVuLAogCQkgdm9pZCAqYnVmMSwgc2l6ZV90IGJ1ZjFfbGVuKSwKIAlUUF9BUkdTKHByaXYsIHRmZCwgdGZkbGVuLCBidWYwLCBidWYwX2xlbiwgYnVmMSwgYnVmMV9sZW4pLApAQCAtMjExLDcgKzIxMCw3IEBACiApOwogCiBUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl91Y29kZV9lcnJvciwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBkZXNjLCB1MzIgdHNmX2xvdywKKwlUUF9QUk9UTyh2b2lkICpwcml2LCB1MzIgZGVzYywgdTMyIHRzZl9sb3csCiAJCSB1MzIgZGF0YTEsIHUzMiBkYXRhMiwgdTMyIGxpbmUsIHUzMiBibGluazEsCiAJCSB1MzIgYmxpbmsyLCB1MzIgaWxpbmsxLCB1MzIgaWxpbmsyLCB1MzIgYmNvbl90aW1lLAogCQkgdTMyIGdwMSwgdTMyIGdwMiwgdTMyIGdwMywgdTMyIHVjb2RlX3ZlciwgdTMyIGh3X3ZlciwKQEAgLTI3MSw3ICsyNzAsNyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfdWNvZGVfZXZlbnQsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgdGltZSwgdTMyIGRhdGEsIHUzMiBldiksCisJVFBfUFJPVE8odm9pZCAqcHJpdiwgdTMyIHRpbWUsIHUzMiBkYXRhLCB1MzIgZXYpLAogCVRQX0FSR1MocHJpdiwgdGltZSwgZGF0YSwgZXYpLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVBSSVZfRU5UUlkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMKaW5kZXggYTRlNDNiZC4uZGNhZGEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMKQEAgLTE0OSwyMyArMTQ5LDIzIEBACiAgKiBFRVBST00gY2hpcCwgbm90IGEgc2luZ2xlIGV2ZW50LCBzbyBldmVuIHJlYWRzIGNvdWxkIGNvbmZsaWN0IGlmIHRoZXkKICAqIHdlcmVuJ3QgYXJiaXRyYXRlZCBieSB0aGUgc2VtYXBob3JlLgogICovCi1zdGF0aWMgaW50IGl3bF9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQorc3RhdGljIGludCBpd2xfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpd2xfYnVzICpidXMpCiB7CiAJdTE2IGNvdW50OwogCWludCByZXQ7CiAKIAlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBFRVBST01fU0VNX1JFVFJZX0xJTUlUOyBjb3VudCsrKSB7CiAJCS8qIFJlcXVlc3Qgc2VtYXBob3JlICovCi0JCWl3bF9zZXRfYml0KGJ1cyhwcml2KSwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCWl3bF9zZXRfYml0KGJ1cywgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCiAJCQkgICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNKTsKIAogCQkvKiBTZWUgaWYgd2UgZ290IGl0ICovCi0JCXJldCA9IGl3bF9wb2xsX2JpdChidXMocHJpdiksIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQlyZXQgPSBpd2xfcG9sbF9iaXQoYnVzLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKIAkJCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0sCiAJCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNLAogCQkJCUVFUFJPTV9TRU1fVElNRU9VVCk7CiAJCWlmIChyZXQgPj0gMCkgewotCQkJSVdMX0RFQlVHX0VFUFJPTShwcml2LAorCQkJSVdMX0RFQlVHX0VFUFJPTShidXMsCiAJCQkJIkFjcXVpcmVkIHNlbWFwaG9yZSBhZnRlciAlZCB0cmllcy5cbiIsCiAJCQkJY291bnQrMSk7CiAJCQlyZXR1cm4gcmV0OwpAQCAtMTc1LDM5ICsxNzUsMzkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpd2xfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGl3bF9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9idXMgKmJ1cykKIHsKLQlpd2xfY2xlYXJfYml0KGJ1cyhwcml2KSwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJaXdsX2NsZWFyX2JpdChidXMsIENTUl9IV19JRl9DT05GSUdfUkVHLAogCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0pOwogCiB9CiAKLXN0YXRpYyBpbnQgaXdsX2VlcHJvbV92ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgaXdsX2VlcHJvbV92ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogewotCXUzMiBncCA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBDU1JfRUVQUk9NX0dQKSAmIENTUl9FRVBST01fR1BfVkFMSURfTVNLOworCXUzMiBncCA9IGl3bF9yZWFkMzIoYnVzKHRyYW5zKSwgQ1NSX0VFUFJPTV9HUCkgJiBDU1JfRUVQUk9NX0dQX1ZBTElEX01TSzsKIAlpbnQgcmV0ID0gMDsKIAotCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIkVFUFJPTSBzaWduYXR1cmU9MHglMDh4XG4iLCBncCk7CisJSVdMX0RFQlVHX0VFUFJPTSh0cmFucywgIkVFUFJPTSBzaWduYXR1cmU9MHglMDh4XG4iLCBncCk7CiAJc3dpdGNoIChncCkgewogCWNhc2UgQ1NSX0VFUFJPTV9HUF9CQURfU0lHX0VFUF9HT09EX1NJR19PVFA6Ci0JCWlmIChwcml2LT5udm1fZGV2aWNlX3R5cGUgIT0gTlZNX0RFVklDRV9UWVBFX09UUCkgewotCQkJSVdMX0VSUihwcml2LCAiRUVQUk9NIHdpdGggYmFkIHNpZ25hdHVyZTogMHglMDh4XG4iLAorCQlpZiAodHJhbnMtPm52bV9kZXZpY2VfdHlwZSAhPSBOVk1fREVWSUNFX1RZUEVfT1RQKSB7CisJCQlJV0xfRVJSKHRyYW5zLCAiRUVQUk9NIHdpdGggYmFkIHNpZ25hdHVyZTogMHglMDh4XG4iLAogCQkJCWdwKTsKIAkJCXJldCA9IC1FTk9FTlQ7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9MRVNTX1RIQU5fNEs6CiAJY2FzZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9NT1JFX1RIQU5fNEs6Ci0JCWlmIChwcml2LT5udm1fZGV2aWNlX3R5cGUgIT0gTlZNX0RFVklDRV9UWVBFX0VFUFJPTSkgewotCQkJSVdMX0VSUihwcml2LCAiT1RQIHdpdGggYmFkIHNpZ25hdHVyZTogMHglMDh4XG4iLCBncCk7CisJCWlmICh0cmFucy0+bnZtX2RldmljZV90eXBlICE9IE5WTV9ERVZJQ0VfVFlQRV9FRVBST00pIHsKKwkJCUlXTF9FUlIodHJhbnMsICJPVFAgd2l0aCBiYWQgc2lnbmF0dXJlOiAweCUwOHhcbiIsIGdwKTsKIAkJCXJldCA9IC1FTk9FTlQ7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDU1JfRUVQUk9NX0dQX0JBRF9TSUdOQVRVUkVfQk9USF9FRVBfQU5EX09UUDoKIAlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJiYWQgRUVQUk9NL09UUCBzaWduYXR1cmUsIHR5cGU9JXMsICIKKwkJSVdMX0VSUih0cmFucywgImJhZCBFRVBST00vT1RQIHNpZ25hdHVyZSwgdHlwZT0lcywgIgogCQkJIkVFUFJPTV9HUD0weCUwOHhcbiIsCi0JCQkocHJpdi0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApCisJCQkodHJhbnMtPm52bV9kZXZpY2VfdHlwZSA9PSBOVk1fREVWSUNFX1RZUEVfT1RQKQogCQkJPyAiT1RQIiA6ICJFRVBST00iLCBncCk7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWJyZWFrOwpAQCAtMzAyLDE5ICszMDIsMTkgQEAKICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGl3bF9zZXRfb3RwX2FjY2VzcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGVudW0gaXdsX2FjY2Vzc19tb2RlIG1vZGUpCitzdGF0aWMgdm9pZCBpd2xfc2V0X290cF9hY2Nlc3Moc3RydWN0IGl3bF9idXMgKmJ1cywgZW51bSBpd2xfYWNjZXNzX21vZGUgbW9kZSkKIHsKLQlpd2xfcmVhZDMyKGJ1cyhwcml2KSwgQ1NSX09UUF9HUF9SRUcpOworCWl3bF9yZWFkMzIoYnVzLCBDU1JfT1RQX0dQX1JFRyk7CiAKIAlpZiAobW9kZSA9PSBJV0xfT1RQX0FDQ0VTU19BQlNPTFVURSkKLQkJaXdsX2NsZWFyX2JpdChidXMocHJpdiksIENTUl9PVFBfR1BfUkVHLAorCQlpd2xfY2xlYXJfYml0KGJ1cywgQ1NSX09UUF9HUF9SRUcsCiAJCQkgICAgICBDU1JfT1RQX0dQX1JFR19PVFBfQUNDRVNTX01PREUpOwogCWVsc2UKLQkJaXdsX3NldF9iaXQoYnVzKHByaXYpLCBDU1JfT1RQX0dQX1JFRywKKwkJaXdsX3NldF9iaXQoYnVzLCBDU1JfT1RQX0dQX1JFRywKIAkJCSAgICBDU1JfT1RQX0dQX1JFR19PVFBfQUNDRVNTX01PREUpOwogfQogCi1zdGF0aWMgaW50IGl3bF9nZXRfbnZtX3R5cGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgaHdfcmV2KQorc3RhdGljIGludCBpd2xfZ2V0X252bV90eXBlKHN0cnVjdCBpd2xfYnVzICpidXMsIHUzMiBod19yZXYpCiB7CiAJdTMyIG90cGdwOwogCWludCBudm1fdHlwZTsKQEAgLTMyMiw3ICszMjIsNyBAQAogCS8qIE9UUCBvbmx5IHZhbGlkIGZvciBDUC9QUCBhbmQgYWZ0ZXIgKi8KIAlzd2l0Y2ggKGh3X3JldiAmIENTUl9IV19SRVZfVFlQRV9NU0spIHsKIAljYXNlIENTUl9IV19SRVZfVFlQRV9OT05FOgotCQlJV0xfRVJSKHByaXYsICJVbmtub3duIGhhcmR3YXJlIHR5cGVcbiIpOworCQlJV0xfRVJSKGJ1cywgIlVua25vd24gaGFyZHdhcmUgdHlwZVxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCWNhc2UgQ1NSX0hXX1JFVl9UWVBFXzUzMDA6CiAJY2FzZSBDU1JfSFdfUkVWX1RZUEVfNTM1MDoKQEAgLTMzMSw3ICszMzEsNyBAQAogCQludm1fdHlwZSA9IE5WTV9ERVZJQ0VfVFlQRV9FRVBST007CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW90cGdwID0gaXdsX3JlYWQzMihidXMocHJpdiksIENTUl9PVFBfR1BfUkVHKTsKKwkJb3RwZ3AgPSBpd2xfcmVhZDMyKGJ1cywgQ1NSX09UUF9HUF9SRUcpOwogCQlpZiAob3RwZ3AgJiBDU1JfT1RQX0dQX1JFR19ERVZJQ0VfU0VMRUNUKQogCQkJbnZtX3R5cGUgPSBOVk1fREVWSUNFX1RZUEVfT1RQOwogCQllbHNlCkBAIC0zNDEsNzMgKzM0MSw3MyBAQAogCXJldHVybiAgbnZtX3R5cGU7CiB9CiAKLXN0YXRpYyBpbnQgaXdsX2luaXRfb3RwX2FjY2VzcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitzdGF0aWMgaW50IGl3bF9pbml0X290cF9hY2Nlc3Moc3RydWN0IGl3bF9idXMgKmJ1cykKIHsKIAlpbnQgcmV0OwogCiAJLyogRW5hYmxlIDQwTUh6IHJhZGlvIGNsb2NrICovCi0JaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfR1BfQ05UUkwsCi0JCSAgICBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgQ1NSX0dQX0NOVFJMKSB8CisJaXdsX3dyaXRlMzIoYnVzLCBDU1JfR1BfQ05UUkwsCisJCSAgICBpd2xfcmVhZDMyKGJ1cywgQ1NSX0dQX0NOVFJMKSB8CiAJCSAgICBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSU5JVF9ET05FKTsKIAogCS8qIHdhaXQgZm9yIGNsb2NrIHRvIGJlIHJlYWR5ICovCi0JcmV0ID0gaXdsX3BvbGxfYml0KGJ1cyhwcml2KSwgQ1NSX0dQX0NOVFJMLAorCXJldCA9IGl3bF9wb2xsX2JpdChidXMsIENTUl9HUF9DTlRSTCwKIAkJCQkgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSwKIAkJCQkgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSwKIAkJCQkgMjUwMDApOwogCWlmIChyZXQgPCAwKQotCQlJV0xfRVJSKHByaXYsICJUaW1lIG91dCBhY2Nlc3MgT1RQXG4iKTsKKwkJSVdMX0VSUihidXMsICJUaW1lIG91dCBhY2Nlc3MgT1RQXG4iKTsKIAllbHNlIHsKLQkJaXdsX3NldF9iaXRzX3BycGgoYnVzKHByaXYpLCBBUE1HX1BTX0NUUkxfUkVHLAorCQlpd2xfc2V0X2JpdHNfcHJwaChidXMsIEFQTUdfUFNfQ1RSTF9SRUcsCiAJCQkJICBBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUSk7CiAJCXVkZWxheSg1KTsKLQkJaXdsX2NsZWFyX2JpdHNfcHJwaChidXMocHJpdiksIEFQTUdfUFNfQ1RSTF9SRUcsCisJCWl3bF9jbGVhcl9iaXRzX3BycGgoYnVzLCBBUE1HX1BTX0NUUkxfUkVHLAogCQkJCSAgICBBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUSk7CiAKIAkJLyoKIAkJICogQ1NSIGF1dG8gY2xvY2sgZ2F0ZSBkaXNhYmxlIGJpdCAtCiAJCSAqIHRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBIVyB3aXRoIE9UUCBzaGFkb3cgUkFNCiAJCSAqLwotCQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2hhZG93X3JhbV9zdXBwb3J0KQotCQkJaXdsX3NldF9iaXQoYnVzKHByaXYpLCBDU1JfREJHX0xJTktfUFdSX01HTVRfUkVHLAorCQlpZiAocHJpdihidXMpLT5jZmctPmJhc2VfcGFyYW1zLT5zaGFkb3dfcmFtX3N1cHBvcnQpCisJCQlpd2xfc2V0X2JpdChidXMsIENTUl9EQkdfTElOS19QV1JfTUdNVF9SRUcsCiAJCQkJQ1NSX1JFU0VUX0xJTktfUFdSX01HTVRfRElTQUJMRUQpOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGl3bF9yZWFkX290cF93b3JkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGFkZHIsIF9fbGUxNiAqZWVwcm9tX2RhdGEpCitzdGF0aWMgaW50IGl3bF9yZWFkX290cF93b3JkKHN0cnVjdCBpd2xfYnVzICpidXMsIHUxNiBhZGRyLCBfX2xlMTYgKmVlcHJvbV9kYXRhKQogewogCWludCByZXQgPSAwOwogCXUzMiByOwogCXUzMiBvdHBncDsKIAotCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgQ1NSX0VFUFJPTV9SRUcsCisJaXdsX3dyaXRlMzIoYnVzLCBDU1JfRUVQUk9NX1JFRywKIAkJICAgIENTUl9FRVBST01fUkVHX01TS19BRERSICYgKGFkZHIgPDwgMSkpOwotCXJldCA9IGl3bF9wb2xsX2JpdChidXMocHJpdiksIENTUl9FRVBST01fUkVHLAorCXJldCA9IGl3bF9wb2xsX2JpdChidXMsIENTUl9FRVBST01fUkVHLAogCQkJCSBDU1JfRUVQUk9NX1JFR19SRUFEX1ZBTElEX01TSywKIAkJCQkgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0ssCiAJCQkJIElXTF9FRVBST01fQUNDRVNTX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlRpbWUgb3V0IHJlYWRpbmcgT1RQWyVkXVxuIiwgYWRkcik7CisJCUlXTF9FUlIoYnVzLCAiVGltZSBvdXQgcmVhZGluZyBPVFBbJWRdXG4iLCBhZGRyKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JciA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBDU1JfRUVQUk9NX1JFRyk7CisJciA9IGl3bF9yZWFkMzIoYnVzLCBDU1JfRUVQUk9NX1JFRyk7CiAJLyogY2hlY2sgZm9yIEVDQyBlcnJvcnM6ICovCi0Jb3RwZ3AgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgQ1NSX09UUF9HUF9SRUcpOworCW90cGdwID0gaXdsX3JlYWQzMihidXMsIENTUl9PVFBfR1BfUkVHKTsKIAlpZiAob3RwZ3AgJiBDU1JfT1RQX0dQX1JFR19FQ0NfVU5DT1JSX1NUQVRVU19NU0spIHsKIAkJLyogc3RvcCBpbiB0aGlzIGNhc2UgKi8KIAkJLyogc2V0IHRoZSB1bmNvcnJlY3RhYmxlIE9UUCBFQ0MgYml0IGZvciBhY2tub3dsZWRnZW1lbnQgKi8KLQkJaXdsX3NldF9iaXQoYnVzKHByaXYpLCBDU1JfT1RQX0dQX1JFRywKKwkJaXdsX3NldF9iaXQoYnVzLCBDU1JfT1RQX0dQX1JFRywKIAkJCUNTUl9PVFBfR1BfUkVHX0VDQ19VTkNPUlJfU1RBVFVTX01TSyk7Ci0JCUlXTF9FUlIocHJpdiwgIlVuY29ycmVjdGFibGUgT1RQIEVDQyBlcnJvciwgYWJvcnQgT1RQIHJlYWRcbiIpOworCQlJV0xfRVJSKGJ1cywgIlVuY29ycmVjdGFibGUgT1RQIEVDQyBlcnJvciwgYWJvcnQgT1RQIHJlYWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKG90cGdwICYgQ1NSX09UUF9HUF9SRUdfRUNDX0NPUlJfU1RBVFVTX01TSykgewogCQkvKiBjb250aW51ZSBpbiB0aGlzIGNhc2UgKi8KIAkJLyogc2V0IHRoZSBjb3JyZWN0YWJsZSBPVFAgRUNDIGJpdCBmb3IgYWNrbm93bGVkZ2VtZW50ICovCi0JCWl3bF9zZXRfYml0KGJ1cyhwcml2KSwgQ1NSX09UUF9HUF9SRUcsCisJCWl3bF9zZXRfYml0KGJ1cywgQ1NSX09UUF9HUF9SRUcsCiAJCQkJQ1NSX09UUF9HUF9SRUdfRUNDX0NPUlJfU1RBVFVTX01TSyk7Ci0JCUlXTF9FUlIocHJpdiwgIkNvcnJlY3RhYmxlIE9UUCBFQ0MgZXJyb3IsIGNvbnRpbnVlIHJlYWRcbiIpOworCQlJV0xfRVJSKGJ1cywgIkNvcnJlY3RhYmxlIE9UUCBFQ0MgZXJyb3IsIGNvbnRpbnVlIHJlYWRcbiIpOwogCX0KIAkqZWVwcm9tX2RhdGEgPSBjcHVfdG9fbGUxNihyID4+IDE2KTsKIAlyZXR1cm4gMDsKQEAgLTQxNiwyMCArNDE2LDIwIEBACiAvKgogICogaXdsX2lzX290cF9lbXB0eTogY2hlY2sgZm9yIGVtcHR5IE9UUAogICovCi1zdGF0aWMgYm9vbCBpd2xfaXNfb3RwX2VtcHR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyBib29sIGl3bF9pc19vdHBfZW1wdHkoc3RydWN0IGl3bF9idXMgKmJ1cykKIHsKIAl1MTYgbmV4dF9saW5rX2FkZHIgPSAwOwogCV9fbGUxNiBsaW5rX3ZhbHVlOwogCWJvb2wgaXNfZW1wdHkgPSBmYWxzZTsKIAogCS8qIGxvY2F0ZSB0aGUgYmVnaW5uaW5nIG9mIE9UUCBsaW5rIGxpc3QgKi8KLQlpZiAoIWl3bF9yZWFkX290cF93b3JkKHByaXYsIG5leHRfbGlua19hZGRyLCAmbGlua192YWx1ZSkpIHsKKwlpZiAoIWl3bF9yZWFkX290cF93b3JkKGJ1cywgbmV4dF9saW5rX2FkZHIsICZsaW5rX3ZhbHVlKSkgewogCQlpZiAoIWxpbmtfdmFsdWUpIHsKLQkJCUlXTF9FUlIocHJpdiwgIk9UUCBpcyBlbXB0eVxuIik7CisJCQlJV0xfRVJSKGJ1cywgIk9UUCBpcyBlbXB0eVxuIik7CiAJCQlpc19lbXB0eSA9IHRydWU7CiAJCX0KIAl9IGVsc2UgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gcmVhZCBmaXJzdCBibG9jayBvZiBPVFAgbGlzdC5cbiIpOworCQlJV0xfRVJSKGJ1cywgIlVuYWJsZSB0byByZWFkIGZpcnN0IGJsb2NrIG9mIE9UUCBsaXN0LlxuIik7CiAJCWlzX2VtcHR5ID0gdHJ1ZTsKIAl9CiAKQEAgLTQ0Niw3ICs0NDYsNyBAQAogICogICB3ZSBzaG91bGQgcmVhZCBhbmQgdXNlZCB0byBjb25maWd1cmUgdGhlIGRldmljZS4KICAqICAgb25seSBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGlmIHNoYWRvdyBSQU0gaXMgZGlzYWJsZWQKICAqLwotc3RhdGljIGludCBpd2xfZmluZF9vdHBfaW1hZ2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LAorc3RhdGljIGludCBpd2xfZmluZF9vdHBfaW1hZ2Uoc3RydWN0IGl3bF9idXMgKmJ1cywKIAkJCQkJdTE2ICp2YWxpZGJsb2NrYWRkcikKIHsKIAl1MTYgbmV4dF9saW5rX2FkZHIgPSAwLCB2YWxpZF9hZGRyOwpAQCAtNDU0LDEwICs0NTQsMTAgQEAKIAlpbnQgdXNlZGJsb2NrcyA9IDA7CiAKIAkvKiBzZXQgYWRkcmVzc2luZyBtb2RlIHRvIGFic29sdXRlIHRvIHRyYXZlcnNlIHRoZSBsaW5rIGxpc3QgKi8KLQlpd2xfc2V0X290cF9hY2Nlc3MocHJpdiwgSVdMX09UUF9BQ0NFU1NfQUJTT0xVVEUpOworCWl3bF9zZXRfb3RwX2FjY2VzcyhidXMsIElXTF9PVFBfQUNDRVNTX0FCU09MVVRFKTsKIAogCS8qIGNoZWNraW5nIGZvciBlbXB0eSBPVFAgb3IgZXJyb3IgKi8KLQlpZiAoaXdsX2lzX290cF9lbXB0eShwcml2KSkKKwlpZiAoaXdsX2lzX290cF9lbXB0eShidXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qCkBAIC00NzEsOSArNDcxLDkgQEAKIAkJICovCiAJCXZhbGlkX2FkZHIgPSBuZXh0X2xpbmtfYWRkcjsKIAkJbmV4dF9saW5rX2FkZHIgPSBsZTE2X3RvX2NwdShsaW5rX3ZhbHVlKSAqIHNpemVvZih1MTYpOwotCQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJPVFAgYmxvY2tzICVkIGFkZHIgMHgleFxuIiwKKwkJSVdMX0RFQlVHX0VFUFJPTShidXMsICJPVFAgYmxvY2tzICVkIGFkZHIgMHgleFxuIiwKIAkJCSAgICAgICB1c2VkYmxvY2tzLCBuZXh0X2xpbmtfYWRkcik7Ci0JCWlmIChpd2xfcmVhZF9vdHBfd29yZChwcml2LCBuZXh0X2xpbmtfYWRkciwgJmxpbmtfdmFsdWUpKQorCQlpZiAoaXdsX3JlYWRfb3RwX3dvcmQoYnVzLCBuZXh0X2xpbmtfYWRkciwgJmxpbmtfdmFsdWUpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmICghbGlua192YWx1ZSkgewogCQkJLyoKQEAgLTQ4OCwxMCArNDg4LDEwIEBACiAJCX0KIAkJLyogbW9yZSBpbiB0aGUgbGluayBsaXN0LCBjb250aW51ZSAqLwogCQl1c2VkYmxvY2tzKys7Ci0JfSB3aGlsZSAodXNlZGJsb2NrcyA8PSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5tYXhfbGxfaXRlbXMpOworCX0gd2hpbGUgKHVzZWRibG9ja3MgPD0gcHJpdihidXMpLT5jZmctPmJhc2VfcGFyYW1zLT5tYXhfbGxfaXRlbXMpOwogCiAJLyogT1RQIGhhcyBubyB2YWxpZCBibG9ja3MgKi8KLQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJPVFAgaGFzIG5vIHZhbGlkIGJsb2Nrc1xuIik7CisJSVdMX0RFQlVHX0VFUFJPTShidXMsICJPVFAgaGFzIG5vIHZhbGlkIGJsb2Nrc1xuIik7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTUwNCwyOCArNTA0LDI4IEBACiAgKiBpd2xfZ2V0X21heF90eHBvd2VyX2F2ZyAtIGdldCB0aGUgaGlnaGVzdCB0eCBwb3dlciBmcm9tIGFsbCBjaGFpbnMuCiAgKiAgICAgZmluZCB0aGUgaGlnaGVzdCB0eCBwb3dlciBmcm9tIGFsbCBjaGFpbnMgZm9yIHRoZSBjaGFubmVsCiAgKi8KLXN0YXRpYyBzOCBpd2xfZ2V0X21heF90eHBvd2VyX2F2ZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCitzdGF0aWMgczggaXdsX2dldF9tYXhfdHhwb3dlcl9hdmcoc3RydWN0IGl3bF9jZmcgKmNmZywKIAkJc3RydWN0IGl3bF9lZXByb21fZW5oYW5jZWRfdHhwd3IgKmVuaGFuY2VkX3R4cG93ZXIsCiAJCWludCBlbGVtZW50LCBzOCAqbWF4X3R4cG93ZXJfaW5faGFsZl9kYm0pCiB7CiAJczggbWF4X3R4cG93ZXJfYXZnID0gMDsgLyogKGRCbSkgKi8KIAogCS8qIFRha2UgdGhlIGhpZ2hlc3QgdHggcG93ZXIgZnJvbSBhbnkgdmFsaWQgY2hhaW5zICovCi0JaWYgKChwcml2LT5jZmctPnZhbGlkX3R4X2FudCAmIEFOVF9BKSAmJgorCWlmICgoY2ZnLT52YWxpZF90eF9hbnQgJiBBTlRfQSkgJiYKIAkgICAgKGVuaGFuY2VkX3R4cG93ZXJbZWxlbWVudF0uY2hhaW5fYV9tYXggPiBtYXhfdHhwb3dlcl9hdmcpKQogCQltYXhfdHhwb3dlcl9hdmcgPSBlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLmNoYWluX2FfbWF4OwotCWlmICgocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgJiBBTlRfQikgJiYKKwlpZiAoKGNmZy0+dmFsaWRfdHhfYW50ICYgQU5UX0IpICYmCiAJICAgIChlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLmNoYWluX2JfbWF4ID4gbWF4X3R4cG93ZXJfYXZnKSkKIAkJbWF4X3R4cG93ZXJfYXZnID0gZW5oYW5jZWRfdHhwb3dlcltlbGVtZW50XS5jaGFpbl9iX21heDsKLQlpZiAoKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ICYgQU5UX0MpICYmCisJaWYgKChjZmctPnZhbGlkX3R4X2FudCAmIEFOVF9DKSAmJgogCSAgICAoZW5oYW5jZWRfdHhwb3dlcltlbGVtZW50XS5jaGFpbl9jX21heCA+IG1heF90eHBvd2VyX2F2ZykpCiAJCW1heF90eHBvd2VyX2F2ZyA9IGVuaGFuY2VkX3R4cG93ZXJbZWxlbWVudF0uY2hhaW5fY19tYXg7Ci0JaWYgKCgocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgPT0gQU5UX0FCKSB8Ci0JICAgIChwcml2LT5jZmctPnZhbGlkX3R4X2FudCA9PSBBTlRfQkMpIHwKLQkgICAgKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ID09IEFOVF9BQykpICYmCisJaWYgKCgoY2ZnLT52YWxpZF90eF9hbnQgPT0gQU5UX0FCKSB8CisJICAgIChjZmctPnZhbGlkX3R4X2FudCA9PSBBTlRfQkMpIHwKKwkgICAgKGNmZy0+dmFsaWRfdHhfYW50ID09IEFOVF9BQykpICYmCiAJICAgIChlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLm1pbW8yX21heCA+IG1heF90eHBvd2VyX2F2ZykpCiAJCW1heF90eHBvd2VyX2F2ZyA9ICBlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLm1pbW8yX21heDsKLQlpZiAoKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ID09IEFOVF9BQkMpICYmCisJaWYgKChjZmctPnZhbGlkX3R4X2FudCA9PSBBTlRfQUJDKSAmJgogCSAgICAoZW5oYW5jZWRfdHhwb3dlcltlbGVtZW50XS5taW1vM19tYXggPiBtYXhfdHhwb3dlcl9hdmcpKQogCQltYXhfdHhwb3dlcl9hdmcgPSBlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLm1pbW8zX21heDsKIApAQCAtNjI3LDcgKzYyNyw3IEBACiAJCQkJICgodHhwLT5kZWx0YV8yMF9pbl80MCAmIDB4ZjApID4+IDQpLAogCQkJCSAodHhwLT5kZWx0YV8yMF9pbl80MCAmIDB4MGYpKTsKIAotCQltYXhfdHhwX2F2ZyA9IGl3bF9nZXRfbWF4X3R4cG93ZXJfYXZnKHByaXYsIHR4cF9hcnJheSwgaWR4LAorCQltYXhfdHhwX2F2ZyA9IGl3bF9nZXRfbWF4X3R4cG93ZXJfYXZnKHByaXYtPmNmZywgdHhwX2FycmF5LCBpZHgsCiAJCQkJCQkgICAgICAmbWF4X3R4cF9hdmdfaGFsZmRibSk7CiAKIAkJLyoKQEAgLTY2MCw4ICs2NjAsOCBAQAogCXUxNiB2YWxpZGJsb2NrYWRkciA9IDA7CiAJdTE2IGNhY2hlX2FkZHIgPSAwOwogCi0JcHJpdi0+bnZtX2RldmljZV90eXBlID0gaXdsX2dldF9udm1fdHlwZShwcml2LCBod19yZXYpOwotCWlmIChwcml2LT5udm1fZGV2aWNlX3R5cGUgPT0gLUVOT0VOVCkKKwl0cmFucyhwcml2KS0+bnZtX2RldmljZV90eXBlID0gaXdsX2dldF9udm1fdHlwZShidXMocHJpdiksIGh3X3Jldik7CisJaWYgKHRyYW5zKHByaXYpLT5udm1fZGV2aWNlX3R5cGUgPT0gLUVOT0VOVCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJLyogYWxsb2NhdGUgZWVwcm9tICovCiAJc3ogPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZTsKQEAgLTY3NSw3ICs2NzUsNyBAQAogCiAJaXdsX2FwbV9pbml0KHByaXYpOwogCi0JcmV0ID0gaXdsX2VlcHJvbV92ZXJpZnlfc2lnbmF0dXJlKHByaXYpOworCXJldCA9IGl3bF9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZSh0cmFucyhwcml2KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJSVdMX0VSUihwcml2LCAiRUVQUk9NIG5vdCBmb3VuZCwgRUVQUk9NX0dQPTB4JTA4eFxuIiwgZ3ApOwogCQlyZXQgPSAtRU5PRU5UOwpAQCAtNjgzLDE2ICs2ODMsMTYgQEAKIAl9CiAKIAkvKiBNYWtlIHN1cmUgZHJpdmVyIChpbnN0ZWFkIG9mIHVDb2RlKSBpcyBhbGxvd2VkIHRvIHJlYWQgRUVQUk9NICovCi0JcmV0ID0gaXdsX2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZShwcml2KTsKKwlyZXQgPSBpd2xfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKGJ1cyhwcml2KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIGFjcXVpcmUgRUVQUk9NIHNlbWFwaG9yZS5cbiIpOwogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIGVycjsKIAl9CiAKLQlpZiAocHJpdi0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApIHsKKwlpZiAodHJhbnMocHJpdiktPm52bV9kZXZpY2VfdHlwZSA9PSBOVk1fREVWSUNFX1RZUEVfT1RQKSB7CiAKLQkJcmV0ID0gaXdsX2luaXRfb3RwX2FjY2Vzcyhwcml2KTsKKwkJcmV0ID0gaXdsX2luaXRfb3RwX2FjY2VzcyhidXMocHJpdikpOwogCQlpZiAocmV0KSB7CiAJCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBPVFAgYWNjZXNzLlxuIik7CiAJCQlyZXQgPSAtRU5PRU5UOwpAQCAtNzA3LDcgKzcwNyw3IEBACiAJCQkgICAgIENTUl9PVFBfR1BfUkVHX0VDQ19VTkNPUlJfU1RBVFVTX01TSyk7CiAJCS8qIHRyYXZlcnNpbmcgdGhlIGxpbmtlZCBsaXN0IGlmIG5vIHNoYWRvdyByYW0gc3VwcG9ydGVkICovCiAJCWlmICghcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2hhZG93X3JhbV9zdXBwb3J0KSB7Ci0JCQlpZiAoaXdsX2ZpbmRfb3RwX2ltYWdlKHByaXYsICZ2YWxpZGJsb2NrYWRkcikpIHsKKwkJCWlmIChpd2xfZmluZF9vdHBfaW1hZ2UoYnVzKHByaXYpLCAmdmFsaWRibG9ja2FkZHIpKSB7CiAJCQkJcmV0ID0gLUVOT0VOVDsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CkBAIC03MTYsNyArNzE2LDcgQEAKIAkJICAgICBhZGRyICs9IHNpemVvZih1MTYpKSB7CiAJCQlfX2xlMTYgZWVwcm9tX2RhdGE7CiAKLQkJCXJldCA9IGl3bF9yZWFkX290cF93b3JkKHByaXYsIGFkZHIsICZlZXByb21fZGF0YSk7CisJCQlyZXQgPSBpd2xfcmVhZF9vdHBfd29yZChidXMocHJpdiksIGFkZHIsICZlZXByb21fZGF0YSk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZG9uZTsKIAkJCWVbY2FjaGVfYWRkciAvIDJdID0gZWVwcm9tX2RhdGE7CkBAIC03NDQsMTMgKzc0NCwxMyBAQAogCX0KIAogCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIk5WTSBUeXBlOiAlcywgdmVyc2lvbjogMHgleFxuIiwKLQkJICAgICAgIChwcml2LT5udm1fZGV2aWNlX3R5cGUgPT0gTlZNX0RFVklDRV9UWVBFX09UUCkKKwkJICAgICAgICh0cmFucyhwcml2KS0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApCiAJCSAgICAgICA/ICJPVFAiIDogIkVFUFJPTSIsCiAJCSAgICAgICBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1ZFUlNJT04pKTsKIAogCXJldCA9IDA7CiBkb25lOgotCWl3bF9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUocHJpdik7CisJaXdsX2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZShidXMocHJpdikpOwogCiBlcnI6CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5jCmluZGV4IDNmZmE4ZTYuLjM0NjRjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnVzLT5yZWdfbG9jaywgZmxhZ3MpOwogCWl3bF9ncmFiX25pY19hY2Nlc3MoYnVzKTsKLQl2YWx1ZSA9IGl3bF9yZWFkMzIoYnVzKGJ1cyksIHJlZyk7CisJdmFsdWUgPSBpd2xfcmVhZDMyKGJ1cywgcmVnKTsKIAlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKGJ1cyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVzLT5yZWdfbG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1tYWM4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbWFjODAyMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWIxZjBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbWFjODAyMTEuYwpAQCAtMCwwICsxLDE2MzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAorICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCisjaW5jbHVkZSAiaXdsLWRldi5oIgorI2luY2x1ZGUgIml3bC1jb3JlLmgiCisjaW5jbHVkZSAiaXdsLWlvLmgiCisjaW5jbHVkZSAiaXdsLWFnbi1jYWxpYi5oIgorI2luY2x1ZGUgIml3bC1hZ24uaCIKKyNpbmNsdWRlICJpd2wtc2hhcmVkLmgiCisjaW5jbHVkZSAiaXdsLWJ1cy5oIgorI2luY2x1ZGUgIml3bC10cmFucy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGl3bGFnbl9zdGFfYXBfbGltaXRzW10gPSB7CisJeworCQkubWF4ID0gMSwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAorCX0sCisJeworCQkubWF4ID0gMSwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX0FQKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduXzJzdGFfbGltaXRzW10gPSB7CisJeworCQkubWF4ID0gMiwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fcDJwX3N0YV9nb19saW1pdHNbXSA9IHsKKwl7CisJCS5tYXggPSAxLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCisJfSwKKwl7CisJCS5tYXggPSAxLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB8CisJCQkgQklUKE5MODAyMTFfSUZUWVBFX0FQKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduX3AycF8yc3RhX2xpbWl0c1tdID0geworCXsKKwkJLm1heCA9IDIsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSwKKwl9LAorCXsKKwkJLm1heCA9IDEsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24KK2l3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfZHVhbG1vZGVbXSA9IHsKKwl7IC5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKKwkgIC5tYXhfaW50ZXJmYWNlcyA9IDIsCisJICAuYmVhY29uX2ludF9pbmZyYV9tYXRjaCA9IHRydWUsCisJICAubGltaXRzID0gaXdsYWduX3N0YV9hcF9saW1pdHMsCisJICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl9zdGFfYXBfbGltaXRzKSwKKwl9LAorCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAorCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKKwkgIC5saW1pdHMgPSBpd2xhZ25fMnN0YV9saW1pdHMsCisJICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl8yc3RhX2xpbWl0cyksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2NvbWJpbmF0aW9uCitpd2xhZ25faWZhY2VfY29tYmluYXRpb25zX3AycFtdID0geworCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAorCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKKwkgIC5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKKwkgIC5saW1pdHMgPSBpd2xhZ25fcDJwX3N0YV9nb19saW1pdHMsCisJICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl9wMnBfc3RhX2dvX2xpbWl0cyksCisJfSwKKwl7IC5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKKwkgIC5tYXhfaW50ZXJmYWNlcyA9IDIsCisJICAubGltaXRzID0gaXdsYWduX3AycF8yc3RhX2xpbWl0cywKKwkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduX3AycF8yc3RhX2xpbWl0cyksCisJfSwKK307CisKKy8qCisgKiBOb3QgYSBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbiwgYnV0IGl0IGZpdHMgaW4gd2l0aCBhbGwgdGhlCisgKiBvdGhlciBtYWM4MDIxMSBmdW5jdGlvbnMgZ3JvdXBlZCBoZXJlLgorICovCitpbnQgaXdsYWduX21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgaXdsYWduX3Vjb2RlX2NhcGFiaWxpdGllcyAqY2FwYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKKworCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIml3bC1hZ24tcnMiOworCisJLyogVGVsbCBtYWM4MDIxMSBvdXIgY2hhcmFjdGVyaXN0aWNzICovCisJaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAorCQkgICAgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OIHwKKwkJICAgIElFRUU4MDIxMV9IV19ORUVEX0RUSU1fUEVSSU9EIHwKKwkJICAgIElFRUU4MDIxMV9IV19TUEVDVFJVTV9NR01UIHwKKwkJICAgIElFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVM7CisKKwkvKgorCSAqIEluY2x1ZGluZyB0aGUgZm9sbG93aW5nIGxpbmUgd2lsbCBjcmFzaCBzb21lIEFQJ3MuICBUaGlzCisJICogd29ya2Fyb3VuZCByZW1vdmVzIHRoZSBzdGltdWx1cyB3aGljaCBjYXVzZXMgdGhlIGNyYXNoIHVudGlsCisJICogdGhlIEFQIHNvZnR3YXJlIGNhbiBiZSBmaXhlZC4KKwlody0+bWF4X3R4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lcyA9IExJTktfUVVBTF9BR0dfRlJBTUVfTElNSVRfREVGOworCSAqLworCisJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19QUyB8CisJCSAgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfUFM7CisKKwlpZiAocHJpdi0+Y2ZnLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKQorCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfU01QUyB8CisJCQkgICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19TVEFUSUNfU01QUzsKKworCWlmIChjYXBhLT5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfTUZQKQorCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX01GUF9DQVBBQkxFOworCisJaHctPnN0YV9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYpOworCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdmlmX3ByaXYpOworCisJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKKwkJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gY3R4LT5pbnRlcmZhY2VfbW9kZXM7CisJCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKKwl9CisKKwlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAyKTsKKworCWlmIChody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSkgeworCQlody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9ucyA9IGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwOworCQlody0+d2lwaHktPm5faWZhY2VfY29tYmluYXRpb25zID0KKwkJCUFSUkFZX1NJWkUoaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19wMnApOworCX0gZWxzZSBpZiAoaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfQVApKSB7CisJCWh3LT53aXBoeS0+aWZhY2VfY29tYmluYXRpb25zID0KKwkJCWl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfZHVhbG1vZGU7CisJCWh3LT53aXBoeS0+bl9pZmFjZV9jb21iaW5hdGlvbnMgPQorCQkJQVJSQVlfU0laRShpd2xhZ25faWZhY2VfY29tYmluYXRpb25zX2R1YWxtb2RlKTsKKwl9CisKKwlody0+d2lwaHktPm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbiA9IDEwMDA7CisKKwlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkgfAorCQkJICAgIFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFMgfAorCQkJICAgIFdJUEhZX0ZMQUdfSUJTU19SU047CisKKwlpZiAodHJhbnMocHJpdiktPnVjb2RlX3dvd2xhbi5jb2RlLmxlbiAmJgorCSAgICBkZXZpY2VfY2FuX3dha2V1cChidXMocHJpdiktPmRldikpIHsKKwkJaHctPndpcGh5LT53b3dsYW4uZmxhZ3MgPSBXSVBIWV9XT1dMQU5fTUFHSUNfUEtUIHwKKwkJCQkJICBXSVBIWV9XT1dMQU5fRElTQ09OTkVDVCB8CisJCQkJCSAgV0lQSFlfV09XTEFOX0VBUF9JREVOVElUWV9SRVEgfAorCQkJCQkgIFdJUEhZX1dPV0xBTl9SRktJTExfUkVMRUFTRTsKKwkJaWYgKCFpd2xhZ25fbW9kX3BhcmFtcy5zd19jcnlwdG8pCisJCQlody0+d2lwaHktPndvd2xhbi5mbGFncyB8PQorCQkJCVdJUEhZX1dPV0xBTl9TVVBQT1JUU19HVEtfUkVLRVkgfAorCQkJCVdJUEhZX1dPV0xBTl9HVEtfUkVLRVlfRkFJTFVSRTsKKworCQlody0+d2lwaHktPndvd2xhbi5uX3BhdHRlcm5zID0gSVdMQUdOX1dPV0xBTl9NQVhfUEFUVEVSTlM7CisJCWh3LT53aXBoeS0+d293bGFuLnBhdHRlcm5fbWluX2xlbiA9CisJCQkJCUlXTEFHTl9XT1dMQU5fTUlOX1BBVFRFUk5fTEVOOworCQlody0+d2lwaHktPndvd2xhbi5wYXR0ZXJuX21heF9sZW4gPQorCQkJCQlJV0xBR05fV09XTEFOX01BWF9QQVRURVJOX0xFTjsKKwl9CisKKwlpZiAoaXdsYWduX21vZF9wYXJhbXMucG93ZXJfc2F2ZSkKKwkJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7CisJZWxzZQorCQlody0+d2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7CisKKwlody0+d2lwaHktPm1heF9zY2FuX3NzaWRzID0gUFJPQkVfT1BUSU9OX01BWDsKKwkvKiB3ZSBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgYW5kIGEgemVyby1sZW5ndGggU1NJRCBlbGVtZW50ICovCisJaHctPndpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSBjYXBhLT5tYXhfcHJvYmVfbGVuZ3RoIC0gMjQgLSAyOworCisJLyogRGVmYXVsdCB2YWx1ZTsgNCBFRENBIFFPUyBwcmlvcml0aWVzICovCisJaHctPnF1ZXVlcyA9IDQ7CisKKwlody0+bWF4X2xpc3Rlbl9pbnRlcnZhbCA9IElXTF9DT05OX01BWF9MSVNURU5fSU5URVJWQUw7CisKKwlpZiAocHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0ubl9jaGFubmVscykKKwkJcHJpdi0+aHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9CisJCQkmcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisJaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fY2hhbm5lbHMpCisJCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQorCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOworCisJaXdsX2xlZHNfaW5pdChwcml2KTsKKworCXJldCA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhwcml2LT5odyk7CisJaWYgKHJldCkgeworCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaHcgKGVycm9yICVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2l3bF91cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpKSB7CisJCUlXTF9XQVJOKHByaXYsICJFeGl0IHBlbmRpbmc7IHdpbGwgbm90IGJyaW5nIHRoZSBOSUMgdXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgeworCQlyZXQgPSBpd2xhZ25fYWxsb2NfYmNhc3Rfc3RhdGlvbihwcml2LCBjdHgpOworCQlpZiAocmV0KSB7CisJCQlpd2xfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhwcml2KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBpd2xhZ25fcnVuX2luaXRfdWNvZGUocHJpdik7CisJaWYgKHJldCkgeworCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gcnVuIElOSVQgdWNvZGU6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGl3bGFnbl9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUocHJpdiwgSVdMX1VDT0RFX1JFR1VMQVIpOworCWlmIChyZXQpIHsKKwkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHN0YXJ0IFJUIHVjb2RlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSBpd2xfYWxpdmVfc3RhcnQocHJpdik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlyZXR1cm4gMDsKKworIGVycm9yOgorCXNldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7CisJX19pd2xfZG93bihwcml2KTsKKwljbGVhcl9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7CisKKwlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UuXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IHJldDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJLyogd2Ugc2hvdWxkIGJlIHZlcmlmeWluZyB0aGUgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIG9wZW5lZCAqLworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlyZXQgPSBfX2l3bF91cChwcml2KTsKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlN0YXJ0IFVQIHdvcmsgZG9uZS5cbiIpOworCisJLyogTm93IHdlIHNob3VsZCBiZSBkb25lLCBhbmQgdGhlIFJFQURZIGJpdCBzaG91bGQgYmUgc2V0LiAqLworCWlmIChXQVJOX09OKCF0ZXN0X2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zaHJkLT5zdGF0dXMpKSkKKwkJcmV0ID0gLUVJTzsKKworCWl3bGFnbl9sZWRfZW5hYmxlKHByaXYpOworCisJcHJpdi0+aXNfb3BlbiA9IDE7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJaWYgKCFwcml2LT5pc19vcGVuKQorCQlyZXR1cm47CisKKwlwcml2LT5pc19vcGVuID0gMDsKKworCWl3bF9kb3duKHByaXYpOworCisJZmx1c2hfd29ya3F1ZXVlKHByaXYtPnNocmQtPndvcmtxdWV1ZSk7CisKKwkvKiBVc2VyIHNwYWNlIHNvZnR3YXJlIG1heSBleHBlY3QgZ2V0dGluZyByZmtpbGwgY2hhbmdlcworCSAqIGV2ZW4gaWYgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpd2xfd3JpdGUzMihidXMocHJpdiksIENTUl9JTlQsIDB4RkZGRkZGRkYpOworCWl3bF9lbmFibGVfcmZraWxsX2ludChwcml2KTsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworfQorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3NldF9yZWtleV9kYXRhKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgICAgc3RydWN0IGNmZzgwMjExX2d0a19yZWtleV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnN3X2NyeXB0bykKKwkJcmV0dXJuOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnZpZiAhPSB2aWYpCisJCWdvdG8gb3V0OworCisJbWVtY3B5KHByaXYtPmtlaywgZGF0YS0+a2VrLCBOTDgwMjExX0tFS19MRU4pOworCW1lbWNweShwcml2LT5rY2ssIGRhdGEtPmtjaywgTkw4MDIxMV9LQ0tfTEVOKTsKKwlwcml2LT5yZXBsYXlfY3RyID0KKwkJY3B1X3RvX2xlNjQoYmU2NF90b19jcHVwKChfX2JlNjQgKikmZGF0YS0+cmVwbGF5X2N0cikpOworCXByaXYtPmhhdmVfcmVrZXlfZGF0YSA9IHRydWU7CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKworc3RhdGljIGludCBpd2xhZ25fbWFjX3N1c3BlbmQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKKwlpbnQgcmV0OworCisJaWYgKFdBUk5fT04oIXdvd2xhbikpCisJCXJldHVybiAtRUlOVkFMOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJLyogRG9uJ3QgYXR0ZW1wdCBXb1dMQU4gd2hlbiBub3QgYXNzb2NpYXRlZCwgdGVhciBkb3duIGluc3RlYWQuICovCisJaWYgKCFjdHgtPnZpZiB8fCBjdHgtPnZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CisJICAgICFpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgeworCQlyZXQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBpd2xhZ25fc3VzcGVuZChwcml2LCBodywgd293bGFuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKGJ1cyhwcml2KS0+ZGV2LCB0cnVlKTsKKworCS8qIE5vdyBsZXQgdGhlIHVjb2RlIG9wZXJhdGUgb24gaXRzIG93biAqLworCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgQ1NSX1VDT0RFX0RSVl9HUDFfU0VULAorCQkJICBDU1JfVUNPREVfRFJWX0dQMV9CSVRfRDNfQ0ZHX0NPTVBMRVRFKTsKKworCWdvdG8gb3V0OworCisgZXJyb3I6CisJcHJpdi0+c2hyZC0+d293bGFuID0gZmFsc2U7CisJaXdsYWduX3ByZXBhcmVfcmVzdGFydChwcml2KTsKKwlpZWVlODAyMTFfcmVzdGFydF9odyhwcml2LT5odyk7Cisgb3V0OgorCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3Jlc3VtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgYmFzZSwgc3RhdHVzID0gMHhmZmZmZmZmZjsKKwlpbnQgcmV0ID0gLUVJTzsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAorCQkJICBDU1JfVUNPREVfRFJWX0dQMV9CSVRfRDNfQ0ZHX0NPTVBMRVRFKTsKKworCWJhc2UgPSBwcml2LT5kZXZpY2VfcG9pbnRlcnMuZXJyb3JfZXZlbnRfdGFibGU7CisJaWYgKGl3bGFnbl9od192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZidXMocHJpdiktPnJlZ19sb2NrLCBmbGFncyk7CisJCXJldCA9IGl3bF9ncmFiX25pY19hY2Nlc3Nfc2lsZW50KGJ1cyhwcml2KSk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBIQlVTX1RBUkdfTUVNX1JBRERSLCBiYXNlKTsKKwkJCXN0YXR1cyA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCQkJaXdsX3JlbGVhc2VfbmljX2FjY2VzcyhidXMocHJpdikpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1cyhwcml2KS0+cmVnX2xvY2ssIGZsYWdzKTsKKworI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyA9IHRyYW5zKHByaXYpOworCQkJaWYgKCFwcml2LT53b3dsYW5fc3JhbSkKKwkJCQlwcml2LT53b3dsYW5fc3JhbSA9CisJCQkJCWt6YWxsb2ModHJhbnMtPnVjb2RlX3dvd2xhbi5kYXRhLmxlbiwKKwkJCQkJCUdGUF9LRVJORUwpOworCisJCQlpZiAocHJpdi0+d293bGFuX3NyYW0pCisJCQkJX2l3bF9yZWFkX3RhcmdfbWVtX3dvcmRzKAorCQkJCQlidXMocHJpdiksIDB4ODAwMDAwLCBwcml2LT53b3dsYW5fc3JhbSwKKwkJCQkJdHJhbnMtPnVjb2RlX3dvd2xhbi5kYXRhLmxlbiAvIDQpOworCQl9CisjZW5kaWYKKwl9CisKKwkvKiB3ZSdsbCBjbGVhciBjdHgtPnZpZiBkdXJpbmcgaXdsYWduX3ByZXBhcmVfcmVzdGFydCgpICovCisJdmlmID0gY3R4LT52aWY7CisKKwlwcml2LT5zaHJkLT53b3dsYW4gPSBmYWxzZTsKKworCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShidXMocHJpdiktPmRldiwgZmFsc2UpOworCisJaXdsYWduX3ByZXBhcmVfcmVzdGFydChwcml2KTsKKworCW1lbXNldCgodm9pZCAqKSZjdHgtPmFjdGl2ZSwgMCwgc2l6ZW9mKGN0eC0+YWN0aXZlKSk7CisJaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcocHJpdiwgY3R4KTsKKwlpd2xhZ25fc2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCisJaWVlZTgwMjExX3Jlc3VtZV9kaXNjb25uZWN0KHZpZik7CisKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlJV0xfREVCVUdfTUFDRFVNUChwcml2LCAiZW50ZXJcbiIpOworCisJSVdMX0RFQlVHX1RYKHByaXYsICJkZXYtPnhtaXQoJWQgYnl0ZXMpIGF0IHJhdGUgMHglMDJ4XG4iLCBza2ItPmxlbiwKKwkJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKSktPmJpdHJhdGUpOworCisJaWYgKGl3bGFnbl90eF9za2IocHJpdiwgc2tiKSkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCUlXTF9ERUJVR19NQUNEVU1QKHByaXYsICJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfdXBkYXRlX3RraXBfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgICAgICB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlpd2xfdXBkYXRlX3RraXBfa2V5KHByaXYsIHZpZiwga2V5Y29uZiwgc3RhLCBpdjMyLCBwaGFzZTFrZXkpOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKKwlpbnQgcmV0OworCWJvb2wgaXNfZGVmYXVsdF93ZXBfa2V5ID0gZmFsc2U7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5zd19jcnlwdG8pIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIGh3Y3J5cHRvIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCS8qCisJICogV2UgY291bGQgcHJvZ3JhbSB0aGVzZSBrZXlzIGludG8gdGhlIGhhcmR3YXJlIGFzIHdlbGwsIGJ1dCB3ZQorCSAqIGRvbid0IGV4cGVjdCBtdWNoIG11bHRpY2FzdCB0cmFmZmljIGluIElCU1MgYW5kIGhhdmluZyBrZXlzCisJICogZm9yIG1vcmUgc3RhdGlvbnMgaXMgcHJvYmFibHkgbW9yZSB1c2VmdWwuCisJICoKKwkgKiBNYXJrIGtleSBUWC1vbmx5IGFuZCByZXR1cm4gMC4KKwkgKi8KKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJICAgICEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpIHsKKwkJa2V5LT5od19rZXlfaWR4ID0gV0VQX0lOVkFMSURfT0ZGU0VUOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJZiB0aGV5IGtleSB3YXMgVFgtb25seSwgYWNjZXB0IGRlbGV0aW9uICovCisJaWYgKGNtZCA9PSBESVNBQkxFX0tFWSAmJiBrZXktPmh3X2tleV9pZHggPT0gV0VQX0lOVkFMSURfT0ZGU0VUKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApOworCisJQlVJTERfQlVHX09OKFdFUF9JTlZBTElEX09GRlNFVCA9PSBJV0xBR05fSFdfS0VZX0RFRkFVTFQpOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZ2V0dGluZyBXRVAgZ3JvdXAga2V5IGFuZCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkga2V5IG1hcHBpbmcKKwkgKiBzbyBmYXIsIHdlIGFyZSBpbiBsZWdhY3kgd2VwIG1vZGUgKGdyb3VwIGtleSBvbmx5KSwgb3RoZXJ3aXNlIHdlIGFyZQorCSAqIGluIDFYIG1vZGUuCisJICogSW4gbGVnYWN5IHdlcCBtb2RlLCB3ZSB1c2UgYW5vdGhlciBob3N0IGNvbW1hbmQgdG8gdGhlIHVDb2RlLgorCSAqLworCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKKwkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYgIXN0YSkgeworCQlpZiAoY21kID09IFNFVF9LRVkpCisJCQlpc19kZWZhdWx0X3dlcF9rZXkgPSAhY3R4LT5rZXlfbWFwcGluZ19rZXlzOworCQllbHNlCisJCQlpc19kZWZhdWx0X3dlcF9rZXkgPQorCQkJCWtleS0+aHdfa2V5X2lkeCA9PSBJV0xBR05fSFdfS0VZX0RFRkFVTFQ7CisJfQorCisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VUX0tFWToKKwkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkgeworCQkJcmV0ID0gaXdsX3NldF9kZWZhdWx0X3dlcF9rZXkocHJpdiwgdmlmX3ByaXYtPmN0eCwga2V5KTsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IGl3bF9zZXRfZHluYW1pY19rZXkocHJpdiwgdmlmX3ByaXYtPmN0eCwga2V5LCBzdGEpOworCQlpZiAocmV0KSB7CisJCQkvKgorCQkJICogY2FuJ3QgYWRkIGtleSBmb3IgUlgsIGJ1dCB3ZSBkb24ndCBuZWVkIGl0CisJCQkgKiBpbiB0aGUgZGV2aWNlIGZvciBUWCBzbyBzdGlsbCByZXR1cm4gMAorCQkJICovCisJCQlyZXQgPSAwOworCQkJa2V5LT5od19rZXlfaWR4ID0gV0VQX0lOVkFMSURfT0ZGU0VUOworCQl9CisKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbmFibGUgaHdjcnlwdG8ga2V5XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBESVNBQkxFX0tFWToKKwkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKKwkJCXJldCA9IGl3bF9yZW1vdmVfZGVmYXVsdF93ZXBfa2V5KHByaXYsIGN0eCwga2V5KTsKKwkJZWxzZQorCQkJcmV0ID0gaXdsX3JlbW92ZV9keW5hbWljX2tleShwcml2LCBjdHgsIGtleSwgc3RhKTsKKworCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImRpc2FibGUgaHdjcnlwdG8ga2V5XG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19hbXBkdV9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICpzc24sCisJCQkJICAgdTggYnVmX3NpemUpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IHJldCA9IC1FSU5WQUw7CisJc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gIGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOworCisJSVdMX0RFQlVHX0hUKHByaXYsICJBLU1QRFUgYWN0aW9uIG9uIGFkZHIgJXBNIHRpZCAlZFxuIiwKKwkJICAgICBzdGEtPmFkZHIsIHRpZCk7CisKKwlpZiAoIShwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6CisJCUlXTF9ERUJVR19IVChwcml2LCAic3RhcnQgUnhcbiIpOworCQlyZXQgPSBpd2xfc3RhX3J4X2FnZ19zdGFydChwcml2LCBzdGEsIHRpZCwgKnNzbik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6CisJCUlXTF9ERUJVR19IVChwcml2LCAic3RvcCBSeFxuIik7CisJCXJldCA9IGl3bF9zdGFfcnhfYWdnX3N0b3AocHJpdiwgc3RhLCB0aWQpOworCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCisJCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVDoKKwkJSVdMX0RFQlVHX0hUKHByaXYsICJzdGFydCBUeFxuIik7CisJCXJldCA9IGl3bGFnbl90eF9hZ2dfc3RhcnQocHJpdiwgdmlmLCBzdGEsIHRpZCwgc3NuKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUDoKKwkJSVdMX0RFQlVHX0hUKHByaXYsICJzdG9wIFR4XG4iKTsKKwkJcmV0ID0gaXdsYWduX3R4X2FnZ19zdG9wKHByaXYsIHZpZiwgc3RhLCB0aWQpOworCQlpZiAoKHJldCA9PSAwKSAmJiAocHJpdi0+YWdnX3RpZHNfY291bnQgPiAwKSkgeworCQkJcHJpdi0+YWdnX3RpZHNfY291bnQtLTsKKwkJCUlXTF9ERUJVR19IVChwcml2LCAicHJpdi0+YWdnX3RpZHNfY291bnQgPSAldVxuIiwKKwkJCQkgICAgIHByaXYtPmFnZ190aWRzX2NvdW50KTsKKwkJfQorCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCisJCQlyZXQgPSAwOworCQlpZiAoIXByaXYtPmFnZ190aWRzX2NvdW50ICYmIHByaXYtPmNmZy0+aHRfcGFyYW1zICYmCisJCSAgICBwcml2LT5jZmctPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24pIHsKKwkJCS8qCisJCQkgKiBzd2l0Y2ggb2ZmIFJUUy9DVFMgaWYgaXQgd2FzIHByZXZpb3VzbHkgZW5hYmxlZAorCQkJICovCisJCQlzdGFfcHJpdi0+bHFfc3RhLmxxLmdlbmVyYWxfcGFyYW1zLmZsYWdzICY9CisJCQkJfkxJTktfUVVBTF9GTEFHU19TRVRfU1RBX1RMQ19SVFNfTVNLOworCQkJaXdsX3NlbmRfbHFfY21kKHByaXYsIGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLAorCQkJCQkmc3RhX3ByaXYtPmxxX3N0YS5scSwgQ01EX0FTWU5DLCBmYWxzZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUw6CisJCWJ1Zl9zaXplID0gbWluX3QoaW50LCBidWZfc2l6ZSwgTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9ERUYpOworCisJCWl3bF90cmFuc190eF9hZ2dfc2V0dXAodHJhbnMocHJpdiksIGN0eC0+Y3R4aWQsIGl3bF9zdGFfaWQoc3RhKSwKKwkJCQl0aWQsIGJ1Zl9zaXplKTsKKworCQkvKgorCQkgKiBJZiB0aGUgbGltaXQgaXMgMCwgdGhlbiBpdCB3YXNuJ3QgaW5pdGlhbGlzZWQgeWV0LAorCQkgKiB1c2UgdGhlIGRlZmF1bHQuIFdlIGNhbiBkbyB0aGF0IHNpbmNlIHdlIHRha2UgdGhlCisJCSAqIG1pbmltdW0gYmVsb3csIGFuZCB3ZSBkb24ndCB3YW50IHRvIGdvIGFib3ZlIG91cgorCQkgKiBkZWZhdWx0IGR1ZSB0byBoYXJkd2FyZSByZXN0cmljdGlvbnMuCisJCSAqLworCQlpZiAoc3RhX3ByaXYtPm1heF9hZ2dfYnVmc2l6ZSA9PSAwKQorCQkJc3RhX3ByaXYtPm1heF9hZ2dfYnVmc2l6ZSA9CisJCQkJTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9ERUY7CisKKwkJLyoKKwkJICogRXZlbiB0aG91Z2ggaW4gdGhlb3J5IHRoZSBwZWVyIGNvdWxkIGhhdmUgZGlmZmVyZW50CisJCSAqIGFnZ3JlZ2F0aW9uIHJlb3JkZXIgYnVmZmVyIHNpemVzIGZvciBkaWZmZXJlbnQgc2Vzc2lvbnMsCisJCSAqIG91ciB1Y29kZSBkb2Vzbid0IGFsbG93IGZvciB0aGF0IGFuZCBoYXMgYSBnbG9iYWwgbGltaXQKKwkJICogZm9yIGVhY2ggc3RhdGlvbi4gVGhlcmVmb3JlLCB1c2UgdGhlIG1pbmltdW0gb2YgYWxsIHRoZQorCQkgKiBhZ2dyZWdhdGlvbiBzZXNzaW9ucyBhbmQgb3VyIGRlZmF1bHQgdmFsdWUuCisJCSAqLworCQlzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplID0KKwkJCW1pbihzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplLCBidWZfc2l6ZSk7CisKKwkJaWYgKHByaXYtPmNmZy0+aHRfcGFyYW1zICYmCisJCSAgICBwcml2LT5jZmctPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24pIHsKKwkJCS8qCisJCQkgKiBzd2l0Y2ggdG8gUlRTL0NUUyBpZiBpdCBpcyB0aGUgcHJlZmVyIHByb3RlY3Rpb24KKwkJCSAqIG1ldGhvZCBmb3IgSFQgdHJhZmZpYworCQkJICovCisKKwkJCXN0YV9wcml2LT5scV9zdGEubHEuZ2VuZXJhbF9wYXJhbXMuZmxhZ3MgfD0KKwkJCQlMSU5LX1FVQUxfRkxBR1NfU0VUX1NUQV9UTENfUlRTX01TSzsKKwkJfQorCQlwcml2LT5hZ2dfdGlkc19jb3VudCsrOworCQlJV0xfREVCVUdfSFQocHJpdiwgInByaXYtPmFnZ190aWRzX2NvdW50ID0gJXVcbiIsCisJCQkgICAgIHByaXYtPmFnZ190aWRzX2NvdW50KTsKKworCQlzdGFfcHJpdi0+bHFfc3RhLmxxLmFnZ19wYXJhbXMuYWdnX2ZyYW1lX2NudF9saW1pdCA9CisJCQlzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplOworCisJCWl3bF9zZW5kX2xxX2NtZChwcml2LCBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKSwKKwkJCQkmc3RhX3ByaXYtPmxxX3N0YS5scSwgQ01EX0FTWU5DLCBmYWxzZSk7CisKKwkJSVdMX0lORk8ocHJpdiwgIlR4IGFnZ3JlZ2F0aW9uIGVuYWJsZWQgb24gcmEgPSAlcE0gdGlkID0gJWRcbiIsCisJCQkgc3RhLT5hZGRyLCB0aWQpOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3N0YV9hZGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJYm9vbCBpc19hcCA9IHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOworCWludCByZXQgPSAwOworCXU4IHN0YV9pZDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAicmVjZWl2ZWQgcmVxdWVzdCB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCisJCQlzdGEtPmFkZHIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCisJCQlzdGEtPmFkZHIpOworCXN0YV9wcml2LT5zdGFfaWQgPSBJV0xfSU5WQUxJRF9TVEFUSU9OOworCisJYXRvbWljX3NldCgmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzLCAwKTsKKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQlzdGFfcHJpdi0+Y2xpZW50ID0gdHJ1ZTsKKworCXJldCA9IGl3bF9hZGRfc3RhdGlvbl9jb21tb24ocHJpdiwgdmlmX3ByaXYtPmN0eCwgc3RhLT5hZGRyLAorCQkJCSAgICAgaXNfYXAsIHN0YSwgJnN0YV9pZCk7CisJaWYgKHJldCkgeworCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNICglZClcbiIsCisJCQlzdGEtPmFkZHIsIHJldCk7CisJCS8qIFNob3VsZCB3ZSByZXR1cm4gc3VjY2VzcyBpZiByZXR1cm4gY29kZSBpcyBFRVhJU1QgPyAqLworCQlnb3RvIG91dDsKKwl9CisKKwlzdGFfcHJpdi0+c3RhX2lkID0gc3RhX2lkOworCisJLyogSW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgKi8KKwlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdGlhbGl6aW5nIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE1cbiIsCisJCSAgICAgICBzdGEtPmFkZHIpOworCWl3bF9yc19yYXRlX2luaXQocHJpdiwgc3RhLCBzdGFfaWQpOworIG91dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBjaF9zd2l0Y2gtPmNoYW5uZWw7CisJc3RydWN0IGl3bF9odF9jb25maWcgKmh0X2NvbmYgPSAmcHJpdi0+Y3VycmVudF9odF9jb25maWc7CisJLyoKKwkgKiBNVUxUSS1GSVhNRQorCSAqIFdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGludGVyZmFjZXMsIHdlIG5lZWQgdG8KKwkgKiByZXZpc2l0IHRoaXMuIFRoZSBjaGFubmVsIHN3aXRjaCBjb21tYW5kIGluIHRoZSBkZXZpY2UKKwkgKiBvbmx5IGFmZmVjdHMgdGhlIEJTUyBjb250ZXh0LCBidXQgd2hhdCBkb2VzIHRoYXQgcmVhbGx5CisJICogbWVhbj8gQW5kIHdoYXQgaWYgd2UgZ2V0IGEgQ1NBIG9uIHRoZSBzZWNvbmQgaW50ZXJmYWNlPworCSAqIFRoaXMgbmVlZHMgYSBsb3Qgb2Ygd29yay4KKwkgKi8KKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOworCXUxNiBjaDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKGl3bF9pc19yZmtpbGwocHJpdi0+c2hyZCkpCisJCWdvdG8gb3V0OworCisJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnNocmQtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlmICghaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCisJCWdvdG8gb3V0OworCisJaWYgKCFwcml2LT5jZmctPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKQorCQlnb3RvIG91dDsKKworCWNoID0gY2hhbm5lbC0+aHdfdmFsdWU7CisJaWYgKGxlMTZfdG9fY3B1KGN0eC0+YWN0aXZlLmNoYW5uZWwpID09IGNoKQorCQlnb3RvIG91dDsKKworCWNoX2luZm8gPSBpd2xfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBjaGFubmVsLT5iYW5kLCBjaCk7CisJaWYgKCFpc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiaW52YWxpZCBjaGFubmVsXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+c2hyZC0+bG9jayk7CisKKwlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOworCisJLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KKwljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOworCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKKwkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgeworCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOworCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7CisJCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKKwkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKKwkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOworCQl9IGVsc2UgeworCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7CisJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CisJCX0KKwl9IGVsc2UKKwkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOworCisJaWYgKChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgIT0gY2gpKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOworCisJaXdsX3NldF9yeG9uX2NoYW5uZWwocHJpdiwgY2hhbm5lbCwgY3R4KTsKKwlpd2xfc2V0X3J4b25faHQocHJpdiwgaHRfY29uZik7CisJaXdsX3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW5uZWwtPmJhbmQsIGN0eC0+dmlmKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+c2hyZC0+bG9jayk7CisKKwlpd2xfc2V0X3JhdGUocHJpdik7CisJLyoKKwkgKiBhdCB0aGlzIHBvaW50LCBzdGFnaW5nX3J4b24gaGFzIHRoZQorCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCisJICovCisJc2V0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7CisJcHJpdi0+c3dpdGNoX2NoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7CisJaWYgKHByaXYtPmNmZy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gocHJpdiwgY2hfc3dpdGNoKSkgeworCQljbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpOworCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7CisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKKwkJCQkgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKKwkJCQkgICAgdTY0IG11bHRpY2FzdCkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlfX2xlMzIgZmlsdGVyX29yID0gMCwgZmlsdGVyX25hbmQgPSAwOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7CisKKyNkZWZpbmUgQ0hLKHRlc3QsIGZsYWcpCWRvIHsgXAorCWlmICgqdG90YWxfZmxhZ3MgJiAodGVzdCkpCQlcCisJCWZpbHRlcl9vciB8PSAoZmxhZyk7CQlcCisJZWxzZQkJCQkJXAorCQlmaWx0ZXJfbmFuZCB8PSAoZmxhZyk7CQlcCisJfSB3aGlsZSAoMCkKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiRW50ZXI6IGNoYW5nZWQ6IDB4JXgsIHRvdGFsOiAweCV4XG4iLAorCQkJY2hhbmdlZF9mbGFncywgKnRvdGFsX2ZsYWdzKTsKKworCUNISyhGSUZfT1RIRVJfQlNTIHwgRklGX1BST01JU0NfSU5fQlNTLCBSWE9OX0ZJTFRFUl9QUk9NSVNDX01TSyk7CisJLyogU2V0dGluZyBfanVzdF8gUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIGNhdXNlcyBGSCBlcnJvcnMgKi8KKwlDSEsoRklGX0NPTlRST0wsIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyB8IFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKKwlDSEsoRklGX0JDTl9QUkJSRVNQX1BST01JU0MsIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKKworI3VuZGVmIENISworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKKwkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+ZmlsdGVyX25hbmQ7CisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gZmlsdGVyX29yOworCisJCS8qCisJCSAqIE5vdCBjb21taXR0aW5nIGRpcmVjdGx5IGJlY2F1c2UgaGFyZHdhcmUgY2FuIHBlcmZvcm0gYSBzY2FuLAorCQkgKiBidXQgd2UnbGwgZXZlbnR1YWxseSBjb21taXQgdGhlIGZpbHRlciBmbGFncyBjaGFuZ2UgYW55d2F5LgorCQkgKi8KKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCS8qCisJICogUmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIGlzIGFsd2F5cyBlbmFibGVkIGJ5IHRoZQorCSAqIGRlZmF1bHQgZmxhZ3Mgc2V0dXAgaW4gaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoKQorCSAqIHNpbmNlIHdlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBwcm9ncmFtbWluZyBtdWx0aWNhc3QKKwkgKiBmaWx0ZXJzIGludG8gdGhlIGRldmljZS4KKwkgKi8KKwkqdG90YWxfZmxhZ3MgJj0gRklGX09USEVSX0JTUyB8IEZJRl9BTExNVUxUSSB8IEZJRl9QUk9NSVNDX0lOX0JTUyB8CisJCQlGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQyB8IEZJRl9DT05UUk9MOworfQorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGRyb3ApCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKKwkJSVdMX0RFQlVHX1RYKHByaXYsICJBYm9ydGluZyBmbHVzaCBkdWUgdG8gZGV2aWNlIHNodXRkb3duXG4iKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoaXdsX2lzX3Jma2lsbChwcml2LT5zaHJkKSkgeworCQlJV0xfREVCVUdfVFgocHJpdiwgIkFib3J0aW5nIGZsdXNoIGR1ZSB0byBSRiBLaWxsXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogbWFjODAyMTEgd2lsbCBub3QgcHVzaCBhbnkgbW9yZSBmcmFtZXMgZm9yIHRyYW5zbWl0CisJICogdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlZAorCSAqLworCWlmIChkcm9wKSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAic2VuZCBmbHVzaCBjb21tYW5kXG4iKTsKKwkJaWYgKGl3bGFnbl90eGZpZm9fZmx1c2gocHJpdiwgSVdMX0RST1BfQUxMKSkgeworCQkJSVdMX0VSUihwcml2LCAiZmx1c2ggcmVxdWVzdCBmYWlsXG4iKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIndhaXQgdHJhbnNtaXQvZmx1c2ggYWxsIGZyYW1lc1xuIik7CisJaXdsX3RyYW5zX3dhaXRfdHhfcXVldWVfZW1wdHkodHJhbnMocHJpdikpOworZG9uZToKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3JlbWFpbl9vbl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisJCQkJICAgICBpbnQgZHVyYXRpb24pCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfUEFOXTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghKHByaXYtPnNocmQtPnZhbGlkX2NvbnRleHRzICYgQklUKElXTF9SWE9OX0NUWF9QQU4pKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEoY3R4LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zaHJkLT5zdGF0dXMpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJpdi0+aHdfcm9jX2NoYW5uZWwgPSBjaGFubmVsOworCXByaXYtPmh3X3JvY19jaGFudHlwZSA9IGNoYW5uZWxfdHlwZTsKKwkvKiBjb252ZXJ0IGZyb20gbXMgdG8gVFUgKi8KKwlwcml2LT5od19yb2NfZHVyYXRpb24gPSBESVZfUk9VTkRfVVAoMTAwMCAqIGR1cmF0aW9uLCAxMDI0KTsKKwlwcml2LT5od19yb2Nfc3RhcnRfbm90aWZpZWQgPSBmYWxzZTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5od19yb2NfZGlzYWJsZV93b3JrKTsKKworCWlmICghY3R4LT5pc19hY3RpdmUpIHsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfcW9zX2luZm8gZGVmYXVsdF9xb3NfZGF0YSA9IHsKKwkJCS5kZWZfcW9zX3Bhcm0gPSB7CisJCQkJLmFjWzBdID0geworCQkJCQkuY3dfbWluID0gY3B1X3RvX2xlMTYoMyksCisJCQkJCS5jd19tYXggPSBjcHVfdG9fbGUxNig3KSwKKwkJCQkJLmFpZnNuID0gMiwKKwkJCQkJLmVkY2FfdHhvcCA9IGNwdV90b19sZTE2KDE1MDQpLAorCQkJCX0sCisJCQkJLmFjWzFdID0geworCQkJCQkuY3dfbWluID0gY3B1X3RvX2xlMTYoNyksCisJCQkJCS5jd19tYXggPSBjcHVfdG9fbGUxNigxNSksCisJCQkJCS5haWZzbiA9IDIsCisJCQkJCS5lZGNhX3R4b3AgPSBjcHVfdG9fbGUxNigzMDA4KSwKKwkJCQl9LAorCQkJCS5hY1syXSA9IHsKKwkJCQkJLmN3X21pbiA9IGNwdV90b19sZTE2KDE1KSwKKwkJCQkJLmN3X21heCA9IGNwdV90b19sZTE2KDEwMjMpLAorCQkJCQkuYWlmc24gPSAzLAorCQkJCX0sCisJCQkJLmFjWzNdID0geworCQkJCQkuY3dfbWluID0gY3B1X3RvX2xlMTYoMTUpLAorCQkJCQkuY3dfbWF4ID0gY3B1X3RvX2xlMTYoMTAyMyksCisJCQkJCS5haWZzbiA9IDcsCisJCQkJfSwKKwkJCX0sCisJCX07CisKKwkJY3R4LT5pc19hY3RpdmUgPSB0cnVlOworCQljdHgtPnFvc19kYXRhID0gZGVmYXVsdF9xb3NfZGF0YTsKKwkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gUlhPTl9ERVZfVFlQRV9QMlA7CisJCW1lbWNweShjdHgtPnN0YWdpbmcubm9kZV9hZGRyLAorCQkgICAgICAgcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uc3RhZ2luZy5ub2RlX2FkZHIsCisJCSAgICAgICBFVEhfQUxFTik7CisJCW1lbWNweShjdHgtPnN0YWdpbmcuYnNzaWRfYWRkciwKKwkJICAgICAgIHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnN0YWdpbmcubm9kZV9hZGRyLAorCQkgICAgICAgRVRIX0FMRU4pOworCQllcnIgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSyB8CisJCQkJCSAgICAgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0sgfAorCQkJCQkgICAgIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSzsKKworCQllcnIgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKKwkJaWYgKGVycikgeworCQkJaXdsYWduX2Rpc2FibGVfcm9jKHByaXYpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJpdi0+aHdfcm9jX3NldHVwID0gdHJ1ZTsKKwl9CisKKwllcnIgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCBjdHgtPnZpZiwgSVdMX1NDQU5fUk9DLCBjaGFubmVsLT5iYW5kKTsKKwlpZiAoZXJyKQorCQlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJaWYgKCEocHJpdi0+c2hyZC0+dmFsaWRfY29udGV4dHMgJiBCSVQoSVdMX1JYT05fQ1RYX1BBTikpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgcHJpdi0+aHdfcm9jX2R1cmF0aW9uKTsKKwlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3R4X3N5bmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgY29uc3QgdTggKmJzc2lkLAorCQkJICAgICAgZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHR5cGUpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHZpZl9wcml2LT5jdHg7CisJaW50IHJldDsKKwl1OCBzdGFfaWQ7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAoaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGN0eC0+cHJlYXV0aF9ic3NpZCB8fCB0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywKKwkgICAgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBpd2xfYWRkX3N0YXRpb25fY29tbW9uKHByaXYsIGN0eCwgYnNzaWQsIHRydWUsIE5VTEwsICZzdGFfaWQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKFdBUk5fT04oc3RhX2lkICE9IGN0eC0+YXBfc3RhX2lkKSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9yZW1vdmVfc3RhOworCX0KKworCW1lbWNweShjdHgtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCWN0eC0+cHJlYXV0aF9ic3NpZCA9IHRydWU7CisKKwlyZXQgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKKworCWlmIChyZXQgPT0gMCkKKwkJZ290byBvdXQ7CisKKyBvdXRfcmVtb3ZlX3N0YToKKwlpd2xfcmVtb3ZlX3N0YXRpb24ocHJpdiwgc3RhX2lkLCBic3NpZCk7Cisgb3V0OgorCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX21hY19maW5pc2hfdHhfc3luYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgIGNvbnN0IHU4ICpic3NpZCwKKwkJCQkgICBlbnVtIGllZWU4MDIxMV90eF9zeW5jX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWlmIChpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKKwkJZ290byBvdXQ7CisKKwlpd2xfcmVtb3ZlX3N0YXRpb24ocHJpdiwgY3R4LT5hcF9zdGFfaWQsIGJzc2lkKTsKKwljdHgtPnByZWF1dGhfYnNzaWQgPSBmYWxzZTsKKwkvKiBubyBuZWVkIHRvIGNvbW1pdCAqLworIG91dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX21hY19yc3NpX2NhbGxiYWNrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudCByc3NpX2V2ZW50KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCisJCQlwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgeworCQlpZiAocnNzaV9ldmVudCA9PSBSU1NJX0VWRU5UX0xPVykKKwkJCXByaXYtPmJ0X2VuYWJsZV9wc3BvbGwgPSB0cnVlOworCQllbHNlIGlmIChyc3NpX2V2ZW50ID09IFJTU0lfRVZFTlRfSElHSCkKKwkJCXByaXYtPmJ0X2VuYWJsZV9wc3BvbGwgPSBmYWxzZTsKKworCQlpd2xhZ25fc2VuZF9hZHZhbmNlX2J0X2NvbmZpZyhwcml2KTsKKwl9IGVsc2UgeworCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIkFkdmFuY2VkIEJUIGNvZXggZGlzYWJsZWQsIgorCQkJCSJpZ25vcmluZyBSU1NJIGNhbGxiYWNrXG4iKTsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3NldF90aW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBib29sIHNldCkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCXF1ZXVlX3dvcmsocHJpdi0+c2hyZC0+d29ya3F1ZXVlLCAmcHJpdi0+YmVhY29uX3VwZGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCisJCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSB2aWZfcHJpdi0+Y3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHE7CisKKwlpZiAoV0FSTl9PTighY3R4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCWlmICghaXdsX2lzX3JlYWR5X3JmKHByaXYtPnNocmQpKSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBSRiBub3QgcmVhZHlcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAocXVldWUgPj0gQUNfTlVNKSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBxdWV1ZSA+PSBBQ19OVU0gJWRcbiIsIHF1ZXVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcSA9IEFDX05VTSAtIDEgLSBxdWV1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zaHJkLT5sb2NrLCBmbGFncyk7CisKKwljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5jd19taW4gPQorCQljcHVfdG9fbGUxNihwYXJhbXMtPmN3X21pbik7CisJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uY3dfbWF4ID0KKwkJY3B1X3RvX2xlMTYocGFyYW1zLT5jd19tYXgpOworCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmFpZnNuID0gcGFyYW1zLT5haWZzOworCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmVkY2FfdHhvcCA9CisJCQljcHVfdG9fbGUxNigocGFyYW1zLT50eG9wICogMzIpKTsKKworCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLnJlc2VydmVkMSA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5sb2NrLCBmbGFncyk7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3R4X2xhc3RfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJcmV0dXJuIHByaXYtPmlic3NfbWFuYWdlciA9PSBJV0xfSUJTU19NQU5BR0VSOworfQorCitzdGF0aWMgaW50IGl3bF9zZXRfbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcocHJpdiwgY3R4KTsKKworCWl3bGFnbl9zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOworCisJcmV0dXJuIGl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOworfQorCitzdGF0aWMgaW50IGl3bF9zZXR1cF9pbnRlcmZhY2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCWludCBlcnI7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwkvKgorCSAqIFRoaXMgdmFyaWFibGUgd2lsbCBiZSBjb3JyZWN0IG9ubHkgd2hlbiB0aGVyZSdzIGp1c3QKKwkgKiBhIHNpbmdsZSBjb250ZXh0LCBidXQgYWxsIGNvZGUgdXNpbmcgaXQgaXMgZm9yIGhhcmR3YXJlCisJICogdGhhdCBzdXBwb3J0cyBvbmx5IG9uZSBjb250ZXh0LgorCSAqLworCXByaXYtPml3X21vZGUgPSB2aWYtPnR5cGU7CisKKwljdHgtPmlzX2FjdGl2ZSA9IHRydWU7CisKKwllcnIgPSBpd2xfc2V0X21vZGUocHJpdiwgY3R4KTsKKwlpZiAoZXJyKSB7CisJCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQorCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKKwkgICAgdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJCS8qCisJCSAqIHByZXRlbmQgdG8gaGF2ZSBoaWdoIEJUIHRyYWZmaWMgYXMgbG9uZyBhcyB3ZQorCQkgKiBhcmUgb3BlcmF0aW5nIGluIElCU1MgbW9kZSwgYXMgdGhpcyB3aWxsIGNhdXNlCisJCSAqIHRoZSByYXRlIHNjYWxpbmcgZXRjLiB0byBiZWhhdmUgYXMgaW50ZW5kZWQuCisJCSAqLworCQlwcml2LT5idF90cmFmZmljX2xvYWQgPSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfSElHSDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKnRtcCwgKmN0eCA9IE5VTEw7CisJaW50IGVycjsKKwllbnVtIG5sODAyMTFfaWZ0eXBlIHZpZnR5cGUgPSBpZWVlODAyMTFfdmlmX3R5cGVfcDJwKHZpZik7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyOiB0eXBlICVkLCBhZGRyICVwTVxuIiwKKwkJCSAgIHZpZnR5cGUsIHZpZi0+YWRkcik7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmh3X3JvY19kaXNhYmxlX3dvcmspOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaXdsYWduX2Rpc2FibGVfcm9jKHByaXYpOworCisJaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdi0+c2hyZCkpIHsKKwkJSVdMX1dBUk4ocHJpdiwgIlRyeSB0byBhZGQgaW50ZXJmYWNlIHdoZW4gZGV2aWNlIG5vdCByZWFkeVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgdG1wKSB7CisJCXUzMiBwb3NzaWJsZV9tb2RlcyA9CisJCQl0bXAtPmludGVyZmFjZV9tb2RlcyB8IHRtcC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKKworCQlpZiAodG1wLT52aWYpIHsKKwkJCS8qIGNoZWNrIGlmIHRoaXMgYnVzeSBjb250ZXh0IGlzIGV4Y2x1c2l2ZSAqLworCQkJaWYgKHRtcC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmCisJCQkJCQlCSVQodG1wLT52aWYtPnR5cGUpKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCEocG9zc2libGVfbW9kZXMgJiBCSVQodmlmdHlwZSkpKQorCQkJY29udGludWU7CisKKwkJLyogaGF2ZSBtYXliZSB1c2FibGUgY29udGV4dCB3L28gaW50ZXJmYWNlICovCisJCWN0eCA9IHRtcDsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFjdHgpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCXZpZl9wcml2LT5jdHggPSBjdHg7CisJY3R4LT52aWYgPSB2aWY7CisKKwllcnIgPSBpd2xfc2V0dXBfaW50ZXJmYWNlKHByaXYsIGN0eCk7CisJaWYgKCFlcnIpCisJCWdvdG8gb3V0OworCisJY3R4LT52aWYgPSBOVUxMOworCXByaXYtPml3X21vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOworIG91dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF90ZWFyZG93bl9pbnRlcmZhY2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgYm9vbCBtb2RlX2NoYW5nZSkKK3sKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAocHJpdi0+c2Nhbl92aWYgPT0gdmlmKSB7CisJCWl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7CisJCWl3bF9mb3JjZV9zY2FuX2VuZChwcml2KTsKKwl9CisKKwlpZiAoIW1vZGVfY2hhbmdlKSB7CisJCWl3bF9zZXRfbW9kZShwcml2LCBjdHgpOworCQlpZiAoIWN0eC0+YWx3YXlzX2FjdGl2ZSkKKwkJCWN0eC0+aXNfYWN0aXZlID0gZmFsc2U7CisJfQorCisJLyoKKwkgKiBXaGVuIHJlbW92aW5nIHRoZSBJQlNTIGludGVyZmFjZSwgb3ZlcndyaXRlIHRoZQorCSAqIEJUIHRyYWZmaWMgbG9hZCB3aXRoIHRoZSBzdG9yZWQgb25lIGZyb20gdGhlIGxhc3QKKwkgKiBub3RpZmljYXRpb24sIGlmIGFueS4gSWYgdGhpcyBpcyBhIGRldmljZSB0aGF0CisJICogZG9lc24ndCBpbXBsZW1lbnQgdGhpcywgdGhpcyBoYXMgbm8gZWZmZWN0IHNpbmNlCisJICogYm90aCB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFuZCB6ZXJvLgorCSAqLworCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCXByaXYtPmJ0X3RyYWZmaWNfbG9hZCA9IHByaXYtPmxhc3RfYnRfdHJhZmZpY19sb2FkOworfQorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKFdBUk5fT04oY3R4LT52aWYgIT0gdmlmKSkgeworCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wOworCQlJV0xfRVJSKHByaXYsICJjdHgtPnZpZiA9ICVwLCB2aWYgPSAlcFxuIiwgY3R4LT52aWYsIHZpZik7CisJCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgdG1wKQorCQkJSVdMX0VSUihwcml2LCAiXHRJRCA9ICVkOlx0Y3R4ID0gJXBcdGN0eC0+dmlmID0gJXBcbiIsCisJCQkJdG1wLT5jdHhpZCwgdG1wLCB0bXAtPnZpZik7CisJfQorCWN0eC0+dmlmID0gTlVMTDsKKworCWl3bF90ZWFyZG93bl9pbnRlcmZhY2UocHJpdiwgdmlmLCBmYWxzZSk7CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19jaGFuZ2VfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJZW51bSBubDgwMjExX2lmdHlwZSBuZXd0eXBlLCBib29sIG5ld3AycCkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmJzc19jdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKnRtcDsKKwllbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3ZpZnR5cGUgPSBuZXd0eXBlOworCXUzMiBpbnRlcmZhY2VfbW9kZXM7CisJaW50IGVycjsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJbmV3dHlwZSA9IGllZWU4MDIxMV9pZnR5cGVfcDJwKG5ld3R5cGUsIG5ld3AycCk7CisKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAoIWN0eC0+dmlmIHx8ICFpd2xfaXNfcmVhZHlfcmYocHJpdi0+c2hyZCkpIHsKKwkJLyoKKwkJICogSHVoPyBCdXQgd2FpdCAuLi4gdGhpcyBjYW4gbWF5YmUgaGFwcGVuIHdoZW4KKwkJICogd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIGZpcm13YXJlIHJlc3RhcnQhCisJCSAqLworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWludGVyZmFjZV9tb2RlcyA9IGN0eC0+aW50ZXJmYWNlX21vZGVzIHwgY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOworCisJaWYgKCEoaW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogUmVmdXNlIGEgY2hhbmdlIHRoYXQgc2hvdWxkIGJlIGRvbmUgYnkgbW92aW5nIGZyb20gdGhlIFBBTgorCSAqIGNvbnRleHQgdG8gdGhlIEJTUyBjb250ZXh0IGluc3RlYWQsIGlmIHRoZSBCU1MgY29udGV4dCBpcworCSAqIGF2YWlsYWJsZSBhbmQgY2FuIHN1cHBvcnQgdGhlIG5ldyBpbnRlcmZhY2UgdHlwZS4KKwkgKi8KKwlpZiAoY3R4LT5jdHhpZCA9PSBJV0xfUlhPTl9DVFhfUEFOICYmICFic3NfY3R4LT52aWYgJiYKKwkgICAgKGJzc19jdHgtPmludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSB8fAorCSAgICAgYnNzX2N0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSkpIHsKKwkJQlVJTERfQlVHX09OKE5VTV9JV0xfUlhPTl9DVFggIT0gMik7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSkgeworCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkgeworCQkJaWYgKGN0eCA9PSB0bXApCisJCQkJY29udGludWU7CisKKwkJCWlmICghdG1wLT52aWYpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBUaGUgY3VycmVudCBtb2RlIHN3aXRjaCB3b3VsZCBiZSBleGNsdXNpdmUsIGJ1dAorCQkJICogYW5vdGhlciBjb250ZXh0IGlzIGFjdGl2ZSAuLi4gcmVmdXNlIHRoZSBzd2l0Y2guCisJCQkgKi8KKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogc3VjY2VzcyAqLworCWl3bF90ZWFyZG93bl9pbnRlcmZhY2UocHJpdiwgdmlmLCB0cnVlKTsKKwl2aWYtPnR5cGUgPSBuZXd2aWZ0eXBlOworCXZpZi0+cDJwID0gbmV3cDJwOworCWVyciA9IGl3bF9zZXR1cF9pbnRlcmZhY2UocHJpdiwgY3R4KTsKKwlXQVJOX09OKGVycik7CisJLyoKKwkgKiBXZSd2ZSBzd2l0Y2hlZCBpbnRlcm5hbGx5LCBidXQgc3VibWl0dGluZyB0byB0aGUKKwkgKiBkZXZpY2UgbWF5IGhhdmUgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gTWFzayB0aGlzCisJICogZXJyb3IsIGJlY2F1c2Ugb3RoZXJ3aXNlIG1hYzgwMjExIHdpbGwgbm90IHN3aXRjaAorCSAqIChhbmQgc2V0IHRoZSBpbnRlcmZhY2UgdHlwZSBiYWNrKSBhbmQgd2UnbGwgYmUKKwkgKiBvdXQgb2Ygc3luYyB3aXRoIGl0LgorCSAqLworCWVyciA9IDA7CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfaHdfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IHJldDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJaWYgKHJlcS0+bl9jaGFubmVscyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCS8qCisJICogSWYgYW4gaW50ZXJuYWwgc2NhbiBpcyBpbiBwcm9ncmVzcywganVzdCBzZXQKKwkgKiB1cCB0aGUgc2Nhbl9yZXF1ZXN0IGFzIHBlciBhYm92ZS4KKwkgKi8KKwlpZiAocHJpdi0+c2Nhbl90eXBlICE9IElXTF9TQ0FOX05PUk1BTCkgeworCQlJV0xfREVCVUdfU0NBTihwcml2LAorCQkJICAgICAgICJTQ0FOIHJlcXVlc3QgZHVyaW5nIGludGVybmFsIHNjYW4gLSBkZWZlclxuIik7CisJCXByaXYtPnNjYW5fcmVxdWVzdCA9IHJlcTsKKwkJcHJpdi0+c2Nhbl92aWYgPSB2aWY7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxOworCQlwcml2LT5zY2FuX3ZpZiA9IHZpZjsKKwkJLyoKKwkJICogbWFjODAyMTEgd2lsbCBvbmx5IGFzayBmb3Igb25lIGJhbmQgYXQgYSB0aW1lCisJCSAqIHNvIHVzaW5nIGNoYW5uZWxzWzBdIGhlcmUgaXMgb2sKKwkJICovCisJCXJldCA9IGl3bF9zY2FuX2luaXRpYXRlKHByaXYsIHZpZiwgSVdMX1NDQU5fTk9STUFMLAorCQkJCQlyZXEtPmNoYW5uZWxzWzBdLT5iYW5kKTsKKwkJaWYgKHJldCkgeworCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKKwkJCXByaXYtPnNjYW5fdmlmID0gTlVMTDsKKwkJfQorCX0KKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlpbnQgcmV0OworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlcjogcmVjZWl2ZWQgcmVxdWVzdCB0byByZW1vdmUgIgorCQkJICAgInN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byByZW1vdmUgc3RhdGlvbiAlcE1cbiIsCisJCQlzdGEtPmFkZHIpOworCXJldCA9IGl3bF9yZW1vdmVfc3RhdGlvbihwcml2LCBzdGFfcHJpdi0+c3RhX2lkLCBzdGEtPmFkZHIpOworCWlmIChyZXQpCisJCUlXTF9ERUJVR19RVUlFVF9SRktJTEwocHJpdiwgIkVycm9yIHJlbW92aW5nIHN0YXRpb24gJXBNXG4iLAorCQkJc3RhLT5hZGRyKTsKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9zdGFfbW9kaWZ5X3BzX3dha2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGF0aW9uX2ZsYWdzICY9IH5TVEFfRkxHX1BXUl9TQVZFX01TSzsKKwlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGF0aW9uX2ZsYWdzX21zayA9IFNUQV9GTEdfUFdSX1NBVkVfTVNLOworCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IDA7CisJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc2xlZXBfdHhfY291bnQgPSAwOworCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCWl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBDTURfQVNZTkMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CisKK30KKworc3RhdGljIHZvaWQgaXdsYWduX21hY19zdGFfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgIGVudW0gc3RhX25vdGlmeV9jbWQgY21kLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJaW50IHN0YV9pZDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNUQV9OT1RJRllfU0xFRVA6CisJCVdBUk5fT04oIXN0YV9wcml2LT5jbGllbnQpOworCQlzdGFfcHJpdi0+YXNsZWVwID0gdHJ1ZTsKKwkJaWYgKGF0b21pY19yZWFkKCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMpID4gMCkKKwkJCWllZWU4MDIxMV9zdGFfYmxvY2tfYXdha2UoaHcsIHN0YSwgdHJ1ZSk7CisJCWJyZWFrOworCWNhc2UgU1RBX05PVElGWV9BV0FLRToKKwkJV0FSTl9PTighc3RhX3ByaXYtPmNsaWVudCk7CisJCWlmICghc3RhX3ByaXYtPmFzbGVlcCkKKwkJCWJyZWFrOworCQlzdGFfcHJpdi0+YXNsZWVwID0gZmFsc2U7CisJCXN0YV9pZCA9IGl3bF9zdGFfaWQoc3RhKTsKKwkJaWYgKHN0YV9pZCAhPSBJV0xfSU5WQUxJRF9TVEFUSU9OKQorCQkJaXdsX3N0YV9tb2RpZnlfcHNfd2FrZShwcml2LCBzdGFfaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Cit9CisKK3N0cnVjdCBpZWVlODAyMTFfb3BzIGl3bGFnbl9od19vcHMgPSB7CisJLnR4ID0gaXdsYWduX21hY190eCwKKwkuc3RhcnQgPSBpd2xhZ25fbWFjX3N0YXJ0LAorCS5zdG9wID0gaXdsYWduX21hY19zdG9wLAorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorCS5zdXNwZW5kID0gaXdsYWduX21hY19zdXNwZW5kLAorCS5yZXN1bWUgPSBpd2xhZ25fbWFjX3Jlc3VtZSwKKyNlbmRpZgorCS5hZGRfaW50ZXJmYWNlID0gaXdsYWduX21hY19hZGRfaW50ZXJmYWNlLAorCS5yZW1vdmVfaW50ZXJmYWNlID0gaXdsYWduX21hY19yZW1vdmVfaW50ZXJmYWNlLAorCS5jaGFuZ2VfaW50ZXJmYWNlID0gaXdsYWduX21hY19jaGFuZ2VfaW50ZXJmYWNlLAorCS5jb25maWcgPSBpd2xhZ25fbWFjX2NvbmZpZywKKwkuY29uZmlndXJlX2ZpbHRlciA9IGl3bGFnbl9jb25maWd1cmVfZmlsdGVyLAorCS5zZXRfa2V5ID0gaXdsYWduX21hY19zZXRfa2V5LAorCS51cGRhdGVfdGtpcF9rZXkgPSBpd2xhZ25fbWFjX3VwZGF0ZV90a2lwX2tleSwKKwkuc2V0X3Jla2V5X2RhdGEgPSBpd2xhZ25fbWFjX3NldF9yZWtleV9kYXRhLAorCS5jb25mX3R4ID0gaXdsYWduX21hY19jb25mX3R4LAorCS5ic3NfaW5mb19jaGFuZ2VkID0gaXdsYWduX2Jzc19pbmZvX2NoYW5nZWQsCisJLmFtcGR1X2FjdGlvbiA9IGl3bGFnbl9tYWNfYW1wZHVfYWN0aW9uLAorCS5od19zY2FuID0gaXdsYWduX21hY19od19zY2FuLAorCS5zdGFfbm90aWZ5ID0gaXdsYWduX21hY19zdGFfbm90aWZ5LAorCS5zdGFfYWRkID0gaXdsYWduX21hY19zdGFfYWRkLAorCS5zdGFfcmVtb3ZlID0gaXdsYWduX21hY19zdGFfcmVtb3ZlLAorCS5jaGFubmVsX3N3aXRjaCA9IGl3bGFnbl9tYWNfY2hhbm5lbF9zd2l0Y2gsCisJLmZsdXNoID0gaXdsYWduX21hY19mbHVzaCwKKwkudHhfbGFzdF9iZWFjb24gPSBpd2xhZ25fbWFjX3R4X2xhc3RfYmVhY29uLAorCS5yZW1haW5fb25fY2hhbm5lbCA9IGl3bGFnbl9tYWNfcmVtYWluX29uX2NoYW5uZWwsCisJLmNhbmNlbF9yZW1haW5fb25fY2hhbm5lbCA9IGl3bGFnbl9tYWNfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsLAorCS5yc3NpX2NhbGxiYWNrID0gaXdsYWduX21hY19yc3NpX2NhbGxiYWNrLAorCUNGRzgwMjExX1RFU1RNT0RFX0NNRChpd2xhZ25fbWFjX3Rlc3Rtb2RlX2NtZCkKKwlDRkc4MDIxMV9URVNUTU9ERV9EVU1QKGl3bGFnbl9tYWNfdGVzdG1vZGVfZHVtcCkKKwkudHhfc3luYyA9IGl3bGFnbl9tYWNfdHhfc3luYywKKwkuZmluaXNoX3R4X3N5bmMgPSBpd2xhZ25fbWFjX2ZpbmlzaF90eF9zeW5jLAorCS5zZXRfdGltID0gaXdsYWduX21hY19zZXRfdGltLAorfTsKKworLyogVGhpcyBmdW5jdGlvbiBib3RoIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgaHcgYW5kIHByaXYuICovCitzdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfYWxsb2NfYWxsKHZvaWQpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2OworCS8qIG1hYzgwMjExIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoaXMgZGV2aWNlIGluc3RhbmNlLCBpbmNsdWRpbmcKKwkgKiAgIHNwYWNlIGZvciB0aGlzIGRyaXZlcidzIHByaXZhdGUgc3RydWN0dXJlICovCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisKKwlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yoc3RydWN0IGl3bF9wcml2KSwgJml3bGFnbl9od19vcHMpOworCWlmICghaHcpCisJCWdvdG8gb3V0OworCisJcHJpdiA9IGh3LT5wcml2OworCXByaXYtPmh3ID0gaHc7CisKK291dDoKKwlyZXR1cm4gaHc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBjaS5jCmluZGV4IDE5Y2M2YTguLjg1MGVjOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBjaS5jCkBAIC02MCw2ICs2MCw3IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgogCkBAIC0yNTUsNiArMjU2LDggQEAKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweEMwMjAsIGl3bDYwMDVfMmFnbl9zZmZfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDA4NSwgMHhDMjIwLCBpd2w2MDA1XzJhZ25fc2ZmX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDAwODIsIDB4MTM0MSwgaXdsNjAwNV8yYWduX2RfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzA0LCBpd2w2MDA1XzJhZ25fY2ZnKX0sLyogbG93IDVHSHogYWN0aXZlICovCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzA1LCBpd2w2MDA1XzJhZ25fY2ZnKX0sLyogaGlnaCA1R0h6IGFjdGl2ZSAqLwogCiAvKiA2eDMwIFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDAwOEEsIDB4NTMwNSwgaXdsMTAzMF9iZ25fY2ZnKX0sCkBAIC0zMjQsNDYgKzMyNywyOCBAQAogCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDAyMiwgaXdsMjAwMF8yYmduX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTEsIDB4NDIyMiwgaXdsMjAwMF8yYmduX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDQyMiwgaXdsMjAwMF8yYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDAyNiwgaXdsMjAwMF8yYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MSwgMHg0MjI2LCBpd2wyMDAwXzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODkwLCAweDQ0MjYsIGl3bDIwMDBfMmJnX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDgyMiwgaXdsMjAwMF8yYmduX2RfY2ZnKX0sCiAKIC8qIDJ4MzAgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0MDYyLCBpd2wyMDMwXzJiZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4OCwgMHg0MjYyLCBpd2wyMDMwXzJiZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0NDYyLCBpd2wyMDMwXzJiZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0MDY2LCBpd2wyMDMwXzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODg4LCAweDQyNjYsIGl3bDIwMzBfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4ODcsIDB4NDQ2NiwgaXdsMjAzMF8yYmdfY2ZnKX0sCiAKIC8qIDZ4MzUgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0MDYwLCBpd2w2MDM1XzJhZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4RiwgMHg0MjYwLCBpd2w2MDM1XzJhZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0NDYwLCBpd2w2MDM1XzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0MDY0LCBpd2w2MDM1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RiwgMHg0MjY0LCBpd2w2MDM1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0NDY0LCBpd2w2MDM1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0MDY2LCBpd2w2MDM1XzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODhGLCAweDQyNjYsIGl3bDYwMzVfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OEUsIDB4NDQ2NiwgaXdsNjAzNV8yYmdfY2ZnKX0sCiAKIC8qIDEwNSBTZXJpZXMgKi8KIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDAwMjIsIGl3bDEwNV9iZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5NSwgMHgwMjIyLCBpd2wxMDVfYmduX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTQsIDB4MDQyMiwgaXdsMTA1X2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDAwMjYsIGl3bDEwNV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk1LCAweDAyMjYsIGl3bDEwNV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDA0MjYsIGl3bDEwNV9iZ19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDA4MjIsIGl3bDEwNV9iZ25fZF9jZmcpfSwKIAogLyogMTM1IFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDA2MiwgaXdsMTM1X2Jnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODkzLCAweDAyNjIsIGl3bDEzNV9iZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5MiwgMHgwNDYyLCBpd2wxMzVfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDA2NiwgaXdsMTM1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTMsIDB4MDI2NiwgaXdsMTM1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDQ2NiwgaXdsMTM1X2JnX2NmZyl9LAogCiAJezB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2Nhbi5jCmluZGV4IGU1ZDcyN2YuLjM1OWQyMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zY2FuLmMKQEAgLTQxNiw2ICs0MTYsOCBAQAogCiAJCWlmICghaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCiAJCQljb250aW51ZTsKKwkJaWYgKGN0eC0+c3RhZ2luZy5kZXZfdHlwZSA9PSBSWE9OX0RFVl9UWVBFX1AyUCkKKwkJCWNvbnRpbnVlOwogCQl2YWx1ZSA9IGN0eC0+YmVhY29uX2ludDsKIAkJaWYgKCF2YWx1ZSkKIAkJCXZhbHVlID0gSVdMX1BBU1NJVkVfRFdFTExfQkFTRTsKQEAgLTY3OCw3ICs2ODAsOCBAQAogCQkJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWN0aXZlLmZsYWdzICYKIAkJCQkJCVJYT05fRkxHX0NIQU5ORUxfTU9ERV9NU0spCiAJCQkJICAgICAgID4+IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QT1M7Ci0JCWlmIChjaGFuX21vZCA9PSBDSEFOTkVMX01PREVfUFVSRV80MCkgeworCQlpZiAoKHByaXYtPnNjYW5fcmVxdWVzdCAmJiBwcml2LT5zY2FuX3JlcXVlc3QtPm5vX2NjaykgfHwKKwkJICAgIGNoYW5fbW9kID09IENIQU5ORUxfTU9ERV9QVVJFXzQwKSB7CiAJCQlyYXRlID0gSVdMX1JBVEVfNk1fUExDUDsKIAkJfSBlbHNlIHsKIAkJCXJhdGUgPSBJV0xfUkFURV8xTV9QTENQOwpAQCAtOTM4LDUxICs5NDEsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaXdsYWduX21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpZiAocmVxLT5uX2NoYW5uZWxzID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JLyoKLQkgKiBJZiBhbiBpbnRlcm5hbCBzY2FuIGlzIGluIHByb2dyZXNzLCBqdXN0IHNldAotCSAqIHVwIHRoZSBzY2FuX3JlcXVlc3QgYXMgcGVyIGFib3ZlLgotCSAqLwotCWlmIChwcml2LT5zY2FuX3R5cGUgIT0gSVdMX1NDQU5fTk9STUFMKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkgICAgICAgIlNDQU4gcmVxdWVzdCBkdXJpbmcgaW50ZXJuYWwgc2NhbiAtIGRlZmVyXG4iKTsKLQkJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxOwotCQlwcml2LT5zY2FuX3ZpZiA9IHZpZjsKLQkJcmV0ID0gMDsKLQl9IGVsc2UgewotCQlwcml2LT5zY2FuX3JlcXVlc3QgPSByZXE7Ci0JCXByaXYtPnNjYW5fdmlmID0gdmlmOwotCQkvKgotCQkgKiBtYWM4MDIxMSB3aWxsIG9ubHkgYXNrIGZvciBvbmUgYmFuZCBhdCBhIHRpbWUKLQkJICogc28gdXNpbmcgY2hhbm5lbHNbMF0gaGVyZSBpcyBvawotCQkgKi8KLQkJcmV0ID0gaXdsX3NjYW5faW5pdGlhdGUocHJpdiwgdmlmLCBJV0xfU0NBTl9OT1JNQUwsCi0JCQkJCXJlcS0+Y2hhbm5lbHNbMF0tPmJhbmQpOwotCQlpZiAocmV0KSB7Ci0JCQlwcml2LT5zY2FuX3JlcXVlc3QgPSBOVUxMOwotCQkJcHJpdi0+c2Nhbl92aWYgPSBOVUxMOwotCQl9Ci0JfQotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCXJldHVybiByZXQ7Ci19CiAKIC8qCiAgKiBpbnRlcm5hbCBzaG9ydCBzY2FuLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlZW4gY2FsbGVkIHdoaWxlIGFzc29jaWF0ZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zaGFyZWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNoYXJlZC5oCmluZGV4IDE0ZWFmMzcuLjMwYWY5NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNoYXJlZC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNoYXJlZC5oCkBAIC0xNzQsNyArMTc0LDYgQEAKICAqIEBjdF9raWxsX2V4aXRfdGhyZXNob2xkOiB3aGVuIHRvIHJlZWFibGUgdGhlIGRldmljZSAtIGluIGh3IGRlcGVuZGVudCB1bml0CiAgKglyZWxldmFudCBmb3IgMTAwMCwgNjAwMCBhbmQgdXAKICAqIEB3ZF90aW1lb3V0OiBUWCBxdWV1ZXMgd2F0Y2hkb2cgdGltZW91dAotICogQGNhbGliX2luaXRfY2ZnOiBzZXR1cCBpbml0aWFsIGNhbGlicmF0aW9ucyBmb3IgdGhlIGh3CiAgKiBAY2FsaWJfcnRfY2ZnOiBzZXR1cCBydW50aW1lIGNhbGlicmF0aW9ucyBmb3IgdGhlIGh3CiAgKiBAc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXM6IHJhbmdlIG9mIHNlbnNpdGl2aXR5IHZhbHVlcwogICovCkBAIC0xOTUsNyArMTk0LDYgQEAKIAl1MzIgY3Rfa2lsbF9leGl0X3RocmVzaG9sZDsKIAl1bnNpZ25lZCBpbnQgd2RfdGltZW91dDsKIAotCXUzMiBjYWxpYl9pbml0X2NmZzsKIAl1MzIgY2FsaWJfcnRfY2ZnOwogCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpzZW5zOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN2LW9wZW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN2LW9wZW4uYwppbmRleCA1ZTUwZDg4Li5iZTE2Y2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zdi1vcGVuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3Ytb3Blbi5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlJV0xfSU5GTyhwcml2LCAidGVzdG1vZGUgcmVnaXN0ZXIgYWNjZXNzIGNvbW1hbmQgb2Zmc2V0IDB4JXhcbiIsIG9mcyk7CiAKIAlzd2l0Y2ggKG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX0NPTU1BTkRdKSkgewotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19SRUFEMzI6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19SRUFEMzI6CiAJCXZhbDMyID0gaXdsX3JlYWQzMihidXMocHJpdiksIG9mcyk7CiAJCUlXTF9JTkZPKHByaXYsICIzMmJpdCB2YWx1ZSB0byByZWFkIDB4JXhcbiIsIHZhbDMyKTsKIApAQCAtMjkxLDcgKzI5MSw3IEBACiAJCQlJV0xfREVCVUdfSU5GTyhwcml2LAogCQkJCSAgICAgICAiRXJyb3Igc2VuZGluZyBtc2cgOiAlZFxuIiwgc3RhdHVzKTsKIAkJYnJlYWs7Ci0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1dSSVRFMzI6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19XUklURTMyOgogCQlpZiAoIXRiW0lXTF9UTV9BVFRSX1JFR19WQUxVRTMyXSkgewogCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKIAkJCQkgICAgICAgIkVycm9yIGZpbmRpbmcgdmFsdWUgdG8gd3JpdGVcbiIpOwpAQCAtMzAyLDcgKzMwMiw3IEBACiAJCQlpd2xfd3JpdGUzMihidXMocHJpdiksIG9mcywgdmFsMzIpOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTg6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19XUklURTg6CiAJCWlmICghdGJbSVdMX1RNX0FUVFJfUkVHX1ZBTFVFOF0pIHsKIAkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciBmaW5kaW5nIHZhbHVlIHRvIHdyaXRlXG4iKTsKIAkJCXJldHVybiAtRU5PTVNHOwpAQCAtMzEyLDYgKzMxMiwzMiBAQAogCQkJaXdsX3dyaXRlOChidXMocHJpdiksIG9mcywgdmFsOCk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1JFQUQzMjoKKwkJdmFsMzIgPSBpd2xfcmVhZF9wcnBoKGJ1cyhwcml2KSwgb2ZzKTsKKwkJSVdMX0lORk8ocHJpdiwgIjMyYml0IHZhbHVlIHRvIHJlYWQgMHgleFxuIiwgdmFsMzIpOworCisJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksIDIwKTsKKwkJaWYgKCFza2IpIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlOTEFfUFVUX1UzMihza2IsIElXTF9UTV9BVFRSX1JFR19WQUxVRTMyLCB2YWwzMik7CisJCXN0YXR1cyA9IGNmZzgwMjExX3Rlc3Rtb2RlX3JlcGx5KHNrYik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCQkJIkVycm9yIHNlbmRpbmcgbXNnIDogJWRcbiIsIHN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0lORElSRUNUX1JFR19XUklURTMyOgorCQlpZiAoIXRiW0lXTF9UTV9BVFRSX1JFR19WQUxVRTMyXSkgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCQkJIkVycm9yIGZpbmRpbmcgdmFsdWUgdG8gd3JpdGVcbiIpOworCQkJcmV0dXJuIC1FTk9NU0c7CisJCX0gZWxzZSB7CisJCQl2YWwzMiA9IG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX1JFR19WQUxVRTMyXSk7CisJCQlJV0xfSU5GTyhwcml2LCAiMzJiaXQgdmFsdWUgdG8gd3JpdGUgMHgleFxuIiwgdmFsMzIpOworCQkJaXdsX3dyaXRlX3BycGgoYnVzKHByaXYpLCBvZnMsIHZhbDMyKTsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVW5rbm93biB0ZXN0bW9kZSByZWdpc3RlciBjb21tYW5kIElEXG4iKTsKIAkJcmV0dXJuIC1FTk9TWVM7CkBAIC0zOTYsOCArNDIyLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9MT0FEX0lOSVRfRlc6Ci0JCXN0YXR1cyA9IGl3bGFnbl9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUocHJpdiwgJnByaXYtPnVjb2RlX2luaXQsCi0JCQkJCQkgICAgICBJV0xfVUNPREVfSU5JVCk7CisJCXN0YXR1cyA9IGl3bGFnbl9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUocHJpdiwgSVdMX1VDT0RFX0lOSVQpOwogCQlpZiAoc3RhdHVzKQogCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKIAkJCQkiRXJyb3IgbG9hZGluZyBpbml0IHVjb2RlOiAlZFxuIiwgc3RhdHVzKTsKQEAgLTQwOSw5ICs0MzQsNyBAQAogCQlicmVhazsKIAogCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0xPQURfUlVOVElNRV9GVzoKLQkJc3RhdHVzID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LAotCQkJCQkgICAmcHJpdi0+dWNvZGVfcnQsCi0JCQkJCSAgIElXTF9VQ09ERV9SRUdVTEFSKTsKKwkJc3RhdHVzID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LCBJV0xfVUNPREVfUkVHVUxBUik7CiAJCWlmIChzdGF0dXMpIHsKIAkJCUlXTF9ERUJVR19JTkZPKHByaXYsCiAJCQkJIkVycm9yIGxvYWRpbmcgcnVudGltZSB1Y29kZTogJWRcbiIsIHN0YXR1cyk7CkBAIC02NjgsOSArNjkxLDExIEBACiAJCUlXTF9ERUJVR19JTkZPKHByaXYsICJ0ZXN0bW9kZSBjbWQgdG8gdUNvZGVcbiIpOwogCQlyZXN1bHQgPSBpd2xfdGVzdG1vZGVfdWNvZGUoaHcsIHRiKTsKIAkJYnJlYWs7Ci0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1JFQUQzMjoKLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9SRUdfV1JJVEUzMjoKLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9SRUdfV1JJVEU4OgorCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0RJUkVDVF9SRUdfUkVBRDMyOgorCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0RJUkVDVF9SRUdfV1JJVEUzMjoKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFODoKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9JTkRJUkVDVF9SRUdfUkVBRDMyOgorCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0lORElSRUNUX1JFR19XUklURTMyOgogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidGVzdG1vZGUgY21kIHRvIHJlZ2lzdGVyXG4iKTsKIAkJcmVzdWx0ID0gaXdsX3Rlc3Rtb2RlX3JlZyhodywgdGIpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRlc3Rtb2RlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10ZXN0bW9kZS5oCmluZGV4IGI5ODBiZGEuLjE3Nzk2NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRlc3Rtb2RlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdGVzdG1vZGUuaApAQCAtNzYsOSArNzYsOSBAQAogICoJdGhlIGFjdHVhbCB1Q29kZSBob3N0IGNvbW1hbmQgSUQgaXMgY2FycmllZCB3aXRoCiAgKglJV0xfVE1fQVRUUl9VQ09ERV9DTURfSUQKICAqCi0gKiBASVdMX1RNX0NNRF9BUFAyREVWX1JFR19SRUFEMzI6Ci0gKiBASVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTMyOgotICogQElXTF9UTV9DTURfQVBQMkRFVl9SRUdfV1JJVEU4OgorICogQElXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1JFQUQzMjoKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19XUklURTMyOgorICogQElXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFODoKICAqCWNvbW1hbmRzIGZyb20gdXNlciBhcHBsaWNhaXRvbiB0byBhY2Nlc3MgcmVnaXN0ZXIKICAqCiAgKiBASVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VOQU1FOiByZXRyaWV2ZSBkZXZpY2UgbmFtZQpAQCAtMTA3LDEyICsxMDcsMTYgQEAKICAqCWNvbW1hbmRzIGZyb20gdXNlciBhcHBsaWNhdGlvbiB0byBvd24gY2hhbmdlIHRoZSBvd25lcnNoaXAgb2YgdGhlIHVDb2RlCiAgKglpZiBhcHBsaWNhdGlvbiBoYXMgdGhlIG93bmVyc2hpcCwgdGhlIG9ubHkgaG9zdCBjb21tYW5kIGZyb20KICAqCXRlc3Rtb2RlIHdpbGwgZGVsaXZlciB0byB1Q29kZS4gRGVmYXVsdCBvd25lciBpcyBkcml2ZXIKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1JFQUQzMjoKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1dSSVRFMzI6CisgKgljb21tYW5kcyBmcm9tIHVzZXIgYXBwbGljYWl0b24gdG8gaW5kaXJlY3RseSBhY2Nlc3MgcGVyaXBoZXJhbCByZWdpc3RlcgorICoKICAqLwogZW51bSBpd2xfdG1fY21kX3QgewogCUlXTF9UTV9DTURfQVBQMkRFVl9VQ09ERQkJPSAxLAotCUlXTF9UTV9DTURfQVBQMkRFVl9SRUdfUkVBRDMyCQk9IDIsCi0JSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTMyCQk9IDMsCi0JSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTgJCT0gNCwKKwlJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19SRUFEMzIJPSAyLAorCUlXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFMzIJPSAzLAorCUlXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFOAk9IDQsCiAJSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VOQU1FCT0gNSwKIAlJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9JTklUX0ZXCQk9IDYsCiAJSVdMX1RNX0NNRF9BUFAyREVWX0NGR19JTklUX0NBTElCCT0gNywKQEAgLTEyNiw3ICsxMzAsOSBAQAogCUlXTF9UTV9DTURfREVWMkFQUF9VQ09ERV9SWF9QS1QJCT0gMTUsCiAJSVdMX1RNX0NNRF9ERVYyQVBQX0VFUFJPTV9SU1AJCT0gMTYsCiAJSVdMX1RNX0NNRF9BUFAyREVWX09XTkVSU0hJUAkJPSAxNywKLQlJV0xfVE1fQ01EX01BWAkJCQk9IDE4LAorCUlXTF9UTV9DTURfQVBQMkRFVl9JTkRJUkVDVF9SRUdfUkVBRDMyCT0gMTgsCisJSVdMX1RNX0NNRF9BUFAyREVWX0lORElSRUNUX1JFR19XUklURTMyCT0gMTksCisJSVdMX1RNX0NNRF9NQVgJCQkJPSAyMCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLWludC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS1pbnQuaAppbmRleCAyYjY3NTZlLi41YTM4NGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLWludC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtaW50LmgKQEAgLTM1NCw4ICszNTQsMTMgQEAKIAl0eHEtPnN3cV9pZCA9IChod3EgPDwgMikgfCBhYzsKIH0KIAorc3RhdGljIGlubGluZSB1OCBpd2xfZ2V0X3F1ZXVlX2FjKHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKK3sKKwlyZXR1cm4gdHhxLT5zd3FfaWQgJiAweDM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfd2FrZV9xdWV1ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKKwkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwgY29uc3QgY2hhciAqbXNnKQogewogCXU4IHF1ZXVlID0gdHhxLT5zd3FfaWQ7CiAJdTggYWMgPSBxdWV1ZSAmIDM7CkBAIC0zNjMsMTMgKzM2OCwyMiBAQAogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9CiAJCUlXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KGh3cSwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpCi0JCWlmIChhdG9taWNfZGVjX3JldHVybigmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pIDw9IDApCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChod3EsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7CisJCWlmIChhdG9taWNfZGVjX3JldHVybigmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pIDw9IDApIHsKIAkJCWl3bF93YWtlX3N3X3F1ZXVlKHByaXYodHJhbnMpLCBhYyk7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiV2FrZSBod3EgJWQgYWMgJWQuICVzIiwKKwkJCQkJICAgIGh3cSwgYWMsIG1zZyk7CisJCX0gZWxzZSB7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiRG9uJ3Qgd2FrZSBod3EgJWQgYWMgJWQiCisJCQkJCSAgICAiIHN0b3AgY291bnQgJWQuICVzIiwKKwkJCQkJICAgIGh3cSwgYWMsIGF0b21pY19yZWFkKCZ0cmFuc19wY2llLT4KKwkJCQkJICAgIHF1ZXVlX3N0b3BfY291bnRbYWNdKSwgbXNnKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGl3bF9zdG9wX3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCSAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQorCQkJCSAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLCBjb25zdCBjaGFyICptc2cpCiB7CiAJdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKIAl1OCBhYyA9IHF1ZXVlICYgMzsKQEAgLTM3Nyw5ICszOTEsMjMgQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPQogCQlJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGh3cSwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpCi0JCWlmIChhdG9taWNfaW5jX3JldHVybigmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pID4gMCkKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaHdxLCB0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkKSkgeworCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BfY291bnRbYWNdKSA+IDApIHsKIAkJCWl3bF9zdG9wX3N3X3F1ZXVlKHByaXYodHJhbnMpLCBhYyk7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiU3RvcCBod3EgJWQgYWMgJWQiCisJCQkJCSAgICAiIHN0b3AgY291bnQgJWQuICVzIiwKKwkJCQkJICAgIGh3cSwgYWMsIGF0b21pY19yZWFkKCZ0cmFuc19wY2llLT4KKwkJCQkJICAgIHF1ZXVlX3N0b3BfY291bnRbYWNdKSwgbXNnKTsKKwkJfSBlbHNlIHsKKwkJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJEb24ndCBzdG9wIGh3cSAlZCBhYyAlZCIKKwkJCQkJICAgICIgc3RvcCBjb3VudCAlZC4gJXMiLAorCQkJCQkgICAgaHdxLCBhYywgYXRvbWljX3JlYWQoJnRyYW5zX3BjaWUtPgorCQkJCQkgICAgcXVldWVfc3RvcF9jb3VudFthY10pLCBtc2cpOworCQl9CisJfSBlbHNlIHsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgInN0b3AgaHdxICVkLCBidXQgaXQgaXMgc3RvcHBlZC8gJXMiLAorCQkJCSAgICBod3EsIG1zZyk7CisJfQogfQogCiAjaWZkZWYgaWVlZTgwMjExX3N0b3BfcXVldWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtcnguYwppbmRleCAzNzRjNjhjLi5lZTEyNmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLXJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS1yeC5jCkBAIC0xMTA4LDcgKzExMDgsNyBAQAogCQlpc3Jfc3RhdHMtPnR4Kys7CiAJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7CiAJCS8qIFdha2UgdXAgdUNvZGUgbG9hZCByb3V0aW5lLCBub3cgdGhhdCBsb2FkIGlzIGNvbXBsZXRlICovCi0JCXByaXYodHJhbnMpLT51Y29kZV93cml0ZV9jb21wbGV0ZSA9IDE7CisJCXRyYW5zLT51Y29kZV93cml0ZV9jb21wbGV0ZSA9IDE7CiAJCXdha2VfdXAoJnRyYW5zLT5zaHJkLT53YWl0X2NvbW1hbmRfcXVldWUpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS10eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS10eC5jCmluZGV4IDRhMGM5NTMuLjc5MzMxZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLXR4LmMKQEAgLTQzMCw3ICs0MzAsNyBAQAogCiAJdHhxLT5zY2hlZF9yZXRyeSA9IHNjZF9yZXRyeTsKIAotCUlXTF9ERUJVR19JTkZPKHRyYW5zLCAiJXMgJXMgUXVldWUgJWQgb24gRklGTyAlZFxuIiwKKwlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiJXMgJXMgUXVldWUgJWQgb24gRklGTyAlZFxuIiwKIAkJICAgICAgIGFjdGl2ZSA/ICJBY3RpdmF0ZSIgOiAiRGVhY3RpdmF0ZSIsCiAJCSAgICAgICBzY2RfcmV0cnkgPyAiQkEiIDogIkFDL0NNRCIsIHR4cV9pZCwgdHhfZmlmb19pZCk7CiB9CkBAIC01NTksMTQgKzU1OSwxNCBAQAogCXRpZF9kYXRhLT5hZ2cudHhxX2lkID0gdHhxX2lkOwogCWl3bF9zZXRfc3dxX2lkKCZ0cmFuc19wY2llLT50eHFbdHhxX2lkXSwgZ2V0X2FjX2Zyb21fdGlkKHRpZCksIHR4cV9pZCk7CiAKLQl0aWRfZGF0YSA9ICZ0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdOwogCWlmICh0aWRfZGF0YS0+dGZkc19pbl9xdWV1ZSA9PSAwKSB7Ci0JCUlXTF9ERUJVR19IVCh0cmFucywgIkhXIHF1ZXVlIGlzIGVtcHR5XG4iKTsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgIkhXIHF1ZXVlIGlzIGVtcHR5XG4iKTsKIAkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT047CiAJCWl3bF9zdGFydF90eF9iYV90cmFuc19yZWFkeShwcml2KHRyYW5zKSwgY3R4LCBzdGFfaWQsIHRpZCk7CiAJfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0hUKHRyYW5zLCAiSFcgcXVldWUgaXMgTk9UIGVtcHR5OiAlZCBwYWNrZXRzIGluIEhXIgotCQkJICAgICAicXVldWVcbiIsIHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlKTsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywKKwkJCQkgICAgIkhXIHF1ZXVlIGlzIE5PVCBlbXB0eTogJWQgcGFja2V0cyBpbiBIVyIKKwkJCQkgICAgIiBxdWV1ZVxuIiwgdGlkX2RhdGEtPnRmZHNfaW5fcXVldWUpOwogCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKQEAgLTY0MywxNCArNjQzLDE1IEBACiAKIAkvKiBUaGUgcXVldWUgaXMgbm90IGVtcHR5ICovCiAJaWYgKHdyaXRlX3B0ciAhPSByZWFkX3B0cikgewotCQlJV0xfREVCVUdfSFQodHJhbnMsICJTdG9wcGluZyBhIG5vbiBlbXB0eSBBR0cgSFcgUVVFVUVcbiIpOworCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLAorCQkJCSAgICAiU3RvcHBpbmcgYSBub24gZW1wdHkgQUdHIEhXIFFVRVVFXG4iKTsKIAkJdHJhbnMtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2cuc3RhdGUgPQogCQkJSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JSVdMX0RFQlVHX0hUKHRyYW5zLCAiSFcgcXVldWUgaXMgZW1wdHlcbiIpOworCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJIVyBxdWV1ZSBpcyBlbXB0eVxuIik7CiB0dXJuX29mZjoKIAl0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSA9IElXTF9BR0dfT0ZGOwogCkBAIC05ODIsNyArOTgzLDggQEAKIAogCXJldCA9IGl3bF9lbnF1ZXVlX2hjbWQodHJhbnMsIGNtZCk7CiAJaWYgKHJldCA8IDApIHsKLQkJSVdMX0VSUih0cmFucywgIkVycm9yIHNlbmRpbmcgJXM6IGVucXVldWVfaGNtZCBmYWlsZWQ6ICVkXG4iLAorCQlJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHRyYW5zLAorCQkJIkVycm9yIHNlbmRpbmcgJXM6IGVucXVldWVfaGNtZCBmYWlsZWQ6ICVkXG4iLAogCQkJICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xMDAwLDYgKzEwMDIsMjAgQEAKIAlJV0xfREVCVUdfSU5GTyh0cmFucywgIkF0dGVtcHRpbmcgdG8gc2VuZCBzeW5jIGNvbW1hbmQgJXNcbiIsCiAJCQlnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CiAKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnRyYW5zLT5zaHJkLT5zdGF0dXMpKQorCQlyZXR1cm4gLUVCVVNZOworCisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZ0cmFucy0+c2hyZC0+c3RhdHVzKSkgeworCQlJV0xfRVJSKHRyYW5zLCAiQ29tbWFuZCAlcyBhYm9ydGVkOiBSRiBLSUxMIFN3aXRjaFxuIiwKKwkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCXJldHVybiAtRUNBTkNFTEVEOworCX0KKwlpZiAodGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmdHJhbnMtPnNocmQtPnN0YXR1cykpIHsKKwkJSVdMX0VSUih0cmFucywgIkNvbW1hbmQgJXMgZmFpbGVkOiBGVyBFcnJvclxuIiwKKwkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCXJldHVybiAtRUlPOworCX0KIAlzZXRfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnRyYW5zLT5zaHJkLT5zdGF0dXMpOwogCUlXTF9ERUJVR19JTkZPKHRyYW5zLCAiU2V0dGluZyBIQ01EX0FDVElWRSBmb3IgY29tbWFuZCAlc1xuIiwKIAkJCWdldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKQEAgLTEwMDgsNyArMTAyNCw4IEBACiAJaWYgKGNtZF9pZHggPCAwKSB7CiAJCXJldCA9IGNtZF9pZHg7CiAJCWNsZWFyX2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZ0cmFucy0+c2hyZC0+c3RhdHVzKTsKLQkJSVdMX0VSUih0cmFucywgIkVycm9yIHNlbmRpbmcgJXM6IGVucXVldWVfaGNtZCBmYWlsZWQ6ICVkXG4iLAorCQlJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHRyYW5zLAorCQkJIkVycm9yIHNlbmRpbmcgJXM6IGVucXVldWVfaGNtZCBmYWlsZWQ6ICVkXG4iLAogCQkJICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xMDIyLDEyICsxMDM5LDEyIEBACiAJCQkJJnRyYW5zX3BjaWUtPnR4cVt0cmFucy0+c2hyZC0+Y21kX3F1ZXVlXTsKIAkJCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwogCi0JCQlJV0xfRVJSKHRyYW5zLAorCQkJSVdMX0RFQlVHX1FVSUVUX1JGS0lMTCh0cmFucywKIAkJCQkiRXJyb3Igc2VuZGluZyAlczogdGltZSBvdXQgYWZ0ZXIgJWRtcy5cbiIsCiAJCQkJZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksCiAJCQkJamlmZmllc190b19tc2VjcyhIT1NUX0NPTVBMRVRFX1RJTUVPVVQpKTsKIAotCQkJSVdMX0VSUih0cmFucywKKwkJCUlXTF9ERUJVR19RVUlFVF9SRktJTEwodHJhbnMsCiAJCQkJIkN1cnJlbnQgQ01EIHF1ZXVlIHJlYWRfcHRyICVkIHdyaXRlX3B0ciAlZFxuIiwKIAkJCQlxLT5yZWFkX3B0ciwgcS0+d3JpdGVfcHRyKTsKIApAQCAtMTAzOSwxOCArMTA1Niw2IEBACiAJCX0KIAl9CiAKLQlpZiAodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZ0cmFucy0+c2hyZC0+c3RhdHVzKSkgewotCQlJV0xfRVJSKHRyYW5zLCAiQ29tbWFuZCAlcyBhYm9ydGVkOiBSRiBLSUxMIFN3aXRjaFxuIiwKLQkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0JCXJldCA9IC1FQ0FOQ0VMRUQ7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19GV19FUlJPUiwgJnRyYW5zLT5zaHJkLT5zdGF0dXMpKSB7Ci0JCUlXTF9FUlIodHJhbnMsICJDb21tYW5kICVzIGZhaWxlZDogRlcgRXJyb3JcbiIsCi0JCQkgICAgICAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQogCWlmICgoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikgJiYgIWNtZC0+cmVwbHlfcGFnZSkgewogCQlJV0xfRVJSKHRyYW5zLCAiRXJyb3I6IFJlc3BvbnNlIE5VTEwgaW4gJyVzJ1xuIiwKIAkJCSAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwpAQCAtMTA3MSw3ICsxMDc2LDcgQEAKIAkJdHJhbnNfcGNpZS0+dHhxW3RyYW5zLT5zaHJkLT5jbWRfcXVldWVdLm1ldGFbY21kX2lkeF0uZmxhZ3MgJj0KIAkJCQkJCQl+Q01EX1dBTlRfU0tCOwogCX0KLWZhaWw6CisKIAlpZiAoY21kLT5yZXBseV9wYWdlKSB7CiAJCWl3bF9mcmVlX3BhZ2VzKHRyYW5zLT5zaHJkLCBjbWQtPnJlcGx5X3BhZ2UpOwogCQljbWQtPnJlcGx5X3BhZ2UgPSAwOwpAQCAtMTExNSw5ICsxMTIwLDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JSVdMX0RFQlVHX1RYX1JFUExZKHRyYW5zLCAicmVjbGFpbTogWyVkLCAlZCwgJWRdXG4iLCB0eHFfaWQsCi0JCQkgICBxLT5yZWFkX3B0ciwgaW5kZXgpOwotCiAJaWYgKFdBUk5fT04oIXNrYl9xdWV1ZV9lbXB0eShza2JzKSkpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLmMKaW5kZXggY2U5MTg5OC4uMzA0YjJlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUuYwpAQCAtMTEwMCwxMyArMTEwMCwyMSBAQAogCQloZHItPnNlcV9jdHJsID0gaGRyLT5zZXFfY3RybCAmCiAJCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRyk7CiAJCWhkci0+c2VxX2N0cmwgfD0gY3B1X3RvX2xlMTYoc2VxX251bWJlcik7Ci0JCXNlcV9udW1iZXIgKz0gMHgxMDsKIAkJLyogYWdncmVnYXRpb24gaXMgb24gZm9yIHRoaXMgPHN0YSx0aWQ+ICovCiAJCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsKLQkJCVdBUk5fT05fT05DRSh0aWRfZGF0YS0+YWdnLnN0YXRlICE9IElXTF9BR0dfT04pOworCQkJaWYgKFdBUk5fT05fT05DRSh0aWRfZGF0YS0+YWdnLnN0YXRlICE9IElXTF9BR0dfT04pKSB7CisJCQkJSVdMX0VSUih0cmFucywgIlRYX0NUTF9BTVBEVSB3aGlsZSBub3QgaW4gQUdHOiIKKwkJCQkJIiBUeCBmbGFncyA9IDB4JTA4eCwgYWdnLnN0YXRlID0gJWQiLAorCQkJCQlpbmZvLT5mbGFncywgdGlkX2RhdGEtPmFnZy5zdGF0ZSk7CisJCQkJSVdMX0VSUih0cmFucywgInN0YV9pZCA9ICVkLCB0aWQgPSAlZCAiCisJCQkJCSJ0eHFfaWQgPSAlZCwgc2VxX251bSA9ICVkIiwgc3RhX2lkLAorCQkJCQl0aWQsIHRpZF9kYXRhLT5hZ2cudHhxX2lkLAorCQkJCQlzZXFfbnVtYmVyID4+IDQpOworCQkJfQogCQkJdHhxX2lkID0gdGlkX2RhdGEtPmFnZy50eHFfaWQ7CiAJCQlpc19hZ2cgPSB0cnVlOwogCQl9CisJCXNlcV9udW1iZXIgKz0gMHgxMDsKIAl9CiAKIAkvKiBDb3B5IE1BQyBoZWFkZXIgZnJvbSBza2IgaW50byBjb21tYW5kIGJ1ZmZlciAqLwpAQCAtMTIzMiw3ICsxMjQwLDcgQEAKIAkJCXR4cS0+bmVlZF91cGRhdGUgPSAxOwogCQkJaXdsX3R4cV91cGRhdGVfd3JpdGVfcHRyKHRyYW5zLCB0eHEpOwogCQl9IGVsc2UgewotCQkJaXdsX3N0b3BfcXVldWUodHJhbnMsIHR4cSk7CisJCQlpd2xfc3RvcF9xdWV1ZSh0cmFucywgdHhxLCAiUXVldWUgaXMgZnVsbCIpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtMTI4NCwyMCArMTI5MiwyMSBAQAogCQkvKiBhZ2dyZWdhdGVkIEhXIHF1ZXVlICovCiAJCWlmICgodHhxX2lkICA9PSB0aWRfZGF0YS0+YWdnLnR4cV9pZCkgJiYKIAkJICAgIChxLT5yZWFkX3B0ciA9PSBxLT53cml0ZV9wdHIpKSB7Ci0JCQlJV0xfREVCVUdfSFQodHJhbnMsCisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLAogCQkJCSJIVyBxdWV1ZSBlbXB0eTogY29udGludWUgREVMQkEgZmxvd1xuIik7CiAJCQlpd2xfdHJhbnNfcGNpZV90eHFfYWdnX2Rpc2FibGUodHJhbnMsIHR4cV9pZCk7CiAJCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0FHR19PRkY7CiAJCQlpd2xfc3RvcF90eF9iYV90cmFuc19yZWFkeShwcml2KHRyYW5zKSwKIAkJCQkJCSAgIE5VTV9JV0xfUlhPTl9DVFgsCiAJCQkJCQkgICBzdGFfaWQsIHRpZCk7Ci0JCQlpd2xfd2FrZV9xdWV1ZSh0cmFucywgJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdKTsKKwkJCWl3bF93YWtlX3F1ZXVlKHRyYW5zLCAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0sCisJCQkJICAgICAgICJERUxCQSBmbG93IGNvbXBsZXRlIik7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJV0xfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE6CiAJCS8qIFdlIGFyZSByZWNsYWltaW5nIHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgcXVldWUgKi8KIAkJaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKLQkJCUlXTF9ERUJVR19IVCh0cmFucywKKwkJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsCiAJCQkJIkhXIHF1ZXVlIGVtcHR5OiBjb250aW51ZSBBRERCQSBmbG93XG4iKTsKIAkJCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJV0xfQUdHX09OOwogCQkJaXdsX3N0YXJ0X3R4X2JhX3RyYW5zX3JlYWR5KHByaXYodHJhbnMpLApAQCAtMTM1MCwxMiArMTM1OSwxMiBAQAogCX0KIAogCWlmICh0eHEtPnEucmVhZF9wdHIgIT0gdGZkX251bSkgewotCQlJV0xfREVCVUdfVFhfUkVQTFkodHJhbnMsICJSZXRyeSBzY2hlZHVsZXIgcmVjbGFpbSAiCi0JCQkJInNjZF9zc249JWQgaWR4PSVkIHR4cT0lZCBzd3E9JWRcbiIsCi0JCQkJc3NuICwgdGZkX251bSwgdHhxX2lkLCB0eHEtPnN3cV9pZCk7CisJCUlXTF9ERUJVR19UWF9SRVBMWSh0cmFucywgIltRICVkIHwgQUMgJWRdICVkIC0+ICVkICglZClcbiIsCisJCQkJdHhxX2lkLCBpd2xfZ2V0X3F1ZXVlX2FjKHR4cSksIHR4cS0+cS5yZWFkX3B0ciwKKwkJCQl0ZmRfbnVtLCBzc24pOwogCQlmcmVlZCA9IGl3bF90eF9xdWV1ZV9yZWNsYWltKHRyYW5zLCB0eHFfaWQsIHRmZF9udW0sIHNrYnMpOwogCQlpZiAoaXdsX3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrICYmIGNvbmQpCi0JCQlpd2xfd2FrZV9xdWV1ZSh0cmFucywgdHhxKTsKKwkJCWl3bF93YWtlX3F1ZXVlKHRyYW5zLCB0eHEsICJQYWNrZXRzIHJlY2xhaW1lZCIpOwogCX0KIAogCWl3bF9mcmVlX3RmZHNfaW5fcXVldWUodHJhbnMsIHN0YV9pZCwgdGlkLCBmcmVlZCk7CkBAIC0xNDE5LDcgKzE0MjgsOCBAQAogI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCiBzdGF0aWMgdm9pZCBpd2xfdHJhbnNfcGNpZV93YWtlX2FueV9xdWV1ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCQkJICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4KQorCQkJCQkgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCisJCQkJCSAgY29uc3QgY2hhciAqbXNnKQogewogCXU4IGFjLCB0eHFfaWQ7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0KQEAgLTE0MjcsMTEgKzE0MzcsMTEgQEAKIAogCWZvciAoYWMgPSAwOyBhYyA8IEFDX05VTTsgYWMrKykgewogCQl0eHFfaWQgPSB0cmFuc19wY2llLT5hY190b19xdWV1ZVtjdHhdW2FjXTsKLQkJSVdMX0RFQlVHX0lORk8odHJhbnMsICJRdWV1ZSBTdGF0dXM6IFFbJWRdICVzXG4iLAorCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiUXVldWUgU3RhdHVzOiBRWyVkXSAlc1xuIiwKIAkJCWFjLAogCQkJKGF0b21pY19yZWFkKCZ0cmFuc19wY2llLT5xdWV1ZV9zdG9wX2NvdW50W2FjXSkgPiAwKQogCQkJICAgICAgPyAic3RvcHBlZCIgOiAiYXdha2UiKTsKLQkJaXdsX3dha2VfcXVldWUodHJhbnMsICZ0cmFuc19wY2llLT50eHFbdHhxX2lkXSk7CisJCWl3bF93YWtlX3F1ZXVlKHRyYW5zLCAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0sIG1zZyk7CiAJfQogfQogCkBAIC0xNDU0LDExICsxNDY0LDEyIEBACiAJcmV0dXJuIGl3bF90cmFuczsKIH0KIAotc3RhdGljIHZvaWQgaXdsX3RyYW5zX3BjaWVfc3RvcF9xdWV1ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHR4cV9pZCkKK3N0YXRpYyB2b2lkIGl3bF90cmFuc19wY2llX3N0b3BfcXVldWUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQsCisJCQkJICAgICAgY29uc3QgY2hhciAqbXNnKQogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQlpd2xfc3RvcF9xdWV1ZSh0cmFucywgJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdKTsKKwlpd2xfc3RvcF9xdWV1ZSh0cmFucywgJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLCBtc2cpOwogfQogCiAjZGVmaW5lIElXTF9GTFVTSF9XQUlUX01TCTIwMDAKQEAgLTE1MTMsOCArMTUyNCwxMiBAQAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCUlXTF9FUlIodHJhbnMsICJRdWV1ZSAlZCBzdHVjayBmb3IgJXUgbXMuXG4iLCBxLT5pZCwKIAkJCWh3X3BhcmFtcyh0cmFucykud2RfdGltZW91dCk7Ci0JCUlXTF9FUlIodHJhbnMsICJDdXJyZW50IHJlYWRfcHRyICVkIHdyaXRlX3B0ciAlZFxuIiwKKwkJSVdMX0VSUih0cmFucywgIkN1cnJlbnQgU1cgcmVhZF9wdHIgJWQgd3JpdGVfcHRyICVkXG4iLAogCQkJcS0+cmVhZF9wdHIsIHEtPndyaXRlX3B0cik7CisJCUlXTF9FUlIodHJhbnMsICJDdXJyZW50IEhXIHJlYWRfcHRyICVkIHdyaXRlX3B0ciAlZFxuIiwKKwkJCWl3bF9yZWFkX3BycGgoYnVzKHRyYW5zKSwgU0NEX1FVRVVFX1JEUFRSKGNudCkpCisJCQkJJiAoVEZEX1FVRVVFX1NJWkVfTUFYIC0gMSksCisJCQlpd2xfcmVhZF9wcnBoKGJ1cyh0cmFucyksIFNDRF9RVUVVRV9XUlBUUihjbnQpKSk7CiAJCXJldHVybiAxOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLmgKaW5kZXggYzU5MjMxMi4uNTAyMjdlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy5oCkBAIC0xNzEsNyArMTcxLDggQEAKIAl2b2lkICgqdHhfc3RhcnQpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKIAogCXZvaWQgKCp3YWtlX2FueV9xdWV1ZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkgICAgICAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCk7CisJCQkgICAgICAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwKKwkJCSAgICAgICBjb25zdCBjaGFyICptc2cpOwogCiAJaW50ICgqc2VuZF9jbWQpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpOwogCkBAIC0xOTYsNyArMTk3LDcgQEAKIAogCXZvaWQgKCpmcmVlKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyk7CiAKLQl2b2lkICgqc3RvcF9xdWV1ZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBxKTsKKwl2b2lkICgqc3RvcF9xdWV1ZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBxLCBjb25zdCBjaGFyICptc2cpOwogCiAJaW50ICgqZGJnZnNfcmVnaXN0ZXIpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgZGVudHJ5KiBkaXIpOwogCWludCAoKmNoZWNrX3N0dWNrX3F1ZXVlKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHEpOwpAQCAtMjA3LDE3ICsyMDgsNDggQEAKICNlbmRpZgogfTsKIAorLyogb25lIGZvciBlYWNoIHVDb2RlIGltYWdlIChpbnN0L2RhdGEsIGJvb3QvaW5pdC9ydW50aW1lKSAqLworc3RydWN0IGZ3X2Rlc2MgeworCWRtYV9hZGRyX3QgcF9hZGRyOwkvKiBoYXJkd2FyZSBhZGRyZXNzICovCisJdm9pZCAqdl9hZGRyOwkJLyogc29mdHdhcmUgYWRkcmVzcyAqLworCXUzMiBsZW47CQkvKiBzaXplIGluIGJ5dGVzICovCit9OworCitzdHJ1Y3QgZndfaW1nIHsKKwlzdHJ1Y3QgZndfZGVzYyBjb2RlOwkvKiBmaXJtd2FyZSBjb2RlIGltYWdlICovCisJc3RydWN0IGZ3X2Rlc2MgZGF0YTsJLyogZmlybXdhcmUgZGF0YSBpbWFnZSAqLworfTsKKworZW51bSBpd2xfdWNvZGVfdHlwZSB7CisJSVdMX1VDT0RFX05PTkUsCisJSVdMX1VDT0RFX1JFR1VMQVIsCisJSVdMX1VDT0RFX0lOSVQsCisJSVdMX1VDT0RFX1dPV0xBTiwKK307CisKIC8qKgogICogc3RydWN0IGl3bF90cmFucyAtIHRyYW5zcG9ydCBjb21tb24gZGF0YQogICogQG9wcyAtIHBvaW50ZXIgdG8gaXdsX3RyYW5zX29wcwogICogQHNocmQgLSBwb2ludGVyIHRvIGl3bF9zaGFyZWQgd2hpY2ggaG9sZHMgc2hhcmVkIGRhdGEgZnJvbSB0aGUgdXBwZXIgbGF5ZXIKICAqIEBoY21kX2xvY2s6IHByb3RlY3RzIEhDTUQKKyAqIEB1Y29kZV93cml0ZV9jb21wbGV0ZTogaW5kaWNhdGVzIHRoYXQgdGhlIHVjb2RlIGhhcyBiZWVuIGNvcGllZC4KKyAqIEB1Y29kZV9ydDogcnVuIHRpbWUgdWNvZGUgaW1hZ2UKKyAqIEB1Y29kZV9pbml0OiBpbml0IHVjb2RlIGltYWdlCisgKiBAdWNvZGVfd293bGFuOiB3YWtlIG9uIHdpcmVsZXNzIHVjb2RlIGltYWdlIChvcHRpb25hbCkKICAqLwogc3RydWN0IGl3bF90cmFucyB7CiAJY29uc3Qgc3RydWN0IGl3bF90cmFuc19vcHMgKm9wczsKIAlzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZDsKIAlzcGlubG9ja190IGhjbWRfbG9jazsKIAorCXU4IHVjb2RlX3dyaXRlX2NvbXBsZXRlOwkvKiB0aGUgaW1hZ2Ugd3JpdGUgaXMgY29tcGxldGUgKi8KKwlzdHJ1Y3QgZndfaW1nIHVjb2RlX3J0OworCXN0cnVjdCBmd19pbWcgdWNvZGVfaW5pdDsKKwlzdHJ1Y3QgZndfaW1nIHVjb2RlX3dvd2xhbjsKKworCS8qIGVlcHJvbSByZWxhdGVkIHZhcmlhYmxlcyAqLworCWludCAgICBudm1fZGV2aWNlX3R5cGU7CisKIAkvKiBwb2ludGVyIHRvIHRyYW5zIHNwZWNpZmljIHN0cnVjdCAqLwogCS8qRW5zdXJlIHRoYXQgdGhpcyBwb2ludGVyIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgdG8gc2l6ZW9mIHBvaW50ZXIgKi8KIAljaGFyIHRyYW5zX3NwZWNpZmljWzBdIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKHNpemVvZih2b2lkICopKSkpOwpAQCAtMjQ5LDkgKzI4MSwxMCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3RyYW5zX3dha2VfYW55X3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCQkgICAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCkKKwkJCQkJICAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCisJCQkJCSAgICBjb25zdCBjaGFyICptc2cpCiB7Ci0JdHJhbnMtPm9wcy0+d2FrZV9hbnlfcXVldWUodHJhbnMsIGN0eCk7CisJdHJhbnMtPm9wcy0+d2FrZV9hbnlfcXVldWUodHJhbnMsIGN0eCwgbXNnKTsKIH0KIAogCkBAIC0zMTEsOSArMzQ0LDEwIEBACiAJdHJhbnMtPm9wcy0+ZnJlZSh0cmFucyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfdHJhbnNfc3RvcF9xdWV1ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHEpCitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3RyYW5zX3N0b3BfcXVldWUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBxLAorCQkJCQljb25zdCBjaGFyICptc2cpCiB7Ci0JdHJhbnMtPm9wcy0+c3RvcF9xdWV1ZSh0cmFucywgcSk7CisJdHJhbnMtPm9wcy0+c3RvcF9xdWV1ZSh0cmFucywgcSwgbXNnKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXdsX3RyYW5zX3dhaXRfdHhfcXVldWVfZW1wdHkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCkBAIC0zNDgsNCArMzgyLDggQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX3RyYW5zX29wcyB0cmFuc19vcHNfcGNpZTsKIAoraW50IGl3bF9hbGxvY19md19kZXNjKHN0cnVjdCBpd2xfYnVzICpidXMsIHN0cnVjdCBmd19kZXNjICpkZXNjLAorCQkgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKK3ZvaWQgaXdsX2RlYWxsb2NfdWNvZGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOworCiAjZW5kaWYgLyogX19pd2xfdHJhbnNfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jCmluZGV4IGM0MmJlODEuLjQ4ZTgyMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jCkBAIC0xNjUsMTEgKzE2NSwxNSBAQAogCQkJCXN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IGl3bV9wcml2ICppd20gPSBuZGV2X3RvX2l3bShuZGV2KTsKLQlzdHJ1Y3QgaXdtX2tleSAqa2V5ID0gJml3bS0+a2V5c1trZXlfaW5kZXhdOworCXN0cnVjdCBpd21fa2V5ICprZXk7CiAJaW50IHJldDsKIAogCUlXTV9EQkdfV0VYVChpd20sIERCRywgIkFkZGluZyBrZXkgZm9yICVwTVxuIiwgbWFjX2FkZHIpOwogCisJaWYgKGtleV9pbmRleCA+PSBJV01fTlVNX0tFWVMpCisJCXJldHVybiAtRU5PRU5UOworCisJa2V5ID0gJml3bS0+a2V5c1trZXlfaW5kZXhdOwogCW1lbXNldChrZXksIDAsIHNpemVvZihzdHJ1Y3QgaXdtX2tleSkpOwogCXJldCA9IGl3bV9rZXlfaW5pdChrZXksIGtleV9pbmRleCwgbWFjX2FkZHIsIHBhcmFtcyk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTIxNCw4ICsyMTgsMTIgQEAKIAkJCQl1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKIAlzdHJ1Y3QgaXdtX3ByaXYgKml3bSA9IG5kZXZfdG9faXdtKG5kZXYpOwotCXN0cnVjdCBpd21fa2V5ICprZXkgPSAmaXdtLT5rZXlzW2tleV9pbmRleF07CisJc3RydWN0IGl3bV9rZXkgKmtleTsKIAorCWlmIChrZXlfaW5kZXggPj0gSVdNX05VTV9LRVlTKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWtleSA9ICZpd20tPmtleXNba2V5X2luZGV4XTsKIAlpZiAoIWl3bS0+a2V5c1trZXlfaW5kZXhdLmtleV9sZW4pIHsKIAkJSVdNX0RCR19XRVhUKGl3bSwgREJHLCAiS2V5ICVkIG5vdCB1c2VkXG4iLCBrZXlfaW5kZXgpOwogCQlyZXR1cm4gMDsKQEAgLTIzNiw2ICsyNDQsOSBAQAogCiAJSVdNX0RCR19XRVhUKGl3bSwgREJHLCAiRGVmYXVsdCBrZXkgaW5kZXggaXM6ICVkXG4iLCBrZXlfaW5kZXgpOwogCisJaWYgKGtleV9pbmRleCA+PSBJV01fTlVNX0tFWVMpCisJCXJldHVybiAtRU5PRU5UOworCiAJaWYgKCFpd20tPmtleXNba2V5X2luZGV4XS5rZXlfbGVuKSB7CiAJCUlXTV9FUlIoaXdtLCAiS2V5ICVkIG5vdCB1c2VkXG4iLCBrZXlfaW5kZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jb21tYW5kcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NvbW1hbmRzLmMKaW5kZXggNTBkZWU2YS4uYmQ3NTA3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NvbW1hbmRzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2NvbW1hbmRzLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAjaW5jbHVkZSAiaXdtLmgiCiAjaW5jbHVkZSAiYnVzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2RlYnVnZnMuYwppbmRleCAwYTBjYzk2Li44N2VlZjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9kZWJ1Z2ZzLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJpd20uaCIKICNpbmNsdWRlICJidXMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvbWFpbi5jCmluZGV4IDM2MjAwMjcuLjk4YTE3OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL21haW4uYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlICJpd20uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9zZGlvLmMKaW5kZXggNTYzODNlNy4uNzY0YjQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvc2Rpby5jCkBAIC02Myw2ICs2Myw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jZmcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jCmluZGV4IGE3ZjFhYjIuLmQxZDg0ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jCkBAIC00ODUsNiArNDg1LDcgQEAKIHN0YXRpYyBpbnQgbGJzX3JldF9zY2FuKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgbG9uZyBkdW1teSwKIAlzdHJ1Y3QgY21kX2hlYWRlciAqcmVzcCkKIHsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAJc3RydWN0IGNtZF9kc184MDJfMTFfc2Nhbl9yc3AgKnNjYW5yZXNwID0gKHZvaWQgKilyZXNwOwogCWludCBic3NzaXplOwogCWNvbnN0IHU4ICpwb3M7CkBAIC02MzIsMTIgKzYzMywxNCBAQAogCQkJCSAgICAgTEJTX1NDQU5fUlNTSV9UT19NQk0ocnNzaSkvMTAwKTsKIAogCQkJaWYgKGNoYW5uZWwgJiYKLQkJCSAgICAhKGNoYW5uZWwtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpKQotCQkJCWNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIGNoYW5uZWwsCisJCQkgICAgIShjaGFubmVsLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSkgeworCQkJCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIGNoYW5uZWwsCiAJCQkJCWJzc2lkLCBnZXRfdW5hbGlnbmVkX2xlNjQodHNmZGVzYyksCiAJCQkJCWNhcGEsIGludHZsLCBpZSwgaWVsZW4sCiAJCQkJCUxCU19TQ0FOX1JTU0lfVE9fTUJNKHJzc2kpLAogCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CisJCQl9CiAJCX0gZWxzZQogCQkJbGJzX2RlYl9zY2FuKCJzY2FuIHJlc3BvbnNlOiBtaXNzaW5nIEJTUyBjaGFubmVsIElFXG4iKTsKIApAQCAtMTcyMCw2ICsxNzIzLDcgQEAKIAkJICAgMiArIDIgKyAgICAgICAgICAgICAgICAgICAgICAvKiBhdGltICovCiAJCSAgIDIgKyA4XTsgICAgICAgICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgcmF0ZXMgKi8KIAl1OCAqZmFrZSA9IGZha2VfaWU7CisJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NGRzgwMjExKTsKIApAQCAtMTc2MywxNCArMTc2NywxNSBAQAogCSpmYWtlKysgPSAweDZjOwogCWxic19kZWJfaGV4KExCU19ERUJfQ0ZHODAyMTEsICJJRSIsIGZha2VfaWUsIGZha2UgLSBmYWtlX2llKTsKIAotCWNmZzgwMjExX2luZm9ybV9ic3MocHJpdi0+d2Rldi0+d2lwaHksCi0JCQkgICAgcGFyYW1zLT5jaGFubmVsLAotCQkJICAgIGJzc2lkLAotCQkJICAgIDAsCi0JCQkgICAgY2FwYWJpbGl0eSwKLQkJCSAgICBwYXJhbXMtPmJlYWNvbl9pbnRlcnZhbCwKLQkJCSAgICBmYWtlX2llLCBmYWtlIC0gZmFrZV9pZSwKLQkJCSAgICAwLCBHRlBfS0VSTkVMKTsKKwlic3MgPSBjZmc4MDIxMV9pbmZvcm1fYnNzKHByaXYtPndkZXYtPndpcGh5LAorCQkJCSAgcGFyYW1zLT5jaGFubmVsLAorCQkJCSAgYnNzaWQsCisJCQkJICAwLAorCQkJCSAgY2FwYWJpbGl0eSwKKwkJCQkgIHBhcmFtcy0+YmVhY29uX2ludGVydmFsLAorCQkJCSAgZmFrZV9pZSwgZmFrZSAtIGZha2VfaWUsCisJCQkJICAwLCBHRlBfS0VSTkVMKTsKKwljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CiAKIAltZW1jcHkocHJpdi0+d2Rldi0+c3NpZCwgcGFyYW1zLT5zc2lkLCBwYXJhbXMtPnNzaWRfbGVuKTsKIAlwcml2LT53ZGV2LT5zc2lkX2xlbiA9IHBhcmFtcy0+c3NpZF9sZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCmluZGV4IGUwOGFiMWQuLmQ3OThiY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiZGVjbC5oIgogI2luY2x1ZGUgImNmZy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jCmluZGV4IDFhZjE4MjcuLmQ4ZDhmMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJkZWNsLmgiCiAjaW5jbHVkZSAiY21kLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMKaW5kZXggODg1ZGRjMS4uZjk1NWIyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2V0aHRvb2wuYwpAQCAtMTMsMTMgKzEzLDE0IEBACiB7CiAJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5tbF9wcml2OwogCi0Jc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgMzIsICIldS4ldS4ldS5wJXUiLAorCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSwKKwkJIiV1LiV1LiV1LnAldSIsCiAJCXByaXYtPmZ3cmVsZWFzZSA+PiAyNCAmIDB4ZmYsCiAJCXByaXYtPmZ3cmVsZWFzZSA+PiAxNiAmIDB4ZmYsCiAJCXByaXYtPmZ3cmVsZWFzZSA+PiAgOCAmIDB4ZmYsCiAJCXByaXYtPmZ3cmVsZWFzZSAgICAgICAmIDB4ZmYpOwotCXN0cmNweShpbmZvLT5kcml2ZXIsICJsaWJlcnRhcyIpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBsYnNfZHJpdmVyX3ZlcnNpb24pOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCAibGliZXJ0YXMiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBsYnNfZHJpdmVyX3ZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMKaW5kZXggYzk2MmUyMS4uOTgwNGViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYwpAQCAtMjksNyArMjksNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NwaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMKaW5kZXggNzA1OWQ5Ni4uNTBiMWVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTEyOTEsNyArMTI5MSw2IEBACiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGxpYmVydGFzX3NwaV9yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImxpYmVydGFzX3NwaSIsCi0JCS5idXMJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLnBtCT0gJmlmX3NwaV9wbV9vcHMsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKaW5kZXggODE0N2YxZS4uZGI4NzljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKQEAgLTUsNyArNSw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKaW5kZXggMzlhNmE3YS4uOTU3NjgxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwpAQCAtNiw3ICs2LDcgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKaW5kZXggNjJlMTBlZS4uYzczNjZiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KIAogI2luY2x1ZGUgImRlZnMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eC5jCmluZGV4IDhmMTI3NTIuLmMwMjVmOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHguYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CiAKICNpbmNsdWRlICJob3N0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCmluZGV4IDEzNTU3ZmUuLjkwOWFjMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAibGliZXJ0YXNfdGYuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvaWZfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYwppbmRleCBiYTdkOTY1Li42ODIwMmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgImlmX3VzYi5oIgogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jCmluZGV4IGFjYzQ2MWEuLmNlYjUxYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImxpYmVydGFzX3RmLmgiCiAKICNkZWZpbmUgRFJJVkVSX1JFTEVBU0VfVkVSU0lPTiAiMDA0LnAwIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKaW5kZXggNjg0NTVhMi4uNmNmNmQ2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgogI2luY2x1ZGUgIm1hYzgwMjExX2h3c2ltLmgiCiAKQEAgLTE3NDcsNiArMTc0OCw4IEBACiAJCQkgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfU01QUyB8CiAJCQkgICAgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OOwogCisJCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19TVVBQT1JUU19URExTOworCiAJCS8qIGFzayBtYWM4MDIxMSB0byByZXNlcnZlIHNwYWNlIGZvciBtYWdpYyAqLwogCQlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHdzaW1fdmlmX3ByaXYpOwogCQlody0+c3RhX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHdzaW1fc3RhX3ByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbl9yeHJlb3JkZXIuYwppbmRleCA3YWE5YWEwLi42ODFkM2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbl9yeHJlb3JkZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbl9yeHJlb3JkZXIuYwpAQCAtMzMsNyArMzMsNyBAQAogICogU2luY2UgdGhlIGJ1ZmZlciBpcyBsaW5lYXIsIHRoZSBmdW5jdGlvbiB1c2VzIHJvdGF0aW9uIHRvIHNpbXVsYXRlCiAgKiBjaXJjdWxhciBidWZmZXIuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyB2b2lkCiBtd2lmaWV4XzExbl9kaXNwYXRjaF9wa3RfdW50aWxfc3RhcnRfd2luKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkJCSBzdHJ1Y3QgbXdpZmlleF9yeF9yZW9yZGVyX3RibAogCQkJCQkgKnJ4X3Jlb3JfdGJsX3B0ciwgaW50IHN0YXJ0X3dpbikKQEAgLTcxLDggKzcxLDYgQEAKIAogCXJ4X3Jlb3JfdGJsX3B0ci0+c3RhcnRfd2luID0gc3RhcnRfd2luOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X3BrdF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTgzLDcgKzgxLDcgQEAKICAqIFNpbmNlIHRoZSBidWZmZXIgaXMgbGluZWFyLCB0aGUgZnVuY3Rpb24gdXNlcyByb3RhdGlvbiB0byBzaW11bGF0ZQogICogY2lyY3VsYXIgYnVmZmVyLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogbXdpZmlleF8xMW5fc2Nhbl9hbmRfZGlzcGF0Y2goc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCSAgICAgIHN0cnVjdCBtd2lmaWV4X3J4X3Jlb3JkZXJfdGJsICpyeF9yZW9yX3RibF9wdHIpCiB7CkBAIC0xMTksNyArMTE3LDYgQEAKIAlyeF9yZW9yX3RibF9wdHItPnN0YXJ0X3dpbiA9IChyeF9yZW9yX3RibF9wdHItPnN0YXJ0X3dpbiArIGkpCiAJCSYoTUFYX1RJRF9WQUxVRSAtIDEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X3BrdF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC00MDUsNyArNDAyLDcgQEAKIAkJCQl1OCAqdGEsIHU4IHBrdF90eXBlLCB2b2lkICpwYXlsb2FkKQogewogCXN0cnVjdCBtd2lmaWV4X3J4X3Jlb3JkZXJfdGJsICpyeF9yZW9yX3RibF9wdHI7Ci0JaW50IHN0YXJ0X3dpbiwgZW5kX3dpbiwgd2luX3NpemUsIHJldDsKKwlpbnQgc3RhcnRfd2luLCBlbmRfd2luLCB3aW5fc2l6ZTsKIAl1MTYgcGt0X2luZGV4OwogCiAJcnhfcmVvcl90YmxfcHRyID0KQEAgLTQ1MiwxMSArNDQ5LDggQEAKIAkJCXN0YXJ0X3dpbiA9IChlbmRfd2luIC0gd2luX3NpemUpICsgMTsKIAkJZWxzZQogCQkJc3RhcnRfd2luID0gKE1BWF9USURfVkFMVUUgLSAod2luX3NpemUgLSBzZXFfbnVtKSkgKyAxOwotCQlyZXQgPSBtd2lmaWV4XzExbl9kaXNwYXRjaF9wa3RfdW50aWxfc3RhcnRfd2luKHByaXYsCisJCW13aWZpZXhfMTFuX2Rpc3BhdGNoX3BrdF91bnRpbF9zdGFydF93aW4ocHJpdiwKIAkJCQkJCXJ4X3Jlb3JfdGJsX3B0ciwgc3RhcnRfd2luKTsKLQotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAocGt0X3R5cGUgIT0gUEtUX1RZUEVfQkFSKSB7CkBAIC00NzUsOSArNDY5LDkgQEAKIAkgKiBEaXNwYXRjaCBhbGwgcGFja2V0cyBzZXF1ZW50aWFsbHkgZnJvbSBzdGFydF93aW4gdW50aWwgYQogCSAqIGhvbGUgaXMgZm91bmQgYW5kIGFkanVzdCB0aGUgc3RhcnRfd2luIGFwcHJvcHJpYXRlbHkKIAkgKi8KLQlyZXQgPSBtd2lmaWV4XzExbl9zY2FuX2FuZF9kaXNwYXRjaChwcml2LCByeF9yZW9yX3RibF9wdHIpOworCW13aWZpZXhfMTFuX3NjYW5fYW5kX2Rpc3BhdGNoKHByaXYsIHJ4X3Jlb3JfdGJsX3B0cik7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9LY29uZmlnCmluZGV4IDhmMjc5N2EuLjJhMDc4Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L0tjb25maWcKQEAgLTEwLDEyICsxMCwxMiBAQAogCSAgbXdpZmlleC4KIAogY29uZmlnIE1XSUZJRVhfU0RJTwotCXRyaXN0YXRlICJNYXJ2ZWxsIFdpRmktRXggRHJpdmVyIGZvciBTRDg3ODciCisJdHJpc3RhdGUgIk1hcnZlbGwgV2lGaS1FeCBEcml2ZXIgZm9yIFNEODc4Ny9TRDg3OTciCiAJZGVwZW5kcyBvbiBNV0lGSUVYICYmIE1NQwogCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3Igd2lyZWxlc3MgYWRhcHRlcnMgYmFzZWQgb24gTWFydmVsbAotCSAgODc4NyBjaGlwc2V0IHdpdGggU0RJTyBpbnRlcmZhY2UuCisJICA4Nzg3Lzg3OTcgY2hpcHNldHMgd2l0aCBTRElPIGludGVyZmFjZS4KIAogCSAgSWYgeW91IGNob29zZSB0byBidWlsZCBpdCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQKIAkgIG13aWZpZXhfc2Rpby4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYwppbmRleCA0NjJjNzEwLi4wZGI5N2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jCkBAIC0xMjAsMTAgKzEyMCwxMSBAQAogc3RhdGljIGludAogbXdpZmlleF9jZmc4MDIxMV9zZXRfdHhfcG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCSAgICAgIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIHR5cGUsCi0JCQkgICAgICBpbnQgZGJtKQorCQkJICAgICAgaW50IG1ibSkKIHsKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gbXdpZmlleF9jZmc4MDIxMV9nZXRfcHJpdih3aXBoeSk7CiAJc3RydWN0IG13aWZpZXhfcG93ZXJfY2ZnIHBvd2VyX2NmZzsKKwlpbnQgZGJtID0gTUJNX1RPX0RCTShtYm0pOwogCiAJaWYgKHR5cGUgPT0gTkw4MDIxMV9UWF9QT1dFUl9GSVhFRCkgewogCQlwb3dlcl9jZmcuaXNfcG93ZXJfYXV0byA9IDA7CkBAIC03ODAsNiArNzgxLDcgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAJc3RydWN0IG13aWZpZXhfYnNzX2luZm8gYnNzX2luZm87CisJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwogCWludCBpZV9sZW47CiAJdTggaWVfYnVmW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU4gKyBzaXplb2Yoc3RydWN0IGllZWVfdHlwZXNfaGVhZGVyKV07CiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwpAQCAtODAwLDkgKzgwMiwxMCBAQAogCQkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGJzc19pbmZvLmJzc19jaGFuLAogCQkJCQkJICAgICAgIGJhbmQpKTsKIAotCWNmZzgwMjExX2luZm9ybV9ic3MocHJpdi0+d2Rldi0+d2lwaHksIGNoYW4sCisJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyhwcml2LT53ZGV2LT53aXBoeSwgY2hhbiwKIAkJYnNzX2luZm8uYnNzaWQsIDAsIFdMQU5fQ0FQQUJJTElUWV9JQlNTLAogCQkwLCBpZV9idWYsIGllX2xlbiwgMCwgR0ZQX0tFUk5FTCk7CisJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOwogCW1lbWNweShwcml2LT5jZmdfYnNzaWQsIGJzc19pbmZvLmJzc2lkLCBFVEhfQUxFTik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmcC5jCmluZGV4IGYyZTZkZTAuLjE3ODJhNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZnAuYwpAQCAtNzUsMTggKzc1LDMyIEBACiAgKiBUaGlzIGZ1bmN0aW9uIG1hcHMgYW4gaW5kZXggaW4gc3VwcG9ydGVkIHJhdGVzIHRhYmxlIGludG8KICAqIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmF0ZS4KICAqLwotdTMyIG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHU4IGluZGV4LCB1OCBodF9pbmZvKQordTMyIG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4IGluZGV4LAorCQkJCQkJCXU4IGh0X2luZm8pCiB7Ci0JdTE2IG1jc19yYXRlWzRdWzhdID0gewotCQl7MHgxYiwgMHgzNiwgMHg1MSwgMHg2YywgMHhhMiwgMHhkOCwgMHhmMywgMHgxMGV9Ci0JLAkJCS8qIExHIDQwTSAqLwotCXsweDFlLCAweDNjLCAweDVhLCAweDc4LCAweGI0LCAweGYwLCAweDEwZSwgMHgxMmN9Ci0JLAkJCS8qIFNHIDQwTSAqLwotCXsweDBkLCAweDFhLCAweDI3LCAweDM0LCAweDRlLCAweDY4LCAweDc1LCAweDgyfQotCSwJCQkvKiBMRyAyME0gKi8KLQl7MHgwZSwgMHgxYywgMHgyYiwgMHgzOSwgMHg1NiwgMHg3MywgMHg4MiwgMHg5MH0KLQl9OwkJCS8qIFNHIDIwTSAqLworCS8qCisJICogRm9yIGV2ZXJ5IG1jc19yYXRlIGxpbmUsIHRoZSBmaXJzdCA4IGJ5dGVzIGFyZSBmb3Igc3RyZWFtIDF4MSwKKwkgKiBhbmQgYWxsIDE2IGJ5dGVzIGFyZSBmb3Igc3RyZWFtIDJ4Mi4KKwkgKi8KKwl1MTYgIG1jc19yYXRlWzRdWzE2XSA9IHsKKwkJLyogTEdJIDQwTSAqLworCQl7IDB4MWIsIDB4MzYsIDB4NTEsIDB4NmMsIDB4YTIsIDB4ZDgsIDB4ZjMsIDB4MTBlLAorCQkgIDB4MzYsIDB4NmMsIDB4YTIsIDB4ZDgsIDB4MTQ0LCAweDFiMCwgMHgxZTYsIDB4MjFjIH0sCiAKKwkJLyogU0dJIDQwTSAqLworCQl7IDB4MWUsIDB4M2MsIDB4NWEsIDB4NzgsIDB4YjQsIDB4ZjAsIDB4MTBlLCAweDEyYywKKwkJICAweDNjLCAweDc4LCAweGI0LCAweGYwLCAweDE2OCwgMHgxZTAsIDB4MjFjLCAweDI1OCB9LAorCisJCS8qIExHSSAyME0gKi8KKwkJeyAweDBkLCAweDFhLCAweDI3LCAweDM0LCAweDRlLCAweDY4LCAweDc1LCAweDgyLAorCQkgIDB4MWEsIDB4MzQsIDB4NGUsIDB4NjgsIDB4OWMsIDB4ZDAsIDB4ZWEsIDB4MTA0IH0sCisKKwkJLyogU0dJIDIwTSAqLworCQl7IDB4MGUsIDB4MWMsIDB4MmIsIDB4MzksIDB4NTYsIDB4NzMsIDB4ODIsIDB4OTAsCisJCSAgMHgxYywgMHgzOSwgMHg1NiwgMHg3MywgMHhhZCwgMHhlNywgMHgxMDQsIDB4MTIwIH0KKwl9OworCXUzMiBtY3NfbnVtX3N1cHAgPQorCQkocHJpdi0+YWRhcHRlci0+aHdfZGV2X21jc19zdXBwb3J0ID09IEhUX1NUUkVBTV8yWDIpID8gMTYgOiA4OwogCXUzMiByYXRlOwogCiAJaWYgKGh0X2luZm8gJiBCSVQoMCkpIHsKQEAgLTk1LDcgKzEwOSw3IEBACiAJCQkJcmF0ZSA9IDB4MEQ7CS8qIE1DUyAzMiBTR0kgcmF0ZSAqLwogCQkJZWxzZQogCQkJCXJhdGUgPSAweDBDOwkvKiBNQ1MgMzIgTEdJIHJhdGUgKi8KLQkJfSBlbHNlIGlmIChpbmRleCA8IDgpIHsKKwkJfSBlbHNlIGlmIChpbmRleCA8IG1jc19udW1fc3VwcCkgewogCQkJaWYgKGh0X2luZm8gJiBCSVQoMSkpIHsKIAkJCQlpZiAoaHRfaW5mbyAmIEJJVCgyKSkKIAkJCQkJLyogU0dJLCA0ME0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaAppbmRleCAwY2M1ZDczLi42MmI4NjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2Z3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9mdy5oCkBAIC0xNjUsNiArMTY1LDcgQEAKIAogI2RlZmluZSBHRVRfUlhNQ1NTVVBQKERldk1DU1N1cHBvcnRlZCkgKERldk1DU1N1cHBvcnRlZCAmIDB4MGYpCiAjZGVmaW5lIFNFVEhUX01DUzMyKHgpICh4WzRdIHw9IDEpCisjZGVmaW5lIEhUX1NUUkVBTV8yWDIJMHgyMgogCiAjZGVmaW5lIFNFVF9TRUNPTkRBUllDSEFOKFJhZGlvVHlwZSwgU0VDQ0hBTikgKFJhZGlvVHlwZSB8PSAoU0VDQ0hBTiA8PCA0KSkKIApAQCAtNjczLDcgKzY3NCw3IEBACiAJdW5pb24gaWVlZV90eXBlc19waHlfcGFyYW1fc2V0IHBoeV9wYXJhbV9zZXQ7CiAJdTE2IHJlc2VydmVkMTsKIAlfX2xlMTYgY2FwX2luZm9fYml0bWFwOwotCXU4IERhdGFSYXRlW0hPU1RDTURfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBkYXRhX3JhdGVbSE9TVENNRF9TVVBQT1JURURfUkFURVNdOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RfY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvaW5pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pbml0LmMKaW5kZXggZDc5MmIzZi4uMjY5NDA0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pbml0LmMKQEAgLTE4Nyw4ICsxODcsNiBAQAogCXN0cnVjdCBtd2lmaWV4X29wdF9zbGVlcF9jb25maXJtICpzbGVlcF9jZm1fYnVmID0gTlVMTDsKIAogCXNrYl9wdXQoYWRhcHRlci0+c2xlZXBfY2ZtLCBzaXplb2Yoc3RydWN0IG13aWZpZXhfb3B0X3NsZWVwX2NvbmZpcm0pKTsKLQlzbGVlcF9jZm1fYnVmID0gKHN0cnVjdCBtd2lmaWV4X29wdF9zbGVlcF9jb25maXJtICopCi0JCQkJCQkoYWRhcHRlci0+c2xlZXBfY2ZtLT5kYXRhKTsKIAogCWFkYXB0ZXItPmNtZF9zZW50ID0gZmFsc2U7CiAKQEAgLTI1NCw2ICsyNTIsOCBAQAogCW13aWZpZXhfd21tX2luaXQoYWRhcHRlcik7CiAKIAlpZiAoYWRhcHRlci0+c2xlZXBfY2ZtKSB7CisJCXNsZWVwX2NmbV9idWYgPSAoc3RydWN0IG13aWZpZXhfb3B0X3NsZWVwX2NvbmZpcm0gKikKKwkJCQkJCWFkYXB0ZXItPnNsZWVwX2NmbS0+ZGF0YTsKIAkJbWVtc2V0KHNsZWVwX2NmbV9idWYsIDAsIGFkYXB0ZXItPnNsZWVwX2NmbS0+bGVuKTsKIAkJc2xlZXBfY2ZtX2J1Zi0+Y29tbWFuZCA9CiAJCQkJY3B1X3RvX2xlMTYoSG9zdENtZF9DTURfODAyXzExX1BTX01PREVfRU5IKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvam9pbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9qb2luLmMKaW5kZXggNjJiNGMyOS4uMWM0OTgxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9qb2luLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9qb2luLmMKQEAgLTcyNCw4ICs3MjQsOCBAQAogCXUzMiBjbWRfYXBwZW5kX3NpemUgPSAwOwogCXUzMiBpOwogCXUxNiB0bXBfY2FwOwotCXVpbnQxNl90IGh0X2NhcF9pbmZvOwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2NoYW5fbGlzdF9wYXJhbV9zZXQgKmNoYW5fdGx2OworCXU4IHJhZGlvX3R5cGU7CiAKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCAqaHRfY2FwOwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0aW5mbyAqaHRfaW5mbzsKQEAgLTgzNyw4ICs4MzcsOCBAQAogCQlic3NfZGVzYy0+cHJpdmFjeSA9IE1XSUZJRVhfODAyXzExX1BSSVZfRklMVEVSX0FDQ0VQVF9BTEw7CiAJfQogCi0JbWVtc2V0KGFkaG9jX3N0YXJ0LT5EYXRhUmF0ZSwgMCwgc2l6ZW9mKGFkaG9jX3N0YXJ0LT5EYXRhUmF0ZSkpOwotCW13aWZpZXhfZ2V0X2FjdGl2ZV9kYXRhX3JhdGVzKHByaXYsIGFkaG9jX3N0YXJ0LT5EYXRhUmF0ZSk7CisJbWVtc2V0KGFkaG9jX3N0YXJ0LT5kYXRhX3JhdGUsIDAsIHNpemVvZihhZGhvY19zdGFydC0+ZGF0YV9yYXRlKSk7CisJbXdpZmlleF9nZXRfYWN0aXZlX2RhdGFfcmF0ZXMocHJpdiwgYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZSk7CiAJaWYgKChhZGFwdGVyLT5hZGhvY19zdGFydF9iYW5kICYgQkFORF9HKSAmJgogCSAgICAocHJpdi0+Y3Vycl9wa3RfZmlsdGVyICYgSG9zdENtZF9BQ1RfTUFDX0FESE9DX0dfUFJPVEVDVElPTl9PTikpIHsKIAkJaWYgKG13aWZpZXhfc2VuZF9jbWRfYXN5bmMocHJpdiwgSG9zdENtZF9DTURfTUFDX0NPTlRST0wsCkBAIC04NTAsMjAgKzg1MCwxOSBAQAogCQl9CiAJfQogCS8qIEZpbmQgdGhlIGxhc3Qgbm9uIHplcm8gKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGFkaG9jX3N0YXJ0LT5EYXRhUmF0ZSkgJiYKLQkJCWFkaG9jX3N0YXJ0LT5EYXRhUmF0ZVtpXTsKLQkJCWkrKykKLQkJCTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGFkaG9jX3N0YXJ0LT5kYXRhX3JhdGUpOyBpKyspCisJCWlmICghYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZVtpXSkKKwkJCWJyZWFrOwogCiAJcHJpdi0+Y3Vycl9ic3NfcGFyYW1zLm51bV9vZl9yYXRlcyA9IGk7CiAKIAkvKiBDb3B5IHRoZSBhZC1ob2MgY3JlYXRpbmcgcmF0ZXMgaW50byBDdXJyZW50IEJTUyByYXRlIHN0cnVjdHVyZSAqLwogCW1lbWNweSgmcHJpdi0+Y3Vycl9ic3NfcGFyYW1zLmRhdGFfcmF0ZXMsCi0JICAgICAgICZhZGhvY19zdGFydC0+RGF0YVJhdGUsIHByaXYtPmN1cnJfYnNzX3BhcmFtcy5udW1fb2ZfcmF0ZXMpOworCSAgICAgICAmYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZSwgcHJpdi0+Y3Vycl9ic3NfcGFyYW1zLm51bV9vZl9yYXRlcyk7CiAKIAlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImluZm86IEFESE9DX1NfQ01EOiByYXRlcz0lMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotCSAgICAgICBhZGhvY19zdGFydC0+RGF0YVJhdGVbMF0sIGFkaG9jX3N0YXJ0LT5EYXRhUmF0ZVsxXSwKLQkgICAgICAgYWRob2Nfc3RhcnQtPkRhdGFSYXRlWzJdLCBhZGhvY19zdGFydC0+RGF0YVJhdGVbM10pOworCSAgICAgICBhZGhvY19zdGFydC0+ZGF0YV9yYXRlWzBdLCBhZGhvY19zdGFydC0+ZGF0YV9yYXRlWzFdLAorCSAgICAgICBhZGhvY19zdGFydC0+ZGF0YV9yYXRlWzJdLCBhZGhvY19zdGFydC0+ZGF0YV9yYXRlWzNdKTsKIAogCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogQURIT0NfU19DTUQ6IEFELUhPQyBTdGFydCBjb21tYW5kIGlzIHJlYWR5XG4iKTsKIApAQCAtOTE0LDU1ICs5MTMsNDAgQEAKIAl9CiAKIAlpZiAoYWRhcHRlci0+YWRob2NfMTFuX2VuYWJsZWQpIHsKLQkJewotCQkJaHRfY2FwID0gKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0Y2FwICopIHBvczsKLQkJCW1lbXNldChodF9jYXAsIDAsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0Y2FwKSk7Ci0JCQlodF9jYXAtPmhlYWRlci50eXBlID0KLQkJCQljcHVfdG9fbGUxNihXTEFOX0VJRF9IVF9DQVBBQklMSVRZKTsKLQkJCWh0X2NhcC0+aGVhZGVyLmxlbiA9Ci0JCQkgICAgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7Ci0JCQlodF9jYXBfaW5mbyA9IGxlMTZfdG9fY3B1KGh0X2NhcC0+aHRfY2FwLmNhcF9pbmZvKTsKKwkJLyogRmlsbCBIVCBDQVBBQklMSVRZICovCisJCWh0X2NhcCA9IChzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCAqKSBwb3M7CisJCW1lbXNldChodF9jYXAsIDAsIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCkpOworCQlodF9jYXAtPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoV0xBTl9FSURfSFRfQ0FQQUJJTElUWSk7CisJCWh0X2NhcC0+aGVhZGVyLmxlbiA9CisJCSAgICAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKKwkJcmFkaW9fdHlwZSA9IG13aWZpZXhfYmFuZF90b19yYWRpb190eXBlKAorCQkJCQlwcml2LT5hZGFwdGVyLT5jb25maWdfYmFuZHMpOworCQltd2lmaWV4X2ZpbGxfY2FwX2luZm8ocHJpdiwgcmFkaW9fdHlwZSwgaHRfY2FwKTsKIAotCQkJaHRfY2FwX2luZm8gfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfMjA7Ci0JCQlpZiAoYWRhcHRlci0+Y2hhbl9vZmZzZXQpIHsKLQkJCQlodF9jYXBfaW5mbyB8PSBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MDsKLQkJCQlodF9jYXBfaW5mbyB8PSBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MDsKLQkJCQlodF9jYXBfaW5mbyB8PSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsKLQkJCQlTRVRIVF9NQ1MzMihodF9jYXAtPmh0X2NhcC5tY3MucnhfbWFzayk7Ci0JCQl9CisJCXBvcyArPSBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXApOworCQljbWRfYXBwZW5kX3NpemUgKz0KKwkJCXNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCk7CiAKLQkJCWh0X2NhcC0+aHRfY2FwLmFtcGR1X3BhcmFtc19pbmZvCi0JCQkJCT0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEs7Ci0JCQlodF9jYXAtPmh0X2NhcC5tY3MucnhfbWFza1swXSA9IDB4ZmY7Ci0JCQlwb3MgKz0gc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0Y2FwKTsKLQkJCWNtZF9hcHBlbmRfc2l6ZSArPQotCQkJCXNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCk7Ci0JCX0KLQkJewotCQkJaHRfaW5mbyA9IChzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8gKikgcG9zOwotCQkJbWVtc2V0KGh0X2luZm8sIDAsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0aW5mbykpOwotCQkJaHRfaW5mby0+aGVhZGVyLnR5cGUgPQotCQkJCWNwdV90b19sZTE2KFdMQU5fRUlEX0hUX0lORk9STUFUSU9OKTsKLQkJCWh0X2luZm8tPmhlYWRlci5sZW4gPQotCQkJCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8pKTsKLQkJCWh0X2luZm8tPmh0X2luZm8uY29udHJvbF9jaGFuID0KLQkJCQkodTgpIHByaXYtPmN1cnJfYnNzX3BhcmFtcy5ic3NfZGVzY3JpcHRvci4KLQkJCQljaGFubmVsOwotCQkJaWYgKGFkYXB0ZXItPmNoYW5fb2Zmc2V0KSB7Ci0JCQkJaHRfaW5mby0+aHRfaW5mby5odF9wYXJhbSA9Ci0JCQkJCWFkYXB0ZXItPmNoYW5fb2Zmc2V0OwotCQkJCWh0X2luZm8tPmh0X2luZm8uaHRfcGFyYW0gfD0KKwkJLyogRmlsbCBIVCBJTkZPUk1BVElPTiAqLworCQlodF9pbmZvID0gKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0aW5mbyAqKSBwb3M7CisJCW1lbXNldChodF9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvKSk7CisJCWh0X2luZm8tPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoV0xBTl9FSURfSFRfSU5GT1JNQVRJT04pOworCQlodF9pbmZvLT5oZWFkZXIubGVuID0KKwkJCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8pKTsKKworCQlodF9pbmZvLT5odF9pbmZvLmNvbnRyb2xfY2hhbiA9CisJCQkodTgpIHByaXYtPmN1cnJfYnNzX3BhcmFtcy5ic3NfZGVzY3JpcHRvci5jaGFubmVsOworCQlpZiAoYWRhcHRlci0+Y2hhbl9vZmZzZXQpIHsKKwkJCWh0X2luZm8tPmh0X2luZm8uaHRfcGFyYW0gPSBhZGFwdGVyLT5jaGFuX29mZnNldDsKKwkJCWh0X2luZm8tPmh0X2luZm8uaHRfcGFyYW0gfD0KIAkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZOwotCQkJfQotCQkJaHRfaW5mby0+aHRfaW5mby5vcGVyYXRpb25fbW9kZSA9Ci0JCQkgICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9HRl9TVEFfUFJTTlQpOwotCQkJaHRfaW5mby0+aHRfaW5mby5iYXNpY19zZXRbMF0gPSAweGZmOwotCQkJcG9zICs9IHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8pOwotCQkJY21kX2FwcGVuZF9zaXplICs9Ci0JCQkJc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0aW5mbyk7CiAJCX0KKwkJaHRfaW5mby0+aHRfaW5mby5vcGVyYXRpb25fbW9kZSA9CisJCSAgICAgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCk7CisJCWh0X2luZm8tPmh0X2luZm8uYmFzaWNfc2V0WzBdID0gMHhmZjsKKwkJcG9zICs9IHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8pOworCQljbWRfYXBwZW5kX3NpemUgKz0KKwkJCXNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8pOwogCX0KIAogCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KCh1MTYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCmluZGV4IDMwZjEzOGIuLjM4NjFhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCkBAIC03NzUsNyArNzc1LDggQEAKIHN0cnVjdCBtd2lmaWV4X2NoYW5fZnJlcV9wb3dlciAqbXdpZmlleF9nZXRfY2ZwX2J5X2JhbmRfYW5kX2ZyZXFfZnJvbV9jZmc4MDIxMSgKIAkJCQkJCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkJCQl1OCBiYW5kLCB1MzIgZnJlcSk7Ci11MzIgbXdpZmlleF9pbmRleF90b19kYXRhX3JhdGUodTggaW5kZXgsIHU4IGh0X2luZm8pOwordTMyIG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4IGluZGV4LAorCQkJCQkJCXU4IGh0X2luZm8pOwogdTMyIG13aWZpZXhfZmluZF9mcmVxX2Zyb21fYmFuZF9jaGFuKHU4LCB1OCk7CiBpbnQgbXdpZmlleF9jbWRfYXBwZW5kX3ZzaWVfdGx2KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHUxNiB2c2llX21hc2ssCiAJCQkJdTggKipidWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3BjaWUuYwppbmRleCBkMzRhY2YwLi5hMmYzMjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3BjaWUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3BjaWUuYwpAQCAtMzg2LDcgKzM4Niw2IEBACiAJY2FyZC0+dHhiZF9yaW5nX3ZiYXNlID0ga3phbGxvYyhjYXJkLT50eGJkX3Jpbmdfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYXJkLT50eGJkX3JpbmdfdmJhc2UpIHsKIAkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciB0eGJkIHJpbmcuXG4iKTsKLQkJa2ZyZWUoY2FyZC0+dHhiZF9yaW5nX3ZiYXNlKTsKIAkJcmV0dXJuIC0xOwogCX0KIAljYXJkLT50eGJkX3JpbmdfcGJhc2UgPSB2aXJ0X3RvX3BoeXMoY2FyZC0+dHhiZF9yaW5nX3ZiYXNlKTsKQEAgLTEyMjksOSArMTIyOCwxMiBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gMDsKIAotCWlmIChyZHB0ciA+PSBNV0lGSUVYX01BWF9FVlRfQkQpCisJaWYgKHJkcHRyID49IE1XSUZJRVhfTUFYX0VWVF9CRCkgewogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgImV2ZW50X2NvbXBsZXRlOiBJbnZhbGlkIHJkcHRyIDB4JXhcbiIsCiAJCQkJCXJkcHRyKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KIAogCS8qIFJlYWQgdGhlIGV2ZW50IHJpbmcgd3JpdGUgcG9pbnRlciBzZXQgYnkgZmlybXdhcmUgKi8KIAlpZiAobXdpZmlleF9yZWFkX3JlZyhhZGFwdGVyLCBSRUdfRVZUQkRfV1JQVFIsICZ3cnB0cikpIHsKQEAgLTE2NzIsOSArMTY3NCw4IEBACiAJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgc3RydWN0IG13aWZpZXhfdHhfcGFyYW0gKnR4X3BhcmFtKQogewotCWlmICghYWRhcHRlciB8fCAhc2tiKSB7Ci0JCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiSW52YWxpZCBwYXJhbWV0ZXIgaW4gJXMgPCVwLCAlcD5cbiIsCi0JCQkJX19mdW5jX18sIGFkYXB0ZXIsIHNrYik7CisJaWYgKCFza2IpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJQYXNzZWQgTlVMTCBza2IgdG8gJXNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NjYW4uYwppbmRleCA4ZDNhYjM3Li5iOGI5ZDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NjYW4uYwpAQCAtMTUzNywxMSArMTUzNyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG13aWZpZXhfZnJlZV9ic3NfcHJpdihzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MpCi17Ci0Ja2ZyZWUoYnNzLT5wcml2KTsKLX0KLQogLyoKICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgY29tbWFuZCByZXNwb25zZSBvZiBzY2FuLgogICoKQEAgLTE3NjcsNyArMTc2Miw3IEBACiAJCQkJCSAgICAgIGNhcF9pbmZvX2JpdG1hcCwgYmVhY29uX3BlcmlvZCwKIAkJCQkJICAgICAgaWVfYnVmLCBpZV9sZW4sIHJzc2ksIEdGUF9LRVJORUwpOwogCQkJCSoodTggKilic3MtPnByaXYgPSBiYW5kOwotCQkJCWJzcy0+ZnJlZV9wcml2ID0gbXdpZmlleF9mcmVlX2Jzc19wcml2OworCQkJCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKIAogCQkJCWlmIChwcml2LT5tZWRpYV9jb25uZWN0ZWQgJiYgIW1lbWNtcChic3NpZCwKIAkJCQkJcHJpdi0+Y3Vycl9ic3NfcGFyYW1zLmJzc19kZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jCmluZGV4IDI4MzE3MWIuLjcwMjQ1MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jCkBAIC0yNTYsMTAgKzI1NiwxMyBAQAogCiAvKiBEZXZpY2UgSUQgZm9yIFNEODc4NyAqLwogI2RlZmluZSBTRElPX0RFVklDRV9JRF9NQVJWRUxMXzg3ODcgICAoMHg5MTE5KQorLyogRGV2aWNlIElEIGZvciBTRDg3OTcgKi8KKyNkZWZpbmUgU0RJT19ERVZJQ0VfSURfTUFSVkVMTF84Nzk3ICAgKDB4OTEyOSkKIAogLyogV0xBTiBJRHMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgbXdpZmlleF9pZHNbXSA9IHsKIAl7U0RJT19ERVZJQ0UoU0RJT19WRU5ET1JfSURfTUFSVkVMTCwgU0RJT19ERVZJQ0VfSURfTUFSVkVMTF84Nzg3KX0sCisJe1NESU9fREVWSUNFKFNESU9fVkVORE9SX0lEX01BUlZFTEwsIFNESU9fREVWSUNFX0lEX01BUlZFTExfODc5Nyl9LAogCXt9LAogfTsKIApAQCAtMTU3Myw3ICsxNTc2LDE2IEBACiAJc2Rpb19zZXRfZHJ2ZGF0YShmdW5jLCBjYXJkKTsKIAogCWFkYXB0ZXItPmRldiA9ICZmdW5jLT5kZXY7Ci0Jc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIFNEODc4N19ERUZBVUxUX0ZXX05BTUUpOworCisJc3dpdGNoIChmdW5jLT5kZXZpY2UpIHsKKwljYXNlIFNESU9fREVWSUNFX0lEX01BUlZFTExfODc5NzoKKwkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIFNEODc5N19ERUZBVUxUX0ZXX05BTUUpOworCQlicmVhazsKKwljYXNlIFNESU9fREVWSUNFX0lEX01BUlZFTExfODc4NzoKKwlkZWZhdWx0OgorCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwgU0Q4Nzg3X0RFRkFVTFRfRldfTkFNRSk7CisJCWJyZWFrOworCX0KIAogCXJldHVybiAwOwogCkBAIC0xNjMwLDE0ICsxNjQyLDE0IEBACiAJY2FyZC0+bXBhX3R4LnBrdF9jbnQgPSAwOwogCWNhcmQtPm1wYV90eC5zdGFydF9wb3J0ID0gMDsKIAotCWNhcmQtPm1wYV90eC5lbmFibGVkID0gMDsKKwljYXJkLT5tcGFfdHguZW5hYmxlZCA9IDE7CiAJY2FyZC0+bXBhX3R4LnBrdF9hZ2dyX2xpbWl0ID0gU0RJT19NUF9BR0dSX0RFRl9QS1RfTElNSVQ7CiAKIAljYXJkLT5tcGFfcnguYnVmX2xlbiA9IDA7CiAJY2FyZC0+bXBhX3J4LnBrdF9jbnQgPSAwOwogCWNhcmQtPm1wYV9yeC5zdGFydF9wb3J0ID0gMDsKIAotCWNhcmQtPm1wYV9yeC5lbmFibGVkID0gMDsKKwljYXJkLT5tcGFfcnguZW5hYmxlZCA9IDE7CiAJY2FyZC0+bXBhX3J4LnBrdF9hZ2dyX2xpbWl0ID0gU0RJT19NUF9BR0dSX0RFRl9QS1RfTElNSVQ7CiAKIAkvKiBBbGxvY2F0ZSBidWZmZXJzIGZvciBTRElPIE1QLUEgKi8KQEAgLTE3NzQsNCArMTc4Niw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgV2lGaS1FeCBTRElPIERyaXZlciB2ZXJzaW9uICIgU0RJT19WRVJTSU9OKTsKIE1PRFVMRV9WRVJTSU9OKFNESU9fVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfRklSTVdBUkUoIm1ydmwvc2Q4Nzg3X3VhcHN0YS5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRShTRDg3ODdfREVGQVVMVF9GV19OQU1FKTsKK01PRFVMRV9GSVJNV0FSRShTRDg3OTdfREVGQVVMVF9GV19OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKaW5kZXggM2Y3MTE4MC4uYTNmYjMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJtYWluLmgiCiAKICNkZWZpbmUgU0Q4Nzg3X0RFRkFVTFRfRldfTkFNRSAibXJ2bC9zZDg3ODdfdWFwc3RhLmJpbiIKKyNkZWZpbmUgU0Q4Nzk3X0RFRkFVTFRfRldfTkFNRSAibXJ2bC9zZDg3OTdfdWFwc3RhLmJpbiIKIAogI2RlZmluZSBCTE9DS19NT0RFCTEKICNkZWZpbmUgQllURV9NT0RFCTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYwppbmRleCA3YTE2YjBjLi5lODEyZGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9jbWRyZXNwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kcmVzcC5jCkBAIC01MDgsNyArNTA4LDcgQEAKIAlwcml2LT50eF9odGluZm8gPSByZXNwLT5wYXJhbXMudHhfcmF0ZS5odF9pbmZvOwogCWlmICghcHJpdi0+aXNfZGF0YV9yYXRlX2F1dG8pCiAJCXByaXYtPmRhdGFfcmF0ZSA9Ci0JCQltd2lmaWV4X2luZGV4X3RvX2RhdGFfcmF0ZShwcml2LT50eF9yYXRlLAorCQkJbXdpZmlleF9pbmRleF90b19kYXRhX3JhdGUocHJpdiwgcHJpdi0+dHhfcmF0ZSwKIAkJCQkJCSAgIHByaXYtPnR4X2h0aW5mbyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9pb2N0bC5jCmluZGV4IGVhNGEyOWIuLjRiNmY1NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfaW9jdGwuYwpAQCAtODMyLDggKzgzMiw4IEBACiAKIAlpZiAoIXJldCkgewogCQlpZiAocmF0ZS0+aXNfcmF0ZV9hdXRvKQotCQkJcmF0ZS0+cmF0ZSA9IG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHByaXYtPnR4X3JhdGUsCi0JCQkJCQkJcHJpdi0+dHhfaHRpbmZvKTsKKwkJCXJhdGUtPnJhdGUgPSBtd2lmaWV4X2luZGV4X3RvX2RhdGFfcmF0ZShwcml2LAorCQkJCQlwcml2LT50eF9yYXRlLCBwcml2LT50eF9odGluZm8pOwogCQllbHNlCiAJCQlyYXRlLT5yYXRlID0gcHJpdi0+ZGF0YV9yYXRlOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfcnguYwppbmRleCAyNzQzMDUxLi41ZTFlZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX3J4LmMKQEAgLTEyNiw2ICsxMjYsOSBAQAogCXUxNiByeF9wa3RfdHlwZTsKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gYWRhcHRlci0+cHJpdltyeF9pbmZvLT5ic3NfaW5kZXhdOwogCisJaWYgKCFwcml2KQorCQlyZXR1cm4gLTE7CisKIAlsb2NhbF9yeF9wZCA9IChzdHJ1Y3QgcnhwZCAqKSAoc2tiLT5kYXRhKTsKIAlyeF9wa3RfdHlwZSA9IGxvY2FsX3J4X3BkLT5yeF9wa3RfdHlwZTsKIApAQCAtMTg5LDEyICsxOTIsMTEgQEAKIAkJCQkJICAgICAodTgpIGxvY2FsX3J4X3BkLT5yeF9wa3RfdHlwZSwKIAkJCQkJICAgICBza2IpOwogCi0JaWYgKHJldCB8fCAocnhfcGt0X3R5cGUgPT0gUEtUX1RZUEVfQkFSKSkgewotCQlpZiAocHJpdiAmJiAocmV0ID09IC0xKSkKLQkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQorCWlmIChyZXQgfHwgKHJ4X3BrdF90eXBlID09IFBLVF9UWVBFX0JBUikpCiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JfQorCisJaWYgKHJldCkKKwkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vZncuYwppbmRleCA1MjdjZjUzLi40ZGY4Y2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9mdy5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiaGVybWVzLmgiCiAjaW5jbHVkZSAiaGVybWVzX2RsZC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3NjYW4uYwppbmRleCBlOTljYTFjLi45NmUzOWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3NjYW4uYwpAQCAtNzYsNiArNzYsNyBAQAogewogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSBwcml2X3RvX3dpcGh5KHByaXYpOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbDsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpjYnNzOwogCXU4ICppZTsKIAl1OCBpZV9idWZbNDZdOwogCXU2NCB0aW1lc3RhbXA7CkBAIC0xMjEsOSArMTIyLDEwIEBACiAJYmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUoYnNzLT5hLmJlYWNvbl9pbnRlcnYpOwogCXNpZ25hbCA9IFNJR05BTF9UT19NQk0obGUxNl90b19jcHUoYnNzLT5hLmxldmVsKSk7CiAKLQljZmc4MDIxMV9pbmZvcm1fYnNzKHdpcGh5LCBjaGFubmVsLCBic3MtPmEuYnNzaWQsIHRpbWVzdGFtcCwKLQkJCSAgICBjYXBhYmlsaXR5LCBiZWFjb25faW50ZXJ2YWwsIGllX2J1ZiwgaWVfbGVuLAotCQkJICAgIHNpZ25hbCwgR0ZQX0tFUk5FTCk7CisJY2JzcyA9IGNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIGNoYW5uZWwsIGJzcy0+YS5ic3NpZCwgdGltZXN0YW1wLAorCQkJCSAgIGNhcGFiaWxpdHksIGJlYWNvbl9pbnRlcnZhbCwgaWVfYnVmLCBpZV9sZW4sCisJCQkJICAgc2lnbmFsLCBHRlBfS0VSTkVMKTsKKwljZmc4MDIxMV9wdXRfYnNzKGNic3MpOwogfQogCiB2b2lkIG9yaW5vY29fYWRkX2V4dHNjYW5fcmVzdWx0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCkBAIC0xMzIsNiArMTM0LDcgQEAKIHsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gcHJpdl90b193aXBoeShwcml2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CisJc3RydWN0IGNmZzgwMjExX2JzcyAqY2JzczsKIAljb25zdCB1OCAqaWU7CiAJdTY0IHRpbWVzdGFtcDsKIAlzMzIgc2lnbmFsOwpAQCAtMTUyLDkgKzE1NSwxMCBAQAogCWllID0gYnNzLT5kYXRhOwogCXNpZ25hbCA9IFNJR05BTF9UT19NQk0oYnNzLT5sZXZlbCk7CiAKLQljZmc4MDIxMV9pbmZvcm1fYnNzKHdpcGh5LCBjaGFubmVsLCBic3MtPmJzc2lkLCB0aW1lc3RhbXAsCi0JCQkgICAgY2FwYWJpbGl0eSwgYmVhY29uX2ludGVydmFsLCBpZSwgaWVfbGVuLAotCQkJICAgIHNpZ25hbCwgR0ZQX0tFUk5FTCk7CisJY2JzcyA9IGNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIGNoYW5uZWwsIGJzcy0+YnNzaWQsIHRpbWVzdGFtcCwKKwkJCQkgICBjYXBhYmlsaXR5LCBiZWFjb25faW50ZXJ2YWwsIGllLCBpZV9sZW4sCisJCQkJICAgc2lnbmFsLCBHRlBfS0VSTkVMKTsKKwljZmc4MDIxMV9wdXRfYnNzKGNic3MpOwogfQogCiB2b2lkIG9yaW5vY29fYWRkX2hvc3RzY2FuX3Jlc3VsdHMoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9lZXByb20uYwppbmRleCA4YjZmMzYzLi5mYThjZTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2VlcHJvbS5jCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInA1NC5oIgogI2luY2x1ZGUgImVlcHJvbS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2Z3aW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9md2lvLmMKaW5kZXggNTNhMzQwOC4uMThlODJiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2Z3aW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvZndpby5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L21haW4uYwppbmRleCBhZDlhZTA0Li5kYjRkOWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9tYWluLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuYwppbmRleCAxYjc1MzE3Li5iMWY1MWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHBjaS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KIAogI2luY2x1ZGUgInA1NC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHNwaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHNwaS5jCmluZGV4IDc4ZDBkNjkuLjdmYWVkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRzcGkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0c3BpLmMKQEAgLTU4MSwxMSArNTgxLDcgQEAKIAlzdHJ1Y3QgcDU0c19wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdXRleCkpIHsKLQkJLyogRklYTUU6IGhvdyB0byBoYW5kbGUgdGhpcyBlcnJvcj8gKi8KLQkJcmV0dXJuOwotCX0KLQorCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlXQVJOX09OKHByaXYtPmZ3X3N0YXRlICE9IEZXX1NUQVRFX1JFQURZKTsKIAogCXA1NHNwaV9wb3dlcl9vZmYocHJpdik7CkBAIC03MDQsNyArNzAwLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBwNTRzcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCQk9ICJwNTRzcGkiLAotCQkuYnVzCQk9ICZzcGlfYnVzX3R5cGUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAl9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmMKaW5kZXggYThmM2JjNy4uOWI2MDk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCiAjaW5jbHVkZSAicDU0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvdHhyeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3R4cnguYwppbmRleCBmNDg1Nzg0Li40MmI5N2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC90eHJ4LmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtMjQxLDcgKzI0Miw3IEBACiAKIAlza2JfdW5saW5rKHNrYiwgJnByaXYtPnR4X3F1ZXVlKTsKIAlwNTRfdHhfcW9zX2FjY291bnRpbmdfZnJlZShwcml2LCBza2IpOwotCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJaWVlZTgwMjExX2ZyZWVfdHhza2IoZGV2LCBza2IpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocDU0X2ZyZWVfc2tiKTsKIApAQCAtNzg3LDcgKzc4OCw3IEBACiAJCQkgICAgJmhkcl9mbGFncywgJmFpZCwgJmJ1cnN0X2FsbG93ZWQpOwogCiAJaWYgKHA1NF90eF9xb3NfYWNjb3VudGluZ19hbGxvYyhwcml2LCBza2IsIHF1ZXVlKSkgewotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZWVlODAyMTFfZnJlZV90eHNrYihkZXYsIHNrYik7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCmluZGV4IGJjMmJhODAuLjRlNDRiMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwpAQCAtMjQ5MywzMjMgKzI0OTMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIE5vdGU6IGN1cnJlbnRseSwgdXNlIGhvc3RhcGQgaW9jdGwgZnJvbSB0aGUgSG9zdCBBUCBkcml2ZXIgZm9yIFdQQQotICogc3VwcG9ydC4gVGhpcyBpcyB0byBiZSByZXBsYWNlZCB3aXRoIExpbnV4IHdpcmVsZXNzIGV4dGVuc2lvbnMgb25jZSB0aGV5Ci0gKiBnZXQgV1BBIHN1cHBvcnQuICovCi0KLS8qIE5vdGUgSUk6IHBsZWFzZSBsZWF2ZSBhbGwgdGhpcyB0b2dldGhlciBhcyBpdCB3aWxsIGJlIGVhc2llciB0byByZW1vdmUgbGF0ZXIsCi0gKiBvbmNlIHdpcmVsZXNzIGV4dGVuc2lvbnMgYWRkIFdQQSBzdXBwb3J0IC1tY2dyb2YgKi8KLQotLyogUFJJU001NF9IT1NUQVBEIGlvY3RsKCkgY21kOiAqLwotZW51bSB7Ci0JUFJJU00yX1NFVF9FTkNSWVBUSU9OID0gNiwKLQlQUklTTTJfSE9TVEFQRF9TRVRfR0VORVJJQ19FTEVNRU5UID0gMTIsCi0JUFJJU00yX0hPU1RBUERfTUxNRSA9IDEzLAotCVBSSVNNMl9IT1NUQVBEX1NDQU5fUkVRID0gMTQsCi19OwotCiAjZGVmaW5lIFBSSVNNNTRfU0VUX1dQQQkJCVNJT0NJV0ZJUlNUUFJJVisxMgotI2RlZmluZSBQUklTTTU0X0hPU1RBUEQJCQlTSU9DSVdGSVJTVFBSSVYrMjUKLSNkZWZpbmUgUFJJU001NF9EUk9QX1VORU5DUllQVEVECVNJT0NJV0ZJUlNUUFJJVisyNgotCi0jZGVmaW5lIFBSSVNNMl9IT1NUQVBEX01BWF9CVUZfU0laRSAxMDI0Ci0jZGVmaW5lIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOIFwKLQlvZmZzZXRvZihzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0sIHUuZ2VuZXJpY19lbGVtLmRhdGEpCi0KLS8qIE1heGltdW0gbGVuZ3RoIGZvciBhbGdvcml0aG0gbmFtZXMgKC0xIGZvciBudWwgdGVybWluYXRpb24pCi0gKiB1c2VkIGluIGlvY3RsKCkgKi8KLSNkZWZpbmUgSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTiAxNgotCi1zdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gewotCXUzMiBjbWQ7Ci0JdTggc3RhX2FkZHJbRVRIX0FMRU5dOwotCXVuaW9uIHsKLQkgICAgICAgc3RydWN0IHsKLQkJICAgICAgIHU4IGFsZ1tIT1NUQVBfQ1JZUFRfQUxHX05BTUVfTEVOXTsKLQkJICAgICAgIHUzMiBmbGFnczsKLQkJICAgICAgIHUzMiBlcnI7Ci0JCSAgICAgICB1OCBpZHg7Ci0JCSAgICAgICB1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCi0JCSAgICAgICB1MTYga2V5X2xlbjsKLQkJICAgICAgIHU4IGtleVswXTsKLQkJICAgICAgIH0gY3J5cHQ7Ci0gICAgICAgICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgICAgICAgICAgICB1OCBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgIHU4IGRhdGFbMF07Ci0gICAgICAgICAgICAgICB9IGdlbmVyaWNfZWxlbTsKLSAgICAgICAgICAgICAgIHN0cnVjdCB7Ci0jZGVmaW5lIE1MTUVfU1RBX0RFQVVUSCAwCi0jZGVmaW5lIE1MTUVfU1RBX0RJU0FTU09DIDEKLSAgICAgICAgICAgICAgICAgICAgICAgdTE2IGNtZDsKLSAgICAgICAgICAgICAgICAgICAgICAgdTE2IHJlYXNvbl9jb2RlOwotICAgICAgICAgICAgICAgfSBtbG1lOwotICAgICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgdTggc3NpZF9sZW47Ci0gICAgICAgICAgICAgICAgICAgICAgIHU4IHNzaWRbMzJdOwotICAgICAgICAgICAgICAgfSBzY2FuX3JlcTsKLSAgICAgICB9IHU7Ci19OwotCi0KLXN0YXRpYyBpbnQKLXByaXNtMl9pb2N0bF9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0sCi0JaW50IHBhcmFtX2xlbikKLXsKLQlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJ2YWx1ZSA9IDAsIGZvcmNlID0gMDsKLQlpbnQgYXV0aGVuID0gRE9UMTFfQVVUSF9PUywgaW52b2tlID0gMCwgZXh1bmVuY3J5cHQgPSAwOwotCXVuaW9uIG9pZF9yZXNfdCByOwotCi0JLyogd2l0aCB0aGUgbmV3IEFQSSwgaXQncyBpbXBvc3NpYmxlIHRvIGdldCBhIE5VTEwgcG9pbnRlci4KLQkgKiBOZXcgdmVyc2lvbiBvZiBpd2NvbmZpZyBzZXQgdGhlIElXX0VOQ09ERV9OT0tFWSBmbGFnCi0JICogd2hlbiBubyBrZXkgaXMgZ2l2ZW4sIGJ1dCBvbGRlciB2ZXJzaW9ucyBkb24ndC4gKi8KLQotCWlmIChwYXJhbS0+dS5jcnlwdC5rZXlfbGVuID4gMCkgewotCQkvKiB3ZSBoYXZlIGEga2V5IHRvIHNldCAqLwotCQlpbnQgaW5kZXggPSBwYXJhbS0+dS5jcnlwdC5pZHg7Ci0JCWludCBjdXJyZW50X2luZGV4OwotCQlzdHJ1Y3Qgb2JqX2tleSBrZXkgPSB7IERPVDExX1BSSVZfVEtJUCwgMCwgIiIgfTsKLQotCQkvKiBnZXQgdGhlIGN1cnJlbnQga2V5IGluZGV4ICovCi0JCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZSUQsIDAsIE5VTEwsICZyKTsKLQkJY3VycmVudF9pbmRleCA9IHIudTsKLQkJLyogVmVyaWZ5IHRoYXQgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KLQkJaWYgKCEocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7Ci0JCQlrZXkubGVuZ3RoID0gcGFyYW0tPnUuY3J5cHQua2V5X2xlbiA+IHNpemVvZiAocGFyYW0tPnUuY3J5cHQua2V5KSA/Ci0JCQkgICAgc2l6ZW9mIChwYXJhbS0+dS5jcnlwdC5rZXkpIDogcGFyYW0tPnUuY3J5cHQua2V5X2xlbjsKLQkJCW1lbWNweShrZXkua2V5LCBwYXJhbS0+dS5jcnlwdC5rZXksIGtleS5sZW5ndGgpOwotCQkJaWYgKGtleS5sZW5ndGggPT0gMzIpCi0JCQkJLyogd2Ugd2FudCBXUEEtUFNLICovCi0JCQkJa2V5LnR5cGUgPSBET1QxMV9QUklWX1RLSVA7Ci0JCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID4gMykpCi0JCQkJLyogbm8gaW5kZXggcHJvdmlkZWQgdXNlIHRoZSBjdXJyZW50IG9uZSAqLwotCQkJCWluZGV4ID0gY3VycmVudF9pbmRleDsKLQotCQkJLyogbm93IHNlbmQgdGhlIGtleSB0byB0aGUgY2FyZCAgKi8KLQkJCXJ2YWx1ZSB8PQotCQkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZWCwgaW5kZXgsCi0JCQkJCSAgICAma2V5KTsKLQkJfQotCQkvKgotCQkgKiBJZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gc2hvdWxkIGJlIGVuYWJsZWQKLQkJICogKHVzZXIgbWF5IHR1cm4gaXQgb2ZmIGxhdGVyKS4KLQkJICogVGhpcyBpcyBhbHNvIGhvdyAiaXdjb25maWcgZXRoWCBrZXkgb24iIHdvcmtzCi0JCSAqLwotCQlpZiAoKGluZGV4ID09IGN1cnJlbnRfaW5kZXgpICYmIChrZXkubGVuZ3RoID4gMCkpCi0JCQlmb3JjZSA9IDE7Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0JCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDw9IDMpKSB7Ci0JCQkvKiB3ZSB3YW50IHRvIHNldCB0aGUga2V5IGluZGV4ICovCi0JCQlydmFsdWUgfD0KLQkJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWUlELCAwLAotCQkJCQkgICAgJmluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWlmICghKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX01PREUpKSB7Ci0JCQkJLyogd2UgY2Fubm90IGRvIGFueXRoaW5nLiBDb21wbGFpbi4gKi8KLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCX0KLQkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgKi8KLQlpZiAocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKLQkJLyogRW5jb2RpbmcgZGlzYWJsZWQsCi0JCSAqIGF1dGhlbiA9IERPVDExX0FVVEhfT1M7Ci0JCSAqIGludm9rZSA9IDA7Ci0JCSAqIGV4dW5lbmNyeXB0ID0gMDsgKi8KLQl9Ci0JaWYgKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCi0JCS8qIEVuY29kZSBidXQgYWNjZXB0IG5vbi1lbmNvZGVkIHBhY2tldHMuIE5vIGF1dGggKi8KLQkJaW52b2tlID0gMTsKLQlpZiAoKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHx8IGZvcmNlKSB7Ci0JCS8qIFJlZnVzZSBub24tZW5jb2RlZCBwYWNrZXRzLiBBdXRoICovCi0JCWF1dGhlbiA9IERPVDExX0FVVEhfQk9USDsKLQkJaW52b2tlID0gMTsKLQkJZXh1bmVuY3J5cHQgPSAxOwotCX0KLQkvKiBkbyB0aGUgY2hhbmdlIGlmIHJlcXVlc3RlZCAgKi8KLQlpZiAoKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHx8IGZvcmNlKSB7Ci0JCXJ2YWx1ZSB8PQotCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9BVVRIRU5BQkxFLCAwLCAmYXV0aGVuKTsKLQkJcnZhbHVlIHw9Ci0JCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELCAwLCAmaW52b2tlKTsKLQkJcnZhbHVlIHw9Ci0JCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsIDAsCi0JCQkJICAgICZleHVuZW5jcnlwdCk7Ci0JfQotCXJldHVybiBydmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaXNtMl9pb2N0bF9zZXRfZ2VuZXJpY19lbGVtZW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCXN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0sCi0JaW50IHBhcmFtX2xlbikKLXsKLSAgICAgICBpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotICAgICAgIGludCBtYXhfbGVuLCBsZW4sIGFsZW4sIHJldD0wOwotICAgICAgIHN0cnVjdCBvYmpfYXR0YWNobWVudCAqYXR0YWNoOwotCi0gICAgICAgbGVuID0gcGFyYW0tPnUuZ2VuZXJpY19lbGVtLmxlbjsKLSAgICAgICBtYXhfbGVuID0gcGFyYW1fbGVuIC0gUFJJU00yX0hPU1RBUERfR0VORVJJQ19FTEVNRU5UX0hEUl9MRU47Ci0gICAgICAgaWYgKG1heF9sZW4gPCAwIHx8IG1heF9sZW4gPCBsZW4pCi0gICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgICAgIGFsZW4gPSBzaXplb2YoKmF0dGFjaCkgKyBsZW47Ci0gICAgICAgYXR0YWNoID0ga3phbGxvYyhhbGVuLCBHRlBfS0VSTkVMKTsKLSAgICAgICBpZiAoYXR0YWNoID09IE5VTEwpCi0gICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLQotI2RlZmluZSBXTEFOX0ZDX1RZUEVfTUdNVCAwCi0jZGVmaW5lIFdMQU5fRkNfU1RZUEVfQVNTT0NfUkVRIDAKLSNkZWZpbmUgV0xBTl9GQ19TVFlQRV9SRUFTU09DX1JFUSAyCi0KLSAgICAgICAvKiBOb3RlOiBlbmRpYW5uZXNzIGlzIGNvdmVyZWQgYnkgbWd0X3NldF92YXJsZW4gKi8KLQotICAgICAgIGF0dGFjaC0+dHlwZSA9IChXTEFOX0ZDX1RZUEVfTUdNVCA8PCAyKSB8Ci0gICAgICAgICAgICAgICAoV0xBTl9GQ19TVFlQRV9BU1NPQ19SRVEgPDwgNCk7Ci0gICAgICAgYXR0YWNoLT5pZCA9IC0xOwotICAgICAgIGF0dGFjaC0+c2l6ZSA9IGxlbjsKLSAgICAgICBtZW1jcHkoYXR0YWNoLT5kYXRhLCBwYXJhbS0+dS5nZW5lcmljX2VsZW0uZGF0YSwgbGVuKTsKLQotICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7Ci0KLSAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgICAgIGF0dGFjaC0+dHlwZSA9IChXTEFOX0ZDX1RZUEVfTUdNVCA8PCAyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0ZDX1NUWVBFX1JFQVNTT0NfUkVRIDw8IDQpOwotCi0JICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7Ci0KLQkgICAgICAgaWYgKHJldCA9PSAwKQotCQkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXUEEgSUUgQXR0YWNobWVudCB3YXMgc2V0XG4iLAotCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLSAgICAgICB9Ci0KLSAgICAgICBrZnJlZShhdHRhY2gpOwotICAgICAgIHJldHVybiByZXQ7Ci0KLX0KLQotc3RhdGljIGludAotcHJpc20yX2lvY3RsX21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSkKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaXNtMl9pb2N0bF9zY2FuX3JlcShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0pCi17Ci0JaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvIGluZm87Ci0JaW50IGksIHJ2YWx1ZTsKLQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmJzc2xpc3Q7Ci0JdTMyIG5vaXNlID0gMDsKLQljaGFyICpleHRyYSA9ICIiOwotCWNoYXIgKmN1cnJlbnRfZXYgPSAiZm9vIjsKLQl1bmlvbiBvaWRfcmVzX3QgcjsKLQotCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpIHsKLQkJLyogZGV2aWNlIGlzIG5vdCByZWFkeSwgZmFpbCBnZW50bHkgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZmlyc3QgZ2V0IHRoZSBub2lzZSB2YWx1ZS4gV2Ugd2lsbCB1c2UgaXQgdG8gcmVwb3J0IHRoZSBsaW5rIHF1YWxpdHkgKi8KLQlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX05PSVNFRkxPT1IsIDAsIE5VTEwsICZyKTsKLQlub2lzZSA9IHIudTsKLQotCS8qIEFzayB0aGUgZGV2aWNlIGZvciBhIGxpc3Qgb2Yga25vd24gYnNzLiBXZSBjYW4gcmVwb3J0IGF0IG1vc3QKLQkgKiBJV19NQVhfQVA9NjQgdG8gdGhlIHJhbmdlIHN0cnVjdC4gQnV0IHRoZSBkZXZpY2Ugd29uJ3QgcmVwcG9ydCBhbnl0aGluZwotCSAqIGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlIG9mIElXTUFYX0JTUz0yNC4KLQkgKi8KLQlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9CU1NMSVNULCAwLCBOVUxMLCAmcik7Ci0JYnNzbGlzdCA9IHIucHRyOwotCi0JaW5mby5jbWQgPSBQUklTTTU0X0hPU1RBUEQ7Ci0JaW5mby5mbGFncyA9IDA7Ci0KLQkvKiBvayBub3csIHNjYW4gdGhlIGxpc3QgYW5kIHRyYW5zbGF0ZSBpdHMgaW5mbyAqLwotCWZvciAoaSA9IDA7IGkgPCBtaW4oSVdfTUFYX0FQLCAoaW50KSBic3NsaXN0LT5ucik7IGkrKykKLQkJY3VycmVudF9ldiA9IHByaXNtNTRfdHJhbnNsYXRlX2JzcyhuZGV2LCAmaW5mbywgY3VycmVudF9ldiwKLQkJCQkJCSAgIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwKLQkJCQkJCSAgICYoYnNzbGlzdC0+YnNzbGlzdFtpXSksCi0JCQkJCQkgICBub2lzZSk7Ci0Ja2ZyZWUoYnNzbGlzdCk7Ci0KLQlyZXR1cm4gcnZhbHVlOwotfQotCi1zdGF0aWMgaW50Ci1wcmlzbTU0X2hvc3RhcGQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19wb2ludCAqcCkKLXsKLSAgICAgICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtOwotICAgICAgIGludCByZXQgPSAwOwotICAgICAgIHUzMiB1d3JxOwotCi0gICAgICAgcHJpbnRrKEtFUk5fREVCVUcgInByaXNtNTRfaG9zdGFwZCAtIGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKLSAgICAgICBpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSkgfHwKLSAgICAgICAgICAgcC0+bGVuZ3RoID4gUFJJU00yX0hPU1RBUERfTUFYX0JVRl9TSVpFIHx8ICFwLT5wb2ludGVyKQotICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJhbSA9IG1lbWR1cF91c2VyKHAtPnBvaW50ZXIsIHAtPmxlbmd0aCk7Ci0JaWYgKElTX0VSUihwYXJhbSkpCi0JCXJldHVybiBQVFJfRVJSKHBhcmFtKTsKLQotICAgICAgIHN3aXRjaCAocGFyYW0tPmNtZCkgewotICAgICAgIGNhc2UgUFJJU00yX1NFVF9FTkNSWVBUSU9OOgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzZXQgZW5jcnlwdGlvbiByZXF1ZXN0XG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOwotICAgICAgICAgICAgICAgcmV0ID0gcHJpc20yX2lvY3RsX3NldF9lbmNyeXB0aW9uKG5kZXYsIHBhcmFtLCBwLT5sZW5ndGgpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBQUklTTTJfSE9TVEFQRF9TRVRfR0VORVJJQ19FTEVNRU5UOgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzZXQgV1BBIElFIHJlcXVlc3RcbiIsCi0JCQkgICAgICAgbmRldi0+bmFtZSk7Ci0gICAgICAgICAgICAgICByZXQgPSBwcmlzbTJfaW9jdGxfc2V0X2dlbmVyaWNfZWxlbWVudChuZGV2LCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIFBSSVNNMl9IT1NUQVBEX01MTUU6Ci0JICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IE1MTUUgcmVxdWVzdFxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLSAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9tbG1lKG5kZXYsIHBhcmFtKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgUFJJU00yX0hPU1RBUERfU0NBTl9SRVE6Ci0JICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IHNjYW4gcmVxdWVzdFxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLSAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9zY2FuX3JlcShuZGV2LCBwYXJhbSk7Ci0gICAgICAgICAgICAgICBicmVhazsKLQljYXNlIFBSSVNNNTRfU0VUX1dQQToKLQkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIHN1cHBsaWNhbnQgd3BhIGluaXQgcmVxdWVzdFxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLQkgICAgICAgdXdycSA9IDE7Ci0JICAgICAgIHJldCA9IHByaXNtNTRfc2V0X3dwYShuZGV2LCBOVUxMLCAmdXdycSwgTlVMTCk7Ci0JICAgICAgIGJyZWFrOwotCWNhc2UgUFJJU001NF9EUk9QX1VORU5DUllQVEVEOgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgZHJvcCB1bmVuY3J5cHRlZCByZXF1ZXN0XG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOwotI2lmIDAKLQkgICAgICAgdXdycSA9IDB4MDE7Ci0JICAgICAgIG1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsICZ1d3JxKTsKLQkgICAgICAgZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7Ci0JICAgICAgIG1ndF9jb21taXQocHJpdik7Ci0JICAgICAgIHVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKLSNlbmRpZgotCSAgICAgICAvKiBOb3QgbmVjZXNzYXJ5LCBhcyBzZXRfd3BhIGRvZXMgaXQsIHNob3VsZCB3ZSBqdXN0IGRvIGl0IGhlcmUgdGhvdWdoPyAqLwotCSAgICAgICByZXQgPSAwOwotCSAgICAgICBicmVhazsKLSAgICAgICBkZWZhdWx0OgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBhIFdQQSBzdXBwbGljYW50IHJlcXVlc3QgdGhhdCBpcyBub3Qgc3VwcG9ydGVkXG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOwotICAgICAgICAgICAgICAgcmV0ID0gLUVPUE5PVFNVUFA7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICB9Ci0KLSAgICAgICBpZiAocmV0ID09IDAgJiYgY29weV90b191c2VyKHAtPnBvaW50ZXIsIHBhcmFtLCBwLT5sZW5ndGgpKQotICAgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKLQotICAgICAgIGtmcmVlKHBhcmFtKTsKLQotICAgICAgIHJldHVybiByZXQ7Ci19CiAKIHN0YXRpYyBpbnQKIHByaXNtNTRfc2V0X3dwYShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTMyMjMsMjAgKzI5MDcsMyBAQAogCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcmlzbTU0X3ByaXZhdGVfYXJncywKIAkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcHJpc201NF9nZXRfd2lyZWxlc3Nfc3RhdHMsCiB9OwotCi0vKiBGb3Igd3BhX3N1cHBsaWNhbnQgKi8KLQotaW50Ci1wcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQotewotCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKLQlpbnQgcmV0ID0gLTE7Ci0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBQUklTTTU0X0hPU1RBUEQ6Ci0JCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCXJldCA9IHByaXNtNTRfaG9zdGFwZChuZGV2LCAmd3JxLT51LmRhdGEpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuaAppbmRleCBiY2ZiZmI5Li5hMzRiY2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmgKQEAgLTQzLDggKzQzLDYgQEAKIAogaW50IHByaXNtNTRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICosIHZvaWQgKik7CiAKLWludCBwcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOwotCiBleHRlcm4gY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHByaXNtNTRfaGFuZGxlcl9kZWY7CiAKICNlbmRpZgkJCQkvKiBfSVNMX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKaW5kZXggNWQwZjYxNS4uNTk3MGZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKQEAgLTc5Myw4ICs3OTMsOCBAQAogc3RhdGljIHZvaWQgaXNscGNpX2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBpc2xwY2lfZXRodG9vbF9vcHMgPSB7CkBAIC04MDQsNyArODA0LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaXNscGNpX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuIAkJPSBpc2xwY2lfb3BlbiwKIAkubmRvX3N0b3AJCT0gaXNscGNpX2Nsb3NlLAotCS5uZG9fZG9faW9jdGwJCT0gcHJpc201NF9pb2N0bCwKIAkubmRvX3N0YXJ0X3htaXQJCT0gaXNscGNpX2V0aF90cmFuc21pdCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gaXNscGNpX2V0aF90eF90aW1lb3V0LAogCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IHByaXNtNTRfc2V0X21hY19hZGRyZXNzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCmluZGV4IDBjMTM4NDAuLjM4MDJjMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMKQEAgLTI0NCw2ICsyNDQsMTAgQEAKIAlORElTXzgwMjExX1BPV0VSX01PREVfRkFTVF9QU1AsCiB9OwogCitlbnVtIG5kaXNfODAyMTFfcG1raWRfY2FuZF9saXN0X2ZsYWdfYml0cyB7CisJTkRJU184MDIxMV9QTUtJRF9DQU5EX1BSRUFVVEggPSBjcHVfdG9fbGUzMigxIDw8IDApCit9OworCiBzdHJ1Y3QgbmRpc184MDIxMV9hdXRoX3JlcXVlc3QgewogCV9fbGUzMiBsZW5ndGg7CiAJdTggYnNzaWRbNl07CkBAIC0zODcsMTkgKzM5MSwxNyBAQAogc3RydWN0IG5kaXNfODAyMTFfYnNzaWRfaW5mbyB7CiAJdTggYnNzaWRbNl07CiAJdTggcG1raWRbMTZdOwotfTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBuZGlzXzgwMjExX3Bta2lkIHsKIAlfX2xlMzIgbGVuZ3RoOwogCV9fbGUzMiBic3NpZF9pbmZvX2NvdW50OwogCXN0cnVjdCBuZGlzXzgwMjExX2Jzc2lkX2luZm8gYnNzaWRfaW5mb1swXTsKLX07Cit9IF9fcGFja2VkOwogCiAvKgogICogIHByaXZhdGUgZGF0YQogICovCi0jZGVmaW5lIE5FVF9UWVBFXzExRkIJMAotCiAjZGVmaW5lIENBUF9NT0RFXzgwMjExQQkJMQogI2RlZmluZSBDQVBfTU9ERV84MDIxMUIJCTIKICNkZWZpbmUgQ0FQX01PREVfODAyMTFHCQk0CkBAIC00MTQsNiArNDE2LDcgQEAKICNkZWZpbmUgUk5ESVNfV0xBTl9BTEdfVEtJUAkoMTw8MSkKICNkZWZpbmUgUk5ESVNfV0xBTl9BTEdfQ0NNUAkoMTw8MikKIAorI2RlZmluZSBSTkRJU19XTEFOX05VTV9LRVlTCQk0CiAjZGVmaW5lIFJORElTX1dMQU5fS0VZX01HTVRfTk9ORQkwCiAjZGVmaW5lIFJORElTX1dMQU5fS0VZX01HTVRfODAyXzFYCSgxPDwwKQogI2RlZmluZSBSTkRJU19XTEFOX0tFWV9NR01UX1BTSwkJKDE8PDEpCkBAIC01MTYsNyArNTE5LDcgQEAKIAogCS8qIGVuY3J5cHRpb24gc3R1ZmYgKi8KIAlpbnQgIGVuY3JfdHhfa2V5X2luZGV4OwotCXN0cnVjdCBybmRpc193bGFuX2VuY3Jfa2V5IGVuY3Jfa2V5c1s0XTsKKwlzdHJ1Y3Qgcm5kaXNfd2xhbl9lbmNyX2tleSBlbmNyX2tleXNbUk5ESVNfV0xBTl9OVU1fS0VZU107CiAJaW50ICB3cGFfdmVyc2lvbjsKIAogCXU4IGNvbW1hbmRfYnVmZmVyW0NPTU1BTkRfQlVGRkVSX1NJWkVdOwpAQCAtMTM0Niw2ICsxMzQ5LDMyIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqZ2V0X2N1cnJlbnRfY2hhbm5lbChzdHJ1Y3QgdXNibmV0ICp1c2JkZXYsCisJCQkJCQkgICAgIHUxNiAqYmVhY29uX2ludGVydmFsKQoreworCXN0cnVjdCBybmRpc193bGFuX3ByaXZhdGUgKnByaXYgPSBnZXRfcm5kaXNfd2xhbl9wcml2KHVzYmRldik7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOworCXN0cnVjdCBuZGlzXzgwMjExX2NvbmYgY29uZmlnOworCWludCBsZW4sIHJldDsKKworCS8qIEdldCBjaGFubmVsIGFuZCBiZWFjb24gaW50ZXJ2YWwgKi8KKwlsZW4gPSBzaXplb2YoY29uZmlnKTsKKwlyZXQgPSBybmRpc19xdWVyeV9vaWQodXNiZGV2LCBPSURfODAyXzExX0NPTkZJR1VSQVRJT04sICZjb25maWcsICZsZW4pOworCW5ldGRldl9kYmcodXNiZGV2LT5uZXQsICIlcygpOiBPSURfODAyXzExX0NPTkZJR1VSQVRJT04gLT4gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBOVUxMOworCisJY2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChwcml2LT53ZGV2LndpcGh5LAorCQkJCUtIWl9UT19NSFoobGUzMl90b19jcHUoY29uZmlnLmRzX2NvbmZpZykpKTsKKwlpZiAoIWNoYW5uZWwpCisJCXJldHVybiBOVUxMOworCisJaWYgKGJlYWNvbl9pbnRlcnZhbCkKKwkJKmJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGNvbmZpZy5iZWFjb25fcGVyaW9kKTsKKwlyZXR1cm4gY2hhbm5lbDsKK30KKwogLyogaW5kZXggbXVzdCBiZSAwIC0gTiwgYXMgcGVyIE5ESVMgICovCiBzdGF0aWMgaW50IGFkZF93ZXBfa2V5KHN0cnVjdCB1c2JuZXQgKnVzYmRldiwgY29uc3QgdTggKmtleSwgaW50IGtleV9sZW4sCiAJCQkJCQkJCWludCBpbmRleCkKQEAgLTE1MzUsNiArMTU2NCw5IEBACiAJYm9vbCBpc193cGE7CiAJaW50IHJldDsKIAorCWlmIChpbmRleCA+PSBSTkRJU19XTEFOX05VTV9LRVlTKQorCQlyZXR1cm4gLUVOT0VOVDsKKwogCWlmIChwcml2LT5lbmNyX2tleXNbaW5kZXhdLmxlbiA9PSAwKQogCQlyZXR1cm4gMDsKIApAQCAtMTk3MiwxMSArMjAwNCwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpybmRpc19ic3NfaW5mb191cGRhdGUoc3RydWN0IHVzYm5ldCAqdXNiZGV2LAotCQkJCQlzdHJ1Y3QgbmRpc184MDIxMV9ic3NpZF9leCAqYnNzaWQpCitzdGF0aWMgYm9vbCBybmRpc19ic3NfaW5mb191cGRhdGUoc3RydWN0IHVzYm5ldCAqdXNiZGV2LAorCQkJCSAgc3RydWN0IG5kaXNfODAyMTFfYnNzaWRfZXggKmJzc2lkKQogewogCXN0cnVjdCBybmRpc193bGFuX3ByaXZhdGUgKnByaXYgPSBnZXRfcm5kaXNfd2xhbl9wcml2KHVzYmRldik7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAlzMzIgc2lnbmFsOwogCXU2NCB0aW1lc3RhbXA7CiAJdTE2IGNhcGFiaWxpdHk7CkBAIC0yMDE1LDkgKzIwNDgsMTIgQEAKIAljYXBhYmlsaXR5ID0gbGUxNl90b19jcHUoZml4ZWQtPmNhcGFiaWxpdGllcyk7CiAJYmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUoZml4ZWQtPmJlYWNvbl9pbnRlcnZhbCk7CiAKLQlyZXR1cm4gY2ZnODAyMTFfaW5mb3JtX2Jzcyhwcml2LT53ZGV2LndpcGh5LCBjaGFubmVsLCBic3NpZC0+bWFjLAorCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3MocHJpdi0+d2Rldi53aXBoeSwgY2hhbm5lbCwgYnNzaWQtPm1hYywKIAkJdGltZXN0YW1wLCBjYXBhYmlsaXR5LCBiZWFjb25faW50ZXJ2YWwsIGllLCBpZV9sZW4sIHNpZ25hbCwKIAkJR0ZQX0tFUk5FTCk7CisJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOworCisJcmV0dXJuIChic3MgIT0gTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmRpc184MDIxMV9ic3NpZF9leCAqbmV4dF9ic3NpZF9saXN0X2l0ZW0oCkBAIC0yNDUxLDYgKzI0ODcsOSBAQAogCiAJbmV0ZGV2X2RiZyh1c2JkZXYtPm5ldCwgIiVzKCVpKVxuIiwgX19mdW5jX18sIGtleV9pbmRleCk7CiAKKwlpZiAoa2V5X2luZGV4ID49IFJORElTX1dMQU5fTlVNX0tFWVMpCisJCXJldHVybiAtRU5PRU5UOworCiAJcHJpdi0+ZW5jcl90eF9rZXlfaW5kZXggPSBrZXlfaW5kZXg7CiAKIAlpZiAoaXNfd3BhX2tleShwcml2LCBrZXlfaW5kZXgpKQpAQCAtMjYzOSwxMiArMjY3OCwxMiBAQAogewogCXN0cnVjdCBybmRpc193bGFuX3ByaXZhdGUgKnByaXYgPSBnZXRfcm5kaXNfd2xhbl9wcml2KHVzYmRldik7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOwotCXN0cnVjdCBuZGlzXzgwMjExX2NvbmYgY29uZmlnOwogCXN0cnVjdCBuZGlzXzgwMjExX3NzaWQgc3NpZDsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAJczMyIHNpZ25hbDsKIAl1NjQgdGltZXN0YW1wOwogCXUxNiBjYXBhYmlsaXR5OwotCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGJlYWNvbl9pbnRlcnZhbCA9IDA7CiAJX19sZTMyIHJzc2k7CiAJdTggaWVfYnVmWzM0XTsKIAlpbnQgbGVuLCByZXQsIGllX2xlbjsKQEAgLTI2NjksMjIgKzI3MDgsMTAgQEAKIAl9CiAKIAkvKiBHZXQgY2hhbm5lbCBhbmQgYmVhY29uIGludGVydmFsICovCi0JbGVuID0gc2l6ZW9mKGNvbmZpZyk7Ci0JcmV0ID0gcm5kaXNfcXVlcnlfb2lkKHVzYmRldiwgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OLCAmY29uZmlnLCAmbGVuKTsKLQluZXRkZXZfZGJnKHVzYmRldi0+bmV0LCAiJXMoKTogT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIC0+ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCWlmIChyZXQgPj0gMCkgewotCQliZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShjb25maWcuYmVhY29uX3BlcmlvZCk7Ci0JCWNoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwocHJpdi0+d2Rldi53aXBoeSwKLQkJCQlLSFpfVE9fTUhaKGxlMzJfdG9fY3B1KGNvbmZpZy5kc19jb25maWcpKSk7Ci0JCWlmICghY2hhbm5lbCkgewotCQkJbmV0ZGV2X3dhcm4odXNiZGV2LT5uZXQsICIlcygpOiBjb3VsZCBub3QgZ2V0IGNoYW5uZWwuIgotCQkJCQkJICJcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSB7Ci0JCW5ldGRldl93YXJuKHVzYmRldi0+bmV0LCAiJXMoKTogY291bGQgbm90IGdldCBjb25maWd1cmF0aW9uLlxuIiwKLQkJCQkJIF9fZnVuY19fKTsKKwljaGFubmVsID0gZ2V0X2N1cnJlbnRfY2hhbm5lbCh1c2JkZXYsICZiZWFjb25faW50ZXJ2YWwpOworCWlmICghY2hhbm5lbCkgeworCQluZXRkZXZfd2Fybih1c2JkZXYtPm5ldCwgIiVzKCk6IGNvdWxkIG5vdCBnZXQgY2hhbm5lbC5cbiIsCisJCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjcxNCw5ICsyNzQxLDEwIEBACiAJCWJzc2lkLCAodTMyKXRpbWVzdGFtcCwgY2FwYWJpbGl0eSwgYmVhY29uX2ludGVydmFsLCBpZV9sZW4sCiAJCXNzaWQuZXNzaWQsIHNpZ25hbCk7CiAKLQljZmc4MDIxMV9pbmZvcm1fYnNzKHByaXYtPndkZXYud2lwaHksIGNoYW5uZWwsIGJzc2lkLAorCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3MocHJpdi0+d2Rldi53aXBoeSwgY2hhbm5lbCwgYnNzaWQsCiAJCXRpbWVzdGFtcCwgY2FwYWJpbGl0eSwgYmVhY29uX2ludGVydmFsLCBpZV9idWYsIGllX2xlbiwKIAkJc2lnbmFsLCBHRlBfS0VSTkVMKTsKKwljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CiB9CiAKIC8qCkBAIC0yODI4LDggKzI4NTYsOSBAQAogCQkJCQkJcmVxX2llX2xlbiwgcmVzcF9pZSwKIAkJCQkJCXJlc3BfaWVfbGVuLCAwLCBHRlBfS0VSTkVMKTsKIAkJZWxzZQotCQkJY2ZnODAyMTFfcm9hbWVkKHVzYmRldi0+bmV0LCBOVUxMLCBic3NpZCwKLQkJCQkJcmVxX2llLCByZXFfaWVfbGVuLAorCQkJY2ZnODAyMTFfcm9hbWVkKHVzYmRldi0+bmV0LAorCQkJCQlnZXRfY3VycmVudF9jaGFubmVsKHVzYmRldiwgTlVMTCksCisJCQkJCWJzc2lkLCByZXFfaWUsIHJlcV9pZV9sZW4sCiAJCQkJCXJlc3BfaWUsIHJlc3BfaWVfbGVuLCBHRlBfS0VSTkVMKTsKIAl9IGVsc2UgaWYgKHByaXYtPmluZnJhX21vZGUgPT0gTkRJU184MDIxMV9JTkZSQV9BREhPQykKIAkJY2ZnODAyMTFfaWJzc19qb2luZWQodXNiZGV2LT5uZXQsIGJzc2lkLCBHRlBfS0VSTkVMKTsKQEAgLTI5OTUsMjUgKzMwMjQsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbGUzMl90b19jcHUoY2FuZF9saXN0LT5udW1fY2FuZGlkYXRlcyk7IGkrKykgewogCQlzdHJ1Y3QgbmRpc184MDIxMV9wbWtpZF9jYW5kaWRhdGUgKmNhbmQgPQogCQkJCQkJJmNhbmRfbGlzdC0+Y2FuZGlkYXRlX2xpc3RbaV07CisJCWJvb2wgcHJlYXV0aCA9ICEhKGNhbmQtPmZsYWdzICYgTkRJU184MDIxMV9QTUtJRF9DQU5EX1BSRUFVVEgpOwogCi0JCW5ldGRldl9kYmcodXNiZGV2LT5uZXQsICJjYW5kWyVpXTogZmxhZ3M6IDB4JTA4eCwgYnNzaWQ6ICVwTVxuIiwKLQkJCSAgIGksIGxlMzJfdG9fY3B1KGNhbmQtPmZsYWdzKSwgY2FuZC0+YnNzaWQpOworCQluZXRkZXZfZGJnKHVzYmRldi0+bmV0LCAiY2FuZFslaV06IGZsYWdzOiAweCUwOHgsIHByZWF1dGg6ICVkLCBic3NpZDogJXBNXG4iLAorCQkJICAgaSwgbGUzMl90b19jcHUoY2FuZC0+ZmxhZ3MpLCBwcmVhdXRoLCBjYW5kLT5ic3NpZCk7CiAKLSNpZiAwCi0JCXN0cnVjdCBpd19wbWtpZF9jYW5kIHBjYW5kOwotCQl1bmlvbiBpd3JlcV9kYXRhIHdycXU7Ci0KLQkJbWVtc2V0KCZwY2FuZCwgMCwgc2l6ZW9mKHBjYW5kKSk7Ci0JCWlmIChsZTMyX3RvX2NwdShjYW5kLT5mbGFncykgJiAweDAxKQotCQkJcGNhbmQuZmxhZ3MgfD0gSVdfUE1LSURfQ0FORF9QUkVBVVRIOwotCQlwY2FuZC5pbmRleCA9IGk7Ci0JCW1lbWNweShwY2FuZC5ic3NpZC5zYV9kYXRhLCBjYW5kLT5ic3NpZCwgRVRIX0FMRU4pOwotCi0JCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLQkJd3JxdS5kYXRhLmxlbmd0aCA9IHNpemVvZihwY2FuZCk7Ci0JCXdpcmVsZXNzX3NlbmRfZXZlbnQodXNiZGV2LT5uZXQsIElXRVZQTUtJRENBTkQsICZ3cnF1LAotCQkJCQkJCQkodTggKikmcGNhbmQpOwotI2VuZGlmCisJCWNmZzgwMjExX3Bta3NhX2NhbmRpZGF0ZV9ub3RpZnkodXNiZGV2LT5uZXQsIGksIGNhbmQtPmJzc2lkLAorCQkJCQkJcHJlYXV0aCwgR0ZQX0FUT01JQyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMKaW5kZXggMWJhMDc5ZC4uZTVkZjM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYwpAQCAtMTIwMyw4ICsxMjAzLDEwIEBACiAJCQkgICAhKGZpbHRlcl9mbGFncyAmIEZJRl9DT05UUk9MKSk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9QU1BPTEwsCiAJCQkgICAhKGZpbHRlcl9mbGFncyAmIEZJRl9QU1BPTEwpKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgUlhfRklMVEVSX0NGR19EUk9QX0JBLCAxKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgUlhfRklMVEVSX0NGR19EUk9QX0JBUiwgMCk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9CQSwKKwkJCSAgICEoZmlsdGVyX2ZsYWdzICYgRklGX0NPTlRST0wpKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgUlhfRklMVEVSX0NGR19EUk9QX0JBUiwKKwkJCSAgICEoZmlsdGVyX2ZsYWdzICYgRklGX0NPTlRST0wpKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgUlhfRklMVEVSX0NGR19EUk9QX0NOVEwsCiAJCQkgICAhKGZpbHRlcl9mbGFncyAmIEZJRl9DT05UUk9MKSk7CiAJcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgUlhfRklMVEVSX0NGRywgcmVnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9kZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9kZXYuYwppbmRleCAwMDgyMDE1Li4yZjE0YTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAvZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwL2Rldi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VlcHJvbV85M2N4Ni5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCiAjaW5jbHVkZSAicnRsODE4MC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3L2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3L2Rldi5jCmluZGV4IDI0ODczYjUuLjRhNzhmOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny9kZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODcvZGV2LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZWVwcm9tXzkzY3g2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJydGw4MTg3LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL0tjb25maWcKaW5kZXggNDVlMTQ3Ni4uZDZjNDJlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvS2NvbmZpZwpAQCAtMTIsNyArMTIsNyBAQAogCiBjb25maWcgUlRMODE5MlNFCiAJdHJpc3RhdGUgIlJlYWx0ZWsgUlRMODE5MlNFL1JUTDgxOTFTRSBQQ0llIFdpcmVsZXNzIE5ldHdvcmsgQWRhcHRlciIKLQlkZXBlbmRzIG9uIE1BQzgwMjExICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgRVhQRVJJTUVOVEFMICYmIFBDSQogCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgUlRMV0lGSQogCS0tLWhlbHAtLS0KQEAgLTIzLDcgKzIzLDcgQEAKIAogY29uZmlnIFJUTDgxOTJERQogCXRyaXN0YXRlICJSZWFsdGVrIFJUTDgxOTJERS9SVEw4MTg4REUgUENJZSBXaXJlbGVzcyBOZXR3b3JrIEFkYXB0ZXIiCi0JZGVwZW5kcyBvbiBNQUM4MDIxMSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIE1BQzgwMjExICYmIEVYUEVSSU1FTlRBTCAmJiBQQ0kKIAlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFJUTFdJRkkKIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5jCmluZGV4IGQ0ZmRkMmEuLmExM2VjZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIndpZmkuaCIKICNpbmNsdWRlICJyYy5oIgogI2luY2x1ZGUgImJhc2UuaCIKQEAgLTM0NCw5ICszNDUsOSBAQAogCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHJ0bGVmdXNlLT5kZXZfYWRkcikpIHsKIAkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIHJ0bGVmdXNlLT5kZXZfYWRkcik7CiAJfSBlbHNlIHsKLQkJdTggcnRsbWFjW10gPSB7IDB4MDAsIDB4ZTAsIDB4NGMsIDB4ODEsIDB4OTIsIDB4MDAgfTsKLQkJZ2V0X3JhbmRvbV9ieXRlcygocnRsbWFjICsgKEVUSF9BTEVOIC0gMSkpLCAxKTsKLQkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIHJ0bG1hYyk7CisJCXU4IHJ0bG1hYzFbXSA9IHsgMHgwMCwgMHhlMCwgMHg0YywgMHg4MSwgMHg5MiwgMHgwMCB9OworCQlnZXRfcmFuZG9tX2J5dGVzKChydGxtYWMxICsgKEVUSF9BTEVOIC0gMSkpLCAxKTsKKwkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIHJ0bG1hYzEpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9iYXNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaAppbmRleCA0YWU5MDU5Li5mNjZiNTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaApAQCAtNzYsNyArNzYsNyBAQAogCVNFVF9CSVRTX1RPX0xFXzJCWVRFKF9oZHIsIDgsIDEsIF92YWwpCiAKICNkZWZpbmUgU0VUXzgwMjExX1BTX1BPTExfQUlEKF9oZHIsIF92YWwpCQlcCi0JKCoodTE2ICopKCh1OCAqKShfaGRyKSArIDIpID0gbGUxNl90b19jcHUoX3ZhbCkpCisJKCoodTE2ICopKCh1OCAqKShfaGRyKSArIDIpID0gX3ZhbCkKICNkZWZpbmUgU0VUXzgwMjExX1BTX1BPTExfQlNTSUQoX2hkciwgX3ZhbCkJCVwKIAltZW1jcHkoKCh1OCAqKShfaGRyKSkgKyA0LCAodTggKikoX3ZhbCksIEVUSF9BTEVOKQogI2RlZmluZSBTRVRfODAyMTFfUFNfUE9MTF9UQShfaGRyLCBfdmFsKQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jYW0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvY2FtLmMKaW5kZXggN2JhYmI2YS4uZGMzNmQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jYW0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NhbS5jCkBAIC0yOSw2ICsyOSw3IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgIndpZmkuaCIKICNpbmNsdWRlICJjYW0uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9lZnVzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9lZnVzZS5jCmluZGV4IDNmYzIxZjYuLmVkMTA1OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvZWZ1c2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2VmdXNlLmMKQEAgLTI3LDYgKzI3LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ3aWZpLmgiCiAjaW5jbHVkZSAiZWZ1c2UuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMKaW5kZXggMTc3YThlNi4uOTFmMDUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jCkBAIC0yNyw2ICsyNyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgIndpZmkuaCIKICNpbmNsdWRlICJwY2kuaCIKQEAgLTc3OSw2ICs3ODAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIGludGEgPSAwOwogCXUzMiBpbnRiID0gMDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfSEFORExFRDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOwogCkBAIC03ODYsOCArNzg4LDEwIEBACiAJcnRscHJpdi0+Y2ZnLT5vcHMtPmludGVycnVwdF9yZWNvZ25pemVkKGh3LCAmaW50YSwgJmludGIpOwogCiAJLypTaGFyZWQgSVJRIG9yIEhXIGRpc2FwcGFyZWQgKi8KLQlpZiAoIWludGEgfHwgaW50YSA9PSAweGZmZmYpCisJaWYgKCFpbnRhIHx8IGludGEgPT0gMHhmZmZmKSB7CisJCXJldCA9IElSUV9OT05FOwogCQlnb3RvIGRvbmU7CisJfQogCiAJLyo8MT4gYmVhY29uIHJlbGF0ZWQgKi8KIAlpZiAoaW50YSAmIHJ0bHByaXYtPmNmZy0+bWFwc1tSVExfSU1SX1RCRE9LXSkgewpAQCAtODg5LDEyICs4OTMsOSBAQAogCWlmIChydGxwcml2LT5ydGxoYWwuZWFybHltb2RlX2VuYWJsZSkKIAkJdGFza2xldF9zY2hlZHVsZSgmcnRscHJpdi0+d29ya3MuaXJxX3Rhc2tsZXQpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KIGRvbmU6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX3J0bF9wY2lfaXJxX3Rhc2tsZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BzLmMKaW5kZXggMGIwNGIyZS4uNTVjOGU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcHMuYwpAQCAtMjcsNiArMjcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgIndpZmkuaCIKICNpbmNsdWRlICJiYXNlLmgiCiAjaW5jbHVkZSAicHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZG1fY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2RtX2NvbW1vbi5jCmluZGV4IGEwMDc3NGUuLjcyYTk4Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZG1fY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9kbV9jb21tb24uYwpAQCAtMjcsNiArMjcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRtX2NvbW1vbi5oIgogI2luY2x1ZGUgInBoeV9jb21tb24uaCIKICNpbmNsdWRlICIuLi9wY2kuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5jCmluZGV4IDQ5YTA2NGIuLmZhMzkzZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYwpAQCAtMzAsNiArMzAsNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICIuLi93aWZpLmgiCiAjaW5jbHVkZSAiLi4vcGNpLmgiCiAjaW5jbHVkZSAiLi4vYmFzZS5oIgpAQCAtNzIsNiArNzMsMzQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bF9ibG9ja19md193cml0ZU4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNvbnN0IHU4ICpidWZmZXIsCisJCQkJdTMyIHNpemUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBibG9ja1NpemUgPSBSRUFMVEVLX1VTQl9WRU5RVF9NQVhfQlVGX1NJWkUgLSAyMDsKKwl1OCAqYnVmZmVyUHRyID0gKHU4ICopIGJ1ZmZlcjsKKwl1MzIgaSwgb2Zmc2V0LCBibG9ja0NvdW50LCByZW1haW5TaXplOworCisJYmxvY2tDb3VudCA9IHNpemUgLyBibG9ja1NpemU7CisJcmVtYWluU2l6ZSA9IHNpemUgJSBibG9ja1NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxvY2tDb3VudDsgaSsrKSB7CisJCW9mZnNldCA9IGkgKiBibG9ja1NpemU7CisJCXJ0bHByaXYtPmlvLndyaXRlTl9zeW5jKHJ0bHByaXYsCisJCQkJCShGV184MTkyQ19TVEFSVF9BRERSRVNTICsgb2Zmc2V0KSwKKwkJCQkJKHZvaWQgKikoYnVmZmVyUHRyICsgb2Zmc2V0KSwKKwkJCQkJYmxvY2tTaXplKTsKKwl9CisKKwlpZiAocmVtYWluU2l6ZSkgeworCQlvZmZzZXQgPSBibG9ja0NvdW50ICogYmxvY2tTaXplOworCQlydGxwcml2LT5pby53cml0ZU5fc3luYyhydGxwcml2LAorCQkJCQkoRldfODE5MkNfU1RBUlRfQUREUkVTUyArIG9mZnNldCksCisJCQkJCSh2b2lkICopKGJ1ZmZlclB0ciArIG9mZnNldCksCisJCQkJCXJlbWFpblNpemUpOworCX0KK30KKwogc3RhdGljIHZvaWQgX3J0bDkyY19md19ibG9ja193cml0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgICBjb25zdCB1OCAqYnVmZmVyLCB1MzIgc2l6ZSkKIHsKQEAgLTgwLDIzICsxMDksMzAgQEAKIAl1OCAqYnVmZmVyUHRyID0gKHU4ICopIGJ1ZmZlcjsKIAl1MzIgKnB1NEJ5dGVQdHIgPSAodTMyICopIGJ1ZmZlcjsKIAl1MzIgaSwgb2Zmc2V0LCBibG9ja0NvdW50LCByZW1haW5TaXplOworCXUzMiBkYXRhOwogCisJaWYgKHJ0bHByaXYtPmlvLndyaXRlTl9zeW5jKSB7CisJCXJ0bF9ibG9ja19md193cml0ZU4oaHcsIGJ1ZmZlciwgc2l6ZSk7CisJCXJldHVybjsKKwl9CiAJYmxvY2tDb3VudCA9IHNpemUgLyBibG9ja1NpemU7CiAJcmVtYWluU2l6ZSA9IHNpemUgJSBibG9ja1NpemU7CisJaWYgKHJlbWFpblNpemUpIHsKKwkJLyogdGhlIGxhc3Qgd29yZCBpcyA8IDQgYnl0ZXMgLSBwYWQgaXQgd2l0aCB6ZXJvcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgNCAtIHJlbWFpblNpemU7IGkrKykKKwkJCSooYnVmZmVyUHRyICsgc2l6ZSArIGkpID0gMDsKKwkJYmxvY2tDb3VudCsrOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBibG9ja0NvdW50OyBpKyspIHsKIAkJb2Zmc2V0ID0gaSAqIGJsb2NrU2l6ZTsKKwkJLyogZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm1zLCB0aGUgZmlybXdhcmUgZGF0YSBuZWVkIHRvIGJlIGJ5dGUKKwkJICogc3dhcHBlZCBhcyBpdCB3YXMgcmVhZCBhcyBhIGJ5dGUgc3RyaW5nIGFuZCB3aWxsIGJlIHdyaXR0ZW4KKwkJICogYXMgMzItYml0IGR3b3JkcyBhbmQgYnl0ZSBzd2FwcGVkIHdoZW4gd3JpdHRlbgorCQkgKi8KKwkJZGF0YSA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKHB1NEJ5dGVQdHIgKyBpKSk7CiAJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAoRldfODE5MkNfU1RBUlRfQUREUkVTUyArIG9mZnNldCksCi0JCQkJKihwdTRCeXRlUHRyICsgaSkpOwotCX0KLQotCWlmIChyZW1haW5TaXplKSB7Ci0JCW9mZnNldCA9IGJsb2NrQ291bnQgKiBibG9ja1NpemU7Ci0JCWJ1ZmZlclB0ciArPSBvZmZzZXQ7Ci0JCWZvciAoaSA9IDA7IGkgPCByZW1haW5TaXplOyBpKyspIHsKLQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChGV184MTkyQ19TVEFSVF9BRERSRVNTICsKLQkJCQkJCSBvZmZzZXQgKyBpKSwgKihidWZmZXJQdHIgKyBpKSk7Ci0JCX0KKwkJCQlkYXRhKTsKIAl9CiB9CiAKQEAgLTIzNyw4ICsyNzMsOSBAQAogCWlmIChJU19GV19IRUFERVJfRVhJU1QocGZ3aGVhZGVyKSkgewogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0ZXLCBEQkdfRE1FU0csCiAJCQkgKCJGaXJtd2FyZSBWZXJzaW9uKCVkKSwgU2lnbmF0dXJlKCUjeCksU2l6ZSglZClcbiIsCi0JCQkgIHBmd2hlYWRlci0+dmVyc2lvbiwgcGZ3aGVhZGVyLT5zaWduYXR1cmUsCi0JCQkgICh1aW50KXNpemVvZihzdHJ1Y3QgcnRsOTJjX2Zpcm13YXJlX2hlYWRlcikpKTsKKwkJCSBsZTE2X3RvX2NwdShwZndoZWFkZXItPnZlcnNpb24pLAorCQkJIGxlMTZfdG9fY3B1KHBmd2hlYWRlci0+c2lnbmF0dXJlKSwKKwkJCSAodWludClzaXplb2Yoc3RydWN0IHJ0bDkyY19maXJtd2FyZV9oZWFkZXIpKSk7CiAKIAkJcGZ3ZGF0YSA9IHBmd2RhdGEgKyBzaXplb2Yoc3RydWN0IHJ0bDkyY19maXJtd2FyZV9oZWFkZXIpOwogCQlmd3NpemUgPSBmd3NpemUgLSBzaXplb2Yoc3RydWN0IHJ0bDkyY19maXJtd2FyZV9oZWFkZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmgKaW5kZXggM2Q1ODIzYy4uY2VjNWEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5oCkBAIC0zMiwzMiArMzIsMzIgQEAKIAogI2RlZmluZSBGV184MTkyQ19TSVpFCQkJCTB4MzAwMAogI2RlZmluZSBGV184MTkyQ19TVEFSVF9BRERSRVNTCQkJMHgxMDAwCi0jZGVmaW5lIEZXXzgxOTJDX0VORF9BRERSRVNTCQkJMHgzRkZGCisjZGVmaW5lIEZXXzgxOTJDX0VORF9BRERSRVNTCQkJMHgxRkZGCiAjZGVmaW5lIEZXXzgxOTJDX1BBR0VfU0laRQkJCTQwOTYKICNkZWZpbmUgRldfODE5MkNfUE9MTElOR19ERUxBWQkJCTUKICNkZWZpbmUgRldfODE5MkNfUE9MTElOR19USU1FT1VUX0NPVU5UCQkxMDAKIAogI2RlZmluZSBJU19GV19IRUFERVJfRVhJU1QoX3Bmd2hkcikJXAotCSgoX3Bmd2hkci0+c2lnbmF0dXJlJjB4RkZGMCkgPT0gMHg5MkMwIHx8XAotCShfcGZ3aGRyLT5zaWduYXR1cmUmMHhGRkYwKSA9PSAweDg4QzApCisJKChsZTE2X3RvX2NwdShfcGZ3aGRyLT5zaWduYXR1cmUpJjB4RkZGMCkgPT0gMHg5MkMwIHx8XAorCShsZTE2X3RvX2NwdShfcGZ3aGRyLT5zaWduYXR1cmUpJjB4RkZGMCkgPT0gMHg4OEMwKQogCiBzdHJ1Y3QgcnRsOTJjX2Zpcm13YXJlX2hlYWRlciB7Ci0JdTE2IHNpZ25hdHVyZTsKKwlfX2xlMTYgc2lnbmF0dXJlOwogCXU4IGNhdGVnb3J5OwogCXU4IGZ1bmN0aW9uOwotCXUxNiB2ZXJzaW9uOworCV9fbGUxNiB2ZXJzaW9uOwogCXU4IHN1YnZlcnNpb247CiAJdTggcnN2ZDE7CiAJdTggbW9udGg7CiAJdTggZGF0ZTsKIAl1OCBob3VyOwogCXU4IG1pbnV0ZTsKLQl1MTYgcmFtY29kZVNpemU7Ci0JdTE2IHJzdmQyOwotCXUzMiBzdm5pbmRleDsKLQl1MzIgcnN2ZDM7Ci0JdTMyIHJzdmQ0OwotCXUzMiByc3ZkNTsKKwlfX2xlMTYgcmFtY29kZVNpemU7CisJX19sZTE2IHJzdmQyOworCV9fbGUzMiBzdm5pbmRleDsKKwlfX2xlMzIgcnN2ZDM7CisJX19sZTMyIHJzdmQ0OworCV9fbGUzMiByc3ZkNTsKIH07CiAKIGVudW0gcnRsODE5MmNfaDJjX2NtZCB7CkBAIC05NCw1ICs5NCw2IEBACiB2b2lkIHJ0bDkyY19zZXRfZndfcHdybW9kZV9jbWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IG1vZGUpOwogdm9pZCBydGw5MmNfc2V0X2Z3X3JzdmRwYWdlcGt0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGJfZGxfZmluaXNoZWQpOwogdm9pZCBydGw5MmNfc2V0X2Z3X2pvaW5ic3NfcmVwb3J0X2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggbXN0YXR1cyk7Cit2b2lkIHVzYl93cml0ZU5fYXN5bmMoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkciwgdm9pZCAqZGF0YSwgdTE2IGxlbik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL21haW4uYwppbmRleCAyZjYyNGZjLi42MDVmZjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL21haW4uYwpAQCAtMjcsNiArMjcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIi4uL3dpZmkuaCIKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL3BoeV9jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvcGh5X2NvbW1vbi5jCmluZGV4IDNiMTE2NDIuLjFmMDc1NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvcGh5X2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvcGh5X2NvbW1vbi5jCkBAIC0yNyw2ICsyNyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiLi4vd2lmaS5oIgogI2luY2x1ZGUgIi4uL3J0bDgxOTJjZS9yZWcuaCIKICNpbmNsdWRlICIuLi9ydGw4MTkyY2UvZGVmLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2Uvc3cuYwppbmRleCBhNDg0MDRjLi5mMmFhMzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3N3LmMKQEAgLTI4LDYgKzI4LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL3dpZmkuaCIKICNpbmNsdWRlICIuLi9jb3JlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYwppbmRleCA4MTRjMDVkLi40ZWQ5NzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMKQEAgLTQ5OCw3ICs0OTgsNyBAQAogCX0KIAlSVF9QUklOVF9EQVRBKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsICgiTUFQXG4iKSwKIAkJICAgICAgaHdpbmZvLCBIV1NFVF9NQVhfU0laRSk7Ci0JZWVwcm9tX2lkID0gKigodTE2ICopJmh3aW5mb1swXSk7CisJZWVwcm9tX2lkID0gbGUxNl90b19jcHUoKigoX19sZTE2ICopJmh3aW5mb1swXSkpOwogCWlmIChlZXByb21faWQgIT0gUlRMODE5MF9FRVBST01fSUQpIHsKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKIAkJCSAoIkVFUFJPTSBJRCglI3gpIGlzIGludmFsaWQhIVxuIiwgZWVwcm9tX2lkKSk7CkBAIC01MTYsMTMgKzUxNiwxNCBAQAogCXByX2luZm8oIk1BQyBhZGRyZXNzOiAlcE1cbiIsIHJ0bGVmdXNlLT5kZXZfYWRkcik7CiAJX3J0bDkyY3VfcmVhZF90eHBvd2VyX2luZm9fZnJvbV9od3BnKGh3LAogCQkJCQkgICBydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcsIGh3aW5mbyk7Ci0JcnRsZWZ1c2UtPmVlcHJvbV92aWQgPSAqKHUxNiAqKSZod2luZm9bRUVQUk9NX1ZJRF07Ci0JcnRsZWZ1c2UtPmVlcHJvbV9kaWQgPSAqKHUxNiAqKSZod2luZm9bRUVQUk9NX0RJRF07CisJcnRsZWZ1c2UtPmVlcHJvbV92aWQgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSZod2luZm9bRUVQUk9NX1ZJRF0pOworCXJ0bGVmdXNlLT5lZXByb21fZGlkID0gbGUxNl90b19jcHUoKihfX2xlMTYgKikmaHdpbmZvW0VFUFJPTV9ESURdKTsKIAlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19ETUVTRywKIAkJICgiIFZJRCA9IDB4JTAyeCBQSUQgPSAweCUwMnhcbiIsCiAJCSBydGxlZnVzZS0+ZWVwcm9tX3ZpZCwgcnRsZWZ1c2UtPmVlcHJvbV9kaWQpKTsKIAlydGxlZnVzZS0+ZWVwcm9tX2NoYW5uZWxwbGFuID0gKih1OCAqKSZod2luZm9bRUVQUk9NX0NIQU5ORUxQTEFOXTsKLQlydGxlZnVzZS0+ZWVwcm9tX3ZlcnNpb24gPSAqKHUxNiAqKSZod2luZm9bRUVQUk9NX1ZFUlNJT05dOworCXJ0bGVmdXNlLT5lZXByb21fdmVyc2lvbiA9CisJCQkgbGUxNl90b19jcHUoKihfX2xlMTYgKikmaHdpbmZvW0VFUFJPTV9WRVJTSU9OXSk7CiAJcnRsZWZ1c2UtPnR4cHdyX2Zyb21lcHJvbSA9IHRydWU7CiAJcnRsZWZ1c2UtPmVlcHJvbV9vZW1pZCA9ICoodTggKikmaHdpbmZvW0VFUFJPTV9DVVNUT01FUl9JRF07CiAJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbWFjLmMKaW5kZXggMDYwYTA2Zi4uOWUwYzhmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbWFjLmMKQEAgLTg0LDYgKzg0LDcgQEAKIAkJfQogCX0KIAlydGxoYWwtPnZlcnNpb24gID0gKGVudW0gdmVyc2lvbl84MTkyYyljaGlwX3ZlcnNpb247CisJcHJfaW5mbygicnRsODE5MmN1OiBDaGlwIHZlcnNpb24gMHgleFxuIiwgY2hpcF92ZXJzaW9uKTsKIAlzd2l0Y2ggKHJ0bGhhbC0+dmVyc2lvbikgewogCWNhc2UgVkVSU0lPTl9OT1JNQUxfVFNNQ19DSElQXzkyQ18xVDJSOgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jCmluZGV4IGZlZWQxZWQuLjk0YTNlMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgImxlZC5oIgogI2luY2x1ZGUgImh3LmgiCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBNT0RVTEVfQVVUSE9SKCJHZW9yZ2lhCQk8Z2VvcmdpYUByZWFsdGVrLmNvbT4iKTsKIE1PRFVMRV9BVVRIT1IoIlppdiBIdWFuZwk8eml2X2h1YW5nQHJlYWx0ZWsuY29tPiIpOwpAQCAtMjc0LDYgKzI3NSw4IEBACiAJe1JUTF9VU0JfREVWSUNFKFVTQl9WRU5ERVJfSURfUkVBTFRFSywgMHg4MTkxLCBydGw5MmN1X2hhbF9jZmcpfSwKIAogCS8qKioqKiogODE4OENVICoqKioqKioqLworCS8qIFJUTDgxODhDVFYgKi8KKwl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDAxOGEsIHJ0bDkyY3VfaGFsX2NmZyl9LAogCS8qIDgxODhDRS1WQVUgVVNCIG1pbkNhcmQgKi8KIAl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDgxNzAsIHJ0bDkyY3VfaGFsX2NmZyl9LAogCS8qIDgxODhjdSAxKjEgZG9uZ2xlICovCkBAIC0yOTAsMTQgKzI5MywxNCBAQAogCXtSVExfVVNCX0RFVklDRShVU0JfVkVOREVSX0lEX1JFQUxURUssIDB4ODE3ZSwgcnRsOTJjdV9oYWxfY2ZnKX0sCiAJLyogODE4OFJVIGluIEFsZmEgQVdVUzAzNk5IUiAqLwogCXtSVExfVVNCX0RFVklDRShVU0JfVkVOREVSX0lEX1JFQUxURUssIDB4ODE3ZiwgcnRsOTJjdV9oYWxfY2ZnKX0sCisJLyogUlRMODE4OENVUy1WTCAqLworCXtSVExfVVNCX0RFVklDRShVU0JfVkVOREVSX0lEX1JFQUxURUssIDB4ODE4YSwgcnRsOTJjdV9oYWxfY2ZnKX0sCiAJLyogODE4OCBDb21ibyBmb3IgQkM0ICovCiAJe1JUTF9VU0JfREVWSUNFKFVTQl9WRU5ERVJfSURfUkVBTFRFSywgMHg4NzU0LCBydGw5MmN1X2hhbF9jZmcpfSwKIAogCS8qKioqKiogODE5MkNVICoqKioqKioqLwotCS8qIDgxOTFjdSAxKjIgKi8KLQl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDgxNzcsIHJ0bDkyY3VfaGFsX2NmZyl9LAogCS8qIDgxOTJjdSAyKjIgKi8KLQl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDgxN2IsIHJ0bDkyY3VfaGFsX2NmZyl9LAorCXtSVExfVVNCX0RFVklDRShVU0JfVkVOREVSX0lEX1JFQUxURUssIDB4ODE3OCwgcnRsOTJjdV9oYWxfY2ZnKX0sCiAJLyogODE5MkNFLVZBVSBVU0IgbWluQ2FyZCAqLwogCXtSVExfVVNCX0RFVklDRShVU0JfVkVOREVSX0lEX1JFQUxURUssIDB4ODE3YywgcnRsOTJjdV9oYWxfY2ZnKX0sCiAKQEAgLTMwOCwxMyArMzExLDE3IEBACiAJe1JUTF9VU0JfREVWSUNFKDB4MDdiOCwgMHg4MTg4LCBydGw5MmN1X2hhbF9jZmcpfSwgLypBYm9jb20gLSBBYm9jb20qLwogCXtSVExfVVNCX0RFVklDRSgweDA3YjgsIDB4ODE4OSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qRnVuYWkgLSBBYm9jb20qLwogCXtSVExfVVNCX0RFVklDRSgweDA4NDYsIDB4OTA0MSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qTmV0R2VhciBXTkExMDAwTSovCi0Je1JUTF9VU0JfREVWSUNFKDB4MERmNiwgMHgwMDUyLCBydGw5MmN1X2hhbF9jZmcpfSwgLypTaXRlY29tIC0gRWRpbWF4Ki8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwZGY2LCAweDAwNTIsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlNpdGVjb20gLSBFZGltYXgqLworCXtSVExfVVNCX0RFVklDRSgweDBkZjYsIDB4MDA1YywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qU2l0ZWNvbSAtIEVkaW1heCovCiAJe1JUTF9VU0JfREVWSUNFKDB4MGViMCwgMHg5MDcxLCBydGw5MmN1X2hhbF9jZmcpfSwgLypOTyBCcmFuZCAtIEV0b3AqLwogCS8qIEhQIC0gTGl0ZS1PbiAsODE4OENVUyBTbGltIENvbWJvICovCiAJe1JUTF9VU0JfREVWSUNFKDB4MTAzYywgMHgxNjI5LCBydGw5MmN1X2hhbF9jZmcpfSwKIAl7UlRMX1VTQl9ERVZJQ0UoMHgxM2QzLCAweDMzNTcsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKiBBenVyZVdhdmUgKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMzMDgsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkQtTGluayAtIEFscGhhKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgyMDE5LCAweDQ5MDIsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlBsYW5leCAtIEV0b3AqLwogCXtSVExfVVNCX0RFVklDRSgweDIwMTksIDB4YWIyYSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qUGxhbmV4IC0gQWJvY29tKi8KKwkvKlNXLVdGMDItQUQxNSAtQWJvY29tKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgyMDE5LCAweGFiMmUsIHJ0bDkyY3VfaGFsX2NmZyl9LAogCXtSVExfVVNCX0RFVklDRSgweDIwMTksIDB4ZWQxNywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qUENJIC0gRWRpbWF4Ki8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgyMGY0LCAweDY0OGIsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlRSRU5EbmV0IC0gQ2FtZW8qLwogCXtSVExfVVNCX0RFVklDRSgweDczOTIsIDB4NzgxMSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qRWRpbWF4IC0gRWRpbWF4Ki8KQEAgLTMyNSwxNCArMzMyLDM2IEBACiAJe1JUTF9VU0JfREVWSUNFKDB4NDg1NSwgMHgwMDkxLCBydGw5MmN1X2hhbF9jZmcpfSwgLyogTmV0d2VlTi1GZWl4dW4gKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHg5ODQ2LCAweDkwNDEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKiBOZXRnZWFyIENhbWVvICovCiAKKwkvKioqKioqIDgxODggUlUgKioqKioqKiovCisJLyogTmV0Y29yZSAqLworCXtSVExfVVNCX0RFVklDRShVU0JfVkVOREVSX0lEX1JFQUxURUssIDB4MzE3ZiwgcnRsOTJjdV9oYWxfY2ZnKX0sCisKKwkvKioqKioqIDgxODhDVVMgU2xpbSBTb2xvKioqKioqKiovCisJe1JUTF9VU0JfREVWSUNFKDB4MDRmMiwgMHhhZmY3LCBydGw5MmN1X2hhbF9jZmcpfSwgLypYYXZpKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwNGYyLCAweGFmZjksIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlhhdmkqLworCXtSVExfVVNCX0RFVklDRSgweDA0ZjIsIDB4YWZmYSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qWGF2aSovCisKKwkvKioqKioqIDgxODhDVVMgU2xpbSBDb21ibyAqKioqKioqKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwNGYyLCAweGFmZjgsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlhhdmkqLworCXtSVExfVVNCX0RFVklDRSgweDA0ZjIsIDB4YWZmYiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qWGF2aSovCisJe1JUTF9VU0JfREVWSUNFKDB4MDRmMiwgMHhhZmZjLCBydGw5MmN1X2hhbF9jZmcpfSwgLypYYXZpKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgyMDE5LCAweDEyMDEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlBsYW5leC1WZW5jZXIqLworCiAJLyoqKioqKiA4MTkyQ1UgKioqKioqKiovCisJe1JUTF9VU0JfREVWSUNFKDB4MDUwZCwgMHgyMTAyLCBydGw5MmN1X2hhbF9jZmcpfSwgLypCZWxjb20tU2VyY29tbSovCisJe1JUTF9VU0JfREVWSUNFKDB4MDUwZCwgMHgyMTAzLCBydGw5MmN1X2hhbF9jZmcpfSwgLypCZWxjb20tRWRpbWF4Ki8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MWYsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlp5eGVsIC1BYm9jb20qLwogCXtSVExfVVNCX0RFVklDRSgweDA3YWEsIDB4MDA1NiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qQVRLSy1HZW10ZWsqLwogCXtSVExfVVNCX0RFVklDRSgweDA3YjgsIDB4ODE3OCwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qRnVuYWkgLUFib2NvbSovCisJe1JUTF9VU0JfREVWSUNFKDB4MDg0NiwgMHg5MDIxLCBydGw5MmN1X2hhbF9jZmcpfSwgLypOZXRnZWFyLVNlcmNvbW0qLworCXtSVExfVVNCX0RFVklDRSgweDBiMDUsIDB4MTdhYiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qQVNVUy1FZGltYXgqLworCXtSVExfVVNCX0RFVklDRSgweDBkZjYsIDB4MDA2MSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qU2l0ZWNvbS1FZGltYXgqLworCXtSVExfVVNCX0RFVklDRSgweDBlNjYsIDB4MDAxOSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qSGF3a2luZy1FZGltYXgqLwogCXtSVExfVVNCX0RFVklDRSgweDIwMDEsIDB4MzMwNywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qRC1MaW5rLUNhbWVvKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMzMDksIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkQtTGluay1BbHBoYSovCiAJe1JUTF9VU0JfREVWSUNFKDB4MjAwMSwgMHgzMzBhLCBydGw5MmN1X2hhbF9jZmcpfSwgLypELUxpbmstQWxwaGEqLwogCXtSVExfVVNCX0RFVklDRSgweDIwMTksIDB4YWIyYiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qUGxhbmV4IC1BYm9jb20qLworCXtSVExfVVNCX0RFVklDRSgweDIwZjQsIDB4NjI0ZCwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qVFJFTkROZXQqLwogCXtSVExfVVNCX0RFVklDRSgweDczOTIsIDB4NzgyMiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qRWRpbWF4IC1FZGltYXgqLwogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvdHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS90cnguYwppbmRleCBiYzMzYjE0Li5iM2NjN2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS90cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS90cnguYwpAQCAtNDkxLDcgKzQ5MSw3IEBACiAJU0VUX1RYX0RFU0NfVFhfREVTQ19DSEVDS1NVTSh0eGRlc2MsIDApOwogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDE2OyBpbmRleCsrKQogCQljaGVja3N1bSA9IGNoZWNrc3VtIF4gKCoocHRyICsgaW5kZXgpKTsKLQlTRVRfVFhfREVTQ19UWF9ERVNDX0NIRUNLU1VNKHR4ZGVzYywgY2hlY2tzdW0pOworCVNFVF9UWF9ERVNDX1RYX0RFU0NfQ0hFQ0tTVU0odHhkZXNjLCBjcHVfdG9fbGUxNihjaGVja3N1bSkpOwogfQogCiB2b2lkIHJ0bDkyY3VfdHhfZmlsbF9kZXNjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMKaW5kZXggNjkxZjgwMC4uMTQ5NDkzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9zdy5jCkBAIC0zMCw2ICszMCw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi93aWZpLmgiCiAjaW5jbHVkZSAiLi4vY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3N3LmMKaW5kZXggM2VjOWEwZC4uOTJmNDlkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9zdy5jCkBAIC0zMCw2ICszMCw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi93aWZpLmgiCiAjaW5jbHVkZSAiLi4vY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvdXNiLmMKaW5kZXggYjQyYzJlMi4uZTk1NmZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3VzYi5jCkBAIC0yOCwxOCArMjgsMjAgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJ3aWZpLmgiCiAjaW5jbHVkZSAidXNiLmgiCiAjaW5jbHVkZSAiYmFzZS5oIgogI2luY2x1ZGUgInBzLmgiCisjaW5jbHVkZSAicnRsODE5MmMvZndfY29tbW9uLmgiCiAKICNkZWZpbmUJUkVBTFRFS19VU0JfVkVOUVRfUkVBRAkJCTB4QzAKICNkZWZpbmUJUkVBTFRFS19VU0JfVkVOUVRfV1JJVEUJCQkweDQwCiAjZGVmaW5lIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVEJCTB4MDUKICNkZWZpbmUJUkVBTFRFS19VU0JfVkVOUVRfQ01EX0lEWAkJMHgwMAogCi0jZGVmaW5lIFJFQUxURUtfVVNCX1ZFTlFUX01BWF9CVUZfU0laRQkJMjU0CisjZGVmaW5lIE1BWF9VU0JDVFJMX1ZFTkRPUlJFUV9USU1FUwkJMTAKIAogc3RhdGljIHZvaWQgdXNiY3RybF9hc3luY19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CkBAIC04MSw2ICs4Myw3IEBACiAJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKIAlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOwogCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYobGVuKTsKKwkvKiBkYXRhIGFyZSBhbHJlYWR5IGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgKi8KIAltZW1jcHkoYnVmLCBwZGF0YSwgbGVuKTsKIAl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIHVkZXYsIHBpcGUsCiAJCQkgICAgICh1bnNpZ25lZCBjaGFyICopZHIsIGJ1ZiwgbGVuLApAQCAtOTksMTYgKzEwMiwyOCBAQAogCXVuc2lnbmVkIGludCBwaXBlOwogCWludCBzdGF0dXM7CiAJdTggcmVxdHlwZTsKKwlpbnQgdmVuZG9ycmVxX3RpbWVzID0gMDsKKwlzdGF0aWMgaW50IGNvdW50OwogCiAJcGlwZSA9IHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKTsgLyogcmVhZF9pbiAqLwogCXJlcXR5cGUgPSAgUkVBTFRFS19VU0JfVkVOUVRfUkVBRDsKIAotCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCBwaXBlLCByZXF1ZXN0LCByZXF0eXBlLCB2YWx1ZSwgaW5kZXgsCi0JCQkJIHBkYXRhLCBsZW4sIDApOyAvKiBtYXguIHRpbWVvdXQgKi8KKwlkbyB7CisJCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCBwaXBlLCByZXF1ZXN0LCByZXF0eXBlLCB2YWx1ZSwKKwkJCQkJIGluZGV4LCBwZGF0YSwgbGVuLCAwKTsgLyptYXguIHRpbWVvdXQqLworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJLyogZmlybXdhcmUgZG93bmxvYWQgaXMgY2hlY2tzdW1lZCwgZG9uJ3QgcmV0cnkgKi8KKwkJCWlmICgodmFsdWUgPj0gRldfODE5MkNfU1RBUlRfQUREUkVTUyAmJgorCQkJICAgIHZhbHVlIDw9IEZXXzgxOTJDX0VORF9BRERSRVNTKSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoKyt2ZW5kb3JyZXFfdGltZXMgPCBNQVhfVVNCQ1RSTF9WRU5ET1JSRVFfVElNRVMpOwogCi0JaWYgKHN0YXR1cyA8IDApCisJaWYgKHN0YXR1cyA8IDAgJiYgY291bnQrKyA8IDQpCiAJCXByX2VycigicmVnIDB4JXgsIHVzYmN0cmxfdmVuZG9ycmVxIFRpbWVPdXQhIHN0YXR1czoweCV4IHZhbHVlPTB4JXhcbiIsCi0JCSAgICAgICB2YWx1ZSwgc3RhdHVzLCAqKHUzMiAqKXBkYXRhKTsKKwkJICAgICAgIHZhbHVlLCBzdGF0dXMsIGxlMzJfdG9fY3B1KCoodTMyICopcGRhdGEpKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMjgsNyArMTQzLDcgQEAKIAogCXd2YWx1ZSA9ICh1MTYpYWRkcjsKIAlfdXNiY3RybF92ZW5kb3JyZXFfc3luY19yZWFkKHVkZXYsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsIGRhdGEsIGxlbik7Ci0JcmV0ID0gKmRhdGE7CisJcmV0ID0gbGUzMl90b19jcHUoKmRhdGEpOwogCWtmcmVlKGRhdGEpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNjAsMTIgKzE3NSwxMiBAQAogCXU4IHJlcXVlc3Q7CiAJdTE2IHd2YWx1ZTsKIAl1MTYgaW5kZXg7Ci0JdTMyIGRhdGE7CisJX19sZTMyIGRhdGE7CiAKIAlyZXF1ZXN0ID0gUkVBTFRFS19VU0JfVkVOUVRfQ01EX1JFUTsKIAlpbmRleCA9IFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9JRFg7IC8qIG4vYSAqLwogCXd2YWx1ZSA9ICh1MTYpKGFkZHImMHgwMDAwZmZmZik7Ci0JZGF0YSA9IHZhbDsKKwlkYXRhID0gY3B1X3RvX2xlMzIodmFsKTsKIAlfdXNiY3RybF92ZW5kb3JyZXFfYXN5bmNfd3JpdGUodWRldiwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgJmRhdGEsCiAJCQkJICAgICAgIGxlbik7CiB9CkBAIC0xOTEsNiArMjA2LDMwIEBACiAJX3VzYl93cml0ZV9hc3luYyh0b191c2JfZGV2aWNlKGRldiksIGFkZHIsIHZhbCwgNCk7CiB9CiAKK3N0YXRpYyB2b2lkIF91c2Jfd3JpdGVOX3N5bmMoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkciwgdm9pZCAqZGF0YSwKKwkJCSAgICAgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBydGxwcml2LT5pby5kZXY7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CisJdTggcmVxdWVzdCA9IFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVE7CisJdTggcmVxdHlwZSA9ICBSRUFMVEVLX1VTQl9WRU5RVF9XUklURTsKKwl1MTYgd3ZhbHVlOworCXUxNiBpbmRleCA9IFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9JRFg7CisJaW50IHBpcGUgPSB1c2Jfc25kY3RybHBpcGUodWRldiwgMCk7IC8qIHdyaXRlX291dCAqLworCXU4ICpidWZmZXI7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXd2YWx1ZSA9ICh1MTYpKGFkZHImMHgwMDAwZmZmZik7CisJYnVmZmVyID0gdXNiX2FsbG9jX2NvaGVyZW50KHVkZXYsIChzaXplX3QpbGVuLCBHRlBfQVRPTUlDLCAmZG1hX2FkZHIpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm47CisJbWVtY3B5KGJ1ZmZlciwgZGF0YSwgbGVuKTsKKwl1c2JfY29udHJvbF9tc2codWRldiwgcGlwZSwgcmVxdWVzdCwgcmVxdHlwZSwgd3ZhbHVlLAorCQkJaW5kZXgsIGJ1ZmZlciwgbGVuLCA1MCk7CisKKwl1c2JfZnJlZV9jb2hlcmVudCh1ZGV2LCAoc2l6ZV90KWxlbiwgYnVmZmVyLCBkbWFfYWRkcik7Cit9CisKIHN0YXRpYyB2b2lkIF9ydGxfdXNiX2lvX2hhbmRsZXJfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKQEAgLTIwNCw2ICsyNDMsNyBAQAogCXJ0bHByaXYtPmlvLnJlYWQ4X3N5bmMJCT0gX3VzYl9yZWFkOF9zeW5jOwogCXJ0bHByaXYtPmlvLnJlYWQxNl9zeW5jCQk9IF91c2JfcmVhZDE2X3N5bmM7CiAJcnRscHJpdi0+aW8ucmVhZDMyX3N5bmMJCT0gX3VzYl9yZWFkMzJfc3luYzsKKwlydGxwcml2LT5pby53cml0ZU5fc3luYwkJPSBfdXNiX3dyaXRlTl9zeW5jOwogfQogCiBzdGF0aWMgdm9pZCBfcnRsX3VzYl9pb19oYW5kbGVyX3JlbGVhc2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3dpZmkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvd2lmaS5oCmluZGV4IDcxM2M3ZGQuLmYzYzEzMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvd2lmaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvd2lmaS5oCkBAIC02Myw2ICs2Myw3IEBACiAjZGVmaW5lIEFDX01BWAkJCQkJNAogI2RlZmluZSBRT1NfUVVFVUVfTlVNCQkJCTQKICNkZWZpbmUgUlRMX01BQzgwMjExX05VTV9RVUVVRQkJCTUKKyNkZWZpbmUgUkVBTFRFS19VU0JfVkVOUVRfTUFYX0JVRl9TSVpFCQkyNTQKIAogI2RlZmluZSBRQlNTX0xPQURfU0laRQkJCQk1CiAjZGVmaW5lIE1BWF9XTU1FTEVfTEVOR1RICQkJNjQKQEAgLTk0Myw4ICs5NDQsMTAgQEAKIAl1bnNpZ25lZCBsb25nIHBjaV9iYXNlX2FkZHI7CS8qZGV2aWNlIEkvTyBhZGRyZXNzICovCiAKIAl2b2lkICgqd3JpdGU4X2FzeW5jKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkciwgdTggdmFsKTsKLQl2b2lkICgqd3JpdGUxNl9hc3luYykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIF9fbGUxNiB2YWwpOwotCXZvaWQgKCp3cml0ZTMyX2FzeW5jKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkciwgX19sZTMyIHZhbCk7CisJdm9pZCAoKndyaXRlMTZfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB1MTYgdmFsKTsKKwl2b2lkICgqd3JpdGUzMl9hc3luYykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHUzMiB2YWwpOworCXZvaWQgKCp3cml0ZU5fc3luYykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgdTE2IGxlbik7CiAKIAl1OCgqcmVhZDhfc3luYykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIpOwogCXUxNigqcmVhZDE2X3N5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zcGkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zcGkuYwppbmRleCBlYWE1Zjk1Li42MjQ4YzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyNTEvc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMjUxL3NwaS5jCkBAIC0zMTksNyArMzE5LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bDEyNTFfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQkJPSBEUklWRVJfTkFNRSwKLQkJLmJ1cwkJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2Jvb3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ib290LmMKaW5kZXggZDRlNjI4ZC4uNjgxMzM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2Jvb3QuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYm9vdC5jCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd2wxMnh4Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJhY3guaCIKICNpbmNsdWRlICJyZWcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zcGkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zcGkuYwppbmRleCAwZjk3MTg2Li4xMjQyMWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NwaS5jCkBAIC00NjIsNyArNDYyLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bDEyNzFfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQkJPSAid2wxMjcxX3NwaSIsCi0JCS5idXMJCT0gJnNwaV9idXNfdHlwZSwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCX0sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKaW5kZXggY2YwZDY5ZC4uNzg1YmRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmgKaW5kZXggMTYxZjIwNy4uOTRiNzljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmgKQEAgLTU4LDEwICs1OCw2IEBACiAJdTggICAgICAgICAgICAgICBmZV9kZXZfYWRkcls2XTsKIAogCS8qIFBoeXNpY2FsIHBhcmFtZXRlcnMgb2YgdGhlIGNvbW1zIHdpbmRvdy4gKi8KLQlncmFudF9oYW5kbGVfdCAgIHR4X3NobWVtX2hhbmRsZTsKLQlncmFudF9yZWZfdCAgICAgIHR4X3NobWVtX3JlZjsKLQlncmFudF9oYW5kbGVfdCAgIHJ4X3NobWVtX2hhbmRsZTsKLQlncmFudF9yZWZfdCAgICAgIHJ4X3NobWVtX3JlZjsKIAl1bnNpZ25lZCBpbnQgICAgIGlycTsKIAogCS8qIExpc3Qgb2YgZnJvbnRlbmRzIHRvIG5vdGlmeSBhZnRlciBhIGJhdGNoIG9mIGZyYW1lcyBzZW50LiAqLwpAQCAtNzAsOCArNjYsNiBAQAogCS8qIFRoZSBzaGFyZWQgcmluZ3MgYW5kIGluZGV4ZXMuICovCiAJc3RydWN0IHhlbl9uZXRpZl90eF9iYWNrX3JpbmcgdHg7CiAJc3RydWN0IHhlbl9uZXRpZl9yeF9iYWNrX3Jpbmcgcng7Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdHhfY29tbXNfYXJlYTsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICpyeF9jb21tc19hcmVhOwogCiAJLyogRnJvbnRlbmQgZmVhdHVyZSBpbmZvcm1hdGlvbi4gKi8KIAl1OCBjYW5fc2c6MTsKQEAgLTEwNiw2ICsxMDAsMTEgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0aW5nX3RvX2ZyZWU7CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZW5idXNfZGV2aWNlICp4ZW52aWZfdG9feGVuYnVzX2RldmljZShzdHJ1Y3QgeGVudmlmICp2aWYpCit7CisJcmV0dXJuIHRvX3hlbmJ1c19kZXZpY2UodmlmLT5kZXYtPmRldi5wYXJlbnQpOworfQorCiAjZGVmaW5lIFhFTl9ORVRJRl9UWF9SSU5HX1NJWkUgX19DT05TVF9SSU5HX1NJWkUoeGVuX25ldGlmX3R4LCBQQUdFX1NJWkUpCiAjZGVmaW5lIFhFTl9ORVRJRl9SWF9SSU5HX1NJWkUgX19DT05TVF9SSU5HX1NJWkUoeGVuX25ldGlmX3J4LCBQQUdFX1NJWkUpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYwppbmRleCBkNTUwODk1Li4wY2I1OTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCkBAIC0xNTg5LDg4ICsxNTg5LDQyIEBACiAKIHZvaWQgeGVuX25ldGJrX3VubWFwX2Zyb250ZW5kX3JpbmdzKHN0cnVjdCB4ZW52aWYgKnZpZikKIHsKLQlzdHJ1Y3QgZ250dGFiX3VubWFwX2dyYW50X3JlZiBvcDsKLQotCWlmICh2aWYtPnR4LnNyaW5nKSB7Ci0JCWdudHRhYl9zZXRfdW5tYXBfb3AoJm9wLCAodW5zaWduZWQgbG9uZyl2aWYtPnR4X2NvbW1zX2FyZWEtPmFkZHIsCi0JCQkJICAgIEdOVE1BUF9ob3N0X21hcCwgdmlmLT50eF9zaG1lbV9oYW5kbGUpOwotCi0JCWlmIChIWVBFUlZJU09SX2dyYW50X3RhYmxlX29wKEdOVFRBQk9QX3VubWFwX2dyYW50X3JlZiwgJm9wLCAxKSkKLQkJCUJVRygpOwotCX0KLQotCWlmICh2aWYtPnJ4LnNyaW5nKSB7Ci0JCWdudHRhYl9zZXRfdW5tYXBfb3AoJm9wLCAodW5zaWduZWQgbG9uZyl2aWYtPnJ4X2NvbW1zX2FyZWEtPmFkZHIsCi0JCQkJICAgIEdOVE1BUF9ob3N0X21hcCwgdmlmLT5yeF9zaG1lbV9oYW5kbGUpOwotCi0JCWlmIChIWVBFUlZJU09SX2dyYW50X3RhYmxlX29wKEdOVFRBQk9QX3VubWFwX2dyYW50X3JlZiwgJm9wLCAxKSkKLQkJCUJVRygpOwotCX0KLQlpZiAodmlmLT5yeF9jb21tc19hcmVhKQotCQlmcmVlX3ZtX2FyZWEodmlmLT5yeF9jb21tc19hcmVhKTsKLQlpZiAodmlmLT50eF9jb21tc19hcmVhKQotCQlmcmVlX3ZtX2FyZWEodmlmLT50eF9jb21tc19hcmVhKTsKKwlpZiAodmlmLT50eC5zcmluZykKKwkJeGVuYnVzX3VubWFwX3JpbmdfdmZyZWUoeGVudmlmX3RvX3hlbmJ1c19kZXZpY2UodmlmKSwKKwkJCQkJdmlmLT50eC5zcmluZyk7CisJaWYgKHZpZi0+cnguc3JpbmcpCisJCXhlbmJ1c191bm1hcF9yaW5nX3ZmcmVlKHhlbnZpZl90b194ZW5idXNfZGV2aWNlKHZpZiksCisJCQkJCXZpZi0+cnguc3JpbmcpOwogfQogCiBpbnQgeGVuX25ldGJrX21hcF9mcm9udGVuZF9yaW5ncyhzdHJ1Y3QgeGVudmlmICp2aWYsCiAJCQkJIGdyYW50X3JlZl90IHR4X3JpbmdfcmVmLAogCQkJCSBncmFudF9yZWZfdCByeF9yaW5nX3JlZikKIHsKLQlzdHJ1Y3QgZ250dGFiX21hcF9ncmFudF9yZWYgb3A7CisJdm9pZCAqYWRkcjsKIAlzdHJ1Y3QgeGVuX25ldGlmX3R4X3NyaW5nICp0eHM7CiAJc3RydWN0IHhlbl9uZXRpZl9yeF9zcmluZyAqcnhzOwogCiAJaW50IGVyciA9IC1FTk9NRU07CiAKLQl2aWYtPnR4X2NvbW1zX2FyZWEgPSBhbGxvY192bV9hcmVhKFBBR0VfU0laRSk7Ci0JaWYgKHZpZi0+dHhfY29tbXNfYXJlYSA9PSBOVUxMKQorCWVyciA9IHhlbmJ1c19tYXBfcmluZ192YWxsb2MoeGVudmlmX3RvX3hlbmJ1c19kZXZpY2UodmlmKSwKKwkJCQkgICAgIHR4X3JpbmdfcmVmLCAmYWRkcik7CisJaWYgKGVycikKIAkJZ290byBlcnI7CiAKLQl2aWYtPnJ4X2NvbW1zX2FyZWEgPSBhbGxvY192bV9hcmVhKFBBR0VfU0laRSk7Ci0JaWYgKHZpZi0+cnhfY29tbXNfYXJlYSA9PSBOVUxMKQotCQlnb3RvIGVycjsKLQotCWdudHRhYl9zZXRfbWFwX29wKCZvcCwgKHVuc2lnbmVkIGxvbmcpdmlmLT50eF9jb21tc19hcmVhLT5hZGRyLAotCQkJICBHTlRNQVBfaG9zdF9tYXAsIHR4X3JpbmdfcmVmLCB2aWYtPmRvbWlkKTsKLQotCWlmIChIWVBFUlZJU09SX2dyYW50X3RhYmxlX29wKEdOVFRBQk9QX21hcF9ncmFudF9yZWYsICZvcCwgMSkpCi0JCUJVRygpOwotCi0JaWYgKG9wLnN0YXR1cykgewotCQluZXRkZXZfd2Fybih2aWYtPmRldiwKLQkJCSAgICAiZmFpbGVkIHRvIG1hcCB0eCByaW5nLiBlcnI9JWQgc3RhdHVzPSVkXG4iLAotCQkJICAgIGVyciwgb3Auc3RhdHVzKTsKLQkJZXJyID0gb3Auc3RhdHVzOwotCQlnb3RvIGVycjsKLQl9Ci0KLQl2aWYtPnR4X3NobWVtX3JlZiAgICA9IHR4X3JpbmdfcmVmOwotCXZpZi0+dHhfc2htZW1faGFuZGxlID0gb3AuaGFuZGxlOwotCi0JdHhzID0gKHN0cnVjdCB4ZW5fbmV0aWZfdHhfc3JpbmcgKil2aWYtPnR4X2NvbW1zX2FyZWEtPmFkZHI7CisJdHhzID0gKHN0cnVjdCB4ZW5fbmV0aWZfdHhfc3JpbmcgKilhZGRyOwogCUJBQ0tfUklOR19JTklUKCZ2aWYtPnR4LCB0eHMsIFBBR0VfU0laRSk7CiAKLQlnbnR0YWJfc2V0X21hcF9vcCgmb3AsICh1bnNpZ25lZCBsb25nKXZpZi0+cnhfY29tbXNfYXJlYS0+YWRkciwKLQkJCSAgR05UTUFQX2hvc3RfbWFwLCByeF9yaW5nX3JlZiwgdmlmLT5kb21pZCk7Ci0KLQlpZiAoSFlQRVJWSVNPUl9ncmFudF90YWJsZV9vcChHTlRUQUJPUF9tYXBfZ3JhbnRfcmVmLCAmb3AsIDEpKQotCQlCVUcoKTsKLQotCWlmIChvcC5zdGF0dXMpIHsKLQkJbmV0ZGV2X3dhcm4odmlmLT5kZXYsCi0JCQkgICAgImZhaWxlZCB0byBtYXAgcnggcmluZy4gZXJyPSVkIHN0YXR1cz0lZFxuIiwKLQkJCSAgICBlcnIsIG9wLnN0YXR1cyk7Ci0JCWVyciA9IG9wLnN0YXR1czsKKwllcnIgPSB4ZW5idXNfbWFwX3JpbmdfdmFsbG9jKHhlbnZpZl90b194ZW5idXNfZGV2aWNlKHZpZiksCisJCQkJICAgICByeF9yaW5nX3JlZiwgJmFkZHIpOworCWlmIChlcnIpCiAJCWdvdG8gZXJyOwotCX0KIAotCXZpZi0+cnhfc2htZW1fcmVmICAgICA9IHJ4X3JpbmdfcmVmOwotCXZpZi0+cnhfc2htZW1faGFuZGxlICA9IG9wLmhhbmRsZTsKLQl2aWYtPnJ4X3JlcV9jb25zX3BlZWsgPSAwOwotCi0JcnhzID0gKHN0cnVjdCB4ZW5fbmV0aWZfcnhfc3JpbmcgKil2aWYtPnJ4X2NvbW1zX2FyZWEtPmFkZHI7CisJcnhzID0gKHN0cnVjdCB4ZW5fbmV0aWZfcnhfc3JpbmcgKilhZGRyOwogCUJBQ0tfUklOR19JTklUKCZ2aWYtPnJ4LCByeHMsIFBBR0VfU0laRSk7CiAKKwl2aWYtPnJ4X3JlcV9jb25zX3BlZWsgPSAwOworCiAJcmV0dXJuIDA7CiAKIGVycjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL25mY3dpbGluay5jIGIvZHJpdmVycy9uZmMvbmZjd2lsaW5rLmMKaW5kZXggNWIwZjFmZi4uMDZjMzY0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvbmZjd2lsaW5rLmMKKysrIGIvZHJpdmVycy9uZmMvbmZjd2lsaW5rLmMKQEAgLTI3LDYgKzI3LDcgQEAKICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZmMuaD4KICNpbmNsdWRlIDxuZXQvbmZjL25jaS5oPgogI2luY2x1ZGUgPG5ldC9uZmMvbmNpX2NvcmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL3BuNTMzLmMgYi9kcml2ZXJzL25mYy9wbjUzMy5jCmluZGV4IDdiY2IxZmUuLmRiZjIxNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmZjL3BuNTMzLmMKKysrIGIvZHJpdmVycy9uZmMvcG41MzMuYwpAQCAtMTMzOSw3ICsxMzM5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBuNTMzX2RhdGFfZXhjaGFuZ2Uoc3RydWN0IG5mY19kZXYgKm5mY19kZXYsIHUzMiB0YXJnZXRfaWR4LAorc3RhdGljIGludCBwbjUzM19kYXRhX2V4Y2hhbmdlKHN0cnVjdCBuZmNfZGV2ICpuZmNfZGV2LCB1MzIgdGFyZ2V0X2lkeCwKIAkJCQkJCXN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCQlkYXRhX2V4Y2hhbmdlX2NiX3QgY2IsCiAJCQkJCQl2b2lkICpjYl9jb250ZXh0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9iYXNlLmMgYi9kcml2ZXJzL29mL2Jhc2UuYwppbmRleCAzZmYyMmUzLi45YjY1ODhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2Jhc2UuYworKysgYi9kcml2ZXJzL29mL2Jhc2UuYwpAQCAtMTcsMTQgKzE3LDM5IEBACiAgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KIAorLyoqCisgKiBzdHJ1Y3QgYWxpYXNfcHJvcCAtIEFsaWFzIHByb3BlcnR5IGluICdhbGlhc2VzJyBub2RlCisgKiBAbGluazoJTGlzdCBub2RlIHRvIGxpbmsgdGhlIHN0cnVjdHVyZSBpbiBhbGlhc2VzX2xvb2t1cCBsaXN0CisgKiBAYWxpYXM6CUFsaWFzIHByb3BlcnR5IG5hbWUKKyAqIEBucDoJCVBvaW50ZXIgdG8gZGV2aWNlX25vZGUgdGhhdCB0aGUgYWxpYXMgc3RhbmRzIGZvcgorICogQGlkOgkJSW5kZXggdmFsdWUgZnJvbSBlbmQgb2YgYWxpYXMgbmFtZQorICogQHN0ZW06CUFsaWFzIHN0cmluZyB3aXRob3V0IHRoZSBpbmRleAorICoKKyAqIFRoZSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBvbmUgYWxpYXMgcHJvcGVydHkgb2YgJ2FsaWFzZXMnIG5vZGUgYXMKKyAqIGFuIGVudHJ5IGluIGFsaWFzZXNfbG9va3VwIGxpc3QuCisgKi8KK3N0cnVjdCBhbGlhc19wcm9wIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJY29uc3QgY2hhciAqYWxpYXM7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlpbnQgaWQ7CisJY2hhciBzdGVtWzBdOworfTsKKworc3RhdGljIExJU1RfSEVBRChhbGlhc2VzX2xvb2t1cCk7CisKIHN0cnVjdCBkZXZpY2Vfbm9kZSAqYWxsbm9kZXM7CiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2Nob3NlbjsKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfYWxpYXNlczsKKworc3RhdGljIERFRklORV9NVVRFWChvZl9hbGlhc2VzX211dGV4KTsKIAogLyogdXNlIHdoZW4gdHJhdmVyc2luZyB0cmVlIHRocm91Z2ggdGhlIGFsbG5leHQsIGNoaWxkLCBzaWJsaW5nLAogICogb3IgcGFyZW50IG1lbWJlcnMgb2Ygc3RydWN0IGRldmljZV9ub2RlLgpAQCAtNjMyLDYgKzY1NywzNSBAQAogRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkpOwogCiAvKioKKyAqIG9mX3Byb3BlcnR5X3JlYWRfdTY0IC0gRmluZCBhbmQgcmVhZCBhIDY0IGJpdCBpbnRlZ2VyIGZyb20gYSBwcm9wZXJ0eQorICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KKyAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCisgKiBAb3V0X3ZhbHVlOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCBhIDY0LWJpdCB2YWx1ZSBmcm9tCisgKiBpdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LAorICogLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVyBpZiB0aGUKKyAqIHByb3BlcnR5IGRhdGEgaXNuJ3QgbGFyZ2UgZW5vdWdoLgorICoKKyAqIFRoZSBvdXRfdmFsdWUgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHU2NCB2YWx1ZSBjYW4gYmUgZGVjb2RlZC4KKyAqLworaW50IG9mX3Byb3BlcnR5X3JlYWRfdTY0KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJIHU2NCAqb3V0X3ZhbHVlKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIHByb3BuYW1lLCBOVUxMKTsKKworCWlmICghcHJvcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFwcm9wLT52YWx1ZSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCWlmIChzaXplb2YoKm91dF92YWx1ZSkgPiBwcm9wLT5sZW5ndGgpCisJCXJldHVybiAtRU9WRVJGTE9XOworCSpvdXRfdmFsdWUgPSBvZl9yZWFkX251bWJlcihwcm9wLT52YWx1ZSwgMik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3U2NCk7CisKKy8qKgogICogb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcgLSBGaW5kIGFuZCByZWFkIGEgc3RyaW5nIGZyb20gYSBwcm9wZXJ0eQogICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KICAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCkBAIC02NjIsNiArNzE2LDkwIEBACiBFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyk7CiAKIC8qKgorICogb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXggLSBGaW5kIGFuZCByZWFkIGEgc3RyaW5nIGZyb20gYSBtdWx0aXBsZQorICogc3RyaW5ncyBwcm9wZXJ0eS4KKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQGluZGV4OglpbmRleCBvZiB0aGUgc3RyaW5nIGluIHRoZSBsaXN0IG9mIHN0cmluZ3MKKyAqIEBvdXRfc3RyaW5nOglwb2ludGVyIHRvIG51bGwgdGVybWluYXRlZCByZXR1cm4gc3RyaW5nLCBtb2RpZmllZCBvbmx5IGlmCisgKgkJcmV0dXJuIHZhbHVlIGlzIDAuCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIHRyZWUgbm9kZSBhbmQgcmV0cmlldmUgYSBudWxsCisgKiB0ZXJtaW5hdGVkIHN0cmluZyB2YWx1ZSAocG9pbnRlciB0byBkYXRhLCBub3QgYSBjb3B5KSBpbiB0aGUgbGlzdCBvZiBzdHJpbmdzCisgKiBjb250YWluZWQgaW4gdGhhdCBwcm9wZXJ0eS4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwgLUVOT0RBVEEgaWYKKyAqIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FSUxTRVEgaWYgdGhlIHN0cmluZyBpcyBub3QKKyAqIG51bGwtdGVybWluYXRlZCB3aXRoaW4gdGhlIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgZGF0YS4KKyAqCisgKiBUaGUgb3V0X3N0cmluZyBwb2ludGVyIGlzIG1vZGlmaWVkIG9ubHkgaWYgYSB2YWxpZCBzdHJpbmcgY2FuIGJlIGRlY29kZWQuCisgKi8KK2ludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkgIGludCBpbmRleCwgY29uc3QgY2hhciAqKm91dHB1dCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CisJaW50IGkgPSAwOworCXNpemVfdCBsID0gMCwgdG90YWwgPSAwOworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghcHJvcC0+dmFsdWUpCisJCXJldHVybiAtRU5PREFUQTsKKwlpZiAoc3Rybmxlbihwcm9wLT52YWx1ZSwgcHJvcC0+bGVuZ3RoKSA+PSBwcm9wLT5sZW5ndGgpCisJCXJldHVybiAtRUlMU0VROworCisJcCA9IHByb3AtPnZhbHVlOworCisJZm9yIChpID0gMDsgdG90YWwgPCBwcm9wLT5sZW5ndGg7IHRvdGFsICs9IGwsIHAgKz0gbCkgeworCQlsID0gc3RybGVuKHApICsgMTsKKwkJaWYgKCgqcCAhPSAwKSAmJiAoaSsrID09IGluZGV4KSkgeworCQkJKm91dHB1dCA9IHA7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0RBVEE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleCk7CisKKworLyoqCisgKiBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzIC0gRmluZCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBmcm9tIGEKKyAqIG11bHRpcGxlIHN0cmluZ3MgcHJvcGVydHkuCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2UgdHJlZSBub2RlIGFuZCByZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIG51bGwKKyAqIHRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW4gaW4gaXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBzdHJpbmdzIG9uCisgKiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwgLUVOT0RBVEEgaWYgcHJvcGVydHkKKyAqIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FSUxTRVEgaWYgdGhlIHN0cmluZyBpcyBub3QgbnVsbC10ZXJtaW5hdGVkCisgKiB3aXRoaW4gdGhlIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgZGF0YS4KKyAqLworaW50IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqcHJvcG5hbWUpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgcHJvcG5hbWUsIE5VTEwpOworCWludCBpID0gMDsKKwlzaXplX3QgbCA9IDAsIHRvdGFsID0gMDsKKwljb25zdCBjaGFyICpwOworCisJaWYgKCFwcm9wKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXByb3AtPnZhbHVlKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJaWYgKHN0cm5sZW4ocHJvcC0+dmFsdWUsIHByb3AtPmxlbmd0aCkgPj0gcHJvcC0+bGVuZ3RoKQorCQlyZXR1cm4gLUVJTFNFUTsKKworCXAgPSBwcm9wLT52YWx1ZTsKKworCWZvciAoaSA9IDA7IHRvdGFsIDwgcHJvcC0+bGVuZ3RoOyB0b3RhbCArPSBsLCBwICs9IGwpIHsKKwkJbCA9IHN0cmxlbihwKSArIDE7CisJCWlmICgqcCAhPSAwKQorCQkJaSsrOworCX0KKwlyZXR1cm4gaTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MpOworCisvKioKICAqIG9mX3BhcnNlX3BoYW5kbGUgLSBSZXNvbHZlIGEgcGhhbmRsZSBwcm9wZXJ0eSB0byBhIGRldmljZV9ub2RlIHBvaW50ZXIKICAqIEBucDogUG9pbnRlciB0byBkZXZpY2Ugbm9kZSBob2xkaW5nIHBoYW5kbGUgcHJvcGVydHkKICAqIEBwaGFuZGxlX25hbWU6IE5hbWUgb2YgcHJvcGVydHkgaG9sZGluZyBhIHBoYW5kbGUgdmFsdWUKQEAgLTk4OCwzICsxMTI2LDk5IEBACiB9CiAjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfT0ZfRFlOQU1JQykgKi8KIAorc3RhdGljIHZvaWQgb2ZfYWxpYXNfYWRkKHN0cnVjdCBhbGlhc19wcm9wICphcCwgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSBpbnQgaWQsIGNvbnN0IGNoYXIgKnN0ZW0sIGludCBzdGVtX2xlbikKK3sKKwlhcC0+bnAgPSBucDsKKwlhcC0+aWQgPSBpZDsKKwlzdHJuY3B5KGFwLT5zdGVtLCBzdGVtLCBzdGVtX2xlbik7CisJYXAtPnN0ZW1bc3RlbV9sZW5dID0gMDsKKwlsaXN0X2FkZF90YWlsKCZhcC0+bGluaywgJmFsaWFzZXNfbG9va3VwKTsKKwlwcl9kZWJ1ZygiYWRkaW5nIERUIGFsaWFzOiVzOiBzdGVtPSVzIGlkPSVpIG5vZGU9JXNcbiIsCisJCSBhcC0+YWxpYXMsIGFwLT5zdGVtLCBhcC0+aWQsIG5wID8gbnAtPmZ1bGxfbmFtZSA6IE5VTEwpOworfQorCisvKioKKyAqIG9mX2FsaWFzX3NjYW4gLSBTY2FuIGFsbCBwcm9wZXJ0aWVzIG9mICdhbGlhc2VzJyBub2RlCisgKgorICogVGhlIGZ1bmN0aW9uIHNjYW5zIGFsbCB0aGUgcHJvcGVydGllcyBvZiAnYWxpYXNlcycgbm9kZSBhbmQgcG9wdWxhdGUKKyAqIHRoZSB0aGUgZ2xvYmFsIGxvb2t1cCB0YWJsZSB3aXRoIHRoZSBwcm9wZXJ0aWVzLiAgSXQgcmV0dXJucyB0aGUKKyAqIG51bWJlciBvZiBhbGlhc19wcm9wIGZvdW5kLCBvciBlcnJvciBjb2RlIGluIGVycm9yIGNhc2UuCisgKgorICogQGR0X2FsbG9jOglBbiBhbGxvY2F0b3IgdGhhdCBwcm92aWRlcyBhIHZpcnR1YWwgYWRkcmVzcyB0byBtZW1vcnkKKyAqCQlmb3IgdGhlIHJlc3VsdGluZyB0cmVlCisgKi8KK3ZvaWQgb2ZfYWxpYXNfc2Nhbih2b2lkICogKCpkdF9hbGxvYykodTY0IHNpemUsIHU2NCBhbGlnbikpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcDsKKworCW9mX2Nob3NlbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY2hvc2VuIik7CisJaWYgKG9mX2Nob3NlbiA9PSBOVUxMKQorCQlvZl9jaG9zZW4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2Nob3NlbkAwIik7CisJb2ZfYWxpYXNlcyA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvYWxpYXNlcyIpOworCWlmICghb2ZfYWxpYXNlcykKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfcHJvcGVydHkocHAsIG9mX2FsaWFzZXMtPnByb3BlcnRpZXMpIHsKKwkJY29uc3QgY2hhciAqc3RhcnQgPSBwcC0+bmFtZTsKKwkJY29uc3QgY2hhciAqZW5kID0gc3RhcnQgKyBzdHJsZW4oc3RhcnQpOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCQlzdHJ1Y3QgYWxpYXNfcHJvcCAqYXA7CisJCWludCBpZCwgbGVuOworCisJCS8qIFNraXAgdGhvc2Ugd2UgZG8gbm90IHdhbnQgdG8gcHJvY2VlZCAqLworCQlpZiAoIXN0cmNtcChwcC0+bmFtZSwgIm5hbWUiKSB8fAorCQkgICAgIXN0cmNtcChwcC0+bmFtZSwgInBoYW5kbGUiKSB8fAorCQkgICAgIXN0cmNtcChwcC0+bmFtZSwgImxpbnV4LHBoYW5kbGUiKSkKKwkJCWNvbnRpbnVlOworCisJCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgocHAtPnZhbHVlKTsKKwkJaWYgKCFucCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHdhbGsgdGhlIGFsaWFzIGJhY2t3YXJkcyB0byBleHRyYWN0IHRoZSBpZCBhbmQgd29yayBvdXQKKwkJICogdGhlICdzdGVtJyBzdHJpbmcgKi8KKwkJd2hpbGUgKGlzZGlnaXQoKihlbmQtMSkpICYmIGVuZCA+IHN0YXJ0KQorCQkJZW5kLS07CisJCWxlbiA9IGVuZCAtIHN0YXJ0OworCisJCWlmIChrc3RydG9pbnQoZW5kLCAxMCwgJmlkKSA8IDApCisJCQljb250aW51ZTsKKworCQkvKiBBbGxvY2F0ZSBhbiBhbGlhc19wcm9wIHdpdGggZW5vdWdoIHNwYWNlIGZvciB0aGUgc3RlbSAqLworCQlhcCA9IGR0X2FsbG9jKHNpemVvZigqYXApICsgbGVuICsgMSwgNCk7CisJCWlmICghYXApCisJCQljb250aW51ZTsKKwkJYXAtPmFsaWFzID0gc3RhcnQ7CisJCW9mX2FsaWFzX2FkZChhcCwgbnAsIGlkLCBzdGFydCwgbGVuKTsKKwl9Cit9CisKKy8qKgorICogb2ZfYWxpYXNfZ2V0X2lkIC0gR2V0IGFsaWFzIGlkIGZvciB0aGUgZ2l2ZW4gZGV2aWNlX25vZGUKKyAqIEBucDoJCVBvaW50ZXIgdG8gdGhlIGdpdmVuIGRldmljZV9ub2RlCisgKiBAc3RlbToJQWxpYXMgc3RlbSBvZiB0aGUgZ2l2ZW4gZGV2aWNlX25vZGUKKyAqCisgKiBUaGUgZnVuY3Rpb24gdHJhdmVscyB0aGUgbG9va3VwIHRhYmxlIHRvIGdldCBhbGlhcyBpZCBmb3IgdGhlIGdpdmVuCisgKiBkZXZpY2Vfbm9kZSBhbmQgYWxpYXMgc3RlbS4gIEl0IHJldHVybnMgdGhlIGFsaWFzIGlkIGlmIGZpbmQgaXQuCisgKi8KK2ludCBvZl9hbGlhc19nZXRfaWQoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqc3RlbSkKK3sKKwlzdHJ1Y3QgYWxpYXNfcHJvcCAqYXBwOworCWludCBpZCA9IC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZvZl9hbGlhc2VzX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFwcCwgJmFsaWFzZXNfbG9va3VwLCBsaW5rKSB7CisJCWlmIChzdHJjbXAoYXBwLT5zdGVtLCBzdGVtKSAhPSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKG5wID09IGFwcC0+bnApIHsKKwkJCWlkID0gYXBwLT5pZDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmb2ZfYWxpYXNlc19tdXRleCk7CisKKwlyZXR1cm4gaWQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9hbGlhc19nZXRfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9mZHQuYyBiL2RyaXZlcnMvb2YvZmR0LmMKaW5kZXggNjUyMDBhZi4uZmQ4NWZhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9mZHQuYworKysgYi9kcml2ZXJzL29mL2ZkdC5jCkBAIC02ODEsOSArNjgxLDE0IEBACiAJaWYgKHAgIT0gTlVMTCAmJiBsID4gMCkKIAkJc3RybGNweShkYXRhLCBwLCBtaW4oKGludClsLCBDT01NQU5EX0xJTkVfU0laRSkpOwogCisJLyoKKwkgKiBDT05GSUdfQ01ETElORSBpcyBtZWFudCB0byBiZSBhIGRlZmF1bHQgaW4gY2FzZSBub3RoaW5nIGVsc2UKKwkgKiBtYW5hZ2VkIHRvIHNldCB0aGUgY29tbWFuZCBsaW5lLCB1bmxlc3MgQ09ORklHX0NNRExJTkVfRk9SQ0UKKwkgKiBpcyBzZXQgaW4gd2hpY2ggY2FzZSB3ZSBvdmVycmlkZSB3aGF0ZXZlciB3YXMgZm91bmQgZWFybGllci4KKwkgKi8KICNpZmRlZiBDT05GSUdfQ01ETElORQogI2lmbmRlZiBDT05GSUdfQ01ETElORV9GT1JDRQotCWlmIChwID09IE5VTEwgfHwgbCA9PSAwIHx8IChsID09IDEgJiYgKCpwKSA9PSAwKSkKKwlpZiAoISgoY2hhciAqKWRhdGEpWzBdKQogI2VuZGlmCiAJCXN0cmxjcHkoZGF0YSwgQ09ORklHX0NNRExJTkUsIENPTU1BTkRfTElORV9TSVpFKTsKICNlbmRpZiAvKiBDT05GSUdfQ01ETElORSAqLwpAQCAtNzA3LDEwICs3MTIsOCBAQAogCV9fdW5mbGF0dGVuX2RldmljZV90cmVlKGluaXRpYWxfYm9vdF9wYXJhbXMsICZhbGxub2RlcywKIAkJCQllYXJseV9pbml0X2R0X2FsbG9jX21lbW9yeV9hcmNoKTsKIAotCS8qIEdldCBwb2ludGVyIHRvIE9GICIvY2hvc2VuIiBub2RlIGZvciB1c2UgZXZlcnl3aGVyZSAqLwotCW9mX2Nob3NlbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY2hvc2VuIik7Ci0JaWYgKG9mX2Nob3NlbiA9PSBOVUxMKQotCQlvZl9jaG9zZW4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2Nob3NlbkAwIik7CisJLyogR2V0IHBvaW50ZXIgdG8gIi9jaG9zZW4iIGFuZCAiL2FsaWFzYXMiIG5vZGVzIGZvciB1c2UgZXZlcnl3aGVyZSAqLworCW9mX2FsaWFzX3NjYW4oZWFybHlfaW5pdF9kdF9hbGxvY19tZW1vcnlfYXJjaCk7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfT0ZfRUFSTFlfRkxBVFRSRUUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvaXJxLmMgYi9kcml2ZXJzL29mL2lycS5jCmluZGV4IDlmNjg5ZjFkLi42ZDNkZDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2lycS5jCisrKyBiL2RyaXZlcnMvb2YvaXJxLmMKQEAgLTE5LDEwICsxOSwxMiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyogRm9yIGFyY2hzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBOT19JUlEgKHN1Y2ggYXMgeDg2KSwgcHJvdmlkZSBhIGR1bW15IHZhbHVlICovCiAjaWZuZGVmIE5PX0lSUQpAQCAtNTgsMjcgKzYwLDI3IEBACiAgKi8KIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfaXJxX2ZpbmRfcGFyZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcCwgKmMgPSBjaGlsZDsKIAljb25zdCBfX2JlMzIgKnBhcnA7CiAKLQlpZiAoIW9mX25vZGVfZ2V0KGNoaWxkKSkKKwlpZiAoIW9mX25vZGVfZ2V0KGMpKQogCQlyZXR1cm4gTlVMTDsKIAogCWRvIHsKLQkJcGFycCA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwgImludGVycnVwdC1wYXJlbnQiLCBOVUxMKTsKKwkJcGFycCA9IG9mX2dldF9wcm9wZXJ0eShjLCAiaW50ZXJydXB0LXBhcmVudCIsIE5VTEwpOwogCQlpZiAocGFycCA9PSBOVUxMKQotCQkJcCA9IG9mX2dldF9wYXJlbnQoY2hpbGQpOworCQkJcCA9IG9mX2dldF9wYXJlbnQoYyk7CiAJCWVsc2UgewogCQkJaWYgKG9mX2lycV93b3JrYXJvdW5kcyAmIE9GX0lNQVBfTk9fUEhBTkRMRSkKIAkJCQlwID0gb2Zfbm9kZV9nZXQob2ZfaXJxX2RmbHRfcGljKTsKIAkJCWVsc2UKIAkJCQlwID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoYmUzMl90b19jcHVwKHBhcnApKTsKIAkJfQotCQlvZl9ub2RlX3B1dChjaGlsZCk7Ci0JCWNoaWxkID0gcDsKKwkJb2Zfbm9kZV9wdXQoYyk7CisJCWMgPSBwOwogCX0gd2hpbGUgKHAgJiYgb2ZfZ2V0X3Byb3BlcnR5KHAsICIjaW50ZXJydXB0LWNlbGxzIiwgTlVMTCkgPT0gTlVMTCk7CiAKLQlyZXR1cm4gcDsKKwlyZXR1cm4gKHAgPT0gY2hpbGQpID8gTlVMTCA6IHA7CiB9CiAKIC8qKgpAQCAtMzg2LDMgKzM4OCwxMDggQEAKIAogCXJldHVybiBpOwogfQorCitzdHJ1Y3QgaW50Y19kZXNjIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IGRldmljZV9ub2RlCSpkZXY7CisJc3RydWN0IGRldmljZV9ub2RlCSppbnRlcnJ1cHRfcGFyZW50OworfTsKKworLyoqCisgKiBvZl9pcnFfaW5pdCAtIFNjYW4gYW5kIGluaXQgbWF0Y2hpbmcgaW50ZXJydXB0IGNvbnRyb2xsZXJzIGluIERUCisgKiBAbWF0Y2hlczogMCB0ZXJtaW5hdGVkIGFycmF5IG9mIG5vZGVzIHRvIG1hdGNoIGFuZCBpbml0IGZ1bmN0aW9uIHRvIGNhbGwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNjYW5zIHRoZSBkZXZpY2UgdHJlZSBmb3IgbWF0Y2hpbmcgaW50ZXJydXB0IGNvbnRyb2xsZXIgbm9kZXMsCisgKiBhbmQgY2FsbHMgdGhlaXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGluIG9yZGVyIHdpdGggcGFyZW50cyBmaXJzdC4KKyAqLwordm9pZCBfX2luaXQgb2ZfaXJxX2luaXQoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcykKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaW50Y19kZXNjICpkZXNjLCAqdGVtcF9kZXNjOworCXN0cnVjdCBsaXN0X2hlYWQgaW50Y19kZXNjX2xpc3QsIGludGNfcGFyZW50X2xpc3Q7CisKKwlJTklUX0xJU1RfSEVBRCgmaW50Y19kZXNjX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpbnRjX3BhcmVudF9saXN0KTsKKworCWZvcl9lYWNoX21hdGNoaW5nX25vZGUobnAsIG1hdGNoZXMpIHsKKwkJaWYgKCFvZl9maW5kX3Byb3BlcnR5KG5wLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiLCBOVUxMKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBIZXJlLCB3ZSBhbGxvY2F0ZSBhbmQgcG9wdWxhdGUgYW4gaW50Y19kZXNjIHdpdGggdGhlIG5vZGUKKwkJICogcG9pbnRlciwgaW50ZXJydXB0LXBhcmVudCBkZXZpY2Vfbm9kZSBldGMuCisJCSAqLworCQlkZXNjID0ga3phbGxvYyhzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKFdBUk5fT04oIWRlc2MpKQorCQkJZ290byBlcnI7CisKKwkJZGVzYy0+ZGV2ID0gbnA7CisJCWRlc2MtPmludGVycnVwdF9wYXJlbnQgPSBvZl9pcnFfZmluZF9wYXJlbnQobnApOworCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5saXN0LCAmaW50Y19kZXNjX2xpc3QpOworCX0KKworCS8qCisJICogVGhlIHJvb3QgaXJxIGNvbnRyb2xsZXIgaXMgdGhlIG9uZSB3aXRob3V0IGFuIGludGVycnVwdC1wYXJlbnQuCisJICogVGhhdCBvbmUgZ29lcyBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIGNvbnRyb2xsZXJzIHRoYXQgcmVmZXJlbmNlIGl0LAorCSAqIGZvbGxvd2VkIGJ5IHRoZSBvbmVzIHRoYXQgcmVmZXJlbmNlIHRoZSAybmQgbGV2ZWwgY29udHJvbGxlcnMsIGV0Yy4KKwkgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmludGNfZGVzY19saXN0KSkgeworCQkvKgorCQkgKiBQcm9jZXNzIGFsbCBjb250cm9sbGVycyB3aXRoIHRoZSBjdXJyZW50ICdwYXJlbnQnLgorCQkgKiBGaXJzdCBwYXNzIHdpbGwgYmUgbG9va2luZyBmb3IgTlVMTCBhcyB0aGUgcGFyZW50LgorCQkgKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IE5VTEwgcGFyZW50IG1lYW5zIGEgcm9vdCBjb250cm9sbGVyLgorCQkgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIHRlbXBfZGVzYywgJmludGNfZGVzY19saXN0LCBsaXN0KSB7CisJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwkJCWludCByZXQ7CisJCQlvZl9pcnFfaW5pdF9jYl90IGlycV9pbml0X2NiOworCisJCQlpZiAoZGVzYy0+aW50ZXJydXB0X3BhcmVudCAhPSBwYXJlbnQpCisJCQkJY29udGludWU7CisKKwkJCWxpc3RfZGVsKCZkZXNjLT5saXN0KTsKKwkJCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBkZXNjLT5kZXYpOworCQkJaWYgKFdBUk4oIW1hdGNoLT5kYXRhLAorCQkJICAgICJvZl9pcnFfaW5pdDogbm8gaW5pdCBmdW5jdGlvbiBmb3IgJXNcbiIsCisJCQkgICAgbWF0Y2gtPmNvbXBhdGlibGUpKSB7CisJCQkJa2ZyZWUoZGVzYyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXByX2RlYnVnKCJvZl9pcnFfaW5pdDogaW5pdCAlcyBAICVwLCBwYXJlbnQgJXBcbiIsCisJCQkJIG1hdGNoLT5jb21wYXRpYmxlLAorCQkJCSBkZXNjLT5kZXYsIGRlc2MtPmludGVycnVwdF9wYXJlbnQpOworCQkJaXJxX2luaXRfY2IgPSBtYXRjaC0+ZGF0YTsKKwkJCXJldCA9IGlycV9pbml0X2NiKGRlc2MtPmRldiwgZGVzYy0+aW50ZXJydXB0X3BhcmVudCk7CisJCQlpZiAocmV0KSB7CisJCQkJa2ZyZWUoZGVzYyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGlzIG9uZSBpcyBub3cgc2V0IHVwOyBhZGQgaXQgdG8gdGhlIHBhcmVudCBsaXN0IHNvCisJCQkgKiBpdHMgY2hpbGRyZW4gY2FuIGdldCBwcm9jZXNzZWQgaW4gYSBzdWJzZXF1ZW50IHBhc3MuCisJCQkgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmxpc3QsICZpbnRjX3BhcmVudF9saXN0KTsKKwkJfQorCisJCS8qIEdldCB0aGUgbmV4dCBwZW5kaW5nIHBhcmVudCB0aGF0IG1pZ2h0IGhhdmUgY2hpbGRyZW4gKi8KKwkJZGVzYyA9IGxpc3RfZmlyc3RfZW50cnkoJmludGNfcGFyZW50X2xpc3QsIHR5cGVvZigqZGVzYyksIGxpc3QpOworCQlpZiAobGlzdF9lbXB0eSgmaW50Y19wYXJlbnRfbGlzdCkgfHwgIWRlc2MpIHsKKwkJCXByX2Vycigib2ZfaXJxX2luaXQ6IGNoaWxkcmVuIHJlbWFpbiwgYnV0IG5vIHBhcmVudHNcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJbGlzdF9kZWwoJmRlc2MtPmxpc3QpOworCQlwYXJlbnQgPSBkZXNjLT5kZXY7CisJCWtmcmVlKGRlc2MpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCB0ZW1wX2Rlc2MsICZpbnRjX3BhcmVudF9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZkZXNjLT5saXN0KTsKKwkJa2ZyZWUoZGVzYyk7CisJfQorZXJyOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCB0ZW1wX2Rlc2MsICZpbnRjX2Rlc2NfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZGVzYy0+bGlzdCk7CisJCWtmcmVlKGRlc2MpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfbWRpby5jIGIvZHJpdmVycy9vZi9vZl9tZGlvLmMKaW5kZXggZDM1ZTMwMC4uOTgwYzA3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9vZl9tZGlvLmMKKysrIGIvZHJpdmVycy9vZi9vZl9tZGlvLmMKQEAgLTgzLDcgKzgzLDYgQEAKIAkJCQlhZGRyKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXBoeV9zY2FuX2ZpeHVwcyhwaHkpOwogCiAJCS8qIEFzc29jaWF0ZSB0aGUgT0Ygbm9kZSB3aXRoIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHNvIGl0CiAJCSAqIGNhbiBiZSBsb29rZWQgdXAgbGF0ZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfbmV0LmMgYi9kcml2ZXJzL29mL29mX25ldC5jCmluZGV4IGJiMTg0NzEuLmZmYWIwMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfbmV0LmMKKysrIGIvZHJpdmVycy9vZi9vZl9uZXQuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyoqCiAgKiBJdCBtYXBzICdlbnVtIHBoeV9pbnRlcmZhY2VfdCcgZm91bmQgaW4gaW5jbHVkZS9saW51eC9waHkuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9vZl9wY2kuYyBiL2RyaXZlcnMvb2Yvb2ZfcGNpLmMKaW5kZXggMzcwMWI2Mi4uMTNlMzdlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9vZl9wY2kuYworKysgYi9kcml2ZXJzL29mL29mX3BjaS5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfcGNpX2lycS5jIGIvZHJpdmVycy9vZi9vZl9wY2lfaXJxLmMKaW5kZXggYWMxZWM1NC4uOTMxMjUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9vZl9wY2lfaXJxLmMKKysrIGIvZHJpdmVycy9vZi9vZl9wY2lfaXJxLmMKQEAgLTEsNiArMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX3NwaS5jIGIvZHJpdmVycy9vZi9vZl9zcGkuYwppbmRleCAxZGJjZTU4Li42ZGJjMDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL29mX3NwaS5jCisrKyBiL2RyaXZlcnMvb2Yvb2Zfc3BpLmMKQEAgLTYsNiArNiw3IEBACiAgKiB0cmVlLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvcGR0LmMgYi9kcml2ZXJzL29mL3BkdC5jCmluZGV4IDRkODdiNWQuLmJjNWIzOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvcGR0LmMKKysrIGIvZHJpdmVycy9vZi9wZHQuYwpAQCAtMjI5LDYgKzIyOSwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkICprZXJuZWxfdHJlZV9hbGxvYyh1NjQgc2l6ZSwgdTY0IGFsaWduKQoreworCXJldHVybiBwcm9tX2Vhcmx5X2FsbG9jKHNpemUpOworfQorCiB2b2lkIF9faW5pdCBvZl9wZHRfYnVpbGRfZGV2aWNldHJlZShwaGFuZGxlIHJvb3Rfbm9kZSwgc3RydWN0IG9mX3BkdF9vcHMgKm9wcykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKipuZXh0cDsKQEAgLTI0NSw0ICsyNTAsNyBAQAogCW5leHRwID0gJmFsbG5vZGVzLT5hbGxuZXh0OwogCWFsbG5vZGVzLT5jaGlsZCA9IG9mX3BkdF9idWlsZF90cmVlKGFsbG5vZGVzLAogCQkJb2ZfcGR0X3Byb21fb3BzLT5nZXRjaGlsZChhbGxub2Rlcy0+cGhhbmRsZSksICZuZXh0cCk7CisKKwkvKiBHZXQgcG9pbnRlciB0byAiL2Nob3NlbiIgYW5kICIvYWxpYXNhcyIgbm9kZXMgZm9yIHVzZSBldmVyeXdoZXJlICovCisJb2ZfYWxpYXNfc2NhbihrZXJuZWxfdHJlZV9hbGxvYyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL3BsYXRmb3JtLmMgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKaW5kZXggZWQ1YTZkMy4uY2JkNWQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvb2YvcGxhdGZvcm0uYwpAQCAtMzEwLDE4ICszMTAsMjEgQEAKIAkJCQkgc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwotCWlmIChsb29rdXApIHsKLQkJZm9yKDsgbG9va3VwLT5uYW1lICE9IE5VTEw7IGxvb2t1cCsrKSB7Ci0JCQlpZiAoIW9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCBsb29rdXAtPmNvbXBhdGlibGUpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJlcy5zdGFydCAhPSBsb29rdXAtPnBoeXNfYWRkcikKLQkJCQljb250aW51ZTsKLQkJCXByX2RlYnVnKCIlczogZGV2bmFtZT0lc1xuIiwgbnAtPmZ1bGxfbmFtZSwgbG9va3VwLT5uYW1lKTsKLQkJCXJldHVybiBsb29rdXA7Ci0JCX0KKworCWlmICghbG9va3VwKQorCQlyZXR1cm4gTlVMTDsKKworCWZvcig7IGxvb2t1cC0+bmFtZSAhPSBOVUxMOyBsb29rdXArKykgeworCQlpZiAoIW9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCBsb29rdXAtPmNvbXBhdGlibGUpKQorCQkJY29udGludWU7CisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmVzLnN0YXJ0ICE9IGxvb2t1cC0+cGh5c19hZGRyKQorCQkJY29udGludWU7CisJCXByX2RlYnVnKCIlczogZGV2bmFtZT0lc1xuIiwgbnAtPmZ1bGxfbmFtZSwgbG9va3VwLT5uYW1lKTsKKwkJcmV0dXJuIGxvb2t1cDsKIAl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzI5LDggKzMzMiw5IEBACiAgKiBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKCkgLSBDcmVhdGUgYSBkZXZpY2UgZm9yIGEgbm9kZSBhbmQgaXRzIGNoaWxkcmVuLgogICogQGJ1czogZGV2aWNlIG5vZGUgb2YgdGhlIGJ1cyB0byBpbnN0YW50aWF0ZQogICogQG1hdGNoZXM6IG1hdGNoIHRhYmxlIGZvciBidXMgbm9kZXMKLSAqIGRpc2FsbG93IHJlY3Vyc2l2ZSBjcmVhdGlvbiBvZiBjaGlsZCBidXNlcworICogQGxvb2t1cDogYXV4ZGF0YSB0YWJsZSBmb3IgbWF0Y2hpbmcgaWQgYW5kIHBsYXRmb3JtX2RhdGEgd2l0aCBkZXZpY2Ugbm9kZXMKICAqIEBwYXJlbnQ6IHBhcmVudCBmb3IgbmV3IGRldmljZSwgb3IgTlVMTCBmb3IgdG9wIGxldmVsLgorICogQHN0cmljdDogcmVxdWlyZSBjb21wYXRpYmxlIHByb3BlcnR5CiAgKgogICogQ3JlYXRlcyBhIHBsYXRmb3JtX2RldmljZSBmb3IgdGhlIHByb3ZpZGVkIGRldmljZV9ub2RlLCBhbmQgb3B0aW9uYWxseQogICogcmVjdXJzaXZlbHkgY3JlYXRlIGRldmljZXMgZm9yIGFsbCB0aGUgY2hpbGQgbm9kZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jIGIvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYwppbmRleCA3NWE4MGU0NmIuLjhiNDkwZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pb21tdS1oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4JCS8qIGZvciBMMV9DQUNIRV9CWVRFUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2Mvc2JhX2lvbW11LmMgYi9kcml2ZXJzL3BhcmlzYy9zYmFfaW9tbXUuYwppbmRleCBhNmY3NjIxLi44NjQ0ZDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9zYmFfaW9tbXUuYworKysgYi9kcml2ZXJzL3BhcmlzYy9zYmFfaW9tbXUuYwpAQCAtMzksNiArMzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vcm9wZXMuaD4KICNpbmNsdWRlIDxhc20vbWNraW5sZXkuaD4JLyogZm9yIHByb2NfbWNraW5sZXlfcm9vdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvS2NvbmZpZyBiL2RyaXZlcnMvcGNpL0tjb25maWcKaW5kZXggMGZhNDY2YS4uYjZmOTc0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjaS9LY29uZmlnCkBAIC01MSwxNyArNTEsNiBAQAogICAgICAgICAgIFRoZSBQQ0kgZGV2aWNlIGZyb250ZW5kIGRyaXZlciBhbGxvd3MgdGhlIGtlcm5lbCB0byBpbXBvcnQgYXJiaXRyYXJ5CiAgICAgICAgICAgUENJIGRldmljZXMgZnJvbSBhIFBDSSBiYWNrZW5kIHRvIHN1cHBvcnQgUENJIGRyaXZlciBkb21haW5zLgogCi1jb25maWcgWEVOX1BDSURFVl9GRV9ERUJVRwotICAgICAgICBib29sICJYZW4gUENJIEZyb250ZW5kIGRlYnVnZ2luZyIKLSAgICAgICAgZGVwZW5kcyBvbiBYRU5fUENJREVWX0ZST05URU5EICYmIFBDSV9ERUJVRwotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIFhlbiBQQ0kgZnJvbnRlbmQgdG8gcHJvZHVjZSBhIGJ1bmNoIG9mIGRlYnVnCi0JICBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIGxvZy4gIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgaGF2aW5nIGEKLQkgIHByb2JsZW0gd2l0aCBYZW4gUENJIGZyb250ZW5kIHN1cHBvcnQgYW5kIHdhbnQgdG8gc2VlIG1vcmUgb2Ygd2hhdCBpcwotCSAgZ29pbmcgb24uCi0KLQkgIFdoZW4gaW4gZG91YnQsIHNheSBOLgotCiBjb25maWcgSFRfSVJRCiAJYm9vbCAiSW50ZXJydXB0cyBvbiBoeXBlcnRyYW5zcG9ydCBkZXZpY2VzIgogCWRlZmF1bHQgeQpAQCAtNzEsOSArNjAsMTMgQEAKIAogCSAgIElmIHVuc3VyZSBzYXkgWS4KIAorY29uZmlnIFBDSV9BVFMKKwlib29sCisKIGNvbmZpZyBQQ0lfSU9WCiAJYm9vbCAiUENJIElPViBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCisJc2VsZWN0IFBDSV9BVFMKIAloZWxwCiAJICBJL08gVmlydHVhbGl6YXRpb24gaXMgYSBQQ0kgZmVhdHVyZSBzdXBwb3J0ZWQgYnkgc29tZSBkZXZpY2VzCiAJICB3aGljaCBhbGxvd3MgdGhlbSB0byBjcmVhdGUgdmlydHVhbCBkZXZpY2VzIHdoaWNoIHNoYXJlIHRoZWlyCkBAIC04MSw2ICs3NCwyOCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgUENJX1BSSQorCWJvb2wgIlBDSSBQUkkgc3VwcG9ydCIKKwlzZWxlY3QgUENJX0FUUworCWhlbHAKKwkgIFBSSSBpcyB0aGUgUENJIFBhZ2UgUmVxdWVzdCBJbnRlcmZhY2UuIEl0IGFsbG93cyBQQ0kgZGV2aWNlcyB0aGF0IGFyZQorCSAgYmVoaW5kIGFuIElPTU1VIHRvIHJlY292ZXIgZnJvbSBwYWdlIGZhdWx0cy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDSV9QQVNJRAorCWJvb2wgIlBDSSBQQVNJRCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJc2VsZWN0IFBDSV9BVFMKKwloZWxwCisJICBQcm9jZXNzIEFkZHJlc3MgU3BhY2UgSWRlbnRpZmllcnMgKFBBU0lEcykgY2FuIGJlIHVzZWQgYnkgUENJIGRldmljZXMKKwkgIHRvIGFjY2VzcyBtb3JlIHRoYW4gb25lIElPIGFkZHJlc3Mgc3BhY2UgYXQgdGhlIHNhbWUgdGltZS4gVG8gbWFrZQorCSAgdXNlIG9mIHRoaXMgZmVhdHVyZSBhbiBJT01NVSBpcyByZXF1aXJlZCB3aGljaCBhbHNvIHN1cHBvcnRzIFBBU0lEcy4KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBzdWNoIGFuIElPTU1VIGFuZCB3YW50IHRvIGNvbXBpbGUgdGhlCisJICBkcml2ZXIgZm9yIGl0IGludG8geW91ciBrZXJuZWwuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBQQ0lfSU9BUElDCiAJYm9vbAogCWRlcGVuZHMgb24gUENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDZmYWRhZTMuLjA4M2E0OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC0yOSw2ICsyOSw3IEBACiAjIEJ1aWxkIHRoZSBIeXBlcnRyYW5zcG9ydCBpbnRlcnJ1cHQgc3VwcG9ydAogb2JqLSQoQ09ORklHX0hUX0lSUSkgKz0gaHRpcnEubwogCitvYmotJChDT05GSUdfUENJX0FUUykgKz0gYXRzLm8KIG9iai0kKENPTkZJR19QQ0lfSU9WKSArPSBpb3YubwogCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9hdHMuYyBiL2RyaXZlcnMvcGNpL2F0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzU2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9hdHMuYwpAQCAtMCwwICsxLDQzOSBAQAorLyoKKyAqIGRyaXZlcnMvcGNpL2F0cy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEludGVsIENvcnBvcmF0aW9uLCBZdSBaaGFvIDx5dS56aGFvQGludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLAorICoKKyAqIFBDSSBFeHByZXNzIEkvTyBWaXJ0dWFsaXphdGlvbiAoSU9WKSBzdXBwb3J0LgorICogICBBZGRyZXNzIFRyYW5zbGF0aW9uIFNlcnZpY2UgMS4wCisgKiAgIFBhZ2UgUmVxdWVzdCBJbnRlcmZhY2UgYWRkZWQgYnkgSm9lcmcgUm9lZGVsIDxqb2VyZy5yb2VkZWxAYW1kLmNvbT4KKyAqICAgUEFTSUQgc3VwcG9ydCBhZGRlZCBieSBKb2VyZyBSb2VkZWwgPGpvZXJnLnJvZWRlbEBhbWQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktYXRzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJwY2kuaCIKKworc3RhdGljIGludCBhdHNfYWxsb2Nfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwcykKK3sKKwlpbnQgcG9zOworCXUxNiBjYXA7CisJc3RydWN0IHBjaV9hdHMgKmF0czsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfQVRTKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhdHMgPSBremFsbG9jKHNpemVvZigqYXRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhdHMpCisJCXJldHVybiAtRU5PTUVNOworCisJYXRzLT5wb3MgPSBwb3M7CisJYXRzLT5zdHUgPSBwczsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9BVFNfQ0FQLCAmY2FwKTsKKwlhdHMtPnFkZXAgPSBQQ0lfQVRTX0NBUF9RREVQKGNhcCkgPyBQQ0lfQVRTX0NBUF9RREVQKGNhcCkgOgorCQkJCQkgICAgUENJX0FUU19NQVhfUURFUDsKKwlkZXYtPmF0cyA9IGF0czsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdHNfZnJlZV9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlrZnJlZShkZXYtPmF0cyk7CisJZGV2LT5hdHMgPSBOVUxMOworfQorCisvKioKKyAqIHBjaV9lbmFibGVfYXRzIC0gZW5hYmxlIHRoZSBBVFMgY2FwYWJpbGl0eQorICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqIEBwczogdGhlIElPTU1VIHBhZ2Ugc2hpZnQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgb24gZmFpbHVyZS4KKyAqLworaW50IHBjaV9lbmFibGVfYXRzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwcykKK3sKKwlpbnQgcmM7CisJdTE2IGN0cmw7CisKKwlCVUdfT04oZGV2LT5hdHMgJiYgZGV2LT5hdHMtPmlzX2VuYWJsZWQpOworCisJaWYgKHBzIDwgUENJX0FUU19NSU5fU1RVKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkZXYtPmlzX3BoeXNmbiB8fCBkZXYtPmlzX3ZpcnRmbikgeworCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+aXNfcGh5c2ZuID8gZGV2IDogZGV2LT5waHlzZm47CisKKwkJbXV0ZXhfbG9jaygmcGRldi0+c3Jpb3YtPmxvY2spOworCQlpZiAocGRldi0+YXRzKQorCQkJcmMgPSBwZGV2LT5hdHMtPnN0dSA9PSBwcyA/IDAgOiAtRUlOVkFMOworCQllbHNlCisJCQlyYyA9IGF0c19hbGxvY19vbmUocGRldiwgcHMpOworCisJCWlmICghcmMpCisJCQlwZGV2LT5hdHMtPnJlZl9jbnQrKzsKKwkJbXV0ZXhfdW5sb2NrKCZwZGV2LT5zcmlvdi0+bG9jayk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwlpZiAoIWRldi0+aXNfcGh5c2ZuKSB7CisJCXJjID0gYXRzX2FsbG9jX29uZShkZXYsIHBzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCWN0cmwgPSBQQ0lfQVRTX0NUUkxfRU5BQkxFOworCWlmICghZGV2LT5pc192aXJ0Zm4pCisJCWN0cmwgfD0gUENJX0FUU19DVFJMX1NUVShwcyAtIFBDSV9BVFNfTUlOX1NUVSk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgZGV2LT5hdHMtPnBvcyArIFBDSV9BVFNfQ1RSTCwgY3RybCk7CisKKwlkZXYtPmF0cy0+aXNfZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9lbmFibGVfYXRzKTsKKworLyoqCisgKiBwY2lfZGlzYWJsZV9hdHMgLSBkaXNhYmxlIHRoZSBBVFMgY2FwYWJpbGl0eQorICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqLwordm9pZCBwY2lfZGlzYWJsZV9hdHMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MTYgY3RybDsKKworCUJVR19PTighZGV2LT5hdHMgfHwgIWRldi0+YXRzLT5pc19lbmFibGVkKTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgZGV2LT5hdHMtPnBvcyArIFBDSV9BVFNfQ1RSTCwgJmN0cmwpOworCWN0cmwgJj0gflBDSV9BVFNfQ1RSTF9FTkFCTEU7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgZGV2LT5hdHMtPnBvcyArIFBDSV9BVFNfQ1RSTCwgY3RybCk7CisKKwlkZXYtPmF0cy0+aXNfZW5hYmxlZCA9IDA7CisKKwlpZiAoZGV2LT5pc19waHlzZm4gfHwgZGV2LT5pc192aXJ0Zm4pIHsKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPmlzX3BoeXNmbiA/IGRldiA6IGRldi0+cGh5c2ZuOworCisJCW11dGV4X2xvY2soJnBkZXYtPnNyaW92LT5sb2NrKTsKKwkJcGRldi0+YXRzLT5yZWZfY250LS07CisJCWlmICghcGRldi0+YXRzLT5yZWZfY250KQorCQkJYXRzX2ZyZWVfb25lKHBkZXYpOworCQltdXRleF91bmxvY2soJnBkZXYtPnNyaW92LT5sb2NrKTsKKwl9CisKKwlpZiAoIWRldi0+aXNfcGh5c2ZuKQorCQlhdHNfZnJlZV9vbmUoZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9kaXNhYmxlX2F0cyk7CisKKy8qKgorICogcGNpX2F0c19xdWV1ZV9kZXB0aCAtIHF1ZXJ5IHRoZSBBVFMgSW52YWxpZGF0ZSBRdWV1ZSBEZXB0aAorICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIHRoZSBxdWV1ZSBkZXB0aCBvbiBzdWNjZXNzLCBvciBuZWdhdGl2ZSBvbiBmYWlsdXJlLgorICoKKyAqIFRoZSBBVFMgc3BlYyB1c2VzIDAgaW4gdGhlIEludmFsaWRhdGUgUXVldWUgRGVwdGggZmllbGQgdG8KKyAqIGluZGljYXRlIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbiBhY2NlcHQgMzIgSW52YWxpZGF0ZSBSZXF1ZXN0LgorICogQnV0IGhlcmUgd2UgdXNlIHRoZSBgcmVhbCcgdmFsdWVzIChpLmUuIDF+MzIpIGZvciB0aGUgUXVldWUKKyAqIERlcHRoOyBhbmQgMCBpbmRpY2F0ZXMgdGhlIGZ1bmN0aW9uIHNoYXJlcyB0aGUgUXVldWUgd2l0aAorICogb3RoZXIgZnVuY3Rpb25zIChkb2Vzbid0IGV4Y2x1c2l2ZWx5IG93biBhIFF1ZXVlKS4KKyAqLworaW50IHBjaV9hdHNfcXVldWVfZGVwdGgoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgcG9zOworCXUxNiBjYXA7CisKKwlpZiAoZGV2LT5pc192aXJ0Zm4pCisJCXJldHVybiAwOworCisJaWYgKGRldi0+YXRzKQorCQlyZXR1cm4gZGV2LT5hdHMtPnFkZXA7CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0FUUyk7CisJaWYgKCFwb3MpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfQVRTX0NBUCwgJmNhcCk7CisKKwlyZXR1cm4gUENJX0FUU19DQVBfUURFUChjYXApID8gUENJX0FUU19DQVBfUURFUChjYXApIDoKKwkJCQkgICAgICAgUENJX0FUU19NQVhfUURFUDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9hdHNfcXVldWVfZGVwdGgpOworCisjaWZkZWYgQ09ORklHX1BDSV9QUkkKKy8qKgorICogcGNpX2VuYWJsZV9wcmkgLSBFbmFibGUgUFJJIGNhcGFiaWxpdHkKKyAqIEAgcGRldjogUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IKKyAqLworaW50IHBjaV9lbmFibGVfcHJpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgcmVxcykKK3sKKwl1MTYgY29udHJvbCwgc3RhdHVzOworCXUzMiBtYXhfcmVxdWVzdHM7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9QUklfQ0FQKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUFJJX0NPTlRST0xfT0ZGLCAmY29udHJvbCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BSSV9TVEFUVVNfT0ZGLCAgJnN0YXR1cyk7CisJaWYgKChjb250cm9sICYgUENJX1BSSV9FTkFCTEUpIHx8ICEoc3RhdHVzICYgUENJX1BSSV9TVEFUVVNfU1RPUFBFRCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcG9zICsgUENJX1BSSV9NQVhfUkVRX09GRiwgJm1heF9yZXF1ZXN0cyk7CisJcmVxcyA9IG1pbihtYXhfcmVxdWVzdHMsIHJlcXMpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgcG9zICsgUENJX1BSSV9BTExPQ19SRVFfT0ZGLCByZXFzKTsKKworCWNvbnRyb2wgfD0gUENJX1BSSV9FTkFCTEU7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfQ09OVFJPTF9PRkYsIGNvbnRyb2wpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfZW5hYmxlX3ByaSk7CisKKy8qKgorICogcGNpX2Rpc2FibGVfcHJpIC0gRGlzYWJsZSBQUkkgY2FwYWJpbGl0eQorICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogT25seSBjbGVhcnMgdGhlIGVuYWJsZWQtYml0LCByZWdhcmRsZXNzIG9mIGl0cyBmb3JtZXIgdmFsdWUKKyAqLwordm9pZCBwY2lfZGlzYWJsZV9wcmkoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IGNvbnRyb2w7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9QUklfQ0FQKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BSSV9DT05UUk9MX09GRiwgJmNvbnRyb2wpOworCWNvbnRyb2wgJj0gflBDSV9QUklfRU5BQkxFOworCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUFJJX0NPTlRST0xfT0ZGLCBjb250cm9sKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9kaXNhYmxlX3ByaSk7CisKKy8qKgorICogcGNpX3ByaV9lbmFibGVkIC0gQ2hlY2tzIGlmIFBSSSBjYXBhYmlsaXR5IGlzIGVuYWJsZWQKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBQUkkgaXMgZW5hYmxlZCBvbiB0aGUgZGV2aWNlLCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCBwY2lfcHJpX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IGNvbnRyb2w7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9QUklfQ0FQKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIGZhbHNlOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BSSV9DT05UUk9MX09GRiwgJmNvbnRyb2wpOworCisJcmV0dXJuIChjb250cm9sICYgUENJX1BSSV9FTkFCTEUpID8gdHJ1ZSA6IGZhbHNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3ByaV9lbmFibGVkKTsKKworLyoqCisgKiBwY2lfcmVzZXRfcHJpIC0gUmVzZXRzIGRldmljZSdzIFBSSSBzdGF0ZQorICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhlIFBSSSBjYXBhYmlsaXR5IG11c3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgorICovCitpbnQgcGNpX3Jlc2V0X3ByaShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MTYgY29udHJvbDsKKwlpbnQgcG9zOworCisJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX1BSSV9DQVApOworCWlmICghcG9zKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfQ09OVFJPTF9PRkYsICZjb250cm9sKTsKKwlpZiAoY29udHJvbCAmIFBDSV9QUklfRU5BQkxFKQorCQlyZXR1cm4gLUVCVVNZOworCisJY29udHJvbCB8PSBQQ0lfUFJJX1JFU0VUOworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfQ09OVFJPTF9PRkYsIGNvbnRyb2wpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfcmVzZXRfcHJpKTsKKworLyoqCisgKiBwY2lfcHJpX3N0b3BwZWQgLSBDaGVja3Mgd2hldGhlciB0aGUgUFJJIGNhcGFiaWxpdHkgaXMgc3RvcHBlZAorICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBQUkkgY2FwYWJpbGl0eSBvbiB0aGUgZGV2aWNlIGlzIGRpc2FibGVkIGFuZCB0aGUKKyAqIGRldmljZSBoYXMgbm8gb3V0c3RhbmRpbmcgUFJJIHJlcXVlc3RzLCBmYWxzZSBvdGhlcndpc2UuIFRoZSBkZXZpY2UKKyAqIGluZGljYXRlcyB0aGlzIHZpYSB0aGUgU1RPUFBFRCBiaXQgaW4gdGhlIHN0YXR1cyByZWdpc3RlciBvZiB0aGUKKyAqIGNhcGFiaWxpdHkuCisgKiBUaGUgZGV2aWNlIGludGVybmFsIHN0YXRlIGNhbiBiZSBjbGVhcmVkIGJ5IHJlc2V0dGluZyB0aGUgUFJJIHN0YXRlCisgKiB3aXRoIHBjaV9yZXNldF9wcmkoKS4gVGhpcyBjYW4gZm9yY2UgdGhlIGNhcGFiaWxpdHkgaW50byB0aGUgU1RPUFBFRAorICogc3RhdGUuCisgKi8KK2Jvb2wgcGNpX3ByaV9zdG9wcGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBjb250cm9sLCBzdGF0dXM7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9QUklfQ0FQKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIHRydWU7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUFJJX0NPTlRST0xfT0ZGLCAmY29udHJvbCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BSSV9TVEFUVVNfT0ZGLCAgJnN0YXR1cyk7CisKKwlpZiAoY29udHJvbCAmIFBDSV9QUklfRU5BQkxFKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gKHN0YXR1cyAmIFBDSV9QUklfU1RBVFVTX1NUT1BQRUQpID8gdHJ1ZSA6IGZhbHNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3ByaV9zdG9wcGVkKTsKKworLyoqCisgKiBwY2lfcHJpX3N0YXR1cyAtIFJlcXVlc3QgUFJJIHN0YXR1cyBvZiBhIGRldmljZQorICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLCBzdGF0dXMgb24gc3VjY2Vzcy4gVGhlIHN0YXR1cyBjYW4KKyAqIGJlIGNoZWNrZWQgYWdhaW5zdCBzdGF0dXMtYml0cy4gU3VwcG9ydGVkIGJpdHMgYXJlIGN1cnJlbnRseToKKyAqIFBDSV9QUklfU1RBVFVTX1JGOiAgICAgIFJlc3BvbnNlIGZhaWx1cmUKKyAqIFBDSV9QUklfU1RBVFVTX1VQUkdJOiAgIFVuZXhwZWN0ZWQgUGFnZSBSZXF1ZXN0IEdyb3VwIEluZGV4CisgKiBQQ0lfUFJJX1NUQVRVU19TVE9QUEVEOiBQUkkgaGFzIHN0b3BwZWQKKyAqLworaW50IHBjaV9wcmlfc3RhdHVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBzdGF0dXMsIGNvbnRyb2w7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9QUklfQ0FQKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUFJJX0NPTlRST0xfT0ZGLCAmY29udHJvbCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BSSV9TVEFUVVNfT0ZGLCAgJnN0YXR1cyk7CisKKwkvKiBTdG9wcGVkIGJpdCBpcyB1bmRlZmluZWQgd2hlbiBlbmFibGUgPT0gMSwgc28gY2xlYXIgaXQgKi8KKwlpZiAoY29udHJvbCAmIFBDSV9QUklfRU5BQkxFKQorCQlzdGF0dXMgJj0gflBDSV9QUklfU1RBVFVTX1NUT1BQRUQ7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3ByaV9zdGF0dXMpOworI2VuZGlmIC8qIENPTkZJR19QQ0lfUFJJICovCisKKyNpZmRlZiBDT05GSUdfUENJX1BBU0lECisvKioKKyAqIHBjaV9lbmFibGVfcGFzaWQgLSBFbmFibGUgdGhlIFBBU0lEIGNhcGFiaWxpdHkKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICogQGZlYXR1cmVzOiBGZWF0dXJlcyB0byBlbmFibGUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuIFRoaXMgZnVuY3Rpb24gY2hlY2tzCisgKiB3aGV0aGVyIHRoZSBmZWF0dXJlcyBhcmUgYWN0dWFsbHkgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgYW5kIHJldHVybnMKKyAqIGFuIGVycm9yIGlmIG5vdC4KKyAqLworaW50IHBjaV9lbmFibGVfcGFzaWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBmZWF0dXJlcykKK3sKKwl1MTYgY29udHJvbCwgc3VwcG9ydGVkOworCWludCBwb3M7CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfUEFTSURfQ0FQKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUEFTSURfQ09OVFJPTF9PRkYsICZjb250cm9sKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUEFTSURfQ0FQX09GRiwgICAgICZzdXBwb3J0ZWQpOworCisJaWYgKCEoc3VwcG9ydGVkICYgUENJX1BBU0lEX0VOQUJMRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3VwcG9ydGVkICY9IFBDSV9QQVNJRF9FWEVDIHwgUENJX1BBU0lEX1BSSVY7CisKKwkvKiBVc2VyIHdhbnRzIHRvIGVuYWJsZSBhbnl0aGluZyB1bnN1cHBvcnRlZD8gKi8KKwlpZiAoKHN1cHBvcnRlZCAmIGZlYXR1cmVzKSAhPSBmZWF0dXJlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb250cm9sID0gUENJX1BBU0lEX0VOQUJMRSB8IGZlYXR1cmVzOworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QQVNJRF9DT05UUk9MX09GRiwgY29udHJvbCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9lbmFibGVfcGFzaWQpOworCisvKioKKyAqIHBjaV9kaXNhYmxlX3Bhc2lkIC0gRGlzYWJsZSB0aGUgUEFTSUQgY2FwYWJpbGl0eQorICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICovCit2b2lkIHBjaV9kaXNhYmxlX3Bhc2lkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBjb250cm9sID0gMDsKKwlpbnQgcG9zOworCisJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX1BBU0lEX0NBUCk7CisJaWYgKCFwb3MpCisJCXJldHVybjsKKworCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUEFTSURfQ09OVFJPTF9PRkYsIGNvbnRyb2wpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2Rpc2FibGVfcGFzaWQpOworCisvKioKKyAqIHBjaV9wYXNpZF9mZWF0dXJlcyAtIENoZWNrIHdoaWNoIFBBU0lEIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSB3aGVuIG5vIFBBU0kgY2FwYWJpbGl0eSBpcyBwcmVzZW50LgorICogT3RoZXJ3aXNlIGlzIHJldHVybnMgYSBiaXRtYXNrIHdpdGggc3VwcG9ydGVkIGZlYXR1cmVzLiBDdXJyZW50CisgKiBmZWF0dXJlcyByZXBvcnRlZCBhcmU6CisgKiBQQ0lfUEFTSURfRU5BQkxFIC0gUEFTSUQgY2FwYWJpbGl0eSBjYW4gYmUgZW5hYmxlZAorICogUENJX1BBU0lEX0VYRUMgLSBFeGVjdXRlIHBlcm1pc3Npb24gc3VwcG9ydGVkCisgKiBQQ0lfUEFTSURfUFJJViAtIFByaXZpbGVkZ2VkIG1vZGUgc3VwcG9ydGVkCisgKi8KK2ludCBwY2lfcGFzaWRfZmVhdHVyZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IHN1cHBvcnRlZDsKKwlpbnQgcG9zOworCisJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX1BBU0lEX0NBUCk7CisJaWYgKCFwb3MpCisJCXJldHVybiAtRUlOVkFMOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BBU0lEX0NBUF9PRkYsICZzdXBwb3J0ZWQpOworCisJc3VwcG9ydGVkICY9IFBDSV9QQVNJRF9FTkFCTEUgfCBQQ0lfUEFTSURfRVhFQyB8IFBDSV9QQVNJRF9QUklWOworCisJcmV0dXJuIHN1cHBvcnRlZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9wYXNpZF9mZWF0dXJlcyk7CisKKyNkZWZpbmUgUEFTSURfTlVNQkVSX1NISUZUCTgKKyNkZWZpbmUgUEFTSURfTlVNQkVSX01BU0sJKDB4MWYgPDwgUEFTSURfTlVNQkVSX1NISUZUKQorLyoqCisgKiBwY2lfbWF4X3Bhc2lkIC0gR2V0IG1heGltdW0gbnVtYmVyIG9mIFBBU0lEcyBzdXBwb3J0ZWQgYnkgZGV2aWNlCisgKiBAcGRldjogUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlIHdoZW4gUEFTSUQgY2FwYWJpbGl0eSBpcyBub3QgcHJlc2VudC4KKyAqIE90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBudW1lciBvZiBzdXBwb3J0ZWQgUEFTSURzLgorICovCitpbnQgcGNpX21heF9wYXNpZHMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IHN1cHBvcnRlZDsKKwlpbnQgcG9zOworCisJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX1BBU0lEX0NBUCk7CisJaWYgKCFwb3MpCisJCXJldHVybiAtRUlOVkFMOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BBU0lEX0NBUF9PRkYsICZzdXBwb3J0ZWQpOworCisJc3VwcG9ydGVkID0gKHN1cHBvcnRlZCAmIFBBU0lEX05VTUJFUl9NQVNLKSA+PiBQQVNJRF9OVU1CRVJfU0hJRlQ7CisKKwlyZXR1cm4gKDEgPDwgc3VwcG9ydGVkKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9tYXhfcGFzaWRzKTsKKyNlbmRpZiAvKiBDT05GSUdfUENJX1BBU0lEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnLXBjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy1wY2kuYwppbmRleCA0ZDRhNjQ0Ny4uZDM1MDljZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy1wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnLXBjaS5jCkBAIC0xLDYgKzEsNyBAQAogLyogQ29yZSBQQ0kgZnVuY3Rpb25hbGl0eSB1c2VkIG9ubHkgYnkgUENJIGhvdHBsdWcgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgInBjaS5oIgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IDIyMDI4NTcuLjU5NjE3MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogCiAjaW5jbHVkZSAiLi4vcGNpLmgiCiAjaW5jbHVkZSAiYWNwaXBocC5oIgpAQCAtMTE0OSwxNSArMTE1MCwzNSBAQAogCXJldHVybiBBRV9PSyA7CiB9CiAKLS8qKgotICogaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlIC0gaGFuZGxlIEFDUEkgZXZlbnQgb24gYnJpZGdlcwotICogQGhhbmRsZTogTm90aWZ5KCknZWQgYWNwaV9oYW5kbGUKLSAqIEB0eXBlOiBOb3RpZnkgY29kZQotICogQGNvbnRleHQ6IHBvaW50ZXIgdG8gYWNwaXBocF9icmlkZ2Ugc3RydWN0dXJlCi0gKgotICogSGFuZGxlcyBBQ1BJIGV2ZW50IG5vdGlmaWNhdGlvbiBvbiB7aG9zdCxwMnB9IGJyaWRnZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLCB2b2lkICpjb250ZXh0KQorc3RydWN0IGFjcGlwaHBfaHBfd29yayB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXUzMiB0eXBlOworCXZvaWQgKmNvbnRleHQ7Cit9OworCitzdGF0aWMgdm9pZCBhbGxvY19hY3BpcGhwX2hwX3dvcmsoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwKKwkJCQkgIHZvaWQgKmNvbnRleHQsCisJCQkJICB2b2lkICgqZnVuYykoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSkKK3sKKwlzdHJ1Y3QgYWNwaXBocF9ocF93b3JrICpocF93b3JrOworCWludCByZXQ7CisKKwlocF93b3JrID0ga21hbGxvYyhzaXplb2YoKmhwX3dvcmspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwX3dvcmspCisJCXJldHVybjsKKworCWhwX3dvcmstPmhhbmRsZSA9IGhhbmRsZTsKKwlocF93b3JrLT50eXBlID0gdHlwZTsKKwlocF93b3JrLT5jb250ZXh0ID0gY29udGV4dDsKKworCUlOSVRfV09SSygmaHBfd29yay0+d29yaywgZnVuYyk7CisJcmV0ID0gcXVldWVfd29yayhrYWNwaV9ob3RwbHVnX3dxLCAmaHBfd29yay0+d29yayk7CisJaWYgKCFyZXQpCisJCWtmcmVlKGhwX3dvcmspOworfQorCitzdGF0aWMgdm9pZCBfaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZTsKIAljaGFyIG9iam5hbWVbNjRdOwpAQCAtMTE2NSwxMSArMTE4NiwxOCBAQAogCQkJCSAgICAgIC5wb2ludGVyID0gb2JqbmFtZSB9OwogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwogCWludCBudW1fc3ViX2JyaWRnZXMgPSAwOworCXN0cnVjdCBhY3BpcGhwX2hwX3dvcmsgKmhwX3dvcms7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXUzMiB0eXBlOworCisJaHBfd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWNwaXBocF9ocF93b3JrLCB3b3JrKTsKKwloYW5kbGUgPSBocF93b3JrLT5oYW5kbGU7CisJdHlwZSA9IGhwX3dvcmstPnR5cGU7CiAKIAlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpKSB7CiAJCS8qIFRoaXMgYnJpZGdlIG11c3QgaGF2ZSBqdXN0IGJlZW4gcGh5c2ljYWxseSBpbnNlcnRlZCAqLwogCQloYW5kbGVfYnJpZGdlX2luc2VydGlvbihoYW5kbGUsIHR5cGUpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCWJyaWRnZSA9IGFjcGlwaHBfaGFuZGxlX3RvX2JyaWRnZShoYW5kbGUpOwpAQCAtMTE4MCw3ICsxMjA4LDcgQEAKIAogCWlmICghYnJpZGdlICYmICFudW1fc3ViX2JyaWRnZXMpIHsKIAkJZXJyKCJjYW5ub3QgZ2V0IGJyaWRnZSBpbmZvXG4iKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKQEAgLTEyNDEsMjIgKzEyNjksNDkgQEAKIAkJd2Fybigibm90aWZ5X2hhbmRsZXI6IHVua25vd24gZXZlbnQgdHlwZSAweCV4IGZvciAlc1xuIiwgdHlwZSwgb2JqbmFtZSk7CiAJCWJyZWFrOwogCX0KKworb3V0OgorCWtmcmVlKGhwX3dvcmspOyAvKiBhbGxvY2F0ZWQgaW4gaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlICovCiB9CiAKIC8qKgotICogaGFuZGxlX2hvdHBsdWdfZXZlbnRfZnVuYyAtIGhhbmRsZSBBQ1BJIGV2ZW50IG9uIGZ1bmN0aW9ucyAoaS5lLiBzbG90cykKKyAqIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZSAtIGhhbmRsZSBBQ1BJIGV2ZW50IG9uIGJyaWRnZXMKICAqIEBoYW5kbGU6IE5vdGlmeSgpJ2VkIGFjcGlfaGFuZGxlCiAgKiBAdHlwZTogTm90aWZ5IGNvZGUKLSAqIEBjb250ZXh0OiBwb2ludGVyIHRvIGFjcGlwaHBfZnVuYyBzdHJ1Y3R1cmUKKyAqIEBjb250ZXh0OiBwb2ludGVyIHRvIGFjcGlwaHBfYnJpZGdlIHN0cnVjdHVyZQogICoKLSAqIEhhbmRsZXMgQUNQSSBldmVudCBub3RpZmljYXRpb24gb24gc2xvdHMuCisgKiBIYW5kbGVzIEFDUEkgZXZlbnQgbm90aWZpY2F0aW9uIG9uIHtob3N0LHAycH0gYnJpZGdlcy4KICAqLwotc3RhdGljIHZvaWQgaGFuZGxlX2hvdHBsdWdfZXZlbnRfZnVuYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLCB2b2lkICpjb250ZXh0KQorc3RhdGljIHZvaWQgaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHR5cGUsCisJCQkJCXZvaWQgKmNvbnRleHQpCit7CisJLyoKKwkgKiBDdXJyZW50bHkgdGhlIGNvZGUgYWRkcyBhbGwgaG90cGx1ZyBldmVudHMgdG8gdGhlIGthY3BpZF93cQorCSAqIHF1ZXVlIHdoZW4gaXQgc2hvdWxkIGFkZCBob3RwbHVnIGV2ZW50cyB0byB0aGUga2FjcGlfaG90cGx1Z193cS4KKwkgKiBUaGUgcHJvcGVyIHdheSB0byBmaXggdGhpcyBpcyB0byByZW9yZ2FuaXplIHRoZSBjb2RlIHNvIHRoYXQKKwkgKiBkcml2ZXJzIChkb2NrLCBldGMuKSBkbyBub3QgY2FsbCBhY3BpX29zX2V4ZWN1dGUoKSwgZXRjLgorCSAqIEZvciBub3cganVzdCByZS1hZGQgdGhpcyB3b3JrIHRvIHRoZSBrYWNwaV9ob3RwbHVnX3dxIHNvIHdlCisJICogZG9uJ3QgZGVhZGxvY2sgb24gaG90cGx1ZyBhY3Rpb25zLgorCSAqLworCWFsbG9jX2FjcGlwaHBfaHBfd29yayhoYW5kbGUsIHR5cGUsIGNvbnRleHQsCisJCQkgICAgICBfaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlKTsKK30KKworc3RhdGljIHZvaWQgX2hhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7CiAJY2hhciBvYmpuYW1lWzY0XTsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyAubGVuZ3RoID0gc2l6ZW9mKG9iam5hbWUpLAogCQkJCSAgICAgIC5wb2ludGVyID0gb2JqbmFtZSB9OworCXN0cnVjdCBhY3BpcGhwX2hwX3dvcmsgKmhwX3dvcms7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXUzMiB0eXBlOworCXZvaWQgKmNvbnRleHQ7CisKKwlocF93b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhY3BpcGhwX2hwX3dvcmssIHdvcmspOworCWhhbmRsZSA9IGhwX3dvcmstPmhhbmRsZTsKKwl0eXBlID0gaHBfd29yay0+dHlwZTsKKwljb250ZXh0ID0gaHBfd29yay0+Y29udGV4dDsKIAogCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwogCkBAIC0xMjkxLDggKzEzNDYsMzIgQEAKIAkJd2Fybigibm90aWZ5X2hhbmRsZXI6IHVua25vd24gZXZlbnQgdHlwZSAweCV4IGZvciAlc1xuIiwgdHlwZSwgb2JqbmFtZSk7CiAJCWJyZWFrOwogCX0KKworCWtmcmVlKGhwX3dvcmspOyAvKiBhbGxvY2F0ZWQgaW4gaGFuZGxlX2hvdHBsdWdfZXZlbnRfZnVuYyAqLwogfQogCisvKioKKyAqIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMgLSBoYW5kbGUgQUNQSSBldmVudCBvbiBmdW5jdGlvbnMgKGkuZS4gc2xvdHMpCisgKiBAaGFuZGxlOiBOb3RpZnkoKSdlZCBhY3BpX2hhbmRsZQorICogQHR5cGU6IE5vdGlmeSBjb2RlCisgKiBAY29udGV4dDogcG9pbnRlciB0byBhY3BpcGhwX2Z1bmMgc3RydWN0dXJlCisgKgorICogSGFuZGxlcyBBQ1BJIGV2ZW50IG5vdGlmaWNhdGlvbiBvbiBzbG90cy4KKyAqLworc3RhdGljIHZvaWQgaGFuZGxlX2hvdHBsdWdfZXZlbnRfZnVuYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLAorCQkJCSAgICAgIHZvaWQgKmNvbnRleHQpCit7CisJLyoKKwkgKiBDdXJyZW50bHkgdGhlIGNvZGUgYWRkcyBhbGwgaG90cGx1ZyBldmVudHMgdG8gdGhlIGthY3BpZF93cQorCSAqIHF1ZXVlIHdoZW4gaXQgc2hvdWxkIGFkZCBob3RwbHVnIGV2ZW50cyB0byB0aGUga2FjcGlfaG90cGx1Z193cS4KKwkgKiBUaGUgcHJvcGVyIHdheSB0byBmaXggdGhpcyBpcyB0byByZW9yZ2FuaXplIHRoZSBjb2RlIHNvIHRoYXQKKwkgKiBkcml2ZXJzIChkb2NrLCBldGMuKSBkbyBub3QgY2FsbCBhY3BpX29zX2V4ZWN1dGUoKSwgZXRjLgorCSAqIEZvciBub3cganVzdCByZS1hZGQgdGhpcyB3b3JrIHRvIHRoZSBrYWNwaV9ob3RwbHVnX3dxIHNvIHdlCisJICogZG9uJ3QgZGVhZGxvY2sgb24gaG90cGx1ZyBhY3Rpb25zLgorCSAqLworCWFsbG9jX2FjcGlwaHBfaHBfd29yayhoYW5kbGUsIHR5cGUsIGNvbnRleHQsCisJCQkgICAgICBfaGFuZGxlX2hvdHBsdWdfZXZlbnRfZnVuYyk7Cit9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwogZmluZF9yb290X2JyaWRnZXMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKaW5kZXggNWY3MjI2Mi4uMzc2ZDcwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInBjaWVocC5oIgogCiAjZGVmaW5lIFBDSUVIUF9ERVRFQ1RfUENJRQkoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2locF9zbG90LmMKaW5kZXggM2ZmZDljMWEuLjhjMDVhMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jCkBAIC0yNCw2ICsyNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgaHBwX3R5cGUwIHBjaV9kZWZhdWx0X3R5cGUwID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYwppbmRleCAxZDAwMmIxLi5jNTZhOTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYwpAQCAtMTgsNiArMTgsNyBAQAogI3VuZGVmIERFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaHRpcnEuYyBiL2RyaXZlcnMvcGNpL2h0aXJxLmMKaW5kZXggZGIwNTdiNi4uNmUzNzNlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaHRpcnEuYworKysgYi9kcml2ZXJzL3BjaS9odGlycS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2h0aXJxLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvYXBpYy5jIGIvZHJpdmVycy9wY2kvaW9hcGljLmMKaW5kZXggMjAzNTA4Yi4uNTc3NTYzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaW9hcGljLmMKKysrIGIvZHJpdmVycy9wY2kvaW9hcGljLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb3YuYyBiL2RyaXZlcnMvcGNpL2lvdi5jCmluZGV4IDQyZmFlNDcuLmI4MmMxNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lvdi5jCisrKyBiL2RyaXZlcnMvcGNpL2lvdi5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2ktYXRzLmg+CkBAIC03MjIsMTQ1ICs3MjMsMyBAQAogCQlyZXR1cm4gZGV2LT5zcmlvdi0+bnJfdmlydGZuOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpX251bV92Zik7Ci0KLXN0YXRpYyBpbnQgYXRzX2FsbG9jX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcHMpCi17Ci0JaW50IHBvczsKLQl1MTYgY2FwOwotCXN0cnVjdCBwY2lfYXRzICphdHM7Ci0KLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0FUUyk7Ci0JaWYgKCFwb3MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JYXRzID0ga3phbGxvYyhzaXplb2YoKmF0cyksIEdGUF9LRVJORUwpOwotCWlmICghYXRzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWF0cy0+cG9zID0gcG9zOwotCWF0cy0+c3R1ID0gcHM7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfQVRTX0NBUCwgJmNhcCk7Ci0JYXRzLT5xZGVwID0gUENJX0FUU19DQVBfUURFUChjYXApID8gUENJX0FUU19DQVBfUURFUChjYXApIDoKLQkJCQkJICAgIFBDSV9BVFNfTUFYX1FERVA7Ci0JZGV2LT5hdHMgPSBhdHM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXRzX2ZyZWVfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Ja2ZyZWUoZGV2LT5hdHMpOwotCWRldi0+YXRzID0gTlVMTDsKLX0KLQotLyoqCi0gKiBwY2lfZW5hYmxlX2F0cyAtIGVuYWJsZSB0aGUgQVRTIGNhcGFiaWxpdHkKLSAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCi0gKiBAcHM6IHRoZSBJT01NVSBwYWdlIHNoaWZ0Ci0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIG9uIGZhaWx1cmUuCi0gKi8KLWludCBwY2lfZW5hYmxlX2F0cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcHMpCi17Ci0JaW50IHJjOwotCXUxNiBjdHJsOwotCi0JQlVHX09OKGRldi0+YXRzICYmIGRldi0+YXRzLT5pc19lbmFibGVkKTsKLQotCWlmIChwcyA8IFBDSV9BVFNfTUlOX1NUVSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZGV2LT5pc19waHlzZm4gfHwgZGV2LT5pc192aXJ0Zm4pIHsKLQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPmlzX3BoeXNmbiA/IGRldiA6IGRldi0+cGh5c2ZuOwotCi0JCW11dGV4X2xvY2soJnBkZXYtPnNyaW92LT5sb2NrKTsKLQkJaWYgKHBkZXYtPmF0cykKLQkJCXJjID0gcGRldi0+YXRzLT5zdHUgPT0gcHMgPyAwIDogLUVJTlZBTDsKLQkJZWxzZQotCQkJcmMgPSBhdHNfYWxsb2Nfb25lKHBkZXYsIHBzKTsKLQotCQlpZiAoIXJjKQotCQkJcGRldi0+YXRzLT5yZWZfY250Kys7Ci0JCW11dGV4X3VubG9jaygmcGRldi0+c3Jpb3YtPmxvY2spOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKCFkZXYtPmlzX3BoeXNmbikgewotCQlyYyA9IGF0c19hbGxvY19vbmUoZGV2LCBwcyk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQl9Ci0KLQljdHJsID0gUENJX0FUU19DVFJMX0VOQUJMRTsKLQlpZiAoIWRldi0+aXNfdmlydGZuKQotCQljdHJsIHw9IFBDSV9BVFNfQ1RSTF9TVFUocHMgLSBQQ0lfQVRTX01JTl9TVFUpOwotCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGRldi0+YXRzLT5wb3MgKyBQQ0lfQVRTX0NUUkwsIGN0cmwpOwotCi0JZGV2LT5hdHMtPmlzX2VuYWJsZWQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogcGNpX2Rpc2FibGVfYXRzIC0gZGlzYWJsZSB0aGUgQVRTIGNhcGFiaWxpdHkKLSAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCi0gKi8KLXZvaWQgcGNpX2Rpc2FibGVfYXRzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JdTE2IGN0cmw7Ci0KLQlCVUdfT04oIWRldi0+YXRzIHx8ICFkZXYtPmF0cy0+aXNfZW5hYmxlZCk7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGRldi0+YXRzLT5wb3MgKyBQQ0lfQVRTX0NUUkwsICZjdHJsKTsKLQljdHJsICY9IH5QQ0lfQVRTX0NUUkxfRU5BQkxFOwotCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGRldi0+YXRzLT5wb3MgKyBQQ0lfQVRTX0NUUkwsIGN0cmwpOwotCi0JZGV2LT5hdHMtPmlzX2VuYWJsZWQgPSAwOwotCi0JaWYgKGRldi0+aXNfcGh5c2ZuIHx8IGRldi0+aXNfdmlydGZuKSB7Ci0JCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5pc19waHlzZm4gPyBkZXYgOiBkZXYtPnBoeXNmbjsKLQotCQltdXRleF9sb2NrKCZwZGV2LT5zcmlvdi0+bG9jayk7Ci0JCXBkZXYtPmF0cy0+cmVmX2NudC0tOwotCQlpZiAoIXBkZXYtPmF0cy0+cmVmX2NudCkKLQkJCWF0c19mcmVlX29uZShwZGV2KTsKLQkJbXV0ZXhfdW5sb2NrKCZwZGV2LT5zcmlvdi0+bG9jayk7Ci0JfQotCi0JaWYgKCFkZXYtPmlzX3BoeXNmbikKLQkJYXRzX2ZyZWVfb25lKGRldik7Ci19Ci0KLS8qKgotICogcGNpX2F0c19xdWV1ZV9kZXB0aCAtIHF1ZXJ5IHRoZSBBVFMgSW52YWxpZGF0ZSBRdWV1ZSBEZXB0aAotICogQGRldjogdGhlIFBDSSBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zIHRoZSBxdWV1ZSBkZXB0aCBvbiBzdWNjZXNzLCBvciBuZWdhdGl2ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoZSBBVFMgc3BlYyB1c2VzIDAgaW4gdGhlIEludmFsaWRhdGUgUXVldWUgRGVwdGggZmllbGQgdG8KLSAqIGluZGljYXRlIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbiBhY2NlcHQgMzIgSW52YWxpZGF0ZSBSZXF1ZXN0LgotICogQnV0IGhlcmUgd2UgdXNlIHRoZSBgcmVhbCcgdmFsdWVzIChpLmUuIDF+MzIpIGZvciB0aGUgUXVldWUKLSAqIERlcHRoOyBhbmQgMCBpbmRpY2F0ZXMgdGhlIGZ1bmN0aW9uIHNoYXJlcyB0aGUgUXVldWUgd2l0aAotICogb3RoZXIgZnVuY3Rpb25zIChkb2Vzbid0IGV4Y2x1c2l2ZWx5IG93biBhIFF1ZXVlKS4KLSAqLwotaW50IHBjaV9hdHNfcXVldWVfZGVwdGgoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpbnQgcG9zOwotCXUxNiBjYXA7Ci0KLQlpZiAoZGV2LT5pc192aXJ0Zm4pCi0JCXJldHVybiAwOwotCi0JaWYgKGRldi0+YXRzKQotCQlyZXR1cm4gZGV2LT5hdHMtPnFkZXA7Ci0KLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0FUUyk7Ci0JaWYgKCFwb3MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfQVRTX0NBUCwgJmNhcCk7Ci0KLQlyZXR1cm4gUENJX0FUU19DQVBfUURFUChjYXApID8gUENJX0FUU19DQVBfUURFUChjYXApIDoKLQkJCQkgICAgICAgUENJX0FUU19NQVhfUURFUDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lycS5jIGIvZHJpdmVycy9wY2kvaXJxLmMKaW5kZXggZGUwMTE3NC4uZTVmNjlhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaXJxLmMKKysrIGIvZHJpdmVycy9wY2kvaXJxLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiBzdGF0aWMgdm9pZCBwY2lfbm90ZV9pcnFfcHJvYmxlbShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3QgY2hhciAqcmVhc29uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLmMgYi9kcml2ZXJzL3BjaS9tc2kuYwppbmRleCAyZjEwMzI4Li4wZTZkMDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9tc2kuYworKysgYi9kcml2ZXJzL3BjaS9tc2kuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCBkMzZmNDFlLi40ZWNiNjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTQ2LDYgKzQ2LDkgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IGNvbnRleHQ7CiAKIAlpZiAoZXZlbnQgPT0gQUNQSV9OT1RJRllfREVWSUNFX1dBS0UgJiYgcGNpX2RldikgeworCQlpZiAocGNpX2Rldi0+cG1lX3BvbGwpCisJCQlwY2lfZGV2LT5wbWVfcG9sbCA9IGZhbHNlOworCiAJCXBjaV93YWtldXBfZXZlbnQocGNpX2Rldik7CiAJCXBjaV9jaGVja19wbWVfc3RhdHVzKHBjaV9kZXYpOwogCQlwbV9ydW50aW1lX3Jlc3VtZSgmcGNpX2Rldi0+ZGV2KTsKQEAgLTI4Miw3ICsyODUsNiBAQAogewogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2OwogCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlpbnQgZXJyb3IgPSAtRU5PREVWOwogCiAJaWYgKCFkZXZpY2VfcnVuX3dha2UocGh5c19kZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMwMiw3ICszMDQsNyBAQAogCQlhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZV9wb3dlcihkZXYpOwogCX0KIAotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYWNwaV9wY2lfcHJvcGFnYXRlX3J1bl93YWtlKHN0cnVjdCBwY2lfYnVzICpidXMsIGJvb2wgZW5hYmxlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwppbmRleCA3YmNmMTJhLi4xMDZiZTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCBlOTY1MWYwLi42ZjQ1YTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMTQwNywxMyArMTQwNywxNiBAQAogLyoqCiAgKiBwY2lfcG1lX3dha2V1cCAtIFdha2UgdXAgYSBQQ0kgZGV2aWNlIGlmIGl0cyBQTUUgU3RhdHVzIGJpdCBpcyBzZXQuCiAgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlLgotICogQGlnbjogSWdub3JlZC4KKyAqIEBwbWVfcG9sbF9yZXNldDogV2hldGhlciBvciBub3QgdG8gcmVzZXQgdGhlIGRldmljZSdzIHBtZV9wb2xsIGZsYWcuCiAgKgogICogQ2hlY2sgaWYgQGRldiBoYXMgZ2VuZXJhdGVkIFBNRSBhbmQgcXVldWUgYSByZXN1bWUgcmVxdWVzdCBmb3IgaXQgaW4gdGhhdAogICogY2FzZS4KICAqLwotc3RhdGljIGludCBwY2lfcG1lX3dha2V1cChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICppZ24pCitzdGF0aWMgaW50IHBjaV9wbWVfd2FrZXVwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgKnBtZV9wb2xsX3Jlc2V0KQogeworCWlmIChwbWVfcG9sbF9yZXNldCAmJiBkZXYtPnBtZV9wb2xsKQorCQlkZXYtPnBtZV9wb2xsID0gZmFsc2U7CisKIAlpZiAocGNpX2NoZWNrX3BtZV9zdGF0dXMoZGV2KSkgewogCQlwY2lfd2FrZXVwX2V2ZW50KGRldik7CiAJCXBtX3JlcXVlc3RfcmVzdW1lKCZkZXYtPmRldik7CkBAIC0xNDI4LDcgKzE0MzEsNyBAQAogdm9pZCBwY2lfcG1lX3dha2V1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlpZiAoYnVzKQotCQlwY2lfd2Fsa19idXMoYnVzLCBwY2lfcG1lX3dha2V1cCwgTlVMTCk7CisJCXBjaV93YWxrX2J1cyhidXMsIHBjaV9wbWVfd2FrZXVwLCAodm9pZCAqKXRydWUpOwogfQogCiAvKioKQEAgLTE0NDYsMzEgKzE0NDksMjYgQEAKIAogc3RhdGljIHZvaWQgcGNpX3BtZV9saXN0X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBwY2lfcG1lX2RldmljZSAqcG1lX2RldjsKKwlzdHJ1Y3QgcGNpX3BtZV9kZXZpY2UgKnBtZV9kZXYsICpuOwogCiAJbXV0ZXhfbG9jaygmcGNpX3BtZV9saXN0X211dGV4KTsKIAlpZiAoIWxpc3RfZW1wdHkoJnBjaV9wbWVfbGlzdCkpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwbWVfZGV2LCAmcGNpX3BtZV9saXN0LCBsaXN0KQotCQkJcGNpX3BtZV93YWtldXAocG1lX2Rldi0+ZGV2LCBOVUxMKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwY2lfcG1lX3dvcmssIG1zZWNzX3RvX2ppZmZpZXMoUE1FX1RJTUVPVVQpKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBtZV9kZXYsIG4sICZwY2lfcG1lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChwbWVfZGV2LT5kZXYtPnBtZV9wb2xsKSB7CisJCQkJcGNpX3BtZV93YWtldXAocG1lX2Rldi0+ZGV2LCBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdF9kZWwoJnBtZV9kZXYtPmxpc3QpOworCQkJCWtmcmVlKHBtZV9kZXYpOworCQkJfQorCQl9CisJCWlmICghbGlzdF9lbXB0eSgmcGNpX3BtZV9saXN0KSkKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGNpX3BtZV93b3JrLAorCQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFBNRV9USU1FT1VUKSk7CiAJfQogCW11dGV4X3VubG9jaygmcGNpX3BtZV9saXN0X211dGV4KTsKIH0KIAogLyoqCi0gKiBwY2lfZXh0ZXJuYWxfcG1lIC0gaXMgYSBkZXZpY2UgYW4gZXh0ZXJuYWwgUENJIFBNRSBzb3VyY2U/Ci0gKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGNoZWNrCi0gKgotICovCi0KLXN0YXRpYyBib29sIHBjaV9leHRlcm5hbF9wbWUoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpZiAocGNpX2lzX3BjaWUoZGV2KSB8fCBkZXYtPmJ1cy0+bnVtYmVyID09IDApCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCiAgKiBwY2lfcG1lX2FjdGl2ZSAtIGVuYWJsZSBvciBkaXNhYmxlIFBDSSBkZXZpY2UncyBQTUUjIGZ1bmN0aW9uCiAgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGhhbmRsZS4KICAqIEBlbmFibGU6ICd0cnVlJyB0byBlbmFibGUgUE1FIyBnZW5lcmF0aW9uOyAnZmFsc2UnIHRvIGRpc2FibGUgaXQuCkBAIC0xNTAzLDcgKzE1MDEsNyBAQAogCSAgIGhpdCwgYW5kIHRoZSBwb3dlciBzYXZpbmdzIGZyb20gdGhlIGRldmljZXMgd2lsbCBzdGlsbCBiZSBhCiAJICAgd2luLiAqLwogCi0JaWYgKHBjaV9leHRlcm5hbF9wbWUoZGV2KSkgeworCWlmIChkZXYtPnBtZV9wb2xsKSB7CiAJCXN0cnVjdCBwY2lfcG1lX2RldmljZSAqcG1lX2RldjsKIAkJaWYgKGVuYWJsZSkgewogCQkJcG1lX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfcG1lX2RldmljZSksCkBAIC0xODIxLDYgKzE4MTksNyBAQAogCQkJIChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EMykgPyAiIEQzaG90IiA6ICIiLAogCQkJIChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EM2NvbGQpID8gIiBEM2NvbGQiIDogIiIpOwogCQlkZXYtPnBtZV9zdXBwb3J0ID0gcG1jID4+IFBDSV9QTV9DQVBfUE1FX1NISUZUOworCQlkZXYtPnBtZV9wb2xsID0gdHJ1ZTsKIAkJLyoKIAkJICogTWFrZSBkZXZpY2UncyBQTSBmbGFncyByZWZsZWN0IHRoZSB3YWtlLXVwIGNhcGFiaWxpdHksIGJ1dAogCQkgKiBsZXQgdGhlIHVzZXIgc3BhY2UgZW5hYmxlIGl0IHRvIHdha2UgdXAgdGhlIHN5c3RlbSBhcyBuZWVkZWQuCkBAIC0zMjAzLDggKzMyMDIsNiBAQAogCWlmIChycSA8IDEyOCB8fCBycSA+IDQwOTYgfHwgIWlzX3Bvd2VyX29mXzIocnEpKQogCQlnb3RvIG91dDsKIAotCXYgPSAoZmZzKHJxKSAtIDgpIDw8IDEyOwotCiAJY2FwID0gcGNpX3BjaWVfY2FwKGRldik7CiAJaWYgKCFjYXApCiAJCWdvdG8gb3V0OwpAQCAtMzIxMiw2ICszMjA5LDIyIEBACiAJZXJyID0gcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBjYXAgKyBQQ0lfRVhQX0RFVkNUTCwgJmN0bCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CisJLyoKKwkgKiBJZiB1c2luZyB0aGUgInBlcmZvcm1hbmNlIiBQQ0llIGNvbmZpZywgd2UgY2xhbXAgdGhlCisJICogcmVhZCBycSBzaXplIHRvIHRoZSBtYXggcGFja2V0IHNpemUgdG8gcHJldmVudCB0aGUKKwkgKiBob3N0IGJyaWRnZSBnZW5lcmF0aW5nIHJlcXVlc3RzIGxhcmdlciB0aGFuIHdlIGNhbgorCSAqIGNvcGUgd2l0aAorCSAqLworCWlmIChwY2llX2J1c19jb25maWcgPT0gUENJRV9CVVNfUEVSRk9STUFOQ0UpIHsKKwkJaW50IG1wcyA9IHBjaWVfZ2V0X21wcyhkZXYpOworCisJCWlmIChtcHMgPCAwKQorCQkJcmV0dXJuIG1wczsKKwkJaWYgKG1wcyA8IHJxKQorCQkJcnEgPSBtcHM7CisJfQorCisJdiA9IChmZnMocnEpIC0gOCkgPDwgMTI7CiAKIAlpZiAoKGN0bCAmIFBDSV9FWFBfREVWQ1RMX1JFQURSUSkgIT0gdikgewogCQljdGwgJj0gflBDSV9FWFBfREVWQ1RMX1JFQURSUTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG1lLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BtZS5jCmluZGV4IDAwNTczNDQuLjAwMWYxYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG1lLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wbWUuYwpAQCAtODQsNiArODQsOSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewogCQkvKiBTa2lwIFBDSWUgZGV2aWNlcyBpbiBjYXNlIHdlIHN0YXJ0ZWQgZnJvbSBhIHJvb3QgcG9ydC4gKi8KIAkJaWYgKCFwY2lfaXNfcGNpZShkZXYpICYmIHBjaV9jaGVja19wbWVfc3RhdHVzKGRldikpIHsKKwkJCWlmIChkZXYtPnBtZV9wb2xsKQorCQkJCWRldi0+cG1lX3BvbGwgPSBmYWxzZTsKKwogCQkJcGNpX3dha2V1cF9ldmVudChkZXYpOwogCQkJcG1fcmVxdWVzdF9yZXN1bWUoJmRldi0+ZGV2KTsKIAkJCXJldCA9IHRydWU7CkBAIC0xNDIsNiArMTQ1LDkgQEAKIAogCS8qIEZpcnN0LCBjaGVjayBpZiB0aGUgUE1FIGlzIGZyb20gdGhlIHJvb3QgcG9ydCBpdHNlbGYuICovCiAJaWYgKHBvcnQtPmRldmZuID09IGRldmZuICYmIHBvcnQtPmJ1cy0+bnVtYmVyID09IGJ1c25yKSB7CisJCWlmIChwb3J0LT5wbWVfcG9sbCkKKwkJCXBvcnQtPnBtZV9wb2xsID0gZmFsc2U7CisKIAkJaWYgKHBjaV9jaGVja19wbWVfc3RhdHVzKHBvcnQpKSB7CiAJCQlwbV9yZXF1ZXN0X3Jlc3VtZSgmcG9ydC0+ZGV2KTsKIAkJCWZvdW5kID0gdHJ1ZTsKQEAgLTE4Nyw2ICsxOTMsOSBAQAogCQkvKiBUaGUgZGV2aWNlIGlzIHRoZXJlLCBidXQgd2UgaGF2ZSB0byBjaGVjayBpdHMgUE1FIHN0YXR1cy4gKi8KIAkJZm91bmQgPSBwY2lfY2hlY2tfcG1lX3N0YXR1cyhkZXYpOwogCQlpZiAoZm91bmQpIHsKKwkJCWlmIChkZXYtPnBtZV9wb2xsKQorCQkJCWRldi0+cG1lX3BvbGwgPSBmYWxzZTsKKwogCQkJcGNpX3dha2V1cF9ldmVudChkZXYpOwogCQkJcG1fcmVxdWVzdF9yZXN1bWUoJmRldi0+ZGV2KTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggNmFiNmJkMy4uMDRlNzRmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0xMzYzLDMxICsxMzYzLDI1IEBACiAKIHN0YXRpYyB2b2lkIHBjaWVfd3JpdGVfbXBzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtcHMpCiB7Ci0JaW50IHJjLCBkZXZfbXBzczsKLQotCWRldl9tcHNzID0gMTI4IDw8IGRldi0+cGNpZV9tcHNzOworCWludCByYzsKIAogCWlmIChwY2llX2J1c19jb25maWcgPT0gUENJRV9CVVNfUEVSRk9STUFOQ0UpIHsKLQkJaWYgKGRldi0+YnVzLT5zZWxmKSB7Ci0JCQlkZXZfZGJnKCZkZXYtPmJ1cy0+ZGV2LCAiQnVzIE1QU1MgJWRcbiIsCi0JCQkJMTI4IDw8IGRldi0+YnVzLT5zZWxmLT5wY2llX21wc3MpOworCQltcHMgPSAxMjggPDwgZGV2LT5wY2llX21wc3M7CiAKLQkJCS8qIEZvciAiTVBTIEZvcmNlIE1heCIsIHRoZSBhc3N1bXB0aW9uIGlzIG1hZGUgdGhhdAorCQlpZiAoZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCAmJiBkZXYtPmJ1cy0+c2VsZikKKwkJCS8qIEZvciAiUGVyZm9ybWFuY2UiLCB0aGUgYXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQKIAkJCSAqIGRvd25zdHJlYW0gY29tbXVuaWNhdGlvbiB3aWxsIG5ldmVyIGJlIGxhcmdlciB0aGFuCiAJCQkgKiB0aGUgTVJSUy4gIFNvLCB0aGUgTVBTIG9ubHkgbmVlZHMgdG8gYmUgY29uZmlndXJlZAogCQkJICogZm9yIHRoZSB1cHN0cmVhbSBjb21tdW5pY2F0aW9uLiAgVGhpcyBiZWluZyB0aGUgY2FzZSwKIAkJCSAqIHdhbGsgZnJvbSB0aGUgdG9wIGRvd24gYW5kIHNldCB0aGUgTVBTIG9mIHRoZSBjaGlsZAogCQkJICogdG8gdGhhdCBvZiB0aGUgcGFyZW50IGJ1cy4KKwkJCSAqCisJCQkgKiBDb25maWd1cmUgdGhlIGRldmljZSBNUFMgd2l0aCB0aGUgc21hbGxlciBvZiB0aGUKKwkJCSAqIGRldmljZSBNUFNTIG9yIHRoZSBicmlkZ2UgTVBTICh3aGljaCBpcyBhc3N1bWVkIHRvIGJlCisJCQkgKiBwcm9wZXJseSBjb25maWd1cmVkIGF0IHRoaXMgcG9pbnQgdG8gdGhlIGxhcmdlc3QKKwkJCSAqIGFsbG93YWJsZSBNUFMgYmFzZWQgb24gaXRzIHBhcmVudCBidXMpLgogCQkJICovCi0JCQltcHMgPSAxMjggPDwgZGV2LT5idXMtPnNlbGYtPnBjaWVfbXBzczsKLQkJCWlmIChtcHMgPiBkZXZfbXBzcykKLQkJCQlkZXZfd2FybigmZGV2LT5kZXYsICJNUFMgY29uZmlndXJlZCBoaWdoZXIgdGhhbiIKLQkJCQkJICIgbWF4aW11bSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4gIElmIgotCQkJCQkgIiBhIGJ1cyBpc3N1ZSBvY2N1cnMsIHRyeSBydW5uaW5nIHdpdGgiCi0JCQkJCSAiIHBjaT1wY2llX2J1c19zYWZlLlxuIik7Ci0JCX0KLQotCQlkZXYtPnBjaWVfbXBzcyA9IGZmcyhtcHMpIC0gODsKKwkJCW1wcyA9IG1pbihtcHMsIHBjaWVfZ2V0X21wcyhkZXYtPmJ1cy0+c2VsZikpOwogCX0KIAogCXJjID0gcGNpZV9zZXRfbXBzKGRldiwgbXBzKTsKQEAgLTEzOTUsMjUgKzEzODksMjIgQEAKIAkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgYXR0ZW1wdGluZyB0byBzZXQgdGhlIE1QU1xuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaWVfd3JpdGVfbXJycyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbXBzKQorc3RhdGljIHZvaWQgcGNpZV93cml0ZV9tcnJzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IHJjLCBtcnJzLCBkZXZfbXBzczsKKwlpbnQgcmMsIG1ycnM7CiAKIAkvKiBJbiB0aGUgInNhZmUiIGNhc2UsIGRvIG5vdCBjb25maWd1cmUgdGhlIE1SUlMuICBUaGVyZSBhcHBlYXIgdG8gYmUKIAkgKiBpc3N1ZXMgd2l0aCBzZXR0aW5nIE1SUlMgdG8gMCBvbiBhIG51bWJlciBvZiBkZXZpY2VzLgogCSAqLwotCiAJaWYgKHBjaWVfYnVzX2NvbmZpZyAhPSBQQ0lFX0JVU19QRVJGT1JNQU5DRSkKIAkJcmV0dXJuOwogCi0JZGV2X21wc3MgPSAxMjggPDwgZGV2LT5wY2llX21wc3M7Ci0KIAkvKiBGb3IgTWF4IHBlcmZvcm1hbmNlLCB0aGUgTVJSUyBtdXN0IGJlIHNldCB0byB0aGUgbGFyZ2VzdCBzdXBwb3J0ZWQKIAkgKiB2YWx1ZS4gIEhvd2V2ZXIsIGl0IGNhbm5vdCBiZSBjb25maWd1cmVkIGxhcmdlciB0aGFuIHRoZSBNUFMgdGhlCi0JICogZGV2aWNlIG9yIHRoZSBidXMgY2FuIHN1cHBvcnQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgbGFyZ2VzdCBNUlJTCi0JICogYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiB0aGUgZGV2aWNlIE1QU1MuCisJICogZGV2aWNlIG9yIHRoZSBidXMgY2FuIHN1cHBvcnQuICBUaGlzIHNob3VsZCBhbHJlYWR5IGJlIHByb3Blcmx5CisJICogY29uZmlndXJlZCBieSBhIHByaW9yIGNhbGwgdG8gcGNpZV93cml0ZV9tcHMuCiAJICovCi0JbXJycyA9IG1pbihtcHMsIGRldl9tcHNzKTsKKwltcnJzID0gcGNpZV9nZXRfbXBzKGRldik7CiAKIAkvKiBNUlJTIGlzIGEgUi9XIHJlZ2lzdGVyLiAgSW52YWxpZCB2YWx1ZXMgY2FuIGJlIHdyaXR0ZW4sIGJ1dCBhCiAJICogc3Vic2VxdWVudCByZWFkIHdpbGwgdmVyaWZ5IGlmIHRoZSB2YWx1ZSBpcyBhY2NlcHRhYmxlIG9yIG5vdC4KQEAgLTE0MjEsMzggKzE0MTIsNDEgQEAKIAkgKiBzaHJpbmsgdGhlIHZhbHVlIHVudGlsIGl0IGlzIGFjY2VwdGFibGUgdG8gdGhlIEhXLgogIAkgKi8KIAl3aGlsZSAobXJycyAhPSBwY2llX2dldF9yZWFkcnEoZGV2KSAmJiBtcnJzID49IDEyOCkgewotCQlkZXZfd2FybigmZGV2LT5kZXYsICJBdHRlbXB0aW5nIHRvIG1vZGlmeSB0aGUgUENJLUUgTVJSUyB2YWx1ZSIKLQkJCSAiIHRvICVkLiAgSWYgYW55IGlzc3VlcyBhcmUgZW5jb3VudGVyZWQsIHBsZWFzZSB0cnkgIgotCQkJICJydW5uaW5nIHdpdGggcGNpPXBjaWVfYnVzX3NhZmVcbiIsIG1ycnMpOwogCQlyYyA9IHBjaWVfc2V0X3JlYWRycShkZXYsIG1ycnMpOwotCQlpZiAocmMpCi0JCQlkZXZfZXJyKCZkZXYtPmRldiwKLQkJCQkiRmFpbGVkIGF0dGVtcHRpbmcgdG8gc2V0IHRoZSBNUlJTXG4iKTsKKwkJaWYgKCFyYykKKwkJCWJyZWFrOwogCisJCWRldl93YXJuKCZkZXYtPmRldiwgIkZhaWxlZCBhdHRlbXB0aW5nIHRvIHNldCB0aGUgTVJSU1xuIik7CiAJCW1ycnMgLz0gMjsKIAl9CisKKwlpZiAobXJycyA8IDEyOCkKKwkJZGV2X2VycigmZGV2LT5kZXYsICJNUlJTIHdhcyB1bmFibGUgdG8gYmUgY29uZmlndXJlZCB3aXRoIGEgIgorCQkJInNhZmUgdmFsdWUuICBJZiBwcm9ibGVtcyBhcmUgZXhwZXJpZW5jZWQsIHRyeSBydW5uaW5nICIKKwkJCSJ3aXRoIHBjaT1wY2llX2J1c19zYWZlLlxuIik7CiB9CiAKIHN0YXRpYyBpbnQgcGNpZV9idXNfY29uZmlndXJlX3NldChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICpkYXRhKQogewotCWludCBtcHMgPSAxMjggPDwgKih1OCAqKWRhdGE7CisJaW50IG1wcywgb3JpZ19tcHM7CiAKIAlpZiAoIXBjaV9pc19wY2llKGRldikpCiAJCXJldHVybiAwOwogCi0JZGV2X2RiZygmZGV2LT5kZXYsICJEZXYgTVBTICVkIE1QU1MgJWQgTVJSUyAlZFxuIiwKLQkJIHBjaWVfZ2V0X21wcyhkZXYpLCAxMjg8PGRldi0+cGNpZV9tcHNzLCBwY2llX2dldF9yZWFkcnEoZGV2KSk7CisJbXBzID0gMTI4IDw8ICoodTggKilkYXRhOworCW9yaWdfbXBzID0gcGNpZV9nZXRfbXBzKGRldik7CiAKIAlwY2llX3dyaXRlX21wcyhkZXYsIG1wcyk7Ci0JcGNpZV93cml0ZV9tcnJzKGRldiwgbXBzKTsKKwlwY2llX3dyaXRlX21ycnMoZGV2KTsKIAotCWRldl9kYmcoJmRldi0+ZGV2LCAiRGV2IE1QUyAlZCBNUFNTICVkIE1SUlMgJWRcbiIsCi0JCSBwY2llX2dldF9tcHMoZGV2KSwgMTI4PDxkZXYtPnBjaWVfbXBzcywgcGNpZV9nZXRfcmVhZHJxKGRldikpOworCWRldl9pbmZvKCZkZXYtPmRldiwgIlBDSS1FIE1heCBQYXlsb2FkIFNpemUgc2V0IHRvICU0ZC8lNGQgKHdhcyAlNGQpLCAiCisJCSAiTWF4IFJlYWQgUnEgJTRkXG4iLCBwY2llX2dldF9tcHMoZGV2KSwgMTI4IDw8IGRldi0+cGNpZV9tcHNzLAorCQkgb3JpZ19tcHMsIHBjaWVfZ2V0X3JlYWRycShkZXYpKTsKIAogCXJldHVybiAwOwogfQogCi0vKiBwY2llX2J1c19jb25maWd1cmVfbXBzIHJlcXVpcmVzIHRoYXQgcGNpX3dhbGtfYnVzIHdvcmsgaW4gYSB0b3AtZG93biwKKy8qIHBjaWVfYnVzX2NvbmZpZ3VyZV9zZXR0aW5ncyByZXF1aXJlcyB0aGF0IHBjaV93YWxrX2J1cyB3b3JrIGluIGEgdG9wLWRvd24sCiAgKiBwYXJlbnRzIHRoZW4gY2hpbGRyZW4gZmFzaGlvbi4gIElmIHRoaXMgY2hhbmdlcywgdGhlbiB0aGlzIGNvZGUgd2lsbCBub3QKICAqIHdvcmsgYXMgZGVzaWduZWQuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggYjIzODU2YS4uNjQ3NjU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0yNzQ1LDIwICsyNzQ2LDYgQEAKIAkvKiBkaXNhYmxlIG11c3QgYmUgZG9uZSB2aWEgZnVuY3Rpb24gIzAgKi8KIAlpZiAoUENJX0ZVTkMoZGV2LT5kZXZmbikpCiAJCXJldHVybjsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHhDQiwgJmRpc2FibGUpOwotCi0JaWYgKGRpc2FibGUgJiAweDAyKQotCQlyZXR1cm47Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4Q0EsICZ3cml0ZV9lbmFibGUpOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4Q0EsIDB4NTcpOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4Q0IsIGRpc2FibGUgfCAweDAyKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweENBLCB3cml0ZV9lbmFibGUpOwotCi0JZGV2X25vdGljZSgmZGV2LT5kZXYsICJwcm9wcmlldGFyeSBSaWNvaCBNTUMgY29udHJvbGxlciBkaXNhYmxlZCAodmlhIGZpcmV3aXJlIGZ1bmN0aW9uKVxuIik7Ci0JZGV2X25vdGljZSgmZGV2LT5kZXYsICJNTUMgY2FyZHMgYXJlIG5vdyBzdXBwb3J0ZWQgYnkgc3RhbmRhcmQgU0RIQ0kgY29udHJvbGxlclxuIik7Ci0KIAkvKgogCSAqIFJJQ09IIDB4ZTgyMyBTRC9NTUMgY2FyZCByZWFkZXIgZmFpbHMgdG8gcmVjb2duaXplCiAJICogY2VydGFpbiB0eXBlcyBvZiBTRC9NTUMgY2FyZHMuIExvd2VyaW5nIHRoZSBTRCBiYXNlCkBAIC0yNzgxLDYgKzI3NjgsMjAgQEAKIAogCQlkZXZfbm90aWNlKCZkZXYtPmRldiwgIk1NQyBjb250cm9sbGVyIGJhc2UgZnJlcXVlbmN5IGNoYW5nZWQgdG8gNTBNaHouXG4iKTsKIAl9CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4Q0IsICZkaXNhYmxlKTsKKworCWlmIChkaXNhYmxlICYgMHgwMikKKwkJcmV0dXJuOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweENBLCAmd3JpdGVfZW5hYmxlKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweENBLCAweDU3KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweENCLCBkaXNhYmxlIHwgMHgwMik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhDQSwgd3JpdGVfZW5hYmxlKTsKKworCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAicHJvcHJpZXRhcnkgUmljb2ggTU1DIGNvbnRyb2xsZXIgZGlzYWJsZWQgKHZpYSBmaXJld2lyZSBmdW5jdGlvbilcbiIpOworCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiTU1DIGNhcmRzIGFyZSBub3cgc3VwcG9ydGVkIGJ5IHN0YW5kYXJkIFNESENJIGNvbnRyb2xsZXJcbiIpOworCiB9CiBERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX1JJQ09ILCBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1QzgzMiwgcmljb2hfbW1jX2ZpeHVwX3I1YzgzMik7CiBERUNMQVJFX1BDSV9GSVhVUF9SRVNVTUVfRUFSTFkoUENJX1ZFTkRPUl9JRF9SSUNPSCwgUENJX0RFVklDRV9JRF9SSUNPSF9SNUM4MzIsIHJpY29oX21tY19maXh1cF9yNWM4MzIpOwpAQCAtMjgyMiw2ICsyODIzLDg5IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX1RJLCAweGI4MDAsIGZpeHVwX3RpODE2eF9jbGFzcyk7CiAKKy8qIFNvbWUgUENJZSBkZXZpY2VzIGRvIG5vdCB3b3JrIHJlbGlhYmx5IHdpdGggdGhlIGNsYWltZWQgbWF4aW11bQorICogcGF5bG9hZCBzaXplIHN1cHBvcnRlZC4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGZpeHVwX21wc3NfMjU2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJZGV2LT5wY2llX21wc3MgPSAxOyAvKiAyNTYgYnl0ZXMgKi8KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1NPTEFSRkxBUkUsCisJCQkgUENJX0RFVklDRV9JRF9TT0xBUkZMQVJFX1NGQzQwMDBBXzAsIGZpeHVwX21wc3NfMjU2KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1NPTEFSRkxBUkUsCisJCQkgUENJX0RFVklDRV9JRF9TT0xBUkZMQVJFX1NGQzQwMDBBXzEsIGZpeHVwX21wc3NfMjU2KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1NPTEFSRkxBUkUsCisJCQkgUENJX0RFVklDRV9JRF9TT0xBUkZMQVJFX1NGQzQwMDBCLCBmaXh1cF9tcHNzXzI1Nik7CisKKy8qIEludGVsIDUwMDAgYW5kIDUxMDAgTWVtb3J5IGNvbnRyb2xsZXJzIGhhdmUgYW4gZXJyYXRhIHdpdGggcmVhZCBjb21wbGV0aW9uCisgKiBjb2FsZXNjaW5nICh3aGljaCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgb24gc29tZSBCSU9TZXMpIGFuZCBNUFMgb2YgMjU2Qi4KKyAqIFNpbmNlIHRoZXJlIGlzIG5vIHdheSBvZiBrbm93aW5nIHdoYXQgdGhlIFBDSUUgTVBTIG9uIGVhY2ggZmFicmljIHdpbGwgYmUKKyAqIHVudGlsIGFsbCBvZiB0aGUgZGV2aWNlcyBhcmUgZGlzY292ZXJlZCBhbmQgYnVzZXMgd2Fsa2VkLCByZWFkIGNvbXBsZXRpb24KKyAqIGNvYWxlc2NpbmcgbXVzdCBiZSBkaXNhYmxlZC4gIFVuZm9ydHVuYXRlbHksIGl0IGNhbm5vdCBiZSByZS1lbmFibGVkIGJlY2F1c2UKKyAqIGl0IGlzIHBvc3NpYmxlIHRvIGhvdHBsdWcgYSBkZXZpY2Ugd2l0aCBNUFMgb2YgMjU2Qi4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2ludGVsX21jX2VycmF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBlcnI7CisJdTE2IHJjYzsKKworCWlmIChwY2llX2J1c19jb25maWcgPT0gUENJRV9CVVNfVFVORV9PRkYpCisJCXJldHVybjsKKworCS8qIEludGVsIGVycmF0YSBzcGVjaWZpZXMgYml0cyB0byBjaGFuZ2UgYnV0IGRvZXMgbm90IHNheSB3aGF0IHRoZXkgYXJlLgorCSAqIEtlZXBpbmcgdGhlbSBtYWdpY2FsIHVudGlsIHN1Y2ggdGltZSBhcyB0aGUgcmVnaXN0ZXJzIGFuZCB2YWx1ZXMgY2FuCisJICogYmUgZXhwbGFpbmVkLgorCSAqLworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0OCwgJnJjYyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIGF0dGVtcHRpbmcgdG8gcmVhZCB0aGUgcmVhZCAiCisJCQkiY29tcGxldGlvbiBjb2FsZXNjaW5nIHJlZ2lzdGVyLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShyY2MgJiAoMSA8PCAxMCkpKQorCQlyZXR1cm47CisKKwlyY2MgJj0gfigxIDw8IDEwKTsKKworCWVyciA9IHBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NDgsIHJjYyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIHJlYWQgIgorCQkJImNvbXBsZXRpb24gY29hbGVzY2luZyByZWdpc3Rlci5cbiIpOworCQlyZXR1cm47CisJfQorCisJcHJfaW5mb19vbmNlKCJSZWFkIGNvbXBsZXRpb24gY29hbGVzY2luZyBkaXNhYmxlZCBkdWUgdG8gaGFyZHdhcmUgIgorCQkgICAgICJlcnJhdGEgcmVsYXRpbmcgdG8gMjU2QiBNUFMuXG4iKTsKK30KKy8qIEludGVsIDUwMDAgc2VyaWVzIG1lbW9yeSBjb250cm9sbGVycyBhbmQgcG9ydHMgMi03ICovCitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWMwLCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVkMCwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI1ZDQsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWQ4LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVlMiwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI1ZTMsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWU0LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVlNSwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI1ZTYsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWU3LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVmNywgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI1ZjgsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWY5LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVmYSwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKKy8qIEludGVsIDUxMDAgc2VyaWVzIG1lbW9yeSBjb250cm9sbGVycyBhbmQgcG9ydHMgMi03ICovCitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2NWMwLCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NjVlMiwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDY1ZTMsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2NWU0LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NjVlNSwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDY1ZTYsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2NWU3LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NjVmNywgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDY1ZjgsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2NWY5LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NjVmYSwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKKwogc3RhdGljIHZvaWQgcGNpX2RvX2ZpeHVwcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2ZpeHVwICpmLAogCQkJICBzdHJ1Y3QgcGNpX2ZpeHVwICplbmQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9yb20uYyBiL2RyaXZlcnMvcGNpL3JvbS5jCmluZGV4IDM2ODY0YTkuLjQ4ZWJkYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JvbS5jCisrKyBiL2RyaXZlcnMvcGNpL3JvbS5jCkBAIC03LDYgKzcsNyBAQAogICogUENJIFJPTSBhY2Nlc3Mgcm91dGluZXMKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCA3ODRkYTlkLi44NmI2OWY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTQyNiw3ICs0MjYsNyBAQAogCXBjaV93cml0ZV9jb25maWdfd29yZChicmlkZ2UsIFBDSV9CUklER0VfQ09OVFJPTCwgYnVzLT5icmlkZ2VfY3RsKTsKIH0KIAotc3RhdGljIHZvaWQgcGNpX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQordm9pZCBwY2lfc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJdW5zaWduZWQgbG9uZyB0eXBlID0gSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNIHwKIAkJCQkgIElPUkVTT1VSQ0VfUFJFRkVUQ0g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCmluZGV4IDUxYTkwOTUuLjU3MTc1MDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zbG90LmMgYi9kcml2ZXJzL3BjaS9zbG90LmMKaW5kZXggOTY4Y2ZlYS4uYWM2NDEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2xvdC5jCisrKyBiL2RyaXZlcnMvcGNpL3Nsb3QuYwpAQCAtNyw2ICs3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSAicGNpLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS92cGQuYyBiL2RyaXZlcnMvcGNpL3ZwZC5jCmluZGV4IGE1YTVjYTEuLjM5Yjc5MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3ZwZC5jCisrKyBiL2RyaXZlcnMvcGNpL3ZwZC5jCkBAIC02LDYgKzYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogaW50IHBjaV92cGRfZmluZF90YWcoY29uc3QgdTggKmJ1ZiwgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGxlbiwgdTggcmR0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvZGIxeHh4X3NzLmMgYi9kcml2ZXJzL3BjbWNpYS9kYjF4eHhfc3MuYwppbmRleCAwMTc1N2YxLi4zZTQ5ZGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9kYjF4eHhfc3MuYworKysgYi9kcml2ZXJzL3BjbWNpYS9kYjF4eHhfc3MuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2JhbGxvb24zLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFsbG9vbjMuYwppbmRleCBmNTZkN2RlLi4yMmE3NWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFsbG9vbjMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFsbG9vbjMuYwpAQCAtOTcsNyArOTcsNyBAQAogc3RhdGljIGludCBiYWxsb29uM19wY21jaWFfY29uZmlndXJlX3NvY2tldChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCwKIAkJCQkgICAgICAgY29uc3Qgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQogewotCV9fcmF3X3dyaXRldyhCQUxMT09OM19DRl9SRVNFVCwgQkFMTE9PTjNfQ0ZfQ09OVFJPTF9SRUcgfAorCV9fcmF3X3dyaXRldyhCQUxMT09OM19DRl9SRVNFVCwgQkFMTE9PTjNfQ0ZfQ09OVFJPTF9SRUcgKwogCQkJKChzdGF0ZS0+ZmxhZ3MgJiBTU19SRVNFVCkgPwogCQkJQkFMTE9PTjNfRlBHQV9TRVRuQ0xSIDogMCkpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKaW5kZXggMmM1NDA1NC4uYTg3ZTI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCkBAIC0yMzEsNiArMjMxLDcgQEAKIAogCV9fcmF3X3dyaXRlbChtZWNyLCBNRUNSKTsKIH0KK0VYUE9SVF9TWU1CT0wocHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNrdF9uYW1lc1tdID0gewogCSJQQ01DSUEgc29ja2V0IDAiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNTUuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjU1LmMKaW5kZXggNjNmNGQ1Mi4uMGI0Zjk0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNTUuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI1NS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI3MC5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNzAuYwppbmRleCA2ZWU0MmI0Li45MjNmMzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI3MC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjcwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94Mnh4LmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDJ4eC5jCmluZGV4IDRmMDk1MDYuLjZlN2RjZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94Mnh4LmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyeHguYwpAQCAtMTIsOSArMTIsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL3N5c3RlbS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogaW50IGNteDI1NV9wY21jaWFfaW5pdCh2b2lkKTsKIGludCBjbXgyNzBfcGNtY2lhX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdnBhYzI3MC5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZwYWMyNzAuYwppbmRleCBlOTU2ZjY1Li42NmFiOTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdnBhYzI3MC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92cGFjMjcwLmMKQEAgLTE3LDcgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvdnBhYzI3MC5oPgogCiAjaW5jbHVkZSAic29jX2NvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZwppbmRleCBlZjU2NjQ0Li5lMTdlMmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZworKysgYi9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZwpAQCAtMiwyMyArMiwxNyBAQAogIyBQSU5DVFJMIGluZnJhc3RydWN0dXJlIGFuZCBkcml2ZXJzCiAjCiAKLW1lbnVjb25maWcgUElOQ1RSTAotCWJvb2wgIlBJTkNUUkwgU3VwcG9ydCIKK2NvbmZpZyBQSU5DVFJMCisJYm9vbAogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHRoZSBQSU5DVFJMIHN1YnN5c3RlbSBmb3IgY29udHJvbGxpbmcgcGlucwotCSAgb24gY2hpcCBwYWNrYWdlcywgZm9yIGV4YW1wbGUgbXVsdGlwbGV4aW5nIHBpbnMgb24gcHJpbWFyaWx5Ci0JICBQR0EgYW5kIEJHQSBwYWNrYWdlcyBmb3Igc3lzdGVtcyBvbiBjaGlwLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgogCiBpZiBQSU5DVFJMCiAKK21lbnUgIlBpbiBjb250cm9sbGVycyIKKwlkZXBlbmRzIG9uIFBJTkNUUkwKKwogY29uZmlnIFBJTk1VWAogCWJvb2wgIlN1cHBvcnQgcGlubXV4IGNvbnRyb2xsZXJzIgotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIHBpbmNvbnRyb2wgc3Vic3lzdGVtIHRvIGhhbmRsZSBwaW4KLQkgIG11bHRpcGxleGluZyBkcml2ZXJzLgogCiBjb25maWcgREVCVUdfUElOQ1RSTAogCWJvb2wgIkRlYnVnIFBJTkNUUkwgY2FsbHMiCkBAIC0zMCwxNCArMjQsMTIgQEAKIAlib29sICJDU1IgU2lSRnByaW1hSUkgcGlubXV4IGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfUFJJTUEyCiAJc2VsZWN0IFBJTk1VWAotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBTaVJGcHJpbWFJSSBwaW5tdXggZHJpdmVyCiAKIGNvbmZpZyBQSU5NVVhfVTMwMAogCWJvb2wgIlUzMDAgcGlubXV4IGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfVTMwMAogCXNlbGVjdCBQSU5NVVgKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgVTMwMCBwaW5tdXggZHJpdmVyCisKK2VuZG1lbnUKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9jb3JlLmMgYi9kcml2ZXJzL3BpbmN0cmwvY29yZS5jCmluZGV4IDQyMzUyMmQuLmVhZGVmOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9jb3JlLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2NvcmUuYwpAQCAtMTIsNiArMTIsNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSAicGluY3RybCBjb3JlOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnCmluZGV4IDEwY2YyNTAuLjdmNDNjZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZwpAQCAtNjEsMTUgKzYxLDE4IEBACiAJZGVwZW5kcyBvbiBJTlBVVAogCWRlcGVuZHMgb24gUkZLSUxMIHx8IFJGS0lMTCA9IG4KIAlzZWxlY3QgSU5QVVRfU1BBUlNFS01BUAorCXNlbGVjdCBJTlBVVF9QT0xMREVWCiAJLS0taGVscC0tLQotCSAgVGhpcyBpcyB0aGUgbmV3IExpbnV4IGRyaXZlciBmb3IgQXN1cyBsYXB0b3BzLiBJdCBtYXkgYWxzbyBzdXBwb3J0IHNvbWUKLQkgIE1FRElPTiwgSlZDIG9yIFZJQ1RPUiBsYXB0b3BzLiBJdCBtYWtlcyBhbGwgdGhlIGV4dHJhIGJ1dHRvbnMgZ2VuZXJhdGUKLQkgIHN0YW5kYXJkIEFDUEkgZXZlbnRzIGFuZCBpbnB1dCBldmVudHMuIEl0IGFsc28gYWRkcwotCSAgc3VwcG9ydCBmb3IgdmlkZW8gb3V0cHV0IHN3aXRjaGluZywgTENEIGJhY2tsaWdodCBjb250cm9sLCBCbHVldG9vdGggYW5kCi0JICBXbGFuIGNvbnRyb2wsIGFuZCBtb3N0IGltcG9ydGFudGx5LCBhbGxvd3MgeW91IHRvIGJsaW5rIHRob3NlIGZhbmN5IExFRHMuCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBBc3VzIGxhcHRvcHMsIExlbm92byBTTCBhbmQgdGhlIFBlZ2F0cm9uCisJICBMdWNpZCB0YWJsZXQuIEl0IG1heSBhbHNvIHN1cHBvcnQgc29tZSBNRURJT04sIEpWQyBvciBWSUNUT1IKKwkgIGxhcHRvcHMuIEl0IG1ha2VzIGFsbCB0aGUgZXh0cmEgYnV0dG9ucyBnZW5lcmF0ZSBzdGFuZGFyZAorCSAgQUNQSSBldmVudHMgYW5kIGlucHV0IGV2ZW50cywgYW5kIG9uIHRoZSBMdWNpZCB0aGUgYnVpbHQtaW4KKwkgIGFjY2VsZXJvbWV0ZXIgYXBwZWFycyBhcyBhbiBpbnB1dCBkZXZpY2UuICBJdCBhbHNvIGFkZHMKKwkgIHN1cHBvcnQgZm9yIHZpZGVvIG91dHB1dCBzd2l0Y2hpbmcsIExDRCBiYWNrbGlnaHQgY29udHJvbCwKKwkgIEJsdWV0b290aCBhbmQgV2xhbiBjb250cm9sLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgYWxsb3dzIHlvdQorCSAgdG8gYmxpbmsgdGhvc2UgZmFuY3kgTEVEcy4KIAotCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGEgdXNlcnNwYWNlIGRhZW1vbiBmb3IgaGFuZGxpbmcgdGhlIGV4dHJhCi0JICBidXR0b25zIHNlZSA8aHR0cDovL2FjcGk0YXN1cy5zZi5uZXQ+LgorCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxodHRwOi8vYWNwaTRhc3VzLnNmLm5ldD4uCiAKIAkgIElmIHlvdSBoYXZlIGFuIEFDUEktY29tcGF0aWJsZSBBU1VTIGxhcHRvcCwgc2F5IFkgb3IgTSBoZXJlLgogCkBAIC04MCw4ICs4MywxMCBAQAogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJZGVwZW5kcyBvbiBSRktJTEwgfHwgUkZLSUxMID0gbgotCWRlcGVuZHMgb24gUE9XRVJfU1VQUExZCiAJZGVwZW5kcyBvbiBTRVJJT19JODA0MgorCXNlbGVjdCBQT1dFUl9TVVBQTFkKKwlzZWxlY3QgTEVEU19DTEFTUworCXNlbGVjdCBORVdfTEVEUwogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KIAlUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHJma2lsbCBhbmQgYmFja2xpZ2h0IGNvbnRyb2wgdG8gRGVsbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKaW5kZXggYWYyYmIyMC4uYjg0ODI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCkBAIC0xOTAsNiArMTkwLDcgQEAKIAlBQ0VSX0FNVzAsCiAJQUNFUl9BTVcwX1YyLAogCUFDRVJfV01JRCwKKwlBQ0VSX1dNSURfdjIsCiB9OwogCiAjZGVmaW5lIEFDRVJfREVGQVVMVF9XSVJFTEVTUyAgMApAQCAtMjA1LDYgKzIwNiw3IEBACiBzdGF0aWMgaW50IGZvcmNlX3NlcmllczsKIHN0YXRpYyBib29sIGVjX3Jhd19tb2RlOwogc3RhdGljIGJvb2wgaGFzX3R5cGVfYWE7CitzdGF0aWMgdTE2IGNvbW11bl9mdW5jX2JpdG1hcDsKIAogbW9kdWxlX3BhcmFtKG1haWxsZWQsIGludCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW0oYnJpZ2h0bmVzcywgaW50LCAwNDQ0KTsKQEAgLTQ2NCw2ICs0NjYsMTUgQEAKIAkJfSwKIAkJLmRyaXZlcl9kYXRhID0gJnF1aXJrX2xlbm92b19pZGVhcGFkX3MyMDUsCiAJfSwKKwl7CisJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAorCQkuaWRlbnQgPSAiTGVub3ZvIDMwMDAgTjIwMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTEVOT1ZPIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIjA2ODdBMzEiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gJnF1aXJrX2Z1aml0c3VfYW1pbG9fbGlfMTcxOCwKKwl9LAogCXt9CiB9OwogCkBAIC04NjgsNiArODc5LDE3NCBAQAogCXJldHVybiBXTUlfZXhlY3V0ZV91MzIobWV0aG9kX2lkLCAodTMyKXZhbHVlLCBOVUxMKTsKIH0KIAorc3RhdGljIGFjcGlfc3RhdHVzIHdtaWQzX2dldF9kZXZpY2Vfc3RhdHVzKHUzMiAqdmFsdWUsIHUxNiBkZXZpY2UpCit7CisJc3RydWN0IHdtaWQzX2dkc19yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCB3bWlkM19nZHNfaW5wdXRfcGFyYW0gcGFyYW1zID0geworCQkuZnVuY3Rpb25fbnVtID0gMHgxLAorCQkuaG90a2V5X251bWJlciA9IDB4MDEsCisJCS5kZXZpY2VzID0gZGV2aWNlLAorCX07CisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geworCQlzaXplb2Yoc3RydWN0IHdtaWQzX2dkc19pbnB1dF9wYXJhbSksCisJCSZwYXJhbXMKKwl9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKFdNSURfR1VJRDMsIDAsIDB4MiwgJmlucHV0LCAmb3V0cHV0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSBvdXRwdXQucG9pbnRlcjsKKworCWlmICghb2JqKQorCQlyZXR1cm4gQUVfRVJST1I7CisJZWxzZSBpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDgpIHsKKwkJcHJfd2FybigiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLCBvYmotPmJ1ZmZlci5sZW5ndGgpOworCQlrZnJlZShvYmopOworCQlyZXR1cm4gQUVfRVJST1I7CisJfQorCisJcmV0dXJuX3ZhbHVlID0gKigoc3RydWN0IHdtaWQzX2dkc19yZXR1cm5fdmFsdWUgKilvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwlrZnJlZShvYmopOworCisJaWYgKHJldHVybl92YWx1ZS5lcnJvcl9jb2RlIHx8IHJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpCisJCXByX3dhcm4oIkdldCAweCV4IERldmljZSBTdGF0dXMgZmFpbGVkOiAweCV4IC0gMHgleFxuIiwKKwkJCWRldmljZSwKKwkJCXJldHVybl92YWx1ZS5lcnJvcl9jb2RlLAorCQkJcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSk7CisJZWxzZQorCQkqdmFsdWUgPSAhIShyZXR1cm5fdmFsdWUuZGV2aWNlcyAmIGRldmljZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgYWNwaV9zdGF0dXMgd21pZF92Ml9nZXRfdTMyKHUzMiAqdmFsdWUsIHUzMiBjYXApCit7CisJdTE2IGRldmljZTsKKworCXN3aXRjaCAoY2FwKSB7CisJY2FzZSBBQ0VSX0NBUF9XSVJFTEVTUzoKKwkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfV0lSRUxFU1M7CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfQkxVRVRPT1RIOgorCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEg7CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfVEhSRUVHOgorCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19USFJFRUc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBBRV9FUlJPUjsKKwl9CisJcmV0dXJuIHdtaWQzX2dldF9kZXZpY2Vfc3RhdHVzKHZhbHVlLCBkZXZpY2UpOworfQorCitzdGF0aWMgYWNwaV9zdGF0dXMgd21pZDNfc2V0X2RldmljZV9zdGF0dXModTMyIHZhbHVlLCB1MTYgZGV2aWNlKQoreworCXN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlIHJldHVybl92YWx1ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKwl1MTYgZGV2aWNlczsKKwlzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtIHBhcmFtcyA9IHsKKwkJLmZ1bmN0aW9uX251bSA9IDB4MSwKKwkJLmhvdGtleV9udW1iZXIgPSAweDAxLAorCQkuZGV2aWNlcyA9IGNvbW11bl9mdW5jX2JpdG1hcCwKKwl9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBpbnB1dCA9IHsKKwkJc2l6ZW9mKHN0cnVjdCB3bWlkM19nZHNfaW5wdXRfcGFyYW0pLAorCQkmcGFyYW1zCisJfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCisJc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChXTUlEX0dVSUQzLCAwLCAweDIsICZpbnB1dCwgJm91dHB1dCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJb2JqID0gb3V0cHV0LnBvaW50ZXI7CisKKwlpZiAoIW9iaikKKwkJcmV0dXJuIEFFX0VSUk9SOworCWVsc2UgaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7CisJCWtmcmVlKG9iaik7CisJCXJldHVybiBBRV9FUlJPUjsKKwl9CisJaWYgKG9iai0+YnVmZmVyLmxlbmd0aCAhPSA4KSB7CisJCXByX3dhcm5pbmcoIlVua25vd24gYnVmZmVyIGxlbmd0aCAlZFxuIiwgb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKworCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7CisJa2ZyZWUob2JqKTsKKworCWlmIChyZXR1cm5fdmFsdWUuZXJyb3JfY29kZSB8fCByZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKSB7CisJCXByX3dhcm5pbmcoIkdldCBDdXJyZW50IERldmljZSBTdGF0dXMgZmFpbGVkOiAiCisJCQkiMHgleCAtIDB4JXhcbiIsIHJldHVybl92YWx1ZS5lcnJvcl9jb2RlLAorCQkJcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJZGV2aWNlcyA9IHJldHVybl92YWx1ZS5kZXZpY2VzOworCXBhcmFtcy5mdW5jdGlvbl9udW0gPSAweDI7CisJcGFyYW1zLmhvdGtleV9udW1iZXIgPSAweDAxOworCXBhcmFtcy5kZXZpY2VzID0gKHZhbHVlKSA/IChkZXZpY2VzIHwgZGV2aWNlKSA6IChkZXZpY2VzICYgfmRldmljZSk7CisKKwlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKFdNSURfR1VJRDMsIDAsIDB4MSwgJmlucHV0LCAmb3V0cHV0Mik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJb2JqID0gb3V0cHV0Mi5wb2ludGVyOworCisJaWYgKCFvYmopCisJCXJldHVybiBBRV9FUlJPUjsKKwllbHNlIGlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQlrZnJlZShvYmopOworCQlyZXR1cm4gQUVfRVJST1I7CisJfQorCWlmIChvYmotPmJ1ZmZlci5sZW5ndGggIT0gNCkgeworCQlwcl93YXJuaW5nKCJVbmtub3duIGJ1ZmZlciBsZW5ndGggJWRcbiIsIG9iai0+YnVmZmVyLmxlbmd0aCk7CisJCWtmcmVlKG9iaik7CisJCXJldHVybiBBRV9FUlJPUjsKKwl9CisKKwlyZXR1cm5fdmFsdWUgPSAqKChzdHJ1Y3Qgd21pZDNfZ2RzX3JldHVybl92YWx1ZSAqKW9iai0+YnVmZmVyLnBvaW50ZXIpOworCWtmcmVlKG9iaik7CisKKwlpZiAocmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUgfHwgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSkKKwkJcHJfd2FybmluZygiU2V0IERldmljZSBTdGF0dXMgZmFpbGVkOiAiCisJCQkiMHgleCAtIDB4JXhcbiIsIHJldHVybl92YWx1ZS5lcnJvcl9jb2RlLAorCQkJcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgYWNwaV9zdGF0dXMgd21pZF92Ml9zZXRfdTMyKHUzMiB2YWx1ZSwgdTMyIGNhcCkKK3sKKwl1MTYgZGV2aWNlOworCisJc3dpdGNoIChjYXApIHsKKwljYXNlIEFDRVJfQ0FQX1dJUkVMRVNTOgorCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUzsKKwkJYnJlYWs7CisJY2FzZSBBQ0VSX0NBUF9CTFVFVE9PVEg6CisJCWRldmljZSA9IEFDRVJfV01JRDNfR0RTX0JMVUVUT09USDsKKwkJYnJlYWs7CisJY2FzZSBBQ0VSX0NBUF9USFJFRUc6CisJCWRldmljZSA9IEFDRVJfV01JRDNfR0RTX1RIUkVFRzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKwlyZXR1cm4gd21pZDNfc2V0X2RldmljZV9zdGF0dXModmFsdWUsIGRldmljZSk7Cit9CisKIHN0YXRpYyB2b2lkIHR5cGVfYWFfZG1pX2RlY29kZShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqaGVhZGVyLCB2b2lkICpkdW1teSkKIHsKIAlzdHJ1Y3QgaG90a2V5X2Z1bmN0aW9uX3R5cGVfYWEgKnR5cGVfYWE7CkBAIC04ODEsNiArMTA2MCw3IEBACiAKIAlwcl9pbmZvKCJGdW5jdGlvbiBiaXRtYXAgZm9yIENvbW11bmljYXRpb24gQnV0dG9uOiAweCV4XG4iLAogCQl0eXBlX2FhLT5jb21tdW5fZnVuY19iaXRtYXApOworCWNvbW11bl9mdW5jX2JpdG1hcCA9IHR5cGVfYWEtPmNvbW11bl9mdW5jX2JpdG1hcDsKIAogCWlmICh0eXBlX2FhLT5jb21tdW5fZnVuY19iaXRtYXAgJiBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUykKIAkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1dJUkVMRVNTOwpAQCAtOTEzLDE3ICsxMDkzLDEzIEBACiAJCXJldHVybiBBRV9FUlJPUjsKIAl9CiAKLQlkbWlfd2Fsayh0eXBlX2FhX2RtaV9kZWNvZGUsIE5VTEwpOwotCWlmICghaGFzX3R5cGVfYWEpIHsKKwlwcl9pbmZvKCJGdW5jdGlvbiBiaXRtYXAgZm9yIENvbW11bmljYXRpb24gRGV2aWNlOiAweCV4XG4iLCBkZXZpY2VzKTsKKwlpZiAoZGV2aWNlcyAmIDB4MDcpCiAJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9XSVJFTEVTUzsKLQkJaWYgKGRldmljZXMgJiAweDQwKQotCQkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1RIUkVFRzsKLQkJaWYgKGRldmljZXMgJiAweDEwKQotCQkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JMVUVUT09USDsKLQl9Ci0KLQkvKiBXTUlEIGFsd2F5cyBwcm92aWRlcyBicmlnaHRuZXNzIG1ldGhvZHMgKi8KLQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQlJJR0hUTkVTUzsKKwlpZiAoZGV2aWNlcyAmIDB4NDApCisJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9USFJFRUc7CisJaWYgKGRldmljZXMgJiAweDEwKQorCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQkxVRVRPT1RIOwogCiAJaWYgKCEoZGV2aWNlcyAmIDB4MjApKQogCQltYXhfYnJpZ2h0bmVzcyA9IDB4OTsKQEAgLTkzNiw2ICsxMTEyLDEwIEBACiAJLnR5cGUgPSBBQ0VSX1dNSUQsCiB9OwogCitzdGF0aWMgc3RydWN0IHdtaV9pbnRlcmZhY2Ugd21pZF92Ml9pbnRlcmZhY2UgPSB7CisJLnR5cGUgPSBBQ0VSX1dNSURfdjIsCit9OworCiAvKgogICogR2VuZXJpYyBEZXZpY2UgKGludGVyZmFjZS1pbmRlcGVuZGVudCkKICAqLwpAQCAtOTU2LDYgKzExMzYsMTQgQEAKIAljYXNlIEFDRVJfV01JRDoKIAkJc3RhdHVzID0gV01JRF9nZXRfdTMyKHZhbHVlLCBjYXAsIGludGVyZmFjZSk7CiAJCWJyZWFrOworCWNhc2UgQUNFUl9XTUlEX3YyOgorCQlpZiAoY2FwICYgKEFDRVJfQ0FQX1dJUkVMRVNTIHwKKwkJCSAgIEFDRVJfQ0FQX0JMVUVUT09USCB8CisJCQkgICBBQ0VSX0NBUF9USFJFRUcpKQorCQkJc3RhdHVzID0gd21pZF92Ml9nZXRfdTMyKHZhbHVlLCBjYXApOworCQllbHNlIGlmICh3bWlfaGFzX2d1aWQoV01JRF9HVUlEMikpCisJCQlzdGF0dXMgPSBXTUlEX2dldF91MzIodmFsdWUsIGNhcCwgaW50ZXJmYWNlKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTk4OSw2ICsxMTc3LDEzIEBACiAJCQl9CiAJCWNhc2UgQUNFUl9XTUlEOgogCQkJcmV0dXJuIFdNSURfc2V0X3UzMih2YWx1ZSwgY2FwLCBpbnRlcmZhY2UpOworCQljYXNlIEFDRVJfV01JRF92MjoKKwkJCWlmIChjYXAgJiAoQUNFUl9DQVBfV0lSRUxFU1MgfAorCQkJCSAgIEFDRVJfQ0FQX0JMVUVUT09USCB8CisJCQkJICAgQUNFUl9DQVBfVEhSRUVHKSkKKwkJCQlyZXR1cm4gd21pZF92Ml9zZXRfdTMyKHZhbHVlLCBjYXApOworCQkJZWxzZSBpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDIpKQorCQkJCXJldHVybiBXTUlEX3NldF91MzIodmFsdWUsIGNhcCwgaW50ZXJmYWNlKTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOwogCQl9CkBAIC0xMDk1LDE4NiArMTI5MCw2IEBACiAJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGFjZXJfYmFja2xpZ2h0X2RldmljZSk7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyB3bWlkM19nZXRfZGV2aWNlX3N0YXR1cyh1MzIgKnZhbHVlLCB1MTYgZGV2aWNlKQotewotCXN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlIHJldHVybl92YWx1ZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vYmplY3QgKm9iajsKLQlzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtIHBhcmFtcyA9IHsKLQkJLmZ1bmN0aW9uX251bSA9IDB4MSwKLQkJLmhvdGtleV9udW1iZXIgPSAweDAxLAotCQkuZGV2aWNlcyA9IGRldmljZSwKLQl9OwotCXN0cnVjdCBhY3BpX2J1ZmZlciBpbnB1dCA9IHsKLQkJc2l6ZW9mKHN0cnVjdCB3bWlkM19nZHNfaW5wdXRfcGFyYW0pLAotCQkmcGFyYW1zCi0JfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwotCi0Jc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChXTUlEX0dVSUQzLCAwLCAweDIsICZpbnB1dCwgJm91dHB1dCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4gc3RhdHVzOwotCi0Jb2JqID0gb3V0cHV0LnBvaW50ZXI7Ci0KLQlpZiAoIW9iaikKLQkJcmV0dXJuIEFFX0VSUk9SOwotCWVsc2UgaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7Ci0JCWtmcmVlKG9iaik7Ci0JCXJldHVybiBBRV9FUlJPUjsKLQl9Ci0JaWYgKG9iai0+YnVmZmVyLmxlbmd0aCAhPSA4KSB7Ci0JCXByX3dhcm4oIlVua25vd24gYnVmZmVyIGxlbmd0aCAlZFxuIiwgb2JqLT5idWZmZXIubGVuZ3RoKTsKLQkJa2ZyZWUob2JqKTsKLQkJcmV0dXJuIEFFX0VSUk9SOwotCX0KLQotCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7Ci0Ja2ZyZWUob2JqKTsKLQotCWlmIChyZXR1cm5fdmFsdWUuZXJyb3JfY29kZSB8fCByZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKQotCQlwcl93YXJuKCJHZXQgRGV2aWNlIFN0YXR1cyBmYWlsZWQ6IDB4JXggLSAweCV4XG4iLAotCQkJcmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUsCi0JCQlyZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKTsKLQllbHNlCi0JCSp2YWx1ZSA9ICEhKHJldHVybl92YWx1ZS5kZXZpY2VzICYgZGV2aWNlKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBnZXRfZGV2aWNlX3N0YXR1cyh1MzIgKnZhbHVlLCB1MzIgY2FwKQotewotCWlmICh3bWlfaGFzX2d1aWQoV01JRF9HVUlEMykpIHsKLQkJdTE2IGRldmljZTsKLQotCQlzd2l0Y2ggKGNhcCkgewotCQljYXNlIEFDRVJfQ0FQX1dJUkVMRVNTOgotCQkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfV0lSRUxFU1M7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ0VSX0NBUF9CTFVFVE9PVEg6Ci0JCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEg7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ0VSX0NBUF9USFJFRUc6Ci0JCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19USFJFRUc7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBBRV9FUlJPUjsKLQkJfQotCQlyZXR1cm4gd21pZDNfZ2V0X2RldmljZV9zdGF0dXModmFsdWUsIGRldmljZSk7Ci0KLQl9IGVsc2UgewotCQlyZXR1cm4gZ2V0X3UzMih2YWx1ZSwgY2FwKTsKLQl9Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyB3bWlkM19zZXRfZGV2aWNlX3N0YXR1cyh1MzIgdmFsdWUsIHUxNiBkZXZpY2UpCi17Ci0Jc3RydWN0IHdtaWQzX2dkc19yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwotCXUxNiBkZXZpY2VzOwotCXN0cnVjdCB3bWlkM19nZHNfaW5wdXRfcGFyYW0gcGFyYW1zID0gewotCQkuZnVuY3Rpb25fbnVtID0gMHgxLAotCQkuaG90a2V5X251bWJlciA9IDB4MDEsCi0JCS5kZXZpY2VzID0gQUNFUl9XTUlEM19HRFNfV0lSRUxFU1MgfAotCQkJCUFDRVJfV01JRDNfR0RTX1RIUkVFRyB8Ci0JCQkJQUNFUl9XTUlEM19HRFNfV0lNQVggfAotCQkJCUFDRVJfV01JRDNfR0RTX0JMVUVUT09USCwKLQl9OwotCXN0cnVjdCBhY3BpX2J1ZmZlciBpbnB1dCA9IHsKLQkJc2l6ZW9mKHN0cnVjdCB3bWlkM19nZHNfaW5wdXRfcGFyYW0pLAotCQkmcGFyYW1zCi0JfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwotCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwotCi0Jc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChXTUlEX0dVSUQzLCAwLCAweDIsICZpbnB1dCwgJm91dHB1dCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4gc3RhdHVzOwotCi0Jb2JqID0gb3V0cHV0LnBvaW50ZXI7Ci0KLQlpZiAoIW9iaikKLQkJcmV0dXJuIEFFX0VSUk9SOwotCWVsc2UgaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7Ci0JCWtmcmVlKG9iaik7Ci0JCXJldHVybiBBRV9FUlJPUjsKLQl9Ci0JaWYgKG9iai0+YnVmZmVyLmxlbmd0aCAhPSA4KSB7Ci0JCXByX3dhcm5pbmcoIlVua25vd24gYnVmZmVyIGxlbmd0aCAlZFxuIiwgb2JqLT5idWZmZXIubGVuZ3RoKTsKLQkJa2ZyZWUob2JqKTsKLQkJcmV0dXJuIEFFX0VSUk9SOwotCX0KLQotCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7Ci0Ja2ZyZWUob2JqKTsKLQotCWlmIChyZXR1cm5fdmFsdWUuZXJyb3JfY29kZSB8fCByZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKSB7Ci0JCXByX3dhcm5pbmcoIkdldCBDdXJyZW50IERldmljZSBTdGF0dXMgZmFpbGVkOiAiCi0JCQkiMHgleCAtIDB4JXhcbiIsIHJldHVybl92YWx1ZS5lcnJvcl9jb2RlLAotCQkJcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JZGV2aWNlcyA9IHJldHVybl92YWx1ZS5kZXZpY2VzOwotCXBhcmFtcy5mdW5jdGlvbl9udW0gPSAweDI7Ci0JcGFyYW1zLmhvdGtleV9udW1iZXIgPSAweDAxOwotCXBhcmFtcy5kZXZpY2VzID0gKHZhbHVlKSA/IChkZXZpY2VzIHwgZGV2aWNlKSA6IChkZXZpY2VzICYgfmRldmljZSk7Ci0KLQlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKFdNSURfR1VJRDMsIDAsIDB4MSwgJmlucHV0LCAmb3V0cHV0Mik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4gc3RhdHVzOwotCi0Jb2JqID0gb3V0cHV0Mi5wb2ludGVyOwotCi0JaWYgKCFvYmopCi0JCXJldHVybiBBRV9FUlJPUjsKLQllbHNlIGlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQlrZnJlZShvYmopOwotCQlyZXR1cm4gQUVfRVJST1I7Ci0JfQotCWlmIChvYmotPmJ1ZmZlci5sZW5ndGggIT0gNCkgewotCQlwcl93YXJuaW5nKCJVbmtub3duIGJ1ZmZlciBsZW5ndGggJWRcbiIsIG9iai0+YnVmZmVyLmxlbmd0aCk7Ci0JCWtmcmVlKG9iaik7Ci0JCXJldHVybiBBRV9FUlJPUjsKLQl9Ci0KLQlyZXR1cm5fdmFsdWUgPSAqKChzdHJ1Y3Qgd21pZDNfZ2RzX3JldHVybl92YWx1ZSAqKW9iai0+YnVmZmVyLnBvaW50ZXIpOwotCWtmcmVlKG9iaik7Ci0KLQlpZiAocmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUgfHwgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSkKLQkJcHJfd2FybmluZygiU2V0IERldmljZSBTdGF0dXMgZmFpbGVkOiAiCi0JCQkiMHgleCAtIDB4JXhcbiIsIHJldHVybl92YWx1ZS5lcnJvcl9jb2RlLAotCQkJcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgYWNwaV9zdGF0dXMgc2V0X2RldmljZV9zdGF0dXModTMyIHZhbHVlLCB1MzIgY2FwKQotewotCWlmICh3bWlfaGFzX2d1aWQoV01JRF9HVUlEMykpIHsKLQkJdTE2IGRldmljZTsKLQotCQlzd2l0Y2ggKGNhcCkgewotCQljYXNlIEFDRVJfQ0FQX1dJUkVMRVNTOgotCQkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfV0lSRUxFU1M7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ0VSX0NBUF9CTFVFVE9PVEg6Ci0JCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEg7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ0VSX0NBUF9USFJFRUc6Ci0JCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19USFJFRUc7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBBRV9FUlJPUjsKLQkJfQotCQlyZXR1cm4gd21pZDNfc2V0X2RldmljZV9zdGF0dXModmFsdWUsIGRldmljZSk7Ci0KLQl9IGVsc2UgewotCQlyZXR1cm4gc2V0X3UzMih2YWx1ZSwgY2FwKTsKLQl9Ci19Ci0KIC8qCiAgKiBSZmtpbGwgZGV2aWNlcwogICovCkBAIC0xMjg1LDEyICsxMzAwLDEzIEBACiAJdTMyIHN0YXRlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCXN0YXR1cyA9IGdldF91MzIoJnN0YXRlLCBBQ0VSX0NBUF9XSVJFTEVTUyk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCWlmIChxdWlya3MtPndpcmVsZXNzID09IDMpIHsKLQkJCXJma2lsbF9zZXRfaHdfc3RhdGUod2lyZWxlc3NfcmZraWxsLCAhc3RhdGUpOwotCQl9IGVsc2UgewotCQkJcmZraWxsX3NldF9zd19zdGF0ZSh3aXJlbGVzc19yZmtpbGwsICFzdGF0ZSk7CisJaWYgKGhhc19jYXAoQUNFUl9DQVBfV0lSRUxFU1MpKSB7CisJCXN0YXR1cyA9IGdldF91MzIoJnN0YXRlLCBBQ0VSX0NBUF9XSVJFTEVTUyk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJaWYgKHF1aXJrcy0+d2lyZWxlc3MgPT0gMykKKwkJCQlyZmtpbGxfc2V0X2h3X3N0YXRlKHdpcmVsZXNzX3Jma2lsbCwgIXN0YXRlKTsKKwkJCWVsc2UKKwkJCQlyZmtpbGxfc2V0X3N3X3N0YXRlKHdpcmVsZXNzX3Jma2lsbCwgIXN0YXRlKTsKIAkJfQogCX0KIApAQCAtMTMwMSw4ICsxMzE3LDcgQEAKIAl9CiAKIAlpZiAoaGFzX2NhcChBQ0VSX0NBUF9USFJFRUcpICYmIHdtaV9oYXNfZ3VpZChXTUlEX0dVSUQzKSkgewotCQlzdGF0dXMgPSB3bWlkM19nZXRfZGV2aWNlX3N0YXR1cygmc3RhdGUsCi0JCQkJQUNFUl9XTUlEM19HRFNfVEhSRUVHKTsKKwkJc3RhdHVzID0gZ2V0X3UzMigmc3RhdGUsIEFDRVJfV01JRDNfR0RTX1RIUkVFRyk7CiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJCXJma2lsbF9zZXRfc3dfc3RhdGUodGhyZWVnX3Jma2lsbCwgIXN0YXRlKTsKIAl9CkBAIC0xMzE2LDcgKzEzMzEsNyBAQAogCXUzMiBjYXAgPSAodW5zaWduZWQgbG9uZylkYXRhOwogCiAJaWYgKHJma2lsbF9pbml0ZWQpIHsKLQkJc3RhdHVzID0gc2V0X2RldmljZV9zdGF0dXMoIWJsb2NrZWQsIGNhcCk7CisJCXN0YXR1cyA9IHNldF91MzIoIWJsb2NrZWQsIGNhcCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTEzNDMsNyArMTM1OCw3IEBACiAJaWYgKCFyZmtpbGxfZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXN0YXR1cyA9IGdldF9kZXZpY2Vfc3RhdHVzKCZzdGF0ZSwgY2FwKTsKKwlzdGF0dXMgPSBnZXRfdTMyKCZzdGF0ZSwgY2FwKTsKIAogCWVyciA9IHJma2lsbF9yZWdpc3RlcihyZmtpbGxfZGV2KTsKIAlpZiAoZXJyKSB7CkBAIC0xMzU5LDE5ICsxMzc0LDI0IEBACiAKIHN0YXRpYyBpbnQgYWNlcl9yZmtpbGxfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jd2lyZWxlc3NfcmZraWxsID0gYWNlcl9yZmtpbGxfcmVnaXN0ZXIoZGV2LCBSRktJTExfVFlQRV9XTEFOLAotCQkiYWNlci13aXJlbGVzcyIsIEFDRVJfQ0FQX1dJUkVMRVNTKTsKLQlpZiAoSVNfRVJSKHdpcmVsZXNzX3Jma2lsbCkpCi0JCXJldHVybiBQVFJfRVJSKHdpcmVsZXNzX3Jma2lsbCk7CisJaW50IGVycjsKKworCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1dJUkVMRVNTKSkgeworCQl3aXJlbGVzc19yZmtpbGwgPSBhY2VyX3Jma2lsbF9yZWdpc3RlcihkZXYsIFJGS0lMTF9UWVBFX1dMQU4sCisJCQkiYWNlci13aXJlbGVzcyIsIEFDRVJfQ0FQX1dJUkVMRVNTKTsKKwkJaWYgKElTX0VSUih3aXJlbGVzc19yZmtpbGwpKSB7CisJCQllcnIgPSBQVFJfRVJSKHdpcmVsZXNzX3Jma2lsbCk7CisJCQlnb3RvIGVycm9yX3dpcmVsZXNzOworCQl9CisJfQogCiAJaWYgKGhhc19jYXAoQUNFUl9DQVBfQkxVRVRPT1RIKSkgewogCQlibHVldG9vdGhfcmZraWxsID0gYWNlcl9yZmtpbGxfcmVnaXN0ZXIoZGV2LAogCQkJUkZLSUxMX1RZUEVfQkxVRVRPT1RILCAiYWNlci1ibHVldG9vdGgiLAogCQkJQUNFUl9DQVBfQkxVRVRPT1RIKTsKIAkJaWYgKElTX0VSUihibHVldG9vdGhfcmZraWxsKSkgewotCQkJcmZraWxsX3VucmVnaXN0ZXIod2lyZWxlc3NfcmZraWxsKTsKLQkJCXJma2lsbF9kZXN0cm95KHdpcmVsZXNzX3Jma2lsbCk7Ci0JCQlyZXR1cm4gUFRSX0VSUihibHVldG9vdGhfcmZraWxsKTsKKwkJCWVyciA9IFBUUl9FUlIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJCQlnb3RvIGVycm9yX2JsdWV0b290aDsKIAkJfQogCX0KIApAQCAtMTM4MCwzMCArMTQwMCw0NCBAQAogCQkJUkZLSUxMX1RZUEVfV1dBTiwgImFjZXItdGhyZWVnIiwKIAkJCUFDRVJfQ0FQX1RIUkVFRyk7CiAJCWlmIChJU19FUlIodGhyZWVnX3Jma2lsbCkpIHsKLQkJCXJma2lsbF91bnJlZ2lzdGVyKHdpcmVsZXNzX3Jma2lsbCk7Ci0JCQlyZmtpbGxfZGVzdHJveSh3aXJlbGVzc19yZmtpbGwpOwotCQkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7Ci0JCQlyZmtpbGxfZGVzdHJveShibHVldG9vdGhfcmZraWxsKTsKLQkJCXJldHVybiBQVFJfRVJSKHRocmVlZ19yZmtpbGwpOworCQkJZXJyID0gUFRSX0VSUih0aHJlZWdfcmZraWxsKTsKKwkJCWdvdG8gZXJyb3JfdGhyZWVnOwogCQl9CiAJfQogCiAJcmZraWxsX2luaXRlZCA9IHRydWU7CiAKLQlpZiAoZWNfcmF3X21vZGUgfHwgIXdtaV9oYXNfZ3VpZChBQ0VSV01JRF9FVkVOVF9HVUlEKSkKKwlpZiAoKGVjX3Jhd19tb2RlIHx8ICF3bWlfaGFzX2d1aWQoQUNFUldNSURfRVZFTlRfR1VJRCkpICYmCisJICAgIGhhc19jYXAoQUNFUl9DQVBfV0lSRUxFU1MgfCBBQ0VSX0NBUF9CTFVFVE9PVEggfCBBQ0VSX0NBUF9USFJFRUcpKQogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFjZXJfcmZraWxsX3dvcmssCiAJCQlyb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKSk7CiAKIAlyZXR1cm4gMDsKKworZXJyb3JfdGhyZWVnOgorCWlmIChoYXNfY2FwKEFDRVJfQ0FQX0JMVUVUT09USCkpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJCXJma2lsbF9kZXN0cm95KGJsdWV0b290aF9yZmtpbGwpOworCX0KK2Vycm9yX2JsdWV0b290aDoKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUykpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIod2lyZWxlc3NfcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3kod2lyZWxlc3NfcmZraWxsKTsKKwl9CitlcnJvcl93aXJlbGVzczoKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBhY2VyX3Jma2lsbF9leGl0KHZvaWQpCiB7Ci0JaWYgKGVjX3Jhd19tb2RlIHx8ICF3bWlfaGFzX2d1aWQoQUNFUldNSURfRVZFTlRfR1VJRCkpCisJaWYgKChlY19yYXdfbW9kZSB8fCAhd21pX2hhc19ndWlkKEFDRVJXTUlEX0VWRU5UX0dVSUQpKSAmJgorCSAgICBoYXNfY2FwKEFDRVJfQ0FQX1dJUkVMRVNTIHwgQUNFUl9DQVBfQkxVRVRPT1RIIHwgQUNFUl9DQVBfVEhSRUVHKSkKIAkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZhY2VyX3Jma2lsbF93b3JrKTsKIAotCXJma2lsbF91bnJlZ2lzdGVyKHdpcmVsZXNzX3Jma2lsbCk7Ci0JcmZraWxsX2Rlc3Ryb3kod2lyZWxlc3NfcmZraWxsKTsKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUykpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIod2lyZWxlc3NfcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3kod2lyZWxlc3NfcmZraWxsKTsKKwl9CiAKIAlpZiAoaGFzX2NhcChBQ0VSX0NBUF9CTFVFVE9PVEgpKSB7CiAJCXJma2lsbF91bnJlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOwpAQCAtMTQyOCwxMSArMTQ2Miw3IEBACiAKIAlwcl9pbmZvKCJUaGlzIHRocmVlZyBzeXNmcyB3aWxsIGJlIHJlbW92ZWQgaW4gMjAxMiIKIAkJIiAtIHVzZWQgYnk6ICVzXG4iLCBjdXJyZW50LT5jb21tKTsKLQlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDMpKQotCQlzdGF0dXMgPSB3bWlkM19nZXRfZGV2aWNlX3N0YXR1cygmcmVzdWx0LAotCQkJCUFDRVJfV01JRDNfR0RTX1RIUkVFRyk7Ci0JZWxzZQotCQlzdGF0dXMgPSBnZXRfdTMyKCZyZXN1bHQsIEFDRVJfQ0FQX1RIUkVFRyk7CisJc3RhdHVzID0gZ2V0X3UzMigmcmVzdWx0LCBBQ0VSX0NBUF9USFJFRUcpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHJlc3VsdCk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiUmVhZCBlcnJvclxuIik7CkBAIC0xNDY0LDYgKzE0OTQsOCBAQAogCQlyZXR1cm4gc3ByaW50ZihidWYsICJBTVcwIHYyXG4iKTsKIAljYXNlIEFDRVJfV01JRDoKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiV01JRFxuIik7CisJY2FzZSBBQ0VSX1dNSURfdjI6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIldNSUQgdjJcbiIpOwogCWRlZmF1bHQ6CiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkVycm9yIVxuIik7CiAJfQpAQCAtMTg4MywxMiArMTkxNSwyMCBAQAogCWlmICghd21pX2hhc19ndWlkKEFNVzBfR1VJRDEpICYmIHdtaV9oYXNfZ3VpZChXTUlEX0dVSUQxKSkKIAkJaW50ZXJmYWNlID0gJndtaWRfaW50ZXJmYWNlOwogCisJaWYgKHdtaV9oYXNfZ3VpZChXTUlEX0dVSUQzKSkKKwkJaW50ZXJmYWNlID0gJndtaWRfdjJfaW50ZXJmYWNlOworCisJaWYgKGludGVyZmFjZSkKKwkJZG1pX3dhbGsodHlwZV9hYV9kbWlfZGVjb2RlLCBOVUxMKTsKKwogCWlmICh3bWlfaGFzX2d1aWQoV01JRF9HVUlEMikgJiYgaW50ZXJmYWNlKSB7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoV01JRF9zZXRfY2FwYWJpbGl0aWVzKCkpKSB7CisJCWlmICghaGFzX3R5cGVfYWEgJiYgQUNQSV9GQUlMVVJFKFdNSURfc2V0X2NhcGFiaWxpdGllcygpKSkgewogCQkJcHJfZXJyKCJVbmFibGUgdG8gZGV0ZWN0IGF2YWlsYWJsZSBXTUlEIGRldmljZXNcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KLQl9IGVsc2UgaWYgKCF3bWlfaGFzX2d1aWQoV01JRF9HVUlEMikgJiYgaW50ZXJmYWNlKSB7CisJCS8qIFdNSUQgYWx3YXlzIHByb3ZpZGVzIGJyaWdodG5lc3MgbWV0aG9kcyAqLworCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQlJJR0hUTkVTUzsKKwl9IGVsc2UgaWYgKCF3bWlfaGFzX2d1aWQoV01JRF9HVUlEMikgJiYgaW50ZXJmYWNlICYmICFoYXNfdHlwZV9hYSkgewogCQlwcl9lcnIoIk5vIFdNSUQgZGV2aWNlIGRldGVjdGlvbiBtZXRob2QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xOTEyLDcgKzE5NTIsNyBAQAogCiAJc2V0X3F1aXJrcygpOwogCi0JaWYgKGFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSAmJiBoYXNfY2FwKEFDRVJfQ0FQX0JSSUdIVE5FU1MpKSB7CisJaWYgKGFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgewogCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgJj0gfkFDRVJfQ0FQX0JSSUdIVE5FU1M7CiAJCXByX2luZm8oIkJyaWdodG5lc3MgbXVzdCBiZSBjb250cm9sbGVkIGJ5ICIKIAkJICAgICAgICJnZW5lcmljIHZpZGVvIGRyaXZlclxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy1sYXB0b3AuYwppbmRleCBmYTZkN2VjLi5lZGFjY2FkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLWxhcHRvcC5jCkBAIC00LDYgKzQsNyBAQAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBKdWxpZW4gTGVyb3VnZSwgMjAwMy0yMDA2IEthcm9sIEtvemltb3IKICAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBDb3JlbnRpbiBDaGFyeQorICogIENvcHlyaWdodCAoQykgMjAxMSBXaW5kIFJpdmVyIFN5c3RlbXMKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDgsNiArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NwYXJzZS1rZXltYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC1wb2xsZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgpAQCAtODMsMjYgKzg1LDMyIEBACiBzdGF0aWMgaW50IGJsdWV0b290aF9zdGF0dXMgPSAxOwogc3RhdGljIGludCB3aW1heF9zdGF0dXMgPSAtMTsKIHN0YXRpYyBpbnQgd3dhbl9zdGF0dXMgPSAtMTsKK3N0YXRpYyBpbnQgYWxzX3N0YXR1czsKIAogbW9kdWxlX3BhcmFtKHdsYW5fc3RhdHVzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyh3bGFuX3N0YXR1cywgIlNldCB0aGUgd2lyZWxlc3Mgc3RhdHVzIG9uIGJvb3QgIgogCQkgIigwID0gZGlzYWJsZWQsIDEgPSBlbmFibGVkLCAtMSA9IGRvbid0IGRvIGFueXRoaW5nKS4gIgotCQkgImRlZmF1bHQgaXMgMSIpOworCQkgImRlZmF1bHQgaXMgLTEiKTsKIAogbW9kdWxlX3BhcmFtKGJsdWV0b290aF9zdGF0dXMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGJsdWV0b290aF9zdGF0dXMsICJTZXQgdGhlIHdpcmVsZXNzIHN0YXR1cyBvbiBib290ICIKIAkJICIoMCA9IGRpc2FibGVkLCAxID0gZW5hYmxlZCwgLTEgPSBkb24ndCBkbyBhbnl0aGluZykuICIKLQkJICJkZWZhdWx0IGlzIDEiKTsKKwkJICJkZWZhdWx0IGlzIC0xIik7CiAKIG1vZHVsZV9wYXJhbSh3aW1heF9zdGF0dXMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHdpbWF4X3N0YXR1cywgIlNldCB0aGUgd2lyZWxlc3Mgc3RhdHVzIG9uIGJvb3QgIgogCQkgIigwID0gZGlzYWJsZWQsIDEgPSBlbmFibGVkLCAtMSA9IGRvbid0IGRvIGFueXRoaW5nKS4gIgotCQkgImRlZmF1bHQgaXMgMSIpOworCQkgImRlZmF1bHQgaXMgLTEiKTsKIAogbW9kdWxlX3BhcmFtKHd3YW5fc3RhdHVzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyh3d2FuX3N0YXR1cywgIlNldCB0aGUgd2lyZWxlc3Mgc3RhdHVzIG9uIGJvb3QgIgogCQkgIigwID0gZGlzYWJsZWQsIDEgPSBlbmFibGVkLCAtMSA9IGRvbid0IGRvIGFueXRoaW5nKS4gIgotCQkgImRlZmF1bHQgaXMgMSIpOworCQkgImRlZmF1bHQgaXMgLTEiKTsKKworbW9kdWxlX3BhcmFtKGFsc19zdGF0dXMsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFsc19zdGF0dXMsICJTZXQgdGhlIEFMUyBzdGF0dXMgb24gYm9vdCAiCisJCSAiKDAgPSBkaXNhYmxlZCwgMSA9IGVuYWJsZWQpLiAiCisJCSAiZGVmYXVsdCBpcyAwIik7CiAKIC8qCiAgKiBTb21lIGV2ZW50cyB3ZSB1c2UsIHNhbWUgZm9yIGFsbCBBc3VzCkBAIC0xNzMsNiArMTgxLDI5IEBACiAjZGVmaW5lIE1FVEhPRF9LQkRfTElHSFRfU0VUCSJTTEtCIgogI2RlZmluZSBNRVRIT0RfS0JEX0xJR0hUX0dFVAkiR0xLQiIKIAorLyogRm9yIFBlZ2F0cm9uIEx1Y2lkIHRhYmxldCAqLworI2RlZmluZSBERVZJQ0VfTkFNRV9QRUdBCSJMdWNpZCIKKworI2RlZmluZSBNRVRIT0RfUEVHQV9FTkFCTEUJIkVOUFIiCisjZGVmaW5lIE1FVEhPRF9QRUdBX0RJU0FCTEUJIkRBUFIiCisjZGVmaW5lIFBFR0FfV0xBTgkweDAwCisjZGVmaW5lIFBFR0FfQkxVRVRPT1RICTB4MDEKKyNkZWZpbmUgUEVHQV9XV0FOCTB4MDIKKyNkZWZpbmUgUEVHQV9BTFMJMHgwNAorI2RlZmluZSBQRUdBX0FMU19QT1dFUgkweDA1CisKKyNkZWZpbmUgTUVUSE9EX1BFR0FfUkVBRAkiUkRMTiIKKyNkZWZpbmUgUEVHQV9SRUFEX0FMU19ICTB4MDIKKyNkZWZpbmUgUEVHQV9SRUFEX0FMU19MCTB4MDMKKworI2RlZmluZSBQRUdBX0FDQ0VMX05BTUUgInBlZ2FfYWNjZWwiCisjZGVmaW5lIFBFR0FfQUNDRUxfREVTQyAiUGVnYXRyb24gTHVjaWQgVGFibGV0IEFjY2VsZXJvbWV0ZXIiCisjZGVmaW5lIE1FVEhPRF9YTFJYICJYTFJYIgorI2RlZmluZSBNRVRIT0RfWExSWSAiWExSWSIKKyNkZWZpbmUgTUVUSE9EX1hMUlogIlhMUloiCisjZGVmaW5lIFBFR0FfQUNDX0NMQU1QIDUxMiAvKiAxRyBhY2NlbCBpcyByZXBvcnRlZCBhcyB+MjU2LCBzbyBjbGFtcCB0byAyRyAqLworI2RlZmluZSBQRUdBX0FDQ19SRVRSSUVTIDMKKwogLyoKICAqIERlZmluZSBhIHNwZWNpZmljIGxlZCBzdHJ1Y3R1cmUgdG8ga2VlcCB0aGUgbWFpbiBzdHJ1Y3R1cmUgY2xlYW4KICAqLwpAQCAtMTg1LDYgKzIxNiwxNSBAQAogfTsKIAogLyoKKyAqIFNhbWUgdGhpbmcgZm9yIHJma2lsbAorICovCitzdHJ1Y3QgYXN1c19wZWdhX3Jma2lsbCB7CisJaW50IGNvbnRyb2xfaWQ7CQkvKiB0eXBlIG9mIGNvbnRyb2wuIE1hcHMgdG8gUEVHQV8qIHZhbHVlcyAqLworCXN0cnVjdCByZmtpbGwgKnJma2lsbDsKKwlzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXM7Cit9OworCisvKgogICogVGhpcyBpcyB0aGUgbWFpbiBzdHJ1Y3R1cmUsIHdlIGNhbiB1c2UgaXQgdG8gc3RvcmUgYW55dGhpbmcgaW50ZXJlc3RpbmcKICAqIGFib3V0IHRoZSBob3RrIGRldmljZQogICovCkBAIC0xOTgsNiArMjM4LDcgQEAKIAogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2OwogCXN0cnVjdCBrZXlfZW50cnkgKmtleW1hcDsKKwlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqcGVnYV9hY2NlbF9wb2xsOwogCiAJc3RydWN0IGFzdXNfbGVkIG1sZWQ7CiAJc3RydWN0IGFzdXNfbGVkIHRsZWQ7CkBAIC0yMDksOSArMjUwLDE4IEBACiAKIAlpbnQgd2lyZWxlc3Nfc3RhdHVzOwogCWJvb2wgaGF2ZV9yc3RzOworCWJvb2wgaXNfcGVnYV9sdWNpZDsKKwlib29sIHBlZ2FfYWNjX2xpdmU7CisJaW50IHBlZ2FfYWNjX3g7CisJaW50IHBlZ2FfYWNjX3k7CisJaW50IHBlZ2FfYWNjX3o7CiAKIAlzdHJ1Y3QgcmZraWxsICpncHNfcmZraWxsOwogCisJc3RydWN0IGFzdXNfcGVnYV9yZmtpbGwgd2xhbnJmazsKKwlzdHJ1Y3QgYXN1c19wZWdhX3Jma2lsbCBidHJmazsKKwlzdHJ1Y3QgYXN1c19wZWdhX3Jma2lsbCB3d2FucmZrOworCiAJYWNwaV9oYW5kbGUgaGFuZGxlOwkvKiB0aGUgaGFuZGxlIG9mIHRoZSBob3RrIGRldmljZSAqLwogCXUzMiBsZWRkX3N0YXR1czsJLyogc3RhdHVzIG9mIHRoZSBMRUQgZGlzcGxheSAqLwogCXU4IGxpZ2h0X2xldmVsOwkJLyogbGlnaHQgc2Vuc29yIGxldmVsICovCkBAIC0zMjMsNiArMzczLDEyNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgYm9vbCBhc3VzX2NoZWNrX3BlZ2FfbHVjaWQoc3RydWN0IGFzdXNfbGFwdG9wICphc3VzKQoreworCXJldHVybiAhc3RyY21wKGFzdXMtPm5hbWUsIERFVklDRV9OQU1FX1BFR0EpICYmCisJICAgIWFjcGlfY2hlY2tfaGFuZGxlKGFzdXMtPmhhbmRsZSwgTUVUSE9EX1BFR0FfRU5BQkxFLCBOVUxMKSAmJgorCSAgICFhY3BpX2NoZWNrX2hhbmRsZShhc3VzLT5oYW5kbGUsIE1FVEhPRF9QRUdBX0RJU0FCTEUsIE5VTEwpICYmCisJICAgIWFjcGlfY2hlY2tfaGFuZGxlKGFzdXMtPmhhbmRsZSwgTUVUSE9EX1BFR0FfUkVBRCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYXN1c19wZWdhX2x1Y2lkX3NldChzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMsIGludCB1bml0LCBib29sIGVuYWJsZSkKK3sKKwljaGFyICptZXRob2QgPSBlbmFibGUgPyBNRVRIT0RfUEVHQV9FTkFCTEUgOiBNRVRIT0RfUEVHQV9ESVNBQkxFOworCXJldHVybiB3cml0ZV9hY3BpX2ludChhc3VzLT5oYW5kbGUsIG1ldGhvZCwgdW5pdCk7Cit9CisKK3N0YXRpYyBpbnQgcGVnYV9hY2NfYXhpcyhzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMsIGludCBjdXJyLCBjaGFyICptZXRob2QpCit7CisJaW50IGksIGRlbHRhOworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisJZm9yIChpID0gMDsgaSA8IFBFR0FfQUNDX1JFVFJJRVM7IGkrKykgeworCQlhY3BpX2V2YWx1YXRlX2ludGVnZXIoYXN1cy0+aGFuZGxlLCBtZXRob2QsIE5VTEwsICZ2YWwpOworCisJCS8qIFRoZSBvdXRwdXQgaXMgbm9pc3kuICBGcm9tIHJlYWRpbmcgdGhlIEFTTAorCQkgKiBkaXNzYXNzZW1ibHksIHRpbWVvdXQgZXJyb3JzIGFyZSByZXR1cm5lZCB3aXRoIDEncworCQkgKiBpbiB0aGUgaGlnaCB3b3JkLCBhbmQgdGhlIGxhY2sgb2YgbG9ja2luZyBhcm91bmQKKwkJICogdGhlaSBoaS9sbyBieXRlIHJlYWRzIG1lYW5zIHRoYXQgYSB0cmFuc2l0aW9uCisJCSAqIGJldHdlZW4gKGZvciBleGFtcGxlKSAtMSBhbmQgMCBjb3VsZCBiZSByZWFkIGFzCisJCSAqIDB4ZmYwMCBvciAweDAwZmYuICovCisJCWRlbHRhID0gYWJzKGN1cnIgLSAoc2hvcnQpdmFsKTsKKwkJaWYgKGRlbHRhIDwgMTI4ICYmICEodmFsICYgfjB4ZmZmZikpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGNsYW1wX3ZhbCgoc2hvcnQpdmFsLCAtUEVHQV9BQ0NfQ0xBTVAsIFBFR0FfQUNDX0NMQU1QKTsKK30KKworc3RhdGljIHZvaWQgcGVnYV9hY2NlbF9wb2xsKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICppcGQpCit7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gaXBkLT5pbnB1dC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMgPSBkZXZfZ2V0X2RydmRhdGEocGFyZW50KTsKKworCS8qIEluIHNvbWUgY2FzZXMsIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgdG8gcG9sbCBjYXVzZXMgYQorCSAqIHJlY3Vyc2l2ZSBmYXVsdCB1bmRlciB0aGUgcG9sbGRldiB3b3JrZXIuICBUaGlzIGlzCisJICogYXBwYXJlbnRseSByZWxhdGVkIHRvIHZlcnkgZWFybHkgdXNlcnNwYWNlIGFjY2VzcyB0byB0aGUKKwkgKiBkZXZpY2UsIGFuZCBwZXJoYXBzIGEgZmlybXdhcmUgYnVnLiBGYWtlIHRoZSBmaXJzdCByZXBvcnQuICovCisJaWYgKCFhc3VzLT5wZWdhX2FjY19saXZlKSB7CisJCWFzdXMtPnBlZ2FfYWNjX2xpdmUgPSB0cnVlOworCQlpbnB1dF9yZXBvcnRfYWJzKGlwZC0+aW5wdXQsIEFCU19YLCAwKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpcGQtPmlucHV0LCBBQlNfWSwgMCk7CisJCWlucHV0X3JlcG9ydF9hYnMoaXBkLT5pbnB1dCwgQUJTX1osIDApOworCQlpbnB1dF9zeW5jKGlwZC0+aW5wdXQpOworCQlyZXR1cm47CisJfQorCisJYXN1cy0+cGVnYV9hY2NfeCA9IHBlZ2FfYWNjX2F4aXMoYXN1cywgYXN1cy0+cGVnYV9hY2NfeCwgTUVUSE9EX1hMUlgpOworCWFzdXMtPnBlZ2FfYWNjX3kgPSBwZWdhX2FjY19heGlzKGFzdXMsIGFzdXMtPnBlZ2FfYWNjX3ksIE1FVEhPRF9YTFJZKTsKKwlhc3VzLT5wZWdhX2FjY196ID0gcGVnYV9hY2NfYXhpcyhhc3VzLCBhc3VzLT5wZWdhX2FjY196LCBNRVRIT0RfWExSWik7CisKKwkvKiBOb3RlIHRyYW5zZm9ybSwgY29udmVydCB0byAicmlnaHQvdXAvb3V0IiBpbiB0aGUgbmF0aXZlCisJICogbGFuZHNjYXBlIG9yaWVudGF0aW9uIChpLmUuIHRoZSB2ZWN0b3IgaXMgdGhlIGRpcmVjdGlvbiBvZgorCSAqICJyZWFsIHVwIiBpbiB0aGUgZGV2aWNlJ3MgY2FydGllc2lhbiBjb29yZGluYXRlcykuICovCisJaW5wdXRfcmVwb3J0X2FicyhpcGQtPmlucHV0LCBBQlNfWCwgLWFzdXMtPnBlZ2FfYWNjX3gpOworCWlucHV0X3JlcG9ydF9hYnMoaXBkLT5pbnB1dCwgQUJTX1ksIC1hc3VzLT5wZWdhX2FjY195KTsKKwlpbnB1dF9yZXBvcnRfYWJzKGlwZC0+aW5wdXQsIEFCU19aLCAgYXN1cy0+cGVnYV9hY2Nfeik7CisJaW5wdXRfc3luYyhpcGQtPmlucHV0KTsKK30KKworc3RhdGljIHZvaWQgcGVnYV9hY2NlbF9leGl0KHN0cnVjdCBhc3VzX2xhcHRvcCAqYXN1cykKK3sKKwlpZiAoYXN1cy0+cGVnYV9hY2NlbF9wb2xsKSB7CisJCWlucHV0X3VucmVnaXN0ZXJfcG9sbGVkX2RldmljZShhc3VzLT5wZWdhX2FjY2VsX3BvbGwpOworCQlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UoYXN1cy0+cGVnYV9hY2NlbF9wb2xsKTsKKwl9CisJYXN1cy0+cGVnYV9hY2NlbF9wb2xsID0gTlVMTDsKK30KKworc3RhdGljIGludCBwZWdhX2FjY2VsX2luaXQoc3RydWN0IGFzdXNfbGFwdG9wICphc3VzKQoreworCWludCBlcnI7CisJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlwZDsKKworCWlmICghYXN1cy0+aXNfcGVnYV9sdWNpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYWNwaV9jaGVja19oYW5kbGUoYXN1cy0+aGFuZGxlLCBNRVRIT0RfWExSWCwgTlVMTCkgfHwKKwkgICAgYWNwaV9jaGVja19oYW5kbGUoYXN1cy0+aGFuZGxlLCBNRVRIT0RfWExSWSwgTlVMTCkgfHwKKwkgICAgYWNwaV9jaGVja19oYW5kbGUoYXN1cy0+aGFuZGxlLCBNRVRIT0RfWExSWiwgTlVMTCkpCisJCXJldHVybiAtRU5PREVWOworCisJaXBkID0gaW5wdXRfYWxsb2NhdGVfcG9sbGVkX2RldmljZSgpOworCWlmICghaXBkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlwZC0+cG9sbCA9IHBlZ2FfYWNjZWxfcG9sbDsKKwlpcGQtPnBvbGxfaW50ZXJ2YWwgPSAxMjU7CisJaXBkLT5wb2xsX2ludGVydmFsX21pbiA9IDUwOworCWlwZC0+cG9sbF9pbnRlcnZhbF9tYXggPSAyMDAwOworCisJaXBkLT5pbnB1dC0+bmFtZSA9IFBFR0FfQUNDRUxfREVTQzsKKwlpcGQtPmlucHV0LT5waHlzID0gUEVHQV9BQ0NFTF9OQU1FICIvaW5wdXQwIjsKKwlpcGQtPmlucHV0LT5kZXYucGFyZW50ID0gJmFzdXMtPnBsYXRmb3JtX2RldmljZS0+ZGV2OworCWlwZC0+aW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKworCXNldF9iaXQoRVZfQUJTLCBpcGQtPmlucHV0LT5ldmJpdCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaXBkLT5pbnB1dCwgQUJTX1gsCisJCQkgICAgIC1QRUdBX0FDQ19DTEFNUCwgUEVHQV9BQ0NfQ0xBTVAsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlwZC0+aW5wdXQsIEFCU19ZLAorCQkJICAgICAtUEVHQV9BQ0NfQ0xBTVAsIFBFR0FfQUNDX0NMQU1QLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpcGQtPmlucHV0LCBBQlNfWiwKKwkJCSAgICAgLVBFR0FfQUNDX0NMQU1QLCBQRUdBX0FDQ19DTEFNUCwgMCwgMCk7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGlwZCk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCisJYXN1cy0+cGVnYV9hY2NlbF9wb2xsID0gaXBkOworCXJldHVybiAwOworCitleGl0OgorCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShpcGQpOworCXJldHVybiBlcnI7Cit9CisKIC8qIEdlbmVyaWMgTEVEIGZ1bmN0aW9uICovCiBzdGF0aWMgaW50IGFzdXNfbGVkX3NldChzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMsIGNvbnN0IGNoYXIgKm1ldGhvZCwKIAkJCSBpbnQgdmFsdWUpCkBAIC00MzAsMTcgKzYwMSwxNyBAQAogCiBzdGF0aWMgdm9pZCBhc3VzX2xlZF9leGl0KHN0cnVjdCBhc3VzX2xhcHRvcCAqYXN1cykKIHsKLQlpZiAoYXN1cy0+bWxlZC5sZWQuZGV2KQorCWlmICghSVNfRVJSX09SX05VTEwoYXN1cy0+bWxlZC5sZWQuZGV2KSkKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFzdXMtPm1sZWQubGVkKTsKLQlpZiAoYXN1cy0+dGxlZC5sZWQuZGV2KQorCWlmICghSVNfRVJSX09SX05VTEwoYXN1cy0+dGxlZC5sZWQuZGV2KSkKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFzdXMtPnRsZWQubGVkKTsKLQlpZiAoYXN1cy0+cGxlZC5sZWQuZGV2KQorCWlmICghSVNfRVJSX09SX05VTEwoYXN1cy0+cGxlZC5sZWQuZGV2KSkKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFzdXMtPnBsZWQubGVkKTsKLQlpZiAoYXN1cy0+cmxlZC5sZWQuZGV2KQorCWlmICghSVNfRVJSX09SX05VTEwoYXN1cy0+cmxlZC5sZWQuZGV2KSkKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFzdXMtPnJsZWQubGVkKTsKLQlpZiAoYXN1cy0+Z2xlZC5sZWQuZGV2KQorCWlmICghSVNfRVJSX09SX05VTEwoYXN1cy0+Z2xlZC5sZWQuZGV2KSkKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFzdXMtPmdsZWQubGVkKTsKLQlpZiAoYXN1cy0+a2xlZC5sZWQuZGV2KQorCWlmICghSVNfRVJSX09SX05VTEwoYXN1cy0+a2xlZC5sZWQuZGV2KSkKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFzdXMtPmtsZWQubGVkKTsKIAlpZiAoYXN1cy0+bGVkX3dvcmtxdWV1ZSkgewogCQlkZXN0cm95X3dvcmtxdWV1ZShhc3VzLT5sZWRfd29ya3F1ZXVlKTsKQEAgLTQ3NCw2ICs2NDUsMTMgQEAKIAlpbnQgcjsKIAogCS8qCisJICogVGhlIFBlZ2F0cm9uIEx1Y2lkIGhhcyBubyBwaHlzaWNhbCBsZWRzLCBidXQgYWxsIG1ldGhvZHMgYXJlCisJICogYXZhaWxhYmxlIGluIHRoZSBEU0RULi4uCisJICovCisJaWYgKGFzdXMtPmlzX3BlZ2FfbHVjaWQpCisJCXJldHVybiAwOworCisJLyoKIAkgKiBGdW5jdGlvbnMgdGhhdCBhY3R1YWxseSB1cGRhdGUgdGhlIExFRCdzIGFyZSBjYWxsZWQgZnJvbSBhCiAJICogd29ya3F1ZXVlLiBCeSBkb2luZyB0aGlzIGFzIHNlcGFyYXRlIHdvcmsgcmF0aGVyIHRoYW4gd2hlbiB0aGUgTEVECiAJICogc3Vic3lzdGVtIGFza3MsIHdlIGF2b2lkIG1lc3Npbmcgd2l0aCB0aGUgQXN1cyBBQ1BJIHN0dWZmIGR1cmluZyBhCkBAIC05MDcsOCArMTA4NSwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBhc3VzX2Fsc19zd2l0Y2goc3RydWN0IGFzdXNfbGFwdG9wICphc3VzLCBpbnQgdmFsdWUpCiB7Ci0JaWYgKHdyaXRlX2FjcGlfaW50KGFzdXMtPmhhbmRsZSwgTUVUSE9EX0FMU19DT05UUk9MLCB2YWx1ZSkpCi0JCXByX3dhcm4oIkVycm9yIHNldHRpbmcgbGlnaHQgc2Vuc29yIHN3aXRjaFxuIik7CisJaW50IHJldDsKKworCWlmIChhc3VzLT5pc19wZWdhX2x1Y2lkKSB7CisJCXJldCA9IGFzdXNfcGVnYV9sdWNpZF9zZXQoYXN1cywgUEVHQV9BTFMsIHZhbHVlKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBhc3VzX3BlZ2FfbHVjaWRfc2V0KGFzdXMsIFBFR0FfQUxTX1BPV0VSLCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gd3JpdGVfYWNwaV9pbnQoYXN1cy0+aGFuZGxlLCBNRVRIT0RfQUxTX0NPTlRST0wsIHZhbHVlKTsKKwl9CisJaWYgKHJldCkKKwkJcHJfd2FybmluZygiRXJyb3Igc2V0dGluZyBsaWdodCBzZW5zb3Igc3dpdGNoXG4iKTsKKwogCWFzdXMtPmxpZ2h0X3N3aXRjaCA9IHZhbHVlOwogfQogCkBAIC05NjQsNiArMTE1MiwzNSBAQAogCXJldHVybiBydjsKIH0KIAorc3RhdGljIGludCBwZWdhX2ludF9yZWFkKHN0cnVjdCBhc3VzX2xhcHRvcCAqYXN1cywgaW50IGFyZywgaW50ICpyZXN1bHQpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlpbnQgZXJyID0gd3JpdGVfYWNwaV9pbnRfcmV0KGFzdXMtPmhhbmRsZSwgTUVUSE9EX1BFR0FfUkVBRCwgYXJnLAorCQkJCSAgICAgJmJ1ZmZlcik7CisJaWYgKCFlcnIpIHsKKwkJdW5pb24gYWNwaV9vYmplY3QgKm9iaiA9IGJ1ZmZlci5wb2ludGVyOworCQlpZiAob2JqICYmIG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikKKwkJCSpyZXN1bHQgPSBvYmotPmludGVnZXIudmFsdWU7CisJCWVsc2UKKwkJCWVyciA9IC1FSU87CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbHN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyLCBoaSwgbG87CisKKwllcnIgPSBwZWdhX2ludF9yZWFkKGFzdXMsIFBFR0FfUkVBRF9BTFNfSCwgJmhpKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcGVnYV9pbnRfcmVhZChhc3VzLCBQRUdBX1JFQURfQUxTX0wsICZsbyk7CisJaWYgKCFlcnIpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAxMCAqIGhpICsgbG8pOworCXJldHVybiBlcnI7Cit9CisKIC8qCiAgKiBHUFMKICAqLwpAQCAtMTA2Miw2ICsxMjc5LDg2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGludCBwZWdhX3Jma2lsbF9zZXQodm9pZCAqZGF0YSwgYm9vbCBibG9ja2VkKQoreworCXN0cnVjdCBhc3VzX3BlZ2FfcmZraWxsICpwZWdhX3JmayA9IGRhdGE7CisKKwlpbnQgcmV0ID0gYXN1c19wZWdhX2x1Y2lkX3NldChwZWdhX3Jmay0+YXN1cywgcGVnYV9yZmstPmNvbnRyb2xfaWQsICFibG9ja2VkKTsKKwlwcl93YXJuKCJTZXR0aW5nIHJma2lsbCAlZCwgdG8gJWQ7IHJldHVybmVkICVkXG4iLCBwZWdhX3Jmay0+Y29udHJvbF9pZCwgIWJsb2NrZWQsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJma2lsbF9vcHMgcGVnYV9yZmtpbGxfb3BzID0geworCS5zZXRfYmxvY2sgPSBwZWdhX3Jma2lsbF9zZXQsCit9OworCitzdGF0aWMgdm9pZCBwZWdhX3Jma2lsbF90ZXJtaW5hdGUoc3RydWN0IGFzdXNfcGVnYV9yZmtpbGwgKnBlZ2FfcmZrKQoreworCXByX3dhcm4oIlRlcm1pbmF0aW5nICVkXG4iLCBwZWdhX3Jmay0+Y29udHJvbF9pZCk7CisJaWYgKHBlZ2FfcmZrLT5yZmtpbGwpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIocGVnYV9yZmstPnJma2lsbCk7CisJCXJma2lsbF9kZXN0cm95KHBlZ2FfcmZrLT5yZmtpbGwpOworCQlwZWdhX3Jmay0+cmZraWxsID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBlZ2FfcmZraWxsX2V4aXQoc3RydWN0IGFzdXNfbGFwdG9wICphc3VzKQoreworCXBlZ2FfcmZraWxsX3Rlcm1pbmF0ZSgmYXN1cy0+d3dhbnJmayk7CisJcGVnYV9yZmtpbGxfdGVybWluYXRlKCZhc3VzLT5idHJmayk7CisJcGVnYV9yZmtpbGxfdGVybWluYXRlKCZhc3VzLT53bGFucmZrKTsKK30KKworc3RhdGljIGludCBwZWdhX3Jma2lsbF9zZXR1cChzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMsIHN0cnVjdCBhc3VzX3BlZ2FfcmZraWxsICpwZWdhX3JmaywKKwkJY29uc3QgY2hhciAqbmFtZSwgaW50IGNvbnRyb2xpZCwgaW50IHJma2lsbF90eXBlKQoreworCWludCByZXN1bHQ7CisKKwlwcl93YXJuKCJTZXR0aW5nIHVwIHJmayAlcywgY29udHJvbCAlZCwgdHlwZSAlZFxuIiwgbmFtZSwgY29udHJvbGlkLCByZmtpbGxfdHlwZSk7CisJcGVnYV9yZmstPmNvbnRyb2xfaWQgPSBjb250cm9saWQ7CisJcGVnYV9yZmstPmFzdXMgPSBhc3VzOworCXBlZ2FfcmZrLT5yZmtpbGwgPSByZmtpbGxfYWxsb2MobmFtZSwgJmFzdXMtPnBsYXRmb3JtX2RldmljZS0+ZGV2LAorCQkJCQlyZmtpbGxfdHlwZSwgJnBlZ2FfcmZraWxsX29wcywgcGVnYV9yZmspOworCWlmICghcGVnYV9yZmstPnJma2lsbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXN1bHQgPSByZmtpbGxfcmVnaXN0ZXIocGVnYV9yZmstPnJma2lsbCk7CisJaWYgKHJlc3VsdCkgeworCQlyZmtpbGxfZGVzdHJveShwZWdhX3Jmay0+cmZraWxsKTsKKwkJcGVnYV9yZmstPnJma2lsbCA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwZWdhX3Jma2lsbF9pbml0KHN0cnVjdCBhc3VzX2xhcHRvcCAqYXN1cykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmKCFhc3VzLT5pc19wZWdhX2x1Y2lkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IHBlZ2FfcmZraWxsX3NldHVwKGFzdXMsICZhc3VzLT53bGFucmZrLCAicGVnYS13bGFuIiwgUEVHQV9XTEFOLCBSRktJTExfVFlQRV9XTEFOKTsKKwlpZihyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcGVnYV9yZmtpbGxfc2V0dXAoYXN1cywgJmFzdXMtPmJ0cmZrLCAicGVnYS1idCIsIFBFR0FfQkxVRVRPT1RILCBSRktJTExfVFlQRV9CTFVFVE9PVEgpOworCWlmKHJldCkKKwkJZ290byBlcnJfYnRyZms7CisJcmV0ID0gcGVnYV9yZmtpbGxfc2V0dXAoYXN1cywgJmFzdXMtPnd3YW5yZmssICJwZWdhLXd3YW4iLCBQRUdBX1dXQU4sIFJGS0lMTF9UWVBFX1dXQU4pOworCWlmKHJldCkKKwkJZ290byBlcnJfd3dhbnJmazsKKworCXByX3dhcm4oIlBlZ2EgcmZraWxsIGluaXQgc3VjY2VlZGVkXG4iKTsKKwlyZXR1cm4gMDsKK2Vycl93d2FucmZrOgorCXBlZ2FfcmZraWxsX3Rlcm1pbmF0ZSgmYXN1cy0+YnRyZmspOworZXJyX2J0cmZrOgorCXBlZ2FfcmZraWxsX3Rlcm1pbmF0ZSgmYXN1cy0+d2xhbnJmayk7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogSW5wdXQgZGV2aWNlIChpLmUuIGhvdGtleXMpCiAgKi8KQEAgLTExNDEsNiArMTQzOCwxNCBAQAogCQl9CiAJCXJldHVybiA7CiAJfQorCisJLyogQWNjZWxlcm9tZXRlciAiY29hcnNlIG9yaWVudGF0aW9uIGNoYW5nZSIgZXZlbnQgKi8KKwlpZiAoYXN1cy0+cGVnYV9hY2NlbF9wb2xsICYmIGV2ZW50ID09IDB4RUEpIHsKKwkJa29iamVjdF91ZXZlbnQoJmFzdXMtPnBlZ2FfYWNjZWxfcG9sbC0+aW5wdXQtPmRldi5rb2JqLAorCQkJICAgICAgIEtPQkpfQ0hBTkdFKTsKKwkJcmV0dXJuIDsKKwl9CisKIAlhc3VzX2lucHV0X25vdGlmeShhc3VzLCBldmVudCk7CiB9CiAKQEAgLTExNTIsNiArMTQ1Nyw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIod3dhbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfd3dhbiwgc3RvcmVfd3dhbik7CiBzdGF0aWMgREVWSUNFX0FUVFIoZGlzcGxheSwgU19JV1VTUiwgTlVMTCwgc3RvcmVfZGlzcCk7CiBzdGF0aWMgREVWSUNFX0FUVFIobGVkZCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfbGVkZCwgc3RvcmVfbGVkZCk7CitzdGF0aWMgREVWSUNFX0FUVFIobHNfdmFsdWUsIFNfSVJVR08sIHNob3dfbHN2YWx1ZSwgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIobHNfbGV2ZWwsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2xzbHZsLCBzdG9yZV9sc2x2bCk7CiBzdGF0aWMgREVWSUNFX0FUVFIobHNfc3dpdGNoLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19sc3N3LCBzdG9yZV9sc3N3KTsKIHN0YXRpYyBERVZJQ0VfQVRUUihncHMsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2dwcywgc3RvcmVfZ3BzKTsKQEAgLTExNjQsNiArMTQ3MCw3IEBACiAJJmRldl9hdHRyX3d3YW4uYXR0ciwKIAkmZGV2X2F0dHJfZGlzcGxheS5hdHRyLAogCSZkZXZfYXR0cl9sZWRkLmF0dHIsCisJJmRldl9hdHRyX2xzX3ZhbHVlLmF0dHIsCiAJJmRldl9hdHRyX2xzX2xldmVsLmF0dHIsCiAJJmRldl9hdHRyX2xzX3N3aXRjaC5hdHRyLAogCSZkZXZfYXR0cl9ncHMuYXR0ciwKQEAgLTExODAsNiArMTQ4NywxOSBAQAogCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGFzdXMtPmhhbmRsZTsKIAlib29sIHN1cHBvcnRlZDsKIAorCWlmIChhc3VzLT5pc19wZWdhX2x1Y2lkKSB7CisJCS8qIG5vIGxzX2xldmVsIGludGVyZmFjZSBvbiB0aGUgTHVjaWQgKi8KKwkJaWYgKGF0dHIgPT0gJmRldl9hdHRyX2xzX3N3aXRjaC5hdHRyKQorCQkJc3VwcG9ydGVkID0gdHJ1ZTsKKwkJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfbHNfbGV2ZWwuYXR0cikKKwkJCXN1cHBvcnRlZCA9IGZhbHNlOworCQllbHNlCisJCQlnb3RvIG5vcm1hbDsKKworCQlyZXR1cm4gc3VwcG9ydGVkOworCX0KKworbm9ybWFsOgogCWlmIChhdHRyID09ICZkZXZfYXR0cl93bGFuLmF0dHIpIHsKIAkJc3VwcG9ydGVkID0gIWFjcGlfY2hlY2tfaGFuZGxlKGhhbmRsZSwgTUVUSE9EX1dMQU4sIE5VTEwpOwogCkBAIC0xMjAyLDggKzE1MjIsOSBAQAogCX0gZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfbHNfc3dpdGNoLmF0dHIgfHwKIAkJICAgYXR0ciA9PSAmZGV2X2F0dHJfbHNfbGV2ZWwuYXR0cikgewogCQlzdXBwb3J0ZWQgPSAhYWNwaV9jaGVja19oYW5kbGUoaGFuZGxlLCBNRVRIT0RfQUxTX0NPTlRST0wsIE5VTEwpICYmCi0JCQkgICAgIWFjcGlfY2hlY2tfaGFuZGxlKGhhbmRsZSwgTUVUSE9EX0FMU19MRVZFTCwgTlVMTCk7Ci0KKwkJCSFhY3BpX2NoZWNrX2hhbmRsZShoYW5kbGUsIE1FVEhPRF9BTFNfTEVWRUwsIE5VTEwpOworCX0gZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfbHNfdmFsdWUuYXR0cikgeworCQlzdXBwb3J0ZWQgPSBhc3VzLT5pc19wZWdhX2x1Y2lkOwogCX0gZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfZ3BzLmF0dHIpIHsKIAkJc3VwcG9ydGVkID0gIWFjcGlfY2hlY2tfaGFuZGxlKGhhbmRsZSwgTUVUSE9EX0dQU19PTiwgTlVMTCkgJiYKIAkJCSAgICAhYWNwaV9jaGVja19oYW5kbGUoaGFuZGxlLCBNRVRIT0RfR1BTX09GRiwgTlVMTCkgJiYKQEAgLTEyNTgsNyArMTU3OSw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSBBU1VTX0xBUFRPUF9GSUxFLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9CisJfSwKIH07CiAKIC8qCkBAIC0xMzg4LDExICsxNzA5LDEzIEBACiAJYXN1cy0+bGVkZF9zdGF0dXMgPSAweEZGRjsKIAogCS8qIFNldCBpbml0aWFsIHZhbHVlcyBvZiBsaWdodCBzZW5zb3IgYW5kIGxldmVsICovCi0JYXN1cy0+bGlnaHRfc3dpdGNoID0gMDsJLyogRGVmYXVsdCB0byBsaWdodCBzZW5zb3IgZGlzYWJsZWQgKi8KKwlhc3VzLT5saWdodF9zd2l0Y2ggPSAhIWFsc19zdGF0dXM7CiAJYXN1cy0+bGlnaHRfbGV2ZWwgPSA1OwkvKiBsZXZlbCA1IGZvciBzZW5zb3Igc2Vuc2l0aXZpdHkgKi8KIAotCWlmICghYWNwaV9jaGVja19oYW5kbGUoYXN1cy0+aGFuZGxlLCBNRVRIT0RfQUxTX0NPTlRST0wsIE5VTEwpICYmCi0JICAgICFhY3BpX2NoZWNrX2hhbmRsZShhc3VzLT5oYW5kbGUsIE1FVEhPRF9BTFNfTEVWRUwsIE5VTEwpKSB7CisJaWYgKGFzdXMtPmlzX3BlZ2FfbHVjaWQpIHsKKwkJYXN1c19hbHNfc3dpdGNoKGFzdXMsIGFzdXMtPmxpZ2h0X3N3aXRjaCk7CisJfSBlbHNlIGlmICghYWNwaV9jaGVja19oYW5kbGUoYXN1cy0+aGFuZGxlLCBNRVRIT0RfQUxTX0NPTlRST0wsIE5VTEwpICYmCisJCSAgICFhY3BpX2NoZWNrX2hhbmRsZShhc3VzLT5oYW5kbGUsIE1FVEhPRF9BTFNfTEVWRUwsIE5VTEwpKSB7CiAJCWFzdXNfYWxzX3N3aXRjaChhc3VzLCBhc3VzLT5saWdodF9zd2l0Y2gpOwogCQlhc3VzX2Fsc19sZXZlbChhc3VzLCBhc3VzLT5saWdodF9sZXZlbCk7CiAJfQpAQCAtMTQzOSw5ICsxNzYyLDEwIEBACiAJCWdvdG8gZmFpbF9wbGF0Zm9ybTsKIAogCS8qCi0JICogUmVnaXN0ZXIgdGhlIHBsYXRmb3JtIGRldmljZSBmaXJzdC4gIEl0IGlzIHVzZWQgYXMgYSBwYXJlbnQgZm9yIHRoZQotCSAqIHN1Yi1kZXZpY2VzIGJlbG93LgorCSAqIE5lZWQgcGxhdGZvcm0gdHlwZSBkZXRlY3Rpb24gZmlyc3QsIHRoZW4gdGhlIHBsYXRmb3JtCisJICogZGV2aWNlLiAgSXQgaXMgdXNlZCBhcyBhIHBhcmVudCBmb3IgdGhlIHN1Yi1kZXZpY2VzIGJlbG93LgogCSAqLworCWFzdXMtPmlzX3BlZ2FfbHVjaWQgPSBhc3VzX2NoZWNrX3BlZ2FfbHVjaWQoYXN1cyk7CiAJcmVzdWx0ID0gYXN1c19wbGF0Zm9ybV9pbml0KGFzdXMpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gZmFpbF9wbGF0Zm9ybTsKQEAgLTE0NjUsOSArMTc4OSwyMSBAQAogCWlmIChyZXN1bHQpCiAJCWdvdG8gZmFpbF9yZmtpbGw7CiAKKwlyZXN1bHQgPSBwZWdhX2FjY2VsX2luaXQoYXN1cyk7CisJaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gLUVOT0RFVikKKwkJZ290byBmYWlsX3BlZ2FfYWNjZWw7CisKKwlyZXN1bHQgPSBwZWdhX3Jma2lsbF9pbml0KGFzdXMpOworCWlmIChyZXN1bHQgJiYgcmVzdWx0ICE9IC1FTk9ERVYpCisJCWdvdG8gZmFpbF9wZWdhX3Jma2lsbDsKKwogCWFzdXNfZGV2aWNlX3ByZXNlbnQgPSB0cnVlOwogCXJldHVybiAwOwogCitmYWlsX3BlZ2FfcmZraWxsOgorCXBlZ2FfYWNjZWxfZXhpdChhc3VzKTsKK2ZhaWxfcGVnYV9hY2NlbDoKKwlhc3VzX3Jma2lsbF9leGl0KGFzdXMpOwogZmFpbF9yZmtpbGw6CiAJYXN1c19sZWRfZXhpdChhc3VzKTsKIGZhaWxfbGVkOgpAQCAtMTQ5MSw2ICsxODI3LDggQEAKIAlhc3VzX3Jma2lsbF9leGl0KGFzdXMpOwogCWFzdXNfbGVkX2V4aXQoYXN1cyk7CiAJYXN1c19pbnB1dF9leGl0KGFzdXMpOworCXBlZ2FfYWNjZWxfZXhpdChhc3VzKTsKKwlwZWdhX3Jma2lsbF9leGl0KGFzdXMpOwogCWFzdXNfcGxhdGZvcm1fZXhpdChhc3VzKTsKIAogCWtmcmVlKGFzdXMtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMKaW5kZXggOTVjYmE5ZS4uZDEwNDllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLXdtaS5jCkBAIC00NTMsNyArNDUzLDkgQEAKIAogc3RhdGljIHZvaWQgYXN1c193bWlfbGVkX2V4aXQoc3RydWN0IGFzdXNfd21pICphc3VzKQogewotCWlmIChhc3VzLT50cGRfbGVkLmRldikKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGFzdXMtPmtiZF9sZWQuZGV2KSkKKwkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFzdXMtPmtiZF9sZWQpOworCWlmICghSVNfRVJSX09SX05VTEwoYXN1cy0+dHBkX2xlZC5kZXYpKQogCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYXN1cy0+dHBkX2xlZCk7CiAJaWYgKGFzdXMtPmxlZF93b3JrcXVldWUpCiAJCWRlc3Ryb3lfd29ya3F1ZXVlKGFzdXMtPmxlZF93b3JrcXVldWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKaW5kZXggZjMxZmE0ZS4uYTQzY2ZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jCkBAIC02MCw2ICs2MCwyMiBAQAogCXN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV90b2tlbiB0b2tlbnNbXTsKIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCBxdWlya19lbnRyeSB7CisJdTggdG91Y2hwYWRfbGVkOworfTsKKworc3RhdGljIHN0cnVjdCBxdWlya19lbnRyeSAqcXVpcmtzOworCitzdGF0aWMgc3RydWN0IHF1aXJrX2VudHJ5IHF1aXJrX2RlbGxfdm9zdHJvX3YxMzAgPSB7CisJLnRvdWNocGFkX2xlZCA9IDEsCit9OworCitzdGF0aWMgaW50IGRtaV9tYXRjaGVkKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkbWkpCit7CisJcXVpcmtzID0gZG1pLT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCBkYV9jb21tYW5kX2FkZHJlc3M7CiBzdGF0aWMgaW50IGRhX2NvbW1hbmRfY29kZTsKIHN0YXRpYyBpbnQgZGFfbnVtX3Rva2VuczsKQEAgLTE0OSw2ICsxNjUsMjcgQEAKIAl7fQogfTsKIAorc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9fZGV2aW5pdGRhdGEgZGVsbF9xdWlya3NbXSA9IHsKKwl7CisJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAorCQkuaWRlbnQgPSAiRGVsbCBWb3N0cm8gVjEzMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZvc3RybyBWMTMwIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICZxdWlya19kZWxsX3Zvc3Ryb192MTMwLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkRlbGwgVm9zdHJvIFYxMzEiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWb3N0cm8gVjEzMSIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAmcXVpcmtfZGVsbF92b3N0cm9fdjEzMCwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgKmJ1ZmZlcjsKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqYnVmZmVycGFnZTsKIHN0YXRpYyBERUZJTkVfTVVURVgoYnVmZmVyX211dGV4KTsKQEAgLTU1Miw2ICs1ODksNDQgQEAKIAkudXBkYXRlX3N0YXR1cyAgPSBkZWxsX3NlbmRfaW50ZW5zaXR5LAogfTsKIAorc3RhdGljIHZvaWQgdG91Y2hwYWRfbGVkX29uKCkKK3sKKwlpbnQgY29tbWFuZCA9IDB4OTc7CisJY2hhciBkYXRhID0gMTsKKwlpODA0Ml9jb21tYW5kKCZkYXRhLCBjb21tYW5kIHwgMSA8PCAxMik7Cit9CisKK3N0YXRpYyB2b2lkIHRvdWNocGFkX2xlZF9vZmYoKQoreworCWludCBjb21tYW5kID0gMHg5NzsKKwljaGFyIGRhdGEgPSAyOworCWk4MDQyX2NvbW1hbmQoJmRhdGEsIGNvbW1hbmQgfCAxIDw8IDEyKTsKK30KKworc3RhdGljIHZvaWQgdG91Y2hwYWRfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwllbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQoreworCWlmICh2YWx1ZSA+IDApCisJCXRvdWNocGFkX2xlZF9vbigpOworCWVsc2UKKwkJdG91Y2hwYWRfbGVkX29mZigpOworfQorCitzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiB0b3VjaHBhZF9sZWQgPSB7CisJLm5hbWUgPSAiZGVsbC1sYXB0b3A6OnRvdWNocGFkIiwKKwkuYnJpZ2h0bmVzc19zZXQgPSB0b3VjaHBhZF9sZWRfc2V0LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdG91Y2hwYWRfbGVkX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoZGV2LCAmdG91Y2hwYWRfbGVkKTsKK30KKworc3RhdGljIHZvaWQgdG91Y2hwYWRfbGVkX2V4aXQodm9pZCkKK3sKKwlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmdG91Y2hwYWRfbGVkKTsKK30KKwogc3RhdGljIGJvb2wgZGVsbF9sYXB0b3BfaTgwNDJfZmlsdGVyKHVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgY2hhciBzdHIsCiAJCQkgICAgICBzdHJ1Y3Qgc2VyaW8gKnBvcnQpCiB7CkBAIC01ODQsNiArNjU5LDEwIEBACiAJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGRlbGxfZGV2aWNlX3RhYmxlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlxdWlya3MgPSBOVUxMOworCS8qIGZpbmQgaWYgdGhpcyBtYWNoaW5lIHN1cHBvcnQgb3RoZXIgZnVuY3Rpb25zICovCisJZG1pX2NoZWNrX3N5c3RlbShkZWxsX3F1aXJrcyk7CisKIAlkbWlfd2FsayhmaW5kX3Rva2VucywgTlVMTCk7CiAKIAlpZiAoIWRhX3Rva2VucykgIHsKQEAgLTYyNiw2ICs3MDUsOSBAQAogCQlnb3RvIGZhaWxfZmlsdGVyOwogCX0KIAorCWlmIChxdWlya3MgJiYgcXVpcmtzLT50b3VjaHBhZF9sZWQpCisJCXRvdWNocGFkX2xlZF9pbml0KCZwbGF0Zm9ybV9kZXZpY2UtPmRldik7CisKIAlkZWxsX2xhcHRvcF9kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRlbGxfbGFwdG9wIiwgTlVMTCk7CiAJaWYgKGRlbGxfbGFwdG9wX2RpciAhPSBOVUxMKQogCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZmtpbGwiLCAwNDQ0LCBkZWxsX2xhcHRvcF9kaXIsIE5VTEwsCkBAIC02OTIsNiArNzc0LDggQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkZWxsX2V4aXQodm9pZCkKIHsKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGVsbF9sYXB0b3BfZGlyKTsKKwlpZiAocXVpcmtzICYmIHF1aXJrcy0+dG91Y2hwYWRfbGVkKQorCQl0b3VjaHBhZF9sZWRfZXhpdCgpOwogCWk4MDQyX3JlbW92ZV9maWx0ZXIoZGVsbF9sYXB0b3BfaTgwNDJfZmlsdGVyKTsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRlbGxfcmZraWxsX3dvcmspOwogCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihkZWxsX2JhY2tsaWdodF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwppbmRleCAxYzQ1ZDkyLi5lYTQ0YWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwpAQCAtNTY4LDcgKzU2OCw3IEBACiAKIHN0YXRpYyB2b2lkIGVlZXBjX2xlZF9leGl0KHN0cnVjdCBlZWVwY19sYXB0b3AgKmVlZXBjKQogewotCWlmIChlZWVwYy0+dHBkX2xlZC5kZXYpCisJaWYgKCFJU19FUlJfT1JfTlVMTChlZWVwYy0+dHBkX2xlZC5kZXYpKQogCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZWVlcGMtPnRwZF9sZWQpOwogCWlmIChlZWVwYy0+bGVkX3dvcmtxdWV1ZSkKIAkJZGVzdHJveV93b3JrcXVldWUoZWVlcGMtPmxlZF93b3JrcXVldWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHBfYWNjZWwuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2hwX2FjY2VsLmMKaW5kZXggMWI1MmQwMC4uMjJiMmRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHBfYWNjZWwuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocF9hY2NlbC5jCkBAIC03Niw2ICs3Niw3IEBACiAvKiBGb3IgYXV0b21hdGljIGluc2VydGlvbiBvZiB0aGUgbW9kdWxlICovCiBzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGxpczNsdjAyZF9kZXZpY2VfaWRzW10gPSB7CiAJeyJIUFEwMDA0IiwgMH0sIC8qIEhQIE1vYmlsZSBEYXRhIFByb3RlY3Rpb24gU3lzdGVtIFBOUCAqLworCXsiSFBRNjAwMCIsIDB9LCAvKiBIUCBNb2JpbGUgRGF0YSBQcm90ZWN0aW9uIFN5c3RlbSBQTlAgKi8KIAl7IiIsIDB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgbGlzM2x2MDJkX2RldmljZV9pZHMpOwpAQCAtMjA5LDYgKzIxMCw4IEBACiAJQVhJU19ETUlfTUFUQ0goIk5DNjcxNXgiLCAiSFAgQ29tcGFxIDY3MTUiLCB5X2ludmVydGVkKSwKIAlBWElTX0RNSV9NQVRDSCgiTkM2OTN4eCIsICJIUCBFbGl0ZUJvb2sgNjkzIiwgeHlfcm90YXRlZF9yaWdodCksCiAJQVhJU19ETUlfTUFUQ0goIk5DNjkzeHgiLCAiSFAgRWxpdGVCb29rIDg1MyIsIHh5X3N3YXApLAorCUFYSVNfRE1JX01BVENIKCJOQzg1NHh4IiwgIkhQIEVsaXRlQm9vayA4NTQiLCB5X2ludmVydGVkKSwKKwlBWElTX0RNSV9NQVRDSCgiTkMyNzN4eCIsICJIUCBFbGl0ZUJvb2sgMjczIiwgeV9pbnZlcnRlZCksCiAJLyogSW50ZWwtYmFzZWQgSFAgUGF2aWxpb24gZHY1ICovCiAJQVhJU19ETUlfTUFUQ0gyKCJIUERWNV9JIiwKIAkJCVBST0RVQ1RfTkFNRSwgIkhQIFBhdmlsaW9uIGR2NSIsCkBAIC0yMjcsNyArMjMwLDEyIEBACiAJQVhJU19ETUlfTUFUQ0goIkhQQjQ1MngiLCAiSFAgUHJvQm9vayA0NTIiLCB5X2ludmVydGVkKSwKIAlBWElTX0RNSV9NQVRDSCgiSFBCNTIyeCIsICJIUCBQcm9Cb29rIDUyMiIsIHh5X3N3YXApLAogCUFYSVNfRE1JX01BVENIKCJIUEI1MzJ4IiwgIkhQIFByb0Jvb2sgNTMyIiwgeV9pbnZlcnRlZCksCisJQVhJU19ETUlfTUFUQ0goIkhQQjY1NXgiLCAiSFAgUHJvQm9vayA2NTUiLCB4eV9zd2FwX2ludmVydGVkKSwKIAlBWElTX0RNSV9NQVRDSCgiTWluaTUxMHgiLCAiSFAgTWluaSA1MTAiLCB4eV9yb3RhdGVkX2xlZnRfdXNkKSwKKwlBWElTX0RNSV9NQVRDSCgiSFBCNjN4eCIsICJIUCBQcm9Cb29rIDYzIiwgeHlfc3dhcCksCisJQVhJU19ETUlfTUFUQ0goIkhQQjY0eHgiLCAiSFAgUHJvQm9vayA2NCIsIHh5X3N3YXApLAorCUFYSVNfRE1JX01BVENIKCJIUEI2NHh4IiwgIkhQIEVsaXRlQm9vayA4NCIsIHh5X3N3YXApLAorCUFYSVNfRE1JX01BVENIKCJIUEI2NXh4IiwgIkhQIFByb0Jvb2sgNjUiLCB4X2ludmVydGVkKSwKIAl7IE5VTEwsIH0KIC8qIExhcHRvcCBtb2RlbHMgd2l0aG91dCBheGlzIGluZm8gKHlldCk6CiAgKiAiTkM2OTEwIiAiSFAgQ29tcGFxIDY5MTAiCkBAIC0zMjAsNyArMzI4LDcgQEAKIAlJTklUX1dPUksoJmhwbGVkX2xlZC53b3JrLCBkZWxheWVkX3NldF9zdGF0dXNfd29ya2VyKTsKIAlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoTlVMTCwgJmhwbGVkX2xlZC5sZWRfY2xhc3NkZXYpOwogCWlmIChyZXQpIHsKLQkJbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUoKTsKKwkJbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUoJmxpczNfZGV2KTsKIAkJbGlzM2x2MDJkX3Bvd2Vyb2ZmKCZsaXMzX2Rldik7CiAJCWZsdXNoX3dvcmsoJmhwbGVkX2xlZC53b3JrKTsKIAkJcmV0dXJuIHJldDsKQEAgLTMzNCw3ICszNDIsNyBAQAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKCk7CisJbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUoJmxpczNfZGV2KTsKIAlsaXMzbHYwMmRfcG93ZXJvZmYoJmxpczNfZGV2KTsKIAogCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZocGxlZF9sZWQubGVkX2NsYXNzZGV2KTsKQEAgLTM1NCw4ICszNjIsNyBAQAogCiBzdGF0aWMgaW50IGxpczNsdjAyZF9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JbGlzM2x2MDJkX3Bvd2Vyb24oJmxpczNfZGV2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbGlzM2x2MDJkX3Bvd2Vyb24oJmxpczNfZGV2KTsKIH0KICNlbHNlCiAjZGVmaW5lIGxpczNsdjAyZF9zdXNwZW5kIE5VTEwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2lkZWFwYWQtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pZGVhcGFkLWxhcHRvcC5jCmluZGV4IDBjNTk1NDEuLmEzNmFkZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2lkZWFwYWQtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaWRlYXBhZC1sYXB0b3AuYwpAQCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NwYXJzZS1rZXltYXAuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjZGVmaW5lIElERUFQQURfUkZLSUxMX0RFVl9OVU0JKDMpCiAKQEAgLTQyLDE1ICs0NCw0MSBAQAogI2RlZmluZSBDRkdfV0lGSV9CSVQJKDE4KQogI2RlZmluZSBDRkdfQ0FNRVJBX0JJVAkoMTkpCiAKK2VudW0geworCVZQQ0NNRF9SX1ZQQzEgPSAweDEwLAorCVZQQ0NNRF9SX0JMX01BWCwKKwlWUENDTURfUl9CTCwKKwlWUENDTURfV19CTCwKKwlWUENDTURfUl9XSUZJLAorCVZQQ0NNRF9XX1dJRkksCisJVlBDQ01EX1JfQlQsCisJVlBDQ01EX1dfQlQsCisJVlBDQ01EX1JfQkxfUE9XRVIsCisJVlBDQ01EX1JfTk9WTywKKwlWUENDTURfUl9WUEMyLAorCVZQQ0NNRF9SX1RPVUNIUEFELAorCVZQQ0NNRF9XX1RPVUNIUEFELAorCVZQQ0NNRF9SX0NBTUVSQSwKKwlWUENDTURfV19DQU1FUkEsCisJVlBDQ01EX1JfM0csCisJVlBDQ01EX1dfM0csCisJVlBDQ01EX1JfT0RELCAvKiAweDIxICovCisJVlBDQ01EX1JfUkYgPSAweDIzLAorCVZQQ0NNRF9XX1JGLAorCVZQQ0NNRF9XX0JMX1BPV0VSID0gMHgzMywKK307CisKIHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgewogCXN0cnVjdCByZmtpbGwgKnJma1tJREVBUEFEX1JGS0lMTF9ERVZfTlVNXTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2U7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRkZXY7CiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsaWdodGRldjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1ZzsKIAl1bnNpZ25lZCBsb25nIGNmZzsKIH07CiAKIHN0YXRpYyBhY3BpX2hhbmRsZSBpZGVhcGFkX2hhbmRsZTsKK3N0YXRpYyBzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICppZGVhcGFkX3ByaXY7CiBzdGF0aWMgYm9vbCBub19idF9yZmtpbGw7CiBtb2R1bGVfcGFyYW0obm9fYnRfcmZraWxsLCBib29sLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mobm9fYnRfcmZraWxsLCAiTm8gcmZraWxsIGZvciBibHVldG9vdGguIik7CkBAIC0xNjQsNiArMTkyLDE0NiBAQAogfQogCiAvKgorICogZGVidWdmcworICovCisjZGVmaW5lIERFQlVHRlNfRVZFTlRfTEVOICg0MDk2KQorc3RhdGljIGludCBkZWJ1Z2ZzX3N0YXR1c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJaWYgKCFyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX0JMX01BWCwgJnZhbHVlKSkKKwkJc2VxX3ByaW50ZihzLCAiQmFja2xpZ2h0IG1heDpcdCVsdVxuIiwgdmFsdWUpOworCWlmICghcmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9CTCwgJnZhbHVlKSkKKwkJc2VxX3ByaW50ZihzLCAiQmFja2xpZ2h0IG5vdzpcdCVsdVxuIiwgdmFsdWUpOworCWlmICghcmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9CTF9QT1dFUiwgJnZhbHVlKSkKKwkJc2VxX3ByaW50ZihzLCAiQkwgcG93ZXIgdmFsdWU6XHQlc1xuIiwgdmFsdWUgPyAiT24iIDogIk9mZiIpOworCXNlcV9wcmludGYocywgIj09PT09PT09PT09PT09PT09PT09PVxuIik7CisKKwlpZiAoIXJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfUkYsICZ2YWx1ZSkpCisJCXNlcV9wcmludGYocywgIlJhZGlvIHN0YXR1czpcdCVzKCVsdSlcbiIsCisJCQkgICB2YWx1ZSA/ICJPbiIgOiAiT2ZmIiwgdmFsdWUpOworCWlmICghcmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9XSUZJLCAmdmFsdWUpKQorCQlzZXFfcHJpbnRmKHMsICJXaWZpIHN0YXR1czpcdCVzKCVsdSlcbiIsCisJCQkgICB2YWx1ZSA/ICJPbiIgOiAiT2ZmIiwgdmFsdWUpOworCWlmICghcmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9CVCwgJnZhbHVlKSkKKwkJc2VxX3ByaW50ZihzLCAiQlQgc3RhdHVzOlx0JXMoJWx1KVxuIiwKKwkJCSAgIHZhbHVlID8gIk9uIiA6ICJPZmYiLCB2YWx1ZSk7CisJaWYgKCFyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SXzNHLCAmdmFsdWUpKQorCQlzZXFfcHJpbnRmKHMsICIzRyBzdGF0dXM6XHQlcyglbHUpXG4iLAorCQkJICAgdmFsdWUgPyAiT24iIDogIk9mZiIsIHZhbHVlKTsKKwlzZXFfcHJpbnRmKHMsICI9PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKCFyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX1RPVUNIUEFELCAmdmFsdWUpKQorCQlzZXFfcHJpbnRmKHMsICJUb3VjaHBhZCBzdGF0dXM6JXMoJWx1KVxuIiwKKwkJCSAgIHZhbHVlID8gIk9uIiA6ICJPZmYiLCB2YWx1ZSk7CisJaWYgKCFyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX0NBTUVSQSwgJnZhbHVlKSkKKwkJc2VxX3ByaW50ZihzLCAiQ2FtZXJhIHN0YXR1czpcdCVzKCVsdSlcbiIsCisJCQkgICB2YWx1ZSA/ICJPbiIgOiAiT2ZmIiwgdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdmc19zdGF0dXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGVidWdmc19zdGF0dXNfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfc3RhdHVzX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBkZWJ1Z2ZzX3N0YXR1c19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBkZWJ1Z2ZzX2NmZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKK3sKKwlpZiAoIWlkZWFwYWRfcHJpdikgeworCQlzZXFfcHJpbnRmKHMsICJjZmc6IE4vQVxuIik7CisJfSBlbHNlIHsKKwkJc2VxX3ByaW50ZihzLCAiY2ZnOiAweCUuOGxYXG5cbkNhcGFiaWxpdHk6ICIsCisJCQkgICBpZGVhcGFkX3ByaXYtPmNmZyk7CisJCWlmICh0ZXN0X2JpdChDRkdfQlRfQklULCAmaWRlYXBhZF9wcml2LT5jZmcpKQorCQkJc2VxX3ByaW50ZihzLCAiQmx1ZXRvb3RoICIpOworCQlpZiAodGVzdF9iaXQoQ0ZHXzNHX0JJVCwgJmlkZWFwYWRfcHJpdi0+Y2ZnKSkKKwkJCXNlcV9wcmludGYocywgIjNHICIpOworCQlpZiAodGVzdF9iaXQoQ0ZHX1dJRklfQklULCAmaWRlYXBhZF9wcml2LT5jZmcpKQorCQkJc2VxX3ByaW50ZihzLCAiV2lyZWxlc3MgIik7CisJCWlmICh0ZXN0X2JpdChDRkdfQ0FNRVJBX0JJVCwgJmlkZWFwYWRfcHJpdi0+Y2ZnKSkKKwkJCXNlcV9wcmludGYocywgIkNhbWVyYSAiKTsKKwkJc2VxX3ByaW50ZihzLCAiXG5HcmFwaGljOiAiKTsKKwkJc3dpdGNoICgoaWRlYXBhZF9wcml2LT5jZmcpJjB4NzAwKSB7CisJCWNhc2UgMHgxMDA6CisJCQlzZXFfcHJpbnRmKHMsICJJbnRlbCIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgyMDA6CisJCQlzZXFfcHJpbnRmKHMsICJBVEkiKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MzAwOgorCQkJc2VxX3ByaW50ZihzLCAiTnZpZGlhIik7CisJCQlicmVhazsKKwkJY2FzZSAweDQwMDoKKwkJCXNlcV9wcmludGYocywgIkludGVsIGFuZCBBVEkiKTsKKwkJCWJyZWFrOworCQljYXNlIDB4NTAwOgorCQkJc2VxX3ByaW50ZihzLCAiSW50ZWwgYW5kIE52aWRpYSIpOworCQkJYnJlYWs7CisJCX0KKwkJc2VxX3ByaW50ZihzLCAiXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdmc19jZmdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGVidWdmc19jZmdfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfY2ZnX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBkZWJ1Z2ZzX2NmZ19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaWRlYXBhZF9kZWJ1Z2ZzX2luaXQoc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpub2RlOworCisJcHJpdi0+ZGVidWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImlkZWFwYWQiLCBOVUxMKTsKKwlpZiAocHJpdi0+ZGVidWcgPT0gTlVMTCkgeworCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnkiKTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJbm9kZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImNmZyIsIFNfSVJVR08sIHByaXYtPmRlYnVnLCBOVUxMLAorCQkJCSAgICZkZWJ1Z2ZzX2NmZ19mb3BzKTsKKwlpZiAoIW5vZGUpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGNmZyBpbiBkZWJ1Z2ZzIik7CisJCWdvdG8gZXJyb3V0OworCX0KKworCW5vZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdGF0dXMiLCBTX0lSVUdPLCBwcml2LT5kZWJ1ZywgTlVMTCwKKwkJCQkgICAmZGVidWdmc19zdGF0dXNfZm9wcyk7CisJaWYgKCFub2RlKSB7CisJCXByX2VycigiZmFpbGVkIHRvIGNyZWF0ZSBldmVudCBpbiBkZWJ1Z2ZzIik7CisJCWdvdG8gZXJyb3V0OworCX0KKworCXJldHVybiAwOworCitlcnJvdXQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGlkZWFwYWRfZGVidWdmc19leGl0KHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYpCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHByaXYtPmRlYnVnKTsKKwlwcml2LT5kZWJ1ZyA9IE5VTEw7Cit9CisKKy8qCiAgKiBzeXNmcwogICovCiBzdGF0aWMgc3NpemVfdCBzaG93X2lkZWFwYWRfY2FtKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTE3Miw3ICszNDAsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCi0JaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgMHgxRCwgJnJlc3VsdCkpCisJaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfQ0FNRVJBLCAmcmVzdWx0KSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiLTFcbiIpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgcmVzdWx0KTsKIH0KQEAgLTE4Nyw3ICszNTUsNyBAQAogCQlyZXR1cm4gMDsKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVpIiwgJnN0YXRlKSAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXQgPSB3cml0ZV9lY19jbWQoaWRlYXBhZF9oYW5kbGUsIDB4MUUsIHN0YXRlKTsKKwlyZXQgPSB3cml0ZV9lY19jbWQoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9XX0NBTUVSQSwgc3RhdGUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCXJldHVybiBjb3VudDsKQEAgLTE5NSwyMCArMzYzLDggQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGNhbWVyYV9wb3dlciwgMDY0NCwgc2hvd19pZGVhcGFkX2NhbSwgc3RvcmVfaWRlYXBhZF9jYW0pOwogCi1zdGF0aWMgc3NpemVfdCBzaG93X2lkZWFwYWRfY2ZnKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglLjhsWFxuIiwgcHJpdi0+Y2ZnKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGNmZywgMDQ0NCwgc2hvd19pZGVhcGFkX2NmZywgTlVMTCk7Ci0KIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppZGVhcGFkX2F0dHJpYnV0ZXNbXSA9IHsKIAkmZGV2X2F0dHJfY2FtZXJhX3Bvd2VyLmF0dHIsCi0JJmRldl9hdHRyX2NmZy5hdHRyLAogCU5VTEwKIH07CiAKQEAgLTI0NCw5ICs0MDAsOSBAQAogfTsKIAogY29uc3Qgc3RydWN0IGlkZWFwYWRfcmZrX2RhdGEgaWRlYXBhZF9yZmtfZGF0YVtdID0gewotCXsgImlkZWFwYWRfd2xhbiIsICAgICAgQ0ZHX1dJRklfQklULCAweDE1LCBSRktJTExfVFlQRV9XTEFOIH0sCi0JeyAiaWRlYXBhZF9ibHVldG9vdGgiLCBDRkdfQlRfQklULCAgIDB4MTcsIFJGS0lMTF9UWVBFX0JMVUVUT09USCB9LAotCXsgImlkZWFwYWRfM2ciLCAgICAgICAgQ0ZHXzNHX0JJVCwgICAweDIwLCBSRktJTExfVFlQRV9XV0FOIH0sCisJeyAiaWRlYXBhZF93bGFuIiwgICAgQ0ZHX1dJRklfQklULCBWUENDTURfV19XSUZJLCBSRktJTExfVFlQRV9XTEFOIH0sCisJeyAiaWRlYXBhZF9ibHVldG9vdGgiLCBDRkdfQlRfQklULCBWUENDTURfV19CVCwgUkZLSUxMX1RZUEVfQkxVRVRPT1RIIH0sCisJeyAiaWRlYXBhZF8zZyIsICAgICAgICBDRkdfM0dfQklULCBWUENDTURfV18zRywgUkZLSUxMX1RZUEVfV1dBTiB9LAogfTsKIAogc3RhdGljIGludCBpZGVhcGFkX3Jma19zZXQodm9pZCAqZGF0YSwgYm9vbCBibG9ja2VkKQpAQCAtMjYwLDEzICs0MTYsMTIgQEAKIAkuc2V0X2Jsb2NrID0gaWRlYXBhZF9yZmtfc2V0LAogfTsKIAotc3RhdGljIHZvaWQgaWRlYXBhZF9zeW5jX3Jma19zdGF0ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UpCitzdGF0aWMgdm9pZCBpZGVhcGFkX3N5bmNfcmZrX3N0YXRlKHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYpCiB7Ci0Jc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YSgmYWRldmljZS0+ZGV2KTsKIAl1bnNpZ25lZCBsb25nIGh3X2Jsb2NrZWQ7CiAJaW50IGk7CiAKLQlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCAweDIzLCAmaHdfYmxvY2tlZCkpCisJaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfUkYsICZod19ibG9ja2VkKSkKIAkJcmV0dXJuOwogCWh3X2Jsb2NrZWQgPSAhaHdfYmxvY2tlZDsKIApAQCAtMzYzLDggKzUxOCwxMCBAQAogICogaW5wdXQgZGV2aWNlCiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qga2V5X2VudHJ5IGlkZWFwYWRfa2V5bWFwW10gPSB7Ci0JeyBLRV9LRVksIDB4MDYsIHsgS0VZX1NXSVRDSFZJREVPTU9ERSB9IH0sCi0JeyBLRV9LRVksIDB4MEQsIHsgS0VZX1dMQU4gfSB9LAorCXsgS0VfS0VZLCA2LCAgeyBLRVlfU1dJVENIVklERU9NT0RFIH0gfSwKKwl7IEtFX0tFWSwgMTMsIHsgS0VZX1dMQU4gfSB9LAorCXsgS0VfS0VZLCAxNiwgeyBLRVlfUFJPRzEgfSB9LAorCXsgS0VfS0VZLCAxNywgeyBLRVlfUFJPRzIgfSB9LAogCXsgS0VfRU5ELCAwIH0sCiB9OwogCkBAIC00MTksNiArNTc2LDE4IEBACiAJc3BhcnNlX2tleW1hcF9yZXBvcnRfZXZlbnQocHJpdi0+aW5wdXRkZXYsIHNjYW5jb2RlLCAxLCB0cnVlKTsKIH0KIAorc3RhdGljIHZvaWQgaWRlYXBhZF9pbnB1dF9ub3Zva2V5KHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYpCit7CisJdW5zaWduZWQgbG9uZyBsb25nX3ByZXNzZWQ7CisKKwlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9OT1ZPLCAmbG9uZ19wcmVzc2VkKSkKKwkJcmV0dXJuOworCWlmIChsb25nX3ByZXNzZWQpCisJCWlkZWFwYWRfaW5wdXRfcmVwb3J0KHByaXYsIDE3KTsKKwllbHNlCisJCWlkZWFwYWRfaW5wdXRfcmVwb3J0KHByaXYsIDE2KTsKK30KKwogLyoKICAqIGJhY2tsaWdodAogICovCkBAIC00MjYsMTYgKzU5NSwxNyBAQAogewogCXVuc2lnbmVkIGxvbmcgbm93OwogCi0JaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgMHgxMiwgJm5vdykpCisJaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfQkwsICZub3cpKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gbm93OwogfQogCiBzdGF0aWMgaW50IGlkZWFwYWRfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsaWdodGRldikKIHsKLQlpZiAod3JpdGVfZWNfY21kKGlkZWFwYWRfaGFuZGxlLCAweDEzLCBibGlnaHRkZXYtPnByb3BzLmJyaWdodG5lc3MpKQorCWlmICh3cml0ZV9lY19jbWQoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9XX0JMLAorCQkJIGJsaWdodGRldi0+cHJvcHMuYnJpZ2h0bmVzcykpCiAJCXJldHVybiAtRUlPOwotCWlmICh3cml0ZV9lY19jbWQoaWRlYXBhZF9oYW5kbGUsIDB4MzMsCisJaWYgKHdyaXRlX2VjX2NtZChpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1dfQkxfUE9XRVIsCiAJCQkgYmxpZ2h0ZGV2LT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19QT1dFUkRPV04gPyAwIDogMSkpCiAJCXJldHVybiAtRUlPOwogCkBAIC00NTMsMTEgKzYyMywxMSBAQAogCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKIAl1bnNpZ25lZCBsb25nIG1heCwgbm93LCBwb3dlcjsKIAotCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIDB4MTEsICZtYXgpKQorCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX0JMX01BWCwgJm1heCkpCiAJCXJldHVybiAtRUlPOwotCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIDB4MTIsICZub3cpKQorCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX0JMLCAmbm93KSkKIAkJcmV0dXJuIC1FSU87Ci0JaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgMHgxOCwgJnBvd2VyKSkKKwlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9CTF9QT1dFUiwgJnBvd2VyKSkKIAkJcmV0dXJuIC1FSU87CiAKIAltZW1zZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7CkBAIC00OTMsNyArNjYzLDkgQEAKIAl1bnNpZ25lZCBsb25nIHBvd2VyOwogCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibGlnaHRkZXYgPSBwcml2LT5ibGlnaHRkZXY7CiAKLQlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCAweDE4LCAmcG93ZXIpKQorCWlmICghYmxpZ2h0ZGV2KQorCQlyZXR1cm47CisJaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfQkxfUE9XRVIsICZwb3dlcikpCiAJCXJldHVybjsKIAlibGlnaHRkZXYtPnByb3BzLnBvd2VyID0gcG93ZXIgPyBGQl9CTEFOS19VTkJMQU5LIDogRkJfQkxBTktfUE9XRVJET1dOOwogfQpAQCAtNTA0LDcgKzY3Niw3IEBACiAKIAkvKiBpZiB3ZSBjb250cm9sIGJyaWdodG5lc3MgdmlhIGFjcGkgdmlkZW8gZHJpdmVyICovCiAJaWYgKHByaXYtPmJsaWdodGRldiA9PSBOVUxMKSB7Ci0JCXJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgMHgxMiwgJm5vdyk7CisJCXJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfQkwsICZub3cpOwogCQlyZXR1cm47CiAJfQogCkBAIC01MzMsNiArNzA1LDcgQEAKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCWRldl9zZXRfZHJ2ZGF0YSgmYWRldmljZS0+ZGV2LCBwcml2KTsKKwlpZGVhcGFkX3ByaXYgPSBwcml2OwogCWlkZWFwYWRfaGFuZGxlID0gYWRldmljZS0+aGFuZGxlOwogCXByaXYtPmNmZyA9IGNmZzsKIApAQCAtNTQwLDYgKzcxMywxMCBAQAogCWlmIChyZXQpCiAJCWdvdG8gcGxhdGZvcm1fZmFpbGVkOwogCisJcmV0ID0gaWRlYXBhZF9kZWJ1Z2ZzX2luaXQocHJpdik7CisJaWYgKHJldCkKKwkJZ290byBkZWJ1Z2ZzX2ZhaWxlZDsKKwogCXJldCA9IGlkZWFwYWRfaW5wdXRfaW5pdChwcml2KTsKIAlpZiAocmV0KQogCQlnb3RvIGlucHV0X2ZhaWxlZDsKQEAgLTU1MCw3ICs3MjcsNyBAQAogCQllbHNlCiAJCQlwcml2LT5yZmtbaV0gPSBOVUxMOwogCX0KLQlpZGVhcGFkX3N5bmNfcmZrX3N0YXRlKGFkZXZpY2UpOworCWlkZWFwYWRfc3luY19yZmtfc3RhdGUocHJpdik7CiAKIAlpZiAoIWFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgewogCQlyZXQgPSBpZGVhcGFkX2JhY2tsaWdodF9pbml0KHByaXYpOwpAQCAtNTY1LDYgKzc0Miw4IEBACiAJCWlkZWFwYWRfdW5yZWdpc3Rlcl9yZmtpbGwoYWRldmljZSwgaSk7CiAJaWRlYXBhZF9pbnB1dF9leGl0KHByaXYpOwogaW5wdXRfZmFpbGVkOgorCWlkZWFwYWRfZGVidWdmc19leGl0KHByaXYpOworZGVidWdmc19mYWlsZWQ6CiAJaWRlYXBhZF9wbGF0Zm9ybV9leGl0KHByaXYpOwogcGxhdGZvcm1fZmFpbGVkOgogCWtmcmVlKHByaXYpOwpAQCAtNTgwLDYgKzc1OSw3IEBACiAJZm9yIChpID0gMDsgaSA8IElERUFQQURfUkZLSUxMX0RFVl9OVU07IGkrKykKIAkJaWRlYXBhZF91bnJlZ2lzdGVyX3Jma2lsbChhZGV2aWNlLCBpKTsKIAlpZGVhcGFkX2lucHV0X2V4aXQocHJpdik7CisJaWRlYXBhZF9kZWJ1Z2ZzX2V4aXQocHJpdik7CiAJaWRlYXBhZF9wbGF0Zm9ybV9leGl0KHByaXYpOwogCWRldl9zZXRfZHJ2ZGF0YSgmYWRldmljZS0+ZGV2LCBOVUxMKTsKIAlrZnJlZShwcml2KTsKQEAgLTU5Myw5ICs3NzMsOSBAQAogCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGFkZXZpY2UtPmhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIHZwYzEsIHZwYzIsIHZwY19iaXQ7CiAKLQlpZiAocmVhZF9lY19kYXRhKGhhbmRsZSwgMHgxMCwgJnZwYzEpKQorCWlmIChyZWFkX2VjX2RhdGEoaGFuZGxlLCBWUENDTURfUl9WUEMxLCAmdnBjMSkpCiAJCXJldHVybjsKLQlpZiAocmVhZF9lY19kYXRhKGhhbmRsZSwgMHgxQSwgJnZwYzIpKQorCWlmIChyZWFkX2VjX2RhdGEoaGFuZGxlLCBWUENDTURfUl9WUEMyLCAmdnBjMikpCiAJCXJldHVybjsKIAogCXZwYzEgPSAodnBjMiA8PCA4KSB8IHZwYzE7CkBAIC02MDMsMTEgKzc4MywxNCBAQAogCQlpZiAodGVzdF9iaXQodnBjX2JpdCwgJnZwYzEpKSB7CiAJCQlzd2l0Y2ggKHZwY19iaXQpIHsKIAkJCWNhc2UgOToKLQkJCQlpZGVhcGFkX3N5bmNfcmZrX3N0YXRlKGFkZXZpY2UpOworCQkJCWlkZWFwYWRfc3luY19yZmtfc3RhdGUocHJpdik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDQ6CiAJCQkJaWRlYXBhZF9iYWNrbGlnaHRfbm90aWZ5X2JyaWdodG5lc3MocHJpdik7CiAJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJaWRlYXBhZF9pbnB1dF9ub3Zva2V5KHByaXYpOworCQkJCWJyZWFrOwogCQkJY2FzZSAyOgogCQkJCWlkZWFwYWRfYmFja2xpZ2h0X25vdGlmeV9wb3dlcihwcml2KTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGMuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGMuYwppbmRleCBjODY2NjUzLi40ODg3MGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwYy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2ZpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL21yc3QuaD4KICNpbmNsdWRlIDxhc20vaW50ZWxfc2N1X2lwYy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjdXRpbC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwY3V0aWwuYwppbmRleCBiOTNhMDMyLi4yZDBmOTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjdXRpbC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGN1dGlsLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KIAotc3RhdGljIHUzMiBtYWpvcjsKK3N0YXRpYyBpbnQgbWFqb3I7CiAKICNkZWZpbmUgTUFYX0ZXX1NJWkUgMjY0MTkyCiAKQEAgLTExNyw3ICsxMTcsMTEgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXBjX21vZHVsZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHJlZ2lzdGVyX2NocmRldigwLCAiaW50ZWxfbWlkX3NjdSIsICZzY3VfaXBjX2ZvcHMpOworCW1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsICJpbnRlbF9taWRfc2N1IiwgJnNjdV9pcGNfZm9wcyk7CisJaWYgKG1ham9yIDwgMCkKKwkJcmV0dXJuIG1ham9yOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcGNfbW9kdWxlX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L21zaS13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L21zaS13bWkuYwppbmRleCA2ZjQwYmYyLi4yMjY0MzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9tc2ktd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvbXNpLXdtaS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogTU9EVUxFX0FVVEhPUigiVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTVNJIGxhcHRvcCBXTUkgaG90a2V5cyBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NhbXN1bmctbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zYW1zdW5nLWxhcHRvcC5jCmluZGV4IDM1OTE2MzAuLjA5ZTI2YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NhbXN1bmctbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvc2Ftc3VuZy1sYXB0b3AuYwpAQCAtMjI2LDYgKzIyNiw3IEBACiBzdGF0aWMgc3RydWN0IG11dGV4IHNhYmlfbXV0ZXg7CiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2RldjsKIHN0YXRpYyBzdHJ1Y3QgcmZraWxsICpyZms7CitzdGF0aWMgYm9vbCBoYXNfc3RlcHBpbmdfcXVpcms7CiAKIHN0YXRpYyBpbnQgZm9yY2U7CiBtb2R1bGVfcGFyYW0oZm9yY2UsIGJvb2wsIDApOwpAQCAtMzcwLDE1ICszNzEsMjggQEAKIAkJCQkgICZzcmV0dmFsKTsKIAlpZiAoIXJldHZhbCkgewogCQl1c2VyX2JyaWdodG5lc3MgPSBzcmV0dmFsLnJldHZhbFswXTsKLQkJaWYgKHVzZXJfYnJpZ2h0bmVzcyAhPSAwKQorCQlpZiAodXNlcl9icmlnaHRuZXNzID4gc2FiaV9jb25maWctPm1pbl9icmlnaHRuZXNzKQogCQkJdXNlcl9icmlnaHRuZXNzIC09IHNhYmlfY29uZmlnLT5taW5fYnJpZ2h0bmVzczsKKwkJZWxzZQorCQkJdXNlcl9icmlnaHRuZXNzID0gMDsKIAl9CiAJcmV0dXJuIHVzZXJfYnJpZ2h0bmVzczsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2JyaWdodG5lc3ModTggdXNlcl9icmlnaHRuZXNzKQogewotCXU4IHVzZXJfbGV2ZWwgPSB1c2VyX2JyaWdodG5lc3MgLSBzYWJpX2NvbmZpZy0+bWluX2JyaWdodG5lc3M7CisJdTggdXNlcl9sZXZlbCA9IHVzZXJfYnJpZ2h0bmVzcyArIHNhYmlfY29uZmlnLT5taW5fYnJpZ2h0bmVzczsKKworCWlmIChoYXNfc3RlcHBpbmdfcXVpcmsgJiYgdXNlcl9sZXZlbCAhPSAwKSB7CisJCS8qCisJCSAqIHNob3J0IGNpcmN1aXQgaWYgdGhlIHNwZWNpZmllZCBsZXZlbCBpcyB3aGF0J3MgYWxyZWFkeSBzZXQKKwkJICogdG8gcHJldmVudCB0aGUgc2NyZWVuIGZyb20gZmxpY2tlcmluZyBuZWVkbGVzc2x5CisJCSAqLworCQlpZiAodXNlcl9icmlnaHRuZXNzID09IHJlYWRfYnJpZ2h0bmVzcygpKQorCQkJcmV0dXJuOworCisJCXNhYmlfc2V0X2NvbW1hbmQoc2FiaV9jb25maWctPmNvbW1hbmRzLnNldF9icmlnaHRuZXNzLCAwKTsKKwl9CiAKIAlzYWJpX3NldF9jb21tYW5kKHNhYmlfY29uZmlnLT5jb21tYW5kcy5zZXRfYnJpZ2h0bmVzcywgdXNlcl9sZXZlbCk7CiB9CkBAIC0zODgsNiArNDAyLDQwIEBACiAJcmV0dXJuIChpbnQpcmVhZF9icmlnaHRuZXNzKCk7CiB9CiAKK3N0YXRpYyB2b2lkIGNoZWNrX2Zvcl9zdGVwcGluZ19xdWlyayh2b2lkKQoreworCXU4IGluaXRpYWxfbGV2ZWw7CisJdTggY2hlY2tfbGV2ZWw7CisJdTggb3JpZ19sZXZlbCA9IHJlYWRfYnJpZ2h0bmVzcygpOworCisJLyoKKwkgKiBTb21lIGxhcHRvcHMgZXhoaWJpdCB0aGUgc3RyYW5nZSBiZWhhdmlvdXIgb2Ygc3RlcHBpbmcgdG93YXJkCisJICogKHJhdGhlciB0aGFuIHNldHRpbmcpIHRoZSBicmlnaHRuZXNzIGV4Y2VwdCB3aGVuIGNoYW5naW5nIHRvL2Zyb20KKwkgKiBicmlnaHRuZXNzIGxldmVsIDAuIFRoaXMgYmVoYXZpb3VyIGlzIGNoZWNrZWQgZm9yIGhlcmUgYW5kIHdvcmtlZAorCSAqIGFyb3VuZCBpbiBzZXRfYnJpZ2h0bmVzcy4KKwkgKi8KKworCWlmIChvcmlnX2xldmVsID09IDApCisJCXNldF9icmlnaHRuZXNzKDEpOworCisJaW5pdGlhbF9sZXZlbCA9IHJlYWRfYnJpZ2h0bmVzcygpOworCisJaWYgKGluaXRpYWxfbGV2ZWwgPD0gMikKKwkJY2hlY2tfbGV2ZWwgPSBpbml0aWFsX2xldmVsICsgMjsKKwllbHNlCisJCWNoZWNrX2xldmVsID0gaW5pdGlhbF9sZXZlbCAtIDI7CisKKwloYXNfc3RlcHBpbmdfcXVpcmsgPSBmYWxzZTsKKwlzZXRfYnJpZ2h0bmVzcyhjaGVja19sZXZlbCk7CisKKwlpZiAocmVhZF9icmlnaHRuZXNzKCkgIT0gY2hlY2tfbGV2ZWwpIHsKKwkJaGFzX3N0ZXBwaW5nX3F1aXJrID0gdHJ1ZTsKKwkJcHJfaW5mbygiZW5hYmxlZCB3b3JrYXJvdW5kIGZvciBicmlnaHRuZXNzIHN0ZXBwaW5nIHF1aXJrXG4iKTsKKwl9CisKKwlzZXRfYnJpZ2h0bmVzcyhvcmlnX2xldmVsKTsKK30KKwogc3RhdGljIGludCB1cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKIHsKIAlzZXRfYnJpZ2h0bmVzcyhiZC0+cHJvcHMuYnJpZ2h0bmVzcyk7CkBAIC02MjEsNiArNjY5LDE2IEBACiAJCS5jYWxsYmFjayA9IGRtaV9jaGVja19jYiwKIAl9LAogCXsKKwkJLmlkZW50ID0gIk4yMjAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwKKwkJCQkJIlNBTVNVTkcgRUxFQ1RST05JQ1MgQ08uLCBMVEQuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk4yMjAiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIk4yMjAiKSwKKwkJfSwKKwkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiLAorCX0sCisJewogCQkuaWRlbnQgPSAiTjE1MC9OMjEwL04yMjAvTjIzMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLApAQCAtNjQxLDYgKzY5OSwxNSBAQAogCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2IsCiAJfSwKIAl7CisJCS5pZGVudCA9ICJSNzAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCSAgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNBTVNVTkcgRUxFQ1RST05JQ1MgQ08uLCBMVEQuIiksCisJCSAgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiU1I3MDAiKSwKKwkJICAgICAgRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiU1I3MDAiKSwKKwkJfSwKKwkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiLAorCX0sCisJewogCQkuaWRlbnQgPSAiUjUzMC9SNzMwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCSAgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNBTVNVTkcgRUxFQ1RST05JQ1MgQ08uLCBMVEQuIiksCkBAIC02ODYsNiArNzUzLDMzIEBACiAJCX0sCiAJCS5jYWxsYmFjayA9IGRtaV9jaGVja19jYiwKIAl9LAorCXsKKwkJLmlkZW50ID0gIlI1MjgvUjcyOCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0FNU1VORyBFTEVDVFJPTklDUyBDTy4sIExURC4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUjUyOC9SNzI4IiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJSNTI4L1I3MjgiKSwKKwkJfSwKKwkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiLAorCX0sCisJeworCQkuaWRlbnQgPSAiTkMyMTAvTkMxMTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNBTVNVTkcgRUxFQ1RST05JQ1MgQ08uLCBMVEQuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk5DMjEwL05DMTEwIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJOQzIxMC9OQzExMCIpLAorCQl9LAorCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2IsCisJfSwKKwkJeworCQkuaWRlbnQgPSAiWDUyMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0FNU1VORyBFTEVDVFJPTklDUyBDTy4sIExURC4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiWDUyMCIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiWDUyMCIpLAorCQl9LAorCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2IsCisJfSwKIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShkbWksIHNhbXN1bmdfZG1pX3RhYmxlKTsKQEAgLTc3MCw3ICs4NjQsNyBAQAogCXNhYmlfaWZhY2UgPSBpb3JlbWFwX25vY2FjaGUoaWZhY2VQLCAxNik7CiAJaWYgKCFzYWJpX2lmYWNlKSB7CiAJCXByX2VycigiQ2FuJ3QgcmVtYXAgJXhcbiIsIGlmYWNlUCk7Ci0JCWdvdG8gZXhpdDsKKwkJZ290byBlcnJvcl9ub19zaWduYXR1cmU7CiAJfQogCWlmIChkZWJ1ZykgewogCQlwcmludGsoS0VSTl9ERUJVRyAiaWZhY2VQID0gMHglMDh4XG4iLCBpZmFjZVApOwpAQCAtNzk0LDYgKzg4OCw5IEBACiAJCX0KIAl9CiAKKwkvKiBDaGVjayBmb3Igc3RlcHBpbmcgcXVpcmsgKi8KKwljaGVja19mb3Jfc3RlcHBpbmdfcXVpcmsoKTsKKwogCS8qIGtub2NrIHVwIGEgcGxhdGZvcm0gZGV2aWNlIHRvIGhhbmcgc3R1ZmYgb2ZmIG9mICovCiAJc2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInNhbXN1bmciLCAtMSwgTlVMTCwgMCk7CiAJaWYgKElTX0VSUihzZGV2KSkKQEAgLTgwMiw3ICs4OTksOCBAQAogCS8qIGNyZWF0ZSBhIGJhY2tsaWdodCBkZXZpY2UgdG8gdGFsayB0byB0aGlzIG9uZSAqLwogCW1lbXNldCgmcHJvcHMsIDAsIHNpemVvZihzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMpKTsKIAlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1BMQVRGT1JNOwotCXByb3BzLm1heF9icmlnaHRuZXNzID0gc2FiaV9jb25maWctPm1heF9icmlnaHRuZXNzOworCXByb3BzLm1heF9icmlnaHRuZXNzID0gc2FiaV9jb25maWctPm1heF9icmlnaHRuZXNzIC0KKwkJCQlzYWJpX2NvbmZpZy0+bWluX2JyaWdodG5lc3M7CiAJYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInNhbXN1bmciLCAmc2Rldi0+ZGV2LAogCQkJCQkJICAgICBOVUxMLCAmYmFja2xpZ2h0X29wcywKIAkJCQkJCSAgICAgJnByb3BzKTsKQEAgLTgyMSw3ICs5MTksNiBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyb3JfZmlsZV9jcmVhdGU7CiAKLWV4aXQ6CiAJcmV0dXJuIDA7CiAKIGVycm9yX2ZpbGVfY3JlYXRlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMKaW5kZXggYmJkMTgyZS4uYzAwNmRlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCkBAIC0zMjgxLDcgKzMyODEsNyBAQAogCS8qIHJlcXVlc3QgSVJRICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGlycSwgJnNwaWNfZGV2LmludGVycnVwdHMsIGxpc3QpIHsKIAkJaWYgKCFyZXF1ZXN0X2lycShpcnEtPmlycS5pbnRlcnJ1cHRzWzBdLCBzb255X3BpY19pcnEsCi0JCQkJCUlSUUZfRElTQUJMRUQsICJzb255LWxhcHRvcCIsICZzcGljX2RldikpIHsKKwkJCQkJMCwgInNvbnktbGFwdG9wIiwgJnNwaWNfZGV2KSkgewogCQkJZHByaW50aygiSVJROiAlZCAtIHRyaWdnZXJpbmc6ICVkIC0gIgogCQkJCQkicG9sYXJpdHk6ICVkIC0gc2hyOiAlZFxuIiwKIAkJCQkJaXJxLT5pcnEuaW50ZXJydXB0c1swXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RvcHN0YXItbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3BzdGFyLWxhcHRvcC5jCmluZGV4IDRjMjA0NDcuLmQ1MjhkYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RvcHN0YXItbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdG9wc3Rhci1sYXB0b3AuYwpAQCAtNDEsNiArNDEsNyBAQAogCXsgS0VfS0VZLCAweDhjLCB7IEtFWV9NRURJQSB9IH0sCiAKIAkvKiBLbm93biBub24gaG90a2V5IGV2ZW50cyBkb24ndCBoYW5kbGVkIG9yIHRoYXQgd2UgZG9uJ3QgY2FyZSB5ZXQgKi8KKwl7IEtFX0lHTk9SRSwgMHg4MiwgfSwgLyogYmFja2xpZ2h0IGV2ZW50ICovCiAJeyBLRV9JR05PUkUsIDB4OGUsIH0sCiAJeyBLRV9JR05PUkUsIDB4OGYsIH0sCiAJeyBLRV9JR05PUkUsIDB4OTAsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3Rvc2hpYmFfYWNwaS5jCmluZGV4IGNiMDA5YjIuLjEzZWY4YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3Rvc2hpYmFfYWNwaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3Rvc2hpYmFfYWNwaS5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CkBAIC02MywxMSArNjIsNyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAvKiBUb3NoaWJhIEFDUEkgbWV0aG9kIHBhdGhzICovCi0jZGVmaW5lIE1FVEhPRF9MQ0RfQlJJR0hUTkVTUwkiXFxfU0JfLlBDSTAuVkdBXy5MQ0RfLl9CQ00iCi0jZGVmaW5lIFRPU0hfSU5URVJGQUNFXzEJIlxcX1NCXy5WQUxEIgotI2RlZmluZSBUT1NIX0lOVEVSRkFDRV8yCSJcXF9TQl8uVkFMWiIKICNkZWZpbmUgTUVUSE9EX1ZJREVPX09VVAkiXFxfU0JfLlZBTFguRFNTWCIKLSNkZWZpbmUgR0hDSV9NRVRIT0QJCSIuR0hDSSIKIAogLyogVG9zaGliYSBIQ0kgaW50ZXJmYWNlIGRlZmluaXRpb25zCiAgKgpAQCAtMTExLDYgKzEwNiwyNSBAQAogI2RlZmluZSBIQ0lfV0lSRUxFU1NfQlRfQVRUQUNICQkweDQwCiAjZGVmaW5lIEhDSV9XSVJFTEVTU19CVF9QT1dFUgkJMHg4MAogCitzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiB7CisJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldjsKKwljb25zdCBjaGFyICptZXRob2RfaGNpOworCXN0cnVjdCByZmtpbGwgKmJ0X3JmazsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpob3RrZXlfZGV2OworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHRfZGV2OworCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkX2RldjsKKworCWludCBmb3JjZV9mYW47CisJaW50IGxhc3Rfa2V5X2V2ZW50OworCWludCBrZXlfZXZlbnRfdmFsaWQ7CisKKwlpbnQgaWxsdW1pbmF0aW9uX3N1cHBvcnRlZDoxOworCWludCB2aWRlb19zdXBwb3J0ZWQ6MTsKKwlpbnQgZmFuX3N1cHBvcnRlZDoxOworCisJc3RydWN0IG11dGV4IG11dGV4OworfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCB0b3NoaWJhX2RldmljZV9pZHNbXSA9IHsKIAl7IlRPUzYyMDAiLCAwfSwKIAl7IlRPUzYyMDgiLCAwfSwKQEAgLTExOSw3ICsxMzMsNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgdG9zaGliYV9kZXZpY2VfaWRzKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBrZXlfZW50cnkgdG9zaGliYV9hY3BpX2tleW1hcFtdIF9faW5pdGNvbnN0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBrZXlfZW50cnkgdG9zaGliYV9hY3BpX2tleW1hcFtdIF9fZGV2aW5pdGNvbnN0ID0gewogCXsgS0VfS0VZLCAweDEwMSwgeyBLRVlfTVVURSB9IH0sCiAJeyBLRV9LRVksIDB4MTAyLCB7IEtFWV9aT09NT1VUIH0gfSwKIAl7IEtFX0tFWSwgMHgxMDMsIHsgS0VZX1pPT01JTiB9IH0sCkBAIC0xNTUsMTUgKzE2OSw2IEBACiAvKiBhY3BpIGludGVyZmFjZSB3cmFwcGVycwogICovCiAKLXN0YXRpYyBpbnQgaXNfdmFsaWRfYWNwaV9wYXRoKGNvbnN0IGNoYXIgKm1ldGhvZE5hbWUpCi17Ci0JYWNwaV9oYW5kbGUgaGFuZGxlOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCAoY2hhciAqKW1ldGhvZE5hbWUsICZoYW5kbGUpOwotCXJldHVybiAhQUNQSV9GQUlMVVJFKHN0YXR1cyk7Ci19Ci0KIHN0YXRpYyBpbnQgd3JpdGVfYWNwaV9pbnQoY29uc3QgY2hhciAqbWV0aG9kTmFtZSwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CkBAIC0xNzYsMzIgKzE4MSwxNCBAQAogCWluX29ianNbMF0uaW50ZWdlci52YWx1ZSA9IHZhbDsKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIChjaGFyICopbWV0aG9kTmFtZSwgJnBhcmFtcywgTlVMTCk7Ci0JcmV0dXJuIChzdGF0dXMgPT0gQUVfT0spOworCXJldHVybiAoc3RhdHVzID09IEFFX09LKSA/IDAgOiAtRUlPOwogfQogCi0jaWYgMAotc3RhdGljIGludCByZWFkX2FjcGlfaW50KGNvbnN0IGNoYXIgKm1ldGhvZE5hbWUsIGludCAqcFZhbCkKLXsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgcmVzdWx0czsKLQl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2Jqc1sxXTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlyZXN1bHRzLmxlbmd0aCA9IHNpemVvZihvdXRfb2Jqcyk7Ci0JcmVzdWx0cy5wb2ludGVyID0gb3V0X29ianM7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCgwLCAoY2hhciAqKW1ldGhvZE5hbWUsIDAsICZyZXN1bHRzKTsKLQkqcFZhbCA9IG91dF9vYmpzWzBdLmludGVnZXIudmFsdWU7Ci0KLQlyZXR1cm4gKHN0YXR1cyA9PSBBRV9PSykgJiYgKG91dF9vYmpzWzBdLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBjaGFyICptZXRob2RfaGNpIC8qPSAwKi8gOwotCiAvKiBQZXJmb3JtIGEgcmF3IEhDSSBjYWxsLiAgSGVyZSB3ZSBkb24ndCBjYXJlIGFib3V0IGlucHV0IG9yIG91dHB1dCBidWZmZXIKICAqIGZvcm1hdC4KICAqLwotc3RhdGljIGFjcGlfc3RhdHVzIGhjaV9yYXcoY29uc3QgdTMyIGluW0hDSV9XT1JEU10sIHUzMiBvdXRbSENJX1dPUkRTXSkKK3N0YXRpYyBhY3BpX3N0YXR1cyBoY2lfcmF3KHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYsCisJCQkgICBjb25zdCB1MzIgaW5bSENJX1dPUkRTXSwgdTMyIG91dFtIQ0lfV09SRFNdKQogewogCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IHBhcmFtczsKIAl1bmlvbiBhY3BpX29iamVjdCBpbl9vYmpzW0hDSV9XT1JEU107CkBAIC0yMjAsNyArMjA3LDggQEAKIAlyZXN1bHRzLmxlbmd0aCA9IHNpemVvZihvdXRfb2Jqcyk7CiAJcmVzdWx0cy5wb2ludGVyID0gb3V0X29ianM7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCAoY2hhciAqKW1ldGhvZF9oY2ksICZwYXJhbXMsCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2LT5hY3BpX2Rldi0+aGFuZGxlLAorCQkJCSAgICAgIChjaGFyICopZGV2LT5tZXRob2RfaGNpLCAmcGFyYW1zLAogCQkJCSAgICAgICZyZXN1bHRzKTsKIAlpZiAoKHN0YXR1cyA9PSBBRV9PSykgJiYgKG91dF9vYmpzLT5wYWNrYWdlLmNvdW50IDw9IEhDSV9XT1JEUykpIHsKIAkJZm9yIChpID0gMDsgaSA8IG91dF9vYmpzLT5wYWNrYWdlLmNvdW50OyArK2kpIHsKQEAgLTIzNyw4NSArMjI1LDc5IEBACiAgKiBtYXkgYmUgdXNlZnVsIChzdWNoIGFzICJub3Qgc3VwcG9ydGVkIikuCiAgKi8KIAotc3RhdGljIGFjcGlfc3RhdHVzIGhjaV93cml0ZTEodTMyIHJlZywgdTMyIGluMSwgdTMyICogcmVzdWx0KQorc3RhdGljIGFjcGlfc3RhdHVzIGhjaV93cml0ZTEoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiwgdTMyIHJlZywKKwkJCSAgICAgIHUzMiBpbjEsIHUzMiAqcmVzdWx0KQogewogCXUzMiBpbltIQ0lfV09SRFNdID0geyBIQ0lfU0VULCByZWcsIGluMSwgMCwgMCwgMCB9OwogCXUzMiBvdXRbSENJX1dPUkRTXTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBoY2lfcmF3KGluLCBvdXQpOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAkqcmVzdWx0ID0gKHN0YXR1cyA9PSBBRV9PSykgPyBvdXRbMF0gOiBIQ0lfRkFJTFVSRTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgYWNwaV9zdGF0dXMgaGNpX3JlYWQxKHUzMiByZWcsIHUzMiAqIG91dDEsIHUzMiAqIHJlc3VsdCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBoY2lfcmVhZDEoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiwgdTMyIHJlZywKKwkJCSAgICAgdTMyICpvdXQxLCB1MzIgKnJlc3VsdCkKIHsKIAl1MzIgaW5bSENJX1dPUkRTXSA9IHsgSENJX0dFVCwgcmVnLCAwLCAwLCAwLCAwIH07CiAJdTMyIG91dFtIQ0lfV09SRFNdOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogCSpvdXQxID0gb3V0WzJdOwogCSpyZXN1bHQgPSAoc3RhdHVzID09IEFFX09LKSA/IG91dFswXSA6IEhDSV9GQUlMVVJFOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBoY2lfd3JpdGUyKHUzMiByZWcsIHUzMiBpbjEsIHUzMiBpbjIsIHUzMiAqcmVzdWx0KQorc3RhdGljIGFjcGlfc3RhdHVzIGhjaV93cml0ZTIoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiwgdTMyIHJlZywKKwkJCSAgICAgIHUzMiBpbjEsIHUzMiBpbjIsIHUzMiAqcmVzdWx0KQogewogCXUzMiBpbltIQ0lfV09SRFNdID0geyBIQ0lfU0VULCByZWcsIGluMSwgaW4yLCAwLCAwIH07CiAJdTMyIG91dFtIQ0lfV09SRFNdOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogCSpyZXN1bHQgPSAoc3RhdHVzID09IEFFX09LKSA/IG91dFswXSA6IEhDSV9GQUlMVVJFOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBoY2lfcmVhZDIodTMyIHJlZywgdTMyICpvdXQxLCB1MzIgKm91dDIsIHUzMiAqcmVzdWx0KQorc3RhdGljIGFjcGlfc3RhdHVzIGhjaV9yZWFkMihzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2LCB1MzIgcmVnLAorCQkJICAgICB1MzIgKm91dDEsIHUzMiAqb3V0MiwgdTMyICpyZXN1bHQpCiB7CiAJdTMyIGluW0hDSV9XT1JEU10gPSB7IEhDSV9HRVQsIHJlZywgKm91dDEsICpvdXQyLCAwLCAwIH07CiAJdTMyIG91dFtIQ0lfV09SRFNdOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogCSpvdXQxID0gb3V0WzJdOwogCSpvdXQyID0gb3V0WzNdOwogCSpyZXN1bHQgPSAoc3RhdHVzID09IEFFX09LKSA/IG91dFswXSA6IEhDSV9GQUlMVVJFOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2IHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwX2RldjsKLQlzdHJ1Y3QgcmZraWxsICpidF9yZms7Ci0Jc3RydWN0IGlucHV0X2RldiAqaG90a2V5X2RldjsKLQlpbnQgaWxsdW1pbmF0aW9uX2luc3RhbGxlZDsKLQlhY3BpX2hhbmRsZSBoYW5kbGU7Ci0KLQljb25zdCBjaGFyICpidF9uYW1lOwotCi0Jc3RydWN0IG11dGV4IG11dGV4OwotfTsKLQogLyogSWxsdW1pbmF0aW9uIHN1cHBvcnQgKi8KLXN0YXRpYyBpbnQgdG9zaGliYV9pbGx1bWluYXRpb25fYXZhaWxhYmxlKHZvaWQpCitzdGF0aWMgaW50IHRvc2hpYmFfaWxsdW1pbmF0aW9uX2F2YWlsYWJsZShzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2KQogewogCXUzMiBpbltIQ0lfV09SRFNdID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CiAJdTMyIG91dFtIQ0lfV09SRFNdOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCWluWzBdID0gMHhmMTAwOwotCXN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJc3RhdHVzID0gaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlwcl9pbmZvKCJJbGx1bWluYXRpb24gZGV2aWNlIG5vdCBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJaW5bMF0gPSAweGY0MDA7Ci0Jc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwlzdGF0dXMgPSBoY2lfcmF3KGRldiwgaW4sIG91dCk7CiAJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIHRvc2hpYmFfaWxsdW1pbmF0aW9uX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LAogCQkJCSAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQogeworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBjb250YWluZXJfb2YoY2RldiwKKwkJCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2LCBsZWRfZGV2KTsKIAl1MzIgaW5bSENJX1dPUkRTXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwogCXUzMiBvdXRbSENJX1dPUkRTXTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKiBGaXJzdCByZXF1ZXN0IDogaW5pdGlhbGl6ZSBjb21tdW5pY2F0aW9uLiAqLwogCWluWzBdID0gMHhmMTAwOwotCXN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJc3RhdHVzID0gaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlwcl9pbmZvKCJJbGx1bWluYXRpb24gZGV2aWNlIG5vdCBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm47CkBAIC0zMjYsNyArMzA4LDcgQEAKIAkJaW5bMF0gPSAweGY0MDA7CiAJCWluWzFdID0gMHgxNGU7CiAJCWluWzJdID0gMTsKLQkJc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwkJc3RhdHVzID0gaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXByX2luZm8oIkFDUEkgY2FsbCBmb3IgaWxsdW1pbmF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm47CkBAIC0zMzYsNyArMzE4LDcgQEAKIAkJaW5bMF0gPSAweGY0MDA7CiAJCWluWzFdID0gMHgxNGU7CiAJCWluWzJdID0gMDsKLQkJc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwkJc3RhdHVzID0gaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXByX2luZm8oIkFDUEkgY2FsbCBmb3IgaWxsdW1pbmF0aW9uIGZhaWxlZC5cbiIpOwogCQkJcmV0dXJuOwpAQCAtMzQ3LDExICszMjksMTMgQEAKIAlpblswXSA9IDB4ZjIwMDsKIAlpblsxXSA9IDA7CiAJaW5bMl0gPSAwOwotCWhjaV9yYXcoaW4sIG91dCk7CisJaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogfQogCiBzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyB0b3NoaWJhX2lsbHVtaW5hdGlvbl9nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldikKIHsKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gY29udGFpbmVyX29mKGNkZXYsCisJCQlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiwgbGVkX2Rldik7CiAJdTMyIGluW0hDSV9XT1JEU10gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKIAl1MzIgb3V0W0hDSV9XT1JEU107CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwpAQCAtMzU5LDcgKzM0Myw3IEBACiAKIAkvKsKgRmlyc3QgcmVxdWVzdCA6IGluaXRpYWxpemUgY29tbXVuaWNhdGlvbi4gKi8KIAlpblswXSA9IDB4ZjEwMDsKLQlzdGF0dXMgPSBoY2lfcmF3KGluLCBvdXQpOworCXN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcHJfaW5mbygiSWxsdW1pbmF0aW9uIGRldmljZSBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuIExFRF9PRkY7CkBAIC0zNjgsNyArMzUyLDcgQEAKIAkvKiBDaGVjayB0aGUgaWxsdW1pbmF0aW9uICovCiAJaW5bMF0gPSAweGYzMDA7CiAJaW5bMV0gPSAweDE0ZTsKLQlzdGF0dXMgPSBoY2lfcmF3KGluLCBvdXQpOworCXN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcHJfaW5mbygiQUNQSSBjYWxsIGZvciBpbGx1bWluYXRpb24gZmFpbGVkLlxuIik7CiAJCXJldHVybiBMRURfT0ZGOwpAQCAtMzgwLDQ2ICszNjQsMzUgQEAKIAlpblswXSA9IDB4ZjIwMDsKIAlpblsxXSA9IDA7CiAJaW5bMl0gPSAwOwotCWhjaV9yYXcoaW4sIG91dCk7CisJaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgdG9zaGliYV9sZWQgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gInRvc2hpYmE6OmlsbHVtaW5hdGlvbiIsCi0JLm1heF9icmlnaHRuZXNzID0gMSwKLQkuYnJpZ2h0bmVzc19zZXQgPSB0b3NoaWJhX2lsbHVtaW5hdGlvbl9zZXQsCi0JLmJyaWdodG5lc3NfZ2V0ID0gdG9zaGliYV9pbGx1bWluYXRpb25fZ2V0LAotfTsKLQotc3RhdGljIHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2IHRvc2hpYmFfYWNwaSA9IHsKLQkuYnRfbmFtZSA9ICJUb3NoaWJhIEJsdWV0b290aCIsCi19OwotCiAvKiBCbHVldG9vdGggcmZraWxsIGhhbmRsZXJzICovCiAKLXN0YXRpYyB1MzIgaGNpX2dldF9idF9wcmVzZW50KGJvb2wgKnByZXNlbnQpCitzdGF0aWMgdTMyIGhjaV9nZXRfYnRfcHJlc2VudChzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2LCBib29sICpwcmVzZW50KQogewogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZSwgdmFsdWUyOwogCiAJdmFsdWUgPSAwOwogCXZhbHVlMiA9IDA7Ci0JaGNpX3JlYWQyKEhDSV9XSVJFTEVTUywgJnZhbHVlLCAmdmFsdWUyLCAmaGNpX3Jlc3VsdCk7CisJaGNpX3JlYWQyKGRldiwgSENJX1dJUkVMRVNTLCAmdmFsdWUsICZ2YWx1ZTIsICZoY2lfcmVzdWx0KTsKIAlpZiAoaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUykKIAkJKnByZXNlbnQgPSAodmFsdWUgJiBIQ0lfV0lSRUxFU1NfQlRfUFJFU0VOVCkgPyB0cnVlIDogZmFsc2U7CiAKIAlyZXR1cm4gaGNpX3Jlc3VsdDsKIH0KIAotc3RhdGljIHUzMiBoY2lfZ2V0X3JhZGlvX3N0YXRlKGJvb2wgKnJhZGlvX3N0YXRlKQorc3RhdGljIHUzMiBoY2lfZ2V0X3JhZGlvX3N0YXRlKHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYsIGJvb2wgKnJhZGlvX3N0YXRlKQogewogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZSwgdmFsdWUyOwogCiAJdmFsdWUgPSAwOwogCXZhbHVlMiA9IDB4MDAwMTsKLQloY2lfcmVhZDIoSENJX1dJUkVMRVNTLCAmdmFsdWUsICZ2YWx1ZTIsICZoY2lfcmVzdWx0KTsKKwloY2lfcmVhZDIoZGV2LCBIQ0lfV0lSRUxFU1MsICZ2YWx1ZSwgJnZhbHVlMiwgJmhjaV9yZXN1bHQpOwogCiAJKnJhZGlvX3N0YXRlID0gdmFsdWUgJiBIQ0lfV0lSRUxFU1NfS0lMTF9TV0lUQ0g7CiAJcmV0dXJuIGhjaV9yZXN1bHQ7CkBAIC00MzYsOCArNDA5LDggQEAKIAl2YWx1ZSA9IChibG9ja2VkID09IGZhbHNlKTsKIAogCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwotCWlmIChoY2lfZ2V0X3JhZGlvX3N0YXRlKCZyYWRpb19zdGF0ZSkgIT0gSENJX1NVQ0NFU1MpIHsKLQkJZXJyID0gLUVCVVNZOworCWlmIChoY2lfZ2V0X3JhZGlvX3N0YXRlKGRldiwgJnJhZGlvX3N0YXRlKSAhPSBIQ0lfU1VDQ0VTUykgeworCQllcnIgPSAtRUlPOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQ0NiwxMSArNDE5LDExIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWhjaV93cml0ZTIoSENJX1dJUkVMRVNTLCB2YWx1ZSwgSENJX1dJUkVMRVNTX0JUX1BPV0VSLCAmcmVzdWx0MSk7Ci0JaGNpX3dyaXRlMihIQ0lfV0lSRUxFU1MsIHZhbHVlLCBIQ0lfV0lSRUxFU1NfQlRfQVRUQUNILCAmcmVzdWx0Mik7CisJaGNpX3dyaXRlMihkZXYsIEhDSV9XSVJFTEVTUywgdmFsdWUsIEhDSV9XSVJFTEVTU19CVF9QT1dFUiwgJnJlc3VsdDEpOworCWhjaV93cml0ZTIoZGV2LCBIQ0lfV0lSRUxFU1MsIHZhbHVlLCBIQ0lfV0lSRUxFU1NfQlRfQVRUQUNILCAmcmVzdWx0Mik7CiAKIAlpZiAocmVzdWx0MSAhPSBIQ0lfU1VDQ0VTUyB8fCByZXN1bHQyICE9IEhDSV9TVUNDRVNTKQotCQllcnIgPSAtRUJVU1k7CisJCWVyciA9IC1FSU87CiAJZWxzZQogCQllcnIgPSAwOwogIG91dDoKQEAgLTQ2Nyw3ICs0NDAsNyBAQAogCiAJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CiAKLQloY2lfcmVzdWx0ID0gaGNpX2dldF9yYWRpb19zdGF0ZSgmdmFsdWUpOworCWhjaV9yZXN1bHQgPSBoY2lfZ2V0X3JhZGlvX3N0YXRlKGRldiwgJnZhbHVlKTsKIAlpZiAoaGNpX3Jlc3VsdCAhPSBIQ0lfU1VDQ0VTUykgewogCQkvKiBDYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgKi8KIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKQEAgLTQ4OCw2MyArNDYxLDY0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0b3NoaWJhX3Byb2NfZGlyIC8qPSAwKi8gOwotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICp0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2U7Ci1zdGF0aWMgaW50IGZvcmNlX2ZhbjsKLXN0YXRpYyBpbnQgbGFzdF9rZXlfZXZlbnQ7Ci1zdGF0aWMgaW50IGtleV9ldmVudF92YWxpZDsKIAogc3RhdGljIGludCBnZXRfbGNkKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKIHsKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gYmxfZ2V0X2RhdGEoYmQpOwogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZTsKIAotCWhjaV9yZWFkMShIQ0lfTENEX0JSSUdIVE5FU1MsICZ2YWx1ZSwgJmhjaV9yZXN1bHQpOwotCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKSB7CisJaGNpX3JlYWQxKGRldiwgSENJX0xDRF9CUklHSFRORVNTLCAmdmFsdWUsICZoY2lfcmVzdWx0KTsKKwlpZiAoaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUykKIAkJcmV0dXJuICh2YWx1ZSA+PiBIQ0lfTENEX0JSSUdIVE5FU1NfU0hJRlQpOwotCX0gZWxzZQotCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAtRUlPOwogfQogCiBzdGF0aWMgaW50IGxjZF9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCWludCB2YWx1ZSA9IGdldF9sY2QoTlVMTCk7CisJc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiA9IG0tPnByaXZhdGU7CisJaW50IHZhbHVlOwogCisJaWYgKCFkZXYtPmJhY2tsaWdodF9kZXYpCisJCXJldHVybiAtRU5PREVWOworCisJdmFsdWUgPSBnZXRfbGNkKGRldi0+YmFja2xpZ2h0X2Rldik7CiAJaWYgKHZhbHVlID49IDApIHsKIAkJc2VxX3ByaW50ZihtLCAiYnJpZ2h0bmVzczogICAgICAgICAgICAgICVkXG4iLCB2YWx1ZSk7CiAJCXNlcV9wcmludGYobSwgImJyaWdodG5lc3NfbGV2ZWxzOiAgICAgICAlZFxuIiwKIAkJCSAgICAgSENJX0xDRF9CUklHSFRORVNTX0xFVkVMUyk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJFcnJvciByZWFkaW5nIExDRCBicmlnaHRuZXNzXG4iKTsKKwkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIDA7CisJcHJfZXJyKCJFcnJvciByZWFkaW5nIExDRCBicmlnaHRuZXNzXG4iKTsKKwlyZXR1cm4gLUVJTzsKIH0KIAogc3RhdGljIGludCBsY2RfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBsY2RfcHJvY19zaG93LCBOVUxMKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgbGNkX3Byb2Nfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X2xjZChpbnQgdmFsdWUpCitzdGF0aWMgaW50IHNldF9sY2Qoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiwgaW50IHZhbHVlKQogewogCXUzMiBoY2lfcmVzdWx0OwogCiAJdmFsdWUgPSB2YWx1ZSA8PCBIQ0lfTENEX0JSSUdIVE5FU1NfU0hJRlQ7Ci0JaGNpX3dyaXRlMShIQ0lfTENEX0JSSUdIVE5FU1MsIHZhbHVlLCAmaGNpX3Jlc3VsdCk7Ci0JaWYgKGhjaV9yZXN1bHQgIT0gSENJX1NVQ0NFU1MpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7CisJaGNpX3dyaXRlMShkZXYsIEhDSV9MQ0RfQlJJR0hUTkVTUywgdmFsdWUsICZoY2lfcmVzdWx0KTsKKwlyZXR1cm4gaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUyA/IDAgOiAtRUlPOwogfQogCiBzdGF0aWMgaW50IHNldF9sY2Rfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKIHsKLQlyZXR1cm4gc2V0X2xjZChiZC0+cHJvcHMuYnJpZ2h0bmVzcyk7CisJc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiA9IGJsX2dldF9kYXRhKGJkKTsKKwlyZXR1cm4gc2V0X2xjZChkZXYsIGJkLT5wcm9wcy5icmlnaHRuZXNzKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbGNkX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQogeworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAJY2hhciBjbWRbNDJdOwogCXNpemVfdCBsZW47CiAJaW50IHZhbHVlOwpAQCAtNTU3LDcgKzUzMSw3IEBACiAKIAlpZiAoc3NjYW5mKGNtZCwgIiBicmlnaHRuZXNzIDogJWkiLCAmdmFsdWUpID09IDEgJiYKIAkgICAgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMpIHsKLQkJcmV0ID0gc2V0X2xjZCh2YWx1ZSk7CisJCXJldCA9IHNldF9sY2QoZGV2LCB2YWx1ZSk7CiAJCWlmIChyZXQgPT0gMCkKIAkJCXJldCA9IGNvdW50OwogCX0gZWxzZSB7CkBAIC01NzUsNDEgKzU0OSw0OSBAQAogCS53cml0ZQkJPSBsY2RfcHJvY193cml0ZSwKIH07CiAKLXN0YXRpYyBpbnQgdmlkZW9fcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3N0YXRpYyBpbnQgZ2V0X3ZpZGVvX3N0YXR1cyhzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2LCB1MzIgKnN0YXR1cykKIHsKIAl1MzIgaGNpX3Jlc3VsdDsKLQl1MzIgdmFsdWU7CiAKLQloY2lfcmVhZDEoSENJX1ZJREVPX09VVCwgJnZhbHVlLCAmaGNpX3Jlc3VsdCk7Ci0JaWYgKGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MpIHsKKwloY2lfcmVhZDEoZGV2LCBIQ0lfVklERU9fT1VULCBzdGF0dXMsICZoY2lfcmVzdWx0KTsKKwlyZXR1cm4gaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUyA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgaW50IHZpZGVvX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiA9IG0tPnByaXZhdGU7CisJdTMyIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfdmlkZW9fc3RhdHVzKGRldiwgJnZhbHVlKTsKKwlpZiAoIXJldCkgewogCQlpbnQgaXNfbGNkID0gKHZhbHVlICYgSENJX1ZJREVPX09VVF9MQ0QpID8gMSA6IDA7CiAJCWludCBpc19jcnQgPSAodmFsdWUgJiBIQ0lfVklERU9fT1VUX0NSVCkgPyAxIDogMDsKIAkJaW50IGlzX3R2ID0gKHZhbHVlICYgSENJX1ZJREVPX09VVF9UVikgPyAxIDogMDsKIAkJc2VxX3ByaW50ZihtLCAibGNkX291dDogICAgICAgICAgICAgICAgICVkXG4iLCBpc19sY2QpOwogCQlzZXFfcHJpbnRmKG0sICJjcnRfb3V0OiAgICAgICAgICAgICAgICAgJWRcbiIsIGlzX2NydCk7CiAJCXNlcV9wcmludGYobSwgInR2X291dDogICAgICAgICAgICAgICAgICAlZFxuIiwgaXNfdHYpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiRXJyb3IgcmVhZGluZyB2aWRlbyBvdXQgc3RhdHVzXG4iKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHZpZGVvX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgdmlkZW9fcHJvY19zaG93LCBOVUxMKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgdmlkZW9fcHJvY19zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAogc3RhdGljIHNzaXplX3QgdmlkZW9fcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQogeworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAJY2hhciAqY21kLCAqYnVmZmVyOworCWludCByZXQ7CiAJaW50IHZhbHVlOwogCWludCByZW1haW4gPSBjb3VudDsKIAlpbnQgbGNkX291dCA9IC0xOwogCWludCBjcnRfb3V0ID0gLTE7CiAJaW50IHR2X291dCA9IC0xOwotCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2aWRlb19vdXQ7CiAKIAljbWQgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CkBAIC02NDQsOCArNjI2LDggQEAKIAogCWtmcmVlKGNtZCk7CiAKLQloY2lfcmVhZDEoSENJX1ZJREVPX09VVCwgJnZpZGVvX291dCwgJmhjaV9yZXN1bHQpOwotCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKSB7CisJcmV0ID0gZ2V0X3ZpZGVvX3N0YXR1cyhkZXYsICZ2aWRlb19vdXQpOworCWlmICghcmV0KSB7CiAJCXVuc2lnbmVkIGludCBuZXdfdmlkZW9fb3V0ID0gdmlkZW9fb3V0OwogCQlpZiAobGNkX291dCAhPSAtMSkKIAkJCV9zZXRfYml0KCZuZXdfdmlkZW9fb3V0LCBIQ0lfVklERU9fT1VUX0xDRCwgbGNkX291dCk7CkBAIC02NTYsMTIgKzYzOCwxMCBAQAogCQkvKiBUbyBhdm9pZCB1bm5lY2Vzc2FyeSB2aWRlbyBkaXNydXB0aW9uLCBvbmx5IHdyaXRlIHRoZSBuZXcKIAkJICogdmlkZW8gc2V0dGluZyBpZiBzb21ldGhpbmcgY2hhbmdlZC4gKi8KIAkJaWYgKG5ld192aWRlb19vdXQgIT0gdmlkZW9fb3V0KQotCQkJd3JpdGVfYWNwaV9pbnQoTUVUSE9EX1ZJREVPX09VVCwgbmV3X3ZpZGVvX291dCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXQgPSB3cml0ZV9hY3BpX2ludChNRVRIT0RfVklERU9fT1VULCBuZXdfdmlkZW9fb3V0KTsKIAl9CiAKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aWRlb19wcm9jX2ZvcHMgPSB7CkBAIC02NzMsMzAgKzY1MywzOCBAQAogCS53cml0ZQkJPSB2aWRlb19wcm9jX3dyaXRlLAogfTsKIAotc3RhdGljIGludCBmYW5fcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3N0YXRpYyBpbnQgZ2V0X2Zhbl9zdGF0dXMoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiwgdTMyICpzdGF0dXMpCiB7CiAJdTMyIGhjaV9yZXN1bHQ7CisKKwloY2lfcmVhZDEoZGV2LCBIQ0lfRkFOLCBzdGF0dXMsICZoY2lfcmVzdWx0KTsKKwlyZXR1cm4gaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUyA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgaW50IGZhbl9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBtLT5wcml2YXRlOworCWludCByZXQ7CiAJdTMyIHZhbHVlOwogCi0JaGNpX3JlYWQxKEhDSV9GQU4sICZ2YWx1ZSwgJmhjaV9yZXN1bHQpOwotCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKSB7CisJcmV0ID0gZ2V0X2Zhbl9zdGF0dXMoZGV2LCAmdmFsdWUpOworCWlmICghcmV0KSB7CiAJCXNlcV9wcmludGYobSwgInJ1bm5pbmc6ICAgICAgICAgICAgICAgICAlZFxuIiwgKHZhbHVlID4gMCkpOwotCQlzZXFfcHJpbnRmKG0sICJmb3JjZV9vbjogICAgICAgICAgICAgICAgJWRcbiIsIGZvcmNlX2Zhbik7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJFcnJvciByZWFkaW5nIGZhbiBzdGF0dXNcbiIpOworCQlzZXFfcHJpbnRmKG0sICJmb3JjZV9vbjogICAgICAgICAgICAgICAgJWRcbiIsIGRldi0+Zm9yY2VfZmFuKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGZhbl9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGZhbl9wcm9jX3Nob3csIE5VTEwpOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBmYW5fcHJvY19zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKIH0KIAogc3RhdGljIHNzaXplX3QgZmFuX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQogeworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAJY2hhciBjbWRbNDJdOwogCXNpemVfdCBsZW47CiAJaW50IHZhbHVlOwpAQCAtNzA5LDExICs2OTcsMTEgQEAKIAogCWlmIChzc2NhbmYoY21kLCAiIGZvcmNlX29uIDogJWkiLCAmdmFsdWUpID09IDEgJiYKIAkgICAgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxKSB7Ci0JCWhjaV93cml0ZTEoSENJX0ZBTiwgdmFsdWUsICZoY2lfcmVzdWx0KTsKKwkJaGNpX3dyaXRlMShkZXYsIEhDSV9GQU4sIHZhbHVlLCAmaGNpX3Jlc3VsdCk7CiAJCWlmIChoY2lfcmVzdWx0ICE9IEhDSV9TVUNDRVNTKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gLUVJTzsKIAkJZWxzZQotCQkJZm9yY2VfZmFuID0gdmFsdWU7CisJCQlkZXYtPmZvcmNlX2ZhbiA9IHZhbHVlOwogCX0gZWxzZSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTczMiw0MiArNzIwLDQzIEBACiAKIHN0YXRpYyBpbnQga2V5c19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogeworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBtLT5wcml2YXRlOwogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZTsKIAotCWlmICgha2V5X2V2ZW50X3ZhbGlkKSB7Ci0JCWhjaV9yZWFkMShIQ0lfU1lTVEVNX0VWRU5ULCAmdmFsdWUsICZoY2lfcmVzdWx0KTsKKwlpZiAoIWRldi0+a2V5X2V2ZW50X3ZhbGlkKSB7CisJCWhjaV9yZWFkMShkZXYsIEhDSV9TWVNURU1fRVZFTlQsICZ2YWx1ZSwgJmhjaV9yZXN1bHQpOwogCQlpZiAoaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUykgewotCQkJa2V5X2V2ZW50X3ZhbGlkID0gMTsKLQkJCWxhc3Rfa2V5X2V2ZW50ID0gdmFsdWU7CisJCQlkZXYtPmtleV9ldmVudF92YWxpZCA9IDE7CisJCQlkZXYtPmxhc3Rfa2V5X2V2ZW50ID0gdmFsdWU7CiAJCX0gZWxzZSBpZiAoaGNpX3Jlc3VsdCA9PSBIQ0lfRU1QVFkpIHsKIAkJCS8qIGJldHRlciBsdWNrIG5leHQgdGltZSAqLwogCQl9IGVsc2UgaWYgKGhjaV9yZXN1bHQgPT0gSENJX05PVF9TVVBQT1JURUQpIHsKIAkJCS8qIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhbiB1bnJlc29sdmVkIGlzc3VlIG9uCiAJCQkgKiBzb21lIG1hY2hpbmVzIHdoZXJlIHN5c3RlbSBldmVudHMgc3BvcmFkaWNhbGx5CiAJCQkgKiBiZWNvbWUgZGlzYWJsZWQuICovCi0JCQloY2lfd3JpdGUxKEhDSV9TWVNURU1fRVZFTlQsIDEsICZoY2lfcmVzdWx0KTsKKwkJCWhjaV93cml0ZTEoZGV2LCBIQ0lfU1lTVEVNX0VWRU5ULCAxLCAmaGNpX3Jlc3VsdCk7CiAJCQlwcl9ub3RpY2UoIlJlLWVuYWJsZWQgaG90a2V5c1xuIik7CiAJCX0gZWxzZSB7CiAJCQlwcl9lcnIoIkVycm9yIHJlYWRpbmcgaG90a2V5IHN0YXR1c1xuIik7Ci0JCQlnb3RvIGVuZDsKKwkJCXJldHVybiAtRUlPOwogCQl9CiAJfQogCi0Jc2VxX3ByaW50ZihtLCAiaG90a2V5X3JlYWR5OiAgICAgICAgICAgICVkXG4iLCBrZXlfZXZlbnRfdmFsaWQpOwotCXNlcV9wcmludGYobSwgImhvdGtleTogICAgICAgICAgICAgICAgICAweCUwNHhcbiIsIGxhc3Rfa2V5X2V2ZW50KTsKLWVuZDoKKwlzZXFfcHJpbnRmKG0sICJob3RrZXlfcmVhZHk6ICAgICAgICAgICAgJWRcbiIsIGRldi0+a2V5X2V2ZW50X3ZhbGlkKTsKKwlzZXFfcHJpbnRmKG0sICJob3RrZXk6ICAgICAgICAgICAgICAgICAgMHglMDR4XG4iLCBkZXYtPmxhc3Rfa2V5X2V2ZW50KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBrZXlzX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwga2V5c19wcm9jX3Nob3csIE5VTEwpOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBrZXlzX3Byb2Nfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGtleXNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQogeworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAJY2hhciBjbWRbNDJdOwogCXNpemVfdCBsZW47CiAJaW50IHZhbHVlOwpAQCAtNzc4LDcgKzc2Nyw3IEBACiAJY21kW2xlbl0gPSAnXDAnOwogCiAJaWYgKHNzY2FuZihjbWQsICIgaG90a2V5X3JlYWR5IDogJWkiLCAmdmFsdWUpID09IDEgJiYgdmFsdWUgPT0gMCkgewotCQlrZXlfZXZlbnRfdmFsaWQgPSAwOworCQlkZXYtPmtleV9ldmVudF92YWxpZCA9IDA7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtODIwLDIxICs4MDksMzUgQEAKIAogI2RlZmluZSBQUk9DX1RPU0hJQkEJCSJ0b3NoaWJhIgogCi1zdGF0aWMgdm9pZCBfX2luaXQgY3JlYXRlX3Rvc2hpYmFfcHJvY19lbnRyaWVzKHZvaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK2NyZWF0ZV90b3NoaWJhX3Byb2NfZW50cmllcyhzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2KQogewotCXByb2NfY3JlYXRlKCJsY2QiLCBTX0lSVUdPIHwgU19JV1VTUiwgdG9zaGliYV9wcm9jX2RpciwgJmxjZF9wcm9jX2ZvcHMpOwotCXByb2NfY3JlYXRlKCJ2aWRlbyIsIFNfSVJVR08gfCBTX0lXVVNSLCB0b3NoaWJhX3Byb2NfZGlyLCAmdmlkZW9fcHJvY19mb3BzKTsKLQlwcm9jX2NyZWF0ZSgiZmFuIiwgU19JUlVHTyB8IFNfSVdVU1IsIHRvc2hpYmFfcHJvY19kaXIsICZmYW5fcHJvY19mb3BzKTsKLQlwcm9jX2NyZWF0ZSgia2V5cyIsIFNfSVJVR08gfCBTX0lXVVNSLCB0b3NoaWJhX3Byb2NfZGlyLCAma2V5c19wcm9jX2ZvcHMpOwotCXByb2NfY3JlYXRlKCJ2ZXJzaW9uIiwgU19JUlVHTywgdG9zaGliYV9wcm9jX2RpciwgJnZlcnNpb25fcHJvY19mb3BzKTsKKwlpZiAoZGV2LT5iYWNrbGlnaHRfZGV2KQorCQlwcm9jX2NyZWF0ZV9kYXRhKCJsY2QiLCBTX0lSVUdPIHwgU19JV1VTUiwgdG9zaGliYV9wcm9jX2RpciwKKwkJCQkgJmxjZF9wcm9jX2ZvcHMsIGRldik7CisJaWYgKGRldi0+dmlkZW9fc3VwcG9ydGVkKQorCQlwcm9jX2NyZWF0ZV9kYXRhKCJ2aWRlbyIsIFNfSVJVR08gfCBTX0lXVVNSLCB0b3NoaWJhX3Byb2NfZGlyLAorCQkJCSAmdmlkZW9fcHJvY19mb3BzLCBkZXYpOworCWlmIChkZXYtPmZhbl9zdXBwb3J0ZWQpCisJCXByb2NfY3JlYXRlX2RhdGEoImZhbiIsIFNfSVJVR08gfCBTX0lXVVNSLCB0b3NoaWJhX3Byb2NfZGlyLAorCQkJCSAmZmFuX3Byb2NfZm9wcywgZGV2KTsKKwlpZiAoZGV2LT5ob3RrZXlfZGV2KQorCQlwcm9jX2NyZWF0ZV9kYXRhKCJrZXlzIiwgU19JUlVHTyB8IFNfSVdVU1IsIHRvc2hpYmFfcHJvY19kaXIsCisJCQkJICZrZXlzX3Byb2NfZm9wcywgZGV2KTsKKwlwcm9jX2NyZWF0ZV9kYXRhKCJ2ZXJzaW9uIiwgU19JUlVHTywgdG9zaGliYV9wcm9jX2RpciwKKwkJCSAmdmVyc2lvbl9wcm9jX2ZvcHMsIGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIHJlbW92ZV90b3NoaWJhX3Byb2NfZW50cmllcyh2b2lkKQorc3RhdGljIHZvaWQgcmVtb3ZlX3Rvc2hpYmFfcHJvY19lbnRyaWVzKHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYpCiB7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImxjZCIsIHRvc2hpYmFfcHJvY19kaXIpOwotCXJlbW92ZV9wcm9jX2VudHJ5KCJ2aWRlbyIsIHRvc2hpYmFfcHJvY19kaXIpOwotCXJlbW92ZV9wcm9jX2VudHJ5KCJmYW4iLCB0b3NoaWJhX3Byb2NfZGlyKTsKLQlyZW1vdmVfcHJvY19lbnRyeSgia2V5cyIsIHRvc2hpYmFfcHJvY19kaXIpOworCWlmIChkZXYtPmJhY2tsaWdodF9kZXYpCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJsY2QiLCB0b3NoaWJhX3Byb2NfZGlyKTsKKwlpZiAoZGV2LT52aWRlb19zdXBwb3J0ZWQpCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJ2aWRlbyIsIHRvc2hpYmFfcHJvY19kaXIpOworCWlmIChkZXYtPmZhbl9zdXBwb3J0ZWQpCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJmYW4iLCB0b3NoaWJhX3Byb2NfZGlyKTsKKwlpZiAoZGV2LT5ob3RrZXlfZGV2KQorCQlyZW1vdmVfcHJvY19lbnRyeSgia2V5cyIsIHRvc2hpYmFfcHJvY19kaXIpOwogCXJlbW92ZV9wcm9jX2VudHJ5KCJ2ZXJzaW9uIiwgdG9zaGliYV9wcm9jX2Rpcik7CiB9CiAKQEAgLTg0MywxNCArODQ2LDE5NyBAQAogICAgICAgICAudXBkYXRlX3N0YXR1cyAgPSBzZXRfbGNkX3N0YXR1cywKIH07CiAKLXN0YXRpYyB2b2lkIHRvc2hpYmFfYWNwaV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmNvbnRleHQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0b3NoaWJhX2FjcGlfc2V0dXBfa2V5Ym9hcmQoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldikKIHsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IGVycm9yOworCisJZGV2LT5ob3RrZXlfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFkZXYtPmhvdGtleV9kZXYpIHsKKwkJcHJfaW5mbygiVW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldi0+aG90a2V5X2Rldi0+bmFtZSA9ICJUb3NoaWJhIGlucHV0IGRldmljZSI7CisJZGV2LT5ob3RrZXlfZGV2LT5waHlzID0gInRvc2hpYmFfYWNwaS9pbnB1dDAiOworCWRldi0+aG90a2V5X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCisJZXJyb3IgPSBzcGFyc2Vfa2V5bWFwX3NldHVwKGRldi0+aG90a2V5X2RldiwgdG9zaGliYV9hY3BpX2tleW1hcCwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldi0+YWNwaV9kZXYtPmhhbmRsZSwgIkVOQUIiLCBOVUxMLCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJfaW5mbygiVW5hYmxlIHRvIGVuYWJsZSBob3RrZXlzXG4iKTsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGVycl9mcmVlX2tleW1hcDsKKwl9CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShkZXYtPmhvdGtleV9kZXYpOworCWlmIChlcnJvcikgeworCQlwcl9pbmZvKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9rZXltYXA7CisJfQorCisJcmV0dXJuIDA7CisKKyBlcnJfZnJlZV9rZXltYXA6CisJc3BhcnNlX2tleW1hcF9mcmVlKGRldi0+aG90a2V5X2Rldik7CisgZXJyX2ZyZWVfZGV2OgorCWlucHV0X2ZyZWVfZGV2aWNlKGRldi0+aG90a2V5X2Rldik7CisJZGV2LT5ob3RrZXlfZGV2ID0gTlVMTDsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgdG9zaGliYV9hY3BpX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gYWNwaV9kcml2ZXJfZGF0YShhY3BpX2Rldik7CisKKwlyZW1vdmVfdG9zaGliYV9wcm9jX2VudHJpZXMoZGV2KTsKKworCWlmIChkZXYtPmhvdGtleV9kZXYpIHsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5ob3RrZXlfZGV2KTsKKwkJc3BhcnNlX2tleW1hcF9mcmVlKGRldi0+aG90a2V5X2Rldik7CisJfQorCisJaWYgKGRldi0+YnRfcmZrKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKGRldi0+YnRfcmZrKTsKKwkJcmZraWxsX2Rlc3Ryb3koZGV2LT5idF9yZmspOworCX0KKworCWlmIChkZXYtPmJhY2tsaWdodF9kZXYpCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihkZXYtPmJhY2tsaWdodF9kZXYpOworCisJaWYgKGRldi0+aWxsdW1pbmF0aW9uX3N1cHBvcnRlZCkKKwkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmRldi0+bGVkX2Rldik7CisKKwlrZnJlZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogX19kZXZpbml0IGZpbmRfaGNpX21ldGhvZChhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIGhjaV9oYW5kbGU7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiR0hDSSIsICZoY2lfaGFuZGxlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiAiR0hDSSI7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiU1BGQyIsICZoY2lfaGFuZGxlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiAiU1BGQyI7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdG9zaGliYV9hY3BpX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2KQoreworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXY7CisJY29uc3QgY2hhciAqaGNpX21ldGhvZDsKKwl1MzIgaGNpX3Jlc3VsdDsKKwl1MzIgZHVtbXk7CisJYm9vbCBidF9wcmVzZW50OworCWludCByZXQgPSAwOworCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKKworCXByX2luZm8oIlRvc2hpYmEgTGFwdG9wIEFDUEkgRXh0cmFzIHZlcnNpb24gJXNcbiIsCisJICAgICAgIFRPU0hJQkFfQUNQSV9WRVJTSU9OKTsKKworCWhjaV9tZXRob2QgPSBmaW5kX2hjaV9tZXRob2QoYWNwaV9kZXYtPmhhbmRsZSk7CisJaWYgKCFoY2lfbWV0aG9kKSB7CisJCXByX2VycigiSENJIGludGVyZmFjZSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCWRldi0+YWNwaV9kZXYgPSBhY3BpX2RldjsKKwlkZXYtPm1ldGhvZF9oY2kgPSBoY2lfbWV0aG9kOworCWFjcGlfZGV2LT5kcml2ZXJfZGF0YSA9IGRldjsKKworCWlmICh0b3NoaWJhX2FjcGlfc2V0dXBfa2V5Ym9hcmQoZGV2KSkKKwkJcHJfaW5mbygiVW5hYmxlIHRvIGFjdGl2YXRlIGhvdGtleXNcbiIpOworCisJbXV0ZXhfaW5pdCgmZGV2LT5tdXRleCk7CisKKwkvKiBlbmFibGUgZXZlbnQgZmlmbyAqLworCWhjaV93cml0ZTEoZGV2LCBIQ0lfU1lTVEVNX0VWRU5ULCAxLCAmaGNpX3Jlc3VsdCk7CisKKwlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1BMQVRGT1JNOworCXByb3BzLm1heF9icmlnaHRuZXNzID0gSENJX0xDRF9CUklHSFRORVNTX0xFVkVMUyAtIDE7CisJZGV2LT5iYWNrbGlnaHRfZGV2ID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigidG9zaGliYSIsCisJCQkJCQkgICAgICAgJmFjcGlfZGV2LT5kZXYsCisJCQkJCQkgICAgICAgZGV2LAorCQkJCQkJICAgICAgICZ0b3NoaWJhX2JhY2tsaWdodF9kYXRhLAorCQkJCQkJICAgICAgICZwcm9wcyk7CisJaWYgKElTX0VSUihkZXYtPmJhY2tsaWdodF9kZXYpKSB7CisJCXJldCA9IFBUUl9FUlIoZGV2LT5iYWNrbGlnaHRfZGV2KTsKKworCQlwcl9lcnIoIkNvdWxkIG5vdCByZWdpc3RlciB0b3NoaWJhIGJhY2tsaWdodCBkZXZpY2VcbiIpOworCQlkZXYtPmJhY2tsaWdodF9kZXYgPSBOVUxMOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmJhY2tsaWdodF9kZXYtPnByb3BzLmJyaWdodG5lc3MgPSBnZXRfbGNkKGRldi0+YmFja2xpZ2h0X2Rldik7CisKKwkvKiBSZWdpc3RlciByZmtpbGwgc3dpdGNoIGZvciBCbHVldG9vdGggKi8KKwlpZiAoaGNpX2dldF9idF9wcmVzZW50KGRldiwgJmJ0X3ByZXNlbnQpID09IEhDSV9TVUNDRVNTICYmIGJ0X3ByZXNlbnQpIHsKKwkJZGV2LT5idF9yZmsgPSByZmtpbGxfYWxsb2MoIlRvc2hpYmEgQmx1ZXRvb3RoIiwKKwkJCQkJICAgJmFjcGlfZGV2LT5kZXYsCisJCQkJCSAgIFJGS0lMTF9UWVBFX0JMVUVUT09USCwKKwkJCQkJICAgJnRvc2hpYmFfcmZrX29wcywKKwkJCQkJICAgZGV2KTsKKwkJaWYgKCFkZXYtPmJ0X3JmaykgeworCQkJcHJfZXJyKCJ1bmFibGUgdG8gYWxsb2NhdGUgcmZraWxsIGRldmljZVxuIik7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXJldCA9IHJma2lsbF9yZWdpc3RlcihkZXYtPmJ0X3Jmayk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigidW5hYmxlIHRvIHJlZ2lzdGVyIHJma2lsbCBkZXZpY2VcbiIpOworCQkJcmZraWxsX2Rlc3Ryb3koZGV2LT5idF9yZmspOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCWlmICh0b3NoaWJhX2lsbHVtaW5hdGlvbl9hdmFpbGFibGUoZGV2KSkgeworCQlkZXYtPmxlZF9kZXYubmFtZSA9ICJ0b3NoaWJhOjppbGx1bWluYXRpb24iOworCQlkZXYtPmxlZF9kZXYubWF4X2JyaWdodG5lc3MgPSAxOworCQlkZXYtPmxlZF9kZXYuYnJpZ2h0bmVzc19zZXQgPSB0b3NoaWJhX2lsbHVtaW5hdGlvbl9zZXQ7CisJCWRldi0+bGVkX2Rldi5icmlnaHRuZXNzX2dldCA9IHRvc2hpYmFfaWxsdW1pbmF0aW9uX2dldDsKKwkJaWYgKCFsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJmFjcGlfZGV2LT5kZXYsICZkZXYtPmxlZF9kZXYpKQorCQkJZGV2LT5pbGx1bWluYXRpb25fc3VwcG9ydGVkID0gMTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgQklPUyBzdXBwb3J0cyBmYW4gYW5kIHZpZGVvIGludGVyZmFjZXMgKi8KKworCXJldCA9IGdldF92aWRlb19zdGF0dXMoZGV2LCAmZHVtbXkpOworCWRldi0+dmlkZW9fc3VwcG9ydGVkID0gIXJldDsKKworCXJldCA9IGdldF9mYW5fc3RhdHVzKGRldiwgJmR1bW15KTsKKwlkZXYtPmZhbl9zdXBwb3J0ZWQgPSAhcmV0OworCisJY3JlYXRlX3Rvc2hpYmFfcHJvY19lbnRyaWVzKGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJdG9zaGliYV9hY3BpX3JlbW92ZShhY3BpX2RldiwgMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdG9zaGliYV9hY3BpX25vdGlmeShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2LCB1MzIgZXZlbnQpCit7CisJc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiA9IGFjcGlfZHJpdmVyX2RhdGEoYWNwaV9kZXYpOwogCXUzMiBoY2lfcmVzdWx0LCB2YWx1ZTsKIAogCWlmIChldmVudCAhPSAweDgwKQogCQlyZXR1cm47CiAJZG8gewotCQloY2lfcmVhZDEoSENJX1NZU1RFTV9FVkVOVCwgJnZhbHVlLCAmaGNpX3Jlc3VsdCk7CisJCWhjaV9yZWFkMShkZXYsIEhDSV9TWVNURU1fRVZFTlQsICZ2YWx1ZSwgJmhjaV9yZXN1bHQpOwogCQlpZiAoaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUykgewogCQkJaWYgKHZhbHVlID09IDB4MTAwKQogCQkJCWNvbnRpbnVlOwpAQCAtODU4LDcgKzEwNDQsNyBAQAogCQkJaWYgKHZhbHVlICYgMHg4MCkKIAkJCQljb250aW51ZTsKIAotCQkJaWYgKCFzcGFyc2Vfa2V5bWFwX3JlcG9ydF9ldmVudCh0b3NoaWJhX2FjcGkuaG90a2V5X2RldiwKKwkJCWlmICghc3BhcnNlX2tleW1hcF9yZXBvcnRfZXZlbnQoZGV2LT5ob3RrZXlfZGV2LAogCQkJCQkJCXZhbHVlLCAxLCB0cnVlKSkgewogCQkJCXByX2luZm8oIlVua25vd24ga2V5ICV4XG4iLAogCQkJCSAgICAgICB2YWx1ZSk7CkBAIC04NjcsMjAwICsxMDUzLDQ5IEBACiAJCQkvKiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgYW4gdW5yZXNvbHZlZCBpc3N1ZSBvbgogCQkJICogc29tZSBtYWNoaW5lcyB3aGVyZSBzeXN0ZW0gZXZlbnRzIHNwb3JhZGljYWxseQogCQkJICogYmVjb21lIGRpc2FibGVkLiAqLwotCQkJaGNpX3dyaXRlMShIQ0lfU1lTVEVNX0VWRU5ULCAxLCAmaGNpX3Jlc3VsdCk7CisJCQloY2lfd3JpdGUxKGRldiwgSENJX1NZU1RFTV9FVkVOVCwgMSwgJmhjaV9yZXN1bHQpOwogCQkJcHJfbm90aWNlKCJSZS1lbmFibGVkIGhvdGtleXNcbiIpOwogCQl9CiAJfSB3aGlsZSAoaGNpX3Jlc3VsdCAhPSBIQ0lfRU1QVFkpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCB0b3NoaWJhX2FjcGlfc2V0dXBfa2V5Ym9hcmQoY2hhciAqZGV2aWNlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlpbnQgZXJyb3I7CiAKLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoTlVMTCwgZGV2aWNlLCAmdG9zaGliYV9hY3BpLmhhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBnZXQgbm90aWZpY2F0aW9uIGRldmljZVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCF0b3NoaWJhX2FjcGkuaG90a2V5X2RldikgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdG9zaGliYV9hY3BpLmhvdGtleV9kZXYtPm5hbWUgPSAiVG9zaGliYSBpbnB1dCBkZXZpY2UiOwotCXRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2LT5waHlzID0gZGV2aWNlOwotCXRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7Ci0KLQllcnJvciA9IHNwYXJzZV9rZXltYXBfc2V0dXAodG9zaGliYV9hY3BpLmhvdGtleV9kZXYsCi0JCQkJICAgIHRvc2hpYmFfYWNwaV9rZXltYXAsIE5VTEwpOwotCWlmIChlcnJvcikKLQkJZ290byBlcnJfZnJlZV9kZXY7Ci0KLQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIodG9zaGliYV9hY3BpLmhhbmRsZSwKLQkJCQlBQ1BJX0RFVklDRV9OT1RJRlksIHRvc2hpYmFfYWNwaV9ub3RpZnksIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gaW5zdGFsbCBob3RrZXkgbm90aWZpY2F0aW9uXG4iKTsKLQkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIGVycl9mcmVlX2tleW1hcDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCh0b3NoaWJhX2FjcGkuaGFuZGxlLCAiRU5BQiIsIE5VTEwsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gZW5hYmxlIGhvdGtleXNcbiIpOwotCQllcnJvciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX3JlbW92ZV9ub3RpZnk7Ci0JfQotCi0JZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodG9zaGliYV9hY3BpLmhvdGtleV9kZXYpOwotCWlmIChlcnJvcikgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKLQkJZ290byBlcnJfcmVtb3ZlX25vdGlmeTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotIGVycl9yZW1vdmVfbm90aWZ5OgotCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKHRvc2hpYmFfYWNwaS5oYW5kbGUsCi0JCQkJICAgQUNQSV9ERVZJQ0VfTk9USUZZLCB0b3NoaWJhX2FjcGlfbm90aWZ5KTsKLSBlcnJfZnJlZV9rZXltYXA6Ci0Jc3BhcnNlX2tleW1hcF9mcmVlKHRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2KTsKLSBlcnJfZnJlZV9kZXY6Ci0JaW5wdXRfZnJlZV9kZXZpY2UodG9zaGliYV9hY3BpLmhvdGtleV9kZXYpOwotCXRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2ID0gTlVMTDsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB2b2lkIHRvc2hpYmFfYWNwaV9leGl0KHZvaWQpCi17Ci0JaWYgKHRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2KSB7Ci0JCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKHRvc2hpYmFfYWNwaS5oYW5kbGUsCi0JCQkJQUNQSV9ERVZJQ0VfTk9USUZZLCB0b3NoaWJhX2FjcGlfbm90aWZ5KTsKLQkJc3BhcnNlX2tleW1hcF9mcmVlKHRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2KTsKLQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodG9zaGliYV9hY3BpLmhvdGtleV9kZXYpOwotCX0KLQotCWlmICh0b3NoaWJhX2FjcGkuYnRfcmZrKSB7Ci0JCXJma2lsbF91bnJlZ2lzdGVyKHRvc2hpYmFfYWNwaS5idF9yZmspOwotCQlyZmtpbGxfZGVzdHJveSh0b3NoaWJhX2FjcGkuYnRfcmZrKTsKLQl9Ci0KLQlpZiAodG9zaGliYV9iYWNrbGlnaHRfZGV2aWNlKQotCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIodG9zaGliYV9iYWNrbGlnaHRfZGV2aWNlKTsKLQotCXJlbW92ZV90b3NoaWJhX3Byb2NfZW50cmllcygpOwotCi0JaWYgKHRvc2hpYmFfcHJvY19kaXIpCi0JCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfVE9TSElCQSwgYWNwaV9yb290X2Rpcik7Ci0KLQlpZiAodG9zaGliYV9hY3BpLmlsbHVtaW5hdGlvbl9pbnN0YWxsZWQpCi0JCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZ0b3NoaWJhX2xlZCk7Ci0KLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0b3NoaWJhX2FjcGkucF9kZXYpOwotCi0JcmV0dXJuOwotfQorc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciB0b3NoaWJhX2FjcGlfZHJpdmVyID0geworCS5uYW1lCT0gIlRvc2hpYmEgQUNQSSBkcml2ZXIiLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5pZHMJPSB0b3NoaWJhX2RldmljZV9pZHMsCisJLmZsYWdzCT0gQUNQSV9EUklWRVJfQUxMX05PVElGWV9FVkVOVFMsCisJLm9wcwk9IHsKKwkJLmFkZAkJPSB0b3NoaWJhX2FjcGlfYWRkLAorCQkucmVtb3ZlCQk9IHRvc2hpYmFfYWNwaV9yZW1vdmUsCisJCS5ub3RpZnkJCT0gdG9zaGliYV9hY3BpX25vdGlmeSwKKwl9LAorfTsKIAogc3RhdGljIGludCBfX2luaXQgdG9zaGliYV9hY3BpX2luaXQodm9pZCkKIHsKLQl1MzIgaGNpX3Jlc3VsdDsKLQlib29sIGJ0X3ByZXNlbnQ7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOwotCi0JaWYgKGFjcGlfZGlzYWJsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogc2ltcGxlIGRldmljZSBkZXRlY3Rpb246IGxvb2sgZm9yIEhDSSBtZXRob2QgKi8KLQlpZiAoaXNfdmFsaWRfYWNwaV9wYXRoKFRPU0hfSU5URVJGQUNFXzEgR0hDSV9NRVRIT0QpKSB7Ci0JCW1ldGhvZF9oY2kgPSBUT1NIX0lOVEVSRkFDRV8xIEdIQ0lfTUVUSE9EOwotCQlpZiAodG9zaGliYV9hY3BpX3NldHVwX2tleWJvYXJkKFRPU0hfSU5URVJGQUNFXzEpKQotCQkJcHJfaW5mbygiVW5hYmxlIHRvIGFjdGl2YXRlIGhvdGtleXNcbiIpOwotCX0gZWxzZSBpZiAoaXNfdmFsaWRfYWNwaV9wYXRoKFRPU0hfSU5URVJGQUNFXzIgR0hDSV9NRVRIT0QpKSB7Ci0JCW1ldGhvZF9oY2kgPSBUT1NIX0lOVEVSRkFDRV8yIEdIQ0lfTUVUSE9EOwotCQlpZiAodG9zaGliYV9hY3BpX3NldHVwX2tleWJvYXJkKFRPU0hfSU5URVJGQUNFXzIpKQotCQkJcHJfaW5mbygiVW5hYmxlIHRvIGFjdGl2YXRlIGhvdGtleXNcbiIpOwotCX0gZWxzZQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXByX2luZm8oIlRvc2hpYmEgTGFwdG9wIEFDUEkgRXh0cmFzIHZlcnNpb24gJXNcbiIsCi0JICAgICAgIFRPU0hJQkFfQUNQSV9WRVJTSU9OKTsKLQlwcl9pbmZvKCIgICAgSENJIG1ldGhvZDogJXNcbiIsIG1ldGhvZF9oY2kpOwotCi0JbXV0ZXhfaW5pdCgmdG9zaGliYV9hY3BpLm11dGV4KTsKLQotCXRvc2hpYmFfYWNwaS5wX2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInRvc2hpYmFfYWNwaSIsCi0JCQkJCQkJICAgICAgLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIodG9zaGliYV9hY3BpLnBfZGV2KSkgewotCQlyZXQgPSBQVFJfRVJSKHRvc2hpYmFfYWNwaS5wX2Rldik7Ci0JCXByX2VycigidW5hYmxlIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRldmljZVxuIik7Ci0JCXRvc2hpYmFfYWNwaS5wX2RldiA9IE5VTEw7Ci0JCXRvc2hpYmFfYWNwaV9leGl0KCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZm9yY2VfZmFuID0gMDsKLQlrZXlfZXZlbnRfdmFsaWQgPSAwOwotCi0JLyogZW5hYmxlIGV2ZW50IGZpZm8gKi8KLQloY2lfd3JpdGUxKEhDSV9TWVNURU1fRVZFTlQsIDEsICZoY2lfcmVzdWx0KTsKKwlpbnQgcmV0OwogCiAJdG9zaGliYV9wcm9jX2RpciA9IHByb2NfbWtkaXIoUFJPQ19UT1NISUJBLCBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoIXRvc2hpYmFfcHJvY19kaXIpIHsKLQkJdG9zaGliYV9hY3BpX2V4aXQoKTsKKwkJcHJfZXJyKCJVbmFibGUgdG8gY3JlYXRlIHByb2MgZGlyICIgUFJPQ19UT1NISUJBICJcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UgewotCQljcmVhdGVfdG9zaGliYV9wcm9jX2VudHJpZXMoKTsKIAl9CiAKLQlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1BMQVRGT1JNOwotCXByb3BzLm1heF9icmlnaHRuZXNzID0gSENJX0xDRF9CUklHSFRORVNTX0xFVkVMUyAtIDE7Ci0JdG9zaGliYV9iYWNrbGlnaHRfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigidG9zaGliYSIsCi0JCQkJCQkJICAgICAmdG9zaGliYV9hY3BpLnBfZGV2LT5kZXYsCi0JCQkJCQkJICAgICBOVUxMLAotCQkJCQkJCSAgICAgJnRvc2hpYmFfYmFja2xpZ2h0X2RhdGEsCi0JCQkJCQkJICAgICAmcHJvcHMpOwotICAgICAgICBpZiAoSVNfRVJSKHRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSkpIHsKLQkJcmV0ID0gUFRSX0VSUih0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2UpOwotCi0JCXByX2VycigiQ291bGQgbm90IHJlZ2lzdGVyIHRvc2hpYmEgYmFja2xpZ2h0IGRldmljZVxuIik7Ci0JCXRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7Ci0JCXRvc2hpYmFfYWNwaV9leGl0KCk7Ci0JCXJldHVybiByZXQ7CisJcmV0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZ0b3NoaWJhX2FjcGlfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIEFDUEkgZHJpdmVyOiAlZFxuIiwgcmV0KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19UT1NISUJBLCBhY3BpX3Jvb3RfZGlyKTsKIAl9CiAKLQkvKiBSZWdpc3RlciByZmtpbGwgc3dpdGNoIGZvciBCbHVldG9vdGggKi8KLQlpZiAoaGNpX2dldF9idF9wcmVzZW50KCZidF9wcmVzZW50KSA9PSBIQ0lfU1VDQ0VTUyAmJiBidF9wcmVzZW50KSB7Ci0JCXRvc2hpYmFfYWNwaS5idF9yZmsgPSByZmtpbGxfYWxsb2ModG9zaGliYV9hY3BpLmJ0X25hbWUsCi0JCQkJCQkgICAmdG9zaGliYV9hY3BpLnBfZGV2LT5kZXYsCi0JCQkJCQkgICBSRktJTExfVFlQRV9CTFVFVE9PVEgsCi0JCQkJCQkgICAmdG9zaGliYV9yZmtfb3BzLAotCQkJCQkJICAgJnRvc2hpYmFfYWNwaSk7Ci0JCWlmICghdG9zaGliYV9hY3BpLmJ0X3JmaykgewotCQkJcHJfZXJyKCJ1bmFibGUgdG8gYWxsb2NhdGUgcmZraWxsIGRldmljZVxuIik7Ci0JCQl0b3NoaWJhX2FjcGlfZXhpdCgpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KKwlyZXR1cm4gcmV0OworfQogCi0JCXJldCA9IHJma2lsbF9yZWdpc3Rlcih0b3NoaWJhX2FjcGkuYnRfcmZrKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCJ1bmFibGUgdG8gcmVnaXN0ZXIgcmZraWxsIGRldmljZVxuIik7Ci0JCQlyZmtpbGxfZGVzdHJveSh0b3NoaWJhX2FjcGkuYnRfcmZrKTsKLQkJCXRvc2hpYmFfYWNwaV9leGl0KCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JdG9zaGliYV9hY3BpLmlsbHVtaW5hdGlvbl9pbnN0YWxsZWQgPSAwOwotCWlmICh0b3NoaWJhX2lsbHVtaW5hdGlvbl9hdmFpbGFibGUoKSkgewotCQlpZiAoIWxlZF9jbGFzc2Rldl9yZWdpc3RlcigmKHRvc2hpYmFfYWNwaS5wX2Rldi0+ZGV2KSwKLQkJCQkJICAgJnRvc2hpYmFfbGVkKSkKLQkJCXRvc2hpYmFfYWNwaS5pbGx1bWluYXRpb25faW5zdGFsbGVkID0gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKK3N0YXRpYyB2b2lkIF9fZXhpdCB0b3NoaWJhX2FjcGlfZXhpdCh2b2lkKQoreworCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZ0b3NoaWJhX2FjcGlfZHJpdmVyKTsKKwlpZiAodG9zaGliYV9wcm9jX2RpcikKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19UT1NISUJBLCBhY3BpX3Jvb3RfZGlyKTsKIH0KIAogbW9kdWxlX2luaXQodG9zaGliYV9hY3BpX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwppbmRleCBmMjNkNWE4Li5hMTM0YzI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCkBAIC03NTQsOSArNzU1LDEzIEBACiAJc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrLCAqbmV4dDsKIAogCS8qIERlbGV0ZSBkZXZpY2VzIGZvciBhbGwgdGhlIEdVSURzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdibG9jaywgbmV4dCwgJndtaV9ibG9ja19saXN0LCBsaXN0KQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YmxvY2ssIG5leHQsICZ3bWlfYmxvY2tfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmd2Jsb2NrLT5saXN0KTsKIAkJaWYgKHdibG9jay0+ZGV2LmNsYXNzKQogCQkJZGV2aWNlX3VucmVnaXN0ZXIoJndibG9jay0+ZGV2KTsKKwkJZWxzZQorCQkJa2ZyZWUod2Jsb2NrKTsKKwl9CiB9CiAKIHN0YXRpYyBib29sIGd1aWRfYWxyZWFkeV9wYXJzZWQoY29uc3QgY2hhciAqZ3VpZF9zdHJpbmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCmluZGV4IGNhODRkNTAuLmIwMGMxNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKaW5kZXggYmJmM2VkZC4uNWJlNGEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwpAQCAtNTA5LDE1ICs1MDksMTIgQEAKIAkJCQkJICAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSAqcCkKIHsKIAlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyIG1hcCA9IDAsIGZsYWdzID0gMDsKLQotCWlmIChwLT5jaGFubmVsX2NvdW50ID09IDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CisJdW5zaWduZWQgY2hhciBtYXAgPSAwLCBmbGFnczsKIAogCWZvciAoaSA9IDA7IGkgPCBwLT5jaGFubmVsX2NvdW50OyBpKyspCiAJCW1hcCB8PSAxIDw8IHAtPmNoYW5uZWxzW2ldOwogCi0JZmxhZ3MgfD0gZG1hX2ZsYWdzKGRldiwgcC0+dHlwZSwgcC0+YnVzX21hc3RlciwgcC0+dHJhbnNmZXIpOworCWZsYWdzID0gZG1hX2ZsYWdzKGRldiwgcC0+dHlwZSwgcC0+YnVzX21hc3RlciwgcC0+dHJhbnNmZXIpOwogCXBucF9yZWdpc3Rlcl9kbWFfcmVzb3VyY2UoZGV2LCBvcHRpb25fZmxhZ3MsIG1hcCwgZmxhZ3MpOwogfQogCkBAIC01MjcsMTcgKzUyNCwxNCBAQAogewogCWludCBpOwogCXBucF9pcnFfbWFza190IG1hcDsKLQl1bnNpZ25lZCBjaGFyIGZsYWdzID0gMDsKLQotCWlmIChwLT5pbnRlcnJ1cHRfY291bnQgPT0gMCkKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOwogCiAJYml0bWFwX3plcm8obWFwLmJpdHMsIFBOUF9JUlFfTlIpOwogCWZvciAoaSA9IDA7IGkgPCBwLT5pbnRlcnJ1cHRfY291bnQ7IGkrKykKIAkJaWYgKHAtPmludGVycnVwdHNbaV0pCiAJCQlfX3NldF9iaXQocC0+aW50ZXJydXB0c1tpXSwgbWFwLmJpdHMpOwogCi0JZmxhZ3MgfD0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5LCBwLT5zaGFyYWJsZSk7CisJZmxhZ3MgPSBpcnFfZmxhZ3MocC0+dHJpZ2dlcmluZywgcC0+cG9sYXJpdHksIHAtPnNoYXJhYmxlKTsKIAlwbnBfcmVnaXN0ZXJfaXJxX3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCAmbWFwLCBmbGFncyk7CiB9CiAKQEAgLTU0NywxMCArNTQxLDcgQEAKIHsKIAlpbnQgaTsKIAlwbnBfaXJxX21hc2tfdCBtYXA7Ci0JdW5zaWduZWQgY2hhciBmbGFncyA9IDA7Ci0KLQlpZiAocC0+aW50ZXJydXB0X2NvdW50ID09IDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CisJdW5zaWduZWQgY2hhciBmbGFnczsKIAogCWJpdG1hcF96ZXJvKG1hcC5iaXRzLCBQTlBfSVJRX05SKTsKIAlmb3IgKGkgPSAwOyBpIDwgcC0+aW50ZXJydXB0X2NvdW50OyBpKyspIHsKQEAgLTU2NCw3ICs1NTUsNyBAQAogCQl9CiAJfQogCi0JZmxhZ3MgfD0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5LCBwLT5zaGFyYWJsZSk7CisJZmxhZ3MgPSBpcnFfZmxhZ3MocC0+dHJpZ2dlcmluZywgcC0+cG9sYXJpdHksIHAtPnNoYXJhYmxlKTsKIAlwbnBfcmVnaXN0ZXJfaXJxX3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCAmbWFwLCBmbGFncyk7CiB9CiAKQEAgLTU3NCwxMSArNTY1LDggQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGZsYWdzID0gMDsKIAotCWlmIChpby0+YWRkcmVzc19sZW5ndGggPT0gMCkKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKLQogCWlmIChpby0+aW9fZGVjb2RlID09IEFDUElfREVDT0RFXzE2KQotCQlmbGFncyB8PSBJT1JFU09VUkNFX0lPXzE2QklUX0FERFI7CisJCWZsYWdzID0gSU9SRVNPVVJDRV9JT18xNkJJVF9BRERSOwogCXBucF9yZWdpc3Rlcl9wb3J0X3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCBpby0+bWluaW11bSwgaW8tPm1heGltdW0sCiAJCQkJICAgaW8tPmFsaWdubWVudCwgaW8tPmFkZHJlc3NfbGVuZ3RoLCBmbGFncyk7CiB9CkBAIC01ODcsMTMgKzU3NSw4IEBACiAJCQkJCXVuc2lnbmVkIGludCBvcHRpb25fZmxhZ3MsCiAJCQkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICppbykKIHsKLQl1bnNpZ25lZCBjaGFyIGZsYWdzID0gMDsKLQotCWlmIChpby0+YWRkcmVzc19sZW5ndGggPT0gMCkKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKLQogCXBucF9yZWdpc3Rlcl9wb3J0X3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCBpby0+YWRkcmVzcywgaW8tPmFkZHJlc3MsCi0JCQkJICAgMCwgaW8tPmFkZHJlc3NfbGVuZ3RoLCBmbGFncyB8IElPUkVTT1VSQ0VfSU9fRklYRUQpOworCQkJCSAgIDAsIGlvLT5hZGRyZXNzX2xlbmd0aCwgSU9SRVNPVVJDRV9JT19GSVhFRCk7CiB9CiAKIHN0YXRpYyBfX2luaXQgdm9pZCBwbnBhY3BpX3BhcnNlX21lbTI0X29wdGlvbihzdHJ1Y3QgcG5wX2RldiAqZGV2LApAQCAtNjAyLDExICs1ODUsOCBAQAogewogCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOwogCi0JaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7Ci0KIAlpZiAocC0+d3JpdGVfcHJvdGVjdCA9PSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKQotCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CisJCWZsYWdzID0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOwogCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2UoZGV2LCBvcHRpb25fZmxhZ3MsIHAtPm1pbmltdW0sIHAtPm1heGltdW0sCiAJCQkJICBwLT5hbGlnbm1lbnQsIHAtPmFkZHJlc3NfbGVuZ3RoLCBmbGFncyk7CiB9CkBAIC02MTcsMTEgKzU5Nyw4IEBACiB7CiAJdW5zaWduZWQgY2hhciBmbGFncyA9IDA7CiAKLQlpZiAocC0+YWRkcmVzc19sZW5ndGggPT0gMCkKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKLQogCWlmIChwLT53cml0ZV9wcm90ZWN0ID09IEFDUElfUkVBRF9XUklURV9NRU1PUlkpCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRTsKKwkJZmxhZ3MgPSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CiAJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgcC0+bWluaW11bSwgcC0+bWF4aW11bSwKIAkJCQkgIHAtPmFsaWdubWVudCwgcC0+YWRkcmVzc19sZW5ndGgsIGZsYWdzKTsKIH0KQEAgLTYzMiwxMSArNjA5LDggQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGZsYWdzID0gMDsKIAotCWlmIChwLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQotCQlmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOwotCiAJaWYgKHAtPndyaXRlX3Byb3RlY3QgPT0gQUNQSV9SRUFEX1dSSVRFX01FTU9SWSkKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOworCQlmbGFncyA9IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRTsKIAlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCBwLT5hZGRyZXNzLCBwLT5hZGRyZXNzLAogCQkJCSAgMCwgcC0+YWRkcmVzc19sZW5ndGgsIGZsYWdzKTsKIH0KQEAgLTY1NiwxOSArNjMwLDE2IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAocC0+YWRkcmVzc19sZW5ndGggPT0gMCkKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKLQogCWlmIChwLT5yZXNvdXJjZV90eXBlID09IEFDUElfTUVNT1JZX1JBTkdFKSB7CiAJCWlmIChwLT5pbmZvLm1lbS53cml0ZV9wcm90ZWN0ID09IEFDUElfUkVBRF9XUklURV9NRU1PUlkpCi0JCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CisJCQlmbGFncyA9IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRTsKIAkJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgcC0+bWluaW11bSwKIAkJCQkJICBwLT5taW5pbXVtLCAwLCBwLT5hZGRyZXNzX2xlbmd0aCwKIAkJCQkJICBmbGFncyk7CiAJfSBlbHNlIGlmIChwLT5yZXNvdXJjZV90eXBlID09IEFDUElfSU9fUkFOR0UpCiAJCXBucF9yZWdpc3Rlcl9wb3J0X3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCBwLT5taW5pbXVtLAogCQkJCQkgICBwLT5taW5pbXVtLCAwLCBwLT5hZGRyZXNzX2xlbmd0aCwKLQkJCQkJICAgZmxhZ3MgfCBJT1JFU09VUkNFX0lPX0ZJWEVEKTsKKwkJCQkJICAgSU9SRVNPVVJDRV9JT19GSVhFRCk7CiB9CiAKIHN0YXRpYyBfX2luaXQgdm9pZCBwbnBhY3BpX3BhcnNlX2V4dF9hZGRyZXNzX29wdGlvbihzdHJ1Y3QgcG5wX2RldiAqZGV2LApAQCAtNjc4LDE5ICs2NDksMTYgQEAKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9hZGRyZXNzNjQgKnAgPSAmci0+ZGF0YS5leHRfYWRkcmVzczY0OwogCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOwogCi0JaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7Ci0KIAlpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgewogCQlpZiAocC0+aW5mby5tZW0ud3JpdGVfcHJvdGVjdCA9PSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKQotCQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOworCQkJZmxhZ3MgPSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CiAJCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2UoZGV2LCBvcHRpb25fZmxhZ3MsIHAtPm1pbmltdW0sCiAJCQkJCSAgcC0+bWluaW11bSwgMCwgcC0+YWRkcmVzc19sZW5ndGgsCiAJCQkJCSAgZmxhZ3MpOwogCX0gZWxzZSBpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKQogCQlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgcC0+bWluaW11bSwKIAkJCQkJICAgcC0+bWluaW11bSwgMCwgcC0+YWRkcmVzc19sZW5ndGgsCi0JCQkJCSAgIGZsYWdzIHwgSU9SRVNPVVJDRV9JT19GSVhFRCk7CisJCQkJCSAgIElPUkVTT1VSQ0VfSU9fRklYRUQpOwogfQogCiBzdHJ1Y3QgYWNwaXBucF9wYXJzZV9vcHRpb25fcyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL0tjb25maWcgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKaW5kZXggNTdkZTA1MS4uOWY4ODY0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcG93ZXIvS2NvbmZpZwpAQCAtNzAsNiArNzAsNyBAQAogCiBjb25maWcgQkFUVEVSWV9EUzI3ODAKIAl0cmlzdGF0ZSAiRFMyNzgwIGJhdHRlcnkgZHJpdmVyIgorCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJc2VsZWN0IFcxCiAJc2VsZWN0IFcxX1NMQVZFX0RTMjc4MAogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZHMyNzgwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvZHMyNzgwX2JhdHRlcnkuYwppbmRleCAxZmVmZTgyLi45MWE3ODNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2RzMjc4MF9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9kczI3ODBfYmF0dGVyeS5jCkBAIC0zOSw2ICszOSw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0OwogCXN0cnVjdCBkZXZpY2UgKncxX2RldjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm11dGV4X2hvbGRlcjsKIH07CiAKIGVudW0gY3VycmVudF90eXBlcyB7CkBAIC00OSw4ICs1MCw4IEBACiBzdGF0aWMgY29uc3QgY2hhciBtb2RlbFtdID0gIkRTMjc4MCI7CiBzdGF0aWMgY29uc3QgY2hhciBtYW51ZmFjdHVyZXJbXSA9ICJNYXhpbS9EYWxsYXMiOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKnRvX2RzMjc4MF9kZXZpY2VfaW5mbygKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKgordG9fZHMyNzgwX2RldmljZV9pbmZvKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbywgYmF0KTsKIH0KQEAgLTYwLDE3ICs2MSwyOCBAQAogCXJldHVybiBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3JlYWQ4KHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnZhbCwgaW50IGFkZHIpCitzdGF0aWMgaW5saW5lIGludCBkczI3ODBfYmF0dGVyeV9pbyhzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywKKwljaGFyICpidWYsIGludCBhZGRyLCBzaXplX3QgY291bnQsIGludCBpbykKIHsKLQlyZXR1cm4gdzFfZHMyNzgwX2lvKGRldiwgdmFsLCBhZGRyLCBzaXplb2YodTgpLCAwKTsKKwlpZiAoZGV2X2luZm8tPm11dGV4X2hvbGRlciA9PSBjdXJyZW50KQorCQlyZXR1cm4gdzFfZHMyNzgwX2lvX25vbG9jayhkZXZfaW5mby0+dzFfZGV2LCBidWYsIGFkZHIsIGNvdW50LCBpbyk7CisJZWxzZQorCQlyZXR1cm4gdzFfZHMyNzgwX2lvKGRldl9pbmZvLT53MV9kZXYsIGJ1ZiwgYWRkciwgY291bnQsIGlvKTsKIH0KIAotc3RhdGljIGludCBkczI3ODBfcmVhZDE2KHN0cnVjdCBkZXZpY2UgKmRldiwgczE2ICp2YWwsIGludCBhZGRyKQorc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3JlYWQ4KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCB1OCAqdmFsLAorCWludCBhZGRyKQoreworCXJldHVybiBkczI3ODBfYmF0dGVyeV9pbyhkZXZfaW5mbywgdmFsLCBhZGRyLCBzaXplb2YodTgpLCAwKTsKK30KKworc3RhdGljIGludCBkczI3ODBfcmVhZDE2KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCBzMTYgKnZhbCwKKwlpbnQgYWRkcikKIHsKIAlpbnQgcmV0OwogCXU4IHJhd1syXTsKIAotCXJldCA9IHcxX2RzMjc4MF9pbyhkZXYsIHJhdywgYWRkciwgc2l6ZW9mKHU4KSAqIDIsIDApOworCXJldCA9IGRzMjc4MF9iYXR0ZXJ5X2lvKGRldl9pbmZvLCByYXcsIGFkZHIsIHNpemVvZihyYXcpLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNzksMTYgKzkxLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRzMjc4MF9yZWFkX2Jsb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnZhbCwgaW50IGFkZHIsCi0Jc2l6ZV90IGNvdW50KQorc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3JlYWRfYmxvY2soc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCisJdTggKnZhbCwgaW50IGFkZHIsIHNpemVfdCBjb3VudCkKIHsKLQlyZXR1cm4gdzFfZHMyNzgwX2lvKGRldiwgdmFsLCBhZGRyLCBjb3VudCwgMCk7CisJcmV0dXJuIGRzMjc4MF9iYXR0ZXJ5X2lvKGRldl9pbmZvLCB2YWwsIGFkZHIsIGNvdW50LCAwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnZhbCwgaW50IGFkZHIsCi0Jc2l6ZV90IGNvdW50KQorc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3dyaXRlKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCB1OCAqdmFsLAorCWludCBhZGRyLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIHcxX2RzMjc4MF9pbyhkZXYsIHZhbCwgYWRkciwgY291bnQsIDEpOworCXJldHVybiBkczI3ODBfYmF0dGVyeV9pbyhkZXZfaW5mbywgdmFsLCBhZGRyLCBjb3VudCwgMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRzMjc4MF9zdG9yZV9lZXByb20oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgYWRkcikKQEAgLTEyMiw3ICsxMzQsNyBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8tPncxX2RldiwgJmNvbmR1Y3RhbmNlLAorCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mbywgJmNvbmR1Y3RhbmNlLAogCQkJCURTMjc4MF9SU05TUF9SRUcsIHNpemVvZih1OCkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtMTM0LDcgKzE0Niw3IEBACiBzdGF0aWMgaW50IGRzMjc4MF9nZXRfcnNnYWluX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAogCXUxNiAqcnNnYWluKQogewotCXJldHVybiBkczI3ODBfcmVhZDE2KGRldl9pbmZvLT53MV9kZXYsIHJzZ2FpbiwgRFMyNzgwX1JTR0FJTl9NU0JfUkVHKTsKKwlyZXR1cm4gZHMyNzgwX3JlYWQxNihkZXZfaW5mbywgcnNnYWluLCBEUzI3ODBfUlNHQUlOX01TQl9SRUcpOwogfQogCiAvKiBTZXQgUlNHQUlOIHZhbHVlIGZyb20gMCB0byAxLjk5OSBpbiBzdGVwcyBvZiAwLjAwMSAqLwpAQCAtMTQ0LDggKzE1Niw4IEBACiAJaW50IHJldDsKIAl1OCByYXdbXSA9IHtyc2dhaW4gPj4gOCwgcnNnYWluICYgMHhGRn07CiAKLQlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8tPncxX2RldiwgcmF3LAotCQkJCURTMjc4MF9SU0dBSU5fTVNCX1JFRywgc2l6ZW9mKHU4KSAqIDIpOworCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mbywgcmF3LAorCQkJCURTMjc4MF9SU0dBSU5fTVNCX1JFRywgc2l6ZW9mKHJhdykpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNjcsNyArMTc5LDcgQEAKIAkgKiBCaXRzIDIgLSAwIG9mIHRoZSB2b2x0YWdlIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSA1IG9mIHRoZQogCSAqIHZvbHRhZ2UgTFNCIHJlZ2lzdGVyCiAJICovCi0JcmV0ID0gZHMyNzgwX3JlYWQxNihkZXZfaW5mby0+dzFfZGV2LCAmdm9sdGFnZV9yYXcsCisJcmV0ID0gZHMyNzgwX3JlYWQxNihkZXZfaW5mbywgJnZvbHRhZ2VfcmF3LAogCQkJCURTMjc4MF9WT0xUX01TQl9SRUcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtMTk2LDcgKzIwOCw3IEBACiAJICogQml0cyAyIC0gMCBvZiB0aGUgdGVtcGVyYXR1cmUgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDUgb2YgdGhlCiAJICogdGVtcGVyYXR1cmUgTFNCIHJlZ2lzdGVyCiAJICovCi0JcmV0ID0gZHMyNzgwX3JlYWQxNihkZXZfaW5mby0+dzFfZGV2LCAmdGVtcGVyYXR1cmVfcmF3LAorCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8sICZ0ZW1wZXJhdHVyZV9yYXcsCiAJCQkJRFMyNzgwX1RFTVBfTVNCX1JFRyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0yMjIsMTMgKzIzNCwxMyBAQAogCSAqIFRoZSB1bml0cyBvZiBtZWFzdXJlbWVudCBmb3IgY3VycmVudCBhcmUgZGVwZW5kZW50IG9uIHRoZSB2YWx1ZSBvZgogCSAqIHRoZSBzZW5zZSByZXNpc3Rvci4KIAkgKi8KLQlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8tPncxX2RldiwgJnNlbnNlX3Jlc19yYXcsIERTMjc4MF9SU05TUF9SRUcpOworCXJldCA9IGRzMjc4MF9yZWFkOChkZXZfaW5mbywgJnNlbnNlX3Jlc19yYXcsIERTMjc4MF9SU05TUF9SRUcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHNlbnNlX3Jlc19yYXcgPT0gMCkgewogCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJzZW5zZSByZXNpc3RvciB2YWx1ZSBpcyAwXG4iKTsKLQkJcmV0dXJuIC1FTlhJTzsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXNlbnNlX3JlcyA9IDEwMDAgLyBzZW5zZV9yZXNfcmF3OwogCkBAIC0yNDgsNyArMjYwLDcgQEAKIAkgKiBCaXRzIDcgLSAwIG9mIHRoZSBjdXJyZW50IHZhbHVlIGFyZSBpbiBiaXRzIDcgLSAwIG9mIHRoZSBjdXJyZW50CiAJICogTFNCIHJlZ2lzdGVyCiAJICovCi0JcmV0ID0gZHMyNzgwX3JlYWQxNihkZXZfaW5mby0+dzFfZGV2LCAmY3VycmVudF9yYXcsIHJlZ19tc2IpOworCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8sICZjdXJyZW50X3JhdywgcmVnX21zYik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTI2Nyw3ICsyNzksNyBAQAogCSAqIFRoZSB1bml0cyBvZiBtZWFzdXJlbWVudCBmb3IgYWNjdW11bGF0ZWQgY3VycmVudCBhcmUgZGVwZW5kZW50IG9uCiAJICogdGhlIHZhbHVlIG9mIHRoZSBzZW5zZSByZXNpc3Rvci4KIAkgKi8KLQlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8tPncxX2RldiwgJnNlbnNlX3Jlc19yYXcsIERTMjc4MF9SU05TUF9SRUcpOworCXJldCA9IGRzMjc4MF9yZWFkOChkZXZfaW5mbywgJnNlbnNlX3Jlc19yYXcsIERTMjc4MF9SU05TUF9SRUcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0yODUsNyArMjk3LDcgQEAKIAkgKiBCaXRzIDcgLSAwIG9mIHRoZSBBQ1IgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDAgb2YgdGhlIEFDUgogCSAqIExTQiByZWdpc3RlcgogCSAqLwotCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8tPncxX2RldiwgJmN1cnJlbnRfcmF3LCBEUzI3ODBfQUNSX01TQl9SRUcpOworCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8sICZjdXJyZW50X3JhdywgRFMyNzgwX0FDUl9NU0JfUkVHKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjk5LDcgKzMxMSw3IEBACiAJaW50IHJldDsKIAl1OCByYXc7CiAKLQlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8tPncxX2RldiwgJnJhdywgRFMyNzgwX1JBUkNfUkVHKTsKKwlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8sICZyYXcsIERTMjc4MF9SQVJDX1JFRyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTM0NSw3ICszNTcsNyBAQAogCSAqIEJpdHMgNyAtIDAgb2YgdGhlIFJBQUMgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDAgb2YgdGhlIFJBQUMKIAkgKiBMU0IgcmVnaXN0ZXIKIAkgKi8KLQlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLT53MV9kZXYsICZjaGFyZ2VfcmF3LCBEUzI3ODBfUkFBQ19NU0JfUkVHKTsKKwlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCAmY2hhcmdlX3JhdywgRFMyNzgwX1JBQUNfTVNCX1JFRyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTM1Niw3ICszNjgsNyBAQAogc3RhdGljIGludCBkczI3ODBfZ2V0X2NvbnRyb2xfcmVnaXN0ZXIoc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCiAJdTggKmNvbnRyb2xfcmVnKQogewotCXJldHVybiBkczI3ODBfcmVhZDgoZGV2X2luZm8tPncxX2RldiwgY29udHJvbF9yZWcsIERTMjc4MF9DT05UUk9MX1JFRyk7CisJcmV0dXJuIGRzMjc4MF9yZWFkOChkZXZfaW5mbywgY29udHJvbF9yZWcsIERTMjc4MF9DT05UUk9MX1JFRyk7CiB9CiAKIHN0YXRpYyBpbnQgZHMyNzgwX3NldF9jb250cm9sX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLApAQCAtMzY0LDcgKzM3Niw3IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mby0+dzFfZGV2LCAmY29udHJvbF9yZWcsCisJcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLCAmY29udHJvbF9yZWcsCiAJCQkJRFMyNzgwX0NPTlRST0xfUkVHLCBzaXplb2YodTgpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTUwMyw3ICs1MTUsNyBAQAogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOwogCXN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgwX2RldmljZV9pbmZvKHBzeSk7CiAKLQlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8tPncxX2RldiwgJnNlbnNlX3Jlc2lzdG9yLCBEUzI3ODBfUlNOU1BfUkVHKTsKKwlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8sICZzZW5zZV9yZXNpc3RvciwgRFMyNzgwX1JTTlNQX1JFRyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTU4NCw3ICs1OTYsNyBAQAogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOwogCXN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgwX2RldmljZV9pbmZvKHBzeSk7CiAKLQlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8tPncxX2RldiwgJnNmciwgRFMyNzgwX1NGUl9SRUcpOworCXJldCA9IGRzMjc4MF9yZWFkOChkZXZfaW5mbywgJnNmciwgRFMyNzgwX1NGUl9SRUcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC02MTEsNyArNjIzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLT53MV9kZXYsICZuZXdfc2V0dGluZywKKwlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8sICZuZXdfc2V0dGluZywKIAkJCQlEUzI3ODBfU0ZSX1JFRywgc2l6ZW9mKHU4KSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC02MzIsNyArNjQ0LDcgQEAKIAkJRFMyNzgwX0VFUFJPTV9CTE9DSzFfRU5EIC0KIAkJRFMyNzgwX0VFUFJPTV9CTE9DSzFfU1RBUlQgKyAxIC0gb2ZmKTsKIAotCXJldHVybiBkczI3ODBfcmVhZF9ibG9jayhkZXZfaW5mby0+dzFfZGV2LCBidWYsCisJcmV0dXJuIGRzMjc4MF9yZWFkX2Jsb2NrKGRldl9pbmZvLCBidWYsCiAJCQkJRFMyNzgwX0VFUFJPTV9CTE9DSzFfU1RBUlQgKyBvZmYsIGNvdW50KTsKIH0KIApAQCAtNjUwLDcgKzY2Miw3IEBACiAJCURTMjc4MF9FRVBST01fQkxPQ0sxX0VORCAtCiAJCURTMjc4MF9FRVBST01fQkxPQ0sxX1NUQVJUICsgMSAtIG9mZik7CiAKLQlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8tPncxX2RldiwgYnVmLAorCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mbywgYnVmLAogCQkJCURTMjc4MF9FRVBST01fQkxPQ0sxX1NUQVJUICsgb2ZmLCBjb3VudCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC02ODUsOSArNjk3LDggQEAKIAkJRFMyNzgwX0VFUFJPTV9CTE9DSzBfRU5EIC0KIAkJRFMyNzgwX0VFUFJPTV9CTE9DSzBfU1RBUlQgKyAxIC0gb2ZmKTsKIAotCXJldHVybiBkczI3ODBfcmVhZF9ibG9jayhkZXZfaW5mby0+dzFfZGV2LCBidWYsCisJcmV0dXJuIGRzMjc4MF9yZWFkX2Jsb2NrKGRldl9pbmZvLCBidWYsCiAJCQkJRFMyNzgwX0VFUFJPTV9CTE9DSzBfU1RBUlQgKyBvZmYsIGNvdW50KTsKLQogfQogCiBzdGF0aWMgc3NpemVfdCBkczI3ODBfd3JpdGVfdXNlcl9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLApAQCAtNzA0LDcgKzcxNSw3IEBACiAJCURTMjc4MF9FRVBST01fQkxPQ0swX0VORCAtCiAJCURTMjc4MF9FRVBST01fQkxPQ0swX1NUQVJUICsgMSAtIG9mZik7CiAKLQlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8tPncxX2RldiwgYnVmLAorCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mbywgYnVmLAogCQkJCURTMjc4MF9FRVBST01fQkxPQ0swX1NUQVJUICsgb2ZmLCBjb3VudCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC03NjgsNiArNzc5LDcgQEAKIAlkZXZfaW5mby0+YmF0LnByb3BlcnRpZXMJPSBkczI3ODBfYmF0dGVyeV9wcm9wczsKIAlkZXZfaW5mby0+YmF0Lm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShkczI3ODBfYmF0dGVyeV9wcm9wcyk7CiAJZGV2X2luZm8tPmJhdC5nZXRfcHJvcGVydHkJPSBkczI3ODBfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJZGV2X2luZm8tPm11dGV4X2hvbGRlcgkJPSBjdXJyZW50OwogCiAJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkZXZfaW5mby0+YmF0KTsKIAlpZiAocmV0KSB7CkBAIC03OTcsNiArODA5LDggQEAKIAkJZ290byBmYWlsX3JlbW92ZV9iaW5fZmlsZTsKIAl9CiAKKwlkZXZfaW5mby0+bXV0ZXhfaG9sZGVyID0gTlVMTDsKKwogCXJldHVybiAwOwogCiBmYWlsX3JlbW92ZV9iaW5fZmlsZToKQEAgLTgxNiw2ICs4MzAsOCBAQAogewogCXN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKKwlkZXZfaW5mby0+bXV0ZXhfaG9sZGVyID0gY3VycmVudDsKKwogCS8qIHJlbW92ZSBhdHRyaWJ1dGVzICovCiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mby0+YmF0LmRldi0+a29iaiwgJmRzMjc4MF9hdHRyX2dyb3VwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYwppbmRleCA5OGJmYWIzLi45ZjAxODNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYwpAQCAtMjMsNiArMjMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMKaW5kZXggYTliMDIwOS4uMjU5NTE0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL21heDg5MDNfY2hhcmdlci5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg4OTk3X2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvbWF4ODk5N19jaGFyZ2VyLmMKaW5kZXggZmZjNTAzMy4uYTIzMzE3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9tYXg4OTk3X2NoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL21heDg5OTdfY2hhcmdlci5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDg5OThfY2hhcmdlci5jCmluZGV4IGVmOGVmYWQuLjkzZTNiYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXg4OTk4X2NoYXJnZXIuYwpAQCAtMTksNiArMTksNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jIGIvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYwppbmRleCA2MDU1MTRhLi5lMTVkNGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAKICNpbmNsdWRlICJwb3dlcl9zdXBwbHkuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wcHMvY2xpZW50cy9LY29uZmlnIGIvZHJpdmVycy9wcHMvY2xpZW50cy9LY29uZmlnCmluZGV4IDg1MjBhN2YuLjQ0NTE5N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHBzL2NsaWVudHMvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bwcy9jbGllbnRzL0tjb25maWcKQEAgLTI5LDQgKzI5LDEzIEBACiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgYSBQUFMgc291cmNlIGNvbm5lY3RlZAogCSAgd2l0aCB0aGUgaW50ZXJydXB0IHBpbiBvZiB5b3VyIHBhcmFsbGVsIHBvcnQuCiAKK2NvbmZpZyBQUFNfQ0xJRU5UX0dQSU8KKwl0cmlzdGF0ZSAiUFBTIGNsaWVudCB1c2luZyBHUElPIgorCWRlcGVuZHMgb24gUFBTICYmIEdFTkVSSUNfSEFSRElSUVMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgYSBQUFMgc291cmNlIHVzaW5nCisJICBHUElPLiBUbyBiZSB1c2VmdWwgeW91IG11c3QgYWxzbyByZWdpc3RlciBhIHBsYXRmb3JtIGRldmljZQorCSAgc3BlY2lmeWluZyB0aGUgR1BJTyBwaW4gYW5kIG90aGVyIG9wdGlvbnMsIHVzdWFsbHkgaW4geW91ciBib2FyZAorCSAgc2V0dXAuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9jbGllbnRzL01ha2VmaWxlIGIvZHJpdmVycy9wcHMvY2xpZW50cy9NYWtlZmlsZQppbmRleCA0ZmViN2U5Li5hNDYxZDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bwcy9jbGllbnRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcHBzL2NsaWVudHMvTWFrZWZpbGUKQEAgLTUsNSArNSw2IEBACiBvYmotJChDT05GSUdfUFBTX0NMSUVOVF9LVElNRVIpCSs9IHBwcy1rdGltZXIubwogb2JqLSQoQ09ORklHX1BQU19DTElFTlRfTERJU0MpCSs9IHBwcy1sZGlzYy5vCiBvYmotJChDT05GSUdfUFBTX0NMSUVOVF9QQVJQT1JUKSArPSBwcHNfcGFycG9ydC5vCitvYmotJChDT05GSUdfUFBTX0NMSUVOVF9HUElPKQkrPSBwcHMtZ3Bpby5vCiAKIGNjZmxhZ3MtJChDT05GSUdfUFBTX0RFQlVHKSA6PSAtRERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9jbGllbnRzL3Bwcy1ncGlvLmMgYi9kcml2ZXJzL3Bwcy9jbGllbnRzL3Bwcy1ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1MDU1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzLWdwaW8uYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIHBwcy1ncGlvLmMgLS0gUFBTIGNsaWVudCBkcml2ZXIgdXNpbmcgR1BJTworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmljYXJkbyBNYXJ0aW5zIDxyYXNtQGZlLnVwLnB0PgorICogQ29weXJpZ2h0IChDKSAyMDExIEphbWVzIE51c3MgPGphbWVzbnVzc0BuYW5vbWV0cmljcy5jYT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2RlZmluZSBQUFNfR1BJT19OQU1FICJwcHMtZ3BpbyIKKyNkZWZpbmUgcHJfZm10KGZtdCkgUFBTX0dQSU9fTkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHBzLWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisvKiBJbmZvIGZvciBlYWNoIHJlZ2lzdGVyZWQgcGxhdGZvcm0gZGV2aWNlICovCitzdHJ1Y3QgcHBzX2dwaW9fZGV2aWNlX2RhdGEgeworCWludCBpcnE7CQkJLyogSVJRIHVzZWQgYXMgUFBTIHNvdXJjZSAqLworCXN0cnVjdCBwcHNfZGV2aWNlICpwcHM7CQkvKiBQUFMgc291cmNlIGRldmljZSAqLworCXN0cnVjdCBwcHNfc291cmNlX2luZm8gaW5mbzsJLyogUFBTIHNvdXJjZSBpbmZvcm1hdGlvbiAqLworCWNvbnN0IHN0cnVjdCBwcHNfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKK307CisKKy8qCisgKiBSZXBvcnQgdGhlIFBQUyBldmVudAorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwcHNfZ3Bpb19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBwcHNfZ3Bpb19kZXZpY2VfZGF0YSAqaW5mbzsKKwlzdHJ1Y3QgcHBzX2V2ZW50X3RpbWUgdHM7CisJaW50IHJpc2luZ19lZGdlOworCisJLyogR2V0IHRoZSB0aW1lIHN0YW1wIGZpcnN0ICovCisJcHBzX2dldF90cygmdHMpOworCisJaW5mbyA9IGRhdGE7CisKKwlyaXNpbmdfZWRnZSA9IGdwaW9fZ2V0X3ZhbHVlKGluZm8tPnBkYXRhLT5ncGlvX3Bpbik7CisJaWYgKChyaXNpbmdfZWRnZSAmJiAhaW5mby0+cGRhdGEtPmFzc2VydF9mYWxsaW5nX2VkZ2UpIHx8CisJCQkoIXJpc2luZ19lZGdlICYmIGluZm8tPnBkYXRhLT5hc3NlcnRfZmFsbGluZ19lZGdlKSkKKwkJcHBzX2V2ZW50KGluZm8tPnBwcywgJnRzLCBQUFNfQ0FQVFVSRUFTU0VSVCwgTlVMTCk7CisJZWxzZSBpZiAoaW5mby0+cGRhdGEtPmNhcHR1cmVfY2xlYXIgJiYKKwkJCSgocmlzaW5nX2VkZ2UgJiYgaW5mby0+cGRhdGEtPmFzc2VydF9mYWxsaW5nX2VkZ2UpIHx8CisJCQkgKCFyaXNpbmdfZWRnZSAmJiAhaW5mby0+cGRhdGEtPmFzc2VydF9mYWxsaW5nX2VkZ2UpKSkKKwkJcHBzX2V2ZW50KGluZm8tPnBwcywgJnRzLCBQUFNfQ0FQVFVSRUNMRUFSLCBOVUxMKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBwcHNfZ3Bpb19zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJY29uc3Qgc3RydWN0IHBwc19ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPmdwaW9fcGluLCBwZGF0YS0+Z3Bpb19sYWJlbCk7CisJaWYgKHJldCkgeworCQlwcl93YXJuaW5nKCJmYWlsZWQgdG8gcmVxdWVzdCBHUElPICV1XG4iLCBwZGF0YS0+Z3Bpb19waW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChwZGF0YS0+Z3Bpb19waW4pOworCWlmIChyZXQpIHsKKwkJcHJfd2FybmluZygiZmFpbGVkIHRvIHNldCBwaW4gZGlyZWN0aW9uXG4iKTsKKwkJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3Bpbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworZ2V0X2lycWZfdHJpZ2dlcl9mbGFncyhjb25zdCBzdHJ1Y3QgcHBzX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IHBkYXRhLT5hc3NlcnRfZmFsbGluZ19lZGdlID8KKwkJSVJRRl9UUklHR0VSX0ZBTExJTkcgOiBJUlFGX1RSSUdHRVJfUklTSU5HOworCisJaWYgKHBkYXRhLT5jYXB0dXJlX2NsZWFyKSB7CisJCWZsYWdzIHw9ICgoZmxhZ3MgJiBJUlFGX1RSSUdHRVJfUklTSU5HKSA/CisJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgOiBJUlFGX1RSSUdHRVJfUklTSU5HKTsKKwl9CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyBpbnQgcHBzX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHBzX2dwaW9fZGV2aWNlX2RhdGEgKmRhdGE7CisJaW50IGlycTsKKwlpbnQgcmV0OworCWludCBlcnI7CisJaW50IHBwc19kZWZhdWx0X3BhcmFtczsKKwljb25zdCBzdHJ1Y3QgcHBzX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCisJLyogR1BJTyBzZXR1cCAqLworCXJldCA9IHBwc19ncGlvX3NldHVwKHBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogSVJRIHNldHVwICovCisJaXJxID0gZ3Bpb190b19pcnEocGRhdGEtPmdwaW9fcGluKTsKKwlpZiAoaXJxIDwgMCkgeworCQlwcl9lcnIoImZhaWxlZCB0byBtYXAgR1BJTyB0byBJUlE6ICVkXG4iLCBpcnEpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHJldHVybl9lcnJvcjsKKwl9CisKKwkvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgZGV2aWNlIGluZm8gKi8KKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBwc19ncGlvX2RldmljZV9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHJldHVybl9lcnJvcjsKKwl9CisKKwkvKiBpbml0aWFsaXplIFBQUyBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgYm9va2tlZXBpbmcgZGF0YSBzdHJ1Y3R1cmUuICovCisJZGF0YS0+aW5mby5tb2RlID0gUFBTX0NBUFRVUkVBU1NFUlQgfCBQUFNfT0ZGU0VUQVNTRVJUIHwKKwkJUFBTX0VDSE9BU1NFUlQgfCBQUFNfQ0FOV0FJVCB8IFBQU19UU0ZNVF9UU1BFQzsKKwlpZiAocGRhdGEtPmNhcHR1cmVfY2xlYXIpCisJCWRhdGEtPmluZm8ubW9kZSB8PSBQUFNfQ0FQVFVSRUNMRUFSIHwgUFBTX09GRlNFVENMRUFSIHwKKwkJCVBQU19FQ0hPQ0xFQVI7CisJZGF0YS0+aW5mby5vd25lciA9IFRISVNfTU9EVUxFOworCXNucHJpbnRmKGRhdGEtPmluZm8ubmFtZSwgUFBTX01BWF9OQU1FX0xFTiAtIDEsICIlcy4lZCIsCisJCSBwZGV2LT5uYW1lLCBwZGV2LT5pZCk7CisKKwkvKiByZWdpc3RlciBQUFMgc291cmNlICovCisJcHBzX2RlZmF1bHRfcGFyYW1zID0gUFBTX0NBUFRVUkVBU1NFUlQgfCBQUFNfT0ZGU0VUQVNTRVJUOworCWlmIChwZGF0YS0+Y2FwdHVyZV9jbGVhcikKKwkJcHBzX2RlZmF1bHRfcGFyYW1zIHw9IFBQU19DQVBUVVJFQ0xFQVIgfCBQUFNfT0ZGU0VUQ0xFQVI7CisJZGF0YS0+cHBzID0gcHBzX3JlZ2lzdGVyX3NvdXJjZSgmZGF0YS0+aW5mbywgcHBzX2RlZmF1bHRfcGFyYW1zKTsKKwlpZiAoZGF0YS0+cHBzID09IE5VTEwpIHsKKwkJa2ZyZWUoZGF0YSk7CisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIElSUSAlZCBhcyBQUFMgc291cmNlXG4iLCBpcnEpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHJldHVybl9lcnJvcjsKKwl9CisKKwlkYXRhLT5pcnEgPSBpcnE7CisJZGF0YS0+cGRhdGEgPSBwZGF0YTsKKworCS8qIHJlZ2lzdGVyIElSUSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcHBzX2dwaW9faXJxX2hhbmRsZXIsCisJCQlnZXRfaXJxZl90cmlnZ2VyX2ZsYWdzKHBkYXRhKSwgZGF0YS0+aW5mby5uYW1lLCBkYXRhKTsKKwlpZiAocmV0KSB7CisJCXBwc191bnJlZ2lzdGVyX3NvdXJjZShkYXRhLT5wcHMpOworCQlrZnJlZShkYXRhKTsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gYWNxdWlyZSBJUlEgJWRcbiIsIGlycSk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gcmV0dXJuX2Vycm9yOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOworCWRldl9pbmZvKGRhdGEtPnBwcy0+ZGV2LCAiUmVnaXN0ZXJlZCBJUlEgJWQgYXMgUFBTIHNvdXJjZVxuIiwgaXJxKTsKKworCXJldHVybiAwOworCityZXR1cm5fZXJyb3I6CisJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3Bpbik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwcHNfZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHBzX2dwaW9fZGV2aWNlX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwljb25zdCBzdHJ1Y3QgcHBzX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkYXRhLT5wZGF0YTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfaXJxKGRhdGEtPmlycSwgZGF0YSk7CisJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3Bpbik7CisJcHBzX3VucmVnaXN0ZXJfc291cmNlKGRhdGEtPnBwcyk7CisJcHJfaW5mbygicmVtb3ZlZCBJUlEgJWQgYXMgUFBTIHNvdXJjZVxuIiwgZGF0YS0+aXJxKTsKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHBzX2dwaW9fZHJpdmVyID0geworCS5wcm9iZQkJPSBwcHNfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9ICBfX2RldmV4aXRfcChwcHNfZ3Bpb19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IFBQU19HUElPX05BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBwc19ncGlvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwcHNfZ3Bpb19kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBwbGF0Zm9ybSBkcml2ZXJcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcHNfZ3Bpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBwc19ncGlvX2RyaXZlcik7CisJcHJfZGVidWcoInVucmVnaXN0ZXJlZCBwbGF0Zm9ybSBkcml2ZXJcbiIpOworfQorCittb2R1bGVfaW5pdChwcHNfZ3Bpb19pbml0KTsKK21vZHVsZV9leGl0KHBwc19ncGlvX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSaWNhcmRvIE1hcnRpbnMgPHJhc21AZmUudXAucHQ+Iik7CitNT0RVTEVfQVVUSE9SKCJKYW1lcyBOdXNzIDxqYW1lc251c3NAbmFub21ldHJpY3MuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVzZSBHUElPIHBpbiBhcyBQUFMgc291cmNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMS4wLjAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzLWt0aW1lci5jIGIvZHJpdmVycy9wcHMvY2xpZW50cy9wcHMta3RpbWVyLmMKaW5kZXggODI1ODNiMC4uNDM2YjRlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wcHMvY2xpZW50cy9wcHMta3RpbWVyLmMKKysrIGIvZHJpdmVycy9wcHMvY2xpZW50cy9wcHMta3RpbWVyLmMKQEAgLTUyLDE3ICs1Miw2IEBACiB9CiAKIC8qCi0gKiBUaGUgZWNobyBmdW5jdGlvbgotICovCi0KLXN0YXRpYyB2b2lkIHBwc19rdGltZXJfZWNobyhzdHJ1Y3QgcHBzX2RldmljZSAqcHBzLCBpbnQgZXZlbnQsIHZvaWQgKmRhdGEpCi17Ci0JZGV2X2luZm8ocHBzLT5kZXYsICJlY2hvICVzICVzXG4iLAotCQlldmVudCAmIFBQU19DQVBUVVJFQVNTRVJUID8gImFzc2VydCIgOiAiIiwKLQkJZXZlbnQgJiBQUFNfQ0FQVFVSRUNMRUFSID8gImNsZWFyIiA6ICIiKTsKLX0KLQotLyoKICAqIFRoZSBQUFMgaW5mbyBzdHJ1Y3QKICAqLwogCkBAIC03Miw3ICs2MSw2IEBACiAJLm1vZGUJCT0gUFBTX0NBUFRVUkVBU1NFUlQgfCBQUFNfT0ZGU0VUQVNTRVJUIHwKIAkJCSAgUFBTX0VDSE9BU1NFUlQgfAogCQkJICBQUFNfQ0FOV0FJVCB8IFBQU19UU0ZNVF9UU1BFQywKLQkuZWNobwkJPSBwcHNfa3RpbWVyX2VjaG8sCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wcHMvY2xpZW50cy9wcHNfcGFycG9ydC5jIGIvZHJpdmVycy9wcHMvY2xpZW50cy9wcHNfcGFycG9ydC5jCmluZGV4IGM1NzFkNmQuLmUxYjQ3MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzX3BhcnBvcnQuYworKysgYi9kcml2ZXJzL3Bwcy9jbGllbnRzL3Bwc19wYXJwb3J0LmMKQEAgLTEzMywxNCArMTMzLDYgQEAKIAlyZXR1cm47CiB9CiAKLS8qIHRoZSBQUFMgZWNobyBmdW5jdGlvbiAqLwotc3RhdGljIHZvaWQgcHBzX2VjaG8oc3RydWN0IHBwc19kZXZpY2UgKnBwcywgaW50IGV2ZW50LCB2b2lkICpkYXRhKQotewotCWRldl9pbmZvKHBwcy0+ZGV2LCAiZWNobyAlcyAlc1xuIiwKLQkJZXZlbnQgJiBQUFNfQ0FQVFVSRUFTU0VSVCA/ICJhc3NlcnQiIDogIiIsCi0JCWV2ZW50ICYgUFBTX0NBUFRVUkVDTEVBUiA/ICJjbGVhciIgOiAiIik7Ci19Ci0KIHN0YXRpYyB2b2lkIHBhcnBvcnRfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQogewogCXN0cnVjdCBwcHNfY2xpZW50X3BwICpkZXZpY2U7CkBAIC0xNTEsNyArMTQzLDYgQEAKIAkJCQkgIFBQU19PRkZTRVRBU1NFUlQgfCBQUFNfT0ZGU0VUQ0xFQVIgfCBcCiAJCQkJICBQUFNfRUNIT0FTU0VSVCB8IFBQU19FQ0hPQ0xFQVIgfCBcCiAJCQkJICBQUFNfQ0FOV0FJVCB8IFBQU19UU0ZNVF9UU1BFQywKLQkJLmVjaG8JCT0gcHBzX2VjaG8sCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLmRldgkJPSBOVUxMCiAJfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL2thcGkuYyBiL2RyaXZlcnMvcHBzL2thcGkuYwppbmRleCBhNGU4ZWI5Li5mMTk3ZThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bwcy9rYXBpLmMKKysrIGIvZHJpdmVycy9wcHMva2FwaS5jCkBAIC01Miw2ICs1MiwxNCBAQAogCXRzLT5zZWMgKz0gb2Zmc2V0LT5zZWM7CiB9CiAKK3N0YXRpYyB2b2lkIHBwc19lY2hvX2NsaWVudF9kZWZhdWx0KHN0cnVjdCBwcHNfZGV2aWNlICpwcHMsIGludCBldmVudCwKKwkJdm9pZCAqZGF0YSkKK3sKKwlkZXZfaW5mbyhwcHMtPmRldiwgImVjaG8gJXMgJXNcbiIsCisJCWV2ZW50ICYgUFBTX0NBUFRVUkVBU1NFUlQgPyAiYXNzZXJ0IiA6ICIiLAorCQlldmVudCAmIFBQU19DQVBUVVJFQ0xFQVIgPyAiY2xlYXIiIDogIiIpOworfQorCiAvKgogICogRXhwb3J0ZWQgZnVuY3Rpb25zCiAgKi8KQEAgLTgwLDEzICs4OCw2IEBACiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gcHBzX3JlZ2lzdGVyX3NvdXJjZV9leGl0OwogCX0KLQlpZiAoKGluZm8tPm1vZGUgJiAoUFBTX0VDSE9BU1NFUlQgfCBQUFNfRUNIT0NMRUFSKSkgIT0gMCAmJgotCQkJaW5mby0+ZWNobyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGVjaG8gZnVuY3Rpb24gaXMgbm90IGRlZmluZWRcbiIsCi0JCQkJCWluZm8tPm5hbWUpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIHBwc19yZWdpc3Rlcl9zb3VyY2VfZXhpdDsKLQl9CiAJaWYgKChpbmZvLT5tb2RlICYgKFBQU19UU0ZNVF9UU1BFQyB8IFBQU19UU0ZNVF9OVFBGUCkpID09IDApIHsKIAkJcHJfZXJyKCIlczogdW5zcGVjaWZpZWQgdGltZSBmb3JtYXRcbiIsCiAJCQkJCWluZm8tPm5hbWUpOwpAQCAtMTA4LDYgKzEwOSwxMSBAQAogCXBwcy0+cGFyYW1zLm1vZGUgPSBkZWZhdWx0X3BhcmFtczsKIAlwcHMtPmluZm8gPSAqaW5mbzsKIAorCS8qIGNoZWNrIGZvciBkZWZhdWx0IGVjaG8gZnVuY3Rpb24gKi8KKwlpZiAoKHBwcy0+aW5mby5tb2RlICYgKFBQU19FQ0hPQVNTRVJUIHwgUFBTX0VDSE9DTEVBUikpICYmCisJCQlwcHMtPmluZm8uZWNobyA9PSBOVUxMKQorCQlwcHMtPmluZm8uZWNobyA9IHBwc19lY2hvX2NsaWVudF9kZWZhdWx0OworCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcHBzLT5xdWV1ZSk7CiAJc3Bpbl9sb2NrX2luaXQoJnBwcy0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3BzMy12dWFydC5jIGIvZHJpdmVycy9wczMvcHMzLXZ1YXJ0LmMKaW5kZXggZDlmYjcyOS4uZmI3MzAwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wczMvcHMzLXZ1YXJ0LmMKKysrIGIvZHJpdmVycy9wczMvcHMzLXZ1YXJ0LmMKQEAgLTk1Miw3ICs5NTIsNyBAQAogCX0KIAogCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHZ1YXJ0X2J1c19wcml2LnZpcnEsIHBzM192dWFydF9pcnFfaGFuZGxlciwKLQkJSVJRRl9ESVNBQkxFRCwgInZ1YXJ0IiwgJnZ1YXJ0X2J1c19wcml2KTsKKwkJMCwgInZ1YXJ0IiwgJnZ1YXJ0X2J1c19wcml2KTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiByZXF1ZXN0X2lycSBmYWlsZWQgKCVkKVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMgYi9kcml2ZXJzL3BzMy9wczNzdG9yX2xpYi5jCmluZGV4IGFmMGFmYTEuLjhjM2Y1YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMKKysrIGIvZHJpdmVycy9wczMvcHMzc3Rvcl9saWIuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KICNpbmNsdWRlIDxhc20vcHMzc3Rvci5oPgpAQCAtMTY2LDcgKzE2Nyw3IEBACiAJCWdvdG8gZmFpbF9jbG9zZV9kZXZpY2U7CiAJfQogCi0JZXJyb3IgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwllcnJvciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBoYW5kbGVyLCAwLAogCQkJICAgIGRldi0+c2JkLmNvcmUuZHJpdmVyLT5uYW1lLCBkZXYpOwogCWlmIChlcnJvcikgewogCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHJlcXVlc3RfaXJxIGZhaWxlZCAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLWNvcmUuYyBiL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLWNvcmUuYwppbmRleCA0NzQyMjU4Li4wZTQxNzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci1jb3JlLmMKKysrIGIvZHJpdmVycy9wczMvc3lzLW1hbmFnZXItY29yZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3BzMy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vS2NvbmZpZyBiL2RyaXZlcnMvcmFwaWRpby9LY29uZmlnCmluZGV4IDA3MDIxMWEuLmJjODcxOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmFwaWRpby9LY29uZmlnCkBAIC0xLDYgKzEsOCBAQAogIwogIyBSYXBpZElPIGNvbmZpZ3VyYXRpb24KICMKK3NvdXJjZSAiZHJpdmVycy9yYXBpZGlvL2RldmljZXMvS2NvbmZpZyIKKwogY29uZmlnIFJBUElESU9fRElTQ19USU1FT1VUCiAJaW50ICJEaXNjb3ZlcnkgdGltZW91dCBkdXJhdGlvbiAoc2Vjb25kcykiCiAJZGVwZW5kcyBvbiBSQVBJRElPCkBAIC0yMCw4ICsyMiw2IEBACiAJICBwb3J0cyBmb3IgSW5wdXQvT3V0cHV0IGRpcmVjdGlvbiB0byBhbGxvdyBvdGhlciB0cmFmZmljCiAJICB0aGFuIE1haW50ZW5hbmNlIHRyYW5zZmVycy4KIAotc291cmNlICJkcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvS2NvbmZpZyIKLQogY29uZmlnIFJBUElESU9fREVCVUcKIAlib29sICJSYXBpZElPIHN1YnN5c3RlbSBkZWJ1ZyBtZXNzYWdlcyIKIAlkZXBlbmRzIG9uIFJBUElESU8KQEAgLTMyLDMgKzMyLDUgQEAKIAkgIGdvaW5nIG9uLgogCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBhYm91dCB0aGlzLCBzYXkgTiBoZXJlLgorCitzb3VyY2UgImRyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL01ha2VmaWxlIGIvZHJpdmVycy9yYXBpZGlvL01ha2VmaWxlCmluZGV4IDg5YjhlY2EuLmVjM2ZiODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3JhcGlkaW8vTWFrZWZpbGUKQEAgLTQsNSArNCw2IEBACiBvYmoteSArPSByaW8ubyByaW8tYWNjZXNzLm8gcmlvLWRyaXZlci5vIHJpby1zY2FuLm8gcmlvLXN5c2ZzLm8KIAogb2JqLSQoQ09ORklHX1JBUElESU8pCQkrPSBzd2l0Y2hlcy8KK29iai0kKENPTkZJR19SQVBJRElPKQkJKz0gZGV2aWNlcy8KIAogc3ViZGlyLWNjZmxhZ3MtJChDT05GSUdfUkFQSURJT19ERUJVRykgOj0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvS2NvbmZpZyBiL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhOWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorIworIyBSYXBpZElPIG1hc3RlciBwb3J0IGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIFJBUElESU9fVFNJNzIxCisJYm9vbCAiSURUIFRzaTcyMSBQQ0kgRXhwcmVzcyBTUklPIENvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFJBUElESU8gJiYgUENJRVBPUlRCVVMKKwlkZWZhdWx0ICJuIgorCS0tLWhlbHAtLS0KKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgSURUIFRzaTcyMSBQQ0kgRXhwcmVzcyBTZXJpYWwgUmFwaWRJTyBjb250cm9sbGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvTWFrZWZpbGUgYi9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdiNGUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciBSYXBpZElPIGRldmljZXMKKyMKKworb2JqLSQoQ09ORklHX1JBUElESU9fVFNJNzIxKQkrPSB0c2k3MjEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMgYi9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy90c2k3MjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjI1OTMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKQEAgLTAsMCArMSwyMzYwIEBACisvKgorICogUmFwaWRJTyBtcG9ydCBkcml2ZXIgZm9yIFRzaTcyMSBQQ0lFeHByZXNzLXRvLVNSSU8gYnJpZGdlCisgKgorICogQ29weXJpZ2h0IDIwMTEgSW50ZWdyYXRlZCBEZXZpY2UgVGVjaG5vbG9neSwgSW5jLgorICogQWxleGFuZHJlIEJvdW5pbmUgPGFsZXhhbmRyZS5ib3VuaW5lQGlkdC5jb20+CisgKiBDaHVsIEtpbSA8Y2h1bC5raW1AaWR0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9yaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yaW9fZHJ2Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJ0c2k3MjEuaCIKKworI2RlZmluZSBERUJVR19QVwkvKiBJbmJvdW5kIFBvcnQtV3JpdGUgZGVidWdnaW5nICovCisKK3N0YXRpYyB2b2lkIHRzaTcyMV9vbXNnX2hhbmRsZXIoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYsIGludCBjaCk7CitzdGF0aWMgdm9pZCB0c2k3MjFfaW1zZ19oYW5kbGVyKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2LCBpbnQgY2gpOworCisvKioKKyAqIHRzaTcyMV9sY3JlYWQgLSByZWFkIGZyb20gbG9jYWwgU1JFUCBjb25maWcgc3BhY2UKKyAqIEBtcG9ydDogUmFwaWRJTyBtYXN0ZXIgcG9ydCBpbmZvCisgKiBAaW5kZXg6IElEIG9mIFJhcGRpSU8gaW50ZXJmYWNlCisgKiBAb2Zmc2V0OiBPZmZzZXQgaW50byBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAbGVuOiBMZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgbWFpbnRlbmFuY2UgdHJhbnNhY3Rpb24KKyAqIEBkYXRhOiBWYWx1ZSB0byBiZSByZWFkIGludG8KKyAqCisgKiBHZW5lcmF0ZXMgYSBsb2NhbCBTUkVQIHNwYWNlIHJlYWQuIFJldHVybnMgJTAgb24KKyAqIHN1Y2Nlc3Mgb3IgJS1FSU5WQUwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCB0c2k3MjFfbGNyZWFkKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgaW5kZXgsIHUzMiBvZmZzZXQsCisJCQkgaW50IGxlbiwgdTMyICpkYXRhKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisKKwlpZiAobGVuICE9IHNpemVvZih1MzIpKQorCQlyZXR1cm4gLUVJTlZBTDsgLyogb25seSAzMi1iaXQgYWNjZXNzIGlzIHN1cHBvcnRlZCAqLworCisJKmRhdGEgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgb2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHRzaTcyMV9sY3dyaXRlIC0gd3JpdGUgaW50byBsb2NhbCBTUkVQIGNvbmZpZyBzcGFjZQorICogQG1wb3J0OiBSYXBpZElPIG1hc3RlciBwb3J0IGluZm8KKyAqIEBpbmRleDogSUQgb2YgUmFwZGlJTyBpbnRlcmZhY2UKKyAqIEBvZmZzZXQ6IE9mZnNldCBpbnRvIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEBsZW46IExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBtYWludGVuYW5jZSB0cmFuc2FjdGlvbgorICogQGRhdGE6IFZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqCisgKiBHZW5lcmF0ZXMgYSBsb2NhbCB3cml0ZSBpbnRvIFNSRVAgY29uZmlndXJhdGlvbiBzcGFjZS4gUmV0dXJucyAlMCBvbgorICogc3VjY2VzcyBvciAlLUVJTlZBTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHRzaTcyMV9sY3dyaXRlKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgaW5kZXgsIHUzMiBvZmZzZXQsCisJCQkgIGludCBsZW4sIHUzMiBkYXRhKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisKKwlpZiAobGVuICE9IHNpemVvZih1MzIpKQorCQlyZXR1cm4gLUVJTlZBTDsgLyogb25seSAzMi1iaXQgYWNjZXNzIGlzIHN1cHBvcnRlZCAqLworCisJaW93cml0ZTMyKGRhdGEsIHByaXYtPnJlZ3MgKyBvZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdHNpNzIxX21haW50X2RtYSAtIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBSYXBpZElPIG1haW50ZW5hbmNlCisgKiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zIHVzaW5nIGRlc2lnbmF0ZWQgVHNpNzIxIERNQSBjaGFubmVsLgorICogQHByaXY6IHBvaW50ZXIgdG8gdHNpNzIxIHByaXZhdGUgZGF0YQorICogQHN5c19zaXplOiBSYXBkaUlPIHRyYW5zcG9ydCBzeXN0ZW0gc2l6ZQorICogQGRlc3RpZDogRGVzdGluYXRpb24gSUQgb2YgdHJhbnNhY3Rpb24KKyAqIEBob3Bjb3VudDogTnVtYmVyIG9mIGhvcHMgdG8gdGFyZ2V0IGRldmljZQorICogQG9mZnNldDogT2Zmc2V0IGludG8gY29uZmlndXJhdGlvbiBzcGFjZQorICogQGxlbjogTGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIG1haW50ZW5hbmNlIHRyYW5zYWN0aW9uCisgKiBAZGF0YTogTG9jYXRpb24gdG8gYmUgcmVhZCBmcm9tIG9yIHdyaXRlIGludG8KKyAqIEBkb193cjogT3BlcmF0aW9uIGZsYWcgKDEgPT0gTUFJTlRfV1IpCisgKgorICogR2VuZXJhdGVzIGEgUmFwaWRJTyBtYWludGVuYW5jZSB0cmFuc2FjdGlvbiAoUmVhZCBvciBXcml0ZSkuCisgKiBSZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kICUtRUlOVkFMIG9yICUtRUZBVUxUIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX21haW50X2RtYShzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiwgdTMyIHN5c19zaXplLAorCQkJdTE2IGRlc3RpZCwgdTggaG9wY291bnQsIHUzMiBvZmZzZXQsIGludCBsZW4sCisJCQl1MzIgKmRhdGEsIGludCBkb193cikKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RtYV9kZXNjICpiZF9wdHI7CisJdTMyIHJkX2NvdW50LCBzd3JfcHRyLCBjaF9zdGF0OworCWludCBpLCBlcnIgPSAwOworCXUzMiBvcCA9IGRvX3dyID8gTUFJTlRfV1IgOiBNQUlOVF9SRDsKKworCWlmIChvZmZzZXQgPiAoUklPX01BSU5UX1NQQUNFX1NaIC0gbGVuKSB8fCAobGVuICE9IHNpemVvZih1MzIpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliZF9wdHIgPSBwcml2LT5iZG1hW1RTSTcyMV9ETUFDSF9NQUlOVF0uYmRfYmFzZTsKKworCXJkX2NvdW50ID0gaW9yZWFkMzIoCisJCQlwcml2LT5yZWdzICsgVFNJNzIxX0RNQUNfRFJEQ05UKFRTSTcyMV9ETUFDSF9NQUlOVCkpOworCisJLyogSW5pdGlhbGl6ZSBETUEgZGVzY3JpcHRvciAqLworCWJkX3B0clswXS50eXBlX2lkID0gY3B1X3RvX2xlMzIoKERUWVBFMiA8PCAyOSkgfCAob3AgPDwgMTkpIHwgZGVzdGlkKTsKKwliZF9wdHJbMF0uYmNvdW50ID0gY3B1X3RvX2xlMzIoKHN5c19zaXplIDw8IDI2KSB8IDB4MDQpOworCWJkX3B0clswXS5yYWRkcl9sbyA9IGNwdV90b19sZTMyKChob3Bjb3VudCA8PCAyNCkgfCBvZmZzZXQpOworCWJkX3B0clswXS5yYWRkcl9oaSA9IDA7CisJaWYgKGRvX3dyKQorCQliZF9wdHJbMF0uZGF0YVswXSA9IGNwdV90b19iZTMycChkYXRhKTsKKwllbHNlCisJCWJkX3B0clswXS5kYXRhWzBdID0gMHhmZmZmZmZmZjsKKworCW1iKCk7CisKKwkvKiBTdGFydCBETUEgb3BlcmF0aW9uICovCisJaW93cml0ZTMyKHJkX2NvdW50ICsgMiwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RXUkNOVChUU0k3MjFfRE1BQ0hfTUFJTlQpKTsKKwlpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RNQUNfRFdSQ05UKFRTSTcyMV9ETUFDSF9NQUlOVCkpOworCWkgPSAwOworCisJLyogV2FpdCB1bnRpbCBETUEgdHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKwl3aGlsZSAoKGNoX3N0YXQgPSBpb3JlYWQzMihwcml2LT5yZWdzICsKKwkJVFNJNzIxX0RNQUNfU1RTKFRTSTcyMV9ETUFDSF9NQUlOVCkpKSAmIFRTSTcyMV9ETUFDX1NUU19SVU4pIHsKKwkJdWRlbGF5KDEpOworCQlpZiAoKytpID49IDUwMDAwMDApIHsKKwkJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkiJXMgOiBETUFbJWRdIHJlYWQgdGltZW91dCBjaF9zdGF0dXM9JXhcbiIsCisJCQkJX19mdW5jX18sIFRTSTcyMV9ETUFDSF9NQUlOVCwgY2hfc3RhdCk7CisJCQlpZiAoIWRvX3dyKQorCQkJCSpkYXRhID0gMHhmZmZmZmZmZjsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9CisKKwlpZiAoY2hfc3RhdCAmIFRTSTcyMV9ETUFDX1NUU19BQk9SVCkgeworCQkvKiBJZiBETUEgb3BlcmF0aW9uIGFib3J0ZWQgZHVlIHRvIGVycm9yLAorCQkgKiByZWluaXRpYWxpemUgRE1BIGNoYW5uZWwKKwkJICovCisJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwgIiVzIDogRE1BIEFCT1JUIGNoX3N0YXQ9JXhcbiIsCisJCQlfX2Z1bmNfXywgY2hfc3RhdCk7CisJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwgIk9QPSVkIDogZGVzdGlkPSV4IGhjPSV4IG9mZj0leFxuIiwKKwkJCWRvX3dyID8gTUFJTlRfV1IgOiBNQUlOVF9SRCwgZGVzdGlkLCBob3Bjb3VudCwgb2Zmc2V0KTsKKwkJaW93cml0ZTMyKFRTSTcyMV9ETUFDX0lOVF9BTEwsCisJCQlwcml2LT5yZWdzICsgVFNJNzIxX0RNQUNfSU5UKFRTSTcyMV9ETUFDSF9NQUlOVCkpOworCQlpb3dyaXRlMzIoVFNJNzIxX0RNQUNfQ1RMX0lOSVQsCisJCQlwcml2LT5yZWdzICsgVFNJNzIxX0RNQUNfQ1RMKFRTSTcyMV9ETUFDSF9NQUlOVCkpOworCQl1ZGVsYXkoMTApOworCQlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArCisJCQkJVFNJNzIxX0RNQUNfRFdSQ05UKFRTSTcyMV9ETUFDSF9NQUlOVCkpOworCQl1ZGVsYXkoMSk7CisJCWlmICghZG9fd3IpCisJCQkqZGF0YSA9IDB4ZmZmZmZmZmY7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpZiAoIWRvX3dyKQorCQkqZGF0YSA9IGJlMzJfdG9fY3B1KGJkX3B0clswXS5kYXRhWzBdKTsKKworCS8qCisJICogVXBkYXRlIGRlc2NyaXB0b3Igc3RhdHVzIEZJRk8gUkQgcG9pbnRlci4KKwkgKiBOT1RFOiBTa2lwcGluZyBjaGVjayBhbmQgY2xlYXIgRklGTyBlbnRyaWVzIGJlY2F1c2Ugd2UgYXJlIHdhaXRpbmcKKwkgKiBmb3IgdHJhbnNmZXIgdG8gYmUgY29tcGxldGVkLgorCSAqLworCXN3cl9wdHIgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RNQUNfRFNXUChUU0k3MjFfRE1BQ0hfTUFJTlQpKTsKKwlpb3dyaXRlMzIoc3dyX3B0ciwgcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RTUlAoVFNJNzIxX0RNQUNIX01BSU5UKSk7CitlcnJfb3V0OgorCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB0c2k3MjFfY3JlYWRfZG1hIC0gR2VuZXJhdGUgYSBSYXBpZElPIG1haW50ZW5hbmNlIHJlYWQgdHJhbnNhY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgICB1c2luZyBUc2k3MjEgQkRNQSBlbmdpbmUuCisgKiBAbXBvcnQ6IFJhcGlkSU8gbWFzdGVyIHBvcnQgY29udHJvbCBzdHJ1Y3R1cmUKKyAqIEBpbmRleDogSUQgb2YgUmFwZGlJTyBpbnRlcmZhY2UKKyAqIEBkZXN0aWQ6IERlc3RpbmF0aW9uIElEIG9mIHRyYW5zYWN0aW9uCisgKiBAaG9wY291bnQ6IE51bWJlciBvZiBob3BzIHRvIHRhcmdldCBkZXZpY2UKKyAqIEBvZmZzZXQ6IE9mZnNldCBpbnRvIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEBsZW46IExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBtYWludGVuYW5jZSB0cmFuc2FjdGlvbgorICogQHZhbDogTG9jYXRpb24gdG8gYmUgcmVhZCBpbnRvCisgKgorICogR2VuZXJhdGVzIGEgUmFwaWRJTyBtYWludGVuYW5jZSByZWFkIHRyYW5zYWN0aW9uLgorICogUmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZCAlLUVJTlZBTCBvciAlLUVGQVVMVCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHRzaTcyMV9jcmVhZF9kbWEoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBpbmRleCwgdTE2IGRlc3RpZCwKKwkJCXU4IGhvcGNvdW50LCB1MzIgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgKmRhdGEpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKworCXJldHVybiB0c2k3MjFfbWFpbnRfZG1hKHByaXYsIG1wb3J0LT5zeXNfc2l6ZSwgZGVzdGlkLCBob3Bjb3VudCwKKwkJCQlvZmZzZXQsIGxlbiwgZGF0YSwgMCk7Cit9CisKKy8qKgorICogdHNpNzIxX2N3cml0ZV9kbWEgLSBHZW5lcmF0ZSBhIFJhcGlkSU8gbWFpbnRlbmFuY2Ugd3JpdGUgdHJhbnNhY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgICAgdXNpbmcgVHNpNzIxIEJETUEgZW5naW5lCisgKiBAbXBvcnQ6IFJhcGlkSU8gbWFzdGVyIHBvcnQgY29udHJvbCBzdHJ1Y3R1cmUKKyAqIEBpbmRleDogSUQgb2YgUmFwZGlJTyBpbnRlcmZhY2UKKyAqIEBkZXN0aWQ6IERlc3RpbmF0aW9uIElEIG9mIHRyYW5zYWN0aW9uCisgKiBAaG9wY291bnQ6IE51bWJlciBvZiBob3BzIHRvIHRhcmdldCBkZXZpY2UKKyAqIEBvZmZzZXQ6IE9mZnNldCBpbnRvIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEBsZW46IExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBtYWludGVuYW5jZSB0cmFuc2FjdGlvbgorICogQHZhbDogVmFsdWUgdG8gYmUgd3JpdHRlbgorICoKKyAqIEdlbmVyYXRlcyBhIFJhcGlkSU8gbWFpbnRlbmFuY2Ugd3JpdGUgdHJhbnNhY3Rpb24uCisgKiBSZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kICUtRUlOVkFMIG9yICUtRUZBVUxUIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX2N3cml0ZV9kbWEoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBpbmRleCwgdTE2IGRlc3RpZCwKKwkJCSB1OCBob3Bjb3VudCwgdTMyIG9mZnNldCwgaW50IGxlbiwgdTMyIGRhdGEpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwl1MzIgdGVtcCA9IGRhdGE7CisKKwlyZXR1cm4gdHNpNzIxX21haW50X2RtYShwcml2LCBtcG9ydC0+c3lzX3NpemUsIGRlc3RpZCwgaG9wY291bnQsCisJCQkJb2Zmc2V0LCBsZW4sICZ0ZW1wLCAxKTsKK30KKworLyoqCisgKiB0c2k3MjFfcHdfaGFuZGxlciAtIFRzaTcyMSBpbmJvdW5kIHBvcnQtd3JpdGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBtcG9ydDogUmFwaWRJTyBtYXN0ZXIgcG9ydCBzdHJ1Y3R1cmUKKyAqCisgKiBIYW5kbGVzIGluYm91bmQgcG9ydC13cml0ZSBpbnRlcnJ1cHRzLiBDb3BpZXMgUFcgbWVzc2FnZSBmcm9tIGFuIGludGVybmFsCisgKiBidWZmZXIgaW50byBQVyBtZXNzYWdlIEZJRk8gYW5kIHNjaGVkdWxlcyBkZWZlcnJlZCByb3V0aW5lIHRvIHByb2Nlc3MKKyAqIHF1ZXVlZCBtZXNzYWdlcy4KKyAqLworc3RhdGljIGludAordHNpNzIxX3B3X2hhbmRsZXIoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwl1MzIgcHdfc3RhdDsKKwl1MzIgcHdfYnVmW1RTSTcyMV9SSU9fUFdfTVNHX1NJWkUvc2l6ZW9mKHUzMildOworCisKKwlwd19zdGF0ID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9SSU9fUFdfUlhfU1RBVCk7CisKKwlpZiAocHdfc3RhdCAmIFRTSTcyMV9SSU9fUFdfUlhfU1RBVF9QV19WQUwpIHsKKwkJcHdfYnVmWzBdID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9SSU9fUFdfUlhfQ0FQVCgwKSk7CisJCXB3X2J1ZlsxXSA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX1BXX1JYX0NBUFQoMSkpOworCQlwd19idWZbMl0gPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX1JJT19QV19SWF9DQVBUKDIpKTsKKwkJcHdfYnVmWzNdID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9SSU9fUFdfUlhfQ0FQVCgzKSk7CisKKwkJLyogUXVldWUgUFcgbWVzc2FnZSAoaWYgdGhlcmUgaXMgcm9vbSBpbiBGSUZPKSwKKwkJICogb3RoZXJ3aXNlIGRpc2NhcmQgaXQuCisJCSAqLworCQlzcGluX2xvY2soJnByaXYtPnB3X2ZpZm9fbG9jayk7CisJCWlmIChrZmlmb19hdmFpbCgmcHJpdi0+cHdfZmlmbykgPj0gVFNJNzIxX1JJT19QV19NU0dfU0laRSkKKwkJCWtmaWZvX2luKCZwcml2LT5wd19maWZvLCBwd19idWYsCisJCQkJCQlUU0k3MjFfUklPX1BXX01TR19TSVpFKTsKKwkJZWxzZQorCQkJcHJpdi0+cHdfZGlzY2FyZF9jb3VudCsrOworCQlzcGluX3VubG9jaygmcHJpdi0+cHdfZmlmb19sb2NrKTsKKwl9CisKKwkvKiBDbGVhciBwZW5kaW5nIFBXIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoVFNJNzIxX1JJT19QV19SWF9TVEFUX1BXX0RJU0MgfCBUU0k3MjFfUklPX1BXX1JYX1NUQVRfUFdfVkFMLAorCQkgIHByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX1BXX1JYX1NUQVQpOworCisJc2NoZWR1bGVfd29yaygmcHJpdi0+cHdfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHNpNzIxX3B3X2RwYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRzaTcyMV9kZXZpY2UsCisJCQkJCQkgICAgcHdfd29yayk7CisJdTMyIG1zZ19idWZmZXJbUklPX1BXX01TR19TSVpFL3NpemVvZih1MzIpXTsgLyogVXNlIGZ1bGwgc2l6ZSBQVyBtZXNzYWdlCisJCQkJCQkJYnVmZmVyIGZvciBSSU8gbGF5ZXIgKi8KKworCS8qCisJICogUHJvY2VzcyBwb3J0LXdyaXRlIG1lc3NhZ2VzCisJICovCisJd2hpbGUgKGtmaWZvX291dF9zcGlubG9ja2VkKCZwcml2LT5wd19maWZvLCAodW5zaWduZWQgY2hhciAqKW1zZ19idWZmZXIsCisJCQkgVFNJNzIxX1JJT19QV19NU0dfU0laRSwgJnByaXYtPnB3X2ZpZm9fbG9jaykpIHsKKwkJLyogUHJvY2VzcyBvbmUgbWVzc2FnZSAqLworI2lmZGVmIERFQlVHX1BXCisJCXsKKwkJdTMyIGk7CisJCXByX2RlYnVnKCIlcyA6IFBvcnQtV3JpdGUgTWVzc2FnZToiLCBfX2Z1bmNfXyk7CisJCWZvciAoaSA9IDA7IGkgPCBSSU9fUFdfTVNHX1NJWkUvc2l6ZW9mKHUzMik7ICkgeworCQkJcHJfZGVidWcoIjB4JTAyeDogJTA4eCAlMDh4ICUwOHggJTA4eCIsIGkqNCwKKwkJCQltc2dfYnVmZmVyW2ldLCBtc2dfYnVmZmVyW2kgKyAxXSwKKwkJCQltc2dfYnVmZmVyW2kgKyAyXSwgbXNnX2J1ZmZlcltpICsgM10pOworCQkJaSArPSA0OworCQl9CisJCXByX2RlYnVnKCJcbiIpOworCQl9CisjZW5kaWYKKwkJLyogUGFzcyB0aGUgcG9ydC13cml0ZSBtZXNzYWdlIHRvIFJJTyBjb3JlIGZvciBwcm9jZXNzaW5nICovCisJCXJpb19pbmJfcHdyaXRlX2hhbmRsZXIoKHVuaW9uIHJpb19wd19tc2cgKiltc2dfYnVmZmVyKTsKKwl9Cit9CisKKy8qKgorICogdHNpNzIxX3B3X2VuYWJsZSAtIGVuYWJsZS9kaXNhYmxlIHBvcnQtd3JpdGUgaW50ZXJmYWNlIGluaXQKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBwb3J0IHdyaXRlIHVuaXQKKyAqIEBlbmFibGU6ICAgIDE9ZW5hYmxlOyAwPWRpc2FibGUgcG9ydC13cml0ZSBtZXNzYWdlIGhhbmRsaW5nCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX3B3X2VuYWJsZShzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IG1wb3J0LT5wcml2OworCXUzMiBydmFsOworCisJcnZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX0VNX0lOVF9FTkFCTEUpOworCisJaWYgKGVuYWJsZSkKKwkJcnZhbCB8PSBUU0k3MjFfUklPX0VNX0lOVF9FTkFCTEVfUFdfUlg7CisJZWxzZQorCQlydmFsICY9IH5UU0k3MjFfUklPX0VNX0lOVF9FTkFCTEVfUFdfUlg7CisKKwkvKiBDbGVhciBwZW5kaW5nIFBXIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoVFNJNzIxX1JJT19QV19SWF9TVEFUX1BXX0RJU0MgfCBUU0k3MjFfUklPX1BXX1JYX1NUQVRfUFdfVkFMLAorCQkgIHByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX1BXX1JYX1NUQVQpOworCS8qIFVwZGF0ZSBlbmFibGUgYml0cyAqLworCWlvd3JpdGUzMihydmFsLCBwcml2LT5yZWdzICsgVFNJNzIxX1JJT19FTV9JTlRfRU5BQkxFKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHRzaTcyMV9kc2VuZCAtIFNlbmQgYSBSYXBpZElPIGRvb3JiZWxsCisgKiBAbXBvcnQ6IFJhcGlkSU8gbWFzdGVyIHBvcnQgaW5mbworICogQGluZGV4OiBJRCBvZiBSYXBpZElPIGludGVyZmFjZQorICogQGRlc3RpZDogRGVzdGluYXRpb24gSUQgb2YgdGFyZ2V0IGRldmljZQorICogQGRhdGE6IDE2LWJpdCBpbmZvIGZpZWxkIG9mIFJhcGlkSU8gZG9vcmJlbGwKKyAqCisgKiBTZW5kcyBhIFJhcGlkSU8gZG9vcmJlbGwgbWVzc2FnZS4gQWx3YXlzIHJldHVybnMgJTAuCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX2RzZW5kKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgaW5kZXgsCisJCQl1MTYgZGVzdGlkLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IG1wb3J0LT5wcml2OworCXUzMiBvZmZzZXQ7CisKKwlvZmZzZXQgPSAoKChtcG9ydC0+c3lzX3NpemUpID8gUklPX1RUX0NPREVfMTYgOiBSSU9fVFRfQ09ERV84KSA8PCAxOCkgfAorCQkgKGRlc3RpZCA8PCAyKTsKKworCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJIlNlbmQgRG9vcmJlbGwgMHglMDR4IHRvIGRlc3RJRCAweCV4XG4iLCBkYXRhLCBkZXN0aWQpOworCWlvd3JpdGUxNmJlKGRhdGEsIHByaXYtPm9kYl9iYXNlICsgb2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHRzaTcyMV9kYmVsbF9oYW5kbGVyIC0gVHNpNzIxIGRvb3JiZWxsIGludGVycnVwdCBoYW5kbGVyCisgKiBAbXBvcnQ6IFJhcGlkSU8gbWFzdGVyIHBvcnQgc3RydWN0dXJlCisgKgorICogSGFuZGxlcyBpbmJvdW5kIGRvb3JiZWxsIGludGVycnVwdHMuIENvcGllcyBkb29yYmVsbCBlbnRyeSBmcm9tIGFuIGludGVybmFsCisgKiBidWZmZXIgaW50byBEQiBtZXNzYWdlIEZJRk8gYW5kIHNjaGVkdWxlcyBkZWZlcnJlZCAgcm91dGluZSB0byBwcm9jZXNzCisgKiBxdWV1ZWQgREJzLgorICovCitzdGF0aWMgaW50Cit0c2k3MjFfZGJlbGxfaGFuZGxlcihzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCkKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IG1wb3J0LT5wcml2OworCXUzMiByZWd2YWw7CisKKwkvKiBEaXNhYmxlIElEQiBpbnRlcnJ1cHRzICovCisJcmVndmFsID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVEUoSURCX1FVRVVFKSk7CisJcmVndmFsICY9IH5UU0k3MjFfU1JfQ0hJTlRfSURCUVJDVjsKKwlpb3dyaXRlMzIocmVndmFsLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX1NSX0NISU5URShJREJfUVVFVUUpKTsKKworCXNjaGVkdWxlX3dvcmsoJnByaXYtPmlkYl93b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0c2k3MjFfZGJfZHBjKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHNpNzIxX2RldmljZSwKKwkJCQkJCSAgICBpZGJfd29yayk7CisJc3RydWN0IHJpb19tcG9ydCAqbXBvcnQ7CisJc3RydWN0IHJpb19kYmVsbCAqZGJlbGw7CisJaW50IGZvdW5kID0gMDsKKwl1MzIgd3JfcHRyLCByZF9wdHI7CisJdTY0ICppZGJfZW50cnk7CisJdTMyIHJlZ3ZhbDsKKwl1bmlvbiB7CisJCXU2NCBtc2c7CisJCXU4ICBieXRlc1s4XTsKKwl9IGlkYjsKKworCS8qCisJICogUHJvY2VzcyBxdWV1ZWQgaW5ib3VuZCBkb29yYmVsbHMKKwkgKi8KKwltcG9ydCA9IHByaXYtPm1wb3J0OworCisJd3JfcHRyID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9JRFFfV1AoSURCX1FVRVVFKSk7CisJcmRfcHRyID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9JRFFfUlAoSURCX1FVRVVFKSk7CisKKwl3aGlsZSAod3JfcHRyICE9IHJkX3B0cikgeworCQlpZGJfZW50cnkgPSAodTY0ICopKHByaXYtPmlkYl9iYXNlICsKKwkJCQkJKFRTSTcyMV9JREJfRU5UUllfU0laRSAqIHJkX3B0cikpOworCQlyZF9wdHIrKzsKKwkJaWRiLm1zZyA9ICppZGJfZW50cnk7CisJCSppZGJfZW50cnkgPSAwOworCisJCS8qIFByb2Nlc3Mgb25lIGRvb3JiZWxsICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGJlbGwsICZtcG9ydC0+ZGJlbGxzLCBub2RlKSB7CisJCQlpZiAoKGRiZWxsLT5yZXMtPnN0YXJ0IDw9IERCRUxMX0lORihpZGIuYnl0ZXMpKSAmJgorCQkJICAgIChkYmVsbC0+cmVzLT5lbmQgPj0gREJFTExfSU5GKGlkYi5ieXRlcykpKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGZvdW5kKSB7CisJCQlkYmVsbC0+ZGluYihtcG9ydCwgZGJlbGwtPmRldl9pZCwgREJFTExfU0lEKGlkYi5ieXRlcyksCisJCQkJICAgIERCRUxMX1RJRChpZGIuYnl0ZXMpLCBEQkVMTF9JTkYoaWRiLmJ5dGVzKSk7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZwcml2LT5wZGV2LT5kZXYsCisJCQkJInNwdXJpb3VzIGluYiBkb29yYmVsbCwgc2lkICUyLjJ4IHRpZCAlMi4yeCIKKwkJCQkiIGluZm8gJTQuNHhcbiIsIERCRUxMX1NJRChpZGIuYnl0ZXMpLAorCQkJCURCRUxMX1RJRChpZGIuYnl0ZXMpLCBEQkVMTF9JTkYoaWRiLmJ5dGVzKSk7CisJCX0KKwl9CisKKwlpb3dyaXRlMzIocmRfcHRyICYgKElEQl9RU0laRSAtIDEpLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0lEUV9SUChJREJfUVVFVUUpKTsKKworCS8qIFJlLWVuYWJsZSBJREIgaW50ZXJydXB0cyAqLworCXJlZ3ZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfU1JfQ0hJTlRFKElEQl9RVUVVRSkpOworCXJlZ3ZhbCB8PSBUU0k3MjFfU1JfQ0hJTlRfSURCUVJDVjsKKwlpb3dyaXRlMzIocmVndmFsLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX1NSX0NISU5URShJREJfUVVFVUUpKTsKK30KKworLyoqCisgKiB0c2k3MjFfaXJxaGFuZGxlciAtIFRzaTcyMSBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGlycTogTGludXggaW50ZXJydXB0IG51bWJlcgorICogQHB0cjogUG9pbnRlciB0byBpbnRlcnJ1cHQtc3BlY2lmaWMgZGF0YSAobXBvcnQgc3RydWN0dXJlKQorICoKKyAqIEhhbmRsZXMgVHNpNzIxIGludGVycnVwdHMgc2lnbmFsZWQgdXNpbmcgTVNJIGFuZCBJTlRBLiBDaGVja3MgcmVwb3J0ZWQKKyAqIGludGVycnVwdCBldmVudHMgYW5kIGNhbGxzIGFuIGV2ZW50LXNwZWNpZmljIGhhbmRsZXIocykuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2k3MjFfaXJxaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwdHIpCit7CisJc3RydWN0IHJpb19tcG9ydCAqbXBvcnQgPSAoc3RydWN0IHJpb19tcG9ydCAqKXB0cjsKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IG1wb3J0LT5wcml2OworCXUzMiBkZXZfaW50OworCXUzMiBkZXZfY2hfaW50OworCXUzMiBpbnR2YWw7CisJdTMyIGNoX2ludGU7CisKKwlkZXZfaW50ID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ERVZfSU5UKTsKKwlpZiAoIWRldl9pbnQpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWRldl9jaF9pbnQgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVCk7CisKKwlpZiAoZGV2X2ludCAmIFRTSTcyMV9ERVZfSU5UX1NSMlBDX0NIKSB7CisJCS8qIFNlcnZpY2UgU1IyUEMgQ2hhbm5lbCBpbnRlcnJ1cHRzICovCisJCWlmIChkZXZfY2hfaW50ICYgVFNJNzIxX0lOVF9TUjJQQ19DSEFOKElEQl9RVUVVRSkpIHsKKwkJCS8qIFNlcnZpY2UgSW5ib3VuZCBEb29yYmVsbCBpbnRlcnJ1cHQgKi8KKwkJCWludHZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKworCQkJCQkJVFNJNzIxX1NSX0NISU5UKElEQl9RVUVVRSkpOworCQkJaWYgKGludHZhbCAmIFRTSTcyMV9TUl9DSElOVF9JREJRUkNWKQorCQkJCXRzaTcyMV9kYmVsbF9oYW5kbGVyKG1wb3J0KTsKKwkJCWVsc2UKKwkJCQlkZXZfaW5mbygmcHJpdi0+cGRldi0+ZGV2LAorCQkJCQkiVW5zdXBwb3J0ZWQgU1JfQ0hfSU5UICV4XG4iLCBpbnR2YWwpOworCisJCQkvKiBDbGVhciBpbnRlcnJ1cHRzICovCisJCQlpb3dyaXRlMzIoaW50dmFsLAorCQkJCXByaXYtPnJlZ3MgKyBUU0k3MjFfU1JfQ0hJTlQoSURCX1FVRVVFKSk7CisJCQlpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX1NSX0NISU5UKElEQl9RVUVVRSkpOworCQl9CisJfQorCisJaWYgKGRldl9pbnQgJiBUU0k3MjFfREVWX0lOVF9TTVNHX0NIKSB7CisJCWludCBjaDsKKworCQkvKgorCQkgKiBTZXJ2aWNlIGNoYW5uZWwgaW50ZXJydXB0cyBmcm9tIE1lc3NhZ2luZyBFbmdpbmUKKwkJICovCisKKwkJaWYgKGRldl9jaF9pbnQgJiBUU0k3MjFfSU5UX0lNU0dfQ0hBTl9NKSB7IC8qIEluYm91bmQgTXNnICovCisJCQkvKiBEaXNhYmxlIHNpZ25hbGVkIE9CIE1TRyBDaGFubmVsIGludGVycnVwdHMgKi8KKwkJCWNoX2ludGUgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCQkJY2hfaW50ZSAmPSB+KGRldl9jaF9pbnQgJiBUU0k3MjFfSU5UX0lNU0dfQ0hBTl9NKTsKKwkJCWlvd3JpdGUzMihjaF9pbnRlLCBwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCisJCQkvKgorCQkJICogUHJvY2VzcyBJbmJvdW5kIE1lc3NhZ2UgaW50ZXJydXB0IGZvciBlYWNoIE1CT1gKKwkJCSAqLworCQkJZm9yIChjaCA9IDQ7IGNoIDwgUklPX01BWF9NQk9YICsgNDsgY2grKykgeworCQkJCWlmICghKGRldl9jaF9pbnQgJiBUU0k3MjFfSU5UX0lNU0dfQ0hBTihjaCkpKQorCQkJCQljb250aW51ZTsKKwkJCQl0c2k3MjFfaW1zZ19oYW5kbGVyKHByaXYsIGNoKTsKKwkJCX0KKwkJfQorCisJCWlmIChkZXZfY2hfaW50ICYgVFNJNzIxX0lOVF9PTVNHX0NIQU5fTSkgeyAvKiBPdXRib3VuZCBNc2cgKi8KKwkJCS8qIERpc2FibGUgc2lnbmFsZWQgT0IgTVNHIENoYW5uZWwgaW50ZXJydXB0cyAqLworCQkJY2hfaW50ZSA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7CisJCQljaF9pbnRlICY9IH4oZGV2X2NoX2ludCAmIFRTSTcyMV9JTlRfT01TR19DSEFOX00pOworCQkJaW93cml0ZTMyKGNoX2ludGUsIHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7CisKKwkJCS8qCisJCQkgKiBQcm9jZXNzIE91dGJvdW5kIE1lc3NhZ2UgaW50ZXJydXB0cyBmb3IgZWFjaCBNQk9YCisJCQkgKi8KKworCQkJZm9yIChjaCA9IDA7IGNoIDwgUklPX01BWF9NQk9YOyBjaCsrKSB7CisJCQkJaWYgKCEoZGV2X2NoX2ludCAmIFRTSTcyMV9JTlRfT01TR19DSEFOKGNoKSkpCisJCQkJCWNvbnRpbnVlOworCQkJCXRzaTcyMV9vbXNnX2hhbmRsZXIocHJpdiwgY2gpOworCQkJfQorCQl9CisJfQorCisJaWYgKGRldl9pbnQgJiBUU0k3MjFfREVWX0lOVF9TUklPKSB7CisJCS8qIFNlcnZpY2UgU1JJTyBNQUMgaW50ZXJydXB0cyAqLworCQlpbnR2YWwgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX1JJT19FTV9JTlRfU1RBVCk7CisJCWlmIChpbnR2YWwgJiBUU0k3MjFfUklPX0VNX0lOVF9TVEFUX1BXX1JYKQorCQkJdHNpNzIxX3B3X2hhbmRsZXIobXBvcnQpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgdHNpNzIxX2ludGVycnVwdHNfaW5pdChzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdikKK3sKKwl1MzIgaW50cjsKKworCS8qIEVuYWJsZSBJREIgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMihUU0k3MjFfU1JfQ0hJTlRfQUxMLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX1NSX0NISU5UKElEQl9RVUVVRSkpOworCWlvd3JpdGUzMihUU0k3MjFfU1JfQ0hJTlRfSURCUVJDViwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVEUoSURCX1FVRVVFKSk7CisJaW93cml0ZTMyKFRTSTcyMV9JTlRfU1IyUENfQ0hBTihJREJfUVVFVUUpLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCisJLyogRW5hYmxlIFNSSU8gTUFDIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoVFNJNzIxX1JJT19FTV9ERVZfSU5UX0VOX0lOVCwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9SSU9fRU1fREVWX0lOVF9FTik7CisKKwlpZiAocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJWCkKKwkJaW50ciA9IFRTSTcyMV9ERVZfSU5UX1NSSU87CisJZWxzZQorCQlpbnRyID0gVFNJNzIxX0RFVl9JTlRfU1IyUENfQ0ggfCBUU0k3MjFfREVWX0lOVF9TUklPIHwKKwkJCVRTSTcyMV9ERVZfSU5UX1NNU0dfQ0g7CisKKwlpb3dyaXRlMzIoaW50ciwgcHJpdi0+cmVncyArIFRTSTcyMV9ERVZfSU5URSk7CisJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ERVZfSU5URSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorLyoqCisgKiB0c2k3MjFfb21zZ19tc2l4IC0gTVNJLVggaW50ZXJydXB0IGhhbmRsZXIgZm9yIG91dGJvdW5kIG1lc3NhZ2luZworICogQGlycTogTGludXggaW50ZXJydXB0IG51bWJlcgorICogQHB0cjogUG9pbnRlciB0byBpbnRlcnJ1cHQtc3BlY2lmaWMgZGF0YSAobXBvcnQgc3RydWN0dXJlKQorICoKKyAqIEhhbmRsZXMgb3V0Ym91bmQgbWVzc2FnaW5nIGludGVycnVwdHMgc2lnbmFsZWQgdXNpbmcgTVNJLVguCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2k3MjFfb21zZ19tc2l4KGludCBpcnEsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9ICgoc3RydWN0IHJpb19tcG9ydCAqKXB0ciktPnByaXY7CisJaW50IG1ib3g7CisKKwltYm94ID0gKGlycSAtIHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfT01CMF9ET05FXS52ZWN0b3IpICUgUklPX01BWF9NQk9YOworCXRzaTcyMV9vbXNnX2hhbmRsZXIocHJpdiwgbWJveCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHRzaTcyMV9pbXNnX21zaXggLSBNU0ktWCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgaW5ib3VuZCBtZXNzYWdpbmcKKyAqIEBpcnE6IExpbnV4IGludGVycnVwdCBudW1iZXIKKyAqIEBwdHI6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEgKG1wb3J0IHN0cnVjdHVyZSkKKyAqCisgKiBIYW5kbGVzIGluYm91bmQgbWVzc2FnaW5nIGludGVycnVwdHMgc2lnbmFsZWQgdXNpbmcgTVNJLVguCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2k3MjFfaW1zZ19tc2l4KGludCBpcnEsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9ICgoc3RydWN0IHJpb19tcG9ydCAqKXB0ciktPnByaXY7CisJaW50IG1ib3g7CisKKwltYm94ID0gKGlycSAtIHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSU1CMF9SQ1ZdLnZlY3RvcikgJSBSSU9fTUFYX01CT1g7CisJdHNpNzIxX2ltc2dfaGFuZGxlcihwcml2LCBtYm94ICsgNCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHRzaTcyMV9zcmlvX21zaXggLSBUc2k3MjEgTVNJLVggU1JJTyBNQUMgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IExpbnV4IGludGVycnVwdCBudW1iZXIKKyAqIEBwdHI6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEgKG1wb3J0IHN0cnVjdHVyZSkKKyAqCisgKiBIYW5kbGVzIFRzaTcyMSBpbnRlcnJ1cHRzIGZyb20gU1JJTyBNQUMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2k3MjFfc3Jpb19tc2l4KGludCBpcnEsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9ICgoc3RydWN0IHJpb19tcG9ydCAqKXB0ciktPnByaXY7CisJdTMyIHNyaW9faW50OworCisJLyogU2VydmljZSBTUklPIE1BQyBpbnRlcnJ1cHRzICovCisJc3Jpb19pbnQgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX1JJT19FTV9JTlRfU1RBVCk7CisJaWYgKHNyaW9faW50ICYgVFNJNzIxX1JJT19FTV9JTlRfU1RBVF9QV19SWCkKKwkJdHNpNzIxX3B3X2hhbmRsZXIoKHN0cnVjdCByaW9fbXBvcnQgKilwdHIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHRzaTcyMV9zcjJwY19jaF9tc2l4IC0gVHNpNzIxIE1TSS1YIFNSMlBDIENoYW5uZWwgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IExpbnV4IGludGVycnVwdCBudW1iZXIKKyAqIEBwdHI6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEgKG1wb3J0IHN0cnVjdHVyZSkKKyAqCisgKiBIYW5kbGVzIFRzaTcyMSBpbnRlcnJ1cHRzIGZyb20gU1IyUEMgQ2hhbm5lbC4KKyAqIE5PVEU6IEF0IHRoaXMgbW9tZW50IHNlcnZpY2VzIG9ubHkgb25lIFNSMlBDIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIGluYm91bmQKKyAqIGRvb3JiZWxscy4KKyAqLworc3RhdGljIGlycXJldHVybl90IHRzaTcyMV9zcjJwY19jaF9tc2l4KGludCBpcnEsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9ICgoc3RydWN0IHJpb19tcG9ydCAqKXB0ciktPnByaXY7CisJdTMyIHNyX2NoX2ludDsKKworCS8qIFNlcnZpY2UgSW5ib3VuZCBEQiBpbnRlcnJ1cHQgZnJvbSBTUjJQQyBjaGFubmVsICovCisJc3JfY2hfaW50ID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVChJREJfUVVFVUUpKTsKKwlpZiAoc3JfY2hfaW50ICYgVFNJNzIxX1NSX0NISU5UX0lEQlFSQ1YpCisJCXRzaTcyMV9kYmVsbF9oYW5kbGVyKChzdHJ1Y3QgcmlvX21wb3J0ICopcHRyKTsKKworCS8qIENsZWFyIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoc3JfY2hfaW50LCBwcml2LT5yZWdzICsgVFNJNzIxX1NSX0NISU5UKElEQl9RVUVVRSkpOworCS8qIFJlYWQgYmFjayB0byBlbnN1cmUgdGhhdCBpbnRlcnJ1cHQgd2FzIGNsZWFyZWQgKi8KKwlzcl9jaF9pbnQgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX1NSX0NISU5UKElEQl9RVUVVRSkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHRzaTcyMV9yZXF1ZXN0X21zaXggLSByZWdpc3RlciBpbnRlcnJ1cHQgc2VydmljZSBmb3IgTVNJLVggbW9kZS4KKyAqIEBtcG9ydDogUmFwaWRJTyBtYXN0ZXIgcG9ydCBzdHJ1Y3R1cmUKKyAqCisgKiBSZWdpc3RlcnMgTVNJLVggaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMgZm9yIGludGVycnVwdHMgdGhhdCBhcmUgYWN0aXZlCisgKiBpbW1lZGlhdGVseSBhZnRlciBtcG9ydCBpbml0aWFsaXphdGlvbi4gTWVzc2FnaW5nIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzCisgKiBzaG91bGQgYmUgcmVnaXN0ZXJlZCBkdXJpbmcgY29ycmVzcG9uZGluZyBvcGVuIHJlcXVlc3RzLgorICovCitzdGF0aWMgaW50IHRzaTcyMV9yZXF1ZXN0X21zaXgoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwlpbnQgZXJyID0gMDsKKworCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSURCXS52ZWN0b3IsCisJCQl0c2k3MjFfc3IycGNfY2hfbXNpeCwgMCwKKwkJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSURCXS5pcnFfbmFtZSwgKHZvaWQgKiltcG9ydCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSByZXF1ZXN0X2lycShwcml2LT5tc2l4W1RTSTcyMV9WRUNUX1BXUlhdLnZlY3RvciwKKwkJCXRzaTcyMV9zcmlvX21zaXgsIDAsCisJCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX1BXUlhdLmlycV9uYW1lLCAodm9pZCAqKW1wb3J0KTsKKwlpZiAoZXJyKQorCQlmcmVlX2lycSgKKwkJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSURCXS52ZWN0b3IsCisJCQkodm9pZCAqKW1wb3J0KTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHRzaTcyMV9lbmFibGVfbXNpeCAtIEF0dGVtcHRzIHRvIGVuYWJsZSBNU0ktWCBzdXBwb3J0IGZvciBUc2k3MjEuCisgKiBAcHJpdjogcG9pbnRlciB0byB0c2k3MjEgcHJpdmF0ZSBkYXRhCisgKgorICogQ29uZmlndXJlcyBNU0ktWCBzdXBwb3J0IGZvciBUc2k3MjEuIFN1cHBvcnRzIG9ubHkgYW4gZXhhY3QgbnVtYmVyCisgKiBvZiByZXF1ZXN0ZWQgdmVjdG9ycy4KKyAqLworc3RhdGljIGludCB0c2k3MjFfZW5hYmxlX21zaXgoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYpCit7CisJc3RydWN0IG1zaXhfZW50cnkgZW50cmllc1tUU0k3MjFfVkVDVF9NQVhdOworCWludCBlcnI7CisJaW50IGk7CisKKwllbnRyaWVzW1RTSTcyMV9WRUNUX0lEQl0uZW50cnkgPSBUU0k3MjFfTVNJWF9TUjJQQ19JREJRX1JDVihJREJfUVVFVUUpOworCWVudHJpZXNbVFNJNzIxX1ZFQ1RfUFdSWF0uZW50cnkgPSBUU0k3MjFfTVNJWF9TUklPX01BQ19JTlQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgTVNJLVggZW50cmllcyBmb3IgTWVzc2FnaW5nIEVuZ2luZToKKwkgKiB0aGlzIGRyaXZlciBzdXBwb3J0cyBmb3VyIFJJTyBtYWlsYm94ZXMgKGluYm91bmQgYW5kIG91dGJvdW5kKQorCSAqIE5PVEU6IEluYm91bmQgbWVzc2FnZSBNQk9YIDAuLi40IHVzZSBJQiBjaGFubmVscyA0Li4uNy4gVGhlcmVmb3JlCisJICogb2Zmc2V0ICs0IGlzIGFkZGVkIHRvIElCIE1CT1ggbnVtYmVyLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBSSU9fTUFYX01CT1g7IGkrKykgeworCQllbnRyaWVzW1RTSTcyMV9WRUNUX0lNQjBfUkNWICsgaV0uZW50cnkgPQorCQkJCQlUU0k3MjFfTVNJWF9JTVNHX0RRX1JDVihpICsgNCk7CisJCWVudHJpZXNbVFNJNzIxX1ZFQ1RfSU1CMF9JTlQgKyBpXS5lbnRyeSA9CisJCQkJCVRTSTcyMV9NU0lYX0lNU0dfSU5UKGkgKyA0KTsKKwkJZW50cmllc1tUU0k3MjFfVkVDVF9PTUIwX0RPTkUgKyBpXS5lbnRyeSA9CisJCQkJCVRTSTcyMV9NU0lYX09NU0dfRE9ORShpKTsKKwkJZW50cmllc1tUU0k3MjFfVkVDVF9PTUIwX0lOVCArIGldLmVudHJ5ID0KKwkJCQkJVFNJNzIxX01TSVhfT01TR19JTlQoaSk7CisJfQorCisJZXJyID0gcGNpX2VuYWJsZV9tc2l4KHByaXYtPnBkZXYsIGVudHJpZXMsIEFSUkFZX1NJWkUoZW50cmllcykpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA+IDApCisJCQlkZXZfaW5mbygmcHJpdi0+cGRldi0+ZGV2LAorCQkJCSAiT25seSAlZCBNU0ktWCB2ZWN0b3JzIGF2YWlsYWJsZSwgIgorCQkJCSAibm90IHVzaW5nIE1TSS1YXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogQ29weSBNU0ktWCB2ZWN0b3IgaW5mb3JtYXRpb24gaW50byB0c2k3MjEgcHJpdmF0ZSBzdHJ1Y3R1cmUKKwkgKi8KKwlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lEQl0udmVjdG9yID0gZW50cmllc1tUU0k3MjFfVkVDVF9JREJdLnZlY3RvcjsKKwlzbnByaW50Zihwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lEQl0uaXJxX25hbWUsIElSUV9ERVZJQ0VfTkFNRV9NQVgsCisJCSBEUlZfTkFNRSAiLWlkYkBwY2k6JXMiLCBwY2lfbmFtZShwcml2LT5wZGV2KSk7CisJcHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9QV1JYXS52ZWN0b3IgPSBlbnRyaWVzW1RTSTcyMV9WRUNUX1BXUlhdLnZlY3RvcjsKKwlzbnByaW50Zihwcml2LT5tc2l4W1RTSTcyMV9WRUNUX1BXUlhdLmlycV9uYW1lLCBJUlFfREVWSUNFX05BTUVfTUFYLAorCQkgRFJWX05BTUUgIi1wd3J4QHBjaTolcyIsIHBjaV9uYW1lKHByaXYtPnBkZXYpKTsKKworCWZvciAoaSA9IDA7IGkgPCBSSU9fTUFYX01CT1g7IGkrKykgeworCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lNQjBfUkNWICsgaV0udmVjdG9yID0KKwkJCQllbnRyaWVzW1RTSTcyMV9WRUNUX0lNQjBfUkNWICsgaV0udmVjdG9yOworCQlzbnByaW50Zihwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lNQjBfUkNWICsgaV0uaXJxX25hbWUsCisJCQkgSVJRX0RFVklDRV9OQU1FX01BWCwgRFJWX05BTUUgIi1pbWJyJWRAcGNpOiVzIiwKKwkJCSBpLCBwY2lfbmFtZShwcml2LT5wZGV2KSk7CisKKwkJcHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9JTUIwX0lOVCArIGldLnZlY3RvciA9CisJCQkJZW50cmllc1tUU0k3MjFfVkVDVF9JTUIwX0lOVCArIGldLnZlY3RvcjsKKwkJc25wcmludGYocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9JTUIwX0lOVCArIGldLmlycV9uYW1lLAorCQkJIElSUV9ERVZJQ0VfTkFNRV9NQVgsIERSVl9OQU1FICItaW1iaSVkQHBjaTolcyIsCisJCQkgaSwgcGNpX25hbWUocHJpdi0+cGRldikpOworCisJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfT01CMF9ET05FICsgaV0udmVjdG9yID0KKwkJCQllbnRyaWVzW1RTSTcyMV9WRUNUX09NQjBfRE9ORSArIGldLnZlY3RvcjsKKwkJc25wcmludGYocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9PTUIwX0RPTkUgKyBpXS5pcnFfbmFtZSwKKwkJCSBJUlFfREVWSUNFX05BTUVfTUFYLCBEUlZfTkFNRSAiLW9tYmQlZEBwY2k6JXMiLAorCQkJIGksIHBjaV9uYW1lKHByaXYtPnBkZXYpKTsKKworCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfSU5UICsgaV0udmVjdG9yID0KKwkJCQllbnRyaWVzW1RTSTcyMV9WRUNUX09NQjBfSU5UICsgaV0udmVjdG9yOworCQlzbnByaW50Zihwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfSU5UICsgaV0uaXJxX25hbWUsCisJCQkgSVJRX0RFVklDRV9OQU1FX01BWCwgRFJWX05BTUUgIi1vbWJpJWRAcGNpOiVzIiwKKwkJCSBpLCBwY2lfbmFtZShwcml2LT5wZGV2KSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KKworc3RhdGljIGludCB0c2k3MjFfcmVxdWVzdF9pcnEoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwlpbnQgZXJyOworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZiAocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJWCkKKwkJZXJyID0gdHNpNzIxX3JlcXVlc3RfbXNpeChtcG9ydCk7CisJZWxzZQorI2VuZGlmCisJCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPnBkZXYtPmlycSwgdHNpNzIxX2lycWhhbmRsZXIsCisJCQkgIChwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0kpID8gMCA6IElSUUZfU0hBUkVELAorCQkJICBEUlZfTkFNRSwgKHZvaWQgKiltcG9ydCk7CisKKwlpZiAoZXJyKQorCQlkZXZfZXJyKCZwcml2LT5wZGV2LT5kZXYsCisJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdCwgRXJyb3I6ICVkXG4iLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB0c2k3MjFfaW5pdF9wYzJzcl9tYXBwaW5nIC0gaW5pdGlhbGl6ZXMgb3V0Ym91bmQgKFBDSWUtPlNSSU8pCisgKiB0cmFuc2xhdGlvbiByZWdpb25zLgorICogQHByaXY6IHBvaW50ZXIgdG8gdHNpNzIxIHByaXZhdGUgZGF0YQorICoKKyAqIERpc2FibGVzIFNSRVAgdHJhbnNsYXRpb24gcmVnaW9ucy4KKyAqLworc3RhdGljIHZvaWQgdHNpNzIxX2luaXRfcGMyc3JfbWFwcGluZyhzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdikKK3sKKwlpbnQgaTsKKworCS8qIERpc2FibGUgYWxsIFBDMlNSIHRyYW5zbGF0aW9uIHdpbmRvd3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFNJNzIxX09CV0lOX05VTTsgaSsrKQorCQlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9PQldJTkxCKGkpKTsKK30KKworLyoqCisgKiB0c2k3MjFfaW5pdF9zcjJwY19tYXBwaW5nIC0gaW5pdGlhbGl6ZXMgaW5ib3VuZCAoU1JJTy0+UENJZSkKKyAqIHRyYW5zbGF0aW9uIHJlZ2lvbnMuCisgKiBAcHJpdjogcG9pbnRlciB0byB0c2k3MjEgcHJpdmF0ZSBkYXRhCisgKgorICogRGlzYWJsZXMgaW5ib3VuZCB3aW5kb3dzLgorICovCitzdGF0aWMgdm9pZCB0c2k3MjFfaW5pdF9zcjJwY19tYXBwaW5nKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2KQoreworCWludCBpOworCisJLyogRGlzYWJsZSBhbGwgU1IyUEMgaW5ib3VuZCB3aW5kb3dzICovCisJZm9yIChpID0gMDsgaSA8IFRTSTcyMV9JQldJTl9OVU07IGkrKykKKwkJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJXSU5MQihpKSk7Cit9CisKKy8qKgorICogdHNpNzIxX3BvcnRfd3JpdGVfaW5pdCAtIEluYm91bmQgcG9ydCB3cml0ZSBpbnRlcmZhY2UgaW5pdAorICogQHByaXY6IHBvaW50ZXIgdG8gdHNpNzIxIHByaXZhdGUgZGF0YQorICoKKyAqIEluaXRpYWxpemVzIGluYm91bmQgcG9ydCB3cml0ZSBoYW5kbGVyLgorICogUmV0dXJucyAlMCBvbiBzdWNjZXNzIG9yICUtRU5PTUVNIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX3BvcnRfd3JpdGVfaW5pdChzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdikKK3sKKwlwcml2LT5wd19kaXNjYXJkX2NvdW50ID0gMDsKKwlJTklUX1dPUksoJnByaXYtPnB3X3dvcmssIHRzaTcyMV9wd19kcGMpOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5wd19maWZvX2xvY2spOworCWlmIChrZmlmb19hbGxvYygmcHJpdi0+cHdfZmlmbywKKwkJCVRTSTcyMV9SSU9fUFdfTVNHX1NJWkUgKiAzMiwgR0ZQX0tFUk5FTCkpIHsKKwkJZGV2X2VycigmcHJpdi0+cGRldi0+ZGV2LCAiUFcgRklGTyBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFVzZSByZWxpYWJsZSBwb3J0LXdyaXRlIGNhcHR1cmUgbW9kZSAqLworCWlvd3JpdGUzMihUU0k3MjFfUklPX1BXX0NUTF9QV0NfUkVMLCBwcml2LT5yZWdzICsgVFNJNzIxX1JJT19QV19DVEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRzaTcyMV9kb29yYmVsbF9pbml0KHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2KQoreworCS8qIE91dGJvdW5kIERvb3JiZWxscyBkbyBub3QgcmVxdWlyZSBhbnkgc2V0dXAuCisJICogVHNpNzIxIHVzZXMgZGVkaWNhdGVkIFBDSSBCQVIxIHRvIGdlbmVyYXRlIGRvb3JiZWxscy4KKwkgKiBUaGF0IEJBUjEgd2FzIG1hcHBlZCBkdXJpbmcgdGhlIHByb2JlIHJvdXRpbmUuCisJICovCisKKwkvKiBJbml0aWFsaXplIEluYm91bmQgRG9vcmJlbGwgcHJvY2Vzc2luZyBEUEMgYW5kIHF1ZXVlICovCisJcHJpdi0+ZGJfZGlzY2FyZF9jb3VudCA9IDA7CisJSU5JVF9XT1JLKCZwcml2LT5pZGJfd29yaywgdHNpNzIxX2RiX2RwYyk7CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIGluYm91bmQgZG9vcmJlbGxzIHF1ZXVlICovCisJcHJpdi0+aWRiX2Jhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJCQlJREJfUVNJWkUgKiBUU0k3MjFfSURCX0VOVFJZX1NJWkUsCisJCQkJJnByaXYtPmlkYl9kbWEsIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+aWRiX2Jhc2UpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHByaXYtPmlkYl9iYXNlLCAwLCBJREJfUVNJWkUgKiBUU0k3MjFfSURCX0VOVFJZX1NJWkUpOworCisJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LCAiQWxsb2NhdGVkIElEQiBidWZmZXIgQCAlcCAocGh5cyA9ICVsbHgpXG4iLAorCQlwcml2LT5pZGJfYmFzZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylwcml2LT5pZGJfZG1hKTsKKworCWlvd3JpdGUzMihUU0k3MjFfSURRX1NJWkVfVkFMKElEQl9RU0laRSksCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfSURRX1NJWkUoSURCX1FVRVVFKSk7CisJaW93cml0ZTMyKCgodTY0KXByaXYtPmlkYl9kbWEgPj4gMzIpLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0lEUV9CQVNFVShJREJfUVVFVUUpKTsKKwlpb3dyaXRlMzIoKCh1NjQpcHJpdi0+aWRiX2RtYSAmIFRTSTcyMV9JRFFfQkFTRUxfQUREUiksCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfSURRX0JBU0VMKElEQl9RVUVVRSkpOworCS8qIEVuYWJsZSBhY2NlcHRpbmcgYWxsIGluYm91bmQgZG9vcmJlbGxzICovCisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfSURRX01BU0soSURCX1FVRVVFKSk7CisKKwlpb3dyaXRlMzIoVFNJNzIxX0lEUV9JTklULCBwcml2LT5yZWdzICsgVFNJNzIxX0lEUV9DVEwoSURCX1FVRVVFKSk7CisKKwlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9JRFFfUlAoSURCX1FVRVVFKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHNpNzIxX2Rvb3JiZWxsX2ZyZWUoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYpCit7CisJaWYgKHByaXYtPmlkYl9iYXNlID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIEZyZWUgYnVmZmVyIGFsbG9jYXRlZCBmb3IgaW5ib3VuZCBkb29yYmVsbCBxdWV1ZSAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsIElEQl9RU0laRSAqIFRTSTcyMV9JREJfRU5UUllfU0laRSwKKwkJCSAgcHJpdi0+aWRiX2Jhc2UsIHByaXYtPmlkYl9kbWEpOworCXByaXYtPmlkYl9iYXNlID0gTlVMTDsKK30KKworc3RhdGljIGludCB0c2k3MjFfYmRtYV9jaF9pbml0KHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2LCBpbnQgY2hudW0pCit7CisJc3RydWN0IHRzaTcyMV9kbWFfZGVzYyAqYmRfcHRyOworCXU2NAkJKnN0c19wdHI7CisJZG1hX2FkZHJfdAliZF9waHlzLCBzdHNfcGh5czsKKwlpbnQJCXN0c19zaXplOworCWludAkJYmRfbnVtID0gcHJpdi0+YmRtYVtjaG51bV0uYmRfbnVtOworCisJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LCAiSW5pdCBCbG9jayBETUEgRW5naW5lLCBDSCVkXG4iLCBjaG51bSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgRE1BIGNoYW5uZWwgZm9yIG1haW50ZW5hbmNlIHJlcXVlc3RzCisJICovCisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgRE1BIGRlc2NyaXB0b3JzICovCisJYmRfcHRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCQkJCWJkX251bSAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9kZXNjKSwKKwkJCQkJJmJkX3BoeXMsIEdGUF9LRVJORUwpOworCWlmICghYmRfcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPmJkbWFbY2hudW1dLmJkX3BoeXMgPSBiZF9waHlzOworCXByaXYtPmJkbWFbY2hudW1dLmJkX2Jhc2UgPSBiZF9wdHI7CisKKwltZW1zZXQoYmRfcHRyLCAwLCBiZF9udW0gKiBzaXplb2Yoc3RydWN0IHRzaTcyMV9kbWFfZGVzYykpOworCisJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LCAiRE1BIGRlc2NyaXB0b3JzIEAgJXAgKHBoeXMgPSAlbGx4KVxuIiwKKwkJYmRfcHRyLCAodW5zaWduZWQgbG9uZyBsb25nKWJkX3BoeXMpOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIGRlc2NyaXB0b3Igc3RhdHVzIEZJRk8gKi8KKwlzdHNfc2l6ZSA9IChiZF9udW0gPj0gVFNJNzIxX0RNQV9NSU5TVFNTWikgPworCQkJCQliZF9udW0gOiBUU0k3MjFfRE1BX01JTlNUU1NaOworCXN0c19zaXplID0gcm91bmR1cF9wb3dfb2ZfdHdvKHN0c19zaXplKTsKKwlzdHNfcHRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCQkJICAgICBzdHNfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9zdHMpLAorCQkJCSAgICAgJnN0c19waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0c19wdHIpIHsKKwkJLyogRnJlZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIERNQSBkZXNjcmlwdG9ycyAqLworCQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQkJCSAgYmRfbnVtICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX2Rlc2MpLAorCQkJCSAgYmRfcHRyLCBiZF9waHlzKTsKKwkJcHJpdi0+YmRtYVtjaG51bV0uYmRfYmFzZSA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaXYtPmJkbWFbY2hudW1dLnN0c19waHlzID0gc3RzX3BoeXM7CisJcHJpdi0+YmRtYVtjaG51bV0uc3RzX2Jhc2UgPSBzdHNfcHRyOworCXByaXYtPmJkbWFbY2hudW1dLnN0c19zaXplID0gc3RzX3NpemU7CisKKwltZW1zZXQoc3RzX3B0ciwgMCwgc3RzX3NpemUpOworCisJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LAorCQkiZGVzYyBzdGF0dXMgRklGTyBAICVwIChwaHlzID0gJWxseCkgc2l6ZT0weCV4XG4iLAorCQlzdHNfcHRyLCAodW5zaWduZWQgbG9uZyBsb25nKXN0c19waHlzLCBzdHNfc2l6ZSk7CisKKwkvKiBJbml0aWFsaXplIERNQSBkZXNjcmlwdG9ycyByaW5nICovCisJYmRfcHRyW2JkX251bSAtIDFdLnR5cGVfaWQgPSBjcHVfdG9fbGUzMihEVFlQRTMgPDwgMjkpOworCWJkX3B0cltiZF9udW0gLSAxXS5uZXh0X2xvID0gY3B1X3RvX2xlMzIoKHU2NCliZF9waHlzICYKKwkJCQkJCSBUU0k3MjFfRE1BQ19EUFRSTF9NQVNLKTsKKwliZF9wdHJbYmRfbnVtIC0gMV0ubmV4dF9oaSA9IGNwdV90b19sZTMyKCh1NjQpYmRfcGh5cyA+PiAzMik7CisKKwkvKiBTZXR1cCBETUEgZGVzY3JpcHRvciBwb2ludGVycyAqLworCWlvd3JpdGUzMigoKHU2NCliZF9waHlzID4+IDMyKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RQVFJIKGNobnVtKSk7CisJaW93cml0ZTMyKCgodTY0KWJkX3BoeXMgJiBUU0k3MjFfRE1BQ19EUFRSTF9NQVNLKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RQVFJMKGNobnVtKSk7CisKKwkvKiBTZXR1cCBkZXNjcmlwdG9yIHN0YXR1cyBGSUZPICovCisJaW93cml0ZTMyKCgodTY0KXN0c19waHlzID4+IDMyKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RTQkgoY2hudW0pKTsKKwlpb3dyaXRlMzIoKCh1NjQpc3RzX3BoeXMgJiBUU0k3MjFfRE1BQ19EU0JMX01BU0spLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0RNQUNfRFNCTChjaG51bSkpOworCWlvd3JpdGUzMihUU0k3MjFfRE1BQ19EU1NaX1NJWkUoc3RzX3NpemUpLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0RNQUNfRFNTWihjaG51bSkpOworCisJLyogQ2xlYXIgaW50ZXJydXB0IGJpdHMgKi8KKwlpb3dyaXRlMzIoVFNJNzIxX0RNQUNfSU5UX0FMTCwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0lOVChjaG51bSkpOworCisJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0lOVChjaG51bSkpOworCisJLyogVG9nZ2xlIERNQSBjaGFubmVsIGluaXRpYWxpemF0aW9uICovCisJaW93cml0ZTMyKFRTSTcyMV9ETUFDX0NUTF9JTklULAlwcml2LT5yZWdzICsgVFNJNzIxX0RNQUNfQ1RMKGNobnVtKSk7CisJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0NUTChjaG51bSkpOworCXVkZWxheSgxMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0c2k3MjFfYmRtYV9jaF9mcmVlKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2LCBpbnQgY2hudW0pCit7CisJdTMyIGNoX3N0YXQ7CisKKwlpZiAocHJpdi0+YmRtYVtjaG51bV0uYmRfYmFzZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIGlmIERNQSBjaGFubmVsIHN0aWxsIHJ1bm5pbmcgKi8KKwljaF9zdGF0ID0gaW9yZWFkMzIocHJpdi0+cmVncyArCVRTSTcyMV9ETUFDX1NUUyhjaG51bSkpOworCWlmIChjaF9zdGF0ICYgVFNJNzIxX0RNQUNfU1RTX1JVTikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBQdXQgRE1BIGNoYW5uZWwgaW50byBpbml0IHN0YXRlICovCisJaW93cml0ZTMyKFRTSTcyMV9ETUFDX0NUTF9JTklULAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0RNQUNfQ1RMKGNobnVtKSk7CisKKwkvKiBGcmVlIHNwYWNlIGFsbG9jYXRlZCBmb3IgRE1BIGRlc2NyaXB0b3JzICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJcHJpdi0+YmRtYVtjaG51bV0uYmRfbnVtICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX2Rlc2MpLAorCQlwcml2LT5iZG1hW2NobnVtXS5iZF9iYXNlLCBwcml2LT5iZG1hW2NobnVtXS5iZF9waHlzKTsKKwlwcml2LT5iZG1hW2NobnVtXS5iZF9iYXNlID0gTlVMTDsKKworCS8qIEZyZWUgc3BhY2UgYWxsb2NhdGVkIGZvciBzdGF0dXMgRklGTyAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCXByaXYtPmJkbWFbY2hudW1dLnN0c19zaXplICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX3N0cyksCisJCXByaXYtPmJkbWFbY2hudW1dLnN0c19iYXNlLCBwcml2LT5iZG1hW2NobnVtXS5zdHNfcGh5cyk7CisJcHJpdi0+YmRtYVtjaG51bV0uc3RzX2Jhc2UgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRzaTcyMV9iZG1hX2luaXQoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYpCit7CisJLyogSW5pdGlhbGl6ZSBCRE1BIGNoYW5uZWwgYWxsb2NhdGVkIGZvciBSYXBpZElPIG1haW50ZW5hbmNlIHJlYWQvd3JpdGUKKwkgKiByZXF1ZXN0IGdlbmVyYXRpb24KKwkgKi8KKwlwcml2LT5iZG1hW1RTSTcyMV9ETUFDSF9NQUlOVF0uYmRfbnVtID0gMjsKKwlpZiAodHNpNzIxX2JkbWFfY2hfaW5pdChwcml2LCBUU0k3MjFfRE1BQ0hfTUFJTlQpKSB7CisJCWRldl9lcnIoJnByaXYtPnBkZXYtPmRldiwgIlVuYWJsZSB0byBpbml0aWFsaXplIG1haW50ZW5hbmNlIERNQSIKKwkJCSIgY2hhbm5lbCAlZCwgYWJvcnRpbmdcbiIsIFRTSTcyMV9ETUFDSF9NQUlOVCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0c2k3MjFfYmRtYV9mcmVlKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2KQoreworCXRzaTcyMV9iZG1hX2NoX2ZyZWUocHJpdiwgVFNJNzIxX0RNQUNIX01BSU5UKTsKK30KKworLyogRW5hYmxlIEluYm91bmQgTWVzc2FnaW5nIEludGVycnVwdHMgKi8KK3N0YXRpYyB2b2lkCit0c2k3MjFfaW1zZ19pbnRlcnJ1cHRfZW5hYmxlKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2LCBpbnQgY2gsCisJCQkJICB1MzIgaW50ZV9tYXNrKQoreworCXUzMiBydmFsOworCisJaWYgKCFpbnRlX21hc2spCisJCXJldHVybjsKKworCS8qIENsZWFyIHBlbmRpbmcgSW5ib3VuZCBNZXNzYWdpbmcgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMihpbnRlX21hc2ssIHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0lOVChjaCkpOworCisJLyogRW5hYmxlIEluYm91bmQgTWVzc2FnaW5nIGludGVycnVwdHMgKi8KKwlydmFsID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9JQkRNQUNfSU5URShjaCkpOworCWlvd3JpdGUzMihydmFsIHwgaW50ZV9tYXNrLCBwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19JTlRFKGNoKSk7CisKKwlpZiAocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJWCkKKwkJcmV0dXJuOyAvKiBGaW5pc2hlZCBpZiB3ZSBhcmUgaW4gTVNJLVggbW9kZSAqLworCisJLyoKKwkgKiBGb3IgTVNJIGFuZCBJTlRBIGludGVycnVwdCBzaWduYWxsaW5nIHdlIG5lZWQgdG8gZW5hYmxlIG5leHQgbGV2ZWxzCisJICovCisKKwkvKiBFbmFibGUgRGV2aWNlIENoYW5uZWwgSW50ZXJydXB0ICovCisJcnZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7CisJaW93cml0ZTMyKHJ2YWwgfCBUU0k3MjFfSU5UX0lNU0dfQ0hBTihjaCksCisJCSAgcHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKK30KKworLyogRGlzYWJsZSBJbmJvdW5kIE1lc3NhZ2luZyBJbnRlcnJ1cHRzICovCitzdGF0aWMgdm9pZAordHNpNzIxX2ltc2dfaW50ZXJydXB0X2Rpc2FibGUoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYsIGludCBjaCwKKwkJCQkgICB1MzIgaW50ZV9tYXNrKQoreworCXUzMiBydmFsOworCisJaWYgKCFpbnRlX21hc2spCisJCXJldHVybjsKKworCS8qIENsZWFyIHBlbmRpbmcgSW5ib3VuZCBNZXNzYWdpbmcgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMihpbnRlX21hc2ssIHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0lOVChjaCkpOworCisJLyogRGlzYWJsZSBJbmJvdW5kIE1lc3NhZ2luZyBpbnRlcnJ1cHRzICovCisJcnZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0lOVEUoY2gpKTsKKwlydmFsICY9IH5pbnRlX21hc2s7CisJaW93cml0ZTMyKHJ2YWwsIHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0lOVEUoY2gpKTsKKworCWlmIChwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0lYKQorCQlyZXR1cm47IC8qIEZpbmlzaGVkIGlmIHdlIGFyZSBpbiBNU0ktWCBtb2RlICovCisKKwkvKgorCSAqIEZvciBNU0kgYW5kIElOVEEgaW50ZXJydXB0IHNpZ25hbGxpbmcgd2UgbmVlZCB0byBkaXNhYmxlIG5leHQgbGV2ZWxzCisJICovCisKKwkvKiBEaXNhYmxlIERldmljZSBDaGFubmVsIEludGVycnVwdCAqLworCXJ2YWwgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCXJ2YWwgJj0gflRTSTcyMV9JTlRfSU1TR19DSEFOKGNoKTsKKwlpb3dyaXRlMzIocnZhbCwgcHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKK30KKworLyogRW5hYmxlIE91dGJvdW5kIE1lc3NhZ2luZyBpbnRlcnJ1cHRzICovCitzdGF0aWMgdm9pZAordHNpNzIxX29tc2dfaW50ZXJydXB0X2VuYWJsZShzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiwgaW50IGNoLAorCQkJCSAgdTMyIGludGVfbWFzaykKK3sKKwl1MzIgcnZhbDsKKworCWlmICghaW50ZV9tYXNrKQorCQlyZXR1cm47CisKKwkvKiBDbGVhciBwZW5kaW5nIE91dGJvdW5kIE1lc3NhZ2luZyBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKGludGVfbWFzaywgcHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfSU5UKGNoKSk7CisKKwkvKiBFbmFibGUgT3V0Ym91bmQgTWVzc2FnaW5nIGNoYW5uZWwgaW50ZXJydXB0cyAqLworCXJ2YWwgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19JTlRFKGNoKSk7CisJaW93cml0ZTMyKHJ2YWwgfCBpbnRlX21hc2ssIHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0lOVEUoY2gpKTsKKworCWlmIChwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0lYKQorCQlyZXR1cm47IC8qIEZpbmlzaGVkIGlmIHdlIGFyZSBpbiBNU0ktWCBtb2RlICovCisKKwkvKgorCSAqIEZvciBNU0kgYW5kIElOVEEgaW50ZXJydXB0IHNpZ25hbGxpbmcgd2UgbmVlZCB0byBlbmFibGUgbmV4dCBsZXZlbHMKKwkgKi8KKworCS8qIEVuYWJsZSBEZXZpY2UgQ2hhbm5lbCBJbnRlcnJ1cHQgKi8KKwlydmFsID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKKwlpb3dyaXRlMzIocnZhbCB8IFRTSTcyMV9JTlRfT01TR19DSEFOKGNoKSwKKwkJICBwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworfQorCisvKiBEaXNhYmxlIE91dGJvdW5kIE1lc3NhZ2luZyBpbnRlcnJ1cHRzICovCitzdGF0aWMgdm9pZAordHNpNzIxX29tc2dfaW50ZXJydXB0X2Rpc2FibGUoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYsIGludCBjaCwKKwkJCQkgICB1MzIgaW50ZV9tYXNrKQoreworCXUzMiBydmFsOworCisJaWYgKCFpbnRlX21hc2spCisJCXJldHVybjsKKworCS8qIENsZWFyIHBlbmRpbmcgT3V0Ym91bmQgTWVzc2FnaW5nIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoaW50ZV9tYXNrLCBwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19JTlQoY2gpKTsKKworCS8qIERpc2FibGUgT3V0Ym91bmQgTWVzc2FnaW5nIGludGVycnVwdHMgKi8KKwlydmFsID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfSU5URShjaCkpOworCXJ2YWwgJj0gfmludGVfbWFzazsKKwlpb3dyaXRlMzIocnZhbCwgcHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfSU5URShjaCkpOworCisJaWYgKHByaXYtPmZsYWdzICYgVFNJNzIxX1VTSU5HX01TSVgpCisJCXJldHVybjsgLyogRmluaXNoZWQgaWYgd2UgYXJlIGluIE1TSS1YIG1vZGUgKi8KKworCS8qCisJICogRm9yIE1TSSBhbmQgSU5UQSBpbnRlcnJ1cHQgc2lnbmFsbGluZyB3ZSBuZWVkIHRvIGRpc2FibGUgbmV4dCBsZXZlbHMKKwkgKi8KKworCS8qIERpc2FibGUgRGV2aWNlIENoYW5uZWwgSW50ZXJydXB0ICovCisJcnZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7CisJcnZhbCAmPSB+VFNJNzIxX0lOVF9PTVNHX0NIQU4oY2gpOworCWlvd3JpdGUzMihydmFsLCBwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworfQorCisvKioKKyAqIHRzaTcyMV9hZGRfb3V0Yl9tZXNzYWdlIC0gQWRkIG1lc3NhZ2UgdG8gdGhlIFRzaTcyMSBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlCisgKiBAbXBvcnQ6IE1hc3RlciBwb3J0IHdpdGggb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZQorICogQHJkZXY6IFRhcmdldCBvZiBvdXRib3VuZCBtZXNzYWdlCisgKiBAbWJveDogT3V0Ym91bmQgbWFpbGJveAorICogQGJ1ZmZlcjogTWVzc2FnZSB0byBhZGQgdG8gb3V0Ym91bmQgcXVldWUKKyAqIEBsZW46IExlbmd0aCBvZiBtZXNzYWdlCisgKi8KK3N0YXRpYyBpbnQKK3RzaTcyMV9hZGRfb3V0Yl9tZXNzYWdlKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBzdHJ1Y3QgcmlvX2RldiAqcmRldiwgaW50IG1ib3gsCisJCQl2b2lkICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgdHNpNzIxX29tc2dfZGVzYyAqZGVzYzsKKwl1MzIgdHhfc2xvdDsKKworCWlmICghcHJpdi0+b21zZ19pbml0W21ib3hdIHx8CisJICAgIGxlbiA+IFRTSTcyMV9NU0dfTUFYX1NJWkUgfHwgbGVuIDwgOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eF9zbG90ID0gcHJpdi0+b21zZ19yaW5nW21ib3hdLnR4X3Nsb3Q7CisKKwkvKiBDb3B5IGNvcHkgbWVzc2FnZSBpbnRvIHRyYW5zZmVyIGJ1ZmZlciAqLworCW1lbWNweShwcml2LT5vbXNnX3JpbmdbbWJveF0ub21xX2Jhc2VbdHhfc2xvdF0sIGJ1ZmZlciwgbGVuKTsKKworCWlmIChsZW4gJiAweDcpCisJCWxlbiArPSA4OworCisJLyogQnVpbGQgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggYnVmZmVyICovCisJZGVzYyA9IHByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfYmFzZTsKKwlkZXNjW3R4X3Nsb3RdLnR5cGVfaWQgPSBjcHVfdG9fbGUzMigoRFRZUEU0IDw8IDI5KSB8IHJkZXYtPmRlc3RpZCk7CisJaWYgKHR4X3Nsb3QgJSA0ID09IDApCisJCWRlc2NbdHhfc2xvdF0udHlwZV9pZCB8PSBjcHVfdG9fbGUzMihUU0k3MjFfT01EX0lPRik7CisKKwlkZXNjW3R4X3Nsb3RdLm1zZ19pbmZvID0KKwkJY3B1X3RvX2xlMzIoKG1wb3J0LT5zeXNfc2l6ZSA8PCAyNikgfCAobWJveCA8PCAyMikgfAorCQkJICAgICgweGUgPDwgMTIpIHwgKGxlbiAmIDB4ZmY4KSk7CisJZGVzY1t0eF9zbG90XS5idWZwdHJfbG8gPQorCQljcHVfdG9fbGUzMigodTY0KXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbXFfcGh5c1t0eF9zbG90XSAmCisJCQkgICAgMHhmZmZmZmZmZik7CisJZGVzY1t0eF9zbG90XS5idWZwdHJfaGkgPQorCQljcHVfdG9fbGUzMigodTY0KXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbXFfcGh5c1t0eF9zbG90XSA+PiAzMik7CisKKwlwcml2LT5vbXNnX3JpbmdbbWJveF0ud3JfY291bnQrKzsKKworCS8qIEdvIHRvIG5leHQgZGVzY3JpcHRvciAqLworCWlmICgrK3ByaXYtPm9tc2dfcmluZ1ttYm94XS50eF9zbG90ID09IHByaXYtPm9tc2dfcmluZ1ttYm94XS5zaXplKSB7CisJCXByaXYtPm9tc2dfcmluZ1ttYm94XS50eF9zbG90ID0gMDsKKwkJLyogTW92ZSB0aHJvdWdoIHRoZSByaW5nIGxpbmsgZGVzY3JpcHRvciBhdCB0aGUgZW5kICovCisJCXByaXYtPm9tc2dfcmluZ1ttYm94XS53cl9jb3VudCsrOworCX0KKworCW1iKCk7CisKKwkvKiBTZXQgbmV3IHdyaXRlIGNvdW50IHZhbHVlICovCisJaW93cml0ZTMyKHByaXYtPm9tc2dfcmluZ1ttYm94XS53cl9jb3VudCwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfRFdSQ05UKG1ib3gpKTsKKwlpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19EV1JDTlQobWJveCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdHNpNzIxX29tc2dfaGFuZGxlciAtIE91dGJvdW5kIE1lc3NhZ2UgSW50ZXJydXB0IEhhbmRsZXIKKyAqIEBwcml2OiBwb2ludGVyIHRvIHRzaTcyMSBwcml2YXRlIGRhdGEKKyAqIEBjaDogICBudW1iZXIgb2YgT0IgTVNHIGNoYW5uZWwgdG8gc2VydmljZQorICoKKyAqIFNlcnZpY2VzIGNoYW5uZWwgaW50ZXJydXB0cyBmcm9tIG91dGJvdW5kIG1lc3NhZ2luZyBlbmdpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHRzaTcyMV9vbXNnX2hhbmRsZXIoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYsIGludCBjaCkKK3sKKwl1MzIgb21zZ19pbnQ7CisKKwlzcGluX2xvY2soJnByaXYtPm9tc2dfcmluZ1tjaF0ubG9jayk7CisKKwlvbXNnX2ludCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0lOVChjaCkpOworCisJaWYgKG9tc2dfaW50ICYgVFNJNzIxX09CRE1BQ19JTlRfU1RfRlVMTCkKKwkJZGV2X2luZm8oJnByaXYtPnBkZXYtPmRldiwKKwkJCSJPQiBNQk9YJWQ6IFN0YXR1cyBGSUZPIGlzIGZ1bGxcbiIsIGNoKTsKKworCWlmIChvbXNnX2ludCAmIChUU0k3MjFfT0JETUFDX0lOVF9ET05FIHwgVFNJNzIxX09CRE1BQ19JTlRfSU9GX0RPTkUpKSB7CisJCXUzMiBzcmRfcHRyOworCQl1NjQgKnN0c19wdHIsIGxhc3RfcHRyID0gMCwgcHJldl9wdHIgPSAwOworCQlpbnQgaSwgajsKKwkJdTMyIHR4X3Nsb3Q7CisKKwkJLyoKKwkJICogRmluZCBsYXN0IHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgZGVzY3JpcHRvcgorCQkgKi8KKworCQkvKiBDaGVjayBhbmQgY2xlYXIgZGVzY3JpcHRvciBzdGF0dXMgRklGTyBlbnRyaWVzICovCisJCXNyZF9wdHIgPSBwcml2LT5vbXNnX3JpbmdbY2hdLnN0c19yZHB0cjsKKwkJc3RzX3B0ciA9IHByaXYtPm9tc2dfcmluZ1tjaF0uc3RzX2Jhc2U7CisJCWogPSBzcmRfcHRyICogODsKKwkJd2hpbGUgKHN0c19wdHJbal0pIHsKKwkJCWZvciAoaSA9IDA7IGkgPCA4ICYmIHN0c19wdHJbal07IGkrKywgaisrKSB7CisJCQkJcHJldl9wdHIgPSBsYXN0X3B0cjsKKwkJCQlsYXN0X3B0ciA9IGxlNjRfdG9fY3B1KHN0c19wdHJbal0pOworCQkJCXN0c19wdHJbal0gPSAwOworCQkJfQorCisJCQkrK3NyZF9wdHI7CisJCQlzcmRfcHRyICU9IHByaXYtPm9tc2dfcmluZ1tjaF0uc3RzX3NpemU7CisJCQlqID0gc3JkX3B0ciAqIDg7CisJCX0KKworCQlpZiAobGFzdF9wdHIgPT0gMCkKKwkJCWdvdG8gbm9fc3RzX3VwZGF0ZTsKKworCQlwcml2LT5vbXNnX3JpbmdbY2hdLnN0c19yZHB0ciA9IHNyZF9wdHI7CisJCWlvd3JpdGUzMihzcmRfcHRyLCBwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19EU1JQKGNoKSk7CisKKwkJaWYgKCFwcml2LT5tcG9ydC0+b3V0Yl9tc2dbY2hdLm1jYmFjaykKKwkJCWdvdG8gbm9fc3RzX3VwZGF0ZTsKKworCQkvKiBJbmZvcm0gdXBwZXIgbGF5ZXIgYWJvdXQgdHJhbnNmZXIgY29tcGxldGlvbiAqLworCisJCXR4X3Nsb3QgPSAobGFzdF9wdHIgLSAodTY0KXByaXYtPm9tc2dfcmluZ1tjaF0ub21kX3BoeXMpLworCQkJCQkJc2l6ZW9mKHN0cnVjdCB0c2k3MjFfb21zZ19kZXNjKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGlzIGlzIGEgTGluayBEZXNjcmlwdG9yIChMRCkuCisJCSAqIElmIHllcywgaWdub3JlIExEIGFuZCB1c2UgZGVzY3JpcHRvciBwcm9jZXNzZWQKKwkJICogYmVmb3JlIExELgorCQkgKi8KKwkJaWYgKHR4X3Nsb3QgPT0gcHJpdi0+b21zZ19yaW5nW2NoXS5zaXplKSB7CisJCQlpZiAocHJldl9wdHIpCisJCQkJdHhfc2xvdCA9IChwcmV2X3B0ciAtCisJCQkJCSh1NjQpcHJpdi0+b21zZ19yaW5nW2NoXS5vbWRfcGh5cykvCisJCQkJCQlzaXplb2Yoc3RydWN0IHRzaTcyMV9vbXNnX2Rlc2MpOworCQkJZWxzZQorCQkJCWdvdG8gbm9fc3RzX3VwZGF0ZTsKKwkJfQorCisJCS8qIE1vdmUgc2xvdCBpbmRleCB0byB0aGUgbmV4dCBtZXNzYWdlIHRvIGJlIHNlbnQgKi8KKwkJKyt0eF9zbG90OworCQlpZiAodHhfc2xvdCA9PSBwcml2LT5vbXNnX3JpbmdbY2hdLnNpemUpCisJCQl0eF9zbG90ID0gMDsKKwkJQlVHX09OKHR4X3Nsb3QgPj0gcHJpdi0+b21zZ19yaW5nW2NoXS5zaXplKTsKKwkJcHJpdi0+bXBvcnQtPm91dGJfbXNnW2NoXS5tY2JhY2socHJpdi0+bXBvcnQsCisJCQkJcHJpdi0+b21zZ19yaW5nW2NoXS5kZXZfaWQsIGNoLAorCQkJCXR4X3Nsb3QpOworCX0KKworbm9fc3RzX3VwZGF0ZToKKworCWlmIChvbXNnX2ludCAmIFRTSTcyMV9PQkRNQUNfSU5UX0VSUk9SKSB7CisJCS8qCisJCSogT3V0Ym91bmQgbWVzc2FnZSBvcGVyYXRpb24gYWJvcnRlZCBkdWUgdG8gZXJyb3IsCisJCSogcmVpbml0aWFsaXplIE9CIE1TRyBjaGFubmVsCisJCSovCisKKwkJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LCAiT0IgTVNHIEFCT1JUIGNoX3N0YXQ9JXhcbiIsCisJCQlpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19TVFMoY2gpKSk7CisKKwkJaW93cml0ZTMyKFRTSTcyMV9PQkRNQUNfSU5UX0VSUk9SLAorCQkJCXByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0lOVChjaCkpOworCQlpb3dyaXRlMzIoVFNJNzIxX09CRE1BQ19DVExfSU5JVCwKKwkJCQlwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19DVEwoY2gpKTsKKwkJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfQ1RMKGNoKSk7CisKKwkJLyogSW5mb3JtIHVwcGVyIGxldmVsIHRvIGNsZWFyIGFsbCBwZW5kaW5nIHR4IHNsb3RzICovCisJCWlmIChwcml2LT5tcG9ydC0+b3V0Yl9tc2dbY2hdLm1jYmFjaykKKwkJCXByaXYtPm1wb3J0LT5vdXRiX21zZ1tjaF0ubWNiYWNrKHByaXYtPm1wb3J0LAorCQkJCQlwcml2LT5vbXNnX3JpbmdbY2hdLmRldl9pZCwgY2gsCisJCQkJCXByaXYtPm9tc2dfcmluZ1tjaF0udHhfc2xvdCk7CisJCS8qIFN5bmNoIHR4X3Nsb3QgdHJhY2tpbmcgKi8KKwkJaW93cml0ZTMyKHByaXYtPm9tc2dfcmluZ1tjaF0udHhfc2xvdCwKKwkJCXByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0RSRENOVChjaCkpOworCQlpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19EUkRDTlQoY2gpKTsKKwkJcHJpdi0+b21zZ19yaW5nW2NoXS53cl9jb3VudCA9IHByaXYtPm9tc2dfcmluZ1tjaF0udHhfc2xvdDsKKwkJcHJpdi0+b21zZ19yaW5nW2NoXS5zdHNfcmRwdHIgPSAwOworCX0KKworCS8qIENsZWFyIGNoYW5uZWwgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMihvbXNnX2ludCwgcHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfSU5UKGNoKSk7CisKKwlpZiAoIShwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0lYKSkgeworCQl1MzIgY2hfaW50ZTsKKworCQkvKiBSZS1lbmFibGUgY2hhbm5lbCBpbnRlcnJ1cHRzICovCisJCWNoX2ludGUgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCQljaF9pbnRlIHw9IFRTSTcyMV9JTlRfT01TR19DSEFOKGNoKTsKKwkJaW93cml0ZTMyKGNoX2ludGUsIHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7CisJfQorCisJc3Bpbl91bmxvY2soJnByaXYtPm9tc2dfcmluZ1tjaF0ubG9jayk7Cit9CisKKy8qKgorICogdHNpNzIxX29wZW5fb3V0Yl9tYm94IC0gSW5pdGlhbGl6ZSBUc2k3MjEgb3V0Ym91bmQgbWFpbGJveAorICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgT3V0Ym91bmQgTWVzc2FnaW5nIEVuZ2luZQorICogQGRldl9pZDogRGV2aWNlIHNwZWNpZmljIHBvaW50ZXIgdG8gcGFzcyBvbiBldmVudAorICogQG1ib3g6IE1haWxib3ggdG8gb3BlbgorICogQGVudHJpZXM6IE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBvdXRib3VuZCBtYWlsYm94IHJpbmcKKyAqLworc3RhdGljIGludCB0c2k3MjFfb3Blbl9vdXRiX21ib3goc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIHZvaWQgKmRldl9pZCwKKwkJCQkgaW50IG1ib3gsIGludCBlbnRyaWVzKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJc3RydWN0IHRzaTcyMV9vbXNnX2Rlc2MgKmJkX3B0cjsKKwlpbnQgaSwgcmMgPSAwOworCisJaWYgKChlbnRyaWVzIDwgVFNJNzIxX09NU0dEX01JTl9SSU5HX1NJWkUpIHx8CisJICAgIChlbnRyaWVzID4gKFRTSTcyMV9PTVNHRF9SSU5HX1NJWkUpKSB8fAorCSAgICAoIWlzX3Bvd2VyX29mXzIoZW50cmllcykpIHx8IG1ib3ggPj0gUklPX01BWF9NQk9YKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcHJpdi0+b21zZ19yaW5nW21ib3hdLmRldl9pZCA9IGRldl9pZDsKKwlwcml2LT5vbXNnX3JpbmdbbWJveF0uc2l6ZSA9IGVudHJpZXM7CisJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19yZHB0ciA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPm9tc2dfcmluZ1ttYm94XS5sb2NrKTsKKworCS8qIE91dGJvdW5kIE1zZyBCdWZmZXIgYWxsb2NhdGlvbiBiYXNlZCBvbgorCSAgIHRoZSBudW1iZXIgb2YgbWF4aW11bSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbXFfYmFzZVtpXSA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoCisJCQkJJnByaXYtPnBkZXYtPmRldiwgVFNJNzIxX01TR19CVUZGRVJfU0laRSwKKwkJCQkmcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9waHlzW2ldLAorCQkJCUdGUF9LRVJORUwpOworCQlpZiAocHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9iYXNlW2ldID09IE5VTEwpIHsKKwkJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIE9CIE1TRyBkYXRhIGJ1ZmZlciBmb3IiCisJCQkJIiBNQk9YJWRcbiIsIG1ib3gpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXRfYnVmOworCQl9CisJfQorCisJLyogT3V0Ym91bmQgbWVzc2FnZSBkZXNjcmlwdG9yIGFsbG9jYXRpb24gKi8KKwlwcml2LT5vbXNnX3JpbmdbbWJveF0ub21kX2Jhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQoCisJCQkJJnByaXYtPnBkZXYtPmRldiwKKwkJCQkoZW50cmllcyArIDEpICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfb21zZ19kZXNjKSwKKwkJCQkmcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9iYXNlID09IE5VTEwpIHsKKwkJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LAorCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBPQiBNU0cgZGVzY3JpcHRvciBtZW1vcnkgIgorCQkJImZvciBNQk9YJWRcbiIsIG1ib3gpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisKKwlwcml2LT5vbXNnX3JpbmdbbWJveF0udHhfc2xvdCA9IDA7CisKKwkvKiBPdXRib3VuZCBtZXNzYWdlIGRlc2NyaXB0b3Igc3RhdHVzIEZJRk8gYWxsb2NhdGlvbiAqLworCXByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhlbnRyaWVzICsgMSk7CisJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19iYXNlID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCQlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX3NpemUgKgorCQkJCQkJc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX3N0cyksCisJCQkmcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19iYXNlID09IE5VTEwpIHsKKwkJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LAorCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBPQiBNU0cgZGVzY3JpcHRvciBzdGF0dXMgRklGTyAiCisJCQkiZm9yIE1CT1glZFxuIiwgbWJveCk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfZGVzYzsKKwl9CisKKwltZW1zZXQocHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19iYXNlLCAwLAorCQllbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX3N0cykpOworCisJLyoKKwkgKiBDb25maWd1cmUgT3V0Ym91bmQgTWVzc2FnaW5nIEVuZ2luZQorCSAqLworCisJLyogU2V0dXAgT3V0Ym91bmQgTWVzc2FnZSBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlpb3dyaXRlMzIoKCh1NjQpcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9waHlzID4+IDMyKSwKKwkJCXByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0RQVFJIKG1ib3gpKTsKKwlpb3dyaXRlMzIoKCh1NjQpcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9waHlzICYKKwkJCQkJVFNJNzIxX09CRE1BQ19EUFRSTF9NQVNLKSwKKwkJCXByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0RQVFJMKG1ib3gpKTsKKworCS8qIFNldHVwIE91dGJvdW5kIE1lc3NhZ2UgZGVzY3JpcHRvciBzdGF0dXMgRklGTyAqLworCWlvd3JpdGUzMigoKHU2NClwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX3BoeXMgPj4gMzIpLAorCQkJcHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfRFNCSChtYm94KSk7CisJaW93cml0ZTMyKCgodTY0KXByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfcGh5cyAmCisJCQkJCVRTSTcyMV9PQkRNQUNfRFNCTF9NQVNLKSwKKwkJCXByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0RTQkwobWJveCkpOworCWlvd3JpdGUzMihUU0k3MjFfRE1BQ19EU1NaX1NJWkUocHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19zaXplKSwKKwkJcHJpdi0+cmVncyArICh1MzIpVFNJNzIxX09CRE1BQ19EU1NaKG1ib3gpKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWlmIChwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0lYKSB7CisJCS8qIFJlcXVlc3QgaW50ZXJydXB0IHNlcnZpY2UgaWYgd2UgYXJlIGluIE1TSS1YIG1vZGUgKi8KKwkJcmMgPSByZXF1ZXN0X2lycSgKKwkJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfT01CMF9ET05FICsgbWJveF0udmVjdG9yLAorCQkJdHNpNzIxX29tc2dfbXNpeCwgMCwKKwkJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfT01CMF9ET05FICsgbWJveF0uaXJxX25hbWUsCisJCQkodm9pZCAqKW1wb3J0KTsKKworCQlpZiAocmMpIHsKKwkJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIE1TSS1YIGludGVycnVwdCBmb3IgIgorCQkJCSJPQk9YJWQtRE9ORVxuIiwgbWJveCk7CisJCQlnb3RvIG91dF9zdGF0OworCQl9CisKKwkJcmMgPSByZXF1ZXN0X2lycShwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfSU5UICsgbWJveF0udmVjdG9yLAorCQkJdHNpNzIxX29tc2dfbXNpeCwgMCwKKwkJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfT01CMF9JTlQgKyBtYm94XS5pcnFfbmFtZSwKKwkJCSh2b2lkICopbXBvcnQpOworCisJCWlmIChyYykJeworCQkJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LAorCQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgTVNJLVggaW50ZXJydXB0IGZvciAiCisJCQkJIk1CT1glZC1JTlRcbiIsIG1ib3gpOworCQkJZnJlZV9pcnEoCisJCQkJcHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9PTUIwX0RPTkUgKyBtYm94XS52ZWN0b3IsCisJCQkJKHZvaWQgKiltcG9ydCk7CisJCQlnb3RvIG91dF9zdGF0OworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKKwl0c2k3MjFfb21zZ19pbnRlcnJ1cHRfZW5hYmxlKHByaXYsIG1ib3gsIFRTSTcyMV9PQkRNQUNfSU5UX0FMTCk7CisKKwkvKiBJbml0aWFsaXplIE91dGJvdW5kIE1lc3NhZ2UgZGVzY3JpcHRvcnMgcmluZyAqLworCWJkX3B0ciA9IHByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfYmFzZTsKKwliZF9wdHJbZW50cmllc10udHlwZV9pZCA9IGNwdV90b19sZTMyKERUWVBFNSA8PCAyOSk7CisJYmRfcHRyW2VudHJpZXNdLm1zZ19pbmZvID0gMDsKKwliZF9wdHJbZW50cmllc10ubmV4dF9sbyA9CisJCWNwdV90b19sZTMyKCh1NjQpcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9waHlzICYKKwkJVFNJNzIxX09CRE1BQ19EUFRSTF9NQVNLKTsKKwliZF9wdHJbZW50cmllc10ubmV4dF9oaSA9CisJCWNwdV90b19sZTMyKCh1NjQpcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9waHlzID4+IDMyKTsKKwlwcml2LT5vbXNnX3JpbmdbbWJveF0ud3JfY291bnQgPSAwOworCW1iKCk7CisKKwkvKiBJbml0aWFsaXplIE91dGJvdW5kIE1lc3NhZ2UgZW5naW5lICovCisJaW93cml0ZTMyKFRTSTcyMV9PQkRNQUNfQ1RMX0lOSVQsIHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0NUTChtYm94KSk7CisJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfRFdSQ05UKG1ib3gpKTsKKwl1ZGVsYXkoMTApOworCisJcHJpdi0+b21zZ19pbml0W21ib3hdID0gMTsKKworCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK291dF9zdGF0OgorCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9zdHMpLAorCQlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX2Jhc2UsCisJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfcGh5cyk7CisKKwlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX2Jhc2UgPSBOVUxMOworI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKK291dF9kZXNjOgorCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCShlbnRyaWVzICsgMSkgKiBzaXplb2Yoc3RydWN0IHRzaTcyMV9vbXNnX2Rlc2MpLAorCQlwcml2LT5vbXNnX3JpbmdbbWJveF0ub21kX2Jhc2UsCisJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfcGh5cyk7CisKKwlwcml2LT5vbXNnX3JpbmdbbWJveF0ub21kX2Jhc2UgPSBOVUxMOworCitvdXRfYnVmOgorCWZvciAoaSA9IDA7IGkgPCBwcml2LT5vbXNnX3JpbmdbbWJveF0uc2l6ZTsgaSsrKSB7CisJCWlmIChwcml2LT5vbXNnX3JpbmdbbWJveF0ub21xX2Jhc2VbaV0pIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCQkJVFNJNzIxX01TR19CVUZGRVJfU0laRSwKKwkJCQlwcml2LT5vbXNnX3JpbmdbbWJveF0ub21xX2Jhc2VbaV0sCisJCQkJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9waHlzW2ldKTsKKworCQkJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9iYXNlW2ldID0gTlVMTDsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKiB0c2k3MjFfY2xvc2Vfb3V0Yl9tYm94IC0gQ2xvc2UgVHNpNzIxIG91dGJvdW5kIG1haWxib3gKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBvdXRib3VuZCBtZXNzYWdlIHVuaXQKKyAqIEBtYm94OiBNYWlsYm94IHRvIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIHRzaTcyMV9jbG9zZV9vdXRiX21ib3goc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBtYm94KQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJdTMyIGk7CisKKwlpZiAoIXByaXYtPm9tc2dfaW5pdFttYm94XSkKKwkJcmV0dXJuOworCXByaXYtPm9tc2dfaW5pdFttYm94XSA9IDA7CisKKwkvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKworCXRzaTcyMV9vbXNnX2ludGVycnVwdF9kaXNhYmxlKHByaXYsIG1ib3gsIFRTSTcyMV9PQkRNQUNfSU5UX0FMTCk7CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWlmIChwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0lYKSB7CisJCWZyZWVfaXJxKHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfT01CMF9ET05FICsgbWJveF0udmVjdG9yLAorCQkJICh2b2lkICopbXBvcnQpOworCQlmcmVlX2lycShwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfSU5UICsgbWJveF0udmVjdG9yLAorCQkJICh2b2lkICopbXBvcnQpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCisJLyogRnJlZSBPTVNHIERlc2NyaXB0b3IgU3RhdHVzIEZJRk8gKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX3NpemUgKiBzaXplb2Yoc3RydWN0IHRzaTcyMV9kbWFfc3RzKSwKKwkJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19iYXNlLAorCQlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX3BoeXMpOworCisJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19iYXNlID0gTlVMTDsKKworCS8qIEZyZWUgT01TRyBkZXNjcmlwdG9ycyAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCShwcml2LT5vbXNnX3JpbmdbbWJveF0uc2l6ZSArIDEpICoKKwkJCXNpemVvZihzdHJ1Y3QgdHNpNzIxX29tc2dfZGVzYyksCisJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfYmFzZSwKKwkJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9waHlzKTsKKworCXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfYmFzZSA9IE5VTEw7CisKKwkvKiBGcmVlIG1lc3NhZ2UgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5vbXNnX3JpbmdbbWJveF0uc2l6ZTsgaSsrKSB7CisJCWlmIChwcml2LT5vbXNnX3JpbmdbbWJveF0ub21xX2Jhc2VbaV0pIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCQkJVFNJNzIxX01TR19CVUZGRVJfU0laRSwKKwkJCQlwcml2LT5vbXNnX3JpbmdbbWJveF0ub21xX2Jhc2VbaV0sCisJCQkJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9waHlzW2ldKTsKKworCQkJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9iYXNlW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqCisgKiB0c2k3MjFfaW1zZ19oYW5kbGVyIC0gSW5ib3VuZCBNZXNzYWdlIEludGVycnVwdCBIYW5kbGVyCisgKiBAcHJpdjogcG9pbnRlciB0byB0c2k3MjEgcHJpdmF0ZSBkYXRhCisgKiBAY2g6IGluYm91bmQgbWVzc2FnZSBjaGFubmVsIG51bWJlciB0byBzZXJ2aWNlCisgKgorICogU2VydmljZXMgY2hhbm5lbCBpbnRlcnJ1cHRzIGZyb20gaW5ib3VuZCBtZXNzYWdpbmcgZW5naW5lLgorICovCitzdGF0aWMgdm9pZCB0c2k3MjFfaW1zZ19oYW5kbGVyKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2LCBpbnQgY2gpCit7CisJdTMyIG1ib3ggPSBjaCAtIDQ7CisJdTMyIGltc2dfaW50OworCisJc3Bpbl9sb2NrKCZwcml2LT5pbXNnX3JpbmdbbWJveF0ubG9jayk7CisKKwlpbXNnX2ludCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0lOVChjaCkpOworCisJaWYgKGltc2dfaW50ICYgVFNJNzIxX0lCRE1BQ19JTlRfU1JUTykKKwkJZGV2X2luZm8oJnByaXYtPnBkZXYtPmRldiwgIklCIE1CT1glZCBTUklPIHRpbWVvdXRcbiIsCisJCQltYm94KTsKKworCWlmIChpbXNnX2ludCAmIFRTSTcyMV9JQkRNQUNfSU5UX1BDX0VSUk9SKQorCQlkZXZfaW5mbygmcHJpdi0+cGRldi0+ZGV2LCAiSUIgTUJPWCVkIFBDSWUgZXJyb3JcbiIsCisJCQltYm94KTsKKworCWlmIChpbXNnX2ludCAmIFRTSTcyMV9JQkRNQUNfSU5UX0ZRX0xPVykKKwkJZGV2X2luZm8oJnByaXYtPnBkZXYtPmRldiwKKwkJCSJJQiBNQk9YJWQgSUIgZnJlZSBxdWV1ZSBsb3dcbiIsIG1ib3gpOworCisJLyogQ2xlYXIgSUIgY2hhbm5lbCBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKGltc2dfaW50LCBwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19JTlQoY2gpKTsKKworCS8qIElmIGFuIElCIE1zZyBpcyByZWNlaXZlZCBub3RpZnkgdGhlIHVwcGVyIGxheWVyICovCisJaWYgKGltc2dfaW50ICYgVFNJNzIxX0lCRE1BQ19JTlRfRFFfUkNWICYmCisJCXByaXYtPm1wb3J0LT5pbmJfbXNnW21ib3hdLm1jYmFjaykKKwkJcHJpdi0+bXBvcnQtPmluYl9tc2dbbWJveF0ubWNiYWNrKHByaXYtPm1wb3J0LAorCQkJCXByaXYtPmltc2dfcmluZ1ttYm94XS5kZXZfaWQsIG1ib3gsIC0xKTsKKworCWlmICghKHByaXYtPmZsYWdzICYgVFNJNzIxX1VTSU5HX01TSVgpKSB7CisJCXUzMiBjaF9pbnRlOworCisJCS8qIFJlLWVuYWJsZSBjaGFubmVsIGludGVycnVwdHMgKi8KKwkJY2hfaW50ZSA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7CisJCWNoX2ludGUgfD0gVFNJNzIxX0lOVF9JTVNHX0NIQU4oY2gpOworCQlpb3dyaXRlMzIoY2hfaW50ZSwgcHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKKwl9CisKKwlzcGluX3VubG9jaygmcHJpdi0+aW1zZ19yaW5nW21ib3hdLmxvY2spOworfQorCisvKioKKyAqIHRzaTcyMV9vcGVuX2luYl9tYm94IC0gSW5pdGlhbGl6ZSBUc2k3MjEgaW5ib3VuZCBtYWlsYm94CisgKiBAbXBvcnQ6IE1hc3RlciBwb3J0IGltcGxlbWVudGluZyB0aGUgSW5ib3VuZCBNZXNzYWdpbmcgRW5naW5lCisgKiBAZGV2X2lkOiBEZXZpY2Ugc3BlY2lmaWMgcG9pbnRlciB0byBwYXNzIG9uIGV2ZW50CisgKiBAbWJveDogTWFpbGJveCB0byBvcGVuCisgKiBAZW50cmllczogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGluYm91bmQgbWFpbGJveCByaW5nCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX29wZW5faW5iX21ib3goc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIHZvaWQgKmRldl9pZCwKKwkJCQlpbnQgbWJveCwgaW50IGVudHJpZXMpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwlpbnQgY2ggPSBtYm94ICsgNDsKKwlpbnQgaTsKKwl1NjQgKmZyZWVfcHRyOworCWludCByYyA9IDA7CisKKwlpZiAoKGVudHJpZXMgPCBUU0k3MjFfSU1TR0RfTUlOX1JJTkdfU0laRSkgfHwKKwkgICAgKGVudHJpZXMgPiBUU0k3MjFfSU1TR0RfUklOR19TSVpFKSB8fAorCSAgICAoIWlzX3Bvd2VyX29mXzIoZW50cmllcykpIHx8IG1ib3ggPj0gUklPX01BWF9NQk9YKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSBJQiBNZXNzYWdpbmcgUmluZyAqLworCXByaXYtPmltc2dfcmluZ1ttYm94XS5kZXZfaWQgPSBkZXZfaWQ7CisJcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemUgPSBlbnRyaWVzOworCXByaXYtPmltc2dfcmluZ1ttYm94XS5yeF9zbG90ID0gMDsKKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uZGVzY19yZHB0ciA9IDA7CisJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmZxX3dycHRyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemU7IGkrKykKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltcV9iYXNlW2ldID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aW1zZ19yaW5nW21ib3hdLmxvY2spOworCisJLyogQWxsb2NhdGUgYnVmZmVycyBmb3IgaW5jb21pbmcgbWVzc2FnZXMgKi8KKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uYnVmX2Jhc2UgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkgICBlbnRyaWVzICogVFNJNzIxX01TR19CVUZGRVJfU0laRSwKKwkJCQkgICAmcHJpdi0+aW1zZ19yaW5nW21ib3hdLmJ1Zl9waHlzLAorCQkJCSAgIEdGUF9LRVJORUwpOworCisJaWYgKHByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfYmFzZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnByaXYtPnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVycyBmb3IgSUIgTUJPWCVkXG4iLCBtYm94KTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGNpcmN1bGFyIGZyZWUgbGlzdCAqLworCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX2Jhc2UgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkgICBlbnRyaWVzICogOCwKKwkJCQkgICAmcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZnFfcGh5cywKKwkJCQkgICBHRlBfS0VSTkVMKTsKKworCWlmIChwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1mcV9iYXNlID09IE5VTEwpIHsKKwkJZGV2X2VycigmcHJpdi0+cGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmVlIHF1ZXVlIGZvciBJQiBNQk9YJWRcbiIsIG1ib3gpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEluYm91bmQgbWVzc2FnZSBkZXNjcmlwdG9ycyAqLworCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWRfYmFzZSA9CisJCWRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQkJCSAgIGVudHJpZXMgKiBzaXplb2Yoc3RydWN0IHRzaTcyMV9pbXNnX2Rlc2MpLAorCQkJCSAgICZwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1kX3BoeXMsIEdGUF9LRVJORUwpOworCisJaWYgKHByaXYtPmltc2dfcmluZ1ttYm94XS5pbWRfYmFzZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnByaXYtPnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgZGVzY3JpcHRvciBtZW1vcnkgZm9yIElCIE1CT1glZFxuIiwKKwkJCW1ib3gpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2RtYTsKKwl9CisKKwkvKiBGaWxsIGZyZWUgYnVmZmVyIHBvaW50ZXIgbGlzdCAqLworCWZyZWVfcHRyID0gcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZnFfYmFzZTsKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQorCQlmcmVlX3B0cltpXSA9IGNwdV90b19sZTY0KAorCQkJCSh1NjQpKHByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfcGh5cykgKworCQkJCWkgKiAweDEwMDApOworCisJbWIoKTsKKworCS8qCisJICogRm9yIG1hcHBpbmcgb2YgaW5ib3VuZCBTUklPIE1lc3NhZ2VzIGludG8gYXBwcm9wcmlhdGUgcXVldWVzIHdlIG5lZWQKKwkgKiB0byBzZXQgSW5ib3VuZCBEZXZpY2UgSUQgcmVnaXN0ZXIgaW4gdGhlIG1lc3NhZ2luZyBlbmdpbmUuIFdlIGRvIGl0CisJICogb25jZSB3aGVuIGZpcnN0IGluYm91bmQgbWFpbGJveCBpcyByZXF1ZXN0ZWQuCisJICovCisJaWYgKCEocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfSU1TR0lEX1NFVCkpIHsKKwkJaW93cml0ZTMyKCh1MzIpcHJpdi0+bXBvcnQtPmhvc3RfZGV2aWNlaWQsCisJCQlwcml2LT5yZWdzICsgVFNJNzIxX0lCX0RFVklEKTsKKwkJcHJpdi0+ZmxhZ3MgfD0gVFNJNzIxX0lNU0dJRF9TRVQ7CisJfQorCisJLyoKKwkgKiBDb25maWd1cmUgSW5ib3VuZCBNZXNzYWdpbmcgY2hhbm5lbCAoY2ggPSBtYm94ICsgNCkKKwkgKi8KKworCS8qIFNldHVwIEluYm91bmQgTWVzc2FnZSBmcmVlIHF1ZXVlICovCisJaW93cml0ZTMyKCgodTY0KXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX3BoeXMgPj4gMzIpLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19GUUJIKGNoKSk7CisJaW93cml0ZTMyKCgodTY0KXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX3BoeXMgJgorCQkJVFNJNzIxX0lCRE1BQ19GUUJMX01BU0spLAorCQlwcml2LT5yZWdzK1RTSTcyMV9JQkRNQUNfRlFCTChjaCkpOworCWlvd3JpdGUzMihUU0k3MjFfRE1BQ19EU1NaX1NJWkUoZW50cmllcyksCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0ZRU1ooY2gpKTsKKworCS8qIFNldHVwIEluYm91bmQgTWVzc2FnZSBkZXNjcmlwdG9yIHF1ZXVlICovCisJaW93cml0ZTMyKCgodTY0KXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWRfcGh5cyA+PiAzMiksCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0RRQkgoY2gpKTsKKwlpb3dyaXRlMzIoKCh1MzIpcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZF9waHlzICYKKwkJICAgKHUzMilUU0k3MjFfSUJETUFDX0RRQkxfTUFTSyksCisJCXByaXYtPnJlZ3MrVFNJNzIxX0lCRE1BQ19EUUJMKGNoKSk7CisJaW93cml0ZTMyKFRTSTcyMV9ETUFDX0RTU1pfU0laRShlbnRyaWVzKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9JQkRNQUNfRFFTWihjaCkpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJaWYgKHByaXYtPmZsYWdzICYgVFNJNzIxX1VTSU5HX01TSVgpIHsKKwkJLyogUmVxdWVzdCBpbnRlcnJ1cHQgc2VydmljZSBpZiB3ZSBhcmUgaW4gTVNJLVggbW9kZSAqLworCQlyYyA9IHJlcXVlc3RfaXJxKHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSU1CMF9SQ1YgKyBtYm94XS52ZWN0b3IsCisJCQl0c2k3MjFfaW1zZ19tc2l4LCAwLAorCQkJcHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9JTUIwX1JDViArIG1ib3hdLmlycV9uYW1lLAorCQkJKHZvaWQgKiltcG9ydCk7CisKKwkJaWYgKHJjKSB7CisJCQlkZXZfZGJnKCZwcml2LT5wZGV2LT5kZXYsCisJCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBNU0ktWCBpbnRlcnJ1cHQgZm9yICIKKwkJCQkiSUJPWCVkLURPTkVcbiIsIG1ib3gpOworCQkJZ290byBvdXRfZGVzYzsKKwkJfQorCisJCXJjID0gcmVxdWVzdF9pcnEocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9JTUIwX0lOVCArIG1ib3hdLnZlY3RvciwKKwkJCXRzaTcyMV9pbXNnX21zaXgsIDAsCisJCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lNQjBfSU5UICsgbWJveF0uaXJxX25hbWUsCisJCQkodm9pZCAqKW1wb3J0KTsKKworCQlpZiAocmMpCXsKKwkJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIE1TSS1YIGludGVycnVwdCBmb3IgIgorCQkJCSJJQk9YJWQtSU5UXG4iLCBtYm94KTsKKwkJCWZyZWVfaXJxKAorCQkJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSU1CMF9SQ1YgKyBtYm94XS52ZWN0b3IsCisJCQkJKHZvaWQgKiltcG9ydCk7CisJCQlnb3RvIG91dF9kZXNjOworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKKwl0c2k3MjFfaW1zZ19pbnRlcnJ1cHRfZW5hYmxlKHByaXYsIGNoLCBUU0k3MjFfSUJETUFDX0lOVF9BTEwpOworCisJLyogSW5pdGlhbGl6ZSBJbmJvdW5kIE1lc3NhZ2UgRW5naW5lICovCisJaW93cml0ZTMyKFRTSTcyMV9JQkRNQUNfQ1RMX0lOSVQsIHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0NUTChjaCkpOworCWlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0NUTChjaCkpOworCXVkZWxheSgxMCk7CisJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmZxX3dycHRyID0gZW50cmllcyAtIDE7CisJaW93cml0ZTMyKGVudHJpZXMgLSAxLCBwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19GUVdQKGNoKSk7CisKKwlwcml2LT5pbXNnX2luaXRbbWJveF0gPSAxOworCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK291dF9kZXNjOgorCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5zaXplICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfaW1zZ19kZXNjKSwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZF9iYXNlLAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1kX3BoeXMpOworCisJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZF9iYXNlID0gTlVMTDsKKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCitvdXRfZG1hOgorCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5zaXplICogOCwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZnFfYmFzZSwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZnFfcGh5cyk7CisKKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1mcV9iYXNlID0gTlVMTDsKKworb3V0X2J1ZjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uc2l6ZSAqIFRTSTcyMV9NU0dfQlVGRkVSX1NJWkUsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfYmFzZSwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmJ1Zl9waHlzKTsKKworCXByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfYmFzZSA9IE5VTEw7CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogdHNpNzIxX2Nsb3NlX2luYl9tYm94IC0gU2h1dCBkb3duIFRzaTcyMSBpbmJvdW5kIG1haWxib3gKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBJbmJvdW5kIE1lc3NhZ2luZyBFbmdpbmUKKyAqIEBtYm94OiBNYWlsYm94IHRvIGNsb3NlCisgKi8KK3N0YXRpYyB2b2lkIHRzaTcyMV9jbG9zZV9pbmJfbWJveChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgaW50IG1ib3gpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwl1MzIgcnhfc2xvdDsKKwlpbnQgY2ggPSBtYm94ICsgNDsKKworCWlmICghcHJpdi0+aW1zZ19pbml0W21ib3hdKSAvKiBtYm94IGlzbid0IGluaXRpYWxpemVkIHlldCAqLworCQlyZXR1cm47CisJcHJpdi0+aW1zZ19pbml0W21ib3hdID0gMDsKKworCS8qIERpc2FibGUgSW5ib3VuZCBNZXNzYWdpbmcgRW5naW5lICovCisKKwkvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKwl0c2k3MjFfaW1zZ19pbnRlcnJ1cHRfZGlzYWJsZShwcml2LCBjaCwgVFNJNzIxX09CRE1BQ19JTlRfTUFTSyk7CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWlmIChwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0lYKSB7CisJCWZyZWVfaXJxKHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSU1CMF9SQ1YgKyBtYm94XS52ZWN0b3IsCisJCQkJKHZvaWQgKiltcG9ydCk7CisJCWZyZWVfaXJxKHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSU1CMF9JTlQgKyBtYm94XS52ZWN0b3IsCisJCQkJKHZvaWQgKiltcG9ydCk7CisJfQorI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKKwkvKiBDbGVhciBJbmJvdW5kIEJ1ZmZlciBRdWV1ZSAqLworCWZvciAocnhfc2xvdCA9IDA7IHJ4X3Nsb3QgPCBwcml2LT5pbXNnX3JpbmdbbWJveF0uc2l6ZTsgcnhfc2xvdCsrKQorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1xX2Jhc2Vbcnhfc2xvdF0gPSBOVUxMOworCisJLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBtZXNzYWdlIGJ1ZmZlcnMgKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uc2l6ZSAqIFRTSTcyMV9NU0dfQlVGRkVSX1NJWkUsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfYmFzZSwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmJ1Zl9waHlzKTsKKworCXByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfYmFzZSA9IE5VTEw7CisKKwkvKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGZyZWUgcG9pbnRyIGxpc3QgKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uc2l6ZSAqIDgsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX2Jhc2UsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX3BoeXMpOworCisJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZnFfYmFzZSA9IE5VTEw7CisKKwkvKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIFJYIGRlc2NyaXB0b3JzICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemUgKiBzaXplb2Yoc3RydWN0IHRzaTcyMV9pbXNnX2Rlc2MpLAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1kX2Jhc2UsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWRfcGh5cyk7CisKKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1kX2Jhc2UgPSBOVUxMOworfQorCisvKioKKyAqIHRzaTcyMV9hZGRfaW5iX2J1ZmZlciAtIEFkZCBidWZmZXIgdG8gdGhlIFRzaTcyMSBpbmJvdW5kIG1lc3NhZ2UgcXVldWUKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBJbmJvdW5kIE1lc3NhZ2luZyBFbmdpbmUKKyAqIEBtYm94OiBJbmJvdW5kIG1haWxib3ggbnVtYmVyCisgKiBAYnVmOiBCdWZmZXIgdG8gYWRkIHRvIGluYm91bmQgcXVldWUKKyAqLworc3RhdGljIGludCB0c2k3MjFfYWRkX2luYl9idWZmZXIoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBtYm94LCB2b2lkICpidWYpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwl1MzIgcnhfc2xvdDsKKwlpbnQgcmMgPSAwOworCisJcnhfc2xvdCA9IHByaXYtPmltc2dfcmluZ1ttYm94XS5yeF9zbG90OworCWlmIChwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1xX2Jhc2Vbcnhfc2xvdF0pIHsKKwkJZGV2X2VycigmcHJpdi0+cGRldi0+ZGV2LAorCQkJIkVycm9yIGFkZGluZyBpbmJvdW5kIGJ1ZmZlciAlZCwgYnVmZmVyIGV4aXN0c1xuIiwKKwkJCXJ4X3Nsb3QpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbXFfYmFzZVtyeF9zbG90XSA9IGJ1ZjsKKworCWlmICgrK3ByaXYtPmltc2dfcmluZ1ttYm94XS5yeF9zbG90ID09IHByaXYtPmltc2dfcmluZ1ttYm94XS5zaXplKQorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0ucnhfc2xvdCA9IDA7CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogdHNpNzIxX2dldF9pbmJfbWVzc2FnZSAtIEZldGNoIGluYm91bmQgbWVzc2FnZSBmcm9tIHRoZSBUc2k3MjEgTVNHIFF1ZXVlCisgKiBAbXBvcnQ6IE1hc3RlciBwb3J0IGltcGxlbWVudGluZyB0aGUgSW5ib3VuZCBNZXNzYWdpbmcgRW5naW5lCisgKiBAbWJveDogSW5ib3VuZCBtYWlsYm94IG51bWJlcgorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgbWVzc2FnZSBvbiBzdWNjZXNzIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHZvaWQgKnRzaTcyMV9nZXRfaW5iX21lc3NhZ2Uoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBtYm94KQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJc3RydWN0IHRzaTcyMV9pbXNnX2Rlc2MgKmRlc2M7CisJdTMyIHJ4X3Nsb3Q7CisJdm9pZCAqcnhfdmlydCA9IE5VTEw7CisJdTY0IHJ4X3BoeXM7CisJdm9pZCAqYnVmID0gTlVMTDsKKwl1NjQgKmZyZWVfcHRyOworCWludCBjaCA9IG1ib3ggKyA0OworCWludCBtc2dfc2l6ZTsKKworCWlmICghcHJpdi0+aW1zZ19pbml0W21ib3hdKQorCQlyZXR1cm4gTlVMTDsKKworCWRlc2MgPSBwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1kX2Jhc2U7CisJZGVzYyArPSBwcml2LT5pbXNnX3JpbmdbbWJveF0uZGVzY19yZHB0cjsKKworCWlmICghKGxlMzJfdG9fY3B1KGRlc2MtPm1zZ19pbmZvKSAmIFRTSTcyMV9JTURfSE8pKQorCQlnb3RvIG91dDsKKworCXJ4X3Nsb3QgPSBwcml2LT5pbXNnX3JpbmdbbWJveF0ucnhfc2xvdDsKKwl3aGlsZSAocHJpdi0+aW1zZ19yaW5nW21ib3hdLmltcV9iYXNlW3J4X3Nsb3RdID09IE5VTEwpIHsKKwkJaWYgKCsrcnhfc2xvdCA9PSBwcml2LT5pbXNnX3JpbmdbbWJveF0uc2l6ZSkKKwkJCXJ4X3Nsb3QgPSAwOworCX0KKworCXJ4X3BoeXMgPSAoKHU2NClsZTMyX3RvX2NwdShkZXNjLT5idWZwdHJfaGkpIDw8IDMyKSB8CisJCQlsZTMyX3RvX2NwdShkZXNjLT5idWZwdHJfbG8pOworCisJcnhfdmlydCA9IHByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfYmFzZSArCisJCSAgKHJ4X3BoeXMgLSAodTY0KXByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfcGh5cyk7CisKKwlidWYgPSBwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1xX2Jhc2Vbcnhfc2xvdF07CisJbXNnX3NpemUgPSBsZTMyX3RvX2NwdShkZXNjLT5tc2dfaW5mbykgJiBUU0k3MjFfSU1EX0JDT1VOVDsKKwlpZiAobXNnX3NpemUgPT0gMCkKKwkJbXNnX3NpemUgPSBSSU9fTUFYX01TR19TSVpFOworCisJbWVtY3B5KGJ1ZiwgcnhfdmlydCwgbXNnX3NpemUpOworCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbXFfYmFzZVtyeF9zbG90XSA9IE5VTEw7CisKKwlkZXNjLT5tc2dfaW5mbyAmPSBjcHVfdG9fbGUzMih+VFNJNzIxX0lNRF9ITyk7CisJaWYgKCsrcHJpdi0+aW1zZ19yaW5nW21ib3hdLmRlc2NfcmRwdHIgPT0gcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemUpCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5kZXNjX3JkcHRyID0gMDsKKworCWlvd3JpdGUzMihwcml2LT5pbXNnX3JpbmdbbWJveF0uZGVzY19yZHB0ciwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9JQkRNQUNfRFFSUChjaCkpOworCisJLyogUmV0dXJuIGZyZWUgYnVmZmVyIGludG8gdGhlIHBvaW50ZXIgbGlzdCAqLworCWZyZWVfcHRyID0gcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZnFfYmFzZTsKKwlmcmVlX3B0cltwcml2LT5pbXNnX3JpbmdbbWJveF0uZnFfd3JwdHJdID0gY3B1X3RvX2xlNjQocnhfcGh5cyk7CisKKwlpZiAoKytwcml2LT5pbXNnX3JpbmdbbWJveF0uZnFfd3JwdHIgPT0gcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemUpCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5mcV93cnB0ciA9IDA7CisKKwlpb3dyaXRlMzIocHJpdi0+aW1zZ19yaW5nW21ib3hdLmZxX3dycHRyLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19GUVdQKGNoKSk7CitvdXQ6CisJcmV0dXJuIGJ1ZjsKK30KKworLyoqCisgKiB0c2k3MjFfbWVzc2FnZXNfaW5pdCAtIEluaXRpYWxpemF0aW9uIG9mIE1lc3NhZ2luZyBFbmdpbmUKKyAqIEBwcml2OiBwb2ludGVyIHRvIHRzaTcyMSBwcml2YXRlIGRhdGEKKyAqCisgKiBDb25maWd1cmVzIFRzaTcyMSBtZXNzYWdpbmcgZW5naW5lLgorICovCitzdGF0aWMgaW50IHRzaTcyMV9tZXNzYWdlc19pbml0KHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2KQoreworCWludAljaDsKKworCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX1NNU0dfRUNDX0xPRyk7CisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfUkVUUllfR0VOX0NOVCk7CisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfUkVUUllfUlhfQ05UKTsKKworCS8qIFNldCBTUklPIE1lc3NhZ2UgUmVxdWVzdC9SZXNwb25zZSBUaW1lb3V0ICovCisJaW93cml0ZTMyKFRTSTcyMV9SUVJQVE9fVkFMLCBwcml2LT5yZWdzICsgVFNJNzIxX1JRUlBUTyk7CisKKwkvKiBJbml0aWFsaXplIEluYm91bmQgTWVzc2FnaW5nIEVuZ2luZSBSZWdpc3RlcnMgKi8KKwlmb3IgKGNoID0gMDsgY2ggPCBUU0k3MjFfSU1TR19DSE5VTTsgY2grKykgeworCQkvKiBDbGVhciBpbnRlcnJ1cHQgYml0cyAqLworCQlpb3dyaXRlMzIoVFNJNzIxX0lCRE1BQ19JTlRfTUFTSywKKwkJCXByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0lOVChjaCkpOworCQkvKiBDbGVhciBTdGF0dXMgKi8KKwkJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX1NUUyhjaCkpOworCisJCWlvd3JpdGUzMihUU0k3MjFfU01TR19FQ0NfQ09SX0xPR19NQVNLLAorCQkJCXByaXYtPnJlZ3MgKyBUU0k3MjFfU01TR19FQ0NfQ09SX0xPRyhjaCkpOworCQlpb3dyaXRlMzIoVFNJNzIxX1NNU0dfRUNDX05DT1JfTUFTSywKKwkJCQlwcml2LT5yZWdzICsgVFNJNzIxX1NNU0dfRUNDX05DT1IoY2gpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0c2k3MjFfZGlzYWJsZV9pbnRzIC0gZGlzYWJsZXMgYWxsIGRldmljZSBpbnRlcnJ1cHRzCisgKiBAcHJpdjogcG9pbnRlciB0byB0c2k3MjEgcHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHRzaTcyMV9kaXNhYmxlX2ludHMoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYpCit7CisJaW50IGNoOworCisJLyogRGlzYWJsZSBhbGwgZGV2aWNlIGxldmVsIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9ERVZfSU5URSk7CisKKwkvKiBEaXNhYmxlIGFsbCBEZXZpY2UgQ2hhbm5lbCBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7CisKKwkvKiBEaXNhYmxlIGFsbCBJbmJvdW5kIE1zZyBDaGFubmVsIGludGVycnVwdHMgKi8KKwlmb3IgKGNoID0gMDsgY2ggPCBUU0k3MjFfSU1TR19DSE5VTTsgY2grKykKKwkJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0lOVEUoY2gpKTsKKworCS8qIERpc2FibGUgYWxsIE91dGJvdW5kIE1zZyBDaGFubmVsIGludGVycnVwdHMgKi8KKwlmb3IgKGNoID0gMDsgY2ggPCBUU0k3MjFfT01TR19DSE5VTTsgY2grKykKKwkJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0lOVEUoY2gpKTsKKworCS8qIERpc2FibGUgYWxsIGdlbmVyYWwgbWVzc2FnaW5nIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9TTVNHX0lOVEUpOworCisJLyogRGlzYWJsZSBhbGwgQkRNQSBDaGFubmVsIGludGVycnVwdHMgKi8KKwlmb3IgKGNoID0gMDsgY2ggPCBUU0k3MjFfRE1BX01BWENIOyBjaCsrKQorCQlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0lOVEUoY2gpKTsKKworCS8qIERpc2FibGUgYWxsIGdlbmVyYWwgQkRNQSBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfQkRNQV9JTlRFKTsKKworCS8qIERpc2FibGUgYWxsIFNSSU8gQ2hhbm5lbCBpbnRlcnJ1cHRzICovCisJZm9yIChjaCA9IDA7IGNoIDwgVFNJNzIxX1NSSU9fTUFYQ0g7IGNoKyspCisJCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX1NSX0NISU5URShjaCkpOworCisJLyogRGlzYWJsZSBhbGwgZ2VuZXJhbCBTUjJQQyBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfU1IyUENfR0VOX0lOVEUpOworCisJLyogRGlzYWJsZSBhbGwgUEMyU1IgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX1BDMlNSX0lOVEUpOworCisJLyogRGlzYWJsZSBhbGwgSTJDIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9JMkNfSU5UX0VOQUJMRSk7CisKKwkvKiBEaXNhYmxlIFNSSU8gTUFDIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9SSU9fRU1fSU5UX0VOQUJMRSk7CisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX0VNX0RFVl9JTlRfRU4pOworfQorCisvKioKKyAqIHRzaTcyMV9zZXR1cF9tcG9ydCAtIFNldHVwIFRzaTcyMSBhcyBSYXBpZElPIHN1YnN5c3RlbSBtYXN0ZXIgcG9ydAorICogQHByaXY6IHBvaW50ZXIgdG8gdHNpNzIxIHByaXZhdGUgZGF0YQorICoKKyAqIENvbmZpZ3VyZXMgVHNpNzIxIGFzIFJhcGlkSU8gbWFzdGVyIHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHRzaTcyMV9zZXR1cF9tcG9ydChzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHByaXYtPnBkZXY7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHJpb19vcHMgKm9wczsKKworCXN0cnVjdCByaW9fbXBvcnQgKm1wb3J0OworCisJb3BzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJpb19vcHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wcykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByaW9fb3BzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJb3BzLT5sY3JlYWQgPSB0c2k3MjFfbGNyZWFkOworCW9wcy0+bGN3cml0ZSA9IHRzaTcyMV9sY3dyaXRlOworCW9wcy0+Y3JlYWQgPSB0c2k3MjFfY3JlYWRfZG1hOworCW9wcy0+Y3dyaXRlID0gdHNpNzIxX2N3cml0ZV9kbWE7CisJb3BzLT5kc2VuZCA9IHRzaTcyMV9kc2VuZDsKKwlvcHMtPm9wZW5faW5iX21ib3ggPSB0c2k3MjFfb3Blbl9pbmJfbWJveDsKKwlvcHMtPmNsb3NlX2luYl9tYm94ID0gdHNpNzIxX2Nsb3NlX2luYl9tYm94OworCW9wcy0+b3Blbl9vdXRiX21ib3ggPSB0c2k3MjFfb3Blbl9vdXRiX21ib3g7CisJb3BzLT5jbG9zZV9vdXRiX21ib3ggPSB0c2k3MjFfY2xvc2Vfb3V0Yl9tYm94OworCW9wcy0+YWRkX291dGJfbWVzc2FnZSA9IHRzaTcyMV9hZGRfb3V0Yl9tZXNzYWdlOworCW9wcy0+YWRkX2luYl9idWZmZXIgPSB0c2k3MjFfYWRkX2luYl9idWZmZXI7CisJb3BzLT5nZXRfaW5iX21lc3NhZ2UgPSB0c2k3MjFfZ2V0X2luYl9tZXNzYWdlOworCisJbXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmlvX21wb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtcG9ydCkgeworCQlrZnJlZShvcHMpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBtcG9ydFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1wb3J0LT5vcHMgPSBvcHM7CisJbXBvcnQtPmluZGV4ID0gMDsKKwltcG9ydC0+c3lzX3NpemUgPSAwOyAvKiBzbWFsbCBzeXN0ZW0gKi8KKwltcG9ydC0+cGh5X3R5cGUgPSBSSU9fUEhZX1NFUklBTDsKKwltcG9ydC0+cHJpdiA9ICh2b2lkICopcHJpdjsKKwltcG9ydC0+cGh5c19lZnB0ciA9IDB4MTAwOworCisJSU5JVF9MSVNUX0hFQUQoJm1wb3J0LT5kYmVsbHMpOworCisJcmlvX2luaXRfZGJlbGxfcmVzKCZtcG9ydC0+cmlvcmVzW1JJT19ET09SQkVMTF9SRVNPVVJDRV0sIDAsIDB4ZmZmZik7CisJcmlvX2luaXRfbWJveF9yZXMoJm1wb3J0LT5yaW9yZXNbUklPX0lOQl9NQk9YX1JFU09VUkNFXSwgMCwgMCk7CisJcmlvX2luaXRfbWJveF9yZXMoJm1wb3J0LT5yaW9yZXNbUklPX09VVEJfTUJPWF9SRVNPVVJDRV0sIDAsIDApOworCXN0cmNweShtcG9ydC0+bmFtZSwgIlRzaTcyMSBtcG9ydCIpOworCisJLyogSG9vayB1cCBpbnRlcnJ1cHQgaGFuZGxlciAqLworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZiAoIXRzaTcyMV9lbmFibGVfbXNpeChwcml2KSkKKwkJcHJpdi0+ZmxhZ3MgfD0gVFNJNzIxX1VTSU5HX01TSVg7CisJZWxzZSBpZiAoIXBjaV9lbmFibGVfbXNpKHBkZXYpKQorCQlwcml2LT5mbGFncyB8PSBUU0k3MjFfVVNJTkdfTVNJOworCWVsc2UKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCSAiTVNJL01TSS1YIGlzIG5vdCBhdmFpbGFibGUuIFVzaW5nIGxlZ2FjeSBJTlR4LlxuIik7CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KKworCWVyciA9IHRzaTcyMV9yZXF1ZXN0X2lycShtcG9ydCk7CisKKwlpZiAoIWVycikgeworCQl0c2k3MjFfaW50ZXJydXB0c19pbml0KHByaXYpOworCQlvcHMtPnB3ZW5hYmxlID0gdHNpNzIxX3B3X2VuYWJsZTsKKwl9IGVsc2UKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBhc3NpZ25lZCBQQ0kgSVJRICIKKwkJCSJ2ZWN0b3IgJTAyWCBlcnI9MHgleFxuIiwgcGRldi0+aXJxLCBlcnIpOworCisJLyogRW5hYmxlIFNSSU8gbGluayAqLworCWlvd3JpdGUzMihpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RFVkNUTCkgfAorCQkgIFRTSTcyMV9ERVZDVExfU1JCT09UX0NNUEwsCisJCSAgcHJpdi0+cmVncyArIFRTSTcyMV9ERVZDVEwpOworCisJcmlvX3JlZ2lzdGVyX21wb3J0KG1wb3J0KTsKKwlwcml2LT5tcG9ydCA9IG1wb3J0OworCisJaWYgKG1wb3J0LT5ob3N0X2RldmljZWlkID49IDApCisJCWlvd3JpdGUzMihSSU9fUE9SVF9HRU5fSE9TVCB8IFJJT19QT1JUX0dFTl9NQVNURVIgfAorCQkJICBSSU9fUE9SVF9HRU5fRElTQ09WRVJFRCwKKwkJCSAgcHJpdi0+cmVncyArICgweDEwMCArIFJJT19QT1JUX0dFTl9DVExfQ1NSKSk7CisJZWxzZQorCQlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArICgweDEwMCArIFJJT19QT1JUX0dFTl9DVExfQ1NSKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdHNpNzIxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2OworCWludCBpOworCWludCBlcnI7CisJdTMyIHJlZ3ZhbDsKKworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmIChwcml2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZXhpdDsKKwl9CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZVxuIik7CisJCWdvdG8gZXJyX2NsZWFuOworCX0KKworCXByaXYtPnBkZXYgPSBwZGV2OworCisjaWZkZWYgREVCVUcKKwlmb3IgKGkgPSAwOyBpIDw9IFBDSV9TVERfUkVTT1VSQ0VfRU5EOyBpKyspIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAicmVzWyVkXSBAIDB4JWxseCAoMHglbHgsIDB4JWx4KVxuIiwKKwkJCWksICh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpLAorCQkJKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKSwKKwkJCXBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBpKSk7CisJfQorI2VuZGlmCisJLyoKKwkgKiBWZXJpZnkgQkFSIGNvbmZpZ3VyYXRpb24KKwkgKi8KKworCS8qIEJBUl8wIChyZWdpc3RlcnMpIG11c3QgYmUgNTEyS0IrIGluIDMyLWJpdCBhZGRyZXNzIHNwYWNlICovCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIEJBUl8wKSAmIElPUkVTT1VSQ0VfTUVNKSB8fAorCSAgICBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgQkFSXzApICYgSU9SRVNPVVJDRV9NRU1fNjQgfHwKKwkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBCQVJfMCkgPCBUU0k3MjFfUkVHX1NQQUNFX1NJWkUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIk1pc3Npbmcgb3IgbWlzY29uZmlndXJlZCBDU1IgQkFSMCwgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZGlzYWJsZV9wZGV2OworCX0KKworCS8qIEJBUl8xIChvdXRib3VuZCBkb29yYmVsbHMpIG11c3QgYmUgMTZNQisgaW4gMzItYml0IGFkZHJlc3Mgc3BhY2UgKi8KKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgQkFSXzEpICYgSU9SRVNPVVJDRV9NRU0pIHx8CisJICAgIHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBCQVJfMSkgJiBJT1JFU09VUkNFX01FTV82NCB8fAorCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEJBUl8xKSA8IFRTSTcyMV9EQl9XSU5fU0laRSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiTWlzc2luZyBvciBtaXNjb25maWd1cmVkIERvb3JiZWxsIEJBUjEsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2Rpc2FibGVfcGRldjsKKwl9CisKKwkvKgorCSAqIEJBUl8yIGFuZCBCQVJfNCAob3V0Ym91bmQgdHJhbnNsYXRpb24pIG11c3QgYmUgaW4gNjQtYml0IFBDSWUgYWRkcmVzcworCSAqIHNwYWNlLgorCSAqIE5PVEU6IEJBUl8yIGFuZCBCQVJfNCBhcmUgbm90IHVzZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIGRyaXZlci4KKwkgKiBJdCBtYXkgYmUgYSBnb29kIGlkZWEgdG8ga2VlcCB0aGVtIGRpc2FibGVkIHVzaW5nIEhXIGNvbmZpZ3VyYXRpb24KKwkgKiB0byBzYXZlIFBDSSBtZW1vcnkgc3BhY2UuCisJICovCisJaWYgKChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgQkFSXzIpICYgSU9SRVNPVVJDRV9NRU0pICYmCisJICAgIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgQkFSXzIpICYgSU9SRVNPVVJDRV9NRU1fNjQpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJPdXRib3VuZCBCQVIyIGlzIG5vdCB1c2VkIGJ1dCBlbmFibGVkLlxuIik7CisJfQorCisJaWYgKChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgQkFSXzQpICYgSU9SRVNPVVJDRV9NRU0pICYmCisJICAgIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgQkFSXzQpICYgSU9SRVNPVVJDRV9NRU1fNjQpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJPdXRib3VuZCBCQVI0IGlzIG5vdCB1c2VkIGJ1dCBlbmFibGVkLlxuIik7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsICIKKwkJCSJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9kaXNhYmxlX3BkZXY7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlwcml2LT5yZWdzID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIEJBUl8wKTsKKwlpZiAoIXByaXYtPnJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIlVuYWJsZSB0byBtYXAgZGV2aWNlIHJlZ2lzdGVycyBzcGFjZSwgYWJvcnRpbmdcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX3JlczsKKwl9CisKKwlwcml2LT5vZGJfYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCBCQVJfMSk7CisJaWYgKCFwcml2LT5vZGJfYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiVW5hYmxlIHRvIG1hcCBvdXRib3VuZCBkb29yYmVsbHMgc3BhY2UsIGFib3J0aW5nXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5tYXBfYmFyczsKKwl9CisKKwkvKiBDb25maWd1cmUgRE1BIGF0dHJpYnV0ZXMuICovCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkpIHsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gc2V0IERNQSBtYXNrXG4iKTsKKwkJCWdvdG8gZXJyX3VubWFwX2JhcnM7CisJCX0KKworCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKQorCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIlVuYWJsZSB0byBzZXQgY29uc2lzdGVudCBETUEgbWFza1xuIik7CisJfSBlbHNlIHsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCQlpZiAoZXJyKQorCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIlVuYWJsZSB0byBzZXQgY29uc2lzdGVudCBETUEgbWFza1xuIik7CisJfQorCisJLyogQ2xlYXIgIm5vIHNub29wIiBhbmQgInJlbGF4ZWQgb3JkZXJpbmciIGJpdHMuICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAgKyBQQ0lfRVhQX0RFVkNUTCwgJnJlZ3ZhbCk7CisJcmVndmFsICY9IH4oUENJX0VYUF9ERVZDVExfUkVMQVhfRU4gfCBQQ0lfRVhQX0RFVkNUTF9OT1NOT09QX0VOKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAgKyBQQ0lfRVhQX0RFVkNUTCwgcmVndmFsKTsKKworCS8qCisJICogRklYVVA6IGNvcnJlY3Qgb2Zmc2V0cyBvZiBNU0ktWCB0YWJsZXMgaW4gdGhlIE1TSS1YIENhcGFiaWxpdHkgQmxvY2sKKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFRTSTcyMV9QQ0lFQ0ZHX0VQQ1RMLCAweDAxKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFRTSTcyMV9QQ0lFQ0ZHX01TSVhUQkwsCisJCQkJCQlUU0k3MjFfTVNJWFRCTF9PRkZTRVQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgVFNJNzIxX1BDSUVDRkdfTVNJWFBCQSwKKwkJCQkJCVRTSTcyMV9NU0lYUEJBX09GRlNFVCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBUU0k3MjFfUENJRUNGR19FUENUTCwgMCk7CisJLyogRW5kIG9mIEZJWFVQICovCisKKwl0c2k3MjFfZGlzYWJsZV9pbnRzKHByaXYpOworCisJdHNpNzIxX2luaXRfcGMyc3JfbWFwcGluZyhwcml2KTsKKwl0c2k3MjFfaW5pdF9zcjJwY19tYXBwaW5nKHByaXYpOworCisJaWYgKHRzaTcyMV9iZG1hX2luaXQocHJpdikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQkRNQSBpbml0aWFsaXphdGlvbiBmYWlsZWQsIGFib3J0aW5nXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5tYXBfYmFyczsKKwl9CisKKwllcnIgPSB0c2k3MjFfZG9vcmJlbGxfaW5pdChwcml2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2JkbWE7CisKKwl0c2k3MjFfcG9ydF93cml0ZV9pbml0KHByaXYpOworCisJZXJyID0gdHNpNzIxX21lc3NhZ2VzX2luaXQocHJpdik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9jb25zaXN0ZW50OworCisJZXJyID0gdHNpNzIxX3NldHVwX21wb3J0KHByaXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfY29uc2lzdGVudDsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9jb25zaXN0ZW50OgorCXRzaTcyMV9kb29yYmVsbF9mcmVlKHByaXYpOworZXJyX2ZyZWVfYmRtYToKKwl0c2k3MjFfYmRtYV9mcmVlKHByaXYpOworZXJyX3VubWFwX2JhcnM6CisJaWYgKHByaXYtPnJlZ3MpCisJCWlvdW5tYXAocHJpdi0+cmVncyk7CisJaWYgKHByaXYtPm9kYl9iYXNlKQorCQlpb3VubWFwKHByaXYtPm9kYl9iYXNlKTsKK2Vycl9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9jbGVhcl9tYXN0ZXIocGRldik7CitlcnJfZGlzYWJsZV9wZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9jbGVhbjoKKwlrZnJlZShwcml2KTsKK2Vycl9leGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRSh0c2k3MjFfcGNpX3RibCkgPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSURULCBQQ0lfREVWSUNFX0lEX1RTSTcyMSkgfSwKKwl7IDAsIH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0c2k3MjFfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0c2k3MjFfZHJpdmVyID0geworCS5uYW1lCQk9ICJ0c2k3MjEiLAorCS5pZF90YWJsZQk9IHRzaTcyMV9wY2lfdGJsLAorCS5wcm9iZQkJPSB0c2k3MjFfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0c2k3MjFfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ0c2k3MjFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRzaTcyMV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0c2k3MjFfZHJpdmVyKTsKK30KKworZGV2aWNlX2luaXRjYWxsKHRzaTcyMV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5oIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiZTRkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5oCkBAIC0wLDAgKzEsNzY2IEBACisvKgorICogVHNpNzIxIFBDSUV4cHJlc3MtdG8tU1JJTyBicmlkZ2UgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSwgSW50ZWdyYXRlZCBEZXZpY2UgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19UU0k3MjFfSAorI2RlZmluZSBfX1RTSTcyMV9ICisKKyNkZWZpbmUgRFJWX05BTUUJInRzaTcyMSIKKworI2RlZmluZSBERUZBVUxUX0hPUENPVU5UCTB4ZmYKKyNkZWZpbmUgREVGQVVMVF9ERVNUSUQJCTB4ZmYKKworLyogUENJIGRldmljZSBJRCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RTSTcyMQkJMHg4MGFiCisKKyNkZWZpbmUgQkFSXzAJMAorI2RlZmluZSBCQVJfMQkxCisjZGVmaW5lIEJBUl8yCTIKKyNkZWZpbmUgQkFSXzQJNAorCisjZGVmaW5lIFRTSTcyMV9QQzJTUl9CQVJTCTIKKyNkZWZpbmUgVFNJNzIxX1BDMlNSX1dJTlMJOAorI2RlZmluZSBUU0k3MjFfUEMyU1JfWk9ORVMJOAorI2RlZmluZSBUU0k3MjFfTUFJTlRfV0lOCTAgLyogV2luZG93IGZvciBvdXRib3VuZCBtYWludGVuYW5jZSByZXF1ZXN0cyAqLworI2RlZmluZSBJREJfUVVFVUUJCTAgLyogSW5ib3VuZCBEb29yYmVsbCBRdWV1ZSB0byB1c2UgKi8KKyNkZWZpbmUgSURCX1FTSVpFCQk1MTIgLyogSW5ib3VuZCBEb29yYmVsbCBRdWV1ZSBzaXplICovCisKKy8qIE1lbW9yeSBzcGFjZSBzaXplcyAqLworI2RlZmluZSBUU0k3MjFfUkVHX1NQQUNFX1NJWkUJCSg1MTIgKiAxMDI0KSAvKiA1MTJLICovCisjZGVmaW5lIFRTSTcyMV9EQl9XSU5fU0laRQkJKDE2ICogMTAyNCAqIDEwMjQpIC8qIDE2TUIgKi8KKworI2RlZmluZSAgUklPX1RUX0NPREVfOAkJMHgwMDAwMDAwMAorI2RlZmluZSAgUklPX1RUX0NPREVfMTYJCTB4MDAwMDAwMDEKKworI2RlZmluZSBUU0k3MjFfRE1BX01BWENICTgKKyNkZWZpbmUgVFNJNzIxX0RNQV9NSU5TVFNTWgkzMgorI2RlZmluZSBUU0k3MjFfRE1BX1NUU0JMS1NaCTgKKworI2RlZmluZSBUU0k3MjFfU1JJT19NQVhDSAk4CisKKyNkZWZpbmUgREJFTExfU0lEKGJ1ZikJCSgoKHU4KWJ1ZlsyXSA8PCA4KSB8ICh1OClidWZbM10pCisjZGVmaW5lIERCRUxMX1RJRChidWYpCQkoKCh1OClidWZbNF0gPDwgOCkgfCAodTgpYnVmWzVdKQorI2RlZmluZSBEQkVMTF9JTkYoYnVmKQkJKCgodTgpYnVmWzBdIDw8IDgpIHwgKHU4KWJ1ZlsxXSkKKworI2RlZmluZSBUU0k3MjFfUklPX1BXX01TR19TSVpFCTE2ICAvKiBUc2k3MjEgc2F2ZXMgb25seSAxNiBieXRlcyBvZiBQVyBtc2cgKi8KKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworLyoKKyAqIFJlZ2lzdGVycyBpbiBQQ0llIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqLworCisjZGVmaW5lIFRTSTcyMV9QQ0lFQ0ZHX01TSVhUQkwJMHgwYTQKKyNkZWZpbmUgVFNJNzIxX01TSVhUQkxfT0ZGU0VUCTB4MmMwMDAKKyNkZWZpbmUgVFNJNzIxX1BDSUVDRkdfTVNJWFBCQQkweDBhOAorI2RlZmluZSBUU0k3MjFfTVNJWFBCQV9PRkZTRVQJMHgyYTAwMAorI2RlZmluZSBUU0k3MjFfUENJRUNGR19FUENUTAkweDQwMAorCisvKgorICogRXZlbnQgTWFuYWdlbWVudCBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIFRTSTcyMV9SSU9fRU1fSU5UX1NUQVQJCTB4MTA5MTAKKyNkZWZpbmUgVFNJNzIxX1JJT19FTV9JTlRfU1RBVF9QV19SWAkweDAwMDEwMDAwCisKKyNkZWZpbmUgVFNJNzIxX1JJT19FTV9JTlRfRU5BQkxFCTB4MTA5MTQKKyNkZWZpbmUgVFNJNzIxX1JJT19FTV9JTlRfRU5BQkxFX1BXX1JYCTB4MDAwMTAwMDAKKworI2RlZmluZSBUU0k3MjFfUklPX0VNX0RFVl9JTlRfRU4JMHgxMDkzMAorI2RlZmluZSBUU0k3MjFfUklPX0VNX0RFVl9JTlRfRU5fSU5UCTB4MDAwMDAwMDEKKworLyoKKyAqIFBvcnQtV3JpdGUgQmxvY2sgUmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBUU0k3MjFfUklPX1BXX0NUTAkJMHgxMGEwNAorI2RlZmluZSBUU0k3MjFfUklPX1BXX0NUTF9QV19USU1FUgkweGYwMDAwMDAwCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfQ1RMX1BXVF9ESVMJKDAgPDwgMjgpCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfQ1RMX1BXVF8xMDMJKDEgPDwgMjgpCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfQ1RMX1BXVF8yMDUJKDEgPDwgMjkpCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfQ1RMX1BXVF80MTAJKDEgPDwgMzApCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfQ1RMX1BXVF84MjAJKDEgPDwgMzEpCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfQ1RMX1BXQ19NT0RFCTB4MDEwMDAwMDAKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19DVExfUFdDX0NPTlQJMHgwMDAwMDAwMAorI2RlZmluZSBUU0k3MjFfUklPX1BXX0NUTF9QV0NfUkVMCTB4MDEwMDAwMDAKKworI2RlZmluZSBUU0k3MjFfUklPX1BXX1JYX1NUQVQJCTB4MTBhMTAKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19SWF9TVEFUX1dSX1NJWkUJMHgwMDAwZjAwMAorI2RlZmluZSBUU0lfUklPX1BXX1JYX1NUQVRfV0RQVFIJMHgwMDAwMDEwMAorI2RlZmluZSBUU0k3MjFfUklPX1BXX1JYX1NUQVRfUFdfU0hPUlQJMHgwMDAwMDAwOAorI2RlZmluZSBUU0k3MjFfUklPX1BXX1JYX1NUQVRfUFdfVFJVTkMJMHgwMDAwMDAwNAorI2RlZmluZSBUU0k3MjFfUklPX1BXX1JYX1NUQVRfUFdfRElTQwkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfUlhfU1RBVF9QV19WQUwJMHgwMDAwMDAwMQorCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfUlhfQ0FQVCh4KQkoMHgxMGEyMCArICh4KSo0KQorCisvKgorICogSW5ib3VuZCBEb29yYmVsbHMKKyAqLworCisjZGVmaW5lIFRTSTcyMV9JREJfRU5UUllfU0laRQk2NAorCisjZGVmaW5lIFRTSTcyMV9JRFFfQ1RMKHgpCSgweDIwMDAwICsgKHgpICogMTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lEUV9TVVNQRU5ECTB4MDAwMDAwMDIKKyNkZWZpbmUgVFNJNzIxX0lEUV9JTklUCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgVFNJNzIxX0lEUV9TVFMoeCkJKDB4MjAwMDQgKyAoeCkgKiAxMDAwKQorI2RlZmluZSBUU0k3MjFfSURRX1JVTgkJMHgwMDIwMDAwMAorCisjZGVmaW5lIFRTSTcyMV9JRFFfTUFTSyh4KQkoMHgyMDAwOCArICh4KSAqIDEwMDApCisjZGVmaW5lIFRTSTcyMV9JRFFfTUFTS19NQVNLCTB4ZmZmZjAwMDAKKyNkZWZpbmUgVFNJNzIxX0lEUV9NQVNLX1BBVFQJMHgwMDAwZmZmZgorCisjZGVmaW5lIFRTSTcyMV9JRFFfUlAoeCkJKDB4MjAwMGMgKyAoeCkgKiAxMDAwKQorI2RlZmluZSBUU0k3MjFfSURRX1JQX1BUUgkweDAwMDdmZmZmCisKKyNkZWZpbmUgVFNJNzIxX0lEUV9XUCh4KQkoMHgyMDAxMCArICh4KSAqIDEwMDApCisjZGVmaW5lIFRTSTcyMV9JRFFfV1BfUFRSCTB4MDAwN2ZmZmYKKworI2RlZmluZSBUU0k3MjFfSURRX0JBU0VMKHgpCSgweDIwMDE0ICsgKHgpICogMTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lEUV9CQVNFTF9BRERSCTB4ZmZmZmZmYzAKKyNkZWZpbmUgVFNJNzIxX0lEUV9CQVNFVSh4KQkoMHgyMDAxOCArICh4KSAqIDEwMDApCisjZGVmaW5lIFRTSTcyMV9JRFFfU0laRSh4KQkoMHgyMDAxYyArICh4KSAqIDEwMDApCisjZGVmaW5lIFRTSTcyMV9JRFFfU0laRV9WQUwoc2l6ZSkJKF9fZmxzKHNpemUpIC0gNCkKKyNkZWZpbmUgVFNJNzIxX0lEUV9TSVpFX01JTgk1MTIKKyNkZWZpbmUgVFNJNzIxX0lEUV9TSVpFX01BWAkoNTEyICogMTAyNCkKKworI2RlZmluZSBUU0k3MjFfU1JfQ0hJTlQoeCkJKDB4MjAwNDAgKyAoeCkgKiAxMDAwKQorI2RlZmluZSBUU0k3MjFfU1JfQ0hJTlRFKHgpCSgweDIwMDQ0ICsgKHgpICogMTAwMCkKKyNkZWZpbmUgVFNJNzIxX1NSX0NISU5UU0VUKHgpCSgweDIwMDQ4ICsgKHgpICogMTAwMCkKKyNkZWZpbmUgVFNJNzIxX1NSX0NISU5UX09EQk9LCTB4MDAwMDAwMjAKKyNkZWZpbmUgVFNJNzIxX1NSX0NISU5UX0lEQlFSQ1YJMHgwMDAwMDAxMAorI2RlZmluZSBUU0k3MjFfU1JfQ0hJTlRfU1VTUAkweDAwMDAwMDA4CisjZGVmaW5lIFRTSTcyMV9TUl9DSElOVF9PREJUTwkweDAwMDAwMDA0CisjZGVmaW5lIFRTSTcyMV9TUl9DSElOVF9PREJSVFJZCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFNJNzIxX1NSX0NISU5UX09EQkVSUgkweDAwMDAwMDAxCisjZGVmaW5lIFRTSTcyMV9TUl9DSElOVF9BTEwJMHgwMDAwMDAzZgorCisjZGVmaW5lIFRTSTcyMV9JQldJTl9OVU0JOAorCisjZGVmaW5lIFRTSTcyMV9JQldJTkxCKHgpCSgweDI5MDAwICsgKHgpICogMjApCisjZGVmaW5lIFRTSTcyMV9JQldJTkxCX0JBCTB4ZmZmZmYwMDAKKyNkZWZpbmUgVFNJNzIxX0lCV0lOTEJfV0VOCTB4MDAwMDAwMDEKKworI2RlZmluZSBUU0k3MjFfU1IyUENfR0VOX0lOVEUJMHgyOTgwMAorI2RlZmluZSBUU0k3MjFfU1IyUENfUFdFCTB4Mjk4MDQKKyNkZWZpbmUgVFNJNzIxX1NSMlBDX0dFTl9JTlQJMHgyOTgwOAorCisjZGVmaW5lIFRTSTcyMV9ERVZfSU5URQkJMHgyOTg0MAorI2RlZmluZSBUU0k3MjFfREVWX0lOVAkJMHgyOTg0NAorI2RlZmluZSBUU0k3MjFfREVWX0lOVFNFVAkweDI5ODQ4CisjZGVmaW5lIFRTSTcyMV9ERVZfSU5UX1NNU0dfQ0gJMHgwMDAwMDgwMAorI2RlZmluZSBUU0k3MjFfREVWX0lOVF9TTVNHX05DSAkweDAwMDAwNDAwCisjZGVmaW5lIFRTSTcyMV9ERVZfSU5UX1NSMlBDX0NICTB4MDAwMDAyMDAKKyNkZWZpbmUgVFNJNzIxX0RFVl9JTlRfU1JJTwkweDAwMDAwMDIwCisKKyNkZWZpbmUgVFNJNzIxX0RFVl9DSEFOX0lOVEUJMHgyOTg0YworI2RlZmluZSBUU0k3MjFfREVWX0NIQU5fSU5UCTB4Mjk4NTAKKworI2RlZmluZSBUU0k3MjFfSU5UX1NSMlBDX0NIQU5fTQkweGZmMDAwMDAwCisjZGVmaW5lIFRTSTcyMV9JTlRfU1IyUENfQ0hBTih4KSAoMSA8PCAoMjQgKyAoeCkpKQorI2RlZmluZSBUU0k3MjFfSU5UX0lNU0dfQ0hBTl9NCTB4MDBmZjAwMDAKKyNkZWZpbmUgVFNJNzIxX0lOVF9JTVNHX0NIQU4oeCkJKDEgPDwgKDE2ICsgKHgpKSkKKyNkZWZpbmUgVFNJNzIxX0lOVF9PTVNHX0NIQU5fTQkweDAwMDBmZjAwCisjZGVmaW5lIFRTSTcyMV9JTlRfT01TR19DSEFOKHgpCSgxIDw8ICg4ICsgKHgpKSkKKworLyoKKyAqIFBDMlNSIGJsb2NrIHJlZ2lzdGVycworICovCisjZGVmaW5lIFRTSTcyMV9PQldJTl9OVU0JVFNJNzIxX1BDMlNSX1dJTlMKKworI2RlZmluZSBUU0k3MjFfT0JXSU5MQih4KQkoMHg0MDAwMCArICh4KSAqIDIwKQorI2RlZmluZSBUU0k3MjFfT0JXSU5MQl9CQQkweGZmZmY4MDAwCisjZGVmaW5lIFRTSTcyMV9PQldJTkxCX1dFTgkweDAwMDAwMDAxCisKKyNkZWZpbmUgVFNJNzIxX09CV0lOVUIoeCkJKDB4NDAwMDQgKyAoeCkgKiAyMCkKKworI2RlZmluZSBUU0k3MjFfT0JXSU5TWih4KQkoMHg0MDAwOCArICh4KSAqIDIwKQorI2RlZmluZSBUU0k3MjFfT0JXSU5TWl9TSVpFCTB4MDAwMDFmMDAKKyNkZWZpbmUgVFNJNzIxX09CV0lOX1NJWkUoc2l6ZSkJKF9fZmxzKHNpemUpIC0gMTUpCisKKyNkZWZpbmUgVFNJNzIxX1pPTkVfU0VMCQkweDQxMzAwCisjZGVmaW5lIFRTSTcyMV9aT05FX1NFTF9SRF9XUkIJMHgwMDAyMDAwMAorI2RlZmluZSBUU0k3MjFfWk9ORV9TRUxfR08JMHgwMDAxMDAwMAorI2RlZmluZSBUU0k3MjFfWk9ORV9TRUxfV0lOCTB4MDAwMDAwMzgKKyNkZWZpbmUgVFNJNzIxX1pPTkVfU0VMX1pPTkUJMHgwMDAwMDAwNworCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTAJMHg0MTMwNAorI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEwX0FERAkweGZmZmZmMDAwCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTBfUkRUWVBFCTB4MDAwMDBmMDAKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMF9OUkVBRAkweDAwMDAwMTAwCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTBfTU5UUkQJMHgwMDAwMDIwMAorI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEwX1JEQ1JGCTB4MDAwMDAwMjAKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMF9XUkNSRgkweDAwMDAwMDEwCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTBfV1JUWVBFCTB4MDAwMDAwMGYKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMF9OV1IJMHgwMDAwMDAwMQorI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEwX01OVFdSCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMF9OV1JfUgkweDAwMDAwMDA0CisKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMQkweDQxMzA4CisKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMgkweDQxMzBjCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTJfSEMJMHhmZjAwMDAwMAorI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEyX0FERDY1CTB4MDAwYzAwMDAKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMl9UVAkweDAwMDMwMDAwCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTJfRFNUSUQJMHgwMDAwZmZmZgorCisjZGVmaW5lIFRTSTcyMV9QQzJTUl9JTlRFCTB4NDEzMTAKKworI2RlZmluZSBUU0k3MjFfREVWQ1RMCQkweDQ4MDA0CisjZGVmaW5lIFRTSTcyMV9ERVZDVExfU1JCT09UX0NNUEwJMHgwMDAwMDAwNAorCisjZGVmaW5lIFRTSTcyMV9JMkNfSU5UX0VOQUJMRQkweDQ5MTIwCisKKy8qCisgKiBCbG9jayBETUEgRW5naW5lIFJlZ2lzdGVycworICogICB4ID0gMC4uNworICovCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFdSQ05UKHgpCSgweDUxMDAwICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfRE1BQ19EUkRDTlQoeCkJKDB4NTEwMDQgKyAoeCkgKiAweDEwMDApCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfQ1RMKHgpCSgweDUxMDA4ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfRE1BQ19DVExfU1VTUAkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9ETUFDX0NUTF9JTklUCTB4MDAwMDAwMDEKKworI2RlZmluZSBUU0k3MjFfRE1BQ19JTlQoeCkJKDB4NTEwMGMgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9ETUFDX0lOVF9TVEZVTEwJMHgwMDAwMDAxMAorI2RlZmluZSBUU0k3MjFfRE1BQ19JTlRfRE9ORQkweDAwMDAwMDA4CisjZGVmaW5lIFRTSTcyMV9ETUFDX0lOVF9TVVNQCTB4MDAwMDAwMDQKKyNkZWZpbmUgVFNJNzIxX0RNQUNfSU5UX0VSUgkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9ETUFDX0lOVF9JT0ZET05FCTB4MDAwMDAwMDEKKyNkZWZpbmUgVFNJNzIxX0RNQUNfSU5UX0FMTAkweDAwMDAwMDFmCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfSU5UU0VUKHgpCSgweDUxMDEwICsgKHgpICogMHgxMDAwKQorCisjZGVmaW5lIFRTSTcyMV9ETUFDX1NUUyh4KQkoMHg1MTAxNCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0RNQUNfU1RTX0FCT1JUCTB4MDA0MDAwMDAKKyNkZWZpbmUgVFNJNzIxX0RNQUNfU1RTX1JVTgkweDAwMjAwMDAwCisjZGVmaW5lIFRTSTcyMV9ETUFDX1NUU19DUwkweDAwMWYwMDAwCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfSU5URSh4KQkoMHg1MTAxOCArICh4KSAqIDB4MTAwMCkKKworI2RlZmluZSBUU0k3MjFfRE1BQ19EUFRSTCh4KQkoMHg1MTAyNCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFBUUkxfTUFTSwkweGZmZmZmZmUwCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFBUUkgoeCkJKDB4NTEwMjggKyAoeCkgKiAweDEwMDApCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFNCTCh4KQkoMHg1MTAyYyArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFNCTF9NQVNLCTB4ZmZmZmZmYzAKKworI2RlZmluZSBUU0k3MjFfRE1BQ19EU0JIKHgpCSgweDUxMDMwICsgKHgpICogMHgxMDAwKQorCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RTU1ooeCkJKDB4NTEwMzQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RTU1pfU0laRV9NCTB4MDAwMDAwMGYKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFNTWl9TSVpFKHNpemUpCShfX2ZscyhzaXplKSAtIDQpCisKKworI2RlZmluZSBUU0k3MjFfRE1BQ19EU1JQKHgpCSgweDUxMDM4ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfRE1BQ19EU1JQX01BU0sJMHgwMDA3ZmZmZgorCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RTV1AoeCkJKDB4NTEwM2MgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RTV1BfTUFTSwkweDAwMDdmZmZmCisKKyNkZWZpbmUgVFNJNzIxX0JETUFfSU5URQkweDVmMDAwCisKKy8qCisgKiBNZXNzYWdpbmcgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBUU0k3MjFfTVNHX0JVRkZFUl9TSVpFCQlSSU9fTUFYX01TR19TSVpFCisjZGVmaW5lIFRTSTcyMV9NU0dfTUFYX1NJWkUJCVJJT19NQVhfTVNHX1NJWkUKKyNkZWZpbmUgVFNJNzIxX0lNU0dfTUFYQ0gJCTgKKyNkZWZpbmUgVFNJNzIxX0lNU0dfQ0hOVU0JCVRTSTcyMV9JTVNHX01BWENICisjZGVmaW5lIFRTSTcyMV9JTVNHRF9NSU5fUklOR19TSVpFCTMyCisjZGVmaW5lIFRTSTcyMV9JTVNHRF9SSU5HX1NJWkUJCTUxMgorCisjZGVmaW5lIFRTSTcyMV9PTVNHX0NITlVNCQk0IC8qIE9uZSBjaGFubmVsIHBlciBNQk9YICovCisjZGVmaW5lIFRTSTcyMV9PTVNHRF9NSU5fUklOR19TSVpFCTMyCisjZGVmaW5lIFRTSTcyMV9PTVNHRF9SSU5HX1NJWkUJCTUxMgorCisvKgorICogT3V0Ym91bmQgTWVzc2FnaW5nIEVuZ2luZSBSZWdpc3RlcnMKKyAqICAgeCA9IDAuLjcKKyAqLworCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfRFdSQ05UKHgpCQkoMHg2MTAwMCArICh4KSAqIDB4MTAwMCkKKworI2RlZmluZSBUU0k3MjFfT0JETUFDX0RSRENOVCh4KQkJKDB4NjEwMDQgKyAoeCkgKiAweDEwMDApCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19DVEwoeCkJCSgweDYxMDA4ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX0NUTF9NQVNLCQkweDAwMDAwMDA3CisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfQ1RMX1JFVFJZX1RIUgkweDAwMDAwMDA0CisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfQ1RMX1NVU1BFTkQJMHgwMDAwMDAwMgorI2RlZmluZSBUU0k3MjFfT0JETUFDX0NUTF9JTklUCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19JTlQoeCkJCSgweDYxMDBjICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX0lOVFNFVCh4KQkJKDB4NjEwMTAgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfSU5URSh4KQkJKDB4NjEwMTggKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfSU5UX01BU0sJCTB4MDAwMDAwMUYKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19JTlRfU1RfRlVMTAkweDAwMDAwMDEwCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfSU5UX0RPTkUJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19JTlRfU1VTUEVOREVECTB4MDAwMDAwMDQKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19JTlRfRVJST1IJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19JTlRfSU9GX0RPTkUJMHgwMDAwMDAwMQorI2RlZmluZSBUU0k3MjFfT0JETUFDX0lOVF9BTEwJCVRTSTcyMV9PQkRNQUNfSU5UX01BU0sKKworI2RlZmluZSBUU0k3MjFfT0JETUFDX1NUUyh4KQkJKDB4NjEwMTQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfU1RTX01BU0sJCTB4MDA3ZjAwMDAKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19TVFNfQUJPUlQJCTB4MDA0MDAwMDAKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19TVFNfUlVOCQkweDAwMjAwMDAwCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfU1RTX0NTCQkweDAwMWYwMDAwCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19QV0UoeCkJCSgweDYxMDFjICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX1BXRV9NQVNLCQkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfUFdFX0VSUk9SX0VOCTB4MDAwMDAwMDIKKworI2RlZmluZSBUU0k3MjFfT0JETUFDX0RQVFJMKHgpCQkoMHg2MTAyMCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EUFRSTF9NQVNLCTB4ZmZmZmZmZjAKKworI2RlZmluZSBUU0k3MjFfT0JETUFDX0RQVFJIKHgpCQkoMHg2MTAyNCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EUFRSSF9NQVNLCTB4ZmZmZmZmZmYKKworI2RlZmluZSBUU0k3MjFfT0JETUFDX0RTQkwoeCkJCSgweDYxMDQwICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX0RTQkxfTUFTSwkJMHhmZmZmZmZjMAorCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfRFNCSCh4KQkJKDB4NjEwNDQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfRFNCSF9NQVNLCQkweGZmZmZmZmZmCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EU1NaKHgpCQkoMHg2MTA0OCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EU1NaX01BU0sJCTB4MDAwMDAwMGYKKworI2RlZmluZSBUU0k3MjFfT0JETUFDX0RTUlAoeCkJCSgweDYxMDRjICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX0RTUlBfTUFTSwkJMHgwMDA3ZmZmZgorCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfRFNXUCh4KQkJKDB4NjEwNTAgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfRFNXUF9NQVNLCQkweDAwMDdmZmZmCisKKyNkZWZpbmUgVFNJNzIxX1JRUlBUTwkJCTB4NjAwMTAKKyNkZWZpbmUgVFNJNzIxX1JRUlBUT19NQVNLCQkweDAwZmZmZmZmCisjZGVmaW5lIFRTSTcyMV9SUVJQVE9fVkFMCQk0MDAJLyogUmVzcG9uc2UgVE8gdmFsdWUgKi8KKworLyoKKyAqIEluYm91bmQgTWVzc2FnaW5nIEVuZ2luZSBSZWdpc3RlcnMKKyAqICAgeCA9IDAuLjcKKyAqLworCisjZGVmaW5lIFRTSTcyMV9JQl9ERVZJRF9HTE9CQUwJCTB4ZmZmZgorI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRQkwoeCkJCSgweDYxMjAwICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRQkxfTUFTSwkJMHhmZmZmZmZjMAorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRlFCSCh4KQkJKDB4NjEyMDQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRlFCSF9NQVNLCQkweGZmZmZmZmZmCisKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19GUVNaX0VOVFJZX0lOWAlUU0k3MjFfSU1TR0RfUklOR19TSVpFCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRlFTWih4KQkJKDB4NjEyMDggKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRlFTWl9NQVNLCQkweDAwMDAwMDBmCisKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19GUVJQKHgpCQkoMHg2MTIwYyArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19GUVJQX01BU0sJCTB4MDAwN2ZmZmYKKworI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRV1AoeCkJCSgweDYxMjEwICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRV1BfTUFTSwkJMHgwMDA3ZmZmZgorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRlFUSCh4KQkJKDB4NjEyMTQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRlFUSF9NQVNLCQkweDAwMDdmZmZmCisKKyNkZWZpbmUgVFNJNzIxX0lCX0RFVklECQkJMHg2MDAyMAorI2RlZmluZSBUU0k3MjFfSUJfREVWSURfTUFTSwkJMHgwMDAwZmZmZgorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfQ1RMKHgpCQkoMHg2MTI0MCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19DVExfTUFTSwkJMHgwMDAwMDAwMworI2RlZmluZSBUU0k3MjFfSUJETUFDX0NUTF9TVVNQRU5ECTB4MDAwMDAwMDIKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19DVExfSU5JVAkJMHgwMDAwMDAwMQorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfU1RTKHgpCQkoMHg2MTI0NCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19TVFNfTUFTSwkJMHgwMDdmMDAwMAorI2RlZmluZSBUU0k3MjFfSUJTTUFDX1NUU19BQk9SVAkJMHgwMDQwMDAwMAorI2RlZmluZSBUU0k3MjFfSUJTTUFDX1NUU19SVU4JCTB4MDAyMDAwMDAKKyNkZWZpbmUgVFNJNzIxX0lCU01BQ19TVFNfQ1MJCTB4MDAxZjAwMDAKKworI2RlZmluZSBUU0k3MjFfSUJETUFDX0lOVCh4KQkJKDB4NjEyNDggKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfSU5UU0VUKHgpCQkoMHg2MTI0YyArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19JTlRFKHgpCQkoMHg2MTI1MCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19JTlRfTUFTSwkJMHgwMDAwMTAwZgorI2RlZmluZSBUU0k3MjFfSUJETUFDX0lOVF9TUlRPCQkweDAwMDAxMDAwCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfSU5UX1NVU1BFTkRFRAkweDAwMDAwMDA4CisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfSU5UX1BDX0VSUk9SCTB4MDAwMDAwMDQKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19JTlRfRlFfTE9XCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19JTlRfRFFfUkNWCTB4MDAwMDAwMDEKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19JTlRfQUxMCQlUU0k3MjFfSUJETUFDX0lOVF9NQVNLCisKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19QV0UoeCkJCSgweDYxMjU0ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX1BXRV9NQVNLCQkweDAwMDAxNzAwCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfUFdFX1NSVE8JCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19QV0VfSUxMX0ZNVAkweDAwMDAwNDAwCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfUFdFX0lMTF9ERUMJMHgwMDAwMDIwMAorI2RlZmluZSBUU0k3MjFfSUJETUFDX1BXRV9JTVBfU1AJMHgwMDAwMDEwMAorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRFFCTCh4KQkJKDB4NjEzMDAgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRFFCTF9NQVNLCQkweGZmZmZmZmMwCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRFFCTF9BRERSCQkweGZmZmZmZmMwCisKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19EUUJIKHgpCQkoMHg2MTMwNCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19EUUJIX01BU0sJCTB4ZmZmZmZmZmYKKworI2RlZmluZSBUU0k3MjFfSUJETUFDX0RRUlAoeCkJCSgweDYxMzA4ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0RRUlBfTUFTSwkJMHgwMDA3ZmZmZgorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRFFXUih4KQkJKDB4NjEzMGMgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRFFXUl9NQVNLCQkweDAwMDdmZmZmCisKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19EUVNaKHgpCQkoMHg2MTMxNCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19EUVNaX01BU0sJCTB4MDAwMDAwMGYKKworLyoKKyAqIE1lc3NhZ2luZyBFbmdpbmUgSW50ZXJydXB0cworICovCisKKyNkZWZpbmUgVFNJNzIxX1NNU0dfUFdFCQkJMHg2YTAwNAorCisjZGVmaW5lIFRTSTcyMV9TTVNHX0lOVEUJCTB4NmEwMDAKKyNkZWZpbmUgVFNJNzIxX1NNU0dfSU5UCQkJMHg2YTAwOAorI2RlZmluZSBUU0k3MjFfU01TR19JTlRTRVQJCTB4NmEwMTAKKyNkZWZpbmUgVFNJNzIxX1NNU0dfSU5UX01BU0sJCTB4MDA4NmZmZmYKKyNkZWZpbmUgVFNJNzIxX1NNU0dfSU5UX1VOU19SU1AJCTB4MDA4MDAwMDAKKyNkZWZpbmUgVFNJNzIxX1NNU0dfSU5UX0VDQ19OQ09SCTB4MDAwNDAwMDAKKyNkZWZpbmUgVFNJNzIxX1NNU0dfSU5UX0VDQ19DT1IJCTB4MDAwMjAwMDAKKyNkZWZpbmUgVFNJNzIxX1NNU0dfSU5UX0VDQ19OQ09SX0NICTB4MDAwMGZmMDAKKyNkZWZpbmUgVFNJNzIxX1NNU0dfSU5UX0VDQ19DT1JfQ0gJMHgwMDAwMDBmZgorCisjZGVmaW5lIFRTSTcyMV9TTVNHX0VDQ19MT0cJCTB4NmEwMTQKKyNkZWZpbmUgVFNJNzIxX1NNU0dfRUNDX0xPR19NQVNLCTB4MDAwNzAwMDcKKyNkZWZpbmUgVFNJNzIxX1NNU0dfRUNDX0xPR19FQ0NfTkNPUl9NCTB4MDAwNzAwMDAKKyNkZWZpbmUgVFNJNzIxX1NNU0dfRUNDX0xPR19FQ0NfQ09SX00JMHgwMDAwMDAwNworCisjZGVmaW5lIFRTSTcyMV9SRVRSWV9HRU5fQ05UCQkweDZhMTAwCisjZGVmaW5lIFRTSTcyMV9SRVRSWV9HRU5fQ05UX01BU0sJMHhmZmZmZmZmZgorCisjZGVmaW5lIFRTSTcyMV9SRVRSWV9SWF9DTlQJCTB4NmExMDQKKyNkZWZpbmUgVFNJNzIxX1JFVFJZX1JYX0NOVF9NQVNLCTB4ZmZmZmZmZmYKKworI2RlZmluZSBUU0k3MjFfU01TR19FQ0NfQ09SX0xPRyh4KQkoMHg2YTMwMCArICh4KSAqIDQpCisjZGVmaW5lIFRTSTcyMV9TTVNHX0VDQ19DT1JfTE9HX01BU0sJMHgwMDAwMDBmZgorCisjZGVmaW5lIFRTSTcyMV9TTVNHX0VDQ19OQ09SKHgpCQkoMHg2YTM0MCArICh4KSAqIDQpCisjZGVmaW5lIFRTSTcyMV9TTVNHX0VDQ19OQ09SX01BU0sJMHgwMDAwMDBmZgorCisvKgorICogQmxvY2sgRE1BIERlc2NyaXB0b3JzCisgKi8KKworc3RydWN0IHRzaTcyMV9kbWFfZGVzYyB7CisJX19sZTMyIHR5cGVfaWQ7CisKKyNkZWZpbmUgVFNJNzIxX0RNQURfREVWSUQJMHgwMDAwZmZmZgorI2RlZmluZSBUU0k3MjFfRE1BRF9DUkYJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVFNJNzIxX0RNQURfUFJJTwkweDAwMDYwMDAwCisjZGVmaW5lIFRTSTcyMV9ETUFEX1JUWVBFCTB4MDA3ODAwMDAKKyNkZWZpbmUgVFNJNzIxX0RNQURfSU9GCQkweDA4MDAwMDAwCisjZGVmaW5lIFRTSTcyMV9ETUFEX0RUWVBFCTB4ZTAwMDAwMDAKKworCV9fbGUzMiBiY291bnQ7CisKKyNkZWZpbmUgVFNJNzIxX0RNQURfQkNPVU5UMQkweDAzZmZmZmZmIC8qIGlmIERUWVBFID09IDEgKi8KKyNkZWZpbmUgVFNJNzIxX0RNQURfQkNPVU5UMgkweDAwMDAwMDBmIC8qIGlmIERUWVBFID09IDIgKi8KKyNkZWZpbmUgVFNJNzIxX0RNQURfVFQJCTB4MGMwMDAwMDAKKyNkZWZpbmUgVFNJNzIxX0RNQURfUkFERFIwCTB4YzAwMDAwMDAKKworCXVuaW9uIHsKKwkJX19sZTMyIHJhZGRyX2xvOwkgICAvKiBpZiBEVFlQRSA9PSAoMSB8fCAyKSAqLworCQlfX2xlMzIgbmV4dF9sbzsJCSAgIC8qIGlmIERUWVBFID09IDMgKi8KKwl9OworCisjZGVmaW5lIFRTSTcyMV9ETUFEX0NGR09GRgkweDAwZmZmZmZmCisjZGVmaW5lIFRTSTcyMV9ETUFEX0hPUENOVAkweGZmMDAwMDAwCisKKwl1bmlvbiB7CisJCV9fbGUzMiByYWRkcl9oaTsJICAgLyogaWYgRFRZUEUgPT0gKDEgfHwgMikgKi8KKwkJX19sZTMyIG5leHRfaGk7CQkgICAvKiBpZiBEVFlQRSA9PSAzICovCisJfTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsJCSAgIC8qIGlmIERUWVBFID09IDEgKi8KKwkJCV9fbGUzMiBidWZwdHJfbG87CisJCQlfX2xlMzIgYnVmcHRyX2hpOworCQkJX19sZTMyIHNfZGlzdDsKKwkJCV9fbGUzMiBzX3NpemU7CisJCX0gdDE7CisJCV9fbGUzMiBkYXRhWzRdOwkJICAgLyogaWYgRFRZUEUgPT0gMiAqLworCQl1MzIgICAgcmVzZXJ2ZWRbNF07CSAgIC8qIGlmIERUWVBFID09IDMgKi8KKwl9OworfSBfX2FsaWduZWQoMzIpOworCisvKgorICogSW5ib3VuZCBNZXNzYWdpbmcgRGVzY3JpcHRvcgorICovCitzdHJ1Y3QgdHNpNzIxX2ltc2dfZGVzYyB7CisJX19sZTMyIHR5cGVfaWQ7CisKKyNkZWZpbmUgVFNJNzIxX0lNRF9ERVZJRAkweDAwMDBmZmZmCisjZGVmaW5lIFRTSTcyMV9JTURfQ1JGCQkweDAwMDEwMDAwCisjZGVmaW5lIFRTSTcyMV9JTURfUFJJTwkJMHgwMDA2MDAwMAorI2RlZmluZSBUU0k3MjFfSU1EX1RUCQkweDAwMTgwMDAwCisjZGVmaW5lIFRTSTcyMV9JTURfRFRZUEUJMHhlMDAwMDAwMAorCisJX19sZTMyIG1zZ19pbmZvOworCisjZGVmaW5lIFRTSTcyMV9JTURfQkNPVU5UCTB4MDAwMDBmZjgKKyNkZWZpbmUgVFNJNzIxX0lNRF9TU0laRQkweDAwMDBmMDAwCisjZGVmaW5lIFRTSTcyMV9JTURfTEVURVIJMHgwMDAzMDAwMAorI2RlZmluZSBUU0k3MjFfSU1EX1hNQk9YCTB4MDAzYzAwMDAKKyNkZWZpbmUgVFNJNzIxX0lNRF9NQk9YCQkweDAwYzAwMDAwCisjZGVmaW5lIFRTSTcyMV9JTURfQ1MJCTB4NzgwMDAwMDAKKyNkZWZpbmUgVFNJNzIxX0lNRF9ITwkJMHg4MDAwMDAwMAorCisJX19sZTMyIGJ1ZnB0cl9sbzsKKwlfX2xlMzIgYnVmcHRyX2hpOworCXUzMiAgICByZXNlcnZlZFsxMl07CisKK30gX19hbGlnbmVkKDY0KTsKKworLyoKKyAqIE91dGJvdW5kIE1lc3NhZ2luZyBEZXNjcmlwdG9yCisgKi8KK3N0cnVjdCB0c2k3MjFfb21zZ19kZXNjIHsKKwlfX2xlMzIgdHlwZV9pZDsKKworI2RlZmluZSBUU0k3MjFfT01EX0RFVklECTB4MDAwMGZmZmYKKyNkZWZpbmUgVFNJNzIxX09NRF9DUkYJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVFNJNzIxX09NRF9QUklPCQkweDAwMDYwMDAwCisjZGVmaW5lIFRTSTcyMV9PTURfSU9GCQkweDA4MDAwMDAwCisjZGVmaW5lIFRTSTcyMV9PTURfRFRZUEUJMHhlMDAwMDAwMAorI2RlZmluZSBUU0k3MjFfT01EX1JTUlZECTB4MTdmODAwMDAKKworCV9fbGUzMiBtc2dfaW5mbzsKKworI2RlZmluZSBUU0k3MjFfT01EX0JDT1VOVAkweDAwMDAwZmY4CisjZGVmaW5lIFRTSTcyMV9PTURfU1NJWkUJMHgwMDAwZjAwMAorI2RlZmluZSBUU0k3MjFfT01EX0xFVEVSCTB4MDAwMzAwMDAKKyNkZWZpbmUgVFNJNzIxX09NRF9YTUJPWAkweDAwM2MwMDAwCisjZGVmaW5lIFRTSTcyMV9PTURfTUJPWAkJMHgwMGMwMDAwMAorI2RlZmluZSBUU0k3MjFfT01EX1RUCQkweDBjMDAwMDAwCisKKwl1bmlvbiB7CisJCV9fbGUzMiBidWZwdHJfbG87CS8qIGlmIERUWVBFID09IDQgKi8KKwkJX19sZTMyIG5leHRfbG87CQkvKiBpZiBEVFlQRSA9PSA1ICovCisJfTsKKworCXVuaW9uIHsKKwkJX19sZTMyIGJ1ZnB0cl9oaTsJLyogaWYgRFRZUEUgPT0gNCAqLworCQlfX2xlMzIgbmV4dF9oaTsJCS8qIGlmIERUWVBFID09IDUgKi8KKwl9OworCit9IF9fYWxpZ25lZCgxNik7CisKK3N0cnVjdCB0c2k3MjFfZG1hX3N0cyB7CisJX19sZTY0CWRlc2Nfc3RzWzhdOworfSBfX2FsaWduZWQoNjQpOworCitzdHJ1Y3QgdHNpNzIxX2Rlc2Nfc3RzX2ZpZm8geworCXVuaW9uIHsKKwkJX19sZTY0CWRhNjQ7CisJCXN0cnVjdCB7CisJCQlfX2xlMzIJbG87CisJCQlfX2xlMzIJaGk7CisJCX0gZGEzMjsKKwl9IHN0YXRbOF07Cit9IF9fYWxpZ25lZCg2NCk7CisKKy8qIERlc2NyaXB0b3IgdHlwZXMgZm9yIEJETUEgYW5kIE1lc3NhZ2luZyBibG9ja3MgKi8KK2VudW0gZG1hX2R0eXBlIHsKKwlEVFlQRTEgPSAxLCAvKiBEYXRhIFRyYW5zZmVyIERNQSBEZXNjcmlwdG9yICovCisJRFRZUEUyID0gMiwgLyogSW1tZWRpYXRlIERhdGEgVHJhbnNmZXIgRE1BIERlc2NyaXB0b3IgKi8KKwlEVFlQRTMgPSAzLCAvKiBCbG9jayBQb2ludGVyIERNQSBEZXNjcmlwdG9yICovCisJRFRZUEU0ID0gNCwgLyogT3V0Ym91bmQgTXNnIERNQSBEZXNjcmlwdG9yICovCisJRFRZUEU1ID0gNSwgLyogT0IgTWVzc2FnaW5nIEJsb2NrIFBvaW50ZXIgRGVzY3JpcHRvciAqLworCURUWVBFNiA9IDYgIC8qIEluYm91bmQgTWVzc2FnaW5nIERlc2NyaXB0b3IgKi8KK307CisKK2VudW0gZG1hX3J0eXBlIHsKKwlOUkVBRCA9IDAsCisJTEFTVF9OV1JJVEVfUiA9IDEsCisJQUxMX05XUklURSA9IDIsCisJQUxMX05XUklURV9SID0gMywKKwlNQUlOVF9SRCA9IDQsCisJTUFJTlRfV1IgPSA1Cit9OworCisvKgorICogbXBvcnQgRHJpdmVyIERlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgVFNJNzIxX0RNQV9DSE5VTQlUU0k3MjFfRE1BX01BWENICisKKyNkZWZpbmUgVFNJNzIxX0RNQUNIX01BSU5UCTAJLyogRE1BIGNoYW5uZWwgZm9yIG1haW50IHJlcXVlc3RzICovCisjZGVmaW5lIFRTSTcyMV9ETUFDSF9NQUlOVF9OQkQJMzIJLyogTnVtYmVyIG9mIEJEcyBmb3IgbWFpbnQgcmVxdWVzdHMgKi8KKworI2RlZmluZSBNU0dfRE1BX0VOVFJZX0lOWF9UT19TSVpFKHgpCSgoMHgxMCA8PCAoeCkpICYgMHhGRkZGMCkKKworZW51bSB0c2k3MjFfc21zZ19pbnRfZmxhZyB7CisJU01TR19JTlRfTk9ORQkJPSAweDAwMDAwMDAwLAorCVNNU0dfSU5UX0VDQ19DT1JfQ0gJPSAweDAwMDAwMGZmLAorCVNNU0dfSU5UX0VDQ19OQ09SX0NICT0gMHgwMDAwZmYwMCwKKwlTTVNHX0lOVF9FQ0NfQ09SCT0gMHgwMDAyMDAwMCwKKwlTTVNHX0lOVF9FQ0NfTkNPUgk9IDB4MDAwNDAwMDAsCisJU01TR19JTlRfVU5TX1JTUAk9IDB4MDA4MDAwMDAsCisJU01TR19JTlRfQUxMCQk9IDB4MDAwNmZmZmYKK307CisKKy8qIFN0cnVjdHVyZXMgKi8KKworc3RydWN0IHRzaTcyMV9iZG1hX2NoYW4geworCWludAkJYmRfbnVtOwkJLyogbnVtYmVyIG9mIGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworCXZvaWQJCSpiZF9iYXNlOwkvKiBzdGFydCBvZiBETUEgZGVzY3JpcHRvcnMgKi8KKwlkbWFfYWRkcl90CWJkX3BoeXM7CisJdm9pZAkJKnN0c19iYXNlOwkvKiBzdGFydCBvZiBETUEgQkQgc3RhdHVzIEZJRk8gKi8KKwlkbWFfYWRkcl90CXN0c19waHlzOworCWludAkJc3RzX3NpemU7Cit9OworCitzdHJ1Y3QgdHNpNzIxX2ltc2dfcmluZyB7CisJdTMyCQlzaXplOworCS8qIFZBL1BBIG9mIGRhdGEgYnVmZmVycyBmb3IgaW5jb21pbmcgbWVzc2FnZXMgKi8KKwl2b2lkCQkqYnVmX2Jhc2U7CisJZG1hX2FkZHJfdAlidWZfcGh5czsKKwkvKiBWQS9QQSBvZiBjaXJjdWxhciBmcmVlIGJ1ZmZlciBsaXN0ICovCisJdm9pZAkJKmltZnFfYmFzZTsKKwlkbWFfYWRkcl90CWltZnFfcGh5czsKKwkvKiBWQS9QQSBvZiBJbmJvdW5kIG1lc3NhZ2UgZGVzY3JpcHRvcnMgKi8KKwl2b2lkCQkqaW1kX2Jhc2U7CisJZG1hX2FkZHJfdAlpbWRfcGh5czsKKwkgLyogSW5ib3VuZCBRdWV1ZSBidWZmZXIgcG9pbnRlcnMgKi8KKwl2b2lkCQkqaW1xX2Jhc2VbVFNJNzIxX0lNU0dEX1JJTkdfU0laRV07CisKKwl1MzIJCXJ4X3Nsb3Q7CisJdm9pZAkJKmRldl9pZDsKKwl1MzIJCWZxX3dycHRyOworCXUzMgkJZGVzY19yZHB0cjsKKwlzcGlubG9ja190CWxvY2s7Cit9OworCitzdHJ1Y3QgdHNpNzIxX29tc2dfcmluZyB7CisJdTMyCQlzaXplOworCS8qIFZBL1BBIG9mIE9CIE1zZyBkZXNjcmlwdG9ycyAqLworCXZvaWQJCSpvbWRfYmFzZTsKKwlkbWFfYWRkcl90CW9tZF9waHlzOworCS8qIFZBL1BBIG9mIE9CIE1zZyBkYXRhIGJ1ZmZlcnMgKi8KKwl2b2lkCQkqb21xX2Jhc2VbVFNJNzIxX09NU0dEX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdAlvbXFfcGh5c1tUU0k3MjFfT01TR0RfUklOR19TSVpFXTsKKwkvKiBWQS9QQSBvZiBPQiBNc2cgZGVzY3JpcHRvciBzdGF0dXMgRklGTyAqLworCXZvaWQJCSpzdHNfYmFzZTsKKwlkbWFfYWRkcl90CXN0c19waHlzOworCXUzMgkJc3RzX3NpemU7IC8qICMgb2YgYWxsb2NhdGVkIHN0YXR1cyBlbnRyaWVzICovCisJdTMyCQlzdHNfcmRwdHI7CisKKwl1MzIJCXR4X3Nsb3Q7CisJdm9pZAkJKmRldl9pZDsKKwl1MzIJCXdyX2NvdW50OworCXNwaW5sb2NrX3QJbG9jazsKK307CisKK2VudW0gdHNpNzIxX2ZsYWdzIHsKKwlUU0k3MjFfVVNJTkdfTVNJCT0gKDEgPDwgMCksCisJVFNJNzIxX1VTSU5HX01TSVgJPSAoMSA8PCAxKSwKKwlUU0k3MjFfSU1TR0lEX1NFVAk9ICgxIDw8IDIpLAorfTsKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisvKgorICogTVNJLVggVGFibGUgRW50cmllcyAoMCAuLi4gNjkpCisgKi8KKyNkZWZpbmUgVFNJNzIxX01TSVhfRE1BQ0hfRE9ORSh4KQkoMCArICh4KSkKKyNkZWZpbmUgVFNJNzIxX01TSVhfRE1BQ0hfSU5UKHgpCSg4ICsgKHgpKQorI2RlZmluZSBUU0k3MjFfTVNJWF9CRE1BX0lOVAkJMTYKKyNkZWZpbmUgVFNJNzIxX01TSVhfT01TR19ET05FKHgpCSgxNyArICh4KSkKKyNkZWZpbmUgVFNJNzIxX01TSVhfT01TR19JTlQoeCkJCSgyNSArICh4KSkKKyNkZWZpbmUgVFNJNzIxX01TSVhfSU1TR19EUV9SQ1YoeCkJKDMzICsgKHgpKQorI2RlZmluZSBUU0k3MjFfTVNJWF9JTVNHX0lOVCh4KQkJKDQxICsgKHgpKQorI2RlZmluZSBUU0k3MjFfTVNJWF9NU0dfSU5UCQk0OQorI2RlZmluZSBUU0k3MjFfTVNJWF9TUjJQQ19JREJRX1JDVih4KQkoNTAgKyAoeCkpCisjZGVmaW5lIFRTSTcyMV9NU0lYX1NSMlBDX0NIX0lOVCh4KQkoNTggKyAoeCkpCisjZGVmaW5lIFRTSTcyMV9NU0lYX1NSMlBDX0lOVAkJNjYKKyNkZWZpbmUgVFNJNzIxX01TSVhfUEMyU1JfSU5UCQk2NworI2RlZmluZSBUU0k3MjFfTVNJWF9TUklPX01BQ19JTlQJNjgKKyNkZWZpbmUgVFNJNzIxX01TSVhfSTJDX0lOVAkJNjkKKworLyogTVNJLVggdmVjdG9yIGFuZCBpbml0IHRhYmxlIGVudHJ5IGluZGV4ZXMgKi8KK2VudW0gdHNpNzIxX21zaXhfdmVjdCB7CisJVFNJNzIxX1ZFQ1RfSURCLAorCVRTSTcyMV9WRUNUX1BXUlgsIC8qIFBXX1JYIGlzIHBhcnQgb2YgU1JJTyBNQUMgSW50ZXJydXB0IHJlcG9ydGluZyAqLworCVRTSTcyMV9WRUNUX09NQjBfRE9ORSwKKwlUU0k3MjFfVkVDVF9PTUIxX0RPTkUsCisJVFNJNzIxX1ZFQ1RfT01CMl9ET05FLAorCVRTSTcyMV9WRUNUX09NQjNfRE9ORSwKKwlUU0k3MjFfVkVDVF9PTUIwX0lOVCwKKwlUU0k3MjFfVkVDVF9PTUIxX0lOVCwKKwlUU0k3MjFfVkVDVF9PTUIyX0lOVCwKKwlUU0k3MjFfVkVDVF9PTUIzX0lOVCwKKwlUU0k3MjFfVkVDVF9JTUIwX1JDViwKKwlUU0k3MjFfVkVDVF9JTUIxX1JDViwKKwlUU0k3MjFfVkVDVF9JTUIyX1JDViwKKwlUU0k3MjFfVkVDVF9JTUIzX1JDViwKKwlUU0k3MjFfVkVDVF9JTUIwX0lOVCwKKwlUU0k3MjFfVkVDVF9JTUIxX0lOVCwKKwlUU0k3MjFfVkVDVF9JTUIyX0lOVCwKKwlUU0k3MjFfVkVDVF9JTUIzX0lOVCwKKwlUU0k3MjFfVkVDVF9NQVgKK307CisKKyNkZWZpbmUgSVJRX0RFVklDRV9OQU1FX01BWAk2NAorCitzdHJ1Y3QgbXNpeF9pcnEgeworCXUxNgl2ZWN0b3I7CisJY2hhcglpcnFfbmFtZVtJUlFfREVWSUNFX05BTUVfTUFYXTsKK307CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KKworc3RydWN0IHRzaTcyMV9kZXZpY2UgeworCXN0cnVjdCBwY2lfZGV2CSpwZGV2OworCXN0cnVjdCByaW9fbXBvcnQgKm1wb3J0OworCXUzMgkJZmxhZ3M7CisJdm9pZCBfX2lvbWVtCSpyZWdzOworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJc3RydWN0IG1zaXhfaXJxCW1zaXhbVFNJNzIxX1ZFQ1RfTUFYXTsKKyNlbmRpZgorCS8qIERvb3JiZWxscyAqLworCXZvaWQgX19pb21lbQkqb2RiX2Jhc2U7CisJdm9pZAkJKmlkYl9iYXNlOworCWRtYV9hZGRyX3QJaWRiX2RtYTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaWRiX3dvcms7CisJdTMyCQlkYl9kaXNjYXJkX2NvdW50OworCisJLyogSW5ib3VuZCBQb3J0LVdyaXRlICovCisJc3RydWN0IHdvcmtfc3RydWN0IHB3X3dvcms7CisJc3RydWN0IGtmaWZvCXB3X2ZpZm87CisJc3BpbmxvY2tfdAlwd19maWZvX2xvY2s7CisJdTMyCQlwd19kaXNjYXJkX2NvdW50OworCisJLyogQkRNQSBFbmdpbmUgKi8KKwlzdHJ1Y3QgdHNpNzIxX2JkbWFfY2hhbiBiZG1hW1RTSTcyMV9ETUFfQ0hOVU1dOworCisJLyogSW5ib3VuZCBNZXNzYWdpbmcgKi8KKwlpbnQJCWltc2dfaW5pdFtUU0k3MjFfSU1TR19DSE5VTV07CisJc3RydWN0IHRzaTcyMV9pbXNnX3JpbmcgaW1zZ19yaW5nW1RTSTcyMV9JTVNHX0NITlVNXTsKKworCS8qIE91dGJvdW5kIE1lc3NhZ2luZyAqLworCWludAkJb21zZ19pbml0W1RTSTcyMV9PTVNHX0NITlVNXTsKKwlzdHJ1Y3QgdHNpNzIxX29tc2dfcmluZwlvbXNnX3JpbmdbVFNJNzIxX09NU0dfQ0hOVU1dOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vcmlvLXNjYW4uYyBiL2RyaXZlcnMvcmFwaWRpby9yaW8tc2Nhbi5jCmluZGV4IGViZTc3ZGQuLjJiZWJkNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9yaW8tc2Nhbi5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9yaW8tc2Nhbi5jCkBAIC01MTYsNyArNTE2LDcgQEAKIAlyZXR1cm4gcmRldjsKIAogY2xlYW51cDoKLQlpZiAocmlvX2lzX3N3aXRjaChyZGV2KSkKKwlpZiAocnN3aXRjaCkKIAkJa2ZyZWUocnN3aXRjaC0+cm91dGVfdGFibGUpOwogCiAJa2ZyZWUocmRldik7CkBAIC05MjMsNyArOTIzLDcgQEAKICAqIHJpb19lbnVtX2NvbXBsZXRlLSBUZXN0cyBpZiBlbnVtZXJhdGlvbiBvZiBhIG5ldHdvcmsgaXMgY29tcGxldGUKICAqIEBwb3J0OiBNYXN0ZXIgcG9ydCB0byBzZW5kIHRyYW5zYWN0aW9uCiAgKgotICogVGVzdHMgdGhlIENvbXBvbmVudCBUYWcgQ1NSIGZvciBub24temVybyB2YWx1ZSAoZW51bWVyYXRpb24KKyAqIFRlc3RzIHRoZSBQR0NDU1IgZGlzY292ZXJlZCBiaXQgZm9yIG5vbi16ZXJvIHZhbHVlIChlbnVtZXJhdGlvbgogICogY29tcGxldGUgZmxhZykuIFJldHVybiAlMSBpZiBlbnVtZXJhdGlvbiBpcyBjb21wbGV0ZSBvciAlMCBpZgogICogZW51bWVyYXRpb24gaXMgaW5jb21wbGV0ZS4KICAqLwpAQCAtOTMzLDcgKzkzMyw3IEBACiAKIAlyaW9fbG9jYWxfcmVhZF9jb25maWdfMzIocG9ydCwgcG9ydC0+cGh5c19lZnB0ciArIFJJT19QT1JUX0dFTl9DVExfQ1NSLAogCQkJCSAmcmVndmFsKTsKLQlyZXR1cm4gKHJlZ3ZhbCAmIFJJT19QT1JUX0dFTl9NQVNURVIpID8gMSA6IDA7CisJcmV0dXJuIChyZWd2YWwgJiBSSU9fUE9SVF9HRU5fRElTQ09WRVJFRCkgPyAxIDogMDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvaWR0X2dlbjIuYyBiL2RyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy9pZHRfZ2VuMi5jCmluZGV4IDA0M2VlMzEuLjgwOWI3YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy9pZHRfZ2VuMi5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy9pZHRfZ2VuMi5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmlvX2Rydi5oPgogI2luY2x1ZGUgPGxpbnV4L3Jpb19pZHMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04NjA3LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODYwNy5jCmluZGV4IGQ2M2ZkZGIuLmNhMGQ2MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04NjA3LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvODhwbTg2MDcuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC84OHBtODYweC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdHJ1Y3QgcG04NjA3X3JlZ3VsYXRvcl9pbmZvIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MJZGVzYzsKQEAgLTQxMiw3ICs0MTMsNyBAQAogCQlpZiAoaW5mby0+ZGVzYy5pZCA9PSByZXMtPnN0YXJ0KQogCQkJYnJlYWs7CiAJfQotCWlmICgoaSA8IDApIHx8IChpID4gUE04NjA3X0lEX1JHX01BWCkpIHsKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHBtODYwN19yZWd1bGF0b3JfaW5mbykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGZpbmQgcmVndWxhdG9yICVsbHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcgYi9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCmluZGV4IGM3ZmQyYzAuLjk3MTNiMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwpAQCAtNjQsNiArNjQsMTYgQEAKIAogICAgICAgICAgIElmIHVuc3VyZSwgc2F5IG5vLgogCitjb25maWcgUkVHVUxBVE9SX0dQSU8KKwl0cmlzdGF0ZSAiR1BJTyByZWd1bGF0b3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEdFTkVSSUNfR1BJTworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHJlZ3VsYXRvcnMgdGhhdCBjYW4gYmUKKwkgIGNvbnRyb2xsZWQgdmlhIGdwaW9zLgorCSAgSXQgaXMgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIGN1cnJlbnQgYW5kIHZvbHRhZ2UgcmVndWxhdG9ycworCSAgYW5kIHRoZSBwbGF0Zm9ybSBoYXMgdG8gcHJvdmlkZSBhIG1hcHBpbmcgb2YgR1BJTy1zdGF0ZXMKKwkgIHRvIHRhcmdldCB2b2x0cy9hbXBzLgorCiBjb25maWcgUkVHVUxBVE9SX0JRMjQwMjIKIAl0cmlzdGF0ZSAiVEkgYnEyNDAyMiBEdWFsIElucHV0IDEtQ2VsbCBMaS1Jb24gQ2hhcmdlciBJQyIKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZSBiL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlCmluZGV4IDA0MGQ1YWEuLjkzYTYzMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSKSArPSB2aXJ0dWFsLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVVNFUlNQQUNFX0NPTlNVTUVSKSArPSB1c2Vyc3BhY2UtY29uc3VtZXIubwogCitvYmotJChDT05GSUdfUkVHVUxBVE9SX0dQSU8pICs9IGdwaW8tcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfQUQ1Mzk4KSArPSBhZDUzOTgubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyKSArPSBicTI0MDIyLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTFAzOTcxKSArPSBscDM5NzEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKaW5kZXggY2Q0MTA0NS4uNWFiZWIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYXQyODcwLXJlZ3VsYXRvci5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYWI4NTAwLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYjg1MDAuYwppbmRleCAwMmYzYzIzLi42ZTFhZTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hYjg1MDAuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYjg1MDAuYwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9hYjg1MDAuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2JxMjQwMjIuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2JxMjQwMjIuYwppbmRleCAwNjhkNDg4Li5lMjRkMWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9icTI0MDIyLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYnEyNDAyMi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvYnEyNDAyMi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwppbmRleCBkOGU2YTQyLi42NjlkMDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9yZWd1bGF0b3IuaD4KQEAgLTE0MjUsNyArMTQyNiw3IEBACiAJcmV0ID0gX3JlZ3VsYXRvcl9lbmFibGUocmRldik7CiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAKLQlpZiAocmV0ICE9IDApCisJaWYgKHJldCAhPSAwICYmIHJkZXYtPnN1cHBseSkKIAkJcmVndWxhdG9yX2Rpc2FibGUocmRldi0+c3VwcGx5KTsKIAogCXJldHVybiByZXQ7CkBAIC0xNTUyLDYgKzE1NTMsNjggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9mb3JjZV9kaXNhYmxlKTsKIAorc3RhdGljIHZvaWQgcmVndWxhdG9yX2Rpc2FibGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJlZ3VsYXRvcl9kZXYsCisJCQkJCQkgIGRpc2FibGVfd29yay53b3JrKTsKKwlpbnQgY291bnQsIGksIHJldDsKKworCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKKworCUJVR19PTighcmRldi0+ZGVmZXJyZWRfZGlzYWJsZXMpOworCisJY291bnQgPSByZGV2LT5kZWZlcnJlZF9kaXNhYmxlczsKKwlyZGV2LT5kZWZlcnJlZF9kaXNhYmxlcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyZXQgPSBfcmVndWxhdG9yX2Rpc2FibGUocmRldik7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJkZXZfZXJyKHJkZXYsICJEZWZlcnJlZCBkaXNhYmxlIGZhaWxlZDogJWRcbiIsIHJldCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CisKKwlpZiAocmRldi0+c3VwcGx5KSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZShyZGV2LT5zdXBwbHkpOworCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJcmRldl9lcnIocmRldiwKKwkJCQkJICJTdXBwbHkgZGlzYWJsZSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIHJlZ3VsYXRvcl9kaXNhYmxlX2RlZmVycmVkIC0gZGlzYWJsZSByZWd1bGF0b3Igb3V0cHV0IHdpdGggZGVsYXkKKyAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBzb3VyY2UKKyAqIEBtczogbWlsaXNlY29uZHMgdW50aWwgdGhlIHJlZ3VsYXRvciBpcyBkaXNhYmxlZAorICoKKyAqIEV4ZWN1dGUgcmVndWxhdG9yX2Rpc2FibGUoKSBvbiB0aGUgcmVndWxhdG9yIGFmdGVyIGEgZGVsYXkuICBUaGlzCisgKiBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggZGV2aWNlcyB0aGF0IHJlcXVpcmUgc29tZSB0aW1lIHRvIHF1aWVzY2UuCisgKgorICogTk9URTogdGhpcyB3aWxsIG9ubHkgZGlzYWJsZSB0aGUgcmVndWxhdG9yIG91dHB1dCBpZiBubyBvdGhlciBjb25zdW1lcgorICogZGV2aWNlcyBoYXZlIGl0IGVuYWJsZWQsIHRoZSByZWd1bGF0b3IgZGV2aWNlIHN1cHBvcnRzIGRpc2FibGluZyBhbmQKKyAqIG1hY2hpbmUgY29uc3RyYWludHMgcGVybWl0IHRoaXMgb3BlcmF0aW9uLgorICovCitpbnQgcmVndWxhdG9yX2Rpc2FibGVfZGVmZXJyZWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLCBpbnQgbXMpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSByZWd1bGF0b3ItPnJkZXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKKwlyZGV2LT5kZWZlcnJlZF9kaXNhYmxlcysrOworCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOworCisJcmV0ID0gc2NoZWR1bGVfZGVsYXllZF93b3JrKCZyZGV2LT5kaXNhYmxlX3dvcmssCisJCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMobXMpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX2Rpc2FibGVfZGVmZXJyZWQpOworCiBzdGF0aWMgaW50IF9yZWd1bGF0b3JfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAkvKiBJZiB3ZSBkb24ndCBrbm93IHRoZW4gYXNzdW1lIHRoYXQgdGhlIHJlZ3VsYXRvciBpcyBhbHdheXMgb24gKi8KQEAgLTI2MjIsNiArMjY4NSw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnJkZXYtPmNvbnN1bWVyX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5saXN0KTsKIAlCTE9DS0lOR19JTklUX05PVElGSUVSX0hFQUQoJnJkZXYtPm5vdGlmaWVyKTsKKwlJTklUX0RFTEFZRURfV09SSygmcmRldi0+ZGlzYWJsZV93b3JrLCByZWd1bGF0b3JfZGlzYWJsZV93b3JrKTsKIAogCS8qIHByZWZvcm0gYW55IHJlZ3VsYXRvciBzcGVjaWZpYyBpbml0ICovCiAJaWYgKGluaXRfZGF0YS0+cmVndWxhdG9yX2luaXQpIHsKQEAgLTI3MjksNiArMjc5Myw3IEBACiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHJkZXYtPmRlYnVnZnMpOwogI2VuZGlmCisJZmx1c2hfd29ya19zeW5jKCZyZGV2LT5kaXNhYmxlX3dvcmsud29yayk7CiAJV0FSTl9PTihyZGV2LT5vcGVuX2NvdW50KTsKIAl1bnNldF9yZWd1bGF0b3Jfc3VwcGxpZXMocmRldik7CiAJbGlzdF9kZWwoJnJkZXYtPmxpc3QpOwpAQCAtMjkwNyw2ICsyOTcyLDQzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfZ2V0X2luaXRfZHJ2ZGF0YSk7CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0YXRpYyBzc2l6ZV90IHN1cHBseV9tYXBfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKmJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlzc2l6ZV90IGxlbiwgcmV0ID0gMDsKKwlzdHJ1Y3QgcmVndWxhdG9yX21hcCAqbWFwOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXAsICZyZWd1bGF0b3JfbWFwX2xpc3QsIGxpc3QpIHsKKwkJbGVuID0gc25wcmludGYoYnVmICsgcmV0LCBQQUdFX1NJWkUgLSByZXQsCisJCQkgICAgICAgIiVzIC0+ICVzLiVzXG4iLAorCQkJICAgICAgIHJkZXZfZ2V0X25hbWUobWFwLT5yZWd1bGF0b3IpLCBtYXAtPmRldl9uYW1lLAorCQkJICAgICAgIG1hcC0+c3VwcGx5KTsKKwkJaWYgKGxlbiA+PSAwKQorCQkJcmV0ICs9IGxlbjsKKwkJaWYgKHJldCA+IFBBR0VfU0laRSkgeworCQkJcmV0ID0gUEFHRV9TSVpFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcmV0KTsKKworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdXBwbHlfbWFwX2ZvcHMgPSB7CisJLnJlYWQgPSBzdXBwbHlfbWFwX3JlYWRfZmlsZSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworI2VuZGlmCisKIHN0YXRpYyBpbnQgX19pbml0IHJlZ3VsYXRvcl9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTI5MTksNiArMzAyMSwxMCBAQAogCQlwcl93YXJuKCJyZWd1bGF0b3I6IEZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnlcbiIpOwogCQlkZWJ1Z2ZzX3Jvb3QgPSBOVUxMOwogCX0KKworCWlmIChJU19FUlIoZGVidWdmc19jcmVhdGVfZmlsZSgic3VwcGx5X21hcCIsIDA0NDQsIGRlYnVnZnNfcm9vdCwKKwkJCQkgICAgICAgTlVMTCwgJnN1cHBseV9tYXBfZm9wcykpKQorCQlwcl93YXJuKCJyZWd1bGF0b3I6IEZhaWxlZCB0byBjcmVhdGUgc3VwcGxpZXMgZGVidWdmc1xuIik7CiAjZW5kaWYKIAogCXJlZ3VsYXRvcl9kdW1teV9pbml0KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwM3guYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCmluZGV4IDM2MmUwODIuLmUyM2RkZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYwppbmRleCAyYmI4ZjQ1Li43ODMyOTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuYwpAQCAtMTMsMTAgKzEzLDExIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvZGI4NTAwLXByY211Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RieDUwMC1wcmNtdS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIHBvd2VyIHN0YXRlIHJlZmVyZW5jZSBjb3VudApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMKaW5kZXggZjZlZjY2OS4uYjhmNTIwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZml4ZWQuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2ZpeGVkLmMKaW5kZXggMmZlOWQ5OWMuLjIxZWNmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2ZpeGVkLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZml4ZWQuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2ZpeGVkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGFjZjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIGdwaW8tcmVndWxhdG9yLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBIZWlrbyBTdHVlYm5lciA8aGVpa29Ac250ZWNoLmRlPgorICoKKyAqIGJhc2VkIG9uIGZpeGVkLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKiBSb2dlciBRdWFkcm9zIDxleHQtcm9nZXIucXVhZHJvc0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3lzdGVtcyB3aXRoIG1peGVkIGNvbnRyb2xsYWJsZSBhbmQKKyAqIG5vbi1jb250cm9sbGFibGUgcmVndWxhdG9ycywgYXMgd2VsbCBhcyBmb3IgYWxsb3dpbmcgdGVzdGluZyBvbgorICogc3lzdGVtcyB3aXRoIG5vIGNvbnRyb2xsYWJsZSByZWd1bGF0b3JzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEgeworCXN0cnVjdCByZWd1bGF0b3JfZGVzYyBkZXNjOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXY7CisKKwlpbnQgZW5hYmxlX2dwaW87CisJYm9vbCBlbmFibGVfaGlnaDsKKwlib29sIGlzX2VuYWJsZWQ7CisJdW5zaWduZWQgc3RhcnR1cF9kZWxheTsKKworCXN0cnVjdCBncGlvICpncGlvczsKKwlpbnQgbnJfZ3Bpb3M7CisKKwlzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3Jfc3RhdGUgKnN0YXRlczsKKwlpbnQgbnJfc3RhdGVzOworCisJaW50IHN0YXRlOworfTsKKworc3RhdGljIGludCBncGlvX3JlZ3VsYXRvcl9pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEgKmRhdGEgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gZGF0YS0+aXNfZW5hYmxlZDsKK30KKworc3RhdGljIGludCBncGlvX3JlZ3VsYXRvcl9lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3JfZGF0YSAqZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChncGlvX2lzX3ZhbGlkKGRhdGEtPmVuYWJsZV9ncGlvKSkgeworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5lbmFibGVfZ3BpbywgZGF0YS0+ZW5hYmxlX2hpZ2gpOworCQlkYXRhLT5pc19lbmFibGVkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvX3JlZ3VsYXRvcl9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEgKmRhdGEgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZ3Bpb19pc192YWxpZChkYXRhLT5lbmFibGVfZ3BpbykpIHsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZGF0YS0+ZW5hYmxlX2dwaW8sICFkYXRhLT5lbmFibGVfaGlnaCk7CisJCWRhdGEtPmlzX2VuYWJsZWQgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvX3JlZ3VsYXRvcl9lbmFibGVfdGltZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhICpkYXRhID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIGRhdGEtPnN0YXJ0dXBfZGVsYXk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19yZWd1bGF0b3JfZ2V0X3ZhbHVlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEgKmRhdGEgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHB0cjsKKworCWZvciAocHRyID0gMDsgcHRyIDwgZGF0YS0+bnJfc3RhdGVzOyBwdHIrKykKKwkJaWYgKGRhdGEtPnN0YXRlc1twdHJdLmdwaW9zID09IGRhdGEtPnN0YXRlKQorCQkJcmV0dXJuIGRhdGEtPnN0YXRlc1twdHJdLnZhbHVlOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19yZWd1bGF0b3Jfc2V0X3ZhbHVlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCisJCQkJCWludCBtaW4sIGludCBtYXgpCit7CisJc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEgKmRhdGEgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHB0ciwgdGFyZ2V0LCBzdGF0ZTsKKworCXRhcmdldCA9IC0xOworCWZvciAocHRyID0gMDsgcHRyIDwgZGF0YS0+bnJfc3RhdGVzOyBwdHIrKykKKwkJaWYgKGRhdGEtPnN0YXRlc1twdHJdLnZhbHVlID49IG1pbiAmJgorCQkgICAgZGF0YS0+c3RhdGVzW3B0cl0udmFsdWUgPD0gbWF4KQorCQkJdGFyZ2V0ID0gZGF0YS0+c3RhdGVzW3B0cl0uZ3Bpb3M7CisKKwlpZiAodGFyZ2V0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IGRhdGEtPm5yX2dwaW9zOyBwdHIrKykgeworCQlzdGF0ZSA9ICh0YXJnZXQgJiAoMSA8PCBwdHIpKSA+PiBwdHI7CisJCWdwaW9fc2V0X3ZhbHVlKGRhdGEtPmdwaW9zW3B0cl0uZ3Bpbywgc3RhdGUpOworCX0KKwlkYXRhLT5zdGF0ZSA9IHRhcmdldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwaW9fcmVndWxhdG9yX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCisJCQkJCWludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJCXVuc2lnbmVkICpzZWxlY3RvcikKK3sKKwlyZXR1cm4gZ3Bpb19yZWd1bGF0b3Jfc2V0X3ZhbHVlKGRldiwgbWluX3VWLCBtYXhfdVYpOworfQorCitzdGF0aWMgaW50IGdwaW9fcmVndWxhdG9yX2xpc3Rfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhICpkYXRhID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKHNlbGVjdG9yID49IGRhdGEtPm5yX3N0YXRlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZGF0YS0+c3RhdGVzW3NlbGVjdG9yXS52YWx1ZTsKK30KKworc3RhdGljIGludCBncGlvX3JlZ3VsYXRvcl9zZXRfY3VycmVudF9saW1pdChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQlpbnQgbWluX3VBLCBpbnQgbWF4X3VBKQoreworCXJldHVybiBncGlvX3JlZ3VsYXRvcl9zZXRfdmFsdWUoZGV2LCBtaW5fdUEsIG1heF91QSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBncGlvX3JlZ3VsYXRvcl92b2x0YWdlX29wcyA9IHsKKwkuaXNfZW5hYmxlZCA9IGdwaW9fcmVndWxhdG9yX2lzX2VuYWJsZWQsCisJLmVuYWJsZSA9IGdwaW9fcmVndWxhdG9yX2VuYWJsZSwKKwkuZGlzYWJsZSA9IGdwaW9fcmVndWxhdG9yX2Rpc2FibGUsCisJLmVuYWJsZV90aW1lID0gZ3Bpb19yZWd1bGF0b3JfZW5hYmxlX3RpbWUsCisJLmdldF92b2x0YWdlID0gZ3Bpb19yZWd1bGF0b3JfZ2V0X3ZhbHVlLAorCS5zZXRfdm9sdGFnZSA9IGdwaW9fcmVndWxhdG9yX3NldF92b2x0YWdlLAorCS5saXN0X3ZvbHRhZ2UgPSBncGlvX3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgZ3Bpb19yZWd1bGF0b3JfY3VycmVudF9vcHMgPSB7CisJLmlzX2VuYWJsZWQgPSBncGlvX3JlZ3VsYXRvcl9pc19lbmFibGVkLAorCS5lbmFibGUgPSBncGlvX3JlZ3VsYXRvcl9lbmFibGUsCisJLmRpc2FibGUgPSBncGlvX3JlZ3VsYXRvcl9kaXNhYmxlLAorCS5lbmFibGVfdGltZSA9IGdwaW9fcmVndWxhdG9yX2VuYWJsZV90aW1lLAorCS5nZXRfY3VycmVudF9saW1pdCA9IGdwaW9fcmVndWxhdG9yX2dldF92YWx1ZSwKKwkuc2V0X2N1cnJlbnRfbGltaXQgPSBncGlvX3JlZ3VsYXRvcl9zZXRfY3VycmVudF9saW1pdCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwaW9fcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGdwaW9fcmVndWxhdG9yX2NvbmZpZyAqY29uZmlnID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEgKmRydmRhdGE7CisJaW50IHB0ciwgcmV0LCBzdGF0ZTsKKworCWRydmRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3JfZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChkcnZkYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRldmljZSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZHJ2ZGF0YS0+ZGVzYy5uYW1lID0ga3N0cmR1cChjb25maWctPnN1cHBseV9uYW1lLCBHRlBfS0VSTkVMKTsKKwlpZiAoZHJ2ZGF0YS0+ZGVzYy5uYW1lID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHN1cHBseSBuYW1lXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJZHJ2ZGF0YS0+Z3Bpb3MgPSBrbWVtZHVwKGNvbmZpZy0+Z3Bpb3MsCisJCQkJIGNvbmZpZy0+bnJfZ3Bpb3MgKiBzaXplb2Yoc3RydWN0IGdwaW8pLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoZHJ2ZGF0YS0+Z3Bpb3MgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgZ3BpbyBkYXRhXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfbmFtZTsKKwl9CisKKwlkcnZkYXRhLT5zdGF0ZXMgPSBrbWVtZHVwKGNvbmZpZy0+c3RhdGVzLAorCQkJCSAgY29uZmlnLT5ucl9zdGF0ZXMgKgorCQkJCQkgc2l6ZW9mKHN0cnVjdCBncGlvX3JlZ3VsYXRvcl9zdGF0ZSksCisJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoZHJ2ZGF0YS0+c3RhdGVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHN0YXRlIGRhdGFcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tZW1ncGlvOworCX0KKwlkcnZkYXRhLT5ucl9zdGF0ZXMgPSBjb25maWctPm5yX3N0YXRlczsKKworCWRydmRhdGEtPmRlc2Mub3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qIGhhbmRsZSByZWd1bGF0b3IgdHlwZSovCisJc3dpdGNoIChjb25maWctPnR5cGUpIHsKKwljYXNlIFJFR1VMQVRPUl9WT0xUQUdFOgorCQlkcnZkYXRhLT5kZXNjLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRTsKKwkJZHJ2ZGF0YS0+ZGVzYy5vcHMgPSAmZ3Bpb19yZWd1bGF0b3Jfdm9sdGFnZV9vcHM7CisJCWRydmRhdGEtPmRlc2Mubl92b2x0YWdlcyA9IGNvbmZpZy0+bnJfc3RhdGVzOworCQlicmVhazsKKwljYXNlIFJFR1VMQVRPUl9DVVJSRU5UOgorCQlkcnZkYXRhLT5kZXNjLnR5cGUgPSBSRUdVTEFUT1JfQ1VSUkVOVDsKKwkJZHJ2ZGF0YS0+ZGVzYy5vcHMgPSAmZ3Bpb19yZWd1bGF0b3JfY3VycmVudF9vcHM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHJlZ3VsYXRvciB0eXBlIHNldFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX21lbWdwaW87CisJCWJyZWFrOworCX0KKworCWRydmRhdGEtPmVuYWJsZV9ncGlvID0gY29uZmlnLT5lbmFibGVfZ3BpbzsKKwlkcnZkYXRhLT5zdGFydHVwX2RlbGF5ID0gY29uZmlnLT5zdGFydHVwX2RlbGF5OworCisJaWYgKGdwaW9faXNfdmFsaWQoY29uZmlnLT5lbmFibGVfZ3BpbykpIHsKKwkJZHJ2ZGF0YS0+ZW5hYmxlX2hpZ2ggPSBjb25maWctPmVuYWJsZV9oaWdoOworCisJCXJldCA9IGdwaW9fcmVxdWVzdChjb25maWctPmVuYWJsZV9ncGlvLCBjb25maWctPnN1cHBseV9uYW1lKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJICAgIkNvdWxkIG5vdCBvYnRhaW4gcmVndWxhdG9yIGVuYWJsZSBHUElPICVkOiAlZFxuIiwKKwkJCQkJCWNvbmZpZy0+ZW5hYmxlX2dwaW8sIHJldCk7CisJCQlnb3RvIGVycl9tZW1zdGF0ZTsKKwkJfQorCisJCS8qIHNldCBvdXRwdXQgZGlyZWN0aW9uIHdpdGhvdXQgY2hhbmdpbmcgc3RhdGUKKwkJICogdG8gcHJldmVudCBnbGl0Y2gKKwkJICovCisJCWlmIChjb25maWctPmVuYWJsZWRfYXRfYm9vdCkgeworCQkJZHJ2ZGF0YS0+aXNfZW5hYmxlZCA9IHRydWU7CisJCQlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoY29uZmlnLT5lbmFibGVfZ3BpbywKKwkJCQkJCSAgICBjb25maWctPmVuYWJsZV9oaWdoKTsKKwkJfSBlbHNlIHsKKwkJCWRydmRhdGEtPmlzX2VuYWJsZWQgPSBmYWxzZTsKKwkJCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChjb25maWctPmVuYWJsZV9ncGlvLAorCQkJCQkJICAgICFjb25maWctPmVuYWJsZV9oaWdoKTsKKwkJfQorCisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSAgICJDb3VsZCBub3QgY29uZmlndXJlIHJlZ3VsYXRvciBlbmFibGUgR1BJTyAlZCBkaXJlY3Rpb246ICVkXG4iLAorCQkJCQkJY29uZmlnLT5lbmFibGVfZ3BpbywgcmV0KTsKKwkJCWdvdG8gZXJyX2VuYWJsZWdwaW87CisJCX0KKwl9IGVsc2UgeworCQkvKiBSZWd1bGF0b3Igd2l0aG91dCBHUElPIGNvbnRyb2wgaXMgY29uc2lkZXJlZAorCQkgKiBhbHdheXMgZW5hYmxlZAorCQkgKi8KKwkJZHJ2ZGF0YS0+aXNfZW5hYmxlZCA9IHRydWU7CisJfQorCisJZHJ2ZGF0YS0+bnJfZ3Bpb3MgPSBjb25maWctPm5yX2dwaW9zOworCXJldCA9IGdwaW9fcmVxdWVzdF9hcnJheShkcnZkYXRhLT5ncGlvcywgZHJ2ZGF0YS0+bnJfZ3Bpb3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkgICAiQ291bGQgbm90IG9idGFpbiByZWd1bGF0b3Igc2V0dGluZyBHUElPczogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2VuYWJsZWdwaW87CisJfQorCisJLyogYnVpbGQgaW5pdGlhbCBzdGF0ZSBmcm9tIGdwaW8gaW5pdCBkYXRhLiAqLworCXN0YXRlID0gMDsKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IGRydmRhdGEtPm5yX2dwaW9zOyBwdHIrKykgeworCQlpZiAoY29uZmlnLT5ncGlvc1twdHJdLmZsYWdzICYgR1BJT0ZfT1VUX0lOSVRfSElHSCkKKwkJCXN0YXRlIHw9ICgxIDw8IHB0cik7CisJfQorCWRydmRhdGEtPnN0YXRlID0gc3RhdGU7CisKKwlkcnZkYXRhLT5kZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJmRydmRhdGEtPmRlc2MsICZwZGV2LT5kZXYsCisJCQkJCSAgY29uZmlnLT5pbml0X2RhdGEsIGRydmRhdGEpOworCWlmIChJU19FUlIoZHJ2ZGF0YS0+ZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGRydmRhdGEtPmRldik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3I6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9zdGF0ZWdwaW87CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZHJ2ZGF0YSk7CisKKwlyZXR1cm4gMDsKKworZXJyX3N0YXRlZ3BpbzoKKwlncGlvX2ZyZWVfYXJyYXkoZHJ2ZGF0YS0+Z3Bpb3MsIGRydmRhdGEtPm5yX2dwaW9zKTsKK2Vycl9lbmFibGVncGlvOgorCWlmIChncGlvX2lzX3ZhbGlkKGNvbmZpZy0+ZW5hYmxlX2dwaW8pKQorCQlncGlvX2ZyZWUoY29uZmlnLT5lbmFibGVfZ3Bpbyk7CitlcnJfbWVtc3RhdGU6CisJa2ZyZWUoZHJ2ZGF0YS0+c3RhdGVzKTsKK2Vycl9tZW1ncGlvOgorCWtmcmVlKGRydmRhdGEtPmdwaW9zKTsKK2Vycl9uYW1lOgorCWtmcmVlKGRydmRhdGEtPmRlc2MubmFtZSk7CitlcnI6CisJa2ZyZWUoZHJ2ZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZ3Bpb19yZWd1bGF0b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEgKmRydmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKGRydmRhdGEtPmRldik7CisKKwlncGlvX2ZyZWVfYXJyYXkoZHJ2ZGF0YS0+Z3Bpb3MsIGRydmRhdGEtPm5yX2dwaW9zKTsKKworCWtmcmVlKGRydmRhdGEtPnN0YXRlcyk7CisJa2ZyZWUoZHJ2ZGF0YS0+Z3Bpb3MpOworCisJaWYgKGdwaW9faXNfdmFsaWQoZHJ2ZGF0YS0+ZW5hYmxlX2dwaW8pKQorCQlncGlvX2ZyZWUoZHJ2ZGF0YS0+ZW5hYmxlX2dwaW8pOworCisJa2ZyZWUoZHJ2ZGF0YS0+ZGVzYy5uYW1lKTsKKwlrZnJlZShkcnZkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBncGlvX3JlZ3VsYXRvcl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGdwaW9fcmVndWxhdG9yX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ3Bpb19yZWd1bGF0b3JfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gImdwaW8tcmVndWxhdG9yIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBncGlvX3JlZ3VsYXRvcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZ3Bpb19yZWd1bGF0b3JfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChncGlvX3JlZ3VsYXRvcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGdwaW9fcmVndWxhdG9yX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ3Bpb19yZWd1bGF0b3JfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGdwaW9fcmVndWxhdG9yX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJIZWlrbyBTdHVlYm5lciA8aGVpa29Ac250ZWNoLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJncGlvIHZvbHRhZ2UgcmVndWxhdG9yIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmdwaW8tcmVndWxhdG9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3MS5jCmluZGV4IDBmMjJlZjEuLjcyYjE2YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3MS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3MS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9scDM5NzEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzIuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3Mi5jCmluZGV4IDZhYTFiNTAuLmZiYzVlMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3Mi5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2xwMzk3Mi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9scDM5NzIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYwppbmRleCAzMGViOWU1Li4xMDYyY2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjQ5LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY0OS5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAlyZXQgPSAocmV0ICYgTUFYODY0OV9SQU1QX01BU0spID4+IDU7CiAJcmF0ZSA9ICgzMiAqIDEwMDApID4+IHJldDsJLyogdVYvdVMgKi8KIAotCXJldHVybiAodm9sdGFnZSAvIHJhdGUpOworCXJldHVybiBESVZfUk9VTkRfVVAodm9sdGFnZSwgcmF0ZSk7CiB9CiAKIHN0YXRpYyBpbnQgbWF4ODY0OV9zZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgdW5zaWduZWQgaW50IG1vZGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTI1LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkyNS1yZWd1bGF0b3IuYwppbmRleCBlNGRiZDY2Li5jYzllYzBlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkyNS1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTI1LXJlZ3VsYXRvci5jCkBAIC05LDYgKzksNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMKaW5kZXggNDg2ZWQ4MS4uMzg4M2Q4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWF4ODk1Mi5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDcsNyArNDYsNiBAQAogc3RydWN0IG1heDg5NTJfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwotCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJc3RydWN0IG1heDg5NTJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYJKnJkZXY7CiAKQEAgLTIwOCw3ICsyMDYsNiBAQAogCW1heDg5NTItPmNsaWVudCA9IGNsaWVudDsKIAltYXg4OTUyLT5kZXYgPSAmY2xpZW50LT5kZXY7CiAJbWF4ODk1Mi0+cGRhdGEgPSBwZGF0YTsKLQltdXRleF9pbml0KCZtYXg4OTUyLT5tdXRleCk7CiAKIAltYXg4OTUyLT5yZGV2ID0gcmVndWxhdG9yX3JlZ2lzdGVyKCZyZWd1bGF0b3IsIG1heDg5NTItPmRldiwKIAkJCSZwZGF0YS0+cmVnX2RhdGEsIG1heDg5NTIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jCmluZGV4IGFkNjYyOGMuLjYxNzYxMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzc4My1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21jMTM3ODMtcmVndWxhdG9yLmMKaW5kZXggNzMwZjQzYS4uODQ3OTA4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzc4My1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzNzgzLXJlZ3VsYXRvci5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJtYzEzeHh4LmgiCiAKICNkZWZpbmUgTUMxMzc4M19SRUdfU1dJVENIRVJTNQkJCTI5CkBAIC0zMzYsOSArMzM3LDkgQEAKIHsKIAlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdjsKIAlzdHJ1Y3QgbWMxM3h4eCAqbWMxMzc4MyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgbWMxMzc4M19yZWd1bGF0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CiAJCWRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhOworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YTsKIAlpbnQgaSwgcmV0OwogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgaWQgJWRcbiIsIF9fZnVuY19fLCBwZGV2LT5pZCk7CkBAIC0zODEsNyArMzgyLDcgQEAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG1jMTM3ODNfcmVndWxhdG9yX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQogCQlkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCWludCBpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzODkyLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzg5Mi1yZWd1bGF0b3IuYwppbmRleCAzMjg1ZDQxLi4wMjNkMTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzODkyLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21jMTM4OTItcmVndWxhdG9yLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIm1jMTN4eHguaCIKIAogI2RlZmluZSBNQzEzODkyX1JFVklTSU9OCQkJNwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWMxM3h4eC1yZWd1bGF0b3ItY29yZS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWMxM3h4eC1yZWd1bGF0b3ItY29yZS5jCmluZGV4IGJjMjdhYjEuLjY1MzI4NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21jMTN4eHgtcmVndWxhdG9yLWNvcmUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LXJlZ3VsYXRvci1jb3JlLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIm1jMTN4eHguaCIKIAogc3RhdGljIGludCBtYzEzeHh4X3JlZ3VsYXRvcl9lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTAyMy1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDIzLXJlZ3VsYXRvci5jCmluZGV4IDcwMWE1OTAuLjlmYjRjN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDIzLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDIzLXJlZ3VsYXRvci5jCkBAIC02Myw2ICs2MywxMyBAQAogI2RlZmluZSBUUFM2NTAyM19SRUdfQ1RSTF9MRE8yX0VOCUJJVCgyKQogI2RlZmluZSBUUFM2NTAyM19SRUdfQ1RSTF9MRE8xX0VOCUJJVCgxKQogCisvKiBSRUdfQ1RSTDIgYml0ZmllbGRzICovCisjZGVmaW5lIFRQUzY1MDIzX1JFR19DVFJMMl9HTwkJQklUKDcpCisjZGVmaW5lIFRQUzY1MDIzX1JFR19DVFJMMl9DT1JFX0FESglCSVQoNikKKyNkZWZpbmUgVFBTNjUwMjNfUkVHX0NUUkwyX0RDREMyCUJJVCgyKQorI2RlZmluZSBUUFM2NTAyM19SRUdfQ1RSTDJfRENEQzEJQklUKDEpCisjZGVmaW5lIFRQUzY1MDIzX1JFR19DVFJMMl9EQ0RDMwlCSVQoMCkKKwogLyogTERPX0NUUkwgYml0ZmllbGRzICovCiAjZGVmaW5lIFRQUzY1MDIzX0xET19DVFJMX0xET3hfU0hJRlQobGRvX2lkKQkoKGxkb19pZCkqNCkKICNkZWZpbmUgVFBTNjUwMjNfTERPX0NUUkxfTERPeF9NQVNLKGxkb19pZCkJKDB4RjAgPj4gKChsZG9faWQpKjQpKQpAQCAtODUsNyArOTIsNyBAQAogI2RlZmluZSBUUFM2NTAyM19NQVhfUkVHX0lECQlUUFM2NTAyM19MRE9fMgogCiAvKiBTdXBwb3J0ZWQgdm9sdGFnZSB2YWx1ZXMgZm9yIHJlZ3VsYXRvcnMgKi8KLXN0YXRpYyBjb25zdCB1MTYgVkRDREMxX1ZTRUxfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCB1MTYgVkNPUkVfVlNFTF90YWJsZVtdID0gewogCTgwMCwgODI1LCA4NTAsIDg3NSwKIAk5MDAsIDkyNSwgOTUwLCA5NzUsCiAJMTAwMCwgMTAyNSwgMTA1MCwgMTA3NSwKQEAgLTk2LDIwICsxMDMsMjkgQEAKIAkxNTAwLCAxNTI1LCAxNTUwLCAxNjAwLAogfTsKIAotc3RhdGljIGNvbnN0IHUxNiBMRE8xX1ZTRUxfdGFibGVbXSA9IHsKKy8qIFN1cHBvcnRlZCB2b2x0YWdlIHZhbHVlcyBmb3IgTERPIHJlZ3VsYXRvcnMgZm9yIHRwczY1MDIwICovCitzdGF0aWMgY29uc3QgdTE2IFRQUzY1MDIwX0xETzFfVlNFTF90YWJsZVtdID0geworCTEwMDAsIDEwNTAsIDExMDAsIDEzMDAsCisJMTgwMCwgMjUwMCwgMzAwMCwgMzMwMCwKK307CisKK3N0YXRpYyBjb25zdCB1MTYgVFBTNjUwMjBfTERPMl9WU0VMX3RhYmxlW10gPSB7CisJMTAwMCwgMTA1MCwgMTEwMCwgMTMwMCwKKwkxODAwLCAyNTAwLCAzMDAwLCAzMzAwLAorfTsKKworLyogU3VwcG9ydGVkIHZvbHRhZ2UgdmFsdWVzIGZvciBMRE8gcmVndWxhdG9ycworICogZm9yIHRwczY1MDIxIGFuZCB0cHM2NTAyMyAqLworc3RhdGljIGNvbnN0IHUxNiBUUFM2NTAyM19MRE8xX1ZTRUxfdGFibGVbXSA9IHsKIAkxMDAwLCAxMTAwLCAxMzAwLCAxODAwLAogCTIyMDAsIDI2MDAsIDI4MDAsIDMxNTAsCiB9OwogCi1zdGF0aWMgY29uc3QgdTE2IExETzJfVlNFTF90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHUxNiBUUFM2NTAyM19MRE8yX1ZTRUxfdGFibGVbXSA9IHsKIAkxMDUwLCAxMjAwLCAxMzAwLCAxODAwLAogCTI1MDAsIDI4MDAsIDMwMDAsIDMzMDAsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IG51bV92b2x0YWdlc1tdID0ge0FSUkFZX1NJWkUoVkRDREMxX1ZTRUxfdGFibGUpLAotCQkJCTAsIDAsIEFSUkFZX1NJWkUoTERPMV9WU0VMX3RhYmxlKSwKLQkJCQlBUlJBWV9TSVpFKExETzJfVlNFTF90YWJsZSl9OwotCiAvKiBSZWd1bGF0b3Igc3BlY2lmaWMgZGV0YWlscyAqLwogc3RydWN0IHRwc19pbmZvIHsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtMTI3LDYgKzE0MywxMyBAQAogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W1RQUzY1MDIzX05VTV9SRUdVTEFUT1JdOwogCWNvbnN0IHN0cnVjdCB0cHNfaW5mbyAqaW5mb1tUUFM2NTAyM19OVU1fUkVHVUxBVE9SXTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJdTggY29yZV9yZWd1bGF0b3I7Cit9OworCisvKiBTdHJ1Y3QgcGFzc2VkIGFzIGRyaXZlciBkYXRhICovCitzdHJ1Y3QgdHBzX2RyaXZlcl9kYXRhIHsKKwljb25zdCBzdHJ1Y3QgdHBzX2luZm8gKmluZm87CisJdTggY29yZV9yZWd1bGF0b3I7CiB9OwogCiBzdGF0aWMgaW50IHRwc182NTAyM19zZXRfYml0cyhzdHJ1Y3QgdHBzX3BtaWMgKnRwcywgdTggcmVnLCB1OCBtYXNrKQpAQCAtMjUzLDcgKzI3Niw3IEBACiAJaWYgKGRjZGMgPCBUUFM2NTAyM19EQ0RDXzEgfHwgZGNkYyA+IFRQUzY1MDIzX0RDRENfMykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZGNkYyA9PSBUUFM2NTAyM19EQ0RDXzEpIHsKKwlpZiAoZGNkYyA9PSB0cHMtPmNvcmVfcmVndWxhdG9yKSB7CiAJCWRhdGEgPSB0cHNfNjUwMjNfcmVnX3JlYWQodHBzLCBUUFM2NTAyM19SRUdfREVGX0NPUkUpOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gZGF0YTsKQEAgLTI3MCwxMCArMjkzLDEwIEBACiAJc3RydWN0IHRwc19wbWljICp0cHMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGRjZGMgPSByZGV2X2dldF9pZChkZXYpOwogCWludCB2c2VsOworCWludCByZXQ7CiAKLQlpZiAoZGNkYyAhPSBUUFM2NTAyM19EQ0RDXzEpCisJaWYgKGRjZGMgIT0gdHBzLT5jb3JlX3JlZ3VsYXRvcikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlpZiAobWluX3VWIDwgdHBzLT5pbmZvW2RjZGNdLT5taW5fdVYKIAkJCXx8IG1pbl91ViA+IHRwcy0+aW5mb1tkY2RjXS0+bWF4X3VWKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI5MiwxMSArMzE1LDIxIEBACiAKIAkqc2VsZWN0b3IgPSB2c2VsOwogCi0JLyogd3JpdGUgdG8gdGhlIHJlZ2lzdGVyIGluIGNhc2Ugd2UgZm91bmQgYSBtYXRjaCAqLwogCWlmICh2c2VsID09IHRwcy0+aW5mb1tkY2RjXS0+dGFibGVfbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLQllbHNlCi0JCXJldHVybiB0cHNfNjUwMjNfcmVnX3dyaXRlKHRwcywgVFBTNjUwMjNfUkVHX0RFRl9DT1JFLCB2c2VsKTsKKwkJZ290byBmYWlsZWQ7CisKKwlyZXQgPSB0cHNfNjUwMjNfcmVnX3dyaXRlKHRwcywgVFBTNjUwMjNfUkVHX0RFRl9DT1JFLCB2c2VsKTsKKworCS8qIFRlbGwgdGhlIGNoaXAgdGhhdCB3ZSBoYXZlIGNoYW5nZWQgdGhlIHZhbHVlIGluIERFRkNPUkUKKwkgKiBhbmQgaXRzIHRpbWUgdG8gdXBkYXRlIHRoZSBjb3JlIHZvbHRhZ2UKKwkgKi8KKwl0cHNfNjUwMjNfc2V0X2JpdHModHBzLCBUUFM2NTAyM19SRUdfQ09OX0NUUkwyLAorCQkJCQkJVFBTNjUwMjNfUkVHX0NUUkwyX0dPKTsKKworCXJldHVybiByZXQ7CisKK2ZhaWxlZDoKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCB0cHM2NTAyM19sZG9fZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKQEAgLTM2Miw3ICszOTUsNyBAQAogCWlmIChkY2RjIDwgVFBTNjUwMjNfRENEQ18xIHx8IGRjZGMgPiBUUFM2NTAyM19EQ0RDXzMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGRjZGMgPT0gVFBTNjUwMjNfRENEQ18xKSB7CisJaWYgKGRjZGMgPT0gdHBzLT5jb3JlX3JlZ3VsYXRvcikgewogCQlpZiAoc2VsZWN0b3IgPj0gdHBzLT5pbmZvW2RjZGNdLT50YWJsZV9sZW4pCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJZWxzZQpAQCAtNDE0LDcgKzQ0Nyw4IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0cHNfNjUwMjNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQljb25zdCBzdHJ1Y3QgdHBzX2luZm8gKmluZm8gPSAodm9pZCAqKWlkLT5kcml2ZXJfZGF0YTsKKwljb25zdCBzdHJ1Y3QgdHBzX2RyaXZlcl9kYXRhICpkcnZfZGF0YSA9ICh2b2lkICopaWQtPmRyaXZlcl9kYXRhOworCWNvbnN0IHN0cnVjdCB0cHNfaW5mbyAqaW5mbyA9IGRydl9kYXRhLT5pbmZvOwogCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGE7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAJc3RydWN0IHRwc19wbWljICp0cHM7CkBAIC00NDYsNiArNDgwLDcgQEAKIAogCS8qIGNvbW1vbiBmb3IgYWxsIHJlZ3VsYXRvcnMgKi8KIAl0cHMtPmNsaWVudCA9IGNsaWVudDsKKwl0cHMtPmNvcmVfcmVndWxhdG9yID0gZHJ2X2RhdGEtPmNvcmVfcmVndWxhdG9yOwogCiAJZm9yIChpID0gMDsgaSA8IFRQUzY1MDIzX05VTV9SRUdVTEFUT1I7IGkrKywgaW5mbysrLCBpbml0X2RhdGErKykgewogCQkvKiBTdG9yZSByZWd1bGF0b3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KQEAgLTQ1Myw3ICs0ODgsNyBAQAogCiAJCXRwcy0+ZGVzY1tpXS5uYW1lID0gaW5mby0+bmFtZTsKIAkJdHBzLT5kZXNjW2ldLmlkID0gaTsKLQkJdHBzLT5kZXNjW2ldLm5fdm9sdGFnZXMgPSBudW1fdm9sdGFnZXNbaV07CisJCXRwcy0+ZGVzY1tpXS5uX3ZvbHRhZ2VzID0gaW5mby0+dGFibGVfbGVuOwogCQl0cHMtPmRlc2NbaV0ub3BzID0gKGkgPiBUUFM2NTAyM19EQ0RDXzMgPwogCQkJCQkmdHBzNjUwMjNfbGRvX29wcyA6ICZ0cHM2NTAyM19kY2RjX29wcyk7CiAJCXRwcy0+ZGVzY1tpXS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0U7CkBAIC00NzUsNiArNTEwLDE0IEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0cHMpOwogCisJLyogRW5hYmxlIHNldHRpbmcgb3V0cHV0IHZvbHRhZ2UgYnkgSTJDICovCisJdHBzXzY1MDIzX2NsZWFyX2JpdHModHBzLCBUUFM2NTAyM19SRUdfQ09OX0NUUkwyLAorCQkJCQkJVFBTNjUwMjNfUkVHX0NUUkwyX0NPUkVfQURKKTsKKworCS8qIEVuYWJsZSBzZXR0aW5nIG91dHB1dCB2b2x0YWdlIGJ5IEkyQyAqLworCXRwc182NTAyM19jbGVhcl9iaXRzKHRwcywgVFBTNjUwMjNfUkVHX0NPTl9DVFJMMiwKKwkJCQkJCVRQUzY1MDIzX1JFR19DVFJMMl9DT1JFX0FESik7CisKIAlyZXR1cm4gMDsKIAogIGZhaWw6CkBAIC01MDcsMTMgKzU1MCw4NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHRwc19pbmZvIHRwczY1MDIwX3JlZ3NbXSA9IHsKKwl7CisJCS5uYW1lID0gIlZEQ0RDMSIsCisJCS5taW5fdVYgPSAzMzAwMDAwLAorCQkubWF4X3VWID0gMzMwMDAwMCwKKwkJLmZpeGVkCT0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVkRDREMyIiwKKwkJLm1pbl91ViA9ICAxODAwMDAwLAorCQkubWF4X3VWID0gMTgwMDAwMCwKKwkJLmZpeGVkID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVkRDREMzIiwKKwkJLm1pbl91ViA9ICA4MDAwMDAsCisJCS5tYXhfdVYgPSAxNjAwMDAwLAorCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShWQ09SRV9WU0VMX3RhYmxlKSwKKwkJLnRhYmxlID0gVkNPUkVfVlNFTF90YWJsZSwKKwl9LAorCisJeworCQkubmFtZSA9ICJMRE8xIiwKKwkJLm1pbl91ViA9IDEwMDAwMDAsCisJCS5tYXhfdVYgPSAzMTUwMDAwLAorCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShUUFM2NTAyMF9MRE8xX1ZTRUxfdGFibGUpLAorCQkudGFibGUgPSBUUFM2NTAyMF9MRE8xX1ZTRUxfdGFibGUsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzIiLAorCQkubWluX3VWID0gMTA1MDAwMCwKKwkJLm1heF91ViA9IDMzMDAwMDAsCisJCS50YWJsZV9sZW4gPSBBUlJBWV9TSVpFKFRQUzY1MDIwX0xETzJfVlNFTF90YWJsZSksCisJCS50YWJsZSA9IFRQUzY1MDIwX0xETzJfVlNFTF90YWJsZSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0cHNfaW5mbyB0cHM2NTAyMV9yZWdzW10gPSB7CisJeworCQkubmFtZSA9ICJWRENEQzEiLAorCQkubWluX3VWID0gIDMzMDAwMDAsCisJCS5tYXhfdVYgPSAzMzAwMDAwLAorCQkuZml4ZWQgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJWRENEQzIiLAorCQkubWluX3VWID0gIDE4MDAwMDAsCisJCS5tYXhfdVYgPSAxODAwMDAwLAorCQkuZml4ZWQgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJWRENEQzMiLAorCQkubWluX3VWID0gIDgwMDAwMCwKKwkJLm1heF91ViA9IDE2MDAwMDAsCisJCS50YWJsZV9sZW4gPSBBUlJBWV9TSVpFKFZDT1JFX1ZTRUxfdGFibGUpLAorCQkudGFibGUgPSBWQ09SRV9WU0VMX3RhYmxlLAorCX0sCisJeworCQkubmFtZSA9ICJMRE8xIiwKKwkJLm1pbl91ViA9IDEwMDAwMDAsCisJCS5tYXhfdVYgPSAzMTUwMDAwLAorCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShUUFM2NTAyM19MRE8xX1ZTRUxfdGFibGUpLAorCQkudGFibGUgPSBUUFM2NTAyM19MRE8xX1ZTRUxfdGFibGUsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzIiLAorCQkubWluX3VWID0gMTA1MDAwMCwKKwkJLm1heF91ViA9IDMzMDAwMDAsCisJCS50YWJsZV9sZW4gPSBBUlJBWV9TSVpFKFRQUzY1MDIzX0xETzJfVlNFTF90YWJsZSksCisJCS50YWJsZSA9IFRQUzY1MDIzX0xETzJfVlNFTF90YWJsZSwKKwl9LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB0cHNfaW5mbyB0cHM2NTAyM19yZWdzW10gPSB7CiAJewogCQkubmFtZSA9ICJWRENEQzEiLAogCQkubWluX3VWID0gIDgwMDAwMCwKIAkJLm1heF91ViA9IDE2MDAwMDAsCi0JCS50YWJsZV9sZW4gPSBBUlJBWV9TSVpFKFZEQ0RDMV9WU0VMX3RhYmxlKSwKLQkJLnRhYmxlID0gVkRDREMxX1ZTRUxfdGFibGUsCisJCS50YWJsZV9sZW4gPSBBUlJBWV9TSVpFKFZDT1JFX1ZTRUxfdGFibGUpLAorCQkudGFibGUgPSBWQ09SRV9WU0VMX3RhYmxlLAogCX0sCiAJewogCQkubmFtZSA9ICJWRENEQzIiLApAQCAtNTMxLDIzICs2NDcsNDAgQEAKIAkJLm5hbWUgPSAiTERPMSIsCiAJCS5taW5fdVYgPSAxMDAwMDAwLAogCQkubWF4X3VWID0gMzE1MDAwMCwKLQkJLnRhYmxlX2xlbiA9IEFSUkFZX1NJWkUoTERPMV9WU0VMX3RhYmxlKSwKLQkJLnRhYmxlID0gTERPMV9WU0VMX3RhYmxlLAorCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShUUFM2NTAyM19MRE8xX1ZTRUxfdGFibGUpLAorCQkudGFibGUgPSBUUFM2NTAyM19MRE8xX1ZTRUxfdGFibGUsCiAJfSwKIAl7CiAJCS5uYW1lID0gIkxETzIiLAogCQkubWluX3VWID0gMTA1MDAwMCwKIAkJLm1heF91ViA9IDMzMDAwMDAsCi0JCS50YWJsZV9sZW4gPSBBUlJBWV9TSVpFKExETzJfVlNFTF90YWJsZSksCi0JCS50YWJsZSA9IExETzJfVlNFTF90YWJsZSwKKwkJLnRhYmxlX2xlbiA9IEFSUkFZX1NJWkUoVFBTNjUwMjNfTERPMl9WU0VMX3RhYmxlKSwKKwkJLnRhYmxlID0gVFBTNjUwMjNfTERPMl9WU0VMX3RhYmxlLAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHRwc19kcml2ZXJfZGF0YSB0cHM2NTAyMF9kcnZfZGF0YSA9IHsKKwkuaW5mbyA9IHRwczY1MDIwX3JlZ3MsCisJLmNvcmVfcmVndWxhdG9yID0gVFBTNjUwMjNfRENEQ18zLAorfTsKKworc3RhdGljIHN0cnVjdCB0cHNfZHJpdmVyX2RhdGEgdHBzNjUwMjFfZHJ2X2RhdGEgPSB7CisJCS5pbmZvID0gdHBzNjUwMjFfcmVncywKKwkJLmNvcmVfcmVndWxhdG9yID0gVFBTNjUwMjNfRENEQ18zLAorfTsKKworc3RhdGljIHN0cnVjdCB0cHNfZHJpdmVyX2RhdGEgdHBzNjUwMjNfZHJ2X2RhdGEgPSB7CisJCS5pbmZvID0gdHBzNjUwMjNfcmVncywKKwkJLmNvcmVfcmVndWxhdG9yID0gVFBTNjUwMjNfRENEQ18xLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRwc182NTAyM19pZFtdID0gewogCXsubmFtZSA9ICJ0cHM2NTAyMyIsCi0JLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHRwczY1MDIzX3JlZ3MsfSwKKwkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykgJnRwczY1MDIzX2Rydl9kYXRhfSwKIAl7Lm5hbWUgPSAidHBzNjUwMjEiLAotCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0cHM2NTAyM19yZWdzLH0sCisJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZ0cHM2NTAyMV9kcnZfZGF0YSx9LAorCXsubmFtZSA9ICJ0cHM2NTAyMCIsCisJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZ0cHM2NTAyMF9kcnZfZGF0YX0sCiAJeyB9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwN3gtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYwppbmRleCBiZmZmYWJjLi5iZGVmNzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYwpAQCAtOTAsMTIgKzkwLDYgQEAKIAkzMDAwLCAzMTAwLCAzMjAwLCAzMzAwLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBudW1fdm9sdGFnZXNbXSA9IHtBUlJBWV9TSVpFKFZEQ0RDeF9WU0VMX3RhYmxlKSwKLQkJCQlBUlJBWV9TSVpFKFZEQ0RDeF9WU0VMX3RhYmxlKSwKLQkJCQlBUlJBWV9TSVpFKFZEQ0RDeF9WU0VMX3RhYmxlKSwKLQkJCQlBUlJBWV9TSVpFKExETzFfVlNFTF90YWJsZSksCi0JCQkJQVJSQVlfU0laRShMRE8yX1ZTRUxfdGFibGUpfTsKLQogc3RydWN0IHRwc19pbmZvIHsKIAljb25zdCBjaGFyICpuYW1lOwogCXVuc2lnbmVkIG1pbl91VjsKQEAgLTU5OCw3ICs1OTIsNyBAQAogCiAJCXRwcy0+ZGVzY1tpXS5uYW1lID0gaW5mby0+bmFtZTsKIAkJdHBzLT5kZXNjW2ldLmlkID0gaTsKLQkJdHBzLT5kZXNjW2ldLm5fdm9sdGFnZXMgPSBudW1fdm9sdGFnZXNbaV07CisJCXRwcy0+ZGVzY1tpXS5uX3ZvbHRhZ2VzID0gaW5mby0+dGFibGVfbGVuOwogCQl0cHMtPmRlc2NbaV0ub3BzID0gKGkgPiBUUFM2NTA3WF9EQ0RDXzMgPwogCQkmdHBzNjUwN3hfcG1pY19sZG9fb3BzIDogJnRwczY1MDd4X3BtaWNfZGNkY19vcHMpOwogCQl0cHMtPmRlc2NbaV0udHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU4NngtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTg2eC1yZWd1bGF0b3IuYwppbmRleCBiYjA0YTc1Li4xNGI5Mzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTg2eC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTg2eC1yZWd1bGF0b3IuYwpAQCAtMTQsNiArMTQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMzMyLDYgKzMzMywzNiBAQAogCQkJCSAxIDw8IHJpLT5lbmFibGVfYml0WzFdKTsKIH0KIAorc3RhdGljIGludCB0cHM2NTg2eF9yZWd1bGF0b3Jfc2V0X3NsZXdfcmF0ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IHBkZXYtPmRldi5wYXJlbnQ7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnAgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdHBzNjU4Nnhfc2V0dGluZ3MgKnNldHRpbmcgPSBwLT5kcml2ZXJfZGF0YTsKKwl1aW50OF90IHJlZzsKKworCWlmIChzZXR0aW5nID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKCEoc2V0dGluZy0+c2xld19yYXRlICYgVFBTNjU4NlhfU0xFV19SQVRFX1NFVCkpCisJCXJldHVybiAwOworCisJLyogb25seSBTTTAgYW5kIFNNMSBjYW4gaGF2ZSB0aGUgc2xldyByYXRlIHNldHRpbmdzICovCisJc3dpdGNoIChwZGV2LT5pZCkgeworCWNhc2UgVFBTNjU4NlhfSURfU01fMDoKKwkJcmVnID0gVFBTNjU4NlhfU00wU0w7CisJCWJyZWFrOworCWNhc2UgVFBTNjU4NlhfSURfU01fMToKKwkJcmVnID0gVFBTNjU4NlhfU00xU0w7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJPbmx5IFNNMC9TTTEgY2FuIHNldCBzbGV3IHJhdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gdHBzNjU4Nnhfd3JpdGUocGFyZW50LCByZWcsCisJCQlzZXR0aW5nLT5zbGV3X3JhdGUgJiBUUFM2NTg2WF9TTEVXX1JBVEVfTUFTSyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRwczY1ODZ4X3JlZ3VsYXRvciAqZmluZF9yZWd1bGF0b3JfaW5mbyhpbnQgaWQpCiB7CiAJc3RydWN0IHRwczY1ODZ4X3JlZ3VsYXRvciAqcmk7CkBAIC0zNzQsNyArNDA1LDcgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJkZXYpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHRwczY1ODZ4X3JlZ3VsYXRvcl9zZXRfc2xld19yYXRlKHBkZXYpOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCB0cHM2NTg2eF9yZWd1bGF0b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMi1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEyLXJlZ3VsYXRvci5jCmluZGV4IDNhOTMxM2UuLjM5ZDRhMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEyLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEyLXJlZ3VsYXRvci5jCkBAIC00Myw4ICs0Myw2IEBACiAjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE85CTEyCiAjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE8xMAkxMwogCi0jZGVmaW5lIFRQUzY1OTEyX01BWF9SRUdfSUQJVFBTNjU5MTJfUkVHX0xET18xMAotCiAvKiBOdW1iZXIgb2Ygc3RlcC1kb3duIGNvbnZlcnRlcnMgYXZhaWxhYmxlICovCiAjZGVmaW5lIFRQUzY1OTEyX05VTV9EQ0RDCTQKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdXNlcnNwYWNlLWNvbnN1bWVyLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci91c2Vyc3BhY2UtY29uc3VtZXIuYwppbmRleCA5ZDViYTkzLi5mYzY2NTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci91c2Vyc3BhY2UtY29uc3VtZXIuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci91c2Vyc3BhY2UtY29uc3VtZXIuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvdXNlcnNwYWNlLWNvbnN1bWVyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci92aXJ0dWFsLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci92aXJ0dWFsLmMKaW5kZXggNjllNTUwZi4uODU4YzFmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdmlydHVhbC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3ZpcnR1YWwuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IHZpcnR1YWxfY29uc3VtZXJfZGF0YSB7CiAJc3RydWN0IG11dGV4IGxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTg0MDAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTg0MDAtcmVndWxhdG9yLmMKaW5kZXggMGYxMmM3MC4uNzE2MzJkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204NDAwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODQwMC1yZWd1bGF0b3IuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvd204NDAwLXByaXZhdGUuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jCmluZGV4IDFhNmE2OTAuLmI4N2JmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMKQEAgLTE0MCw2ICsxNDAsMTQgQEAKIAkJcmV0dXJuIChzZWxlY3RvciAqIDEwMDAwMCkgKyA5MDAwMDA7CiAJY2FzZSBXTTg5NTg6CiAJCXJldHVybiAoc2VsZWN0b3IgKiAxMDAwMDApICsgMTAwMDAwMDsKKwljYXNlIFdNMTgxMToKKwkJc3dpdGNoIChzZWxlY3RvcikgeworCQljYXNlIDA6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAoc2VsZWN0b3IgKiAxMDAwMDApICsgOTUwMDAwOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE3MCw2ICsxNzgsMTEgQEAKIAljYXNlIFdNODk1ODoKIAkJc2VsZWN0b3IgPSAobWluX3VWIC0gMTAwMDAwMCkgLyAxMDAwMDA7CiAJCWJyZWFrOworCWNhc2UgV00xODExOgorCQlzZWxlY3RvciA9IChtaW5fdVYgLSA5NTAwMDApIC8gMTAwMDAwOworCQlpZiAoc2VsZWN0b3IgPT0gMCkKKwkJCXNlbGVjdG9yID0gMTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25maWcKaW5kZXggNWE1MzhmYy4uNTNlYjRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCkBAIC04LDcgKzgsNyBAQAogbWVudWNvbmZpZyBSVENfQ0xBU1MKIAlib29sICJSZWFsIFRpbWUgQ2xvY2siCiAJZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiAhUzM5MAorCWRlcGVuZHMgb24gIVMzOTAgJiYgIVVNTAogCXNlbGVjdCBSVENfTElCCiAJaGVscAogCSAgR2VuZXJpYyBSVEMgY2xhc3Mgc3VwcG9ydC4gSWYgeW91IHNheSB5ZXMgaGVyZSwgeW91IHdpbGwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2NsYXNzLmMgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCmluZGV4IDAxYTdkZjUzLi5lODMyNmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9jbGFzcy5jCisrKyBiL2RyaXZlcnMvcnRjL2NsYXNzLmMKQEAgLTIxLDE2ICsyMSwxMyBAQAogI2luY2x1ZGUgInJ0Yy1jb3JlLmgiCiAKIAotc3RhdGljIERFRklORV9JRFIocnRjX2lkcik7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGlkcl9sb2NrKTsKK3N0YXRpYyBERUZJTkVfSURBKHJ0Y19pZGEpOwogc3RydWN0IGNsYXNzICpydGNfY2xhc3M7CiAKIHN0YXRpYyB2b2lkIHJ0Y19kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHRvX3J0Y19kZXZpY2UoZGV2KTsKLQltdXRleF9sb2NrKCZpZHJfbG9jayk7Ci0JaWRyX3JlbW92ZSgmcnRjX2lkciwgcnRjLT5pZCk7Ci0JbXV0ZXhfdW5sb2NrKCZpZHJfbG9jayk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJnJ0Y19pZGEsIHJ0Yy0+aWQpOwogCWtmcmVlKHJ0Yyk7CiB9CiAKQEAgLTE0NiwyNSArMTQzLDE2IEBACiAJc3RydWN0IHJ0Y193a2Fscm0gYWxybTsKIAlpbnQgaWQsIGVycjsKIAotCWlmIChpZHJfcHJlX2dldCgmcnRjX2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgewotCQllcnIgPSAtRU5PTUVNOworCWlkID0gaWRhX3NpbXBsZV9nZXQoJnJ0Y19pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCWlmIChpZCA8IDApIHsKKwkJZXJyID0gaWQ7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQotCW11dGV4X2xvY2soJmlkcl9sb2NrKTsKLQllcnIgPSBpZHJfZ2V0X25ldygmcnRjX2lkciwgTlVMTCwgJmlkKTsKLQltdXRleF91bmxvY2soJmlkcl9sb2NrKTsKLQotCWlmIChlcnIgPCAwKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZCA9IGlkICYgTUFYX0lEX01BU0s7Ci0KIAlydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnRjX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmIChydGMgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXRfaWRyOworCQlnb3RvIGV4aXRfaWRhOwogCX0KIAogCXJ0Yy0+aWQgPSBpZDsKQEAgLTIyMiwxMCArMjEwLDggQEAKIGV4aXRfa2ZyZWU6CiAJa2ZyZWUocnRjKTsKIAotZXhpdF9pZHI6Ci0JbXV0ZXhfbG9jaygmaWRyX2xvY2spOwotCWlkcl9yZW1vdmUoJnJ0Y19pZHIsIGlkKTsKLQltdXRleF91bmxvY2soJmlkcl9sb2NrKTsKK2V4aXRfaWRhOgorCWlkYV9zaW1wbGVfcmVtb3ZlKCZydGNfaWRhLCBpZCk7CiAKIGV4aXQ6CiAJZGV2X2VycihkZXYsICJydGMgY29yZTogdW5hYmxlIHRvIHJlZ2lzdGVyICVzLCBlcnIgPSAlZFxuIiwKQEAgLTI3Niw3ICsyNjIsNyBAQAogewogCXJ0Y19kZXZfZXhpdCgpOwogCWNsYXNzX2Rlc3Ryb3kocnRjX2NsYXNzKTsKLQlpZHJfZGVzdHJveSgmcnRjX2lkcik7CisJaWRhX2Rlc3Ryb3koJnJ0Y19pZGEpOwogfQogCiBzdWJzeXNfaW5pdGNhbGwocnRjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwppbmRleCA0NGU5MWU1Li44ZTI4NjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kbTM1NWV2bS5jIGIvZHJpdmVycy9ydGMvcnRjLWRtMzU1ZXZtLmMKaW5kZXggNThkNGUxOC4uMjMyMmM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRtMzU1ZXZtLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRtMzU1ZXZtLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2kyYy9kbTM1NWV2bV9tc3AuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNS5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNS5jCmluZGV4IDU3ZmJjYzEuLjNhMzNiMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDUuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA1LmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvZHMxMzA1Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwppbmRleCBiMjAwNWI0Li42MmIwNzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC0zNCw2ICszNCw3IEBACiAJZHNfMTM4OCwKIAlkc18zMjMxLAogCW00MXQwMCwKKwltY3A3OTQxeCwKIAlyeF84MDI1LAogCS8vIHJzNWMzNzIgdG9vPyAgZGlmZmVyZW50IGFkZHJlc3MuLi4KIH07CkBAIC00Myw2ICs0NCw3IEBACiAjZGVmaW5lIERTMTMwN19SRUdfU0VDUwkJMHgwMAkvKiAwMC01OSAqLwogIwlkZWZpbmUgRFMxMzA3X0JJVF9DSAkJMHg4MAogIwlkZWZpbmUgRFMxMzQwX0JJVF9uRU9TQwkJMHg4MAorIwlkZWZpbmUgTUNQNzk0MVhfQklUX1NUCQkweDgwCiAjZGVmaW5lIERTMTMwN19SRUdfTUlOCQkweDAxCS8qIDAwLTU5ICovCiAjZGVmaW5lIERTMTMwN19SRUdfSE9VUgkJMHgwMgkvKiAwMC0yMywgb3IgMS0xMnthbSxwbX0gKi8KICMJZGVmaW5lIERTMTMwN19CSVRfMTJIUgkJMHg0MAkvKiBpbiBSRUdfSE9VUiAqLwpAQCAtNTAsNiArNTIsNyBAQAogIwlkZWZpbmUgRFMxMzQwX0JJVF9DRU5UVVJZX0VOCTB4ODAJLyogaW4gUkVHX0hPVVIgKi8KICMJZGVmaW5lIERTMTM0MF9CSVRfQ0VOVFVSWQkweDQwCS8qIGluIFJFR19IT1VSICovCiAjZGVmaW5lIERTMTMwN19SRUdfV0RBWQkJMHgwMwkvKiAwMS0wNyAqLworIwlkZWZpbmUgTUNQNzk0MVhfQklUX1ZCQVRFTgkweDA4CiAjZGVmaW5lIERTMTMwN19SRUdfTURBWQkJMHgwNAkvKiAwMS0zMSAqLwogI2RlZmluZSBEUzEzMDdfUkVHX01PTlRICTB4MDUJLyogMDEtMTIgKi8KICMJZGVmaW5lIERTMTMzN19CSVRfQ0VOVFVSWQkweDgwCS8qIGluIFJFR19NT05USCAqLwpAQCAtMTM3LDYgKzE0MCw4IEBACiB9LAogW200MXQwMF0gPSB7CiB9LAorW21jcDc5NDF4XSA9IHsKK30sCiBbcnhfODAyNV0gPSB7CiB9LCB9OwogCkBAIC0xNDksNiArMTU0LDcgQEAKIAl7ICJkczEzNDAiLCBkc18xMzQwIH0sCiAJeyAiZHMzMjMxIiwgZHNfMzIzMSB9LAogCXsgIm00MXQwMCIsIG00MXQwMCB9LAorCXsgIm1jcDc5NDF4IiwgbWNwNzk0MXggfSwKIAl7ICJwdDdjNDMzOCIsIGRzXzEzMDcgfSwKIAl7ICJyeDgwMjUiLCByeF84MDI1IH0sCiAJeyB9CkBAIC0zNjUsNiArMzcxLDEwIEBACiAJCWJ1ZltEUzEzMDdfUkVHX0hPVVJdIHw9IERTMTM0MF9CSVRfQ0VOVFVSWV9FTgogCQkJCXwgRFMxMzQwX0JJVF9DRU5UVVJZOwogCQlicmVhazsKKwljYXNlIG1jcDc5NDF4OgorCQlidWZbRFMxMzA3X1JFR19TRUNTXSB8PSBNQ1A3OTQxWF9CSVRfU1Q7CisJCWJ1ZltEUzEzMDdfUkVHX1dEQVldIHw9IE1DUDc5NDFYX0JJVF9WQkFURU47CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTgwOSw2ICs4MTksMjMgQEAKIAkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIlNFVCBUSU1FIVxuIik7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBtY3A3OTQxeDoKKwkJLyogbWFrZSBzdXJlIHRoYXQgdGhlIGJhY2t1cCBiYXR0ZXJ5IGlzIGVuYWJsZWQgKi8KKwkJaWYgKCEoZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfV0RBWV0gJiBNQ1A3OTQxWF9CSVRfVkJBVEVOKSkgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMwN19SRUdfV0RBWSwKKwkJCQkJZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfV0RBWV0KKwkJCQkJfCBNQ1A3OTQxWF9CSVRfVkJBVEVOKTsKKwkJfQorCisJCS8qIGNsb2NrIGhhbHRlZD8gIHR1cm4gaXQgb24sIHNvIGNsb2NrIGNhbiB0aWNrLiAqLworCQlpZiAoISh0bXAgJiBNQ1A3OTQxWF9CSVRfU1QpKSB7CisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzA3X1JFR19TRUNTLAorCQkJCQlNQ1A3OTQxWF9CSVRfU1QpOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKKwkJCWdvdG8gcmVhZF9ydGM7CisJCX0KKworCQlicmVhazsKIAljYXNlIHJ4XzgwMjU6CiAJY2FzZSBkc18xMzM3OgogCWNhc2UgZHNfMTMzOToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYwppbmRleCA1NjhhZDMwLi41ODZjMjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMC42IgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKaW5kZXggZmVlNDFiOS4uMTM1MDAyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jCmluZGV4IDA2ZGZiNTQuLmEzMTk0MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE3NDIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE3NDIuYwppbmRleCBkODRhNDQ4ZC4uZTNlMGY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTc0Mi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE3NDIuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWVtMzAyNy5jIGIvZHJpdmVycy9ydGMvcnRjLWVtMzAyNy5jCmluZGV4IGQ4ZTFjMjUuLjg0MTRkZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1lbTMwMjcuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZW0zMDI3LmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogUmVnaXN0ZXJzICovCiAjZGVmaW5lIEVNMzAyN19SRUdfT05fT0ZGX0NUUkwJMHgwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWlzbDEyMDIyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtaXNsMTIwMjIuYwppbmRleCBkZGJjNzk3Li42MTg2ODMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtaXNsMTIwMjIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtaXNsMTIwMjIuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4xIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbWMxM3h4eC5jIGIvZHJpdmVycy9ydGMvcnRjLW1jMTN4eHguYwppbmRleCBhMWEyNzhiLi45ZDBjM2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbWMxM3h4eC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tYzEzeHh4LmMKQEAgLTMwOSw3ICszMDksNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbWMxM3h4eF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19pbml0IG1jMTN4eHhfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbWMxM3h4eF9ydGMgKnByaXY7CkBAIC0zNzgsNyArMzc4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBtYzEzeHh4X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19leGl0IG1jMTN4eHhfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtYzEzeHh4X3J0YyAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCkBAIC00MTAsNyArNDEwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWMxM3h4eF9ydGNfZHJpdmVyID0gewogCS5pZF90YWJsZSA9IG1jMTN4eHhfcnRjX2lkdGFibGUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG1jMTN4eHhfcnRjX3JlbW92ZSksCisJLnJlbW92ZSA9IF9fZXhpdF9wKG1jMTN4eHhfcnRjX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSBEUklWRVJfTkFNRSwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbXJzdC5jIGIvZHJpdmVycy9ydGMvcnRjLW1yc3QuYwppbmRleCBkMzM1NDQ4Li5iYjIxZjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbXJzdC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tcnN0LmMKQEAgLTc2LDEyICs3NiwxNSBAQAogLyoKICAqIHJ0Y190aW1lJ3MgeWVhciBjb250YWlucyB0aGUgaW5jcmVtZW50IG92ZXIgMTkwMCwgYnV0IHZSVEMncyBZRUFSCiAgKiByZWdpc3RlciBjYW4ndCBiZSBwcm9ncmFtbWVkIHRvIHZhbHVlIGxhcmdlciB0aGFuIDB4NjQsIHNvIHZSVEMKLSAqIGRyaXZlciBjaG9zZSB0byB1c2UgMTk2MCAoMTk3MCBpcyBVTklYIHRpbWUgc3RhcnQgcG9pbnQpIGFzIHRoZSBiYXNlLAorICogZHJpdmVyIGNob3NlIHRvIHVzZSAxOTcyICgxOTcwIGlzIFVOSVggdGltZSBzdGFydCBwb2ludCkgYXMgdGhlIGJhc2UsCiAgKiBhbmQgZG9lcyB0aGUgdHJhbnNsYXRpb24gYXQgcmVhZC93cml0ZSB0aW1lLgogICoKLSAqIFdoeSBub3QganVzdCB1c2UgMTk3MCBhcyB0aGUgb2Zmc2V0PyBpdCdzIGJlY2F1c2UgdXNpbmcgMTk2MCB3aWxsCisgKiBXaHkgbm90IGp1c3QgdXNlIDE5NzAgYXMgdGhlIG9mZnNldD8gaXQncyBiZWNhdXNlIHVzaW5nIDE5NzIgd2lsbAogICogbWFrZSBpdCBjb25zaXN0ZW50IGluIGxlYXAgeWVhciBzZXR0aW5nIGZvciBib3RoIHZydGMgYW5kIGxvdy1sZXZlbAotICogcGh5c2ljYWwgcnRjIGRldmljZXMuCisgKiBwaHlzaWNhbCBydGMgZGV2aWNlcy4gVGhlbiB3aHkgbm90IHVzZSAxOTYwIGFzIHRoZSBvZmZzZXQ/IElmIHdlIHVzZQorICogMTk2MCwgZm9yIGEgZGV2aWNlJ3MgZmlyc3QgdXNlLCBpdHMgWUVBUiByZWdpc3RlciBpcyAwIGFuZCB0aGUgc3lzdGVtCisgKiB5ZWFyIHdpbGwgYmUgcGFyc2VkIGFzIDE5NjAgd2hpY2ggaXMgbm90IGEgdmFsaWQgVU5JWCB0aW1lIGFuZCB3aWxsCisgKiBjYXVzZSBtYW55IGFwcGxpY2F0aW9ucyB0byBmYWlsIG15c3RlcmlvdXNseS4KICAqLwogc3RhdGljIGludCBtcnN0X3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdGltZSkKIHsKQEAgLTk5LDEwICsxMDIsMTAgQEAKIAl0aW1lLT50bV95ZWFyID0gdnJ0Y19jbW9zX3JlYWQoUlRDX1lFQVIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CiAKLQkvKiBBZGp1c3QgZm9yIHRoZSAxOTYwLzE5MDAgKi8KLQl0aW1lLT50bV95ZWFyICs9IDYwOworCS8qIEFkanVzdCBmb3IgdGhlIDE5NzIvMTkwMCAqLworCXRpbWUtPnRtX3llYXIgKz0gNzI7CiAJdGltZS0+dG1fbW9uLS07Ci0JcmV0dXJuIFJUQ18yNEg7CisJcmV0dXJuIHJ0Y192YWxpZF90bSh0aW1lKTsKIH0KIAogc3RhdGljIGludCBtcnN0X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0aW1lKQpAQCAtMTE5LDkgKzEyMiw5IEBACiAJbWluID0gdGltZS0+dG1fbWluOwogCXNlYyA9IHRpbWUtPnRtX3NlYzsKIAotCWlmICh5cnMgPCA3MCB8fCB5cnMgPiAxMzgpCisJaWYgKHlycyA8IDcyIHx8IHlycyA+IDEzOCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JeXJzIC09IDYwOworCXlycyAtPSA3MjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbXYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1tdi5jCmluZGV4IDYwNjI3YTcuLjc2OGUyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1tdi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tdi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogCiAjZGVmaW5lIFJUQ19USU1FX1JFR19PRkZTCTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1wY2YyMTIzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcGNmMjEyMy5jCmluZGV4IDcxYmFiMGUuLjJlZTNiYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1wY2YyMTIzLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXBjZjIxMjMuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNiIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1wY2Y4NTYzLmMKaW5kZXggYjQyYzBjNi4uNjA2ZmRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcGNmODU2My5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuMyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXJzNWMzNDguYyBiL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzQ4LmMKaW5kZXggMzY4ZDBlNi4uOTcxYmM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXJzNWMzNDguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM0OC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCmluZGV4IDg1YzFiODQuLmQyOWY1NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMC42IgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYyBiL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCmluZGV4IDNiOTQzNjcuLmVkM2U5YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4xIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdHg0OTM5LmMgYi9kcml2ZXJzL3J0Yy9ydGMtdHg0OTM5LmMKaW5kZXggZWM2MzEzZC4uYWFjMGZmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy10eDQ5MzkuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8YXNtL3R4eDkvdHg0OTM5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMteDEyMDUuYyBiL2RyaXZlcnMvcnRjL3J0Yy14MTIwNS5jCmluZGV4IGIwMGFhZDIuLjhjMDUxZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy14MTIwNS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy14MTIwNS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMS4wLjgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCmluZGV4IGExZDNkZGIuLjY1ODk0ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwpAQCAtMTEsNyArMTEsNiBAQAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAiZGFzZCIKICNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTE1OTQsNyArMTU5Myw2IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIG5vdzsKIAlpbnQgZXhwaXJlczsKIAotCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfREFTXSsrOwogCWlmIChJU19FUlIoaXJiKSkgewogCQlzd2l0Y2ggKFBUUl9FUlIoaXJiKSkgewogCQljYXNlIC1FSU86CkBAIC0yMDYxLDEzICsyMDU5LDE0IEBACiAvKgogICogV2FrZXVwIGhlbHBlciBmb3IgdGhlICdzbGVlcF9vbicgZnVuY3Rpb25zLgogICovCi1zdGF0aWMgdm9pZCBkYXNkX3dha2V1cF9jYihzdHJ1Y3QgZGFzZF9jY3dfcmVxICpjcXIsIHZvaWQgKmRhdGEpCit2b2lkIGRhc2Rfd2FrZXVwX2NiKHN0cnVjdCBkYXNkX2Njd19yZXEgKmNxciwgdm9pZCAqZGF0YSkKIHsKIAlzcGluX2xvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhjcXItPnN0YXJ0ZGV2LT5jZGV2KSk7CiAJY3FyLT5jYWxsYmFja19kYXRhID0gREFTRF9TTEVFUE9OX0VORF9UQUc7CiAJc3Bpbl91bmxvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhjcXItPnN0YXJ0ZGV2LT5jZGV2KSk7CiAJd2FrZV91cCgmZ2VuZXJpY193YWl0cSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChkYXNkX3dha2V1cF9jYik7CiAKIHN0YXRpYyBpbmxpbmUgaW50IF93YWl0X2Zvcl93YWtldXAoc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyKQogewpAQCAtMjE2Nyw3ICsyMTY2LDkgQEAKIAkJfSBlbHNlCiAJCQl3YWl0X2V2ZW50KGdlbmVyaWNfd2FpdHEsICEoZGV2aWNlLT5zdG9wcGVkKSk7CiAKLQkJY3FyLT5jYWxsYmFjayA9IGRhc2Rfd2FrZXVwX2NiOworCQlpZiAoIWNxci0+Y2FsbGJhY2spCisJCQljcXItPmNhbGxiYWNrID0gZGFzZF93YWtldXBfY2I7CisKIAkJY3FyLT5jYWxsYmFja19kYXRhID0gREFTRF9TTEVFUE9OX1NUQVJUX1RBRzsKIAkJZGFzZF9hZGRfcmVxdWVzdF90YWlsKGNxcik7CiAJCWlmIChpbnRlcnJ1cHRpYmxlKSB7CkBAIC0yMjYzLDcgKzIyNjQsMTEgQEAKIAljcXItPmNhbGxiYWNrID0gZGFzZF93YWtldXBfY2I7CiAJY3FyLT5jYWxsYmFja19kYXRhID0gREFTRF9TTEVFUE9OX1NUQVJUX1RBRzsKIAljcXItPnN0YXR1cyA9IERBU0RfQ1FSX1FVRVVFRDsKLQlsaXN0X2FkZCgmY3FyLT5kZXZsaXN0LCAmZGV2aWNlLT5jY3dfcXVldWUpOworCS8qCisJICogYWRkIG5ldyByZXF1ZXN0IGFzIHNlY29uZAorCSAqIGZpcnN0IHRoZSB0ZXJtaW5hdGVkIGNxciBuZWVkcyB0byBiZSBmaW5pc2hlZAorCSAqLworCWxpc3RfYWRkKCZjcXItPmRldmxpc3QsIGRldmljZS0+Y2N3X3F1ZXVlLm5leHQpOwogCiAJLyogbGV0IHRoZSBiaCBzdGFydCB0aGUgcmVxdWVzdCB0byBrZWVwIHRoZW0gaW4gb3JkZXIgKi8KIAlkYXNkX3NjaGVkdWxlX2RldmljZV9iaChkZXZpY2UpOwpAQCAtMzI4NCw2ICszMjg5LDkgQEAKIAlpZiAoSVNfRVJSKGRldmljZSkpCiAJCXJldHVybiBQVFJfRVJSKGRldmljZSk7CiAKKwkvKiBtYXJrIGRldmljZSBhcyBzdXNwZW5kZWQgKi8KKwlzZXRfYml0KERBU0RfRkxBR19TVVNQRU5ERUQsICZkZXZpY2UtPmZsYWdzKTsKKwogCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPmZyZWV6ZSkKIAkJcmMgPSBkZXZpY2UtPmRpc2NpcGxpbmUtPmZyZWV6ZShkZXZpY2UpOwogCkBAIC0zMzU4LDYgKzMzNjYsNyBAQAogCWlmIChkZXZpY2UtPmJsb2NrKQogCQlkYXNkX3NjaGVkdWxlX2Jsb2NrX2JoKGRldmljZS0+YmxvY2spOwogCisJY2xlYXJfYml0KERBU0RfRkxBR19TVVNQRU5ERUQsICZkZXZpY2UtPmZsYWdzKTsKIAlkYXNkX3B1dF9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwppbmRleCA2ZTgzNWM5Li42YWIyOTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCkBAIC04NDQsNiArODQ0LDMwIEBACiAJc2V0X2JpdChEQVNEX0NRUl9WRVJJRllfUEFUSCwgJmNxci0+ZmxhZ3MpOwogfQogCisvKgorICogV2FrZXVwIGhlbHBlciBmb3IgcmVhZF9jb25mCisgKiBpZiB0aGUgY3FyIGlzIG5vdCBkb25lIGFuZCBuZWVkcyBzb21lIGVycm9yIHJlY292ZXJ5CisgKiB0aGUgYnVmZmVyIGhhcyB0byBiZSByZS1pbml0aWFsaXplZCB3aXRoIHRoZSBFQkNESUMgIlYxLjAiCisgKiB0byBzaG93IHN1cHBvcnQgZm9yIHZpcnR1YWwgZGV2aWNlIFNORVEKKyAqLworc3RhdGljIHZvaWQgcmVhZF9jb25mX2NiKHN0cnVjdCBkYXNkX2Njd19yZXEgKmNxciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2N3MSAqY2N3OworCV9fdTggKnJjZF9idWZmZXI7CisKKwlpZiAoY3FyLT5zdGF0dXMgIT0gIERBU0RfQ1FSX0RPTkUpIHsKKwkJY2N3ID0gY3FyLT5jcGFkZHI7CisJCXJjZF9idWZmZXIgPSAoX191OCAqKSgoYWRkcl90KSBjY3ctPmNkYSk7CisJCW1lbXNldChyY2RfYnVmZmVyLCAwLCBzaXplb2YoKnJjZF9idWZmZXIpKTsKKworCQlyY2RfYnVmZmVyWzBdID0gMHhFNTsKKwkJcmNkX2J1ZmZlclsxXSA9IDB4RjE7CisJCXJjZF9idWZmZXJbMl0gPSAweDRCOworCQlyY2RfYnVmZmVyWzNdID0gMHhGMDsKKwl9CisJZGFzZF93YWtldXBfY2IoY3FyLCBkYXRhKTsKK30KKwogc3RhdGljIGludCBkYXNkX2Vja2RfcmVhZF9jb25mX2ltbWVkaWF0ZWx5KHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICBzdHJ1Y3QgZGFzZF9jY3dfcmVxICpjcXIsCiAJCQkJCSAgIF9fdTggKnJjZF9idWZmZXIsCkBAIC04NjMsNiArODg3LDcgQEAKIAljbGVhcl9iaXQoREFTRF9DUVJfRkxBR1NfVVNFX0VSUCwgJmNxci0+ZmxhZ3MpOwogCXNldF9iaXQoREFTRF9DUVJfQUxMT1dfU0xPQ0ssICZjcXItPmZsYWdzKTsKIAljcXItPnJldHJpZXMgPSA1OworCWNxci0+Y2FsbGJhY2sgPSByZWFkX2NvbmZfY2I7CiAJcmMgPSBkYXNkX3NsZWVwX29uX2ltbWVkaWF0bHkoY3FyKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC05MDAsNiArOTI1LDcgQEAKIAkJZ290byBvdXRfZXJyb3I7CiAJfQogCWRhc2RfZWNrZF9maWxsX3JjZF9jcXIoZGV2aWNlLCBjcXIsIHJjZF9idWYsIGxwbSk7CisJY3FyLT5jYWxsYmFjayA9IHJlYWRfY29uZl9jYjsKIAlyZXQgPSBkYXNkX3NsZWVwX29uKGNxcik7CiAJLyoKIAkgKiBvbiBzdWNjZXNzIHdlIHVwZGF0ZSB0aGUgdXNlciBpbnB1dCBwYXJtcwpAQCAtMTA3NSw2ICsxMTAxLDEyIEBACiAJZGF0YSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGF0aF92ZXJpZmljYXRpb25fd29ya19kYXRhLCB3b3JrZXIpOwogCWRldmljZSA9IGRhdGEtPmRldmljZTsKIAorCS8qIGRlbGF5IHBhdGggdmVyaWZpY2F0aW9uIHVudGlsIGRldmljZSB3YXMgcmVzdW1lZCAqLworCWlmICh0ZXN0X2JpdChEQVNEX0ZMQUdfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncykpIHsKKwkJc2NoZWR1bGVfd29yayh3b3JrKTsKKwkJcmV0dXJuOworCX0KKwogCW9wbSA9IDA7CiAJbnBtID0gMDsKIAlwcG0gPSAwOwpAQCAtMjAyMSw5ICsyMDUzLDEzIEBACiAJLyogZmlyc3Qgb2YgYWxsIGNoZWNrIGZvciBzdGF0ZSBjaGFuZ2UgcGVuZGluZyBpbnRlcnJ1cHQgKi8KIAltYXNrID0gREVWX1NUQVRfQVRURU5USU9OIHwgREVWX1NUQVRfREVWX0VORCB8IERFVl9TVEFUX1VOSVRfRVhDRVA7CiAJaWYgKChzY3N3X2RzdGF0KCZpcmItPnNjc3cpICYgbWFzaykgPT0gbWFzaykgewotCQkvKiBmb3IgYWxpYXMgb25seSBhbmQgbm90IGluIG9mZmxpbmUgcHJvY2Vzc2luZyovCisJCS8qCisJCSAqIGZvciBhbGlhcyBvbmx5LCBub3QgaW4gb2ZmbGluZSBwcm9jZXNzaW5nCisJCSAqIGFuZCBvbmx5IGlmIG5vdCBzdXNwZW5kZWQKKwkJICovCiAJCWlmICghZGV2aWNlLT5ibG9jayAmJiBwcml2YXRlLT5sY3UgJiYKLQkJICAgICF0ZXN0X2JpdChEQVNEX0ZMQUdfT0ZGTElORSwgJmRldmljZS0+ZmxhZ3MpKSB7CisJCSAgICAhdGVzdF9iaXQoREFTRF9GTEFHX09GRkxJTkUsICZkZXZpY2UtPmZsYWdzKSAmJgorCQkgICAgIXRlc3RfYml0KERBU0RfRkxBR19TVVNQRU5ERUQsICZkZXZpY2UtPmZsYWdzKSkgewogCQkJLyoKIAkJCSAqIHRoZSBzdGF0ZSBjaGFuZ2UgY291bGQgYmUgY2F1c2VkIGJ5IGFuIGFsaWFzCiAJCQkgKiByZWFzc2lnbm1lbnQgcmVtb3ZlIGRldmljZSBmcm9tIGFsaWFzIGhhbmRsaW5nCkBAIC0yMzUwLDcgKzIzODYsNyBAQAogCW5ld190cmFjayA9IDE7CiAJZW5kX2lkYXcgPSAwOwogCWxlbl90b190cmFja19lbmQgPSAwOwotCWlkYXdfZHN0ID0gMDsKKwlpZGF3X2RzdCA9IE5VTEw7CiAJaWRhd19sZW4gPSAwOwogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHJlcSwgaXRlcikgewogCQlkc3QgPSBwYWdlX2FkZHJlc3MoYnYtPmJ2X3BhZ2UpICsgYnYtPmJ2X29mZnNldDsKQEAgLTI0MTIsNyArMjQ0OCw3IEBACiAJCQlpZiAoZW5kX2lkYXcpIHsKIAkJCQlpZGF3cyA9IGlkYWxfY3JlYXRlX3dvcmRzKGlkYXdzLCBpZGF3X2RzdCwKIAkJCQkJCQkgIGlkYXdfbGVuKTsKLQkJCQlpZGF3X2RzdCA9IDA7CisJCQkJaWRhd19kc3QgPSBOVUxMOwogCQkJCWlkYXdfbGVuID0gMDsKIAkJCQllbmRfaWRhdyA9IDA7CiAJCQl9CkBAIC0zOTk4LDYgKzQwMzQsNyBAQAogCS50aGF3CSAgICAgPSBkYXNkX2dlbmVyaWNfcmVzdG9yZV9kZXZpY2UsCiAJLnJlc3RvcmUgICAgID0gZGFzZF9nZW5lcmljX3Jlc3RvcmVfZGV2aWNlLAogCS51Y19oYW5kbGVyICA9IGRhc2RfZ2VuZXJpY191Y19oYW5kbGVyLAorCS5pbnRfY2xhc3MgICA9IElPSU5UX0RBUywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jCmluZGV4IDRiNzFiMTEuLmE2MmE3NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jCkBAIC03OSw2ICs3OSw3IEBACiAJLmZyZWV6ZSAgICAgID0gZGFzZF9nZW5lcmljX3BtX2ZyZWV6ZSwKIAkudGhhdwkgICAgID0gZGFzZF9nZW5lcmljX3Jlc3RvcmVfZGV2aWNlLAogCS5yZXN0b3JlICAgICA9IGRhc2RfZ2VuZXJpY19yZXN0b3JlX2RldmljZSwKKwkuaW50X2NsYXNzICAgPSBJT0lOVF9EQVMsCiB9OwogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmggYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaAppbmRleCAxZGQxMmJkLi5hZmU4YzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaAorKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaApAQCAtNTE2LDYgKzUxNiw3IEBACiAJCQkJCSAqLwogI2RlZmluZSBEQVNEX0ZMQUdfSVNfUkVTRVJWRUQJNwkvKiBUaGUgZGV2aWNlIGlzIHJlc2VydmVkICovCiAjZGVmaW5lIERBU0RfRkxBR19MT0NLX1NUT0xFTgk4CS8qIFRoZSBkZXZpY2UgbG9jayB3YXMgc3RvbGVuICovCisjZGVmaW5lIERBU0RfRkxBR19TVVNQRU5ERUQJOQkvKiBUaGUgZGV2aWNlIHdhcyBzdXNwZW5kZWQgKi8KIAogCiB2b2lkIGRhc2RfcHV0X2RldmljZV93YWtlKHN0cnVjdCBkYXNkX2RldmljZSAqKTsKQEAgLTY0Myw2ICs2NDQsNyBAQAogZGFzZF9zbWFsbG9jX3JlcXVlc3QoaW50ICwgaW50LCBpbnQsIHN0cnVjdCBkYXNkX2RldmljZSAqKTsKIHZvaWQgZGFzZF9rZnJlZV9yZXF1ZXN0KHN0cnVjdCBkYXNkX2Njd19yZXEgKiwgc3RydWN0IGRhc2RfZGV2aWNlICopOwogdm9pZCBkYXNkX3NmcmVlX3JlcXVlc3Qoc3RydWN0IGRhc2RfY2N3X3JlcSAqLCBzdHJ1Y3QgZGFzZF9kZXZpY2UgKik7Cit2b2lkIGRhc2Rfd2FrZXVwX2NiKHN0cnVjdCBkYXNkX2Njd19yZXEgKiwgdm9pZCAqKTsKIAogc3RhdGljIGlubGluZSBpbnQKIGRhc2Rfa21hbGxvY19zZXRfY2RhKHN0cnVjdCBjY3cxICpjY3csIHZvaWQgKmNkYSwgc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwppbmRleCA5YjQzYWU5Li5hNWE1NWRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIHN0YXRpYyBpbnQgZGNzc2Jsa19vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSk7CiBzdGF0aWMgaW50IGRjc3NibGtfcmVsZWFzZShzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgZm1vZGVfdCBtb2RlKTsKLXN0YXRpYyBpbnQgZGNzc2Jsa19tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7CitzdGF0aWMgdm9pZCBkY3NzYmxrX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKIHN0YXRpYyBpbnQgZGNzc2Jsa19kaXJlY3RfYWNjZXNzKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY251bSwKIAkJCQkgdm9pZCAqKmthZGRyLCB1bnNpZ25lZCBsb25nICpwZm4pOwogCkBAIC04MTQsNyArODE0LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyB2b2lkCiBkY3NzYmxrX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvICpkZXZfaW5mbzsKQEAgLTg3MSwxMCArODcxLDkgQEAKIAkJYnl0ZXNfZG9uZSArPSBidmVjLT5idl9sZW47CiAJfQogCWJpb19lbmRpbyhiaW8sIDApOwotCXJldHVybiAwOworCXJldHVybjsKIGZhaWw6CiAJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL3hwcmFtLmMKaW5kZXggMWY2YTRkOC4uOThmM2U0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL3hwcmFtLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL3hwcmFtLmMKQEAgLTE4MSw3ICsxODEsNyBAQAogLyoKICAqIEJsb2NrIGRldmljZSBtYWtlIHJlcXVlc3QgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQgeHByYW1fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCB4cHJhbV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAl4cHJhbV9kZXZpY2VfdCAqeGRldiA9IGJpby0+YmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBiaW9fdmVjICpidmVjOwpAQCAtMjIxLDEwICsyMjEsOSBAQAogCX0KIAlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOwogCWJpb19lbmRpbyhiaW8sIDApOwotCXJldHVybiAwOworCXJldHVybjsKIGZhaWw6CiAJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgeHByYW1fZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCmluZGV4IDY5NDQ2NGMuLjkzNDQ1OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKQEAgLTksNyArOSw2IEBACiAgKgkgICAgICBEYW4gTW9ycmlzb24sIElCTSBDb3Jwb3JhdGlvbiA8ZG1vcnJpc29AY3NlLmJ1ZmZhbG8uZWR1PgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CkBAIC0zNjIsNyArMzYxLDYgQEAKIAlpbnQgY3N0YXQsIGRzdGF0OwogCWludCBjb3VudDsKIAotCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQzE1XSsrOwogCXJhdyA9IGRldl9nZXRfZHJ2ZGF0YSgmY2Rldi0+ZGV2KTsKIAlyZXEgPSAoc3RydWN0IHJhdzMyMTVfcmVxICopIGludHBhcm07CiAJY3N0YXQgPSBpcmItPnNjc3cuY21kLmNzdGF0OwpAQCAtNzc2LDYgKzc3NCw3IEBACiAJLmZyZWV6ZQkJPSAmcmF3MzIxNV9wbV9zdG9wLAogCS50aGF3CQk9ICZyYXczMjE1X3BtX3N0YXJ0LAogCS5yZXN0b3JlCT0gJnJhdzMyMTVfcG1fc3RhcnQsCisJLmludF9jbGFzcwk9IElPSU5UX0MxNSwKIH07CiAKICNpZmRlZiBDT05GSUdfVE4zMjE1X0NPTlNPTEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL2ZzMzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMKaW5kZXggZjY0ODllYi4uZTcxMjk4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYwppbmRleCA4MTBhYzM4Li5lNWNiOTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jCkBAIC03LDcgKzcsNiBAQAogICogICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMywgMjAwOQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTMzMCw3ICszMjksNiBAQAogCXN0cnVjdCByYXczMjcwX3JlcXVlc3QgKnJxOwogCWludCByYzsKIAotCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQzcwXSsrOwogCXJwID0gZGV2X2dldF9kcnZkYXRhKCZjZGV2LT5kZXYpOwogCWlmICghcnApCiAJCXJldHVybjsKQEAgLTEzOTgsNiArMTM5Niw3IEBACiAJLmZyZWV6ZQkJPSAmcmF3MzI3MF9wbV9zdG9wLAogCS50aGF3CQk9ICZyYXczMjcwX3BtX3N0YXJ0LAogCS5yZXN0b3JlCT0gJnJhdzMyNzBfcG1fc3RhcnQsCisJLmludF9jbGFzcwk9IElPSU5UX0M3MCwKIH07CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY21kLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NtZC5jCmluZGV4IDgzN2UwMTAuLjBiNTRhOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY21kLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jbWQuYwpAQCAtNjEsOCArNjEsOCBAQAogCXJjID0gc2NscF9zZXJ2aWNlX2NhbGwoY21kLCBzY2NiKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwotCV9fbG9hZF9wc3dfbWFzayhQU1dfQkFTRV9CSVRTIHwgUFNXX01BU0tfRVhUIHwKLQkJCVBTV19NQVNLX1dBSVQgfCBQU1dfREVGQVVMVF9LRVkpOworCV9fbG9hZF9wc3dfbWFzayhQU1dfREVGQVVMVF9LRVkgfCBQU1dfTUFTS19CQVNFIHwgUFNXX01BU0tfRUEgfAorCQkJUFNXX01BU0tfQkEgfCBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19XQUlUKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogb3V0OgogCS8qIENvbnRlbnRzIG9mIHRoZSBzY2NiIG1pZ2h0IGhhdmUgY2hhbmdlZC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3BpX3N5cy5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jcGlfc3lzLmMKaW5kZXggNGE1MWUzZi4uYmQxYjljOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jcGlfc3lzLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jcGlfc3lzLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vc2NscC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jCmluZGV4IGE5MGEwMmMuLjg3ZmMwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jCkBAIC0zMCw3ICszMCw4IEBACiAJcHN3X3QgcXVpZXNjZV9wc3c7CiAKIAlzbXBfc2VuZF9zdG9wKCk7Ci0JcXVpZXNjZV9wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19XQUlUOworCXF1aWVzY2VfcHN3Lm1hc2sgPQorCQlQU1dfTUFTS19CQVNFIHwgUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQSB8IFBTV19NQVNLX1dBSVQ7CiAJcXVpZXNjZV9wc3cuYWRkciA9IDB4ZmZmOwogCV9fbG9hZF9wc3cocXVpZXNjZV9wc3cpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM0eHguYwppbmRleCA5ZWZmMmRmLi45MzRlZjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM0eHguYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM0eHguYwpAQCAtMTMzMCw2ICsxMzMwLDcgQEAKIAkuc2V0X29ubGluZSA9IHRhcGVfMzR4eF9vbmxpbmUsCiAJLnNldF9vZmZsaW5lID0gdGFwZV9nZW5lcmljX29mZmxpbmUsCiAJLmZyZWV6ZSA9IHRhcGVfZ2VuZXJpY19wbV9zdXNwZW5kLAorCS5pbnRfY2xhc3MgPSBJT0lOVF9UQVAsCiB9OwogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jCmluZGV4IGE3ZDU3MDcuLjQ5YzZhYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jCkBAIC0xNzYyLDYgKzE3NjIsNyBAQAogCS5zZXRfb2ZmbGluZSA9IHRhcGVfZ2VuZXJpY19vZmZsaW5lLAogCS5zZXRfb25saW5lID0gdGFwZV8zNTkwX29ubGluZSwKIAkuZnJlZXplID0gdGFwZV9nZW5lcmljX3BtX3N1c3BlbmQsCisJLmludF9jbGFzcyA9IElPSU5UX1RBUCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NvcmUuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jCmluZGV4IDc5NzhhMGEuLmIzYTNlOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jCkBAIC0xNCw3ICsxNCw2IEBACiAjZGVmaW5lIEtNU0dfQ09NUE9ORU5UICJ0YXBlIgogI2RlZmluZSBwcl9mbXQoZm10KSBLTVNHX0NPTVBPTkVOVCAiOiAiIGZtdAogCi0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CSAgICAgLy8gZm9yIGtlcm5lbCBwYXJhbWV0ZXJzCiAjaW5jbHVkZSA8bGludXgva21vZC5oPgkgICAgIC8vIGZvciByZXF1ZXN0aW5nIG1vZHVsZXMKQEAgLTExMTUsNyArMTExNCw2IEBACiAJc3RydWN0IHRhcGVfcmVxdWVzdCAqcmVxdWVzdDsKIAlpbnQgcmM7CiAKLQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX1RBUF0rKzsKIAlkZXZpY2UgPSBkZXZfZ2V0X2RydmRhdGEoJmNkZXYtPmRldik7CiAJaWYgKGRldmljZSA9PSBOVUxMKSB7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtY3AuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtY3AuYwppbmRleCAzMWEzY2NiLi43NWJkZTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci92bWNwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdm1jcC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vY29tcGF0Lmg+CiAjaW5jbHVkZSA8YXNtL2NwY21kLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMgYi9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMKaW5kZXggZjZiMDBjMy4uODVmNGE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdm11ci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYwpAQCAtMTEsOSArMTEsOSBAQAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAidm11ciIKICNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2Npby5oPgpAQCAtNzQsNiArNzQsNyBAQAogCS5zZXRfb25saW5lCT0gdXJfc2V0X29ubGluZSwKIAkuc2V0X29mZmxpbmUJPSB1cl9zZXRfb2ZmbGluZSwKIAkuZnJlZXplCQk9IHVyX3BtX3N1c3BlbmQsCisJLmludF9jbGFzcwk9IElPSU5UX1ZNUiwKIH07CiAKIHN0YXRpYyBERUZJTkVfTVVURVgodm11cl9tdXRleCk7CkBAIC0zMDUsNyArMzA2LDYgQEAKIHsKIAlzdHJ1Y3QgdXJkZXYgKnVyZDsKIAotCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfVk1SXSsrOwogCVRSQUNFKCJ1cl9pbnRfaGFuZGxlcjogaW50cGFybT0weCVseCBjc3RhdD0lMDJ4IGRzdGF0PSUwMnggcmVzPSV1XG4iLAogCSAgICAgIGludHBhcm0sIGlyYi0+c2Nzdy5jbWQuY3N0YXQsIGlyYi0+c2Nzdy5jbWQuZHN0YXQsCiAJICAgICAgaXJiLT5zY3N3LmNtZC5jb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci96Y29yZS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvemNvcmUuYwppbmRleCAzYjk0MDQ0Li40MzA2OGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci96Y29yZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3pjb3JlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vaXBsLmg+CiAjaW5jbHVkZSA8YXNtL3NjbHAuaD4KQEAgLTE0MiwyMiArMTQzLDYgQEAKIAlyZXR1cm4gbWVtY3B5X2hzYShkZXN0LCBzcmMsIGNvdW50LCBUT19LRVJORUwpOwogfQogCi1zdGF0aWMgaW50IG1lbWNweV9yZWFsX3VzZXIodm9pZCBfX3VzZXIgKmRlc3QsIHVuc2lnbmVkIGxvbmcgc3JjLCBzaXplX3QgY291bnQpCi17Ci0Jc3RhdGljIGNoYXIgYnVmWzQwOTZdOwotCWludCBvZmZzID0gMCwgc2l6ZTsKLQotCXdoaWxlIChvZmZzIDwgY291bnQpIHsKLQkJc2l6ZSA9IG1pbihzaXplb2YoYnVmKSwgY291bnQgLSBvZmZzKTsKLQkJaWYgKG1lbWNweV9yZWFsKGJ1ZiwgKHZvaWQgKikgc3JjICsgb2Zmcywgc2l6ZSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKGNvcHlfdG9fdXNlcihkZXN0ICsgb2ZmcywgYnVmLCBzaXplKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlvZmZzICs9IHNpemU7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2NwdV9pbmZvKGVudW0gYXJjaF9pZCBhcmNoKQogewogCXN0cnVjdCBzYXZlX2FyZWEgKnNhOwpAQCAtMzQ2LDggKzMzMSw4IEBACiAKIAkvKiBDb3B5IGZyb20gcmVhbCBtZW0gKi8KIAlzaXplID0gY291bnQgLSBtZW1fb2ZmcyAtIGhkcl9jb3VudDsKLQlyYyA9IG1lbWNweV9yZWFsX3VzZXIoYnVmICsgaGRyX2NvdW50ICsgbWVtX29mZnMsIG1lbV9zdGFydCArIG1lbV9vZmZzLAotCQkJICAgICAgc2l6ZSk7CisJcmMgPSBjb3B5X3RvX3VzZXJfcmVhbChidWYgKyBoZHJfY291bnQgKyBtZW1fb2ZmcywKKwkJCSAgICAgICAodm9pZCAqKSBtZW1fc3RhcnQgKyBtZW1fb2Zmcywgc2l6ZSk7CiAJaWYgKHJjKQogCQlnb3RvIGZhaWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwppbmRleCA1YzU2NzQxLi40ZjE5ODlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCkBAIC0yOSwzMSArMjksMjAgQEAKIAogLyogYSBkZXZpY2UgbWF0Y2hlcyBhIGRyaXZlciBpZiBhbGwgaXRzIHNsYXZlIGRldmljZXMgbWF0Y2ggdGhlIHNhbWUKICAqIGVudHJ5IG9mIHRoZSBkcml2ZXIgKi8KLXN0YXRpYyBpbnQKLWNjd2dyb3VwX2J1c19tYXRjaCAoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpCitzdGF0aWMgaW50IGNjd2dyb3VwX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KQogewotCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXY7Ci0Jc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydjsKLQotCWdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOwotCWdkcnYgPSB0b19jY3dncm91cGRydihkcnYpOworCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOworCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnYgPSB0b19jY3dncm91cGRydihkcnYpOwogCiAJaWYgKGdkZXYtPmNyZWF0b3JfaWQgPT0gZ2Rydi0+ZHJpdmVyX2lkKQogCQlyZXR1cm4gMTsKIAogCXJldHVybiAwOwogfQotc3RhdGljIGludAotY2N3Z3JvdXBfdWV2ZW50IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKLXsKLQkvKiBUT0RPICovCi0JcmV0dXJuIDA7Ci19CiAKIHN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgY2N3Z3JvdXBfYnVzX3R5cGU7CiAKLXN0YXRpYyB2b2lkCi1fX2Njd2dyb3VwX3JlbW92ZV9zeW1saW5rcyhzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2KQorc3RhdGljIHZvaWQgX19jY3dncm91cF9yZW1vdmVfc3ltbGlua3Moc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKIHsKIAlpbnQgaTsKIAljaGFyIHN0cls4XTsKQEAgLTYzLDcgKzUyLDYgQEAKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmdkZXYtPmRldi5rb2JqLCBzdHIpOwogCQlzeXNmc19yZW1vdmVfbGluaygmZ2Rldi0+Y2RldltpXS0+ZGV2LmtvYmosICJncm91cF9kZXZpY2UiKTsKIAl9Ci0JCiB9CiAKIC8qCkBAIC04Nyw2ICs3NSw4NyBAQAogCX0KIH0KIAorc3RhdGljIGludCBjY3dncm91cF9zZXRfb25saW5lKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYpCit7CisJc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydiA9IHRvX2Njd2dyb3VwZHJ2KGdkZXYtPmRldi5kcml2ZXIpOworCWludCByZXQgPSAwOworCisJaWYgKGF0b21pY19jbXB4Y2hnKCZnZGV2LT5vbm9mZiwgMCwgMSkgIT0gMCkKKwkJcmV0dXJuIC1FQUdBSU47CisJaWYgKGdkZXYtPnN0YXRlID09IENDV0dST1VQX09OTElORSkKKwkJZ290byBvdXQ7CisJaWYgKGdkcnYtPnNldF9vbmxpbmUpCisJCXJldCA9IGdkcnYtPnNldF9vbmxpbmUoZ2Rldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlnZGV2LT5zdGF0ZSA9IENDV0dST1VQX09OTElORTsKK291dDoKKwlhdG9taWNfc2V0KCZnZGV2LT5vbm9mZiwgMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjY3dncm91cF9zZXRfb2ZmbGluZShzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2KQoreworCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnYgPSB0b19jY3dncm91cGRydihnZGV2LT5kZXYuZHJpdmVyKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhdG9taWNfY21weGNoZygmZ2Rldi0+b25vZmYsIDAsIDEpICE9IDApCisJCXJldHVybiAtRUFHQUlOOworCWlmIChnZGV2LT5zdGF0ZSA9PSBDQ1dHUk9VUF9PRkZMSU5FKQorCQlnb3RvIG91dDsKKwlpZiAoZ2Rydi0+c2V0X29mZmxpbmUpCisJCXJldCA9IGdkcnYtPnNldF9vZmZsaW5lKGdkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZ2Rldi0+c3RhdGUgPSBDQ1dHUk9VUF9PRkZMSU5FOworb3V0OgorCWF0b21pY19zZXQoJmdkZXYtPm9ub2ZmLCAwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBjY3dncm91cF9vbmxpbmVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2ID0gdG9fY2N3Z3JvdXBkZXYoZGV2KTsKKwlzdHJ1Y3QgY2N3Z3JvdXBfZHJpdmVyICpnZHJ2ID0gdG9fY2N3Z3JvdXBkcnYoZGV2LT5kcml2ZXIpOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCWlmICghZGV2LT5kcml2ZXIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghdHJ5X21vZHVsZV9nZXQoZ2Rydi0+ZHJpdmVyLm93bmVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAodmFsdWUgPT0gMSkKKwkJcmV0ID0gY2N3Z3JvdXBfc2V0X29ubGluZShnZGV2KTsKKwllbHNlIGlmICh2YWx1ZSA9PSAwKQorCQlyZXQgPSBjY3dncm91cF9zZXRfb2ZmbGluZShnZGV2KTsKKwllbHNlCisJCXJldCA9IC1FSU5WQUw7CitvdXQ6CisJbW9kdWxlX3B1dChnZHJ2LT5kcml2ZXIub3duZXIpOworCXJldHVybiAocmV0ID09IDApID8gY291bnQgOiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNjd2dyb3VwX29ubGluZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2ID0gdG9fY2N3Z3JvdXBkZXYoZGV2KTsKKwlpbnQgb25saW5lOworCisJb25saW5lID0gKGdkZXYtPnN0YXRlID09IENDV0dST1VQX09OTElORSkgPyAxIDogMDsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgb25saW5lKTsKK30KKwogLyoKICAqIFByb3ZpZGUgYW4gJ3VuZ3JvdXAnIGF0dHJpYnV0ZSBzbyB0aGUgdXNlciBjYW4gcmVtb3ZlIGdyb3VwIGRldmljZXMgbm8KICAqIGxvbmdlciBuZWVkZWQgb3IgYWNjaWRlbnRpYWxseSBjcmVhdGVkLiBTYXZlcyBtZW1vcnkgOikKQEAgLTEwNCwxNCArMTczLDEzIEBACiAJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogfQogCi1zdGF0aWMgc3NpemVfdAotY2N3Z3JvdXBfdW5ncm91cF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGNjd2dyb3VwX3VuZ3JvdXBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXY7CisJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7CiAJaW50IHJjOwogCi0JZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7Ci0KIAkvKiBQcmV2ZW50IGNvbmN1cnJlbnQgb25saW5lL29mZmxpbmUgcHJvY2Vzc2luZyBhbmQgdW5ncm91cGluZy4gKi8KIAlpZiAoYXRvbWljX2NtcHhjaGcoJmdkZXYtPm9ub2ZmLCAwLCAxKSAhPSAwKQogCQlyZXR1cm4gLUVBR0FJTjsKQEAgLTEzMiwyNCArMjAwLDM1IEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLQogc3RhdGljIERFVklDRV9BVFRSKHVuZ3JvdXAsIDAyMDAsIE5VTEwsIGNjd2dyb3VwX3VuZ3JvdXBfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKG9ubGluZSwgMDY0NCwgY2N3Z3JvdXBfb25saW5lX3Nob3csIGNjd2dyb3VwX29ubGluZV9zdG9yZSk7CiAKLXN0YXRpYyB2b2lkCi1jY3dncm91cF9yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2N3Z3JvdXBfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfb25saW5lLmF0dHIsCisJJmRldl9hdHRyX3VuZ3JvdXAuYXR0ciwKKwlOVUxMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNjd2dyb3VwX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gY2N3Z3JvdXBfYXR0cnMsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmNjd2dyb3VwX2F0dHJfZ3JvdXBzW10gPSB7CisJJmNjd2dyb3VwX2F0dHJfZ3JvdXAsCisJTlVMTCwKK307CisKK3N0YXRpYyB2b2lkIGNjd2dyb3VwX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCWtmcmVlKHRvX2Njd2dyb3VwZGV2KGRldikpOwogfQogCi1zdGF0aWMgaW50Ci1fX2Njd2dyb3VwX2NyZWF0ZV9zeW1saW5rcyhzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2KQorc3RhdGljIGludCBfX2Njd2dyb3VwX2NyZWF0ZV9zeW1saW5rcyhzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2KQogewogCWNoYXIgc3RyWzhdOwogCWludCBpLCByYzsKIAogCWZvciAoaSA9IDA7IGkgPCBnZGV2LT5jb3VudDsgaSsrKSB7Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2xpbmsoJmdkZXYtPmNkZXZbaV0tPmRldi5rb2JqLCAmZ2Rldi0+ZGV2LmtvYmosCi0JCQkJICAgICAgICJncm91cF9kZXZpY2UiKTsKKwkJcmMgPSBzeXNmc19jcmVhdGVfbGluaygmZ2Rldi0+Y2RldltpXS0+ZGV2LmtvYmosCisJCQkJICAgICAgICZnZGV2LT5kZXYua29iaiwgImdyb3VwX2RldmljZSIpOwogCQlpZiAocmMpIHsKIAkJCWZvciAoLS1pOyBpID49IDA7IGktLSkKIAkJCQlzeXNmc19yZW1vdmVfbGluaygmZ2Rldi0+Y2RldltpXS0+ZGV2LmtvYmosCkBAIC0xNTksOCArMjM4LDggQEAKIAl9CiAJZm9yIChpID0gMDsgaSA8IGdkZXYtPmNvdW50OyBpKyspIHsKIAkJc3ByaW50ZihzdHIsICJjZGV2JWQiLCBpKTsKLQkJcmMgPSBzeXNmc19jcmVhdGVfbGluaygmZ2Rldi0+ZGV2LmtvYmosICZnZGV2LT5jZGV2W2ldLT5kZXYua29iaiwKLQkJCQkgICAgICAgc3RyKTsKKwkJcmMgPSBzeXNmc19jcmVhdGVfbGluaygmZ2Rldi0+ZGV2LmtvYmosCisJCQkJICAgICAgICZnZGV2LT5jZGV2W2ldLT5kZXYua29iaiwgc3RyKTsKIAkJaWYgKHJjKSB7CiAJCQlmb3IgKC0taTsgaSA+PSAwOyBpLS0pIHsKIAkJCQlzcHJpbnRmKHN0ciwgImNkZXYlZCIsIGkpOwpAQCAtMjkzLDI2ICszNzIsMTcgQEAKIAl9CiAKIAlkZXZfc2V0X25hbWUoJmdkZXYtPmRldiwgIiVzIiwgZGV2X25hbWUoJmdkZXYtPmNkZXZbMF0tPmRldikpOwotCisJZ2Rldi0+ZGV2Lmdyb3VwcyA9IGNjd2dyb3VwX2F0dHJfZ3JvdXBzOwogCXJjID0gZGV2aWNlX2FkZCgmZ2Rldi0+ZGV2KTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyb3I7Ci0JZ2V0X2RldmljZSgmZ2Rldi0+ZGV2KTsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmZ2Rldi0+ZGV2LCAmZGV2X2F0dHJfdW5ncm91cCk7Ci0KKwlyYyA9IF9fY2N3Z3JvdXBfY3JlYXRlX3N5bWxpbmtzKGdkZXYpOwogCWlmIChyYykgewotCQlkZXZpY2VfdW5yZWdpc3RlcigmZ2Rldi0+ZGV2KTsKKwkJZGV2aWNlX2RlbCgmZ2Rldi0+ZGV2KTsKIAkJZ290byBlcnJvcjsKIAl9Ci0KLQlyYyA9IF9fY2N3Z3JvdXBfY3JlYXRlX3N5bWxpbmtzKGdkZXYpOwotCWlmICghcmMpIHsKLQkJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwotCQlwdXRfZGV2aWNlKCZnZGV2LT5kZXYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZnZGV2LT5kZXYsICZkZXZfYXR0cl91bmdyb3VwKTsKLQlkZXZpY2VfdW5yZWdpc3RlcigmZ2Rldi0+ZGV2KTsKKwltdXRleF91bmxvY2soJmdkZXYtPnJlZ19tdXRleCk7CisJcmV0dXJuIDA7CiBlcnJvcjoKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykKIAkJaWYgKGdkZXYtPmNkZXZbaV0pIHsKQEAgLTMzMCw3ICs0MDAsMTUgQEAKIEVYUE9SVF9TWU1CT0woY2N3Z3JvdXBfY3JlYXRlX2Zyb21fc3RyaW5nKTsKIAogc3RhdGljIGludCBjY3dncm91cF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSAgICAgdm9pZCAqZGF0YSk7CisJCQkgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKKworCWlmIChhY3Rpb24gPT0gQlVTX05PVElGWV9VTkJJTkRfRFJJVkVSKQorCQlkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soZGV2LCBjY3dncm91cF91bmdyb3VwX2NhbGxiYWNrKTsKKworCXJldHVybiBOT1RJRllfT0s7Cit9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY2N3Z3JvdXBfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBjY3dncm91cF9ub3RpZmllcgpAQCAtMzYyLDEzOCArNDQwLDIxIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBkcml2ZXIgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50Ci1jY3dncm91cF9zZXRfb25saW5lKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYpCitzdGF0aWMgaW50IGNjd2dyb3VwX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZHJpdmVyICpnZHJ2OwotCWludCByZXQ7CisJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7CisJc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydiA9IHRvX2Njd2dyb3VwZHJ2KGRldi0+ZHJpdmVyKTsKIAotCWlmIChhdG9taWNfY21weGNoZygmZ2Rldi0+b25vZmYsIDAsIDEpICE9IDApCi0JCXJldHVybiAtRUFHQUlOOwotCWlmIChnZGV2LT5zdGF0ZSA9PSBDQ1dHUk9VUF9PTkxJTkUpIHsKLQkJcmV0ID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICghZ2Rldi0+ZGV2LmRyaXZlcikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JZ2RydiA9IHRvX2Njd2dyb3VwZHJ2IChnZGV2LT5kZXYuZHJpdmVyKTsKLQlpZiAoKHJldCA9IGdkcnYtPnNldF9vbmxpbmUgPyBnZHJ2LT5zZXRfb25saW5lKGdkZXYpIDogMCkpCi0JCWdvdG8gb3V0OwotCi0JZ2Rldi0+c3RhdGUgPSBDQ1dHUk9VUF9PTkxJTkU7Ci0gb3V0OgotCWF0b21pY19zZXQoJmdkZXYtPm9ub2ZmLCAwKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBnZHJ2LT5wcm9iZSA/IGdkcnYtPnByb2JlKGdkZXYpIDogLUVOT0RFVjsKIH0KIAotc3RhdGljIGludAotY2N3Z3JvdXBfc2V0X29mZmxpbmUoc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKK3N0YXRpYyBpbnQgY2N3Z3JvdXBfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZHJpdmVyICpnZHJ2OwotCWludCByZXQ7Ci0KLQlpZiAoYXRvbWljX2NtcHhjaGcoJmdkZXYtPm9ub2ZmLCAwLCAxKSAhPSAwKQotCQlyZXR1cm4gLUVBR0FJTjsKLQlpZiAoZ2Rldi0+c3RhdGUgPT0gQ0NXR1JPVVBfT0ZGTElORSkgewotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKCFnZGV2LT5kZXYuZHJpdmVyKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQlnZHJ2ID0gdG9fY2N3Z3JvdXBkcnYgKGdkZXYtPmRldi5kcml2ZXIpOwotCWlmICgocmV0ID0gZ2Rydi0+c2V0X29mZmxpbmUgPyBnZHJ2LT5zZXRfb2ZmbGluZShnZGV2KSA6IDApKQotCQlnb3RvIG91dDsKLQotCWdkZXYtPnN0YXRlID0gQ0NXR1JPVVBfT0ZGTElORTsKLSBvdXQ6Ci0JYXRvbWljX3NldCgmZ2Rldi0+b25vZmYsIDApOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jY3dncm91cF9vbmxpbmVfc3RvcmUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXY7Ci0Jc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydjsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOwotCWludCByZXQ7Ci0KLQlpZiAoIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOwotCWdkcnYgPSB0b19jY3dncm91cGRydihkZXYtPmRyaXZlcik7Ci0KLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGdkcnYtPmRyaXZlci5vd25lcikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsdWUpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHZhbHVlID09IDEpCi0JCXJldCA9IGNjd2dyb3VwX3NldF9vbmxpbmUoZ2Rldik7Ci0JZWxzZSBpZiAodmFsdWUgPT0gMCkKLQkJcmV0ID0gY2N3Z3JvdXBfc2V0X29mZmxpbmUoZ2Rldik7Ci0JZWxzZQotCQlyZXQgPSAtRUlOVkFMOwotb3V0OgotCW1vZHVsZV9wdXQoZ2Rydi0+ZHJpdmVyLm93bmVyKTsKLQlyZXR1cm4gKHJldCA9PSAwKSA/IGNvdW50IDogcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdAotY2N3Z3JvdXBfb25saW5lX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlpbnQgb25saW5lOwotCi0Jb25saW5lID0gKHRvX2Njd2dyb3VwZGV2KGRldiktPnN0YXRlID09IENDV0dST1VQX09OTElORSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsIG9ubGluZSA/ICIxXG4iIDogIjBcbiIpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIob25saW5lLCAwNjQ0LCBjY3dncm91cF9vbmxpbmVfc2hvdywgY2N3Z3JvdXBfb25saW5lX3N0b3JlKTsKLQotc3RhdGljIGludAotY2N3Z3JvdXBfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2OwotCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnY7Ci0KLQlpbnQgcmV0OwotCi0JZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7Ci0JZ2RydiA9IHRvX2Njd2dyb3VwZHJ2KGRldi0+ZHJpdmVyKTsKLQotCWlmICgocmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX29ubGluZSkpKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gZ2Rydi0+cHJvYmUgPyBnZHJ2LT5wcm9iZShnZGV2KSA6IC1FTk9ERVY7Ci0JaWYgKHJldCkKLQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX29ubGluZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci1jY3dncm91cF9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2OwotCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnY7Ci0KLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfb25saW5lKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdW5ncm91cCk7CisJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7CisJc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydiA9IHRvX2Njd2dyb3VwZHJ2KGRldi0+ZHJpdmVyKTsKIAogCWlmICghZGV2LT5kcml2ZXIpCiAJCXJldHVybiAwOwotCi0JZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7Ci0JZ2RydiA9IHRvX2Njd2dyb3VwZHJ2KGRldi0+ZHJpdmVyKTsKLQogCWlmIChnZHJ2LT5yZW1vdmUpCiAJCWdkcnYtPnJlbW92ZShnZGV2KTsKIApAQCAtNTAyLDE1ICs0NjMsMTEgQEAKIAogc3RhdGljIHZvaWQgY2N3Z3JvdXBfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXY7Ci0Jc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydjsKKwlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2ID0gdG9fY2N3Z3JvdXBkZXYoZGV2KTsKKwlzdHJ1Y3QgY2N3Z3JvdXBfZHJpdmVyICpnZHJ2ID0gdG9fY2N3Z3JvdXBkcnYoZGV2LT5kcml2ZXIpOwogCiAJaWYgKCFkZXYtPmRyaXZlcikKIAkJcmV0dXJuOwotCi0JZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7Ci0JZ2RydiA9IHRvX2Njd2dyb3VwZHJ2KGRldi0+ZHJpdmVyKTsKLQogCWlmIChnZHJ2LT5zaHV0ZG93bikKIAkJZ2Rydi0+c2h1dGRvd24oZ2Rldik7CiB9CkBAIC01ODYsMjYgKzU0MywxMiBAQAogc3RhdGljIHN0cnVjdCBidXNfdHlwZSBjY3dncm91cF9idXNfdHlwZSA9IHsKIAkubmFtZSAgID0gImNjd2dyb3VwIiwKIAkubWF0Y2ggID0gY2N3Z3JvdXBfYnVzX21hdGNoLAotCS51ZXZlbnQgPSBjY3dncm91cF91ZXZlbnQsCiAJLnByb2JlICA9IGNjd2dyb3VwX3Byb2JlLAogCS5yZW1vdmUgPSBjY3dncm91cF9yZW1vdmUsCiAJLnNodXRkb3duID0gY2N3Z3JvdXBfc2h1dGRvd24sCiAJLnBtID0gJmNjd2dyb3VwX3BtX29wcywKIH07CiAKLQotc3RhdGljIGludCBjY3dncm91cF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSAgICAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOwotCi0JaWYgKGFjdGlvbiA9PSBCVVNfTk9USUZZX1VOQklORF9EUklWRVIpCi0JCWRldmljZV9zY2hlZHVsZV9jYWxsYmFjayhkZXYsIGNjd2dyb3VwX3VuZ3JvdXBfY2FsbGJhY2spOwotCi0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotCiAvKioKICAqIGNjd2dyb3VwX2RyaXZlcl9yZWdpc3RlcigpIC0gcmVnaXN0ZXIgYSBjY3cgZ3JvdXAgZHJpdmVyCiAgKiBAY2RyaXZlcjogZHJpdmVyIHRvIGJlIHJlZ2lzdGVyZWQKQEAgLTYxOSw5ICs1NjIsOSBAQAogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmY2RyaXZlci0+ZHJpdmVyKTsKIH0KK0VYUE9SVF9TWU1CT0woY2N3Z3JvdXBfZHJpdmVyX3JlZ2lzdGVyKTsKIAotc3RhdGljIGludAotX19jY3dncm91cF9tYXRjaF9hbGwoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIGludCBfX2Njd2dyb3VwX21hdGNoX2FsbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIDE7CiB9CkBAIC02NTIsNiArNTk1LDcgQEAKIAlwdXRfZHJpdmVyKCZjZHJpdmVyLT5kcml2ZXIpOwogCWRyaXZlcl91bnJlZ2lzdGVyKCZjZHJpdmVyLT5kcml2ZXIpOwogfQorRVhQT1JUX1NZTUJPTChjY3dncm91cF9kcml2ZXJfdW5yZWdpc3Rlcik7CiAKIC8qKgogICogY2N3Z3JvdXBfcHJvYmVfY2N3ZGV2KCkgLSBwcm9iZSBmdW5jdGlvbiBmb3Igc2xhdmUgZGV2aWNlcwpAQCAtNjY2LDYgKzYxMCw3IEBACiB7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGNjd2dyb3VwX3Byb2JlX2Njd2Rldik7CiAKIC8qKgogICogY2N3Z3JvdXBfcmVtb3ZlX2Njd2RldigpIC0gcmVtb3ZlIGZ1bmN0aW9uIGZvciBzbGF2ZSBkZXZpY2VzCkBAIC03MDIsOSArNjQ3LDUgQEAKIAkvKiBSZWxlYXNlIGNjd2dyb3VwIGRldmljZSByZWZlcmVuY2UgZm9yIGxvY2FsIHByb2Nlc3NpbmcuICovCiAJcHV0X2RldmljZSgmZ2Rldi0+ZGV2KTsKIH0KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotRVhQT1JUX1NZTUJPTChjY3dncm91cF9kcml2ZXJfcmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChjY3dncm91cF9kcml2ZXJfdW5yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKGNjd2dyb3VwX3Byb2JlX2Njd2Rldik7CiBFWFBPUlRfU1lNQk9MKGNjd2dyb3VwX3JlbW92ZV9jY3dkZXYpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jY3dyZXEuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3cmVxLmMKaW5kZXggZDE1ZjhiNC4uNTE1NjI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dyZXEuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Njd3JlcS5jCkBAIC0xLDEwICsxLDEzIEBACiAvKgogICogIEhhbmRsaW5nIG9mIGludGVybmFsIENDVyBkZXZpY2UgcmVxdWVzdHMuCiAgKgotICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA5CisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDksIDIwMTEKICAqICAgIEF1dGhvcihzKTogUGV0ZXIgT2JlcnBhcmxlaXRlciA8cGV0ZXIub2JlcnBhcmxlaXRlckBkZS5pYm0uY29tPgogICovCiAKKyNkZWZpbmUgS01TR19DT01QT05FTlQgImNpbyIKKyNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgpAQCAtMzIzLDcgKzMyNiwyMSBAQAogewogCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBjY3dfcmVxdWVzdCAqcmVxID0gJmNkZXYtPnByaXZhdGUtPnJlcTsKLQlpbnQgcmM7CisJaW50IHJjID0gLUVOT0RFViwgY2hwOworCisJaWYgKGNpb191cGRhdGVfc2NoaWIoc2NoKSkKKwkJZ290byBlcnI7CisKKwlmb3IgKGNocCA9IDA7IGNocCA8IDg7IGNocCsrKSB7CisJCWlmICgoMHg4MCA+PiBjaHApICYgc2NoLT5zY2hpYi5wbWN3LmxwdW0pCisJCQlwcl93YXJuaW5nKCIlczogTm8gaW50ZXJydXB0IHdhcyByZWNlaXZlZCB3aXRoaW4gJWx1cyAiCisJCQkJICAgIihDUz0lMDJ4LCBEUz0lMDJ4LCBDSFBJRD0leC4lMDJ4KVxuIiwKKwkJCQkgICBkZXZfbmFtZSgmY2Rldi0+ZGV2KSwgcmVxLT50aW1lb3V0IC8gSFosCisJCQkJICAgc2Nzd19jc3RhdCgmc2NoLT5zY2hpYi5zY3N3KSwKKwkJCQkgICBzY3N3X2RzdGF0KCZzY2gtPnNjaGliLnNjc3cpLAorCQkJCSAgIHNjaC0+c2NoaWQuY3NzaWQsCisJCQkJICAgc2NoLT5zY2hpYi5wbWN3LmNocGlkW2NocF0pOworCX0KIAogCWlmICghY2N3cmVxX25leHRfcGF0aChjZGV2KSkgewogCQkvKiBzZXQgdGhlIGZpbmFsIHJldHVybiBjb2RlIGZvciB0aGlzIHJlcXVlc3QgKi8KQEAgLTM0Miw3ICszNTksNyBAQAogICogY2N3X3JlcXVlc3Rfbm90b3BlciAtIG5vdG9wZXIgaGFuZGxlciBmb3IgSS9PIHJlcXVlc3QgcHJvY2VkdXJlCiAgKiBAY2RldjogY2N3IGRldmljZQogICoKLSAqIEhhbmRsZSB0aW1lb3V0IGR1cmluZyBJL08gcmVxdWVzdCBwcm9jZWR1cmUuCisgKiBIYW5kbGUgbm90b3BlciBkdXJpbmcgSS9PIHJlcXVlc3QgcHJvY2VkdXJlLgogICovCiB2b2lkIGNjd19yZXF1ZXN0X25vdG9wZXIoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHAuYwppbmRleCAyZDMyMjMzLi5lNzkyNDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2hwLmMKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2Nfc2NoLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2Nfc2NoLmMKaW5kZXggZTk1MGYxYS4uMGM4N2IwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaHNjX3NjaC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzY19zY2guYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBEcml2ZXIgZm9yIHMzOTAgY2hzYyBzdWJjaGFubmVscwogICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwOCwgMjAwOQorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA4LCAyMDExCiAgKgogICogQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIDxjb3JuZWxpYS5odWNrQGRlLmlibS5jb20+CiAgKgpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KIAogI2luY2x1ZGUgPGFzbS9jb21wYXQuaD4KICNpbmNsdWRlIDxhc20vY2lvLmg+CkBAIC01Niw2ICs1Nyw4IEBACiAKIAlDSFNDX0xPRyg0LCAiaXJiIik7CiAJQ0hTQ19MT0dfSEVYKDQsIGlyYiwgc2l6ZW9mKCppcmIpKTsKKwlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX0NTQ10rKzsKKwogCS8qIENvcHkgaXJiIHRvIHByb3ZpZGVkIHJlcXVlc3QgYW5kIHNldCBkb25lLiAqLwogCWlmICghcmVxdWVzdCkgewogCQlDSFNDX01TRygwLCAiSW50ZXJydXB0IG9uIHNjaCAwLiV4LiUwNHggd2l0aCBubyByZXF1ZXN0XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKaW5kZXggZWIzMTQwZS4uZGM2N2MzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCkBAIC02MjIsNiArNjIyLDcgQEAKIAkJc2NoID0gKHN0cnVjdCBzdWJjaGFubmVsICopKHVuc2lnbmVkIGxvbmcpdHBpX2luZm8tPmludHBhcm07CiAJCWlmICghc2NoKSB7CiAJCQkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdCBjb25kaXRpb24uICovCisJCQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX0NJT10rKzsKIAkJCXRzY2godHBpX2luZm8tPnNjaGlkLCBpcmIpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTYzNCw3ICs2MzUsMTAgQEAKIAkJCS8qIENhbGwgaW50ZXJydXB0IGhhbmRsZXIgaWYgdGhlcmUgaXMgb25lLiAqLwogCQkJaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT5pcnEpCiAJCQkJc2NoLT5kcml2ZXItPmlycShzY2gpOwotCQl9CisJCQllbHNlCisJCQkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9DSU9dKys7CisJCX0gZWxzZQorCQkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9DSU9dKys7CiAJCXNwaW5fdW5sb2NrKHNjaC0+bG9jayk7CiAJCS8qCiAJCSAqIEFyZSBtb3JlIGludGVycnVwdHMgcGVuZGluZz8KQEAgLTY2NywxOCArNjcxLDIzIEBACiAJdHBpX2luZm8gPSAoc3RydWN0IHRwaV9pbmZvICopJlMzOTBfbG93Y29yZS5zdWJjaGFubmVsX2lkOwogCWlmICh0cGkoTlVMTCkgIT0gMSkKIAkJcmV0dXJuIDA7CisJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT19JTlRFUlJVUFRdKys7CiAJaWYgKHRwaV9pbmZvLT5hZGFwdGVyX0lPKSB7CiAJCWRvX2FkYXB0ZXJfSU8odHBpX2luZm8tPmlzYyk7CiAJCXJldHVybiAxOwogCX0KIAlpcmIgPSAoc3RydWN0IGlyYiAqKSZTMzkwX2xvd2NvcmUuaXJiOwogCS8qIFN0b3JlIGludGVycnVwdCByZXNwb25zZSBibG9jayB0byBsb3djb3JlLiAqLwotCWlmICh0c2NoKHRwaV9pbmZvLT5zY2hpZCwgaXJiKSAhPSAwKQorCWlmICh0c2NoKHRwaV9pbmZvLT5zY2hpZCwgaXJiKSAhPSAwKSB7CiAJCS8qIE5vdCBzdGF0dXMgcGVuZGluZyBvciBub3Qgb3BlcmF0aW9uYWwuICovCisJCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQ0lPXSsrOwogCQlyZXR1cm4gMTsKKwl9CiAJc2NoID0gKHN0cnVjdCBzdWJjaGFubmVsICopKHVuc2lnbmVkIGxvbmcpdHBpX2luZm8tPmludHBhcm07Ci0JaWYgKCFzY2gpCisJaWYgKCFzY2gpIHsKKwkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9DSU9dKys7CiAJCXJldHVybiAxOworCX0KIAlpcnFfY29udGV4dCA9IGluX2ludGVycnVwdCgpOwogCWlmICghaXJxX2NvbnRleHQpCiAJCWxvY2FsX2JoX2Rpc2FibGUoKTsKQEAgLTY4Nyw2ICs2OTYsOCBAQAogCW1lbWNweSgmc2NoLT5zY2hpYi5zY3N3LCAmaXJiLT5zY3N3LCBzaXplb2YodW5pb24gc2NzdykpOwogCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+aXJxKQogCQlzY2gtPmRyaXZlci0+aXJxKHNjaCk7CisJZWxzZQorCQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX0NJT10rKzsKIAlzcGluX3VubG9jayhzY2gtPmxvY2spOwogCWlycV9leGl0KCk7CiAJaWYgKCFpcnFfY29udGV4dCkKQEAgLTEwNTgsNyArMTA2OSw3IEBACiB7CiAJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CiAKLQlzMzkwX3Jlc2V0X3N5c3RlbSgpOworCXMzOTBfcmVzZXRfc3lzdGVtKE5VTEwsIE5VTEwpOwogCWlmIChyZWlwbF9maW5kX3NjaGlkKGRldmlkLCAmc2NoaWQpICE9IDApCiAJCXBhbmljKCJJUEwgRGV2aWNlIG5vdCBmb3VuZFxuIik7CiAJZG9fcmVpcGxfYXNtKCooKF9fdTMyKikmc2NoaWQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCmluZGV4IDgwZWJkZGQuLjMzYmI0ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaApAQCAtMTMzLDYgKzEzMyw4IEBACiAKIGV4dGVybiBzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0gKmNoYW5uZWxfc3Vic3lzdGVtc1tdOwogCit2b2lkIGNoYW5uZWxfc3Vic3lzdGVtX3JlaW5pdCh2b2lkKTsKKwogLyogSGVscGVyIGZ1bmN0aW9ucyB0byBidWlsZCBsaXN0cyBmb3IgdGhlIHNsb3cgcGF0aC4gKi8KIHZvaWQgY3NzX3NjaGVkdWxlX2V2YWwoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQpOwogdm9pZCBjc3Nfc2NoZWR1bGVfZXZhbF9hbGwodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwppbmRleCA4ZTA0YzAwLi5kNzM0ZjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2Npby5oPgpAQCAtNzQ3LDYgKzc0OCw3IEBACiAJCQkJCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewogCWNkZXYtPnByaXZhdGUtPmNkZXYgPSBjZGV2OworCWNkZXYtPnByaXZhdGUtPmludF9jbGFzcyA9IElPSU5UX0NJTzsKIAlhdG9taWNfc2V0KCZjZGV2LT5wcml2YXRlLT5vbm9mZiwgMCk7CiAJY2Rldi0+ZGV2LnBhcmVudCA9ICZzY2gtPmRldjsKIAljZGV2LT5kZXYucmVsZWFzZSA9IGNjd19kZXZpY2VfcmVsZWFzZTsKQEAgLTEwMTAsNiArMTAxMiw4IEBACiAJQ0lPX1RSQUNFX0VWRU5UKDYsIGRldl9uYW1lKCZzY2gtPmRldikpOwogCWlmIChjZGV2KQogCQlkZXZfZnNtX2V2ZW50KGNkZXYsIERFVl9FVkVOVF9JTlRFUlJVUFQpOworCWVsc2UKKwkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9DSU9dKys7CiB9CiAKIHZvaWQgaW9fc3ViY2hhbm5lbF9pbml0X2NvbmZpZyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQpAQCAtMTYyMSw2ICsxNjI1LDcgQEAKIAltZW1zZXQoJmNvbnNvbGVfcHJpdmF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUpKTsKIAljb25zb2xlX2NkZXYucHJpdmF0ZSA9ICZjb25zb2xlX3ByaXZhdGU7CiAJY29uc29sZV9wcml2YXRlLmNkZXYgPSAmY29uc29sZV9jZGV2OworCWNvbnNvbGVfcHJpdmF0ZS5pbnRfY2xhc3MgPSBJT0lOVF9DSU87CiAJcmV0ID0gY2N3X2RldmljZV9jb25zb2xlX2VuYWJsZSgmY29uc29sZV9jZGV2LCBzY2gpOwogCWlmIChyZXQpIHsKIAkJY2lvX3JlbGVhc2VfY29uc29sZSgpOwpAQCAtMTcwMiwxMSArMTcwNywxOCBAQAogCWludCByZXQ7CiAKIAljZGV2LT5kcnYgPSBjZHJ2OyAvKiB0byBsZXQgdGhlIGRyaXZlciBjYWxsIF9zZXRfb25saW5lICovCisJLyogTm90ZTogd2UgaW50ZXJwcmV0IGNsYXNzIDAgaW4gdGhpcyBjb250ZXh0IGFzIGFuIHVuaW5pdGlhbGl6ZWQKKwkgKiBmaWVsZCBzaW5jZSBpdCB0cmFuc2xhdGVzIHRvIGEgbm9uLUkvTyBpbnRlcnJ1cHQgY2xhc3MuICovCisJaWYgKGNkcnYtPmludF9jbGFzcyAhPSAwKQorCQljZGV2LT5wcml2YXRlLT5pbnRfY2xhc3MgPSBjZHJ2LT5pbnRfY2xhc3M7CisJZWxzZQorCQljZGV2LT5wcml2YXRlLT5pbnRfY2xhc3MgPSBJT0lOVF9DSU87CiAKIAlyZXQgPSBjZHJ2LT5wcm9iZSA/IGNkcnYtPnByb2JlKGNkZXYpIDogLUVOT0RFVjsKIAogCWlmIChyZXQpIHsKIAkJY2Rldi0+ZHJ2ID0gTlVMTDsKKwkJY2Rldi0+cHJpdmF0ZS0+aW50X2NsYXNzID0gSU9JTlRfQ0lPOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTc0MCw2ICsxNzUyLDcgQEAKIAl9CiAJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAwKTsKIAljZGV2LT5kcnYgPSBOVUxMOworCWNkZXYtPnByaXZhdGUtPmludF9jbGFzcyA9IElPSU5UX0NJTzsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuaCBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmgKaW5kZXggMGI3MjQ1Yy4uMTc5ODI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSAiaW9fc2NoLmgiCiAKIC8qCkBAIC01Niw3ICs1NywxNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBkZXZfZnNtX2V2ZW50KHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBlbnVtIGRldl9ldmVudCBkZXZfZXZlbnQpCiB7Ci0JZGV2X2p1bXB0YWJsZVtjZGV2LT5wcml2YXRlLT5zdGF0ZV1bZGV2X2V2ZW50XShjZGV2LCBkZXZfZXZlbnQpOworCWludCBzdGF0ZSA9IGNkZXYtPnByaXZhdGUtPnN0YXRlOworCisJaWYgKGRldl9ldmVudCA9PSBERVZfRVZFTlRfSU5URVJSVVBUKSB7CisJCWlmIChzdGF0ZSA9PSBERVZfU1RBVEVfT05MSU5FKQorCQkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuCisJCQkJaXJxc1tjZGV2LT5wcml2YXRlLT5pbnRfY2xhc3NdKys7CisJCWVsc2UgaWYgKHN0YXRlICE9IERFVl9TVEFURV9DTUZDSEFOR0UgJiYKKwkJCSBzdGF0ZSAhPSBERVZfU1RBVEVfQ01GVVBEQVRFKQorCQkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9DSU9dKys7CisJfQorCWRldl9qdW1wdGFibGVbc3RhdGVdW2Rldl9ldmVudF0oY2RldiwgZGV2X2V2ZW50KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmggYi9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oCmluZGV4IGJhMzFhZDguLjJlYmI0OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9pb19zY2guaApAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zY2hpZC5oPgogI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSAiY3NzLmgiCiAjaW5jbHVkZSAib3JiLmgiCiAKQEAgLTE1Nyw2ICsxNTgsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgY21iX2xpc3Q7CS8qIGxpc3Qgb2YgbWVhc3VyZWQgZGV2aWNlcyAqLwogCXU2NCBjbWJfc3RhcnRfdGltZTsJCS8qIGNsb2NrIHZhbHVlIG9mIGNtYiByZXNldCAqLwogCXZvaWQgKmNtYl93YWl0OwkJCS8qIGRlZmVycmVkIGNtYiBlbmFibGUvZGlzYWJsZSAqLworCWVudW0gaW50ZXJydXB0aW9uX2NsYXNzIGludF9jbGFzczsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJzY2goc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaCBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCmluZGV4IDNkZDg2NDQuLmI5NjJmZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCkBAIC0xOCwxNCArMTgsNiBAQAogI2RlZmluZSBRRElPX0JVU1lfQklUX1JFVFJJRVMJCTEwMDAJCS8qID0gMTBzIHJldHJ5IHRpbWUgKi8KICNkZWZpbmUgUURJT19JTlBVVF9USFJFU0hPTEQJCSg1MDAgPDwgMTIpCS8qIDUwMCBtaWNyb3NlY29uZHMgKi8KIAotLyoKLSAqIGlmIGFuIGFzeW5jaHJvbm91cyBIaXBlclNvY2tldHMgcXVldWUgcnVucyBmdWxsLCB0aGUgMTAgc2Vjb25kcyB0aW1lciB3YWl0Ci0gKiB0aWxsIG5leHQgaW5pdGlhdGl2ZSB0byBnaXZlIHRyYW5zbWl0dGVkIHNrYnMgYmFjayB0byB0aGUgc3RhY2sgaXMgdG9vIGxvbmcuCi0gKiBUaGVyZWZvcmUgcG9sbGluZyBpcyBzdGFydGVkIGluIGNhc2Ugb2YgbXVsdGljYXN0IHF1ZXVlIGlzIGZpbGxlZCBtb3JlCi0gKiB0aGFuIDUwIHBlcmNlbnQuCi0gKi8KLSNkZWZpbmUgUURJT19JUURJT19QT0xMX0xWTAkJNjUJLyogSFMgbXVsdGljYXN0IHF1ZXVlICovCi0KIGVudW0gcWRpb19pcnFfc3RhdGVzIHsKIAlRRElPX0lSUV9TVEFURV9JTkFDVElWRSwKIAlRRElPX0lSUV9TVEFURV9FU1RBQkxJU0hFRCwKQEAgLTI5MCw2ICsyODIsOSBAQAogCS8qIGVycm9yIGNvbmRpdGlvbiBkdXJpbmcgYSBkYXRhIHRyYW5zZmVyICovCiAJdW5zaWduZWQgaW50IHFkaW9fZXJyb3I7CiAKKwkvKiBsYXN0IHNjYW4gb2YgdGhlIHF1ZXVlICovCisJdTY0IHRpbWVzdGFtcDsKKwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwogCXN0cnVjdCBxZGlvX3F1ZXVlX3BlcmZfc3RhdCBxX3N0YXRzOwogCkBAIC00MjMsMzEgKzQxOCw3IEBACiAjZGVmaW5lIHF1ZXVlX2lycXNfZGlzYWJsZWQocSkJCQlcCiAJKHRlc3RfYml0KFFESU9fUVVFVUVfSVJRU19ESVNBQkxFRCwgJnEtPnUuaW4ucXVldWVfaXJxX3N0YXRlKSAhPSAwKQogCi0jZGVmaW5lIFRJUURJT19TSEFSRURfSU5ECQk2MwotCi0vKiBkZXZpY2Ugc3RhdGUgY2hhbmdlIGluZGljYXRvcnMgKi8KLXN0cnVjdCBpbmRpY2F0b3JfdCB7Ci0JdTMyIGluZDsJLyogdTMyIGJlY2F1c2Ugb2YgY29tcGFyZS1hbmQtc3dhcCBwZXJmb3JtYW5jZSAqLwotCWF0b21pY190IGNvdW50OyAvKiB1c2UgY291bnQsIDAgb3IgMSBmb3Igbm9uLXNoYXJlZCBpbmRpY2F0b3JzICovCi19OwotCi1leHRlcm4gc3RydWN0IGluZGljYXRvcl90ICpxX2luZGljYXRvcnM7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGhhc19tdWx0aXBsZV9pbnFfb25fZHNjaShzdHJ1Y3QgcWRpb19pcnEgKmlycSkKLXsKLQlyZXR1cm4gaXJxLT5ucl9pbnB1dF9xcyA+IDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJlZmVyZW5jZXNfc2hhcmVkX2RzY2koc3RydWN0IHFkaW9faXJxICppcnEpCi17Ci0JcmV0dXJuIGlycS0+ZHNjaSA9PSAmcV9pbmRpY2F0b3JzW1RJUURJT19TSEFSRURfSU5EXS5pbmQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHNoYXJlZF9pbmQoc3RydWN0IHFkaW9fcSAqcSkKLXsKLQlzdHJ1Y3QgcWRpb19pcnEgKmkgPSBxLT5pcnFfcHRyOwotCXJldHVybiByZWZlcmVuY2VzX3NoYXJlZF9kc2NpKGkpIHx8IGhhc19tdWx0aXBsZV9pbnFfb25fZHNjaShpKTsKLX0KK2V4dGVybiB1NjQgbGFzdF9haV90aW1lOwogCiAvKiBwcm90b3R5cGVzIGZvciB0aGluIGludGVycnVwdCAqLwogdm9pZCBxZGlvX3NldHVwX3RoaW5pbnQoc3RydWN0IHFkaW9faXJxICppcnFfcHRyKTsKQEAgLTQ2MCw3ICs0MzEsOCBAQAogdm9pZCB0aXFkaW9fZnJlZV9tZW1vcnkodm9pZCk7CiBpbnQgdGlxZGlvX3JlZ2lzdGVyX3RoaW5pbnRzKHZvaWQpOwogdm9pZCB0aXFkaW9fdW5yZWdpc3Rlcl90aGluaW50cyh2b2lkKTsKLQordm9pZCBjbGVhcl9ub25zaGFyZWRfaW5kKHN0cnVjdCBxZGlvX2lycSAqKTsKK2ludCB0ZXN0X25vbnNoYXJlZF9pbmQoc3RydWN0IHFkaW9faXJxICopOwogCiAvKiBwcm90b3R5cGVzIGZvciBzZXR1cCAqLwogdm9pZCBxZGlvX2luYm91bmRfcHJvY2Vzc2luZyh1bnNpZ25lZCBsb25nIGRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX2RlYnVnLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYwppbmRleCBhYWY3ZjkzLi4yOTAyMWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYwpAQCAtNyw2ICs3LDggQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vZGVidWcuaD4KICNpbmNsdWRlICJxZGlvX2RlYnVnLmgiCiAjaW5jbHVkZSAicWRpby5oIgpAQCAtNTQsMTUgKzU2LDE3IEBACiAJaWYgKCFxKQogCQlyZXR1cm4gMDsKIAotCXNlcV9wcmludGYobSwgIkRTQ0k6ICVkICAgbnJfdXNlZDogJWRcbiIsCi0JCSAgICoodTMyICopcS0+aXJxX3B0ci0+ZHNjaSwgYXRvbWljX3JlYWQoJnEtPm5yX2J1Zl91c2VkKSk7Ci0Jc2VxX3ByaW50ZihtLCAiZnRjOiAlZCAgbGFzdF9tb3ZlOiAlZFxuIiwKKwlzZXFfcHJpbnRmKG0sICJUaW1lc3RhbXA6ICVMeCAgTGFzdCBBSTogJUx4XG4iLAorCQkgICBxLT50aW1lc3RhbXAsIGxhc3RfYWlfdGltZSk7CisJc2VxX3ByaW50ZihtLCAibnJfdXNlZDogJWQgIGZ0YzogJWQgIGxhc3RfbW92ZTogJWRcbiIsCisJCSAgIGF0b21pY19yZWFkKCZxLT5ucl9idWZfdXNlZCksCiAJCSAgIHEtPmZpcnN0X3RvX2NoZWNrLCBxLT5sYXN0X21vdmUpOwogCWlmIChxLT5pc19pbnB1dF9xKSB7CiAJCXNlcV9wcmludGYobSwgInBvbGxpbmc6ICVkICBhY2sgc3RhcnQ6ICVkICBhY2sgY291bnQ6ICVkXG4iLAogCQkJICAgcS0+dS5pbi5wb2xsaW5nLCBxLT51LmluLmFja19zdGFydCwKIAkJCSAgIHEtPnUuaW4uYWNrX2NvdW50KTsKLQkJc2VxX3ByaW50ZihtLCAiSVJRcyBkaXNhYmxlZDogJXVcbiIsCisJCXNlcV9wcmludGYobSwgIkRTQ0k6ICVkICAgSVJRcyBkaXNhYmxlZDogJXVcbiIsCisJCQkgICAqKHUzMiAqKXEtPmlycV9wdHItPmRzY2ksCiAJCQkgICB0ZXN0X2JpdChRRElPX1FVRVVFX0lSUVNfRElTQUJMRUQsCiAJCQkgICAmcS0+dS5pbi5xdWV1ZV9pcnFfc3RhdGUpKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYwppbmRleCA5YTEyMjI4Li4zZWY4ZDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vZGVidWcuaD4KICNpbmNsdWRlIDxhc20vcWRpby5oPgpAQCAtMTA1LDkgKzEwNCwxMiBAQAogCS8qIGFsbCBkb25lIG9yIG5leHQgYnVmZmVyIHN0YXRlIGRpZmZlcmVudCAqLwogCWlmIChjY3EgPT0gMCB8fCBjY3EgPT0gMzIpCiAJCXJldHVybiAwOwotCS8qIG5vdCBhbGwgYnVmZmVycyBwcm9jZXNzZWQgKi8KLQlpZiAoY2NxID09IDk2IHx8IGNjcSA9PSA5NykKKwkvKiBubyBidWZmZXIgcHJvY2Vzc2VkICovCisJaWYgKGNjcSA9PSA5NykKIAkJcmV0dXJuIDE7CisJLyogbm90IGFsbCBidWZmZXJzIHByb2Nlc3NlZCAqLworCWlmIChjY3EgPT0gOTYpCisJCXJldHVybiAyOwogCS8qIG5vdGlmeSBkZXZpY2VzIGltbWVkaWF0ZWx5ICovCiAJREJGX0VSUk9SKCIlNHggY2NxOiUzZCIsIFNDSF9OTyhxKSwgY2NxKTsKIAlyZXR1cm4gLUVJTzsKQEAgLTEyNywxMCArMTI5LDggQEAKIHN0YXRpYyBpbnQgcWRpb19kb19lcWJzKHN0cnVjdCBxZGlvX3EgKnEsIHVuc2lnbmVkIGNoYXIgKnN0YXRlLAogCQkJaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhdXRvX2FjaykKIHsKKwlpbnQgcmMsIHRtcF9jb3VudCA9IGNvdW50LCB0bXBfc3RhcnQgPSBzdGFydCwgbnIgPSBxLT5uciwgcmV0cmllZCA9IDA7CiAJdW5zaWduZWQgaW50IGNjcSA9IDA7Ci0JaW50IHRtcF9jb3VudCA9IGNvdW50LCB0bXBfc3RhcnQgPSBzdGFydDsKLQlpbnQgbnIgPSBxLT5ucjsKLQlpbnQgcmM7CiAKIAlCVUdfT04oIXEtPmlycV9wdHItPnNjaF90b2tlbik7CiAJcXBlcmZfaW5jKHEsIGVxYnMpOwpAQCAtMTQxLDI5ICsxNDEsMzQgQEAKIAljY3EgPSBkb19lcWJzKHEtPmlycV9wdHItPnNjaF90b2tlbiwgc3RhdGUsIG5yLCAmdG1wX3N0YXJ0LCAmdG1wX2NvdW50LAogCQkgICAgICBhdXRvX2Fjayk7CiAJcmMgPSBxZGlvX2NoZWNrX2NjcShxLCBjY3EpOwotCi0JLyogQXQgbGVhc3Qgb25lIGJ1ZmZlciB3YXMgcHJvY2Vzc2VkLCByZXR1cm4gYW5kIGV4dHJhY3QgdGhlIHJlbWFpbmluZwotCSAqIGJ1ZmZlcnMgbGF0ZXIuCi0JICovCi0JaWYgKChjY3EgPT0gOTYpICYmIChjb3VudCAhPSB0bXBfY291bnQpKSB7Ci0JCXFwZXJmX2luYyhxLCBlcWJzX3BhcnRpYWwpOwotCQlyZXR1cm4gKGNvdW50IC0gdG1wX2NvdW50KTsKLQl9CisJaWYgKCFyYykKKwkJcmV0dXJuIGNvdW50IC0gdG1wX2NvdW50OwogCiAJaWYgKHJjID09IDEpIHsKIAkJREJGX0RFVl9FVkVOVChEQkZfV0FSTiwgcS0+aXJxX3B0ciwgIkVRQlMgYWdhaW46JTJkIiwgY2NxKTsKIAkJZ290byBhZ2FpbjsKIAl9CiAKLQlpZiAocmMgPCAwKSB7Ci0JCURCRl9FUlJPUigiJTR4IEVRQlMgRVJST1IiLCBTQ0hfTk8ocSkpOwotCQlEQkZfRVJST1IoIiUzZCUzZCUyZCIsIGNvdW50LCB0bXBfY291bnQsIG5yKTsKLQkJcS0+aGFuZGxlcihxLT5pcnFfcHRyLT5jZGV2LAotCQkJICAgUURJT19FUlJPUl9BQ1RJVkFURV9DSEVDS19DT05ESVRJT04sCi0JCQkgICAwLCAtMSwgLTEsIHEtPmlycV9wdHItPmludF9wYXJtKTsKLQkJcmV0dXJuIDA7CisJaWYgKHJjID09IDIpIHsKKwkJQlVHX09OKHRtcF9jb3VudCA9PSBjb3VudCk7CisJCXFwZXJmX2luYyhxLCBlcWJzX3BhcnRpYWwpOworCQlEQkZfREVWX0VWRU5UKERCRl9XQVJOLCBxLT5pcnFfcHRyLCAiRVFCUyBwYXJ0OiUwMngiLAorCQkJdG1wX2NvdW50KTsKKwkJLyoKKwkJICogUmV0cnkgb25jZSwgaWYgdGhhdCBmYWlscyBiYWlsIG91dCBhbmQgcHJvY2VzcyB0aGUKKwkJICogZXh0cmFjdGVkIGJ1ZmZlcnMgYmVmb3JlIHRyeWluZyBhZ2Fpbi4KKwkJICovCisJCWlmICghcmV0cmllZCsrKQorCQkJZ290byBhZ2FpbjsKKwkJZWxzZQorCQkJcmV0dXJuIGNvdW50IC0gdG1wX2NvdW50OwogCX0KLQlyZXR1cm4gY291bnQgLSB0bXBfY291bnQ7CisKKwlEQkZfRVJST1IoIiU0eCBFUUJTIEVSUk9SIiwgU0NIX05PKHEpKTsKKwlEQkZfRVJST1IoIiUzZCUzZCUyZCIsIGNvdW50LCB0bXBfY291bnQsIG5yKTsKKwlxLT5oYW5kbGVyKHEtPmlycV9wdHItPmNkZXYsIFFESU9fRVJST1JfQUNUSVZBVEVfQ0hFQ0tfQ09ORElUSU9OLAorCQkgICAwLCAtMSwgLTEsIHEtPmlycV9wdHItPmludF9wYXJtKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xOTYsMjEgKzIwMSwyMiBAQAogYWdhaW46CiAJY2NxID0gZG9fc3FicyhxLT5pcnFfcHRyLT5zY2hfdG9rZW4sIHN0YXRlLCBuciwgJnRtcF9zdGFydCwgJnRtcF9jb3VudCk7CiAJcmMgPSBxZGlvX2NoZWNrX2NjcShxLCBjY3EpOwotCWlmIChyYyA9PSAxKSB7CisJaWYgKCFyYykgeworCQlXQVJOX09OKHRtcF9jb3VudCk7CisJCXJldHVybiBjb3VudCAtIHRtcF9jb3VudDsKKwl9CisKKwlpZiAocmMgPT0gMSB8fCByYyA9PSAyKSB7CiAJCURCRl9ERVZfRVZFTlQoREJGX0lORk8sIHEtPmlycV9wdHIsICJTUUJTIGFnYWluOiUyZCIsIGNjcSk7CiAJCXFwZXJmX2luYyhxLCBzcWJzX3BhcnRpYWwpOwogCQlnb3RvIGFnYWluOwogCX0KLQlpZiAocmMgPCAwKSB7Ci0JCURCRl9FUlJPUigiJTR4IFNRQlMgRVJST1IiLCBTQ0hfTk8ocSkpOwotCQlEQkZfRVJST1IoIiUzZCUzZCUyZCIsIGNvdW50LCB0bXBfY291bnQsIG5yKTsKLQkJcS0+aGFuZGxlcihxLT5pcnFfcHRyLT5jZGV2LAotCQkJICAgUURJT19FUlJPUl9BQ1RJVkFURV9DSEVDS19DT05ESVRJT04sCi0JCQkgICAwLCAtMSwgLTEsIHEtPmlycV9wdHItPmludF9wYXJtKTsKLQkJcmV0dXJuIDA7Ci0JfQotCVdBUk5fT04odG1wX2NvdW50KTsKLQlyZXR1cm4gY291bnQgLSB0bXBfY291bnQ7CisKKwlEQkZfRVJST1IoIiU0eCBTUUJTIEVSUk9SIiwgU0NIX05PKHEpKTsKKwlEQkZfRVJST1IoIiUzZCUzZCUyZCIsIGNvdW50LCB0bXBfY291bnQsIG5yKTsKKwlxLT5oYW5kbGVyKHEtPmlycV9wdHItPmNkZXYsIFFESU9fRVJST1JfQUNUSVZBVEVfQ0hFQ0tfQ09ORElUSU9OLAorCQkgICAwLCAtMSwgLTEsIHEtPmlycV9wdHItPmludF9wYXJtKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogcmV0dXJucyBudW1iZXIgb2YgZXhhbWluZWQgYnVmZmVycyBhbmQgdGhlaXIgY29tbW9uIHN0YXRlIGluICpzdGF0ZSAqLwpAQCAtMjc1LDcgKzI4MSw3IEBACiB9CiAKIC8qIHNldCBzbHNiIHN0YXRlcyB0byBpbml0aWFsIHN0YXRlICovCi12b2lkIHFkaW9faW5pdF9idWZfc3RhdGVzKHN0cnVjdCBxZGlvX2lycSAqaXJxX3B0cikKK3N0YXRpYyB2b2lkIHFkaW9faW5pdF9idWZfc3RhdGVzKHN0cnVjdCBxZGlvX2lycSAqaXJxX3B0cikKIHsKIAlzdHJ1Y3QgcWRpb19xICpxOwogCWludCBpOwpAQCAtNDQ0LDcgKzQ1MCw3IEBACiAJCXFwZXJmX2luYyhxLCB0YXJnZXRfZnVsbCk7CiAJCURCRl9ERVZfRVZFTlQoREJGX0lORk8sIHEtPmlycV9wdHIsICJPVVRGVUxMIEZUQzolMDJ4IiwKIAkJCSAgICAgIHEtPmZpcnN0X3RvX2NoZWNrKTsKLQkJcmV0dXJuOworCQlnb3RvIHNldDsKIAl9CiAKIAlEQkZfRVJST1IoIiU0eCBCVUYgRVJST1IiLCBTQ0hfTk8ocSkpOwpAQCAtNDU0LDYgKzQ2MCw3IEBACiAJCSAgcS0+c2JhbFtxLT5maXJzdF90b19jaGVja10tPmVsZW1lbnRbMTRdLnNmbGFncywKIAkJICBxLT5zYmFsW3EtPmZpcnN0X3RvX2NoZWNrXS0+ZWxlbWVudFsxNV0uc2ZsYWdzKTsKIAorc2V0OgogCS8qCiAJICogSW50ZXJydXB0cyBtYXkgYmUgYXZvaWRlZCBhcyBsb25nIGFzIHRoZSBlcnJvciBpcyBwcmVzZW50CiAJICogc28gY2hhbmdlIHRoZSBidWZmZXIgc3RhdGUgaW1tZWRpYXRlbHkgdG8gYXZvaWQgc3RhcnZhdGlvbi4KQEAgLTUxMSw2ICs1MTgsOCBAQAogCWludCBjb3VudCwgc3RvcDsKIAl1bnNpZ25lZCBjaGFyIHN0YXRlID0gMDsKIAorCXEtPnRpbWVzdGFtcCA9IGdldF9jbG9ja19mYXN0KCk7CisKIAkvKgogCSAqIERvbid0IGNoZWNrIDEyOCBidWZmZXJzLCBhcyBvdGhlcndpc2UgcWRpb19pbmJvdW5kX3FfbW92ZWQKIAkgKiB3b3VsZCByZXR1cm4gMC4KQEAgLTc4MCw2ICs3ODksOCBAQAogCWludCBjb3VudCwgc3RvcDsKIAl1bnNpZ25lZCBjaGFyIHN0YXRlID0gMDsKIAorCXEtPnRpbWVzdGFtcCA9IGdldF9jbG9ja19mYXN0KCk7CisKIAlpZiAobmVlZF9zaWdhX3N5bmMocSkpCiAJCWlmICgoKHF1ZXVlX3R5cGUocSkgIT0gUURJT19JUURJT19RRk1UKSAmJgogCQkgICAgIXBjaV9vdXRfc3VwcG9ydGVkKHEpKSB8fApAQCAtOTEwLDIxICs5MjEsMTMgQEAKIAkJaWYgKCFwY2lfb3V0X3N1cHBvcnRlZChxKSAmJiAhcWRpb19vdXRib3VuZF9xX2RvbmUocSkpCiAJCQlnb3RvIHNjaGVkOwogCi0JLyogYmFpbCBvdXQgZm9yIEhpcGVyU29ja2V0cyB1bmljYXN0IHF1ZXVlcyAqLwotCWlmIChxdWV1ZV90eXBlKHEpID09IFFESU9fSVFESU9fUUZNVCAmJiAhbXVsdGljYXN0X291dGJvdW5kKHEpKQotCQlyZXR1cm47Ci0KLQlpZiAoKHF1ZXVlX3R5cGUocSkgPT0gUURJT19JUURJT19RRk1UKSAmJgotCSAgICAoYXRvbWljX3JlYWQoJnEtPm5yX2J1Zl91c2VkKSkgPiBRRElPX0lRRElPX1BPTExfTFZMKQotCQlnb3RvIHNjaGVkOwotCiAJaWYgKHEtPnUub3V0LnBjaV9vdXRfZW5hYmxlZCkKIAkJcmV0dXJuOwogCiAJLyoKIAkgKiBOb3cgd2Uga25vdyB0aGF0IHF1ZXVlIHR5cGUgaXMgZWl0aGVyIHFldGggd2l0aG91dCBwY2kgZW5hYmxlZAotCSAqIG9yIEhpcGVyU29ja2V0cyBtdWx0aWNhc3QuIE1ha2Ugc3VyZSBidWZmZXIgc3dpdGNoIGZyb20gUFJJTUVEIHRvCi0JICogRU1QVFkgaXMgbm90aWNlZCBhbmQgb3V0Ym91bmRfaGFuZGxlciBpcyBjYWxsZWQgYWZ0ZXIgc29tZSB0aW1lLgorCSAqIG9yIEhpcGVyU29ja2V0cy4gTWFrZSBzdXJlIGJ1ZmZlciBzd2l0Y2ggZnJvbSBQUklNRUQgdG8gRU1QVFkKKwkgKiBpcyBub3RpY2VkIGFuZCBvdXRib3VuZF9oYW5kbGVyIGlzIGNhbGxlZCBhZnRlciBzb21lIHRpbWUuCiAJICovCiAJaWYgKHFkaW9fb3V0Ym91bmRfcV9kb25lKHEpKQogCQlkZWxfdGltZXIoJnEtPnUub3V0LnRpbWVyKTsKQEAgLTEwNzAsNiArMTA3Myw3IEBACiB7CiAJc3RydWN0IHFkaW9faXJxICppcnFfcHRyID0gY2Rldi0+cHJpdmF0ZS0+cWRpb19kYXRhOwogCXN0cnVjdCBxZGlvX3EgKnE7CisJaW50IGNvdW50OwogCiAJREJGX0VSUk9SKCIlNHggQUNUIENIRUNLIiwgaXJxX3B0ci0+c2NoaWQuc2NoX25vKTsKIAlEQkZfRVJST1IoImludHAgOiVseCIsIGludHBhcm0pOwpAQCAtMTA4Myw4ICsxMDg3LDEwIEBACiAJCWR1bXBfc3RhY2soKTsKIAkJZ290byBub19oYW5kbGVyOwogCX0KKworCWNvdW50ID0gc3ViX2J1ZihxLT5maXJzdF90b19jaGVjaywgcS0+Zmlyc3RfdG9fa2ljayk7CiAJcS0+aGFuZGxlcihxLT5pcnFfcHRyLT5jZGV2LCBRRElPX0VSUk9SX0FDVElWQVRFX0NIRUNLX0NPTkRJVElPTiwKLQkJICAgMCwgLTEsIC0xLCBpcnFfcHRyLT5pbnRfcGFybSk7CisJCSAgIHEtPm5yLCBxLT5maXJzdF90b19raWNrLCBjb3VudCwgaXJxX3B0ci0+aW50X3Bhcm0pOwogbm9faGFuZGxlcjoKIAlxZGlvX3NldF9zdGF0ZShpcnFfcHRyLCBRRElPX0lSUV9TVEFURV9TVE9QUEVEKTsKIH0KQEAgLTExMjMsNyArMTEyOSw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX1FESV0rKzsKIAlpZiAoaXJxX3B0ci0+cGVyZl9zdGF0X2VuYWJsZWQpCiAJCWlycV9wdHItPnBlcmZfc3RhdC5xZGlvX2ludCsrOwogCkBAIC0xNzE0LDkgKzE3MTksNyBAQAogCiAJV0FSTl9PTihxdWV1ZV9pcnFzX2VuYWJsZWQocSkpOwogCi0JaWYgKCFzaGFyZWRfaW5kKHEpKQotCQl4Y2hnKHEtPmlycV9wdHItPmRzY2ksIDApOwotCisJY2xlYXJfbm9uc2hhcmVkX2luZChpcnFfcHRyKTsKIAlxZGlvX3N0b3BfcG9sbGluZyhxKTsKIAljbGVhcl9iaXQoUURJT19RVUVVRV9JUlFTX0RJU0FCTEVELCAmcS0+dS5pbi5xdWV1ZV9pcnFfc3RhdGUpOwogCkBAIC0xNzI0LDcgKzE3MjcsNyBAQAogCSAqIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gdG8gbm90IGxvc2UgaW5pdGlhdGl2ZSBhZnRlcgogCSAqIHJlc2V0dGluZyB0aGUgQUNLIHN0YXRlLgogCSAqLwotCWlmICghc2hhcmVkX2luZChxKSAmJiAqcS0+aXJxX3B0ci0+ZHNjaSkKKwlpZiAodGVzdF9ub25zaGFyZWRfaW5kKGlycV9wdHIpKQogCQlnb3RvIHJlc2NhbjsKIAlpZiAoIXFkaW9faW5ib3VuZF9xX2RvbmUocSkpCiAJCWdvdG8gcmVzY2FuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX3NldHVwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fc2V0dXAuYwppbmRleCBkZDhiZDY3Li4yYWNjMDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fc2V0dXAuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fc2V0dXAuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcWRpby5oPgogCiAjaW5jbHVkZSAiY2lvLmgiCkBAIC0zODEsNiArMzgyLDcgQEAKIAlpbnQgaTsKIAogCWlycV9wdHItPnFkci0+cWZtdCA9IHFkaW9faW5pdC0+cV9mb3JtYXQ7CisJaXJxX3B0ci0+cWRyLT5hYyA9IHFkaW9faW5pdC0+cWRyX2FjOwogCWlycV9wdHItPnFkci0+aXFkY250ID0gcWRpb19pbml0LT5ub19pbnB1dF9xczsKIAlpcnFfcHRyLT5xZHItPm9xZGNudCA9IHFkaW9faW5pdC0+bm9fb3V0cHV0X3FzOwogCWlycV9wdHItPnFkci0+aXFkc3ogPSBzaXplb2Yoc3RydWN0IHFkZXNmbXQwKSAvIDQ7IC8qIHNpemUgaW4gd29yZHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb190aGluaW50LmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fdGhpbmludC5jCmluZGV4IGEzZTM5NDkuLjAxMWVhZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb190aGluaW50LmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX3RoaW5pbnQuYwpAQCAtMjYsMTcgKzI2LDI0IEBACiAgKi8KICNkZWZpbmUgVElRRElPX05SX05PTlNIQVJFRF9JTkQJCTYzCiAjZGVmaW5lIFRJUURJT19OUl9JTkRJQ0FUT1JTCQkoVElRRElPX05SX05PTlNIQVJFRF9JTkQgKyAxKQorI2RlZmluZSBUSVFESU9fU0hBUkVEX0lORAkJNjMKKworLyogZGV2aWNlIHN0YXRlIGNoYW5nZSBpbmRpY2F0b3JzICovCitzdHJ1Y3QgaW5kaWNhdG9yX3QgeworCXUzMiBpbmQ7CS8qIHUzMiBiZWNhdXNlIG9mIGNvbXBhcmUtYW5kLXN3YXAgcGVyZm9ybWFuY2UgKi8KKwlhdG9taWNfdCBjb3VudDsgLyogdXNlIGNvdW50LCAwIG9yIDEgZm9yIG5vbi1zaGFyZWQgaW5kaWNhdG9ycyAqLworfTsKIAogLyogbGlzdCBvZiB0aGluIGludGVycnVwdCBpbnB1dCBxdWV1ZXMgKi8KIHN0YXRpYyBMSVNUX0hFQUQodGlxX2xpc3QpOwotREVGSU5FX01VVEVYKHRpcV9saXN0X2xvY2spOworc3RhdGljIERFRklORV9NVVRFWCh0aXFfbGlzdF9sb2NrKTsKIAogLyogYWRhcHRlciBsb2NhbCBzdW1tYXJ5IGluZGljYXRvciAqLwogc3RhdGljIHU4ICp0aXFkaW9fYWxzaTsKIAotc3RydWN0IGluZGljYXRvcl90ICpxX2luZGljYXRvcnM7CitzdGF0aWMgc3RydWN0IGluZGljYXRvcl90ICpxX2luZGljYXRvcnM7CiAKLXN0YXRpYyB1NjQgbGFzdF9haV90aW1lOwordTY0IGxhc3RfYWlfdGltZTsKIAogLyogcmV0dXJucyBhZGRyIGZvciB0aGUgZGV2aWNlIHN0YXRlIGNoYW5nZSBpbmRpY2F0b3IgKi8KIHN0YXRpYyB1MzIgKmdldF9pbmRpY2F0b3Iodm9pZCkKQEAgLTkwLDYgKzk3LDQzIEBACiAJc3luY2hyb25pemVfcmN1KCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGhhc19tdWx0aXBsZV9pbnFfb25fZHNjaShzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIpCit7CisJcmV0dXJuIGlycV9wdHItPm5yX2lucHV0X3FzID4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVmZXJlbmNlc19zaGFyZWRfZHNjaShzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIpCit7CisJcmV0dXJuIGlycV9wdHItPmRzY2kgPT0gJnFfaW5kaWNhdG9yc1tUSVFESU9fU0hBUkVEX0lORF0uaW5kOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaGFyZWRfaW5kKHN0cnVjdCBxZGlvX2lycSAqaXJxX3B0cikKK3sKKwlyZXR1cm4gcmVmZXJlbmNlc19zaGFyZWRfZHNjaShpcnFfcHRyKSB8fAorCQloYXNfbXVsdGlwbGVfaW5xX29uX2RzY2koaXJxX3B0cik7Cit9CisKK3ZvaWQgY2xlYXJfbm9uc2hhcmVkX2luZChzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIpCit7CisJaWYgKCFpc190aGluaW50X2lycShpcnFfcHRyKSkKKwkJcmV0dXJuOworCWlmIChzaGFyZWRfaW5kKGlycV9wdHIpKQorCQlyZXR1cm47CisJeGNoZyhpcnFfcHRyLT5kc2NpLCAwKTsKK30KKworaW50IHRlc3Rfbm9uc2hhcmVkX2luZChzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIpCit7CisJaWYgKCFpc190aGluaW50X2lycShpcnFfcHRyKSkKKwkJcmV0dXJuIDA7CisJaWYgKHNoYXJlZF9pbmQoaXJxX3B0cikpCisJCXJldHVybiAwOworCWlmICgqaXJxX3B0ci0+ZHNjaSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSB1MzIgY2xlYXJfc2hhcmVkX2luZCh2b2lkKQogewogCWlmICghYXRvbWljX3JlYWQoJnFfaW5kaWNhdG9yc1tUSVFESU9fU0hBUkVEX0lORF0uY291bnQpKQpAQCAtMTE5LDcgKzE2Myw3IEBACiAJCQlxLT51LmluLnF1ZXVlX3N0YXJ0X3BvbGwocS0+aXJxX3B0ci0+Y2RldiwgcS0+bnIsCiAJCQkJCQkgcS0+aXJxX3B0ci0+aW50X3Bhcm0pOwogCQl9IGVsc2UgewotCQkJaWYgKCFzaGFyZWRfaW5kKHEpKQorCQkJaWYgKCFzaGFyZWRfaW5kKHEtPmlycV9wdHIpKQogCQkJCXhjaGcocS0+aXJxX3B0ci0+ZHNjaSwgMCk7CiAKIAkJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYyBiL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCmluZGV4IGFlYzYwZDUuLjk0ZjQ5ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCisrKyBiL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fcmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9rdm1fcGFyYS5oPgpAQCAtMzMsNyArMzQsNyBAQAogICogVGhlIHBvaW50ZXIgdG8gb3VyIChwYWdlKSBvZiBkZXZpY2UgZGVzY3JpcHRpb25zLgogICovCiBzdGF0aWMgdm9pZCAqa3ZtX2RldmljZXM7Ci1zdHJ1Y3Qgd29ya19zdHJ1Y3QgaG90cGx1Z193b3JrOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBob3RwbHVnX3dvcms7CiAKIHN0cnVjdCBrdm1fZGV2aWNlIHsKIAlzdHJ1Y3QgdmlydGlvX2RldmljZSB2ZGV2OwpAQCAtMzM0LDEwICszMzUsMTAgQEAKICAqLwogc3RhdGljIGludCBtYXRjaF9kZXNjKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKLQlpZiAoKHVsb25nKXRvX2t2bWRldihkZXZfdG9fdmlydGlvKGRldikpLT5kZXNjID09ICh1bG9uZylkYXRhKQotCQlyZXR1cm4gMTsKKwlzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiA9IGRldl90b192aXJ0aW8oZGV2KTsKKwlzdHJ1Y3Qga3ZtX2RldmljZSAqa2RldiA9IHRvX2t2bWRldih2ZGV2KTsKIAotCXJldHVybiAwOworCXJldHVybiBrZGV2LT5kZXNjID09IGRhdGE7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYyBiL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCmluZGV4IGYxZmEyNDguLmI0MWZhZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCkBAIC02Myw3ICs2Myw2IEBACiAKICNkZWZpbmUgS01TR19DT01QT05FTlQgImNsYXciCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KICNpbmNsdWRlIDxhc20vY2N3Z3JvdXAuaD4KICNpbmNsdWRlIDxhc20vZGVidWcuaD4KQEAgLTI5MSw2ICsyOTAsNyBAQAogCS5pZHMJPSBjbGF3X2lkcywKIAkucHJvYmUJPSBjY3dncm91cF9wcm9iZV9jY3dkZXYsCiAJLnJlbW92ZQk9IGNjd2dyb3VwX3JlbW92ZV9jY3dkZXYsCisJLmludF9jbGFzcyA9IElPSU5UX0NMVywKIH07CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC02NDUsNyArNjQ1LDYgQEAKICAgICAgICAgc3RydWN0IGNsYXdfZW52ICAqcF9lbnY7CiAgICAgICAgIHN0cnVjdCBjaGJrICpwX2NoX3I9TlVMTDsKIAotCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQ0xXXSsrOwogCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJjbGF3aXJxIik7CiAgICAgICAgIC8qIEJ5cGFzcyBhbGwgJ3Vuc29saWNpdGVkIGludGVycnVwdHMnICovCiAJcHJpdnB0ciA9IGRldl9nZXRfZHJ2ZGF0YSgmY2Rldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y21fbWFpbi5jCmluZGV4IDQyNjc4N2UuLjVjYjkzYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX21haW4uYwpAQCAtMjQsNyArMjQsNiBAQAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAiY3RjbSIKICNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTIwMyw3ICsxMjAyLDYgQEAKIAlpbnQgY3N0YXQ7CiAJaW50IGRzdGF0OwogCi0Ja3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9DVENdKys7CiAJQ1RDTV9EQkZfVEVYVF8oVFJBQ0UsIENUQ19EQkZfREVCVUcsCiAJCSJFbnRlciAlcyglcykiLCBDVENNX0ZVTlRBSUwsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIApAQCAtMTc2OSw2ICsxNzY3LDcgQEAKIAkuaWRzCT0gY3RjbV9pZHMsCiAJLnByb2JlCT0gY2N3Z3JvdXBfcHJvYmVfY2N3ZGV2LAogCS5yZW1vdmUJPSBjY3dncm91cF9yZW1vdmVfY2N3ZGV2LAorCS5pbnRfY2xhc3MgPSBJT0lOVF9DVEMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNjd2dyb3VwX2RyaXZlciBjdGNtX2dyb3VwX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9zeXNmcy5jIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX3N5c2ZzLmMKaW5kZXggODMwNTMxOS4uNjUwYWVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jdGNtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX3N5c2ZzLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotY29uc3QgY2hhciAqY3RjbV90eXBlW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqY3RjbV90eXBlW10gPSB7CiAJIm5vdCBhIGNoYW5uZWwiLAogCSJDVEMvQSIsCiAJIkZJQ09OIGNoYW5uZWwiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9sY3MuYyBiL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKaW5kZXggZmIyNDZiOTQuLmMyODcxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9sY3MuYwpAQCAtMjYsNyArMjYsNiBAQAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVAkJImxjcyIKICNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaWYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KQEAgLTEzOTksNyArMTM5OCw2IEBACiAJaW50IHJjLCBpbmRleDsKIAlpbnQgY3N0YXQsIGRzdGF0OwogCi0Ja3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9MQ1NdKys7CiAJaWYgKGxjc19jaGVja19pcmJfZXJyb3IoY2RldiwgaXJiKSkKIAkJcmV0dXJuOwogCkBAIC0xOTcyLDcgKzE5NzAsNyBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIocG9ydG5vLCAwNjQ0LCBsY3NfcG9ydG5vX3Nob3csIGxjc19wb3J0bm9fc3RvcmUpOwogCi1jb25zdCBjaGFyICpsY3NfdHlwZVtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKmxjc190eXBlW10gPSB7CiAJIm5vdCBhIGNoYW5uZWwiLAogCSIyMjE2IHBhcmFsbGVsIiwKIAkiMjIxNiBjaGFubmVsIiwKQEAgLTIzOTksNiArMjM5Nyw3IEBACiAJLmlkcwk9IGxjc19pZHMsCiAJLnByb2JlCT0gY2N3Z3JvdXBfcHJvYmVfY2N3ZGV2LAogCS5yZW1vdmUJPSBjY3dncm91cF9yZW1vdmVfY2N3ZGV2LAorCS5pbnRfY2xhc3MgPSBJT0lOVF9MQ1MsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCmluZGV4IGNlNzM1MjAuLmU0YzExNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwpAQCAtMTQxNSw3ICsxNDE1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHFldGhfbDNfc2V0X3J4X2NzdW0oc3RydWN0IHFldGhfY2FyZCAqY2FyZCwgaW50IG9uKQorc3RhdGljIGludCBxZXRoX2wzX3NldF9yeF9jc3VtKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsIGludCBvbikKIHsKIAlpbnQgcmMgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYwppbmRleCA2NDViMGZjLi4wODYwMTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiemZjcF9leHQuaCIKICNpbmNsdWRlICJ6ZmNwX2ZjLmgiCiAjaW5jbHVkZSAiemZjcF9yZXFsaXN0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2Njdy5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jY3cuYwppbmRleCBlOGI3Y2VlLi45NmYxM2FkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jY3cuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2Njdy5jCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAiemZjcCIKICNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInpmY3BfZXh0LmgiCiAjaW5jbHVkZSAiemZjcF9yZXFsaXN0LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jCmluZGV4IDk2ZDE0NjIuLmE5YTgxNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuYwpAQCAtOSw2ICs5LDcgQEAKICNkZWZpbmUgS01TR19DT01QT05FTlQgInpmY3AiCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vZGVidWcuaD4KQEAgLTE2Myw2ICsxNjQsNDIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYmYtPmhiYV9sb2NrLCBmbGFncyk7CiB9CiAKKy8qKgorICogemZjcF9kYmZfaGJhX2RlZl9lcnIgLSB0cmFjZSBldmVudCBmb3IgZGVmZXJyZWQgZXJyb3IgbWVzc2FnZXMKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIHN0cnVjdCB6ZmNwX2FkYXB0ZXIKKyAqIEByZXFfaWQ6IHJlcXVlc3QgaWQgd2hpY2ggY2F1c2VkIHRoZSBkZWZlcnJlZCBlcnJvciBtZXNzYWdlCisgKiBAc2NvdW50OiBudW1iZXIgb2Ygc2JhbHMgaW5jbC4gdGhlIHNpZ25hbGluZyBzYmFsCisgKiBAcGw6IGFycmF5IG9mIGFsbCBpbnZvbHZlZCBzYmFscworICovCit2b2lkIHpmY3BfZGJmX2hiYV9kZWZfZXJyKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCByZXFfaWQsIHUxNiBzY291bnQsCisJCQkgIHZvaWQgKipwbCkKK3sKKwlzdHJ1Y3QgemZjcF9kYmYgKmRiZiA9IGFkYXB0ZXItPmRiZjsKKwlzdHJ1Y3QgemZjcF9kYmZfcGF5ICpwYXlsb2FkID0gJmRiZi0+cGF5X2J1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBsZW5ndGg7CisKKwlpZiAoIXBsKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGJmLT5wYXlfbG9jaywgZmxhZ3MpOworCW1lbXNldChwYXlsb2FkLCAwLCBzaXplb2YoKnBheWxvYWQpKTsKKworCW1lbWNweShwYXlsb2FkLT5hcmVhLCAiZGVmX2VyciIsIDcpOworCXBheWxvYWQtPmZzZl9yZXFfaWQgPSByZXFfaWQ7CisJcGF5bG9hZC0+Y291bnRlciA9IDA7CisJbGVuZ3RoID0gbWluKCh1MTYpc2l6ZW9mKHN0cnVjdCBxZGlvX2J1ZmZlciksCisJCSAgICAgKHUxNilaRkNQX0RCRl9QQVlfTUFYX1JFQyk7CisKKwl3aGlsZSAoKGNoYXIgKilwbFtwYXlsb2FkLT5jb3VudGVyXSAmJiBwYXlsb2FkLT5jb3VudGVyIDwgc2NvdW50KSB7CisJCW1lbWNweShwYXlsb2FkLT5kYXRhLCAoY2hhciAqKXBsW3BheWxvYWQtPmNvdW50ZXJdLCBsZW5ndGgpOworCQlkZWJ1Z19ldmVudChkYmYtPnBheSwgMSwgcGF5bG9hZCwgemZjcF9kYmZfcGxlbihsZW5ndGgpKTsKKwkJcGF5bG9hZC0+Y291bnRlcisrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiZi0+cGF5X2xvY2ssIGZsYWdzKTsKK30KKwogc3RhdGljIHZvaWQgemZjcF9kYmZfc2V0X2NvbW1vbihzdHJ1Y3QgemZjcF9kYmZfcmVjICpyZWMsCiAJCQkJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciwKIAkJCQlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKaW5kZXggNTI3YmE0OC4uZWQ1ZDkyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCkBAIC03Miw2ICs3Miw3IEBACiAjZGVmaW5lIFpGQ1BfU1RBVFVTX0NPTU1PTl9OT0VTQwkJMHgwMDIwMDAwMAogCiAvKiBhZGFwdGVyIHN0YXR1cyAqLworI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX01CX0FDVAkJMHgwMDAwMDAwMQogI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX1FESU9VUAkJMHgwMDAwMDAwMgogI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX1NJT1NMX0lTU1VFRAkweDAwMDAwMDA0CiAjZGVmaW5lIFpGQ1BfU1RBVFVTX0FEQVBURVJfWENPTkZJR19PSwkJMHgwMDAwMDAwOApAQCAtMzE0LDQgKzMxNSwxMCBAQAogCXZvaWQJCQkoKmhhbmRsZXIpKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CiB9OwogCitzdGF0aWMgaW5saW5lCitpbnQgemZjcF9hZGFwdGVyX211bHRpX2J1ZmZlcl9hY3RpdmUoc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19BREFQVEVSX01CX0FDVDsKK30KKwogI2VuZGlmIC8qIFpGQ1BfREVGX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXh0LmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oCmluZGV4IDAzNjI3Y2ZkLi4yMzAyZTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXh0LmgKQEAgLTUzLDYgKzUzLDcgQEAKIGV4dGVybiB2b2lkIHpmY3BfZGJmX2hiYV9mc2ZfcmVzKGNoYXIgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZGJmX2hiYV9iaXRfZXJyKGNoYXIgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZGJmX2hiYV9iZXJyKHN0cnVjdCB6ZmNwX2RiZiAqLCBzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOworZXh0ZXJuIHZvaWQgemZjcF9kYmZfaGJhX2RlZl9lcnIoc3RydWN0IHpmY3BfYWRhcHRlciAqLCB1NjQsIHUxNiwgdm9pZCAqKik7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9zYW5fcmVxKGNoYXIgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqLCB1MzIpOwogZXh0ZXJuIHZvaWQgemZjcF9kYmZfc2FuX3JlcyhjaGFyICosIHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9zYW5faW5fZWxzKGNoYXIgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCmluZGV4IDAyMmZiNmEuLmU5YTc4N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYwpAQCAtOTM2LDM5ICs5MzYsNDcgQEAKIAkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19yZXNwKQogewogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSByZXEtPmFkYXB0ZXI7CisJc3RydWN0IHpmY3BfcWRpbyAqcWRpbyA9IGFkYXB0ZXItPnFkaW87CisJc3RydWN0IGZzZl9xdGNiICpxdGNiID0gcmVxLT5xdGNiOwogCXUzMiBmZWF0ID0gYWRhcHRlci0+YWRhcHRlcl9mZWF0dXJlczsKLQlpbnQgYnl0ZXM7CiAKLQlpZiAoIShmZWF0ICYgRlNGX0ZFQVRVUkVfRUxTX0NUX0NIQUlORURfU0JBTFMpKSB7Ci0JCWlmICghemZjcF9xZGlvX3NnX29uZV9zYmFsZShzZ19yZXEpIHx8Ci0JCSAgICAhemZjcF9xZGlvX3NnX29uZV9zYmFsZShzZ19yZXNwKSkKLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoemZjcF9hZGFwdGVyX211bHRpX2J1ZmZlcl9hY3RpdmUoYWRhcHRlcikpIHsKKwkJaWYgKHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLCBzZ19yZXEpKQorCQkJcmV0dXJuIC1FSU87CisJCWlmICh6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhxZGlvLCAmcmVxLT5xZGlvX3JlcSwgc2dfcmVzcCkpCisJCQlyZXR1cm4gLUVJTzsKIAotCQl6ZmNwX2ZzZl9zZXR1cF9jdF9lbHNfdW5jaGFpbmVkKGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxLAotCQkJCQkJc2dfcmVxLCBzZ19yZXNwKTsKKwkJemZjcF9xZGlvX3NldF9kYXRhX2RpdihxZGlvLCAmcmVxLT5xZGlvX3JlcSwKKwkJCQkJemZjcF9xZGlvX3NiYWxlX2NvdW50KHNnX3JlcSkpOworCQl6ZmNwX3FkaW9fc2V0X3NiYWxlX2xhc3QocWRpbywgJnJlcS0+cWRpb19yZXEpOworCQl6ZmNwX3FkaW9fc2V0X3Njb3VudChxZGlvLCAmcmVxLT5xZGlvX3JlcSk7CiAJCXJldHVybiAwOwogCX0KIAogCS8qIHVzZSBzaW5nbGUsIHVuY2hhaW5lZCBTQkFMIGlmIGl0IGNhbiBob2xkIHRoZSByZXF1ZXN0ICovCiAJaWYgKHpmY3BfcWRpb19zZ19vbmVfc2JhbGUoc2dfcmVxKSAmJiB6ZmNwX3FkaW9fc2dfb25lX3NiYWxlKHNnX3Jlc3ApKSB7Ci0JCXpmY3BfZnNmX3NldHVwX2N0X2Vsc191bmNoYWluZWQoYWRhcHRlci0+cWRpbywgJnJlcS0+cWRpb19yZXEsCisJCXpmY3BfZnNmX3NldHVwX2N0X2Vsc191bmNoYWluZWQocWRpbywgJnJlcS0+cWRpb19yZXEsCiAJCQkJCQlzZ19yZXEsIHNnX3Jlc3ApOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlieXRlcyA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxLCBzZ19yZXEpOwotCWlmIChieXRlcyA8PSAwKQotCQlyZXR1cm4gLUVJTzsKLQl6ZmNwX3FkaW9fc2V0X3NiYWxlX2xhc3QoYWRhcHRlci0+cWRpbywgJnJlcS0+cWRpb19yZXEpOwotCXJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQucmVxX2J1Zl9sZW5ndGggPSBieXRlczsKLQl6ZmNwX3FkaW9fc2tpcF90b19sYXN0X3NiYWxlKCZyZXEtPnFkaW9fcmVxKTsKKwlpZiAoIShmZWF0ICYgRlNGX0ZFQVRVUkVfRUxTX0NUX0NIQUlORURfU0JBTFMpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlieXRlcyA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxLAotCQkJCQlzZ19yZXNwKTsKLQlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnJlc3BfYnVmX2xlbmd0aCA9IGJ5dGVzOwotCWlmIChieXRlcyA8PSAwKQorCWlmICh6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhxZGlvLCAmcmVxLT5xZGlvX3JlcSwgc2dfcmVxKSkKIAkJcmV0dXJuIC1FSU87Ci0JemZjcF9xZGlvX3NldF9zYmFsZV9sYXN0KGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxKTsKKworCXF0Y2ItPmJvdHRvbS5zdXBwb3J0LnJlcV9idWZfbGVuZ3RoID0gemZjcF9xZGlvX3JlYWxfYnl0ZXMoc2dfcmVxKTsKKworCXpmY3BfcWRpb19zZXRfc2JhbGVfbGFzdChxZGlvLCAmcmVxLT5xZGlvX3JlcSk7CisJemZjcF9xZGlvX3NraXBfdG9fbGFzdF9zYmFsZShxZGlvLCAmcmVxLT5xZGlvX3JlcSk7CisKKwlpZiAoemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsIHNnX3Jlc3ApKQorCQlyZXR1cm4gLUVJTzsKKworCXF0Y2ItPmJvdHRvbS5zdXBwb3J0LnJlc3BfYnVmX2xlbmd0aCA9IHpmY3BfcWRpb19yZWFsX2J5dGVzKHNnX3Jlc3ApOworCisJemZjcF9xZGlvX3NldF9zYmFsZV9sYXN0KHFkaW8sICZyZXEtPnFkaW9fcmVxKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTExOSw3ICsxMTI3LDggQEAKIAogCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9DTEVBTlVQOwogCi0JemZjcF9xZGlvX3NiYWxfbGltaXQocWRpbywgJnJlcS0+cWRpb19yZXEsIDIpOworCWlmICghemZjcF9hZGFwdGVyX211bHRpX2J1ZmZlcl9hY3RpdmUoYWRhcHRlcikpCisJCXpmY3BfcWRpb19zYmFsX2xpbWl0KHFkaW8sICZyZXEtPnFkaW9fcmVxLCAyKTsKIAogCXJldCA9IHpmY3BfZnNmX3NldHVwX2N0X2VscyhyZXEsIGVscy0+cmVxLCBlbHMtPnJlc3AsIHRpbWVvdXQpOwogCkBAIC0yMTYyLDcgKzIxNzEsNyBAQAogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcTsKIAlzdHJ1Y3QgZmNwX2NtbmQgKmZjcF9jbW5kOwogCXU4IHNidHlwZSA9IFNCQUxfU0ZMQUdTMF9UWVBFX1JFQUQ7Ci0JaW50IHJlYWxfYnl0ZXMsIHJldHZhbCA9IC1FSU8sIGRpeF9ieXRlcyA9IDA7CisJaW50IHJldHZhbCA9IC1FSU87CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gc2NzaV9jbW5kLT5kZXZpY2U7CiAJc3RydWN0IHpmY3Bfc2NzaV9kZXYgKnpmY3Bfc2RldiA9IHNkZXZfdG9femZjcChzZGV2KTsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gemZjcF9zZGV2LT5wb3J0LT5hZGFwdGVyOwpAQCAtMjIwNyw3ICsyMjE2LDggQEAKIAkJaW8tPnJlZl90YWdfdmFsdWUgPSBzY3NpX2dldF9sYmEoc2NzaV9jbW5kKSAmIDB4RkZGRkZGRkY7CiAJfQogCi0JemZjcF9mc2Zfc2V0X2RhdGFfZGlyKHNjc2lfY21uZCwgJmlvLT5kYXRhX2RpcmVjdGlvbik7CisJaWYgKHpmY3BfZnNmX3NldF9kYXRhX2RpcihzY3NpX2NtbmQsICZpby0+ZGF0YV9kaXJlY3Rpb24pKQorCQlnb3RvIGZhaWxlZF9zY3NpX2NtbmQ7CiAKIAlmY3BfY21uZCA9IChzdHJ1Y3QgZmNwX2NtbmQgKikgJnJlcS0+cXRjYi0+Ym90dG9tLmlvLmZjcF9jbW5kOwogCXpmY3BfZmNfc2NzaV90b19mY3AoZmNwX2NtbmQsIHNjc2lfY21uZCwgMCk7CkBAIC0yMjE1LDE4ICsyMjI1LDIyIEBACiAJaWYgKHNjc2lfcHJvdF9zZ19jb3VudChzY3NpX2NtbmQpKSB7CiAJCXpmY3BfcWRpb19zZXRfZGF0YV9kaXYocWRpbywgJnJlcS0+cWRpb19yZXEsCiAJCQkJICAgICAgIHNjc2lfcHJvdF9zZ19jb3VudChzY3NpX2NtbmQpKTsKLQkJZGl4X2J5dGVzID0gemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsCisJCXJldHZhbCA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLAorCQkJCQkJIHNjc2lfcHJvdF9zZ2xpc3Qoc2NzaV9jbW5kKSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGZhaWxlZF9zY3NpX2NtbmQ7CisJCWlvLT5wcm90X2RhdGFfbGVuZ3RoID0gemZjcF9xZGlvX3JlYWxfYnl0ZXMoCiAJCQkJCQlzY3NpX3Byb3Rfc2dsaXN0KHNjc2lfY21uZCkpOwotCQlpby0+cHJvdF9kYXRhX2xlbmd0aCA9IGRpeF9ieXRlczsKIAl9CiAKLQlyZWFsX2J5dGVzID0gemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsCi0JCQkJCSAgICAgc2NzaV9zZ2xpc3Qoc2NzaV9jbW5kKSk7Ci0KLQlpZiAodW5saWtlbHkocmVhbF9ieXRlcyA8IDApIHx8IHVubGlrZWx5KGRpeF9ieXRlcyA8IDApKQorCXJldHZhbCA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLAorCQkJCQkgc2NzaV9zZ2xpc3Qoc2NzaV9jbW5kKSk7CisJaWYgKHVubGlrZWx5KHJldHZhbCkpCiAJCWdvdG8gZmFpbGVkX3Njc2lfY21uZDsKIAogCXpmY3BfcWRpb19zZXRfc2JhbGVfbGFzdChhZGFwdGVyLT5xZGlvLCAmcmVxLT5xZGlvX3JlcSk7CisJaWYgKHpmY3BfYWRhcHRlcl9tdWx0aV9idWZmZXJfYWN0aXZlKGFkYXB0ZXIpKQorCQl6ZmNwX3FkaW9fc2V0X3Njb3VudChxZGlvLCAmcmVxLT5xZGlvX3JlcSk7CiAKIAlyZXR2YWwgPSB6ZmNwX2ZzZl9yZXFfc2VuZChyZXEpOwogCWlmICh1bmxpa2VseShyZXR2YWwpKQpAQCAtMjMyOCw3ICsyMzQyLDcgQEAKIAlzdHJ1Y3QgemZjcF9xZGlvICpxZGlvID0gYWRhcHRlci0+cWRpbzsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEgPSBOVUxMOwogCXN0cnVjdCBmc2ZfcXRjYl9ib3R0b21fc3VwcG9ydCAqYm90dG9tOwotCWludCByZXR2YWwgPSAtRUlPLCBieXRlczsKKwlpbnQgcmV0dmFsID0gLUVJTzsKIAl1OCBkaXJlY3Rpb247CiAKIAlpZiAoIShhZGFwdGVyLT5hZGFwdGVyX2ZlYXR1cmVzICYgRlNGX0ZFQVRVUkVfQ0ZEQykpCkBAIC0yMzYxLDEzICsyMzc1LDE3IEBACiAJYm90dG9tLT5vcGVyYXRpb25fc3VidHlwZSA9IEZTRl9DRkRDX09QRVJBVElPTl9TVUJUWVBFOwogCWJvdHRvbS0+b3B0aW9uID0gZnNmX2NmZGMtPm9wdGlvbjsKIAotCWJ5dGVzID0gemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsIGZzZl9jZmRjLT5zZyk7CisJcmV0dmFsID0gemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsIGZzZl9jZmRjLT5zZyk7CiAKLQlpZiAoYnl0ZXMgIT0gWkZDUF9DRkRDX01BWF9TSVpFKSB7CisJaWYgKHJldHZhbCB8fAorCQkoemZjcF9xZGlvX3JlYWxfYnl0ZXMoZnNmX2NmZGMtPnNnKSAhPSBaRkNQX0NGRENfTUFYX1NJWkUpKSB7CiAJCXpmY3BfZnNmX3JlcV9mcmVlKHJlcSk7CisJCXJldHZhbCA9IC1FSU87CiAJCWdvdG8gb3V0OwogCX0KLQl6ZmNwX3FkaW9fc2V0X3NiYWxlX2xhc3QoYWRhcHRlci0+cWRpbywgJnJlcS0+cWRpb19yZXEpOworCXpmY3BfcWRpb19zZXRfc2JhbGVfbGFzdChxZGlvLCAmcmVxLT5xZGlvX3JlcSk7CisJaWYgKHpmY3BfYWRhcHRlcl9tdWx0aV9idWZmZXJfYWN0aXZlKGFkYXB0ZXIpKQorCQl6ZmNwX3FkaW9fc2V0X3Njb3VudChxZGlvLCAmcmVxLT5xZGlvX3JlcSk7CiAKIAl6ZmNwX2ZzZl9zdGFydF90aW1lcihyZXEsIFpGQ1BfRlNGX1JFUVVFU1RfVElNRU9VVCk7CiAJcmV0dmFsID0gemZjcF9mc2ZfcmVxX3NlbmQocmVxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKaW5kZXggZDljNDBlYS4uZTE0ZGE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKQEAgLTEwLDExICsxMCwxNiBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLTVNHX0NPTVBPTkVOVCAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInpmY3BfZXh0LmgiCiAjaW5jbHVkZSAiemZjcF9xZGlvLmgiCiAKICNkZWZpbmUgUUJVRkZfUEVSX1BBR0UJCShQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IHFkaW9fYnVmZmVyKSkKIAorc3RhdGljIGJvb2wgZW5hYmxlX211bHRpYnVmZmVyOworbW9kdWxlX3BhcmFtX25hbWVkKGRhdGFyb3V0ZXIsIGVuYWJsZV9tdWx0aWJ1ZmZlciwgYm9vbCwgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRhdGFyb3V0ZXIsICJFbmFibGUgaGFyZHdhcmUgZGF0YSByb3V0ZXIgc3VwcG9ydCIpOworCiBzdGF0aWMgaW50IHpmY3BfcWRpb19idWZmZXJzX2VucXVldWUoc3RydWN0IHFkaW9fYnVmZmVyICoqc2JhbCkKIHsKIAlpbnQgcG9zOwpAQCAtMzcsOCArNDIsMTEgQEAKIAogCWRldl93YXJuKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsICJBIFFESU8gcHJvYmxlbSBvY2N1cnJlZFxuIik7CiAKLQlpZiAocWRpb19lcnIgJiBRRElPX0VSUk9SX1NMU0JfU1RBVEUpCisJaWYgKHFkaW9fZXJyICYgUURJT19FUlJPUl9TTFNCX1NUQVRFKSB7CiAJCXpmY3BfcWRpb19zaW9zbChhZGFwdGVyKTsKKwkJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihhZGFwdGVyLCAwLCBpZCk7CisJCXJldHVybjsKKwl9CiAJemZjcF9lcnBfYWRhcHRlcl9yZW9wZW4oYWRhcHRlciwKIAkJCQlaRkNQX1NUQVRVU19BREFQVEVSX0xJTktfVU5QTFVHR0VEIHwKIAkJCQlaRkNQX1NUQVRVU19DT01NT05fRVJQX0ZBSUxFRCwgaWQpOwpAQCAtOTMsOSArMTAxLDI3IEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwYXJtKQogewogCXN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8gPSAoc3RydWN0IHpmY3BfcWRpbyAqKSBwYXJtOwotCWludCBzYmFsX2lkeCwgc2JhbF9ubzsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gcWRpby0+YWRhcHRlcjsKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CisJaW50IHNiYWxfbm8sIHNiYWxfaWR4OworCXZvaWQgKnBsW1pGQ1BfUURJT19NQVhfU0JBTFNfUEVSX1JFUSArIDFdOworCXU2NCByZXFfaWQ7CisJdTggc2NvdW50OwogCiAJaWYgKHVubGlrZWx5KHFkaW9fZXJyKSkgeworCQltZW1zZXQocGwsIDAsIFpGQ1BfUURJT19NQVhfU0JBTFNfUEVSX1JFUSAqIHNpemVvZih2b2lkICopKTsKKwkJaWYgKHpmY3BfYWRhcHRlcl9tdWx0aV9idWZmZXJfYWN0aXZlKGFkYXB0ZXIpKSB7CisJCQlzYmFsZSA9IHFkaW8tPnJlc19xW2lkeF0tPmVsZW1lbnQ7CisJCQlyZXFfaWQgPSAodTY0KSBzYmFsZS0+YWRkcjsKKwkJCXNjb3VudCA9IHNiYWxlLT5zY291bnQgKyAxOyAvKiBpbmNsLiBzaWduYWxpbmcgU0JBTCAqLworCisJCQlmb3IgKHNiYWxfbm8gPSAwOyBzYmFsX25vIDwgc2NvdW50OyBzYmFsX25vKyspIHsKKwkJCQlzYmFsX2lkeCA9IChpZHggKyBzYmFsX25vKSAlCisJCQkJCVFESU9fTUFYX0JVRkZFUlNfUEVSX1E7CisJCQkJcGxbc2JhbF9ub10gPSBxZGlvLT5yZXNfcVtzYmFsX2lkeF07CisJCQl9CisJCQl6ZmNwX2RiZl9oYmFfZGVmX2VycihhZGFwdGVyLCByZXFfaWQsIHNjb3VudCwgcGwpOworCQl9CiAJCXpmY3BfcWRpb19oYW5kbGVyX2Vycm9yKHFkaW8sICJxZGlyZXMxIiwgcWRpb19lcnIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTU1LDcgKzE4MSw3IEBACiBzdGF0aWMgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKgogemZjcF9xZGlvX3NiYWxlX25leHQoc3RydWN0IHpmY3BfcWRpbyAqcWRpbywgc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxKQogewotCWlmIChxX3JlcS0+c2JhbGVfY3VyciA9PSBaRkNQX1FESU9fTEFTVF9TQkFMRV9QRVJfU0JBTCkKKwlpZiAocV9yZXEtPnNiYWxlX2N1cnIgPT0gcWRpby0+bWF4X3NiYWxlX3Blcl9zYmFsIC0gMSkKIAkJcmV0dXJuIHpmY3BfcWRpb19zYmFsX2NoYWluKHFkaW8sIHFfcmVxKTsKIAlxX3JlcS0+c2JhbGVfY3VycisrOwogCXJldHVybiB6ZmNwX3FkaW9fc2JhbGVfY3VycihxZGlvLCBxX3JlcSk7CkBAIC0xNjcsMTMgKzE5MywxMiBAQAogICogQHFfcmVxOiBwb2ludGVyIHRvIHN0cnVjdCB6ZmNwX3FkaW9fcmVxCiAgKiBAc2c6IHNjYXR0ZXItZ2F0aGVyIGxpc3QKICAqIEBtYXhfc2JhbHM6IHVwcGVyIGJvdW5kIGZvciBudW1iZXIgb2YgU0JBTHMgdG8gYmUgdXNlZAotICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzLCBvciBlcnJvciAobmVnYXRpdikKKyAqIFJldHVybnM6IHplcm8gb3IgLUVJTlZBTCBvbiBlcnJvcgogICovCiBpbnQgemZjcF9xZGlvX3NiYWxzX2Zyb21fc2coc3RydWN0IHpmY3BfcWRpbyAqcWRpbywgc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxLAogCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCiB7CiAJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwotCWludCBieXRlcyA9IDA7CiAKIAkvKiBzZXQgc3RvcmFnZS1ibG9jayB0eXBlIGZvciB0aGlzIHJlcXVlc3QgKi8KIAlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9yZXEocWRpbywgcV9yZXEpOwpAQCAtMTg3LDE0ICsyMTIsMTAgQEAKIAkJCQkJICAgICBxX3JlcS0+c2JhbF9udW1iZXIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQogCQlzYmFsZS0+YWRkciA9IHNnX3ZpcnQoc2cpOwogCQlzYmFsZS0+bGVuZ3RoID0gc2ctPmxlbmd0aDsKLQotCQlieXRlcyArPSBzZy0+bGVuZ3RoOwogCX0KLQotCXJldHVybiBieXRlczsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB6ZmNwX3FkaW9fc2JhbF9jaGVjayhzdHJ1Y3QgemZjcF9xZGlvICpxZGlvKQpAQCAtMjgzLDYgKzMwNCw4IEBACiAJbWVtY3B5KGlkLT5hZGFwdGVyX25hbWUsIGRldl9uYW1lKCZpZC0+Y2Rldi0+ZGV2KSwgOCk7CiAJQVNDRUJDKGlkLT5hZGFwdGVyX25hbWUsIDgpOwogCWlkLT5xaWJfcmZsYWdzID0gUUlCX1JGTEFHU19FTkFCTEVfREFUQV9ESVY7CisJaWYgKGVuYWJsZV9tdWx0aWJ1ZmZlcikKKwkJaWQtPnFkcl9hYyB8PSBRRFJfQUNfTVVMVElfQlVGRkVSX0VOQUJMRTsKIAlpZC0+bm9faW5wdXRfcXMgPSAxOwogCWlkLT5ub19vdXRwdXRfcXMgPSAxOwogCWlkLT5pbnB1dF9oYW5kbGVyID0gemZjcF9xZGlvX2ludF9yZXNwOwpAQCAtMzc4LDYgKzQwMSwxNyBAQAogCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9EQVRBX0RJVl9FTkFCTEVELAogCQkJCSZxZGlvLT5hZGFwdGVyLT5zdGF0dXMpOwogCisJaWYgKHNzcWQucWRpb2FjMiAmIENIU0NfQUMyX01VTFRJX0JVRkZFUl9FTkFCTEVEKSB7CisJCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19BREFQVEVSX01CX0FDVCwgJmFkYXB0ZXItPnN0YXR1cyk7CisJCXFkaW8tPm1heF9zYmFsZV9wZXJfc2JhbCA9IFFESU9fTUFYX0VMRU1FTlRTX1BFUl9CVUZGRVI7CisJfSBlbHNlIHsKKwkJYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9NQl9BQ1QsICZhZGFwdGVyLT5zdGF0dXMpOworCQlxZGlvLT5tYXhfc2JhbGVfcGVyX3NiYWwgPSBRRElPX01BWF9FTEVNRU5UU19QRVJfQlVGRkVSIC0gMTsKKwl9CisKKwlxZGlvLT5tYXhfc2JhbGVfcGVyX3JlcSA9CisJCVpGQ1BfUURJT19NQVhfU0JBTFNfUEVSX1JFUSAqIHFkaW8tPm1heF9zYmFsZV9wZXJfc2JhbAorCQktIDI7CiAJaWYgKHFkaW9fYWN0aXZhdGUoY2RldikpCiAJCWdvdG8gZmFpbGVkX3FkaW87CiAKQEAgLTM5Nyw2ICs0MzEsMTEgQEAKIAlhdG9taWNfc2V0KCZxZGlvLT5yZXFfcV9mcmVlLCBRRElPX01BWF9CVUZGRVJTX1BFUl9RKTsKIAlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9RRElPVVAsICZxZGlvLT5hZGFwdGVyLT5zdGF0dXMpOwogCisJaWYgKGFkYXB0ZXItPnNjc2lfaG9zdCkgeworCQlhZGFwdGVyLT5zY3NpX2hvc3QtPnNnX3RhYmxlc2l6ZSA9IHFkaW8tPm1heF9zYmFsZV9wZXJfcmVxOworCQlhZGFwdGVyLT5zY3NpX2hvc3QtPm1heF9zZWN0b3JzID0gcWRpby0+bWF4X3NiYWxlX3Blcl9yZXEgKiA4OworCX0KKwogCXJldHVybiAwOwogCiBmYWlsZWRfcWRpbzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmgKaW5kZXggNTRlMjJhYy4uOGFjN2Y1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmgKQEAgLTEzLDIwICsxMyw5IEBACiAKICNkZWZpbmUgWkZDUF9RRElPX1NCQUxFX0xFTglQQUdFX1NJWkUKIAotLyogRE1RIGJ1ZyB3b3JrYXJvdW5kOiBkb24ndCB1c2UgbGFzdCBTQkFMRSAqLwotI2RlZmluZSBaRkNQX1FESU9fTUFYX1NCQUxFU19QRVJfU0JBTAkoUURJT19NQVhfRUxFTUVOVFNfUEVSX0JVRkZFUiAtIDEpCi0KLS8qIGluZGV4IG9mIGxhc3QgU0JBTEUgKHdpdGggcmVzcGVjdCB0byBETVEgYnVnIHdvcmthcm91bmQpICovCi0jZGVmaW5lIFpGQ1BfUURJT19MQVNUX1NCQUxFX1BFUl9TQkFMCShaRkNQX1FESU9fTUFYX1NCQUxFU19QRVJfU0JBTCAtIDEpCi0KIC8qIE1heCBTQkFMUyBmb3IgY2hhaW5pbmcgKi8KICNkZWZpbmUgWkZDUF9RRElPX01BWF9TQkFMU19QRVJfUkVRCTM2CiAKLS8qIG1heC4gbnVtYmVyIG9mIChkYXRhIGJ1ZmZlcikgU0JBTEVzIGluIGxhcmdlc3QgU0JBTCBjaGFpbgotICogcmVxdWVzdCBJRCArIFFUQ0IgaW4gU0JBTEUgMCArIDEgb2YgZmlyc3QgU0JBTCBpbiBjaGFpbiAgICovCi0jZGVmaW5lIFpGQ1BfUURJT19NQVhfU0JBTEVTX1BFUl9SRVEgICAgIFwKLQkoWkZDUF9RRElPX01BWF9TQkFMU19QRVJfUkVRICogWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1NCQUwgLSAyKQotCiAvKioKICAqIHN0cnVjdCB6ZmNwX3FkaW8gLSBiYXNpYyBxZGlvIGRhdGEgc3RydWN0dXJlCiAgKiBAcmVzX3E6IHJlc3BvbnNlIHF1ZXVlCkBAIC01Myw2ICs0Miw4IEBACiAJYXRvbWljX3QJCXJlcV9xX2Z1bGw7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJcmVxX3Ffd3E7CiAJc3RydWN0IHpmY3BfYWRhcHRlcgkqYWRhcHRlcjsKKwl1MTYJCQltYXhfc2JhbGVfcGVyX3NiYWw7CisJdTE2CQkJbWF4X3NiYWxlX3Blcl9yZXE7CiB9OwogCiAvKioKQEAgLTE1NSw3ICsxNDYsNyBAQAogewogCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAotCUJVR19PTihxX3JlcS0+c2JhbGVfY3VyciA9PSBaRkNQX1FESU9fTEFTVF9TQkFMRV9QRVJfU0JBTCk7CisJQlVHX09OKHFfcmVxLT5zYmFsZV9jdXJyID09IHFkaW8tPm1heF9zYmFsZV9wZXJfc2JhbCAtIDEpOwogCXFfcmVxLT5zYmFsZV9jdXJyKys7CiAJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfY3VycihxZGlvLCBxX3JlcSk7CiAJc2JhbGUtPmFkZHIgPSBkYXRhOwpAQCAtMTk1LDkgKzE4NiwxMCBAQAogICogQHFfcmVxOiBUaGUgY3VycmVudCB6ZmNwX3FkaW9fcmVxCiAgKi8KIHN0YXRpYyBpbmxpbmUKLXZvaWQgemZjcF9xZGlvX3NraXBfdG9fbGFzdF9zYmFsZShzdHJ1Y3QgemZjcF9xZGlvX3JlcSAqcV9yZXEpCit2b2lkIHpmY3BfcWRpb19za2lwX3RvX2xhc3Rfc2JhbGUoc3RydWN0IHpmY3BfcWRpbyAqcWRpbywKKwkJCQkgIHN0cnVjdCB6ZmNwX3FkaW9fcmVxICpxX3JlcSkKIHsKLQlxX3JlcS0+c2JhbGVfY3VyciA9IFpGQ1BfUURJT19MQVNUX1NCQUxFX1BFUl9TQkFMOworCXFfcmVxLT5zYmFsZV9jdXJyID0gcWRpby0+bWF4X3NiYWxlX3Blcl9zYmFsIC0gMTsKIH0KIAogLyoqCkBAIC0yMjgsOCArMjIwLDUyIEBACiB7CiAJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCi0Jc2JhbGUgPSAmcWRpby0+cmVxX3FbcV9yZXEtPnNiYWxfZmlyc3RdLT5lbGVtZW50WzBdOworCXNiYWxlID0gcWRpby0+cmVxX3FbcV9yZXEtPnNiYWxfZmlyc3RdLT5lbGVtZW50OwogCXNiYWxlLT5sZW5ndGggPSBjb3VudDsKIH0KIAorLyoqCisgKiB6ZmNwX3FkaW9fc2JhbGVfY291bnQgLSBjb3VudCBzYmFsZSB1c2VkCisgKiBAc2c6IHBvaW50ZXIgdG8gc3RydWN0IHNjYXR0ZXJsaXN0CisgKi8KK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGludCB6ZmNwX3FkaW9fc2JhbGVfY291bnQoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCisJZm9yICg7IHNnOyBzZyA9IHNnX25leHQoc2cpKQorCQljb3VudCsrOworCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIHpmY3BfcWRpb19yZWFsX2J5dGVzIC0gY291bnQgYnl0ZXMgdXNlZAorICogQHNnOiBwb2ludGVyIHRvIHN0cnVjdCBzY2F0dGVybGlzdAorICovCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBpbnQgemZjcF9xZGlvX3JlYWxfYnl0ZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwl1bnNpZ25lZCBpbnQgcmVhbF9ieXRlcyA9IDA7CisKKwlmb3IgKDsgc2c7IHNnID0gc2dfbmV4dChzZykpCisJCXJlYWxfYnl0ZXMgKz0gc2ctPmxlbmd0aDsKKworCXJldHVybiByZWFsX2J5dGVzOworfQorCisvKioKKyAqIHpmY3BfcWRpb19zZXRfc2NvdW50IC0gc2V0IFNCQUwgY291bnQgdmFsdWUKKyAqIEBxZGlvOiBwb2ludGVyIHRvIHN0cnVjdCB6ZmNwX3FkaW8KKyAqIEBxX3JlcTogVGhlIGN1cnJlbnQgemZjcF9xZGlvX3JlcQorICovCitzdGF0aWMgaW5saW5lCit2b2lkIHpmY3BfcWRpb19zZXRfc2NvdW50KHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8sIHN0cnVjdCB6ZmNwX3FkaW9fcmVxICpxX3JlcSkKK3sKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CisKKwlzYmFsZSA9IHFkaW8tPnJlcV9xW3FfcmVxLT5zYmFsX2ZpcnN0XS0+ZWxlbWVudDsKKwlzYmFsZS0+c2NvdW50ID0gcV9yZXEtPnNiYWxfbnVtYmVyIC0gMTsKK30KKwogI2VuZGlmIC8qIFpGQ1BfUURJT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCmluZGV4IDdjYWM4NzMuLjExZjA3ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAiemZjcCIKICNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNjc2kvZmMvZmNfZmNwLmg+CkBAIC0yNCwxMSArMjUsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhxdWV1ZV9kZXB0aCwgIkRlZmF1bHQgcXVldWUgZGVwdGggZm9yIG5ldyBTQ1NJIGRldmljZXMiKTsKIAogc3RhdGljIGJvb2wgZW5hYmxlX2RpZjsKLQotI2lmZGVmIENPTkZJR19aRkNQX0RJRgotbW9kdWxlX3BhcmFtX25hbWVkKGRpZiwgZW5hYmxlX2RpZiwgYm9vbCwgMDYwMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGlmLCBlbmFibGVfZGlmLCBib29sLCAwNDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGlmLCAiRW5hYmxlIERJRi9ESVggZGF0YSBpbnRlZ3JpdHkgc3VwcG9ydCIpOwotI2VuZGlmCiAKIHN0YXRpYyBib29sIGFsbG93X2x1bl9zY2FuID0gMTsKIG1vZHVsZV9wYXJhbShhbGxvd19sdW5fc2NhbiwgYm9vbCwgMDYwMCk7CkBAIC0zMDksOCArMzA3LDggQEAKIAkucHJvY19uYW1lCQkgPSAiemZjcCIsCiAJLmNhbl9xdWV1ZQkJID0gNDA5NiwKIAkudGhpc19pZAkJID0gLTEsCi0JLnNnX3RhYmxlc2l6ZQkJID0gWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1JFUSwKLQkubWF4X3NlY3RvcnMJCSA9IChaRkNQX1FESU9fTUFYX1NCQUxFU19QRVJfUkVRICogOCksCisJLnNnX3RhYmxlc2l6ZQkJID0gMSwgLyogYWRqdXN0ZWQgbGF0ZXIgKi8KKwkubWF4X3NlY3RvcnMJCSA9IDgsIC8qIGFkanVzdGVkIGxhdGVyICovCiAJLmRtYV9ib3VuZGFyeQkJID0gWkZDUF9RRElPX1NCQUxFX0xFTiAtIDEsCiAJLmNtZF9wZXJfbHVuCQkgPSAxLAogCS51c2VfY2x1c3RlcmluZwkJID0gMSwKQEAgLTY2OCw5ICs2NjYsOSBAQAogCSAgICBhZGFwdGVyLT5hZGFwdGVyX2ZlYXR1cmVzICYgRlNGX0ZFQVRVUkVfRElYX1BST1RfVENQSVApIHsKIAkJbWFzayB8PSBTSE9TVF9ESVhfVFlQRTFfUFJPVEVDVElPTjsKIAkJc2NzaV9ob3N0X3NldF9ndWFyZChzaG9zdCwgU0hPU1RfRElYX0dVQVJEX0lQKTsKLQkJc2hvc3QtPnNnX3Byb3RfdGFibGVzaXplID0gWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1JFUSAvIDI7Ci0JCXNob3N0LT5zZ190YWJsZXNpemUgPSBaRkNQX1FESU9fTUFYX1NCQUxFU19QRVJfUkVRIC8gMjsKLQkJc2hvc3QtPm1heF9zZWN0b3JzID0gWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1JFUSAqIDggLyAyOworCQlzaG9zdC0+c2dfcHJvdF90YWJsZXNpemUgPSBhZGFwdGVyLT5xZGlvLT5tYXhfc2JhbGVfcGVyX3JlcSAvIDI7CisJCXNob3N0LT5zZ190YWJsZXNpemUgPSBhZGFwdGVyLT5xZGlvLT5tYXhfc2JhbGVfcGVyX3JlcSAvIDI7CisJCXNob3N0LT5tYXhfc2VjdG9ycyA9IHNob3N0LT5zZ190YWJsZXNpemUgKiA4OwogCX0KIAogCXNjc2lfaG9zdF9zZXRfcHJvdChzaG9zdCwgbWFzayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IDM4NzhiNzMuLjA2ZWEzYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC0zMDksNiArMzA5LDcgQEAKIGNvbmZpZyBTQ1NJX0lTQ1NJX0FUVFJTCiAJdHJpc3RhdGUgImlTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzIgogCWRlcGVuZHMgb24gU0NTSSAmJiBORVQKKwlzZWxlY3QgQkxLX0RFVl9CU0dMSUIKIAloZWxwCiAJICBJZiB5b3Ugd2lzaCB0byBleHBvcnQgdHJhbnNwb3J0LXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0CiAJICBlYWNoIGF0dGFjaGVkIGlTQ1NJIGRldmljZSB0byBzeXNmcywgc2F5IFkuCkBAIC01NTksNiArNTYwLDE1IEBACiBzb3VyY2UgImRyaXZlcnMvc2NzaS9haWM5NHh4L0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc2NzaS9tdnNhcy9LY29uZmlnIgogCitjb25maWcgU0NTSV9NVlVNSQorCXRyaXN0YXRlICJNYXJ2ZWxsIFVNSSBkcml2ZXIiCisJZGVwZW5kcyBvbiBTQ1NJICYmIFBDSQorCWhlbHAKKwkgIE1vZHVsZSBmb3IgTWFydmVsbCBVbml2ZXJzYWwgTWVzc2FnZSBJbnRlcmZhY2UoVU1JKSBkcml2ZXIKKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbXZ1bWkuCisKIGNvbmZpZyBTQ1NJX0RQVF9JMk8KIAl0cmlzdGF0ZSAiQWRhcHRlYyBJMk8gUkFJRCBzdXBwb3J0ICIKIAlkZXBlbmRzIG9uIFNDU0kgJiYgUENJICYmIFZJUlRfVE9fQlVTCkBAIC02MDcsMjAgKzYxNyw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcmNtc3IgKG1vZHByb2JlIGFyY21zcikuCiAKLWNvbmZpZyBTQ1NJX0FSQ01TUl9BRVIKLQlib29sICJFbmFibGUgUENJIEVycm9yIFJlY292ZXJ5IENhcGFiaWxpdHkgaW4gQXJlY2EgRHJpdmVyKEFSQ01TUikiCi0JZGVwZW5kcyBvbiBTQ1NJX0FSQ01TUiAmJiBQQ0lFQUVSCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgVGhlIGFkdmFuY2VkIGVycm9yIHJlcG9ydGluZyhBRVIpIGNhcGFiaWxpdHkgaXMgIk5PVCIgcHJvdmlkZWQgYnkKLQkgIEFSQzEyMDAvMTIwMS8xMjAyIFNBVEEgUkFJRCBjb250cm9sbGVycyBjYXJkcy4KLQkgIElmIHlvdXIgY2FyZCBpcyBvbmUgb2YgQVJDMTIwMC8xMjAxLzEyMDIsIHBsZWFzZSB1c2UgdGhlIGRlZmF1bHQgc2V0dGluZywgbi4KLQkgIElmIHlvdXIgY2FyZCBpcyBvdGhlciBtb2RlbHMsIHlvdSBjb3VsZCBwaWNrIGl0Ci0JICBvbiBjb25kaXRpb24gdGhhdCB0aGUga2VybmVsIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIDIuNi4xOS4KLQkgIFRoaXMgZnVuY3Rpb24gaXMgbWFpbnRhaW5lZCBkcml2ZXIgYnkgTmljayBDaGVuZy4gSWYgeW91IGhhdmUgYW55Ci0JICBwcm9ibGVtcyBvciBzdWdnZXN0aW9uLCB5b3UgYXJlIHdlbGNvbWUgdG8gY29udGFjdCB3aXRoIDxuaWNrLmNoZW5nQGFyZWNhLmNvbS50dz4uCi0JICBUbyBlbmFibGUgdGhpcyBmdW5jdGlvbiwgY2hvb3NlIFkgaGVyZS4KLQogc291cmNlICJkcml2ZXJzL3Njc2kvbWVnYXJhaWQvS2NvbmZpZy5tZWdhcmFpZCIKIHNvdXJjZSAiZHJpdmVycy9zY3NpL21wdDJzYXMvS2NvbmZpZyIKIApAQCAtMTg3MiwxMCArMTg2OCw2IEBACiAgICAgICAgICAgY2FsbGVkIHpmY3AuIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUKICAgICAgICAgICBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dD4uCiAKLWNvbmZpZyBaRkNQX0RJRgotCXRyaXN0YXRlICJUMTAgRElGL0RJWCBzdXBwb3J0IGZvciB0aGUgemZjcCBkcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBaRkNQICYmIEVYUEVSSU1FTlRBTAotCiBjb25maWcgU0NTSV9QTUNSQUlECiAJdHJpc3RhdGUgIlBNQyBTSUVSUkEgTGludXggTWF4UkFJRCBhZGFwdGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSSAmJiBORVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQppbmRleCA2MTUzYTY2Li4yYjg4NzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCkBAIC0xMzQsNiArMTM0LDcgQEAKIG9iai0kKENPTkZJR19TQ1NJX0hQVElPUCkJKz0gaHB0aW9wLm8KIG9iai0kKENPTkZJR19TQ1NJX1NURVgpCQkrPSBzdGV4Lm8KIG9iai0kKENPTkZJR19TQ1NJX01WU0FTKQkrPSBtdnNhcy8KK29iai0kKENPTkZJR19TQ1NJX01WVU1JKQkrPSBtdnVtaS5vCiBvYmotJChDT05GSUdfUFMzX1JPTSkJCSs9IHBzM3JvbS5vCiBvYmotJChDT05GSUdfU0NTSV9DWEdCM19JU0NTSSkJKz0gbGliaXNjc2kubyBsaWJpc2NzaV90Y3AubyBjeGdiaS8KIG9iai0kKENPTkZJR19TQ1NJX0NYR0I0X0lTQ1NJKQkrPSBsaWJpc2NzaS5vIGxpYmlzY3NpX3RjcC5vIGN4Z2JpLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2EyMDkxLmMgYi9kcml2ZXJzL3Njc2kvYTIwOTEuYwppbmRleCAxYmI1ZDNmLi43OWEzMDYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYTIwOTEuYworKysgYi9kcml2ZXJzL3Njc2kvYTIwOTEuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2EzMDAwLmMgYi9kcml2ZXJzL3Njc2kvYTMwMDAuYwppbmRleCBkOTQ2ODAyLi5lMjlmZTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYTMwMDAuYworKysgYi9kcml2ZXJzL3Njc2kvYTMwMDAuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjaGJhLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYwppbmRleCAwNjE5OTU3Li40MDlmNTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPiAvKiBGb3IgZmx1c2hfa2VybmVsX2RjYWNoZV9wYWdlICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKaW5kZXggMzM4MjQ3NS4uNGFhNzZkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCkBAIC04OTQsMTYgKzg5NCwxNyBAQAogCWludCBsZW4gPSAwOwogCiAJaWYgKGxlMzJfdG9fY3B1KGRldi0+YWRhcHRlcl9pbmZvLnNlcmlhbFswXSkgIT0gMHhCQUQwKQotCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwNlhcbiIsCisJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgMTYsICIlMDZYXG4iLAogCQkgIGxlMzJfdG9fY3B1KGRldi0+YWRhcHRlcl9pbmZvLnNlcmlhbFswXSkpOwogCWlmIChsZW4gJiYKIAkgICFtZW1jbXAoJmRldi0+c3VwcGxlbWVudF9hZGFwdGVyX2luZm8uTWZnUGNiYVNlcmlhbE5vWwogCSAgICBzaXplb2YoZGV2LT5zdXBwbGVtZW50X2FkYXB0ZXJfaW5mby5NZmdQY2JhU2VyaWFsTm8pLWxlbl0sCiAJICBidWYsIGxlbi0xKSkKLQkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlLipzXG4iLAorCQlsZW4gPSBzbnByaW50ZihidWYsIDE2LCAiJS4qc1xuIiwKIAkJICAoaW50KXNpemVvZihkZXYtPnN1cHBsZW1lbnRfYWRhcHRlcl9pbmZvLk1mZ1BjYmFTZXJpYWxObyksCiAJCSAgZGV2LT5zdXBwbGVtZW50X2FkYXB0ZXJfaW5mby5NZmdQY2JhU2VyaWFsTm8pOwotCXJldHVybiBsZW47CisKKwlyZXR1cm4gbWluKGxlbiwgMTYpOwogfQogCiBzdGF0aWMgc3NpemVfdCBhYWNfc2hvd19tYXhfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NjYi5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zY2IuYwppbmRleCAyOTU5MzI3Li5mZGFjN2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NjYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2NiLmMKQEAgLTkwNiw2ICs5MDYsNyBAQAogCiAJc3dpdGNoIChmdW5jKSB7CiAJY2FzZSBQSFlfRlVOQ19DTEVBUl9FUlJPUl9MT0c6CisJY2FzZSBQSFlfRlVOQ19HRVRfRVZFTlRTOgogCQlyZXR1cm4gLUVOT1NZUzsKIAljYXNlIFBIWV9GVU5DX1NFVF9MSU5LX1JBVEU6CiAJCXJhdGVzID0gYXJnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMKaW5kZXggYjhhODJmMi4uY2RiMTUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCkBAIC02NjAsNiArNjYwLDcgQEAKIAlzcGluX2xvY2soJnBoYmEtPmN0cmwubWJveF9sb2NrKTsKIAljdHJsID0gJnBoYmEtPmN0cmw7CiAJd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCWN0eHQgPSAmcmVxLT5jb250ZXh0OwogCkBAIC04NjgsMyArODY5LDIyIEBACiAJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBOVUxMLCBRVFlQRV9TR0wpOwogCXJldHVybiBzdGF0dXM7CiB9CisKK2ludCBiZWlzY3NpX2NtZF9yZXNldF9mdW5jdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgICpwaGJhKQoreworCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXN0cnVjdCBiZV9wb3N0X3NnbF9wYWdlc19yZXEgKnJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCisJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCk7CisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCisJCQkgICBPUENPREVfQ09NTU9OX0ZVTkNUSU9OX1JFU0VULCBzaXplb2YoKnJlcSkpOworCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5X3dhaXQocGhiYSk7CisKKwlzcGluX3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmgKaW5kZXggNDk3ZWIyOS4uOGI0MGE1YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmgKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaApAQCAtNTYxLDYgKzU2MSw4IEBACiAJCQkJc3RydWN0IGJlX2RtYV9tZW0gKnFfbWVtLCB1MzIgcGFnZV9vZmZzZXQsCiAJCQkJdTMyIG51bV9wYWdlcyk7CiAKK2ludCBiZWlzY3NpX2NtZF9yZXNldF9mdW5jdGlvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOworCiBpbnQgYmVfY21kX3dyYnFfY3JlYXRlKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHN0cnVjdCBiZV9kbWFfbWVtICpxX21lbSwKIAkJICAgICAgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICp3cmJxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuYwppbmRleCAzY2FkMTA2Li44YjAwMmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuYwpAQCAtMTc3LDkgKzE3Nyw4IEBACiB7CiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKIAlzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4gPSBjb25uLT5kZF9kYXRhOwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0KLQkJKHN0cnVjdCBTY3NpX0hvc3QgKilpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KGNsc19zZXNzaW9uKTsKLQlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSAoc3RydWN0IGJlaXNjc2lfaGJhICopaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3QoY2xzX3Nlc3Npb24pOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CiAJc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXA7CiAJc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcDsKIApAQCAtMjkwLDcgKzI4OSw3IEBACiBpbnQgYmVpc2NzaV9nZXRfaG9zdF9wYXJhbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKIAkJCSAgIGVudW0gaXNjc2lfaG9zdF9wYXJhbSBwYXJhbSwgY2hhciAqYnVmKQogewotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IChzdHJ1Y3QgYmVpc2NzaV9oYmEgKilpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAlTRV9ERUJVRyhEQkdfTFZMXzgsICJJbiBiZWlzY3NpX2dldF9ob3N0X3BhcmFtLCBwYXJhbT0gJWRcbiIsIHBhcmFtKTsKQEAgLTczMywzICs3MzIsNTYgQEAKIAliZWlzY3NpX3VuYmluZF9jb25uX3RvX2NpZChwaGJhLCBiZWlzY3NpX2VwLT5lcF9jaWQpOwogCWlzY3NpX2Rlc3Ryb3lfZW5kcG9pbnQoYmVpc2NzaV9lcC0+b3BlbmlzY3NpX2VwKTsKIH0KKworbW9kZV90IGJlMmlzY3NpX2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKQoreworCXN3aXRjaCAocGFyYW1fdHlwZSkgeworCWNhc2UgSVNDU0lfSE9TVF9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSFdBRERSRVNTOgorCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSVBBRERSRVNTOgorCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSU5JVElBVE9SX05BTUU6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBJU0NTSV9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX1BBUkFNX01BWF9SRUNWX0RMRU5HVEg6CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1hNSVRfRExFTkdUSDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9IRFJER1NUX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0RBVEFER1NUX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0NPTk5fQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9DT05OX1BPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fRVhQX1NUQVRTTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX0FERFJFU1M6CisJCWNhc2UgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9QT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX1BJTkdfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX1JFQ1ZfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX0lOSVRJQUxfUjJUX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9SMlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fSU1NX0RBVEFfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRklSU1RfQlVSU1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX0JVUlNUOgorCQljYXNlIElTQ1NJX1BBUkFNX1BEVV9JTk9SREVSX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0RBVEFTRVFfSU5PUkRFUl9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9FUkw6CisJCWNhc2UgSVNDU0lfUEFSQU1fVEFSR0VUX05BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fVFBHVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9VU0VSTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9QQVNTV09SRDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9VU0VSTkFNRV9JTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QQVNTV09SRF9JTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9GQVNUX0FCT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX0FCT1JUX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9MVV9SRVNFVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fSUZBQ0VfTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFUT1JfTkFNRToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmgKaW5kZXggZmY2MGI3Zi4uNGExZjJlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmgKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmgKQEAgLTI2LDYgKzI2LDggQEAKICNkZWZpbmUgQkUyX0lQVjQgIDB4MQogI2RlZmluZSBCRTJfSVBWNiAgMHgxMAogCittb2RlX3QgYmUyaXNjc2lfYXR0cl9pc192aXNpYmxlKGludCBwYXJhbV90eXBlLCBpbnQgcGFyYW0pOworCiB2b2lkIGJlaXNjc2lfb2ZmbG9hZF9jb25uZWN0aW9uKHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKIAkJCQlzdHJ1Y3QgYmVpc2NzaV9vZmZsb2FkX3BhcmFtcyAqcGFyYW1zKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKaW5kZXggMGE5YmRmYS4uMzc5YzY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvaXNjc2lfYm9vdF9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c2NzaS9saWJpc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaD4KQEAgLTgyMiwzMyArODIzLDQ3IEBACiAJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOwogCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dDsKIAlpbnQgcmV0LCBtc2l4X3ZlYywgaSwgajsKLQljaGFyIGRlc2NbMzJdOwogCiAJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CiAJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OwogCiAJaWYgKHBoYmEtPm1zaXhfZW5hYmxlZCkgewogCQlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgewotCQkJc3ByaW50ZihkZXNjLCAiYmVpc2NzaV9tc2l4XyUwNHgiLCBpKTsKKwkJCXBoYmEtPm1zaV9uYW1lW2ldID0ga3phbGxvYyhCRUlTQ1NJX01TSV9OQU1FLAorCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFwaGJhLT5tc2lfbmFtZVtpXSkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBmcmVlX21zaXhfaXJxczsKKwkJCX0KKworCQkJc3ByaW50ZihwaGJhLT5tc2lfbmFtZVtpXSwgImJlaXNjc2lfJTAyeF8lMDJ4IiwKKwkJCQlwaGJhLT5zaG9zdC0+aG9zdF9ubywgaSk7CiAJCQltc2l4X3ZlYyA9IHBoYmEtPm1zaXhfZW50cmllc1tpXS52ZWN0b3I7Ci0JCQlyZXQgPSByZXF1ZXN0X2lycShtc2l4X3ZlYywgYmVfaXNyX21zaXgsIDAsIGRlc2MsCisJCQlyZXQgPSByZXF1ZXN0X2lycShtc2l4X3ZlYywgYmVfaXNyX21zaXgsIDAsCisJCQkJCSAgcGhiYS0+bXNpX25hbWVbaV0sCiAJCQkJCSAgJnBod2lfY29udGV4dC0+YmVfZXFbaV0pOwogCQkJaWYgKHJldCkgewogCQkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCiAJCQkJCSAgICAgImJlaXNjc2lfaW5pdF9pcnFzLUZhaWxlZCB0byIKIAkJCQkJICAgICAicmVnaXN0ZXIgbXNpeCBmb3IgaSA9ICVkXG4iLCBpKTsKLQkJCQlpZiAoIWkpCi0JCQkJCXJldHVybiByZXQ7CisJCQkJa2ZyZWUocGhiYS0+bXNpX25hbWVbaV0pOwogCQkJCWdvdG8gZnJlZV9tc2l4X2lycXM7CiAJCQl9CiAJCX0KKwkJcGhiYS0+bXNpX25hbWVbaV0gPSBremFsbG9jKEJFSVNDU0lfTVNJX05BTUUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBoYmEtPm1zaV9uYW1lW2ldKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBmcmVlX21zaXhfaXJxczsKKwkJfQorCQlzcHJpbnRmKHBoYmEtPm1zaV9uYW1lW2ldLCAiYmVpc2NzaV9tY2NfJTAyeCIsCisJCQlwaGJhLT5zaG9zdC0+aG9zdF9ubyk7CiAJCW1zaXhfdmVjID0gcGhiYS0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvcjsKLQkJcmV0ID0gcmVxdWVzdF9pcnEobXNpeF92ZWMsIGJlX2lzcl9tY2MsIDAsICJiZWlzY3NpX21zaXhfbWNjIiwKKwkJcmV0ID0gcmVxdWVzdF9pcnEobXNpeF92ZWMsIGJlX2lzcl9tY2MsIDAsIHBoYmEtPm1zaV9uYW1lW2ldLAogCQkJCSAgJnBod2lfY29udGV4dC0+YmVfZXFbaV0pOwogCQlpZiAocmV0KSB7CiAJCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LCAiYmVpc2NzaV9pbml0X2lycXMtIgogCQkJCSAgICAgIkZhaWxlZCB0byByZWdpc3RlciBiZWlzY3NpX21zaXhfbWNjXG4iKTsKLQkJCWkrKzsKKwkJCWtmcmVlKHBoYmEtPm1zaV9uYW1lW2ldKTsKIAkJCWdvdG8gZnJlZV9tc2l4X2lycXM7CiAJCX0KIApAQCAtODYzLDggKzg3OCwxMSBAQAogCX0KIAlyZXR1cm4gMDsKIGZyZWVfbXNpeF9pcnFzOgotCWZvciAoaiA9IGkgLSAxOyBqID09IDA7IGorKykKKwlmb3IgKGogPSBpIC0gMTsgaiA+PSAwOyBqLS0pIHsKKwkJa2ZyZWUocGhiYS0+bXNpX25hbWVbal0pOworCQltc2l4X3ZlYyA9IHBoYmEtPm1zaXhfZW50cmllc1tqXS52ZWN0b3I7CiAJCWZyZWVfaXJxKG1zaXhfdmVjLCAmcGh3aV9jb250ZXh0LT5iZV9lcVtqXSk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMDYsNyArMTEyNCwxMiBAQAogCQkJCQkJJiBTT0xfU1RTX01BU0spID4+IDgpOwogCWZsYWdzID0gKChwc29sLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9zb2xfY3FlLCBpX2ZsYWdzKSAvIDMyXQogCQkJCQkmIFNPTF9GTEFHU19NQVNLKSA+PiAyNCkgfCAweDgwOworCWlmICghdGFzay0+c2MpIHsKKwkJaWYgKGlvX3Rhc2stPnNjc2lfY21uZCkKKwkJCXNjc2lfZG1hX3VubWFwKGlvX3Rhc2stPnNjc2lfY21uZCk7CiAKKwkJcmV0dXJuOworCX0KIAl0YXNrLT5zYy0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCBzdGF0dXM7CiAJaWYgKHJzcCAhPSBJU0NTSV9TVEFUVVNfQ01EX0NPTVBMRVRFRCkgewogCQl0YXNrLT5zYy0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwpAQCAtNDAyNywxMSArNDA1MCwxMSBAQAogCQkJCSAgICAgIFRHVF9ETV9DTUQpOwogCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGNtZHNuX2l0dCwKIAkJCQkgICAgICBwd3JiLCAwKTsKLQkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBkbXNnLCBwd3JiLCAwKTsKKwkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBkbXNnLCBwd3JiLCAxKTsKIAkJfSBlbHNlIHsKIAkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCB0eXBlLCBwd3JiLAogCQkJCSAgICAgIElOSV9SRF9DTUQpOwotCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGRtc2csIHB3cmIsIDEpOworCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV93cmIsIGRtc2csIHB3cmIsIDApOwogCQl9CiAJCWh3aV93cml0ZV9idWZmZXIocHdyYiwgdGFzayk7CiAJCWJyZWFrOwpAQCAtNDEwMiw5ICs0MTI1LDggQEAKIAlyZXR1cm4gYmVpc2NzaV9pb3Rhc2sodGFzaywgc2csIG51bV9zZywgeGZlcmxlbiwgd3JpdGVkaXIpOwogfQogCi1zdGF0aWMgdm9pZCBiZWlzY3NpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQorc3RhdGljIHZvaWQgYmVpc2NzaV9xdWllc2NlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKLQlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBOVUxMOwogCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKIAlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CiAJc3RydWN0IGJlX2VxX29iaiAqcGJlX2VxOwpAQCAtNDExMiwxMiArNDEzNCw2IEBACiAJdTggKnJlYWxfb2Zmc2V0ID0gMDsKIAl1MzIgdmFsdWUgPSAwOwogCi0JcGhiYSA9IChzdHJ1Y3QgYmVpc2NzaV9oYmEgKilwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKLQlpZiAoIXBoYmEpIHsKLQkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJiZWlzY3NpX3JlbW92ZSBjYWxsZWQgd2l0aCBubyBwaGJhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQogCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwogCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKIAlod2lfZGlzYWJsZV9pbnRyKHBoYmEpOwpAQCAtNDEyNSw2ICs0MTQxLDcgQEAKIAkJZm9yIChpID0gMDsgaSA8PSBwaGJhLT5udW1fY3B1czsgaSsrKSB7CiAJCQltc2l4X3ZlYyA9IHBoYmEtPm1zaXhfZW50cmllc1tpXS52ZWN0b3I7CiAJCQlmcmVlX2lycShtc2l4X3ZlYywgJnBod2lfY29udGV4dC0+YmVfZXFbaV0pOworCQkJa2ZyZWUocGhiYS0+bXNpX25hbWVbaV0pOwogCQl9CiAJfSBlbHNlCiAJCWlmIChwaGJhLT5wY2lkZXYtPmlycSkKQEAgLTQxNTIsMTAgKzQxNjksNDAgQEAKIAkJCSAgICBwaGJhLT5jdHJsLm1ib3hfbWVtX2FsbG9jZWQuc2l6ZSwKIAkJCSAgICBwaGJhLT5jdHJsLm1ib3hfbWVtX2FsbG9jZWQudmEsCiAJCQkgICAgcGhiYS0+Y3RybC5tYm94X21lbV9hbGxvY2VkLmRtYSk7Cit9CisKK3N0YXRpYyB2b2lkIGJlaXNjc2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBOVUxMOworCisJcGhiYSA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworCWlmICghcGhiYSkgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImJlaXNjc2lfcmVtb3ZlIGNhbGxlZCB3aXRoIG5vIHBoYmFcbiIpOworCQlyZXR1cm47CisJfQorCisJYmVpc2NzaV9xdWllc2NlKHBoYmEpOwogCWlzY3NpX2Jvb3RfZGVzdHJveV9rc2V0KHBoYmEtPmJvb3Rfa3NldCk7CiAJaXNjc2lfaG9zdF9yZW1vdmUocGhiYS0+c2hvc3QpOwogCXBjaV9kZXZfcHV0KHBoYmEtPnBjaWRldik7CiAJaXNjc2lfaG9zdF9mcmVlKHBoYmEtPnNob3N0KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKK30KKworc3RhdGljIHZvaWQgYmVpc2NzaV9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gTlVMTDsKKworCXBoYmEgPSAoc3RydWN0IGJlaXNjc2lfaGJhICopcGNpX2dldF9kcnZkYXRhKHBjaWRldik7CisJaWYgKCFwaGJhKSB7CisJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiYmVpc2NzaV9zaHV0ZG93biBjYWxsZWQgd2l0aCBubyBwaGJhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWJlaXNjc2lfcXVpZXNjZShwaGJhKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgYmVpc2NzaV9tc2l4X2VuYWJsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCkBAIC00MjM1LDcgKzQyODIsNyBAQAogCQkJZ2NyYXNobW9kZSsrOwogCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwKIAkJCQkiTG9hZGluZyBEcml2ZXIgaW4gY3Jhc2hkdW1wIG1vZGVcbiIpOwotCQkJcmV0ID0gYmVpc2NzaV9wY2lfc29mdF9yZXNldChwaGJhKTsKKwkJCXJldCA9IGJlaXNjc2lfY21kX3Jlc2V0X2Z1bmN0aW9uKHBoYmEpOwogCQkJaWYgKHJldCkgewogCQkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCiAJCQkJCSJSZXNldCBGYWlsZWQuIEFib3J0aW5nIENyYXNoZHVtcFxuIik7CkBAIC00MzY0LDM3ICs0NDExLDEyIEBACiAJLm5hbWUgPSBEUlZfTkFNRSwKIAkuY2FwcyA9IENBUF9SRUNPVkVSWV9MMCB8IENBUF9IRFJER1NUIHwgQ0FQX1RFWFRfTkVHTyB8CiAJCUNBUF9NVUxUSV9SMlQgfCBDQVBfREFUQURHU1QgfCBDQVBfREFUQV9QQVRIX09GRkxPQUQsCi0JLnBhcmFtX21hc2sgPSBJU0NTSV9NQVhfUkVDVl9ETEVOR1RIIHwKLQkJSVNDU0lfTUFYX1hNSVRfRExFTkdUSCB8Ci0JCUlTQ1NJX0hEUkRHU1RfRU4gfAotCQlJU0NTSV9EQVRBREdTVF9FTiB8Ci0JCUlTQ1NJX0lOSVRJQUxfUjJUX0VOIHwKLQkJSVNDU0lfTUFYX1IyVCB8Ci0JCUlTQ1NJX0lNTV9EQVRBX0VOIHwKLQkJSVNDU0lfRklSU1RfQlVSU1QgfAotCQlJU0NTSV9NQVhfQlVSU1QgfAotCQlJU0NTSV9QRFVfSU5PUkRFUl9FTiB8Ci0JCUlTQ1NJX0RBVEFTRVFfSU5PUkRFUl9FTiB8Ci0JCUlTQ1NJX0VSTCB8Ci0JCUlTQ1NJX0NPTk5fUE9SVCB8Ci0JCUlTQ1NJX0NPTk5fQUREUkVTUyB8Ci0JCUlTQ1NJX0VYUF9TVEFUU04gfAotCQlJU0NTSV9QRVJTSVNURU5UX1BPUlQgfAotCQlJU0NTSV9QRVJTSVNURU5UX0FERFJFU1MgfAotCQlJU0NTSV9UQVJHRVRfTkFNRSB8IElTQ1NJX1RQR1QgfAotCQlJU0NTSV9VU0VSTkFNRSB8IElTQ1NJX1BBU1NXT1JEIHwKLQkJSVNDU0lfVVNFUk5BTUVfSU4gfCBJU0NTSV9QQVNTV09SRF9JTiB8Ci0JCUlTQ1NJX0ZBU1RfQUJPUlQgfCBJU0NTSV9BQk9SVF9UTU8gfAotCQlJU0NTSV9MVV9SRVNFVF9UTU8gfAotCQlJU0NTSV9QSU5HX1RNTyB8IElTQ1NJX1JFQ1ZfVE1PIHwKLQkJSVNDU0lfSUZBQ0VfTkFNRSB8IElTQ1NJX0lOSVRJQVRPUl9OQU1FLAotCS5ob3N0X3BhcmFtX21hc2sgPSBJU0NTSV9IT1NUX0hXQUREUkVTUyB8IElTQ1NJX0hPU1RfSVBBRERSRVNTIHwKLQkJCQlJU0NTSV9IT1NUX0lOSVRJQVRPUl9OQU1FLAogCS5jcmVhdGVfc2Vzc2lvbiA9IGJlaXNjc2lfc2Vzc2lvbl9jcmVhdGUsCiAJLmRlc3Ryb3lfc2Vzc2lvbiA9IGJlaXNjc2lfc2Vzc2lvbl9kZXN0cm95LAogCS5jcmVhdGVfY29ubiA9IGJlaXNjc2lfY29ubl9jcmVhdGUsCiAJLmJpbmRfY29ubiA9IGJlaXNjc2lfY29ubl9iaW5kLAogCS5kZXN0cm95X2Nvbm4gPSBpc2NzaV9jb25uX3RlYXJkb3duLAorCS5hdHRyX2lzX3Zpc2libGUgPSBiZTJpc2NzaV9hdHRyX2lzX3Zpc2libGUsCiAJLnNldF9wYXJhbSA9IGJlaXNjc2lfc2V0X3BhcmFtLAogCS5nZXRfY29ubl9wYXJhbSA9IGlzY3NpX2Nvbm5fZ2V0X3BhcmFtLAogCS5nZXRfc2Vzc2lvbl9wYXJhbSA9IGlzY3NpX3Nlc3Npb25fZ2V0X3BhcmFtLApAQCAtNDQxOCw2ICs0NDQwLDcgQEAKIAkubmFtZSA9IERSVl9OQU1FLAogCS5wcm9iZSA9IGJlaXNjc2lfZGV2X3Byb2JlLAogCS5yZW1vdmUgPSBiZWlzY3NpX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBiZWlzY3NpX3NodXRkb3duLAogCS5pZF90YWJsZSA9IGJlaXNjc2lfcGNpX2lkX3RhYmxlCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaAppbmRleCA1Y2U1MTcwLi5iNGEwNmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmgKQEAgLTM0LDcgKzM0LDcgQEAKIAogI2luY2x1ZGUgImJlLmgiCiAjZGVmaW5lIERSVl9OQU1FCQkiYmUyaXNjc2kiCi0jZGVmaW5lIEJVSUxEX1NUUgkJIjIuMTAzLjI5OC4wIgorI2RlZmluZSBCVUlMRF9TVFIJCSI0LjEuMjM5LjAiCiAjZGVmaW5lIEJFX05BTUUJCQkiU2VydmVyRW5naW5lcyBCbGFkZUVuZ2luZTIiIFwKIAkJCQkiTGludXggaVNDU0kgRHJpdmVyIHZlcnNpb24iIEJVSUxEX1NUUgogI2RlZmluZSBEUlZfREVTQwkJQkVfTkFNRSAiICIgIkRyaXZlciIKQEAgLTE2Miw2ICsxNjIsOCBAQAogI2RlZmluZSBQQUdFU19SRVFVSVJFRCh4KSBcCiAJKCh4IDwgUEFHRV9TSVpFKSA/IDEgOiAgKCh4ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkUpKQogCisjZGVmaW5lIEJFSVNDU0lfTVNJX05BTUUgMjAgLyogc2l6ZSBvZiBtc2lfbmFtZSBzdHJpbmcgKi8KKwogZW51bSBiZV9tZW1fZW51bSB7CiAJSFdJX01FTV9BREROX0NPTlRFWFQsCiAJSFdJX01FTV9XUkIsCkBAIC0yODcsNiArMjg5LDcgQEAKIAl1bnNpZ25lZCBpbnQgbnVtX2NwdXM7CiAJdW5zaWduZWQgaW50IG54dF9jcWlkOwogCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tNQVhfQ1BVUyArIDFdOworCWNoYXIgKm1zaV9uYW1lW01BWF9DUFVTICsgMV07CiAJYm9vbCBtc2l4X2VuYWJsZWQ7CiAJc3RydWN0IGJlX21lbV9kZXNjcmlwdG9yICppbml0X21lbTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2RlYnVnZnMuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kZWJ1Z2ZzLmMKaW5kZXggYjQxMmUwMy4uZGVlMWEwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZGVidWdmcy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImJmYWRfZHJ2LmgiCiAjaW5jbHVkZSAiYmZhZF9pbS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYwppbmRleCAwMTMxMjM4Li5lNWRiNjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYwpAQCAtMTksNiArMTksOCBAQAogICogIGJmYWRfaW0uYyBMaW51eCBkcml2ZXIgSU0gbW9kdWxlLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKwogI2luY2x1ZGUgImJmYWRfZHJ2LmgiCiAjaW5jbHVkZSAiYmZhZF9pbS5oIgogI2luY2x1ZGUgImJmYV9mY3MuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmggYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oCmluZGV4IGRkMzM1YTIuLjA0OWVhOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaApAQCAtNjIsNyArNjIsNyBAQAogI2luY2x1ZGUgImJueDJmY19jb25zdGFudHMuaCIKIAogI2RlZmluZSBCTlgyRkNfTkFNRQkJImJueDJmYyIKLSNkZWZpbmUgQk5YMkZDX1ZFUlNJT04JCSIxLjAuNCIKKyNkZWZpbmUgQk5YMkZDX1ZFUlNJT04JCSIxLjAuOSIKIAogI2RlZmluZSBQRlgJCQkiYm54MmZjOiAiCiAKQEAgLTE0NSw2ICsxNDUsOSBAQAogI2RlZmluZSBSRUNfUkVUUllfQ09VTlQJCQkxCiAjZGVmaW5lIEJOWDJGQ19OVU1fRVJSX0JJVFMJCTYzCiAKKyNkZWZpbmUgQk5YMkZDX1JFTE9HSU5fV0FJVF9USU1FCTIwMAorI2RlZmluZSBCTlgyRkNfUkVMT0dJTl9XQUlUX0NOVAkJMTAKKwogLyogYm54MmZjIGRyaXZlciB1c2VzIG9ubHkgb25lIGluc3RhbmNlIG9mIGZjb2VfcGVyY3B1X3MgKi8KIGV4dGVybiBzdHJ1Y3QgZmNvZV9wZXJjcHVfcyBibngyZmNfZ2xvYmFsOwogCkBAIC0yMjQsNiArMjI3LDcgQEAKIAlzdHJ1Y3QgZmNvZV9jdGxyIGN0bHI7CiAJdTggdmxhbl9lbmFibGVkOwogCWludCB2bGFuX2lkOworCWJvb2wgZW5hYmxlZDsKIH07CiAKICNkZWZpbmUgYm54MmZjX2Zyb21fY3RscihmaXApIGNvbnRhaW5lcl9vZihmaXAsIHN0cnVjdCBibngyZmNfaW50ZXJmYWNlLCBjdGxyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYwppbmRleCBkNjZkY2JkLi5jZTBjZTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYwpAQCAtMjY4LDE3ICsyNjgsNiBAQAogCiAJb3JpZ19pb19yZXEgPSBjYl9hcmctPmFib3J0ZWRfaW9fcmVxOwogCXNycl9yZXEgPSBjYl9hcmctPmlvX3JlcTsKLQlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSU9fQ09NUEwsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgewotCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJzcnJfY29tcGw6IHhpZCAtIDB4JXggY29tcGxldGVkIiwKLQkJCW9yaWdfaW9fcmVxLT54aWQpOwotCQlnb3RvIHNycl9jb21wbF9kb25lOwotCX0KLQlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSVNTVUVfQUJUUywgJm9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpKSB7Ci0JCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgInJlYyBhYnRzIGluIHByb2cgIgotCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAotCQkJb3JpZ19pb19yZXEtPnhpZCk7Ci0JCWdvdG8gc3JyX2NvbXBsX2RvbmU7Ci0JfQogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0ZMQUdfRUxTX1RJTUVPVVQsICZzcnJfcmVxLT5yZXFfZmxhZ3MpKSB7CiAJCS8qIFNSUiB0aW1lZG91dCAqLwogCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJzcnIgdGltZWQgb3V0LCBhYm9ydCAiCkBAIC0yOTAsNiArMjc5LDEyIEBACiAJCQkJImZhaWxlZC4gaXNzdWUgY2xlYW51cFxuIik7CiAJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChzcnJfcmVxKTsKIAkJfQorCQlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSU9fQ09NUEwsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSB8fAorCQkgICAgdGVzdF9iaXQoQk5YMkZDX0ZMQUdfSVNTVUVfQUJUUywgJm9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CisJCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJzcnJfY29tcGw6eGlkIDB4JXggZmxhZ3MgPSAlbHgiLAorCQkJCSAgICAgIG9yaWdfaW9fcmVxLT54aWQsIG9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpOworCQkJZ290byBzcnJfY29tcGxfZG9uZTsKKwkJfQogCQlvcmlnX2lvX3JlcS0+c3JyX3JldHJ5Kys7CiAJCWlmIChvcmlnX2lvX3JlcS0+c3JyX3JldHJ5IDw9IFNSUl9SRVRSWV9DT1VOVCkgewogCQkJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gb3JpZ19pb19yZXEtPnRndDsKQEAgLTMxMSw2ICszMDYsMTIgQEAKIAkJfQogCQlnb3RvIHNycl9jb21wbF9kb25lOwogCX0KKwlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSU9fQ09NUEwsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChCTlgyRkNfRkxBR19JU1NVRV9BQlRTLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKKwkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyX2NvbXBsOnhpZCAtIDB4JXggZmxhZ3MgPSAlbHgiLAorCQkJICAgICAgb3JpZ19pb19yZXEtPnhpZCwgb3JpZ19pb19yZXEtPnJlcV9mbGFncyk7CisJCWdvdG8gc3JyX2NvbXBsX2RvbmU7CisJfQogCW1wX3JlcSA9ICYoc3JyX3JlcS0+bXBfcmVxKTsKIAlmY19oZHIgPSAmKG1wX3JlcS0+cmVzcF9mY19oZHIpOwogCXJlc3BfbGVuID0gbXBfcmVxLT5yZXNwX2xlbjsKQEAgLTM5MSwxOCArMzkyLDYgQEAKIAlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJyZWNfY29tcGw6IG9yaWcgeGlkID0gMHgleCIsIG9yaWdfaW9fcmVxLT54aWQpOwogCXRndCA9IG9yaWdfaW9fcmVxLT50Z3Q7CiAKLQlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSU9fQ09NUEwsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgewotCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJjb21wbGV0ZWQiCi0JCSAgICAgICAib3JpZ19pbyAtIDB4JXhcbiIsCi0JCQlvcmlnX2lvX3JlcS0+eGlkKTsKLQkJZ290byByZWNfY29tcGxfZG9uZTsKLQl9Ci0JaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lTU1VFX0FCVFMsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgewotCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJhYnRzIGluIHByb2cgIgotCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAotCQkJb3JpZ19pb19yZXEtPnhpZCk7Ci0JCWdvdG8gcmVjX2NvbXBsX2RvbmU7Ci0JfQogCS8qIEhhbmRsZSBSRUMgdGltZW91dCBjYXNlICovCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfRkxBR19FTFNfVElNRU9VVCwgJnJlY19yZXEtPnJlcV9mbGFncykpIHsKIAkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAidGltZWQgb3V0LCBhYm9ydCAiCkBAIC00MzMsNiArNDIyLDIwIEBACiAJCX0KIAkJZ290byByZWNfY29tcGxfZG9uZTsKIAl9CisKKwlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSU9fQ09NUEwsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgeworCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJjb21wbGV0ZWQiCisJCSAgICAgICAib3JpZ19pbyAtIDB4JXhcbiIsCisJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJZ290byByZWNfY29tcGxfZG9uZTsKKwl9CisJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lTU1VFX0FCVFMsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgeworCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJhYnRzIGluIHByb2cgIgorCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAorCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCWdvdG8gcmVjX2NvbXBsX2RvbmU7CisJfQorCiAJbXBfcmVxID0gJihyZWNfcmVxLT5tcF9yZXEpOwogCWZjX2hkciA9ICYobXBfcmVxLT5yZXNwX2ZjX2hkcik7CiAJcmVzcF9sZW4gPSBtcF9yZXEtPnJlc3BfbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCmluZGV4IDgyMGExODQuLjhjNjE1NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibngyZmMiCiAjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTglCTlgyRkNfVkVSU0lPTgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1biAyMywgMjAxMSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJPY3QgMjEsIDIwMTEiCiAKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQpAQCAtNTYsNiArNTYsNyBAQAogc3RhdGljIHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSBibngyZmNfdHJhbnNwb3J0X2Z1bmN0aW9uOwogc3RhdGljIHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSBibngyZmNfdnBvcnRfeHBvcnRfZnVuY3Rpb247CiBzdGF0aWMgaW50IGJueDJmY19jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgZW51bSBmaXBfc3RhdGUgZmlwX21vZGUpOworc3RhdGljIHZvaWQgX19ibngyZmNfZGVzdHJveShzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKIHN0YXRpYyBpbnQgYm54MmZjX2Rlc3Ryb3koc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXZpY2UpOwogc3RhdGljIGludCBibngyZmNfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogc3RhdGljIGludCBibngyZmNfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKQEAgLTY0LDcgKzY1LDYgQEAKIAogc3RhdGljIHZvaWQgYm54MmZjX3N0YXJ0X2Rpc2Moc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSk7CiBzdGF0aWMgaW50IGJueDJmY19zaG9zdF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGRldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgYm54MmZjX25ldF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscCk7CiBzdGF0aWMgaW50IGJueDJmY19scG9ydF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCk7CiBzdGF0aWMgaW50IGJueDJmY19lbV9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCk7CiBzdGF0aWMgaW50IGJueDJmY19iaW5kX2FkYXB0ZXJfZGV2aWNlcyhzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKQEAgLTc4LDYgKzc4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYm54MmZjX2hiYSAqYm54MmZjX2hiYV9sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNfZGV2KTsKIHN0YXRpYyBzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqYm54MmZjX2ludGVyZmFjZV9sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UKIAkJCQkJCQkqcGh5c19kZXYpOworc3RhdGljIGlubGluZSB2b2lkIGJueDJmY19pbnRlcmZhY2VfcHV0KHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpOwogc3RhdGljIHN0cnVjdCBibngyZmNfaGJhICpibngyZmNfZmluZF9oYmFfZm9yX2NuaWMoc3RydWN0IGNuaWNfZGV2ICpjbmljKTsKIAogc3RhdGljIGludCBibngyZmNfZndfaW5pdChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKQEAgLTk4LDYgKzk5LDI1IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBibngyZmNfY3B1X2NhbGxiYWNrLAogfTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqYm54MmZjX25ldGRldihjb25zdCBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXJldHVybiAoKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICopCisJCSgoc3RydWN0IGZjb2VfcG9ydCAqKWxwb3J0X3ByaXYobHBvcnQpKS0+cHJpdiktPm5ldGRldjsKK30KKworLyoqCisgKiBibngyZmNfZ2V0X2xlc2IoKSAtIEZpbGwgdGhlIEZDb0UgTGluayBFcnJvciBTdGF0dXMgQmxvY2sKKyAqIEBscG9ydDogdGhlIGxvY2FsIHBvcnQKKyAqIEBmY19sZXNiOiB0aGUgbGluayBlcnJvciBzdGF0dXMgYmxvY2sKKyAqLworc3RhdGljIHZvaWQgYm54MmZjX2dldF9sZXNiKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCisJCQkgICAgc3RydWN0IGZjX2Vsc19sZXNiICpmY19sZXNiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBibngyZmNfbmV0ZGV2KGxwb3J0KTsKKworCV9fZmNvZV9nZXRfbGVzYihscG9ydCwgZmNfbGVzYiwgbmV0ZGV2KTsKK30KKwogc3RhdGljIHZvaWQgYm54MmZjX2NsZWFuX3J4X3F1ZXVlKHN0cnVjdCBmY19scG9ydCAqbHApCiB7CiAJc3RydWN0IGZjb2VfcGVyY3B1X3MgKmJnOwpAQCAtNTQ1LDYgKzU2NSwxNCBAQAogCQkJYnJlYWs7CiAJCX0KIAl9CisKKwlpZiAoZmgtPmZoX3JfY3RsID09IEZDX1JDVExfQkFfQUJUUykgeworCQkvKiBEcm9wIGluY29taW5nIEFCVFMgKi8KKwkJcHV0X2NwdSgpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwogCWlmIChsZTMyX3RvX2NwdShmcl9jcmMoZnApKSAhPQogCQkJfmNyYzMyKH4wLCBza2ItPmRhdGEsIGZyX2xlbikpIHsKIAkJaWYgKHN0YXRzLT5JbnZhbGlkQ1JDQ291bnQgPCA1KQpAQCAtNzI3LDcgKzc1NSw3IEBACiAJCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX0xJTktfRE9XTiwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CiB9CiAKLXN0YXRpYyBpbnQgYm54MmZjX25ldF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3N0YXRpYyBpbnQgYm54MmZjX25ldF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwogCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CkBAIC03NTMsMTEgKzc4MSwxNiBAQAogCWJueDJmY19saW5rX3NwZWVkX3VwZGF0ZShscG9ydCk7CiAKIAlpZiAoIWxwb3J0LT52cG9ydCkgewotCQl3d25uID0gZmNvZV93d25fZnJvbV9tYWMoaW50ZXJmYWNlLT5jdGxyLmN0bF9zcmNfYWRkciwgMSwgMCk7CisJCWlmIChmY29lX2dldF93d24obmV0ZGV2LCAmd3dubiwgTkVUREVWX0ZDT0VfV1dOTikpCisJCQl3d25uID0gZmNvZV93d25fZnJvbV9tYWMoaW50ZXJmYWNlLT5jdGxyLmN0bF9zcmNfYWRkciwKKwkJCQkJCSAxLCAwKTsKIAkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJXV05OID0gMHglbGx4XG4iLCB3d25uKTsKIAkJZmNfc2V0X3d3bm4obHBvcnQsIHd3bm4pOwogCi0JCXd3cG4gPSBmY29lX3d3bl9mcm9tX21hYyhpbnRlcmZhY2UtPmN0bHIuY3RsX3NyY19hZGRyLCAyLCAwKTsKKwkJaWYgKGZjb2VfZ2V0X3d3bihuZXRkZXYsICZ3d3BuLCBORVRERVZfRkNPRV9XV1BOKSkKKwkJCXd3cG4gPSBmY29lX3d3bl9mcm9tX21hYyhpbnRlcmZhY2UtPmN0bHIuY3RsX3NyY19hZGRyLAorCQkJCQkJIDIsIDApOworCiAJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiV1dQTiA9IDB4JWxseFxuIiwgd3dwbik7CiAJCWZjX3NldF93d3BuKGxwb3J0LCB3d3BuKTsKIAl9CkBAIC03NjksOCArODAyLDggQEAKIHsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gKHN0cnVjdCBibngyZmNfaGJhICopZGF0YTsKIAotCUJOWDJGQ19NSVNDX0RCRygiRVJST1I6Ym54MmZjX2Rlc3Ryb3lfdGltZXIgLSAiCi0JCSAgICJEZXN0cm95IGNvbXBsIG5vdCByZWNlaXZlZCEhXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUjpibngyZmNfZGVzdHJveV90aW1lciAtICIKKwkgICAgICAgIkRlc3Ryb3kgY29tcGwgbm90IHJlY2VpdmVkISFcbiIpOwogCXNldF9iaXQoQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMLCAmaGJhLT5mbGFncyk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZoYmEtPmRlc3Ryb3lfd2FpdCk7CiB9CkBAIC03ODMsNyArODE2LDcgQEAKICAqIEB2bGFuX2lkOgl2bGFuIGlkIC0gYXNzb2NpYXRlZCB2bGFuIGlkIHdpdGggdGhpcyBldmVudAogICoKICAqIEhhbmRsZXMgTkVUREVWX1VQLCBORVRERVZfRE9XTiwgTkVUREVWX0dPSU5HX0RPV04sTkVUREVWX0NIQU5HRSBhbmQKLSAqIE5FVERFVl9DSEFOR0VfTVRVIGV2ZW50cworICogTkVUREVWX0NIQU5HRV9NVFUgZXZlbnRzLiBIYW5kbGUgTkVUREVWX1VOUkVHSVNURVIgb25seSBmb3IgdmxhbnMuCiAgKi8KIHN0YXRpYyB2b2lkIGJueDJmY19pbmRpY2F0ZV9uZXRldmVudCh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBsb25nIGV2ZW50LAogCQkJCSAgICAgdTE2IHZsYW5faWQpCkBAIC03OTEsMTIgKzgyNCwxMSBAQAogCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSAoc3RydWN0IGJueDJmY19oYmEgKiljb250ZXh0OwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJc3RydWN0IGZjX2xwb3J0ICp2cG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UsICp0bXA7CiAJaW50IHdhaXRfZm9yX3VwbG9hZCA9IDA7CiAJdTMyIGxpbmtfcG9zc2libGUgPSAxOwogCi0JLyogSWdub3JlIHZsYW5zIGZvciBub3cgKi8KLQlpZiAodmxhbl9pZCAhPSAwKQorCWlmICh2bGFuX2lkICE9IDAgJiYgZXZlbnQgIT0gTkVUREVWX1VOUkVHSVNURVIpCiAJCXJldHVybjsKIAogCXN3aXRjaCAoZXZlbnQpIHsKQEAgLTgyMCw2ICs4NTIsMTggQEAKIAljYXNlIE5FVERFVl9DSEFOR0U6CiAJCWJyZWFrOwogCisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKwkJaWYgKCF2bGFuX2lkKQorCQkJcmV0dXJuOworCQltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW50ZXJmYWNlLCB0bXAsICZpZl9saXN0LCBsaXN0KSB7CisJCQlpZiAoaW50ZXJmYWNlLT5oYmEgPT0gaGJhICYmCisJCQkgICAgaW50ZXJmYWNlLT52bGFuX2lkID09ICh2bGFuX2lkICYgVkxBTl9WSURfTUFTSykpCisJCQkJX19ibngyZmNfZGVzdHJveShpbnRlcmZhY2UpOworCQl9CisJCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKKwkJcmV0dXJuOworCiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5rb253biBuZXRldmVudCAlbGQiLCBldmVudCk7CiAJCXJldHVybjsKQEAgLTgzOCw4ICs4ODIsMTUgQEAKIAkJYm54MmZjX2xpbmtfc3BlZWRfdXBkYXRlKGxwb3J0KTsKIAogCQlpZiAobGlua19wb3NzaWJsZSAmJiAhYm54MmZjX2xpbmtfb2sobHBvcnQpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImluZGljYXRlX25ldGV2ZW50OiBjdGxyX2xpbmtfdXBcbiIpOwotCQkJZmNvZV9jdGxyX2xpbmtfdXAoJmludGVyZmFjZS0+Y3Rscik7CisJCQkvKiBSZXNldCBtYXggcmVjdiBmcmFtZSBzaXplIHRvIGRlZmF1bHQgKi8KKwkJCWZjX3NldF9tZnMobHBvcnQsIEJOWDJGQ19NRlMpOworCQkJLyoKKwkJCSAqIGN0bHIgbGluayB1cCB3aWxsIG9ubHkgYmUgaGFuZGxlZCBkdXJpbmcKKwkJCSAqIGVuYWJsZSB0byBhdm9pZCBzZW5kaW5nIGRpc2NvdmVyeSBzb2xpY2l0YXRpb24KKwkJCSAqIG9uIGEgc3RhbGUgdmxhbgorCQkJICovCisJCQlpZiAoaW50ZXJmYWNlLT5lbmFibGVkKQorCQkJCWZjb2VfY3Rscl9saW5rX3VwKCZpbnRlcmZhY2UtPmN0bHIpOwogCQl9IGVsc2UgaWYgKGZjb2VfY3Rscl9saW5rX2Rvd24oJmludGVyZmFjZS0+Y3RscikpIHsKIAkJCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZwb3J0LCAmbHBvcnQtPnZwb3J0cywgbGlzdCkKQEAgLTk5NSw2ICsxMDQ2LDE3IEBACiAJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGludGVyZmFjZS0+bmV0ZGV2OwogCXN0cnVjdCBmY19scG9ydCAqdm5fcG9ydDsKKwlpbnQgcmM7CisJY2hhciBidWZbMzJdOworCisJcmMgPSBmY29lX3ZhbGlkYXRlX3Zwb3J0X2NyZWF0ZSh2cG9ydCk7CisJaWYgKHJjKSB7CisJCWZjb2Vfd3duX3RvX3N0cih2cG9ydC0+cG9ydF9uYW1lLCBidWYsIHNpemVvZihidWYpKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRmFpbGVkIHRvIGNyZWF0ZSB2cG9ydCwgIgorCQkgICAgICAgIldXUE4gKDB4JXMpIGFscmVhZHkgZXhpc3RzXG4iLAorCQkgICAgICAgYnVmKTsKKwkJcmV0dXJuIHJjOworCX0KIAogCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZMQUdfRldfSU5JVF9ET05FLCAmaW50ZXJmYWNlLT5oYmEtPmZsYWdzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2biBwb3J0cyBjYW5ub3QgYmUgY3JlYXRlZCBvbiIKQEAgLTEwMjQsMTYgKzEwODYsNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYm54MmZjX2ZyZWVfdnBvcnQoc3RydWN0IGJueDJmY19oYmEgKmhiYSwgc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlzdHJ1Y3QgYm54MmZjX2xwb3J0ICpibHBvcnQsICp0bXA7CisKKwlzcGluX2xvY2tfYmgoJmhiYS0+aGJhX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibHBvcnQsIHRtcCwgJmhiYS0+dnBvcnRzLCBsaXN0KSB7CisJCWlmIChibHBvcnQtPmxwb3J0ID09IGxwb3J0KSB7CisJCQlsaXN0X2RlbCgmYmxwb3J0LT5saXN0KTsKKwkJCWtmcmVlKGJscG9ydCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmhiYS0+aGJhX2xvY2spOworfQorCiBzdGF0aWMgaW50IGJueDJmY192cG9ydF9kZXN0cm95KHN0cnVjdCBmY192cG9ydCAqdnBvcnQpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB2cG9ydF90b19zaG9zdCh2cG9ydCk7CiAJc3RydWN0IGZjX2xwb3J0ICpuX3BvcnQgPSBzaG9zdF9wcml2KHNob3N0KTsKIAlzdHJ1Y3QgZmNfbHBvcnQgKnZuX3BvcnQgPSB2cG9ydC0+ZGRfZGF0YTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdih2bl9wb3J0KTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgZmNfbHBvcnQgKnZfcG9ydDsKKwlib29sIGZvdW5kID0gZmFsc2U7CiAKIAltdXRleF9sb2NrKCZuX3BvcnQtPmxwX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZfcG9ydCwgJm5fcG9ydC0+dnBvcnRzLCBsaXN0KQorCQlpZiAodl9wb3J0LT52cG9ydCA9PSB2cG9ydCkgeworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCWlmICghZm91bmQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZuX3BvcnQtPmxwX211dGV4KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQogCWxpc3RfZGVsKCZ2bl9wb3J0LT5saXN0KTsKIAltdXRleF91bmxvY2soJm5fcG9ydC0+bHBfbXV0ZXgpOworCWJueDJmY19mcmVlX3Zwb3J0KGludGVyZmFjZS0+aGJhLCBwb3J0LT5scG9ydCk7CisJYm54MmZjX3BvcnRfc2h1dGRvd24ocG9ydC0+bHBvcnQpOworCWJueDJmY19pbnRlcmZhY2VfcHV0KGludGVyZmFjZSk7CiAJcXVldWVfd29yayhibngyZmNfd3EsICZwb3J0LT5kZXN0cm95X3dvcmspOwogCXJldHVybiAwOwogfQpAQCAtMTA1NCw3ICsxMTQ2LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGJueDJmY19uZXRkZXZfc2V0dXAoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSkKK3N0YXRpYyBpbnQgYm54MmZjX2ludGVyZmFjZV9zZXR1cChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBpbnRlcmZhY2UtPm5ldGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c2RldiA9IGludGVyZmFjZS0+aGJhLT5waHlzX2RldjsKQEAgLTEyNTIsNyArMTM0NCw3IEBACiAJaW50ZXJmYWNlLT5jdGxyLmdldF9zcmNfYWRkciA9IGJueDJmY19nZXRfc3JjX21hYzsKIAlzZXRfYml0KEJOWDJGQ19DVExSX0lOSVRfRE9ORSwgJmludGVyZmFjZS0+aWZfZmxhZ3MpOwogCi0JcmMgPSBibngyZmNfbmV0ZGV2X3NldHVwKGludGVyZmFjZSk7CisJcmMgPSBibngyZmNfaW50ZXJmYWNlX3NldHVwKGludGVyZmFjZSk7CiAJaWYgKCFyYykKIAkJcmV0dXJuIGludGVyZmFjZTsKIApAQCAtMTMxOCw3ICsxNDEwLDcgQEAKIAkJZmNfc2V0X3d3cG4obHBvcnQsIHZwb3J0LT5wb3J0X25hbWUpOwogCX0KIAkvKiBDb25maWd1cmUgbmV0ZGV2IGFuZCBuZXR3b3JraW5nIHByb3BlcnRpZXMgb2YgdGhlIGxwb3J0ICovCi0JcmMgPSBibngyZmNfbmV0X2NvbmZpZyhscG9ydCk7CisJcmMgPSBibngyZmNfbmV0X2NvbmZpZyhscG9ydCwgaW50ZXJmYWNlLT5uZXRkZXYpOwogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJFcnJvciBvbiBibngyZmNfbmV0X2NvbmZpZ1xuIik7CiAJCWdvdG8gbHBfY29uZmlnX2VycjsKQEAgLTEzNzIsNyArMTQ2NCw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJmY19uZXRkZXZfY2xlYW51cChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQorc3RhdGljIHZvaWQgYm54MmZjX25ldF9jbGVhbnVwKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7CiAJLyogRG9udCBsaXN0ZW4gZm9yIEV0aGVybmV0IHBhY2tldHMgYW55bW9yZSAqLwogCV9fZGV2X3JlbW92ZV9wYWNrKCZpbnRlcmZhY2UtPmZjb2VfcGFja2V0X3R5cGUpOwpAQCAtMTM4MCwxMCArMTQ3MiwxMSBAQAogCXN5bmNocm9uaXplX25ldCgpOwogfQogCi1zdGF0aWMgdm9pZCBibngyZmNfaWZfZGVzdHJveShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQorc3RhdGljIHZvaWQgYm54MmZjX2ludGVyZmFjZV9jbGVhbnVwKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19scG9ydCAqYmxwb3J0LCAqdG1wOworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAogCS8qIFN0b3AgdGhlIHRyYW5zbWl0IHJldHJ5IHRpbWVyICovCiAJZGVsX3RpbWVyX3N5bmMoJnBvcnQtPnRpbWVyKTsKQEAgLTEzOTEsNiArMTQ4NCwxNCBAQAogCS8qIEZyZWUgZXhpc3RpbmcgdHJhbnNtaXQgc2ticyAqLwogCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShscG9ydCk7CiAKKwlibngyZmNfbmV0X2NsZWFudXAoaW50ZXJmYWNlKTsKKworCWJueDJmY19mcmVlX3Zwb3J0KGhiYSwgbHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBibngyZmNfaWZfZGVzdHJveShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCiAJLyogRnJlZSBxdWV1ZWQgcGFja2V0cyBmb3IgdGhlIHJlY2VpdmUgdGhyZWFkICovCiAJYm54MmZjX2NsZWFuX3J4X3F1ZXVlKGxwb3J0KTsKIApAQCAtMTQwNywxOSArMTUwOCwyMiBAQAogCS8qIEZyZWUgbWVtb3J5IHVzZWQgYnkgc3RhdGlzdGljYWwgY291bnRlcnMgKi8KIAlmY19scG9ydF9mcmVlX3N0YXRzKGxwb3J0KTsKIAotCXNwaW5fbG9ja19iaCgmaGJhLT5oYmFfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJscG9ydCwgdG1wLCAmaGJhLT52cG9ydHMsIGxpc3QpIHsKLQkJaWYgKGJscG9ydC0+bHBvcnQgPT0gbHBvcnQpIHsKLQkJCWxpc3RfZGVsKCZibHBvcnQtPmxpc3QpOwotCQkJa2ZyZWUoYmxwb3J0KTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmaGJhLT5oYmFfbG9jayk7Ci0KIAkvKiBSZWxlYXNlIFNjc2lfSG9zdCAqLwogCXNjc2lfaG9zdF9wdXQobHBvcnQtPmhvc3QpOwogfQogCitzdGF0aWMgdm9pZCBfX2JueDJmY19kZXN0cm95KHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKKwlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7CisKKwlibngyZmNfaW50ZXJmYWNlX2NsZWFudXAoaW50ZXJmYWNlKTsKKwlibngyZmNfc3RvcChpbnRlcmZhY2UpOworCWxpc3RfZGVsKCZpbnRlcmZhY2UtPmxpc3QpOworCWJueDJmY19pbnRlcmZhY2VfcHV0KGludGVyZmFjZSk7CisJcXVldWVfd29yayhibngyZmNfd3EsICZwb3J0LT5kZXN0cm95X3dvcmspOworfQorCiAvKioKICAqIGJueDJmY19kZXN0cm95IC0gRGVzdHJveSBhIGJueDJmYyBGQ29FIGludGVyZmFjZQogICoKQEAgLTE0MzMsOCArMTUzNyw2IEBACiBzdGF0aWMgaW50IGJueDJmY19kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IE5VTEw7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYTsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCWludCByYyA9IDA7CiAKIAlydG5sX2xvY2soKTsKQEAgLTE0NDcsMTUgKzE1NDksOSBAQAogCQlnb3RvIG5ldGRldl9lcnI7CiAJfQogCi0JaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAKLQlibngyZmNfbmV0ZGV2X2NsZWFudXAoaW50ZXJmYWNlKTsKLQlscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKLQlibngyZmNfc3RvcChpbnRlcmZhY2UpOwotCWxpc3RfZGVsKCZpbnRlcmZhY2UtPmxpc3QpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGludGVyZmFjZS0+dGltZXJfd29ya19xdWV1ZSk7Ci0JYm54MmZjX2ludGVyZmFjZV9wdXQoaW50ZXJmYWNlKTsKLQlibngyZmNfaWZfZGVzdHJveShscG9ydCwgaGJhKTsKKwlfX2JueDJmY19kZXN0cm95KGludGVyZmFjZSk7CiAKIG5ldGRldl9lcnI6CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwpAQCAtMTQ2NywyMiArMTU2MywxMyBAQAogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CiAKIAlwb3J0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY29lX3BvcnQsIGRlc3Ryb3lfd29yayk7CiAJbHBvcnQgPSBwb3J0LT5scG9ydDsKLQlpbnRlcmZhY2UgPSBwb3J0LT5wcml2OwotCWhiYSA9IGludGVyZmFjZS0+aGJhOwogCiAJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJFbnRlcmVkIGJueDJmY19kZXN0cm95X3dvcmtcbiIpOwogCi0JYm54MmZjX3BvcnRfc2h1dGRvd24obHBvcnQpOwotCXJ0bmxfbG9jaygpOwotCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7Ci0JYm54MmZjX2lmX2Rlc3Ryb3kobHBvcnQsIGhiYSk7Ci0JbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwotCXJ0bmxfdW5sb2NrKCk7CisJYm54MmZjX2lmX2Rlc3Ryb3kobHBvcnQpOwogfQogCiBzdGF0aWMgdm9pZCBibngyZmNfdW5iaW5kX2FkYXB0ZXJfZGV2aWNlcyhzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQpAQCAtMTY2MSw2ICsxNzQ4LDcgQEAKIAkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShoYmEtPmRlc3Ryb3lfd2FpdCwKIAkJCQkJdGVzdF9iaXQoQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMLAogCQkJCQkJICZoYmEtPmZsYWdzKSk7CisJCQljbGVhcl9iaXQoQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMLCAmaGJhLT5mbGFncyk7CiAJCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwpAQCAtMTcyMyw3ICsxODExLDcgQEAKIAlscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKIAlCTlgyRkNfSEJBX0RCRyhscG9ydCwgImNhbGxpbmcgZmNfZmFicmljX2xvZ2luXG4iKTsKIAotCWlmICghYm54MmZjX2xpbmtfb2sobHBvcnQpKSB7CisJaWYgKCFibngyZmNfbGlua19vayhscG9ydCkgJiYgaW50ZXJmYWNlLT5lbmFibGVkKSB7CiAJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiY3Rscl9saW5rX3VwXG4iKTsKIAkJZmNvZV9jdGxyX2xpbmtfdXAoJmludGVyZmFjZS0+Y3Rscik7CiAJCWZjX2hvc3RfcG9ydF90eXBlKGxwb3J0LT5ob3N0KSA9IEZDX1BPUlRUWVBFX05QT1JUOwpAQCAtMTczNyw2ICsxODI1LDExIEBACiAJCWlmICgrK3dhaXRfY250ID4gMTIpCiAJCQlicmVhazsKIAl9CisKKwkvKiBSZXNldCBtYXggcmVjZWl2ZSBmcmFtZSBzaXplIHRvIGRlZmF1bHQgKi8KKwlpZiAoZmNfc2V0X21mcyhscG9ydCwgQk5YMkZDX01GUykpCisJCXJldHVybjsKKwogCWZjX2xwb3J0X2luaXQobHBvcnQpOwogCWZjX2ZhYnJpY19sb2dpbihscG9ydCk7CiB9CkBAIC0xODAwLDYgKzE4OTMsNyBAQAogCQlyYyA9IC1FTk9ERVY7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19kaXNhYmxlOiBpbnRlcmZhY2Ugb3IgbHBvcnQgbm90IGZvdW5kXG4iKTsKIAl9IGVsc2UgeworCQlpbnRlcmZhY2UtPmVuYWJsZWQgPSBmYWxzZTsKIAkJZmNvZV9jdGxyX2xpbmtfZG93bigmaW50ZXJmYWNlLT5jdGxyKTsKIAkJZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKGludGVyZmFjZS0+Y3Rsci5scCk7CiAJfQpAQCAtMTgyMiw4ICsxOTE2LDEwIEBACiAJaWYgKCFpbnRlcmZhY2UgfHwgIWludGVyZmFjZS0+Y3Rsci5scCkgewogCQlyYyA9IC1FTk9ERVY7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19lbmFibGU6IGludGVyZmFjZSBvciBscG9ydCBub3QgZm91bmRcbiIpOwotCX0gZWxzZSBpZiAoIWJueDJmY19saW5rX29rKGludGVyZmFjZS0+Y3Rsci5scCkpCisJfSBlbHNlIGlmICghYm54MmZjX2xpbmtfb2soaW50ZXJmYWNlLT5jdGxyLmxwKSkgewogCQlmY29lX2N0bHJfbGlua191cCgmaW50ZXJmYWNlLT5jdGxyKTsKKwkJaW50ZXJmYWNlLT5lbmFibGVkID0gdHJ1ZTsKKwl9CiAKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAJcnRubF91bmxvY2soKTsKQEAgLTE5MjMsNyArMjAxOSw2IEBACiAJaWYgKCFscG9ydCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gY3JlYXRlIGludGVyZmFjZSAoJXMpXG4iLAogCQkJbmV0ZGV2LT5uYW1lKTsKLQkJYm54MmZjX25ldGRldl9jbGVhbnVwKGludGVyZmFjZSk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBpZl9jcmVhdGVfZXJyOwogCX0KQEAgLTE5MzYsOCArMjAzMSwxNSBAQAogCS8qIE1ha2UgdGhpcyBtYXN0ZXIgTl9wb3J0ICovCiAJaW50ZXJmYWNlLT5jdGxyLmxwID0gbHBvcnQ7CiAKKwlpZiAoIWJueDJmY19saW5rX29rKGxwb3J0KSkgeworCQlmY29lX2N0bHJfbGlua191cCgmaW50ZXJmYWNlLT5jdGxyKTsKKwkJZmNfaG9zdF9wb3J0X3R5cGUobHBvcnQtPmhvc3QpID0gRkNfUE9SVFRZUEVfTlBPUlQ7CisJCXNldF9iaXQoQURBUFRFUl9TVEFURV9SRUFEWSwgJmludGVyZmFjZS0+aGJhLT5hZGFwdGVyX3N0YXRlKTsKKwl9CisKIAlCTlgyRkNfSEJBX0RCRyhscG9ydCwgImNyZWF0ZTogU1RBUlQgRElTQ1xuIik7CiAJYm54MmZjX3N0YXJ0X2Rpc2MoaW50ZXJmYWNlKTsKKwlpbnRlcmZhY2UtPmVuYWJsZWQgPSB0cnVlOwogCS8qCiAJICogUmVsZWFzZSBmcm9tIGtyZWZfaW5pdCBpbiBibngyZmNfaW50ZXJmYWNlX3NldHVwLCBvbiBzdWNjZXNzCiAJICogbHBvcnQgc2hvdWxkIGJlIGhvbGRpbmcgYSByZWZlcmVuY2UgdGFrZW4gaW4gYm54MmZjX2lmX2NyZWF0ZQpAQCAtMTk1MSw2ICsyMDUzLDcgQEAKIGlmX2NyZWF0ZV9lcnI6CiAJZGVzdHJveV93b3JrcXVldWUoaW50ZXJmYWNlLT50aW1lcl93b3JrX3F1ZXVlKTsKIGlmcHV0X2VycjoKKwlibngyZmNfbmV0X2NsZWFudXAoaW50ZXJmYWNlKTsKIAlibngyZmNfaW50ZXJmYWNlX3B1dChpbnRlcmZhY2UpOwogbmV0ZGV2X2VycjoKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKQEAgLTIwMTcsNyArMjEyMCw2IEBACiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKIAlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlLCAqdG1wOwotCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAKIAlCTlgyRkNfTUlTQ19EQkcoIkVudGVyZWQgYm54MmZjX3VscF9leGl0XG4iKTsKIApAQCAtMjAzOSwxOCArMjE0MSwxMCBAQAogCWxpc3RfZGVsX2luaXQoJmhiYS0+bGlzdCk7CiAJYWRhcHRlcl9jb3VudC0tOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGludGVyZmFjZSwgdG1wLCAmaWZfbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbnRlcmZhY2UsIHRtcCwgJmlmX2xpc3QsIGxpc3QpCiAJCS8qIGRlc3Ryb3kgbm90IGNhbGxlZCB5ZXQsIG1vdmUgdG8gcXVpZXNjZWQgbGlzdCAqLwotCQlpZiAoaW50ZXJmYWNlLT5oYmEgPT0gaGJhKSB7Ci0JCQlibngyZmNfbmV0ZGV2X2NsZWFudXAoaW50ZXJmYWNlKTsKLQkJCWJueDJmY19zdG9wKGludGVyZmFjZSk7Ci0KLQkJCWxpc3RfZGVsKCZpbnRlcmZhY2UtPmxpc3QpOwotCQkJbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7Ci0JCQlibngyZmNfaW50ZXJmYWNlX3B1dChpbnRlcmZhY2UpOwotCQkJYm54MmZjX2lmX2Rlc3Ryb3kobHBvcnQsIGhiYSk7Ci0JCX0KLQl9CisJCWlmIChpbnRlcmZhY2UtPmhiYSA9PSBoYmEpCisJCQlfX2JueDJmY19kZXN0cm95KGludGVyZmFjZSk7CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCiAJYm54MmZjX3VscF9zdG9wKGhiYSk7CkBAIC0yMTE5LDcgKzIyMTMsNyBAQAogCQkJCSh2b2lkICopcCwKIAkJCQkiYm54MmZjX3RocmVhZC8lZCIsIGNwdSk7CiAJLyogYmluZCB0aHJlYWQgdG8gdGhlIGNwdSAqLwotCWlmIChsaWtlbHkoIUlTX0VSUihwLT5pb3RocmVhZCkpKSB7CisJaWYgKGxpa2VseSghSVNfRVJSKHRocmVhZCkpKSB7CiAJCWt0aHJlYWRfYmluZCh0aHJlYWQsIGNwdSk7CiAJCXAtPmlvdGhyZWFkID0gdGhyZWFkOwogCQl3YWtlX3VwX3Byb2Nlc3ModGhyZWFkKTsKQEAgLTIxMzEsNyArMjIyNSw2IEBACiAJc3RydWN0IGJueDJmY19wZXJjcHVfcyAqcDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRocmVhZDsKIAlzdHJ1Y3QgYm54MmZjX3dvcmsgKndvcmssICp0bXA7Ci0JTElTVF9IRUFEKHdvcmtfbGlzdCk7CiAKIAlCTlgyRkNfTUlTQ19EQkcoImRlc3Ryb3lpbmcgaW8gdGhyZWFkIGZvciBDUFUgJWRcbiIsIGNwdSk7CiAKQEAgLTIxNDMsNyArMjIzNiw3IEBACiAKIAogCS8qIEZyZWUgYWxsIHdvcmsgaW4gdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod29yaywgdG1wLCAmd29ya19saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdvcmssIHRtcCwgJnAtPndvcmtfbGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZ3b3JrLT5saXN0KTsKIAkJYm54MmZjX3Byb2Nlc3NfY3FfY29tcGwod29yay0+dGd0LCB3b3JrLT53cWUpOwogCQlrZnJlZSh3b3JrKTsKQEAgLTIzNzYsNiArMjQ2OSw3IEBACiAJLnZwb3J0X2NyZWF0ZSA9IGJueDJmY192cG9ydF9jcmVhdGUsCiAJLnZwb3J0X2RlbGV0ZSA9IGJueDJmY192cG9ydF9kZXN0cm95LAogCS52cG9ydF9kaXNhYmxlID0gYm54MmZjX3Zwb3J0X2Rpc2FibGUsCisJLmJzZ19yZXF1ZXN0ID0gZmNfbHBvcnRfYnNnX3JlcXVlc3QsCiB9OwogCiBzdGF0aWMgc3RydWN0IGZjX2Z1bmN0aW9uX3RlbXBsYXRlIGJueDJmY192cG9ydF94cG9ydF9mdW5jdGlvbiA9IHsKQEAgLTI0MDksNiArMjUwMyw3IEBACiAJLmdldF9mY19ob3N0X3N0YXRzID0gZmNfZ2V0X2hvc3Rfc3RhdHMsCiAJLmlzc3VlX2ZjX2hvc3RfbGlwID0gYm54MmZjX2Zjb2VfcmVzZXQsCiAJLnRlcm1pbmF0ZV9ycG9ydF9pbyA9IGZjX3Jwb3J0X3Rlcm1pbmF0ZV9pbywKKwkuYnNnX3JlcXVlc3QgPSBmY19scG9ydF9ic2dfcmVxdWVzdCwKIH07CiAKIC8qKgpAQCAtMjQzOCw2ICsyNTMzLDcgQEAKIAkuZWxzY3Rfc2VuZAkJPSBibngyZmNfZWxzY3Rfc2VuZCwKIAkuZmNwX2Fib3J0X2lvCQk9IGJueDJmY19hYm9ydF9pbywKIAkuZmNwX2NsZWFudXAJCT0gYm54MmZjX2NsZWFudXAsCisJLmdldF9sZXNiCQk9IGJueDJmY19nZXRfbGVzYiwKIAkucnBvcnRfZXZlbnRfY2FsbGJhY2sJPSBibngyZmNfcnBvcnRfZXZlbnRfaGFuZGxlciwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMKaW5kZXggNzJjZmIxNC4uMTkyM2EyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMKQEAgLTEwMDksNiArMTAwOSw3IEBACiAJdTMyIGNxX2NvbnM7CiAJc3RydWN0IGZjb2VfY3FlICpjcWU7CiAJdTMyIG51bV9mcmVlX3NxZXMgPSAwOworCXUzMiBudW1fY3FlcyA9IDA7CiAJdTE2IHdxZTsKIAogCS8qCkBAIC0xMDU4LDEwICsxMDU5LDExIEBACiAJCQkJd2FrZV91cF9wcm9jZXNzKGZwcy0+aW90aHJlYWQpOwogCQkJZWxzZQogCQkJCWJueDJmY19wcm9jZXNzX2NxX2NvbXBsKHRndCwgd3FlKTsKKwkJCW51bV9mcmVlX3NxZXMrKzsKIAkJfQogCQljcWUrKzsKIAkJdGd0LT5jcV9jb25zX2lkeCsrOwotCQludW1fZnJlZV9zcWVzKys7CisJCW51bV9jcWVzKys7CiAKIAkJaWYgKHRndC0+Y3FfY29uc19pZHggPT0gQk5YMkZDX0NRX1dRRVNfTUFYKSB7CiAJCQl0Z3QtPmNxX2NvbnNfaWR4ID0gMDsKQEAgLTEwNzAsOCArMTA3MiwxMCBAQAogCQkJCTEgLSB0Z3QtPmNxX2N1cnJfdG9nZ2xlX2JpdDsKIAkJfQogCX0KLQlpZiAobnVtX2ZyZWVfc3FlcykgewotCQlibngyZmNfYXJtX2NxKHRndCk7CisJaWYgKG51bV9jcWVzKSB7CisJCS8qIEFybSBDUSBvbmx5IGlmIGRvb3JiZWxsIGlzIG1hcHBlZCAqLworCQlpZiAodGd0LT5jdHhfYmFzZSkKKwkJCWJueDJmY19hcm1fY3EodGd0KTsKIAkJYXRvbWljX2FkZChudW1fZnJlZV9zcWVzLCAmdGd0LT5mcmVlX3NxZXMpOwogCX0KIAlzcGluX3VubG9ja19iaCgmdGd0LT5jcV9sb2NrKTsKQEAgLTE3MzksMTEgKzE3NDMsMTMgQEAKIAkvKiBJbml0IHN0YXRlIHRvIE5PUk1BTCAqLwogCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PSB0YXNrX3R5cGUgPDwKIAkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UQVNLX1RZUEVfU0hJRlQ7Ci0JaWYgKGRldl90eXBlID09IFRZUEVfVEFQRSkKKwlpZiAoZGV2X3R5cGUgPT0gVFlQRV9UQVBFKSB7CiAJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQogCQkJCUZDT0VfVEFTS19ERVZfVFlQRV9UQVBFIDw8CiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQ7Ci0JZWxzZQorCQlpb19yZXEtPnJlY19yZXRyeSA9IDA7CisJCWlvX3JlcS0+cmVjX3JldHJ5ID0gMDsKKwl9IGVsc2UKIAkJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CiAJCQkJRkNPRV9UQVNLX0RFVl9UWVBFX0RJU0sgPDwKIAkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9ERVZfVFlQRV9TSElGVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCmluZGV4IDZjYzM3ODkuLjg0YTc4YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYwpAQCAtMTcsNyArMTcsNyBAQAogc3RhdGljIGludCBibngyZmNfc3BsaXRfYmQoc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwgdTY0IGFkZHIsIGludCBzZ19sZW4sCiAJCQkgICBpbnQgYmRfaW5kZXgpOwogc3RhdGljIGludCBibngyZmNfbWFwX3NnKHN0cnVjdCBibngyZmNfY21kICppb19yZXEpOwotc3RhdGljIHZvaWQgYm54MmZjX2J1aWxkX2JkX2xpc3RfZnJvbV9zZyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKK3N0YXRpYyBpbnQgYm54MmZjX2J1aWxkX2JkX2xpc3RfZnJvbV9zZyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKIHN0YXRpYyB2b2lkIGJueDJmY191bm1hcF9zZ19saXN0KHN0cnVjdCBibngyZmNfY21kICppb19yZXEpOwogc3RhdGljIHZvaWQgYm54MmZjX2ZyZWVfbXBfcmVzYyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKIHN0YXRpYyB2b2lkIGJueDJmY19wYXJzZV9mY3BfcnNwKHN0cnVjdCBibngyZmNfY21kICppb19yZXEsCkBAIC0xMTAzLDcgKzExMDMsMTAgQEAKIAlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcnAgPSBycG9ydC0+ZGRfZGF0YTsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxOwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhOwogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndDsKKwlpbnQgbG9nb19pc3N1ZWQ7CisJaW50IHdhaXRfY250ID0gMDsKIAlpbnQgcmMgPSBGQUlMRUQ7CiAKIApAQCAtMTE5Miw4ICsxMTk1LDQwIEBACiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZWhfYWJvcnQ6IGlvX3JlcSAoeGlkID0gMHgleCkgIgogCQkJCSJhbHJlYWR5IGluIGFidHMgcHJvY2Vzc2luZ1xuIiwgaW9fcmVxLT54aWQpOworCQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmaW9fcmVxLT50aW1lb3V0X3dvcmspKQorCQkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsCisJCQkJIGJueDJmY19jbWRfcmVsZWFzZSk7IC8qIGRyb3AgdGltZXIgaG9sZCAqLworCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChpb19yZXEpOworCisJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpb19yZXEtPnRtX2RvbmUpOworCisJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCWlvX3JlcS0+d2FpdF9mb3JfY29tcCA9IDA7CisJCXJkYXRhID0gaW9fcmVxLT50Z3QtPnJkYXRhOworCQlsb2dvX2lzc3VlZCA9IHRlc3RfYW5kX3NldF9iaXQoQk5YMkZDX0ZMQUdfRVhQTF9MT0dPLAorCQkJCQkgICAgICAgJnRndC0+ZmxhZ3MpOwogCQlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCisJCWlmICghbG9nb19pc3N1ZWQpIHsKKwkJCUJOWDJGQ19JT19EQkcoaW9fcmVxLCAiRXhwbCBsb2dvIC0gdGd0IGZsYWdzID0gMHglbHhcbiIsCisJCQkJICAgICAgdGd0LT5mbGFncyk7CisJCQltdXRleF9sb2NrKCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKKwkJCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYocmRhdGEpOworCQkJbXV0ZXhfdW5sb2NrKCZscG9ydC0+ZGlzYy5kaXNjX211dGV4KTsKKwkJCWRvIHsKKwkJCQltc2xlZXAoQk5YMkZDX1JFTE9HSU5fV0FJVF9USU1FKTsKKwkJCQkvKgorCQkJCSAqIElmIHNlc3Npb24gbm90IHJlY292ZXJlZCwgbGV0IFNDU0ktbWwKKwkJCQkgKiBlc2NhbGF0ZSBlcnJvciByZWNvdmVyeS4KKwkJCQkgKi8KKwkJCQlpZiAod2FpdF9jbnQrKyA+IEJOWDJGQ19SRUxPR0lOX1dBSVRfQ05UKQorCQkJCQlyZXR1cm4gRkFJTEVEOworCQkJfSB3aGlsZSAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX1NFU1NJT05fUkVBRFksCisJCQkJCSAgICZ0Z3QtPmZsYWdzKSk7CisJCX0KIAkJcmV0dXJuIFNVQ0NFU1M7CiAJfQogCWlmIChyYyA9PSBGQUlMRUQpIHsKQEAgLTEyNTEsNyArMTI4Niw2IEBACiAJCQlzZXFfY2xucF9yZXEtPnhpZCk7CiAJCWdvdG8gZnJlZV9jYl9hcmc7CiAJfQotCWtyZWZfZ2V0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQpOwogCiAJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCXJjID0gYm54MmZjX3NlbmRfc3JyKG9yaWdfaW9fcmVxLCBvZmZzZXQsIHJfY3RsKTsKQEAgLTEyNzYsNiArMTMxMCw4IEBACiAJCSAgIGlvX3JlcS0+cmVmY291bnQucmVmY291bnQuY291bnRlciwgaW9fcmVxLT5jbWRfdHlwZSk7CiAJYm54MmZjX3Njc2lfZG9uZShpb19yZXEsIERJRF9FUlJPUik7CiAJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CisJaWYgKGlvX3JlcS0+d2FpdF9mb3JfY29tcCkKKwkJY29tcGxldGUoJmlvX3JlcS0+dG1fZG9uZSk7CiB9CiAKIHZvaWQgYm54MmZjX3Byb2Nlc3NfYWJ0c19jb21wbChzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxLApAQCAtMTU2OSw2ICsxNjA1LDggQEAKIAogc3RhdGljIGludCBibngyZmNfbWFwX3NnKHN0cnVjdCBibngyZmNfY21kICppb19yZXEpCiB7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IGlvX3JlcS0+cG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IHNjc2lfY21uZCAqc2MgPSBpb19yZXEtPnNjX2NtZDsKIAlzdHJ1Y3QgZmNvZV9iZF9jdHggKmJkID0gaW9fcmVxLT5iZF90YmwtPmJkX3RibDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwpAQCAtMTU4MCw3ICsxNjE4LDggQEAKIAl1NjQgYWRkcjsKIAlpbnQgaTsKIAotCXNnX2NvdW50ID0gc2NzaV9kbWFfbWFwKHNjKTsKKwlzZ19jb3VudCA9IGRtYV9tYXBfc2coJmhiYS0+cGNpZGV2LT5kZXYsIHNjc2lfc2dsaXN0KHNjKSwKKwkJCSAgICAgIHNjc2lfc2dfY291bnQoc2MpLCBzYy0+c2NfZGF0YV9kaXJlY3Rpb24pOwogCXNjc2lfZm9yX2VhY2hfc2coc2MsIHNnLCBzZ19jb3VudCwgaSkgewogCQlzZ19sZW4gPSBzZ19kbWFfbGVuKHNnKTsKIAkJYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKQEAgLTE2MDUsMjAgKzE2NDQsMjQgQEAKIAlyZXR1cm4gYmRfY291bnQ7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJmY19idWlsZF9iZF9saXN0X2Zyb21fc2coc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSkKK3N0YXRpYyBpbnQgYm54MmZjX2J1aWxkX2JkX2xpc3RfZnJvbV9zZyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKnNjID0gaW9fcmVxLT5zY19jbWQ7CiAJc3RydWN0IGZjb2VfYmRfY3R4ICpiZCA9IGlvX3JlcS0+YmRfdGJsLT5iZF90Ymw7CiAJaW50IGJkX2NvdW50OwogCi0JaWYgKHNjc2lfc2dfY291bnQoc2MpKQorCWlmIChzY3NpX3NnX2NvdW50KHNjKSkgewogCQliZF9jb3VudCA9IGJueDJmY19tYXBfc2coaW9fcmVxKTsKLQllbHNlIHsKKwkJaWYgKGJkX2NvdW50ID09IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgewogCQliZF9jb3VudCA9IDA7CiAJCWJkWzBdLmJ1Zl9hZGRyX2xvID0gYmRbMF0uYnVmX2FkZHJfaGkgPSAwOwogCQliZFswXS5idWZfbGVuID0gYmRbMF0uZmxhZ3MgPSAwOwogCX0KIAlpb19yZXEtPmJkX3RibC0+YmRfdmFsaWQgPSBiZF9jb3VudDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBibngyZmNfdW5tYXBfc2dfbGlzdChzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKQpAQCAtMTc5MCwxMiArMTgzMyw2IEBACiAJdGd0ID0gKHN0cnVjdCBibngyZmNfcnBvcnQgKikmcnBbMV07CiAKIAlpZiAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX1NFU1NJT05fUkVBRFksICZ0Z3QtPmZsYWdzKSkgewotCQlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfVVBMRF9SRVFfQ09NUEwsICZ0Z3QtPmZsYWdzKSkgIHsKLQkJCXNjX2NtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7Ci0JCQlzY19jbWQtPnNjc2lfZG9uZShzY19jbWQpOwotCQkJcmV0dXJuIDA7Ci0KLQkJfQogCQkvKgogCQkgKiBTZXNzaW9uIGlzIG5vdCBvZmZsb2FkZWQgeWV0LiBMZXQgU0NTSS1tbCByZXRyeQogCQkgKiB0aGUgY29tbWFuZC4KQEAgLTE5NDYsNyArMTk4MywxMyBAQAogCXhpZCA9IGlvX3JlcS0+eGlkOwogCiAJLyogQnVpbGQgYnVmZmVyIGRlc2NyaXB0b3IgbGlzdCBmb3IgZmlybXdhcmUgZnJvbSBzZyBsaXN0ICovCi0JYm54MmZjX2J1aWxkX2JkX2xpc3RfZnJvbV9zZyhpb19yZXEpOworCWlmIChibngyZmNfYnVpbGRfYmRfbGlzdF9mcm9tX3NnKGlvX3JlcSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQkQgbGlzdCBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CiAKIAl0YXNrX2lkeCA9IHhpZCAvIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKIAlpbmRleCA9IHhpZCAlIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKaW5kZXggZDUzMTFiNS4uYzE4MDBiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKQEAgLTc2LDcgKzc2LDcgQEAKIAlpZiAocnZhbCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gYWxsb2NhdGUgY29ubiBpZCBmb3IgIgogCQkJInBvcnRfaWQgKCU2eClcbiIsIHJwb3J0LT5wb3J0X2lkKTsKLQkJZ290byBvZmxkX2VycjsKKwkJZ290byB0Z3RfaW5pdF9lcnI7CiAJfQogCiAJLyogQWxsb2NhdGUgc2Vzc2lvbiByZXNvdXJjZXMgKi8KQEAgLTEzNCwxOCArMTM0LDE3IEBACiAJCS8qIHVwbG9hZCB3aWxsIHRha2UgY2FyZSBvZiBjbGVhbmluZyB1cCBzZXNzIHJlc2MgKi8KIAkJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihyZGF0YSk7CiAJfQotCS8qIEFybSBDUSAqLwotCWJueDJmY19hcm1fY3EodGd0KTsKIAlyZXR1cm47CiAKIG9mbGRfZXJyOgogCS8qIGNvdWxkbid0IG9mZmxvYWQgdGhlIHNlc3Npb24uIGxvZyBvZmYgZnJvbSB0aGlzIHJwb3J0ICovCiAJQk5YMkZDX1RHVF9EQkcodGd0LCAiYm54MmZjX29mZmxvYWRfc2Vzc2lvbiAtIG9mZmxvYWQgZXJyb3JcbiIpOwotCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYocmRhdGEpOwogCS8qIEZyZWUgc2Vzc2lvbiByZXNvdXJjZXMgKi8KIAlibngyZmNfZnJlZV9zZXNzaW9uX3Jlc2MoaGJhLCB0Z3QpOwordGd0X2luaXRfZXJyOgogCWlmICh0Z3QtPmZjb2VfY29ubl9pZCAhPSAtMSkKIAkJYm54MmZjX2ZyZWVfY29ubl9pZChoYmEsIHRndC0+ZmNvZV9jb25uX2lkKTsKKwlscG9ydC0+dHQucnBvcnRfbG9nb2ZmKHJkYXRhKTsKIH0KIAogdm9pZCBibngyZmNfZmx1c2hfYWN0aXZlX2lvcyhzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpCkBAIC02MjQsNyArNjIzLDYgQEAKIAkvKiBjYWxsZWQgd2l0aCBoYmEgbXV0ZXggaGVsZCAqLwogCXNwaW5fbG9ja19iaCgmaGJhLT5oYmFfbG9jayk7CiAJaGJhLT50Z3Rfb2ZsZF9saXN0W2Nvbm5faWRdID0gTlVMTDsKLQloYmEtPm5leHRfY29ubl9pZCA9IGNvbm5faWQ7CiAJc3Bpbl91bmxvY2tfYmgoJmhiYS0+aGJhX2xvY2spOwogfQogCkBAIC03OTEsOCArNzg5LDYgQEAKIAlyZXR1cm4gMDsKIAogbWVtX2FsbG9jX2ZhaWx1cmU6Ci0JYm54MmZjX2ZyZWVfc2Vzc2lvbl9yZXNjKGhiYSwgdGd0KTsKLQlibngyZmNfZnJlZV9jb25uX2lkKGhiYSwgdGd0LT5mY29lX2Nvbm5faWQpOwogCXJldHVybiAtRU5PTUVNOwogfQogCkBAIC04MDcsMTQgKzgwMywxNCBAQAogc3RhdGljIHZvaWQgYm54MmZjX2ZyZWVfc2Vzc2lvbl9yZXNjKHN0cnVjdCBibngyZmNfaGJhICpoYmEsCiAJCQkJCQlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpCiB7CisJdm9pZCBfX2lvbWVtICpjdHhfYmFzZV9wdHI7CisKIAlCTlgyRkNfVEdUX0RCRyh0Z3QsICJGcmVlaW5nIHVwIHNlc3Npb24gcmVzb3VyY2VzXG4iKTsKIAotCWlmICh0Z3QtPmN0eF9iYXNlKSB7Ci0JCWlvdW5tYXAodGd0LT5jdHhfYmFzZSk7Ci0JCXRndC0+Y3R4X2Jhc2UgPSBOVUxMOwotCX0KLQogCXNwaW5fbG9ja19iaCgmdGd0LT5jcV9sb2NrKTsKKwljdHhfYmFzZV9wdHIgPSB0Z3QtPmN0eF9iYXNlOworCXRndC0+Y3R4X2Jhc2UgPSBOVUxMOworCiAJLyogRnJlZSBMQ1EgKi8KIAlpZiAodGd0LT5sY3EpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+bGNxX21lbV9zaXplLApAQCAtODY4LDQgKzg2NCw3IEBACiAJCXRndC0+c3EgPSBOVUxMOwogCX0KIAlzcGluX3VubG9ja19iaCgmdGd0LT5jcV9sb2NrKTsKKworCWlmIChjdHhfYmFzZV9wdHIpCisJCWlvdW5tYXAoY3R4X2Jhc2VfcHRyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2lzY3NpLmMKaW5kZXggY2ZmZDRkNy4uZDFlNjk3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2lzY3NpLmMKQEAgLTIxNzcsNiArMjE3Nyw1OSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgbW9kZV90IGJueDJpX2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKQoreworCXN3aXRjaCAocGFyYW1fdHlwZSkgeworCWNhc2UgSVNDU0lfSE9TVF9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fTkVUREVWX05BTUU6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9IV0FERFJFU1M6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9JUEFERFJFU1M6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBJU0NTSV9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX1BBUkFNX01BWF9SRUNWX0RMRU5HVEg6CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1hNSVRfRExFTkdUSDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9IRFJER1NUX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0RBVEFER1NUX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0NPTk5fQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9DT05OX1BPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fRVhQX1NUQVRTTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX0FERFJFU1M6CisJCWNhc2UgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9QT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX1BJTkdfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX1JFQ1ZfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX0lOSVRJQUxfUjJUX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9SMlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fSU1NX0RBVEFfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRklSU1RfQlVSU1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX0JVUlNUOgorCQljYXNlIElTQ1NJX1BBUkFNX1BEVV9JTk9SREVSX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0RBVEFTRVFfSU5PUkRFUl9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9FUkw6CisJCWNhc2UgSVNDU0lfUEFSQU1fVEFSR0VUX05BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fVFBHVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9VU0VSTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9QQVNTV09SRDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9VU0VSTkFNRV9JTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QQVNTV09SRF9JTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9GQVNUX0FCT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX0FCT1JUX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9MVV9SRVNFVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fVEdUX1JFU0VUX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JRkFDRV9OQU1FOgorCQljYXNlIElTQ1NJX1BBUkFNX0lOSVRJQVRPUl9OQU1FOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQogCiAvKgogICogJ1Njc2lfSG9zdF9UZW1wbGF0ZScgc3RydWN0dXJlIGFuZCAnaXNjc2lfdHJhbnBvcnQnIHN0cnVjdHVyZSB0ZW1wbGF0ZQpAQCAtMjIwNywzNyArMjI2MCwxMiBAQAogCQkJCSAgQ0FQX01VTFRJX1IyVCB8IENBUF9EQVRBREdTVCB8CiAJCQkJICBDQVBfREFUQV9QQVRIX09GRkxPQUQgfAogCQkJCSAgQ0FQX1RFWFRfTkVHTywKLQkucGFyYW1fbWFzawkJPSBJU0NTSV9NQVhfUkVDVl9ETEVOR1RIIHwKLQkJCQkgIElTQ1NJX01BWF9YTUlUX0RMRU5HVEggfAotCQkJCSAgSVNDU0lfSERSREdTVF9FTiB8Ci0JCQkJICBJU0NTSV9EQVRBREdTVF9FTiB8Ci0JCQkJICBJU0NTSV9JTklUSUFMX1IyVF9FTiB8Ci0JCQkJICBJU0NTSV9NQVhfUjJUIHwKLQkJCQkgIElTQ1NJX0lNTV9EQVRBX0VOIHwKLQkJCQkgIElTQ1NJX0ZJUlNUX0JVUlNUIHwKLQkJCQkgIElTQ1NJX01BWF9CVVJTVCB8Ci0JCQkJICBJU0NTSV9QRFVfSU5PUkRFUl9FTiB8Ci0JCQkJICBJU0NTSV9EQVRBU0VRX0lOT1JERVJfRU4gfAotCQkJCSAgSVNDU0lfRVJMIHwKLQkJCQkgIElTQ1NJX0NPTk5fUE9SVCB8Ci0JCQkJICBJU0NTSV9DT05OX0FERFJFU1MgfAotCQkJCSAgSVNDU0lfRVhQX1NUQVRTTiB8Ci0JCQkJICBJU0NTSV9QRVJTSVNURU5UX1BPUlQgfAotCQkJCSAgSVNDU0lfUEVSU0lTVEVOVF9BRERSRVNTIHwKLQkJCQkgIElTQ1NJX1RBUkdFVF9OQU1FIHwgSVNDU0lfVFBHVCB8Ci0JCQkJICBJU0NTSV9VU0VSTkFNRSB8IElTQ1NJX1BBU1NXT1JEIHwKLQkJCQkgIElTQ1NJX1VTRVJOQU1FX0lOIHwgSVNDU0lfUEFTU1dPUkRfSU4gfAotCQkJCSAgSVNDU0lfRkFTVF9BQk9SVCB8IElTQ1NJX0FCT1JUX1RNTyB8Ci0JCQkJICBJU0NTSV9MVV9SRVNFVF9UTU8gfCBJU0NTSV9UR1RfUkVTRVRfVE1PIHwKLQkJCQkgIElTQ1NJX1BJTkdfVE1PIHwgSVNDU0lfUkVDVl9UTU8gfAotCQkJCSAgSVNDU0lfSUZBQ0VfTkFNRSB8IElTQ1NJX0lOSVRJQVRPUl9OQU1FLAotCS5ob3N0X3BhcmFtX21hc2sJPSBJU0NTSV9IT1NUX0hXQUREUkVTUyB8IElTQ1NJX0hPU1RfSVBBRERSRVNTIHwKLQkJCQkgIElTQ1NJX0hPU1RfTkVUREVWX05BTUUsCiAJLmNyZWF0ZV9zZXNzaW9uCQk9IGJueDJpX3Nlc3Npb25fY3JlYXRlLAogCS5kZXN0cm95X3Nlc3Npb24JPSBibngyaV9zZXNzaW9uX2Rlc3Ryb3ksCiAJLmNyZWF0ZV9jb25uCQk9IGJueDJpX2Nvbm5fY3JlYXRlLAogCS5iaW5kX2Nvbm4JCT0gYm54MmlfY29ubl9iaW5kLAogCS5kZXN0cm95X2Nvbm4JCT0gYm54MmlfY29ubl9kZXN0cm95LAorCS5hdHRyX2lzX3Zpc2libGUJPSBibngyaV9hdHRyX2lzX3Zpc2libGUsCiAJLnNldF9wYXJhbQkJPSBpc2NzaV9zZXRfcGFyYW0sCiAJLmdldF9jb25uX3BhcmFtCQk9IGlzY3NpX2Nvbm5fZ2V0X3BhcmFtLAogCS5nZXRfc2Vzc2lvbl9wYXJhbQk9IGlzY3NpX3Nlc3Npb25fZ2V0X3BhcmFtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2IzaS9jeGdiM2kuYyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiM2kvY3hnYjNpLmMKaW5kZXggMTI0MmM3Yy4uMDAwMjk0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2IzaS9jeGdiM2kuYworKysgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjNpL2N4Z2IzaS5jCkBAIC0xMDUsMjUgKzEwNSw3IEBACiAJLmNhcHMJCT0gQ0FQX1JFQ09WRVJZX0wwIHwgQ0FQX01VTFRJX1IyVCB8IENBUF9IRFJER1NUCiAJCQkJfCBDQVBfREFUQURHU1QgfCBDQVBfRElHRVNUX09GRkxPQUQgfAogCQkJCUNBUF9QQURESU5HX09GRkxPQUQgfCBDQVBfVEVYVF9ORUdPLAotCS5wYXJhbV9tYXNrCT0gSVNDU0lfTUFYX1JFQ1ZfRExFTkdUSCB8IElTQ1NJX01BWF9YTUlUX0RMRU5HVEggfAotCQkJCUlTQ1NJX0hEUkRHU1RfRU4gfCBJU0NTSV9EQVRBREdTVF9FTiB8Ci0JCQkJSVNDU0lfSU5JVElBTF9SMlRfRU4gfCBJU0NTSV9NQVhfUjJUIHwKLQkJCQlJU0NTSV9JTU1fREFUQV9FTiB8IElTQ1NJX0ZJUlNUX0JVUlNUIHwKLQkJCQlJU0NTSV9NQVhfQlVSU1QgfCBJU0NTSV9QRFVfSU5PUkRFUl9FTiB8Ci0JCQkJSVNDU0lfREFUQVNFUV9JTk9SREVSX0VOIHwgSVNDU0lfRVJMIHwKLQkJCQlJU0NTSV9DT05OX1BPUlQgfCBJU0NTSV9DT05OX0FERFJFU1MgfAotCQkJCUlTQ1NJX0VYUF9TVEFUU04gfCBJU0NTSV9QRVJTSVNURU5UX1BPUlQgfAotCQkJCUlTQ1NJX1BFUlNJU1RFTlRfQUREUkVTUyB8Ci0JCQkJSVNDU0lfVEFSR0VUX05BTUUgfCBJU0NTSV9UUEdUIHwKLQkJCQlJU0NTSV9VU0VSTkFNRSB8IElTQ1NJX1BBU1NXT1JEIHwKLQkJCQlJU0NTSV9VU0VSTkFNRV9JTiB8IElTQ1NJX1BBU1NXT1JEX0lOIHwKLQkJCQlJU0NTSV9GQVNUX0FCT1JUIHwgSVNDU0lfQUJPUlRfVE1PIHwKLQkJCQlJU0NTSV9MVV9SRVNFVF9UTU8gfCBJU0NTSV9UR1RfUkVTRVRfVE1PIHwKLQkJCQlJU0NTSV9QSU5HX1RNTyB8IElTQ1NJX1JFQ1ZfVE1PIHwKLQkJCQlJU0NTSV9JRkFDRV9OQU1FIHwgSVNDU0lfSU5JVElBVE9SX05BTUUsCi0JLmhvc3RfcGFyYW1fbWFzawk9IElTQ1NJX0hPU1RfSFdBRERSRVNTIHwgSVNDU0lfSE9TVF9JUEFERFJFU1MgfAotCQkJCUlTQ1NJX0hPU1RfSU5JVElBVE9SX05BTUUgfAotCQkJCUlTQ1NJX0hPU1RfTkVUREVWX05BTUUsCisJLmF0dHJfaXNfdmlzaWJsZQk9IGN4Z2JpX2F0dHJfaXNfdmlzaWJsZSwKIAkuZ2V0X2hvc3RfcGFyYW0JPSBjeGdiaV9nZXRfaG9zdF9wYXJhbSwKIAkuc2V0X2hvc3RfcGFyYW0JPSBjeGdiaV9zZXRfaG9zdF9wYXJhbSwKIAkvKiBzZXNzaW9uIG1hbmFnZW1lbnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCmluZGV4IDMxYzc5YmQuLmFjN2E5YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYwpAQCAtMTA2LDI1ICsxMDYsNyBAQAogCS5jYXBzCQk9IENBUF9SRUNPVkVSWV9MMCB8IENBUF9NVUxUSV9SMlQgfCBDQVBfSERSREdTVCB8CiAJCQkJQ0FQX0RBVEFER1NUIHwgQ0FQX0RJR0VTVF9PRkZMT0FEIHwKIAkJCQlDQVBfUEFERElOR19PRkZMT0FEIHwgQ0FQX1RFWFRfTkVHTywKLQkucGFyYW1fbWFzawk9IElTQ1NJX01BWF9SRUNWX0RMRU5HVEggfCBJU0NTSV9NQVhfWE1JVF9ETEVOR1RIIHwKLQkJCQlJU0NTSV9IRFJER1NUX0VOIHwgSVNDU0lfREFUQURHU1RfRU4gfAotCQkJCUlTQ1NJX0lOSVRJQUxfUjJUX0VOIHwgSVNDU0lfTUFYX1IyVCB8Ci0JCQkJSVNDU0lfSU1NX0RBVEFfRU4gfCBJU0NTSV9GSVJTVF9CVVJTVCB8Ci0JCQkJSVNDU0lfTUFYX0JVUlNUIHwgSVNDU0lfUERVX0lOT1JERVJfRU4gfAotCQkJCUlTQ1NJX0RBVEFTRVFfSU5PUkRFUl9FTiB8IElTQ1NJX0VSTCB8Ci0JCQkJSVNDU0lfQ09OTl9QT1JUIHwgSVNDU0lfQ09OTl9BRERSRVNTIHwKLQkJCQlJU0NTSV9FWFBfU1RBVFNOIHwgSVNDU0lfUEVSU0lTVEVOVF9QT1JUIHwKLQkJCQlJU0NTSV9QRVJTSVNURU5UX0FERFJFU1MgfAotCQkJCUlTQ1NJX1RBUkdFVF9OQU1FIHwgSVNDU0lfVFBHVCB8Ci0JCQkJSVNDU0lfVVNFUk5BTUUgfCBJU0NTSV9QQVNTV09SRCB8Ci0JCQkJSVNDU0lfVVNFUk5BTUVfSU4gfCBJU0NTSV9QQVNTV09SRF9JTiB8Ci0JCQkJSVNDU0lfRkFTVF9BQk9SVCB8IElTQ1NJX0FCT1JUX1RNTyB8Ci0JCQkJSVNDU0lfTFVfUkVTRVRfVE1PIHwgSVNDU0lfVEdUX1JFU0VUX1RNTyB8Ci0JCQkJSVNDU0lfUElOR19UTU8gfCBJU0NTSV9SRUNWX1RNTyB8Ci0JCQkJSVNDU0lfSUZBQ0VfTkFNRSB8IElTQ1NJX0lOSVRJQVRPUl9OQU1FLAotCS5ob3N0X3BhcmFtX21hc2sJPSBJU0NTSV9IT1NUX0hXQUREUkVTUyB8IElTQ1NJX0hPU1RfSVBBRERSRVNTIHwKLQkJCQlJU0NTSV9IT1NUX0lOSVRJQVRPUl9OQU1FIHwKLQkJCQlJU0NTSV9IT1NUX05FVERFVl9OQU1FLAorCS5hdHRyX2lzX3Zpc2libGUJPSBjeGdiaV9hdHRyX2lzX3Zpc2libGUsCiAJLmdldF9ob3N0X3BhcmFtCT0gY3hnYmlfZ2V0X2hvc3RfcGFyYW0sCiAJLnNldF9ob3N0X3BhcmFtCT0gY3hnYmlfc2V0X2hvc3RfcGFyYW0sCiAJLyogc2Vzc2lvbiBtYW5hZ2VtZW50ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hnYmkvbGliY3hnYmkuYyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5jCmluZGV4IDFjMTMyOWIuLmMxMGY3NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4JLyogaXBfZGV2X2ZpbmQgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGJnX2xldmVsOwpAQCAtMjU2OCw2ICsyNTY5LDYyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjeGdiaV9pc2NzaV9jbGVhbnVwKTsKIAorbW9kZV90IGN4Z2JpX2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKQoreworCXN3aXRjaCAocGFyYW1fdHlwZSkgeworCWNhc2UgSVNDU0lfSE9TVF9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fTkVUREVWX05BTUU6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9IV0FERFJFU1M6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9JUEFERFJFU1M6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9JTklUSUFUT1JfTkFNRToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIElTQ1NJX1BBUkFNOgorCQlzd2l0Y2ggKHBhcmFtKSB7CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1JFQ1ZfRExFTkdUSDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfWE1JVF9ETEVOR1RIOgorCQljYXNlIElTQ1NJX1BBUkFNX0hEUkRHU1RfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fREFUQURHU1RfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTOgorCQljYXNlIElTQ1NJX1BBUkFNX0NPTk5fUE9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9FWFBfU1RBVFNOOgorCQljYXNlIElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX1BPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fUElOR19UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fUkVDVl9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fSU5JVElBTF9SMlRfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1IyVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTU1fREFUQV9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9GSVJTVF9CVVJTVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfQlVSU1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fUERVX0lOT1JERVJfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fREFUQVNFUV9JTk9SREVSX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0VSTDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9UQVJHRVRfTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9UUEdUOgorCQljYXNlIElTQ1NJX1BBUkFNX1VTRVJOQU1FOgorCQljYXNlIElTQ1NJX1BBUkFNX1BBU1NXT1JEOgorCQljYXNlIElTQ1NJX1BBUkFNX1VTRVJOQU1FX0lOOgorCQljYXNlIElTQ1NJX1BBUkFNX1BBU1NXT1JEX0lOOgorCQljYXNlIElTQ1NJX1BBUkFNX0ZBU1RfQUJPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fQUJPUlRfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX0xVX1JFU0VUX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9UR1RfUkVTRVRfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX0lGQUNFX05BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fSU5JVElBVE9SX05BTUU6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjeGdiaV9hdHRyX2lzX3Zpc2libGUpOworCiBzdGF0aWMgaW50IF9faW5pdCBsaWJjeGdiaV9pbml0X21vZHVsZSh2b2lkKQogewogCXN3X3RhZ19pZHhfYml0cyA9IChfX2lsb2cyX3UzMihJU0NTSV9JVFRfTUFTSykpICsgMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5oIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2xpYmN4Z2JpLmgKaW5kZXggM2EyNWIxMS4uMjBjODgyNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5oCkBAIC03MDksNiArNzA5LDcgQEAKIAogdm9pZCBjeGdiaV9jbGVhbnVwX3Rhc2soc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spOwogCittb2RlX3QgY3hnYmlfYXR0cl9pc192aXNpYmxlKGludCBwYXJhbV90eXBlLCBpbnQgcGFyYW0pOwogdm9pZCBjeGdiaV9nZXRfY29ubl9zdGF0cyhzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKiwgc3RydWN0IGlzY3NpX3N0YXRzICopOwogaW50IGN4Z2JpX3NldF9jb25uX3BhcmFtKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqLAogCQkJZW51bSBpc2NzaV9wYXJhbSwgY2hhciAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGguYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoLmMKaW5kZXggMDExOWI4MS4uMjMxNDliOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGguYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaC5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGguaD4KICNpbmNsdWRlICIuLi9zY3NpX3ByaXYuaCIKIApAQCAtNjAsNiArNjEsNDYgQEAKIH0KIAogLyoKKyAqIGRldmljZV9oYW5kbGVyX21hdGNoX2Z1bmN0aW9uIC0gTWF0Y2ggYSBkZXZpY2UgaGFuZGxlciB0byBhIGRldmljZQorICogQHNkZXYgLSBTQ1NJIGRldmljZSB0byBiZSB0ZXN0ZWQKKyAqCisgKiBUZXN0cyBAc2RldiBhZ2FpbnN0IHRoZSBtYXRjaCBmdW5jdGlvbiBvZiBhbGwgcmVnaXN0ZXJlZCBkZXZpY2VfaGFuZGxlci4KKyAqIFJldHVybnMgdGhlIGZvdW5kIGRldmljZSBoYW5kbGVyIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICovCitzdGF0aWMgc3RydWN0IHNjc2lfZGV2aWNlX2hhbmRsZXIgKgorZGV2aWNlX2hhbmRsZXJfbWF0Y2hfZnVuY3Rpb24oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZV9oYW5kbGVyICp0bXBfZGgsICpmb3VuZF9kaCA9IE5VTEw7CisKKwlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfZGgsICZzY3NpX2RoX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRtcF9kaC0+bWF0Y2ggJiYgdG1wX2RoLT5tYXRjaChzZGV2KSkgeworCQkJZm91bmRfZGggPSB0bXBfZGg7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwlyZXR1cm4gZm91bmRfZGg7Cit9CisKKy8qCisgKiBkZXZpY2VfaGFuZGxlcl9tYXRjaF9kZXZsaXN0IC0gTWF0Y2ggYSBkZXZpY2UgaGFuZGxlciB0byBhIGRldmljZQorICogQHNkZXYgLSBTQ1NJIGRldmljZSB0byBiZSB0ZXN0ZWQKKyAqCisgKiBUZXN0cyBAc2RldiBhZ2FpbnN0IGFsbCBkZXZpY2VfaGFuZGxlciByZWdpc3RlcmVkIGluIHRoZSBkZXZsaXN0LgorICogUmV0dXJucyB0aGUgZm91bmQgZGV2aWNlIGhhbmRsZXIgb3IgTlVMTCBpZiBub3QgZm91bmQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9kZXZpY2VfaGFuZGxlciAqCitkZXZpY2VfaGFuZGxlcl9tYXRjaF9kZXZsaXN0KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlpbnQgaWR4OworCisJaWR4ID0gc2NzaV9nZXRfZGV2aWNlX2ZsYWdzX2tleWVkKHNkZXYsIHNkZXYtPnZlbmRvciwgc2Rldi0+bW9kZWwsCisJCQkJCSAgU0NTSV9ERVZJTkZPX0RIKTsKKwlyZXR1cm4gZ2V0X2RldmljZV9oYW5kbGVyX2J5X2lkeChpZHgpOworfQorCisvKgogICogZGV2aWNlX2hhbmRsZXJfbWF0Y2ggLSBBdHRhY2ggYSBkZXZpY2UgaGFuZGxlciB0byBhIGRldmljZQogICogQHNjc2lfZGggLSBUaGUgZGV2aWNlIGhhbmRsZXIgdG8gbWF0Y2ggYWdhaW5zdCBvciBOVUxMCiAgKiBAc2RldiAtIFNDU0kgZGV2aWNlIHRvIGJlIHRlc3RlZCBhZ2FpbnN0IEBzY3NpX2RoCkBAIC03MiwxMiArMTEzLDExIEBACiBkZXZpY2VfaGFuZGxlcl9tYXRjaChzdHJ1Y3Qgc2NzaV9kZXZpY2VfaGFuZGxlciAqc2NzaV9kaCwKIAkJICAgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlX2hhbmRsZXIgKmZvdW5kX2RoID0gTlVMTDsKLQlpbnQgaWR4OworCXN0cnVjdCBzY3NpX2RldmljZV9oYW5kbGVyICpmb3VuZF9kaDsKIAotCWlkeCA9IHNjc2lfZ2V0X2RldmljZV9mbGFnc19rZXllZChzZGV2LCBzZGV2LT52ZW5kb3IsIHNkZXYtPm1vZGVsLAotCQkJCQkgIFNDU0lfREVWSU5GT19ESCk7Ci0JZm91bmRfZGggPSBnZXRfZGV2aWNlX2hhbmRsZXJfYnlfaWR4KGlkeCk7CisJZm91bmRfZGggPSBkZXZpY2VfaGFuZGxlcl9tYXRjaF9mdW5jdGlvbihzZGV2KTsKKwlpZiAoIWZvdW5kX2RoKQorCQlmb3VuZF9kaCA9IGRldmljZV9oYW5kbGVyX21hdGNoX2Rldmxpc3Qoc2Rldik7CiAKIAlpZiAoc2NzaV9kaCAmJiBmb3VuZF9kaCAhPSBzY3NpX2RoKQogCQlmb3VuZF9kaCA9IE5VTEw7CkBAIC0xNTEsNiArMTkxLDEwIEBACiAJc3RydWN0IHNjc2lfZGV2aWNlX2hhbmRsZXIgKnNjc2lfZGg7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKKwlpZiAoc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX0NBTkNFTCB8fAorCSAgICBzZGV2LT5zZGV2X3N0YXRlID09IFNERVZfREVMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWlmICghc2Rldi0+c2NzaV9kaF9kYXRhKSB7CiAJCS8qCiAJCSAqIEF0dGFjaCB0byBhIGRldmljZSBoYW5kbGVyCkBAIC0zMjcsNyArMzcxLDcgQEAKIAlsaXN0X2FkZCgmc2NzaV9kaC0+bGlzdCwgJnNjc2lfZGhfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CiAKLQlmb3IgKGkgPSAwOyBzY3NpX2RoLT5kZXZsaXN0W2ldLnZlbmRvcjsgaSsrKSB7CisJZm9yIChpID0gMDsgc2NzaV9kaC0+ZGV2bGlzdCAmJiBzY3NpX2RoLT5kZXZsaXN0W2ldLnZlbmRvcjsgaSsrKSB7CiAJCXNjc2lfZGV2X2luZm9fbGlzdF9hZGRfa2V5ZWQoMCwKIAkJCQkJc2NzaV9kaC0+ZGV2bGlzdFtpXS52ZW5kb3IsCiAJCQkJCXNjc2lfZGgtPmRldmxpc3RbaV0ubW9kZWwsCkBAIC0zNjAsNyArNDA0LDcgQEAKIAlidXNfZm9yX2VhY2hfZGV2KCZzY3NpX2J1c190eXBlLCBOVUxMLCBzY3NpX2RoLAogCQkJIHNjc2lfZGhfbm90aWZpZXJfcmVtb3ZlKTsKIAotCWZvciAoaSA9IDA7IHNjc2lfZGgtPmRldmxpc3RbaV0udmVuZG9yOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBzY3NpX2RoLT5kZXZsaXN0ICYmIHNjc2lfZGgtPmRldmxpc3RbaV0udmVuZG9yOyBpKyspIHsKIAkJc2NzaV9kZXZfaW5mb19saXN0X2RlbF9rZXllZChzY3NpX2RoLT5kZXZsaXN0W2ldLnZlbmRvciwKIAkJCQkJICAgICBzY3NpX2RoLT5kZXZsaXN0W2ldLm1vZGVsLAogCQkJCQkgICAgIFNDU0lfREVWSU5GT19ESCk7CkBAIC0zOTgsNyArNDQyLDE1IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJc2RldiA9IHEtPnF1ZXVlZGF0YTsKLQlpZiAoc2RldiAmJiBzZGV2LT5zY3NpX2RoX2RhdGEpCisJaWYgKCFzZGV2KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQllcnIgPSBTQ1NJX0RIX05PU1lTOworCQlpZiAoZm4pCisJCQlmbihkYXRhLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChzZGV2LT5zY3NpX2RoX2RhdGEpCiAJCXNjc2lfZGggPSBzZGV2LT5zY3NpX2RoX2RhdGEtPnNjc2lfZGg7CiAJZGV2ID0gZ2V0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOwogCWlmICghc2NzaV9kaCB8fCAhZGV2IHx8CkBAIC00NjgsNyArNTIwLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNjc2lfZGhfaGFuZGxlcl9leGlzdCk7CiAKIC8qCi0gKiBzY3NpX2RoX2hhbmRsZXJfYXR0YWNoIC0gQXR0YWNoIGRldmljZSBoYW5kbGVyCisgKiBzY3NpX2RoX2F0dGFjaCAtIEF0dGFjaCBkZXZpY2UgaGFuZGxlcgogICogQHNkZXYgLSBzZGV2IHRoZSBoYW5kbGVyIHNob3VsZCBiZSBhdHRhY2hlZCB0bwogICogQG5hbWUgLSBuYW1lIG9mIHRoZSBoYW5kbGVyIHRvIGF0dGFjaAogICovCkBAIC00OTgsNyArNTUwLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNjc2lfZGhfYXR0YWNoKTsKIAogLyoKLSAqIHNjc2lfZGhfaGFuZGxlcl9kZXRhY2ggLSBEZXRhY2ggZGV2aWNlIGhhbmRsZXIKKyAqIHNjc2lfZGhfZGV0YWNoIC0gRGV0YWNoIGRldmljZSBoYW5kbGVyCiAgKiBAc2RldiAtIHNkZXYgdGhlIGhhbmRsZXIgc2hvdWxkIGJlIGRldGFjaGVkIGZyb20KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGV0YWNoIHRoZSBkZXZpY2UgaGFuZGxlciBvbmx5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9hbHVhLmMgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9hbHVhLmMKaW5kZXggNmZlYzlmZS4uNGVmMDIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfYWx1YS5jCisrKyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2FsdWEuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RoLmg+CkBAIC0xMjgsNDMgKzEyOSw2IEBACiB9CiAKIC8qCi0gKiBzdWJtaXRfc3RkX2lucXVpcnkgLSBJc3N1ZSBhIHN0YW5kYXJkIElOUVVJUlkgY29tbWFuZAotICogQHNkZXY6IHNkZXYgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHNlbmQgdG8KLSAqLwotc3RhdGljIGludCBzdWJtaXRfc3RkX2lucXVpcnkoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYWx1YV9kaF9kYXRhICpoKQotewotCXN0cnVjdCByZXF1ZXN0ICpycTsKLQlpbnQgZXJyID0gU0NTSV9ESF9SRVNfVEVNUF9VTkFWQUlMOwotCi0JcnEgPSBnZXRfYWx1YV9yZXEoc2RldiwgaC0+aW5xLCBBTFVBX0lOUVVJUllfU0laRSwgUkVBRCk7Ci0JaWYgKCFycSkKLQkJZ290byBkb25lOwotCi0JLyogUHJlcGFyZSB0aGUgY29tbWFuZC4gKi8KLQlycS0+Y21kWzBdID0gSU5RVUlSWTsKLQlycS0+Y21kWzFdID0gMDsKLQlycS0+Y21kWzJdID0gMDsKLQlycS0+Y21kWzRdID0gQUxVQV9JTlFVSVJZX1NJWkU7Ci0JcnEtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoSU5RVUlSWSk7Ci0KLQlycS0+c2Vuc2UgPSBoLT5zZW5zZTsKLQltZW1zZXQocnEtPnNlbnNlLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwotCXJxLT5zZW5zZV9sZW4gPSBoLT5zZW5zZWxlbiA9IDA7Ci0KLQllcnIgPSBibGtfZXhlY3V0ZV9ycShycS0+cSwgTlVMTCwgcnEsIDEpOwotCWlmIChlcnIgPT0gLUVJTykgewotCQlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsCi0JCQkgICAgIiVzOiBzdGQgaW5xdWlyeSBmYWlsZWQgd2l0aCAleFxuIiwKLQkJCSAgICBBTFVBX0RIX05BTUUsIHJxLT5lcnJvcnMpOwotCQloLT5zZW5zZWxlbiA9IHJxLT5zZW5zZV9sZW47Ci0JCWVyciA9IFNDU0lfREhfSU87Ci0JfQotCWJsa19wdXRfcmVxdWVzdChycSk7Ci1kb25lOgotCXJldHVybiBlcnI7Ci19Ci0KLS8qCiAgKiBzdWJtaXRfdnBkX2lucXVpcnkgLSBJc3N1ZSBhbiBJTlFVSVJZIFZQRCBwYWdlIDB4ODMgY29tbWFuZAogICogQHNkZXY6IHNkZXYgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHNlbnQgdG8KICAqLwpAQCAtMzM4LDIzICszMDIsMTcgQEAKIH0KIAogLyoKLSAqIGFsdWFfc3RkX2lucXVpcnkgLSBFdmFsdWF0ZSBzdGFuZGFyZCBJTlFVSVJZIGNvbW1hbmQKKyAqIGFsdWFfY2hlY2tfdHBncyAtIEV2YWx1YXRlIFRQR1Mgc2V0dGluZwogICogQHNkZXY6IGRldmljZSB0byBiZSBjaGVja2VkCiAgKgotICogSnVzdCBleHRyYWN0IHRoZSBUUEdTIHNldHRpbmcgdG8gZmluZCBvdXQgaWYgQUxVQQorICogRXhhbWluZSB0aGUgVFBHUyBzZXR0aW5nIG9mIHRoZSBzZGV2IHRvIGZpbmQgb3V0IGlmIEFMVUEKICAqIGlzIHN1cHBvcnRlZC4KICAqLwotc3RhdGljIGludCBhbHVhX3N0ZF9pbnF1aXJ5KHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGFsdWFfZGhfZGF0YSAqaCkKK3N0YXRpYyBpbnQgYWx1YV9jaGVja190cGdzKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGFsdWFfZGhfZGF0YSAqaCkKIHsKLQlpbnQgZXJyOworCWludCBlcnIgPSBTQ1NJX0RIX09LOwogCi0JZXJyID0gc3VibWl0X3N0ZF9pbnF1aXJ5KHNkZXYsIGgpOwotCi0JaWYgKGVyciAhPSBTQ1NJX0RIX09LKQotCQlyZXR1cm4gZXJyOwotCi0JLyogQ2hlY2sgVFBHUyBzZXR0aW5nICovCi0JaC0+dHBncyA9IChoLT5pbnFbNV0gPj4gNCkgJiAweDM7CisJaC0+dHBncyA9IHNjc2lfZGV2aWNlX3RwZ3Moc2Rldik7CiAJc3dpdGNoIChoLT50cGdzKSB7CiAJY2FzZSBUUEdTX01PREVfRVhQTElDSVR8VFBHU19NT0RFX0lNUExJQ0lUOgogCQlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsCkBAIC01MDgsMjcgKzQ2NiwyOCBAQAogCQkJICogUG93ZXIgT24sIFJlc2V0LCBvciBCdXMgRGV2aWNlIFJlc2V0LCBqdXN0IHJldHJ5LgogCQkJICovCiAJCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7Ci0JCWlmIChzZW5zZV9oZHItPmFzYyA9PSAweDJhICYmIHNlbnNlX2hkci0+YXNjcSA9PSAweDA2KSB7CisJCWlmIChzZW5zZV9oZHItPmFzYyA9PSAweDJhICYmIHNlbnNlX2hkci0+YXNjcSA9PSAweDA2KQogCQkJLyoKIAkJCSAqIEFMVUEgc3RhdGUgY2hhbmdlZAogCQkJICovCiAJCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7Ci0JCX0KLQkJaWYgKHNlbnNlX2hkci0+YXNjID09IDB4MmEgJiYgc2Vuc2VfaGRyLT5hc2NxID09IDB4MDcpIHsKKwkJaWYgKHNlbnNlX2hkci0+YXNjID09IDB4MmEgJiYgc2Vuc2VfaGRyLT5hc2NxID09IDB4MDcpCiAJCQkvKgogCQkJICogSW1wbGljaXQgQUxVQSBzdGF0ZSB0cmFuc2l0aW9uIGZhaWxlZAogCQkJICovCiAJCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7Ci0JCX0KLQkJaWYgKHNlbnNlX2hkci0+YXNjID09IDB4M2YgJiYgc2Vuc2VfaGRyLT5hc2NxID09IDB4MGUpIHsKKwkJaWYgKHNlbnNlX2hkci0+YXNjID09IDB4M2YgJiYgc2Vuc2VfaGRyLT5hc2NxID09IDB4MDMpCisJCQkvKgorCQkJICogSW5xdWlyeSBkYXRhIGhhcyBjaGFuZ2VkCisJCQkgKi8KKwkJCXJldHVybiBBRERfVE9fTUxRVUVVRTsKKwkJaWYgKHNlbnNlX2hkci0+YXNjID09IDB4M2YgJiYgc2Vuc2VfaGRyLT5hc2NxID09IDB4MGUpCiAJCQkvKgogCQkJICogUkVQT1JURURfTFVOU19EQVRBX0hBU19DSEFOR0VEIGlzIHJlcG9ydGVkCiAJCQkgKiB3aGVuIHN3aXRjaGluZyBjb250cm9sbGVycyBvbiB0YXJnZXRzIGxpa2UKIAkJCSAqIEludGVsIE11bHRpLUZsZXguIFdlIGNhbiBqdXN0IHJldHJ5LgogCQkJICovCiAJCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7Ci0JCX0KLQogCQlicmVhazsKIAl9CiAKQEAgLTU0Nyw5ICs1MDYsOSBAQAogewogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzZW5zZV9oZHI7CiAJaW50IGxlbiwgaywgb2ZmLCB2YWxpZF9zdGF0ZXMgPSAwOwotCWNoYXIgKnVjcDsKKwl1bnNpZ25lZCBjaGFyICp1Y3A7CiAJdW5zaWduZWQgZXJyOwotCXVuc2lnbmVkIGxvbmcgZXhwaXJ5LCBpbnRlcnZhbCA9IDEwOworCXVuc2lnbmVkIGxvbmcgZXhwaXJ5LCBpbnRlcnZhbCA9IDEwMDA7CiAKIAlleHBpcnkgPSByb3VuZF9qaWZmaWVzX3VwKGppZmZpZXMgKyBBTFVBX0ZBSUxPVkVSX1RJTUVPVVQpOwogIHJldHJ5OgpAQCAtNjEwLDcgKzU2OSw3IEBACiAJY2FzZSBUUEdTX1NUQVRFX1RSQU5TSVRJT05JTkc6CiAJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBleHBpcnkpKSB7CiAJCQkvKiBTdGF0ZSB0cmFuc2l0aW9uLCByZXRyeSAqLwotCQkJaW50ZXJ2YWwgKj0gMTA7CisJCQlpbnRlcnZhbCAqPSAyOwogCQkJbXNsZWVwKGludGVydmFsKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KQEAgLTY0Miw3ICs2MDEsNyBAQAogewogCWludCBlcnI7CiAKLQllcnIgPSBhbHVhX3N0ZF9pbnF1aXJ5KHNkZXYsIGgpOworCWVyciA9IGFsdWFfY2hlY2tfdHBncyhzZGV2LCBoKTsKIAlpZiAoZXJyICE9IFNDU0lfREhfT0spCiAJCWdvdG8gb3V0OwogCkBAIC02NzQsMTEgKzYzMyw5IEBACiAJc3RydWN0IGFsdWFfZGhfZGF0YSAqaCA9IGdldF9hbHVhX2RhdGEoc2Rldik7CiAJaW50IGVyciA9IFNDU0lfREhfT0s7CiAKLQlpZiAoaC0+Z3JvdXBfaWQgIT0gLTEpIHsKLQkJZXJyID0gYWx1YV9ydHBnKHNkZXYsIGgpOwotCQlpZiAoZXJyICE9IFNDU0lfREhfT0spCi0JCQlnb3RvIG91dDsKLQl9CisJZXJyID0gYWx1YV9ydHBnKHNkZXYsIGgpOworCWlmIChlcnIgIT0gU0NTSV9ESF9PSykKKwkJZ290byBvdXQ7CiAKIAlpZiAoaC0+dHBncyAmIFRQR1NfTU9ERV9FWFBMSUNJVCAmJgogCSAgICBoLT5zdGF0ZSAhPSBUUEdTX1NUQVRFX09QVElNSVpFRCAmJgpAQCAtNzIwLDIzICs2NzcsMTAgQEAKIAogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNjc2lfZGhfZGV2bGlzdCBhbHVhX2Rldl9saXN0W10gPSB7Ci0JeyJIUCIsICJNU0EgVk9MVU1FIiB9LAotCXsiSFAiLCAiSFNWMTAxIiB9LAotCXsiSFAiLCAiSFNWMTExIiB9LAotCXsiSFAiLCAiSFNWMjAwIiB9LAotCXsiSFAiLCAiSFNWMjEwIiB9LAotCXsiSFAiLCAiSFNWMzAwIiB9LAotCXsiSUJNIiwgIjIxMDc5MDAiIH0sCi0JeyJJQk0iLCAiMjE0NSIgfSwKLQl7IlBpbGxhciIsICJBeGlvbSIgfSwKLQl7IkludGVsIiwgIk11bHRpLUZsZXgifSwKLQl7Ik5FVEFQUCIsICJMVU4ifSwKLQl7Ik5FVEFQUCIsICJMVU4gQy1Nb2RlIn0sCi0JeyJBSVgiLCAiTlZESVNLIn0sCi0JeyJQcm9taXNlIiwgIlZUcmFrIn0sCi0Je05VTEwsIE5VTEx9Ci19Oworc3RhdGljIGJvb2wgYWx1YV9tYXRjaChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJcmV0dXJuIChzY3NpX2RldmljZV90cGdzKHNkZXYpICE9IDApOworfQogCiBzdGF0aWMgaW50IGFsdWFfYnVzX2F0dGFjaChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogc3RhdGljIHZvaWQgYWx1YV9idXNfZGV0YWNoKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7CkBAIC03NDQsMTIgKzY4OCwxMiBAQAogc3RhdGljIHN0cnVjdCBzY3NpX2RldmljZV9oYW5kbGVyIGFsdWFfZGggPSB7CiAJLm5hbWUgPSBBTFVBX0RIX05BTUUsCiAJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAotCS5kZXZsaXN0ID0gYWx1YV9kZXZfbGlzdCwKIAkuYXR0YWNoID0gYWx1YV9idXNfYXR0YWNoLAogCS5kZXRhY2ggPSBhbHVhX2J1c19kZXRhY2gsCiAJLnByZXBfZm4gPSBhbHVhX3ByZXBfZm4sCiAJLmNoZWNrX3NlbnNlID0gYWx1YV9jaGVja19zZW5zZSwKIAkuYWN0aXZhdGUgPSBhbHVhX2FjdGl2YXRlLAorCS5tYXRjaCA9IGFsdWFfbWF0Y2gsCiB9OwogCiAvKgpAQCAtNzkxLDYgKzczNSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoc2Rldi0+cmVxdWVzdF9xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCXNkZXYtPnNjc2lfZGhfZGF0YSA9IHNjc2lfZGhfZGF0YTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNkZXYtPnJlcXVlc3RfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlzZGV2X3ByaW50ayhLRVJOX05PVElDRSwgc2RldiwgIiVzOiBBdHRhY2hlZFxuIiwgQUxVQV9ESF9OQU1FKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2VtYy5jCmluZGV4IDQ4NDQxZjYuLjU5MTE4NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2VtYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2VtYy5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGguaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2hwX3N3LmMgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9ocF9zdy5jCmluZGV4IGI0NzlmMWUuLjBmODZhMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2hwX3N3LmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfaHBfc3cuYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCmluZGV4IDI3YzlkNjUuLjFkMzEyNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogRW5nZW5pby9MU0kgUkRBQyBTQ1NJIERldmljZSBIYW5kbGVyCisgKiBMU0kvRW5nZW5pby9OZXRBcHAgRS1TZXJpZXMgUkRBQyBTQ1NJIERldmljZSBIYW5kbGVyCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA1IE1pa2UgQ2hyaXN0aWUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIENoYW5kcmEgU2VldGhhcmFtYW4sIElCTSBDb3JwLiAyMDA3CkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RoLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIFJEQUNfTkFNRSAicmRhYyIKICNkZWZpbmUgUkRBQ19SRVRSWV9DT1VOVCA1CkBAIC03OTUsNiArNzk2LDcgQEAKIAl7IklCTSIsICIzNTI2In0sCiAJeyJTR0kiLCAiVFA5NDAwIn0sCiAJeyJTR0kiLCAiVFA5NTAwIn0sCisJeyJTR0kiLCAiVFA5NzAwIn0sCiAJeyJTR0kiLCAiSVMifSwKIAl7IlNUSyIsICJPUEVOc3RvcmFnZSBEMjgwIn0sCiAJeyJTVU4iLCAiQ1NNMjAwX1IifSwKQEAgLTgxNCw2ICs4MTYsNyBAQAogCXsiU1VOIiwgIkNTTTEwMF9SX0ZDIn0sCiAJeyJTVU4iLCAiU1RLNjU4MF82NzgwIn0sCiAJeyJTVU4iLCAiU1VOXzYxODAifSwKKwl7IlNVTiIsICJBcnJheVN0b3JhZ2UifSwKIAl7TlVMTCwgTlVMTH0sCiB9OwogCkBAIC05NDUsNyArOTQ4LDcgQEAKIG1vZHVsZV9pbml0KHJkYWNfaW5pdCk7CiBtb2R1bGVfZXhpdChyZGFjX2V4aXQpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIk11bHRpcGF0aCBMU0kvRW5nZW5pbyBSREFDIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNdWx0aXBhdGggTFNJL0VuZ2VuaW8vTmV0QXBwIEUtU2VyaWVzIFJEQUMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNaWtlIENocmlzdGllLCBDaGFuZHJhIFNlZXRoYXJhbWFuIik7CiBNT0RVTEVfVkVSU0lPTigiMDEuMDAuMDAwMC4wMDAwIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMKaW5kZXggYTFjMGRkZC4uY2VmYmU0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYwpAQCAtNTEsNyArNTEsNyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogCiAvKiBQZXJmb3JtYW5jZSB0dW5pbmcgcGFyYW1ldGVycyBmb3IgZmNvZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBmY29lX2RkcF9taW47CitzdGF0aWMgdW5zaWduZWQgaW50IGZjb2VfZGRwX21pbiA9IDQwOTY7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGRwX21pbiwgZmNvZV9kZHBfbWluLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGRkcF9taW4sICJNaW5pbXVtIEkvTyBzaXplIGluIGJ5dGVzIGZvciAiCVwKIAkJICJEaXJlY3QgRGF0YSBQbGFjZW1lbnQgKEREUCkuIik7CkBAIC0xMzcsNyArMTM3LDYgQEAKIHN0YXRpYyBpbnQgZmNvZV92cG9ydF9kaXNhYmxlKHN0cnVjdCBmY192cG9ydCAqLCBib29sIGRpc2FibGUpOwogc3RhdGljIHZvaWQgZmNvZV9zZXRfdnBvcnRfc3ltYm9saWNfbmFtZShzdHJ1Y3QgZmNfdnBvcnQgKik7CiBzdGF0aWMgdm9pZCBmY29lX3NldF9wb3J0X2lkKHN0cnVjdCBmY19scG9ydCAqLCB1MzIsIHN0cnVjdCBmY19mcmFtZSAqKTsKLXN0YXRpYyBpbnQgZmNvZV92YWxpZGF0ZV92cG9ydF9jcmVhdGUoc3RydWN0IGZjX3Zwb3J0ICopOwogCiBzdGF0aWMgc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlIGZjb2VfbGliZmNfZmNuX3RlbXBsID0gewogCS5mcmFtZV9zZW5kID0gZmNvZV94bWl0LApAQCAtMjgwLDYgKzI3OSw3IEBACiAJICogdXNlIHRoZSBmaXJzdCBvbmUgZm9yIFNQTUEgKi8KIAlyZWFsX2RldiA9IChuZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pID8KIAkJdmxhbl9kZXZfcmVhbF9kZXYobmV0ZGV2KSA6IG5ldGRldjsKKwlmY29lLT5yZWFsZGV2ID0gcmVhbF9kZXY7CiAJcmN1X3JlYWRfbG9jaygpOwogCWZvcl9lYWNoX2Rldl9hZGRyKHJlYWxfZGV2LCBoYSkgewogCQlpZiAoKGhhLT50eXBlID09IE5FVERFVl9IV19BRERSX1RfU0FOKSAmJgpAQCAtNTgwLDIzICs1ODAsNiBAQAogfQogCiAvKioKLSAqIGZjb2VfZ2V0X3d3bigpIC0gR2V0IHRoZSB3b3JsZCB3aWRlIG5hbWUgZnJvbSBMTEQgaWYgaXQgc3VwcG9ydHMgaXQKLSAqIEBuZXRkZXY6IHRoZSBhc3NvY2lhdGVkIG5ldCBkZXZpY2UKLSAqIEB3d246IHRoZSBvdXRwdXQgV1dOCi0gKiBAdHlwZTogdGhlIHR5cGUgb2YgV1dOIChXV1BOIG9yIFdXTk4pCi0gKgotICogUmV0dXJuczogMCBmb3Igc3VjY2VzcwotICovCi1zdGF0aWMgaW50IGZjb2VfZ2V0X3d3bihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1NjQgKnd3biwgaW50IHR5cGUpCi17Ci0JY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSBuZXRkZXYtPm5ldGRldl9vcHM7Ci0KLQlpZiAob3BzLT5uZG9fZmNvZV9nZXRfd3duKQotCQlyZXR1cm4gb3BzLT5uZG9fZmNvZV9nZXRfd3duKG5ldGRldiwgd3duLCB0eXBlKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyoqCiAgKiBmY29lX25ldGRldl9mZWF0dXJlc19jaGFuZ2UgLSBVcGRhdGVzIHRoZSBscG9ydCdzIG9mZmxvYWQgZmxhZ3MgYmFzZWQKICAqIG9uIHRoZSBMTEQgbmV0ZGV2J3MgRkNvRSBmZWF0dXJlIGZsYWdzCiAgKi8KQEAgLTExMzQsOCArMTExNyw5IEBACiAKIAlwID0gJnBlcl9jcHUoZmNvZV9wZXJjcHUsIGNwdSk7CiAKLQl0aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShmY29lX3BlcmNwdV9yZWNlaXZlX3RocmVhZCwKLQkJCQkodm9pZCAqKXAsICJmY29ldGhyZWFkLyVkIiwgY3B1KTsKKwl0aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZV9vbl9ub2RlKGZjb2VfcGVyY3B1X3JlY2VpdmVfdGhyZWFkLAorCQkJCQkodm9pZCAqKXAsIGNwdV90b19ub2RlKGNwdSksCisJCQkJCSJmY29ldGhyZWFkLyVkIiwgY3B1KTsKIAogCWlmIChsaWtlbHkoIUlTX0VSUih0aHJlYWQpKSkgewogCQlrdGhyZWFkX2JpbmQodGhyZWFkLCBjcHUpOwpAQCAtMTUzOCw3ICsxNTIyLDEzIEBACiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc2tiLT5tYWNfbGVuID0gZWxlbjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfRkNPRSk7Ci0Jc2tiLT5kZXYgPSBmY29lLT5uZXRkZXY7CisJaWYgKGZjb2UtPm5ldGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTiAmJgorCSAgICBmY29lLT5yZWFsZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9UWCkgeworCQlza2ItPnZsYW5fdGNpID0gVkxBTl9UQUdfUFJFU0VOVCB8CisJCQkJdmxhbl9kZXZfdmxhbl9pZChmY29lLT5uZXRkZXYpOworCQlza2ItPmRldiA9IGZjb2UtPnJlYWxkZXY7CisJfSBlbHNlCisJCXNrYi0+ZGV2ID0gZmNvZS0+bmV0ZGV2OwogCiAJLyogZmlsbCB1cCBtYWMgYW5kIGZjb2UgaGVhZGVycyAqLwogCWVoID0gZXRoX2hkcihza2IpOwpAQCAtMjM1NywxNCArMjM0NywxMSBAQAogCQlnb3RvIGRvbmU7CiAKIAltYWMgPSBmcl9jYihmcCktPmdyYW50ZWRfbWFjOwotCWlmIChpc196ZXJvX2V0aGVyX2FkZHIobWFjKSkgewotCQkvKiBwcmUtRklQICovCi0JCWlmIChmY29lX2N0bHJfcmVjdl9mbG9naShmaXAsIGxwb3J0LCBmcCkpIHsKLQkJCWZjX2ZyYW1lX2ZyZWUoZnApOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWZjb2VfdXBkYXRlX3NyY19tYWMobHBvcnQsIG1hYyk7CisJLyogcHJlLUZJUCAqLworCWlmIChpc196ZXJvX2V0aGVyX2FkZHIobWFjKSkKKwkJZmNvZV9jdGxyX3JlY3ZfZmxvZ2koZmlwLCBscG9ydCwgZnApOworCWlmICghaXNfemVyb19ldGhlcl9hZGRyKG1hYykpCisJCWZjb2VfdXBkYXRlX3NyY19tYWMobHBvcnQsIG1hYyk7CiBkb25lOgogCWZjX2xwb3J0X2Zsb2dpX3Jlc3Aoc2VxLCBmcCwgbHBvcnQpOwogfQpAQCAtMjQ0Niw3ICsyNDMzLDcgQEAKIAogCXJjID0gZmNvZV92YWxpZGF0ZV92cG9ydF9jcmVhdGUodnBvcnQpOwogCWlmIChyYykgewotCQl3d25fdG9fc3RyKHZwb3J0LT5wb3J0X25hbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQlmY29lX3d3bl90b19zdHIodnBvcnQtPnBvcnRfbmFtZSwgYnVmLCBzaXplb2YoYnVmKSk7CiAJCXByaW50ayhLRVJOX0VSUiAiZmNvZTogRmFpbGVkIHRvIGNyZWF0ZSB2cG9ydCwgIgogCQkJIldXUE4gKDB4JXMpIGFscmVhZHkgZXhpc3RzXG4iLAogCQkJYnVmKTsKQEAgLTI1NTUsMjggKzI1NDIsOSBAQAogc3RhdGljIHZvaWQgZmNvZV9nZXRfbGVzYihzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAogCQkJIHN0cnVjdCBmY19lbHNfbGVzYiAqZmNfbGVzYikKIHsKLQl1bnNpZ25lZCBpbnQgY3B1OwotCXUzMiBsZmMsIHZsZmMsIG1kYWM7Ci0Jc3RydWN0IGZjb2VfZGV2X3N0YXRzICpkZXZzdDsKLQlzdHJ1Y3QgZmNvZV9mY19lbHNfbGVzYiAqbGVzYjsKLQlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZmNvZV9uZXRkZXYobHBvcnQpOwogCi0JbGZjID0gMDsKLQl2bGZjID0gMDsKLQltZGFjID0gMDsKLQlsZXNiID0gKHN0cnVjdCBmY29lX2ZjX2Vsc19sZXNiICopZmNfbGVzYjsKLQltZW1zZXQobGVzYiwgMCwgc2l6ZW9mKCpsZXNiKSk7Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlkZXZzdCA9IHBlcl9jcHVfcHRyKGxwb3J0LT5kZXZfc3RhdHMsIGNwdSk7Ci0JCWxmYyArPSBkZXZzdC0+TGlua0ZhaWx1cmVDb3VudDsKLQkJdmxmYyArPSBkZXZzdC0+VkxpbmtGYWlsdXJlQ291bnQ7Ci0JCW1kYWMgKz0gZGV2c3QtPk1pc3NEaXNjQWR2Q291bnQ7Ci0JfQotCWxlc2ItPmxlc2JfbGlua19mYWlsID0gaHRvbmwobGZjKTsKLQlsZXNiLT5sZXNiX3ZsaW5rX2ZhaWwgPSBodG9ubCh2bGZjKTsKLQlsZXNiLT5sZXNiX21pc3NfZmthID0gaHRvbmwobWRhYyk7Ci0JbGVzYi0+bGVzYl9mY3NfZXJyb3IgPSBodG9ubChkZXZfZ2V0X3N0YXRzKG5ldGRldiwgJnRlbXApLT5yeF9jcmNfZXJyb3JzKTsKKwlfX2Zjb2VfZ2V0X2xlc2IobHBvcnQsIGZjX2xlc2IsIG5ldGRldik7CiB9CiAKIC8qKgpAQCAtMjYwMCw0OSArMjU2OCwzIEBACiAJaWYgKGZwICYmIGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApID09IEVMU19GTE9HSSkKIAkJZmNvZV9jdGxyX3JlY3ZfZmxvZ2koJmZjb2UtPmN0bHIsIGxwb3J0LCBmcCk7CiB9Ci0KLS8qKgotICogZmNvZV92YWxpZGF0ZV92cG9ydF9jcmVhdGUoKSAtIFZhbGlkYXRlIGEgdnBvcnQgYmVmb3JlIGNyZWF0aW5nIGl0Ci0gKiBAdnBvcnQ6IE5QSVYgcG9ydCB0byBiZSBjcmVhdGVkCi0gKgotICogVGhpcyByb3V0aW5lIGlzIG1lYW50IHRvIGFkZCB2YWxpZGF0aW9uIGZvciBhIHZwb3J0IGJlZm9yZSBjcmVhdGluZyBpdAotICogdmlhIGZjb2VfdnBvcnRfY3JlYXRlKCkuCi0gKiBDdXJyZW50IHZhbGlkYXRpb25zIGFyZToKLSAqICAgICAgLSBXV1BOIHN1cHBsaWVkIGlzIHVuaXF1ZSBmb3IgZ2l2ZW4gbHBvcnQKLSAqCi0gKgotKi8KLXN0YXRpYyBpbnQgZmNvZV92YWxpZGF0ZV92cG9ydF9jcmVhdGUoc3RydWN0IGZjX3Zwb3J0ICp2cG9ydCkKLXsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHZwb3J0X3RvX3Nob3N0KHZwb3J0KTsKLQlzdHJ1Y3QgZmNfbHBvcnQgKm5fcG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOwotCXN0cnVjdCBmY19scG9ydCAqdm5fcG9ydDsKLQlpbnQgcmMgPSAwOwotCWNoYXIgYnVmWzMyXTsKLQotCW11dGV4X2xvY2soJm5fcG9ydC0+bHBfbXV0ZXgpOwotCi0Jd3duX3RvX3N0cih2cG9ydC0+cG9ydF9uYW1lLCBidWYsIHNpemVvZihidWYpKTsKLQkvKiBDaGVjayBpZiB0aGUgd3dwbiBpcyBub3Qgc2FtZSBhcyB0aGF0IG9mIHRoZSBscG9ydCAqLwotCWlmICghbWVtY21wKCZuX3BvcnQtPnd3cG4sICZ2cG9ydC0+cG9ydF9uYW1lLCBzaXplb2YodTY0KSkpIHsKLQkJRkNPRV9EQkcoInZwb3J0IFdXUE4gMHglcyBpcyBzYW1lIGFzIHRoYXQgb2YgdGhlICIKLQkJCSJiYXNlIHBvcnQgV1dQTlxuIiwgYnVmKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgZXhpc3RpbmcgdnBvcnQgd2l0aCBzYW1lIHd3cG4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZuX3BvcnQsICZuX3BvcnQtPnZwb3J0cywgbGlzdCkgewotCQlpZiAoIW1lbWNtcCgmdm5fcG9ydC0+d3dwbiwgJnZwb3J0LT5wb3J0X25hbWUsIHNpemVvZih1NjQpKSkgewotCQkJRkNPRV9EQkcoInZwb3J0IHdpdGggZ2l2ZW4gV1dQTiAweCVzIGFscmVhZHkgIgotCQkJImV4aXN0c1xuIiwgYnVmKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZuX3BvcnQtPmxwX211dGV4KTsKLQotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuaCBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuaAppbmRleCBjNGE5Mzk5Li42YzY4ODRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmgKKysrIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5oCkBAIC04MCw2ICs4MCw3IEBACiBzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgewogCXN0cnVjdCBsaXN0X2hlYWQgICBsaXN0OwogCXN0cnVjdCBuZXRfZGV2aWNlICAqbmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICAqcmVhbGRldjsKIAlzdHJ1Y3QgcGFja2V0X3R5cGUgZmNvZV9wYWNrZXRfdHlwZTsKIAlzdHJ1Y3QgcGFja2V0X3R5cGUgZmlwX3BhY2tldF90eXBlOwogCXN0cnVjdCBmY29lX2N0bHIgICBjdGxyOwpAQCAtOTksMTQgKzEwMCw0IEBACiAJCQkoKHN0cnVjdCBmY29lX3BvcnQgKilscG9ydF9wcml2KGxwb3J0KSktPnByaXYpLT5uZXRkZXY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3d25fdG9fc3RyKHU2NCB3d24sIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQl1OCB3d3BuWzhdOwotCi0JdTY0X3RvX3d3bih3d24sIHd3cG4pOwotCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAotCQl3d3BuWzBdLCB3d3BuWzFdLCB3d3BuWzJdLCB3d3BuWzNdLAotCQl3d3BuWzRdLCB3d3BuWzVdLCB3d3BuWzZdLCB3d3BuWzddKTsKLX0KLQogI2VuZGlmIC8qIF9GQ09FX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lX3RyYW5zcG9ydC5jIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV90cmFuc3BvcnQuYwppbmRleCBkYWM4ZTM5Li5iZDk3YjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2VfdHJhbnNwb3J0LmMKQEAgLTgzLDYgKzgzLDEwNyBAQAogCS5ub3RpZmllcl9jYWxsID0gbGliZmNvZV9kZXZpY2Vfbm90aWZpY2F0aW9uLAogfTsKIAordm9pZCBfX2Zjb2VfZ2V0X2xlc2Ioc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKKwkJICAgICBzdHJ1Y3QgZmNfZWxzX2xlc2IgKmZjX2xlc2IsCisJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCXUzMiBsZmMsIHZsZmMsIG1kYWM7CisJc3RydWN0IGZjb2VfZGV2X3N0YXRzICpkZXZzdDsKKwlzdHJ1Y3QgZmNvZV9mY19lbHNfbGVzYiAqbGVzYjsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgdGVtcDsKKworCWxmYyA9IDA7CisJdmxmYyA9IDA7CisJbWRhYyA9IDA7CisJbGVzYiA9IChzdHJ1Y3QgZmNvZV9mY19lbHNfbGVzYiAqKWZjX2xlc2I7CisJbWVtc2V0KGxlc2IsIDAsIHNpemVvZigqbGVzYikpOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJZGV2c3QgPSBwZXJfY3B1X3B0cihscG9ydC0+ZGV2X3N0YXRzLCBjcHUpOworCQlsZmMgKz0gZGV2c3QtPkxpbmtGYWlsdXJlQ291bnQ7CisJCXZsZmMgKz0gZGV2c3QtPlZMaW5rRmFpbHVyZUNvdW50OworCQltZGFjICs9IGRldnN0LT5NaXNzRGlzY0FkdkNvdW50OworCX0KKwlsZXNiLT5sZXNiX2xpbmtfZmFpbCA9IGh0b25sKGxmYyk7CisJbGVzYi0+bGVzYl92bGlua19mYWlsID0gaHRvbmwodmxmYyk7CisJbGVzYi0+bGVzYl9taXNzX2ZrYSA9IGh0b25sKG1kYWMpOworCWxlc2ItPmxlc2JfZmNzX2Vycm9yID0KKwkJCWh0b25sKGRldl9nZXRfc3RhdHMobmV0ZGV2LCAmdGVtcCktPnJ4X2NyY19lcnJvcnMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19mY29lX2dldF9sZXNiKTsKKwordm9pZCBmY29lX3d3bl90b19zdHIodTY0IHd3biwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXU4IHd3cG5bOF07CisKKwl1NjRfdG9fd3duKHd3biwgd3dwbik7CisJc25wcmludGYoYnVmLCBsZW4sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCSB3d3BuWzBdLCB3d3BuWzFdLCB3d3BuWzJdLCB3d3BuWzNdLAorCQkgd3dwbls0XSwgd3dwbls1XSwgd3dwbls2XSwgd3dwbls3XSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmY29lX3d3bl90b19zdHIpOworCisvKioKKyAqIGZjb2VfdmFsaWRhdGVfdnBvcnRfY3JlYXRlKCkgLSBWYWxpZGF0ZSBhIHZwb3J0IGJlZm9yZSBjcmVhdGluZyBpdAorICogQHZwb3J0OiBOUElWIHBvcnQgdG8gYmUgY3JlYXRlZAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBtZWFudCB0byBhZGQgdmFsaWRhdGlvbiBmb3IgYSB2cG9ydCBiZWZvcmUgY3JlYXRpbmcgaXQKKyAqIHZpYSBmY29lX3Zwb3J0X2NyZWF0ZSgpLgorICogQ3VycmVudCB2YWxpZGF0aW9ucyBhcmU6CisgKiAgICAgIC0gV1dQTiBzdXBwbGllZCBpcyB1bmlxdWUgZm9yIGdpdmVuIGxwb3J0CisgKi8KK2ludCBmY29lX3ZhbGlkYXRlX3Zwb3J0X2NyZWF0ZShzdHJ1Y3QgZmNfdnBvcnQgKnZwb3J0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdnBvcnRfdG9fc2hvc3QodnBvcnQpOworCXN0cnVjdCBmY19scG9ydCAqbl9wb3J0ID0gc2hvc3RfcHJpdihzaG9zdCk7CisJc3RydWN0IGZjX2xwb3J0ICp2bl9wb3J0OworCWludCByYyA9IDA7CisJY2hhciBidWZbMzJdOworCisJbXV0ZXhfbG9jaygmbl9wb3J0LT5scF9tdXRleCk7CisKKwlmY29lX3d3bl90b19zdHIodnBvcnQtPnBvcnRfbmFtZSwgYnVmLCBzaXplb2YoYnVmKSk7CisJLyogQ2hlY2sgaWYgdGhlIHd3cG4gaXMgbm90IHNhbWUgYXMgdGhhdCBvZiB0aGUgbHBvcnQgKi8KKwlpZiAoIW1lbWNtcCgmbl9wb3J0LT53d3BuLCAmdnBvcnQtPnBvcnRfbmFtZSwgc2l6ZW9mKHU2NCkpKSB7CisJCUxJQkZDT0VfVFJBTlNQT1JUX0RCRygidnBvcnQgV1dQTiAweCVzIGlzIHNhbWUgYXMgdGhhdCBvZiB0aGUgIgorCQkJCSAgICAgICJiYXNlIHBvcnQgV1dQTlxuIiwgYnVmKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgZXhpc3RpbmcgdnBvcnQgd2l0aCBzYW1lIHd3cG4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZuX3BvcnQsICZuX3BvcnQtPnZwb3J0cywgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmdm5fcG9ydC0+d3dwbiwgJnZwb3J0LT5wb3J0X25hbWUsIHNpemVvZih1NjQpKSkgeworCQkJTElCRkNPRV9UUkFOU1BPUlRfREJHKCJ2cG9ydCB3aXRoIGdpdmVuIFdXUE4gMHglcyAiCisJCQkJCSAgICAgICJhbHJlYWR5IGV4aXN0c1xuIiwgYnVmKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmbl9wb3J0LT5scF9tdXRleCk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV92YWxpZGF0ZV92cG9ydF9jcmVhdGUpOworCisvKioKKyAqIGZjb2VfZ2V0X3d3bigpIC0gR2V0IHRoZSB3b3JsZCB3aWRlIG5hbWUgZnJvbSBMTEQgaWYgaXQgc3VwcG9ydHMgaXQKKyAqIEBuZXRkZXY6IHRoZSBhc3NvY2lhdGVkIG5ldCBkZXZpY2UKKyAqIEB3d246IHRoZSBvdXRwdXQgV1dOCisgKiBAdHlwZTogdGhlIHR5cGUgb2YgV1dOIChXV1BOIG9yIFdXTk4pCisgKgorICogUmV0dXJuczogMCBmb3Igc3VjY2VzcworICovCitpbnQgZmNvZV9nZXRfd3duKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHU2NCAqd3duLCBpbnQgdHlwZSkKK3sKKwljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IG5ldGRldi0+bmV0ZGV2X29wczsKKworCWlmIChvcHMtPm5kb19mY29lX2dldF93d24pCisJCXJldHVybiBvcHMtPm5kb19mY29lX2dldF93d24obmV0ZGV2LCB3d24sIHR5cGUpOworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV9nZXRfd3duKTsKKwogLyoqCiAgKiBmY29lX2ZjX2NyYygpIC0gQ2FsY3VsYXRlcyB0aGUgQ1JDIGZvciBhIGdpdmVuIGZyYW1lCiAgKiBAZnA6IFRoZSBmcmFtZSB0byBiZSBjaGVja3N1bWVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ3ZwMTEuYyBiL2RyaXZlcnMvc2NzaS9ndnAxMS5jCmluZGV4IDUwYmI1NDEuLjQ4OGZiYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ndnAxMS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ndnAxMS5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaG9zdHMuYyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5jCmluZGV4IDRmN2E1ODIuLjM1MWRjMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jCisrKyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5jCkBAIC0yODYsNiArMjg2LDcgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChkZXYpOwogCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGRldi0+cGFyZW50OworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwogCiAJc2NzaV9wcm9jX2hvc3RkaXJfcm0oc2hvc3QtPmhvc3R0KTsKIApAQCAtMjkzLDkgKzI5NCwxMSBAQAogCQlrdGhyZWFkX3N0b3Aoc2hvc3QtPmVoYW5kbGVyKTsKIAlpZiAoc2hvc3QtPndvcmtfcSkKIAkJZGVzdHJveV93b3JrcXVldWUoc2hvc3QtPndvcmtfcSk7Ci0JaWYgKHNob3N0LT51c3BhY2VfcmVxX3EpIHsKLQkJa2ZyZWUoc2hvc3QtPnVzcGFjZV9yZXFfcS0+cXVldWVkYXRhKTsKLQkJc2NzaV9mcmVlX3F1ZXVlKHNob3N0LT51c3BhY2VfcmVxX3EpOworCXEgPSBzaG9zdC0+dXNwYWNlX3JlcV9xOworCWlmIChxKSB7CisJCWtmcmVlKHEtPnF1ZXVlZGF0YSk7CisJCXEtPnF1ZXVlZGF0YSA9IE5VTEw7CisJCXNjc2lfZnJlZV9xdWV1ZShxKTsKIAl9CiAKIAlzY3NpX2Rlc3Ryb3lfY29tbWFuZF9mcmVlbGlzdChzaG9zdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHBzYS5jIGIvZHJpdmVycy9zY3NpL2hwc2EuYwppbmRleCBiMjAwYjczLi5lNzYxMDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaHBzYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgImhwc2FfY21kLmgiCiAjaW5jbHVkZSAiaHBzYS5oIgogCkBAIC0xMjcsNiArMTI4LDEwIEBACiAKIHN0YXRpYyBpbnQgbnVtYmVyX29mX2NvbnRyb2xsZXJzOwogCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBocHNhX2N0bHJfbGlzdCA9IExJU1RfSEVBRF9JTklUKGhwc2FfY3Rscl9saXN0KTsKK3N0YXRpYyBzcGlubG9ja190IGxvY2t1cF9kZXRlY3Rvcl9sb2NrOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqaHBzYV9sb2NrdXBfZGV0ZWN0b3I7CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBkb19ocHNhX2ludHJfaW50eChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIGlycXJldHVybl90IGRvX2hwc2FfaW50cl9tc2koaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyBpbnQgaHBzYV9pb2N0bChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgaW50IGNtZCwgdm9pZCAqYXJnKTsKQEAgLTQ4NCw2ICs0ODksNyBAQAogI2VuZGlmCiAJLnNkZXZfYXR0cnMgPSBocHNhX3NkZXZfYXR0cnMsCiAJLnNob3N0X2F0dHJzID0gaHBzYV9zaG9zdF9hdHRycywKKwkubWF4X3NlY3RvcnMgPSA4MTkyLAogfTsKIAogCkBAIC01NjYsMTYgKzU3MiwxNiBAQAogCSAqIGFzc3VtZXMgaC0+ZGV2bG9jayBpcyBoZWxkCiAJICovCiAJaW50IGksIGZvdW5kID0gMDsKLQlERUNMQVJFX0JJVE1BUChsdW5fdGFrZW4sIEhQU0FfTUFYX1NDU0lfREVWU19QRVJfSEJBKTsKKwlERUNMQVJFX0JJVE1BUChsdW5fdGFrZW4sIEhQU0FfTUFYX0RFVklDRVMpOwogCi0JbWVtc2V0KCZsdW5fdGFrZW5bMF0sIDAsIEhQU0FfTUFYX1NDU0lfREVWU19QRVJfSEJBID4+IDMpOworCW1lbXNldCgmbHVuX3Rha2VuWzBdLCAwLCBIUFNBX01BWF9ERVZJQ0VTID4+IDMpOwogCiAJZm9yIChpID0gMDsgaSA8IGgtPm5kZXZpY2VzOyBpKyspIHsKIAkJaWYgKGgtPmRldltpXS0+YnVzID09IGJ1cyAmJiBoLT5kZXZbaV0tPnRhcmdldCAhPSAtMSkKIAkJCXNldF9iaXQoaC0+ZGV2W2ldLT50YXJnZXQsIGx1bl90YWtlbik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IEhQU0FfTUFYX1NDU0lfREVWU19QRVJfSEJBOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgSFBTQV9NQVhfREVWSUNFUzsgaSsrKSB7CiAJCWlmICghdGVzdF9iaXQoaSwgbHVuX3Rha2VuKSkgewogCQkJLyogKmJ1cyA9IDE7ICovCiAJCQkqdGFyZ2V0ID0gaTsKQEAgLTU5OCw3ICs2MDQsNyBAQAogCXVuc2lnbmVkIGNoYXIgYWRkcjFbOF0sIGFkZHIyWzhdOwogCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKnNkOwogCi0JaWYgKG4gPj0gSFBTQV9NQVhfU0NTSV9ERVZTX1BFUl9IQkEpIHsKKwlpZiAobiA+PSBIUFNBX01BWF9ERVZJQ0VTKSB7CiAJCWRldl9lcnIoJmgtPnBkZXYtPmRldiwgInRvbyBtYW55IGRldmljZXMsIHNvbWUgd2lsbCBiZSAiCiAJCQkiaW5hY2Nlc3NpYmxlLlxuIik7CiAJCXJldHVybiAtMTsKQEAgLTY3Myw3ICs2NzksNyBAQAogCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKnJlbW92ZWRbXSwgaW50ICpucmVtb3ZlZCkKIHsKIAkvKiBhc3N1bWVzIGgtPmRldmxvY2sgaXMgaGVsZCAqLwotCUJVR19PTihlbnRyeSA8IDAgfHwgZW50cnkgPj0gSFBTQV9NQVhfU0NTSV9ERVZTX1BFUl9IQkEpOworCUJVR19PTihlbnRyeSA8IDAgfHwgZW50cnkgPj0gSFBTQV9NQVhfREVWSUNFUyk7CiAJcmVtb3ZlZFsqbnJlbW92ZWRdID0gaC0+ZGV2W2VudHJ5XTsKIAkoKm5yZW1vdmVkKSsrOwogCkBAIC03MDIsNyArNzA4LDcgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICpzZDsKIAotCUJVR19PTihlbnRyeSA8IDAgfHwgZW50cnkgPj0gSFBTQV9NQVhfU0NTSV9ERVZTX1BFUl9IQkEpOworCUJVR19PTihlbnRyeSA8IDAgfHwgZW50cnkgPj0gSFBTQV9NQVhfREVWSUNFUyk7CiAKIAlzZCA9IGgtPmRldltlbnRyeV07CiAJcmVtb3ZlZFsqbnJlbW92ZWRdID0gaC0+ZGV2W2VudHJ5XTsKQEAgLTgxNCwxMCArODIwLDggQEAKIAlpbnQgbmFkZGVkLCBucmVtb3ZlZDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaCA9IE5VTEw7CiAKLQlhZGRlZCA9IGt6YWxsb2Moc2l6ZW9mKCphZGRlZCkgKiBIUFNBX01BWF9TQ1NJX0RFVlNfUEVSX0hCQSwKLQkJR0ZQX0tFUk5FTCk7Ci0JcmVtb3ZlZCA9IGt6YWxsb2Moc2l6ZW9mKCpyZW1vdmVkKSAqIEhQU0FfTUFYX1NDU0lfREVWU19QRVJfSEJBLAotCQlHRlBfS0VSTkVMKTsKKwlhZGRlZCA9IGt6YWxsb2Moc2l6ZW9mKCphZGRlZCkgKiBIUFNBX01BWF9ERVZJQ0VTLCBHRlBfS0VSTkVMKTsKKwlyZW1vdmVkID0ga3phbGxvYyhzaXplb2YoKnJlbW92ZWQpICogSFBTQV9NQVhfREVWSUNFUywgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWFkZGVkIHx8ICFyZW1vdmVkKSB7CiAJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGluICIKQEAgLTEzMzgsNiArMTM0MiwyMiBAQAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogfQogCitzdGF0aWMgdm9pZCBocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlX2lmX25vX2xvY2t1cChzdHJ1Y3QgY3Rscl9pbmZvICpoLAorCXN0cnVjdCBDb21tYW5kTGlzdCAqYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSWYgY29udHJvbGxlciBsb2NrdXAgZGV0ZWN0ZWQsIGZha2UgYSBoYXJkd2FyZSBlcnJvci4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseShoLT5sb2NrdXBfZGV0ZWN0ZWQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgPSBDTURfSEFSRFdBUkVfRVJSOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZShoLCBjKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX3dpdGhfcmV0cnkoc3RydWN0IGN0bHJfaW5mbyAqaCwKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIGludCBkYXRhX2RpcmVjdGlvbikKIHsKQEAgLTE3MzUsNyArMTc1NSw2IEBACiAJaWYgKGlzX3Njc2lfcmV2XzUoaCkpCiAJCXJldHVybiAwOyAvKiBwMTIxMG0gZG9lc24ndCBuZWVkIHRvIGRvIHRoaXMuICovCiAKLSNkZWZpbmUgTUFYX01TQTJYWFhfRU5DTE9TVVJFUyAzMgogCWlmICgqbm1zYTJ4eHhfZW5jbG9zdXJlcyA+PSBNQVhfTVNBMlhYWF9FTkNMT1NVUkVTKSB7CiAJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJNYXhpbXVtIG51bWJlciBvZiBNU0EyWFhYICIKIAkJCSJlbmNsb3N1cmVzIGV4Y2VlZGVkLiAgQ2hlY2sgeW91ciBoYXJkd2FyZSAiCkBAIC0xODQ2LDggKzE4NjUsNyBAQAogCWludCByYWlkX2N0bHJfcG9zaXRpb247CiAJREVDTEFSRV9CSVRNQVAobHVuemVyb2JpdHMsIEhQU0FfTUFYX1RBUkdFVFNfUEVSX0NUTFIpOwogCi0JY3VycmVudHNkID0ga3phbGxvYyhzaXplb2YoKmN1cnJlbnRzZCkgKiBIUFNBX01BWF9TQ1NJX0RFVlNfUEVSX0hCQSwKLQkJR0ZQX0tFUk5FTCk7CisJY3VycmVudHNkID0ga3phbGxvYyhzaXplb2YoKmN1cnJlbnRzZCkgKiBIUFNBX01BWF9ERVZJQ0VTLCBHRlBfS0VSTkVMKTsKIAlwaHlzZGV2X2xpc3QgPSBremFsbG9jKHJlcG9ydGx1bnNpemUsIEdGUF9LRVJORUwpOwogCWxvZ2Rldl9saXN0ID0ga3phbGxvYyhyZXBvcnRsdW5zaXplLCBHRlBfS0VSTkVMKTsKIAl0bXBkZXZpY2UgPSBremFsbG9jKHNpemVvZigqdG1wZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CkBAIC0xODcwLDYgKzE4ODgsMTMgQEAKIAogCS8qIEFsbG9jYXRlIHRoZSBwZXIgZGV2aWNlIHN0cnVjdHVyZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbmRldnNfdG9fYWxsb2NhdGU7IGkrKykgeworCQlpZiAoaSA+PSBIUFNBX01BWF9ERVZJQ0VTKSB7CisJCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAibWF4aW11bSBkZXZpY2VzICglZCkgZXhjZWVkZWQuIgorCQkJCSIgICVkIGRldmljZXMgaWdub3JlZC5cbiIsIEhQU0FfTUFYX0RFVklDRVMsCisJCQkJbmRldnNfdG9fYWxsb2NhdGUgLSBIUFNBX01BWF9ERVZJQ0VTKTsKKwkJCWJyZWFrOworCQl9CisKIAkJY3VycmVudHNkW2ldID0ga3phbGxvYyhzaXplb2YoKmN1cnJlbnRzZFtpXSksIEdGUF9LRVJORUwpOwogCQlpZiAoIWN1cnJlbnRzZFtpXSkgewogCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIm91dCBvZiBtZW1vcnkgYXQgJXM6JWRcbiIsCkBAIC0xOTU2LDcgKzE5ODEsNyBAQAogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKG5jdXJyZW50ID49IEhQU0FfTUFYX1NDU0lfREVWU19QRVJfSEJBKQorCQlpZiAobmN1cnJlbnQgPj0gSFBTQV9NQVhfREVWSUNFUykKIAkJCWJyZWFrOwogCX0KIAlhZGp1c3RfaHBzYV9zY3NpX3RhYmxlKGgsIGhvc3RubywgY3VycmVudHNkLCBuY3VycmVudCk7CkBAIC0yMDQ4LDggKzIwNzMsMTQgQEAKIAl9CiAJbWVtY3B5KHNjc2kzYWRkciwgZGV2LT5zY3NpM2FkZHIsIHNpemVvZihzY3NpM2FkZHIpKTsKIAotCS8qIE5lZWQgYSBsb2NrIGFzIHRoaXMgaXMgYmVpbmcgYWxsb2NhdGVkIGZyb20gdGhlIHBvb2wgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseShoLT5sb2NrdXBfZGV0ZWN0ZWQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWRvbmUoY21kKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIE5lZWQgYSBsb2NrIGFzIHRoaXMgaXMgYmVpbmcgYWxsb2NhdGVkIGZyb20gdGhlIHBvb2wgKi8KIAljID0gY21kX2FsbG9jKGgpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKIAlpZiAoYyA9PSBOVUxMKSB7CQkJLyogdHJvdWJsZS4uLiAqLwpAQCAtMjYwMSw3ICsyNjMyLDcgQEAKIAkJYy0+U0dbMF0uTGVuID0gaW9jb21tYW5kLmJ1Zl9zaXplOwogCQljLT5TR1swXS5FeHQgPSAwOyAvKiB3ZSBhcmUgbm90IGNoYWluaW5nKi8KIAl9Ci0JaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZShoLCBjKTsKKwlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlX2lmX25vX2xvY2t1cChoLCBjKTsKIAlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplID4gMCkKIAkJaHBzYV9wY2lfdW5tYXAoaC0+cGRldiwgYywgMSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAljaGVja19pb2N0bF91bml0X2F0dGVudGlvbihoLCBjKTsKQEAgLTI3MjQsNyArMjc1NSw3IEBACiAJCQljLT5TR1tpXS5FeHQgPSAwOwogCQl9CiAJfQotCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX2NvcmUoaCwgYyk7CisJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZV9pZl9ub19sb2NrdXAoaCwgYyk7CiAJaWYgKHNnX3VzZWQpCiAJCWhwc2FfcGNpX3VubWFwKGgtPnBkZXYsIGMsIHNnX3VzZWQsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJY2hlY2tfaW9jdGxfdW5pdF9hdHRlbnRpb24oaCwgYyk7CkBAIC0yODcyLDYgKzI5MDMsOCBAQAogCQkJYy0+UmVxdWVzdC5UaW1lb3V0ID0gMDsKIAkJCWMtPlJlcXVlc3QuQ0RCWzBdID0gQk1JQ19XUklURTsKIAkJCWMtPlJlcXVlc3QuQ0RCWzZdID0gQk1JQ19DQUNIRV9GTFVTSDsKKwkJCWMtPlJlcXVlc3QuQ0RCWzddID0gKHNpemUgPj4gOCkgJiAweEZGOworCQkJYy0+UmVxdWVzdC5DREJbOF0gPSBzaXplICYgMHhGRjsKIAkJCWJyZWFrOwogCQljYXNlIFRFU1RfVU5JVF9SRUFEWToKIAkJCWMtPlJlcXVlc3QuQ0RCTGVuID0gNjsKQEAgLTMwOTEsNiArMzEyNCw3IEBACiAJaWYgKGludGVycnVwdF9ub3RfZm9yX3VzKGgpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwloLT5sYXN0X2ludHJfdGltZXN0YW1wID0gZ2V0X2ppZmZpZXNfNjQoKTsKIAl3aGlsZSAoaW50ZXJydXB0X3BlbmRpbmcoaCkpIHsKIAkJcmF3X3RhZyA9IGdldF9uZXh0X2NvbXBsZXRpb24oaCk7CiAJCXdoaWxlIChyYXdfdGFnICE9IEZJRk9fRU1QVFkpCkBAIC0zMTEwLDYgKzMxNDQsNyBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCWgtPmxhc3RfaW50cl90aW1lc3RhbXAgPSBnZXRfamlmZmllc182NCgpOwogCXJhd190YWcgPSBnZXRfbmV4dF9jb21wbGV0aW9uKGgpOwogCXdoaWxlIChyYXdfdGFnICE9IEZJRk9fRU1QVFkpCiAJCXJhd190YWcgPSBuZXh0X2NvbW1hbmQoaCk7CkBAIC0zMTI2LDYgKzMxNjEsNyBAQAogCWlmIChpbnRlcnJ1cHRfbm90X2Zvcl91cyhoKSkKIAkJcmV0dXJuIElSUV9OT05FOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CisJaC0+bGFzdF9pbnRyX3RpbWVzdGFtcCA9IGdldF9qaWZmaWVzXzY0KCk7CiAJd2hpbGUgKGludGVycnVwdF9wZW5kaW5nKGgpKSB7CiAJCXJhd190YWcgPSBnZXRfbmV4dF9jb21wbGV0aW9uKGgpOwogCQl3aGlsZSAocmF3X3RhZyAhPSBGSUZPX0VNUFRZKSB7CkBAIC0zMTQ2LDYgKzMxODIsNyBAQAogCXUzMiByYXdfdGFnOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwloLT5sYXN0X2ludHJfdGltZXN0YW1wID0gZ2V0X2ppZmZpZXNfNjQoKTsKIAlyYXdfdGFnID0gZ2V0X25leHRfY29tcGxldGlvbihoKTsKIAl3aGlsZSAocmF3X3RhZyAhPSBGSUZPX0VNUFRZKSB7CiAJCWlmIChocHNhX3RhZ19jb250YWluc19pbmRleChyYXdfdGFnKSkKQEAgLTMzMDAsNiArMzMzNywxMyBAQAogCQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKIAkJcG1jc3IgfD0gUENJX0QwOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BNX0NUUkwsIHBtY3NyKTsKKworCQkvKgorCQkgKiBUaGUgUDYwMCByZXF1aXJlcyBhIHNtYWxsIGRlbGF5IHdoZW4gY2hhbmdpbmcgc3RhdGVzLgorCQkgKiBPdGhlcndpc2Ugd2UgbWF5IHRoaW5rIHRoZSBib2FyZCBkaWQgbm90IHJlc2V0IGFuZCB3ZSBiYWlsLgorCQkgKiBUaGlzIGZvciBrZHVtcCBvbmx5IGFuZCBpcyBwYXJ0aWN1bGFyIHRvIHRoZSBQNjAwLgorCQkgKi8KKwkJbXNsZWVwKDUwMCk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzQzOCwxMCArMzQ4Miw4IEBACiAJfSBlbHNlIHsKIAkJdXNlX2Rvb3JiZWxsID0gbWlzY19md19zdXBwb3J0ICYgTUlTQ19GV19ET09SQkVMTF9SRVNFVDsKIAkJaWYgKHVzZV9kb29yYmVsbCkgewotCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkNvbnRyb2xsZXIgY2xhaW1zIHRoYXQgIgotCQkJCSInQml0IDIgZG9vcmJlbGwgcmVzZXQnIGlzICIKLQkJCQkic3VwcG9ydGVkLCBidXQgbm90ICdiaXQgNSBkb29yYmVsbCByZXNldCcuICAiCi0JCQkJIkZpcm13YXJlIHVwZGF0ZSBpcyByZWNvbW1lbmRlZC5cbiIpOworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlNvZnQgcmVzZXQgbm90IHN1cHBvcnRlZC4gIgorCQkJCSJGaXJtd2FyZSB1cGRhdGUgaXMgcmVxdWlyZWQuXG4iKTsKIAkJCXJjID0gLUVOT1RTVVBQOyAvKiB0cnkgc29mdCByZXNldCAqLwogCQkJZ290byB1bm1hcF9jZmd0YWJsZTsKIAkJfQpAQCAtNDA4NSw2ICs0MTI3LDE0OSBAQAogCWtmcmVlKGgpOwogfQogCitzdGF0aWMgdm9pZCByZW1vdmVfY3Rscl9mcm9tX2xvY2t1cF9kZXRlY3Rvcl9saXN0KHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZsb2NrdXBfZGV0ZWN0b3JfbG9jayk7CisJaWYgKCFocHNhX2xvY2t1cF9kZXRlY3RvcikKKwkJcmV0dXJuOworCWlmIChoLT5sb2NrdXBfZGV0ZWN0ZWQpCisJCXJldHVybjsgLyogYWxyZWFkeSBzdG9wcGVkIHRoZSBsb2NrdXAgZGV0ZWN0b3IgKi8KKwlsaXN0X2RlbCgmaC0+bG9ja3VwX2xpc3QpOworfQorCisvKiBDYWxsZWQgd2hlbiBjb250cm9sbGVyIGxvY2t1cCBkZXRlY3RlZC4gKi8KK3N0YXRpYyB2b2lkIGZhaWxfYWxsX2NtZHNfb25fbGlzdChzdHJ1Y3QgY3Rscl9pbmZvICpoLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBDb21tYW5kTGlzdCAqYyA9IE5VTEw7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmgtPmxvY2spOworCS8qIE1hcmsgYWxsIG91dHN0YW5kaW5nIGNvbW1hbmRzIGFzIGZhaWxlZCBhbmQgY29tcGxldGUgdGhlbS4gKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJYyA9IGxpc3RfZW50cnkobGlzdC0+bmV4dCwgc3RydWN0IENvbW1hbmRMaXN0LCBsaXN0KTsKKwkJYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgPSBDTURfSEFSRFdBUkVfRVJSOworCQlmaW5pc2hfY21kKGMsIGMtPkhlYWRlci5UYWcubG93ZXIpOworCX0KK30KKworc3RhdGljIHZvaWQgY29udHJvbGxlcl9sb2NrdXBfZGV0ZWN0ZWQoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZsb2NrdXBfZGV0ZWN0b3JfbG9jayk7CisJcmVtb3ZlX2N0bHJfZnJvbV9sb2NrdXBfZGV0ZWN0b3JfbGlzdChoKTsKKwloLT5hY2Nlc3Muc2V0X2ludHJfbWFzayhoLCBIUFNBX0lOVFJfT0ZGKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCWgtPmxvY2t1cF9kZXRlY3RlZCA9IHJlYWRsKGgtPnZhZGRyICsgU0E1X1NDUkFUQ0hQQURfT0ZGU0VUKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIkNvbnRyb2xsZXIgbG9ja3VwIGRldGVjdGVkOiAweCUwOHhcbiIsCisJCQloLT5sb2NrdXBfZGV0ZWN0ZWQpOworCXBjaV9kaXNhYmxlX2RldmljZShoLT5wZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCWZhaWxfYWxsX2NtZHNfb25fbGlzdChoLCAmaC0+Y21wUSk7CisJZmFpbF9hbGxfY21kc19vbl9saXN0KGgsICZoLT5yZXFRKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7Cit9CisKKyNkZWZpbmUgSEVBUlRCRUFUX1NBTVBMRV9JTlRFUlZBTCAoMTAgKiBIWikKKyNkZWZpbmUgSEVBUlRCRUFUX0NIRUNLX01JTklNVU1fSU5URVJWQUwgKEhFQVJUQkVBVF9TQU1QTEVfSU5URVJWQUwgLyAyKQorCitzdGF0aWMgdm9pZCBkZXRlY3RfY29udHJvbGxlcl9sb2NrdXAoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1NjQgbm93OworCXUzMiBoZWFydGJlYXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmbG9ja3VwX2RldGVjdG9yX2xvY2spOworCW5vdyA9IGdldF9qaWZmaWVzXzY0KCk7CisJLyogSWYgd2UndmUgcmVjZWl2ZWQgYW4gaW50ZXJydXB0IHJlY2VudGx5LCB3ZSdyZSBvay4gKi8KKwlpZiAodGltZV9hZnRlcjY0KGgtPmxhc3RfaW50cl90aW1lc3RhbXAgKworCQkJCShIRUFSVEJFQVRfQ0hFQ0tfTUlOSU1VTV9JTlRFUlZBTCksIG5vdykpCisJCXJldHVybjsKKworCS8qCisJICogSWYgd2UndmUgYWxyZWFkeSBjaGVja2VkIHRoZSBoZWFydGJlYXQgcmVjZW50bHksIHdlJ3JlIG9rLgorCSAqIFRoaXMgY291bGQgaGFwcGVuIGlmIHNvbWVvbmUgc2VuZHMgdXMgYSBzaWduYWwuIFdlCisJICogb3RoZXJ3aXNlIGRvbid0IGNhcmUgYWJvdXQgc2lnbmFscyBpbiB0aGlzIHRocmVhZC4KKwkgKi8KKwlpZiAodGltZV9hZnRlcjY0KGgtPmxhc3RfaGVhcnRiZWF0X3RpbWVzdGFtcCArCisJCQkJKEhFQVJUQkVBVF9DSEVDS19NSU5JTVVNX0lOVEVSVkFMKSwgbm93KSkKKwkJcmV0dXJuOworCisJLyogSWYgaGVhcnRiZWF0IGhhcyBub3QgY2hhbmdlZCBzaW5jZSB3ZSBsYXN0IGxvb2tlZCwgd2UncmUgbm90IG9rLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CisJaGVhcnRiZWF0ID0gcmVhZGwoJmgtPmNmZ3RhYmxlLT5IZWFydEJlYXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmgtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaC0+bGFzdF9oZWFydGJlYXQgPT0gaGVhcnRiZWF0KSB7CisJCWNvbnRyb2xsZXJfbG9ja3VwX2RldGVjdGVkKGgpOworCQlyZXR1cm47CisJfQorCisJLyogV2UncmUgb2suICovCisJaC0+bGFzdF9oZWFydGJlYXQgPSBoZWFydGJlYXQ7CisJaC0+bGFzdF9oZWFydGJlYXRfdGltZXN0YW1wID0gbm93OworfQorCitzdGF0aWMgaW50IGRldGVjdF9jb250cm9sbGVyX2xvY2t1cF90aHJlYWQodm9pZCAqbm90dXNlZCkKK3sKKwlzdHJ1Y3QgY3Rscl9pbmZvICpoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqdG1wOworCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIRUFSVEJFQVRfU0FNUExFX0lOVEVSVkFMKTsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9ja3VwX2RldGVjdG9yX2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHRoaXMsIHRtcCwgJmhwc2FfY3Rscl9saXN0KSB7CisJCQloID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgY3Rscl9pbmZvLCBsb2NrdXBfbGlzdCk7CisJCQlkZXRlY3RfY29udHJvbGxlcl9sb2NrdXAoaCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9ja3VwX2RldGVjdG9yX2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jdGxyX3RvX2xvY2t1cF9kZXRlY3Rvcl9saXN0KHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrdXBfZGV0ZWN0b3JfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmgtPmxvY2t1cF9saXN0LCAmaHBzYV9jdGxyX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2t1cF9kZXRlY3Rvcl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2NvbnRyb2xsZXJfbG9ja3VwX2RldGVjdG9yKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJLyogU3RhcnQgdGhlIGxvY2t1cCBkZXRlY3RvciB0aHJlYWQgaWYgbm90IGFscmVhZHkgc3RhcnRlZCAqLworCWlmICghaHBzYV9sb2NrdXBfZGV0ZWN0b3IpIHsKKwkJc3Bpbl9sb2NrX2luaXQoJmxvY2t1cF9kZXRlY3Rvcl9sb2NrKTsKKwkJaHBzYV9sb2NrdXBfZGV0ZWN0b3IgPQorCQkJa3RocmVhZF9ydW4oZGV0ZWN0X2NvbnRyb2xsZXJfbG9ja3VwX3RocmVhZCwKKwkJCQkJCU5VTEwsICJocHNhIik7CisJfQorCWlmICghaHBzYV9sb2NrdXBfZGV0ZWN0b3IpIHsKKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKKwkJCSJDb3VsZCBub3Qgc3RhcnQgbG9ja3VwIGRldGVjdG9yIHRocmVhZFxuIik7CisJCXJldHVybjsKKwl9CisJYWRkX2N0bHJfdG9fbG9ja3VwX2RldGVjdG9yX2xpc3QoaCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BfY29udHJvbGxlcl9sb2NrdXBfZGV0ZWN0b3Ioc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2t1cF9kZXRlY3Rvcl9sb2NrLCBmbGFncyk7CisJcmVtb3ZlX2N0bHJfZnJvbV9sb2NrdXBfZGV0ZWN0b3JfbGlzdChoKTsKKwkvKiBJZiB0aGUgbGlzdCBvZiBjdGxyJ3MgdG8gbW9uaXRvciBpcyBlbXB0eSwgc3RvcCB0aGUgdGhyZWFkICovCisJaWYgKGxpc3RfZW1wdHkoJmhwc2FfY3Rscl9saXN0KSkgeworCQlrdGhyZWFkX3N0b3AoaHBzYV9sb2NrdXBfZGV0ZWN0b3IpOworCQlocHNhX2xvY2t1cF9kZXRlY3RvciA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2t1cF9kZXRlY3Rvcl9sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGhwc2FfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC00MTIyLDcgKzQzMDcsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWgtPnBkZXYgPSBwZGV2OwotCWgtPmJ1c3lfaW5pdGlhbGl6aW5nID0gMTsKIAloLT5pbnRyX21vZGUgPSBocHNhX3NpbXBsZV9tb2RlID8gU0lNUExFX01PREVfSU5UIDogUEVSRl9NT0RFX0lOVDsKIAlJTklUX0xJU1RfSEVBRCgmaC0+Y21wUSk7CiAJSU5JVF9MSVNUX0hFQUQoJmgtPnJlcVEpOwpAQCAtNDIzMSw3ICs0NDE1LDcgQEAKIAogCWhwc2FfaGJhX2lucXVpcnkoaCk7CiAJaHBzYV9yZWdpc3Rlcl9zY3NpKGgpOwkvKiBob29rIG91cnNlbHZlcyBpbnRvIFNDU0kgc3Vic3lzdGVtICovCi0JaC0+YnVzeV9pbml0aWFsaXppbmcgPSAwOworCXN0YXJ0X2NvbnRyb2xsZXJfbG9ja3VwX2RldGVjdG9yKGgpOwogCXJldHVybiAxOwogCiBjbGVhbjQ6CkBAIC00MjQwLDcgKzQ0MjQsNiBAQAogCWZyZWVfaXJxKGgtPmludHJbaC0+aW50cl9tb2RlXSwgaCk7CiBjbGVhbjI6CiBjbGVhbjE6Ci0JaC0+YnVzeV9pbml0aWFsaXppbmcgPSAwOwogCWtmcmVlKGgpOwogCXJldHVybiByYzsKIH0KQEAgLTQyOTUsMTAgKzQ0NzgsMTEgQEAKIAlzdHJ1Y3QgY3Rscl9pbmZvICpoOwogCiAJaWYgKHBjaV9nZXRfZHJ2ZGF0YShwZGV2KSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byByZW1vdmUgZGV2aWNlIFxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byByZW1vdmUgZGV2aWNlXG4iKTsKIAkJcmV0dXJuOwogCX0KIAloID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0b3BfY29udHJvbGxlcl9sb2NrdXBfZGV0ZWN0b3IoaCk7CiAJaHBzYV91bnJlZ2lzdGVyX3Njc2koaCk7CS8qIHVuaG9vayBmcm9tIFNDU0kgc3Vic3lzdGVtICovCiAJaHBzYV9zaHV0ZG93bihwZGV2KTsKIAlpb3VubWFwKGgtPnZhZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhLmggYi9kcml2ZXJzL3Njc2kvaHBzYS5oCmluZGV4IDdmNTNjZWFhLi45MWVkYWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaHBzYS5oCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhLmgKQEAgLTk1LDggKzk1LDYgQEAKIAl1bnNpZ25lZCBsb25nICAJCSpjbWRfcG9vbF9iaXRzOwogCWludAkJCW5yX2FsbG9jczsKIAlpbnQJCQlucl9mcmVlczsKLQlpbnQJCQlidXN5X2luaXRpYWxpemluZzsKLQlpbnQJCQlidXN5X3NjYW5uaW5nOwogCWludAkJCXNjYW5fZmluaXNoZWQ7CiAJc3BpbmxvY2tfdAkJc2Nhbl9sb2NrOwogCXdhaXRfcXVldWVfaGVhZF90CXNjYW5fd2FpdF9xdWV1ZTsKQEAgLTEwNCw4ICsxMDIsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdDsKIAlzcGlubG9ja190IGRldmxvY2s7IC8qIHRvIHByb3RlY3QgaGJhW2N0bHJdLT5kZXZbXTsgICovCiAJaW50IG5kZXZpY2VzOyAvKiBudW1iZXIgb2YgdXNlZCBlbGVtZW50cyBpbiAuZGV2W10gYXJyYXkuICovCi0jZGVmaW5lIEhQU0FfTUFYX1NDU0lfREVWU19QRVJfSEJBIDI1NgotCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldltIUFNBX01BWF9TQ1NJX0RFVlNfUEVSX0hCQV07CisJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2W0hQU0FfTUFYX0RFVklDRVNdOwogCS8qCiAJICogUGVyZm9ybWFudCBtb2RlIHRhYmxlcy4KIAkgKi8KQEAgLTEyNCw2ICsxMjEsMTEgQEAKIAl1bnNpZ25lZCBjaGFyIHJlcGx5X3Bvb2xfd3JhcGFyb3VuZDsKIAl1MzIgKmJsb2NrRmV0Y2hUYWJsZTsKIAl1bnNpZ25lZCBjaGFyICpoYmFfaW5xdWlyeV9kYXRhOworCXU2NCBsYXN0X2ludHJfdGltZXN0YW1wOworCXUzMiBsYXN0X2hlYXJ0YmVhdDsKKwl1NjQgbGFzdF9oZWFydGJlYXRfdGltZXN0YW1wOworCXUzMiBsb2NrdXBfZGV0ZWN0ZWQ7CisJc3RydWN0IGxpc3RfaGVhZCBsb2NrdXBfbGlzdDsKIH07CiAjZGVmaW5lIEhQU0FfQUJPUlRfTVNHIDAKICNkZWZpbmUgSFBTQV9ERVZJQ0VfUkVTRVRfTVNHIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oIGIvZHJpdmVycy9zY3NpL2hwc2FfY21kLmgKaW5kZXggNTVkNzQxYi4uM2ZkNDcxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2FfY21kLmgKKysrIGIvZHJpdmVycy9zY3NpL2hwc2FfY21kLmgKQEAgLTEyMyw4ICsxMjMsMTEgQEAKIAogLyogRklYTUUgdGhpcyBpcyBhIHBlciBjb250cm9sbGVyIHZhbHVlIChiYXJmISkgKi8KICNkZWZpbmUgSFBTQV9NQVhfVEFSR0VUU19QRVJfQ1RMUiAxNgotI2RlZmluZSBIUFNBX01BWF9MVU4gMjU2CisjZGVmaW5lIEhQU0FfTUFYX0xVTiAxMDI0CiAjZGVmaW5lIEhQU0FfTUFYX1BIWVNfTFVOIDEwMjQKKyNkZWZpbmUgTUFYX01TQTJYWFhfRU5DTE9TVVJFUyAzMgorI2RlZmluZSBIUFNBX01BWF9ERVZJQ0VTIChIUFNBX01BWF9QSFlTX0xVTiArIEhQU0FfTUFYX0xVTiArIFwKKwlNQVhfTVNBMlhYWF9FTkNMT1NVUkVTICsgMSkgLyogKyAxIGlzIGZvciB0aGUgY29udHJvbGxlciBpdHNlbGYgKi8KIAogLyogU0NTSS0zIENvbW1hbmRzICovCiAjcHJhZ21hIHBhY2soMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuYyBiL2RyaXZlcnMvc2NzaS9pcHIuYwppbmRleCA4ZDYzNjMwLi5mZDg2MGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXByLmMKKysrIGIvZHJpdmVycy9zY3NpL2lwci5jCkBAIC0yOTAxLDcgKzI5MDEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKIAotCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgIT0gR0VUX0RVTVApIHsKKwlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlICE9IFJFQURfRFVNUCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CiAJCXJldHVybjsKIAl9CkBAIC0zMDk3LDcgKzMwOTcsNyBAQAogCUVOVEVSOwogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CiAKLQlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IEdFVF9EVU1QKSB7CisJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBSRUFEX0RVTVApIHsKIAkJZHVtcCA9IGlvYV9jZmctPmR1bXA7CiAJCWlmICghZHVtcCkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwpAQCAtMzEwOSw3ICszMTA5LDcgQEAKIAkJa3JlZl9wdXQoJmR1bXAtPmtyZWYsIGlwcl9yZWxlYXNlX2R1bXApOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7Ci0JCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gRFVNUF9PQlRBSU5FRCkKKwkJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBEVU1QX09CVEFJTkVEICYmICFpb2FfY2ZnLT5kdW1wX3RpbWVvdXQpCiAJCQlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT05FKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwogCQlyZXR1cm47CkBAIC0zNzUxLDE0ICszNzUxLDYgQEAKIAogCWltYWdlX2hkciA9IChzdHJ1Y3QgaXByX3Vjb2RlX2ltYWdlX2hlYWRlciAqKWZ3X2VudHJ5LT5kYXRhOwogCi0JaWYgKGJlMzJfdG9fY3B1KGltYWdlX2hkci0+aGVhZGVyX2xlbmd0aCkgPiBmd19lbnRyeS0+c2l6ZSB8fAotCSAgICAoaW9hX2NmZy0+dnBkX2Nicy0+cGFnZTNfZGF0YS5jYXJkX3R5cGUgJiYKLQkgICAgIGlvYV9jZmctPnZwZF9jYnMtPnBhZ2UzX2RhdGEuY2FyZF90eXBlICE9IGltYWdlX2hkci0+Y2FyZF90eXBlKSkgewotCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJJbnZhbGlkIG1pY3JvY29kZSBidWZmZXJcbiIpOwotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJc3JjID0gKHU4ICopaW1hZ2VfaGRyICsgYmUzMl90b19jcHUoaW1hZ2VfaGRyLT5oZWFkZXJfbGVuZ3RoKTsKIAlkbmxkX3NpemUgPSBmd19lbnRyeS0+c2l6ZSAtIGJlMzJfdG9fY3B1KGltYWdlX2hkci0+aGVhZGVyX2xlbmd0aCk7CiAJc2dsaXN0ID0gaXByX2FsbG9jX3Vjb2RlX2J1ZmZlcihkbmxkX3NpemUpOwpAQCAtMzc3Nyw2ICszNzY5LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaXByX2luZm8oIlVwZGF0aW5nIG1pY3JvY29kZSwgcGxlYXNlIGJlIHBhdGllbnQuICBUaGlzIG1heSB0YWtlIHVwIHRvIDMwIG1pbnV0ZXMuXG4iKTsKKwogCXJlc3VsdCA9IGlwcl91cGRhdGVfaW9hX3Vjb2RlKGlvYV9jZmcsIHNnbGlzdCk7CiAKIAlpZiAoIXJlc3VsdCkKQEAgLTc0NDksOCArNzQ0MywxMSBAQAogCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CiAKIAlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IEdFVF9EVU1QKQorCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBXQUlUX0ZPUl9EVU1QOworCWVsc2UgaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBSRUFEX0RVTVApCiAJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEFCT1JUX0RVTVA7CiAKKwlpb2FfY2ZnLT5kdW1wX3RpbWVvdXQgPSAxOwogCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX3Jlc2V0X2FsZXJ0OwogCiAJcmV0dXJuIElQUl9SQ19KT0JfQ09OVElOVUU7CkBAIC03NjE0LDYgKzc2MTEsOCBAQAogCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF9lbmFibGVfaW9hOwogCiAJCWlmIChHRVRfRFVNUCA9PSBpb2FfY2ZnLT5zZHRfc3RhdGUpIHsKKwkJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IFJFQURfRFVNUDsKKwkJCWlvYV9jZmctPmR1bXBfdGltZW91dCA9IDA7CiAJCQlpZiAoaW9hX2NmZy0+c2lzNjQpCiAJCQkJaXByX3Jlc2V0X3N0YXJ0X3RpbWVyKGlwcl9jbWQsIElQUl9TSVM2NF9EVU1QX1RJTUVPVVQpOwogCQkJZWxzZQpAQCAtODAwMyw4ICs4MDAyLDEyIEBACiAJaWYgKGlvYV9jZmctPmlvYV9pc19kZWFkKQogCQlyZXR1cm47CiAKLQlpZiAoaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkICYmIGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBHRVRfRFVNUCkKLQkJaW9hX2NmZy0+c2R0X3N0YXRlID0gQUJPUlRfRFVNUDsKKwlpZiAoaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKSB7CisJCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gR0VUX0RVTVApCisJCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBXQUlUX0ZPUl9EVU1QOworCQllbHNlIGlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gUkVBRF9EVU1QKQorCQkJaW9hX2NmZy0+c2R0X3N0YXRlID0gQUJPUlRfRFVNUDsKKwl9CiAKIAlpZiAoaW9hX2NmZy0+cmVzZXRfcmV0cmllcysrID49IElQUl9OVU1fUkVTRVRfUkVMT0FEX1JFVFJJRVMpIHsKIAkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LApAQCAtODgxMiw3ICs4ODE1LDcgQEAKIAl1cHJvYyA9IHJlYWRsKGlvYV9jZmctPnJlZ3Muc2Vuc2VfdXByb2NfaW50ZXJydXB0X3JlZzMyKTsKIAlpZiAoKG1hc2sgJiBJUFJfUENJSV9IUlJRX1VQREFURUQpID09IDAgfHwgKHVwcm9jICYgSVBSX1VQUk9DSV9SRVNFVF9BTEVSVCkpCiAJCWlvYV9jZmctPm5lZWRzX2hhcmRfcmVzZXQgPSAxOwotCWlmIChpbnRlcnJ1cHRzICYgSVBSX1BDSUlfRVJST1JfSU5URVJSVVBUUykKKwlpZiAoKGludGVycnVwdHMgJiBJUFJfUENJSV9FUlJPUl9JTlRFUlJVUFRTKSB8fCByZXNldF9kZXZpY2VzKQogCQlpb2FfY2ZnLT5uZWVkc19oYXJkX3Jlc2V0ID0gMTsKIAlpZiAoaW50ZXJydXB0cyAmIElQUl9QQ0lJX0lPQV9VTklUX0NIRUNLRUQpCiAJCWlvYV9jZmctPmlvYV91bml0X2NoZWNrZWQgPSAxOwpAQCAtOTEyMCw2ICs5MTIzLDggQEAKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DX0ZQR0FfRTIsCiAJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdCMiwgMCwgMCwgMCB9LAogCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NfRlBHQV9FMiwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81N0MzLCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ19GUEdBX0UyLAogCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3QzQsIDAsIDAsIDAgfSwKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DX0FTSUNfRTIsCiAJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdCNCwgMCwgMCwgMCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5oIGIvZHJpdmVycy9zY3NpL2lwci5oCmluZGV4IGY5M2Y4NjMuLmFjODQ3MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuaAorKysgYi9kcml2ZXJzL3Njc2kvaXByLmgKQEAgLTgyLDYgKzgyLDcgQEAKIAogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdCNCAgICAweDAzM0IKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3QjIgICAgMHgwMzVGCisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0MzICAgIDB4MDM1MwogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdDNCAgICAweDAzNTQKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3QzYgICAgMHgwMzU3CiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0NDICAgIDB4MDM1QwpAQCAtMjA4LDcgKzIwOSw3IEBACiAjZGVmaW5lIElQUl9DQU5DRUxfQUxMX1RJTUVPVVQJCShpcHJfZmFzdGZhaWwgPyAxMCAqIEhaIDogMzAgKiBIWikKICNkZWZpbmUgSVBSX0FCT1JUX1RBU0tfVElNRU9VVAkJKGlwcl9mYXN0ZmFpbCA/IDEwICogSFogOiAzMCAqIEhaKQogI2RlZmluZSBJUFJfSU5URVJOQUxfVElNRU9VVAkJCShpcHJfZmFzdGZhaWwgPyAxMCAqIEhaIDogMzAgKiBIWikKLSNkZWZpbmUgSVBSX1dSSVRFX0JVRkZFUl9USU1FT1VUCQkoMTAgKiA2MCAqIEhaKQorI2RlZmluZSBJUFJfV1JJVEVfQlVGRkVSX1RJTUVPVVQJCSgzMCAqIDYwICogSFopCiAjZGVmaW5lIElQUl9TRVRfU1VQX0RFVklDRV9USU1FT1VUCQkoMiAqIDYwICogSFopCiAjZGVmaW5lIElQUl9SRVFVRVNUX1NFTlNFX1RJTUVPVVQJCSgxMCAqIEhaKQogI2RlZmluZSBJUFJfT1BFUkFUSU9OQUxfVElNRU9VVAkJKDUgKiA2MCkKQEAgLTEzNjAsNiArMTM2MSw3IEBACiAJSU5BQ1RJVkUsCiAJV0FJVF9GT1JfRFVNUCwKIAlHRVRfRFVNUCwKKwlSRUFEX0RVTVAsCiAJQUJPUlRfRFVNUCwKIAlEVU1QX09CVEFJTkVECiB9OwpAQCAtMTM4NCw2ICsxMzg2LDcgQEAKIAl1OCBuZWVkc193YXJtX3Jlc2V0OjE7CiAJdTggbXNpX3JlY2VpdmVkOjE7CiAJdTggc2lzNjQ6MTsKKwl1OCBkdW1wX3RpbWVvdXQ6MTsKIAogCXU4IHJldmlkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9ob3N0LmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9ob3N0LmMKaW5kZXggNjk4MWI3Ny4uZTdmZTljNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuYwpAQCAtMTI2Myw2ICsxMjYzLDEwIEBACiB7CiAJaW50IGk7CiAKKwkvKiBkaXNhYmxlIG91dHB1dCBkYXRhIHNlbGVjdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXNjaV9ncGlvX2NvdW50KGlob3N0KTsgaSsrKQorCQl3cml0ZWwoU0dQSU9fSFdfQ09OVFJPTCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnNncGlvLm91dHB1dF9kYXRhX3NlbGVjdFtpXSk7CisKIAlpc2NpX2hvc3RfY2hhbmdlX3N0YXRlKGlob3N0LCBpc2NpX3N0b3BwaW5nKTsKIAlmb3IgKGkgPSAwOyBpIDwgU0NJX01BWF9QT1JUUzsgaSsrKSB7CiAJCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gJmlob3N0LT5wb3J0c1tpXTsKQEAgLTEyODEsNiArMTI4NSwxMiBAQAogCXNwaW5fdW5sb2NrX2lycSgmaWhvc3QtPnNjaWNfbG9jayk7CiAKIAl3YWl0X2Zvcl9zdG9wKGlob3N0KTsKKworCS8qIGRpc2FibGUgc2dwaW86IHdoZXJlIHRoZSBhYm92ZSB3YWl0IHNob3VsZCBnaXZlIHRpbWUgZm9yIHRoZQorCSAqIGVuY2xvc3VyZSB0byBzYW1wbGUgdGhlIGdwaW9zIGdvaW5nIGluYWN0aXZlCisJICovCisJd3JpdGVsKDAsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5zZ3Bpby5pbnRlcmZhY2VfY29udHJvbCk7CisKIAlzY2lfY29udHJvbGxlcl9yZXNldChpaG9zdCk7CiAKIAkvKiBDYW5jZWwgYW55L2FsbCBvdXRzdGFuZGluZyBwb3J0IHRpbWVycyAqLwpAQCAtMTM0MCw3ICsxMzUwLDcgQEAKIAl1LT5zdHBfbWF4X29jY3VwYW5jeV90aW1lb3V0ID0gc3RwX21heF9vY2NfdG87CiAJdS0+c3NwX21heF9vY2N1cGFuY3lfdGltZW91dCA9IHNzcF9tYXhfb2NjX3RvOwogCXUtPm5vX291dGJvdW5kX3Rhc2tfdGltZW91dCA9IG5vX291dGJvdW5kX3Rhc2tfdG87Ci0JdS0+bWF4X251bWJlcl9jb25jdXJyZW50X2RldmljZV9zcGluX3VwID0gbWF4X2NvbmN1cnJfc3BpbnVwOworCXUtPm1heF9jb25jdXJyX3NwaW51cCA9IG1heF9jb25jdXJyX3NwaW51cDsKIH0KIAogc3RhdGljIHZvaWQgc2NpX2NvbnRyb2xsZXJfaW5pdGlhbF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCkBAIC0xNjUxLDcgKzE2NjEsNyBAQAogCWlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1vZGVfdHlwZSA9IFNDSUNfUE9SVF9BVVRPTUFUSUNfQ09ORklHVVJBVElPTl9NT0RFOwogCiAJLyogRGVmYXVsdCB0byBBUEMgbW9kZS4gKi8KLQlpaG9zdC0+b2VtX3BhcmFtZXRlcnMuY29udHJvbGxlci5tYXhfY29uY3VycmVudF9kZXZfc3Bpbl91cCA9IDE7CisJaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJfc3Bpbl91cCA9IDE7CiAKIAkvKiBEZWZhdWx0IHRvIG5vIFNTQyBvcGVyYXRpb24uICovCiAJaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIuZG9fZW5hYmxlX3NzYyA9IGZhbHNlOwpAQCAtMTc3Nyw3ICsxNzg3LDggQEAKIAl9IGVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAob2VtLT5jb250cm9sbGVyLm1heF9jb25jdXJyZW50X2Rldl9zcGluX3VwID4gTUFYX0NPTkNVUlJFTlRfREVWSUNFX1NQSU5fVVBfQ09VTlQpCisJaWYgKG9lbS0+Y29udHJvbGxlci5tYXhfY29uY3Vycl9zcGluX3VwID4gTUFYX0NPTkNVUlJFTlRfREVWSUNFX1NQSU5fVVBfQ09VTlQgfHwKKwkgICAgb2VtLT5jb250cm9sbGVyLm1heF9jb25jdXJyX3NwaW5fdXAgPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAwOwpAQCAtMTgwMCw2ICsxODExLDE2IEBACiAJcmV0dXJuIFNDSV9GQUlMVVJFX0lOVkFMSURfU1RBVEU7CiB9CiAKK3N0YXRpYyB1OCBtYXhfc3Bpbl91cChzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCkKK3sKKwlpZiAoaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5tYXhfY29uY3Vycl9zcGludXApCisJCXJldHVybiBtaW5fdCh1OCwgaWhvc3QtPnVzZXJfcGFyYW1ldGVycy5tYXhfY29uY3Vycl9zcGludXAsCisJCQkgICAgIE1BWF9DT05DVVJSRU5UX0RFVklDRV9TUElOX1VQX0NPVU5UKTsKKwllbHNlCisJCXJldHVybiBtaW5fdCh1OCwgaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJfc3Bpbl91cCwKKwkJCSAgICAgTUFYX0NPTkNVUlJFTlRfREVWSUNFX1NQSU5fVVBfQ09VTlQpOworfQorCiBzdGF0aWMgdm9pZCBwb3dlcl9jb250cm9sX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBzY2lfdGltZXIgKnRtciA9IChzdHJ1Y3Qgc2NpX3RpbWVyICopZGF0YTsKQEAgLTE4MjksOCArMTg1MCw3IEBACiAJCWlmIChpcGh5ID09IE5VTEwpCiAJCQljb250aW51ZTsKIAotCQlpZiAoaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyID49Ci0JCSAgICBpaG9zdC0+b2VtX3BhcmFtZXRlcnMuY29udHJvbGxlci5tYXhfY29uY3VycmVudF9kZXZfc3Bpbl91cCkKKwkJaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlciA+PSBtYXhfc3Bpbl91cChpaG9zdCkpCiAJCQlicmVhazsKIAogCQlpaG9zdC0+cG93ZXJfY29udHJvbC5yZXF1ZXN0ZXJzW2ldID0gTlVMTDsKQEAgLTE4NTUsOCArMTg3NSw3IEBACiB7CiAJQlVHX09OKGlwaHkgPT0gTlVMTCk7CiAKLQlpZiAoaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyIDwKLQkgICAgaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXApIHsKKwlpZiAoaWhvc3QtPnBvd2VyX2NvbnRyb2wucGh5c19ncmFudGVkX3Bvd2VyIDwgbWF4X3NwaW5fdXAoaWhvc3QpKSB7CiAJCWlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlcisrOwogCQlzY2lfcGh5X2NvbnN1bWVfcG93ZXJfaGFuZGxlcihpcGh5KTsKIApAQCAtMjM2NSw2ICsyMzg0LDEyIEBACiAJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUEhZUzsgaSsrKQogCQlpc2NpX3BoeV9pbml0KCZpaG9zdC0+cGh5c1tpXSwgaWhvc3QsIGkpOwogCisJLyogZW5hYmxlIHNncGlvICovCisJd3JpdGVsKDEsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5zZ3Bpby5pbnRlcmZhY2VfY29udHJvbCk7CisJZm9yIChpID0gMDsgaSA8IGlzY2lfZ3Bpb19jb3VudChpaG9zdCk7IGkrKykKKwkJd3JpdGVsKFNHUElPX0hXX0NPTlRST0wsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5zZ3Bpby5vdXRwdXRfZGF0YV9zZWxlY3RbaV0pOworCXdyaXRlbCgwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAuc2dwaW8udmVuZG9yX3NwZWNpZmljX2NvZGUpOworCiAJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUkVNT1RFX0RFVklDRVM7IGkrKykgewogCQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gJmlob3N0LT5kZXZpY2VzW2ldOwogCkBAIC0yNzYwLDMgKzI3ODUsNTYgQEAKIAogCXJldHVybiBzdGF0dXM7CiB9CisKK3N0YXRpYyBpbnQgc2NpX3dyaXRlX2dwaW9fdHhfZ3Aoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHU4IHJlZ19pbmRleCwgdTggcmVnX2NvdW50LCB1OCAqd3JpdGVfZGF0YSkKK3sKKwlpbnQgZDsKKworCS8qIG5vIHN1cHBvcnQgZm9yIFRYX0dQX0NGRyAqLworCWlmIChyZWdfaW5kZXggPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGQgPSAwOyBkIDwgaXNjaV9ncGlvX2NvdW50KGlob3N0KTsgZCsrKSB7CisJCXUzMiB2YWwgPSAweDQ0NDsgLyogYWxsIE9EeC5uIGNsZWFyICovCisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWludCBiaXQgPSAoaSA8PCAyKSArIDI7CisKKwkJCWJpdCA9IHRyeV90ZXN0X3Nhc19ncGlvX2dwX2JpdCh0b19zYXNfZ3Bpb19vZChkLCBpKSwKKwkJCQkJCSAgICAgICB3cml0ZV9kYXRhLCByZWdfaW5kZXgsCisJCQkJCQkgICAgICAgcmVnX2NvdW50KTsKKwkJCWlmIChiaXQgPCAwKQorCQkJCWJyZWFrOworCisJCQkvKiBpZiBvZCBpcyBzZXQsIGNsZWFyIHRoZSAnaW52ZXJ0JyBiaXQgKi8KKwkJCXZhbCAmPSB+KGJpdCA8PCAoKGkgPDwgMikgKyAyKSk7CisJCX0KKworCQlpZiAoaSA8IDMpCisJCQlicmVhazsKKwkJd3JpdGVsKHZhbCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnNncGlvLm91dHB1dF9kYXRhX3NlbGVjdFtkXSk7CisJfQorCisJLyogdW5sZXNzIHJlZ19pbmRleCBpcyA+IDEsIHdlIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byB3cml0ZSBhdAorCSAqIGxlYXN0IG9uZSByZWdpc3RlcgorCSAqLworCXJldHVybiBkID4gMDsKK30KKworaW50IGlzY2lfZ3Bpb193cml0ZShzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhLCB1OCByZWdfdHlwZSwgdTggcmVnX2luZGV4LAorCQkgICAgdTggcmVnX2NvdW50LCB1OCAqd3JpdGVfZGF0YSkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IHNhc19oYS0+bGxkZF9oYTsKKwlpbnQgd3JpdHRlbjsKKworCXN3aXRjaCAocmVnX3R5cGUpIHsKKwljYXNlIFNBU19HUElPX1JFR19UWF9HUDoKKwkJd3JpdHRlbiA9IHNjaV93cml0ZV9ncGlvX3R4X2dwKGlob3N0LCByZWdfaW5kZXgsIHJlZ19jb3VudCwgd3JpdGVfZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXdyaXR0ZW4gPSAtRUlOVkFMOworCX0KKworCXJldHVybiB3cml0dGVuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5oCmluZGV4IDlmMzM4MzEuLjY0NjA1MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuaAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9ob3N0LmgKQEAgLTQ0MCw2ICs0NDAsMTggQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKy8qIHNldCBodyBjb250cm9sIGZvciAnYWN0aXZpdHknLCBldmVuIHRob3VnaCBhY3RpdmUgZW5jbG9zdXJlcyBzZWVtIHRvIGRyaXZlCisgKiB0aGUgYWN0aXZpdHkgbGVkIG9uIHRoZWlyIG93bi4gIFNraXAgc2V0dGluZyBGU0VORyBjb250cm9sIG9uICdzdGF0dXMnIGR1ZQorICogdG8gdW5leHBlY3RlZCBvcGVyYXRpb24gYW5kICdlcnJvcicgZHVlIHRvIG5vdCBiZWluZyBhIHN1cHBvcnRlZCBhdXRvbWF0aWMKKyAqIEZTRU5HIG91dHB1dAorICovCisjZGVmaW5lIFNHUElPX0hXX0NPTlRST0wgMHgwMDAwMDQ0MworCitzdGF0aWMgaW5saW5lIGludCBpc2NpX2dwaW9fY291bnQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJcmV0dXJuIEFSUkFZX1NJWkUoaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAuc2dwaW8ub3V0cHV0X2RhdGFfc2VsZWN0KTsKK30KKwogdm9pZCBzY2lfY29udHJvbGxlcl9wb3N0X3JlcXVlc3Qoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCiAJCQkJICAgICAgdTMyIHJlcXVlc3QpOwogdm9pZCBzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LApAQCAtNTQyLDQgKzU1NCw3IEBACiBlbnVtIHNjaV9zdGF0dXMgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudF9pbml0aWFsaXplKAogCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAogCXN0cnVjdCBzY2lfcG9ydF9jb25maWd1cmF0aW9uX2FnZW50ICpwb3J0X2FnZW50KTsKKworaW50IGlzY2lfZ3Bpb193cml0ZShzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqLCB1OCByZWdfdHlwZSwgdTggcmVnX2luZGV4LAorCQkgICAgdTggcmVnX2NvdW50LCB1OCAqd3JpdGVfZGF0YSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYwppbmRleCAyOWFhMzRlLi5hOTdlZGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaW5pdC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIG1vZHVsZV9wYXJhbShwaHlfZ2VuLCBieXRlLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocGh5X2dlbiwgIlBIWSBnZW5lcmF0aW9uICgxOiAxLjVHYnBzIDI6IDMuMEdicHMgMzogNi4wR2JwcykiKTsKIAotdW5zaWduZWQgY2hhciBtYXhfY29uY3Vycl9zcGludXAgPSAxOwordW5zaWduZWQgY2hhciBtYXhfY29uY3Vycl9zcGludXA7CiBtb2R1bGVfcGFyYW0obWF4X2NvbmN1cnJfc3BpbnVwLCBieXRlLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobWF4X2NvbmN1cnJfc3BpbnVwLCAiTWF4IGNvbmN1cnJlbnQgZGV2aWNlIHNwaW51cCIpOwogCkBAIC0xOTIsNiArMTkyLDkgQEAKIAogCS8qIFBoeSBtYW5hZ2VtZW50ICovCiAJLmxsZGRfY29udHJvbF9waHkJPSBpc2NpX3BoeV9jb250cm9sLAorCisJLyogR1BJTyBzdXBwb3J0ICovCisJLmxsZGRfd3JpdGVfZ3Bpbwk9IGlzY2lfZ3Bpb193cml0ZSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvaXNjaS5oIGIvZHJpdmVycy9zY3NpL2lzY2kvaXNjaS5oCmluZGV4IGQxZGU2MzMuLjhlZmViNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL2lzY2kuaAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9pc2NpLmgKQEAgLTk3LDcgKzk3LDcgQEAKICNkZWZpbmUgU0NVX01BWF9DT01QTEVUSU9OX1FVRVVFX1NISUZUCSAgKGlsb2cyKFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9FTlRSSUVTKSkKIAogI2RlZmluZSBTQ1VfQUJTT0xVVEVfTUFYX1VOU09MSUNJVEVEX0ZSQU1FUyAoNDA5NikKLSNkZWZpbmUgU0NVX1VOU09MSUNJVEVEX0ZSQU1FX0JVRkZFUl9TSVpFICAgKDEwMjQpCisjZGVmaW5lIFNDVV9VTlNPTElDSVRFRF9GUkFNRV9CVUZGRVJfU0laRSAgICgxMDI0VSkKICNkZWZpbmUgU0NVX0lOVkFMSURfRlJBTUVfSU5ERVggICAgICAgICAgICAgKDB4RkZGRikKIAogI2RlZmluZSBTQ1VfSU9fUkVRVUVTVF9NQVhfU0dFX1NJWkUgICAgICAgICAoMHgwMEZGRkZGRikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3BoeS5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmMKaW5kZXggMDllNjExMy4uMzVmNTBjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcGh5LmMKQEAgLTEzMTMsNiArMTMxMywxNyBAQAogCQlyZXQgPSBpc2NpX3BvcnRfcGVyZm9ybV9oYXJkX3Jlc2V0KGlob3N0LCBpcG9ydCwgaXBoeSk7CiAKIAkJYnJlYWs7CisJY2FzZSBQSFlfRlVOQ19HRVRfRVZFTlRTOiB7CisJCXN0cnVjdCBzY3VfbGlua19sYXllcl9yZWdpc3RlcnMgX19pb21lbSAqcjsKKwkJc3RydWN0IHNhc19waHkgKnBoeSA9IHNhc19waHktPnBoeTsKKworCQlyID0gaXBoeS0+bGlua19sYXllcl9yZWdpc3RlcnM7CisJCXBoeS0+cnVubmluZ19kaXNwYXJpdHlfZXJyb3JfY291bnQgPSByZWFkbCgmci0+cnVubmluZ19kaXNwYXJpdHlfZXJyb3JfY291bnQpOworCQlwaHktPmxvc3Nfb2ZfZHdvcmRfc3luY19jb3VudCA9IHJlYWRsKCZyLT5sb3NzX29mX3N5bmNfZXJyb3JfY291bnQpOworCQlwaHktPnBoeV9yZXNldF9wcm9ibGVtX2NvdW50ID0gcmVhZGwoJnItPnBoeV9yZXNldF9wcm9ibGVtX2NvdW50KTsKKwkJcGh5LT5pbnZhbGlkX2R3b3JkX2NvdW50ID0gcmVhZGwoJnItPmludmFsaWRfZHdvcmRfY291bnRlcik7CisJCWJyZWFrOworCX0KIAogCWRlZmF1bHQ6CiAJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmMKaW5kZXggOGY2ZjliNy4uYWM3ZjI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnQuYwpAQCAtMTQ1LDQ4ICsxNDUsMTUgQEAKIAl9CiB9CiAKLS8qIGNhbGxlZCB1bmRlciBzY2lfbG9jayB0byBzdGFiaWxpemUgcGh5OnBvcnQgYXNzb2NpYXRpb25zICovCi12b2lkIGlzY2lfcG9ydF9iY25fZW5hYmxlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCkKLXsKLQlpbnQgaTsKLQotCWNsZWFyX2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncyk7Ci0Jd2FrZV91cCgmaWhvc3QtPmV2ZW50cSk7Ci0KLQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncykpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlwb3J0LT5waHlfdGFibGUpOyBpKyspIHsKLQkJc3RydWN0IGlzY2lfcGh5ICppcGh5ID0gaXBvcnQtPnBoeV90YWJsZVtpXTsKLQotCQlpZiAoIWlwaHkpCi0JCQljb250aW51ZTsKLQotCQlpaG9zdC0+c2FzX2hhLm5vdGlmeV9wb3J0X2V2ZW50KCZpcGh5LT5zYXNfcGh5LAotCQkJCQkJUE9SVEVfQlJPQURDQVNUX1JDVkQpOwotCQlicmVhazsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIGlzY2lfcG9ydF9iY19jaGFuZ2VfcmVjZWl2ZWQoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCiAJCQkJCSBzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKIAkJCQkJIHN0cnVjdCBpc2NpX3BoeSAqaXBoeSkKIHsKLQlpZiAoaXBvcnQgJiYgdGVzdF9iaXQoSVBPUlRfQkNOX0JMT0NLRUQsICZpcG9ydC0+ZmxhZ3MpKSB7Ci0JCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCi0JCQkiJXM6IGRpc2FibGVkIEJDTjsgaXNjaV9waHkgPSAlcCwgc2FzX3BoeSA9ICVwXG4iLAotCQkJX19mdW5jX18sIGlwaHksICZpcGh5LT5zYXNfcGh5KTsKLQkJc2V0X2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncyk7Ci0JCWF0b21pY19pbmMoJmlwb3J0LT5ldmVudCk7Ci0JCXdha2VfdXAoJmlob3N0LT5ldmVudHEpOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCi0JCQkiJXM6IGlzY2lfcGh5ID0gJXAsIHNhc19waHkgPSAlcFxuIiwKLQkJCV9fZnVuY19fLCBpcGh5LCAmaXBoeS0+c2FzX3BoeSk7CisJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiBpc2NpX3BoeSA9ICVwLCBzYXNfcGh5ID0gJXBcbiIsCisJCV9fZnVuY19fLCBpcGh5LCAmaXBoeS0+c2FzX3BoeSk7CiAKLQkJaWhvc3QtPnNhc19oYS5ub3RpZnlfcG9ydF9ldmVudCgmaXBoeS0+c2FzX3BoeSwKLQkJCQkJCVBPUlRFX0JST0FEQ0FTVF9SQ1ZEKTsKLQl9CisJaWhvc3QtPnNhc19oYS5ub3RpZnlfcG9ydF9ldmVudCgmaXBoeS0+c2FzX3BoeSwgUE9SVEVfQlJPQURDQVNUX1JDVkQpOwogCXNjaV9wb3J0X2Jjbl9lbmFibGUoaXBvcnQpOwogfQogCkBAIC0yNzgsOSArMjQ1LDYgQEAKIAkJLyogY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcGh5IG9uIHRoaXMgcG9ydC4gKi8KIAkJaWYgKGlzY2lfcGh5LT5zYXNfcGh5LnBvcnQgJiYKIAkJICAgIGlzY2lfcGh5LT5zYXNfcGh5LnBvcnQtPm51bV9waHlzID09IDEpIHsKLQkJCWF0b21pY19pbmMoJmlzY2lfcG9ydC0+ZXZlbnQpOwotCQkJaXNjaV9wb3J0X2Jjbl9lbmFibGUoaXNjaV9ob3N0LCBpc2NpX3BvcnQpOwotCiAJCQkvKiBjaGFuZ2UgdGhlIHN0YXRlIGZvciBhbGwgZGV2aWNlcyBvbiB0aGlzIHBvcnQuICBUaGUKIAkJCSAqIG5leHQgdGFzayBzZW50IHRvIHRoaXMgZGV2aWNlIHdpbGwgYmUgcmV0dXJuZWQgYXMKIAkJCSAqIFNBU19UQVNLX1VOREVMSVZFUkVELCBhbmQgdGhlIHNjc2kgbWlkIGxheWVyIHdpbGwKQEAgLTI5NCw4ICsyNTgsOCBAQAogCQkJCQlfX2Z1bmNfXywgaXNjaV9kZXZpY2UpOwogCQkJCXNldF9iaXQoSURFVl9HT05FLCAmaXNjaV9kZXZpY2UtPmZsYWdzKTsKIAkJCX0KKwkJCWlzY2lfcG9ydF9jaGFuZ2Vfc3RhdGUoaXNjaV9wb3J0LCBpc2NpX3N0b3BwaW5nKTsKIAkJfQotCQlpc2NpX3BvcnRfY2hhbmdlX3N0YXRlKGlzY2lfcG9ydCwgaXNjaV9zdG9wcGluZyk7CiAJfQogCiAJLyogTm90aWZ5IGxpYnNhcyBvZiB0aGUgYm9ya2VuIGxpbmssIHRoaXMgd2lsbCB0cmlnZ2VyIGNhbGxzIHRvIG91cgpAQCAtMzUwLDYgKzMxNCwzNCBAQAogCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICJQb3J0IHN0b3AgY29tcGxldGVcbiIpOwogfQogCisKK3N0YXRpYyBib29sIGlzX3BvcnRfcmVhZHlfc3RhdGUoZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0NJX1BPUlRfUkVBRFk6CisJY2FzZSBTQ0lfUE9SVF9TVUJfV0FJVElORzoKKwljYXNlIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTDoKKwljYXNlIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORzoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworLyogZmxhZyBkdW1teSBybmMgaGFubGluZyB3aGVuIGV4aXRpbmcgYSByZWFkeSBzdGF0ZSAqLworc3RhdGljIHZvaWQgcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKKwkJCQkgICAgICBlbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaXBvcnQtPnNtOworCWVudW0gc2NpX3BvcnRfc3RhdGVzIG9sZF9zdGF0ZSA9IHNtLT5jdXJyZW50X3N0YXRlX2lkOworCisJaWYgKGlzX3BvcnRfcmVhZHlfc3RhdGUob2xkX3N0YXRlKSAmJiAhaXNfcG9ydF9yZWFkeV9zdGF0ZShzdGF0ZSkpCisJCWlwb3J0LT5yZWFkeV9leGl0ID0gdHJ1ZTsKKworCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIHN0YXRlKTsKKwlpcG9ydC0+cmVhZHlfZXhpdCA9IGZhbHNlOworfQorCiAvKioKICAqIGlzY2lfcG9ydF9oYXJkX3Jlc2V0X2NvbXBsZXRlKCkgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NpIGNvcmUKICAqICAgIHdoZW4gdGhlIGhhcmQgcmVzZXQgY29tcGxldGUgbm90aWZpY2F0aW9uIGhhcyBiZWVuIHJlY2VpdmVkLgpAQCAtMzY4LDYgKzM2MCwyNiBAQAogCS8qIFNhdmUgdGhlIHN0YXR1cyBvZiB0aGUgaGFyZCByZXNldCBmcm9tIHRoZSBwb3J0LiAqLwogCWlzY2lfcG9ydC0+aGFyZF9yZXNldF9zdGF0dXMgPSBjb21wbGV0aW9uX3N0YXR1czsKIAorCWlmIChjb21wbGV0aW9uX3N0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgeworCisJCS8qIFRoZSByZXNldCBmYWlsZWQuICBUaGUgcG9ydCBzdGF0ZSBpcyBub3cgU0NJX1BPUlRfRkFJTEVELiAqLworCQlpZiAoaXNjaV9wb3J0LT5hY3RpdmVfcGh5X21hc2sgPT0gMCkgeworCisJCQkvKiBHZW5lcmF0ZSB0aGUgbGluayBkb3duIG5vdyB0byB0aGUgaG9zdCwgc2luY2UgaXQKKwkJCSAqIHdhcyBpbnRlcmNlcHRlZCBieSB0aGUgaGFyZCByZXNldCBzdGF0ZSBtYWNoaW5lIHdoZW4KKwkJCSAqIGl0IHJlYWxseSBoYXBwZW5lZC4KKwkJCSAqLworCQkJaXNjaV9wb3J0X2xpbmtfZG93bihpc2NpX3BvcnQtPmlzY2lfaG9zdCwKKwkJCQkJICAgICZpc2NpX3BvcnQtPmlzY2lfaG9zdC0+cGh5c1sKKwkJCQkJCSAgIGlzY2lfcG9ydC0+bGFzdF9hY3RpdmVfcGh5XSwKKwkJCQkJICAgIGlzY2lfcG9ydCk7CisJCX0KKwkJLyogQWR2YW5jZSB0aGUgcG9ydCBzdGF0ZSBzbyB0aGF0IGxpbmsgc3RhdGUgY2hhbmdlcyB3aWxsIGJlCisJCSogbm90aWNlZC4KKwkJKi8KKwkJcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShpc2NpX3BvcnQsIFNDSV9QT1JUX1NVQl9XQUlUSU5HKTsKKworCX0KIAljb21wbGV0ZV9hbGwoJmlzY2lfcG9ydC0+aGFyZF9yZXNldF9jb21wbGV0ZSk7CiB9CiAKQEAgLTY1Nyw2ICs2NjksOCBAQAogCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPm93bmluZ19jb250cm9sbGVyOwogCiAJaXBvcnQtPmFjdGl2ZV9waHlfbWFzayAmPSB+KDEgPDwgaXBoeS0+cGh5X2luZGV4KTsKKwlpZiAoIWlwb3J0LT5hY3RpdmVfcGh5X21hc2spCisJCWlwb3J0LT5sYXN0X2FjdGl2ZV9waHkgPSBpcGh5LT5waHlfaW5kZXg7CiAKIAlpcGh5LT5tYXhfbmVnb3RpYXRlZF9zcGVlZCA9IFNBU19MSU5LX1JBVEVfVU5LTk9XTjsKIApAQCAtNjgzLDMzICs2OTcsNiBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgaXNfcG9ydF9yZWFkeV9zdGF0ZShlbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZSkKLXsKLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSBTQ0lfUE9SVF9SRUFEWToKLQljYXNlIFNDSV9QT1JUX1NVQl9XQUlUSU5HOgotCWNhc2UgU0NJX1BPUlRfU1VCX09QRVJBVElPTkFMOgotCWNhc2UgU0NJX1BPUlRfU1VCX0NPTkZJR1VSSU5HOgotCQlyZXR1cm4gdHJ1ZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi0vKiBmbGFnIGR1bW15IHJuYyBoYW5saW5nIHdoZW4gZXhpdGluZyBhIHJlYWR5IHN0YXRlICovCi1zdGF0aWMgdm9pZCBwb3J0X3N0YXRlX21hY2hpbmVfY2hhbmdlKHN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0LAotCQkJCSAgICAgIGVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlKQotewotCXN0cnVjdCBzY2lfYmFzZV9zdGF0ZV9tYWNoaW5lICpzbSA9ICZpcG9ydC0+c207Ci0JZW51bSBzY2lfcG9ydF9zdGF0ZXMgb2xkX3N0YXRlID0gc20tPmN1cnJlbnRfc3RhdGVfaWQ7Ci0KLQlpZiAoaXNfcG9ydF9yZWFkeV9zdGF0ZShvbGRfc3RhdGUpICYmICFpc19wb3J0X3JlYWR5X3N0YXRlKHN0YXRlKSkKLQkJaXBvcnQtPnJlYWR5X2V4aXQgPSB0cnVlOwotCi0Jc2NpX2NoYW5nZV9zdGF0ZShzbSwgc3RhdGUpOwotCWlwb3J0LT5yZWFkeV9leGl0ID0gZmFsc2U7Ci19Ci0KIC8qKgogICogc2NpX3BvcnRfZ2VuZXJhbF9saW5rX3VwX2hhbmRsZXIgLSBwaHkgY2FuIGJlIGFzc2lnbmVkIHRvIHBvcnQ/CiAgKiBAc2NpX3BvcnQ6IHNjaV9wb3J0IG9iamVjdCBmb3Igd2hpY2ggaGFzIGEgcGh5IHRoYXQgaGFzIGdvbmUgbGluayB1cC4KQEAgLTE2MjIsNyArMTYwOSw4IEBACiAJaXBvcnQtPmxvZ2ljYWxfcG9ydF9pbmRleCAgPSBTQ0lDX1NEU19EVU1NWV9QT1JUOwogCWlwb3J0LT5waHlzaWNhbF9wb3J0X2luZGV4ID0gaW5kZXg7CiAJaXBvcnQtPmFjdGl2ZV9waHlfbWFzayAgICAgPSAwOwotCWlwb3J0LT5yZWFkeV9leGl0CSAgICAgID0gZmFsc2U7CisJaXBvcnQtPmxhc3RfYWN0aXZlX3BoeSAgICAgPSAwOworCWlwb3J0LT5yZWFkeV9leGl0CSAgID0gZmFsc2U7CiAKIAlpcG9ydC0+b3duaW5nX2NvbnRyb2xsZXIgPSBpaG9zdDsKIApAQCAtMTY0OCw3ICsxNjM2LDYgQEAKIAlpbml0X2NvbXBsZXRpb24oJmlwb3J0LT5zdGFydF9jb21wbGV0ZSk7CiAJaXBvcnQtPmlzY2lfaG9zdCA9IGlob3N0OwogCWlzY2lfcG9ydF9jaGFuZ2Vfc3RhdGUoaXBvcnQsIGlzY2lfZnJlZWQpOwotCWF0b21pY19zZXQoJmlwb3J0LT5ldmVudCwgMCk7CiB9CiAKIC8qKgpAQCAtMTY3Niw3ICsxNjYzLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7Ci0JaW50IGlkeCwgcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwlpbnQgcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKIAogCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogaXBvcnQgPSAlcFxuIiwKIAkJX19mdW5jX18sIGlwb3J0KTsKQEAgLTE2OTcsOCArMTY4NCwxMyBAQAogCQkJIiVzOiBpcG9ydCA9ICVwOyBoYXJkIHJlc2V0IGNvbXBsZXRpb25cbiIsCiAJCQlfX2Z1bmNfXywgaXBvcnQpOwogCi0JCWlmIChpcG9ydC0+aGFyZF9yZXNldF9zdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCWlmIChpcG9ydC0+aGFyZF9yZXNldF9zdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKIAkJCXJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCisJCQlkZXZfZXJyKCZpaG9zdC0+cGRldi0+ZGV2LAorCQkJCSIlczogaXBvcnQgPSAlcDsgaGFyZCByZXNldCBmYWlsZWQgKDB4JXgpXG4iLAorCQkJCV9fZnVuY19fLCBpcG9ydCwgaXBvcnQtPmhhcmRfcmVzZXRfc3RhdHVzKTsKKwkJfQogCX0gZWxzZSB7CiAJCXJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOwogCkBAIC0xNzE4LDE4ICsxNzEwLDYgQEAKIAkJCSIlczogaXBvcnQgPSAlcDsgaGFyZCByZXNldCBmYWlsZWQgIgogCQkJIigweCV4KSAtIGRyaXZpbmcgZXhwbGljaXQgbGluayBmYWlsIGZvciBhbGwgcGh5c1xuIiwKIAkJCV9fZnVuY19fLCBpcG9ydCwgaXBvcnQtPmhhcmRfcmVzZXRfc3RhdHVzKTsKLQotCQkvKiBEb3duIGFsbCBwaHlzIGluIHRoZSBwb3J0LiAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFNDSV9NQVhfUEhZUzsgKytpZHgpIHsKLQkJCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbaWR4XTsKLQotCQkJaWYgKCFpcGh5KQotCQkJCWNvbnRpbnVlOwotCQkJc2NpX3BoeV9zdG9wKGlwaHkpOwotCQkJc2NpX3BoeV9zdGFydChpcGh5KTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CiAJfQogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmgKaW5kZXggYjUwZWNkNC4uY2I1ZmZiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5oCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnQuaApAQCAtNzcsNyArNzcsNiBAQAogCiAvKioKICAqIHN0cnVjdCBpc2NpX3BvcnQgLSBpc2NpIGRpcmVjdCBhdHRhY2hlZCBzYXMgcG9ydCBvYmplY3QKLSAqIEBldmVudDogY291bnRzIGJjbnMgYW5kIHBvcnQgc3RvcCBldmVudHMgKGZvciBiY24gZmlsdGVyaW5nKQogICogQHJlYWR5X2V4aXQ6IHNldmVyYWwgc3RhdGVzIGNvbnN0aXR1dGUgJ3JlYWR5Jy4gV2hlbiBleGl0aW5nIHJlYWR5IHdlCiAgKiAgICAgICAgICAgICAgbmVlZCB0byB0YWtlIGV4dHJhIHBvcnQtdGVhcmRvd24gYWN0aW9ucyB0aGF0IGFyZQogICogICAgICAgICAgICAgIHNraXBwZWQgd2hlbiBleGl0aW5nIHRvIGFub3RoZXIgJ3JlYWR5JyBzdGF0ZS4KQEAgLTkyLDEwICs5MSw2IEBACiAgKi8KIHN0cnVjdCBpc2NpX3BvcnQgewogCWVudW0gaXNjaV9zdGF0dXMgc3RhdHVzOwotCSNkZWZpbmUgSVBPUlRfQkNOX0JMT0NLRUQgMAotCSNkZWZpbmUgSVBPUlRfQkNOX1BFTkRJTkcgMQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYXRvbWljX3QgZXZlbnQ7CiAJc3RydWN0IGlzY2lfaG9zdCAqaXNjaV9ob3N0OwogCXN0cnVjdCBhc2Rfc2FzX3BvcnQgc2FzX3BvcnQ7CiAJc3RydWN0IGxpc3RfaGVhZCByZW1vdGVfZGV2X2xpc3Q7CkBAIC0xMDksNiArMTA0LDcgQEAKIAl1OCBsb2dpY2FsX3BvcnRfaW5kZXg7CiAJdTggcGh5c2ljYWxfcG9ydF9pbmRleDsKIAl1OCBhY3RpdmVfcGh5X21hc2s7CisJdTggbGFzdF9hY3RpdmVfcGh5OwogCXUxNiByZXNlcnZlZF9ybmk7CiAJdTE2IHJlc2VydmVkX3RhZzsKIAl1MzIgc3RhcnRlZF9yZXF1ZXN0X2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydF9jb25maWcuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnRfY29uZmlnLmMKaW5kZXggNDg2YjExMy4uMzhhOTlkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydF9jb25maWcuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0X2NvbmZpZy5jCkBAIC02NzgsNyArNjc4LDcgQEAKIAljb25maWd1cmVfcGh5X21hc2sgPSB+cG9ydF9hZ2VudC0+cGh5X2NvbmZpZ3VyZWRfbWFzayAmIHBvcnRfYWdlbnQtPnBoeV9yZWFkeV9tYXNrOwogCiAJaWYgKCFjb25maWd1cmVfcGh5X21hc2spCi0JCXJldHVybjsKKwkJZ290byBkb25lOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0NJX01BWF9QSFlTOyBpbmRleCsrKSB7CiAJCWlmICgoY29uZmlndXJlX3BoeV9tYXNrICYgKDEgPDwgaW5kZXgpKSA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5oCmluZGV4IGRjMDA3ZTYuLjJjNzUyNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuaAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wcm9iZV9yb21zLmgKQEAgLTExMiw3ICsxMTIsNyBAQAogCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkaXJlY3QgYXR0YWNoZWQgZGV2aWNlcwogCSAqIHRoYXQgY2FuIGhhdmUgcG93ZXIgc3VwcGxpZWQgdG8gdGhlbSBzaW11bHRhbmVvdXNseS4KIAkgKi8KLQl1OCBtYXhfbnVtYmVyX2NvbmN1cnJlbnRfZGV2aWNlX3NwaW5fdXA7CisJdTggbWF4X2NvbmN1cnJfc3BpbnVwOwogCiAJLyoqCiAJICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGFsbG93IGEgcGh5IHRvIGNvbnN1bWUKQEAgLTIxOSw3ICsyMTksNyBAQAogc3RydWN0IHNjaV9vZW1fcGFyYW1zIHsKIAlzdHJ1Y3QgewogCQl1aW50OF90IG1vZGVfdHlwZTsKLQkJdWludDhfdCBtYXhfY29uY3VycmVudF9kZXZfc3Bpbl91cDsKKwkJdWludDhfdCBtYXhfY29uY3Vycl9zcGluX3VwOwogCQl1aW50OF90IGRvX2VuYWJsZV9zc2M7CiAJCXVpbnQ4X3QgcmVzZXJ2ZWQ7CiAJfSBjb250cm9sbGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVnaXN0ZXJzLmggYi9kcml2ZXJzL3Njc2kvaXNjaS9yZWdpc3RlcnMuaAppbmRleCAwMGFmYzczLi5lYWE1NDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9yZWdpc3RlcnMuaAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZWdpc3RlcnMuaApAQCAtODc1LDEyMiArODc1LDYgQEAKICNkZWZpbmUgU0NVX1BUU3hTUl9HRU5fQklUKG5hbWUpIFwKIAlTQ1VfR0VOX0JJVChTQ1VfUFRTR19QT1JUX1RBU0tfU0NIRURVTEVSX1NUQVRVU18gIyMgbmFtZSkKIAotCi0vKgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICogU0dQSU8gUmVnaXN0ZXIgc2hpZnQgYW5kIG1hc2sgdmFsdWVzCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19FTkFCTEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQotI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfQ0xPQ0tfU0VMRUNUX1NISUZUICAgICAgICgxKQotI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfQ0xPQ0tfU0VMRUNUX01BU0sgICAgICAgICgweDAwMDAwMDAyKQotI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfU0hJRlRfV0lEVEhfU0VMRUNUX1NISUZUICgyKQotI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19TRVJJQUxfU0hJRlRfV0lEVEhfU0VMRUNUX01BU0sgICgweDAwMDAwMDA0KQotI2RlZmluZSBTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT19URVNUX0JJVF9TSElGVCAgICAgICAgICAgICAgICAgICgxNSkKLSNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fVEVTVF9CSVRfTUFTSyAgICAgICAgICAgICAgICAgICAoMHgwMDAwODAwMCkKLSNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICAgICAoMHhGRkZGN0ZGOCkKLQotI2RlZmluZSBTQ1VfU0dJQ1J4X0dFTl9CSVQobmFtZSkgXAotCVNDVV9HRU5fQklUKFNDVV9TR1BJT19DT05UUk9MX1NHUElPXyAjIyBuYW1lKQotCi0jZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjBfU0hJRlQgICAgICAoMCkKLSNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMF9NQVNLICAgICAgICgweDAwMDAwMDBGKQotI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IxX1NISUZUICAgICAgKDQpCi0jZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjFfTUFTSyAgICAgICAoMHgwMDAwMDBGMCkKLSNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMl9TSElGVCAgICAgICg4KQotI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IyX01BU0sgICAgICAgKDB4MDAwMDBGMDApCi0jZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjNfU0hJRlQgICAgICAoMTIpCi0jZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjNfTUFTSyAgICAgICAoMHgwMDAwRjAwMCkKLSNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SRVNFUlZFRF9NQVNLICgweEZGRkYwMDAwKQotCi0jZGVmaW5lIFNDVV9TR1BCUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkJXAotCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl8gIyMgbmFtZSwgdmFsdWUpCi0KLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IwX1NISUZUICAgICAgICAoMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IwX01BU0sgICAgICAgICAoMHgwMDAwMDAwMykKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IxX1NISUZUICAgICAgICAoNCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IxX01BU0sgICAgICAgICAoMHgwMDAwMDAzMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IyX1NISUZUICAgICAgICAoOCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IyX01BU0sgICAgICAgICAoMHgwMDAwMDMwMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSX1IzX1NISUZUICAgICAgICAoMTIpCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SM19NQVNLICAgICAgICAgKDB4MDAwMDMwMDApCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SRVNFUlZFRF9NQVNLICAgKDB4RkZGRjg4ODgpCi0KLSNkZWZpbmUgU0NVX1NHU0RMUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAotCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSXyAjIyBuYW1lLCB2YWx1ZSkKLQotI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjBfU0hJRlQgICAgICAgICgwKQotI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjBfTUFTSyAgICAgICAgICgweDAwMDAwMDAzKQotI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjFfU0hJRlQgICAgICAgICg0KQotI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjFfTUFTSyAgICAgICAgICgweDAwMDAwMDMwKQotI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjJfU0hJRlQgICAgICAgICg4KQotI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjJfTUFTSyAgICAgICAgICgweDAwMDAwMzAwKQotI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfVVBQRVJfUjNfU0hJRlQgICAgICAgICgxMikKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IzX01BU0sgICAgICAgICAoMHgwMDAwMzAwMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1JFU0VSVkVEX01BU0sgICAoMHhGRkZGODg4OCkKLQotI2RlZmluZSBTQ1VfU0dTRFVSeF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCi0JU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfTE9XRVJfICMjIG5hbWUsIHZhbHVlKQotCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMF9TSElGVCAgICAgICgwKQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDBfTUFTSyAgICAgICAoMHgwMDAwMDAwMykKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QxX1NISUZUICAgICAgKDQpCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMV9NQVNLICAgICAgICgweDAwMDAwMDMwKQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDJfU0hJRlQgICAgICAoOCkKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QyX01BU0sgICAgICAgKDB4MDAwMDAzMDApCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EM19TSElGVCAgICAgICgxMikKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QzX01BU0sgICAgICAgKDB4MDAwMDMwMDApCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9SRVNFUlZFRF9NQVNLICgweEZGRkY4ODg4KQotCi0jZGVmaW5lIFNDVV9TR1NJRExSeF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCi0JU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfICMjIG5hbWUsIHZhbHVlKQotCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMF9TSElGVCAgICAgICgwKQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDBfTUFTSyAgICAgICAoMHgwMDAwMDAwMykKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QxX1NISUZUICAgICAgKDQpCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMV9NQVNLICAgICAgICgweDAwMDAwMDMwKQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDJfU0hJRlQgICAgICAoOCkKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QyX01BU0sgICAgICAgKDB4MDAwMDAzMDApCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EM19TSElGVCAgICAgICgxMikKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QzX01BU0sgICAgICAgKDB4MDAwMDMwMDApCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9SRVNFUlZFRF9NQVNLICgweEZGRkY4ODg4KQotCi0jZGVmaW5lIFNDVV9TR1NJRFVSeF9HRU5fVkFMKG5hbWUsIHZhbHVlKSBcCi0JU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfICMjIG5hbWUsIHZhbHVlKQotCi0jZGVmaW5lIFNDVV9TR1BJT19WRU5ET1JfU1BFQ0lGSUNfQ09ERV9TSElGVCAgICAgICAgICAgICgwKQotI2RlZmluZSBTQ1VfU0dQSU9fVkVORE9SX1NQRUNJRklDX0NPREVfTUFTSyAgICAgICAgICAgICAoMHgwMDAwMDAwRikKLSNkZWZpbmUgU0NVX1NHUElPX1ZFTkRPUl9TUEVDSUZJQ19DT0RFX1JFU0VSVkVEX01BU0sgICAgKDB4RkZGRkZGRjApCi0KLSNkZWZpbmUgU0NVX1NHVlNDUl9HRU5fVkFMKHZhbHVlKSBcCi0JU0NVX0dFTl9WQUxVRShTQ1VfU0dQSU9fVkVORE9SX1NQRUNJRklDX0NPREUgIyMgbmFtZSwgdmFsdWUpCi0KLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEwX1NISUZUICAgICAgICAgICAoMCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEwX01BU0sgICAgICAgICAgICAoMHgwMDAwMDAwMykKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMF9TSElGVCAgICAoMikKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMF9NQVNLICAgICAoMHgwMDAwMDAwNCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTBfU0hJRlQgICAgICAoMykKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTBfTUFTSyAgICAgICAoMHgwMDAwMDAwOCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEExX1NISUZUICAgICAgICAgICAoNCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEExX01BU0sgICAgICAgICAgICAoMHgwMDAwMDAzMCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMV9TSElGVCAgICAoNikKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMV9NQVNLICAgICAoMHgwMDAwMDA0MCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTFfU0hJRlQgICAgICAoNykKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTFfTUFTSyAgICAgICAoMHgwMDAwMDA4MCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEyX1NISUZUICAgICAgICAgICAoOCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOUFVUX0RBVEEyX01BU0sgICAgICAgICAgICAoMHgwMDAwMDMwMCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0lOVkVSVF9JTlBVVF9EQVRBMl9TSElGVCAgICAoMTApCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTJfTUFTSyAgICAgKDB4MDAwMDA0MDApCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEEyX1NISUZUICAgICAgKDExKQotI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfSk9HX0VOQUJMRV9EQVRBMl9NQVNLICAgICAgICgweDAwMDAwODAwKQotI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfUkVTRVJWRURfTUFTSyAgICAgICAgICAgICAgICgweEZGRkZGMDAwKQotCi0jZGVmaW5lIFNDVV9TR09EU1JfR0VOX1ZBTChuYW1lLCB2YWx1ZSkJXAotCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUXyAjIyBuYW1lLCB2YWx1ZSkKLQotI2RlZmluZSBTQ1VfU0dPRFNSX0dFTl9CSVQobmFtZSkgXAotCVNDVV9HRU5fQklUKFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF8gIyMgbmFtZSkKLQogLyoKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAqIFNNVSBSZWdpc3RlcnMKQEAgLTE1MjksMTAgKzE0MTMsMTIgQEAKIAl1MzIgc2VyaWFsX2lucHV0X3VwcGVyOwogLyogMHgwMDE4IFNHUElPX1NHVlNDUiAqLwogCXUzMiB2ZW5kb3Jfc3BlY2lmaWNfY29kZTsKKy8qIDB4MDAxQyBSZXNlcnZlZCAqLworCXUzMiByZXNlcnZlZF8wMDFjOwogLyogMHgwMDIwIFNHUElPX1NHT0RTUiAqLwotCXUzMiBvdXB1dF9kYXRhX3NlbGVjdFs4XTsKKwl1MzIgb3V0cHV0X2RhdGFfc2VsZWN0WzhdOwogLyogUmVtYWluZGVyIG9mIG1lbW9yeSBzcGFjZSAyNTYgYnl0ZXMgKi8KLQl1MzIgcmVzZXJ2ZWRfMTQ0NF8xNGZmWzB4MzFdOworCXUzMiByZXNlcnZlZF8xNDQ0XzE0ZmZbMHgzMF07CiAKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuYwppbmRleCBiNmU2MzY4Li5iMjA3Y2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX2RldmljZS5jCkBAIC0zODYsNiArMzg2LDE4IEBACiAJfQogfQogCisvKgorICogY2FsbGVkIG9uY2UgdGhlIHJlbW90ZSBub2RlIGNvbnRleHQgaGFzIHRyYW5zaXNpdGlvbmVkIHRvIGEgcmVhZHkKKyAqIHN0YXRlIChhZnRlciBzdXNwZW5kaW5nIFJYIGFuZC9vciBUWCBkdWUgdG8gZWFybHkgRDJIIGZpcykKKyAqLworc3RhdGljIHZvaWQgYXRhcGlfcmVtb3RlX2RldmljZV9yZXN1bWVfZG9uZSh2b2lkICpfZGV2KQoreworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBfZGV2OworCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBpZGV2LT53b3JraW5nX3JlcXVlc3Q7CisKKwlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworfQorCiBlbnVtIHNjaV9zdGF0dXMgc2NpX3JlbW90ZV9kZXZpY2VfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LAogCQkJCQkJICAgICB1MzIgZXZlbnRfY29kZSkKIHsKQEAgLTQzMiw2ICs0NDQsMTYgQEAKIAlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKQogCQlyZXR1cm4gc3RhdHVzOwogCisJaWYgKHN0YXRlID09IFNDSV9TVFBfREVWX0FUQVBJX0VSUk9SKSB7CisJCS8qIEZvciBBVEFQSSBlcnJvciBzdGF0ZSByZXN1bWUgdGhlIFJOQyByaWdodCBhd2F5LiAqLworCQlpZiAoc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYIHx8CisJCSAgICBzY3VfZ2V0X2V2ZW50X3R5cGUoZXZlbnRfY29kZSkgPT0gU0NVX0VWRU5UX1RZUEVfUk5DX1NVU1BFTkRfVFhfUlgpIHsKKwkJCXJldHVybiBzY2lfcmVtb3RlX25vZGVfY29udGV4dF9yZXN1bWUoJmlkZXYtPnJuYywKKwkJCQkJCQkgICAgICBhdGFwaV9yZW1vdGVfZGV2aWNlX3Jlc3VtZV9kb25lLAorCQkJCQkJCSAgICAgIGlkZXYpOworCQl9CisJfQorCiAJaWYgKHN0YXRlID09IFNDSV9TVFBfREVWX0lETEUpIHsKIAogCQkvKiBXZSBwaWNrIHVwIHN1c3BlbnNpb24gZXZlbnRzIHRvIGhhbmRsZSBzcGVjaWZpY2FsbHkgdG8gdGhpcwpAQCAtNjI1LDYgKzY0Nyw3IEBACiAJY2FzZSBTQ0lfU1RQX0RFVl9DTUQ6CiAJY2FzZSBTQ0lfU1RQX0RFVl9OQ1E6CiAJY2FzZSBTQ0lfU1RQX0RFVl9OQ1FfRVJST1I6CisJY2FzZSBTQ0lfU1RQX0RFVl9BVEFQSV9FUlJPUjoKIAkJc3RhdHVzID0gY29tbW9uX2NvbXBsZXRlX2lvKGlwb3J0LCBpZGV2LCBpcmVxKTsKIAkJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKIAkJCWJyZWFrOwpAQCAtMTAyMCw2ICsxMDQzLDcgQEAKIAlbU0NJX1NUUF9ERVZfTkNRX0VSUk9SXSA9IHsKIAkJLmVudGVyX3N0YXRlID0gc2NpX3N0cF9yZW1vdGVfZGV2aWNlX3JlYWR5X25jcV9lcnJvcl9zdWJzdGF0ZV9lbnRlciwKIAl9LAorCVtTQ0lfU1RQX0RFVl9BVEFQSV9FUlJPUl0gPSB7IH0sCiAJW1NDSV9TVFBfREVWX0FXQUlUX1JFU0VUXSA9IHsgfSwKIAlbU0NJX1NNUF9ERVZfSURMRV0gPSB7CiAJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zbXBfcmVtb3RlX2RldmljZV9yZWFkeV9pZGxlX3N1YnN0YXRlX2VudGVyLApAQCAtMTQxNCw4OCArMTQzOCwzIEBACiAKIAlyZXR1cm4gc3RhdHVzID09IFNDSV9TVUNDRVNTID8gMCA6IC1FTk9ERVY7CiB9Ci0vKioKLSAqIGlzY2lfZGV2aWNlX2lzX3Jlc2V0X3BlbmRpbmcoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpZiB0aGVyZSBpcyBhbnkKLSAqICAgIHBlbmRpbmcgcmVzZXQgY29uZGl0aW9uIG9uIHRoZSBkZXZpY2UuCi0gKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGlzY2lfZGV2aWNlIG9iamVjdC4KLSAqCi0gKiB0cnVlIGlmIHRoZXJlIGlzIGEgcmVzZXQgcGVuZGluZyBmb3IgdGhlIGRldmljZS4KLSAqLwotYm9vbCBpc2NpX2RldmljZV9pc19yZXNldF9wZW5kaW5nKAotCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdCwKLQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZSkKLXsKLQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3Q7Ci0Jc3RydWN0IGlzY2lfcmVxdWVzdCAqdG1wX3JlcTsKLQlib29sIHJlc2V0X2lzX3BlbmRpbmcgPSBmYWxzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCSIlczogaXNjaV9kZXZpY2UgPSAlcFxuIiwgX19mdW5jX18sIGlzY2lfZGV2aWNlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwotCi0JLyogQ2hlY2sgZm9yIHJlc2V0IG9uIGFsbCBwZW5kaW5nIHJlcXVlc3RzLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpc2NpX3JlcXVlc3QsIHRtcF9yZXEsCi0JCQkJICZpc2NpX2RldmljZS0+cmVxc19pbl9wcm9jZXNzLCBkZXZfbm9kZSkgewotCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJCSIlczogaXNjaV9kZXZpY2UgPSAlcCByZXF1ZXN0ID0gJXBcbiIsCi0JCQlfX2Z1bmNfXywgaXNjaV9kZXZpY2UsIGlzY2lfcmVxdWVzdCk7Ci0KLQkJaWYgKGlzY2lfcmVxdWVzdC0+dHR5cGUgPT0gaW9fdGFzaykgewotCQkJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKAotCQkJCWlzY2lfcmVxdWVzdCk7Ci0KLQkJCXNwaW5fbG9jaygmdGFzay0+dGFza19zdGF0ZV9sb2NrKTsKLQkJCWlmICh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQpCi0JCQkJcmVzZXRfaXNfcGVuZGluZyA9IHRydWU7Ci0JCQlzcGluX3VubG9jaygmdGFzay0+dGFza19zdGF0ZV9sb2NrKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Ci0KLQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJIiVzOiBpc2NpX2RldmljZSA9ICVwIHJlc2V0X2lzX3BlbmRpbmcgPSAlZFxuIiwKLQkJX19mdW5jX18sIGlzY2lfZGV2aWNlLCByZXNldF9pc19wZW5kaW5nKTsKLQotCXJldHVybiByZXNldF9pc19wZW5kaW5nOwotfQotCi0vKioKLSAqIGlzY2lfZGV2aWNlX2NsZWFyX3Jlc2V0X3BlbmRpbmcoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCBjbGVhciBpZiBhbnkgcGVuZGluZwotICogICAgcmVzZXQgY29uZGl0aW9uIGZsYWdzIG9uIHRoZSBkZXZpY2UuCi0gKiBAcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGlzY2lfZGV2aWNlIG9iamVjdC4KLSAqCi0gKiB0cnVlIGlmIHRoZXJlIGlzIGEgcmVzZXQgcGVuZGluZyBmb3IgdGhlIGRldmljZS4KLSAqLwotdm9pZCBpc2NpX2RldmljZV9jbGVhcl9yZXNldF9wZW5kaW5nKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQotewotCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlzY2lfcmVxdWVzdDsKLQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICp0bXBfcmVxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCi0JZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBpZGV2PSVwLCBpaG9zdD0lcFxuIiwKLQkJIF9fZnVuY19fLCBpZGV2LCBpaG9zdCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwotCi0JLyogQ2xlYXIgcmVzZXQgcGVuZGluZyBvbiBhbGwgcGVuZGluZyByZXF1ZXN0cy4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXNjaV9yZXF1ZXN0LCB0bXBfcmVxLAotCQkJCSAmaWRldi0+cmVxc19pbl9wcm9jZXNzLCBkZXZfbm9kZSkgewotCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGlkZXYgPSAlcCByZXF1ZXN0ID0gJXBcbiIsCi0JCQkgX19mdW5jX18sIGlkZXYsIGlzY2lfcmVxdWVzdCk7Ci0KLQkJaWYgKGlzY2lfcmVxdWVzdC0+dHR5cGUgPT0gaW9fdGFzaykgewotCi0JCQl1bnNpZ25lZCBsb25nIGZsYWdzMjsKLQkJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzaygKLQkJCQlpc2NpX3JlcXVlc3QpOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFnczIpOwotCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzMik7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX2RldmljZS5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX2RldmljZS5oCmluZGV4IDU3Y2NmYzMuLjQ4M2VlNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuaAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmgKQEAgLTEzMiwxMCArMTMyLDcgQEAKIAkJCQkgICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KTsKIHZvaWQgaXNjaV9yZW1vdGVfZGV2aWNlX2dvbmUoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRvbWFpbl9kZXYpOwogaW50IGlzY2lfcmVtb3RlX2RldmljZV9mb3VuZChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZG9tYWluX2Rldik7Ci1ib29sIGlzY2lfZGV2aWNlX2lzX3Jlc2V0X3BlbmRpbmcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCi0JCQkJICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KTsKLXZvaWQgaXNjaV9kZXZpY2VfY2xlYXJfcmVzZXRfcGVuZGluZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKLQkJCQkgICAgIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYpOworCiAvKioKICAqIHNjaV9yZW1vdGVfZGV2aWNlX3N0b3AoKSAtIFRoaXMgbWV0aG9kIHdpbGwgc3RvcCBib3RoIHRyYW5zbWlzc2lvbiBhbmQKICAqICAgIHJlY2VwdGlvbiBvZiBsaW5rIGFjdGl2aXR5IGZvciB0aGUgc3VwcGxpZWQgcmVtb3RlIGRldmljZS4gIFRoaXMgbWV0aG9kCkBAIC0yNDQsNiArMjQxLDE1IEBACiAJU0NJX1NUUF9ERVZfTkNRX0VSUk9SLAogCiAJLyoqCisJICogVGhpcyBpcyB0aGUgQVRBUEkgZXJyb3Igc3RhdGUgZm9yIHRoZSBTVFAgQVRBUEkgcmVtb3RlIGRldmljZS4KKwkgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgd2hlbiBBVEFQSSBkZXZpY2Ugc2VuZHMgZXJyb3Igc3RhdHVzIEZJUworCSAqIHdpdGhvdXQgZGF0YSB3aGlsZSB0aGUgZGV2aWNlIG9iamVjdCBpcyBpbiBDTUQgc3RhdGUuCisJICogQSBzdXNwZW5zaW9uIGV2ZW50IGlzIGV4cGVjdGVkIGluIHRoaXMgc3RhdGUuCisJICogVGhlIGRldmljZSBvYmplY3Qgd2lsbCByZXN1bWUgcmlnaHQgYXdheS4KKwkgKi8KKwlTQ0lfU1RQX0RFVl9BVEFQSV9FUlJPUiwKKworCS8qKgogCSAqIFRoaXMgaXMgdGhlIFJFQURZIHN1YnN0YXRlIGluZGljYXRlcyB0aGUgZGV2aWNlIGlzIHdhaXRpbmcgZm9yIHRoZSBSRVNFVCB0YXNrCiAJICogY29taW5nIHRvIGJlIHJlY292ZXJlZCBmcm9tIGNlcnRhaW4gaGFyZHdhcmUgc3BlY2lmaWMgZXJyb3IuCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmMKaW5kZXggYjVkM2E4Yy4uMTkyY2I0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAKIAl0YXNrX2l1LT50YXNrX2Z1bmMgPSBpc2NpX3RtZi0+dG1mX2NvZGU7CiAJdGFza19pdS0+dGFza190YWcgPQotCQkoaXJlcS0+dHR5cGUgPT0gdG1mX3Rhc2spID8KKwkJKHRlc3RfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpKSA/CiAJCWlzY2lfdG1mLT5pb190YWcgOgogCQlTQ0lfQ09OVFJPTExFUl9JTlZBTElEX0lPX1RBRzsKIH0KQEAgLTQ4MSw3ICs0ODEsMjkgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHNjaV9hdGFwaV9jb25zdHJ1Y3Qoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgaG9zdF90b19kZXZfZmlzICpoMmRfZmlzID0gJmlyZXEtPnN0cC5jbWQ7CisJc3RydWN0IHNhc190YXNrICp0YXNrOwogCisJLyogVG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uIHdlIHRha2UgYWR2YW50YWdlIG9mIHRoZQorCSAqIHNpbGljb24ncyBwYXJ0aWFsIGFjY2VsZXJhdGlvbiBvZiBhdGFwaSBwcm90b2NvbCAoZG1hIGRhdGEKKwkgKiB0cmFuc2ZlcnMpLCBzbyB3ZSBwcm9tb3RlIGFsbCBjb21tYW5kcyB0byBkbWEgcHJvdG9jb2wuICBUaGlzCisJICogYnJlYWtzIGNvbXBhdGliaWxpdHkgd2l0aCBBVEFfSE9SS0FHRV9BVEFQSV9NT0QxNl9ETUEgZHJpdmVzLgorCSAqLworCWgyZF9maXMtPmZlYXR1cmVzIHw9IEFUQVBJX1BLVF9ETUE7CisKKwlzY3Vfc3RwX3Jhd19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSk7CisKKwl0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkKKwkJdGFzay0+dG90YWxfeGZlcl9sZW4gPSAwOworCisJLyogY2xlYXIgdGhlIHJlc3BvbnNlIHNvIHdlIGNhbiBkZXRlY3QgYXJyaXZpYWwgb2YgYW4KKwkgKiB1bnNvbGljaXRlZCBoMmQgZmlzCisJICovCisJaXJlcS0+c3RwLnJzcC5maXNfdHlwZSA9IDA7Cit9CiAKIHN0YXRpYyBlbnVtIHNjaV9zdGF0dXMKIHNjaV9pb19yZXF1ZXN0X2NvbnN0cnVjdF9zYXRhKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCkBAIC00OTEsOSArNTEzLDEwIEBACiB7CiAJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOwogCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaXJlcS0+dGFyZ2V0X2RldmljZS0+ZG9tYWluX2RldjsKIAogCS8qIGNoZWNrIGZvciBtYW5hZ2VtZW50IHByb3RvY29scyAqLwotCWlmIChpcmVxLT50dHlwZSA9PSB0bWZfdGFzaykgeworCWlmICh0ZXN0X2JpdChJUkVRX1RNRiwgJmlyZXEtPmZsYWdzKSkgewogCQlzdHJ1Y3QgaXNjaV90bWYgKnRtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOwogCiAJCWlmICh0bWYtPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoIHx8CkBAIC01MTksNiArNTQyLDEzIEBACiAKIAl9CiAKKwkvKiBBVEFQSSAqLworCWlmIChkZXYtPnNhdGFfZGV2LmNvbW1hbmRfc2V0ID09IEFUQVBJX0NPTU1BTkRfU0VUICYmCisJICAgIHRhc2stPmF0YV90YXNrLmZpcy5jb21tYW5kID09IEFUQV9DTURfUEFDS0VUKSB7CisJCXNjaV9hdGFwaV9jb25zdHJ1Y3QoaXJlcSk7CisJCXJldHVybiBTQ0lfU1VDQ0VTUzsKKwl9CisKIAkvKiBub24gZGF0YSAqLwogCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkgewogCQlzY3Vfc3RwX3Jhd19yZXF1ZXN0X2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSk7CkBAIC02MDIsNyArNjMyLDcgQEAKIAllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CiAKIAkvKiBjaGVjayBmb3IgbWFuYWdlbWVudCBwcm90b2NvbHMgKi8KLQlpZiAoaXJlcS0+dHR5cGUgPT0gdG1mX3Rhc2spIHsKKwlpZiAodGVzdF9iaXQoSVJFUV9UTUYsICZpcmVxLT5mbGFncykpIHsKIAkJc3RydWN0IGlzY2lfdG1mICp0bWYgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKTsKIAogCQlpZiAodG1mLT50bWZfY29kZSA9PSBpc2NpX3RtZl9zYXRhX3Nyc3RfaGlnaCB8fApAQCAtNjI3LDcgKzY1Nyw3IEBACiAKIC8qKgogICogc2NpX3JlcV90eF9ieXRlcyAtIGJ5dGVzIHRyYW5zZmVycmVkIHdoZW4gcmVwbHkgdW5kZXJydW5zIHJlcXVlc3QKLSAqIEBzY2lfcmVxOiByZXF1ZXN0IHRoYXQgd2FzIHRlcm1pbmF0ZWQgZWFybHkKKyAqIEBpcmVxOiByZXF1ZXN0IHRoYXQgd2FzIHRlcm1pbmF0ZWQgZWFybHkKICAqLwogI2RlZmluZSBTQ1VfVEFTS19DT05URVhUX1NSQU0gMHgyMDAwMDAKIHN0YXRpYyB1MzIgc2NpX3JlcV90eF9ieXRlcyhzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQpAQCAtNzI5LDYgKzc1OSwxMCBAQAogCWNhc2UgU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9BU1NFUlRFRDoKIAljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfRElBRzoKIAljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9EMkg6CisJY2FzZSBTQ0lfUkVRX0FUQVBJX1dBSVRfSDJEOgorCWNhc2UgU0NJX1JFUV9BVEFQSV9XQUlUX1BJT19TRVRVUDoKKwljYXNlIFNDSV9SRVFfQVRBUElfV0FJVF9EMkg6CisJY2FzZSBTQ0lfUkVRX0FUQVBJX1dBSVRfVENfQ09NUDoKIAkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQUJPUlRJTkcpOwogCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CiAJY2FzZSBTQ0lfUkVRX1RBU0tfV0FJVF9UQ19SRVNQOgpAQCAtMTE5NCw4ICsxMjI4LDggQEAKIHsKIAlzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSA9ICZpcmVxLT5zdHAucmVxOwogCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnRfcGFpciAqc2dsX3BhaXI7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOwogCXN0cnVjdCBzY3Vfc2dsX2VsZW1lbnQgKnNnbDsKLQllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOwogCXUzMiBvZmZzZXQ7CiAJdTMyIGxlbiA9IDA7CiAKQEAgLTEyNDksNyArMTI4Myw3IEBACiAgKi8KIHN0YXRpYyBlbnVtIHNjaV9zdGF0dXMKIHNjaV9zdHBfcmVxdWVzdF9waW9fZGF0YV9pbl9jb3B5X2RhdGFfYnVmZmVyKHN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0ICpzdHBfcmVxLAotCQkJCQkJICB1OCAqZGF0YV9idWYsIHUzMiBsZW4pCisJCQkJCSAgICAgdTggKmRhdGFfYnVmLCB1MzIgbGVuKQogewogCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXE7CiAJdTggKnNyY19hZGRyOwpAQCAtMTQyMyw2ICsxNDU3LDEyOCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgcHJvY2Vzc191bnNvbGljaXRlZF9maXMoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJICAgICAgIHUzMiBmcmFtZV9pbmRleCkKK3sKKwlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlyZXEtPm93bmluZ19jb250cm9sbGVyOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZnJhbWVfaGVhZGVyOworCXUzMiAqZnJhbWVfYnVmZmVyOworCisJc3RhdHVzID0gc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCisJCQkJCQkJICBmcmFtZV9pbmRleCwKKwkJCQkJCQkgICh2b2lkICoqKSZmcmFtZV9oZWFkZXIpOworCisJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChmcmFtZV9oZWFkZXItPmZpc190eXBlICE9IEZJU19SRUdEMkgpIHsKKwkJZGV2X2VycigmaXJlcS0+aXNjaV9ob3N0LT5wZGV2LT5kZXYsCisJCQkiJXMgRVJST1I6IGludmFsaWQgZmlzIHR5cGUgMHglWFxuIiwKKwkJCV9fZnVuY19fLCBmcmFtZV9oZWFkZXItPmZpc190eXBlKTsKKwkJcmV0dXJuIFNDSV9GQUlMVVJFOworCX0KKworCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9idWZmZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJIGZyYW1lX2luZGV4LAorCQkJCQkJICh2b2lkICoqKSZmcmFtZV9idWZmZXIpOworCisJc2NpX2NvbnRyb2xsZXJfY29weV9zYXRhX3Jlc3BvbnNlKCZpcmVxLT5zdHAucnNwLAorCQkJCQkgICh1MzIgKilmcmFtZV9oZWFkZXIsCisJCQkJCSAgZnJhbWVfYnVmZmVyKTsKKworCS8qIEZyYW1lIGhhcyBiZWVuIGRlY29kZWQgcmV0dXJuIGl0IHRvIHRoZSBjb250cm9sbGVyICovCisJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBhdGFwaV9kMmhfcmVnX2ZyYW1lX2hhbmRsZXIoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKKwkJCQkJCSAgIHUzMiBmcmFtZV9pbmRleCkKK3sKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHByb2Nlc3NfdW5zb2xpY2l0ZWRfZmlzKGlyZXEsIGZyYW1lX2luZGV4KTsKKworCWlmIChzdGF0dXMgPT0gU0NJX1NVQ0NFU1MpIHsKKwkJaWYgKGlyZXEtPnN0cC5yc3Auc3RhdHVzICYgQVRBX0VSUikKKwkJCXN0YXR1cyA9IFNDSV9JT19GQUlMVVJFX1JFU1BPTlNFX1ZBTElEOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IFNDSV9JT19GQUlMVVJFX1JFU1BPTlNFX1ZBTElEOworCX0KKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBzdGF0dXM7CisJfSBlbHNlIHsKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCX0KKworCS8qIHRoZSBkMmggdWZpIGlzIHRoZSBlbmQgb2Ygbm9uLWRhdGEgY29tbWFuZHMgKi8KKwlpZiAodGFzay0+ZGF0YV9kaXIgPT0gRE1BX05PTkUpCisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzY3VfYXRhcGlfcmVjb25zdHJ1Y3RfcmF3X2ZyYW1lX3Rhc2tfY29udGV4dChzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBzYXNfdG9fYXRhX2RldihpcmVxLT50YXJnZXRfZGV2aWNlLT5kb21haW5fZGV2KTsKKwl2b2lkICphdGFwaV9jZGIgPSBpcmVxLT50dHlwZV9wdHIuaW9fdGFza19wdHItPmF0YV90YXNrLmF0YXBpX3BhY2tldDsKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGFza19jb250ZXh0ID0gaXJlcS0+dGM7CisKKwkvKiBmaWxsIGluIHRoZSBTQ1UgVGFzayBDb250ZXh0IGZvciBhIERBVEEgZmlzIGNvbnRhaW5pbmcgQ0RCIGluIFJhdyBGcmFtZQorCSAqIHR5cGUuIFRoZSBUQyBmb3IgcHJldmlvdXMgUGFja2V0IGZpcyB3YXMgYWxyZWFkeSB0aGVyZSwgd2Ugb25seSBuZWVkIHRvCisJICogY2hhbmdlIHRoZSBIMkQgZmlzIGNvbnRlbnQuCisJICovCisJbWVtc2V0KCZpcmVxLT5zdHAuY21kLCAwLCBzaXplb2Yoc3RydWN0IGhvc3RfdG9fZGV2X2ZpcykpOworCW1lbWNweSgoKHU4ICopJmlyZXEtPnN0cC5jbWQgKyBzaXplb2YodTMyKSksIGF0YXBpX2NkYiwgQVRBUElfQ0RCX0xFTik7CisJbWVtc2V0KCYodGFza19jb250ZXh0LT50eXBlLnN0cCksIDAsIHNpemVvZihzdHJ1Y3Qgc3RwX3Rhc2tfY29udGV4dCkpOworCXRhc2tfY29udGV4dC0+dHlwZS5zdHAuZmlzX3R5cGUgPSBGSVNfREFUQTsKKwl0YXNrX2NvbnRleHQtPnRyYW5zZmVyX2xlbmd0aF9ieXRlcyA9IGRldi0+Y2RiX2xlbjsKK30KKworc3RhdGljIHZvaWQgc2N1X2F0YXBpX2NvbnN0cnVjdF90YXNrX2NvbnRleHQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gc2FzX3RvX2F0YV9kZXYoaXJlcS0+dGFyZ2V0X2RldmljZS0+ZG9tYWluX2Rldik7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCXN0cnVjdCBzY3VfdGFza19jb250ZXh0ICp0YXNrX2NvbnRleHQgPSBpcmVxLT50YzsKKwlpbnQgY2RiX2xlbiA9IGRldi0+Y2RiX2xlbjsKKworCS8qIHJlZmVyZW5jZTogU1NUTCAxLjEzLjQuMgorCSAqIHRhc2tfdHlwZSwgc2F0YV9kaXJlY3Rpb24KKwkgKi8KKwlpZiAodGFzay0+ZGF0YV9kaXIgPT0gRE1BX1RPX0RFVklDRSkgeworCQl0YXNrX2NvbnRleHQtPnRhc2tfdHlwZSA9IFNDVV9UQVNLX1RZUEVfUEFDS0VUX0RNQV9PVVQ7CisJCXRhc2tfY29udGV4dC0+c2F0YV9kaXJlY3Rpb24gPSAwOworCX0gZWxzZSB7CisJCS8qIHRvZG86IGZvciBOT19EQVRBIGNvbW1hbmQsIHdlIG5lZWQgdG8gc2VuZCBvdXQgcmF3IGZyYW1lLiAqLworCQl0YXNrX2NvbnRleHQtPnRhc2tfdHlwZSA9IFNDVV9UQVNLX1RZUEVfUEFDS0VUX0RNQV9JTjsKKwkJdGFza19jb250ZXh0LT5zYXRhX2RpcmVjdGlvbiA9IDE7CisJfQorCisJbWVtc2V0KCZ0YXNrX2NvbnRleHQtPnR5cGUuc3RwLCAwLCBzaXplb2YodGFza19jb250ZXh0LT50eXBlLnN0cCkpOworCXRhc2tfY29udGV4dC0+dHlwZS5zdHAuZmlzX3R5cGUgPSBGSVNfREFUQTsKKworCW1lbXNldCgmaXJlcS0+c3RwLmNtZCwgMCwgc2l6ZW9mKGlyZXEtPnN0cC5jbWQpKTsKKwltZW1jcHkoJmlyZXEtPnN0cC5jbWQubGJhbCwgdGFzay0+YXRhX3Rhc2suYXRhcGlfcGFja2V0LCBjZGJfbGVuKTsKKwl0YXNrX2NvbnRleHQtPnNzcF9jb21tYW5kX2l1X2xlbmd0aCA9IGNkYl9sZW4gLyBzaXplb2YodTMyKTsKKworCS8qIHRhc2sgcGhhc2UgaXMgc2V0IHRvIFRYX0NNRCAqLworCXRhc2tfY29udGV4dC0+dGFza19waGFzZSA9IDB4MTsKKworCS8qIHJldHJ5IGNvdW50ZXIgKi8KKwl0YXNrX2NvbnRleHQtPnN0cF9yZXRyeV9jb3VudCA9IDA7CisKKwkvKiBkYXRhIHRyYW5zZmVyIHNpemUuICovCisJdGFza19jb250ZXh0LT50cmFuc2Zlcl9sZW5ndGhfYnl0ZXMgPSB0YXNrLT50b3RhbF94ZmVyX2xlbjsKKworCS8qIHNldHVwIHNnbCAqLworCXNjaV9yZXF1ZXN0X2J1aWxkX3NnbChpcmVxKTsKK30KKwogZW51bSBzY2lfc3RhdHVzCiBzY2lfaW9fcmVxdWVzdF9mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCiAJCQkJICB1MzIgZnJhbWVfaW5kZXgpCkBAIC0xNDkwLDI5ICsxNjQ2LDMwIEBACiAJCXJldHVybiBTQ0lfU1VDQ0VTUzsKIAogCWNhc2UgU0NJX1JFUV9TTVBfV0FJVF9SRVNQOiB7Ci0JCXN0cnVjdCBzbXBfcmVzcCAqcnNwX2hkciA9ICZpcmVxLT5zbXAucnNwOwotCQl2b2lkICpmcmFtZV9oZWFkZXI7CisJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9ICZ0YXNrLT5zbXBfdGFzay5zbXBfcmVzcDsKKwkJdm9pZCAqZnJhbWVfaGVhZGVyLCAqa2FkZHI7CisJCXU4ICpyc3A7CiAKIAkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2hlYWRlcigmaWhvc3QtPnVmX2NvbnRyb2wsCi0JCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCi0JCQkJCQkJICAgICAgJmZyYW1lX2hlYWRlcik7CisJCQkJCQkJIGZyYW1lX2luZGV4LAorCQkJCQkJCSAmZnJhbWVfaGVhZGVyKTsKKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSwgS01fSVJRMCk7CisJCXJzcCA9IGthZGRyICsgc2ctPm9mZnNldDsKKwkJc2NpX3N3YWIzMl9jcHkocnNwLCBmcmFtZV9oZWFkZXIsIDEpOwogCi0JCS8qIGJ5dGUgc3dhcCB0aGUgaGVhZGVyLiAqLwotCQl3b3JkX2NudCA9IFNNUF9SRVNQX0hEUl9TWiAvIHNpemVvZih1MzIpOwotCQlzY2lfc3dhYjMyX2NweShyc3BfaGRyLCBmcmFtZV9oZWFkZXIsIHdvcmRfY250KTsKLQotCQlpZiAocnNwX2hkci0+ZnJhbWVfdHlwZSA9PSBTTVBfUkVTUE9OU0UpIHsKKwkJaWYgKHJzcFswXSA9PSBTTVBfUkVTUE9OU0UpIHsKIAkJCXZvaWQgKnNtcF9yZXNwOwogCiAJCQlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfYnVmZmVyKCZpaG9zdC0+dWZfY29udHJvbCwKLQkJCQkJCQkJICAgICAgZnJhbWVfaW5kZXgsCi0JCQkJCQkJCSAgICAgICZzbXBfcmVzcCk7CisJCQkJCQkJCSBmcmFtZV9pbmRleCwKKwkJCQkJCQkJICZzbXBfcmVzcCk7CiAKLQkJCXdvcmRfY250ID0gKHNpemVvZihzdHJ1Y3Qgc21wX3Jlc3ApIC0gU01QX1JFU1BfSERSX1NaKSAvCi0JCQkJc2l6ZW9mKHUzMik7Ci0KLQkJCXNjaV9zd2FiMzJfY3B5KCgodTggKikgcnNwX2hkcikgKyBTTVBfUkVTUF9IRFJfU1osCi0JCQkJICAgICAgIHNtcF9yZXNwLCB3b3JkX2NudCk7CisJCQl3b3JkX2NudCA9IChzZy0+bGVuZ3RoLzQpLTE7CisJCQlpZiAod29yZF9jbnQgPiAwKQorCQkJCXdvcmRfY250ID0gbWluX3QodW5zaWduZWQgaW50LCB3b3JkX2NudCwKKwkJCQkJCSBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfQlVGRkVSX1NJWkUvNCk7CisJCQlzY2lfc3dhYjMyX2NweShyc3AgKyA0LCBzbXBfcmVzcCwgd29yZF9jbnQpOwogCiAJCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOwogCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOwpAQCAtMTUyOCwxMiArMTY4NSwxMyBAQAogCQkJCV9fZnVuY19fLAogCQkJCWlyZXEsCiAJCQkJZnJhbWVfaW5kZXgsCi0JCQkJcnNwX2hkci0+ZnJhbWVfdHlwZSk7CisJCQkJcnNwWzBdKTsKIAogCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfU01QX0ZSTV9UWVBFX0VSUjsKIAkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKIAkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CiAJCX0KKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fSVJRMCk7CiAKIAkJc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShpaG9zdCwgZnJhbWVfaW5kZXgpOwogCkBAIC0xODMzLDYgKzE5OTEsMjQgQEAKIAogCQlyZXR1cm4gc3RhdHVzOwogCX0KKwljYXNlIFNDSV9SRVFfQVRBUElfV0FJVF9QSU9fU0VUVVA6IHsKKwkJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCisJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKwkJaXJlcS0+dGFyZ2V0X2RldmljZS0+d29ya2luZ19yZXF1ZXN0ID0gaXJlcTsKKwkJaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9OT05FKSB7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9BVEFQSV9XQUlUX1RDX0NPTVApOworCQkJc2N1X2F0YXBpX3JlY29uc3RydWN0X3Jhd19mcmFtZV90YXNrX2NvbnRleHQoaXJlcSk7CisJCX0gZWxzZSB7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9BVEFQSV9XQUlUX0QySCk7CisJCQlzY3VfYXRhcGlfY29uc3RydWN0X3Rhc2tfY29udGV4dChpcmVxKTsKKwkJfQorCisJCXNjaV9jb250cm9sbGVyX2NvbnRpbnVlX2lvKGlyZXEpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCWNhc2UgU0NJX1JFUV9BVEFQSV9XQUlUX0QySDoKKwkJcmV0dXJuIGF0YXBpX2QyaF9yZWdfZnJhbWVfaGFuZGxlcihpcmVxLCBmcmFtZV9pbmRleCk7CiAJY2FzZSBTQ0lfUkVRX0FCT1JUSU5HOgogCQkvKgogCQkgKiBUT0RPOiBJcyBpdCBldmVuIHBvc3NpYmxlIHRvIGdldCBhbiB1bnNvbGljaXRlZCBmcmFtZSBpbiB0aGUKQEAgLTE4OTgsMTAgKzIwNzQsOSBAQAogCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9NQVhfUExEX0VSUik6CiAJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0xMX1JfRVJSKToKIAljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfQ01EX0xMX1JfRVJSKToKLQljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfQ1JDX0VSUik6CiAJCXNjaV9yZW1vdGVfZGV2aWNlX3N1c3BlbmQoaXJlcS0+dGFyZ2V0X2RldmljZSwKIAkJCVNDVV9FVkVOVF9TUEVDSUZJQyhTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpKTsKLQkvKiBGYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgY2FzZSAqLworCQkvKiBGYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgY2FzZSAqLwogCWRlZmF1bHQ6CiAJCS8qIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUgY29tcGxldGUuICovCiAJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CkBAIC0xOTY0LDYgKzIxMzksMTEyIEBACiAJcmV0dXJuIFNDSV9TVUNDRVNTOwogfQogCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIGF0YXBpX3Jhd19jb21wbGV0aW9uKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsIHUzMiBjb21wbGV0aW9uX2NvZGUsCisJCQkJCQkgIGVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgbmV4dCkKK3sKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkgeworCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9HT09EKToKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTOworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgbmV4dCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEFsbCBvdGhlciBjb21wbGV0aW9uIHN0YXR1cyBjYXVzZSB0aGUgSU8gdG8gYmUgY29tcGxldGUuCisJCSAqIElmIGEgTkFLIHdhcyByZWNlaXZlZCwgdGhlbiBpdCBpcyB1cCB0byB0aGUgdXNlciB0byByZXRyeQorCQkgKiB0aGUgcmVxdWVzdC4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfTk9STUFMSVpFX0NPTVBMRVRJT05fU1RBVFVTKGNvbXBsZXRpb25fY29kZSk7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfRkFJTFVSRV9DT05UUk9MTEVSX1NQRUNJRklDX0lPX0VSUjsKKworCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIGF0YXBpX2RhdGFfdGNfY29tcGxldGlvbl9oYW5kbGVyKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkJdTMyIGNvbXBsZXRpb25fY29kZSkKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gaXJlcS0+dGFyZ2V0X2RldmljZTsKKwlzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzICpkMmggPSAmaXJlcS0+c3RwLnJzcDsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKFNDVV9HRVRfQ09NUExFVElPTl9UTF9TVEFUVVMoY29tcGxldGlvbl9jb2RlKSkgeworCWNhc2UgKFNDVV9UQVNLX0RPTkVfR09PRCA8PCBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfU0hJRlQpOgorCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCQlicmVhazsKKworCWNhc2UgKFNDVV9UQVNLX0RPTkVfVU5FWFBfRklTIDw8IFNDVV9DT01QTEVUSU9OX1RMX1NUQVRVU19TSElGVCk6IHsKKwkJdTE2IGxlbiA9IHNjaV9yZXFfdHhfYnl0ZXMoaXJlcSk7CisKKwkJLyogbGlrZWx5IG5vbi1lcnJvciBkYXRhIHVuZGVycnJ1biwgd29ya2Fyb3VuZCBtaXNzaW5nCisJCSAqIGQyaCBmcmFtZSBmcm9tIHRoZSBjb250cm9sbGVyCisJCSAqLworCQlpZiAoZDJoLT5maXNfdHlwZSAhPSBGSVNfUkVHRDJIKSB7CisJCQlkMmgtPmZpc190eXBlID0gRklTX1JFR0QySDsKKwkJCWQyaC0+ZmxhZ3MgPSAoMSA8PCA2KTsKKwkJCWQyaC0+c3RhdHVzID0gMHg1MDsKKwkJCWQyaC0+ZXJyb3IgPSAwOworCQkJZDJoLT5sYmFsID0gMDsKKwkJCWQyaC0+Ynl0ZV9jb3VudF9sb3cgPSBsZW4gJiAweGZmOworCQkJZDJoLT5ieXRlX2NvdW50X2hpZ2ggPSBsZW4gPj4gODsKKwkJCWQyaC0+ZGV2aWNlID0gMHhhMDsKKwkJCWQyaC0+bGJhbF9leHAgPSAwOworCQkJZDJoLT5sYmFtX2V4cCA9IDA7CisJCQlkMmgtPmxiYWhfZXhwID0gMDsKKwkJCWQyaC0+X3JfYSA9IDA7CisJCQlkMmgtPnNlY3Rvcl9jb3VudCA9IDB4MzsKKwkJCWQyaC0+c2VjdG9yX2NvdW50X2V4cCA9IDA7CisJCQlkMmgtPl9yX2IgPSAwOworCQkJZDJoLT5fcl9jID0gMDsKKwkJCWQyaC0+X3JfZCA9IDA7CisJCX0KKworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1NfSU9fRE9ORV9FQVJMWTsKKwkJc3RhdHVzID0gaXJlcS0+c2NpX3N0YXR1czsKKworCQkvKiB0aGUgaHcgd2lsbCBoYXZlIHN1c3BlbmRlZCB0aGUgcm5jLCBzbyBjb21wbGV0ZSB0aGUKKwkJICogcmVxdWVzdCB1cG9uIHBlbmRpbmcgcmVzdW1lCisJCSAqLworCQlzY2lfY2hhbmdlX3N0YXRlKCZpZGV2LT5zbSwgU0NJX1NUUF9ERVZfQVRBUElfRVJST1IpOworCQlicmVhazsKKwl9CisJY2FzZSAoU0NVX1RBU0tfRE9ORV9FWENFU1NfREFUQSA8PCBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfU0hJRlQpOgorCQkvKiBJbiB0aGlzIGNhc2UsIHRoZXJlIGlzIG5vIFVGIGNvbWluZyBhZnRlci4KKwkJICogY29tcGVsdGUgdGhlIElPIG5vdy4KKwkJICovCisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoZDJoLT5maXNfdHlwZSA9PSBGSVNfUkVHRDJIKSB7CisJCQkvKiBVRiByZWNlaXZlZCBjaGFuZ2UgdGhlIGRldmljZSBzdGF0ZSB0byBBVEFQSV9FUlJPUiAqLworCQkJc3RhdHVzID0gaXJlcS0+c2NpX3N0YXR1czsKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlkZXYtPnNtLCBTQ0lfU1RQX0RFVl9BVEFQSV9FUlJPUik7CisJCX0gZWxzZSB7CisJCQkvKiBJZiByZWNlaXZpbmcgYW55IG5vbi1zdWNlc3MgVEMgc3RhdHVzLCBubyBVRgorCQkJICogcmVjZWl2ZWQgeWV0LCB0aGVuIGFuIFVGIGZvciB0aGUgc3RhdHVzIGZpcworCQkJICogaXMgY29taW5nIGFmdGVyIChYWFg6IHN1c3BlY3QgdGhpcyBpcworCQkJICogYWN0dWFsbHkgYSBwcm90b2NvbCBlcnJvciBvciBhIGJ1ZyBsaWtlIHRoZQorCQkJICogRE9ORV9VTkVYUF9GSVMgY2FzZSkKKwkJCSAqLworCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfQ0hFQ0tfUkVTUE9OU0U7CisJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfSU9fUkVTUE9OU0VfVkFMSUQ7CisKKwkJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0FUQVBJX1dBSVRfRDJIKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCiBlbnVtIHNjaV9zdGF0dXMKIHNjaV9pb19yZXF1ZXN0X3RjX2NvbXBsZXRpb24oc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSwKIAkJCQkgIHUzMiBjb21wbGV0aW9uX2NvZGUpCkBAIC0yMDE1LDYgKzIyOTYsMTcgQEAKIAkJcmV0dXJuIHJlcXVlc3RfYWJvcnRpbmdfc3RhdGVfdGNfZXZlbnQoaXJlcSwKIAkJCQkJCSAgICAgICBjb21wbGV0aW9uX2NvZGUpOwogCisJY2FzZSBTQ0lfUkVRX0FUQVBJX1dBSVRfSDJEOgorCQlyZXR1cm4gYXRhcGlfcmF3X2NvbXBsZXRpb24oaXJlcSwgY29tcGxldGlvbl9jb2RlLAorCQkJCQkgICAgU0NJX1JFUV9BVEFQSV9XQUlUX1BJT19TRVRVUCk7CisKKwljYXNlIFNDSV9SRVFfQVRBUElfV0FJVF9UQ19DT01QOgorCQlyZXR1cm4gYXRhcGlfcmF3X2NvbXBsZXRpb24oaXJlcSwgY29tcGxldGlvbl9jb2RlLAorCQkJCQkgICAgU0NJX1JFUV9BVEFQSV9XQUlUX0QySCk7CisKKwljYXNlIFNDSV9SRVFfQVRBUElfV0FJVF9EMkg6CisJCXJldHVybiBhdGFwaV9kYXRhX3RjX2NvbXBsZXRpb25faGFuZGxlcihpcmVxLCBjb21wbGV0aW9uX2NvZGUpOworCiAJZGVmYXVsdDoKIAkJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsCiAJCQkgIiVzOiBTQ0lDIElPIFJlcXVlc3QgZ2l2ZW4gdGFzayBjb21wbGV0aW9uICIKQEAgLTIzMzgsMTQgKzI2MzAsOCBAQAogCXN3aXRjaCAodGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKSB7CiAKIAljYXNlIGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjoKLQogCQkvKiBOb3JtYWwgbm90aWZpY2F0aW9uICh0YXNrX2RvbmUpICovCi0JCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwKLQkJCSIlczogTm9ybWFsIC0gdGFzayA9ICVwLCByZXNwb25zZT0lZCAoJWQpLCBzdGF0dXM9JWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLAotCQkJdGFzaywKLQkJCXRhc2stPnRhc2tfc3RhdHVzLnJlc3AsIHJlc3BvbnNlLAotCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCwgc3RhdHVzKTsKKwogCQkvKiBBZGQgdG8gdGhlIGNvbXBsZXRlZCBsaXN0LiAqLwogCQlsaXN0X2FkZCgmcmVxdWVzdC0+Y29tcGxldGVkX25vZGUsCiAJCQkgJmhvc3QtPnJlcXVlc3RzX3RvX2NvbXBsZXRlKTsKQEAgLTIzNTgsMTMgKzI2NDQsNiBAQAogCQkvKiBObyBub3RpZmljYXRpb24gdG8gbGlic2FzIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzCiAJCSAqIGFscmVhZHkgaW4gdGhlIGFib3J0IHBhdGguCiAJCSAqLwotCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCi0JCQkgIiVzOiBBYm9ydGVkIC0gdGFzayA9ICVwLCByZXNwb25zZT0lZCAoJWQpLCBzdGF0dXM9JWQgKCVkKVxuIiwKLQkJCSBfX2Z1bmNfXywKLQkJCSB0YXNrLAotCQkJIHRhc2stPnRhc2tfc3RhdHVzLnJlc3AsIHJlc3BvbnNlLAotCQkJIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQsIHN0YXR1cyk7Ci0KIAkJLyogV2FrZSB1cCB3aGF0ZXZlciBwcm9jZXNzIHdhcyB3YWl0aW5nIGZvciB0aGlzCiAJCSAqIHJlcXVlc3QgdG8gY29tcGxldGUuCiAJCSAqLwpAQCAtMjM4MSwzMCArMjY2MCwyMiBAQAogCiAJY2FzZSBpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbjoKIAkJLyogVXNlIHNhc190YXNrX2Fib3J0ICovCi0JCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwKLQkJCSAiJXM6IEVycm9yIC0gdGFzayA9ICVwLCByZXNwb25zZT0lZCAoJWQpLCBzdGF0dXM9JWQgKCVkKVxuIiwKLQkJCSBfX2Z1bmNfXywKLQkJCSB0YXNrLAotCQkJIHRhc2stPnRhc2tfc3RhdHVzLnJlc3AsIHJlc3BvbnNlLAotCQkJIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQsIHN0YXR1cyk7CiAJCS8qIEFkZCB0byB0aGUgYWJvcnRlZCBsaXN0LiAqLwogCQlsaXN0X2FkZCgmcmVxdWVzdC0+Y29tcGxldGVkX25vZGUsCiAJCQkgJmhvc3QtPnJlcXVlc3RzX3RvX2Vycm9yYmFjayk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAotCQkJICIlczogVW5rbm93biAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkgdGFzaywKLQkJCSB0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKLQkJCSB0YXNrLT50YXNrX3N0YXR1cy5zdGF0LCBzdGF0dXMpOwotCiAJCS8qIEFkZCB0byB0aGUgZXJyb3IgdG8gbGlic2FzIGxpc3QuICovCiAJCWxpc3RfYWRkKCZyZXF1ZXN0LT5jb21wbGV0ZWRfbm9kZSwKIAkJCSAmaG9zdC0+cmVxdWVzdHNfdG9fZXJyb3JiYWNrKTsKIAkJYnJlYWs7CiAJfQorCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwKKwkJIiVzOiAlZCAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCisJCV9fZnVuY19fLCB0YXNrX25vdGlmaWNhdGlvbl9zZWxlY3Rpb24sIHRhc2ssCisJCSh0YXNrKSA/IHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgOiAwLCByZXNwb25zZSwKKwkJKHRhc2spID8gdGFzay0+dGFza19zdGF0dXMuc3RhdCA6IDAsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzY2lfcHJvY2Vzc19zdHBfcmVzcG9uc2Uoc3RydWN0IHNhc190YXNrICp0YXNrLCBzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzICpmaXMpCkBAIC0yNDIxLDYgKzI2OTIsOCBAQAogCSAqLwogCWlmIChmaXMtPnN0YXR1cyAmIEFUQV9ERikKIAkJdHMtPnN0YXQgPSBTQVNfUFJPVE9fUkVTUE9OU0U7CisJZWxzZSBpZiAoZmlzLT5zdGF0dXMgJiBBVEFfRVJSKQorCQl0cy0+c3RhdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKIAllbHNlCiAJCXRzLT5zdGF0ID0gU0FNX1NUQVRfR09PRDsKIApAQCAtMjQzNCw5ICsyNzA3LDkgQEAKIAlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2socmVxdWVzdCk7CiAJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqcmVzcF9pdTsKIAl1bnNpZ25lZCBsb25nIHRhc2tfZmxhZ3M7Ci0Jc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGlzY2lfbG9va3VwX2RldmljZSh0YXNrLT5kZXYpOwotCWVudW0gc2VydmljZV9yZXNwb25zZSByZXNwb25zZSAgICAgICA9IFNBU19UQVNLX1VOREVMSVZFUkVEOwotCWVudW0gZXhlY19zdGF0dXMgc3RhdHVzICAgICAgICAgPSBTQVNfQUJPUlRFRF9UQVNLOworCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSByZXF1ZXN0LT50YXJnZXRfZGV2aWNlOworCWVudW0gc2VydmljZV9yZXNwb25zZSByZXNwb25zZSA9IFNBU19UQVNLX1VOREVMSVZFUkVEOworCWVudW0gZXhlY19zdGF0dXMgc3RhdHVzID0gU0FTX0FCT1JURURfVEFTSzsKIAllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgcmVxdWVzdF9zdGF0dXM7CiAJZW51bSBpc2NpX2NvbXBsZXRpb25fc2VsZWN0aW9uIGNvbXBsZXRlX3RvX2hvc3QKIAkJPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CkBAIC0yNjAzLDE4ICsyODc2LDcgQEAKIAkJCXN0YXR1cyAgID0gU0FNX1NUQVRfR09PRDsKIAkJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZyZXF1ZXN0LT5mbGFncyk7CiAKLQkJCWlmICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApIHsKLQkJCQl2b2lkICpyc3AgPSAmcmVxdWVzdC0+c21wLnJzcDsKLQotCQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCi0JCQkJCSIlczogU01QIHByb3RvY29sIGNvbXBsZXRpb25cbiIsCi0JCQkJCV9fZnVuY19fKTsKLQotCQkJCXNnX2NvcHlfZnJvbV9idWZmZXIoCi0JCQkJCSZ0YXNrLT5zbXBfdGFzay5zbXBfcmVzcCwgMSwKLQkJCQkJcnNwLCBzaXplb2Yoc3RydWN0IHNtcF9yZXNwKSk7Ci0JCQl9IGVsc2UgaWYgKGNvbXBsZXRpb25fc3RhdHVzCi0JCQkJICAgPT0gU0NJX0lPX1NVQ0NFU1NfSU9fRE9ORV9FQVJMWSkgeworCQkJaWYgKGNvbXBsZXRpb25fc3RhdHVzID09IFNDSV9JT19TVUNDRVNTX0lPX0RPTkVfRUFSTFkpIHsKIAogCQkJCS8qIFRoaXMgd2FzIGFuIFNTUCAvIFNUUCAvIFNBVEEgdHJhbnNmZXIuCiAJCQkJICogVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGxlc3MgZGF0YSB0aGFuCkBAIC0yNzc4LDcgKzMwNDAsNiBAQAogCiAJLyogY29tcGxldGUgdGhlIGlvIHJlcXVlc3QgdG8gdGhlIGNvcmUuICovCiAJc2NpX2NvbnRyb2xsZXJfY29tcGxldGVfaW8oaWhvc3QsIHJlcXVlc3QtPnRhcmdldF9kZXZpY2UsIHJlcXVlc3QpOwotCWlzY2lfcHV0X2RldmljZShpZGV2KTsKIAogCS8qIHNldCB0ZXJtaW5hdGVkIGhhbmRsZSBzbyBpdCBjYW5ub3QgYmUgY29tcGxldGVkIG9yCiAJICogdGVybWluYXRlZCBhZ2FpbiwgYW5kIHRvIGNhdXNlIGFueSBjYWxscyBpbnRvIGFib3J0CkBAIC0yNzkxLDM3ICszMDUyLDQyIEBACiB7CiAJc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSA9IGNvbnRhaW5lcl9vZihzbSwgdHlwZW9mKCppcmVxKSwgc20pOwogCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpcmVxLT50YXJnZXRfZGV2aWNlLT5kb21haW5fZGV2OworCWVudW0gc2NpX2Jhc2VfcmVxdWVzdF9zdGF0ZXMgc3RhdGU7CiAJc3RydWN0IHNhc190YXNrICp0YXNrOwogCiAJLyogWFhYIGFzIGhjaCBzYWlkIGFsd2F5cyBjcmVhdGluZyBhbiBpbnRlcm5hbCBzYXNfdGFzayBmb3IgdG1mCiAJICogcmVxdWVzdHMgd291bGQgc2ltcGxpZnkgdGhlIGRyaXZlcgogCSAqLwotCXRhc2sgPSBpcmVxLT50dHlwZSA9PSBpb190YXNrID8gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpIDogTlVMTDsKKwl0YXNrID0gKHRlc3RfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpKSA/IE5VTEwgOiBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CiAKIAkvKiBhbGwgdW5hY2NlbGVyYXRlZCByZXF1ZXN0IHR5cGVzIChub24gc3NwIG9yIG5jcSkgaGFuZGxlZCB3aXRoCiAJICogc3Vic3RhdGVzCiAJICovCiAJaWYgKCF0YXNrICYmIGRldi0+ZGV2X3R5cGUgPT0gU0FTX0VORF9ERVYpIHsKLQkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1JFUV9UQVNLX1dBSVRfVENfQ09NUCk7CisJCXN0YXRlID0gU0NJX1JFUV9UQVNLX1dBSVRfVENfQ09NUDsKIAl9IGVsc2UgaWYgKCF0YXNrICYmCiAJCSAgIChpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKS0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2hpZ2ggfHwKIAkJICAgIGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpLT50bWZfY29kZSA9PSBpc2NpX3RtZl9zYXRhX3Nyc3RfbG93KSkgewotCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0FTU0VSVEVEKTsKKwkJc3RhdGUgPSBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0FTU0VSVEVEOwogCX0gZWxzZSBpZiAodGFzayAmJiB0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApIHsKLQkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1JFUV9TTVBfV0FJVF9SRVNQKTsKKwkJc3RhdGUgPSBTQ0lfUkVRX1NNUF9XQUlUX1JFU1A7CiAJfSBlbHNlIGlmICh0YXNrICYmIHNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykgJiYKIAkJICAgIXRhc2stPmF0YV90YXNrLnVzZV9uY3EpIHsKLQkJdTMyIHN0YXRlOwotCi0JCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkKKwkJaWYgKGRldi0+c2F0YV9kZXYuY29tbWFuZF9zZXQgPT0gQVRBUElfQ09NTUFORF9TRVQgJiYKKwkJCXRhc2stPmF0YV90YXNrLmZpcy5jb21tYW5kID09IEFUQV9DTURfUEFDS0VUKSB7CisJCQlzdGF0ZSA9IFNDSV9SRVFfQVRBUElfV0FJVF9IMkQ7CisJCX0gZWxzZSBpZiAodGFzay0+ZGF0YV9kaXIgPT0gRE1BX05PTkUpIHsKIAkJCXN0YXRlID0gU0NJX1JFUV9TVFBfTk9OX0RBVEFfV0FJVF9IMkQ7Ci0JCWVsc2UgaWYgKHRhc2stPmF0YV90YXNrLmRtYV94ZmVyKQorCQl9IGVsc2UgaWYgKHRhc2stPmF0YV90YXNrLmRtYV94ZmVyKSB7CiAJCQlzdGF0ZSA9IFNDSV9SRVFfU1RQX1VETUFfV0FJVF9UQ19DT01QOwotCQllbHNlIC8qIFBJTyAqLworCQl9IGVsc2UgLyogUElPICovIHsKIAkJCXN0YXRlID0gU0NJX1JFUV9TVFBfUElPX1dBSVRfSDJEOwotCi0JCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIHN0YXRlKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNTUCBvciBOQ1EgYXJlIGZ1bGx5IGFjY2VsZXJhdGVkLCBubyBzdWJzdGF0ZXMgKi8KKwkJcmV0dXJuOwogCX0KKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBzdGF0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNjaV9yZXF1ZXN0X2NvbXBsZXRlZF9zdGF0ZV9lbnRlcihzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20pCkBAIC0yOTEzLDYgKzMxNzksMTAgQEAKIAlbU0NJX1JFUV9UQVNLX1dBSVRfVENfUkVTUF0gPSB7IH0sCiAJW1NDSV9SRVFfU01QX1dBSVRfUkVTUF0gPSB7IH0sCiAJW1NDSV9SRVFfU01QX1dBSVRfVENfQ09NUF0gPSB7IH0sCisJW1NDSV9SRVFfQVRBUElfV0FJVF9IMkRdID0geyB9LAorCVtTQ0lfUkVRX0FUQVBJX1dBSVRfUElPX1NFVFVQXSA9IHsgfSwKKwlbU0NJX1JFUV9BVEFQSV9XQUlUX0QySF0gPSB7IH0sCisJW1NDSV9SRVFfQVRBUElfV0FJVF9UQ19DT01QXSA9IHsgfSwKIAlbU0NJX1JFUV9DT01QTEVURURdID0gewogCQkuZW50ZXJfc3RhdGUgPSBzY2lfcmVxdWVzdF9jb21wbGV0ZWRfc3RhdGVfZW50ZXIsCiAJfSwKQEAgLTMyNzIsNyArMzU0Miw3IEBACiAKIAlpcmVxID0gaXNjaV9yZXF1ZXN0X2Zyb21fdGFnKGlob3N0LCB0YWcpOwogCWlyZXEtPnR0eXBlX3B0ci5pb190YXNrX3B0ciA9IHRhc2s7Ci0JaXJlcS0+dHR5cGUgPSBpb190YXNrOworCWNsZWFyX2JpdChJUkVRX1RNRiwgJmlyZXEtPmZsYWdzKTsKIAl0YXNrLT5sbGRkX3Rhc2sgPSBpcmVxOwogCiAJcmV0dXJuIGlyZXE7CkBAIC0zMjg2LDcgKzM1NTYsNyBAQAogCiAJaXJlcSA9IGlzY2lfcmVxdWVzdF9mcm9tX3RhZyhpaG9zdCwgdGFnKTsKIAlpcmVxLT50dHlwZV9wdHIudG1mX3Rhc2tfcHRyID0gaXNjaV90bWY7Ci0JaXJlcS0+dHR5cGUgPSB0bWZfdGFzazsKKwlzZXRfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpOwogCiAJcmV0dXJuIGlyZXE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmggYi9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmgKaW5kZXggN2ExZDVhOS4uYmUzODkzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5oCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuaApAQCAtNzcsMTEgKzc3LDYgQEAKIAlkZWFkICAgICAgICA9IDB4MDcKIH07CiAKLWVudW0gdGFza190eXBlIHsKLQlpb190YXNrICA9IDAsCi0JdG1mX3Rhc2sgPSAxCi19OwotCiBlbnVtIHNjaV9yZXF1ZXN0X3Byb3RvY29sIHsKIAlTQ0lDX05PX1BST1RPQ09MLAogCVNDSUNfU01QX1BST1RPQ09MLApAQCAtOTYsNyArOTEsNiBAQAogICoJICAgICB0byB3YWl0IGZvciBhbm90aGVyIGZpcyBvciBpZiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuICBVcG9uCiAgKiAgICAgICAgICAgcmVjZWlwdCBvZiBhIGQyaCBmaXMgdGhpcyB3aWxsIGJlIHRoZSBzdGF0dXMgZmllbGQgb2YgdGhhdCBmaXMuCiAgKiBAc2dsIC0gdHJhY2sgcGlvIHRyYW5zZmVyIHByb2dyZXNzIGFzIHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc2dsCi0gKiBAZGV2aWNlX2NkYl9sZW4gLSBhdGFwaSBkZXZpY2UgYWR2ZXJ0aXNlcyBpdCdzIHRyYW5zZmVyIGNvbnN0cmFpbnRzIGF0IHNldHVwCiAgKi8KIHN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0IHsKIAl1MzIgcGlvX2xlbjsKQEAgLTEwNyw3ICsxMDEsNiBAQAogCQl1OCBzZXQ7CiAJCXUzMiBvZmZzZXQ7CiAJfSBzZ2w7Ci0JdTMyIGRldmljZV9jZGJfbGVuOwogfTsKIAogc3RydWN0IGlzY2lfcmVxdWVzdCB7CkBAIC0xMTgsNyArMTExLDYgQEAKIAkjZGVmaW5lIElSRVFfQUNUSVZFIDMKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCS8qIFhYWCBraWxsIHR0eXBlIGFuZCB0dHlwZV9wdHIsIGFsbG9jYXRlIGZ1bGwgc2FzX3Rhc2sgKi8KLQllbnVtIHRhc2tfdHlwZSB0dHlwZTsKIAl1bmlvbiB0dHlwZV9wdHJfdW5pb24gewogCQlzdHJ1Y3Qgc2FzX3Rhc2sgKmlvX3Rhc2tfcHRyOyAgIC8qIFdoZW4gdHR5cGU9PWlvX3Rhc2sgICovCiAJCXN0cnVjdCBpc2NpX3RtZiAqdG1mX3Rhc2tfcHRyOyAgLyogV2hlbiB0dHlwZT09dG1mX3Rhc2sgKi8KQEAgLTE3NCw5ICsxNjYsNiBAQAogCQkJfTsKIAkJfSBzc3A7CiAJCXN0cnVjdCB7Ci0JCQlzdHJ1Y3Qgc21wX3Jlc3AgcnNwOwotCQl9IHNtcDsKLQkJc3RydWN0IHsKIAkJCXN0cnVjdCBpc2NpX3N0cF9yZXF1ZXN0IHJlcTsKIAkJCXN0cnVjdCBob3N0X3RvX2Rldl9maXMgY21kOwogCQkJc3RydWN0IGRldl90b19ob3N0X2ZpcyByc3A7CkBAIC0yNTIsNiArMjQxLDMyIEBACiAJU0NJX1JFUV9TVFBfUElPX0RBVEFfT1VULAogCiAJLyoKKwkgKiBXaGlsZSBpbiB0aGlzIHN0YXRlIHRoZSBJTyByZXF1ZXN0IG9iamVjdCBpcyB3YWl0aW5nIGZvciB0aGUgVEMKKwkgKiBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBmb3IgdGhlIEgyRCBSZWdpc3RlciBGSVMKKwkgKi8KKwlTQ0lfUkVRX0FUQVBJX1dBSVRfSDJELAorCisJLyoKKwkgKiBXaGlsZSBpbiB0aGlzIHN0YXRlIHRoZSBJTyByZXF1ZXN0IG9iamVjdCBpcyB3YWl0aW5nIGZvciBlaXRoZXIgYQorCSAqIFBJTyBTZXR1cC4KKwkgKi8KKwlTQ0lfUkVRX0FUQVBJX1dBSVRfUElPX1NFVFVQLAorCisJLyoKKwkgKiBUaGUgbm9uLWRhdGEgSU8gdHJhbnNpdCB0byB0aGlzIHN0YXRlIGluIHRoaXMgc3RhdGUgYWZ0ZXIgcmVjZWl2aW5nCisJICogVEMgY29tcGxldGlvbi4gV2hpbGUgaW4gdGhpcyBzdGF0ZSBJTyByZXF1ZXN0IG9iamVjdCBpcyB3YWl0aW5nIGZvcgorCSAqIEQySCBzdGF0dXMgZnJhbWUgYXMgVUYuCisJICovCisJU0NJX1JFUV9BVEFQSV9XQUlUX0QySCwKKworCS8qCisJICogV2hlbiB0cmFuc21pdHRpbmcgcmF3IGZyYW1lcyBoYXJkd2FyZSByZXBvcnRzIHRhc2sgY29udGV4dCBjb21wbGV0aW9uCisJICogYWZ0ZXIgZXZlcnkgZnJhbWUgc3VibWlzc2lvbiwgc28gaW4gdGhlIG5vbi1hY2NlbGVyYXRlZCBjYXNlIHdlIG5lZWQKKwkgKiB0byBleHBlY3QgdGhlIGNvbXBsZXRpb24gZm9yIHRoZSAiY2RiIiBmcmFtZS4KKwkgKi8KKwlTQ0lfUkVRX0FUQVBJX1dBSVRfVENfQ09NUCwKKworCS8qCiAJICogVGhlIEFXQUlUX1RDX0NPTVBMRVRJT04gc3ViLXN0YXRlIGluZGljYXRlcyB0aGF0IHRoZSBzdGFydGVkIHJhdwogCSAqIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0IGlzIHdhaXRpbmcgZm9yIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlCiAJICogaW5pdGlhbCBmcmFtZSAoaS5lLiBjb21tYW5kLCB0YXNrLCBldGMuKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Nhcy5oIGIvZHJpdmVycy9zY3NpL2lzY2kvc2FzLmgKaW5kZXggNDYyYjE1MS4uZGMyNmI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvc2FzLmgKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvc2FzLmgKQEAgLTIwNCw4ICsyMDQsNiBAQAogCXU4IHJlcV9kYXRhWzBdOwogfSAgX19wYWNrZWQ7CiAKLSNkZWZpbmUgU01QX1JFU1BfSERSX1NaCTQKLQogLyoKICAqIHN0cnVjdCBzY2lfc2FzX2FkZHJlc3MgLSBUaGlzIHN0cnVjdHVyZSBkZXBpY3RzIGhvdyBhIFNBUyBhZGRyZXNzIGlzCiAgKiAgICByZXByZXNlbnRlZCBieSBTQ0kuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS90YXNrLmMgYi9kcml2ZXJzL3Njc2kvaXNjaS90YXNrLmMKaW5kZXggZDZiY2RkMC4uNjZhZDNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suYwpAQCAtMjEyLDE2ICsyMTIsMjcgQEAKIAkJCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfQVRfSU5JVElBVE9SOwogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKIAotCQkJCQkvKiBJbmRpY2F0ZSBRVUVVRV9GVUxMIHNvIHRoYXQgdGhlIHNjc2kKLQkJCQkJKiBtaWRsYXllciByZXRyaWVzLiBpZiB0aGUgcmVxdWVzdAotCQkJCQkqIGZhaWxlZCBmb3IgcmVtb3RlIGRldmljZSByZWFzb25zLAotCQkJCQkqIGl0IGdldHMgcmV0dXJuZWQgYXMKLQkJCQkJKiBTQVNfVEFTS19VTkRFTElWRVJFRCBuZXh0IHRpbWUKLQkJCQkJKiB0aHJvdWdoLgotCQkJCQkqLwotCQkJCQlpc2NpX3Rhc2tfcmVmdXNlKGlob3N0LCB0YXNrLAotCQkJCQkJCSBTQVNfVEFTS19DT01QTEVURSwKLQkJCQkJCQkgU0FTX1FVRVVFX0ZVTEwpOworCQkJCQlpZiAodGVzdF9iaXQoSURFVl9HT05FLCAmaWRldi0+ZmxhZ3MpKSB7CisKKwkJCQkJCS8qIEluZGljYXRlIHRoYXQgdGhlIGRldmljZQorCQkJCQkJICogaXMgZ29uZS4KKwkJCQkJCSAqLworCQkJCQkJaXNjaV90YXNrX3JlZnVzZShpaG9zdCwgdGFzaywKKwkJCQkJCQlTQVNfVEFTS19VTkRFTElWRVJFRCwKKwkJCQkJCQlTQVNfREVWSUNFX1VOS05PV04pOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogSW5kaWNhdGUgUVVFVUVfRlVMTCBzbyB0aGF0CisJCQkJCQkgKiB0aGUgc2NzaSBtaWRsYXllciByZXRyaWVzLgorCQkJCQkJICogSWYgdGhlIHJlcXVlc3QgZmFpbGVkIGZvcgorCQkJCQkJICogcmVtb3RlIGRldmljZSByZWFzb25zLCBpdAorCQkJCQkJICogZ2V0cyByZXR1cm5lZCBhcworCQkJCQkJICogU0FTX1RBU0tfVU5ERUxJVkVSRUQgbmV4dAorCQkJCQkJICogdGltZSB0aHJvdWdoLgorCQkJCQkJICovCisJCQkJCQlpc2NpX3Rhc2tfcmVmdXNlKGlob3N0LCB0YXNrLAorCQkJCQkJCVNBU19UQVNLX0NPTVBMRVRFLAorCQkJCQkJCVNBU19RVUVVRV9GVUxMKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjQzLDcgKzI1NCw3IEBACiAJc3RydWN0IGlzY2lfdG1mICppc2NpX3RtZjsKIAllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOwogCi0JaWYgKHRtZl90YXNrICE9IGlyZXEtPnR0eXBlKQorCWlmICghdGVzdF9iaXQoSVJFUV9UTUYsICZpcmVxLT5mbGFncykpCiAJCXJldHVybiBTQ0lfRkFJTFVSRTsKIAogCWlzY2lfdG1mID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYoaXJlcSk7CkBAIC0zMjcsNiArMzM4LDYwIEBACiAJcmV0dXJuIGlyZXE7CiB9CiAKKy8qKgorKiBpc2NpX3JlcXVlc3RfbWFya196b21iaWUoKSAtIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBzY2ljX2xvY2sgaGVsZC4KKyovCitzdGF0aWMgdm9pZCBpc2NpX3JlcXVlc3RfbWFya196b21iaWUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsIHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGNvbXBsZXRpb24gKnRtZl9jb21wbGV0aW9uID0gTlVMTDsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqcmVxX2NvbXBsZXRpb247CisKKwkvKiBTZXQgdGhlIHJlcXVlc3Qgc3RhdGUgdG8gImRlYWQiLiAqLworCWlyZXEtPnN0YXR1cyA9IGRlYWQ7CisKKwlyZXFfY29tcGxldGlvbiA9IGlyZXEtPmlvX3JlcXVlc3RfY29tcGxldGlvbjsKKwlpcmVxLT5pb19yZXF1ZXN0X2NvbXBsZXRpb24gPSBOVUxMOworCisJaWYgKHRlc3RfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpKSB7CisJCS8qIEJyZWFrIGxpbmtzIHdpdGggdGhlIFRNRiByZXF1ZXN0LiAqLworCQlzdHJ1Y3QgaXNjaV90bWYgKnRtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOworCisJCS8qIEluIHRoZSBjYXNlIHdoZXJlIGEgdGFzayByZXF1ZXN0IGlzIGR5aW5nLAorCQkgKiB0aGUgdGhyZWFkIHdhaXRpbmcgb24gdGhlIGNvbXBsZXRlIHdpbGwgc2l0IGFuZAorCQkgKiB0aW1lb3V0IHVubGVzcyB3ZSB3YWtlIGl0IG5vdy4gIFNpbmNlIHRoZSBUTUYKKwkJICogaGFzIGEgZGVmYXVsdCBlcnJvciBzdGF0dXMsIGNvbXBsZXRlIGl0IGhlcmUKKwkJICogdG8gd2FrZSB0aGUgd2FpdGluZyB0aHJlYWQuCisJCSAqLworCQlpZiAodG1mKSB7CisJCQl0bWZfY29tcGxldGlvbiA9IHRtZi0+Y29tcGxldGU7CisJCQl0bWYtPmNvbXBsZXRlID0gTlVMTDsKKwkJfQorCQlpcmVxLT50dHlwZV9wdHIudG1mX3Rhc2tfcHRyID0gTlVMTDsKKwkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiB0bWZfY29kZSAlZCwgbWFuYWdlZCB0YWcgJSN4XG4iLAorCQkJX19mdW5jX18sIHRtZi0+dG1mX2NvZGUsIHRtZi0+aW9fdGFnKTsKKwl9IGVsc2UgeworCQkvKiBCcmVhayBsaW5rcyB3aXRoIHRoZSBzYXNfdGFzayAtIHRoZSBjYWxsYmFjayBpcyBkb25lCisJCSAqIGVsc2V3aGVyZS4KKwkJICovCisJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKworCQlpZiAodGFzaykKKwkJCXRhc2stPmxsZGRfdGFzayA9IE5VTEw7CisKKwkJaXJlcS0+dHR5cGVfcHRyLmlvX3Rhc2tfcHRyID0gTlVMTDsKKwl9CisKKwlkZXZfd2FybigmaWhvc3QtPnBkZXYtPmRldiwgInRhc2sgY29udGV4dCB1bnJlY292ZXJhYmxlICh0YWc6ICUjeClcbiIsCisJCSBpcmVxLT5pb190YWcpOworCisJLyogRG9uJ3QgZm9yY2Ugd2FpdGluZyB0aHJlYWRzIHRvIHRpbWVvdXQuICovCisJaWYgKHJlcV9jb21wbGV0aW9uKQorCQljb21wbGV0ZShyZXFfY29tcGxldGlvbik7CisKKwlpZiAodG1mX2NvbXBsZXRpb24gIT0gTlVMTCkKKwkJY29tcGxldGUodG1mX2NvbXBsZXRpb24pOworfQorCiBzdGF0aWMgaW50IGlzY2lfdGFza19leGVjdXRlX3RtZihzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKIAkJCQkgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKIAkJCQkgc3RydWN0IGlzY2lfdG1mICp0bWYsIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcykKQEAgLTM2NCw2ICs0MjksNyBAQAogCiAJLyogQXNzaWduIHRoZSBwb2ludGVyIHRvIHRoZSBUTUYncyBjb21wbGV0aW9uIGtlcm5lbCB3YWl0IHN0cnVjdHVyZS4gKi8KIAl0bWYtPmNvbXBsZXRlID0gJmNvbXBsZXRpb247CisJdG1mLT5zdGF0dXMgPSBTQ0lfRkFJTFVSRV9USU1FT1VUOwogCiAJaXJlcSA9IGlzY2lfdGFza19yZXF1ZXN0X2J1aWxkKGlob3N0LCBpZGV2LCB0YWcsIHRtZik7CiAJaWYgKCFpcmVxKQpAQCAtMzk5LDE4ICs0NjUsMzUgQEAKIAkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tcykpOwogCiAJaWYgKHRpbWVsZWZ0ID09IDApIHsKKwkJLyogVGhlIFRNRiBkaWQgbm90IGNvbXBsZXRlIC0gdGhpcyBjb3VsZCBiZSBiZWNhdXNlCisJCSAqIG9mIGFuIHVucGx1Zy4gIFRlcm1pbmF0ZSB0aGUgVE1GIHJlcXVlc3Qgbm93LgorCQkgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKIAogCQlpZiAodG1mLT5jYl9zdGF0ZV9mdW5jICE9IE5VTEwpCi0JCQl0bWYtPmNiX3N0YXRlX2Z1bmMoaXNjaV90bWZfdGltZWRfb3V0LCB0bWYsIHRtZi0+Y2JfZGF0YSk7CisJCQl0bWYtPmNiX3N0YXRlX2Z1bmMoaXNjaV90bWZfdGltZWRfb3V0LCB0bWYsCisJCQkJCSAgIHRtZi0+Y2JfZGF0YSk7CiAKLQkJc2NpX2NvbnRyb2xsZXJfdGVybWluYXRlX3JlcXVlc3QoaWhvc3QsCi0JCQkJCQkgIGlkZXYsCi0JCQkJCQkgIGlyZXEpOworCQlzY2lfY29udHJvbGxlcl90ZXJtaW5hdGVfcmVxdWVzdChpaG9zdCwgaWRldiwgaXJlcSk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwogCi0JCXdhaXRfZm9yX2NvbXBsZXRpb24odG1mLT5jb21wbGV0ZSk7CisJCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAorCQkJJmNvbXBsZXRpb24sCisJCQltc2Vjc190b19qaWZmaWVzKElTQ0lfVEVSTUlOQVRJT05fVElNRU9VVF9NU0VDKSk7CisKKwkJaWYgKCF0aW1lbGVmdCkgeworCQkJLyogU3RyYW5nZSBjb25kaXRpb24gLSB0aGUgdGVybWluYXRpb24gb2YgdGhlIFRNRgorCQkJICogcmVxdWVzdCB0aW1lZC1vdXQuCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisKKwkJCS8qIElmIHRoZSBUTUYgc3RhdHVzIGhhcyBub3QgY2hhbmdlZCwga2lsbCBpdC4gKi8KKwkJCWlmICh0bWYtPnN0YXR1cyA9PSBTQ0lfRkFJTFVSRV9USU1FT1VUKQorCQkJCWlzY2lfcmVxdWVzdF9tYXJrX3pvbWJpZShpaG9zdCwgaXJlcSk7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJfQogCX0KIAogCWlzY2lfcHJpbnRfdG1mKHRtZik7CkBAIC01MDEsNDggKzU4NCwxNyBAQAogCXJldHVybiBvbGRfc3RhdGU7CiB9CiAKLS8qKgotKiBpc2NpX3JlcXVlc3RfY2xlYW51cF9jb21wbGV0ZWRfbG9pdGVyZXIoKSAtIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIGNhcmUgb2YKLSogICAgdGhlIGZpbmFsIGNsZWFudXAgb24gYW55IHJlcXVlc3Qgd2hpY2ggaGFzIGJlZW4gZXhwbGljaXRseSB0ZXJtaW5hdGVkLgotKiBAaXNjaV9ob3N0OiBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIElTQ0kgaG9zdCBvYmplY3QKLSogQGlzY2lfZGV2aWNlOiBUaGlzIGlzIHRoZSBkZXZpY2UgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXMgcGVuZGluZy4KLSogQGlzY2lfcmVxdWVzdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSB0ZXJtaW5hdGVkIHJlcXVlc3Qgb2JqZWN0LgotKiBAdGFzazogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGxpYnNhcyBJL08gcmVxdWVzdC4KLSovCi1zdGF0aWMgdm9pZCBpc2NpX3JlcXVlc3RfY2xlYW51cF9jb21wbGV0ZWRfbG9pdGVyZXIoCi0Jc3RydWN0IGlzY2lfaG9zdCAgICAgICAgICAqaXNjaV9ob3N0LAotCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlzY2lfZGV2aWNlLAotCXN0cnVjdCBpc2NpX3JlcXVlc3QgICAgICAgKmlzY2lfcmVxdWVzdCwKLQlzdHJ1Y3Qgc2FzX3Rhc2sgICAgICAgICAgICp0YXNrKQorc3RhdGljIGludCBpc2NpX3JlcXVlc3RfaXNfZGVhbGxvY19tYW5hZ2VkKGVudW0gaXNjaV9yZXF1ZXN0X3N0YXR1cyBzdGF0KQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJIiVzOiBpc2NpX2RldmljZT0lcCwgcmVxdWVzdD0lcCwgdGFzaz0lcFxuIiwKLQkJX19mdW5jX18sIGlzY2lfZGV2aWNlLCBpc2NpX3JlcXVlc3QsIHRhc2spOwotCi0JaWYgKHRhc2sgIT0gTlVMTCkgewotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJdGFzay0+bGxkZF90YXNrID0gTlVMTDsKLQotCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19ORUVEX0RFVl9SRVNFVDsKLQotCQlpc2NpX3NldF90YXNrX2RvbmVmbGFncyh0YXNrKTsKLQotCQkvKiBJZiB0aGlzIHRhc2sgaXMgbm90IGluIHRoZSBhYm9ydCBwYXRoLCBjYWxsIHRhc2tfZG9uZS4gKi8KLQkJaWYgKCEodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKSB7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQkJdGFzay0+dGFza19kb25lKHRhc2spOwotCQl9IGVsc2UKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCX0KLQotCWlmIChpc2NpX3JlcXVlc3QgIT0gTlVMTCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9kZWxfaW5pdCgmaXNjaV9yZXF1ZXN0LT5kZXZfbm9kZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJc3dpdGNoIChzdGF0KSB7CisJY2FzZSBhYm9ydGVkOgorCWNhc2UgYWJvcnRpbmc6CisJY2FzZSB0ZXJtaW5hdGluZzoKKwljYXNlIGNvbXBsZXRlZDoKKwljYXNlIGRlYWQ6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKIAl9CiB9CiAKQEAgLTU2MywxMSArNjE1LDkgQEAKIAllbnVtIHNjaV9zdGF0dXMgc3RhdHVzICAgICAgPSBTQ0lfU1VDQ0VTUzsKIAlib29sIHdhc190ZXJtaW5hdGVkICAgICAgICAgPSBmYWxzZTsKIAlib29sIG5lZWRzX2NsZWFudXBfaGFuZGxpbmcgPSBmYWxzZTsKLQllbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgcmVxdWVzdF9zdGF0dXM7CiAJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyAgICAgdGVybWluYXRpb25fY29tcGxldGVkID0gMTsKIAlzdHJ1Y3QgY29tcGxldGlvbiAqaW9fcmVxdWVzdF9jb21wbGV0aW9uOwotCXN0cnVjdCBzYXNfdGFzayAgICp0YXNrOwogCiAJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKIAkJIiVzOiBkZXZpY2UgPSAlcDsgcmVxdWVzdCA9ICVwXG4iLApAQCAtNTc3LDEwICs2MjcsNiBAQAogCiAJaW9fcmVxdWVzdF9jb21wbGV0aW9uID0gaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb247CiAKLQl0YXNrID0gKGlzY2lfcmVxdWVzdC0+dHR5cGUgPT0gaW9fdGFzaykKLQkJPyBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXNjaV9yZXF1ZXN0KQotCQk6IE5VTEw7Ci0KIAkvKiBOb3RlIHRoYXQgd2UgYXJlIG5vdCBnb2luZyB0byBjb250cm9sCiAJICogdGhlIHRhcmdldCB0byBhYm9ydCB0aGUgcmVxdWVzdC4KIAkgKi8KQEAgLTYxOSw0MiArNjY1LDI3IEBACiAJCQkJX19mdW5jX18sIGlzY2lfcmVxdWVzdCwgaW9fcmVxdWVzdF9jb21wbGV0aW9uKTsKIAogCQkJLyogV2FpdCBoZXJlIGZvciB0aGUgcmVxdWVzdCB0byBjb21wbGV0ZS4gKi8KLQkJCSNkZWZpbmUgVEVSTUlOQVRJT05fVElNRU9VVF9NU0VDIDUwMAogCQkJdGVybWluYXRpb25fY29tcGxldGVkCiAJCQkJPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoCiAJCQkJICAgaW9fcmVxdWVzdF9jb21wbGV0aW9uLAotCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoVEVSTUlOQVRJT05fVElNRU9VVF9NU0VDKSk7CisJCQkJICAgbXNlY3NfdG9famlmZmllcyhJU0NJX1RFUk1JTkFUSU9OX1RJTUVPVVRfTVNFQykpOwogCiAJCQlpZiAoIXRlcm1pbmF0aW9uX2NvbXBsZXRlZCkgewogCiAJCQkJLyogVGhlIHJlcXVlc3QgdG8gdGVybWluYXRlIGhhcyB0aW1lZCBvdXQuICAqLwotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLAotCQkJCQkJICBmbGFncyk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKIAogCQkJCS8qIENoZWNrIGZvciBzdGF0ZSBjaGFuZ2VzLiAqLwotCQkJCWlmICghdGVzdF9iaXQoSVJFUV9URVJNSU5BVEVELCAmaXNjaV9yZXF1ZXN0LT5mbGFncykpIHsKKwkJCQlpZiAoIXRlc3RfYml0KElSRVFfVEVSTUlOQVRFRCwKKwkJCQkJICAgICAgJmlzY2lfcmVxdWVzdC0+ZmxhZ3MpKSB7CiAKIAkJCQkJLyogVGhlIGJlc3Qgd2UgY2FuIGRvIGlzIHRvIGhhdmUgdGhlCiAJCQkJCSAqIHJlcXVlc3QgZGllIGEgc2lsZW50IGRlYXRoIGlmIGl0CiAJCQkJCSAqIGV2ZXIgcmVhbGx5IGNvbXBsZXRlcy4KLQkJCQkJICoKLQkJCQkJICogU2V0IHRoZSByZXF1ZXN0IHN0YXRlIHRvICJkZWFkIiwKLQkJCQkJICogYW5kIGNsZWFyIHRoZSB0YXNrIHBvaW50ZXIgc28gdGhhdAotCQkJCQkgKiBhbiBhY3R1YWwgY29tcGxldGlvbiBldmVudCBjYWxsYmFjawotCQkJCQkgKiBkb2Vzbid0IGRvIGFueXRoaW5nLgogCQkJCQkgKi8KLQkJCQkJaXNjaV9yZXF1ZXN0LT5zdGF0dXMgPSBkZWFkOwotCQkJCQlpc2NpX3JlcXVlc3QtPmlvX3JlcXVlc3RfY29tcGxldGlvbgotCQkJCQkJPSBOVUxMOwotCi0JCQkJCWlmIChpc2NpX3JlcXVlc3QtPnR0eXBlID09IGlvX3Rhc2spIHsKLQotCQkJCQkJLyogQnJlYWsgbGlua3Mgd2l0aCB0aGUKLQkJCQkJCSogc2FzX3Rhc2suCi0JCQkJCQkqLwotCQkJCQkJaXNjaV9yZXF1ZXN0LT50dHlwZV9wdHIuaW9fdGFza19wdHIKLQkJCQkJCQk9IE5VTEw7Ci0JCQkJCX0KKwkJCQkJaXNjaV9yZXF1ZXN0X21hcmtfem9tYmllKGlob3N0LAorCQkJCQkJCQkgaXNjaV9yZXF1ZXN0KTsKKwkJCQkJbmVlZHNfY2xlYW51cF9oYW5kbGluZyA9IHRydWU7CiAJCQkJfSBlbHNlCiAJCQkJCXRlcm1pbmF0aW9uX2NvbXBsZXRlZCA9IDE7CiAKQEAgLTY5MSwyOSArNzIyLDI4IEBACiAJCQkgKiBuZWVkcyB0byBiZSBkZXRhY2hlZCBhbmQgZnJlZWQgaGVyZS4KIAkJCSAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfcmVxdWVzdC0+c3RhdGVfbG9jaywgZmxhZ3MpOwotCQkJcmVxdWVzdF9zdGF0dXMgPSBpc2NpX3JlcXVlc3QtPnN0YXR1czsKIAotCQkJaWYgKChpc2NpX3JlcXVlc3QtPnR0eXBlID09IGlvX3Rhc2spIC8qIFRNRnMgYXJlIGluIHRoZWlyIG93biB0aHJlYWQgKi8KLQkJCSAgICAmJiAoKHJlcXVlc3Rfc3RhdHVzID09IGFib3J0ZWQpCi0JCQkJfHwgKHJlcXVlc3Rfc3RhdHVzID09IGFib3J0aW5nKQotCQkJCXx8IChyZXF1ZXN0X3N0YXR1cyA9PSB0ZXJtaW5hdGluZykKLQkJCQl8fCAocmVxdWVzdF9zdGF0dXMgPT0gY29tcGxldGVkKQotCQkJCXx8IChyZXF1ZXN0X3N0YXR1cyA9PSBkZWFkKQotCQkJCSkKLQkJCSAgICApIHsKKwkJCW5lZWRzX2NsZWFudXBfaGFuZGxpbmcKKwkJCQk9IGlzY2lfcmVxdWVzdF9pc19kZWFsbG9jX21hbmFnZWQoCisJCQkJCWlzY2lfcmVxdWVzdC0+c3RhdHVzKTsKIAotCQkJCS8qIFRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd29uJ3QgZnJlZSBhIHJlcXVlc3QgaW4KLQkJCQkgKiB0aGUgYWJvcnRlZC9hYm9ydGluZy9ldGMuIHN0YXRlcywgc28gd2UgZG8KLQkJCQkgKiBpdCBoZXJlLgotCQkJCSAqLwotCQkJCW5lZWRzX2NsZWFudXBfaGFuZGxpbmcgPSB0cnVlOwotCQkJfQogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9yZXF1ZXN0LT5zdGF0ZV9sb2NrLCBmbGFncyk7CiAKIAkJfQotCQlpZiAobmVlZHNfY2xlYW51cF9oYW5kbGluZykKLQkJCWlzY2lfcmVxdWVzdF9jbGVhbnVwX2NvbXBsZXRlZF9sb2l0ZXJlcigKLQkJCQlpaG9zdCwgaWRldiwgaXNjaV9yZXF1ZXN0LCB0YXNrKTsKKwkJaWYgKG5lZWRzX2NsZWFudXBfaGFuZGxpbmcpIHsKKworCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IGNsZWFudXAgaXNjaV9kZXZpY2U9JXAsIHJlcXVlc3Q9JXBcbiIsCisJCQkJX19mdW5jX18sIGlkZXYsIGlzY2lfcmVxdWVzdCk7CisKKwkJCWlmIChpc2NpX3JlcXVlc3QgIT0gTlVMTCkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCQkJaXNjaV9mcmVlX3RhZyhpaG9zdCwgaXNjaV9yZXF1ZXN0LT5pb190YWcpOworCQkJCWlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhdGUoaXNjaV9yZXF1ZXN0LCB1bmFsbG9jYXRlZCk7CisJCQkJbGlzdF9kZWxfaW5pdCgmaXNjaV9yZXF1ZXN0LT5kZXZfbm9kZSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQkJfQorCQl9CiAJfQogfQogCkBAIC03NzIsNyArODAyLDkgQEAKIAkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKIAkJCSAiJXM6IGlkZXY9JXAgcmVxdWVzdD0lcDsgdGFzaz0lcCBvbGRfc3RhdGU9JWRcbiIsCiAJCQkgX19mdW5jX18sIGlkZXYsIGlyZXEsCi0JCQlpcmVxLT50dHlwZSA9PSBpb190YXNrID8gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpIDogTlVMTCwKKwkJCSghdGVzdF9iaXQoSVJFUV9UTUYsICZpcmVxLT5mbGFncykKKwkJCQk/IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKQorCQkJCTogTlVMTCksCiAJCQlvbGRfc3RhdGUpOwogCiAJCS8qIElmIHRoZSBvbGRfc3RhdGUgaXMgc3RhcnRlZDoKQEAgLTg4OSwyMiArOTIxLDE0IEBACiAJCSIlczogZG9tYWluX2RldmljZT0lcCwgaXNjaV9ob3N0PSVwOyBpc2NpX2RldmljZT0lcFxuIiwKIAkJIF9fZnVuY19fLCBkb21haW5fZGV2aWNlLCBpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKTsKIAotCWlmIChpc2NpX2RldmljZSkKLQkJc2V0X2JpdChJREVWX0VILCAmaXNjaV9kZXZpY2UtPmZsYWdzKTsKKwlpZiAoIWlzY2lfZGV2aWNlKSB7CisJCS8qIElmIHRoZSBkZXZpY2UgaXMgZ29uZSwgc3RvcCB0aGUgZXNjYWxhdGlvbnMuICovCisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LCAiJXM6IE5vIGRldlxuIiwgX19mdW5jX18pOwogCi0JLyogSWYgdGhlcmUgaXMgYSBkZXZpY2UgcmVzZXQgcGVuZGluZyBvbiBhbnkgcmVxdWVzdCBpbiB0aGUKLQkgKiBkZXZpY2UncyBsaXN0LCBmYWlsIHRoaXMgTFVOIHJlc2V0IHJlcXVlc3QgaW4gb3JkZXIgdG8KLQkgKiBlc2NhbGF0ZSB0byB0aGUgZGV2aWNlIHJlc2V0LgotCSAqLwotCWlmICghaXNjaV9kZXZpY2UgfHwKLQkgICAgaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZyhpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKSkgewotCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJCSAiJXM6IE5vIGRldiAoJXApLCBvciAiCi0JCQkgIlJFU0VUIFBFTkRJTkc6IGRvbWFpbl9kZXZpY2U9JXBcbiIsCi0JCQkgX19mdW5jX18sIGlzY2lfZGV2aWNlLCBkb21haW5fZGV2aWNlKTsKLQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJCXJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CiAJCWdvdG8gb3V0OwogCX0KKwlzZXRfYml0KElERVZfRUgsICZpc2NpX2RldmljZS0+ZmxhZ3MpOwogCiAJLyogU2VuZCB0aGUgdGFzayBtYW5hZ2VtZW50IHBhcnQgb2YgdGhlIHJlc2V0LiAqLwogCWlmIChzYXNfcHJvdG9jb2xfYXRhKGRvbWFpbl9kZXZpY2UtPnRwcm90bykpIHsKQEAgLTEwMTMsNyArMTAzNyw3IEBACiAJc3RydWN0IGlzY2lfdG1mICAgICAgICAgICB0bWY7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKIAl1bnNpZ25lZCBsb25nICAgICAgICAgICAgIGZsYWdzOwotCWJvb2wgICAgICAgICAgICAgICAgICAgICAgYW55X2Rldl9yZXNldCA9IGZhbHNlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybV90ZXJtaW5hdGlvbiA9IDA7CiAKIAkvKiBHZXQgdGhlIGlzY2lfcmVxdWVzdCByZWZlcmVuY2UgZnJvbSB0aGUgdGFzay4gIE5vdGUgdGhhdAogCSAqIHRoaXMgY2hlY2sgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBwZW5kaW5nIHJlcXVlc3QgbGlzdApAQCAtMTAzNSw4OSArMTA1OSwzNCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CiAKIAlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJIiVzOiB0YXNrID0gJXBcbiIsIF9fZnVuY19fLCB0YXNrKTsKKwkJIiVzOiBkZXYgPSAlcCwgdGFzayA9ICVwLCBvbGRfcmVxdWVzdCA9PSAlcFxuIiwKKwkJX19mdW5jX18sIGlzY2lfZGV2aWNlLCB0YXNrLCBvbGRfcmVxdWVzdCk7CiAKLQlpZiAoIWlzY2lfZGV2aWNlIHx8ICFvbGRfcmVxdWVzdCkKLQkJZ290byBvdXQ7CisJaWYgKGlzY2lfZGV2aWNlKQorCQlzZXRfYml0KElERVZfRUgsICZpc2NpX2RldmljZS0+ZmxhZ3MpOwogCi0Jc2V0X2JpdChJREVWX0VILCAmaXNjaV9kZXZpY2UtPmZsYWdzKTsKLQotCS8qIFRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIHdpbGwgZmFpbCBhYm9ydCByZXF1ZXN0cyBmb3IKLQkgKiBTQVRBL1NUUC4gIEZhaWxpbmcgdGhlIGFib3J0IHJlcXVlc3QgdGhpcyB3YXkgd2lsbCBjYXVzZSB0aGUKLQkgKiBTQ1NJIGVycm9yIGhhbmRsZXIgdGhyZWFkIHRvIGVzY2FsYXRlIHRvIExVTiByZXNldAorCS8qIERldmljZSByZXNldCBjb25kaXRpb25zIHNpZ25hbGxlZCBpbiB0YXNrX3N0YXRlX2ZsYWdzIGFyZSB0aGUKKwkgKiByZXNwb25zYmlsaXR5IG9mIGxpYnNhcyB0byBvYnNlcnZlIGF0IHRoZSBzdGFydCBvZiB0aGUgZXJyb3IKKwkgKiBoYW5kbGVyIHRocmVhZC4KIAkgKi8KLQlpZiAoc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSkgewotCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJCSAgICAiIHRhc2sgJXAgaXMgZm9yIGEgU1RQL1NBVEEgZGV2aWNlOyIKLQkJCSAgICAiIHJldHVybmluZyBUTUZfUkVTUF9GVU5DX0ZBSUxFRFxuIgotCQkJICAgICIgdG8gY2F1c2UgYSBMVU4gcmVzZXQuLi5cbiIsIHRhc2spOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJIiVzOiBvbGRfcmVxdWVzdCA9PSAlcFxuIiwgX19mdW5jX18sIG9sZF9yZXF1ZXN0KTsKLQotCWFueV9kZXZfcmVzZXQgPSBpc2NpX2RldmljZV9pc19yZXNldF9wZW5kaW5nKGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCi0JYW55X2Rldl9yZXNldCA9IGFueV9kZXZfcmVzZXQgfHwgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVCk7Ci0KLQkvKiBJZiB0aGUgZXh0cmFjdGlvbiBvZiB0aGUgcmVxdWVzdCByZWZlcmVuY2UgZnJvbSB0aGUgdGFzawotCSAqIGZhaWxlZCwgdGhlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQgKG9yIGlmIHRoZXJlIGlzIGEKLQkgKiBwZW5kaW5nIHJlc2V0IHRoZW4gdGhpcyBhYm9ydCByZXF1ZXN0IGZ1bmN0aW9uIG11c3QgYmUgZmFpbGVkCi0JICogaW4gb3JkZXIgdG8gZXNjYWxhdGUgdG8gdGhlIHRhcmdldCByZXNldCkuCi0JICovCi0JaWYgKChvbGRfcmVxdWVzdCA9PSBOVUxMKSB8fCBhbnlfZGV2X3Jlc2V0KSB7Ci0KLQkJLyogSWYgdGhlIGRldmljZSByZXNldCB0YXNrIGZsYWcgaXMgc2V0LCBmYWlsIHRoZSB0YXNrCi0JCSAqIG1hbmFnZW1lbnQgcmVxdWVzdC4gIE90aGVyd2lzZSwgdGhlIG9yaWdpbmFsIHJlcXVlc3QKLQkJICogaGFzIGNvbXBsZXRlZC4KLQkJICovCi0JCWlmIChhbnlfZGV2X3Jlc2V0KSB7Ci0KLQkJCS8qIFR1cm4gb2ZmIHRoZSB0YXNrJ3MgRE9ORSB0byBtYWtlIHN1cmUgdGhpcwotCQkJICogdGFzayBpcyBlc2NhbGF0ZWQgdG8gYSB0YXJnZXQgcmVzZXQuCi0JCQkgKi8KLQkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX1NUQVRFX0RPTkU7Ci0KLQkJCS8qIE1ha2UgdGhlIHJlc2V0IGhhcHBlbiBhcyBzb29uIGFzIHBvc3NpYmxlLiAqLwotCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19ORUVEX0RFVl9SRVNFVDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0KLQkJCS8qIEZhaWwgdGhlIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0IGluIG9yZGVyIHRvCi0JCQkgKiBlc2NhbGF0ZSB0byB0aGUgdGFyZ2V0IHJlc2V0LgotCQkJICovCi0JCQlyZXQgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKLQotCQkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCQkJIiVzOiBGYWlsaW5nIHRhc2sgYWJvcnQgaW4gb3JkZXIgdG8gIgotCQkJCSJlc2NhbGF0ZSB0byB0YXJnZXQgcmVzZXQgYmVjYXVzZVxuIgotCQkJCSJTQVNfVEFTS19ORUVEX0RFVl9SRVNFVCBpcyBzZXQgZm9yICIKLQkJCQkidGFzayAlcCBvbiBkZXYgJXBcbiIsCi0JCQkJX19mdW5jX18sIHRhc2ssIGlzY2lfZGV2aWNlKTsKLQotCi0JCX0gZWxzZSB7Ci0JCQkvKiBUaGUgcmVxdWVzdCBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgYW5kIHRoZXJlCi0JCQkgKiBpcyBub3RoaW5nIHRvIGRvIGhlcmUgb3RoZXIgdGhhbiB0byBzZXQgdGhlIHRhc2sKLQkJCSAqIGRvbmUgYml0LCBhbmQgaW5kaWNhdGUgdGhhdCB0aGUgdGFzayBhYm9ydCBmdW5jdGlvbgotCQkJICogd2FzIHN1Y2Vzc2Z1bC4KLQkJCSAqLwotCQkJaXNjaV9zZXRfdGFza19kb25lZmxhZ3ModGFzayk7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCi0JCQlyZXQgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOwotCi0JCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJCQkiJXM6IGFib3J0IHRhc2sgbm90IG5lZWRlZCBmb3IgJXBcbiIsCi0JCQkJX19mdW5jX18sIHRhc2spOwotCQl9Ci0JCWdvdG8gb3V0OwotCX0gZWxzZSB7CisJaWYgKCFpc2NpX2RldmljZSB8fCAhb2xkX3JlcXVlc3QpIHsKKwkJLyogVGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgY29tcGxldGVkIGFuZCB0aGVyZQorCQkqIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSBvdGhlciB0aGFuIHRvIHNldCB0aGUgdGFzaworCQkqIGRvbmUgYml0LCBhbmQgaW5kaWNhdGUgdGhhdCB0aGUgdGFzayBhYm9ydCBmdW5jdGlvbgorCQkqIHdhcyBzdWNlc3NmdWwuCisJCSovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19TVEFURV9ET05FOworCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH4oU0FTX1RBU0tfQVRfSU5JVElBVE9SIHwKKwkJCQkJICAgIFNBU19UQVNLX1NUQVRFX1BFTkRJTkcpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCQlyZXQgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOworCisJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzOiBhYm9ydCB0YXNrIG5vdCBuZWVkZWQgZm9yICVwXG4iLAorCQkJX19mdW5jX18sIHRhc2spOworCQlnb3RvIG91dDsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKQEAgLTExNDYsMjQgKzExMTUsNDQgQEAKIAkJZ290byBvdXQ7CiAJfQogCWlmICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVAgfHwKKwkgICAgc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSB8fAogCSAgICB0ZXN0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJm9sZF9yZXF1ZXN0LT5mbGFncykpIHsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwogCiAJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAotCQkJIiVzOiBTTVAgcmVxdWVzdCAoJWQpIgorCQkJIiVzOiAlcyByZXF1ZXN0IgogCQkJIiBvciBjb21wbGV0ZV9pbl90YXJnZXQgKCVkKSwgdGh1cyBubyBUTUZcbiIsCi0JCQlfX2Z1bmNfXywgKHRhc2stPnRhc2tfcHJvdG8gPT0gU0FTX1BST1RPQ09MX1NNUCksCisJCQlfX2Z1bmNfXywKKwkJCSgodGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QKQorCQkJCT8gIlNNUCIKKwkJCQk6IChzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pCisJCQkJCT8gIlNBVEEvU1RQIgorCQkJCQk6ICI8b3RoZXI+IikKKwkJCSApLAogCQkJdGVzdF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZvbGRfcmVxdWVzdC0+ZmxhZ3MpKTsKIAotCQkvKiBTZXQgdGhlIHN0YXRlIG9uIHRoZSB0YXNrLiAqLwotCQlpc2NpX3Rhc2tfYWxsX2RvbmUodGFzayk7CisJCWlmICh0ZXN0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJm9sZF9yZXF1ZXN0LT5mbGFncykpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfU1RBVEVfRE9ORTsKKwkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gfihTQVNfVEFTS19BVF9JTklUSUFUT1IgfAorCQkJCQkJICAgIFNBU19UQVNLX1NUQVRFX1BFTkRJTkcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQlyZXQgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOworCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+KFNBU19UQVNLX0FUX0lOSVRJQVRPUiB8CisJCQkJCQkgICAgU0FTX1RBU0tfU1RBVEVfUEVORElORyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJfQogCi0JCXJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7Ci0KLQkJLyogU3RvcHBpbmcgYW5kIFNNUCBkZXZpY2VzIGFyZSBub3Qgc2VudCBhIFRNRiwgYW5kIGFyZSBub3QKLQkJICogcmVzZXQsIGJ1dCB0aGUgb3V0c3RhbmRpbmcgSS9PIHJlcXVlc3QgaXMgdGVybWluYXRlZCBiZWxvdy4KKwkJLyogU1RQIGFuZCBTTVAgZGV2aWNlcyBhcmUgbm90IHNlbnQgYSBUTUYsIGJ1dCB0aGUKKwkJICogb3V0c3RhbmRpbmcgSS9PIHJlcXVlc3QgaXMgdGVybWluYXRlZCBiZWxvdy4gIFRoaXMgaXMKKwkJICogYmVjYXVzZSBTQVRBL1NUUCBhbmQgU01QIGRpc2NvdmVyeSBwYXRoIHRpbWVvdXRzIGRpcmVjdGx5CisJCSAqIGNhbGwgdGhlIGFib3J0IHRhc2sgaW50ZXJmYWNlIGZvciBjbGVhbnVwLgogCQkgKi8KKwkJcGVyZm9ybV90ZXJtaW5hdGlvbiA9IDE7CisKIAl9IGVsc2UgewogCQkvKiBGaWxsIGluIHRoZSB0bWYgc3R1Y3R1cmUgKi8KIAkJaXNjaV90YXNrX2J1aWxkX2Fib3J0X3Rhc2tfdG1mKCZ0bWYsIGlzY2lfdG1mX3NzcF90YXNrX2Fib3J0LApAQCAtMTE3MiwyMiArMTE2MSwyNCBAQAogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CiAKLQkJI2RlZmluZSBJU0NJX0FCT1JUX1RBU0tfVElNRU9VVF9NUyA1MDAgLyogaGFsZiBzZWNvbmQgdGltZW91dC4gKi8KKwkJI2RlZmluZSBJU0NJX0FCT1JUX1RBU0tfVElNRU9VVF9NUyA1MDAgLyogMS8yIHNlY29uZCB0aW1lb3V0ICovCiAJCXJldCA9IGlzY2lfdGFza19leGVjdXRlX3RtZihpc2NpX2hvc3QsIGlzY2lfZGV2aWNlLCAmdG1mLAogCQkJCQkgICAgSVNDSV9BQk9SVF9UQVNLX1RJTUVPVVRfTVMpOwogCi0JCWlmIChyZXQgIT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkKKwkJaWYgKHJldCA9PSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFKQorCQkJcGVyZm9ybV90ZXJtaW5hdGlvbiA9IDE7CisJCWVsc2UKIAkJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAotCQkJCSIlczogaXNjaV90YXNrX3NlbmRfdG1mIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7CisJCQkJIiVzOiBpc2NpX3Rhc2tfc2VuZF90bWYgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJfQotCWlmIChyZXQgPT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkgeworCWlmIChwZXJmb3JtX3Rlcm1pbmF0aW9uKSB7CiAJCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZvbGRfcmVxdWVzdC0+ZmxhZ3MpOwogCiAJCS8qIENsZWFuIHVwIHRoZSByZXF1ZXN0IG9uIG91ciBzaWRlLCBhbmQgd2FpdCBmb3IgdGhlIGFib3J0ZWQKIAkJICogSS9PIHRvIGNvbXBsZXRlLgogCQkgKi8KLQkJaXNjaV90ZXJtaW5hdGVfcmVxdWVzdF9jb3JlKGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UsIG9sZF9yZXF1ZXN0KTsKKwkJaXNjaV90ZXJtaW5hdGVfcmVxdWVzdF9jb3JlKGlzY2lfaG9zdCwgaXNjaV9kZXZpY2UsCisJCQkJCSAgICBvbGRfcmVxdWVzdCk7CiAJfQogCiAJLyogTWFrZSBzdXJlIHdlIGRvIG5vdCBsZWF2ZSBhIHJlZmVyZW5jZSB0byBhYm9ydGVkX2lvX2NvbXBsZXRpb24gKi8KQEAgLTEyODgsNyArMTI3OSw4IEBACiAJCQkgICBlbnVtIHNjaV90YXNrX3N0YXR1cyBjb21wbGV0aW9uX3N0YXR1cykKIHsKIAlzdHJ1Y3QgaXNjaV90bWYgKnRtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOwotCXN0cnVjdCBjb21wbGV0aW9uICp0bWZfY29tcGxldGU7CisJc3RydWN0IGNvbXBsZXRpb24gKnRtZl9jb21wbGV0ZSA9IE5VTEw7CisJc3RydWN0IGNvbXBsZXRpb24gKnJlcXVlc3RfY29tcGxldGUgPSBpcmVxLT5pb19yZXF1ZXN0X2NvbXBsZXRpb247CiAKIAlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAogCQkiJXM6IHJlcXVlc3QgPSAlcCwgc3RhdHVzPSVkXG4iLApAQCAtMTI5NiwyNzggKzEyODgsNTMgQEAKIAogCWlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhdGUoaXJlcSwgY29tcGxldGVkKTsKIAotCXRtZi0+c3RhdHVzID0gY29tcGxldGlvbl9zdGF0dXM7CiAJc2V0X2JpdChJUkVRX0NPTVBMRVRFX0lOX1RBUkdFVCwgJmlyZXEtPmZsYWdzKTsKIAotCWlmICh0bWYtPnByb3RvID09IFNBU19QUk9UT0NPTF9TU1ApIHsKLQkJbWVtY3B5KCZ0bWYtPnJlc3AucmVzcF9pdSwKLQkJICAgICAgICZpcmVxLT5zc3AucnNwLAotCQkgICAgICAgU1NQX1JFU1BfSVVfTUFYX1NJWkUpOwotCX0gZWxzZSBpZiAodG1mLT5wcm90byA9PSBTQVNfUFJPVE9DT0xfU0FUQSkgewotCQltZW1jcHkoJnRtZi0+cmVzcC5kMmhfZmlzLAotCQkgICAgICAgJmlyZXEtPnN0cC5yc3AsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGRldl90b19ob3N0X2ZpcykpOworCWlmICh0bWYpIHsKKwkJdG1mLT5zdGF0dXMgPSBjb21wbGV0aW9uX3N0YXR1czsKKworCQlpZiAodG1mLT5wcm90byA9PSBTQVNfUFJPVE9DT0xfU1NQKSB7CisJCQltZW1jcHkoJnRtZi0+cmVzcC5yZXNwX2l1LAorCQkJICAgICAgICZpcmVxLT5zc3AucnNwLAorCQkJICAgICAgIFNTUF9SRVNQX0lVX01BWF9TSVpFKTsKKwkJfSBlbHNlIGlmICh0bWYtPnByb3RvID09IFNBU19QUk9UT0NPTF9TQVRBKSB7CisJCQltZW1jcHkoJnRtZi0+cmVzcC5kMmhfZmlzLAorCQkJICAgICAgICZpcmVxLT5zdHAucnNwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGV2X3RvX2hvc3RfZmlzKSk7CisJCX0KKwkJLyogUFJJTlRfVE1GKCAoKHN0cnVjdCBpc2NpX3RtZiAqKXJlcXVlc3QtPnRhc2spKTsgKi8KKwkJdG1mX2NvbXBsZXRlID0gdG1mLT5jb21wbGV0ZTsKIAl9Ci0KLQkvKiBQUklOVF9UTUYoICgoc3RydWN0IGlzY2lfdG1mICopcmVxdWVzdC0+dGFzaykpOyAqLwotCXRtZl9jb21wbGV0ZSA9IHRtZi0+Y29tcGxldGU7Ci0KIAlzY2lfY29udHJvbGxlcl9jb21wbGV0ZV9pbyhpaG9zdCwgaXJlcS0+dGFyZ2V0X2RldmljZSwgaXJlcSk7CiAJLyogc2V0IHRoZSAndGVybWluYXRlZCcgZmxhZyBoYW5kbGUgdG8gbWFrZSBzdXJlIGl0IGNhbm5vdCBiZSB0ZXJtaW5hdGVkCiAJICogIG9yIGNvbXBsZXRlZCBhZ2Fpbi4KIAkgKi8KIAlzZXRfYml0KElSRVFfVEVSTUlOQVRFRCwgJmlyZXEtPmZsYWdzKTsKIAotCWlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhdGUoaXJlcSwgdW5hbGxvY2F0ZWQpOwotCWxpc3RfZGVsX2luaXQoJmlyZXEtPmRldl9ub2RlKTsKKwkvKiBBcyBzb29uIGFzIHNvbWV0aGluZyBpcyBpbiB0aGUgdGVybWluYXRlIHBhdGgsIGRlYWxsb2NhdGlvbiBpcworCSAqIG1hbmFnZWQgdGhlcmUuICBOb3RlIHRoYXQgdGhlIGZpbmFsIG5vbi1tYW5hZ2VkIHN0YXRlIG9mIGEgdGFzaworCSAqIHJlcXVlc3QgaXMgImNvbXBsZXRlZCIuCisJICovCisJaWYgKChpcmVxLT5zdGF0dXMgPT0gY29tcGxldGVkKSB8fAorCSAgICAhaXNjaV9yZXF1ZXN0X2lzX2RlYWxsb2NfbWFuYWdlZChpcmVxLT5zdGF0dXMpKSB7CisJCWlzY2lfcmVxdWVzdF9jaGFuZ2Vfc3RhdGUoaXJlcSwgdW5hbGxvY2F0ZWQpOworCQlpc2NpX2ZyZWVfdGFnKGlob3N0LCBpcmVxLT5pb190YWcpOworCQlsaXN0X2RlbF9pbml0KCZpcmVxLT5kZXZfbm9kZSk7CisJfQorCisJLyogInJlcXVlc3RfY29tcGxldGUiIGlzIHNldCBpZiB0aGUgdGFzayB3YXMgYmVpbmcgdGVybWluYXRlZC4gKi8KKwlpZiAocmVxdWVzdF9jb21wbGV0ZSkKKwkJY29tcGxldGUocmVxdWVzdF9jb21wbGV0ZSk7CiAKIAkvKiBUaGUgdGFzayBtYW5hZ2VtZW50IHBhcnQgY29tcGxldGVzIGxhc3QuICovCi0JY29tcGxldGUodG1mX2NvbXBsZXRlKTsKLX0KLQotc3RhdGljIHZvaWQgaXNjaV9zbXBfdGFza190aW1lZG91dCh1bnNpZ25lZCBsb25nIF90YXNrKQotewotCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9ICh2b2lkICopIF90YXNrOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCEodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0RPTkUpKQotCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX1NUQVRFX0FCT1JURUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0KLQljb21wbGV0ZSgmdGFzay0+Y29tcGxldGlvbik7Ci19Ci0KLXN0YXRpYyB2b2lkIGlzY2lfc21wX3Rhc2tfZG9uZShzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCi17Ci0JaWYgKCFkZWxfdGltZXIoJnRhc2stPnRpbWVyKSkKLQkJcmV0dXJuOwotCWNvbXBsZXRlKCZ0YXNrLT5jb21wbGV0aW9uKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzYXNfdGFzayAqaXNjaV9hbGxvY190YXNrKHZvaWQpCi17Ci0Jc3RydWN0IHNhc190YXNrICp0YXNrID0ga3phbGxvYyhzaXplb2YoKnRhc2spLCBHRlBfS0VSTkVMKTsKLQotCWlmICh0YXNrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZ0YXNrLT5saXN0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7Ci0JCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgPSBTQVNfVEFTS19TVEFURV9QRU5ESU5HOwotCQlpbml0X3RpbWVyKCZ0YXNrLT50aW1lcik7Ci0JCWluaXRfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7Ci0JfQotCi0JcmV0dXJuIHRhc2s7Ci19Ci0KLXN0YXRpYyB2b2lkIGlzY2lfZnJlZV90YXNrKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3Qgc2FzX3Rhc2sgICp0YXNrKQotewotCWlmICh0YXNrKSB7Ci0JCUJVR19PTighbGlzdF9lbXB0eSgmdGFzay0+bGlzdCkpOwotCQlrZnJlZSh0YXNrKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaXNjaV9zbXBfZXhlY3V0ZV90YXNrKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAotCQkJCSBzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCB2b2lkICpyZXEsCi0JCQkJIGludCByZXFfc2l6ZSwgdm9pZCAqcmVzcCwgaW50IHJlc3Bfc2l6ZSkKLXsKLQlpbnQgcmVzLCByZXRyeTsKLQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBOVUxMOwotCi0JZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgcmV0cnkrKykgewotCQl0YXNrID0gaXNjaV9hbGxvY190YXNrKCk7Ci0JCWlmICghdGFzaykKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCXRhc2stPmRldiA9IGRldjsKLQkJdGFzay0+dGFza19wcm90byA9IGRldi0+dHByb3RvOwotCQlzZ19pbml0X29uZSgmdGFzay0+c21wX3Rhc2suc21wX3JlcSwgcmVxLCByZXFfc2l6ZSk7Ci0JCXNnX2luaXRfb25lKCZ0YXNrLT5zbXBfdGFzay5zbXBfcmVzcCwgcmVzcCwgcmVzcF9zaXplKTsKLQotCQl0YXNrLT50YXNrX2RvbmUgPSBpc2NpX3NtcF90YXNrX2RvbmU7Ci0KLQkJdGFzay0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0YXNrOwotCQl0YXNrLT50aW1lci5mdW5jdGlvbiA9IGlzY2lfc21wX3Rhc2tfdGltZWRvdXQ7Ci0JCXRhc2stPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTAqSFo7Ci0JCWFkZF90aW1lcigmdGFzay0+dGltZXIpOwotCi0JCXJlcyA9IGlzY2lfdGFza19leGVjdXRlX3Rhc2sodGFzaywgMSwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKHJlcykgewotCQkJZGVsX3RpbWVyKCZ0YXNrLT50aW1lcik7Ci0JCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAotCQkJCSIlczogZXhlY3V0aW5nIFNNUCB0YXNrIGZhaWxlZDolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmVzKTsKLQkJCWdvdG8gZXhfZXJyOwotCQl9Ci0KLQkJd2FpdF9mb3JfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7Ci0JCXJlcyA9IC1FQ09NTTsKLQkJaWYgKCh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpIHsKLQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCi0JCQkJIiVzOiBzbXAgdGFzayB0aW1lZCBvdXQgb3IgYWJvcnRlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlpc2NpX3Rhc2tfYWJvcnRfdGFzayh0YXNrKTsKLQkJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkgewotCQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCi0JCQkJCSIlczogU01QIHRhc2sgYWJvcnRlZCBhbmQgbm90IGRvbmVcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlnb3RvIGV4X2VycjsKLQkJCX0KLQkJfQotCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgotCQkgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fU1RBVF9HT09EKSB7Ci0JCQlyZXMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKLQkJICAgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQVNfREFUQV9VTkRFUlJVTikgewotCQkJLyogbm8gZXJyb3IsIGJ1dCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZgotCQkJKiB1bmRlcnJ1biAqLwotCQkJcmVzID0gdGFzay0+dGFza19zdGF0dXMucmVzaWR1YWw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgotCQkgICAgICB0YXNrLT50YXNrX3N0YXR1cy5zdGF0ID09IFNBU19EQVRBX09WRVJSVU4pIHsKLQkJCXJlcyA9IC1FTVNHU0laRTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKLQkJCQkiJXM6IHRhc2sgdG8gZGV2ICUwMTZsbHggcmVzcG9uc2U6IDB4JXggIgotCQkJCSJzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sCi0JCQkJU0FTX0FERFIoZGV2LT5zYXNfYWRkciksCi0JCQkJdGFzay0+dGFza19zdGF0dXMucmVzcCwKLQkJCQl0YXNrLT50YXNrX3N0YXR1cy5zdGF0KTsKLQkJCWlzY2lfZnJlZV90YXNrKGlob3N0LCB0YXNrKTsKLQkJCXRhc2sgPSBOVUxMOwotCQl9Ci0JfQotZXhfZXJyOgotCUJVR19PTihyZXRyeSA9PSAzICYmIHRhc2sgIT0gTlVMTCk7Ci0JaXNjaV9mcmVlX3Rhc2soaWhvc3QsIHRhc2spOwotCXJldHVybiByZXM7Ci19Ci0KLSNkZWZpbmUgRElTQ09WRVJfUkVRX1NJWkUgIDE2Ci0jZGVmaW5lIERJU0NPVkVSX1JFU1BfU0laRSA1NgotCi1pbnQgaXNjaV9zbXBfZ2V0X3BoeV9hdHRhY2hlZF9kZXZfdHlwZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKLQkJCQkgICAgICAgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgaW50IHBoeV9pZCwgaW50ICphZHQpCi17Ci0Jc3RydWN0IHNtcF9yZXNwICpkaXNjX3Jlc3A7Ci0JdTggKmRpc2NfcmVxOwotCWludCByZXM7Ci0KLQlkaXNjX3Jlc3AgPSBremFsbG9jKERJU0NPVkVSX1JFU1BfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkaXNjX3Jlc3ApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGlzY19yZXEgPSBremFsbG9jKERJU0NPVkVSX1JFUV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGlzY19yZXEpIHsKLQkJZGlzY19yZXFbMF0gPSBTTVBfUkVRVUVTVDsKLQkJZGlzY19yZXFbMV0gPSBTTVBfRElTQ09WRVI7Ci0JCWRpc2NfcmVxWzldID0gcGh5X2lkOwotCX0gZWxzZSB7Ci0JCWtmcmVlKGRpc2NfcmVzcCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlyZXMgPSBpc2NpX3NtcF9leGVjdXRlX3Rhc2soaWhvc3QsIGRldiwgZGlzY19yZXEsIERJU0NPVkVSX1JFUV9TSVpFLAotCQkJCSAgICBkaXNjX3Jlc3AsIERJU0NPVkVSX1JFU1BfU0laRSk7Ci0JaWYgKCFyZXMpIHsKLQkJaWYgKGRpc2NfcmVzcC0+cmVzdWx0ICE9IFNNUF9SRVNQX0ZVTkNfQUNDKQotCQkJcmVzID0gZGlzY19yZXNwLT5yZXN1bHQ7Ci0JCWVsc2UKLQkJCSphZHQgPSBkaXNjX3Jlc3AtPmRpc2MuYXR0YWNoZWRfZGV2X3R5cGU7Ci0JfQotCWtmcmVlKGRpc2NfcmVxKTsKLQlrZnJlZShkaXNjX3Jlc3ApOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZvaWQgaXNjaV93YWl0X2Zvcl9zbXBfcGh5X3Jlc2V0KHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsIGludCBwaHlfbnVtKQotewotCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBpZGV2LT5kb21haW5fZGV2OwotCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaWRldi0+aXNjaV9wb3J0OwotCXN0cnVjdCBpc2NpX2hvc3QgKmlob3N0ID0gaXBvcnQtPmlzY2lfaG9zdDsKLQlpbnQgcmVzLCBpdGVyYXRpb24gPSAwLCBhdHRhY2hlZF9kZXZpY2VfdHlwZTsKLQkjZGVmaW5lIFNUUF9XQUlUX01TRUNTIDI1MDAwCi0JdW5zaWduZWQgbG9uZyB0bW8gPSBtc2Vjc190b19qaWZmaWVzKFNUUF9XQUlUX01TRUNTKTsKLQl1bnNpZ25lZCBsb25nIGRlYWRsaW5lID0gamlmZmllcyArIHRtbzsKLQllbnVtIHsKLQkJU01QX1BIWVdBSVRfUEhZRE9XTiwKLQkJU01QX1BIWVdBSVRfUEhZVVAsCi0JCVNNUF9QSFlXQUlUX0RPTkUKLQl9IHBoeV9zdGF0ZSA9IFNNUF9QSFlXQUlUX1BIWURPV047Ci0KLQkvKiBXaGlsZSB0aGVyZSBpcyB0aW1lLCB3YWl0IGZvciB0aGUgcGh5IHRvIGdvIGF3YXkgYW5kIGNvbWUgYmFjayAqLwotCXdoaWxlICh0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZGVhZGxpbmUpICYmIHBoeV9zdGF0ZSAhPSBTTVBfUEhZV0FJVF9ET05FKSB7Ci0JCWludCBldmVudCA9IGF0b21pY19yZWFkKCZpcG9ydC0+ZXZlbnQpOwotCi0JCSsraXRlcmF0aW9uOwotCi0JCXRtbyA9IHdhaXRfZXZlbnRfdGltZW91dChpaG9zdC0+ZXZlbnRxLAotCQkJCQkgZXZlbnQgIT0gYXRvbWljX3JlYWQoJmlwb3J0LT5ldmVudCkgfHwKLQkJCQkJICF0ZXN0X2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncyksCi0JCQkJCSB0bW8pOwotCQkvKiBsaW5rIGRvd24sIHN0b3AgcG9sbGluZyAqLwotCQlpZiAoIXRlc3RfYml0KElQT1JUX0JDTl9CTE9DS0VELCAmaXBvcnQtPmZsYWdzKSkKLQkJCWJyZWFrOwotCi0JCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCi0JCQkiJXM6IGlwb3J0ICVwLCBpdGVyYXRpb24gJWQsIgotCQkJIiBwaGFzZSAlZDogdGltZV9yZW1haW5pbmcgJWx1LCBiY25zID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgaXBvcnQsIGl0ZXJhdGlvbiwgcGh5X3N0YXRlLAotCQkJdG1vLCB0ZXN0X2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncykpOwotCi0JCXJlcyA9IGlzY2lfc21wX2dldF9waHlfYXR0YWNoZWRfZGV2X3R5cGUoaWhvc3QsIGRldiwgcGh5X251bSwKLQkJCQkJCQkgJmF0dGFjaGVkX2RldmljZV90eXBlKTsKLQkJdG1vID0gZGVhZGxpbmUgLSBqaWZmaWVzOwotCi0JCWlmIChyZXMpIHsKLQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCi0JCQkJICIlczogaXRlcmF0aW9uICVkLCBwaGFzZSAlZDoiCi0JCQkJICIgU01QIGVycm9yPSVkLCB0aW1lX3JlbWFpbmluZz0lbHVcbiIsCi0JCQkJIF9fZnVuY19fLCBpdGVyYXRpb24sIHBoeV9zdGF0ZSwgcmVzLCB0bW8pOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKLQkJCSIlczogaXBvcnQgJXAsIGl0ZXJhdGlvbiAlZCwiCi0JCQkiIHBoYXNlICVkOiB0aW1lX3JlbWFpbmluZyAlbHUsIGJjbnMgPSAlZCwgIgotCQkJImF0dGRldnR5cGUgPSAleFxuIiwKLQkJCV9fZnVuY19fLCBpcG9ydCwgaXRlcmF0aW9uLCBwaHlfc3RhdGUsCi0JCQl0bW8sIHRlc3RfYml0KElQT1JUX0JDTl9QRU5ESU5HLCAmaXBvcnQtPmZsYWdzKSwKLQkJCWF0dGFjaGVkX2RldmljZV90eXBlKTsKLQotCQlzd2l0Y2ggKHBoeV9zdGF0ZSkgewotCQljYXNlIFNNUF9QSFlXQUlUX1BIWURPV046Ci0JCQkvKiBIYXMgdGhlIGRldmljZSBnb25lIGF3YXk/ICovCi0JCQlpZiAoIWF0dGFjaGVkX2RldmljZV90eXBlKQotCQkJCXBoeV9zdGF0ZSA9IFNNUF9QSFlXQUlUX1BIWVVQOwotCi0JCQlicmVhazsKLQotCQljYXNlIFNNUF9QSFlXQUlUX1BIWVVQOgotCQkJLyogSGFzIHRoZSBkZXZpY2UgY29tZSBiYWNrPyAqLwotCQkJaWYgKGF0dGFjaGVkX2RldmljZV90eXBlKQotCQkJCXBoeV9zdGF0ZSA9IFNNUF9QSFlXQUlUX0RPTkU7Ci0JCQlicmVhazsKLQotCQljYXNlIFNNUF9QSFlXQUlUX0RPTkU6Ci0JCQlicmVhazsKLQkJfQotCi0JfQotCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogZG9uZVxuIiwgIF9fZnVuY19fKTsKKwlpZiAodG1mX2NvbXBsZXRlKQorCQljb21wbGV0ZSh0bWZfY29tcGxldGUpOwogfQogCiBzdGF0aWMgaW50IGlzY2lfcmVzZXRfZGV2aWNlKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAogCQkJICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KQogewogCXN0cnVjdCBzYXNfcGh5ICpwaHkgPSBzYXNfZmluZF9sb2NhbF9waHkoaWRldi0+ZG9tYWluX2Rldik7Ci0Jc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQgPSBpZGV2LT5pc2NpX3BvcnQ7CiAJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKQEAgLTE1ODcsMTMgKzEzNTQsNiBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CiAKLQkvKiBNYWtlIHN1cmUgYWxsIHBlbmRpbmcgcmVxdWVzdHMgYXJlIGFibGUgdG8gYmUgZnVsbHkgdGVybWluYXRlZC4gKi8KLQlpc2NpX2RldmljZV9jbGVhcl9yZXNldF9wZW5kaW5nKGlob3N0LCBpZGV2KTsKLQotCS8qIElmIHRoaXMgaXMgYSBkZXZpY2Ugb24gYW4gZXhwYW5kZXIsIGRpc2FibGUgQkNOIHByb2Nlc3NpbmcuICovCi0JaWYgKCFzY3NpX2lzX3Nhc19waHlfbG9jYWwocGh5KSkKLQkJc2V0X2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncyk7Ci0KIAlyYyA9IHNhc19waHlfcmVzZXQocGh5LCB0cnVlKTsKIAogCS8qIFRlcm1pbmF0ZSBpbi1wcm9ncmVzcyBJL08gbm93LiAqLwpAQCAtMTYwNCwyMSArMTM2NCw2IEBACiAJc3RhdHVzID0gc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXRfY29tcGxldGUoaWRldik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwogCi0JLyogSWYgdGhpcyBpcyBhIGRldmljZSBvbiBhbiBleHBhbmRlciwgYnJpbmcgdGhlIHBoeSBiYWNrIHVwLiAqLwotCWlmICghc2NzaV9pc19zYXNfcGh5X2xvY2FsKHBoeSkpIHsKLQkJLyogQSBwaHkgcmVzZXQgd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvIGdvIGF3YXkgdGhlbiByZWFwcGVhci4KLQkJICogU2luY2UgbGlic2FzIHdpbGwgdGFrZSBhY3Rpb24gb24gaW5jb21pbmcgQkNOcyAoZWcuIHJlbW92ZQotCQkgKiBhIGRldmljZSBnb2luZyB0aHJvdWdoIGFuIFNNUCBwaHktY29udHJvbCBkcml2ZW4gcmVzZXQpLAotCQkgKiB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIHBoeSBjb21lcyBiYWNrIHVwIGJlZm9yZSBsZXR0aW5nCi0JCSAqIGRpc2NvdmVyeSBwcm9jZWVkIGluIGxpYnNhcy4KLQkJICovCi0JCWlzY2lfd2FpdF9mb3Jfc21wX3BoeV9yZXNldChpZGV2LCBwaHktPm51bWJlcik7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKLQkJaXNjaV9wb3J0X2Jjbl9lbmFibGUoaWhvc3QsIGlkZXYtPmlzY2lfcG9ydCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKLQl9Ci0KIAlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CiAJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCiAJCQkgIiVzOiBzY2lfcmVtb3RlX2RldmljZV9yZXNldF9jb21wbGV0ZSglcCkgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5oIGIvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5oCmluZGV4IDRhN2ZhOTAuLmJjNzhjMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suaAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS90YXNrLmgKQEAgLTU4LDYgKzU4LDggQEAKICNpbmNsdWRlIDxzY3NpL3Nhc19hdGEuaD4KICNpbmNsdWRlICJob3N0LmgiCiAKKyNkZWZpbmUgSVNDSV9URVJNSU5BVElPTl9USU1FT1VUX01TRUMgNTAwCisKIHN0cnVjdCBpc2NpX3JlcXVlc3Q7CiAKIC8qKgpAQCAtMjI0LDM1ICsyMjYsNiBAQAogCWlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uICAgICAgICAvKiBVc2Ugc2FzX3Rhc2tfYWJvcnQgKi8KIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpc2NpX3NldF90YXNrX2RvbmVmbGFncygKLQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCi17Ci0JLyogU2luY2Ugbm8gZnV0aGVyIGFjdGlvbiB3aWxsIGJlIHRha2VuIG9uIHRoaXMgdGFzaywKLQkgKiBtYWtlIHN1cmUgdG8gbWFyayBpdCBjb21wbGV0ZSBmcm9tIHRoZSBsbGRkIHBlcnNwZWN0aXZlLgotCSAqLwotCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfU1RBVEVfRE9ORTsKLQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19BVF9JTklUSUFUT1I7Ci0JdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfU1RBVEVfUEVORElORzsKLX0KLS8qKgotICogaXNjaV90YXNrX2FsbF9kb25lKCkgLSBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgdGFzayBiaXRzIHRvIGluZGljYXRlIHRoZQotICogICAgTExERCBpcyBkb25lIHdpdGggdGhlIHRhc2suCi0gKgotICoKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGlzY2lfdGFza19hbGxfZG9uZSgKLQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIFNpbmNlIG5vIGZ1dGhlciBhY3Rpb24gd2lsbCBiZSB0YWtlbiBvbiB0aGlzIHRhc2ssCi0JICogbWFrZSBzdXJlIHRvIG1hcmsgaXQgY29tcGxldGUgZnJvbSB0aGUgbGxkZCBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JaXNjaV9zZXRfdGFza19kb25lZmxhZ3ModGFzayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci19Ci0KIC8qKgogICogaXNjaV90YXNrX3NldF9jb21wbGV0aW9uX3N0YXR1cygpIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBjb21wbGV0aW9uIHN0YXR1cwogICogICAgZm9yIHRoZSByZXF1ZXN0LgpAQCAtMjg2LDYgKzI1OSwyNSBAQAogCXRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPSByZXNwb25zZTsKIAl0YXNrLT50YXNrX3N0YXR1cy5zdGF0ID0gc3RhdHVzOwogCisJc3dpdGNoICh0YXNrLT50YXNrX3Byb3RvKSB7CisKKwljYXNlIFNBU19QUk9UT0NPTF9TQVRBOgorCWNhc2UgU0FTX1BST1RPQ09MX1NUUDoKKwljYXNlIFNBU19QUk9UT0NPTF9TQVRBIHwgU0FTX1BST1RPQ09MX1NUUDoKKworCQlpZiAodGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uCisJCSAgICA9PSBpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbikgeworCQkJLyogU0FUQS9TVFAgSS9PIGhhcyBpdCdzIG93biBtZWFucyBvZiBzY2hlZHVsaW5nIGRldmljZQorCQkJKiBlcnJvciBoYW5kbGluZyBvbiB0aGUgbm9ybWFsIHBhdGguCisJCQkqLworCQkJdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uCisJCQkJPSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb247CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCiAJc3dpdGNoICh0YXNrX25vdGlmaWNhdGlvbl9zZWxlY3Rpb24pIHsKIAogCWNhc2UgaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb246CkBAIC0zMTUsNyArMzA3LDkgQEAKIAkJLyogRmFsbCB0aHJvdWdoIHRvIHRoZSBub3JtYWwgY2FzZS4uLiAqLwogCWNhc2UgaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOgogCQkvKiBOb3JtYWwgbm90aWZpY2F0aW9uICh0YXNrX2RvbmUpICovCi0JCWlzY2lfc2V0X3Rhc2tfZG9uZWZsYWdzKHRhc2spOworCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX1NUQVRFX0RPTkU7CisJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gfihTQVNfVEFTS19BVF9JTklUSUFUT1IgfAorCQkJCQkgICAgU0FTX1RBU0tfU1RBVEVfUEVORElORyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT05DRSgxLCAidW5rbm93biB0YXNrX25vdGlmaWNhdGlvbl9zZWxlY3Rpb246ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCmluZGV4IDc3MjQ0MTQuLjdjMzRkOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CkBAIC04NzIsNiArODczLDYxIEBACiAJaXNjc2lfaG9zdF9mcmVlKHNob3N0KTsKIH0KIAorc3RhdGljIG1vZGVfdCBpc2NzaV9zd190Y3BfYXR0cl9pc192aXNpYmxlKGludCBwYXJhbV90eXBlLCBpbnQgcGFyYW0pCit7CisJc3dpdGNoIChwYXJhbV90eXBlKSB7CisJY2FzZSBJU0NTSV9IT1NUX1BBUkFNOgorCQlzd2l0Y2ggKHBhcmFtKSB7CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9ORVRERVZfTkFNRToKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lOSVRJQVRPUl9OQU1FOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgSVNDU0lfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUkVDVl9ETEVOR1RIOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9YTUlUX0RMRU5HVEg6CisJCWNhc2UgSVNDU0lfUEFSQU1fSERSREdTVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9EQVRBREdTVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9DT05OX0FERFJFU1M6CisJCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX0VYUF9TVEFUU046CisJCWNhc2UgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9BRERSRVNTOgorCQljYXNlIElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfUE9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QSU5HX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9SRUNWX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFMX1IyVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUjJUOgorCQljYXNlIElTQ1NJX1BBUkFNX0lNTV9EQVRBX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0ZJUlNUX0JVUlNUOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9CVVJTVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRFVfSU5PUkRFUl9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9EQVRBU0VRX0lOT1JERVJfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRVJMOgorCQljYXNlIElTQ1NJX1BBUkFNX1RBUkdFVF9OQU1FOgorCQljYXNlIElTQ1NJX1BBUkFNX1RQR1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fVVNFUk5BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fUEFTU1dPUkQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fVVNFUk5BTUVfSU46CisJCWNhc2UgSVNDU0lfUEFSQU1fUEFTU1dPUkRfSU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRkFTVF9BQk9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9BQk9SVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fTFVfUkVTRVRfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX1RHVF9SRVNFVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fSUZBQ0VfTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFUT1JfTkFNRToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBpc2NzaV9zd190Y3Bfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewogCXNldF9iaXQoUVVFVUVfRkxBR19CSURJLCAmc2Rldi0+cmVxdWVzdF9xdWV1ZS0+cXVldWVfZmxhZ3MpOwpAQCAtOTEwLDMzICs5NjYsNiBAQAogCS5uYW1lCQkJPSAidGNwIiwKIAkuY2FwcwkJCT0gQ0FQX1JFQ09WRVJZX0wwIHwgQ0FQX01VTFRJX1IyVCB8IENBUF9IRFJER1NUCiAJCQkJICB8IENBUF9EQVRBREdTVCwKLQkucGFyYW1fbWFzawkJPSBJU0NTSV9NQVhfUkVDVl9ETEVOR1RIIHwKLQkJCQkgIElTQ1NJX01BWF9YTUlUX0RMRU5HVEggfAotCQkJCSAgSVNDU0lfSERSREdTVF9FTiB8Ci0JCQkJICBJU0NTSV9EQVRBREdTVF9FTiB8Ci0JCQkJICBJU0NTSV9JTklUSUFMX1IyVF9FTiB8Ci0JCQkJICBJU0NTSV9NQVhfUjJUIHwKLQkJCQkgIElTQ1NJX0lNTV9EQVRBX0VOIHwKLQkJCQkgIElTQ1NJX0ZJUlNUX0JVUlNUIHwKLQkJCQkgIElTQ1NJX01BWF9CVVJTVCB8Ci0JCQkJICBJU0NTSV9QRFVfSU5PUkRFUl9FTiB8Ci0JCQkJICBJU0NTSV9EQVRBU0VRX0lOT1JERVJfRU4gfAotCQkJCSAgSVNDU0lfRVJMIHwKLQkJCQkgIElTQ1NJX0NPTk5fUE9SVCB8Ci0JCQkJICBJU0NTSV9DT05OX0FERFJFU1MgfAotCQkJCSAgSVNDU0lfRVhQX1NUQVRTTiB8Ci0JCQkJICBJU0NTSV9QRVJTSVNURU5UX1BPUlQgfAotCQkJCSAgSVNDU0lfUEVSU0lTVEVOVF9BRERSRVNTIHwKLQkJCQkgIElTQ1NJX1RBUkdFVF9OQU1FIHwgSVNDU0lfVFBHVCB8Ci0JCQkJICBJU0NTSV9VU0VSTkFNRSB8IElTQ1NJX1BBU1NXT1JEIHwKLQkJCQkgIElTQ1NJX1VTRVJOQU1FX0lOIHwgSVNDU0lfUEFTU1dPUkRfSU4gfAotCQkJCSAgSVNDU0lfRkFTVF9BQk9SVCB8IElTQ1NJX0FCT1JUX1RNTyB8Ci0JCQkJICBJU0NTSV9MVV9SRVNFVF9UTU8gfCBJU0NTSV9UR1RfUkVTRVRfVE1PIHwKLQkJCQkgIElTQ1NJX1BJTkdfVE1PIHwgSVNDU0lfUkVDVl9UTU8gfAotCQkJCSAgSVNDU0lfSUZBQ0VfTkFNRSB8IElTQ1NJX0lOSVRJQVRPUl9OQU1FLAotCS5ob3N0X3BhcmFtX21hc2sJPSBJU0NTSV9IT1NUX0hXQUREUkVTUyB8IElTQ1NJX0hPU1RfSVBBRERSRVNTIHwKLQkJCQkgIElTQ1NJX0hPU1RfSU5JVElBVE9SX05BTUUgfAotCQkJCSAgSVNDU0lfSE9TVF9ORVRERVZfTkFNRSwKIAkvKiBzZXNzaW9uIG1hbmFnZW1lbnQgKi8KIAkuY3JlYXRlX3Nlc3Npb24JCT0gaXNjc2lfc3dfdGNwX3Nlc3Npb25fY3JlYXRlLAogCS5kZXN0cm95X3Nlc3Npb24JPSBpc2NzaV9zd190Y3Bfc2Vzc2lvbl9kZXN0cm95LApAQCAtOTQ0LDYgKzk3Myw3IEBACiAJLmNyZWF0ZV9jb25uCQk9IGlzY3NpX3N3X3RjcF9jb25uX2NyZWF0ZSwKIAkuYmluZF9jb25uCQk9IGlzY3NpX3N3X3RjcF9jb25uX2JpbmQsCiAJLmRlc3Ryb3lfY29ubgkJPSBpc2NzaV9zd190Y3BfY29ubl9kZXN0cm95LAorCS5hdHRyX2lzX3Zpc2libGUJPSBpc2NzaV9zd190Y3BfYXR0cl9pc192aXNpYmxlLAogCS5zZXRfcGFyYW0JCT0gaXNjc2lfc3dfdGNwX2Nvbm5fc2V0X3BhcmFtLAogCS5nZXRfY29ubl9wYXJhbQkJPSBpc2NzaV9zd190Y3BfY29ubl9nZXRfcGFyYW0sCiAJLmdldF9zZXNzaW9uX3BhcmFtCT0gaXNjc2lfc2Vzc2lvbl9nZXRfcGFyYW0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Rpc2MuYwppbmRleCBiOWNiODE0Li43MjY5ZTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZGlzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19kaXNjLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2dzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZWxzY3QuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19lbHNjdC5jCmluZGV4IDliMjU5NjkuLmZiOTE2MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19lbHNjdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19lbHNjdC5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKiBQcm92aWRlIGludGVyZmFjZSB0byBzZW5kIEVMUy9DVCBGQyBmcmFtZXMKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPHNjc2kvZmMvZmNfZ3MuaD4KICNpbmNsdWRlIDxzY3NpL2ZjL2ZjX25zLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYwppbmRleCBkMjYxZTk4Li45ZGU5ZGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHNjc2kvZmMvZmNfZmMyLmg+CiAKQEAgLTY1LDE2ICs2NiwxNSBAQAogICogYXNzaWduZWQgcmFuZ2Ugb2YgZXhjaGFuZ2VzIHRvIHBlciBjcHUgcG9vbC4KICAqLwogc3RydWN0IGZjX2V4Y2hfcG9vbCB7CisJc3BpbmxvY2tfdAkgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGV4X2xpc3Q7CiAJdTE2CQkgbmV4dF9pbmRleDsKIAl1MTYJCSB0b3RhbF9leGNoZXM7CiAKIAkvKiB0d28gY2FjaGUgb2YgZnJlZSBzbG90IGluIGV4Y2ggYXJyYXkgKi8KIAl1MTYJCSBsZWZ0OwogCXUxNgkJIHJpZ2h0OwotCi0Jc3BpbmxvY2tfdAkgbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV4X2xpc3Q7Ci19OworfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiAvKioKICAqIHN0cnVjdCBmY19leGNoX21nciAtIFRoZSBFeGNoYW5nZSBNYW5hZ2VyIChFTSkuCkBAIC05MSwxMyArOTEsMTMgQEAKICAqIEl0IG1hbmFnZXMgdGhlIGFsbG9jYXRpb24gb2YgZXhjaGFuZ2UgSURzLgogICovCiBzdHJ1Y3QgZmNfZXhjaF9tZ3IgeworCXN0cnVjdCBmY19leGNoX3Bvb2wgKnBvb2w7CisJbWVtcG9vbF90CSplcF9wb29sOwogCWVudW0gZmNfY2xhc3MJY2xhc3M7CiAJc3RydWN0IGtyZWYJa3JlZjsKIAl1MTYJCW1pbl94aWQ7CiAJdTE2CQltYXhfeGlkOwotCW1lbXBvb2xfdAkqZXBfcG9vbDsKIAl1MTYJCXBvb2xfbWF4X2luZGV4OwotCXN0cnVjdCBmY19leGNoX3Bvb2wgKnBvb2w7CiAKIAkvKgogCSAqIGN1cnJlbnRseSBleGNoYW5nZSBtZ3Igc3RhdHMgYXJlIHVwZGF0ZWQgYnV0IG5vdCB1c2VkLgpAQCAtNDcwLDYgKzQ3MCw3IEBACiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKIAlpbnQgZXJyb3I7CiAJdTMyIGZfY3RsOworCXU4IGZoX3R5cGUgPSBmaC0+ZmhfdHlwZTsKIAogCWVwID0gZmNfc2VxX2V4Y2goc3ApOwogCVdBUk5fT04oKGVwLT5lc2Jfc3RhdCAmIEVTQl9TVF9TRVFfSU5JVCkgIT0gRVNCX1NUX1NFUV9JTklUKTsKQEAgLTQ5NCw3ICs0OTUsNyBAQAogCSAqLwogCWVycm9yID0gbHBvcnQtPnR0LmZyYW1lX3NlbmQobHBvcnQsIGZwKTsKIAotCWlmIChmaC0+ZmhfdHlwZSA9PSBGQ19UWVBFX0JMUykKKwlpZiAoZmhfdHlwZSA9PSBGQ19UWVBFX0JMUykKIAkJcmV0dXJuIGVycm9yOwogCiAJLyoKQEAgLTE3OTMsNiArMTc5NCw5IEBACiAJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KIAl9CisJcG9vbC0+bmV4dF9pbmRleCA9IDA7CisJcG9vbC0+bGVmdCA9IEZDX1hJRF9VTktOT1dOOworCXBvb2wtPnJpZ2h0ID0gRkNfWElEX1VOS05PV047CiAJc3Bpbl91bmxvY2tfYmgoJnBvb2wtPmxvY2spOwogfQogCkBAIC0yMjgxLDYgKzIyODUsNyBAQAogCQlnb3RvIGZyZWVfbWVtcG9vbDsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCXBvb2wgPSBwZXJfY3B1X3B0cihtcC0+cG9vbCwgY3B1KTsKKwkJcG9vbC0+bmV4dF9pbmRleCA9IDA7CiAJCXBvb2wtPmxlZnQgPSBGQ19YSURfVU5LTk9XTjsKIAkJcG9vbC0+cmlnaHQgPSBGQ19YSURfVU5LTk9XTjsKIAkJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jCmluZGV4IDRjNDFlZTguLjIyMTg3NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMKQEAgLTc1OSw3ICs3NTksNiBAQAogCQlnb3RvIG91dDsKIAlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCiAJCWdvdG8gb3V0OwotCWZzcC0+bGFzdF9wa3RfdGltZSA9IGppZmZpZXM7CiAKIAlpZiAoZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9CTFMpIHsKIAkJZmNfZmNwX2FidHNfcmVzcChmc3AsIGZwKTsKQEAgLTExNDgsNyArMTE0Nyw2IEBACiAJCXJjID0gLTE7CiAJCWdvdG8gdW5sb2NrOwogCX0KLQlmc3AtPmxhc3RfcGt0X3RpbWUgPSBqaWZmaWVzOwogCWZzcC0+c2VxX3B0ciA9IHNlcTsKIAlmY19mY3BfcGt0X2hvbGQoZnNwKTsJLyogaG9sZCBmb3IgZmNfZmNwX3BrdF9kZXN0cm95ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19saWJmYy5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmMKaW5kZXggYjc3MzUxMi4uMWJmOTg0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xpYmZjLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KICNpbmNsdWRlIDxzY3NpL2ZjX2VuY29kZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYwppbmRleCA2MjhmMzQ3Li5lNzcwOTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYwpAQCAtODksNiArODksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKQEAgLTEwMzAsMTYgKzEwMzEsOCBAQAogCQkJICAgRkNIX0VWVF9MSVBSRVNFVCwgMCk7CiAJZmNfdnBvcnRzX2xpbmtjaGFuZ2UobHBvcnQpOwogCWZjX2xwb3J0X3Jlc2V0X2xvY2tlZChscG9ydCk7Ci0JaWYgKGxwb3J0LT5saW5rX3VwKSB7Ci0JCS8qCi0JCSAqIFdhaXQgdXB0byByZXNvdXJjZSBhbGxvY2F0aW9uIHRpbWUgb3V0IGJlZm9yZQotCQkgKiBkb2luZyByZS1sb2dpbiBzaW5jZSBpbmNvbXBsZXRlIEZJUCBleGNoYW5nZWQKLQkJICogZnJvbSBsYXN0IHNlc3Npb24gbWF5IGNvbGxpZGUgd2l0aCBleGNoYW5nZXMKLQkJICogaW4gbmV3IHNlc3Npb24uCi0JCSAqLwotCQltc2xlZXAobHBvcnQtPnJfYV90b3YpOworCWlmIChscG9ydC0+bGlua191cCkKIAkJZmNfbHBvcnRfZW50ZXJfZmxvZ2kobHBvcnQpOwotCX0KIH0KIAogLyoqCkBAIC0xNDgxLDYgKzE0NzQsNyBAQAogCQkJIHZvaWQgKmxwX2FyZykKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gbHBfYXJnOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwogCXN0cnVjdCBmY19lbHNfZmxvZ2kgKmZscDsKIAl1MzIgZGlkOwogCXUxNiBjc3BfZmxhZ3M7CkBAIC0xNTA4LDQ5ICsxNTAyLDU2IEBACiAJCWdvdG8gZXJyOwogCX0KIAorCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CiAJZGlkID0gZmNfZnJhbWVfZGlkKGZwKTsKLQlpZiAoZmNfZnJhbWVfcGF5bG9hZF9vcChmcCkgPT0gRUxTX0xTX0FDQyAmJiBkaWQpIHsKLQkJZmxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmxwKSk7Ci0JCWlmIChmbHApIHsKLQkJCW1mcyA9IG50b2hzKGZscC0+ZmxfY3NwLnNwX2JiX2RhdGEpICYKLQkJCQlGQ19TUF9CQl9EQVRBX01BU0s7Ci0JCQlpZiAobWZzID49IEZDX1NQX01JTl9NQVhfUEFZTE9BRCAmJgotCQkJICAgIG1mcyA8IGxwb3J0LT5tZnMpCi0JCQkJbHBvcnQtPm1mcyA9IG1mczsKLQkJCWNzcF9mbGFncyA9IG50b2hzKGZscC0+ZmxfY3NwLnNwX2ZlYXR1cmVzKTsKLQkJCXJfYV90b3YgPSBudG9obChmbHAtPmZsX2NzcC5zcF9yX2FfdG92KTsKLQkJCWVfZF90b3YgPSBudG9obChmbHAtPmZsX2NzcC5zcF9lX2RfdG92KTsKLQkJCWlmIChjc3BfZmxhZ3MgJiBGQ19TUF9GVF9FRFRSKQotCQkJCWVfZF90b3YgLz0gMTAwMDAwMDsKLQotCQkJbHBvcnQtPm5waXZfZW5hYmxlZCA9ICEhKGNzcF9mbGFncyAmIEZDX1NQX0ZUX05QSVZfQUNDKTsKLQotCQkJaWYgKChjc3BfZmxhZ3MgJiBGQ19TUF9GVF9GUE9SVCkgPT0gMCkgewotCQkJCWlmIChlX2RfdG92ID4gbHBvcnQtPmVfZF90b3YpCi0JCQkJCWxwb3J0LT5lX2RfdG92ID0gZV9kX3RvdjsKLQkJCQlscG9ydC0+cl9hX3RvdiA9IDIgKiBlX2RfdG92OwotCQkJCWZjX2xwb3J0X3NldF9wb3J0X2lkKGxwb3J0LCBkaWQsIGZwKTsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJob3N0JWQ6IGxpYmZjOiAiCi0JCQkJICAgICAgICJQb3J0ICglNi42eCkgZW50ZXJlZCAiCi0JCQkJICAgICAgICJwb2ludC10by1wb2ludCBtb2RlXG4iLAotCQkJCSAgICAgICBscG9ydC0+aG9zdC0+aG9zdF9ubywgZGlkKTsKLQkJCQlmY19scG9ydF9wdHBfc2V0dXAobHBvcnQsIGZjX2ZyYW1lX3NpZChmcCksCi0JCQkJCQkgICBnZXRfdW5hbGlnbmVkX2JlNjQoCi0JCQkJCQkJICAgJmZscC0+Zmxfd3dwbiksCi0JCQkJCQkgICBnZXRfdW5hbGlnbmVkX2JlNjQoCi0JCQkJCQkJICAgJmZscC0+Zmxfd3dubikpOwotCQkJfSBlbHNlIHsKLQkJCQlscG9ydC0+ZV9kX3RvdiA9IGVfZF90b3Y7Ci0JCQkJbHBvcnQtPnJfYV90b3YgPSByX2FfdG92OwotCQkJCWZjX2hvc3RfZmFicmljX25hbWUobHBvcnQtPmhvc3QpID0KLQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTY0KCZmbHAtPmZsX3d3bm4pOwotCQkJCWZjX2xwb3J0X3NldF9wb3J0X2lkKGxwb3J0LCBkaWQsIGZwKTsKLQkJCQlmY19scG9ydF9lbnRlcl9kbnMobHBvcnQpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJRkNfTFBPUlRfREJHKGxwb3J0LCAiRkxPR0kgUkpUIG9yIGJhZCByZXNwb25zZVxuIik7CisJaWYgKGZoLT5maF9yX2N0bCAhPSBGQ19SQ1RMX0VMU19SRVAgfHwgZGlkID09IDAgfHwKKwkgICAgZmNfZnJhbWVfcGF5bG9hZF9vcChmcCkgIT0gRUxTX0xTX0FDQykgeworCQlGQ19MUE9SVF9EQkcobHBvcnQsICJGTE9HSSBub3QgYWNjZXB0ZWQgb3IgYmFkIHJlc3BvbnNlXG4iKTsKIAkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwkJZ290byBlcnI7CisJfQorCisJZmxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmxwKSk7CisJaWYgKCFmbHApIHsKKwkJRkNfTFBPUlRfREJHKGxwb3J0LCAiRkxPR0kgYmFkIHJlc3BvbnNlXG4iKTsKKwkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwkJZ290byBlcnI7CisJfQorCisJbWZzID0gbnRvaHMoZmxwLT5mbF9jc3Auc3BfYmJfZGF0YSkgJgorCQlGQ19TUF9CQl9EQVRBX01BU0s7CisJaWYgKG1mcyA+PSBGQ19TUF9NSU5fTUFYX1BBWUxPQUQgJiYKKwkgICAgbWZzIDwgbHBvcnQtPm1mcykKKwkJbHBvcnQtPm1mcyA9IG1mczsKKwljc3BfZmxhZ3MgPSBudG9ocyhmbHAtPmZsX2NzcC5zcF9mZWF0dXJlcyk7CisJcl9hX3RvdiA9IG50b2hsKGZscC0+ZmxfY3NwLnNwX3JfYV90b3YpOworCWVfZF90b3YgPSBudG9obChmbHAtPmZsX2NzcC5zcF9lX2RfdG92KTsKKwlpZiAoY3NwX2ZsYWdzICYgRkNfU1BfRlRfRURUUikKKwkJZV9kX3RvdiAvPSAxMDAwMDAwOworCisJbHBvcnQtPm5waXZfZW5hYmxlZCA9ICEhKGNzcF9mbGFncyAmIEZDX1NQX0ZUX05QSVZfQUNDKTsKKworCWlmICgoY3NwX2ZsYWdzICYgRkNfU1BfRlRfRlBPUlQpID09IDApIHsKKwkJaWYgKGVfZF90b3YgPiBscG9ydC0+ZV9kX3RvdikKKwkJCWxwb3J0LT5lX2RfdG92ID0gZV9kX3RvdjsKKwkJbHBvcnQtPnJfYV90b3YgPSAyICogZV9kX3RvdjsKKwkJZmNfbHBvcnRfc2V0X3BvcnRfaWQobHBvcnQsIGRpZCwgZnApOworCQlwcmludGsoS0VSTl9JTkZPICJob3N0JWQ6IGxpYmZjOiAiCisJCSAgICAgICAiUG9ydCAoJTYuNngpIGVudGVyZWQgIgorCQkgICAgICAgInBvaW50LXRvLXBvaW50IG1vZGVcbiIsCisJCSAgICAgICBscG9ydC0+aG9zdC0+aG9zdF9ubywgZGlkKTsKKwkJZmNfbHBvcnRfcHRwX3NldHVwKGxwb3J0LCBmY19mcmFtZV9zaWQoZnApLAorCQkJCSAgIGdldF91bmFsaWduZWRfYmU2NCgKKwkJCQkJICAgJmZscC0+Zmxfd3dwbiksCisJCQkJICAgZ2V0X3VuYWxpZ25lZF9iZTY0KAorCQkJCQkgICAmZmxwLT5mbF93d25uKSk7CisJfSBlbHNlIHsKKwkJbHBvcnQtPmVfZF90b3YgPSBlX2RfdG92OworCQlscG9ydC0+cl9hX3RvdiA9IHJfYV90b3Y7CisJCWZjX2hvc3RfZmFicmljX25hbWUobHBvcnQtPmhvc3QpID0KKwkJCWdldF91bmFsaWduZWRfYmU2NCgmZmxwLT5mbF93d25uKTsKKwkJZmNfbHBvcnRfc2V0X3BvcnRfaWQobHBvcnQsIGRpZCwgZnApOworCQlmY19scG9ydF9lbnRlcl9kbnMobHBvcnQpOwogCX0KIAogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX25waXYuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ucGl2LmMKaW5kZXggZjMzYjg5Ny4uOWZiZjc4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX25waXYuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbnBpdi5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyoqCiAgKiBmY192cG9ydF9jcmVhdGUoKSAtIENyZWF0ZSBhIG5ldyBOUElWIHZwb3J0IGluc3RhbmNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfcnBvcnQuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ycG9ydC5jCmluZGV4IDc2MGRiNzYuLmI5ZTQzNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ycG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ycG9ydC5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKaW5kZXggMjU2YTk5OS4uMTQzYmJlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgpAQCAtMzE2Myw3ICszMTY0LDYgQEAKIHsKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOwogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKLQl1aW50MzJfdCB2YWx1ZTsKIAogCXN3aXRjaChwYXJhbSkgewogCWNhc2UgSVNDU0lfUEFSQU1fRkFTVF9BQk9SVDoKQEAgLTMyMjAsMTQgKzMyMjAsNiBAQAogCWNhc2UgSVNDU0lfUEFSQU1fRVJMOgogCQlzc2NhbmYoYnVmLCAiJWQiLCAmc2Vzc2lvbi0+ZXJsKTsKIAkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9QQVJBTV9JRk1BUktFUl9FTjoKLQkJc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbHVlKTsKLQkJQlVHX09OKHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9QQVJBTV9PRk1BUktFUl9FTjoKLQkJc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbHVlKTsKLQkJQlVHX09OKHZhbHVlKTsKLQkJYnJlYWs7CiAJY2FzZSBJU0NTSV9QQVJBTV9FWFBfU1RBVFNOOgogCQlzc2NhbmYoYnVmLCAiJXUiLCAmY29ubi0+ZXhwX3N0YXRzbik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCmluZGV4IDA5YjIzMmZkLi41NzE1YTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliaXNjc2lfdGNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZGlzY292ZXIuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMKaW5kZXggZjU4MzE5My4uNTRhNTE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZGlzY292ZXIuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kaXNjb3Zlci5jCkBAIC0yMTksMTcgKzIxOSwyMCBAQAogCiAvKiAtLS0tLS0tLS0tIERldmljZSByZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uIC0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHNhc191bnJlZ2lzdGVyX2NvbW1vbl9kZXYoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHNhc191bnJlZ2lzdGVyX2NvbW1vbl9kZXYoc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCwgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKIHsKIAlzYXNfbm90aWZ5X2xsZGRfZGV2X2dvbmUoZGV2KTsKIAlpZiAoIWRldi0+cGFyZW50KQogCQlkZXYtPnBvcnQtPnBvcnRfZGV2ID0gTlVMTDsKIAllbHNlCiAJCWxpc3RfZGVsX2luaXQoJmRldi0+c2libGluZ3MpOworCisJc3Bpbl9sb2NrX2lycSgmcG9ydC0+ZGV2X2xpc3RfbG9jayk7CiAJbGlzdF9kZWxfaW5pdCgmZGV2LT5kZXZfbGlzdF9ub2RlKTsKKwlzcGluX3VubG9ja19pcnEoJnBvcnQtPmRldl9saXN0X2xvY2spOwogfQogCi12b2lkIHNhc191bnJlZ2lzdGVyX2RldihzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQordm9pZCBzYXNfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCwgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKIHsKIAlpZiAoZGV2LT5ycGh5KSB7CiAJCXNhc19yZW1vdmVfY2hpbGRyZW4oJmRldi0+cnBoeS0+ZGV2KTsKQEAgLTI0MSwxNSArMjQ0LDE1IEBACiAJCWtmcmVlKGRldi0+ZXhfZGV2LmV4X3BoeSk7CiAJCWRldi0+ZXhfZGV2LmV4X3BoeSA9IE5VTEw7CiAJfQotCXNhc191bnJlZ2lzdGVyX2NvbW1vbl9kZXYoZGV2KTsKKwlzYXNfdW5yZWdpc3Rlcl9jb21tb25fZGV2KHBvcnQsIGRldik7CiB9CiAKIHZvaWQgc2FzX3VucmVnaXN0ZXJfZG9tYWluX2RldmljZXMoc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCAqbjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGRldixuLCZwb3J0LT5kZXZfbGlzdCxkZXZfbGlzdF9ub2RlKQotCQlzYXNfdW5yZWdpc3Rlcl9kZXYoZGV2KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShkZXYsIG4sICZwb3J0LT5kZXZfbGlzdCwgZGV2X2xpc3Rfbm9kZSkKKwkJc2FzX3VucmVnaXN0ZXJfZGV2KHBvcnQsIGRldik7CiAKIAlwb3J0LT5wb3J0LT5ycGh5ID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKaW5kZXggMTZhZDk3ZC4uMWI4MzFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCkBAIC0xOTksNiArMTk5LDggQEAKIAlwaHktPnZpcnR1YWwgPSBkci0+dmlydHVhbDsKIAlwaHktPmxhc3RfZGFfaW5kZXggPSAtMTsKIAorCXBoeS0+cGh5LT5pZGVudGlmeS5zYXNfYWRkcmVzcyA9IFNBU19BRERSKHBoeS0+YXR0YWNoZWRfc2FzX2FkZHIpOworCXBoeS0+cGh5LT5pZGVudGlmeS5kZXZpY2VfdHlwZSA9IHBoeS0+YXR0YWNoZWRfZGV2X3R5cGU7CiAJcGh5LT5waHktPmlkZW50aWZ5LmluaXRpYXRvcl9wb3J0X3Byb3RvY29scyA9IHBoeS0+YXR0YWNoZWRfaXByb3RvOwogCXBoeS0+cGh5LT5pZGVudGlmeS50YXJnZXRfcG9ydF9wcm90b2NvbHMgPSBwaHktPmF0dGFjaGVkX3Rwcm90bzsKIAlwaHktPnBoeS0+aWRlbnRpZnkucGh5X2lkZW50aWZpZXIgPSBwaHlfaWQ7CkBAIC0zMjksNiArMzMxLDcgQEAKIAlkZXYtPmV4X2Rldi5leF9jaGFuZ2VfY291bnQgPSBiZTE2X3RvX2NwdShyZy0+Y2hhbmdlX2NvdW50KTsKIAlkZXYtPmV4X2Rldi5tYXhfcm91dGVfaW5kZXhlcyA9IGJlMTZfdG9fY3B1KHJnLT5yb3V0ZV9pbmRleGVzKTsKIAlkZXYtPmV4X2Rldi5udW1fcGh5cyA9IG1pbihyZy0+bnVtX3BoeXMsICh1OClNQVhfRVhQQU5ERVJfUEhZUyk7CisJZGV2LT5leF9kZXYudDJ0X3N1cHAgPSByZy0+dDJ0X3N1cHA7CiAJZGV2LT5leF9kZXYuY29uZl9yb3V0ZV90YWJsZSA9IHJnLT5jb25mX3JvdXRlX3RhYmxlOwogCWRldi0+ZXhfZGV2LmNvbmZpZ3VyaW5nID0gcmctPmNvbmZpZ3VyaW5nOwogCW1lbWNweShkZXYtPmV4X2Rldi5lbmNsb3N1cmVfbG9naWNhbF9pZCwgcmctPmVuY2xvc3VyZV9sb2dpY2FsX2lkLCA4KTsKQEAgLTc1MSw3ICs3NTQsMTAgQEAKICBvdXRfbGlzdF9kZWw6CiAJc2FzX3JwaHlfZnJlZShjaGlsZC0+cnBoeSk7CiAJY2hpbGQtPnJwaHkgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycSgmcGFyZW50LT5wb3J0LT5kZXZfbGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmY2hpbGQtPmRldl9saXN0X25vZGUpOworCXNwaW5fdW5sb2NrX2lycSgmcGFyZW50LT5wb3J0LT5kZXZfbGlzdF9sb2NrKTsKICBvdXRfZnJlZToKIAlzYXNfcG9ydF9kZWxldGUocGh5LT5wb3J0KTsKICBvdXRfZXJyOgpAQCAtMTEzMywxNSArMTEzOSwxNyBAQAogCX07CiAJc3RydWN0IGRvbWFpbl9kZXZpY2UgKnBhcmVudCA9IGNoaWxkLT5wYXJlbnQ7CiAKLQlzYXNfcHJpbnRrKCIlcyBleCAlMDE2bGx4IHBoeSAweCV4IDwtLT4gJXMgZXggJTAxNmxseCBwaHkgMHgleCAiCi0JCSAgICJoYXMgJWM6JWMgcm91dGluZyBsaW5rIVxuIiwKKwlzYXNfcHJpbnRrKCIlcyBleCAlMDE2bGx4IChUMlQgc3VwcDolZCkgcGh5IDB4JXggPC0tPiAlcyBleCAlMDE2bGx4ICIKKwkJICAgIihUMlQgc3VwcDolZCkgcGh5IDB4JXggaGFzICVjOiVjIHJvdXRpbmcgbGluayFcbiIsCiAKIAkJICAgZXhfdHlwZVtwYXJlbnQtPmRldl90eXBlXSwKIAkJICAgU0FTX0FERFIocGFyZW50LT5zYXNfYWRkciksCisJCSAgIHBhcmVudC0+ZXhfZGV2LnQydF9zdXBwLAogCQkgICBwYXJlbnRfcGh5LT5waHlfaWQsCiAKIAkJICAgZXhfdHlwZVtjaGlsZC0+ZGV2X3R5cGVdLAogCQkgICBTQVNfQUREUihjaGlsZC0+c2FzX2FkZHIpLAorCQkgICBjaGlsZC0+ZXhfZGV2LnQydF9zdXBwLAogCQkgICBjaGlsZF9waHktPnBoeV9pZCwKIAogCQkgICByYV9jaGFyW3BhcmVudF9waHktPnJvdXRpbmdfYXR0cl0sCkBAIC0xMjM4LDEwICsxMjQ2LDE1IEBACiAJCQkJCXNhc19wcmludF9wYXJlbnRfdG9wb2xvZ3lfYnVnKGNoaWxkLCBwYXJlbnRfcGh5LCBjaGlsZF9waHkpOwogCQkJCQlyZXMgPSAtRU5PREVWOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAocGFyZW50X3BoeS0+cm91dGluZ19hdHRyID09IFRBQkxFX1JPVVRJTkcgJiYKLQkJCQkgICBjaGlsZF9waHktPnJvdXRpbmdfYXR0ciAhPSBTVUJUUkFDVElWRV9ST1VUSU5HKSB7Ci0JCQkJc2FzX3ByaW50X3BhcmVudF90b3BvbG9neV9idWcoY2hpbGQsIHBhcmVudF9waHksIGNoaWxkX3BoeSk7Ci0JCQkJcmVzID0gLUVOT0RFVjsKKwkJCX0gZWxzZSBpZiAocGFyZW50X3BoeS0+cm91dGluZ19hdHRyID09IFRBQkxFX1JPVVRJTkcpIHsKKwkJCQlpZiAoY2hpbGRfcGh5LT5yb3V0aW5nX2F0dHIgPT0gU1VCVFJBQ1RJVkVfUk9VVElORyB8fAorCQkJCSAgICAoY2hpbGRfcGh5LT5yb3V0aW5nX2F0dHIgPT0gVEFCTEVfUk9VVElORyAmJgorCQkJCSAgICAgY2hpbGRfZXgtPnQydF9zdXBwICYmIHBhcmVudF9leC0+dDJ0X3N1cHApKSB7CisJCQkJCS8qIEFsbCBnb29kICovOworCQkJCX0gZWxzZSB7CisJCQkJCXNhc19wcmludF9wYXJlbnRfdG9wb2xvZ3lfYnVnKGNoaWxkLCBwYXJlbnRfcGh5LCBjaGlsZF9waHkpOworCQkJCQlyZXMgPSAtRU5PREVWOworCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIEZBTk9VVF9ERVY6CkBAIC0xNzI5LDcgKzE3NDIsNyBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyB2b2lkIHNhc191bnJlZ2lzdGVyX2V4X3RyZWUoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHNhc191bnJlZ2lzdGVyX2V4X3RyZWUoc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCwgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXhwYW5kZXJfZGV2aWNlICpleCA9ICZkZXYtPmV4X2RldjsKIAlzdHJ1Y3QgZG9tYWluX2RldmljZSAqY2hpbGQsICpuOwpAQCAtMTczOCwxMSArMTc1MSwxMSBAQAogCQljaGlsZC0+Z29uZSA9IDE7CiAJCWlmIChjaGlsZC0+ZGV2X3R5cGUgPT0gRURHRV9ERVYgfHwKIAkJICAgIGNoaWxkLT5kZXZfdHlwZSA9PSBGQU5PVVRfREVWKQotCQkJc2FzX3VucmVnaXN0ZXJfZXhfdHJlZShjaGlsZCk7CisJCQlzYXNfdW5yZWdpc3Rlcl9leF90cmVlKHBvcnQsIGNoaWxkKTsKIAkJZWxzZQotCQkJc2FzX3VucmVnaXN0ZXJfZGV2KGNoaWxkKTsKKwkJCXNhc191bnJlZ2lzdGVyX2Rldihwb3J0LCBjaGlsZCk7CiAJfQotCXNhc191bnJlZ2lzdGVyX2RldihkZXYpOworCXNhc191bnJlZ2lzdGVyX2Rldihwb3J0LCBkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBzYXNfdW5yZWdpc3Rlcl9kZXZzX3Nhc19hZGRyKHN0cnVjdCBkb21haW5fZGV2aWNlICpwYXJlbnQsCkBAIC0xNzU5LDkgKzE3NzIsOSBAQAogCQkJCWNoaWxkLT5nb25lID0gMTsKIAkJCQlpZiAoY2hpbGQtPmRldl90eXBlID09IEVER0VfREVWIHx8CiAJCQkJICAgIGNoaWxkLT5kZXZfdHlwZSA9PSBGQU5PVVRfREVWKQotCQkJCQlzYXNfdW5yZWdpc3Rlcl9leF90cmVlKGNoaWxkKTsKKwkJCQkJc2FzX3VucmVnaXN0ZXJfZXhfdHJlZShwYXJlbnQtPnBvcnQsIGNoaWxkKTsKIAkJCQllbHNlCi0JCQkJCXNhc191bnJlZ2lzdGVyX2RldihjaGlsZCk7CisJCQkJCXNhc191bnJlZ2lzdGVyX2RldihwYXJlbnQtPnBvcnQsIGNoaWxkKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2hvc3Rfc21wLmMKaW5kZXggMDRhZDhkZC4uYmI4ZjQ5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19ob3N0X3NtcC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJzYXNfaW50ZXJuYWwuaCIKIApAQCAtNTEsNiArNTIsOTEgQEAKIAlyZXNwX2RhdGFbMTVdID0gcnBoeS0+aWRlbnRpZnkudGFyZ2V0X3BvcnRfcHJvdG9jb2xzOwogfQogCisvKioKKyAqIHRvX3Nhc19ncGlvX2dwX2JpdCAtIGdpdmVuIHRoZSBncGlvIGZyYW1lIGRhdGEgZmluZCB0aGUgYnl0ZS9iaXQgcG9zaXRpb24gb2YgJ29kJworICogQG9kOiBvZCBiaXQgdG8gZmluZAorICogQGRhdGE6IGluY29taW5nIGJpdHN0cmVhbSAoZnJvbSBmcmFtZSkKKyAqIEBpbmRleDogcmVxdWVzdGVkIGRhdGEgcmVnaXN0ZXIgaW5kZXggKGZyb20gZnJhbWUpCisgKiBAY291bnQ6IHRvdGFsIG51bWJlciBvZiByZWdpc3RlcnMgaW4gdGhlIGJpdHN0cmVhbSAoZnJvbSBmcmFtZSkKKyAqIEBiaXQ6IGJpdCBwb3NpdGlvbiBvZiAnb2QnIGluIHRoZSByZXR1cm5lZCBieXRlCisgKgorICogcmV0dXJucyBOVUxMIGlmICdvZCcgaXMgbm90IGluICdkYXRhJworICoKKyAqIEZyb20gU0ZGLTg0ODUgdjAuNzoKKyAqICJJbiBHUElPX1RYWzFdLCBiaXQgMCBvZiBieXRlIDMgY29udGFpbnMgdGhlIGZpcnN0IGJpdCAoaS5lLiwgT0QwLjApCisgKiAgYW5kIGJpdCA3IG9mIGJ5dGUgMCBjb250YWlucyB0aGUgMzJuZCBiaXQgKGkuZS4sIE9EMTAuMSkuCisgKgorICogIEluIEdQSU9fVFhbMl0sIGJpdCAwIG9mIGJ5dGUgMyBjb250YWlucyB0aGUgMzNyZCBiaXQgKGkuZS4sIE9EMTAuMikKKyAqICBhbmQgYml0IDcgb2YgYnl0ZSAwIGNvbnRhaW5zIHRoZSA2NHRoIGJpdCAoaS5lLiwgT0QyMS4wKS4iCisgKgorICogVGhlIGdlbmVyYWwtcHVycG9zZSAocmF3LWJpdHN0cmVhbSkgUlggcmVnaXN0ZXJzIGhhdmUgdGhlIHNhbWUgbGF5b3V0CisgKiBhbHRob3VnaCAnb2QnIGlzIHJlbmFtZWQgJ2lkJyBmb3IgJ2lucHV0IGRhdGEnLgorICoKKyAqIFNGRi04NDg5IGRlZmluZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBMRURzIGluIHJlc3BvbnNlIHRvIHRoZSAnb2QnIHZhbHVlcy4KKyAqLworc3RhdGljIHU4ICp0b19zYXNfZ3Bpb19ncF9iaXQodW5zaWduZWQgaW50IG9kLCB1OCAqZGF0YSwgdTggaW5kZXgsIHU4IGNvdW50LCB1OCAqYml0KQoreworCXVuc2lnbmVkIGludCByZWc7CisJdTggYnl0ZTsKKworCS8qIGdwIHJlZ2lzdGVycyBzdGFydCBhdCBpbmRleCAxICovCisJaWYgKGluZGV4ID09IDApCisJCXJldHVybiBOVUxMOworCisJaW5kZXgtLTsgLyogbWFrZSBpbmRleCAwLWJhc2VkICovCisJaWYgKG9kIDwgaW5kZXggKiAzMikKKwkJcmV0dXJuIE5VTEw7CisKKwlvZCAtPSBpbmRleCAqIDMyOworCXJlZyA9IG9kID4+IDU7CisKKwlpZiAocmVnID49IGNvdW50KQorCQlyZXR1cm4gTlVMTDsKKworCW9kICY9ICgxIDw8IDUpIC0gMTsKKwlieXRlID0gMyAtIChvZCA+PiAzKTsKKwkqYml0ID0gb2QgJiAoKDEgPDwgMykgLSAxKTsKKworCXJldHVybiAmZGF0YVtyZWcgKiA0ICsgYnl0ZV07Cit9CisKK2ludCB0cnlfdGVzdF9zYXNfZ3Bpb19ncF9iaXQodW5zaWduZWQgaW50IG9kLCB1OCAqZGF0YSwgdTggaW5kZXgsIHU4IGNvdW50KQoreworCXU4ICpieXRlOworCXU4IGJpdDsKKworCWJ5dGUgPSB0b19zYXNfZ3Bpb19ncF9iaXQob2QsIGRhdGEsIGluZGV4LCBjb3VudCwgJmJpdCk7CisJaWYgKCFieXRlKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gKCpieXRlID4+IGJpdCkgJiAxOworfQorRVhQT1JUX1NZTUJPTCh0cnlfdGVzdF9zYXNfZ3Bpb19ncF9iaXQpOworCitzdGF0aWMgaW50IHNhc19ob3N0X3NtcF93cml0ZV9ncGlvKHN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEsIHU4ICpyZXNwX2RhdGEsCisJCQkJICAgdTggcmVnX3R5cGUsIHU4IHJlZ19pbmRleCwgdTggcmVnX2NvdW50LAorCQkJCSAgIHU4ICpyZXFfZGF0YSkKK3sKKwlzdHJ1Y3Qgc2FzX2ludGVybmFsICppID0gdG9fc2FzX2ludGVybmFsKHNhc19oYS0+Y29yZS5zaG9zdC0+dHJhbnNwb3J0dCk7CisJaW50IHdyaXR0ZW47CisKKwlpZiAoaS0+ZGZ0LT5sbGRkX3dyaXRlX2dwaW8gPT0gTlVMTCkgeworCQlyZXNwX2RhdGFbMl0gPSBTTVBfUkVTUF9GVU5DX1VOSzsKKwkJcmV0dXJuIDA7CisJfQorCisJd3JpdHRlbiA9IGktPmRmdC0+bGxkZF93cml0ZV9ncGlvKHNhc19oYSwgcmVnX3R5cGUsIHJlZ19pbmRleCwKKwkJCQkJICByZWdfY291bnQsIHJlcV9kYXRhKTsKKworCWlmICh3cml0dGVuIDwgMCkgeworCQlyZXNwX2RhdGFbMl0gPSBTTVBfUkVTUF9GVU5DX0ZBSUxFRDsKKwkJd3JpdHRlbiA9IDA7CisJfSBlbHNlCisJCXJlc3BfZGF0YVsyXSA9IFNNUF9SRVNQX0ZVTkNfQUNDOworCisJcmV0dXJuIHdyaXR0ZW47Cit9CisKIHN0YXRpYyB2b2lkIHNhc19yZXBvcnRfcGh5X3NhdGEoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSwgdTggKnJlc3BfZGF0YSwKIAkJCQl1OCBwaHlfaWQpCiB7CkBAIC0yMzAsOSArMzE2LDIzIEBACiAJCS8qIENhbid0IGltcGxlbWVudDsgaG9zdHMgaGF2ZSBubyByb3V0ZXMgKi8KIAkJYnJlYWs7CiAKLQljYXNlIFNNUF9XUklURV9HUElPX1JFRzoKLQkJLyogRklYTUU6IG5lZWQgR1BJTyBzdXBwb3J0IGluIHRoZSB0cmFuc3BvcnQgY2xhc3MgKi8KKwljYXNlIFNNUF9XUklURV9HUElPX1JFRzogeworCQkvKiBTRkYtODQ4NSB2MC43ICovCisJCWNvbnN0IGludCBiYXNlX2ZyYW1lX3NpemUgPSAxMTsKKwkJaW50IHRvX3dyaXRlID0gcmVxX2RhdGFbNF07CisKKwkJaWYgKGJsa19ycV9ieXRlcyhyZXEpIDwgYmFzZV9mcmFtZV9zaXplICsgdG9fd3JpdGUgKiA0IHx8CisJCSAgICByZXEtPnJlc2lkX2xlbiA8IGJhc2VfZnJhbWVfc2l6ZSArIHRvX3dyaXRlICogNCkgeworCQkJcmVzcF9kYXRhWzJdID0gU01QX1JFU1BfSU5WX0ZSTV9MRU47CisJCQlicmVhazsKKwkJfQorCisJCXRvX3dyaXRlID0gc2FzX2hvc3Rfc21wX3dyaXRlX2dwaW8oc2FzX2hhLCByZXNwX2RhdGEsIHJlcV9kYXRhWzJdLAorCQkJCQkJICAgcmVxX2RhdGFbM10sIHRvX3dyaXRlLCAmcmVxX2RhdGFbOF0pOworCQlyZXEtPnJlc2lkX2xlbiAtPSBiYXNlX2ZyYW1lX3NpemUgKyB0b193cml0ZSAqIDQ7CisJCXJzcC0+cmVzaWRfbGVuIC09IDg7CiAJCWJyZWFrOworCX0KIAogCWNhc2UgU01QX0NPTkZfUk9VVEVfSU5GTzoKIAkJLyogQ2FuJ3QgaW1wbGVtZW50OyBob3N0cyBoYXZlIG5vIHJvdXRlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaW5pdC5jCmluZGV4IDJkYzU1MzQuLmQ4MWMzYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19pbml0LmMKQEAgLTM3LDcgKzM3LDMyIEBACiAKICNpbmNsdWRlICIuLi9zY3NpX3Nhc19pbnRlcm5hbC5oIgogCi1zdHJ1Y3Qga21lbV9jYWNoZSAqc2FzX3Rhc2tfY2FjaGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNhc190YXNrX2NhY2hlOworCitzdHJ1Y3Qgc2FzX3Rhc2sgKnNhc19hbGxvY190YXNrKGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGttZW1fY2FjaGVfemFsbG9jKHNhc190YXNrX2NhY2hlLCBmbGFncyk7CisKKwlpZiAodGFzaykgeworCQlJTklUX0xJU1RfSEVBRCgmdGFzay0+bGlzdCk7CisJCXNwaW5fbG9ja19pbml0KCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOworCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzID0gU0FTX1RBU0tfU1RBVEVfUEVORElORzsKKwkJaW5pdF90aW1lcigmdGFzay0+dGltZXIpOworCQlpbml0X2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOworCX0KKworCXJldHVybiB0YXNrOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FzX2FsbG9jX3Rhc2spOworCit2b2lkIHNhc19mcmVlX3Rhc2soc3RydWN0IHNhc190YXNrICp0YXNrKQoreworCWlmICh0YXNrKSB7CisJCUJVR19PTighbGlzdF9lbXB0eSgmdGFzay0+bGlzdCkpOworCQlrbWVtX2NhY2hlX2ZyZWUoc2FzX3Rhc2tfY2FjaGUsIHRhc2spOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNhc19mcmVlX3Rhc2spOwogCiAvKi0tLS0tLS0tLS0tLSBTQVMgYWRkciBoYXNoIC0tLS0tLS0tLS0tKi8KIHZvaWQgc2FzX2hhc2hfYWRkcih1OCAqaGFzaGVkLCBjb25zdCB1OCAqc2FzX2FkZHIpCkBAIC0xNTIsMTAgKzE3NywxNSBAQAogCiBzdGF0aWMgaW50IHNhc19nZXRfbGlua2Vycm9ycyhzdHJ1Y3Qgc2FzX3BoeSAqcGh5KQogewotCWlmIChzY3NpX2lzX3Nhc19waHlfbG9jYWwocGh5KSkKLQkJLyogRklYTUU6IHdlIGhhdmUgbm8gbG9jYWwgcGh5IHN0YXRzCi0JCSAqIGdhdGhlcmluZyBhdCB0aGlzIHRpbWUgKi8KLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNjc2lfaXNfc2FzX3BoeV9sb2NhbChwaHkpKSB7CisJCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHBoeS0+ZGV2LnBhcmVudCk7CisJCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCQlzdHJ1Y3QgYXNkX3Nhc19waHkgKmFzZF9waHkgPSBzYXNfaGEtPnNhc19waHlbcGh5LT5udW1iZXJdOworCQlzdHJ1Y3Qgc2FzX2ludGVybmFsICppID0KKwkJCXRvX3Nhc19pbnRlcm5hbChzYXNfaGEtPmNvcmUuc2hvc3QtPnRyYW5zcG9ydHQpOworCisJCXJldHVybiBpLT5kZnQtPmxsZGRfY29udHJvbF9waHkoYXNkX3BoeSwgUEhZX0ZVTkNfR0VUX0VWRU5UUywgTlVMTCk7CisJfQogCiAJcmV0dXJuIHNhc19zbXBfZ2V0X3BoeV9ldmVudHMocGh5KTsKIH0KQEAgLTI5Myw4ICszMjMsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzYXNfY2xhc3NfaW5pdCh2b2lkKQogewotCXNhc190YXNrX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInNhc190YXNrIiwgc2l6ZW9mKHN0cnVjdCBzYXNfdGFzayksCi0JCQkJCSAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJc2FzX3Rhc2tfY2FjaGUgPSBLTUVNX0NBQ0hFKHNhc190YXNrLCBTTEFCX0hXQ0FDSEVfQUxJR04pOwogCWlmICghc2FzX3Rhc2tfY2FjaGUpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCmluZGV4IGVlYmE3NmMuLmI2ZTIzM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiAjaW5jbHVkZSAic2FzX2ludGVybmFsLmgiCkBAIC0xODIsNzggKzE4Myw1NSBAQAogCXJldHVybiAwOwogfQogCi0vKioKLSAqIHNhc19xdWV1ZWNvbW1hbmQgLS0gRW5xdWV1ZSBhIGNvbW1hbmQgZm9yIHByb2Nlc3NpbmcKLSAqIEBwYXJhbWV0ZXJzOiBTZWUgU0NTSSBDb3JlIGRvY3VtZW50YXRpb24KLSAqCi0gKiBOb3RlOiBYWFg6IFJlbW92ZSB0aGUgaG9zdCB1bmxvY2svbG9jayBwYWlyIHdoZW4gU0NTSSBDb3JlIGNhbgotICogY2FsbCB1cyB3aXRob3V0IGhvbGRpbmcgYW4gSVJRIHNwaW5sb2NrLi4uCi0gKi8KLXN0YXRpYyBpbnQgc2FzX3F1ZXVlY29tbWFuZF9sY2soc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkgICAgIHZvaWQgKCpzY3NpX2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCi0JX19yZWxlYXNlcyhob3N0LT5ob3N0X2xvY2spCi0JX19hY3F1aXJlcyhkZXYtPnNhdGFfZGV2LmFwLT5sb2NrKQotCV9fcmVsZWFzZXMoZGV2LT5zYXRhX2Rldi5hcC0+bG9jaykKLQlfX2FjcXVpcmVzKGhvc3QtPmhvc3RfbG9jaykKK2ludCBzYXNfcXVldWVjb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKLQlpbnQgcmVzID0gMDsKLQlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gY21kX3RvX2RvbWFpbl9kZXYoY21kKTsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CiAJc3RydWN0IHNhc19pbnRlcm5hbCAqaSA9IHRvX3Nhc19pbnRlcm5hbChob3N0LT50cmFuc3BvcnR0KTsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gY21kX3RvX2RvbWFpbl9kZXYoY21kKTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gZGV2LT5wb3J0LT5oYTsKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2s7CisJaW50IHJlcyA9IDA7CiAKLQlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKLQotCXsKLQkJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9IGRldi0+cG9ydC0+aGE7Ci0JCXN0cnVjdCBzYXNfdGFzayAqdGFzazsKLQotCQkvKiBJZiB0aGUgZGV2aWNlIGZlbGwgb2ZmLCBubyBzZW5zZSBpbiBpc3N1aW5nIGNvbW1hbmRzICovCi0JCWlmIChkZXYtPmdvbmUpIHsKLQkJCWNtZC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7Ci0JCQlzY3NpX2RvbmUoY21kKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKGRldl9pc19zYXRhKGRldikpIHsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+c2F0YV9kZXYuYXAtPmxvY2ssIGZsYWdzKTsKLQkJCXJlcyA9IGF0YV9zYXNfcXVldWVjbWQoY21kLCBkZXYtPnNhdGFfZGV2LmFwKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5zYXRhX2Rldi5hcC0+bG9jaywgZmxhZ3MpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlyZXMgPSAtRU5PTUVNOwotCQl0YXNrID0gc2FzX2NyZWF0ZV90YXNrKGNtZCwgZGV2LCBHRlBfQVRPTUlDKTsKLQkJaWYgKCF0YXNrKQotCQkJZ290byBvdXQ7Ci0KLQkJY21kLT5zY3NpX2RvbmUgPSBzY3NpX2RvbmU7Ci0JCS8qIFF1ZXVlIHVwLCBEaXJlY3QgTW9kZSBvciBUYXNrIENvbGxlY3RvciBNb2RlLiAqLwotCQlpZiAoc2FzX2hhLT5sbGRkX21heF9leGVjdXRlX251bSA8IDIpCi0JCQlyZXMgPSBpLT5kZnQtPmxsZGRfZXhlY3V0ZV90YXNrKHRhc2ssIDEsIEdGUF9BVE9NSUMpOwotCQllbHNlCi0JCQlyZXMgPSBzYXNfcXVldWVfdXAodGFzayk7Ci0KLQkJLyogRXhhbWluZSAqLwotCQlpZiAocmVzKSB7Ci0JCQlTQVNfRFBSSU5USygibGxkZF9leGVjdXRlX3Rhc2sgcmV0dXJuZWQ6ICVkXG4iLCByZXMpOwotCQkJQVNTSUdOX1NBU19UQVNLKGNtZCwgTlVMTCk7Ci0JCQlzYXNfZnJlZV90YXNrKHRhc2spOwotCQkJaWYgKHJlcyA9PSAtU0FTX1FVRVVFX0ZVTEwpIHsKLQkJCQljbWQtPnJlc3VsdCA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OyAvKiByZXRyeSAqLwotCQkJCXJlcyA9IDA7Ci0JCQkJc2NzaV9kb25lKGNtZCk7Ci0JCQl9Ci0JCQlnb3RvIG91dDsKLQkJfQorCS8qIElmIHRoZSBkZXZpY2UgZmVsbCBvZmYsIG5vIHNlbnNlIGluIGlzc3VpbmcgY29tbWFuZHMgKi8KKwlpZiAoZGV2LT5nb25lKSB7CisJCWNtZC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCWdvdG8gb3V0X2RvbmU7CiAJfQotb3V0OgotCXNwaW5fbG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKLQlyZXR1cm4gcmVzOwotfQogCi1ERUZfU0NTSV9RQ01EKHNhc19xdWV1ZWNvbW1hbmQpCisJaWYgKGRldl9pc19zYXRhKGRldikpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPnNhdGFfZGV2LmFwLT5sb2NrLCBmbGFncyk7CisJCXJlcyA9IGF0YV9zYXNfcXVldWVjbWQoY21kLCBkZXYtPnNhdGFfZGV2LmFwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPnNhdGFfZGV2LmFwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiByZXM7CisJfQorCisJdGFzayA9IHNhc19jcmVhdGVfdGFzayhjbWQsIGRldiwgR0ZQX0FUT01JQyk7CisJaWYgKCF0YXNrKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKworCS8qIFF1ZXVlIHVwLCBEaXJlY3QgTW9kZSBvciBUYXNrIENvbGxlY3RvciBNb2RlLiAqLworCWlmIChzYXNfaGEtPmxsZGRfbWF4X2V4ZWN1dGVfbnVtIDwgMikKKwkJcmVzID0gaS0+ZGZ0LT5sbGRkX2V4ZWN1dGVfdGFzayh0YXNrLCAxLCBHRlBfQVRPTUlDKTsKKwllbHNlCisJCXJlcyA9IHNhc19xdWV1ZV91cCh0YXNrKTsKKworCWlmIChyZXMpCisJCWdvdG8gb3V0X2ZyZWVfdGFzazsKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfdGFzazoKKwlTQVNfRFBSSU5USygibGxkZF9leGVjdXRlX3Rhc2sgcmV0dXJuZWQ6ICVkXG4iLCByZXMpOworCUFTU0lHTl9TQVNfVEFTSyhjbWQsIE5VTEwpOworCXNhc19mcmVlX3Rhc2sodGFzayk7CisJaWYgKHJlcyA9PSAtU0FTX1FVRVVFX0ZVTEwpCisJCWNtZC0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7IC8qIHJldHJ5ICovCisJZWxzZQorCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKK291dF9kb25lOgorCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyB2b2lkIHNhc19laF9maW5pc2hfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKQEAgLTc4NCw4ICs3NjIsNyBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIFNBU19ERUZfUUQgMzIKLSNkZWZpbmUgU0FTX01BWF9RRCA2NAorI2RlZmluZSBTQVNfREVGX1FEIDI1NgogCiBpbnQgc2FzX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2KQogewpAQCAtODI1LDM0ICs4MDIsNDEgQEAKIAlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gc2Rldl90b19kb21haW5fZGV2KHNjc2lfZGV2KTsKIAogCWlmIChkZXZfaXNfc2F0YShkZXYpKQotCQlkZXYtPnNhdGFfZGV2LmFwLT5saW5rLmRldmljZVswXS5jbGFzcyA9IEFUQV9ERVZfTk9ORTsKKwkJc2FzX3RvX2F0YV9kZXYoZGV2KS0+Y2xhc3MgPSBBVEFfREVWX05PTkU7CiB9CiAKLWludCBzYXNfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXYsIGludCBuZXdfZGVwdGgsCi0JCQkgICBpbnQgcmVhc29uKQoraW50IHNhc19jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgZGVwdGgsIGludCByZWFzb24pCiB7Ci0JaW50IHJlcyA9IG1pbihuZXdfZGVwdGgsIFNBU19NQVhfUUQpOworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBzZGV2X3RvX2RvbWFpbl9kZXYoc2Rldik7CiAKLQlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJaWYgKGRldl9pc19zYXRhKGRldikpCisJCXJldHVybiBfX2F0YV9jaGFuZ2VfcXVldWVfZGVwdGgoZGV2LT5zYXRhX2Rldi5hcCwgc2RldiwgZGVwdGgsCisJCQkJCQlyZWFzb24pOworCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIFNDU0lfUURFUFRIX0RFRkFVTFQ6CisJY2FzZSBTQ1NJX1FERVBUSF9SQU1QX1VQOgorCQlpZiAoIXNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCQlkZXB0aCA9IDE7CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpLCBkZXB0aCk7CisJCWJyZWFrOworCWNhc2UgU0NTSV9RREVQVEhfUUZVTEw6CisJCXNjc2lfdHJhY2tfcXVldWVfZnVsbChzZGV2LCBkZXB0aCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCWlmIChzY3NpX2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCkKLQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2NzaV9kZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNjc2lfZGV2KSwKLQkJCQkJcmVzKTsKLQllbHNlIHsKLQkJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IHNkZXZfdG9fZG9tYWluX2RldihzY3NpX2Rldik7Ci0JCXNhc19wcmludGsoImRldmljZSAlbGx4IExVTiAleCBxdWV1ZSBkZXB0aCBjaGFuZ2VkIHRvIDFcbiIsCi0JCQkgICBTQVNfQUREUihkZXYtPnNhc19hZGRyKSwKLQkJCSAgIHNjc2lfZGV2LT5sdW4pOwotCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzY3NpX2RldiwgMCwgMSk7Ci0JCXJlcyA9IDE7CiAJfQogCi0JcmV0dXJuIHJlczsKKwlyZXR1cm4gZGVwdGg7CiB9CiAKIGludCBzYXNfY2hhbmdlX3F1ZXVlX3R5cGUoc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldiwgaW50IHF0KQogeworCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBzZGV2X3RvX2RvbWFpbl9kZXYoc2NzaV9kZXYpOworCisJaWYgKGRldl9pc19zYXRhKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKCFzY3NpX2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Rhc2suYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Rhc2suYwppbmRleCBiMTNhMzM0Li5hNzhlNWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc190YXNrLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfdGFzay5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2FzLmg+CiAjaW5jbHVkZSA8c2NzaS9saWJzYXMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNycC5jIGIvZHJpdmVycy9zY3NpL2xpYnNycC5jCmluZGV4IGZmNmEyOGMuLjA3MDdlY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzcnAuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic3JwLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaAppbmRleCBjMDg4YTM2Li5iYjRjOGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCkBAIC04NDYsOCArODQ2LDI0IEBACiAJc3RydWN0IGRlbnRyeSAqZGVidWdfaGJxaW5mbzsKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kdW1wSG9zdFNsaW07CiAJc3RydWN0IGRlbnRyeSAqZGVidWdfZHVtcEhCQVNsaW07Ci0Jc3RydWN0IGRlbnRyeSAqZGVidWdfZHVtcERhdGE7ICAgLyogQmxvY2tHdWFyZCBCUEwqLwotCXN0cnVjdCBkZW50cnkgKmRlYnVnX2R1bXBEaWY7ICAgIC8qIEJsb2NrR3VhcmQgQlBMKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kdW1wRGF0YTsgICAvKiBCbG9ja0d1YXJkIEJQTCAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnX2R1bXBEaWY7ICAgIC8qIEJsb2NrR3VhcmQgQlBMICovCisJc3RydWN0IGRlbnRyeSAqZGVidWdfSW5qRXJyTEJBOyAgLyogTEJBIHRvIGluamVjdCBlcnJvcnMgYXQgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z193cml0ZUd1YXJkOyAvKiBpbmplY3Qgd3JpdGUgZ3VhcmRfdGFnIGVycm9ycyAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnX3dyaXRlQXBwOyAgIC8qIGluamVjdCB3cml0ZSBhcHBfdGFnIGVycm9ycyAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnX3dyaXRlUmVmOyAgIC8qIGluamVjdCB3cml0ZSByZWZfdGFnIGVycm9ycyAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnX3JlYWRBcHA7ICAgIC8qIGluamVjdCByZWFkIGFwcF90YWcgZXJyb3JzICovCisJc3RydWN0IGRlbnRyeSAqZGVidWdfcmVhZFJlZjsgICAgLyogaW5qZWN0IHJlYWQgcmVmX3RhZyBlcnJvcnMgKi8KKworCS8qIFQxMCBESUYgZXJyb3IgaW5qZWN0aW9uICovCisJdWludDMyX3QgbHBmY19pbmplcnJfd2dyZF9jbnQ7CisJdWludDMyX3QgbHBmY19pbmplcnJfd2FwcF9jbnQ7CisJdWludDMyX3QgbHBmY19pbmplcnJfd3JlZl9jbnQ7CisJdWludDMyX3QgbHBmY19pbmplcnJfcmFwcF9jbnQ7CisJdWludDMyX3QgbHBmY19pbmplcnJfcnJlZl9jbnQ7CisJc2VjdG9yX3QgbHBmY19pbmplcnJfbGJhOworI2RlZmluZSBMUEZDX0lOSkVSUl9MQkFfT0ZGCShzZWN0b3JfdCkweGZmZmZmZmZmZmZmZmZmZmYKKwogCXN0cnVjdCBkZW50cnkgKmRlYnVnX3Nsb3dfcmluZ190cmM7CiAJc3RydWN0IGxwZmNfZGVidWdmc190cmMgKnNsb3dfcmluZ190cmM7CiAJYXRvbWljX3Qgc2xvd19yaW5nX3RyY19jbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jCmluZGV4IDI1NDJmMWYuLmQwZWJhZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9hZXIuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTUyLDYgKzUzLDEzIEBACiAjZGVmaW5lIExQRkNfTUlOX0RFVkxPU1NfVE1PIDEKICNkZWZpbmUgTFBGQ19NQVhfREVWTE9TU19UTU8gMjU1CiAKKy8qCisgKiBXcml0ZSBrZXkgc2l6ZSBzaG91bGQgYmUgbXVsdGlwbGUgb2YgNC4gSWYgd3JpdGUga2V5IGlzIGNoYW5nZWQKKyAqIG1ha2Ugc3VyZSB0aGF0IGxpYnJhcnkgd3JpdGUga2V5IGlzIGFsc28gY2hhbmdlZC4KKyAqLworI2RlZmluZSBMUEZDX1JFR19XUklURV9LRVlfU0laRQk0CisjZGVmaW5lIExQRkNfUkVHX1dSSVRFX0tFWQkiRU1MWCIKKwogLyoqCiAgKiBscGZjX2plZGVjX3RvX2FzY2lpIC0gSGV4IHRvIGFzY2lpIGNvbnZlcnRvciBhY2NvcmRpbmcgdG8gSkVERUMgcnVsZXMKICAqIEBpbmNyOiBpbnRlZ2VyIHRvIGNvbnZlcnQuCkBAIC02OTMsNyArNzAxLDcgQEAKIAlpbnQgcmM7CiAKIAlpZiAoIXBoYmEtPmNmZ19lbmFibGVfaGJhX3Jlc2V0KQotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIC1FQUNDRVM7CiAKIAlzdGF0dXMgPSBscGZjX2RvX29mZmxpbmUocGhiYSwgTFBGQ19FVlRfT0ZGTElORSk7CiAKQEAgLTc0Miw5ICs3NTAsMTEgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOwogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKLQogCWludCBzdGF0dXMgPSAtRUlOVkFMOwogCisJaWYgKCFwaGJhLT5jZmdfZW5hYmxlX2hiYV9yZXNldCkKKwkJcmV0dXJuIC1FQUNDRVM7CisKIAlpZiAoc3RybmNtcChidWYsICJzZWxlY3RpdmUiLCBzaXplb2YoInNlbGVjdGl2ZSIpIC0gMSkgPT0gMCkKIAkJc3RhdHVzID0gcGhiYS0+bHBmY19zZWxlY3RpdmVfcmVzZXQocGhiYSk7CiAKQEAgLTc2NSwxNiArNzc1LDIxIEBACiAgKiBSZXR1cm5zOgogICogemVybyBmb3Igc3VjY2VzcwogICoqLwotc3RhdGljIGludAoraW50CiBscGZjX3NsaTRfcGRldl9zdGF0dXNfcmVnX3dhaXQoc3RydWN0IGxwZmNfaGJhICpwaGJhKQogewotCXN0cnVjdCBscGZjX3JlZ2lzdGVyIHBvcnRzdGF0X3JlZzsKKwlzdHJ1Y3QgbHBmY19yZWdpc3RlciBwb3J0c3RhdF9yZWcgPSB7MH07CiAJaW50IGk7CiAKLQorCW1zbGVlcCgxMDApOwogCWxwZmNfcmVhZGwocGhiYS0+c2xpNF9oYmEudS5pZl90eXBlMi5TVEFUVVNyZWdhZGRyLAogCQkgICAmcG9ydHN0YXRfcmVnLndvcmQwKTsKIAorCS8qIHZlcmlmeSBpZiBwcml2aWxhZ2VkIGZvciB0aGUgcmVxdWVzdCBvcGVyYXRpb24gKi8KKwlpZiAoIWJmX2dldChscGZjX3NsaXBvcnRfc3RhdHVzX3JuLCAmcG9ydHN0YXRfcmVnKSAmJgorCSAgICAhYmZfZ2V0KGxwZmNfc2xpcG9ydF9zdGF0dXNfZXJyLCAmcG9ydHN0YXRfcmVnKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwogCS8qIHdhaXQgZm9yIHRoZSBTTEkgcG9ydCBmaXJtd2FyZSByZWFkeSBhZnRlciBmaXJtd2FyZSByZXNldCAqLwogCWZvciAoaSA9IDA7IGkgPCBMUEZDX0ZXX1JFU0VUX01BWElNVU1fV0FJVF8xME1TX0NOVDsgaSsrKSB7CiAJCW1zbGVlcCgxMCk7CkBAIC04MTYsMTYgKzgzMSwxMyBAQAogCWludCByYzsKIAogCWlmICghcGhiYS0+Y2ZnX2VuYWJsZV9oYmFfcmVzZXQpCi0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gLUVBQ0NFUzsKIAogCWlmICgocGhiYS0+c2xpX3JldiA8IExQRkNfU0xJX1JFVjQpIHx8CiAJICAgIChiZl9nZXQobHBmY19zbGlfaW50Zl9pZl90eXBlLCAmcGhiYS0+c2xpNF9oYmEuc2xpX2ludGYpICE9CiAJICAgICBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoIXBkZXYtPmlzX3BoeXNmbikKLQkJcmV0dXJuIC1FUEVSTTsKLQogCS8qIERpc2FibGUgU1ItSU9WIHZpcnR1YWwgZnVuY3Rpb25zIGlmIGVuYWJsZWQgKi8KIAlpZiAocGhiYS0+Y2ZnX3NyaW92X25yX3ZpcnRmbikgewogCQlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKQEAgLTg1OCw3ICs4NzAsNyBAQAogCXJjID0gbHBmY19zbGk0X3BkZXZfc3RhdHVzX3JlZ193YWl0KHBoYmEpOwogCiAJaWYgKHJjKQotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHJjOwogCiAJaW5pdF9jb21wbGV0aW9uKCZvbmxpbmVfY29tcGwpOwogCXJjID0gbHBmY193b3JrcV9wb3N0X2V2ZW50KHBoYmEsICZzdGF0dXMsICZvbmxpbmVfY29tcGwsCkBAIC05ODQsNyArOTk2LDcgQEAKIAlpZiAoIXN0YXR1cykKIAkJcmV0dXJuIHN0cmxlbihidWYpOwogCWVsc2UKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgpAQCAtMzg4NSwxOCArMzg5NywyMyBAQAogCWlmICgob2ZmICsgY291bnQpID4gRkZfUkVHX0FSRUFfU0laRSkKIAkJcmV0dXJuIC1FUkFOR0U7CiAKLQlpZiAoY291bnQgPT0gMCkgcmV0dXJuIDA7CisJaWYgKGNvdW50IDw9IExQRkNfUkVHX1dSSVRFX0tFWV9TSVpFKQorCQlyZXR1cm4gMDsKIAogCWlmIChvZmYgJSA0IHx8IGNvdW50ICUgNCB8fCAodW5zaWduZWQgbG9uZylidWYgJSA0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghKHZwb3J0LT5mY19mbGFnICYgRkNfT0ZGTElORV9NT0RFKSkgeworCS8qIFRoaXMgaXMgdG8gcHJvdGVjdCBIQkEgcmVnaXN0ZXJzIGZyb20gYWNjaWRlbnRhbCB3cml0ZXMuICovCisJaWYgKG1lbWNtcChidWYsIExQRkNfUkVHX1dSSVRFX0tFWSwgTFBGQ19SRUdfV1JJVEVfS0VZX1NJWkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKHZwb3J0LT5mY19mbGFnICYgRkNfT0ZGTElORV9NT0RFKSkKIAkJcmV0dXJuIC1FUEVSTTsKLQl9CiAKIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQlmb3IgKGJ1Zl9vZmYgPSAwOyBidWZfb2ZmIDwgY291bnQ7IGJ1Zl9vZmYgKz0gc2l6ZW9mKHVpbnQzMl90KSkKLQkJd3JpdGVsKCooKHVpbnQzMl90ICopKGJ1ZiArIGJ1Zl9vZmYpKSwKKwlmb3IgKGJ1Zl9vZmYgPSAwOyBidWZfb2ZmIDwgY291bnQgLSBMUEZDX1JFR19XUklURV9LRVlfU0laRTsKKwkJCWJ1Zl9vZmYgKz0gc2l6ZW9mKHVpbnQzMl90KSkKKwkJd3JpdGVsKCooKHVpbnQzMl90ICopKGJ1ZiArIGJ1Zl9vZmYgKyBMUEZDX1JFR19XUklURV9LRVlfU0laRSkpLAogCQkgICAgICAgcGhiYS0+Y3RybF9yZWdzX21lbW1hcF9wICsgb2ZmICsgYnVmX29mZik7CiAKIAlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwpAQCAtNDA5Nyw4ICs0MTE0LDEwIEBACiAJc3RydWN0IFNjc2lfSG9zdCAgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7Ci0JaW50IHJjOworCUxQRkNfTUJPWFFfdCAqbWJveHE7CiAJTUFJTEJPWF90ICpwbWI7CisJdWludDMyX3QgbWJveF90bW87CisJaW50IHJjOwogCiAJaWYgKG9mZiA+IE1BSUxCT1hfQ01EX1NJWkUpCiAJCXJldHVybiAtRVJBTkdFOwpAQCAtNDEyMyw3ICs0MTQyLDggQEAKIAlpZiAob2ZmID09IDAgJiYKIAkgICAgcGhiYS0+c3lzZnNfbWJveC5zdGF0ZSAgPT0gU01CT1hfV1JJVElORyAmJgogCSAgICBwaGJhLT5zeXNmc19tYm94Lm9mZnNldCA+PSAyICogc2l6ZW9mKHVpbnQzMl90KSkgewotCQlwbWIgPSAmcGhiYS0+c3lzZnNfbWJveC5tYm94LT51Lm1iOworCQltYm94cSA9IChMUEZDX01CT1hRX3QgKikmcGhiYS0+c3lzZnNfbWJveC5tYm94OworCQlwbWIgPSAmbWJveHEtPnUubWI7CiAJCXN3aXRjaCAocG1iLT5tYnhDb21tYW5kKSB7CiAJCQkvKiBPZmZsaW5lIG9ubHkgKi8KIAkJY2FzZSBNQlhfSU5JVF9MSU5LOgpAQCAtNDIzMyw5ICs0MjUzLDggQEAKIAogCQl9IGVsc2UgewogCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQkJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0IChwaGJhLAotCQkJCQkJICAgICAgIHBoYmEtPnN5c2ZzX21ib3gubWJveCwKLQkJCQlscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBwbWItPm1ieENvbW1hbmQpICogSFopOworCQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYm94cSk7CisJCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94cSwgbWJveF90bW8pOwogCQkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJCX0KIApAQCAtNDQ4MCw5ICs0NDk5LDEwIEBACiAKIAlzcGluX2xvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwogCi0JaWYgKCh2cG9ydC0+ZmNfZmxhZyAmIEZDX0ZBQlJJQykgfHwKLQkgICAgKChwaGJhLT5mY190b3BvbG9neSA9PSBMUEZDX1RPUE9MT0dZX0xPT1ApICYmCi0JICAgICAodnBvcnQtPmZjX2ZsYWcgJiBGQ19QVUJMSUNfTE9PUCkpKQorCWlmICgodnBvcnQtPnBvcnRfc3RhdGUgPiBMUEZDX0ZMT0dJKSAmJgorCSAgICAoKHZwb3J0LT5mY19mbGFnICYgRkNfRkFCUklDKSB8fAorCSAgICAgKChwaGJhLT5mY190b3BvbG9neSA9PSBMUEZDX1RPUE9MT0dZX0xPT1ApICYmCisJICAgICAgKHZwb3J0LT5mY19mbGFnICYgRkNfUFVCTElDX0xPT1ApKSkpCiAJCW5vZGVfbmFtZSA9IHd3bl90b191NjQocGhiYS0+ZmNfZmFicGFyYW0ubm9kZU5hbWUudS53d24pOwogCWVsc2UKIAkJLyogZmFicmljIGlzIGxvY2FsIHBvcnQgaWYgdGhlcmUgaXMgbm8gRi9GTF9Qb3J0ICovCkBAIC00NTU1LDkgKzQ1NzUsMTcgQEAKIAltZW1zZXQoaHMsIDAsIHNpemVvZiAoc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcykpOwogCiAJaHMtPnR4X2ZyYW1lcyA9IHBtYi0+dW4udmFyUmRTdGF0dXMueG1pdEZyYW1lQ250OwotCWhzLT50eF93b3JkcyA9IChwbWItPnVuLnZhclJkU3RhdHVzLnhtaXRCeXRlQ250ICogMjU2KTsKKwkvKgorCSAqIFRoZSBNQlhfUkVBRF9TVEFUVVMgcmV0dXJucyB0eF9rX2J5dGVzIHdoaWNoIGhhcyB0bworCSAqIGNvbnZlcnRlZCB0byB3b3JkcworCSAqLworCWhzLT50eF93b3JkcyA9ICh1aW50NjRfdCkKKwkJCSgodWludDY0X3QpcG1iLT51bi52YXJSZFN0YXR1cy54bWl0Qnl0ZUNudAorCQkJKiAodWludDY0X3QpMjU2KTsKIAlocy0+cnhfZnJhbWVzID0gcG1iLT51bi52YXJSZFN0YXR1cy5yY3ZGcmFtZUNudDsKLQlocy0+cnhfd29yZHMgPSAocG1iLT51bi52YXJSZFN0YXR1cy5yY3ZCeXRlQ250ICogMjU2KTsKKwlocy0+cnhfd29yZHMgPSAodWludDY0X3QpCisJCQkoKHVpbnQ2NF90KXBtYi0+dW4udmFyUmRTdGF0dXMucmN2Qnl0ZUNudAorCQkJICogKHVpbnQ2NF90KTI1Nik7CiAKIAltZW1zZXQocG1ib3hxLCAwLCBzaXplb2YgKExQRkNfTUJPWFFfdCkpOwogCXBtYi0+bWJ4Q29tbWFuZCA9IE1CWF9SRUFEX0xOS19TVEFUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAppbmRleCBhNmRiNmFlLi42MGY5NTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaApAQCAtMjA5LDcgKzIwOSw3IEBACiB2b2lkIGxwZmNfbWJveF9jbXBsX3B1dChzdHJ1Y3QgbHBmY19oYmEgKiwgTFBGQ19NQk9YUV90ICopOwogaW50IGxwZmNfbWJveF9jbWRfY2hlY2soc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKIGludCBscGZjX21ib3hfZGV2X2NoZWNrKHN0cnVjdCBscGZjX2hiYSAqKTsKLWludCBscGZjX21ib3hfdG1vX3ZhbChzdHJ1Y3QgbHBmY19oYmEgKiwgaW50KTsKK2ludCBscGZjX21ib3hfdG1vX3ZhbChzdHJ1Y3QgbHBmY19oYmEgKiwgTFBGQ19NQk9YUV90ICopOwogdm9pZCBscGZjX2luaXRfdmZpKHN0cnVjdCBscGZjTWJveHEgKiwgc3RydWN0IGxwZmNfdnBvcnQgKik7CiB2b2lkIGxwZmNfcmVnX3ZmaShzdHJ1Y3QgbHBmY01ib3hxICosIHN0cnVjdCBscGZjX3Zwb3J0ICosIGRtYV9hZGRyX3QpOwogdm9pZCBscGZjX2luaXRfdnBpKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY01ib3hxICosIHVpbnQxNl90KTsKQEAgLTQ1MSwzICs0NTEsNSBAQAogLyogZnVuY3Rpb25zIHRvIHN1cHBvcnQgU1ItSU9WICovCiBpbnQgbHBmY19zbGlfcHJvYmVfc3Jpb3ZfbnJfdmlydGZuKHN0cnVjdCBscGZjX2hiYSAqLCBpbnQpOwogdWludDE2X3QgbHBmY19zbGlfc3Jpb3ZfbnJfdmlydGZuX2dldChzdHJ1Y3QgbHBmY19oYmEgKik7CitpbnQgbHBmY19zbGk0X3F1ZXVlX2NyZWF0ZShzdHJ1Y3QgbHBmY19oYmEgKik7Cit2b2lkIGxwZmNfc2xpNF9xdWV1ZV9kZXN0cm95KHN0cnVjdCBscGZjX2hiYSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYwppbmRleCA3NzliODhlLi43MDcwODFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jCkBAIC0xODU2LDYgKzE4NTYsOSBAQAogCQljYXNlIDI6CiAJCQljID0gJ0InOwogCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWMgPSAnWCc7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWMgPSAwOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCmluZGV4IGEwNDI0ZGQuLjI4MzgyNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC05OTYsNiArOTk3LDg1IEBACiAJcmV0dXJuIG5ieXRlczsKIH0KIAorc3RhdGljIGludAorbHBmY19kZWJ1Z2ZzX2RpZl9lcnJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorbHBmY19kZWJ1Z2ZzX2RpZl9lcnJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwlzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudCA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGNidWZbMTZdOworCWludCBjbnQgPSAwOworCisJaWYgKGRlbnQgPT0gcGhiYS0+ZGVidWdfd3JpdGVHdWFyZCkKKwkJY250ID0gc25wcmludGYoY2J1ZiwgMTYsICIldVxuIiwgcGhiYS0+bHBmY19pbmplcnJfd2dyZF9jbnQpOworCWVsc2UgaWYgKGRlbnQgPT0gcGhiYS0+ZGVidWdfd3JpdGVBcHApCisJCWNudCA9IHNucHJpbnRmKGNidWYsIDE2LCAiJXVcbiIsIHBoYmEtPmxwZmNfaW5qZXJyX3dhcHBfY250KTsKKwllbHNlIGlmIChkZW50ID09IHBoYmEtPmRlYnVnX3dyaXRlUmVmKQorCQljbnQgPSBzbnByaW50ZihjYnVmLCAxNiwgIiV1XG4iLCBwaGJhLT5scGZjX2luamVycl93cmVmX2NudCk7CisJZWxzZSBpZiAoZGVudCA9PSBwaGJhLT5kZWJ1Z19yZWFkQXBwKQorCQljbnQgPSBzbnByaW50ZihjYnVmLCAxNiwgIiV1XG4iLCBwaGJhLT5scGZjX2luamVycl9yYXBwX2NudCk7CisJZWxzZSBpZiAoZGVudCA9PSBwaGJhLT5kZWJ1Z19yZWFkUmVmKQorCQljbnQgPSBzbnByaW50ZihjYnVmLCAxNiwgIiV1XG4iLCBwaGJhLT5scGZjX2luamVycl9ycmVmX2NudCk7CisJZWxzZSBpZiAoZGVudCA9PSBwaGJhLT5kZWJ1Z19JbmpFcnJMQkEpCisJCWNudCA9IHNucHJpbnRmKGNidWYsIDE2LCAiMHglbHhcbiIsCisJCQkJICh1bnNpZ25lZCBsb25nKSBwaGJhLT5scGZjX2luamVycl9sYmEpOworCWVsc2UKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCSAiMDU0NyBVbmtub3duIGRlYnVnZnMgZXJyb3IgaW5qZWN0aW9uIGVudHJ5XG4iKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgJmNidWYsIGNudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitscGZjX2RlYnVnZnNfZGlmX2Vycl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwlzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudCA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGRzdGJ1ZlszMl07CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IHNpemU7CisKKwltZW1zZXQoZHN0YnVmLCAwLCAzMik7CisJc2l6ZSA9IChuYnl0ZXMgPCAzMikgPyBuYnl0ZXMgOiAzMjsKKwlpZiAoY29weV9mcm9tX3VzZXIoZHN0YnVmLCBidWYsIHNpemUpKQorCQlyZXR1cm4gMDsKKworCWlmIChzdHJpY3Rfc3RydG91bChkc3RidWYsIDAsICZ0bXApKQorCQlyZXR1cm4gMDsKKworCWlmIChkZW50ID09IHBoYmEtPmRlYnVnX3dyaXRlR3VhcmQpCisJCXBoYmEtPmxwZmNfaW5qZXJyX3dncmRfY250ID0gKHVpbnQzMl90KXRtcDsKKwllbHNlIGlmIChkZW50ID09IHBoYmEtPmRlYnVnX3dyaXRlQXBwKQorCQlwaGJhLT5scGZjX2luamVycl93YXBwX2NudCA9ICh1aW50MzJfdCl0bXA7CisJZWxzZSBpZiAoZGVudCA9PSBwaGJhLT5kZWJ1Z193cml0ZVJlZikKKwkJcGhiYS0+bHBmY19pbmplcnJfd3JlZl9jbnQgPSAodWludDMyX3QpdG1wOworCWVsc2UgaWYgKGRlbnQgPT0gcGhiYS0+ZGVidWdfcmVhZEFwcCkKKwkJcGhiYS0+bHBmY19pbmplcnJfcmFwcF9jbnQgPSAodWludDMyX3QpdG1wOworCWVsc2UgaWYgKGRlbnQgPT0gcGhiYS0+ZGVidWdfcmVhZFJlZikKKwkJcGhiYS0+bHBmY19pbmplcnJfcnJlZl9jbnQgPSAodWludDMyX3QpdG1wOworCWVsc2UgaWYgKGRlbnQgPT0gcGhiYS0+ZGVidWdfSW5qRXJyTEJBKQorCQlwaGJhLT5scGZjX2luamVycl9sYmEgPSAoc2VjdG9yX3QpdG1wOworCWVsc2UKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCSAiMDU0OCBVbmtub3duIGRlYnVnZnMgZXJyb3IgaW5qZWN0aW9uIGVudHJ5XG4iKTsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQKK2xwZmNfZGVidWdmc19kaWZfZXJyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogbHBmY19kZWJ1Z2ZzX25vZGVsaXN0X29wZW4gLSBPcGVuIHRoZSBub2RlbGlzdCBkZWJ1Z2ZzIGZpbGUKICAqIEBpbm9kZTogVGhlIGlub2RlIHBvaW50ZXIgdGhhdCBjb250YWlucyBhIHZwb3J0IHBvaW50ZXIuCkBAIC0zMzgwLDYgKzM0NjAsMTYgQEAKIAkucmVsZWFzZSA9ICAgICAgbHBmY19kZWJ1Z2ZzX2R1bXBEYXRhRGlmX3JlbGVhc2UsCiB9OwogCisjdW5kZWYgbHBmY19kZWJ1Z2ZzX29wX2RpZl9lcnIKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwZmNfZGVidWdmc19vcF9kaWZfZXJyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5vcGVuID0JCWxwZmNfZGVidWdmc19kaWZfZXJyX29wZW4sCisJLmxsc2VlayA9CWxwZmNfZGVidWdmc19sc2VlaywKKwkucmVhZCA9CQlscGZjX2RlYnVnZnNfZGlmX2Vycl9yZWFkLAorCS53cml0ZSA9CWxwZmNfZGVidWdmc19kaWZfZXJyX3dyaXRlLAorCS5yZWxlYXNlID0JbHBmY19kZWJ1Z2ZzX2RpZl9lcnJfcmVsZWFzZSwKK307CisKICN1bmRlZiBscGZjX2RlYnVnZnNfb3Bfc2xvd19yaW5nX3RyYwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHBmY19kZWJ1Z2ZzX29wX3Nsb3dfcmluZ190cmMgPSB7CiAJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLApAQCAtMzc4OCw2ICszODc4LDc0IEBACiAJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKIAkJfQogCisJCS8qIFNldHVwIERJRiBFcnJvciBJbmplY3Rpb25zICovCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIkluakVyckxCQSIpOworCQlwaGJhLT5kZWJ1Z19JbmpFcnJMQkEgPQorCQkJZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwKKwkJCXBoYmEtPmhiYV9kZWJ1Z2ZzX3Jvb3QsCisJCQlwaGJhLCAmbHBmY19kZWJ1Z2ZzX29wX2RpZl9lcnIpOworCQlpZiAoIXBoYmEtPmRlYnVnX0luakVyckxCQSkgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIwODA3IENhbm5vdCBjcmVhdGUgZGVidWdmcyBJbmpFcnJMQkFcbiIpOworCQkJZ290byBkZWJ1Z19mYWlsZWQ7CisJCX0KKwkJcGhiYS0+bHBmY19pbmplcnJfbGJhID0gTFBGQ19JTkpFUlJfTEJBX09GRjsKKworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJ3cml0ZUd1YXJkSW5qRXJyIik7CisJCXBoYmEtPmRlYnVnX3dyaXRlR3VhcmQgPQorCQkJZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwKKwkJCXBoYmEtPmhiYV9kZWJ1Z2ZzX3Jvb3QsCisJCQlwaGJhLCAmbHBmY19kZWJ1Z2ZzX29wX2RpZl9lcnIpOworCQlpZiAoIXBoYmEtPmRlYnVnX3dyaXRlR3VhcmQpIHsKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMDgwMiBDYW5ub3QgY3JlYXRlIGRlYnVnZnMgd3JpdGVHdWFyZFxuIik7CisJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKKwkJfQorCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIndyaXRlQXBwSW5qRXJyIik7CisJCXBoYmEtPmRlYnVnX3dyaXRlQXBwID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQlwaGJhLT5oYmFfZGVidWdmc19yb290LAorCQkJcGhiYSwgJmxwZmNfZGVidWdmc19vcF9kaWZfZXJyKTsKKwkJaWYgKCFwaGJhLT5kZWJ1Z193cml0ZUFwcCkgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIwODAzIENhbm5vdCBjcmVhdGUgZGVidWdmcyB3cml0ZUFwcFxuIik7CisJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKKwkJfQorCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIndyaXRlUmVmSW5qRXJyIik7CisJCXBoYmEtPmRlYnVnX3dyaXRlUmVmID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQlwaGJhLT5oYmFfZGVidWdmc19yb290LAorCQkJcGhiYSwgJmxwZmNfZGVidWdmc19vcF9kaWZfZXJyKTsKKwkJaWYgKCFwaGJhLT5kZWJ1Z193cml0ZVJlZikgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIwODA0IENhbm5vdCBjcmVhdGUgZGVidWdmcyB3cml0ZVJlZlxuIik7CisJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKKwkJfQorCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInJlYWRBcHBJbmpFcnIiKTsKKwkJcGhiYS0+ZGVidWdfcmVhZEFwcCA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLAorCQkJcGhiYS0+aGJhX2RlYnVnZnNfcm9vdCwKKwkJCXBoYmEsICZscGZjX2RlYnVnZnNfb3BfZGlmX2Vycik7CisJCWlmICghcGhiYS0+ZGVidWdfcmVhZEFwcCkgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIwODA1IENhbm5vdCBjcmVhdGUgZGVidWdmcyByZWFkQXBwXG4iKTsKKwkJCWdvdG8gZGVidWdfZmFpbGVkOworCQl9CisKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicmVhZFJlZkluakVyciIpOworCQlwaGJhLT5kZWJ1Z19yZWFkUmVmID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQlwaGJhLT5oYmFfZGVidWdmc19yb290LAorCQkJcGhiYSwgJmxwZmNfZGVidWdmc19vcF9kaWZfZXJyKTsKKwkJaWYgKCFwaGJhLT5kZWJ1Z19yZWFkUmVmKSB7CisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJIjA4MDYgQ2Fubm90IGNyZWF0ZSBkZWJ1Z2ZzIHJlYWRBcHBcbiIpOworCQkJZ290byBkZWJ1Z19mYWlsZWQ7CisJCX0KKwogCQkvKiBTZXR1cCBzbG93IHJpbmcgdHJhY2UgKi8KIAkJaWYgKGxwZmNfZGVidWdmc19tYXhfc2xvd19yaW5nX3RyYykgewogCQkJbnVtID0gbHBmY19kZWJ1Z2ZzX21heF9zbG93X3JpbmdfdHJjIC0gMTsKQEAgLTQwOTAsNiArNDI0OCwzMCBAQAogCQkJZGVidWdmc19yZW1vdmUocGhiYS0+ZGVidWdfZHVtcERpZik7IC8qIGR1bXBEaWYgKi8KIAkJCXBoYmEtPmRlYnVnX2R1bXBEaWYgPSBOVUxMOwogCQl9CisJCWlmIChwaGJhLT5kZWJ1Z19JbmpFcnJMQkEpIHsKKwkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmRlYnVnX0luakVyckxCQSk7IC8qIEluakVyckxCQSAqLworCQkJcGhiYS0+ZGVidWdfSW5qRXJyTEJBID0gTlVMTDsKKwkJfQorCQlpZiAocGhiYS0+ZGVidWdfd3JpdGVHdWFyZCkgeworCQkJZGVidWdmc19yZW1vdmUocGhiYS0+ZGVidWdfd3JpdGVHdWFyZCk7IC8qIHdyaXRlR3VhcmQgKi8KKwkJCXBoYmEtPmRlYnVnX3dyaXRlR3VhcmQgPSBOVUxMOworCQl9CisJCWlmIChwaGJhLT5kZWJ1Z193cml0ZUFwcCkgeworCQkJZGVidWdmc19yZW1vdmUocGhiYS0+ZGVidWdfd3JpdGVBcHApOyAvKiB3cml0ZUFwcCAqLworCQkJcGhiYS0+ZGVidWdfd3JpdGVBcHAgPSBOVUxMOworCQl9CisJCWlmIChwaGJhLT5kZWJ1Z193cml0ZVJlZikgeworCQkJZGVidWdmc19yZW1vdmUocGhiYS0+ZGVidWdfd3JpdGVSZWYpOyAvKiB3cml0ZVJlZiAqLworCQkJcGhiYS0+ZGVidWdfd3JpdGVSZWYgPSBOVUxMOworCQl9CisJCWlmIChwaGJhLT5kZWJ1Z19yZWFkQXBwKSB7CisJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5kZWJ1Z19yZWFkQXBwKTsgLyogcmVhZEFwcCAqLworCQkJcGhiYS0+ZGVidWdfcmVhZEFwcCA9IE5VTEw7CisJCX0KKwkJaWYgKHBoYmEtPmRlYnVnX3JlYWRSZWYpIHsKKwkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmRlYnVnX3JlYWRSZWYpOyAvKiByZWFkUmVmICovCisJCQlwaGJhLT5kZWJ1Z19yZWFkUmVmID0gTlVMTDsKKwkJfQogCiAJCWlmIChwaGJhLT5zbG93X3JpbmdfdHJjKSB7CiAJCQlrZnJlZShwaGJhLT5zbG93X3JpbmdfdHJjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCmluZGV4IDAyM2RhMGUuLjQ0NTgyNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwpAQCAtMzM4Niw3ICszMzg2LDE0IEBACiAJCQljbWRpb2NiLT5jb250ZXh0MSA9IE5VTEw7CiAJCX0KIAl9CisKKwkvKgorCSAqIFRoZSBkcml2ZXIgcmVjZWl2ZWQgYSBMT0dPIGZyb20gdGhlIHJwb3J0IGFuZCBoYXMgQUNLJ2QgaXQuCisJICogQXQgdGhpcyBwb2ludCwgdGhlIGRyaXZlciBpcyBkb25lIHNvIHJlbGVhc2UgdGhlIElPQ0IgYW5kCisJICogcmVtb3ZlIHRoZSBuZGxwIHJlZmVyZW5jZS4KKwkgKi8KIAlscGZjX2Vsc19mcmVlX2lvY2IocGhiYSwgY21kaW9jYik7CisJbHBmY19ubHBfcHV0KG5kbHApOwogCXJldHVybjsKIH0KIApAQCAtNDA4Miw5ICs0MDg5LDYgQEAKIAogCXBoYmEtPmZjX3N0YXQuZWxzWG1pdEFDQysrOwogCWVsc2lvY2ItPmlvY2JfY21wbCA9IGxwZmNfY21wbF9lbHNfcnNwOwotCWxwZmNfbmxwX3B1dChuZGxwKTsKLQllbHNpb2NiLT5jb250ZXh0MSA9IE5VTEw7ICAvKiBEb24ndCBuZWVkIG5kbHAgZm9yIGNtcGwsCi0JCQkJICAgICogaXQgY291bGQgYmUgZnJlZWQgKi8KIAogCXJjID0gbHBmY19zbGlfaXNzdWVfaW9jYihwaGJhLCBMUEZDX0VMU19SSU5HLCBlbHNpb2NiLCAwKTsKIAlpZiAocmMgPT0gSU9DQl9FUlJPUikgewpAQCAtNDE2Niw2ICs0MTcwLDExIEBACiAJcHNsaSA9ICZwaGJhLT5zbGk7CiAJY21kc2l6ZSA9IG9sZGlvY2ItPmlvY2IudW5zbGkzLnJjdnNsaTMuYWNjX2xlbjsKIAorCS8qIFRoZSBhY2N1bXVsYXRlZCBsZW5ndGggY2FuIGV4Y2VlZCB0aGUgQlBMX1NJWkUuICBGb3IKKwkgKiBub3csIHVzZSB0aGlzIGFzIHRoZSBsaW1pdAorCSAqLworCWlmIChjbWRzaXplID4gTFBGQ19CUExfU0laRSkKKwkJY21kc2l6ZSA9IExQRkNfQlBMX1NJWkU7CiAJZWxzaW9jYiA9IGxwZmNfcHJlcF9lbHNfaW9jYih2cG9ydCwgMCwgY21kc2l6ZSwgb2xkaW9jYi0+cmV0cnksIG5kbHAsCiAJCQkJICAgICBuZGxwLT5ubHBfRElELCBFTFNfQ01EX0FDQyk7CiAJaWYgKCFlbHNpb2NiKQpAQCAtNDE4OSw5ICs0MTk4LDYgQEAKIAogCXBoYmEtPmZjX3N0YXQuZWxzWG1pdEFDQysrOwogCWVsc2lvY2ItPmlvY2JfY21wbCA9IGxwZmNfY21wbF9lbHNfcnNwOwotCWxwZmNfbmxwX3B1dChuZGxwKTsKLQllbHNpb2NiLT5jb250ZXh0MSA9IE5VTEw7ICAvKiBEb24ndCBuZWVkIG5kbHAgZm9yIGNtcGwsCi0JCQkJICAgICogaXQgY291bGQgYmUgZnJlZWQgKi8KIAogCXJjID0gbHBmY19zbGlfaXNzdWVfaW9jYihwaGJhLCBMUEZDX0VMU19SSU5HLCBlbHNpb2NiLCAwKTsKIAlpZiAocmMgPT0gSU9DQl9FUlJPUikgewpAQCAtNzI1OCwxNiArNzI2NCwxMSBAQAogCWljbWQtPnVuLmVsc3JlcTY0Lm15SUQgPSAwOwogCWljbWQtPnVuLmVsc3JlcTY0LmZsID0gMTsKIAotCWlmICAoKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkgJiYKLQkgICAgIChiZl9nZXQobHBmY19zbGlfaW50Zl9pZl90eXBlLCAmcGhiYS0+c2xpNF9oYmEuc2xpX2ludGYpID09Ci0JICAgICAgTFBGQ19TTElfSU5URl9JRl9UWVBFXzApKSB7Ci0JCS8qIEZESVNDIG5lZWRzIHRvIGJlIDEgZm9yIFdRRSBWUEkgKi8KLQkJZWxzaW9jYi0+aW9jYi51bHBDdF9oID0gKFNMSTRfQ1RfVlBJID4+IDEpICYgMTsKLQkJZWxzaW9jYi0+aW9jYi51bHBDdF9sID0gU0xJNF9DVF9WUEkgJiAxIDsKLQkJLyogU2V0IHRoZSB1bHBDb250ZXh0IHRvIHRoZSB2cGkgKi8KLQkJZWxzaW9jYi0+aW9jYi51bHBDb250ZXh0ID0gcGhiYS0+dnBpX2lkc1t2cG9ydC0+dnBpXTsKLQl9IGVsc2UgewotCQkvKiBGb3IgRkRJU0MsIExldCBGRElTQyByc3Agc2V0IHRoZSBOUG9ydElEIGZvciB0aGlzIFZQSSAqLworCS8qCisJICogU0xJMyBwb3J0cyByZXF1aXJlIGEgZGlmZmVyZW50IGNvbnRleHQgdHlwZSB2YWx1ZSB0aGFuIFNMSTQuCisJICogQ2F0Y2ggU0xJMyBwb3J0cyBoZXJlIGFuZCBvdmVycmlkZSB0aGUgcHJlcC4KKwkgKi8KKwlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVYzKSB7CiAJCWljbWQtPnVscEN0X2ggPSAxOwogCQlpY21kLT51bHBDdF9sID0gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jCmluZGV4IDBiNDdhZGYuLjA5MWY2OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jCkBAIC0xNDEyLDcgKzE0MTIsNyBAQAogCQlpZiAocGhiYS0+cHBvcnQtPnBvcnRfc3RhdGUgIT0gTFBGQ19GTE9HSSkgewogCQkJcGhiYS0+aGJhX2ZsYWcgfD0gRkNGX1JSX0lOUFJPRzsKIAkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JCQlscGZjX2lzc3VlX2luaXRfdmZpKHBoYmEtPnBwb3J0KTsKKwkJCWxwZmNfaW5pdGlhbF9mbG9naShwaGJhLT5wcG9ydCk7CiAJCQlyZXR1cm47CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKQEAgLTI2NDYsNyArMjY0Niw5IEBACiB7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gbWJveHEtPnZwb3J0OwogCi0JaWYgKG1ib3hxLT51Lm1iLm1ieFN0YXR1cyAmJiAobWJveHEtPnUubWIubWJ4U3RhdHVzICE9IDB4NDAwMikpIHsKKwkvKiBWRkkgbm90IHN1cHBvcnRlZCBvbiBpbnRlcmZhY2UgdHlwZSAwLCBqdXN0IGRvIHRoZSBmbG9naSAqLworCWlmIChtYm94cS0+dS5tYi5tYnhTdGF0dXMgJiYgKGJmX2dldChscGZjX3NsaV9pbnRmX2lmX3R5cGUsCisJICAgICZwaGJhLT5zbGk0X2hiYS5zbGlfaW50ZikgIT0gTFBGQ19TTElfSU5URl9JRl9UWVBFXzApKSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLAogCQkJCUxPR19NQk9YLAogCQkJCSIyODkxIEluaXQgVkZJIG1haWxib3ggZmFpbGVkIDB4JXhcbiIsCkBAIC0yNjU1LDYgKzI2NTcsNyBAQAogCQlscGZjX3Zwb3J0X3NldF9zdGF0ZSh2cG9ydCwgRkNfVlBPUlRfRkFJTEVEKTsKIAkJcmV0dXJuOwogCX0KKwogCWxwZmNfaW5pdGlhbF9mbG9naSh2cG9ydCk7CiAJbWVtcG9vbF9mcmVlKG1ib3hxLCBwaGJhLT5tYm94X21lbV9wb29sKTsKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaAppbmRleCA3ZjgwMDNiLi45OGQyMTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHc0LmgKQEAgLTQxLDYgKzQxLDggQEAKICAqIE9yIGNsZWFyIHRoYXQgYml0IGZpZWxkOgogICoJYmZfc2V0KGV4YW1wbGVfYml0X2ZpZWxkLCAmdDEsIDApOwogICovCisjZGVmaW5lIGJmX2dldF9iZTMyKG5hbWUsIHB0cikgXAorCSgoYmUzMl90b19jcHUoKHB0ciktPm5hbWUjI19XT1JEKSA+PiBuYW1lIyNfU0hJRlQpICYgbmFtZSMjX01BU0spCiAjZGVmaW5lIGJmX2dldF9sZTMyKG5hbWUsIHB0cikgXAogCSgobGUzMl90b19jcHUoKHB0ciktPm5hbWUjI19XT1JEKSA+PiBuYW1lIyNfU0hJRlQpICYgbmFtZSMjX01BU0spCiAjZGVmaW5lIGJmX2dldChuYW1lLCBwdHIpIFwKQEAgLTY3OCw3ICs2ODAsNiBAQAogI2RlZmluZSBscGZjX3JxX2Rvb3JiZWxsX251bV9wb3N0ZWRfU0hJRlQJMTYKICNkZWZpbmUgbHBmY19ycV9kb29yYmVsbF9udW1fcG9zdGVkX01BU0sJMHgzRkZGCiAjZGVmaW5lIGxwZmNfcnFfZG9vcmJlbGxfbnVtX3Bvc3RlZF9XT1JECXdvcmQwCi0jZGVmaW5lIExQRkNfUlFfUE9TVF9CQVRDSAkJOAkvKiBSUUVzIHRvIHBvc3QgYXQgb25lIHRpbWUgKi8KICNkZWZpbmUgbHBmY19ycV9kb29yYmVsbF9pZF9TSElGVAkJMAogI2RlZmluZSBscGZjX3JxX2Rvb3JiZWxsX2lkX01BU0sJCTB4RkZGRgogI2RlZmluZSBscGZjX3JxX2Rvb3JiZWxsX2lkX1dPUkQJCXdvcmQwCkBAIC03ODQsNiArNzg1LDggQEAKICNkZWZpbmUgTFBGQ19RX0NSRUFURV9WRVJTSU9OXzIJMgogI2RlZmluZSBMUEZDX1FfQ1JFQVRFX1ZFUlNJT05fMQkxCiAjZGVmaW5lIExQRkNfUV9DUkVBVEVfVkVSU0lPTl8wCTAKKyNkZWZpbmUgTFBGQ19PUENPREVfVkVSU0lPTl8wCTAKKyNkZWZpbmUgTFBGQ19PUENPREVfVkVSU0lPTl8xCTEKIAl9IHJlcXVlc3Q7CiAJc3RydWN0IHsKIAkJdWludDMyX3Qgd29yZDY7CkBAIC04MjUsNiArODI4LDcgQEAKICNkZWZpbmUgTFBGQ19FWFRFTlRfVkVSU0lPTl9ERUZBVUxUCTAKIAogLyogU3Vic3lzdGVtIERlZmluaXRpb25zICovCisjZGVmaW5lIExQRkNfTUJPWF9TVUJTWVNURU1fTkEJCTB4MAogI2RlZmluZSBMUEZDX01CT1hfU1VCU1lTVEVNX0NPTU1PTgkweDEKICNkZWZpbmUgTFBGQ19NQk9YX1NVQlNZU1RFTV9GQ09FCTB4QwogCkBAIC04MzUsMjUgKzgzOSwzNCBAQAogI2RlZmluZSBIT1NUX0VORElBTl9ISUdIX1dPUkQxCTB4RkY3ODU2RkYKIAogLyogQ29tbW9uIE9wY29kZXMgKi8KLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9DUV9DUkVBVEUJCTB4MEMKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9FUV9DUkVBVEUJCTB4MEQKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9NUV9DUkVBVEUJCTB4MTUKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9HRVRfQ05UTF9BVFRSSUJVVEVTCTB4MjAKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9OT1AJCQkweDIxCi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfTVFfREVTVFJPWQkJMHgzNQotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0NRX0RFU1RST1kJCTB4MzYKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9FUV9ERVNUUk9ZCQkweDM3Ci0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfUVVFUllfRldfQ0ZHCQkweDNBCi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRlVOQ1RJT05fUkVTRVQJCTB4M0QKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9NUV9DUkVBVEVfRVhUCQkweDVBCi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX1JTUkNfRVhURU5UX0lORk8JMHg5QQotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9BTExPQ19SU1JDX0VYVEVOVAkweDlCCi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfQUxMT0NfUlNSQ19FWFRFTlQJMHg5QwotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0RFQUxMT0NfUlNSQ19FWFRFTlQJMHg5RAotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9GVU5DVElPTl9DT05GSUcgICAgMHhBMAotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9QUk9GSUxFX0NPTkZJRwkweEE0Ci0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfV1JJVEVfT0JKRUNUCQkweEFDCi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX1NMSTRfUEFSQU1FVEVSUwkweEI1CisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfTkEJCQkJMHgwMAorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0NRX0NSRUFURQkJCTB4MEMKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9FUV9DUkVBVEUJCQkweDBECisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfTVFfQ1JFQVRFCQkJMHgxNQorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9DTlRMX0FUVFJJQlVURVMJCTB4MjAKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9OT1AJCQkJMHgyMQorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX01RX0RFU1RST1kJCQkweDM1CisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfQ1FfREVTVFJPWQkJCTB4MzYKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9FUV9ERVNUUk9ZCQkJMHgzNworI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX1FVRVJZX0ZXX0NGRwkJCTB4M0EKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9GVU5DVElPTl9SRVNFVAkJCTB4M0QKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9HRVRfUE9SVF9OQU1FCQkJMHg0RAorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX01RX0NSRUFURV9FWFQJCQkweDVBCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX1JTUkNfRVhURU5UX0lORk8JCTB4OUEKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9HRVRfQUxMT0NfUlNSQ19FWFRFTlQJCTB4OUIKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9BTExPQ19SU1JDX0VYVEVOVAkJMHg5QworI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0RFQUxMT0NfUlNSQ19FWFRFTlQJCTB4OUQKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9HRVRfRlVOQ1RJT05fQ09ORklHCQkweEEwCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX1BST0ZJTEVfQ09ORklHCQkweEE0CisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfU0VUX1BST0ZJTEVfQ09ORklHCQkweEE1CisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX1BST0ZJTEVfTElTVAkJMHhBNgorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX1NFVF9BQ1RfUFJPRklMRQkJMHhBOAorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9GQUNUT1JZX1BST0ZJTEVfQ09ORklHCTB4QTkKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9SRUFEX09CSkVDVAkJCTB4QUIKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9XUklURV9PQkpFQ1QJCQkweEFDCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfUkVBRF9PQkpFQ1RfTElTVAkJMHhBRAorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0RFTEVURV9PQkpFQ1QJCQkweEFFCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX1NMSTRfUEFSQU1FVEVSUwkJMHhCNQogCiAvKiBGQ29FIE9wY29kZXMgKi8KICNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9GQ09FX1dRX0NSRUFURQkJCTB4MDEKQEAgLTg2Nyw2ICs4ODAsNyBAQAogI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0ZDT0VfREVMRVRFX0ZDRgkJMHgwQQogI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0ZDT0VfUE9TVF9IRFJfVEVNUExBVEUJCTB4MEIKICNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9GQ09FX1JFRElTQ09WRVJfRkNGCQkweDEwCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRkNPRV9TRVRfRkNMSU5LX1NFVFRJTkdTCTB4MjEKICNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9GQ09FX0xJTktfRElBR19TVEFURQkJMHgyMgogI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0ZDT0VfTElOS19ESUFHX0xPT1BCQUNLCTB4MjMKIApAQCAtMTQ3MCwxNiArMTQ4NCw4MSBAQAogCXVpbnQzMl90IGFkZHJfbG87CiAKIAl1aW50MzJfdCB3b3JkMjsKLSNkZWZpbmUgbHBmY19zbGk0X3NnZV9vZmZzZXRfU0hJRlQJMCAvKiBPZmZzZXQgb2YgYnVmZmVyIC0gTm90IHVzZWQqLwotI2RlZmluZSBscGZjX3NsaTRfc2dlX29mZnNldF9NQVNLCTB4MUZGRkZGRkYKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9vZmZzZXRfU0hJRlQJMAorI2RlZmluZSBscGZjX3NsaTRfc2dlX29mZnNldF9NQVNLCTB4MDdGRkZGRkYKICNkZWZpbmUgbHBmY19zbGk0X3NnZV9vZmZzZXRfV09SRAl3b3JkMgotI2RlZmluZSBscGZjX3NsaTRfc2dlX2xhc3RfU0hJRlQJMzEgLyogTGFzdCBTRUcgaW4gdGhlIFNHTCBzZXRzCi0JCQkJCQl0aGlzICBmbGFnICEhICovCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfdHlwZV9TSElGVAkyNworI2RlZmluZSBscGZjX3NsaTRfc2dlX3R5cGVfTUFTSwkJMHgwMDAwMDAwRgorI2RlZmluZSBscGZjX3NsaTRfc2dlX3R5cGVfV09SRAkJd29yZDIKKyNkZWZpbmUgTFBGQ19TR0VfVFlQRV9EQVRBCQkweDAKKyNkZWZpbmUgTFBGQ19TR0VfVFlQRV9ESUYJCTB4NAorI2RlZmluZSBMUEZDX1NHRV9UWVBFX0xTUAkJMHg1CisjZGVmaW5lIExQRkNfU0dFX1RZUEVfUEVESUYJCTB4NgorI2RlZmluZSBMUEZDX1NHRV9UWVBFX1BFU0VFRAkJMHg3CisjZGVmaW5lIExQRkNfU0dFX1RZUEVfRElTRUVECQkweDgKKyNkZWZpbmUgTFBGQ19TR0VfVFlQRV9FTkMJCTB4OQorI2RlZmluZSBMUEZDX1NHRV9UWVBFX0FUTQkJMHhBCisjZGVmaW5lIExQRkNfU0dFX1RZUEVfU0tJUAkJMHhDCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfbGFzdF9TSElGVAkzMSAvKiBMYXN0IFNFRyBpbiB0aGUgU0dMIHNldHMgaXQgKi8KICNkZWZpbmUgbHBmY19zbGk0X3NnZV9sYXN0X01BU0sJCTB4MDAwMDAwMDEKICNkZWZpbmUgbHBmY19zbGk0X3NnZV9sYXN0X1dPUkQJCXdvcmQyCiAJdWludDMyX3Qgc2dlX2xlbjsKIH07CiAKK3N0cnVjdCBzbGk0X3NnZV9kaXNlZWQgewkvKiBTTEktNCAqLworCXVpbnQzMl90IHJlZl90YWc7CisJdWludDMyX3QgcmVmX3RhZ190cmFuOworCisJdWludDMyX3Qgd29yZDI7CisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FwcHRyYW5fU0hJRlQJMAorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9hcHB0cmFuX01BU0sJMHgwMDAwRkZGRgorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9hcHB0cmFuX1dPUkQJd29yZDIKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfYWZfU0hJRlQJMjQKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfYWZfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FmX1dPUkQJd29yZDIKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfbmFfU0hJRlQJMjUKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfbmFfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX25hX1dPUkQJd29yZDIKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfaGlfU0hJRlQJMjYKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfaGlfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2hpX1dPUkQJd29yZDIKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfdHlwZV9TSElGVAkyNworI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl90eXBlX01BU0sJMHgwMDAwMDAwRgorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl90eXBlX1dPUkQJd29yZDIKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfbGFzdF9TSElGVAkzMSAvKiBMYXN0IFNFRyBpbiB0aGUgU0dMIHNldHMgaXQgKi8KKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfbGFzdF9NQVNLCTB4MDAwMDAwMDEKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfbGFzdF9XT1JECXdvcmQyCisJdWludDMyX3Qgd29yZDM7CisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FwcHRhZ19TSElGVAkwCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FwcHRhZ19NQVNLCTB4MDAwMEZGRkYKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfYXBwdGFnX1dPUkQJd29yZDMKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfYnNfU0hJRlQJMTYKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfYnNfTUFTSwkweDAwMDAwMDA3CisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2JzX1dPUkQJd29yZDMKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfYWlfU0hJRlQJMTkKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfYWlfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FpX1dPUkQJd29yZDMKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfbWVfU0hJRlQJMjAKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfbWVfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX21lX1dPUkQJd29yZDMKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfcmVfU0hJRlQJMjEKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfcmVfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX3JlX1dPUkQJd29yZDMKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfY2VfU0hJRlQJMjIKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfY2VfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2NlX1dPUkQJd29yZDMKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfbnJfU0hJRlQJMjMKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfbnJfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX25yX1dPUkQJd29yZDMKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfb3ByeF9TSElGVAkyNAorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9vcHJ4X01BU0sJMHgwMDAwMDAwRgorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9vcHJ4X1dPUkQJd29yZDMKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfb3B0eF9TSElGVAkyOAorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9vcHR4X01BU0sJMHgwMDAwMDAwRgorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9vcHR4X1dPUkQJd29yZDMKKy8qIG9wdHggYW5kIG9wcnggdXNlIEJHX09QX0lOIGRlZmluZXMgaW4gbHBmY19ody5oICovCit9OworCiBzdHJ1Y3QgZmNmX3JlY29yZCB7CiAJdWludDMyX3QgbWF4X3Jjdl9zaXplOwogCXVpbnQzMl90IGZrYV9hZHZfcGVyaW9kOwpAQCAtMjAxOSw2ICsyMDk4LDE1IEBACiAjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfZXh0bnRzX2ludXNlX01BU0sJMHgwMDAwMDAwMQogI2RlZmluZSBscGZjX21ieF9yZF9jb25mX2V4dG50c19pbnVzZV9XT1JECXdvcmQxCiAJdWludDMyX3Qgd29yZDI7CisjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfbG5rX251bWJfU0hJRlQJCTAKKyNkZWZpbmUgbHBmY19tYnhfcmRfY29uZl9sbmtfbnVtYl9NQVNLCQkweDAwMDAwMDNGCisjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfbG5rX251bWJfV09SRAkJd29yZDIKKyNkZWZpbmUgbHBmY19tYnhfcmRfY29uZl9sbmtfdHlwZV9TSElGVAkJNgorI2RlZmluZSBscGZjX21ieF9yZF9jb25mX2xua190eXBlX01BU0sJCTB4MDAwMDAwMDMKKyNkZWZpbmUgbHBmY19tYnhfcmRfY29uZl9sbmtfdHlwZV9XT1JECQl3b3JkMgorI2RlZmluZSBscGZjX21ieF9yZF9jb25mX2xua19sZHZfU0hJRlQJCTgKKyNkZWZpbmUgbHBmY19tYnhfcmRfY29uZl9sbmtfbGR2X01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgbHBmY19tYnhfcmRfY29uZl9sbmtfbGR2X1dPUkQJCXdvcmQyCiAjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfdG9wb2xvZ3lfU0hJRlQJCTI0CiAjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfdG9wb2xvZ3lfTUFTSwkJMHgwMDAwMDBGRgogI2RlZmluZSBscGZjX21ieF9yZF9jb25mX3RvcG9sb2d5X1dPUkQJCXdvcmQyCkBAIC0yNTUyLDggKzI2NDAsMTUyIEBACiAJfSB1OwogfTsKIAorc3RydWN0IGxwZmNfY29udHJvbGxlcl9hdHRyaWJ1dGUgeworCXVpbnQzMl90IHZlcnNpb25fc3RyaW5nWzhdOworCXVpbnQzMl90IG1hbnVmYWN0dXJlcl9uYW1lWzhdOworCXVpbnQzMl90IHN1cHBvcnRlZF9tb2RlczsKKwl1aW50MzJfdCB3b3JkMTc7CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2Vwcm9tX3Zlcl9sb19TSElGVAkwCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2Vwcm9tX3Zlcl9sb19NQVNLCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZXByb21fdmVyX2xvX1dPUkQJd29yZDE3CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2Vwcm9tX3Zlcl9oaV9TSElGVAk4CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2Vwcm9tX3Zlcl9oaV9NQVNLCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZXByb21fdmVyX2hpX1dPUkQJd29yZDE3CisJdWludDMyX3QgbWJ4X2RhX3N0cnVjdF92ZXI7CisJdWludDMyX3QgZXBfZndfZGFfc3RydWN0X3ZlcjsKKwl1aW50MzJfdCBuY3NpX3Zlcl9zdHJbM107CisJdWludDMyX3QgZGZsdF9leHRfdGltZW91dDsKKwl1aW50MzJfdCBtb2RlbF9udW1iZXJbOF07CisJdWludDMyX3QgZGVzY3JpcHRpb25bMTZdOworCXVpbnQzMl90IHNlcmlhbF9udW1iZXJbOF07CisJdWludDMyX3QgaXBfdmVyX3N0cls4XTsKKwl1aW50MzJfdCBmd192ZXJfc3RyWzhdOworCXVpbnQzMl90IGJpb3NfdmVyX3N0cls4XTsKKwl1aW50MzJfdCByZWRib290X3Zlcl9zdHJbOF07CisJdWludDMyX3QgZHJpdmVyX3Zlcl9zdHJbOF07CisJdWludDMyX3QgZmxhc2hfZndfdmVyX3N0cls4XTsKKwl1aW50MzJfdCBmdW5jdGlvbmFsaXR5OworCXVpbnQzMl90IHdvcmQxMDU7CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX21heF9jYmRfbGVuX1NISUZUCTAKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbWF4X2NiZF9sZW5fTUFTSwkJMHgwMDAwZmZmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9tYXhfY2JkX2xlbl9XT1JECQl3b3JkMTA1CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2FzaWNfcmV2X1NISUZUCQkxNgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9hc2ljX3Jldl9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2FzaWNfcmV2X1dPUkQJCXdvcmQxMDUKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZ2VuX2d1aWQwX1NISUZUCQkyNAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9nZW5fZ3VpZDBfTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9nZW5fZ3VpZDBfV09SRAkJd29yZDEwNQorCXVpbnQzMl90IGdlbl9ndWlkMV8xMlszXTsKKwl1aW50MzJfdCB3b3JkMTA5OworI2RlZmluZSBscGZjX2NudGxfYXR0cl9nZW5fZ3VpZDEzXzE0X1NISUZUCTAKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZ2VuX2d1aWQxM18xNF9NQVNLCTB4MDAwMGZmZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZ2VuX2d1aWQxM18xNF9XT1JECXdvcmQxMDkKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZ2VuX2d1aWQxNV9TSElGVAkJMTYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZ2VuX2d1aWQxNV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2dlbl9ndWlkMTVfV09SRAkJd29yZDEwOQorI2RlZmluZSBscGZjX2NudGxfYXR0cl9oYmFfcG9ydF9jbnRfU0hJRlQJMjQKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfaGJhX3BvcnRfY250X01BU0sJMHgwMDAwMDBmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9oYmFfcG9ydF9jbnRfV09SRAl3b3JkMTA5CisJdWludDMyX3Qgd29yZDExMDsKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZGZsdF9sbmtfdG1vX1NISUZUCTAKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZGZsdF9sbmtfdG1vX01BU0sJMHgwMDAwZmZmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9kZmx0X2xua190bW9fV09SRAl3b3JkMTEwCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX211bHRpX2Z1bmNfZGV2X1NISUZUCTI0CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX211bHRpX2Z1bmNfZGV2X01BU0sJMHgwMDAwMDBmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9tdWx0aV9mdW5jX2Rldl9XT1JECXdvcmQxMTAKKwl1aW50MzJfdCB3b3JkMTExOworI2RlZmluZSBscGZjX2NudGxfYXR0cl9jYWNoZV92YWxpZF9TSElGVAkwCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2NhY2hlX3ZhbGlkX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfY2FjaGVfdmFsaWRfV09SRAkJd29yZDExMQorI2RlZmluZSBscGZjX2NudGxfYXR0cl9oYmFfc3RhdHVzX1NISUZUCQk4CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2hiYV9zdGF0dXNfTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9oYmFfc3RhdHVzX1dPUkQJCXdvcmQxMTEKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbWF4X2RvbWFpbl9TSElGVAkJMTYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbWF4X2RvbWFpbl9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX21heF9kb21haW5fV09SRAkJd29yZDExMQorI2RlZmluZSBscGZjX2NudGxfYXR0cl9sbmtfbnVtYl9TSElGVAkJMjQKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbG5rX251bWJfTUFTSwkJMHgwMDAwMDAzZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9sbmtfbnVtYl9XT1JECQl3b3JkMTExCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2xua190eXBlX1NISUZUCQkzMAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9sbmtfdHlwZV9NQVNLCQkweDAwMDAwMDAzCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2xua190eXBlX1dPUkQJCXdvcmQxMTEKKwl1aW50MzJfdCBmd19wb3N0X3N0YXR1czsKKwl1aW50MzJfdCBoYmFfbXR1WzhdOworCXVpbnQzMl90IHdvcmQxMjE7CisJdWludDMyX3QgcmVzZXJ2ZWQxWzNdOworCXVpbnQzMl90IHdvcmQxMjU7CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV92ZW5kb3JfaWRfU0hJRlQJMAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfdmVuZG9yX2lkX01BU0sJMHgwMDAwZmZmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfdmVuZG9yX2lkX1dPUkQJd29yZDEyNQorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfZGV2aWNlX2lkX1NISUZUCTE2CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9kZXZpY2VfaWRfTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9kZXZpY2VfaWRfV09SRAl3b3JkMTI1CisJdWludDMyX3Qgd29yZDEyNjsKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX3N1YnZkcl9pZF9TSElGVAkwCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9zdWJ2ZHJfaWRfTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9zdWJ2ZHJfaWRfV09SRAl3b3JkMTI2CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9zdWJzeXNfaWRfU0hJRlQJMTYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX3N1YnN5c19pZF9NQVNLCTB4MDAwMGZmZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX3N1YnN5c19pZF9XT1JECXdvcmQxMjYKKwl1aW50MzJfdCB3b3JkMTI3OworI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfYnVzX251bV9TSElGVAkwCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9idXNfbnVtX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX2J1c19udW1fV09SRAkJd29yZDEyNworI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfZGV2X251bV9TSElGVAk4CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9kZXZfbnVtX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX2Rldl9udW1fV09SRAkJd29yZDEyNworI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfZm5jX251bV9TSElGVAkxNgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfZm5jX251bV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9mbmNfbnVtX1dPUkQJCXdvcmQxMjcKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfaW5mX3R5cGVfU0hJRlQJCTI0CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2luZl90eXBlX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfaW5mX3R5cGVfV09SRAkJd29yZDEyNworCXVpbnQzMl90IHVuaXF1ZV9pZFsyXTsKKwl1aW50MzJfdCB3b3JkMTMwOworI2RlZmluZSBscGZjX2NudGxfYXR0cl9udW1fbmV0ZmlsX1NISUZUCQkwCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX251bV9uZXRmaWxfTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9udW1fbmV0ZmlsX1dPUkQJCXdvcmQxMzAKKwl1aW50MzJfdCByZXNlcnZlZDJbNF07Cit9OworCitzdHJ1Y3QgbHBmY19tYnhfZ2V0X2NudGxfYXR0cmlidXRlcyB7CisJdW5pb24gIGxwZmNfc2xpNF9jZmdfc2hkciBjZmdfc2hkcjsKKwlzdHJ1Y3QgbHBmY19jb250cm9sbGVyX2F0dHJpYnV0ZSBjbnRsX2F0dHI7Cit9OworCitzdHJ1Y3QgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZSB7CisJc3RydWN0IG1ib3hfaGVhZGVyIGhlYWRlcjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCB3b3JkNDsKKyNkZWZpbmUgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9sbmtfdHlwZV9TSElGVAkwCisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbG5rX3R5cGVfTUFTSwkweDAwMDAwMDAzCisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbG5rX3R5cGVfV09SRAl3b3JkNAorCQl9IHJlcXVlc3Q7CisJCXN0cnVjdCB7CisJCQl1aW50MzJfdCB3b3JkNDsKKyNkZWZpbmUgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lMF9TSElGVAkwCisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTBfTUFTSwkweDAwMDAwMEZGCisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTBfV09SRAl3b3JkNAorI2RlZmluZSBscGZjX21ieF9nZXRfcG9ydF9uYW1lX25hbWUxX1NISUZUCTgKKyNkZWZpbmUgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lMV9NQVNLCTB4MDAwMDAwRkYKKyNkZWZpbmUgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lMV9XT1JECXdvcmQ0CisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTJfU0hJRlQJMTYKKyNkZWZpbmUgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lMl9NQVNLCTB4MDAwMDAwRkYKKyNkZWZpbmUgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lMl9XT1JECXdvcmQ0CisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTNfU0hJRlQJMjQKKyNkZWZpbmUgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lM19NQVNLCTB4MDAwMDAwRkYKKyNkZWZpbmUgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lM19XT1JECXdvcmQ0CisjZGVmaW5lIExQRkNfTElOS19OVU1CRVJfMAkJCTAKKyNkZWZpbmUgTFBGQ19MSU5LX05VTUJFUl8xCQkJMQorI2RlZmluZSBMUEZDX0xJTktfTlVNQkVSXzIJCQkyCisjZGVmaW5lIExQRkNfTElOS19OVU1CRVJfMwkJCTMKKwkJfSByZXNwb25zZTsKKwl9IHU7Cit9OworCiAvKiBNYWlsYm94IENvbXBsZXRpb24gUXVldWUgRXJyb3IgTWVzc2FnZXMgKi8KLSNkZWZpbmUgTUJfQ1FFX1NUQVRVU19TVUNDRVNTIAkJCTB4MAorI2RlZmluZSBNQl9DUUVfU1RBVFVTX1NVQ0NFU1MJCQkweDAKICNkZWZpbmUgTUJfQ1FFX1NUQVRVU19JTlNVRkZJQ0lFTlRfUFJJVklMRUdFUwkweDEKICNkZWZpbmUgTUJfQ1FFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUgkJMHgyCiAjZGVmaW5lIE1CX0NRRV9TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUwkweDMKQEAgLTI2MzcsOCArMjg2OSw5IEBACiAJCXN0cnVjdCBscGZjX21ieF9ydW5fbGlua19kaWFnX3Rlc3QgbGlua19kaWFnX3Rlc3Q7CiAJCXN0cnVjdCBscGZjX21ieF9nZXRfZnVuY19jZmcgZ2V0X2Z1bmNfY2ZnOwogCQlzdHJ1Y3QgbHBmY19tYnhfZ2V0X3Byb2ZfY2ZnIGdldF9wcm9mX2NmZzsKLQkJc3RydWN0IGxwZmNfbWJ4X25vcCBub3A7CiAJCXN0cnVjdCBscGZjX21ieF93cl9vYmplY3Qgd3Jfb2JqZWN0OworCQlzdHJ1Y3QgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZSBnZXRfcG9ydF9uYW1lOworCQlzdHJ1Y3QgbHBmY19tYnhfbm9wIG5vcDsKIAl9IHVuOwogfTsKIApAQCAtMjg1NSw2ICszMDg4LDkgQEAKICNkZWZpbmUgd3FlX2N0eHRfdGFnX01BU0sgICAgIDB4MDAwMEZGRkYKICNkZWZpbmUgd3FlX2N0eHRfdGFnX1dPUkQgICAgIHdvcmQ2CiAJdWludDMyX3Qgd29yZDc7CisjZGVmaW5lIHdxZV9kaWZfU0hJRlQgICAgICAgICAwCisjZGVmaW5lIHdxZV9kaWZfTUFTSyAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHdxZV9kaWZfV09SRCAgICAgICAgICB3b3JkNwogI2RlZmluZSB3cWVfY3RfU0hJRlQgICAgICAgICAgMgogI2RlZmluZSB3cWVfY3RfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMwogI2RlZmluZSB3cWVfY3RfV09SRCAgICAgICAgICAgd29yZDcKQEAgLTI4NjcsMTIgKzMxMDMsMjEgQEAKICNkZWZpbmUgd3FlX2NsYXNzX1NISUZUICAgICAgIDE2CiAjZGVmaW5lIHdxZV9jbGFzc19NQVNLICAgICAgICAweDAwMDAwMDA3CiAjZGVmaW5lIHdxZV9jbGFzc19XT1JEICAgICAgICB3b3JkNworI2RlZmluZSB3cWVfYXJfU0hJRlQgICAgICAgICAgMTkKKyNkZWZpbmUgd3FlX2FyX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgd3FlX2FyX1dPUkQgICAgICAgICAgIHdvcmQ3CisjZGVmaW5lIHdxZV9hZ19TSElGVCAgICAgICAgICB3cWVfYXJfU0hJRlQKKyNkZWZpbmUgd3FlX2FnX01BU0sgICAgICAgICAgIHdxZV9hcl9NQVNLCisjZGVmaW5lIHdxZV9hZ19XT1JEICAgICAgICAgICB3cWVfYXJfV09SRAogI2RlZmluZSB3cWVfcHVfU0hJRlQgICAgICAgICAgMjAKICNkZWZpbmUgd3FlX3B1X01BU0sgICAgICAgICAgIDB4MDAwMDAwMDMKICNkZWZpbmUgd3FlX3B1X1dPUkQgICAgICAgICAgIHdvcmQ3CiAjZGVmaW5lIHdxZV9lcnBfU0hJRlQgICAgICAgICAyMgogI2RlZmluZSB3cWVfZXJwX01BU0sgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSB3cWVfZXJwX1dPUkQgICAgICAgICAgd29yZDcKKyNkZWZpbmUgd3FlX2NvbmZfU0hJRlQgICAgICAgIHdxZV9lcnBfU0hJRlQKKyNkZWZpbmUgd3FlX2NvbmZfTUFTSyAgICAgICAgIHdxZV9lcnBfTUFTSworI2RlZmluZSB3cWVfY29uZl9XT1JEICAgICAgICAgd3FlX2VycF9XT1JECiAjZGVmaW5lIHdxZV9sbmtfU0hJRlQgICAgICAgICAyMwogI2RlZmluZSB3cWVfbG5rX01BU0sgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSB3cWVfbG5rX1dPUkQgICAgICAgICAgd29yZDcKQEAgLTI5MzEsNiArMzE3Niw5IEBACiAjZGVmaW5lIHdxZV94Y19TSElGVCAgICAgICAgICAyMQogI2RlZmluZSB3cWVfeGNfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSB3cWVfeGNfV09SRCAgICAgICAgICAgd29yZDEwCisjZGVmaW5lIHdxZV9zcl9TSElGVCAgICAgICAgICAyMgorI2RlZmluZSB3cWVfc3JfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSB3cWVfc3JfV09SRCAgICAgICAgICAgd29yZDEwCiAjZGVmaW5lIHdxZV9jY3BlX1NISUZUICAgICAgICAyMwogI2RlZmluZSB3cWVfY2NwZV9NQVNLICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSB3cWVfY2NwZV9XT1JEICAgICAgICAgd29yZDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jCmluZGV4IGEzYzgyMDAuLjU1YmM0ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTU4LDggKzU5LDcgQEAKIAogc3RhdGljIHZvaWQgbHBmY19nZXRfaGJhX21vZGVsX2Rlc2Moc3RydWN0IGxwZmNfaGJhICosIHVpbnQ4X3QgKiwgdWludDhfdCAqKTsKIHN0YXRpYyBpbnQgbHBmY19wb3N0X3Jjdl9idWYoc3RydWN0IGxwZmNfaGJhICopOwotc3RhdGljIGludCBscGZjX3NsaTRfcXVldWVfY3JlYXRlKHN0cnVjdCBscGZjX2hiYSAqKTsKLXN0YXRpYyB2b2lkIGxwZmNfc2xpNF9xdWV1ZV9kZXN0cm95KHN0cnVjdCBscGZjX2hiYSAqKTsKK3N0YXRpYyBpbnQgbHBmY19zbGk0X3F1ZXVlX3ZlcmlmeShzdHJ1Y3QgbHBmY19oYmEgKik7CiBzdGF0aWMgaW50IGxwZmNfY3JlYXRlX2Jvb3RzdHJhcF9tYm94KHN0cnVjdCBscGZjX2hiYSAqKTsKIHN0YXRpYyBpbnQgbHBmY19zZXR1cF9lbmRpYW5fb3JkZXIoc3RydWN0IGxwZmNfaGJhICopOwogc3RhdGljIGludCBscGZjX3NsaTRfcmVhZF9jb25maWcoc3RydWN0IGxwZmNfaGJhICopOwpAQCAtMTQzOCw2ICsxNDM4LDcgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAl1aW50MzJfdCBpZl90eXBlOwogCXN0cnVjdCBscGZjX3JlZ2lzdGVyIHBvcnRzdGF0X3JlZzsKKwlpbnQgcmM7CiAKIAkvKiBJZiB0aGUgcGNpIGNoYW5uZWwgaXMgb2ZmbGluZSwgaWdub3JlIHBvc3NpYmxlIGVycm9ycywgc2luY2UKIAkgKiB3ZSBjYW5ub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgcGNpIGNhcmQgYW55d2F5LgpAQCAtMTQ4MCwxNiArMTQ4MSwyNCBAQAogCQkJbHBmY19zbGk0X29mZmxpbmVfZXJhdHQocGhiYSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJaWYgKGJmX2dldChscGZjX3NsaXBvcnRfc3RhdHVzX3JuLCAmcG9ydHN0YXRfcmVnKSkgewotCQkJLyoKLQkJCSAqIFRPRE86IEF0dGVtcHQgcG9ydCByZWNvdmVyeSB2aWEgYSBwb3J0IHJlc2V0LgotCQkJICogV2hlbiBmdWxseSBpbXBsZW1lbnRlZCwgdGhlIGRyaXZlciBzaG91bGQKLQkJCSAqIGF0dGVtcHQgdG8gcmVjb3ZlciB0aGUgcG9ydCBoZXJlIGFuZCByZXR1cm4uCi0JCQkgKiBGb3Igbm93LCBsb2cgYW4gZXJyb3IgYW5kIHRha2UgdGhlIHBvcnQgb2ZmbGluZS4KLQkJCSAqLworCQkvKgorCQkgKiBPbiBlcnJvciBzdGF0dXMgY29uZGl0aW9uLCBkcml2ZXIgbmVlZCB0byB3YWl0IGZvciBwb3J0CisJCSAqIHJlYWR5IGJlZm9yZSBwZXJmb3JtaW5nIHJlc2V0LgorCQkgKi8KKwkJcmMgPSBscGZjX3NsaTRfcGRldl9zdGF0dXNfcmVnX3dhaXQocGhiYSk7CisJCWlmICghcmMpIHsKKwkJCS8qIG5lZWQgcmVzZXQ6IGF0dGVtcHQgZm9yIHBvcnQgcmVjb3ZlcnkgKi8KIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJCSIyODg3IFBvcnQgRXJyb3I6IEF0dGVtcHRpbmcgIgogCQkJCQkiUG9ydCBSZWNvdmVyeVxuIik7CisJCQlscGZjX29mZmxpbmVfcHJlcChwaGJhKTsKKwkJCWxwZmNfb2ZmbGluZShwaGJhKTsKKwkJCWxwZmNfc2xpX2JyZHJlc3RhcnQocGhiYSk7CisJCQlpZiAobHBmY19vbmxpbmUocGhiYSkgPT0gMCkgeworCQkJCWxwZmNfdW5ibG9ja19tZ210X2lvKHBoYmEpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCBmb3Igbm90IGFibGUgdG8gcmVjb3ZlciAqLwogCQl9CiAJCWxwZmNfc2xpNF9vZmZsaW5lX2VyYXR0KHBoYmEpOwogCQlicmVhazsKQEAgLTE3MjQsMTEgKzE3MzMsMjAgQEAKIAkJCQlqID0gMDsKIAkJCQlMZW5ndGggLT0gKDMraSk7CiAJCQkJd2hpbGUoaS0tKSB7Ci0JCQkJcGhiYS0+UG9ydFtqKytdID0gdnBkW2luZGV4KytdOwotCQkJCWlmIChqID09IDE5KQotCQkJCQlicmVhazsKKwkJCQkJaWYgKChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpICYmCisJCQkJCSAgICAocGhiYS0+c2xpNF9oYmEucHBvcnRfbmFtZV9zdGEgPT0KKwkJCQkJICAgICBMUEZDX1NMSTRfUFBOQU1FX0dFVCkpIHsKKwkJCQkJCWorKzsKKwkJCQkJCWluZGV4Kys7CisJCQkJCX0gZWxzZQorCQkJCQkJcGhiYS0+UG9ydFtqKytdID0gdnBkW2luZGV4KytdOworCQkJCQlpZiAoaiA9PSAxOSkKKwkJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlwaGJhLT5Qb3J0W2pdID0gMDsKKwkJCQlpZiAoKHBoYmEtPnNsaV9yZXYgIT0gTFBGQ19TTElfUkVWNCkgfHwKKwkJCQkgICAgKHBoYmEtPnNsaTRfaGJhLnBwb3J0X25hbWVfc3RhID09CisJCQkJICAgICBMUEZDX1NMSTRfUFBOQU1FX05PTikpCisJCQkJCXBoYmEtPlBvcnRbal0gPSAwOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJZWxzZSB7CkBAIC0xOTU4LDcgKzE5NzYsNyBAQAogCWNhc2UgUENJX0RFVklDRV9JRF9MQU5DRVJfRkNPRToKIAljYXNlIFBDSV9ERVZJQ0VfSURfTEFOQ0VSX0ZDT0VfVkY6CiAJCW9uZUNvbm5lY3QgPSAxOwotCQltID0gKHR5cGVvZihtKSl7Ik9DZTUwMTAwIiwgIlBDSWUiLCAiRkNvRSJ9OworCQltID0gKHR5cGVvZihtKSl7Ik9DZTE1MTAwIiwgIlBDSWUiLCAiRkNvRSJ9OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQltID0gKHR5cGVvZihtKSl7IlVua25vd24iLCAiIiwgIiJ9OwpAQCAtMjQzMiwxNyArMjQ1MCwxOSBAQAogCXVpbnQ4X3QgYWN0Y21kID0gTUJYX0hFQVJUQkVBVDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKLQorCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKExQRkNfTUJPWF9UTU8gKiAxMDAwKSArIGppZmZpZXM7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKIAlwaGJhLT5zbGkuc2xpX2ZsYWcgfD0gTFBGQ19CTE9DS19NR01UX0lPOwotCWlmIChwaGJhLT5zbGkubWJveF9hY3RpdmUpCisJaWYgKHBoYmEtPnNsaS5tYm94X2FjdGl2ZSkgewogCQlhY3RjbWQgPSBwaGJhLT5zbGkubWJveF9hY3RpdmUtPnUubWIubWJ4Q29tbWFuZDsKKwkJLyogRGV0ZXJtaW5lIGhvdyBsb25nIHdlIG1pZ2h0IHdhaXQgZm9yIHRoZSBhY3RpdmUgbWFpbGJveAorCQkgKiBjb21tYW5kIHRvIGJlIGdyYWNlZnVsbHkgY29tcGxldGVkIGJ5IGZpcm13YXJlLgorCQkgKi8KKwkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwKKwkJCQlwaGJhLT5zbGkubWJveF9hY3RpdmUpICogMTAwMCkgKyBqaWZmaWVzOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7Ci0JLyogRGV0ZXJtaW5lIGhvdyBsb25nIHdlIG1pZ2h0IHdhaXQgZm9yIHRoZSBhY3RpdmUgbWFpbGJveAotCSAqIGNvbW1hbmQgdG8gYmUgZ3JhY2VmdWxseSBjb21wbGV0ZWQgYnkgZmlybXdhcmUuCi0JICovCi0JdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwgYWN0Y21kKSAqIDEwMDApICsKLQkJCWppZmZpZXM7CisKIAkvKiBXYWl0IGZvciB0aGUgb3V0c3RuYWRpbmcgbWFpbGJveCBjb21tYW5kIHRvIGNvbXBsZXRlICovCiAJd2hpbGUgKHBoYmEtPnNsaS5tYm94X2FjdGl2ZSkgewogCQkvKiBDaGVjayBhY3RpdmUgbWFpbGJveCBjb21wbGV0ZSBzdGF0dXMgZXZlcnkgMm1zICovCkBAIC0zOTQ5LDcgKzM5NjksNyBAQAogbHBmY19lbmFibGVfcGNpX2RldihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0JaW50IGJhcnM7CisJaW50IGJhcnMgPSAwOwogCiAJLyogT2J0YWluIFBDSSBkZXZpY2UgcmVmZXJlbmNlICovCiAJaWYgKCFwaGJhLT5wY2lkZXYpCkBAIC0zOTc4LDYgKzM5OTgsOCBAQAogb3V0X2Rpc2FibGVfZGV2aWNlOgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIG91dF9lcnJvcjoKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJIjE0MDEgRmFpbGVkIHRvIGVuYWJsZSBwY2kgZGV2aWNlLCBiYXJzOngleFxuIiwgYmFycyk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTQwNTEsOSArNDA3Myw2IEBACiAJdWludDE2X3QgbnJfdmlydGZuOwogCWludCBwb3M7CiAKLQlpZiAoIXBkZXYtPmlzX3BoeXNmbikKLQkJcmV0dXJuIDA7Ci0KIAlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfRVhUX0NBUF9JRF9TUklPVik7CiAJaWYgKHBvcyA9PSAwKQogCQlyZXR1cm4gMDsKQEAgLTQ0NzQsMTUgKzQ0OTMsMTUgQEAKIAkJfQogCX0KIAltZW1wb29sX2ZyZWUobWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwotCS8qIENyZWF0ZSBhbGwgdGhlIFNMSTQgcXVldWVzICovCi0JcmMgPSBscGZjX3NsaTRfcXVldWVfY3JlYXRlKHBoYmEpOworCS8qIFZlcmlmeSBhbGwgdGhlIFNMSTQgcXVldWVzICovCisJcmMgPSBscGZjX3NsaTRfcXVldWVfdmVyaWZ5KHBoYmEpOwogCWlmIChyYykKIAkJZ290byBvdXRfZnJlZV9ic21ieDsKIAogCS8qIENyZWF0ZSBkcml2ZXIgaW50ZXJuYWwgQ1FFIGV2ZW50IHBvb2wgKi8KIAlyYyA9IGxwZmNfc2xpNF9jcV9ldmVudF9wb29sX2NyZWF0ZShwaGJhKTsKIAlpZiAocmMpCi0JCWdvdG8gb3V0X2Rlc3Ryb3lfcXVldWU7CisJCWdvdG8gb3V0X2ZyZWVfYnNtYng7CiAKIAkvKiBJbml0aWFsaXplIGFuZCBwb3B1bGF0ZSB0aGUgaW9jYiBsaXN0IHBlciBob3N0ICovCiAJcmMgPSBscGZjX2luaXRfc2dsX2xpc3QocGhiYSk7CkBAIC00NTE2LDE0ICs0NTM1LDIxIEBACiAJCWdvdG8gb3V0X3JlbW92ZV9ycGlfaGRyczsKIAl9CiAKLQlwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBscGZjX2ZjcF9lcV9oZGwpICoKKwkvKgorCSAqIFRoZSBjZmdfZmNwX2VxX2NvdW50IGNhbiBiZSB6ZXJvIHdoZW5ldmVyIHRoZXJlIGlzIGV4YWN0bHkgb25lCisJICogaW50ZXJydXB0IHZlY3Rvci4gIFRoaXMgaXMgbm90IGFuIGVycm9yCisJICovCisJaWYgKHBoYmEtPmNmZ19mY3BfZXFfY291bnQpIHsKKwkJcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbCA9CisJCQkJa3phbGxvYygoc2l6ZW9mKHN0cnVjdCBscGZjX2ZjcF9lcV9oZGwpICoKIAkJCQkgICAgcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudCksIEdGUF9LRVJORUwpOwotCWlmICghcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbCkgewotCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAotCQkJCSIyNTcyIEZhaWxlZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZhc3QtcGF0aCAiCi0JCQkJInBlci1FUSBoYW5kbGUgYXJyYXlcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfZmNmX3JyX2JtYXNrOworCQlpZiAoIXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGwpIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJCSIyNTcyIEZhaWxlZCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCQkJImZhc3QtcGF0aCBwZXItRVEgaGFuZGxlIGFycmF5XG4iKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWVfZmNmX3JyX2JtYXNrOworCQl9CiAJfQogCiAJcGhiYS0+c2xpNF9oYmEubXNpeF9lbnRyaWVzID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSAqCkBAIC00NTY3LDggKzQ1OTMsNiBAQAogCWxwZmNfZnJlZV9zZ2xfbGlzdChwaGJhKTsKIG91dF9kZXN0cm95X2NxX2V2ZW50X3Bvb2w6CiAJbHBmY19zbGk0X2NxX2V2ZW50X3Bvb2xfZGVzdHJveShwaGJhKTsKLW91dF9kZXN0cm95X3F1ZXVlOgotCWxwZmNfc2xpNF9xdWV1ZV9kZXN0cm95KHBoYmEpOwogb3V0X2ZyZWVfYnNtYng6CiAJbHBmY19kZXN0cm95X2Jvb3RzdHJhcF9tYm94KHBoYmEpOwogb3V0X2ZyZWVfbWVtOgpAQCAtNDYwOCw5ICs0NjMyLDYgQEAKIAkvKiBGcmVlIHRoZSBTQ1NJIHNnbCBtYW5hZ2VtZW50IGFycmF5ICovCiAJa2ZyZWUocGhiYS0+c2xpNF9oYmEubHBmY19zY3NpX3BzYl9hcnJheSk7CiAKLQkvKiBGcmVlIHRoZSBTTEk0IHF1ZXVlcyAqLwotCWxwZmNfc2xpNF9xdWV1ZV9kZXN0cm95KHBoYmEpOwotCiAJLyogRnJlZSB0aGUgY29tcGxldGlvbiBxdWV1ZSBFUSBldmVudCBwb29sICovCiAJbHBmY19zbGk0X2NxX2V2ZW50X3JlbGVhc2VfYWxsKHBoYmEpOwogCWxwZmNfc2xpNF9jcV9ldmVudF9wb29sX2Rlc3Ryb3kocGhiYSk7CkBAIC02MTM5LDI0ICs2MTYwLDIxIEBACiB9CiAKIC8qKgotICogbHBmY19zbGk0X3F1ZXVlX2NyZWF0ZSAtIENyZWF0ZSBhbGwgdGhlIFNMSTQgcXVldWVzCisgKiBscGZjX3NsaTRfcXVldWVfdmVyaWZ5IC0gVmVyaWZ5IGFuZCB1cGRhdGUgRVEgYW5kIENRIGNvdW50cwogICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCiAgKgotICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgdG8gYWxsb2NhdGUgYWxsIHRoZSBTTEk0IHF1ZXVlcyBmb3IgdGhlIEZDb0UgSEJBCi0gKiBvcGVyYXRpb24uIEZvciBlYWNoIFNMSTQgcXVldWUgdHlwZSwgdGhlIHBhcmFtZXRlcnMgc3VjaCBhcyBxdWV1ZSBlbnRyeQotICogY291bnQgKHF1ZXVlIGRlcHRoKSBzaGFsbCBiZSB0YWtlbiBmcm9tIHRoZSBtb2R1bGUgcGFyYW1ldGVyLiBGb3Igbm93LAotICogd2UganVzdCB1c2Ugc29tZSBjb25zdGFudCBudW1iZXIgYXMgcGxhY2UgaG9sZGVyLgorICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgdG8gY2hlY2sgdGhlIHVzZXIgc2V0dGFibGUgcXVldWUgY291bnRzIGZvciBFUXMgYW5kCisgKiBDUXMuIGFmdGVyIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdGhlIGNvdW50cyB3aWxsIGJlIHNldCB0byB2YWxpZCB2YWx1ZXMgdGhhdAorICogYWRoZXJlIHRvIHRoZSBjb25zdHJhaW50cyBvZiB0aGUgc3lzdGVtJ3MgaW50ZXJydXB0IHZlY3RvcnMgYW5kIHRoZSBwb3J0J3MKKyAqIHF1ZXVlIHJlc291cmNlcy4KICAqCiAgKiBSZXR1cm4gY29kZXMKICAqICAgICAgMCAtIHN1Y2Nlc3NmdWwKICAqICAgICAgLUVOT01FTSAtIE5vIGF2YWlsYWJsZSBtZW1vcnkKLSAqICAgICAgLUVJTyAtIFRoZSBtYWlsYm94IGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCiAgKiovCiBzdGF0aWMgaW50Ci1scGZjX3NsaTRfcXVldWVfY3JlYXRlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK2xwZmNfc2xpNF9xdWV1ZV92ZXJpZnkoc3RydWN0IGxwZmNfaGJhICpwaGJhKQogewotCXN0cnVjdCBscGZjX3F1ZXVlICpxZGVzYzsKLQlpbnQgZmNwX2VxaWR4LCBmY3BfY3FpZHgsIGZjcF93cWlkeDsKIAlpbnQgY2ZnX2ZjcF93cV9jb3VudDsKIAlpbnQgY2ZnX2ZjcF9lcV9jb3VudDsKIApAQCAtNjIyOSwxNCArNjI0Nyw0MyBAQAogCS8qIFRoZSBvdmVyYWxsIG51bWJlciBvZiBldmVudCBxdWV1ZXMgdXNlZCAqLwogCXBoYmEtPnNsaTRfaGJhLmNmZ19lcW4gPSBwaGJhLT5jZmdfZmNwX2VxX2NvdW50ICsgTFBGQ19TUF9FUU5fREVGOwogCi0JLyoKLQkgKiBDcmVhdGUgRXZlbnQgUXVldWVzIChFUXMpCi0JICovCi0KIAkvKiBHZXQgRVEgZGVwdGggZnJvbSBtb2R1bGUgcGFyYW1ldGVyLCBmYWtlIHRoZSBkZWZhdWx0IGZvciBub3cgKi8KIAlwaGJhLT5zbGk0X2hiYS5lcV9lc2l6ZSA9IExQRkNfRVFFX1NJWkVfNEI7CiAJcGhiYS0+c2xpNF9oYmEuZXFfZWNvdW50ID0gTFBGQ19FUUVfREVGX0NPVU5UOwogCisJLyogR2V0IENRIGRlcHRoIGZyb20gbW9kdWxlIHBhcmFtZXRlciwgZmFrZSB0aGUgZGVmYXVsdCBmb3Igbm93ICovCisJcGhiYS0+c2xpNF9oYmEuY3FfZXNpemUgPSBMUEZDX0NRRV9TSVpFOworCXBoYmEtPnNsaTRfaGJhLmNxX2Vjb3VudCA9IExQRkNfQ1FFX0RFRl9DT1VOVDsKKworCXJldHVybiAwOworb3V0X2Vycm9yOgorCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqIGxwZmNfc2xpNF9xdWV1ZV9jcmVhdGUgLSBDcmVhdGUgYWxsIHRoZSBTTEk0IHF1ZXVlcworICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgdG8gYWxsb2NhdGUgYWxsIHRoZSBTTEk0IHF1ZXVlcyBmb3IgdGhlIEZDb0UgSEJBCisgKiBvcGVyYXRpb24uIEZvciBlYWNoIFNMSTQgcXVldWUgdHlwZSwgdGhlIHBhcmFtZXRlcnMgc3VjaCBhcyBxdWV1ZSBlbnRyeQorICogY291bnQgKHF1ZXVlIGRlcHRoKSBzaGFsbCBiZSB0YWtlbiBmcm9tIHRoZSBtb2R1bGUgcGFyYW1ldGVyLiBGb3Igbm93LAorICogd2UganVzdCB1c2Ugc29tZSBjb25zdGFudCBudW1iZXIgYXMgcGxhY2UgaG9sZGVyLgorICoKKyAqIFJldHVybiBjb2RlcworICogICAgICAwIC0gc3VjZXNzZnVsCisgKiAgICAgIC1FTk9NRU0gLSBObyBhdmFpbGJsZSBtZW1vcnkKKyAqICAgICAgLUVJTyAtIFRoZSBtYWlsYm94IGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCisgKiovCitpbnQKK2xwZmNfc2xpNF9xdWV1ZV9jcmVhdGUoc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCXN0cnVjdCBscGZjX3F1ZXVlICpxZGVzYzsKKwlpbnQgZmNwX2VxaWR4LCBmY3BfY3FpZHgsIGZjcF93cWlkeDsKKworCS8qCisJICogQ3JlYXRlIEV2ZW50IFF1ZXVlcyAoRVFzKQorCSAqLworCiAJLyogQ3JlYXRlIHNsb3cgcGF0aCBldmVudCBxdWV1ZSAqLwogCXFkZXNjID0gbHBmY19zbGk0X3F1ZXVlX2FsbG9jKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmVxX2VzaXplLAogCQkJCSAgICAgIHBoYmEtPnNsaTRfaGJhLmVxX2Vjb3VudCk7CkBAIC02MjQ3LDE0ICs2Mjk0LDIwIEBACiAJfQogCXBoYmEtPnNsaTRfaGJhLnNwX2VxID0gcWRlc2M7CiAKLQkvKiBDcmVhdGUgZmFzdC1wYXRoIEZDUCBFdmVudCBRdWV1ZShzKSAqLwotCXBoYmEtPnNsaTRfaGJhLmZwX2VxID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBscGZjX3F1ZXVlICopICoKLQkJCSAgICAgICBwaGJhLT5jZmdfZmNwX2VxX2NvdW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaGJhLT5zbGk0X2hiYS5mcF9lcSkgewotCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAotCQkJCSIyNTc2IEZhaWxlZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZhc3QtcGF0aCAiCi0JCQkJIkVRIHJlY29yZCBhcnJheVxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfc3BfZXE7CisJLyoKKwkgKiBDcmVhdGUgZmFzdC1wYXRoIEZDUCBFdmVudCBRdWV1ZShzKS4gIFRoZSBjZmdfZmNwX2VxX2NvdW50IGNhbiBiZQorCSAqIHplcm8gd2hlbmV2ZXIgdGhlcmUgaXMgZXhhY3RseSBvbmUgaW50ZXJydXB0IHZlY3Rvci4gIFRoaXMgaXMgbm90CisJICogYW4gZXJyb3IuCisJICovCisJaWYgKHBoYmEtPmNmZ19mY3BfZXFfY291bnQpIHsKKwkJcGhiYS0+c2xpNF9oYmEuZnBfZXEgPSBremFsbG9jKChzaXplb2Yoc3RydWN0IGxwZmNfcXVldWUgKikgKgorCQkJCSAgICAgICBwaGJhLT5jZmdfZmNwX2VxX2NvdW50KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGhiYS0+c2xpNF9oYmEuZnBfZXEpIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJCSIyNTc2IEZhaWxlZCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCQkJImZhc3QtcGF0aCBFUSByZWNvcmQgYXJyYXlcbiIpOworCQkJZ290byBvdXRfZnJlZV9zcF9lcTsKKwkJfQogCX0KIAlmb3IgKGZjcF9lcWlkeCA9IDA7IGZjcF9lcWlkeCA8IHBoYmEtPmNmZ19mY3BfZXFfY291bnQ7IGZjcF9lcWlkeCsrKSB7CiAJCXFkZXNjID0gbHBmY19zbGk0X3F1ZXVlX2FsbG9jKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmVxX2VzaXplLApAQCAtNjI3MSwxMCArNjMyNCw2IEBACiAJICogQ3JlYXRlIENvbXBsZXRlIFF1ZXVlcyAoQ1FzKQogCSAqLwogCi0JLyogR2V0IENRIGRlcHRoIGZyb20gbW9kdWxlIHBhcmFtZXRlciwgZmFrZSB0aGUgZGVmYXVsdCBmb3Igbm93ICovCi0JcGhiYS0+c2xpNF9oYmEuY3FfZXNpemUgPSBMUEZDX0NRRV9TSVpFOwotCXBoYmEtPnNsaTRfaGJhLmNxX2Vjb3VudCA9IExQRkNfQ1FFX0RFRl9DT1VOVDsKLQogCS8qIENyZWF0ZSBzbG93LXBhdGggTWFpbGJveCBDb21tYW5kIENvbXBsZXRlIFF1ZXVlICovCiAJcWRlc2MgPSBscGZjX3NsaTRfcXVldWVfYWxsb2MocGhiYSwgcGhiYS0+c2xpNF9oYmEuY3FfZXNpemUsCiAJCQkJICAgICAgcGhiYS0+c2xpNF9oYmEuY3FfZWNvdW50KTsKQEAgLTYyOTYsMTYgKzYzNDUsMjUgQEAKIAlwaGJhLT5zbGk0X2hiYS5lbHNfY3EgPSBxZGVzYzsKIAogCi0JLyogQ3JlYXRlIGZhc3QtcGF0aCBGQ1AgQ29tcGxldGlvbiBRdWV1ZShzKSwgb25lLXRvLW9uZSB3aXRoIEVRcyAqLwotCXBoYmEtPnNsaTRfaGJhLmZjcF9jcSA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgbHBmY19xdWV1ZSAqKSAqCi0JCQkJcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudCksIEdGUF9LRVJORUwpOworCS8qCisJICogQ3JlYXRlIGZhc3QtcGF0aCBGQ1AgQ29tcGxldGlvbiBRdWV1ZShzKSwgb25lLXRvLW9uZSB3aXRoIEZDUCBFUXMuCisJICogSWYgdGhlcmUgYXJlIG5vIEZDUCBFUXMgdGhlbiBjcmVhdGUgZXhhY3RseSBvbmUgRkNQIENRLgorCSAqLworCWlmIChwaGJhLT5jZmdfZmNwX2VxX2NvdW50KQorCQlwaGJhLT5zbGk0X2hiYS5mY3BfY3EgPSBremFsbG9jKChzaXplb2Yoc3RydWN0IGxwZmNfcXVldWUgKikgKgorCQkJCQkJIHBoYmEtPmNmZ19mY3BfZXFfY291bnQpLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJZWxzZQorCQlwaGJhLT5zbGk0X2hiYS5mY3BfY3EgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHBmY19xdWV1ZSAqKSwKKwkJCQkJCUdGUF9LRVJORUwpOwogCWlmICghcGhiYS0+c2xpNF9oYmEuZmNwX2NxKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJIjI1NzcgRmFpbGVkIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmFzdC1wYXRoICIKIAkJCQkiQ1EgcmVjb3JkIGFycmF5XG4iKTsKIAkJZ290byBvdXRfZnJlZV9lbHNfY3E7CiAJfQotCWZvciAoZmNwX2NxaWR4ID0gMDsgZmNwX2NxaWR4IDwgcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudDsgZmNwX2NxaWR4KyspIHsKKwlmY3BfY3FpZHggPSAwOworCWRvIHsKIAkJcWRlc2MgPSBscGZjX3NsaTRfcXVldWVfYWxsb2MocGhiYSwgcGhiYS0+c2xpNF9oYmEuY3FfZXNpemUsCiAJCQkJCSAgICAgIHBoYmEtPnNsaTRfaGJhLmNxX2Vjb3VudCk7CiAJCWlmICghcWRlc2MpIHsKQEAgLTYzMTUsNyArNjM3Myw3IEBACiAJCQlnb3RvIG91dF9mcmVlX2ZjcF9jcTsKIAkJfQogCQlwaGJhLT5zbGk0X2hiYS5mY3BfY3FbZmNwX2NxaWR4XSA9IHFkZXNjOwotCX0KKwl9IHdoaWxlICgrK2ZjcF9jcWlkeCA8IHBoYmEtPmNmZ19mY3BfZXFfY291bnQpOwogCiAJLyogQ3JlYXRlIE1haWxib3ggQ29tbWFuZCBRdWV1ZSAqLwogCXBoYmEtPnNsaTRfaGJhLm1xX2VzaXplID0gTFBGQ19NUUVfU0laRTsKQEAgLTY0NDcsNyArNjUwNSw3IEBACiAgKiAgICAgIC1FTk9NRU0gLSBObyBhdmFpbGFibGUgbWVtb3J5CiAgKiAgICAgIC1FSU8gLSBUaGUgbWFpbGJveCBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgogICoqLwotc3RhdGljIHZvaWQKK3ZvaWQKIGxwZmNfc2xpNF9xdWV1ZV9kZXN0cm95KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKIAlpbnQgZmNwX3FpZHg7CkBAIC02NzIzLDYgKzY3ODEsMTAgQEAKIAkJCQkiMDU0MCBSZWNlaXZlIFF1ZXVlIG5vdCBhbGxvY2F0ZWRcbiIpOwogCQlnb3RvIG91dF9kZXN0cm95X2ZjcF93cTsKIAl9CisKKwlscGZjX3JxX2FkanVzdF9yZXBvc3QocGhiYSwgcGhiYS0+c2xpNF9oYmEuaGRyX3JxLCBMUEZDX0VMU19IQlEpOworCWxwZmNfcnFfYWRqdXN0X3JlcG9zdChwaGJhLCBwaGJhLT5zbGk0X2hiYS5kYXRfcnEsIExQRkNfRUxTX0hCUSk7CisKIAlyYyA9IGxwZmNfcnFfY3JlYXRlKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmhkcl9ycSwgcGhiYS0+c2xpNF9oYmEuZGF0X3JxLAogCQkJICAgIHBoYmEtPnNsaTRfaGJhLmVsc19jcSwgTFBGQ19VU09MKTsKIAlpZiAocmMpIHsKQEAgLTY3MzEsNiArNjc5Myw3IEBACiAJCQkJInJjID0gMHgleFxuIiwgcmMpOwogCQlnb3RvIG91dF9kZXN0cm95X2ZjcF93cTsKIAl9CisKIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKIAkJCSIyNTkyIFVTTCBSUSBzZXR1cDogaGRyLXJxLWlkPSVkLCBkYXQtcnEtaWQ9JWQgIgogCQkJInBhcmVudCBjcS1pZD0lZFxuIiwKQEAgLTY3OTAsOCArNjg1MywxMCBAQAogCS8qIFVuc2V0IEVMUyBjb21wbGV0ZSBxdWV1ZSAqLwogCWxwZmNfY3FfZGVzdHJveShwaGJhLCBwaGJhLT5zbGk0X2hiYS5lbHNfY3EpOwogCS8qIFVuc2V0IEZDUCByZXNwb25zZSBjb21wbGV0ZSBxdWV1ZSAqLwotCWZvciAoZmNwX3FpZHggPSAwOyBmY3BfcWlkeCA8IHBoYmEtPmNmZ19mY3BfZXFfY291bnQ7IGZjcF9xaWR4KyspCisJZmNwX3FpZHggPSAwOworCWRvIHsKIAkJbHBmY19jcV9kZXN0cm95KHBoYmEsIHBoYmEtPnNsaTRfaGJhLmZjcF9jcVtmY3BfcWlkeF0pOworCX0gd2hpbGUgKCsrZmNwX3FpZHggPCBwaGJhLT5jZmdfZmNwX2VxX2NvdW50KTsKIAkvKiBVbnNldCBmYXN0LXBhdGggZXZlbnQgcXVldWUgKi8KIAlmb3IgKGZjcF9xaWR4ID0gMDsgZmNwX3FpZHggPCBwaGJhLT5jZmdfZmNwX2VxX2NvdW50OyBmY3BfcWlkeCsrKQogCQlscGZjX2VxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEuZnBfZXFbZmNwX3FpZHhdKTsKQEAgLTcwNDAsMTAgKzcxMDUsMTEgQEAKIAkJCSAqIHRoZSBsb29wIGFnYWluLgogCQkJICovCiAJCQlmb3IgKHJkeV9jaGsgPSAwOyByZHlfY2hrIDwgMTAwMDsgcmR5X2NoaysrKSB7CisJCQkJbXNsZWVwKDEwKTsKIAkJCQlpZiAobHBmY19yZWFkbChwaGJhLT5zbGk0X2hiYS51LmlmX3R5cGUyLgogCQkJCQkgICAgICBTVEFUVVNyZWdhZGRyLCAmcmVnX2RhdGEud29yZDApKSB7CiAJCQkJCXJjID0gLUVOT0RFVjsKLQkJCQkJYnJlYWs7CisJCQkJCWdvdG8gb3V0OwogCQkJCX0KIAkJCQlpZiAoYmZfZ2V0KGxwZmNfc2xpcG9ydF9zdGF0dXNfcmR5LCAmcmVnX2RhdGEpKQogCQkJCQlicmVhazsKQEAgLTcwNTEsNyArNzExNyw2IEBACiAJCQkJCXJlc2V0X2FnYWluKys7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQltc2xlZXAoMTApOwogCQkJfQogCiAJCQkvKgpAQCAtNzA2NSwxMSArNzEzMCw2IEBACiAJCQl9CiAKIAkJCS8qIERldGVjdCBhbnkgcG9ydCBlcnJvcnMuICovCi0JCQlpZiAobHBmY19yZWFkbChwaGJhLT5zbGk0X2hiYS51LmlmX3R5cGUyLlNUQVRVU3JlZ2FkZHIsCi0JCQkJICZyZWdfZGF0YS53b3JkMCkpIHsKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQkJYnJlYWs7Ci0JCQl9CiAJCQlpZiAoKGJmX2dldChscGZjX3NsaXBvcnRfc3RhdHVzX2VyciwgJnJlZ19kYXRhKSkgfHwKIAkJCSAgICAocmR5X2NoayA+PSAxMDAwKSkgewogCQkJCXBoYmEtPndvcmtfc3RhdHVzWzBdID0gcmVhZGwoCkBAIC03MTAyLDYgKzcxNjIsNyBAQAogCQlicmVhazsKIAl9CiAKK291dDoKIAkvKiBDYXRjaCB0aGUgbm90LXJlYWR5IHBvcnQgZmFpbHVyZSBhZnRlciBhIHBvcnQgcmVzZXQuICovCiAJaWYgKG51bV9yZXNldHMgPj0gTUFYX0lGX1RZUEVfMl9SRVNFVFMpCiAJCXJjID0gLUVOT0RFVjsKQEAgLTcxNDksMTIgKzcyMTAsMTMgQEAKIAlscGZjX3NsaTRfY29uZmlnKHBoYmEsIG1ib3hxLCBMUEZDX01CT1hfU1VCU1lTVEVNX0NPTU1PTiwKIAkJCSBMUEZDX01CT1hfT1BDT0RFX05PUCwgbGVuZ3RoLCBMUEZDX1NMSTRfTUJYX0VNQkVEKTsKIAotCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgTUJYX1NMSTRfQ09ORklHKTsKIAlmb3IgKGNtZHNlbnQgPSAwOyBjbWRzZW50IDwgY250OyBjbWRzZW50KyspIHsKIAkJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKIAkJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBtYm94cSwgTUJYX1BPTEwpOwotCQllbHNlCisJCWVsc2UgeworCQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYm94cSk7CiAJCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94cSwgbWJveF90bW8pOworCQl9CiAJCWlmIChyYyA9PSBNQlhfVElNRU9VVCkKIAkJCWJyZWFrOwogCQkvKiBDaGVjayByZXR1cm4gc3RhdHVzICovCkBAIC03OTc0LDYgKzgwMzYsNyBAQAogCiAJLyogUmVzZXQgU0xJNCBIQkEgRkNvRSBmdW5jdGlvbiAqLwogCWxwZmNfcGNpX2Z1bmN0aW9uX3Jlc2V0KHBoYmEpOworCWxwZmNfc2xpNF9xdWV1ZV9kZXN0cm95KHBoYmEpOwogCiAJcmV0dXJuOwogfQpAQCAtODA4Nyw2ICs4MTUwLDcgQEAKIAogCS8qIFJlc2V0IFNMSTQgSEJBIEZDb0UgZnVuY3Rpb24gKi8KIAlscGZjX3BjaV9mdW5jdGlvbl9yZXNldChwaGJhKTsKKwlscGZjX3NsaTRfcXVldWVfZGVzdHJveShwaGJhKTsKIAogCS8qIFN0b3AgdGhlIFNMSTQgZGV2aWNlIHBvcnQgKi8KIAlwaGJhLT5wcG9ydC0+d29ya19wb3J0X2V2ZW50cyA9IDA7CkBAIC04MTIwLDcgKzgxODQsNyBAQAogCWlmICghcGhiYS0+c2xpNF9oYmEuaW50cl9lbmFibGUpCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBtYm94cSwgTUJYX1BPTEwpOwogCWVsc2UgewotCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9QT1JUX0NBUEFCSUxJVElFUyk7CisJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveHEpOwogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94cSwgbWJveF90bW8pOwogCX0KIApAQCAtODE4Miw2ICs4MjQ2LDcgQEAKIAlpbnQgcmM7CiAJc3RydWN0IGxwZmNfbXFlICptcWUgPSAmbWJveHEtPnUubXFlOwogCXN0cnVjdCBscGZjX3BjX3NsaTRfcGFyYW1zICpzbGk0X3BhcmFtczsKKwl1aW50MzJfdCBtYm94X3RtbzsKIAlpbnQgbGVuZ3RoOwogCXN0cnVjdCBscGZjX3NsaTRfcGFyYW1ldGVycyAqbWJ4X3NsaTRfcGFyYW1ldGVyczsKIApAQCAtODIwMCw5ICs4MjY1LDEwIEBACiAJCQkgbGVuZ3RoLCBMUEZDX1NMSTRfTUJYX0VNQkVEKTsKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveHEsIE1CWF9QT0xMKTsKLQllbHNlCi0JCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3hxLAotCQkJbHBmY19tYm94X3Rtb192YWwocGhiYSwgTUJYX1NMSTRfQ09ORklHKSk7CisJZWxzZSB7CisJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveHEpOworCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94cSwgbWJveF90bW8pOworCX0KIAlpZiAodW5saWtlbHkocmMpKQogCQlyZXR1cm4gcmM7CiAJc2xpNF9wYXJhbXMgPSAmcGhiYS0+c2xpNF9oYmEucGNfc2xpNF9wYXJhbXM7CkBAIC04MjcxLDExICs4MzM3LDggQEAKIAogCS8qIFBlcmZvcm0gZ2VuZXJpYyBQQ0kgZGV2aWNlIGVuYWJsaW5nIG9wZXJhdGlvbiAqLwogCWVycm9yID0gbHBmY19lbmFibGVfcGNpX2RldihwaGJhKTsKLQlpZiAoZXJyb3IpIHsKLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkiMTQwMSBGYWlsZWQgdG8gZW5hYmxlIHBjaSBkZXZpY2UuXG4iKTsKKwlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZyZWVfcGhiYTsKLQl9CiAKIAkvKiBTZXQgdXAgU0xJIEFQSSBmdW5jdGlvbiBqdW1wIHRhYmxlIGZvciBQQ0ktZGV2aWNlIGdyb3VwLTAgSEJBcyAqLwogCWVycm9yID0gbHBmY19hcGlfdGFibGVfc2V0dXAocGhiYSwgTFBGQ19QQ0lfREVWX0xQKTsKQEAgLTgzMjIsNiArODM4NSw5IEBACiAJCWdvdG8gb3V0X2ZyZWVfaW9jYl9saXN0OwogCX0KIAorCS8qIEdldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIE1vZGVsIE5hbWUgYW5kIERlc2NyaXB0aW9uICovCisJbHBmY19nZXRfaGJhX21vZGVsX2Rlc2MocGhiYSwgcGhiYS0+TW9kZWxOYW1lLCBwaGJhLT5Nb2RlbERlc2MpOworCiAJLyogQ3JlYXRlIFNDU0kgaG9zdCB0byB0aGUgcGh5c2ljYWwgcG9ydCAqLwogCWVycm9yID0gbHBmY19jcmVhdGVfc2hvc3QocGhiYSk7CiAJaWYgKGVycm9yKSB7CkBAIC04ODg1LDE2ICs4OTUxLDE3IEBACiAJdWludDMyX3Qgb2Zmc2V0ID0gMCwgdGVtcF9vZmZzZXQgPSAwOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRtYV9idWZmZXJfbGlzdCk7Ci0JaWYgKChpbWFnZS0+bWFnaWNfbnVtYmVyICE9IExQRkNfR1JPVVBfT0pFQ1RfTUFHSUNfTlVNKSB8fAotCSAgICAoYmZfZ2V0KGxwZmNfZ3JwX2hkcl9maWxlX3R5cGUsIGltYWdlKSAhPSBMUEZDX0ZJTEVfVFlQRV9HUk9VUCkgfHwKLQkgICAgKGJmX2dldChscGZjX2dycF9oZHJfaWQsIGltYWdlKSAhPSBMUEZDX0ZJTEVfSURfR1JPVVApIHx8Ci0JICAgIChpbWFnZS0+c2l6ZSAhPSBmdy0+c2l6ZSkpIHsKKwlpZiAoKGJlMzJfdG9fY3B1KGltYWdlLT5tYWdpY19udW1iZXIpICE9IExQRkNfR1JPVVBfT0pFQ1RfTUFHSUNfTlVNKSB8fAorCSAgICAoYmZfZ2V0X2JlMzIobHBmY19ncnBfaGRyX2ZpbGVfdHlwZSwgaW1hZ2UpICE9CisJICAgICBMUEZDX0ZJTEVfVFlQRV9HUk9VUCkgfHwKKwkgICAgKGJmX2dldF9iZTMyKGxwZmNfZ3JwX2hkcl9pZCwgaW1hZ2UpICE9IExQRkNfRklMRV9JRF9HUk9VUCkgfHwKKwkgICAgKGJlMzJfdG9fY3B1KGltYWdlLT5zaXplKSAhPSBmdy0+c2l6ZSkpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKIAkJCQkiMzAyMiBJbnZhbGlkIEZXIGltYWdlIGZvdW5kLiAiCi0JCQkJIk1hZ2ljOiVkIFR5cGU6JXggSUQ6JXhcbiIsCi0JCQkJaW1hZ2UtPm1hZ2ljX251bWJlciwKLQkJCQliZl9nZXQobHBmY19ncnBfaGRyX2ZpbGVfdHlwZSwgaW1hZ2UpLAotCQkJCWJmX2dldChscGZjX2dycF9oZHJfaWQsIGltYWdlKSk7CisJCQkJIk1hZ2ljOiV4IFR5cGU6JXggSUQ6JXhcbiIsCisJCQkJYmUzMl90b19jcHUoaW1hZ2UtPm1hZ2ljX251bWJlciksCisJCQkJYmZfZ2V0X2JlMzIobHBmY19ncnBfaGRyX2ZpbGVfdHlwZSwgaW1hZ2UpLAorCQkJCWJmX2dldF9iZTMyKGxwZmNfZ3JwX2hkcl9pZCwgaW1hZ2UpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWxwZmNfZGVjb2RlX2Zpcm13YXJlX3JldihwaGJhLCBmd3JldiwgMSk7CkBAIC04OTI0LDExICs4OTkxLDExIEBACiAJCXdoaWxlIChvZmZzZXQgPCBmdy0+c2l6ZSkgewogCQkJdGVtcF9vZmZzZXQgPSBvZmZzZXQ7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRtYWJ1ZiwgJmRtYV9idWZmZXJfbGlzdCwgbGlzdCkgewotCQkJCWlmIChvZmZzZXQgKyBTTEk0X1BBR0VfU0laRSA+IGZ3LT5zaXplKSB7Ci0JCQkJCXRlbXBfb2Zmc2V0ICs9IGZ3LT5zaXplIC0gb2Zmc2V0OworCQkJCWlmICh0ZW1wX29mZnNldCArIFNMSTRfUEFHRV9TSVpFID4gZnctPnNpemUpIHsKIAkJCQkJbWVtY3B5KGRtYWJ1Zi0+dmlydCwKIAkJCQkJICAgICAgIGZ3LT5kYXRhICsgdGVtcF9vZmZzZXQsCi0JCQkJCSAgICAgICBmdy0+c2l6ZSAtIG9mZnNldCk7CisJCQkJCSAgICAgICBmdy0+c2l6ZSAtIHRlbXBfb2Zmc2V0KTsKKwkJCQkJdGVtcF9vZmZzZXQgPSBmdy0+c2l6ZTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCW1lbWNweShkbWFidWYtPnZpcnQsIGZ3LT5kYXRhICsgdGVtcF9vZmZzZXQsCkBAIC04OTg0LDcgKzkwNTEsNiBAQAogCXVpbnQzMl90IGNmZ19tb2RlLCBpbnRyX21vZGU7CiAJaW50IG1jbnQ7CiAJaW50IGFkanVzdGVkX2ZjcF9lcV9jb3VudDsKLQlpbnQgZmNwX3FpZHg7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKIAl1aW50OF90IGZpbGVfbmFtZVsxNl07CiAKQEAgLTg5OTUsMTEgKzkwNjEsOCBAQAogCiAJLyogUGVyZm9ybSBnZW5lcmljIFBDSSBkZXZpY2UgZW5hYmxpbmcgb3BlcmF0aW9uICovCiAJZXJyb3IgPSBscGZjX2VuYWJsZV9wY2lfZGV2KHBoYmEpOwotCWlmIChlcnJvcikgewotCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAotCQkJCSIxNDA5IEZhaWxlZCB0byBlbmFibGUgcGNpIGRldmljZS5cbiIpOworCWlmIChlcnJvcikKIAkJZ290byBvdXRfZnJlZV9waGJhOwotCX0KIAogCS8qIFNldCB1cCBTTEkgQVBJIGZ1bmN0aW9uIGp1bXAgdGFibGUgZm9yIFBDSS1kZXZpY2UgZ3JvdXAtMSBIQkFzICovCiAJZXJyb3IgPSBscGZjX2FwaV90YWJsZV9zZXR1cChwaGJhLCBMUEZDX1BDSV9ERVZfT0MpOwpAQCAtOTA1NCw2ICs5MTE3LDkgQEAKIAkJZ290byBvdXRfZnJlZV9pb2NiX2xpc3Q7CiAJfQogCisJLyogR2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgTW9kZWwgTmFtZSBhbmQgRGVzY3JpcHRpb24gKi8KKwlscGZjX2dldF9oYmFfbW9kZWxfZGVzYyhwaGJhLCBwaGJhLT5Nb2RlbE5hbWUsIHBoYmEtPk1vZGVsRGVzYyk7CisKIAkvKiBDcmVhdGUgU0NTSSBob3N0IHRvIHRoZSBwaHlzaWNhbCBwb3J0ICovCiAJZXJyb3IgPSBscGZjX2NyZWF0ZV9zaG9zdChwaGJhKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTkwOTMsMTYgKzkxNTksNiBAQAogCQkJYWRqdXN0ZWRfZmNwX2VxX2NvdW50ID0gcGhiYS0+c2xpNF9oYmEubXNpeF92ZWNfbnIgLSAxOwogCQllbHNlCiAJCQlhZGp1c3RlZF9mY3BfZXFfY291bnQgPSBwaGJhLT5jZmdfZmNwX2VxX2NvdW50OwotCQkvKiBGcmVlIHVudXNlZCBFUXMgKi8KLQkJZm9yIChmY3BfcWlkeCA9IGFkanVzdGVkX2ZjcF9lcV9jb3VudDsKLQkJICAgICBmY3BfcWlkeCA8IHBoYmEtPmNmZ19mY3BfZXFfY291bnQ7Ci0JCSAgICAgZmNwX3FpZHgrKykgewotCQkJbHBmY19zbGk0X3F1ZXVlX2ZyZWUocGhiYS0+c2xpNF9oYmEuZnBfZXFbZmNwX3FpZHhdKTsKLQkJCS8qIGRvIG5vdCBkZWxldGUgdGhlIGZpcnN0IGZjcF9jcSAqLwotCQkJaWYgKGZjcF9xaWR4KQotCQkJCWxwZmNfc2xpNF9xdWV1ZV9mcmVlKAotCQkJCQlwaGJhLT5zbGk0X2hiYS5mY3BfY3FbZmNwX3FpZHhdKTsKLQkJfQogCQlwaGJhLT5jZmdfZmNwX2VxX2NvdW50ID0gYWRqdXN0ZWRfZmNwX2VxX2NvdW50OwogCQkvKiBTZXQgdXAgU0xJLTQgSEJBICovCiAJCWlmIChscGZjX3NsaTRfaGJhX3NldHVwKHBoYmEpKSB7CkBAIC05Mjg1LDYgKzkzNDEsNyBAQAogCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHQgZnJvbSBkZXZpY2UgKi8KIAlscGZjX3NsaTRfZGlzYWJsZV9pbnRyKHBoYmEpOworCWxwZmNfc2xpNF9xdWV1ZV9kZXN0cm95KHBoYmEpOwogCiAJLyogU2F2ZSBkZXZpY2Ugc3RhdGUgdG8gUENJIGNvbmZpZyBzcGFjZSAqLwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwpAQCAtOTQxNCw2ICs5NDcxLDcgQEAKIAogCS8qIERpc2FibGUgaW50ZXJydXB0IGFuZCBwY2kgZGV2aWNlICovCiAJbHBmY19zbGk0X2Rpc2FibGVfaW50cihwaGJhKTsKKwlscGZjX3NsaTRfcXVldWVfZGVzdHJveShwaGJhKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGhiYS0+cGNpZGV2KTsKIAogCS8qIEZsdXNoIGFsbCBkcml2ZXIncyBvdXRzdGFuZGluZyBTQ1NJIEkvT3MgYXMgd2UgYXJlIHRvIHJlc2V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2xvZ21zZy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19sb2dtc2cuaAppbmRleCBlM2I3OTBlLi5iYWY1M2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2xvZ21zZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbG9nbXNnLmgKQEAgLTM2LDYgKzM2LDcgQEAKICNkZWZpbmUgTE9HX1NFQ1VSSVRZCTB4MDAwMDgwMDAJLyogU2VjdXJpdHkgZXZlbnRzICovCiAjZGVmaW5lIExPR19FVkVOVAkweDAwMDEwMDAwCS8qIENULFRFTVAsRFVNUCwgbG9nZ2luZyAqLwogI2RlZmluZSBMT0dfRklQCQkweDAwMDIwMDAwCS8qIEZJUCBldmVudHMgKi8KKyNkZWZpbmUgTE9HX0ZDUF9VTkRFUgkweDAwMDQwMDAwCS8qIEZDUCB1bmRlcnJ1bnMgZXJyb3JzICovCiAjZGVmaW5lIExPR19BTExfTVNHCTB4ZmZmZmZmZmYJLyogTE9HIGFsbCBtZXNzYWdlcyAqLwogCiAjZGVmaW5lIGxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIGxldmVsLCBtYXNrLCBmbXQsIGFyZy4uLikgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwppbmRleCA4MzQ1MGNjLi4yZWJjN2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwpAQCAtMTU5OCw5ICsxNTk4LDEyIEBACiAgKiAgICBUaW1lb3V0IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBtYWlsYm94IGNvbW1hbmQKICAqKi8KIGludAotbHBmY19tYm94X3Rtb192YWwoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBpbnQgY21kKQorbHBmY19tYm94X3Rtb192YWwoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBMUEZDX01CT1hRX3QgKm1ib3hxKQogewotCXN3aXRjaCAoY21kKSB7CisJTUFJTEJPWF90ICptYm94ID0gJm1ib3hxLT51Lm1iOworCXVpbnQ4X3Qgc3Vic3lzLCBvcGNvZGU7CisKKwlzd2l0Y2ggKG1ib3gtPm1ieENvbW1hbmQpIHsKIAljYXNlIE1CWF9XUklURV9OVjoJLyogMHgwMyAqLwogCWNhc2UgTUJYX1VQREFURV9DRkc6CS8qIDB4MUIgKi8KIAljYXNlIE1CWF9ET1dOX0xPQUQ6CS8qIDB4MUMgKi8KQEAgLTE2MTAsNiArMTYxMywyOCBAQAogCWNhc2UgTUJYX0xPQURfRVhQX1JPTToJLyogMHg5QyAqLwogCQlyZXR1cm4gTFBGQ19NQk9YX1RNT19GTEFTSF9DTUQ7CiAJY2FzZSBNQlhfU0xJNF9DT05GSUc6CS8qIDB4OWIgKi8KKwkJc3Vic3lzID0gbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLCBtYm94cSk7CisJCW9wY29kZSA9IGxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpOworCQlpZiAoc3Vic3lzID09IExQRkNfTUJPWF9TVUJTWVNURU1fQ09NTU9OKSB7CisJCQlzd2l0Y2ggKG9wY29kZSkgeworCQkJY2FzZSBMUEZDX01CT1hfT1BDT0RFX1JFQURfT0JKRUNUOgorCQkJY2FzZSBMUEZDX01CT1hfT1BDT0RFX1dSSVRFX09CSkVDVDoKKwkJCWNhc2UgTFBGQ19NQk9YX09QQ09ERV9SRUFEX09CSkVDVF9MSVNUOgorCQkJY2FzZSBMUEZDX01CT1hfT1BDT0RFX0RFTEVURV9PQkpFQ1Q6CisJCQljYXNlIExQRkNfTUJPWF9PUENPREVfR0VUX0ZVTkNUSU9OX0NPTkZJRzoKKwkJCWNhc2UgTFBGQ19NQk9YX09QQ09ERV9HRVRfUFJPRklMRV9MSVNUOgorCQkJY2FzZSBMUEZDX01CT1hfT1BDT0RFX1NFVF9BQ1RfUFJPRklMRToKKwkJCWNhc2UgTFBGQ19NQk9YX09QQ09ERV9TRVRfUFJPRklMRV9DT05GSUc6CisJCQljYXNlIExQRkNfTUJPWF9PUENPREVfR0VUX0ZBQ1RPUllfUFJPRklMRV9DT05GSUc6CisJCQkJcmV0dXJuIExQRkNfTUJPWF9TTEk0X0NPTkZJR19FWFRFTkRFRF9UTU87CisJCQl9CisJCX0KKwkJaWYgKHN1YnN5cyA9PSBMUEZDX01CT1hfU1VCU1lTVEVNX0ZDT0UpIHsKKwkJCXN3aXRjaCAob3Bjb2RlKSB7CisJCQljYXNlIExQRkNfTUJPWF9PUENPREVfRkNPRV9TRVRfRkNMSU5LX1NFVFRJTkdTOgorCQkJCXJldHVybiBMUEZDX01CT1hfU0xJNF9DT05GSUdfRVhURU5ERURfVE1POworCQkJfQorCQl9CiAJCXJldHVybiBMUEZDX01CT1hfU0xJNF9DT05GSUdfVE1POwogCX0KIAlyZXR1cm4gTFBGQ19NQk9YX1RNTzsKQEAgLTE4NTksNyArMTg4NCw3IEBACiAJfQogCiAJLyogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIGZvciB0aGUgcGFydGljdWxhciBPcGNvZGUuICovCi0Jb3Bjb2RlID0gbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94KTsKKwlvcGNvZGUgPSBscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3gpOwogCXN3aXRjaCAob3Bjb2RlKSB7CiAJY2FzZSBMUEZDX01CT1hfT1BDT0RFX0FMTE9DX1JTUkNfRVhURU5UOgogCQlpZiAoZW1iID09IExQRkNfU0xJNF9NQlhfRU1CRUQpCkBAIC0xODg2LDIzICsxOTExLDU2IEBACiB9CiAKIC8qKgotICogbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldCAtIEdldCB0aGUgb3Bjb2RlIGZyb20gYSBzbGk0IG1haWxib3ggY29tbWFuZAorICogbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldCAtIEdldCBzdWJzeXN0ZW0gZnJvbSBhIHNsaV9jb25maWcgbWJveCBjbWQKICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgotICogQG1ib3g6IHBvaW50ZXIgdG8gbHBmYyBtYm94IGNvbW1hbmQuCisgKiBAbWJveDogcG9pbnRlciB0byBscGZjIG1ib3ggY29tbWFuZCBxdWV1ZSBlbnRyeS4KICAqCi0gKiBUaGlzIHJvdXRpbmUgZ2V0cyB0aGUgb3Bjb2RlIGZyb20gYSBTTEk0IHNwZWNpZmljIG1haWxib3ggY29tbWFuZCBmb3IKLSAqIHNlbmRpbmcgSU9DVEwgY29tbWFuZC4gSWYgdGhlIG1haWxib3ggY29tbWFuZCBpcyBub3QgTUJYX1NMSTRfQ09ORklHCi0gKiAoMHg5Qikgb3IgaWYgdGhlIElPQ1RMIHN1Yi1oZWFkZXIgaXMgbm90IHByZXNlbnQsIG9wY29kZSAweDAgc2hhbGwgYmUKLSAqIHJldHVybmVkLgorICogVGhpcyByb3V0aW5lIGdldHMgdGhlIHN1YnN5c3RlbSBmcm9tIGEgU0xJNCBzcGVjaWZpYyBTTElfQ09ORklHIG1haWxib3gKKyAqIGNvbW1hbmQuIElmIHRoZSBtYWlsYm94IGNvbW1hbmQgaXMgbm90IE1CWF9TTEk0X0NPTkZJRyAoMHg5Qikgb3IgaWYgdGhlCisgKiBzdWItaGVhZGVyIGlzIG5vdCBwcmVzZW50LCBzdWJzeXN0ZW0gTFBGQ19NQk9YX1NVQlNZU1RFTV9OQSAoMHgwKSBzaGFsbAorICogYmUgcmV0dXJuZWQuCiAgKiovCiB1aW50OF90Ci1scGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNNYm94cSAqbWJveCkKK2xwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBMUEZDX01CT1hRX3QgKm1ib3gpCiB7CiAJc3RydWN0IGxwZmNfbWJ4X3NsaTRfY29uZmlnICpzbGk0X2NmZzsKIAl1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKmNmZ19zaGRyOwogCiAJaWYgKG1ib3gtPnUubWIubWJ4Q29tbWFuZCAhPSBNQlhfU0xJNF9DT05GSUcpCi0JCXJldHVybiAwOworCQlyZXR1cm4gTFBGQ19NQk9YX1NVQlNZU1RFTV9OQTsKKwlzbGk0X2NmZyA9ICZtYm94LT51Lm1xZS51bi5zbGk0X2NvbmZpZzsKKworCS8qIEZvciBlbWJlZGRlZCBtYm94IGNvbW1hbmQsIGdldCBvcGNvZGUgZnJvbSBlbWJlZGRlZCBzdWItaGVhZGVyKi8KKwlpZiAoYmZfZ2V0KGxwZmNfbWJveF9oZHJfZW1iLCAmc2xpNF9jZmctPmhlYWRlci5jZmdfbWhkcikpIHsKKwkJY2ZnX3NoZHIgPSAmbWJveC0+dS5tcWUudW4uc2xpNF9jb25maWcuaGVhZGVyLmNmZ19zaGRyOworCQlyZXR1cm4gYmZfZ2V0KGxwZmNfbWJveF9oZHJfc3Vic3lzdGVtLCAmY2ZnX3NoZHItPnJlcXVlc3QpOworCX0KKworCS8qIEZvciBub24tZW1iZWRkZWQgbWJveCBjb21tYW5kLCBnZXQgb3Bjb2RlIGZyb20gZmlyc3QgZG1hIHBhZ2UgKi8KKwlpZiAodW5saWtlbHkoIW1ib3gtPnNnZV9hcnJheSkpCisJCXJldHVybiBMUEZDX01CT1hfU1VCU1lTVEVNX05BOworCWNmZ19zaGRyID0gKHVuaW9uIGxwZmNfc2xpNF9jZmdfc2hkciAqKW1ib3gtPnNnZV9hcnJheS0+YWRkclswXTsKKwlyZXR1cm4gYmZfZ2V0KGxwZmNfbWJveF9oZHJfc3Vic3lzdGVtLCAmY2ZnX3NoZHItPnJlcXVlc3QpOworfQorCisvKioKKyAqIGxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQgLSBHZXQgb3Bjb2RlIGZyb20gYSBzbGlfY29uZmlnIG1ib3ggY21kCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqIEBtYm94OiBwb2ludGVyIHRvIGxwZmMgbWJveCBjb21tYW5kIHF1ZXVlIGVudHJ5LgorICoKKyAqIFRoaXMgcm91dGluZSBnZXRzIHRoZSBvcGNvZGUgZnJvbSBhIFNMSTQgc3BlY2lmaWMgU0xJX0NPTkZJRyBtYWlsYm94CisgKiBjb21tYW5kLiBJZiB0aGUgbWFpbGJveCBjb21tYW5kIGlzIG5vdCBNQlhfU0xJNF9DT05GSUcgKDB4OUIpIG9yIGlmCisgKiB0aGUgc3ViLWhlYWRlciBpcyBub3QgcHJlc2VudCwgb3Bjb2RlIExQRkNfTUJPWF9PUENPREVfTkEgKDB4MCkgYmUKKyAqIHJldHVybmVkLgorICoqLwordWludDhfdAorbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIExQRkNfTUJPWFFfdCAqbWJveCkKK3sKKwlzdHJ1Y3QgbHBmY19tYnhfc2xpNF9jb25maWcgKnNsaTRfY2ZnOworCXVuaW9uIGxwZmNfc2xpNF9jZmdfc2hkciAqY2ZnX3NoZHI7CisKKwlpZiAobWJveC0+dS5tYi5tYnhDb21tYW5kICE9IE1CWF9TTEk0X0NPTkZJRykKKwkJcmV0dXJuIExQRkNfTUJPWF9PUENPREVfTkE7CiAJc2xpNF9jZmcgPSAmbWJveC0+dS5tcWUudW4uc2xpNF9jb25maWc7CiAKIAkvKiBGb3IgZW1iZWRkZWQgbWJveCBjb21tYW5kLCBnZXQgb3Bjb2RlIGZyb20gZW1iZWRkZWQgc3ViLWhlYWRlciovCkBAIC0xOTEzLDcgKzE5NzEsNyBAQAogCiAJLyogRm9yIG5vbi1lbWJlZGRlZCBtYm94IGNvbW1hbmQsIGdldCBvcGNvZGUgZnJvbSBmaXJzdCBkbWEgcGFnZSAqLwogCWlmICh1bmxpa2VseSghbWJveC0+c2dlX2FycmF5KSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBMUEZDX01CT1hfT1BDT0RFX05BOwogCWNmZ19zaGRyID0gKHVuaW9uIGxwZmNfc2xpNF9jZmdfc2hkciAqKW1ib3gtPnNnZV9hcnJheS0+YWRkclswXTsKIAlyZXR1cm4gYmZfZ2V0KGxwZmNfbWJveF9oZHJfb3Bjb2RlLCAmY2ZnX3NoZHItPnJlcXVlc3QpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwppbmRleCBlYWRkMjQxLi4yZTFlNTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApAQCAtNTgsNiArNTksMTMgQEAKIAkiU0NTSV9QUk9UX1JFQURfUEFTUyIsCiAJIlNDU0lfUFJPVF9XUklURV9QQVNTIiwKIH07CisKK3N0cnVjdCBzY3NpX2RpZl90dXBsZSB7CisJX19iZTE2IGd1YXJkX3RhZzsgICAgICAgLyogQ2hlY2tzdW0gKi8KKwlfX2JlMTYgYXBwX3RhZzsgICAgICAgICAvKiBPcGFxdWUgc3RvcmFnZSAqLworCV9fYmUzMiByZWZfdGFnOyAgICAgICAgIC8qIFRhcmdldCBMQkEgb3IgaW5kaXJlY3QgTEJBICovCit9OworCiBzdGF0aWMgdm9pZAogbHBmY19yZWxlYXNlX3Njc2lfYnVmX3M0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfc2NzaV9idWYgKnBzYik7CiBzdGF0aWMgdm9pZApAQCAtMTI2Myw2ICsxMjcxLDE3NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCitscGZjX2NtZF9ibGtzaXplKHN0cnVjdCBzY3NpX2NtbmQgKnNjKQoreworCXJldHVybiBzYy0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZTsKK30KKworI2lmZGVmIENPTkZJR19TQ1NJX0xQRkNfREVCVUdfRlMKKy8qCisgKiBHaXZlbiBhIHNjc2kgY21uZCwgZGV0ZXJtaW5lIHRoZSBCbG9ja0d1YXJkIHRhZ3MgdG8gYmUgdXNlZCB3aXRoIGl0CisgKiBAc2M6IFRoZSBTQ1NJIGNvbW1hbmQgdG8gZXhhbWluZQorICogQHJlZnRhZzogKG91dCkgQmxvY2tHdWFyZCByZWZlcmVuY2UgdGFnIGZvciB0cmFuc21pdHRlZCBkYXRhCisgKiBAYXBwdGFnOiAob3V0KSBCbG9ja0d1YXJkIGFwcGxpY2F0aW9uIHRhZyBmb3IgdHJhbnNtaXR0ZWQgZGF0YQorICogQG5ld19ndWFyZCAoaW4pIFZhbHVlIHRvIHJlcGxhY2UgQ1JDIHdpdGggaWYgbmVlZGVkCisgKgorICogUmV0dXJucyAoMSkgaWYgZXJyb3IgaW5qZWN0aW9uIHdhcyBwZXJmb3JtZWQsICgwKSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludAorbHBmY19iZ19lcnJfaW5qZWN0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IHNjc2lfY21uZCAqc2MsCisJCXVpbnQzMl90ICpyZWZ0YWcsIHVpbnQxNl90ICphcHB0YWcsIHVpbnQzMl90IG5ld19ndWFyZCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNncGU7IC8qIHMvZyBwcm90IGVudHJ5ICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2RlOyAvKiBzL2cgZGF0YSBlbnRyeSAqLworCXN0cnVjdCBzY3NpX2RpZl90dXBsZSAqc3JjOworCXVpbnQzMl90IG9wID0gc2NzaV9nZXRfcHJvdF9vcChzYyk7CisJdWludDMyX3QgYmxrc2l6ZTsKKwl1aW50MzJfdCBudW1ibGtzOworCXNlY3Rvcl90IGxiYTsKKwlpbnQgcmMgPSAwOworCisJaWYgKG9wID09IFNDU0lfUFJPVF9OT1JNQUwpCisJCXJldHVybiAwOworCisJbGJhID0gc2NzaV9nZXRfbGJhKHNjKTsKKwlpZiAocGhiYS0+bHBmY19pbmplcnJfbGJhICE9IExQRkNfSU5KRVJSX0xCQV9PRkYpIHsKKwkJYmxrc2l6ZSA9IGxwZmNfY21kX2Jsa3NpemUoc2MpOworCQludW1ibGtzID0gKHNjc2lfYnVmZmxlbihzYykgKyBibGtzaXplIC0gMSkgLyBibGtzaXplOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBMQkEgaWYgb25lIGlzIHNwZWNpZmllZCAqLworCQlpZiAoKHBoYmEtPmxwZmNfaW5qZXJyX2xiYSA8IGxiYSkgfHwKKwkJCShwaGJhLT5scGZjX2luamVycl9sYmEgPj0gKGxiYSArIG51bWJsa3MpKSkKKwkJCXJldHVybiAwOworCX0KKworCXNncGUgPSBzY3NpX3Byb3Rfc2dsaXN0KHNjKTsKKwlzZ2RlID0gc2NzaV9zZ2xpc3Qoc2MpOworCisJLyogU2hvdWxkIHdlIGNoYW5nZSB0aGUgUmVmZXJlbmNlIFRhZyAqLworCWlmIChyZWZ0YWcpIHsKKwkJLyoKKwkJICogSWYgd2UgYXJlIFNDU0lfUFJPVF9XUklURV9TVFJJUCwgdGhlIHByb3RlY3Rpb24gZGF0YSBpcworCQkgKiBiZWluZyBzdHJpcHBlZCBmcm9tIHRoZSB3aXJlLCB0aHVzIGl0IGRvZXNuJ3QgbWF0dGVyLgorCQkgKi8KKwkJaWYgKChvcCA9PSBTQ1NJX1BST1RfV1JJVEVfUEFTUykgfHwKKwkJCShvcCA9PSBTQ1NJX1BST1RfV1JJVEVfSU5TRVJUKSkgeworCQkJaWYgKHBoYmEtPmxwZmNfaW5qZXJyX3dyZWZfY250KSB7CisKKwkJCQkvKiBERUFEQkVFRiB3aWxsIGJlIHRoZSByZWZ0YWcgb24gdGhlIHdpcmUgKi8KKwkJCQkqcmVmdGFnID0gMHhERUFEQkVFRjsKKwkJCQlwaGJhLT5scGZjX2luamVycl93cmVmX2NudC0tOworCQkJCXBoYmEtPmxwZmNfaW5qZXJyX2xiYSA9IExQRkNfSU5KRVJSX0xCQV9PRkY7CisJCQkJcmMgPSAxOworCisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkJCSI5MDgxIEJMS0dSRDogSW5qZWN0aW5nIHJlZnRhZyBlcnJvcjogIgorCQkJCQkid3JpdGUgbGJhIHglbHhcbiIsICh1bnNpZ25lZCBsb25nKWxiYSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocGhiYS0+bHBmY19pbmplcnJfcnJlZl9jbnQpIHsKKwkJCQkqcmVmdGFnID0gMHhERUFEQkVFRjsKKwkJCQlwaGJhLT5scGZjX2luamVycl9ycmVmX2NudC0tOworCQkJCXBoYmEtPmxwZmNfaW5qZXJyX2xiYSA9IExQRkNfSU5KRVJSX0xCQV9PRkY7CisJCQkJcmMgPSAxOworCisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkJCSI5MDc2IEJMS0dSRDogSW5qZWN0aW5nIHJlZnRhZyBlcnJvcjogIgorCQkJCQkicmVhZCBsYmEgeCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpbGJhKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNob3VsZCB3ZSBjaGFuZ2UgdGhlIEFwcGxpY2F0aW9uIFRhZyAqLworCWlmIChhcHB0YWcpIHsKKwkJLyoKKwkJICogSWYgd2UgYXJlIFNDU0lfUFJPVF9XUklURV9TVFJJUCwgdGhlIHByb3RlY3Rpb24gZGF0YSBpcworCQkgKiBiZWluZyBzdHJpcHBlZCBmcm9tIHRoZSB3aXJlLCB0aHVzIGl0IGRvZXNuJ3QgbWF0dGVyLgorCQkgKi8KKwkJaWYgKChvcCA9PSBTQ1NJX1BST1RfV1JJVEVfUEFTUykgfHwKKwkJCShvcCA9PSBTQ1NJX1BST1RfV1JJVEVfSU5TRVJUKSkgeworCQkJaWYgKHBoYmEtPmxwZmNfaW5qZXJyX3dhcHBfY250KSB7CisKKwkJCQkvKiBERUFEIHdpbGwgYmUgdGhlIGFwcHRhZyBvbiB0aGUgd2lyZSAqLworCQkJCSphcHB0YWcgPSAweERFQUQ7CisJCQkJcGhiYS0+bHBmY19pbmplcnJfd2FwcF9jbnQtLTsKKwkJCQlwaGJhLT5scGZjX2luamVycl9sYmEgPSBMUEZDX0lOSkVSUl9MQkFfT0ZGOworCQkJCXJjID0gMTsKKworCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJCQkiOTA3NyBCTEtHUkQ6IEluamVjdGluZyBhcHB0YWcgZXJyb3I6ICIKKwkJCQkJIndyaXRlIGxiYSB4JWx4XG4iLCAodW5zaWduZWQgbG9uZylsYmEpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHBoYmEtPmxwZmNfaW5qZXJyX3JhcHBfY250KSB7CisJCQkJKmFwcHRhZyA9IDB4REVBRDsKKwkJCQlwaGJhLT5scGZjX2luamVycl9yYXBwX2NudC0tOworCQkJCXBoYmEtPmxwZmNfaW5qZXJyX2xiYSA9IExQRkNfSU5KRVJSX0xCQV9PRkY7CisJCQkJcmMgPSAxOworCisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkJCSI5MDc4IEJMS0dSRDogSW5qZWN0aW5nIGFwcHRhZyBlcnJvcjogIgorCQkJCQkicmVhZCBsYmEgeCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpbGJhKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNob3VsZCB3ZSBjaGFuZ2UgdGhlIEd1YXJkIFRhZyAqLworCisJLyoKKwkgKiBJZiB3ZSBhcmUgU0NTSV9QUk9UX1dSSVRFX0lOU0VSVCwgdGhlIHByb3RlY3Rpb24gZGF0YSBpcworCSAqIGJlaW5nIG9uIHRoZSB3aXJlIGlzIGJlaW5nIGZ1bGx5IGdlbmVyYXRlZCBvbiB0aGUgSEJBLgorCSAqIFRoZSBob3N0IGNhbm5vdCBjaGFuZ2UgaXQgb3IgZm9yY2UgYW4gZXJyb3IuCisJICovCisJaWYgKCgob3AgPT0gU0NTSV9QUk9UX1dSSVRFX1NUUklQKSB8fAorCQkob3AgPT0gU0NTSV9QUk9UX1dSSVRFX1BBU1MpKSAmJgorCQlwaGJhLT5scGZjX2luamVycl93Z3JkX2NudCkgeworCQlpZiAoc2dwZSkgeworCQkJc3JjID0gKHN0cnVjdCBzY3NpX2RpZl90dXBsZSAqKXNnX3ZpcnQoc2dwZSk7CisJCQkvKgorCQkJICogSnVzdCBpbmplY3QgYW4gZXJyb3IgaW4gdGhlIGZpcnN0CisJCQkgKiBwcm90IGJsb2NrLgorCQkJICovCisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCQkiOTA3OSBCTEtHUkQ6IEluamVjdGluZyBndWFyZCBlcnJvcjogIgorCQkJCSJ3cml0ZSBsYmEgeCVseCBvbGRHdWFyZCB4JXggcmVmVGFnIHgleFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylsYmEsIHNyYy0+Z3VhcmRfdGFnLAorCQkJCXNyYy0+cmVmX3RhZyk7CisKKwkJCXNyYy0+Z3VhcmRfdGFnID0gKHVpbnQxNl90KW5ld19ndWFyZDsKKwkJCXBoYmEtPmxwZmNfaW5qZXJyX3dncmRfY250LS07CisJCQlwaGJhLT5scGZjX2luamVycl9sYmEgPSBMUEZDX0lOSkVSUl9MQkFfT0ZGOworCQkJcmMgPSAxOworCisJCX0gZWxzZSB7CisJCQlibGtzaXplID0gbHBmY19jbWRfYmxrc2l6ZShzYyk7CisJCQkvKgorCQkJICogSnVtcCBwYXN0IHRoZSBmaXJzdCBkYXRhIGJsb2NrCisJCQkgKiBhbmQgaW5qZWN0IGFuIGVycm9yIGluIHRoZQorCQkJICogcHJvdCBkYXRhLiBUaGUgcHJvdCBkYXRhIGlzIGFscmVhZHkKKwkJCSAqIGVtYmVkZGVkIGFmdGVyIHRoZSByZWd1bGFyIGRhdGEuCisJCQkgKi8KKwkJCXNyYyA9IChzdHJ1Y3Qgc2NzaV9kaWZfdHVwbGUgKikKKwkJCQkJKHNnX3ZpcnQoc2dkZSkgKyBibGtzaXplKTsKKworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkJIjkwODAgQkxLR1JEOiBJbmplY3RpbmcgZ3VhcmQgZXJyb3I6ICIKKwkJCQkid3JpdGUgbGJhIHglbHggb2xkR3VhcmQgeCV4IHJlZlRhZyB4JXhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGJhLCBzcmMtPmd1YXJkX3RhZywKKwkJCQlzcmMtPnJlZl90YWcpOworCisJCQlzcmMtPmd1YXJkX3RhZyA9ICh1aW50MTZfdCluZXdfZ3VhcmQ7CisJCQlwaGJhLT5scGZjX2luamVycl93Z3JkX2NudC0tOworCQkJcGhiYS0+bHBmY19pbmplcnJfbGJhID0gTFBGQ19JTkpFUlJfTEJBX09GRjsKKwkJCXJjID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYKKwogLyoKICAqIEdpdmVuIGEgc2NzaSBjbW5kLCBkZXRlcm1pbmUgdGhlIEJsb2NrR3VhcmQgb3Bjb2RlcyB0byBiZSB1c2VkIHdpdGggaXQKICAqIEBzYzogVGhlIFNDU0kgY29tbWFuZCB0byBleGFtaW5lCkBAIC0xMzQxLDE4ICsxNTE3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdHJ1Y3Qgc2NzaV9kaWZfdHVwbGUgewotCV9fYmUxNiBndWFyZF90YWc7ICAgICAgIC8qIENoZWNrc3VtICovCi0JX19iZTE2IGFwcF90YWc7ICAgICAgICAgLyogT3BhcXVlIHN0b3JhZ2UgKi8KLQlfX2JlMzIgcmVmX3RhZzsgICAgICAgICAvKiBUYXJnZXQgTEJBIG9yIGluZGlyZWN0IExCQSAqLwotfTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZAotbHBmY19jbWRfYmxrc2l6ZShzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKLXsKLQlyZXR1cm4gc2MtPmRldmljZS0+c2VjdG9yX3NpemU7Ci19Ci0KIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgYnVmZmVyIGxpc3QgZm9yIHByb3RlY3Rpb24gZ3JvdXBzIG9mCiAgKiB0eXBlIExQRkNfUEdfVFlQRV9OT19ESUYKQEAgLTE0MDEsNiArMTU2NSwxMSBAQAogCWJsa3NpemUgPSBscGZjX2NtZF9ibGtzaXplKHNjKTsKIAlyZWZ0YWcgPSBzY3NpX2dldF9sYmEoc2MpICYgMHhmZmZmZmZmZjsKIAorI2lmZGVmIENPTkZJR19TQ1NJX0xQRkNfREVCVUdfRlMKKwkvKiByZWZ0YWcgaXMgdGhlIG9ubHkgZXJyb3Igd2UgY2FuIGluamVjdCBoZXJlICovCisJbHBmY19iZ19lcnJfaW5qZWN0KHBoYmEsIHNjLCAmcmVmdGFnLCAwLCAwKTsKKyNlbmRpZgorCiAJLyogc2V0dXAgUERFNSB3aXRoIHdoYXQgd2UgaGF2ZSAqLwogCXBkZTUgPSAoc3RydWN0IGxwZmNfcGRlNSAqKSBicGw7CiAJbWVtc2V0KHBkZTUsIDAsIHNpemVvZihzdHJ1Y3QgbHBmY19wZGU1KSk7CkBAIC0xNTMyLDYgKzE3MDEsMTEgQEAKIAlibGtzaXplID0gbHBmY19jbWRfYmxrc2l6ZShzYyk7CiAJcmVmdGFnID0gc2NzaV9nZXRfbGJhKHNjKSAmIDB4ZmZmZmZmZmY7CiAKKyNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCisJLyogcmVmdGFnIC8gZ3VhcmQgdGFnIGFyZSB0aGUgb25seSBlcnJvcnMgd2UgY2FuIGluamVjdCBoZXJlICovCisJbHBmY19iZ19lcnJfaW5qZWN0KHBoYmEsIHNjLCAmcmVmdGFnLCAwLCAweERFQUQpOworI2VuZGlmCisKIAlzcGxpdF9vZmZzZXQgPSAwOwogCWRvIHsKIAkJLyogc2V0dXAgUERFNSB3aXRoIHdoYXQgd2UgaGF2ZSAqLwpAQCAtMTY3MSw3ICsxODQ1LDYgQEAKIAkJfQogCiAJfSB3aGlsZSAoIWFsbGRvbmUpOwotCiBvdXQ6CiAKIAlyZXR1cm4gbnVtX2JkZTsKQEAgLTIwNzUsNiArMjI0OCw3IEBACiAJCQllbHNlCiAJCQkJYmZfc2V0KGxwZmNfc2xpNF9zZ2VfbGFzdCwgc2dsLCAwKTsKIAkJCWJmX3NldChscGZjX3NsaTRfc2dlX29mZnNldCwgc2dsLCBkbWFfb2Zmc2V0KTsKKwkJCWJmX3NldChscGZjX3NsaTRfc2dlX3R5cGUsIHNnbCwgTFBGQ19TR0VfVFlQRV9EQVRBKTsKIAkJCXNnbC0+d29yZDIgPSBjcHVfdG9fbGUzMihzZ2wtPndvcmQyKTsKIAkJCXNnbC0+c2dlX2xlbiA9IGNwdV90b19sZTMyKGRtYV9sZW4pOwogCQkJZG1hX29mZnNldCArPSBkbWFfbGVuOwpAQCAtMjMyNSw4ICsyNDk5LDkgQEAKIAl9CiAJbHAgPSAodWludDMyX3QgKiljbW5kLT5zZW5zZV9idWZmZXI7CiAKLQlpZiAoIXNjc2lfc3RhdHVzICYmIChyZXNwX2luZm8gJiBSRVNJRF9VTkRFUikpCi0JCWxvZ2l0ID0gTE9HX0ZDUDsKKwlpZiAoIXNjc2lfc3RhdHVzICYmIChyZXNwX2luZm8gJiBSRVNJRF9VTkRFUikgJiYKKwkJdnBvcnQtPmNmZ19sb2dfdmVyYm9zZSAmIExPR19GQ1BfVU5ERVIpCisJCWxvZ2l0ID0gTE9HX0ZDUF9VTkRFUjsKIAogCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgbG9naXQsCiAJCQkgIjkwMjQgRkNQIGNvbW1hbmQgeCV4IGZhaWxlZDogeCV4IFNOUyB4JXggeCV4ICIKQEAgLTIzNDIsNyArMjUxNyw3IEBACiAJaWYgKHJlc3BfaW5mbyAmIFJFU0lEX1VOREVSKSB7CiAJCXNjc2lfc2V0X3Jlc2lkKGNtbmQsIGJlMzJfdG9fY3B1KGZjcHJzcC0+cnNwUmVzSWQpKTsKIAotCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19GQ1AsCisJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0ZDUF9VTkRFUiwKIAkJCQkgIjkwMjUgRkNQIFJlYWQgVW5kZXJydW4sIGV4cGVjdGVkICVkLCAiCiAJCQkJICJyZXNpZHVhbCAlZCBEYXRhOiB4JXggeCV4IHgleFxuIiwKIAkJCQkgYmUzMl90b19jcHUoZmNwY21kLT5mY3BEbCksCkBAIC0yNDQ5LDYgKzI2MjQsNyBAQAogCXN0cnVjdCBscGZjX2Zhc3RfcGF0aF9ldmVudCAqZmFzdF9wYXRoX2V2dDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAl1aW50MzJfdCBxdWV1ZV9kZXB0aCwgc2NzaV9pZDsKKwl1aW50MzJfdCBsb2dpdCA9IExPR19GQ1A7CiAKIAkvKiBTYW5pdHkgY2hlY2sgb24gcmV0dXJuIG9mIG91dHN0YW5kaW5nIGNvbW1hbmQgKi8KIAlpZiAoIShscGZjX2NtZC0+cENtZCkpCkBAIC0yNDcwLDE2ICsyNjQ2LDIyIEBACiAJCQlscGZjX2NtZC0+c3RhdHVzID0gSU9TVEFUX0RSSVZFUl9SRUpFQ1Q7CiAJCWVsc2UgaWYgKGxwZmNfY21kLT5zdGF0dXMgPj0gSU9TVEFUX0NOVCkKIAkJCWxwZmNfY21kLT5zdGF0dXMgPSBJT1NUQVRfREVGQVVMVDsKLQotCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19GQ1AsCi0JCQkJICI5MDMwIEZDUCBjbWQgeCV4IGZhaWxlZCA8JWQvJWQ+ICIKLQkJCQkgInN0YXR1czogeCV4IHJlc3VsdDogeCV4IERhdGE6IHgleCB4JXhcbiIsCi0JCQkJIGNtZC0+Y21uZFswXSwKLQkJCQkgY21kLT5kZXZpY2UgPyBjbWQtPmRldmljZS0+aWQgOiAweGZmZmYsCi0JCQkJIGNtZC0+ZGV2aWNlID8gY21kLT5kZXZpY2UtPmx1biA6IDB4ZmZmZiwKLQkJCQkgbHBmY19jbWQtPnN0YXR1cywgbHBmY19jbWQtPnJlc3VsdCwKLQkJCQkgcElvY2JPdXQtPmlvY2IudWxwQ29udGV4dCwKLQkJCQkgbHBmY19jbWQtPmN1cl9pb2NicS5pb2NiLnVscElvVGFnKTsKKwkJaWYgKGxwZmNfY21kLT5zdGF0dXMgPT0gSU9TVEFUX0ZDUF9SU1BfRVJST1IKKwkJCSYmICFscGZjX2NtZC0+ZmNwX3JzcC0+cnNwU3RhdHVzMworCQkJJiYgKGxwZmNfY21kLT5mY3BfcnNwLT5yc3BTdGF0dXMyICYgUkVTSURfVU5ERVIpCisJCQkmJiAhKHBoYmEtPmNmZ19sb2dfdmVyYm9zZSAmIExPR19GQ1BfVU5ERVIpKQorCQkJbG9naXQgPSAwOworCQllbHNlCisJCQlsb2dpdCA9IExPR19GQ1AgfCBMT0dfRkNQX1VOREVSOworCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIGxvZ2l0LAorCQkJICI5MDMwIEZDUCBjbWQgeCV4IGZhaWxlZCA8JWQvJWQ+ICIKKwkJCSAic3RhdHVzOiB4JXggcmVzdWx0OiB4JXggRGF0YTogeCV4IHgleFxuIiwKKwkJCSBjbWQtPmNtbmRbMF0sCisJCQkgY21kLT5kZXZpY2UgPyBjbWQtPmRldmljZS0+aWQgOiAweGZmZmYsCisJCQkgY21kLT5kZXZpY2UgPyBjbWQtPmRldmljZS0+bHVuIDogMHhmZmZmLAorCQkJIGxwZmNfY21kLT5zdGF0dXMsIGxwZmNfY21kLT5yZXN1bHQsCisJCQkgcElvY2JPdXQtPmlvY2IudWxwQ29udGV4dCwKKwkJCSBscGZjX2NtZC0+Y3VyX2lvY2JxLmlvY2IudWxwSW9UYWcpOwogCiAJCXN3aXRjaCAobHBmY19jbWQtPnN0YXR1cykgewogCQljYXNlIElPU1RBVF9GQ1BfUlNQX0VSUk9SOgpAQCAtMzA1Niw4ICszMjM4LDkgQEAKIAl9CiAJbmRscCA9IHJkYXRhLT5wbm9kZTsKIAotCWlmICghKHBoYmEtPnNsaTNfb3B0aW9ucyAmIExQRkNfU0xJM19CR19FTkFCTEVEKSAmJgotCQlzY3NpX2dldF9wcm90X29wKGNtbmQpICE9IFNDU0lfUFJPVF9OT1JNQUwpIHsKKwlpZiAoKHNjc2lfZ2V0X3Byb3Rfb3AoY21uZCkgIT0gU0NTSV9QUk9UX05PUk1BTCkgJiYKKwkJKCEocGhiYS0+c2xpM19vcHRpb25zICYgTFBGQ19TTEkzX0JHX0VOQUJMRUQpIHx8CisJCShwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpKSkgewogCiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAogCQkJCSI5MDU4IEJMS0dSRDogRVJST1I6IHJjdmQgcHJvdGVjdGVkIGNtZDolMDJ4IgpAQCAtMzY5MSw5ICszODc0LDkgQEAKIAlmY19ob3N0X3Bvc3RfdmVuZG9yX2V2ZW50KHNob3N0LCBmY19nZXRfZXZlbnRfbnVtYmVyKCksCiAJCXNpemVvZihzY3NpX2V2ZW50KSwgKGNoYXIgKikmc2NzaV9ldmVudCwgTFBGQ19OTF9WRU5ET1JfSUQpOwogCi0JcmV0ID0gZmNfYmxvY2tfc2NzaV9laChjbW5kKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCXN0YXR1cyA9IGZjX2Jsb2NrX3Njc2lfZWgoY21uZCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKIAogCS8qCiAJICogU2luY2UgdGhlIGRyaXZlciBtYW5hZ2VzIGEgc2luZ2xlIGJ1cyBkZXZpY2UsIHJlc2V0IGFsbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKaW5kZXggOGI3OTlmMC4uNGQ0MTA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCkBAIC0zNzksMTAgKzM3OSwxMCBAQAogCWRxLT5ob3N0X2luZGV4ID0gKChkcS0+aG9zdF9pbmRleCArIDEpICUgZHEtPmVudHJ5X2NvdW50KTsKIAogCS8qIFJpbmcgVGhlIEhlYWRlciBSZWNlaXZlIFF1ZXVlIERvb3JiZWxsICovCi0JaWYgKCEoaHEtPmhvc3RfaW5kZXggJSBMUEZDX1JRX1BPU1RfQkFUQ0gpKSB7CisJaWYgKCEoaHEtPmhvc3RfaW5kZXggJSBocS0+ZW50cnlfcmVwb3N0KSkgewogCQlkb29yYmVsbC53b3JkMCA9IDA7CiAJCWJmX3NldChscGZjX3JxX2Rvb3JiZWxsX251bV9wb3N0ZWQsICZkb29yYmVsbCwKLQkJICAgICAgIExQRkNfUlFfUE9TVF9CQVRDSCk7CisJCSAgICAgICBocS0+ZW50cnlfcmVwb3N0KTsKIAkJYmZfc2V0KGxwZmNfcnFfZG9vcmJlbGxfaWQsICZkb29yYmVsbCwgaHEtPnF1ZXVlX2lkKTsKIAkJd3JpdGVsKGRvb3JiZWxsLndvcmQwLCBocS0+cGhiYS0+c2xpNF9oYmEuUlFEQnJlZ2FkZHIpOwogCX0KQEAgLTE4NjQsNyArMTg2NCw3IEBACiB7CiAJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKIAkJcmV0dXJuIGxwZmNfc2xpX2hicWJ1Zl9maWxsX2hicXMocGhiYSwgcW5vLAotCQkJCQkgbHBmY19oYnFfZGVmc1txbm9dLT5lbnRyeV9jb3VudCk7CisJCQkJCWxwZmNfaGJxX2RlZnNbcW5vXS0+ZW50cnlfY291bnQpOwogCWVsc2UKIAkJcmV0dXJuIGxwZmNfc2xpX2hicWJ1Zl9maWxsX2hicXMocGhiYSwgcW5vLAogCQkJCQkgbHBmY19oYnFfZGVmc1txbm9dLT5pbml0X2NvdW50KTsKQEAgLTIyMDAsMTAgKzIyMDAsMTMgQEAKIAkJCS8qIFVua25vd24gbWFpbGJveCBjb21tYW5kIGNvbXBsICovCiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19NQk9YIHwgTE9HX1NMSSwKIAkJCQkJIiglZCk6MDMyMyBVbmtub3duIE1haWxib3ggY29tbWFuZCAiCi0JCQkJCSJ4JXggKHgleCkgQ21wbFxuIiwKKwkJCQkJIngleCAoeCV4L3gleCkgQ21wbFxuIiwKIAkJCQkJcG1iLT52cG9ydCA/IHBtYi0+dnBvcnQtPnZwaSA6IDAsCiAJCQkJCXBtYm94LT5tYnhDb21tYW5kLAotCQkJCQlscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIHBtYikpOworCQkJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsCisJCQkJCQkJCQlwbWIpLAorCQkJCQlscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsCisJCQkJCQkJCQlwbWIpKTsKIAkJCXBoYmEtPmxpbmtfc3RhdGUgPSBMUEZDX0hCQV9FUlJPUjsKIAkJCXBoYmEtPndvcmtfaHMgPSBIU19GRkVSMzsKIAkJCWxwZmNfaGFuZGxlX2VyYXR0KHBoYmEpOwpAQCAtMjIxNSwxNyArMjIxOCwxOSBAQAogCQkJaWYgKHBtYm94LT5tYnhTdGF0dXMgPT0gTUJYRVJSX05PX1JFU09VUkNFUykgewogCQkJCS8qIE1ib3ggY21kIGNtcGwgZXJyb3IgLSBSRVRSWWluZyAqLwogCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sCi0JCQkJCQlMT0dfTUJPWCB8IExPR19TTEksCi0JCQkJCQkiKCVkKTowMzA1IE1ib3ggY21kIGNtcGwgIgotCQkJCQkJImVycm9yIC0gUkVUUllpbmcgRGF0YTogeCV4ICIKLQkJCQkJCSIoeCV4KSB4JXggeCV4IHgleFxuIiwKLQkJCQkJCXBtYi0+dnBvcnQgPyBwbWItPnZwb3J0LT52cGkgOjAsCi0JCQkJCQlwbWJveC0+bWJ4Q29tbWFuZCwKLQkJCQkJCWxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwKLQkJCQkJCQkJCSAgcG1iKSwKLQkJCQkJCXBtYm94LT5tYnhTdGF0dXMsCi0JCQkJCQlwbWJveC0+dW4udmFyV29yZHNbMF0sCi0JCQkJCQlwbWItPnZwb3J0LT5wb3J0X3N0YXRlKTsKKwkJCQkJTE9HX01CT1ggfCBMT0dfU0xJLAorCQkJCQkiKCVkKTowMzA1IE1ib3ggY21kIGNtcGwgIgorCQkJCQkiZXJyb3IgLSBSRVRSWWluZyBEYXRhOiB4JXggIgorCQkJCQkiKHgleC94JXgpIHgleCB4JXggeCV4XG4iLAorCQkJCQlwbWItPnZwb3J0ID8gcG1iLT52cG9ydC0+dnBpIDogMCwKKwkJCQkJcG1ib3gtPm1ieENvbW1hbmQsCisJCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwKKwkJCQkJCQkJCXBtYiksCisJCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwKKwkJCQkJCQkJCXBtYiksCisJCQkJCXBtYm94LT5tYnhTdGF0dXMsCisJCQkJCXBtYm94LT51bi52YXJXb3Jkc1swXSwKKwkJCQkJcG1iLT52cG9ydC0+cG9ydF9zdGF0ZSk7CiAJCQkJcG1ib3gtPm1ieFN0YXR1cyA9IDA7CiAJCQkJcG1ib3gtPm1ieE93bmVyID0gT1dOX0hPU1Q7CiAJCQkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIHBtYiwgTUJYX05PV0FJVCk7CkBAIC0yMjM2LDExICsyMjQxLDEyIEBACiAKIAkJLyogTWFpbGJveCBjbWQgPGNtZD4gQ21wbCA8Y21wbD4gKi8KIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX01CT1ggfCBMT0dfU0xJLAotCQkJCSIoJWQpOjAzMDcgTWFpbGJveCBjbWQgeCV4ICh4JXgpIENtcGwgeCVwICIKKwkJCQkiKCVkKTowMzA3IE1haWxib3ggY21kIHgleCAoeCV4L3gleCkgQ21wbCB4JXAgIgogCQkJCSJEYXRhOiB4JXggeCV4IHgleCB4JXggeCV4IHgleCB4JXggeCV4IHgleFxuIiwKIAkJCQlwbWItPnZwb3J0ID8gcG1iLT52cG9ydC0+dnBpIDogMCwKIAkJCQlwbWJveC0+bWJ4Q29tbWFuZCwKLQkJCQlscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIHBtYiksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLCBwbWIpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwgcG1iKSwKIAkJCQlwbWItPm1ib3hfY21wbCwKIAkJCQkqKCh1aW50MzJfdCAqKSBwbWJveCksCiAJCQkJcG1ib3gtPnVuLnZhcldvcmRzWzBdLApAQCAtNDY4Niw2ICs0NjkyLDE3NSBAQAogfQogCiAvKioKKyAqIGxwZmNfc2xpNF9yZXRyaWV2ZV9wcG9ydF9uYW1lIC0gUmV0cmlldmUgU0xJNCBkZXZpY2UgcGh5c2ljYWwgcG9ydCBuYW1lCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcmV0cmlldmVzIFNMSTQgZGV2aWNlIHBoeXNpY2FsIHBvcnQgbmFtZSB0aGlzIFBDSSBmdW5jdGlvbgorICogaXMgYXR0YWNoZWQgdG8uCisgKgorICogUmV0dXJuIGNvZGVzCisgKiAgICAgIDAgLSBzdWNlc3NmdWwKKyAqICAgICAgb3RoZXJ3aXNlIC0gZmFpbGVkIHRvIHJldHJpZXZlIHBoeXNpY2FsIHBvcnQgbmFtZQorICoqLworc3RhdGljIGludAorbHBmY19zbGk0X3JldHJpZXZlX3Bwb3J0X25hbWUoc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCUxQRkNfTUJPWFFfdCAqbWJveHE7CisJc3RydWN0IGxwZmNfbWJ4X3JlYWRfY29uZmlnICpyZF9jb25maWc7CisJc3RydWN0IGxwZmNfbWJ4X2dldF9jbnRsX2F0dHJpYnV0ZXMgKm1ieF9jbnRsX2F0dHI7CisJc3RydWN0IGxwZmNfY29udHJvbGxlcl9hdHRyaWJ1dGUgKmNudGxfYXR0cjsKKwlzdHJ1Y3QgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZSAqZ2V0X3BvcnRfbmFtZTsKKwl2b2lkICp2aXJ0YWRkciA9IE5VTEw7CisJdWludDMyX3QgYWxsb2NsZW4sIHJlcWxlbjsKKwl1aW50MzJfdCBzaGRyX3N0YXR1cywgc2hkcl9hZGRfc3RhdHVzOworCXVuaW9uIGxwZmNfc2xpNF9jZmdfc2hkciAqc2hkcjsKKwljaGFyIGNwb3J0X25hbWUgPSAwOworCWludCByYzsKKworCS8qIFdlIGFzc3VtZSBub3RoaW5nIGF0IHRoaXMgcG9pbnQgKi8KKwlwaGJhLT5zbGk0X2hiYS5sbmtfaW5mby5sbmtfZHYgPSBMUEZDX0xOS19EQVRfSU5WQUw7CisJcGhiYS0+c2xpNF9oYmEucHBvcnRfbmFtZV9zdGEgPSBMUEZDX1NMSTRfUFBOQU1FX05PTjsKKworCW1ib3hxID0gKExQRkNfTUJPWFFfdCAqKW1lbXBvb2xfYWxsb2MocGhiYS0+bWJveF9tZW1fcG9vbCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYm94cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBvYnRhaW4gbGluayB0eXBlIGFuZCBsaW5rIG51bWJlciB2aWEgUkVBRF9DT05GSUcgKi8KKwlscGZjX3JlYWRfY29uZmlnKHBoYmEsIG1ib3hxKTsKKwlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveHEsIE1CWF9QT0xMKTsKKwlpZiAocmMgPT0gTUJYX1NVQ0NFU1MpIHsKKwkJcmRfY29uZmlnID0gJm1ib3hxLT51Lm1xZS51bi5yZF9jb25maWc7CisJCWlmIChiZl9nZXQobHBmY19tYnhfcmRfY29uZl9sbmtfbGR2LCByZF9jb25maWcpKSB7CisJCQlwaGJhLT5zbGk0X2hiYS5sbmtfaW5mby5sbmtfZHYgPSBMUEZDX0xOS19EQVRfVkFMOworCQkJcGhiYS0+c2xpNF9oYmEubG5rX2luZm8ubG5rX3RwID0KKwkJCQliZl9nZXQobHBmY19tYnhfcmRfY29uZl9sbmtfdHlwZSwgcmRfY29uZmlnKTsKKwkJCXBoYmEtPnNsaTRfaGJhLmxua19pbmZvLmxua19ubyA9CisJCQkJYmZfZ2V0KGxwZmNfbWJ4X3JkX2NvbmZfbG5rX251bWIsIHJkX2NvbmZpZyk7CisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfU0xJLAorCQkJCQkiMzA4MSBsbmtfdHlwZTolZCwgbG5rX251bWI6JWRcbiIsCisJCQkJCXBoYmEtPnNsaTRfaGJhLmxua19pbmZvLmxua190cCwKKwkJCQkJcGhiYS0+c2xpNF9oYmEubG5rX2luZm8ubG5rX25vKTsKKwkJCWdvdG8gcmV0cmlldmVfcHBuYW1lOworCQl9IGVsc2UKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19TTEksCisJCQkJCSIzMDgyIE1haWxib3ggKHgleCkgcmV0dXJuZWQgbGR2OngwXG4iLAorCQkJCQliZl9nZXQobHBmY19tcWVfY29tbWFuZCwKKwkJCQkJICAgICAgICZtYm94cS0+dS5tcWUpKTsKKwl9IGVsc2UKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX1NMSSwKKwkJCQkiMzA4MyBNYWlsYm94ICh4JXgpIGZhaWxlZCwgc3RhdHVzOngleFxuIiwKKwkJCQliZl9nZXQobHBmY19tcWVfY29tbWFuZCwgJm1ib3hxLT51Lm1xZSksCisJCQkJYmZfZ2V0KGxwZmNfbXFlX3N0YXR1cywgJm1ib3hxLT51Lm1xZSkpOworCisJLyogb2J0YWluIGxpbmsgdHlwZSBhbmQgbGluayBudW1iZXIgdmlhIENPTU1PTl9HRVRfQ05UTF9BVFRSSUJVVEVTICovCisJcmVxbGVuID0gc2l6ZW9mKHN0cnVjdCBscGZjX21ieF9nZXRfY250bF9hdHRyaWJ1dGVzKTsKKwlhbGxvY2xlbiA9IGxwZmNfc2xpNF9jb25maWcocGhiYSwgbWJveHEsIExQRkNfTUJPWF9TVUJTWVNURU1fQ09NTU9OLAorCQkJTFBGQ19NQk9YX09QQ09ERV9HRVRfQ05UTF9BVFRSSUJVVEVTLCByZXFsZW4sCisJCQlMUEZDX1NMSTRfTUJYX05FTUJFRCk7CisJaWYgKGFsbG9jbGVuIDwgcmVxbGVuKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKKwkJCQkiMzA4NCBBbGxvY2F0ZWQgRE1BIG1lbW9yeSBzaXplICglZCkgaXMgIgorCQkJCSJsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBETUEgbWVtb3J5IHNpemUgIgorCQkJCSIoJWQpXG4iLCBhbGxvY2xlbiwgcmVxbGVuKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX21ib3hxOworCX0KKwlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveHEsIE1CWF9QT0xMKTsKKwl2aXJ0YWRkciA9IG1ib3hxLT5zZ2VfYXJyYXktPmFkZHJbMF07CisJbWJ4X2NudGxfYXR0ciA9IChzdHJ1Y3QgbHBmY19tYnhfZ2V0X2NudGxfYXR0cmlidXRlcyAqKXZpcnRhZGRyOworCXNoZHIgPSAmbWJ4X2NudGxfYXR0ci0+Y2ZnX3NoZHI7CisJc2hkcl9zdGF0dXMgPSBiZl9nZXQobHBmY19tYm94X2hkcl9zdGF0dXMsICZzaGRyLT5yZXNwb25zZSk7CisJc2hkcl9hZGRfc3RhdHVzID0gYmZfZ2V0KGxwZmNfbWJveF9oZHJfYWRkX3N0YXR1cywgJnNoZHItPnJlc3BvbnNlKTsKKwlpZiAoc2hkcl9zdGF0dXMgfHwgc2hkcl9hZGRfc3RhdHVzIHx8IHJjKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19TTEksCisJCQkJIjMwODUgTWFpbGJveCB4JXggKHgleC94JXgpIGZhaWxlZCwgIgorCQkJCSJyYzp4JXgsIHN0YXR1czp4JXgsIGFkZF9zdGF0dXM6eCV4XG4iLAorCQkJCWJmX2dldChscGZjX21xZV9jb21tYW5kLCAmbWJveHEtPnUubXFlKSwKKwkJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCQlscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCQlyYywgc2hkcl9zdGF0dXMsIHNoZHJfYWRkX3N0YXR1cyk7CisJCXJjID0gLUVOWElPOworCQlnb3RvIG91dF9mcmVlX21ib3hxOworCX0KKwljbnRsX2F0dHIgPSAmbWJ4X2NudGxfYXR0ci0+Y250bF9hdHRyOworCXBoYmEtPnNsaTRfaGJhLmxua19pbmZvLmxua19kdiA9IExQRkNfTE5LX0RBVF9WQUw7CisJcGhiYS0+c2xpNF9oYmEubG5rX2luZm8ubG5rX3RwID0KKwkJYmZfZ2V0KGxwZmNfY250bF9hdHRyX2xua190eXBlLCBjbnRsX2F0dHIpOworCXBoYmEtPnNsaTRfaGJhLmxua19pbmZvLmxua19ubyA9CisJCWJmX2dldChscGZjX2NudGxfYXR0cl9sbmtfbnVtYiwgY250bF9hdHRyKTsKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfU0xJLAorCQkJIjMwODYgbG5rX3R5cGU6JWQsIGxua19udW1iOiVkXG4iLAorCQkJcGhiYS0+c2xpNF9oYmEubG5rX2luZm8ubG5rX3RwLAorCQkJcGhiYS0+c2xpNF9oYmEubG5rX2luZm8ubG5rX25vKTsKKworcmV0cmlldmVfcHBuYW1lOgorCWxwZmNfc2xpNF9jb25maWcocGhiYSwgbWJveHEsIExQRkNfTUJPWF9TVUJTWVNURU1fQ09NTU9OLAorCQlMUEZDX01CT1hfT1BDT0RFX0dFVF9QT1JUX05BTUUsCisJCXNpemVvZihzdHJ1Y3QgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZSkgLQorCQlzaXplb2Yoc3RydWN0IGxwZmNfc2xpNF9jZmdfbWhkciksCisJCUxQRkNfU0xJNF9NQlhfRU1CRUQpOworCWdldF9wb3J0X25hbWUgPSAmbWJveHEtPnUubXFlLnVuLmdldF9wb3J0X25hbWU7CisJc2hkciA9ICh1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKikmZ2V0X3BvcnRfbmFtZS0+aGVhZGVyLmNmZ19zaGRyOworCWJmX3NldChscGZjX21ib3hfaGRyX3ZlcnNpb24sICZzaGRyLT5yZXF1ZXN0LCBMUEZDX09QQ09ERV9WRVJTSU9OXzEpOworCWJmX3NldChscGZjX21ieF9nZXRfcG9ydF9uYW1lX2xua190eXBlLCAmZ2V0X3BvcnRfbmFtZS0+dS5yZXF1ZXN0LAorCQlwaGJhLT5zbGk0X2hiYS5sbmtfaW5mby5sbmtfdHApOworCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBtYm94cSwgTUJYX1BPTEwpOworCXNoZHJfc3RhdHVzID0gYmZfZ2V0KGxwZmNfbWJveF9oZHJfc3RhdHVzLCAmc2hkci0+cmVzcG9uc2UpOworCXNoZHJfYWRkX3N0YXR1cyA9IGJmX2dldChscGZjX21ib3hfaGRyX2FkZF9zdGF0dXMsICZzaGRyLT5yZXNwb25zZSk7CisJaWYgKHNoZHJfc3RhdHVzIHx8IHNoZHJfYWRkX3N0YXR1cyB8fCByYykgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfU0xJLAorCQkJCSIzMDg3IE1haWxib3ggeCV4ICh4JXgveCV4KSBmYWlsZWQ6ICIKKwkJCQkicmM6eCV4LCBzdGF0dXM6eCV4LCBhZGRfc3RhdHVzOngleFxuIiwKKwkJCQliZl9nZXQobHBmY19tcWVfY29tbWFuZCwgJm1ib3hxLT51Lm1xZSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLCBtYm94cSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCisJCQkJcmMsIHNoZHJfc3RhdHVzLCBzaGRyX2FkZF9zdGF0dXMpOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBvdXRfZnJlZV9tYm94cTsKKwl9CisJc3dpdGNoIChwaGJhLT5zbGk0X2hiYS5sbmtfaW5mby5sbmtfbm8pIHsKKwljYXNlIExQRkNfTElOS19OVU1CRVJfMDoKKwkJY3BvcnRfbmFtZSA9IGJmX2dldChscGZjX21ieF9nZXRfcG9ydF9uYW1lX25hbWUwLAorCQkJCSZnZXRfcG9ydF9uYW1lLT51LnJlc3BvbnNlKTsKKwkJcGhiYS0+c2xpNF9oYmEucHBvcnRfbmFtZV9zdGEgPSBMUEZDX1NMSTRfUFBOQU1FX0dFVDsKKwkJYnJlYWs7CisJY2FzZSBMUEZDX0xJTktfTlVNQkVSXzE6CisJCWNwb3J0X25hbWUgPSBiZl9nZXQobHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lMSwKKwkJCQkmZ2V0X3BvcnRfbmFtZS0+dS5yZXNwb25zZSk7CisJCXBoYmEtPnNsaTRfaGJhLnBwb3J0X25hbWVfc3RhID0gTFBGQ19TTEk0X1BQTkFNRV9HRVQ7CisJCWJyZWFrOworCWNhc2UgTFBGQ19MSU5LX05VTUJFUl8yOgorCQljcG9ydF9uYW1lID0gYmZfZ2V0KGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTIsCisJCQkJJmdldF9wb3J0X25hbWUtPnUucmVzcG9uc2UpOworCQlwaGJhLT5zbGk0X2hiYS5wcG9ydF9uYW1lX3N0YSA9IExQRkNfU0xJNF9QUE5BTUVfR0VUOworCQlicmVhazsKKwljYXNlIExQRkNfTElOS19OVU1CRVJfMzoKKwkJY3BvcnRfbmFtZSA9IGJmX2dldChscGZjX21ieF9nZXRfcG9ydF9uYW1lX25hbWUzLAorCQkJCSZnZXRfcG9ydF9uYW1lLT51LnJlc3BvbnNlKTsKKwkJcGhiYS0+c2xpNF9oYmEucHBvcnRfbmFtZV9zdGEgPSBMUEZDX1NMSTRfUFBOQU1FX0dFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHBoYmEtPnNsaTRfaGJhLnBwb3J0X25hbWVfc3RhID09IExQRkNfU0xJNF9QUE5BTUVfR0VUKSB7CisJCXBoYmEtPlBvcnRbMF0gPSBjcG9ydF9uYW1lOworCQlwaGJhLT5Qb3J0WzFdID0gJ1wwJzsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX1NMSSwKKwkJCQkiMzA5MSBTTEkgZ2V0IHBvcnQgbmFtZTogJXNcbiIsIHBoYmEtPlBvcnQpOworCX0KKworb3V0X2ZyZWVfbWJveHE6CisJaWYgKHJjICE9IE1CWF9USU1FT1VUKSB7CisJCWlmIChiZl9nZXQobHBmY19tcWVfY29tbWFuZCwgJm1ib3hxLT51Lm1xZSkgPT0gTUJYX1NMSTRfQ09ORklHKQorCQkJbHBmY19zbGk0X21ib3hfY21kX2ZyZWUocGhiYSwgbWJveHEpOworCQllbHNlCisJCQltZW1wb29sX2ZyZWUobWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qKgogICogbHBmY19zbGk0X2FybV9jcWVxX2ludHIgLSBBcm0gc2xpLTQgZGV2aWNlIGNvbXBsZXRpb24gYW5kIGV2ZW50IHF1ZXVlcwogICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCiAgKgpAQCAtNDc1NCw3ICs0OTI5LDcgQEAKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX1BPTEwpOwogCWVsc2UgewotCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRyk7CisJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveCk7CiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3gsIG1ib3hfdG1vKTsKIAl9CiAJaWYgKHVubGlrZWx5KHJjKSkgewpAQCAtNDkxMSw3ICs1MDg2LDcgQEAKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX1BPTEwpOwogCWVsc2UgewotCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRyk7CisJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveCk7CiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3gsIG1ib3hfdG1vKTsKIAl9CiAKQEAgLTUxOTQsNyArNTM2OSw3IEBACiAJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3gsIE1CWF9QT0xMKTsKIAllbHNlIHsKLQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYm94X3Rtbyk7CisJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveCk7CiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3gsIG1ib3hfdG1vKTsKIAl9CiAJaWYgKHVubGlrZWx5KHJjKSkgewpAQCAtNTYxOSw3ICs1Nzk0LDcgQEAKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX1BPTEwpOwogCWVsc2UgewotCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRyk7CisJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveCk7CiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3gsIG1ib3hfdG1vKTsKIAl9CiAKQEAgLTU3NDgsNiArNTkyMywxNyBAQAogCQlrZnJlZSh2cGQpOwogCQlnb3RvIG91dF9mcmVlX21ib3g7CiAJfQorCisJLyoKKwkgKiBSZXRyaWV2ZSBzbGk0IGRldmljZSBwaHlzaWNhbCBwb3J0IG5hbWUsIGZhaWx1cmUgb2YgZG9pbmcgaXQKKwkgKiBpcyBjb25zaWRlcmVkIGFzIG5vbi1mYXRhbC4KKwkgKi8KKwlyYyA9IGxwZmNfc2xpNF9yZXRyaWV2ZV9wcG9ydF9uYW1lKHBoYmEpOworCWlmICghcmMpCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19NQk9YIHwgTE9HX1NMSSwKKwkJCQkiMzA4MCBTdWNjZXNzZnVsIHJldHJpZXZpbmcgU0xJNCBkZXZpY2UgIgorCQkJCSJwaHlzaWNhbCBwb3J0IG5hbWU6ICVzLlxuIiwgcGhiYS0+UG9ydCk7CisKIAkvKgogCSAqIEV2YWx1YXRlIHRoZSByZWFkIHJldiBhbmQgdnBkIGRhdGEuIFBvcHVsYXRlIHRoZSBkcml2ZXIKIAkgKiBzdGF0ZSB3aXRoIHRoZSByZXN1bHRzLiBJZiB0aGlzIHJvdXRpbmUgZmFpbHMsIHRoZSBmYWlsdXJlCkBAIC01ODE4LDkgKzYwMDQsMTMgQEAKIAkgKiB0aGVuIHR1cm4gb2ZmIHRoZSBnbG9iYWwgY29uZmlnIHBhcmFtZXRlcnMgdG8gZGlzYWJsZSB0aGUKIAkgKiBmZWF0dXJlIGluIHRoZSBkcml2ZXIuICBUaGlzIGlzIG5vdCBhIGZhdGFsIGVycm9yLgogCSAqLwotCWlmICgocGhiYS0+Y2ZnX2VuYWJsZV9iZykgJiYKLQkgICAgIShiZl9nZXQobHBmY19tYnhfcnFfZnRyX3JzcF9kaWYsICZtcWUtPnVuLnJlcV9mdHJzKSkpCi0JCWZ0cl9yc3ArKzsKKwlwaGJhLT5zbGkzX29wdGlvbnMgJj0gfkxQRkNfU0xJM19CR19FTkFCTEVEOworCWlmIChwaGJhLT5jZmdfZW5hYmxlX2JnKSB7CisJCWlmIChiZl9nZXQobHBmY19tYnhfcnFfZnRyX3JzcF9kaWYsICZtcWUtPnVuLnJlcV9mdHJzKSkKKwkJCXBoYmEtPnNsaTNfb3B0aW9ucyB8PSBMUEZDX1NMSTNfQkdfRU5BQkxFRDsKKwkJZWxzZQorCQkJZnRyX3JzcCsrOworCX0KIAogCWlmIChwaGJhLT5tYXhfdnBpICYmIHBoYmEtPmNmZ19lbmFibGVfbnBpdiAmJgogCSAgICAhKGJmX2dldChscGZjX21ieF9ycV9mdHJfcnNwX25waXYsICZtcWUtPnVuLnJlcV9mdHJzKSkpCkBAIC01OTM3LDEyICs2MTI3LDIwIEBACiAJCWdvdG8gb3V0X2ZyZWVfbWJveDsKIAl9CiAKKwkvKiBDcmVhdGUgYWxsIHRoZSBTTEk0IHF1ZXVlcyAqLworCXJjID0gbHBmY19zbGk0X3F1ZXVlX2NyZWF0ZShwaGJhKTsKKwlpZiAocmMpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMzA4OSBGYWlsZWQgdG8gYWxsb2NhdGUgcXVldWVzXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIG91dF9zdG9wX3RpbWVyczsKKwl9CiAJLyogU2V0IHVwIGFsbCB0aGUgcXVldWVzIHRvIHRoZSBkZXZpY2UgKi8KIAlyYyA9IGxwZmNfc2xpNF9xdWV1ZV9zZXR1cChwaGJhKTsKIAlpZiAodW5saWtlbHkocmMpKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1ggfCBMT0dfU0xJLAogCQkJCSIwMzgxIEVycm9yICVkIGR1cmluZyBxdWV1ZSBzZXR1cC5cbiAiLCByYyk7Ci0JCWdvdG8gb3V0X3N0b3BfdGltZXJzOworCQlnb3RvIG91dF9kZXN0cm95X3F1ZXVlOwogCX0KIAogCS8qIEFybSB0aGUgQ1FzIGFuZCB0aGVuIEVRcyBvbiBkZXZpY2UgKi8KQEAgLTYwMTUsMTUgKzYyMTMsMjAgQEAKIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAlwaGJhLT5saW5rX3N0YXRlID0gTFBGQ19MSU5LX0RPV047CiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQlpZiAocGhiYS0+Y2ZnX3N1cHByZXNzX2xpbmtfdXAgPT0gTFBGQ19JTklUSUFMSVpFX0xJTkspCisJaWYgKHBoYmEtPmNmZ19zdXBwcmVzc19saW5rX3VwID09IExQRkNfSU5JVElBTElaRV9MSU5LKSB7CiAJCXJjID0gcGhiYS0+bHBmY19oYmFfaW5pdF9saW5rKHBoYmEsIE1CWF9OT1dBSVQpOworCQlpZiAocmMpCisJCQlnb3RvIG91dF91bnNldF9xdWV1ZTsKKwl9CisJbWVtcG9vbF9mcmVlKG1ib3hxLCBwaGJhLT5tYm94X21lbV9wb29sKTsKKwlyZXR1cm4gcmM7CiBvdXRfdW5zZXRfcXVldWU6CiAJLyogVW5zZXQgYWxsIHRoZSBxdWV1ZXMgc2V0IHVwIGluIHRoaXMgcm91dGluZSB3aGVuIGVycm9yIG91dCAqLwotCWlmIChyYykKLQkJbHBmY19zbGk0X3F1ZXVlX3Vuc2V0KHBoYmEpOworCWxwZmNfc2xpNF9xdWV1ZV91bnNldChwaGJhKTsKK291dF9kZXN0cm95X3F1ZXVlOgorCWxwZmNfc2xpNF9xdWV1ZV9kZXN0cm95KHBoYmEpOwogb3V0X3N0b3BfdGltZXJzOgotCWlmIChyYykKLQkJbHBmY19zdG9wX2hiYV90aW1lcnMocGhiYSk7CisJbHBmY19zdG9wX2hiYV90aW1lcnMocGhiYSk7CiBvdXRfZnJlZV9tYm94OgogCW1lbXBvb2xfZnJlZShtYm94cSwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJcmV0dXJuIHJjOwpAQCAtNjMxOCw3ICs2NTIxLDcgQEAKIAkJfQogCQkvKiB0aW1lb3V0IGFjdGl2ZSBtYm94IGNvbW1hbmQgKi8KIAkJbW9kX3RpbWVyKCZwc2xpLT5tYm94X3RtbywgKGppZmZpZXMgKwotCQkJICAgICAgIChIWiAqIGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1iLT5tYnhDb21tYW5kKSkpKTsKKwkJCSAgICAgICAoSFogKiBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBwbWJveCkpKSk7CiAJfQogCiAJLyogTWFpbGJveCBjbWQgPGNtZD4gaXNzdWUgKi8KQEAgLTY0NDIsOSArNjY0NSw4IEBACiAJCQkJCQkgICAgICAgZHJ2cl9mbGFnKTsKIAkJCWdvdG8gb3V0X25vdF9maW5pc2hlZDsKIAkJfQotCQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhscGZjX21ib3hfdG1vX3ZhbChwaGJhLAotCQkJCQkJCSAgICAgbWItPm1ieENvbW1hbmQpICoKLQkJCQkJICAgMTAwMCkgKyBqaWZmaWVzOworCQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBwbWJveCkgKgorCQkJCQkJCTEwMDApICsgamlmZmllczsKIAkJaSA9IDA7CiAJCS8qIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KIAkJd2hpbGUgKCgod29yZDAgJiBPV05fQ0hJUCkgPT0gT1dOX0NISVApIHx8CkBAIC02NTU1LDIxICs2NzU3LDIxIEBACiBscGZjX3NsaTRfYXN5bmNfbWJveF9ibG9jayhzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7CiAJc3RydWN0IGxwZmNfc2xpICpwc2xpID0gJnBoYmEtPnNsaTsKLQl1aW50OF90IGFjdGNtZCA9IE1CWF9IRUFSVEJFQVQ7CiAJaW50IHJjID0gMDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gMDsKIAogCS8qIE1hcmsgdGhlIGFzeW5jaHJvbm91cyBtYWlsYm94IGNvbW1hbmQgcG9zdGluZyBhcyBibG9ja2VkICovCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJcHNsaS0+c2xpX2ZsYWcgfD0gTFBGQ19TTElfQVNZTkNfTUJYX0JMSzsKLQlpZiAocGhiYS0+c2xpLm1ib3hfYWN0aXZlKQotCQlhY3RjbWQgPSBwaGJhLT5zbGkubWJveF9hY3RpdmUtPnUubWIubWJ4Q29tbWFuZDsKLQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCS8qIERldGVybWluZSBob3cgbG9uZyB3ZSBtaWdodCB3YWl0IGZvciB0aGUgYWN0aXZlIG1haWxib3gKIAkgKiBjb21tYW5kIHRvIGJlIGdyYWNlZnVsbHkgY29tcGxldGVkIGJ5IGZpcm13YXJlLgogCSAqLwotCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIGFjdGNtZCkgKiAxMDAwKSArCi0JCQkJICAgamlmZmllczsKKwlpZiAocGhiYS0+c2xpLm1ib3hfYWN0aXZlKQorCQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhscGZjX21ib3hfdG1vX3ZhbChwaGJhLAorCQkJCQkJcGhiYS0+c2xpLm1ib3hfYWN0aXZlKSAqCisJCQkJCQkxMDAwKSArIGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwogCS8qIFdhaXQgZm9yIHRoZSBvdXRzdG5hZGluZyBtYWlsYm94IGNvbW1hbmQgdG8gY29tcGxldGUgKi8KIAl3aGlsZSAocGhiYS0+c2xpLm1ib3hfYWN0aXZlKSB7CiAJCS8qIENoZWNrIGFjdGl2ZSBtYWlsYm94IGNvbXBsZXRlIHN0YXR1cyBldmVyeSAybXMgKi8KQEAgLTY2NjQsMTEgKzY4NjYsMTIgQEAKIAlpZiAocHNsaS0+c2xpX2ZsYWcgJiBMUEZDX1NMSV9NQk9YX0FDVElWRSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1ggfCBMT0dfU0xJLAotCQkJCSIoJWQpOjI1MzIgTWFpbGJveCBjb21tYW5kIHgleCAoeCV4KSAiCisJCQkJIiglZCk6MjUzMiBNYWlsYm94IGNvbW1hbmQgeCV4ICh4JXgveCV4KSAiCiAJCQkJImNhbm5vdCBpc3N1ZSBEYXRhOiB4JXggeCV4XG4iLAogCQkJCW1ib3hxLT52cG9ydCA/IG1ib3hxLT52cG9ydC0+dnBpIDogMCwKIAkJCQltYm94cS0+dS5tYi5tYnhDb21tYW5kLAotCQkJCWxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwgbWJveHEpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAogCQkJCXBzbGktPnNsaV9mbGFnLCBNQlhfUE9MTCk7CiAJCXJldHVybiBNQlhFUlJfRVJST1I7CiAJfQpAQCAtNjY5MSw3ICs2ODk0LDcgQEAKIAlkbWFfYWRkcmVzcyA9ICZwaGJhLT5zbGk0X2hiYS5ibWJ4LmRtYV9hZGRyZXNzOwogCXdyaXRlbChkbWFfYWRkcmVzcy0+YWRkcl9oaSwgcGhiYS0+c2xpNF9oYmEuQk1CWHJlZ2FkZHIpOwogCi0JdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJ4X2NtbmQpCisJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveHEpCiAJCQkJICAgKiAxMDAwKSArIGppZmZpZXM7CiAJZG8gewogCQlibWJ4X3JlZy53b3JkMCA9IHJlYWRsKHBoYmEtPnNsaTRfaGJhLkJNQlhyZWdhZGRyKTsKQEAgLTY3MDcsNyArNjkxMCw3IEBACiAKIAkvKiBQb3N0IHRoZSBsb3cgbWFpbGJveCBkbWEgYWRkcmVzcyB0byB0aGUgcG9ydC4gKi8KIAl3cml0ZWwoZG1hX2FkZHJlc3MtPmFkZHJfbG8sIHBoYmEtPnNsaTRfaGJhLkJNQlhyZWdhZGRyKTsKLQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYnhfY21uZCkKKwl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYm94cSkKIAkJCQkgICAqIDEwMDApICsgamlmZmllczsKIAlkbyB7CiAJCWJtYnhfcmVnLndvcmQwID0gcmVhZGwocGhiYS0+c2xpNF9oYmEuQk1CWHJlZ2FkZHIpOwpAQCAtNjc0NiwxMSArNjk0OSwxMiBAQAogCQlscGZjX3NsaTRfc3dhcF9zdHIocGhiYSwgbWJveHEpOwogCiAJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX01CT1ggfCBMT0dfU0xJLAotCQkJIiglZCk6MDM1NiBNYWlsYm94IGNtZCB4JXggKHgleCkgU3RhdHVzIHgleCAiCisJCQkiKCVkKTowMzU2IE1haWxib3ggY21kIHgleCAoeCV4L3gleCkgU3RhdHVzIHgleCAiCiAJCQkiRGF0YTogeCV4IHgleCB4JXggeCV4IHgleCB4JXggeCV4IHgleCB4JXggeCV4IHgleCIKIAkJCSIgeCV4IHgleCBDUTogeCV4IHgleCB4JXggeCV4XG4iLAotCQkJbWJveHEtPnZwb3J0ID8gbWJveHEtPnZwb3J0LT52cGkgOiAwLAotCQkJbWJ4X2NtbmQsIGxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAorCQkJbWJveHEtPnZwb3J0ID8gbWJveHEtPnZwb3J0LT52cGkgOiAwLCBtYnhfY21uZCwKKwkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwgbWJveHEpLAorCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCiAJCQliZl9nZXQobHBmY19tcWVfc3RhdHVzLCBtYiksCiAJCQltYi0+dW4ubWJfd29yZHNbMF0sIG1iLT51bi5tYl93b3Jkc1sxXSwKIAkJCW1iLT51bi5tYl93b3Jkc1syXSwgbWItPnVuLm1iX3dvcmRzWzNdLApAQCAtNjc5NiwxMSArNzAwMCwxMiBAQAogCXJjID0gbHBmY19tYm94X2Rldl9jaGVjayhwaGJhKTsKIAlpZiAodW5saWtlbHkocmMpKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1ggfCBMT0dfU0xJLAotCQkJCSIoJWQpOjI1NDQgTWFpbGJveCBjb21tYW5kIHgleCAoeCV4KSAiCisJCQkJIiglZCk6MjU0NCBNYWlsYm94IGNvbW1hbmQgeCV4ICh4JXgveCV4KSAiCiAJCQkJImNhbm5vdCBpc3N1ZSBEYXRhOiB4JXggeCV4XG4iLAogCQkJCW1ib3hxLT52cG9ydCA/IG1ib3hxLT52cG9ydC0+dnBpIDogMCwKIAkJCQltYm94cS0+dS5tYi5tYnhDb21tYW5kLAotCQkJCWxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwgbWJveHEpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAogCQkJCXBzbGktPnNsaV9mbGFnLCBmbGFnKTsKIAkJZ290byBvdXRfbm90X2ZpbmlzaGVkOwogCX0KQEAgLTY4MTQsMjAgKzcwMTksMjUgQEAKIAkJaWYgKHJjICE9IE1CWF9TVUNDRVNTKQogCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX01CT1ggfCBMT0dfU0xJLAogCQkJCQkiKCVkKToyNTQxIE1haWxib3ggY29tbWFuZCB4JXggIgotCQkJCQkiKHgleCkgY2Fubm90IGlzc3VlIERhdGE6IHgleCB4JXhcbiIsCisJCQkJCSIoeCV4L3gleCkgY2Fubm90IGlzc3VlIERhdGE6ICIKKwkJCQkJIngleCB4JXhcbiIsCiAJCQkJCW1ib3hxLT52cG9ydCA/IG1ib3hxLT52cG9ydC0+dnBpIDogMCwKIAkJCQkJbWJveHEtPnUubWIubWJ4Q29tbWFuZCwKLQkJCQkJbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCisJCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwKKwkJCQkJCQkJCW1ib3hxKSwKKwkJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLAorCQkJCQkJCQkJbWJveHEpLAogCQkJCQlwc2xpLT5zbGlfZmxhZywgZmxhZyk7CiAJCXJldHVybiByYzsKIAl9IGVsc2UgaWYgKGZsYWcgPT0gTUJYX1BPTEwpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX01CT1ggfCBMT0dfU0xJLAogCQkJCSIoJWQpOjI1NDIgVHJ5IHRvIGlzc3VlIG1haWxib3ggY29tbWFuZCAiCi0JCQkJIngleCAoeCV4KSBzeW5jaHJvbm91c2x5IGFoZWFkIG9mIGFzeW5jIgorCQkJCSJ4JXggKHgleC94JXgpIHN5bmNocm9ub3VzbHkgYWhlYWQgb2YgYXN5bmMiCiAJCQkJIm1haWxib3ggY29tbWFuZCBxdWV1ZTogeCV4IHgleFxuIiwKIAkJCQltYm94cS0+dnBvcnQgPyBtYm94cS0+dnBvcnQtPnZwaSA6IDAsCiAJCQkJbWJveHEtPnUubWIubWJ4Q29tbWFuZCwKLQkJCQlscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCQlscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKIAkJCQlwc2xpLT5zbGlfZmxhZywgZmxhZyk7CiAJCS8qIFRyeSB0byBibG9jayB0aGUgYXN5bmNocm9ub3VzIG1haWxib3ggcG9zdGluZyAqLwogCQlyYyA9IGxwZmNfc2xpNF9hc3luY19tYm94X2Jsb2NrKHBoYmEpOwpAQCAtNjgzNiwxNiArNzA0NiwxOCBAQAogCQkJcmMgPSBscGZjX3NsaTRfcG9zdF9zeW5jX21ib3gocGhiYSwgbWJveHEpOwogCQkJaWYgKHJjICE9IE1CWF9TVUNDRVNTKQogCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJCQkJCUxPR19NQk9YIHwgTE9HX1NMSSwKLQkJCQkJCSIoJWQpOjI1OTcgTWFpbGJveCBjb21tYW5kICIKLQkJCQkJCSJ4JXggKHgleCkgY2Fubm90IGlzc3VlICIKLQkJCQkJCSJEYXRhOiB4JXggeCV4XG4iLAotCQkJCQkJbWJveHEtPnZwb3J0ID8KLQkJCQkJCW1ib3hxLT52cG9ydC0+dnBpIDogMCwKLQkJCQkJCW1ib3hxLT51Lm1iLm1ieENvbW1hbmQsCi0JCQkJCQlscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHBoYmEsCi0JCQkJCQkJCW1ib3hxKSwKLQkJCQkJCXBzbGktPnNsaV9mbGFnLCBmbGFnKTsKKwkJCQkJTE9HX01CT1ggfCBMT0dfU0xJLAorCQkJCQkiKCVkKToyNTk3IE1haWxib3ggY29tbWFuZCAiCisJCQkJCSJ4JXggKHgleC94JXgpIGNhbm5vdCBpc3N1ZSAiCisJCQkJCSJEYXRhOiB4JXggeCV4XG4iLAorCQkJCQltYm94cS0+dnBvcnQgPworCQkJCQltYm94cS0+dnBvcnQtPnZwaSA6IDAsCisJCQkJCW1ib3hxLT51Lm1iLm1ieENvbW1hbmQsCisJCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwKKwkJCQkJCQkJCW1ib3hxKSwKKwkJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLAorCQkJCQkJCQkJbWJveHEpLAorCQkJCQlwc2xpLT5zbGlfZmxhZywgZmxhZyk7CiAJCQkvKiBVbmJsb2NrIHRoZSBhc3luYyBtYWlsYm94IHBvc3RpbmcgYWZ0ZXJ3YXJkICovCiAJCQlscGZjX3NsaTRfYXN5bmNfbWJveF91bmJsb2NrKHBoYmEpOwogCQl9CkBAIC02ODU2LDExICs3MDY4LDEyIEBACiAJcmMgPSBscGZjX21ib3hfY21kX2NoZWNrKHBoYmEsIG1ib3hxKTsKIAlpZiAocmMpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfTUJPWCB8IExPR19TTEksCi0JCQkJIiglZCk6MjU0MyBNYWlsYm94IGNvbW1hbmQgeCV4ICh4JXgpICIKKwkJCQkiKCVkKToyNTQzIE1haWxib3ggY29tbWFuZCB4JXggKHgleC94JXgpICIKIAkJCQkiY2Fubm90IGlzc3VlIERhdGE6IHgleCB4JXhcbiIsCiAJCQkJbWJveHEtPnZwb3J0ID8gbWJveHEtPnZwb3J0LT52cGkgOiAwLAogCQkJCW1ib3hxLT51Lm1iLm1ieENvbW1hbmQsCi0JCQkJbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLCBtYm94cSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCiAJCQkJcHNsaS0+c2xpX2ZsYWcsIGZsYWcpOwogCQlnb3RvIG91dF9ub3RfZmluaXNoZWQ7CiAJfQpAQCAtNjg3MiwxMCArNzA4NSwxMSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFncyk7CiAJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX01CT1ggfCBMT0dfU0xJLAogCQkJIiglZCk6MDM1NCBNYm94IGNtZCBpc3N1ZSAtIEVucXVldWUgRGF0YTogIgotCQkJIngleCAoeCV4KSB4JXggeCV4IHgleFxuIiwKKwkJCSJ4JXggKHgleC94JXgpIHgleCB4JXggeCV4XG4iLAogCQkJbWJveHEtPnZwb3J0ID8gbWJveHEtPnZwb3J0LT52cGkgOiAweGZmZmZmZiwKIAkJCWJmX2dldChscGZjX21xZV9jb21tYW5kLCAmbWJveHEtPnUubXFlKSwKLQkJCWxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAorCQkJbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLCBtYm94cSksCisJCQlscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKIAkJCXBoYmEtPnBwb3J0LT5wb3J0X3N0YXRlLAogCQkJcHNsaS0+c2xpX2ZsYWcsIE1CWF9OT1dBSVQpOwogCS8qIFdha2UgdXAgd29ya2VyIHRocmVhZCB0byB0cmFuc3BvcnQgbWFpbGJveCBjb21tYW5kIGZyb20gaGVhZCAqLwpAQCAtNjk1MiwxMyArNzE2NiwxNCBAQAogCiAJLyogU3RhcnQgdGltZXIgZm9yIHRoZSBtYm94X3RtbyBhbmQgbG9nIHNvbWUgbWFpbGJveCBwb3N0IG1lc3NhZ2VzICovCiAJbW9kX3RpbWVyKCZwc2xpLT5tYm94X3RtbywgKGppZmZpZXMgKwotCQkgIChIWiAqIGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ieF9jbW5kKSkpKTsKKwkJICAoSFogKiBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYm94cSkpKSk7CiAKIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTUJPWCB8IExPR19TTEksCi0JCQkiKCVkKTowMzU1IE1haWxib3ggY21kIHgleCAoeCV4KSBpc3N1ZSBEYXRhOiAiCisJCQkiKCVkKTowMzU1IE1haWxib3ggY21kIHgleCAoeCV4L3gleCkgaXNzdWUgRGF0YTogIgogCQkJIngleCB4JXhcbiIsCiAJCQltYm94cS0+dnBvcnQgPyBtYm94cS0+dnBvcnQtPnZwaSA6IDAsIG1ieF9jbW5kLAotCQkJbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCisJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAogCQkJcGhiYS0+cHBvcnQtPnBvcnRfc3RhdGUsIHBzbGktPnNsaV9mbGFnKTsKIAogCWlmIChtYnhfY21uZCAhPSBNQlhfSEVBUlRCRUFUKSB7CkBAIC02OTgyLDExICs3MTk3LDEyIEBACiAJcmMgPSBscGZjX3NsaTRfbXFfcHV0KHBoYmEtPnNsaTRfaGJhLm1ieF93cSwgbXFlKTsKIAlpZiAocmMgIT0gTUJYX1NVQ0NFU1MpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfTUJPWCB8IExPR19TTEksCi0JCQkJIiglZCk6MjUzMyBNYWlsYm94IGNvbW1hbmQgeCV4ICh4JXgpICIKKwkJCQkiKCVkKToyNTMzIE1haWxib3ggY29tbWFuZCB4JXggKHgleC94JXgpICIKIAkJCQkiY2Fubm90IGlzc3VlIERhdGE6IHgleCB4JXhcbiIsCiAJCQkJbWJveHEtPnZwb3J0ID8gbWJveHEtPnZwb3J0LT52cGkgOiAwLAogCQkJCW1ib3hxLT51Lm1iLm1ieENvbW1hbmQsCi0JCQkJbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLCBtYm94cSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCiAJCQkJcHNsaS0+c2xpX2ZsYWcsIE1CWF9OT1dBSVQpOwogCQlnb3RvIG91dF9ub3RfZmluaXNoZWQ7CiAJfQpAQCAtNzMyMiw2ICs3NTM4LDggQEAKIAkJCQlpZiAoaW5ib3VuZCA9PSAxKQogCQkJCQlvZmZzZXQgPSAwOwogCQkJCWJmX3NldChscGZjX3NsaTRfc2dlX29mZnNldCwgc2dsLCBvZmZzZXQpOworCQkJCWJmX3NldChscGZjX3NsaTRfc2dlX3R5cGUsIHNnbCwKKwkJCQkJTFBGQ19TR0VfVFlQRV9EQVRBKTsKIAkJCQlvZmZzZXQgKz0gYmRlLnR1cy5mLmJkZVNpemU7CiAJCQl9CiAJCQlzZ2wtPndvcmQyID0gY3B1X3RvX2xlMzIoc2dsLT53b3JkMik7CkBAIC05MzU5LDcgKzk1NzcsNiBAQAogCiAJLyogbm93IGlzc3VlIHRoZSBjb21tYW5kICovCiAJcmV0dmFsID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBwbWJveHEsIE1CWF9OT1dBSVQpOwotCiAJaWYgKHJldHZhbCA9PSBNQlhfQlVTWSB8fCByZXR2YWwgPT0gTUJYX1NVQ0NFU1MpIHsKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZG9uZV9xLAogCQkJCXBtYm94cS0+bWJveF9mbGFnICYgTFBGQ19NQlhfV0FLRSwKQEAgLTk0MDMsMjMgKzk2MjAsMjQgQEAKIGxwZmNfc2xpX21ib3hfc3lzX3NodXRkb3duKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgbHBmY19zbGkgKnBzbGkgPSAmcGhiYS0+c2xpOwotCXVpbnQ4X3QgYWN0Y21kID0gTUJYX0hFQVJUQkVBVDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKKwl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhMUEZDX01CT1hfVE1PICogMTAwMCkgKyBqaWZmaWVzOwogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCXBzbGktPnNsaV9mbGFnIHw9IExQRkNfU0xJX0FTWU5DX01CWF9CTEs7CiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAogCWlmIChwc2xpLT5zbGlfZmxhZyAmIExQRkNfU0xJX0FDVElWRSkgewogCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQkJaWYgKHBoYmEtPnNsaS5tYm94X2FjdGl2ZSkKLQkJCWFjdGNtZCA9IHBoYmEtPnNsaS5tYm94X2FjdGl2ZS0+dS5tYi5tYnhDb21tYW5kOwotCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCQkvKiBEZXRlcm1pbmUgaG93IGxvbmcgd2UgbWlnaHQgd2FpdCBmb3IgdGhlIGFjdGl2ZSBtYWlsYm94CiAJCSAqIGNvbW1hbmQgdG8gYmUgZ3JhY2VmdWxseSBjb21wbGV0ZWQgYnkgZmlybXdhcmUuCiAJCSAqLwotCQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBhY3RjbWQpICoKLQkJCQkJICAgMTAwMCkgKyBqaWZmaWVzOworCQlpZiAocGhiYS0+c2xpLm1ib3hfYWN0aXZlKQorCQkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwKKwkJCQkJCXBoYmEtPnNsaS5tYm94X2FjdGl2ZSkgKgorCQkJCQkJMTAwMCkgKyBqaWZmaWVzOworCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCiAJCXdoaWxlIChwaGJhLT5zbGkubWJveF9hY3RpdmUpIHsKIAkJCS8qIENoZWNrIGFjdGl2ZSBtYWlsYm94IGNvbXBsZXRlIHN0YXR1cyBldmVyeSAybXMgKi8KIAkJCW1zbGVlcCgyKTsKQEAgLTEwNDE1LDEyICsxMDYzMywxNyBAQAogCS8qIE1vdmUgbWJveCBkYXRhIHRvIGNhbGxlcidzIG1haWxib3ggcmVnaW9uLCBkbyBlbmRpYW4gc3dhcHBpbmcgKi8KIAlpZiAocG1iLT5tYm94X2NtcGwgJiYgbWJveCkKIAkJbHBmY19zbGlfcGNpbWVtX2Jjb3B5KG1ib3gsIG1xZSwgc2l6ZW9mKHN0cnVjdCBscGZjX21xZSkpOwotCS8qIFNldCB0aGUgbWFpbGJveCBzdGF0dXMgd2l0aCBTTEk0IHJhbmdlIDB4NDAwMCAqLwotCW1jcWVfc3RhdHVzID0gYmZfZ2V0KGxwZmNfbWNxZV9zdGF0dXMsIG1jcWUpOwotCWlmIChtY3FlX3N0YXR1cyAhPSBNQl9DUUVfU1RBVFVTX1NVQ0NFU1MpCi0JCWJmX3NldChscGZjX21xZV9zdGF0dXMsIG1xZSwKLQkJICAgICAgIChMUEZDX01CWF9FUlJPUl9SQU5HRSB8IG1jcWVfc3RhdHVzKSk7CiAKKwkvKgorCSAqIEZvciBtY3FlIGVycm9ycywgY29uZGl0aW9uYWxseSBtb3ZlIGEgbW9kaWZpZWQgZXJyb3IgY29kZSB0bworCSAqIHRoZSBtYm94IHNvIHRoYXQgdGhlIGVycm9yIHdpbGwgbm90IGJlIG1pc3NlZC4KKwkgKi8KKwltY3FlX3N0YXR1cyA9IGJmX2dldChscGZjX21jcWVfc3RhdHVzLCBtY3FlKTsKKwlpZiAobWNxZV9zdGF0dXMgIT0gTUJfQ1FFX1NUQVRVU19TVUNDRVNTKSB7CisJCWlmIChiZl9nZXQobHBmY19tcWVfc3RhdHVzLCBtcWUpID09IE1CWF9TVUNDRVNTKQorCQkJYmZfc2V0KGxwZmNfbXFlX3N0YXR1cywgbXFlLAorCQkJICAgICAgIChMUEZDX01CWF9FUlJPUl9SQU5HRSB8IG1jcWVfc3RhdHVzKSk7CisJfQogCWlmIChwbWItPm1ib3hfZmxhZyAmIExQRkNfTUJYX0lNRURfVU5SRUcpIHsKIAkJcG1iLT5tYm94X2ZsYWcgJj0gfkxQRkNfTUJYX0lNRURfVU5SRUc7CiAJCWxwZmNfZGVidWdmc19kaXNjX3RyYyh2cG9ydCwgTFBGQ19ESVNDX1RSQ19NQk9YX1ZQT1JULApAQCAtMTA3OTYsNyArMTEwMTksNyBAQAogCWNhc2UgTFBGQ19NQ1E6CiAJCXdoaWxlICgoY3FlID0gbHBmY19zbGk0X2NxX2dldChjcSkpKSB7CiAJCQl3b3JrcG9zdGVkIHw9IGxwZmNfc2xpNF9zcF9oYW5kbGVfbWNxZShwaGJhLCBjcWUpOwotCQkJaWYgKCEoKytlY291bnQgJSBMUEZDX0dFVF9RRV9SRUxfSU5UKSkKKwkJCWlmICghKCsrZWNvdW50ICUgY3EtPmVudHJ5X3JlcG9zdCkpCiAJCQkJbHBmY19zbGk0X2NxX3JlbGVhc2UoY3EsIExQRkNfUVVFVUVfTk9BUk0pOwogCQl9CiAJCWJyZWFrOwpAQCAtMTA4MDgsNyArMTEwMzEsNyBAQAogCQkJZWxzZQogCQkJCXdvcmtwb3N0ZWQgfD0gbHBmY19zbGk0X3NwX2hhbmRsZV9jcWUocGhiYSwgY3EsCiAJCQkJCQkJCSAgICAgIGNxZSk7Ci0JCQlpZiAoISgrK2Vjb3VudCAlIExQRkNfR0VUX1FFX1JFTF9JTlQpKQorCQkJaWYgKCEoKytlY291bnQgJSBjcS0+ZW50cnlfcmVwb3N0KSkKIAkJCQlscGZjX3NsaTRfY3FfcmVsZWFzZShjcSwgTFBGQ19RVUVVRV9OT0FSTSk7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMTA0MCw3ICsxMTI2Myw3IEBACiAJLyogUHJvY2VzcyBhbGwgdGhlIGVudHJpZXMgdG8gdGhlIENRICovCiAJd2hpbGUgKChjcWUgPSBscGZjX3NsaTRfY3FfZ2V0KGNxKSkpIHsKIAkJd29ya3Bvc3RlZCB8PSBscGZjX3NsaTRfZnBfaGFuZGxlX3djcWUocGhiYSwgY3EsIGNxZSk7Ci0JCWlmICghKCsrZWNvdW50ICUgTFBGQ19HRVRfUUVfUkVMX0lOVCkpCisJCWlmICghKCsrZWNvdW50ICUgY3EtPmVudHJ5X3JlcG9zdCkpCiAJCQlscGZjX3NsaTRfY3FfcmVsZWFzZShjcSwgTFBGQ19RVUVVRV9OT0FSTSk7CiAJfQogCkBAIC0xMTExMCw2ICsxMTMzMyw4IEBACiAKIAkvKiBHZXQgdG8gdGhlIEVRIHN0cnVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyB2ZWN0b3IgKi8KIAlzcGVxID0gcGhiYS0+c2xpNF9oYmEuc3BfZXE7CisJaWYgKHVubGlrZWx5KCFzcGVxKSkKKwkJcmV0dXJuIElSUV9OT05FOwogCiAJLyogQ2hlY2sgZGV2aWNlIHN0YXRlIGZvciBoYW5kbGluZyBpbnRlcnJ1cHQgKi8KIAlpZiAodW5saWtlbHkobHBmY19pbnRyX3N0YXRlX2NoZWNrKHBoYmEpKSkgewpAQCAtMTExMjcsNyArMTEzNTIsNyBAQAogCSAqLwogCXdoaWxlICgoZXFlID0gbHBmY19zbGk0X2VxX2dldChzcGVxKSkpIHsKIAkJbHBmY19zbGk0X3NwX2hhbmRsZV9lcWUocGhiYSwgZXFlKTsKLQkJaWYgKCEoKytlY291bnQgJSBMUEZDX0dFVF9RRV9SRUxfSU5UKSkKKwkJaWYgKCEoKytlY291bnQgJSBzcGVxLT5lbnRyeV9yZXBvc3QpKQogCQkJbHBmY19zbGk0X2VxX3JlbGVhc2Uoc3BlcSwgTFBGQ19RVUVVRV9OT0FSTSk7CiAJfQogCkBAIC0xMTE4Nyw2ICsxMTQxMiw4IEBACiAKIAlpZiAodW5saWtlbHkoIXBoYmEpKQogCQlyZXR1cm4gSVJRX05PTkU7CisJaWYgKHVubGlrZWx5KCFwaGJhLT5zbGk0X2hiYS5mcF9lcSkpCisJCXJldHVybiBJUlFfTk9ORTsKIAogCS8qIEdldCB0byB0aGUgRVEgc3RydWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZlY3RvciAqLwogCWZwZXEgPSBwaGJhLT5zbGk0X2hiYS5mcF9lcVtmY3BfZXFpZHhdOwpAQCAtMTEyMDcsNyArMTE0MzQsNyBAQAogCSAqLwogCXdoaWxlICgoZXFlID0gbHBmY19zbGk0X2VxX2dldChmcGVxKSkpIHsKIAkJbHBmY19zbGk0X2ZwX2hhbmRsZV9lcWUocGhiYSwgZXFlLCBmY3BfZXFpZHgpOwotCQlpZiAoISgrK2Vjb3VudCAlIExQRkNfR0VUX1FFX1JFTF9JTlQpKQorCQlpZiAoISgrK2Vjb3VudCAlIGZwZXEtPmVudHJ5X3JlcG9zdCkpCiAJCQlscGZjX3NsaTRfZXFfcmVsZWFzZShmcGVxLCBMUEZDX1FVRVVFX05PQVJNKTsKIAl9CiAKQEAgLTExMzU5LDYgKzExNTg2LDE1IEBACiAJfQogCXF1ZXVlLT5lbnRyeV9zaXplID0gZW50cnlfc2l6ZTsKIAlxdWV1ZS0+ZW50cnlfY291bnQgPSBlbnRyeV9jb3VudDsKKworCS8qCisJICogZW50cnlfcmVwb3N0IGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZQorCSAqIHF1ZXVlLiBUaGlzIHdvcmtzIG91dCBleGNlcHQgZm9yIFJRcy4gSWYgYnVmZmVycyBhcmUgTk9UIGluaXRpYWxseQorCSAqIHBvc3RlZCBmb3IgZXZlcnkgUlFFLCBlbnRyeV9yZXBvc3Qgc2hvdWxkIGJlIGFkanVzdGVkIGFjY29yZGluZ2x5LgorCSAqLworCXF1ZXVlLT5lbnRyeV9yZXBvc3QgPSAoZW50cnlfY291bnQgPj4gMyk7CisJaWYgKHF1ZXVlLT5lbnRyeV9yZXBvc3QgPCBMUEZDX1FVRVVFX01JTl9SRVBPU1QpCisJCXF1ZXVlLT5lbnRyeV9yZXBvc3QgPSBMUEZDX1FVRVVFX01JTl9SRVBPU1Q7CiAJcXVldWUtPnBoYmEgPSBwaGJhOwogCiAJcmV0dXJuIHF1ZXVlOwpAQCAtMTE5MjQsNiArMTIxNjAsMzEgQEAKIH0KIAogLyoqCisgKiBscGZjX3JxX2FkanVzdF9yZXBvc3QgLSBBZGp1c3QgZW50cnlfcmVwb3N0IGZvciBhbiBSUQorICogQHBoYmE6IEhCQSBzdHJ1Y3R1cmUgdGhhdCBpbmRpY2F0ZXMgcG9ydCB0byBjcmVhdGUgYSBxdWV1ZSBvbi4KKyAqIEBycTogICBUaGUgcXVldWUgc3RydWN0dXJlIHRvIHVzZSBmb3IgdGhlIHJlY2VpdmUgcXVldWUuCisgKiBAcW5vOiAgVGhlIGFzc29jaWF0ZWQgSEJRIG51bWJlcgorICoKKyAqCisgKiBGb3IgU0xJNCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgUlEgcmVwb3N0IHZhbHVlIGJhc2VkIG9uCisgKiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhcmUgaW5pdGlhbGx5IHBvc3RlZCB0byB0aGUgUlEuCisgKi8KK3ZvaWQKK2xwZmNfcnFfYWRqdXN0X3JlcG9zdChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX3F1ZXVlICpycSwgaW50IHFubykKK3sKKwl1aW50MzJfdCBjbnQ7CisKKwljbnQgPSBscGZjX2hicV9kZWZzW3Fub10tPmVudHJ5X2NvdW50OworCisJLyogUmVjYWxjIHJlcG9zdCBmb3IgUlFzIGJhc2VkIG9uIGJ1ZmZlcnMgaW5pdGlhbGx5IHBvc3RlZCAqLworCWNudCA9IChjbnQgPj4gMyk7CisJaWYgKGNudCA8IExQRkNfUVVFVUVfTUlOX1JFUE9TVCkKKwkJY250ID0gTFBGQ19RVUVVRV9NSU5fUkVQT1NUOworCisJcnEtPmVudHJ5X3JlcG9zdCA9IGNudDsKK30KKworLyoqCiAgKiBscGZjX3JxX2NyZWF0ZSAtIENyZWF0ZSBhIFJlY2VpdmUgUXVldWUgb24gdGhlIEhCQQogICogQHBoYmE6IEhCQSBzdHJ1Y3R1cmUgdGhhdCBpbmRpY2F0ZXMgcG9ydCB0byBjcmVhdGUgYSBxdWV1ZSBvbi4KICAqIEBocnE6IFRoZSBxdWV1ZSBzdHJ1Y3R1cmUgdG8gdXNlIHRvIGNyZWF0ZSB0aGUgaGVhZGVyIHJlY2VpdmUgcXVldWUuCkBAIC0xMjQ4OSw3ICsxMjc1MCw3IEBACiAJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3gsIE1CWF9QT0xMKTsKIAllbHNlIHsKLQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBNQlhfU0xJNF9DT05GSUcpOworCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3gpOwogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94LCBtYm94X3Rtbyk7CiAJfQogCS8qIFRoZSBJT0NUTCBzdGF0dXMgaXMgZW1iZWRkZWQgaW4gdGhlIG1haWxib3ggc3ViaGVhZGVyLiAqLwpAQCAtMTI3MDQsNyArMTI5NjUsNyBAQAogCWlmICghcGhiYS0+c2xpNF9oYmEuaW50cl9lbmFibGUpCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBtYm94LCBNQlhfUE9MTCk7CiAJZWxzZSB7Ci0JCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgTUJYX1NMSTRfQ09ORklHKTsKKwkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYm94KTsKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveCwgbWJveF90bW8pOwogCX0KIAlzaGRyID0gKHVuaW9uIGxwZmNfc2xpNF9jZmdfc2hkciAqKSAmc2dsLT5jZmdfc2hkcjsKQEAgLTEyODY3LDcgKzEzMTI4LDcgQEAKIAkJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKIAkJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBtYm94LCBNQlhfUE9MTCk7CiAJCWVsc2UgewotCQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBNQlhfU0xJNF9DT05GSUcpOworCQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYm94KTsKIAkJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3gsIG1ib3hfdG1vKTsKIAkJfQogCQlzaGRyID0gKHVuaW9uIGxwZmNfc2xpNF9jZmdfc2hkciAqKSAmc2dsLT5jZmdfc2hkcjsKQEAgLTEyOTkxLDcgKzEzMjUyLDcgQEAKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX1BPTEwpOwogCWVsc2UgewotCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRyk7CisJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveCk7CiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3gsIG1ib3hfdG1vKTsKIAl9CiAJc2hkciA9ICh1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKikgJnNnbC0+Y2ZnX3NoZHI7CkBAIC0xMzE0Nyw3ICsxMzQwOCw3IEBACiAJCWlmICghcGhiYS0+c2xpNF9oYmEuaW50cl9lbmFibGUpCiAJCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX1BPTEwpOwogCQllbHNlIHsKLQkJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgTUJYX1NMSTRfQ09ORklHKTsKKwkJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveCk7CiAJCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94LCBtYm94X3Rtbyk7CiAJCX0KIAkJc2hkciA9ICh1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKikgJnNnbC0+Y2ZnX3NoZHI7CkBAIC0xMzI5Niw3ICsxMzU1Nyw4IEBACiAJdWludDMyX3QgZGlkID0gKGZjX2hkci0+ZmhfZF9pZFswXSA8PCAxNiB8CiAJCQlmY19oZHItPmZoX2RfaWRbMV0gPDwgOCB8CiAJCQlmY19oZHItPmZoX2RfaWRbMl0pOwotCisJaWYgKGRpZCA9PSBGYWJyaWNfRElEKQorCQlyZXR1cm4gcGhiYS0+cHBvcnQ7CiAJdnBvcnRzID0gbHBmY19jcmVhdGVfdnBvcnRfd29ya19hcnJheShwaGJhKTsKIAlpZiAodnBvcnRzICE9IE5VTEwpCiAJCWZvciAoaSA9IDA7IGkgPD0gcGhiYS0+bWF4X3ZwaSAmJiB2cG9ydHNbaV0gIT0gTlVMTDsgaSsrKSB7CkBAIC0xNDMxMiw3ICsxNDU3NCw3IEBACiAJaWYgKCFtYm94cSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJbHBmY19pbml0X3ZwaShwaGJhLCBtYm94cSwgdnBvcnQtPnZwaSk7Ci0JbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBNQlhfSU5JVF9WUEkpOworCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveHEpOwogCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3hxLCBtYm94X3Rtbyk7CiAJaWYgKHJjICE9IE1CWF9TVUNDRVNTKSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfU0xJLApAQCAtMTUxODgsNyArMTU0NTAsNyBAQAogCWlmICghcGhiYS0+c2xpNF9oYmEuaW50cl9lbmFibGUpCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBtYm94LCBNQlhfUE9MTCk7CiAJZWxzZSB7Ci0JCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgTUJYX1NMSTRfQ09ORklHKTsKKwkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYm94KTsKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveCwgbWJveF90bW8pOwogCX0KIAkvKiBUaGUgSU9DVEwgc3RhdHVzIGlzIGVtYmVkZGVkIGluIHRoZSBtYWlsYm94IHN1YmhlYWRlci4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oCmluZGV4IGEwMDc1YjAuLjI5YzEzYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaApAQCAtMjkzLDEzICsyOTMsMTEgQEAKIAlzdHJ1Y3QgbHBmY19sbmtfc3RhdCBsbmtfc3RhdF9vZmZzZXRzOwogfTsKIAotI2RlZmluZSBMUEZDX01CT1hfVE1PICAgICAgICAgICAzMAkvKiBTZWMgdG1vIGZvciBvdXRzdGFuZGluZyBtYm94Ci0JCQkJCSAgIGNvbW1hbmQgKi8KLSNkZWZpbmUgTFBGQ19NQk9YX1NMSTRfQ09ORklHX1RNTyA2MAkvKiBTZWMgdG1vIGZvciBvdXRzdGFuZGluZyBtYm94Ci0JCQkJCSAgIGNvbW1hbmQgKi8KLSNkZWZpbmUgTFBGQ19NQk9YX1RNT19GTEFTSF9DTUQgMzAwICAgICAvKiBTZWMgdG1vIGZvciBvdXRzdGFuZGluZyBGTEFTSCB3cml0ZQotCQkJCQkgKiBvciBlcmFzZSBjbWRzLiBUaGlzIGlzIGVzcGVjaWFsbHkKLQkJCQkJICogbG9uZyBiZWNhdXNlIG9mIHRoZSBwb3RlbnRpYWwgb2YKLQkJCQkJICogbXVsdGlwbGUgZmxhc2ggZXJhc2VzIHRoYXQgY2FuIGJlCi0JCQkJCSAqIHNwYXduZWQuCi0JCQkJCSAqLworLyogVGltZW91dCBmb3Igbm9ybWFsIG91dHN0YW5kaW5nIG1ib3ggY29tbWFuZCAoU2Vjb25kcykgKi8KKyNkZWZpbmUgTFBGQ19NQk9YX1RNTwkJCQkzMAorLyogVGltZW91dCBmb3Igbm9uLWZsYXNoLWJhc2VkIG91dHN0YW5kaW5nIHNsaV9jb25maWcgbWJveCBjb21tYW5kIChTZWNvbmRzKSAqLworI2RlZmluZSBMUEZDX01CT1hfU0xJNF9DT05GSUdfVE1PCQk2MAorLyogVGltZW91dCBmb3IgZmxhc2gtYmFzZWQgb3V0c3RhbmRpbmcgc2xpX2NvbmZpZyBtYm94IGNvbW1hbmQgKFNlY29uZHMpICovCisjZGVmaW5lIExQRkNfTUJPWF9TTEk0X0NPTkZJR19FWFRFTkRFRF9UTU8JMzAwCisvKiBUaW1lb3V0IGZvciBvdGhlciBmbGFzaC1iYXNlZCBvdXRzdGFuZGluZyBtYm94IGNvbW1hbmQgKFNlY29uZHMpICovCisjZGVmaW5lIExQRkNfTUJPWF9UTU9fRkxBU0hfQ01ECQkJMzAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oCmluZGV4IDE5YmI4N2EuLmQ1Y2ZmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oCkBAIC0yMyw3ICsyMyw2IEBACiAjZGVmaW5lIExQRkNfWFJJX0VYQ0hfQlVTWV9XQUlUX1QxICAgCQkxMAogI2RlZmluZSBMUEZDX1hSSV9FWENIX0JVU1lfV0FJVF9UMiAgICAgICAgICAgICAgMzAwMDAKICNkZWZpbmUgTFBGQ19SRUxFQVNFX05PVElGSUNBVElPTl9JTlRFUlZBTAkzMgotI2RlZmluZSBMUEZDX0dFVF9RRV9SRUxfSU5UCQkJMzIKICNkZWZpbmUgTFBGQ19SUElfTE9XX1dBVEVSX01BUksJCQkxMAogCiAjZGVmaW5lIExQRkNfVU5SRUdfRkNGICAgICAgICAgICAgICAgICAgICAgICAgICAxCkBAIC0xMjYsNiArMTI1LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNoaWxkX2xpc3Q7CiAJdWludDMyX3QgZW50cnlfY291bnQ7CS8qIE51bWJlciBvZiBlbnRyaWVzIHRvIHN1cHBvcnQgb24gdGhlIHF1ZXVlICovCiAJdWludDMyX3QgZW50cnlfc2l6ZTsJLyogU2l6ZSBvZiBlYWNoIHF1ZXVlIGVudHJ5LiAqLworCXVpbnQzMl90IGVudHJ5X3JlcG9zdDsJLyogQ291bnQgb2YgZW50cmllcyBiZWZvcmUgZG9vcmJlbGwgaXMgcnVuZyAqLworI2RlZmluZSBMUEZDX1FVRVVFX01JTl9SRVBPU1QJOAogCXVpbnQzMl90IHF1ZXVlX2lkOwkvKiBRdWV1ZSBJRCBhc3NpZ25lZCBieSB0aGUgaGFyZHdhcmUgKi8KIAl1aW50MzJfdCBhc3NvY19xaWQ7ICAgICAvKiBRdWV1ZSBJRCBhc3NvY2lhdGVkIHdpdGgsIGZvciBDUS9XUS9NUSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcGFnZV9saXN0OwpAQCAtMzg4LDYgKzM4OSwxNiBAQAogCXVpbnQzMl90IHZmX251bWJlcjsKIH07CiAKK3N0cnVjdCBscGZjX3NsaTRfbG5rX2luZm8geworCXVpbnQ4X3QgbG5rX2R2OworI2RlZmluZSBMUEZDX0xOS19EQVRfSU5WQUwJMAorI2RlZmluZSBMUEZDX0xOS19EQVRfVkFMCTEKKwl1aW50OF90IGxua190cDsKKyNkZWZpbmUgTFBGQ19MTktfR0UJMHgwIC8qIEZDb0UgKi8KKyNkZWZpbmUgTFBGQ19MTktfRkMJMHgxIC8qIEZDICAgKi8KKwl1aW50OF90IGxua19ubzsKK307CisKIC8qIFNMSTQgSEJBIGRhdGEgc3RydWN0dXJlIGVudHJpZXMgKi8KIHN0cnVjdCBscGZjX3NsaTRfaGJhIHsKIAl2b2lkIF9faW9tZW0gKmNvbmZfcmVnc19tZW1tYXBfcDsgLyogS2VybmVsIG1lbW9yeSBtYXBwZWQgYWRkcmVzcyBmb3IKQEAgLTUwMyw2ICs1MTQsMTAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNwX2Vsc194cmlfYWJvcnRlZF93b3JrX3F1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQgc3BfdW5zb2xfd29ya19xdWV1ZTsKIAlzdHJ1Y3QgbHBmY19zbGk0X2xpbmsgbGlua19zdGF0ZTsKKwlzdHJ1Y3QgbHBmY19zbGk0X2xua19pbmZvIGxua19pbmZvOworCXVpbnQzMl90IHBwb3J0X25hbWVfc3RhOworI2RlZmluZSBMUEZDX1NMSTRfUFBOQU1FX05PTgkwCisjZGVmaW5lIExQRkNfU0xJNF9QUE5BTUVfR0VUCTEKIAlzdHJ1Y3QgbHBmY19pb3YgaW92OwogCXNwaW5sb2NrX3QgYWJ0c19zY3NpX2J1Zl9saXN0X2xvY2s7IC8qIGxpc3Qgb2YgYWJvcnRlZCBTQ1NJIElPcyAqLwogCXNwaW5sb2NrX3QgYWJ0c19zZ2xfbGlzdF9sb2NrOyAvKiBsaXN0IG9mIGFib3J0ZWQgZWxzIElPcyAqLwpAQCAtNTUzLDYgKzU2OCw3IEBACiAgKiBTTEk0IHNwZWNpZmljIGZ1bmN0aW9uIHByb3RvdHlwZXMKICAqLwogaW50IGxwZmNfcGNpX2Z1bmN0aW9uX3Jlc2V0KHN0cnVjdCBscGZjX2hiYSAqKTsKK2ludCBscGZjX3NsaTRfcGRldl9zdGF0dXNfcmVnX3dhaXQoc3RydWN0IGxwZmNfaGJhICopOwogaW50IGxwZmNfc2xpNF9oYmFfc2V0dXAoc3RydWN0IGxwZmNfaGJhICopOwogaW50IGxwZmNfc2xpNF9jb25maWcoc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjTWJveHEgKiwgdWludDhfdCwKIAkJICAgICB1aW50OF90LCB1aW50MzJfdCwgYm9vbCk7CkBAIC01NzYsNiArNTkyLDcgQEAKIAkJCXN0cnVjdCBscGZjX3F1ZXVlICosIHVpbnQzMl90KTsKIHVpbnQzMl90IGxwZmNfcnFfY3JlYXRlKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19xdWV1ZSAqLAogCQkJc3RydWN0IGxwZmNfcXVldWUgKiwgc3RydWN0IGxwZmNfcXVldWUgKiwgdWludDMyX3QpOwordm9pZCBscGZjX3JxX2FkanVzdF9yZXBvc3Qoc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjX3F1ZXVlICosIGludCk7CiB1aW50MzJfdCBscGZjX2VxX2Rlc3Ryb3koc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjX3F1ZXVlICopOwogdWludDMyX3QgbHBmY19jcV9kZXN0cm95KHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19xdWV1ZSAqKTsKIHVpbnQzMl90IGxwZmNfbXFfZGVzdHJveShzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfcXVldWUgKik7CkBAIC02MzIsNSArNjQ5LDUgQEAKIHZvaWQgbHBmY19tYnhfY21wbF9yZWFkX2ZjZl9yZWMoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKIGludCBscGZjX3NsaTRfdW5yZWdpc3Rlcl9mY2Yoc3RydWN0IGxwZmNfaGJhICopOwogaW50IGxwZmNfc2xpNF9wb3N0X3N0YXR1c19jaGVjayhzdHJ1Y3QgbHBmY19oYmEgKik7Ci11aW50OF90IGxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQoc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjTWJveHEgKik7Ci0KK3VpbnQ4X3QgbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChzdHJ1Y3QgbHBmY19oYmEgKiwgTFBGQ19NQk9YUV90ICopOwordWludDhfdCBscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHN0cnVjdCBscGZjX2hiYSAqLCBMUEZDX01CT1hRX3QgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCmluZGV4IGMxZTBhZTkuLmIwNjMwZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBpbmNsdWRlZCB3aXRoIHRoaXMgcGFja2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFBGQ19EUklWRVJfVkVSU0lPTiAiOC4zLjI1IgorI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjMuMjciCiAjZGVmaW5lIExQRkNfRFJJVkVSX05BTUUJCSJscGZjIgogI2RlZmluZSBMUEZDX1NQX0RSSVZFUl9IQU5ETEVSX05BTUUJImxwZmM6c3AiCiAjZGVmaW5lIExQRkNfRlBfRFJJVkVSX0hBTkRMRVJfTkFNRQkibHBmYzpmcCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdnBvcnQuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdnBvcnQuYwppbmRleCAxZmViNTUxLi5jZmY2Y2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Zwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192cG9ydC5jCkBAIC02OTIsMTMgKzY5MiwxNCBAQAogCQkJLyogSW5kaWNhdGUgZnJlZSBtZW1vcnkgd2hlbiByZWxlYXNlICovCiAJCQlOTFBfU0VUX0ZSRUVfUkVRKG5kbHApOwogCQl9IGVsc2UgewotCQkJaWYgKCFOTFBfQ0hLX05PREVfQUNUKG5kbHApKQorCQkJaWYgKCFOTFBfQ0hLX05PREVfQUNUKG5kbHApKSB7CiAJCQkJbmRscCA9IGxwZmNfZW5hYmxlX25vZGUodnBvcnQsIG5kbHAsCiAJCQkJCQlOTFBfU1RFX1VOVVNFRF9OT0RFKTsKIAkJCQlpZiAoIW5kbHApCiAJCQkJCWdvdG8gc2tpcF9sb2dvOworCQkJfQogCi0JCQkvKiBSZW1vdmUgbmRscCBmcm9tIHZwb3J0IG5wbGQgbGlzdCAqLworCQkJLyogUmVtb3ZlIG5kbHAgZnJvbSB2cG9ydCBsaXN0ICovCiAJCQlscGZjX2RlcXVldWVfbm9kZSh2cG9ydCwgbmRscCk7CiAJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5uZGxwX2xvY2spOwogCQkJaWYgKCFOTFBfQ0hLX0ZSRUVfUkVRKG5kbHApKQpAQCAtNzExLDggKzcxMiwxNyBAQAogCQkJfQogCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5uZGxwX2xvY2spOwogCQl9Ci0JCWlmICghKHZwb3J0LT52cGlfc3RhdGUgJiBMUEZDX1ZQSV9SRUdJU1RFUkVEKSkKKworCQkvKgorCQkgKiBJZiB0aGUgdnBpIGlzIG5vdCByZWdpc3RlcmVkLCB0aGVuIGEgdmFsaWQgRkRJU0MgZG9lc24ndAorCQkgKiBleGlzdCBhbmQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSBFTFMgTE9HTy4gIEp1c3QgY2xlYW51cAorCQkgKiB0aGUgbmRscC4KKwkJICovCisJCWlmICghKHZwb3J0LT52cGlfc3RhdGUgJiBMUEZDX1ZQSV9SRUdJU1RFUkVEKSkgeworCQkJbHBmY19ubHBfcHV0KG5kbHApOwogCQkJZ290byBza2lwX2xvZ287CisJCX0KKwogCQl2cG9ydC0+dW5yZWdfdnBpX2NtcGwgPSBWUE9SVF9JTlZBTDsKIAkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMocGhiYS0+ZmNfcmF0b3YgKiAyMDAwKTsKIAkJaWYgKCFscGZjX2lzc3VlX2Vsc19ucGl2X2xvZ28odnBvcnQsIG5kbHApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMgYi9kcml2ZXJzL3Njc2kvbWFjNTNjOTQuYwppbmRleCA2YzQyZGZmLi5lNjE3MzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWFjNTNjOTQuYworKysgYi9kcml2ZXJzL3Njc2kvbWFjNTNjOTQuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9kYmRtYS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jIGIvZHJpdmVycy9zY3NpL21hY19lc3AuYwppbmRleCAzODkzMzM3Li41OTBjZTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMKQEAgLTIzMCw5ICsyMzAsNiBAQAogCQkJCSAgdTMyIGRtYV9jb3VudCwgaW50IHdyaXRlLCB1OCBjbWQpCiB7CiAJc3RydWN0IG1hY19lc3BfcHJpdiAqbWVwID0gTUFDX0VTUF9HRVRfUFJJVihlc3ApOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAltZXAtPmVycm9yID0gMDsKIApAQCAtMjcwLDggKzI2Nyw2IEBACiAJCQllc3BfY291bnQgPSBuOwogCQl9CiAJfSB3aGlsZSAoZXNwX2NvdW50KTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyoKQEAgLTM1Myw4ICszNDgsNiBAQAogCXN0cnVjdCBtYWNfZXNwX3ByaXYgKm1lcCA9IE1BQ19FU1BfR0VUX1BSSVYoZXNwKTsKIAl1OCAqZmlmbyA9IGVzcC0+cmVncyArIEVTUF9GREFUQSAqIDE2OwogCi0JZGlzYWJsZV9pcnEoZXNwLT5ob3N0LT5pcnEpOwotCiAJY21kICY9IH5FU1BfQ01EX0RNQTsKIAltZXAtPmVycm9yID0gMDsKIApAQCAtNDMxLDggKzQyNCw2IEBACiAJCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1RJKTsKIAkJfQogCX0KLQotCWVuYWJsZV9pcnEoZXNwLT5ob3N0LT5pcnEpOwogfQogCiBzdGF0aWMgaW50IG1hY19lc3BfaXJxX3BlbmRpbmcoc3RydWN0IGVzcCAqZXNwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMKaW5kZXggODg4M2NhMy4uMzViZDEzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCkBAIC03MSw2ICs3MSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJtZWdhcmFpZF9tYm94LmgiCiAKIHN0YXRpYyBpbnQgbWVnYXJhaWRfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaAppbmRleCAzOTQ4YTAwLi5kZDk0YzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmgKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oCkBAIC0zMyw5ICszMyw5IEBACiAvKgogICogTWVnYVJBSUQgU0FTIERyaXZlciBtZXRhIGRhdGEKICAqLwotI2RlZmluZSBNRUdBU0FTX1ZFUlNJT04JCQkJIjAwLjAwLjA1LjQwLXJjMSIKLSNkZWZpbmUgTUVHQVNBU19SRUxEQVRFCQkJCSJKdWwuIDI2LCAyMDExIgotI2RlZmluZSBNRUdBU0FTX0VYVF9WRVJTSU9OCQkJIlR1ZS4gSnVsLiAyNiAxNzowMDowMCBQRFQgMjAxMSIKKyNkZWZpbmUgTUVHQVNBU19WRVJTSU9OCQkJCSIwMC4wMC4wNi4xMi1yYzEiCisjZGVmaW5lIE1FR0FTQVNfUkVMREFURQkJCQkiT2N0LiA1LCAyMDExIgorI2RlZmluZSBNRUdBU0FTX0VYVF9WRVJTSU9OCQkJIldlZC4gT2N0LiA1IDE3OjAwOjAwIFBEVCAyMDExIgogCiAvKgogICogRGV2aWNlIElEcwpAQCAtNDgsNiArNDgsNyBAQAogI2RlZmluZQlQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDczU0tJTk5ZCQkweDAwNzMKICNkZWZpbmUJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWQkJMHgwMDcxCiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTgkJMHgwMDViCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIJCTB4MDA1ZAogCiAvKgogICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTM4LDYgKzEzOSw3IEBACiAjZGVmaW5lIE1GSV9DTURfQUJPUlQJCQkJMHgwNgogI2RlZmluZSBNRklfQ01EX1NNUAkJCQkweDA3CiAjZGVmaW5lIE1GSV9DTURfU1RQCQkJCTB4MDgKKyNkZWZpbmUgTUZJX0NNRF9JTlZBTElECQkJCTB4ZmYKIAogI2RlZmluZSBNUl9EQ01EX0NUUkxfR0VUX0lORk8JCQkweDAxMDEwMDAwCiAjZGVmaW5lIE1SX0RDTURfTERfR0VUX0xJU1QJCQkweDAzMDEwMDAwCkBAIC0yMjEsNiArMjIzLDcgQEAKIAlNRklfU1RBVF9SRVNFUlZBVElPTl9JTl9QUk9HUkVTUyA9IDB4MzYsCiAJTUZJX1NUQVRfSTJDX0VSUk9SU19ERVRFQ1RFRCA9IDB4MzcsCiAJTUZJX1NUQVRfUENJX0VSUk9SU19ERVRFQ1RFRCA9IDB4MzgsCisJTUZJX1NUQVRfQ09ORklHX1NFUV9NSVNNQVRDSCA9IDB4NjcsCiAKIAlNRklfU1RBVF9JTlZBTElEX1NUQVRVUyA9IDB4RkYKIH07CkBAIC03MTYsNyArNzE5LDcgQEAKICNkZWZpbmUgTUVHQVNBU19ERUZBVUxUX0lOSVRfSUQJCQktMQogI2RlZmluZSBNRUdBU0FTX01BWF9MVU4JCQkJOAogI2RlZmluZSBNRUdBU0FTX01BWF9MRAkJCQk2NAotI2RlZmluZSBNRUdBU0FTX0RFRkFVTFRfQ01EX1BFUl9MVU4JCTEyOAorI2RlZmluZSBNRUdBU0FTX0RFRkFVTFRfQ01EX1BFUl9MVU4JCTI1NgogI2RlZmluZSBNRUdBU0FTX01BWF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgKE1FR0FTQVNfTUFYX1BEX0NIQU5ORUxTICogXAogCQkJCQkJTUVHQVNBU19NQVhfREVWX1BFUl9DSEFOTkVMKQogI2RlZmluZSBNRUdBU0FTX01BWF9MRF9JRFMJCQkoTUVHQVNBU19NQVhfTERfQ0hBTk5FTFMgKiBcCkBAIC03NTUsNiArNzU4LDcgQEAKICNkZWZpbmUgTUVHQVNBU19JTlRfQ01EUwkJCTMyCiAjZGVmaW5lIE1FR0FTQVNfU0tJTk5ZX0lOVF9DTURTCQkJNQogCisjZGVmaW5lIE1FR0FTQVNfTUFYX01TSVhfUVVFVUVTCQkJMTYKIC8qCiAgKiBGVyBjYW4gYWNjZXB0IGJvdGggMzIgYW5kIDY0IGJpdCBTR0xzLiBXZSB3YW50IHRvIGFsbG9jYXRlIDMyLzY0IGJpdAogICogU0dMcyBiYXNlZCBvbiB0aGUgc2l6ZSBvZiBkbWFfYWRkcl90CkBAIC0xMjc2LDYgKzEyODAsMTEgQEAKIAlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2U7CiB9OwogCitzdHJ1Y3QgbWVnYXNhc19pcnFfY29udGV4dCB7CisJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlOworCXUzMiBNU0l4SW5kZXg7Cit9OworCiBzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSB7CiAKIAl1MzIgKnByb2R1Y2VyOwpAQCAtMTM0OSw4ICsxMzU4LDkgQEAKIAogCS8qIFB0ciB0byBoYmEgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KIAl2b2lkICpjdHJsX2NvbnRleHQ7Ci0JdTgJbXNpX2ZsYWc7Ci0Jc3RydWN0IG1zaXhfZW50cnkgbXNpeGVudHJ5OworCXVuc2lnbmVkIGludCBtc2l4X3ZlY3RvcnM7CisJc3RydWN0IG1zaXhfZW50cnkgbXNpeGVudHJ5W01FR0FTQVNfTUFYX01TSVhfUVVFVUVTXTsKKwlzdHJ1Y3QgbWVnYXNhc19pcnFfY29udGV4dCBpcnFfY29udGV4dFtNRUdBU0FTX01BWF9NU0lYX1FVRVVFU107CiAJdTY0IG1hcF9pZDsKIAlzdHJ1Y3QgbWVnYXNhc19jbWQgKm1hcF91cGRhdGVfY21kOwogCXVuc2lnbmVkIGxvbmcgYmFyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYwppbmRleCA3NzZkMDE5Li4yOWE5OTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYwpAQCAtMTgsNyArMTgsNyBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKgogICogIEZJTEU6IG1lZ2FyYWlkX3Nhc19iYXNlLmMKLSAqICBWZXJzaW9uIDogdjAwLjAwLjA1LjQwLXJjMQorICogIFZlcnNpb24gOiB2MDAuMDAuMDYuMTItcmMxCiAgKgogICogIEF1dGhvcnM6IExTSSBDb3Jwb3JhdGlvbgogICogICAgICAgICAgIFNyZWVuaXZhcyBCYWdhbGtvdGUKQEAgLTg0LDcgKzg0LDcgQEAKIE1PRFVMRV9BVVRIT1IoIm1lZ2FyYWlkbGludXhAbHNpLmNvbSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJMU0kgTWVnYVJBSUQgU0FTIERyaXZlciIpOwogCi1pbnQgbWVnYXNhc190cmFuc2l0aW9uX3RvX3JlYWR5KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7CitpbnQgbWVnYXNhc190cmFuc2l0aW9uX3RvX3JlYWR5KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgaW50IG9jcik7CiBzdGF0aWMgaW50IG1lZ2FzYXNfZ2V0X3BkX2xpc3Qoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKIHN0YXRpYyBpbnQgbWVnYXNhc19pc3N1ZV9pbml0X21maShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOwogc3RhdGljIGludCBtZWdhc2FzX3JlZ2lzdGVyX2FlbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCkBAIC0xMTQsNiArMTE0LDggQEAKIAkvKiB4c2NhbGUgSU9QICovCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTil9LAogCS8qIEZ1c2lvbiAqLworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKX0sCisJLyogSW52YWRlciAqLwogCXt9CiB9OwogCkBAIC0yMTMsNiArMjE1LDEwIEBACiAKIAljbWQtPnNjbWQgPSBOVUxMOwogCWNtZC0+ZnJhbWVfY291bnQgPSAwOworCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pICYmCisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpICYmCisJICAgIChyZXNldF9kZXZpY2VzKSkKKwkJY21kLT5mcmFtZS0+aGRyLmNtZCA9IE1GSV9DTURfSU5WQUxJRDsKIAlsaXN0X2FkZF90YWlsKCZjbWQtPmxpc3QsICZpbnN0YW5jZS0+Y21kX3Bvb2wpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPmNtZF9wb29sX2xvY2ssIGZsYWdzKTsKQEAgLTE1ODMsNyArMTU4OSw4IEBACiB7CiAJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzNTS0lOTlkpIHx8CiAJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkpIHx8Ci0JICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikpIHsKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSkgewogCQl3cml0ZWwoTUZJX1NUT1BfQURQLCAmaW5zdGFuY2UtPnJlZ19zZXQtPmRvb3JiZWxsKTsKIAl9IGVsc2UgewogCQl3cml0ZWwoTUZJX1NUT1BfQURQLCAmaW5zdGFuY2UtPnJlZ19zZXQtPmluYm91bmRfZG9vcmJlbGwpOwpAQCAtMTkwNyw3ICsxOTE0LDYgQEAKIHN0YXRpYyBlbnVtCiBibGtfZWhfdGltZXJfcmV0dXJuIG1lZ2FzYXNfcmVzZXRfdGltZXIoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKIHsKLQlzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZCA9IChzdHJ1Y3QgbWVnYXNhc19jbWQgKilzY21kLT5TQ3AucHRyOwogCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xOTE2LDcgKzE5MjIsNyBAQAogCQlyZXR1cm4gQkxLX0VIX05PVF9IQU5ETEVEOwogCX0KIAotCWluc3RhbmNlID0gY21kLT5pbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqKXNjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CiAJaWYgKCEoaW5zdGFuY2UtPmZsYWcgJiBNRUdBU0FTX0ZXX0JVU1kpKSB7CiAJCS8qIEZXIGlzIGJ1c3ksIHRocm90dGxlIElPICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKQEAgLTE5NTcsNyArMTk2Myw4IEBACiAJLyoKIAkgKiBGaXJzdCB3YWl0IGZvciBhbGwgY29tbWFuZHMgdG8gY29tcGxldGUKIAkgKi8KLQlpZiAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pCisJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikpCiAJCXJldCA9IG1lZ2FzYXNfcmVzZXRfZnVzaW9uKHNjbWQtPmRldmljZS0+aG9zdCk7CiAJZWxzZQogCQlyZXQgPSBtZWdhc2FzX2dlbmVyaWNfcmVzZXQoc2NtZCk7CkBAIC0yMTYxLDcgKzIxNjgsMTYgQEAKIAkJY21kLT5zY21kLT5TQ3AucHRyID0gTlVMTDsKIAogCXN3aXRjaCAoaGRyLT5jbWQpIHsKLQorCWNhc2UgTUZJX0NNRF9JTlZBTElEOgorCQkvKiBTb21lIG9sZGVyIDEwNjggY29udHJvbGxlciBGVyBtYXkga2VlcCBhIHBlbmRlZAorCQkgICBNUl9EQ01EX0NUUkxfRVZFTlRfR0VUX0lORk8gbGVmdCBvdmVyIGZyb20gdGhlIG1haW4ga2VybmVsCisJCSAgIHdoZW4gYm9vdGluZyB0aGUga2R1bXAga2VybmVsLiAgSWdub3JlIHRoaXMgY29tbWFuZCB0bworCQkgICBwcmV2ZW50IGEga2VybmVsIHBhbmljIG9uIHNodXRkb3duIG9mIHRoZSBrZHVtcCBrZXJuZWwuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogTUZJX0NNRF9JTlZBTElEIGNvbW1hbmQgIgorCQkgICAgICAgImNvbXBsZXRlZC5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IElmIHlvdSBoYXZlIGEgY29udHJvbGxlciAiCisJCSAgICAgICAib3RoZXIgdGhhbiBQRVJDNSwgcGxlYXNlIHVwZ3JhZGUgeW91ciBmaXJtd2FyZS5cbiIpOworCQlicmVhazsKIAljYXNlIE1GSV9DTURfUERfU0NTSV9JTzoKIAljYXNlIE1GSV9DTURfTERfU0NTSV9JTzoKIApAQCAtMjQ3Nyw3ICsyNDkzLDcgQEAKIAkJCW1zbGVlcCgxMDAwKTsKIAkJfQogCi0JCWlmIChtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoaW5zdGFuY2UpKSB7CisJCWlmIChtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoaW5zdGFuY2UsIDEpKSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgIm1lZ2FyYWlkX3NhczphZGFwdGVyIG5vdCByZWFkeVxuIik7CiAKIAkJCW1lZ2FyYWlkX3Nhc19raWxsX2hiYShpbnN0YW5jZSk7CkBAIC0yNTMyLDcgKzI1NDgsNyBAQAogCQkJCQkJaW5zdGFuY2UtPnJlZ19zZXQpCiAJCQkJCQkpID09IDApIHsKIAkJLyogSGFyZHdhcmUgbWF5IG5vdCBzZXQgb3V0Ym91bmRfaW50cl9zdGF0dXMgaW4gTVNJLVggbW9kZSAqLwotCQlpZiAoIWluc3RhbmNlLT5tc2lfZmxhZykKKwkJaWYgKCFpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQogCQkJcmV0dXJuIElSUV9OT05FOwogCX0KIApAQCAtMjU5MCwxNiArMjYwNiwxNCBAQAogICovCiBzdGF0aWMgaXJxcmV0dXJuX3QgbWVnYXNhc19pc3IoaW50IGlycSwgdm9pZCAqZGV2cCkKIHsKLQlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2U7CisJc3RydWN0IG1lZ2FzYXNfaXJxX2NvbnRleHQgKmlycV9jb250ZXh0ID0gZGV2cDsKKwlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UgPSBpcnFfY29udGV4dC0+aW5zdGFuY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpcnFyZXR1cm5fdAlyYzsKIAotCWlmIChhdG9taWNfcmVhZCgKLQkJJigoKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICopZGV2cCktPmZ3X3Jlc2V0X25vX3BjaV9hY2Nlc3MpKSkKKwlpZiAoYXRvbWljX3JlYWQoJmluc3RhbmNlLT5md19yZXNldF9ub19wY2lfYWNjZXNzKSkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCi0JaW5zdGFuY2UgPSAoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKilkZXZwOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5oYmFfbG9jaywgZmxhZ3MpOwogCXJjID0gIG1lZ2FzYXNfZGVwbGV0ZV9yZXBseV9xdWV1ZShpbnN0YW5jZSwgRElEX09LKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+aGJhX2xvY2ssIGZsYWdzKTsKQEAgLTI2MTcsNyArMjYzMSw3IEBACiAgKiBoYXMgdG8gd2FpdCBmb3IgdGhlIHJlYWR5IHN0YXRlLgogICovCiBpbnQKLW1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSogaW5zdGFuY2UpCittZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBpbnQgb2NyKQogewogCWludCBpOwogCXU4IG1heF93YWl0OwpAQCAtMjYzOSwxMSArMjY1MywxMyBAQAogCQlzd2l0Y2ggKGZ3X3N0YXRlKSB7CiAKIAkJY2FzZSBNRklfU1RBVEVfRkFVTFQ6Ci0KIAkJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBGVyBpbiBGQVVMVCBzdGF0ZSEhXG4iKTsKLQkJCW1heF93YWl0ID0gTUVHQVNBU19SRVNFVF9XQUlUX1RJTUU7Ci0JCQljdXJfc3RhdGUgPSBNRklfU1RBVEVfRkFVTFQ7Ci0JCQlicmVhazsKKwkJCWlmIChvY3IpIHsKKwkJCQltYXhfd2FpdCA9IE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FOworCQkJCWN1cl9zdGF0ZSA9IE1GSV9TVEFURV9GQVVMVDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAtRU5PREVWOwogCiAJCWNhc2UgTUZJX1NUQVRFX1dBSVRfSEFORFNIQUtFOgogCQkJLyoKQEAgLTI2NTQsNyArMjY3MCw5IEBACiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCQkgUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWSkgfHwKIAkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQotCQkJCSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pKSB7CisJCQkJIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJCVBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpKSB7CiAJCQkJd3JpdGVsKAogCQkJCSAgTUZJX0lOSVRfQ0xFQVJfSEFORFNIQUtFfE1GSV9JTklUX0hPVFBMVUcsCiAJCQkJICAmaW5zdGFuY2UtPnJlZ19zZXQtPmRvb3JiZWxsKTsKQEAgLTI2NzQsNyArMjY5Miw5IEBACiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KIAkJCQkgUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWSkgfHwKIAkJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQotCQkJICAgICBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pKSB7CisJCQkgICAgIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJICAgICBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSkgewogCQkJCXdyaXRlbChNRklfSU5JVF9IT1RQTFVHLAogCQkJCSAgICAgICAmaW5zdGFuY2UtPnJlZ19zZXQtPmRvb3JiZWxsKTsKIAkJCX0gZWxzZQpAQCAtMjY5NSwxMSArMjcxNSwxNSBAQAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3MVNLSU5OWSkgIHx8CiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UKLQkJCQkJPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSkgeworCQkJCQk9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UKKwkJCQkJPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikpIHsKIAkJCQl3cml0ZWwoTUZJX1JFU0VUX0ZMQUdTLAogCQkJCQkmaW5zdGFuY2UtPnJlZ19zZXQtPmRvb3JiZWxsKTsKLQkJCQlpZiAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQotCQkJCSAgICBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHsKKwkJCQlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCQkgICAgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCQkJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQorCQkJCSAgICAgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikpIHsKIAkJCQkJZm9yIChpID0gMDsgaSA8ICgxMCAqIDEwMDApOyBpICs9IDIwKSB7CiAJCQkJCQlpZiAocmVhZGwoCiAJCQkJCQkJICAgICZpbnN0YW5jZS0+CkBAIC0yOTIyLDYgKzI5NDYsMTAgQEAKIAkJbWVtc2V0KGNtZC0+ZnJhbWUsIDAsIHRvdGFsX3N6KTsKIAkJY21kLT5mcmFtZS0+aW8uY29udGV4dCA9IGNtZC0+aW5kZXg7CiAJCWNtZC0+ZnJhbWUtPmlvLnBhZF8wID0gMDsKKwkJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgJiYKKwkJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpICYmCisJCSAgICAocmVzZXRfZGV2aWNlcykpCisJCQljbWQtPmZyYW1lLT5oZHIuY21kID0gTUZJX0NNRF9JTlZBTElEOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzQ3NCw2ICszNTAyLDcgQEAKIAlzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqcmVnX3NldDsKIAlzdHJ1Y3QgbWVnYXNhc19jdHJsX2luZm8gKmN0cmxfaW5mbzsKIAl1bnNpZ25lZCBsb25nIGJhcl9saXN0OworCWludCBpOwogCiAJLyogRmluZCBmaXJzdCBtZW1vcnkgYmFyICovCiAJYmFyX2xpc3QgPSBwY2lfc2VsZWN0X2JhcnMoaW5zdGFuY2UtPnBkZXYsIElPUkVTT1VSQ0VfTUVNKTsKQEAgLTM0OTYsNiArMzUyNSw3IEBACiAKIAlzd2l0Y2ggKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVI6CiAJCWluc3RhbmNlLT5pbnN0YW5jZXQgPSAmbWVnYXNhc19pbnN0YW5jZV90ZW1wbGF0ZV9mdXNpb247CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfU0FTMTA3OFI6CkBAIC0zNTIwLDE1ICszNTUwLDM5IEBACiAJLyoKIAkgKiBXZSBleHBlY3QgdGhlIEZXIHN0YXRlIHRvIGJlIFJFQURZCiAJICovCi0JaWYgKG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShpbnN0YW5jZSkpCisJaWYgKG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShpbnN0YW5jZSwgMCkpCiAJCWdvdG8gZmFpbF9yZWFkeV9zdGF0ZTsKIAogCS8qIENoZWNrIGlmIE1TSS1YIGlzIHN1cHBvcnRlZCB3aGlsZSBpbiByZWFkeSBzdGF0ZSAqLwogCW1zaXhfZW5hYmxlID0gKGluc3RhbmNlLT5pbnN0YW5jZXQtPnJlYWRfZndfc3RhdHVzX3JlZyhyZWdfc2V0KSAmCiAJCSAgICAgICAweDQwMDAwMDApID4+IDB4MWE7Ci0JaWYgKG1zaXhfZW5hYmxlICYmICFtc2l4X2Rpc2FibGUgJiYKLQkgICAgIXBjaV9lbmFibGVfbXNpeChpbnN0YW5jZS0+cGRldiwgJmluc3RhbmNlLT5tc2l4ZW50cnksIDEpKQotCQlpbnN0YW5jZS0+bXNpX2ZsYWcgPSAxOworCWlmIChtc2l4X2VuYWJsZSAmJiAhbXNpeF9kaXNhYmxlKSB7CisJCS8qIENoZWNrIG1heCBNU0ktWCB2ZWN0b3JzICovCisJCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSkgeworCQkJaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA9IChyZWFkbCgmaW5zdGFuY2UtPnJlZ19zZXQtPgorCQkJCQkJCW91dGJvdW5kX3NjcmF0Y2hfcGFkXzIKKwkJCQkJCQkgICkgJiAweDFGKSArIDE7CisJCX0gZWxzZQorCQkJaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA9IDE7CisJCS8qIERvbid0IGJvdGhlciBhbGxvY2F0aW5nIG1vcmUgTVNJLVggdmVjdG9ycyB0aGFuIGNwdXMgKi8KKwkJaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA9IG1pbihpbnN0YW5jZS0+bXNpeF92ZWN0b3JzLAorCQkJCQkgICAgICh1bnNpZ25lZCBpbnQpbnVtX29ubGluZV9jcHVzKCkpOworCQlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKQorCQkJaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS5lbnRyeSA9IGk7CisJCWkgPSBwY2lfZW5hYmxlX21zaXgoaW5zdGFuY2UtPnBkZXYsIGluc3RhbmNlLT5tc2l4ZW50cnksCisJCQkJICAgIGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpOworCQlpZiAoaSA+PSAwKSB7CisJCQlpZiAoaSkgeworCQkJCWlmICghcGNpX2VuYWJsZV9tc2l4KGluc3RhbmNlLT5wZGV2LAorCQkJCQkJICAgICBpbnN0YW5jZS0+bXNpeGVudHJ5LCBpKSkKKwkJCQkJaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA9IGk7CisJCQkJZWxzZQorCQkJCQlpbnN0YW5jZS0+bXNpeF92ZWN0b3JzID0gMDsKKwkJCX0KKwkJfSBlbHNlCisJCQlpbnN0YW5jZS0+bXNpeF92ZWN0b3JzID0gMDsKKwl9CiAKIAkvKiBHZXQgb3BlcmF0aW9uYWwgcGFyYW1zLCBzZ2UgZmxhZ3MsIHNlbmQgaW5pdCBjbWQgdG8gY29udHJvbGxlciAqLwogCWlmIChpbnN0YW5jZS0+aW5zdGFuY2V0LT5pbml0X2FkYXB0ZXIoaW5zdGFuY2UpKQpAQCAtMzg5Miw3ICszOTQ2LDggQEAKIAlob3N0LT5tYXhfY21kX2xlbiA9IDE2OwogCiAJLyogRnVzaW9uIG9ubHkgc3VwcG9ydHMgaG9zdCByZXNldCAqLwotCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgeworCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpKSB7CiAJCWhvc3QtPmhvc3R0LT5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IE5VTEw7CiAJCWhvc3QtPmhvc3R0LT5laF9idXNfcmVzZXRfaGFuZGxlciA9IE5VTEw7CiAJfQpAQCAtMzk0Miw3ICszOTk3LDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0CiBtZWdhc2FzX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCWludCBydmFsLCBwb3M7CisJaW50IHJ2YWwsIHBvcywgaSwgajsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZTsKIAl1MTYgY29udHJvbCA9IDA7CkBAIC00MDAyLDYgKzQwNTcsNyBAQAogCiAJc3dpdGNoIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT046CisJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSOgogCXsKIAkJc3RydWN0IGZ1c2lvbl9jb250ZXh0ICpmdXNpb247CiAKQEAgLTQwOTQsNyArNDE1MCw4IEBACiAJaW5zdGFuY2UtPmxhc3RfdGltZSA9IDA7CiAJaW5zdGFuY2UtPmRpc2FibGVPbmxpbmVDdHJsUmVzZXQgPSAxOwogCi0JaWYgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKQorCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpKQogCQlJTklUX1dPUksoJmluc3RhbmNlLT53b3JrX2luaXQsIG1lZ2FzYXNfZnVzaW9uX29jcl93cSk7CiAJZWxzZQogCQlJTklUX1dPUksoJmluc3RhbmNlLT53b3JrX2luaXQsIHByb2Nlc3NfZndfc3RhdGVfY2hhbmdlX3dxKTsKQEAgLTQxMDgsMTEgKzQxNjUsMzIgQEAKIAkvKgogCSAqIFJlZ2lzdGVyIElSUQogCSAqLwotCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+bXNpX2ZsYWcgPyBpbnN0YW5jZS0+bXNpeGVudHJ5LnZlY3RvciA6Ci0JCQlwZGV2LT5pcnEsIGluc3RhbmNlLT5pbnN0YW5jZXQtPnNlcnZpY2VfaXNyLAotCQkJSVJRRl9TSEFSRUQsICJtZWdhc2FzIiwgaW5zdGFuY2UpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKLQkJZ290byBmYWlsX2lycTsKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykgeworCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykgeworCQkJaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldLmluc3RhbmNlID0gaW5zdGFuY2U7CisJCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0uTVNJeEluZGV4ID0gaTsKKwkJCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKKwkJCQkJaW5zdGFuY2UtPmluc3RhbmNldC0+c2VydmljZV9pc3IsIDAsCisJCQkJCSJtZWdhc2FzIiwKKwkJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogRmFpbGVkIHRvICIKKwkJCQkgICAgICAgInJlZ2lzdGVyIElSUSBmb3IgdmVjdG9yICVkLlxuIiwgaSk7CisJCQkJZm9yIChqID0gMCA7IGogPCBpIDsgaisrKQorCQkJCQlmcmVlX2lycSgKKwkJCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbal0udmVjdG9yLAorCQkJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFtqXSk7CisJCQkJZ290byBmYWlsX2lycTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWluc3RhbmNlLT5pcnFfY29udGV4dFswXS5pbnN0YW5jZSA9IGluc3RhbmNlOworCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0uTVNJeEluZGV4ID0gMDsKKwkJaWYgKHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaW5zdGFuY2UtPmluc3RhbmNldC0+c2VydmljZV9pc3IsCisJCQkJSVJRRl9TSEFSRUQsICJtZWdhc2FzIiwKKwkJCQkmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IEZhaWxlZCB0byByZWdpc3RlciBJUlFcbiIpOworCQkJZ290byBmYWlsX2lycTsKKwkJfQogCX0KIAogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmVuYWJsZV9pbnRyKGluc3RhbmNlLT5yZWdfc2V0KTsKQEAgLTQxNTYsMTUgKzQyMzQsMjAgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIoaW5zdGFuY2UtPnJlZ19zZXQpOwotCWZyZWVfaXJxKGluc3RhbmNlLT5tc2lfZmxhZyA/IGluc3RhbmNlLT5tc2l4ZW50cnkudmVjdG9yIDoKLQkJIGluc3RhbmNlLT5wZGV2LT5pcnEsIGluc3RhbmNlKTsKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKKwkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspCisJCQlmcmVlX2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKKwkJCQkgJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSk7CisJZWxzZQorCQlmcmVlX2lycShpbnN0YW5jZS0+cGRldi0+aXJxLCAmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKTsKIGZhaWxfaXJxOgotCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikKKwlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSkKIAkJbWVnYXNhc19yZWxlYXNlX2Z1c2lvbihpbnN0YW5jZSk7CiAJZWxzZQogCQltZWdhc2FzX3JlbGVhc2VfbWZpKGluc3RhbmNlKTsKICAgICAgIGZhaWxfaW5pdF9tZmk6Ci0JaWYgKGluc3RhbmNlLT5tc2lfZmxhZykKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKIAkJcGNpX2Rpc2FibGVfbXNpeChpbnN0YW5jZS0+cGRldik7CiAgICAgICBmYWlsX2FsbG9jX2RtYV9idWY6CiAJaWYgKGluc3RhbmNlLT5ldnRfZGV0YWlsKQpAQCAtNDI4MCw2ICs0MzYzLDcgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZTsKKwlpbnQgaTsKIAogCWluc3RhbmNlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWhvc3QgPSBpbnN0YW5jZS0+aG9zdDsKQEAgLTQzMDMsOSArNDM4NywxNCBAQAogCiAJcGNpX3NldF9kcnZkYXRhKGluc3RhbmNlLT5wZGV2LCBpbnN0YW5jZSk7CiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKGluc3RhbmNlLT5yZWdfc2V0KTsKLQlmcmVlX2lycShpbnN0YW5jZS0+bXNpX2ZsYWcgPyBpbnN0YW5jZS0+bXNpeGVudHJ5LnZlY3RvciA6Ci0JCSBpbnN0YW5jZS0+cGRldi0+aXJxLCBpbnN0YW5jZSk7Ci0JaWYgKGluc3RhbmNlLT5tc2lfZmxhZykKKworCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQorCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykKKwkJCWZyZWVfaXJxKGluc3RhbmNlLT5tc2l4ZW50cnlbaV0udmVjdG9yLAorCQkJCSAmaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldKTsKKwllbHNlCisJCWZyZWVfaXJxKGluc3RhbmNlLT5wZGV2LT5pcnEsICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0pOworCWlmIChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKQogCQlwY2lfZGlzYWJsZV9tc2l4KGluc3RhbmNlLT5wZGV2KTsKIAogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwpAQCAtNDMyMyw3ICs0NDEyLDcgQEAKIHN0YXRpYyBpbnQKIG1lZ2FzYXNfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCWludCBydmFsOworCWludCBydmFsLCBpLCBqOwogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlOwogCkBAIC00MzU3LDE1ICs0NDQ2LDE3IEBACiAJLyoKIAkgKiBXZSBleHBlY3QgdGhlIEZXIHN0YXRlIHRvIGJlIFJFQURZCiAJICovCi0JaWYgKG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShpbnN0YW5jZSkpCisJaWYgKG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShpbnN0YW5jZSwgMCkpCiAJCWdvdG8gZmFpbF9yZWFkeV9zdGF0ZTsKIAogCS8qIE5vdyByZS1lbmFibGUgTVNJLVggKi8KLQlpZiAoaW5zdGFuY2UtPm1zaV9mbGFnKQotCQlwY2lfZW5hYmxlX21zaXgoaW5zdGFuY2UtPnBkZXYsICZpbnN0YW5jZS0+bXNpeGVudHJ5LCAxKTsKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKKwkJcGNpX2VuYWJsZV9tc2l4KGluc3RhbmNlLT5wZGV2LCBpbnN0YW5jZS0+bXNpeGVudHJ5LAorCQkJCWluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpOwogCiAJc3dpdGNoIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT046CisJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSOgogCXsKIAkJbWVnYXNhc19yZXNldF9yZXBseV9kZXNjKGluc3RhbmNlKTsKIAkJaWYgKG1lZ2FzYXNfaW9jX2luaXRfZnVzaW9uKGluc3RhbmNlKSkgewpAQCAtNDM5MSwxMSArNDQ4MiwzMiBAQAogCS8qCiAJICogUmVnaXN0ZXIgSVJRCiAJICovCi0JaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5tc2lfZmxhZyA/IGluc3RhbmNlLT5tc2l4ZW50cnkudmVjdG9yIDoKLQkJCXBkZXYtPmlycSwgaW5zdGFuY2UtPmluc3RhbmNldC0+c2VydmljZV9pc3IsCi0JCQlJUlFGX1NIQVJFRCwgIm1lZ2FzYXMiLCBpbnN0YW5jZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtZWdhc2FzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKLQkJZ290byBmYWlsX2lycTsKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykgeworCQlmb3IgKGkgPSAwIDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykgeworCQkJaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldLmluc3RhbmNlID0gaW5zdGFuY2U7CisJCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0uTVNJeEluZGV4ID0gaTsKKwkJCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKKwkJCQkJaW5zdGFuY2UtPmluc3RhbmNldC0+c2VydmljZV9pc3IsIDAsCisJCQkJCSJtZWdhc2FzIiwKKwkJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogRmFpbGVkIHRvICIKKwkJCQkgICAgICAgInJlZ2lzdGVyIElSUSBmb3IgdmVjdG9yICVkLlxuIiwgaSk7CisJCQkJZm9yIChqID0gMCA7IGogPCBpIDsgaisrKQorCQkJCQlmcmVlX2lycSgKKwkJCQkJCWluc3RhbmNlLT5tc2l4ZW50cnlbal0udmVjdG9yLAorCQkJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFtqXSk7CisJCQkJZ290byBmYWlsX2lycTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWluc3RhbmNlLT5pcnFfY29udGV4dFswXS5pbnN0YW5jZSA9IGluc3RhbmNlOworCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0uTVNJeEluZGV4ID0gMDsKKwkJaWYgKHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaW5zdGFuY2UtPmluc3RhbmNldC0+c2VydmljZV9pc3IsCisJCQkJSVJRRl9TSEFSRUQsICJtZWdhc2FzIiwKKwkJCQkmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IEZhaWxlZCB0byByZWdpc3RlciBJUlFcbiIpOworCQkJZ290byBmYWlsX2lycTsKKwkJfQogCX0KIAogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmVuYWJsZV9pbnRyKGluc3RhbmNlLT5yZWdfc2V0KTsKQEAgLTQ0OTIsMTMgKzQ2MDQsMTggQEAKIAogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihpbnN0YW5jZS0+cmVnX3NldCk7CiAKLQlmcmVlX2lycShpbnN0YW5jZS0+bXNpX2ZsYWcgPyBpbnN0YW5jZS0+bXNpeGVudHJ5LnZlY3RvciA6Ci0JCSBpbnN0YW5jZS0+cGRldi0+aXJxLCBpbnN0YW5jZSk7Ci0JaWYgKGluc3RhbmNlLT5tc2lfZmxhZykKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKKwkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspCisJCQlmcmVlX2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKKwkJCQkgJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSk7CisJZWxzZQorCQlmcmVlX2lycShpbnN0YW5jZS0+cGRldi0+aXJxLCAmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKTsKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKIAkJcGNpX2Rpc2FibGVfbXNpeChpbnN0YW5jZS0+cGRldik7CiAKIAlzd2l0Y2ggKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVI6CiAJCW1lZ2FzYXNfcmVsZWFzZV9mdXNpb24oaW5zdGFuY2UpOwogCQlmb3IgKGkgPSAwOyBpIDwgMiA7IGkrKykKIAkJCWlmIChmdXNpb24tPmxkX21hcFtpXSkKQEAgLTQ1MzksMTQgKzQ2NTYsMjAgQEAKICAqLwogc3RhdGljIHZvaWQgbWVnYXNhc19zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKKwlpbnQgaTsKIAlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKIAlpbnN0YW5jZS0+dW5sb2FkID0gMTsKIAltZWdhc2FzX2ZsdXNoX2NhY2hlKGluc3RhbmNlKTsKIAltZWdhc2FzX3NodXRkb3duX2NvbnRyb2xsZXIoaW5zdGFuY2UsIE1SX0RDTURfQ1RSTF9TSFVURE9XTik7CiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKGluc3RhbmNlLT5yZWdfc2V0KTsKLQlmcmVlX2lycShpbnN0YW5jZS0+bXNpX2ZsYWcgPyBpbnN0YW5jZS0+bXNpeGVudHJ5LnZlY3RvciA6Ci0JCSBpbnN0YW5jZS0+cGRldi0+aXJxLCBpbnN0YW5jZSk7Ci0JaWYgKGluc3RhbmNlLT5tc2lfZmxhZykKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKKwkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspCisJCQlmcmVlX2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKKwkJCQkgJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSk7CisJZWxzZQorCQlmcmVlX2lycShpbnN0YW5jZS0+cGRldi0+aXJxLCAmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKTsKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKIAkJcGNpX2Rpc2FibGVfbXNpeChpbnN0YW5jZS0+cGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYwppbmRleCA1YTVhZjFmLi41MjU1ZGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mcC5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KIAogI2luY2x1ZGUgIm1lZ2FyYWlkX3Nhc19mdXNpb24uaCIKKyNpbmNsdWRlICJtZWdhcmFpZF9zYXMuaCIKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KIAogI2RlZmluZSBBQlNfRElGRihhLCBiKSAgICgoKGEpID4gKGIpKSA/ICgoYSkgLSAoYikpIDogKChiKSAtIChhKSkpCkBAIC0yMjYsOCArMjI3LDkgQEAKICogICAgc3BhbiAgICAgICAgICAtIFNwYW4gbnVtYmVyCiAqICAgIGJsb2NrICAgICAgICAgLSBBYnNvbHV0ZSBCbG9jayBudW1iZXIgaW4gdGhlIHBoeXNpY2FsIGRpc2sKICovCi11OCBNUl9HZXRQaHlQYXJhbXModTMyIGxkLCB1NjQgc3RyaXBSb3csIHUxNiBzdHJpcFJlZiwgdTY0ICpwZEJsb2NrLAotCQkgICB1MTYgKnBEZXZIYW5kbGUsIHN0cnVjdCBSQUlEX0NPTlRFWFQgKnBSQUlEX0NvbnRleHQsCit1OCBNUl9HZXRQaHlQYXJhbXMoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCB1MzIgbGQsIHU2NCBzdHJpcFJvdywKKwkJICAgdTE2IHN0cmlwUmVmLCB1NjQgKnBkQmxvY2ssIHUxNiAqcERldkhhbmRsZSwKKwkJICAgc3RydWN0IFJBSURfQ09OVEVYVCAqcFJBSURfQ29udGV4dCwKIAkJICAgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKQogewogCXN0cnVjdCBNUl9MRF9SQUlEICAqcmFpZCA9IE1SX0xkUmFpZEdldChsZCwgbWFwKTsKQEAgLTI3OSw3ICsyODEsOCBAQAogCQkqcERldkhhbmRsZSA9IE1SX1BkRGV2SGFuZGxlR2V0KHBkLCBtYXApOwogCWVsc2UgewogCQkqcERldkhhbmRsZSA9IE1SX1BEX0lOVkFMSUQ7IC8qIHNldCBkZXYgaGFuZGxlIGFzIGludmFsaWQuICovCi0JCWlmIChyYWlkLT5sZXZlbCA+PSA1KQorCQlpZiAoKHJhaWQtPmxldmVsID49IDUpICYmCisJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSkKIAkJCXBSQUlEX0NvbnRleHQtPnJlZ0xvY2tGbGFncyA9IFJFR0lPTl9UWVBFX0VYQ0xVU0lWRTsKIAkJZWxzZSBpZiAocmFpZC0+bGV2ZWwgPT0gMSkgewogCQkJLyogR2V0IGFsdGVybmF0ZSBQZC4gKi8KQEAgLTMwNiw3ICszMDksOCBAQAogKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDAgaWYgcmVnaW9uIGxvY2sgd2FzIGFjcXVpcmVkIE9SIHJldHVybiBudW0gc3RyaXBzCiAqLwogdTgKLU1SX0J1aWxkUmFpZENvbnRleHQoc3RydWN0IElPX1JFUVVFU1RfSU5GTyAqaW9faW5mbywKK01SX0J1aWxkUmFpZENvbnRleHQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkgICAgc3RydWN0IElPX1JFUVVFU1RfSU5GTyAqaW9faW5mbywKIAkJICAgIHN0cnVjdCBSQUlEX0NPTlRFWFQgKnBSQUlEX0NvbnRleHQsCiAJCSAgICBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApCiB7CkBAIC0zOTQsOCArMzk4LDEyIEBACiAJfQogCiAJcFJBSURfQ29udGV4dC0+dGltZW91dFZhbHVlICAgICA9IG1hcC0+cmFpZE1hcC5mcFBkSW9UaW1lb3V0U2VjOwotCXBSQUlEX0NvbnRleHQtPnJlZ0xvY2tGbGFncyAgICAgPSAoaXNSZWFkKSA/IFJFR0lPTl9UWVBFX1NIQVJFRF9SRUFEIDoKLQkJcmFpZC0+cmVnVHlwZVJlcU9uV3JpdGU7CisJaWYgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikKKwkJcFJBSURfQ29udGV4dC0+cmVnTG9ja0ZsYWdzID0gKGlzUmVhZCkgPworCQkJcmFpZC0+cmVnVHlwZVJlcU9uUmVhZCA6IHJhaWQtPnJlZ1R5cGVSZXFPbldyaXRlOworCWVsc2UKKwkJcFJBSURfQ29udGV4dC0+cmVnTG9ja0ZsYWdzID0gKGlzUmVhZCkgPworCQkJUkVHSU9OX1RZUEVfU0hBUkVEX1JFQUQgOiByYWlkLT5yZWdUeXBlUmVxT25Xcml0ZTsKIAlwUkFJRF9Db250ZXh0LT5WaXJ0dWFsRGlza1RndElkID0gcmFpZC0+dGFyZ2V0SWQ7CiAJcFJBSURfQ29udGV4dC0+cmVnTG9ja1Jvd0xCQSAgICA9IHJlZ1N0YXJ0OwogCXBSQUlEX0NvbnRleHQtPnJlZ0xvY2tMZW5ndGggICAgPSByZWdTaXplOwpAQCAtNDA0LDcgKzQxMiw4IEBACiAJLypHZXQgUGh5IFBhcmFtcyBvbmx5IGlmIEZQIGNhcGFibGUsIG9yIGVsc2UgbGVhdmUgaXQgdG8gTVIgZmlybXdhcmUKIAkgIHRvIGRvIHRoZSBjYWxjdWxhdGlvbi4qLwogCWlmIChpb19pbmZvLT5mcE9rRm9ySW8pIHsKLQkJcmV0dmFsID0gTVJfR2V0UGh5UGFyYW1zKGxkLCBzdGFydF9zdHJpcCwgcmVmX2luX3N0YXJ0X3N0cmlwZSwKKwkJcmV0dmFsID0gTVJfR2V0UGh5UGFyYW1zKGluc3RhbmNlLCBsZCwgc3RhcnRfc3RyaXAsCisJCQkJCSByZWZfaW5fc3RhcnRfc3RyaXBlLAogCQkJCQkgJmlvX2luZm8tPnBkQmxvY2ssCiAJCQkJCSAmaW9faW5mby0+ZGV2SGFuZGxlLCBwUkFJRF9Db250ZXh0LAogCQkJCQkgbWFwKTsKQEAgLTQxNSw3ICs0MjQsOCBAQAogCX0gZWxzZSBpZiAoaXNSZWFkKSB7CiAJCXVpbnQgc3RyaXBJZHg7CiAJCWZvciAoc3RyaXBJZHggPSAwOyBzdHJpcElkeCA8IG51bV9zdHJpcHM7IHN0cmlwSWR4KyspIHsKLQkJCWlmICghTVJfR2V0UGh5UGFyYW1zKGxkLCBzdGFydF9zdHJpcCArIHN0cmlwSWR4LAorCQkJaWYgKCFNUl9HZXRQaHlQYXJhbXMoaW5zdGFuY2UsIGxkLAorCQkJCQkgICAgIHN0YXJ0X3N0cmlwICsgc3RyaXBJZHgsCiAJCQkJCSAgICAgcmVmX2luX3N0YXJ0X3N0cmlwZSwKIAkJCQkJICAgICAmaW9faW5mby0+cGRCbG9jaywKIAkJCQkJICAgICAmaW9faW5mby0+ZGV2SGFuZGxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMKaW5kZXggZjEzZTdhYi4uYmZkODdmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5jCkBAIC03NCw3ICs3NCw4IEBACiAJCSAgICAgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpOwogCiB1OAotTVJfQnVpbGRSYWlkQ29udGV4dChzdHJ1Y3QgSU9fUkVRVUVTVF9JTkZPICppb19pbmZvLAorTVJfQnVpbGRSYWlkQ29udGV4dChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCSAgICBzdHJ1Y3QgSU9fUkVRVUVTVF9JTkZPICppb19pbmZvLAogCQkgICAgc3RydWN0IFJBSURfQ09OVEVYVCAqcFJBSURfQ29udGV4dCwKIAkJICAgIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCk7CiB1MTYgTVJfVGFyZ2V0SWRUb0xkR2V0KHUzMiBsZFRndElkLCBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApOwpAQCAtODksNyArOTAsNyBAQAogCQkgICAgICBzdHJ1Y3QgTERfTE9BRF9CQUxBTkNFX0lORk8gKmxiSW5mbyk7CiB1MTYgZ2V0X3VwZGF0ZWRfZGV2X2hhbmRsZShzdHJ1Y3QgTERfTE9BRF9CQUxBTkNFX0lORk8gKmxiSW5mbywKIAkJCSAgIHN0cnVjdCBJT19SRVFVRVNUX0lORk8gKmluX2luZm8pOwotaW50IG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOworaW50IG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIGludCBvY3IpOwogdm9pZCBtZWdhcmFpZF9zYXNfa2lsbF9oYmEoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKIAogZXh0ZXJuIHUzMiBtZWdhc2FzX2RiZ19sdmw7CkBAIC0xMDEsNiArMTAyLDEwIEBACiB2b2lkCiBtZWdhc2FzX2VuYWJsZV9pbnRyX2Z1c2lvbihzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqcmVncykKIHsKKwkvKiBGb3IgVGh1bmRlcmJvbHQvSW52YWRlciBhbHNvIGNsZWFyIGludHIgb24gZW5hYmxlICovCisJd3JpdGVsKH4wLCAmcmVncy0+b3V0Ym91bmRfaW50cl9zdGF0dXMpOworCXJlYWRsKCZyZWdzLT5vdXRib3VuZF9pbnRyX3N0YXR1cyk7CisKIAl3cml0ZWwofk1GSV9GVVNJT05fRU5BQkxFX0lOVEVSUlVQVF9NQVNLLCAmKHJlZ3MpLT5vdXRib3VuZF9pbnRyX21hc2spOwogCiAJLyogRHVtbXkgcmVhZGwgdG8gZm9yY2UgcGNpIGZsdXNoICovCkBAIC0xMzksMTEgKzE0NCw2IEBACiAJaWYgKCEoc3RhdHVzICYgTUZJX0ZVU0lPTl9FTkFCTEVfSU5URVJSVVBUX01BU0spKQogCQlyZXR1cm4gMDsKIAotCS8qCi0JICogZHVtbXkgcmVhZCB0byBmbHVzaCBQQ0kKLQkgKi8KLQlyZWFkbCgmcmVncy0+b3V0Ym91bmRfaW50cl9zdGF0dXMpOwotCiAJcmV0dXJuIDE7CiB9CiAKQEAgLTM4NSw3ICszODUsNyBAQAogaW50CiBtZWdhc2FzX2FsbG9jX2NtZHNfZnVzaW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSkKIHsKLQlpbnQgaSwgajsKKwlpbnQgaSwgaiwgY291bnQ7CiAJdTMyIG1heF9jbWQsIGlvX2ZyYW1lc19zejsKIAlzdHJ1Y3QgZnVzaW9uX2NvbnRleHQgKmZ1c2lvbjsKIAlzdHJ1Y3QgbWVnYXNhc19jbWRfZnVzaW9uICpjbWQ7CkBAIC00MDksOSArNDA5LDEwIEBACiAJCWdvdG8gZmFpbF9yZXFfZGVzYzsKIAl9CiAKKwljb3VudCA9IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPiAwID8gaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA6IDE7CiAJZnVzaW9uLT5yZXBseV9mcmFtZXNfZGVzY19wb29sID0KIAkJcGNpX3Bvb2xfY3JlYXRlKCJyZXBseV9mcmFtZXMgcG9vbCIsIGluc3RhbmNlLT5wZGV2LAotCQkJCWZ1c2lvbi0+cmVwbHlfYWxsb2Nfc3osIDE2LCAwKTsKKwkJCQlmdXNpb24tPnJlcGx5X2FsbG9jX3N6ICogY291bnQsIDE2LCAwKTsKIAogCWlmICghZnVzaW9uLT5yZXBseV9mcmFtZXNfZGVzY19wb29sKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibWVnYXNhczsgQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgpAQCAtNDMwLDcgKzQzMSw3IEBACiAJfQogCiAJcmVwbHlfZGVzYyA9IGZ1c2lvbi0+cmVwbHlfZnJhbWVzX2Rlc2M7Ci0JZm9yIChpID0gMDsgaSA8IGZ1c2lvbi0+cmVwbHlfcV9kZXB0aDsgaSsrLCByZXBseV9kZXNjKyspCisJZm9yIChpID0gMDsgaSA8IGZ1c2lvbi0+cmVwbHlfcV9kZXB0aCAqIGNvdW50OyBpKyssIHJlcGx5X2Rlc2MrKykKIAkJcmVwbHlfZGVzYy0+V29yZHMgPSBVTExPTkdfTUFYOwogCiAJaW9fZnJhbWVzX3N6ID0gZnVzaW9uLT5pb19mcmFtZXNfYWxsb2Nfc3o7CkBAIC01OTAsNyArNTkxLDYgQEAKIAlzdHJ1Y3QgbWVnYXNhc19pbml0X2ZyYW1lICppbml0X2ZyYW1lOwogCXN0cnVjdCBNUEkyX0lPQ19JTklUX1JFUVVFU1QgKklPQ0luaXRNZXNzYWdlOwogCWRtYV9hZGRyX3QJaW9jX2luaXRfaGFuZGxlOwotCXUzMiBjb250ZXh0OwogCXN0cnVjdCBtZWdhc2FzX2NtZCAqY21kOwogCXU4IHJldDsKIAlzdHJ1Y3QgZnVzaW9uX2NvbnRleHQgKmZ1c2lvbjsKQEAgLTYzNCwxNCArNjM0LDEzIEBACiAJCWZ1c2lvbi0+cmVwbHlfZnJhbWVzX2Rlc2NfcGh5czsKIAlJT0NJbml0TWVzc2FnZS0+U3lzdGVtUmVxdWVzdEZyYW1lQmFzZUFkZHJlc3MgPQogCQlmdXNpb24tPmlvX3JlcXVlc3RfZnJhbWVzX3BoeXM7Ci0KKwkvKiBTZXQgdG8gMCBmb3Igbm9uZSBvciAxIE1TSS1YIHZlY3RvcnMgKi8KKwlJT0NJbml0TWVzc2FnZS0+SG9zdE1TSXhWZWN0b3JzID0gKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPiAwID8KKwkJCQkJICAgaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA6IDApOwogCWluaXRfZnJhbWUgPSAoc3RydWN0IG1lZ2FzYXNfaW5pdF9mcmFtZSAqKWNtZC0+ZnJhbWU7CiAJbWVtc2V0KGluaXRfZnJhbWUsIDAsIE1FR0FNRklfRlJBTUVfU0laRSk7CiAKIAlmcmFtZV9oZHIgPSAmY21kLT5mcmFtZS0+aGRyOwotCWNvbnRleHQgPSBpbml0X2ZyYW1lLT5jb250ZXh0OwotCWluaXRfZnJhbWUtPmNvbnRleHQgPSBjb250ZXh0OwotCiAJZnJhbWVfaGRyLT5jbWRfc3RhdHVzID0gMHhGRjsKIAlmcmFtZV9oZHItPmZsYWdzIHw9IE1GSV9GUkFNRV9ET05UX1BPU1RfSU5fUkVQTFlfUVVFVUU7CiAKQEAgLTg4MSw3ICs4ODAsNyBAQAogCXN0cnVjdCBtZWdhc2FzX3JlZ2lzdGVyX3NldCBfX2lvbWVtICpyZWdfc2V0OwogCXN0cnVjdCBmdXNpb25fY29udGV4dCAqZnVzaW9uOwogCXUzMiBtYXhfY21kOwotCWludCBpID0gMDsKKwlpbnQgaSA9IDAsIGNvdW50OwogCiAJZnVzaW9uID0gaW5zdGFuY2UtPmN0cmxfY29udGV4dDsKIApAQCAtOTMzLDcgKzkzMiw5IEBACiAJCShNRUdBX01QSTJfUkFJRF9ERUZBVUxUX0lPX0ZSQU1FX1NJWkUgLQogCQkgc2l6ZW9mKHVuaW9uIE1QSTJfU0dFX0lPX1VOSU9OKSkvMTY7CiAKLQlmdXNpb24tPmxhc3RfcmVwbHlfaWR4ID0gMDsKKwljb3VudCA9IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPiAwID8gaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA6IDE7CisJZm9yIChpID0gMCA7IGkgPCBjb3VudDsgaSsrKQorCQlmdXNpb24tPmxhc3RfcmVwbHlfaWR4W2ldID0gMDsKIAogCS8qCiAJICogQWxsb2NhdGUgbWVtb3J5IGZvciBkZXNjcmlwdG9ycwpAQCAtMTA0Myw3ICsxMDQ0LDkgQEAKIAljYXNlIE1GSV9TVEFUX0RFVklDRV9OT1RfRk9VTkQ6CiAJCWNtZC0+c2NtZC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CiAJCWJyZWFrOwotCisJY2FzZSBNRklfU1RBVF9DT05GSUdfU0VRX01JU01BVENIOgorCQljbWQtPnNjbWQtPnJlc3VsdCA9IERJRF9JTU1fUkVUUlkgPDwgMTY7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBGVyBzdGF0dXMgJSN4XG4iLCBzdGF0dXMpOwogCQljbWQtPnNjbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKQEAgLTEwNjYsMTQgKzEwNjksMTcgQEAKIAkJCXN0cnVjdCBNUEkyNV9JRUVFX1NHRV9DSEFJTjY0ICpzZ2xfcHRyLAogCQkJc3RydWN0IG1lZ2FzYXNfY21kX2Z1c2lvbiAqY21kKQogewotCWludCBpLCBzZ19wcm9jZXNzZWQ7Ci0JaW50IHNnZV9jb3VudCwgc2dlX2lkeDsKKwlpbnQgaSwgc2dfcHJvY2Vzc2VkLCBzZ2VfY291bnQ7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpvc19zZ2w7CiAJc3RydWN0IGZ1c2lvbl9jb250ZXh0ICpmdXNpb247CiAKIAlmdXNpb24gPSBpbnN0YW5jZS0+Y3RybF9jb250ZXh0OwogCi0JY21kLT5pb19yZXF1ZXN0LT5DaGFpbk9mZnNldCA9IDA7CisJaWYgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgeworCQlzdHJ1Y3QgTVBJMjVfSUVFRV9TR0VfQ0hBSU42NCAqc2dsX3B0cl9lbmQgPSBzZ2xfcHRyOworCQlzZ2xfcHRyX2VuZCArPSBmdXNpb24tPm1heF9zZ2VfaW5fbWFpbl9tc2cgLSAxOworCQlzZ2xfcHRyX2VuZC0+RmxhZ3MgPSAwOworCX0KIAogCXNnZV9jb3VudCA9IHNjc2lfZG1hX21hcChzY3ApOwogCkBAIC0xMDgyLDE2ICsxMDg4LDE0IEBACiAJaWYgKHNnZV9jb3VudCA+IGluc3RhbmNlLT5tYXhfbnVtX3NnZSB8fCAhc2dlX2NvdW50KQogCQlyZXR1cm4gc2dlX2NvdW50OwogCi0JaWYgKHNnZV9jb3VudCA+IGZ1c2lvbi0+bWF4X3NnZV9pbl9tYWluX21zZykgewotCQkvKiBPbmUgZWxlbWVudCB0byBzdG9yZSB0aGUgY2hhaW4gaW5mbyAqLwotCQlzZ2VfaWR4ID0gZnVzaW9uLT5tYXhfc2dlX2luX21haW5fbXNnIC0gMTsKLQl9IGVsc2UKLQkJc2dlX2lkeCA9IHNnZV9jb3VudDsKLQogCXNjc2lfZm9yX2VhY2hfc2coc2NwLCBvc19zZ2wsIHNnZV9jb3VudCwgaSkgewogCQlzZ2xfcHRyLT5MZW5ndGggPSBzZ19kbWFfbGVuKG9zX3NnbCk7CiAJCXNnbF9wdHItPkFkZHJlc3MgPSBzZ19kbWFfYWRkcmVzcyhvc19zZ2wpOwogCQlzZ2xfcHRyLT5GbGFncyA9IDA7CisJCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHsKKwkJCWlmIChpID09IHNnZV9jb3VudCAtIDEpCisJCQkJc2dsX3B0ci0+RmxhZ3MgPSBJRUVFX1NHRV9GTEFHU19FTkRfT0ZfTElTVDsKKwkJfQogCQlzZ2xfcHRyKys7CiAKIAkJc2dfcHJvY2Vzc2VkID0gaSArIDE7CkBAIC0xMTAwLDEzICsxMTA0LDMwIEBACiAJCSAgICAoc2dlX2NvdW50ID4gZnVzaW9uLT5tYXhfc2dlX2luX21haW5fbXNnKSkgewogCiAJCQlzdHJ1Y3QgTVBJMjVfSUVFRV9TR0VfQ0hBSU42NCAqc2dfY2hhaW47Ci0JCQljbWQtPmlvX3JlcXVlc3QtPkNoYWluT2Zmc2V0ID0KLQkJCQlmdXNpb24tPmNoYWluX29mZnNldF9pb19yZXF1ZXN0OworCQkJaWYgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCSAgICBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB7CisJCQkJaWYgKChjbWQtPmlvX3JlcXVlc3QtPklvRmxhZ3MgJgorCQkJCU1QSTI1X1NBU19ERVZJQ0UwX0ZMQUdTX0VOQUJMRURfRkFTVF9QQVRIKSAhPQorCQkJCU1QSTI1X1NBU19ERVZJQ0UwX0ZMQUdTX0VOQUJMRURfRkFTVF9QQVRIKQorCQkJCQljbWQtPmlvX3JlcXVlc3QtPkNoYWluT2Zmc2V0ID0KKwkJCQkJCWZ1c2lvbi0+CisJCQkJCQljaGFpbl9vZmZzZXRfaW9fcmVxdWVzdDsKKwkJCQllbHNlCisJCQkJCWNtZC0+aW9fcmVxdWVzdC0+Q2hhaW5PZmZzZXQgPSAwOworCQkJfSBlbHNlCisJCQkJY21kLT5pb19yZXF1ZXN0LT5DaGFpbk9mZnNldCA9CisJCQkJCWZ1c2lvbi0+Y2hhaW5fb2Zmc2V0X2lvX3JlcXVlc3Q7CisKIAkJCXNnX2NoYWluID0gc2dsX3B0cjsKIAkJCS8qIFByZXBhcmUgY2hhaW4gZWxlbWVudCAqLwogCQkJc2dfY2hhaW4tPk5leHRDaGFpbk9mZnNldCA9IDA7Ci0JCQlzZ19jaGFpbi0+RmxhZ3MgPSAoSUVFRV9TR0VfRkxBR1NfQ0hBSU5fRUxFTUVOVCB8Ci0JCQkJCSAgIE1QSTJfSUVFRV9TR0VfRkxBR1NfSU9DUExCTlRBX0FERFIpOworCQkJaWYgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCSAgICBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKQorCQkJCXNnX2NoYWluLT5GbGFncyA9IElFRUVfU0dFX0ZMQUdTX0NIQUlOX0VMRU1FTlQ7CisJCQllbHNlCisJCQkJc2dfY2hhaW4tPkZsYWdzID0KKwkJCQkJKElFRUVfU0dFX0ZMQUdTX0NIQUlOX0VMRU1FTlQgfAorCQkJCQkgTVBJMl9JRUVFX1NHRV9GTEFHU19JT0NQTEJOVEFfQUREUik7CiAJCQlzZ19jaGFpbi0+TGVuZ3RoID0gIChzaXplb2YodW5pb24gTVBJMl9TR0VfSU9fVU5JT04pCiAJCQkJCSAgICAgKihzZ2VfY291bnQgLSBzZ19wcm9jZXNzZWQpKTsKIAkJCXNnX2NoYWluLT5BZGRyZXNzID0gY21kLT5zZ19mcmFtZV9waHlzX2FkZHI7CkBAIC0xMzk5LDExICsxNDIwLDE4IEBACiAJCWlvX3JlcXVlc3QtPlJhaWRDb250ZXh0LnJlZ0xvY2tGbGFncyAgPSAwOwogCQlmcF9wb3NzaWJsZSA9IDA7CiAJfSBlbHNlIHsKLQkJaWYgKE1SX0J1aWxkUmFpZENvbnRleHQoJmlvX2luZm8sICZpb19yZXF1ZXN0LT5SYWlkQ29udGV4dCwKKwkJaWYgKE1SX0J1aWxkUmFpZENvbnRleHQoaW5zdGFuY2UsICZpb19pbmZvLAorCQkJCQkmaW9fcmVxdWVzdC0+UmFpZENvbnRleHQsCiAJCQkJCWxvY2FsX21hcF9wdHIpKQogCQkJZnBfcG9zc2libGUgPSBpb19pbmZvLmZwT2tGb3JJbzsKIAl9CiAKKwkvKiBVc2Ugc21wX3Byb2Nlc3Nvcl9pZCgpIGZvciBub3cgdW50aWwgY21kLT5yZXF1ZXN0LT5jcHUgaXMgQ1BVCisJICAgaWQgYnkgZGVmYXVsdCwgbm90IENQVSBncm91cCBpZCwgb3RoZXJ3aXNlIGFsbCBNU0ktWCBxdWV1ZXMgd29uJ3QKKwkgICBiZSB1dGlsaXplZCAqLworCWNtZC0+cmVxdWVzdF9kZXNjLT5TQ1NJSU8uTVNJeEluZGV4ID0gaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA/CisJCXNtcF9wcm9jZXNzb3JfaWQoKSAlIGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgOiAwOworCiAJaWYgKGZwX3Bvc3NpYmxlKSB7CiAJCW1lZ2FzYXNfc2V0X3BkX2xiYShpb19yZXF1ZXN0LCBzY3AtPmNtZF9sZW4sICZpb19pbmZvLCBzY3AsCiAJCQkJICAgbG9jYWxfbWFwX3B0ciwgc3RhcnRfbGJhX2xvKTsKQEAgLTE0MTIsNiArMTQ0MCwyMCBAQAogCQljbWQtPnJlcXVlc3RfZGVzYy0+U0NTSUlPLlJlcXVlc3RGbGFncyA9CiAJCQkoTVBJMl9SRVFfREVTQ1JJUFRfRkxBR1NfSElHSF9QUklPUklUWQogCQkJIDw8IE1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX1RZUEVfU0hJRlQpOworCQlpZiAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB7CisJCQlpZiAoaW9fcmVxdWVzdC0+UmFpZENvbnRleHQucmVnTG9ja0ZsYWdzID09CisJCQkgICAgUkVHSU9OX1RZUEVfVU5VU0VEKQorCQkJCWNtZC0+cmVxdWVzdF9kZXNjLT5TQ1NJSU8uUmVxdWVzdEZsYWdzID0KKwkJCQkJKE1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX05PX0xPQ0sgPDwKKwkJCQkJTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfVFlQRV9TSElGVCk7CisJCQlpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC5UeXBlID0gTVBJMl9UWVBFX0NVREE7CisJCQlpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC5uc2VnID0gMHgxOworCQkJaW9fcmVxdWVzdC0+SW9GbGFncyB8PQorCQkJICBNUEkyNV9TQVNfREVWSUNFMF9GTEFHU19FTkFCTEVEX0ZBU1RfUEFUSDsKKwkJCWlvX3JlcXVlc3QtPlJhaWRDb250ZXh0LnJlZ0xvY2tGbGFncyB8PQorCQkJICAoTVJfUkxfRkxBR1NfR1JBTlRfREVTVElOQVRJT05fQ1VEQSB8CisJCQkgICBNUl9STF9GTEFHU19TRVFfTlVNX0VOQUJMRSk7CisJCX0KIAkJaWYgKChmdXNpb24tPmxvYWRfYmFsYW5jZV9pbmZvW2RldmljZV9pZF0ubG9hZEJhbGFuY2VGbGFnKSAmJgogCQkgICAgKGlvX2luZm8uaXNSZWFkKSkgewogCQkJaW9faW5mby5kZXZIYW5kbGUgPQpAQCAtMTQyNiwxMSArMTQ2OCwyMyBAQAogCX0gZWxzZSB7CiAJCWlvX3JlcXVlc3QtPlJhaWRDb250ZXh0LnRpbWVvdXRWYWx1ZSA9CiAJCQlsb2NhbF9tYXBfcHRyLT5yYWlkTWFwLmZwUGRJb1RpbWVvdXRTZWM7Ci0JCWlvX3JlcXVlc3QtPkZ1bmN0aW9uID0gTUVHQVNBU19NUEkyX0ZVTkNUSU9OX0xEX0lPX1JFUVVFU1Q7Ci0JCWlvX3JlcXVlc3QtPkRldkhhbmRsZSA9IGRldmljZV9pZDsKIAkJY21kLT5yZXF1ZXN0X2Rlc2MtPlNDU0lJTy5SZXF1ZXN0RmxhZ3MgPQogCQkJKE1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX0xEX0lPCiAJCQkgPDwgTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfVFlQRV9TSElGVCk7CisJCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHsKKwkJCWlmIChpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC5yZWdMb2NrRmxhZ3MgPT0KKwkJCSAgICBSRUdJT05fVFlQRV9VTlVTRUQpCisJCQkJY21kLT5yZXF1ZXN0X2Rlc2MtPlNDU0lJTy5SZXF1ZXN0RmxhZ3MgPQorCQkJCQkoTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfTk9fTE9DSyA8PAorCQkJCQlNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19UWVBFX1NISUZUKTsKKwkJCWlvX3JlcXVlc3QtPlJhaWRDb250ZXh0LlR5cGUgPSBNUEkyX1RZUEVfQ1VEQTsKKwkJCWlvX3JlcXVlc3QtPlJhaWRDb250ZXh0LnJlZ0xvY2tGbGFncyB8PQorCQkJCShNUl9STF9GTEFHU19HUkFOVF9ERVNUSU5BVElPTl9DUFUwIHwKKwkJCQkgTVJfUkxfRkxBR1NfU0VRX05VTV9FTkFCTEUpOworCQkJaW9fcmVxdWVzdC0+UmFpZENvbnRleHQubnNlZyA9IDB4MTsKKwkJfQorCQlpb19yZXF1ZXN0LT5GdW5jdGlvbiA9IE1FR0FTQVNfTVBJMl9GVU5DVElPTl9MRF9JT19SRVFVRVNUOworCQlpb19yZXF1ZXN0LT5EZXZIYW5kbGUgPSBkZXZpY2VfaWQ7CiAJfSAvKiBOb3QgRlAgKi8KIH0KIApAQCAtMTUxMyw4ICsxNTY3LDEwIEBACiAJaW9fcmVxdWVzdC0+RUVEUEZsYWdzID0gMDsKIAlpb19yZXF1ZXN0LT5Db250cm9sID0gMDsKIAlpb19yZXF1ZXN0LT5FRURQQmxvY2tTaXplID0gMDsKLQlpb19yZXF1ZXN0LT5Jb0ZsYWdzID0gMDsKKwlpb19yZXF1ZXN0LT5DaGFpbk9mZnNldCA9IDA7CiAJaW9fcmVxdWVzdC0+UmFpZENvbnRleHQuUkFJREZsYWdzID0gMDsKKwlpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC5UeXBlID0gMDsKKwlpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC5uc2VnID0gMDsKIAogCW1lbWNweShpb19yZXF1ZXN0LT5DREIuQ0RCMzIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKIAkvKgpAQCAtMTYxMiw3ICsxNjY4LDYgQEAKIAogCXJlcV9kZXNjLT5Xb3JkcyA9IDA7CiAJY21kLT5yZXF1ZXN0X2Rlc2MgPSByZXFfZGVzYzsKLQljbWQtPnJlcXVlc3RfZGVzYy0+V29yZHMgPSAwOwogCiAJaWYgKG1lZ2FzYXNfYnVpbGRfaW9fZnVzaW9uKGluc3RhbmNlLCBzY21kLCBjbWQpKSB7CiAJCW1lZ2FzYXNfcmV0dXJuX2NtZF9mdXNpb24oaW5zdGFuY2UsIGNtZCk7CkBAIC0xNjQ3LDcgKzE3MDIsNyBAQAogICogQ29tcGxldGVzIGFsbCBjb21tYW5kcyB0aGF0IGlzIGluIHJlcGx5IGRlc2NyaXB0b3IgcXVldWUKICAqLwogaW50Ci1jb21wbGV0ZV9jbWRfZnVzaW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSkKK2NvbXBsZXRlX2NtZF9mdXNpb24oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCB1MzIgTVNJeEluZGV4KQogewogCXVuaW9uIE1QSTJfUkVQTFlfREVTQ1JJUFRPUlNfVU5JT04gKmRlc2M7CiAJc3RydWN0IE1QSTJfU0NTSV9JT19TVUNDRVNTX1JFUExZX0RFU0NSSVBUT1IgKnJlcGx5X2Rlc2M7CkBAIC0xNjY3LDcgKzE3MjIsOSBAQAogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKIAlkZXNjID0gZnVzaW9uLT5yZXBseV9mcmFtZXNfZGVzYzsKLQlkZXNjICs9IGZ1c2lvbi0+bGFzdF9yZXBseV9pZHg7CisJZGVzYyArPSAoKE1TSXhJbmRleCAqIGZ1c2lvbi0+cmVwbHlfYWxsb2Nfc3opLworCQkgc2l6ZW9mKHVuaW9uIE1QSTJfUkVQTFlfREVTQ1JJUFRPUlNfVU5JT04pKSArCisJCWZ1c2lvbi0+bGFzdF9yZXBseV9pZHhbTVNJeEluZGV4XTsKIAogCXJlcGx5X2Rlc2MgPSAoc3RydWN0IE1QSTJfU0NTSV9JT19TVUNDRVNTX1JFUExZX0RFU0NSSVBUT1IgKilkZXNjOwogCkBAIC0xNzQwLDE2ICsxNzk3LDE5IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWZ1c2lvbi0+bGFzdF9yZXBseV9pZHgrKzsKLQkJaWYgKGZ1c2lvbi0+bGFzdF9yZXBseV9pZHggPj0gZnVzaW9uLT5yZXBseV9xX2RlcHRoKQotCQkJZnVzaW9uLT5sYXN0X3JlcGx5X2lkeCA9IDA7CisJCWZ1c2lvbi0+bGFzdF9yZXBseV9pZHhbTVNJeEluZGV4XSsrOworCQlpZiAoZnVzaW9uLT5sYXN0X3JlcGx5X2lkeFtNU0l4SW5kZXhdID49CisJCSAgICBmdXNpb24tPnJlcGx5X3FfZGVwdGgpCisJCQlmdXNpb24tPmxhc3RfcmVwbHlfaWR4W01TSXhJbmRleF0gPSAwOwogCiAJCWRlc2MtPldvcmRzID0gVUxMT05HX01BWDsKIAkJbnVtX2NvbXBsZXRlZCsrOwogCiAJCS8qIEdldCB0aGUgbmV4dCByZXBseSBkZXNjcmlwdG9yICovCi0JCWlmICghZnVzaW9uLT5sYXN0X3JlcGx5X2lkeCkKLQkJCWRlc2MgPSBmdXNpb24tPnJlcGx5X2ZyYW1lc19kZXNjOworCQlpZiAoIWZ1c2lvbi0+bGFzdF9yZXBseV9pZHhbTVNJeEluZGV4XSkKKwkJCWRlc2MgPSBmdXNpb24tPnJlcGx5X2ZyYW1lc19kZXNjICsKKwkJCQkoKE1TSXhJbmRleCAqIGZ1c2lvbi0+cmVwbHlfYWxsb2Nfc3opLworCQkJCSBzaXplb2YodW5pb24gTVBJMl9SRVBMWV9ERVNDUklQVE9SU19VTklPTikpOwogCQllbHNlCiAJCQlkZXNjKys7CiAKQEAgLTE3NjksNyArMTgyOSw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAogCXdtYigpOwotCXdyaXRlbChmdXNpb24tPmxhc3RfcmVwbHlfaWR4LAorCXdyaXRlbCgoTVNJeEluZGV4IDw8IDI0KSB8IGZ1c2lvbi0+bGFzdF9yZXBseV9pZHhbTVNJeEluZGV4XSwKIAkgICAgICAgJmluc3RhbmNlLT5yZWdfc2V0LT5yZXBseV9wb3N0X2hvc3RfaW5kZXgpOwogCW1lZ2FzYXNfY2hlY2tfYW5kX3Jlc3RvcmVfcXVldWVfZGVwdGgoaW5zdGFuY2UpOwogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTE3ODcsNiArMTg0Nyw5IEBACiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlID0KIAkJKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICopaW5zdGFuY2VfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjb3VudCwgTVNJeEluZGV4OworCisJY291bnQgPSBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzID4gMCA/IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgOiAxOwogCiAJLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGRlY2xhcmVkIGFkYXB0ZXIgZGVhZCwgZG9ub3QgY29tcGxldGUgY21kcyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+aGJhX2xvY2ssIGZsYWdzKTsKQEAgLTE3OTcsNyArMTg2MCw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPmhiYV9sb2NrLCBmbGFncyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPmNvbXBsZXRpb25fbG9jaywgZmxhZ3MpOwotCWNvbXBsZXRlX2NtZF9mdXNpb24oaW5zdGFuY2UpOworCWZvciAoTVNJeEluZGV4ID0gMCA7IE1TSXhJbmRleCA8IGNvdW50OyBNU0l4SW5kZXgrKykKKwkJY29tcGxldGVfY21kX2Z1c2lvbihpbnN0YW5jZSwgTVNJeEluZGV4KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+Y29tcGxldGlvbl9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTE4MDYsMjAgKzE4NzAsMjQgQEAKICAqLwogaXJxcmV0dXJuX3QgbWVnYXNhc19pc3JfZnVzaW9uKGludCBpcnEsIHZvaWQgKmRldnApCiB7Ci0Jc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlID0gKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICopZGV2cDsKKwlzdHJ1Y3QgbWVnYXNhc19pcnFfY29udGV4dCAqaXJxX2NvbnRleHQgPSBkZXZwOworCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSA9IGlycV9jb250ZXh0LT5pbnN0YW5jZTsKIAl1MzIgbWZpU3RhdHVzLCBmd19zdGF0ZTsKIAotCWlmICghaW5zdGFuY2UtPm1zaV9mbGFnKSB7CisJaWYgKCFpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKSB7CiAJCW1maVN0YXR1cyA9IGluc3RhbmNlLT5pbnN0YW5jZXQtPmNsZWFyX2ludHIoaW5zdGFuY2UtPnJlZ19zZXQpOwogCQlpZiAoIW1maVN0YXR1cykKIAkJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKIAkvKiBJZiB3ZSBhcmUgcmVzZXR0aW5nLCBiYWlsICovCi0JaWYgKHRlc3RfYml0KE1FR0FTQVNfRlVTSU9OX0lOX1JFU0VULCAmaW5zdGFuY2UtPnJlc2V0X2ZsYWdzKSkKKwlpZiAodGVzdF9iaXQoTUVHQVNBU19GVVNJT05fSU5fUkVTRVQsICZpbnN0YW5jZS0+cmVzZXRfZmxhZ3MpKSB7CisJCWluc3RhbmNlLT5pbnN0YW5jZXQtPmNsZWFyX2ludHIoaW5zdGFuY2UtPnJlZ19zZXQpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQogCi0JaWYgKCFjb21wbGV0ZV9jbWRfZnVzaW9uKGluc3RhbmNlKSkgeworCWlmICghY29tcGxldGVfY21kX2Z1c2lvbihpbnN0YW5jZSwgaXJxX2NvbnRleHQtPk1TSXhJbmRleCkpIHsKKwkJaW5zdGFuY2UtPmluc3RhbmNldC0+Y2xlYXJfaW50cihpbnN0YW5jZS0+cmVnX3NldCk7CiAJCS8qIElmIHdlIGRpZG4ndCBjb21wbGV0ZSBhbnkgY29tbWFuZHMsIGNoZWNrIGZvciBGVyBmYXVsdCAqLwogCQlmd19zdGF0ZSA9IGluc3RhbmNlLT5pbnN0YW5jZXQtPnJlYWRfZndfc3RhdHVzX3JlZygKIAkJCWluc3RhbmNlLT5yZWdfc2V0KSAmIE1GSV9TVEFURV9NQVNLOwpAQCAtMTg2Niw2ICsxOTM0LDE0IEBACiAKIAlmdXNpb24gPSBpbnN0YW5jZS0+Y3RybF9jb250ZXh0OwogCWlvX3JlcSA9IGNtZC0+aW9fcmVxdWVzdDsKKworCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHsKKwkJc3RydWN0IE1QSTI1X0lFRUVfU0dFX0NIQUlONjQgKnNnbF9wdHJfZW5kID0KKwkJCShzdHJ1Y3QgTVBJMjVfSUVFRV9TR0VfQ0hBSU42NCAqKSZpb19yZXEtPlNHTDsKKwkJc2dsX3B0cl9lbmQgKz0gZnVzaW9uLT5tYXhfc2dlX2luX21haW5fbXNnIC0gMTsKKwkJc2dsX3B0cl9lbmQtPkZsYWdzID0gMDsKKwl9CisKIAltcGkyNV9pZWVlX2NoYWluID0KIAkgIChzdHJ1Y3QgTVBJMjVfSUVFRV9TR0VfQ0hBSU42NCAqKSZpb19yZXEtPlNHTC5JZWVlQ2hhaW47CiAKQEAgLTE5MjgsMTUgKzIwMDQsMTIgQEAKIAkJCSAgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpCiB7CiAJdW5pb24gTUVHQVNBU19SRVFVRVNUX0RFU0NSSVBUT1JfVU5JT04gKnJlcV9kZXNjOwotCXVuaW9uIGRlc2NfdmFsdWUgZF92YWw7CiAKIAlyZXFfZGVzYyA9IGJ1aWxkX21wdF9jbWQoaW5zdGFuY2UsIGNtZCk7CiAJaWYgKCFyZXFfZGVzYykgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGlzc3VlIE1GSSBwYXNzIHRocnUgY21kXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlkX3ZhbC53b3JkID0gcmVxX2Rlc2MtPldvcmRzOwotCiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZmlyZV9jbWQoaW5zdGFuY2UsIHJlcV9kZXNjLT51LmxvdywKIAkJCQkgICAgICByZXFfZGVzYy0+dS5oaWdoLCBpbnN0YW5jZS0+cmVnX3NldCk7CiB9CkBAIC0yMDI5LDE0ICsyMTAyLDE2IEBACiAKIHZvaWQgIG1lZ2FzYXNfcmVzZXRfcmVwbHlfZGVzYyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpCiB7Ci0JaW50IGk7CisJaW50IGksIGNvdW50OwogCXN0cnVjdCBmdXNpb25fY29udGV4dCAqZnVzaW9uOwogCXVuaW9uIE1QSTJfUkVQTFlfREVTQ1JJUFRPUlNfVU5JT04gKnJlcGx5X2Rlc2M7CiAKIAlmdXNpb24gPSBpbnN0YW5jZS0+Y3RybF9jb250ZXh0OwotCWZ1c2lvbi0+bGFzdF9yZXBseV9pZHggPSAwOworCWNvdW50ID0gaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA+IDAgPyBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzIDogMTsKKwlmb3IgKGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKQorCQlmdXNpb24tPmxhc3RfcmVwbHlfaWR4W2ldID0gMDsKIAlyZXBseV9kZXNjID0gZnVzaW9uLT5yZXBseV9mcmFtZXNfZGVzYzsKLQlmb3IgKGkgPSAwIDsgaSA8IGZ1c2lvbi0+cmVwbHlfcV9kZXB0aDsgaSsrLCByZXBseV9kZXNjKyspCisJZm9yIChpID0gMCA7IGkgPCBmdXNpb24tPnJlcGx5X3FfZGVwdGggKiBjb3VudDsgaSsrLCByZXBseV9kZXNjKyspCiAJCXJlcGx5X2Rlc2MtPldvcmRzID0gVUxMT05HX01BWDsKIH0KIApAQCAtMjA1Nyw4ICsyMTMyLDcgQEAKIAlpZiAoaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID09IE1FR0FTQVNfSFdfQ1JJVElDQUxfRVJST1IpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBIYXJkd2FyZSBjcml0aWNhbCBlcnJvciwgIgogCQkgICAgICAgInJldHVybmluZyBGQUlMRUQuXG4iKTsKLQkJcmV0dmFsID0gRkFJTEVEOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKIAltdXRleF9sb2NrKCZpbnN0YW5jZS0+cmVzZXRfbXV0ZXgpOwpAQCAtMjE3Myw3ICsyMjQ3LDcgQEAKIAkJCX0KIAogCQkJLyogV2FpdCBmb3IgRlcgdG8gYmVjb21lIHJlYWR5ICovCi0JCQlpZiAobWVnYXNhc190cmFuc2l0aW9uX3RvX3JlYWR5KGluc3RhbmNlKSkgeworCQkJaWYgKG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShpbnN0YW5jZSwgMSkpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IEZhaWxlZCB0byAiCiAJCQkJICAgICAgICJ0cmFuc2l0aW9uIGNvbnRyb2xsZXIgdG8gcmVhZHkuXG4iKTsKIAkJCQljb250aW51ZTsKQEAgLTIxODYsNiArMjI2MCw4IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAKKwkJCWNsZWFyX2JpdChNRUdBU0FTX0ZVU0lPTl9JTl9SRVNFVCwKKwkJCQkgICZpbnN0YW5jZS0+cmVzZXRfZmxhZ3MpOwogCQkJaW5zdGFuY2UtPmluc3RhbmNldC0+ZW5hYmxlX2ludHIoaW5zdGFuY2UtPnJlZ19zZXQpOwogCQkJaW5zdGFuY2UtPmFkcHJlY292ZXJ5ID0gTUVHQVNBU19IQkFfT1BFUkFUSU9OQUw7CiAKQEAgLTIyNDcsNiArMjMyMyw3IEBACiAJCW1lZ2FyYWlkX3Nhc19raWxsX2hiYShpbnN0YW5jZSk7CiAJCXJldHZhbCA9IEZBSUxFRDsKIAl9IGVsc2UgeworCQljbGVhcl9iaXQoTUVHQVNBU19GVVNJT05fSU5fUkVTRVQsICZpbnN0YW5jZS0+cmVzZXRfZmxhZ3MpOwogCQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5lbmFibGVfaW50cihpbnN0YW5jZS0+cmVnX3NldCk7CiAJCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfSEJBX09QRVJBVElPTkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5oCmluZGV4IDgyYjU3N2EuLjA4OGM5ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uaApAQCAtNDMsNiArNDMsMTUgQEAKICNkZWZpbmUgSE9TVF9ESUFHX1dSSVRFX0VOQUJMRQkJCSAgICAweDgwCiAjZGVmaW5lIEhPU1RfRElBR19SRVNFVF9BREFQVEVSCQkJICAgIDB4NAogI2RlZmluZSBNRUdBU0FTX0ZVU0lPTl9NQVhfUkVTRVRfVFJJRVMJCSAgICAzCisjZGVmaW5lIE1BWF9NU0lYX1FVRVVFU19GVVNJT04JCQkgICAgMTYKKworLyogSW52YWRlciBkZWZpbmVzICovCisjZGVmaW5lIE1QSTJfVFlQRV9DVURBCQkJCSAgICAweDIKKyNkZWZpbmUgTVBJMjVfU0FTX0RFVklDRTBfRkxBR1NfRU5BQkxFRF9GQVNUX1BBVEggICAweDQwMDAKKyNkZWZpbmUJTVJfUkxfRkxBR1NfR1JBTlRfREVTVElOQVRJT05fQ1BVMAkgICAgMHgwMAorI2RlZmluZQlNUl9STF9GTEFHU19HUkFOVF9ERVNUSU5BVElPTl9DUFUxCSAgICAweDEwCisjZGVmaW5lCU1SX1JMX0ZMQUdTX0dSQU5UX0RFU1RJTkFUSU9OX0NVREEJICAgIDB4ODAKKyNkZWZpbmUgTVJfUkxfRkxBR1NfU0VRX05VTV9FTkFCTEUJCSAgICAweDgKIAogLyogVDEwIFBJIGRlZmluZXMgKi8KICNkZWZpbmUgTVJfUFJPVF9JTkZPX1RZUEVfQ09OVFJPTExFUiAgICAgICAgICAgICAgICAweDgKQEAgLTcwLDcgKzc5LDcgQEAKICAqLwogI2RlZmluZSBNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19MRF9JTyAgICAgICAgICAgMHg3CiAjZGVmaW5lIE1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX01GQSAgICAgICAgICAgICAweDEKLQorI2RlZmluZSBNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19OT19MT0NLCSAgIDB4MgogI2RlZmluZSBNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19UWVBFX1NISUZUICAgICAgMQogCiAjZGVmaW5lIE1FR0FTQVNfRlBfQ01EX0xFTgkxNgpAQCAtODIsNyArOTEsOSBAQAogICovCiAKIHN0cnVjdCBSQUlEX0NPTlRFWFQgewotCXUxNiAgICAgcmVzdmQwOworCXU4CVR5cGU6NDsKKwl1OAluc2VnOjQ7CisJdTgJcmVzdmQwOwogCXUxNiAgICAgdGltZW91dFZhbHVlOwogCXU4ICAgICAgcmVnTG9ja0ZsYWdzOwogCXU4ICAgICAgcmVzdmQxOwpAQCAtNTI3LDcgKzUzOCw3IEBACiAJdTggICAgICBsZFN0YXRlOwogCXU4ICAgICAgcmVnVHlwZVJlcU9uV3JpdGU7CiAJdTggICAgICBtb2RGYWN0b3I7Ci0JdTggICAgICByZXNlcnZlZDJbMV07CisJdTgJcmVnVHlwZVJlcU9uUmVhZDsKIAl1MTYgICAgIHNlcU51bTsKIAogCXN0cnVjdCB7CkBAIC02NjMsNyArNjc0LDcgQEAKIAl1bmlvbiBNUEkyX1JFUExZX0RFU0NSSVBUT1JTX1VOSU9OICpyZXBseV9mcmFtZXNfZGVzYzsKIAlzdHJ1Y3QgZG1hX3Bvb2wgKnJlcGx5X2ZyYW1lc19kZXNjX3Bvb2w7CiAKLQl1MTYgbGFzdF9yZXBseV9pZHg7CisJdTE2IGxhc3RfcmVwbHlfaWR4W01BWF9NU0lYX1FVRVVFU19GVVNJT05dOwogCiAJdTMyIHJlcGx5X3FfZGVwdGg7CiAJdTMyIHJlcXVlc3RfYWxsb2Nfc3o7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMi5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTIuaAppbmRleCAzMTA1ZDVlLi44ZGMxYjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMi5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogIENvcHlyaWdodCAoYykgMjAwMC0yMDEwIExTSSBDb3Jwb3JhdGlvbi4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBMU0kgQ29ycG9yYXRpb24uCiAgKgogICoKICAqICAgICAgICAgICBOYW1lOiAgbXBpMi5oCkBAIC04LDcgKzgsNyBAQAogICogICAgICAgICAgICAgICAgICBzY2F0dGVyL2dhdGhlciBmb3JtYXRzLgogICogIENyZWF0aW9uIERhdGU6ICBKdW5lIDIxLCAyMDA2CiAgKgotICogIG1waTIuaCBWZXJzaW9uOiAgMDIuMDAuMTgKKyAqICBtcGkyLmggVmVyc2lvbjogIDAyLjAwLjIwCiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtNjYsNiArNjYsOSBAQAogICogIDA4LTExLTEwICAwMi4wMC4xNyAgQnVtcGVkIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVC4KICAqICAxMS0xMC0xMCAgMDIuMDAuMTggIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUEkyX0lFRUVfU0dFX0ZMQUdTX1NZU1RFTVBMQkNQSV9BRERSIGRlZmluZS4KKyAqICAwMi0yMy0xMSAgMDIuMDAuMTkgIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUEkyX0ZVTkNUSU9OX1NFTkRfSE9TVF9NRVNTQUdFLgorICogIDAzLTA5LTExICAwMi4wMC4yMCAgQnVtcGVkIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTkxLDcgKzk0LDcgQEAKICNkZWZpbmUgTVBJMl9WRVJTSU9OXzAyXzAwICAgICAgICAgICAgICAgICAgKDB4MDIwMCkKIAogLyogdmVyc2lvbmluZyBmb3IgdGhpcyBNUEkgaGVhZGVyIHNldCAqLwotI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQgICAgICAgICAgICAoMHgxMikKKyNkZWZpbmUgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklUICAgICAgICAgICAgKDB4MTQpCiAjZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fREVWICAgICAgICAgICAgICgweDAwKQogI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVRfTUFTSyAgICAgICAoMHhGRjAwKQogI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVRfU0hJRlQgICAgICAoOCkKQEAgLTUxNSw2ICs1MTgsOCBAQAogI2RlZmluZSBNUEkyX0ZVTkNUSU9OX0hPU1RfQkFTRURfRElTQ09WRVJZX0FDVElPTiAgICgweDJGKQogLyogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sICovCiAjZGVmaW5lIE1QSTJfRlVOQ1RJT05fUFdSX01HTVRfQ09OVFJPTCAgICAgICAgICAgICAgKDB4MzApCisvKiBTZW5kIEhvc3QgTWVzc2FnZSAqLworI2RlZmluZSBNUEkyX0ZVTkNUSU9OX1NFTkRfSE9TVF9NRVNTQUdFICAgICAgICAgICAgICgweDMxKQogLyogYmVnaW5uaW5nIG9mIHByb2R1Y3Qtc3BlY2lmaWMgcmFuZ2UgKi8KICNkZWZpbmUgTVBJMl9GVU5DVElPTl9NSU5fUFJPRFVDVF9TUEVDSUZJQyAgICAgICAgICAoMHhGMCkKIC8qIGVuZCBvZiBwcm9kdWN0LXNwZWNpZmljIHJhbmdlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9jbmZnLmggYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9jbmZnLmgKaW5kZXggNjE0NzVhNi4uY2ZkOTViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2NuZmcuaApAQCAtMSwxMiArMSwxMiBAQAogLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMCBMU0kgQ29ycG9yYXRpb24uCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgTFNJIENvcnBvcmF0aW9uLgogICoKICAqCiAgKiAgICAgICAgICAgTmFtZTogIG1waTJfY25mZy5oCiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGFuZCBwYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBOb3ZlbWJlciAxMCwgMjAwNgogICoKLSAqICAgIG1waTJfY25mZy5oIFZlcnNpb246ICAwMi4wMC4xNworICogICAgbXBpMl9jbmZnLmggVmVyc2lvbjogIDAyLjAwLjE5CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtMTM0LDYgKzEzNCwxMiBAQAogICogICAgICAgICAgICAgICAgICAgICAgdG8gTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzcuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUEkyX0NPTkZJR19FWFRQQUdFVFlQRV9FWFRfTUFOVUZBQ1RVUklORyBkZWZpbmUKICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBNUEkyX0NPTkZJR19QQUdFX0VYVF9NQU5fUFMgc3RydWN0dXJlLgorICogIDAyLTIzLTExICAwMi4wMC4xOCAgQWRkZWQgUHJveHlWRl9JRCBmaWVsZCB0byBNUEkyX0NPTkZJR19SRVFVRVNULgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgSU8gVW5pdCBQYWdlIDgsIElPIFVuaXQgUGFnZSA5LAorICogICAgICAgICAgICAgICAgICAgICAgYW5kIElPIFVuaXQgUGFnZSAxMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNBU05vdGlmeVByaW1pdGl2ZU1hc2tzIGZpZWxkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBNUEkyX0NPTkZJR19QQUdFX0lPQ183LgorICogIDAzLTA5LTExICAwMi4wMC4xOSAgRml4ZWQgSU8gVW5pdCBQYWdlIDEwICh0byBtYXRjaCB0aGUgc3BlYykuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC0zMjksNyArMzM1LDkgQEAKICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWUF9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZGX0lEOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDA5ICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDB4MEEgKi8KLSAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMHgwQyAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAweDBDICovCisJVTggICAgICAgICAgICAgICAgICAgICAgUHJveHlWRl9JRDsgICAgICAgICAgICAgICAgIC8qIDB4MEQgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgLyogMHgwRSAqLwogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAvKiAweDEwICovCiAgICAgTVBJMl9DT05GSUdfUEFHRV9IRUFERVIgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTQgKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQYWdlQWRkcmVzczsgICAgICAgICAgICAgICAgLyogMHgxOCAqLwpAQCAtOTE1LDYgKzkyMywxMjAgQEAKICNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19CT0FSRF9URU1QX0ZBSFJFTkhFSVQgICAgICAoMHgwMSkKICNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFN19CT0FSRF9URU1QX0NFTFNJVVMgICAgICAgICAoMHgwMikKIAorLyogSU8gVW5pdCBQYWdlIDggKi8KKworI2RlZmluZSBNUEkyX0lPVU5JVDhfTlVNX1RIUkVTSE9MRFMgICAgICg0KQorCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9JT1VOSVQ4X1NFTlNPUiB7CisJVTE2ICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgLyogMHgwMiAqLworCVUxNgorCQlUaHJlc2hvbGRbTVBJMl9JT1VOSVQ4X05VTV9USFJFU0hPTERTXTsgLyogMHgwNCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAvKiAweDBDICovCisJVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgIC8qIDB4MTAgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgLyogMHgxNCAqLworfSBNUEkyX0lPVU5JVDhfU0VOU09SLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfSU9VTklUOF9TRU5TT1IsCitNcGkySU9Vbml0OFNlbnNvcl90LCBNUEkyX1BPSU5URVIgcE1waTJJT1VuaXQ4U2Vuc29yX3Q7CisKKy8qIGRlZmluZXMgZm9yIElPIFVuaXQgUGFnZSA4IFNlbnNvciBGbGFncyBmaWVsZCAqLworI2RlZmluZSBNUEkyX0lPVU5JVDhfU0VOU09SX0ZMQUdTX1QzX0VOQUJMRSAgICAgICAgICgweDAwMDgpCisjZGVmaW5lIE1QSTJfSU9VTklUOF9TRU5TT1JfRkxBR1NfVDJfRU5BQkxFICAgICAgICAgKDB4MDAwNCkKKyNkZWZpbmUgTVBJMl9JT1VOSVQ4X1NFTlNPUl9GTEFHU19UMV9FTkFCTEUgICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBNUEkyX0lPVU5JVDhfU0VOU09SX0ZMQUdTX1QwX0VOQUJMRSAgICAgICAgICgweDAwMDEpCisKKy8qCisgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bworICogb25lIGFuZCBjaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgZm9yIE51bVNlbnNvcnMgYXQgcnVudGltZS4KKyAqLworI2lmbmRlZiBNUEkyX0lPVU5JVFBBR0U4X1NFTlNPUl9FTlRSSUVTCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRThfU0VOU09SX0VOVFJJRVMgICAgICgxKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfOCB7CisJTVBJMl9DT05GSUdfUEFHRV9IRUFERVIgSGVhZGVyOyAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgLyogMHgwNCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAvKiAweDA4ICovCisJVTggICAgICAgICAgICAgICAgICAgICAgTnVtU2Vuc29yczsgICAgICAgICAgIC8qIDB4MEMgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBQb2xsaW5nSW50ZXJ2YWw7ICAgICAgLyogMHgwRCAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAvKiAweDBFICovCisJTVBJMl9JT1VOSVQ4X1NFTlNPUgorCQkJU2Vuc29yW01QSTJfSU9VTklUUEFHRThfU0VOU09SX0VOVFJJRVNdOy8qIDB4MTAgKi8KK30gTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzgsIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzgsCitNcGkySU9Vbml0UGFnZThfdCwgTVBJMl9QT0lOVEVSIHBNcGkySU9Vbml0UGFnZThfdDsKKworI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U4X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKworCisvKiBJTyBVbml0IFBhZ2UgOSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9JT1VOSVQ5X1NFTlNPUiB7CisJVTE2ICAgICAgICAgICAgICAgICAgICAgQ3VycmVudFRlbXBlcmF0dXJlOyAgICAgLyogMHgwMCAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAvKiAweDA0ICovCisJVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgLyogMHgwNSAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgIC8qIDB4MDYgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAvKiAweDA4ICovCisJVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ1OyAgICAgICAgICAgICAgLyogMHgwQyAqLworfSBNUEkyX0lPVU5JVDlfU0VOU09SLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfSU9VTklUOV9TRU5TT1IsCitNcGkySU9Vbml0OVNlbnNvcl90LCBNUEkyX1BPSU5URVIgcE1waTJJT1VuaXQ5U2Vuc29yX3Q7CisKKy8qIGRlZmluZXMgZm9yIElPIFVuaXQgUGFnZSA5IFNlbnNvciBGbGFncyBmaWVsZCAqLworI2RlZmluZSBNUEkyX0lPVU5JVDlfU0VOU09SX0ZMQUdTX1RFTVBfVkFMSUQgICAgICAgICgweDAxKQorCisvKgorICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgdGhlIHZhbHVlIHJldHVybmVkIGZvciBOdW1TZW5zb3JzIGF0IHJ1bnRpbWUuCisgKi8KKyNpZm5kZWYgTVBJMl9JT1VOSVRQQUdFOV9TRU5TT1JfRU5UUklFUworI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U5X1NFTlNPUl9FTlRSSUVTICAgICAoMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzkgeworCU1QSTJfQ09ORklHX1BBR0VfSEVBREVSIEhlYWRlcjsgICAgICAgICAgICAgICAgLyogMHgwMCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgLyogMHgwNCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgLyogMHgwOCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIE51bVNlbnNvcnM7ICAgICAgICAgICAgLyogMHgwQyAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgICAgLyogMHgwRCAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgLyogMHgwRSAqLworCU1QSTJfSU9VTklUOV9TRU5TT1IKKwkJCVNlbnNvcltNUEkyX0lPVU5JVFBBR0U5X1NFTlNPUl9FTlRSSUVTXTsvKiAweDEwICovCit9IE1QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF85LCBNUEkyX1BPSU5URVIgUFRSX01QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF85LAorTXBpMklPVW5pdFBhZ2U5X3QsIE1QSTJfUE9JTlRFUiBwTXBpMklPVW5pdFBhZ2U5X3Q7CisKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFOV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKworLyogSU8gVW5pdCBQYWdlIDEwICovCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0lPVU5JVDEwX0ZVTkNUSU9OIHsKKwlVOCAgICAgICAgICAgICAgICAgICAgICBDcmVkaXRQZXJjZW50OyAgICAgIC8qIDB4MDAgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDB4MDEgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDB4MDIgKi8KK30gTVBJMl9JT1VOSVQxMF9GVU5DVElPTiwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0lPVU5JVDEwX0ZVTkNUSU9OLAorTXBpMklPVW5pdDEwRnVuY3Rpb25fdCwgTVBJMl9QT0lOVEVSIHBNcGkySU9Vbml0MTBGdW5jdGlvbl90OworCisvKgorICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgdGhlIHZhbHVlIHJldHVybmVkIGZvciBOdW1GdW5jdGlvbnMgYXQgcnVudGltZS4KKyAqLworI2lmbmRlZiBNUEkyX0lPVU5JVFBBR0UxMF9GVU5DVElPTl9FTlRSSUVTCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTEwX0ZVTkNUSU9OX0VOVFJJRVMgICAgICAoMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzEwIHsKKwlNUEkyX0NPTkZJR19QQUdFX0hFQURFUiBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAvKiAweDAwICovCisJVTggICAgICAgICAgICAgICAgICAgICAgTnVtRnVuY3Rpb25zOyAgICAgICAgICAgICAvKiAweDA0ICovCisJVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgLyogMHgwNSAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgIC8qIDB4MDYgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAvKiAweDA4ICovCisJVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OwkJLyogMHgwQyAqLworCU1QSTJfSU9VTklUMTBfRlVOQ1RJT04KKwkJRnVuY3Rpb25bTVBJMl9JT1VOSVRQQUdFMTBfRlVOQ1RJT05fRU5UUklFU107LyogMHgxMCAqLworfSBNUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfMTAsIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzEwLAorTXBpMklPVW5pdFBhZ2UxMF90LCBNUEkyX1BPSU5URVIgcE1waTJJT1VuaXRQYWdlMTBfdDsKKworI2RlZmluZSBNUEkyX0lPVU5JVFBBR0UxMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAoMHgwMSkKKwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDIyLDEyICsxMTQ0LDEyIEBACiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDB4MDQgKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICBFdmVudE1hc2tzW01QSTJfSU9DUEFHRTdfRVZFTlRNQVNLX1dPUkRTXTsvKiAweDA4ICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgU0FTQnJvYWRjYXN0UHJpbWl0aXZlTWFza3M7IC8qIDB4MTggKi8KLSAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMHgxQSAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFNBU05vdGlmeVByaW1pdGl2ZU1hc2tzOyAgICAvKiAweDFBICovCiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgIC8qIDB4MUMgKi8KIH0gTVBJMl9DT05GSUdfUEFHRV9JT0NfNywgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0NPTkZJR19QQUdFX0lPQ183LAogICBNcGkySU9DUGFnZTdfdCwgTVBJMl9QT0lOVEVSIHBNcGkySU9DUGFnZTdfdDsKIAotI2RlZmluZSBNUEkyX0lPQ1BBR0U3X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9JT0NQQUdFN19QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCiAKIAogLyogSU9DIFBhZ2UgOCAqLwpAQCAtMjA3MCwxNiArMjE5MiwxNiBAQAogI2RlZmluZSBNUEkyX1NBU0lPVU5JVFBBR0U4X1BBR0VWRVJTSU9OICAgICAoMHgwMCkKIAogLyogZGVmaW5lcyBmb3IgUG93ZXJNYW5hZ2VtZW50Q2FwYWJpbGl0aWVzIGZpZWxkICovCi0jZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1BPUlRfV0lEVEhfTU9EICAgICAgICAgICgweDAwMDAwMTAwMCkKLSNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0hPU1RfU0FTX1NMVU1CRVJfTU9ERSAgICAgICAgKDB4MDAwMDAwODAwKQotI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSE9TVF9TQVNfUEFSVElBTF9NT0RFICAgICAgICAoMHgwMDAwMDA0MDApCi0jZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1NBVEFfU0xVTUJFUl9NT0RFICAgICAgICgweDAwMDAwMDIwMCkKLSNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0hPU1RfU0FUQV9QQVJUSUFMX01PREUgICAgICAgKDB4MDAwMDAwMTAwKQotI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSU9VTklUX1BPUlRfV0lEVEhfTU9EICAgICAgICAoMHgwMDAwMDAwMTApCi0jZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9JT1VOSVRfU0FTX1NMVU1CRVJfTU9ERSAgICAgICgweDAwMDAwMDAwOCkKLSNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0lPVU5JVF9TQVNfUEFSVElBTF9NT0RFICAgICAgKDB4MDAwMDAwMDA0KQotI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSU9VTklUX1NBVEFfU0xVTUJFUl9NT0RFICAgICAoMHgwMDAwMDAwMDIpCi0jZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9JT1VOSVRfU0FUQV9QQVJUSUFMX01PREUgICAgICgweDAwMDAwMDAwMSkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0hPU1RfUE9SVF9XSURUSF9NT0QgICAgICAgICAgKDB4MDAwMDEwMDApCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1NBU19TTFVNQkVSX01PREUgICAgICAgICgweDAwMDAwODAwKQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSE9TVF9TQVNfUEFSVElBTF9NT0RFICAgICAgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0hPU1RfU0FUQV9TTFVNQkVSX01PREUgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1NBVEFfUEFSVElBTF9NT0RFICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSU9VTklUX1BPUlRfV0lEVEhfTU9EICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0lPVU5JVF9TQVNfU0xVTUJFUl9NT0RFICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9JT1VOSVRfU0FTX1BBUlRJQUxfTU9ERSAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSU9VTklUX1NBVEFfU0xVTUJFUl9NT0RFICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0lPVU5JVF9TQVRBX1BBUlRJQUxfTU9ERSAgICAgKDB4MDAwMDAwMDEpCiAKIAogCkBAIC0yMjY2LDYgKzIzODgsNyBAQAogLyogc2VlIG1waTJfc2FzLmggZm9yIHZhbHVlcyBmb3IgU0FTIERldmljZSBQYWdlIDAgRGV2aWNlSW5mbyB2YWx1ZXMgKi8KIAogLyogdmFsdWVzIGZvciBTQVMgRGV2aWNlIFBhZ2UgMCBGbGFncyBmaWVsZCAqLworI2RlZmluZSBNUEkyX1NBU19ERVZJQ0UwX0ZMQUdTX1VOQVVUSE9SSVpFRF9ERVZJQ0UgICAgICAgICAgKDB4ODAwMCkKICNkZWZpbmUgTVBJMl9TQVNfREVWSUNFMF9GTEFHU19TTFVNQkVSX1BNX0NBUEFCTEUgICAgICAgICAgICgweDEwMDApCiAjZGVmaW5lIE1QSTJfU0FTX0RFVklDRTBfRkxBR1NfUEFSVElBTF9QTV9DQVBBQkxFICAgICAgICAgICAoMHgwODAwKQogI2RlZmluZSBNUEkyX1NBU19ERVZJQ0UwX0ZMQUdTX1NBVEFfQVNZTkNIUk9OT1VTX05PVElGWSAgICAgKDB4MDQwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW9jLmgKaW5kZXggMWYwYzE5MC4uOTNkOWI2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW9jLmgKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfaW9jLmgKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMTAgTFNJIENvcnBvcmF0aW9uLgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDExIExTSSBDb3Jwb3JhdGlvbi4KICAqCiAgKgogICogICAgICAgICAgIE5hbWU6ICBtcGkyX2lvYy5oCiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBJT0MsIFBvcnQsIEV2ZW50LCBGVyBEb3dubG9hZCwgYW5kIEZXIFVwbG9hZCBtZXNzYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBPY3RvYmVyIDExLCAyMDA2CiAgKgotICogIG1waTJfaW9jLmggVmVyc2lvbjogIDAyLjAwLjE2CisgKiAgbXBpMl9pb2MuaCBWZXJzaW9uOiAgMDIuMDAuMTcKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDQsNiArMTA0LDEyIEBACiAgKiAgMDUtMTItMTAgIDAyLjAwLjE1ICBNYXJrZWQgVGFzayBTZXQgRnVsbCBFdmVudCBhcyBvYnNvbGV0ZS4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSTJfRVZFTlRfU0FTX1RPUE9fTFJfVU5TVVBQT1JURURfUEhZIGRlZmluZS4KICAqICAxMS0xMC0xMCAgMDIuMDAuMTYgIEFkZGVkIE1QSTJfRldfRE9XTkxPQURfSVRZUEVfTUlOX1BST0RVQ1RfU1BFQ0lGSUMuCisgKiAgMDItMjMtMTEgIDAyLjAwLjE3ICBBZGRlZCBTQVMgTk9USUZZIFByaW1pdGl2ZSBldmVudCwgYW5kIGFkZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICBTQVNOb3RpZnlQcmltaXRpdmVNYXNrcyBmaWVsZCB0bworICogICAgICAgICAgICAgICAgICAgICAgTVBJMl9FVkVOVF9OT1RJRklDQVRJT05fUkVRVUVTVC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFRlbXBlcmF0dXJlIFRocmVzaG9sZCBFdmVudC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEhvc3QgTWVzc2FnZSBFdmVudC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNlbmQgSG9zdCBNZXNzYWdlIHJlcXVlc3QgYW5kIHJlcGx5LgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNDIxLDcgKzQyNyw3IEBACiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ2OyAgICAgICAgICAgICAgICAgICAgICAvKiAweDEwICovCiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRXZlbnRNYXNrc1tNUEkyX0VWRU5UX05PVElGWV9FVkVOVE1BU0tfV09SRFNdOy8qIDB4MTQgKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICBTQVNCcm9hZGNhc3RQcmltaXRpdmVNYXNrczsgICAgIC8qIDB4MjQgKi8KLSAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDc7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MjYgKi8KKwkgVTE2ICAgICAgICAgICAgICAgICAgICAgU0FTTm90aWZ5UHJpbWl0aXZlTWFza3M7ICAgICAgICAvKiAweDI2ICovCiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ4OyAgICAgICAgICAgICAgICAgICAgICAvKiAweDI4ICovCiB9IE1QSTJfRVZFTlRfTk9USUZJQ0FUSU9OX1JFUVVFU1QsCiAgIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9FVkVOVF9OT1RJRklDQVRJT05fUkVRVUVTVCwKQEAgLTQ3Niw2ICs0ODIsOSBAQAogI2RlZmluZSBNUEkyX0VWRU5UX0dQSU9fSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICgweDAwMjMpCiAjZGVmaW5lIE1QSTJfRVZFTlRfSE9TVF9CQVNFRF9ESVNDT1ZFUllfUEhZICAgICAgICAgKDB4MDAyNCkKICNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfUVVJRVNDRSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDI1KQorI2RlZmluZSBNUEkyX0VWRU5UX1NBU19OT1RJRllfUFJJTUlUSVZFICAgICAgICAgICAgICgweDAwMjYpCisjZGVmaW5lIE1QSTJfRVZFTlRfVEVNUF9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgKDB4MDAyNykKKyNkZWZpbmUgTVBJMl9FVkVOVF9IT1NUX01FU1NBR0UgICAgICAgICAgICAgICAgICAgICAoMHgwMDI4KQogCiAKIC8qIExvZyBFbnRyeSBBZGRlZCBFdmVudCBkYXRhICovCkBAIC01MDcsNiArNTE2LDM5IEBACiAgIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9FVkVOVF9EQVRBX0dQSU9fSU5URVJSVVBULAogICBNcGkyRXZlbnREYXRhR3Bpb0ludGVycnVwdF90LCBNUEkyX1BPSU5URVIgcE1waTJFdmVudERhdGFHcGlvSW50ZXJydXB0X3Q7CiAKKy8qIFRlbXBlcmF0dXJlIFRocmVzaG9sZCBFdmVudCBkYXRhICovCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0VWRU5UX0RBVEFfVEVNUEVSQVRVUkUgeworCVUxNiAgICAgICAgIFN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKwlVOCAgICAgICAgICBTZW5zb3JOdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAyICovCisJVTggICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLworCVUxNiAgICAgICAgIEN1cnJlbnRUZW1wZXJhdHVyZTsgICAgICAgICAgICAgICAgIC8qIDB4MDQgKi8KKwlVMTYgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDA2ICovCisJVTMyICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLworCVUzMiAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MEMgKi8KK30gTVBJMl9FVkVOVF9EQVRBX1RFTVBFUkFUVVJFLAorTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0VWRU5UX0RBVEFfVEVNUEVSQVRVUkUsCitNcGkyRXZlbnREYXRhVGVtcGVyYXR1cmVfdCwgTVBJMl9QT0lOVEVSIHBNcGkyRXZlbnREYXRhVGVtcGVyYXR1cmVfdDsKKworLyogVGVtcGVyYXR1cmUgVGhyZXNob2xkIEV2ZW50IGRhdGEgU3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgTVBJMl9FVkVOVF9URU1QRVJBVFVSRTNfRVhDRUVERUQgICAgICAgICAgICAoMHgwMDA4KQorI2RlZmluZSBNUEkyX0VWRU5UX1RFTVBFUkFUVVJFMl9FWENFRURFRCAgICAgICAgICAgICgweDAwMDQpCisjZGVmaW5lIE1QSTJfRVZFTlRfVEVNUEVSQVRVUkUxX0VYQ0VFREVEICAgICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgTVBJMl9FVkVOVF9URU1QRVJBVFVSRTBfRVhDRUVERUQgICAgICAgICAgICAoMHgwMDAxKQorCisKKy8qIEhvc3QgTWVzc2FnZSBFdmVudCBkYXRhICovCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0VWRU5UX0RBVEFfSE9TVF9NRVNTQUdFIHsKKwlVOCAgICAgICAgICBTb3VyY2VWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwICovCisJVTggICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMSAqLworCVUxNiAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKwlVMzIgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDA0ICovCisJVTMyICAgICAgICAgSG9zdERhdGFbMV07ICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLworfSBNUEkyX0VWRU5UX0RBVEFfSE9TVF9NRVNTQUdFLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfRVZFTlRfREFUQV9IT1NUX01FU1NBR0UsCitNcGkyRXZlbnREYXRhSG9zdE1lc3NhZ2VfdCwgTVBJMl9QT0lOVEVSIHBNcGkyRXZlbnREYXRhSG9zdE1lc3NhZ2VfdDsKKworCiAvKiBIYXJkIFJlc2V0IFJlY2VpdmVkIEV2ZW50IGRhdGEgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgX01QSTJfRVZFTlRfREFUQV9IQVJEX1JFU0VUX1JFQ0VJVkVECkBAIC03NDksNiArNzkxLDI0IEBACiAjZGVmaW5lIE1QSTJfRVZFTlRfUFJJTUlUSVZFX0NIQU5HRTBfUkVTRVJWRUQgICAgICAgICAgICAgICAoMHgwNykKICNkZWZpbmUgTVBJMl9FVkVOVF9QUklNSVRJVkVfQ0hBTkdFMV9SRVNFUlZFRCAgICAgICAgICAgICAgICgweDA4KQogCisvKiBTQVMgTm90aWZ5IFByaW1pdGl2ZSBFdmVudCBkYXRhICovCisKK3R5cGVkZWYgc3RydWN0IF9NUEkyX0VWRU5UX0RBVEFfU0FTX05PVElGWV9QUklNSVRJVkUgeworCVU4ICAgICAgICAgICAgICAgICAgICAgIFBoeU51bTsgICAgICAgICAgICAgICAgICAgICAvKiAweDAwICovCisJVTggICAgICAgICAgICAgICAgICAgICAgUG9ydDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZTsgICAgICAgICAgICAgICAgICAvKiAweDAzICovCit9IE1QSTJfRVZFTlRfREFUQV9TQVNfTk9USUZZX1BSSU1JVElWRSwKK01QSTJfUE9JTlRFUiBQVFJfTVBJMl9FVkVOVF9EQVRBX1NBU19OT1RJRllfUFJJTUlUSVZFLAorTXBpMkV2ZW50RGF0YVNhc05vdGlmeVByaW1pdGl2ZV90LAorTVBJMl9QT0lOVEVSIHBNcGkyRXZlbnREYXRhU2FzTm90aWZ5UHJpbWl0aXZlX3Q7CisKKy8qIGRlZmluZXMgZm9yIHRoZSBQcmltaXRpdmUgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9FVkVOVF9OT1RJRllfRU5BQkxFX1NQSU5VUCAgICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUEkyX0VWRU5UX05PVElGWV9QT1dFUl9MT1NTX0VYUEVDVEVEICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSTJfRVZFTlRfTk9USUZZX1JFU0VSVkVEMSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJMl9FVkVOVF9OT1RJRllfUkVTRVJWRUQyICAgICAgICAgICAgICAgICAgICAgICAgICgweDA0KQorCiAKIC8qIFNBUyBJbml0aWF0b3IgRGV2aWNlIFN0YXR1cyBDaGFuZ2UgRXZlbnQgZGF0YSAqLwogCkBAIC0xMDAxLDYgKzEwNjEsNTMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgU2VuZEhvc3RNZXNzYWdlIG1lc3NhZ2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNlbmRIb3N0TWVzc2FnZSBSZXF1ZXN0IG1lc3NhZ2UgKi8KK3R5cGVkZWYgc3RydWN0IF9NUEkyX1NFTkRfSE9TVF9NRVNTQUdFX1JFUVVFU1QgeworCVUxNiAgICAgICAgICAgICAgICAgICAgIEhvc3REYXRhTGVuZ3RoOyAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNiAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNyAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFZQX0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFZGX0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOSAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwQSAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwQyAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIERlc3RWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwRCAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwRSAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNjsgICAgICAgICAgICAgICAgICAgICAgLyogMHgxMCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNzsgICAgICAgICAgICAgICAgICAgICAgLyogMHgxNCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkODsgICAgICAgICAgICAgICAgICAgICAgLyogMHgxOCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOTsgICAgICAgICAgICAgICAgICAgICAgLyogMHgxQyAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTA7ICAgICAgICAgICAgICAgICAgICAgLyogMHgyMCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIEhvc3REYXRhWzFdOyAgICAgICAgICAgICAgICAgICAgLyogMHgyNCAqLworfSBNUEkyX1NFTkRfSE9TVF9NRVNTQUdFX1JFUVVFU1QsCitNUEkyX1BPSU5URVIgUFRSX01QSTJfU0VORF9IT1NUX01FU1NBR0VfUkVRVUVTVCwKK01waTJTZW5kSG9zdE1lc3NhZ2VSZXF1ZXN0X3QsIE1QSTJfUE9JTlRFUiBwTXBpMlNlbmRIb3N0TWVzc2FnZVJlcXVlc3RfdDsKKworCisvKiBTZW5kSG9zdE1lc3NhZ2UgUmVwbHkgbWVzc2FnZSAqLwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfU0VORF9IT1NUX01FU1NBR0VfUkVQTFkgeworCVUxNiAgICAgICAgICAgICAgICAgICAgIEhvc3REYXRhTGVuZ3RoOyAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNiAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNyAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFZQX0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFZGX0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOSAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwQSAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwQyAqLworCVUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwRSAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgICAgICAgICAgICAgLyogMHgxMCAqLworfSBNUEkyX1NFTkRfSE9TVF9NRVNTQUdFX1JFUExZLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfU0VORF9IT1NUX01FU1NBR0VfUkVQTFksCitNcGkyU2VuZEhvc3RNZXNzYWdlUmVwbHlfdCwgTVBJMl9QT0lOVEVSIHBNcGkyU2VuZEhvc3RNZXNzYWdlUmVwbHlfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgRldEb3dubG9hZCBtZXNzYWdlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5jCmluZGV4IDY4MjU3NzIuLmJlZGEwNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5jCkBAIC04MSw2ICs4MSwxNSBAQAogbW9kdWxlX3BhcmFtX2FycmF5KG1pc3NpbmdfZGVsYXksIGludCwgTlVMTCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1pc3NpbmdfZGVsYXksICIgZGV2aWNlIG1pc3NpbmcgZGVsYXkgLCBpbyBtaXNzaW5nIGRlbGF5Iik7CiAKK3N0YXRpYyBpbnQgbXB0MnNhc19md2ZhdWx0X2RlYnVnOworTU9EVUxFX1BBUk1fREVTQyhtcHQyc2FzX2Z3ZmF1bHRfZGVidWcsICIgZW5hYmxlIGRldGVjdGlvbiBvZiBmaXJtd2FyZSBmYXVsdCAiCisJImFuZCBoYWx0IGZpcm13YXJlIC0gKGRlZmF1bHQ9MCkiKTsKKworc3RhdGljIGludCBkaXNhYmxlX2Rpc2NvdmVyeSA9IC0xOworbW9kdWxlX3BhcmFtKGRpc2FibGVfZGlzY292ZXJ5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2Rpc2NvdmVyeSwgIiBkaXNhYmxlIGRpc2NvdmVyeSAiKTsKKworCiAvKiBkaWFnX2J1ZmZlcl9lbmFibGUgaXMgYml0d2lzZQogICogYml0IDAgc2V0ID0gVFJBQ0UKICAqIGJpdCAxIHNldCA9IFNOQVBTSE9UCkBAIC05MywxNCArMTAyLDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZGlhZ19idWZmZXJfZW5hYmxlLCAiIHBvc3QgZGlhZyBidWZmZXJzICIKICAgICAiKFRSQUNFPTEvU05BUFNIT1Q9Mi9FWFRFTkRFRD00L2RlZmF1bHQ9MCkiKTsKIAotc3RhdGljIGludCBtcHQyc2FzX2Z3ZmF1bHRfZGVidWc7Ci1NT0RVTEVfUEFSTV9ERVNDKG1wdDJzYXNfZndmYXVsdF9kZWJ1ZywgIiBlbmFibGUgZGV0ZWN0aW9uIG9mIGZpcm13YXJlIGZhdWx0ICIKLSAgICAiYW5kIGhhbHQgZmlybXdhcmUgLSAoZGVmYXVsdD0wKSIpOwotCi1zdGF0aWMgaW50IGRpc2FibGVfZGlzY292ZXJ5ID0gLTE7Ci1tb2R1bGVfcGFyYW0oZGlzYWJsZV9kaXNjb3ZlcnksIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfZGlzY292ZXJ5LCAiIGRpc2FibGUgZGlzY292ZXJ5ICIpOwotCiAvKioKICAqIF9zY3NpaF9zZXRfZndmYXVsdF9kZWJ1ZyAtIGdsb2JhbCBzZXR0aW5nIG9mIGlvYy0+ZndmYXVsdF9kZWJ1Zy4KICAqCkBAIC02OTEsNiArNjkyLDcgQEAKIAkJbWVtY3B5KGlvYy0+YmFzZV9jbWRzLnJlcGx5LCBtcGlfcmVwbHksIG1waV9yZXBseS0+TXNnTGVuZ3RoKjQpOwogCX0KIAlpb2MtPmJhc2VfY21kcy5zdGF0dXMgJj0gfk1QVDJfQ01EX1BFTkRJTkc7CisKIAljb21wbGV0ZSgmaW9jLT5iYXNlX2NtZHMuZG9uZSk7CiAJcmV0dXJuIDE7CiB9CkBAIC04MzMsMjUgKzgzNSwzMSBAQAogc3RhdGljIGlycXJldHVybl90CiBfYmFzZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqYnVzX2lkKQogeworCXN0cnVjdCBhZGFwdGVyX3JlcGx5X3F1ZXVlICpyZXBseV9xID0gYnVzX2lkOwogCXVuaW9uIHJlcGx5X2Rlc2NyaXB0b3IgcmQ7CiAJdTMyIGNvbXBsZXRlZF9jbWRzOwogCXU4IHJlcXVlc3RfZGVzcmlwdF90eXBlOwogCXUxNiBzbWlkOwogCXU4IGNiX2lkeDsKIAl1MzIgcmVwbHk7Ci0JdTggbXNpeF9pbmRleDsKLQlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MgPSBidXNfaWQ7CisJdTggbXNpeF9pbmRleCA9IHJlcGx5X3EtPm1zaXhfaW5kZXg7CisJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gcmVwbHlfcS0+aW9jOwogCU1waTJSZXBseURlc2NyaXB0b3JzVW5pb25fdCAqcnBmOwogCXU4IHJjOwogCiAJaWYgKGlvYy0+bWFza19pbnRlcnJ1cHRzKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQlycGYgPSAmaW9jLT5yZXBseV9wb3N0X2ZyZWVbaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhdOworCWlmICghYXRvbWljX2FkZF91bmxlc3MoJnJlcGx5X3EtPmJ1c3ksIDEsIDEpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlycGYgPSAmcmVwbHlfcS0+cmVwbHlfcG9zdF9mcmVlW3JlcGx5X3EtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleF07CiAJcmVxdWVzdF9kZXNyaXB0X3R5cGUgPSBycGYtPkRlZmF1bHQuUmVwbHlGbGFncwogCSAgICAgJiBNUEkyX1JQWV9ERVNDUklQVF9GTEFHU19UWVBFX01BU0s7Ci0JaWYgKHJlcXVlc3RfZGVzcmlwdF90eXBlID09IE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1VOVVNFRCkKKwlpZiAocmVxdWVzdF9kZXNyaXB0X3R5cGUgPT0gTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfVU5VU0VEKSB7CisJCWF0b21pY19kZWMoJnJlcGx5X3EtPmJ1c3kpOwogCQlyZXR1cm4gSVJRX05PTkU7CisJfQogCiAJY29tcGxldGVkX2NtZHMgPSAwOwogCWNiX2lkeCA9IDB4RkY7CkBAIC04NjAsOSArODY4LDcgQEAKIAkJaWYgKHJkLnUubG93ID09IFVJTlRfTUFYIHx8IHJkLnUuaGlnaCA9PSBVSU5UX01BWCkKIAkJCWdvdG8gb3V0OwogCQlyZXBseSA9IDA7Ci0JCWNiX2lkeCA9IDB4RkY7CiAJCXNtaWQgPSBsZTE2X3RvX2NwdShycGYtPkRlZmF1bHQuRGVzY3JpcHRvclR5cGVEZXBlbmRlbnQxKTsKLQkJbXNpeF9pbmRleCA9IHJwZi0+RGVmYXVsdC5NU0l4SW5kZXg7CiAJCWlmIChyZXF1ZXN0X2Rlc3JpcHRfdHlwZSA9PQogCQkgICAgTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfQUREUkVTU19SRVBMWSkgewogCQkJcmVwbHkgPSBsZTMyX3RvX2NwdQpAQCAtOTA2LDMyICs5MTIsODYgQEAKICBuZXh0OgogCiAJCXJwZi0+V29yZHMgPSBjcHVfdG9fbGU2NChVTExPTkdfTUFYKTsKLQkJaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXggPSAoaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXggPT0KKwkJcmVwbHlfcS0+cmVwbHlfcG9zdF9ob3N0X2luZGV4ID0KKwkJICAgIChyZXBseV9xLT5yZXBseV9wb3N0X2hvc3RfaW5kZXggPT0KIAkJICAgIChpb2MtPnJlcGx5X3Bvc3RfcXVldWVfZGVwdGggLSAxKSkgPyAwIDoKLQkJICAgIGlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4ICsgMTsKKwkJICAgIHJlcGx5X3EtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCArIDE7CiAJCXJlcXVlc3RfZGVzcmlwdF90eXBlID0KLQkJICAgIGlvYy0+cmVwbHlfcG9zdF9mcmVlW2lvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4XS5EZWZhdWx0LgotCQkgICAgUmVwbHlGbGFncyAmIE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1RZUEVfTUFTSzsKKwkJICAgIHJlcGx5X3EtPnJlcGx5X3Bvc3RfZnJlZVtyZXBseV9xLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhdLgorCQkgICAgRGVmYXVsdC5SZXBseUZsYWdzICYgTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfVFlQRV9NQVNLOwogCQljb21wbGV0ZWRfY21kcysrOwogCQlpZiAocmVxdWVzdF9kZXNyaXB0X3R5cGUgPT0gTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfVU5VU0VEKQogCQkJZ290byBvdXQ7Ci0JCWlmICghaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXgpCi0JCQlycGYgPSBpb2MtPnJlcGx5X3Bvc3RfZnJlZTsKKwkJaWYgKCFyZXBseV9xLT5yZXBseV9wb3N0X2hvc3RfaW5kZXgpCisJCQlycGYgPSByZXBseV9xLT5yZXBseV9wb3N0X2ZyZWU7CiAJCWVsc2UKIAkJCXJwZisrOwogCX0gd2hpbGUgKDEpOwogCiAgb3V0OgogCi0JaWYgKCFjb21wbGV0ZWRfY21kcykKKwlpZiAoIWNvbXBsZXRlZF9jbWRzKSB7CisJCWF0b21pY19kZWMoJnJlcGx5X3EtPmJ1c3kpOwogCQlyZXR1cm4gSVJRX05PTkU7Ci0KKwl9CiAJd21iKCk7Ci0Jd3JpdGVsKGlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4LCAmaW9jLT5jaGlwLT5SZXBseVBvc3RIb3N0SW5kZXgpOworCWlmIChpb2MtPmlzX3dhcnBkcml2ZSkgeworCQl3cml0ZWwocmVwbHlfcS0+cmVwbHlfcG9zdF9ob3N0X2luZGV4LAorCQlpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleFttc2l4X2luZGV4XSk7CisJCWF0b21pY19kZWMoJnJlcGx5X3EtPmJ1c3kpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXdyaXRlbChyZXBseV9xLT5yZXBseV9wb3N0X2hvc3RfaW5kZXggfCAobXNpeF9pbmRleCA8PAorCSAgICBNUEkyX1JQSElfTVNJWF9JTkRFWF9TSElGVCksICZpb2MtPmNoaXAtPlJlcGx5UG9zdEhvc3RJbmRleCk7CisJYXRvbWljX2RlYygmcmVwbHlfcS0+YnVzeSk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAvKioKKyAqIF9iYXNlX2lzX2NvbnRyb2xsZXJfbXNpeF9lbmFibGVkIC0gaXMgY29udHJvbGxlciBzdXBwb3J0IG11bGktcmVwbHkgcXVldWVzCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfYmFzZV9pc19jb250cm9sbGVyX21zaXhfZW5hYmxlZChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCit7CisJcmV0dXJuIChpb2MtPmZhY3RzLklPQ0NhcGFiaWxpdGllcyAmCisJICAgIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9NU0lfWF9JTkRFWCkgJiYgaW9jLT5tc2l4X2VuYWJsZTsKK30KKworLyoqCisgKiBtcHQyc2FzX2Jhc2VfZmx1c2hfcmVwbHlfcXVldWVzIC0gZmx1c2hpbmcgdGhlIE1TSVggcmVwbHkgcXVldWVzCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIENvbnRleHQ6IElTUiBjb25leHQKKyAqCisgKiBDYWxsZWQgd2hlbiBhIFRhc2sgTWFuYWdlbWVudCByZXF1ZXN0IGhhcyBjb21wbGV0ZWQuIFdlIHdhbnQKKyAqIHRvIGZsdXNoIHRoZSBvdGhlciByZXBseSBxdWV1ZXMgc28gYWxsIHRoZSBvdXRzdGFuZGluZyBJTyBoYXMgYmVlbgorICogY29tcGxldGVkIGJhY2sgdG8gT1MgYmVmb3JlIHdlIHByb2Nlc3MgdGhlIFRNIGNvbXBsZXRldGlvbi4KKyAqCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLwordm9pZAorbXB0MnNhc19iYXNlX2ZsdXNoX3JlcGx5X3F1ZXVlcyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCit7CisJc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUgKnJlcGx5X3E7CisKKwkvKiBJZiBNU0lYIGNhcGFiaWxpdHkgaXMgdHVybmVkIG9mZgorCSAqIHRoZW4gbXVsdGktcXVldWVzIGFyZSBub3QgZW5hYmxlZAorCSAqLworCWlmICghX2Jhc2VfaXNfY29udHJvbGxlcl9tc2l4X2VuYWJsZWQoaW9jKSkKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBseV9xLCAmaW9jLT5yZXBseV9xdWV1ZV9saXN0LCBsaXN0KSB7CisJCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQorCQkJcmV0dXJuOworCQkvKiBUTXMgYXJlIG9uIG1zaXhfaW5kZXggPT0gMCAqLworCQlpZiAocmVwbHlfcS0+bXNpeF9pbmRleCA9PSAwKQorCQkJY29udGludWU7CisJCV9iYXNlX2ludGVycnVwdChyZXBseV9xLT52ZWN0b3IsICh2b2lkICopcmVwbHlfcSk7CisJfQorfQorCisvKioKICAqIG1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIgLSBjbGVhciBpbnRlcnJ1cHQgY2FsbGJhY2sgaGFuZGxlcgogICogQGNiX2lkeDogY2FsbGJhY2sgaW5kZXgKICAqCkBAIC0xMDgxLDQxICsxMTQxLDYgQEAKIH0KIAogLyoqCi0gKiBfYmFzZV9zYXZlX21zaXhfdGFibGUgLSBiYWNrdXAgbXNpeCB2ZWN0b3IgdGFibGUKLSAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICoKLSAqIFRoaXMgYWRkcmVzcyBhbiBlcnJhdGEgd2hlcmUgZGlhZyByZXNldCBjbGVhcnMgb3V0IHRoZSB0YWJsZQotICovCi1zdGF0aWMgdm9pZAotX2Jhc2Vfc2F2ZV9tc2l4X3RhYmxlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKLXsKLQlpbnQgaTsKLQotCWlmICghaW9jLT5tc2l4X2VuYWJsZSB8fCBpb2MtPm1zaXhfdGFibGVfYmFja3VwID09IE5VTEwpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBpb2MtPm1zaXhfdmVjdG9yX2NvdW50OyBpKyspCi0JCWlvYy0+bXNpeF90YWJsZV9iYWNrdXBbaV0gPSBpb2MtPm1zaXhfdGFibGVbaV07Ci19Ci0KLS8qKgotICogX2Jhc2VfcmVzdG9yZV9tc2l4X3RhYmxlIC0gdGhpcyByZXN0b3JlcyB0aGUgbXNpeCB2ZWN0b3IgdGFibGUKLSAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICoKLSAqLwotc3RhdGljIHZvaWQKLV9iYXNlX3Jlc3RvcmVfbXNpeF90YWJsZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIWlvYy0+bXNpeF9lbmFibGUgfHwgaW9jLT5tc2l4X3RhYmxlX2JhY2t1cCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudDsgaSsrKQotCQlpb2MtPm1zaXhfdGFibGVbaV0gPSBpb2MtPm1zaXhfdGFibGVfYmFja3VwW2ldOwotfQotCi0vKioKICAqIF9iYXNlX2NoZWNrX2VuYWJsZV9tc2l4IC0gY2hlY2tzIE1TSVggY2FwYWJhYmxlLgogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKgpAQCAtMTEyNyw3ICsxMTUyLDcgQEAKIHsKIAlpbnQgYmFzZTsKIAl1MTYgbWVzc2FnZV9jb250cm9sOwotCXUzMiBtc2l4X3RhYmxlX29mZnNldDsKKwogCiAJYmFzZSA9IHBjaV9maW5kX2NhcGFiaWxpdHkoaW9jLT5wZGV2LCBQQ0lfQ0FQX0lEX01TSVgpOwogCWlmICghYmFzZSkgewpAQCAtMTEzNywyMSArMTE2MiwxNTMgQEAKIAl9CiAKIAkvKiBnZXQgbXNpeCB2ZWN0b3IgY291bnQgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChpb2MtPnBkZXYsIGJhc2UgKyAyLCAmbWVzc2FnZV9jb250cm9sKTsKLQlpb2MtPm1zaXhfdmVjdG9yX2NvdW50ID0gKG1lc3NhZ2VfY29udHJvbCAmIDB4M0ZGKSArIDE7Ci0KLQkvKiBnZXQgbXNpeCB0YWJsZSAgKi8KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW9jLT5wZGV2LCBiYXNlICsgNCwgJm1zaXhfdGFibGVfb2Zmc2V0KTsKLQltc2l4X3RhYmxlX29mZnNldCAmPSAweEZGRkZGRkY4OwotCWlvYy0+bXNpeF90YWJsZSA9ICh1MzIgKikoKHZvaWQgKilpb2MtPmNoaXAgKyBtc2l4X3RhYmxlX29mZnNldCk7Ci0KKwkvKiBOVU1BX0lPIG5vdCBzdXBwb3J0ZWQgZm9yIG9sZGVyIGNvbnRyb2xsZXJzICovCisJaWYgKGlvYy0+cGRldi0+ZGV2aWNlID09IE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMDA0IHx8CisJICAgIGlvYy0+cGRldi0+ZGV2aWNlID09IE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMDA4IHx8CisJICAgIGlvYy0+cGRldi0+ZGV2aWNlID09IE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMTA4XzEgfHwKKwkgICAgaW9jLT5wZGV2LT5kZXZpY2UgPT0gTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIxMDhfMiB8fAorCSAgICBpb2MtPnBkZXYtPmRldmljZSA9PSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjEwOF8zIHx8CisJICAgIGlvYy0+cGRldi0+ZGV2aWNlID09IE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMTE2XzEgfHwKKwkgICAgaW9jLT5wZGV2LT5kZXZpY2UgPT0gTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIxMTZfMikKKwkJaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudCA9IDE7CisJZWxzZSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGlvYy0+cGRldiwgYmFzZSArIDIsICZtZXNzYWdlX2NvbnRyb2wpOworCQlpb2MtPm1zaXhfdmVjdG9yX2NvdW50ID0gKG1lc3NhZ2VfY29udHJvbCAmIDB4M0ZGKSArIDE7CisJfQogCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIm1zaXggaXMgc3VwcG9ydGVkLCAiCi0JICAgICJ2ZWN0b3JfY291bnQoJWQpLCB0YWJsZV9vZmZzZXQoMHglMDh4KSwgdGFibGUoJXApXG4iLCBpb2MtPm5hbWUsCi0JICAgIGlvYy0+bXNpeF92ZWN0b3JfY291bnQsIG1zaXhfdGFibGVfb2Zmc2V0LCBpb2MtPm1zaXhfdGFibGUpKTsKKwkgICAgInZlY3Rvcl9jb3VudCglZClcbiIsIGlvYy0+bmFtZSwgaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudCkpOworCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgorICogX2Jhc2VfZnJlZV9pcnEgLSBmcmVlIGlycQorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKgorICogRnJlZWluZyByZXNwZWN0aXZlIHJlcGx5X3F1ZXVlIGZyb20gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkCitfYmFzZV9mcmVlX2lycShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCit7CisJc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUgKnJlcGx5X3EsICpuZXh0OworCisJaWYgKGxpc3RfZW1wdHkoJmlvYy0+cmVwbHlfcXVldWVfbGlzdCkpCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXBseV9xLCBuZXh0LCAmaW9jLT5yZXBseV9xdWV1ZV9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZyZXBseV9xLT5saXN0KTsKKwkJc3luY2hyb25pemVfaXJxKHJlcGx5X3EtPnZlY3Rvcik7CisJCWZyZWVfaXJxKHJlcGx5X3EtPnZlY3RvciwgcmVwbHlfcSk7CisJCWtmcmVlKHJlcGx5X3EpOworCX0KK30KKworLyoqCisgKiBfYmFzZV9yZXF1ZXN0X2lycSAtIHJlcXVlc3QgaXJxCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBpbmRleDogbXNpeCBpbmRleCBpbnRvIHZlY3RvciB0YWJsZQorICogQHZlY3RvcjogaXJxIHZlY3RvcgorICoKKyAqIEluc2VydGluZyByZXNwZWN0aXZlIHJlcGx5X3F1ZXVlIGludG8gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBpbnQKK19iYXNlX3JlcXVlc3RfaXJxKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggaW5kZXgsIHUzMiB2ZWN0b3IpCit7CisJc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUgKnJlcGx5X3E7CisJaW50IHI7CisKKwlyZXBseV9xID0gIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGFwdGVyX3JlcGx5X3F1ZXVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXBseV9xKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgJWQhXG4iLAorCQkgICAgaW9jLT5uYW1lLCAoaW50KXNpemVvZihzdHJ1Y3QgYWRhcHRlcl9yZXBseV9xdWV1ZSkpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmVwbHlfcS0+aW9jID0gaW9jOworCXJlcGx5X3EtPm1zaXhfaW5kZXggPSBpbmRleDsKKwlyZXBseV9xLT52ZWN0b3IgPSB2ZWN0b3I7CisJYXRvbWljX3NldCgmcmVwbHlfcS0+YnVzeSwgMCk7CisJaWYgKGlvYy0+bXNpeF9lbmFibGUpCisJCXNucHJpbnRmKHJlcGx5X3EtPm5hbWUsIE1QVF9OQU1FX0xFTkdUSCwgIiVzJWQtbXNpeCVkIiwKKwkJICAgIE1QVDJTQVNfRFJJVkVSX05BTUUsIGlvYy0+aWQsIGluZGV4KTsKKwllbHNlCisJCXNucHJpbnRmKHJlcGx5X3EtPm5hbWUsIE1QVF9OQU1FX0xFTkdUSCwgIiVzJWQiLAorCQkgICAgTVBUMlNBU19EUklWRVJfTkFNRSwgaW9jLT5pZCk7CisJciA9IHJlcXVlc3RfaXJxKHZlY3RvciwgX2Jhc2VfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgcmVwbHlfcS0+bmFtZSwKKwkgICAgcmVwbHlfcSk7CisJaWYgKHIpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAidW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdCAlZCFcbiIsCisJCSAgICByZXBseV9xLT5uYW1lLCB2ZWN0b3IpOworCQlrZnJlZShyZXBseV9xKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmcmVwbHlfcS0+bGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmcmVwbHlfcS0+bGlzdCwgJmlvYy0+cmVwbHlfcXVldWVfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogX2Jhc2VfYXNzaWduX3JlcGx5X3F1ZXVlcyAtIGFzc2lnbmluZyBtc2l4IGluZGV4IGZvciBlYWNoIGNwdQorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKgorICogVGhlIGVuZHVzZXIgd291bGQgbmVlZCB0byBzZXQgdGhlIGFmZmluaXR5IHZpYSAvcHJvYy9pcnEvIy9zbXBfYWZmaW5pdHkKKyAqCisgKiBJdCB3b3VsZCBuaWNlIGlmIHdlIGNvdWxkIGNhbGwgaXJxX3NldF9hZmZpbml0eSwgaG93ZXZlciBpdCBpcyBub3QKKyAqIGFuIGV4cG9ydGVkIHN5bWJvbAorICovCitzdGF0aWMgdm9pZAorX2Jhc2VfYXNzaWduX3JlcGx5X3F1ZXVlcyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCit7CisJc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUgKnJlcGx5X3E7CisJaW50IGNwdV9pZDsKKwlpbnQgY3B1X2dyb3VwaW5nLCBsb29wLCBncm91cGluZywgZ3JvdXBpbmdfbW9kOworCisJaWYgKCFfYmFzZV9pc19jb250cm9sbGVyX21zaXhfZW5hYmxlZChpb2MpKQorCQlyZXR1cm47CisKKwltZW1zZXQoaW9jLT5jcHVfbXNpeF90YWJsZSwgMCwgaW9jLT5jcHVfbXNpeF90YWJsZV9zeik7CisJLyogd2hlbiB0aGVyZSBhcmUgbW9yZSBjcHVzIHRoYW4gYXZhaWxhYmxlIG1zaXggdmVjdG9ycywKKwkgKiB0aGVuIGdyb3VwIGNwdXMgdG9nZWF0aGVyIG9uIHNhbWUgaXJxCisJICovCisJaWYgKGlvYy0+Y3B1X2NvdW50ID4gaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudCkgeworCQlncm91cGluZyA9IGlvYy0+Y3B1X2NvdW50IC8gaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudDsKKwkJZ3JvdXBpbmdfbW9kID0gaW9jLT5jcHVfY291bnQgJSBpb2MtPm1zaXhfdmVjdG9yX2NvdW50OworCQlpZiAoZ3JvdXBpbmcgPCAyIHx8IChncm91cGluZyA9PSAyICYmICFncm91cGluZ19tb2QpKQorCQkJY3B1X2dyb3VwaW5nID0gMjsKKwkJZWxzZSBpZiAoZ3JvdXBpbmcgPCA0IHx8IChncm91cGluZyA9PSA0ICYmICFncm91cGluZ19tb2QpKQorCQkJY3B1X2dyb3VwaW5nID0gNDsKKwkJZWxzZSBpZiAoZ3JvdXBpbmcgPCA4IHx8IChncm91cGluZyA9PSA4ICYmICFncm91cGluZ19tb2QpKQorCQkJY3B1X2dyb3VwaW5nID0gODsKKwkJZWxzZQorCQkJY3B1X2dyb3VwaW5nID0gMTY7CisJfSBlbHNlCisJCWNwdV9ncm91cGluZyA9IDA7CisKKwlsb29wID0gMDsKKwlyZXBseV9xID0gbGlzdF9lbnRyeShpb2MtPnJlcGx5X3F1ZXVlX2xpc3QubmV4dCwKKwkgICAgIHN0cnVjdCBhZGFwdGVyX3JlcGx5X3F1ZXVlLCBsaXN0KTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdV9pZCkgeworCQlpZiAoIWNwdV9ncm91cGluZykgeworCQkJaW9jLT5jcHVfbXNpeF90YWJsZVtjcHVfaWRdID0gcmVwbHlfcS0+bXNpeF9pbmRleDsKKwkJCXJlcGx5X3EgPSBsaXN0X2VudHJ5KHJlcGx5X3EtPmxpc3QubmV4dCwKKwkJCSAgICBzdHJ1Y3QgYWRhcHRlcl9yZXBseV9xdWV1ZSwgbGlzdCk7CisJCX0gZWxzZSB7CisJCQlpZiAobG9vcCA8IGNwdV9ncm91cGluZykgeworCQkJCWlvYy0+Y3B1X21zaXhfdGFibGVbY3B1X2lkXSA9CisJCQkJCXJlcGx5X3EtPm1zaXhfaW5kZXg7CisJCQkJbG9vcCsrOworCQkJfSBlbHNlIHsKKwkJCQlyZXBseV9xID0gbGlzdF9lbnRyeShyZXBseV9xLT5saXN0Lm5leHQsCisJCQkJICAgIHN0cnVjdCBhZGFwdGVyX3JlcGx5X3F1ZXVlLCBsaXN0KTsKKwkJCQlpb2MtPmNwdV9tc2l4X3RhYmxlW2NwdV9pZF0gPQorCQkJCQlyZXBseV9xLT5tc2l4X2luZGV4OworCQkJCWxvb3AgPSAxOworCQkJfQorCQl9CisJfQorfQorCisvKioKICAqIF9iYXNlX2Rpc2FibGVfbXNpeCAtIGRpc2FibGVzIG1zaXgKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICoKQEAgLTExNjEsOCArMTMxOCw2IEBACiB7CiAJaWYgKGlvYy0+bXNpeF9lbmFibGUpIHsKIAkJcGNpX2Rpc2FibGVfbXNpeChpb2MtPnBkZXYpOwotCQlrZnJlZShpb2MtPm1zaXhfdGFibGVfYmFja3VwKTsKLQkJaW9jLT5tc2l4X3RhYmxlX2JhY2t1cCA9IE5VTEw7CiAJCWlvYy0+bXNpeF9lbmFibGUgPSAwOwogCX0KIH0KQEAgLTExNzUsMTAgKzEzMzAsMTMgQEAKIHN0YXRpYyBpbnQKIF9iYXNlX2VuYWJsZV9tc2l4KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKIHsKLQlzdHJ1Y3QgbXNpeF9lbnRyeSBlbnRyaWVzOworCXN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzLCAqYTsKIAlpbnQgcjsKKwlpbnQgaTsKIAl1OCB0cnlfbXNpeCA9IDA7CiAKKwlJTklUX0xJU1RfSEVBRCgmaW9jLT5yZXBseV9xdWV1ZV9saXN0KTsKKwogCWlmIChtc2l4X2Rpc2FibGUgPT0gLTEgfHwgbXNpeF9kaXNhYmxlID09IDApCiAJCXRyeV9tc2l4ID0gMTsKIApAQCAtMTE4OCw1MSArMTM0Niw0OCBAQAogCWlmIChfYmFzZV9jaGVja19lbmFibGVfbXNpeChpb2MpICE9IDApCiAJCWdvdG8gdHJ5X2lvYXBpYzsKIAotCWlvYy0+bXNpeF90YWJsZV9iYWNrdXAgPSBrY2FsbG9jKGlvYy0+bXNpeF92ZWN0b3JfY291bnQsCi0JICAgIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlvYy0+bXNpeF90YWJsZV9iYWNrdXApIHsKLQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiYWxsb2NhdGlvbiBmb3IgIgotCQkgICAgIm1zaXhfdGFibGVfYmFja3VwIGZhaWxlZCEhIVxuIiwgaW9jLT5uYW1lKSk7CisJaW9jLT5yZXBseV9xdWV1ZV9jb3VudCA9IG1pbl90KHU4LCBpb2MtPmNwdV9jb3VudCwKKwkgICAgaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudCk7CisKKwllbnRyaWVzID0ga2NhbGxvYyhpb2MtPnJlcGx5X3F1ZXVlX2NvdW50LCBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLAorCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJpZXMpIHsKKwkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAia2NhbGxvYyAiCisJCSAgICAiZmFpbGVkIEAgYXQgJXM6JWQvJXMoKSAhISFcbiIsIGlvYy0+bmFtZSwgX19GSUxFX18sCisJCSAgICBfX0xJTkVfXywgX19mdW5jX18pKTsKIAkJZ290byB0cnlfaW9hcGljOwogCX0KIAotCW1lbXNldCgmZW50cmllcywgMCwgc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSk7Ci0JciA9IHBjaV9lbmFibGVfbXNpeChpb2MtPnBkZXYsICZlbnRyaWVzLCAxKTsKKwlmb3IgKGkgPSAwLCBhID0gZW50cmllczsgaSA8IGlvYy0+cmVwbHlfcXVldWVfY291bnQ7IGkrKywgYSsrKQorCQlhLT5lbnRyeSA9IGk7CisKKwlyID0gcGNpX2VuYWJsZV9tc2l4KGlvYy0+cGRldiwgZW50cmllcywgaW9jLT5yZXBseV9xdWV1ZV9jb3VudCk7CiAJaWYgKHIpIHsKIAkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicGNpX2VuYWJsZV9tc2l4ICIKIAkJICAgICJmYWlsZWQgKHI9JWQpICEhIVxuIiwgaW9jLT5uYW1lLCByKSk7CisJCWtmcmVlKGVudHJpZXMpOwogCQlnb3RvIHRyeV9pb2FwaWM7CiAJfQogCi0JciA9IHJlcXVlc3RfaXJxKGVudHJpZXMudmVjdG9yLCBfYmFzZV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCSAgICBpb2MtPm5hbWUsIGlvYyk7Ci0JaWYgKHIpIHsKLQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAidW5hYmxlIHRvIGFsbG9jYXRlICIKLQkJICAgICJpbnRlcnJ1cHQgJWQgISEhXG4iLCBpb2MtPm5hbWUsIGVudHJpZXMudmVjdG9yKSk7Ci0JCXBjaV9kaXNhYmxlX21zaXgoaW9jLT5wZGV2KTsKLQkJZ290byB0cnlfaW9hcGljOwotCX0KLQotCWlvYy0+cGNpX2lycSA9IGVudHJpZXMudmVjdG9yOwogCWlvYy0+bXNpeF9lbmFibGUgPSAxOworCWZvciAoaSA9IDAsIGEgPSBlbnRyaWVzOyBpIDwgaW9jLT5yZXBseV9xdWV1ZV9jb3VudDsgaSsrLCBhKyspIHsKKwkJciA9IF9iYXNlX3JlcXVlc3RfaXJxKGlvYywgaSwgYS0+dmVjdG9yKTsKKwkJaWYgKHIpIHsKKwkJCV9iYXNlX2ZyZWVfaXJxKGlvYyk7CisJCQlfYmFzZV9kaXNhYmxlX21zaXgoaW9jKTsKKwkJCWtmcmVlKGVudHJpZXMpOworCQkJZ290byB0cnlfaW9hcGljOworCQl9CisJfQorCisJa2ZyZWUoZW50cmllcyk7CiAJcmV0dXJuIDA7CiAKIC8qIGZhaWxiYWNrIHRvIGlvX2FwaWMgaW50ZXJydXB0IHJvdXRpbmcgKi8KICB0cnlfaW9hcGljOgogCi0JciA9IHJlcXVlc3RfaXJxKGlvYy0+cGRldi0+aXJxLCBfYmFzZV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCSAgICBpb2MtPm5hbWUsIGlvYyk7Ci0JaWYgKHIpIHsKLQkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAidW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdCAlZCFcbiIsCi0JCSAgICBpb2MtPm5hbWUsIGlvYy0+cGRldi0+aXJxKTsKLQkJciA9IC1FQlVTWTsKLQkJZ290byBvdXRfZmFpbDsKLQl9CisJciA9IF9iYXNlX3JlcXVlc3RfaXJxKGlvYywgMCwgaW9jLT5wZGV2LT5pcnEpOwogCi0JaW9jLT5wY2lfaXJxID0gaW9jLT5wZGV2LT5pcnE7Ci0JcmV0dXJuIDA7Ci0KLSBvdXRfZmFpbDoKIAlyZXR1cm4gcjsKIH0KIApAQCAtMTI1MSw2ICsxNDA2LDcgQEAKIAlpbnQgaSwgciA9IDA7CiAJdTY0IHBpb19jaGlwID0gMDsKIAl1NjQgY2hpcF9waHlzID0gMDsKKwlzdHJ1Y3QgYWRhcHRlcl9yZXBseV9xdWV1ZSAqcmVwbHlfcTsKIAogCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLAogCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKSk7CkBAIC0xMzEzLDkgKzE0NjksMTEgQEAKIAlpZiAocikKIAkJZ290byBvdXRfZmFpbDsKIAotCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogSVJRICVkXG4iLAotCSAgICBpb2MtPm5hbWUsICAoKGlvYy0+bXNpeF9lbmFibGUpID8gIlBDSS1NU0ktWCBlbmFibGVkIiA6Ci0JICAgICJJTy1BUElDIGVuYWJsZWQiKSwgaW9jLT5wY2lfaXJxKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcGx5X3EsICZpb2MtPnJlcGx5X3F1ZXVlX2xpc3QsIGxpc3QpCisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogSVJRICVkXG4iLAorCQkgICAgcmVwbHlfcS0+bmFtZSwgICgoaW9jLT5tc2l4X2VuYWJsZSkgPyAiUENJLU1TSS1YIGVuYWJsZWQiIDoKKwkJICAgICJJTy1BUElDIGVuYWJsZWQiKSwgcmVwbHlfcS0+dmVjdG9yKTsKKwogCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJpb21lbSgweCUwMTZsbHgpLCBtYXBwZWQoMHglcCksIHNpemUoJWQpXG4iLAogCSAgICBpb2MtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpY2hpcF9waHlzLCBpb2MtPmNoaXAsIG1lbWFwX3N6KTsKIAlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiaW9wb3J0KDB4JTAxNmxseCksIHNpemUoJWQpXG4iLApAQCAtMTMzMCw3ICsxNDg4LDYgQEAKIAlpZiAoaW9jLT5jaGlwX3BoeXMpCiAJCWlvdW5tYXAoaW9jLT5jaGlwKTsKIAlpb2MtPmNoaXBfcGh5cyA9IDA7Ci0JaW9jLT5wY2lfaXJxID0gLTE7CiAJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhpb2MtPnBkZXYsIGlvYy0+YmFycyk7CiAJcGNpX2Rpc2FibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcocGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpAQCAtMTU3Nyw2ICsxNzM0LDEyIEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSB1OAorX2Jhc2VfZ2V0X21zaXhfaW5kZXgoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQoreworCXJldHVybiBpb2MtPmNwdV9tc2l4X3RhYmxlW3NtcF9wcm9jZXNzb3JfaWQoKV07Cit9CisKIC8qKgogICogbXB0MnNhc19iYXNlX3B1dF9zbWlkX3Njc2lfaW8gLSBzZW5kIFNDU0lfSU8gcmVxdWVzdCB0byBmaXJtd2FyZQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CkBAIC0xNTkzLDcgKzE3NTYsNyBAQAogCiAKIAlkZXNjcmlwdG9yLlNDU0lJTy5SZXF1ZXN0RmxhZ3MgPSBNUEkyX1JFUV9ERVNDUklQVF9GTEFHU19TQ1NJX0lPOwotCWRlc2NyaXB0b3IuU0NTSUlPLk1TSXhJbmRleCA9IDA7IC8qIFRPRE8gKi8KKwlkZXNjcmlwdG9yLlNDU0lJTy5NU0l4SW5kZXggPSAgX2Jhc2VfZ2V0X21zaXhfaW5kZXgoaW9jKTsKIAlkZXNjcmlwdG9yLlNDU0lJTy5TTUlEID0gY3B1X3RvX2xlMTYoc21pZCk7CiAJZGVzY3JpcHRvci5TQ1NJSU8uRGV2SGFuZGxlID0gY3B1X3RvX2xlMTYoaGFuZGxlKTsKIAlkZXNjcmlwdG9yLlNDU0lJTy5MTUlEID0gMDsKQEAgLTE2MTcsNyArMTc4MCw3IEBACiAKIAlkZXNjcmlwdG9yLkhpZ2hQcmlvcml0eS5SZXF1ZXN0RmxhZ3MgPQogCSAgICBNUEkyX1JFUV9ERVNDUklQVF9GTEFHU19ISUdIX1BSSU9SSVRZOwotCWRlc2NyaXB0b3IuSGlnaFByaW9yaXR5Lk1TSXhJbmRleCA9IDA7IC8qIFRPRE8gKi8KKwlkZXNjcmlwdG9yLkhpZ2hQcmlvcml0eS5NU0l4SW5kZXggPSAgMDsKIAlkZXNjcmlwdG9yLkhpZ2hQcmlvcml0eS5TTUlEID0gY3B1X3RvX2xlMTYoc21pZCk7CiAJZGVzY3JpcHRvci5IaWdoUHJpb3JpdHkuTE1JRCA9IDA7CiAJZGVzY3JpcHRvci5IaWdoUHJpb3JpdHkuUmVzZXJ2ZWQxID0gMDsKQEAgLTE2MzksNyArMTgwMiw3IEBACiAJdTY0ICpyZXF1ZXN0ID0gKHU2NCAqKSZkZXNjcmlwdG9yOwogCiAJZGVzY3JpcHRvci5EZWZhdWx0LlJlcXVlc3RGbGFncyA9IE1QSTJfUkVRX0RFU0NSSVBUX0ZMQUdTX0RFRkFVTFRfVFlQRTsKLQlkZXNjcmlwdG9yLkRlZmF1bHQuTVNJeEluZGV4ID0gMDsgLyogVE9ETyAqLworCWRlc2NyaXB0b3IuRGVmYXVsdC5NU0l4SW5kZXggPSAgX2Jhc2VfZ2V0X21zaXhfaW5kZXgoaW9jKTsKIAlkZXNjcmlwdG9yLkRlZmF1bHQuU01JRCA9IGNwdV90b19sZTE2KHNtaWQpOwogCWRlc2NyaXB0b3IuRGVmYXVsdC5MTUlEID0gMDsKIAlkZXNjcmlwdG9yLkRlZmF1bHQuRGVzY3JpcHRvclR5cGVEZXBlbmRlbnQgPSAwOwpAQCAtMTY2NCw3ICsxODI3LDcgQEAKIAogCWRlc2NyaXB0b3IuU0NTSVRhcmdldC5SZXF1ZXN0RmxhZ3MgPQogCSAgICBNUEkyX1JFUV9ERVNDUklQVF9GTEFHU19TQ1NJX1RBUkdFVDsKLQlkZXNjcmlwdG9yLlNDU0lUYXJnZXQuTVNJeEluZGV4ID0gMDsgLyogVE9ETyAqLworCWRlc2NyaXB0b3IuU0NTSVRhcmdldC5NU0l4SW5kZXggPSAgX2Jhc2VfZ2V0X21zaXhfaW5kZXgoaW9jKTsKIAlkZXNjcmlwdG9yLlNDU0lUYXJnZXQuU01JRCA9IGNwdV90b19sZTE2KHNtaWQpOwogCWRlc2NyaXB0b3IuU0NTSVRhcmdldC5MTUlEID0gMDsKIAlkZXNjcmlwdG9yLlNDU0lUYXJnZXQuSW9JbmRleCA9IGNwdV90b19sZTE2KGlvX2luZGV4KTsKQEAgLTIxNzEsNyArMjMzNCw3IEBACiAJdTE2IG1heF9zZ2VfZWxlbWVudHM7CiAJdTE2IG51bV9vZl9yZXBseV9mcmFtZXM7CiAJdTE2IGNoYWluc19uZWVkZWRfcGVyX2lvOwotCXUzMiBzeiwgdG90YWxfc3o7CisJdTMyIHN6LCB0b3RhbF9zeiwgcmVwbHlfcG9zdF9mcmVlX3N6OwogCXUzMiByZXRyeV9zejsKIAl1MTYgbWF4X3JlcXVlc3RfY3JlZGl0OwogCWludCBpOwpAQCAtMjQ5OCw3ICsyNjYxLDEyIEBACiAJdG90YWxfc3ogKz0gc3o7CiAKIAkvKiByZXBseSBwb3N0IHF1ZXVlLCAxNiBieXRlIGFsaWduICovCi0Jc3ogPSBpb2MtPnJlcGx5X3Bvc3RfcXVldWVfZGVwdGggKiBzaXplb2YoTXBpMkRlZmF1bHRSZXBseURlc2NyaXB0b3JfdCk7CisJcmVwbHlfcG9zdF9mcmVlX3N6ID0gaW9jLT5yZXBseV9wb3N0X3F1ZXVlX2RlcHRoICoKKwkgICAgc2l6ZW9mKE1waTJEZWZhdWx0UmVwbHlEZXNjcmlwdG9yX3QpOworCWlmIChfYmFzZV9pc19jb250cm9sbGVyX21zaXhfZW5hYmxlZChpb2MpKQorCQlzeiA9IHJlcGx5X3Bvc3RfZnJlZV9zeiAqIGlvYy0+cmVwbHlfcXVldWVfY291bnQ7CisJZWxzZQorCQlzeiA9IHJlcGx5X3Bvc3RfZnJlZV9zejsKIAlpb2MtPnJlcGx5X3Bvc3RfZnJlZV9kbWFfcG9vbCA9IHBjaV9wb29sX2NyZWF0ZSgicmVwbHlfcG9zdF9mcmVlIHBvb2wiLAogCSAgICBpb2MtPnBkZXYsIHN6LCAxNiwgMCk7CiAJaWYgKCFpb2MtPnJlcGx5X3Bvc3RfZnJlZV9kbWFfcG9vbCkgewpAQCAtMzE4Niw2ICszMzU0LDcgQEAKIAlmYWN0cy0+TWF4Q2hhaW5EZXB0aCA9IG1waV9yZXBseS5NYXhDaGFpbkRlcHRoOwogCWZhY3RzLT5XaG9Jbml0ID0gbXBpX3JlcGx5Lldob0luaXQ7CiAJZmFjdHMtPk51bWJlck9mUG9ydHMgPSBtcGlfcmVwbHkuTnVtYmVyT2ZQb3J0czsKKwlmYWN0cy0+TWF4TVNJeFZlY3RvcnMgPSBtcGlfcmVwbHkuTWF4TVNJeFZlY3RvcnM7CiAJZmFjdHMtPlJlcXVlc3RDcmVkaXQgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHkuUmVxdWVzdENyZWRpdCk7CiAJZmFjdHMtPk1heFJlcGx5RGVzY3JpcHRvclBvc3RRdWV1ZURlcHRoID0KIAkgICAgbGUxNl90b19jcHUobXBpX3JlcGx5Lk1heFJlcGx5RGVzY3JpcHRvclBvc3RRdWV1ZURlcHRoKTsKQEAgLTMyNDMsNyArMzQxMiw4IEBACiAJbXBpX3JlcXVlc3QuTXNnVmVyc2lvbiA9IGNwdV90b19sZTE2KE1QSTJfVkVSU0lPTik7CiAJbXBpX3JlcXVlc3QuSGVhZGVyVmVyc2lvbiA9IGNwdV90b19sZTE2KE1QSTJfSEVBREVSX1ZFUlNJT04pOwogCi0KKwlpZiAoX2Jhc2VfaXNfY29udHJvbGxlcl9tc2l4X2VuYWJsZWQoaW9jKSkKKwkJbXBpX3JlcXVlc3QuSG9zdE1TSXhWZWN0b3JzID0gaW9jLT5yZXBseV9xdWV1ZV9jb3VudDsKIAltcGlfcmVxdWVzdC5TeXN0ZW1SZXF1ZXN0RnJhbWVTaXplID0gY3B1X3RvX2xlMTYoaW9jLT5yZXF1ZXN0X3N6LzQpOwogCW1waV9yZXF1ZXN0LlJlcGx5RGVzY3JpcHRvclBvc3RRdWV1ZURlcHRoID0KIAkgICAgY3B1X3RvX2xlMTYoaW9jLT5yZXBseV9wb3N0X3F1ZXVlX2RlcHRoKTsKQEAgLTMzMDIsNiArMzQ3Miw1OCBAQAogfQogCiAvKioKKyAqIG1wdDJzYXNfcG9ydF9lbmFibGVfZG9uZSAtIGNvbW1hbmQgY29tcGxldGlvbiByb3V0aW5lIGZvciBwb3J0IGVuYWJsZQorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAc21pZDogc3lzdGVtIHJlcXVlc3QgbWVzc2FnZSBpbmRleAorICogQG1zaXhfaW5kZXg6IE1TSVggdGFibGUgaW5kZXggc3VwcGxpZWQgYnkgdGhlIE9TCisgKiBAcmVwbHk6IHJlcGx5IG1lc3NhZ2UgZnJhbWUobG93ZXIgMzJiaXQgYWRkcikKKyAqCisgKiBSZXR1cm4gMSBtZWFuaW5nIG1mIHNob3VsZCBiZSBmcmVlZCBmcm9tIF9iYXNlX2ludGVycnVwdAorICogICAgICAgIDAgbWVhbnMgdGhlIG1mIGlzIGZyZWVkIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAqLwordTgKK21wdDJzYXNfcG9ydF9lbmFibGVfZG9uZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLCB1OCBtc2l4X2luZGV4LAorCXUzMiByZXBseSkKK3sKKwlNUEkyRGVmYXVsdFJlcGx5X3QgKm1waV9yZXBseTsKKwl1MTYgaW9jX3N0YXR1czsKKworCW1waV9yZXBseSA9IG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOworCWlmIChtcGlfcmVwbHkgJiYgbXBpX3JlcGx5LT5GdW5jdGlvbiA9PSBNUEkyX0ZVTkNUSU9OX0VWRU5UX0FDSykKKwkJcmV0dXJuIDE7CisKKwlpZiAoaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyA9PSBNUFQyX0NNRF9OT1RfVVNFRCkKKwkJcmV0dXJuIDE7CisKKwlpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc3RhdHVzIHw9IE1QVDJfQ01EX0NPTVBMRVRFOworCWlmIChtcGlfcmVwbHkpIHsKKwkJaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyB8PSBNUFQyX0NNRF9SRVBMWV9WQUxJRDsKKwkJbWVtY3B5KGlvYy0+cG9ydF9lbmFibGVfY21kcy5yZXBseSwgbXBpX3JlcGx5LAorCQkgICAgbXBpX3JlcGx5LT5Nc2dMZW5ndGgqNCk7CisJfQorCWlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgJj0gfk1QVDJfQ01EX1BFTkRJTkc7CisKKwlpb2Nfc3RhdHVzID0gbGUxNl90b19jcHUobXBpX3JlcGx5LT5JT0NTdGF0dXMpICYgTVBJMl9JT0NTVEFUVVNfTUFTSzsKKworCWlmIChpb2Nfc3RhdHVzICE9IE1QSTJfSU9DU1RBVFVTX1NVQ0NFU1MpCisJCWlvYy0+cG9ydF9lbmFibGVfZmFpbGVkID0gMTsKKworCWlmIChpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKSB7CisJCWlmIChpb2Nfc3RhdHVzID09IE1QSTJfSU9DU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCW1wdDJzYXNfcG9ydF9lbmFibGVfY29tcGxldGUoaW9jKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJaW9jLT5zdGFydF9zY2FuX2ZhaWxlZCA9IGlvY19zdGF0dXM7CisJCQlpb2MtPnN0YXJ0X3NjYW4gPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJY29tcGxldGUoJmlvYy0+cG9ydF9lbmFibGVfY21kcy5kb25lKTsKKwlyZXR1cm4gMTsKK30KKworCisvKioKICAqIF9iYXNlX3NlbmRfcG9ydF9lbmFibGUgLSBzZW5kIHBvcnRfZW5hYmxlKGRpc2NvdmVyeSBzdHVmZikgdG8gZmlybXdhcmUKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQHNsZWVwX2ZsYWc6IENBTl9TTEVFUCBvciBOT19TTEVFUApAQCAtMzMxMiw2NyArMzUzNCwxNTEgQEAKIF9iYXNlX3NlbmRfcG9ydF9lbmFibGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBfZmxhZykKIHsKIAlNcGkyUG9ydEVuYWJsZVJlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7Ci0JdTMyIGlvY19zdGF0ZTsKKwlNcGkyUG9ydEVuYWJsZVJlcGx5X3QgKm1waV9yZXBseTsKIAl1bnNpZ25lZCBsb25nIHRpbWVsZWZ0OwogCWludCByID0gMDsKIAl1MTYgc21pZDsKKwl1MTYgaW9jX3N0YXR1czsKIAogCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZW5kaW5nIHBvcnQgZW5hYmxlICEhXG4iLCBpb2MtPm5hbWUpOwogCi0JaWYgKGlvYy0+YmFzZV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX1BFTkRJTkcpIHsKKwlpZiAoaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX1BFTkRJTkcpIHsKIAkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGludGVybmFsIGNvbW1hbmQgYWxyZWFkeSBpbiB1c2VcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0Jc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZChpb2MsIGlvYy0+YmFzZV9jYl9pZHgpOworCXNtaWQgPSBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWQoaW9jLCBpb2MtPnBvcnRfZW5hYmxlX2NiX2lkeCk7CiAJaWYgKCFzbWlkKSB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgb2J0YWluaW5nIGEgc21pZFxuIiwKIAkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKLQlpb2MtPmJhc2VfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9QRU5ESU5HOworCWlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9QRU5ESU5HOwogCW1waV9yZXF1ZXN0ID0gbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUoaW9jLCBzbWlkKTsKLQlpb2MtPmJhc2VfY21kcy5zbWlkID0gc21pZDsKKwlpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc21pZCA9IHNtaWQ7CiAJbWVtc2V0KG1waV9yZXF1ZXN0LCAwLCBzaXplb2YoTXBpMlBvcnRFbmFibGVSZXF1ZXN0X3QpKTsKIAltcGlfcmVxdWVzdC0+RnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX1BPUlRfRU5BQkxFOwotCW1waV9yZXF1ZXN0LT5WRl9JRCA9IDA7IC8qIFRPRE8gKi8KLQltcGlfcmVxdWVzdC0+VlBfSUQgPSAwOwogCisJaW5pdF9jb21wbGV0aW9uKCZpb2MtPnBvcnRfZW5hYmxlX2NtZHMuZG9uZSk7CiAJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKLQlpbml0X2NvbXBsZXRpb24oJmlvYy0+YmFzZV9jbWRzLmRvbmUpOwotCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPmJhc2VfY21kcy5kb25lLAorCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPnBvcnRfZW5hYmxlX2NtZHMuZG9uZSwKIAkgICAgMzAwKkhaKTsKLQlpZiAoIShpb2MtPmJhc2VfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9DT01QTEVURSkpIHsKKwlpZiAoIShpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc3RhdHVzICYgTVBUMl9DTURfQ09NUExFVEUpKSB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiB0aW1lb3V0XG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CiAJCV9kZWJ1Z19kdW1wX21mKG1waV9yZXF1ZXN0LAogCQkgICAgc2l6ZW9mKE1waTJQb3J0RW5hYmxlUmVxdWVzdF90KS80KTsKLQkJaWYgKGlvYy0+YmFzZV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX1JFU0VUKQorCQlpZiAoaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX1JFU0VUKQogCQkJciA9IC1FRkFVTFQ7CiAJCWVsc2UKIAkJCXIgPSAtRVRJTUU7CiAJCWdvdG8gb3V0OwotCX0gZWxzZQotCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogY29tcGxldGVcbiIsCi0JCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKSk7CisJfQorCW1waV9yZXBseSA9IGlvYy0+cG9ydF9lbmFibGVfY21kcy5yZXBseTsKIAotCWlvY19zdGF0ZSA9IF9iYXNlX3dhaXRfb25faW9jc3RhdGUoaW9jLCBNUEkyX0lPQ19TVEFURV9PUEVSQVRJT05BTCwKLQkgICAgNjAsIHNsZWVwX2ZsYWcpOwotCWlmIChpb2Nfc3RhdGUpIHsKLQkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCBnb2luZyB0byBvcGVyYXRpb25hbCBzdGF0ZSAiCi0JCSAgICAiIChpb2Nfc3RhdGU9MHgleClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sIGlvY19zdGF0ZSk7CisJaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS0+SU9DU3RhdHVzKSAmIE1QSTJfSU9DU1RBVFVTX01BU0s7CisJaWYgKGlvY19zdGF0dXMgIT0gTVBJMl9JT0NTVEFUVVNfU1VDQ0VTUykgeworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogZmFpbGVkIHdpdGggKGlvY19zdGF0dXM9MHglMDh4KVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIGlvY19zdGF0dXMpOwogCQlyID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CiAJfQogIG91dDoKLQlpb2MtPmJhc2VfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9OT1RfVVNFRDsKLQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicG9ydCBlbmFibGU6ICVzXG4iLAotCSAgICBpb2MtPm5hbWUsICgociA9PSAwKSA/ICJTVUNDRVNTIiA6ICJGQUlMRUQiKSk7CisJaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyA9IE1QVDJfQ01EX05PVF9VU0VEOworCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJwb3J0IGVuYWJsZTogJXNcbiIsIGlvYy0+bmFtZSwgKChyID09IDApID8KKwkgICAgIlNVQ0NFU1MiIDogIkZBSUxFRCIpKTsKIAlyZXR1cm4gcjsKIH0KIAogLyoqCisgKiBtcHQyc2FzX3BvcnRfZW5hYmxlIC0gaW5pdGlhdGUgZmlybXdhcmUgZGlzY292ZXJ5IChkb24ndCB3YWl0IGZvciByZXBseSkKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCisgKi8KK2ludAorbXB0MnNhc19wb3J0X2VuYWJsZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCit7CisJTXBpMlBvcnRFbmFibGVSZXF1ZXN0X3QgKm1waV9yZXF1ZXN0OworCXUxNiBzbWlkOworCisJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInNlbmRpbmcgcG9ydCBlbmFibGUgISFcbiIsIGlvYy0+bmFtZSk7CisKKwlpZiAoaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX1BFTkRJTkcpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGludGVybmFsIGNvbW1hbmQgYWxyZWFkeSBpbiB1c2VcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZChpb2MsIGlvYy0+cG9ydF9lbmFibGVfY2JfaWR4KTsKKwlpZiAoIXNtaWQpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCBvYnRhaW5pbmcgYSBzbWlkXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9QRU5ESU5HOworCW1waV9yZXF1ZXN0ID0gbXB0MnNhc19iYXNlX2dldF9tc2dfZnJhbWUoaW9jLCBzbWlkKTsKKwlpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc21pZCA9IHNtaWQ7CisJbWVtc2V0KG1waV9yZXF1ZXN0LCAwLCBzaXplb2YoTXBpMlBvcnRFbmFibGVSZXF1ZXN0X3QpKTsKKwltcGlfcmVxdWVzdC0+RnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX1BPUlRfRU5BQkxFOworCisJbXB0MnNhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBfYmFzZV9kZXRlcm1pbmVfd2FpdF9vbl9kaXNjb3ZlcnkgLSBkZXNwb3NpdGlvbgorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKgorICogRGVjaWRlIHdoZXRoZXIgdG8gd2FpdCBvbiBkaXNjb3ZlcnkgdG8gY29tcGxldGUuIFVzZWQgdG8gZWl0aGVyCisgKiBsb2NhdGUgYm9vdCBkZXZpY2UsIG9yIHJlcG9ydCB2b2x1bWVzIGFoZWFkIG9mIHBoeXNpY2FsIGRldmljZXMuCisgKgorICogUmV0dXJucyAxIGZvciB3YWl0LCAwIGZvciBkb24ndCB3YWl0CisgKi8KK3N0YXRpYyBpbnQKK19iYXNlX2RldGVybWluZV93YWl0X29uX2Rpc2NvdmVyeShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCit7CisJLyogV2Ugd2FpdCBmb3IgZGlzY292ZXJ5IHRvIGNvbXBsZXRlIGlmIElSIGZpcm13YXJlIGlzIGxvYWRlZC4KKwkgKiBUaGUgc2FzIHRvcG9sb2d5IGV2ZW50cyBhcnJpdmUgYmVmb3JlIFBEIGV2ZW50cywgc28gd2UgbmVlZCB0aW1lIHRvCisJICogdHVybiBvbiB0aGUgYml0IGluIGlvYy0+cGRfaGFuZGxlcyB0byBpbmRpY2F0ZSBQRAorCSAqIEFsc28sIGl0IG1heWJlIHJlcXVpcmVkIHRvIHJlcG9ydCBWb2x1bWVzIGFoZWFkIG9mIHBoeXNpY2FsCisJICogZGV2aWNlcyB3aGVuIE1QSTJfSU9DUEFHRThfSVJGTEFHU19MT1dfVk9MVU1FX01BUFBJTkcgaXMgc2V0LgorCSAqLworCWlmIChpb2MtPmlyX2Zpcm13YXJlKQorCQlyZXR1cm4gMTsKKworCS8qIGlmIG5vIEJpb3MsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byB3YWl0ICovCisJaWYgKCFpb2MtPmJpb3NfcGczLkJpb3NWZXJzaW9uKQorCQlyZXR1cm4gMDsKKworCS8qIEJpb3MgaXMgcHJlc2VudCwgdGhlbiB3ZSBkcm9wIGRvd24gaGVyZS4KKwkgKgorCSAqIElmIHRoZXJlIGFueSBlbnRyaWVzIGluIHRoZSBCaW9zIFBhZ2UgMiwgdGhlbiB3ZSB3YWl0CisJICogZm9yIGRpc2NvdmVyeSB0byBjb21wbGV0ZS4KKwkgKi8KKworCS8qIEN1cnJlbnQgQm9vdCBEZXZpY2UgKi8KKwlpZiAoKGlvYy0+Ymlvc19wZzIuQ3VycmVudEJvb3REZXZpY2VGb3JtICYKKwkgICAgTVBJMl9CSU9TUEFHRTJfRk9STV9NQVNLKSA9PQorCSAgICBNUEkyX0JJT1NQQUdFMl9GT1JNX05PX0RFVklDRV9TUEVDSUZJRUQgJiYKKwkvKiBSZXF1ZXN0IEJvb3QgRGV2aWNlICovCisJICAgKGlvYy0+Ymlvc19wZzIuUmVxQm9vdERldmljZUZvcm0gJgorCSAgICBNUEkyX0JJT1NQQUdFMl9GT1JNX01BU0spID09CisJICAgIE1QSTJfQklPU1BBR0UyX0ZPUk1fTk9fREVWSUNFX1NQRUNJRklFRCAmJgorCS8qIEFsdGVybmF0ZSBSZXF1ZXN0IEJvb3QgRGV2aWNlICovCisJICAgKGlvYy0+Ymlvc19wZzIuUmVxQWx0Qm9vdERldmljZUZvcm0gJgorCSAgICBNUEkyX0JJT1NQQUdFMl9GT1JNX01BU0spID09CisJICAgIE1QSTJfQklPU1BBR0UyX0ZPUk1fTk9fREVWSUNFX1NQRUNJRklFRCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworCisvKioKICAqIF9iYXNlX3VubWFza19ldmVudHMgLSB0dXJuIG9uIG5vdGlmaWNhdGlvbiBmb3IgdGhpcyBldmVudAogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAZXZlbnQ6IGZpcm13YXJlIGV2ZW50CkBAIC0zNTEyLDkgKzM4MTgsNiBAQAogCXUzMiBoY2Jfc2l6ZTsKIAogCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZW5kaW5nIGRpYWcgcmVzZXQgISFcbiIsIGlvYy0+bmFtZSk7Ci0KLQlfYmFzZV9zYXZlX21zaXhfdGFibGUoaW9jKTsKLQogCWRyc3ByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJjbGVhciBpbnRlcnJ1cHRzXG4iLAogCSAgICBpb2MtPm5hbWUpKTsKIApAQCAtMzYxMCw3ICszOTEzLDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JX2Jhc2VfcmVzdG9yZV9tc2l4X3RhYmxlKGlvYyk7CiAJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImRpYWcgcmVzZXQ6IFNVQ0NFU1NcbiIsIGlvYy0+bmFtZSk7CiAJcmV0dXJuIDA7CiAKQEAgLTM2OTEsNiArMzk5Myw5IEBACiAJdTE2IHNtaWQ7CiAJc3RydWN0IF90cl9saXN0ICpkZWxheWVkX3RyLCAqZGVsYXllZF90cl9uZXh0OwogCXU4IGhpZGVfZmxhZzsKKwlzdHJ1Y3QgYWRhcHRlcl9yZXBseV9xdWV1ZSAqcmVwbHlfcTsKKwlsb25nIHJlcGx5X3Bvc3RfZnJlZTsKKwl1MzIgcmVwbHlfcG9zdF9mcmVlX3N6OwogCiAJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKQEAgLTM3NTYsMjEgKzQwNjEsNDYgQEAKIAkgICAgaW9jLT5yZXBseV9zeikKIAkJaW9jLT5yZXBseV9mcmVlW2ldID0gY3B1X3RvX2xlMzIocmVwbHlfYWRkcmVzcyk7CiAKKwkvKiBpbml0aWFsaXplIHJlcGx5IHF1ZXVlcyAqLworCV9iYXNlX2Fzc2lnbl9yZXBseV9xdWV1ZXMoaW9jKTsKKwogCS8qIGluaXRpYWxpemUgUmVwbHkgUG9zdCBGcmVlIFF1ZXVlICovCi0JZm9yIChpID0gMDsgaSA8IGlvYy0+cmVwbHlfcG9zdF9xdWV1ZV9kZXB0aDsgaSsrKQotCQlpb2MtPnJlcGx5X3Bvc3RfZnJlZVtpXS5Xb3JkcyA9IGNwdV90b19sZTY0KFVMTE9OR19NQVgpOworCXJlcGx5X3Bvc3RfZnJlZSA9IChsb25nKWlvYy0+cmVwbHlfcG9zdF9mcmVlOworCXJlcGx5X3Bvc3RfZnJlZV9zeiA9IGlvYy0+cmVwbHlfcG9zdF9xdWV1ZV9kZXB0aCAqCisJICAgIHNpemVvZihNcGkyRGVmYXVsdFJlcGx5RGVzY3JpcHRvcl90KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcGx5X3EsICZpb2MtPnJlcGx5X3F1ZXVlX2xpc3QsIGxpc3QpIHsKKwkJcmVwbHlfcS0+cmVwbHlfcG9zdF9ob3N0X2luZGV4ID0gMDsKKwkJcmVwbHlfcS0+cmVwbHlfcG9zdF9mcmVlID0gKE1waTJSZXBseURlc2NyaXB0b3JzVW5pb25fdCAqKQorCQkgICAgcmVwbHlfcG9zdF9mcmVlOworCQlmb3IgKGkgPSAwOyBpIDwgaW9jLT5yZXBseV9wb3N0X3F1ZXVlX2RlcHRoOyBpKyspCisJCQlyZXBseV9xLT5yZXBseV9wb3N0X2ZyZWVbaV0uV29yZHMgPQorCQkJCQkJCWNwdV90b19sZTY0KFVMTE9OR19NQVgpOworCQlpZiAoIV9iYXNlX2lzX2NvbnRyb2xsZXJfbXNpeF9lbmFibGVkKGlvYykpCisJCQlnb3RvIHNraXBfaW5pdF9yZXBseV9wb3N0X2ZyZWVfcXVldWU7CisJCXJlcGx5X3Bvc3RfZnJlZSArPSByZXBseV9wb3N0X2ZyZWVfc3o7CisJfQorIHNraXBfaW5pdF9yZXBseV9wb3N0X2ZyZWVfcXVldWU6CiAKIAlyID0gX2Jhc2Vfc2VuZF9pb2NfaW5pdChpb2MsIHNsZWVwX2ZsYWcpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCS8qIGluaXRpYWxpemUgdGhlIGluZGV4J3MgKi8KKwkvKiBpbml0aWFsaXplIHJlcGx5IGZyZWUgaG9zdCBpbmRleCAqLwogCWlvYy0+cmVwbHlfZnJlZV9ob3N0X2luZGV4ID0gaW9jLT5yZXBseV9mcmVlX3F1ZXVlX2RlcHRoIC0gMTsKLQlpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCA9IDA7CiAJd3JpdGVsKGlvYy0+cmVwbHlfZnJlZV9ob3N0X2luZGV4LCAmaW9jLT5jaGlwLT5SZXBseUZyZWVIb3N0SW5kZXgpOwotCXdyaXRlbCgwLCAmaW9jLT5jaGlwLT5SZXBseVBvc3RIb3N0SW5kZXgpOworCisJLyogaW5pdGlhbGl6ZSByZXBseSBwb3N0IGhvc3QgaW5kZXggKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcGx5X3EsICZpb2MtPnJlcGx5X3F1ZXVlX2xpc3QsIGxpc3QpIHsKKwkJd3JpdGVsKHJlcGx5X3EtPm1zaXhfaW5kZXggPDwgTVBJMl9SUEhJX01TSVhfSU5ERVhfU0hJRlQsCisJCSAgICAmaW9jLT5jaGlwLT5SZXBseVBvc3RIb3N0SW5kZXgpOworCQlpZiAoIV9iYXNlX2lzX2NvbnRyb2xsZXJfbXNpeF9lbmFibGVkKGlvYykpCisJCQlnb3RvIHNraXBfaW5pdF9yZXBseV9wb3N0X2hvc3RfaW5kZXg7CisJfQorCisgc2tpcF9pbml0X3JlcGx5X3Bvc3RfaG9zdF9pbmRleDoKIAogCV9iYXNlX3VubWFza19pbnRlcnJ1cHRzKGlvYyk7CisKIAlyID0gX2Jhc2VfZXZlbnRfbm90aWZpY2F0aW9uKGlvYywgc2xlZXBfZmxhZyk7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtMzc3OCw3ICs0MTA4LDE4IEBACiAJaWYgKHNsZWVwX2ZsYWcgPT0gQ0FOX1NMRUVQKQogCQlfYmFzZV9zdGF0aWNfY29uZmlnX3BhZ2VzKGlvYyk7CiAKLQlpZiAoaW9jLT53YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZSAmJiBpb2MtPmlzX3dhcnBkcml2ZSkgeworCisJaWYgKGlvYy0+aXNfZHJpdmVyX2xvYWRpbmcpIHsKKworCisKKwkJaW9jLT53YWl0X2Zvcl9kaXNjb3ZlcnlfdG9fY29tcGxldGUgPQorCQkgICAgX2Jhc2VfZGV0ZXJtaW5lX3dhaXRfb25fZGlzY292ZXJ5KGlvYyk7CisJCXJldHVybiByOyAvKiBzY2FuX3N0YXJ0IGFuZCBzY2FuX2ZpbmlzaGVkIHN1cHBvcnQgKi8KKwl9CisKKworCWlmIChpb2MtPndhaXRfZm9yX2Rpc2NvdmVyeV90b19jb21wbGV0ZSAmJiBpb2MtPmlzX3dhcnBkcml2ZSkgewogCQlpZiAoaW9jLT5tYW51X3BnMTAuT0VNSWRlbnRpZmllciAgPT0gMHg4MCkgewogCQkJaGlkZV9mbGFnID0gKHU4KSAoaW9jLT5tYW51X3BnMTAuT0VNU3BlY2lmaWNGbGFnczAgJgogCQkJICAgIE1GR19QQUdFMTBfSElERV9TU0RTX01BU0spOwpAQCAtMzc4NywxMyArNDEyOCw2IEBACiAJCX0KIAl9CiAKLQlpZiAoaW9jLT53YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZSkgewotCQlpZiAoZGlhZ19idWZmZXJfZW5hYmxlICE9IDApCi0JCQltcHQyc2FzX2VuYWJsZV9kaWFnX2J1ZmZlcihpb2MsIGRpYWdfYnVmZmVyX2VuYWJsZSk7Ci0JCWlmIChkaXNhYmxlX2Rpc2NvdmVyeSA+IDApCi0JCQlyZXR1cm4gcjsKLQl9Ci0KIAlyID0gX2Jhc2Vfc2VuZF9wb3J0X2VuYWJsZShpb2MsIHNsZWVwX2ZsYWcpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTM4MTksMTQgKzQxNTMsMTAgQEAKIAlpb2MtPnNob3N0X3JlY292ZXJ5ID0gMTsKIAlfYmFzZV9tYWtlX2lvY19yZWFkeShpb2MsIENBTl9TTEVFUCwgU09GVF9SRVNFVCk7CiAJaW9jLT5zaG9zdF9yZWNvdmVyeSA9IDA7Ci0JaWYgKGlvYy0+cGNpX2lycSkgewotCQlzeW5jaHJvbml6ZV9pcnEocGRldi0+aXJxKTsKLQkJZnJlZV9pcnEoaW9jLT5wY2lfaXJxLCBpb2MpOwotCX0KKwlfYmFzZV9mcmVlX2lycShpb2MpOwogCV9iYXNlX2Rpc2FibGVfbXNpeChpb2MpOwogCWlmIChpb2MtPmNoaXBfcGh5cykKIAkJaW91bm1hcChpb2MtPmNoaXApOwotCWlvYy0+cGNpX2lycSA9IC0xOwogCWlvYy0+Y2hpcF9waHlzID0gMDsKIAlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKGlvYy0+cGRldiwgaW9jLT5iYXJzKTsKIAlwY2lfZGlzYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwZGV2KTsKQEAgLTM4NDQsMTQgKzQxNzQsNTAgQEAKIG1wdDJzYXNfYmFzZV9hdHRhY2goc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQogewogCWludCByLCBpOworCWludCBjcHVfaWQsIGxhc3RfY3B1X2lkID0gMDsKIAogCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKKwkvKiBzZXR1cCBjcHVfbXNpeF90YWJsZSAqLworCWlvYy0+Y3B1X2NvdW50ID0gbnVtX29ubGluZV9jcHVzKCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHVfaWQpCisJCWxhc3RfY3B1X2lkID0gY3B1X2lkOworCWlvYy0+Y3B1X21zaXhfdGFibGVfc3ogPSBsYXN0X2NwdV9pZCArIDE7CisJaW9jLT5jcHVfbXNpeF90YWJsZSA9IGt6YWxsb2MoaW9jLT5jcHVfbXNpeF90YWJsZV9zeiwgR0ZQX0tFUk5FTCk7CisJaW9jLT5yZXBseV9xdWV1ZV9jb3VudCA9IDE7CisJaWYgKCFpb2MtPmNwdV9tc2l4X3RhYmxlKSB7CisJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImFsbG9jYXRpb24gZm9yICIKKwkJICAgICJjcHVfbXNpeF90YWJsZSBmYWlsZWQhISFcbiIsIGlvYy0+bmFtZSkpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CisJfQorCisJaWYgKGlvYy0+aXNfd2FycGRyaXZlKSB7CisJCWlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4ID0ga2NhbGxvYyhpb2MtPmNwdV9tc2l4X3RhYmxlX3N6LAorCQkgICAgc2l6ZW9mKHJlc291cmNlX3NpemVfdCAqKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXgpIHsKKwkJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImFsbG9jYXRpb24gIgorCQkJCSJmb3IgY3B1X21zaXhfdGFibGUgZmFpbGVkISEhXG4iLCBpb2MtPm5hbWUpKTsKKwkJCXIgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CisJCX0KKwl9CisKIAlyID0gbXB0MnNhc19iYXNlX21hcF9yZXNvdXJjZXMoaW9jKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKKwlpZiAoaW9jLT5pc193YXJwZHJpdmUpIHsKKwkJaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhbMF0gPQorCQkgICAgKHJlc291cmNlX3NpemVfdCAqKSZpb2MtPmNoaXAtPlJlcGx5UG9zdEhvc3RJbmRleDsKKworCQlmb3IgKGkgPSAxOyBpIDwgaW9jLT5jcHVfbXNpeF90YWJsZV9zejsgaSsrKQorCQkJaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhbaV0gPSAocmVzb3VyY2Vfc2l6ZV90ICopCisJCQkoKHU4ICopJmlvYy0+Y2hpcC0+RG9vcmJlbGwgKyAoMHg0MDAwICsgKChpIC0gMSkKKwkJCSogNCkpKTsKKwl9CisKIAlwY2lfc2V0X2RydmRhdGEoaW9jLT5wZGV2LCBpb2MtPnNob3N0KTsKIAlyID0gX2Jhc2VfZ2V0X2lvY19mYWN0cyhpb2MsIENBTl9TTEVFUCk7CiAJaWYgKHIpCkBAIC0zODk4LDYgKzQyNjQsMTAgQEAKIAlpb2MtPmJhc2VfY21kcy5yZXBseSA9IGt6YWxsb2MoaW9jLT5yZXBseV9zeiwgR0ZQX0tFUk5FTCk7CiAJaW9jLT5iYXNlX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CiAKKwkvKiBwb3J0X2VuYWJsZSBjb21tYW5kIGJpdHMgKi8KKwlpb2MtPnBvcnRfZW5hYmxlX2NtZHMucmVwbHkgPSBremFsbG9jKGlvYy0+cmVwbHlfc3osIEdGUF9LRVJORUwpOworCWlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9OT1RfVVNFRDsKKwogCS8qIHRyYW5zcG9ydCBpbnRlcm5hbCBjb21tYW5kIGJpdHMgKi8KIAlpb2MtPnRyYW5zcG9ydF9jbWRzLnJlcGx5ID0ga3phbGxvYyhpb2MtPnJlcGx5X3N6LCBHRlBfS0VSTkVMKTsKIAlpb2MtPnRyYW5zcG9ydF9jbWRzLnN0YXR1cyA9IE1QVDJfQ01EX05PVF9VU0VEOwpAQCAtMzkzOSw4ICs0MzA5LDYgQEAKIAkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CiAJfQogCi0JaW5pdF9jb21wbGV0aW9uKCZpb2MtPnNob3N0X3JlY292ZXJ5X2RvbmUpOwotCiAJZm9yIChpID0gMDsgaSA8IE1QSTJfRVZFTlRfTk9USUZZX0VWRU5UTUFTS19XT1JEUzsgaSsrKQogCQlpb2MtPmV2ZW50X21hc2tzW2ldID0gLTE7CiAKQEAgLTM5NjMsNyArNDMzMSw2IEBACiAJCV9iYXNlX3VwZGF0ZV9taXNzaW5nX2RlbGF5KGlvYywgbWlzc2luZ19kZWxheVswXSwKIAkJICAgIG1pc3NpbmdfZGVsYXlbMV0pOwogCi0JbXB0MnNhc19iYXNlX3N0YXJ0X3dhdGNoZG9nKGlvYyk7CiAJcmV0dXJuIDA7CiAKICBvdXRfZnJlZV9yZXNvdXJjZXM6CkBAIC0zOTcyLDEyICs0MzM5LDE2IEBACiAJbXB0MnNhc19iYXNlX2ZyZWVfcmVzb3VyY2VzKGlvYyk7CiAJX2Jhc2VfcmVsZWFzZV9tZW1vcnlfcG9vbHMoaW9jKTsKIAlwY2lfc2V0X2RydmRhdGEoaW9jLT5wZGV2LCBOVUxMKTsKKwlrZnJlZShpb2MtPmNwdV9tc2l4X3RhYmxlKTsKKwlpZiAoaW9jLT5pc193YXJwZHJpdmUpCisJCWtmcmVlKGlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4KTsKIAlrZnJlZShpb2MtPnBkX2hhbmRsZXMpOwogCWtmcmVlKGlvYy0+dG1fY21kcy5yZXBseSk7CiAJa2ZyZWUoaW9jLT50cmFuc3BvcnRfY21kcy5yZXBseSk7CiAJa2ZyZWUoaW9jLT5zY3NpaF9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPmNvbmZpZ19jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPmJhc2VfY21kcy5yZXBseSk7CisJa2ZyZWUoaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPmN0bF9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPmN0bF9jbWRzLnNlbnNlKTsKIAlrZnJlZShpb2MtPnBmYWN0cyk7CkBAIC00MDA5LDExICs0MzgwLDE1IEBACiAJbXB0MnNhc19iYXNlX2ZyZWVfcmVzb3VyY2VzKGlvYyk7CiAJX2Jhc2VfcmVsZWFzZV9tZW1vcnlfcG9vbHMoaW9jKTsKIAlwY2lfc2V0X2RydmRhdGEoaW9jLT5wZGV2LCBOVUxMKTsKKwlrZnJlZShpb2MtPmNwdV9tc2l4X3RhYmxlKTsKKwlpZiAoaW9jLT5pc193YXJwZHJpdmUpCisJCWtmcmVlKGlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4KTsKIAlrZnJlZShpb2MtPnBkX2hhbmRsZXMpOwogCWtmcmVlKGlvYy0+cGZhY3RzKTsKIAlrZnJlZShpb2MtPmN0bF9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPmN0bF9jbWRzLnNlbnNlKTsKIAlrZnJlZShpb2MtPmJhc2VfY21kcy5yZXBseSk7CisJa2ZyZWUoaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPnRtX2NtZHMucmVwbHkpOwogCWtmcmVlKGlvYy0+dHJhbnNwb3J0X2NtZHMucmVwbHkpOwogCWtmcmVlKGlvYy0+c2NzaWhfY21kcy5yZXBseSk7CkBAIC00MDU1LDYgKzQ0MzAsMjAgQEAKIAkJCW1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoaW9jLCBpb2MtPmJhc2VfY21kcy5zbWlkKTsKIAkJCWNvbXBsZXRlKCZpb2MtPmJhc2VfY21kcy5kb25lKTsKIAkJfQorCQlpZiAoaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX1BFTkRJTkcpIHsKKwkJCWlvYy0+cG9ydF9lbmFibGVfZmFpbGVkID0gMTsKKwkJCWlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgfD0gTVBUMl9DTURfUkVTRVQ7CisJCQltcHQyc2FzX2Jhc2VfZnJlZV9zbWlkKGlvYywgaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnNtaWQpOworCQkJaWYgKGlvYy0+aXNfZHJpdmVyX2xvYWRpbmcpIHsKKwkJCQlpb2MtPnN0YXJ0X3NjYW5fZmFpbGVkID0KKwkJCQkgICAgTVBJMl9JT0NTVEFUVVNfSU5URVJOQUxfRVJST1I7CisJCQkJaW9jLT5zdGFydF9zY2FuID0gMDsKKwkJCQlpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc3RhdHVzID0KKwkJCQkJCU1QVDJfQ01EX05PVF9VU0VEOworCQkJfSBlbHNlCisJCQkJY29tcGxldGUoJmlvYy0+cG9ydF9lbmFibGVfY21kcy5kb25lKTsKKworCQl9CiAJCWlmIChpb2MtPmNvbmZpZ19jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX1BFTkRJTkcpIHsKIAkJCWlvYy0+Y29uZmlnX2NtZHMuc3RhdHVzIHw9IE1QVDJfQ01EX1JFU0VUOwogCQkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIGlvYy0+Y29uZmlnX2NtZHMuc21pZCk7CkBAIC00MTIwLDcgKzQ1MDksNiBAQAogewogCWludCByOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggcGVfY29tcGxldGUgPSBpb2MtPndhaXRfZm9yX3BvcnRfZW5hYmxlX3RvX2NvbXBsZXRlOwogCiAJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBlbnRlclxuIiwgaW9jLT5uYW1lLAogCSAgICBfX2Z1bmNfXykpOwpAQCAtNDE2Nyw3ICs0NTU1LDggQEAKIAkvKiBJZiB0aGlzIGhhcmQgcmVzZXQgaXMgY2FsbGVkIHdoaWxlIHBvcnQgZW5hYmxlIGlzIGFjdGl2ZSwgdGhlbgogCSAqIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBjYWxsIG1ha2VfaW9jX29wZXJhdGlvbmFsCiAJICovCi0JaWYgKHBlX2NvbXBsZXRlKSB7CisJaWYgKGlvYy0+aXNfZHJpdmVyX2xvYWRpbmcgJiYgaW9jLT5wb3J0X2VuYWJsZV9mYWlsZWQpIHsKKwkJaW9jLT5yZW1vdmVfaG9zdCA9IDE7CiAJCXIgPSAtRUZBVUxUOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MTgxLDcgKzQ1NzAsNiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19sb2NrLCBmbGFncyk7CiAJaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3Nfc3RhdHVzID0gcjsKIAlpb2MtPnNob3N0X3JlY292ZXJ5ID0gMDsKLQljb21wbGV0ZSgmaW9jLT5zaG9zdF9yZWNvdmVyeV9kb25lKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19sb2NrLCBmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZpb2MtPnJlc2V0X2luX3Byb2dyZXNzX211dGV4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmggYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaAppbmRleCA4ZDViZTIxLi4zYzNiYWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuaApAQCAtNjksOCArNjksOCBAQAogI2RlZmluZSBNUFQyU0FTX0RSSVZFUl9OQU1FCQkibXB0MnNhcyIKICNkZWZpbmUgTVBUMlNBU19BVVRIT1IJIkxTSSBDb3Jwb3JhdGlvbiA8REwtTVBURnVzaW9uTGludXhAbHNpLmNvbT4iCiAjZGVmaW5lIE1QVDJTQVNfREVTQ1JJUFRJT04JIkxTSSBNUFQgRnVzaW9uIFNBUyAyLjAgRGV2aWNlIERyaXZlciIKLSNkZWZpbmUgTVBUMlNBU19EUklWRVJfVkVSU0lPTgkJIjA5LjEwMC4wMC4wMCIKLSNkZWZpbmUgTVBUMlNBU19NQUpPUl9WRVJTSU9OCQkwOQorI2RlZmluZSBNUFQyU0FTX0RSSVZFUl9WRVJTSU9OCQkiMTAuMTAwLjAwLjAwIgorI2RlZmluZSBNUFQyU0FTX01BSk9SX1ZFUlNJT04JCTEwCiAjZGVmaW5lIE1QVDJTQVNfTUlOT1JfVkVSU0lPTgkJMTAwCiAjZGVmaW5lIE1QVDJTQVNfQlVJTERfVkVSU0lPTgkJMDAKICNkZWZpbmUgTVBUMlNBU19SRUxFQVNFX1ZFUlNJT04JCTAwCkBAIC01NDQsNiArNTQ0LDI4IEBACiAKIHR5cGVkZWYgdm9pZCAoKk1QVF9BRERfU0dFKSh2b2lkICpwYWRkciwgdTMyIGZsYWdzX2xlbmd0aCwgZG1hX2FkZHJfdCBkbWFfYWRkcik7CiAKKy8qKgorICogc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUgLSB0aGUgcmVwbHkgcXVldWUgc3RydWN0CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBtc2l4X2luZGV4OiBtc2l4IGluZGV4IGludG8gdmVjdG9yIHRhYmxlCisgKiBAdmVjdG9yOiBpcnEgdmVjdG9yCisgKiBAcmVwbHlfcG9zdF9ob3N0X2luZGV4OiBoZWFkIGluZGV4IGluIHRoZSBwb29sIHdoZXJlIEZXIGNvbXBsZXRlcyBJTworICogQHJlcGx5X3Bvc3RfZnJlZTogcmVwbHkgcG9zdCBiYXNlIHZpcnQgYWRkcmVzcworICogQG5hbWU6IHRoZSBuYW1lIHJlZ2lzdGVyZWQgdG8gcmVxdWVzdF9pcnEoKQorICogQGJ1c3k6IGlzciBpcyBhY3RpdmVseSBwcm9jZXNzaW5nIHJlcGxpZXMgb24gYW5vdGhlciBjcHUKKyAqIEBsaXN0OiB0aGlzIGxpc3QKKyovCitzdHJ1Y3QgYWRhcHRlcl9yZXBseV9xdWV1ZSB7CisJc3RydWN0IE1QVDJTQVNfQURBUFRFUgkqaW9jOworCXU4CQkJbXNpeF9pbmRleDsKKwl1bnNpZ25lZCBpbnQJCXZlY3RvcjsKKwl1MzIJCQlyZXBseV9wb3N0X2hvc3RfaW5kZXg7CisJTXBpMlJlcGx5RGVzY3JpcHRvcnNVbmlvbl90ICpyZXBseV9wb3N0X2ZyZWU7CisJY2hhcgkJCW5hbWVbTVBUX05BTUVfTEVOR1RIXTsKKwlhdG9taWNfdAkJYnVzeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Cit9OworCiAvKiBJT0MgRmFjdHMgYW5kIFBvcnQgRmFjdHMgY29udmVydGVkIGZyb20gbGl0dGxlIGVuZGlhbiB0byBjcHUgKi8KIHVuaW9uIG1waTJfdmVyc2lvbl91bmlvbiB7CiAJTVBJMl9WRVJTSU9OX1NUUlVDVAkJU3RydWN0OwpAQCAtNjA2LDcgKzYyOCw3IEBACiAgKiBAbGlzdDogaW9jX2xpc3QKICAqIEBzaG9zdDogc2hvc3Qgb2JqZWN0CiAgKiBAaWQ6IHVuaXF1ZSBhZGFwdGVyIGlkCi0gKiBAcGNpX2lycTogaXJxIG51bWJlcgorICogQGNwdV9jb3VudDogbnVtYmVyIG9ubGluZSBjcHVzCiAgKiBAbmFtZTogZ2VuZXJpYyBpb2Mgc3RyaW5nCiAgKiBAdG1wX3N0cmluZzogdG1wIHN0cmluZyB1c2VkIGZvciBsb2dnaW5nCiAgKiBAcGRldjogcGNpIHBkZXYgb2JqZWN0CkBAIC02MzMsMTEgKzY1NSwxNiBAQAogICogQGlnbm9yZV9sb2dpbmZvczogaWdub3JlIGxvZ2luZm9zIGR1cmluZyB0YXNrIG1hbmFnZW1lbnQKICAqIEByZW1vdmVfaG9zdDogZmxhZyBmb3Igd2hlbiBkcml2ZXIgdW5sb2FkcywgdG8gYXZvaWQgc2VuZGluZyBkZXYgcmVzZXRzCiAgKiBAcGNpX2Vycm9yX3JlY292ZXJ5OiBmbGFnIHRvIHByZXZlbnQgaW9jIGFjY2VzcyB1bnRpbCBzbG90IHJlc2V0IGNvbXBsZXRlcwotICogQHdhaXRfZm9yX3BvcnRfZW5hYmxlX3RvX2NvbXBsZXRlOgorICogQHdhaXRfZm9yX2Rpc2NvdmVyeV90b19jb21wbGV0ZTogZmxhZyBzZXQgYXQgZHJpdmVyIGxvYWQgdGltZSB3aGVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyBvbiByZXBvcnRpbmcgZGV2aWNlcworICogQGlzX2RyaXZlcl9sb2FkaW5nOiBmbGFnIHNldCBhdCBkcml2ZXIgbG9hZCB0aW1lCisgKiBAcG9ydF9lbmFibGVfZmFpbGVkOiBmbGFnIHNldCB3aGVuIHBvcnQgZW5hYmxlIGhhcyBmYWlsZWQKKyAqIEBzdGFydF9zY2FuOiBmbGFnIHNldCBmcm9tIHNjYW5fc3RhcnQgY2FsbGJhY2ssIGNsZWFyZWQgZnJvbSBfbXB0MnNhc19md193b3JrCisgKiBAc3RhcnRfc2Nhbl9mYWlsZWQ6IG1lYW5zIHBvcnQgZW5hYmxlIGZhaWxlZCwgcmV0dXJuJ3MgdGhlIGlvY19zdGF0dXMKICAqIEBtc2l4X2VuYWJsZTogZmxhZyBpbmRpY2F0aW5nIG1zaXggaXMgZW5hYmxlZAogICogQG1zaXhfdmVjdG9yX2NvdW50OiBudW1iZXIgbXNpeCB2ZWN0b3JzCi0gKiBAbXNpeF90YWJsZTogdmlydCBhZGRyZXNzIHRvIHRoZSBtc2l4IHRhYmxlCi0gKiBAbXNpeF90YWJsZV9iYWNrdXA6IGJhY2t1cCBtc2l4IHRhYmxlCisgKiBAY3B1X21zaXhfdGFibGU6IHRhYmxlIGZvciBtYXBwaW5nIGNwdXMgdG8gbXNpeCBpbmRleAorICogQGNwdV9tc2l4X3RhYmxlX3N6OiB0YWJsZSBzaXplCiAgKiBAc2NzaV9pb19jYl9pZHg6IHNob3N0IGdlbmVyYXRlZCBjb21tYW5kcwogICogQHRtX2NiX2lkeDogdGFzayBtYW5hZ2VtZW50IGNvbW1hbmRzCiAgKiBAc2NzaWhfY2JfaWR4OiBzY3NpaCBpbnRlcm5hbCBjb21tYW5kcwpAQCAtNzI4LDcgKzc1NSw4IEBACiAgKiBAcmVwbHlfcG9zdF9xdWV1ZV9kZXB0aDogcmVwbHkgcG9zdCBxdWV1ZSBkZXB0aAogICogQHJlcGx5X3Bvc3RfZnJlZTogcG9vbCBmb3IgcmVwbHkgcG9zdCAoNjRiaXQgZGVzY3JpcHRvcikKICAqIEByZXBseV9wb3N0X2ZyZWVfZG1hOgotICogQHJlcGx5X3Bvc3RfZnJlZV9kbWFfcG9vbDoKKyAqIEByZXBseV9xdWV1ZV9jb3VudDogbnVtYmVyIG9mIHJlcGx5IHF1ZXVlJ3MKKyAqIEByZXBseV9xdWV1ZV9saXN0OiBsaW5rIGxpc3QgY29udGFuaW5nIHRoZSByZXBseSBxdWV1ZSBpbmZvCiAgKiBAcmVwbHlfcG9zdF9ob3N0X2luZGV4OiBoZWFkIGluZGV4IGluIHRoZSBwb29sIHdoZXJlIEZXIGNvbXBsZXRlcyBJTwogICogQGRlbGF5ZWRfdHJfbGlzdDogdGFyZ2V0IHJlc2V0IGxpbmsgbGlzdAogICogQGRlbGF5ZWRfdHJfdm9sdW1lX2xpc3Q6IHZvbHVtZSB0YXJnZXQgcmVzZXQgbGluayBsaXN0CkBAIC03MzcsNyArNzY1LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJdTgJCWlkOwotCXUzMgkJcGNpX2lycTsKKwlpbnQJCWNwdV9jb3VudDsKIAljaGFyCQluYW1lW01QVF9OQU1FX0xFTkdUSF07CiAJY2hhcgkJdG1wX3N0cmluZ1tNUFRfU1RSSU5HX0xFTkdUSF07CiAJc3RydWN0IHBjaV9kZXYJKnBkZXY7CkBAIC03NjcsMjAgKzc5NSwyNiBAQAogCXU4CQlzaG9zdF9yZWNvdmVyeTsKIAogCXN0cnVjdCBtdXRleAlyZXNldF9pbl9wcm9ncmVzc19tdXRleDsKLQlzdHJ1Y3QgY29tcGxldGlvbglzaG9zdF9yZWNvdmVyeV9kb25lOwogCXNwaW5sb2NrX3QgCWlvY19yZXNldF9pbl9wcm9ncmVzc19sb2NrOwogCXU4CQlpb2NfbGlua19yZXNldF9pbl9wcm9ncmVzczsKLQlpbnQJCWlvY19yZXNldF9pbl9wcm9ncmVzc19zdGF0dXM7CisJdTgJCWlvY19yZXNldF9pbl9wcm9ncmVzc19zdGF0dXM7CiAKIAl1OAkJaWdub3JlX2xvZ2luZm9zOwogCXU4CQlyZW1vdmVfaG9zdDsKIAl1OAkJcGNpX2Vycm9yX3JlY292ZXJ5OwotCXU4CQl3YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZTsKKwl1OAkJd2FpdF9mb3JfZGlzY292ZXJ5X3RvX2NvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uCXBvcnRfZW5hYmxlX2RvbmU7CisJdTgJCWlzX2RyaXZlcl9sb2FkaW5nOworCXU4CQlwb3J0X2VuYWJsZV9mYWlsZWQ7CisKKwl1OAkJc3RhcnRfc2NhbjsKKwl1MTYJCXN0YXJ0X3NjYW5fZmFpbGVkOwogCiAJdTgJCW1zaXhfZW5hYmxlOwogCXUxNgkJbXNpeF92ZWN0b3JfY291bnQ7Ci0JdTMyCQkqbXNpeF90YWJsZTsKLQl1MzIJCSptc2l4X3RhYmxlX2JhY2t1cDsKKwl1OAkJKmNwdV9tc2l4X3RhYmxlOworCXJlc291cmNlX3NpemVfdAkqKnJlcGx5X3Bvc3RfaG9zdF9pbmRleDsKKwl1MTYJCWNwdV9tc2l4X3RhYmxlX3N6OwogCXUzMgkJaW9jX3Jlc2V0X2NvdW50OwogCiAJLyogaW50ZXJuYWwgY29tbWFuZHMsIGNhbGxiYWNrIGluZGV4ICovCkBAIC03OTAsMTEgKzgyNCwxMyBAQAogCXU4CQlzY3NpaF9jYl9pZHg7CiAJdTgJCWN0bF9jYl9pZHg7CiAJdTgJCWJhc2VfY2JfaWR4OworCXU4CQlwb3J0X2VuYWJsZV9jYl9pZHg7CiAJdTgJCWNvbmZpZ19jYl9pZHg7CiAJdTgJCXRtX3RyX2NiX2lkeDsKIAl1OAkJdG1fdHJfdm9sdW1lX2NiX2lkeDsKIAl1OAkJdG1fc2FzX2NvbnRyb2xfY2JfaWR4OwogCXN0cnVjdCBfaW50ZXJuYWxfY21kIGJhc2VfY21kczsKKwlzdHJ1Y3QgX2ludGVybmFsX2NtZCBwb3J0X2VuYWJsZV9jbWRzOwogCXN0cnVjdCBfaW50ZXJuYWxfY21kIHRyYW5zcG9ydF9jbWRzOwogCXN0cnVjdCBfaW50ZXJuYWxfY21kIHNjc2loX2NtZHM7CiAJc3RydWN0IF9pbnRlcm5hbF9jbWQgdG1fY21kczsKQEAgLTkxMSw3ICs5NDcsOCBAQAogCU1waTJSZXBseURlc2NyaXB0b3JzVW5pb25fdCAqcmVwbHlfcG9zdF9mcmVlOwogCWRtYV9hZGRyX3QJcmVwbHlfcG9zdF9mcmVlX2RtYTsKIAlzdHJ1Y3QgZG1hX3Bvb2wgKnJlcGx5X3Bvc3RfZnJlZV9kbWFfcG9vbDsKLQl1MzIJCXJlcGx5X3Bvc3RfaG9zdF9pbmRleDsKKwl1OAkJcmVwbHlfcXVldWVfY291bnQ7CisJc3RydWN0IGxpc3RfaGVhZCByZXBseV9xdWV1ZV9saXN0OwogCiAJc3RydWN0IGxpc3RfaGVhZCBkZWxheWVkX3RyX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBkZWxheWVkX3RyX3ZvbHVtZV9saXN0OwpAQCAtOTU1LDYgKzk5Miw3IEBACiB2b2lkIG1wdDJzYXNfYmFzZV9idWlsZF96ZXJvX2xlbl9zZ2Uoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB2b2lkICpwYWRkcik7CiBfX2xlMzIgbXB0MnNhc19iYXNlX2dldF9zZW5zZV9idWZmZXJfZG1hKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKICAgICB1MTYgc21pZCk7Cit2b2lkIG1wdDJzYXNfYmFzZV9mbHVzaF9yZXBseV9xdWV1ZXMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKTsKIAogLyogaGktcHJpb3JpdHkgcXVldWUgKi8KIHUxNiBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWRfaHByKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggY2JfaWR4KTsKQEAgLTk3NSw2ICsxMDEzLDggQEAKIAogdTggbXB0MnNhc19iYXNlX2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggbXNpeF9pbmRleCwKICAgICB1MzIgcmVwbHkpOwordTggbXB0MnNhc19wb3J0X2VuYWJsZV9kb25lKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsCisJdTggbXNpeF9pbmRleCwJdTMyIHJlcGx5KTsKIHZvaWQgKm1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTMyIHBoeXNfYWRkcik7CiAKIHUzMiBtcHQyc2FzX2Jhc2VfZ2V0X2lvY3N0YXRlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgaW50IGNvb2tlZCk7CkBAIC05ODksNiArMTAyOSw4IEBACiAKIHZvaWQgbXB0MnNhc19oYWx0X2Zpcm13YXJlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyk7CiAKK2ludCBtcHQyc2FzX3BvcnRfZW5hYmxlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyk7CisKIC8qIHNjc2loIHNoYXJlZCBBUEkgKi8KIHU4IG1wdDJzYXNfc2NzaWhfZXZlbnRfY2FsbGJhY2soc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1OCBtc2l4X2luZGV4LAogICAgIHUzMiByZXBseSk7CkBAIC0xMDA2LDYgKzEwNDgsOCBAQAogc3RydWN0IF9zYXNfZGV2aWNlICptcHQyc2FzX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9zYXNfYWRkcmVzcygKICAgICBzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU2NCBzYXNfYWRkcmVzcyk7CiAKK3ZvaWQgbXB0MnNhc19wb3J0X2VuYWJsZV9jb21wbGV0ZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpOworCiB2b2lkIG1wdDJzYXNfc2NzaWhfcmVzZXRfaGFuZGxlcihzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIGludCByZXNldF9waGFzZSk7CiAKIC8qIGNvbmZpZyBzaGFyZWQgQVBJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2NvbmZpZy5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jb25maWcuYwppbmRleCAyYjExMDEwLi4zNmVhMGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY29uZmlnLmMKQEAgLTEzNTYsNiArMTM1Niw5IEBACiAJTXBpMkNvbmZpZ1JlcGx5X3QgbXBpX3JlcGx5OwogCWludCByLCBpLCBjb25maWdfcGFnZV9zejsKIAl1MTYgaW9jX3N0YXR1czsKKwlpbnQgY29uZmlnX251bTsKKwl1MTYgZWxlbWVudF90eXBlOworCXUxNiBwaHlzX2Rpc2tfZGV2X2hhbmRsZTsKIAogCSp2b2x1bWVfaGFuZGxlID0gMDsKIAltZW1zZXQoJm1waV9yZXF1ZXN0LCAwLCBzaXplb2YoTXBpMkNvbmZpZ1JlcXVlc3RfdCkpOwpAQCAtMTM3MSwzNSArMTM3NCw1MyBAQAogCWlmIChyKQogCQlnb3RvIG91dDsKIAotCW1waV9yZXF1ZXN0LlBhZ2VBZGRyZXNzID0KLQkgICAgY3B1X3RvX2xlMzIoTVBJMl9SQUlEX1BHQURfRk9STV9BQ1RJVkVfQ09ORklHKTsKIAltcGlfcmVxdWVzdC5BY3Rpb24gPSBNUEkyX0NPTkZJR19BQ1RJT05fUEFHRV9SRUFEX0NVUlJFTlQ7CiAJY29uZmlnX3BhZ2Vfc3ogPSAobGUxNl90b19jcHUobXBpX3JlcGx5LkV4dFBhZ2VMZW5ndGgpICogNCk7CiAJY29uZmlnX3BhZ2UgPSBrbWFsbG9jKGNvbmZpZ19wYWdlX3N6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbmZpZ19wYWdlKQorCWlmICghY29uZmlnX3BhZ2UpIHsKKwkJciA9IC0xOwogCQlnb3RvIG91dDsKLQlyID0gX2NvbmZpZ19yZXF1ZXN0KGlvYywgJm1waV9yZXF1ZXN0LCAmbXBpX3JlcGx5LAotCSAgICBNUFQyX0NPTkZJR19QQUdFX0RFRkFVTFRfVElNRU9VVCwgY29uZmlnX3BhZ2UsCi0JICAgIGNvbmZpZ19wYWdlX3N6KTsKLQlpZiAocikKLQkJZ290byBvdXQ7Ci0KLQlyID0gLTE7Ci0JaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpICYgTVBJMl9JT0NTVEFUVVNfTUFTSzsKLQlpZiAoaW9jX3N0YXR1cyAhPSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIG91dDsKLQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnX3BhZ2UtPk51bUVsZW1lbnRzOyBpKyspIHsKLQkJaWYgKChsZTE2X3RvX2NwdShjb25maWdfcGFnZS0+Q29uZmlnRWxlbWVudFtpXS5FbGVtZW50RmxhZ3MpICYKLQkJICAgIE1QSTJfUkFJRENPTkZJRzBfRUZMQUdTX01BU0tfRUxFTUVOVF9UWVBFKSAhPQotCQkgICAgTVBJMl9SQUlEQ09ORklHMF9FRkxBR1NfVk9MX1BIWVNfRElTS19FTEVNRU5UKQotCQkJY29udGludWU7Ci0JCWlmIChsZTE2X3RvX2NwdShjb25maWdfcGFnZS0+Q29uZmlnRWxlbWVudFtpXS4KLQkJICAgIFBoeXNEaXNrRGV2SGFuZGxlKSA9PSBwZF9oYW5kbGUpIHsKLQkJCSp2b2x1bWVfaGFuZGxlID0gbGUxNl90b19jcHUoY29uZmlnX3BhZ2UtPgotCQkJICAgIENvbmZpZ0VsZW1lbnRbaV0uVm9sRGV2SGFuZGxlKTsKLQkJCXIgPSAwOworCX0KKwljb25maWdfbnVtID0gMHhmZjsKKwl3aGlsZSAoMSkgeworCQltcGlfcmVxdWVzdC5QYWdlQWRkcmVzcyA9IGNwdV90b19sZTMyKGNvbmZpZ19udW0gKworCQkgICAgTVBJMl9SQUlEX1BHQURfRk9STV9HRVRfTkVYVF9DT05GSUdOVU0pOworCQlyID0gX2NvbmZpZ19yZXF1ZXN0KGlvYywgJm1waV9yZXF1ZXN0LCAmbXBpX3JlcGx5LAorCQkgICAgTVBUMl9DT05GSUdfUEFHRV9ERUZBVUxUX1RJTUVPVVQsIGNvbmZpZ19wYWdlLAorCQkgICAgY29uZmlnX3BhZ2Vfc3opOworCQlpZiAocikKIAkJCWdvdG8gb3V0OworCQlyID0gLTE7CisJCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHkuSU9DU3RhdHVzKSAmCisJCSAgICBNUEkyX0lPQ1NUQVRVU19NQVNLOworCQlpZiAoaW9jX3N0YXR1cyAhPSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTKQorCQkJZ290byBvdXQ7CisJCWZvciAoaSA9IDA7IGkgPCBjb25maWdfcGFnZS0+TnVtRWxlbWVudHM7IGkrKykgeworCQkJZWxlbWVudF90eXBlID0gbGUxNl90b19jcHUoY29uZmlnX3BhZ2UtPgorCQkJICAgIENvbmZpZ0VsZW1lbnRbaV0uRWxlbWVudEZsYWdzKSAmCisJCQkgICAgTVBJMl9SQUlEQ09ORklHMF9FRkxBR1NfTUFTS19FTEVNRU5UX1RZUEU7CisJCQlpZiAoZWxlbWVudF90eXBlID09CisJCQkgICAgTVBJMl9SQUlEQ09ORklHMF9FRkxBR1NfVk9MX1BIWVNfRElTS19FTEVNRU5UIHx8CisJCQkgICAgZWxlbWVudF90eXBlID09CisJCQkgICAgTVBJMl9SQUlEQ09ORklHMF9FRkxBR1NfT0NFX0VMRU1FTlQpIHsKKwkJCQlwaHlzX2Rpc2tfZGV2X2hhbmRsZSA9CisJCQkJICAgIGxlMTZfdG9fY3B1KGNvbmZpZ19wYWdlLT5Db25maWdFbGVtZW50W2ldLgorCQkJCSAgICBQaHlzRGlza0RldkhhbmRsZSk7CisJCQkJaWYgKHBoeXNfZGlza19kZXZfaGFuZGxlID09IHBkX2hhbmRsZSkgeworCQkJCQkqdm9sdW1lX2hhbmRsZSA9CisJCQkJCSAgICBsZTE2X3RvX2NwdShjb25maWdfcGFnZS0+CisJCQkJCSAgICBDb25maWdFbGVtZW50W2ldLlZvbERldkhhbmRsZSk7CisJCQkJCXIgPSAwOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGVsZW1lbnRfdHlwZSA9PQorCQkJICAgIE1QSTJfUkFJRENPTkZJRzBfRUZMQUdTX0hPVF9TUEFSRV9FTEVNRU5UKSB7CisJCQkJKnZvbHVtZV9oYW5kbGUgPSAwOworCQkJCXIgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfQogCQl9CisJCWNvbmZpZ19udW0gPSBjb25maWdfcGFnZS0+Q29uZmlnTnVtOwogCX0KICBvdXQ6CiAJa2ZyZWUoY29uZmlnX3BhZ2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmMKaW5kZXggMjQ2ZDVmYi4uYWFiY2I5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5jCkBAIC0xMjA3LDYgKzEyMDcsOSBAQAogCWlmIChfY3RsX3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY19udW1iZXIsICZpb2MpID09IC0xIHx8ICFpb2MpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkgfHwKKwkJaW9jLT5pc19kcml2ZXJfbG9hZGluZykKKwkJcmV0dXJuIC1FQUdBSU47CiAJZGN0bHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIApAQCAtMjE3OCw3ICsyMTgxLDggQEAKIAkJICAgICFpb2MpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkKKwkJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkgfHwKKwkJCQlpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKQogCQkJcmV0dXJuIC1FQUdBSU47CiAKIAkJaWYgKF9JT0NfU0laRShjbWQpID09IHNpemVvZihzdHJ1Y3QgbXB0Ml9pb2N0bF9jb21tYW5kKSkgewpAQCAtMjI5Nyw3ICsyMzAxLDggQEAKIAlpZiAoX2N0bF92ZXJpZnlfYWRhcHRlcihrYXJnMzIuaGRyLmlvY19udW1iZXIsICZpb2MpID09IC0xIHx8ICFpb2MpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpCisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkgfHwKKwkJCWlvYy0+aXNfZHJpdmVyX2xvYWRpbmcpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJbWVtc2V0KCZrYXJnLCAwLCBzaXplb2Yoc3RydWN0IG1wdDJfaW9jdGxfY29tbWFuZCkpOwpAQCAtMjcwNCw2ICsyNzA5LDMzIEBACiBzdGF0aWMgREVWSUNFX0FUVFIoaW9jX3Jlc2V0X2NvdW50LCBTX0lSVUdPLAogICAgIF9jdGxfaW9jX3Jlc2V0X2NvdW50X3Nob3csIE5VTEwpOwogCisvKioKKyAqIF9jdGxfaW9jX3JlcGx5X3F1ZXVlX2NvdW50X3Nob3cgLSBudW1iZXIgb2YgcmVwbHkgcXVldWVzCisgKiBAY2RldiAtIHBvaW50ZXIgdG8gZW1iZWRkZWQgY2xhc3MgZGV2aWNlCisgKiBAYnVmIC0gdGhlIGJ1ZmZlciByZXR1cm5lZAorICoKKyAqIFRoaXMgaXMgbnVtYmVyIG9mIHJlcGx5IHF1ZXVlcworICoKKyAqIEEgc3lzZnMgJ3JlYWQtb25seScgc2hvc3QgYXR0cmlidXRlLgorICovCitzdGF0aWMgc3NpemVfdAorX2N0bF9pb2NfcmVwbHlfcXVldWVfY291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpjZGV2LAorCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXU4IHJlcGx5X3F1ZXVlX2NvdW50OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzaG9zdCk7CisKKwlpZiAoKGlvYy0+ZmFjdHMuSU9DQ2FwYWJpbGl0aWVzICYKKwkgICAgTVBJMl9JT0NGQUNUU19DQVBBQklMSVRZX01TSV9YX0lOREVYKSAmJiBpb2MtPm1zaXhfZW5hYmxlKQorCQlyZXBseV9xdWV1ZV9jb3VudCA9IGlvYy0+cmVwbHlfcXVldWVfY291bnQ7CisJZWxzZQorCQlyZXBseV9xdWV1ZV9jb3VudCA9IDE7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHJlcGx5X3F1ZXVlX2NvdW50KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihyZXBseV9xdWV1ZV9jb3VudCwgU19JUlVHTywKKwkgX2N0bF9pb2NfcmVwbHlfcXVldWVfY291bnRfc2hvdywgTlVMTCk7CisKIHN0cnVjdCBESUFHX0JVRkZFUl9TVEFSVCB7CiAJX19sZTMyIFNpemU7CiAJX19sZTMyIERpYWdWZXJzaW9uOwpAQCAtMjkxNCw2ICsyOTQ2LDcgQEAKIAkmZGV2X2F0dHJfaG9zdF90cmFjZV9idWZmZXJfc2l6ZSwKIAkmZGV2X2F0dHJfaG9zdF90cmFjZV9idWZmZXIsCiAJJmRldl9hdHRyX2hvc3RfdHJhY2VfYnVmZmVyX2VuYWJsZSwKKwkmZGV2X2F0dHJfcmVwbHlfcXVldWVfY291bnQsCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYwppbmRleCA1MjAyZGUzLi44ODg5YjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCkBAIC03MSw2ICs3MSw5IEBACiAKIHN0YXRpYyB1OCBfc2NzaWhfY2hlY2tfZm9yX3BlbmRpbmdfdG0oc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCk7CiAKK3N0YXRpYyB2b2lkIF9zY3NpaF9zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK3N0YXRpYyBpbnQgX3Njc2loX3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGxvbmcgdGltZSk7CisKIC8qIGdsb2JhbCBwYXJhbWV0ZXJzICovCiBMSVNUX0hFQUQobXB0MnNhc19pb2NfbGlzdCk7CiAKQEAgLTc5LDYgKzgyLDcgQEAKIHN0YXRpYyB1OCB0bV9jYl9pZHggPSAtMTsKIHN0YXRpYyB1OCBjdGxfY2JfaWR4ID0gLTE7CiBzdGF0aWMgdTggYmFzZV9jYl9pZHggPSAtMTsKK3N0YXRpYyB1OCBwb3J0X2VuYWJsZV9jYl9pZHggPSAtMTsKIHN0YXRpYyB1OCB0cmFuc3BvcnRfY2JfaWR4ID0gLTE7CiBzdGF0aWMgdTggc2NzaWhfY2JfaWR4ID0gLTE7CiBzdGF0aWMgdTggY29uZmlnX2NiX2lkeCA9IC0xOwpAQCAtMTAzLDYgKzEwNywxOCBAQAogbW9kdWxlX3BhcmFtKG1heF9sdW4sIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9sdW4sICIgbWF4IGx1biwgZGVmYXVsdD0xNjg5NSAiKTsKIAorLyogZGlhZ19idWZmZXJfZW5hYmxlIGlzIGJpdHdpc2UKKyAqIGJpdCAwIHNldCA9IFRSQUNFCisgKiBiaXQgMSBzZXQgPSBTTkFQU0hPVAorICogYml0IDIgc2V0ID0gRVhURU5ERUQKKyAqCisgKiBFaXRoZXIgYml0IGNhbiBiZSBzZXQsIG9yIGJvdGgKKyAqLworc3RhdGljIGludCBkaWFnX2J1ZmZlcl9lbmFibGUgPSAtMTsKK21vZHVsZV9wYXJhbShkaWFnX2J1ZmZlcl9lbmFibGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpYWdfYnVmZmVyX2VuYWJsZSwgIiBwb3N0IGRpYWcgYnVmZmVycyAiCisJIihUUkFDRT0xL1NOQVBTSE9UPTIvRVhURU5ERUQ9NC9kZWZhdWx0PTApIik7CisKIC8qKgogICogc3RydWN0IHNlbnNlX2luZm8gLSBjb21tb24gc3RydWN0dXJlIGZvciBvYnRhaW5pbmcgc2Vuc2Uga2V5cwogICogQHNrZXk6IHNlbnNlIGtleQpAQCAtMTE3LDggKzEzMyw4IEBACiAKIAogI2RlZmluZSBNUFQyU0FTX1RVUk5fT05fRkFVTFRfTEVEICgweEZGRkMpCi0jZGVmaW5lIE1QVDJTQVNfUkVTQ0FOX0FGVEVSX0hPU1RfUkVTRVQgKDB4RkZGRikKLQorI2RlZmluZSBNUFQyU0FTX1BPUlRfRU5BQkxFX0NPTVBMRVRFICgweEZGRkQpCisjZGVmaW5lIE1QVDJTQVNfUkVNT1ZFX1VOUkVTUE9ORElOR19ERVZJQ0VTICgweEZGRkYpCiAvKioKICAqIHN0cnVjdCBmd19ldmVudF93b3JrIC0gZmlybXdhcmUgZXZlbnQgc3RydWN0CiAgKiBAbGlzdDogbGluayBsaXN0IGZyYW1ld29yawpAQCAtMzcyLDMxICszODgsMzQgQEAKIAlNcGkyU2FzRGV2aWNlUGFnZTBfdCBzYXNfZGV2aWNlX3BnMDsKIAlNcGkyQ29uZmlnUmVwbHlfdCBtcGlfcmVwbHk7CiAJdTMyIGlvY19zdGF0dXM7CisJKnNhc19hZGRyZXNzID0gMDsKIAogCWlmIChoYW5kbGUgPD0gaW9jLT5zYXNfaGJhLm51bV9waHlzKSB7CiAJCSpzYXNfYWRkcmVzcyA9IGlvYy0+c2FzX2hiYS5zYXNfYWRkcmVzczsKIAkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCSpzYXNfYWRkcmVzcyA9IDA7CisJfQogCiAJaWYgKChtcHQyc2FzX2NvbmZpZ19nZXRfc2FzX2RldmljZV9wZzAoaW9jLCAmbXBpX3JlcGx5LCAmc2FzX2RldmljZV9wZzAsCiAJICAgIE1QSTJfU0FTX0RFVklDRV9QR0FEX0ZPUk1fSEFORExFLCBoYW5kbGUpKSkgewotCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAotCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLAorCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlpb2Nfc3RhdHVzID0gbGUxNl90b19jcHUobXBpX3JlcGx5LklPQ1N0YXR1cykgJgotCSAgICBNUEkyX0lPQ1NUQVRVU19NQVNLOwotCWlmIChpb2Nfc3RhdHVzICE9IE1QSTJfSU9DU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiaGFuZGxlKDB4JTA0eCksIGlvY19zdGF0dXMoMHglMDR4KSIKLQkJICAgICJcbmZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwgaGFuZGxlLCBpb2Nfc3RhdHVzLAotCQkgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTzsKKwlpb2Nfc3RhdHVzID0gbGUxNl90b19jcHUobXBpX3JlcGx5LklPQ1N0YXR1cykgJiBNUEkyX0lPQ1NUQVRVU19NQVNLOworCWlmIChpb2Nfc3RhdHVzID09IE1QSTJfSU9DU1RBVFVTX1NVQ0NFU1MpIHsKKwkJKnNhc19hZGRyZXNzID0gbGU2NF90b19jcHUoc2FzX2RldmljZV9wZzAuU0FTQWRkcmVzcyk7CisJCXJldHVybiAwOwogCX0KIAotCSpzYXNfYWRkcmVzcyA9IGxlNjRfdG9fY3B1KHNhc19kZXZpY2VfcGcwLlNBU0FkZHJlc3MpOwotCXJldHVybiAwOworCS8qIHdlIGhpdCB0aGlzIGJlY3Vhc2UgdGhlIGdpdmVuIHBhcmVudCBoYW5kbGUgZG9lc24ndCBleGlzdCAqLworCWlmIChpb2Nfc3RhdHVzID09IE1QSTJfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX1BBR0UpCisJCXJldHVybiAtRU5YSU87CisJLyogZWxzZSBlcnJvciBjYXNlICovCisJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiaGFuZGxlKDB4JTA0eCksIGlvY19zdGF0dXMoMHglMDR4KSwgIgorCSAgICAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUsIGlvY19zdGF0dXMsCisJICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVJTzsKIH0KIAogLyoqCkBAIC00MjQsNyArNDQzLDExIEBACiAJdTE2IHNsb3Q7CiAKIAkgLyogb25seSBwcm9jZXNzIHRoaXMgZnVuY3Rpb24gd2hlbiBkcml2ZXIgbG9hZHMgKi8KLQlpZiAoIWlvYy0+d2FpdF9mb3JfcG9ydF9lbmFibGVfdG9fY29tcGxldGUpCisJaWYgKCFpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKQorCQlyZXR1cm47CisKKwkgLyogbm8gQmlvcywgcmV0dXJuIGltbWVkaWF0ZWx5ICovCisJaWYgKCFpb2MtPmJpb3NfcGczLkJpb3NWZXJzaW9uKQogCQlyZXR1cm47CiAKIAlpZiAoIWlzX3JhaWQpIHsKQEAgLTU4Nyw4ICs2MTAsMTUgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFtcHQyc2FzX3RyYW5zcG9ydF9wb3J0X2FkZChpb2MsIHNhc19kZXZpY2UtPmhhbmRsZSwKLQkgICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCkpCisJICAgICBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQpKSB7CiAJCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOworCQl9IGVsc2UgaWYgKCFzYXNfZGV2aWNlLT5zdGFyZ2V0KSB7CisJCQlpZiAoIWlvYy0+aXNfZHJpdmVyX2xvYWRpbmcpCisJCQkJbXB0MnNhc190cmFuc3BvcnRfcG9ydF9yZW1vdmUoaW9jLAorCQkJCXNhc19kZXZpY2UtPnNhc19hZGRyZXNzLAorCQkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCk7CisJCQlfc2NzaWhfc2FzX2RldmljZV9yZW1vdmUoaW9jLCBzYXNfZGV2aWNlKTsKKwkJfQogfQogCiAvKioKQEAgLTE0MDAsNiArMTQzMCwxMCBAQAogewogCXN0cnVjdCBNUFQyU0FTX1RBUkdFVCAqc2FzX3RhcmdldF9wcml2X2RhdGE7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYzsKKwlzdHJ1Y3QgX3Nhc19kZXZpY2UgKnNhc19kZXZpY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghc2Rldi0+aG9zdGRhdGEpCiAJCXJldHVybjsKQEAgLTE0MDcsNiArMTQ0MSwxOSBAQAogCXN0YXJnZXQgPSBzY3NpX3RhcmdldChzZGV2KTsKIAlzYXNfdGFyZ2V0X3ByaXZfZGF0YSA9IHN0YXJnZXQtPmhvc3RkYXRhOwogCXNhc190YXJnZXRfcHJpdl9kYXRhLT5udW1fbHVucy0tOworCisJc2hvc3QgPSBkZXZfdG9fc2hvc3QoJnN0YXJnZXQtPmRldik7CisJaW9jID0gc2hvc3RfcHJpdihzaG9zdCk7CisKKwlpZiAoIShzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+ZmxhZ3MgJiBNUFRfVEFSR0VUX0ZMQUdTX1ZPTFVNRSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CisJCXNhc19kZXZpY2UgPSBtcHQyc2FzX3Njc2loX3Nhc19kZXZpY2VfZmluZF9ieV9zYXNfYWRkcmVzcyhpb2MsCisJCSAgIHNhc190YXJnZXRfcHJpdl9kYXRhLT5zYXNfYWRkcmVzcyk7CisJCWlmIChzYXNfZGV2aWNlKQorCQkJc2FzX2RldmljZS0+c3RhcmdldCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CisJfQorCiAJa2ZyZWUoc2Rldi0+aG9zdGRhdGEpOwogCXNkZXYtPmhvc3RkYXRhID0gTlVMTDsKIH0KQEAgLTE1OTgsOCArMTY0NSwxMCBAQAogICogX3Njc2loX2dldF92b2x1bWVfY2FwYWJpbGl0aWVzIC0gdm9sdW1lIGNhcGFiaWxpdGllcwogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAc2FzX2RldmljZTogdGhlIHJhaWRfZGV2aWNlIG9iamVjdAorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSAxCiAgKi8KLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBfc2NzaWhfZ2V0X3ZvbHVtZV9jYXBhYmlsaXRpZXMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAogICAgIHN0cnVjdCBfcmFpZF9kZXZpY2UgKnJhaWRfZGV2aWNlKQogewpAQCAtMTYxMiw5ICsxNjYxLDEwIEBACiAKIAlpZiAoKG1wdDJzYXNfY29uZmlnX2dldF9udW1iZXJfcGRzKGlvYywgcmFpZF9kZXZpY2UtPmhhbmRsZSwKIAkgICAgJm51bV9wZHMpKSB8fCAhbnVtX3BkcykgewotCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAotCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKLQkJcmV0dXJuOworCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX1dBUk5fRk1UCisJCSAgICAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICBfX2Z1bmNfXykpOworCQlyZXR1cm4gMTsKIAl9CiAKIAlyYWlkX2RldmljZS0+bnVtX3BkcyA9IG51bV9wZHM7CkBAIC0xNjIyLDE3ICsxNjcyLDE5IEBACiAJICAgIHNpemVvZihNcGkyUmFpZFZvbDBQaHlzRGlza190KSk7CiAJdm9sX3BnMCA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwogCWlmICghdm9sX3BnMCkgewotCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAotCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKLQkJcmV0dXJuOworCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX1dBUk5fRk1UCisJCSAgICAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICBfX2Z1bmNfXykpOworCQlyZXR1cm4gMTsKIAl9CiAKIAlpZiAoKG1wdDJzYXNfY29uZmlnX2dldF9yYWlkX3ZvbHVtZV9wZzAoaW9jLCAmbXBpX3JlcGx5LCB2b2xfcGcwLAogCSAgICAgTVBJMl9SQUlEX1ZPTFVNRV9QR0FEX0ZPUk1fSEFORExFLCByYWlkX2RldmljZS0+aGFuZGxlLCBzeikpKSB7Ci0JCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsCi0JCSAgICBpb2MtPm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX1dBUk5fRk1UCisJCSAgICAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICBfX2Z1bmNfXykpOwogCQlrZnJlZSh2b2xfcGcwKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAKIAlyYWlkX2RldmljZS0+dm9sdW1lX3R5cGUgPSB2b2xfcGcwLT5Wb2x1bWVUeXBlOwpAQCAtMTY1Miw2ICsxNzA0LDcgQEAKIAl9CiAKIAlrZnJlZSh2b2xfcGcwKTsKKwlyZXR1cm4gMDsKIH0KIC8qKgogICogX3Njc2loX2Rpc2FibGVfZGRpbyAtIERpc2FibGUgZGlyZWN0IEkvTyBmb3IgYWxsIHRoZSB2b2x1bWVzCkBAIC0xOTIyLDEzICsxOTc1LDIwIEBACiAJCSAgICAgc2FzX3RhcmdldF9wcml2X2RhdGEtPmhhbmRsZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+cmFpZF9kZXZpY2VfbG9jaywgZmxhZ3MpOwogCQlpZiAoIXJhaWRfZGV2aWNlKSB7Ci0JCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAotCQkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gMDsKKwkJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfV0FSTl9GTVQKKwkJCSAgICAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLCBfX0ZJTEVfXywKKwkJCSAgICBfX0xJTkVfXywgX19mdW5jX18pKTsKKwkJCXJldHVybiAxOwogCQl9CiAKIAkJX3Njc2loX2dldF92b2x1bWVfY2FwYWJpbGl0aWVzKGlvYywgcmFpZF9kZXZpY2UpOwogCisJCWlmIChfc2NzaWhfZ2V0X3ZvbHVtZV9jYXBhYmlsaXRpZXMoaW9jLCByYWlkX2RldmljZSkpIHsKKwkJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfV0FSTl9GTVQKKwkJCSAgICAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLCBfX0ZJTEVfXywKKwkJCSAgICBfX0xJTkVfXywgX19mdW5jX18pKTsKKwkJCXJldHVybiAxOworCQl9CiAJCS8qCiAJCSAqIFdBUlBEUklWRTogSW5pdGlhbGl6ZSB0aGUgcmVxdWlyZWQgZGF0YSBmb3IgRGlyZWN0IElPCiAJCSAqLwpAQCAtMjAwMiwxMSArMjA2MiwyMiBAQAogCWlmIChzYXNfZGV2aWNlKSB7CiAJCWlmIChzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+ZmxhZ3MgJgogCQkgICAgTVBUX1RBUkdFVF9GTEFHU19SQUlEX0NPTVBPTkVOVCkgewotCQkJbXB0MnNhc19jb25maWdfZ2V0X3ZvbHVtZV9oYW5kbGUoaW9jLAotCQkJICAgIHNhc19kZXZpY2UtPmhhbmRsZSwgJnNhc19kZXZpY2UtPnZvbHVtZV9oYW5kbGUpOwotCQkJbXB0MnNhc19jb25maWdfZ2V0X3ZvbHVtZV93d2lkKGlvYywKKwkJCWlmIChtcHQyc2FzX2NvbmZpZ19nZXRfdm9sdW1lX2hhbmRsZShpb2MsCisJCQkgICAgc2FzX2RldmljZS0+aGFuZGxlLCAmc2FzX2RldmljZS0+dm9sdW1lX2hhbmRsZSkpIHsKKwkJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX1dBUk5fRk1UCisJCQkJICAgICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBpb2MtPm5hbWUsCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWlmIChzYXNfZGV2aWNlLT52b2x1bWVfaGFuZGxlICYmCisJCQkgICAgbXB0MnNhc19jb25maWdfZ2V0X3ZvbHVtZV93d2lkKGlvYywKIAkJCSAgICBzYXNfZGV2aWNlLT52b2x1bWVfaGFuZGxlLAotCQkJICAgICZzYXNfZGV2aWNlLT52b2x1bWVfd3dpZCk7CisJCQkgICAgJnNhc19kZXZpY2UtPnZvbHVtZV93d2lkKSkgeworCQkJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfV0FSTl9GTVQKKwkJCQkgICAgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwKKwkJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXykpOworCQkJCXJldHVybiAxOworCQkJfQogCQl9CiAJCWlmIChzYXNfZGV2aWNlLT5kZXZpY2VfaW5mbyAmIE1QSTJfU0FTX0RFVklDRV9JTkZPX1NTUF9UQVJHRVQpIHsKIAkJCXFkZXB0aCA9IE1QVDJTQVNfU0FTX1FVRVVFX0RFUFRIOwpAQCAtMjAzNSw2ICsyMTA2LDExIEBACiAKIAkJaWYgKCFzc3BfdGFyZ2V0KQogCQkJX3Njc2loX2Rpc3BsYXlfc2F0YV9jYXBhYmlsaXRpZXMoaW9jLCBzYXNfZGV2aWNlLCBzZGV2KTsKKwl9IGVsc2UgeworCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX1dBUk5fRk1UCisJCSAgICAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sCisJCSAgICBfX2Z1bmNfXykpOworCQlyZXR1cm4gMTsKIAl9CiAKIAlfc2NzaWhfY2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsIHFkZXB0aCwgU0NTSV9RREVQVEhfREVGQVVMVCk7CkBAIC0yMTYxLDYgKzIyMzcsNyBAQAogCQlyZXR1cm4gMTsKIAlpZiAoaW9jLT50bV9jbWRzLnNtaWQgIT0gc21pZCkKIAkJcmV0dXJuIDE7CisJbXB0MnNhc19iYXNlX2ZsdXNoX3JlcGx5X3F1ZXVlcyhpb2MpOwogCWlvYy0+dG1fY21kcy5zdGF0dXMgfD0gTVBUMl9DTURfQ09NUExFVEU7CiAJbXBpX3JlcGx5ID0gIG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOwogCWlmIChtcGlfcmVwbHkpIHsKQEAgLTI3MTMsMjIgKzI3OTAsMzggQEAKIAogCiAvKioKLSAqIF9zY3NpaF9xdWV1ZV9yZXNjYW4gLSBxdWV1ZSBhIHRvcG9sb2d5IHJlc2NhbiBmcm9tIHVzZXIgY29udGV4dAorICogX3Njc2loX2Vycm9yX3JlY292ZXJ5X2RlbGV0ZV9kZXZpY2VzIC0gcmVtb3ZlIGRldmljZXMgbm90IHJlc3BvbmRpbmcKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiBzdGF0aWMgdm9pZAotX3Njc2loX3F1ZXVlX3Jlc2NhbihzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCitfc2NzaWhfZXJyb3JfcmVjb3ZlcnlfZGVsZXRlX2RldmljZXMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQogewogCXN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudDsKIAotCWlmIChpb2MtPndhaXRfZm9yX3BvcnRfZW5hYmxlX3RvX2NvbXBsZXRlKQorCWlmIChpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKQogCQlyZXR1cm47CisJZndfZXZlbnQtPmV2ZW50ID0gTVBUMlNBU19SRU1PVkVfVU5SRVNQT05ESU5HX0RFVklDRVM7CisJZndfZXZlbnQtPmlvYyA9IGlvYzsKKwlfc2NzaWhfZndfZXZlbnRfYWRkKGlvYywgZndfZXZlbnQpOworfQorCisvKioKKyAqIG1wdDJzYXNfcG9ydF9lbmFibGVfY29tcGxldGUgLSBwb3J0IGVuYWJsZSBjb21wbGV0ZWQgKGZha2UgZXZlbnQpCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLwordm9pZAorbXB0MnNhc19wb3J0X2VuYWJsZV9jb21wbGV0ZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCit7CisJc3RydWN0IGZ3X2V2ZW50X3dvcmsgKmZ3X2V2ZW50OworCiAJZndfZXZlbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZndfZXZlbnRfd29yayksIEdGUF9BVE9NSUMpOwogCWlmICghZndfZXZlbnQpCiAJCXJldHVybjsKLQlmd19ldmVudC0+ZXZlbnQgPSBNUFQyU0FTX1JFU0NBTl9BRlRFUl9IT1NUX1JFU0VUOworCWZ3X2V2ZW50LT5ldmVudCA9IE1QVDJTQVNfUE9SVF9FTkFCTEVfQ09NUExFVEU7CiAJZndfZXZlbnQtPmlvYyA9IGlvYzsKIAlfc2NzaWhfZndfZXZlbnRfYWRkKGlvYywgZndfZXZlbnQpOwogfQpAQCAtMjk3NiwxNCArMzA2OSwyNyBAQAogCU1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QgKm1waV9yZXF1ZXN0OwogCXUxNiBzbWlkOwogCXN0cnVjdCBfc2FzX2RldmljZSAqc2FzX2RldmljZTsKLQlzdHJ1Y3QgTVBUMlNBU19UQVJHRVQgKnNhc190YXJnZXRfcHJpdl9kYXRhOworCXN0cnVjdCBNUFQyU0FTX1RBUkdFVCAqc2FzX3RhcmdldF9wcml2X2RhdGEgPSBOVUxMOworCXU2NCBzYXNfYWRkcmVzcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgX3RyX2xpc3QgKmRlbGF5ZWRfdHI7CisJdTMyIGlvY19zdGF0ZTsKIAotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cmVtb3ZlX2hvc3QgfHwKLQkgICAgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpIHsKLQkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaG9zdCByZXNldCBpbiAiCi0JCSAgICJwcm9ncmVzcyFcbiIsIF9fZnVuY19fLCBpb2MtPm5hbWUpKTsKKwlpZiAoaW9jLT5yZW1vdmVfaG9zdCkgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IGhhcyBiZWVuICIKKwkJICAgICJyZW1vdmVkOiBoYW5kbGUoMHglMDR4KVxuIiwgX19mdW5jX18sIGlvYy0+bmFtZSwgaGFuZGxlKSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KSB7CisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGhvc3QgaW4gcGNpICIKKwkJICAgICJlcnJvciByZWNvdmVyeTogaGFuZGxlKDB4JTA0eClcbiIsIF9fZnVuY19fLCBpb2MtPm5hbWUsCisJCSAgICBoYW5kbGUpKTsKKwkJcmV0dXJuOworCX0KKwlpb2Nfc3RhdGUgPSBtcHQyc2FzX2Jhc2VfZ2V0X2lvY3N0YXRlKGlvYywgMSk7CisJaWYgKGlvY19zdGF0ZSAhPSBNUEkyX0lPQ19TVEFURV9PUEVSQVRJT05BTCkgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IGlzIG5vdCAiCisJCSAgICJvcGVyYXRpb25hbDogaGFuZGxlKDB4JTA0eClcbiIsIF9fZnVuY19fLCBpb2MtPm5hbWUsCisJCSAgIGhhbmRsZSkpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yOTk3LDEzICszMTAzLDE4IEBACiAJICAgICBzYXNfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YSkgewogCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YSA9IHNhc19kZXZpY2UtPnN0YXJnZXQtPmhvc3RkYXRhOwogCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+ZGVsZXRlZCA9IDE7Ci0JCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVAotCQkgICAgInNldHRpbmcgZGVsZXRlIGZsYWc6IGhhbmRsZSgweCUwNHgpLCAiCi0JCSAgICAic2FzX2FkZHIoMHglMDE2bGx4KVxuIiwgaW9jLT5uYW1lLCBoYW5kbGUsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzcykpOworCQlzYXNfYWRkcmVzcyA9IHNhc19kZXZpY2UtPnNhc19hZGRyZXNzOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwogCisJaWYgKHNhc190YXJnZXRfcHJpdl9kYXRhKSB7CisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2V0dGluZyBkZWxldGUgZmxhZzogIgorCQkiaGFuZGxlKDB4JTA0eCksIHNhc19hZGRyKDB4JTAxNmxseClcbiIsIGlvYy0+bmFtZSwgaGFuZGxlLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzYXNfYWRkcmVzcykpOworCQlfc2NzaWhfdWJsb2NrX2lvX2RldmljZShpb2MsIGhhbmRsZSk7CisJCXNhc190YXJnZXRfcHJpdl9kYXRhLT5oYW5kbGUgPSBNUFQyU0FTX0lOVkFMSURfREVWSUNFX0hBTkRMRTsKKwl9CisKIAlzbWlkID0gbXB0MnNhc19iYXNlX2dldF9zbWlkX2hwcihpb2MsIGlvYy0+dG1fdHJfY2JfaWR4KTsKIAlpZiAoIXNtaWQpIHsKIAkJZGVsYXllZF90ciA9IGt6YWxsb2Moc2l6ZW9mKCpkZWxheWVkX3RyKSwgR0ZQX0FUT01JQyk7CkBAIC0zMTg0LDExICszMjk1LDIxIEBACiAJICAgIG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOwogCU1waTJTYXNJb1VuaXRDb250cm9sUmVxdWVzdF90ICptcGlfcmVxdWVzdDsKIAl1MTYgc21pZF9zYXNfY3RybDsKKwl1MzIgaW9jX3N0YXRlOwogCi0JaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5yZW1vdmVfaG9zdCB8fAotCSAgICBpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkgewotCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IHJlc2V0IGluICIKLQkJICAgInByb2dyZXNzIVxuIiwgX19mdW5jX18sIGlvYy0+bmFtZSkpOworCWlmIChpb2MtPnJlbW92ZV9ob3N0KSB7CisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGhvc3QgaGFzIGJlZW4gIgorCQkgICAicmVtb3ZlZFxuIiwgX19mdW5jX18sIGlvYy0+bmFtZSkpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KSB7CisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGhvc3QgaW4gcGNpICIKKwkJICAgICJlcnJvciByZWNvdmVyeVxuIiwgX19mdW5jX18sIGlvYy0+bmFtZSkpOworCQlyZXR1cm4gMTsKKwl9CisJaW9jX3N0YXRlID0gbXB0MnNhc19iYXNlX2dldF9pb2NzdGF0ZShpb2MsIDEpOworCWlmIChpb2Nfc3RhdGUgIT0gTVBJMl9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpIHsKKwkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaG9zdCBpcyBub3QgIgorCQkgICAgIm9wZXJhdGlvbmFsXG4iLCBfX2Z1bmNfXywgaW9jLT5uYW1lKSk7CiAJCXJldHVybiAxOwogCX0KIApAQCAtNTA5OCw3ICs1MjE5LDcgQEAKIAkvKiBnZXQgZGV2aWNlIG5hbWUgKi8KIAlzYXNfZGV2aWNlLT5kZXZpY2VfbmFtZSA9IGxlNjRfdG9fY3B1KHNhc19kZXZpY2VfcGcwLkRldmljZU5hbWUpOwogCi0JaWYgKGlvYy0+d2FpdF9mb3JfcG9ydF9lbmFibGVfdG9fY29tcGxldGUpCisJaWYgKGlvYy0+d2FpdF9mb3JfZGlzY292ZXJ5X3RvX2NvbXBsZXRlKQogCQlfc2NzaWhfc2FzX2RldmljZV9pbml0X2FkZChpb2MsIHNhc19kZXZpY2UpOwogCWVsc2UKIAkJX3Njc2loX3Nhc19kZXZpY2VfYWRkKGlvYywgc2FzX2RldmljZSk7CkBAIC01MTM0LDYgKzUyNTUsOSBAQAogCWlmIChzYXNfZGV2aWNlX2JhY2t1cC5zdGFyZ2V0ICYmIHNhc19kZXZpY2VfYmFja3VwLnN0YXJnZXQtPmhvc3RkYXRhKSB7CiAJCXNhc190YXJnZXRfcHJpdl9kYXRhID0gc2FzX2RldmljZV9iYWNrdXAuc3RhcmdldC0+aG9zdGRhdGE7CiAJCXNhc190YXJnZXRfcHJpdl9kYXRhLT5kZWxldGVkID0gMTsKKwkJX3Njc2loX3VibG9ja19pb19kZXZpY2UoaW9jLCBzYXNfZGV2aWNlX2JhY2t1cC5oYW5kbGUpOworCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+aGFuZGxlID0KKwkJICAgICBNUFQyU0FTX0lOVkFMSURfREVWSUNFX0hBTkRMRTsKIAl9CiAKIAlfc2NzaWhfdWJsb2NrX2lvX2RldmljZShpb2MsIHNhc19kZXZpY2VfYmFja3VwLmhhbmRsZSk7CkBAIC01Mjg3LDcgKzU0MTEsNyBAQAogCQlfc2NzaWhfc2FzX3RvcG9sb2d5X2NoYW5nZV9ldmVudF9kZWJ1Zyhpb2MsIGV2ZW50X2RhdGEpOwogI2VuZGlmCiAKLQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnJlbW92ZV9ob3N0IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQorCWlmIChpb2MtPnJlbW92ZV9ob3N0IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQogCQlyZXR1cm47CiAKIAlpZiAoIWlvYy0+c2FzX2hiYS5udW1fcGh5cykKQEAgLTUzNDgsNiArNTQ3Miw5IEBACiAJCXN3aXRjaCAocmVhc29uX2NvZGUpIHsKIAkJY2FzZSBNUEkyX0VWRU5UX1NBU19UT1BPX1JDX1BIWV9DSEFOR0VEOgogCisJCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkKKwkJCQlicmVhazsKKwogCQkJaWYgKGxpbmtfcmF0ZSA9PSBwcmV2X2xpbmtfcmF0ZSkKIAkJCQlicmVhazsKIApAQCAtNTM2MSw2ICs1NDg4LDkgQEAKIAkJCWJyZWFrOwogCQljYXNlIE1QSTJfRVZFTlRfU0FTX1RPUE9fUkNfVEFSR19BRERFRDoKIAorCQkJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpCisJCQkJYnJlYWs7CisKIAkJCW1wdDJzYXNfdHJhbnNwb3J0X3VwZGF0ZV9saW5rcyhpb2MsIHNhc19hZGRyZXNzLAogCQkJICAgIGhhbmRsZSwgcGh5X251bWJlciwgbGlua19yYXRlKTsKIApAQCAtNTYyMSw3ICs1NzUxLDcgQEAKIAl0ZXJtaW5hdGlvbl9jb3VudCA9IDA7CiAJcXVlcnlfY291bnQgPSAwOwogCWZvciAoc21pZCA9IDE7IHNtaWQgPD0gaW9jLT5zY3NpaW9fZGVwdGg7IHNtaWQrKykgewotCQlpZiAoaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3Nfc3RhdHVzKQorCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkKIAkJCWdvdG8gb3V0OwogCQlzY21kID0gX3Njc2loX3Njc2lfbG9va3VwX2dldChpb2MsIHNtaWQpOwogCQlpZiAoIXNjbWQpCkBAIC01NjQzLDcgKzU3NzMsNyBAQAogCQlsdW4gPSBzYXNfZGV2aWNlX3ByaXZfZGF0YS0+bHVuOwogCQlxdWVyeV9jb3VudCsrOwogCi0JCWlmIChpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19zdGF0dXMpCisJCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQogCQkJZ290byBvdXQ7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7CkBAIC01Njg1LDcgKzU4MTUsNyBAQAogCQkJZ290byBicm9hZGNhc3RfYWVuX3JldHJ5OwogCQl9CiAKLQkJaWYgKGlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzX3N0YXR1cykKKwkJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpCiAJCQlnb3RvIG91dF9ub19sb2NrOwogCiAJCXIgPSBtcHQyc2FzX3Njc2loX2lzc3VlX3RtKGlvYywgaGFuZGxlLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwKQEAgLTU3MjQsNyArNTg1NCw3IEBACiAJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIHF1ZXJ5X2NvdW50LCB0ZXJtaW5hdGlvbl9jb3VudCkpOwogCiAJaW9jLT5icm9hZGNhc3RfYWVuX2J1c3kgPSAwOwotCWlmICghaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3Nfc3RhdHVzKQorCWlmICghaW9jLT5zaG9zdF9yZWNvdmVyeSkKIAkJX3Njc2loX3VibG9ja19pb19hbGxfZGV2aWNlKGlvYyk7CiAJbXV0ZXhfdW5sb2NrKCZpb2MtPnRtX2NtZHMubXV0ZXgpOwogfQpAQCAtNTc4OCw4ICs1OTE4LDExIEBACiBzdGF0aWMgdm9pZAogX3Njc2loX3JlcHJvYmVfdGFyZ2V0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IG5vX3VsZF9hdHRhY2gpCiB7Ci0Jc3RydWN0IE1QVDJTQVNfVEFSR0VUICpzYXNfdGFyZ2V0X3ByaXZfZGF0YSA9IHN0YXJnZXQtPmhvc3RkYXRhOworCXN0cnVjdCBNUFQyU0FTX1RBUkdFVCAqc2FzX3RhcmdldF9wcml2X2RhdGE7CiAKKwlpZiAoc3RhcmdldCA9PSBOVUxMKQorCQlyZXR1cm47CisJc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzdGFyZ2V0LT5ob3N0ZGF0YTsKIAlpZiAobm9fdWxkX2F0dGFjaCkKIAkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmZsYWdzIHw9IE1QVF9UQVJHRVRfRkxBR1NfUkFJRF9DT01QT05FTlQ7CiAJZWxzZQpAQCAtNTg0NCw3ICs1OTc3LDcgQEAKIAlyYWlkX2RldmljZS0+aGFuZGxlID0gaGFuZGxlOwogCXJhaWRfZGV2aWNlLT53d2lkID0gd3dpZDsKIAlfc2NzaWhfcmFpZF9kZXZpY2VfYWRkKGlvYywgcmFpZF9kZXZpY2UpOwotCWlmICghaW9jLT53YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZSkgeworCWlmICghaW9jLT53YWl0X2Zvcl9kaXNjb3ZlcnlfdG9fY29tcGxldGUpIHsKIAkJcmMgPSBzY3NpX2FkZF9kZXZpY2UoaW9jLT5zaG9zdCwgUkFJRF9DSEFOTkVMLAogCQkgICAgcmFpZF9kZXZpY2UtPmlkLCAwKTsKIAkJaWYgKHJjKQpAQCAtNjEyNiw2ICs2MjU5LDEwIEBACiAJCV9zY3NpaF9zYXNfaXJfY29uZmlnX2NoYW5nZV9ldmVudF9kZWJ1Zyhpb2MsIGV2ZW50X2RhdGEpOwogCiAjZW5kaWYKKworCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQorCQlyZXR1cm47CisKIAlmb3JlaWduX2NvbmZpZyA9IChsZTMyX3RvX2NwdShldmVudF9kYXRhLT5GbGFncykgJgogCSAgICBNUEkyX0VWRU5UX0lSX0NIQU5HRV9GTEFHU19GT1JFSUdOX0NPTkZJRykgPyAxIDogMDsKIApAQCAtNjE4NCw2ICs2MzIxLDkgQEAKIAlpbnQgcmM7CiAJTXBpMkV2ZW50RGF0YUlyVm9sdW1lX3QgKmV2ZW50X2RhdGEgPSBmd19ldmVudC0+ZXZlbnRfZGF0YTsKIAorCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQorCQlyZXR1cm47CisKIAlpZiAoZXZlbnRfZGF0YS0+UmVhc29uQ29kZSAhPSBNUEkyX0VWRU5UX0lSX1ZPTFVNRV9SQ19TVEFURV9DSEFOR0VEKQogCQlyZXR1cm47CiAKQEAgLTYyNjYsNiArNjQwNiw5IEBACiAJTXBpMkV2ZW50RGF0YUlyUGh5c2ljYWxEaXNrX3QgKmV2ZW50X2RhdGEgPSBmd19ldmVudC0+ZXZlbnRfZGF0YTsKIAl1NjQgc2FzX2FkZHJlc3M7CiAKKwlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkKKwkJcmV0dXJuOworCiAJaWYgKGV2ZW50X2RhdGEtPlJlYXNvbkNvZGUgIT0gTVBJMl9FVkVOVF9JUl9QSFlTRElTS19SQ19TVEFURV9DSEFOR0VEKQogCQlyZXR1cm47CiAKQEAgLTY1MDksMTAgKzY2NTIsMTAgQEAKIAl1MzIgZGV2aWNlX2luZm87CiAJdTE2IHNsb3Q7CiAKLQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pOworCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZWFyY2ggZm9yIGVuZC1kZXZpY2VzOiBzdGFydFxuIiwgaW9jLT5uYW1lKTsKIAogCWlmIChsaXN0X2VtcHR5KCZpb2MtPnNhc19kZXZpY2VfbGlzdCkpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAKIAloYW5kbGUgPSAweEZGRkY7CiAJd2hpbGUgKCEobXB0MnNhc19jb25maWdfZ2V0X3Nhc19kZXZpY2VfcGcwKGlvYywgJm1waV9yZXBseSwKQEAgLTY1MzEsNiArNjY3NCw5IEBACiAJCV9zY3NpaF9tYXJrX3Jlc3BvbmRpbmdfc2FzX2RldmljZShpb2MsIHNhc19hZGRyZXNzLCBzbG90LAogCQkgICAgaGFuZGxlKTsKIAl9CitvdXQ6CisJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInNlYXJjaCBmb3IgZW5kLWRldmljZXM6IGNvbXBsZXRlXG4iLAorCSAgICBpb2MtPm5hbWUpOwogfQogCiAvKioKQEAgLTY2MDYsMTAgKzY3NTIsMTQgQEAKIAl1MTYgaGFuZGxlOwogCXU4IHBoeXNfZGlza19udW07CiAKLQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pOworCWlmICghaW9jLT5pcl9maXJtd2FyZSkKKwkJcmV0dXJuOworCisJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInNlYXJjaCBmb3IgcmFpZCB2b2x1bWVzOiBzdGFydFxuIiwKKwkgICAgaW9jLT5uYW1lKTsKIAogCWlmIChsaXN0X2VtcHR5KCZpb2MtPnJhaWRfZGV2aWNlX2xpc3QpKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJaGFuZGxlID0gMHhGRkZGOwogCXdoaWxlICghKG1wdDJzYXNfY29uZmlnX2dldF9yYWlkX3ZvbHVtZV9wZzEoaW9jLCAmbXBpX3JlcGx5LApAQCAtNjY0OCw2ICs2Nzk4LDkgQEAKIAkJCXNldF9iaXQoaGFuZGxlLCBpb2MtPnBkX2hhbmRsZXMpOwogCQl9CiAJfQorb3V0OgorCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZWFyY2ggZm9yIHJlc3BvbmRpbmcgcmFpZCB2b2x1bWVzOiAiCisJICAgICJjb21wbGV0ZVxuIiwgaW9jLT5uYW1lKTsKIH0KIAogLyoqCkBAIC02NzA3LDEwICs2ODYwLDEwIEBACiAJdTY0IHNhc19hZGRyZXNzOwogCXUxNiBoYW5kbGU7CiAKLQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pOworCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZWFyY2ggZm9yIGV4cGFuZGVyczogc3RhcnRcbiIsIGlvYy0+bmFtZSk7CiAKIAlpZiAobGlzdF9lbXB0eSgmaW9jLT5zYXNfZXhwYW5kZXJfbGlzdCkpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAKIAloYW5kbGUgPSAweEZGRkY7CiAJd2hpbGUgKCEobXB0MnNhc19jb25maWdfZ2V0X2V4cGFuZGVyX3BnMChpb2MsICZtcGlfcmVwbHksICZleHBhbmRlcl9wZzAsCkBAIC02NzI5LDYgKzY4ODIsOCBAQAogCQlfc2NzaWhfbWFya19yZXNwb25kaW5nX2V4cGFuZGVyKGlvYywgc2FzX2FkZHJlc3MsIGhhbmRsZSk7CiAJfQogCisgb3V0OgorCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZWFyY2ggZm9yIGV4cGFuZGVyczogY29tcGxldGVcbiIsIGlvYy0+bmFtZSk7CiB9CiAKIC8qKgpAQCAtNjc0NCw2ICs2ODk5LDggQEAKIAlzdHJ1Y3QgX3Nhc19ub2RlICpzYXNfZXhwYW5kZXI7CiAJc3RydWN0IF9yYWlkX2RldmljZSAqcmFpZF9kZXZpY2UsICpyYWlkX2RldmljZV9uZXh0OwogCisJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInJlbW92aW5nIHVucmVzcG9uZGluZyBkZXZpY2VzOiBzdGFydFxuIiwKKwkgICAgaW9jLT5uYW1lKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzYXNfZGV2aWNlLCBzYXNfZGV2aWNlX25leHQsCiAJICAgICZpb2MtPnNhc19kZXZpY2VfbGlzdCwgbGlzdCkgewpAQCAtNjc2Myw2ICs2OTIwLDkgQEAKIAkJX3Njc2loX3JlbW92ZV9kZXZpY2UoaW9jLCBzYXNfZGV2aWNlKTsKIAl9CiAKKwlpZiAoIWlvYy0+aXJfZmlybXdhcmUpCisJCWdvdG8gcmV0cnlfZXhwYW5kZXJfc2VhcmNoOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJhaWRfZGV2aWNlLCByYWlkX2RldmljZV9uZXh0LAogCSAgICAmaW9jLT5yYWlkX2RldmljZV9saXN0LCBsaXN0KSB7CiAJCWlmIChyYWlkX2RldmljZS0+cmVzcG9uZGluZykgewpAQCAtNjc4OSw1MiArNjk0OSwxNzAgQEAKIAkJbXB0MnNhc19leHBhbmRlcl9yZW1vdmUoaW9jLCBzYXNfZXhwYW5kZXItPnNhc19hZGRyZXNzKTsKIAkJZ290byByZXRyeV9leHBhbmRlcl9zZWFyY2g7CiAJfQorCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJyZW1vdmluZyB1bnJlc3BvbmRpbmcgZGV2aWNlczogY29tcGxldGVcbiIsCisJICAgIGlvYy0+bmFtZSk7CisJLyogdW5ibG9jayBkZXZpY2VzICovCisJX3Njc2loX3VibG9ja19pb19hbGxfZGV2aWNlKGlvYyk7Cit9CisKK3N0YXRpYyB2b2lkCitfc2NzaWhfcmVmcmVzaF9leHBhbmRlcl9saW5rcyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCisJc3RydWN0IF9zYXNfbm9kZSAqc2FzX2V4cGFuZGVyLCB1MTYgaGFuZGxlKQoreworCU1waTJFeHBhbmRlclBhZ2UxX3QgZXhwYW5kZXJfcGcxOworCU1waTJDb25maWdSZXBseV90IG1waV9yZXBseTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgc2FzX2V4cGFuZGVyLT5udW1fcGh5cyA7IGkrKykgeworCQlpZiAoKG1wdDJzYXNfY29uZmlnX2dldF9leHBhbmRlcl9wZzEoaW9jLCAmbXBpX3JlcGx5LAorCQkgICAgJmV4cGFuZGVyX3BnMSwgaSwgaGFuZGxlKSkpIHsKKwkJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsCisJCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCisJCW1wdDJzYXNfdHJhbnNwb3J0X3VwZGF0ZV9saW5rcyhpb2MsIHNhc19leHBhbmRlci0+c2FzX2FkZHJlc3MsCisJCSAgICBsZTE2X3RvX2NwdShleHBhbmRlcl9wZzEuQXR0YWNoZWREZXZIYW5kbGUpLCBpLAorCQkgICAgZXhwYW5kZXJfcGcxLk5lZ290aWF0ZWRMaW5rUmF0ZSA+PiA0KTsKKwl9CiB9CiAKIC8qKgotICogX3Njc2loX2hpZGVfdW5oaWRlX3Nhc19kZXZpY2VzIC0gYWRkL3JlbW92ZSBkZXZpY2UgdG8vZnJvbSBPUworICogX3Njc2loX3NjYW5fZm9yX2RldmljZXNfYWZ0ZXJfcmVzZXQgLSBzY2FuIGZvciBkZXZpY2VzIGFmdGVyIGhvc3QgcmVzZXQKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICoKICAqIFJldHVybiBub3RoaW5nLgogICovCiBzdGF0aWMgdm9pZAotX3Njc2loX2hpZGVfdW5oaWRlX3Nhc19kZXZpY2VzKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKK19zY3NpaF9zY2FuX2Zvcl9kZXZpY2VzX2FmdGVyX3Jlc2V0KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKIHsKLQlzdHJ1Y3QgX3Nhc19kZXZpY2UgKnNhc19kZXZpY2UsICpzYXNfZGV2aWNlX25leHQ7CisJTXBpMkV4cGFuZGVyUGFnZTBfdCBleHBhbmRlcl9wZzA7CisJTXBpMlNhc0RldmljZVBhZ2UwX3Qgc2FzX2RldmljZV9wZzA7CisJTXBpMlJhaWRWb2xQYWdlMV90IHZvbHVtZV9wZzE7CisJTXBpMlJhaWRWb2xQYWdlMF90IHZvbHVtZV9wZzA7CisJTXBpMlJhaWRQaHlzRGlza1BhZ2UwX3QgcGRfcGcwOworCU1waTJFdmVudElyQ29uZmlnRWxlbWVudF90IGVsZW1lbnQ7CisJTXBpMkNvbmZpZ1JlcGx5X3QgbXBpX3JlcGx5OworCXU4IHBoeXNfZGlza19udW07CisJdTE2IGlvY19zdGF0dXM7CisJdTE2IGhhbmRsZSwgcGFyZW50X2hhbmRsZTsKKwl1NjQgc2FzX2FkZHJlc3M7CisJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlOworCXN0cnVjdCBfc2FzX25vZGUgKmV4cGFuZGVyX2RldmljZTsKKwlzdGF0aWMgc3RydWN0IF9yYWlkX2RldmljZSAqcmFpZF9kZXZpY2U7CiAKLQlpZiAoIWlvYy0+aXNfd2FycGRyaXZlIHx8IGlvYy0+bWZnX3BnMTBfaGlkZV9mbGFnICE9Ci0JICAgIE1GR19QQUdFMTBfSElERV9JRl9WT0xfUFJFU0VOVCkKLQkJcmV0dXJuOworCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzY2FuIGRldmljZXM6IHN0YXJ0XG4iLCBpb2MtPm5hbWUpOwogCi0JaWYgKGlvYy0+aGlkZV9kcml2ZXMpIHsKLQkJaWYgKF9zY3NpaF9nZXRfbnVtX3ZvbHVtZXMoaW9jKSkKLQkJCXJldHVybjsKLQkJaW9jLT5oaWRlX2RyaXZlcyA9IDA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzYXNfZGV2aWNlLCBzYXNfZGV2aWNlX25leHQsCi0JCSAgICAmaW9jLT5zYXNfZGV2aWNlX2xpc3QsIGxpc3QpIHsKLQkJCWlmICghbXB0MnNhc190cmFuc3BvcnRfcG9ydF9hZGQoaW9jLCBzYXNfZGV2aWNlLT5oYW5kbGUsCi0JCQkJc2FzX2RldmljZS0+c2FzX2FkZHJlc3NfcGFyZW50KSkgewotCQkJCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOwotCQkJfSBlbHNlIGlmICghc2FzX2RldmljZS0+c3RhcmdldCkgewotCQkJCW1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfcmVtb3ZlKGlvYywKLQkJCQkgICAgc2FzX2RldmljZS0+c2FzX2FkZHJlc3MsCi0JCQkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCk7Ci0JCQkJX3Njc2loX3Nhc19kZXZpY2VfcmVtb3ZlKGlvYywgc2FzX2RldmljZSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIV9zY3NpaF9nZXRfbnVtX3ZvbHVtZXMoaW9jKSkKLQkJCXJldHVybjsKLQkJaW9jLT5oaWRlX2RyaXZlcyA9IDE7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzYXNfZGV2aWNlLCBzYXNfZGV2aWNlX25leHQsCi0JCSAgICAmaW9jLT5zYXNfZGV2aWNlX2xpc3QsIGxpc3QpIHsKLQkJCW1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfcmVtb3ZlKGlvYywKLQkJCSAgICBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzcywKLQkJCSAgICBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQpOworCV9zY3NpaF9zYXNfaG9zdF9yZWZyZXNoKGlvYyk7CisKKwkvKiBleHBhbmRlcnMgKi8KKwloYW5kbGUgPSAweEZGRkY7CisJd2hpbGUgKCEobXB0MnNhc19jb25maWdfZ2V0X2V4cGFuZGVyX3BnMChpb2MsICZtcGlfcmVwbHksICZleHBhbmRlcl9wZzAsCisJICAgIE1QSTJfU0FTX0VYUEFORF9QR0FEX0ZPUk1fR0VUX05FWFRfSE5ETCwgaGFuZGxlKSkpIHsKKwkJaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpICYKKwkJICAgIE1QSTJfSU9DU1RBVFVTX01BU0s7CisJCWlmIChpb2Nfc3RhdHVzID09IE1QSTJfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX1BBR0UpCisJCQlicmVhazsKKwkJaGFuZGxlID0gbGUxNl90b19jcHUoZXhwYW5kZXJfcGcwLkRldkhhbmRsZSk7CisJCWV4cGFuZGVyX2RldmljZSA9IG1wdDJzYXNfc2NzaWhfZXhwYW5kZXJfZmluZF9ieV9zYXNfYWRkcmVzcygKKwkJICAgIGlvYywgbGU2NF90b19jcHUoZXhwYW5kZXJfcGcwLlNBU0FkZHJlc3MpKTsKKwkJaWYgKGV4cGFuZGVyX2RldmljZSkKKwkJCV9zY3NpaF9yZWZyZXNoX2V4cGFuZGVyX2xpbmtzKGlvYywgZXhwYW5kZXJfZGV2aWNlLAorCQkJICAgIGhhbmRsZSk7CisJCWVsc2UKKwkJCV9zY3NpaF9leHBhbmRlcl9hZGQoaW9jLCBoYW5kbGUpOworCX0KKworCWlmICghaW9jLT5pcl9maXJtd2FyZSkKKwkJZ290byBza2lwX3RvX3NhczsKKworCS8qIHBoeXMgZGlzayAqLworCXBoeXNfZGlza19udW0gPSAweEZGOworCXdoaWxlICghKG1wdDJzYXNfY29uZmlnX2dldF9waHlzX2Rpc2tfcGcwKGlvYywgJm1waV9yZXBseSwKKwkgICAgJnBkX3BnMCwgTVBJMl9QSFlTRElTS19QR0FEX0ZPUk1fR0VUX05FWFRfUEhZU0RJU0tOVU0sCisJICAgIHBoeXNfZGlza19udW0pKSkgeworCQlpb2Nfc3RhdHVzID0gbGUxNl90b19jcHUobXBpX3JlcGx5LklPQ1N0YXR1cykgJgorCQkgICAgTVBJMl9JT0NTVEFUVVNfTUFTSzsKKwkJaWYgKGlvY19zdGF0dXMgPT0gTVBJMl9JT0NTVEFUVVNfQ09ORklHX0lOVkFMSURfUEFHRSkKKwkJCWJyZWFrOworCQlwaHlzX2Rpc2tfbnVtID0gcGRfcGcwLlBoeXNEaXNrTnVtOworCQloYW5kbGUgPSBsZTE2X3RvX2NwdShwZF9wZzAuRGV2SGFuZGxlKTsKKwkJc2FzX2RldmljZSA9IF9zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfaGFuZGxlKGlvYywgaGFuZGxlKTsKKwkJaWYgKHNhc19kZXZpY2UpCisJCQljb250aW51ZTsKKwkJaWYgKG1wdDJzYXNfY29uZmlnX2dldF9zYXNfZGV2aWNlX3BnMChpb2MsICZtcGlfcmVwbHksCisJCSAgICAmc2FzX2RldmljZV9wZzAsIE1QSTJfU0FTX0RFVklDRV9QR0FEX0ZPUk1fSEFORExFLAorCQkgICAgaGFuZGxlKSAhPSAwKQorCQkJY29udGludWU7CisJCXBhcmVudF9oYW5kbGUgPSBsZTE2X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5QYXJlbnREZXZIYW5kbGUpOworCQlpZiAoIV9zY3NpaF9nZXRfc2FzX2FkZHJlc3MoaW9jLCBwYXJlbnRfaGFuZGxlLAorCQkgICAgJnNhc19hZGRyZXNzKSkgeworCQkJbXB0MnNhc190cmFuc3BvcnRfdXBkYXRlX2xpbmtzKGlvYywgc2FzX2FkZHJlc3MsCisJCQkgICAgaGFuZGxlLCBzYXNfZGV2aWNlX3BnMC5QaHlOdW0sCisJCQkgICAgTVBJMl9TQVNfTkVHX0xJTktfUkFURV8xXzUpOworCQkJc2V0X2JpdChoYW5kbGUsIGlvYy0+cGRfaGFuZGxlcyk7CisJCQlfc2NzaWhfYWRkX2RldmljZShpb2MsIGhhbmRsZSwgMCwgMSk7CiAJCX0KIAl9CisKKwkvKiB2b2x1bWVzICovCisJaGFuZGxlID0gMHhGRkZGOworCXdoaWxlICghKG1wdDJzYXNfY29uZmlnX2dldF9yYWlkX3ZvbHVtZV9wZzEoaW9jLCAmbXBpX3JlcGx5LAorCSAgICAmdm9sdW1lX3BnMSwgTVBJMl9SQUlEX1ZPTFVNRV9QR0FEX0ZPUk1fR0VUX05FWFRfSEFORExFLCBoYW5kbGUpKSkgeworCQlpb2Nfc3RhdHVzID0gbGUxNl90b19jcHUobXBpX3JlcGx5LklPQ1N0YXR1cykgJgorCQkgICAgTVBJMl9JT0NTVEFUVVNfTUFTSzsKKwkJaWYgKGlvY19zdGF0dXMgPT0gTVBJMl9JT0NTVEFUVVNfQ09ORklHX0lOVkFMSURfUEFHRSkKKwkJCWJyZWFrOworCQloYW5kbGUgPSBsZTE2X3RvX2NwdSh2b2x1bWVfcGcxLkRldkhhbmRsZSk7CisJCXJhaWRfZGV2aWNlID0gX3Njc2loX3JhaWRfZGV2aWNlX2ZpbmRfYnlfd3dpZChpb2MsCisJCSAgICBsZTY0X3RvX2NwdSh2b2x1bWVfcGcxLldXSUQpKTsKKwkJaWYgKHJhaWRfZGV2aWNlKQorCQkJY29udGludWU7CisJCWlmIChtcHQyc2FzX2NvbmZpZ19nZXRfcmFpZF92b2x1bWVfcGcwKGlvYywgJm1waV9yZXBseSwKKwkJICAgICZ2b2x1bWVfcGcwLCBNUEkyX1JBSURfVk9MVU1FX1BHQURfRk9STV9IQU5ETEUsIGhhbmRsZSwKKwkJICAgICBzaXplb2YoTXBpMlJhaWRWb2xQYWdlMF90KSkpCisJCQljb250aW51ZTsKKwkJaWYgKHZvbHVtZV9wZzAuVm9sdW1lU3RhdGUgPT0gTVBJMl9SQUlEX1ZPTF9TVEFURV9PUFRJTUFMIHx8CisJCSAgICB2b2x1bWVfcGcwLlZvbHVtZVN0YXRlID09IE1QSTJfUkFJRF9WT0xfU1RBVEVfT05MSU5FIHx8CisJCSAgICB2b2x1bWVfcGcwLlZvbHVtZVN0YXRlID09IE1QSTJfUkFJRF9WT0xfU1RBVEVfREVHUkFERUQpIHsKKwkJCW1lbXNldCgmZWxlbWVudCwgMCwgc2l6ZW9mKE1waTJFdmVudElyQ29uZmlnRWxlbWVudF90KSk7CisJCQllbGVtZW50LlJlYXNvbkNvZGUgPSBNUEkyX0VWRU5UX0lSX0NIQU5HRV9SQ19BRERFRDsKKwkJCWVsZW1lbnQuVm9sRGV2SGFuZGxlID0gdm9sdW1lX3BnMS5EZXZIYW5kbGU7CisJCQlfc2NzaWhfc2FzX3ZvbHVtZV9hZGQoaW9jLCAmZWxlbWVudCk7CisJCX0KKwl9CisKKyBza2lwX3RvX3NhczoKKworCS8qIHNhcyBkZXZpY2VzICovCisJaGFuZGxlID0gMHhGRkZGOworCXdoaWxlICghKG1wdDJzYXNfY29uZmlnX2dldF9zYXNfZGV2aWNlX3BnMChpb2MsICZtcGlfcmVwbHksCisJICAgICZzYXNfZGV2aWNlX3BnMCwgTVBJMl9TQVNfREVWSUNFX1BHQURfRk9STV9HRVRfTkVYVF9IQU5ETEUsCisJICAgIGhhbmRsZSkpKSB7CisJCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHkuSU9DU3RhdHVzKSAmCisJCSAgICBNUEkyX0lPQ1NUQVRVU19NQVNLOworCQlpZiAoaW9jX3N0YXR1cyA9PSBNUEkyX0lPQ1NUQVRVU19DT05GSUdfSU5WQUxJRF9QQUdFKQorCQkJYnJlYWs7CisJCWhhbmRsZSA9IGxlMTZfdG9fY3B1KHNhc19kZXZpY2VfcGcwLkRldkhhbmRsZSk7CisJCWlmICghKF9zY3NpaF9pc19lbmRfZGV2aWNlKAorCQkgICAgbGUzMl90b19jcHUoc2FzX2RldmljZV9wZzAuRGV2aWNlSW5mbykpKSkKKwkJCWNvbnRpbnVlOworCQlzYXNfZGV2aWNlID0gbXB0MnNhc19zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfc2FzX2FkZHJlc3MoaW9jLAorCQkgICAgbGU2NF90b19jcHUoc2FzX2RldmljZV9wZzAuU0FTQWRkcmVzcykpOworCQlpZiAoc2FzX2RldmljZSkKKwkJCWNvbnRpbnVlOworCQlwYXJlbnRfaGFuZGxlID0gbGUxNl90b19jcHUoc2FzX2RldmljZV9wZzAuUGFyZW50RGV2SGFuZGxlKTsKKwkJaWYgKCFfc2NzaWhfZ2V0X3Nhc19hZGRyZXNzKGlvYywgcGFyZW50X2hhbmRsZSwgJnNhc19hZGRyZXNzKSkgeworCQkJbXB0MnNhc190cmFuc3BvcnRfdXBkYXRlX2xpbmtzKGlvYywgc2FzX2FkZHJlc3MsIGhhbmRsZSwKKwkJCSAgICBzYXNfZGV2aWNlX3BnMC5QaHlOdW0sIE1QSTJfU0FTX05FR19MSU5LX1JBVEVfMV81KTsKKwkJCV9zY3NpaF9hZGRfZGV2aWNlKGlvYywgaGFuZGxlLCAwLCAwKTsKKwkJfQorCX0KKworCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzY2FuIGRldmljZXM6IGNvbXBsZXRlXG4iLCBpb2MtPm5hbWUpOwogfQogCisKIC8qKgogICogbXB0MnNhc19zY3NpaF9yZXNldF9oYW5kbGVyIC0gcmVzZXQgY2FsbGJhY2sgaGFuZGxlciAoZm9yIHNjc2loKQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CkBAIC02ODcwLDcgKzcxNDgsNiBAQAogCQl9CiAJCV9zY3NpaF9md19ldmVudF9jbGVhbnVwX3F1ZXVlKGlvYyk7CiAJCV9zY3NpaF9mbHVzaF9ydW5uaW5nX2NtZHMoaW9jKTsKLQkJX3Njc2loX3F1ZXVlX3Jlc2Nhbihpb2MpOwogCQlicmVhazsKIAljYXNlIE1QVDJfSU9DX0RPTkVfUkVTRVQ6CiAJCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogIgpAQCAtNjg4MCw2ICs3MTU3LDEzIEBACiAJCV9zY3NpaF9zZWFyY2hfcmVzcG9uZGluZ19zYXNfZGV2aWNlcyhpb2MpOwogCQlfc2NzaWhfc2VhcmNoX3Jlc3BvbmRpbmdfcmFpZF9kZXZpY2VzKGlvYyk7CiAJCV9zY3NpaF9zZWFyY2hfcmVzcG9uZGluZ19leHBhbmRlcnMoaW9jKTsKKwkJaWYgKCFpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKSB7CisJCQlfc2NzaWhfcHJlcF9kZXZpY2Vfc2Nhbihpb2MpOworCQkJX3Njc2loX3NlYXJjaF9yZXNwb25kaW5nX3Nhc19kZXZpY2VzKGlvYyk7CisJCQlfc2NzaWhfc2VhcmNoX3Jlc3BvbmRpbmdfcmFpZF9kZXZpY2VzKGlvYyk7CisJCQlfc2NzaWhfc2VhcmNoX3Jlc3BvbmRpbmdfZXhwYW5kZXJzKGlvYyk7CisJCQlfc2NzaWhfZXJyb3JfcmVjb3ZlcnlfZGVsZXRlX2RldmljZXMoaW9jKTsKKwkJfQogCQlicmVhazsKIAl9CiB9CkBAIC02ODk3LDcgKzcxODEsNiBAQAogewogCXN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudCA9IGNvbnRhaW5lcl9vZih3b3JrLAogCSAgICBzdHJ1Y3QgZndfZXZlbnRfd29yaywgZGVsYXllZF93b3JrLndvcmspOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gZndfZXZlbnQtPmlvYzsKIAogCS8qIHRoZSBxdWV1ZSBpcyBiZWluZyBmbHVzaGVkIHNvIGlnbm9yZSB0aGlzIGV2ZW50ICovCkBAIC02OTA3LDIzICs3MTkwLDIxIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoZndfZXZlbnQtPmV2ZW50ID09IE1QVDJTQVNfUkVTQ0FOX0FGVEVSX0hPU1RfUkVTRVQpIHsKLQkJX3Njc2loX2Z3X2V2ZW50X2ZyZWUoaW9jLCBmd19ldmVudCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19sb2NrLCBmbGFncyk7Ci0JCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KSB7Ci0JCQlpbml0X2NvbXBsZXRpb24oJmlvYy0+c2hvc3RfcmVjb3ZlcnlfZG9uZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19sb2NrLAotCQkJICAgIGZsYWdzKTsKLQkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlvYy0+c2hvc3RfcmVjb3ZlcnlfZG9uZSk7Ci0JCX0gZWxzZQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jaywKLQkJCSAgICBmbGFncyk7Ci0JCV9zY3NpaF9yZW1vdmVfdW5yZXNwb25kaW5nX3Nhc19kZXZpY2VzKGlvYyk7Ci0JCV9zY3NpaF9oaWRlX3VuaGlkZV9zYXNfZGV2aWNlcyhpb2MpOwotCQlyZXR1cm47Ci0JfQotCiAJc3dpdGNoIChmd19ldmVudC0+ZXZlbnQpIHsKKwljYXNlIE1QVDJTQVNfUkVNT1ZFX1VOUkVTUE9ORElOR19ERVZJQ0VTOgorCQl3aGlsZSAoc2NzaV9ob3N0X2luX3JlY292ZXJ5KGlvYy0+c2hvc3QpKQorCQkJc3NsZWVwKDEpOworCQlfc2NzaWhfcmVtb3ZlX3VucmVzcG9uZGluZ19zYXNfZGV2aWNlcyhpb2MpOworCQlfc2NzaWhfc2Nhbl9mb3JfZGV2aWNlc19hZnRlcl9yZXNldChpb2MpOworCQlicmVhazsKKwljYXNlIE1QVDJTQVNfUE9SVF9FTkFCTEVfQ09NUExFVEU6CisJCWlvYy0+c3RhcnRfc2NhbiA9IDA7CisKKworCisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicG9ydCBlbmFibGU6IGNvbXBsZXRlICIKKwkJICAgICJmcm9tIHdvcmtlciB0aHJlYWRcbiIsIGlvYy0+bmFtZSkpOworCQlicmVhazsKIAljYXNlIE1QVDJTQVNfVFVSTl9PTl9GQVVMVF9MRUQ6CiAJCV9zY3NpaF90dXJuX29uX2ZhdWx0X2xlZChpb2MsIGZ3X2V2ZW50LT5kZXZpY2VfaGFuZGxlKTsKIAkJYnJlYWs7CkBAIC03MTIwLDYgKzc0MDEsOCBAQAogCS5zbGF2ZV9jb25maWd1cmUJCT0gX3Njc2loX3NsYXZlX2NvbmZpZ3VyZSwKIAkudGFyZ2V0X2Rlc3Ryb3kJCQk9IF9zY3NpaF90YXJnZXRfZGVzdHJveSwKIAkuc2xhdmVfZGVzdHJveQkJCT0gX3Njc2loX3NsYXZlX2Rlc3Ryb3ksCisJLnNjYW5fZmluaXNoZWQJCQk9IF9zY3NpaF9zY2FuX2ZpbmlzaGVkLAorCS5zY2FuX3N0YXJ0CQkJPSBfc2NzaWhfc2Nhbl9zdGFydCwKIAkuY2hhbmdlX3F1ZXVlX2RlcHRoIAkJPSBfc2NzaWhfY2hhbmdlX3F1ZXVlX2RlcHRoLAogCS5jaGFuZ2VfcXVldWVfdHlwZQkJPSBfc2NzaWhfY2hhbmdlX3F1ZXVlX3R5cGUsCiAJLmVoX2Fib3J0X2hhbmRsZXIJCT0gX3Njc2loX2Fib3J0LApAQCAtNzM1Myw2ICs3NjM2LDcgQEAKIAl9CiAKIAlzYXNfcmVtb3ZlX2hvc3Qoc2hvc3QpOworCW1wdDJzYXNfYmFzZV9kZXRhY2goaW9jKTsKIAlsaXN0X2RlbCgmaW9jLT5saXN0KTsKIAlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKIAlzY3NpX2hvc3RfcHV0KHNob3N0KTsKQEAgLTczNzksNyArNzY2MywxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjOwogCisJIC8qIG5vIEJpb3MsIHJldHVybiBpbW1lZGlhdGVseSAqLworCWlmICghaW9jLT5iaW9zX3BnMy5CaW9zVmVyc2lvbikKKwkJcmV0dXJuOworCiAJZGV2aWNlID0gTlVMTDsKKwlpc19yYWlkID0gMDsKIAlpZiAoaW9jLT5yZXFfYm9vdF9kZXZpY2UuZGV2aWNlKSB7CiAJCWRldmljZSA9ICBpb2MtPnJlcV9ib290X2RldmljZS5kZXZpY2U7CiAJCWlzX3JhaWQgPSBpb2MtPnJlcV9ib290X2RldmljZS5pc19yYWlkOwpAQCAtNzQxNSw4ICs3NzA0LDkgQEAKIAkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCkpIHsKIAkJCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOwogCQl9IGVsc2UgaWYgKCFzYXNfZGV2aWNlLT5zdGFyZ2V0KSB7Ci0JCQltcHQyc2FzX3RyYW5zcG9ydF9wb3J0X3JlbW92ZShpb2MsIHNhc19hZGRyZXNzLAotCQkJICAgIHNhc19hZGRyZXNzX3BhcmVudCk7CisJCQlpZiAoIWlvYy0+aXNfZHJpdmVyX2xvYWRpbmcpCisJCQkJbXB0MnNhc190cmFuc3BvcnRfcG9ydF9yZW1vdmUoaW9jLCBzYXNfYWRkcmVzcywKKwkJCQkJc2FzX2FkZHJlc3NfcGFyZW50KTsKIAkJCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOwogCQl9CiAJfQpAQCAtNzQ2MCwyMiArNzc1MCwyOCBAQAogCS8qIFNBUyBEZXZpY2UgTGlzdCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzYXNfZGV2aWNlLCBuZXh0LCAmaW9jLT5zYXNfZGV2aWNlX2luaXRfbGlzdCwKIAkgICAgbGlzdCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9tb3ZlX3RhaWwoJnNhc19kZXZpY2UtPmxpc3QsICZpb2MtPnNhc19kZXZpY2VfbGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CiAKIAkJaWYgKGlvYy0+aGlkZV9kcml2ZXMpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIW1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfYWRkKGlvYywgc2FzX2RldmljZS0+aGFuZGxlLAogCQkgICAgc2FzX2RldmljZS0+c2FzX2FkZHJlc3NfcGFyZW50KSkgewotCQkJX3Njc2loX3Nhc19kZXZpY2VfcmVtb3ZlKGlvYywgc2FzX2RldmljZSk7CisJCQlsaXN0X2RlbCgmc2FzX2RldmljZS0+bGlzdCk7CisJCQlrZnJlZShzYXNfZGV2aWNlKTsKKwkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKCFzYXNfZGV2aWNlLT5zdGFyZ2V0KSB7Ci0JCQltcHQyc2FzX3RyYW5zcG9ydF9wb3J0X3JlbW92ZShpb2MsCi0JCQkgICAgc2FzX2RldmljZS0+c2FzX2FkZHJlc3MsCi0JCQkgICAgc2FzX2RldmljZS0+c2FzX2FkZHJlc3NfcGFyZW50KTsKLQkJCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOworCQkJaWYgKCFpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKQorCQkJCW1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfcmVtb3ZlKGlvYywKKwkJCQkJc2FzX2RldmljZS0+c2FzX2FkZHJlc3MsCisJCQkJCXNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCk7CisJCQlsaXN0X2RlbCgmc2FzX2RldmljZS0+bGlzdCk7CisJCQlrZnJlZShzYXNfZGV2aWNlKTsKKwkJCWNvbnRpbnVlOworCiAJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7CisJCWxpc3RfbW92ZV90YWlsKCZzYXNfZGV2aWNlLT5saXN0LCAmaW9jLT5zYXNfZGV2aWNlX2xpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwogCX0KIH0KIApAQCAtNzQ4OCw5ICs3Nzg0LDcgQEAKIHN0YXRpYyB2b2lkCiBfc2NzaWhfcHJvYmVfZGV2aWNlcyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCiB7Ci0JdTE2IHZvbHVtZV9tYXBwaW5nX2ZsYWdzID0KLQkgICAgbGUxNl90b19jcHUoaW9jLT5pb2NfcGc4LklSVm9sdW1lTWFwcGluZ0ZsYWdzKSAmCi0JICAgIE1QSTJfSU9DUEFHRThfSVJGTEFHU19NQVNLX1ZPTFVNRV9NQVBQSU5HX01PREU7CisJdTE2IHZvbHVtZV9tYXBwaW5nX2ZsYWdzOwogCiAJaWYgKCEoaW9jLT5mYWN0cy5Qcm90b2NvbEZsYWdzICYgTVBJMl9JT0NGQUNUU19QUk9UT0NPTF9TQ1NJX0lOSVRJQVRPUikpCiAJCXJldHVybjsgIC8qIHJldHVybiB3aGVuIElPQyBkb2Vzbid0IHN1cHBvcnQgaW5pdGlhdG9yIG1vZGUgKi8KQEAgLTc0OTgsMTggKzc3OTIsOTMgQEAKIAlfc2NzaWhfcHJvYmVfYm9vdF9kZXZpY2VzKGlvYyk7CiAKIAlpZiAoaW9jLT5pcl9maXJtd2FyZSkgewotCQlpZiAoKHZvbHVtZV9tYXBwaW5nX2ZsYWdzICYKLQkJICAgICBNUEkyX0lPQ1BBR0U4X0lSRkxBR1NfSElHSF9WT0xVTUVfTUFQUElORykpIHsKLQkJCV9zY3NpaF9wcm9iZV9zYXMoaW9jKTsKKwkJdm9sdW1lX21hcHBpbmdfZmxhZ3MgPQorCQkgICAgbGUxNl90b19jcHUoaW9jLT5pb2NfcGc4LklSVm9sdW1lTWFwcGluZ0ZsYWdzKSAmCisJCSAgICBNUEkyX0lPQ1BBR0U4X0lSRkxBR1NfTUFTS19WT0xVTUVfTUFQUElOR19NT0RFOworCQlpZiAodm9sdW1lX21hcHBpbmdfZmxhZ3MgPT0KKwkJICAgIE1QSTJfSU9DUEFHRThfSVJGTEFHU19MT1dfVk9MVU1FX01BUFBJTkcpIHsKIAkJCV9zY3NpaF9wcm9iZV9yYWlkKGlvYyk7CisJCQlfc2NzaWhfcHJvYmVfc2FzKGlvYyk7CiAJCX0gZWxzZSB7Ci0JCQlfc2NzaWhfcHJvYmVfcmFpZChpb2MpOwogCQkJX3Njc2loX3Byb2JlX3Nhcyhpb2MpOworCQkJX3Njc2loX3Byb2JlX3JhaWQoaW9jKTsKIAkJfQogCX0gZWxzZQogCQlfc2NzaWhfcHJvYmVfc2FzKGlvYyk7CiB9CiAKKworLyoqCisgKiBfc2NzaWhfc2Nhbl9zdGFydCAtIHNjc2kgbGxkIGNhbGxiYWNrIGZvciAuc2Nhbl9zdGFydAorICogQHNob3N0OiBTQ1NJIGhvc3QgcG9pbnRlcgorICoKKyAqIFRoZSBzaG9zdCBoYXMgdGhlIGFiaWxpdHkgdG8gZGlzY292ZXIgdGFyZ2V0cyBvbiBpdHMgb3duIGluc3RlYWQKKyAqIG9mIHNjYW5uaW5nIHRoZSBlbnRpcmUgYnVzLiAgSW4gb3VyIGltcGxlbWVudGlvbiwgd2Ugd2lsbCBraWNrIG9mZgorICogZmlybXdhcmUgZGlzY292ZXJ5LgorICovCitzdGF0aWMgdm9pZAorX3Njc2loX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzaG9zdCk7CisJaW50IHJjOworCisJaWYgKGRpYWdfYnVmZmVyX2VuYWJsZSAhPSAtMSAmJiBkaWFnX2J1ZmZlcl9lbmFibGUgIT0gMCkKKwkJbXB0MnNhc19lbmFibGVfZGlhZ19idWZmZXIoaW9jLCBkaWFnX2J1ZmZlcl9lbmFibGUpOworCisJaW9jLT5zdGFydF9zY2FuID0gMTsKKwlyYyA9IG1wdDJzYXNfcG9ydF9lbmFibGUoaW9jKTsKKworCWlmIChyYyAhPSAwKQorCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicG9ydCBlbmFibGU6IEZBSUxFRFxuIiwgaW9jLT5uYW1lKTsKK30KKworLyoqCisgKiBfc2NzaWhfc2Nhbl9maW5pc2hlZCAtIHNjc2kgbGxkIGNhbGxiYWNrIGZvciAuc2Nhbl9maW5pc2hlZAorICogQHNob3N0OiBTQ1NJIGhvc3QgcG9pbnRlcgorICogQHRpbWU6IGVsYXBzZWQgdGltZSBvZiB0aGUgc2NhbiBpbiBqaWZmaWVzCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBwZXJpb2RpY2FsbHkgdW50aWwgaXQgcmV0dXJucyAxIHdpdGggdGhlCisgKiBzY3NpX2hvc3QgYW5kIHRoZSBlbGFwc2VkIHRpbWUgb2YgdGhlIHNjYW4gaW4gamlmZmllcy4gSW4gb3VyIGltcGxlbWVudGlvbiwKKyAqIHdlIHdhaXQgZm9yIGZpcm13YXJlIGRpc2NvdmVyeSB0byBjb21wbGV0ZSwgdGhlbiByZXR1cm4gMS4KKyAqLworc3RhdGljIGludAorX3Njc2loX3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGxvbmcgdGltZSkKK3sKKwlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MgPSBzaG9zdF9wcml2KHNob3N0KTsKKworCWlmICh0aW1lID49ICgzMDAgKiBIWikpIHsKKwkJaW9jLT5iYXNlX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJwb3J0IGVuYWJsZTogRkFJTEVEIHdpdGggdGltZW91dCAiCisJCSAgICAiKHRpbWVvdXQ9MzAwcylcbiIsIGlvYy0+bmFtZSk7CisJCWlvYy0+aXNfZHJpdmVyX2xvYWRpbmcgPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoaW9jLT5zdGFydF9zY2FuKQorCQlyZXR1cm4gMDsKKworCWlmIChpb2MtPnN0YXJ0X3NjYW5fZmFpbGVkKSB7CisJCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJwb3J0IGVuYWJsZTogRkFJTEVEIHdpdGggIgorCQkgICAgIihpb2Nfc3RhdHVzPTB4JTA4eClcbiIsIGlvYy0+bmFtZSwgaW9jLT5zdGFydF9zY2FuX2ZhaWxlZCk7CisJCWlvYy0+aXNfZHJpdmVyX2xvYWRpbmcgPSAwOworCQlpb2MtPndhaXRfZm9yX2Rpc2NvdmVyeV90b19jb21wbGV0ZSA9IDA7CisJCWlvYy0+cmVtb3ZlX2hvc3QgPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicG9ydCBlbmFibGU6IFNVQ0NFU1NcbiIsIGlvYy0+bmFtZSk7CisJaW9jLT5iYXNlX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CisKKwlpZiAoaW9jLT53YWl0X2Zvcl9kaXNjb3ZlcnlfdG9fY29tcGxldGUpIHsKKwkJaW9jLT53YWl0X2Zvcl9kaXNjb3ZlcnlfdG9fY29tcGxldGUgPSAwOworCQlfc2NzaWhfcHJvYmVfZGV2aWNlcyhpb2MpOworCX0KKwltcHQyc2FzX2Jhc2Vfc3RhcnRfd2F0Y2hkb2coaW9jKTsKKwlpb2MtPmlzX2RyaXZlcl9sb2FkaW5nID0gMDsKKwlyZXR1cm4gMTsKK30KKworCiAvKioKICAqIF9zY3NpaF9wcm9iZSAtIGF0dGFjaCBhbmQgYWRkIHNjc2kgaG9zdAogICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0CkBAIC03NTQ2LDYgKzc5MTUsNyBAQAogCWlvYy0+dG1fY2JfaWR4ID0gdG1fY2JfaWR4OwogCWlvYy0+Y3RsX2NiX2lkeCA9IGN0bF9jYl9pZHg7CiAJaW9jLT5iYXNlX2NiX2lkeCA9IGJhc2VfY2JfaWR4OworCWlvYy0+cG9ydF9lbmFibGVfY2JfaWR4ID0gcG9ydF9lbmFibGVfY2JfaWR4OwogCWlvYy0+dHJhbnNwb3J0X2NiX2lkeCA9IHRyYW5zcG9ydF9jYl9pZHg7CiAJaW9jLT5zY3NpaF9jYl9pZHggPSBzY3NpaF9jYl9pZHg7CiAJaW9jLT5jb25maWdfY2JfaWR4ID0gY29uZmlnX2NiX2lkeDsKQEAgLTc2MTgsMTQgKzc5ODgsMTQgQEAKIAkJZ290byBvdXRfdGhyZWFkX2ZhaWw7CiAJfQogCi0JaW9jLT53YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZSA9IDE7CisJaW9jLT5pc19kcml2ZXJfbG9hZGluZyA9IDE7CiAJaWYgKChtcHQyc2FzX2Jhc2VfYXR0YWNoKGlvYykpKSB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwogCQlnb3RvIG91dF9hdHRhY2hfZmFpbDsKIAl9CiAKLQlpb2MtPndhaXRfZm9yX3BvcnRfZW5hYmxlX3RvX2NvbXBsZXRlID0gMDsKKwlzY3NpX3NjYW5faG9zdChzaG9zdCk7CiAJaWYgKGlvYy0+aXNfd2FycGRyaXZlKSB7CiAJCWlmIChpb2MtPm1mZ19wZzEwX2hpZGVfZmxhZyA9PSAgTUZHX1BBR0UxMF9FWFBPU0VfQUxMX0RJU0tTKQogCQkJaW9jLT5oaWRlX2RyaXZlcyA9IDA7CkBAIC03NjQ4LDYgKzgwMTgsNyBAQAogIG91dF90aHJlYWRfZmFpbDoKIAlsaXN0X2RlbCgmaW9jLT5saXN0KTsKIAlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKICBvdXRfYWRkX3Nob3N0X2ZhaWw6CiAJcmV0dXJuIC1FTk9ERVY7CiB9CkBAIC03ODk0LDYgKzgyNjUsOCBAQAogCiAJLyogYmFzZSBpbnRlcm5hbCBjb21tYW5kcyBjYWxsYmFjayBoYW5kbGVyICovCiAJYmFzZV9jYl9pZHggPSBtcHQyc2FzX2Jhc2VfcmVnaXN0ZXJfY2FsbGJhY2tfaGFuZGxlcihtcHQyc2FzX2Jhc2VfZG9uZSk7CisJcG9ydF9lbmFibGVfY2JfaWR4ID0gbXB0MnNhc19iYXNlX3JlZ2lzdGVyX2NhbGxiYWNrX2hhbmRsZXIoCisJCW1wdDJzYXNfcG9ydF9lbmFibGVfZG9uZSk7CiAKIAkvKiB0cmFuc3BvcnQgaW50ZXJuYWwgY29tbWFuZHMgY2FsbGJhY2sgaGFuZGxlciAqLwogCXRyYW5zcG9ydF9jYl9pZHggPSBtcHQyc2FzX2Jhc2VfcmVnaXN0ZXJfY2FsbGJhY2tfaGFuZGxlcigKQEAgLTc5NDgsNiArODMyMSw3IEBACiAJbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcihzY3NpX2lvX2NiX2lkeCk7CiAJbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcih0bV9jYl9pZHgpOwogCW1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIoYmFzZV9jYl9pZHgpOworCW1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIocG9ydF9lbmFibGVfY2JfaWR4KTsKIAltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKHRyYW5zcG9ydF9jYl9pZHgpOwogCW1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIoc2NzaWhfY2JfaWR4KTsKIAltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKGNvbmZpZ19jYl9pZHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc190cmFuc3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMKaW5kZXggMTVjNzk4MC4uMjMwNzMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc190cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JbWVtc2V0KGlkZW50aWZ5LCAwLCBzaXplb2YoaWRlbnRpZnkpKTsKKwltZW1zZXQoaWRlbnRpZnksIDAsIHNpemVvZigqaWRlbnRpZnkpKTsKIAlkZXZpY2VfaW5mbyA9IGxlMzJfdG9fY3B1KHNhc19kZXZpY2VfcGcwLkRldmljZUluZm8pOwogCiAJLyogc2FzX2FkZHJlc3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmMgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfOTR4eC5jCmluZGV4IDM1MDEyOTEuLjdlNDIzZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmMKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212Xzk0eHguYwpAQCAtMzk4LDYgKzM5OCwxNiBAQAogCS8qIGluaXQgcGh5cyAqLwogCW12c19waHlfaGFja3MobXZpKTsKIAorCS8qIGRpc2FibGUgbm9uIGRhdGEgZnJhbWUgcmV0cnkgKi8KKwl0bXAgPSBtdnNfY3IzMihtdmksIENNRF9TQVNfQ1RMMSk7CisJaWYgKChyZXZpc2lvbiA9PSBWQU5JUl9BMF9SRVYpIHx8CisJCShyZXZpc2lvbiA9PSBWQU5JUl9CMF9SRVYpIHx8CisJCShyZXZpc2lvbiA9PSBWQU5JUl9DMF9SRVYpKSB7CisJCXRtcCAmPSB+MHhmZmZmOworCQl0bXAgfD0gMHgwMDdmOworCQltdnNfY3czMihtdmksIENNRF9TQVNfQ1RMMSwgdG1wKTsKKwl9CisKIAkvKiBzZXQgTEVEIGJsaW5rIHdoZW4gSU8qLwogCW13MzIoTVZTX1BBX1ZTUl9BRERSLCBWU1JfUEhZX0FDVF9MRUQpOwogCXRtcCA9IG1yMzIoTVZTX1BBX1ZTUl9QT1JUKTsKQEAgLTUwMCw2ICs1MTAsMjcgQEAKIAl0bXAgfD0gQ0lOVF9QSFlfTUFTSzsKIAltdzMyKE1WU19JTlRfTUFTSywgdG1wKTsKIAorCXRtcCA9IG12c19jcjMyKG12aSwgQ01EX0xJTktfVElNRVIpOworCXRtcCB8PSAweEZGRkYwMDAwOworCW12c19jdzMyKG12aSwgQ01EX0xJTktfVElNRVIsIHRtcCk7CisKKwkvKiB0dW5lIFNUUCBwZXJmb3JtYW5jZSAqLworCXRtcCA9IDB4MDAzRjAwM0Y7CisJbXZzX2N3MzIobXZpLCBDTURfUExfVElNRVIsIHRtcCk7CisKKwkvKiBUaGlzIGNhbiBpbXByb3ZlIGV4cGFuZGVyIGxhcmdlIGJsb2NrIHNpemUgc2VxIHdyaXRlIHBlcmZvcm1hbmNlICovCisJdG1wID0gbXZzX2NyMzIobXZpLCBDTURfUE9SVF9MQVlFUl9USU1FUjEpOworCXRtcCB8PSAweEZGRkYwMDdGOworCW12c19jdzMyKG12aSwgQ01EX1BPUlRfTEFZRVJfVElNRVIxLCB0bXApOworCisJLyogY2hhbmdlIHRoZSBjb25uZWN0aW9uIG9wZW4tY2xvc2UgYmVoYXZpb3IgKGJpdCA5KQorCSAqIHNldCBiaXQ4IHRvIDEgZm9yIHBlcmZvcm1hbmNlIHR1bmluZyAqLworCXRtcCA9IG12c19jcjMyKG12aSwgQ01EX1NMX01PREUwKTsKKwl0bXAgfD0gMHgwMDAwMDMwMDsKKwkvKiBzZXQgYml0MCB0byAwIHRvIGVuYWJsZSByZXRyeSBmb3Igbm9fZGVzdCByZWplY3QgY2FzZSAqLworCXRtcCAmPSAweEZGRkZGRkZFOworCW12c19jdzMyKG12aSwgQ01EX1NMX01PREUwLCB0bXApOworCiAJLyogRW5hYmxlIFNSUyBpbnRlcnJ1cHQgKi8KIAltdzMyKE1WU19JTlRfTUFTS19TUlNfMCwgMHhGRkZGKTsKIApAQCAtODIzLDYgKzg1NCwxMCBAQAogCQlwaHktPmF0dF9kZXZfaW5mbyA9IFBPUlRfREVWX1NUUF9UUkdUIHwgMTsKIAl9CiAKKwkvKiBlbmFibGUgc3BpbiB1cCBiaXQgKi8KKwltdnNfd3JpdGVfcG9ydF9jZmdfYWRkcihtdmksIGksIFBIWVJfUEhZX1NUQVQpOworCW12c193cml0ZV9wb3J0X2NmZ19kYXRhKG12aSwgaSwgMHgwNCk7CisKIH0KIAogdm9pZCBtdnNfOTR4eF9waHlfc2V0X2xpbmtfcmF0ZShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHBoeV9pZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9kZWZzLmggYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfZGVmcy5oCmluZGV4IGRlYzdjYWQuLmY1NDUxOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9kZWZzLmgKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212X2RlZnMuaApAQCAtMzg3LDYgKzM4Nyw4IEBACiAJQ01EX1NMX01PREUwCQk9IDB4MUJDLCAvKiBTTCBNb2RlIDAgKi8KIAlDTURfU0xfTU9ERTEJCT0gMHgxQzAsIC8qIFNMIE1vZGUgMSAqLwogCUNNRF9QTkRfRklGT19DVEwxCT0gMHgxQzQsIC8qIFBlbmRpbmcgRklGTyBDb250cm9sIDEgKi8KKwlDTURfUE9SVF9MQVlFUl9USU1FUjEJPSAweDFFMCwgLyogUG9ydCBMYXllciBUaW1lciAxICovCisJQ01EX0xJTktfVElNRVIJCT0gMHgxRTQsIC8qIExpbmsgVGltZXIgKi8KIH07CiAKIGVudW0gbXZzX2luZm9fZmxhZ3MgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL212X2luaXQuYyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9pbml0LmMKaW5kZXggNGU5YWY2Ni4uNmY1ODkxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212X2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfaW5pdC5jCkBAIC01OSw3ICs1OSw3IEBACiAJLm5hbWUJCQk9IERSVl9OQU1FLAogCS5xdWV1ZWNvbW1hbmQJCT0gc2FzX3F1ZXVlY29tbWFuZCwKIAkudGFyZ2V0X2FsbG9jCQk9IHNhc190YXJnZXRfYWxsb2MsCi0JLnNsYXZlX2NvbmZpZ3VyZQk9IG12c19zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2NvbmZpZ3VyZQk9IHNhc19zbGF2ZV9jb25maWd1cmUsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gc2FzX3NsYXZlX2Rlc3Ryb3ksCiAJLnNjYW5fZmluaXNoZWQJCT0gbXZzX3NjYW5fZmluaXNoZWQsCiAJLnNjYW5fc3RhcnQJCT0gbXZzX3NjYW5fc3RhcnQsCkBAIC03NCw3ICs3NCw3IEBACiAJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAogCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IHNhc19laF9kZXZpY2VfcmVzZXRfaGFuZGxlciwKIAkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBzYXNfZWhfYnVzX3Jlc2V0X2hhbmRsZXIsCi0JLnNsYXZlX2FsbG9jCQk9IG12c19zbGF2ZV9hbGxvYywKKwkuc2xhdmVfYWxsb2MJCT0gc2FzX3NsYXZlX2FsbG9jLAogCS50YXJnZXRfZGVzdHJveQkJPSBzYXNfdGFyZ2V0X2Rlc3Ryb3ksCiAJLmlvY3RsCQkJPSBzYXNfaW9jdGwsCiAJLnNob3N0X2F0dHJzCQk9IG12c3RfaG9zdF9hdHRycywKQEAgLTcwNyw2ICs3MDcsMTUgQEAKIAl7IFBDSV9WREVWSUNFKFRUSSwgMHgyNzYwKSwgY2hpcF85NDgwIH0sCiAJewogCQkudmVuZG9yCQk9IDB4MWI0YiwKKwkJLmRldmljZQkJPSAweDk0ODAsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gMHg5NDgwLAorCQkuY2xhc3MJCT0gMCwKKwkJLmNsYXNzX21hc2sJPSAwLAorCQkuZHJpdmVyX2RhdGEJPSBjaGlwXzk0ODAsCisJfSwKKwl7CisJCS52ZW5kb3IJCT0gMHgxYjRiLAogCQkuZGV2aWNlCQk9IDB4OTQ0NSwKIAkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCiAJCS5zdWJkZXZpY2UJPSAweDk0ODAsCkBAIC03MjMsNiArNzMyLDE2IEBACiAJCS5jbGFzc19tYXNrCT0gMCwKIAkJLmRyaXZlcl9kYXRhCT0gY2hpcF85NDg1LAogCX0sCisJeyBQQ0lfVkRFVklDRShPQ1osIDB4MTAyMSksIGNoaXBfOTQ4NX0sIC8qIE9DWiBSZXZvRHJpdmUzICovCisJeyBQQ0lfVkRFVklDRShPQ1osIDB4MTAyMiksIGNoaXBfOTQ4NX0sIC8qIE9DWiBSZXZvRHJpdmUzL3pEcml2ZVI0IChleGFjdCBtb2RlbCB1bmtub3duKSAqLworCXsgUENJX1ZERVZJQ0UoT0NaLCAweDEwNDApLCBjaGlwXzk0ODV9LCAvKiBPQ1ogUmV2b0RyaXZlMy96RHJpdmVSNCAoZXhhY3QgbW9kZWwgdW5rbm93bikgKi8KKwl7IFBDSV9WREVWSUNFKE9DWiwgMHgxMDQxKSwgY2hpcF85NDg1fSwgLyogT0NaIFJldm9Ecml2ZTMvekRyaXZlUjQgKGV4YWN0IG1vZGVsIHVua25vd24pICovCisJeyBQQ0lfVkRFVklDRShPQ1osIDB4MTA0MiksIGNoaXBfOTQ4NX0sIC8qIE9DWiBSZXZvRHJpdmUzL3pEcml2ZVI0IChleGFjdCBtb2RlbCB1bmtub3duKSAqLworCXsgUENJX1ZERVZJQ0UoT0NaLCAweDEwNDMpLCBjaGlwXzk0ODV9LCAvKiBPQ1ogUmV2b0RyaXZlMy96RHJpdmVSNCAoZXhhY3QgbW9kZWwgdW5rbm93bikgKi8KKwl7IFBDSV9WREVWSUNFKE9DWiwgMHgxMDQ0KSwgY2hpcF85NDg1fSwgLyogT0NaIFJldm9Ecml2ZTMvekRyaXZlUjQgKGV4YWN0IG1vZGVsIHVua25vd24pICovCisJeyBQQ0lfVkRFVklDRShPQ1osIDB4MTA4MCksIGNoaXBfOTQ4NX0sIC8qIE9DWiBSZXZvRHJpdmUzL3pEcml2ZVI0IChleGFjdCBtb2RlbCB1bmtub3duKSAqLworCXsgUENJX1ZERVZJQ0UoT0NaLCAweDEwODMpLCBjaGlwXzk0ODV9LCAvKiBPQ1ogUmV2b0RyaXZlMy96RHJpdmVSNCAoZXhhY3QgbW9kZWwgdW5rbm93bikgKi8KKwl7IFBDSV9WREVWSUNFKE9DWiwgMHgxMDg0KSwgY2hpcF85NDg1fSwgLyogT0NaIFJldm9Ecml2ZTMvekRyaXZlUjQgKGV4YWN0IG1vZGVsIHVua25vd24pICovCiAKIAl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmMgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmMKaW5kZXggNDk1OGZlZi4uYTQ4ODRhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCWJyZWFrOwogCWNhc2UgUEhZX0ZVTkNfUkVMRUFTRV9TUElOVVBfSE9MRDoKIAlkZWZhdWx0OgotCQlyYyA9IC1FT1BOT1RTVVBQOworCQlyYyA9IC1FTk9TWVM7CiAJfQogCW1zbGVlcCgyMDApOwogCXJldHVybiByYzsKQEAgLTI2NSw2ICsyNjUsMTIgQEAKIAkJaWQtPmRldl90eXBlID0gcGh5LT5pZGVudGlmeS5kZXZpY2VfdHlwZTsKIAkJaWQtPmluaXRpYXRvcl9iaXRzID0gU0FTX1BST1RPQ09MX0FMTDsKIAkJaWQtPnRhcmdldF9iaXRzID0gcGh5LT5pZGVudGlmeS50YXJnZXRfcG9ydF9wcm90b2NvbHM7CisKKwkJLyogZGlyZWN0IGF0dGFjaGVkIFNBUyBkZXZpY2UgKi8KKwkJaWYgKHBoeS0+YXR0X2Rldl9pbmZvICYgUE9SVF9TU1BfVFJHVF9NQVNLKSB7CisJCQlNVlNfQ0hJUF9ESVNQLT53cml0ZV9wb3J0X2NmZ19hZGRyKG12aSwgaSwgUEhZUl9QSFlfU1RBVCk7CisJCQlNVlNfQ0hJUF9ESVNQLT53cml0ZV9wb3J0X2NmZ19kYXRhKG12aSwgaSwgMHgwMCk7CisJCX0KIAl9IGVsc2UgaWYgKHBoeS0+cGh5X3R5cGUgJiBQT1JUX1RZUEVfU0FUQSkgewogCQkvKk5vdGhpbmcqLwogCX0KQEAgLTI3NiwzNiArMjgyLDYgQEAKIAkJCQkgICBQT1JURV9CWVRFU19ETUFFRCk7CiB9CiAKLWludCBtdnNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldikKLXsKLQlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gc2Rldl90b19kb21haW5fZGV2KHNjc2lfZGV2KTsKLQlpZiAoZGV2X2lzX3NhdGEoZGV2KSkgewotCQkvKiBXZSBkb24ndCBuZWVkIHRvIHJlc2NhbiB0YXJnZXRzCi0JCSAqIGlmIFJFUE9SVF9MVU5TIHJlcXVlc3QgaXMgZmFpbGVkCi0JCSAqLwotCQlpZiAoc2NzaV9kZXYtPmx1biA+IDApCi0JCQlyZXR1cm4gLUVOWElPOwotCQlzY3NpX2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCA9IDE7Ci0JfQotCi0JcmV0dXJuIHNhc19zbGF2ZV9hbGxvYyhzY3NpX2Rldik7Ci19Ci0KLWludCBtdnNfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKLXsKLQlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gc2Rldl90b19kb21haW5fZGV2KHNkZXYpOwotCWludCByZXQgPSBzYXNfc2xhdmVfY29uZmlndXJlKHNkZXYpOwotCi0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlpZiAoIWRldl9pc19zYXRhKGRldikpIHsKLQkJc2FzX2NoYW5nZV9xdWV1ZV9kZXB0aChzZGV2LAotCQkJTVZTX1FVRVVFX1NJWkUsCi0JCQlTQ1NJX1FERVBUSF9ERUZBVUxUKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQgbXZzX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7CiAJaW50IGksIGo7CkBAIC00MjYsNyArNDAyLDcgQEAKIAkvKiBnZW5lcmF0ZSBvcGVuIGFkZHJlc3MgZnJhbWUgaGRyIChmaXJzdCAxMiBieXRlcykgKi8KIAkvKiBpbml0aWF0b3IsIFNNUCwgZnR5cGUgMWggKi8KIAlidWZfb2FmWzBdID0gKDEgPDwgNykgfCAoUFJPVE9DT0xfU01QIDw8IDQpIHwgMHgwMTsKLQlidWZfb2FmWzFdID0gZGV2LT5saW5rcmF0ZSAmIDB4ZjsKKwlidWZfb2FmWzFdID0gbWluKHNhc19wb3J0LT5saW5rcmF0ZSwgZGV2LT5saW5rcmF0ZSkgJiAweGY7CiAJKih1MTYgKikoYnVmX29hZiArIDIpID0gMHhGRkZGOwkJLyogU0FTIFNQRUMgKi8KIAltZW1jcHkoYnVmX29hZiArIDQsIGRldi0+c2FzX2FkZHIsIFNBU19BRERSX1NJWkUpOwogCkBAIC01NzEsNyArNTQ3LDcgQEAKIAkvKiBnZW5lcmF0ZSBvcGVuIGFkZHJlc3MgZnJhbWUgaGRyIChmaXJzdCAxMiBieXRlcykgKi8KIAkvKiBpbml0aWF0b3IsIFNUUCwgZnR5cGUgMWggKi8KIAlidWZfb2FmWzBdID0gKDEgPDwgNykgfCAoUFJPVE9DT0xfU1RQIDw8IDQpIHwgMHgxOwotCWJ1Zl9vYWZbMV0gPSBkZXYtPmxpbmtyYXRlICYgMHhmOworCWJ1Zl9vYWZbMV0gPSBtaW4oc2FzX3BvcnQtPmxpbmtyYXRlLCBkZXYtPmxpbmtyYXRlKSAmIDB4ZjsKIAkqKHUxNiAqKShidWZfb2FmICsgMikgPSBjcHVfdG9fYmUxNihtdmlfZGV2LT5kZXZpY2VfaWQgKyAxKTsKIAltZW1jcHkoYnVmX29hZiArIDQsIGRldi0+c2FzX2FkZHIsIFNBU19BRERSX1NJWkUpOwogCkBAIC02NzksNyArNjU1LDcgQEAKIAkvKiBnZW5lcmF0ZSBvcGVuIGFkZHJlc3MgZnJhbWUgaGRyIChmaXJzdCAxMiBieXRlcykgKi8KIAkvKiBpbml0aWF0b3IsIFNTUCwgZnR5cGUgMWggKi8KIAlidWZfb2FmWzBdID0gKDEgPDwgNykgfCAoUFJPVE9DT0xfU1NQIDw8IDQpIHwgMHgxOwotCWJ1Zl9vYWZbMV0gPSBkZXYtPmxpbmtyYXRlICYgMHhmOworCWJ1Zl9vYWZbMV0gPSBtaW4oc2FzX3BvcnQtPmxpbmtyYXRlLCBkZXYtPmxpbmtyYXRlKSAmIDB4ZjsKIAkqKHUxNiAqKShidWZfb2FmICsgMikgPSBjcHVfdG9fYmUxNihtdmlfZGV2LT5kZXZpY2VfaWQgKyAxKTsKIAltZW1jcHkoYnVmX29hZiArIDQsIGRldi0+c2FzX2FkZHIsIFNBU19BRERSX1NJWkUpOwogCkBAIC0xMjQxLDYgKzEyMTcsMTIgQEAKIAkJcG9ydC0+d2lkZV9wb3J0X3BoeW1hcCA9IHNhc19wb3J0LT5waHlfbWFzazsKIAkJbXZfcHJpbnRrKCJzZXQgd2lkZSBwb3J0IHBoeSBtYXAgJXhcbiIsIHNhc19wb3J0LT5waHlfbWFzayk7CiAJCW12c191cGRhdGVfd2lkZXBvcnQobXZpLCBzYXNfcGh5LT5pZCk7CisKKwkJLyogZGlyZWN0IGF0dGFjaGVkIFNBUyBkZXZpY2UgKi8KKwkJaWYgKHBoeS0+YXR0X2Rldl9pbmZvICYgUE9SVF9TU1BfVFJHVF9NQVNLKSB7CisJCQlNVlNfQ0hJUF9ESVNQLT53cml0ZV9wb3J0X2NmZ19hZGRyKG12aSwgaSwgUEhZUl9QSFlfU1RBVCk7CisJCQlNVlNfQ0hJUF9ESVNQLT53cml0ZV9wb3J0X2NmZ19kYXRhKG12aSwgaSwgMHgwNCk7CisJCX0KIAl9CiAJaWYgKGxvY2spCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12aS0+bG9jaywgZmxhZ3MpOwpAQCAtMTM4NywyOCArMTM2OSw2IEBACiAJbXZzX2Rldl9nb25lX25vdGlmeShkZXYpOwogfQogCi1zdGF0aWMgIHN0cnVjdCBzYXNfdGFzayAqbXZzX2FsbG9jX3Rhc2sodm9pZCkKLXsKLQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FzX3Rhc2spLCBHRlBfS0VSTkVMKTsKLQotCWlmICh0YXNrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZ0YXNrLT5saXN0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7Ci0JCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgPSBTQVNfVEFTS19TVEFURV9QRU5ESU5HOwotCQlpbml0X3RpbWVyKCZ0YXNrLT50aW1lcik7Ci0JCWluaXRfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7Ci0JfQotCXJldHVybiB0YXNrOwotfQotCi1zdGF0aWMgIHZvaWQgbXZzX2ZyZWVfdGFzayhzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCi17Ci0JaWYgKHRhc2spIHsKLQkJQlVHX09OKCFsaXN0X2VtcHR5KCZ0YXNrLT5saXN0KSk7Ci0JCWtmcmVlKHRhc2spOwotCX0KLX0KLQogc3RhdGljIHZvaWQgbXZzX3Rhc2tfZG9uZShzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCiB7CiAJaWYgKCFkZWxfdGltZXIoJnRhc2stPnRpbWVyKSkKQEAgLTE0MzIsNyArMTM5Miw3IEBACiAJc3RydWN0IHNhc190YXNrICp0YXNrID0gTlVMTDsKIAogCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDM7IHJldHJ5KyspIHsKLQkJdGFzayA9IG12c19hbGxvY190YXNrKCk7CisJCXRhc2sgPSBzYXNfYWxsb2NfdGFzayhHRlBfS0VSTkVMKTsKIAkJaWYgKCF0YXNrKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE0OTAsMTUgKzE0NTAsMTQgQEAKIAkJCQkgICAgU0FTX0FERFIoZGV2LT5zYXNfYWRkciksCiAJCQkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnJlc3AsCiAJCQkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQpOwotCQkJbXZzX2ZyZWVfdGFzayh0YXNrKTsKKwkJCXNhc19mcmVlX3Rhc2sodGFzayk7CiAJCQl0YXNrID0gTlVMTDsKIAogCQl9CiAJfQogZXhfZXJyOgogCUJVR19PTihyZXRyeSA9PSAzICYmIHRhc2sgIT0gTlVMTCk7Ci0JaWYgKHRhc2sgIT0gTlVMTCkKLQkJbXZzX2ZyZWVfdGFzayh0YXNrKTsKKwlzYXNfZnJlZV90YXNrKHRhc2spOwogCXJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuaCBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuaAppbmRleCA0NGI0NzQ1Li5jMDRhNGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmgKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5oCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSAibXZfZGVmcy5oIgogCiAjZGVmaW5lIERSVl9OQU1FCQkibXZzYXMiCi0jZGVmaW5lIERSVl9WRVJTSU9OCQkiMC44LjIiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMC44LjE2IgogI2RlZmluZSBNVlNfSURfTk9UX01BUFBFRAkweDdmCiAjZGVmaW5lIFdJREVfUE9SVF9NQVhfUEhZCQk0CiAjZGVmaW5lIG12X3ByaW50ayhmbXQsIGFyZyAuLi4pCVwKQEAgLTQ1OCw4ICs0NTgsNiBAQAogCQkJdm9pZCAqZnVuY2RhdGEpOwogdm9pZCBfX2RldmluaXQgbXZzX3NldF9zYXNfYWRkcihzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBvcnRfaWQsCiAJCQkJdTMyIG9mZl9sbywgdTMyIG9mZl9oaSwgdTY0IHNhc19hZGRyKTsKLWludCBtdnNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2Rldik7Ci1pbnQgbXZzX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogdm9pZCBtdnNfc2Nhbl9zdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CiBpbnQgbXZzX3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGxvbmcgdGltZSk7CiBpbnQgbXZzX3F1ZXVlX2NvbW1hbmQoc3RydWN0IHNhc190YXNrICp0YXNrLCBjb25zdCBpbnQgbnVtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212dW1pLmMgYi9kcml2ZXJzL3Njc2kvbXZ1bWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGNmMWRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL212dW1pLmMKQEAgLTAsMCArMSwyMDE4IEBACisvKgorICogTWFydmVsbCBVTUkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTEgTWFydmVsbC4gPGp5bGlAbWFydmVsbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICogVVNBCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAibXZ1bWkuaCIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigianlsaUBtYXJ2ZWxsLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIFVNSSBEcml2ZXIiKTsKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKG12dW1pX3BjaV90YWJsZSkgPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTF8yLCBQQ0lfREVWSUNFX0lEX01BUlZFTExfTVY5MTQzKSB9LAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbXZ1bWlfcGNpX3RhYmxlKTsKKworc3RhdGljIHZvaWQgdGFnX2luaXQoc3RydWN0IG12dW1pX3RhZyAqc3QsIHVuc2lnbmVkIHNob3J0IHNpemUpCit7CisJdW5zaWduZWQgc2hvcnQgaTsKKwlCVUdfT04oc2l6ZSAhPSBzdC0+c2l6ZSk7CisJc3QtPnRvcCA9IHNpemU7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJc3QtPnN0YWNrW2ldID0gc2l6ZSAtIDEgLSBpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdGFnX2dldF9vbmUoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwgc3RydWN0IG12dW1pX3RhZyAqc3QpCit7CisJQlVHX09OKHN0LT50b3AgPD0gMCk7CisJcmV0dXJuIHN0LT5zdGFja1stLXN0LT50b3BdOworfQorCitzdGF0aWMgdm9pZCB0YWdfcmVsZWFzZV9vbmUoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwgc3RydWN0IG12dW1pX3RhZyAqc3QsCisJCQkJCQkJdW5zaWduZWQgc2hvcnQgdGFnKQoreworCUJVR19PTihzdC0+dG9wID49IHN0LT5zaXplKTsKKwlzdC0+c3RhY2tbc3QtPnRvcCsrXSA9IHRhZzsKK30KKworc3RhdGljIGJvb2wgdGFnX2lzX2VtcHR5KHN0cnVjdCBtdnVtaV90YWcgKnN0KQoreworCWlmIChzdC0+dG9wID09IDApCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX3VubWFwX3BjaV9hZGRyKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgKiphZGRyX2FycmF5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9CQVNFX0FERFJFU1M7IGkrKykKKwkJaWYgKChwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBpKSAmIElPUkVTT1VSQ0VfTUVNKSAmJgorCQkJCQkJCQlhZGRyX2FycmF5W2ldKQorCQkJcGNpX2lvdW5tYXAoZGV2LCBhZGRyX2FycmF5W2ldKTsKK30KKworc3RhdGljIGludCBtdnVtaV9tYXBfcGNpX2FkZHIoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqKmFkZHJfYXJyYXkpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JBU0VfQUREUkVTUzsgaSsrKSB7CisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBpKSAmIElPUkVTT1VSQ0VfTUVNKSB7CisJCQlhZGRyX2FycmF5W2ldID0gcGNpX2lvbWFwKGRldiwgaSwgMCk7CisJCQlpZiAoIWFkZHJfYXJyYXlbaV0pIHsKKwkJCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBtYXAgQmFyWyVkXVxuIiwKKwkJCQkJCQkJCWkpOworCQkJCW12dW1pX3VubWFwX3BjaV9hZGRyKGRldiwgYWRkcl9hcnJheSk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0gZWxzZQorCQkJYWRkcl9hcnJheVtpXSA9IE5VTEw7CisKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJCYXIgJWQgOiAlcC5cbiIsIGksIGFkZHJfYXJyYXlbaV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG12dW1pX3JlcyAqbXZ1bWlfYWxsb2NfbWVtX3Jlc291cmNlKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsCisJCQkJZW51bSByZXNvdXJjZV90eXBlIHR5cGUsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBtdnVtaV9yZXMgKnJlcyA9IGt6YWxsb2Moc2l6ZW9mKCpyZXMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXNvdWNlIG1hbmFnZXIuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSRVNPVVJDRV9DQUNIRURfTUVNT1JZOgorCQlyZXMtPnZpcnRfYWRkciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVzLT52aXJ0X2FkZHIpIHsKKwkJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwKKwkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSxzaXplID0gJWQuXG4iLCBzaXplKTsKKwkJCWtmcmVlKHJlcyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkVTT1VSQ0VfVU5DQUNIRURfTUVNT1JZOgorCQlzaXplID0gcm91bmRfdXAoc2l6ZSwgOCk7CisJCXJlcy0+dmlydF9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobWhiYS0+cGRldiwgc2l6ZSwKKwkJCQkJCQkmcmVzLT5idXNfYWRkcik7CisJCWlmICghcmVzLT52aXJ0X2FkZHIpIHsKKwkJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwKKwkJCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBjb25zaXN0ZW50IG1lbSwiCisJCQkJCQkJInNpemUgPSAlZC5cbiIsIHNpemUpOworCQkJa2ZyZWUocmVzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW1lbXNldChyZXMtPnZpcnRfYWRkciwgMCwgc2l6ZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAidW5rbm93biByZXNvdXJjZSB0eXBlICVkLlxuIiwgdHlwZSk7CisJCWtmcmVlKHJlcyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJlcy0+dHlwZSA9IHR5cGU7CisJcmVzLT5zaXplID0gc2l6ZTsKKwlJTklUX0xJU1RfSEVBRCgmcmVzLT5lbnRyeSk7CisJbGlzdF9hZGRfdGFpbCgmcmVzLT5lbnRyeSwgJm1oYmEtPnJlc19saXN0KTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX3JlbGVhc2VfbWVtX3Jlc291cmNlKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpCit7CisJc3RydWN0IG12dW1pX3JlcyAqcmVzLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgdG1wLCAmbWhiYS0+cmVzX2xpc3QsIGVudHJ5KSB7CisJCXN3aXRjaCAocmVzLT50eXBlKSB7CisJCWNhc2UgUkVTT1VSQ0VfVU5DQUNIRURfTUVNT1JZOgorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChtaGJhLT5wZGV2LCByZXMtPnNpemUsCisJCQkJCQlyZXMtPnZpcnRfYWRkciwgcmVzLT5idXNfYWRkcik7CisJCQlicmVhazsKKwkJY2FzZSBSRVNPVVJDRV9DQUNIRURfTUVNT1JZOgorCQkJa2ZyZWUocmVzLT52aXJ0X2FkZHIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkJInVua25vd24gcmVzb3VyY2UgdHlwZSAlZFxuIiwgcmVzLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisJCWxpc3RfZGVsKCZyZXMtPmVudHJ5KTsKKwkJa2ZyZWUocmVzKTsKKwl9CisJbWhiYS0+ZndfZmxhZyAmPSB+TVZVTUlfRldfQUxMT0M7Cit9CisKKy8qKgorICogbXZ1bWlfbWFrZV9zZ2wgLQlQcmVwYXJlcyAgU0dMCisgKiBAbWhiYToJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICogQHNjbWQ6CQlTQ1NJIGNvbW1hbmQgZnJvbSB0aGUgbWlkLWxheWVyCisgKiBAc2dsX3A6CQlTR0wgdG8gYmUgZmlsbGVkIGluCisgKiBAc2dfY291bnQJCXJldHVybiB0aGUgbnVtYmVyIG9mIFNHIGVsZW1lbnRzCisgKgorICogSWYgc3VjY2Vzc2Z1bCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAuIG90aGVyd2lzZSwgaXQgcmV0dXJucyAtMS4KKyAqLworc3RhdGljIGludCBtdnVtaV9tYWtlX3NnbChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kLAorCQkJCQl2b2lkICpzZ2xfcCwgdW5zaWduZWQgY2hhciAqc2dfY291bnQpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3QgbXZ1bWlfc2dsICptX3NnID0gKHN0cnVjdCBtdnVtaV9zZ2wgKikgc2dsX3A7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IHNnbnVtID0gc2NzaV9zZ19jb3VudChzY21kKTsKKwlkbWFfYWRkcl90IGJ1c2FkZHI7CisKKwlpZiAoc2dudW0pIHsKKwkJc2cgPSBzY3NpX3NnbGlzdChzY21kKTsKKwkJKnNnX2NvdW50ID0gcGNpX21hcF9zZyhtaGJhLT5wZGV2LCBzZywgc2dudW0sCisJCQkJKGludCkgc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlpZiAoKnNnX2NvdW50ID4gbWhiYS0+bWF4X3NnZSkgeworCQkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAic2cgY291bnRbMHgleF0gaXMgYmlnZ2VyICIKKwkJCQkJCSJ0aGFuIG1heCBzZ1sweCV4XS5cbiIsCisJCQkJCQkqc2dfY291bnQsIG1oYmEtPm1heF9zZ2UpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAqc2dfY291bnQ7IGkrKykgeworCQkJYnVzYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZzZ1tpXSk7CisJCQltX3NnLT5iYXNlYWRkcl9sID0gY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhidXNhZGRyKSk7CisJCQltX3NnLT5iYXNlYWRkcl9oID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhidXNhZGRyKSk7CisJCQltX3NnLT5mbGFncyA9IDA7CisJCQltX3NnLT5zaXplID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbigmc2dbaV0pKTsKKwkJCWlmICgoaSArIDEpID09ICpzZ19jb3VudCkKKwkJCQltX3NnLT5mbGFncyB8PSBTR0RfRU9UOworCisJCQltX3NnKys7CisJCX0KKwl9IGVsc2UgeworCQlzY21kLT5TQ3AuZG1hX2hhbmRsZSA9IHNjc2lfYnVmZmxlbihzY21kKSA/CisJCQlwY2lfbWFwX3NpbmdsZShtaGJhLT5wZGV2LCBzY3NpX3NnbGlzdChzY21kKSwKKwkJCQlzY3NpX2J1ZmZsZW4oc2NtZCksCisJCQkJKGludCkgc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pCisJCQk6IDA7CisJCWJ1c2FkZHIgPSBzY21kLT5TQ3AuZG1hX2hhbmRsZTsKKwkJbV9zZy0+YmFzZWFkZHJfbCA9IGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoYnVzYWRkcikpOworCQltX3NnLT5iYXNlYWRkcl9oID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhidXNhZGRyKSk7CisJCW1fc2ctPmZsYWdzID0gU0dEX0VPVDsKKwkJbV9zZy0+c2l6ZSA9IGNwdV90b19sZTMyKHNjc2lfYnVmZmxlbihzY21kKSk7CisJCSpzZ19jb3VudCA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZ1bWlfaW50ZXJuYWxfY21kX3NnbChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLCBzdHJ1Y3QgbXZ1bWlfY21kICpjbWQsCisJCQkJCQkJdW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IG12dW1pX3NnbCAqbV9zZzsKKwl2b2lkICp2aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCBwaHlfYWRkcjsKKworCWlmIChzaXplID09IDApCisJCXJldHVybiAwOworCisJdmlydF9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobWhiYS0+cGRldiwgc2l6ZSwgJnBoeV9hZGRyKTsKKwlpZiAoIXZpcnRfYWRkcikKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KHZpcnRfYWRkciwgMCwgc2l6ZSk7CisKKwltX3NnID0gKHN0cnVjdCBtdnVtaV9zZ2wgKikgJmNtZC0+ZnJhbWUtPnBheWxvYWRbMF07CisJY21kLT5mcmFtZS0+c2dfY291bnRzID0gMTsKKwljbWQtPmRhdGFfYnVmID0gdmlydF9hZGRyOworCisJbV9zZy0+YmFzZWFkZHJfbCA9IGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMocGh5X2FkZHIpKTsKKwltX3NnLT5iYXNlYWRkcl9oID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhwaHlfYWRkcikpOworCW1fc2ctPmZsYWdzID0gU0dEX0VPVDsKKwltX3NnLT5zaXplID0gY3B1X3RvX2xlMzIoc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtdnVtaV9jbWQgKm12dW1pX2NyZWF0ZV9pbnRlcm5hbF9jbWQoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwKKwkJCQl1bnNpZ25lZCBpbnQgYnVmX3NpemUpCit7CisJc3RydWN0IG12dW1pX2NtZCAqY21kOworCisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmICghY21kKSB7CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgYSBpbnRlcm5hbCBjbWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJSU5JVF9MSVNUX0hFQUQoJmNtZC0+cXVldWVfcG9pbnRlcik7CisKKwljbWQtPmZyYW1lID0ga3phbGxvYyhtaGJhLT5pYl9tYXhfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbWQtPmZyYW1lKSB7CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEZXIgorCQkJIiBmcmFtZSxzaXplID0gJWQuXG4iLCBtaGJhLT5pYl9tYXhfc2l6ZSk7CisJCWtmcmVlKGNtZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChidWZfc2l6ZSkgeworCQlpZiAobXZ1bWlfaW50ZXJuYWxfY21kX3NnbChtaGJhLCBjbWQsIGJ1Zl9zaXplKSkgeworCQkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIKKwkJCQkJCSIgZm9yIGludGVybmFsIGZyYW1lXG4iKTsKKwkJCWtmcmVlKGNtZC0+ZnJhbWUpOworCQkJa2ZyZWUoY21kKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlCisJCWNtZC0+ZnJhbWUtPnNnX2NvdW50cyA9IDA7CisKKwlyZXR1cm4gY21kOworfQorCitzdGF0aWMgdm9pZCBtdnVtaV9kZWxldGVfaW50ZXJuYWxfY21kKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsCisJCQkJCQlzdHJ1Y3QgbXZ1bWlfY21kICpjbWQpCit7CisJc3RydWN0IG12dW1pX3NnbCAqbV9zZzsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlkbWFfYWRkcl90IHBoeV9hZGRyOworCisJaWYgKGNtZCAmJiBjbWQtPmZyYW1lKSB7CisJCWlmIChjbWQtPmZyYW1lLT5zZ19jb3VudHMpIHsKKwkJCW1fc2cgPSAoc3RydWN0IG12dW1pX3NnbCAqKSAmY21kLT5mcmFtZS0+cGF5bG9hZFswXTsKKwkJCXNpemUgPSBtX3NnLT5zaXplOworCisJCQlwaHlfYWRkciA9IChkbWFfYWRkcl90KSBtX3NnLT5iYXNlYWRkcl9sIHwKKwkJCQkoZG1hX2FkZHJfdCkgKChtX3NnLT5iYXNlYWRkcl9oIDw8IDE2KSA8PCAxNik7CisKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobWhiYS0+cGRldiwgc2l6ZSwgY21kLT5kYXRhX2J1ZiwKKwkJCQkJCQkJcGh5X2FkZHIpOworCQl9CisJCWtmcmVlKGNtZC0+ZnJhbWUpOworCQlrZnJlZShjbWQpOworCX0KK30KKworLyoqCisgKiBtdnVtaV9nZXRfY21kIC0JR2V0IGEgY29tbWFuZCBmcm9tIHRoZSBmcmVlIHBvb2wKKyAqIEBtaGJhOgkJQWRhcHRlciBzb2Z0IHN0YXRlCisgKgorICogUmV0dXJucyBhIGZyZWUgY29tbWFuZCBmcm9tIHRoZSBwb29sCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXZ1bWlfY21kICptdnVtaV9nZXRfY21kKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpCit7CisJc3RydWN0IG12dW1pX2NtZCAqY21kID0gTlVMTDsKKworCWlmIChsaWtlbHkoIWxpc3RfZW1wdHkoJm1oYmEtPmNtZF9wb29sKSkpIHsKKwkJY21kID0gbGlzdF9lbnRyeSgoJm1oYmEtPmNtZF9wb29sKS0+bmV4dCwKKwkJCQlzdHJ1Y3QgbXZ1bWlfY21kLCBxdWV1ZV9wb2ludGVyKTsKKwkJbGlzdF9kZWxfaW5pdCgmY21kLT5xdWV1ZV9wb2ludGVyKTsKKwl9IGVsc2UKKwkJZGV2X3dhcm4oJm1oYmEtPnBkZXYtPmRldiwgImNvbW1hbmQgcG9vbCBpcyBlbXB0eSFcbiIpOworCisJcmV0dXJuIGNtZDsKK30KKworLyoqCisgKiBtdnVtaV9yZXR1cm5fY21kIC0JUmV0dXJuIGEgY21kIHRvIGZyZWUgY29tbWFuZCBwb29sCisgKiBAbWhiYToJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICogQGNtZDoJCUNvbW1hbmQgcGFja2V0IHRvIGJlIHJldHVybmVkIHRvIGZyZWUgY29tbWFuZCBwb29sCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdnVtaV9yZXR1cm5fY21kKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsCisJCQkJCQlzdHJ1Y3QgbXZ1bWlfY21kICpjbWQpCit7CisJY21kLT5zY21kID0gTlVMTDsKKwlsaXN0X2FkZF90YWlsKCZjbWQtPnF1ZXVlX3BvaW50ZXIsICZtaGJhLT5jbWRfcG9vbCk7Cit9CisKKy8qKgorICogbXZ1bWlfZnJlZV9jbWRzIC0JRnJlZSBhbGwgdGhlIGNtZHMgaW4gdGhlIGZyZWUgY21kIHBvb2wKKyAqIEBtaGJhOgkJQWRhcHRlciBzb2Z0IHN0YXRlCisgKi8KK3N0YXRpYyB2b2lkIG12dW1pX2ZyZWVfY21kcyhzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCXN0cnVjdCBtdnVtaV9jbWQgKmNtZDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmbWhiYS0+Y21kX3Bvb2wpKSB7CisJCWNtZCA9IGxpc3RfZmlyc3RfZW50cnkoJm1oYmEtPmNtZF9wb29sLCBzdHJ1Y3QgbXZ1bWlfY21kLAorCQkJCQkJCXF1ZXVlX3BvaW50ZXIpOworCQlsaXN0X2RlbCgmY21kLT5xdWV1ZV9wb2ludGVyKTsKKwkJa2ZyZWUoY21kLT5mcmFtZSk7CisJCWtmcmVlKGNtZCk7CisJfQorfQorCisvKioKKyAqIG12dW1pX2FsbG9jX2NtZHMgLQlBbGxvY2F0ZXMgdGhlIGNvbW1hbmQgcGFja2V0cworICogQG1oYmE6CQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqCisgKi8KK3N0YXRpYyBpbnQgbXZ1bWlfYWxsb2NfY21kcyhzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCWludCBpOworCXN0cnVjdCBtdnVtaV9jbWQgKmNtZDsKKworCWZvciAoaSA9IDA7IGkgPCBtaGJhLT5tYXhfaW87IGkrKykgeworCQljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY21kKQorCQkJZ290byBlcnJfZXhpdDsKKworCQlJTklUX0xJU1RfSEVBRCgmY21kLT5xdWV1ZV9wb2ludGVyKTsKKwkJbGlzdF9hZGRfdGFpbCgmY21kLT5xdWV1ZV9wb2ludGVyLCAmbWhiYS0+Y21kX3Bvb2wpOworCQljbWQtPmZyYW1lID0ga3phbGxvYyhtaGJhLT5pYl9tYXhfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY21kLT5mcmFtZSkKKwkJCWdvdG8gZXJyX2V4aXQ7CisJfQorCXJldHVybiAwOworCitlcnJfZXhpdDoKKwlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY21kWzB4JXhdLlxuIiwgaSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtaGJhLT5jbWRfcG9vbCkpIHsKKwkJY21kID0gbGlzdF9maXJzdF9lbnRyeSgmbWhiYS0+Y21kX3Bvb2wsIHN0cnVjdCBtdnVtaV9jbWQsCisJCQkJCQlxdWV1ZV9wb2ludGVyKTsKKwkJbGlzdF9kZWwoJmNtZC0+cXVldWVfcG9pbnRlcik7CisJCWtmcmVlKGNtZC0+ZnJhbWUpOworCQlrZnJlZShjbWQpOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBtdnVtaV9nZXRfaWJfbGlzdF9lbnRyeShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLCB2b2lkICoqaWJfZW50cnkpCit7CisJdW5zaWduZWQgaW50IGliX3JwX3JlZywgY3VyX2liX2VudHJ5OworCisJaWYgKGF0b21pY19yZWFkKCZtaGJhLT5md19vdXRzdGFuZGluZykgPj0gbWhiYS0+bWF4X2lvKSB7CisJCWRldl93YXJuKCZtaGJhLT5wZGV2LT5kZXYsICJmaXJtd2FyZSBpbyBvdmVyZmxvdy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWliX3JwX3JlZyA9IGlvcmVhZDMyKG1oYmEtPm1taW8gKyBDTEFfSU5CX1JFQURfUE9JTlRFUik7CisKKwlpZiAodW5saWtlbHkoKChpYl9ycF9yZWcgJiBDTF9TTE9UX05VTV9NQVNLKSA9PQorCQkJKG1oYmEtPmliX2N1cl9zbG90ICYgQ0xfU0xPVF9OVU1fTUFTSykpICYmCisJCQkoKGliX3JwX3JlZyAmIENMX1BPSU5URVJfVE9HR0xFKSAhPQorCQkJKG1oYmEtPmliX2N1cl9zbG90ICYgQ0xfUE9JTlRFUl9UT0dHTEUpKSkpIHsKKwkJZGV2X3dhcm4oJm1oYmEtPnBkZXYtPmRldiwgIm5vIGZyZWUgc2xvdCB0byB1c2UuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWN1cl9pYl9lbnRyeSA9IG1oYmEtPmliX2N1cl9zbG90ICYgQ0xfU0xPVF9OVU1fTUFTSzsKKwljdXJfaWJfZW50cnkrKzsKKwlpZiAoY3VyX2liX2VudHJ5ID49IG1oYmEtPmxpc3RfbnVtX2lvKSB7CisJCWN1cl9pYl9lbnRyeSAtPSBtaGJhLT5saXN0X251bV9pbzsKKwkJbWhiYS0+aWJfY3VyX3Nsb3QgXj0gQ0xfUE9JTlRFUl9UT0dHTEU7CisJfQorCW1oYmEtPmliX2N1cl9zbG90ICY9IH5DTF9TTE9UX05VTV9NQVNLOworCW1oYmEtPmliX2N1cl9zbG90IHw9IChjdXJfaWJfZW50cnkgJiBDTF9TTE9UX05VTV9NQVNLKTsKKwkqaWJfZW50cnkgPSBtaGJhLT5pYl9saXN0ICsgY3VyX2liX2VudHJ5ICogbWhiYS0+aWJfbWF4X3NpemU7CisJYXRvbWljX2luYygmbWhiYS0+Zndfb3V0c3RhbmRpbmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX3NlbmRfaWJfbGlzdF9lbnRyeShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCWlvd3JpdGUzMigweGZmZiwgbWhiYS0+aWJfc2hhZG93KTsKKwlpb3dyaXRlMzIobWhiYS0+aWJfY3VyX3Nsb3QsIG1oYmEtPm1taW8gKyBDTEFfSU5CX1dSSVRFX1BPSU5URVIpOworfQorCitzdGF0aWMgY2hhciBtdnVtaV9jaGVja19vYl9mcmFtZShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQl1bnNpZ25lZCBpbnQgY3VyX29iZiwgc3RydWN0IG12dW1pX3JzcF9mcmFtZSAqcF9vdXRiX2ZyYW1lKQoreworCXVuc2lnbmVkIHNob3J0IHRhZywgcmVxdWVzdF9pZDsKKworCXVkZWxheSgxKTsKKwlwX291dGJfZnJhbWUgPSBtaGJhLT5vYl9saXN0ICsgY3VyX29iZiAqIG1oYmEtPm9iX21heF9zaXplOworCXJlcXVlc3RfaWQgPSBwX291dGJfZnJhbWUtPnJlcXVlc3RfaWQ7CisJdGFnID0gcF9vdXRiX2ZyYW1lLT50YWc7CisJaWYgKHRhZyA+IG1oYmEtPnRhZ19wb29sLnNpemUpIHsKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAib2IgZnJhbWUgZGF0YSBlcnJvclxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKG1oYmEtPnRhZ19jbWRbdGFnXSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgInRhZ1sweCV4XSB3aXRoIE5PIGNvbW1hbmRcbiIsIHRhZyk7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKG1oYmEtPnRhZ19jbWRbdGFnXS0+cmVxdWVzdF9pZCAhPSByZXF1ZXN0X2lkICYmCisJCQkJCQltaGJhLT5yZXF1ZXN0X2lkX2VuYWJsZWQpIHsKKwkJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgInJlcXVlc3QgSUQgZnJvbSBGVzoweCV4LCIKKwkJCQkJImNtZCByZXF1ZXN0IElEOjB4JXhcbiIsIHJlcXVlc3RfaWQsCisJCQkJCW1oYmEtPnRhZ19jbWRbdGFnXS0+cmVxdWVzdF9pZCk7CisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX3JlY2VpdmVfb2JfbGlzdF9lbnRyeShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCXVuc2lnbmVkIGludCBvYl93cml0ZV9yZWcsIG9iX3dyaXRlX3NoYWRvd19yZWc7CisJdW5zaWduZWQgaW50IGN1cl9vYmYsIGFzc2lnbl9vYmZfZW5kLCBpOworCXN0cnVjdCBtdnVtaV9vYl9kYXRhICpvYl9kYXRhOworCXN0cnVjdCBtdnVtaV9yc3BfZnJhbWUgKnBfb3V0Yl9mcmFtZTsKKworCWRvIHsKKwkJb2Jfd3JpdGVfcmVnID0gaW9yZWFkMzIobWhiYS0+bW1pbyArIENMQV9PVVRCX0NPUFlfUE9JTlRFUik7CisJCW9iX3dyaXRlX3NoYWRvd19yZWcgPSBpb3JlYWQzMihtaGJhLT5vYl9zaGFkb3cpOworCX0gd2hpbGUgKChvYl93cml0ZV9yZWcgJiBDTF9TTE9UX05VTV9NQVNLKSAhPSBvYl93cml0ZV9zaGFkb3dfcmVnKTsKKworCWN1cl9vYmYgPSBtaGJhLT5vYl9jdXJfc2xvdCAmIENMX1NMT1RfTlVNX01BU0s7CisJYXNzaWduX29iZl9lbmQgPSBvYl93cml0ZV9yZWcgJiBDTF9TTE9UX05VTV9NQVNLOworCisJaWYgKChvYl93cml0ZV9yZWcgJiBDTF9QT0lOVEVSX1RPR0dMRSkgIT0KKwkJCQkobWhiYS0+b2JfY3VyX3Nsb3QgJiBDTF9QT0lOVEVSX1RPR0dMRSkpIHsKKwkJYXNzaWduX29iZl9lbmQgKz0gbWhiYS0+bGlzdF9udW1faW87CisJfQorCisJZm9yIChpID0gKGFzc2lnbl9vYmZfZW5kIC0gY3VyX29iZik7IGkgIT0gMDsgaS0tKSB7CisJCWN1cl9vYmYrKzsKKwkJaWYgKGN1cl9vYmYgPj0gbWhiYS0+bGlzdF9udW1faW8pIHsKKwkJCWN1cl9vYmYgLT0gbWhiYS0+bGlzdF9udW1faW87CisJCQltaGJhLT5vYl9jdXJfc2xvdCBePSBDTF9QT0lOVEVSX1RPR0dMRTsKKwkJfQorCisJCXBfb3V0Yl9mcmFtZSA9IG1oYmEtPm9iX2xpc3QgKyBjdXJfb2JmICogbWhiYS0+b2JfbWF4X3NpemU7CisKKwkJLyogQ29weSBwb2ludGVyIG1heSBwb2ludCB0byBlbnRyeSBpbiBvdXRib3VuZCBsaXN0CisJCSogIGJlZm9yZSBlbnRyeSBoYXMgdmFsaWQgZGF0YQorCQkqLworCQlpZiAodW5saWtlbHkocF9vdXRiX2ZyYW1lLT50YWcgPiBtaGJhLT50YWdfcG9vbC5zaXplIHx8CisJCQltaGJhLT50YWdfY21kW3Bfb3V0Yl9mcmFtZS0+dGFnXSA9PSBOVUxMIHx8CisJCQlwX291dGJfZnJhbWUtPnJlcXVlc3RfaWQgIT0KKwkJCQltaGJhLT50YWdfY21kW3Bfb3V0Yl9mcmFtZS0+dGFnXS0+cmVxdWVzdF9pZCkpCisJCQlpZiAobXZ1bWlfY2hlY2tfb2JfZnJhbWUobWhiYSwgY3VyX29iZiwgcF9vdXRiX2ZyYW1lKSkKKwkJCQljb250aW51ZTsKKworCQlpZiAoIWxpc3RfZW1wdHkoJm1oYmEtPm9iX2RhdGFfbGlzdCkpIHsKKwkJCW9iX2RhdGEgPSAoc3RydWN0IG12dW1pX29iX2RhdGEgKikKKwkJCQlsaXN0X2ZpcnN0X2VudHJ5KCZtaGJhLT5vYl9kYXRhX2xpc3QsCisJCQkJCXN0cnVjdCBtdnVtaV9vYl9kYXRhLCBsaXN0KTsKKwkJCWxpc3RfZGVsX2luaXQoJm9iX2RhdGEtPmxpc3QpOworCQl9IGVsc2UgeworCQkJb2JfZGF0YSA9IE5VTEw7CisJCQlpZiAoY3VyX29iZiA9PSAwKSB7CisJCQkJY3VyX29iZiA9IG1oYmEtPmxpc3RfbnVtX2lvIC0gMTsKKwkJCQltaGJhLT5vYl9jdXJfc2xvdCBePSBDTF9QT0lOVEVSX1RPR0dMRTsKKwkJCX0gZWxzZQorCQkJCWN1cl9vYmYgLT0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJbWVtY3B5KG9iX2RhdGEtPmRhdGEsIHBfb3V0Yl9mcmFtZSwgbWhiYS0+b2JfbWF4X3NpemUpOworCQlwX291dGJfZnJhbWUtPnRhZyA9IDB4ZmY7CisKKwkJbGlzdF9hZGRfdGFpbCgmb2JfZGF0YS0+bGlzdCwgJm1oYmEtPmZyZWVfb2JfbGlzdCk7CisJfQorCW1oYmEtPm9iX2N1cl9zbG90ICY9IH5DTF9TTE9UX05VTV9NQVNLOworCW1oYmEtPm9iX2N1cl9zbG90IHw9IChjdXJfb2JmICYgQ0xfU0xPVF9OVU1fTUFTSyk7CisJaW93cml0ZTMyKG1oYmEtPm9iX2N1cl9zbG90LCBtaGJhLT5tbWlvICsgQ0xBX09VVEJfUkVBRF9QT0lOVEVSKTsKK30KKworc3RhdGljIHZvaWQgbXZ1bWlfcmVzZXQodm9pZCAqcmVncykKK3sKKwlpb3dyaXRlMzIoMCwgcmVncyArIENQVV9FTlBPSU5UQV9NQVNLX1JFRyk7CisJaWYgKGlvcmVhZDMyKHJlZ3MgKyBDUFVfQVJNX1RPX1BDSUVBX01TRzEpICE9IEhBTkRTSEFLRV9ET05FU1RBVEUpCisJCXJldHVybjsKKworCWlvd3JpdGUzMihEUkJMX1NPRlRfUkVTRVQsIHJlZ3MgKyBDUFVfUENJRUFfVE9fQVJNX0RSQkxfUkVHKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbXZ1bWlfc3RhcnQoc3RydWN0IG12dW1pX2hiYSAqbWhiYSk7CisKK3N0YXRpYyBpbnQgbXZ1bWlfd2FpdF9mb3Jfb3V0c3RhbmRpbmcoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwltaGJhLT5md19zdGF0ZSA9IEZXX1NUQVRFX0FCT1JUOworCW12dW1pX3Jlc2V0KG1oYmEtPm1taW8pOworCisJaWYgKG12dW1pX3N0YXJ0KG1oYmEpKQorCQlyZXR1cm4gRkFJTEVEOworCWVsc2UKKwkJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbXZ1bWlfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmE7CisKKwltaGJhID0gKHN0cnVjdCBtdnVtaV9oYmEgKikgc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCXNjbWRfcHJpbnRrKEtFUk5fTk9USUNFLCBzY21kLCAiUkVTRVQgLSVsZCBjbWQ9JXggcmV0cmllcz0leFxuIiwKKwkJCXNjbWQtPnNlcmlhbF9udW1iZXIsIHNjbWQtPmNtbmRbMF0sIHNjbWQtPnJldHJpZXMpOworCisJcmV0dXJuIG12dW1pX3dhaXRfZm9yX291dHN0YW5kaW5nKG1oYmEpOworfQorCitzdGF0aWMgaW50IG12dW1pX2lzc3VlX2Jsb2NrZWRfY21kKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsCisJCQkJCQlzdHJ1Y3QgbXZ1bWlfY21kICpjbWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNtZC0+Y21kX3N0YXR1cyA9IFJFUV9TVEFUVVNfUEVORElORzsKKworCWlmIChhdG9taWNfcmVhZCgmY21kLT5zeW5jX2NtZCkpIHsKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJImxhc3QgYmxvY2tlZCBjbWQgbm90IGZpbmlzaGVkLCBzeW5jX2NtZCA9ICVkXG4iLAorCQkJCQkJYXRvbWljX3JlYWQoJmNtZC0+c3luY19jbWQpKTsKKwkJQlVHX09OKDEpOworCQlyZXR1cm4gLTE7CisJfQorCWF0b21pY19pbmMoJmNtZC0+c3luY19jbWQpOworCXNwaW5fbG9ja19pcnFzYXZlKG1oYmEtPnNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwltaGJhLT5pbnN0YW5jZXQtPmZpcmVfY21kKG1oYmEsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtaGJhLT5zaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwl3YWl0X2V2ZW50X3RpbWVvdXQobWhiYS0+aW50X2NtZF93YWl0X3EsCisJCShjbWQtPmNtZF9zdGF0dXMgIT0gUkVRX1NUQVRVU19QRU5ESU5HKSwKKwkJTVZVTUlfSU5URVJOQUxfQ01EX1dBSVRfVElNRSAqIEhaKTsKKworCS8qIGNvbW1hbmQgdGltZW91dCAqLworCWlmIChhdG9taWNfcmVhZCgmY21kLT5zeW5jX2NtZCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUobWhiYS0+c2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlhdG9taWNfZGVjKCZjbWQtPnN5bmNfY21kKTsKKwkJaWYgKG1oYmEtPnRhZ19jbWRbY21kLT5mcmFtZS0+dGFnXSkgeworCQkJbWhiYS0+dGFnX2NtZFtjbWQtPmZyYW1lLT50YWddID0gMDsKKwkJCWRldl93YXJuKCZtaGJhLT5wZGV2LT5kZXYsICJUSU1FT1VUOnJlbGVhc2UgdGFnIFslZF1cbiIsCisJCQkJCQkJY21kLT5mcmFtZS0+dGFnKTsKKwkJCXRhZ19yZWxlYXNlX29uZShtaGJhLCAmbWhiYS0+dGFnX3Bvb2wsIGNtZC0+ZnJhbWUtPnRhZyk7CisJCX0KKwkJaWYgKCFsaXN0X2VtcHR5KCZjbWQtPnF1ZXVlX3BvaW50ZXIpKSB7CisJCQlkZXZfd2FybigmbWhiYS0+cGRldi0+ZGV2LAorCQkJCSJUSU1FT1VUOkEgaW50ZXJuYWwgY29tbWFuZCBkb2Vzbid0IHNlbmQhXG4iKTsKKwkJCWxpc3RfZGVsX2luaXQoJmNtZC0+cXVldWVfcG9pbnRlcik7CisJCX0gZWxzZQorCQkJYXRvbWljX2RlYygmbWhiYS0+Zndfb3V0c3RhbmRpbmcpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobWhiYS0+c2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXZ1bWlfcmVsZWFzZV9mdyhzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCW12dW1pX2ZyZWVfY21kcyhtaGJhKTsKKwltdnVtaV9yZWxlYXNlX21lbV9yZXNvdXJjZShtaGJhKTsKKwltdnVtaV91bm1hcF9wY2lfYWRkcihtaGJhLT5wZGV2LCBtaGJhLT5iYXNlX2FkZHIpOworCWtmcmVlKG1oYmEtPmhhbmRzaGFrZV9wYWdlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKG1oYmEtPnBkZXYpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtdnVtaV9mbHVzaF9jYWNoZShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCXN0cnVjdCBtdnVtaV9jbWQgKmNtZDsKKwlzdHJ1Y3QgbXZ1bWlfbXNnX2ZyYW1lICpmcmFtZTsKKwl1bnNpZ25lZCBjaGFyIGRldmljZV9pZCwgcmV0cnkgPSAwOworCXVuc2lnbmVkIGNoYXIgYml0Y291bnQgPSBzaXplb2YodW5zaWduZWQgY2hhcikgKiA4OworCisJZm9yIChkZXZpY2VfaWQgPSAwOyBkZXZpY2VfaWQgPCBtaGJhLT5tYXhfdGFyZ2V0X2lkOyBkZXZpY2VfaWQrKykgeworCQlpZiAoIShtaGJhLT50YXJnZXRfbWFwW2RldmljZV9pZCAvIGJpdGNvdW50XSAmCisJCQkJKDEgPDwgKGRldmljZV9pZCAlIGJpdGNvdW50KSkpKQorCQkJY29udGludWU7CitnZXRfY21kOgljbWQgPSBtdnVtaV9jcmVhdGVfaW50ZXJuYWxfY21kKG1oYmEsIDApOworCQlpZiAoIWNtZCkgeworCQkJaWYgKHJldHJ5KysgPj0gNSkgeworCQkJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IgorCQkJCQkiIGZvciBpbnRlcm5hbCBmbHVzaCBjYWNoZSBjbWQgZm9yICIKKwkJCQkJImRldmljZSAlZCIsIGRldmljZV9pZCk7CisJCQkJcmV0cnkgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlCisJCQkJZ290byBnZXRfY21kOworCQl9CisJCWNtZC0+c2NtZCA9IE5VTEw7CisJCWNtZC0+Y21kX3N0YXR1cyA9IFJFUV9TVEFUVVNfUEVORElORzsKKwkJYXRvbWljX3NldCgmY21kLT5zeW5jX2NtZCwgMCk7CisJCWZyYW1lID0gY21kLT5mcmFtZTsKKwkJZnJhbWUtPnJlcV9mdW5jdGlvbiA9IENMX0ZVTl9TQ1NJX0NNRDsKKwkJZnJhbWUtPmRldmljZV9pZCA9IGRldmljZV9pZDsKKwkJZnJhbWUtPmNtZF9mbGFnID0gQ01EX0ZMQUdfTk9OX0RBVEE7CisJCWZyYW1lLT5kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IDA7CisJCWZyYW1lLT5jZGJfbGVuZ3RoID0gTUFYX0NPTU1BTkRfU0laRTsKKwkJbWVtc2V0KGZyYW1lLT5jZGIsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQlmcmFtZS0+Y2RiWzBdID0gU0NTSV9DTURfTUFSVkVMTF9TUEVDSUZJQzsKKwkJZnJhbWUtPmNkYlsyXSA9IENEQl9DT1JFX1NIVVRET1dOOworCisJCW12dW1pX2lzc3VlX2Jsb2NrZWRfY21kKG1oYmEsIGNtZCk7CisJCWlmIChjbWQtPmNtZF9zdGF0dXMgIT0gU0FNX1NUQVRfR09PRCkgeworCQkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJCSJkZXZpY2UgJWQgZmx1c2ggY2FjaGUgZmFpbGVkLCBzdGF0dXM9MHgleC5cbiIsCisJCQkJZGV2aWNlX2lkLCBjbWQtPmNtZF9zdGF0dXMpOworCQl9CisKKwkJbXZ1bWlfZGVsZXRlX2ludGVybmFsX2NtZChtaGJhLCBjbWQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK212dW1pX2NhbGN1bGF0ZV9jaGVja3N1bShzdHJ1Y3QgbXZ1bWlfaHNfaGVhZGVyICpwX2hlYWRlciwKKwkJCQkJCQl1bnNpZ25lZCBzaG9ydCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqcHRyOworCXVuc2lnbmVkIGNoYXIgcmV0ID0gMCwgaTsKKworCXB0ciA9ICh1bnNpZ25lZCBjaGFyICopIHBfaGVhZGVyLT5mcmFtZV9jb250ZW50OworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlyZXQgXj0gKnB0cjsKKwkJcHRyKys7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBtdnVtaV9oc19idWlsZF9wYWdlKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsCisJCQkJc3RydWN0IG12dW1pX2hzX2hlYWRlciAqaHNfaGVhZGVyKQoreworCXN0cnVjdCBtdnVtaV9oc19wYWdlMiAqaHNfcGFnZTI7CisJc3RydWN0IG12dW1pX2hzX3BhZ2U0ICpoc19wYWdlNDsKKwlzdHJ1Y3QgbXZ1bWlfaHNfcGFnZTMgKmhzX3BhZ2UzOworCXN0cnVjdCB0aW1ldmFsIHRpbWU7CisJdW5zaWduZWQgaW50IGxvY2FsX3RpbWU7CisKKwlzd2l0Y2ggKGhzX2hlYWRlci0+cGFnZV9jb2RlKSB7CisJY2FzZSBIU19QQUdFX0hPU1RfSU5GTzoKKwkJaHNfcGFnZTIgPSAoc3RydWN0IG12dW1pX2hzX3BhZ2UyICopIGhzX2hlYWRlcjsKKwkJaHNfaGVhZGVyLT5mcmFtZV9sZW5ndGggPSBzaXplb2YoKmhzX3BhZ2UyKSAtIDQ7CisJCW1lbXNldChoc19oZWFkZXItPmZyYW1lX2NvbnRlbnQsIDAsIGhzX2hlYWRlci0+ZnJhbWVfbGVuZ3RoKTsKKwkJaHNfcGFnZTItPmhvc3RfdHlwZSA9IDM7IC8qIDMgbWVhbiBsaW51eCovCisJCWhzX3BhZ2UyLT5ob3N0X3Zlci52ZXJfbWFqb3IgPSBWRVJfTUFKT1I7CisJCWhzX3BhZ2UyLT5ob3N0X3Zlci52ZXJfbWlub3IgPSBWRVJfTUlOT1I7CisJCWhzX3BhZ2UyLT5ob3N0X3Zlci52ZXJfb2VtID0gVkVSX09FTTsKKwkJaHNfcGFnZTItPmhvc3RfdmVyLnZlcl9idWlsZCA9IFZFUl9CVUlMRDsKKwkJaHNfcGFnZTItPnN5c3RlbV9pb19idXMgPSAwOworCQloc19wYWdlMi0+c2xvdF9udW1iZXIgPSAwOworCQloc19wYWdlMi0+aW50cl9sZXZlbCA9IDA7CisJCWhzX3BhZ2UyLT5pbnRyX3ZlY3RvciA9IDA7CisJCWRvX2dldHRpbWVvZmRheSgmdGltZSk7CisJCWxvY2FsX3RpbWUgPSAodW5zaWduZWQgaW50KSAodGltZS50dl9zZWMgLQorCQkJCQkJKHN5c190ei50el9taW51dGVzd2VzdCAqIDYwKSk7CisJCWhzX3BhZ2UyLT5zZWNvbmRzX3NpbmNlMTk3MCA9IGxvY2FsX3RpbWU7CisJCWhzX2hlYWRlci0+Y2hlY2tzdW0gPSBtdnVtaV9jYWxjdWxhdGVfY2hlY2tzdW0oaHNfaGVhZGVyLAorCQkJCQkJaHNfaGVhZGVyLT5mcmFtZV9sZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgSFNfUEFHRV9GSVJNX0NUTDoKKwkJaHNfcGFnZTMgPSAoc3RydWN0IG12dW1pX2hzX3BhZ2UzICopIGhzX2hlYWRlcjsKKwkJaHNfaGVhZGVyLT5mcmFtZV9sZW5ndGggPSBzaXplb2YoKmhzX3BhZ2UzKSAtIDQ7CisJCW1lbXNldChoc19oZWFkZXItPmZyYW1lX2NvbnRlbnQsIDAsIGhzX2hlYWRlci0+ZnJhbWVfbGVuZ3RoKTsKKwkJaHNfaGVhZGVyLT5jaGVja3N1bSA9IG12dW1pX2NhbGN1bGF0ZV9jaGVja3N1bShoc19oZWFkZXIsCisJCQkJCQloc19oZWFkZXItPmZyYW1lX2xlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBIU19QQUdFX0NMX0lORk86CisJCWhzX3BhZ2U0ID0gKHN0cnVjdCBtdnVtaV9oc19wYWdlNCAqKSBoc19oZWFkZXI7CisJCWhzX2hlYWRlci0+ZnJhbWVfbGVuZ3RoID0gc2l6ZW9mKCpoc19wYWdlNCkgLSA0OworCQltZW1zZXQoaHNfaGVhZGVyLT5mcmFtZV9jb250ZW50LCAwLCBoc19oZWFkZXItPmZyYW1lX2xlbmd0aCk7CisJCWhzX3BhZ2U0LT5pYl9iYXNlYWRkcl9sID0gbG93ZXJfMzJfYml0cyhtaGJhLT5pYl9saXN0X3BoeXMpOworCQloc19wYWdlNC0+aWJfYmFzZWFkZHJfaCA9IHVwcGVyXzMyX2JpdHMobWhiYS0+aWJfbGlzdF9waHlzKTsKKworCQloc19wYWdlNC0+b2JfYmFzZWFkZHJfbCA9IGxvd2VyXzMyX2JpdHMobWhiYS0+b2JfbGlzdF9waHlzKTsKKwkJaHNfcGFnZTQtPm9iX2Jhc2VhZGRyX2ggPSB1cHBlcl8zMl9iaXRzKG1oYmEtPm9iX2xpc3RfcGh5cyk7CisJCWhzX3BhZ2U0LT5pYl9lbnRyeV9zaXplID0gbWhiYS0+aWJfbWF4X3NpemVfc2V0dGluZzsKKwkJaHNfcGFnZTQtPm9iX2VudHJ5X3NpemUgPSBtaGJhLT5vYl9tYXhfc2l6ZV9zZXR0aW5nOworCQloc19wYWdlNC0+b2JfZGVwdGggPSBtaGJhLT5saXN0X251bV9pbzsKKwkJaHNfcGFnZTQtPmliX2RlcHRoID0gbWhiYS0+bGlzdF9udW1faW87CisJCWhzX2hlYWRlci0+Y2hlY2tzdW0gPSBtdnVtaV9jYWxjdWxhdGVfY2hlY2tzdW0oaHNfaGVhZGVyLAorCQkJCQkJaHNfaGVhZGVyLT5mcmFtZV9sZW5ndGgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgImNhbm5vdCBidWlsZCBwYWdlLCBjb2RlWzB4JXhdXG4iLAorCQkJaHNfaGVhZGVyLT5wYWdlX2NvZGUpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogbXZ1bWlfaW5pdF9kYXRhIC0JSW5pdGlhbGl6ZSByZXF1ZXN0ZWQgZGF0ZSBmb3IgRlcKKyAqIEBtaGJhOgkJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICovCitzdGF0aWMgaW50IG12dW1pX2luaXRfZGF0YShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCXN0cnVjdCBtdnVtaV9vYl9kYXRhICpvYl9wb29sOworCXN0cnVjdCBtdnVtaV9yZXMgKnJlc19tZ250OworCXVuc2lnbmVkIGludCB0bXBfc2l6ZSwgb2Zmc2V0LCBpOworCXZvaWQgKnZpcm1lbSwgKnY7CisJZG1hX2FkZHJfdCBwOworCisJaWYgKG1oYmEtPmZ3X2ZsYWcgJiBNVlVNSV9GV19BTExPQykKKwkJcmV0dXJuIDA7CisKKwl0bXBfc2l6ZSA9IG1oYmEtPmliX21heF9zaXplICogbWhiYS0+bWF4X2lvOworCXRtcF9zaXplICs9IDEyOCArIG1oYmEtPm9iX21heF9zaXplICogbWhiYS0+bWF4X2lvOworCXRtcF9zaXplICs9IDggKyBzaXplb2YodTMyKSArIDE2OworCisJcmVzX21nbnQgPSBtdnVtaV9hbGxvY19tZW1fcmVzb3VyY2UobWhiYSwKKwkJCQkJUkVTT1VSQ0VfVU5DQUNIRURfTUVNT1JZLCB0bXBfc2l6ZSk7CisJaWYgKCFyZXNfbWdudCkgeworCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5ib3VuZCBsaXN0XG4iKTsKKwkJZ290byBmYWlsX2FsbG9jX2RtYV9idWY7CisJfQorCisJcCA9IHJlc19tZ250LT5idXNfYWRkcjsKKwl2ID0gcmVzX21nbnQtPnZpcnRfYWRkcjsKKwkvKiBpYl9saXN0ICovCisJb2Zmc2V0ID0gcm91bmRfdXAocCwgMTI4KSAtIHA7CisJcCArPSBvZmZzZXQ7CisJdiArPSBvZmZzZXQ7CisJbWhiYS0+aWJfbGlzdCA9IHY7CisJbWhiYS0+aWJfbGlzdF9waHlzID0gcDsKKwl2ICs9IG1oYmEtPmliX21heF9zaXplICogbWhiYS0+bWF4X2lvOworCXAgKz0gbWhiYS0+aWJfbWF4X3NpemUgKiBtaGJhLT5tYXhfaW87CisJLyogaWIgc2hhZG93ICovCisJb2Zmc2V0ID0gcm91bmRfdXAocCwgOCkgLSBwOworCXAgKz0gb2Zmc2V0OworCXYgKz0gb2Zmc2V0OworCW1oYmEtPmliX3NoYWRvdyA9IHY7CisJbWhiYS0+aWJfc2hhZG93X3BoeXMgPSBwOworCXAgKz0gc2l6ZW9mKHUzMik7CisJdiArPSBzaXplb2YodTMyKTsKKwkvKiBvYiBzaGFkb3cgKi8KKwlvZmZzZXQgPSByb3VuZF91cChwLCA4KSAtIHA7CisJcCArPSBvZmZzZXQ7CisJdiArPSBvZmZzZXQ7CisJbWhiYS0+b2Jfc2hhZG93ID0gdjsKKwltaGJhLT5vYl9zaGFkb3dfcGh5cyA9IHA7CisJcCArPSA4OworCXYgKz0gODsKKworCS8qIG9iIGxpc3QgKi8KKwlvZmZzZXQgPSByb3VuZF91cChwLCAxMjgpIC0gcDsKKwlwICs9IG9mZnNldDsKKwl2ICs9IG9mZnNldDsKKworCW1oYmEtPm9iX2xpc3QgPSB2OworCW1oYmEtPm9iX2xpc3RfcGh5cyA9IHA7CisKKwkvKiBvYiBkYXRhIHBvb2wgKi8KKwl0bXBfc2l6ZSA9IG1oYmEtPm1heF9pbyAqIChtaGJhLT5vYl9tYXhfc2l6ZSArIHNpemVvZigqb2JfcG9vbCkpOworCXRtcF9zaXplID0gcm91bmRfdXAodG1wX3NpemUsIDgpOworCisJcmVzX21nbnQgPSBtdnVtaV9hbGxvY19tZW1fcmVzb3VyY2UobWhiYSwKKwkJCQlSRVNPVVJDRV9DQUNIRURfTUVNT1JZLCB0bXBfc2l6ZSk7CisJaWYgKCFyZXNfbWdudCkgeworCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3V0Ym91bmQgZGF0YSBidWZmZXJcbiIpOworCQlnb3RvIGZhaWxfYWxsb2NfZG1hX2J1ZjsKKwl9CisJdmlybWVtID0gcmVzX21nbnQtPnZpcnRfYWRkcjsKKworCWZvciAoaSA9IG1oYmEtPm1heF9pbzsgaSAhPSAwOyBpLS0pIHsKKwkJb2JfcG9vbCA9IChzdHJ1Y3QgbXZ1bWlfb2JfZGF0YSAqKSB2aXJtZW07CisJCWxpc3RfYWRkX3RhaWwoJm9iX3Bvb2wtPmxpc3QsICZtaGJhLT5vYl9kYXRhX2xpc3QpOworCQl2aXJtZW0gKz0gbWhiYS0+b2JfbWF4X3NpemUgKyBzaXplb2YoKm9iX3Bvb2wpOworCX0KKworCXRtcF9zaXplID0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIG1oYmEtPm1heF9pbyArCisJCQkJc2l6ZW9mKHN0cnVjdCBtdnVtaV9jbWQgKikgKiBtaGJhLT5tYXhfaW87CisJdG1wX3NpemUgKz0gcm91bmRfdXAobWhiYS0+bWF4X3RhcmdldF9pZCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogOCkgLworCQkJCQkJKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDgpOworCisJcmVzX21nbnQgPSBtdnVtaV9hbGxvY19tZW1fcmVzb3VyY2UobWhiYSwKKwkJCQlSRVNPVVJDRV9DQUNIRURfTUVNT1JZLCB0bXBfc2l6ZSk7CisJaWYgKCFyZXNfbWdudCkgeworCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGFnIGFuZCB0YXJnZXQgbWFwXG4iKTsKKwkJZ290byBmYWlsX2FsbG9jX2RtYV9idWY7CisJfQorCisJdmlybWVtID0gcmVzX21nbnQtPnZpcnRfYWRkcjsKKwltaGJhLT50YWdfcG9vbC5zdGFjayA9IHZpcm1lbTsKKwltaGJhLT50YWdfcG9vbC5zaXplID0gbWhiYS0+bWF4X2lvOworCXRhZ19pbml0KCZtaGJhLT50YWdfcG9vbCwgbWhiYS0+bWF4X2lvKTsKKwl2aXJtZW0gKz0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIG1oYmEtPm1heF9pbzsKKworCW1oYmEtPnRhZ19jbWQgPSB2aXJtZW07CisJdmlybWVtICs9IHNpemVvZihzdHJ1Y3QgbXZ1bWlfY21kICopICogbWhiYS0+bWF4X2lvOworCisJbWhiYS0+dGFyZ2V0X21hcCA9IHZpcm1lbTsKKworCW1oYmEtPmZ3X2ZsYWcgfD0gTVZVTUlfRldfQUxMT0M7CisJcmV0dXJuIDA7CisKK2ZhaWxfYWxsb2NfZG1hX2J1ZjoKKwltdnVtaV9yZWxlYXNlX21lbV9yZXNvdXJjZShtaGJhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbXZ1bWlfaHNfcHJvY2Vzc19wYWdlKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsCisJCQkJc3RydWN0IG12dW1pX2hzX2hlYWRlciAqaHNfaGVhZGVyKQoreworCXN0cnVjdCBtdnVtaV9oc19wYWdlMSAqaHNfcGFnZTE7CisJdW5zaWduZWQgY2hhciBwYWdlX2NoZWNrc3VtOworCisJcGFnZV9jaGVja3N1bSA9IG12dW1pX2NhbGN1bGF0ZV9jaGVja3N1bShoc19oZWFkZXIsCisJCQkJCQloc19oZWFkZXItPmZyYW1lX2xlbmd0aCk7CisJaWYgKHBhZ2VfY2hlY2tzdW0gIT0gaHNfaGVhZGVyLT5jaGVja3N1bSkgeworCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJjaGVja3N1bSBlcnJvclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKGhzX2hlYWRlci0+cGFnZV9jb2RlKSB7CisJY2FzZSBIU19QQUdFX0ZJUk1fQ0FQOgorCQloc19wYWdlMSA9IChzdHJ1Y3QgbXZ1bWlfaHNfcGFnZTEgKikgaHNfaGVhZGVyOworCisJCW1oYmEtPm1heF9pbyA9IGhzX3BhZ2UxLT5tYXhfaW9fc3VwcG9ydDsKKwkJbWhiYS0+bGlzdF9udW1faW8gPSBoc19wYWdlMS0+Y2xfaW5vdXRfbGlzdF9kZXB0aDsKKwkJbWhiYS0+bWF4X3RyYW5zZmVyX3NpemUgPSBoc19wYWdlMS0+bWF4X3RyYW5zZmVyX3NpemU7CisJCW1oYmEtPm1heF90YXJnZXRfaWQgPSBoc19wYWdlMS0+bWF4X2RldmljZXNfc3VwcG9ydDsKKwkJbWhiYS0+aGJhX2NhcGFiaWxpdHkgPSBoc19wYWdlMS0+Y2FwYWJpbGl0eTsKKwkJbWhiYS0+aWJfbWF4X3NpemVfc2V0dGluZyA9IGhzX3BhZ2UxLT5jbF9pbl9tYXhfZW50cnlfc2l6ZTsKKwkJbWhiYS0+aWJfbWF4X3NpemUgPSAoMSA8PCBoc19wYWdlMS0+Y2xfaW5fbWF4X2VudHJ5X3NpemUpIDw8IDI7CisKKwkJbWhiYS0+b2JfbWF4X3NpemVfc2V0dGluZyA9IGhzX3BhZ2UxLT5jbF9vdXRfbWF4X2VudHJ5X3NpemU7CisJCW1oYmEtPm9iX21heF9zaXplID0gKDEgPDwgaHNfcGFnZTEtPmNsX291dF9tYXhfZW50cnlfc2l6ZSkgPDwgMjsKKworCQlkZXZfZGJnKCZtaGJhLT5wZGV2LT5kZXYsICJGVyB2ZXJzaW9uOiVkXG4iLAorCQkJCQkJaHNfcGFnZTEtPmZ3X3Zlci52ZXJfYnVpbGQpOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgImhhbmRzaGFrZTogcGFnZSBjb2RlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtdnVtaV9oYW5kc2hha2UgLQlNb3ZlIHRoZSBGVyB0byBSRUFEWSBzdGF0ZQorICogQG1oYmE6CQkJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICoKKyAqIER1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24sIEZXIHBhc3NlcyBjYW4gcG90ZW50aWFsbHkgYmUgaW4gYW55IG9uZSBvZgorICogc2V2ZXJhbCBwb3NzaWJsZSBzdGF0ZXMuIElmIHRoZSBGVyBpbiBvcGVyYXRpb25hbCwgd2FpdGluZy1mb3ItaGFuZHNoYWtlCisgKiBzdGF0ZXMsIGRyaXZlciBtdXN0IHRha2Ugc3RlcHMgdG8gYnJpbmcgaXQgdG8gcmVhZHkgc3RhdGUuIE90aGVyd2lzZSwgaXQKKyAqIGhhcyB0byB3YWl0IGZvciB0aGUgcmVhZHkgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQgbXZ1bWlfaGFuZHNoYWtlKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpCit7CisJdW5zaWduZWQgaW50IGhzX3N0YXRlLCB0bXAsIGhzX2Z1bjsKKwlzdHJ1Y3QgbXZ1bWlfaHNfaGVhZGVyICpoc19oZWFkZXI7CisJdm9pZCAqcmVncyA9IG1oYmEtPm1taW87CisKKwlpZiAobWhiYS0+Zndfc3RhdGUgPT0gRldfU1RBVEVfU1RBUlRJTkcpCisJCWhzX3N0YXRlID0gSFNfU19TVEFSVDsKKwllbHNlIHsKKwkJdG1wID0gaW9yZWFkMzIocmVncyArIENQVV9BUk1fVE9fUENJRUFfTVNHMCk7CisJCWhzX3N0YXRlID0gSFNfR0VUX1NUQVRFKHRtcCk7CisJCWRldl9kYmcoJm1oYmEtPnBkZXYtPmRldiwgImhhbmRzaGFrZSBzdGF0ZVsweCV4XS5cbiIsIGhzX3N0YXRlKTsKKwkJaWYgKEhTX0dFVF9TVEFUVVModG1wKSAhPSBIU19TVEFUVVNfT0spIHsKKwkJCW1oYmEtPmZ3X3N0YXRlID0gRldfU1RBVEVfU1RBUlRJTkc7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwloc19mdW4gPSAwOworCXN3aXRjaCAoaHNfc3RhdGUpIHsKKwljYXNlIEhTX1NfU1RBUlQ6CisJCW1oYmEtPmZ3X3N0YXRlID0gRldfU1RBVEVfSEFORFNIQUtJTkc7CisJCUhTX1NFVF9TVEFUVVMoaHNfZnVuLCBIU19TVEFUVVNfT0spOworCQlIU19TRVRfU1RBVEUoaHNfZnVuLCBIU19TX1JFU0VUKTsKKwkJaW93cml0ZTMyKEhBTkRTSEFLRV9TSUdOQVRVUkUsIHJlZ3MgKyBDUFVfUENJRUFfVE9fQVJNX01TRzEpOworCQlpb3dyaXRlMzIoaHNfZnVuLCByZWdzICsgQ1BVX1BDSUVBX1RPX0FSTV9NU0cwKTsKKwkJaW93cml0ZTMyKERSQkxfSEFORFNIQUtFLCByZWdzICsgQ1BVX1BDSUVBX1RPX0FSTV9EUkJMX1JFRyk7CisJCWJyZWFrOworCisJY2FzZSBIU19TX1JFU0VUOgorCQlpb3dyaXRlMzIobG93ZXJfMzJfYml0cyhtaGJhLT5oYW5kc2hha2VfcGFnZV9waHlzKSwKKwkJCQkJcmVncyArIENQVV9QQ0lFQV9UT19BUk1fTVNHMSk7CisJCWlvd3JpdGUzMih1cHBlcl8zMl9iaXRzKG1oYmEtPmhhbmRzaGFrZV9wYWdlX3BoeXMpLAorCQkJCQlyZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9NU0cxKTsKKwkJSFNfU0VUX1NUQVRVUyhoc19mdW4sIEhTX1NUQVRVU19PSyk7CisJCUhTX1NFVF9TVEFURShoc19mdW4sIEhTX1NfUEFHRV9BRERSKTsKKwkJaW93cml0ZTMyKGhzX2Z1biwgcmVncyArIENQVV9QQ0lFQV9UT19BUk1fTVNHMCk7CisJCWlvd3JpdGUzMihEUkJMX0hBTkRTSEFLRSwgcmVncyArIENQVV9QQ0lFQV9UT19BUk1fRFJCTF9SRUcpOworCisJCWJyZWFrOworCisJY2FzZSBIU19TX1BBR0VfQUREUjoKKwljYXNlIEhTX1NfUVVFUllfUEFHRToKKwljYXNlIEhTX1NfU0VORF9QQUdFOgorCQloc19oZWFkZXIgPSAoc3RydWN0IG12dW1pX2hzX2hlYWRlciAqKSBtaGJhLT5oYW5kc2hha2VfcGFnZTsKKwkJaWYgKGhzX2hlYWRlci0+cGFnZV9jb2RlID09IEhTX1BBR0VfRklSTV9DQVApIHsKKwkJCW1oYmEtPmhiYV90b3RhbF9wYWdlcyA9CisJCQkoKHN0cnVjdCBtdnVtaV9oc19wYWdlMSAqKSBoc19oZWFkZXIpLT50b3RhbF9wYWdlczsKKworCQkJaWYgKG1oYmEtPmhiYV90b3RhbF9wYWdlcyA9PSAwKQorCQkJCW1oYmEtPmhiYV90b3RhbF9wYWdlcyA9IEhTX1BBR0VfVE9UQUwtMTsKKwkJfQorCisJCWlmIChoc19zdGF0ZSA9PSBIU19TX1FVRVJZX1BBR0UpIHsKKwkJCWlmIChtdnVtaV9oc19wcm9jZXNzX3BhZ2UobWhiYSwgaHNfaGVhZGVyKSkgeworCQkJCUhTX1NFVF9TVEFURShoc19mdW4sIEhTX1NfQUJPUlQpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChtdnVtaV9pbml0X2RhdGEobWhiYSkpIHsKKwkJCQlIU19TRVRfU1RBVEUoaHNfZnVuLCBIU19TX0FCT1JUKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoaHNfc3RhdGUgPT0gSFNfU19QQUdFX0FERFIpIHsKKwkJCWhzX2hlYWRlci0+cGFnZV9jb2RlID0gMDsKKwkJCW1oYmEtPmhiYV90b3RhbF9wYWdlcyA9IEhTX1BBR0VfVE9UQUwtMTsKKwkJfQorCisJCWlmICgoaHNfaGVhZGVyLT5wYWdlX2NvZGUgKyAxKSA8PSBtaGJhLT5oYmFfdG90YWxfcGFnZXMpIHsKKwkJCWhzX2hlYWRlci0+cGFnZV9jb2RlKys7CisJCQlpZiAoaHNfaGVhZGVyLT5wYWdlX2NvZGUgIT0gSFNfUEFHRV9GSVJNX0NBUCkgeworCQkJCW12dW1pX2hzX2J1aWxkX3BhZ2UobWhiYSwgaHNfaGVhZGVyKTsKKwkJCQlIU19TRVRfU1RBVEUoaHNfZnVuLCBIU19TX1NFTkRfUEFHRSk7CisJCQl9IGVsc2UKKwkJCQlIU19TRVRfU1RBVEUoaHNfZnVuLCBIU19TX1FVRVJZX1BBR0UpOworCQl9IGVsc2UKKwkJCUhTX1NFVF9TVEFURShoc19mdW4sIEhTX1NfRU5EKTsKKworCQlIU19TRVRfU1RBVFVTKGhzX2Z1biwgSFNfU1RBVFVTX09LKTsKKwkJaW93cml0ZTMyKGhzX2Z1biwgcmVncyArIENQVV9QQ0lFQV9UT19BUk1fTVNHMCk7CisJCWlvd3JpdGUzMihEUkJMX0hBTkRTSEFLRSwgcmVncyArIENQVV9QQ0lFQV9UT19BUk1fRFJCTF9SRUcpOworCQlicmVhazsKKworCWNhc2UgSFNfU19FTkQ6CisJCS8qIFNldCBjb21tdW5pY2F0aW9uIGxpc3QgSVNSICovCisJCXRtcCA9IGlvcmVhZDMyKHJlZ3MgKyBDUFVfRU5QT0lOVEFfTUFTS19SRUcpOworCQl0bXAgfD0gSU5UX01BUF9DT01BT1VUIHwgSU5UX01BUF9DT01BRVJSOworCQlpb3dyaXRlMzIodG1wLCByZWdzICsgQ1BVX0VOUE9JTlRBX01BU0tfUkVHKTsKKwkJaW93cml0ZTMyKG1oYmEtPmxpc3RfbnVtX2lvLCBtaGJhLT5pYl9zaGFkb3cpOworCQkvKiBTZXQgSW5Cb3VuZCBMaXN0IEF2YWxpYWJsZSBjb3VudCBzaGFkb3cgKi8KKwkJaW93cml0ZTMyKGxvd2VyXzMyX2JpdHMobWhiYS0+aWJfc2hhZG93X3BoeXMpLAorCQkJCQlyZWdzICsgQ0xBX0lOQl9BVkFMX0NPVU5UX0JBU0VMKTsKKwkJaW93cml0ZTMyKHVwcGVyXzMyX2JpdHMobWhiYS0+aWJfc2hhZG93X3BoeXMpLAorCQkJCQlyZWdzICsgQ0xBX0lOQl9BVkFMX0NPVU5UX0JBU0VIKTsKKworCQkvKiBTZXQgT3V0Qm91bmQgTGlzdCBBdmFsaWFibGUgY291bnQgc2hhZG93ICovCisJCWlvd3JpdGUzMigobWhiYS0+bGlzdF9udW1faW8tMSkgfCBDTF9QT0lOVEVSX1RPR0dMRSwKKwkJCQkJCW1oYmEtPm9iX3NoYWRvdyk7CisJCWlvd3JpdGUzMihsb3dlcl8zMl9iaXRzKG1oYmEtPm9iX3NoYWRvd19waHlzKSwgcmVncyArIDB4NUIwKTsKKwkJaW93cml0ZTMyKHVwcGVyXzMyX2JpdHMobWhiYS0+b2Jfc2hhZG93X3BoeXMpLCByZWdzICsgMHg1QjQpOworCisJCW1oYmEtPmliX2N1cl9zbG90ID0gKG1oYmEtPmxpc3RfbnVtX2lvIC0gMSkgfCBDTF9QT0lOVEVSX1RPR0dMRTsKKwkJbWhiYS0+b2JfY3VyX3Nsb3QgPSAobWhiYS0+bGlzdF9udW1faW8gLSAxKSB8IENMX1BPSU5URVJfVE9HR0xFOworCQltaGJhLT5md19zdGF0ZSA9IEZXX1NUQVRFX1NUQVJURUQ7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAidW5rbm93biBoYW5kc2hha2Ugc3RhdGUgWzB4JXhdLlxuIiwKKwkJCQkJCQkJaHNfc3RhdGUpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtdnVtaV9oYW5kc2hha2VfZXZlbnQoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwl1bnNpZ25lZCBpbnQgaXNyX3N0YXR1czsKKwl1bnNpZ25lZCBsb25nIGJlZm9yZTsKKworCWJlZm9yZSA9IGppZmZpZXM7CisJbXZ1bWlfaGFuZHNoYWtlKG1oYmEpOworCWRvIHsKKwkJaXNyX3N0YXR1cyA9IG1oYmEtPmluc3RhbmNldC0+cmVhZF9md19zdGF0dXNfcmVnKG1oYmEtPm1taW8pOworCisJCWlmIChtaGJhLT5md19zdGF0ZSA9PSBGV19TVEFURV9TVEFSVEVEKQorCQkJcmV0dXJuIDA7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEZXX01BWF9ERUxBWSAqIEhaKSkgeworCQkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJCSJubyBoYW5kc2hha2UgcmVzcG9uc2UgYXQgc3RhdGUgMHgleC5cbiIsCisJCQkJICBtaGJhLT5md19zdGF0ZSk7CisJCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkJImlzciA6IGdsb2JhbD0weCV4LHN0YXR1cz0weCV4LlxuIiwKKwkJCQkJbWhiYS0+Z2xvYmFsX2lzciwgaXNyX3N0YXR1cyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcm1iKCk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9IHdoaWxlICghKGlzcl9zdGF0dXMgJiBEUkJMX0hBTkRTSEFLRV9JU1IpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtdnVtaV9jaGVja19oYW5kc2hha2Uoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwl2b2lkICpyZWdzID0gbWhiYS0+bW1pbzsKKwl1bnNpZ25lZCBpbnQgdG1wOworCXVuc2lnbmVkIGxvbmcgYmVmb3JlOworCisJYmVmb3JlID0gamlmZmllczsKKwl0bXAgPSBpb3JlYWQzMihyZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9NU0cxKTsKKwl3aGlsZSAoKHRtcCAhPSBIQU5EU0hBS0VfUkVBRFlTVEFURSkgJiYgKHRtcCAhPSBIQU5EU0hBS0VfRE9ORVNUQVRFKSkgeworCQlpZiAodG1wICE9IEhBTkRTSEFLRV9SRUFEWVNUQVRFKQorCQkJaW93cml0ZTMyKERSQkxfTVVfUkVTRVQsCisJCQkJCXJlZ3MgKyBDUFVfUENJRUFfVE9fQVJNX0RSQkxfUkVHKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgYmVmb3JlICsgRldfTUFYX0RFTEFZICogSFopKSB7CisJCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkJImludmFsaWQgc2lnbmF0dXJlIFsweCV4XS5cbiIsIHRtcCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCQlybWIoKTsKKwkJdG1wID0gaW9yZWFkMzIocmVncyArIENQVV9BUk1fVE9fUENJRUFfTVNHMSk7CisJfQorCisJbWhiYS0+Zndfc3RhdGUgPSBGV19TVEFURV9TVEFSVElORzsKKwlkZXZfZGJnKCZtaGJhLT5wZGV2LT5kZXYsICJzdGFydCBmaXJtd2FyZSBoYW5kc2hha2UuLi5cbiIpOworCWRvIHsKKwkJaWYgKG12dW1pX2hhbmRzaGFrZV9ldmVudChtaGJhKSkgeworCQkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJCQkiaGFuZHNoYWtlIGZhaWxlZCBhdCBzdGF0ZSAweCV4LlxuIiwKKwkJCQkJCW1oYmEtPmZ3X3N0YXRlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gd2hpbGUgKG1oYmEtPmZ3X3N0YXRlICE9IEZXX1NUQVRFX1NUQVJURUQpOworCisJZGV2X2RiZygmbWhiYS0+cGRldi0+ZGV2LCAiZmlybXdhcmUgaGFuZHNoYWtlIGRvbmVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG12dW1pX3N0YXJ0KHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpCit7CisJdm9pZCAqcmVncyA9IG1oYmEtPm1taW87CisJdW5zaWduZWQgaW50IHRtcDsKKwkvKiBjbGVhciBEb29yIGJlbGwgKi8KKwl0bXAgPSBpb3JlYWQzMihyZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9EUkJMX1JFRyk7CisJaW93cml0ZTMyKHRtcCwgcmVncyArIENQVV9BUk1fVE9fUENJRUFfRFJCTF9SRUcpOworCisJaW93cml0ZTMyKDB4M0ZGRkZGRkYsIHJlZ3MgKyBDUFVfQVJNX1RPX1BDSUVBX01BU0tfUkVHKTsKKwl0bXAgPSBpb3JlYWQzMihyZWdzICsgQ1BVX0VOUE9JTlRBX01BU0tfUkVHKSB8IElOVF9NQVBfRExfQ1BVMlBDSUVBOworCWlvd3JpdGUzMih0bXAsIHJlZ3MgKyBDUFVfRU5QT0lOVEFfTUFTS19SRUcpOworCWlmIChtdnVtaV9jaGVja19oYW5kc2hha2UobWhiYSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG12dW1pX2NvbXBsZXRlX2NtZCAtCUNvbXBsZXRlcyBhIGNvbW1hbmQKKyAqIEBtaGJhOgkJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICogQGNtZDoJCQlDb21tYW5kIHRvIGJlIGNvbXBsZXRlZAorICovCitzdGF0aWMgdm9pZCBtdnVtaV9jb21wbGV0ZV9jbWQoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwgc3RydWN0IG12dW1pX2NtZCAqY21kLAorCQkJCQlzdHJ1Y3QgbXZ1bWlfcnNwX2ZyYW1lICpvYl9mcmFtZSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kID0gY21kLT5zY21kOworCisJY21kLT5zY21kLT5TQ3AucHRyID0gTlVMTDsKKwlzY21kLT5yZXN1bHQgPSBvYl9mcmFtZS0+cmVxX3N0YXR1czsKKworCXN3aXRjaCAob2JfZnJhbWUtPnJlcV9zdGF0dXMpIHsKKwljYXNlIFNBTV9TVEFUX0dPT0Q6CisJCXNjbWQtPnJlc3VsdCB8PSBESURfT0sgPDwgMTY7CisJCWJyZWFrOworCWNhc2UgU0FNX1NUQVRfQlVTWToKKwkJc2NtZC0+cmVzdWx0IHw9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJYnJlYWs7CisJY2FzZSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT046CisJCXNjbWQtPnJlc3VsdCB8PSAoRElEX09LIDw8IDE2KTsKKwkJaWYgKG9iX2ZyYW1lLT5yc3BfZmxhZyAmIENMX1JTUF9GTEFHX1NFTlNFREFUQSkgeworCQkJbWVtY3B5KGNtZC0+c2NtZC0+c2Vuc2VfYnVmZmVyLCBvYl9mcmFtZS0+cGF5bG9hZCwKKwkJCQlzaXplb2Yoc3RydWN0IG12dW1pX3NlbnNlX2RhdGEpKTsKKwkJCXNjbWQtPnJlc3VsdCB8PSAgKERSSVZFUl9TRU5TRSA8PCAyNCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2NtZC0+cmVzdWx0IHw9IChEUklWRVJfSU5WQUxJRCA8PCAyNCkgfCAoRElEX0FCT1JUIDw8IDE2KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNjc2lfYnVmZmxlbihzY21kKSkgeworCQlpZiAoc2NzaV9zZ19jb3VudChzY21kKSkgeworCQkJcGNpX3VubWFwX3NnKG1oYmEtPnBkZXYsCisJCQkJc2NzaV9zZ2xpc3Qoc2NtZCksCisJCQkJc2NzaV9zZ19jb3VudChzY21kKSwKKwkJCQkoaW50KSBzY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0gZWxzZSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG1oYmEtPnBkZXYsCisJCQkJc2NtZC0+U0NwLmRtYV9oYW5kbGUsCisJCQkJc2NzaV9idWZmbGVuKHNjbWQpLAorCQkJCShpbnQpIHNjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQkJc2NtZC0+U0NwLmRtYV9oYW5kbGUgPSAwOworCQl9CisJfQorCWNtZC0+c2NtZC0+c2NzaV9kb25lKHNjbWQpOworCW12dW1pX3JldHVybl9jbWQobWhiYSwgY21kKTsKK30KK3N0YXRpYyB2b2lkIG12dW1pX2NvbXBsZXRlX2ludGVybmFsX2NtZChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQkJCQkJc3RydWN0IG12dW1pX2NtZCAqY21kLAorCQkJCQlzdHJ1Y3QgbXZ1bWlfcnNwX2ZyYW1lICpvYl9mcmFtZSkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmNtZC0+c3luY19jbWQpKSB7CisJCWNtZC0+Y21kX3N0YXR1cyA9IG9iX2ZyYW1lLT5yZXFfc3RhdHVzOworCisJCWlmICgob2JfZnJhbWUtPnJlcV9zdGF0dXMgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKSAmJgorCQkJCShvYl9mcmFtZS0+cnNwX2ZsYWcgJiBDTF9SU1BfRkxBR19TRU5TRURBVEEpICYmCisJCQkJY21kLT5kYXRhX2J1ZikgeworCQkJbWVtY3B5KGNtZC0+ZGF0YV9idWYsIG9iX2ZyYW1lLT5wYXlsb2FkLAorCQkJCQlzaXplb2Yoc3RydWN0IG12dW1pX3NlbnNlX2RhdGEpKTsKKwkJfQorCQlhdG9taWNfZGVjKCZjbWQtPnN5bmNfY21kKTsKKwkJd2FrZV91cCgmbWhiYS0+aW50X2NtZF93YWl0X3EpOworCX0KK30KKworc3RhdGljIHZvaWQgbXZ1bWlfc2hvd19ldmVudChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQkJc3RydWN0IG12dW1pX2RyaXZlcl9ldmVudCAqcHRyKQoreworCXVuc2lnbmVkIGludCBpOworCisJZGV2X3dhcm4oJm1oYmEtPnBkZXYtPmRldiwKKwkJIkV2ZW50WzB4JXhdIGlkWzB4JXhdIHNldmVyaXR5WzB4JXhdIGRldmljZSBpZFsweCV4XVxuIiwKKwkJcHRyLT5zZXF1ZW5jZV9ubywgcHRyLT5ldmVudF9pZCwgcHRyLT5zZXZlcml0eSwgcHRyLT5kZXZpY2VfaWQpOworCWlmIChwdHItPnBhcmFtX2NvdW50KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkV2ZW50IHBhcmFtKGxlbiAweCV4KTogIiwKKwkJCQkJCXB0ci0+cGFyYW1fY291bnQpOworCQlmb3IgKGkgPSAwOyBpIDwgcHRyLT5wYXJhbV9jb3VudDsgaSsrKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiMHgleCAiLCBwdHItPnBhcmFtc1tpXSk7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiXG4iKTsKKwl9CisKKwlpZiAocHRyLT5zZW5zZV9kYXRhX2xlbmd0aCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFdmVudCBzZW5zZSBkYXRhKGxlbiAweCV4KTogIiwKKwkJCQkJCXB0ci0+c2Vuc2VfZGF0YV9sZW5ndGgpOworCQlmb3IgKGkgPSAwOyBpIDwgcHRyLT5zZW5zZV9kYXRhX2xlbmd0aDsgaSsrKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiMHgleCAiLCBwdHItPnNlbnNlX2RhdGFbaV0pOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgbXZ1bWlfbm90aWZpY2F0aW9uKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsIHU4IG1zZywgdm9pZCAqYnVmZmVyKQoreworCWlmIChtc2cgPT0gQVBJQ0RCMV9FVkVOVF9HRVRFVkVOVCkgeworCQlpbnQgaSwgY291bnQ7CisJCXN0cnVjdCBtdnVtaV9kcml2ZXJfZXZlbnQgKnBhcmFtID0gTlVMTDsKKwkJc3RydWN0IG12dW1pX2V2ZW50X3JlcSAqZXIgPSBidWZmZXI7CisJCWNvdW50ID0gZXItPmNvdW50OworCQlpZiAoY291bnQgPiBNQVhfRVZFTlRTX1JFVFVSTkVEKSB7CisJCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJldmVudCBjb3VudFsweCV4XSBpcyBiaWdnZXIiCisJCQkJCSIgdGhhbiBtYXggZXZlbnQgY291bnRbMHgleF0uXG4iLAorCQkJCQljb3VudCwgTUFYX0VWRU5UU19SRVRVUk5FRCk7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXBhcmFtID0gJmVyLT5ldmVudHNbaV07CisJCQltdnVtaV9zaG93X2V2ZW50KG1oYmEsIHBhcmFtKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBtdnVtaV9nZXRfZXZlbnQoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwgdW5zaWduZWQgY2hhciBtc2cpCit7CisJc3RydWN0IG12dW1pX2NtZCAqY21kOworCXN0cnVjdCBtdnVtaV9tc2dfZnJhbWUgKmZyYW1lOworCisJY21kID0gbXZ1bWlfY3JlYXRlX2ludGVybmFsX2NtZChtaGJhLCA1MTIpOworCWlmICghY21kKQorCQlyZXR1cm4gLTE7CisJY21kLT5zY21kID0gTlVMTDsKKwljbWQtPmNtZF9zdGF0dXMgPSBSRVFfU1RBVFVTX1BFTkRJTkc7CisJYXRvbWljX3NldCgmY21kLT5zeW5jX2NtZCwgMCk7CisJZnJhbWUgPSBjbWQtPmZyYW1lOworCWZyYW1lLT5kZXZpY2VfaWQgPSAwOworCWZyYW1lLT5jbWRfZmxhZyA9IENNRF9GTEFHX0RBVEFfSU47CisJZnJhbWUtPnJlcV9mdW5jdGlvbiA9IENMX0ZVTl9TQ1NJX0NNRDsKKwlmcmFtZS0+Y2RiX2xlbmd0aCA9IE1BWF9DT01NQU5EX1NJWkU7CisJZnJhbWUtPmRhdGFfdHJhbnNmZXJfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBtdnVtaV9ldmVudF9yZXEpOworCW1lbXNldChmcmFtZS0+Y2RiLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwlmcmFtZS0+Y2RiWzBdID0gQVBJQ0RCMF9FVkVOVDsKKwlmcmFtZS0+Y2RiWzFdID0gbXNnOworCW12dW1pX2lzc3VlX2Jsb2NrZWRfY21kKG1oYmEsIGNtZCk7CisKKwlpZiAoY21kLT5jbWRfc3RhdHVzICE9IFNBTV9TVEFUX0dPT0QpCisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgImdldCBldmVudCBmYWlsZWQsIHN0YXR1cz0weCV4LlxuIiwKKwkJCQkJCQljbWQtPmNtZF9zdGF0dXMpOworCWVsc2UKKwkJbXZ1bWlfbm90aWZpY2F0aW9uKG1oYmEsIGNtZC0+ZnJhbWUtPmNkYlsxXSwgY21kLT5kYXRhX2J1Zik7CisKKwltdnVtaV9kZWxldGVfaW50ZXJuYWxfY21kKG1oYmEsIGNtZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX3NjYW5fZXZlbnRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbXZ1bWlfZXZlbnRzX3dxICptdV9ldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXZ1bWlfZXZlbnRzX3dxLCB3b3JrX3EpOworCisJbXZ1bWlfZ2V0X2V2ZW50KG11X2V2LT5taGJhLCBtdV9ldi0+ZXZlbnQpOworCWtmcmVlKG11X2V2KTsKK30KKworc3RhdGljIHZvaWQgbXZ1bWlfbGF1bmNoX2V2ZW50cyhzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLCB1OCBtc2cpCit7CisJc3RydWN0IG12dW1pX2V2ZW50c193cSAqbXVfZXY7CisKKwltdV9ldiA9IGt6YWxsb2Moc2l6ZW9mKCptdV9ldiksIEdGUF9BVE9NSUMpOworCWlmIChtdV9ldikgeworCQlJTklUX1dPUksoJm11X2V2LT53b3JrX3EsIG12dW1pX3NjYW5fZXZlbnRzKTsKKwkJbXVfZXYtPm1oYmEgPSBtaGJhOworCQltdV9ldi0+ZXZlbnQgPSBtc2c7CisJCW11X2V2LT5wYXJhbSA9IE5VTEw7CisJCXNjaGVkdWxlX3dvcmsoJm11X2V2LT53b3JrX3EpOworCX0KK30KKworc3RhdGljIHZvaWQgbXZ1bWlfaGFuZGxlX2Nsb2Ioc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwlzdHJ1Y3QgbXZ1bWlfcnNwX2ZyYW1lICpvYl9mcmFtZTsKKwlzdHJ1Y3QgbXZ1bWlfY21kICpjbWQ7CisJc3RydWN0IG12dW1pX29iX2RhdGEgKnBvb2w7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1oYmEtPmZyZWVfb2JfbGlzdCkpIHsKKwkJcG9vbCA9IGxpc3RfZmlyc3RfZW50cnkoJm1oYmEtPmZyZWVfb2JfbGlzdCwKKwkJCQkJCXN0cnVjdCBtdnVtaV9vYl9kYXRhLCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmcG9vbC0+bGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnBvb2wtPmxpc3QsICZtaGJhLT5vYl9kYXRhX2xpc3QpOworCisJCW9iX2ZyYW1lID0gKHN0cnVjdCBtdnVtaV9yc3BfZnJhbWUgKikgJnBvb2wtPmRhdGFbMF07CisJCWNtZCA9IG1oYmEtPnRhZ19jbWRbb2JfZnJhbWUtPnRhZ107CisKKwkJYXRvbWljX2RlYygmbWhiYS0+Zndfb3V0c3RhbmRpbmcpOworCQltaGJhLT50YWdfY21kW29iX2ZyYW1lLT50YWddID0gMDsKKwkJdGFnX3JlbGVhc2Vfb25lKG1oYmEsICZtaGJhLT50YWdfcG9vbCwgb2JfZnJhbWUtPnRhZyk7CisJCWlmIChjbWQtPnNjbWQpCisJCQltdnVtaV9jb21wbGV0ZV9jbWQobWhiYSwgY21kLCBvYl9mcmFtZSk7CisJCWVsc2UKKwkJCW12dW1pX2NvbXBsZXRlX2ludGVybmFsX2NtZChtaGJhLCBjbWQsIG9iX2ZyYW1lKTsKKwl9CisJbWhiYS0+aW5zdGFuY2V0LT5maXJlX2NtZChtaGJhLCBOVUxMKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG12dW1pX2lzcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldnApCit7CisJc3RydWN0IG12dW1pX2hiYSAqbWhiYSA9IChzdHJ1Y3QgbXZ1bWlfaGJhICopIGRldnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKG1oYmEtPnNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkobWhiYS0+aW5zdGFuY2V0LT5jbGVhcl9pbnRyKG1oYmEpIHx8ICFtaGJhLT5nbG9iYWxfaXNyKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1oYmEtPnNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChtaGJhLT5nbG9iYWxfaXNyICYgSU5UX01BUF9ETF9DUFUyUENJRUEpIHsKKwkJaWYgKG1oYmEtPmlzcl9zdGF0dXMgJiBEUkJMX0hBTkRTSEFLRV9JU1IpIHsKKwkJCWRldl93YXJuKCZtaGJhLT5wZGV2LT5kZXYsICJlbnRlciBoYW5kc2hha2UgYWdhaW4hXG4iKTsKKwkJCW12dW1pX2hhbmRzaGFrZShtaGJhKTsKKwkJfQorCQlpZiAobWhiYS0+aXNyX3N0YXR1cyAmIERSQkxfRVZFTlRfTk9USUZZKQorCQkJbXZ1bWlfbGF1bmNoX2V2ZW50cyhtaGJhLCBBUElDREIxX0VWRU5UX0dFVEVWRU5UKTsKKwl9CisKKwlpZiAobWhiYS0+Z2xvYmFsX2lzciAmIElOVF9NQVBfQ09NQU9VVCkKKwkJbXZ1bWlfcmVjZWl2ZV9vYl9saXN0X2VudHJ5KG1oYmEpOworCisJbWhiYS0+Z2xvYmFsX2lzciA9IDA7CisJbWhiYS0+aXNyX3N0YXR1cyA9IDA7CisJaWYgKG1oYmEtPmZ3X3N0YXRlID09IEZXX1NUQVRFX1NUQVJURUQpCisJCW12dW1pX2hhbmRsZV9jbG9iKG1oYmEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobWhiYS0+c2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGVudW0gbXZ1bWlfcWNfcmVzdWx0IG12dW1pX3NlbmRfY29tbWFuZChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQkJCQkJc3RydWN0IG12dW1pX2NtZCAqY21kKQoreworCXZvaWQgKmliX2VudHJ5OworCXN0cnVjdCBtdnVtaV9tc2dfZnJhbWUgKmliX2ZyYW1lOworCXVuc2lnbmVkIGludCBmcmFtZV9sZW47CisKKwlpYl9mcmFtZSA9IGNtZC0+ZnJhbWU7CisJaWYgKHVubGlrZWx5KG1oYmEtPmZ3X3N0YXRlICE9IEZXX1NUQVRFX1NUQVJURUQpKSB7CisJCWRldl9kYmcoJm1oYmEtPnBkZXYtPmRldiwgImZpcm13YXJlIG5vdCByZWFkeS5cbiIpOworCQlyZXR1cm4gTVZfUVVFVUVfQ09NTUFORF9SRVNVTFRfTk9fUkVTT1VSQ0U7CisJfQorCWlmICh0YWdfaXNfZW1wdHkoJm1oYmEtPnRhZ19wb29sKSkgeworCQlkZXZfZGJnKCZtaGJhLT5wZGV2LT5kZXYsICJubyBmcmVlIHRhZy5cbiIpOworCQlyZXR1cm4gTVZfUVVFVUVfQ09NTUFORF9SRVNVTFRfTk9fUkVTT1VSQ0U7CisJfQorCWlmIChtdnVtaV9nZXRfaWJfbGlzdF9lbnRyeShtaGJhLCAmaWJfZW50cnkpKQorCQlyZXR1cm4gTVZfUVVFVUVfQ09NTUFORF9SRVNVTFRfTk9fUkVTT1VSQ0U7CisKKwljbWQtPmZyYW1lLT50YWcgPSB0YWdfZ2V0X29uZShtaGJhLCAmbWhiYS0+dGFnX3Bvb2wpOworCWNtZC0+ZnJhbWUtPnJlcXVlc3RfaWQgPSBtaGJhLT5pb19zZXErKzsKKwljbWQtPnJlcXVlc3RfaWQgPSBjbWQtPmZyYW1lLT5yZXF1ZXN0X2lkOworCW1oYmEtPnRhZ19jbWRbY21kLT5mcmFtZS0+dGFnXSA9IGNtZDsKKwlmcmFtZV9sZW4gPSBzaXplb2YoKmliX2ZyYW1lKSAtIDQgKworCQkJCWliX2ZyYW1lLT5zZ19jb3VudHMgKiBzaXplb2Yoc3RydWN0IG12dW1pX3NnbCk7CisJbWVtY3B5KGliX2VudHJ5LCBpYl9mcmFtZSwgZnJhbWVfbGVuKTsKKwlyZXR1cm4gTVZfUVVFVUVfQ09NTUFORF9SRVNVTFRfU0VOVDsKK30KKworc3RhdGljIHZvaWQgbXZ1bWlfZmlyZV9jbWQoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwgc3RydWN0IG12dW1pX2NtZCAqY21kKQoreworCXVuc2lnbmVkIHNob3J0IG51bV9vZl9jbF9zZW50ID0gMDsKKwllbnVtIG12dW1pX3FjX3Jlc3VsdCByZXN1bHQ7CisKKwlpZiAoY21kKQorCQlsaXN0X2FkZF90YWlsKCZjbWQtPnF1ZXVlX3BvaW50ZXIsICZtaGJhLT53YWl0aW5nX3JlcV9saXN0KTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmbWhiYS0+d2FpdGluZ19yZXFfbGlzdCkpIHsKKwkJY21kID0gbGlzdF9maXJzdF9lbnRyeSgmbWhiYS0+d2FpdGluZ19yZXFfbGlzdCwKKwkJCQkJIHN0cnVjdCBtdnVtaV9jbWQsIHF1ZXVlX3BvaW50ZXIpOworCQlsaXN0X2RlbF9pbml0KCZjbWQtPnF1ZXVlX3BvaW50ZXIpOworCQlyZXN1bHQgPSBtdnVtaV9zZW5kX2NvbW1hbmQobWhiYSwgY21kKTsKKwkJc3dpdGNoIChyZXN1bHQpIHsKKwkJY2FzZSBNVl9RVUVVRV9DT01NQU5EX1JFU1VMVF9TRU5UOgorCQkJbnVtX29mX2NsX3NlbnQrKzsKKwkJCWJyZWFrOworCQljYXNlIE1WX1FVRVVFX0NPTU1BTkRfUkVTVUxUX05PX1JFU09VUkNFOgorCQkJbGlzdF9hZGQoJmNtZC0+cXVldWVfcG9pbnRlciwgJm1oYmEtPndhaXRpbmdfcmVxX2xpc3QpOworCQkJaWYgKG51bV9vZl9jbF9zZW50ID4gMCkKKwkJCQltdnVtaV9zZW5kX2liX2xpc3RfZW50cnkobWhiYSk7CisKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAobnVtX29mX2NsX3NlbnQgPiAwKQorCQltdnVtaV9zZW5kX2liX2xpc3RfZW50cnkobWhiYSk7Cit9CisKKy8qKgorICogbXZ1bWlfZW5hYmxlX2ludHIgLQlFbmFibGVzIGludGVycnVwdHMKKyAqIEByZWdzOgkJCUZXIHJlZ2lzdGVyIHNldAorICovCitzdGF0aWMgdm9pZCBtdnVtaV9lbmFibGVfaW50cih2b2lkICpyZWdzKQoreworCXVuc2lnbmVkIGludCBtYXNrOworCisJaW93cml0ZTMyKDB4M0ZGRkZGRkYsIHJlZ3MgKyBDUFVfQVJNX1RPX1BDSUVBX01BU0tfUkVHKTsKKwltYXNrID0gaW9yZWFkMzIocmVncyArIENQVV9FTlBPSU5UQV9NQVNLX1JFRyk7CisJbWFzayB8PSBJTlRfTUFQX0RMX0NQVTJQQ0lFQSB8IElOVF9NQVBfQ09NQU9VVCB8IElOVF9NQVBfQ09NQUVSUjsKKwlpb3dyaXRlMzIobWFzaywgcmVncyArIENQVV9FTlBPSU5UQV9NQVNLX1JFRyk7Cit9CisKKy8qKgorICogbXZ1bWlfZGlzYWJsZV9pbnRyIC1EaXNhYmxlcyBpbnRlcnJ1cHQKKyAqIEByZWdzOgkJCUZXIHJlZ2lzdGVyIHNldAorICovCitzdGF0aWMgdm9pZCBtdnVtaV9kaXNhYmxlX2ludHIodm9pZCAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCWlvd3JpdGUzMigwLCByZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9NQVNLX1JFRyk7CisJbWFzayA9IGlvcmVhZDMyKHJlZ3MgKyBDUFVfRU5QT0lOVEFfTUFTS19SRUcpOworCW1hc2sgJj0gfihJTlRfTUFQX0RMX0NQVTJQQ0lFQSB8IElOVF9NQVBfQ09NQU9VVCB8IElOVF9NQVBfQ09NQUVSUik7CisJaW93cml0ZTMyKG1hc2ssIHJlZ3MgKyBDUFVfRU5QT0lOVEFfTUFTS19SRUcpOworfQorCitzdGF0aWMgaW50IG12dW1pX2NsZWFyX2ludHIodm9pZCAqZXh0ZW5kKQoreworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmEgPSAoc3RydWN0IG12dW1pX2hiYSAqKSBleHRlbmQ7CisJdW5zaWduZWQgaW50IHN0YXR1cywgaXNyX3N0YXR1cyA9IDAsIHRtcCA9IDA7CisJdm9pZCAqcmVncyA9IG1oYmEtPm1taW87CisKKwlzdGF0dXMgPSBpb3JlYWQzMihyZWdzICsgQ1BVX01BSU5fSU5UX0NBVVNFX1JFRyk7CisJaWYgKCEoc3RhdHVzICYgSU5UX01BUF9NVSkgfHwgc3RhdHVzID09IDB4RkZGRkZGRkYpCisJCXJldHVybiAxOworCWlmICh1bmxpa2VseShzdGF0dXMgJiBJTlRfTUFQX0NPTUFFUlIpKSB7CisJCXRtcCA9IGlvcmVhZDMyKHJlZ3MgKyBDTEFfSVNSX0NBVVNFKTsKKwkJaWYgKHRtcCAmIChDTElDX0lOX0VSUl9JUlEgfCBDTElDX09VVF9FUlJfSVJRKSkKKwkJCWlvd3JpdGUzMih0bXAgJiAoQ0xJQ19JTl9FUlJfSVJRIHwgQ0xJQ19PVVRfRVJSX0lSUSksCisJCQkJCXJlZ3MgKyBDTEFfSVNSX0NBVVNFKTsKKwkJc3RhdHVzIF49IElOVF9NQVBfQ09NQUVSUjsKKwkJLyogaW5ib3VuZCBvciBvdXRib3VuZCBwYXJpdHkgZXJyb3IsIGNvbW1hbmQgd2lsbCB0aW1lb3V0ICovCisJfQorCWlmIChzdGF0dXMgJiBJTlRfTUFQX0NPTUFPVVQpIHsKKwkJdG1wID0gaW9yZWFkMzIocmVncyArIENMQV9JU1JfQ0FVU0UpOworCQlpZiAodG1wICYgQ0xJQ19PVVRfSVJRKQorCQkJaW93cml0ZTMyKHRtcCAmIENMSUNfT1VUX0lSUSwgcmVncyArIENMQV9JU1JfQ0FVU0UpOworCX0KKwlpZiAoc3RhdHVzICYgSU5UX01BUF9ETF9DUFUyUENJRUEpIHsKKwkJaXNyX3N0YXR1cyA9IGlvcmVhZDMyKHJlZ3MgKyBDUFVfQVJNX1RPX1BDSUVBX0RSQkxfUkVHKTsKKwkJaWYgKGlzcl9zdGF0dXMpCisJCQlpb3dyaXRlMzIoaXNyX3N0YXR1cywgcmVncyArIENQVV9BUk1fVE9fUENJRUFfRFJCTF9SRUcpOworCX0KKworCW1oYmEtPmdsb2JhbF9pc3IgPSBzdGF0dXM7CisJbWhiYS0+aXNyX3N0YXR1cyA9IGlzcl9zdGF0dXM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtdnVtaV9yZWFkX2Z3X3N0YXR1c19yZWcgLSByZXR1cm5zIHRoZSBjdXJyZW50IEZXIHN0YXR1cyB2YWx1ZQorICogQHJlZ3M6CQkJRlcgcmVnaXN0ZXIgc2V0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXZ1bWlfcmVhZF9md19zdGF0dXNfcmVnKHZvaWQgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGlvcmVhZDMyKHJlZ3MgKyBDUFVfQVJNX1RPX1BDSUVBX0RSQkxfUkVHKTsKKwlpZiAoc3RhdHVzKQorCQlpb3dyaXRlMzIoc3RhdHVzLCByZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9EUkJMX1JFRyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBtdnVtaV9pbnN0YW5jZV90ZW1wbGF0ZSBtdnVtaV9pbnN0YW5jZV90ZW1wbGF0ZSA9IHsKKwkuZmlyZV9jbWQgPSBtdnVtaV9maXJlX2NtZCwKKwkuZW5hYmxlX2ludHIgPSBtdnVtaV9lbmFibGVfaW50ciwKKwkuZGlzYWJsZV9pbnRyID0gbXZ1bWlfZGlzYWJsZV9pbnRyLAorCS5jbGVhcl9pbnRyID0gbXZ1bWlfY2xlYXJfaW50ciwKKwkucmVhZF9md19zdGF0dXNfcmVnID0gbXZ1bWlfcmVhZF9md19zdGF0dXNfcmVnLAorfTsKKworc3RhdGljIGludCBtdnVtaV9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmE7CisJdW5zaWduZWQgY2hhciBiaXRjb3VudCA9IHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDg7CisKKwltaGJhID0gKHN0cnVjdCBtdnVtaV9oYmEgKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisJaWYgKHNkZXYtPmlkID49IG1oYmEtPm1heF90YXJnZXRfaWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbWhiYS0+dGFyZ2V0X21hcFtzZGV2LT5pZCAvIGJpdGNvdW50XSB8PSAoMSA8PCAoc2Rldi0+aWQgJSBiaXRjb3VudCkpOworCXJldHVybiAwOworfQorCisvKioKKyAqIG12dW1pX2J1aWxkX2ZyYW1lIC0JUHJlcGFyZXMgYSBkaXJlY3QgY2RiIChEQ0RCKSBjb21tYW5kCisgKiBAbWhiYToJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICogQHNjbWQ6CQlTQ1NJIGNvbW1hbmQKKyAqIEBjbWQ6CQlDb21tYW5kIHRvIGJlIHByZXBhcmVkIGluCisgKgorICogVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBDREIgY29tbWFuZHMuIFRoZXNlIGFyZSB0eXBjaWFsbHkgcGFzcy10aHJvdWdoCisgKiBjb21tYW5kcyB0byB0aGUgZGV2aWNlcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbXZ1bWlfYnVpbGRfZnJhbWUoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwKKwkJCQlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kLCBzdHJ1Y3QgbXZ1bWlfY21kICpjbWQpCit7CisJc3RydWN0IG12dW1pX21zZ19mcmFtZSAqcGZyYW1lOworCisJY21kLT5zY21kID0gc2NtZDsKKwljbWQtPmNtZF9zdGF0dXMgPSBSRVFfU1RBVFVTX1BFTkRJTkc7CisJcGZyYW1lID0gY21kLT5mcmFtZTsKKwlwZnJhbWUtPmRldmljZV9pZCA9ICgodW5zaWduZWQgc2hvcnQpIHNjbWQtPmRldmljZS0+aWQpIHwKKwkJCQkoKCh1bnNpZ25lZCBzaG9ydCkgc2NtZC0+ZGV2aWNlLT5sdW4pIDw8IDgpOworCXBmcmFtZS0+Y21kX2ZsYWcgPSAwOworCisJc3dpdGNoIChzY21kLT5zY19kYXRhX2RpcmVjdGlvbikgeworCWNhc2UgRE1BX05PTkU6CisJCXBmcmFtZS0+Y21kX2ZsYWcgfD0gQ01EX0ZMQUdfTk9OX0RBVEE7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlwZnJhbWUtPmNtZF9mbGFnIHw9IENNRF9GTEFHX0RBVEFfSU47CisJCWJyZWFrOworCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJcGZyYW1lLT5jbWRfZmxhZyB8PSBDTURfRkxBR19EQVRBX09VVDsKKwkJYnJlYWs7CisJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmbWhiYS0+cGRldi0+ZGV2LCAidW5leHBlY3RlZCBkYXRhIGRpcmVjdGlvblslZF0gIgorCQkJImNtZFsweCV4XVxuIiwgc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24sIHNjbWQtPmNtbmRbMF0pOworCQlnb3RvIGVycm9yOworCX0KKworCXBmcmFtZS0+Y2RiX2xlbmd0aCA9IHNjbWQtPmNtZF9sZW47CisJbWVtY3B5KHBmcmFtZS0+Y2RiLCBzY21kLT5jbW5kLCBwZnJhbWUtPmNkYl9sZW5ndGgpOworCXBmcmFtZS0+cmVxX2Z1bmN0aW9uID0gQ0xfRlVOX1NDU0lfQ01EOworCWlmIChzY3NpX2J1ZmZsZW4oc2NtZCkpIHsKKwkJaWYgKG12dW1pX21ha2Vfc2dsKG1oYmEsIHNjbWQsICZwZnJhbWUtPnBheWxvYWRbMF0sCisJCQkmcGZyYW1lLT5zZ19jb3VudHMpKQorCQkJZ290byBlcnJvcjsKKworCQlwZnJhbWUtPmRhdGFfdHJhbnNmZXJfbGVuZ3RoID0gc2NzaV9idWZmbGVuKHNjbWQpOworCX0gZWxzZSB7CisJCXBmcmFtZS0+c2dfY291bnRzID0gMDsKKwkJcGZyYW1lLT5kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IDA7CisJfQorCXJldHVybiAwOworCitlcnJvcjoKKwlzY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChEUklWRVJfU0VOU0UgPDwgMjQpIHwKKwkJU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCXNjc2lfYnVpbGRfc2Vuc2VfYnVmZmVyKDAsIHNjbWQtPnNlbnNlX2J1ZmZlciwgSUxMRUdBTF9SRVFVRVNULCAweDI0LAorCQkJCQkJCQkJMCk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIG12dW1pX3F1ZXVlX2NvbW1hbmQgLQlRdWV1ZSBlbnRyeSBwb2ludAorICogQHNjbWQ6CQkJU0NTSSBjb21tYW5kIHRvIGJlIHF1ZXVlZAorICogQGRvbmU6CQkJQ2FsbGJhY2sgZW50cnkgcG9pbnQKKyAqLworc3RhdGljIGludCBtdnVtaV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCQlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXN0cnVjdCBtdnVtaV9jbWQgKmNtZDsKKwlzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgaXJxX2ZsYWdzKTsKKwlzY3NpX2NtZF9nZXRfc2VyaWFsKHNob3N0LCBzY21kKTsKKworCW1oYmEgPSAoc3RydWN0IG12dW1pX2hiYSAqKSBzaG9zdC0+aG9zdGRhdGE7CisJc2NtZC0+cmVzdWx0ID0gMDsKKwljbWQgPSBtdnVtaV9nZXRfY21kKG1oYmEpOworCWlmICh1bmxpa2VseSghY21kKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGlycV9mbGFncyk7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCX0KKworCWlmICh1bmxpa2VseShtdnVtaV9idWlsZF9mcmFtZShtaGJhLCBzY21kLCBjbWQpKSkKKwkJZ290byBvdXRfcmV0dXJuX2NtZDsKKworCWNtZC0+c2NtZCA9IHNjbWQ7CisJc2NtZC0+U0NwLnB0ciA9IChjaGFyICopIGNtZDsKKwltaGJhLT5pbnN0YW5jZXQtPmZpcmVfY21kKG1oYmEsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiAwOworCitvdXRfcmV0dXJuX2NtZDoKKwltdnVtaV9yZXR1cm5fY21kKG1oYmEsIGNtZCk7CisJc2NtZC0+c2NzaV9kb25lKHNjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBtdnVtaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlzdHJ1Y3QgbXZ1bWlfY21kICpjbWQgPSAoc3RydWN0IG12dW1pX2NtZCAqKSBzY21kLT5TQ3AucHRyOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBzY21kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IG12dW1pX2hiYSAqbWhiYSA9IHNob3N0X3ByaXYoaG9zdCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKG1oYmEtPnNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmIChtaGJhLT50YWdfY21kW2NtZC0+ZnJhbWUtPnRhZ10pIHsKKwkJbWhiYS0+dGFnX2NtZFtjbWQtPmZyYW1lLT50YWddID0gMDsKKwkJdGFnX3JlbGVhc2Vfb25lKG1oYmEsICZtaGJhLT50YWdfcG9vbCwgY21kLT5mcmFtZS0+dGFnKTsKKwl9CisJaWYgKCFsaXN0X2VtcHR5KCZjbWQtPnF1ZXVlX3BvaW50ZXIpKQorCQlsaXN0X2RlbF9pbml0KCZjbWQtPnF1ZXVlX3BvaW50ZXIpOworCWVsc2UKKwkJYXRvbWljX2RlYygmbWhiYS0+Zndfb3V0c3RhbmRpbmcpOworCisJc2NtZC0+cmVzdWx0ID0gKERSSVZFUl9JTlZBTElEIDw8IDI0KSB8IChESURfQUJPUlQgPDwgMTYpOworCXNjbWQtPlNDcC5wdHIgPSBOVUxMOworCWlmIChzY3NpX2J1ZmZsZW4oc2NtZCkpIHsKKwkJaWYgKHNjc2lfc2dfY291bnQoc2NtZCkpIHsKKwkJCXBjaV91bm1hcF9zZyhtaGJhLT5wZGV2LAorCQkJCXNjc2lfc2dsaXN0KHNjbWQpLAorCQkJCXNjc2lfc2dfY291bnQoc2NtZCksCisJCQkJKGludClzY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0gZWxzZSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG1oYmEtPnBkZXYsCisJCQkJc2NtZC0+U0NwLmRtYV9oYW5kbGUsCisJCQkJc2NzaV9idWZmbGVuKHNjbWQpLAorCQkJCShpbnQpc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCQlzY21kLT5TQ3AuZG1hX2hhbmRsZSA9IDA7CisJCX0KKwl9CisJbXZ1bWlfcmV0dXJuX2NtZChtaGJhLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobWhiYS0+c2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIEJMS19FSF9OT1RfSEFORExFRDsKK30KKworc3RhdGljIGludAorbXZ1bWlfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkKK3sKKwlpbnQgaGVhZHMsIHNlY3RvcnM7CisJc2VjdG9yX3QgY3lsaW5kZXJzOworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJaGVhZHMgPSA2NDsKKwlzZWN0b3JzID0gMzI7CisJdG1wID0gaGVhZHMgKiBzZWN0b3JzOworCWN5bGluZGVycyA9IGNhcGFjaXR5OworCXNlY3Rvcl9kaXYoY3lsaW5kZXJzLCB0bXApOworCisJaWYgKGNhcGFjaXR5ID49IDB4MjAwMDAwKSB7CisJCWhlYWRzID0gMjU1OworCQlzZWN0b3JzID0gNjM7CisJCXRtcCA9IGhlYWRzICogc2VjdG9yczsKKwkJY3lsaW5kZXJzID0gY2FwYWNpdHk7CisJCXNlY3Rvcl9kaXYoY3lsaW5kZXJzLCB0bXApOworCX0KKwlnZW9tWzBdID0gaGVhZHM7CisJZ2VvbVsxXSA9IHNlY3RvcnM7CisJZ2VvbVsyXSA9IGN5bGluZGVyczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtdnVtaV90ZW1wbGF0ZSA9IHsKKworCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJNYXJ2ZWxsIFN0b3JhZ2UgQ29udHJvbGxlciIsCisJLnNsYXZlX2NvbmZpZ3VyZSA9IG12dW1pX3NsYXZlX2NvbmZpZ3VyZSwKKwkucXVldWVjb21tYW5kID0gbXZ1bWlfcXVldWVfY29tbWFuZCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gbXZ1bWlfaG9zdF9yZXNldCwKKwkuYmlvc19wYXJhbSA9IG12dW1pX2Jpb3NfcGFyYW0sCisJLnRoaXNfaWQgPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgbXZ1bWlfdHJhbnNwb3J0X3RlbXBsYXRlID0geworCS5laF90aW1lZF9vdXQgPSBtdnVtaV90aW1lZF9vdXQsCit9OworCisvKioKKyAqIG12dW1pX2luaXRfZncgLQlJbml0aWFsaXplcyB0aGUgRlcKKyAqIEBtaGJhOgkJQWRhcHRlciBzb2Z0IHN0YXRlCisgKgorICogVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgaW5pdGlhbGl6aW5nIGZpcm13YXJlLgorICovCitzdGF0aWMgaW50IG12dW1pX2luaXRfZncoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKG1oYmEtPnBkZXYsIE1WX0RSSVZFUl9OQU1FKSkgeworCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJJTyBtZW1vcnkgcmVnaW9uIGJ1c3khXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0ID0gbXZ1bWlfbWFwX3BjaV9hZGRyKG1oYmEtPnBkZXYsIG1oYmEtPmJhc2VfYWRkcik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX2lvcmVtYXA7CisKKwltaGJhLT5tbWlvID0gbWhiYS0+YmFzZV9hZGRyWzBdOworCisJc3dpdGNoIChtaGJhLT5wZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9NVjkxNDM6CisJCW1oYmEtPmluc3RhbmNldCA9ICZtdnVtaV9pbnN0YW5jZV90ZW1wbGF0ZTsKKwkJbWhiYS0+aW9fc2VxID0gMDsKKwkJbWhiYS0+bWF4X3NnZSA9IE1WVU1JX01BWF9TR19FTlRSWTsKKwkJbWhiYS0+cmVxdWVzdF9pZF9lbmFibGVkID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAiZGV2aWNlIDB4JXggbm90IHN1cHBvcnRlZCFcbiIsCisJCQkJCQkJbWhiYS0+cGRldi0+ZGV2aWNlKTsKKwkJbWhiYS0+aW5zdGFuY2V0ID0gTlVMTDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2FsbG9jX21lbTsKKwl9CisJZGV2X2RiZygmbWhiYS0+cGRldi0+ZGV2LCAiZGV2aWNlIGlkIDogJTA0WCBpcyBmb3VuZC5cbiIsCisJCQkJCQkJbWhiYS0+cGRldi0+ZGV2aWNlKTsKKworCW1oYmEtPmhhbmRzaGFrZV9wYWdlID0ga3phbGxvYyhIU1BfTUFYX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghbWhiYS0+aGFuZHNoYWtlX3BhZ2UpIHsKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhhbmRzaGFrZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9hbGxvY19tZW07CisJfQorCW1oYmEtPmhhbmRzaGFrZV9wYWdlX3BoeXMgPSB2aXJ0X3RvX3BoeXMobWhiYS0+aGFuZHNoYWtlX3BhZ2UpOworCisJaWYgKG12dW1pX3N0YXJ0KG1oYmEpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9yZWFkeV9zdGF0ZTsKKwl9CisJcmV0ID0gbXZ1bWlfYWxsb2NfY21kcyhtaGJhKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfcmVhZHlfc3RhdGU7CisKKwlyZXR1cm4gMDsKKworZmFpbF9yZWFkeV9zdGF0ZToKKwltdnVtaV9yZWxlYXNlX21lbV9yZXNvdXJjZShtaGJhKTsKKwlrZnJlZShtaGJhLT5oYW5kc2hha2VfcGFnZSk7CitmYWlsX2FsbG9jX21lbToKKwltdnVtaV91bm1hcF9wY2lfYWRkcihtaGJhLT5wZGV2LCBtaGJhLT5iYXNlX2FkZHIpOworZmFpbF9pb3JlbWFwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMobWhiYS0+cGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG12dW1pX2lvX2F0dGFjaCAtCUF0dGFjaGVzIHRoaXMgZHJpdmVyIHRvIFNDU0kgbWlkLWxheWVyCisgKiBAbWhiYToJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICovCitzdGF0aWMgaW50IG12dW1pX2lvX2F0dGFjaChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBtaGJhLT5zaG9zdDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBtYXhfc2cgPSAobWhiYS0+aWJfbWF4X3NpemUgKyA0IC0KKwkJc2l6ZW9mKHN0cnVjdCBtdnVtaV9tc2dfZnJhbWUpKSAvIHNpemVvZihzdHJ1Y3QgbXZ1bWlfc2dsKTsKKworCWhvc3QtPmlycSA9IG1oYmEtPnBkZXYtPmlycTsKKwlob3N0LT51bmlxdWVfaWQgPSBtaGJhLT51bmlxdWVfaWQ7CisJaG9zdC0+Y2FuX3F1ZXVlID0gKG1oYmEtPm1heF9pbyAtIDEpID8gKG1oYmEtPm1heF9pbyAtIDEpIDogMTsKKwlob3N0LT5zZ190YWJsZXNpemUgPSBtaGJhLT5tYXhfc2dlID4gbWF4X3NnID8gbWF4X3NnIDogbWhiYS0+bWF4X3NnZTsKKwlob3N0LT5tYXhfc2VjdG9ycyA9IG1oYmEtPm1heF90cmFuc2Zlcl9zaXplIC8gNTEyOworCWhvc3QtPmNtZF9wZXJfbHVuID0gIChtaGJhLT5tYXhfaW8gLSAxKSA/IChtaGJhLT5tYXhfaW8gLSAxKSA6IDE7CisJaG9zdC0+bWF4X2lkID0gbWhiYS0+bWF4X3RhcmdldF9pZDsKKwlob3N0LT5tYXhfY21kX2xlbiA9IE1BWF9DT01NQU5EX1NJWkU7CisJaG9zdC0+dHJhbnNwb3J0dCA9ICZtdnVtaV90cmFuc3BvcnRfdGVtcGxhdGU7CisKKwlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZtaGJhLT5wZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAic2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwltaGJhLT5md19mbGFnIHw9IE1WVU1JX0ZXX0FUVEFDSDsKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG12dW1pX3Byb2JlX29uZSAtCVBDSSBob3RwbHVnIGVudHJ5IHBvaW50CisgKiBAcGRldjoJCVBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAaWQ6CQkJUENJIGlkcyBvZiBzdXBwb3J0ZWQgaG90cGx1Z2dlZCBhZGFwdGVyCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IG12dW1pX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IG12dW1pX2hiYSAqbWhiYTsKKwlpbnQgcmV0OworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiICUjNC4wNHg6JSM0LjA0eDolIzQuMDR4OiUjNC4wNHg6ICIsCisJCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGRldi0+c3Vic3lzdGVtX3ZlbmRvciwKKwkJCXBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOworCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaWYgKElTX0RNQTY0KSB7CisJCXJldCA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZmFpbF9zZXRfZG1hX21hc2s7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsX3NldF9kbWFfbWFzazsKKwl9CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZtdnVtaV90ZW1wbGF0ZSwgc2l6ZW9mKCptaGJhKSk7CisJaWYgKCFob3N0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNjc2lfaG9zdF9hbGxvYyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYWxsb2NfaW5zdGFuY2U7CisJfQorCW1oYmEgPSBzaG9zdF9wcml2KGhvc3QpOworCisJSU5JVF9MSVNUX0hFQUQoJm1oYmEtPmNtZF9wb29sKTsKKwlJTklUX0xJU1RfSEVBRCgmbWhiYS0+b2JfZGF0YV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbWhiYS0+ZnJlZV9vYl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbWhiYS0+cmVzX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZtaGJhLT53YWl0aW5nX3JlcV9saXN0KTsKKwlhdG9taWNfc2V0KCZtaGJhLT5md19vdXRzdGFuZGluZywgMCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWhiYS0+aW50X2NtZF93YWl0X3EpOworCisJbWhiYS0+cGRldiA9IHBkZXY7CisJbWhiYS0+c2hvc3QgPSBob3N0OworCW1oYmEtPnVuaXF1ZV9pZCA9IHBkZXYtPmJ1cy0+bnVtYmVyIDw8IDggfCBwZGV2LT5kZXZmbjsKKworCXJldCA9IG12dW1pX2luaXRfZncobWhiYSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX2luaXRfZnc7CisKKwlyZXQgPSByZXF1ZXN0X2lycShtaGJhLT5wZGV2LT5pcnEsIG12dW1pX2lzcl9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJCQkibXZ1bWkiLCBtaGJhKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBJUlFcbiIpOworCQlnb3RvIGZhaWxfaW5pdF9pcnE7CisJfQorCW1oYmEtPmluc3RhbmNldC0+ZW5hYmxlX2ludHIobWhiYS0+bW1pbyk7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG1oYmEpOworCisJcmV0ID0gbXZ1bWlfaW9fYXR0YWNoKG1oYmEpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9pb19hdHRhY2g7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvYmUgbXZ1bWkgZHJpdmVyIHN1Y2Nlc3NmdWxseS5cbiIpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfaW9fYXR0YWNoOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwltaGJhLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihtaGJhLT5tbWlvKTsKKwlmcmVlX2lycShtaGJhLT5wZGV2LT5pcnEsIG1oYmEpOworZmFpbF9pbml0X2lycToKKwltdnVtaV9yZWxlYXNlX2Z3KG1oYmEpOworZmFpbF9pbml0X2Z3OgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisKK2ZhaWxfYWxsb2NfaW5zdGFuY2U6CitmYWlsX3NldF9kbWFfbWFzazoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtdnVtaV9kZXRhY2hfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IG12dW1pX2hiYSAqbWhiYTsKKworCW1oYmEgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaG9zdCA9IG1oYmEtPnNob3N0OworCXNjc2lfcmVtb3ZlX2hvc3QobWhiYS0+c2hvc3QpOworCW12dW1pX2ZsdXNoX2NhY2hlKG1oYmEpOworCisJbWhiYS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIobWhiYS0+bW1pbyk7CisJZnJlZV9pcnEobWhiYS0+cGRldi0+aXJxLCBtaGJhKTsKKwltdnVtaV9yZWxlYXNlX2Z3KG1oYmEpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJkcml2ZXIgaXMgcmVtb3ZlZCFcbiIpOworfQorCisvKioKKyAqIG12dW1pX3NodXRkb3duIC0JU2h1dGRvd24gZW50cnkgcG9pbnQKKyAqIEBkZXZpY2U6CQlHZW5lcmljIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgbXZ1bWlfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG12dW1pX2hiYSAqbWhiYSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW12dW1pX2ZsdXNoX2NhY2hlKG1oYmEpOworfQorCitzdGF0aWMgaW50IG12dW1pX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhID0gTlVMTDsKKworCW1oYmEgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJbXZ1bWlfZmx1c2hfY2FjaGUobWhiYSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbWhiYSk7CisJbWhiYS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIobWhiYS0+bW1pbyk7CisJZnJlZV9pcnEobWhiYS0+cGRldi0+aXJxLCBtaGJhKTsKKwltdnVtaV91bm1hcF9wY2lfYWRkcihwZGV2LCBtaGJhLT5iYXNlX2FkZHIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZ1bWlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IG12dW1pX2hiYSAqbWhiYSA9IE5VTEw7CisKKwltaGJhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDAsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlbmFibGUgZGV2aWNlIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCWlmIChJU19ETUE2NCkgeworCQlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsOworCX0KKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKG1oYmEtPnBkZXYsIE1WX0RSSVZFUl9OQU1FKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXZ1bWlfbWFwX3BjaV9hZGRyKG1oYmEtPnBkZXYsIG1oYmEtPmJhc2VfYWRkcik7CisJaWYgKHJldCkKKwkJZ290byByZWxlYXNlX3JlZ2lvbnM7CisKKwltaGJhLT5tbWlvID0gbWhiYS0+YmFzZV9hZGRyWzBdOworCW12dW1pX3Jlc2V0KG1oYmEtPm1taW8pOworCisJaWYgKG12dW1pX3N0YXJ0KG1oYmEpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gdW5tYXBfcGNpX2FkZHI7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEobWhiYS0+cGRldi0+aXJxLCBtdnVtaV9pc3JfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkJIm12dW1pIiwgbWhiYSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKKwkJZ290byB1bm1hcF9wY2lfYWRkcjsKKwl9CisJbWhiYS0+aW5zdGFuY2V0LT5lbmFibGVfaW50cihtaGJhLT5tbWlvKTsKKworCXJldHVybiAwOworCit1bm1hcF9wY2lfYWRkcjoKKwltdnVtaV91bm1hcF9wY2lfYWRkcihwZGV2LCBtaGJhLT5iYXNlX2FkZHIpOworcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitmYWlsOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtdnVtaV9wY2lfZHJpdmVyID0geworCisJLm5hbWUgPSBNVl9EUklWRVJfTkFNRSwKKwkuaWRfdGFibGUgPSBtdnVtaV9wY2lfdGFibGUsCisJLnByb2JlID0gbXZ1bWlfcHJvYmVfb25lLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChtdnVtaV9kZXRhY2hfb25lKSwKKwkuc2h1dGRvd24gPSBtdnVtaV9zaHV0ZG93biwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IG12dW1pX3N1c3BlbmQsCisJLnJlc3VtZSA9IG12dW1pX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworLyoqCisgKiBtdnVtaV9pbml0IC0gRHJpdmVyIGxvYWQgZW50cnkgcG9pbnQKKyAqLworc3RhdGljIGludCBfX2luaXQgbXZ1bWlfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZtdnVtaV9wY2lfZHJpdmVyKTsKK30KKworLyoqCisgKiBtdnVtaV9leGl0IC0gRHJpdmVyIHVubG9hZCBlbnRyeSBwb2ludAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgbXZ1bWlfZXhpdCh2b2lkKQoreworCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtdnVtaV9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXZ1bWlfaW5pdCk7Cittb2R1bGVfZXhpdChtdnVtaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnVtaS5oIGIvZHJpdmVycy9zY3NpL212dW1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiOTIzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbXZ1bWkuaApAQCAtMCwwICsxLDUwNSBAQAorLyoKKyAgKiBNYXJ2ZWxsIFVNSSBoZWFkIGZpbGUKKyAgKgorICAqIENvcHlyaWdodCAyMDExIE1hcnZlbGwuIDxqeWxpQG1hcnZlbGwuY29tPgorICAqCisgICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIEdQTHYyLgorICAqCisgICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUKKyAgKiBMaWNlbnNlLgorICAqCisgICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgKgorICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgICogVVNBCisgKi8KKworI2lmbmRlZiBNVlVNSV9ICisjZGVmaW5lIE1WVU1JX0gKKworI2RlZmluZSBNQVhfQkFTRV9BRERSRVNTCTYKKworI2RlZmluZSBWRVJfTUFKT1IJCTEKKyNkZWZpbmUgVkVSX01JTk9SCQkxCisjZGVmaW5lIFZFUl9PRU0JCQkwCisjZGVmaW5lIFZFUl9CVUlMRAkJMTUwMAorCisjZGVmaW5lIE1WX0RSSVZFUl9OQU1FCQkJIm12dW1pIgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX01BUlZFTExfMgkJMHgxYjRiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9NVjkxNDMJMHg5MTQzCisKKyNkZWZpbmUgTVZVTUlfSU5URVJOQUxfQ01EX1dBSVRfVElNRQk0NQorCisjZGVmaW5lIElTX0RNQTY0CQkJKHNpemVvZihkbWFfYWRkcl90KSA9PSA4KQorCitlbnVtIG12dW1pX3FjX3Jlc3VsdCB7CisJTVZfUVVFVUVfQ09NTUFORF9SRVNVTFRfU0VOVAk9IDAsCisJTVZfUVVFVUVfQ09NTUFORF9SRVNVTFRfTk9fUkVTT1VSQ0UsCit9OworCitlbnVtIHsKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIEFSTSBNYnVzIFJlZ2lzdGVycyBNYXAJKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCUNQVV9NQUlOX0lOVF9DQVVTRV9SRUcJPSAweDIwMjAwLAorCUNQVV9NQUlOX0lSUV9NQVNLX1JFRwk9IDB4MjAyMDQsCisJQ1BVX01BSU5fRklRX01BU0tfUkVHCT0gMHgyMDIwOCwKKwlDUFVfRU5QT0lOVEFfTUFTS19SRUcJPSAweDIwMjBDLAorCUNQVV9FTlBPSU5UQl9NQVNLX1JFRwk9IDB4MjAyMTAsCisKKwlJTlRfTUFQX0NPTUFFUlIJCT0gMSA8PCA2LAorCUlOVF9NQVBfQ09NQUlOCQk9IDEgPDwgNywKKwlJTlRfTUFQX0NPTUFPVVQJCT0gMSA8PCA4LAorCUlOVF9NQVBfQ09NQkVSUgkJPSAxIDw8IDksCisJSU5UX01BUF9DT01CSU4JCT0gMSA8PCAxMCwKKwlJTlRfTUFQX0NPTUJPVVQJCT0gMSA8PCAxMSwKKworCUlOVF9NQVBfQ09NQUlOVAk9IChJTlRfTUFQX0NPTUFPVVQgfCBJTlRfTUFQX0NPTUFFUlIpLAorCUlOVF9NQVBfQ09NQklOVAk9IChJTlRfTUFQX0NPTUJPVVQgfCBJTlRfTUFQX0NPTUJJTiB8IElOVF9NQVBfQ09NQkVSUiksCisKKwlJTlRfTUFQX0RMX1BDSUVBMkNQVQk9IDEgPDwgMCwKKwlJTlRfTUFQX0RMX0NQVTJQQ0lFQQk9IDEgPDwgMSwKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBBUk0gRG9vcmJlbGwgUmVnaXN0ZXJzIE1hcAkJKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJQ1BVX1BDSUVBX1RPX0FSTV9EUkJMX1JFRwk9IDB4MjA0MDAsCisJQ1BVX1BDSUVBX1RPX0FSTV9NQVNLX1JFRwk9IDB4MjA0MDQsCisJQ1BVX0FSTV9UT19QQ0lFQV9EUkJMX1JFRwk9IDB4MjA0MDgsCisJQ1BVX0FSTV9UT19QQ0lFQV9NQVNLX1JFRwk9IDB4MjA0MEMsCisKKwlEUkJMX0hBTkRTSEFLRQkJCT0gMSA8PCAwLAorCURSQkxfU09GVF9SRVNFVAkJCT0gMSA8PCAxLAorCURSQkxfQlVTX0NIQU5HRQkJCT0gMSA8PCAyLAorCURSQkxfRVZFTlRfTk9USUZZCQk9IDEgPDwgMywKKwlEUkJMX01VX1JFU0VUCQkJPSAxIDw8IDQsCisJRFJCTF9IQU5EU0hBS0VfSVNSCQk9IERSQkxfSEFORFNIQUtFLAorCisJQ1BVX1BDSUVBX1RPX0FSTV9NU0cwCQk9IDB4MjA0MzAsCisJQ1BVX1BDSUVBX1RPX0FSTV9NU0cxCQk9IDB4MjA0MzQsCisJQ1BVX0FSTV9UT19QQ0lFQV9NU0cwCQk9IDB4MjA0MzgsCisJQ1BVX0FSTV9UT19QQ0lFQV9NU0cxCQk9IDB4MjA0M0MsCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIEFSTSBDb21tdW5pY2F0aW9uIExpc3QgUmVnaXN0ZXJzIE1hcCAgICAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJQ0xBX0lOQl9MSVNUX0JBU0VMCQk9IDB4NTAwLAorCUNMQV9JTkJfTElTVF9CQVNFSAkJPSAweDUwNCwKKwlDTEFfSU5CX0FWQUxfQ09VTlRfQkFTRUwJPSAweDUwOCwKKwlDTEFfSU5CX0FWQUxfQ09VTlRfQkFTRUgJPSAweDUwQywKKwlDTEFfSU5CX0RFU1RJX0xJU1RfQkFTRUwJPSAweDUxMCwKKwlDTEFfSU5CX0RFU1RJX0xJU1RfQkFTRUgJPSAweDUxNCwKKwlDTEFfSU5CX1dSSVRFX1BPSU5URVIJCT0gMHg1MTgsCisJQ0xBX0lOQl9SRUFEX1BPSU5URVIJCT0gMHg1MUMsCisKKwlDTEFfT1VUQl9MSVNUX0JBU0VMCQk9IDB4NTMwLAorCUNMQV9PVVRCX0xJU1RfQkFTRUgJCT0gMHg1MzQsCisJQ0xBX09VVEJfU09VUkNFX0xJU1RfQkFTRUwJPSAweDUzOCwKKwlDTEFfT1VUQl9TT1VSQ0VfTElTVF9CQVNFSAk9IDB4NTNDLAorCUNMQV9PVVRCX0NPUFlfUE9JTlRFUgkJPSAweDU0NCwKKwlDTEFfT1VUQl9SRUFEX1BPSU5URVIJCT0gMHg1NDgsCisKKwlDTEFfSVNSX0NBVVNFCQkJPSAweDU2MCwKKwlDTEFfSVNSX01BU0sJCQk9IDB4NTY0LAorCisJSU5UX01BUF9NVQkJPSAoSU5UX01BUF9ETF9DUFUyUENJRUEgfCBJTlRfTUFQX0NPTUFJTlQpLAorCisJQ0xfUE9JTlRFUl9UT0dHTEUJCT0gMSA8PCAxMiwKKworCUNMSUNfSU5fSVJRCQkJPSAxIDw8IDAsCisJQ0xJQ19PVVRfSVJRCQkJPSAxIDw8IDEsCisJQ0xJQ19JTl9FUlJfSVJRCQkJPSAxIDw8IDgsCisJQ0xJQ19PVVRfRVJSX0lSUQkJPSAxIDw8IDEyLAorCisJQ0xfU0xPVF9OVU1fTUFTSwkJPSAweEZGRiwKKworCS8qCisJKiBDb21tYW5kIGZsYWcgaXMgdGhlIGZsYWcgZm9yIHRoZSBDREIgY29tbWFuZCBpdHNlbGYKKwkqLworCS8qIDEtbm9uIGRhdGE7IDAtZGF0YSBjb21tYW5kICovCisJQ01EX0ZMQUdfTk9OX0RBVEEJCT0gMSA8PCAwLAorCUNNRF9GTEFHX0RNQQkJCT0gMSA8PCAxLAorCUNNRF9GTEFHX1BJTwkJCT0gMSA8PCAyLAorCS8qIDEtaG9zdCByZWFkIGRhdGEgKi8KKwlDTURfRkxBR19EQVRBX0lOCQk9IDEgPDwgMywKKwkvKiAxLWhvc3Qgd3JpdGUgZGF0YSAqLworCUNNRF9GTEFHX0RBVEFfT1VUCQk9IDEgPDwgNCwKKworCVNDU0lfQ01EX01BUlZFTExfU1BFQ0lGSUMJPSAweEUxLAorCUNEQl9DT1JFX1NIVVRET1dOCQk9IDB4QiwKK307CisKKyNkZWZpbmUgQVBJQ0RCMF9FVkVOVAkJCTB4RjQKKyNkZWZpbmUgQVBJQ0RCMV9FVkVOVF9HRVRFVkVOVAkJMAorI2RlZmluZSBNQVhfRVZFTlRTX1JFVFVSTkVECQk2CisKK3N0cnVjdCBtdnVtaV9kcml2ZXJfZXZlbnQgeworCXUzMgl0aW1lX3N0YW1wOworCXUzMglzZXF1ZW5jZV9ubzsKKwl1MzIJZXZlbnRfaWQ7CisJdTgJc2V2ZXJpdHk7CisJdTgJcGFyYW1fY291bnQ7CisJdTE2CWRldmljZV9pZDsKKwl1MzIJcGFyYW1zWzRdOworCXU4CXNlbnNlX2RhdGFfbGVuZ3RoOworCXU4CVJlc2VydmVkMTsKKwl1OAlzZW5zZV9kYXRhWzMwXTsKK307CisKK3N0cnVjdCBtdnVtaV9ldmVudF9yZXEgeworCXVuc2lnbmVkIGNoYXIJY291bnQ7CisJdW5zaWduZWQgY2hhcglyZXNlcnZlZFszXTsKKwlzdHJ1Y3QgbXZ1bWlfZHJpdmVyX2V2ZW50ICBldmVudHNbTUFYX0VWRU5UU19SRVRVUk5FRF07Cit9OworCitzdHJ1Y3QgbXZ1bWlfZXZlbnRzX3dxIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19xOworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmE7CisJdW5zaWduZWQgaW50IGV2ZW50OworCXZvaWQgKnBhcmFtOworfTsKKworI2RlZmluZSBNVlVNSV9NQVhfU0dfRU5UUlkJMzIKKyNkZWZpbmUgU0dEX0VPVAkJCSgxTCA8PCAyNykKKworc3RydWN0IG12dW1pX3NnbCB7CisJdTMyCWJhc2VhZGRyX2w7CisJdTMyCWJhc2VhZGRyX2g7CisJdTMyCWZsYWdzOworCXUzMglzaXplOworfTsKKworc3RydWN0IG12dW1pX3JlcyB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwlkbWFfYWRkcl90IGJ1c19hZGRyOworCXZvaWQgKnZpcnRfYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOwkvKiBlbnVtIFJlc291cmNlX1R5cGUgKi8KK307CisKKy8qIFJlc291cmNlIHR5cGUgKi8KK2VudW0gcmVzb3VyY2VfdHlwZSB7CisJUkVTT1VSQ0VfQ0FDSEVEX01FTU9SWSA9IDAsCisJUkVTT1VSQ0VfVU5DQUNIRURfTUVNT1JZCit9OworCitzdHJ1Y3QgbXZ1bWlfc2Vuc2VfZGF0YSB7CisJdTggZXJyb3JfZW9kZTo3OworCXU4IHZhbGlkOjE7CisJdTggc2VnbWVudF9udW1iZXI7CisJdTggc2Vuc2Vfa2V5OjQ7CisJdTggcmVzZXJ2ZWQ6MTsKKwl1OCBpbmNvcnJlY3RfbGVuZ3RoOjE7CisJdTggZW5kX29mX21lZGlhOjE7CisJdTggZmlsZV9tYXJrOjE7CisJdTggaW5mb3JtYXRpb25bNF07CisJdTggYWRkaXRpb25hbF9zZW5zZV9sZW5ndGg7CisJdTggY29tbWFuZF9zcGVjaWZpY19pbmZvcm1hdGlvbls0XTsKKwl1OCBhZGRpdGlvbmFsX3NlbnNlX2NvZGU7CisJdTggYWRkaXRpb25hbF9zZW5zZV9jb2RlX3F1YWxpZmllcjsKKwl1OCBmaWVsZF9yZXBsYWNlYWJsZV91bml0X2NvZGU7CisJdTggc2Vuc2Vfa2V5X3NwZWNpZmljWzNdOworfTsKKworLyogUmVxdWVzdCBpbml0aWF0b3IgbXVzdCBzZXQgdGhlIHN0YXR1cyB0byBSRVFfU1RBVFVTX1BFTkRJTkcuICovCisjZGVmaW5lIFJFUV9TVEFUVVNfUEVORElORwkJMHg4MAorCitzdHJ1Y3QgbXZ1bWlfY21kIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlX3BvaW50ZXI7CisJc3RydWN0IG12dW1pX21zZ19mcmFtZSAqZnJhbWU7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKKwlhdG9taWNfdCBzeW5jX2NtZDsKKwl2b2lkICpkYXRhX2J1ZjsKKwl1bnNpZ25lZCBzaG9ydCByZXF1ZXN0X2lkOworCXVuc2lnbmVkIGNoYXIgY21kX3N0YXR1czsKK307CisKKy8qCisgKiB0aGUgZnVuY3Rpb24gdHlwZSBvZiB0aGUgaW4gYm91bmQgZnJhbWUKKyAqLworI2RlZmluZSBDTF9GVU5fU0NTSV9DTUQJCQkweDEKKworc3RydWN0IG12dW1pX21zZ19mcmFtZSB7CisJdTE2IGRldmljZV9pZDsKKwl1MTYgdGFnOworCXU4IGNtZF9mbGFnOworCXU4IHJlcV9mdW5jdGlvbjsKKwl1OCBjZGJfbGVuZ3RoOworCXU4IHNnX2NvdW50czsKKwl1MzIgZGF0YV90cmFuc2Zlcl9sZW5ndGg7CisJdTE2IHJlcXVlc3RfaWQ7CisJdTE2IHJlc2VydmVkMTsKKwl1OCBjZGJbTUFYX0NPTU1BTkRfU0laRV07CisJdTMyIHBheWxvYWRbMV07Cit9OworCisvKgorICogdGhlIHJlc3BvbmQgZmxhZyBmb3IgZGF0YV9wYXlsb2FkIG9mIHRoZSBvdXQgYm91bmQgZnJhbWUKKyAqLworI2RlZmluZSBDTF9SU1BfRkxBR19OT0RBVEEJCTB4MAorI2RlZmluZSBDTF9SU1BfRkxBR19TRU5TRURBVEEJCTB4MQorCitzdHJ1Y3QgbXZ1bWlfcnNwX2ZyYW1lIHsKKwl1MTYgZGV2aWNlX2lkOworCXUxNiB0YWc7CisJdTggcmVxX3N0YXR1czsKKwl1OCByc3BfZmxhZzsJLyogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIERhdGFfUGF5bG9hZC4qLworCXUxNiByZXF1ZXN0X2lkOworCXUzMiBwYXlsb2FkWzFdOworfTsKKworc3RydWN0IG12dW1pX29iX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF07Cit9OworCitzdHJ1Y3QgdmVyc2lvbl9pbmZvIHsKKwl1MzIgdmVyX21ham9yOworCXUzMiB2ZXJfbWlub3I7CisJdTMyIHZlcl9vZW07CisJdTMyIHZlcl9idWlsZDsKK307CisKKyNkZWZpbmUgRldfTUFYX0RFTEFZCQkJMzAKKyNkZWZpbmUgTVZVTUlfRldfQlVTWQkJCSgxVSA8PCAwKQorI2RlZmluZSBNVlVNSV9GV19BVFRBQ0gJCQkoMVUgPDwgMSkKKyNkZWZpbmUgTVZVTUlfRldfQUxMT0MJCQkoMVUgPDwgMikKKworLyoKKyAqIFN0YXRlIGlzIHRoZSBzdGF0ZSBvZiB0aGUgTVUKKyAqLworI2RlZmluZSBGV19TVEFURV9JRExFCQkJMAorI2RlZmluZSBGV19TVEFURV9TVEFSVElORwkJMQorI2RlZmluZSBGV19TVEFURV9IQU5EU0hBS0lORwkJMgorI2RlZmluZSBGV19TVEFURV9TVEFSVEVECQkzCisjZGVmaW5lIEZXX1NUQVRFX0FCT1JUCQkJNAorCisjZGVmaW5lIEhBTkRTSEFLRV9TSUdOQVRVUkUJCTB4NUE1QTVBNUFMCisjZGVmaW5lIEhBTkRTSEFLRV9SRUFEWVNUQVRFCQkweDU1QUE1QUE1TAorI2RlZmluZSBIQU5EU0hBS0VfRE9ORVNUQVRFCQkweDU1QUFBNTVBTAorCisvKiBIYW5kU2hha2UgU3RhdHVzIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgSFNfU1RBVFVTX09LCQkJMQorI2RlZmluZSBIU19TVEFUVVNfRVJSCQkJMgorI2RlZmluZSBIU19TVEFUVVNfSU5WQUxJRAkJMworCisvKiBIYW5kU2hha2UgU3RhdGUvQ21kIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgSFNfU19TVEFSVAkJCTEKKyNkZWZpbmUgSFNfU19SRVNFVAkJCTIKKyNkZWZpbmUgSFNfU19QQUdFX0FERFIJCQkzCisjZGVmaW5lIEhTX1NfUVVFUllfUEFHRQkJCTQKKyNkZWZpbmUgSFNfU19TRU5EX1BBR0UJCQk1CisjZGVmaW5lIEhTX1NfRU5ECQkJNgorI2RlZmluZSBIU19TX0FCT1JUCQkJNworI2RlZmluZSBIU19QQUdFX1ZFUklGWV9TSVpFCQkxMjgKKworI2RlZmluZSBIU19HRVRfU1RBVEUoYSkJCQkoYSAmIDB4RkZGRikKKyNkZWZpbmUgSFNfR0VUX1NUQVRVUyhhKQkJKChhICYgMHhGRkZGMDAwMCkgPj4gMTYpCisjZGVmaW5lIEhTX1NFVF9TVEFURShhLCBiKQkJKGEgfD0gKGIgJiAweEZGRkYpKQorI2RlZmluZSBIU19TRVRfU1RBVFVTKGEsIGIpCQkoYSB8PSAoKGIgJiAweEZGRkYpIDw8IDE2KSkKKworLyogaGFuZHNoYWtlIGZyYW1lICovCitzdHJ1Y3QgbXZ1bWlfaHNfZnJhbWUgeworCXUxNiBzaXplOworCS8qIGhvc3QgaW5mb3JtYXRpb24gKi8KKwl1OCBob3N0X3R5cGU7CisJdTggcmVzZXJ2ZWRfMVsxXTsKKwlzdHJ1Y3QgdmVyc2lvbl9pbmZvIGhvc3RfdmVyOyAvKiBiaW9zIG9yIGRyaXZlciB2ZXJzaW9uICovCisKKwkvKiBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCisJdTMyIHN5c3RlbV9pb19idXM7CisJdTMyIHNsb3RfbnVtYmVyOworCXUzMiBpbnRyX2xldmVsOworCXUzMiBpbnRyX3ZlY3RvcjsKKworCS8qIGNvbW11bmljYXRpb24gbGlzdCBjb25maWd1cmF0aW9uICovCisJdTMyIGliX2Jhc2VhZGRyX2w7CisJdTMyIGliX2Jhc2VhZGRyX2g7CisJdTMyIG9iX2Jhc2VhZGRyX2w7CisJdTMyIG9iX2Jhc2VhZGRyX2g7CisKKwl1OCBpYl9lbnRyeV9zaXplOworCXU4IG9iX2VudHJ5X3NpemU7CisJdTggb2JfZGVwdGg7CisJdTggaWJfZGVwdGg7CisKKwkvKiBzeXN0ZW0gdGltZSAqLworCXU2NCBzZWNvbmRzX3NpbmNlMTk3MDsKK307CisKK3N0cnVjdCBtdnVtaV9oc19oZWFkZXIgeworCXU4CXBhZ2VfY29kZTsKKwl1OAljaGVja3N1bTsKKwl1MTYJZnJhbWVfbGVuZ3RoOworCXUzMglmcmFtZV9jb250ZW50WzFdOworfTsKKworLyoKKyAqIHRoZSBwYWdlIGNvZGUgdHlwZSBvZiB0aGUgaGFuZHNoYWtlIGhlYWRlcgorICovCisjZGVmaW5lIEhTX1BBR0VfRklSTV9DQVAJMHgxCisjZGVmaW5lIEhTX1BBR0VfSE9TVF9JTkZPCTB4MgorI2RlZmluZSBIU19QQUdFX0ZJUk1fQ1RMCTB4MworI2RlZmluZSBIU19QQUdFX0NMX0lORk8JCTB4NAorI2RlZmluZSBIU19QQUdFX1RPVEFMCQkweDUKKworI2RlZmluZSBIU1BfU0laRShpKQlzaXplb2Yoc3RydWN0IG12dW1pX2hzX3BhZ2UjI2kpCisKKyNkZWZpbmUgSFNQX01BWF9TSVpFICh7CQkJCQlcCisJaW50IHNpemUsIG0xLCBtMjsJCQkJXAorCW0xID0gbWF4KEhTUF9TSVpFKDEpLCBIU1BfU0laRSgzKSk7CQlcCisJbTIgPSBtYXgoSFNQX1NJWkUoMiksIEhTUF9TSVpFKDQpKTsJCVwKKwlzaXplID0gbWF4KG0xLCBtMik7CQkJCVwKKwlzaXplOwkJCQkJCVwKK30pCisKKy8qIFRoZSBmb3JtYXQgb2YgdGhlIHBhZ2UgY29kZSBmb3IgRmlybXdhcmUgY2FwYWJpbGl0eSAqLworc3RydWN0IG12dW1pX2hzX3BhZ2UxIHsKKwl1OCBwYWdlY29kZTsKKwl1OCBjaGVja3N1bTsKKwl1MTYgZnJhbWVfbGVuZ3RoOworCisJdTE2IG51bWJlcl9vZl9wb3J0czsKKwl1MTYgbWF4X2RldmljZXNfc3VwcG9ydDsKKwl1MTYgbWF4X2lvX3N1cHBvcnQ7CisJdTE2IHVtaV92ZXI7CisJdTMyIG1heF90cmFuc2Zlcl9zaXplOworCXN0cnVjdCB2ZXJzaW9uX2luZm8gZndfdmVyOworCXU4IGNsX2luX21heF9lbnRyeV9zaXplOworCXU4IGNsX291dF9tYXhfZW50cnlfc2l6ZTsKKwl1OCBjbF9pbm91dF9saXN0X2RlcHRoOworCXU4IHRvdGFsX3BhZ2VzOworCXUxNiBjYXBhYmlsaXR5OworCXUxNiByZXNlcnZlZDE7Cit9OworCisvKiBUaGUgZm9ybWF0IG9mIHRoZSBwYWdlIGNvZGUgZm9yIEhvc3QgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBtdnVtaV9oc19wYWdlMiB7CisJdTggcGFnZWNvZGU7CisJdTggY2hlY2tzdW07CisJdTE2IGZyYW1lX2xlbmd0aDsKKworCXU4IGhvc3RfdHlwZTsKKwl1OCByZXNlcnZlZFszXTsKKwlzdHJ1Y3QgdmVyc2lvbl9pbmZvIGhvc3RfdmVyOworCXUzMiBzeXN0ZW1faW9fYnVzOworCXUzMiBzbG90X251bWJlcjsKKwl1MzIgaW50cl9sZXZlbDsKKwl1MzIgaW50cl92ZWN0b3I7CisJdTY0IHNlY29uZHNfc2luY2UxOTcwOworfTsKKworLyogVGhlIGZvcm1hdCBvZiB0aGUgcGFnZSBjb2RlIGZvciBmaXJtd2FyZSBjb250cm9sICAqLworc3RydWN0IG12dW1pX2hzX3BhZ2UzIHsKKwl1OAlwYWdlY29kZTsKKwl1OAljaGVja3N1bTsKKwl1MTYJZnJhbWVfbGVuZ3RoOworCXUxNgljb250cm9sOworCXU4CXJlc2VydmVkWzJdOworCXUzMglob3N0X2J1ZmZlcmFkZHJfbDsKKwl1MzIJaG9zdF9idWZmZXJhZGRyX2g7CisJdTMyCWhvc3RfZXZlbnRhZGRyX2w7CisJdTMyCWhvc3RfZXZlbnRhZGRyX2g7Cit9OworCitzdHJ1Y3QgbXZ1bWlfaHNfcGFnZTQgeworCXU4CXBhZ2Vjb2RlOworCXU4CWNoZWNrc3VtOworCXUxNglmcmFtZV9sZW5ndGg7CisJdTMyCWliX2Jhc2VhZGRyX2w7CisJdTMyCWliX2Jhc2VhZGRyX2g7CisJdTMyCW9iX2Jhc2VhZGRyX2w7CisJdTMyCW9iX2Jhc2VhZGRyX2g7CisJdTgJaWJfZW50cnlfc2l6ZTsKKwl1OAlvYl9lbnRyeV9zaXplOworCXU4CW9iX2RlcHRoOworCXU4CWliX2RlcHRoOworfTsKKworc3RydWN0IG12dW1pX3RhZyB7CisJdW5zaWduZWQgc2hvcnQgKnN0YWNrOworCXVuc2lnbmVkIHNob3J0IHRvcDsKKwl1bnNpZ25lZCBzaG9ydCBzaXplOworfTsKKworc3RydWN0IG12dW1pX2hiYSB7CisJdm9pZCAqYmFzZV9hZGRyW01BWF9CQVNFX0FERFJFU1NdOworCXZvaWQgKm1taW87CisJc3RydWN0IGxpc3RfaGVhZCBjbWRfcG9vbDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBpbnRfY21kX3dhaXRfcTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1bnNpZ25lZCBpbnQgdW5pcXVlX2lkOworCWF0b21pY190IGZ3X291dHN0YW5kaW5nOworCXN0cnVjdCBtdnVtaV9pbnN0YW5jZV90ZW1wbGF0ZSAqaW5zdGFuY2V0OworCisJdm9pZCAqaWJfbGlzdDsKKwlkbWFfYWRkcl90IGliX2xpc3RfcGh5czsKKworCXZvaWQgKm9iX2xpc3Q7CisJZG1hX2FkZHJfdCBvYl9saXN0X3BoeXM7CisKKwl2b2lkICppYl9zaGFkb3c7CisJZG1hX2FkZHJfdCBpYl9zaGFkb3dfcGh5czsKKworCXZvaWQgKm9iX3NoYWRvdzsKKwlkbWFfYWRkcl90IG9iX3NoYWRvd19waHlzOworCisJdm9pZCAqaGFuZHNoYWtlX3BhZ2U7CisJZG1hX2FkZHJfdCBoYW5kc2hha2VfcGFnZV9waHlzOworCisJdW5zaWduZWQgaW50IGdsb2JhbF9pc3I7CisJdW5zaWduZWQgaW50IGlzcl9zdGF0dXM7CisKKwl1bnNpZ25lZCBzaG9ydCBtYXhfc2dlOworCXVuc2lnbmVkIHNob3J0IG1heF90YXJnZXRfaWQ7CisJdW5zaWduZWQgY2hhciAqdGFyZ2V0X21hcDsKKwl1bnNpZ25lZCBpbnQgbWF4X2lvOworCXVuc2lnbmVkIGludCBsaXN0X251bV9pbzsKKwl1bnNpZ25lZCBpbnQgaWJfbWF4X3NpemU7CisJdW5zaWduZWQgaW50IG9iX21heF9zaXplOworCXVuc2lnbmVkIGludCBpYl9tYXhfc2l6ZV9zZXR0aW5nOworCXVuc2lnbmVkIGludCBvYl9tYXhfc2l6ZV9zZXR0aW5nOworCXVuc2lnbmVkIGludCBtYXhfdHJhbnNmZXJfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGhiYV90b3RhbF9wYWdlczsKKwl1bnNpZ25lZCBjaGFyIGZ3X2ZsYWc7CisJdW5zaWduZWQgY2hhciByZXF1ZXN0X2lkX2VuYWJsZWQ7CisJdW5zaWduZWQgc2hvcnQgaGJhX2NhcGFiaWxpdHk7CisJdW5zaWduZWQgc2hvcnQgaW9fc2VxOworCisJdW5zaWduZWQgaW50IGliX2N1cl9zbG90OworCXVuc2lnbmVkIGludCBvYl9jdXJfc2xvdDsKKwl1bnNpZ25lZCBpbnQgZndfc3RhdGU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG9iX2RhdGFfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfb2JfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlc19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgd2FpdGluZ19yZXFfbGlzdDsKKworCXN0cnVjdCBtdnVtaV90YWcgdGFnX3Bvb2w7CisJc3RydWN0IG12dW1pX2NtZCAqKnRhZ19jbWQ7Cit9OworCitzdHJ1Y3QgbXZ1bWlfaW5zdGFuY2VfdGVtcGxhdGUgeworCXZvaWQgKCpmaXJlX2NtZCkoc3RydWN0IG12dW1pX2hiYSAqLCBzdHJ1Y3QgbXZ1bWlfY21kICopOworCXZvaWQgKCplbmFibGVfaW50cikodm9pZCAqKSA7CisJdm9pZCAoKmRpc2FibGVfaW50cikodm9pZCAqKTsKKwlpbnQgKCpjbGVhcl9pbnRyKSh2b2lkICopOworCXVuc2lnbmVkIGludCAoKnJlYWRfZndfc3RhdHVzX3JlZykodm9pZCAqKTsKK307CisKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYyBiL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCmluZGV4IDg2YWZiMTNmLi5jMDZiOGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYworKysgYi9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYwpAQCAtNDAsNiArNDAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzY3NpL29zZF9pbml0aWF0b3IuaD4KICNpbmNsdWRlIDxzY3NpL29zZF9zZWMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2h3aS5jIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMKaW5kZXggOGI3ZGIxZS4uYjdiOTJmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMKQEAgLTU2NywxMSArNTY3LDExIEBACiAJdmFsdWUgPSBwbTgwMDFfY3IzMihwbTgwMDFfaGEsIDAsIDB4NDQpOwogCW9mZnNldCA9IHZhbHVlICYgMHgwM0ZGRkZGRjsKIAlQTTgwMDFfSU5JVF9EQkcocG04MDAxX2hhLAotCQlwbTgwMDFfcHJpbnRrKCJTY3JhdGNocGFkIDAgT2Zmc2V0OiAleCBcbiIsIG9mZnNldCkpOworCQlwbTgwMDFfcHJpbnRrKCJTY3JhdGNocGFkIDAgT2Zmc2V0OiAleFxuIiwgb2Zmc2V0KSk7CiAJcGNpbG9naWMgPSAodmFsdWUgJiAweEZDMDAwMDAwKSA+PiAyNjsKIAlwY2liYXIgPSBnZXRfcGNpX2Jhcl9pbmRleChwY2lsb2dpYyk7CiAJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKLQkJcG04MDAxX3ByaW50aygiU2NyYXRjaHBhZCAwIFBDSSBCQVI6ICVkIFxuIiwgcGNpYmFyKSk7CisJCXBtODAwMV9wcmludGsoIlNjcmF0Y2hwYWQgMCBQQ0kgQkFSOiAlZFxuIiwgcGNpYmFyKSk7CiAJcG04MDAxX2hhLT5tYWluX2NmZ190YmxfYWRkciA9IGJhc2VfYWRkciA9CiAJCXBtODAwMV9oYS0+aW9fbWVtW3BjaWJhcl0ubWVtdmlydGFkZHIgKyBvZmZzZXQ7CiAJcG04MDAxX2hhLT5nZW5lcmFsX3N0YXRfdGJsX2FkZHIgPQpAQCAtMTI0NSw3ICsxMjQ1LDcgQEAKIAogCWlmIChtcGlfbXNnX2ZyZWVfZ2V0KGNpcmN1bGFyUSwgNjQsICZwTWVzc2FnZSkgPCAwKSB7CiAJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiTm8gZnJlZSBtcGkgYnVmZmVyIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiTm8gZnJlZSBtcGkgYnVmZmVyXG4iKSk7CiAJCXJldHVybiAtMTsKIAl9CiAJQlVHX09OKCFwYXlsb2FkKTsKQEAgLTEyNjIsNyArMTI2Miw3IEBACiAJcG04MDAxX2N3MzIocG04MDAxX2hhLCBjaXJjdWxhclEtPnBpX3BjaV9iYXIsCiAJCWNpcmN1bGFyUS0+cGlfb2Zmc2V0LCBjaXJjdWxhclEtPnByb2R1Y2VyX2lkeCk7CiAJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCi0JCXBtODAwMV9wcmludGsoImFmdGVyIFBJPSAlZCBDST0gJWQgXG4iLCBjaXJjdWxhclEtPnByb2R1Y2VyX2lkeCwKKwkJcG04MDAxX3ByaW50aygiYWZ0ZXIgUEk9ICVkIENJPSAlZFxuIiwgY2lyY3VsYXJRLT5wcm9kdWNlcl9pZHgsCiAJCWNpcmN1bGFyUS0+Y29uc3VtZXJfaW5kZXgpKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NzQsNyArMTQ3NCw3IEBACiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIElPX1NVQ0NFU1M6CiAJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJJT19TVUNDRVNTIgotCQkJIixwYXJhbSA9ICVkIFxuIiwgcGFyYW0pKTsKKwkJCSIscGFyYW0gPSAlZFxuIiwgcGFyYW0pKTsKIAkJaWYgKHBhcmFtID09IDApIHsKIAkJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CiAJCQl0cy0+c3RhdCA9IFNBTV9TVEFUX0dPT0Q7CkBAIC0xNDkwLDE0ICsxNDkwLDE0IEBACiAJCWJyZWFrOwogCWNhc2UgSU9fQUJPUlRFRDoKIAkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJJT19BQk9SVEVEIElPTUIgVGFnIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSU9fQUJPUlRFRCBJT01CIFRhZ1xuIikpOwogCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwogCQl0cy0+c3RhdCA9IFNBU19BQk9SVEVEX1RBU0s7CiAJCWJyZWFrOwogCWNhc2UgSU9fVU5ERVJGTE9XOgogCQkvKiBTU1AgQ29tcGxldGlvbiB3aXRoIGVycm9yICovCiAJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJJT19VTkRFUkZMT1ciCi0JCQkiLHBhcmFtID0gJWQgXG4iLCBwYXJhbSkpOworCQkJIixwYXJhbSA9ICVkXG4iLCBwYXJhbSkpOwogCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwogCQl0cy0+c3RhdCA9IFNBU19EQVRBX1VOREVSUlVOOwogCQl0cy0+cmVzaWR1YWwgPSBwYXJhbTsKQEAgLTE2NDksNiArMTY0OSw3IEBACiAJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CiAJCXRzLT5zdGF0ID0gU0FTX09QRU5fUkVKRUNUOwogCQl0cy0+b3Blbl9yZWpfcmVhc29uID0gU0FTX09SRUpfUlNWRF9SRVRSWTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCiAJCQlwbTgwMDFfcHJpbnRrKCJVbmtub3duIHN0YXR1cyAweCV4XG4iLCBzdGF0dXMpKTsKQEAgLTE5MzcsMTQgKzE5MzgsMTQgQEAKIAkJCQl0cy0+YnVmX3ZhbGlkX3NpemUgPSBzaXplb2YoKnJlc3ApOwogCQkJfSBlbHNlCiAJCQkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCi0JCQkJCXBtODAwMV9wcmludGsoInJlc3BvbnNlIHRvIGxhcmdlIFxuIikpOworCQkJCQlwbTgwMDFfcHJpbnRrKCJyZXNwb25zZSB0byBsYXJnZVxuIikpOwogCQl9CiAJCWlmIChwbTgwMDFfZGV2KQogCQkJcG04MDAxX2Rldi0+cnVubmluZ19yZXEtLTsKIAkJYnJlYWs7CiAJY2FzZSBJT19BQk9SVEVEOgogCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIklPX0FCT1JURUQgSU9NQiBUYWcgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJJT19BQk9SVEVEIElPTUIgVGFnXG4iKSk7CiAJCXRzLT5yZXNwID0gU0FTX1RBU0tfQ09NUExFVEU7CiAJCXRzLT5zdGF0ID0gU0FTX0FCT1JURURfVEFTSzsKIAkJaWYgKHBtODAwMV9kZXYpCkBAIC0yNzI4LDExICsyNzI5LDExIEBACiAJdTMyIHBoeV9vcCA9IGxlMzJfdG9fY3B1KHBQYXlsb2FkLT5waHlvcF9waHlpZCkgJiBPUF9CSVRTOwogCWlmIChzdGF0dXMgIT0gMCkgewogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCIleCBwaHkgZXhlY3V0ZSAleCBwaHkgb3AgZmFpbGVkISBcbiIsCisJCQlwbTgwMDFfcHJpbnRrKCIleCBwaHkgZXhlY3V0ZSAleCBwaHkgb3AgZmFpbGVkIVxuIiwKIAkJCXBoeV9pZCwgcGh5X29wKSk7CiAJfSBlbHNlCiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIiV4IHBoeSBleGVjdXRlICV4IHBoeSBvcCBzdWNjZXNzISBcbiIsCisJCQlwbTgwMDFfcHJpbnRrKCIleCBwaHkgZXhlY3V0ZSAleCBwaHkgb3Agc3VjY2VzcyFcbiIsCiAJCQlwaHlfaWQsIHBoeV9vcCkpOwogCXJldHVybiAwOwogfQpAQCAtMzAxOCw3ICszMDE5LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBQT1JUX0lOVkFMSUQ6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIiBQb3J0SW52YWxpZCBwb3J0SUQgJWQgXG4iLCBwb3J0X2lkKSk7CisJCQlwbTgwMDFfcHJpbnRrKCIgUG9ydEludmFsaWQgcG9ydElEICVkXG4iLCBwb3J0X2lkKSk7CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKIAkJCXBtODAwMV9wcmludGsoIiBMYXN0IHBoeSBEb3duIGFuZCBwb3J0IGludmFsaWRcbiIpKTsKIAkJcG9ydC0+cG9ydF9hdHRhY2hlZCA9IDA7CkBAIC0zMDI3LDcgKzMwMjgsNyBAQAogCQlicmVhazsKIAljYXNlIFBPUlRfSU5fUkVTRVQ6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIiBQb3J0IEluIFJlc2V0IHBvcnRJRCAlZCBcbiIsIHBvcnRfaWQpKTsKKwkJCXBtODAwMV9wcmludGsoIiBQb3J0IEluIFJlc2V0IHBvcnRJRCAlZFxuIiwgcG9ydF9pZCkpOwogCQlicmVhazsKIAljYXNlIFBPUlRfTk9UX0VTVEFCTElTSEVEOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCkBAIC0zMjIwLDcgKzMyMjEsNyBAQAogCQlwbTgwMDFfcHJpbnRrKCIgc3RhdHVzID0gMHgleFxuIiwgc3RhdHVzKSk7CiAJZm9yIChpID0gMDsgaSA8IEdFTkVSQUxfRVZFTlRfUEFZTE9BRDsgaSsrKQogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJpbmJfSU9NQl9wYXlsb2FkWzB4JXhdIDB4JXgsIFxuIiwgaSwKKwkJCXBtODAwMV9wcmludGsoImluYl9JT01CX3BheWxvYWRbMHgleF0gMHgleCxcbiIsIGksCiAJCQlwUGF5bG9hZC0+aW5iX0lPTUJfcGF5bG9hZFtpXSkpOwogCXJldHVybiAwOwogfQpAQCAtMzMxMiwxMiArMzMxMywxMiBAQAogCQlicmVhazsKIAljYXNlIEhXX0VWRU5UX1NBU19QSFlfVVA6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1BIWV9TVEFSVF9TVEFUVVMgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QSFlfU1RBUlRfU1RBVFVTXG4iKSk7CiAJCWh3X2V2ZW50X3Nhc19waHlfdXAocG04MDAxX2hhLCBwaW9tYik7CiAJCWJyZWFrOwogCWNhc2UgSFdfRVZFTlRfU0FUQV9QSFlfVVA6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1NBVEFfUEhZX1VQIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfU0FUQV9QSFlfVVBcbiIpKTsKIAkJaHdfZXZlbnRfc2F0YV9waHlfdXAocG04MDAxX2hhLCBwaW9tYik7CiAJCWJyZWFrOwogCWNhc2UgSFdfRVZFTlRfUEhZX1NUT1BfU1RBVFVTOgpAQCAtMzMyOSwxMiArMzMzMCwxMiBAQAogCQlicmVhazsKIAljYXNlIEhXX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQ6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1NBVEFfU1BJTlVQX0hPTEQgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9TQVRBX1NQSU5VUF9IT0xEXG4iKSk7CiAJCXNhc19oYS0+bm90aWZ5X3BoeV9ldmVudCgmcGh5LT5zYXNfcGh5LCBQSFlFX1NQSU5VUF9IT0xEKTsKIAkJYnJlYWs7CiAJY2FzZSBIV19FVkVOVF9QSFlfRE9XTjoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUEhZX0RPV04gXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QSFlfRE9XTlxuIikpOwogCQlzYXNfaGEtPm5vdGlmeV9waHlfZXZlbnQoJnBoeS0+c2FzX3BoeSwgUEhZRV9MT1NTX09GX1NJR05BTCk7CiAJCXBoeS0+cGh5X2F0dGFjaGVkID0gMDsKIAkJcGh5LT5waHlfc3RhdGUgPSAwOwpAQCAtMzQ0Niw3ICszNDQ3LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBIV19FVkVOVF9MSU5LX0VSUl9QSFlfUkVTRVRfRkFJTEVEOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9MSU5LX0VSUl9QSFlfUkVTRVRfRkFJTEVEIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfTElOS19FUlJfUEhZX1JFU0VUX0ZBSUxFRFxuIikpOwogCQlwbTgwMDFfaHdfZXZlbnRfYWNrX3JlcShwbTgwMDFfaGEsIDAsCiAJCQlIV19FVkVOVF9MSU5LX0VSUl9QSFlfUkVTRVRfRkFJTEVELAogCQkJcG9ydF9pZCwgcGh5X2lkLCAwLCAwKTsKQEAgLTM0NTYsMjUgKzM0NTcsMjUgQEAKIAkJYnJlYWs7CiAJY2FzZSBIV19FVkVOVF9QT1JUX1JFU0VUX1RJTUVSX1RNTzoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUE9SVF9SRVNFVF9USU1FUl9UTU8gXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QT1JUX1JFU0VUX1RJTUVSX1RNT1xuIikpOwogCQlzYXNfcGh5X2Rpc2Nvbm5lY3RlZChzYXNfcGh5KTsKIAkJcGh5LT5waHlfYXR0YWNoZWQgPSAwOwogCQlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksIFBPUlRFX0xJTktfUkVTRVRfRVJSKTsKIAkJYnJlYWs7CiAJY2FzZSBIV19FVkVOVF9QT1JUX1JFQ09WRVJZX1RJTUVSX1RNTzoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUE9SVF9SRUNPVkVSWV9USU1FUl9UTU8gXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QT1JUX1JFQ09WRVJZX1RJTUVSX1RNT1xuIikpOwogCQlzYXNfcGh5X2Rpc2Nvbm5lY3RlZChzYXNfcGh5KTsKIAkJcGh5LT5waHlfYXR0YWNoZWQgPSAwOwogCQlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksIFBPUlRFX0xJTktfUkVTRVRfRVJSKTsKIAkJYnJlYWs7CiAJY2FzZSBIV19FVkVOVF9QT1JUX1JFQ09WRVI6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1BPUlRfUkVDT1ZFUiBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1BPUlRfUkVDT1ZFUlxuIikpOwogCQlicmVhazsKIAljYXNlIEhXX0VWRU5UX1BPUlRfUkVTRVRfQ09NUExFVEU6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1BPUlRfUkVTRVRfQ09NUExFVEUgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QT1JUX1JFU0VUX0NPTVBMRVRFXG4iKSk7CiAJCWJyZWFrOwogCWNhc2UgRVZFTlRfQlJPQURDQVNUX0FTWU5DSF9FVkVOVDoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLApAQCAtMzUwMiwyMSArMzUwMywyMSBAQAogCiAJc3dpdGNoIChvcGMpIHsKIAljYXNlIE9QQ19PVUJfRUNITzoKLQkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJPUENfT1VCX0VDSE8gXG4iKSk7CisJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiT1BDX09VQl9FQ0hPXG4iKSk7CiAJCWJyZWFrOwogCWNhc2UgT1BDX09VQl9IV19FVkVOVDoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9IV19FVkVOVCBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfSFdfRVZFTlRcbiIpKTsKIAkJbXBpX2h3X2V2ZW50KHBtODAwMV9oYSwgcGlvbWIpOwogCQlicmVhazsKIAljYXNlIE9QQ19PVUJfU1NQX0NPTVA6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfU1NQX0NPTVAgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NTUF9DT01QXG4iKSk7CiAJCW1waV9zc3BfY29tcGxldGlvbihwbTgwMDFfaGEsIHBpb21iKTsKIAkJYnJlYWs7CiAJY2FzZSBPUENfT1VCX1NNUF9DT01QOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NNUF9DT01QIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TTVBfQ09NUFxuIikpOwogCQltcGlfc21wX2NvbXBsZXRpb24ocG04MDAxX2hhLCBwaW9tYik7CiAJCWJyZWFrOwogCWNhc2UgT1BDX09VQl9MT0NBTF9QSFlfQ05UUkw6CkBAIC0zNTI2LDI2ICszNTI3LDI2IEBACiAJCWJyZWFrOwogCWNhc2UgT1BDX09VQl9ERVZfUkVHSVNUOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX0RFVl9SRUdJU1QgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX0RFVl9SRUdJU1RcbiIpKTsKIAkJbXBpX3JlZ19yZXNwKHBtODAwMV9oYSwgcGlvbWIpOwogCQlicmVhazsKIAljYXNlIE9QQ19PVUJfREVSRUdfREVWOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJ1bnJlc2dpc3RlciB0aGUgZGV2aWVjZSBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoInVucmVzZ2lzdGVyIHRoZSBkZXZpZWNlXG4iKSk7CiAJCW1waV9kZXJlZ19yZXNwKHBtODAwMV9oYSwgcGlvbWIpOwogCQlicmVhazsKIAljYXNlIE9QQ19PVUJfR0VUX0RFVl9IQU5ETEU6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfR0VUX0RFVl9IQU5ETEUgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX0dFVF9ERVZfSEFORExFXG4iKSk7CiAJCWJyZWFrOwogCWNhc2UgT1BDX09VQl9TQVRBX0NPTVA6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfU0FUQV9DT01QIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TQVRBX0NPTVBcbiIpKTsKIAkJbXBpX3NhdGFfY29tcGxldGlvbihwbTgwMDFfaGEsIHBpb21iKTsKIAkJYnJlYWs7CiAJY2FzZSBPUENfT1VCX1NBVEFfRVZFTlQ6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfU0FUQV9FVkVOVCBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfU0FUQV9FVkVOVFxuIikpOwogCQltcGlfc2F0YV9ldmVudChwbTgwMDFfaGEsIHBpb21iKTsKIAkJYnJlYWs7CiAJY2FzZSBPUENfT1VCX1NTUF9FVkVOVDoKQEAgLTM4NTgsMTkgKzM4NTksMTkgQEAKIAljaXJjdWxhclEgPSAmcG04MDAxX2hhLT5pbmJuZF9xX3RibFswXTsKIAlpZiAodGFzay0+ZGF0YV9kaXIgPT0gUENJX0RNQV9OT05FKSB7CiAJCUFUQVAgPSAweDA0OyAgLyogbm8gZGF0YSovCi0JCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJubyBkYXRhIFxuIikpOworCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygibm8gZGF0YVxuIikpOwogCX0gZWxzZSBpZiAobGlrZWx5KCF0YXNrLT5hdGFfdGFzay5kZXZpY2VfY29udHJvbF9yZWdfdXBkYXRlKSkgewogCQlpZiAodGFzay0+YXRhX3Rhc2suZG1hX3hmZXIpIHsKIAkJCUFUQVAgPSAweDA2OyAvKiBETUEgKi8KLQkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJETUEgXG4iKSk7CisJCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiRE1BXG4iKSk7CiAJCX0gZWxzZSB7CiAJCQlBVEFQID0gMHgwNTsgLyogUElPKi8KLQkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJQSU8gXG4iKSk7CisJCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiUElPXG4iKSk7CiAJCX0KIAkJaWYgKHRhc2stPmF0YV90YXNrLnVzZV9uY3EgJiYKIAkJCWRldi0+c2F0YV9kZXYuY29tbWFuZF9zZXQgIT0gQVRBUElfQ09NTUFORF9TRVQpIHsKIAkJCUFUQVAgPSAweDA3OyAvKiBGUERNQSAqLwotCQkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoIkZQRE1BIFxuIikpOworCQkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoIkZQRE1BXG4iKSk7CiAJCX0KIAl9CiAJaWYgKHRhc2stPmF0YV90YXNrLnVzZV9uY3EgJiYgcG04MDAxX2dldF9uY3FfdGFnKHRhc2ssICZoZHJfdGFnKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYwppbmRleCAxNzJjZWZiLi5jMjFhMjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaW5pdC5jCkBAIC02MSw3ICs2MSw3IEBACiAJLm5hbWUJCQk9IERSVl9OQU1FLAogCS5xdWV1ZWNvbW1hbmQJCT0gc2FzX3F1ZXVlY29tbWFuZCwKIAkudGFyZ2V0X2FsbG9jCQk9IHNhc190YXJnZXRfYWxsb2MsCi0JLnNsYXZlX2NvbmZpZ3VyZQk9IHBtODAwMV9zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2NvbmZpZ3VyZQk9IHNhc19zbGF2ZV9jb25maWd1cmUsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gc2FzX3NsYXZlX2Rlc3Ryb3ksCiAJLnNjYW5fZmluaXNoZWQJCT0gcG04MDAxX3NjYW5fZmluaXNoZWQsCiAJLnNjYW5fc3RhcnQJCT0gcG04MDAxX3NjYW5fc3RhcnQsCkBAIC03Niw3ICs3Niw3IEBACiAJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAogCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IHNhc19laF9kZXZpY2VfcmVzZXRfaGFuZGxlciwKIAkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBzYXNfZWhfYnVzX3Jlc2V0X2hhbmRsZXIsCi0JLnNsYXZlX2FsbG9jCQk9IHBtODAwMV9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfYWxsb2MJCT0gc2FzX3NsYXZlX2FsbG9jLAogCS50YXJnZXRfZGVzdHJveQkJPSBzYXNfdGFyZ2V0X2Rlc3Ryb3ksCiAJLmlvY3RsCQkJPSBzYXNfaW9jdGwsCiAJLnNob3N0X2F0dHJzCQk9IHBtODAwMV9ob3N0X2F0dHJzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYwppbmRleCA2YWUwNTllLi5mYjNkYzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYwpAQCAtMjEwLDI2ICsyMTAsMTIgQEAKIAkJUE04MDAxX0NISVBfRElTUC0+cGh5X3N0b3BfcmVxKHBtODAwMV9oYSwgcGh5X2lkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJcmMgPSAtRU5PU1lTOwogCX0KIAltc2xlZXAoMzAwKTsKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBwbTgwMDFfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldikKLXsKLQlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gc2Rldl90b19kb21haW5fZGV2KHNjc2lfZGV2KTsKLQlpZiAoZGV2X2lzX3NhdGEoZGV2KSkgewotCQkvKiBXZSBkb24ndCBuZWVkIHRvIHJlc2NhbiB0YXJnZXRzCi0JCSogaWYgUkVQT1JUX0xVTlMgcmVxdWVzdCBpcyBmYWlsZWQKLQkJKi8KLQkJaWYgKHNjc2lfZGV2LT5sdW4gPiAwKQotCQkJcmV0dXJuIC1FTlhJTzsKLQkJc2NzaV9kZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgPSAxOwotCX0KLQlyZXR1cm4gc2FzX3NsYXZlX2FsbG9jKHNjc2lfZGV2KTsKLX0KLQogLyoqCiAgICogcG04MDAxX3NjYW5fc3RhcnQgLSB3ZSBzaG91bGQgZW5hYmxlIGFsbCBIQkEgcGh5cyBieSBzZW5kaW5nIHRoZSBwaHlfc3RhcnQKICAgKiBjb21tYW5kIHRvIEhCQS4KQEAgLTMxNCwyMiArMzAwLDcgQEAKIHsKIAlyZXR1cm4gUE04MDAxX0NISVBfRElTUC0+c3NwX2lvX3JlcShwbTgwMDFfaGEsIGNjYik7CiB9Ci1pbnQgcG04MDAxX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCi17Ci0Jc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IHNkZXZfdG9fZG9tYWluX2RldihzZGV2KTsKLQlpbnQgcmV0ID0gc2FzX3NsYXZlX2NvbmZpZ3VyZShzZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCWlmIChkZXZfaXNfc2F0YShkZXYpKSB7Ci0JI2lmZGVmIFBNODAwMV9ESVNBQkxFX05DUQotCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5zYXRhX2Rldi5hcDsKLQkJc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYgPSBhcC0+bGluay5kZXZpY2U7Ci0JCWFkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19OQ1FfT0ZGOwotCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfU0lNUExFX1RBRywgMSk7Ci0JI2VuZGlmCi0JfQotCXJldHVybiAwOwotfQorCiAgLyogRmluZCB0aGUgbG9jYWwgcG9ydCBpZCB0aGF0J3MgYXR0YWNoZWQgdG8gdGhpcyBkZXZpY2UgKi8KIHN0YXRpYyBpbnQgc2FzX2ZpbmRfbG9jYWxfcG9ydF9pZChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQogewpAQCAtMzg1LDIxICszNTYsOCBAQAogCWRvIHsKIAkJZGV2ID0gdC0+ZGV2OwogCQlwbTgwMDFfZGV2ID0gZGV2LT5sbGRkX2RldjsKLQkJaWYgKERFVl9JU19HT05FKHBtODAwMV9kZXYpKSB7Ci0JCQlpZiAocG04MDAxX2RldikgewotCQkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAotCQkJCQlwbTgwMDFfcHJpbnRrKCJkZXZpY2UgJWQgbm90IHJlYWR5LlxuIiwKLQkJCQkJcG04MDAxX2Rldi0+ZGV2aWNlX2lkKSk7Ci0JCQl9IGVsc2UgewotCQkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAotCQkJCQlwbTgwMDFfcHJpbnRrKCJkZXZpY2UgJTAxNmxseCBub3QgIgotCQkJCQkicmVhZHkuXG4iLCBTQVNfQUREUihkZXYtPnNhc19hZGRyKSkpOwotCQkJfQotCQkJcmMgPSBTQVNfUEhZX0RPV047Ci0JCQlnb3RvIG91dF9kb25lOwotCQl9CiAJCXBvcnQgPSAmcG04MDAxX2hhLT5wb3J0W3Nhc19maW5kX2xvY2FsX3BvcnRfaWQoZGV2KV07Ci0JCWlmICghcG9ydC0+cG9ydF9hdHRhY2hlZCkgeworCQlpZiAoREVWX0lTX0dPTkUocG04MDAxX2RldikgfHwgIXBvcnQtPnBvcnRfYXR0YWNoZWQpIHsKIAkJCWlmIChzYXNfcHJvdG9jb2xfYXRhKHQtPnRhc2tfcHJvdG8pKSB7CiAJCQkJc3RydWN0IHRhc2tfc3RhdHVzX3N0cnVjdCAqdHMgPSAmdC0+dGFza19zdGF0dXM7CiAJCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKQEAgLTY1MSw3ICs2MDksNyBAQAogCQkJCWZsYWcgPSAxOyAvKiBkaXJlY3RseSBzYXRhKi8KIAkJfQogCX0gLypyZWdpc3RlciB0aGlzIGRldmljZSB0byBIQkEqLwotCVBNODAwMV9ESVNDX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoIkZvdW5kIGRldmljZSBcbiIpKTsKKwlQTTgwMDFfRElTQ19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJGb3VuZCBkZXZpY2VcbiIpKTsKIAlQTTgwMDFfQ0hJUF9ESVNQLT5yZWdfZGV2X3JlcShwbTgwMDFfaGEsIHBtODAwMV9kZXZpY2UsIGZsYWcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtODAwMV9oYS0+bG9jaywgZmxhZ3MpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsZXRpb24pOwpAQCAtNjY5LDMwICs2MjcsNiBAQAogCXJldHVybiBwbTgwMDFfZGV2X2ZvdW5kX25vdGlmeShkZXYpOwogfQogCi0vKioKLSAgKiBwbTgwMDFfYWxsb2NfdGFzayAtIGFsbG9jYXRlIGEgdGFzayBzdHJ1Y3R1cmUgZm9yIFRNRgotICAqLwotc3RhdGljIHN0cnVjdCBzYXNfdGFzayAqcG04MDAxX2FsbG9jX3Rhc2sodm9pZCkKLXsKLQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBremFsbG9jKHNpemVvZigqdGFzayksIEdGUF9LRVJORUwpOwotCWlmICh0YXNrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZ0YXNrLT5saXN0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7Ci0JCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgPSBTQVNfVEFTS19TVEFURV9QRU5ESU5HOwotCQlpbml0X3RpbWVyKCZ0YXNrLT50aW1lcik7Ci0JCWluaXRfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7Ci0JfQotCXJldHVybiB0YXNrOwotfQotCi1zdGF0aWMgdm9pZCBwbTgwMDFfZnJlZV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzaykKLXsKLQlpZiAodGFzaykgewotCQlCVUdfT04oIWxpc3RfZW1wdHkoJnRhc2stPmxpc3QpKTsKLQkJa2ZyZWUodGFzayk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBwbTgwMDFfdGFza19kb25lKHN0cnVjdCBzYXNfdGFzayAqdGFzaykKIHsKIAlpZiAoIWRlbF90aW1lcigmdGFzay0+dGltZXIpKQpAQCAtNzI4LDcgKzY2Miw3IEBACiAJc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhID0gcG04MDAxX2ZpbmRfaGFfYnlfZGV2KGRldik7CiAKIAlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCAzOyByZXRyeSsrKSB7Ci0JCXRhc2sgPSBwbTgwMDFfYWxsb2NfdGFzaygpOworCQl0YXNrID0gc2FzX2FsbG9jX3Rhc2soR0ZQX0tFUk5FTCk7CiAJCWlmICghdGFzaykKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC03ODksMTQgKzcyMywxMyBAQAogCQkJCVNBU19BRERSKGRldi0+c2FzX2FkZHIpLAogCQkJCXRhc2stPnRhc2tfc3RhdHVzLnJlc3AsCiAJCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCkpOwotCQkJcG04MDAxX2ZyZWVfdGFzayh0YXNrKTsKKwkJCXNhc19mcmVlX3Rhc2sodGFzayk7CiAJCQl0YXNrID0gTlVMTDsKIAkJfQogCX0KIGV4X2VycjoKIAlCVUdfT04ocmV0cnkgPT0gMyAmJiB0YXNrICE9IE5VTEwpOwotCWlmICh0YXNrICE9IE5VTEwpCi0JCXBtODAwMV9mcmVlX3Rhc2sodGFzayk7CisJc2FzX2ZyZWVfdGFzayh0YXNrKTsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC04MTEsNyArNzQ0LDcgQEAKIAlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBOVUxMOwogCiAJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgcmV0cnkrKykgewotCQl0YXNrID0gcG04MDAxX2FsbG9jX3Rhc2soKTsKKwkJdGFzayA9IHNhc19hbGxvY190YXNrKEdGUF9LRVJORUwpOwogCQlpZiAoIXRhc2spCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtODY0LDE0ICs3OTcsMTMgQEAKIAkJCQlTQVNfQUREUihkZXYtPnNhc19hZGRyKSwKIAkJCQl0YXNrLT50YXNrX3N0YXR1cy5yZXNwLAogCQkJCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQpKTsKLQkJCXBtODAwMV9mcmVlX3Rhc2sodGFzayk7CisJCQlzYXNfZnJlZV90YXNrKHRhc2spOwogCQkJdGFzayA9IE5VTEw7CiAJCX0KIAl9CiBleF9lcnI6CiAJQlVHX09OKHJldHJ5ID09IDMgJiYgdGFzayAhPSBOVUxMKTsKLQlpZiAodGFzayAhPSBOVUxMKQotCQlwbTgwMDFfZnJlZV90YXNrKHRhc2spOworCXNhc19mcmVlX3Rhc2sodGFzayk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTAyNiwxMyArOTU4LDE0IEBACiAJCS8qIFRoZSB0YXNrIGlzIHN0aWxsIGluIEx1biwgcmVsZWFzZSBpdCB0aGVuICovCiAJCWNhc2UgVE1GX1JFU1BfRlVOQ19TVUNDOgogCQkJUE04MDAxX0VIX0RCRyhwbTgwMDFfaGEsCi0JCQkJcG04MDAxX3ByaW50aygiVGhlIHRhc2sgaXMgc3RpbGwgaW4gTHVuIFxuIikpOworCQkJCXBtODAwMV9wcmludGsoIlRoZSB0YXNrIGlzIHN0aWxsIGluIEx1blxuIikpOworCQkJYnJlYWs7CiAJCS8qIFRoZSB0YXNrIGlzIG5vdCBpbiBMdW4gb3IgZmFpbGVkLCByZXNldCB0aGUgcGh5ICovCiAJCWNhc2UgVE1GX1JFU1BfRlVOQ19GQUlMRUQ6CiAJCWNhc2UgVE1GX1JFU1BfRlVOQ19DT01QTEVURToKIAkJCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLAogCQkJcG04MDAxX3ByaW50aygiVGhlIHRhc2sgaXMgbm90IGluIEx1biBvciBmYWlsZWQsIgotCQkJIiByZXNldCB0aGUgcGh5IFxuIikpOworCQkJIiByZXNldCB0aGUgcGh5XG4iKSk7CiAJCQlicmVhazsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5oIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmgKaW5kZXggYjk3YzhhYi4uOTM5NTlmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmgKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmgKQEAgLTQ3MSw4ICs0NzEsNiBAQAogCXN0cnVjdCBzYXNfdGFzayAqdGFzaywgc3RydWN0IHBtODAwMV9jY2JfaW5mbyAqY2NiLCB1MzIgY2NiX2lkeCk7CiBpbnQgcG04MDAxX3BoeV9jb250cm9sKHN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSwgZW51bSBwaHlfZnVuYyBmdW5jLAogCXZvaWQgKmZ1bmNkYXRhKTsKLWludCBwbTgwMDFfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2Rldik7Ci1pbnQgcG04MDAxX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogdm9pZCBwbTgwMDFfc2Nhbl9zdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CiBpbnQgcG04MDAxX3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGxvbmcgdGltZSk7CiBpbnQgcG04MDAxX3F1ZXVlX2NvbW1hbmQoc3RydWN0IHNhc190YXNrICp0YXNrLCBjb25zdCBpbnQgbnVtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtY3JhaWQuYyBiL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMKaW5kZXggYjg2ZGI4NC4uNTE2M2VkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtY3JhaWQuYworKysgYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jCkBAIC00MTAyLDcgKzQxMDIsNyBAQAogCXN0cnVjdCBwbWNyYWlkX2lvY3RsX2hlYWRlciAqaGRyID0gTlVMTDsKIAlpbnQgcmV0dmFsID0gLUVOT1RUWTsKIAotCWhkciA9IGttYWxsb2MoR0ZQX0tFUk5FTCwgc2l6ZW9mKHN0cnVjdCBwbWNyYWlkX2lvY3RsX2hlYWRlcikpOworCWhkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbWNyYWlkX2lvY3RsX2hlYWRlciksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFoZHIpIHsKIAkJcG1jcmFpZF9lcnIoImZhaWxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW9jdGwgaGVhZGVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wczNyb20uYyBiL2RyaXZlcnMvc2NzaS9wczNyb20uYwppbmRleCBjZDE3OGI5Li45NTlmMTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcHMzcm9tLmMKKysrIGIvZHJpdmVycy9zY3NpL3BzM3JvbS5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IGEzMWUwNWYuLmFjMzI2YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMjMsMTEgKzIzLDIzIEBACiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAogCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCWludCBydmFsID0gMDsKIAogCWlmIChoYS0+ZndfZHVtcF9yZWFkaW5nID09IDApCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZvZmYsIGhhLT5md19kdW1wLAorCWlmIChJU19RTEE4MlhYKGhhKSkgeworCQlpZiAob2ZmIDwgaGEtPm1kX3RlbXBsYXRlX3NpemUpIHsKKwkJCXJ2YWwgPSBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LAorCQkJICAgICZvZmYsIGhhLT5tZF90bXBsdF9oZHIsIGhhLT5tZF90ZW1wbGF0ZV9zaXplKTsKKwkJCXJldHVybiBydmFsOworCQl9CisJCW9mZiAtPSBoYS0+bWRfdGVtcGxhdGVfc2l6ZTsKKwkJcnZhbCA9IG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsCisJCSAgICAmb2ZmLCBoYS0+bWRfZHVtcCwgaGEtPm1kX2R1bXBfc2l6ZSk7CisJCXJldHVybiBydmFsOworCX0gZWxzZQorCQlyZXR1cm4gbWVtb3J5X3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgJm9mZiwgaGEtPmZ3X2R1bXAsCiAJCQkJCWhhLT5md19kdW1wX2xlbik7CiB9CiAKQEAgLTQxLDEyICs1Myw2IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJaW50IHJlYWRpbmc7CiAKLQlpZiAoSVNfUUxBODJYWChoYSkpIHsKLQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA1YiwKLQkJICAgICJGaXJtd2FyZSBkdW1wIG5vdCBzdXBwb3J0ZWQgZm9yIElTUDgyeHhcbiIpOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCiAJaWYgKG9mZiAhPSAwKQogCQlyZXR1cm4gKDApOwogCkBAIC01OSw2ICs2NSwxMCBAQAogCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDVkLAogCQkgICAgIkZpcm13YXJlIGR1bXAgY2xlYXJlZCBvbiAoJWxkKS5cbiIsIHZoYS0+aG9zdF9ubyk7CiAKKwkJaWYgKElTX1FMQTgyWFgodmhhLT5odykpIHsKKwkJCXFsYTgyeHhfbWRfZnJlZSh2aGEpOworCQkJcWxhODJ4eF9tZF9wcmVwKHZoYSk7CisJCX0KIAkJaGEtPmZ3X2R1bXBfcmVhZGluZyA9IDA7CiAJCWhhLT5md19kdW1wZWQgPSAwOwogCQlicmVhazsKQEAgLTc1LDEwICs4NSwyOSBAQAogCQlxbGEyeDAwX2FsbG9jX2Z3X2R1bXAodmhhKTsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlxbGEyeDAwX3N5c3RlbV9lcnJvcih2aGEpOworCQlpZiAoSVNfUUxBODJYWChoYSkpIHsKKwkJCXFsYTgyeHhfaWRjX2xvY2soaGEpOworCQkJcWxhODJ4eF9zZXRfcmVzZXRfb3duZXIodmhhKTsKKwkJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CisJCX0gZWxzZQorCQkJcWxhMngwMF9zeXN0ZW1fZXJyb3IodmhhKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpZiAoSVNfUUxBODJYWChoYSkpIHsKKwkJCWlmIChoYS0+bWRfdG1wbHRfaGRyKQorCQkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNWIsCisJCQkJICAgICJNaW5pRHVtcCBzdXBwb3J0ZWQgd2l0aCB0aGlzIGZpcm13YXJlLlxuIik7CisJCQllbHNlCisJCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA5ZCwKKwkJCQkgICAgIk1pbmlEdW1wIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIGZpcm13YXJlLlxuIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA1OgorCQlpZiAoSVNfUUxBODJYWChoYSkpCisJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gKGNvdW50KTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHN5c2ZzX2Z3X2R1bXBfYXR0ciA9IHsKQEAgLTEyMiw3ICsxNTEsNyBAQAogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IG9mZiAhPSAwIHx8IGNvdW50ICE9IGhhLT5udnJhbV9zaXplIHx8CiAJICAgICFoYS0+aXNwX29wcy0+d3JpdGVfbnZyYW0pCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIENoZWNrc3VtIE5WUkFNLiAqLwogCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7CkBAIC0xNjUsNyArMTk0LDcgQEAKIAlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CiAJcWxhMngwMF93YWl0X2Zvcl9jaGlwX3Jlc2V0KHZoYSk7CiAKLQlyZXR1cm4gKGNvdW50KTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBzeXNmc19udnJhbV9hdHRyID0gewpAQCAtMjM5LDEwICsyNjgsMTAgQEAKIAlpbnQgdmFsLCB2YWxpZDsKIAogCWlmIChvZmYpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh1bmxpa2VseShwY2lfY2hhbm5lbF9vZmZsaW5lKGhhLT5wZGV2KSkpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVBR0FJTjsKIAogCWlmIChzc2NhbmYoYnVmLCAiJWQ6JXg6JXgiLCAmdmFsLCAmc3RhcnQsICZzaXplKSA8IDEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjUzLDcgKzI4Miw3IEBACiAJY2FzZSAwOgogCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1JFQURJTkcgJiYKIAkJICAgIGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXUklUSU5HKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXQUlUSU5HOwogCkBAIC0yNjYsNyArMjk1LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSAxOgogCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dBSVRJTkcpCi0JCQlicmVhazsKKwkJCXJldHVybiAtRUlOVkFMOwogCiAJCWhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0ID0gc3RhcnQ7CiAJCWhhLT5vcHRyb21fcmVnaW9uX3NpemUgPSBzdGFydCArIHNpemUgPiBoYS0+b3B0cm9tX3NpemUgPwpAQCAtMjgwLDcgKzMwOSw3IEBACiAJCQkgICAgIigleCkuXG4iLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAogCQkJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV0FJVElORzsKLQkJCXJldHVybiBjb3VudDsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKIAkJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7CkBAIC0yOTksNyArMzI4LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSAyOgogCQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dBSVRJTkcpCi0JCQlicmVhazsKKwkJCXJldHVybiAtRUlOVkFMOwogCiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gYmUgbW9yZSByZXN0cmljdGl2ZSBvbiB3aGljaCBGTEFTSCByZWdpb25zIGFyZQpAQCAtMzQ3LDcgKzM3Niw3IEBACiAJCQkgICAgIigleClcbiIsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCiAJCQloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXQUlUSU5HOwotCQkJcmV0dXJuIGNvdW50OworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDY3LApAQCAtMzU4LDcgKzM4Nyw3IEBACiAJCWJyZWFrOwogCWNhc2UgMzoKIAkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXUklUSU5HKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gLUVOT01FTTsKIAogCQlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNjgsCkBAIC0zNzQsNyArNDAzLDcgQEAKIAkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJY291bnQgPSAtRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMzk4LDEwICs0MjcsMTAgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCWlmICh1bmxpa2VseShwY2lfY2hhbm5lbF9vZmZsaW5lKGhhLT5wZGV2KSkpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVBR0FJTjsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKElTX05PQ0FDSEVfVlBEX1RZUEUoaGEpKQogCQloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20odmhhLCBoYS0+dnBkLCBoYS0+Zmx0X3JlZ2lvbl92cGQgPDwgMiwKQEAgLTQzOCwxNyArNDY3LDE3IEBACiAKIAkvKiBVcGRhdGUgZmxhc2ggdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgNEdiICYgYWJvdmUuICovCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKQotCQlnb3RvIGRvbmU7CisJCXJldHVybiAtRUlOVkFMOwogCiAJdG1wX2RhdGEgPSB2bWFsbG9jKDI1Nik7CiAJaWYgKCF0bXBfZGF0YSkgewogCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDZiLAogCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFZQRCBpbmZvcm1hdGlvbiB1cGRhdGUuXG4iKTsKLQkJZ290byBkb25lOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaGEtPmlzcF9vcHMtPmdldF9mbGFzaF92ZXJzaW9uKHZoYSwgdG1wX2RhdGEpOwogCXZmcmVlKHRtcF9kYXRhKTsKLWRvbmU6CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTUwNSw4ICs1MzQsNyBAQAogCQkJICAgICJVbmFibGUgdG8gcmVhZCBTRlAgZGF0YSAoJXgvJXgvJXgpLlxuIiwgcnZhbCwKIAkJCSAgICBhZGRyLCBvZmZzZXQpOwogCi0JCQljb3VudCA9IDA7Ci0JCQlicmVhazsKKwkJCXJldHVybiAtRUlPOwogCQl9CiAJCW1lbWNweShidWYsIGhhLT5zZnBfZGF0YSwgU0ZQX0JMT0NLX1NJWkUpOwogCQlidWYgKz0gU0ZQX0JMT0NLX1NJWkU7CkBAIC01MzYsNyArNTY0LDcgQEAKIAlpbnQgdHlwZTsKIAogCWlmIChvZmYgIT0gMCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlOVkFMOwogCiAJdHlwZSA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CiAJc3dpdGNoICh0eXBlKSB7CkBAIC01NDYsMTMgKzU3NCwxOCBAQAogCiAJCXNjc2lfYmxvY2tfcmVxdWVzdHModmhhLT5ob3N0KTsKIAkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCQlpZiAoSVNfUUxBODJYWChoYSkpIHsKKwkJCXFsYTgyeHhfaWRjX2xvY2soaGEpOworCQkJcWxhODJ4eF9zZXRfcmVzZXRfb3duZXIodmhhKTsKKwkJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CisJCX0KIAkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOwogCQlxbGEyeDAwX3dhaXRfZm9yX2NoaXBfcmVzZXQodmhhKTsKIAkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CiAJCWJyZWFrOwogCWNhc2UgMHgyMDI1ZDoKIAkJaWYgKCFJU19RTEE4MVhYKGhhKSkKLQkJCWJyZWFrOworCQkJcmV0dXJuIC1FUEVSTTsKIAogCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDZmLAogCQkgICAgIklzc3VpbmcgTVBJIHJlc2V0LlxuIik7CkBAIC01NzEsNyArNjA0LDcgQEAKIAkJaWYgKCFJU19RTEE4MlhYKGhhKSB8fCB2aGEgIT0gYmFzZV92aGEpIHsKIAkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNzEsCiAJCQkgICAgIkZDb0UgY3R4IHJlc2V0IG5vIHN1cHBvcnRlZC5cbiIpOwotCQkJcmV0dXJuIGNvdW50OworCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQogCiAJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNzIsCkBAIC02MDcsNyArNjQwLDcgQEAKIAloYS0+ZWRjX2RhdGFfbGVuID0gMDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBvZmYgIT0gMCB8fCBjb3VudCA8IDgpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghaGEtPmVkY19kYXRhKSB7CiAJCWhhLT5lZGNfZGF0YSA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLApAQCAtNjE1LDcgKzY0OCw3IEBACiAJCWlmICghaGEtPmVkY19kYXRhKSB7CiAJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDczLAogCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBFREMgd3JpdGUuXG4iKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAl9CiAKQEAgLTYzNCw5ICs2NjcsOSBAQAogCSAgICBkZXYsIGFkciwgbGVuLCBvcHQpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNzQsCi0JCSAgICAiVW5hYmxlIHRvIHdyaXRlIEVEQyAoJXgpICUwMng6JTA0eDolMDJ4OiUwMnhcbiIsCisJCSAgICAiVW5hYmxlIHRvIHdyaXRlIEVEQyAoJXgpICUwMng6JTA0eDolMDJ4OiUwMmhoeFxuIiwKIAkJICAgIHJ2YWwsIGRldiwgYWRyLCBvcHQsIGxlbiwgYnVmWzhdKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXJldHVybiBjb3VudDsKQEAgLTY2NSw3ICs2OTgsNyBAQAogCWhhLT5lZGNfZGF0YV9sZW4gPSAwOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IG9mZiAhPSAwIHx8IGNvdW50IDwgOCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFoYS0+ZWRjX2RhdGEpIHsKIAkJaGEtPmVkY19kYXRhID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCkBAIC02NzMsNyArNzA2LDcgQEAKIAkJaWYgKCFoYS0+ZWRjX2RhdGEpIHsKIAkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwOGMsCiAJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEVEQyBzdGF0dXMuXG4iKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAl9CiAKQEAgLTY5Myw3ICs3MjYsNyBAQAogCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDc1LAogCQkgICAgIlVuYWJsZSB0byB3cml0ZSBFREMgc3RhdHVzICgleCkgJTAyeDolMDR4OiUwMnguXG4iLAogCQkgICAgcnZhbCwgZGV2LCBhZHIsIG9wdCwgbGVuKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlPOwogCX0KIAogCWhhLT5lZGNfZGF0YV9sZW4gPSBsZW47CkBAIC04MDUsNyArODM4LDcgQEAKIAlpZiAoIWhhLT5kY2J4X3RsdikgewogCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDc4LAogCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIERDQlggVExWIHJlYWQtZGF0YS5cbiIpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiBkb19yZWFkOgpAQCAtODE3LDcgKzg1MCw3IEBACiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3OSwKIAkJICAgICJVbmFibGUgdG8gcmVhZCBEQ0JYIFRMViAoJXgpLlxuIiwgcnZhbCk7Ci0JCWNvdW50ID0gMDsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJbWVtY3B5KGJ1ZiwgaGEtPmRjYnhfdGx2LCBjb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMKaW5kZXggMDdkMTc2Ny4uOGI2NDFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYwpAQCAtNzA0LDYgKzcwNCw3IEBACiAJZWxyZXEub3B0aW9ucyA9IGJzZ19qb2ItPnJlcXVlc3QtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzFdOwogCiAJaWYgKChoYS0+Y3VycmVudF90b3BvbG9neSA9PSBJU1BfQ0ZHX0YgfHwKKwkgICAgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTikgfHwKIAkgICAgKElTX1FMQTgxWFgoaGEpICYmCiAJICAgIGxlMzJfdG9fY3B1KCoodWludDMyX3QgKilyZXFfZGF0YSkgPT0gRUxTX09QQ09ERV9CWVRFCiAJICAgICYmIHJlcV9kYXRhX2xlbiA9PSBNQVhfRUxTX0ZSQU1FX1BBWUxPQUQpKSAmJgpAQCAtMTQ0Nyw2ICsxNDQ4LDE0OCBAQAogfQogCiBzdGF0aWMgaW50CitxbGEyeDAwX3VwZGF0ZV9mcnVfdmVyc2lvbnMoc3RydWN0IGZjX2JzZ19qb2IgKmJzZ19qb2IpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGJzZ19qb2ItPnNob3N0OworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihob3N0KTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlpbnQgcnZhbCA9IDA7CisJdWludDhfdCBic2dbRE1BX1BPT0xfU0laRV07CisJc3RydWN0IHFsYV9pbWFnZV92ZXJzaW9uX2xpc3QgKmxpc3QgPSAodm9pZCAqKWJzZzsKKwlzdHJ1Y3QgcWxhX2ltYWdlX3ZlcnNpb24gKmltYWdlOworCXVpbnQzMl90IGNvdW50OworCWRtYV9hZGRyX3Qgc2ZwX2RtYTsKKwl2b2lkICpzZnAgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJnNmcF9kbWEpOworCWlmICghc2ZwKSB7CisJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9kYXRhLnZlbmRvcl9yZXBseS52ZW5kb3JfcnNwWzBdID0KKwkJICAgIEVYVF9TVEFUVVNfTk9fTUVNT1JZOworCQlnb3RvIGRvbmU7CisJfQorCisJc2dfY29weV90b19idWZmZXIoYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCisJICAgIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIGxpc3QsIHNpemVvZihic2cpKTsKKworCWltYWdlID0gbGlzdC0+dmVyc2lvbjsKKwljb3VudCA9IGxpc3QtPmNvdW50OworCXdoaWxlIChjb3VudC0tKSB7CisJCW1lbWNweShzZnAsICZpbWFnZS0+ZmllbGRfaW5mbywgc2l6ZW9mKGltYWdlLT5maWVsZF9pbmZvKSk7CisJCXJ2YWwgPSBxbGEyeDAwX3dyaXRlX3NmcCh2aGEsIHNmcF9kbWEsIHNmcCwKKwkJICAgIGltYWdlLT5maWVsZF9hZGRyZXNzLmRldmljZSwgaW1hZ2UtPmZpZWxkX2FkZHJlc3Mub2Zmc2V0LAorCQkgICAgc2l6ZW9mKGltYWdlLT5maWVsZF9pbmZvKSwgaW1hZ2UtPmZpZWxkX2FkZHJlc3Mub3B0aW9uKTsKKwkJaWYgKHJ2YWwpIHsKKwkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9kYXRhLnZlbmRvcl9yZXBseS52ZW5kb3JfcnNwWzBdID0KKwkJCSAgICBFWFRfU1RBVFVTX01BSUxCT1g7CisJCQlnb3RvIGRlYWxsb2M7CisJCX0KKwkJaW1hZ2UrKzsKKwl9CisKKwlic2dfam9iLT5yZXBseS0+cmVwbHlfZGF0YS52ZW5kb3JfcmVwbHkudmVuZG9yX3JzcFswXSA9IDA7CisKK2RlYWxsb2M6CisJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgc2ZwLCBzZnBfZG1hKTsKKworZG9uZToKKwlic2dfam9iLT5yZXBseV9sZW4gPSBzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXBseSk7CisJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwlic2dfam9iLT5qb2JfZG9uZShic2dfam9iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitxbGEyeDAwX3JlYWRfZnJ1X3N0YXR1cyhzdHJ1Y3QgZmNfYnNnX2pvYiAqYnNnX2pvYikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gYnNnX2pvYi0+c2hvc3Q7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGhvc3QpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCWludCBydmFsID0gMDsKKwl1aW50OF90IGJzZ1tETUFfUE9PTF9TSVpFXTsKKwlzdHJ1Y3QgcWxhX3N0YXR1c19yZWcgKnNyID0gKHZvaWQgKilic2c7CisJZG1hX2FkZHJfdCBzZnBfZG1hOworCXVpbnQ4X3QgKnNmcCA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmc2ZwX2RtYSk7CisJaWYgKCFzZnApIHsKKwkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X2RhdGEudmVuZG9yX3JlcGx5LnZlbmRvcl9yc3BbMF0gPQorCQkgICAgRVhUX1NUQVRVU19OT19NRU1PUlk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzZ19jb3B5X3RvX2J1ZmZlcihic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdCwKKwkgICAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgc3IsIHNpemVvZigqc3IpKTsKKworCXJ2YWwgPSBxbGEyeDAwX3JlYWRfc2ZwKHZoYSwgc2ZwX2RtYSwgc2ZwLAorCSAgICBzci0+ZmllbGRfYWRkcmVzcy5kZXZpY2UsIHNyLT5maWVsZF9hZGRyZXNzLm9mZnNldCwKKwkgICAgc2l6ZW9mKHNyLT5zdGF0dXNfcmVnKSwgc3ItPmZpZWxkX2FkZHJlc3Mub3B0aW9uKTsKKwlzci0+c3RhdHVzX3JlZyA9ICpzZnA7CisKKwlpZiAocnZhbCkgeworCQlic2dfam9iLT5yZXBseS0+cmVwbHlfZGF0YS52ZW5kb3JfcmVwbHkudmVuZG9yX3JzcFswXSA9CisJCSAgICBFWFRfU1RBVFVTX01BSUxCT1g7CisJCWdvdG8gZGVhbGxvYzsKKwl9CisKKwlzZ19jb3B5X2Zyb21fYnVmZmVyKGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCwKKwkgICAgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIHNyLCBzaXplb2YoKnNyKSk7CisKKwlic2dfam9iLT5yZXBseS0+cmVwbHlfZGF0YS52ZW5kb3JfcmVwbHkudmVuZG9yX3JzcFswXSA9IDA7CisKK2RlYWxsb2M6CisJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgc2ZwLCBzZnBfZG1hKTsKKworZG9uZToKKwlic2dfam9iLT5yZXBseV9sZW4gPSBzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXBseSk7CisJYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IHNpemVvZigqc3IpOworCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJYnNnX2pvYi0+am9iX2RvbmUoYnNnX2pvYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcWxhMngwMF93cml0ZV9mcnVfc3RhdHVzKHN0cnVjdCBmY19ic2dfam9iICpic2dfam9iKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBic2dfam9iLT5zaG9zdDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoaG9zdCk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJaW50IHJ2YWwgPSAwOworCXVpbnQ4X3QgYnNnW0RNQV9QT09MX1NJWkVdOworCXN0cnVjdCBxbGFfc3RhdHVzX3JlZyAqc3IgPSAodm9pZCAqKWJzZzsKKwlkbWFfYWRkcl90IHNmcF9kbWE7CisJdWludDhfdCAqc2ZwID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZzZnBfZG1hKTsKKwlpZiAoIXNmcCkgeworCQlic2dfam9iLT5yZXBseS0+cmVwbHlfZGF0YS52ZW5kb3JfcmVwbHkudmVuZG9yX3JzcFswXSA9CisJCSAgICBFWFRfU1RBVFVTX05PX01FTU9SWTsKKwkJZ290byBkb25lOworCX0KKworCXNnX2NvcHlfdG9fYnVmZmVyKGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0LAorCSAgICBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBzciwgc2l6ZW9mKCpzcikpOworCisJKnNmcCA9IHNyLT5zdGF0dXNfcmVnOworCXJ2YWwgPSBxbGEyeDAwX3dyaXRlX3NmcCh2aGEsIHNmcF9kbWEsIHNmcCwKKwkgICAgc3ItPmZpZWxkX2FkZHJlc3MuZGV2aWNlLCBzci0+ZmllbGRfYWRkcmVzcy5vZmZzZXQsCisJICAgIHNpemVvZihzci0+c3RhdHVzX3JlZyksIHNyLT5maWVsZF9hZGRyZXNzLm9wdGlvbik7CisKKwlpZiAocnZhbCkgeworCQlic2dfam9iLT5yZXBseS0+cmVwbHlfZGF0YS52ZW5kb3JfcmVwbHkudmVuZG9yX3JzcFswXSA9CisJCSAgICBFWFRfU1RBVFVTX01BSUxCT1g7CisJCWdvdG8gZGVhbGxvYzsKKwl9CisKKwlic2dfam9iLT5yZXBseS0+cmVwbHlfZGF0YS52ZW5kb3JfcmVwbHkudmVuZG9yX3JzcFswXSA9IDA7CisKK2RlYWxsb2M6CisJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgc2ZwLCBzZnBfZG1hKTsKKworZG9uZToKKwlic2dfam9iLT5yZXBseV9sZW4gPSBzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXBseSk7CisJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwlic2dfam9iLT5qb2JfZG9uZShic2dfam9iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CiBxbGEyeDAwX3Byb2Nlc3NfdmVuZG9yX3NwZWNpZmljKHN0cnVjdCBmY19ic2dfam9iICpic2dfam9iKQogewogCXN3aXRjaCAoYnNnX2pvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9jbWRbMF0pIHsKQEAgLTE0NzQsNiArMTYxNywxNSBAQAogCWNhc2UgUUxfVk5EX1VQREFURV9GTEFTSDoKIAkJcmV0dXJuIHFsYTJ4MDBfdXBkYXRlX29wdHJvbShic2dfam9iKTsKIAorCWNhc2UgUUxfVk5EX1NFVF9GUlVfVkVSU0lPTjoKKwkJcmV0dXJuIHFsYTJ4MDBfdXBkYXRlX2ZydV92ZXJzaW9ucyhic2dfam9iKTsKKworCWNhc2UgUUxfVk5EX1JFQURfRlJVX1NUQVRVUzoKKwkJcmV0dXJuIHFsYTJ4MDBfcmVhZF9mcnVfc3RhdHVzKGJzZ19qb2IpOworCisJY2FzZSBRTF9WTkRfV1JJVEVfRlJVX1NUQVRVUzoKKwkJcmV0dXJuIHFsYTJ4MDBfd3JpdGVfZnJ1X3N0YXR1cyhic2dfam9iKTsKKwogCWRlZmF1bHQ6CiAJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKIAkJYnNnX2pvYi0+am9iX2RvbmUoYnNnX2pvYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmgKaW5kZXggMGYwZjU0ZS4uNzBjYWE2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuaApAQCAtMTYsNiArMTYsMTYgQEAKICNkZWZpbmUgUUxfVk5EX0ZDUF9QUklPX0NGR19DTUQJMHgwNgogI2RlZmluZSBRTF9WTkRfUkVBRF9GTEFTSAkweDA3CiAjZGVmaW5lIFFMX1ZORF9VUERBVEVfRkxBU0gJMHgwOAorI2RlZmluZSBRTF9WTkRfU0VUX0ZSVV9WRVJTSU9OCTB4MEIKKyNkZWZpbmUgUUxfVk5EX1JFQURfRlJVX1NUQVRVUwkweDBDCisjZGVmaW5lIFFMX1ZORF9XUklURV9GUlVfU1RBVFVTCTB4MEQKKworLyogQlNHIFZlbmRvciBzcGVjaWZpYyBzdWJjb2RlIHJldHVybnMgKi8KKyNkZWZpbmUgRVhUX1NUQVRVU19PSwkJCTAKKyNkZWZpbmUgRVhUX1NUQVRVU19FUlIJCQkxCisjZGVmaW5lIEVYVF9TVEFUVVNfSU5WQUxJRF9QQVJBTQk2CisjZGVmaW5lIEVYVF9TVEFUVVNfTUFJTEJPWAkJMTEKKyNkZWZpbmUgRVhUX1NUQVRVU19OT19NRU1PUlkJCTE3CiAKIC8qIEJTRyBkZWZpbmF0aW9ucyBmb3IgaW50ZXJwcmV0aW5nIENvbW1hbmRTZW50IGZpZWxkICovCiAjZGVmaW5lIElOVF9ERUZfTEJfTE9PUEJBQ0tfQ01EICAgICAgICAgMApAQCAtMTQxLDQgKzE1MSwzNiBAQAogCXVpbnQxNl90IG1vZGU7CiAJdWludDE2X3Qgc3BlZWQ7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKiBGUlUgVlBEICovCisKKyNkZWZpbmUgTUFYX0ZSVV9TSVpFCTM2CisKK3N0cnVjdCBxbGFfZmllbGRfYWRkcmVzcyB7CisJdWludDE2X3Qgb2Zmc2V0OworCXVpbnQxNl90IGRldmljZTsKKwl1aW50MTZfdCBvcHRpb247Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcWxhX2ZpZWxkX2luZm8geworCXVpbnQ4X3QgdmVyc2lvbltNQVhfRlJVX1NJWkVdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHFsYV9pbWFnZV92ZXJzaW9uIHsKKwlzdHJ1Y3QgcWxhX2ZpZWxkX2FkZHJlc3MgZmllbGRfYWRkcmVzczsKKwlzdHJ1Y3QgcWxhX2ZpZWxkX2luZm8gZmllbGRfaW5mbzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBxbGFfaW1hZ2VfdmVyc2lvbl9saXN0IHsKKwl1aW50MzJfdCBjb3VudDsKKwlzdHJ1Y3QgcWxhX2ltYWdlX3ZlcnNpb24gdmVyc2lvblswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBxbGFfc3RhdHVzX3JlZyB7CisJc3RydWN0IHFsYV9maWVsZF9hZGRyZXNzIGZpZWxkX2FkZHJlc3M7CisJdWludDhfdCBzdGF0dXNfcmVnOworCXVpbnQ4X3QgcmVzZXJ2ZWRbN107Cit9IF9fcGFja2VkOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwppbmRleCBkNzljZDhhLi45ZGY0Nzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCkBAIC0xMiw3ICsxMiw3IEBACiAgKiB8ICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgfCAgIExhc3QgVmFsdWUgVXNlZCAgfCAgICAgSG9sZXMJfAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogfCBNb2R1bGUgSW5pdCBhbmQgUHJvYmUgICAgICAgIHwgICAgICAgMHgwMTE2ICAgICAgIHwgIAkJfAotICogfCBNYWlsYm94IGNvbW1hbmRzICAgICAgICAgICAgIHwgICAgICAgMHgxMTI2ICAgICAgIHwJCXwKKyAqIHwgTWFpbGJveCBjb21tYW5kcyAgICAgICAgICAgICB8ICAgICAgIDB4MTEyOSAgICAgICB8CQl8CiAgKiB8IERldmljZSBEaXNjb3ZlcnkgICAgICAgICAgICAgfCAgICAgICAweDIwODMgICAgICAgfAkJfAogICogfCBRdWV1ZSBDb21tYW5kIGFuZCBJTyB0cmFjaW5nIHwgICAgICAgMHgzMDJlICAgICAgIHwgICAgIDB4MzAwOCAgICAgfAogICogfCBEUEMgVGhyZWFkICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHg0MDFjICAgICAgIHwJCXwKQEAgLTIyLDcgKzIyLDcgQEAKICAqIHwgVGFzayBNYW5hZ2VtZW50ICAgICAgICAgICAgICB8ICAgICAgIDB4ODA0MSAgICAgICB8ICAgIAkJfAogICogfCBBRVIvRUVIICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHg5MDBmICAgICAgIHwJCXwKICAqIHwgVmlydHVhbCBQb3J0ICAgICAgICAgICAgICAgICB8ICAgICAgIDB4YTAwNyAgICAgICB8CQl8Ci0gKiB8IElTUDgyWFggU3BlY2lmaWMgICAgICAgICAgICAgfCAgICAgICAweGIwNGYgICAgICAgfCAgICAJCXwKKyAqIHwgSVNQODJYWCBTcGVjaWZpYyAgICAgICAgICAgICB8ICAgICAgIDB4YjA1MSAgICAgICB8ICAgIAkJfAogICogfCBNdWx0aVEgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHhjMDBiICAgICAgIHwJCXwKICAqIHwgTWlzYyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4ZDAwYiAgICAgICB8CQl8CiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MDMsNyArNDAzLDcgQEAKIAlyZXR1cm4gcHRyICsgc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X21xX2NoYWluKTsKIH0KIAotc3RhdGljIHZvaWQKK3ZvaWQKIHFsYTJ4eHhfZHVtcF9wb3N0X3Byb2Nlc3Moc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludCBydmFsKQogewogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IGEwM2VhZjQuLmZjZjA1MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTI0MzgsNyArMjQzOCw4IEBACiAJCXVpbnQzMl90CXF1aWVzY2Vfb3duZXI6MTsKIAkJdWludDMyX3QJdGhlcm1hbF9zdXBwb3J0ZWQ6MTsKIAkJdWludDMyX3QJaXNwODJ4eF9yZXNldF9oZGxyX2FjdGl2ZToxOwotCQkvKiAyNiBiaXRzICovCisJCXVpbnQzMl90CWlzcDgyeHhfcmVzZXRfb3duZXI6MTsKKwkJLyogMjggYml0cyAqLwogCX0gZmxhZ3M7CiAKIAkvKiBUaGlzIHNwaW5sb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCAiaW8gdHJhbnNhY3Rpb25zIiwgeW91IG11c3QKQEAgLTI4MjIsNiArMjgyMywxMiBAQAogCiAJdWludDhfdCBmd190eXBlOwogCV9fbGUzMiBmaWxlX3ByZF9vZmY7CS8qIEZpbGUgZmlybXdhcmUgcHJvZHVjdCBvZmZzZXQgKi8KKworCXVpbnQzMl90CW1kX3RlbXBsYXRlX3NpemU7CisJdm9pZAkJKm1kX3RtcGx0X2hkcjsKKwlkbWFfYWRkcl90ICAgICAgbWRfdG1wbHRfaGRyX2RtYTsKKwl2b2lkICAgICAgICAgICAgKm1kX2R1bXA7CisJdWludDMyX3QJbWRfZHVtcF9zaXplOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAppbmRleCAyOWIxYTNlLi5jZTMyZDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCkBAIC0xMDQsNiArMTA0LDggQEAKIGV4dGVybiBpbnQgcWwyeHRhcmdldHJlc2V0OwogZXh0ZXJuIGludCBxbDJ4ZG9udHJlc2V0aGJhOwogZXh0ZXJuIHVuc2lnbmVkIGludCBxbDJ4bWF4bHVuOworZXh0ZXJuIGludCBxbDJ4bWRjYXBtYXNrOworZXh0ZXJuIGludCBxbDJ4bWRlbmFibGU7CiAKIGV4dGVybiBpbnQgcWxhMngwMF9sb29wX3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqKTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfYWJvcnRfYWxsX2NtZHMoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CkBAIC00MDcsNiArNDA5LDggQEAKIGV4dGVybiBpbnQgcWxhMjR4eF9iZWFjb25fb24oc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CiBleHRlcm4gaW50IHFsYTI0eHhfYmVhY29uX29mZihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiB2b2lkIHFsYTI0eHhfYmVhY29uX2JsaW5rKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworZXh0ZXJuIGludCBxbGE4Mnh4X2JlYWNvbl9vbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK2V4dGVybiBpbnQgcWxhODJ4eF9iZWFjb25fb2ZmKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwogCiBleHRlcm4gdWludDhfdCAqcWxhMngwMF9yZWFkX29wdHJvbV9kYXRhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQ4X3QgKiwKICAgICB1aW50MzJfdCwgdWludDMyX3QpOwpAQCAtNDQyLDYgKzQ0Niw3IEBACiBleHRlcm4gdm9pZCBxbF9kdW1wX3JlZ3ModWludDMyX3QsIHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQzMl90KTsKIGV4dGVybiB2b2lkIHFsX2R1bXBfYnVmZmVyKHVpbnQzMl90LCBzY3NpX3FsYV9ob3N0X3QgKiwgaW50MzJfdCwKIAl1aW50OF90ICosIHVpbnQzMl90KTsKK2V4dGVybiB2b2lkIHFsYTJ4eHhfZHVtcF9wb3N0X3Byb2Nlc3Moc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiAKIC8qCiAgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfZ3MuYyBzb3VyY2UgZmlsZS4KQEAgLTU2OSw3ICs1NzQsMTAgQEAKIGV4dGVybiBpbnQgcWxhODJ4eF9tYnhfaW50cl9kaXNhYmxlKHNjc2lfcWxhX2hvc3RfdCAqKTsKIGV4dGVybiB2b2lkIHFsYTgyeHhfc3RhcnRfaW9jYnMoc3JiX3QgKik7CiBleHRlcm4gaW50IHFsYTgyeHhfZmNvZV9jdHhfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIGludCBxbGE4Mnh4X2NoZWNrX21kX25lZWRlZChzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gdm9pZCBxbGE4Mnh4X2NoaXBfcmVzZXRfY2xlYW51cChzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gaW50IHFsYTgyeHhfbWJ4X2JlYWNvbl9jdGwoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CitleHRlcm4gY2hhciAqcWRldl9zdGF0ZSh1aW50MzJfdCk7CiAKIC8qIEJTRyByZWxhdGVkIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGludCBxbGEyNHh4X2JzZ19yZXF1ZXN0KHN0cnVjdCBmY19ic2dfam9iICopOwpAQCAtNTc5LDQgKzU4NywxNCBAQAogCWRtYV9hZGRyX3QsIHNpemVfdCwgdWludDMyX3QpOwogZXh0ZXJuIGludCBxbGEyeDAwX2dldF9pZG1hX3NwZWVkKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwKIAl1aW50MTZfdCAqLCB1aW50MTZfdCAqKTsKKworLyogTWluaWR1bXAgcmVsYXRlZCBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgcWxhODJ4eF9tZF9nZXRfdGVtcGxhdGVfc2l6ZShzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gaW50IHFsYTgyeHhfbWRfZ2V0X3RlbXBsYXRlKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiBpbnQgcWxhODJ4eF9tZF9hbGxvYyhzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdm9pZCBxbGE4Mnh4X21kX2ZyZWUoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIGludCBxbGE4Mnh4X21kX2NvbGxlY3Qoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIHZvaWQgcWxhODJ4eF9tZF9wcmVwKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTgyeHhfc2V0X3Jlc2V0X293bmVyKHNjc2lfcWxhX2hvc3RfdCAqKTsKKwogI2VuZGlmIC8qIF9RTEFfR0JMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IDM3ZGEwNGQuLmYwM2U5MTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKQEAgLTE0ODAsMTMgKzE0ODAsMTkgQEAKIAkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiBlbmFibGVfODJ4eF9ucGl2OgogCQkJCWZ3X21ham9yX3ZlcnNpb24gPSBoYS0+ZndfbWFqb3JfdmVyc2lvbjsKLQkJCQlydmFsID0gcWxhMngwMF9nZXRfZndfdmVyc2lvbih2aGEsCi0JCQkJICAgICZoYS0+ZndfbWFqb3JfdmVyc2lvbiwKLQkJCQkgICAgJmhhLT5md19taW5vcl92ZXJzaW9uLAotCQkJCSAgICAmaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24sCi0JCQkJICAgICZoYS0+ZndfYXR0cmlidXRlcywgJmhhLT5md19tZW1vcnlfc2l6ZSwKLQkJCQkgICAgaGEtPm1waV92ZXJzaW9uLCAmaGEtPm1waV9jYXBhYmlsaXRpZXMsCi0JCQkJICAgIGhhLT5waHlfdmVyc2lvbik7CisJCQkJaWYgKElTX1FMQTgyWFgoaGEpKQorCQkJCQlxbGE4Mnh4X2NoZWNrX21kX25lZWRlZCh2aGEpOworCQkJCWVsc2UgeworCQkJCQlydmFsID0gcWxhMngwMF9nZXRfZndfdmVyc2lvbih2aGEsCisJCQkJCSAgICAmaGEtPmZ3X21ham9yX3ZlcnNpb24sCisJCQkJCSAgICAmaGEtPmZ3X21pbm9yX3ZlcnNpb24sCisJCQkJCSAgICAmaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24sCisJCQkJCSAgICAmaGEtPmZ3X2F0dHJpYnV0ZXMsCisJCQkJCSAgICAmaGEtPmZ3X21lbW9yeV9zaXplLAorCQkJCQkgICAgaGEtPm1waV92ZXJzaW9uLAorCQkJCQkgICAgJmhhLT5tcGlfY2FwYWJpbGl0aWVzLAorCQkJCQkgICAgaGEtPnBoeV92ZXJzaW9uKTsKKwkJCQl9CiAJCQkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCiAJCQkJCWdvdG8gZmFpbGVkOwogCQkJCWhhLT5mbGFncy5ucGl2X3N1cHBvcnRlZCA9IDA7CkBAIC0xNTAzLDEwICsxNTA5LDggQEAKIAkJCQkgICAgJmhhLT5md194Y2JfY291bnQsIE5VTEwsIE5VTEwsCiAJCQkJICAgICZoYS0+bWF4X25waXZfdnBvcnRzLCBOVUxMKTsKIAotCQkJCWlmICghZndfbWFqb3JfdmVyc2lvbiAmJiBxbDJ4YWxsb2Nmd2R1bXApIHsKLQkJCQkJaWYgKCFJU19RTEE4MlhYKGhhKSkKLQkJCQkJCXFsYTJ4MDBfYWxsb2NfZndfZHVtcCh2aGEpOwotCQkJCX0KKwkJCQlpZiAoIWZ3X21ham9yX3ZlcnNpb24gJiYgcWwyeGFsbG9jZndkdW1wKQorCQkJCQlxbGEyeDAwX2FsbG9jX2Z3X2R1bXAodmhhKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGNkLApAQCAtMTkyNCw3ICsxOTI4LDcgQEAKIAkJCQkJcnZhbCA9IHFsYTg0eHhfaW5pdF9jaGlwKHZoYSk7CiAJCQkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkJCQlxbF9sb2cocWxfbG9nX3dhcm4sCi0JCQkJCQkgICAgdmhhLCAweDgwNDMsCisJCQkJCQkgICAgdmhhLCAweDgwMjYsCiAJCQkJCQkgICAgIkluaXQgY2hpcCBmYWlsZWQuXG4iKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CkBAIC0xOTMzLDcgKzE5MzcsNyBAQAogCQkJCQljczg0eHhfdGltZSA9IGppZmZpZXMgLSBjczg0eHhfdGltZTsKIAkJCQkJd3RpbWUgKz0gY3M4NHh4X3RpbWU7CiAJCQkJCW10aW1lICs9IGNzODR4eF90aW1lOwotCQkJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODA0MiwKKwkJCQkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMjUsCiAJCQkJCSAgICAiSW5jcmVhc2luZyB3YWl0IHRpbWUgYnkgJWxkLiAiCiAJCQkJCSAgICAiTmV3IHRpbWUgJWxkLlxuIiwgY3M4NHh4X3RpbWUsCiAJCQkJCSAgICB3dGltZSk7CkBAIC01NDQzLDExICs1NDQ3LDcgQEAKIAkJY2xlYXJfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAogCQkvKiBVcGRhdGUgdGhlIGZpcm13YXJlIHZlcnNpb24gKi8KLQkJcWxhMngwMF9nZXRfZndfdmVyc2lvbih2aGEsICZoYS0+ZndfbWFqb3JfdmVyc2lvbiwKLQkJICAgICZoYS0+ZndfbWlub3JfdmVyc2lvbiwgJmhhLT5md19zdWJtaW5vcl92ZXJzaW9uLAotCQkgICAgJmhhLT5md19hdHRyaWJ1dGVzLCAmaGEtPmZ3X21lbW9yeV9zaXplLAotCQkgICAgaGEtPm1waV92ZXJzaW9uLCAmaGEtPm1waV9jYXBhYmlsaXRpZXMsCi0JCSAgICBoYS0+cGh5X3ZlcnNpb24pOworCQlzdGF0dXMgPSBxbGE4Mnh4X2NoZWNrX21kX25lZWRlZCh2aGEpOwogCiAJCWlmIChoYS0+ZmNlKSB7CiAJCQloYS0+ZmxhZ3MuZmNlX2VuYWJsZWQgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCmluZGV4IDhhNzU5MWYuLjI1MTZhZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKQEAgLTIwNjAsNiArMjA2MCwxMSBAQAogICAgICAgICAgICAgICAgIGNhc2UgRUxTX0lPQ0JfVFlQRToKIAkJCXFsYTI0eHhfZWxzX2N0X2VudHJ5KHZoYSwgcnNwLT5yZXEsIHBrdCwgRUxTX0lPQ0JfVFlQRSk7CiAJCQlicmVhazsKKwkJY2FzZSBNQVJLRVJfVFlQRToKKwkJCS8qIERvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLCB0aGlzIGNoZWNrIGlzIHRvIHByZXZlbnQgaXQKKwkJCSAqIGZyb20gZmFsbGluZyBpbnRvIGRlZmF1bHQgY2FzZQorCQkJICovCisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIFR5cGUgTm90IFN1cHBvcnRlZC4gKi8KIAkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDQyLApAQCAtMjI3NCw3ICsyMjc5LDcgQEAKIAloYSA9IHJzcC0+aHc7CiAKIAkvKiBDbGVhciB0aGUgaW50ZXJydXB0LCBpZiBlbmFibGVkLCBmb3IgdGhpcyByZXNwb25zZSBxdWV1ZSAqLwotCWlmIChyc3AtPm9wdGlvbnMgJiB+QklUXzYpIHsKKwlpZiAoIWhhLT5mbGFncy5kaXNhYmxlX21zaXhfaGFuZHNoYWtlKSB7CiAJCXJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfQ0xSX1JJU0NfSU5UKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwppbmRleCBmNzYwNGVhLi4zYjNjZWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCkBAIC00MTg2LDMgKzQxODYsMTMwIEBACiAKIAlyZXR1cm4gcnZhbDsKIH0KKworaW50CitxbGE4Mnh4X21kX2dldF90ZW1wbGF0ZV9zaXplKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKwlpbnQgcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMWYsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCisJbWVtc2V0KG1jcC0+bWIsIDAgLCBzaXplb2YobWNwLT5tYikpOworCW1jcC0+bWJbMF0gPSBMU1coTUJDX0RJQUdOT1NUSUNfTUlOSURVTVBfVEVNUExBVEUpOworCW1jcC0+bWJbMV0gPSBNU1coTUJDX0RJQUdOT1NUSUNfTUlOSURVTVBfVEVNUExBVEUpOworCW1jcC0+bWJbMl0gPSBMU1coUlFTVF9UTVBMVF9TSVpFKTsKKwltY3AtPm1iWzNdID0gTVNXKFJRU1RfVE1QTFRfU0laRSk7CisKKwltY3AtPm91dF9tYiA9IE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMTR8TUJYXzEzfE1CWF8xMnxNQlhfMTF8TUJYXzEwfE1CWF85fE1CWF84fAorCSAgICBNQlhfN3xNQlhfNnxNQlhfNXxNQlhfNHxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKworCW1jcC0+ZmxhZ3MgPSBNQlhfRE1BX09VVHxNQlhfRE1BX0lOfElPQ1RMX0NNRDsKKwltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOworCisJLyogQWx3YXlzIGNvcHkgYmFjayByZXR1cm4gbWFpbGJveCB2YWx1ZXMuICovCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTIwLAorCQkgICAgIm1haWxib3ggY29tbWFuZCBGQUlMRUQ9MHgleCwgc3ViY29kZT0leC5cbiIsCisJCSAgICAobWNwLT5tYlsxXSA8PCAxNikgfCBtY3AtPm1iWzBdLAorCQkgICAgKG1jcC0+bWJbM10gPDwgMTYpIHwgbWNwLT5tYlsyXSk7CisJfSBlbHNlIHsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTIxLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKKwkJaGEtPm1kX3RlbXBsYXRlX3NpemUgPSAoKG1jcC0+bWJbM10gPDwgMTYpIHwgbWNwLT5tYlsyXSk7CisJCWlmICghaGEtPm1kX3RlbXBsYXRlX3NpemUpIHsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEyMiwKKwkJCSAgICAiTnVsbCB0ZW1wbGF0ZSBzaXplIG9idGFpbmVkLlxuIik7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfQorCX0KKwlyZXR1cm4gcnZhbDsKK30KKworaW50CitxbGE4Mnh4X21kX2dldF90ZW1wbGF0ZShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisJaW50IHJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTIzLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKworCWhhLT5tZF90bXBsdF9oZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJICAgaGEtPm1kX3RlbXBsYXRlX3NpemUsICZoYS0+bWRfdG1wbHRfaGRyX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoYS0+bWRfdG1wbHRfaGRyKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDExMjQsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgTWluaWR1bXAgdGVtcGxhdGUuXG4iKTsKKwkJcmV0dXJuIHJ2YWw7CisJfQorCisJbWVtc2V0KG1jcC0+bWIsIDAgLCBzaXplb2YobWNwLT5tYikpOworCW1jcC0+bWJbMF0gPSBMU1coTUJDX0RJQUdOT1NUSUNfTUlOSURVTVBfVEVNUExBVEUpOworCW1jcC0+bWJbMV0gPSBNU1coTUJDX0RJQUdOT1NUSUNfTUlOSURVTVBfVEVNUExBVEUpOworCW1jcC0+bWJbMl0gPSBMU1coUlFTVF9UTVBMVCk7CisJbWNwLT5tYlszXSA9IE1TVyhSUVNUX1RNUExUKTsKKwltY3AtPm1iWzRdID0gTFNXKExTRChoYS0+bWRfdG1wbHRfaGRyX2RtYSkpOworCW1jcC0+bWJbNV0gPSBNU1coTFNEKGhhLT5tZF90bXBsdF9oZHJfZG1hKSk7CisJbWNwLT5tYls2XSA9IExTVyhNU0QoaGEtPm1kX3RtcGx0X2hkcl9kbWEpKTsKKwltY3AtPm1iWzddID0gTVNXKE1TRChoYS0+bWRfdG1wbHRfaGRyX2RtYSkpOworCW1jcC0+bWJbOF0gPSBMU1coaGEtPm1kX3RlbXBsYXRlX3NpemUpOworCW1jcC0+bWJbOV0gPSBNU1coaGEtPm1kX3RlbXBsYXRlX3NpemUpOworCisJbWNwLT5mbGFncyA9IE1CWF9ETUFfT1VUfE1CWF9ETUFfSU58SU9DVExfQ01EOworCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOworCW1jcC0+b3V0X21iID0gTUJYXzExfE1CWF8xMHxNQlhfOXxNQlhfOHwKKwkgICAgTUJYXzd8TUJYXzZ8TUJYXzV8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMjUsCisJCSAgICAibWFpbGJveCBjb21tYW5kIEZBSUxFRD0weCV4LCBzdWJjb2RlPSV4LlxuIiwKKwkJICAgICgobWNwLT5tYlsxXSA8PCAxNikgfCBtY3AtPm1iWzBdKSwKKwkJICAgICgobWNwLT5tYlszXSA8PCAxNikgfCBtY3AtPm1iWzJdKSk7CisJfSBlbHNlCisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEyNiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJ2YWw7Cit9CisKK2ludAorcWxhODJ4eF9tYnhfYmVhY29uX2N0bChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50IGVuYWJsZSkKK3sKKwlpbnQgcnZhbDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlpZiAoIUlTX1FMQTgyWFgoaGEpKQorCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEyNywKKwkJIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKKwltZW1zZXQobWNwLCAwLCBzaXplb2YobWJ4X2NtZF90KSk7CisJbWNwLT5tYlswXSA9IE1CQ19TRVRfTEVEX0NPTkZJRzsKKwlpZiAoZW5hYmxlKQorCQltY3AtPm1iWzddID0gMHhFOworCWVsc2UKKwkJbWNwLT5tYls3XSA9IDB4RDsKKworCW1jcC0+b3V0X21iID0gTUJYXzd8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEyOCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKKwl9IGVsc2UgeworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMjksCisJCSAgICAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKaW5kZXggMDQ5ODA3Yy4uOTRiZGVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKQEAgLTcsNiArNyw4IEBACiAjaW5jbHVkZSAicWxhX2RlZi5oIgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KIAogI2RlZmluZSBNQVNLKG4pCQkJKCgxVUxMPDwobikpLTEpCkBAIC0zMjgsNyArMzMwLDcgQEAKIH07CiAKIC8qIERldmljZSBzdGF0ZXMgKi8KLWNoYXIgKnFkZXZfc3RhdGVbXSA9IHsKK2NoYXIgKnFfZGV2X3N0YXRlW10gPSB7CiAJICJVbmtub3duIiwKIAkiQ29sZCIsCiAJIkluaXRpYWxpemluZyIsCkBAIC0zMzksNiArMzQxLDExIEBACiAJIlF1aWVzY2VudCIsCiB9OwogCitjaGFyICpxZGV2X3N0YXRlKHVpbnQzMl90IGRldl9zdGF0ZSkKK3sKKwlyZXR1cm4gcV9kZXZfc3RhdGVbZGV2X3N0YXRlXTsKK30KKwogLyoKICAqIEluOiAnb2ZmJyBpcyBvZmZzZXQgZnJvbSBDUkIgc3BhY2UgaW4gMTI4TSBwY2kgbWFwCiAgKiBPdXQ6ICdvZmYnIGlzIDJNIHBjaSBtYXAgYWRkcgpAQCAtMjM1NSw5ICsyMzYyLDEzIEBACiAJdWludDMyX3QgZHJ2X3N0YXRlOwogCWludCBydmFsOwogCi0JZHJ2X3N0YXRlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX1NUQVRFKTsKLQlydmFsID0gZHJ2X3N0YXRlICYgKFFMQTgyWFhfRFJWU1RfUlNUX1JEWSA8PCAoaGEtPnBvcnRudW0gKiA0KSk7Ci0JcmV0dXJuIHJ2YWw7CisJaWYgKGhhLT5mbGFncy5pc3A4Mnh4X3Jlc2V0X293bmVyKQorCQlyZXR1cm4gMTsKKwllbHNlIHsKKwkJZHJ2X3N0YXRlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX1NUQVRFKTsKKwkJcnZhbCA9IGRydl9zdGF0ZSAmIChRTEE4MlhYX0RSVlNUX1JTVF9SRFkgPDwgKGhhLT5wb3J0bnVtICogNCkpOworCQlyZXR1cm4gcnZhbDsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMjM3NCw4ICsyMzg1LDggQEAKIAkJZHJ2X3N0YXRlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX1NUQVRFKTsKIAl9CiAJZHJ2X3N0YXRlIHw9IChRTEE4MlhYX0RSVlNUX1JTVF9SRFkgPDwgKGhhLT5wb3J0bnVtICogNCkpOwotCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYmIsCi0JICAgICJkcnZfc3RhdGUgPSAweCV4LlxuIiwgZHJ2X3N0YXRlKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGJiLAorCSAgICAiZHJ2X3N0YXRlID0gMHglMDh4LlxuIiwgZHJ2X3N0YXRlKTsKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfU1RBVEUsIGRydl9zdGF0ZSk7CiB9CiAKQEAgLTI1OTgsNyArMjYwOSw3IEBACiAJCQlkc2Rfc2VnID0gKHVpbnQzMl90ICopJmNtZF9wa3QtPmZjcF9kYXRhX2RzZWdfYWRkcmVzczsKIAkJCSpkc2Rfc2VnKysgPSBjcHVfdG9fbGUzMihMU0QoZHNkX3B0ci0+ZHNkX2xpc3RfZG1hKSk7CiAJCQkqZHNkX3NlZysrID0gY3B1X3RvX2xlMzIoTVNEKGRzZF9wdHItPmRzZF9saXN0X2RtYSkpOwotCQkJKmRzZF9zZWcrKyA9IGNwdV90b19sZTMyKGRzZF9saXN0X2xlbik7CisJCQljbWRfcGt0LT5mY3BfZGF0YV9kc2VnX2xlbiA9IGNwdV90b19sZTMyKGRzZF9saXN0X2xlbik7CiAJCX0gZWxzZSB7CiAJCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIoTFNEKGRzZF9wdHItPmRzZF9saXN0X2RtYSkpOwogCQkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKE1TRChkc2RfcHRyLT5kc2RfbGlzdF9kbWEpKTsKQEAgLTM1MjksNiArMzU0MCw3IEBACiBxbGE4Mnh4X25lZWRfcmVzZXRfaGFuZGxlcihzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAl1aW50MzJfdCBkZXZfc3RhdGUsIGRydl9zdGF0ZSwgZHJ2X2FjdGl2ZTsKKwl1aW50MzJfdCBhY3RpdmVfbWFzayA9IDA7CiAJdW5zaWduZWQgbG9uZyByZXNldF90aW1lb3V0OwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOwpAQCAtMzU0MSwxNSArMzU1MywzMiBAQAogCQlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKIAl9CiAKLQlxbGE4Mnh4X3NldF9yc3RfcmVhZHkoaGEpOworCWRydl9hY3RpdmUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfQUNUSVZFKTsKKwlpZiAoIWhhLT5mbGFncy5pc3A4Mnh4X3Jlc2V0X293bmVyKSB7CisJCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAyOCwKKwkJICAgICJyZXNldF9hY2tub3dsZWRnZWQgYnkgMHgleFxuIiwgaGEtPnBvcnRudW0pOworCQlxbGE4Mnh4X3NldF9yc3RfcmVhZHkoaGEpOworCX0gZWxzZSB7CisJCWFjdGl2ZV9tYXNrID0gfihRTEE4MlhYX0RSVl9BQ1RJVkUgPDwgKGhhLT5wb3J0bnVtICogNCkpOworCQlkcnZfYWN0aXZlICY9IGFjdGl2ZV9tYXNrOworCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMjksCisJCSAgICAiYWN0aXZlX21hc2s6IDB4JTA4eFxuIiwgYWN0aXZlX21hc2spOworCX0KIAogCS8qIHdhaXQgZm9yIDEwIHNlY29uZHMgZm9yIHJlc2V0IGFjayBmcm9tIGFsbCBmdW5jdGlvbnMgKi8KIAlyZXNldF90aW1lb3V0ID0gamlmZmllcyArIChoYS0+bnhfcmVzZXRfdGltZW91dCAqIEhaKTsKIAogCWRydl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9TVEFURSk7CiAJZHJ2X2FjdGl2ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9BQ1RJVkUpOworCWRldl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSk7CiAKLQl3aGlsZSAoZHJ2X3N0YXRlICE9IGRydl9hY3RpdmUpIHsKKwlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMmEsCisJICAgICJkcnZfc3RhdGU6IDB4JTA4eCwgZHJ2X2FjdGl2ZTogMHglMDh4LCAiCisJICAgICJkZXZfc3RhdGU6IDB4JTA4eCwgYWN0aXZlX21hc2s6IDB4JTA4eFxuIiwKKwkgICAgZHJ2X3N0YXRlLCBkcnZfYWN0aXZlLCBkZXZfc3RhdGUsIGFjdGl2ZV9tYXNrKTsKKworCXdoaWxlIChkcnZfc3RhdGUgIT0gZHJ2X2FjdGl2ZSAmJgorCSAgICBkZXZfc3RhdGUgIT0gUUxBODJYWF9ERVZfSU5JVElBTElaSU5HKSB7CiAJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJlc2V0X3RpbWVvdXQpKSB7CiAJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGI1LAogCQkJICAgICJSZXNldCB0aW1lb3V0LlxuIik7CkBAIC0zNTYwLDIzICszNTg5LDg3IEBACiAJCXFsYTgyeHhfaWRjX2xvY2soaGEpOwogCQlkcnZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfU1RBVEUpOwogCQlkcnZfYWN0aXZlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX0FDVElWRSk7CisJCWlmIChoYS0+ZmxhZ3MuaXNwODJ4eF9yZXNldF9vd25lcikKKwkJCWRydl9hY3RpdmUgJj0gYWN0aXZlX21hc2s7CisJCWRldl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSk7CiAJfQogCi0JZGV2X3N0YXRlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFKTsKKwlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMmIsCisJICAgICJkcnZfc3RhdGU6IDB4JTA4eCwgZHJ2X2FjdGl2ZTogMHglMDh4LCAiCisJICAgICJkZXZfc3RhdGU6IDB4JTA4eCwgYWN0aXZlX21hc2s6IDB4JTA4eFxuIiwKKwkgICAgZHJ2X3N0YXRlLCBkcnZfYWN0aXZlLCBkZXZfc3RhdGUsIGFjdGl2ZV9tYXNrKTsKKwogCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYjYsCiAJICAgICJEZXZpY2Ugc3RhdGUgaXMgMHgleCA9ICVzLlxuIiwKIAkgICAgZGV2X3N0YXRlLAotCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDogIlVua25vd24iKTsKKwkgICAgZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/IHFkZXZfc3RhdGUoZGV2X3N0YXRlKSA6ICJVbmtub3duIik7CiAKIAkvKiBGb3JjZSB0byBERVZfQ09MRCB1bmxlc3Mgc29tZW9uZSBlbHNlIGlzIHN0YXJ0aW5nIGEgcmVzZXQgKi8KLQlpZiAoZGV2X3N0YXRlICE9IFFMQTgyWFhfREVWX0lOSVRJQUxJWklORykgeworCWlmIChkZXZfc3RhdGUgIT0gUUxBODJYWF9ERVZfSU5JVElBTElaSU5HICYmCisJICAgIGRldl9zdGF0ZSAhPSBRTEE4MlhYX0RFVl9DT0xEKSB7CiAJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYjcsCiAJCSAgICAiSFcgU3RhdGU6IENPTEQvUkUtSU5JVC5cbiIpOwogCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsIFFMQTgyWFhfREVWX0NPTEQpOworCQlpZiAocWwyeG1kZW5hYmxlKSB7CisJCQlpZiAocWxhODJ4eF9tZF9jb2xsZWN0KHZoYSkpCisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAyYywKKwkJCQkgICAgIk5vdCBhYmxlIHRvIGNvbGxlY3QgbWluaWR1bXAuXG4iKTsKKwkJfSBlbHNlCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDRmLAorCQkJICAgICJNaW5pZHVtcCBkaXNhYmxlZC5cbiIpOwogCX0KIH0KIAogaW50CitxbGE4Mnh4X2NoZWNrX21kX25lZWRlZChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50MTZfdCBmd19tYWpvcl92ZXJzaW9uLCBmd19taW5vcl92ZXJzaW9uLCBmd19zdWJtaW5vcl92ZXJzaW9uOworCWludCBydmFsID0gUUxBX1NVQ0NFU1M7CisKKwlmd19tYWpvcl92ZXJzaW9uID0gaGEtPmZ3X21ham9yX3ZlcnNpb247CisJZndfbWlub3JfdmVyc2lvbiA9IGhhLT5md19taW5vcl92ZXJzaW9uOworCWZ3X3N1Ym1pbm9yX3ZlcnNpb24gPSBoYS0+Zndfc3VibWlub3JfdmVyc2lvbjsKKworCXJ2YWwgPSBxbGEyeDAwX2dldF9md192ZXJzaW9uKHZoYSwgJmhhLT5md19tYWpvcl92ZXJzaW9uLAorCSAgICAmaGEtPmZ3X21pbm9yX3ZlcnNpb24sICZoYS0+Zndfc3VibWlub3JfdmVyc2lvbiwKKwkgICAgJmhhLT5md19hdHRyaWJ1dGVzLCAmaGEtPmZ3X21lbW9yeV9zaXplLAorCSAgICBoYS0+bXBpX3ZlcnNpb24sICZoYS0+bXBpX2NhcGFiaWxpdGllcywKKwkgICAgaGEtPnBoeV92ZXJzaW9uKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQlyZXR1cm4gcnZhbDsKKworCWlmIChxbDJ4bWRlbmFibGUpIHsKKwkJaWYgKCFoYS0+ZndfZHVtcGVkKSB7CisJCQlpZiAoZndfbWFqb3JfdmVyc2lvbiAhPSBoYS0+ZndfbWFqb3JfdmVyc2lvbiB8fAorCQkJICAgIGZ3X21pbm9yX3ZlcnNpb24gIT0gaGEtPmZ3X21pbm9yX3ZlcnNpb24gfHwKKwkJCSAgICBmd19zdWJtaW5vcl92ZXJzaW9uICE9IGhhLT5md19zdWJtaW5vcl92ZXJzaW9uKSB7CisKKwkJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDJkLAorCQkJCSAgICAiRmlybXdhcmUgdmVyc2lvbiBkaWZmZXJzICIKKwkJCQkgICAgIlByZXZpb3VzIHZlcnNpb246ICVkOiVkOiVkIC0gIgorCQkJCSAgICAiTmV3IHZlcnNpb246ICVkOiVkOiVkXG4iLAorCQkJCSAgICBoYS0+ZndfbWFqb3JfdmVyc2lvbiwKKwkJCQkgICAgaGEtPmZ3X21pbm9yX3ZlcnNpb24sCisJCQkJICAgIGhhLT5md19zdWJtaW5vcl92ZXJzaW9uLAorCQkJCSAgICBmd19tYWpvcl92ZXJzaW9uLCBmd19taW5vcl92ZXJzaW9uLAorCQkJCSAgICBmd19zdWJtaW5vcl92ZXJzaW9uKTsKKwkJCQkvKiBSZWxlYXNlIE1pbmlEdW1wIHJlc291cmNlcyAqLworCQkJCXFsYTgyeHhfbWRfZnJlZSh2aGEpOworCQkJCS8qIEFMbG9jYXRlIE1pbmlEdW1wIHJlc291cmNlcyAqLworCQkJCXFsYTgyeHhfbWRfcHJlcCh2aGEpOworCQkJfSBlbHNlCisJCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjAyZSwKKwkJCQkgICAgIkZpcm13YXJlIGR1bXAgYXZhaWxhYmxlIHRvIHJldHJpZXZlXG4iLAorCQkJCSAgICB2aGEtPmhvc3Rfbm8pOworCQl9CisJfQorCXJldHVybiBydmFsOworfQorCisKK2ludAogcWxhODJ4eF9jaGVja19md19hbGl2ZShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAl1aW50MzJfdCBmd19oZWFydGJlYXRfY291bnRlcjsKQEAgLTM2MzcsNyArMzczMCw3IEBACiAJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA5YiwKIAkgICAgIkRldmljZSBzdGF0ZSBpcyAweCV4ID0gJXMuXG4iLAogCSAgICBkZXZfc3RhdGUsCi0JICAgIGRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPyBxZGV2X3N0YXRlW2Rldl9zdGF0ZV0gOiAiVW5rbm93biIpOworCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZShkZXZfc3RhdGUpIDogIlVua25vd24iKTsKIAogCS8qIHdhaXQgZm9yIDMwIHNlY29uZHMgZm9yIGRldmljZSB0byBnbyByZWFkeSAqLwogCWRldl9pbml0X3RpbWVvdXQgPSBqaWZmaWVzICsgKGhhLT5ueF9kZXZfaW5pdF90aW1lb3V0ICogSFopOwpAQCAtMzY1OSwyNiArMzc1MiwzMyBAQAogCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA5ZCwKIAkJCSAgICAiRGV2aWNlIHN0YXRlIGlzIDB4JXggPSAlcy5cbiIsCiAJCQkgICAgZGV2X3N0YXRlLAotCQkJICAgIGRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPyBxZGV2X3N0YXRlW2Rldl9zdGF0ZV0gOgorCQkJICAgIGRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPyBxZGV2X3N0YXRlKGRldl9zdGF0ZSkgOgogCQkJICAgICJVbmtub3duIik7CiAJCX0KIAogCQlzd2l0Y2ggKGRldl9zdGF0ZSkgewogCQljYXNlIFFMQTgyWFhfREVWX1JFQURZOgorCQkJcWxhODJ4eF9jaGVja19tZF9uZWVkZWQodmhhKTsKKwkJCWhhLT5mbGFncy5pc3A4Mnh4X3Jlc2V0X293bmVyID0gMDsKIAkJCWdvdG8gZXhpdDsKIAkJY2FzZSBRTEE4MlhYX0RFVl9DT0xEOgogCQkJcnZhbCA9IHFsYTgyeHhfZGV2aWNlX2Jvb3RzdHJhcCh2aGEpOwotCQkJZ290byBleGl0OworCQkJYnJlYWs7CiAJCWNhc2UgUUxBODJYWF9ERVZfSU5JVElBTElaSU5HOgogCQkJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKIAkJCW1zbGVlcCgxMDAwKTsKIAkJCXFsYTgyeHhfaWRjX2xvY2soaGEpOwogCQkJYnJlYWs7CiAJCWNhc2UgUUxBODJYWF9ERVZfTkVFRF9SRVNFVDoKLQkJICAgIGlmICghcWwyeGRvbnRyZXNldGhiYSkKLQkJCXFsYTgyeHhfbmVlZF9yZXNldF9oYW5kbGVyKHZoYSk7CisJCQlpZiAoIXFsMnhkb250cmVzZXRoYmEpCisJCQkJcWxhODJ4eF9uZWVkX3Jlc2V0X2hhbmRsZXIodmhhKTsKKwkJCWVsc2UgeworCQkJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CisJCQkJbXNsZWVwKDEwMDApOworCQkJCXFsYTgyeHhfaWRjX2xvY2soaGEpOworCQkJfQogCQkJZGV2X2luaXRfdGltZW91dCA9IGppZmZpZXMgKwotCQkJCShoYS0+bnhfZGV2X2luaXRfdGltZW91dCAqIEhaKTsKKwkJCSAgICAoaGEtPm54X2Rldl9pbml0X3RpbWVvdXQgKiBIWik7CiAJCQlicmVhazsKIAkJY2FzZSBRTEE4MlhYX0RFVl9ORUVEX1FVSUVTQ0VOVDoKIAkJCXFsYTgyeHhfbmVlZF9xc250X2hhbmRsZXIodmhhKTsKQEAgLTM3OTEsNiArMzg5MSwyOCBAQAogCXJldHVybiBydmFsOwogfQogCit2b2lkCitxbGE4Mnh4X3NldF9yZXNldF9vd25lcihzY3NpX3FsYV9ob3N0X3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50MzJfdCBkZXZfc3RhdGU7CisKKwlkZXZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOworCWlmIChkZXZfc3RhdGUgPT0gUUxBODJYWF9ERVZfUkVBRFkpIHsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjAyZiwKKwkJICAgICJIVyBTdGF0ZTogTkVFRCBSRVNFVFxuIik7CisJCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwKKwkJCVFMQTgyWFhfREVWX05FRURfUkVTRVQpOworCQloYS0+ZmxhZ3MuaXNwODJ4eF9yZXNldF9vd25lciA9IDE7CisJCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAzMCwKKwkJICAgICJyZXNldF9vd25lciBpcyAweCV4XG4iLCBoYS0+cG9ydG51bSk7CisJfSBlbHNlCisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwMzEsCisJCSAgICAiRGV2aWNlIHN0YXRlIGlzIDB4JXggPSAlcy5cbiIsCisJCSAgICBkZXZfc3RhdGUsCisJCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZShkZXZfc3RhdGUpIDogIlVua25vd24iKTsKK30KKwogLyoKICAqICBxbGE4Mnh4X2Fib3J0X2lzcAogICogICAgICBSZXNldHMgSVNQIGFuZCBhYm9ydHMgYWxsIG91dHN0YW5kaW5nIGNvbW1hbmRzLgpAQCAtMzgwNiw3ICszOTI4LDYgQEAKIHsKIAlpbnQgcnZhbDsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQl1aW50MzJfdCBkZXZfc3RhdGU7CiAKIAlpZiAodmhhLT5kZXZpY2VfZmxhZ3MgJiBERkxHX0RFVl9GQUlMRUQpIHsKIAkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAyNCwKQEAgLTM4MTYsMTYgKzM5MzcsNyBAQAogCWhhLT5mbGFncy5pc3A4Mnh4X3Jlc2V0X2hkbHJfYWN0aXZlID0gMTsKIAogCXFsYTgyeHhfaWRjX2xvY2soaGEpOwotCWRldl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSk7Ci0JaWYgKGRldl9zdGF0ZSA9PSBRTEE4MlhYX0RFVl9SRUFEWSkgewotCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDI1LAotCQkgICAgIkhXIFN0YXRlOiBORUVEIFJFU0VULlxuIik7Ci0JCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwKLQkJCVFMQTgyWFhfREVWX05FRURfUkVTRVQpOwotCX0gZWxzZQotCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDI2LAotCQkgICAgIkh3IFN0YXRlOiAlcy5cbiIsIGRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPwotCQkgICAgcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDogIlVua25vd24iKTsKKwlxbGE4Mnh4X3NldF9yZXNldF9vd25lcih2aGEpOwogCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CiAKIAlydmFsID0gcWxhODJ4eF9kZXZpY2Vfc3RhdGVfaGFuZGxlcih2aGEpOwpAQCAtNDAxNiwzICs0MTI4LDgwMyBAQAogCQl9CiAJfQogfQorCisvKiBNaW5pZHVtcCByZWxhdGVkIGZ1bmN0aW9ucyAqLworaW50CitxbGE4Mnh4X21kX3J3XzMyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IG9mZiwgdTMyIGRhdGEsIHVpbnQ4X3QgZmxhZykKK3sKKwl1aW50MzJfdCAgb2ZmX3ZhbHVlLCBydmFsID0gMDsKKworCVdSVF9SRUdfRFdPUkQoKHZvaWQgKikoQ1JCX1dJTkRPV18yTSArIGhhLT5ueF9wY2liYXNlKSwKKwkgICAgKG9mZiAmIDB4RkZGRjAwMDApKTsKKworCS8qIFJlYWQgYmFjayB2YWx1ZSB0byBtYWtlIHN1cmUgd3JpdGUgaGFzIGdvbmUgdGhyb3VnaCAqLworCVJEX1JFR19EV09SRCgodm9pZCAqKShDUkJfV0lORE9XXzJNICsgaGEtPm54X3BjaWJhc2UpKTsKKwlvZmZfdmFsdWUgID0gKG9mZiAmIDB4MDAwMEZGRkYpOworCisJaWYgKGZsYWcpCisJCVdSVF9SRUdfRFdPUkQoKHZvaWQgKikKKwkJICAgIChvZmZfdmFsdWUgKyBDUkJfSU5ESVJFQ1RfMk0gKyBoYS0+bnhfcGNpYmFzZSksCisJCSAgICBkYXRhKTsKKwllbHNlCisJCXJ2YWwgPSBSRF9SRUdfRFdPUkQoKHZvaWQgKikKKwkJICAgIChvZmZfdmFsdWUgKyBDUkJfSU5ESVJFQ1RfMk0gKyBoYS0+bnhfcGNpYmFzZSkpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19jb250cm9sKHNjc2lfcWxhX2hvc3RfdCAqdmhhLAorCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKmVudHJ5X2hkciwgdWludDMyX3QgKipkX3B0cikKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9jcmIgKmNyYl9lbnRyeTsKKwl1aW50MzJfdCByZWFkX3ZhbHVlLCBvcGNvZGUsIHBvbGxfdGltZTsKKwl1aW50MzJfdCBhZGRyLCBpbmRleCwgY3JiX2FkZHI7CisJdW5zaWduZWQgbG9uZyB3dGltZTsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF90ZW1wbGF0ZV9oZHIgKnRtcGx0X2hkcjsKKwl1aW50MzJfdCBydmFsID0gUUxBX1NVQ0NFU1M7CisJaW50IGk7CisKKwl0bXBsdF9oZHIgPSAoc3RydWN0IHFsYTgyeHhfbWRfdGVtcGxhdGVfaGRyICopaGEtPm1kX3RtcGx0X2hkcjsKKwljcmJfZW50cnkgPSAoc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfY3JiICopZW50cnlfaGRyOworCWNyYl9hZGRyID0gY3JiX2VudHJ5LT5hZGRyOworCisJZm9yIChpID0gMDsgaSA8IGNyYl9lbnRyeS0+b3BfY291bnQ7IGkrKykgeworCQlvcGNvZGUgPSBjcmJfZW50cnktPmNyYl9jdHJsLm9wY29kZTsKKwkJaWYgKG9wY29kZSAmIFFMQTgyWFhfREJHX09QQ09ERV9XUikgeworCQkJcWxhODJ4eF9tZF9yd18zMihoYSwgY3JiX2FkZHIsCisJCQkgICAgY3JiX2VudHJ5LT52YWx1ZV8xLCAxKTsKKwkJCW9wY29kZSAmPSB+UUxBODJYWF9EQkdfT1BDT0RFX1dSOworCQl9CisKKwkJaWYgKG9wY29kZSAmIFFMQTgyWFhfREJHX09QQ09ERV9SVykgeworCQkJcmVhZF92YWx1ZSA9IHFsYTgyeHhfbWRfcndfMzIoaGEsIGNyYl9hZGRyLCAwLCAwKTsKKwkJCXFsYTgyeHhfbWRfcndfMzIoaGEsIGNyYl9hZGRyLCByZWFkX3ZhbHVlLCAxKTsKKwkJCW9wY29kZSAmPSB+UUxBODJYWF9EQkdfT1BDT0RFX1JXOworCQl9CisKKwkJaWYgKG9wY29kZSAmIFFMQTgyWFhfREJHX09QQ09ERV9BTkQpIHsKKwkJCXJlYWRfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLCBjcmJfYWRkciwgMCwgMCk7CisJCQlyZWFkX3ZhbHVlICY9IGNyYl9lbnRyeS0+dmFsdWVfMjsKKwkJCW9wY29kZSAmPSB+UUxBODJYWF9EQkdfT1BDT0RFX0FORDsKKwkJCWlmIChvcGNvZGUgJiBRTEE4MlhYX0RCR19PUENPREVfT1IpIHsKKwkJCQlyZWFkX3ZhbHVlIHw9IGNyYl9lbnRyeS0+dmFsdWVfMzsKKwkJCQlvcGNvZGUgJj0gflFMQTgyWFhfREJHX09QQ09ERV9PUjsKKwkJCX0KKwkJCXFsYTgyeHhfbWRfcndfMzIoaGEsIGNyYl9hZGRyLCByZWFkX3ZhbHVlLCAxKTsKKwkJfQorCisJCWlmIChvcGNvZGUgJiBRTEE4MlhYX0RCR19PUENPREVfT1IpIHsKKwkJCXJlYWRfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLCBjcmJfYWRkciwgMCwgMCk7CisJCQlyZWFkX3ZhbHVlIHw9IGNyYl9lbnRyeS0+dmFsdWVfMzsKKwkJCXFsYTgyeHhfbWRfcndfMzIoaGEsIGNyYl9hZGRyLCByZWFkX3ZhbHVlLCAxKTsKKwkJCW9wY29kZSAmPSB+UUxBODJYWF9EQkdfT1BDT0RFX09SOworCQl9CisKKwkJaWYgKG9wY29kZSAmIFFMQTgyWFhfREJHX09QQ09ERV9QT0xMKSB7CisJCQlwb2xsX3RpbWUgPSBjcmJfZW50cnktPmNyYl9zdHJkLnBvbGxfdGltZW91dDsKKwkJCXd0aW1lID0gamlmZmllcyArIHBvbGxfdGltZTsKKwkJCXJlYWRfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLCBjcmJfYWRkciwgMCwgMCk7CisKKwkJCWRvIHsKKwkJCQlpZiAoKHJlYWRfdmFsdWUgJiBjcmJfZW50cnktPnZhbHVlXzIpCisJCQkJICAgID09IGNyYl9lbnRyeS0+dmFsdWVfMSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZSBpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB3dGltZSkpIHsKKwkJCQkJLyogY2FwdHVyaW5nIGR1bXAgZmFpbGVkICovCisJCQkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UKKwkJCQkJcmVhZF92YWx1ZSA9IHFsYTgyeHhfbWRfcndfMzIoaGEsCisJCQkJCSAgICBjcmJfYWRkciwgMCwgMCk7CisJCQl9IHdoaWxlICgxKTsKKwkJCW9wY29kZSAmPSB+UUxBODJYWF9EQkdfT1BDT0RFX1BPTEw7CisJCX0KKworCQlpZiAob3Bjb2RlICYgUUxBODJYWF9EQkdfT1BDT0RFX1JEU1RBVEUpIHsKKwkJCWlmIChjcmJfZW50cnktPmNyYl9zdHJkLnN0YXRlX2luZGV4X2EpIHsKKwkJCQlpbmRleCA9IGNyYl9lbnRyeS0+Y3JiX3N0cmQuc3RhdGVfaW5kZXhfYTsKKwkJCQlhZGRyID0gdG1wbHRfaGRyLT5zYXZlZF9zdGF0ZV9hcnJheVtpbmRleF07CisJCQl9IGVsc2UKKwkJCQlhZGRyID0gY3JiX2FkZHI7CisKKwkJCXJlYWRfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLCBhZGRyLCAwLCAwKTsKKwkJCWluZGV4ID0gY3JiX2VudHJ5LT5jcmJfY3RybC5zdGF0ZV9pbmRleF92OworCQkJdG1wbHRfaGRyLT5zYXZlZF9zdGF0ZV9hcnJheVtpbmRleF0gPSByZWFkX3ZhbHVlOworCQkJb3Bjb2RlICY9IH5RTEE4MlhYX0RCR19PUENPREVfUkRTVEFURTsKKwkJfQorCisJCWlmIChvcGNvZGUgJiBRTEE4MlhYX0RCR19PUENPREVfV1JTVEFURSkgeworCQkJaWYgKGNyYl9lbnRyeS0+Y3JiX3N0cmQuc3RhdGVfaW5kZXhfYSkgeworCQkJCWluZGV4ID0gY3JiX2VudHJ5LT5jcmJfc3RyZC5zdGF0ZV9pbmRleF9hOworCQkJCWFkZHIgPSB0bXBsdF9oZHItPnNhdmVkX3N0YXRlX2FycmF5W2luZGV4XTsKKwkJCX0gZWxzZQorCQkJCWFkZHIgPSBjcmJfYWRkcjsKKworCQkJaWYgKGNyYl9lbnRyeS0+Y3JiX2N0cmwuc3RhdGVfaW5kZXhfdikgeworCQkJCWluZGV4ID0gY3JiX2VudHJ5LT5jcmJfY3RybC5zdGF0ZV9pbmRleF92OworCQkJCXJlYWRfdmFsdWUgPQorCQkJCSAgICB0bXBsdF9oZHItPnNhdmVkX3N0YXRlX2FycmF5W2luZGV4XTsKKwkJCX0gZWxzZQorCQkJCXJlYWRfdmFsdWUgPSBjcmJfZW50cnktPnZhbHVlXzE7CisKKwkJCXFsYTgyeHhfbWRfcndfMzIoaGEsIGFkZHIsIHJlYWRfdmFsdWUsIDEpOworCQkJb3Bjb2RlICY9IH5RTEE4MlhYX0RCR19PUENPREVfV1JTVEFURTsKKwkJfQorCisJCWlmIChvcGNvZGUgJiBRTEE4MlhYX0RCR19PUENPREVfTURTVEFURSkgeworCQkJaW5kZXggPSBjcmJfZW50cnktPmNyYl9jdHJsLnN0YXRlX2luZGV4X3Y7CisJCQlyZWFkX3ZhbHVlID0gdG1wbHRfaGRyLT5zYXZlZF9zdGF0ZV9hcnJheVtpbmRleF07CisJCQlyZWFkX3ZhbHVlIDw8PSBjcmJfZW50cnktPmNyYl9jdHJsLnNobDsKKwkJCXJlYWRfdmFsdWUgPj49IGNyYl9lbnRyeS0+Y3JiX2N0cmwuc2hyOworCQkJaWYgKGNyYl9lbnRyeS0+dmFsdWVfMikKKwkJCQlyZWFkX3ZhbHVlICY9IGNyYl9lbnRyeS0+dmFsdWVfMjsKKwkJCXJlYWRfdmFsdWUgfD0gY3JiX2VudHJ5LT52YWx1ZV8zOworCQkJcmVhZF92YWx1ZSArPSBjcmJfZW50cnktPnZhbHVlXzE7CisJCQl0bXBsdF9oZHItPnNhdmVkX3N0YXRlX2FycmF5W2luZGV4XSA9IHJlYWRfdmFsdWU7CisJCQlvcGNvZGUgJj0gflFMQTgyWFhfREJHX09QQ09ERV9NRFNUQVRFOworCQl9CisJCWNyYl9hZGRyICs9IGNyYl9lbnRyeS0+Y3JiX3N0cmQuYWRkcl9zdHJpZGU7CisJfQorCXJldHVybiBydmFsOworfQorCitzdGF0aWMgdm9pZAorcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX3Jkb2NtKHNjc2lfcWxhX2hvc3RfdCAqdmhhLAorCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKmVudHJ5X2hkciwgdWludDMyX3QgKipkX3B0cikKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50MzJfdCByX2FkZHIsIHJfc3RyaWRlLCBsb29wX2NudCwgaSwgcl92YWx1ZTsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9yZG9jbSAqb2NtX2hkcjsKKwl1aW50MzJfdCAqZGF0YV9wdHIgPSAqZF9wdHI7CisKKwlvY21faGRyID0gKHN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X3Jkb2NtICopZW50cnlfaGRyOworCXJfYWRkciA9IG9jbV9oZHItPnJlYWRfYWRkcjsKKwlyX3N0cmlkZSA9IG9jbV9oZHItPnJlYWRfYWRkcl9zdHJpZGU7CisJbG9vcF9jbnQgPSBvY21faGRyLT5vcF9jb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCBsb29wX2NudDsgaSsrKSB7CisJCXJfdmFsdWUgPSBSRF9SRUdfRFdPUkQoKHZvaWQgKikocl9hZGRyICsgaGEtPm54X3BjaWJhc2UpKTsKKwkJKmRhdGFfcHRyKysgPSBjcHVfdG9fbGUzMihyX3ZhbHVlKTsKKwkJcl9hZGRyICs9IHJfc3RyaWRlOworCX0KKwkqZF9wdHIgPSBkYXRhX3B0cjsKK30KKworc3RhdGljIHZvaWQKK3FsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19yZG11eChzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90ICplbnRyeV9oZHIsIHVpbnQzMl90ICoqZF9wdHIpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDMyX3Qgcl9hZGRyLCBzX3N0cmlkZSwgc19hZGRyLCBzX3ZhbHVlLCBsb29wX2NudCwgaSwgcl92YWx1ZTsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9tdXggKm11eF9oZHI7CisJdWludDMyX3QgKmRhdGFfcHRyID0gKmRfcHRyOworCisJbXV4X2hkciA9IChzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9tdXggKillbnRyeV9oZHI7CisJcl9hZGRyID0gbXV4X2hkci0+cmVhZF9hZGRyOworCXNfYWRkciA9IG11eF9oZHItPnNlbGVjdF9hZGRyOworCXNfc3RyaWRlID0gbXV4X2hkci0+c2VsZWN0X3ZhbHVlX3N0cmlkZTsKKwlzX3ZhbHVlID0gbXV4X2hkci0+c2VsZWN0X3ZhbHVlOworCWxvb3BfY250ID0gbXV4X2hkci0+b3BfY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9vcF9jbnQ7IGkrKykgeworCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCBzX2FkZHIsIHNfdmFsdWUsIDEpOworCQlyX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwgcl9hZGRyLCAwLCAwKTsKKwkJKmRhdGFfcHRyKysgPSBjcHVfdG9fbGUzMihzX3ZhbHVlKTsKKwkJKmRhdGFfcHRyKysgPSBjcHVfdG9fbGUzMihyX3ZhbHVlKTsKKwkJc192YWx1ZSArPSBzX3N0cmlkZTsKKwl9CisJKmRfcHRyID0gZGF0YV9wdHI7Cit9CisKK3N0YXRpYyB2b2lkCitxbGE4Mnh4X21pbmlkdW1wX3Byb2Nlc3NfcmRjcmIoc2NzaV9xbGFfaG9zdF90ICp2aGEsCisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCAqZW50cnlfaGRyLCB1aW50MzJfdCAqKmRfcHRyKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXVpbnQzMl90IHJfYWRkciwgcl9zdHJpZGUsIGxvb3BfY250LCBpLCByX3ZhbHVlOworCXN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X2NyYiAqY3JiX2hkcjsKKwl1aW50MzJfdCAqZGF0YV9wdHIgPSAqZF9wdHI7CisKKwljcmJfaGRyID0gKHN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X2NyYiAqKWVudHJ5X2hkcjsKKwlyX2FkZHIgPSBjcmJfaGRyLT5hZGRyOworCXJfc3RyaWRlID0gY3JiX2hkci0+Y3JiX3N0cmQuYWRkcl9zdHJpZGU7CisJbG9vcF9jbnQgPSBjcmJfaGRyLT5vcF9jb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCBsb29wX2NudDsgaSsrKSB7CisJCXJfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLCByX2FkZHIsIDAsIDApOworCQkqZGF0YV9wdHIrKyA9IGNwdV90b19sZTMyKHJfYWRkcik7CisJCSpkYXRhX3B0cisrID0gY3B1X3RvX2xlMzIocl92YWx1ZSk7CisJCXJfYWRkciArPSByX3N0cmlkZTsKKwl9CisJKmRfcHRyID0gZGF0YV9wdHI7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19sMnRhZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90ICplbnRyeV9oZHIsIHVpbnQzMl90ICoqZF9wdHIpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDMyX3QgYWRkciwgcl9hZGRyLCBjX2FkZHIsIHRfcl9hZGRyOworCXVpbnQzMl90IGksIGssIGxvb3BfY291bnQsIHRfdmFsdWUsIHJfY250LCByX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgcF93YWl0LCB3X3RpbWUsIHBfbWFzazsKKwl1aW50MzJfdCBjX3ZhbHVlX3csIGNfdmFsdWVfcjsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9jYWNoZSAqY2FjaGVfaGRyOworCWludCBydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl1aW50MzJfdCAqZGF0YV9wdHIgPSAqZF9wdHI7CisKKwljYWNoZV9oZHIgPSAoc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfY2FjaGUgKillbnRyeV9oZHI7CisJbG9vcF9jb3VudCA9IGNhY2hlX2hkci0+b3BfY291bnQ7CisJcl9hZGRyID0gY2FjaGVfaGRyLT5yZWFkX2FkZHI7CisJY19hZGRyID0gY2FjaGVfaGRyLT5jb250cm9sX2FkZHI7CisJY192YWx1ZV93ID0gY2FjaGVfaGRyLT5jYWNoZV9jdHJsLndyaXRlX3ZhbHVlOworCisJdF9yX2FkZHIgPSBjYWNoZV9oZHItPnRhZ19yZWdfYWRkcjsKKwl0X3ZhbHVlID0gY2FjaGVfaGRyLT5hZGRyX2N0cmwuaW5pdF90YWdfdmFsdWU7CisJcl9jbnQgPSBjYWNoZV9oZHItPnJlYWRfY3RybC5yZWFkX2FkZHJfY250OworCXBfd2FpdCA9IGNhY2hlX2hkci0+Y2FjaGVfY3RybC5wb2xsX3dhaXQ7CisJcF9tYXNrID0gY2FjaGVfaGRyLT5jYWNoZV9jdHJsLnBvbGxfbWFzazsKKworCWZvciAoaSA9IDA7IGkgPCBsb29wX2NvdW50OyBpKyspIHsKKwkJcWxhODJ4eF9tZF9yd18zMihoYSwgdF9yX2FkZHIsIHRfdmFsdWUsIDEpOworCQlpZiAoY192YWx1ZV93KQorCQkJcWxhODJ4eF9tZF9yd18zMihoYSwgY19hZGRyLCBjX3ZhbHVlX3csIDEpOworCisJCWlmIChwX21hc2spIHsKKwkJCXdfdGltZSA9IGppZmZpZXMgKyBwX3dhaXQ7CisJCQlkbyB7CisJCQkJY192YWx1ZV9yID0gcWxhODJ4eF9tZF9yd18zMihoYSwgY19hZGRyLCAwLCAwKTsKKwkJCQlpZiAoKGNfdmFsdWVfciAmIHBfbWFzaykgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZSBpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB3X3RpbWUpKSB7CisJCQkJCS8qIGNhcHR1cmluZyBkdW1wIGZhaWxlZCAqLworCQkJCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMzIsCisJCQkJCSAgICAiY192YWx1ZV9yOiAweCV4LCBwb2xsX21hc2s6IDB4JWx4LCAiCisJCQkJCSAgICAid190aW1lOiAweCVseFxuIiwKKwkJCQkJICAgIGNfdmFsdWVfciwgcF9tYXNrLCB3X3RpbWUpOworCQkJCQlyZXR1cm4gcnZhbDsKKwkJCQl9CisJCQl9IHdoaWxlICgxKTsKKwkJfQorCisJCWFkZHIgPSByX2FkZHI7CisJCWZvciAoayA9IDA7IGsgPCByX2NudDsgaysrKSB7CisJCQlyX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwgYWRkciwgMCwgMCk7CisJCQkqZGF0YV9wdHIrKyA9IGNwdV90b19sZTMyKHJfdmFsdWUpOworCQkJYWRkciArPSBjYWNoZV9oZHItPnJlYWRfY3RybC5yZWFkX2FkZHJfc3RyaWRlOworCQl9CisJCXRfdmFsdWUgKz0gY2FjaGVfaGRyLT5hZGRyX2N0cmwudGFnX3ZhbHVlX3N0cmlkZTsKKwl9CisJKmRfcHRyID0gZGF0YV9wdHI7CisJcmV0dXJuIFFMQV9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZAorcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX2wxY2FjaGUoc2NzaV9xbGFfaG9zdF90ICp2aGEsCisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCAqZW50cnlfaGRyLCB1aW50MzJfdCAqKmRfcHRyKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXVpbnQzMl90IGFkZHIsIHJfYWRkciwgY19hZGRyLCB0X3JfYWRkcjsKKwl1aW50MzJfdCBpLCBrLCBsb29wX2NvdW50LCB0X3ZhbHVlLCByX2NudCwgcl92YWx1ZTsKKwl1aW50MzJfdCBjX3ZhbHVlX3c7CisJc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfY2FjaGUgKmNhY2hlX2hkcjsKKwl1aW50MzJfdCAqZGF0YV9wdHIgPSAqZF9wdHI7CisKKwljYWNoZV9oZHIgPSAoc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfY2FjaGUgKillbnRyeV9oZHI7CisJbG9vcF9jb3VudCA9IGNhY2hlX2hkci0+b3BfY291bnQ7CisJcl9hZGRyID0gY2FjaGVfaGRyLT5yZWFkX2FkZHI7CisJY19hZGRyID0gY2FjaGVfaGRyLT5jb250cm9sX2FkZHI7CisJY192YWx1ZV93ID0gY2FjaGVfaGRyLT5jYWNoZV9jdHJsLndyaXRlX3ZhbHVlOworCisJdF9yX2FkZHIgPSBjYWNoZV9oZHItPnRhZ19yZWdfYWRkcjsKKwl0X3ZhbHVlID0gY2FjaGVfaGRyLT5hZGRyX2N0cmwuaW5pdF90YWdfdmFsdWU7CisJcl9jbnQgPSBjYWNoZV9oZHItPnJlYWRfY3RybC5yZWFkX2FkZHJfY250OworCisJZm9yIChpID0gMDsgaSA8IGxvb3BfY291bnQ7IGkrKykgeworCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCB0X3JfYWRkciwgdF92YWx1ZSwgMSk7CisJCXFsYTgyeHhfbWRfcndfMzIoaGEsIGNfYWRkciwgY192YWx1ZV93LCAxKTsKKwkJYWRkciA9IHJfYWRkcjsKKwkJZm9yIChrID0gMDsgayA8IHJfY250OyBrKyspIHsKKwkJCXJfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLCBhZGRyLCAwLCAwKTsKKwkJCSpkYXRhX3B0cisrID0gY3B1X3RvX2xlMzIocl92YWx1ZSk7CisJCQlhZGRyICs9IGNhY2hlX2hkci0+cmVhZF9jdHJsLnJlYWRfYWRkcl9zdHJpZGU7CisJCX0KKwkJdF92YWx1ZSArPSBjYWNoZV9oZHItPmFkZHJfY3RybC50YWdfdmFsdWVfc3RyaWRlOworCX0KKwkqZF9wdHIgPSBkYXRhX3B0cjsKK30KKworc3RhdGljIHZvaWQKK3FsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19xdWV1ZShzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90ICplbnRyeV9oZHIsIHVpbnQzMl90ICoqZF9wdHIpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDMyX3Qgc19hZGRyLCByX2FkZHI7CisJdWludDMyX3Qgcl9zdHJpZGUsIHJfdmFsdWUsIHJfY250LCBxaWQgPSAwOworCXVpbnQzMl90IGksIGssIGxvb3BfY250OworCXN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X3F1ZXVlICpxX2hkcjsKKwl1aW50MzJfdCAqZGF0YV9wdHIgPSAqZF9wdHI7CisKKwlxX2hkciA9IChzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9xdWV1ZSAqKWVudHJ5X2hkcjsKKwlzX2FkZHIgPSBxX2hkci0+c2VsZWN0X2FkZHI7CisJcl9jbnQgPSBxX2hkci0+cmRfc3RyZC5yZWFkX2FkZHJfY250OworCXJfc3RyaWRlID0gcV9oZHItPnJkX3N0cmQucmVhZF9hZGRyX3N0cmlkZTsKKwlsb29wX2NudCA9IHFfaGRyLT5vcF9jb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCBsb29wX2NudDsgaSsrKSB7CisJCXFsYTgyeHhfbWRfcndfMzIoaGEsIHNfYWRkciwgcWlkLCAxKTsKKwkJcl9hZGRyID0gcV9oZHItPnJlYWRfYWRkcjsKKwkJZm9yIChrID0gMDsgayA8IHJfY250OyBrKyspIHsKKwkJCXJfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLCByX2FkZHIsIDAsIDApOworCQkJKmRhdGFfcHRyKysgPSBjcHVfdG9fbGUzMihyX3ZhbHVlKTsKKwkJCXJfYWRkciArPSByX3N0cmlkZTsKKwkJfQorCQlxaWQgKz0gcV9oZHItPnFfc3RyZC5xdWV1ZV9pZF9zdHJpZGU7CisJfQorCSpkX3B0ciA9IGRhdGFfcHRyOworfQorCitzdGF0aWMgdm9pZAorcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX3Jkcm9tKHNjc2lfcWxhX2hvc3RfdCAqdmhhLAorCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKmVudHJ5X2hkciwgdWludDMyX3QgKipkX3B0cikKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50MzJfdCByX2FkZHIsIHJfdmFsdWU7CisJdWludDMyX3QgaSwgbG9vcF9jbnQ7CisJc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfcmRyb20gKnJvbV9oZHI7CisJdWludDMyX3QgKmRhdGFfcHRyID0gKmRfcHRyOworCisJcm9tX2hkciA9IChzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9yZHJvbSAqKWVudHJ5X2hkcjsKKwlyX2FkZHIgPSByb21faGRyLT5yZWFkX2FkZHI7CisJbG9vcF9jbnQgPSByb21faGRyLT5yZWFkX2RhdGFfc2l6ZS9zaXplb2YodWludDMyX3QpOworCisJZm9yIChpID0gMDsgaSA8IGxvb3BfY250OyBpKyspIHsKKwkJcWxhODJ4eF9tZF9yd18zMihoYSwgTURfRElSRUNUX1JPTV9XSU5ET1csCisJCSAgICAocl9hZGRyICYgMHhGRkZGMDAwMCksIDEpOworCQlyX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwKKwkJICAgIE1EX0RJUkVDVF9ST01fUkVBRF9CQVNFICsKKwkJICAgIChyX2FkZHIgJiAweDAwMDBGRkZGKSwgMCwgMCk7CisJCSpkYXRhX3B0cisrID0gY3B1X3RvX2xlMzIocl92YWx1ZSk7CisJCXJfYWRkciArPSBzaXplb2YodWludDMyX3QpOworCX0KKwkqZF9wdHIgPSBkYXRhX3B0cjsKK30KKworc3RhdGljIGludAorcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX3JkbWVtKHNjc2lfcWxhX2hvc3RfdCAqdmhhLAorCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKmVudHJ5X2hkciwgdWludDMyX3QgKipkX3B0cikKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50MzJfdCByX2FkZHIsIHJfdmFsdWUsIHJfZGF0YTsKKwl1aW50MzJfdCBpLCBqLCBsb29wX2NudDsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9yZG1lbSAqbV9oZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJdWludDMyX3QgKmRhdGFfcHRyID0gKmRfcHRyOworCisJbV9oZHIgPSAoc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfcmRtZW0gKillbnRyeV9oZHI7CisJcl9hZGRyID0gbV9oZHItPnJlYWRfYWRkcjsKKwlsb29wX2NudCA9IG1faGRyLT5yZWFkX2RhdGFfc2l6ZS8xNjsKKworCWlmIChyX2FkZHIgJiAweGYpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAzMywKKwkJICAgICJSZWFkIGFkZHIgMHgleCBub3QgMTYgYnl0ZXMgYWxsaWduZWRcbiIsIHJfYWRkcik7CisJCXJldHVybiBydmFsOworCX0KKworCWlmIChtX2hkci0+cmVhZF9kYXRhX3NpemUgJSAxNikgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDM0LAorCQkgICAgIlJlYWQgZGF0YVsweCV4XSBub3QgbXVsdGlwbGUgb2YgMTYgYnl0ZXNcbiIsCisJCSAgICBtX2hkci0+cmVhZF9kYXRhX3NpemUpOworCQlyZXR1cm4gcnZhbDsKKwl9CisKKwlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMzUsCisJICAgICJbJXNdOiByZG1lbV9hZGRyOiAweCV4LCByZWFkX2RhdGFfc2l6ZTogMHgleCwgbG9vcF9jbnQ6IDB4JXhcbiIsCisJICAgIF9fZnVuY19fLCByX2FkZHIsIG1faGRyLT5yZWFkX2RhdGFfc2l6ZSwgbG9vcF9jbnQpOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBsb29wX2NudDsgaSsrKSB7CisJCXFsYTgyeHhfbWRfcndfMzIoaGEsIE1EX01JVV9URVNUX0FHVF9BRERSX0xPLCByX2FkZHIsIDEpOworCQlyX3ZhbHVlID0gMDsKKwkJcWxhODJ4eF9tZF9yd18zMihoYSwgTURfTUlVX1RFU1RfQUdUX0FERFJfSEksIHJfdmFsdWUsIDEpOworCQlyX3ZhbHVlID0gTUlVX1RBX0NUTF9FTkFCTEU7CisJCXFsYTgyeHhfbWRfcndfMzIoaGEsIE1EX01JVV9URVNUX0FHVF9DVFJMLCByX3ZhbHVlLCAxKTsKKwkJcl92YWx1ZSA9IE1JVV9UQV9DVExfU1RBUlQgfCBNSVVfVEFfQ1RMX0VOQUJMRTsKKwkJcWxhODJ4eF9tZF9yd18zMihoYSwgTURfTUlVX1RFU1RfQUdUX0NUUkwsIHJfdmFsdWUsIDEpOworCisJCWZvciAoaiA9IDA7IGogPCBNQVhfQ1RMX0NIRUNLOyBqKyspIHsKKwkJCXJfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLAorCQkJICAgIE1EX01JVV9URVNUX0FHVF9DVFJMLCAwLCAwKTsKKwkJCWlmICgocl92YWx1ZSAmIE1JVV9UQV9DVExfQlVTWSkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChqID49IE1BWF9DVExfQ0hFQ0spIHsKKwkJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUgorCQkJICAgICJmYWlsZWQgdG8gcmVhZCB0aHJvdWdoIGFnZW50XG4iKTsKKwkJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIHJ2YWw7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQlyX2RhdGEgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLAorCQkJICAgIE1EX01JVV9URVNUX0FHVF9SRERBVEFbal0sIDAsIDApOworCQkJKmRhdGFfcHRyKysgPSBjcHVfdG9fbGUzMihyX2RhdGEpOworCQl9CisJCXJfYWRkciArPSAxNjsKKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5od19sb2NrLCBmbGFncyk7CisJKmRfcHRyID0gZGF0YV9wdHI7CisJcmV0dXJuIFFMQV9TVUNDRVNTOworfQorCitzdGF0aWMgaW50CitxbGE4Mnh4X3ZhbGlkYXRlX3RlbXBsYXRlX2Noa3N1bShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50NjRfdCBjaGtzdW0gPSAwOworCXVpbnQzMl90ICpkX3B0ciA9ICh1aW50MzJfdCAqKWhhLT5tZF90bXBsdF9oZHI7CisJaW50IGNvdW50ID0gaGEtPm1kX3RlbXBsYXRlX3NpemUvc2l6ZW9mKHVpbnQzMl90KTsKKworCXdoaWxlIChjb3VudC0tID4gMCkKKwkJY2hrc3VtICs9ICpkX3B0cisrOworCXdoaWxlIChjaGtzdW0gPj4gMzIpCisJCWNoa3N1bSA9IChjaGtzdW0gJiAweEZGRkZGRkZGKSArIChjaGtzdW0gPj4gMzIpOworCXJldHVybiB+Y2hrc3VtOworfQorCitzdGF0aWMgdm9pZAorcWxhODJ4eF9tYXJrX2VudHJ5X3NraXBwZWQoc2NzaV9xbGFfaG9zdF90ICp2aGEsCisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCAqZW50cnlfaGRyLCBpbnQgaW5kZXgpCit7CisJZW50cnlfaGRyLT5kX2N0cmwuZHJpdmVyX2ZsYWdzIHw9IFFMQTgyWFhfREJHX1NLSVBQRURfRkxBRzsKKwlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMzYsCisJICAgICJTa2lwcGluZyBlbnRyeVslZF06ICIKKwkgICAgIkVUWVBFWzB4JXhdLUVMRVZFTFsweCV4XVxuIiwKKwkgICAgaW5kZXgsIGVudHJ5X2hkci0+ZW50cnlfdHlwZSwKKwkgICAgZW50cnlfaGRyLT5kX2N0cmwuZW50cnlfY2FwdHVyZV9tYXNrKTsKK30KKworaW50CitxbGE4Mnh4X21kX2NvbGxlY3Qoc2NzaV9xbGFfaG9zdF90ICp2aGEpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJaW50IG5vX2VudHJ5X2hkciA9IDA7CisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCAqZW50cnlfaGRyOworCXN0cnVjdCBxbGE4Mnh4X21kX3RlbXBsYXRlX2hkciAqdG1wbHRfaGRyOworCXVpbnQzMl90ICpkYXRhX3B0cjsKKwl1aW50MzJfdCB0b3RhbF9kYXRhX3NpemUgPSAwLCBmX2NhcHR1cmVfbWFzaywgZGF0YV9jb2xsZWN0ZWQgPSAwOworCWludCBpID0gMCwgcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwl0bXBsdF9oZHIgPSAoc3RydWN0IHFsYTgyeHhfbWRfdGVtcGxhdGVfaGRyICopaGEtPm1kX3RtcGx0X2hkcjsKKwlkYXRhX3B0ciA9ICh1aW50MzJfdCAqKWhhLT5tZF9kdW1wOworCisJaWYgKGhhLT5md19kdW1wZWQpIHsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjAzNywKKwkJICAgICJGaXJtd2FyZSBkdW1wIGF2YWlsYWJsZSB0byByZXRyaXZlXG4iKTsKKwkJZ290byBtZF9mYWlsZWQ7CisJfQorCisJaGEtPmZ3X2R1bXBlZCA9IDA7CisKKwlpZiAoIWhhLT5tZF90bXBsdF9oZHIgfHwgIWhhLT5tZF9kdW1wKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMzgsCisJCSAgICAiTWVtb3J5IG5vdCBhbGxvY2F0ZWQgZm9yIG1pbmlkdW1wIGNhcHR1cmVcbiIpOworCQlnb3RvIG1kX2ZhaWxlZDsKKwl9CisKKwlpZiAocWxhODJ4eF92YWxpZGF0ZV90ZW1wbGF0ZV9jaGtzdW0odmhhKSkgeworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDM5LAorCQkgICAgIlRlbXBsYXRlIGNoZWNrc3VtIHZhbGlkYXRpb24gZXJyb3JcbiIpOworCQlnb3RvIG1kX2ZhaWxlZDsKKwl9CisKKwlub19lbnRyeV9oZHIgPSB0bXBsdF9oZHItPm51bV9vZl9lbnRyaWVzOworCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAzYSwKKwkgICAgIk5vIG9mIGVudHJ5IGhlYWRlcnMgaW4gVGVtcGxhdGU6IDB4JXhcbiIsIG5vX2VudHJ5X2hkcik7CisKKwlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwM2IsCisJICAgICJDYXB0dXJlIE1hc2sgb2J0YWluZWQ6IDB4JXhcbiIsIHRtcGx0X2hkci0+Y2FwdHVyZV9kZWJ1Z19sZXZlbCk7CisKKwlmX2NhcHR1cmVfbWFzayA9IHRtcGx0X2hkci0+Y2FwdHVyZV9kZWJ1Z19sZXZlbCAmIDB4RkY7CisKKwkvKiBWYWxpZGF0ZSB3aGV0aGVyIHJlcXVpcmVkIGRlYnVnIGxldmVsIGlzIHNldCAqLworCWlmICgoZl9jYXB0dXJlX21hc2sgJiAweDMpICE9IDB4MykgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDNjLAorCQkgICAgIk1pbmltdW0gcmVxdWlyZWQgY2FwdHVyZSBtYXNrWzB4JXhdIGxldmVsIG5vdCBzZXRcbiIsCisJCSAgICBmX2NhcHR1cmVfbWFzayk7CisJCWdvdG8gbWRfZmFpbGVkOworCX0KKwl0bXBsdF9oZHItPmRyaXZlcl9jYXB0dXJlX21hc2sgPSBxbDJ4bWRjYXBtYXNrOworCisJdG1wbHRfaGRyLT5kcml2ZXJfaW5mb1swXSA9IHZoYS0+aG9zdF9ubzsKKwl0bXBsdF9oZHItPmRyaXZlcl9pbmZvWzFdID0gKFFMQV9EUklWRVJfTUFKT1JfVkVSIDw8IDI0KSB8CisJICAgIChRTEFfRFJJVkVSX01JTk9SX1ZFUiA8PCAxNikgfCAoUUxBX0RSSVZFUl9QQVRDSF9WRVIgPDwgOCkgfAorCSAgICBRTEFfRFJJVkVSX0JFVEFfVkVSOworCisJdG90YWxfZGF0YV9zaXplID0gaGEtPm1kX2R1bXBfc2l6ZTsKKworCXFsX2RiZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwM2QsCisJICAgICJUb3RhbCBtaW5pZHVtcCBkYXRhX3NpemUgMHgleCB0byBiZSBjYXB0dXJlZFxuIiwgdG90YWxfZGF0YV9zaXplKTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGVtcGxhdGUgb2J0YWluZWQgaXMgdmFsaWQgKi8KKwlpZiAodG1wbHRfaGRyLT5lbnRyeV90eXBlICE9IFFMQTgyWFhfVExIRFIpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjA0ZSwKKwkJICAgICJCYWQgdGVtcGxhdGUgaGVhZGVyIGVudHJ5IHR5cGU6IDB4JXggb2J0YWluZWRcbiIsCisJCSAgICB0bXBsdF9oZHItPmVudHJ5X3R5cGUpOworCQlnb3RvIG1kX2ZhaWxlZDsKKwl9CisKKwllbnRyeV9oZHIgPSAocWxhODJ4eF9tZF9lbnRyeV9oZHJfdCAqKSBcCisJICAgICgoKHVpbnQ4X3QgKiloYS0+bWRfdG1wbHRfaGRyKSArIHRtcGx0X2hkci0+Zmlyc3RfZW50cnlfb2Zmc2V0KTsKKworCS8qIFdhbGsgdGhyb3VnaCB0aGUgZW50cnkgaGVhZGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBub19lbnRyeV9oZHI7IGkrKykgeworCisJCWlmIChkYXRhX2NvbGxlY3RlZCA+IHRvdGFsX2RhdGFfc2l6ZSkgeworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAzZSwKKwkJCSAgICAiTW9yZSBNaW5pRHVtcCBkYXRhIGNvbGxlY3RlZDogWzB4JXhdXG4iLAorCQkJICAgIGRhdGFfY29sbGVjdGVkKTsKKwkJCWdvdG8gbWRfZmFpbGVkOworCQl9CisKKwkJaWYgKCEoZW50cnlfaGRyLT5kX2N0cmwuZW50cnlfY2FwdHVyZV9tYXNrICYKKwkJICAgIHFsMnhtZGNhcG1hc2spKSB7CisJCQllbnRyeV9oZHItPmRfY3RybC5kcml2ZXJfZmxhZ3MgfD0KKwkJCSAgICBRTEE4MlhYX0RCR19TS0lQUEVEX0ZMQUc7CisJCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwM2YsCisJCQkgICAgIlNraXBwaW5nIGVudHJ5WyVkXTogIgorCQkJICAgICJFVFlQRVsweCV4XS1FTEVWRUxbMHgleF1cbiIsCisJCQkgICAgaSwgZW50cnlfaGRyLT5lbnRyeV90eXBlLAorCQkJICAgIGVudHJ5X2hkci0+ZF9jdHJsLmVudHJ5X2NhcHR1cmVfbWFzayk7CisJCQlnb3RvIHNraXBfbnh0X2VudHJ5OworCQl9CisKKwkJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDQwLAorCQkgICAgIlslc106IGRhdGEgcHRyWyVkXTogJXAsIGVudHJ5X2hkcjogJXBcbiIKKwkJICAgICJlbnRyeV90eXBlOiAweCV4LCBjYXB0cnVlX21hc2s6IDB4JXhcbiIsCisJCSAgICBfX2Z1bmNfXywgaSwgZGF0YV9wdHIsIGVudHJ5X2hkciwKKwkJICAgIGVudHJ5X2hkci0+ZW50cnlfdHlwZSwKKwkJICAgIGVudHJ5X2hkci0+ZF9jdHJsLmVudHJ5X2NhcHR1cmVfbWFzayk7CisKKwkJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDQxLAorCQkgICAgIkRhdGEgY29sbGVjdGVkOiBbMHgleF0sIER1bXAgc2l6ZSBsZWZ0OlsweCV4XVxuIiwKKwkJICAgIGRhdGFfY29sbGVjdGVkLCAoaGEtPm1kX2R1bXBfc2l6ZSAtIGRhdGFfY29sbGVjdGVkKSk7CisKKwkJLyogRGVjb2RlIHRoZSBlbnRyeSB0eXBlIGFuZCB0YWtlCisJCSAqIHJlcXVpcmVkIGFjdGlvbiB0byBjYXB0dXJlIGRlYnVnIGRhdGEgKi8KKwkJc3dpdGNoIChlbnRyeV9oZHItPmVudHJ5X3R5cGUpIHsKKwkJY2FzZSBRTEE4MlhYX1JERU5EOgorCQkJcWxhODJ4eF9tYXJrX2VudHJ5X3NraXBwZWQodmhhLCBlbnRyeV9oZHIsIGkpOworCQkJYnJlYWs7CisJCWNhc2UgUUxBODJYWF9DTlRSTDoKKwkJCXJ2YWwgPSBxbGE4Mnh4X21pbmlkdW1wX3Byb2Nlc3NfY29udHJvbCh2aGEsCisJCQkgICAgZW50cnlfaGRyLCAmZGF0YV9wdHIpOworCQkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQlxbGE4Mnh4X21hcmtfZW50cnlfc2tpcHBlZCh2aGEsIGVudHJ5X2hkciwgaSk7CisJCQkJZ290byBtZF9mYWlsZWQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX1JEQ1JCOgorCQkJcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX3JkY3JiKHZoYSwKKwkJCSAgICBlbnRyeV9oZHIsICZkYXRhX3B0cik7CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX1JETUVNOgorCQkJcnZhbCA9IHFsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19yZG1lbSh2aGEsCisJCQkgICAgZW50cnlfaGRyLCAmZGF0YV9wdHIpOworCQkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQlxbGE4Mnh4X21hcmtfZW50cnlfc2tpcHBlZCh2aGEsIGVudHJ5X2hkciwgaSk7CisJCQkJZ290byBtZF9mYWlsZWQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX0JPQVJEOgorCQljYXNlIFFMQTgyWFhfUkRST006CisJCQlxbGE4Mnh4X21pbmlkdW1wX3Byb2Nlc3NfcmRyb20odmhhLAorCQkJICAgIGVudHJ5X2hkciwgJmRhdGFfcHRyKTsKKwkJCWJyZWFrOworCQljYXNlIFFMQTgyWFhfTDJEVEc6CisJCWNhc2UgUUxBODJYWF9MMklURzoKKwkJY2FzZSBRTEE4MlhYX0wyREFUOgorCQljYXNlIFFMQTgyWFhfTDJJTlM6CisJCQlydmFsID0gcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX2wydGFnKHZoYSwKKwkJCSAgICBlbnRyeV9oZHIsICZkYXRhX3B0cik7CisJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJCXFsYTgyeHhfbWFya19lbnRyeV9za2lwcGVkKHZoYSwgZW50cnlfaGRyLCBpKTsKKwkJCQlnb3RvIG1kX2ZhaWxlZDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFFMQTgyWFhfTDFEQVQ6CisJCWNhc2UgUUxBODJYWF9MMUlOUzoKKwkJCXFsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19sMWNhY2hlKHZoYSwKKwkJCSAgICBlbnRyeV9oZHIsICZkYXRhX3B0cik7CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX1JET0NNOgorCQkJcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX3Jkb2NtKHZoYSwKKwkJCSAgICBlbnRyeV9oZHIsICZkYXRhX3B0cik7CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX1JETVVYOgorCQkJcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX3JkbXV4KHZoYSwKKwkJCSAgICBlbnRyeV9oZHIsICZkYXRhX3B0cik7CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX1FVRVVFOgorCQkJcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX3F1ZXVlKHZoYSwKKwkJCSAgICBlbnRyeV9oZHIsICZkYXRhX3B0cik7CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX1JETk9QOgorCQlkZWZhdWx0OgorCQkJcWxhODJ4eF9tYXJrX2VudHJ5X3NraXBwZWQodmhhLCBlbnRyeV9oZHIsIGkpOworCQkJYnJlYWs7CisJCX0KKworCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwNDIsCisJCSAgICAiWyVzXTogZGF0YSBwdHJbJWRdOiAlcFxuIiwgX19mdW5jX18sIGksIGRhdGFfcHRyKTsKKworCQlkYXRhX2NvbGxlY3RlZCA9ICh1aW50OF90ICopZGF0YV9wdHIgLQorCQkgICAgKHVpbnQ4X3QgKiloYS0+bWRfZHVtcDsKK3NraXBfbnh0X2VudHJ5OgorCQllbnRyeV9oZHIgPSAocWxhODJ4eF9tZF9lbnRyeV9oZHJfdCAqKSBcCisJCSAgICAoKCh1aW50OF90ICopZW50cnlfaGRyKSArIGVudHJ5X2hkci0+ZW50cnlfc2l6ZSk7CisJfQorCisJaWYgKGRhdGFfY29sbGVjdGVkICE9IHRvdGFsX2RhdGFfc2l6ZSkgeworCQlxbF9kYmcocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDQzLAorCQkgICAgIk1pbmlEdW1wIGRhdGEgbWlzbWF0Y2g6IERhdGEgY29sbGVjdGVkOiBbMHgleF0sIgorCQkgICAgInRvdGFsX2RhdGFfc2l6ZTpbMHgleF1cbiIsCisJCSAgICBkYXRhX2NvbGxlY3RlZCwgdG90YWxfZGF0YV9zaXplKTsKKwkJZ290byBtZF9mYWlsZWQ7CisJfQorCisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjA0NCwKKwkgICAgIkZpcm13YXJlIGR1bXAgc2F2ZWQgdG8gdGVtcCBidWZmZXIgKCVsZC8lcCAlbGQvJXApLlxuIiwKKwkgICAgdmhhLT5ob3N0X25vLCBoYS0+bWRfdG1wbHRfaGRyLCB2aGEtPmhvc3Rfbm8sIGhhLT5tZF9kdW1wKTsKKwloYS0+ZndfZHVtcGVkID0gMTsKKwlxbGEyeDAwX3Bvc3RfdWV2ZW50X3dvcmsodmhhLCBRTEFfVUVWRU5UX0NPREVfRldfRFVNUCk7CisKK21kX2ZhaWxlZDoKKwlyZXR1cm4gcnZhbDsKK30KKworaW50CitxbGE4Mnh4X21kX2FsbG9jKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCWludCBpLCBrOworCXN0cnVjdCBxbGE4Mnh4X21kX3RlbXBsYXRlX2hkciAqdG1wbHRfaGRyOworCisJdG1wbHRfaGRyID0gKHN0cnVjdCBxbGE4Mnh4X21kX3RlbXBsYXRlX2hkciAqKWhhLT5tZF90bXBsdF9oZHI7CisKKwlpZiAocWwyeG1kY2FwbWFzayA8IDB4MyB8fCBxbDJ4bWRjYXBtYXNrID4gMHg3RikgeworCQlxbDJ4bWRjYXBtYXNrID0gdG1wbHRfaGRyLT5jYXB0dXJlX2RlYnVnX2xldmVsICYgMHhGRjsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjA0NSwKKwkJICAgICJGb3JjaW5nIGRyaXZlciBjYXB0dXJlIG1hc2sgdG8gZmlybXdhcmUgZGVmYXVsdCBjYXB0dXJlIG1hc2s6IDB4JXguXG4iLAorCQkgICAgcWwyeG1kY2FwbWFzayk7CisJfQorCisJZm9yIChpID0gMHgyLCBrID0gMTsgKGkgJiBRTEE4MlhYX0RFRkFVTFRfQ0FQX01BU0spOyBpIDw8PSAxLCBrKyspIHsKKwkJaWYgKGkgJiBxbDJ4bWRjYXBtYXNrKQorCQkJaGEtPm1kX2R1bXBfc2l6ZSArPSB0bXBsdF9oZHItPmNhcHR1cmVfc2l6ZV9hcnJheVtrXTsKKwl9CisKKwlpZiAoaGEtPm1kX2R1bXApIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjA0NiwKKwkJICAgICJGaXJtd2FyZSBkdW1wIHByZXZpb3VzbHkgYWxsb2NhdGVkLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWhhLT5tZF9kdW1wID0gdm1hbGxvYyhoYS0+bWRfZHVtcF9zaXplKTsKKwlpZiAoaGEtPm1kX2R1bXAgPT0gTlVMTCkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDQ3LAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1pbmlkdW1wIHNpemUgIgorCQkgICAgIigweCV4KS5cbiIsIGhhLT5tZF9kdW1wX3NpemUpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3FsYTgyeHhfbWRfZnJlZShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCS8qIFJlbGVhc2UgdGhlIHRlbXBsYXRlIGhlYWRlciBhbGxvY2F0ZWQgKi8KKwlpZiAoaGEtPm1kX3RtcGx0X2hkcikgeworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDQ4LAorCQkgICAgIkZyZWUgTWluaUR1bXAgdGVtcGxhdGU6ICVwLCBzaXplICglZCBLQilcbiIsCisJCSAgICBoYS0+bWRfdG1wbHRfaGRyLCBoYS0+bWRfdGVtcGxhdGVfc2l6ZSAvIDEwMjQpOworCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgaGEtPm1kX3RlbXBsYXRlX3NpemUsCisJCSAgICBoYS0+bWRfdG1wbHRfaGRyLCBoYS0+bWRfdG1wbHRfaGRyX2RtYSk7CisJCWhhLT5tZF90bXBsdF9oZHIgPSAwOworCX0KKworCS8qIFJlbGVhc2UgdGhlIHRlbXBsYXRlIGRhdGEgYnVmZmVyIGFsbG9jYXRlZCAqLworCWlmIChoYS0+bWRfZHVtcCkgeworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDQ5LAorCQkgICAgIkZyZWUgTWluaUR1bXAgbWVtb3J5OiAlcCwgc2l6ZSAoJWQgS0IpXG4iLAorCQkgICAgaGEtPm1kX2R1bXAsIGhhLT5tZF9kdW1wX3NpemUgLyAxMDI0KTsKKwkJdmZyZWUoaGEtPm1kX2R1bXApOworCQloYS0+bWRfZHVtcF9zaXplID0gMDsKKwkJaGEtPm1kX2R1bXAgPSAwOworCX0KK30KKwordm9pZAorcWxhODJ4eF9tZF9wcmVwKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCWludCBydmFsOworCisJLyogR2V0IE1pbmlkdW1wIHRlbXBsYXRlIHNpemUgKi8KKwlydmFsID0gcWxhODJ4eF9tZF9nZXRfdGVtcGxhdGVfc2l6ZSh2aGEpOworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwNGEsCisJCSAgICAiTWluaUR1bXAgVGVtcGxhdGUgc2l6ZSBvYnRhaW5lZCAoJWQgS0IpXG4iLAorCQkgICAgaGEtPm1kX3RlbXBsYXRlX3NpemUgLyAxMDI0KTsKKworCQkvKiBHZXQgTWluaWR1bXAgdGVtcGxhdGUgKi8KKwkJcnZhbCA9IHFsYTgyeHhfbWRfZ2V0X3RlbXBsYXRlKHZoYSk7CisJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwNGIsCisJCQkgICAgIk1pbmlEdW1wIFRlbXBsYXRlIG9idGFpbmVkXG4iKTsKKworCQkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBtaW5pZHVtcCAqLworCQkJcnZhbCA9IHFsYTgyeHhfbWRfYWxsb2ModmhhKTsKKwkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKQorCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwNGMsCisJCQkJICAgICJNaW5pRHVtcCBtZW1vcnkgYWxsb2NhdGVkICglZCBLQilcbiIsCisJCQkJICAgIGhhLT5tZF9kdW1wX3NpemUgLyAxMDI0KTsKKwkJCWVsc2UgeworCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwNGQsCisJCQkJICAgICJGcmVlIE1pbmlEdW1wIHRlbXBsYXRlOiAlcCwgc2l6ZTogKCVkIEtCKVxuIiwKKwkJCQkgICAgaGEtPm1kX3RtcGx0X2hkciwKKwkJCQkgICAgaGEtPm1kX3RlbXBsYXRlX3NpemUgLyAxMDI0KTsKKwkJCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJCQkgICAgaGEtPm1kX3RlbXBsYXRlX3NpemUsCisJCQkJICAgIGhhLT5tZF90bXBsdF9oZHIsIGhhLT5tZF90bXBsdF9oZHJfZG1hKTsKKwkJCQloYS0+bWRfdG1wbHRfaGRyID0gMDsKKwkJCX0KKworCQl9CisJfQorfQorCitpbnQKK3FsYTgyeHhfYmVhY29uX29uKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCit7CisKKwlpbnQgcnZhbDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKKwlydmFsID0gcWxhODJ4eF9tYnhfYmVhY29uX2N0bCh2aGEsIDEpOworCisJaWYgKHJ2YWwpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjA1MCwKKwkJICAgICJtYnggc2V0IGxlZCBjb25maWcgZmFpbGVkIGluICVzXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXhpdDsKKwl9CisJaGEtPmJlYWNvbl9ibGlua19sZWQgPSAxOworZXhpdDoKKwlxbGE4Mnh4X2lkY191bmxvY2soaGEpOworCXJldHVybiBydmFsOworfQorCitpbnQKK3FsYTgyeHhfYmVhY29uX29mZihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQoreworCisJaW50IHJ2YWw7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJcWxhODJ4eF9pZGNfbG9jayhoYSk7CisJcnZhbCA9IHFsYTgyeHhfbWJ4X2JlYWNvbl9jdGwodmhhLCAwKTsKKworCWlmIChydmFsKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwNTEsCisJCSAgICAibWJ4IHNldCBsZWQgY29uZmlnIGZhaWxlZCBpbiAlc1xuIiwgX19mdW5jX18pOworCQlnb3RvIGV4aXQ7CisJfQorCWhhLT5iZWFjb25fYmxpbmtfbGVkID0gMDsKK2V4aXQ6CisJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKKwlyZXR1cm4gcnZhbDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmgKaW5kZXggOGEyMTgzMi4uNTc4MjBjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmgKQEAgLTQ4NCw4ICs0ODQsNiBAQAogI2RlZmluZSBRTEE4MlhYX0FERFJfT0NNMQkJKDB4MDAwMDAwMDIwMDQwMDAwMFVMTCkKICNkZWZpbmUgUUxBODJYWF9BRERSX09DTTFfTUFYCQkoMHgwMDAwMDAwMjAwNGZmZmZmVUxMKQogI2RlZmluZSBRTEE4MlhYX0FERFJfUURSX05FVAkJKDB4MDAwMDAwMDMwMDAwMDAwMFVMTCkKLQotI2RlZmluZSBRTEE4MlhYX1AyX0FERFJfUURSX05FVF9NQVgJKDB4MDAwMDAwMDMwMDFmZmZmZlVMTCkKICNkZWZpbmUgUUxBODJYWF9QM19BRERSX1FEUl9ORVRfTUFYCSgweDAwMDAwMDAzMDNmZmZmZmZVTEwpCiAKICNkZWZpbmUgUUxBODJYWF9QQ0lfQ1JCU1BBQ0UJCSh1bnNpZ25lZCBsb25nKTB4MDYwMDAwMDAKQEAgLTg5MCw2ICs4ODgsNyBAQAogfTsKIAogI2RlZmluZSBNQkNfVE9HR0xFX0lOVEVSUlVQVAkweDEwCisjZGVmaW5lIE1CQ19TRVRfTEVEX0NPTkZJRwkweDEyNQogCiAvKiBGbGFzaCAgb2Zmc2V0ICovCiAjZGVmaW5lIEZMVF9SRUdfQk9PVExPQURfODJYWAkweDcyCkBAIC05MjIsNCArOTIxLDI1NiBAQAogI2RlZmluZSBNMjVQX0lOU1RSX0RQCQkweGI5CiAjZGVmaW5lIE0yNVBfSU5TVFJfUkVTCQkweGFiCiAKKy8qIE1pbmlkdW1wIHJlbGF0ZWQgKi8KKworLyoKKyAqIFZlcnNpb24gb2YgdGhlIHRlbXBsYXRlCisgKiA0IEJ5dGVzCisgKiBYLk1ham9yLk1pbm9yLlJFTEVBU0UKKyAqLworI2RlZmluZSBRTEE4MlhYX01JTklEVU1QX1ZFUlNJT04gICAgICAgICAweDEwMTAxCisKKy8qCisgKiBFbnRyeSBUeXBlIERlZmluZXMKKyAqLworI2RlZmluZSBRTEE4MlhYX1JETk9QICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUUxBODJYWF9SRENSQiAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFFMQTgyWFhfUkRNVVggICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBRTEE4MlhYX1FVRVVFICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUUxBODJYWF9CT0FSRCAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFFMQTgyWFhfUkRTUkUgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBRTEE4MlhYX1JET0NNICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUUxBODJYWF9DQUNIRSAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFFMQTgyWFhfTDFEQVQgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBRTEE4MlhYX0wxSU5TICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUUxBODJYWF9MMkRURyAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIFFMQTgyWFhfTDJJVEcgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBRTEE4MlhYX0wyREFUICAgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgUUxBODJYWF9MMklOUyAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIFFMQTgyWFhfUkRST00gICAgICAgICAgICAgICAgICA3MQorI2RlZmluZSBRTEE4MlhYX1JETUVNICAgICAgICAgICAgICAgICAgNzIKKyNkZWZpbmUgUUxBODJYWF9DTlRSTCAgICAgICAgICAgICAgICAgIDk4CisjZGVmaW5lIFFMQTgyWFhfVExIRFIgICAgICAgICAgICAgICAgICA5OQorI2RlZmluZSBRTEE4MlhYX1JERU5EICAgICAgICAgICAgICAgICAgMjU1CisKKy8qCisgKiBPcGNvZGVzIGZvciBDb250cm9sIEVudHJpZXMuCisgKiBUaGVzZSBGbGFncyBhcmUgYml0IGZpZWxkcy4KKyAqLworI2RlZmluZSBRTEE4MlhYX0RCR19PUENPREVfV1IgICAgICAgIDB4MDEKKyNkZWZpbmUgUUxBODJYWF9EQkdfT1BDT0RFX1JXICAgICAgICAweDAyCisjZGVmaW5lIFFMQTgyWFhfREJHX09QQ09ERV9BTkQgICAgICAgMHgwNAorI2RlZmluZSBRTEE4MlhYX0RCR19PUENPREVfT1IgICAgICAgIDB4MDgKKyNkZWZpbmUgUUxBODJYWF9EQkdfT1BDT0RFX1BPTEwgICAgICAweDEwCisjZGVmaW5lIFFMQTgyWFhfREJHX09QQ09ERV9SRFNUQVRFICAgMHgyMAorI2RlZmluZSBRTEE4MlhYX0RCR19PUENPREVfV1JTVEFURSAgIDB4NDAKKyNkZWZpbmUgUUxBODJYWF9EQkdfT1BDT0RFX01EU1RBVEUgICAweDgwCisKKy8qCisgKiBUZW1wbGF0ZSBIZWFkZXIgYW5kIEVudHJ5IEhlYWRlciBkZWZpbml0aW9ucyBzdGFydCBoZXJlLgorICovCisKKy8qCisgKiBUZW1wbGF0ZSBIZWFkZXIKKyAqIFBhcnRzIG9mIHRoZSB0ZW1wbGF0ZSBoZWFkZXIgY2FuIGJlIG1vZGlmaWVkIGJ5IHRoZSBkcml2ZXIuCisgKiBUaGVzZSBpbmNsdWRlIHRoZSBzYXZlZF9zdGF0ZV9hcnJheSwgY2FwdHVyZV9kZWJ1Z19sZXZlbCwgZHJpdmVyX3RpbWVzdGFtcAorICovCisKKyNkZWZpbmUgUUxBODJYWF9EQkdfU1RBVEVfQVJSQVlfTEVOICAgICAgICAxNgorI2RlZmluZSBRTEE4MlhYX0RCR19DQVBfU0laRV9BUlJBWV9MRU4gICAgIDgKKyNkZWZpbmUgUUxBODJYWF9EQkdfUlNWRF9BUlJBWV9MRU4gICAgICAgICA4CisKKy8qCisgKiBEcml2ZXIgRmxhZ3MKKyAqLworI2RlZmluZSBRTEE4MlhYX0RCR19TS0lQUEVEX0ZMQUcJMHg4MAkvKiBkcml2ZXIgc2tpcHBlZCB0aGlzIGVudHJ5ICovCisjZGVmaW5lCVFMQTgyWFhfREVGQVVMVF9DQVBfTUFTSwkweEZGCS8qIGRlZmF1bHQgY2FwdHVyZSBtYXNrICovCisKK3N0cnVjdCBxbGE4Mnh4X21kX3RlbXBsYXRlX2hkciB7CisJdWludDMyX3QgZW50cnlfdHlwZTsKKwl1aW50MzJfdCBmaXJzdF9lbnRyeV9vZmZzZXQ7CisJdWludDMyX3Qgc2l6ZV9vZl90ZW1wbGF0ZTsKKwl1aW50MzJfdCBjYXB0dXJlX2RlYnVnX2xldmVsOworCisJdWludDMyX3QgbnVtX29mX2VudHJpZXM7CisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50MzJfdCBkcml2ZXJfdGltZXN0YW1wOworCXVpbnQzMl90IHRlbXBsYXRlX2NoZWNrc3VtOworCisJdWludDMyX3QgZHJpdmVyX2NhcHR1cmVfbWFzazsKKwl1aW50MzJfdCBkcml2ZXJfaW5mb1szXTsKKworCXVpbnQzMl90IHNhdmVkX3N0YXRlX2FycmF5W1FMQTgyWFhfREJHX1NUQVRFX0FSUkFZX0xFTl07CisJdWludDMyX3QgY2FwdHVyZV9zaXplX2FycmF5W1FMQTgyWFhfREJHX0NBUF9TSVpFX0FSUkFZX0xFTl07CisKKwkvKiAgbWFya2Vyc19hcnJheSB1c2VkIHRvIGNhcHR1cmUgc29tZSBzcGVjaWFsIGxvY2F0aW9ucyBvbiBib2FyZCAqLworCXVpbnQzMl90IG1hcmtlcnNfYXJyYXlbUUxBODJYWF9EQkdfUlNWRF9BUlJBWV9MRU5dOworCXVpbnQzMl90IG51bV9vZl9mcmVlX2VudHJpZXM7CS8qIEZvciBpbnRlcm5hbCB1c2UgKi8KKwl1aW50MzJfdCBmcmVlX2VudHJ5X29mZnNldDsJLyogRm9yIGludGVybmFsIHVzZSAqLworCXVpbnQzMl90IHRvdGFsX3RhYmxlX3NpemU7CS8qICBGb3IgaW50ZXJuYWwgdXNlICovCisJdWludDMyX3QgYmt1cF90YWJsZV9vZmZzZXQ7CS8qICBGb3IgaW50ZXJuYWwgdXNlICovCit9IF9fcGFja2VkOworCisvKgorICogRW50cnkgSGVhZGVyOiAgQ29tbW9uIHRvIEFsbCBFbnRyeSBUeXBlcworICovCisKKy8qCisgKiBEcml2ZXIgQ29kZSBpcyBmb3IgZHJpdmVyIHRvIHdyaXRlIHNvbWUgaW5mbyBhYm91dCB0aGUgZW50cnkuCisgKiBDdXJyZW50bHkgbm90IHVzZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfaGRyIHsKKwl1aW50MzJfdCBlbnRyeV90eXBlOworCXVpbnQzMl90IGVudHJ5X3NpemU7CisJdWludDMyX3QgZW50cnlfY2FwdHVyZV9zaXplOworCXN0cnVjdCB7CisJCXVpbnQ4X3QgZW50cnlfY2FwdHVyZV9tYXNrOworCQl1aW50OF90IGVudHJ5X2NvZGU7CisJCXVpbnQ4X3QgZHJpdmVyX2NvZGU7CisJCXVpbnQ4X3QgZHJpdmVyX2ZsYWdzOworCX0gZF9jdHJsOworfSBfX3BhY2tlZCBxbGE4Mnh4X21kX2VudHJ5X2hkcl90OworCisvKgorICogIFJlYWQgQ1JCIGVudHJ5IGhlYWRlcgorICovCitzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9jcmIgeworCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgaDsKKwl1aW50MzJfdCBhZGRyOworCXN0cnVjdCB7CisJCXVpbnQ4X3QgYWRkcl9zdHJpZGU7CisJCXVpbnQ4X3Qgc3RhdGVfaW5kZXhfYTsKKwkJdWludDE2X3QgcG9sbF90aW1lb3V0OworCX0gY3JiX3N0cmQ7CisKKwl1aW50MzJfdCBkYXRhX3NpemU7CisJdWludDMyX3Qgb3BfY291bnQ7CisKKwlzdHJ1Y3QgeworCQl1aW50OF90IG9wY29kZTsKKwkJdWludDhfdCBzdGF0ZV9pbmRleF92OworCQl1aW50OF90IHNobDsKKwkJdWludDhfdCBzaHI7CisJfSBjcmJfY3RybDsKKworCXVpbnQzMl90IHZhbHVlXzE7CisJdWludDMyX3QgdmFsdWVfMjsKKwl1aW50MzJfdCB2YWx1ZV8zOworfSBfX3BhY2tlZDsKKworLyoKKyAqIENhY2hlIGVudHJ5IGhlYWRlcgorICovCitzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9jYWNoZSB7CisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCBoOworCisJdWludDMyX3QgdGFnX3JlZ19hZGRyOworCXN0cnVjdCB7CisJCXVpbnQxNl90IHRhZ192YWx1ZV9zdHJpZGU7CisJCXVpbnQxNl90IGluaXRfdGFnX3ZhbHVlOworCX0gYWRkcl9jdHJsOworCisJdWludDMyX3QgZGF0YV9zaXplOworCXVpbnQzMl90IG9wX2NvdW50OworCisJdWludDMyX3QgY29udHJvbF9hZGRyOworCXN0cnVjdCB7CisJCXVpbnQxNl90IHdyaXRlX3ZhbHVlOworCQl1aW50OF90IHBvbGxfbWFzazsKKwkJdWludDhfdCBwb2xsX3dhaXQ7CisJfSBjYWNoZV9jdHJsOworCisJdWludDMyX3QgcmVhZF9hZGRyOworCXN0cnVjdCB7CisJCXVpbnQ4X3QgcmVhZF9hZGRyX3N0cmlkZTsKKwkJdWludDhfdCByZWFkX2FkZHJfY250OworCQl1aW50MTZfdCByc3ZkXzE7CisJfSByZWFkX2N0cmw7Cit9IF9fcGFja2VkOworCisvKgorICogUmVhZCBPQ00KKyAqLworc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfcmRvY20geworCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgaDsKKworCXVpbnQzMl90IHJzdmRfMDsKKwl1aW50MzJfdCByc3ZkXzE7CisJdWludDMyX3QgZGF0YV9zaXplOworCXVpbnQzMl90IG9wX2NvdW50OworCisJdWludDMyX3QgcnN2ZF8yOworCXVpbnQzMl90IHJzdmRfMzsKKwl1aW50MzJfdCByZWFkX2FkZHI7CisJdWludDMyX3QgcmVhZF9hZGRyX3N0cmlkZTsKKwl1aW50MzJfdCByZWFkX2FkZHJfY250cmw7Cit9IF9fcGFja2VkOworCisvKgorICogUmVhZCBNZW1vcnkKKyAqLworc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfcmRtZW0geworCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgaDsKKwl1aW50MzJfdCByc3ZkWzZdOworCXVpbnQzMl90IHJlYWRfYWRkcjsKKwl1aW50MzJfdCByZWFkX2RhdGFfc2l6ZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBSZWFkIFJPTQorICovCitzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9yZHJvbSB7CisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCBoOworCXVpbnQzMl90IHJzdmRbNl07CisJdWludDMyX3QgcmVhZF9hZGRyOworCXVpbnQzMl90IHJlYWRfZGF0YV9zaXplOworfSBfX3BhY2tlZDsKKworc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfbXV4IHsKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90IGg7CisKKwl1aW50MzJfdCBzZWxlY3RfYWRkcjsKKwl1aW50MzJfdCByc3ZkXzA7CisJdWludDMyX3QgZGF0YV9zaXplOworCXVpbnQzMl90IG9wX2NvdW50OworCisJdWludDMyX3Qgc2VsZWN0X3ZhbHVlOworCXVpbnQzMl90IHNlbGVjdF92YWx1ZV9zdHJpZGU7CisJdWludDMyX3QgcmVhZF9hZGRyOworCXVpbnQzMl90IHJzdmRfMTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X3F1ZXVlIHsKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90IGg7CisKKwl1aW50MzJfdCBzZWxlY3RfYWRkcjsKKwlzdHJ1Y3QgeworCQl1aW50MTZfdCBxdWV1ZV9pZF9zdHJpZGU7CisJCXVpbnQxNl90IHJzdmRfMDsKKwl9IHFfc3RyZDsKKworCXVpbnQzMl90IGRhdGFfc2l6ZTsKKwl1aW50MzJfdCBvcF9jb3VudDsKKwl1aW50MzJfdCByc3ZkXzE7CisJdWludDMyX3QgcnN2ZF8yOworCisJdWludDMyX3QgcmVhZF9hZGRyOworCXN0cnVjdCB7CisJCXVpbnQ4X3QgcmVhZF9hZGRyX3N0cmlkZTsKKwkJdWludDhfdCByZWFkX2FkZHJfY250OworCQl1aW50MTZfdCByc3ZkXzM7CisJfSByZF9zdHJkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNQkNfRElBR05PU1RJQ19NSU5JRFVNUF9URU1QTEFURSAweDEyOQorI2RlZmluZSBSUVNUX1RNUExUX1NJWkUJMHgwCisjZGVmaW5lIFJRU1RfVE1QTFQgMHgxCisjZGVmaW5lIE1EX0RJUkVDVF9ST01fV0lORE9XCTB4NDIxMTAwMzAKKyNkZWZpbmUgTURfRElSRUNUX1JPTV9SRUFEX0JBU0UJMHg0MjE1MDAwMAorI2RlZmluZSBNRF9NSVVfVEVTVF9BR1RfQ1RSTAkJMHg0MTAwMDA5MAorI2RlZmluZSBNRF9NSVVfVEVTVF9BR1RfQUREUl9MTwkJMHg0MTAwMDA5NAorI2RlZmluZSBNRF9NSVVfVEVTVF9BR1RfQUREUl9ISQkJMHg0MTAwMDA5OAorCitzdGF0aWMgY29uc3QgaW50IE1EX01JVV9URVNUX0FHVF9SRERBVEFbXSA9IHsgMHg0MTAwMDBBOCwgMHg0MTAwMDBBQywKKwkweDQxMDAwMEI4LCAweDQxMDAwMEJDIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKaW5kZXggMWU2OTUyNy4uZmQxNGM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCQkiU2V0IGl0IHRvIDEgdG8gdHVybiBvbiB0aGUgY3B1IGFmZmluaXR5LiIpOwogCiBpbnQgcWwyeGZ3bG9hZGJpbjsKLW1vZHVsZV9wYXJhbShxbDJ4Zndsb2FkYmluLCBpbnQsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKHFsMnhmd2xvYWRiaW4sIGludCwgU19JUlVHT3xTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGZ3bG9hZGJpbiwKIAkJIk9wdGlvbiB0byBzcGVjaWZ5IGxvY2F0aW9uIGZyb20gd2hpY2ggdG8gbG9hZCBJU1AgZmlybXdhcmU6LlxuIgogCQkiIDIgLS0gbG9hZCBmaXJtd2FyZSB2aWEgdGhlIHJlcXVlc3RfZmlybXdhcmUoKSAoaG90cGx1ZykuXG4iCkBAIC0xNTgsMTEgKzE1OCwxMSBAQAogCQkiRGVmYXVsdCBpcyAwIC0gc2tpcCBFVFMgZW5hYmxlbWVudC4iKTsKIAogaW50IHFsMnhkYndyID0gMTsKLW1vZHVsZV9wYXJhbShxbDJ4ZGJ3ciwgaW50LCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShxbDJ4ZGJ3ciwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhxbDJ4ZGJ3ciwKLQkiT3B0aW9uIHRvIHNwZWNpZnkgc2NoZW1lIGZvciByZXF1ZXN0IHF1ZXVlIHBvc3RpbmcuXG4iCi0JIiAwIC0tIFJlZ3VsYXIgZG9vcmJlbGwuXG4iCi0JIiAxIC0tIENBTVJBTSBkb29yYmVsbCAoZmFzdGVyKS5cbiIpOworCQkiT3B0aW9uIHRvIHNwZWNpZnkgc2NoZW1lIGZvciByZXF1ZXN0IHF1ZXVlIHBvc3RpbmcuXG4iCisJCSIgMCAtLSBSZWd1bGFyIGRvb3JiZWxsLlxuIgorCQkiIDEgLS0gQ0FNUkFNIGRvb3JiZWxsIChmYXN0ZXIpLlxuIik7CiAKIGludCBxbDJ4dGFyZ2V0cmVzZXQgPSAxOwogbW9kdWxlX3BhcmFtKHFsMnh0YXJnZXRyZXNldCwgaW50LCBTX0lSVUdPKTsKQEAgLTE4MywxMSArMTgzLDExIEBACiAJCSJEZWZhdWx0IGlzIDAgLSBJc3N1ZSBUTSBJT0NCcyB2aWEgbWFpbGJveCBtZWNoYW5pc20uIik7CiAKIGludCBxbDJ4ZG9udHJlc2V0aGJhOwotbW9kdWxlX3BhcmFtKHFsMnhkb250cmVzZXRoYmEsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0ocWwyeGRvbnRyZXNldGhiYSwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhxbDJ4ZG9udHJlc2V0aGJhLAotCSJPcHRpb24gdG8gc3BlY2lmeSByZXNldCBiZWhhdmlvdXIuXG4iCi0JIiAwIChEZWZhdWx0KSAtLSBSZXNldCBvbiBmYWlsdXJlLlxuIgotCSIgMSAtLSBEbyBub3QgcmVzZXQgb24gZmFpbHVyZS5cbiIpOworCQkiT3B0aW9uIHRvIHNwZWNpZnkgcmVzZXQgYmVoYXZpb3VyLlxuIgorCQkiIDAgKERlZmF1bHQpIC0tIFJlc2V0IG9uIGZhaWx1cmUuXG4iCisJCSIgMSAtLSBEbyBub3QgcmVzZXQgb24gZmFpbHVyZS5cbiIpOwogCiB1aW50IHFsMnhtYXhsdW4gPSBNQVhfTFVOUzsKIG1vZHVsZV9wYXJhbShxbDJ4bWF4bHVuLCB1aW50LCBTX0lSVUdPKTsKQEAgLTE5NSw2ICsxOTUsMTkgQEAKIAkJIkRlZmluZXMgdGhlIG1heGltdW0gTFUgbnVtYmVyIHRvIHJlZ2lzdGVyIHdpdGggdGhlIFNDU0kgIgogCQkibWlkbGF5ZXIuIERlZmF1bHQgaXMgNjU1MzUuIik7CiAKK2ludCBxbDJ4bWRjYXBtYXNrID0gMHgxRjsKK21vZHVsZV9wYXJhbShxbDJ4bWRjYXBtYXNrLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4bWRjYXBtYXNrLAorCQkiU2V0IHRoZSBNaW5pZHVtcCBkcml2ZXIgY2FwdHVyZSBtYXNrIGxldmVsLiAiCisJCSJEZWZhdWx0IGlzIDB4N0YgLSBDYW4gYmUgc2V0IHRvIDB4MywgMHg3LCAweEYsIDB4MUYsIDB4N0YuIik7CisKK2ludCBxbDJ4bWRlbmFibGU7Cittb2R1bGVfcGFyYW0ocWwyeG1kZW5hYmxlLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4bWRlbmFibGUsCisJCSJFbmFibGUvZGlzYWJsZSBNaW5pRHVtcC4gIgorCQkiMCAoRGVmYXVsdCkgLSBNaW5pRHVtcCBkaXNhYmxlZC4gIgorCQkiMSAtIE1pbmlEdW1wIGVuYWJsZWQuIik7CisKIC8qCiAgKiBTQ1NJIGhvc3QgdGVtcGxhdGUgZW50cnkgcG9pbnRzCiAgKi8KQEAgLTE3NTAsOSArMTc2Myw5IEBACiAJLnJlYWRfbnZyYW0JCT0gcWxhMjR4eF9yZWFkX252cmFtX2RhdGEsCiAJLndyaXRlX252cmFtCQk9IHFsYTI0eHhfd3JpdGVfbnZyYW1fZGF0YSwKIAkuZndfZHVtcAkJPSBxbGEyNHh4X2Z3X2R1bXAsCi0JLmJlYWNvbl9vbgkJPSBxbGEyNHh4X2JlYWNvbl9vbiwKLQkuYmVhY29uX29mZgkJPSBxbGEyNHh4X2JlYWNvbl9vZmYsCi0JLmJlYWNvbl9ibGluawkJPSBxbGEyNHh4X2JlYWNvbl9ibGluaywKKwkuYmVhY29uX29uCQk9IHFsYTgyeHhfYmVhY29uX29uLAorCS5iZWFjb25fb2ZmCQk9IHFsYTgyeHhfYmVhY29uX29mZiwKKwkuYmVhY29uX2JsaW5rCQk9IE5VTEwsCiAJLnJlYWRfb3B0cm9tCQk9IHFsYTgyeHhfcmVhZF9vcHRyb21fZGF0YSwKIAkud3JpdGVfb3B0cm9tCQk9IHFsYTgyeHhfd3JpdGVfb3B0cm9tX2RhdGEsCiAJLmdldF9mbGFzaF92ZXJzaW9uCT0gcWxhMjR4eF9nZXRfZmxhc2hfdmVyc2lvbiwKQEAgLTI2NzAsNiArMjY4Myw4IEBACiAKIAlxbGEyeDAwX21lbV9mcmVlKGhhKTsKIAorCXFsYTgyeHhfbWRfZnJlZSh2aGEpOworCiAJcWxhMngwMF9mcmVlX3F1ZXVlcyhoYSk7CiB9CiAKQEAgLTM5MDMsOCArMzkxOCwxMSBAQAogCiAJLyogQ2hlY2sgaWYgYmVhY29uIExFRCBuZWVkcyB0byBiZSBibGlua2VkIGZvciBwaHlzaWNhbCBob3N0IG9ubHkgKi8KIAlpZiAoIXZoYS0+dnBfaWR4ICYmIChoYS0+YmVhY29uX2JsaW5rX2xlZCA9PSAxKSkgewotCQlzZXRfYml0KEJFQUNPTl9CTElOS19ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7Ci0JCXN0YXJ0X2RwYysrOworCQkvKiBUaGVyZSBpcyBubyBiZWFjb25fYmxpbmsgZnVuY3Rpb24gZm9yIElTUDgyeHggKi8KKwkJaWYgKCFJU19RTEE4MlhYKGhhKSkgeworCQkJc2V0X2JpdChCRUFDT05fQkxJTktfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCQkJc3RhcnRfZHBjKys7CisJCX0KIAl9CiAKIAkvKiBQcm9jZXNzIGFueSBkZWZlcnJlZCB3b3JrLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L0tjb25maWcKaW5kZXggMGY1NTk5ZS4uZjFhZDAyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCXRyaXN0YXRlICJRTG9naWMgSVNQNFhYWCBhbmQgSVNQODJYWCBob3N0IGFkYXB0ZXIgZmFtaWx5IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSSAmJiBORVQKIAlzZWxlY3QgU0NTSV9JU0NTSV9BVFRSUworCXNlbGVjdCBJU0NTSV9CT09UX1NZU0ZTCiAJLS0taGVscC0tLQogCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgNDB4eCAoSVNQNFhYWCkgYW5kIDgwMjIgKElTUDgyWFgpCiAJaVNDU0kgaG9zdCBhZGFwdGVyIGZhbWlseS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvTWFrZWZpbGUKaW5kZXggMjUyNTIzZC4uNWI0NDEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiBxbGE0eHh4LXkgOj0gcWw0X29zLm8gcWw0X2luaXQubyBxbDRfbWJ4Lm8gcWw0X2lvY2IubyBxbDRfaXNyLm8gXAotCQlxbDRfbngubyBxbDRfbnZyYW0ubyBxbDRfZGJnLm8gcWw0X2F0dHIubworCQlxbDRfbngubyBxbDRfbnZyYW0ubyBxbDRfZGJnLm8gcWw0X2F0dHIubyBxbDRfYnNnLm8KIAogb2JqLSQoQ09ORklHX1NDU0lfUUxBX0lTQ1NJKSArPSBxbGE0eHh4Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9hdHRyLmMKaW5kZXggODY0ZDAxOC4uMGIwYTdkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYXR0ci5jCkBAIC01NSwxNSArNTUsOTEgQEAKIAkJCWhhLT5ib290bG9hZF9wYXRjaCwgaGEtPmJvb3Rsb2FkX2J1aWxkKTsKIH0KIAorc3RhdGljIHNzaXplX3QKK3FsYTR4eHhfYm9hcmRfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDhYXG4iLCBoYS0+Ym9hcmRfaWQpOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhNHh4eF9md19zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChkZXYpKTsKKworCXFsYTR4eHhfZ2V0X2Zpcm13YXJlX3N0YXRlKGhhKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwOFglOFhcbiIsIGhhLT5maXJtd2FyZV9zdGF0ZSwKKwkJCWhhLT5hZGRsX2Z3X3N0YXRlKTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTR4eHhfcGh5X3BvcnRfY250X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGRldikpOworCisJaWYgKCFpc19xbGE4MDIyKGhhKSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwNFhcbiIsIGhhLT5waHlfcG9ydF9jbnQpOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhNHh4eF9waHlfcG9ydF9udW1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisKKwlpZiAoIWlzX3FsYTgwMjIoaGEpKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA0WFxuIiwgaGEtPnBoeV9wb3J0X251bSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGE0eHh4X2lzY3NpX2Z1bmNfY250X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGRldikpOworCisJaWYgKCFpc19xbGE4MDIyKGhhKSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwNFhcbiIsIGhhLT5pc2NzaV9wY2lfZnVuY19jbnQpOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhNHh4eF9oYmFfbW9kZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGRldikpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGhhLT5tb2RlbF9uYW1lKTsKK30KKwogc3RhdGljIERFVklDRV9BVFRSKGZ3X3ZlcnNpb24sIFNfSVJVR08sIHFsYTR4eHhfZndfdmVyc2lvbl9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzZXJpYWxfbnVtLCBTX0lSVUdPLCBxbGE0eHh4X3NlcmlhbF9udW1fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoaXNjc2lfdmVyc2lvbiwgU19JUlVHTywgcWxhNHh4eF9pc2NzaV92ZXJzaW9uX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKG9wdHJvbV92ZXJzaW9uLCBTX0lSVUdPLCBxbGE0eHh4X29wdHJvbV92ZXJzaW9uX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGJvYXJkX2lkLCBTX0lSVUdPLCBxbGE0eHh4X2JvYXJkX2lkX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGZ3X3N0YXRlLCBTX0lSVUdPLCBxbGE0eHh4X2Z3X3N0YXRlX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHBoeV9wb3J0X2NudCwgU19JUlVHTywgcWxhNHh4eF9waHlfcG9ydF9jbnRfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIocGh5X3BvcnRfbnVtLCBTX0lSVUdPLCBxbGE0eHh4X3BoeV9wb3J0X251bV9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihpc2NzaV9mdW5jX2NudCwgU19JUlVHTywgcWxhNHh4eF9pc2NzaV9mdW5jX2NudF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihoYmFfbW9kZWwsIFNfSVJVR08sIHFsYTR4eHhfaGJhX21vZGVsX3Nob3csIE5VTEwpOwogCiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqcWxhNHh4eF9ob3N0X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX2Z3X3ZlcnNpb24sCiAJJmRldl9hdHRyX3NlcmlhbF9udW0sCiAJJmRldl9hdHRyX2lzY3NpX3ZlcnNpb24sCiAJJmRldl9hdHRyX29wdHJvbV92ZXJzaW9uLAorCSZkZXZfYXR0cl9ib2FyZF9pZCwKKwkmZGV2X2F0dHJfZndfc3RhdGUsCisJJmRldl9hdHRyX3BoeV9wb3J0X2NudCwKKwkmZGV2X2F0dHJfcGh5X3BvcnRfbnVtLAorCSZkZXZfYXR0cl9pc2NzaV9mdW5jX2NudCwKKwkmZGV2X2F0dHJfaGJhX21vZGVsLAogCU5VTEwsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2RjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYnNnLmMKQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKiBRTG9naWMgaVNDU0kgSEJBIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDExIFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFNlZSBMSUNFTlNFLnFsYTR4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgInFsNF9kZWYuaCIKKyNpbmNsdWRlICJxbDRfZ2xibC5oIgorI2luY2x1ZGUgInFsNF9ic2cuaCIKKworc3RhdGljIGludAorcWxhNHh4eF9yZWFkX2ZsYXNoKHN0cnVjdCBic2dfam9iICpic2dfam9iKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBpc2NzaV9qb2JfdG9fc2hvc3QoYnNnX2pvYik7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoaG9zdCk7CisJc3RydWN0IGlzY3NpX2JzZ19yZXBseSAqYnNnX3JlcGx5ID0gYnNnX2pvYi0+cmVwbHk7CisJc3RydWN0IGlzY3NpX2JzZ19yZXF1ZXN0ICpic2dfcmVxID0gYnNnX2pvYi0+cmVxdWVzdDsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCXVpbnQzMl90IGxlbmd0aCA9IDA7CisJZG1hX2FkZHJfdCBmbGFzaF9kbWE7CisJdWludDhfdCAqZmxhc2ggPSBOVUxMOworCWludCBydmFsID0gLUVJTlZBTDsKKworCWJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKKworCWlmICh1bmxpa2VseShwY2lfY2hhbm5lbF9vZmZsaW5lKGhhLT5wZGV2KSkpCisJCWdvdG8gbGVhdmU7CisKKwlpZiAocWw0eHh4X3Jlc2V0X2FjdGl2ZShoYSkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogcmVzZXQgYWN0aXZlXG4iLCBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRUJVU1k7CisJCWdvdG8gbGVhdmU7CisJfQorCisJaWYgKGhhLT5mbGFzaF9zdGF0ZSAhPSBRTEZMQVNIX1dBSVRJTkcpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogYW5vdGhlciBmbGFzaCBvcGVyYXRpb24gIgorCQkJICAgImFjdGl2ZVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIGxlYXZlOworCX0KKworCWhhLT5mbGFzaF9zdGF0ZSA9IFFMRkxBU0hfUkVBRElORzsKKwlvZmZzZXQgPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsxXTsKKwlsZW5ndGggPSBic2dfam9iLT5yZXBseV9wYXlsb2FkLnBheWxvYWRfbGVuOworCisJZmxhc2ggPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGxlbmd0aCwgJmZsYXNoX2RtYSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWZsYXNoKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGRtYSBhbGxvYyBmYWlsZWQgZm9yIGZsYXNoICIKKwkJCSAgICJkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRU5PTUVNOworCQlnb3RvIGxlYXZlOworCX0KKworCXJ2YWwgPSBxbGE0eHh4X2dldF9mbGFzaChoYSwgZmxhc2hfZG1hLCBvZmZzZXQsIGxlbmd0aCk7CisJaWYgKHJ2YWwpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogZ2V0IGZsYXNoIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlic2dfcmVwbHktPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJcnZhbCA9IC1FSU87CisJfSBlbHNlIHsKKwkJYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQorCQkJc2dfY29weV9mcm9tX2J1ZmZlcihic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3QsCisJCQkJCSAgICBic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwKKwkJCQkJICAgIGZsYXNoLCBsZW5ndGgpOworCQlic2dfcmVwbHktPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwl9CisKKwlic2dfam9iX2RvbmUoYnNnX2pvYiwgYnNnX3JlcGx5LT5yZXN1bHQsCisJCSAgICAgYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4pOworCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBsZW5ndGgsIGZsYXNoLCBmbGFzaF9kbWEpOworbGVhdmU6CisJaGEtPmZsYXNoX3N0YXRlID0gUUxGTEFTSF9XQUlUSU5HOworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50CitxbGE0eHh4X3VwZGF0ZV9mbGFzaChzdHJ1Y3QgYnNnX2pvYiAqYnNnX2pvYikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaXNjc2lfam9iX3RvX3Nob3N0KGJzZ19qb2IpOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGhvc3QpOworCXN0cnVjdCBpc2NzaV9ic2dfcmVwbHkgKmJzZ19yZXBseSA9IGJzZ19qb2ItPnJlcGx5OworCXN0cnVjdCBpc2NzaV9ic2dfcmVxdWVzdCAqYnNnX3JlcSA9IGJzZ19qb2ItPnJlcXVlc3Q7CisJdWludDMyX3QgbGVuZ3RoID0gMDsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCXVpbnQzMl90IG9wdGlvbnMgPSAwOworCWRtYV9hZGRyX3QgZmxhc2hfZG1hOworCXVpbnQ4X3QgKmZsYXNoID0gTlVMTDsKKwlpbnQgcnZhbCA9IC1FSU5WQUw7CisKKwlic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CisKKwlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpKQorCQlnb3RvIGxlYXZlOworCisJaWYgKHFsNHh4eF9yZXNldF9hY3RpdmUoaGEpKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHJlc2V0IGFjdGl2ZVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIGxlYXZlOworCX0KKworCWlmIChoYS0+Zmxhc2hfc3RhdGUgIT0gUUxGTEFTSF9XQUlUSU5HKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGFub3RoZXIgZmxhc2ggb3BlcmF0aW9uICIKKwkJCSAgICJhY3RpdmVcbiIsIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FQlVTWTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwloYS0+Zmxhc2hfc3RhdGUgPSBRTEZMQVNIX1dSSVRJTkc7CisJbGVuZ3RoID0gYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuOworCW9mZnNldCA9IGJzZ19yZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzFdOworCW9wdGlvbnMgPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsyXTsKKworCWZsYXNoID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBsZW5ndGgsICZmbGFzaF9kbWEsCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFmbGFzaCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBkbWEgYWxsb2MgZmFpbGVkIGZvciBmbGFzaCAiCisJCQkgICAiZGF0YVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVOT01FTTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlzZ19jb3B5X3RvX2J1ZmZlcihic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdCwKKwkJCSAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgZmxhc2gsIGxlbmd0aCk7CisKKwlydmFsID0gcWxhNHh4eF9zZXRfZmxhc2goaGEsIGZsYXNoX2RtYSwgb2Zmc2V0LCBsZW5ndGgsIG9wdGlvbnMpOworCWlmIChydmFsKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHNldCBmbGFzaCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCXJ2YWwgPSAtRUlPOworCX0gZWxzZQorCQlic2dfcmVwbHktPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKworCWJzZ19qb2JfZG9uZShic2dfam9iLCBic2dfcmVwbHktPnJlc3VsdCwKKwkJICAgICBic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbik7CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGxlbmd0aCwgZmxhc2gsIGZsYXNoX2RtYSk7CitsZWF2ZToKKwloYS0+Zmxhc2hfc3RhdGUgPSBRTEZMQVNIX1dBSVRJTkc7CisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTR4eHhfZ2V0X2FjYl9zdGF0ZShzdHJ1Y3QgYnNnX2pvYiAqYnNnX2pvYikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaXNjc2lfam9iX3RvX3Nob3N0KGJzZ19qb2IpOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGhvc3QpOworCXN0cnVjdCBpc2NzaV9ic2dfcmVxdWVzdCAqYnNnX3JlcSA9IGJzZ19qb2ItPnJlcXVlc3Q7CisJc3RydWN0IGlzY3NpX2JzZ19yZXBseSAqYnNnX3JlcGx5ID0gYnNnX2pvYi0+cmVwbHk7CisJdWludDMyX3Qgc3RhdHVzW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBhY2JfaWR4OworCXVpbnQzMl90IGlwX2lkeDsKKwlpbnQgcnZhbCA9IC1FSU5WQUw7CisKKwlic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CisKKwlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpKQorCQlnb3RvIGxlYXZlOworCisJLyogT25seSA0MDIyIGFuZCBhYm92ZSBhZGFwdGVycyBhcmUgc3VwcG9ydGVkICovCisJaWYgKGlzX3FsYTQwMTAoaGEpKQorCQlnb3RvIGxlYXZlOworCisJaWYgKHFsNHh4eF9yZXNldF9hY3RpdmUoaGEpKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHJlc2V0IGFjdGl2ZVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIGxlYXZlOworCX0KKworCWlmIChic2dfam9iLT5yZXBseV9wYXlsb2FkLnBheWxvYWRfbGVuIDwgc2l6ZW9mKHN0YXR1cykpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogaW52YWxpZCBwYXlsb2FkIGxlbiAlZFxuIiwKKwkJCSAgIF9fZnVuY19fLCBic2dfam9iLT5yZXBseV9wYXlsb2FkLnBheWxvYWRfbGVuKTsKKwkJcnZhbCA9IC1FSU5WQUw7CisJCWdvdG8gbGVhdmU7CisJfQorCisJYWNiX2lkeCA9IGJzZ19yZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzFdOworCWlwX2lkeCA9IGJzZ19yZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzJdOworCisJcnZhbCA9IHFsYTR4eHhfZ2V0X2lwX3N0YXRlKGhhLCBhY2JfaWR4LCBpcF9pZHgsIHN0YXR1cyk7CisJaWYgKHJ2YWwpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogZ2V0IGlwIHN0YXRlIGZhaWxlZFxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCXJ2YWwgPSAtRUlPOworCX0gZWxzZSB7CisJCWJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0KKwkJCXNnX2NvcHlfZnJvbV9idWZmZXIoYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LAorCQkJCQkgICAgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsCisJCQkJCSAgICBzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJfQorCisJYnNnX2pvYl9kb25lKGJzZ19qb2IsIGJzZ19yZXBseS0+cmVzdWx0LAorCQkgICAgIGJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuKTsKK2xlYXZlOgorCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50CitxbGE0eHh4X3JlYWRfbnZyYW0oc3RydWN0IGJzZ19qb2IgKmJzZ19qb2IpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGlzY3NpX2pvYl90b19zaG9zdChic2dfam9iKTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChob3N0KTsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcXVlc3QgKmJzZ19yZXEgPSBic2dfam9iLT5yZXF1ZXN0OworCXN0cnVjdCBpc2NzaV9ic2dfcmVwbHkgKmJzZ19yZXBseSA9IGJzZ19qb2ItPnJlcGx5OworCXVpbnQzMl90IG9mZnNldCA9IDA7CisJdWludDMyX3QgbGVuID0gMDsKKwl1aW50MzJfdCB0b3RhbF9sZW4gPSAwOworCWRtYV9hZGRyX3QgbnZyYW1fZG1hOworCXVpbnQ4X3QgKm52cmFtID0gTlVMTDsKKwlpbnQgcnZhbCA9IC1FSU5WQUw7CisKKwlic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CisKKwlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpKQorCQlnb3RvIGxlYXZlOworCisJLyogT25seSA0MHh4IGFkYXB0ZXJzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAoIShpc19xbGE0MDEwKGhhKSB8fCBpc19xbGE0MDIyKGhhKSB8fCBpc19xbGE0MDMyKGhhKSkpCisJCWdvdG8gbGVhdmU7CisKKwlpZiAocWw0eHh4X3Jlc2V0X2FjdGl2ZShoYSkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogcmVzZXQgYWN0aXZlXG4iLCBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRUJVU1k7CisJCWdvdG8gbGVhdmU7CisJfQorCisJb2Zmc2V0ID0gYnNnX3JlcS0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9jbWRbMV07CisJbGVuID0gYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbjsKKwl0b3RhbF9sZW4gPSBvZmZzZXQgKyBsZW47CisKKwkvKiB0b3RhbCBsZW4gc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gbWF4IE5WUkFNIHNpemUgKi8KKwlpZiAoKGlzX3FsYTQwMTAoaGEpICYmIHRvdGFsX2xlbiA+IFFMNDAxMF9OVlJBTV9TSVpFKSB8fAorCSAgICAoKGlzX3FsYTQwMjIoaGEpIHx8IGlzX3FsYTQwMzIoaGEpKSAmJgorCSAgICAgdG90YWxfbGVuID4gUUw0MFgyX05WUkFNX1NJWkUpKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IG9mZnNldCtsZW4gZ3JlYXRlciB0aGFuIG1heCIKKwkJCSAgICIgbnZyYW0gc2l6ZSwgb2Zmc2V0PSVkIGxlbj0lZFxuIiwKKwkJCSAgIF9fZnVuY19fLCBvZmZzZXQsIGxlbik7CisJCWdvdG8gbGVhdmU7CisJfQorCisJbnZyYW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGxlbiwgJm52cmFtX2RtYSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW52cmFtKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGRtYSBhbGxvYyBmYWlsZWQgZm9yIG52cmFtICIKKwkJCSAgICJkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRU5PTUVNOworCQlnb3RvIGxlYXZlOworCX0KKworCXJ2YWwgPSBxbGE0eHh4X2dldF9udnJhbShoYSwgbnZyYW1fZG1hLCBvZmZzZXQsIGxlbik7CisJaWYgKHJ2YWwpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogZ2V0IG52cmFtIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlic2dfcmVwbHktPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJcnZhbCA9IC1FSU87CisJfSBlbHNlIHsKKwkJYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQorCQkJc2dfY29weV9mcm9tX2J1ZmZlcihic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3QsCisJCQkJCSAgICBic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwKKwkJCQkJICAgIG52cmFtLCBsZW4pOworCQlic2dfcmVwbHktPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwl9CisKKwlic2dfam9iX2RvbmUoYnNnX2pvYiwgYnNnX3JlcGx5LT5yZXN1bHQsCisJCSAgICAgYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4pOworCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBsZW4sIG52cmFtLCBudnJhbV9kbWEpOworbGVhdmU6CisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTR4eHhfdXBkYXRlX252cmFtKHN0cnVjdCBic2dfam9iICpic2dfam9iKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBpc2NzaV9qb2JfdG9fc2hvc3QoYnNnX2pvYik7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoaG9zdCk7CisJc3RydWN0IGlzY3NpX2JzZ19yZXF1ZXN0ICpic2dfcmVxID0gYnNnX2pvYi0+cmVxdWVzdDsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcGx5ICpic2dfcmVwbHkgPSBic2dfam9iLT5yZXBseTsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCXVpbnQzMl90IGxlbiA9IDA7CisJdWludDMyX3QgdG90YWxfbGVuID0gMDsKKwlkbWFfYWRkcl90IG52cmFtX2RtYTsKKwl1aW50OF90ICpudnJhbSA9IE5VTEw7CisJaW50IHJ2YWwgPSAtRUlOVkFMOworCisJYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCisJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKSkKKwkJZ290byBsZWF2ZTsKKworCWlmICghKGlzX3FsYTQwMTAoaGEpIHx8IGlzX3FsYTQwMjIoaGEpIHx8IGlzX3FsYTQwMzIoaGEpKSkKKwkJZ290byBsZWF2ZTsKKworCWlmIChxbDR4eHhfcmVzZXRfYWN0aXZlKGhhKSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiByZXNldCBhY3RpdmVcbiIsIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FQlVTWTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlvZmZzZXQgPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsxXTsKKwlsZW4gPSBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQucGF5bG9hZF9sZW47CisJdG90YWxfbGVuID0gb2Zmc2V0ICsgbGVuOworCisJLyogdG90YWwgbGVuIHNob3VsZCBub3QgYmUgZ3JlYXRlciB0aGFuIG1heCBOVlJBTSBzaXplICovCisJaWYgKChpc19xbGE0MDEwKGhhKSAmJiB0b3RhbF9sZW4gPiBRTDQwMTBfTlZSQU1fU0laRSkgfHwKKwkgICAgKChpc19xbGE0MDIyKGhhKSB8fCBpc19xbGE0MDMyKGhhKSkgJiYKKwkgICAgIHRvdGFsX2xlbiA+IFFMNDBYMl9OVlJBTV9TSVpFKSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBvZmZzZXQrbGVuIGdyZWF0ZXIgdGhhbiBtYXgiCisJCQkgICAiIG52cmFtIHNpemUsIG9mZnNldD0lZCBsZW49JWRcbiIsCisJCQkgICBfX2Z1bmNfXywgb2Zmc2V0LCBsZW4pOworCQlnb3RvIGxlYXZlOworCX0KKworCW52cmFtID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBsZW4sICZudnJhbV9kbWEsCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFudnJhbSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBkbWEgYWxsb2MgZmFpbGVkIGZvciBmbGFzaCAiCisJCQkgICAiZGF0YVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVOT01FTTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlzZ19jb3B5X3RvX2J1ZmZlcihic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdCwKKwkJCSAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgbnZyYW0sIGxlbik7CisKKwlydmFsID0gcWxhNHh4eF9zZXRfbnZyYW0oaGEsIG52cmFtX2RtYSwgb2Zmc2V0LCBsZW4pOworCWlmIChydmFsKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHNldCBudnJhbSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCXJ2YWwgPSAtRUlPOworCX0gZWxzZQorCQlic2dfcmVwbHktPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKworCWJzZ19qb2JfZG9uZShic2dfam9iLCBic2dfcmVwbHktPnJlc3VsdCwKKwkJICAgICBic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbik7CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGxlbiwgbnZyYW0sIG52cmFtX2RtYSk7CitsZWF2ZToKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIGludAorcWxhNHh4eF9yZXN0b3JlX2RlZmF1bHRzKHN0cnVjdCBic2dfam9iICpic2dfam9iKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBpc2NzaV9qb2JfdG9fc2hvc3QoYnNnX2pvYik7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoaG9zdCk7CisJc3RydWN0IGlzY3NpX2JzZ19yZXF1ZXN0ICpic2dfcmVxID0gYnNnX2pvYi0+cmVxdWVzdDsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcGx5ICpic2dfcmVwbHkgPSBic2dfam9iLT5yZXBseTsKKwl1aW50MzJfdCByZWdpb24gPSAwOworCXVpbnQzMl90IGZpZWxkMCA9IDA7CisJdWludDMyX3QgZmllbGQxID0gMDsKKwlpbnQgcnZhbCA9IC1FSU5WQUw7CisKKwlic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CisKKwlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpKQorCQlnb3RvIGxlYXZlOworCisJaWYgKGlzX3FsYTQwMTAoaGEpKQorCQlnb3RvIGxlYXZlOworCisJaWYgKHFsNHh4eF9yZXNldF9hY3RpdmUoaGEpKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHJlc2V0IGFjdGl2ZVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIGxlYXZlOworCX0KKworCXJlZ2lvbiA9IGJzZ19yZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzFdOworCWZpZWxkMCA9IGJzZ19yZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzJdOworCWZpZWxkMSA9IGJzZ19yZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzNdOworCisJcnZhbCA9IHFsYTR4eHhfcmVzdG9yZV9mYWN0b3J5X2RlZmF1bHRzKGhhLCByZWdpb24sIGZpZWxkMCwgZmllbGQxKTsKKwlpZiAocnZhbCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBzZXQgbnZyYW0gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWJzZ19yZXBseS0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlydmFsID0gLUVJTzsKKwl9IGVsc2UKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisKKwlic2dfam9iX2RvbmUoYnNnX2pvYiwgYnNnX3JlcGx5LT5yZXN1bHQsCisJCSAgICAgYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4pOworbGVhdmU6CisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTR4eHhfYnNnX2dldF9hY2Ioc3RydWN0IGJzZ19qb2IgKmJzZ19qb2IpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGlzY3NpX2pvYl90b19zaG9zdChic2dfam9iKTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChob3N0KTsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcXVlc3QgKmJzZ19yZXEgPSBic2dfam9iLT5yZXF1ZXN0OworCXN0cnVjdCBpc2NzaV9ic2dfcmVwbHkgKmJzZ19yZXBseSA9IGJzZ19qb2ItPnJlcGx5OworCXVpbnQzMl90IGFjYl90eXBlID0gMDsKKwl1aW50MzJfdCBsZW4gPSAwOworCWRtYV9hZGRyX3QgYWNiX2RtYTsKKwl1aW50OF90ICphY2IgPSBOVUxMOworCWludCBydmFsID0gLUVJTlZBTDsKKworCWJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKKworCWlmICh1bmxpa2VseShwY2lfY2hhbm5lbF9vZmZsaW5lKGhhLT5wZGV2KSkpCisJCWdvdG8gbGVhdmU7CisKKwkvKiBPbmx5IDQwMjIgYW5kIGFib3ZlIGFkYXB0ZXJzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAoaXNfcWxhNDAxMChoYSkpCisJCWdvdG8gbGVhdmU7CisKKwlpZiAocWw0eHh4X3Jlc2V0X2FjdGl2ZShoYSkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogcmVzZXQgYWN0aXZlXG4iLCBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRUJVU1k7CisJCWdvdG8gbGVhdmU7CisJfQorCisJYWNiX3R5cGUgPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsxXTsKKwlsZW4gPSBic2dfam9iLT5yZXBseV9wYXlsb2FkLnBheWxvYWRfbGVuOworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGspKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGludmFsaWQgYWNiIGxlbiAlZFxuIiwKKwkJCSAgIF9fZnVuY19fLCBsZW4pOworCQlydmFsID0gLUVJTlZBTDsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlhY2IgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGxlbiwgJmFjYl9kbWEsIEdGUF9LRVJORUwpOworCWlmICghYWNiKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGRtYSBhbGxvYyBmYWlsZWQgZm9yIGFjYiAiCisJCQkgICAiZGF0YVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVOT01FTTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlydmFsID0gcWxhNHh4eF9nZXRfYWNiKGhhLCBhY2JfZG1hLCBhY2JfdHlwZSwgbGVuKTsKKwlpZiAocnZhbCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBnZXQgYWNiIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlic2dfcmVwbHktPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJcnZhbCA9IC1FSU87CisJfSBlbHNlIHsKKwkJYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQorCQkJc2dfY29weV9mcm9tX2J1ZmZlcihic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3QsCisJCQkJCSAgICBic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwKKwkJCQkJICAgIGFjYiwgbGVuKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJfQorCisJYnNnX2pvYl9kb25lKGJzZ19qb2IsIGJzZ19yZXBseS0+cmVzdWx0LAorCQkgICAgIGJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgbGVuLCBhY2IsIGFjYl9kbWEpOworbGVhdmU6CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qKgorICogcWxhNHh4eF9wcm9jZXNzX3ZlbmRvcl9zcGVjaWZpYyAtIGhhbmRsZSB2ZW5kb3Igc3BlY2lmaWMgYnNnIHJlcXVlc3QKKyAqIEBqb2I6IGlzY3NpX2JzZ19qb2IgdG8gaGFuZGxlCisgKiovCitpbnQgcWxhNHh4eF9wcm9jZXNzX3ZlbmRvcl9zcGVjaWZpYyhzdHJ1Y3QgYnNnX2pvYiAqYnNnX2pvYikKK3sKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcGx5ICpic2dfcmVwbHkgPSBic2dfam9iLT5yZXBseTsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcXVlc3QgKmJzZ19yZXEgPSBic2dfam9iLT5yZXF1ZXN0OworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBpc2NzaV9qb2JfdG9fc2hvc3QoYnNnX2pvYik7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoaG9zdCk7CisKKwlzd2l0Y2ggKGJzZ19yZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzBdKSB7CisJY2FzZSBRTElTQ1NJX1ZORF9SRUFEX0ZMQVNIOgorCQlyZXR1cm4gcWxhNHh4eF9yZWFkX2ZsYXNoKGJzZ19qb2IpOworCisJY2FzZSBRTElTQ1NJX1ZORF9VUERBVEVfRkxBU0g6CisJCXJldHVybiBxbGE0eHh4X3VwZGF0ZV9mbGFzaChic2dfam9iKTsKKworCWNhc2UgUUxJU0NTSV9WTkRfR0VUX0FDQl9TVEFURToKKwkJcmV0dXJuIHFsYTR4eHhfZ2V0X2FjYl9zdGF0ZShic2dfam9iKTsKKworCWNhc2UgUUxJU0NTSV9WTkRfUkVBRF9OVlJBTToKKwkJcmV0dXJuIHFsYTR4eHhfcmVhZF9udnJhbShic2dfam9iKTsKKworCWNhc2UgUUxJU0NTSV9WTkRfVVBEQVRFX05WUkFNOgorCQlyZXR1cm4gcWxhNHh4eF91cGRhdGVfbnZyYW0oYnNnX2pvYik7CisKKwljYXNlIFFMSVNDU0lfVk5EX1JFU1RPUkVfREVGQVVMVFM6CisJCXJldHVybiBxbGE0eHh4X3Jlc3RvcmVfZGVmYXVsdHMoYnNnX2pvYik7CisKKwljYXNlIFFMSVNDU0lfVk5EX0dFVF9BQ0I6CisJCXJldHVybiBxbGE0eHh4X2JzZ19nZXRfYWNiKGJzZ19qb2IpOworCisJZGVmYXVsdDoKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogaW52YWxpZCBCU0cgdmVuZG9yIGNvbW1hbmQ6ICIKKwkJCSAgICIweCV4XG4iLCBfX2Z1bmNfXywgYnNnX3JlcS0+bXNnY29kZSk7CisJCWJzZ19yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CisJCWJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKKwkJYnNnX2pvYl9kb25lKGJzZ19qb2IsIGJzZ19yZXBseS0+cmVzdWx0LAorCQkJICAgICBic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbik7CisJCXJldHVybiAtRU5PU1lTOworCX0KK30KKworLyoqCisgKiBxbGE0eHh4X2JzZ19yZXF1ZXN0IC0gaGFuZGxlIGJzZyByZXF1ZXN0IGZyb20gSVNDU0kgdHJhbnNwb3J0CisgKiBAam9iOiBpc2NzaV9ic2dfam9iIHRvIGhhbmRsZQorICovCitpbnQgcWxhNHh4eF9ic2dfcmVxdWVzdChzdHJ1Y3QgYnNnX2pvYiAqYnNnX2pvYikKK3sKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcXVlc3QgKmJzZ19yZXEgPSBic2dfam9iLT5yZXF1ZXN0OworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBpc2NzaV9qb2JfdG9fc2hvc3QoYnNnX2pvYik7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoaG9zdCk7CisKKwlzd2l0Y2ggKGJzZ19yZXEtPm1zZ2NvZGUpIHsKKwljYXNlIElTQ1NJX0JTR19IU1RfVkVORE9SOgorCQlyZXR1cm4gcWxhNHh4eF9wcm9jZXNzX3ZlbmRvcl9zcGVjaWZpYyhic2dfam9iKTsKKworCWRlZmF1bHQ6CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGludmFsaWQgQlNHIGNvbW1hbmQ6IDB4JXhcbiIsCisJCQkgICBfX2Z1bmNfXywgYnNnX3JlcS0+bXNnY29kZSk7CisJfQorCisJcmV0dXJuIC1FTk9TWVM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYnNnLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYnNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhMDM2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYnNnLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIFFMb2dpYyBpU0NTSSBIQkEgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogU2VlIExJQ0VOU0UucWxhNHh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX1FMNF9CU0dfSAorI2RlZmluZSBfX1FMNF9CU0dfSAorCisvKiBCU0cgVmVuZG9yIHNwZWNpZmljIGNvbW1hbmRzICovCisjZGVmaW5lIFFMSVNDU0lfVk5EX1JFQURfRkxBU0gJCTEKKyNkZWZpbmUgUUxJU0NTSV9WTkRfVVBEQVRFX0ZMQVNICTIKKyNkZWZpbmUgUUxJU0NTSV9WTkRfR0VUX0FDQl9TVEFURQkzCisjZGVmaW5lIFFMSVNDU0lfVk5EX1JFQURfTlZSQU0JCTQKKyNkZWZpbmUgUUxJU0NTSV9WTkRfVVBEQVRFX05WUkFNCTUKKyNkZWZpbmUgUUxJU0NTSV9WTkRfUkVTVE9SRV9ERUZBVUxUUwk2CisjZGVmaW5lIFFMSVNDU0lfVk5EX0dFVF9BQ0IJCTcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmgKaW5kZXggNDczYzVjOC4uYWNlNjM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvYWVyLmg+CisjaW5jbHVkZSA8bGludXgvYnNnLWxpYi5oPgogCiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgpAQCAtMzMsOSArMzQsMTQgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2JzZ19pc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9uZXRsaW5rLmg+CisjaW5jbHVkZSA8c2NzaS9saWJpc2NzaS5oPgogCiAjaW5jbHVkZSAicWw0X2RiZy5oIgogI2luY2x1ZGUgInFsNF9ueC5oIgorI2luY2x1ZGUgInFsNF9mdy5oIgorI2luY2x1ZGUgInFsNF9udnJhbS5oIgogCiAjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDQwMTAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNDAxMAkweDQwMTAKQEAgLTEwOSw3ICsxMTUsNyBAQAogI2RlZmluZSBNQVhfQlVTRVMJCTEKICNkZWZpbmUgTUFYX1RBUkdFVFMJCU1BWF9ERVZfREJfRU5UUklFUwogI2RlZmluZSBNQVhfTFVOUwkJMHhmZmZmCi0jZGVmaW5lIE1BWF9BRU5fRU5UUklFUwkJMjU2IC8qIHNob3VsZCBiZSA+IEVYVF9ERUZfTUFYX0FFTl9RVUVVRSAqLworI2RlZmluZSBNQVhfQUVOX0VOVFJJRVMJCU1BWF9ERVZfREJfRU5UUklFUwogI2RlZmluZSBNQVhfRERCX0VOVFJJRVMJCU1BWF9ERVZfREJfRU5UUklFUwogI2RlZmluZSBNQVhfUERVX0VOVFJJRVMJCTMyCiAjZGVmaW5lIElOVkFMSURfRU5UUlkJCTB4RkZGRgpAQCAtMTY2LDYgKzE3Miw3IEBACiAjZGVmaW5lIFJFTE9HSU5fVE9WCQkJMTgKICNkZWZpbmUgSVNOU19ERVJFR19UT1YJCQk1CiAjZGVmaW5lIEhCQV9PTkxJTkVfVE9WCQkJMzAKKyNkZWZpbmUgRElTQUJMRV9BQ0JfVE9WCQkJMzAKIAogI2RlZmluZSBNQVhfUkVTRVRfSEFfUkVUUklFUwkJMgogCkBAIC0yMjcsNTIgKzIzNCwxMiBAQAogICogRGV2aWNlIERhdGFiYXNlIChEREIpIHN0cnVjdHVyZQogICovCiBzdHJ1Y3QgZGRiX2VudHJ5IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIGRkYiBsaXN0ICovCiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOwogCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2VzczsKIAlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm47CiAKLQlhdG9taWNfdCBzdGF0ZTsJCS8qIEREQiBTdGF0ZSAqLwotCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJLyogRERCIEZsYWdzICovCi0KIAl1aW50MTZfdCBmd19kZGJfaW5kZXg7CS8qIEREQiBmaXJtd2FyZSBpbmRleCAqLwotCXVpbnQxNl90IG9wdGlvbnM7CiAJdWludDMyX3QgZndfZGRiX2RldmljZV9zdGF0ZTsgLyogRi9XIERldmljZSBTdGF0ZSAgLS0gc2VlIHFsNF9mdy5oICovCi0KLQl1aW50MzJfdCBDbWRTbjsKLQl1aW50MTZfdCB0YXJnZXRfc2Vzc2lvbl9pZDsKLQl1aW50MTZfdCBjb25uZWN0aW9uX2lkOwotCXVpbnQxNl90IGV4ZV90aHJvdHRsZTsJLyogTWF4IG11bWJlciBvZiBjbWRzIG91dHN0YW5kaW5nCi0JCQkJICogc2ltdWx0YW5lb3VzbHkgKi8KLQl1aW50MTZfdCB0YXNrX21nbXRfdGltZW91dDsgLyogTWluIHRpbWUgZm9yIHRhc2sgbWdtdCBjbWRzIHRvCi0JCQkJICAgICAqIGNvbXBsZXRlICovCi0JdWludDE2X3QgZGVmYXVsdF9yZWxvZ2luX3RpbWVvdXQ7IC8qICBNYXggdGltZSB0byB3YWl0IGZvcgotCQkJCQkgICAqICByZWxvZ2luIHRvIGNvbXBsZXRlICovCi0JdWludDE2X3QgdGNwX3NvdXJjZV9wb3J0X251bTsKLQl1aW50MzJfdCBkZWZhdWx0X3RpbWUyd2FpdDsgLyogRGVmYXVsdCBNaW4gdGltZSBiZXR3ZWVuCi0JCQkJICAgICAqIHJlbG9naW5zICgrYWVucykgKi8KLQotCWF0b21pY190IHJldHJ5X3JlbG9naW5fdGltZXI7IC8qIE1pbiBUaW1lIGJldHdlZW4gcmVsb2dpbnMKLQkJCQkgICAgICAgKiAoNDAwMCBvbmx5KSAqLwotCWF0b21pY190IHJlbG9naW5fdGltZXI7CS8qIE1heCBUaW1lIHRvIHdhaXQgZm9yIHJlbG9naW4gdG8gY29tcGxldGUgKi8KLQlhdG9taWNfdCByZWxvZ2luX3JldHJ5X2NvdW50OyAvKiBOdW0gb2YgdGltZXMgcmVsb2dpbiBoYXMgYmVlbgotCQkJCSAgICAgICAqIHJldHJpZWQgKi8KLQotCXVpbnQxNl90IHBvcnQ7Ci0JdWludDMyX3QgdHBndDsKLQl1aW50OF90IGlwX2FkZHJbSVBfQUREUl9MRU5dOwotCXVpbnQ4X3QgaXNjc2lfbmFtZVtJU0NTSV9OQU1FX1NJWkVdOwkvKiA3MiB4NDggKi8KLQl1aW50OF90IGlzY3NpX2FsaWFzWzB4MjBdOwotCXVpbnQ4X3QgaXNpZFs2XTsKLQl1aW50MTZfdCBpc2NzaV9tYXhfYnVyc3RfbGVuOwotCXVpbnQxNl90IGlzY3NpX21heF9vdXRzbmRfcjJ0OwotCXVpbnQxNl90IGlzY3NpX2ZpcnN0X2J1cnN0X2xlbjsKLQl1aW50MTZfdCBpc2NzaV9tYXhfcmN2X2RhdGFfc2VnX2xlbjsKLQl1aW50MTZfdCBpc2NzaV9tYXhfc25kX2RhdGFfc2VnX2xlbjsKLQotCXN0cnVjdCBpbjZfYWRkciByZW1vdGVfaXB2Nl9hZGRyOwotCXN0cnVjdCBpbjZfYWRkciBsaW5rX2xvY2FsX2lwdjZfYWRkcjsKIH07CiAKIC8qCkBAIC0yOTMsOCArMjYwLDYgQEAKICNkZWZpbmUgREZfRk9fTUFTS0VECQkzCiAKIAotI2luY2x1ZGUgInFsNF9mdy5oIgotI2luY2x1ZGUgInFsNF9udnJhbS5oIgogCiBzdHJ1Y3QgcWw4Mnh4X2h3X2RhdGEgewogCS8qIE9mZnNldHMgZm9yIGZsYXNoL252cmFtIGFjY2VzcyAoc2V0IHRvIH4wIGlmIG5vdCB1c2VkKS4gKi8KQEAgLTMxMiw3ICsyNzcsMTAgQEAKIAl1aW50MzJfdCBmbHRfcmVnaW9uX2Jvb3Q7CiAJdWludDMyX3QgZmx0X3JlZ2lvbl9ib290bG9hZDsKIAl1aW50MzJfdCBmbHRfcmVnaW9uX2Z3OwotCXVpbnQzMl90IHJlc2VydmVkOworCisJdWludDMyX3QgZmx0X2lzY3NpX3BhcmFtOworCXVpbnQzMl90IGZsdF9yZWdpb25fY2hhcDsKKwl1aW50MzJfdCBmbHRfY2hhcF9zaXplOwogfTsKIAogc3RydWN0IHFsYTRfOHh4eF9sZWdhY3lfaW50cl9zZXQgewpAQCAtMzU3LDYgKzMyNSw2OCBAQAogCWludCAoKmdldF9zeXNfaW5mbykgKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwogfTsKIAorLypxbGE0eHh4IGlwYWRkcmVzcyBjb25maWd1cmF0aW9uIGRldGFpbHMgKi8KK3N0cnVjdCBpcGFkZHJlc3NfY29uZmlnIHsKKwl1aW50MTZfdCBpcHY0X29wdGlvbnM7CisJdWludDE2X3QgdGNwX29wdGlvbnM7CisJdWludDE2X3QgaXB2NF92bGFuX3RhZzsKKwl1aW50OF90IGlwdjRfYWRkcl9zdGF0ZTsKKwl1aW50OF90IGlwX2FkZHJlc3NbSVBfQUREUl9MRU5dOworCXVpbnQ4X3Qgc3VibmV0X21hc2tbSVBfQUREUl9MRU5dOworCXVpbnQ4X3QgZ2F0ZXdheVtJUF9BRERSX0xFTl07CisJdWludDMyX3QgaXB2Nl9vcHRpb25zOworCXVpbnQzMl90IGlwdjZfYWRkbF9vcHRpb25zOworCXVpbnQ4X3QgaXB2Nl9saW5rX2xvY2FsX3N0YXRlOworCXVpbnQ4X3QgaXB2Nl9hZGRyMF9zdGF0ZTsKKwl1aW50OF90IGlwdjZfYWRkcjFfc3RhdGU7CisJdWludDhfdCBpcHY2X2RlZmF1bHRfcm91dGVyX3N0YXRlOworCXVpbnQxNl90IGlwdjZfdmxhbl90YWc7CisJc3RydWN0IGluNl9hZGRyIGlwdjZfbGlua19sb2NhbF9hZGRyOworCXN0cnVjdCBpbjZfYWRkciBpcHY2X2FkZHIwOworCXN0cnVjdCBpbjZfYWRkciBpcHY2X2FkZHIxOworCXN0cnVjdCBpbjZfYWRkciBpcHY2X2RlZmF1bHRfcm91dGVyX2FkZHI7CisJdWludDE2X3QgZXRoX210dV9zaXplOworCXVpbnQxNl90IGlwdjRfcG9ydDsKKwl1aW50MTZfdCBpcHY2X3BvcnQ7Cit9OworCisjZGVmaW5lIFFMNF9DSEFQX01BWF9OQU1FX0xFTiAyNTYKKyNkZWZpbmUgUUw0X0NIQVBfTUFYX1NFQ1JFVF9MRU4gMTAwCisjZGVmaW5lIExPQ0FMX0NIQVAJMAorI2RlZmluZSBCSURJX0NIQVAJMQorCitzdHJ1Y3QgcWw0X2NoYXBfZm9ybWF0IHsKKwl1OCAgaW50cl9jaGFwX25hbWVbUUw0X0NIQVBfTUFYX05BTUVfTEVOXTsKKwl1OCAgaW50cl9zZWNyZXRbUUw0X0NIQVBfTUFYX1NFQ1JFVF9MRU5dOworCXU4ICB0YXJnZXRfY2hhcF9uYW1lW1FMNF9DSEFQX01BWF9OQU1FX0xFTl07CisJdTggIHRhcmdldF9zZWNyZXRbUUw0X0NIQVBfTUFYX1NFQ1JFVF9MRU5dOworCXUxNiBpbnRyX2NoYXBfbmFtZV9sZW5ndGg7CisJdTE2IGludHJfc2VjcmV0X2xlbmd0aDsKKwl1MTYgdGFyZ2V0X2NoYXBfbmFtZV9sZW5ndGg7CisJdTE2IHRhcmdldF9zZWNyZXRfbGVuZ3RoOworfTsKKworc3RydWN0IGlwX2FkZHJlc3NfZm9ybWF0IHsKKwl1OCBpcF90eXBlOworCXU4IGlwX2FkZHJlc3NbMTZdOworfTsKKworc3RydWN0CXFsNF9jb25uX2luZm8geworCXUxNglkZXN0X3BvcnQ7CisJc3RydWN0CWlwX2FkZHJlc3NfZm9ybWF0IGRlc3RfaXBhZGRyOworCXN0cnVjdAlxbDRfY2hhcF9mb3JtYXQgY2hhcDsKK307CisKK3N0cnVjdCBxbDRfYm9vdF9zZXNzaW9uX2luZm8geworCXU4CXRhcmdldF9uYW1lWzIyNF07CisJc3RydWN0CXFsNF9jb25uX2luZm8gY29ubl9saXN0WzFdOworfTsKKworc3RydWN0IHFsNF9ib290X3RndF9pbmZvIHsKKwlzdHJ1Y3QgcWw0X2Jvb3Rfc2Vzc2lvbl9pbmZvIGJvb3RfcHJpX3Nlc3M7CisJc3RydWN0IHFsNF9ib290X3Nlc3Npb25faW5mbyBib290X3NlY19zZXNzOworfTsKKwogLyoKICAqIExpbnV4IEhvc3QgQWRhcHRlciBzdHJ1Y3R1cmUKICAqLwpAQCAtNDUxLDEwICs0ODEsNiBAQAogCS8qIC0tLSBGcm9tIEluaXRfRlcgLS0tICovCiAJLyogaW5pdF9jYl90ICppbml0X2NiOyAqLwogCXVpbnQxNl90IGZpcm13YXJlX29wdGlvbnM7Ci0JdWludDE2X3QgdGNwX29wdGlvbnM7Ci0JdWludDhfdCBpcF9hZGRyZXNzW0lQX0FERFJfTEVOXTsKLQl1aW50OF90IHN1Ym5ldF9tYXNrW0lQX0FERFJfTEVOXTsKLQl1aW50OF90IGdhdGV3YXlbSVBfQUREUl9MRU5dOwogCXVpbnQ4X3QgYWxpYXNbMzJdOwogCXVpbnQ4X3QgbmFtZV9zdHJpbmdbMjU2XTsKIAl1aW50OF90IGhlYXJ0YmVhdF9pbnRlcnZhbDsKQEAgLTQ2Miw3ICs0ODgsNyBAQAogCS8qIC0tLSBGcm9tIEZsYXNoU3lzSW5mbyAtLS0gKi8KIAl1aW50OF90IG15X21hY1tNQUNfQUREUl9MRU5dOwogCXVpbnQ4X3Qgc2VyaWFsX251bWJlclsxNl07Ci0KKwl1aW50MTZfdCBwb3J0X251bTsKIAkvKiAtLS0gRnJvbSBHZXRGd1N0YXRlIC0tLSAqLwogCXVpbnQzMl90IGZpcm13YXJlX3N0YXRlOwogCXVpbnQzMl90IGFkZGxfZndfc3RhdGU7CkBAIC01MjQsMzEgKzU1MCwxMyBAQAogCXZvbGF0aWxlIHVpbnQ4X3QgbWJveF9zdGF0dXNfY291bnQ7CiAJdm9sYXRpbGUgdWludDMyX3QgbWJveF9zdGF0dXNbTUJPWF9SRUdfQ09VTlRdOwogCi0JLyogbG9jYWwgZGV2aWNlIGRhdGFiYXNlIGxpc3QgKGNvbnRhaW5zIGludGVybmFsIGRkYiBlbnRyaWVzKSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZGRiX2xpc3Q7Ci0KLQkvKiBNYXAgZGRiX2xpc3QgZW50cnkgYnkgRlcgZGRiIGluZGV4ICovCisJLyogRlcgZGRiIGluZGV4IG1hcCAqLwogCXN0cnVjdCBkZGJfZW50cnkgKmZ3X2RkYl9pbmRleF9tYXBbTUFYX0REQl9FTlRSSUVTXTsKIAogCS8qIFNhdmVkIHNyYiBmb3Igc3RhdHVzIGNvbnRpbnVhdGlvbiBlbnRyeSBwcm9jZXNzaW5nICovCiAJc3RydWN0IHNyYiAqc3RhdHVzX3NyYjsKIAotCS8qIElQdjYgc3VwcG9ydCBpbmZvIGZyb20gSW5pdEZXICovCiAJdWludDhfdCBhY2JfdmVyc2lvbjsKLQl1aW50OF90IGlwdjRfYWRkcl9zdGF0ZTsKLQl1aW50MTZfdCBpcHY0X29wdGlvbnM7Ci0KLQl1aW50MzJfdCByZXN2ZDI7Ci0JdWludDMyX3QgaXB2Nl9vcHRpb25zOwotCXVpbnQzMl90IGlwdjZfYWRkbF9vcHRpb25zOwotCXVpbnQ4X3QgaXB2Nl9saW5rX2xvY2FsX3N0YXRlOwotCXVpbnQ4X3QgaXB2Nl9hZGRyMF9zdGF0ZTsKLQl1aW50OF90IGlwdjZfYWRkcjFfc3RhdGU7Ci0JdWludDhfdCBpcHY2X2RlZmF1bHRfcm91dGVyX3N0YXRlOwotCXN0cnVjdCBpbjZfYWRkciBpcHY2X2xpbmtfbG9jYWxfYWRkcjsKLQlzdHJ1Y3QgaW42X2FkZHIgaXB2Nl9hZGRyMDsKLQlzdHJ1Y3QgaW42X2FkZHIgaXB2Nl9hZGRyMTsKLQlzdHJ1Y3QgaW42X2FkZHIgaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyOwogCiAJLyogcWxhODJ4eCBzcGVjaWZpYyBmaWVsZHMgKi8KIAlzdHJ1Y3QgZGV2aWNlX3JlZ184Mnh4ICBfX2lvbWVtICpxbGE0Xzh4eHhfcmVnOyAvKiBCYXNlIEkvTyBhZGRyZXNzICovCkBAIC01ODQsNiArNTkyLDExIEBACiAKIAlzdHJ1Y3QgY29tcGxldGlvbiBtYnhfaW50cl9jb21wOwogCisJc3RydWN0IGlwYWRkcmVzc19jb25maWcgaXBfY29uZmlnOworCXN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2VfaXB2NDsKKwlzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlmYWNlX2lwdjZfMDsKKwlzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlmYWNlX2lwdjZfMTsKKwogCS8qIC0tLSBGcm9tIEFib3V0IEZpcm13YXJlIC0tLSAqLwogCXVpbnQxNl90IGlzY3NpX21ham9yOwogCXVpbnQxNl90IGlzY3NpX21pbm9yOwpAQCAtNTkxLDE2ICs2MDQsNjAgQEAKIAl1aW50MTZfdCBib290bG9hZF9taW5vcjsKIAl1aW50MTZfdCBib290bG9hZF9wYXRjaDsKIAl1aW50MTZfdCBib290bG9hZF9idWlsZDsKKworCXVpbnQzMl90IGZsYXNoX3N0YXRlOworI2RlZmluZQlRTEZMQVNIX1dBSVRJTkcJCTAKKyNkZWZpbmUJUUxGTEFTSF9SRUFESU5HCQkxCisjZGVmaW5lCVFMRkxBU0hfV1JJVElORwkJMgorCXN0cnVjdCBkbWFfcG9vbCAqY2hhcF9kbWFfcG9vbDsKKwl1aW50OF90ICpjaGFwX2xpc3Q7IC8qIENIQVAgdGFibGUgY2FjaGUgKi8KKwlzdHJ1Y3QgbXV0ZXggIGNoYXBfc2VtOworI2RlZmluZSBDSEFQX0RNQV9CTE9DS19TSVpFICAgIDUxMgorCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp0YXNrX3dxOworCXVuc2lnbmVkIGxvbmcgZGRiX2lkeF9tYXBbTUFYX0REQl9FTlRSSUVTIC8gQklUU19QRVJfTE9OR107CisjZGVmaW5lIFNZU0ZTX0ZMQUdfRldfU0VMX0JPT1QgMgorCXN0cnVjdCBpc2NzaV9ib290X2tzZXQgKmJvb3Rfa3NldDsKKwlzdHJ1Y3QgcWw0X2Jvb3RfdGd0X2luZm8gYm9vdF90Z3Q7CisJdWludDE2X3QgcGh5X3BvcnRfbnVtOworCXVpbnQxNl90IHBoeV9wb3J0X2NudDsKKwl1aW50MTZfdCBpc2NzaV9wY2lfZnVuY19jbnQ7CisJdWludDhfdCBtb2RlbF9uYW1lWzE2XTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkaXNhYmxlX2FjYl9jb21wOworfTsKKworc3RydWN0IHFsNF90YXNrX2RhdGEgeworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwl1aW50OF90IGlvY2JfcmVxX2NudDsKKwlkbWFfYWRkcl90IGRhdGFfZG1hOworCXZvaWQgKnJlcV9idWZmZXI7CisJZG1hX2FkZHJfdCByZXFfZG1hOworCXVpbnQzMl90IHJlcV9sZW47CisJdm9pZCAqcmVzcF9idWZmZXI7CisJZG1hX2FkZHJfdCByZXNwX2RtYTsKKwl1aW50MzJfdCByZXNwX2xlbjsKKwlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKKwlzdHJ1Y3QgcGFzc3RocnVfc3RhdHVzIHN0czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGFza193b3JrOworfTsKKworc3RydWN0IHFsYV9lbmRwb2ludCB7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3Qgc29ja2FkZHIgZHN0X2FkZHI7Cit9OworCitzdHJ1Y3QgcWxhX2Nvbm4geworCXN0cnVjdCBxbGFfZW5kcG9pbnQgKnFsYV9lcDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2lwdjRfZW5hYmxlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0JcmV0dXJuICgoaGEtPmlwdjRfb3B0aW9ucyAmIElQT1BUX0lQdjRfUFJPVE9DT0xfRU5BQkxFKSAhPSAwKTsKKwlyZXR1cm4gKChoYS0+aXBfY29uZmlnLmlwdjRfb3B0aW9ucyAmIElQT1BUX0lQVjRfUFJPVE9DT0xfRU5BQkxFKSAhPSAwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXNfaXB2Nl9lbmFibGVkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlyZXR1cm4gKChoYS0+aXB2Nl9vcHRpb25zICYgSVBWNl9PUFRfSVBWNl9QUk9UT0NPTF9FTkFCTEUpICE9IDApOworCXJldHVybiAoKGhhLT5pcF9jb25maWcuaXB2Nl9vcHRpb25zICYKKwkJSVBWNl9PUFRfSVBWNl9QUk9UT0NPTF9FTkFCTEUpICE9IDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpc19xbGE0MDEwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKQEAgLTYxOCw2ICs2NzUsMTEgQEAKIAlyZXR1cm4gaGEtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A0MDMyOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19xbGE0MFhYKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlyZXR1cm4gaXNfcWxhNDAzMihoYSkgfHwgaXNfcWxhNDAyMihoYSkgfHwgaXNfcWxhNDAxMChoYSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGlzX3FsYTgwMjIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCXJldHVybiBoYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMjI7CkBAIC02NDAsNyArNzAyLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCogdG9fcWxhX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0JcmV0dXJuIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKXNob3N0LT5ob3N0ZGF0YTsKKwlyZXR1cm4gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0qIGlzcF9zZW1hcGhvcmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQpAQCAtNzYwLDYgKzgyMiwxNiBAQAogCQlxbDR4eHhfc2VtX3VubG9jayhhLCBRTDQwMjJfRFJWUl9TRU1fTUFTSyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHFsNHh4eF9yZXNldF9hY3RpdmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXJldHVybiB0ZXN0X2JpdChEUENfUkVTRVRfQUNUSVZFLCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgICAgdGVzdF9iaXQoRFBDX1JFVFJZX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBX0lOVFIsICZoYS0+ZHBjX2ZsYWdzKSB8fAorCSAgICAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEFfRldfQ09OVEVYVCwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgICAgIHRlc3RfYml0KERQQ19IQV9VTlJFQ09WRVJBQkxFLCAmaGEtPmRwY19mbGFncyk7CisKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogRGVmaW5lcyBmb3IgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoKSBhbmQgcWxhNHh4eF9yZWNvdmVyX2FkYXB0ZXIoKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZncuaAppbmRleCAwMTA4MmFhLi5jYmQ1YTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZncuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZncuaApAQCAtMTQ2LDYgKzE0NiwxMyBAQAogI2RlZmluZSBRTDQwMjJfTlZSQU1fU0VNX01BU0sJKFFMNDAyMl9SRVNPVVJDRV9NQVNLX0JBU0VfQ09ERSA8PCAoMTArMTYpKQogI2RlZmluZSBRTDQwMjJfRkxBU0hfU0VNX01BU0sJKFFMNDAyMl9SRVNPVVJDRV9NQVNLX0JBU0VfQ09ERSA8PCAoMTMrMTYpKQogCisvKiBudnJhbSBhZGRyZXNzIGZvciA0MDMyICovCisjZGVmaW5lIE5WUkFNX1BPUlQwX0JPT1RfTU9ERQkJMHgwM2IxCisjZGVmaW5lIE5WUkFNX1BPUlQwX0JPT1RfUFJJX1RHVAkweDAzYjIKKyNkZWZpbmUgTlZSQU1fUE9SVDBfQk9PVF9TRUNfVEdUCTB4MDNiYgorI2RlZmluZSBOVlJBTV9QT1JUMV9CT09UX01PREUJCTB4MDdiMQorI2RlZmluZSBOVlJBTV9QT1JUMV9CT09UX1BSSV9UR1QJMHgwN2IyCisjZGVmaW5lIE5WUkFNX1BPUlQxX0JPT1RfU0VDX1RHVAkweDA3YmIKIAogCiAvKiBQYWdlICMgZGVmaW5lcyBmb3IgNDAyMiAqLwpAQCAtMTk0LDYgKzIwMSw5IEBACiAvKiBJU1AgNDAyMiBudnJhbSBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBOVlJfV1JJVEVfRU5BQkxFCQkJMHgwMDAwMDAxMAkvKiA0MDIyICovCiAKKyNkZWZpbmUgUUw0MDEwX05WUkFNX1NJWkUJCQkweDIwMAorI2RlZmluZSBRTDQwWDJfTlZSQU1fU0laRQkJCTB4ODAwCisKIC8qICBJU1AgcG9ydF9zdGF0dXMgZGVmaW5pdGlvbnMgKi8KIAogLyogIElTUCBTZW1hcGhvcmUgZGVmaW5pdGlvbnMgKi8KQEAgLTI0MSw2ICsyNTEsOCBAQAogI2RlZmluZSBGQV9CT09UX0NPREVfQUREUl84MgkJMHgyMDAwMAogI2RlZmluZSBGQV9SSVNDX0NPREVfQUREUl84MgkJMHg0MDAwMAogI2RlZmluZSBGQV9HT0xEX1JJU0NfQ09ERV9BRERSXzgyCTB4ODAwMDAKKyNkZWZpbmUgRkFfRkxBU0hfSVNDU0lfQ0hBUAkJMHg1NDAwMDAKKyNkZWZpbmUgRkFfRkxBU0hfQ0hBUF9TSVpFCQkweEMwMDAwCiAKIC8qIEZsYXNoIERlc2NyaXB0aW9uIFRhYmxlICovCiBzdHJ1Y3QgcWxhX2ZkdF9sYXlvdXQgewpAQCAtMjk2LDggKzMwOCwxMSBAQAogI2RlZmluZSBGTFRfUkVHX0ZMVAkJMHgxYwogI2RlZmluZSBGTFRfUkVHX0JPT1RMT0FEXzgyCTB4NzIKICNkZWZpbmUgRkxUX1JFR19GV184MgkJMHg3NAorI2RlZmluZSBGTFRfUkVHX0ZXXzgyXzEJCTB4OTcKICNkZWZpbmUgRkxUX1JFR19HT0xEX0ZXXzgyCTB4NzUKICNkZWZpbmUgRkxUX1JFR19CT09UX0NPREVfODIJMHg3OAorI2RlZmluZSBGTFRfUkVHX0lTQ1NJX1BBUkFNCTB4NjUKKyNkZWZpbmUgRkxUX1JFR19JU0NTSV9DSEFQCTB4NjMKIAogc3RydWN0IHFsYV9mbHRfcmVnaW9uIHsKIAl1aW50MzJfdCBjb2RlOwpAQCAtMzMxLDkgKzM0NiwxMSBAQAogI2RlZmluZSBNQk9YX0NNRF9XUklURV9GTEFTSAkJCTB4MDAyNQogI2RlZmluZSBNQk9YX0NNRF9SRUFEX0ZMQVNICQkJMHgwMDI2CiAjZGVmaW5lIE1CT1hfQ01EX0NMRUFSX0RBVEFCQVNFX0VOVFJZCQkweDAwMzEKKyNkZWZpbmUgTUJPWF9DTURfQ09OTl9PUEVOCQkJMHgwMDc0CiAjZGVmaW5lIE1CT1hfQ01EX0NPTk5fQ0xPU0VfU0VTU19MT0dPVVQJCTB4MDA1NgotI2RlZmluZSBMT0dPVVRfT1BUSU9OX0NMT1NFX1NFU1NJT04JCTB4MDEKLSNkZWZpbmUgTE9HT1VUX09QVElPTl9SRUxPR0lOCQkJMHgwMgorI2RlZmluZSBMT0dPVVRfT1BUSU9OX0NMT1NFX1NFU1NJT04JCTB4MDAwMgorI2RlZmluZSBMT0dPVVRfT1BUSU9OX1JFTE9HSU4JCQkweDAwMDQKKyNkZWZpbmUgTE9HT1VUX09QVElPTl9GUkVFX0REQgkJCTB4MDAwOAogI2RlZmluZSBNQk9YX0NNRF9FWEVDVVRFX0lPQ0JfQTY0CQkweDAwNUEKICNkZWZpbmUgTUJPWF9DTURfSU5JVElBTElaRV9GSVJNV0FSRQkJMHgwMDYwCiAjZGVmaW5lIE1CT1hfQ01EX0dFVF9JTklUX0ZXX0NUUkxfQkxPQ0sJCTB4MDA2MQpAQCAtMzQyLDEyICszNTksMTUgQEAKICNkZWZpbmUgTUJPWF9DTURfR0VUX0RBVEFCQVNFX0VOVFJZCQkweDAwNjQKICNkZWZpbmUgRERCX0RTX1VOQVNTSUdORUQJCQkweDAwCiAjZGVmaW5lIEREQl9EU19OT19DT05ORUNUSU9OX0FDVElWRQkJMHgwMQorI2RlZmluZSBEREJfRFNfRElTQ09WRVJZCQkJMHgwMgogI2RlZmluZSBEREJfRFNfU0VTU0lPTl9BQ1RJVkUJCQkweDA0CiAjZGVmaW5lIEREQl9EU19TRVNTSU9OX0ZBSUxFRAkJCTB4MDYKICNkZWZpbmUgRERCX0RTX0xPR0lOX0lOX1BST0NFU1MJCQkweDA3CiAjZGVmaW5lIE1CT1hfQ01EX0dFVF9GV19TVEFURQkJCTB4MDA2OQogI2RlZmluZSBNQk9YX0NNRF9HRVRfSU5JVF9GV19DVFJMX0JMT0NLX0RFRkFVTFRTIDB4MDA2QQogI2RlZmluZSBNQk9YX0NNRF9HRVRfU1lTX0lORk8JCQkweDAwNzgKKyNkZWZpbmUgTUJPWF9DTURfR0VUX05WUkFNCQkJMHgwMDc4CS8qIEZvciA0MHh4ICovCisjZGVmaW5lIE1CT1hfQ01EX1NFVF9OVlJBTQkJCTB4MDA3OQkvKiBGb3IgNDB4eCAqLwogI2RlZmluZSBNQk9YX0NNRF9SRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFMJMHgwMDg3CiAjZGVmaW5lIE1CT1hfQ01EX1NFVF9BQ0IJCQkweDAwODgKICNkZWZpbmUgTUJPWF9DTURfR0VUX0FDQgkJCTB4MDA4OQpAQCAtMzc1LDcgKzM5NSwxMCBAQAogI2RlZmluZSBGV19BRERTVEFURV9ESENQdjRfTEVBU0VfRVhQSVJFRAkweDAwMDgKICNkZWZpbmUgRldfQUREU1RBVEVfTElOS19VUAkJCTB4MDAxMAogI2RlZmluZSBGV19BRERTVEFURV9JU05TX1NWQ19FTkFCTEVECQkweDAwMjAKKwogI2RlZmluZSBNQk9YX0NNRF9HRVRfREFUQUJBU0VfRU5UUllfREVGQVVMVFMJMHgwMDZCCisjZGVmaW5lIElQVjZfREVGQVVMVF9EREJfRU5UUlkJCQkweDAwMDEKKwogI2RlZmluZSBNQk9YX0NNRF9DT05OX09QRU5fU0VTU19MT0dJTgkJMHgwMDc0CiAjZGVmaW5lIE1CT1hfQ01EX0dFVF9DUkFTSF9SRUNPUkQJCTB4MDA3NgkvKiA0MDEwIG9ubHkgKi8KICNkZWZpbmUgTUJPWF9DTURfR0VUX0NPTk5fRVZFTlRfTE9HCQkweDAwNzcKQEAgLTQzNCw2ICs0NTcsMTQgQEAKICNkZWZpbmUgQUNCX1NUQVRFX1ZBTElECQkweDA1CiAjZGVmaW5lIEFDQl9TVEFURV9ESVNBQkxJTkcJMHgwNgogCisvKiBGTEFTSCBvZmZzZXRzICovCisjZGVmaW5lIEZMQVNIX1NFR01FTlRfSUZDQgkweDA0MDAwMDAwCisKKyNkZWZpbmUgRkxBU0hfT1BUX1JNV19IT0xECTAKKyNkZWZpbmUgRkxBU0hfT1BUX1JNV19JTklUCTEKKyNkZWZpbmUgRkxBU0hfT1BUX0NPTU1JVAkyCisjZGVmaW5lIEZMQVNIX09QVF9STVdfQ09NTUlUCTMKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEhvc3QgQWRhcHRlciBJbml0aWFsaXphdGlvbiBDb250cm9sIEJsb2NrIChmcm9tIGhvc3QpICovCkBAIC00NTUsNyArNDg2LDggQEAKIAl1aW50OF90IHJlczA7CS8qIDA3ICovCiAJdWludDE2X3QgZXRoX210dV9zaXplOwkvKiAwOC0wOSAqLwogCXVpbnQxNl90IGFkZF9md19vcHRpb25zOwkvKiAwQS0wQiAqLwotI2RlZmluZSBTRVJJQUxJWkVfVEFTS19NR01UCQkweDA0MDAKKyNkZWZpbmUgQURGV09QVF9TRVJJQUxJWkVfVEFTS19NR01UCTB4MDQwMAorI2RlZmluZSBBREZXT1BUX0FVVE9DT05OX0RJU0FCTEUJMHgwMDAyCiAKIAl1aW50OF90IGhiX2ludGVydmFsOwkvKiAwQyAqLwogCXVpbnQ4X3QgaW5zdF9udW07IC8qIDBEICovCkBAIC00NzMsOCArNTA1LDEwIEBACiAKIAl1aW50MTZfdCBpc2NzaV9vcHRzOwkvKiAzMC0zMSAqLwogCXVpbnQxNl90IGlwdjRfdGNwX29wdHM7CS8qIDMyLTMzICovCisjZGVmaW5lIFRDUE9QVF9ESENQX0VOQUJMRQkJMHgwMjAwCiAJdWludDE2X3QgaXB2NF9pcF9vcHRzOwkvKiAzNC0zNSAqLwotI2RlZmluZSAgSVBPUFRfSVB2NF9QUk9UT0NPTF9FTkFCTEUJMHg4MDAwCisjZGVmaW5lIElQT1BUX0lQVjRfUFJPVE9DT0xfRU5BQkxFCTB4ODAwMAorI2RlZmluZSBJUE9QVF9WTEFOX1RBR0dJTkdfRU5BQkxFCTB4MjAwMAogCiAJdWludDE2X3QgaXNjc2lfbWF4X3BkdV9zaXplOwkvKiAzNi0zNyAqLwogCXVpbnQ4X3QgaXB2NF90b3M7CS8qIDM4ICovCkBAIC01MjYsNiArNTYwLDcgQEAKIAl1aW50MTZfdCBpcHY2X3BvcnQ7CS8qIDIwNC0yMDUgKi8KIAl1aW50MTZfdCBpcHY2X29wdHM7CS8qIDIwNi0yMDcgKi8KICNkZWZpbmUgSVBWNl9PUFRfSVBWNl9QUk9UT0NPTF9FTkFCTEUJMHg4MDAwCisjZGVmaW5lIElQVjZfT1BUX1ZMQU5fVEFHR0lOR19FTkFCTEUJMHgyMDAwCiAKIAl1aW50MTZfdCBpcHY2X2FkZHRsX29wdHM7CS8qIDIwOC0yMDkgKi8KICNkZWZpbmUgSVBWNl9BRERPUFRfTkVJR0hCT1JfRElTQ09WRVJZX0FERFJfRU5BQkxFCTB4MDAwMiAvKiBQcmkgQUNCCkBAIC01NzQsMTMgKzYwOSwxMDUgQEAKIC8qCXN0cnVjdCBhZGRyX2N0cmxfYmxrIHNlYzsqLwogfTsKIAorI2RlZmluZSBQUklNQVJJX0FDQgkJMAorI2RlZmluZSBTRUNPTkRBUllfQUNCCQkxCisKK3N0cnVjdCBhZGRyX2N0cmxfYmxrX2RlZiB7CisJdWludDhfdCByZXNlcnZlZDFbMV07CS8qIDAwICovCisJdWludDhfdCBjb250cm9sOwkvKiAwMSAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQyWzExXTsJLyogMDItMEMgKi8KKwl1aW50OF90IGluc3RfbnVtOwkvKiAwRCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQzWzM0XTsJLyogMEUtMkYgKi8KKwl1aW50MTZfdCBpc2NzaV9vcHRzOwkvKiAzMC0zMSAqLworCXVpbnQxNl90IGlwdjRfdGNwX29wdHM7CS8qIDMyLTMzICovCisJdWludDE2X3QgaXB2NF9pcF9vcHRzOwkvKiAzNC0zNSAqLworCXVpbnQxNl90IGlzY3NpX21heF9wZHVfc2l6ZTsJLyogMzYtMzcgKi8KKwl1aW50OF90IGlwdjRfdG9zOwkvKiAzOCAqLworCXVpbnQ4X3QgaXB2NF90dGw7CS8qIDM5ICovCisJdWludDhfdCByZXNlcnZlZDRbMl07CS8qIDNBLTNCICovCisJdWludDE2X3QgZGVmX3RpbWVvdXQ7CS8qIDNDLTNEICovCisJdWludDE2X3QgaXNjc2lfZmJ1cnN0X2xlbjsJLyogM0UtM0YgKi8KKwl1aW50OF90IHJlc2VydmVkNVs0XTsJLyogNDAtNDMgKi8KKwl1aW50MTZfdCBpc2NzaV9tYXhfb3V0c3RuZF9yMnQ7CS8qIDQ0LTQ1ICovCisJdWludDhfdCByZXNlcnZlZDZbMl07CS8qIDQ2LTQ3ICovCisJdWludDE2X3QgaXB2NF9wb3J0OwkvKiA0OC00OSAqLworCXVpbnQxNl90IGlzY3NpX21heF9idXJzdF9sZW47CS8qIDRBLTRCICovCisJdWludDhfdCByZXNlcnZlZDdbNF07CS8qIDRDLTRGICovCisJdWludDhfdCBpcHY0X2FkZHJbNF07CS8qIDUwLTUzICovCisJdWludDE2X3QgaXB2NF92bGFuX3RhZzsJLyogNTQtNTUgKi8KKwl1aW50OF90IGlwdjRfYWRkcl9zdGF0ZTsJLyogNTYgKi8KKwl1aW50OF90IGlwdjRfY2FjaGVpZDsJLyogNTcgKi8KKwl1aW50OF90IHJlc2VydmVkOFs4XTsJLyogNTgtNUYgKi8KKwl1aW50OF90IGlwdjRfc3VibmV0WzRdOwkvKiA2MC02MyAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQ5WzEyXTsJLyogNjQtNkYgKi8KKwl1aW50OF90IGlwdjRfZ3dfYWRkcls0XTsJLyogNzAtNzMgKi8KKwl1aW50OF90IHJlc2VydmVkMTBbODRdOwkvKiA3NC1DNyAqLworCXVpbnQ4X3QgYWJvcnRfdGltZXI7CS8qIEM4ICAgICovCisJdWludDhfdCBpcHY0X3RjcF93c2Y7CS8qIEM5ICAgICovCisJdWludDhfdCByZXNlcnZlZDExWzEwXTsJLyogQ0EtRDMgKi8KKwl1aW50OF90IGlwdjRfZGhjcF92aWRfbGVuOwkvKiBENCAqLworCXVpbnQ4X3QgaXB2NF9kaGNwX3ZpZFsxMV07CS8qIEQ1LURGICovCisJdWludDhfdCByZXNlcnZlZDEyWzIwXTsJLyogRTAtRjMgKi8KKwl1aW50OF90IGlwdjRfZGhjcF9hbHRfY2lkX2xlbjsJLyogRjQgKi8KKwl1aW50OF90IGlwdjRfZGhjcF9hbHRfY2lkWzExXTsJLyogRjUtRkYgKi8KKwl1aW50OF90IGlzY3NpX25hbWVbMjI0XTsJLyogMTAwLTFERiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQxM1szMl07CS8qIDFFMC0xRkYgKi8KKwl1aW50MzJfdCBjb29raWU7CS8qIDIwMC0yMDMgKi8KKwl1aW50MTZfdCBpcHY2X3BvcnQ7CS8qIDIwNC0yMDUgKi8KKwl1aW50MTZfdCBpcHY2X29wdHM7CS8qIDIwNi0yMDcgKi8KKwl1aW50MTZfdCBpcHY2X2FkZHRsX29wdHM7CS8qIDIwOC0yMDkgKi8KKwl1aW50MTZfdCBpcHY2X3RjcF9vcHRzOwkJLyogMjBBLTIwQiAqLworCXVpbnQ4X3QgaXB2Nl90Y3Bfd3NmOwkJLyogMjBDICovCisJdWludDE2X3QgaXB2Nl9mbG93X2xibDsJCS8qIDIwRC0yMEYgKi8KKwl1aW50OF90IGlwdjZfZGZsdF9ydHJfYWRkclsxNl07CS8qIDIxMC0yMUYgKi8KKwl1aW50MTZfdCBpcHY2X3ZsYW5fdGFnOwkJLyogMjIwLTIyMSAqLworCXVpbnQ4X3QgaXB2Nl9sbmtfbGNsX2FkZHJfc3RhdGU7CS8qIDIyMiAqLworCXVpbnQ4X3QgaXB2Nl9hZGRyMF9zdGF0ZTsJLyogMjIzICovCisJdWludDhfdCBpcHY2X2FkZHIxX3N0YXRlOwkvKiAyMjQgKi8KKwl1aW50OF90IGlwdjZfZGZsdF9ydHJfc3RhdGU7CS8qIDIyNSAqLworCXVpbnQ4X3QgaXB2Nl90cmFmZmljX2NsYXNzOwkvKiAyMjYgKi8KKwl1aW50OF90IGlwdjZfaG9wX2xpbWl0OwkJLyogMjI3ICovCisJdWludDhfdCBpcHY2X2lmX2lkWzhdOwkJLyogMjI4LTIyRiAqLworCXVpbnQ4X3QgaXB2Nl9hZGRyMFsxNl07CQkvKiAyMzAtMjNGICovCisJdWludDhfdCBpcHY2X2FkZHIxWzE2XTsJCS8qIDI0MC0yNEYgKi8KKwl1aW50MzJfdCBpcHY2X25kX3JlYWNoX3RpbWU7CS8qIDI1MC0yNTMgKi8KKwl1aW50MzJfdCBpcHY2X25kX3JleG1pdF90aW1lcjsJLyogMjU0LTI1NyAqLworCXVpbnQzMl90IGlwdjZfbmRfc3RhbGVfdGltZW91dDsJLyogMjU4LTI1QiAqLworCXVpbnQ4X3QgaXB2Nl9kdXBfYWRkcl9kZXRlY3RfY291bnQ7CS8qIDI1QyAqLworCXVpbnQ4X3QgaXB2Nl9jYWNoZV9pZDsJCS8qIDI1RCAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQxNFsxOF07CQkvKiAyNUUtMjZGICovCisJdWludDMyX3QgaXB2Nl9nd19hZHZydF9tdHU7CS8qIDI3MC0yNzMgKi8KKwl1aW50OF90IHJlc2VydmVkMTVbMTQwXTsJLyogMjc0LTJGRiAqLworfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgTUFYX0NIQVBfRU5UUklFU180MFhYCTEyOAorI2RlZmluZSBNQVhfQ0hBUF9FTlRSSUVTXzgyWFgJMTAyNAorI2RlZmluZSBNQVhfUkVTUlZfQ0hBUF9JRFgJMworI2RlZmluZSBGTEFTSF9DSEFQX09GRlNFVAkweDA2MDAwMDAwCisKK3N0cnVjdCBxbDRfY2hhcF90YWJsZSB7CisJdWludDE2X3QgbGluazsKKwl1aW50OF90IGZsYWdzOworCXVpbnQ4X3Qgc2VjcmV0X2xlbjsKKyNkZWZpbmUgTUlOX0NIQVBfU0VDUkVUX0xFTgkxMgorI2RlZmluZSBNQVhfQ0hBUF9TRUNSRVRfTEVOCTEwMAorCXVpbnQ4X3Qgc2VjcmV0W01BWF9DSEFQX1NFQ1JFVF9MRU5dOworI2RlZmluZSBNQVhfQ0hBUF9OQU1FX0xFTgkyNTYKKwl1aW50OF90IG5hbWVbTUFYX0NIQVBfTkFNRV9MRU5dOworCXVpbnQxNl90IHJlc2VydmVkOworI2RlZmluZSBDSEFQX1ZBTElEX0NPT0tJRQkweDQwOTIKKyNkZWZpbmUgQ0hBUF9JTlZBTElEX0NPT0tJRQkweEZGRUUKKwl1aW50MTZfdCBjb29raWU7Cit9OworCiBzdHJ1Y3QgZGV2X2RiX2VudHJ5IHsKIAl1aW50MTZfdCBvcHRpb25zOwkvKiAwMC0wMSAqLwogI2RlZmluZSBEREJfT1BUX0RJU0NfU0VTU0lPTiAgMHgxMAogI2RlZmluZSBEREJfT1BUX1RBUkdFVAkgICAgICAweDAyIC8qIGRldmljZSBpcyBhIHRhcmdldCAqLwogI2RlZmluZSBEREJfT1BUX0lQVjZfREVWSUNFCTB4MTAwCisjZGVmaW5lIEREQl9PUFRfQVVUT19TRU5EVEdUU19ESVNBQkxFCQkweDQwCiAjZGVmaW5lIEREQl9PUFRfSVBWNl9OVUxMX0xJTktfTE9DQUwJCTB4ODAwIC8qIHBvc3QgY29ubmVjdGlvbiAqLwogI2RlZmluZSBEREJfT1BUX0lQVjZfRldfREVGSU5FRF9MSU5LX0xPQ0FMCTB4ODAwIC8qIHByZSBjb25uZWN0aW9uICovCiAKQEAgLTU5MSw2ICs3MTgsNyBAQAogCXVpbnQxNl90IHRjcF9vcHRpb25zOwkvKiAwQS0wQiAqLwogCXVpbnQxNl90IGlwX29wdGlvbnM7CS8qIDBDLTBEICovCiAJdWludDE2X3QgaXNjc2lfbWF4X3Jjdl9kYXRhX3NlZ19sZW47CS8qIDBFLTBGICovCisjZGVmaW5lIEJZVEVfVU5JVFMJNTEyCiAJdWludDMyX3QgcmVzMTsJLyogMTAtMTMgKi8KIAl1aW50MTZfdCBpc2NzaV9tYXhfc25kX2RhdGFfc2VnX2xlbjsJLyogMTQtMTUgKi8KIAl1aW50MTZfdCBpc2NzaV9maXJzdF9idXJzdF9sZW47CS8qIDE2LTE3ICovCkBAIC02MjcsNyArNzU1LDEwIEBACiAJdWludDhfdCB0Y3BfcmN2X3dzZjsJLyogMUM3ICovCiAJdWludDMyX3Qgc3RhdF9zbjsJLyogMUM4LTFDQiAqLwogCXVpbnQzMl90IGV4cF9zdGF0X3NuOwkvKiAxQ0MtMUNGICovCi0JdWludDhfdCByZXM2WzB4MzBdOwkvKiAxRDAtMUZGICovCisJdWludDhfdCByZXM2WzB4MmJdOwkvKiAxRDAtMUZCICovCisjZGVmaW5lIEREQl9WQUxJRF9DT09LSUUJMHg5MDM0CisJdWludDE2X3QgY29va2llOwkvKiAxRkMtMUZEICovCisJdWludDE2X3QgbGVuOwkJLyogMUZFLTFGRiAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02MzksNiArNzcwLDE0IEBACiAjZGVmaW5lIEZMQVNIX0VPRl9PRkZTRVQJKEZMQVNIX0RFRkFVTFRCTE9DS1NJWkUtOCkgLyogNCBieXRlcwogCQkJCQkJCSAgICAqIGZvciBFT0YKIAkJCQkJCQkgICAgKiBzaWduYXR1cmUgKi8KKyNkZWZpbmUgRkxBU0hfUkFXX0FDQ0VTU19BRERSCTB4OGUwMDAwMDAKKworI2RlZmluZSBCT09UX1BBUkFNX09GRlNFVF9QT1JUMCAweDNiMAorI2RlZmluZSBCT09UX1BBUkFNX09GRlNFVF9QT1JUMSAweDdiMAorCisjZGVmaW5lIEZMQVNIX09GRlNFVF9EQl9JTkZPCTB4MDUwMDAwMDAKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX0RCX0VORAkoRkxBU0hfT0ZGU0VUX0RCX0lORk8gKyAweDdmZmYpCisKIAogc3RydWN0IHN5c19pbmZvX3BoeXNfYWRkciB7CiAJdWludDhfdCBhZGRyZXNzWzZdOwkvKiAwMC0wNSAqLwpAQCAtNzc0LDYgKzkxMyw3IEBACiAKIAl1aW50OF90IGVudHJ5U3RhdHVzOwogCXVpbnQ4X3Qgc3lzdGVtRGVmaW5lZDsKKyNkZWZpbmUgU0RfSVNDU0lfUERVCTB4MDEKIAl1aW50OF90IGVudHJ5Q291bnQ7CiAKIAkvKiBTeWV0ZW1EZWZpbmVkIGRlZmluaXRpb24gKi8KQEAgLTkzMSwyMSArMTA3MSwyMiBAQAogCXN0cnVjdCBxbGE0X2hlYWRlciBoZHI7CQkgICAgICAgLyogMDAtMDMgKi8KIAl1aW50MzJfdCBoYW5kbGU7CS8qIDA0LTA3ICovCiAJdWludDE2X3QgdGFyZ2V0OwkvKiAwOC0wOSAqLwotCXVpbnQxNl90IGNvbm5lY3Rpb25JRDsJLyogMEEtMEIgKi8KKwl1aW50MTZfdCBjb25uZWN0aW9uX2lkOwkvKiAwQS0wQiAqLwogI2RlZmluZSBJU05TX0RFRkFVTFRfU0VSVkVSX0NPTk5fSUQJKCh1aW50MTZfdCkweDgwMDApCiAKLQl1aW50MTZfdCBjb250cm9sRmxhZ3M7CS8qIDBDLTBEICovCisJdWludDE2X3QgY29udHJvbF9mbGFnczsJLyogMEMtMEQgKi8KICNkZWZpbmUgUFRfRkxBR19FVEhFUk5FVF9GUkFNRQkJMHg4MDAwCiAjZGVmaW5lIFBUX0ZMQUdfSVNOU19QRFUJCTB4ODAwMAogI2RlZmluZSBQVF9GTEFHX1NFTkRfQlVGRkVSCQkweDAyMDAKICNkZWZpbmUgUFRfRkxBR19XQUlUXzRfUkVTUE9OU0UJCTB4MDEwMAorI2RlZmluZSBQVF9GTEFHX0lTQ1NJX1BEVQkJMHgxMDAwCiAKIAl1aW50MTZfdCB0aW1lb3V0OwkvKiAwRS0wRiAqLwogI2RlZmluZSBQVF9ERUZBVUxUX1RJTUVPVVQJCTMwIC8qIHNlY29uZHMgKi8KIAotCXN0cnVjdCBkYXRhX3NlZ19hNjQgb3V0RGF0YVNlZzY0OwkvKiAxMC0xQiAqLworCXN0cnVjdCBkYXRhX3NlZ19hNjQgb3V0X2RzZDsgICAgLyogMTAtMUIgKi8KIAl1aW50MzJfdCByZXMxOwkJLyogMUMtMUYgKi8KLQlzdHJ1Y3QgZGF0YV9zZWdfYTY0IGluRGF0YVNlZzY0OwkvKiAyMC0yQiAqLworCXN0cnVjdCBkYXRhX3NlZ19hNjQgaW5fZHNkOyAgICAgLyogMjAtMkIgKi8KIAl1aW50OF90IHJlczJbMjBdOwkvKiAyQy0zRiAqLwogfTsKIApAQCAtOTc4LDQgKzExMTksNDMgQEAKICNkZWZpbmUgUkVTUE9OU0VfUFJPQ0VTU0VECTB4REVBRERFQUQJLyogU2lnbmF0dXJlICovCiB9OwogCitzdHJ1Y3QgcWxfaXNjc2lfc3RhdHMgeworCXVpbnQ4X3QgcmVzZXJ2ZWQxWzY1Nl07IC8qIDAwMDAtMDI4RiAqLworCXVpbnQzMl90IHR4X2NtZF9wZHU7IC8qIDAyOTAtMDI5MyAqLworCXVpbnQzMl90IHR4X3Jlc3BfcGR1OyAvKiAwMjk0LTAyOTcgKi8KKwl1aW50MzJfdCByeF9jbWRfcGR1OyAvKiAwMjk4LTAyOUIgKi8KKwl1aW50MzJfdCByeF9yZXNwX3BkdTsgLyogMDI5Qy0wMjlGICovCisKKwl1aW50NjRfdCB0eF9kYXRhX29jdGV0czsgLyogMDJBMC0wMkE3ICovCisJdWludDY0X3QgcnhfZGF0YV9vY3RldHM7IC8qIDAyQTgtMDJBRiAqLworCisJdWludDMyX3QgaGRyX2RpZ2VzdF9lcnI7IC8qIDAyQjDigJMwMkIzICovCisJdWludDMyX3QgZGF0YV9kaWdlc3RfZXJyOyAvKiAwMkI04oCTMDJCNyAqLworCXVpbnQzMl90IGNvbm5fdGltZW91dF9lcnI7IC8qIDAyQjjigJMwMkJCICovCisJdWludDMyX3QgZnJhbWluZ19lcnI7IC8qIDAyQkPigJMwMkJGICovCisKKwl1aW50MzJfdCB0eF9ub3BvdXRfcGR1czsgLyogMDJDMOKAkzAyQzMgKi8KKwl1aW50MzJfdCB0eF9zY3NpX2NtZF9wZHVzOyAgLyogMDJDNOKAkzAyQzcgKi8KKwl1aW50MzJfdCB0eF90bWZfY21kX3BkdXM7IC8qIDAyQzjigJMwMkNCICovCisJdWludDMyX3QgdHhfbG9naW5fY21kX3BkdXM7IC8qIDAyQ0PigJMwMkNGICovCisJdWludDMyX3QgdHhfdGV4dF9jbWRfcGR1czsgLyogMDJEMOKAkzAyRDMgKi8KKwl1aW50MzJfdCB0eF9zY3NpX3dyaXRlX3BkdXM7IC8qIDAyRDTigJMwMkQ3ICovCisJdWludDMyX3QgdHhfbG9nb3V0X2NtZF9wZHVzOyAvKiAwMkQ44oCTMDJEQiAqLworCXVpbnQzMl90IHR4X3NuYWNrX3JlcV9wZHVzOyAvKiAwMkRD4oCTMDJERiAqLworCisJdWludDMyX3Qgcnhfbm9waW5fcGR1czsgLyogMDJFMOKAkzAyRTMgKi8KKwl1aW50MzJfdCByeF9zY3NpX3Jlc3BfcGR1czsgLyogMDJFNOKAkzAyRTcgKi8KKwl1aW50MzJfdCByeF90bWZfcmVzcF9wZHVzOyAvKiAwMkU44oCTMDJFQiAqLworCXVpbnQzMl90IHJ4X2xvZ2luX3Jlc3BfcGR1czsgLyogMDJFQ+KAkzAyRUYgKi8KKwl1aW50MzJfdCByeF90ZXh0X3Jlc3BfcGR1czsgLyogMDJGMOKAkzAyRjMgKi8KKwl1aW50MzJfdCByeF9zY3NpX3JlYWRfcGR1czsgLyogMDJGNOKAkzAyRjcgKi8KKwl1aW50MzJfdCByeF9sb2dvdXRfcmVzcF9wZHVzOyAvKiAwMkY44oCTMDJGQiAqLworCisJdWludDMyX3QgcnhfcjJ0X3BkdXM7IC8qIDAyRkPigJMwMkZGICovCisJdWludDMyX3QgcnhfYXN5bmNfcGR1czsgLyogMDMwMOKAkzAzMDMgKi8KKwl1aW50MzJfdCByeF9yZWplY3RfcGR1czsgLyogMDMwNOKAkzAzMDcgKi8KKworCXVpbnQ4X3QgcmVzZXJ2ZWQyWzI2NF07IC8qIDB4MDMwOCAtIDB4MDQwRiAqLworfTsKKwogI2VuZGlmIC8qICBfUUxBNFhfRldfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmgKaW5kZXggYTUzYTI1Ni4uMTYwZGI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oCkBAIC0xMiwyMCArMTIsMTUgQEAKIAogaW50IHFsYTR4eHhfaHdfcmVzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIGludCBxbDR4eHhfbG9ja19kcnZyX3dhaXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmEpOwotaW50IHFsYTR4eHhfc2VuZF90Z3RzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqaXAsIHVpbnQxNl90IHBvcnQpOwogaW50IHFsYTR4eHhfc2VuZF9jb21tYW5kX3RvX2lzcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCBzcmIgKnNyYik7Ci1pbnQgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAotCQkJICAgICAgIHVpbnQ4X3QgcmVuZXdfZGRiX2xpc3QpOworaW50IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiBpbnQgcWxhNHh4eF9zb2Z0X3Jlc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiBpcnFyZXR1cm5fdCBxbGE0eHh4X2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogCi12b2lkIHFsYTR4eHhfZnJlZV9kZGJfbGlzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogdm9pZCBxbGE0eHh4X2ZyZWVfZGRiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KTsKIHZvaWQgcWxhNHh4eF9wcm9jZXNzX2FlbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQ4X3QgcHJvY2Vzc19hZW4pOwogCiBpbnQgcWxhNHh4eF9nZXRfZGhjcF9pcF9hZGRyZXNzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Ci1pbnQgcWxhNHh4eF9yZWxvZ2luX2RldmljZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCi0JCQkgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpOwogaW50IHFsYTR4eHhfYWJvcnRfdGFzayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCBzcmIgKnNyYik7CiBpbnQgcWxhNHh4eF9yZXNldF9sdW4oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksCiAJCSAgICAgIGludCBsdW4pOwpAQCAtNTEsMTUgKzQ2LDI0IEBACiAJCQkgICAgdWludDE2X3QgKmNvbm5lY3Rpb25faWQpOwogCiBpbnQgcWxhNHh4eF9zZXRfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHVpbnQxNl90IGZ3X2RkYl9pbmRleCwKLQkJCSAgZG1hX2FkZHJfdCBmd19kZGJfZW50cnlfZG1hKTsKLQotdm9pZCBxbGE0eHh4X21hcmtfZGV2aWNlX21pc3Npbmcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAotCQkJCSBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpOworCQkJICBkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWEsIHVpbnQzMl90ICptYnhfc3RzKTsKK3VpbnQ4X3QgcWxhNHh4eF9nZXRfaWZjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90ICptYm94X2NtZCwKKwkJCSB1aW50MzJfdCAqbWJveF9zdHMsIGRtYV9hZGRyX3QgaW5pdF9md19jYl9kbWEpOworaW50IHFsYTR4eHhfY29ubl9jbG9zZV9zZXNzX2xvZ291dChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgdWludDE2X3QgZndfZGRiX2luZGV4LAorCQkJCSAgIHVpbnQxNl90IGNvbm5lY3Rpb25faWQsCisJCQkJICAgdWludDE2X3Qgb3B0aW9uKTsKK2ludCBxbGE0eHh4X2Rpc2FibGVfYWNiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNHh4eF9zZXRfYWNiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgKm1ib3hfY21kLAorCQkgICAgdWludDMyX3QgKm1ib3hfc3RzLCBkbWFfYWRkcl90IGFjYl9kbWEpOworaW50IHFsYTR4eHhfZ2V0X2FjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGRtYV9hZGRyX3QgYWNiX2RtYSwKKwkJICAgIHVpbnQzMl90IGFjYl90eXBlLCB1aW50MzJfdCBsZW4pOworaW50IHFsYTR4eHhfZ2V0X2lwX3N0YXRlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgYWNiX2lkeCwKKwkJCSB1aW50MzJfdCBpcF9pZHgsIHVpbnQzMl90ICpzdHMpOwordm9pZCBxbGE0eHh4X21hcmtfZGV2aWNlX21pc3Npbmcoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbik7CiB1MTYgcmRfbnZyYW1fd29yZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGludCBvZmZzZXQpOwordTggcmRfbnZyYW1fYnl0ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGludCBvZmZzZXQpOwogdm9pZCBxbGE0eHh4X2dldF9jcmFzaF9yZWNvcmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKLXN0cnVjdCBkZGJfZW50cnkgKnFsYTR4eHhfYWxsb2Nfc2VzcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwotaW50IHFsYTR4eHhfYWRkX3Nlc3Moc3RydWN0IGRkYl9lbnRyeSAqKTsKLXZvaWQgcWxhNHh4eF9kZXN0cm95X3Nlc3Moc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KTsKIGludCBxbGE0eHh4X2lzX252cmFtX2NvbmZpZ3VyYXRpb25fdmFsaWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIGludCBxbGE0eHh4X2Fib3V0X2Zpcm13YXJlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiB2b2lkIHFsYTR4eHhfaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCkBAIC02OCwxNCArNzIsMTMgQEAKIHZvaWQgcWxhNHh4eF9zcmJfY29tcGwoc3RydWN0IGtyZWYgKnJlZik7CiBzdHJ1Y3Qgc3JiICpxbGE0eHh4X2RlbF9mcm9tX2FjdGl2ZV9hcnJheShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCiAJCXVpbnQzMl90IGluZGV4KTsKLWludCBxbGE0eHh4X3JlaW5pdGlhbGl6ZV9kZGJfbGlzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogaW50IHFsYTR4eHhfcHJvY2Vzc19kZGJfY2hhbmdlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGZ3X2RkYl9pbmRleCwKIAkJdWludDMyX3Qgc3RhdGUsIHVpbnQzMl90IGNvbm5fZXJyb3IpOwogdm9pZCBxbGE0eHh4X2R1bXBfYnVmZmVyKHZvaWQgKmIsIHVpbnQzMl90IHNpemUpOwogaW50IHFsYTR4eHhfc2VuZF9tYXJrZXJfaW9jYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LCBpbnQgbHVuLCB1aW50MTZfdCBtcmtyX21vZCk7Ci1pbnQgcWxhNF9pc19yZWxvZ2luX2FsbG93ZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBjb25uX2Vycik7Ci0KK2ludCBxbGE0eHh4X3NldF9mbGFzaChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCSAgICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgbGVuZ3RoLCB1aW50MzJfdCBvcHRpb25zKTsKIGludCBxbGE0eHh4X21haWxib3hfY29tbWFuZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQ4X3QgaW5Db3VudCwKIAkJdWludDhfdCBvdXRDb3VudCwgdWludDMyX3QgKm1ieF9jbWQsIHVpbnQzMl90ICptYnhfc3RzKTsKIApAQCAtOTUsNiArOTgsMTEgQEAKIHZvaWQgcWxhNHh4eF9nZXRfY29ubl9ldmVudF9sb2coc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIHZvaWQgcWxhNHh4eF9tYWlsYm94X3ByZW1hdHVyZV9jb21wbGV0aW9uKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiB2b2lkIHFsYTR4eHhfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKK3VpbnQ4X3QgcWxhNHh4eF91cGRhdGVfbG9jYWxfaWZjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICB1aW50MzJfdCAqbWJveF9jbWQsCisJCQkJICB1aW50MzJfdCAqbWJveF9zdHMsCisJCQkJICBzdHJ1Y3QgYWRkcl9jdHJsX2JsayAqaW5pdF9md19jYiwKKwkJCQkgIGRtYV9hZGRyX3QgaW5pdF9md19jYl9kbWEpOwogCiB2b2lkIHFsYTRfOHh4eF9wY2lfY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwogaW50IHFsYTRfOHh4eF9pb3NwYWNlX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwpAQCAtMTM0LDYgKzE0MiwzNyBAQAogdm9pZCBxbGE0Xzh4eHhfbmVlZF9xc250X2hhbmRsZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIHZvaWQgcWxhNF84eHh4X2NsZWFyX2Rydl9hY3RpdmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIHZvaWQgcWxhNF84eHh4X3NldF9kcnZfYWN0aXZlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNHh4eF9jb25uX29wZW4oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCBmd19kZGJfaW5kZXgpOworaW50IHFsYTR4eHhfc2V0X3BhcmFtX2RkYmVudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCSAgICAgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksCisJCQkgICAgICAgc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCSAgICAgICB1aW50MzJfdCAqbWJ4X3N0cyk7CitpbnQgcWxhNHh4eF9zZXNzaW9uX2xvZ291dF9kZGIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJICAgICAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgaW50IG9wdGlvbnMpOworaW50IHFsYTR4eHhfcmVxX2RkYl9lbnRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGZ3X2RkYl9pbmRleCwKKwkJCSAgdWludDMyX3QgKm1ieF9zdHMpOworaW50IHFsYTR4eHhfY2xlYXJfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgZndfZGRiX2luZGV4KTsKK2ludCBxbGE0eHh4X3NlbmRfcGFzc3RocnUwKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKTsKK2ludCBxbGE0eHh4X2dldF9tZ210X2RhdGEoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCBmd19kZGJfaW5kZXgsCisJCQkgIHVpbnQxNl90IHN0YXRzX3NpemUsIGRtYV9hZGRyX3Qgc3RhdHNfZG1hKTsKK3ZvaWQgcWxhNHh4eF91cGRhdGVfc2Vzc2lvbl9jb25uX3BhcmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkgICAgICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KTsKK2ludCBxbGE0eHh4X2Jvb3RkYl9ieV9pbmRleChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkgICAgc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5LAorCQkJICAgIGRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYSwgdWludDE2X3QgZGRiX2luZGV4KTsKK2ludCBxbGE0eHh4X2dldF9jaGFwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqdXNlcm5hbWUsCisJCSAgICAgY2hhciAqcGFzc3dvcmQsIHVpbnQxNl90IGlkeCk7CitpbnQgcWxhNHh4eF9nZXRfbnZyYW0oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBkbWFfYWRkcl90IG52cmFtX2RtYSwKKwkJICAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKTsKK2ludCBxbGE0eHh4X3NldF9udnJhbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGRtYV9hZGRyX3QgbnZyYW1fZG1hLAorCQkgICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpOworaW50IHFsYTR4eHhfcmVzdG9yZV9mYWN0b3J5X2RlZmF1bHRzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkgICAgIHVpbnQzMl90IHJlZ2lvbiwgdWludDMyX3QgZmllbGQwLAorCQkJCSAgICAgdWludDMyX3QgZmllbGQxKTsKKworLyogQlNHIEZ1bmN0aW9ucyAqLworaW50IHFsYTR4eHhfYnNnX3JlcXVlc3Qoc3RydWN0IGJzZ19qb2IgKmJzZ19qb2IpOworaW50IHFsYTR4eHhfcHJvY2Vzc192ZW5kb3Jfc3BlY2lmaWMoc3RydWN0IGJzZ19qb2IgKmJzZ19qb2IpOwogCiBleHRlcm4gaW50IHFsNHhleHRlbmRlZF9lcnJvcl9sb2dnaW5nOwogZXh0ZXJuIGludCBxbDR4ZG9udHJlc2V0aGJhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKaW5kZXggNDJlZDVkYi4uMzA3NWZiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCkBAIC0xMSw5ICsxMSw2IEBACiAjaW5jbHVkZSAicWw0X2RiZy5oIgogI2luY2x1ZGUgInFsNF9pbmxpbmUuaCIKIAotc3RhdGljIHN0cnVjdCBkZGJfZW50cnkgKnFsYTR4eHhfYWxsb2NfZGRiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCQkJICAgdWludDMyX3QgZndfZGRiX2luZGV4KTsKLQogc3RhdGljIHZvaWQgcWw0eHh4X3NldF9tYWNfbnVtYmVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAl1aW50MzJfdCB2YWx1ZTsKQEAgLTQ4LDQxICs0NSwxNSBAQAogICogQGhhOiBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCiAgKiBAZGRiX2VudHJ5OiBwb2ludGVyIHRvIGRldmljZSBkYXRhYmFzZSBlbnRyeQogICoKLSAqIFRoaXMgcm91dGluZSBkZWFsbG9jYXRlcyBhbmQgdW5saW5rcyB0aGUgc3BlY2lmaWVkIGRkYl9lbnRyeSBmcm9tIHRoZQotICogYWRhcHRlcidzCisgKiBUaGlzIHJvdXRpbmUgbWFya3MgYSBEREIgZW50cnkgSU5WQUxJRAogICoqLwogdm9pZCBxbGE0eHh4X2ZyZWVfZGRiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKICAgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpCiB7Ci0JLyogUmVtb3ZlIGRldmljZSBlbnRyeSBmcm9tIGxpc3QgKi8KLQlsaXN0X2RlbF9pbml0KCZkZGJfZW50cnktPmxpc3QpOwotCiAJLyogUmVtb3ZlIGRldmljZSBwb2ludGVyIGZyb20gaW5kZXggbWFwcGluZyBhcnJheXMgKi8KIAloYS0+ZndfZGRiX2luZGV4X21hcFtkZGJfZW50cnktPmZ3X2RkYl9pbmRleF0gPQogCQkoc3RydWN0IGRkYl9lbnRyeSAqKSBJTlZBTElEX0VOVFJZOwogCWhhLT50b3RfZGRicy0tOwotCi0JLyogRnJlZSBtZW1vcnkgYW5kIHNjc2ktbWwgc3RydWN0IGZvciBkZXZpY2UgZW50cnkgKi8KLQlxbGE0eHh4X2Rlc3Ryb3lfc2VzcyhkZGJfZW50cnkpOwotfQotCi0vKioKLSAqIHFsYTR4eHhfZnJlZV9kZGJfbGlzdCAtIGRlYWxsb2NhdGUgYWxsIGRkYnMKLSAqIEBoYTogcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgotICoKLSAqIFRoaXMgcm91dGluZSBkZWFsbG9jYXRlcyBhbmQgcmVtb3ZlcyBhbGwgZGV2aWNlcyBvbiB0aGUgc3BwZWNpZmllZCBhZGFwdGVyLgotICoqLwotdm9pZCBxbGE0eHh4X2ZyZWVfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmhhLT5kZGJfbGlzdCkpIHsKLQkJcHRyID0gaGEtPmRkYl9saXN0Lm5leHQ7Ci0JCS8qIEZyZWUgbWVtb3J5IGZvciBkZXZpY2UgZW50cnkgYW5kIHJlbW92ZSAqLwotCQlkZGJfZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGRkYl9lbnRyeSwgbGlzdCk7Ci0JCXFsYTR4eHhfZnJlZV9kZGIoaGEsIGRkYl9lbnRyeSk7Ci0JfQogfQogCiAvKioKQEAgLTIzNiwzOCArMjA3LDQ0IEBACiAJCQkJICAgIEZXX0FERFNUQVRFX0RIQ1B2NF9MRUFTRV9BQ1FVSVJFRCkgPT0gMCkpIHsKIAkJCWlwdjRfd2FpdCA9IDE7CiAJCX0KLQkJaWYgKCgoaGEtPmlwdjZfYWRkbF9vcHRpb25zICYKLQkJCSAgICBJUFY2X0FERE9QVF9ORUlHSEJPUl9ESVNDT1ZFUllfQUREUl9FTkFCTEUpICE9IDApICYmCi0JCSAgICAoKGhhLT5pcHY2X2xpbmtfbG9jYWxfc3RhdGUgPT0gSVBfQUREUlNUQVRFX0FDUVVJUklORykgfHwKLQkJICAgICAoaGEtPmlwdjZfYWRkcjBfc3RhdGUgPT0gSVBfQUREUlNUQVRFX0FDUVVJUklORykgfHwKLQkJICAgICAoaGEtPmlwdjZfYWRkcjFfc3RhdGUgPT0gSVBfQUREUlNUQVRFX0FDUVVJUklORykpKSB7CisJCWlmICgoKGhhLT5pcF9jb25maWcuaXB2Nl9hZGRsX29wdGlvbnMgJgorCQkgICAgICBJUFY2X0FERE9QVF9ORUlHSEJPUl9ESVNDT1ZFUllfQUREUl9FTkFCTEUpICE9IDApICYmCisJCSAgICAoKGhhLT5pcF9jb25maWcuaXB2Nl9saW5rX2xvY2FsX3N0YXRlID09CisJCSAgICAgIElQX0FERFJTVEFURV9BQ1FVSVJJTkcpIHx8CisJCSAgICAgKGhhLT5pcF9jb25maWcuaXB2Nl9hZGRyMF9zdGF0ZSA9PQorCQkgICAgICBJUF9BRERSU1RBVEVfQUNRVUlSSU5HKSB8fAorCQkgICAgIChoYS0+aXBfY29uZmlnLmlwdjZfYWRkcjFfc3RhdGUgPT0KKwkJICAgICAgSVBfQUREUlNUQVRFX0FDUVVJUklORykpKSB7CiAKIAkJCWlwdjZfd2FpdCA9IDE7CiAKLQkJCWlmICgoaGEtPmlwdjZfbGlua19sb2NhbF9zdGF0ZSA9PQotCQkJCQkJICAgICBJUF9BRERSU1RBVEVfUFJFRkVSUkVEKSB8fAotCQkJICAgIChoYS0+aXB2Nl9hZGRyMF9zdGF0ZSA9PSBJUF9BRERSU1RBVEVfUFJFRkVSUkVEKSB8fAotCQkJICAgIChoYS0+aXB2Nl9hZGRyMV9zdGF0ZSA9PSBJUF9BRERSU1RBVEVfUFJFRkVSUkVEKSkgeworCQkJaWYgKChoYS0+aXBfY29uZmlnLmlwdjZfbGlua19sb2NhbF9zdGF0ZSA9PQorCQkJICAgICBJUF9BRERSU1RBVEVfUFJFRkVSUkVEKSB8fAorCQkJICAgIChoYS0+aXBfY29uZmlnLmlwdjZfYWRkcjBfc3RhdGUgPT0KKwkJCSAgICAgSVBfQUREUlNUQVRFX1BSRUZFUlJFRCkgfHwKKwkJCSAgICAoaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIxX3N0YXRlID09CisJCQkgICAgIElQX0FERFJTVEFURV9QUkVGRVJSRUQpKSB7CiAJCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8gInNjc2klbGQ6ICVzOiAiCiAJCQkJCSAgICAgICJQcmVmZXJyZWQgSVAgY29uZmlndXJlZC4iCiAJCQkJCSAgICAgICIgRG9uJ3Qgd2FpdCFcbiIsIGhhLT5ob3N0X25vLAogCQkJCQkgICAgICBfX2Z1bmNfXykpOwogCQkJCWlwdjZfd2FpdCA9IDA7CiAJCQl9Ci0JCQlpZiAobWVtY21wKCZoYS0+aXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyLCBpcF9hZGRyZXNzLAotCQkJCUlQdjZfQUREUl9MRU4pID09IDApIHsKKwkJCWlmIChtZW1jbXAoJmhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyLAorCQkJCSAgIGlwX2FkZHJlc3MsIElQdjZfQUREUl9MRU4pID09IDApIHsKIAkJCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAic2NzaSVsZDogJXM6ICIKIAkJCQkJICAgICAgIk5vIFJvdXRlciBjb25maWd1cmVkLiAiCiAJCQkJCSAgICAgICJEb24ndCB3YWl0IVxuIiwgaGEtPmhvc3Rfbm8sCiAJCQkJCSAgICAgIF9fZnVuY19fKSk7CiAJCQkJaXB2Nl93YWl0ID0gMDsKIAkJCX0KLQkJCWlmICgoaGEtPmlwdjZfZGVmYXVsdF9yb3V0ZXJfc3RhdGUgPT0KLQkJCQkJCUlQVjZfUlRSU1RBVEVfTUFOVUFMKSAmJgotCQkJICAgIChoYS0+aXB2Nl9saW5rX2xvY2FsX3N0YXRlID09Ci0JCQkJCQlJUF9BRERSU1RBVEVfVEVOVEFUSVZFKSAmJgotCQkJICAgIChtZW1jbXAoJmhhLT5pcHY2X2xpbmtfbG9jYWxfYWRkciwKLQkJCQkgICAgJmhhLT5pcHY2X2RlZmF1bHRfcm91dGVyX2FkZHIsIDQpID09IDApKSB7CisJCQlpZiAoKGhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9zdGF0ZSA9PQorCQkJICAgICBJUFY2X1JUUlNUQVRFX01BTlVBTCkgJiYKKwkJCSAgICAoaGEtPmlwX2NvbmZpZy5pcHY2X2xpbmtfbG9jYWxfc3RhdGUgPT0KKwkJCSAgICAgSVBfQUREUlNUQVRFX1RFTlRBVElWRSkgJiYKKwkJCSAgICAobWVtY21wKCZoYS0+aXBfY29uZmlnLmlwdjZfbGlua19sb2NhbF9hZGRyLAorCQkJICAgICAmaGEtPmlwX2NvbmZpZy5pcHY2X2RlZmF1bHRfcm91dGVyX2FkZHIsIDQpID09CisJCQkgICAgIDApKSB7CiAJCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IExpbmtMb2NhbCBSb3V0ZXIgJiAiCiAJCQkJCSJJUCBjb25maWd1cmVkLiBEb24ndCB3YWl0IVxuIiwKIAkJCQkJaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CkBAIC0yNzksMTEgKzI1NiwxNCBAQAogCQkJCSAgICAgICJJUChzKSBcIiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwogCQkJaWYgKGlwdjRfd2FpdCkKIAkJCQlERUJVRzIocHJpbnRrKCJJUHY0ICIpKTsKLQkJCWlmIChoYS0+aXB2Nl9saW5rX2xvY2FsX3N0YXRlID09IElQX0FERFJTVEFURV9BQ1FVSVJJTkcpCisJCQlpZiAoaGEtPmlwX2NvbmZpZy5pcHY2X2xpbmtfbG9jYWxfc3RhdGUgPT0KKwkJCSAgICBJUF9BRERSU1RBVEVfQUNRVUlSSU5HKQogCQkJCURFQlVHMihwcmludGsoIklQdjZMaW5rTG9jYWwgIikpOwotCQkJaWYgKGhhLT5pcHY2X2FkZHIwX3N0YXRlID09IElQX0FERFJTVEFURV9BQ1FVSVJJTkcpCisJCQlpZiAoaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIwX3N0YXRlID09CisJCQkgICAgSVBfQUREUlNUQVRFX0FDUVVJUklORykKIAkJCQlERUJVRzIocHJpbnRrKCJJUHY2QWRkcjAgIikpOwotCQkJaWYgKGhhLT5pcHY2X2FkZHIxX3N0YXRlID09IElQX0FERFJTVEFURV9BQ1FVSVJJTkcpCisJCQlpZiAoaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIxX3N0YXRlID09CisJCQkgICAgSVBfQUREUlNUQVRFX0FDUVVJUklORykKIAkJCQlERUJVRzIocHJpbnRrKCJJUHY2QWRkcjEgIikpOwogCQkJREVCVUcyKHByaW50aygiXCJcbiIpKTsKIAkJfQpAQCAtNDY2LDQ4NiArNDQ2LDE5IEBACiAJcmV0dXJuIHFsYTR4eHhfZ2V0X2Zpcm13YXJlX3N0YXR1cyhoYSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGRiX2VudHJ5KiBxbGE0eHh4X2dldF9kZGJfZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAotCQkJCQkJdWludDMyX3QgZndfZGRiX2luZGV4LAotCQkJCQkJdWludDMyX3QgKm5ld190Z3QpCitzdGF0aWMgdm9pZCBxbGE0eHh4X3NldF9tb2RlbF9pbmZvKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnkgPSBOVUxMOwotCWRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYTsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkgPSBOVUxMOwotCWludCBmb3VuZCA9IDA7Ci0JdWludDMyX3QgZGV2aWNlX3N0YXRlOworCXVpbnQxNl90IGJvYXJkX2lkX3N0cmluZ1s4XTsKKwlpbnQgaTsKKwlpbnQgc2l6ZSA9IHNpemVvZihoYS0+bnZyYW0tPmlzcDQwMjIuYm9hcmRJZFN0cik7CisJaW50IG9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBlZXByb21fZGF0YSwgaXNwNDAyMi5ib2FyZElkU3RyKSAvIDI7CiAKLQkqbmV3X3RndCA9IDA7Ci0JLyogTWFrZSBzdXJlIHRoZSBkbWEgYnVmZmVyIGlzIHZhbGlkICovCi0JZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAotCQkJCQkgIHNpemVvZigqZndfZGRiX2VudHJ5KSwKLQkJCQkJICAmZndfZGRiX2VudHJ5X2RtYSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGZ3X2RkYl9lbnRyeSA9PSBOVUxMKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlci5cbiIsCi0JCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKLQkJZ290byBleGl0X2dldF9kZGJfZW50cnlfbm9fZnJlZTsKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemUgLyAyKSA7IGkrKykgeworCQlib2FyZF9pZF9zdHJpbmdbaV0gPSByZF9udnJhbV93b3JkKGhhLCBvZmZzZXQpOworCQlvZmZzZXQgKz0gMTsKIAl9CiAKLQlpZiAocWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGZ3X2RkYl9pbmRleCwgZndfZGRiX2VudHJ5LAotCQkJCSAgICBmd19kZGJfZW50cnlfZG1hLCBOVUxMLCBOVUxMLAotCQkJCSAgICAmZGV2aWNlX3N0YXRlLCBOVUxMLCBOVUxMLCBOVUxMKSA9PQotCQkJCSAgICBRTEFfRVJST1IpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGZhaWxlZCBnZXRfZGRiX2VudHJ5IGZvciAiCi0JCQkgICAgICAiZndfZGRiX2luZGV4ICVkXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sCi0JCQkgICAgICBmd19kZGJfaW5kZXgpKTsKLQkJZ290byBleGl0X2dldF9kZGJfZW50cnk7Ci0JfQotCi0JLyogQWxsb2NhdGUgRERCIGlmIG5vdCBhbHJlYWR5IGFsbG9jYXRlZC4gKi8KLQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogTG9va2luZyBmb3IgZGRiWyVkXVxuIiwgaGEtPmhvc3Rfbm8sCi0JCSAgICAgIF9fZnVuY19fLCBmd19kZGJfaW5kZXgpKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRkYl9lbnRyeSwgJmhhLT5kZGJfbGlzdCwgbGlzdCkgewotCQlpZiAoKG1lbWNtcChkZGJfZW50cnktPmlzY3NpX25hbWUsIGZ3X2RkYl9lbnRyeS0+aXNjc2lfbmFtZSwKLQkJCSAgIElTQ1NJX05BTUVfU0laRSkgPT0gMCkgJiYKLQkJCShkZGJfZW50cnktPnRwZ3QgPT0KLQkJCQlsZTMyX3RvX2NwdShmd19kZGJfZW50cnktPnRndF9wb3J0YWxfZ3JwKSkgJiYKLQkJCShtZW1jbXAoZGRiX2VudHJ5LT5pc2lkLCBmd19kZGJfZW50cnktPmlzaWQsCi0JCQkJc2l6ZW9mKGRkYl9lbnRyeS0+aXNpZCkpID09IDApKSB7Ci0JCQlmb3VuZCsrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBpZiBub3QgZm91bmQgYWxsb2NhdGUgbmV3IGRkYiAqLwotCWlmICghZm91bmQpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGRkYlslZF0gbm90IGZvdW5kIC0gYWxsb2NhdGluZyAiCi0JCQkgICAgICAibmV3IGRkYlxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkJICAgICAgZndfZGRiX2luZGV4KSk7Ci0JCSpuZXdfdGd0ID0gMTsKLQkJZGRiX2VudHJ5ID0gcWxhNHh4eF9hbGxvY19kZGIoaGEsIGZ3X2RkYl9pbmRleCk7Ci0JfQotCi1leGl0X2dldF9kZGJfZW50cnk6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwgZndfZGRiX2VudHJ5LAotCQkJICBmd19kZGJfZW50cnlfZG1hKTsKLQotZXhpdF9nZXRfZGRiX2VudHJ5X25vX2ZyZWU6Ci0JcmV0dXJuIGRkYl9lbnRyeTsKLX0KLQotLyoqCi0gKiBxbGE0eHh4X3VwZGF0ZV9kZGJfZW50cnkgLSB1cGRhdGUgZHJpdmVyJ3MgaW50ZXJuYWwgZGRiCi0gKiBAaGE6IHBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqIEBkZGJfZW50cnk6IHBvaW50ZXIgdG8gZGV2aWNlIGRhdGFiYXNlIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQKLSAqIEBmd19kZGJfaW5kZXg6IGluZGV4IG9mIHRoZSBkZGIgZW50cnkgaW4gZncgZGRiIHRhYmxlCi0gKgotICogVGhpcyByb3V0aW5lIHVwZGF0ZXMgdGhlIGRyaXZlcidzIGludGVybmFsIGRldmljZSBkYXRhYmFzZSBlbnRyeQotICogd2l0aCBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgZnJvbSB0aGUgZmlybXdhcmUncyBkZXZpY2UgZGF0YWJhc2UKLSAqIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGRldmljZS4gVGhlIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4IGZpZWxkCi0gKiBtdXN0IGJlIGluaXRpYWxpemVkIHByaW9yIHRvCWNhbGxpbmcgdGhpcyByb3V0aW5lCi0gKgotICoqLwotc3RhdGljIGludCBxbGE0eHh4X3VwZGF0ZV9kZGJfZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAotCQkJCSAgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksCi0JCQkJICAgIHVpbnQzMl90IGZ3X2RkYl9pbmRleCkKLXsKLQlzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnkgPSBOVUxMOwotCWRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYTsKLQlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOwotCXVpbnQzMl90IGNvbm5fZXJyOwotCi0JaWYgKGRkYl9lbnRyeSA9PSBOVUxMKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBkZGJfZW50cnkgaXMgTlVMTFxuIiwgaGEtPmhvc3Rfbm8sCi0JCQkgICAgICBfX2Z1bmNfXykpOwotCi0JCWdvdG8gZXhpdF91cGRhdGVfZGRiX25vX2ZyZWU7Ci0JfQotCi0JLyogTWFrZSBzdXJlIHRoZSBkbWEgYnVmZmVyIGlzIHZhbGlkICovCi0JZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAotCQkJCQkgIHNpemVvZigqZndfZGRiX2VudHJ5KSwKLQkJCQkJICAmZndfZGRiX2VudHJ5X2RtYSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGZ3X2RkYl9lbnRyeSA9PSBOVUxMKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlci5cbiIsCi0JCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKLQotCQlnb3RvIGV4aXRfdXBkYXRlX2RkYl9ub19mcmVlOwotCX0KLQotCWlmIChxbGE0eHh4X2dldF9md2RkYl9lbnRyeShoYSwgZndfZGRiX2luZGV4LCBmd19kZGJfZW50cnksCi0JCQkJICAgIGZ3X2RkYl9lbnRyeV9kbWEsIE5VTEwsIE5VTEwsCi0JCQkJICAgICZkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUsICZjb25uX2VyciwKLQkJCQkgICAgJmRkYl9lbnRyeS0+dGNwX3NvdXJjZV9wb3J0X251bSwKLQkJCQkgICAgJmRkYl9lbnRyeS0+Y29ubmVjdGlvbl9pZCkgPT0KLQkJCQkgICAgUUxBX0VSUk9SKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBmYWlsZWQgZ2V0X2RkYl9lbnRyeSBmb3IgIgotCQkJICAgICAgImZ3X2RkYl9pbmRleCAlZFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkJICAgICAgZndfZGRiX2luZGV4KSk7Ci0KLQkJZ290byBleGl0X3VwZGF0ZV9kZGI7Ci0JfQotCi0Jc3RhdHVzID0gUUxBX1NVQ0NFU1M7Ci0JZGRiX2VudHJ5LT5vcHRpb25zID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5vcHRpb25zKTsKLQlkZGJfZW50cnktPnRhcmdldF9zZXNzaW9uX2lkID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT50c2lkKTsKLQlkZGJfZW50cnktPnRhc2tfbWdtdF90aW1lb3V0ID0KLQkJbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5kZWZfdGltZW91dCk7Ci0JZGRiX2VudHJ5LT5DbWRTbiA9IDA7Ci0JZGRiX2VudHJ5LT5leGVfdGhyb3R0bGUgPSBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmV4ZWNfdGhyb3R0bGUpOwotCWRkYl9lbnRyeS0+ZGVmYXVsdF9yZWxvZ2luX3RpbWVvdXQgPQotCQlsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmRlZl90aW1lb3V0KTsKLQlkZGJfZW50cnktPmRlZmF1bHRfdGltZTJ3YWl0ID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9kZWZfdGltZTJ3YWl0KTsKLQotCS8qIFVwZGF0ZSBpbmRleCBpbiBjYXNlIGl0IGNoYW5nZWQgKi8KLQlkZGJfZW50cnktPmZ3X2RkYl9pbmRleCA9IGZ3X2RkYl9pbmRleDsKLQloYS0+ZndfZGRiX2luZGV4X21hcFtmd19kZGJfaW5kZXhdID0gZGRiX2VudHJ5OwotCi0JZGRiX2VudHJ5LT5wb3J0ID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5wb3J0KTsKLQlkZGJfZW50cnktPnRwZ3QgPSBsZTMyX3RvX2NwdShmd19kZGJfZW50cnktPnRndF9wb3J0YWxfZ3JwKTsKLQltZW1jcHkoZGRiX2VudHJ5LT5pc2lkLCBmd19kZGJfZW50cnktPmlzaWQsIHNpemVvZihkZGJfZW50cnktPmlzaWQpKTsKLQotCW1lbWNweSgmZGRiX2VudHJ5LT5pc2NzaV9uYW1lWzBdLCAmZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lWzBdLAotCSAgICAgICBtaW4oc2l6ZW9mKGRkYl9lbnRyeS0+aXNjc2lfbmFtZSksCi0JCSAgIHNpemVvZihmd19kZGJfZW50cnktPmlzY3NpX25hbWUpKSk7Ci0JbWVtY3B5KCZkZGJfZW50cnktPmlzY3NpX2FsaWFzWzBdLCAmZndfZGRiX2VudHJ5LT5pc2NzaV9hbGlhc1swXSwKLQkgICAgICAgbWluKHNpemVvZihkZGJfZW50cnktPmlzY3NpX2FsaWFzKSwKLQkJICAgc2l6ZW9mKGZ3X2RkYl9lbnRyeS0+aXNjc2lfYWxpYXMpKSk7Ci0JbWVtY3B5KCZkZGJfZW50cnktPmlwX2FkZHJbMF0sICZmd19kZGJfZW50cnktPmlwX2FkZHJbMF0sCi0JICAgICAgIG1pbihzaXplb2YoZGRiX2VudHJ5LT5pcF9hZGRyKSwgc2l6ZW9mKGZ3X2RkYl9lbnRyeS0+aXBfYWRkcikpKTsKLQotCWRkYl9lbnRyeS0+aXNjc2lfbWF4X2J1cnN0X2xlbiA9IGZ3X2RkYl9lbnRyeS0+aXNjc2lfbWF4X2J1cnN0X2xlbjsKLQlkZGJfZW50cnktPmlzY3NpX21heF9vdXRzbmRfcjJ0ID0gZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfb3V0c25kX3IydDsKLQlkZGJfZW50cnktPmlzY3NpX2ZpcnN0X2J1cnN0X2xlbiA9IGZ3X2RkYl9lbnRyeS0+aXNjc2lfZmlyc3RfYnVyc3RfbGVuOwotCWRkYl9lbnRyeS0+aXNjc2lfbWF4X3Jjdl9kYXRhX3NlZ19sZW4gPQotCQkJCWZ3X2RkYl9lbnRyeS0+aXNjc2lfbWF4X3Jjdl9kYXRhX3NlZ19sZW47Ci0JZGRiX2VudHJ5LT5pc2NzaV9tYXhfc25kX2RhdGFfc2VnX2xlbiA9Ci0JCQkJZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfc25kX2RhdGFfc2VnX2xlbjsKLQotCWlmIChkZGJfZW50cnktPm9wdGlvbnMgJiBEREJfT1BUX0lQVjZfREVWSUNFKSB7Ci0JCW1lbWNweSgmZGRiX2VudHJ5LT5yZW1vdGVfaXB2Nl9hZGRyLAotCQkJZndfZGRiX2VudHJ5LT5pcF9hZGRyLAotCQkJbWluKHNpemVvZihkZGJfZW50cnktPnJlbW90ZV9pcHY2X2FkZHIpLAotCQkJc2l6ZW9mKGZ3X2RkYl9lbnRyeS0+aXBfYWRkcikpKTsKLQkJbWVtY3B5KCZkZGJfZW50cnktPmxpbmtfbG9jYWxfaXB2Nl9hZGRyLAotCQkJZndfZGRiX2VudHJ5LT5saW5rX2xvY2FsX2lwdjZfYWRkciwKLQkJCW1pbihzaXplb2YoZGRiX2VudHJ5LT5saW5rX2xvY2FsX2lwdjZfYWRkciksCi0JCQlzaXplb2YoZndfZGRiX2VudHJ5LT5saW5rX2xvY2FsX2lwdjZfYWRkcikpKTsKLQotCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IEREQlslZF0gU3RhdGUgJTA0eCIKLQkJCQkJIiBDb25uRXJyICUwOHggSVAgJXBJNiAiCi0JCQkJCSI6JTA0ZCBcIiVzXCJcbiIsCi0JCQkJCV9fZnVuY19fLCBmd19kZGJfaW5kZXgsCi0JCQkJCWRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSwKLQkJCQkJY29ubl9lcnIsIGZ3X2RkYl9lbnRyeS0+aXBfYWRkciwKLQkJCQkJbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5wb3J0KSwKLQkJCQkJZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lKSk7Ci0JfSBlbHNlCi0JCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogRERCWyVkXSBTdGF0ZSAlMDR4IgotCQkJCQkiIENvbm5FcnIgJTA4eCBJUCAlcEk0ICIKLQkJCQkJIjolMDRkIFwiJXNcIlxuIiwKLQkJCQkJX19mdW5jX18sIGZ3X2RkYl9pbmRleCwKLQkJCQkJZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlLAotCQkJCQljb25uX2VyciwgZndfZGRiX2VudHJ5LT5pcF9hZGRyLAotCQkJCQlsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPnBvcnQpLAotCQkJCQlmd19kZGJfZW50cnktPmlzY3NpX25hbWUpKTsKLWV4aXRfdXBkYXRlX2RkYjoKLQlpZiAoZndfZGRiX2VudHJ5KQotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAotCQkJCSAgZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnlfZG1hKTsKLQotZXhpdF91cGRhdGVfZGRiX25vX2ZyZWU6Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBxbGE0eHh4X2FsbG9jX2RkYiAtIGFsbG9jYXRlIGRldmljZSBkYXRhYmFzZSBlbnRyeQotICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCi0gKiBAZndfZGRiX2luZGV4OiBGaXJtd2FyZSdzIGRldmljZSBkYXRhYmFzZSBpbmRleAotICoKLSAqIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgYSBkZGJfZW50cnksIGl0aXRpYWxpemVzIHNvbWUgdmFsdWVzLCBhbmQKLSAqIGluc2VydHMgaXQgaW50byB0aGUgZGRiIGxpc3QuCi0gKiovCi1zdGF0aWMgc3RydWN0IGRkYl9lbnRyeSAqIHFsYTR4eHhfYWxsb2NfZGRiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCQkJICAgIHVpbnQzMl90IGZ3X2RkYl9pbmRleCkKLXsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7Ci0KLQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogZndfZGRiX2luZGV4IFslZF1cbiIsIGhhLT5ob3N0X25vLAotCQkgICAgICBfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7Ci0KLQlkZGJfZW50cnkgPSBxbGE0eHh4X2FsbG9jX3Nlc3MoaGEpOwotCWlmIChkZGJfZW50cnkgPT0gTlVMTCkgewotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSAiCi0JCQkgICAgICAidG8gYWRkIGZ3X2RkYl9pbmRleCBbJWRdXG4iLAotCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBmd19kZGJfaW5kZXgpKTsKLQkJcmV0dXJuIGRkYl9lbnRyeTsKLQl9Ci0KLQlkZGJfZW50cnktPmZ3X2RkYl9pbmRleCA9IGZ3X2RkYl9pbmRleDsKLQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJldHJ5X3JlbG9naW5fdGltZXIsIElOVkFMSURfRU5UUlkpOwotCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmVsb2dpbl90aW1lciwgMCk7Ci0JYXRvbWljX3NldCgmZGRiX2VudHJ5LT5yZWxvZ2luX3JldHJ5X2NvdW50LCAwKTsKLQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnN0YXRlLCBEREJfU1RBVEVfT05MSU5FKTsKLQlsaXN0X2FkZF90YWlsKCZkZGJfZW50cnktPmxpc3QsICZoYS0+ZGRiX2xpc3QpOwotCWhhLT5md19kZGJfaW5kZXhfbWFwW2Z3X2RkYl9pbmRleF0gPSBkZGJfZW50cnk7Ci0JaGEtPnRvdF9kZGJzKys7Ci0KLQlyZXR1cm4gZGRiX2VudHJ5OwotfQotCi0vKioKLSAqIHFsYTRfaXNfcmVsb2dpbl9hbGxvd2VkIC0gQXJlIHdlIGFsbG93ZWQgdG8gbG9naW4/Ci0gKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqIEBjb25uX2VycjogTGFzdCBjb25uZWN0aW9uIGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGRiCi0gKgotICogVGhpcyByb3V0aW5lIHRlc3RzIHRoZSBnaXZlbiBjb25uZWN0aW9uIGVycm9yIHRvIGRldGVybWluZSBpZgotICogd2UgYXJlIGFsbG93ZWQgdG8gbG9naW4uCi0gKiovCi1pbnQgcWxhNF9pc19yZWxvZ2luX2FsbG93ZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBjb25uX2VycikKLXsKLQl1aW50MzJfdCBlcnJfY29kZSwgbG9naW5fcnNwX3N0c19jbGFzczsKLQlpbnQgcmVsb2dpbiA9IDE7Ci0KLQllcnJfY29kZSA9ICgoY29ubl9lcnIgJiAweDAwZmYwMDAwKSA+PiAxNik7Ci0JbG9naW5fcnNwX3N0c19jbGFzcyA9ICgoY29ubl9lcnIgJiAweDAwMDBmZjAwKSA+PiA4KTsKLQlpZiAoZXJyX2NvZGUgPT0gMHgxYyB8fCBlcnJfY29kZSA9PSAweDA2KSB7Ci0JCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiOiBjb25uX2Vycj0weCUwOHgsIHNlbmQgdGFyZ2V0IGNvbXBsZXRlZCIKLQkJICAgICIgb3IgYWNjZXNzIGRlbmllZCBmYWlsdXJlXG4iLCBjb25uX2VycikpOwotCQlyZWxvZ2luID0gMDsKLQl9Ci0JaWYgKChlcnJfY29kZSA9PSAweDA4KSAmJiAobG9naW5fcnNwX3N0c19jbGFzcyA9PSAweDAyKSkgewotCQkvKiBMb2dpbiBSZXNwb25zZSBQRFUgcmV0dXJuZWQgYW4gZXJyb3IuCi0JCSAgIExvZ2luIFJlc3BvbnNlIFN0YXR1cyBpbiBFcnJvciBDb2RlIERldGFpbAotCQkgICBpbmRpY2F0ZXMgbG9naW4gc2hvdWxkIG5vdCBiZSByZXRyaWVkLiovCi0JCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiOiBjb25uX2Vycj0weCUwOHgsIGRvIG5vdCByZXRyeSByZWxvZ2luXG4iLAotCQkgICAgY29ubl9lcnIpKTsKLQkJcmVsb2dpbiA9IDA7Ci0JfQotCi0JcmV0dXJuIHJlbG9naW47Ci19Ci0KLXN0YXRpYyB2b2lkIHFsYTR4eHhfZmx1c2hfQUVOUyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCi17Ci0JdW5zaWduZWQgbG9uZyB3dGltZTsKLQotCS8qIEZsdXNoIHRoZSAweDgwMTQgQUVOIGZyb20gdGhlIGZpcm13YXJlIGFzIGEgcmVzdWx0IG9mCi0JICogQXV0byBjb25uZWN0LiBXZSBhcmUgYmFzaWNhbGx5IGRvaW5nIGdldF9maXJtd2FyZV9kZGIoKQotCSAqIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gbG9nIGJhY2sgaW4gb3Igbm90LgotCSAqIFRyeWluZyB0byBkbyBhIHNldCBkZGIgYmVmb3JlIHdlIGhhdmUgcHJvY2Vzc2VkIDB4ODAxNAotCSAqIHdpbGwgcmVzdWx0IGluIGFub3RoZXIgc2V0X2RkYigpIGZvciB0aGUgc2FtZSBkZGIuIEluIG90aGVyCi0JICogd29yZHMgdGhlcmUgd2lsbCBiZSBzdGFsZSBlbnRyaWVzIGluIHRoZSBhZW5fcS4KLQkgKi8KLQl3dGltZSA9IGppZmZpZXMgKyAoMiAqIEhaKTsKLQlkbyB7Ci0JCWlmIChxbGE0eHh4X2dldF9maXJtd2FyZV9zdGF0ZShoYSkgPT0gUUxBX1NVQ0NFU1MpCi0JCQlpZiAoaGEtPmZpcm13YXJlX3N0YXRlICYgKEJJVF8yIHwgQklUXzApKQotCQkJCXJldHVybjsKLQotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KERQQ19BRU4sICZoYS0+ZHBjX2ZsYWdzKSkKLQkJCXFsYTR4eHhfcHJvY2Vzc19hZW4oaGEsIEZMVVNIX0REQl9DSEFOR0VEX0FFTlMpOwotCi0JCW1zbGVlcCgxMDAwKTsKLQl9IHdoaWxlICghdGltZV9hZnRlcl9lcShqaWZmaWVzLCB3dGltZSkpOwotfQotCi0vKioKLSAqIHFsYTR4eHhfYnVpbGRfZGRiX2xpc3QgLSBidWlsZHMgZHJpdmVyIGRkYiBsaXN0Ci0gKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgc2VhcmNoZXMgZm9yIGFsbCB2YWxpZCBmaXJtd2FyZSBkZGIgZW50cmllcyBhbmQgYnVpbGRzCi0gKiBhbiBpbnRlcm5hbCBkZGIgbGlzdC4gRGRicyB0aGF0IGFyZSBjb25zaWRlcmVkIHZhbGlkIGFyZSB0aG9zZSB3aXRoCi0gKiBhIGRldmljZSBzdGF0ZSBvZiBTRVNTSU9OX0FDVElWRS4KLSAqIEEgcmVsb2dpbiAoc2V0X2RkYikgaXMgaXNzdWVkIGZvciBEREJzIHRoYXQgYXJlIG5vdCBvbmxpbmUuCi0gKiovCi1zdGF0aWMgaW50IHFsYTR4eHhfYnVpbGRfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQotewotCWludCBzdGF0dXMgPSBRTEFfRVJST1I7Ci0JdWludDMyX3QgZndfZGRiX2luZGV4ID0gMDsKLQl1aW50MzJfdCBuZXh0X2Z3X2RkYl9pbmRleCA9IDA7Ci0JdWludDMyX3QgZGRiX3N0YXRlOwotCXVpbnQzMl90IGNvbm5fZXJyOwotCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKLQlzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnkgPSBOVUxMOwotCWRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYTsKLQl1aW50MzJfdCBpcHY2X2RldmljZTsKLQl1aW50MzJfdCBuZXdfdGd0OwotCi0JcWxhNHh4eF9mbHVzaF9BRU5TKGhhKTsKLQotCWZ3X2RkYl9lbnRyeSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAotCQkJJmZ3X2RkYl9lbnRyeV9kbWEsIEdGUF9LRVJORUwpOwotCWlmIChmd19kZGJfZW50cnkgPT0gTlVMTCkgewotCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IERNQSBhbGxvYyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pKTsKLQotCQlnb3RvIGV4aXRfYnVpbGRfZGRiX2xpc3Rfbm9fZnJlZTsKLQl9Ci0KLQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJJbml0aWFsaXppbmcgRERCcyAuLi5cbiIpOwotCWZvciAoZndfZGRiX2luZGV4ID0gMDsgZndfZGRiX2luZGV4IDwgTUFYX0REQl9FTlRSSUVTOwotCSAgICAgZndfZGRiX2luZGV4ID0gbmV4dF9md19kZGJfaW5kZXgpIHsKLQkJLyogRmlyc3QsIGxldCdzIHNlZSBpZiBhIGRldmljZSBleGlzdHMgaGVyZSAqLwotCQlpZiAocWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGZ3X2RkYl9pbmRleCwgZndfZGRiX2VudHJ5LAotCQkJCQkgICAgMCwgTlVMTCwgJm5leHRfZndfZGRiX2luZGV4LAotCQkJCQkgICAgJmRkYl9zdGF0ZSwgJmNvbm5fZXJyLAotCQkJCQkgICAgTlVMTCwgTlVMTCkgPT0KLQkJCQkJICAgIFFMQV9FUlJPUikgewotCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGdldF9kZGJfZW50cnksICIKLQkJCQkgICAgICAiZndfZGRiX2luZGV4ICVkIGZhaWxlZCIsIGhhLT5ob3N0X25vLAotCQkJCSAgICAgIF9fZnVuY19fLCBmd19kZGJfaW5kZXgpKTsKLQkJCWdvdG8gZXhpdF9idWlsZF9kZGJfbGlzdDsKLQkJfQotCi0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBHZXR0aW5nIEREQlslZF0gZGRic3RhdGU9MHgleCwgIgotCQkJICAgICAgIm5leHRfZndfZGRiX2luZGV4PSVkLlxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkJICAgICAgZndfZGRiX2luZGV4LCBkZGJfc3RhdGUsIG5leHRfZndfZGRiX2luZGV4KSk7Ci0KLQkJLyogSXNzdWUgcmVsb2dpbiwgaWYgbmVjZXNzYXJ5LiAqLwotCQlpZiAoZGRiX3N0YXRlID09IEREQl9EU19TRVNTSU9OX0ZBSUxFRCB8fAotCQkgICAgZGRiX3N0YXRlID09IEREQl9EU19OT19DT05ORUNUSU9OX0FDVElWRSkgewotCQkJLyogVHJ5IGFuZCBsb2dpbiB0byBkZXZpY2UgKi8KLQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBMb2dpbiB0byBEREJbJWRdXG4iLAotCQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7Ci0JCQlpcHY2X2RldmljZSA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+b3B0aW9ucykgJgotCQkJCQlEREJfT1BUX0lQVjZfREVWSUNFOwotCQkJaWYgKHFsYTRfaXNfcmVsb2dpbl9hbGxvd2VkKGhhLCBjb25uX2VycikgJiYKLQkJCQkJKCghaXB2Nl9kZXZpY2UgJiYKLQkJCQkJICAqKCh1aW50MzJfdCAqKWZ3X2RkYl9lbnRyeS0+aXBfYWRkcikpCi0JCQkJCSB8fCBpcHY2X2RldmljZSkpIHsKLQkJCQlxbGE0eHh4X3NldF9kZGJfZW50cnkoaGEsIGZ3X2RkYl9pbmRleCwgMCk7Ci0JCQkJaWYgKHFsYTR4eHhfZ2V0X2Z3ZGRiX2VudHJ5KGhhLCBmd19kZGJfaW5kZXgsCi0JCQkJCQkJTlVMTCwgMCwgTlVMTCwKLQkJCQkJCQkmbmV4dF9md19kZGJfaW5kZXgsCi0JCQkJCQkJJmRkYl9zdGF0ZSwgJmNvbm5fZXJyLAotCQkJCQkJCU5VTEwsIE5VTEwpCi0JCQkJCQk9PSBRTEFfRVJST1IpIHsKLQkJCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IgotCQkJCQkJImdldF9kZGJfZW50cnkgJWQgZmFpbGVkXG4iLAotCQkJCQkJaGEtPmhvc3Rfbm8sCi0JCQkJCQlfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7Ci0JCQkJCWdvdG8gZXhpdF9idWlsZF9kZGJfbGlzdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGRiX3N0YXRlICE9IEREQl9EU19TRVNTSU9OX0FDVElWRSkKLQkJCWdvdG8gbmV4dF9vbmU7Ci0JCS8qCi0JCSAqIGlmIGZ3X2RkYiB3aXRoIHNlc3Npb24gYWN0aXZlIHN0YXRlIGZvdW5kLAotCQkgKiBhZGQgdG8gZGRiX2xpc3QKLQkJICovCi0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBEREJbJWRdIGFkZGVkIHRvIGxpc3RcbiIsCi0JCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGZ3X2RkYl9pbmRleCkpOwotCi0JCS8qIEFkZCBEREIgdG8gaW50ZXJuYWwgb3VyIGRkYiBsaXN0LiAqLwotCQlkZGJfZW50cnkgPSBxbGE0eHh4X2dldF9kZGJfZW50cnkoaGEsIGZ3X2RkYl9pbmRleCwgJm5ld190Z3QpOwotCQlpZiAoZGRiX2VudHJ5ID09IE5VTEwpIHsKLQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICIKLQkJCQkgICAgICAiZm9yIGRldmljZSBhdCBmd19kZGJfaW5kZXggJWRcbiIsCi0JCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBmd19kZGJfaW5kZXgpKTsKLQkJCWdvdG8gZXhpdF9idWlsZF9kZGJfbGlzdDsKLQkJfQotCQkvKiBGaWxsIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCi0JCWlmIChxbGE0eHh4X3VwZGF0ZV9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeSwgZndfZGRiX2luZGV4KSA9PQotCQkgICAgUUxBX0VSUk9SKSB7Ci0JCQloYS0+ZndfZGRiX2luZGV4X21hcFtmd19kZGJfaW5kZXhdID0KLQkJCQkoc3RydWN0IGRkYl9lbnRyeSAqKUlOVkFMSURfRU5UUlk7Ci0KLQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiB1cGRhdGVfZGRiX2VudHJ5IGZhaWxlZCAiCi0JCQkJICAgICAgImZvciBmd19kZGJfaW5kZXggJWQuXG4iLAotCQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7Ci0JCQlnb3RvIGV4aXRfYnVpbGRfZGRiX2xpc3Q7Ci0JCX0KLQotbmV4dF9vbmU6Ci0JCS8qIFdlIGtub3cgd2UndmUgcmVhY2hlZCB0aGUgbGFzdCBkZXZpY2Ugd2hlbgotCQkgKiBuZXh0X2Z3X2RkYl9pbmRleCBpcyAwICovCi0JCWlmIChuZXh0X2Z3X2RkYl9pbmRleCA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0Jc3RhdHVzID0gUUxBX1NVQ0NFU1M7Ci0JcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiRERCIGxpc3QgZG9uZS4uXG4iKTsKLQotZXhpdF9idWlsZF9kZGJfbGlzdDoKLQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLCBmd19kZGJfZW50cnksCi0JCWZ3X2RkYl9lbnRyeV9kbWEpOwotCi1leGl0X2J1aWxkX2RkYl9saXN0X25vX2ZyZWU6Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBxbGE0eHh4X2luaXRpYWxpemVfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQotewotCXVpbnQxNl90IGZ3X2RkYl9pbmRleDsKLQlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7Ci0KLQkvKiBmcmVlIHRoZSBkZGIgbGlzdCBpZiBpcyBub3QgZW1wdHkgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJmhhLT5kZGJfbGlzdCkpCi0JCXFsYTR4eHhfZnJlZV9kZGJfbGlzdChoYSk7Ci0KLQlmb3IgKGZ3X2RkYl9pbmRleCA9IDA7IGZ3X2RkYl9pbmRleCA8IE1BWF9EREJfRU5UUklFUzsgZndfZGRiX2luZGV4KyspCi0JCWhhLT5md19kZGJfaW5kZXhfbWFwW2Z3X2RkYl9pbmRleF0gPQotCQkgICAgKHN0cnVjdCBkZGJfZW50cnkgKilJTlZBTElEX0VOVFJZOwotCi0JaGEtPnRvdF9kZGJzID0gMDsKLQotCS8qIFBlcmZvcm0gZGV2aWNlIGRpc2NvdmVyeSBhbmQgYnVpbGQgZGRiIGxpc3QuICovCi0Jc3RhdHVzID0gcWxhNHh4eF9idWlsZF9kZGJfbGlzdChoYSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKioKLSAqIHFsYTR4eHhfcmVpbml0aWFsaXplX2RkYl9saXN0IC0gdXBkYXRlIHRoZSBkcml2ZXIgZGRiIGxpc3QKLSAqIEBoYTogcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgotICoKLSAqIFRoaXMgcm91dGluZSBvYnRhaW5zIGRldmljZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGL1cgZGF0YWJhc2UgYWZ0ZXIKLSAqIGZpcm13YXJlIG9yIGFkYXB0ZXIgcmVzZXRzLiAgVGhlIGRldmljZSB0YWJsZSBpcyBwcmVzZXJ2ZWQuCi0gKiovCi1pbnQgcWxhNHh4eF9yZWluaXRpYWxpemVfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQotewotCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksICpkZXRlbXA7Ci0KLQkvKiBVcGRhdGUgdGhlIGRldmljZSBpbmZvcm1hdGlvbiBmb3IgYWxsIGRldmljZXMuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRkYl9lbnRyeSwgZGV0ZW1wLCAmaGEtPmRkYl9saXN0LCBsaXN0KSB7Ci0JCXFsYTR4eHhfdXBkYXRlX2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LAotCQkJCQkgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOwotCQlpZiAoZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlID09IEREQl9EU19TRVNTSU9OX0FDVElWRSkgewotCQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5zdGF0ZSwgRERCX1NUQVRFX09OTElORSk7Ci0JCQlERUJVRzIocHJpbnRrICgic2NzaSVsZDogJXM6IGRkYiBpbmRleCBbJWRdIG1hcmtlZCAiCi0JCQkJICAgICAgICJPTkxJTkVcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJCQkgICAgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpKTsKLQkJCWlzY3NpX3VuYmxvY2tfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MpOwotCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSA9PSBEREJfU1RBVEVfT05MSU5FKQotCQkJcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKGhhLCBkZGJfZW50cnkpOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKioKLSAqIHFsYTR4eHhfcmVsb2dpbl9kZXZpY2UgLSByZS1lc3RhYmxpc2ggc2Vzc2lvbgotICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCi0gKiBAZGRiX2VudHJ5OiBQb2ludGVyIHRvIGRldmljZSBkYXRhYmFzZSBlbnRyeQotICoKLSAqIFRoaXMgcm91dGluZSBkb2VzIGEgc2Vzc2lvbiByZWxvZ2luIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2UuCi0gKiBUaGUgZGRiIGVudHJ5IG11c3QgYmUgYXNzaWduZWQgcHJpb3IgdG8gbWFraW5nIHRoaXMgY2FsbC4KLSAqKi8KLWludCBxbGE0eHh4X3JlbG9naW5fZGV2aWNlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCSAgIHN0cnVjdCBkZGJfZW50cnkgKiBkZGJfZW50cnkpCi17Ci0JdWludDE2X3QgcmVsb2dpbl90aW1lcjsKLQotCXJlbG9naW5fdGltZXIgPSBtYXgoZGRiX2VudHJ5LT5kZWZhdWx0X3JlbG9naW5fdGltZW91dCwKLQkJCSAgICAodWludDE2X3QpUkVMT0dJTl9UT1YpOwotCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmVsb2dpbl90aW1lciwgcmVsb2dpbl90aW1lcik7Ci0KLQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiBSZWxvZ2luIGRkYiBbJWRdLiBUT1Y9JWRcbiIsIGhhLT5ob3N0X25vLAotCQkgICAgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwgcmVsb2dpbl90aW1lcikpOwotCi0JcWxhNHh4eF9zZXRfZGRiX2VudHJ5KGhhLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwgMCk7Ci0KLQlyZXR1cm4gUUxBX1NVQ0NFU1M7CisJbWVtY3B5KGhhLT5tb2RlbF9uYW1lLCBib2FyZF9pZF9zdHJpbmcsIHNpemUpOwogfQogCiBzdGF0aWMgaW50IHFsYTR4eHhfY29uZmlnX252cmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKQEAgLTk4Myw2ICs0OTYsMTIgQEAKIAkJZWxzZQogCQkJcmV0dXJuIFFMQV9FUlJPUjsKIAl9CisKKwlpZiAoaXNfcWxhNDAyMihoYSkgfHwgaXNfcWxhNDAzMihoYSkpCisJCXFsYTR4eHhfc2V0X21vZGVsX2luZm8oaGEpOworCWVsc2UKKwkJc3RyY3B5KGhhLT5tb2RlbF9uYW1lLCAiUUxBNDAxMCIpOworCiAJREVCVUcocHJpbnRrKCJzY3NpJWxkOiAlczogU2V0dGluZyBleHRId0NvbmZpZyB0byAweEZGRkYlMDR4XG4iLAogCQkgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZXh0SHdDb25maWcuQXN1aW50MzJfdCkpOwogCkBAIC0xMjQ2LDIzICs3NjUsNTYgQEAKIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KKy8qKgorICogcWxhNHh4eF9mcmVlX2RkYl9pbmRleCAtIEZyZWUgRERCcyByZXNlcnZlZCBieSBmaXJtd2FyZQorICogQGhhOiBwb2ludGVyIHRvIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogU2luY2UgZmlybXdhcmUgaXMgbm90IHJ1bm5pbmcgaW4gYXV0b2Nvbm5lY3QgbW9kZSB0aGUgRERCIGluZGljZXMgc2hvdWxkCisgKiBiZSBmcmVlZCBzbyB0aGF0IHdoZW4gbG9naW4gaGFwcGVucyBmcm9tIHVzZXIgc3BhY2UgdGhlcmUgYXJlIGZyZWUgRERCCisgKiBpbmRpY2VzIGF2YWlsYWJsZS4KKyAqKi8KK3N0YXRpYyB2b2lkIHFsYTR4eHhfZnJlZV9kZGJfaW5kZXgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWludCBtYXhfZGRiczsKKwlpbnQgcmV0OworCXVpbnQzMl90IGlkeCA9IDAsIG5leHRfaWR4ID0gMDsKKwl1aW50MzJfdCBzdGF0ZSA9IDAsIGNvbm5fZXJyID0gMDsKKworCW1heF9kZGJzID0gIGlzX3FsYTQwWFgoaGEpID8gTUFYX1BSU1RfREVWX0RCX0VOVFJJRVMgOgorCQkJCSAgICAgTUFYX0RFVl9EQl9FTlRSSUVTOworCisJZm9yIChpZHggPSAwOyBpZHggPCBtYXhfZGRiczsgaWR4ID0gbmV4dF9pZHgpIHsKKwkJcmV0ID0gcWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGlkeCwgTlVMTCwgMCwgTlVMTCwKKwkJCQkJICAgICAgJm5leHRfaWR4LCAmc3RhdGUsICZjb25uX2VyciwKKwkJCQkJCU5VTEwsIE5VTEwpOworCQlpZiAocmV0ID09IFFMQV9FUlJPUikKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RhdGUgPT0gRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFIHx8CisJCSAgICBzdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9GQUlMRUQpIHsKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJCSAgIkZyZWVpbmcgRERCIGluZGV4ID0gMHgleFxuIiwgaWR4KSk7CisJCQlyZXQgPSBxbGE0eHh4X2NsZWFyX2RkYl9lbnRyeShoYSwgaWR4KTsKKwkJCWlmIChyZXQgPT0gUUxBX0VSUk9SKQorCQkJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJCQkgICAiVW5hYmxlIHRvIGNsZWFyIEREQiBpbmRleCA9ICIKKwkJCQkJICAgIjB4JXhcbiIsIGlkeCk7CisJCX0KKwkJaWYgKG5leHRfaWR4ID09IDApCisJCQlicmVhazsKKwl9Cit9CiAKIAogLyoqCiAgKiBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlciAtIGluaXRpYWlsaXplcyBoYmEKICAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgotICogQHJlbmV3X2RkYl9saXN0OiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIHRoZSBhZGFwdGVyJ3MgZGRiIGxpc3QKLSAqCWFmdGVyIGFkYXB0ZXIgcmVjb3ZlcnkgaGFzIGNvbXBsZXRlZC4KLSAqCTA9cHJlc2VydmUgZGRiIGxpc3QsIDE9ZGVzdHJveSBhbmQgcmVidWlsZCBkZGIgbGlzdAogICoKICAqIFRoaXMgcm91dGluZSBwYXJmb3JtcyBhbGwgb2YgdGhlIHN0ZXBzIG5lY2Vzc2FyeSB0byBpbml0aWFsaXplIHRoZSBhZGFwdGVyLgogICoKICAqKi8KLWludCBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCi0JCQkgICAgICAgdWludDhfdCByZW5ld19kZGJfbGlzdCkKK2ludCBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKLQlpbnQ4X3QgaXBfYWRkcmVzc1tJUF9BRERSX0xFTl0gPSB7MH0gOwogCiAJaGEtPmVlcHJvbV9jbWRfZGF0YSA9IDA7CiAKQEAgLTEyODgsNDcgKzg0MCw4IEBACiAJaWYgKHN0YXR1cyA9PSBRTEFfRVJST1IpCiAJCWdvdG8gZXhpdF9pbml0X2hiYTsKIAotCS8qCi0JICogRlcgaXMgd2FpdGluZyB0byBnZXQgYW4gSVAgYWRkcmVzcyBmcm9tIERIQ1Agc2VydmVyOiBTa2lwIGJ1aWxkaW5nCi0JICogdGhlIGRkYl9saXN0IGFuZCB3YWl0IGZvciBESENQIGxlYXNlIGFjcXVpcmVkIGFlbiB0byBjb21lIGluCi0JICogZm9sbG93ZWQgYnkgMHg4MDE0IGFlbiIgdG8gdHJpZ2dlciB0aGUgdGd0IGRpc2NvdmVyeSBwcm9jZXNzLgotCSAqLwotCWlmIChoYS0+ZmlybXdhcmVfc3RhdGUgJiBGV19TVEFURV9DT05GSUdVUklOR19JUCkKLQkJZ290byBleGl0X2luaXRfb25saW5lOworCXFsYTR4eHhfZnJlZV9kZGJfaW5kZXgoaGEpOwogCi0JLyogU2tpcCBkZXZpY2UgZGlzY292ZXJ5IGlmIGlwIGFuZCBzdWJuZXQgaXMgemVybyAqLwotCWlmIChtZW1jbXAoaGEtPmlwX2FkZHJlc3MsIGlwX2FkZHJlc3MsIElQX0FERFJfTEVOKSA9PSAwIHx8Ci0JICAgIG1lbWNtcChoYS0+c3VibmV0X21hc2ssIGlwX2FkZHJlc3MsIElQX0FERFJfTEVOKSA9PSAwKQotCQlnb3RvIGV4aXRfaW5pdF9vbmxpbmU7Ci0KLQlpZiAocmVuZXdfZGRiX2xpc3QgPT0gUFJFU0VSVkVfRERCX0xJU1QpIHsKLQkJLyoKLQkJICogV2Ugd2FudCB0byBwcmVzZXJ2ZSBsdW4gc3RhdGVzIChpLmUuIHN1c3BlbmRlZCwgZXRjLikKLQkJICogZm9yIHJlY292ZXJ5IGluaXRpYXRlZCBieSB0aGUgZHJpdmVyLiAgU28ganVzdCB1cGRhdGUKLQkJICogdGhlIGRldmljZSBzdGF0ZXMgZm9yIHRoZSBleGlzdGluZyBkZGJfbGlzdC4KLQkJICovCi0JCXFsYTR4eHhfcmVpbml0aWFsaXplX2RkYl9saXN0KGhhKTsKLQl9IGVsc2UgaWYgKHJlbmV3X2RkYl9saXN0ID09IFJFQlVJTERfRERCX0xJU1QpIHsKLQkJLyoKLQkJICogV2Ugd2FudCB0byBidWlsZCB0aGUgZGRiX2xpc3QgZnJvbSBzY3JhdGNoIGR1cmluZwotCQkgKiBkcml2ZXIgaW5pdGlhbGl6YXRpb24gYW5kIHJlY292ZXJ5IGluaXRpYXRlZCBieSB0aGUKLQkJICogSU5UX0hCQV9SRVNFVCBJT0NUTC4KLQkJICovCi0JCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9kZGJfbGlzdChoYSk7Ci0JCWlmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSB7Ci0JCQlERUJVRzIocHJpbnRrKCIlcyglbGQpIEVycm9yIG9jY3VycmVkIGR1cmluZyBidWlsZCIKLQkJCQkgICAgICAiZGRiIGxpc3RcbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOwotCQkJZ290byBleGl0X2luaXRfaGJhOwotCQl9Ci0KLQl9Ci0JaWYgKCFoYS0+dG90X2RkYnMpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogRmFpbGVkIHRvIGluaXRpYWxpemUgZGV2aWNlcyBvciBub25lICIKLQkJCSAgICAgICJwcmVzZW50IGluIEZpcm13YXJlIGRldmljZSBkYXRhYmFzZVxuIiwKLQkJCSAgICAgIGhhLT5ob3N0X25vKSk7Ci0JfQotCi1leGl0X2luaXRfb25saW5lOgogCXNldF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKTsKIGV4aXRfaW5pdF9oYmE6CiAJaWYgKGlzX3FsYTgwMjIoaGEpICYmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSkgewpAQCAtMTM0Myw2MSArODU2LDYgQEAKIH0KIAogLyoqCi0gKiBxbGE0eHh4X2FkZF9kZXZpY2VfZHluYW1pY2FsbHkgLSBkZGIgYWRkaXRpb24gZHVlIHRvIGFuIEFFTgotICogQGhhOiAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgotICogQGZ3X2RkYl9pbmRleDogIEZpcm13YXJlJ3MgZGV2aWNlIGRhdGFiYXNlIGluZGV4Ci0gKgotICogVGhpcyByb3V0aW5lIHByb2Nlc3NlcyBhZGRzIGEgZGV2aWNlIGFzIGEgcmVzdWx0IG9mIGFuIDgwMTRoIEFFTi4KLSAqKi8KLXN0YXRpYyB2b2lkIHFsYTR4eHhfYWRkX2RldmljZV9keW5hbWljYWxseShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCi0JCQkJCSAgIHVpbnQzMl90IGZ3X2RkYl9pbmRleCkKLXsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICogZGRiX2VudHJ5OwotCXVpbnQzMl90IG5ld190Z3Q7Ci0KLQkvKiBGaXJzdCBhbGxvY2F0ZSBhIGRldmljZSBzdHJ1Y3R1cmUgKi8KLQlkZGJfZW50cnkgPSBxbGE0eHh4X2dldF9kZGJfZW50cnkoaGEsIGZ3X2RkYl9pbmRleCwgJm5ld190Z3QpOwotCWlmIChkZGJfZW50cnkgPT0gTlVMTCkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgInNjc2klbGQ6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gYWRkICIKLQkJCSAgICAgICJmd19kZGJfaW5kZXggJWRcbiIsIGhhLT5ob3N0X25vLCBmd19kZGJfaW5kZXgpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghbmV3X3RndCAmJiAoZGRiX2VudHJ5LT5md19kZGJfaW5kZXggIT0gZndfZGRiX2luZGV4KSkgewotCQkvKiBUYXJnZXQgaGFzIGJlZW4gYm91bmQgdG8gYSBuZXcgZndfZGRiX2luZGV4ICovCi0JCXFsYTR4eHhfZnJlZV9kZGIoaGEsIGRkYl9lbnRyeSk7Ci0JCWRkYl9lbnRyeSA9IHFsYTR4eHhfYWxsb2NfZGRiKGhhLCBmd19kZGJfaW5kZXgpOwotCQlpZiAoZGRiX2VudHJ5ID09IE5VTEwpIHsKLQkJCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJInNjc2klbGQ6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiCi0JCQkJIiB0byBhZGQgZndfZGRiX2luZGV4ICVkXG4iLAotCQkJCWhhLT5ob3N0X25vLCBmd19kZGJfaW5kZXgpKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlpZiAocWxhNHh4eF91cGRhdGVfZGRiX2VudHJ5KGhhLCBkZGJfZW50cnksIGZ3X2RkYl9pbmRleCkgPT0KLQkJCQkgICAgUUxBX0VSUk9SKSB7Ci0JCWhhLT5md19kZGJfaW5kZXhfbWFwW2Z3X2RkYl9pbmRleF0gPQotCQkJCQkoc3RydWN0IGRkYl9lbnRyeSAqKUlOVkFMSURfRU5UUlk7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAic2NzaSVsZDogZmFpbGVkIHRvIGFkZCBuZXcgZGV2aWNlIGF0IGluZGV4ICIKLQkJCSAgICAgICJbJWRdXG4gVW5hYmxlIHRvIHJldHJpZXZlIGZ3IGRkYiBlbnRyeVxuIiwKLQkJCSAgICAgIGhhLT5ob3N0X25vLCBmd19kZGJfaW5kZXgpKTsKLQkJcWxhNHh4eF9mcmVlX2RkYihoYSwgZGRiX2VudHJ5KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChxbGE0eHh4X2FkZF9zZXNzKGRkYl9lbnRyeSkpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICJzY3NpJWxkOiBmYWlsZWQgdG8gYWRkIG5ldyBkZXZpY2UgYXQgaW5kZXggIgotCQkJICAgICAgIlslZF1cbiBVbmFibGUgdG8gYWRkIGNvbm5lY3Rpb24gYW5kIHNlc3Npb25cbiIsCi0JCQkgICAgICBoYS0+aG9zdF9ubywgZndfZGRiX2luZGV4KSk7Ci0JCXFsYTR4eHhfZnJlZV9kZGIoaGEsIGRkYl9lbnRyeSk7Ci0JfQotfQotCi0vKioKICAqIHFsYTR4eHhfcHJvY2Vzc19kZGJfY2hhbmdlZCAtIHByb2Nlc3MgZGRiIHN0YXRlIGNoYW5nZQogICogQGhhIC0gUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgogICogQGZ3X2RkYl9pbmRleCAtIEZpcm13YXJlJ3MgZGV2aWNlIGRhdGFiYXNlIGluZGV4CkBAIC0xNDA5LDg4ICs4NjcsOTQgQEAKIAkJdWludDMyX3Qgc3RhdGUsIHVpbnQzMl90IGNvbm5fZXJyKQogewogCXN0cnVjdCBkZGJfZW50cnkgKiBkZGJfZW50cnk7CisJdWludDMyX3Qgb2xkX2Z3X2RkYl9kZXZpY2Vfc3RhdGU7CisJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKIAogCS8qIGNoZWNrIGZvciBvdXQgb2YgcmFuZ2UgaW5kZXggKi8KIAlpZiAoZndfZGRiX2luZGV4ID49IE1BWF9EREJfRU5UUklFUykKLQkJcmV0dXJuIFFMQV9FUlJPUjsKKwkJZ290byBleGl0X2RkYl9ldmVudDsKIAogCS8qIEdldCB0aGUgY29ycmVzcG9uZ2luZyBkZGIgZW50cnkgKi8KIAlkZGJfZW50cnkgPSBxbGE0eHh4X2xvb2t1cF9kZGJfYnlfZndfaW5kZXgoaGEsIGZ3X2RkYl9pbmRleCk7CiAJLyogRGV2aWNlIGRvZXMgbm90IGN1cnJlbnRseSBleGlzdCBpbiBvdXIgZGF0YWJhc2UuICovCiAJaWYgKGRkYl9lbnRyeSA9PSBOVUxMKSB7Ci0JCWlmIChzdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9BQ1RJVkUpCi0JCQlxbGE0eHh4X2FkZF9kZXZpY2VfZHluYW1pY2FsbHkoaGEsIGZ3X2RkYl9pbmRleCk7Ci0JCXJldHVybiBRTEFfU1VDQ0VTUzsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogTm8gZGRiX2VudHJ5IGF0IEZXIGluZGV4IFslZF1cbiIsCisJCQkgICBfX2Z1bmNfXywgZndfZGRiX2luZGV4KTsKKworCQlpZiAoc3RhdGUgPT0gRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFKQorCQkJY2xlYXJfYml0KGZ3X2RkYl9pbmRleCwgaGEtPmRkYl9pZHhfbWFwKTsKKworCQlnb3RvIGV4aXRfZGRiX2V2ZW50OwogCX0KIAotCS8qIERldmljZSBhbHJlYWR5IGV4aXN0cyBpbiBvdXIgZGF0YWJhc2UuICovCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXMgRERCIC0gb2xkIHN0YXRlPSAweCV4LCBuZXcgc3RhdGU9MHgleCBmb3IgIgotCQkgICAgICAiaW5kZXggWyVkXVxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkgICAgICBkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUsIHN0YXRlLCBmd19kZGJfaW5kZXgpKTsKKwlvbGRfZndfZGRiX2RldmljZV9zdGF0ZSA9IGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAiJXM6IEREQiAtIG9sZCBzdGF0ZSA9IDB4JXgsIG5ldyBzdGF0ZSA9IDB4JXggZm9yICIKKwkJCSAgImluZGV4IFslZF1cbiIsIF9fZnVuY19fLAorCQkJICBkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUsIHN0YXRlLCBmd19kZGJfaW5kZXgpKTsKIAogCWRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9IHN0YXRlOwotCS8qIERldmljZSBpcyBiYWNrIG9ubGluZS4gKi8KLQlpZiAoKGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9BQ1RJVkUpICYmCi0JICAgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSAhPSBEREJfU1RBVEVfT05MSU5FKSkgewotCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnN0YXRlLCBEREJfU1RBVEVfT05MSU5FKTsKLQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5yZWxvZ2luX3JldHJ5X2NvdW50LCAwKTsKLQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5yZWxvZ2luX3RpbWVyLCAwKTsKLQkJY2xlYXJfYml0KERGX1JFTE9HSU4sICZkZGJfZW50cnktPmZsYWdzKTsKLQkJaXNjc2lfdW5ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7Ci0JCWlzY3NpX3Nlc3Npb25fZXZlbnQoZGRiX2VudHJ5LT5zZXNzLAotCQkJCSAgICBJU0NTSV9LRVZFTlRfQ1JFQVRFX1NFU1NJT04pOwotCQkvKgotCQkgKiBDaGFuZ2UgdGhlIGx1biBzdGF0ZSB0byBSRUFEWSBpbiBjYXNlIHRoZSBsdW4gVElNRU9VVCBiZWZvcmUKLQkJICogdGhlIGRldmljZSBjYW1lIGJhY2suCi0JCSAqLwotCX0gZWxzZSBpZiAoZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlICE9IEREQl9EU19TRVNTSU9OX0FDVElWRSkgewotCQkvKiBEZXZpY2Ugd2VudCBhd2F5LCBtYXJrIGRldmljZSBtaXNzaW5nICovCi0JCWlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgPT0gRERCX1NUQVRFX09OTElORSkgewotCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzIG1hcmsgbWlzc2luZyAiCi0JCQkJCSJkZGJfZW50cnkgMHglcCBzZXNzIDB4JXAgY29ubiAweCVwXG4iLAotCQkJCQlfX2Z1bmNfXywgZGRiX2VudHJ5LAotCQkJCQlkZGJfZW50cnktPnNlc3MsIGRkYl9lbnRyeS0+Y29ubikpOwotCQkJcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKGhhLCBkZGJfZW50cnkpOwotCQl9CiAKLQkJLyoKLQkJICogUmVsb2dpbiBpZiBkZXZpY2Ugc3RhdGUgY2hhbmdlZCB0byBhIG5vdCBhY3RpdmUgc3RhdGUuCi0JCSAqIEhvd2V2ZXIsIGRvIG5vdCByZWxvZ2luIGlmIGEgUkVMT0dJTiBpcyBpbiBwcm9jZXNzLCBvcgotCQkgKiB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gcmVsb2dpbiB0byB0aGlzIEREQi4KLQkJICovCi0JCWlmIChkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPT0gRERCX0RTX1NFU1NJT05fRkFJTEVEICYmCi0JCSAgICAhdGVzdF9iaXQoREZfUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpICYmCi0JCSAgICBxbGE0X2lzX3JlbG9naW5fYWxsb3dlZChoYSwgY29ubl9lcnIpKSB7Ci0JCQkvKgotCQkJICogVGhpcyB0cmlnZ2VycyBhIHJlbG9naW4uICBBZnRlciB0aGUgcmVsb2dpbl90aW1lcgotCQkJICogZXhwaXJlcywgdGhlIHJlbG9naW4gZ2V0cyBzY2hlZHVsZWQuCSBXZSBtdXN0IHdhaXQgYQotCQkJICogbWluaW11bSBhbW91bnQgb2YgdGltZSBzaW5jZSByZWNlaXZpbmcgYW4gMHg4MDE0IEFFTgotCQkJICogd2l0aCBmYWlsZWQgZGV2aWNlX3N0YXRlIG9yIGEgbG9nb3V0IHJlc3BvbnNlIGJlZm9yZQotCQkJICogd2UgY2FuIGlzc3VlIGFub3RoZXIgcmVsb2dpbi4KLQkJCSAqLwotCQkJLyogRmlybXdhcmUgcGFkcyB0aGlzIHRpbWVvdXQ6ICh0aW1lMndhaXQgKzEpLgotCQkJICogRHJpdmVyIHJldHJ5IHRvIGxvZ2luIHNob3VsZCBiZSBsb25nZXIgdGhhbiBGL1cuCi0JCQkgKiBPdGhlcndpc2UgRi9XIHdpbGwgZmFpbAotCQkJICogc2V0X2RkYigpIG1ieCBjbWQgd2l0aCAweDQwMDUgc2luY2UgaXQgc3RpbGwKLQkJCSAqIGNvdW50aW5nIGRvd24gaXRzIHRpbWUyd2FpdC4KLQkJCSAqLwotCQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5yZWxvZ2luX3RpbWVyLCAwKTsKLQkJCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmV0cnlfcmVsb2dpbl90aW1lciwKLQkJCQkgICBkZGJfZW50cnktPmRlZmF1bHRfdGltZTJ3YWl0ICsgNCk7Ci0JCQlERUJVRyhwcmludGsoInNjc2klbGQ6ICVzOiBkZGJbJWRdICIKLQkJCSAgICAiaW5pdGlhdGUgcmVsb2dpbiBhZnRlciAlZCBzZWNvbmRzXG4iLAotCQkJICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJCSAgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwKLQkJCSAgICBkZGJfZW50cnktPmRlZmF1bHRfdGltZTJ3YWl0ICsgNCkpOwotCQl9IGVsc2UgewotCQkJREVCVUcocHJpbnRrKCJzY3NpJWxkOiAlczogZGRiWyVkXSAiCi0JCQkgICAgInJlbG9naW4gbm90IGluaXRpYXRlZCwgc3RhdGUgPSAlZCwgIgotCQkJICAgICJkZGJfZW50cnktPmZsYWdzID0gMHglbHhcbiIsCi0JCQkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkJICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LAotCQkJICAgIGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSwKLQkJCSAgICBkZGJfZW50cnktPmZsYWdzKSk7CisJc3dpdGNoIChvbGRfZndfZGRiX2RldmljZV9zdGF0ZSkgeworCWNhc2UgRERCX0RTX0xPR0lOX0lOX1BST0NFU1M6CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBEREJfRFNfU0VTU0lPTl9BQ1RJVkU6CisJCWNhc2UgRERCX0RTX0RJU0NPVkVSWToKKwkJCWlzY3NpX2Nvbm5fc3RhcnQoZGRiX2VudHJ5LT5jb25uKTsKKwkJCWlzY3NpX2Nvbm5fbG9naW5fZXZlbnQoZGRiX2VudHJ5LT5jb25uLAorCQkJCQkgICAgICAgSVNDU0lfQ09OTl9TVEFURV9MT0dHRURfSU4pOworCQkJcWxhNHh4eF91cGRhdGVfc2Vzc2lvbl9jb25uX3BhcmFtKGhhLCBkZGJfZW50cnkpOworCQkJc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJY2FzZSBEREJfRFNfU0VTU0lPTl9GQUlMRUQ6CisJCWNhc2UgRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFOgorCQkJaXNjc2lfY29ubl9sb2dpbl9ldmVudChkZGJfZW50cnktPmNvbm4sCisJCQkJCSAgICAgICBJU0NTSV9DT05OX1NUQVRFX0ZSRUUpOworCQkJc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJCQlicmVhazsKIAkJfQorCQlicmVhazsKKwljYXNlIEREQl9EU19TRVNTSU9OX0FDVElWRToKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIEREQl9EU19TRVNTSU9OX0ZBSUxFRDoKKwkJCS8qCisJCQkgKiBpc2NzaV9zZXNzaW9uIGZhaWx1cmUgIHdpbGwgY2F1c2UgdXNlcnNwYWNlIHRvCisJCQkgKiBzdG9wIHRoZSBjb25uZWN0aW9uIHdoaWNoIGluIHR1cm4gd291bGQgYmxvY2sgdGhlCisJCQkgKiBpc2NzaV9zZXNzaW9uIGFuZCBzdGFydCByZWxvZ2luCisJCQkgKi8KKwkJCWlzY3NpX3Nlc3Npb25fZmFpbHVyZShkZGJfZW50cnktPnNlc3MtPmRkX2RhdGEsCisJCQkJCSAgICAgIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CisJCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQljYXNlIEREQl9EU19OT19DT05ORUNUSU9OX0FDVElWRToKKwkJCWNsZWFyX2JpdChmd19kZGJfaW5kZXgsIGhhLT5kZGJfaWR4X21hcCk7CisJCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRERCX0RTX1NFU1NJT05fRkFJTEVEOgorCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgRERCX0RTX1NFU1NJT05fQUNUSVZFOgorCQljYXNlIEREQl9EU19ESVNDT1ZFUlk6CisJCQlpc2NzaV9jb25uX3N0YXJ0KGRkYl9lbnRyeS0+Y29ubik7CisJCQlpc2NzaV9jb25uX2xvZ2luX2V2ZW50KGRkYl9lbnRyeS0+Y29ubiwKKwkJCQkJICAgICAgIElTQ1NJX0NPTk5fU1RBVEVfTE9HR0VEX0lOKTsKKwkJCXFsYTR4eHhfdXBkYXRlX3Nlc3Npb25fY29ubl9wYXJhbShoYSwgZGRiX2VudHJ5KTsKKwkJCXN0YXR1cyA9IFFMQV9TVUNDRVNTOworCQkJYnJlYWs7CisJCWNhc2UgRERCX0RTX1NFU1NJT05fRkFJTEVEOgorCQkJaXNjc2lfc2Vzc2lvbl9mYWlsdXJlKGRkYl9lbnRyeS0+c2Vzcy0+ZGRfZGF0YSwKKwkJCQkJICAgICAgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKKwkJCXN0YXR1cyA9IFFMQV9TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBVbmtub3duIEV2ZW50XG4iLAorCQkJCV9fZnVuY19fKSk7CisJCWJyZWFrOwogCX0KLQlyZXR1cm4gUUxBX1NVQ0NFU1M7CisKK2V4aXRfZGRiX2V2ZW50OgorCXJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW9jYi5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lvY2IuYwppbmRleCA3NWZjZDgyLi40MTA2NjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW9jYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pb2NiLmMKQEAgLTMxMywxMCArMzEzLDggQEAKIAljbWRfZW50cnktPmhkci5lbnRyeVR5cGUgPSBFVF9DT01NQU5EOwogCWNtZF9lbnRyeS0+aGFuZGxlID0gY3B1X3RvX2xlMzIoaW5kZXgpOwogCWNtZF9lbnRyeS0+dGFyZ2V0ID0gY3B1X3RvX2xlMTYoZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOwotCWNtZF9lbnRyeS0+Y29ubmVjdGlvbl9pZCA9IGNwdV90b19sZTE2KGRkYl9lbnRyeS0+Y29ubmVjdGlvbl9pZCk7CiAKIAlpbnRfdG9fc2NzaWx1bihjbWQtPmRldmljZS0+bHVuLCAmY21kX2VudHJ5LT5sdW4pOwotCWNtZF9lbnRyeS0+Y21kU2VxTnVtID0gY3B1X3RvX2xlMzIoZGRiX2VudHJ5LT5DbWRTbik7CiAJY21kX2VudHJ5LT50dGxCeXRlQ250ID0gY3B1X3RvX2xlMzIoc2NzaV9idWZmbGVuKGNtZCkpOwogCW1lbWNweShjbWRfZW50cnktPmNkYiwgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pOwogCWNtZF9lbnRyeS0+ZGF0YVNlZ0NudCA9IGNwdV90b19sZTE2KHRvdF9kc2RzKTsKQEAgLTM4MSwzICszNzksNjkgQEAKIAlyZXR1cm4gUUxBX0VSUk9SOwogfQogCitpbnQgcWxhNHh4eF9zZW5kX3Bhc3N0aHJ1MChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcGFzc3RocnUwICpwYXNzdGhydV9pb2NiOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzID0gdGFzay0+Y29ubi0+c2Vzc2lvbjsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IGRkYl9lbnRyeS0+aGE7CisJc3RydWN0IHFsNF90YXNrX2RhdGEgKnRhc2tfZGF0YSA9IHRhc2stPmRkX2RhdGE7CisJdWludDE2X3QgY3RybF9mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gUUxBX0VSUk9SOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJdGFza19kYXRhLT5pb2NiX3JlcV9jbnQgPSAxOworCS8qIFB1dCB0aGUgSU9DQiBvbiB0aGUgcmVxdWVzdCBxdWV1ZSAqLworCWlmICghcWxhNHh4eF9zcGFjZV9pbl9yZXFfcmluZyhoYSwgdGFza19kYXRhLT5pb2NiX3JlcV9jbnQpKQorCQlnb3RvIHF1ZXVpbmdfZXJyb3I7CisKKwlwYXNzdGhydV9pb2NiID0gKHN0cnVjdCBwYXNzdGhydTAgKikgaGEtPnJlcXVlc3RfcHRyOworCisJbWVtc2V0KHBhc3N0aHJ1X2lvY2IsIDAsIHNpemVvZihzdHJ1Y3QgcGFzc3RocnUwKSk7CisJcGFzc3RocnVfaW9jYi0+aGRyLmVudHJ5VHlwZSA9IEVUX1BBU1NUSFJVMDsKKwlwYXNzdGhydV9pb2NiLT5oZHIuc3lzdGVtRGVmaW5lZCA9IFNEX0lTQ1NJX1BEVTsKKwlwYXNzdGhydV9pb2NiLT5oZHIuZW50cnlDb3VudCA9IHRhc2tfZGF0YS0+aW9jYl9yZXFfY250OworCXBhc3N0aHJ1X2lvY2ItPmhhbmRsZSA9IHRhc2stPml0dDsKKwlwYXNzdGhydV9pb2NiLT50YXJnZXQgPSBjcHVfdG9fbGUxNihkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7CisJcGFzc3RocnVfaW9jYi0+dGltZW91dCA9IGNwdV90b19sZTE2KFBUX0RFRkFVTFRfVElNRU9VVCk7CisKKwkvKiBTZXR1cCB0aGUgb3V0ICYgaW4gRFNEcyAqLworCWlmICh0YXNrX2RhdGEtPnJlcV9sZW4pIHsKKwkJbWVtY3B5KCh1aW50OF90ICopdGFza19kYXRhLT5yZXFfYnVmZmVyICsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSwgdGFzay0+ZGF0YSwgdGFzay0+ZGF0YV9jb3VudCk7CisJCWN0cmxfZmxhZ3MgfD0gUFRfRkxBR19TRU5EX0JVRkZFUjsKKwkJcGFzc3RocnVfaW9jYi0+b3V0X2RzZC5iYXNlLmFkZHJMb3cgPQorCQkJCQljcHVfdG9fbGUzMihMU0RXKHRhc2tfZGF0YS0+cmVxX2RtYSkpOworCQlwYXNzdGhydV9pb2NiLT5vdXRfZHNkLmJhc2UuYWRkckhpZ2ggPQorCQkJCQljcHVfdG9fbGUzMihNU0RXKHRhc2tfZGF0YS0+cmVxX2RtYSkpOworCQlwYXNzdGhydV9pb2NiLT5vdXRfZHNkLmNvdW50ID0KKwkJCQkJY3B1X3RvX2xlMzIodGFzay0+ZGF0YV9jb3VudCArCisJCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpKTsKKwl9CisJaWYgKHRhc2tfZGF0YS0+cmVzcF9sZW4pIHsKKwkJcGFzc3RocnVfaW9jYi0+aW5fZHNkLmJhc2UuYWRkckxvdyA9CisJCQkJCWNwdV90b19sZTMyKExTRFcodGFza19kYXRhLT5yZXNwX2RtYSkpOworCQlwYXNzdGhydV9pb2NiLT5pbl9kc2QuYmFzZS5hZGRySGlnaCA9CisJCQkJCWNwdV90b19sZTMyKE1TRFcodGFza19kYXRhLT5yZXNwX2RtYSkpOworCQlwYXNzdGhydV9pb2NiLT5pbl9kc2QuY291bnQgPQorCQkJY3B1X3RvX2xlMzIodGFza19kYXRhLT5yZXNwX2xlbik7CisJfQorCisJY3RybF9mbGFncyB8PSAoUFRfRkxBR19JU0NTSV9QRFUgfCBQVF9GTEFHX1dBSVRfNF9SRVNQT05TRSk7CisJcGFzc3RocnVfaW9jYi0+Y29udHJvbF9mbGFncyA9IGNwdV90b19sZTE2KGN0cmxfZmxhZ3MpOworCisJLyogVXBkYXRlIHRoZSByZXF1ZXN0IHBvaW50ZXIgKi8KKwlxbGE0eHh4X2FkdmFuY2VfcmVxX3JpbmdfcHRyKGhhKTsKKwl3bWIoKTsKKworCS8qIFRyYWNrIElPQ0IgdXNlZCAqLworCWhhLT5pb2NiX2NudCArPSB0YXNrX2RhdGEtPmlvY2JfcmVxX2NudDsKKwloYS0+cmVxX3FfY291bnQgLT0gdGFza19kYXRhLT5pb2NiX3JlcV9jbnQ7CisJaGEtPmlzcF9vcHMtPnF1ZXVlX2lvY2IoaGEpOworCXJldCA9IFFMQV9TVUNDRVNTOworCitxdWV1aW5nX2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pc3IuYwppbmRleCAwZTcyOTIxLi44MjdlOTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lzci5jCkBAIC0yMjQsOCArMjI0LDggQEAKIAkJICogSS9PIHRvIHRoaXMgZGV2aWNlLglXZSBzaG91bGQgZ2V0IGEgZGRiIHN0YXRlIGNoYW5nZQogCQkgKiBBRU4gc29vbi4KIAkJICovCi0JCWlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgPT0gRERCX1NUQVRFX09OTElORSkKLQkJCXFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyhoYSwgZGRiX2VudHJ5KTsKKwkJaWYgKGlzY3NpX2lzX3Nlc3Npb25fb25saW5lKGRkYl9lbnRyeS0+c2VzcykpCisJCQlxbGE0eHh4X21hcmtfZGV2aWNlX21pc3NpbmcoZGRiX2VudHJ5LT5zZXNzKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNDU19EQVRBX1VOREVSUlVOOgpAQCAtMzA2LDggKzMwNiw4IEBACiAJCSAqIHNlbmQgSS9PIHRvIHRoaXMgZGV2aWNlLiAgV2Ugc2hvdWxkIGdldCBhIGRkYgogCQkgKiBzdGF0ZSBjaGFuZ2UgQUVOIHNvb24uCiAJCSAqLwotCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpID09IEREQl9TVEFURV9PTkxJTkUpCi0JCQlxbGE0eHh4X21hcmtfZGV2aWNlX21pc3NpbmcoaGEsIGRkYl9lbnRyeSk7CisJCWlmIChpc2NzaV9pc19zZXNzaW9uX29ubGluZShkZGJfZW50cnktPnNlc3MpKQorCQkJcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKGRkYl9lbnRyeS0+c2Vzcyk7CiAKIAkJY21kLT5yZXN1bHQgPSBESURfVFJBTlNQT1JUX0RJU1JVUFRFRCA8PCAxNjsKIAkJYnJlYWs7CkBAIC0zNDEsNiArMzQxLDUxIEBACiB9CiAKIC8qKgorICogcWxhNHh4eF9wYXNzdGhydV9zdGF0dXNfZW50cnkgLSBwcm9jZXNzZXMgcGFzc3RocnUgc3RhdHVzIElPQ0JzICgweDNDKQorICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiBAc3RzX2VudHJ5OiBQb2ludGVyIHRvIHN0YXR1cyBlbnRyeSBzdHJ1Y3R1cmUuCisgKiovCitzdGF0aWMgdm9pZCBxbGE0eHh4X3Bhc3N0aHJ1X3N0YXR1c19lbnRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJCSAgc3RydWN0IHBhc3N0aHJ1X3N0YXR1cyAqc3RzX2VudHJ5KQoreworCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlzdHJ1Y3QgcWw0X3Rhc2tfZGF0YSAqdGFza19kYXRhOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm47CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisJaXR0X3QgaXR0OworCXVpbnQzMl90IGZ3X2RkYl9pbmRleDsKKworCWl0dCA9IHN0c19lbnRyeS0+aGFuZGxlOworCWZ3X2RkYl9pbmRleCA9IGxlMzJfdG9fY3B1KHN0c19lbnRyeS0+dGFyZ2V0KTsKKworCWRkYl9lbnRyeSA9IHFsYTR4eHhfbG9va3VwX2RkYl9ieV9md19pbmRleChoYSwgZndfZGRiX2luZGV4KTsKKworCWlmIChkZGJfZW50cnkgPT0gTlVMTCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBJbnZhbGlkIHRhcmdldCBpbmRleCA9IDB4JXhcbiIsCisJCQkgICBfX2Z1bmNfXywgc3RzX2VudHJ5LT50YXJnZXQpOworCQlyZXR1cm47CisJfQorCisJY2xzX2Nvbm4gPSBkZGJfZW50cnktPmNvbm47CisJY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCXNwaW5fbG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJdGFzayA9IGlzY3NpX2l0dF90b190YXNrKGNvbm4sIGl0dCk7CisJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCisJaWYgKHRhc2sgPT0gTlVMTCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBUYXNrIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXRhc2tfZGF0YSA9IHRhc2stPmRkX2RhdGE7CisJbWVtY3B5KCZ0YXNrX2RhdGEtPnN0cywgc3RzX2VudHJ5LCBzaXplb2Yoc3RydWN0IHBhc3N0aHJ1X3N0YXR1cykpOworCWhhLT5yZXFfcV9jb3VudCArPSB0YXNrX2RhdGEtPmlvY2JfcmVxX2NudDsKKwloYS0+aW9jYl9jbnQgLT0gdGFza19kYXRhLT5pb2NiX3JlcV9jbnQ7CisJcXVldWVfd29yayhoYS0+dGFza193cSwgJnRhc2tfZGF0YS0+dGFza193b3JrKTsKK30KKworLyoqCiAgKiBxbGE0eHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUgLSBwcm9jZXNzIHJlc3BvbnNlIHF1ZXVlIGNvbXBsZXRpb25zCiAgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KICAqCkBAIC0zNzUsNiArNDIwLDE0IEBACiAJCQlicmVhazsKIAogCQljYXNlIEVUX1BBU1NUSFJVX1NUQVRVUzoKKwkJCWlmIChzdHNfZW50cnktPmhkci5zeXN0ZW1EZWZpbmVkID09IFNEX0lTQ1NJX1BEVSkKKwkJCQlxbGE0eHh4X3Bhc3N0aHJ1X3N0YXR1c19lbnRyeShoYSwKKwkJCQkJKHN0cnVjdCBwYXNzdGhydV9zdGF0dXMgKilzdHNfZW50cnkpOworCQkJZWxzZQorCQkJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJCQkgICAiJXM6IEludmFsaWQgc3RhdHVzIHJlY2VpdmVkXG4iLAorCQkJCQkgICBfX2Z1bmNfXyk7CisKIAkJCWJyZWFrOwogCiAJCWNhc2UgRVRfU1RBVFVTX0NPTlRJTlVBVElPTjoKQEAgLTU2Niw2ICs2MTksOCBAQAogCQkJZWxzZSBpZiAoKG1ib3hfc3RzWzNdID09IEFDQl9TVEFURV9BQ1FVSVJJTkcpICYmCiAJCQkgICAgKG1ib3hfc3RzWzJdID09IEFDQl9TVEFURV9WQUxJRCkpCiAJCQkJc2V0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWVsc2UgaWYgKChtYm94X3N0c1szXSA9PSBBQ0JfU1RBVEVfVU5DT05GSUdVUkVEKSkKKwkJCQljb21wbGV0ZSgmaGEtPmRpc2FibGVfYWNiX2NvbXApOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNQk9YX0FTVFNfTUFDX0FERFJFU1NfQ0hBTkdFRDoKQEAgLTEwMDksMjMgKzEwNjQsMjMgQEAKIAogCQlzd2l0Y2ggKG1ib3hfc3RzWzBdKSB7CiAJCWNhc2UgTUJPWF9BU1RTX0RBVEFCQVNFX0NIQU5HRUQ6Ci0JCQlpZiAocHJvY2Vzc19hZW4gPT0gRkxVU0hfRERCX0NIQU5HRURfQUVOUykgeworCQkJc3dpdGNoIChwcm9jZXNzX2FlbikgeworCQkJY2FzZSBGTFVTSF9EREJfQ0hBTkdFRF9BRU5TOgogCQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6IEFFTlslZF0gJTA0eCwgaW5kZXggIgogCQkJCQkgICAgICAiWyVkXSBzdGF0ZT0lMDR4IEZMVVNIRUQhXG4iLAogCQkJCQkgICAgICBoYS0+aG9zdF9ubywgaGEtPmFlbl9vdXQsCiAJCQkJCSAgICAgIG1ib3hfc3RzWzBdLCBtYm94X3N0c1syXSwKIAkJCQkJICAgICAgbWJveF9zdHNbM10pKTsKIAkJCQlicmVhazsKKwkJCWNhc2UgUFJPQ0VTU19BTExfQUVOUzoKKwkJCWRlZmF1bHQ6CisJCQkJLyogU3BlY2lmaWMgZGV2aWNlLiAqLworCQkJCWlmIChtYm94X3N0c1sxXSA9PSAxKQorCQkJCQlxbGE0eHh4X3Byb2Nlc3NfZGRiX2NoYW5nZWQoaGEsCisJCQkJCQltYm94X3N0c1syXSwgbWJveF9zdHNbM10sCisJCQkJCQltYm94X3N0c1s0XSk7CisJCQkJYnJlYWs7CiAJCQl9Ci0JCWNhc2UgUFJPQ0VTU19BTExfQUVOUzoKLQkJZGVmYXVsdDoKLQkJCWlmIChtYm94X3N0c1sxXSA9PSAwKSB7CS8qIEdsb2JhbCBEQiBjaGFuZ2UuICovCi0JCQkJcWxhNHh4eF9yZWluaXRpYWxpemVfZGRiX2xpc3QoaGEpOwotCQkJfSBlbHNlIGlmIChtYm94X3N0c1sxXSA9PSAxKSB7CS8qIFNwZWNpZmljIGRldmljZS4gKi8KLQkJCQlxbGE0eHh4X3Byb2Nlc3NfZGRiX2NoYW5nZWQoaGEsIG1ib3hfc3RzWzJdLAotCQkJCQkJbWJveF9zdHNbM10sIG1ib3hfc3RzWzRdKTsKLQkJCX0KLQkJCWJyZWFrOwogCQl9CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYwppbmRleCBmY2U4Mjg5Li40YzJiODQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCkBAIC0zMDMsNyArMzAzLDcgQEAKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CiB9CiAKLXN0YXRpYyB1aW50OF90Cit1aW50OF90CiBxbGE0eHh4X2dldF9pZmNiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgKm1ib3hfY21kLAogCQkgdWludDMyX3QgKm1ib3hfc3RzLCBkbWFfYWRkcl90IGluaXRfZndfY2JfZG1hKQogewpAQCAtMzI3LDQzICszMjcsNjkgQEAKIAogc3RhdGljIHZvaWQKIHFsYTR4eHhfdXBkYXRlX2xvY2FsX2lwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCSBzdHJ1Y3QgYWRkcl9jdHJsX2JsayAgKmluaXRfZndfY2IpCisJCQlzdHJ1Y3QgYWRkcl9jdHJsX2JsayAqaW5pdF9md19jYikKIHsKKwloYS0+aXBfY29uZmlnLnRjcF9vcHRpb25zID0gbGUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2NF90Y3Bfb3B0cyk7CisJaGEtPmlwX2NvbmZpZy5pcHY0X29wdGlvbnMgPSBsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY0X2lwX29wdHMpOworCWhhLT5pcF9jb25maWcuaXB2NF9hZGRyX3N0YXRlID0KKwkJCQlsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY0X2FkZHJfc3RhdGUpOworCWhhLT5pcF9jb25maWcuZXRoX210dV9zaXplID0KKwkJCQlsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5ldGhfbXR1X3NpemUpOworCWhhLT5pcF9jb25maWcuaXB2NF9wb3J0ID0gbGUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2NF9wb3J0KTsKKworCWlmIChoYS0+YWNiX3ZlcnNpb24gPT0gQUNCX1NVUFBPUlRFRCkgeworCQloYS0+aXBfY29uZmlnLmlwdjZfb3B0aW9ucyA9IGxlMTZfdG9fY3B1KGluaXRfZndfY2ItPmlwdjZfb3B0cyk7CisJCWhhLT5pcF9jb25maWcuaXB2Nl9hZGRsX29wdGlvbnMgPQorCQkJCWxlMTZfdG9fY3B1KGluaXRfZndfY2ItPmlwdjZfYWRkdGxfb3B0cyk7CisJfQorCiAJLyogU2F2ZSBJUHY0IEFkZHJlc3MgSW5mbyAqLwotCW1lbWNweShoYS0+aXBfYWRkcmVzcywgaW5pdF9md19jYi0+aXB2NF9hZGRyLAotCQltaW4oc2l6ZW9mKGhhLT5pcF9hZGRyZXNzKSwgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjRfYWRkcikpKTsKLQltZW1jcHkoaGEtPnN1Ym5ldF9tYXNrLCBpbml0X2Z3X2NiLT5pcHY0X3N1Ym5ldCwKLQkJbWluKHNpemVvZihoYS0+c3VibmV0X21hc2spLCBzaXplb2YoaW5pdF9md19jYi0+aXB2NF9zdWJuZXQpKSk7Ci0JbWVtY3B5KGhhLT5nYXRld2F5LCBpbml0X2Z3X2NiLT5pcHY0X2d3X2FkZHIsCi0JCW1pbihzaXplb2YoaGEtPmdhdGV3YXkpLCBzaXplb2YoaW5pdF9md19jYi0+aXB2NF9nd19hZGRyKSkpOworCW1lbWNweShoYS0+aXBfY29uZmlnLmlwX2FkZHJlc3MsIGluaXRfZndfY2ItPmlwdjRfYWRkciwKKwkgICAgICAgbWluKHNpemVvZihoYS0+aXBfY29uZmlnLmlwX2FkZHJlc3MpLAorCQkgICBzaXplb2YoaW5pdF9md19jYi0+aXB2NF9hZGRyKSkpOworCW1lbWNweShoYS0+aXBfY29uZmlnLnN1Ym5ldF9tYXNrLCBpbml0X2Z3X2NiLT5pcHY0X3N1Ym5ldCwKKwkgICAgICAgbWluKHNpemVvZihoYS0+aXBfY29uZmlnLnN1Ym5ldF9tYXNrKSwKKwkJICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjRfc3VibmV0KSkpOworCW1lbWNweShoYS0+aXBfY29uZmlnLmdhdGV3YXksIGluaXRfZndfY2ItPmlwdjRfZ3dfYWRkciwKKwkgICAgICAgbWluKHNpemVvZihoYS0+aXBfY29uZmlnLmdhdGV3YXkpLAorCQkgICBzaXplb2YoaW5pdF9md19jYi0+aXB2NF9nd19hZGRyKSkpOworCisJaGEtPmlwX2NvbmZpZy5pcHY0X3ZsYW5fdGFnID0gYmUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2NF92bGFuX3RhZyk7CiAKIAlpZiAoaXNfaXB2Nl9lbmFibGVkKGhhKSkgewogCQkvKiBTYXZlIElQdjYgQWRkcmVzcyAqLwotCQloYS0+aXB2Nl9saW5rX2xvY2FsX3N0YXRlID0gaW5pdF9md19jYi0+aXB2Nl9sbmtfbGNsX2FkZHJfc3RhdGU7Ci0JCWhhLT5pcHY2X2FkZHIwX3N0YXRlID0gaW5pdF9md19jYi0+aXB2Nl9hZGRyMF9zdGF0ZTsKLQkJaGEtPmlwdjZfYWRkcjFfc3RhdGUgPSBpbml0X2Z3X2NiLT5pcHY2X2FkZHIxX3N0YXRlOwotCQloYS0+aXB2Nl9kZWZhdWx0X3JvdXRlcl9zdGF0ZSA9IGluaXRfZndfY2ItPmlwdjZfZGZsdF9ydHJfc3RhdGU7Ci0JCWhhLT5pcHY2X2xpbmtfbG9jYWxfYWRkci5pbjZfdS51Nl9hZGRyOFswXSA9IDB4RkU7Ci0JCWhhLT5pcHY2X2xpbmtfbG9jYWxfYWRkci5pbjZfdS51Nl9hZGRyOFsxXSA9IDB4ODA7CisJCWhhLT5pcF9jb25maWcuaXB2Nl9saW5rX2xvY2FsX3N0YXRlID0KKwkJCWxlMTZfdG9fY3B1KGluaXRfZndfY2ItPmlwdjZfbG5rX2xjbF9hZGRyX3N0YXRlKTsKKwkJaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIwX3N0YXRlID0KKwkJCQlsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY2X2FkZHIwX3N0YXRlKTsKKwkJaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIxX3N0YXRlID0KKwkJCQlsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY2X2FkZHIxX3N0YXRlKTsKKwkJaGEtPmlwX2NvbmZpZy5pcHY2X2RlZmF1bHRfcm91dGVyX3N0YXRlID0KKwkJCQlsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY2X2RmbHRfcnRyX3N0YXRlKTsKKwkJaGEtPmlwX2NvbmZpZy5pcHY2X2xpbmtfbG9jYWxfYWRkci5pbjZfdS51Nl9hZGRyOFswXSA9IDB4RkU7CisJCWhhLT5pcF9jb25maWcuaXB2Nl9saW5rX2xvY2FsX2FkZHIuaW42X3UudTZfYWRkcjhbMV0gPSAweDgwOwogCi0JCW1lbWNweSgmaGEtPmlwdjZfbGlua19sb2NhbF9hZGRyLmluNl91LnU2X2FkZHI4WzhdLAotCQkJaW5pdF9md19jYi0+aXB2Nl9pZl9pZCwKLQkJCW1pbihzaXplb2YoaGEtPmlwdjZfbGlua19sb2NhbF9hZGRyKS8yLAotCQkJc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfaWZfaWQpKSk7Ci0JCW1lbWNweSgmaGEtPmlwdjZfYWRkcjAsIGluaXRfZndfY2ItPmlwdjZfYWRkcjAsCi0JCQltaW4oc2l6ZW9mKGhhLT5pcHY2X2FkZHIwKSwKLQkJCXNpemVvZihpbml0X2Z3X2NiLT5pcHY2X2FkZHIwKSkpOwotCQltZW1jcHkoJmhhLT5pcHY2X2FkZHIxLCBpbml0X2Z3X2NiLT5pcHY2X2FkZHIxLAotCQkJbWluKHNpemVvZihoYS0+aXB2Nl9hZGRyMSksCi0JCQlzaXplb2YoaW5pdF9md19jYi0+aXB2Nl9hZGRyMSkpKTsKLQkJbWVtY3B5KCZoYS0+aXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyLAotCQkJaW5pdF9md19jYi0+aXB2Nl9kZmx0X3J0cl9hZGRyLAotCQkJbWluKHNpemVvZihoYS0+aXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyKSwKLQkJCXNpemVvZihpbml0X2Z3X2NiLT5pcHY2X2RmbHRfcnRyX2FkZHIpKSk7CisJCW1lbWNweSgmaGEtPmlwX2NvbmZpZy5pcHY2X2xpbmtfbG9jYWxfYWRkci5pbjZfdS51Nl9hZGRyOFs4XSwKKwkJICAgICAgIGluaXRfZndfY2ItPmlwdjZfaWZfaWQsCisJCSAgICAgICBtaW4oc2l6ZW9mKGhhLT5pcF9jb25maWcuaXB2Nl9saW5rX2xvY2FsX2FkZHIpLzIsCisJCQkgICBzaXplb2YoaW5pdF9md19jYi0+aXB2Nl9pZl9pZCkpKTsKKwkJbWVtY3B5KCZoYS0+aXBfY29uZmlnLmlwdjZfYWRkcjAsIGluaXRfZndfY2ItPmlwdjZfYWRkcjAsCisJCSAgICAgICBtaW4oc2l6ZW9mKGhhLT5pcF9jb25maWcuaXB2Nl9hZGRyMCksCisJCQkgICBzaXplb2YoaW5pdF9md19jYi0+aXB2Nl9hZGRyMCkpKTsKKwkJbWVtY3B5KCZoYS0+aXBfY29uZmlnLmlwdjZfYWRkcjEsIGluaXRfZndfY2ItPmlwdjZfYWRkcjEsCisJCSAgICAgICBtaW4oc2l6ZW9mKGhhLT5pcF9jb25maWcuaXB2Nl9hZGRyMSksCisJCQkgICBzaXplb2YoaW5pdF9md19jYi0+aXB2Nl9hZGRyMSkpKTsKKwkJbWVtY3B5KCZoYS0+aXBfY29uZmlnLmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkciwKKwkJICAgICAgIGluaXRfZndfY2ItPmlwdjZfZGZsdF9ydHJfYWRkciwKKwkJICAgICAgIG1pbihzaXplb2YoaGEtPmlwX2NvbmZpZy5pcHY2X2RlZmF1bHRfcm91dGVyX2FkZHIpLAorCQkJICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfZGZsdF9ydHJfYWRkcikpKTsKKwkJaGEtPmlwX2NvbmZpZy5pcHY2X3ZsYW5fdGFnID0KKwkJCQliZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY2X3ZsYW5fdGFnKTsKKwkJaGEtPmlwX2NvbmZpZy5pcHY2X3BvcnQgPSBsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY2X3BvcnQpOwogCX0KIH0KIAotc3RhdGljIHVpbnQ4X3QKK3VpbnQ4X3QKIHFsYTR4eHhfdXBkYXRlX2xvY2FsX2lmY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAogCQkJICB1aW50MzJfdCAqbWJveF9jbWQsCiAJCQkgIHVpbnQzMl90ICptYm94X3N0cywKQEAgLTM4Myw5ICs0MDksNiBAQAogCS8qIFNhdmUgc29tZSBpbmZvIGluIGFkYXB0ZXIgc3RydWN0dXJlLiAqLwogCWhhLT5hY2JfdmVyc2lvbiA9IGluaXRfZndfY2ItPmFjYl92ZXJzaW9uOwogCWhhLT5maXJtd2FyZV9vcHRpb25zID0gbGUxNl90b19jcHUoaW5pdF9md19jYi0+Zndfb3B0aW9ucyk7Ci0JaGEtPnRjcF9vcHRpb25zID0gbGUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2NF90Y3Bfb3B0cyk7Ci0JaGEtPmlwdjRfb3B0aW9ucyA9IGxlMTZfdG9fY3B1KGluaXRfZndfY2ItPmlwdjRfaXBfb3B0cyk7Ci0JaGEtPmlwdjRfYWRkcl9zdGF0ZSA9IGxlMTZfdG9fY3B1KGluaXRfZndfY2ItPmlwdjRfYWRkcl9zdGF0ZSk7CiAJaGEtPmhlYXJ0YmVhdF9pbnRlcnZhbCA9IGluaXRfZndfY2ItPmhiX2ludGVydmFsOwogCW1lbWNweShoYS0+bmFtZV9zdHJpbmcsIGluaXRfZndfY2ItPmlzY3NpX25hbWUsCiAJCW1pbihzaXplb2YoaGEtPm5hbWVfc3RyaW5nKSwKQEAgLTM5MywxMCArNDE2LDYgQEAKIAkvKm1lbWNweShoYS0+YWxpYXMsIGluaXRfZndfY2ItPkFsaWFzLAogCSAgICAgICBtaW4oc2l6ZW9mKGhhLT5hbGlhcyksIHNpemVvZihpbml0X2Z3X2NiLT5BbGlhcykpKTsqLwogCi0JaWYgKGhhLT5hY2JfdmVyc2lvbiA9PSBBQ0JfU1VQUE9SVEVEKSB7Ci0JCWhhLT5pcHY2X29wdGlvbnMgPSBpbml0X2Z3X2NiLT5pcHY2X29wdHM7Ci0JCWhhLT5pcHY2X2FkZGxfb3B0aW9ucyA9IGluaXRfZndfY2ItPmlwdjZfYWRkdGxfb3B0czsKLQl9CiAJcWxhNHh4eF91cGRhdGVfbG9jYWxfaXAoaGEsIGluaXRfZndfY2IpOwogCiAJcmV0dXJuIFFMQV9TVUNDRVNTOwpAQCAtNDYyLDEwICs0ODEsMTEgQEAKIAogCWluaXRfZndfY2ItPmZ3X29wdGlvbnMgJj0gX19jb25zdGFudF9jcHVfdG9fbGUxNih+RldPUFRfVEFSR0VUX01PREUpOwogCi0JLyogU2V0IGJpdCBmb3IgInNlcmlhbGl6ZSB0YXNrIG1nbXQiIGFsbCBvdGhlciBiaXRzIG5lZWQgdG8gYmUgemVybyAqLwogCWluaXRfZndfY2ItPmFkZF9md19vcHRpb25zID0gMDsKIAlpbml0X2Z3X2NiLT5hZGRfZndfb3B0aW9ucyB8PQotCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTE2KFNFUklBTElaRV9UQVNLX01HTVQpOworCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihBREZXT1BUX1NFUklBTElaRV9UQVNLX01HTVQpOworCWluaXRfZndfY2ItPmFkZF9md19vcHRpb25zIHw9CisJCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEFERldPUFRfQVVUT0NPTk5fRElTQUJMRSk7CiAKIAlpZiAocWxhNHh4eF9zZXRfaWZjYihoYSwgJm1ib3hfY21kWzBdLCAmbWJveF9zdHNbMF0sIGluaXRfZndfY2JfZG1hKQogCQkhPSBRTEFfU1VDQ0VTUykgewpAQCAtNjkxLDE5ICs3MTEsMzggQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitpbnQgcWxhNHh4eF9jb25uX29wZW4oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCBmd19kZGJfaW5kZXgpCit7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKwlpbnQgc3RhdHVzOworCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0NPTk5fT1BFTjsKKwltYm94X2NtZFsxXSA9IGZ3X2RkYl9pbmRleDsKKworCXN0YXR1cyA9IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCBNQk9YX1JFR19DT1VOVCwgMiwgJm1ib3hfY21kWzBdLAorCQkJCQkgJm1ib3hfc3RzWzBdKTsKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAiJXM6IHN0YXR1cyA9ICVkIG1ieDAgPSAweCV4IG1ieDEgPSAweCV4XG4iLAorCQkJICBfX2Z1bmNfXywgc3RhdHVzLCBtYm94X3N0c1swXSwgbWJveF9zdHNbMV0pKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiAvKioKICAqIHFsYTR4eHhfc2V0X2Z3ZGRiX2VudHJ5IC0gc2V0cyBhIGRkYiBlbnRyeS4KICAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgogICogQGZ3X2RkYl9pbmRleDogRmlybXdhcmUncyBkZXZpY2UgZGF0YWJhc2UgaW5kZXgKLSAqIEBmd19kZGJfZW50cnk6IFBvaW50ZXIgdG8gZmlybXdhcmUncyBkZGIgZW50cnkgc3RydWN0dXJlLCBvciBOVUxMLgorICogQGZ3X2RkYl9lbnRyeV9kbWE6IGRtYSBhZGRyZXNzIG9mIGRkYiBlbnRyeQorICogQG1ieF9zdHM6IG1haWxib3ggMCB0byBiZSByZXR1cm5lZCBvciBOVUxMCiAgKgogICogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIG9yIHVwZGF0ZXMgdGhlIGFkYXB0ZXIncyBkZXZpY2UgZGF0YWJhc2UKLSAqIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGRldmljZS4gSXQgYWxzbyB0cmlnZ2VycyBhIGxvZ2luIGZvciB0aGUKLSAqIHNwZWNpZmllZCBkZXZpY2UuIFRoZXJlZm9yZSwgaXQgbWF5IGFsc28gYmUgdXNlZCBhcyBhIHNlY29uZGFyeQotICogbG9naW4gcm91dGluZSB3aGVuIGEgTlVMTCBwb2ludGVyIGlzIHNwZWNpZmllZCBmb3IgdGhlIGZ3X2RkYl9lbnRyeS4KKyAqIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGRldmljZS4KICAqKi8KIGludCBxbGE0eHh4X3NldF9kZGJfZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgdWludDE2X3QgZndfZGRiX2luZGV4LAotCQkJICBkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWEpCisJCQkgIGRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYSwgdWludDMyX3QgKm1ieF9zdHMpCiB7CiAJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOwogCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKQEAgLTcyMiwxMyArNzYxLDQxIEBACiAJbWJveF9jbWRbNF0gPSBzaXplb2Yoc3RydWN0IGRldl9kYl9lbnRyeSk7CiAKIAlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDUsICZtYm94X2NtZFswXSwKLQkgICAgJm1ib3hfc3RzWzBdKTsKKwkJCQkJICZtYm94X3N0c1swXSk7CisJaWYgKG1ieF9zdHMpCisJCSptYnhfc3RzID0gbWJveF9zdHNbMF07CiAJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IHN0YXR1cz0lZCBtYngwPTB4JXggbWJ4ND0weCV4XG4iLAogCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIHN0YXR1cywgbWJveF9zdHNbMF0sIG1ib3hfc3RzWzRdKTspCiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitpbnQgcWxhNHh4eF9zZXNzaW9uX2xvZ291dF9kZGIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJICAgICAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgaW50IG9wdGlvbnMpCit7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0NPTk5fQ0xPU0VfU0VTU19MT0dPVVQ7CisJbWJveF9jbWRbMV0gPSBkZGJfZW50cnktPmZ3X2RkYl9pbmRleDsKKwltYm94X2NtZFszXSA9IG9wdGlvbnM7CisKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDIsICZtYm94X2NtZFswXSwKKwkJCQkJICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgIiVzOiBNQk9YX0NNRF9DT05OX0NMT1NFX1NFU1NfTE9HT1VUICIKKwkJCQkgICJmYWlsZWQgc3RzICUwNFggJTA0WCIsIF9fZnVuY19fLAorCQkJCSAgbWJveF9zdHNbMF0sIG1ib3hfc3RzWzFdKSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKwogLyoqCiAgKiBxbGE0eHh4X2dldF9jcmFzaF9yZWNvcmQgLSByZXRyaWV2ZXMgY3Jhc2ggcmVjb3JkLgogICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCkBAIC04MDUsNyArODcyLDYgQEAKIAl1aW50MzJfdAltYXhfZXZlbnRfbG9nX2VudHJpZXM7CiAJdWludDhfdAkJaTsKIAotCiAJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CiAJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CiAKQEAgLTExMDQsNyArMTE3MCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBxbGE0eHh4X2dldF9kZWZhdWx0X2RkYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCitzdGF0aWMgaW50IHFsYTR4eHhfZ2V0X2RlZmF1bHRfZGRiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3Qgb3B0aW9ucywKIAkJCQkgICBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKQEAgLTExMTQsNiArMTE4MCw3IEBACiAJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CiAKIAltYm94X2NtZFswXSA9IE1CT1hfQ01EX0dFVF9EQVRBQkFTRV9FTlRSWV9ERUZBVUxUUzsKKwltYm94X2NtZFsxXSA9IG9wdGlvbnM7CiAJbWJveF9jbWRbMl0gPSBMU0RXKGRtYV9hZGRyKTsKIAltYm94X2NtZFszXSA9IE1TRFcoZG1hX2FkZHIpOwogCkBAIC0xMTI2LDggKzExOTMsMTAgQEAKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CiB9CiAKLXN0YXRpYyBpbnQgcWxhNHh4eF9yZXFfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgKmRkYl9pbmRleCkKK2ludCBxbGE0eHh4X3JlcV9kZGJfZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBkZGJfaW5kZXgsCisJCQkgIHVpbnQzMl90ICptYnhfc3RzKQogeworCWludCBzdGF0dXM7CiAJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOwogCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKIApAQCAtMTEzNSw3NSArMTIwNCw2NDYgQEAKIAltZW1zZXQoJm1ib3hfc3RzLCAwLCBzaXplb2YobWJveF9zdHMpKTsKIAogCW1ib3hfY21kWzBdID0gTUJPWF9DTURfUkVRVUVTVF9EQVRBQkFTRV9FTlRSWTsKLQltYm94X2NtZFsxXSA9IE1BWF9QUlNUX0RFVl9EQl9FTlRSSUVTOworCW1ib3hfY21kWzFdID0gZGRiX2luZGV4OwogCi0JaWYgKHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCBNQk9YX1JFR19DT1VOVCwgMywgJm1ib3hfY21kWzBdLCAmbWJveF9zdHNbMF0pICE9Ci0JICAgIFFMQV9TVUNDRVNTKSB7Ci0JCWlmIChtYm94X3N0c1swXSA9PSBNQk9YX1NUU19DT01NQU5EX0VSUk9SKSB7Ci0JCQkqZGRiX2luZGV4ID0gbWJveF9zdHNbMl07Ci0JCX0gZWxzZSB7Ci0JCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogZmFpbGVkIHN0YXR1cyAlMDRYXG4iLAotCQkJICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIG1ib3hfc3RzWzBdKSk7Ci0JCQlyZXR1cm4gUUxBX0VSUk9SOwotCQl9Ci0JfSBlbHNlIHsKLQkJKmRkYl9pbmRleCA9IE1BWF9QUlNUX0RFVl9EQl9FTlRSSUVTOworCXN0YXR1cyA9IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCBNQk9YX1JFR19DT1VOVCwgMSwgJm1ib3hfY21kWzBdLAorCQkJCQkgJm1ib3hfc3RzWzBdKTsKKwlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBmYWlsZWQgc3RhdHVzICUwNFhcbiIsCisJCQkJICAgX19mdW5jX18sIG1ib3hfc3RzWzBdKSk7CiAJfQogCi0JcmV0dXJuIFFMQV9TVUNDRVNTOworCSptYnhfc3RzID0gbWJveF9zdHNbMF07CisJcmV0dXJuIHN0YXR1czsKIH0KIAoraW50IHFsYTR4eHhfY2xlYXJfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgZGRiX2luZGV4KQoreworCWludCBzdGF0dXM7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKIAotaW50IHFsYTR4eHhfc2VuZF90Z3RzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqaXAsIHVpbnQxNl90IHBvcnQpCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0NMRUFSX0RBVEFCQVNFX0VOVFJZOworCW1ib3hfY21kWzFdID0gZGRiX2luZGV4OworCisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIDIsIDEsICZtYm94X2NtZFswXSwKKwkJCQkJICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogZmFpbGVkIHN0YXR1cyAlMDRYXG4iLAorCQkJCSAgIF9fZnVuY19fLCBtYm94X3N0c1swXSkpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBxbGE0eHh4X3NldF9mbGFzaChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCSAgICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgbGVuZ3RoLCB1aW50MzJfdCBvcHRpb25zKQoreworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOworCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX1dSSVRFX0ZMQVNIOworCW1ib3hfY21kWzFdID0gTFNEVyhkbWFfYWRkcik7CisJbWJveF9jbWRbMl0gPSBNU0RXKGRtYV9hZGRyKTsKKwltYm94X2NtZFszXSA9IG9mZnNldDsKKwltYm94X2NtZFs0XSA9IGxlbmd0aDsKKwltYm94X2NtZFs1XSA9IG9wdGlvbnM7CisKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgNiwgMiwgJm1ib3hfY21kWzBdLCAmbWJveF9zdHNbMF0pOworCWlmIChzdGF0dXMgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBNQk9YX0NNRF9XUklURV9GTEFTSCAiCisJCQkJICAiZmFpbGVkIHcvIHN0YXR1cyAlMDRYLCBtYngxICUwNFhcbiIsCisJCQkJICBfX2Z1bmNfXywgbWJveF9zdHNbMF0sIG1ib3hfc3RzWzFdKSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBxbGE0eHh4X2Jvb3RkYl9ieV9pbmRleChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkgICAgc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5LAorCQkJICAgIGRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYSwgdWludDE2X3QgZGRiX2luZGV4KQoreworCXVpbnQzMl90IGRldl9kYl9zdGFydF9vZmZzZXQgPSBGTEFTSF9PRkZTRVRfREJfSU5GTzsKKwl1aW50MzJfdCBkZXZfZGJfZW5kX29mZnNldDsKKwlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOworCisJbWVtc2V0KGZ3X2RkYl9lbnRyeSwgMCwgc2l6ZW9mKCpmd19kZGJfZW50cnkpKTsKKworCWRldl9kYl9zdGFydF9vZmZzZXQgKz0gKGRkYl9pbmRleCAqIHNpemVvZigqZndfZGRiX2VudHJ5KSk7CisJZGV2X2RiX2VuZF9vZmZzZXQgPSBGTEFTSF9PRkZTRVRfREJfRU5EOworCisJaWYgKGRldl9kYl9zdGFydF9vZmZzZXQgPiBkZXZfZGJfZW5kX29mZnNldCkgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkJICAiJXM6SW52YWxpZCBEREIgaW5kZXggJWQiLCBfX2Z1bmNfXywKKwkJCQkgIGRkYl9pbmRleCkpOworCQlnb3RvIGV4aXRfYm9vdGRiX2ZhaWxlZDsKKwl9CisKKwlpZiAocWxhNHh4eF9nZXRfZmxhc2goaGEsIGZ3X2RkYl9lbnRyeV9kbWEsIGRldl9kYl9zdGFydF9vZmZzZXQsCisJCQkgICAgICBzaXplb2YoKmZ3X2RkYl9lbnRyeSkpICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAic2NzaSVsZDogJXM6IEdldCBGbGFzaCIKKwkJCSAgICJmYWlsZWRcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXhpdF9ib290ZGJfZmFpbGVkOworCX0KKworCWlmIChmd19kZGJfZW50cnktPmNvb2tpZSA9PSBEREJfVkFMSURfQ09PS0lFKQorCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKworZXhpdF9ib290ZGJfZmFpbGVkOgorCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBxbGE0eHh4X2dldF9jaGFwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqdXNlcm5hbWUsIGNoYXIgKnBhc3N3b3JkLAorCQkgICAgIHVpbnQxNl90IGlkeCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcnZhbCA9IFFMQV9FUlJPUjsKKwl1aW50MzJfdCBvZmZzZXQgPSAwLCBjaGFwX3NpemU7CisJc3RydWN0IHFsNF9jaGFwX3RhYmxlICpjaGFwX3RhYmxlOworCWRtYV9hZGRyX3QgY2hhcF9kbWE7CisKKwljaGFwX3RhYmxlID0gZG1hX3Bvb2xfYWxsb2MoaGEtPmNoYXBfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZjaGFwX2RtYSk7CisJaWYgKGNoYXBfdGFibGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfZ2V0X2NoYXA7CisJfQorCisJY2hhcF9zaXplID0gc2l6ZW9mKHN0cnVjdCBxbDRfY2hhcF90YWJsZSk7CisJbWVtc2V0KGNoYXBfdGFibGUsIDAsIGNoYXBfc2l6ZSk7CisKKwlpZiAoaXNfcWxhNDBYWChoYSkpCisJCW9mZnNldCA9IEZMQVNIX0NIQVBfT0ZGU0VUIHwgKGlkeCAqIGNoYXBfc2l6ZSk7CisJZWxzZSB7CisJCW9mZnNldCA9IEZMQVNIX1JBV19BQ0NFU1NfQUREUiArIChoYS0+aHcuZmx0X3JlZ2lvbl9jaGFwIDw8IDIpOworCQkvKiBmbHRfY2hhcF9zaXplIGlzIENIQVAgdGFibGUgc2l6ZSBmb3IgYm90aCBwb3J0cworCQkgKiBzbyBkaXZpZGUgaXQgYnkgMiB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3Igc2Vjb25kIHBvcnQKKwkJICovCisJCWlmIChoYS0+cG9ydF9udW0gPT0gMSkKKwkJCW9mZnNldCArPSAoaGEtPmh3LmZsdF9jaGFwX3NpemUgLyAyKTsKKwkJb2Zmc2V0ICs9IChpZHggKiBjaGFwX3NpemUpOworCX0KKworCXJ2YWwgPSBxbGE0eHh4X2dldF9mbGFzaChoYSwgY2hhcF9kbWEsIG9mZnNldCwgY2hhcF9zaXplKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXRfZ2V0X2NoYXA7CisJfQorCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkNoYXAgQ29va2llOiB4JXhcbiIsCisJCV9fbGUxNl90b19jcHUoY2hhcF90YWJsZS0+Y29va2llKSkpOworCisJaWYgKF9fbGUxNl90b19jcHUoY2hhcF90YWJsZS0+Y29va2llKSAhPSBDSEFQX1ZBTElEX0NPT0tJRSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIk5vIHZhbGlkIGNoYXAgZW50cnkgZm91bmRcbiIpOworCQlnb3RvIGV4aXRfZ2V0X2NoYXA7CisJfQorCisJc3RybmNweShwYXNzd29yZCwgY2hhcF90YWJsZS0+c2VjcmV0LCBRTDRfQ0hBUF9NQVhfU0VDUkVUX0xFTik7CisJc3RybmNweSh1c2VybmFtZSwgY2hhcF90YWJsZS0+bmFtZSwgUUw0X0NIQVBfTUFYX05BTUVfTEVOKTsKKwljaGFwX3RhYmxlLT5jb29raWUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENIQVBfVkFMSURfQ09PS0lFKTsKKworZXhpdF9nZXRfY2hhcDoKKwlkbWFfcG9vbF9mcmVlKGhhLT5jaGFwX2RtYV9wb29sLCBjaGFwX3RhYmxlLCBjaGFwX2RtYSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxbGE0eHh4X3NldF9jaGFwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqdXNlcm5hbWUsCisJCQkgICAgY2hhciAqcGFzc3dvcmQsIHVpbnQxNl90IGlkeCwgaW50IGJpZGkpCit7CisJaW50IHJldCA9IDA7CisJaW50IHJ2YWwgPSBRTEFfRVJST1I7CisJdWludDMyX3Qgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgcWw0X2NoYXBfdGFibGUgKmNoYXBfdGFibGU7CisJZG1hX2FkZHJfdCBjaGFwX2RtYTsKKworCWNoYXBfdGFibGUgPSBkbWFfcG9vbF9hbGxvYyhoYS0+Y2hhcF9kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJmNoYXBfZG1hKTsKKwlpZiAoY2hhcF90YWJsZSA9PSBOVUxMKSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGV4aXRfc2V0X2NoYXA7CisJfQorCisJbWVtc2V0KGNoYXBfdGFibGUsIDAsIHNpemVvZihzdHJ1Y3QgcWw0X2NoYXBfdGFibGUpKTsKKwlpZiAoYmlkaSkKKwkJY2hhcF90YWJsZS0+ZmxhZ3MgfD0gQklUXzY7IC8qIHBlZXIgKi8KKwllbHNlCisJCWNoYXBfdGFibGUtPmZsYWdzIHw9IEJJVF83OyAvKiBsb2NhbCAqLworCWNoYXBfdGFibGUtPnNlY3JldF9sZW4gPSBzdHJsZW4ocGFzc3dvcmQpOworCXN0cm5jcHkoY2hhcF90YWJsZS0+c2VjcmV0LCBwYXNzd29yZCwgTUFYX0NIQVBfU0VDUkVUX0xFTik7CisJc3RybmNweShjaGFwX3RhYmxlLT5uYW1lLCB1c2VybmFtZSwgTUFYX0NIQVBfTkFNRV9MRU4pOworCWNoYXBfdGFibGUtPmNvb2tpZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ0hBUF9WQUxJRF9DT09LSUUpOworCW9mZnNldCA9IEZMQVNIX0NIQVBfT0ZGU0VUIHwgKGlkeCAqIHNpemVvZihzdHJ1Y3QgcWw0X2NoYXBfdGFibGUpKTsKKwlydmFsID0gcWxhNHh4eF9zZXRfZmxhc2goaGEsIGNoYXBfZG1hLCBvZmZzZXQsCisJCQkJc2l6ZW9mKHN0cnVjdCBxbDRfY2hhcF90YWJsZSksCisJCQkJRkxBU0hfT1BUX1JNV19DT01NSVQpOworCisJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MgJiYgaGEtPmNoYXBfbGlzdCkgeworCQkvKiBVcGRhdGUgaGEgY2hhcF9saXN0IGNhY2hlICovCisJCW1lbWNweSgoc3RydWN0IHFsNF9jaGFwX3RhYmxlICopaGEtPmNoYXBfbGlzdCArIGlkeCwKKwkJICAgICAgIGNoYXBfdGFibGUsIHNpemVvZihzdHJ1Y3QgcWw0X2NoYXBfdGFibGUpKTsKKwl9CisJZG1hX3Bvb2xfZnJlZShoYS0+Y2hhcF9kbWFfcG9vbCwgY2hhcF90YWJsZSwgY2hhcF9kbWEpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQlyZXQgPSAgLUVJTlZBTDsKKworZXhpdF9zZXRfY2hhcDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHFsYTR4eHhfZ2V0X2NoYXBfaW5kZXggLSBHZXQgY2hhcCBpbmRleCBnaXZlbiB1c2VybmFtZSBhbmQgc2VjcmV0CisgKiBAaGE6IHBvaW50ZXIgdG8gYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEB1c2VybmFtZTogQ0hBUCB1c2VybmFtZSB0byBiZSBzZWFyY2hlZAorICogQHBhc3N3b3JkOiBDSEFQIHBhc3N3b3JkIHRvIGJlIHNlYXJjaGVkCisgKiBAYmlkaTogSXMgdGhpcyBhIEJJREkgQ0hBUAorICogQGNoYXBfaW5kZXg6IENIQVAgaW5kZXggdG8gYmUgcmV0dXJuZWQKKyAqCisgKiBNYXRjaCB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGluIHRoZSBjaGFwX2xpc3QsIHJldHVybiB0aGUgaW5kZXggaWYgYQorICogbWF0Y2ggaXMgZm91bmQuIElmIGEgbWF0Y2ggaXMgbm90IGZvdW5kIHRoZW4gYWRkIHRoZSBlbnRyeSBpbiBGTEFTSCBhbmQKKyAqIHJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggZW50cnkgaXMgd3JpdHRlbiBpbiB0aGUgRkxBU0guCisgKiovCitzdGF0aWMgaW50IHFsYTR4eHhfZ2V0X2NoYXBfaW5kZXgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBjaGFyICp1c2VybmFtZSwKKwkJCSAgICBjaGFyICpwYXNzd29yZCwgaW50IGJpZGksIHVpbnQxNl90ICpjaGFwX2luZGV4KQoreworCWludCBpLCBydmFsOworCWludCBmcmVlX2luZGV4ID0gLTE7CisJaW50IGZvdW5kX2luZGV4ID0gMDsKKwlpbnQgbWF4X2NoYXBfZW50cmllcyA9IDA7CisJc3RydWN0IHFsNF9jaGFwX3RhYmxlICpjaGFwX3RhYmxlOworCisJaWYgKGlzX3FsYTgwMjIoaGEpKQorCQltYXhfY2hhcF9lbnRyaWVzID0gKGhhLT5ody5mbHRfY2hhcF9zaXplIC8gMikgLworCQkJCQkJc2l6ZW9mKHN0cnVjdCBxbDRfY2hhcF90YWJsZSk7CisJZWxzZQorCQltYXhfY2hhcF9lbnRyaWVzID0gTUFYX0NIQVBfRU5UUklFU180MFhYOworCisJaWYgKCFoYS0+Y2hhcF9saXN0KSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiRG8gbm90IGhhdmUgQ0hBUCB0YWJsZSBjYWNoZVxuIik7CisJCXJldHVybiBRTEFfRVJST1I7CisJfQorCisJbXV0ZXhfbG9jaygmaGEtPmNoYXBfc2VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2NoYXBfZW50cmllczsgaSsrKSB7CisJCWNoYXBfdGFibGUgPSAoc3RydWN0IHFsNF9jaGFwX3RhYmxlICopaGEtPmNoYXBfbGlzdCArIGk7CisJCWlmIChjaGFwX3RhYmxlLT5jb29raWUgIT0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ0hBUF9WQUxJRF9DT09LSUUpKSB7CisJCQlpZiAoaSA+IE1BWF9SRVNSVl9DSEFQX0lEWCAmJiBmcmVlX2luZGV4ID09IC0xKQorCQkJCWZyZWVfaW5kZXggPSBpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGJpZGkpIHsKKwkJCWlmIChjaGFwX3RhYmxlLT5mbGFncyAmIEJJVF83KQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJaWYgKGNoYXBfdGFibGUtPmZsYWdzICYgQklUXzYpCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGNoYXBfdGFibGUtPnNlY3JldCwgcGFzc3dvcmQsCisJCQkgICAgIE1BWF9DSEFQX1NFQ1JFVF9MRU4pICYmCisJCSAgICAhc3RybmNtcChjaGFwX3RhYmxlLT5uYW1lLCB1c2VybmFtZSwKKwkJCSAgICAgTUFYX0NIQVBfTkFNRV9MRU4pKSB7CisJCQkqY2hhcF9pbmRleCA9IGk7CisJCQlmb3VuZF9pbmRleCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIElmIGNoYXAgZW50cnkgaXMgbm90IHByZXNlbnQgYW5kIGEgZnJlZSBpbmRleCBpcyBhdmFpbGFibGUgdGhlbgorCSAqIHdyaXRlIHRoZSBlbnRyeSBpbiBmbGFzaAorCSAqLworCWlmICghZm91bmRfaW5kZXggJiYgZnJlZV9pbmRleCAhPSAtMSkgeworCQlydmFsID0gcWxhNHh4eF9zZXRfY2hhcChoYSwgdXNlcm5hbWUsIHBhc3N3b3JkLAorCQkJCQlmcmVlX2luZGV4LCBiaWRpKTsKKwkJaWYgKCFydmFsKSB7CisJCQkqY2hhcF9pbmRleCA9IGZyZWVfaW5kZXg7CisJCQlmb3VuZF9pbmRleCA9IDE7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmhhLT5jaGFwX3NlbSk7CisKKwlpZiAoZm91bmRfaW5kZXgpCisJCXJldHVybiBRTEFfU1VDQ0VTUzsKKwlyZXR1cm4gUUxBX0VSUk9SOworfQorCitpbnQgcWxhNHh4eF9jb25uX2Nsb3NlX3Nlc3NfbG9nb3V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkgICB1aW50MTZfdCBmd19kZGJfaW5kZXgsCisJCQkJICAgdWludDE2X3QgY29ubmVjdGlvbl9pZCwKKwkJCQkgICB1aW50MTZfdCBvcHRpb24pCit7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisKKwltZW1zZXQoJm1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWQpKTsKKwltZW1zZXQoJm1ib3hfc3RzLCAwLCBzaXplb2YobWJveF9zdHMpKTsKKworCW1ib3hfY21kWzBdID0gTUJPWF9DTURfQ09OTl9DTE9TRV9TRVNTX0xPR09VVDsKKwltYm94X2NtZFsxXSA9IGZ3X2RkYl9pbmRleDsKKwltYm94X2NtZFsyXSA9IGNvbm5lY3Rpb25faWQ7CisJbWJveF9jbWRbM10gPSBvcHRpb247CisKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgNCwgMiwgJm1ib3hfY21kWzBdLCAmbWJveF9zdHNbMF0pOworCWlmIChzdGF0dXMgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBNQk9YX0NNRF9DT05OX0NMT1NFICIKKwkJCQkgICJvcHRpb24gJTA0eCBmYWlsZWQgdy8gc3RhdHVzICUwNFggJTA0WFxuIiwKKwkJCQkgIF9fZnVuY19fLCBvcHRpb24sIG1ib3hfc3RzWzBdLCBtYm94X3N0c1sxXSkpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9kaXNhYmxlX2FjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisKKwltZW1zZXQoJm1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWQpKTsKKwltZW1zZXQoJm1ib3hfc3RzLCAwLCBzaXplb2YobWJveF9zdHMpKTsKKworCW1ib3hfY21kWzBdID0gTUJPWF9DTURfRElTQUJMRV9BQ0I7CisKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgOCwgNSwgJm1ib3hfY21kWzBdLCAmbWJveF9zdHNbMF0pOworCWlmIChzdGF0dXMgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBNQk9YX0NNRF9ESVNBQkxFX0FDQiAiCisJCQkJICAiZmFpbGVkIHcvIHN0YXR1cyAlMDRYICUwNFggJTA0WCIsIF9fZnVuY19fLAorCQkJCSAgbWJveF9zdHNbMF0sIG1ib3hfc3RzWzFdLCBtYm94X3N0c1syXSkpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9nZXRfYWNiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgZG1hX2FkZHJfdCBhY2JfZG1hLAorCQkgICAgdWludDMyX3QgYWNiX3R5cGUsIHVpbnQzMl90IGxlbikKK3sKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKworCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOworCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOworCisJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9HRVRfQUNCOworCW1ib3hfY21kWzFdID0gYWNiX3R5cGU7CisJbWJveF9jbWRbMl0gPSBMU0RXKGFjYl9kbWEpOworCW1ib3hfY21kWzNdID0gTVNEVyhhY2JfZG1hKTsKKwltYm94X2NtZFs0XSA9IGxlbjsKKworCXN0YXR1cyA9IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCA1LCA1LCAmbWJveF9jbWRbMF0sICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXM6IE1CT1hfQ01EX0dFVF9BQ0IgIgorCQkJCSAgImZhaWxlZCB3LyBzdGF0dXMgJTA0WFxuIiwgX19mdW5jX18sCisJCQkJICBtYm94X3N0c1swXSkpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9zZXRfYWNiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgKm1ib3hfY21kLAorCQkgICAgdWludDMyX3QgKm1ib3hfc3RzLCBkbWFfYWRkcl90IGFjYl9kbWEpCit7CisJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOworCisJbWVtc2V0KG1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWRbMF0pICogTUJPWF9SRUdfQ09VTlQpOworCW1lbXNldChtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzWzBdKSAqIE1CT1hfUkVHX0NPVU5UKTsKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX1NFVF9BQ0I7CisJbWJveF9jbWRbMV0gPSAwOyAvKiBQcmltYXJ5IEFDQiAqLworCW1ib3hfY21kWzJdID0gTFNEVyhhY2JfZG1hKTsKKwltYm94X2NtZFszXSA9IE1TRFcoYWNiX2RtYSk7CisJbWJveF9jbWRbNF0gPSBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGspOworCisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIDUsIDUsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdKTsKKwlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICAiJXM6IE1CT1hfQ01EX1NFVF9BQ0IgIgorCQkJCSAgImZhaWxlZCB3LyBzdGF0dXMgJTA0WFxuIiwgX19mdW5jX18sCisJCQkJICBtYm94X3N0c1swXSkpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9zZXRfcGFyYW1fZGRiZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJICAgICAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwKKwkJCSAgICAgICBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLAorCQkJICAgICAgIHVpbnQzMl90ICptYnhfc3RzKQogewogCXN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeTsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3QgcWxhX2Nvbm4gKnFsYV9jb25uOworCXN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHI7CiAJZG1hX2FkZHJfdCBmd19kZGJfZW50cnlfZG1hOwotCXVpbnQzMl90IGRkYl9pbmRleDsKLQlpbnQgcmV0X3ZhbCA9IFFMQV9TVUNDRVNTOworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwlpbnQgcnZhbCA9IDA7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2OworCWNoYXIgKmlwOworCXVpbnQxNl90IGlzY3NpX29wdHMgPSAwOworCXVpbnQzMl90IG9wdGlvbnMgPSAwOworCXVpbnQxNl90IGlkeDsKIAotCi0JZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAotCQkJCQkgIHNpemVvZigqZndfZGRiX2VudHJ5KSwKKwlmd19kZGJfZW50cnkgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKIAkJCQkJICAmZndfZGRiX2VudHJ5X2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmd19kZGJfZW50cnkpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyLlxuIiwKLQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwotCQlyZXRfdmFsID0gUUxBX0VSUk9SOwotCQlnb3RvIGV4aXRfc2VuZF90Z3RzX25vX2ZyZWU7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQkgICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRtYSBidWZmZXIuXG4iLAorCQkJCSAgX19mdW5jX18pKTsKKwkJcnZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9zZXRfcGFyYW1fbm9fZnJlZTsKIAl9CiAKLQlyZXRfdmFsID0gcWxhNHh4eF9nZXRfZGVmYXVsdF9kZGIoaGEsIGZ3X2RkYl9lbnRyeV9kbWEpOwotCWlmIChyZXRfdmFsICE9IFFMQV9TVUNDRVNTKQotCQlnb3RvIGV4aXRfc2VuZF90Z3RzOworCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKwlxbGFfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc2VzcyA9IGNvbm4tPnNlc3Npb247CisJZHN0X2FkZHIgPSAmcWxhX2Nvbm4tPnFsYV9lcC0+ZHN0X2FkZHI7CiAKLQlyZXRfdmFsID0gcWxhNHh4eF9yZXFfZGRiX2VudHJ5KGhhLCAmZGRiX2luZGV4KTsKLQlpZiAocmV0X3ZhbCAhPSBRTEFfU1VDQ0VTUykKLQkJZ290byBleGl0X3NlbmRfdGd0czsKKwlpZiAoZHN0X2FkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJb3B0aW9ucyB8PSBJUFY2X0RFRkFVTFRfRERCX0VOVFJZOwogCi0JbWVtc2V0KGZ3X2RkYl9lbnRyeS0+aXNjc2lfYWxpYXMsIDAsCi0JICAgICAgIHNpemVvZihmd19kZGJfZW50cnktPmlzY3NpX2FsaWFzKSk7CisJc3RhdHVzID0gcWxhNHh4eF9nZXRfZGVmYXVsdF9kZGIoaGEsIG9wdGlvbnMsIGZ3X2RkYl9lbnRyeV9kbWEpOworCWlmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSB7CisJCXJ2YWwgPSAtRUlOVkFMOworCQlnb3RvIGV4aXRfc2V0X3BhcmFtOworCX0KIAotCW1lbXNldChmd19kZGJfZW50cnktPmlzY3NpX25hbWUsIDAsCi0JICAgICAgIHNpemVvZihmd19kZGJfZW50cnktPmlzY3NpX25hbWUpKTsKKwlpc2NzaV9vcHRzID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9vcHRpb25zKTsKKwltZW1zZXQoZndfZGRiX2VudHJ5LT5pc2NzaV9hbGlhcywgMCwgc2l6ZW9mKGZ3X2RkYl9lbnRyeS0+aXNjc2lfYWxpYXMpKTsKKworCW1lbXNldChmd19kZGJfZW50cnktPmlzY3NpX25hbWUsIDAsIHNpemVvZihmd19kZGJfZW50cnktPmlzY3NpX25hbWUpKTsKKworCWlmIChzZXNzLT50YXJnZXRuYW1lICE9IE5VTEwpIHsKKwkJbWVtY3B5KGZ3X2RkYl9lbnRyeS0+aXNjc2lfbmFtZSwgc2Vzcy0+dGFyZ2V0bmFtZSwKKwkJICAgICAgIG1pbihzdHJsZW4oc2Vzcy0+dGFyZ2V0bmFtZSksCisJCSAgICAgICBzaXplb2YoZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lKSkpOworCX0KIAogCW1lbXNldChmd19kZGJfZW50cnktPmlwX2FkZHIsIDAsIHNpemVvZihmd19kZGJfZW50cnktPmlwX2FkZHIpKTsKLQltZW1zZXQoZndfZGRiX2VudHJ5LT50Z3RfYWRkciwgMCwKLQkgICAgICAgc2l6ZW9mKGZ3X2RkYl9lbnRyeS0+dGd0X2FkZHIpKTsKKwltZW1zZXQoZndfZGRiX2VudHJ5LT50Z3RfYWRkciwgMCwgc2l6ZW9mKGZ3X2RkYl9lbnRyeS0+dGd0X2FkZHIpKTsKIAotCWZ3X2RkYl9lbnRyeS0+b3B0aW9ucyA9IChEREJfT1BUX0RJU0NfU0VTU0lPTiB8IEREQl9PUFRfVEFSR0VUKTsKLQlmd19kZGJfZW50cnktPnBvcnQgPSBjcHVfdG9fbGUxNihudG9ocyhwb3J0KSk7CisJZndfZGRiX2VudHJ5LT5vcHRpb25zID0gIEREQl9PUFRfVEFSR0VUIHwgRERCX09QVF9BVVRPX1NFTkRUR1RTX0RJU0FCTEU7CiAKLQlmd19kZGJfZW50cnktPmlwX2FkZHJbMF0gPSAqaXA7Ci0JZndfZGRiX2VudHJ5LT5pcF9hZGRyWzFdID0gKihpcCArIDEpOwotCWZ3X2RkYl9lbnRyeS0+aXBfYWRkclsyXSA9ICooaXAgKyAyKTsKLQlmd19kZGJfZW50cnktPmlwX2FkZHJbM10gPSAqKGlwICsgMyk7CisJaWYgKGRzdF9hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWRzdF9hZGRyOworCQlpcCA9IChjaGFyICopJmFkZHItPnNpbl9hZGRyOworCQltZW1jcHkoZndfZGRiX2VudHJ5LT5pcF9hZGRyLCBpcCwgSVBfQUREUl9MRU4pOworCQlmd19kZGJfZW50cnktPnBvcnQgPSBjcHVfdG9fbGUxNihudG9ocyhhZGRyLT5zaW5fcG9ydCkpOworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgIiVzOiBEZXN0aW5hdGlvbiBBZGRyZXNzIFslcEk0XTogaW5kZXggWyVkXVxuIiwKKwkJCQkgICBfX2Z1bmNfXywgZndfZGRiX2VudHJ5LT5pcF9hZGRyLAorCQkJCSAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpKTsKKwl9IGVsc2UgaWYgKGRzdF9hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWRzdF9hZGRyOworCQlpcCA9IChjaGFyICopJmFkZHI2LT5zaW42X2FkZHI7CisJCW1lbWNweShmd19kZGJfZW50cnktPmlwX2FkZHIsIGlwLCBJUHY2X0FERFJfTEVOKTsKKwkJZndfZGRiX2VudHJ5LT5wb3J0ID0gY3B1X3RvX2xlMTYobnRvaHMoYWRkcjYtPnNpbjZfcG9ydCkpOworCQlmd19kZGJfZW50cnktPm9wdGlvbnMgfD0gRERCX09QVF9JUFY2X0RFVklDRTsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICIlczogRGVzdGluYXRpb24gQWRkcmVzcyBbJXBJNl06IGluZGV4IFslZF1cbiIsCisJCQkJICAgX19mdW5jX18sIGZ3X2RkYl9lbnRyeS0+aXBfYWRkciwKKwkJCQkgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7CisJfSBlbHNlIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkgICAiJXM6IEZhaWxlZCB0byBnZXQgSVAgQWRkcmVzc1xuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdF9zZXRfcGFyYW07CisJfQogCi0JcmV0X3ZhbCA9IHFsYTR4eHhfc2V0X2RkYl9lbnRyeShoYSwgZGRiX2luZGV4LCBmd19kZGJfZW50cnlfZG1hKTsKKwkvKiBDSEFQICovCisJaWYgKHNlc3MtPnVzZXJuYW1lICE9IE5VTEwgJiYgc2Vzcy0+cGFzc3dvcmQgIT0gTlVMTCkgeworCQlpZiAoc3RybGVuKHNlc3MtPnVzZXJuYW1lKSAmJiBzdHJsZW4oc2Vzcy0+cGFzc3dvcmQpKSB7CisJCQlpc2NzaV9vcHRzIHw9IEJJVF83OwogCi1leGl0X3NlbmRfdGd0czoKKwkJCXJ2YWwgPSBxbGE0eHh4X2dldF9jaGFwX2luZGV4KGhhLCBzZXNzLT51c2VybmFtZSwKKwkJCQkJCXNlc3MtPnBhc3N3b3JkLAorCQkJCQkJTE9DQUxfQ0hBUCwgJmlkeCk7CisJCQlpZiAocnZhbCkKKwkJCQlnb3RvIGV4aXRfc2V0X3BhcmFtOworCisJCQlmd19kZGJfZW50cnktPmNoYXBfdGJsX2lkeCA9IGNwdV90b19sZTE2KGlkeCk7CisJCX0KKwl9CisKKwlpZiAoc2Vzcy0+dXNlcm5hbWVfaW4gIT0gTlVMTCAmJiBzZXNzLT5wYXNzd29yZF9pbiAhPSBOVUxMKSB7CisJCS8qIENoZWNrIGlmIEJJREkgQ0hBUCAqLworCQlpZiAoc3RybGVuKHNlc3MtPnVzZXJuYW1lX2luKSAmJiBzdHJsZW4oc2Vzcy0+cGFzc3dvcmRfaW4pKSB7CisJCQlpc2NzaV9vcHRzIHw9IEJJVF80OworCisJCQlydmFsID0gcWxhNHh4eF9nZXRfY2hhcF9pbmRleChoYSwgc2Vzcy0+dXNlcm5hbWVfaW4sCisJCQkJCQkgICAgICBzZXNzLT5wYXNzd29yZF9pbiwKKwkJCQkJCSAgICAgIEJJRElfQ0hBUCwgJmlkeCk7CisJCQlpZiAocnZhbCkKKwkJCQlnb3RvIGV4aXRfc2V0X3BhcmFtOworCQl9CisJfQorCisJaWYgKHNlc3MtPmluaXRpYWxfcjJ0X2VuKQorCQlpc2NzaV9vcHRzIHw9IEJJVF8xMDsKKworCWlmIChzZXNzLT5pbW1fZGF0YV9lbikKKwkJaXNjc2lfb3B0cyB8PSBCSVRfMTE7CisKKwlmd19kZGJfZW50cnktPmlzY3NpX29wdGlvbnMgPSBjcHVfdG9fbGUxNihpc2NzaV9vcHRzKTsKKworCWlmIChjb25uLT5tYXhfcmVjdl9kbGVuZ3RoKQorCQlmd19kZGJfZW50cnktPmlzY3NpX21heF9yY3ZfZGF0YV9zZWdfbGVuID0KKwkJICBfX2NvbnN0YW50X2NwdV90b19sZTE2KChjb25uLT5tYXhfcmVjdl9kbGVuZ3RoIC8gQllURV9VTklUUykpOworCisJaWYgKHNlc3MtPm1heF9yMnQpCisJCWZ3X2RkYl9lbnRyeS0+aXNjc2lfbWF4X291dHNuZF9yMnQgPSBjcHVfdG9fbGUxNihzZXNzLT5tYXhfcjJ0KTsKKworCWlmIChzZXNzLT5maXJzdF9idXJzdCkKKwkJZndfZGRiX2VudHJ5LT5pc2NzaV9maXJzdF9idXJzdF9sZW4gPQorCQkgICAgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNigoc2Vzcy0+Zmlyc3RfYnVyc3QgLyBCWVRFX1VOSVRTKSk7CisKKwlpZiAoc2Vzcy0+bWF4X2J1cnN0KQorCQlmd19kZGJfZW50cnktPmlzY3NpX21heF9idXJzdF9sZW4gPQorCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigoc2Vzcy0+bWF4X2J1cnN0IC8gQllURV9VTklUUykpOworCisJaWYgKHNlc3MtPnRpbWUyd2FpdCkKKwkJZndfZGRiX2VudHJ5LT5pc2NzaV9kZWZfdGltZTJ3YWl0ID0KKwkJCWNwdV90b19sZTE2KHNlc3MtPnRpbWUyd2FpdCk7CisKKwlpZiAoc2Vzcy0+dGltZTJyZXRhaW4pCisJCWZ3X2RkYl9lbnRyeS0+aXNjc2lfZGVmX3RpbWUycmV0YWluID0KKwkJCWNwdV90b19sZTE2KHNlc3MtPnRpbWUycmV0YWluKTsKKworCXN0YXR1cyA9IHFsYTR4eHhfc2V0X2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsCisJCQkJICAgICAgIGZ3X2RkYl9lbnRyeV9kbWEsIG1ieF9zdHMpOworCisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykKKwkJcnZhbCA9IC1FSU5WQUw7CitleGl0X3NldF9wYXJhbToKIAlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAogCQkJICBmd19kZGJfZW50cnksIGZ3X2RkYl9lbnRyeV9kbWEpOwotZXhpdF9zZW5kX3RndHNfbm9fZnJlZToKLQlyZXR1cm4gcmV0X3ZhbDsKK2V4aXRfc2V0X3BhcmFtX25vX2ZyZWU6CisJcmV0dXJuIHJ2YWw7CiB9CiAKK2ludCBxbGE0eHh4X2dldF9tZ210X2RhdGEoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCBmd19kZGJfaW5kZXgsCisJCQkgIHVpbnQxNl90IHN0YXRzX3NpemUsIGRtYV9hZGRyX3Qgc3RhdHNfZG1hKQoreworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCisJbWVtc2V0KG1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWRbMF0pICogTUJPWF9SRUdfQ09VTlQpOworCW1lbXNldChtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzWzBdKSAqIE1CT1hfUkVHX0NPVU5UKTsKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0dFVF9NQU5BR0VNRU5UX0RBVEE7CisJbWJveF9jbWRbMV0gPSBmd19kZGJfaW5kZXg7CisJbWJveF9jbWRbMl0gPSBMU0RXKHN0YXRzX2RtYSk7CisJbWJveF9jbWRbM10gPSBNU0RXKHN0YXRzX2RtYSk7CisJbWJveF9jbWRbNF0gPSBzdGF0c19zaXplOworCisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIDUsIDEsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdKTsKKwlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJICAiJXM6IE1CT1hfQ01EX0dFVF9NQU5BR0VNRU5UX0RBVEEgIgorCQkJCSAgImZhaWxlZCB3LyBzdGF0dXMgJTA0WFxuIiwgX19mdW5jX18sCisJCQkJICBtYm94X3N0c1swXSkpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9nZXRfaXBfc3RhdGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBhY2JfaWR4LAorCQkJIHVpbnQzMl90IGlwX2lkeCwgdWludDMyX3QgKnN0cykKK3sKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKworCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOworCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOworCW1ib3hfY21kWzBdID0gTUJPWF9DTURfR0VUX0lQX0FERFJfU1RBVEU7CisJbWJveF9jbWRbMV0gPSBhY2JfaWR4OworCW1ib3hfY21kWzJdID0gaXBfaWR4OworCisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIDMsIDgsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdKTsKKwlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICAiJXM6ICIKKwkJCQkgICJNQk9YX0NNRF9HRVRfSVBfQUREUl9TVEFURSBmYWlsZWQgdy8gIgorCQkJCSAgInN0YXR1cyAlMDRYXG4iLCBfX2Z1bmNfXywgbWJveF9zdHNbMF0pKTsKKwl9CisJbWVtY3B5KHN0cywgbWJveF9zdHMsIHNpemVvZihtYm94X3N0cykpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBxbGE0eHh4X2dldF9udnJhbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGRtYV9hZGRyX3QgbnZyYW1fZG1hLAorCQkgICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpCit7CisJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisKKwltZW1zZXQoJm1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWQpKTsKKwltZW1zZXQoJm1ib3hfc3RzLCAwLCBzaXplb2YobWJveF9zdHMpKTsKKworCW1ib3hfY21kWzBdID0gTUJPWF9DTURfR0VUX05WUkFNOworCW1ib3hfY21kWzFdID0gTFNEVyhudnJhbV9kbWEpOworCW1ib3hfY21kWzJdID0gTVNEVyhudnJhbV9kbWEpOworCW1ib3hfY21kWzNdID0gb2Zmc2V0OworCW1ib3hfY21kWzRdID0gc2l6ZTsKKworCXN0YXR1cyA9IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCBNQk9YX1JFR19DT1VOVCwgMSwgJm1ib3hfY21kWzBdLAorCQkJCQkgJm1ib3hfc3RzWzBdKTsKKwlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgInNjc2klbGQ6ICVzOiBmYWlsZWQgIgorCQkJCSAgInN0YXR1cyAlMDRYXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sCisJCQkJICBtYm94X3N0c1swXSkpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9zZXRfbnZyYW0oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBkbWFfYWRkcl90IG52cmFtX2RtYSwKKwkJICAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQoreworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX1NFVF9OVlJBTTsKKwltYm94X2NtZFsxXSA9IExTRFcobnZyYW1fZG1hKTsKKwltYm94X2NtZFsyXSA9IE1TRFcobnZyYW1fZG1hKTsKKwltYm94X2NtZFszXSA9IG9mZnNldDsKKwltYm94X2NtZFs0XSA9IHNpemU7CisKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDEsICZtYm94X2NtZFswXSwKKwkJCQkJICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJzY3NpJWxkOiAlczogZmFpbGVkICIKKwkJCQkgICJzdGF0dXMgJTA0WFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAorCQkJCSAgbWJveF9zdHNbMF0pKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IHFsYTR4eHhfcmVzdG9yZV9mYWN0b3J5X2RlZmF1bHRzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkgICAgIHVpbnQzMl90IHJlZ2lvbiwgdWludDMyX3QgZmllbGQwLAorCQkJCSAgICAgdWludDMyX3QgZmllbGQxKQoreworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX1JFU1RPUkVfRkFDVE9SWV9ERUZBVUxUUzsKKwltYm94X2NtZFszXSA9IHJlZ2lvbjsKKwltYm94X2NtZFs0XSA9IGZpZWxkMDsKKwltYm94X2NtZFs1XSA9IGZpZWxkMTsKKworCXN0YXR1cyA9IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCBNQk9YX1JFR19DT1VOVCwgMywgJm1ib3hfY21kWzBdLAorCQkJCQkgJm1ib3hfc3RzWzBdKTsKKwlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgInNjc2klbGQ6ICVzOiBmYWlsZWQgIgorCQkJCSAgInN0YXR1cyAlMDRYXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sCisJCQkJICBtYm94X3N0c1swXSkpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnZyYW0uYwppbmRleCBiNGI4NTliLi43ODUxZjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnZyYW0uYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnZyYW0uYwpAQCAtMTU2LDYgKzE1NiwyNyBAQAogCXJldHVybiB2YWw7CiB9CiAKK3U4IHJkX252cmFtX2J5dGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgb2Zmc2V0KQoreworCXUxNiB2YWwgPSAwOworCXU4IHJ2YWwgPSAwOworCWludCBpbmRleCA9IDA7CisKKwlpZiAob2Zmc2V0ICYgMHgxKQorCQlpbmRleCA9IChvZmZzZXQgLSAxKSAvIDI7CisJZWxzZQorCQlpbmRleCA9IG9mZnNldCAvIDI7CisKKwl2YWwgPSBsZTE2X3RvX2NwdShyZF9udnJhbV93b3JkKGhhLCBpbmRleCkpOworCisJaWYgKG9mZnNldCAmIDB4MSkKKwkJcnZhbCA9ICh1OCkoKHZhbCAmIDB4ZmYwMCkgPj4gOCk7CisJZWxzZQorCQlydmFsID0gKHU4KSgodmFsICYgMHgwMGZmKSk7CisKKwlyZXR1cm4gcnZhbDsKK30KKwogaW50IHFsYTR4eHhfaXNfbnZyYW1fY29uZmlndXJhdGlvbl92YWxpZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhKQogewogCWludCBzdGF0dXMgPSBRTEFfRVJST1I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5jCmluZGV4IGZkZmUyN2IuLmY0ODRmZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ueC5jCkBAIC0yMDE1LDExICsyMDE1LDE5IEBACiAJCQlody0+Zmx0X3JlZ2lvbl9ib290ID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX0ZXXzgyOgorCQljYXNlIEZMVF9SRUdfRldfODJfMToKIAkJCWh3LT5mbHRfcmVnaW9uX2Z3ID0gc3RhcnQ7CiAJCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX0JPT1RMT0FEXzgyOgogCQkJaHctPmZsdF9yZWdpb25fYm9vdGxvYWQgPSBzdGFydDsKIAkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfSVNDU0lfUEFSQU06CisJCQlody0+Zmx0X2lzY3NpX3BhcmFtID0gIHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRkxUX1JFR19JU0NTSV9DSEFQOgorCQkJaHctPmZsdF9yZWdpb25fY2hhcCA9ICBzdGFydDsKKwkJCWh3LT5mbHRfY2hhcF9zaXplID0gIGxlMzJfdG9fY3B1KHJlZ2lvbi0+c2l6ZSk7CisJCQlicmVhazsKIAkJfQogCX0KIAlnb3RvIGRvbmU7CkBAIC0yMDMyLDYgKzIwNDAsOSBAQAogCWh3LT5mbHRfcmVnaW9uX2Jvb3QgICAgID0gRkFfQk9PVF9DT0RFX0FERFJfODI7CiAJaHctPmZsdF9yZWdpb25fYm9vdGxvYWQgPSBGQV9CT09UX0xPQURfQUREUl84MjsKIAlody0+Zmx0X3JlZ2lvbl9mdyAgICAgICA9IEZBX1JJU0NfQ09ERV9BRERSXzgyOworCWh3LT5mbHRfcmVnaW9uX2NoYXAJPSBGQV9GTEFTSF9JU0NTSV9DSEFQOworCWh3LT5mbHRfY2hhcF9zaXplCT0gRkFfRkxBU0hfQ0hBUF9TSVpFOworCiBkb25lOgogCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJGTFRbJXNdOiBmbHQ9MHgleCBmZHQ9MHgleCAiCiAJICAgICJib290PTB4JXggYm9vdGxvYWQ9MHgleCBmdz0weCV4XG4iLCBsb2MsIGh3LT5mbHRfcmVnaW9uX2ZsdCwKQEAgLTIyNTgsMTAgKzIyNjksMTYgQEAKIAl9CiAKIAkvKiBTYXZlIE0uQS5DLiBhZGRyZXNzICYgc2VyaWFsX251bWJlciAqLworCWhhLT5wb3J0X251bSA9IHN5c19pbmZvLT5wb3J0X251bTsKIAltZW1jcHkoaGEtPm15X21hYywgJnN5c19pbmZvLT5tYWNfYWRkclswXSwKIAkgICAgbWluKHNpemVvZihoYS0+bXlfbWFjKSwgc2l6ZW9mKHN5c19pbmZvLT5tYWNfYWRkcikpKTsKIAltZW1jcHkoaGEtPnNlcmlhbF9udW1iZXIsICZzeXNfaW5mby0+c2VyaWFsX251bWJlciwKIAkgICAgbWluKHNpemVvZihoYS0+c2VyaWFsX251bWJlciksIHNpemVvZihzeXNfaW5mby0+c2VyaWFsX251bWJlcikpKTsKKwltZW1jcHkoaGEtPm1vZGVsX25hbWUsICZzeXNfaW5mby0+Ym9hcmRfaWRfc3RyLAorCSAgICAgICBtaW4oc2l6ZW9mKGhhLT5tb2RlbF9uYW1lKSwgc2l6ZW9mKHN5c19pbmZvLT5ib2FyZF9pZF9zdHIpKSk7CisJaGEtPnBoeV9wb3J0X2NudCA9IHN5c19pbmZvLT5waHlzX3BvcnRfY250OworCWhhLT5waHlfcG9ydF9udW0gPSBzeXNfaW5mby0+cG9ydF9udW07CisJaGEtPmlzY3NpX3BjaV9mdW5jX2NudCA9IHN5c19pbmZvLT5pc2NzaV9wY2lfZnVuY19jbnQ7CiAKIAlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogIgogCSAgICAibWFjICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKaW5kZXggZjIzNjRlYy4uMzBmMzFiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKQEAgLTYsNiArNiw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2NzaV9ib290X3N5c2ZzLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CkBAIC02Myw2ICs2NSw3IEBACiAJCSJUYXJnZXQgU2Vzc2lvbiBSZWNvdmVyeSBUaW1lb3V0LlxuIgogCQkiIERlZmF1bHQ6IDMwIHNlYy4iKTsKIAorc3RhdGljIGludCBxbGE0eHh4X3dhaXRfZm9yX2hiYV9vbmxpbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIC8qCiAgKiBTQ1NJIGhvc3QgdGVtcGxhdGUgZW50cnkgcG9pbnRzCiAgKi8KQEAgLTcxLDE4ICs3NCw0MSBAQAogLyoKICAqIGlTQ1NJIHRlbXBsYXRlIGVudHJ5IHBvaW50cwogICovCi1zdGF0aWMgaW50IHFsYTR4eHhfdGd0X2RzY3ZyKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAotCQkJICAgICBlbnVtIGlzY3NpX3RndF9kc2N2ciB0eXBlLCB1aW50MzJfdCBlbmFibGUsCi0JCQkgICAgIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIpOwogc3RhdGljIGludCBxbGE0eHh4X2Nvbm5fZ2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubiwKIAkJCQkgIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1Zik7Ci1zdGF0aWMgaW50IHFsYTR4eHhfc2Vzc19nZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzLAotCQkJCSAgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmKTsKIHN0YXRpYyBpbnQgcWxhNHh4eF9ob3N0X2dldF9wYXJhbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKIAkJCQkgIGVudW0gaXNjc2lfaG9zdF9wYXJhbSBwYXJhbSwgY2hhciAqYnVmKTsKLXN0YXRpYyB2b2lkIHFsYTR4eHhfcmVjb3ZlcnlfdGltZWRvdXQoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKTsKK3N0YXRpYyBpbnQgcWxhNHh4eF9pZmFjZV9zZXRfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHZvaWQgKmRhdGEsCisJCQkJICAgdWludDMyX3QgbGVuKTsKK3N0YXRpYyBpbnQgcWxhNHh4eF9nZXRfaWZhY2VfcGFyYW0oc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZSwKKwkJCQkgICBlbnVtIGlzY3NpX3BhcmFtX3R5cGUgcGFyYW1fdHlwZSwKKwkJCQkgICBpbnQgcGFyYW0sIGNoYXIgKmJ1Zik7CiBzdGF0aWMgZW51bSBibGtfZWhfdGltZXJfcmV0dXJuIHFsYTR4eHhfZWhfY21kX3RpbWVkX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpzYyk7Ci0KK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKnFsYTR4eHhfZXBfY29ubmVjdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkJCSBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyLAorCQkJCQkJIGludCBub25fYmxvY2tpbmcpOworc3RhdGljIGludCBxbGE0eHh4X2VwX3BvbGwoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwgaW50IHRpbWVvdXRfbXMpOworc3RhdGljIHZvaWQgcWxhNHh4eF9lcF9kaXNjb25uZWN0KHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXApOworc3RhdGljIGludCBxbGE0eHh4X2dldF9lcF9wYXJhbShzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwLAorCQkJCWVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1Zik7CitzdGF0aWMgaW50IHFsYTR4eHhfY29ubl9zdGFydChzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4pOworc3RhdGljIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqCitxbGE0eHh4X2Nvbm5fY3JlYXRlKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3MsIHVpbnQzMl90IGNvbm5faWR4KTsKK3N0YXRpYyBpbnQgcWxhNHh4eF9jb25uX2JpbmQoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbiwKKwkJCSAgICAgc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCSAgICAgdWludDY0X3QgdHJhbnNwb3J0X2ZkLCBpbnQgaXNfbGVhZGluZyk7CitzdGF0aWMgdm9pZCBxbGE0eHh4X2Nvbm5fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4pOworc3RhdGljIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqCitxbGE0eHh4X3Nlc3Npb25fY3JlYXRlKHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXAsIHVpbnQxNl90IGNtZHNfbWF4LAorCQkJdWludDE2X3QgcWRlcHRoLCB1aW50MzJfdCBpbml0aWFsX2NtZHNuKTsKK3N0YXRpYyB2b2lkIHFsYTR4eHhfc2Vzc2lvbl9kZXN0cm95KHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzcyk7CitzdGF0aWMgdm9pZCBxbGE0eHh4X3Rhc2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndkYXRhKTsKK3N0YXRpYyBpbnQgcWxhNHh4eF9hbGxvY19wZHUoc3RydWN0IGlzY3NpX3Rhc2sgKiwgdWludDhfdCk7CitzdGF0aWMgaW50IHFsYTR4eHhfdGFza194bWl0KHN0cnVjdCBpc2NzaV90YXNrICopOworc3RhdGljIHZvaWQgcWxhNHh4eF90YXNrX2NsZWFudXAoc3RydWN0IGlzY3NpX3Rhc2sgKik7CitzdGF0aWMgdm9pZCBxbGE0eHh4X2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKTsKK3N0YXRpYyB2b2lkIHFsYTR4eHhfY29ubl9nZXRfc3RhdHMoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCQkgICBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKTsKIC8qCiAgKiBTQ1NJIGhvc3QgdGVtcGxhdGUgZW50cnkgcG9pbnRzCiAgKi8KQEAgLTk0LDcgKzEyMCw4IEBACiBzdGF0aWMgaW50IHFsYTR4eHhfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBxbGE0eHh4X3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgdm9pZCBxbGE0eHh4X3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKLXN0YXRpYyB2b2lkIHFsYTR4eHhfc2Nhbl9zdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CitzdGF0aWMgbW9kZV90IHFsNF9hdHRyX2lzX3Zpc2libGUoaW50IHBhcmFtX3R5cGUsIGludCBwYXJhbSk7CitzdGF0aWMgaW50IHFsYTR4eHhfaG9zdF9yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgaW50IHJlc2V0X3R5cGUpOwogCiBzdGF0aWMgc3RydWN0IHFsYTRfOHh4eF9sZWdhY3lfaW50cl9zZXQgbGVnYWN5X2ludHJbXSA9CiAgICAgUUxBODJYWF9MRUdBQ1lfSU5UUl9DT05GSUc7CkBAIC0xMTUsOSArMTQyLDYgQEAKIAkuc2xhdmVfYWxsb2MJCT0gcWxhNHh4eF9zbGF2ZV9hbGxvYywKIAkuc2xhdmVfZGVzdHJveQkJPSBxbGE0eHh4X3NsYXZlX2Rlc3Ryb3ksCiAKLQkuc2Nhbl9maW5pc2hlZAkJPSBpc2NzaV9zY2FuX2ZpbmlzaGVkLAotCS5zY2FuX3N0YXJ0CQk9IHFsYTR4eHhfc2Nhbl9zdGFydCwKLQogCS50aGlzX2lkCQk9IC0xLAogCS5jbWRfcGVyX2x1bgkJPSAzLAogCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKQEAgLTEyNSw1NiArMTQ5LDM5NCBAQAogCiAJLm1heF9zZWN0b3JzCQk9IDB4RkZGRiwKIAkuc2hvc3RfYXR0cnMJCT0gcWxhNHh4eF9ob3N0X2F0dHJzLAorCS5ob3N0X3Jlc2V0CQk9IHFsYTR4eHhfaG9zdF9yZXNldCwKKwkudmVuZG9yX2lkCQk9IFNDU0lfTkxfVklEX1RZUEVfUENJIHwgUENJX1ZFTkRPUl9JRF9RTE9HSUMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCBxbGE0eHh4X2lzY3NpX3RyYW5zcG9ydCA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQkJPSBEUklWRVJfTkFNRSwKLQkuY2FwcwkJCT0gQ0FQX0ZXX0RCIHwgQ0FQX1NFTkRUQVJHRVRTX09GRkxPQUQgfAotCQkJCSAgQ0FQX0RBVEFfUEFUSF9PRkZMT0FELAotCS5wYXJhbV9tYXNrCQk9IElTQ1NJX0NPTk5fUE9SVCB8IElTQ1NJX0NPTk5fQUREUkVTUyB8Ci0JCQkJICBJU0NTSV9UQVJHRVRfTkFNRSB8IElTQ1NJX1RQR1QgfAotCQkJCSAgSVNDU0lfVEFSR0VUX0FMSUFTLAotCS5ob3N0X3BhcmFtX21hc2sJPSBJU0NTSV9IT1NUX0hXQUREUkVTUyB8Ci0JCQkJICBJU0NTSV9IT1NUX0lQQUREUkVTUyB8Ci0JCQkJICBJU0NTSV9IT1NUX0lOSVRJQVRPUl9OQU1FLAotCS50Z3RfZHNjdnIJCT0gcWxhNHh4eF90Z3RfZHNjdnIsCisJLmNhcHMJCQk9IENBUF9URVhUX05FR08gfAorCQkJCSAgQ0FQX0RBVEFfUEFUSF9PRkZMT0FEIHwgQ0FQX0hEUkRHU1QgfAorCQkJCSAgQ0FQX0RBVEFER1NUIHwgQ0FQX0xPR0lOX09GRkxPQUQgfAorCQkJCSAgQ0FQX01VTFRJX1IyVCwKKwkuYXR0cl9pc192aXNpYmxlCT0gcWw0X2F0dHJfaXNfdmlzaWJsZSwKKwkuY3JlYXRlX3Nlc3Npb24gICAgICAgICA9IHFsYTR4eHhfc2Vzc2lvbl9jcmVhdGUsCisJLmRlc3Ryb3lfc2Vzc2lvbiAgICAgICAgPSBxbGE0eHh4X3Nlc3Npb25fZGVzdHJveSwKKwkuc3RhcnRfY29ubiAgICAgICAgICAgICA9IHFsYTR4eHhfY29ubl9zdGFydCwKKwkuY3JlYXRlX2Nvbm4gICAgICAgICAgICA9IHFsYTR4eHhfY29ubl9jcmVhdGUsCisJLmJpbmRfY29ubiAgICAgICAgICAgICAgPSBxbGE0eHh4X2Nvbm5fYmluZCwKKwkuc3RvcF9jb25uICAgICAgICAgICAgICA9IGlzY3NpX2Nvbm5fc3RvcCwKKwkuZGVzdHJveV9jb25uICAgICAgICAgICA9IHFsYTR4eHhfY29ubl9kZXN0cm95LAorCS5zZXRfcGFyYW0gICAgICAgICAgICAgID0gaXNjc2lfc2V0X3BhcmFtLAogCS5nZXRfY29ubl9wYXJhbQkJPSBxbGE0eHh4X2Nvbm5fZ2V0X3BhcmFtLAotCS5nZXRfc2Vzc2lvbl9wYXJhbQk9IHFsYTR4eHhfc2Vzc19nZXRfcGFyYW0sCisJLmdldF9zZXNzaW9uX3BhcmFtCT0gaXNjc2lfc2Vzc2lvbl9nZXRfcGFyYW0sCisJLmdldF9lcF9wYXJhbSAgICAgICAgICAgPSBxbGE0eHh4X2dldF9lcF9wYXJhbSwKKwkuZXBfY29ubmVjdAkJPSBxbGE0eHh4X2VwX2Nvbm5lY3QsCisJLmVwX3BvbGwJCT0gcWxhNHh4eF9lcF9wb2xsLAorCS5lcF9kaXNjb25uZWN0CQk9IHFsYTR4eHhfZXBfZGlzY29ubmVjdCwKKwkuZ2V0X3N0YXRzCQk9IHFsYTR4eHhfY29ubl9nZXRfc3RhdHMsCisJLnNlbmRfcGR1CQk9IGlzY3NpX2Nvbm5fc2VuZF9wZHUsCisJLnhtaXRfdGFzawkJPSBxbGE0eHh4X3Rhc2tfeG1pdCwKKwkuY2xlYW51cF90YXNrCQk9IHFsYTR4eHhfdGFza19jbGVhbnVwLAorCS5hbGxvY19wZHUJCT0gcWxhNHh4eF9hbGxvY19wZHUsCisKIAkuZ2V0X2hvc3RfcGFyYW0JCT0gcWxhNHh4eF9ob3N0X2dldF9wYXJhbSwKLQkuc2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dCA9IHFsYTR4eHhfcmVjb3ZlcnlfdGltZWRvdXQsCisJLnNldF9pZmFjZV9wYXJhbQk9IHFsYTR4eHhfaWZhY2Vfc2V0X3BhcmFtLAorCS5nZXRfaWZhY2VfcGFyYW0JPSBxbGE0eHh4X2dldF9pZmFjZV9wYXJhbSwKKwkuYnNnX3JlcXVlc3QJCT0gcWxhNHh4eF9ic2dfcmVxdWVzdCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnFsYTR4eHhfc2NzaV90cmFuc3BvcnQ7CiAKK3N0YXRpYyBtb2RlX3QgcWw0X2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKQoreworCXN3aXRjaCAocGFyYW1fdHlwZSkgeworCWNhc2UgSVNDU0lfSE9TVF9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSFdBRERSRVNTOgorCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSVBBRERSRVNTOgorCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSU5JVElBVE9SX05BTUU6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBJU0NTSV9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX1BPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTOgorCQljYXNlIElTQ1NJX1BBUkFNX0NPTk5fUE9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9UQVJHRVRfTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9UUEdUOgorCQljYXNlIElTQ1NJX1BBUkFNX1RBUkdFVF9BTElBUzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfQlVSU1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1IyVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9GSVJTVF9CVVJTVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUkVDVl9ETEVOR1RIOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9YTUlUX0RMRU5HVEg6CisJCWNhc2UgSVNDU0lfUEFSQU1fSUZBQ0VfTkFNRToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIElTQ1NJX05FVF9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0FERFI6CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfU1VCTkVUOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0dXOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0JPT1RQUk9UTzoKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSUZBQ0VfRU5BQkxFOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X0xJTktMT0NBTDoKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9BRERSOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X1JPVVRFUjoKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9BRERSX0FVVE9DRkc6CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkc6CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fSUQ6CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fUFJJT1JJVFk6CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fRU5BQkxFRDoKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fTVRVOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9QT1JUOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFsYTR4eHhfZ2V0X2lmYWNlX3BhcmFtKHN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UsCisJCQkJICAgZW51bSBpc2NzaV9wYXJhbV90eXBlIHBhcmFtX3R5cGUsCisJCQkJICAgaW50IHBhcmFtLCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9pZmFjZV90b19zaG9zdChpZmFjZSk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3Qoc2hvc3QpOworCWludCBsZW4gPSAtRU5PU1lTOworCisJaWYgKHBhcmFtX3R5cGUgIT0gSVNDU0lfTkVUX1BBUkFNKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0FERFI6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXBJNFxuIiwgJmhhLT5pcF9jb25maWcuaXBfYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfU1VCTkVUOgorCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVwSTRcbiIsICZoYS0+aXBfY29uZmlnLnN1Ym5ldF9tYXNrKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9HVzoKKwkJbGVuID0gc3ByaW50ZihidWYsICIlcEk0XG4iLCAmaGEtPmlwX2NvbmZpZy5nYXRld2F5KTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSUZBQ0VfRU5BQkxFOgorCQlpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY0KQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCQkgICAgICAoaGEtPmlwX2NvbmZpZy5pcHY0X29wdGlvbnMgJgorCQkJCSAgICAgICBJUE9QVF9JUFY0X1BST1RPQ09MX0VOQUJMRSkgPworCQkJCSAgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQllbHNlIGlmIChpZmFjZS0+aWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjYpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAorCQkJCSAgICAgIChoYS0+aXBfY29uZmlnLmlwdjZfb3B0aW9ucyAmCisJCQkJICAgICAgIElQVjZfT1BUX0lQVjZfUFJPVE9DT0xfRU5BQkxFKSA/CisJCQkJICAgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0JPT1RQUk9UTzoKKwkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCSAgICAgIChoYS0+aXBfY29uZmlnLnRjcF9vcHRpb25zICYgVENQT1BUX0RIQ1BfRU5BQkxFKSA/CisJCQkgICAgICAiZGhjcCIgOiAic3RhdGljIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUjoKKwkJaWYgKGlmYWNlLT5pZmFjZV9udW0gPT0gMCkKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiJXBJNlxuIiwgJmhhLT5pcF9jb25maWcuaXB2Nl9hZGRyMCk7CisJCWlmIChpZmFjZS0+aWZhY2VfbnVtID09IDEpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVwSTZcbiIsICZoYS0+aXBfY29uZmlnLmlwdjZfYWRkcjEpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X0xJTktMT0NBTDoKKwkJbGVuID0gc3ByaW50ZihidWYsICIlcEk2XG4iLAorCQkJICAgICAgJmhhLT5pcF9jb25maWcuaXB2Nl9saW5rX2xvY2FsX2FkZHIpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X1JPVVRFUjoKKwkJbGVuID0gc3ByaW50ZihidWYsICIlcEk2XG4iLAorCQkJICAgICAgJmhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9BRERSX0FVVE9DRkc6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsCisJCQkgICAgICAoaGEtPmlwX2NvbmZpZy5pcHY2X2FkZGxfb3B0aW9ucyAmCisJCQkgICAgICAgSVBWNl9BRERPUFRfTkVJR0hCT1JfRElTQ09WRVJZX0FERFJfRU5BQkxFKSA/CisJCQkgICAgICAgIm5kIiA6ICJzdGF0aWMiKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9MSU5LTE9DQUxfQVVUT0NGRzoKKwkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCSAgICAgIChoYS0+aXBfY29uZmlnLmlwdjZfYWRkbF9vcHRpb25zICYKKwkJCSAgICAgICBJUFY2X0FERE9QVF9BVVRPQ09ORklHX0xJTktfTE9DQUxfQUREUikgPworCQkJICAgICAgICJhdXRvIiA6ICJzdGF0aWMiKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fVkxBTl9JRDoKKwkJaWYgKGlmYWNlLT5pZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNCkKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsCisJCQkJICAgICAgKGhhLT5pcF9jb25maWcuaXB2NF92bGFuX3RhZyAmCisJCQkJICAgICAgIElTQ1NJX01BWF9WTEFOX0lEKSk7CisJCWVsc2UgaWYgKGlmYWNlLT5pZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNikKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsCisJCQkJICAgICAgKGhhLT5pcF9jb25maWcuaXB2Nl92bGFuX3RhZyAmCisJCQkJICAgICAgIElTQ1NJX01BWF9WTEFOX0lEKSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fUFJJT1JJVFk6CisJCWlmIChpZmFjZS0+aWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjQpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJCSAgICAgICgoaGEtPmlwX2NvbmZpZy5pcHY0X3ZsYW5fdGFnID4+IDEzKSAmCisJCQkJCUlTQ1NJX01BWF9WTEFOX1BSSU9SSVRZKSk7CisJCWVsc2UgaWYgKGlmYWNlLT5pZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNikKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsCisJCQkJICAgICAgKChoYS0+aXBfY29uZmlnLmlwdjZfdmxhbl90YWcgPj4gMTMpICYKKwkJCQkJSVNDU0lfTUFYX1ZMQU5fUFJJT1JJVFkpKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fVkxBTl9FTkFCTEVEOgorCQlpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY0KQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCQkgICAgICAoaGEtPmlwX2NvbmZpZy5pcHY0X29wdGlvbnMgJgorCQkJCSAgICAgICBJUE9QVF9WTEFOX1RBR0dJTkdfRU5BQkxFKSA/CisJCQkJICAgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQllbHNlIGlmIChpZmFjZS0+aWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjYpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAorCQkJCSAgICAgIChoYS0+aXBfY29uZmlnLmlwdjZfb3B0aW9ucyAmCisJCQkJICAgICAgIElQVjZfT1BUX1ZMQU5fVEFHR0lOR19FTkFCTEUpID8KKwkJCQkgICAgICAgImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX01UVToKKwkJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgaGEtPmlwX2NvbmZpZy5ldGhfbXR1X3NpemUpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9QT1JUOgorCQlpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY0KQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgaGEtPmlwX2NvbmZpZy5pcHY0X3BvcnQpOworCQllbHNlIGlmIChpZmFjZS0+aWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjYpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBoYS0+aXBfY29uZmlnLmlwdjZfcG9ydCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxlbiA9IC1FTk9TWVM7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqCitxbGE0eHh4X2VwX2Nvbm5lY3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIsCisJCSAgIGludCBub25fYmxvY2tpbmcpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwOworCXN0cnVjdCBxbGFfZW5kcG9pbnQgKnFsYV9lcDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2OworCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCWlmICghc2hvc3QpIHsKKwkJcmV0ID0gLUVOWElPOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzaG9zdCBpcyBOVUxMXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCWhhID0gaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKKworCWVwID0gaXNjc2lfY3JlYXRlX2VuZHBvaW50KHNpemVvZihzdHJ1Y3QgcWxhX2VuZHBvaW50KSk7CisJaWYgKCFlcCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXFsYV9lcCA9IGVwLT5kZF9kYXRhOworCW1lbXNldChxbGFfZXAsIDAsIHNpemVvZihzdHJ1Y3QgcWxhX2VuZHBvaW50KSk7CisJaWYgKGRzdF9hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworCQltZW1jcHkoJnFsYV9lcC0+ZHN0X2FkZHIsIGRzdF9hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJnFsYV9lcC0+ZHN0X2FkZHI7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogJXBJNFxuIiwgX19mdW5jX18sCisJCQkJICAoY2hhciAqKSZhZGRyLT5zaW5fYWRkcikpOworCX0gZWxzZSBpZiAoZHN0X2FkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQltZW1jcHkoJnFsYV9lcC0+ZHN0X2FkZHIsIGRzdF9hZGRyLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKKwkJYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZxbGFfZXAtPmRzdF9hZGRyOworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6ICVwSTZcbiIsIF9fZnVuY19fLAorCQkJCSAgKGNoYXIgKikmYWRkcjYtPnNpbjZfYWRkcikpOworCX0KKworCXFsYV9lcC0+aG9zdCA9IHNob3N0OworCisJcmV0dXJuIGVwOworfQorCitzdGF0aWMgaW50IHFsYTR4eHhfZXBfcG9sbChzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwLCBpbnQgdGltZW91dF9tcykKK3sKKwlzdHJ1Y3QgcWxhX2VuZHBvaW50ICpxbGFfZXA7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCWludCByZXQgPSAwOworCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCXFsYV9lcCA9IGVwLT5kZF9kYXRhOworCWhhID0gdG9fcWxhX2hvc3QocWxhX2VwLT5ob3N0KTsKKworCWlmIChhZGFwdGVyX3VwKGhhKSkKKwkJcmV0ID0gMTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZXBfZGlzY29ubmVjdChzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwKQoreworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwlpc2NzaV9kZXN0cm95X2VuZHBvaW50KGVwKTsKK30KKworc3RhdGljIGludCBxbGE0eHh4X2dldF9lcF9wYXJhbShzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwLAorCQkJCWVudW0gaXNjc2lfcGFyYW0gcGFyYW0sCisJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBxbGFfZW5kcG9pbnQgKnFsYV9lcCA9IGVwLT5kZF9kYXRhOworCXN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHI7CisKKwlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBJU0NTSV9QQVJBTV9DT05OX1BPUlQ6CisJY2FzZSBJU0NTSV9QQVJBTV9DT05OX0FERFJFU1M6CisJCWlmICghcWxhX2VwKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKworCQlkc3RfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmcWxhX2VwLT5kc3RfYWRkcjsKKwkJaWYgKCFkc3RfYWRkcikKKwkJCXJldHVybiAtRU5PVENPTk47CisKKwkJcmV0dXJuIGlzY3NpX2Nvbm5fZ2V0X2FkZHJfcGFyYW0oKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICopCisJCQkJCQkgJnFsYV9lcC0+ZHN0X2FkZHIsIHBhcmFtLCBidWYpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF9jb25uX2dldF9zdGF0cyhzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLAorCQkJCSAgIHN0cnVjdCBpc2NzaV9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2VzczsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXN0cnVjdCBxbF9pc2NzaV9zdGF0cyAqcWxfaXNjc2lfc3RhdHM7CisJaW50IHN0YXRzX3NpemU7CisJaW50IHJldDsKKwlkbWFfYWRkcl90IGlzY3NpX3N0YXRzX2RtYTsKKworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKworCWNsc19zZXNzID0gaXNjc2lfY29ubl90b19zZXNzaW9uKGNsc19jb25uKTsKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisKKwlzdGF0c19zaXplID0gUEFHRV9BTElHTihzaXplb2Yoc3RydWN0IHFsX2lzY3NpX3N0YXRzKSk7CisJLyogQWxsb2NhdGUgbWVtb3J5ICovCisJcWxfaXNjc2lfc3RhdHMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHN0YXRzX3NpemUsCisJCQkJCSAgICAmaXNjc2lfc3RhdHNfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXFsX2lzY3NpX3N0YXRzKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGlzY3NpIHN0YXRzXG4iKTsKKwkJZ290byBleGl0X2dldF9zdGF0czsKKwl9CisKKwlyZXQgPSAgcWxhNHh4eF9nZXRfbWdtdF9kYXRhKGhhLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwgc3RhdHNfc2l6ZSwKKwkJCQkgICAgIGlzY3NpX3N0YXRzX2RtYSk7CisJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCSAgICJVbmFibGUgdG8gcmV0cmVpdmUgaXNjc2kgc3RhdHNcbiIpOworCQlnb3RvIGZyZWVfc3RhdHM7CisJfQorCisJLyogb2N0ZXRzICovCisJc3RhdHMtPnR4ZGF0YV9vY3RldHMgPSBsZTY0X3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+dHhfZGF0YV9vY3RldHMpOworCXN0YXRzLT5yeGRhdGFfb2N0ZXRzID0gbGU2NF90b19jcHUocWxfaXNjc2lfc3RhdHMtPnJ4X2RhdGFfb2N0ZXRzKTsKKwkvKiB4bWl0IHBkdXMgKi8KKwlzdGF0cy0+bm9wdHhfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT50eF9ub3BvdXRfcGR1cyk7CisJc3RhdHMtPnNjc2ljbWRfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT50eF9zY3NpX2NtZF9wZHVzKTsKKwlzdGF0cy0+dG1mY21kX3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+dHhfdG1mX2NtZF9wZHVzKTsKKwlzdGF0cy0+bG9naW5fcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT50eF9sb2dpbl9jbWRfcGR1cyk7CisJc3RhdHMtPnRleHRfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT50eF90ZXh0X2NtZF9wZHVzKTsKKwlzdGF0cy0+ZGF0YW91dF9wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnR4X3Njc2lfd3JpdGVfcGR1cyk7CisJc3RhdHMtPmxvZ291dF9wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnR4X2xvZ291dF9jbWRfcGR1cyk7CisJc3RhdHMtPnNuYWNrX3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+dHhfc25hY2tfcmVxX3BkdXMpOworCS8qIHJlY3YgcGR1cyAqLworCXN0YXRzLT5ub3ByeF9wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnJ4X25vcGluX3BkdXMpOworCXN0YXRzLT5zY3NpcnNwX3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+cnhfc2NzaV9yZXNwX3BkdXMpOworCXN0YXRzLT50bWZyc3BfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT5yeF90bWZfcmVzcF9wZHVzKTsKKwlzdGF0cy0+dGV4dHJzcF9wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnJ4X3RleHRfcmVzcF9wZHVzKTsKKwlzdGF0cy0+ZGF0YWluX3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+cnhfc2NzaV9yZWFkX3BkdXMpOworCXN0YXRzLT5sb2dvdXRyc3BfcGR1cyA9CisJCQlsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+cnhfbG9nb3V0X3Jlc3BfcGR1cyk7CisJc3RhdHMtPnIydF9wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnJ4X3IydF9wZHVzKTsKKwlzdGF0cy0+YXN5bmNfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT5yeF9hc3luY19wZHVzKTsKKwlzdGF0cy0+cmp0X3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+cnhfcmVqZWN0X3BkdXMpOworCitmcmVlX3N0YXRzOgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzdGF0c19zaXplLCBxbF9pc2NzaV9zdGF0cywKKwkJCSAgaXNjc2lfc3RhdHNfZG1hKTsKK2V4aXRfZ2V0X3N0YXRzOgorCXJldHVybjsKK30KKwogc3RhdGljIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBxbGE0eHh4X2VoX2NtZF90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqc2MpCiB7CiAJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uOwotCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVudW0gYmxrX2VoX3RpbWVyX3JldHVybiByZXQgPSBCTEtfRUhfTk9UX0hBTkRMRUQ7CiAKIAlzZXNzaW9uID0gc3RhcmdldF90b19zZXNzaW9uKHNjc2lfdGFyZ2V0KHNjLT5kZXZpY2UpKTsKLQlkZGJfZW50cnkgPSBzZXNzaW9uLT5kZF9kYXRhOworCXNlc3MgPSBzZXNzaW9uLT5kZF9kYXRhOwogCi0JLyogaWYgd2UgYXJlIG5vdCBsb2dnZWQgaW4gdGhlbiB0aGUgTExEIGlzIGdvaW5nIHRvIGNsZWFuIHVwIHRoZSBjbWQgKi8KLQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpICE9IEREQl9TVEFURV9PTkxJTkUpCi0JCXJldHVybiBCTEtfRUhfUkVTRVRfVElNRVI7Ci0JZWxzZQotCQlyZXR1cm4gQkxLX0VIX05PVF9IQU5ETEVEOwotfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7CisJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NFU1NJT05fRkFJTEVEKQorCQlyZXQgPSBCTEtfRUhfUkVTRVRfVElNRVI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOwogCi1zdGF0aWMgdm9pZCBxbGE0eHh4X3JlY292ZXJ5X3RpbWVkb3V0KHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbikKLXsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkgPSBzZXNzaW9uLT5kZF9kYXRhOwotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IGRkYl9lbnRyeS0+aGE7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpICE9IEREQl9TVEFURV9PTkxJTkUpIHsKLQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5zdGF0ZSwgRERCX1NUQVRFX0RFQUQpOwotCi0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBkZGIgWyVkXSBzZXNzaW9uIHJlY292ZXJ5IHRpbWVvdXQgIgotCQkJICAgICAgIm9mICglZCkgc2VjcyBleGhhdXN0ZWQsIG1hcmtpbmcgZGV2aWNlIERFQUQuXG4iLAotCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwKLQkJCSAgICAgIGRkYl9lbnRyeS0+c2Vzcy0+cmVjb3ZlcnlfdG1vKSk7Ci0JfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcWxhNHh4eF9ob3N0X2dldF9wYXJhbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKQEAgLTE4OCw5ICs1NTAsNyBAQAogCQlsZW4gPSBzeXNmc19mb3JtYXRfbWFjKGJ1ZiwgaGEtPm15X21hYywgTUFDX0FERFJfTEVOKTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUzoKLQkJbGVuID0gc3ByaW50ZihidWYsICIlZC4lZC4lZC4lZFxuIiwgaGEtPmlwX2FkZHJlc3NbMF0sCi0JCQkgICAgICBoYS0+aXBfYWRkcmVzc1sxXSwgaGEtPmlwX2FkZHJlc3NbMl0sCi0JCQkgICAgICBoYS0+aXBfYWRkcmVzc1szXSk7CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXBJNFxuIiwgJmhhLT5pcF9jb25maWcuaXBfYWRkcmVzcyk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9JTklUSUFUT1JfTkFNRToKIAkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwgaGEtPm5hbWVfc3RyaW5nKTsKQEAgLTIwMiwxNTQgKzU2Miw4NTEgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IHFsYTR4eHhfc2Vzc19nZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzLAotCQkJCSAgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmKQorc3RhdGljIHZvaWQgcWxhNHh4eF9jcmVhdGVfaXB2NF9pZmFjZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKLQlpbnQgbGVuOwotCi0Jc3dpdGNoIChwYXJhbSkgewotCWNhc2UgSVNDU0lfUEFSQU1fVEFSR0VUX05BTUU6Ci0JCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVzXG4iLAotCQkJICAgICAgIGRkYl9lbnRyeS0+aXNjc2lfbmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfUEFSQU1fVFBHVDoKLQkJbGVuID0gc3ByaW50ZihidWYsICIldVxuIiwgZGRiX2VudHJ5LT50cGd0KTsKLQkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9QQVJBTV9UQVJHRVRfQUxJQVM6Ci0JCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVzXG4iLAotCQkgICAgZGRiX2VudHJ5LT5pc2NzaV9hbGlhcyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PU1lTOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgcWxhNHh4eF9jb25uX2dldF9wYXJhbShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4sCi0JCQkJICBlbnVtIGlzY3NpX3BhcmFtIHBhcmFtLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uOwotCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKLQlpbnQgbGVuOwotCi0Jc2Vzc2lvbiA9IGlzY3NpX2Rldl90b19zZXNzaW9uKGNvbm4tPmRldi5wYXJlbnQpOwotCWRkYl9lbnRyeSA9IHNlc3Npb24tPmRkX2RhdGE7Ci0KLQlzd2l0Y2ggKHBhcmFtKSB7Ci0JY2FzZSBJU0NTSV9QQVJBTV9DT05OX1BPUlQ6Ci0JCWxlbiA9IHNwcmludGYoYnVmLCAiJWh1XG4iLCBkZGJfZW50cnktPnBvcnQpOwotCQlicmVhazsKLQljYXNlIElTQ1NJX1BBUkFNX0NPTk5fQUREUkVTUzoKLQkJLyogVE9ETzogd2hhdCBhcmUgdGhlIGlwdjYgYml0cyAqLwotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVwSTRcbiIsICZkZGJfZW50cnktPmlwX2FkZHIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT1NZUzsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IHFsYTR4eHhfdGd0X2RzY3ZyKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAotCQkJICAgICBlbnVtIGlzY3NpX3RndF9kc2N2ciB0eXBlLCB1aW50MzJfdCBlbmFibGUsCi0JCQkgICAgIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIpCi17Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOwotCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNjsKLQlpbnQgcmV0ID0gMDsKLQotCWhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopIHNob3N0LT5ob3N0ZGF0YTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSVNDU0lfVEdUX0RTQ1ZSX1NFTkRfVEFSR0VUUzoKLQkJaWYgKGRzdF9hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgewotCQkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilkc3RfYWRkcjsKLQkJCWlmIChxbGE0eHh4X3NlbmRfdGd0cyhoYSwgKGNoYXIgKikmYWRkci0+c2luX2FkZHIsCi0JCQkJCSAgICAgIGFkZHItPnNpbl9wb3J0KSAhPSBRTEFfU1VDQ0VTUykKLQkJCQlyZXQgPSAtRUlPOwotCQl9IGVsc2UgaWYgKGRzdF9hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLQkJCS8qCi0JCQkgKiBUT0RPOiBmaXggcWxhNHh4eF9zZW5kX3RndHMKLQkJCSAqLwotCQkJYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWRzdF9hZGRyOwotCQkJaWYgKHFsYTR4eHhfc2VuZF90Z3RzKGhhLCAoY2hhciAqKSZhZGRyNi0+c2luNl9hZGRyLAotCQkJCQkgICAgICBhZGRyNi0+c2luNl9wb3J0KSAhPSBRTEFfU1VDQ0VTUykKLQkJCQlyZXQgPSAtRUlPOwotCQl9IGVsc2UKLQkJCXJldCA9IC1FTk9TWVM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FTk9TWVM7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcWxhNHh4eF9kZXN0cm95X3Nlc3Moc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KQotewotCWlmICghZGRiX2VudHJ5LT5zZXNzKQorCWlmIChoYS0+aWZhY2VfaXB2NCkKIAkJcmV0dXJuOwogCi0JaWYgKGRkYl9lbnRyeS0+Y29ubikgewotCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnN0YXRlLCBEREJfU1RBVEVfREVBRCk7Ci0JCWlzY3NpX3JlbW92ZV9zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7Ci0JfQotCWlzY3NpX2ZyZWVfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MpOworCS8qIElQdjQgKi8KKwloYS0+aWZhY2VfaXB2NCA9IGlzY3NpX2NyZWF0ZV9pZmFjZShoYS0+aG9zdCwKKwkJCQkJICAgICZxbGE0eHh4X2lzY3NpX3RyYW5zcG9ydCwKKwkJCQkJICAgIElTQ1NJX0lGQUNFX1RZUEVfSVBWNCwgMCwgMCk7CisJaWYgKCFoYS0+aWZhY2VfaXB2NCkKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJDb3VsZCBub3QgY3JlYXRlIElQdjQgaVNDU0kgIgorCQkJICAgImlmYWNlMC5cbiIpOwogfQogCi1pbnQgcWxhNHh4eF9hZGRfc2VzcyhzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpCitzdGF0aWMgdm9pZCBxbGE0eHh4X2NyZWF0ZV9pcHY2X2lmYWNlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlpbnQgZXJyOworCWlmICghaGEtPmlmYWNlX2lwdjZfMCkKKwkJLyogSVB2NiBpZmFjZS0wICovCisJCWhhLT5pZmFjZV9pcHY2XzAgPSBpc2NzaV9jcmVhdGVfaWZhY2UoaGEtPmhvc3QsCisJCQkJCQkgICAgICAmcWxhNHh4eF9pc2NzaV90cmFuc3BvcnQsCisJCQkJCQkgICAgICBJU0NTSV9JRkFDRV9UWVBFX0lQVjYsIDAsCisJCQkJCQkgICAgICAwKTsKKwlpZiAoIWhhLT5pZmFjZV9pcHY2XzApCisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiQ291bGQgbm90IGNyZWF0ZSBJUHY2IGlTQ1NJICIKKwkJCSAgICJpZmFjZTAuXG4iKTsKIAotCWRkYl9lbnRyeS0+c2Vzcy0+cmVjb3ZlcnlfdG1vID0gcWw0eHNlc3NfcmVjb3ZlcnlfdG1vOworCWlmICghaGEtPmlmYWNlX2lwdjZfMSkKKwkJLyogSVB2NiBpZmFjZS0xICovCisJCWhhLT5pZmFjZV9pcHY2XzEgPSBpc2NzaV9jcmVhdGVfaWZhY2UoaGEtPmhvc3QsCisJCQkJCQkgICAgICAmcWxhNHh4eF9pc2NzaV90cmFuc3BvcnQsCisJCQkJCQkgICAgICBJU0NTSV9JRkFDRV9UWVBFX0lQVjYsIDEsCisJCQkJCQkgICAgICAwKTsKKwlpZiAoIWhhLT5pZmFjZV9pcHY2XzEpCisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiQ291bGQgbm90IGNyZWF0ZSBJUHY2IGlTQ1NJICIKKwkJCSAgICJpZmFjZTEuXG4iKTsKK30KIAotCWVyciA9IGlzY3NpX2FkZF9zZXNzaW9uKGRkYl9lbnRyeS0+c2VzcywgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOwotCWlmIChlcnIpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGFkZCBzZXNzaW9uLlxuIikpOwotCQlyZXR1cm4gZXJyOworc3RhdGljIHZvaWQgcWxhNHh4eF9jcmVhdGVfaWZhY2VzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpZiAoaGEtPmlwX2NvbmZpZy5pcHY0X29wdGlvbnMgJiBJUE9QVF9JUFY0X1BST1RPQ09MX0VOQUJMRSkKKwkJcWxhNHh4eF9jcmVhdGVfaXB2NF9pZmFjZShoYSk7CisKKwlpZiAoaGEtPmlwX2NvbmZpZy5pcHY2X29wdGlvbnMgJiBJUFY2X09QVF9JUFY2X1BST1RPQ09MX0VOQUJMRSkKKwkJcWxhNHh4eF9jcmVhdGVfaXB2Nl9pZmFjZShoYSk7Cit9CisKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZGVzdHJveV9pcHY0X2lmYWNlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpZiAoaGEtPmlmYWNlX2lwdjQpIHsKKwkJaXNjc2lfZGVzdHJveV9pZmFjZShoYS0+aWZhY2VfaXB2NCk7CisJCWhhLT5pZmFjZV9pcHY0ID0gTlVMTDsKIAl9Cit9CiAKLQlkZGJfZW50cnktPmNvbm4gPSBpc2NzaV9jcmVhdGVfY29ubihkZGJfZW50cnktPnNlc3MsIDAsIDApOwotCWlmICghZGRiX2VudHJ5LT5jb25uKSB7Ci0JCWlzY3NpX3JlbW92ZV9zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBhZGQgY29ubmVjdGlvbi5cbiIpKTsKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZGVzdHJveV9pcHY2X2lmYWNlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpZiAoaGEtPmlmYWNlX2lwdjZfMCkgeworCQlpc2NzaV9kZXN0cm95X2lmYWNlKGhhLT5pZmFjZV9pcHY2XzApOworCQloYS0+aWZhY2VfaXB2Nl8wID0gTlVMTDsKKwl9CisJaWYgKGhhLT5pZmFjZV9pcHY2XzEpIHsKKwkJaXNjc2lfZGVzdHJveV9pZmFjZShoYS0+aWZhY2VfaXB2Nl8xKTsKKwkJaGEtPmlmYWNlX2lwdjZfMSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBxbGE0eHh4X2Rlc3Ryb3lfaWZhY2VzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlxbGE0eHh4X2Rlc3Ryb3lfaXB2NF9pZmFjZShoYSk7CisJcWxhNHh4eF9kZXN0cm95X2lwdjZfaWZhY2UoaGEpOworfQorCitzdGF0aWMgdm9pZCBxbGE0eHh4X3NldF9pcHY2KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCSAgICAgc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKmlmYWNlX3BhcmFtLAorCQkJICAgICBzdHJ1Y3QgYWRkcl9jdHJsX2JsayAqaW5pdF9md19jYikKK3sKKwkvKgorCSAqIGlmYWNlX251bSAwIGlzIHZhbGlkIGZvciBJUHY2IEFkZHIsIGxpbmtsb2NhbCwgcm91dGVyLCBhdXRvY2ZnLgorCSAqIGlmYWNlX251bSAxIGlzIHZhbGlkIG9ubHkgZm9yIElQdjYgQWRkci4KKwkgKi8KKwlzd2l0Y2ggKGlmYWNlX3BhcmFtLT5wYXJhbSkgeworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUjoKKwkJaWYgKGlmYWNlX3BhcmFtLT5pZmFjZV9udW0gJiAweDEpCisJCQkvKiBJUHY2IEFkZHIgMSAqLworCQkJbWVtY3B5KGluaXRfZndfY2ItPmlwdjZfYWRkcjEsIGlmYWNlX3BhcmFtLT52YWx1ZSwKKwkJCSAgICAgICBzaXplb2YoaW5pdF9md19jYi0+aXB2Nl9hZGRyMSkpOworCQllbHNlCisJCQkvKiBJUHY2IEFkZHIgMCAqLworCQkJbWVtY3B5KGluaXRfZndfY2ItPmlwdjZfYWRkcjAsIGlmYWNlX3BhcmFtLT52YWx1ZSwKKwkJCSAgICAgICBzaXplb2YoaW5pdF9md19jYi0+aXB2Nl9hZGRyMCkpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X0xJTktMT0NBTDoKKwkJaWYgKGlmYWNlX3BhcmFtLT5pZmFjZV9udW0gJiAweDEpCisJCQlicmVhazsKKwkJbWVtY3B5KGluaXRfZndfY2ItPmlwdjZfaWZfaWQsICZpZmFjZV9wYXJhbS0+dmFsdWVbOF0sCisJCSAgICAgICBzaXplb2YoaW5pdF9md19jYi0+aXB2Nl9pZl9pZCkpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X1JPVVRFUjoKKwkJaWYgKGlmYWNlX3BhcmFtLT5pZmFjZV9udW0gJiAweDEpCisJCQlicmVhazsKKwkJbWVtY3B5KGluaXRfZndfY2ItPmlwdjZfZGZsdF9ydHJfYWRkciwgaWZhY2VfcGFyYW0tPnZhbHVlLAorCQkgICAgICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfZGZsdF9ydHJfYWRkcikpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X0FERFJfQVVUT0NGRzoKKwkJLyogQXV0b2NmZyBhcHBsaWVzIHRvIGV2ZW4gaW50ZXJmYWNlICovCisJCWlmIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtICYgMHgxKQorCQkJYnJlYWs7CisKKwkJaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9JUFY2X0FVVE9DRkdfRElTQUJMRSkKKwkJCWluaXRfZndfY2ItPmlwdjZfYWRkdGxfb3B0cyAmPQorCQkJCWNwdV90b19sZTE2KAorCQkJCSAgfklQVjZfQURET1BUX05FSUdIQk9SX0RJU0NPVkVSWV9BRERSX0VOQUJMRSk7CisJCWVsc2UgaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9JUFY2X0FVVE9DRkdfTkRfRU5BQkxFKQorCQkJaW5pdF9md19jYi0+aXB2Nl9hZGR0bF9vcHRzIHw9CisJCQkJY3B1X3RvX2xlMTYoCisJCQkJICBJUFY2X0FERE9QVF9ORUlHSEJPUl9ESVNDT1ZFUllfQUREUl9FTkFCTEUpOworCQllbHNlCisJCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkludmFsaWQgYXV0b2NmZyBzZXR0aW5nIGZvciAiCisJCQkJICAgIklQdjYgYWRkclxuIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkc6CisJCS8qIEF1dG9jZmcgYXBwbGllcyB0byBldmVuIGludGVyZmFjZSAqLworCQlpZiAoaWZhY2VfcGFyYW0tPmlmYWNlX251bSAmIDB4MSkKKwkJCWJyZWFrOworCisJCWlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0KKwkJICAgIElTQ1NJX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkdfRU5BQkxFKQorCQkJaW5pdF9md19jYi0+aXB2Nl9hZGR0bF9vcHRzIHw9IGNwdV90b19sZTE2KAorCQkJCQlJUFY2X0FERE9QVF9BVVRPQ09ORklHX0xJTktfTE9DQUxfQUREUik7CisJCWVsc2UgaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PQorCQkJIElTQ1NJX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkdfRElTQUJMRSkKKwkJCWluaXRfZndfY2ItPmlwdjZfYWRkdGxfb3B0cyAmPSBjcHVfdG9fbGUxNigKKwkJCQkgICAgICAgfklQVjZfQURET1BUX0FVVE9DT05GSUdfTElOS19MT0NBTF9BRERSKTsKKwkJZWxzZQorCQkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJJbnZhbGlkIGF1dG9jZmcgc2V0dGluZyBmb3IgIgorCQkJCSAgICJJUHY2IGxpbmtsb2NhbCBhZGRyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9ST1VURVJfQVVUT0NGRzoKKwkJLyogQXV0b2NmZyBhcHBsaWVzIHRvIGV2ZW4gaW50ZXJmYWNlICovCisJCWlmIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtICYgMHgxKQorCQkJYnJlYWs7CisKKwkJaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9JUFY2X1JPVVRFUl9BVVRPQ0ZHX0VOQUJMRSkKKwkJCW1lbXNldChpbml0X2Z3X2NiLT5pcHY2X2RmbHRfcnRyX2FkZHIsIDAsCisJCQkgICAgICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfZGZsdF9ydHJfYWRkcikpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JRkFDRV9FTkFCTEU6CisJCWlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0gSVNDU0lfSUZBQ0VfRU5BQkxFKSB7CisJCQlpbml0X2Z3X2NiLT5pcHY2X29wdHMgfD0KKwkJCQljcHVfdG9fbGUxNihJUFY2X09QVF9JUFY2X1BST1RPQ09MX0VOQUJMRSk7CisJCQlxbGE0eHh4X2NyZWF0ZV9pcHY2X2lmYWNlKGhhKTsKKwkJfSBlbHNlIHsKKwkJCWluaXRfZndfY2ItPmlwdjZfb3B0cyAmPQorCQkJCWNwdV90b19sZTE2KH5JUFY2X09QVF9JUFY2X1BST1RPQ09MX0VOQUJMRSAmCisJCQkJCSAgICAweEZGRkYpOworCQkJcWxhNHh4eF9kZXN0cm95X2lwdjZfaWZhY2UoaGEpOworCQl9CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fVEFHOgorCQlpZiAoaWZhY2VfcGFyYW0tPmxlbiAhPSBzaXplb2YoaW5pdF9md19jYi0+aXB2Nl92bGFuX3RhZykpCisJCQlicmVhazsKKwkJaW5pdF9md19jYi0+aXB2Nl92bGFuX3RhZyA9CisJCQkJY3B1X3RvX2JlMTYoKih1aW50MTZfdCAqKWlmYWNlX3BhcmFtLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fRU5BQkxFRDoKKwkJaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9WTEFOX0VOQUJMRSkKKwkJCWluaXRfZndfY2ItPmlwdjZfb3B0cyB8PQorCQkJCWNwdV90b19sZTE2KElQVjZfT1BUX1ZMQU5fVEFHR0lOR19FTkFCTEUpOworCQllbHNlCisJCQlpbml0X2Z3X2NiLT5pcHY2X29wdHMgJj0KKwkJCQljcHVfdG9fbGUxNih+SVBWNl9PUFRfVkxBTl9UQUdHSU5HX0VOQUJMRSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX01UVToKKwkJaW5pdF9md19jYi0+ZXRoX210dV9zaXplID0KKwkJCQljcHVfdG9fbGUxNigqKHVpbnQxNl90ICopaWZhY2VfcGFyYW0tPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fUE9SVDoKKwkJLyogQXV0b2NmZyBhcHBsaWVzIHRvIGV2ZW4gaW50ZXJmYWNlICovCisJCWlmIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtICYgMHgxKQorCQkJYnJlYWs7CisKKwkJaW5pdF9md19jYi0+aXB2Nl9wb3J0ID0KKwkJCQljcHVfdG9fbGUxNigqKHVpbnQxNl90ICopaWZhY2VfcGFyYW0tPnZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJVbmtub3duIElQdjYgcGFyYW0gPSAlZFxuIiwKKwkJCSAgIGlmYWNlX3BhcmFtLT5wYXJhbSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF9zZXRfaXB2NChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkgICAgIHN0cnVjdCBpc2NzaV9pZmFjZV9wYXJhbV9pbmZvICppZmFjZV9wYXJhbSwKKwkJCSAgICAgc3RydWN0IGFkZHJfY3RybF9ibGsgKmluaXRfZndfY2IpCit7CisJc3dpdGNoIChpZmFjZV9wYXJhbS0+cGFyYW0pIHsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0FERFI6CisJCW1lbWNweShpbml0X2Z3X2NiLT5pcHY0X2FkZHIsIGlmYWNlX3BhcmFtLT52YWx1ZSwKKwkJICAgICAgIHNpemVvZihpbml0X2Z3X2NiLT5pcHY0X2FkZHIpKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9TVUJORVQ6CisJCW1lbWNweShpbml0X2Z3X2NiLT5pcHY0X3N1Ym5ldCwJaWZhY2VfcGFyYW0tPnZhbHVlLAorCQkgICAgICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjRfc3VibmV0KSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfR1c6CisJCW1lbWNweShpbml0X2Z3X2NiLT5pcHY0X2d3X2FkZHIsIGlmYWNlX3BhcmFtLT52YWx1ZSwKKwkJICAgICAgIHNpemVvZihpbml0X2Z3X2NiLT5pcHY0X2d3X2FkZHIpKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9CT09UUFJPVE86CisJCWlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0gSVNDU0lfQk9PVFBST1RPX0RIQ1ApCisJCQlpbml0X2Z3X2NiLT5pcHY0X3RjcF9vcHRzIHw9CisJCQkJCWNwdV90b19sZTE2KFRDUE9QVF9ESENQX0VOQUJMRSk7CisJCWVsc2UgaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9CT09UUFJPVE9fU1RBVElDKQorCQkJaW5pdF9md19jYi0+aXB2NF90Y3Bfb3B0cyAmPQorCQkJCQljcHVfdG9fbGUxNih+VENQT1BUX0RIQ1BfRU5BQkxFKTsKKwkJZWxzZQorCQkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJJbnZhbGlkIElQdjQgYm9vdHByb3RvXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSUZBQ0VfRU5BQkxFOgorCQlpZiAoaWZhY2VfcGFyYW0tPnZhbHVlWzBdID09IElTQ1NJX0lGQUNFX0VOQUJMRSkgeworCQkJaW5pdF9md19jYi0+aXB2NF9pcF9vcHRzIHw9CisJCQkJY3B1X3RvX2xlMTYoSVBPUFRfSVBWNF9QUk9UT0NPTF9FTkFCTEUpOworCQkJcWxhNHh4eF9jcmVhdGVfaXB2NF9pZmFjZShoYSk7CisJCX0gZWxzZSB7CisJCQlpbml0X2Z3X2NiLT5pcHY0X2lwX29wdHMgJj0KKwkJCQljcHVfdG9fbGUxNih+SVBPUFRfSVBWNF9QUk9UT0NPTF9FTkFCTEUgJgorCQkJCQkgICAgMHhGRkZGKTsKKwkJCXFsYTR4eHhfZGVzdHJveV9pcHY0X2lmYWNlKGhhKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX1RBRzoKKwkJaWYgKGlmYWNlX3BhcmFtLT5sZW4gIT0gc2l6ZW9mKGluaXRfZndfY2ItPmlwdjRfdmxhbl90YWcpKQorCQkJYnJlYWs7CisJCWluaXRfZndfY2ItPmlwdjRfdmxhbl90YWcgPQorCQkJCWNwdV90b19iZTE2KCoodWludDE2X3QgKilpZmFjZV9wYXJhbS0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQ6CisJCWlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0gSVNDU0lfVkxBTl9FTkFCTEUpCisJCQlpbml0X2Z3X2NiLT5pcHY0X2lwX29wdHMgfD0KKwkJCQkJY3B1X3RvX2xlMTYoSVBPUFRfVkxBTl9UQUdHSU5HX0VOQUJMRSk7CisJCWVsc2UKKwkJCWluaXRfZndfY2ItPmlwdjRfaXBfb3B0cyAmPQorCQkJCQljcHVfdG9fbGUxNih+SVBPUFRfVkxBTl9UQUdHSU5HX0VOQUJMRSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX01UVToKKwkJaW5pdF9md19jYi0+ZXRoX210dV9zaXplID0KKwkJCQljcHVfdG9fbGUxNigqKHVpbnQxNl90ICopaWZhY2VfcGFyYW0tPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fUE9SVDoKKwkJaW5pdF9md19jYi0+aXB2NF9wb3J0ID0KKwkJCQljcHVfdG9fbGUxNigqKHVpbnQxNl90ICopaWZhY2VfcGFyYW0tPnZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJVbmtub3duIElQdjQgcGFyYW0gPSAlZFxuIiwKKwkJCSAgIGlmYWNlX3BhcmFtLT5wYXJhbSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK3FsYTR4eHhfaW5pdGNiX3RvX2FjYihzdHJ1Y3QgYWRkcl9jdHJsX2JsayAqaW5pdF9md19jYikKK3sKKwlzdHJ1Y3QgYWRkcl9jdHJsX2Jsa19kZWYgKmFjYjsKKwlhY2IgPSAoc3RydWN0IGFkZHJfY3RybF9ibGtfZGVmICopaW5pdF9md19jYjsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDEsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkMSkpOworCW1lbXNldChhY2ItPnJlc2VydmVkMiwgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQyKSk7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQzLCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDMpKTsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDQsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkNCkpOworCW1lbXNldChhY2ItPnJlc2VydmVkNSwgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQ1KSk7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQ2LCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDYpKTsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDcsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkNykpOworCW1lbXNldChhY2ItPnJlc2VydmVkOCwgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQ4KSk7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQ5LCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDkpKTsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDEwLCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDEwKSk7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQxMSwgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQxMSkpOworCW1lbXNldChhY2ItPnJlc2VydmVkMTIsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkMTIpKTsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDEzLCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDEzKSk7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQxNCwgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQxNCkpOworCW1lbXNldChhY2ItPnJlc2VydmVkMTUsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkMTUpKTsKK30KKworc3RhdGljIGludAorcWxhNHh4eF9pZmFjZV9zZXRfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChzaG9zdCk7CisJaW50IHJ2YWwgPSAwOworCXN0cnVjdCBpc2NzaV9pZmFjZV9wYXJhbV9pbmZvICppZmFjZV9wYXJhbSA9IE5VTEw7CisJc3RydWN0IGFkZHJfY3RybF9ibGsgKmluaXRfZndfY2IgPSBOVUxMOworCWRtYV9hZGRyX3QgaW5pdF9md19jYl9kbWE7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCByZW0gPSBsZW47CisJc3RydWN0IG5sYXR0ciAqYXR0cjsKKworCWluaXRfZndfY2IgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCQkJCXNpemVvZihzdHJ1Y3QgYWRkcl9jdHJsX2JsayksCisJCQkJCSZpbml0X2Z3X2NiX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbml0X2Z3X2NiKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IFVuYWJsZSB0byBhbGxvYyBpbml0X2NiXG4iLAorCQkJICAgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkvKiBmaW5hbGx5IHJlYWR5IHRvIGdvICovCi0JaXNjc2lfdW5ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7CisJbWVtc2V0KGluaXRfZndfY2IsIDAsIHNpemVvZihzdHJ1Y3QgYWRkcl9jdHJsX2JsaykpOworCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOworCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOworCisJaWYgKHFsYTR4eHhfZ2V0X2lmY2IoaGEsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdLCBpbml0X2Z3X2NiX2RtYSkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogZ2V0IGlmY2IgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRUlPOworCQlnb3RvIGV4aXRfaW5pdF9md19jYjsKKwl9CisKKwlubGFfZm9yX2VhY2hfYXR0cihhdHRyLCBkYXRhLCBsZW4sIHJlbSkgeworCQlpZmFjZV9wYXJhbSA9IG5sYV9kYXRhKGF0dHIpOworCisJCWlmIChpZmFjZV9wYXJhbS0+cGFyYW1fdHlwZSAhPSBJU0NTSV9ORVRfUEFSQU0pCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGlmYWNlX3BhcmFtLT5pZmFjZV90eXBlKSB7CisJCWNhc2UgSVNDU0lfSUZBQ0VfVFlQRV9JUFY0OgorCQkJc3dpdGNoIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtKSB7CisJCQljYXNlIDA6CisJCQkJcWxhNHh4eF9zZXRfaXB2NChoYSwgaWZhY2VfcGFyYW0sIGluaXRfZndfY2IpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBDYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIElQdjQgaW50ZXJmYWNlICovCisJCQkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJJbnZhbGlkIElQdjQgaWZhY2UgIgorCQkJCQkgICAibnVtYmVyID0gJWRcbiIsCisJCQkJCSAgIGlmYWNlX3BhcmFtLT5pZmFjZV9udW0pOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSVNDU0lfSUZBQ0VfVFlQRV9JUFY2OgorCQkJc3dpdGNoIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtKSB7CisJCQljYXNlIDA6CisJCQljYXNlIDE6CisJCQkJcWxhNHh4eF9zZXRfaXB2NihoYSwgaWZhY2VfcGFyYW0sIGluaXRfZndfY2IpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBDYW5ub3QgaGF2ZSBtb3JlIHRoYW4gdHdvIElQdjYgaW50ZXJmYWNlICovCisJCQkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJJbnZhbGlkIElQdjYgaWZhY2UgIgorCQkJCQkgICAibnVtYmVyID0gJWRcbiIsCisJCQkJCSAgIGlmYWNlX3BhcmFtLT5pZmFjZV9udW0pOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkludmFsaWQgaWZhY2UgdHlwZVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWluaXRfZndfY2ItPmNvb2tpZSA9IGNwdV90b19sZTMyKDB4MTFCRUFENUEpOworCisJcnZhbCA9IHFsYTR4eHhfc2V0X2ZsYXNoKGhhLCBpbml0X2Z3X2NiX2RtYSwgRkxBU0hfU0VHTUVOVF9JRkNCLAorCQkJCSBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGspLAorCQkJCSBGTEFTSF9PUFRfUk1XX0NPTU1JVCk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogc2V0IGZsYXNoIG1ieCBmYWlsZWRcbiIsCisJCQkgICBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRUlPOworCQlnb3RvIGV4aXRfaW5pdF9md19jYjsKKwl9CisKKwlxbGE0eHh4X2Rpc2FibGVfYWNiKGhhKTsKKworCXFsYTR4eHhfaW5pdGNiX3RvX2FjYihpbml0X2Z3X2NiKTsKKworCXJ2YWwgPSBxbGE0eHh4X3NldF9hY2IoaGEsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdLCBpbml0X2Z3X2NiX2RtYSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogc2V0IGFjYiBtYnggZmFpbGVkXG4iLAorCQkJICAgX19mdW5jX18pOworCQlydmFsID0gLUVJTzsKKwkJZ290byBleGl0X2luaXRfZndfY2I7CisJfQorCisJbWVtc2V0KGluaXRfZndfY2IsIDAsIHNpemVvZihzdHJ1Y3QgYWRkcl9jdHJsX2JsaykpOworCXFsYTR4eHhfdXBkYXRlX2xvY2FsX2lmY2IoaGEsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdLCBpbml0X2Z3X2NiLAorCQkJCSAgaW5pdF9md19jYl9kbWEpOworCitleGl0X2luaXRfZndfY2I6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgYWRkcl9jdHJsX2JsayksCisJCQkgIGluaXRfZndfY2IsIGluaXRfZndfY2JfZG1hKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50IHFsYTR4eHhfY29ubl9nZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCQkgIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgcWxhX2Nvbm4gKnFsYV9jb25uOworCXN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHI7CisJaW50IGxlbiA9IDA7CisKKwljb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJcWxhX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCWRzdF9hZGRyID0gJnFsYV9jb25uLT5xbGFfZXAtPmRzdF9hZGRyOworCisJc3dpdGNoIChwYXJhbSkgeworCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgorCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTOgorCQlyZXR1cm4gaXNjc2lfY29ubl9nZXRfYWRkcl9wYXJhbSgoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKikKKwkJCQkJCSBkc3RfYWRkciwgcGFyYW0sIGJ1Zik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGlzY3NpX2Nvbm5fZ2V0X3BhcmFtKGNsc19jb25uLCBwYXJhbSwgYnVmKTsKKwl9CisKKwlyZXR1cm4gbGVuOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKgorcWxhNHh4eF9zZXNzaW9uX2NyZWF0ZShzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwLAorCQkJdWludDE2X3QgY21kc19tYXgsIHVpbnQxNl90IHFkZXB0aCwKKwkJCXVpbnQzMl90IGluaXRpYWxfY21kc24pCit7CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2VzczsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3RydWN0IHFsYV9lbmRwb2ludCAqcWxhX2VwOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwl1aW50MzJfdCBkZGJfaW5kZXg7CisJdWludDMyX3QgbWJ4X3N0cyA9IDA7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IHNvY2thZGRyICpkc3RfYWRkcjsKKwlpbnQgcmV0OworCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCWlmICghZXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJxbGE0eHh4OiBtaXNzaW5nIGVwLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXFsYV9lcCA9IGVwLT5kZF9kYXRhOworCWRzdF9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZxbGFfZXAtPmRzdF9hZGRyOworCWhhID0gdG9fcWxhX2hvc3QocWxhX2VwLT5ob3N0KTsKKworZ2V0X2RkYl9pbmRleDoKKwlkZGJfaW5kZXggPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5kZGJfaWR4X21hcCwgTUFYX0REQl9FTlRSSUVTKTsKKworCWlmIChkZGJfaW5kZXggPj0gTUFYX0REQl9FTlRSSUVTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAiRnJlZSBEREIgaW5kZXggbm90IGF2YWlsYWJsZVxuIikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChkZGJfaW5kZXgsIGhhLT5kZGJfaWR4X21hcCkpCisJCWdvdG8gZ2V0X2RkYl9pbmRleDsKKworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICJGb3VuZCBhIGZyZWUgRERCIGluZGV4IGF0ICVkXG4iLCBkZGJfaW5kZXgpKTsKKwlyZXQgPSBxbGE0eHh4X3JlcV9kZGJfZW50cnkoaGEsIGRkYl9pbmRleCwgJm1ieF9zdHMpOworCWlmIChyZXQgPT0gUUxBX0VSUk9SKSB7CisJCWlmIChtYnhfc3RzID09IE1CT1hfU1RTX0NPTU1BTkRfRVJST1IpIHsKKwkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICAiRERCIGluZGV4ID0gJWQgbm90IGF2YWlsYWJsZSB0cnlpbmcgbmV4dFxuIiwKKwkJCQkgICBkZGJfaW5kZXgpOworCQkJZ290byBnZXRfZGRiX2luZGV4OworCQl9CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAiRnJlZSBGVyBEREIgbm90IGF2YWlsYWJsZVxuIikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljbHNfc2VzcyA9IGlzY3NpX3Nlc3Npb25fc2V0dXAoJnFsYTR4eHhfaXNjc2lfdHJhbnNwb3J0LCBxbGFfZXAtPmhvc3QsCisJCQkJICAgICAgIGNtZHNfbWF4LCBzaXplb2Yoc3RydWN0IGRkYl9lbnRyeSksCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcWw0X3Rhc2tfZGF0YSksCisJCQkJICAgICAgIGluaXRpYWxfY21kc24sIGRkYl9pbmRleCk7CisJaWYgKCFjbHNfc2VzcykKKwkJcmV0dXJuIE5VTEw7CisKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwlkZGJfZW50cnktPmZ3X2RkYl9pbmRleCA9IGRkYl9pbmRleDsKKwlkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPSBEREJfRFNfTk9fQ09OTkVDVElPTl9BQ1RJVkU7CisJZGRiX2VudHJ5LT5oYSA9IGhhOworCWRkYl9lbnRyeS0+c2VzcyA9IGNsc19zZXNzOworCWNsc19zZXNzLT5yZWNvdmVyeV90bW8gPSBxbDR4c2Vzc19yZWNvdmVyeV90bW87CisJaGEtPmZ3X2RkYl9pbmRleF9tYXBbZGRiX2VudHJ5LT5md19kZGJfaW5kZXhdID0gZGRiX2VudHJ5OworCWhhLT50b3RfZGRicysrOworCisJcmV0dXJuIGNsc19zZXNzOworfQorCitzdGF0aWMgdm9pZCBxbGE0eHh4X3Nlc3Npb25fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzKQoreworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisKKwlxbGE0eHh4X2NsZWFyX2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJcWxhNHh4eF9mcmVlX2RkYihoYSwgZGRiX2VudHJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWlzY3NpX3Nlc3Npb25fdGVhcmRvd24oY2xzX3Nlc3MpOworfQorCitzdGF0aWMgc3RydWN0IGlzY3NpX2Nsc19jb25uICoKK3FsYTR4eHhfY29ubl9jcmVhdGUoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2VzcywgdWludDMyX3QgY29ubl9pZHgpCit7CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisKKwlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CisJY2xzX2Nvbm4gPSBpc2NzaV9jb25uX3NldHVwKGNsc19zZXNzLCBzaXplb2Yoc3RydWN0IHFsYV9jb25uKSwKKwkJCQkgICAgY29ubl9pZHgpOworCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKKwlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCWRkYl9lbnRyeS0+Y29ubiA9IGNsc19jb25uOworCisJcmV0dXJuIGNsc19jb25uOworfQorCitzdGF0aWMgaW50IHFsYTR4eHhfY29ubl9iaW5kKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24sCisJCQkgICAgIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkgICAgIHVpbnQ2NF90IHRyYW5zcG9ydF9mZCwgaW50IGlzX2xlYWRpbmcpCit7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisJc3RydWN0IHFsYV9jb25uICpxbGFfY29ubjsKKwlzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwOworCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCisJaWYgKGlzY3NpX2Nvbm5fYmluZChjbHNfc2Vzc2lvbiwgY2xzX2Nvbm4sIGlzX2xlYWRpbmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllcCA9IGlzY3NpX2xvb2t1cF9lbmRwb2ludCh0cmFuc3BvcnRfZmQpOworCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKwlxbGFfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJcWxhX2Nvbm4tPnFsYV9lcCA9IGVwLT5kZF9kYXRhOwogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgZGRiX2VudHJ5ICpxbGE0eHh4X2FsbG9jX3Nlc3Moc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQorc3RhdGljIGludCBxbGE0eHh4X2Nvbm5fc3RhcnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubikKIHsKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzID0gaXNjc2lfY29ubl90b19zZXNzaW9uKGNsc19jb25uKTsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKIAlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7Ci0Jc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnk7CisJZG1hX2FkZHJfdCBmd19kZGJfZW50cnlfZG1hOworCXVpbnQzMl90IG1ieF9zdHMgPSAwOworCWludCByZXQgPSAwOworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKIAotCXNlc3MgPSBpc2NzaV9hbGxvY19zZXNzaW9uKGhhLT5ob3N0LCAmcWxhNHh4eF9pc2NzaV90cmFuc3BvcnQsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBkZGJfZW50cnkpKTsKLQlpZiAoIXNlc3MpCi0JCXJldHVybiBOVUxMOwotCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKIAlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOwotCW1lbXNldChkZGJfZW50cnksIDAsIHNpemVvZigqZGRiX2VudHJ5KSk7Ci0JZGRiX2VudHJ5LT5oYSA9IGhhOwotCWRkYl9lbnRyeS0+c2VzcyA9IHNlc3M7Ci0JcmV0dXJuIGRkYl9lbnRyeTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisKKwlmd19kZGJfZW50cnkgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKKwkJCQkJICAmZndfZGRiX2VudHJ5X2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19kZGJfZW50cnkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkgICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IHFsYTR4eHhfc2V0X3BhcmFtX2RkYmVudHJ5KGhhLCBkZGJfZW50cnksIGNsc19jb25uLCAmbWJ4X3N0cyk7CisJaWYgKHJldCkgeworCQkvKiBJZiBpc2NzaWQgaXMgc3RvcHBlZCBhbmQgc3RhcnRlZCB0aGVuIG5vIG5lZWQgdG8gZG8KKwkJKiBzZXQgcGFyYW0gYWdhaW4gc2luY2UgZGRiIHN0YXRlIHdpbGwgYmUgYWxyZWFkeQorCQkqIGFjdGl2ZSBhbmQgRlcgZG9lcyBub3QgYWxsb3cgc2V0IGRkYiB0byBhbgorCQkqIGFjdGl2ZSBzZXNzaW9uLgorCQkqLworCQlpZiAobWJ4X3N0cykKKwkJCWlmIChkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPT0KKwkJCQkJCUREQl9EU19TRVNTSU9OX0FDVElWRSkgeworCQkJCWlzY3NpX2Nvbm5fc3RhcnQoZGRiX2VudHJ5LT5jb25uKTsKKwkJCQlpc2NzaV9jb25uX2xvZ2luX2V2ZW50KGRkYl9lbnRyeS0+Y29ubiwKKwkJCQkJCUlTQ1NJX0NPTk5fU1RBVEVfTE9HR0VEX0lOKTsKKwkJCQlnb3RvIGV4aXRfc2V0X3BhcmFtOworCQkJfQorCisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IEZhaWxlZCBzZXQgcGFyYW0gZm9yIGluZGV4WyVkXVxuIiwKKwkJCSAgIF9fZnVuY19fLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7CisJCWdvdG8gZXhpdF9jb25uX3N0YXJ0OworCX0KKworCXN0YXR1cyA9IHFsYTR4eHhfY29ubl9vcGVuKGhhLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7CisJaWYgKHN0YXR1cyA9PSBRTEFfRVJST1IpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogTG9naW4gZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sCisJCQkgICBzZXNzLT50YXJnZXRuYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0X2Nvbm5fc3RhcnQ7CisJfQorCisJaWYgKGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9PSBEREJfRFNfTk9fQ09OTkVDVElPTl9BQ1RJVkUpCisJCWRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9IEREQl9EU19MT0dJTl9JTl9QUk9DRVNTOworCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIiVzOiBEREIgc3RhdGUgWyVkXVxuIiwgX19mdW5jX18sCisJCSAgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSkpOworCitleGl0X3NldF9wYXJhbToKKwlyZXQgPSAwOworCitleGl0X2Nvbm5fc3RhcnQ6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKKwkJCSAgZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnlfZG1hKTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBxbGE0eHh4X3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCitzdGF0aWMgdm9pZCBxbGE0eHh4X2Nvbm5fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uKQogewotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHNob3N0X3ByaXYoc2hvc3QpOwotCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgKmRkYnRlbXA7CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2VzcyA9IGlzY3NpX2Nvbm5fdG9fc2Vzc2lvbihjbHNfY29ubik7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlpbnQgb3B0aW9uczsKIAotCS8qIGZpbmlzaCBzZXR1cCBvZiBzZXNzaW9ucyB0aGF0IHdlcmUgYWxyZWFkeSBzZXR1cCBpbiBmaXJtd2FyZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZGJfZW50cnksIGRkYnRlbXAsICZoYS0+ZGRiX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9BQ1RJVkUpCi0JCQlxbGE0eHh4X2FkZF9zZXNzKGRkYl9lbnRyeSk7CisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKKwlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCWhhID0gZGRiX2VudHJ5LT5oYTsKKworCW9wdGlvbnMgPSBMT0dPVVRfT1BUSU9OX0NMT1NFX1NFU1NJT047CisJaWYgKHFsYTR4eHhfc2Vzc2lvbl9sb2dvdXRfZGRiKGhhLCBkZGJfZW50cnksIG9wdGlvbnMpID09IFFMQV9FUlJPUikKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogTG9nb3V0IGZhaWxlZFxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCBxbGE0eHh4X3Rhc2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndkYXRhKQoreworCXN0cnVjdCBxbDRfdGFza19kYXRhICp0YXNrX2RhdGE7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXN0cnVjdCBwYXNzdGhydV9zdGF0dXMgKnN0czsKKwlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKKwlzdHJ1Y3QgaXNjc2lfaGRyICpoZHI7CisJdWludDhfdCAqZGF0YTsKKwl1aW50MzJfdCBkYXRhX2xlbjsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKwlpbnQgaGRyX2xlbjsKKwlpdHRfdCBpdHQ7CisKKwl0YXNrX2RhdGEgPSBjb250YWluZXJfb2Yod2RhdGEsIHN0cnVjdCBxbDRfdGFza19kYXRhLCB0YXNrX3dvcmspOworCWhhID0gdGFza19kYXRhLT5oYTsKKwl0YXNrID0gdGFza19kYXRhLT50YXNrOworCXN0cyA9ICZ0YXNrX2RhdGEtPnN0czsKKwloZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpOworCisJREVCVUczKHByaW50ayhLRVJOX0lORk8gIlN0YXR1cyByZXR1cm5lZFxuIikpOworCURFQlVHMyhxbGE0eHh4X2R1bXBfYnVmZmVyKHN0cywgNjQpKTsKKwlERUJVRzMocHJpbnRrKEtFUk5fSU5GTyAiUmVzcG9uc2UgYnVmZmVyIikpOworCURFQlVHMyhxbGE0eHh4X2R1bXBfYnVmZmVyKHRhc2tfZGF0YS0+cmVzcF9idWZmZXIsIDY0KSk7CisKKwljb25uID0gdGFzay0+Y29ubjsKKworCXN3aXRjaCAoc3RzLT5jb21wbGV0aW9uU3RhdHVzKSB7CisJY2FzZSBQQVNTVEhSVV9TVEFUVVNfQ09NUExFVEU6CisJCWhkciA9IChzdHJ1Y3QgaXNjc2lfaGRyICopdGFza19kYXRhLT5yZXNwX2J1ZmZlcjsKKwkJLyogQXNzaWduIGJhY2sgdGhlIGl0dCBpbiBoZHIsIHVudGlsIHdlIHVzZSB0aGUgUFJFQVNTSUdOX1RBRyAqLworCQlpdHQgPSBzdHMtPmhhbmRsZTsKKwkJaGRyLT5pdHQgPSBpdHQ7CisJCWRhdGEgPSB0YXNrX2RhdGEtPnJlc3BfYnVmZmVyICsgaGRyX2xlbjsKKwkJZGF0YV9sZW4gPSB0YXNrX2RhdGEtPnJlc3BfbGVuIC0gaGRyX2xlbjsKKwkJaXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIGhkciwgZGF0YSwgZGF0YV9sZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIlBhc3N0aHJ1IGZhaWxlZCBzdGF0dXMgPSAweCV4XG4iLAorCQkJICAgc3RzLT5jb21wbGV0aW9uU3RhdHVzKTsKKwkJYnJlYWs7CiAJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBxbGE0eHh4X2FsbG9jX3BkdShzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgdWludDhfdCBvcGNvZGUpCit7CisJc3RydWN0IHFsNF90YXNrX2RhdGEgKnRhc2tfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCWludCBoZHJfbGVuOworCisJc2VzcyA9IHRhc2stPmNvbm4tPnNlc3Npb247CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisJdGFza19kYXRhID0gdGFzay0+ZGRfZGF0YTsKKwltZW1zZXQodGFza19kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHFsNF90YXNrX2RhdGEpKTsKKworCWlmICh0YXNrLT5zYykgeworCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICAiJXM6IFNDU0kgQ29tbWFuZHMgbm90IGltcGxlbWVudGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcik7CisJdGFza19kYXRhLT5oYSA9IGhhOworCXRhc2tfZGF0YS0+dGFzayA9IHRhc2s7CisKKwlpZiAodGFzay0+ZGF0YV9jb3VudCkgeworCQl0YXNrX2RhdGEtPmRhdGFfZG1hID0gZG1hX21hcF9zaW5nbGUoJmhhLT5wZGV2LT5kZXYsIHRhc2stPmRhdGEsCisJCQkJCQkgICAgIHRhc2stPmRhdGFfY291bnQsCisJCQkJCQkgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCX0KKworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogTWF4UmVjdkxlbiAldSwgaXNjc2kgaHJkICVkXG4iLAorCQkgICAgICBfX2Z1bmNfXywgdGFzay0+Y29ubi0+bWF4X3JlY3ZfZGxlbmd0aCwgaGRyX2xlbikpOworCisJdGFza19kYXRhLT5yZXNwX2xlbiA9IHRhc2stPmNvbm4tPm1heF9yZWN2X2RsZW5ndGggKyBoZHJfbGVuOworCXRhc2tfZGF0YS0+cmVzcF9idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCQkJCQkgICAgdGFza19kYXRhLT5yZXNwX2xlbiwKKwkJCQkJCSAgICAmdGFza19kYXRhLT5yZXNwX2RtYSwKKwkJCQkJCSAgICBHRlBfQVRPTUlDKTsKKwlpZiAoIXRhc2tfZGF0YS0+cmVzcF9idWZmZXIpCisJCWdvdG8gZXhpdF9hbGxvY19wZHU7CisKKwl0YXNrX2RhdGEtPnJlcV9sZW4gPSB0YXNrLT5kYXRhX2NvdW50ICsgaGRyX2xlbjsKKwl0YXNrX2RhdGEtPnJlcV9idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCQkJCQkgICB0YXNrX2RhdGEtPnJlcV9sZW4sCisJCQkJCQkgICAmdGFza19kYXRhLT5yZXFfZG1hLAorCQkJCQkJICAgR0ZQX0FUT01JQyk7CisJaWYgKCF0YXNrX2RhdGEtPnJlcV9idWZmZXIpCisJCWdvdG8gZXhpdF9hbGxvY19wZHU7CisKKwl0YXNrLT5oZHIgPSB0YXNrX2RhdGEtPnJlcV9idWZmZXI7CisKKwlJTklUX1dPUksoJnRhc2tfZGF0YS0+dGFza193b3JrLCBxbGE0eHh4X3Rhc2tfd29yayk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9hbGxvY19wZHU6CisJaWYgKHRhc2tfZGF0YS0+cmVzcF9idWZmZXIpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCB0YXNrX2RhdGEtPnJlc3BfbGVuLAorCQkJCSAgdGFza19kYXRhLT5yZXNwX2J1ZmZlciwgdGFza19kYXRhLT5yZXNwX2RtYSk7CisKKwlpZiAodGFza19kYXRhLT5yZXFfYnVmZmVyKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgdGFza19kYXRhLT5yZXFfbGVuLAorCQkJCSAgdGFza19kYXRhLT5yZXFfYnVmZmVyLCB0YXNrX2RhdGEtPnJlcV9kbWEpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBxbGE0eHh4X3Rhc2tfY2xlYW51cChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcWw0X3Rhc2tfZGF0YSAqdGFza19kYXRhOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJaW50IGhkcl9sZW47CisKKwloZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpOworCXNlc3MgPSB0YXNrLT5jb25uLT5zZXNzaW9uOworCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CisJaGEgPSBkZGJfZW50cnktPmhhOworCXRhc2tfZGF0YSA9IHRhc2stPmRkX2RhdGE7CisKKwlpZiAodGFzay0+ZGF0YV9jb3VudCkgeworCQlkbWFfdW5tYXBfc2luZ2xlKCZoYS0+cGRldi0+ZGV2LCB0YXNrX2RhdGEtPmRhdGFfZG1hLAorCQkJCSB0YXNrLT5kYXRhX2NvdW50LCBQQ0lfRE1BX1RPREVWSUNFKTsKKwl9CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IE1heFJlY3ZMZW4gJXUsIGlzY3NpIGhyZCAlZFxuIiwKKwkJICAgICAgX19mdW5jX18sIHRhc2stPmNvbm4tPm1heF9yZWN2X2RsZW5ndGgsIGhkcl9sZW4pKTsKKworCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCB0YXNrX2RhdGEtPnJlc3BfbGVuLAorCQkJICB0YXNrX2RhdGEtPnJlc3BfYnVmZmVyLCB0YXNrX2RhdGEtPnJlc3BfZG1hKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgdGFza19kYXRhLT5yZXFfbGVuLAorCQkJICB0YXNrX2RhdGEtPnJlcV9idWZmZXIsIHRhc2tfZGF0YS0+cmVxX2RtYSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHFsYTR4eHhfdGFza194bWl0KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjID0gdGFzay0+c2M7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3MgPSB0YXNrLT5jb25uLT5zZXNzaW9uOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gZGRiX2VudHJ5LT5oYTsKKworCWlmICghc2MpCisJCXJldHVybiBxbGE0eHh4X3NlbmRfcGFzc3RocnUwKHRhc2spOworCisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHNjc2kgY21kIHhtaXQgbm90IGltcGxlbWVudGVkXG4iLAorCQkgICBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3ZvaWQgcWxhNHh4eF91cGRhdGVfc2Vzc2lvbl9jb25uX3BhcmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkgICAgICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KQoreworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3M7CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKwl1aW50MzJfdCBkZGJfc3RhdGU7CisJZG1hX2FkZHJfdCBmd19kZGJfZW50cnlfZG1hOworCXN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeTsKKworCWZ3X2RkYl9lbnRyeSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAorCQkJCQkgICZmd19kZGJfZW50cnlfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X2RkYl9lbnRyeSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCSAgICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRtYSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChxbGE0eHh4X2dldF9md2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsIGZ3X2RkYl9lbnRyeSwKKwkJCQkgICAgZndfZGRiX2VudHJ5X2RtYSwgTlVMTCwgTlVMTCwgJmRkYl9zdGF0ZSwKKwkJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCkgPT0gUUxBX0VSUk9SKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgInNjc2klbGQ6ICVzOiBmYWlsZWQgIgorCQkJCSAgImdldF9kZGJfZW50cnkgZm9yIGZ3X2RkYl9pbmRleCAlZFxuIiwKKwkJCQkgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKKwkJCQkgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7CisJCXJldHVybjsKKwl9CisKKwljbHNfc2VzcyA9IGRkYl9lbnRyeS0+c2VzczsKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisKKwljbHNfY29ubiA9IGRkYl9lbnRyeS0+Y29ubjsKKwljb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisKKwkvKiBVcGRhdGUgcGFyYW1zICovCisJY29ubi0+bWF4X3JlY3ZfZGxlbmd0aCA9IEJZVEVfVU5JVFMgKgorCQkJICBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX21heF9yY3ZfZGF0YV9zZWdfbGVuKTsKKworCWNvbm4tPm1heF94bWl0X2RsZW5ndGggPSBCWVRFX1VOSVRTICoKKwkJCSAgbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfc25kX2RhdGFfc2VnX2xlbik7CisKKwlzZXNzLT5pbml0aWFsX3IydF9lbiA9CisJCQkgICAgKEJJVF8xMCAmIGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfb3B0aW9ucykpOworCisJc2Vzcy0+bWF4X3IydCA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfbWF4X291dHNuZF9yMnQpOworCisJc2Vzcy0+aW1tX2RhdGFfZW4gPSAoQklUXzExICYgbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9vcHRpb25zKSk7CisKKwlzZXNzLT5maXJzdF9idXJzdCA9IEJZVEVfVU5JVFMgKgorCQkJICAgICAgIGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfZmlyc3RfYnVyc3RfbGVuKTsKKworCXNlc3MtPm1heF9idXJzdCA9IEJZVEVfVU5JVFMgKgorCQkJCSBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX21heF9idXJzdF9sZW4pOworCisJc2Vzcy0+dGltZTJ3YWl0ID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9kZWZfdGltZTJ3YWl0KTsKKworCXNlc3MtPnRpbWUycmV0YWluID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9kZWZfdGltZTJyZXRhaW4pOworCisJc2Vzcy0+dHBndCA9IGxlMzJfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+dGd0X3BvcnRhbF9ncnApOworCisJbWVtY3B5KHNlc3MtPmluaXRpYXRvcm5hbWUsIGhhLT5uYW1lX3N0cmluZywKKwkgICAgICAgbWluKHNpemVvZihoYS0+bmFtZV9zdHJpbmcpLCBzaXplb2Yoc2Vzcy0+aW5pdGlhdG9ybmFtZSkpKTsKIH0KIAogLyoKQEAgLTM3NiwyNSArMTQzMywxNSBAQAogfQogCiAvKioqCi0gKiBxbGE0eHh4X21hcmtfZGV2aWNlX21pc3NpbmcgLSBtYXJrIGEgZGV2aWNlIGFzIG1pc3NpbmcuCi0gKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIHFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyAtIGJsb2NrcyB0aGUgc2Vzc2lvbgorICogQGNsc19zZXNzaW9uOiBQb2ludGVyIHRvIHRoZSBzZXNzaW9uIHRvIGJlIGJsb2NrZWQKICAqIEBkZGJfZW50cnk6IFBvaW50ZXIgdG8gZGV2aWNlIGRhdGFiYXNlIGVudHJ5CiAgKgogICogVGhpcyByb3V0aW5lIG1hcmtzIGEgZGV2aWNlIG1pc3NpbmcgYW5kIGNsb3NlIGNvbm5lY3Rpb24uCiAgKiovCi12b2lkIHFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCi0JCQkJIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSkKK3ZvaWQgcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pCiB7Ci0JaWYgKChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgIT0gRERCX1NUQVRFX0RFQUQpKSB7Ci0JCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+c3RhdGUsIEREQl9TVEFURV9NSVNTSU5HKTsKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogZGRiIFslZF0gbWFya2VkIE1JU1NJTkdcbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpKTsKLQl9IGVsc2UKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogZGRiIFslZF0gREVBRFxuIiwgaGEtPmhvc3Rfbm8sCi0JCSAgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCkpCi0KLQlpc2NzaV9ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7Ci0JaXNjc2lfY29ubl9lcnJvcl9ldmVudChkZGJfZW50cnktPmNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CisJaXNjc2lfYmxvY2tfc2Vzc2lvbihjbHNfc2Vzc2lvbik7CiB9CiAKIC8qKgpAQCAtNDA1LDEwICsxNDUyLDcgQEAKICAqKi8KIHZvaWQgcWxhNHh4eF9tYXJrX2FsbF9kZXZpY2VzX21pc3Npbmcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewotCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgKmRkYnRlbXA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRkYl9lbnRyeSwgZGRidGVtcCwgJmhhLT5kZGJfbGlzdCwgbGlzdCkgewotCQlxbGE0eHh4X21hcmtfZGV2aWNlX21pc3NpbmcoaGEsIGRkYl9lbnRyeSk7Ci0JfQorCWlzY3NpX2hvc3RfZm9yX2VhY2hfc2Vzc2lvbihoYS0+aG9zdCwgcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzcmIqIHFsYTR4eHhfZ2V0X25ld19zcmIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLApAQCAtNDk1LDIwICsxNTM5LDEzIEBACiAJCWdvdG8gcWNfZmFpbF9jb21tYW5kOwogCX0KIAotCWlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgIT0gRERCX1NUQVRFX09OTElORSkgewotCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpID09IEREQl9TVEFURV9ERUFEKSB7Ci0JCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwotCQkJZ290byBxY19mYWlsX2NvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9UQVJHRVRfQlVTWTsKLQl9Ci0KIAlpZiAodGVzdF9iaXQoRFBDX1JFU0VUX0hBX0lOVFIsICZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChEUENfUkVTRVRfQUNUSVZFLCAmaGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoRFBDX0hBX1VOUkVDT1ZFUkFCTEUsICZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChEUENfSEFfTkVFRF9RVUlFU0NFTlQsICZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICAhdGVzdF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKSB8fAorCSAgICAhdGVzdF9iaXQoQUZfTElOS19VUCwgJmhhLT5mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQsICZoYS0+ZHBjX2ZsYWdzKSkKIAkJZ290byBxY19ob3N0X2J1c3k7CiAKQEAgLTU2Myw2ICsxNjAwLDEzIEBACiAKIAloYS0+c3JiX21lbXBvb2wgPSBOVUxMOwogCisJaWYgKGhhLT5jaGFwX2RtYV9wb29sKQorCQlkbWFfcG9vbF9kZXN0cm95KGhhLT5jaGFwX2RtYV9wb29sKTsKKworCWlmIChoYS0+Y2hhcF9saXN0KQorCQl2ZnJlZShoYS0+Y2hhcF9saXN0KTsKKwloYS0+Y2hhcF9saXN0ID0gTlVMTDsKKwogCS8qIHJlbGVhc2UgaW8gc3BhY2UgcmVnaXN0ZXJzICAqLwogCWlmIChpc19xbGE4MDIyKGhhKSkgewogCQlpZiAoaGEtPm54X3BjaWJhc2UpCkBAIC02MzYsNiArMTY4MCwxNSBAQAogCQlnb3RvIG1lbV9hbGxvY19lcnJvcl9leGl0OwogCX0KIAorCWhhLT5jaGFwX2RtYV9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJxbDRfY2hhcCIsICZoYS0+cGRldi0+ZGV2LAorCQkJCQkgICAgQ0hBUF9ETUFfQkxPQ0tfU0laRSwgOCwgMCk7CisKKwlpZiAoaGEtPmNoYXBfZG1hX3Bvb2wgPT0gTlVMTCkgeworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiJXM6IGNoYXBfZG1hX3Bvb2wgYWxsb2NhdGlvbiBmYWlsZWQuLlxuIiwgX19mdW5jX18pOworCQlnb3RvIG1lbV9hbGxvY19lcnJvcl9leGl0OworCX0KKwogCXJldHVybiBRTEFfU1VDQ0VTUzsKIAogbWVtX2FsbG9jX2Vycm9yX2V4aXQ6CkBAIC03NTMsNyArMTgwNiw2IEBACiAgKiovCiBzdGF0aWMgdm9pZCBxbGE0eHh4X3RpbWVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksICpkdGVtcDsKIAlpbnQgc3RhcnRfZHBjID0gMDsKIAl1aW50MTZfdCB3OwogCkBAIC03NzMsNjkgKzE4MjUsNiBAQAogCQlxbGE0Xzh4eHhfd2F0Y2hkb2coaGEpOwogCX0KIAotCS8qIFNlYXJjaCBmb3IgcmVsb2dpbidzIHRvIHRpbWUtb3V0IGFuZCBwb3J0IGRvd24gcmV0cnkuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRkYl9lbnRyeSwgZHRlbXAsICZoYS0+ZGRiX2xpc3QsIGxpc3QpIHsKLQkJLyogQ291bnQgZG93biB0aW1lIGJldHdlZW4gc2VuZGluZyByZWxvZ2lucyAqLwotCQlpZiAoYWRhcHRlcl91cChoYSkgJiYKLQkJICAgICF0ZXN0X2JpdChERl9SRUxPR0lOLCAmZGRiX2VudHJ5LT5mbGFncykgJiYKLQkJICAgIGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSAhPSBEREJfU1RBVEVfT05MSU5FKSB7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+cmV0cnlfcmVsb2dpbl90aW1lcikgIT0KLQkJCSAgICBJTlZBTElEX0VOVFJZKSB7Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnJldHJ5X3JlbG9naW5fdGltZXIpCi0JCQkJICAgIAkJPT0gMCkgewotCQkJCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPgotCQkJCQkJcmV0cnlfcmVsb2dpbl90aW1lciwKLQkJCQkJCUlOVkFMSURfRU5UUlkpOwotCQkJCQlzZXRfYml0KERQQ19SRUxPR0lOX0RFVklDRSwKLQkJCQkJCSZoYS0+ZHBjX2ZsYWdzKTsKLQkJCQkJc2V0X2JpdChERl9SRUxPR0lOLCAmZGRiX2VudHJ5LT5mbGFncyk7Ci0JCQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBkZGIgWyVkXSIKLQkJCQkJCSAgICAgICIgbG9naW4gZGV2aWNlXG4iLAotCQkJCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkJCQkJICAgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpKTsKLQkJCQl9IGVsc2UKLQkJCQkJYXRvbWljX2RlYygmZGRiX2VudHJ5LT4KLQkJCQkJCQlyZXRyeV9yZWxvZ2luX3RpbWVyKTsKLQkJCX0KLQkJfQotCi0JCS8qIFdhaXQgZm9yIHJlbG9naW4gdG8gdGltZW91dCAqLwotCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+cmVsb2dpbl90aW1lcikgJiYKLQkJICAgIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZGJfZW50cnktPnJlbG9naW5fdGltZXIpICE9IDApKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlIHJlbG9naW4gdGltZXMgb3V0IGFuZCB0aGUgZGV2aWNlIGlzCi0JCQkgKiBzdGlsbCBOT1QgT05MSU5FIHRoZW4gdHJ5IGFuZCByZWxvZ2luIGFnYWluLgotCQkJICovCi0JCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpICE9Ci0JCQkgICAgRERCX1NUQVRFX09OTElORSAmJgotCQkJICAgIGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9PQotCQkJICAgIEREQl9EU19TRVNTSU9OX0ZBSUxFRCkgewotCQkJCS8qIFJlc2V0IHJldHJ5IHJlbG9naW4gdGltZXIgKi8KLQkJCQlhdG9taWNfaW5jKCZkZGJfZW50cnktPnJlbG9naW5fcmV0cnlfY291bnQpOwotCQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6IGRkYiBbJWRdIHJlbG9naW4iCi0JCQkJCSAgICAgICIgdGltZWQgb3V0LXJldHJ5aW5nIgotCQkJCQkgICAgICAiIHJlbG9naW4gKCVkKVxuIiwKLQkJCQkJICAgICAgaGEtPmhvc3Rfbm8sCi0JCQkJCSAgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LAotCQkJCQkgICAgICBhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT4KLQkJCQkJCQkgIHJlbG9naW5fcmV0cnlfY291bnQpKQotCQkJCQkpOwotCQkJCXN0YXJ0X2RwYysrOwotCQkJCURFQlVHKHByaW50aygic2NzaSVsZDolZDolZDogZGRiIFslZF0gIgotCQkJCQkgICAgICJpbml0aWF0ZSByZWxvZ2luIGFmdGVyIgotCQkJCQkgICAgICIgJWQgc2Vjb25kc1xuIiwKLQkJCQkJICAgICBoYS0+aG9zdF9ubywgZGRiX2VudHJ5LT5idXMsCi0JCQkJCSAgICAgZGRiX2VudHJ5LT50YXJnZXQsCi0JCQkJCSAgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsCi0JCQkJCSAgICAgZGRiX2VudHJ5LT5kZWZhdWx0X3RpbWUyd2FpdCArIDQpCi0JCQkJCSk7Ci0KLQkJCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJldHJ5X3JlbG9naW5fdGltZXIsCi0JCQkJCSAgIGRkYl9lbnRyeS0+ZGVmYXVsdF90aW1lMndhaXQgKyA0KTsKLQkJCX0KLQkJfQotCX0KLQogCWlmICghaXNfcWxhODAyMihoYSkpIHsKIAkJLyogQ2hlY2sgZm9yIGhlYXJ0YmVhdCBpbnRlcnZhbC4gKi8KIAkJaWYgKGhhLT5maXJtd2FyZV9vcHRpb25zICYgRldPUFRfSEVBUlRCRUFUX0VOQUJMRSAmJgpAQCAtMTA4MSw2ICsyMDcwLDE3IEBACiAJY2xlYXJfYml0KEFGX0lOSVRfRE9ORSwgJmhhLT5mbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZmFpbF9zZXNzaW9uKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pCit7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCisJc2VzcyA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOworCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CisJZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlID0gRERCX0RTX1NFU1NJT05fRkFJTEVEOworCWlzY3NpX3Nlc3Npb25fZmFpbHVyZShjbHNfc2Vzc2lvbi0+ZGRfZGF0YSwgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKK30KKwogLyoqCiAgKiBxbGE0eHh4X3JlY292ZXJfYWRhcHRlciAtIHJlY292ZXJzIGFkYXB0ZXIgYWZ0ZXIgYSBmYXRhbCBlcnJvcgogICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCkBAIC0xMDkzLDExICsyMDkzLDE0IEBACiAJLyogU3RhbGwgaW5jb21pbmcgSS9PIHVudGlsIHdlIGFyZSBkb25lICovCiAJc2NzaV9ibG9ja19yZXF1ZXN0cyhoYS0+aG9zdCk7CiAJY2xlYXJfYml0KEFGX09OTElORSwgJmhhLT5mbGFncyk7CisJY2xlYXJfYml0KEFGX0xJTktfVVAsICZoYS0+ZmxhZ3MpOwogCiAJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBhZGFwdGVyIE9GRkxJTkVcbiIsIF9fZnVuY19fKSk7CiAKIAlzZXRfYml0KERQQ19SRVNFVF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKIAorCWlzY3NpX2hvc3RfZm9yX2VhY2hfc2Vzc2lvbihoYS0+aG9zdCwgcWxhNHh4eF9mYWlsX3Nlc3Npb24pOworCiAJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpKQogCQlyZXNldF9jaGlwID0gMTsKIApAQCAtMTE2MCw3ICsyMTYzLDcgQEAKIAogCQkvKiBOT1RFOiBBRl9PTkxJTkUgZmxhZyBzZXQgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YKIAkJICogICAgICAgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIgKi8KLQkJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIFBSRVNFUlZFX0REQl9MSVNUKTsKKwkJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEpOwogCX0KIAogCS8qIFJldHJ5IGZhaWxlZCBhZGFwdGVyIGluaXRpYWxpemF0aW9uLCBpZiBuZWNlc3NhcnkKQEAgLTEyMjUsMjcgKzIyMjgsMzQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgdm9pZCBxbGE0eHh4X3JlbG9naW5fYWxsX2RldmljZXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQorc3RhdGljIHZvaWQgcWxhNHh4eF9yZWxvZ2luX2RldmljZXMoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbikKIHsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksICpkdGVtcDsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRkYl9lbnRyeSwgZHRlbXAsICZoYS0+ZGRiX2xpc3QsIGxpc3QpIHsKLQkJaWYgKChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgPT0gRERCX1NUQVRFX01JU1NJTkcpIHx8Ci0JCSAgICAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpID09IEREQl9TVEFURV9ERUFEKSkgewotCQkJaWYgKGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9PQotCQkJICAgIEREQl9EU19TRVNTSU9OX0FDVElWRSkgewotCQkJCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+c3RhdGUsIEREQl9TVEFURV9PTkxJTkUpOwotCQkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBkZGJbJWRdIgotCQkJCSAgICAiIG1hcmtlZCBPTkxJTkVcbiIsCWhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJCQkgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOwotCi0JCQkJaXNjc2lfdW5ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7Ci0JCQl9IGVsc2UKLQkJCQlxbGE0eHh4X3JlbG9naW5fZGV2aWNlKGhhLCBkZGJfZW50cnkpOworCXNlc3MgPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKKwlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCWhhID0gZGRiX2VudHJ5LT5oYTsKKwlpZiAoIWlzY3NpX2lzX3Nlc3Npb25fb25saW5lKGNsc19zZXNzaW9uKSkgeworCQlpZiAoZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlID09IEREQl9EU19TRVNTSU9OX0FDVElWRSkgeworCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IGRkYlslZF0iCisJCQkJICAgIiB1bmJsb2NrIHNlc3Npb25cbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKKwkJCQkgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7CisJCQlpc2NzaV91bmJsb2NrX3Nlc3Npb24oZGRiX2VudHJ5LT5zZXNzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFRyaWdnZXIgcmVsb2dpbiAqLworCQkJaXNjc2lfc2Vzc2lvbl9mYWlsdXJlKGNsc19zZXNzaW9uLT5kZF9kYXRhLAorCQkJCQkgICAgICBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwogCQl9CiAJfQogfQogCitzdGF0aWMgdm9pZCBxbGE0eHh4X3JlbG9naW5fYWxsX2RldmljZXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWlzY3NpX2hvc3RfZm9yX2VhY2hfc2Vzc2lvbihoYS0+aG9zdCwgcWxhNHh4eF9yZWxvZ2luX2RldmljZXMpOworfQorCiB2b2lkIHFsYTR4eHhfd2FrZV9kcGMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCWlmIChoYS0+ZHBjX3RocmVhZCkKQEAgLTEyNjcsNyArMjI3Nyw2IEBACiB7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzY3NpX3FsYV9ob3N0LCBkcGNfd29yayk7Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LCAqZHRlbXA7CiAJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKIAogCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBEUEMgaGFuZGxlciB3YWtpbmcgdXAuIgpAQCAtMTM2MywzMSArMjM3Miw2IEBACiAJCQlxbGE0eHh4X3JlbG9naW5fYWxsX2RldmljZXMoaGEpOwogCQl9CiAJfQotCi0JLyogLS0tLSByZWxvZ2luIGRldmljZT8gLS0tICovCi0JaWYgKGFkYXB0ZXJfdXAoaGEpICYmCi0JICAgIHRlc3RfYW5kX2NsZWFyX2JpdChEUENfUkVMT0dJTl9ERVZJQ0UsICZoYS0+ZHBjX2ZsYWdzKSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGRiX2VudHJ5LCBkdGVtcCwKLQkJCQkJICZoYS0+ZGRiX2xpc3QsIGxpc3QpIHsKLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoREZfUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpICYmCi0JCQkgICAgYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpICE9IEREQl9TVEFURV9PTkxJTkUpCi0JCQkJcWxhNHh4eF9yZWxvZ2luX2RldmljZShoYSwgZGRiX2VudHJ5KTsKLQotCQkJLyoKLQkJCSAqIElmIG1ieCBjbWQgdGltZXMgb3V0IHRoZXJlIGlzIG5vIHBvaW50Ci0JCQkgKiBpbiBjb250aW51aW5nIGZ1cnRoZXIuCi0JCQkgKiBXaXRoIGxhcmdlIG5vIG9mIHRhcmdldHMgdGhpcyBjYW4gaGFuZwotCQkJICogdGhlIHN5c3RlbS4KLQkJCSAqLwotCQkJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVsZDogJXM6ICIKLQkJCQkgICAgICAgIm5lZWQgdG8gcmVzZXQgaGJhXG4iLAotCQkJCSAgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCiB9CiAKIC8qKgpAQCAtMTQxMCw2ICsyMzk0LDEwIEBACiAJaWYgKGhhLT5kcGNfdGhyZWFkKQogCQlkZXN0cm95X3dvcmtxdWV1ZShoYS0+ZHBjX3RocmVhZCk7CiAKKwkvKiBLaWxsIHRoZSBrZXJuZWwgdGhyZWFkIGZvciB0aGlzIGhvc3QgKi8KKwlpZiAoaGEtPnRhc2tfd3EpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGhhLT50YXNrX3dxKTsKKwogCS8qIFB1dCBmaXJtd2FyZSBpbiBrbm93biBzdGF0ZSAqLwogCWhhLT5pc3Bfb3BzLT5yZXNldF9maXJtd2FyZShoYSk7CiAKQEAgLTE2MDEsNiArMjU4OSw1OTQgQEAKIAlyZXR1cm4gKHVpbnQxNl90KWxlMzJfdG9fY3B1KHJlYWRsKCZoYS0+cWxhNF84eHh4X3JlZy0+cnNwX3FfaW4pKTsKIH0KIAorc3RhdGljIHNzaXplX3QgcWxhNHh4eF9zaG93X2Jvb3RfZXRoX2luZm8odm9pZCAqZGF0YSwgaW50IHR5cGUsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBkYXRhOworCWNoYXIgKnN0ciA9IGJ1ZjsKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0ZMQUdTOgorCQlyYyA9IHNwcmludGYoc3RyLCAiJWRcbiIsIFNZU0ZTX0ZMQUdfRldfU0VMX0JPT1QpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0lOREVYOgorCQlyYyA9IHNwcmludGYoc3RyLCAiMFxuIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9FVEhfTUFDOgorCQlyYyA9IHN5c2ZzX2Zvcm1hdF9tYWMoc3RyLCBoYS0+bXlfbWFjLAorCQkJCSAgICAgIE1BQ19BRERSX0xFTik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOT1NZUzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIG1vZGVfdCBxbGE0eHh4X2V0aF9nZXRfYXR0cl92aXNpYmlsaXR5KHZvaWQgKmRhdGEsIGludCB0eXBlKQoreworCWludCByYzsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVNDU0lfQk9PVF9FVEhfRkxBR1M6CisJY2FzZSBJU0NTSV9CT09UX0VUSF9NQUM6CisJY2FzZSBJU0NTSV9CT09UX0VUSF9JTkRFWDoKKwkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHFsYTR4eHhfc2hvd19ib290X2luaV9pbmZvKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gZGF0YTsKKwljaGFyICpzdHIgPSBidWY7CisJaW50IHJjOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJU0NTSV9CT09UX0lOSV9JTklUSUFUT1JfTkFNRToKKwkJcmMgPSBzcHJpbnRmKHN0ciwgIiVzXG4iLCBoYS0+bmFtZV9zdHJpbmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9TWVM7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBtb2RlX3QgcWxhNHh4eF9pbmlfZ2V0X2F0dHJfdmlzaWJpbGl0eSh2b2lkICpkYXRhLCBpbnQgdHlwZSkKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElTQ1NJX0JPT1RfSU5JX0lOSVRJQVRPUl9OQU1FOgorCQlyYyA9IFNfSVJVR087CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTR4eHhfc2hvd19ib290X3RndF9pbmZvKHN0cnVjdCBxbDRfYm9vdF9zZXNzaW9uX2luZm8gKmJvb3Rfc2VzcywgaW50IHR5cGUsCisJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IHFsNF9jb25uX2luZm8gKmJvb3RfY29ubiA9ICZib290X3Nlc3MtPmNvbm5fbGlzdFswXTsKKwljaGFyICpzdHIgPSBidWY7CisJaW50IHJjOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9OQU1FOgorCQlyYyA9IHNwcmludGYoYnVmLCAiJXNcbiIsIChjaGFyICopJmJvb3Rfc2Vzcy0+dGFyZ2V0X25hbWUpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0lQX0FERFI6CisJCWlmIChib290X3Nlc3MtPmNvbm5fbGlzdFswXS5kZXN0X2lwYWRkci5pcF90eXBlID09IDB4MSkKKwkJCXJjID0gc3ByaW50ZihidWYsICIlcEk0XG4iLAorCQkJCSAgICAgJmJvb3RfY29ubi0+ZGVzdF9pcGFkZHIuaXBfYWRkcmVzcyk7CisJCWVsc2UKKwkJCXJjID0gc3ByaW50ZihzdHIsICIlcEk2XG4iLAorCQkJCSAgICAgJmJvb3RfY29ubi0+ZGVzdF9pcGFkZHIuaXBfYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfUE9SVDoKKwkJCXJjID0gc3ByaW50ZihzdHIsICIlZFxuIiwgYm9vdF9jb25uLT5kZXN0X3BvcnQpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0NIQVBfTkFNRToKKwkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAorCQkJICAgICBib290X2Nvbm4tPmNoYXAudGFyZ2V0X2NoYXBfbmFtZV9sZW5ndGgsCisJCQkgICAgIChjaGFyICopJmJvb3RfY29ubi0+Y2hhcC50YXJnZXRfY2hhcF9uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9DSEFQX1NFQ1JFVDoKKwkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAorCQkJICAgICBib290X2Nvbm4tPmNoYXAudGFyZ2V0X3NlY3JldF9sZW5ndGgsCisJCQkgICAgIChjaGFyICopJmJvb3RfY29ubi0+Y2hhcC50YXJnZXRfc2VjcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9SRVZfQ0hBUF9OQU1FOgorCQlyYyA9IHNwcmludGYoc3RyLCAgIiUuKnNcbiIsCisJCQkgICAgIGJvb3RfY29ubi0+Y2hhcC5pbnRyX2NoYXBfbmFtZV9sZW5ndGgsCisJCQkgICAgIChjaGFyICopJmJvb3RfY29ubi0+Y2hhcC5pbnRyX2NoYXBfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfU0VDUkVUOgorCQlyYyA9IHNwcmludGYoc3RyLCAgIiUuKnNcbiIsCisJCQkgICAgIGJvb3RfY29ubi0+Y2hhcC5pbnRyX3NlY3JldF9sZW5ndGgsCisJCQkgICAgIChjaGFyICopJmJvb3RfY29ubi0+Y2hhcC5pbnRyX3NlY3JldCk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfRkxBR1M6CisJCXJjID0gc3ByaW50ZihzdHIsICIlZFxuIiwgU1lTRlNfRkxBR19GV19TRUxfQk9PVCk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfTklDX0FTU09DOgorCQlyYyA9IHNwcmludGYoc3RyLCAiMFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOT1NZUzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgcWxhNHh4eF9zaG93X2Jvb3RfdGd0X3ByaV9pbmZvKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gZGF0YTsKKwlzdHJ1Y3QgcWw0X2Jvb3Rfc2Vzc2lvbl9pbmZvICpib290X3Nlc3MgPSAmKGhhLT5ib290X3RndC5ib290X3ByaV9zZXNzKTsKKworCXJldHVybiBxbGE0eHh4X3Nob3dfYm9vdF90Z3RfaW5mbyhib290X3Nlc3MsIHR5cGUsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHFsYTR4eHhfc2hvd19ib290X3RndF9zZWNfaW5mbyh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IGRhdGE7CisJc3RydWN0IHFsNF9ib290X3Nlc3Npb25faW5mbyAqYm9vdF9zZXNzID0gJihoYS0+Ym9vdF90Z3QuYm9vdF9zZWNfc2Vzcyk7CisKKwlyZXR1cm4gcWxhNHh4eF9zaG93X2Jvb3RfdGd0X2luZm8oYm9vdF9zZXNzLCB0eXBlLCBidWYpOworfQorCitzdGF0aWMgbW9kZV90IHFsYTR4eHhfdGd0X2dldF9hdHRyX3Zpc2liaWxpdHkodm9pZCAqZGF0YSwgaW50IHR5cGUpCit7CisJaW50IHJjOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9OQU1FOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfSVBfQUREUjoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX1BPUlQ6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9DSEFQX05BTUU6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9DSEFQX1NFQ1JFVDoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX05BTUU6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9SRVZfQ0hBUF9TRUNSRVQ6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9OSUNfQVNTT0M6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9GTEFHUzoKKwkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHFsYTR4eHhfYm9vdF9yZWxlYXNlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gZGF0YTsKKworCXNjc2lfaG9zdF9wdXQoaGEtPmhvc3QpOworfQorCitzdGF0aWMgaW50IGdldF9md19ib290X2luZm8oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCBkZGJfaW5kZXhbXSkKK3sKKwlkbWFfYWRkcl90IGJ1Zl9kbWE7CisJdWludDMyX3QgYWRkciwgcHJpX2FkZHIsIHNlY19hZGRyOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MTZfdCBmdW5jX251bTsKKwl1aW50OF90IHZhbDsKKwl1aW50OF90ICpidWYgPSBOVUxMOworCXNpemVfdCBzaXplID0gMTMgKiBzaXplb2YodWludDhfdCk7CisJaW50IHJldCA9IFFMQV9TVUNDRVNTOworCisJZnVuY19udW0gPSBQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pOworCisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IEdldCBGVyBib290IGluZm8gZm9yIDB4JXggZnVuYyAlZFxuIiwKKwkJICAgX19mdW5jX18sIGhhLT5wZGV2LT5kZXZpY2UsIGZ1bmNfbnVtKTsKKworCWlmIChpc19xbGE0MFhYKGhhKSkgeworCQlpZiAoZnVuY19udW0gPT0gMSkgeworCQkJYWRkciA9IE5WUkFNX1BPUlQwX0JPT1RfTU9ERTsKKwkJCXByaV9hZGRyID0gTlZSQU1fUE9SVDBfQk9PVF9QUklfVEdUOworCQkJc2VjX2FkZHIgPSBOVlJBTV9QT1JUMF9CT09UX1NFQ19UR1Q7CisJCX0gZWxzZSBpZiAoZnVuY19udW0gPT0gMykgeworCQkJYWRkciA9IE5WUkFNX1BPUlQxX0JPT1RfTU9ERTsKKwkJCXByaV9hZGRyID0gTlZSQU1fUE9SVDFfQk9PVF9QUklfVEdUOworCQkJc2VjX2FkZHIgPSBOVlJBTV9QT1JUMV9CT09UX1NFQ19UR1Q7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBRTEFfRVJST1I7CisJCQlnb3RvIGV4aXRfYm9vdF9pbmZvOworCQl9CisKKwkJLyogQ2hlY2sgQm9vdCBNb2RlICovCisJCXZhbCA9IHJkX252cmFtX2J5dGUoaGEsIGFkZHIpOworCQlpZiAoISh2YWwgJiAweDA3KSkgeworCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJCQkgICIlczogRmFpbGVkIEJvb3Qgb3B0aW9ucyA6IDB4JXhcbiIsCisJCQkJCSAgX19mdW5jX18sIHZhbCkpOworCQkJcmV0ID0gUUxBX0VSUk9SOworCQkJZ290byBleGl0X2Jvb3RfaW5mbzsKKwkJfQorCisJCS8qIGdldCBwcmltYXJ5IHZhbGlkIHRhcmdldCBpbmRleCAqLworCQl2YWwgPSByZF9udnJhbV9ieXRlKGhhLCBwcmlfYWRkcik7CisJCWlmICh2YWwgJiBCSVRfNykKKwkJCWRkYl9pbmRleFswXSA9ICh2YWwgJiAweDdmKTsKKworCQkvKiBnZXQgc2Vjb25kYXJ5IHZhbGlkIHRhcmdldCBpbmRleCAqLworCQl2YWwgPSByZF9udnJhbV9ieXRlKGhhLCBzZWNfYWRkcik7CisJCWlmICh2YWwgJiBCSVRfNykKKwkJCWRkYl9pbmRleFsxXSA9ICh2YWwgJiAweDdmKTsKKworCX0gZWxzZSBpZiAoaXNfcWxhODAyMihoYSkpIHsKKwkJYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplLAorCQkJCQkgJmJ1Zl9kbWEsIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1ZikgeworCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJCQkgICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRtYSBidWZmZXJcbiIsCisJCQkJCSAgIF9fZnVuY19fKSk7CisJCQlyZXQgPSBRTEFfRVJST1I7CisJCQlnb3RvIGV4aXRfYm9vdF9pbmZvOworCQl9CisKKwkJaWYgKGhhLT5wb3J0X251bSA9PSAwKQorCQkJb2Zmc2V0ID0gQk9PVF9QQVJBTV9PRkZTRVRfUE9SVDA7CisJCWVsc2UgaWYgKGhhLT5wb3J0X251bSA9PSAxKQorCQkJb2Zmc2V0ID0gQk9PVF9QQVJBTV9PRkZTRVRfUE9SVDE7CisJCWVsc2UgeworCQkJcmV0ID0gUUxBX0VSUk9SOworCQkJZ290byBleGl0X2Jvb3RfaW5mb19mcmVlOworCQl9CisJCWFkZHIgPSBGTEFTSF9SQVdfQUNDRVNTX0FERFIgKyAoaGEtPmh3LmZsdF9pc2NzaV9wYXJhbSAqIDQpICsKKwkJICAgICAgIG9mZnNldDsKKwkJaWYgKHFsYTR4eHhfZ2V0X2ZsYXNoKGhhLCBidWZfZG1hLCBhZGRyLAorCQkJCSAgICAgIDEzICogc2l6ZW9mKHVpbnQ4X3QpKSAhPSBRTEFfU1VDQ0VTUykgeworCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAic2NzaSVsZDogJXM6IEdldCBGbGFzaCIKKwkJCQkJICAiZmFpbGVkXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKKwkJCXJldCA9IFFMQV9FUlJPUjsKKwkJCWdvdG8gZXhpdF9ib290X2luZm9fZnJlZTsKKwkJfQorCQkvKiBDaGVjayBCb290IE1vZGUgKi8KKwkJaWYgKCEoYnVmWzFdICYgMHgwNykpIHsKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJCSAgIkZhaWxlZDogQm9vdCBvcHRpb25zIDogMHgleFxuIiwKKwkJCQkJICBidWZbMV0pKTsKKwkJCXJldCA9IFFMQV9FUlJPUjsKKwkJCWdvdG8gZXhpdF9ib290X2luZm9fZnJlZTsKKwkJfQorCisJCS8qIGdldCBwcmltYXJ5IHZhbGlkIHRhcmdldCBpbmRleCAqLworCQlpZiAoYnVmWzJdICYgQklUXzcpCisJCQlkZGJfaW5kZXhbMF0gPSBidWZbMl0gJiAweDdmOworCisJCS8qIGdldCBzZWNvbmRhcnkgdmFsaWQgdGFyZ2V0IGluZGV4ICovCisJCWlmIChidWZbMTFdICYgQklUXzcpCisJCQlkZGJfaW5kZXhbMV0gPSBidWZbMTFdICYgMHg3ZjsKKwl9IGVsc2UgeworCQlyZXQgPSBRTEFfRVJST1I7CisJCWdvdG8gZXhpdF9ib290X2luZm87CisJfQorCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBQcmltYXJ5IHRhcmdldCBJRCAlZCwgU2Vjb25kYXJ5IgorCQkJICAiIHRhcmdldCBJRCAlZFxuIiwgX19mdW5jX18sIGRkYl9pbmRleFswXSwKKwkJCSAgZGRiX2luZGV4WzFdKSk7CisKK2V4aXRfYm9vdF9pbmZvX2ZyZWU6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemUsIGJ1ZiwgYnVmX2RtYSk7CitleGl0X2Jvb3RfaW5mbzoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHFsYTR4eHhfZ2V0X2JpZGlfY2hhcCAtIEdldCBhIEJJREkgQ0hBUCB1c2VyIGFuZCBwYXNzd29yZAorICogQGhhOiBwb2ludGVyIHRvIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAdXNlcm5hbWU6IENIQVAgdXNlcm5hbWUgdG8gYmUgcmV0dXJuZWQKKyAqIEBwYXNzd29yZDogQ0hBUCBwYXNzd29yZCB0byBiZSByZXR1cm5lZAorICoKKyAqIElmIGEgYm9vdCBlbnRyeSBoYXMgQklESSBDSEFQIGVuYWJsZWQgdGhlbiB3ZSBuZWVkIHRvIHNldCB0aGUgQklESSBDSEFQCisgKiB1c2VyIGFuZCBwYXNzd29yZCBpbiB0aGUgc3lzZnMgZW50cnkgaW4gL3N5cy9maXJtd2FyZS9pc2NzaV9ib290Iy8uCisgKiBTbyBmcm9tIHRoZSBDSEFQIGNhY2hlIGZpbmQgdGhlIGZpcnN0IEJJREkgQ0hBUCBlbnRyeSBhbmQgc2V0IGl0CisgKiB0byB0aGUgYm9vdCByZWNvcmQgaW4gc3lzZnMuCisgKiovCitzdGF0aWMgaW50IHFsYTR4eHhfZ2V0X2JpZGlfY2hhcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGNoYXIgKnVzZXJuYW1lLAorCQkJICAgIGNoYXIgKnBhc3N3b3JkKQoreworCWludCBpLCByZXQgPSAtRUlOVkFMOworCWludCBtYXhfY2hhcF9lbnRyaWVzID0gMDsKKwlzdHJ1Y3QgcWw0X2NoYXBfdGFibGUgKmNoYXBfdGFibGU7CisKKwlpZiAoaXNfcWxhODAyMihoYSkpCisJCW1heF9jaGFwX2VudHJpZXMgPSAoaGEtPmh3LmZsdF9jaGFwX3NpemUgLyAyKSAvCisJCQkJCQlzaXplb2Yoc3RydWN0IHFsNF9jaGFwX3RhYmxlKTsKKwllbHNlCisJCW1heF9jaGFwX2VudHJpZXMgPSBNQVhfQ0hBUF9FTlRSSUVTXzQwWFg7CisKKwlpZiAoIWhhLT5jaGFwX2xpc3QpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJEbyBub3QgaGF2ZSBDSEFQIHRhYmxlIGNhY2hlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltdXRleF9sb2NrKCZoYS0+Y2hhcF9zZW0pOworCWZvciAoaSA9IDA7IGkgPCBtYXhfY2hhcF9lbnRyaWVzOyBpKyspIHsKKwkJY2hhcF90YWJsZSA9IChzdHJ1Y3QgcWw0X2NoYXBfdGFibGUgKiloYS0+Y2hhcF9saXN0ICsgaTsKKwkJaWYgKGNoYXBfdGFibGUtPmNvb2tpZSAhPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNihDSEFQX1ZBTElEX0NPT0tJRSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNoYXBfdGFibGUtPmZsYWdzICYgQklUXzcpIC8qIGxvY2FsICovCisJCQljb250aW51ZTsKKworCQlpZiAoIShjaGFwX3RhYmxlLT5mbGFncyAmIEJJVF82KSkgLyogTm90IEJJREkgKi8KKwkJCWNvbnRpbnVlOworCisJCXN0cm5jcHkocGFzc3dvcmQsIGNoYXBfdGFibGUtPnNlY3JldCwgUUw0X0NIQVBfTUFYX1NFQ1JFVF9MRU4pOworCQlzdHJuY3B5KHVzZXJuYW1lLCBjaGFwX3RhYmxlLT5uYW1lLCBRTDRfQ0hBUF9NQVhfTkFNRV9MRU4pOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZoYS0+Y2hhcF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHFsYTR4eHhfZ2V0X2Jvb3RfdGFyZ2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkgICBzdHJ1Y3QgcWw0X2Jvb3Rfc2Vzc2lvbl9pbmZvICpib290X3Nlc3MsCisJCQkJICAgdWludDE2X3QgZGRiX2luZGV4KQoreworCXN0cnVjdCBxbDRfY29ubl9pbmZvICpib290X2Nvbm4gPSAmYm9vdF9zZXNzLT5jb25uX2xpc3RbMF07CisJc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5OworCWRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYTsKKwl1aW50MTZfdCBpZHg7CisJdWludDE2X3Qgb3B0aW9uczsKKwlpbnQgcmV0ID0gUUxBX1NVQ0NFU1M7CisKKwlmd19kZGJfZW50cnkgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKKwkJCQkJICAmZndfZGRiX2VudHJ5X2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19kZGJfZW50cnkpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJCSAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlci5cbiIsCisJCQkJICBfX2Z1bmNfXykpOworCQlyZXQgPSBRTEFfRVJST1I7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHFsYTR4eHhfYm9vdGRiX2J5X2luZGV4KGhhLCBmd19kZGJfZW50cnksCisJCQkJICAgZndfZGRiX2VudHJ5X2RtYSwgZGRiX2luZGV4KSkgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkJICAiJXM6IEZsYXNoIEREQiByZWFkIEZhaWxlZFxuIiwgX19mdW5jX18pKTsKKwkJcmV0ID0gUUxBX0VSUk9SOworCQlnb3RvIGV4aXRfYm9vdF90YXJnZXQ7CisJfQorCisJLyogVXBkYXRlIHRhcmdldCBuYW1lIGFuZCBJUCBmcm9tIEREQiAqLworCW1lbWNweShib290X3Nlc3MtPnRhcmdldF9uYW1lLCBmd19kZGJfZW50cnktPmlzY3NpX25hbWUsCisJICAgICAgIG1pbihzaXplb2YoYm9vdF9zZXNzLT50YXJnZXRfbmFtZSksCisJCSAgIHNpemVvZihmd19kZGJfZW50cnktPmlzY3NpX25hbWUpKSk7CisKKwlvcHRpb25zID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5vcHRpb25zKTsKKwlpZiAob3B0aW9ucyAmIEREQl9PUFRfSVBWNl9ERVZJQ0UpIHsKKwkJbWVtY3B5KCZib290X2Nvbm4tPmRlc3RfaXBhZGRyLmlwX2FkZHJlc3MsCisJCSAgICAgICAmZndfZGRiX2VudHJ5LT5pcF9hZGRyWzBdLCBJUHY2X0FERFJfTEVOKTsKKwl9IGVsc2UgeworCQlib290X2Nvbm4tPmRlc3RfaXBhZGRyLmlwX3R5cGUgPSAweDE7CisJCW1lbWNweSgmYm9vdF9jb25uLT5kZXN0X2lwYWRkci5pcF9hZGRyZXNzLAorCQkgICAgICAgJmZ3X2RkYl9lbnRyeS0+aXBfYWRkclswXSwgSVBfQUREUl9MRU4pOworCX0KKworCWJvb3RfY29ubi0+ZGVzdF9wb3J0ID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5wb3J0KTsKKworCS8qIHVwZGF0ZSBjaGFwIGluZm9ybWF0aW9uICovCisJaWR4ID0gX19sZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmNoYXBfdGJsX2lkeCk7CisKKwlpZiAoQklUXzcgJiBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX29wdGlvbnMpKQl7CisKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlNldHRpbmcgY2hhcFxuIikpOworCisJCXJldCA9IHFsYTR4eHhfZ2V0X2NoYXAoaGEsIChjaGFyICopJmJvb3RfY29ubi0+Y2hhcC4KKwkJCQkgICAgICAgdGFyZ2V0X2NoYXBfbmFtZSwKKwkJCQkgICAgICAgKGNoYXIgKikmYm9vdF9jb25uLT5jaGFwLnRhcmdldF9zZWNyZXQsCisJCQkJICAgICAgIGlkeCk7CisJCWlmIChyZXQpIHsKKwkJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiRmFpbGVkIHRvIHNldCBjaGFwXG4iKTsKKwkJCXJldCA9IFFMQV9FUlJPUjsKKwkJCWdvdG8gZXhpdF9ib290X3RhcmdldDsKKwkJfQorCisJCWJvb3RfY29ubi0+Y2hhcC50YXJnZXRfY2hhcF9uYW1lX2xlbmd0aCA9IFFMNF9DSEFQX01BWF9OQU1FX0xFTjsKKwkJYm9vdF9jb25uLT5jaGFwLnRhcmdldF9zZWNyZXRfbGVuZ3RoID0gUUw0X0NIQVBfTUFYX1NFQ1JFVF9MRU47CisJfQorCisJaWYgKEJJVF80ICYgbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9vcHRpb25zKSkgeworCisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJTZXR0aW5nIEJJREkgY2hhcFxuIikpOworCisJCXJldCA9IHFsYTR4eHhfZ2V0X2JpZGlfY2hhcChoYSwKKwkJCQkgICAgKGNoYXIgKikmYm9vdF9jb25uLT5jaGFwLmludHJfY2hhcF9uYW1lLAorCQkJCSAgICAoY2hhciAqKSZib290X2Nvbm4tPmNoYXAuaW50cl9zZWNyZXQpOworCisJCWlmIChyZXQpIHsKKwkJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiRmFpbGVkIHRvIHNldCBCSURJIGNoYXBcbiIpOworCQkJcmV0ID0gUUxBX0VSUk9SOworCQkJZ290byBleGl0X2Jvb3RfdGFyZ2V0OworCQl9CisKKwkJYm9vdF9jb25uLT5jaGFwLmludHJfY2hhcF9uYW1lX2xlbmd0aCA9IFFMNF9DSEFQX01BWF9OQU1FX0xFTjsKKwkJYm9vdF9jb25uLT5jaGFwLmludHJfc2VjcmV0X2xlbmd0aCA9IFFMNF9DSEFQX01BWF9TRUNSRVRfTEVOOworCX0KKworZXhpdF9ib290X3RhcmdldDoKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAorCQkJICBmd19kZGJfZW50cnksIGZ3X2RkYl9lbnRyeV9kbWEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWxhNHh4eF9nZXRfYm9vdF9pbmZvKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MTZfdCBkZGJfaW5kZXhbMl07CisJaW50IHJldCA9IFFMQV9FUlJPUjsKKwlpbnQgcnZhbDsKKworCW1lbXNldChkZGJfaW5kZXgsIDAsIHNpemVvZihkZGJfaW5kZXgpKTsKKwlkZGJfaW5kZXhbMF0gPSAweGZmZmY7CisJZGRiX2luZGV4WzFdID0gMHhmZmZmOworCXJldCA9IGdldF9md19ib290X2luZm8oaGEsIGRkYl9pbmRleCk7CisJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkJICAiJXM6IEZhaWxlZCB0byBzZXQgYm9vdCBpbmZvLlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZGRiX2luZGV4WzBdID09IDB4ZmZmZikKKwkJZ290byBzZWNfdGFyZ2V0OworCisJcnZhbCA9IHFsYTR4eHhfZ2V0X2Jvb3RfdGFyZ2V0KGhhLCAmKGhhLT5ib290X3RndC5ib290X3ByaV9zZXNzKSwKKwkJCQkgICAgICBkZGJfaW5kZXhbMF0pOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBGYWlsZWQgdG8gZ2V0ICIKKwkJCQkgICJwcmltYXJ5IHRhcmdldFxuIiwgX19mdW5jX18pKTsKKwl9IGVsc2UKKwkJcmV0ID0gUUxBX1NVQ0NFU1M7CisKK3NlY190YXJnZXQ6CisJaWYgKGRkYl9pbmRleFsxXSA9PSAweGZmZmYpCisJCWdvdG8gZXhpdF9nZXRfYm9vdF9pbmZvOworCisJcnZhbCA9IHFsYTR4eHhfZ2V0X2Jvb3RfdGFyZ2V0KGhhLCAmKGhhLT5ib290X3RndC5ib290X3NlY19zZXNzKSwKKwkJCQkgICAgICBkZGJfaW5kZXhbMV0pOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBGYWlsZWQgdG8gZ2V0ICIKKwkJCQkgICJzZWNvbmRhcnkgdGFyZ2V0XG4iLCBfX2Z1bmNfXykpOworCX0gZWxzZQorCQlyZXQgPSBRTEFfU1VDQ0VTUzsKKworZXhpdF9nZXRfYm9vdF9pbmZvOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWxhNHh4eF9zZXR1cF9ib290X2luZm8oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXN0cnVjdCBpc2NzaV9ib290X2tvYmogKmJvb3Rfa29iajsKKworCWlmIChxbGE0eHh4X2dldF9ib290X2luZm8oaGEpICE9IFFMQV9TVUNDRVNTKQorCQlyZXR1cm4gMDsKKworCWhhLT5ib290X2tzZXQgPSBpc2NzaV9ib290X2NyZWF0ZV9ob3N0X2tzZXQoaGEtPmhvc3QtPmhvc3Rfbm8pOworCWlmICghaGEtPmJvb3Rfa3NldCkKKwkJZ290byBrc2V0X2ZyZWU7CisKKwlpZiAoIXNjc2lfaG9zdF9nZXQoaGEtPmhvc3QpKQorCQlnb3RvIGtzZXRfZnJlZTsKKwlib290X2tvYmogPSBpc2NzaV9ib290X2NyZWF0ZV90YXJnZXQoaGEtPmJvb3Rfa3NldCwgMCwgaGEsCisJCQkJCSAgICAgcWxhNHh4eF9zaG93X2Jvb3RfdGd0X3ByaV9pbmZvLAorCQkJCQkgICAgIHFsYTR4eHhfdGd0X2dldF9hdHRyX3Zpc2liaWxpdHksCisJCQkJCSAgICAgcWxhNHh4eF9ib290X3JlbGVhc2UpOworCWlmICghYm9vdF9rb2JqKQorCQlnb3RvIHB1dF9ob3N0OworCisJaWYgKCFzY3NpX2hvc3RfZ2V0KGhhLT5ob3N0KSkKKwkJZ290byBrc2V0X2ZyZWU7CisJYm9vdF9rb2JqID0gaXNjc2lfYm9vdF9jcmVhdGVfdGFyZ2V0KGhhLT5ib290X2tzZXQsIDEsIGhhLAorCQkJCQkgICAgIHFsYTR4eHhfc2hvd19ib290X3RndF9zZWNfaW5mbywKKwkJCQkJICAgICBxbGE0eHh4X3RndF9nZXRfYXR0cl92aXNpYmlsaXR5LAorCQkJCQkgICAgIHFsYTR4eHhfYm9vdF9yZWxlYXNlKTsKKwlpZiAoIWJvb3Rfa29iaikKKwkJZ290byBwdXRfaG9zdDsKKworCWlmICghc2NzaV9ob3N0X2dldChoYS0+aG9zdCkpCisJCWdvdG8ga3NldF9mcmVlOworCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX2luaXRpYXRvcihoYS0+Ym9vdF9rc2V0LCAwLCBoYSwKKwkJCQkJICAgICAgIHFsYTR4eHhfc2hvd19ib290X2luaV9pbmZvLAorCQkJCQkgICAgICAgcWxhNHh4eF9pbmlfZ2V0X2F0dHJfdmlzaWJpbGl0eSwKKwkJCQkJICAgICAgIHFsYTR4eHhfYm9vdF9yZWxlYXNlKTsKKwlpZiAoIWJvb3Rfa29iaikKKwkJZ290byBwdXRfaG9zdDsKKworCWlmICghc2NzaV9ob3N0X2dldChoYS0+aG9zdCkpCisJCWdvdG8ga3NldF9mcmVlOworCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX2V0aGVybmV0KGhhLT5ib290X2tzZXQsIDAsIGhhLAorCQkJCQkgICAgICAgcWxhNHh4eF9zaG93X2Jvb3RfZXRoX2luZm8sCisJCQkJCSAgICAgICBxbGE0eHh4X2V0aF9nZXRfYXR0cl92aXNpYmlsaXR5LAorCQkJCQkgICAgICAgcWxhNHh4eF9ib290X3JlbGVhc2UpOworCWlmICghYm9vdF9rb2JqKQorCQlnb3RvIHB1dF9ob3N0OworCisJcmV0dXJuIDA7CisKK3B1dF9ob3N0OgorCXNjc2lfaG9zdF9wdXQoaGEtPmhvc3QpOwora3NldF9mcmVlOgorCWlzY3NpX2Jvb3RfZGVzdHJveV9rc2V0KGhhLT5ib290X2tzZXQpOworCXJldHVybiAtRU5PTUVNOworfQorCisKKy8qKgorICogcWxhNHh4eF9jcmVhdGUgY2hhcF9saXN0IC0gQ3JlYXRlIENIQVAgbGlzdCBmcm9tIEZMQVNICisgKiBAaGE6IHBvaW50ZXIgdG8gYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZWFkIGZsYXNoIGFuZCBtYWtlIGEgbGlzdCBvZiBDSEFQIGVudHJpZXMsIGR1cmluZyBsb2dpbiB3aGVuIGEgQ0hBUCBlbnRyeQorICogaXMgcmVjZWl2ZWQsIGl0IHdpbGwgYmUgY2hlY2tlZCBpbiB0aGlzIGxpc3QuIElmIGVudHJ5IGV4aXN0IHRoZW4gdGhlIENIQVAKKyAqIGVudHJ5IGluZGV4IGlzIHNldCBpbiB0aGUgRERCLiBJZiBDSEFQIGVudHJ5IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgbGlzdAorICogdGhlbiBhIG5ldyBlbnRyeSBpcyBhZGRlZCBpbiBGTEFTSCBpbiBDSEFQIHRhYmxlIGFuZCB0aGUgaW5kZXggb2J0YWluZWQgaXMKKyAqIHVzZWQgaW4gdGhlIEREQi4KKyAqKi8KK3N0YXRpYyB2b2lkIHFsYTR4eHhfY3JlYXRlX2NoYXBfbGlzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaW50IHJ2YWwgPSAwOworCXVpbnQ4X3QgKmNoYXBfZmxhc2hfZGF0YSA9IE5VTEw7CisJdWludDMyX3Qgb2Zmc2V0OworCWRtYV9hZGRyX3QgY2hhcF9kbWE7CisJdWludDMyX3QgY2hhcF9zaXplID0gMDsKKworCWlmIChpc19xbGE0MFhYKGhhKSkKKwkJY2hhcF9zaXplID0gTUFYX0NIQVBfRU5UUklFU180MFhYICAqCisJCQkJCXNpemVvZihzdHJ1Y3QgcWw0X2NoYXBfdGFibGUpOworCWVsc2UJLyogU2luZ2xlIHJlZ2lvbiBjb250YWlucyBDSEFQIGluZm8gZm9yIGJvdGgKKwkJICogcG9ydHMgd2hpY2ggaXMgZGl2aWRlZCBpbnRvIGhhbGYgZm9yIGVhY2ggcG9ydC4KKwkJICovCisJCWNoYXBfc2l6ZSA9IGhhLT5ody5mbHRfY2hhcF9zaXplIC8gMjsKKworCWNoYXBfZmxhc2hfZGF0YSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgY2hhcF9zaXplLAorCQkJCQkgICZjaGFwX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFwX2ZsYXNoX2RhdGEpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJObyBtZW1vcnkgZm9yIGNoYXBfZmxhc2hfZGF0YVxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKGlzX3FsYTQwWFgoaGEpKQorCQlvZmZzZXQgPSBGTEFTSF9DSEFQX09GRlNFVDsKKwllbHNlIHsKKwkJb2Zmc2V0ID0gRkxBU0hfUkFXX0FDQ0VTU19BRERSICsgKGhhLT5ody5mbHRfcmVnaW9uX2NoYXAgPDwgMik7CisJCWlmIChoYS0+cG9ydF9udW0gPT0gMSkKKwkJCW9mZnNldCArPSBjaGFwX3NpemU7CisJfQorCisJcnZhbCA9IHFsYTR4eHhfZ2V0X2ZsYXNoKGhhLCBjaGFwX2RtYSwgb2Zmc2V0LCBjaGFwX3NpemUpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQlnb3RvIGV4aXRfY2hhcF9saXN0OworCisJaWYgKGhhLT5jaGFwX2xpc3QgPT0gTlVMTCkKKwkJaGEtPmNoYXBfbGlzdCA9IHZtYWxsb2MoY2hhcF9zaXplKTsKKwlpZiAoaGEtPmNoYXBfbGlzdCA9PSBOVUxMKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiTm8gbWVtb3J5IGZvciBoYS0+Y2hhcF9saXN0XG4iKTsKKwkJZ290byBleGl0X2NoYXBfbGlzdDsKKwl9CisKKwltZW1jcHkoaGEtPmNoYXBfbGlzdCwgY2hhcF9mbGFzaF9kYXRhLCBjaGFwX3NpemUpOworCitleGl0X2NoYXBfbGlzdDoKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgY2hhcF9zaXplLAorCQkJY2hhcF9mbGFzaF9kYXRhLCBjaGFwX2RtYSk7CisJcmV0dXJuOworfQorCiAvKioKICAqIHFsYTR4eHhfcHJvYmVfYWRhcHRlciAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2JlIEhCQQogICogQHBkZXY6IHBvaW50ZXIgdG8gcGNpX2RldiBzdHJ1Y3R1cmUKQEAgLTE2MjQsNyArMzIwMCw3IEBACiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQogCQlyZXR1cm4gLTE7CiAKLQlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZxbGE0eHh4X2RyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKCpoYSkpOworCWhvc3QgPSBpc2NzaV9ob3N0X2FsbG9jKCZxbGE0eHh4X2RyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKCpoYSksIDApOwogCWlmIChob3N0ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgInFsYTR4eHg6IENvdWxkbid0IGFsbG9jYXRlIGhvc3QgZnJvbSBzY3NpIGxheWVyIVxuIik7CkBAIC0xNjMyLDcgKzMyMDgsNyBAQAogCX0KIAogCS8qIENsZWFyIG91ciBkYXRhIGFyZWEgKi8KLQloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKSBob3N0LT5ob3N0ZGF0YTsKKwloYSA9IHRvX3FsYV9ob3N0KGhvc3QpOwogCW1lbXNldChoYSwgMCwgc2l6ZW9mKCpoYSkpOwogCiAJLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24gZnJvbSBQQ0kgQklPUy4JKi8KQEAgLTE2NzUsMTEgKzMyNTEsMTIgQEAKIAlxbGE0eHh4X2NvbmZpZ19kbWFfYWRkcmVzc2luZyhoYSk7CiAKIAkvKiBJbml0aWFsaXplIGxpc3RzIGFuZCBzcGlubG9ja3MuICovCi0JSU5JVF9MSVNUX0hFQUQoJmhhLT5kZGJfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmhhLT5mcmVlX3NyYl9xKTsKIAogCW11dGV4X2luaXQoJmhhLT5tYm94X3NlbSk7CisJbXV0ZXhfaW5pdCgmaGEtPmNoYXBfc2VtKTsKIAlpbml0X2NvbXBsZXRpb24oJmhhLT5tYnhfaW50cl9jb21wKTsKKwlpbml0X2NvbXBsZXRpb24oJmhhLT5kaXNhYmxlX2FjYl9jb21wKTsKIAogCXNwaW5fbG9ja19pbml0KCZoYS0+aGFyZHdhcmVfbG9jayk7CiAKQEAgLTE2OTIsNiArMzI2OSwyNyBAQAogCQlnb3RvIHByb2JlX2ZhaWxlZDsKIAl9CiAKKwlob3N0LT5jbWRfcGVyX2x1biA9IDM7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCWhvc3QtPm1heF9sdW4gPSBNQVhfTFVOUyAtIDE7CisJaG9zdC0+bWF4X2lkID0gTUFYX1RBUkdFVFM7CisJaG9zdC0+bWF4X2NtZF9sZW4gPSBJT0NCX01BWF9DREJfTEVOOworCWhvc3QtPmNhbl9xdWV1ZSA9IE1BWF9TUkJTIDsKKwlob3N0LT50cmFuc3BvcnR0ID0gcWxhNHh4eF9zY3NpX3RyYW5zcG9ydDsKKworCXJldCA9IHNjc2lfaW5pdF9zaGFyZWRfdGFnX21hcChob3N0LCBNQVhfU1JCUyk7CisJaWYgKHJldCkgeworCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAiJXM6IHNjc2lfaW5pdF9zaGFyZWRfdGFnX21hcCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBwcm9iZV9mYWlsZWQ7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhhKTsKKworCXJldCA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKHJldCkKKwkJZ290byBwcm9iZV9mYWlsZWQ7CisKIAlpZiAoaXNfcWxhODAyMihoYSkpCiAJCSh2b2lkKSBxbGE0Xzh4eHhfZ2V0X2ZsYXNoX2luZm8oaGEpOwogCkBAIC0xNzAwLDcgKzMyOTgsNyBAQAogCSAqIGZpcm13YXJlCiAJICogTk9URTogaW50ZXJydXB0cyBlbmFibGVkIHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uCiAJICovCi0Jc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIFJFQlVJTERfRERCX0xJU1QpOworCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhKTsKIAl3aGlsZSAoKCF0ZXN0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpKSAmJgogCSAgICBpbml0X3JldHJ5X2NvdW50KysgPCBNQVhfSU5JVF9SRVRSSUVTKSB7CiAKQEAgLTE3MjEsNyArMzMxOSw3IEBACiAJCWlmIChoYS0+aXNwX29wcy0+cmVzZXRfY2hpcChoYSkgPT0gUUxBX0VSUk9SKQogCQkJY29udGludWU7CiAKLQkJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIFJFQlVJTERfRERCX0xJU1QpOworCQlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSk7CiAJfQogCiAJaWYgKCF0ZXN0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpKSB7CkBAIC0xNzM2LDI0ICszMzM0LDkgQEAKIAkJCXFsYTRfOHh4eF9pZGNfdW5sb2NrKGhhKTsKIAkJfQogCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwkJZ290byByZW1vdmVfaG9zdDsKIAl9CiAKLQlob3N0LT5jbWRfcGVyX2x1biA9IDM7Ci0JaG9zdC0+bWF4X2NoYW5uZWwgPSAwOwotCWhvc3QtPm1heF9sdW4gPSBNQVhfTFVOUyAtIDE7Ci0JaG9zdC0+bWF4X2lkID0gTUFYX1RBUkdFVFM7Ci0JaG9zdC0+bWF4X2NtZF9sZW4gPSBJT0NCX01BWF9DREJfTEVOOwotCWhvc3QtPmNhbl9xdWV1ZSA9IE1BWF9TUkJTIDsKLQlob3N0LT50cmFuc3BvcnR0ID0gcWxhNHh4eF9zY3NpX3RyYW5zcG9ydDsKLQotICAgICAgICByZXQgPSBzY3NpX2luaXRfc2hhcmVkX3RhZ19tYXAoaG9zdCwgTUFYX1NSQlMpOwotICAgICAgICBpZiAocmV0KSB7Ci0JCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJzY3NpX2luaXRfc2hhcmVkX3RhZ19tYXAgZmFpbGVkXG4iKTsKLQkJZ290byBwcm9iZV9mYWlsZWQ7Ci0gICAgICAgIH0KLQogCS8qIFN0YXJ0dXAgdGhlIGtlcm5lbCB0aHJlYWQgZm9yIHRoaXMgaG9zdCBhZGFwdGVyLiAqLwogCURFQlVHMihwcmludGsoInNjc2k6ICVzOiBTdGFydGluZyBrZXJuZWwgdGhyZWFkIGZvciAiCiAJCSAgICAgICJxbGE0eHh4X2RwY1xuIiwgX19mdW5jX18pKTsKQEAgLTE3NjIsMTAgKzMzNDUsMTggQEAKIAlpZiAoIWhhLT5kcGNfdGhyZWFkKSB7CiAJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlVuYWJsZSB0byBzdGFydCBEUEMgdGhyZWFkIVxuIik7CiAJCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gcHJvYmVfZmFpbGVkOworCQlnb3RvIHJlbW92ZV9ob3N0OwogCX0KIAlJTklUX1dPUksoJmhhLT5kcGNfd29yaywgcWxhNHh4eF9kb19kcGMpOwogCisJc3ByaW50ZihidWYsICJxbGE0eHh4XyVsdV90YXNrIiwgaGEtPmhvc3Rfbm8pOworCWhhLT50YXNrX3dxID0gYWxsb2Nfd29ya3F1ZXVlKGJ1ZiwgV1FfTUVNX1JFQ0xBSU0sIDEpOworCWlmICghaGEtPnRhc2tfd3EpIHsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiVW5hYmxlIHRvIHN0YXJ0IHRhc2sgdGhyZWFkIVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcmVtb3ZlX2hvc3Q7CisJfQorCiAJLyogRm9yIElTUC04MlhYLCByZXF1ZXN0X2lycXMgaXMgY2FsbGVkIGluIHFsYTRfOHh4eF9sb2FkX3Jpc2MKIAkgKiAod2hpY2ggaXMgY2FsbGVkIGluZGlyZWN0bHkgYnkgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIpLAogCSAqIHNvIHRoYXQgaXJxcyB3aWxsIGJlIHJlZ2lzdGVyZWQgYWZ0ZXIgY3JiaW5pdCBidXQgYmVmb3JlCkBAIC0xNzc2LDcgKzMzNjcsNyBAQAogCQlpZiAocmV0KSB7CiAJCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJGYWlsZWQgdG8gcmVzZXJ2ZSAiCiAJCQkgICAgImludGVycnVwdCAlZCBhbHJlYWR5IGluIHVzZS5cbiIsIHBkZXYtPmlycSk7Ci0JCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwkJCWdvdG8gcmVtb3ZlX2hvc3Q7CiAJCX0KIAl9CiAKQEAgLTE3ODgsMjEgKzMzNzksMjUgQEAKIAogCXNldF9iaXQoQUZfSU5JVF9ET05FLCAmaGEtPmZsYWdzKTsKIAotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBoYSk7Ci0KLQlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZwZGV2LT5kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gcHJvYmVfZmFpbGVkOwotCiAJcHJpbnRrKEtFUk5fSU5GTwogCSAgICAgICAiIFFMb2dpYyBpU0NTSSBIQkEgRHJpdmVyIHZlcnNpb246ICVzXG4iCiAJICAgICAgICIgIFFMb2dpYyBJU1AlMDR4IEAgJXMsIGhvc3QjPSVsZCwgZnc9JTAyZC4lMDJkLiUwMmQuJTAyZFxuIiwKIAkgICAgICAgcWxhNHh4eF92ZXJzaW9uX3N0ciwgaGEtPnBkZXYtPmRldmljZSwgcGNpX25hbWUoaGEtPnBkZXYpLAogCSAgICAgICBoYS0+aG9zdF9ubywgaGEtPmZpcm13YXJlX3ZlcnNpb25bMF0sIGhhLT5maXJtd2FyZV92ZXJzaW9uWzFdLAogCSAgICAgICBoYS0+cGF0Y2hfbnVtYmVyLCBoYS0+YnVpbGRfbnVtYmVyKTsKLQlzY3NpX3NjYW5faG9zdChob3N0KTsKKworCXFsYTR4eHhfY3JlYXRlX2NoYXBfbGlzdChoYSk7CisKKwlpZiAocWxhNHh4eF9zZXR1cF9ib290X2luZm8oaGEpKQorCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOklTQ1NJIGJvb3QgaW5mbyBzZXR1cCBmYWlsZWRcbiIsCisJCQkgICBfX2Z1bmNfXyk7CisKKwlxbGE0eHh4X2NyZWF0ZV9pZmFjZXMoaGEpOwogCXJldHVybiAwOwogCityZW1vdmVfaG9zdDoKKwlzY3NpX3JlbW92ZV9ob3N0KGhhLT5ob3N0KTsKKwogcHJvYmVfZmFpbGVkOgogCXFsYTR4eHhfZnJlZV9hZGFwdGVyKGhhKTsKIApAQCAtMTg2Nyw4ICszNDYyLDExIEBACiAJaWYgKCFpc19xbGE4MDIyKGhhKSkKIAkJcWxhNHh4eF9wcmV2ZW50X290aGVyX3BvcnRfcmVpbml0KGhhKTsKIAotCS8qIHJlbW92ZSBkZXZzIGZyb20gaXNjc2lfc2Vzc2lvbnMgdG8gc2NzaV9kZXZpY2VzICovCi0JcWxhNHh4eF9mcmVlX2RkYl9saXN0KGhhKTsKKwkvKiBkZXN0cm95IGlmYWNlIGZyb20gc3lzZnMgKi8KKwlxbGE0eHh4X2Rlc3Ryb3lfaWZhY2VzKGhhKTsKKworCWlmIChoYS0+Ym9vdF9rc2V0KQorCQlpc2NzaV9ib290X2Rlc3Ryb3lfa3NldChoYS0+Ym9vdF9rc2V0KTsKIAogCXNjc2lfcmVtb3ZlX2hvc3QoaGEtPmhvc3QpOwogCkBAIC0xOTA3LDEwICszNTA1LDE1IEBACiAKIHN0YXRpYyBpbnQgcWxhNHh4eF9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7Ci0Jc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzID0gc3RhcmdldF90b19zZXNzaW9uKHNkZXYtPnNkZXZfdGFyZ2V0KTsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGIgPSBzZXNzLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3M7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiOwogCWludCBxdWV1ZV9kZXB0aCA9IFFMNF9ERUZfUURFUFRIOwogCisJY2xzX3Nlc3MgPSBzdGFyZ2V0X3RvX3Nlc3Npb24oc2Rldi0+c2Rldl90YXJnZXQpOworCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKKwlkZGIgPSBzZXNzLT5kZF9kYXRhOworCiAJc2Rldi0+aG9zdGRhdGEgPSBkZGI7CiAJc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCA9IDE7CiAKQEAgLTIyNDgsNyArMzg1MSw3IEBACiAJaW50IHJldHVybl9zdGF0dXMgPSBGQUlMRUQ7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOwogCi0JaGEgPSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWhhID0gdG9fcWxhX2hvc3QoY21kLT5kZXZpY2UtPmhvc3QpOwogCiAJaWYgKHFsNHhkb250cmVzZXRoYmEpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IERvbid0IFJlc2V0IEhCQVxuIiwKQEAgLTIyODQsNiArMzg4NywxMTAgQEAKIAlyZXR1cm4gcmV0dXJuX3N0YXR1czsKIH0KIAorc3RhdGljIGludCBxbGE0eHh4X2NvbnRleHRfcmVzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisJc3RydWN0IGFkZHJfY3RybF9ibGtfZGVmICphY2IgPSBOVUxMOworCXVpbnQzMl90IGFjYl9sZW4gPSBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGtfZGVmKTsKKwlpbnQgcnZhbCA9IFFMQV9TVUNDRVNTOworCWRtYV9hZGRyX3QgYWNiX2RtYTsKKworCWFjYiA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBhZGRyX2N0cmxfYmxrX2RlZiksCisJCQkJICZhY2JfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjYikgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBVbmFibGUgdG8gYWxsb2MgYWNiXG4iLAorCQkJICAgX19mdW5jX18pOworCQlydmFsID0gLUVOT01FTTsKKwkJZ290byBleGl0X3BvcnRfcmVzZXQ7CisJfQorCisJbWVtc2V0KGFjYiwgMCwgYWNiX2xlbik7CisKKwlydmFsID0gcWxhNHh4eF9nZXRfYWNiKGhhLCBhY2JfZG1hLCBQUklNQVJJX0FDQiwgYWNiX2xlbik7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcnZhbCA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlX2FjYjsKKwl9CisKKwlydmFsID0gcWxhNHh4eF9kaXNhYmxlX2FjYihoYSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcnZhbCA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlX2FjYjsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmhhLT5kaXNhYmxlX2FjYl9jb21wLAorCQkJCSAgICBESVNBQkxFX0FDQl9UT1YgKiBIWik7CisKKwlydmFsID0gcWxhNHh4eF9zZXRfYWNiKGhhLCAmbWJveF9jbWRbMF0sICZtYm94X3N0c1swXSwgYWNiX2RtYSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcnZhbCA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlX2FjYjsKKwl9CisKK2V4aXRfZnJlZV9hY2I6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgYWRkcl9jdHJsX2Jsa19kZWYpLAorCQkJICBhY2IsIGFjYl9kbWEpOworZXhpdF9wb3J0X3Jlc2V0OgorCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlcyAlc1xuIiwgX19mdW5jX18sCisJCQkgIHJ2YWwgPT0gUUxBX1NVQ0NFU1MgPyAiU1VDQ0VFREVEIiA6ICJGQUlMRUQiKSk7CisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQgcWxhNHh4eF9ob3N0X3Jlc2V0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgcmVzZXRfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChzaG9zdCk7CisJaW50IHJ2YWwgPSBRTEFfU1VDQ0VTUzsKKworCWlmIChxbDR4ZG9udHJlc2V0aGJhKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogRG9uJ3QgUmVzZXQgSEJBXG4iLAorCQkJCSAgX19mdW5jX18pKTsKKwkJcnZhbCA9IC1FUEVSTTsKKwkJZ290byBleGl0X2hvc3RfcmVzZXQ7CisJfQorCisJcnZhbCA9IHFsYTR4eHhfd2FpdF9mb3JfaGJhX29ubGluZShoYSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBVbmFibGUgdG8gcmVzZXQgaG9zdCAiCisJCQkJICAiYWRhcHRlclxuIiwgX19mdW5jX18pKTsKKwkJcnZhbCA9IC1FSU87CisJCWdvdG8gZXhpdF9ob3N0X3Jlc2V0OworCX0KKworCWlmICh0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSkKKwkJZ290byByZWNvdmVyX2FkYXB0ZXI7CisKKwlzd2l0Y2ggKHJlc2V0X3R5cGUpIHsKKwljYXNlIFNDU0lfQURBUFRFUl9SRVNFVDoKKwkJc2V0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1NJX0ZJUk1XQVJFX1JFU0VUOgorCQlpZiAoIXRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQlpZiAoaXNfcWxhODAyMihoYSkpCisJCQkJLyogc2V0IGZpcm13YXJlIGNvbnRleHQgcmVzZXQgKi8KKwkJCQlzZXRfYml0KERQQ19SRVNFVF9IQV9GV19DT05URVhULAorCQkJCQkmaGEtPmRwY19mbGFncyk7CisJCQllbHNlIHsKKwkJCQlydmFsID0gcWxhNHh4eF9jb250ZXh0X3Jlc2V0KGhhKTsKKwkJCQlnb3RvIGV4aXRfaG9zdF9yZXNldDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKK3JlY292ZXJfYWRhcHRlcjoKKwlydmFsID0gcWxhNHh4eF9yZWNvdmVyX2FkYXB0ZXIoaGEpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogcmVjb3ZlciBhZGFwdGVyIGZhaWxcbiIsCisJCQkJICBfX2Z1bmNfXykpOworCQlydmFsID0gLUVJTzsKKwl9CisKK2V4aXRfaG9zdF9yZXNldDoKKwlyZXR1cm4gcnZhbDsKK30KKwogLyogUENJIEFFUiBkcml2ZXIgcmVjb3ZlcnMgZnJvbSBhbGwgY29ycmVjdGFibGUgZXJyb3JzIHcvbwogICogZHJpdmVyIGludGVydmVudGlvbi4gRm9yIHVuY29ycmVjdGFibGUgZXJyb3JzIFBDSSBBRVIKICAqIGRyaXZlciBjYWxscyB0aGUgZm9sbG93aW5nIGRldmljZSBkcml2ZXIncyBjYWxsYmFja3MKQEAgLTIzNjAsNyArNDA2Nyw4IEBACiAKIAlpZiAodGVzdF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKSkgewogCQljbGVhcl9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKTsKLQkJcWxhNHh4eF9tYXJrX2FsbF9kZXZpY2VzX21pc3NpbmcoaGEpOworCQljbGVhcl9iaXQoQUZfTElOS19VUCwgJmhhLT5mbGFncyk7CisJCWlzY3NpX2hvc3RfZm9yX2VhY2hfc2Vzc2lvbihoYS0+aG9zdCwgcWxhNHh4eF9mYWlsX3Nlc3Npb24pOwogCQlxbGE0eHh4X3Byb2Nlc3NfYWVuKGhhLCBGTFVTSF9EREJfQ0hBTkdFRF9BRU5TKTsKIAl9CiAKQEAgLTI0MDcsNyArNDExNSw3IEBACiAKIAkJcWxhNF84eHh4X2lkY191bmxvY2soaGEpOwogCQljbGVhcl9iaXQoQUZfRldfUkVDT1ZFUlksICZoYS0+ZmxhZ3MpOwotCQlydmFsID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIFBSRVNFUlZFX0REQl9MSVNUKTsKKwkJcnZhbCA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhKTsKIAkJcWxhNF84eHh4X2lkY19sb2NrKGhhKTsKIAogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewpAQCAtMjQ0Myw4ICs0MTUxLDcgQEAKIAkJaWYgKChxbGE0Xzh4eHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSkgPT0KIAkJICAgIFFMQTgyWFhfREVWX1JFQURZKSkgewogCQkJY2xlYXJfYml0KEFGX0ZXX1JFQ09WRVJZLCAmaGEtPmZsYWdzKTsKLQkJCXJ2YWwgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwKLQkJCSAgICBQUkVTRVJWRV9EREJfTElTVCk7CisJCQlydmFsID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEpOwogCQkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJCQlyZXQgPSBxbGE0eHh4X3JlcXVlc3RfaXJxcyhoYSk7CiAJCQkJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmgKaW5kZXggNjEwNDkyOC4uYzE1MzQ3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oCkBAIC01LDQgKzUsNCBAQAogICogU2VlIExJQ0VOU0UucWxhNHh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwogCi0jZGVmaW5lIFFMQTRYWFhfRFJJVkVSX1ZFUlNJT04JIjUuMDIuMDAtazciCisjZGVmaW5lIFFMQTRYWFhfRFJJVkVSX1ZFUlNJT04JIjUuMDIuMDAtazgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKaW5kZXggOTY4OWQ0MWMuLmU0MGRjMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYworKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKQEAgLTg4MCw3ICs4ODAsNyBAQAogCQljbWQtPmNvbnRyb2xfZmxhZ3MgfD0gQ0ZMQUdfV1JJVEU7CiAJZWxzZQogCQljbWQtPmNvbnRyb2xfZmxhZ3MgfD0gQ0ZMQUdfUkVBRDsKLQljbWQtPnRpbWVfb3V0ID0gMzA7CisJY21kLT50aW1lX291dCA9IENtbmQtPnJlcXVlc3QtPnRpbWVvdXQvSFo7CiAJbWVtY3B5KGNtZC0+Y2RiLCBDbW5kLT5jbW5kLCBDbW5kLT5jbWRfbGVuKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKaW5kZXggYTRiOWNkYi4uZGM2MTMxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCkBAIC0yOTMsOCArMjkzLDE2IEBACiAJCSAqIHNvIHRoYXQgd2UgY2FuIGRlYWwgd2l0aCBpdCB0aGVyZS4KIAkJICovCiAJCWlmIChzY21kLT5kZXZpY2UtPmV4cGVjdGluZ19jY191YSkgewotCQkJc2NtZC0+ZGV2aWNlLT5leHBlY3RpbmdfY2NfdWEgPSAwOwotCQkJcmV0dXJuIE5FRURTX1JFVFJZOworCQkJLyoKKwkJCSAqIEJlY2F1c2Ugc29tZSBkZXZpY2UgZG9lcyBub3QgcXVldWUgdW5pdAorCQkJICogYXR0ZW50aW9ucyBjb3JyZWN0bHksIHdlIGNhcmVmdWxseSBjaGVjaworCQkJICogYWRkaXRpb25hbCBzZW5zZSBjb2RlIGFuZCBxdWFsaWZpZXIgc28gYXMKKwkJCSAqIG5vdCB0byBzcXVhc2ggbWVkaWEgY2hhbmdlIHVuaXQgYXR0ZW50aW9uLgorCQkJICovCisJCQlpZiAoc3NoZHIuYXNjICE9IDB4MjggfHwgc3NoZHIuYXNjcSAhPSAweDAwKSB7CisJCQkJc2NtZC0+ZGV2aWNlLT5leHBlY3RpbmdfY2NfdWEgPSAwOworCQkJCXJldHVybiBORUVEU19SRVRSWTsKKwkJCX0KIAkJfQogCQkvKgogCQkgKiBpZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlY29taW5nIHJlYWR5LCB3ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCBmYzNmMTY4Li4wNmJjMjY1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xNjk4LDYgKzE2OTksMTUgQEAKIAogdm9pZCBzY3NpX2ZyZWVfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVdBUk5fT04ocS0+cXVldWVkYXRhKTsKKworCS8qIGNhdXNlIHNjc2lfcmVxdWVzdF9mbigpIHRvIGtpbGwgYWxsIG5vbi1maW5pc2hlZCByZXF1ZXN0cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlxLT5yZXF1ZXN0X2ZuKHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCiAJYmxrX2NsZWFudXBfcXVldWUocSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYl9kbWEuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYl9kbWEuYwppbmRleCBkY2QxMjg1Li4yYWMzZjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWJfZG1hLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliX2RtYS5jCkBAIC00LDYgKzQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX25ldGxpbmsuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX25ldGxpbmsuYwppbmRleCAyNmE4YTQ1Li40NGY3NmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3BtLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9wbS5jCmluZGV4IGQ4MmEwMjNhLi5kMzI5ZjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9wbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3BtLmMKQEAgLTYsNiArNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwppbmRleCA0NGU4Y2EzLi43MjI3M2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCkBAIC0zMjIsNiArMzIyLDcgQEAKIAlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9ERUwpOwogCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOwogCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZGV2KTsKKwlzY3NpX2ZyZWVfcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CiAJcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOwogb3V0OgogCWlmIChkaXNwbGF5X2ZhaWx1cmVfbXNnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKaW5kZXggZTBiZDNmNy4uMDRjMmEyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCkBAIC0yNDYsNiArMjQ2LDQzIEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihhY3RpdmVfbW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfc2hvc3RfYWN0aXZlX21vZGUsIE5VTEwpOwogCitzdGF0aWMgaW50IGNoZWNrX3Jlc2V0X3R5cGUoY2hhciAqc3RyKQoreworCWlmIChzdHJuY21wKHN0ciwgImFkYXB0ZXIiLCAxMCkgPT0gMCkKKwkJcmV0dXJuIFNDU0lfQURBUFRFUl9SRVNFVDsKKwllbHNlIGlmIChzdHJuY21wKHN0ciwgImZpcm13YXJlIiwgMTApID09IDApCisJCXJldHVybiBTQ1NJX0ZJUk1XQVJFX1JFU0VUOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9ob3N0X3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSBzaG9zdC0+aG9zdHQ7CisJaW50IHJldCA9IC1FSU5WQUw7CisJY2hhciBzdHJbMTBdOworCWludCB0eXBlOworCisJc3NjYW5mKGJ1ZiwgIiVzIiwgc3RyKTsKKwl0eXBlID0gY2hlY2tfcmVzZXRfdHlwZShzdHIpOworCisJaWYgKCF0eXBlKQorCQlnb3RvIGV4aXRfc3RvcmVfaG9zdF9yZXNldDsKKworCWlmIChzaHQtPmhvc3RfcmVzZXQpCisJCXJldCA9IHNodC0+aG9zdF9yZXNldChzaG9zdCwgdHlwZSk7CisKK2V4aXRfc3RvcmVfaG9zdF9yZXNldDoKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNvdW50OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihob3N0X3Jlc2V0LCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9ob3N0X3Jlc2V0KTsKKwogc2hvc3RfcmRfYXR0cih1bmlxdWVfaWQsICIldVxuIik7CiBzaG9zdF9yZF9hdHRyKGhvc3RfYnVzeSwgIiVodVxuIik7CiBzaG9zdF9yZF9hdHRyKGNtZF9wZXJfbHVuLCAiJWhkXG4iKTsKQEAgLTI3Miw2ICszMDksNyBAQAogCSZkZXZfYXR0cl9hY3RpdmVfbW9kZS5hdHRyLAogCSZkZXZfYXR0cl9wcm90X2NhcGFiaWxpdGllcy5hdHRyLAogCSZkZXZfYXR0cl9wcm90X2d1YXJkX3R5cGUuYXR0ciwKKwkmZGV2X2F0dHJfaG9zdF9yZXNldC5hdHRyLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9pZi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2lmLmMKaW5kZXggMDE3MmRlMS4uNjIwOTExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2lmLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2lmLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwppbmRleCAzZmQxNmQ3Li45NjAyOWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwpAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2JzZy1saWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KQEAgLTMxLDEwICszMyw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfaWYuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgotCi0jZGVmaW5lIElTQ1NJX1NFU1NJT05fQVRUUlMgMjMKLSNkZWZpbmUgSVNDU0lfQ09OTl9BVFRSUyAxMwotI2RlZmluZSBJU0NTSV9IT1NUX0FUVFJTIDQKKyNpbmNsdWRlIDxzY3NpL3Njc2lfYnNnX2lzY3NpLmg+CiAKICNkZWZpbmUgSVNDU0lfVFJBTlNQT1JUX1ZFUlNJT04gIjIuMC04NzAiCiAKQEAgLTc2LDE2ICs3NSwxNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKIAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpob3N0X2F0dHJzW0lTQ1NJX0hPU1RfQVRUUlMgKyAxXTsKIAlzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciBjb25uX2NvbnQ7Ci0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmNvbm5fYXR0cnNbSVNDU0lfQ09OTl9BVFRSUyArIDFdOwogCXN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyIHNlc3Npb25fY29udDsKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqc2Vzc2lvbl9hdHRyc1tJU0NTSV9TRVNTSU9OX0FUVFJTICsgMV07CiB9OwogCiBzdGF0aWMgYXRvbWljX3QgaXNjc2lfc2Vzc2lvbl9ucjsgLyogc3lzZnMgc2Vzc2lvbiBpZCBmb3IgbmV4dCBuZXcgc2Vzc2lvbiAqLwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICppc2NzaV9laF90aW1lcl93b3JrcTsKIAorc3RhdGljIERFRklORV9JREEoaXNjc2lfc2Vzc19pZGEpOwogLyoKICAqIGxpc3Qgb2YgcmVnaXN0ZXJlZCB0cmFuc3BvcnRzIGFuZCBsb2NrIHRoYXQgbXVzdAogICogYmUgaGVsZCB3aGlsZSBhY2Nlc3NpbmcgbGlzdC4gVGhlIGlzY3NpX3RyYW5zcG9ydF9sb2NrIG11c3QKQEAgLTI3MCw2ICsyNjcsMjkxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9sb29rdXBfZW5kcG9pbnQpOwogCisvKgorICogSW50ZXJmYWNlIHRvIGRpc3BsYXkgbmV0d29yayBwYXJhbSB0byBzeXNmcworICovCisKK3N0YXRpYyB2b2lkIGlzY3NpX2lmYWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UgPSBpc2NzaV9kZXZfdG9faWZhY2UoZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBpZmFjZS0+ZGV2LnBhcmVudDsKKworCWtmcmVlKGlmYWNlKTsKKwlwdXRfZGV2aWNlKHBhcmVudCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBjbGFzcyBpc2NzaV9pZmFjZV9jbGFzcyA9IHsKKwkubmFtZSA9ICJpc2NzaV9pZmFjZSIsCisJLmRldl9yZWxlYXNlID0gaXNjc2lfaWZhY2VfcmVsZWFzZSwKK307CisKKyNkZWZpbmUgSVNDU0lfSUZBQ0VfQVRUUihfcHJlZml4LCBfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCVwKK3N0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyXyMjX3ByZWZpeCMjXyMjX25hbWUgPQkJXAorCV9fQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCisKKy8qIGlmYWNlIGF0dHJzIHNob3cgKi8KKyNkZWZpbmUgaXNjc2lfaWZhY2VfYXR0cl9zaG93KHR5cGUsIG5hbWUsIHBhcmFtX3R5cGUsIHBhcmFtKQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfIyN0eXBlIyNfIyNuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJICAgICBjaGFyICpidWYpCQkJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlmYWNlID0gaXNjc2lfZGV2X3RvX2lmYWNlKGRldik7CQlcCisJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdCA9IGlmYWNlLT50cmFuc3BvcnQ7CQkJXAorCXJldHVybiB0LT5nZXRfaWZhY2VfcGFyYW0oaWZhY2UsIHBhcmFtX3R5cGUsIHBhcmFtLCBidWYpOwlcCit9CQkJCQkJCQkJXAorCisjZGVmaW5lIGlzY3NpX2lmYWNlX25ldF9hdHRyKHR5cGUsIG5hbWUsIHBhcmFtKQkJCQlcCisJaXNjc2lfaWZhY2VfYXR0cl9zaG93KHR5cGUsIG5hbWUsIElTQ1NJX05FVF9QQVJBTSwgcGFyYW0pCVwKK3N0YXRpYyBJU0NTSV9JRkFDRV9BVFRSKHR5cGUsIG5hbWUsIFNfSVJVR08sIHNob3dfIyN0eXBlIyNfIyNuYW1lLCBOVUxMKTsKKworLyogZ2VuZXJpYyByZWFkIG9ubHkgaXB2aTQgYXR0cmlidXRlICovCitpc2NzaV9pZmFjZV9uZXRfYXR0cihpcHY0X2lmYWNlLCBpcGFkZHJlc3MsIElTQ1NJX05FVF9QQVJBTV9JUFY0X0FERFIpOworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaXB2NF9pZmFjZSwgZ2F0ZXdheSwgSVNDU0lfTkVUX1BBUkFNX0lQVjRfR1cpOworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaXB2NF9pZmFjZSwgc3VibmV0LCBJU0NTSV9ORVRfUEFSQU1fSVBWNF9TVUJORVQpOworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaXB2NF9pZmFjZSwgYm9vdHByb3RvLCBJU0NTSV9ORVRfUEFSQU1fSVBWNF9CT09UUFJPVE8pOworCisvKiBnZW5lcmljIHJlYWQgb25seSBpcHY2IGF0dHJpYnV0ZSAqLworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaXB2Nl9pZmFjZSwgaXBhZGRyZXNzLCBJU0NTSV9ORVRfUEFSQU1fSVBWNl9BRERSKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlwdjZfaWZhY2UsIGxpbmtfbG9jYWxfYWRkciwgSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlwdjZfaWZhY2UsIHJvdXRlcl9hZGRyLCBJU0NTSV9ORVRfUEFSQU1fSVBWNl9ST1VURVIpOworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaXB2Nl9pZmFjZSwgaXBhZGRyX2F1dG9jZmcsCisJCSAgICAgSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUl9BVVRPQ0ZHKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlwdjZfaWZhY2UsIGxpbmtfbG9jYWxfYXV0b2NmZywKKwkJICAgICBJU0NTSV9ORVRfUEFSQU1fSVBWNl9MSU5LTE9DQUxfQVVUT0NGRyk7CisKKy8qIGNvbW1vbiByZWFkIG9ubHkgaWZhY2UgYXR0cmlidXRlICovCitpc2NzaV9pZmFjZV9uZXRfYXR0cihpZmFjZSwgZW5hYmxlZCwgSVNDU0lfTkVUX1BBUkFNX0lGQUNFX0VOQUJMRSk7Citpc2NzaV9pZmFjZV9uZXRfYXR0cihpZmFjZSwgdmxhbl9pZCwgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fSUQpOworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaWZhY2UsIHZsYW5fcHJpb3JpdHksIElTQ1NJX05FVF9QQVJBTV9WTEFOX1BSSU9SSVRZKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlmYWNlLCB2bGFuX2VuYWJsZWQsIElTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQpOworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaWZhY2UsIG10dSwgSVNDU0lfTkVUX1BBUkFNX01UVSk7Citpc2NzaV9pZmFjZV9uZXRfYXR0cihpZmFjZSwgcG9ydCwgSVNDU0lfTkVUX1BBUkFNX1BPUlQpOworCitzdGF0aWMgbW9kZV90IGlzY3NpX2lmYWNlX2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgaSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZSA9IGlzY3NpX2Rldl90b19pZmFjZShkZXYpOworCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnQgPSBpZmFjZS0+dHJhbnNwb3J0OworCWludCBwYXJhbTsKKworCWlmIChhdHRyID09ICZkZXZfYXR0cl9pZmFjZV9lbmFibGVkLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX0lGQUNFX0VOQUJMRTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9pZmFjZV92bGFuX2lkLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX1ZMQU5fSUQ7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaWZhY2Vfdmxhbl9wcmlvcml0eS5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9WTEFOX1BSSU9SSVRZOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2lmYWNlX3ZsYW5fZW5hYmxlZC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQ7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaWZhY2VfbXR1LmF0dHIpCisJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX01UVTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9pZmFjZV9wb3J0LmF0dHIpCisJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX1BPUlQ7CisJZWxzZSBpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY0KSB7CisJCWlmIChhdHRyID09ICZkZXZfYXR0cl9pcHY0X2lmYWNlX2lwYWRkcmVzcy5hdHRyKQorCQkJcGFyYW0gPSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9BRERSOworCQllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9pcHY0X2lmYWNlX2dhdGV3YXkuYXR0cikKKwkJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX0lQVjRfR1c7CisJCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2lwdjRfaWZhY2Vfc3VibmV0LmF0dHIpCisJCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9JUFY0X1NVQk5FVDsKKwkJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaXB2NF9pZmFjZV9ib290cHJvdG8uYXR0cikKKwkJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX0lQVjRfQk9PVFBST1RPOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGlmYWNlLT5pZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNikgeworCQlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaXB2Nl9pZmFjZV9pcGFkZHJlc3MuYXR0cikKKwkJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUjsKKwkJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaXB2Nl9pZmFjZV9saW5rX2xvY2FsX2FkZHIuYXR0cikKKwkJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMOworCQllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9pcHY2X2lmYWNlX3JvdXRlcl9hZGRyLmF0dHIpCisJCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9JUFY2X1JPVVRFUjsKKwkJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaXB2Nl9pZmFjZV9pcGFkZHJfYXV0b2NmZy5hdHRyKQorCQkJcGFyYW0gPSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9BRERSX0FVVE9DRkc7CisJCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2lwdjZfaWZhY2VfbGlua19sb2NhbF9hdXRvY2ZnLmF0dHIpCisJCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9JUFY2X0xJTktMT0NBTF9BVVRPQ0ZHOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlXQVJOX09OQ0UoMSwgIkludmFsaWQgaWZhY2UgYXR0ciIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gdC0+YXR0cl9pc192aXNpYmxlKElTQ1NJX05FVF9QQVJBTSwgcGFyYW0pOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXNjc2lfaWZhY2VfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfaWZhY2VfZW5hYmxlZC5hdHRyLAorCSZkZXZfYXR0cl9pZmFjZV92bGFuX2lkLmF0dHIsCisJJmRldl9hdHRyX2lmYWNlX3ZsYW5fcHJpb3JpdHkuYXR0ciwKKwkmZGV2X2F0dHJfaWZhY2Vfdmxhbl9lbmFibGVkLmF0dHIsCisJJmRldl9hdHRyX2lwdjRfaWZhY2VfaXBhZGRyZXNzLmF0dHIsCisJJmRldl9hdHRyX2lwdjRfaWZhY2VfZ2F0ZXdheS5hdHRyLAorCSZkZXZfYXR0cl9pcHY0X2lmYWNlX3N1Ym5ldC5hdHRyLAorCSZkZXZfYXR0cl9pcHY0X2lmYWNlX2Jvb3Rwcm90by5hdHRyLAorCSZkZXZfYXR0cl9pcHY2X2lmYWNlX2lwYWRkcmVzcy5hdHRyLAorCSZkZXZfYXR0cl9pcHY2X2lmYWNlX2xpbmtfbG9jYWxfYWRkci5hdHRyLAorCSZkZXZfYXR0cl9pcHY2X2lmYWNlX3JvdXRlcl9hZGRyLmF0dHIsCisJJmRldl9hdHRyX2lwdjZfaWZhY2VfaXBhZGRyX2F1dG9jZmcuYXR0ciwKKwkmZGV2X2F0dHJfaXB2Nl9pZmFjZV9saW5rX2xvY2FsX2F1dG9jZmcuYXR0ciwKKwkmZGV2X2F0dHJfaWZhY2VfbXR1LmF0dHIsCisJJmRldl9hdHRyX2lmYWNlX3BvcnQuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXNjc2lfaWZhY2VfZ3JvdXAgPSB7CisJLmF0dHJzID0gaXNjc2lfaWZhY2VfYXR0cnMsCisJLmlzX3Zpc2libGUgPSBpc2NzaV9pZmFjZV9hdHRyX2lzX3Zpc2libGUsCit9OworCitzdHJ1Y3QgaXNjc2lfaWZhY2UgKgoraXNjc2lfY3JlYXRlX2lmYWNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCSAgIHVpbnQzMl90IGlmYWNlX3R5cGUsIHVpbnQzMl90IGlmYWNlX251bSwgaW50IGRkX3NpemUpCit7CisJc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZTsKKwlpbnQgZXJyOworCisJaWZhY2UgPSBremFsbG9jKHNpemVvZigqaWZhY2UpICsgZGRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZmFjZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZmFjZS0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OworCWlmYWNlLT5pZmFjZV90eXBlID0gaWZhY2VfdHlwZTsKKwlpZmFjZS0+aWZhY2VfbnVtID0gaWZhY2VfbnVtOworCWlmYWNlLT5kZXYucmVsZWFzZSA9IGlzY3NpX2lmYWNlX3JlbGVhc2U7CisJaWZhY2UtPmRldi5jbGFzcyA9ICZpc2NzaV9pZmFjZV9jbGFzczsKKwkvKiBwYXJlbnQgcmVmZXJlbmNlIHJlbGVhc2VkIGluIGlzY3NpX2lmYWNlX3JlbGVhc2UgKi8KKwlpZmFjZS0+ZGV2LnBhcmVudCA9IGdldF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCWlmIChpZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNCkKKwkJZGV2X3NldF9uYW1lKCZpZmFjZS0+ZGV2LCAiaXB2NC1pZmFjZS0ldS0ldSIsIHNob3N0LT5ob3N0X25vLAorCQkJICAgICBpZmFjZV9udW0pOworCWVsc2UKKwkJZGV2X3NldF9uYW1lKCZpZmFjZS0+ZGV2LCAiaXB2Ni1pZmFjZS0ldS0ldSIsIHNob3N0LT5ob3N0X25vLAorCQkJICAgICBpZmFjZV9udW0pOworCisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZpZmFjZS0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfaWZhY2U7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlmYWNlLT5kZXYua29iaiwgJmlzY3NpX2lmYWNlX2dyb3VwKTsKKwlpZiAoZXJyKQorCQlnb3RvIHVucmVnX2lmYWNlOworCisJaWYgKGRkX3NpemUpCisJCWlmYWNlLT5kZF9kYXRhID0gJmlmYWNlWzFdOworCXJldHVybiBpZmFjZTsKKwordW5yZWdfaWZhY2U6CisJZGV2aWNlX3VucmVnaXN0ZXIoJmlmYWNlLT5kZXYpOworCXJldHVybiBOVUxMOworCitmcmVlX2lmYWNlOgorCXB1dF9kZXZpY2UoaWZhY2UtPmRldi5wYXJlbnQpOworCWtmcmVlKGlmYWNlKTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2NyZWF0ZV9pZmFjZSk7CisKK3ZvaWQgaXNjc2lfZGVzdHJveV9pZmFjZShzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlmYWNlKQoreworCXN5c2ZzX3JlbW92ZV9ncm91cCgmaWZhY2UtPmRldi5rb2JqLCAmaXNjc2lfaWZhY2VfZ3JvdXApOworCWRldmljZV91bnJlZ2lzdGVyKCZpZmFjZS0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Rlc3Ryb3lfaWZhY2UpOworCisvKgorICogQlNHIHN1cHBvcnQKKyAqLworLyoqCisgKiBpc2NzaV9ic2dfaG9zdF9kaXNwYXRjaCAtIERpc3BhdGNoIGNvbW1hbmQgdG8gTExELgorICogQGpvYjogYnNnIGpvYiB0byBiZSBwcm9jZXNzZWQKKyAqLworc3RhdGljIGludCBpc2NzaV9ic2dfaG9zdF9kaXNwYXRjaChzdHJ1Y3QgYnNnX2pvYiAqam9iKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfam9iX3RvX3Nob3N0KGpvYik7CisJc3RydWN0IGlzY3NpX2JzZ19yZXF1ZXN0ICpyZXEgPSBqb2ItPnJlcXVlc3Q7CisJc3RydWN0IGlzY3NpX2JzZ19yZXBseSAqcmVwbHkgPSBqb2ItPnJlcGx5OworCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaSA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKwlpbnQgY21kbGVuID0gc2l6ZW9mKHVpbnQzMl90KTsJLyogc3RhcnQgd2l0aCBsZW5ndGggb2YgbXNnY29kZSAqLworCWludCByZXQ7CisKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIHRoZSBtc2djb2RlIHZhbHVlIGF0IGxlYXN0ICovCisJaWYgKGpvYi0+cmVxdWVzdF9sZW4gPCBzaXplb2YodWludDMyX3QpKSB7CisJCXJldCA9IC1FTk9NU0c7CisJCWdvdG8gZmFpbF9ob3N0X21zZzsKKwl9CisKKwkvKiBWYWxpZGF0ZSB0aGUgaG9zdCBjb21tYW5kICovCisJc3dpdGNoIChyZXEtPm1zZ2NvZGUpIHsKKwljYXNlIElTQ1NJX0JTR19IU1RfVkVORE9SOgorCQljbWRsZW4gKz0gc2l6ZW9mKHN0cnVjdCBpc2NzaV9ic2dfaG9zdF92ZW5kb3IpOworCQlpZiAoKHNob3N0LT5ob3N0dC0+dmVuZG9yX2lkID09IDBMKSB8fAorCQkgICAgKHJlcS0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9pZCAhPQorCQkJc2hvc3QtPmhvc3R0LT52ZW5kb3JfaWQpKSB7CisJCQlyZXQgPSAtRVNSQ0g7CisJCQlnb3RvIGZhaWxfaG9zdF9tc2c7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVCQURSOworCQlnb3RvIGZhaWxfaG9zdF9tc2c7CisJfQorCisJLyogY2hlY2sgaWYgd2UgcmVhbGx5IGhhdmUgYWxsIHRoZSByZXF1ZXN0IGRhdGEgbmVlZGVkICovCisJaWYgKGpvYi0+cmVxdWVzdF9sZW4gPCBjbWRsZW4pIHsKKwkJcmV0ID0gLUVOT01TRzsKKwkJZ290byBmYWlsX2hvc3RfbXNnOworCX0KKworCXJldCA9IGktPmlzY3NpX3RyYW5zcG9ydC0+YnNnX3JlcXVlc3Qoam9iKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisKK2ZhaWxfaG9zdF9tc2c6CisJLyogcmV0dXJuIHRoZSBlcnJubyBmYWlsdXJlIGNvZGUgYXMgdGhlIG9ubHkgc3RhdHVzICovCisJQlVHX09OKGpvYi0+cmVwbHlfbGVuIDwgc2l6ZW9mKHVpbnQzMl90KSk7CisJcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CisJcmVwbHktPnJlc3VsdCA9IHJldDsKKwlqb2ItPnJlcGx5X2xlbiA9IHNpemVvZih1aW50MzJfdCk7CisJYnNnX2pvYl9kb25lKGpvYiwgcmV0LCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpc2NzaV9ic2dfaG9zdF9hZGQgLSBDcmVhdGUgYW5kIGFkZCB0aGUgYnNnIGhvb2tzIHRvIHJlY2VpdmUgcmVxdWVzdHMKKyAqIEBzaG9zdDogc2hvc3QgZm9yIGlzY3NpX2hvc3QKKyAqIEBpaG9zdDogaXNjc2lfY2xzX2hvc3QgYWRkaW5nIHRoZSBzdHJ1Y3R1cmVzIHRvCisgKi8KK3N0YXRpYyBpbnQKK2lzY3NpX2JzZ19ob3N0X2FkZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IGlzY3NpX2Nsc19ob3N0ICppaG9zdCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2hvc3QtPnNob3N0X2dlbmRldjsKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKmkgPSB0b19pc2NzaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CisJY2hhciBic2dfbmFtZVsyMF07CisJaW50IHJldDsKKworCWlmICghaS0+aXNjc2lfdHJhbnNwb3J0LT5ic2dfcmVxdWVzdCkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXNucHJpbnRmKGJzZ19uYW1lLCBzaXplb2YoYnNnX25hbWUpLCAiaXNjc2lfaG9zdCVkIiwgc2hvc3QtPmhvc3Rfbm8pOworCisJcSA9IF9fc2NzaV9hbGxvY19xdWV1ZShzaG9zdCwgYnNnX3JlcXVlc3RfZm4pOworCWlmICghcSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBic2dfc2V0dXBfcXVldWUoZGV2LCBxLCBic2dfbmFtZSwgaXNjc2lfYnNnX2hvc3RfZGlzcGF0Y2gsIDApOworCWlmIChyZXQpIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBzaG9zdCwgImJzZyBpbnRlcmZhY2UgZmFpbGVkIHRvICIKKwkJCSAgICAgImluaXRpYWxpemUgLSBubyByZXF1ZXN0IHF1ZXVlXG4iKTsKKwkJYmxrX2NsZWFudXBfcXVldWUocSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWhvc3QtPmJzZ19xID0gcTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBpc2NzaV9zZXR1cF9ob3N0KHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0Yywgc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBkZXZpY2UgKmNkZXYpCiB7CkBAIC0yNzksMTMgKzU2MSwzMCBAQAogCW1lbXNldChpaG9zdCwgMCwgc2l6ZW9mKCppaG9zdCkpOwogCWF0b21pY19zZXQoJmlob3N0LT5ucl9zY2FucywgMCk7CiAJbXV0ZXhfaW5pdCgmaWhvc3QtPm11dGV4KTsKKworCWlzY3NpX2JzZ19ob3N0X2FkZChzaG9zdCwgaWhvc3QpOworCS8qIGlnbm9yZSBhbnkgYnNnIGFkZCBlcnJvciAtIHdlIGp1c3QgY2FuJ3QgZG8gc2dpbyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNjc2lfcmVtb3ZlX2hvc3Qoc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgKnRjLAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2hvc3QgKmlob3N0ID0gc2hvc3QtPnNob3N0X2RhdGE7CisKKwlpZiAoaWhvc3QtPmJzZ19xKSB7CisJCWJzZ19yZW1vdmVfcXVldWUoaWhvc3QtPmJzZ19xKTsKKwkJYmxrX2NsZWFudXBfcXVldWUoaWhvc3QtPmJzZ19xKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhpc2NzaV9ob3N0X2NsYXNzLAogCQkJICAgICAgICJpc2NzaV9ob3N0IiwKIAkJCSAgICAgICBpc2NzaV9zZXR1cF9ob3N0LAotCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgaXNjc2lfcmVtb3ZlX2hvc3QsCiAJCQkgICAgICAgTlVMTCk7CiAKIHN0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhpc2NzaV9zZXNzaW9uX2NsYXNzLApAQCAtNDA0LDYgKzcwMywxOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfc2Vzc2lvbl9jaGtyZWFkeSk7CiAKK2ludCBpc2NzaV9pc19zZXNzaW9uX29ubGluZShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7CisJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NFU1NJT05fTE9HR0VEX0lOKQorCQlyZXQgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlc3Npb24tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfaXNfc2Vzc2lvbl9vbmxpbmUpOworCiBzdGF0aWMgdm9pZCBpc2NzaV9zZXNzaW9uX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlzY3NpX2Rldl90b19zZXNzaW9uKGRldik7CkBAIC02ODAsNiArOTkyLDcgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbik7CiAJc3RydWN0IGlzY3NpX2Nsc19ob3N0ICppaG9zdCA9IHNob3N0LT5zaG9zdF9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHRhcmdldF9pZDsKIAogCUlTQ1NJX0RCR19UUkFOU19TRVNTSU9OKHNlc3Npb24sICJVbmJpbmRpbmcgc2Vzc2lvblxuIik7CiAKQEAgLTY5MSwxMCArMTAwNCwxNSBAQAogCQltdXRleF91bmxvY2soJmlob3N0LT5tdXRleCk7CiAJCXJldHVybjsKIAl9CisKKwl0YXJnZXRfaWQgPSBzZXNzaW9uLT50YXJnZXRfaWQ7CiAJc2Vzc2lvbi0+dGFyZ2V0X2lkID0gSVNDU0lfTUFYX1RBUkdFVDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZpaG9zdC0+bXV0ZXgpOwogCisJaWYgKHNlc3Npb24tPmlkYV91c2VkKQorCQlpZGFfc2ltcGxlX3JlbW92ZSgmaXNjc2lfc2Vzc19pZGEsIHRhcmdldF9pZCk7CisKIAlzY3NpX3JlbW92ZV90YXJnZXQoJnNlc3Npb24tPmRldik7CiAJaXNjc2lfc2Vzc2lvbl9ldmVudChzZXNzaW9uLCBJU0NTSV9LRVZFTlRfVU5CSU5EX1NFU1NJT04pOwogCUlTQ1NJX0RCR19UUkFOU19TRVNTSU9OKHNlc3Npb24sICJDb21wbGV0ZWQgdGFyZ2V0IHJlbW92YWxcbiIpOwpAQCAtNzM1LDU5ICsxMDUzLDM2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9hbGxvY19zZXNzaW9uKTsKIAotc3RhdGljIGludCBpc2NzaV9nZXRfbmV4dF90YXJnZXRfaWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnIgPSAwOwotCi0JaWYgKCFpc2NzaV9pc19zZXNzaW9uX2RldihkZXYpKQotCQlyZXR1cm4gMDsKLQotCXNlc3Npb24gPSBpc2NzaV9kZXZfdG9fc2Vzc2lvbihkZXYpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCooKHVuc2lnbmVkIGludCAqKSBkYXRhKSA9PSBzZXNzaW9uLT50YXJnZXRfaWQpCi0JCWVyciA9IC1FRVhJU1Q7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBlcnI7Ci19Ci0KIGludCBpc2NzaV9hZGRfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24sIHVuc2lnbmVkIGludCB0YXJnZXRfaWQpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOwogCXN0cnVjdCBpc2NzaV9jbHNfaG9zdCAqaWhvc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgaWQgPSB0YXJnZXRfaWQ7CisJaW50IGlkID0gMDsKIAlpbnQgZXJyOwogCiAJaWhvc3QgPSBzaG9zdC0+c2hvc3RfZGF0YTsKIAlzZXNzaW9uLT5zaWQgPSBhdG9taWNfYWRkX3JldHVybigxLCAmaXNjc2lfc2Vzc2lvbl9ucik7CiAKLQlpZiAoaWQgPT0gSVNDU0lfTUFYX1RBUkdFVCkgewotCQlmb3IgKGlkID0gMDsgaWQgPCBJU0NTSV9NQVhfVEFSR0VUOyBpZCsrKSB7Ci0JCQllcnIgPSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJnNob3N0LT5zaG9zdF9nZW5kZXYsICZpZCwKLQkJCQkJCSAgICBpc2NzaV9nZXRfbmV4dF90YXJnZXRfaWQpOwotCQkJaWYgKCFlcnIpCi0JCQkJYnJlYWs7Ci0JCX0KKwlpZiAodGFyZ2V0X2lkID09IElTQ1NJX01BWF9UQVJHRVQpIHsKKwkJaWQgPSBpZGFfc2ltcGxlX2dldCgmaXNjc2lfc2Vzc19pZGEsIDAsIDAsIEdGUF9LRVJORUwpOwogCi0JCWlmIChpZCA9PSBJU0NTSV9NQVhfVEFSR0VUKSB7CisJCWlmIChpZCA8IDApIHsKIAkJCWlzY3NpX2Nsc19zZXNzaW9uX3ByaW50ayhLRVJOX0VSUiwgc2Vzc2lvbiwKLQkJCQkJCSAiVG9vIG1hbnkgaXNjc2kgdGFyZ2V0cy4gTWF4ICIKLQkJCQkJCSAibnVtYmVyIG9mIHRhcmdldHMgaXMgJWQuXG4iLAotCQkJCQkJIElTQ1NJX01BWF9UQVJHRVQgLSAxKTsKLQkJCWVyciA9IC1FT1ZFUkZMT1c7Ci0JCQlnb3RvIHJlbGVhc2VfaG9zdDsKKwkJCQkJIkZhaWx1cmUgaW4gVGFyZ2V0IElEIEFsbG9jYXRpb25cbiIpOworCQkJcmV0dXJuIGlkOwogCQl9Ci0JfQotCXNlc3Npb24tPnRhcmdldF9pZCA9IGlkOworCQlzZXNzaW9uLT50YXJnZXRfaWQgPSAodW5zaWduZWQgaW50KWlkOworCQlzZXNzaW9uLT5pZGFfdXNlZCA9IHRydWU7CisJfSBlbHNlCisJCXNlc3Npb24tPnRhcmdldF9pZCA9IHRhcmdldF9pZDsKIAogCWRldl9zZXRfbmFtZSgmc2Vzc2lvbi0+ZGV2LCAic2Vzc2lvbiV1Iiwgc2Vzc2lvbi0+c2lkKTsKIAllcnIgPSBkZXZpY2VfYWRkKCZzZXNzaW9uLT5kZXYpOwogCWlmIChlcnIpIHsKIAkJaXNjc2lfY2xzX3Nlc3Npb25fcHJpbnRrKEtFUk5fRVJSLCBzZXNzaW9uLAogCQkJCQkgImNvdWxkIG5vdCByZWdpc3RlciBzZXNzaW9uJ3MgZGV2XG4iKTsKLQkJZ290byByZWxlYXNlX2hvc3Q7CisJCWdvdG8gcmVsZWFzZV9pZGE7CiAJfQogCXRyYW5zcG9ydF9yZWdpc3Rlcl9kZXZpY2UoJnNlc3Npb24tPmRldik7CiAKQEAgLTc5OSw4ICsxMDk0LDEwIEBACiAJSVNDU0lfREJHX1RSQU5TX1NFU1NJT04oc2Vzc2lvbiwgIkNvbXBsZXRlZCBzZXNzaW9uIGFkZGluZ1xuIik7CiAJcmV0dXJuIDA7CiAKLXJlbGVhc2VfaG9zdDoKLQlzY3NpX2hvc3RfcHV0KHNob3N0KTsKK3JlbGVhc2VfaWRhOgorCWlmIChzZXNzaW9uLT5pZGFfdXNlZCkKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJmlzY3NpX3Nlc3NfaWRhLCBzZXNzaW9uLT50YXJnZXRfaWQpOworCiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2FkZF9zZXNzaW9uKTsKQEAgLTExNDQsNiArMTQ0MSw0MCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfY29ubl9lcnJvcl9ldmVudCk7CiAKK3ZvaWQgaXNjc2lfY29ubl9sb2dpbl9ldmVudChzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4sCisJCQkgICAgZW51bSBpc2NzaV9jb25uX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCBza19idWZmICAqc2tiOworCXN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2OworCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqcHJpdjsKKwlpbnQgbGVuID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpldikpOworCisJcHJpdiA9IGlzY3NpX2lmX3RyYW5zcG9ydF9sb29rdXAoY29ubi0+dHJhbnNwb3J0KTsKKwlpZiAoIXByaXYpCisJCXJldHVybjsKKworCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCWlmICghc2tiKSB7CisJCWlzY3NpX2Nsc19jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwgImdyYWNlZnVsbHkgaWdub3JlZCAiCisJCQkJICAgICAgImNvbm4gbG9naW4gKCVkKVxuIiwgc3RhdGUpOworCQlyZXR1cm47CisJfQorCisJbmxoID0gX19ubG1zZ19wdXQoc2tiLCAwLCAwLCAwLCAobGVuIC0gc2l6ZW9mKCpubGgpKSwgMCk7CisJZXYgPSBOTE1TR19EQVRBKG5saCk7CisJZXYtPnRyYW5zcG9ydF9oYW5kbGUgPSBpc2NzaV9oYW5kbGUoY29ubi0+dHJhbnNwb3J0KTsKKwlldi0+dHlwZSA9IElTQ1NJX0tFVkVOVF9DT05OX0xPR0lOX1NUQVRFOworCWV2LT5yLmNvbm5fbG9naW4uc3RhdGUgPSBzdGF0ZTsKKwlldi0+ci5jb25uX2xvZ2luLmNpZCA9IGNvbm4tPmNpZDsKKwlldi0+ci5jb25uX2xvZ2luLnNpZCA9IGlzY3NpX2Nvbm5fZ2V0X3NpZChjb25uKTsKKwlpc2NzaV9tdWx0aWNhc3Rfc2tiKHNrYiwgSVNDU0lfTkxfR1JQX0lTQ1NJRCwgR0ZQX0FUT01JQyk7CisKKwlpc2NzaV9jbHNfY29ubl9wcmludGsoS0VSTl9JTkZPLCBjb25uLCAiZGV0ZWN0ZWQgY29ubiBsb2dpbiAoJWQpXG4iLAorCQkJICAgICAgc3RhdGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfY29ubl9sb2dpbl9ldmVudCk7CisKIHN0YXRpYyBpbnQKIGlzY3NpX2lmX3NlbmRfcmVwbHkodWludDMyX3QgZ3JvdXAsIGludCBzZXEsIGludCB0eXBlLCBpbnQgZG9uZSwgaW50IG11bHRpLAogCQkgICAgdm9pZCAqcGF5bG9hZCwgaW50IHNpemUpCkBAIC0xNTU4LDYgKzE4ODksMjkgQEAKIH0KIAogc3RhdGljIGludAoraXNjc2lfc2V0X2lmYWNlX3BhcmFtcyhzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCSAgICAgICBzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldiwgdWludDMyX3QgbGVuKQoreworCWNoYXIgKmRhdGEgPSAoY2hhciAqKWV2ICsgc2l6ZW9mKCpldik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJaW50IGVycjsKKworCWlmICghdHJhbnNwb3J0LT5zZXRfaWZhY2VfcGFyYW0pCisJCXJldHVybiAtRU5PU1lTOworCisJc2hvc3QgPSBzY3NpX2hvc3RfbG9va3VwKGV2LT51LnNldF9pZmFjZV9wYXJhbXMuaG9zdF9ubyk7CisJaWYgKCFzaG9zdCkgeworCQlwcmludGsoS0VSTl9FUlIgInNldF9pZmFjZV9wYXJhbXMgY291bGQgbm90IGZpbmQgaG9zdCBubyAldVxuIiwKKwkJICAgICAgIGV2LT51LnNldF9pZmFjZV9wYXJhbXMuaG9zdF9ubyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWVyciA9IHRyYW5zcG9ydC0+c2V0X2lmYWNlX3BhcmFtKHNob3N0LCBkYXRhLCBsZW4pOworCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKIGlzY3NpX2lmX3JlY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB1aW50MzJfdCAqZ3JvdXApCiB7CiAJaW50IGVyciA9IDA7CkBAIC0xNjk2LDYgKzIwNTAsMTAgQEAKIAljYXNlIElTQ1NJX1VFVkVOVF9QQVRIX1VQREFURToKIAkJZXJyID0gaXNjc2lfc2V0X3BhdGgodHJhbnNwb3J0LCBldik7CiAJCWJyZWFrOworCWNhc2UgSVNDU0lfVUVWRU5UX1NFVF9JRkFDRV9QQVJBTVM6CisJCWVyciA9IGlzY3NpX3NldF9pZmFjZV9wYXJhbXModHJhbnNwb3J0LCBldiwKKwkJCQkJICAgICBubG1zZ19hdHRybGVuKG5saCwgc2l6ZW9mKCpldikpKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1NZUzsKIAkJYnJlYWs7CkBAIC0xODI0LDYgKzIxODIsNzAgQEAKIGlzY3NpX2Nvbm5fZXBfYXR0cihhZGRyZXNzLCBJU0NTSV9QQVJBTV9DT05OX0FERFJFU1MpOwogaXNjc2lfY29ubl9lcF9hdHRyKHBvcnQsIElTQ1NJX1BBUkFNX0NPTk5fUE9SVCk7CiAKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppc2NzaV9jb25uX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2Nvbm5fbWF4X3JlY3ZfZGxlbmd0aC5hdHRyLAorCSZkZXZfYXR0cl9jb25uX21heF94bWl0X2RsZW5ndGguYXR0ciwKKwkmZGV2X2F0dHJfY29ubl9oZWFkZXJfZGlnZXN0LmF0dHIsCisJJmRldl9hdHRyX2Nvbm5fZGF0YV9kaWdlc3QuYXR0ciwKKwkmZGV2X2F0dHJfY29ubl9pZm1hcmtlci5hdHRyLAorCSZkZXZfYXR0cl9jb25uX29mbWFya2VyLmF0dHIsCisJJmRldl9hdHRyX2Nvbm5fYWRkcmVzcy5hdHRyLAorCSZkZXZfYXR0cl9jb25uX3BvcnQuYXR0ciwKKwkmZGV2X2F0dHJfY29ubl9leHBfc3RhdHNuLmF0dHIsCisJJmRldl9hdHRyX2Nvbm5fcGVyc2lzdGVudF9hZGRyZXNzLmF0dHIsCisJJmRldl9hdHRyX2Nvbm5fcGVyc2lzdGVudF9wb3J0LmF0dHIsCisJJmRldl9hdHRyX2Nvbm5fcGluZ190bW8uYXR0ciwKKwkmZGV2X2F0dHJfY29ubl9yZWN2X3Rtby5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgbW9kZV90IGlzY3NpX2Nvbm5fYXR0cl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IGkpCit7CisJc3RydWN0IGRldmljZSAqY2RldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4gPSB0cmFuc3BvcnRfY2xhc3NfdG9fY29ubihjZGV2KTsKKwlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0ID0gY29ubi0+dHJhbnNwb3J0OworCWludCBwYXJhbTsKKworCWlmIChhdHRyID09ICZkZXZfYXR0cl9jb25uX21heF9yZWN2X2RsZW5ndGguYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9NQVhfUkVDVl9ETEVOR1RIOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5fbWF4X3htaXRfZGxlbmd0aC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX01BWF9YTUlUX0RMRU5HVEg7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfY29ubl9oZWFkZXJfZGlnZXN0LmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fSERSREdTVF9FTjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9jb25uX2RhdGFfZGlnZXN0LmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fREFUQURHU1RfRU47CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfY29ubl9pZm1hcmtlci5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0lGTUFSS0VSX0VOOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5fb2ZtYXJrZXIuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9PRk1BUktFUl9FTjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9jb25uX2FkZHJlc3MuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9DT05OX0FERFJFU1M7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfY29ubl9wb3J0LmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fQ09OTl9QT1JUOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5fZXhwX3N0YXRzbi5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0VYUF9TVEFUU047CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfY29ubl9wZXJzaXN0ZW50X2FkZHJlc3MuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX0FERFJFU1M7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfY29ubl9wZXJzaXN0ZW50X3BvcnQuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX1BPUlQ7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfY29ubl9waW5nX3Rtby5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX1BJTkdfVE1POworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5fcmVjdl90bW8uYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9SRUNWX1RNTzsKKwllbHNlIHsKKwkJV0FSTl9PTkNFKDEsICJJbnZhbGlkIGNvbm4gYXR0ciIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gdC0+YXR0cl9pc192aXNpYmxlKElTQ1NJX1BBUkFNLCBwYXJhbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlzY3NpX2Nvbm5fZ3JvdXAgPSB7CisJLmF0dHJzID0gaXNjc2lfY29ubl9hdHRycywKKwkuaXNfdmlzaWJsZSA9IGlzY3NpX2Nvbm5fYXR0cl9pc192aXNpYmxlLAorfTsKKwogLyoKICAqIGlTQ1NJIHNlc3Npb24gYXR0cnMKICAqLwpAQCAtMTg0NSw3ICsyMjY3LDYgQEAKIAlpc2NzaV9zZXNzaW9uX2F0dHJfc2hvdyhwYXJhbSwgcGVybSkJCQkJXAogc3RhdGljIElTQ1NJX0NMQVNTX0FUVFIoc2VzcywgZmllbGQsIFNfSVJVR08sIHNob3dfc2Vzc2lvbl9wYXJhbV8jI3BhcmFtLCBcCiAJCQlOVUxMKTsKLQogaXNjc2lfc2Vzc2lvbl9hdHRyKHRhcmdldG5hbWUsIElTQ1NJX1BBUkFNX1RBUkdFVF9OQU1FLCAwKTsKIGlzY3NpX3Nlc3Npb25fYXR0cihpbml0aWFsX3IydCwgSVNDU0lfUEFSQU1fSU5JVElBTF9SMlRfRU4sIDApOwogaXNjc2lfc2Vzc2lvbl9hdHRyKG1heF9vdXRzdGFuZGluZ19yMnQsIElTQ1NJX1BBUkFNX01BWF9SMlQsIDApOwpAQCAtMTkyMiw2ICsyMzQzLDEwMCBAQAogCQkJc3RvcmVfcHJpdl9zZXNzaW9uXyMjZmllbGQpCiBpc2NzaV9wcml2X3Nlc3Npb25fcndfYXR0cihyZWNvdmVyeV90bW8sICIlZCIpOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXNjc2lfc2Vzc2lvbl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9zZXNzX2luaXRpYWxfcjJ0LmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfbWF4X291dHN0YW5kaW5nX3IydC5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX2ltbWVkaWF0ZV9kYXRhLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfZmlyc3RfYnVyc3RfbGVuLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfbWF4X2J1cnN0X2xlbi5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX2RhdGFfcGR1X2luX29yZGVyLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfZGF0YV9zZXFfaW5fb3JkZXIuYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc19lcmwuYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc190YXJnZXRuYW1lLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfdHBndC5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX3Bhc3N3b3JkLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfcGFzc3dvcmRfaW4uYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc191c2VybmFtZS5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX3VzZXJuYW1lX2luLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfZmFzdF9hYm9ydC5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX2Fib3J0X3Rtby5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX2x1X3Jlc2V0X3Rtby5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX3RndF9yZXNldF90bW8uYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc19pZmFjZW5hbWUuYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc19pbml0aWF0b3JuYW1lLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfdGFyZ2V0YWxpYXMuYXR0ciwKKwkmZGV2X2F0dHJfcHJpdl9zZXNzX3JlY292ZXJ5X3Rtby5hdHRyLAorCSZkZXZfYXR0cl9wcml2X3Nlc3Nfc3RhdGUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIG1vZGVfdCBpc2NzaV9zZXNzaW9uX2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpKQoreworCXN0cnVjdCBkZXZpY2UgKmNkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nlc3Npb24oY2Rldik7CisJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdCA9IHNlc3Npb24tPnRyYW5zcG9ydDsKKwlpbnQgcGFyYW07CisKKwlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc19pbml0aWFsX3IydC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0lOSVRJQUxfUjJUX0VOOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfbWF4X291dHN0YW5kaW5nX3IydC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX01BWF9SMlQ7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc19pbW1lZGlhdGVfZGF0YS5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0lNTV9EQVRBX0VOOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfZmlyc3RfYnVyc3RfbGVuLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fRklSU1RfQlVSU1Q7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc19tYXhfYnVyc3RfbGVuLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fTUFYX0JVUlNUOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfZGF0YV9wZHVfaW5fb3JkZXIuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9QRFVfSU5PUkRFUl9FTjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX2RhdGFfc2VxX2luX29yZGVyLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fREFUQVNFUV9JTk9SREVSX0VOOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfZXJsLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fRVJMOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfdGFyZ2V0bmFtZS5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX1RBUkdFVF9OQU1FOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfdHBndC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX1RQR1Q7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc19wYXNzd29yZC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX1VTRVJOQU1FOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfcGFzc3dvcmRfaW4uYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9VU0VSTkFNRV9JTjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX3VzZXJuYW1lLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fUEFTU1dPUkQ7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc191c2VybmFtZV9pbi5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX1BBU1NXT1JEX0lOOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfZmFzdF9hYm9ydC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0ZBU1RfQUJPUlQ7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc19hYm9ydF90bW8uYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9BQk9SVF9UTU87CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc19sdV9yZXNldF90bW8uYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9MVV9SRVNFVF9UTU87CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc190Z3RfcmVzZXRfdG1vLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fVEdUX1JFU0VUX1RNTzsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX2lmYWNlbmFtZS5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0lGQUNFX05BTUU7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc19pbml0aWF0b3JuYW1lLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fSU5JVElBVE9SX05BTUU7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc190YXJnZXRhbGlhcy5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX1RBUkdFVF9BTElBUzsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9wcml2X3Nlc3NfcmVjb3ZlcnlfdG1vLmF0dHIpCisJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9wcml2X3Nlc3Nfc3RhdGUuYXR0cikKKwkJcmV0dXJuIFNfSVJVR087CisJZWxzZSB7CisJCVdBUk5fT05DRSgxLCAiSW52YWxpZCBzZXNzaW9uIGF0dHIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHQtPmF0dHJfaXNfdmlzaWJsZShJU0NTSV9QQVJBTSwgcGFyYW0pOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpc2NzaV9zZXNzaW9uX2dyb3VwID0geworCS5hdHRycyA9IGlzY3NpX3Nlc3Npb25fYXR0cnMsCisJLmlzX3Zpc2libGUgPSBpc2NzaV9zZXNzaW9uX2F0dHJfaXNfdmlzaWJsZSwKK307CisKIC8qCiAgKiBpU0NTSSBob3N0IGF0dHJzCiAgKi8KQEAgLTE5NDUsNDEgKzI0NjAsNDIgQEAKIGlzY3NpX2hvc3RfYXR0cihpcGFkZHJlc3MsIElTQ1NJX0hPU1RfUEFSQU1fSVBBRERSRVNTKTsKIGlzY3NpX2hvc3RfYXR0cihpbml0aWF0b3JuYW1lLCBJU0NTSV9IT1NUX1BBUkFNX0lOSVRJQVRPUl9OQU1FKTsKIAotI2RlZmluZSBTRVRVUF9QUklWX1NFU1NJT05fUkRfQVRUUihmaWVsZCkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlwcml2LT5zZXNzaW9uX2F0dHJzW2NvdW50XSA9ICZkZXZfYXR0cl9wcml2X3Nlc3NfIyNmaWVsZDsgXAotCWNvdW50Kys7CQkJCQkJCVwKLX0gd2hpbGUgKDApCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXNjc2lfaG9zdF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9ob3N0X25ldGRldi5hdHRyLAorCSZkZXZfYXR0cl9ob3N0X2h3YWRkcmVzcy5hdHRyLAorCSZkZXZfYXR0cl9ob3N0X2lwYWRkcmVzcy5hdHRyLAorCSZkZXZfYXR0cl9ob3N0X2luaXRpYXRvcm5hbWUuYXR0ciwKKwlOVUxMLAorfTsKIAotI2RlZmluZSBTRVRVUF9QUklWX1NFU1NJT05fUldfQVRUUihmaWVsZCkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlwcml2LT5zZXNzaW9uX2F0dHJzW2NvdW50XSA9ICZkZXZfYXR0cl9wcml2X3Nlc3NfIyNmaWVsZDsJXAotCWNvdW50Kys7CQkJCQkJCVwKLX0gd2hpbGUgKDApCitzdGF0aWMgbW9kZV90IGlzY3NpX2hvc3RfYXR0cl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IGkpCit7CisJc3RydWN0IGRldmljZSAqY2RldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXYgPSB0b19pc2NzaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJaW50IHBhcmFtOwogCi0jZGVmaW5lIFNFVFVQX1NFU1NJT05fUkRfQVRUUihmaWVsZCwgcGFyYW1fZmxhZykJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmICh0dC0+cGFyYW1fbWFzayAmIHBhcmFtX2ZsYWcpIHsJCQkJXAotCQlwcml2LT5zZXNzaW9uX2F0dHJzW2NvdW50XSA9ICZkZXZfYXR0cl9zZXNzXyMjZmllbGQ7IFwKLQkJY291bnQrKzsJCQkJCQlcCi0JfQkJCQkJCQkJXAotfSB3aGlsZSAoMCkKKwlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaG9zdF9uZXRkZXYuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9IT1NUX1BBUkFNX05FVERFVl9OQU1FOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2hvc3RfaHdhZGRyZXNzLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfSE9TVF9QQVJBTV9IV0FERFJFU1M7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaG9zdF9pcGFkZHJlc3MuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUzsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9ob3N0X2luaXRpYXRvcm5hbWUuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9IT1NUX1BBUkFNX0lOSVRJQVRPUl9OQU1FOworCWVsc2UgeworCQlXQVJOX09OQ0UoMSwgIkludmFsaWQgaG9zdCBhdHRyIik7CisJCXJldHVybiAwOworCX0KIAotI2RlZmluZSBTRVRVUF9DT05OX1JEX0FUVFIoZmllbGQsIHBhcmFtX2ZsYWcpCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKHR0LT5wYXJhbV9tYXNrICYgcGFyYW1fZmxhZykgewkJCQlcCi0JCXByaXYtPmNvbm5fYXR0cnNbY291bnRdID0gJmRldl9hdHRyX2Nvbm5fIyNmaWVsZDsgXAotCQljb3VudCsrOwkJCQkJCVwKLQl9CQkJCQkJCQlcCi19IHdoaWxlICgwKQorCXJldHVybiBwcml2LT5pc2NzaV90cmFuc3BvcnQtPmF0dHJfaXNfdmlzaWJsZShJU0NTSV9IT1NUX1BBUkFNLCBwYXJhbSk7Cit9CiAKLSNkZWZpbmUgU0VUVVBfSE9TVF9SRF9BVFRSKGZpZWxkLCBwYXJhbV9mbGFnKQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmICh0dC0+aG9zdF9wYXJhbV9tYXNrICYgcGFyYW1fZmxhZykgewkJCQlcCi0JCXByaXYtPmhvc3RfYXR0cnNbY291bnRdID0gJmRldl9hdHRyX2hvc3RfIyNmaWVsZDsgXAotCQljb3VudCsrOwkJCQkJCVwKLQl9CQkJCQkJCQlcCi19IHdoaWxlICgwKQorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXNjc2lfaG9zdF9ncm91cCA9IHsKKwkuYXR0cnMgPSBpc2NzaV9ob3N0X2F0dHJzLAorCS5pc192aXNpYmxlID0gaXNjc2lfaG9zdF9hdHRyX2lzX3Zpc2libGUsCit9OwogCiBzdGF0aWMgaW50IGlzY3NpX3Nlc3Npb25fbWF0Y2goc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0yMDUxLDcgKzI1NjcsNyBAQAogewogCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqcHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjb3VudCA9IDAsIGVycjsKKwlpbnQgZXJyOwogCiAJQlVHX09OKCF0dCk7CiAKQEAgLTIwNzgsNzcgKzI1OTQsMjQgQEAKIAkJZ290byB1bnJlZ2lzdGVyX2RldjsKIAogCS8qIGhvc3QgcGFyYW1ldGVycyAqLwotCXByaXYtPnQuaG9zdF9hdHRycy5hYy5hdHRycyA9ICZwcml2LT5ob3N0X2F0dHJzWzBdOwogCXByaXYtPnQuaG9zdF9hdHRycy5hYy5jbGFzcyA9ICZpc2NzaV9ob3N0X2NsYXNzLmNsYXNzOwogCXByaXYtPnQuaG9zdF9hdHRycy5hYy5tYXRjaCA9IGlzY3NpX2hvc3RfbWF0Y2g7CisJcHJpdi0+dC5ob3N0X2F0dHJzLmFjLmdycCA9ICZpc2NzaV9ob3N0X2dyb3VwOwogCXByaXYtPnQuaG9zdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpc2NzaV9jbHNfaG9zdCk7CiAJdHJhbnNwb3J0X2NvbnRhaW5lcl9yZWdpc3RlcigmcHJpdi0+dC5ob3N0X2F0dHJzKTsKIAotCVNFVFVQX0hPU1RfUkRfQVRUUihuZXRkZXYsIElTQ1NJX0hPU1RfTkVUREVWX05BTUUpOwotCVNFVFVQX0hPU1RfUkRfQVRUUihpcGFkZHJlc3MsIElTQ1NJX0hPU1RfSVBBRERSRVNTKTsKLQlTRVRVUF9IT1NUX1JEX0FUVFIoaHdhZGRyZXNzLCBJU0NTSV9IT1NUX0hXQUREUkVTUyk7Ci0JU0VUVVBfSE9TVF9SRF9BVFRSKGluaXRpYXRvcm5hbWUsIElTQ1NJX0hPU1RfSU5JVElBVE9SX05BTUUpOwotCUJVR19PTihjb3VudCA+IElTQ1NJX0hPU1RfQVRUUlMpOwotCXByaXYtPmhvc3RfYXR0cnNbY291bnRdID0gTlVMTDsKLQljb3VudCA9IDA7Ci0KIAkvKiBjb25uZWN0aW9uIHBhcmFtZXRlcnMgKi8KLQlwcml2LT5jb25uX2NvbnQuYWMuYXR0cnMgPSAmcHJpdi0+Y29ubl9hdHRyc1swXTsKIAlwcml2LT5jb25uX2NvbnQuYWMuY2xhc3MgPSAmaXNjc2lfY29ubmVjdGlvbl9jbGFzcy5jbGFzczsKIAlwcml2LT5jb25uX2NvbnQuYWMubWF0Y2ggPSBpc2NzaV9jb25uX21hdGNoOworCXByaXYtPmNvbm5fY29udC5hYy5ncnAgPSAmaXNjc2lfY29ubl9ncm91cDsKIAl0cmFuc3BvcnRfY29udGFpbmVyX3JlZ2lzdGVyKCZwcml2LT5jb25uX2NvbnQpOwogCi0JU0VUVVBfQ09OTl9SRF9BVFRSKG1heF9yZWN2X2RsZW5ndGgsIElTQ1NJX01BWF9SRUNWX0RMRU5HVEgpOwotCVNFVFVQX0NPTk5fUkRfQVRUUihtYXhfeG1pdF9kbGVuZ3RoLCBJU0NTSV9NQVhfWE1JVF9ETEVOR1RIKTsKLQlTRVRVUF9DT05OX1JEX0FUVFIoaGVhZGVyX2RpZ2VzdCwgSVNDU0lfSERSREdTVF9FTik7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKGRhdGFfZGlnZXN0LCBJU0NTSV9EQVRBREdTVF9FTik7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKGlmbWFya2VyLCBJU0NTSV9JRk1BUktFUl9FTik7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKG9mbWFya2VyLCBJU0NTSV9PRk1BUktFUl9FTik7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKGFkZHJlc3MsIElTQ1NJX0NPTk5fQUREUkVTUyk7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKHBvcnQsIElTQ1NJX0NPTk5fUE9SVCk7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKGV4cF9zdGF0c24sIElTQ1NJX0VYUF9TVEFUU04pOwotCVNFVFVQX0NPTk5fUkRfQVRUUihwZXJzaXN0ZW50X2FkZHJlc3MsIElTQ1NJX1BFUlNJU1RFTlRfQUREUkVTUyk7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKHBlcnNpc3RlbnRfcG9ydCwgSVNDU0lfUEVSU0lTVEVOVF9QT1JUKTsKLQlTRVRVUF9DT05OX1JEX0FUVFIocGluZ190bW8sIElTQ1NJX1BJTkdfVE1PKTsKLQlTRVRVUF9DT05OX1JEX0FUVFIocmVjdl90bW8sIElTQ1NJX1JFQ1ZfVE1PKTsKLQotCUJVR19PTihjb3VudCA+IElTQ1NJX0NPTk5fQVRUUlMpOwotCXByaXYtPmNvbm5fYXR0cnNbY291bnRdID0gTlVMTDsKLQljb3VudCA9IDA7Ci0KIAkvKiBzZXNzaW9uIHBhcmFtZXRlcnMgKi8KLQlwcml2LT5zZXNzaW9uX2NvbnQuYWMuYXR0cnMgPSAmcHJpdi0+c2Vzc2lvbl9hdHRyc1swXTsKIAlwcml2LT5zZXNzaW9uX2NvbnQuYWMuY2xhc3MgPSAmaXNjc2lfc2Vzc2lvbl9jbGFzcy5jbGFzczsKIAlwcml2LT5zZXNzaW9uX2NvbnQuYWMubWF0Y2ggPSBpc2NzaV9zZXNzaW9uX21hdGNoOworCXByaXYtPnNlc3Npb25fY29udC5hYy5ncnAgPSAmaXNjc2lfc2Vzc2lvbl9ncm91cDsKIAl0cmFuc3BvcnRfY29udGFpbmVyX3JlZ2lzdGVyKCZwcml2LT5zZXNzaW9uX2NvbnQpOwogCi0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGluaXRpYWxfcjJ0LCBJU0NTSV9JTklUSUFMX1IyVF9FTik7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKG1heF9vdXRzdGFuZGluZ19yMnQsIElTQ1NJX01BWF9SMlQpOwotCVNFVFVQX1NFU1NJT05fUkRfQVRUUihpbW1lZGlhdGVfZGF0YSwgSVNDU0lfSU1NX0RBVEFfRU4pOwotCVNFVFVQX1NFU1NJT05fUkRfQVRUUihmaXJzdF9idXJzdF9sZW4sIElTQ1NJX0ZJUlNUX0JVUlNUKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIobWF4X2J1cnN0X2xlbiwgSVNDU0lfTUFYX0JVUlNUKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZGF0YV9wZHVfaW5fb3JkZXIsIElTQ1NJX1BEVV9JTk9SREVSX0VOKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZGF0YV9zZXFfaW5fb3JkZXIsIElTQ1NJX0RBVEFTRVFfSU5PUkRFUl9FTik7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGVybCwgSVNDU0lfRVJMKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIodGFyZ2V0bmFtZSwgSVNDU0lfVEFSR0VUX05BTUUpOwotCVNFVFVQX1NFU1NJT05fUkRfQVRUUih0cGd0LCBJU0NTSV9UUEdUKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIocGFzc3dvcmQsIElTQ1NJX1VTRVJOQU1FKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIocGFzc3dvcmRfaW4sIElTQ1NJX1VTRVJOQU1FX0lOKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIodXNlcm5hbWUsIElTQ1NJX1BBU1NXT1JEKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIodXNlcm5hbWVfaW4sIElTQ1NJX1BBU1NXT1JEX0lOKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZmFzdF9hYm9ydCwgSVNDU0lfRkFTVF9BQk9SVCk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGFib3J0X3RtbywgSVNDU0lfQUJPUlRfVE1PKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIobHVfcmVzZXRfdG1vLElTQ1NJX0xVX1JFU0VUX1RNTyk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHRndF9yZXNldF90bW8sSVNDU0lfVEdUX1JFU0VUX1RNTyk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGlmYWNlbmFtZSwgSVNDU0lfSUZBQ0VfTkFNRSk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGluaXRpYXRvcm5hbWUsIElTQ1NJX0lOSVRJQVRPUl9OQU1FKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIodGFyZ2V0YWxpYXMsIElTQ1NJX1RBUkdFVF9BTElBUyk7Ci0JU0VUVVBfUFJJVl9TRVNTSU9OX1JXX0FUVFIocmVjb3ZlcnlfdG1vKTsKLQlTRVRVUF9QUklWX1NFU1NJT05fUkRfQVRUUihzdGF0ZSk7Ci0KLQlCVUdfT04oY291bnQgPiBJU0NTSV9TRVNTSU9OX0FUVFJTKTsKLQlwcml2LT5zZXNzaW9uX2F0dHJzW2NvdW50XSA9IE5VTEw7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjc2lfdHJhbnNwb3J0X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZCgmcHJpdi0+bGlzdCwgJmlzY3NpX3RyYW5zcG9ydHMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY3NpX3RyYW5zcG9ydF9sb2NrLCBmbGFncyk7CkBAIC0yMjEwLDEwICsyNjczLDE0IEBACiAJaWYgKGVycikKIAkJZ290byB1bnJlZ2lzdGVyX3RyYW5zcG9ydF9jbGFzczsKIAotCWVyciA9IHRyYW5zcG9ydF9jbGFzc19yZWdpc3RlcigmaXNjc2lfaG9zdF9jbGFzcyk7CisJZXJyID0gY2xhc3NfcmVnaXN0ZXIoJmlzY3NpX2lmYWNlX2NsYXNzKTsKIAlpZiAoZXJyKQogCQlnb3RvIHVucmVnaXN0ZXJfZW5kcG9pbnRfY2xhc3M7CiAKKwllcnIgPSB0cmFuc3BvcnRfY2xhc3NfcmVnaXN0ZXIoJmlzY3NpX2hvc3RfY2xhc3MpOworCWlmIChlcnIpCisJCWdvdG8gdW5yZWdpc3Rlcl9pZmFjZV9jbGFzczsKKwogCWVyciA9IHRyYW5zcG9ydF9jbGFzc19yZWdpc3RlcigmaXNjc2lfY29ubmVjdGlvbl9jbGFzcyk7CiAJaWYgKGVycikKIAkJZ290byB1bnJlZ2lzdGVyX2hvc3RfY2xhc3M7CkBAIC0yMjQzLDYgKzI3MTAsOCBAQAogCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZpc2NzaV9jb25uZWN0aW9uX2NsYXNzKTsKIHVucmVnaXN0ZXJfaG9zdF9jbGFzczoKIAl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfaG9zdF9jbGFzcyk7Cit1bnJlZ2lzdGVyX2lmYWNlX2NsYXNzOgorCWNsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX2lmYWNlX2NsYXNzKTsKIHVucmVnaXN0ZXJfZW5kcG9pbnRfY2xhc3M6CiAJY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfZW5kcG9pbnRfY2xhc3MpOwogdW5yZWdpc3Rlcl90cmFuc3BvcnRfY2xhc3M6CkBAIC0yMjU4LDYgKzI3MjcsNyBAQAogCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZpc2NzaV9zZXNzaW9uX2NsYXNzKTsKIAl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfaG9zdF9jbGFzcyk7CiAJY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfZW5kcG9pbnRfY2xhc3MpOworCWNsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX2lmYWNlX2NsYXNzKTsKIAljbGFzc191bnJlZ2lzdGVyKCZpc2NzaV90cmFuc3BvcnRfY2xhc3MpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKaW5kZXggYzZmY2Y3Ni4uOWQ5MzMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwpAQCAtMTU0NSw4ICsxNTQ1LDE0IEBACiAKIAlpZiAoaWRlbnRpZnktPmRldmljZV90eXBlID09IFNBU19FTkRfREVWSUNFICYmCiAJICAgIHJwaHktPnNjc2lfdGFyZ2V0X2lkICE9IC0xKSB7Ci0JCXNjc2lfc2Nhbl90YXJnZXQoJnJwaHktPmRldiwgMCwKLQkJCQlycGh5LT5zY3NpX3RhcmdldF9pZCwgU0NBTl9XSUxEX0NBUkQsIDApOworCQlpbnQgbHVuOworCisJCWlmIChpZGVudGlmeS0+dGFyZ2V0X3BvcnRfcHJvdG9jb2xzICYgU0FTX1BST1RPQ09MX1NTUCkKKwkJCWx1biA9IFNDQU5fV0lMRF9DQVJEOworCQllbHNlCisJCQlsdW4gPSAwOworCisJCXNjc2lfc2Nhbl90YXJnZXQoJnJwaHktPmRldiwgMCwgcnBoeS0+c2NzaV90YXJnZXRfaWQsIGx1biwgMCk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2QuYyBiL2RyaXZlcnMvc2NzaS9zZC5jCmluZGV4IDk1Mzc3M2MuLmZhM2E1OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZC5jCkBAIC0xMDY2LDEyICsxMDY2LDEzIEBACiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBzY3NpX2Rpc2soZGlzayktPmRldmljZTsKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gc2NzaV9kaXNrKGRpc2spOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gc2RrcC0+ZGV2aWNlOwogCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBlcnJvcjsKICAgICAKLQlTQ1NJX0xPR19JT0NUTCgxLCBwcmludGsoInNkX2lvY3RsOiBkaXNrPSVzLCBjbWQ9MHgleFxuIiwKLQkJCQkJCWRpc2stPmRpc2tfbmFtZSwgY21kKSk7CisJU0NTSV9MT0dfSU9DVEwoMSwgc2RfcHJpbnRrKEtFUk5fSU5GTywgc2RrcCwgInNkX2lvY3RsOiBkaXNrPSVzLCAiCisJCQkJICAgICJjbWQ9MHgleFxuIiwgZGlzay0+ZGlza19uYW1lLCBjbWQpKTsKIAogCS8qCiAJICogSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgZXJyb3IgcmVjb3ZlcnksIGRvbid0IGxldCBhbnlvbmUKQEAgLTI1ODksMTggKzI1OTAsMTYgQEAKIAkJc3Bpbl91bmxvY2soJnNkX2luZGV4X2xvY2spOwogCX0gd2hpbGUgKGVycm9yID09IC1FQUdBSU4pOwogCi0JaWYgKGVycm9yKQorCWlmIChlcnJvcikgeworCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNkcCwgInNkX3Byb2JlOiBtZW1vcnkgZXhoYXVzdGVkLlxuIik7CiAJCWdvdG8gb3V0X3B1dDsKLQotCWlmIChpbmRleCA+PSBTRF9NQVhfRElTS1MpIHsKLQkJZXJyb3IgPSAtRU5PREVWOwotCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNkcCwgIlNDU0kgZGlzayAoc2QpIG5hbWUgc3BhY2UgZXhoYXVzdGVkLlxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfaW5kZXg7CiAJfQogCiAJZXJyb3IgPSBzZF9mb3JtYXRfZGlza19uYW1lKCJzZCIsIGluZGV4LCBnZC0+ZGlza19uYW1lLCBESVNLX05BTUVfTEVOKTsKLQlpZiAoZXJyb3IpCisJaWYgKGVycm9yKSB7CisJCXNkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgc2RwLCAiU0NTSSBkaXNrIChzZCkgbmFtZSBsZW5ndGggZXhjZWVkZWQuXG4iKTsKIAkJZ290byBvdXRfZnJlZV9pbmRleDsKKwl9CiAKIAlzZGtwLT5kZXZpY2UgPSBzZHA7CiAJc2RrcC0+ZHJpdmVyID0gJnNkX3RlbXBsYXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmggYi9kcml2ZXJzL3Njc2kvc2QuaAppbmRleCA2YWQ3OThiLi40MTYzZjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuaAorKysgYi9kcml2ZXJzL3Njc2kvc2QuaApAQCAtOSwxMiArOSw2IEBACiAjZGVmaW5lIFNEX01BSk9SUwkxNgogCiAvKgotICogVGhpcyBpcyBsaW1pdGVkIGJ5IHRoZSBuYW1pbmcgc2NoZW1lIGVuZm9yY2VkIGluIHNkX3Byb2JlLAotICogYWRkIGFub3RoZXIgY2hhcmFjdGVyIHRvIGl0IGlmIHlvdSByZWFsbHkgbmVlZCBtb3JlIGRpc2tzLgotICovCi0jZGVmaW5lIFNEX01BWF9ESVNLUwkoKCgyNiAqIDI2KSArIDI2ICsgMSkgKiAyNikKLQotLyoKICAqIFRpbWUgb3V0IGluIHNlY29uZHMgZm9yIGRpc2tzIGFuZCBNYWduZXRvLW9wdGljYWxzICh3aGljaCBhcmUgc2xvd2VyKS4KICAqLwogI2RlZmluZSBTRF9USU1FT1VUCQkoMzAgKiBIWikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jIGIvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKaW5kZXggOGJlMzA1NS4uYTM5MTFjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5jIGIvZHJpdmVycy9zY3NpL3N0LmMKaW5kZXggMTg3MWI4YS4uOWIyOGYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL3N0LmMKQEAgLTQ2MiwxNCArNDYyLDE2IEBACiB7CiAJc3RydWN0IHN0X3JlcXVlc3QgKlNScG50ID0gcmVxLT5lbmRfaW9fZGF0YTsKIAlzdHJ1Y3Qgc2NzaV90YXBlICpTVHAgPSBTUnBudC0+c3RwOworCXN0cnVjdCBiaW8gKnRtcDsKIAogCVNUcC0+YnVmZmVyLT5jbWRzdGF0Lm1pZGxldmVsX3Jlc3VsdCA9IFNScG50LT5yZXN1bHQgPSByZXEtPmVycm9yczsKIAlTVHAtPmJ1ZmZlci0+Y21kc3RhdC5yZXNpZHVhbCA9IHJlcS0+cmVzaWRfbGVuOwogCisJdG1wID0gU1JwbnQtPmJpbzsKIAlpZiAoU1JwbnQtPndhaXRpbmcpCiAJCWNvbXBsZXRlKFNScG50LT53YWl0aW5nKTsKIAotCWJsa19ycV91bm1hcF91c2VyKFNScG50LT5iaW8pOworCWJsa19ycV91bm1hcF91c2VyKHRtcCk7CiAJX19ibGtfcHV0X3JlcXVlc3QocmVxLT5xLCByZXEpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NmaS9zZmlfY29yZS5oIGIvZHJpdmVycy9zZmkvc2ZpX2NvcmUuaAppbmRleCBiN2NmMjIwLi4xZDVjZmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NmaS9zZmlfY29yZS5oCisrKyBiL2RyaXZlcnMvc2ZpL3NmaV9jb3JlLmgKQEAgLTU1LDYgKzU1LDkgQEAKICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAogKi8KKworI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKIHN0cnVjdCBzZmlfdGFibGVfa2V5ewogCWNoYXIJKnNpZzsKIAljaGFyCSpvZW1faWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL01ha2VmaWxlIGIvZHJpdmVycy9zaC9NYWtlZmlsZQppbmRleCAyNGU2Y2VjLi42N2UyNzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2gvTWFrZWZpbGUKQEAgLTcsMyArNywxMSBAQAogb2JqLSQoQ09ORklHX01BUExFKQkJKz0gbWFwbGUvCiBvYmotJChDT05GSUdfU1VQRVJIWVdBWSkJKz0gc3VwZXJoeXdheS8KIG9iai0kKENPTkZJR19HRU5FUklDX0dQSU8pCSs9IHBmYy5vCisKKyMKKyMgRm9yIHRoZSBtb21lbnQgd2Ugb25seSB1c2UgdGhpcyBmcmFtZXdvcmsgZm9yIEFSTS1iYXNlZCBTSC9SLU1vYmlsZQorIyBwbGF0Zm9ybXMgYW5kIGdlbmVyaWMgU0guIFNILWJhc2VkIFNILU1vYmlsZSBwbGF0Zm9ybXMgYXJlIHN0aWxsIHVzaW5nCisjIGFuIG9sZGVyIGZyYW1ld29yayB0aGF0IGlzIHBlbmRpbmcgdXAtcG9ydGluZywgYXQgd2hpY2ggcG9pbnQgdGhpcworIyBzcGVjaWFsIGNhc2luZyBjYW4gZ28gYXdheS4KKyMKK29iai0kKENPTkZJR19TVVBFUkgpJChDT05GSUdfQVJDSF9TSE1PQklMRSkJKz0gcG1fcnVudGltZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL2Nsay9jb3JlLmMgYi9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKaW5kZXggZGM4ZDAyMi4uZGIyNTdhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9jbGsvY29yZS5jCisrKyBiL2RyaXZlcnMvc2gvY2xrL2NvcmUuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2Nsay5oPgpAQCAtMTczLDYgKzE3MiwyNiBAQAogCXJldHVybiBjbGtfcmF0ZV9yb3VuZF9oZWxwZXIoJmRpdl9yYW5nZV9yb3VuZCk7CiB9CiAKK3N0YXRpYyBsb25nIGNsa19yYXRlX211bHRfcmFuZ2VfaXRlcih1bnNpZ25lZCBpbnQgcG9zLAorCQkJCSAgICAgIHN0cnVjdCBjbGtfcmF0ZV9yb3VuZF9kYXRhICpyb3VuZGVyKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUocm91bmRlci0+YXJnKSAqIHBvczsKK30KKworbG9uZyBjbGtfcmF0ZV9tdWx0X3JhbmdlX3JvdW5kKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgaW50IG11bHRfbWluLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBtdWx0X21heCwgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXN0cnVjdCBjbGtfcmF0ZV9yb3VuZF9kYXRhIG11bHRfcmFuZ2Vfcm91bmQgPSB7CisJCS5taW4JPSBtdWx0X21pbiwKKwkJLm1heAk9IG11bHRfbWF4LAorCQkuZnVuYwk9IGNsa19yYXRlX211bHRfcmFuZ2VfaXRlciwKKwkJLmFyZwk9IGNsa19nZXRfcGFyZW50KGNsayksCisJCS5yYXRlCT0gcmF0ZSwKKwl9OworCisJcmV0dXJuIGNsa19yYXRlX3JvdW5kX2hlbHBlcigmbXVsdF9yYW5nZV9yb3VuZCk7Cit9CisKIGludCBjbGtfcmF0ZV90YWJsZV9maW5kKHN0cnVjdCBjbGsgKmNsaywKIAkJCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZSwKIAkJCXVuc2lnbmVkIGxvbmcgcmF0ZSkKQEAgLTIwNSw5ICsyMjQsNiBAQAogCQlsaXN0X2FkZCgmY2hpbGQtPnNpYmxpbmcsICZwYXJlbnQtPmNoaWxkcmVuKTsKIAljaGlsZC0+cGFyZW50ID0gcGFyZW50OwogCi0JLyogbm93IGRvIHRoZSBkZWJ1Z2ZzIHJlbmFtaW5nIHRvIHJlYXR0YWNoIHRoZSBjaGlsZAotCSAgIHRvIHRoZSBwcm9wZXIgcGFyZW50ICovCi0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNjY1LDg5ICs2ODEsNiBAQAogc3Vic3lzX2luaXRjYWxsKGNsa19zeXNjb3JlX2luaXQpOwogI2VuZGlmCiAKLS8qCi0gKglkZWJ1Z2ZzIHN1cHBvcnQgdG8gdHJhY2UgY2xvY2sgdHJlZSBoaWVyYXJjaHkgYW5kIGF0dHJpYnV0ZXMKLSAqLwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmNsa19kZWJ1Z2ZzX3Jvb3Q7Ci0KLXN0YXRpYyBpbnQgY2xrX2RlYnVnZnNfcmVnaXN0ZXJfb25lKHN0cnVjdCBjbGsgKmMpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgZGVudHJ5ICpkOwotCXN0cnVjdCBjbGsgKnBhID0gYy0+cGFyZW50OwotCWNoYXIgc1syNTVdOwotCWNoYXIgKnAgPSBzOwotCi0JcCArPSBzcHJpbnRmKHAsICIlcCIsIGMpOwotCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIocywgcGEgPyBwYS0+ZGVudHJ5IDogY2xrX2RlYnVnZnNfcm9vdCk7Ci0JaWYgKCFkKQotCQlyZXR1cm4gLUVOT01FTTsKLQljLT5kZW50cnkgPSBkOwotCi0JZCA9IGRlYnVnZnNfY3JlYXRlX3U4KCJ1c2Vjb3VudCIsIFNfSVJVR08sIGMtPmRlbnRyeSwgKHU4ICopJmMtPnVzZWNvdW50KTsKLQlpZiAoIWQpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQlkID0gZGVidWdmc19jcmVhdGVfdTMyKCJyYXRlIiwgU19JUlVHTywgYy0+ZGVudHJ5LCAodTMyICopJmMtPnJhdGUpOwotCWlmICghZCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV94MzIoImZsYWdzIiwgU19JUlVHTywgYy0+ZGVudHJ5LCAodTMyICopJmMtPmZsYWdzKTsKLQlpZiAoIWQpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQlyZXR1cm4gMDsKLQotZXJyX291dDoKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYy0+ZGVudHJ5KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmMpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgY2xrICpwYSA9IGMtPnBhcmVudDsKLQotCWlmIChwYSAmJiAhcGEtPmRlbnRyeSkgewotCQllcnIgPSBjbGtfZGVidWdmc19yZWdpc3RlcihwYSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICghYy0+ZGVudHJ5KSB7Ci0JCWVyciA9IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyX29uZShjKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjbGtfZGVidWdmc19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGNsayAqYzsKLQlzdHJ1Y3QgZGVudHJ5ICpkOwotCWludCBlcnI7Ci0KLQlkID0gZGVidWdmc19jcmVhdGVfZGlyKCJjbG9jayIsIE5VTEwpOwotCWlmICghZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JY2xrX2RlYnVnZnNfcm9vdCA9IGQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZjbG9ja19saXN0LCBub2RlKSB7Ci0JCWVyciA9IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyKGMpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0OwotCX0KLQlyZXR1cm4gMDsKLWVycl9vdXQ6Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGNsa19kZWJ1Z2ZzX3Jvb3QpOwotCXJldHVybiBlcnI7Ci19Ci1sYXRlX2luaXRjYWxsKGNsa19kZWJ1Z2ZzX2luaXQpOwotCiBzdGF0aWMgaW50IF9faW5pdCBjbGtfbGF0ZV9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvaW50Yy9jaGlwLmMgYi9kcml2ZXJzL3NoL2ludGMvY2hpcC5jCmluZGV4IDMzYjJlZDQuLjdiMjQ2ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvaW50Yy9jaGlwLmMKKysrIGIvZHJpdmVycy9zaC9pbnRjL2NoaXAuYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkKIAlbSVJRX1RZUEVfTEVWRUxfSElHSF0gPSBWQUxJRCgzKSwKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzcyKQorI2lmIGRlZmluZWQoQ09ORklHX0FSTSkgLyogYWxsIHJlY2VudCBTSC1Nb2JpbGUgLyBSLU1vYmlsZSBBUk0gc3VwcG9ydCB0aGlzICovCiAJW0lSUV9UWVBFX0VER0VfQk9USF0gPSBWQUxJRCg0KSwKICNlbmRpZgogfTsKQEAgLTIwMiwxMSArMjAyLDE2IEBACiAJaWYgKCF2YWx1ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwl2YWx1ZSAmPSB+U0VOU0VfVkFMSURfRkxBRzsKKwogCWlocCA9IGludGNfZmluZF9pcnEoZC0+c2Vuc2UsIGQtPm5yX3NlbnNlLCBpcnEpOwogCWlmIChpaHApIHsKKwkJLyogUElOVCBoYXMgMi1iaXQgc2Vuc2UgcmVnaXN0ZXJzLCBzaG91bGQgZmFpbCBvbiBFREdFX0JPVEggKi8KKwkJaWYgKHZhbHVlID49ICgxIDw8IF9JTlRDX1dJRFRIKGlocC0+aGFuZGxlKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwogCQlhZGRyID0gSU5UQ19SRUcoZCwgX0lOVENfQUREUl9FKGlocC0+aGFuZGxlKSwgMCk7Ci0JCWludGNfcmVnX2Zuc1tfSU5UQ19GTihpaHAtPmhhbmRsZSldKGFkZHIsIGlocC0+aGFuZGxlLAotCQkJCQkJICAgIHZhbHVlICYgflNFTlNFX1ZBTElEX0ZMQUcpOworCQlpbnRjX3JlZ19mbnNbX0lOVENfRk4oaWhwLT5oYW5kbGUpXShhZGRyLCBpaHAtPmhhbmRsZSwgdmFsdWUpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9pbnRjL2NvcmUuYyBiL2RyaXZlcnMvc2gvaW50Yy9jb3JlLmMKaW5kZXggYzZjYTExNS4uOGI3YTE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9pbnRjL2NvcmUuYworKysgYi9kcml2ZXJzL3NoL2ludGMvY29yZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2ludGMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KQEAgLTI5LDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9yYWRpeC10cmVlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaW50ZXJuYWxzLmgiCiAKIExJU1RfSEVBRChpbnRjX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9pbnRjL2R5bmFtaWMuYyBiL2RyaXZlcnMvc2gvaW50Yy9keW5hbWljLmMKaW5kZXggYTM2NzdjOS4uNWZlYTFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9pbnRjL2R5bmFtaWMuYworKysgYi9kcml2ZXJzL3NoL2ludGMvZHluYW1pYy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJpbnRlcm5hbHMuaCIgLyogb25seSBmb3IgYWN0aXZhdGVfaXJxKCkgZGFtYWdlLi4gKi8KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvaW50Yy91c2VyaW1hc2suYyBiL2RyaXZlcnMvc2gvaW50Yy91c2VyaW1hc2suYwppbmRleCBlMzIzMDRiLi41NmJmOTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NoL2ludGMvdXNlcmltYXNrLmMKKysrIGIvZHJpdmVycy9zaC9pbnRjL3VzZXJpbWFzay5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogI2luY2x1ZGUgImludGVybmFscy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL2ludGMvdmlycS5jIGIvZHJpdmVycy9zaC9pbnRjL3ZpcnEuYwppbmRleCAxZTZlMmQwLi5jN2VjNDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NoL2ludGMvdmlycS5jCisrKyBiL2RyaXZlcnMvc2gvaW50Yy92aXJxLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaW50ZXJuYWxzLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19tYXBfZW50cnkgaW50Y19pcnFfeGxhdGVbTlJfSVJRU107CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL21hcGxlL21hcGxlLmMgYi9kcml2ZXJzL3NoL21hcGxlL21hcGxlLmMKaW5kZXggMWUyMDYwNC4uYmVjODFjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9tYXBsZS9tYXBsZS5jCisrKyBiL2RyaXZlcnMvc2gvbWFwbGUvbWFwbGUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21hcGxlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9wZmMuYyBiL2RyaXZlcnMvc2gvcGZjLmMKaW5kZXggNzU5MzRlMy4uZTY3ZmUxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9wZmMuYworKysgYi9kcml2ZXJzL3NoL3BmYy5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCQlpZiAoIXJfd2lkdGgpCiAJCQlicmVhazsKLQkJZm9yIChuID0gMDsgbiA8IChyX3dpZHRoIC8gZl93aWR0aCkgKiAxIDw8IGZfd2lkdGg7IG4rKykgeworCQlmb3IgKG4gPSAwOyBuIDwgKHJfd2lkdGggLyBmX3dpZHRoKSAqICgxIDw8IGZfd2lkdGgpOyBuKyspIHsKIAkJCWlmIChjb25maWdfcmVnLT5lbnVtX2lkc1tuXSA9PSBlbnVtX2lkKSB7CiAJCQkJKmNycCA9IGNvbmZpZ19yZWc7CiAJCQkJKmluZGV4cCA9IG47CkBAIC01NzcsNiArNTc3LDMyIEBACiAJc2hfZ3Bpb19zZXRfdmFsdWUoY2hpcF90b19waW5tdXgoY2hpcCksIG9mZnNldCwgdmFsdWUpOwogfQogCitzdGF0aWMgaW50IHNoX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgcGlubXV4X2luZm8gKmdwaW9jID0gY2hpcF90b19waW5tdXgoY2hpcCk7CisJcGlubXV4X2VudW1fdCBlbnVtX2lkOworCXBpbm11eF9lbnVtX3QgKmVudW1faWRzOworCWludCBpLCBrLCBwb3M7CisKKwlwb3MgPSAwOworCWVudW1faWQgPSAwOworCXdoaWxlICgxKSB7CisJCXBvcyA9IGdldF9ncGlvX2VudW1faWQoZ3Bpb2MsIG9mZnNldCwgcG9zLCAmZW51bV9pZCk7CisJCWlmIChwb3MgPD0gMCB8fCAhZW51bV9pZCkKKwkJCWJyZWFrOworCisJCWZvciAoaSA9IDA7IGkgPCBncGlvYy0+Z3Bpb19pcnFfc2l6ZTsgaSsrKSB7CisJCQllbnVtX2lkcyA9IGdwaW9jLT5ncGlvX2lycVtpXS5lbnVtX2lkczsKKwkJCWZvciAoayA9IDA7IGVudW1faWRzW2tdOyBrKyspIHsKKwkJCQlpZiAoZW51bV9pZHNba10gPT0gZW51bV9pZCkKKwkJCQkJcmV0dXJuIGdwaW9jLT5ncGlvX2lycVtpXS5pcnE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwogaW50IHJlZ2lzdGVyX3Bpbm11eChzdHJ1Y3QgcGlubXV4X2luZm8gKnBpcCkKIHsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gJnBpcC0+Y2hpcDsKQEAgLTU5Miw2ICs2MTgsNyBAQAogCWNoaXAtPmdldCA9IHNoX2dwaW9fZ2V0OwogCWNoaXAtPmRpcmVjdGlvbl9vdXRwdXQgPSBzaF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CiAJY2hpcC0+c2V0ID0gc2hfZ3Bpb19zZXQ7CisJY2hpcC0+dG9faXJxID0gc2hfZ3Bpb190b19pcnE7CiAKIAlXQVJOX09OKHBpcC0+Zmlyc3RfZ3BpbyAhPSAwKTsgLyogbmVlZHMgdGVzdGluZyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL3BtX3J1bnRpbWUuYyBiL2RyaXZlcnMvc2gvcG1fcnVudGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTkyODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NoL3BtX3J1bnRpbWUuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogUnVudGltZSBQTSBzdXBwb3J0IGNvZGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWFnbnVzIERhbW0KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX2Nsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvc2hfY2xrLmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKworc3RhdGljIGludCBkZWZhdWx0X3BsYXRmb3JtX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyogc3VzcGVuZCBzeW5jaHJvbm91c2x5IHRvIGRpc2FibGUgY2xvY2tzIGltbWVkaWF0ZWx5ICovCisJcmV0dXJuIHBtX3J1bnRpbWVfc3VzcGVuZChkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGRldl9wbV9kb21haW4gZGVmYXVsdF9wbV9kb21haW4gPSB7CisJLm9wcyA9IHsKKwkJLnJ1bnRpbWVfc3VzcGVuZCA9IHBtX2Nsa19zdXNwZW5kLAorCQkucnVudGltZV9yZXN1bWUgPSBwbV9jbGtfcmVzdW1lLAorCQkucnVudGltZV9pZGxlID0gZGVmYXVsdF9wbGF0Zm9ybV9ydW50aW1lX2lkbGUsCisJCVVTRV9QTEFURk9STV9QTV9TTEVFUF9PUFMKKwl9LAorfTsKKworI2RlZmluZSBERUZBVUxUX1BNX0RPTUFJTl9QVFIJKCZkZWZhdWx0X3BtX2RvbWFpbikKKworI2Vsc2UKKworI2RlZmluZSBERUZBVUxUX1BNX0RPTUFJTl9QVFIJTlVMTAorCisjZW5kaWYgLyogQ09ORklHX1BNX1JVTlRJTUUgKi8KKworc3RhdGljIHN0cnVjdCBwbV9jbGtfbm90aWZpZXJfYmxvY2sgcGxhdGZvcm1fYnVzX25vdGlmaWVyID0geworCS5wbV9kb21haW4gPSBERUZBVUxUX1BNX0RPTUFJTl9QVFIsCisJLmNvbl9pZHMgPSB7IE5VTEwsIH0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaF9wbV9ydW50aW1lX2luaXQodm9pZCkKK3sKKwlwbV9jbGtfYWRkX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJnBsYXRmb3JtX2J1c19ub3RpZmllcik7CisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKHNoX3BtX3J1bnRpbWVfaW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHNoX3BtX3J1bnRpbWVfbGF0ZV9pbml0KHZvaWQpCit7CisJcG1fZ2VucGRfcG93ZXJvZmZfdW51c2VkKCk7CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHNoX3BtX3J1bnRpbWVfbGF0ZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IDUyZTI5MDAuLmExZmQ3M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtODgsNyArODgsNyBAQAogCiBjb25maWcgU1BJX0FVMTU1MAogCXRyaXN0YXRlICJBdTE1NTAvQXUxMngwIFNQSSBDb250cm9sbGVyIgotCWRlcGVuZHMgb24gKFNPQ19BVTE1NTAgfHwgU09DX0FVMTIwMCkgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBNSVBTX0FMQ0hFTVkgJiYgRVhQRVJJTUVOVEFMCiAJc2VsZWN0IFNQSV9CSVRCQU5HCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYWx0ZXJhLmMgYi9kcml2ZXJzL3NwaS9zcGktYWx0ZXJhLmMKaW5kZXggNDgxM2E2My4uYzAwZDAwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWFsdGVyYS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hbHRlcmEuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KQEAgLTMyMCwxOCArMzIxLDcgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gYWx0ZXJhX3NwaV9tYXRjaCwKIAl9LAogfTsKLQotc3RhdGljIGludCBfX2luaXQgYWx0ZXJhX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWx0ZXJhX3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoYWx0ZXJhX3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGFsdGVyYV9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbHRlcmFfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChhbHRlcmFfc3BpX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhbHRlcmFfc3BpX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQWx0ZXJhIFNQSSBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIlRob21hcyBDaG91IDx0aG9tYXNAd3l0cm9uLmNvbS50dz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jIGIvZHJpdmVycy9zcGkvc3BpLWF0aDc5LmMKaW5kZXggMDMwMTliZi4uMDI0YjQ4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWF0aDc5LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWF0aDc5LmMKQEAgLTI3MywxOCArMjczLDcgQEAKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07Ci0KLXN0YXRpYyBfX2luaXQgaW50IGF0aDc5X3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXRoNzlfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChhdGg3OV9zcGlfaW5pdCk7Ci0KLXN0YXRpYyBfX2V4aXQgdm9pZCBhdGg3OV9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdGg3OV9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGF0aDc5X3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXRoNzlfc3BpX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiU1BJIGNvbnRyb2xsZXIgZHJpdmVyIGZvciBBdGhlcm9zIEFSNzFYWC9BUjcyNFgvQVI5MTNYIik7CiBNT0RVTEVfQVVUSE9SKCJHYWJvciBKdWhvcyA8anVob3NnQG9wZW53cnQub3JnPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWF0bWVsLmMgYi9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYwppbmRleCA4MmRlZTlhLi4xNmQ2YTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KIAogLyogU1BJIHJlZ2lzdGVyIG9mZnNldHMgKi8KQEAgLTkwNyw3ICs5MDcsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IF9faW5pdCBhdG1lbF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0bWVsX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByZXNvdXJjZQkJKnJlZ3M7CiAJaW50CQkJaXJxOwpAQCAtMTAwMyw3ICsxMDAzLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBhdG1lbF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhdG1lbF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwpAQCAtMTA3MiwyMCArMTA3MiwxMCBAQAogCX0sCiAJLnN1c3BlbmQJPSBhdG1lbF9zcGlfc3VzcGVuZCwKIAkucmVzdW1lCQk9IGF0bWVsX3NwaV9yZXN1bWUsCisJLnByb2JlCQk9IGF0bWVsX3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZXhpdF9wKGF0bWVsX3NwaV9yZW1vdmUpLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgYXRtZWxfc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhdG1lbF9zcGlfZHJpdmVyLCBhdG1lbF9zcGlfcHJvYmUpOwotfQotbW9kdWxlX2luaXQoYXRtZWxfc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXRtZWxfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXRtZWxfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChhdG1lbF9zcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGF0bWVsX3NwaV9kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkF0bWVsIEFUMzIvQVQ5MSBTUEkgQ29udHJvbGxlciBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkhhYXZhcmQgU2tpbm5lbW9lbiAoQXRtZWwpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMgYi9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMKaW5kZXggYmRkZWU1ZjUuLjU3ODRjODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hdTE1NTAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJmaW4tc3BvcnQuYyBiL2RyaXZlcnMvc3BpL3NwaS1iZmluLXNwb3J0LmMKaW5kZXggZTU1N2ZmNi4uMjQ4YTJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJmaW4tc3BvcnQuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmZpbi1zcG9ydC5jCkBAIC05MzgsMTUgKzkzOCw0IEBACiAJLnN1c3BlbmQgPSBiZmluX3Nwb3J0X3NwaV9zdXNwZW5kLAogCS5yZXN1bWUgID0gYmZpbl9zcG9ydF9zcGlfcmVzdW1lLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgYmZpbl9zcG9ydF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmJmaW5fc3BvcnRfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChiZmluX3Nwb3J0X3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGJmaW5fc3BvcnRfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYmZpbl9zcG9ydF9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGJmaW5fc3BvcnRfc3BpX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiZmluX3Nwb3J0X3NwaV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1iZmluNXh4LmMKaW5kZXggYjhkMjVmMi4uM2I4M2ZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktYmZpbjV4eC5jCkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogCiAJaWYgKGNoaXAtPnBpb19pbnRlcnJ1cHQgJiYgIWRydl9kYXRhLT5pcnFfcmVxdWVzdGVkKSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKGRydl9kYXRhLT5zcGlfaXJxLCBiZmluX3NwaV9waW9faXJxX2hhbmRsZXIsCi0JCQlJUlFGX0RJU0FCTEVELCAiQkZJTl9TUEkiLCBkcnZfZGF0YSk7CisJCQkwLCAiQkZJTl9TUEkiLCBkcnZfZGF0YSk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHNwaSBJUlFcbiIpOwogCQkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iaXRiYW5nLmMgYi9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy5jCmluZGV4IDAyZDU3ZmIuLmFlZjU5YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmcuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJ1dHRlcmZseS5jIGIvZHJpdmVycy9zcGkvc3BpLWJ1dHRlcmZseS5jCmluZGV4IDlmOTA3ZWMuLjVlZDA4ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1idXR0ZXJmbHkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYnV0dGVyZmx5LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1jb2xkZmlyZS1xc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktY29sZGZpcmUtcXNwaS5jCmluZGV4IGFlMmNkMWMuLjZlZWU2NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1jb2xkZmlyZS1xc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWNvbGRmaXJlLXFzcGkuYwpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAJCWdvdG8gZmFpbDI7CiAJfQogCi0Jc3RhdHVzID0gcmVxdWVzdF9pcnEobWNmcXNwaS0+aXJxLCBtY2Zxc3BpX2lycV9oYW5kbGVyLCBJUlFGX0RJU0FCTEVELAorCXN0YXR1cyA9IHJlcXVlc3RfaXJxKG1jZnFzcGktPmlycSwgbWNmcXNwaV9pcnFfaGFuZGxlciwgMCwKIAkJCSAgICAgcGRldi0+bmFtZSwgbWNmcXNwaSk7CiAJaWYgKHN0YXR1cykgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZXF1ZXN0X2lycSBmYWlsZWRcbiIpOwpAQCAtNjIxLDIwICs2MjEsMTAgQEAKIAkuZHJpdmVyLm5hbWUJPSBEUklWRVJfTkFNRSwKIAkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJLmRyaXZlci5wbQk9IE1DRlFTUElfREVWX1BNX09QUywKKwkucHJvYmUJCT0gbWNmcXNwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1jZnFzcGlfcmVtb3ZlKSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1jZnFzcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm1jZnFzcGlfZHJpdmVyLCBtY2Zxc3BpX3Byb2JlKTsKLX0KLW1vZHVsZV9pbml0KG1jZnFzcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtY2Zxc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWNmcXNwaV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobWNmcXNwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWNmcXNwaV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJTdGV2ZW4gS2luZyA8c2ZraW5nQGZkd2RjLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQ29sZGZpcmUgUVNQSSBDb250cm9sbGVyIERyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWRhdmluY2kuYyBiL2RyaXZlcnMvc3BpL3NwaS1kYXZpbmNpLmMKaW5kZXggMWYwZWQ4MC4uMzFiZmJhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWRhdmluY2kuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZGF2aW5jaS5jCkBAIC03OTksNyArNzk5LDcgQEAKICAqIEl0IHdpbGwgaW52b2tlIHNwaV9iaXRiYW5nX3N0YXJ0IHRvIGNyZWF0ZSB3b3JrIHF1ZXVlIHNvIHRoYXQgY2xpZW50IGRyaXZlcgogICogY2FuIHJlZ2lzdGVyIHRyYW5zZmVyIG1ldGhvZCB0byB3b3JrIHF1ZXVlLgogICovCi1zdGF0aWMgaW50IGRhdmluY2lfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYXZpbmNpX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IGRhdmluY2lfc3BpICpkc3BpOwpAQCAtOTg0LDcgKzk4NCw3IEBACiAgKiBJdCB3aWxsIGFsc28gY2FsbCBzcGlfYml0YmFuZ19zdG9wIHRvIGRlc3Ryb3kgdGhlIHdvcmsgcXVldWUgd2hpY2ggd2FzCiAgKiBjcmVhdGVkIGJ5IHNwaV9iaXRiYW5nX3N0YXJ0LgogICovCi1zdGF0aWMgaW50IF9fZXhpdCBkYXZpbmNpX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRhdmluY2lfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkYXZpbmNpX3NwaSAqZHNwaTsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwpAQCAtMTAxMSwyMCArMTAxMSwxMCBAQAogCQkubmFtZSA9ICJzcGlfZGF2aW5jaSIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCi0JLnJlbW92ZSA9IF9fZXhpdF9wKGRhdmluY2lfc3BpX3JlbW92ZSksCisJLnByb2JlID0gZGF2aW5jaV9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGRhdmluY2lfc3BpX3JlbW92ZSksCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBkYXZpbmNpX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZGF2aW5jaV9zcGlfZHJpdmVyLCBkYXZpbmNpX3NwaV9wcm9iZSk7Ci19Ci1tb2R1bGVfaW5pdChkYXZpbmNpX3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGRhdmluY2lfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGF2aW5jaV9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGRhdmluY2lfc3BpX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihkYXZpbmNpX3NwaV9kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlRJIERhVmluY2kgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LW1pZC5jIGIvZHJpdmVycy9zcGkvc3BpLWR3LW1pZC5jCmluZGV4IDEzMGU1NTUuLmU3NDNhNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy1taWQuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZHctbWlkLmMKQEAgLTExNiwxMyArMTE2LDEzIEBACiAJLyogMS4gc2V0dXAgRE1BIHJlbGF0ZWQgcmVnaXN0ZXJzICovCiAJaWYgKGNzX2NoYW5nZSkgewogCQlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKLQkJZHdfd3JpdGV3KGR3cywgZG1hcmRsciwgMHhmKTsKLQkJZHdfd3JpdGV3KGR3cywgZG1hdGRsciwgMHgxMCk7CisJCWR3X3dyaXRldyhkd3MsIERXX1NQSV9ETUFSRExSLCAweGYpOworCQlkd193cml0ZXcoZHdzLCBEV19TUElfRE1BVERMUiwgMHgxMCk7CiAJCWlmIChkd3MtPnR4X2RtYSkKIAkJCWRtYV9jdHJsIHw9IDB4MjsKIAkJaWYgKGR3cy0+cnhfZG1hKQogCQkJZG1hX2N0cmwgfD0gMHgxOwotCQlkd193cml0ZXcoZHdzLCBkbWFjciwgZG1hX2N0cmwpOworCQlkd193cml0ZXcoZHdzLCBEV19TUElfRE1BQ1IsIGRtYV9jdHJsKTsKIAkJc3BpX2VuYWJsZV9jaGlwKGR3cywgMSk7CiAJfQogCkBAIC0yMDAsNyArMjAwLDggQEAKIAogaW50IGR3X3NwaV9taWRfaW5pdChzdHJ1Y3QgZHdfc3BpICpkd3MpCiB7Ci0JdTMyICpjbGtfcmVnLCBjbGtfY2RpdjsKKwl2b2lkIF9faW9tZW0gKmNsa19yZWc7CisJdTMyIGNsa19jZGl2OwogCiAJY2xrX3JlZyA9IGlvcmVtYXBfbm9jYWNoZShNUlNUX0NMS19TUEkwX1JFRywgMTYpOwogCWlmICghY2xrX3JlZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy1tbWlvLmMgYi9kcml2ZXJzL3NwaS9zcGktZHctbW1pby5jCmluZGV4IDM0ZWI2NjUuLmRiMmYxYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy1tbWlvLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LW1taW8uYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInNwaS1kdy5oIgogCkBAIC0xMjcsMjQgKzEyOCwxNCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkd19zcGlfbW1pb19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGR3X3NwaV9tbWlvX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHdfc3BpX21taW9fcmVtb3ZlKSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSBEUklWRVJfTkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGR3X3NwaV9tbWlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZkd19zcGlfbW1pb19kcml2ZXIsIGR3X3NwaV9tbWlvX3Byb2JlKTsKLX0KLW1vZHVsZV9pbml0KGR3X3NwaV9tbWlvX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZHdfc3BpX21taW9fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkd19zcGlfbW1pb19kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoZHdfc3BpX21taW9fZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGR3X3NwaV9tbWlvX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkplYW4tSHVndWVzIERlc2NoZW5lcyA8amVhbi1odWd1ZXMuZGVzY2hlbmVzQG9jdGFzaWMuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNZW1vcnktbWFwcGVkIEkvTyBpbnRlcmZhY2UgZHJpdmVyIGZvciBEVyBTUEkgQ29yZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LXBjaS5jIGIvZHJpdmVycy9zcGkvc3BpLWR3LXBjaS5jCmluZGV4IGM1ZjM3ZjAuLmY2NDI1MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy1wY2kuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZHctcGNpLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAic3BpLWR3LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy5jIGIvZHJpdmVycy9zcGkvc3BpLWR3LmMKaW5kZXggODU3Y2QzMC4uMDgyNDU4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWR3LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtODgsMzUgKzg5LDM1IEBACiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKIAkJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiQ1RSTDA6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgY3RybDApKTsKKwkJCSJDVFJMMDogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfQ1RSTDApKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIkNUUkwxOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGN0cmwxKSk7CisJCQkiQ1RSTDE6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX0NUUkwxKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJTU0lFTlI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHNzaWVucikpOworCQkJIlNTSUVOUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX1NTSUVOUikpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiU0VSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHNlcikpOworCQkJIlNFUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfU0VSKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJCQVVEUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBiYXVkcikpOworCQkJIkJBVURSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIERXX1NQSV9CQVVEUikpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiVFhGVExSOiBcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCB0eGZsdHIpKTsKKwkJCSJUWEZUTFI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIERXX1NQSV9UWEZMVFIpKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIlJYRlRMUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgcnhmbHRyKSk7CisJCQkiUlhGVExSOiBcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfUlhGTFRSKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJUWEZMUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCB0eGZscikpOworCQkJIlRYRkxSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIERXX1NQSV9UWEZMUikpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiUlhGTFI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgcnhmbHIpKTsKKwkJCSJSWEZMUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfUlhGTFIpKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIlNSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHNyKSk7CisJCQkiU1I6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX1NSKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJJTVI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgaW1yKSk7CisJCQkiSU1SOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIERXX1NQSV9JTVIpKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIklTUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBpc3IpKTsKKwkJCSJJU1I6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX0lTUikpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiRE1BQ1I6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgZG1hY3IpKTsKKwkJCSJETUFDUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfRE1BQ1IpKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIkRNQVRETFI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGRtYXRkbHIpKTsKKwkJCSJETUFURExSOiBcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfRE1BVERMUikpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiRE1BUkRMUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgZG1hcmRscikpOworCQkJIkRNQVJETFI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIERXX1NQSV9ETUFSRExSKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKIAkJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCkBAIC0xNjYsNyArMTY3LDcgQEAKIAl1MzIgdHhfbGVmdCwgdHhfcm9vbSwgcnh0eF9nYXA7CiAKIAl0eF9sZWZ0ID0gKGR3cy0+dHhfZW5kIC0gZHdzLT50eCkgLyBkd3MtPm5fYnl0ZXM7Ci0JdHhfcm9vbSA9IGR3cy0+Zmlmb19sZW4gLSBkd19yZWFkdyhkd3MsIHR4ZmxyKTsKKwl0eF9yb29tID0gZHdzLT5maWZvX2xlbiAtIGR3X3JlYWR3KGR3cywgRFdfU1BJX1RYRkxSKTsKIAogCS8qCiAJICogQW5vdGhlciBjb25jZXJuIGlzIGFib3V0IHRoZSB0eC9yeCBtaXNtYXRjaCwgd2UKQEAgLTE4Nyw3ICsxODgsNyBAQAogewogCXUzMiByeF9sZWZ0ID0gKGR3cy0+cnhfZW5kIC0gZHdzLT5yeCkgLyBkd3MtPm5fYnl0ZXM7CiAKLQlyZXR1cm4gbWluKHJ4X2xlZnQsICh1MzIpZHdfcmVhZHcoZHdzLCByeGZscikpOworCXJldHVybiBtaW4ocnhfbGVmdCwgKHUzMilkd19yZWFkdyhkd3MsIERXX1NQSV9SWEZMUikpOwogfQogCiBzdGF0aWMgdm9pZCBkd193cml0ZXIoc3RydWN0IGR3X3NwaSAqZHdzKQpAQCAtMjAzLDcgKzIwNCw3IEBACiAJCQllbHNlCiAJCQkJdHh3ID0gKih1MTYgKikoZHdzLT50eCk7CiAJCX0KLQkJZHdfd3JpdGV3KGR3cywgZHIsIHR4dyk7CisJCWR3X3dyaXRldyhkd3MsIERXX1NQSV9EUiwgdHh3KTsKIAkJZHdzLT50eCArPSBkd3MtPm5fYnl0ZXM7CiAJfQogfQpAQCAtMjE0LDcgKzIxNSw3IEBACiAJdTE2IHJ4dzsKIAogCXdoaWxlIChtYXgtLSkgewotCQlyeHcgPSBkd19yZWFkdyhkd3MsIGRyKTsKKwkJcnh3ID0gZHdfcmVhZHcoZHdzLCBEV19TUElfRFIpOwogCQkvKiBDYXJlIHJ4IG9ubHkgaWYgdGhlIHRyYW5zZmVyJ3Mgb3JpZ2luYWwgInJ4IiBpcyBub3QgbnVsbCAqLwogCQlpZiAoZHdzLT5yeF9lbmQgLSBkd3MtPmxlbikgewogCQkJaWYgKGR3cy0+bl9ieXRlcyA9PSAxKQpAQCAtMzIyLDEzICszMjMsMTMgQEAKIAogc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF90cmFuc2ZlcihzdHJ1Y3QgZHdfc3BpICpkd3MpCiB7Ci0JdTE2IGlycV9zdGF0dXMgPSBkd19yZWFkdyhkd3MsIGlzcik7CisJdTE2IGlycV9zdGF0dXMgPSBkd19yZWFkdyhkd3MsIERXX1NQSV9JU1IpOwogCiAJLyogRXJyb3IgaGFuZGxpbmcgKi8KIAlpZiAoaXJxX3N0YXR1cyAmIChTUElfSU5UX1RYT0kgfCBTUElfSU5UX1JYT0kgfCBTUElfSU5UX1JYVUkpKSB7Ci0JCWR3X3JlYWR3KGR3cywgdHhvaWNyKTsKLQkJZHdfcmVhZHcoZHdzLCByeG9pY3IpOwotCQlkd19yZWFkdyhkd3MsIHJ4dWljcik7CisJCWR3X3JlYWR3KGR3cywgRFdfU1BJX1RYT0lDUik7CisJCWR3X3JlYWR3KGR3cywgRFdfU1BJX1JYT0lDUik7CisJCWR3X3JlYWR3KGR3cywgRFdfU1BJX1JYVUlDUik7CiAJCWludF9lcnJvcl9zdG9wKGR3cywgImludGVycnVwdF90cmFuc2ZlcjogZmlmbyBvdmVycnVuL3VuZGVycnVuIik7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CkBAIC0zNTIsNyArMzUzLDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBkd19zcGlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgZHdfc3BpICpkd3MgPSBkZXZfaWQ7Ci0JdTE2IGlycV9zdGF0dXMgPSBkd19yZWFkdyhkd3MsIGlzcikgJiAweDNmOworCXUxNiBpcnFfc3RhdHVzID0gZHdfcmVhZHcoZHdzLCBEV19TUElfSVNSKSAmIDB4M2Y7CiAKIAlpZiAoIWlycV9zdGF0dXMpCiAJCXJldHVybiBJUlFfTk9ORTsKQEAgLTUyMCwxMSArNTIxLDExIEBACiAJICoJMi4gY2xrX2RpdiBpcyBjaGFuZ2VkCiAJICoJMy4gY29udHJvbCB2YWx1ZSBjaGFuZ2VzCiAJICovCi0JaWYgKGR3X3JlYWR3KGR3cywgY3RybDApICE9IGNyMCB8fCBjc19jaGFuZ2UgfHwgY2xrX2RpdiB8fCBpbWFzaykgeworCWlmIChkd19yZWFkdyhkd3MsIERXX1NQSV9DVFJMMCkgIT0gY3IwIHx8IGNzX2NoYW5nZSB8fCBjbGtfZGl2IHx8IGltYXNrKSB7CiAJCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOwogCi0JCWlmIChkd19yZWFkdyhkd3MsIGN0cmwwKSAhPSBjcjApCi0JCQlkd193cml0ZXcoZHdzLCBjdHJsMCwgY3IwKTsKKwkJaWYgKGR3X3JlYWR3KGR3cywgRFdfU1BJX0NUUkwwKSAhPSBjcjApCisJCQlkd193cml0ZXcoZHdzLCBEV19TUElfQ1RSTDAsIGNyMCk7CiAKIAkJc3BpX3NldF9jbGsoZHdzLCBjbGtfZGl2ID8gY2xrX2RpdiA6IGNoaXAtPmNsa19kaXYpOwogCQlzcGlfY2hpcF9zZWwoZHdzLCBzcGktPmNoaXBfc2VsZWN0KTsKQEAgLTUzNCw3ICs1MzUsNyBAQAogCQlpZiAoaW1hc2spCiAJCQlzcGlfdW1hc2tfaW50cihkd3MsIGltYXNrKTsKIAkJaWYgKHR4aW50X2xldmVsKQotCQkJZHdfd3JpdGV3KGR3cywgdHhmbHRyLCB0eGludF9sZXZlbCk7CisJCQlkd193cml0ZXcoZHdzLCBEV19TUElfVFhGTFRSLCB0eGludF9sZXZlbCk7CiAKIAkJc3BpX2VuYWJsZV9jaGlwKGR3cywgMSk7CiAJCWlmIChjc19jaGFuZ2UpCkBAIC03OTAsMTMgKzc5MSwxMyBAQAogCWlmICghZHdzLT5maWZvX2xlbikgewogCQl1MzIgZmlmbzsKIAkJZm9yIChmaWZvID0gMjsgZmlmbyA8PSAyNTc7IGZpZm8rKykgewotCQkJZHdfd3JpdGV3KGR3cywgdHhmbHRyLCBmaWZvKTsKLQkJCWlmIChmaWZvICE9IGR3X3JlYWR3KGR3cywgdHhmbHRyKSkKKwkJCWR3X3dyaXRldyhkd3MsIERXX1NQSV9UWEZMVFIsIGZpZm8pOworCQkJaWYgKGZpZm8gIT0gZHdfcmVhZHcoZHdzLCBEV19TUElfVFhGTFRSKSkKIAkJCQlicmVhazsKIAkJfQogCiAJCWR3cy0+Zmlmb19sZW4gPSAoZmlmbyA9PSAyNTcpID8gMCA6IGZpZm87Ci0JCWR3X3dyaXRldyhkd3MsIHR4Zmx0ciwgMCk7CisJCWR3X3dyaXRldyhkd3MsIERXX1NQSV9UWEZMVFIsIDApOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LmggYi9kcml2ZXJzL3NwaS9zcGktZHcuaAppbmRleCA4YjdiMDdiLi45YzU3YzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZHcuaAorKysgYi9kcml2ZXJzL3NwaS9zcGktZHcuaApAQCAtNCw2ICs0LDMzIEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCisvKiBSZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIERXX1NQSV9DVFJMMAkJCTB4MDAKKyNkZWZpbmUgRFdfU1BJX0NUUkwxCQkJMHgwNAorI2RlZmluZSBEV19TUElfU1NJRU5SCQkJMHgwOAorI2RlZmluZSBEV19TUElfTVdDUgkJCTB4MGMKKyNkZWZpbmUgRFdfU1BJX1NFUgkJCTB4MTAKKyNkZWZpbmUgRFdfU1BJX0JBVURSCQkJMHgxNAorI2RlZmluZSBEV19TUElfVFhGTFRSCQkJMHgxOAorI2RlZmluZSBEV19TUElfUlhGTFRSCQkJMHgxYworI2RlZmluZSBEV19TUElfVFhGTFIJCQkweDIwCisjZGVmaW5lIERXX1NQSV9SWEZMUgkJCTB4MjQKKyNkZWZpbmUgRFdfU1BJX1NSCQkJMHgyOAorI2RlZmluZSBEV19TUElfSU1SCQkJMHgyYworI2RlZmluZSBEV19TUElfSVNSCQkJMHgzMAorI2RlZmluZSBEV19TUElfUklTUgkJCTB4MzQKKyNkZWZpbmUgRFdfU1BJX1RYT0lDUgkJCTB4MzgKKyNkZWZpbmUgRFdfU1BJX1JYT0lDUgkJCTB4M2MKKyNkZWZpbmUgRFdfU1BJX1JYVUlDUgkJCTB4NDAKKyNkZWZpbmUgRFdfU1BJX01TVElDUgkJCTB4NDQKKyNkZWZpbmUgRFdfU1BJX0lDUgkJCTB4NDgKKyNkZWZpbmUgRFdfU1BJX0RNQUNSCQkJMHg0YworI2RlZmluZSBEV19TUElfRE1BVERMUgkJCTB4NTAKKyNkZWZpbmUgRFdfU1BJX0RNQVJETFIJCQkweDU0CisjZGVmaW5lIERXX1NQSV9JRFIJCQkweDU4CisjZGVmaW5lIERXX1NQSV9WRVJTSU9OCQkJMHg1YworI2RlZmluZSBEV19TUElfRFIJCQkweDYwCisKIC8qIEJpdCBmaWVsZHMgaW4gQ1RSTFIwICovCiAjZGVmaW5lIFNQSV9ERlNfT0ZGU0VUCQkJMAogCkBAIC01NSwzNSArODIsNiBAQAogCVNTSV9OU19NSUNST1dJUkUsCiB9OwogCi1zdHJ1Y3QgZHdfc3BpX3JlZyB7Ci0JdTMyCWN0cmwwOwotCXUzMgljdHJsMTsKLQl1MzIJc3NpZW5yOwotCXUzMgltd2NyOwotCXUzMglzZXI7Ci0JdTMyCWJhdWRyOwotCXUzMgl0eGZsdHI7Ci0JdTMyCXJ4Zmx0cjsKLQl1MzIJdHhmbHI7Ci0JdTMyCXJ4ZmxyOwotCXUzMglzcjsKLQl1MzIJaW1yOwotCXUzMglpc3I7Ci0JdTMyCXJpc3I7Ci0JdTMyCXR4b2ljcjsKLQl1MzIJcnhvaWNyOwotCXUzMglyeHVpY3I7Ci0JdTMyCW1zdGljcjsKLQl1MzIJaWNyOwotCXUzMglkbWFjcjsKLQl1MzIJZG1hdGRscjsKLQl1MzIJZG1hcmRscjsKLQl1MzIJaWRyOwotCXUzMgl2ZXJzaW9uOwotCXUzMglkcjsJCS8qIEN1cnJlbnRseSBvcGVyIGFzIDMyIGJpdHMsCi0JCQkJdGhvdWdoIG9ubHkgbG93IDE2IGJpdHMgbWF0dGVycyAqLwotfSBfX3BhY2tlZDsKLQogc3RydWN0IGR3X3NwaTsKIHN0cnVjdCBkd19zcGlfZG1hX29wcyB7CiAJaW50ICgqZG1hX2luaXQpKHN0cnVjdCBkd19zcGkgKmR3cyk7CkBAIC0xNjEsMjMgKzE1OSwzNCBAQAogI2VuZGlmCiB9OwogCi0jZGVmaW5lIGR3X3JlYWRsKGR3LCBuYW1lKSBcCi0JX19yYXdfcmVhZGwoJigoKHN0cnVjdCBkd19zcGlfcmVnICopZHctPnJlZ3MpLT5uYW1lKSkKLSNkZWZpbmUgZHdfd3JpdGVsKGR3LCBuYW1lLCB2YWwpIFwKLQlfX3Jhd193cml0ZWwoKHZhbCksICYoKChzdHJ1Y3QgZHdfc3BpX3JlZyAqKWR3LT5yZWdzKS0+bmFtZSkpCi0jZGVmaW5lIGR3X3JlYWR3KGR3LCBuYW1lKSBcCi0JX19yYXdfcmVhZHcoJigoKHN0cnVjdCBkd19zcGlfcmVnICopZHctPnJlZ3MpLT5uYW1lKSkKLSNkZWZpbmUgZHdfd3JpdGV3KGR3LCBuYW1lLCB2YWwpIFwKLQlfX3Jhd193cml0ZXcoKHZhbCksICYoKChzdHJ1Y3QgZHdfc3BpX3JlZyAqKWR3LT5yZWdzKS0+bmFtZSkpCitzdGF0aWMgaW5saW5lIHUzMiBkd19yZWFkbChzdHJ1Y3QgZHdfc3BpICpkd3MsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGR3cy0+cmVncyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkd193cml0ZWwoc3RydWN0IGR3X3NwaSAqZHdzLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIGR3cy0+cmVncyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGR3X3JlYWR3KHN0cnVjdCBkd19zcGkgKmR3cywgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZHcoZHdzLT5yZWdzICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR3X3dyaXRldyhzdHJ1Y3QgZHdfc3BpICpkd3MsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCit7CisJX19yYXdfd3JpdGV3KHZhbCwgZHdzLT5yZWdzICsgb2Zmc2V0KTsKK30KIAogc3RhdGljIGlubGluZSB2b2lkIHNwaV9lbmFibGVfY2hpcChzdHJ1Y3QgZHdfc3BpICpkd3MsIGludCBlbmFibGUpCiB7Ci0JZHdfd3JpdGVsKGR3cywgc3NpZW5yLCAoZW5hYmxlID8gMSA6IDApKTsKKwlkd193cml0ZWwoZHdzLCBEV19TUElfU1NJRU5SLCAoZW5hYmxlID8gMSA6IDApKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNwaV9zZXRfY2xrKHN0cnVjdCBkd19zcGkgKmR3cywgdTE2IGRpdikKIHsKLQlkd193cml0ZWwoZHdzLCBiYXVkciwgZGl2KTsKKwlkd193cml0ZWwoZHdzLCBEV19TUElfQkFVRFIsIGRpdik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzcGlfY2hpcF9zZWwoc3RydWN0IGR3X3NwaSAqZHdzLCB1MTYgY3MpCkBAIC0xODgsNyArMTk3LDcgQEAKIAlpZiAoZHdzLT5jc19jb250cm9sKQogCQlkd3MtPmNzX2NvbnRyb2woMSk7CiAKLQlkd193cml0ZWwoZHdzLCBzZXIsIDEgPDwgY3MpOworCWR3X3dyaXRlbChkd3MsIERXX1NQSV9TRVIsIDEgPDwgY3MpOwogfQogCiAvKiBEaXNhYmxlIElSUSBiaXRzICovCkBAIC0xOTYsOCArMjA1LDggQEAKIHsKIAl1MzIgbmV3X21hc2s7CiAKLQluZXdfbWFzayA9IGR3X3JlYWRsKGR3cywgaW1yKSAmIH5tYXNrOwotCWR3X3dyaXRlbChkd3MsIGltciwgbmV3X21hc2spOworCW5ld19tYXNrID0gZHdfcmVhZGwoZHdzLCBEV19TUElfSU1SKSAmIH5tYXNrOworCWR3X3dyaXRlbChkd3MsIERXX1NQSV9JTVIsIG5ld19tYXNrKTsKIH0KIAogLyogRW5hYmxlIElSUSBiaXRzICovCkBAIC0yMDUsOCArMjE0LDggQEAKIHsKIAl1MzIgbmV3X21hc2s7CiAKLQluZXdfbWFzayA9IGR3X3JlYWRsKGR3cywgaW1yKSB8IG1hc2s7Ci0JZHdfd3JpdGVsKGR3cywgaW1yLCBuZXdfbWFzayk7CisJbmV3X21hc2sgPSBkd19yZWFkbChkd3MsIERXX1NQSV9JTVIpIHwgbWFzazsKKwlkd193cml0ZWwoZHdzLCBEV19TUElfSU1SLCBuZXdfbWFzayk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZXA5M3h4LmMgYi9kcml2ZXJzL3NwaS9zcGktZXA5M3h4LmMKaW5kZXggMWNmNjQ1NDcuLjBhMjgyZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1lcDkzeHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktZXA5M3h4LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtMTAyNSw3ICsxMDI2LDcgQEAKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWVzcGktPnplcm9wYWdlKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZXA5M3h4X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgZXA5M3h4X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IGVwOTN4eF9zcGlfaW5mbyAqaW5mbzsKQEAgLTExNTAsNyArMTE1MSw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBlcDkzeHhfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgZXA5M3h4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGVwOTN4eF9zcGkgKmVzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CkBAIC0xMTk2LDIwICsxMTk3LDEwIEBACiAJCS5uYW1lCT0gImVwOTN4eC1zcGkiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAotCS5yZW1vdmUJCT0gX19leGl0X3AoZXA5M3h4X3NwaV9yZW1vdmUpLAorCS5wcm9iZQkJPSBlcDkzeHhfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZXA5M3h4X3NwaV9yZW1vdmUpLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgZXA5M3h4X3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZXA5M3h4X3NwaV9kcml2ZXIsIGVwOTN4eF9zcGlfcHJvYmUpOwotfQotbW9kdWxlX2luaXQoZXA5M3h4X3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGVwOTN4eF9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZlcDkzeHhfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChlcDkzeHhfc3BpX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihlcDkzeHhfc3BpX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiRVA5M3h4IFNQSSBDb250cm9sbGVyIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTWlrYSBXZXN0ZXJiZXJnIDxtaWthLndlc3RlcmJlcmdAaWtpLmZpPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYwppbmRleCA1NGU0OTlkLi5kNzcwZjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWVzcGkuYwpAQCAtNzQ0LDE4ICs3NDQsNyBAQAogCS5wcm9iZQkJPSBvZl9mc2xfZXNwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9mX2ZzbF9lc3BpX3JlbW92ZSksCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBmc2xfZXNwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNsX2VzcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KGZzbF9lc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZnNsX2VzcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmc2xfZXNwaV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoZnNsX2VzcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGZzbF9lc3BpX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIk1pbmdrYWkgSHUiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRW5oYW5jZWQgRnJlZXNjYWxlIFNQSSBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMgYi9kcml2ZXJzL3NwaS9zcGktZ3Bpby5jCmluZGV4IDBlODhhYjcuLmUwOTNkM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWdwaW8uYwpAQCAtMTgsNiArMTgsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpAQCAtMzExLDcgKzMxMiw3IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzcGlfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgc3BpX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQJCQkJc3RhdHVzOwogCXN0cnVjdCBzcGlfbWFzdGVyCQkqbWFzdGVyOwpAQCAtMzc5LDcgKzM4MCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBfX2V4aXQgc3BpX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzcGlfZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3BpX2dwaW8JCQkqc3BpX2dwaW87CiAJc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEJKnBkYXRhOwpAQCAtNDA4LDIxICs0MDksMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwaV9ncGlvX2RyaXZlciA9IHsKIAkuZHJpdmVyLm5hbWUJPSBEUklWRVJfTkFNRSwKIAkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLnJlbW92ZQkJPSBfX2V4aXRfcChzcGlfZ3Bpb19yZW1vdmUpLAorCS5wcm9iZQkJPSBzcGlfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNwaV9ncGlvX3JlbW92ZSksCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBzcGlfZ3Bpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmc3BpX2dwaW9fZHJpdmVyLCBzcGlfZ3Bpb19wcm9iZSk7Ci19Ci1tb2R1bGVfaW5pdChzcGlfZ3Bpb19pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNwaV9ncGlvX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpX2dwaW9fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHNwaV9ncGlvX2V4aXQpOwotCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNwaV9ncGlvX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiU1BJIG1hc3RlciBkcml2ZXIgdXNpbmcgZ2VuZXJpYyBiaXRiYW5nZWQgR1BJTyAiKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJyb3duZWxsIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktaW14LmMgYi9kcml2ZXJzL3NwaS9zcGktaW14LmMKaW5kZXggZmE1OTRkNi4uYzZlNjk3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWlteC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1pbXguYwpAQCAtOTI5LDE5ICs5MjksNyBAQAogCS5wcm9iZSA9IHNwaV9pbXhfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNwaV9pbXhfcmVtb3ZlKSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNwaV9pbXhfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNwaV9pbXhfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNwaV9pbXhfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzcGlfaW14X2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHNwaV9pbXhfaW5pdCk7Ci1tb2R1bGVfZXhpdChzcGlfaW14X2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzcGlfaW14X2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiU1BJIE1hc3RlciBDb250cm9sbGVyIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTEyeC1wc2MuYwppbmRleCA2YTViNDIzLi40YzYzZjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktbXBjNTEyeC1wc2MuYworKysgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTEyeC1wc2MuYwpAQCAtNTU5LDE4ICs1NTksNyBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBtcGM1MTJ4X3BzY19zcGlfb2ZfbWF0Y2gsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1wYzUxMnhfcHNjX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXBjNTEyeF9wc2Nfc3BpX29mX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtcGM1MTJ4X3BzY19zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtcGM1MTJ4X3BzY19zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtcGM1MTJ4X3BzY19zcGlfb2ZfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1wYzUxMnhfcHNjX3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXBjNTEyeF9wc2Nfc3BpX29mX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkpvaG4gUmlnYnkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTVBDNTEyeCBQU0MgU1BJIERyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC1wc2MuYwppbmRleCBlMzBiYWYwLi42NjA0NzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC1wc2MuYworKysgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC1wc2MuYwpAQCAtNTExLDE4ICs1MTEsNyBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBtcGM1Mnh4X3BzY19zcGlfb2ZfbWF0Y2gsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1wYzUyeHhfcHNjX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXBjNTJ4eF9wc2Nfc3BpX29mX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtcGM1Mnh4X3BzY19zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtcGM1Mnh4X3BzY19zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtcGM1Mnh4X3BzY19zcGlfb2ZfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1wYzUyeHhfcHNjX3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXBjNTJ4eF9wc2Nfc3BpX29mX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkRyYWdvcyBDYXJwIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk1QQzUyeHggUFNDIFNQSSBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LmMgYi9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC5jCmluZGV4IDAxNWE5NzQuLjU3NjMzZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHguYwpAQCAtNTY0LDE2ICs1NjQsNCBAQAogCS5wcm9iZSA9IG1wYzUyeHhfc3BpX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChtcGM1Mnh4X3NwaV9yZW1vdmUpLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgbXBjNTJ4eF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1wYzUyeHhfc3BpX29mX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtcGM1Mnh4X3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG1wYzUyeHhfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXBjNTJ4eF9zcGlfb2ZfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1wYzUyeHhfc3BpX2V4aXQpOwotCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1wYzUyeHhfc3BpX29mX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMgYi9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMKaW5kZXggYzBhNmNlOC4uZTc2MzI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1udWM5MDAuYwpAQCAtNDg0LDE5ICs0ODQsNyBAQAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKLQotc3RhdGljIGludCBfX2luaXQgbnVjOTAwX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbnVjOTAwX3NwaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbnVjOTAwX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm51YzkwMF9zcGlfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobnVjOTAwX3NwaV9pbml0KTsKLW1vZHVsZV9leGl0KG51YzkwMF9zcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG51YzkwMF9zcGlfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJudWM5MDAgc3BpIGRyaXZlciEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vYy10aW55LmMgYi9kcml2ZXJzL3NwaS9zcGktb2MtdGlueS5jCmluZGV4IGYxYmRlNjYuLjY5ODAxOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vYy10aW55LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9jLXRpbnkuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KQEAgLTQwNiwxOCArNDA3LDcgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gdGlueV9zcGlfbWF0Y2gsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRpbnlfc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0aW55X3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQodGlueV9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0aW55X3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRpbnlfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdCh0aW55X3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGlueV9zcGlfZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJPcGVuQ29yZXMgdGlueSBTUEkgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJUaG9tYXMgQ2hvdSA8dGhvbWFzQHd5dHJvbi5jb20udHc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb21hcC11d2lyZS5jIGIvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYwppbmRleCAwMGE4ZTlkLi42MTBmNzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb21hcC11d2lyZS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwLXV3aXJlLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwMi1tY3NwaS5jCmluZGV4IGZkZTNhMmQuLjMyMmJlN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwMi1tY3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwMi1tY3NwaS5jCkBAIC0xMTE2LDE1ICsxMTE2LDE2IEBACiAJCXN0YXR1cyA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyMTsKIAl9CisKKwlyLT5zdGFydCArPSBwZGF0YS0+cmVnc19vZmZzZXQ7CisJci0+ZW5kICs9IHBkYXRhLT5yZWdzX29mZnNldDsKKwltY3NwaS0+cGh5cyA9IHItPnN0YXJ0OwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpLAogCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpKSkgewogCQlzdGF0dXMgPSAtRUJVU1k7CiAJCWdvdG8gZXJyMTsKIAl9CiAKLQlyLT5zdGFydCArPSBwZGF0YS0+cmVnc19vZmZzZXQ7Ci0Jci0+ZW5kICs9IHBkYXRhLT5yZWdzX29mZnNldDsKLQltY3NwaS0+cGh5cyA9IHItPnN0YXJ0OwogCW1jc3BpLT5iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CiAJaWYgKCFtY3NwaS0+YmFzZSkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBpb3JlbWFwIE1DU1BJXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jIGIvZHJpdmVycy9zcGkvc3BpLW9yaW9uLmMKaW5kZXggOTQyMWEzOS4uMTM0NDhjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW9yaW9uLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9yaW9uLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvb3Jpb25fc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkJIm9yaW9uX3NwaSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jIGIvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKaW5kZXggNzMwYjRhMy4uZjEwM2U0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKQEAgLTExMyw3ICsxMTMsNiBAQAogI2RlZmluZSBTU1BfQ1IwX01BU0tfQ1NTX1NUCSgweDFGVUwgPDwgMTYpCiAjZGVmaW5lIFNTUF9DUjBfTUFTS19GUkZfU1QJKDB4M1VMIDw8IDIxKQogCi0KIC8qCiAgKiBTU1AgQ29udHJvbCBSZWdpc3RlciAwICAtIFNTUF9DUjEKICAqLwpAQCAtMjgzLDcgKzI4Miw2IEBACiAKICNkZWZpbmUgU1BJX1BPTExJTkdfVElNRU9VVCAxMDAwCiAKLQogLyoKICAqIFRoZSB0eXBlIG9mIHJlYWRpbmcgZ29pbmcgb24gb24gdGhpcyBjaGlwCiAgKi8KQEAgLTUxNSw5ICs1MTMsNiBAQAogCWlmIChtc2ctPmNvbXBsZXRlKQogCQltc2ctPmNvbXBsZXRlKG1zZy0+Y29udGV4dCk7CiAJLyogVGhpcyBtZXNzYWdlIGlzIGNvbXBsZXRlZCwgc28gbGV0J3MgdHVybiBvZmYgdGhlIGNsb2NrcyAmIHBvd2VyICovCi0JY2xrX2Rpc2FibGUocGwwMjItPmNsayk7Ci0JYW1iYV9wY2xrX2Rpc2FibGUocGwwMjItPmFkZXYpOwotCWFtYmFfdmNvcmVfZGlzYWJsZShwbDAyMi0+YWRldik7CiAJcG1fcnVudGltZV9wdXQoJnBsMDIyLT5hZGV2LT5kZXYpOwogfQogCkBAIC03NTIsNyArNzQ3LDYgQEAKIAkgKi8KIH0KIAotCiAvKioKICAqIG5leHRfdHJhbnNmZXIgLSBNb3ZlIHRvIHRoZSBOZXh0IHRyYW5zZmVyIGluIHRoZSBjdXJyZW50IHNwaSBtZXNzYWdlCiAgKiBAcGwwMjI6IFNTUCBkcml2ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQpAQCAtMTAxOSwxNCArMTAxMywxNCBAQAogCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcodHhjaGFuLCAmdHhfY29uZik7CiAKIAkvKiBDcmVhdGUgc2dsaXN0cyBmb3IgdGhlIHRyYW5zZmVycyAqLwotCXBhZ2VzID0gKHBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbiA+PiBQQUdFX1NISUZUKSArIDE7CisJcGFnZXMgPSBESVZfUk9VTkRfVVAocGwwMjItPmN1cl90cmFuc2Zlci0+bGVuLCBQQUdFX1NJWkUpOwogCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJ1c2luZyAlZCBwYWdlcyBmb3IgdHJhbnNmZXJcbiIsIHBhZ2VzKTsKIAotCXJldCA9IHNnX2FsbG9jX3RhYmxlKCZwbDAyMi0+c2d0X3J4LCBwYWdlcywgR0ZQX0tFUk5FTCk7CisJcmV0ID0gc2dfYWxsb2NfdGFibGUoJnBsMDIyLT5zZ3RfcngsIHBhZ2VzLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9hbGxvY19yeF9zZzsKIAotCXJldCA9IHNnX2FsbG9jX3RhYmxlKCZwbDAyMi0+c2d0X3R4LCBwYWdlcywgR0ZQX0tFUk5FTCk7CisJcmV0ID0gc2dfYWxsb2NfdGFibGUoJnBsMDIyLT5zZ3RfdHgsIHBhZ2VzLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9hbGxvY190eF9zZzsKIApAQCAtMTUzNCw4ICsxNTI4LDcgQEAKIAkvKiBJbml0aWFsIG1lc3NhZ2Ugc3RhdGUgKi8KIAlwbDAyMi0+Y3VyX21zZy0+c3RhdGUgPSBTVEFURV9TVEFSVDsKIAlwbDAyMi0+Y3VyX3RyYW5zZmVyID0gbGlzdF9lbnRyeShwbDAyMi0+Y3VyX21zZy0+dHJhbnNmZXJzLm5leHQsCi0JCQkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAotCQkJCQkgICAgdHJhbnNmZXJfbGlzdCk7CisJCQkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLCB0cmFuc2Zlcl9saXN0KTsKIAogCS8qIFNldHVwIHRoZSBTUEkgdXNpbmcgdGhlIHBlciBjaGlwIGNvbmZpZ3VyYXRpb24gKi8KIAlwbDAyMi0+Y3VyX2NoaXAgPSBzcGlfZ2V0X2N0bGRhdGEocGwwMjItPmN1cl9tc2ctPnNwaSk7CkBAIC0xNTQ1LDkgKzE1MzgsNiBAQAogCSAqIChwb2xsL2ludGVycnVwdC9ETUEpCiAJICovCiAJcG1fcnVudGltZV9nZXRfc3luYygmcGwwMjItPmFkZXYtPmRldik7Ci0JYW1iYV92Y29yZV9lbmFibGUocGwwMjItPmFkZXYpOwotCWFtYmFfcGNsa19lbmFibGUocGwwMjItPmFkZXYpOwotCWNsa19lbmFibGUocGwwMjItPmNsayk7CiAJcmVzdG9yZV9zdGF0ZShwbDAyMik7CiAJZmx1c2gocGwwMjIpOwogCkBAIC0xNTU3LDcgKzE1NDcsNiBAQAogCQlkb19pbnRlcnJ1cHRfZG1hX3RyYW5zZmVyKHBsMDIyKTsKIH0KIAotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3F1ZXVlKHN0cnVjdCBwbDAyMiAqcGwwMjIpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJnBsMDIyLT5xdWV1ZSk7CkBAIC0xNTY2LDggKzE1NTUsOCBAQAogCXBsMDIyLT5ydW5uaW5nID0gZmFsc2U7CiAJcGwwMjItPmJ1c3kgPSBmYWxzZTsKIAotCXRhc2tsZXRfaW5pdCgmcGwwMjItPnB1bXBfdHJhbnNmZXJzLAotCQkJcHVtcF90cmFuc2ZlcnMsCSh1bnNpZ25lZCBsb25nKXBsMDIyKTsKKwl0YXNrbGV0X2luaXQoJnBsMDIyLT5wdW1wX3RyYW5zZmVycywgcHVtcF90cmFuc2ZlcnMsCisJCQkodW5zaWduZWQgbG9uZylwbDAyMik7CiAKIAlJTklUX1dPUksoJnBsMDIyLT5wdW1wX21lc3NhZ2VzLCBwdW1wX21lc3NhZ2VzKTsKIAlwbDAyMi0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCkBAIC0xNTc4LDcgKzE1NjcsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgc3RhcnRfcXVldWUoc3RydWN0IHBsMDIyICpwbDAyMikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTYwMSw3ICsxNTg5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IHN0b3BfcXVldWUoc3RydWN0IHBsMDIyICpwbDAyMikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTc5Nyw3MSArMTc4NCw3MCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNhbGN1bGF0ZV9lZmZlY3RpdmVfZnJlcShzdHJ1Y3QgcGwwMjIgKnBsMDIyLAotCQkJCSAgICBpbnQgZnJlcSwKLQkJCQkgICAgc3RydWN0IHNzcF9jbG9ja19wYXJhbXMgKmNsa19mcmVxKQorc3RhdGljIGlubGluZSB1MzIgc3BpX3JhdGUodTMyIHJhdGUsIHUxNiBjcHNkdnNyLCB1MTYgc2NyKQoreworCXJldHVybiByYXRlIC8gKGNwc2R2c3IgKiAoMSArIHNjcikpOworfQorCitzdGF0aWMgaW50IGNhbGN1bGF0ZV9lZmZlY3RpdmVfZnJlcShzdHJ1Y3QgcGwwMjIgKnBsMDIyLCBpbnQgZnJlcSwgc3RydWN0CisJCQkJICAgIHNzcF9jbG9ja19wYXJhbXMgKiBjbGtfZnJlcSkKIHsKIAkvKiBMZXRzIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IHBhcmFtZXRlcnMgKi8KLQl1MTYgY3BzZHZzciA9IDI7Ci0JdTE2IHNjciA9IDA7Ci0JYm9vbCBmcmVxX2ZvdW5kID0gZmFsc2U7Ci0JdTMyIHJhdGU7Ci0JdTMyIG1heF90Y2xrOwotCXUzMiBtaW5fdGNsazsKKwl1MTYgY3BzZHZzciA9IENQU0RWUl9NSU4sIHNjciA9IFNDUl9NSU47CisJdTMyIHJhdGUsIG1heF90Y2xrLCBtaW5fdGNsaywgYmVzdF9mcmVxID0gMCwgYmVzdF9jcHNkdnNyID0gMCwKKwkJYmVzdF9zY3IgPSAwLCB0bXAsIGZvdW5kID0gMDsKIAogCXJhdGUgPSBjbGtfZ2V0X3JhdGUocGwwMjItPmNsayk7CiAJLyogY3BzZHZzY3IgPSAyICYgc2NyIDAgKi8KLQltYXhfdGNsayA9IChyYXRlIC8gKENQU0RWUl9NSU4gKiAoMSArIFNDUl9NSU4pKSk7CisJbWF4X3RjbGsgPSBzcGlfcmF0ZShyYXRlLCBDUFNEVlJfTUlOLCBTQ1JfTUlOKTsKIAkvKiBjcHNkdnNyID0gMjU0ICYgc2NyID0gMjU1ICovCi0JbWluX3RjbGsgPSAocmF0ZSAvIChDUFNEVlJfTUFYICogKDEgKyBTQ1JfTUFYKSkpOworCW1pbl90Y2xrID0gc3BpX3JhdGUocmF0ZSwgQ1BTRFZSX01BWCwgU0NSX01BWCk7CiAKLQlpZiAoKGZyZXEgPD0gbWF4X3RjbGspICYmIChmcmVxID49IG1pbl90Y2xrKSkgewotCQl3aGlsZSAoY3BzZHZzciA8PSBDUFNEVlJfTUFYICYmICFmcmVxX2ZvdW5kKSB7Ci0JCQl3aGlsZSAoc2NyIDw9IFNDUl9NQVggJiYgIWZyZXFfZm91bmQpIHsKLQkJCQlpZiAoKHJhdGUgLwotCQkJCSAgICAgKGNwc2R2c3IgKiAoMSArIHNjcikpKSA+IGZyZXEpCi0JCQkJCXNjciArPSAxOwotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBUaGlzIGJvb2wgaXMgbWFkZSB0cnVlIHdoZW4KLQkJCQkJICogZWZmZWN0aXZlIGZyZXF1ZW5jeSA+PQotCQkJCQkgKiB0YXJnZXQgZnJlcXVlbmN5IGlzIGZvdW5kCi0JCQkJCSAqLwotCQkJCQlmcmVxX2ZvdW5kID0gdHJ1ZTsKLQkJCQkJaWYgKChyYXRlIC8KLQkJCQkJICAgICAoY3BzZHZzciAqICgxICsgc2NyKSkpICE9IGZyZXEpIHsKLQkJCQkJCWlmIChzY3IgPT0gU0NSX01JTikgewotCQkJCQkJCWNwc2R2c3IgLT0gMjsKLQkJCQkJCQlzY3IgPSBTQ1JfTUFYOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJc2NyIC09IDE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZyZXFfZm91bmQpIHsKLQkJCQljcHNkdnNyICs9IDI7Ci0JCQkJc2NyID0gU0NSX01JTjsKLQkJCX0KLQkJfQotCQlpZiAoY3BzZHZzciAhPSAwKSB7Ci0JCQlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LAotCQkJCSJTU1AgRWZmZWN0aXZlIEZyZXF1ZW5jeSBpcyAldVxuIiwKLQkJCQkocmF0ZSAvIChjcHNkdnNyICogKDEgKyBzY3IpKSkpOwotCQkJY2xrX2ZyZXEtPmNwc2R2c3IgPSAodTgpIChjcHNkdnNyICYgMHhGRik7Ci0JCQljbGtfZnJlcS0+c2NyID0gKHU4KSAoc2NyICYgMHhGRik7Ci0JCQlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LAotCQkJCSJTU1AgY3BzZHZzciA9ICVkLCBzY3IgPSAlZFxuIiwKLQkJCQljbGtfZnJlcS0+Y3BzZHZzciwgY2xrX2ZyZXEtPnNjcik7Ci0JCX0KLQl9IGVsc2UgeworCWlmICghKChmcmVxIDw9IG1heF90Y2xrKSAmJiAoZnJlcSA+PSBtaW5fdGNsaykpKSB7CiAJCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCiAJCQkiY29udHJvbGxlciBkYXRhIGlzIGluY29ycmVjdDogb3V0IG9mIHJhbmdlIGZyZXF1ZW5jeSIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwkvKgorCSAqIGJlc3RfZnJlcSB3aWxsIGdpdmUgY2xvc2VzdCBwb3NzaWJsZSBhdmFpbGFibGUgcmF0ZSAoPD0gcmVxdWVzdGVkCisJICogZnJlcSkgZm9yIGFsbCB2YWx1ZXMgb2Ygc2NyICYgY3BzZHZzci4KKwkgKi8KKwl3aGlsZSAoKGNwc2R2c3IgPD0gQ1BTRFZSX01BWCkgJiYgIWZvdW5kKSB7CisJCXdoaWxlIChzY3IgPD0gU0NSX01BWCkgeworCQkJdG1wID0gc3BpX3JhdGUocmF0ZSwgY3BzZHZzciwgc2NyKTsKKworCQkJaWYgKHRtcCA+IGZyZXEpCisJCQkJc2NyKys7CisJCQkvKgorCQkJICogSWYgZm91bmQgZXhhY3QgdmFsdWUsIHVwZGF0ZSBhbmQgYnJlYWsuCisJCQkgKiBJZiBmb3VuZCBtb3JlIGNsb3NlciB2YWx1ZSwgdXBkYXRlIGFuZCBjb250aW51ZS4KKwkJCSAqLworCQkJZWxzZSBpZiAoKHRtcCA9PSBmcmVxKSB8fCAodG1wID4gYmVzdF9mcmVxKSkgeworCQkJCWJlc3RfZnJlcSA9IHRtcDsKKwkJCQliZXN0X2Nwc2R2c3IgPSBjcHNkdnNyOworCQkJCWJlc3Rfc2NyID0gc2NyOworCisJCQkJaWYgKHRtcCA9PSBmcmVxKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXNjcisrOworCQl9CisJCWNwc2R2c3IgKz0gMjsKKwkJc2NyID0gU0NSX01JTjsKKwl9CisKKwljbGtfZnJlcS0+Y3BzZHZzciA9ICh1OCkgKGJlc3RfY3BzZHZzciAmIDB4RkYpOworCWNsa19mcmVxLT5zY3IgPSAodTgpIChiZXN0X3NjciAmIDB4RkYpOworCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsCisJCSJTU1AgVGFyZ2V0IEZyZXF1ZW5jeSBpczogJXUsIEVmZmVjdGl2ZSBGcmVxdWVuY3kgaXMgJXVcbiIsCisJCWZyZXEsIGJlc3RfZnJlcSk7CisJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwgIlNTUCBjcHNkdnNyID0gJWQsIHNjciA9ICVkXG4iLAorCQljbGtfZnJlcS0+Y3BzZHZzciwgY2xrX2ZyZXEtPnNjcik7CisKIAlyZXR1cm4gMDsKIH0KIAotCiAvKgogICogQSBwaWVjZSBvZiBkZWZhdWx0IGNoaXAgaW5mbyB1bmxlc3MgdGhlIHBsYXRmb3JtCiAgKiBzdXBwbGllcyBpdC4KQEAgLTE4NzksNyArMTg2NSw2IEBACiAJLmNzX2NvbnRyb2wgPSBudWxsX2NzX2NvbnRyb2wsCiB9OwogCi0KIC8qKgogICogcGwwMjJfc2V0dXAgLSBzZXR1cCBmdW5jdGlvbiByZWdpc3RlcmVkIHRvIFNQSSBtYXN0ZXIgZnJhbWV3b3JrCiAgKiBAc3BpOiBzcGkgZGV2aWNlIHdoaWNoIGlzIHJlcXVlc3Rpbmcgc2V0dXAKQEAgLTE5NTYsNyArMTk0MSw2IEBACiAJCWdvdG8gZXJyX2NvbmZpZ19wYXJhbXM7CiAJfQogCi0KIAlzdGF0dXMgPSB2ZXJpZnlfY29udHJvbGxlcl9wYXJhbWV0ZXJzKHBsMDIyLCBjaGlwX2luZm8pOwogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJjb250cm9sbGVyIGRhdGEgaXMgaW5jb3JyZWN0Iik7CkBAIC0yMDk2LDcgKzIwODAsOCBAQAogCX0KIAlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjEsIFNTUF9ESVNBQkxFRCwgU1NQX0NSMV9NQVNLX1NTRSwgMSk7CiAJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBjaGlwX2luZm8tPmhpZXJhcmNoeSwgU1NQX0NSMV9NQVNLX01TLCAyKTsKLQlTU1BfV1JJVEVfQklUUyhjaGlwLT5jcjEsIGNoaXBfaW5mby0+c2xhdmVfdHhfZGlzYWJsZSwgU1NQX0NSMV9NQVNLX1NPRCwgMyk7CisJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBjaGlwX2luZm8tPnNsYXZlX3R4X2Rpc2FibGUsIFNTUF9DUjFfTUFTS19TT0QsCisJCTMpOwogCiAJLyogU2F2ZSBjb250cm9sbGVyX3N0YXRlICovCiAJc3BpX3NldF9jdGxkYXRhKHNwaSwgY2hpcCk7CkBAIC0yMTIyLDcgKzIxMDcsNiBAQAogCWtmcmVlKGNoaXApOwogfQogCi0KIHN0YXRpYyBpbnQgX19kZXZpbml0CiBwbDAyMl9wcm9iZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYsIGNvbnN0IHN0cnVjdCBhbWJhX2lkICppZCkKIHsKQEAgLTIxODYsOCArMjE3MCw2IEBACiAJfQogCXByaW50ayhLRVJOX0lORk8gInBsMDIyOiBtYXBwZWQgcmVnaXN0ZXJzIGZyb20gMHglMDh4IHRvICVwXG4iLAogCSAgICAgICBhZGV2LT5yZXMuc3RhcnQsIHBsMDIyLT52aXJ0YmFzZSk7Ci0JcG1fcnVudGltZV9lbmFibGUoZGV2KTsKLQlwbV9ydW50aW1lX3Jlc3VtZShkZXYpOwogCiAJcGwwMjItPmNsayA9IGNsa19nZXQoJmFkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihwbDAyMi0+Y2xrKSkgewpAQCAtMjE5Niw2ICsyMTc4LDEyIEBACiAJCWdvdG8gZXJyX25vX2NsazsKIAl9CiAKKwlzdGF0dXMgPSBjbGtfcHJlcGFyZShwbDAyMi0+Y2xrKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRldl9lcnIoJmFkZXYtPmRldiwgImNvdWxkIG5vdCBwcmVwYXJlIFNTUC9TUEkgYnVzIGNsb2NrXG4iKTsKKwkJZ290byAgZXJyX2Nsa19wcmVwOworCX0KKwogCS8qIERpc2FibGUgU1NQICovCiAJd3JpdGV3KChyZWFkdyhTU1BfQ1IxKHBsMDIyLT52aXJ0YmFzZSkpICYgKH5TU1BfQ1IxX01BU0tfU1NFKSksCiAJICAgICAgIFNTUF9DUjEocGwwMjItPnZpcnRiYXNlKSk7CkBAIC0yMjM1LDIyICsyMjIzLDIyIEBACiAJCWdvdG8gZXJyX3NwaV9yZWdpc3RlcjsKIAl9CiAJZGV2X2RiZyhkZXYsICJwcm9iZSBzdWNjZWVkZWRcbiIpOwotCS8qCi0JICogRGlzYWJsZSB0aGUgc2lsaWNvbiBibG9jayBwY2xrIGFuZCBhbnkgdm9sdGFnZSBkb21haW4gYW5kIGp1c3QKLQkgKiBwb3dlciBpdCB1cCBhbmQgY2xvY2sgaXQgd2hlbiBpdCdzIG5lZWRlZAotCSAqLwotCWFtYmFfcGNsa19kaXNhYmxlKGFkZXYpOwotCWFtYmFfdmNvcmVfZGlzYWJsZShhZGV2KTsKKworCS8qIGxldCBydW50aW1lIHBtIHB1dCBzdXNwZW5kICovCisJcG1fcnVudGltZV9wdXQoZGV2KTsKIAlyZXR1cm4gMDsKIAogIGVycl9zcGlfcmVnaXN0ZXI6CiAgZXJyX3N0YXJ0X3F1ZXVlOgogIGVycl9pbml0X3F1ZXVlOgogCWRlc3Ryb3lfcXVldWUocGwwMjIpOwotCXBsMDIyX2RtYV9yZW1vdmUocGwwMjIpOworCWlmIChwbGF0Zm9ybV9pbmZvLT5lbmFibGVfZG1hKQorCQlwbDAyMl9kbWFfcmVtb3ZlKHBsMDIyKTsKKwogCWZyZWVfaXJxKGFkZXYtPmlycVswXSwgcGwwMjIpOwotCXBtX3J1bnRpbWVfZGlzYWJsZSgmYWRldi0+ZGV2KTsKICBlcnJfbm9faXJxOgorCWNsa191bnByZXBhcmUocGwwMjItPmNsayk7CisgZXJyX2Nsa19wcmVwOgogCWNsa19wdXQocGwwMjItPmNsayk7CiAgZXJyX25vX2NsazoKIAlpb3VubWFwKHBsMDIyLT52aXJ0YmFzZSk7CkBAIC0yMjcxLDEzICsyMjU5LDIyIEBACiAJaWYgKCFwbDAyMikKIAkJcmV0dXJuIDA7CiAKKwkvKgorCSAqIHVuZG8gcG1fcnVudGltZV9wdXQoKSBpbiBwcm9iZS4gIEkgYXNzdW1lIHRoYXQgd2UncmUgbm90CisJICogYWNjZXNzaW5nIHRoZSBwcmltZWNlbGwgaGVyZS4KKwkgKi8KKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmYWRldi0+ZGV2KTsKKwogCS8qIFJlbW92ZSB0aGUgcXVldWUgKi8KIAlpZiAoZGVzdHJveV9xdWV1ZShwbDAyMikgIT0gMCkKIAkJZGV2X2VycigmYWRldi0+ZGV2LCAicXVldWUgcmVtb3ZlIGZhaWxlZFxuIik7CiAJbG9hZF9zc3BfZGVmYXVsdF9jb25maWcocGwwMjIpOwotCXBsMDIyX2RtYV9yZW1vdmUocGwwMjIpOworCWlmIChwbDAyMi0+bWFzdGVyX2luZm8tPmVuYWJsZV9kbWEpCisJCXBsMDIyX2RtYV9yZW1vdmUocGwwMjIpOworCiAJZnJlZV9pcnEoYWRldi0+aXJxWzBdLCBwbDAyMik7CiAJY2xrX2Rpc2FibGUocGwwMjItPmNsayk7CisJY2xrX3VucHJlcGFyZShwbDAyMi0+Y2xrKTsKIAljbGtfcHV0KHBsMDIyLT5jbGspOwogCWlvdW5tYXAocGwwMjItPnZpcnRiYXNlKTsKIAlhbWJhX3JlbGVhc2VfcmVnaW9ucyhhZGV2KTsKQEAgLTIyODgsNDYgKzIyODUsNzAgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBwbDAyMl9zdXNwZW5kKHN0cnVjdCBhbWJhX2RldmljZSAqYWRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorI2lmZGVmIENPTkZJR19TVVNQRU5ECitzdGF0aWMgaW50IHBsMDIyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBhbWJhX2dldF9kcnZkYXRhKGFkZXYpOworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgc3RhdHVzID0gMDsKIAogCXN0YXR1cyA9IHN0b3BfcXVldWUocGwwMjIpOwogCWlmIChzdGF0dXMpIHsKLQkJZGV2X3dhcm4oJmFkZXYtPmRldiwgInN1c3BlbmQgY2Fubm90IHN0b3AgcXVldWVcbiIpOworCQlkZXZfd2FybihkZXYsICJzdXNwZW5kIGNhbm5vdCBzdG9wIHF1ZXVlXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKLQlhbWJhX3Zjb3JlX2VuYWJsZShhZGV2KTsKLQlhbWJhX3BjbGtfZW5hYmxlKGFkZXYpOworCWFtYmFfdmNvcmVfZW5hYmxlKHBsMDIyLT5hZGV2KTsKKwlhbWJhX3BjbGtfZW5hYmxlKHBsMDIyLT5hZGV2KTsKIAlsb2FkX3NzcF9kZWZhdWx0X2NvbmZpZyhwbDAyMik7Ci0JYW1iYV9wY2xrX2Rpc2FibGUoYWRldik7Ci0JYW1iYV92Y29yZV9kaXNhYmxlKGFkZXYpOwotCWRldl9kYmcoJmFkZXYtPmRldiwgInN1c3BlbmRlZFxuIik7CisJYW1iYV9wY2xrX2Rpc2FibGUocGwwMjItPmFkZXYpOworCWFtYmFfdmNvcmVfZGlzYWJsZShwbDAyMi0+YWRldik7CisJZGV2X2RiZyhkZXYsICJzdXNwZW5kZWRcbiIpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBsMDIyX3Jlc3VtZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYpCitzdGF0aWMgaW50IHBsMDIyX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsMDIyICpwbDAyMiA9IGFtYmFfZ2V0X2RydmRhdGEoYWRldik7CisJc3RydWN0IHBsMDIyICpwbDAyMiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBzdGF0dXMgPSAwOwogCiAJLyogU3RhcnQgdGhlIHF1ZXVlIHJ1bm5pbmcgKi8KIAlzdGF0dXMgPSBzdGFydF9xdWV1ZShwbDAyMik7CiAJaWYgKHN0YXR1cykKLQkJZGV2X2VycigmYWRldi0+ZGV2LCAicHJvYmxlbSBzdGFydGluZyBxdWV1ZSAoJWQpXG4iLCBzdGF0dXMpOworCQlkZXZfZXJyKGRldiwgInByb2JsZW0gc3RhcnRpbmcgcXVldWUgKCVkKVxuIiwgc3RhdHVzKTsKIAllbHNlCi0JCWRldl9kYmcoJmFkZXYtPmRldiwgInJlc3VtZWRcbiIpOworCQlkZXZfZGJnKGRldiwgInJlc3VtZWRcbiIpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KLSNlbHNlCi0jZGVmaW5lIHBsMDIyX3N1c3BlbmQgTlVMTAotI2RlZmluZSBwbDAyMl9yZXN1bWUgTlVMTAogI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKK3N0YXRpYyBpbnQgcGwwMjJfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwljbGtfZGlzYWJsZShwbDAyMi0+Y2xrKTsKKwlhbWJhX3Zjb3JlX2Rpc2FibGUocGwwMjItPmFkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGwwMjJfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWFtYmFfdmNvcmVfZW5hYmxlKHBsMDIyLT5hZGV2KTsKKwljbGtfZW5hYmxlKHBsMDIyLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHBsMDIyX2Rldl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocGwwMjJfc3VzcGVuZCwgcGwwMjJfcmVzdW1lKQorCVNFVF9SVU5USU1FX1BNX09QUyhwbDAyMl9ydW50aW1lX3N1c3BlbmQsIHBsMDIyX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKKwogc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3JfYXJtID0gewogCS5maWZvZGVwdGggPSA4LAogCS5tYXhfYnB3ID0gMTYsCkBAIC0yMzM3LDcgKzIzNTgsNiBAQAogCS5sb29wYmFjayA9IHRydWUsCiB9OwogCi0KIHN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX3N0ID0gewogCS5maWZvZGVwdGggPSAzMiwKIAkubWF4X2JwdyA9IDMyLApAQCAtMjM5Miw5ICsyNDEyLDkgQEAKIAkJICogYW5kIDMyIGxvY2F0aW9ucyBkZWVwIFRYL1JYIEZJRk8gYnV0IG5vIGV4dGVuZGVkCiAJCSAqIENSMC9DUjEgcmVnaXN0ZXIKIAkJICovCi0JCS5pZCAgICAgPSAweDAwMDgwMDIzLAotCQkubWFzayAgID0gMHhmZmZmZmZmZiwKLQkJLmRhdGEgICA9ICZ2ZW5kb3Jfc3RfcGwwMjMsCisJCS5pZAk9IDB4MDAwODAwMjMsCisJCS5tYXNrCT0gMHhmZmZmZmZmZiwKKwkJLmRhdGEJPSAmdmVuZG9yX3N0X3BsMDIzLAogCX0sCiAJewogCQkuaWQJPSAweDEwMDgwMDIzLApAQCAtMjQwNywyNyArMjQyNywyMyBAQAogc3RhdGljIHN0cnVjdCBhbWJhX2RyaXZlciBwbDAyMl9kcml2ZXIgPSB7CiAJLmRydiA9IHsKIAkJLm5hbWUJPSAic3NwLXBsMDIyIiwKKwkJLnBtCT0gJnBsMDIyX2Rldl9wbV9vcHMsCiAJfSwKIAkuaWRfdGFibGUJPSBwbDAyMl9pZHMsCiAJLnByb2JlCQk9IHBsMDIyX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocGwwMjJfcmVtb3ZlKSwKLQkuc3VzcGVuZCAgICAgICAgPSBwbDAyMl9zdXNwZW5kLAotCS5yZXN1bWUgICAgICAgICA9IHBsMDIyX3Jlc3VtZSwKIH07CiAKLQogc3RhdGljIGludCBfX2luaXQgcGwwMjJfaW5pdCh2b2lkKQogewogCXJldHVybiBhbWJhX2RyaXZlcl9yZWdpc3RlcigmcGwwMjJfZHJpdmVyKTsKIH0KLQogc3Vic3lzX2luaXRjYWxsKHBsMDIyX2luaXQpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGwwMjJfZXhpdCh2b2lkKQogewogCWFtYmFfZHJpdmVyX3VucmVnaXN0ZXIoJnBsMDIyX2RyaXZlcik7CiB9Ci0KIG1vZHVsZV9leGl0KHBsMDIyX2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXBwYzR4eC5jIGIvZHJpdmVycy9zcGkvc3BpLXBwYzR4eC5jCmluZGV4IGIyNjdmZDkuLjk4ZWM1MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1wcGM0eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktcHBjNHh4LmMKQEAgLTUxNCw3ICs1MTQsNyBAQAogCS8qIFJlcXVlc3QgSVJRICovCiAJaHctPmlycW51bSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKIAlyZXQgPSByZXF1ZXN0X2lycShody0+aXJxbnVtLCBzcGlfcHBjNHh4X2ludCwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgInNwaV9wcGM0eHhfb2YiLCAodm9pZCAqKWh3KTsKKwkJCSAgMCwgInNwaV9wcGM0eHhfb2YiLCAodm9pZCAqKWh3KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdFxuIik7CiAJCWdvdG8gZnJlZV9ncGlvczsKQEAgLTU5NCwxOCArNTk0LDcgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gc3BpX3BwYzR4eF9vZl9tYXRjaCwKIAl9LAogfTsKLQotc3RhdGljIGludCBfX2luaXQgc3BpX3BwYzR4eF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3BpX3BwYzR4eF9vZl9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoc3BpX3BwYzR4eF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNwaV9wcGM0eHhfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzcGlfcHBjNHh4X29mX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzcGlfcHBjNHh4X2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzcGlfcHBjNHh4X29mX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkdhcnkgSmVubmVqb2huICYgU3RlZmFuIFJvZXNlIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBQUEM0eHggU1BJIERyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1wY2kuYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcGNpLmMKaW5kZXggMzc4ZTUwNC4uOGNhYTA3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1wY2kuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LXBjaS5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9weGEyeHhfc3BpLmg+CiAKIHN0cnVjdCBjZTQxMDBfaW5mbyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpLXMzYzI0eHguYwppbmRleCAxOTk2YWM1Li5mYzA2NDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zM2MyNHh4LmMKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHBsYXQvcmVncy1zcGkuaD4KICNpbmNsdWRlIDxtYWNoL3NwaS5oPgpAQCAtNTA1LDcgKzUwNiw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzM2MyNHh4X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgczNjMjR4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgczNjMjQxMF9zcGlfaW5mbyAqcGRhdGE7CiAJc3RydWN0IHMzYzI0eHhfc3BpICpodzsKQEAgLTY2MSw3ICs2NjIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19leGl0IHMzYzI0eHhfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzM2MyNHh4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzM2MyNHh4X3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCkBAIC03MTksMjYgKzcyMCwxNSBAQAogCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnMzYzI0MTAtc3BpIik7CiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2MyNHh4X3NwaV9kcml2ZXIgPSB7Ci0JLnJlbW92ZQkJPSBfX2V4aXRfcChzM2MyNHh4X3NwaV9yZW1vdmUpLAorCS5wcm9iZQkJPSBzM2MyNHh4X3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHMzYzI0eHhfc3BpX3JlbW92ZSksCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInMzYzI0MTAtc3BpIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5wbQk9IFMzQzI0WFhfU1BJX1BNT1BTLAogCX0sCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBzM2MyNHh4X3NwaV9pbml0KHZvaWQpCi17Ci0gICAgICAgIHJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnMzYzI0eHhfc3BpX2RyaXZlciwgczNjMjR4eF9zcGlfcHJvYmUpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgczNjMjR4eF9zcGlfZXhpdCh2b2lkKQotewotICAgICAgICBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjMjR4eF9zcGlfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoczNjMjR4eF9zcGlfaW5pdCk7Ci1tb2R1bGVfZXhpdChzM2MyNHh4X3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoczNjMjR4eF9zcGlfZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNFhYIFNQSSBEcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkJlbiBEb29rcywgPGJlbkBzaW10ZWMuY28udWs+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpLXMzYzY0eHguYwppbmRleCA1OTVkYWNjLi4wMTlhNzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zM2M2NHh4LmMKQEAgLTEzMSw2ICsxMzEsMTIgQEAKICNkZWZpbmUgUlhCVVNZICAgICgxPDwyKQogI2RlZmluZSBUWEJVU1kgICAgKDE8PDMpCiAKK3N0cnVjdCBzM2M2NHh4X3NwaV9kbWFfZGF0YSB7CisJdW5zaWduZWQJCWNoOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbjsKKwllbnVtIGRtYV9jaAlkbWFjaDsKK307CisKIC8qKgogICogc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhIC0gUnVudGltZSBpbmZvIGhvbGRlciBmb3IgU1BJIGRyaXZlci4KICAqIEBjbGs6IFBvaW50ZXIgdG8gdGhlIHNwaSBjbG9jay4KQEAgLTE2NCwxMyArMTcwLDE0IEBACiAJc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICAgICAgICB3b3JrOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgICAgcXVldWU7CiAJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgICAgICBsb2NrOwotCWVudW0gZG1hX2NoICAgICAgICAgICAgICAgICAgICAgcnhfZG1hY2g7Ci0JZW51bSBkbWFfY2ggICAgICAgICAgICAgICAgICAgICB0eF9kbWFjaDsKIAl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgIHNmcl9zdGFydDsKIAlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgICAgICAgIHhmZXJfY29tcGxldGlvbjsKIAl1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOwogCXVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgY3VyX21vZGUsIGN1cl9icHc7CiAJdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBjdXJfc3BlZWQ7CisJc3RydWN0IHMzYzY0eHhfc3BpX2RtYV9kYXRhCXJ4X2RtYTsKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEJdHhfZG1hOworCXN0cnVjdCBzYW1zdW5nX2RtYV9vcHMJCSpvcHM7CiB9OwogCiBzdGF0aWMgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCBzM2M2NHh4X3NwaV9kbWFfY2xpZW50ID0gewpAQCAtMjI2LDYgKzIzMyw3OCBAQAogCXdyaXRlbCh2YWwsIHJlZ3MgKyBTM0M2NFhYX1NQSV9DSF9DRkcpOwogfQogCitzdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9kbWFjYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkOworCXN0cnVjdCBzM2M2NHh4X3NwaV9kbWFfZGF0YSAqZG1hID0gZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRtYS0+ZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKKwkJc2RkID0gY29udGFpbmVyX29mKGRhdGEsCisJCQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEsIHJ4X2RtYSk7CisJZWxzZQorCQlzZGQgPSBjb250YWluZXJfb2YoZGF0YSwKKwkJCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSwgdHhfZG1hKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkbWEtPmRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJc2RkLT5zdGF0ZSAmPSB+UlhCVVNZOworCQlpZiAoIShzZGQtPnN0YXRlICYgVFhCVVNZKSkKKwkJCWNvbXBsZXRlKCZzZGQtPnhmZXJfY29tcGxldGlvbik7CisJfSBlbHNlIHsKKwkJc2RkLT5zdGF0ZSAmPSB+VFhCVVNZOworCQlpZiAoIShzZGQtPnN0YXRlICYgUlhCVVNZKSkKKwkJCWNvbXBsZXRlKCZzZGQtPnhmZXJfY29tcGxldGlvbik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfZG1hKHN0cnVjdCBzM2M2NHh4X3NwaV9kbWFfZGF0YSAqZG1hLAorCQkJCQl1bnNpZ25lZCBsZW4sIGRtYV9hZGRyX3QgYnVmKQoreworCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkOworCXN0cnVjdCBzYW1zdW5nX2RtYV9wcmVwX2luZm8gaW5mbzsKKworCWlmIChkbWEtPmRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpCisJCXNkZCA9IGNvbnRhaW5lcl9vZigodm9pZCAqKWRtYSwKKwkJCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSwgcnhfZG1hKTsKKwllbHNlCisJCXNkZCA9IGNvbnRhaW5lcl9vZigodm9pZCAqKWRtYSwKKwkJCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSwgdHhfZG1hKTsKKworCWluZm8uY2FwID0gRE1BX1NMQVZFOworCWluZm8ubGVuID0gbGVuOworCWluZm8uZnAgPSBzM2M2NHh4X3NwaV9kbWFjYjsKKwlpbmZvLmZwX3BhcmFtID0gZG1hOworCWluZm8uZGlyZWN0aW9uID0gZG1hLT5kaXJlY3Rpb247CisJaW5mby5idWYgPSBidWY7CisKKwlzZGQtPm9wcy0+cHJlcGFyZShkbWEtPmNoLCAmaW5mbyk7CisJc2RkLT5vcHMtPnRyaWdnZXIoZG1hLT5jaCk7Cit9CisKK3N0YXRpYyBpbnQgYWNxdWlyZV9kbWEoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQpCit7CisJc3RydWN0IHNhbXN1bmdfZG1hX2luZm8gaW5mbzsKKworCXNkZC0+b3BzID0gc2Ftc3VuZ19kbWFfZ2V0X29wcygpOworCisJaW5mby5jYXAgPSBETUFfU0xBVkU7CisJaW5mby5jbGllbnQgPSAmczNjNjR4eF9zcGlfZG1hX2NsaWVudDsKKwlpbmZvLndpZHRoID0gc2RkLT5jdXJfYnB3IC8gODsKKworCWluZm8uZGlyZWN0aW9uID0gc2RkLT5yeF9kbWEuZGlyZWN0aW9uOworCWluZm8uZmlmbyA9IHNkZC0+c2ZyX3N0YXJ0ICsgUzNDNjRYWF9TUElfUlhfREFUQTsKKwlzZGQtPnJ4X2RtYS5jaCA9IHNkZC0+b3BzLT5yZXF1ZXN0KHNkZC0+cnhfZG1hLmRtYWNoLCAmaW5mbyk7CisJaW5mby5kaXJlY3Rpb24gPSAgc2RkLT50eF9kbWEuZGlyZWN0aW9uOworCWluZm8uZmlmbyA9IHNkZC0+c2ZyX3N0YXJ0ICsgUzNDNjRYWF9TUElfVFhfREFUQTsKKwlzZGQtPnR4X2RtYS5jaCA9IHNkZC0+b3BzLT5yZXF1ZXN0KHNkZC0+dHhfZG1hLmRtYWNoLCAmaW5mbyk7CisKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIHZvaWQgZW5hYmxlX2RhdGFwYXRoKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkLAogCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCiAJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciwgaW50IGRtYV9tb2RlKQpAQCAtMjU4LDEwICszMzcsNyBAQAogCQljaGNmZyB8PSBTM0M2NFhYX1NQSV9DSF9UWENIX09OOwogCQlpZiAoZG1hX21vZGUpIHsKIAkJCW1vZGVjZmcgfD0gUzNDNjRYWF9TUElfTU9ERV9UWERNQV9PTjsKLQkJCXMzYzI0MTBfZG1hX2NvbmZpZyhzZGQtPnR4X2RtYWNoLCBzZGQtPmN1cl9icHcgLyA4KTsKLQkJCXMzYzI0MTBfZG1hX2VucXVldWUoc2RkLT50eF9kbWFjaCwgKHZvaWQgKilzZGQsCi0JCQkJCQl4ZmVyLT50eF9kbWEsIHhmZXItPmxlbik7Ci0JCQlzM2MyNDEwX2RtYV9jdHJsKHNkZC0+dHhfZG1hY2gsIFMzQzI0MTBfRE1BT1BfU1RBUlQpOworCQkJcHJlcGFyZV9kbWEoJnNkZC0+dHhfZG1hLCB4ZmVyLT5sZW4sIHhmZXItPnR4X2RtYSk7CiAJCX0gZWxzZSB7CiAJCQlzd2l0Y2ggKHNkZC0+Y3VyX2JwdykgewogCQkJY2FzZSAzMjoKQEAgLTI5MywxMCArMzY5LDcgQEAKIAkJCXdyaXRlbCgoKHhmZXItPmxlbiAqIDggLyBzZGQtPmN1cl9icHcpICYgMHhmZmZmKQogCQkJCQl8IFMzQzY0WFhfU1BJX1BBQ0tFVF9DTlRfRU4sCiAJCQkJCXJlZ3MgKyBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UKTsKLQkJCXMzYzI0MTBfZG1hX2NvbmZpZyhzZGQtPnJ4X2RtYWNoLCBzZGQtPmN1cl9icHcgLyA4KTsKLQkJCXMzYzI0MTBfZG1hX2VucXVldWUoc2RkLT5yeF9kbWFjaCwgKHZvaWQgKilzZGQsCi0JCQkJCQl4ZmVyLT5yeF9kbWEsIHhmZXItPmxlbik7Ci0JCQlzM2MyNDEwX2RtYV9jdHJsKHNkZC0+cnhfZG1hY2gsIFMzQzI0MTBfRE1BT1BfU1RBUlQpOworCQkJcHJlcGFyZV9kbWEoJnNkZC0+cnhfZG1hLCB4ZmVyLT5sZW4sIHhmZXItPnJ4X2RtYSk7CiAJCX0KIAl9CiAKQEAgLTQ4Miw0NiArNTU1LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHMzYzY0eHhfc3BpX2RtYV9yeGNiKHN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuLCB2b2lkICpidWZfaWQsCi0JCQkJIGludCBzaXplLCBlbnVtIHMzYzI0MTBfZG1hX2J1ZmZyZXN1bHQgcmVzKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkID0gYnVmX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAocmVzID09IFMzQzI0MTBfUkVTX09LKQotCQlzZGQtPnN0YXRlICY9IH5SWEJVU1k7Ci0JZWxzZQotCQlkZXZfZXJyKCZzZGQtPnBkZXYtPmRldiwgIkRtYUFicnRSeC0lZFxuIiwgc2l6ZSk7Ci0KLQkvKiBJZiB0aGUgb3RoZXIgZG9uZSAqLwotCWlmICghKHNkZC0+c3RhdGUgJiBUWEJVU1kpKQotCQljb21wbGV0ZSgmc2RkLT54ZmVyX2NvbXBsZXRpb24pOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzYzY0eHhfc3BpX2RtYV90eGNiKHN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuLCB2b2lkICpidWZfaWQsCi0JCQkJIGludCBzaXplLCBlbnVtIHMzYzI0MTBfZG1hX2J1ZmZyZXN1bHQgcmVzKQotewotCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkID0gYnVmX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAocmVzID09IFMzQzI0MTBfUkVTX09LKQotCQlzZGQtPnN0YXRlICY9IH5UWEJVU1k7Ci0JZWxzZQotCQlkZXZfZXJyKCZzZGQtPnBkZXYtPmRldiwgIkRtYUFicnRUeC0lZCBcbiIsIHNpemUpOwotCi0JLyogSWYgdGhlIG90aGVyIGRvbmUgKi8KLQlpZiAoIShzZGQtPnN0YXRlICYgUlhCVVNZKSkKLQkJY29tcGxldGUoJnNkZC0+eGZlcl9jb21wbGV0aW9uKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZC0+bG9jaywgZmxhZ3MpOwotfQotCiAjZGVmaW5lIFhGRVJfRE1BQUREUl9JTlZBTElEIERNQV9CSVRfTUFTSygzMikKIAogc3RhdGljIGludCBzM2M2NHh4X3NwaV9tYXBfbXNzZyhzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKQEAgLTY5NiwxMiArNzI5LDEwIEBACiAJCQlpZiAodXNlX2RtYSkgewogCQkJCWlmICh4ZmVyLT50eF9idWYgIT0gTlVMTAogCQkJCQkJJiYgKHNkZC0+c3RhdGUgJiBUWEJVU1kpKQotCQkJCQlzM2MyNDEwX2RtYV9jdHJsKHNkZC0+dHhfZG1hY2gsCi0JCQkJCQkJUzNDMjQxMF9ETUFPUF9GTFVTSCk7CisJCQkJCXNkZC0+b3BzLT5zdG9wKHNkZC0+dHhfZG1hLmNoKTsKIAkJCQlpZiAoeGZlci0+cnhfYnVmICE9IE5VTEwKIAkJCQkJCSYmIChzZGQtPnN0YXRlICYgUlhCVVNZKSkKLQkJCQkJczNjMjQxMF9kbWFfY3RybChzZGQtPnJ4X2RtYWNoLAotCQkJCQkJCVMzQzI0MTBfRE1BT1BfRkxVU0gpOworCQkJCQlzZGQtPm9wcy0+c3RvcChzZGQtPnJ4X2RtYS5jaCk7CiAJCQl9CiAKIAkJCWdvdG8gb3V0OwpAQCAtNzM5LDMwICs3NzAsNiBAQAogCQltc2ctPmNvbXBsZXRlKG1zZy0+Y29udGV4dCk7CiB9CiAKLXN0YXRpYyBpbnQgYWNxdWlyZV9kbWEoc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQpCi17Ci0JaWYgKHMzYzI0MTBfZG1hX3JlcXVlc3Qoc2RkLT5yeF9kbWFjaCwKLQkJCQkJJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQsIE5VTEwpIDwgMCkgewotCQlkZXZfZXJyKCZzZGQtPnBkZXYtPmRldiwgImNhbm5vdCBnZXQgUnhETUFcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKHNkZC0+cnhfZG1hY2gsIHMzYzY0eHhfc3BpX2RtYV9yeGNiKTsKLQlzM2MyNDEwX2RtYV9kZXZjb25maWcoc2RkLT5yeF9kbWFjaCwgUzNDMjQxMF9ETUFTUkNfSFcsCi0JCQkJCXNkZC0+c2ZyX3N0YXJ0ICsgUzNDNjRYWF9TUElfUlhfREFUQSk7Ci0KLQlpZiAoczNjMjQxMF9kbWFfcmVxdWVzdChzZGQtPnR4X2RtYWNoLAotCQkJCQkmczNjNjR4eF9zcGlfZG1hX2NsaWVudCwgTlVMTCkgPCAwKSB7Ci0JCWRldl9lcnIoJnNkZC0+cGRldi0+ZGV2LCAiY2Fubm90IGdldCBUeERNQVxuIik7Ci0JCXMzYzI0MTBfZG1hX2ZyZWUoc2RkLT5yeF9kbWFjaCwgJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKHNkZC0+dHhfZG1hY2gsIHMzYzY0eHhfc3BpX2RtYV90eGNiKTsKLQlzM2MyNDEwX2RtYV9kZXZjb25maWcoc2RkLT50eF9kbWFjaCwgUzNDMjQxMF9ETUFTUkNfTUVNLAotCQkJCQlzZGQtPnNmcl9zdGFydCArIFMzQzY0WFhfU1BJX1RYX0RBVEEpOwotCi0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyB2b2lkIHMzYzY0eHhfc3BpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkID0gY29udGFpbmVyX29mKHdvcmssCkBAIC03OTksOCArODA2LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKIAogCS8qIEZyZWUgRE1BIGNoYW5uZWxzICovCi0JczNjMjQxMF9kbWFfZnJlZShzZGQtPnR4X2RtYWNoLCAmczNjNjR4eF9zcGlfZG1hX2NsaWVudCk7Ci0JczNjMjQxMF9kbWFfZnJlZShzZGQtPnJ4X2RtYWNoLCAmczNjNjR4eF9zcGlfZG1hX2NsaWVudCk7CisJc2RkLT5vcHMtPnJlbGVhc2Uoc2RkLT5yeF9kbWEuY2gsICZzM2M2NHh4X3NwaV9kbWFfY2xpZW50KTsKKwlzZGQtPm9wcy0+cmVsZWFzZShzZGQtPnR4X2RtYS5jaCwgJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQpOwogfQogCiBzdGF0aWMgaW50IHMzYzY0eHhfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCkBAIC0xMDE3LDggKzEwMjQsMTAgQEAKIAlzZGQtPmNudHJscl9pbmZvID0gc2NpOwogCXNkZC0+cGRldiA9IHBkZXY7CiAJc2RkLT5zZnJfc3RhcnQgPSBtZW1fcmVzLT5zdGFydDsKLQlzZGQtPnR4X2RtYWNoID0gZG1hdHhfcmVzLT5zdGFydDsKLQlzZGQtPnJ4X2RtYWNoID0gZG1hcnhfcmVzLT5zdGFydDsKKwlzZGQtPnR4X2RtYS5kbWFjaCA9IGRtYXR4X3Jlcy0+c3RhcnQ7CisJc2RkLT50eF9kbWEuZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKwlzZGQtPnJ4X2RtYS5kbWFjaCA9IGRtYXJ4X3Jlcy0+c3RhcnQ7CisJc2RkLT5yeF9kbWEuZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwogCiAJc2RkLT5jdXJfYnB3ID0gODsKIApAQCAtMTEwNiw3ICsxMTE1LDcgQEAKIAkJCQkJcGRldi0+aWQsIG1hc3Rlci0+bnVtX2NoaXBzZWxlY3QpOwogCWRldl9kYmcoJnBkZXYtPmRldiwgIlx0SU9tZW09WzB4JXgtMHgleF1cdERNQT1bUngtJWQsIFR4LSVkXVxuIiwKIAkJCQkJbWVtX3Jlcy0+ZW5kLCBtZW1fcmVzLT5zdGFydCwKLQkJCQkJc2RkLT5yeF9kbWFjaCwgc2RkLT50eF9kbWFjaCk7CisJCQkJCXNkZC0+cnhfZG1hLmRtYWNoLCBzZGQtPnR4X2RtYS5kbWFjaCk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXNoLW1zaW9mLmMgYi9kcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYwppbmRleCBlMDBkOTRiLi4xZjQ2NmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCkBAIC02MzUsNyArNjM2LDcgQEAKIAkJZ290byBlcnIyOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKGksIHNoX21zaW9mX3NwaV9pcnEsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaSwgc2hfbXNpb2Zfc3BpX2lycSwgMCwKIAkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIHApOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgaXJxXG4iKTsKQEAgLTczMCwxOCArNzMxLDcgQEAKIAkJLnBtCQk9ICZzaF9tc2lvZl9zcGlfZGV2X3BtX29wcywKIAl9LAogfTsKLQotc3RhdGljIGludCBfX2luaXQgc2hfbXNpb2Zfc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaF9tc2lvZl9zcGlfZHJ2KTsKLX0KLW1vZHVsZV9pbml0KHNoX21zaW9mX3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNoX21zaW9mX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNoX21zaW9mX3NwaV9kcnYpOwotfQotbW9kdWxlX2V4aXQoc2hfbXNpb2Zfc3BpX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzaF9tc2lvZl9zcGlfZHJ2KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggTVNJT0YgU1BJIE1hc3RlciBJbnRlcmZhY2UgRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYWdudXMgRGFtbSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jIGIvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jCmluZGV4IGU3Nzc5YzAuLjA5N2U1MDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktc2gtc2NpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vc3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xODYsMTggKzE4Nyw3IEBACiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBzaF9zY2lfc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaF9zY2lfc3BpX2Rydik7Ci19Ci1tb2R1bGVfaW5pdChzaF9zY2lfc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2hfc2NpX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNoX3NjaV9zcGlfZHJ2KTsKLX0KLW1vZHVsZV9leGl0KHNoX3NjaV9zcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNoX3NjaV9zcGlfZHJ2KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTSCBTQ0kgU1BJIERyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zaC5jIGIvZHJpdmVycy9zcGkvc3BpLXNoLmMKaW5kZXggOWVlZGQ3MS4uNzBjOGFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNoLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXNoLmMKQEAgLTQ4NCw3ICs0ODQsNyBAQAogCQlnb3RvIGVycm9yMjsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHNwaV9zaF9pcnEsIElSUUZfRElTQUJMRUQsICJzcGlfc2giLCBzcyk7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBzcGlfc2hfaXJxLCAwLCAic3BpX3NoIiwgc3MpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlcXVlc3RfaXJxIGVycm9yXG4iKTsKIAkJZ290byBlcnJvcjM7CkBAIC01MjQsMTggKzUyNCw3IEBACiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBzcGlfc2hfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNwaV9zaF9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoc3BpX3NoX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3BpX3NoX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpX3NoX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzcGlfc2hfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNwaV9zaF9kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNIIFNQSSBidXMgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc3RtcC5jIGIvZHJpdmVycy9zcGkvc3BpLXN0bXAuYwppbmRleCBmYWRmZjc2Li41OGUzODUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktc3RtcC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zdG1wLmMKQEAgLTY1OSwxOSArNjU5LDggQEAKIAkuc3VzcGVuZCA9IHN0bXBfc3BpX3N1c3BlbmQsCiAJLnJlc3VtZSAgPSBzdG1wX3NwaV9yZXN1bWUsCiB9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdG1wX3NwaV9kcml2ZXIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBzdG1wX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3RtcF9zcGlfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHN0bXBfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3RtcF9zcGlfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc3RtcF9zcGlfaW5pdCk7Ci1tb2R1bGVfZXhpdChzdG1wX3NwaV9leGl0KTsKIG1vZHVsZV9wYXJhbShwaW8sIGludCwgU19JUlVHTyk7CiBtb2R1bGVfcGFyYW0oY2xvY2ssIGludCwgU19JUlVHTyk7CiBNT0RVTEVfQVVUSE9SKCJkbWl0cnkgcGVydnVzaGluIDxkcGVydnVzaGluQGVtYmVkZGVkYWxsZXkuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRlZ3JhLmMgYi9kcml2ZXJzL3NwaS9zcGktdGVncmEuYwppbmRleCBhNWE2MzAyLi5hZTZkNzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGVncmEuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdGVncmEuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC00NjQsNyArNDY1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc3BpX3RlZ3JhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzcGlfdGVncmFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwogCXN0cnVjdCBzcGlfdGVncmFfZGF0YQkqdHNwaTsKQEAgLTYxMiwxOSArNjEzLDkgQEAKIAkJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IHNwaV90ZWdyYV9vZl9tYXRjaF90YWJsZSwKIAl9LAorCS5wcm9iZSA9CXNwaV90ZWdyYV9wcm9iZSwKIAkucmVtb3ZlID0JX19kZXZleGl0X3Aoc3BpX3RlZ3JhX3JlbW92ZSksCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBzcGlfdGVncmFfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnNwaV90ZWdyYV9kcml2ZXIsIHNwaV90ZWdyYV9wcm9iZSk7Ci19Ci1tb2R1bGVfaW5pdChzcGlfdGVncmFfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzcGlfdGVncmFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzcGlfdGVncmFfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHNwaV90ZWdyYV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3BpX3RlZ3JhX2RyaXZlcik7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10aS1zc3AuYyBiL2RyaXZlcnMvc3BpL3NwaS10aS1zc3AuYwppbmRleCBlZTIyNzk1Li4zZjZmNmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdGktc3NwLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXRpLXNzcC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC90aV9zc3AuaD4KQEAgLTM4MywxOCArMzg0LDcgQEAKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRpX3NzcF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRpX3NzcF9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KHRpX3NzcF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0aV9zc3Bfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGlfc3NwX3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQodGlfc3NwX3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGlfc3NwX3NwaV9kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNTUCBTUEkgTWFzdGVyIik7CiBNT0RVTEVfQVVUSE9SKCJDeXJpbCBDaGVtcGFyYXRoeSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRsZTYyeDAuYyBiL2RyaXZlcnMvc3BpL3NwaS10bGU2MngwLmMKaW5kZXggOTQwZTczZC4uMGNlNWMxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRsZTYyeDAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdGxlNjJ4MC5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdHh4OS5jIGIvZHJpdmVycy9zcGkvc3BpLXR4eDkuYwppbmRleCBmMGEyYWIwLi5kNWEzY2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktdHh4OS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10eHg5LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXhpbGlueC5jIGIvZHJpdmVycy9zcGkvc3BpLXhpbGlueC5jCmluZGV4IDRkMmM3NWQuLjRjNWE2NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS14aWxpbnguYworKysgYi9kcml2ZXJzL3NwaS9zcGkteGlsaW54LmMKQEAgLTUzOCwxOCArNTM4LDcgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0geGlsaW54X3NwaV9vZl9tYXRjaCwKIAl9LAogfTsKLQotc3RhdGljIGludCBfX2luaXQgeGlsaW54X3NwaV9wbHRmbV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmeGlsaW54X3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoeGlsaW54X3NwaV9wbHRmbV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHhpbGlueF9zcGlfcGx0Zm1fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ4aWxpbnhfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdCh4aWxpbnhfc3BpX3BsdGZtX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4aWxpbnhfc3BpX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggU1BJIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGkuYwppbmRleCA0ZDFiOWY1Li43N2VhZTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGkuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyB2b2lkIHNwaWRldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2I0M19wY2lfYnJpZGdlLmMgYi9kcml2ZXJzL3NzYi9iNDNfcGNpX2JyaWRnZS5jCmluZGV4IGJmNTNlNDQuLmJhZDdiYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL2I0M19wY2lfYnJpZGdlLmMKKysrIGIvZHJpdmVycy9zc2IvYjQzX3BjaV9icmlkZ2UuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CiAKICNpbmNsdWRlICJzc2JfcHJpdmF0ZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb24uYyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9jaGlwY29tbW9uLmMKaW5kZXggNWQ5Yzk3Yy4uZTlkMmNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb24uYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfY2hpcGNvbW1vbi5jCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9yZWdzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlICJzc2JfcHJpdmF0ZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMgYi9kcml2ZXJzL3NzYi9kcml2ZXJfY2hpcGNvbW1vbl9wbXUuYwppbmRleCA1MjkwMWMxLi5lNWEyZTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9kcml2ZXJfY2hpcGNvbW1vbl9wbXUuYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfY2hpcGNvbW1vbl9wbXUuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfcmVncy5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfZHJpdmVyX2NoaXBjb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAic3NiX3ByaXZhdGUuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZHJpdmVyX2dpZ2UuYyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9naWdlLmMKaW5kZXggM2FkYjk4ZC4uZjMwZWE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX2dpZ2UuYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfZ2lnZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9kcml2ZXJfZ2lnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9yZWdzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMKaW5kZXggZTZhYzMxNy4uODRjOTM0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYworKysgYi9kcml2ZXJzL3NzYi9kcml2ZXJfcGNpY29yZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiX2VtYmVkZGVkLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2VtYmVkZGVkLmMgYi9kcml2ZXJzL3NzYi9lbWJlZGRlZC5jCmluZGV4IGVlYzNlMjYuLjllZjEyNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL2VtYmVkZGVkLmMKKysrIGIvZHJpdmVycy9zc2IvZW1iZWRkZWQuYwpAQCAtOCw2ICs4LDcgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUvR1BMLiBTZWUgQ09QWUlORyBmb3IgZGV0YWlscy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfZW1iZWRkZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiX2RyaXZlcl9wY2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL21haW4uYyBiL2RyaXZlcnMvc3NiL21haW4uYwppbmRleCBkMGNiZGIwLi5iYjYzMTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9tYWluLmMKKysrIGIvZHJpdmVycy9zc2IvbWFpbi5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfcmVncy5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfZHJpdmVyX2dpZ2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL3BjaWhvc3Rfd3JhcHBlci5jIGIvZHJpdmVycy9zc2IvcGNpaG9zdF93cmFwcGVyLmMKaW5kZXggMTE2YTgxMS4uYWY1NDQ4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvcGNpaG9zdF93cmFwcGVyLmMKKysrIGIvZHJpdmVycy9zc2IvcGNpaG9zdF93cmFwcGVyLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2IuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCA4OWU1MDM5Li4yNWNkZmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtMzAsMTQgKzMwLDYgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy90bTYwMDAvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy91c2JpcC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93aW5ib25kL0tjb25maWciCkBAIC03NCw4ICs2Niw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2xpbmU2L0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL29jdGVvbi9LY29uZmlnIgpAQCAtMTA4LDIwICs5OCwxMiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zbTd4eC9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9kdDMxNTV2NGwvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy94Z2lmYi9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9saXJjL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcXVpY2tzdGFydC9LY29uZmlnIgpAQCAtMTQ0LDEwICsxMjYsMTAgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZ21hNTAwL0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWkvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbnZlYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWRpYS9LY29uZmlnIgorCiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCBkN2E1YTA0Li5hMjVmM2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC00LDEzICs0LDkgQEAKIG9iai0kKENPTkZJR19TVEFHSU5HKQkJKz0gc3RhZ2luZy5vCiAKIG9iai15CQkJCSs9IHNlcmlhbC8KK29iai15CQkJCSs9IG1lZGlhLwogb2JqLSQoQ09ORklHX0VUMTMxWCkJCSs9IGV0MTMxeC8KIG9iai0kKENPTkZJR19TTElDT1NTKQkJKz0gc2xpY29zcy8KLW9iai0kKENPTkZJR19WSURFT19HTzcwMDcpCSs9IGdvNzAwNy8KLW9iai0kKENPTkZJR19WSURFT19DWDI1ODIxKQkrPSBjeDI1ODIxLwotb2JqLSQoQ09ORklHX1ZJREVPX1RNNjAwMCkJKz0gdG02MDAwLwotb2JqLSQoQ09ORklHX0RWQl9DWEQyMDk5KQkrPSBjeGQyMDk5Lwotb2JqLSQoQ09ORklHX0xJUkNfU1RBR0lORykJKz0gbGlyYy8KIG9iai0kKENPTkZJR19VU0JJUF9DT1JFKQkrPSB1c2JpcC8KIG9iai0kKENPTkZJR19XMzVVTkQpCQkrPSB3aW5ib25kLwogb2JqLSQoQ09ORklHX1BSSVNNMl9VU0IpCSs9IHdsYW4tbmcvCkBAIC00NSwxMiArNDEsOSBAQAogb2JqLSQoQ09ORklHX1dMQUdTNDlfSDIpCSs9IHdsYWdzNDlfaDIvCiBvYmotJChDT05GSUdfV0xBR1M0OV9IMjUpCSs9IHdsYWdzNDlfaDI1Lwogb2JqLSQoQ09ORklHX0ZCX1NNN1hYKQkJKz0gc203eHgvCi1vYmotJChDT05GSUdfVklERU9fRFQzMTU1KQkrPSBkdDMxNTV2NGwvCiBvYmotJChDT05GSUdfQ1JZU1RBTEhEKQkJKz0gY3J5c3RhbGhkLwogb2JqLSQoQ09ORklHX0NYVDFFMSkJCSs9IGN4dDFlMS8KIG9iai0kKENPTkZJR19GQl9YR0kpCQkrPSB4Z2lmYi8KLW9iai0kKENPTkZJR19FQVNZQ0FQKQkJKz0gZWFzeWNhcC8KLW9iai0kKENPTkZJR19TT0xPNlgxMCkJCSs9IHNvbG82eDEwLwogb2JqLSQoQ09ORklHX1RJRFNQQlJJREdFKQkrPSB0aWRzcGJyaWRnZS8KIG9iai0kKENPTkZJR19BQ1BJX1FVSUNLU1RBUlQpCSs9IHF1aWNrc3RhcnQvCiBvYmotJChDT05GSUdfU0JFXzJUM0UzKQkJKz0gc2JlLTJ0M2UzLwpAQCAtNTksNyArNTIsNiBAQAogb2JqLSQoQ09ORklHX0ZUMTAwMCkJCSs9IGZ0MTAwMC8KIG9iai0kKENPTkZJR19TTkRfSU5URUxfU1NUKQkrPSBpbnRlbF9zc3QvCiBvYmotJChDT05GSUdfU1BFQUtVUCkJCSs9IHNwZWFrdXAvCi1vYmotJChDT05GSUdfQUxURVJBX1NUQVBMKQkrPWFsdGVyYS1zdGFwbC8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DTEVBUlBBRF9UTTEyMTcpCSs9IGNwdG0xMjE3Lwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1NZTkFQVElDU19JMkNfUk1JNCkJKz0gc3RlX3JtaTQvCiBvYmotJChDT05GSUdfRFJNX1BTQikJCSs9IGdtYTUwMC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1MzczMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWNvbmZpZyBBTFRFUkFfU1RBUEwKLQl0cmlzdGF0ZSAiQWx0ZXJhIEZQR0EgZmlybXdhcmUgZG93bmxvYWQgbW9kdWxlIgotCWRlcGVuZHMgb24gSTJDCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgQW4gQWx0ZXJhIEZQR0EgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyB0b29sLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZWVkZTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYWx0ZXJhLXN0YXBsLXkgOj0gYWx0ZXJhLWxwdC5vIGFsdGVyYS1qdGFnLm8gYWx0ZXJhLWNvbXAubyBhbHRlcmEubwotCi1vYmotJChDT05GSUdfQUxURVJBX1NUQVBMKSArPSBhbHRlcmEtc3RhcGwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jIGIvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjE2MjBiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMjEgKzAsMCBAQAotLyoKLSAqIGFsdGVyYS1qdGFnLmMKLSAqCi0gKiBhbHRlcmEgRlBHQSBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIEFsdGVyYSBDb3Jwb3JhdGlvbiAxOTk4LTIwMDEKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOZXRVUCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdvciBNLiBMaXBsaWFuaW4gPGxpcGxpYW5pbkBuZXR1cC5ydT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSAiYWx0ZXJhLmgiCi0jaW5jbHVkZSAiYWx0ZXJhLWV4cHJ0LmgiCi0jaW5jbHVkZSAiYWx0ZXJhLWp0YWcuaCIKLQotI2RlZmluZQlhbHRfanRhZ19pbyhhLCBiLCBjKVwKLQkJYXN0YXRlLT5jb25maWctPmp0YWdfaW8oYXN0YXRlLT5jb25maWctPmRldiwgYSwgYiwgYyk7Ci0KLSNkZWZpbmUJYWx0X21hbGxvYyhhKQlremFsbG9jKGEsIEdGUF9LRVJORUwpOwotCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgc2hvd3MsIGZvciBlYWNoIEpUQUcgc3RhdGUsIHdoaWNoIHN0YXRlIGlzIHJlYWNoZWQgYWZ0ZXIKLSAqIGEgc2luZ2xlIFRDSyBjbG9jayBjeWNsZSB3aXRoIFRNUyBoaWdoIG9yIFRNUyBsb3csIHJlc3BlY3RpdmVseS4gIFRoaXMKLSAqIGRlc2NyaWJlcyBhbGwgcG9zc2libGUgc3RhdGUgdHJhbnNpdGlvbnMgaW4gdGhlIEpUQUcgc3RhdGUgbWFjaGluZS4KLSAqLwotc3RydWN0IGFsdGVyYV9qdGFnX21hY2hpbmUgewotCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgdG1zX2hpZ2g7Ci0JZW51bSBhbHRlcmFfanRhZ19zdGF0ZSB0bXNfbG93OwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHRlcmFfanRhZ19tYWNoaW5lIGFsdGVyYV90cmFuc2l0aW9uc1tdID0gewotCS8qIFJFU0VUICAgICAqLwl7IFJFU0VULAlJRExFIH0sCi0JLyogSURMRSAgICAgICovCXsgRFJTRUxFQ1QsCUlETEUgfSwKLQkvKiBEUlNFTEVDVCAgKi8JeyBJUlNFTEVDVCwJRFJDQVBUVVJFIH0sCi0JLyogRFJDQVBUVVJFICovCXsgRFJFWElUMSwJRFJTSElGVCB9LAotCS8qIERSU0hJRlQgICAqLwl7IERSRVhJVDEsCURSU0hJRlQgfSwKLQkvKiBEUkVYSVQxICAgKi8JeyBEUlVQREFURSwJRFJQQVVTRSB9LAotCS8qIERSUEFVU0UgICAqLwl7IERSRVhJVDIsCURSUEFVU0UgfSwKLQkvKiBEUkVYSVQyICAgKi8JeyBEUlVQREFURSwJRFJTSElGVCB9LAotCS8qIERSVVBEQVRFICAqLwl7IERSU0VMRUNULAlJRExFIH0sCi0JLyogSVJTRUxFQ1QgICovCXsgUkVTRVQsCUlSQ0FQVFVSRSB9LAotCS8qIElSQ0FQVFVSRSAqLwl7IElSRVhJVDEsCUlSU0hJRlQgfSwKLQkvKiBJUlNISUZUICAgKi8JeyBJUkVYSVQxLAlJUlNISUZUIH0sCi0JLyogSVJFWElUMSAgICovCXsgSVJVUERBVEUsCUlSUEFVU0UgfSwKLQkvKiBJUlBBVVNFICAgKi8JeyBJUkVYSVQyLAlJUlBBVVNFIH0sCi0JLyogSVJFWElUMiAgICovCXsgSVJVUERBVEUsCUlSU0hJRlQgfSwKLQkvKiBJUlVQREFURSAgKi8JeyBEUlNFTEVDVCwJSURMRSB9Ci19OwotCi0vKgotICogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgVE1TIHZhbHVlIHRvIGJlIHVzZWQgdG8gdGFrZSB0aGUgTkVYVCBTVEVQIG9uCi0gKiB0aGUgcGF0aCB0byB0aGUgZGVzaXJlZCBzdGF0ZS4gIFRoZSBhcnJheSBpbmRleCBpcyB0aGUgY3VycmVudCBzdGF0ZSwKLSAqIGFuZCB0aGUgYml0IHBvc2l0aW9uIGlzIHRoZSBkZXNpcmVkIGVuZHN0YXRlLiAgVG8gZmluZCBvdXQgd2hpY2ggc3RhdGUKLSAqIGlzIHVzZWQgYXMgdGhlIGludGVybWVkaWF0ZSBzdGF0ZSwgbG9vayB1cCB0aGUgVE1TIHZhbHVlIGluIHRoZQotICogYWx0ZXJhX3RyYW5zaXRpb25zW10gdGFibGUuCi0gKi8KLXN0YXRpYyBjb25zdCB1MTYgYWx0ZXJhX2p0YWdfcGF0aF9tYXBbMTZdID0gewotCS8qIFJTVAlSVEkJU0RSUwlDRFIJU0RSCUUxRFIJUERSCUUyRFIgKi8KLQkweDAwMDEsCTB4RkZGRCwJMHhGRTAxLAkweEZGRTcsCTB4RkZFRiwJMHhGRjBGLAkweEZGQkYsCTB4RkZGRiwKLQkvKiBVRFIJU0lSUwlDSVIJU0lSCUUxSVIJUElSCUUySVIJVUlSICovCi0JMHhGRUZELAkweDAwMDEsCTB4RjNGRiwJMHhGN0ZGLAkweDg3RkYsCTB4REZGRiwJMHhGRkZGLAkweDdGRkQKLX07Ci0KLS8qIEZsYWcgYml0cyBmb3IgYWx0X2p0YWdfaW8oKSBmdW5jdGlvbiAqLwotI2RlZmluZSBUTVNfSElHSCAgIDEKLSNkZWZpbmUgVE1TX0xPVyAgICAwCi0jZGVmaW5lIFRESV9ISUdIICAgMQotI2RlZmluZSBURElfTE9XICAgIDAKLSNkZWZpbmUgUkVBRF9URE8gICAxCi0jZGVmaW5lIElHTk9SRV9URE8gMAotCi1pbnQgYWx0ZXJhX2ppbml0KHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSkKLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0KLQkvKiBpbml0aWFsIEpUQUcgc3RhdGUgaXMgdW5rbm93biAqLwotCWpzLT5qdGFnX3N0YXRlID0gSUxMRUdBTF9KVEFHX1NUQVRFOwotCi0JLyogaW5pdGlhbGl6ZSB0byBkZWZhdWx0IHN0YXRlICovCi0JanMtPmRyc3RvcF9zdGF0ZSA9IElETEU7Ci0JanMtPmlyc3RvcF9zdGF0ZSA9IElETEU7Ci0JanMtPmRyX3ByZSAgPSAwOwotCWpzLT5kcl9wb3N0ID0gMDsKLQlqcy0+aXJfcHJlICA9IDA7Ci0JanMtPmlyX3Bvc3QgPSAwOwotCWpzLT5kcl9sZW5ndGggICAgPSAwOwotCWpzLT5pcl9sZW5ndGggICAgPSAwOwotCi0JanMtPmRyX3ByZV9kYXRhICA9IE5VTEw7Ci0JanMtPmRyX3Bvc3RfZGF0YSA9IE5VTEw7Ci0JanMtPmlyX3ByZV9kYXRhICA9IE5VTEw7Ci0JanMtPmlyX3Bvc3RfZGF0YSA9IE5VTEw7Ci0JanMtPmRyX2J1ZmZlcgkgPSBOVUxMOwotCWpzLT5pcl9idWZmZXIJID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1pbnQgYWx0ZXJhX3NldF9kcnN0b3Aoc3RydWN0IGFsdGVyYV9qdGFnICpqcywgZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGF0ZSkKLXsKLQlqcy0+ZHJzdG9wX3N0YXRlID0gc3RhdGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGFsdGVyYV9zZXRfaXJzdG9wKHN0cnVjdCBhbHRlcmFfanRhZyAqanMsIGVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgc3RhdGUpCi17Ci0JanMtPmlyc3RvcF9zdGF0ZSA9IHN0YXRlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBhbHRlcmFfc2V0X2RyX3ByZShzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzLAotCQkJCXUzMiBjb3VudCwgdTMyIHN0YXJ0X2luZGV4LAotCQkJCXU4ICpwcmVhbWJsZV9kYXRhKQotewotCWludCBzdGF0dXMgPSAwOwotCXUzMiBpOwotCXUzMiBqOwotCi0JaWYgKGNvdW50ID4ganMtPmRyX3ByZSkgewotCQlrZnJlZShqcy0+ZHJfcHJlX2RhdGEpOwotCQlqcy0+ZHJfcHJlX2RhdGEgPSAodTggKilhbHRfbWFsbG9jKChjb3VudCArIDcpID4+IDMpOwotCQlpZiAoanMtPmRyX3ByZV9kYXRhID09IE5VTEwpCi0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQllbHNlCi0JCQlqcy0+ZHJfcHJlID0gY291bnQ7Ci0JfSBlbHNlCi0JCWpzLT5kcl9wcmUgPSBjb3VudDsKLQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJaiA9IGkgKyBzdGFydF9pbmRleDsKLQotCQkJaWYgKHByZWFtYmxlX2RhdGEgPT0gTlVMTCkKLQkJCQlqcy0+ZHJfcHJlX2RhdGFbaSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKLQkJCWVsc2UgewotCQkJCWlmIChwcmVhbWJsZV9kYXRhW2ogPj4gM10gJiAoMSA8PCAoaiAmIDcpKSkKLQkJCQkJanMtPmRyX3ByZV9kYXRhW2kgPj4gM10gfD0KLQkJCQkJCQkoMSA8PCAoaSAmIDcpKTsKLQkJCQllbHNlCi0JCQkJCWpzLT5kcl9wcmVfZGF0YVtpID4+IDNdICY9Ci0JCQkJCQkJfih1MzIpKDEgPDwgKGkgJiA3KSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBhbHRlcmFfc2V0X2lyX3ByZShzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzLCB1MzIgY291bnQsIHUzMiBzdGFydF9pbmRleCwKLQkJCQkJCQl1OCAqcHJlYW1ibGVfZGF0YSkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQl1MzIgaTsKLQl1MzIgajsKLQotCWlmIChjb3VudCA+IGpzLT5pcl9wcmUpIHsKLQkJa2ZyZWUoanMtPmlyX3ByZV9kYXRhKTsKLQkJanMtPmlyX3ByZV9kYXRhID0gKHU4ICopYWx0X21hbGxvYygoY291bnQgKyA3KSA+PiAzKTsKLQkJaWYgKGpzLT5pcl9wcmVfZGF0YSA9PSBOVUxMKQotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZWxzZQotCQkJanMtPmlyX3ByZSA9IGNvdW50OwotCi0JfSBlbHNlCi0JCWpzLT5pcl9wcmUgPSBjb3VudDsKLQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJaiA9IGkgKyBzdGFydF9pbmRleDsKLQkJCWlmIChwcmVhbWJsZV9kYXRhID09IE5VTEwpCi0JCQkJanMtPmlyX3ByZV9kYXRhW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7Ci0JCQllbHNlIHsKLQkJCQlpZiAocHJlYW1ibGVfZGF0YVtqID4+IDNdICYgKDEgPDwgKGogJiA3KSkpCi0JCQkJCWpzLT5pcl9wcmVfZGF0YVtpID4+IDNdIHw9Ci0JCQkJCQkJKDEgPDwgKGkgJiA3KSk7Ci0JCQkJZWxzZQotCQkJCQlqcy0+aXJfcHJlX2RhdGFbaSA+PiAzXSAmPQotCQkJCQkJCX4odTMyKSgxIDw8IChpICYgNykpOwotCi0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYWx0ZXJhX3NldF9kcl9wb3N0KHN0cnVjdCBhbHRlcmFfanRhZyAqanMsIHUzMiBjb3VudCwgdTMyIHN0YXJ0X2luZGV4LAotCQkJCQkJdTggKnBvc3RhbWJsZV9kYXRhKQotewotCWludCBzdGF0dXMgPSAwOwotCXUzMiBpOwotCXUzMiBqOwotCi0JaWYgKGNvdW50ID4ganMtPmRyX3Bvc3QpIHsKLQkJa2ZyZWUoanMtPmRyX3Bvc3RfZGF0YSk7Ci0JCWpzLT5kcl9wb3N0X2RhdGEgPSAodTggKilhbHRfbWFsbG9jKChjb3VudCArIDcpID4+IDMpOwotCi0JCWlmIChqcy0+ZHJfcG9zdF9kYXRhID09IE5VTEwpCi0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQllbHNlCi0JCQlqcy0+ZHJfcG9zdCA9IGNvdW50OwotCi0JfSBlbHNlCi0JCWpzLT5kcl9wb3N0ID0gY291bnQ7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCWogPSBpICsgc3RhcnRfaW5kZXg7Ci0KLQkJCWlmIChwb3N0YW1ibGVfZGF0YSA9PSBOVUxMKQotCQkJCWpzLT5kcl9wb3N0X2RhdGFbaSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKLQkJCWVsc2UgewotCQkJCWlmIChwb3N0YW1ibGVfZGF0YVtqID4+IDNdICYgKDEgPDwgKGogJiA3KSkpCi0JCQkJCWpzLT5kcl9wb3N0X2RhdGFbaSA+PiAzXSB8PQotCQkJCQkJCQkoMSA8PCAoaSAmIDcpKTsKLQkJCQllbHNlCi0JCQkJCWpzLT5kcl9wb3N0X2RhdGFbaSA+PiAzXSAmPQotCQkJCQkgICAgfih1MzIpKDEgPDwgKGkgJiA3KSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBhbHRlcmFfc2V0X2lyX3Bvc3Qoc3RydWN0IGFsdGVyYV9qdGFnICpqcywgdTMyIGNvdW50LCB1MzIgc3RhcnRfaW5kZXgsCi0JCQkJCQl1OCAqcG9zdGFtYmxlX2RhdGEpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTMyIGk7Ci0JdTMyIGo7Ci0KLQlpZiAoY291bnQgPiBqcy0+aXJfcG9zdCkgewotCQlrZnJlZShqcy0+aXJfcG9zdF9kYXRhKTsKLQkJanMtPmlyX3Bvc3RfZGF0YSA9ICh1OCAqKWFsdF9tYWxsb2MoKGNvdW50ICsgNykgPj4gMyk7Ci0JCWlmIChqcy0+aXJfcG9zdF9kYXRhID09IE5VTEwpCi0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQllbHNlCi0JCQlqcy0+aXJfcG9zdCA9IGNvdW50OwotCi0JfSBlbHNlCi0JCWpzLT5pcl9wb3N0ID0gY291bnQ7Ci0KLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBzdGF0dXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQlqID0gaSArIHN0YXJ0X2luZGV4OwotCi0JCWlmIChwb3N0YW1ibGVfZGF0YSA9PSBOVUxMKQotCQkJanMtPmlyX3Bvc3RfZGF0YVtpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOwotCQllbHNlIHsKLQkJCWlmIChwb3N0YW1ibGVfZGF0YVtqID4+IDNdICYgKDEgPDwgKGogJiA3KSkpCi0JCQkJanMtPmlyX3Bvc3RfZGF0YVtpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOwotCQkJZWxzZQotCQkJCWpzLT5pcl9wb3N0X2RhdGFbaSA+PiAzXSAmPQotCQkJCSAgICB+KHUzMikoMSA8PCAoaSAmIDcpKTsKLQotCQl9Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgYWx0ZXJhX2pyZXNldF9pZGxlKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSkKLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IGk7Ci0JLyogR28gdG8gVGVzdCBMb2dpYyBSZXNldCAobm8gbWF0dGVyIHdoYXQgdGhlIHN0YXJ0aW5nIHN0YXRlIG1heSBiZSkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNTsgKytpKQotCQlhbHRfanRhZ19pbyhUTVNfSElHSCwgVERJX0xPVywgSUdOT1JFX1RETyk7Ci0KLQkvKiBOb3cgc3RlcCB0byBSdW4gVGVzdCAvIElkbGUgKi8KLQlhbHRfanRhZ19pbyhUTVNfTE9XLCBURElfTE9XLCBJR05PUkVfVERPKTsKLQlqcy0+anRhZ19zdGF0ZSA9IElETEU7Ci19Ci0KLWludCBhbHRlcmFfZ290b19qc3RhdGUoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJCQllbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHN0YXRlKQotewotCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKLQlpbnQgdG1zOwotCWludCBjb3VudCA9IDA7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAoanMtPmp0YWdfc3RhdGUgPT0gSUxMRUdBTF9KVEFHX1NUQVRFKQotCQkvKiBpbml0aWFsaXplIEpUQUcgY2hhaW4gdG8ga25vd24gc3RhdGUgKi8KLQkJYWx0ZXJhX2pyZXNldF9pZGxlKGFzdGF0ZSk7Ci0KLQlpZiAoanMtPmp0YWdfc3RhdGUgPT0gc3RhdGUpIHsKLQkJLyoKLQkJICogV2UgYXJlIGFscmVhZHkgaW4gdGhlIGRlc2lyZWQgc3RhdGUuCi0JCSAqIElmIGl0IGlzIGEgc3RhYmxlIHN0YXRlLCBsb29wIGhlcmUuCi0JCSAqIE90aGVyd2lzZSBkbyBub3RoaW5nIChubyBjbG9jayBjeWNsZXMpLgotCQkgKi8KLQkJaWYgKChzdGF0ZSA9PSBJRExFKSB8fCAoc3RhdGUgPT0gRFJTSElGVCkgfHwKLQkJCShzdGF0ZSA9PSBEUlBBVVNFKSB8fCAoc3RhdGUgPT0gSVJTSElGVCkgfHwKLQkJCQkoc3RhdGUgPT0gSVJQQVVTRSkpIHsKLQkJCWFsdF9qdGFnX2lvKFRNU19MT1csIFRESV9MT1csIElHTk9SRV9URE8pOwotCQl9IGVsc2UgaWYgKHN0YXRlID09IFJFU0VUKQotCQkJYWx0X2p0YWdfaW8oVE1TX0hJR0gsIFRESV9MT1csIElHTk9SRV9URE8pOwotCi0JfSBlbHNlIHsKLQkJd2hpbGUgKChqcy0+anRhZ19zdGF0ZSAhPSBzdGF0ZSkgJiYgKGNvdW50IDwgOSkpIHsKLQkJCS8qIEdldCBUTVMgdmFsdWUgdG8gdGFrZSBhIHN0ZXAgdG93YXJkIGRlc2lyZWQgc3RhdGUgKi8KLQkJCXRtcyA9IChhbHRlcmFfanRhZ19wYXRoX21hcFtqcy0+anRhZ19zdGF0ZV0gJgotCQkJCQkJCSgxIDw8IHN0YXRlKSkKLQkJCQkJCQk/IFRNU19ISUdIIDogVE1TX0xPVzsKLQotCQkJLyogVGFrZSBhIHN0ZXAgKi8KLQkJCWFsdF9qdGFnX2lvKHRtcywgVERJX0xPVywgSUdOT1JFX1RETyk7Ci0KLQkJCWlmICh0bXMpCi0JCQkJanMtPmp0YWdfc3RhdGUgPQotCQkJCQlhbHRlcmFfdHJhbnNpdGlvbnNbanMtPmp0YWdfc3RhdGVdLnRtc19oaWdoOwotCQkJZWxzZQotCQkJCWpzLT5qdGFnX3N0YXRlID0KLQkJCQkJYWx0ZXJhX3RyYW5zaXRpb25zW2pzLT5qdGFnX3N0YXRlXS50bXNfbG93OwotCi0JCQkrK2NvdW50OwotCQl9Ci0JfQotCi0JaWYgKGpzLT5qdGFnX3N0YXRlICE9IHN0YXRlKQotCQlzdGF0dXMgPSAtRVJFTU9URUlPOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IGFsdGVyYV93YWl0X2N5Y2xlcyhzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCi0JCQkJCXMzMiBjeWNsZXMsCi0JCQkJCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgd2FpdF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IHRtczsKLQlzMzIgY291bnQ7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gd2FpdF9zdGF0ZSkKLQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgd2FpdF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJLyoKLQkJICogU2V0IFRNUyBoaWdoIHRvIGxvb3AgaW4gUkVTRVQgc3RhdGUKLQkJICogU2V0IFRNUyBsb3cgdG8gbG9vcCBpbiBhbnkgb3RoZXIgc3RhYmxlIHN0YXRlCi0JCSAqLwotCQl0bXMgPSAod2FpdF9zdGF0ZSA9PSBSRVNFVCkgPyBUTVNfSElHSCA6IFRNU19MT1c7Ci0KLQkJZm9yIChjb3VudCA9IDBMOyBjb3VudCA8IGN5Y2xlczsgY291bnQrKykKLQkJCWFsdF9qdGFnX2lvKHRtcywgVERJX0xPVywgSUdOT1JFX1RETyk7Ci0KLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYWx0ZXJhX3dhaXRfbXNlY3Moc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJczMyIG1pY3Jvc2Vjb25kcywgZW51bSBhbHRlcmFfanRhZ19zdGF0ZSB3YWl0X3N0YXRlKQotLyoKLSAqIENhdXNlcyBKVEFHIGhhcmR3YXJlIHRvIHNpdCBpbiB0aGUgc3BlY2lmaWVkIHN0YWJsZQotICogc3RhdGUgZm9yIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24gb2YgcmVhbCB0aW1lLiAgSWYKLSAqIG5vIEpUQUcgb3BlcmF0aW9ucyBoYXZlIGJlZW4gcGVyZm9ybWVkIHlldCwgdGhlbiBvbmx5Ci0gKiBhIGRlbGF5IGlzIHBlcmZvcm1lZC4gIFRoaXMgcGVybWl0cyB0aGUgV0FJVCBVU0VDUwotICogc3RhdGVtZW50IHRvIGJlIHVzZWQgaW4gVkVDVE9SIHByb2dyYW1zIHdpdGhvdXQgY2F1c2luZwotICogYW55IEpUQUcgb3BlcmF0aW9ucy4KLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgotICovCi17Ci0Jc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOwotCWludCBzdGF0dXMgPSAwOwotCi0JaWYgKChqcy0+anRhZ19zdGF0ZSAhPSBJTExFR0FMX0pUQUdfU1RBVEUpICYmCi0JICAgIChqcy0+anRhZ19zdGF0ZSAhPSB3YWl0X3N0YXRlKSkKLQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgd2FpdF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApCi0JCS8qIFdhaXQgZm9yIHNwZWNpZmllZCB0aW1lIGludGVydmFsICovCi0JCXVkZWxheShtaWNyb3NlY29uZHMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgYWx0ZXJhX2NvbmNhdGVuYXRlX2RhdGEodTggKmJ1ZmZlciwKLQkJCQl1OCAqcHJlYW1ibGVfZGF0YSwKLQkJCQl1MzIgcHJlYW1ibGVfY291bnQsCi0JCQkJdTggKnRhcmdldF9kYXRhLAotCQkJCXUzMiBzdGFydF9pbmRleCwKLQkJCQl1MzIgdGFyZ2V0X2NvdW50LAotCQkJCXU4ICpwb3N0YW1ibGVfZGF0YSwKLQkJCQl1MzIgcG9zdGFtYmxlX2NvdW50KQotLyoKLSAqIENvcGllcyBwcmVhbWJsZSBkYXRhLCB0YXJnZXQgZGF0YSwgYW5kIHBvc3RhbWJsZSBkYXRhCi0gKiBpbnRvIG9uZSBidWZmZXIgZm9yIElSIG9yIERSIHNjYW5zLgotICovCi17Ci0JdTMyIGksIGosIGs7Ci0KLQlmb3IgKGkgPSAwTDsgaSA8IHByZWFtYmxlX2NvdW50OyArK2kpIHsKLQkJaWYgKHByZWFtYmxlX2RhdGFbaSA+PiAzTF0gJiAoMUwgPDwgKGkgJiA3TCkpKQotCQkJYnVmZmVyW2kgPj4gM0xdIHw9ICgxTCA8PCAoaSAmIDdMKSk7Ci0JCWVsc2UKLQkJCWJ1ZmZlcltpID4+IDNMXSAmPSB+KHUzMikoMUwgPDwgKGkgJiA3TCkpOwotCi0JfQotCi0JaiA9IHN0YXJ0X2luZGV4OwotCWsgPSBwcmVhbWJsZV9jb3VudCArIHRhcmdldF9jb3VudDsKLQlmb3IgKDsgaSA8IGs7ICsraSwgKytqKSB7Ci0JCWlmICh0YXJnZXRfZGF0YVtqID4+IDNMXSAmICgxTCA8PCAoaiAmIDdMKSkpCi0JCQlidWZmZXJbaSA+PiAzTF0gfD0gKDFMIDw8IChpICYgN0wpKTsKLQkJZWxzZQotCQkJYnVmZmVyW2kgPj4gM0xdICY9IH4odTMyKSgxTCA8PCAoaSAmIDdMKSk7Ci0KLQl9Ci0KLQlqID0gMEw7Ci0JayA9IHByZWFtYmxlX2NvdW50ICsgdGFyZ2V0X2NvdW50ICsgcG9zdGFtYmxlX2NvdW50OwotCWZvciAoOyBpIDwgazsgKytpLCArK2opIHsKLQkJaWYgKHBvc3RhbWJsZV9kYXRhW2ogPj4gM0xdICYgKDFMIDw8IChqICYgN0wpKSkKLQkJCWJ1ZmZlcltpID4+IDNMXSB8PSAoMUwgPDwgKGkgJiA3TCkpOwotCQllbHNlCi0JCQlidWZmZXJbaSA+PiAzTF0gJj0gfih1MzIpKDFMIDw8IChpICYgN0wpKTsKLQotCX0KLX0KLQotc3RhdGljIGludCBhbHRfanRhZ19kcnNjYW4oc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJaW50IHN0YXJ0X3N0YXRlLAotCQkJaW50IGNvdW50LAotCQkJdTggKnRkaSwKLQkJCXU4ICp0ZG8pCi17Ci0JaW50IGkgPSAwOwotCWludCB0ZG9fYml0ID0gMDsKLQlpbnQgc3RhdHVzID0gMTsKLQotCS8qIEZpcnN0IGdvIHRvIERSU0hJRlQgc3RhdGUgKi8KLQlzd2l0Y2ggKHN0YXJ0X3N0YXRlKSB7Ci0JY2FzZSAwOgkJCQkJCS8qIElETEUgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUkNBUFRVUkUgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSU0hJRlQgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIDE6CQkJCQkJLyogRFJQQVVTRSAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJFWElUMiAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJVUERBVEUgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUkNBUFRVUkUgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSU0hJRlQgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIDI6CQkJCQkJLyogSVJQQVVTRSAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJFWElUMiAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJVUERBVEUgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUkNBUFRVUkUgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSU0hJRlQgKi8KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlzdGF0dXMgPSAwOwotCX0KLQotCWlmIChzdGF0dXMpIHsKLQkJLyogbG9vcCBpbiB0aGUgU0hJRlQtRFIgc3RhdGUgKi8KLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCXRkb19iaXQgPSBhbHRfanRhZ19pbygKLQkJCQkJKGkgPT0gY291bnQgLSAxKSwKLQkJCQkJdGRpW2kgPj4gM10gJiAoMSA8PCAoaSAmIDcpKSwKLQkJCQkJKHRkbyAhPSBOVUxMKSk7Ci0KLQkJCWlmICh0ZG8gIT0gTlVMTCkgewotCQkJCWlmICh0ZG9fYml0KQotCQkJCQl0ZG9baSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKLQkJCQllbHNlCi0JCQkJCXRkb1tpID4+IDNdICY9IH4odTMyKSgxIDw8IChpICYgNykpOwotCi0JCQl9Ci0JCX0KLQotCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogRFJQQVVTRSAqLwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgYWx0X2p0YWdfaXJzY2FuKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKLQkJICAgIGludCBzdGFydF9zdGF0ZSwKLQkJICAgIGludCBjb3VudCwKLQkJICAgIHU4ICp0ZGksCi0JCSAgICB1OCAqdGRvKQotewotCWludCBpID0gMDsKLQlpbnQgdGRvX2JpdCA9IDA7Ci0JaW50IHN0YXR1cyA9IDE7Ci0KLQkvKiBGaXJzdCBnbyB0byBJUlNISUZUIHN0YXRlICovCi0Jc3dpdGNoIChzdGFydF9zdGF0ZSkgewotCWNhc2UgMDoJCQkJCQkvKiBJRExFICovCi0JCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlNFTEVDVCAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJTRUxFQ1QgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIElSQ0FQVFVSRSAqLwotCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogSVJTSElGVCAqLwotCQlicmVhazsKLQotCWNhc2UgMToJCQkJCQkvKiBEUlBBVVNFICovCi0JCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUkVYSVQyICovCi0JCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlVQREFURSAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJTRUxFQ1QgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIElSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUkNBUFRVUkUgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIElSU0hJRlQgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIDI6CQkJCQkJLyogSVJQQVVTRSAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJFWElUMiAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJVUERBVEUgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBJUlNFTEVDVCAqLwotCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogSVJDQVBUVVJFICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUlNISUZUICovCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gMDsKLQl9Ci0KLQlpZiAoc3RhdHVzKSB7Ci0JCS8qIGxvb3AgaW4gdGhlIFNISUZULUlSIHN0YXRlICovCi0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQl0ZG9fYml0ID0gYWx0X2p0YWdfaW8oCi0JCQkJICAgICAgKGkgPT0gY291bnQgLSAxKSwKLQkJCQkgICAgICB0ZGlbaSA+PiAzXSAmICgxIDw8IChpICYgNykpLAotCQkJCSAgICAgICh0ZG8gIT0gTlVMTCkpOwotCQkJaWYgKHRkbyAhPSBOVUxMKSB7Ci0JCQkJaWYgKHRkb19iaXQpCi0JCQkJCXRkb1tpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOwotCQkJCWVsc2UKLQkJCQkJdGRvW2kgPj4gM10gJj0gfih1MzIpKDEgPDwgKGkgJiA3KSk7Ci0KLQkJCX0KLQkJfQotCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUlBBVVNFICovCi0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgYWx0ZXJhX2V4dHJhY3RfdGFyZ2V0X2RhdGEodTggKmJ1ZmZlciwKLQkJCQl1OCAqdGFyZ2V0X2RhdGEsCi0JCQkJdTMyIHN0YXJ0X2luZGV4LAotCQkJCXUzMiBwcmVhbWJsZV9jb3VudCwKLQkJCQl1MzIgdGFyZ2V0X2NvdW50KQotLyoKLSAqIENvcGllcyB0YXJnZXQgZGF0YSBmcm9tIHNjYW4gYnVmZmVyLCBmaWx0ZXJpbmcgb3V0Ci0gKiBwcmVhbWJsZSBhbmQgcG9zdGFtYmxlIGRhdGEuCi0gKi8KLXsKLQl1MzIgaTsKLQl1MzIgajsKLQl1MzIgazsKLQotCWogPSBwcmVhbWJsZV9jb3VudDsKLQlrID0gc3RhcnRfaW5kZXggKyB0YXJnZXRfY291bnQ7Ci0JZm9yIChpID0gc3RhcnRfaW5kZXg7IGkgPCBrOyArK2ksICsraikgewotCQlpZiAoYnVmZmVyW2ogPj4gM10gJiAoMSA8PCAoaiAmIDcpKSkKLQkJCXRhcmdldF9kYXRhW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7Ci0JCWVsc2UKLQkJCXRhcmdldF9kYXRhW2kgPj4gM10gJj0gfih1MzIpKDEgPDwgKGkgJiA3KSk7Ci0KLQl9Ci19Ci0KLWludCBhbHRlcmFfaXJzY2FuKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKLQkJCQl1MzIgY291bnQsCi0JCQkJdTggKnRkaV9kYXRhLAotCQkJCXUzMiBzdGFydF9pbmRleCkKLS8qIFNoaWZ0cyBkYXRhIGludG8gaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIgKi8KLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IHN0YXJ0X2NvZGUgPSAwOwotCXUzMiBhbGxvY19jaGFycyA9IDA7Ci0JdTMyIHNoaWZ0X2NvdW50ID0ganMtPmlyX3ByZSArIGNvdW50ICsganMtPmlyX3Bvc3Q7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGFydF9zdGF0ZSA9IElMTEVHQUxfSlRBR19TVEFURTsKLQotCXN3aXRjaCAoanMtPmp0YWdfc3RhdGUpIHsKLQljYXNlIElMTEVHQUxfSlRBR19TVEFURToKLQljYXNlIFJFU0VUOgotCWNhc2UgSURMRToKLQkJc3RhcnRfY29kZSA9IDA7Ci0JCXN0YXJ0X3N0YXRlID0gSURMRTsKLQkJYnJlYWs7Ci0KLQljYXNlIERSU0VMRUNUOgotCWNhc2UgRFJDQVBUVVJFOgotCWNhc2UgRFJTSElGVDoKLQljYXNlIERSRVhJVDE6Ci0JY2FzZSBEUlBBVVNFOgotCWNhc2UgRFJFWElUMjoKLQljYXNlIERSVVBEQVRFOgotCQlzdGFydF9jb2RlID0gMTsKLQkJc3RhcnRfc3RhdGUgPSBEUlBBVVNFOwotCQlicmVhazsKLQotCWNhc2UgSVJTRUxFQ1Q6Ci0JY2FzZSBJUkNBUFRVUkU6Ci0JY2FzZSBJUlNISUZUOgotCWNhc2UgSVJFWElUMToKLQljYXNlIElSUEFVU0U6Ci0JY2FzZSBJUkVYSVQyOgotCWNhc2UgSVJVUERBVEU6Ci0JCXN0YXJ0X2NvZGUgPSAyOwotCQlzdGFydF9zdGF0ZSA9IElSUEFVU0U7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gLUVSRU1PVEVJTzsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gc3RhcnRfc3RhdGUpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBzdGFydF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKHNoaWZ0X2NvdW50ID4ganMtPmlyX2xlbmd0aCkgewotCQkJYWxsb2NfY2hhcnMgPSAoc2hpZnRfY291bnQgKyA3KSA+PiAzOwotCQkJa2ZyZWUoanMtPmlyX2J1ZmZlcik7Ci0JCQlqcy0+aXJfYnVmZmVyID0gKHU4ICopYWx0X21hbGxvYyhhbGxvY19jaGFycyk7Ci0JCQlpZiAoanMtPmlyX2J1ZmZlciA9PSBOVUxMKQotCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQllbHNlCi0JCQkJanMtPmlyX2xlbmd0aCA9IGFsbG9jX2NoYXJzICogODsKLQotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qCi0JCSAqIENvcHkgcHJlYW1ibGUgZGF0YSwgSVIgZGF0YSwKLQkJICogYW5kIHBvc3RhbWJsZSBkYXRhIGludG8gYSBidWZmZXIKLQkJICovCi0JCWFsdGVyYV9jb25jYXRlbmF0ZV9kYXRhKGpzLT5pcl9idWZmZXIsCi0JCQkJCWpzLT5pcl9wcmVfZGF0YSwKLQkJCQkJanMtPmlyX3ByZSwKLQkJCQkJdGRpX2RhdGEsCi0JCQkJCXN0YXJ0X2luZGV4LAotCQkJCQljb3VudCwKLQkJCQkJanMtPmlyX3Bvc3RfZGF0YSwKLQkJCQkJanMtPmlyX3Bvc3QpOwotCQkvKiBEbyB0aGUgSVJTQ0FOICovCi0JCWFsdF9qdGFnX2lyc2Nhbihhc3RhdGUsCi0JCQkJc3RhcnRfY29kZSwKLQkJCQlzaGlmdF9jb3VudCwKLQkJCQlqcy0+aXJfYnVmZmVyLAotCQkJCU5VTEwpOwotCi0JCS8qIGFsdF9qdGFnX2lyc2NhbigpIGFsd2F5cyBlbmRzIGluIElSUEFVU0Ugc3RhdGUgKi8KLQkJanMtPmp0YWdfc3RhdGUgPSBJUlBBVVNFOwotCX0KLQotCWlmIChzdGF0dXMgPT0gMCkKLQkJaWYgKGpzLT5pcnN0b3Bfc3RhdGUgIT0gSVJQQVVTRSkKLQkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIGpzLT5pcnN0b3Bfc3RhdGUpOwotCi0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYWx0ZXJhX3N3YXBfaXIoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJICAgIHUzMiBjb3VudCwKLQkJCSAgICB1OCAqaW5fZGF0YSwKLQkJCSAgICB1MzIgaW5faW5kZXgsCi0JCQkgICAgdTggKm91dF9kYXRhLAotCQkJICAgIHUzMiBvdXRfaW5kZXgpCi0vKiBTaGlmdHMgZGF0YSBpbnRvIGluc3RydWN0aW9uIHJlZ2lzdGVyLCBjYXB0dXJpbmcgb3V0cHV0IGRhdGEgKi8KLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IHN0YXJ0X2NvZGUgPSAwOwotCXUzMiBhbGxvY19jaGFycyA9IDA7Ci0JdTMyIHNoaWZ0X2NvdW50ID0ganMtPmlyX3ByZSArIGNvdW50ICsganMtPmlyX3Bvc3Q7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGFydF9zdGF0ZSA9IElMTEVHQUxfSlRBR19TVEFURTsKLQotCXN3aXRjaCAoanMtPmp0YWdfc3RhdGUpIHsKLQljYXNlIElMTEVHQUxfSlRBR19TVEFURToKLQljYXNlIFJFU0VUOgotCWNhc2UgSURMRToKLQkJc3RhcnRfY29kZSA9IDA7Ci0JCXN0YXJ0X3N0YXRlID0gSURMRTsKLQkJYnJlYWs7Ci0KLQljYXNlIERSU0VMRUNUOgotCWNhc2UgRFJDQVBUVVJFOgotCWNhc2UgRFJTSElGVDoKLQljYXNlIERSRVhJVDE6Ci0JY2FzZSBEUlBBVVNFOgotCWNhc2UgRFJFWElUMjoKLQljYXNlIERSVVBEQVRFOgotCQlzdGFydF9jb2RlID0gMTsKLQkJc3RhcnRfc3RhdGUgPSBEUlBBVVNFOwotCQlicmVhazsKLQotCWNhc2UgSVJTRUxFQ1Q6Ci0JY2FzZSBJUkNBUFRVUkU6Ci0JY2FzZSBJUlNISUZUOgotCWNhc2UgSVJFWElUMToKLQljYXNlIElSUEFVU0U6Ci0JY2FzZSBJUkVYSVQyOgotCWNhc2UgSVJVUERBVEU6Ci0JCXN0YXJ0X2NvZGUgPSAyOwotCQlzdGFydF9zdGF0ZSA9IElSUEFVU0U7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gLUVSRU1PVEVJTzsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gc3RhcnRfc3RhdGUpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBzdGFydF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKHNoaWZ0X2NvdW50ID4ganMtPmlyX2xlbmd0aCkgewotCQkJYWxsb2NfY2hhcnMgPSAoc2hpZnRfY291bnQgKyA3KSA+PiAzOwotCQkJa2ZyZWUoanMtPmlyX2J1ZmZlcik7Ci0JCQlqcy0+aXJfYnVmZmVyID0gKHU4ICopYWx0X21hbGxvYyhhbGxvY19jaGFycyk7Ci0JCQlpZiAoanMtPmlyX2J1ZmZlciA9PSBOVUxMKQotCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQllbHNlCi0JCQkJanMtPmlyX2xlbmd0aCA9IGFsbG9jX2NoYXJzICogODsKLQotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qCi0JCSAqIENvcHkgcHJlYW1ibGUgZGF0YSwgSVIgZGF0YSwKLQkJICogYW5kIHBvc3RhbWJsZSBkYXRhIGludG8gYSBidWZmZXIKLQkJICovCi0JCWFsdGVyYV9jb25jYXRlbmF0ZV9kYXRhKGpzLT5pcl9idWZmZXIsCi0JCQkJCWpzLT5pcl9wcmVfZGF0YSwKLQkJCQkJanMtPmlyX3ByZSwKLQkJCQkJaW5fZGF0YSwKLQkJCQkJaW5faW5kZXgsCi0JCQkJCWNvdW50LAotCQkJCQlqcy0+aXJfcG9zdF9kYXRhLAotCQkJCQlqcy0+aXJfcG9zdCk7Ci0KLQkJLyogRG8gdGhlIElSU0NBTiAqLwotCQlhbHRfanRhZ19pcnNjYW4oYXN0YXRlLAotCQkJCXN0YXJ0X2NvZGUsCi0JCQkJc2hpZnRfY291bnQsCi0JCQkJanMtPmlyX2J1ZmZlciwKLQkJCQlqcy0+aXJfYnVmZmVyKTsKLQotCQkvKiBhbHRfanRhZ19pcnNjYW4oKSBhbHdheXMgZW5kcyBpbiBJUlBBVVNFIHN0YXRlICovCi0JCWpzLT5qdGFnX3N0YXRlID0gSVJQQVVTRTsKLQl9Ci0KLQlpZiAoc3RhdHVzID09IDApCi0JCWlmIChqcy0+aXJzdG9wX3N0YXRlICE9IElSUEFVU0UpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBqcy0+aXJzdG9wX3N0YXRlKTsKLQotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQkvKiBOb3cgZXh0cmFjdCB0aGUgcmV0dXJuZWQgZGF0YSBmcm9tIHRoZSBidWZmZXIgKi8KLQkJYWx0ZXJhX2V4dHJhY3RfdGFyZ2V0X2RhdGEoanMtPmlyX2J1ZmZlciwKLQkJCQkJb3V0X2RhdGEsIG91dF9pbmRleCwKLQkJCQkJanMtPmlyX3ByZSwgY291bnQpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IGFsdGVyYV9kcnNjYW4oc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJCXUzMiBjb3VudCwKLQkJCQl1OCAqdGRpX2RhdGEsCi0JCQkJdTMyIHN0YXJ0X2luZGV4KQotLyogU2hpZnRzIGRhdGEgaW50byBkYXRhIHJlZ2lzdGVyIChpZ25vcmluZyBvdXRwdXQgZGF0YSkgKi8KLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IHN0YXJ0X2NvZGUgPSAwOwotCXUzMiBhbGxvY19jaGFycyA9IDA7Ci0JdTMyIHNoaWZ0X2NvdW50ID0ganMtPmRyX3ByZSArIGNvdW50ICsganMtPmRyX3Bvc3Q7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGFydF9zdGF0ZSA9IElMTEVHQUxfSlRBR19TVEFURTsKLQotCXN3aXRjaCAoanMtPmp0YWdfc3RhdGUpIHsKLQljYXNlIElMTEVHQUxfSlRBR19TVEFURToKLQljYXNlIFJFU0VUOgotCWNhc2UgSURMRToKLQkJc3RhcnRfY29kZSA9IDA7Ci0JCXN0YXJ0X3N0YXRlID0gSURMRTsKLQkJYnJlYWs7Ci0KLQljYXNlIERSU0VMRUNUOgotCWNhc2UgRFJDQVBUVVJFOgotCWNhc2UgRFJTSElGVDoKLQljYXNlIERSRVhJVDE6Ci0JY2FzZSBEUlBBVVNFOgotCWNhc2UgRFJFWElUMjoKLQljYXNlIERSVVBEQVRFOgotCQlzdGFydF9jb2RlID0gMTsKLQkJc3RhcnRfc3RhdGUgPSBEUlBBVVNFOwotCQlicmVhazsKLQotCWNhc2UgSVJTRUxFQ1Q6Ci0JY2FzZSBJUkNBUFRVUkU6Ci0JY2FzZSBJUlNISUZUOgotCWNhc2UgSVJFWElUMToKLQljYXNlIElSUEFVU0U6Ci0JY2FzZSBJUkVYSVQyOgotCWNhc2UgSVJVUERBVEU6Ci0JCXN0YXJ0X2NvZGUgPSAyOwotCQlzdGFydF9zdGF0ZSA9IElSUEFVU0U7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gLUVSRU1PVEVJTzsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gc3RhcnRfc3RhdGUpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBzdGFydF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKHNoaWZ0X2NvdW50ID4ganMtPmRyX2xlbmd0aCkgewotCQkJYWxsb2NfY2hhcnMgPSAoc2hpZnRfY291bnQgKyA3KSA+PiAzOwotCQkJa2ZyZWUoanMtPmRyX2J1ZmZlcik7Ci0JCQlqcy0+ZHJfYnVmZmVyID0gKHU4ICopYWx0X21hbGxvYyhhbGxvY19jaGFycyk7Ci0JCQlpZiAoanMtPmRyX2J1ZmZlciA9PSBOVUxMKQotCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQllbHNlCi0JCQkJanMtPmRyX2xlbmd0aCA9IGFsbG9jX2NoYXJzICogODsKLQotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qCi0JCSAqIENvcHkgcHJlYW1ibGUgZGF0YSwgRFIgZGF0YSwKLQkJICogYW5kIHBvc3RhbWJsZSBkYXRhIGludG8gYSBidWZmZXIKLQkJICovCi0JCWFsdGVyYV9jb25jYXRlbmF0ZV9kYXRhKGpzLT5kcl9idWZmZXIsCi0JCQkJCWpzLT5kcl9wcmVfZGF0YSwKLQkJCQkJanMtPmRyX3ByZSwKLQkJCQkJdGRpX2RhdGEsCi0JCQkJCXN0YXJ0X2luZGV4LAotCQkJCQljb3VudCwKLQkJCQkJanMtPmRyX3Bvc3RfZGF0YSwKLQkJCQkJanMtPmRyX3Bvc3QpOwotCQkvKiBEbyB0aGUgRFJTQ0FOICovCi0JCWFsdF9qdGFnX2Ryc2Nhbihhc3RhdGUsIHN0YXJ0X2NvZGUsIHNoaWZ0X2NvdW50LAotCQkJCWpzLT5kcl9idWZmZXIsIE5VTEwpOwotCQkvKiBhbHRfanRhZ19kcnNjYW4oKSBhbHdheXMgZW5kcyBpbiBEUlBBVVNFIHN0YXRlICovCi0JCWpzLT5qdGFnX3N0YXRlID0gRFJQQVVTRTsKLQl9Ci0KLQlpZiAoc3RhdHVzID09IDApCi0JCWlmIChqcy0+ZHJzdG9wX3N0YXRlICE9IERSUEFVU0UpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBqcy0+ZHJzdG9wX3N0YXRlKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBhbHRlcmFfc3dhcF9kcihzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsIHUzMiBjb3VudCwKLQkJCQl1OCAqaW5fZGF0YSwgdTMyIGluX2luZGV4LAotCQkJCXU4ICpvdXRfZGF0YSwgdTMyIG91dF9pbmRleCkKLS8qIFNoaWZ0cyBkYXRhIGludG8gZGF0YSByZWdpc3RlciwgY2FwdHVyaW5nIG91dHB1dCBkYXRhICovCi17Ci0Jc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOwotCWludCBzdGFydF9jb2RlID0gMDsKLQl1MzIgYWxsb2NfY2hhcnMgPSAwOwotCXUzMiBzaGlmdF9jb3VudCA9IGpzLT5kcl9wcmUgKyBjb3VudCArIGpzLT5kcl9wb3N0OwotCWludCBzdGF0dXMgPSAwOwotCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgc3RhcnRfc3RhdGUgPSBJTExFR0FMX0pUQUdfU1RBVEU7Ci0KLQlzd2l0Y2ggKGpzLT5qdGFnX3N0YXRlKSB7Ci0JY2FzZSBJTExFR0FMX0pUQUdfU1RBVEU6Ci0JY2FzZSBSRVNFVDoKLQljYXNlIElETEU6Ci0JCXN0YXJ0X2NvZGUgPSAwOwotCQlzdGFydF9zdGF0ZSA9IElETEU7Ci0JCWJyZWFrOwotCi0JY2FzZSBEUlNFTEVDVDoKLQljYXNlIERSQ0FQVFVSRToKLQljYXNlIERSU0hJRlQ6Ci0JY2FzZSBEUkVYSVQxOgotCWNhc2UgRFJQQVVTRToKLQljYXNlIERSRVhJVDI6Ci0JY2FzZSBEUlVQREFURToKLQkJc3RhcnRfY29kZSA9IDE7Ci0JCXN0YXJ0X3N0YXRlID0gRFJQQVVTRTsKLQkJYnJlYWs7Ci0KLQljYXNlIElSU0VMRUNUOgotCWNhc2UgSVJDQVBUVVJFOgotCWNhc2UgSVJTSElGVDoKLQljYXNlIElSRVhJVDE6Ci0JY2FzZSBJUlBBVVNFOgotCWNhc2UgSVJFWElUMjoKLQljYXNlIElSVVBEQVRFOgotCQlzdGFydF9jb2RlID0gMjsKLQkJc3RhcnRfc3RhdGUgPSBJUlBBVVNFOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXN0YXR1cyA9IC1FUkVNT1RFSU87Ci0JCWJyZWFrOwotCX0KLQotCWlmIChzdGF0dXMgPT0gMCkKLQkJaWYgKGpzLT5qdGFnX3N0YXRlICE9IHN0YXJ0X3N0YXRlKQotCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgc3RhcnRfc3RhdGUpOwotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChzaGlmdF9jb3VudCA+IGpzLT5kcl9sZW5ndGgpIHsKLQkJCWFsbG9jX2NoYXJzID0gKHNoaWZ0X2NvdW50ICsgNykgPj4gMzsKLQkJCWtmcmVlKGpzLT5kcl9idWZmZXIpOwotCQkJanMtPmRyX2J1ZmZlciA9ICh1OCAqKWFsdF9tYWxsb2MoYWxsb2NfY2hhcnMpOwotCi0JCQlpZiAoanMtPmRyX2J1ZmZlciA9PSBOVUxMKQotCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQllbHNlCi0JCQkJanMtPmRyX2xlbmd0aCA9IGFsbG9jX2NoYXJzICogODsKLQotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qCi0JCSAqIENvcHkgcHJlYW1ibGUgZGF0YSwgRFIgZGF0YSwKLQkJICogYW5kIHBvc3RhbWJsZSBkYXRhIGludG8gYSBidWZmZXIKLQkJICovCi0JCWFsdGVyYV9jb25jYXRlbmF0ZV9kYXRhKGpzLT5kcl9idWZmZXIsCi0JCQkJanMtPmRyX3ByZV9kYXRhLAotCQkJCWpzLT5kcl9wcmUsCi0JCQkJaW5fZGF0YSwKLQkJCQlpbl9pbmRleCwKLQkJCQljb3VudCwKLQkJCQlqcy0+ZHJfcG9zdF9kYXRhLAotCQkJCWpzLT5kcl9wb3N0KTsKLQotCQkvKiBEbyB0aGUgRFJTQ0FOICovCi0JCWFsdF9qdGFnX2Ryc2Nhbihhc3RhdGUsCi0JCQkJc3RhcnRfY29kZSwKLQkJCQlzaGlmdF9jb3VudCwKLQkJCQlqcy0+ZHJfYnVmZmVyLAotCQkJCWpzLT5kcl9idWZmZXIpOwotCi0JCS8qIGFsdF9qdGFnX2Ryc2NhbigpIGFsd2F5cyBlbmRzIGluIERSUEFVU0Ugc3RhdGUgKi8KLQkJanMtPmp0YWdfc3RhdGUgPSBEUlBBVVNFOwotCX0KLQotCWlmIChzdGF0dXMgPT0gMCkKLQkJaWYgKGpzLT5kcnN0b3Bfc3RhdGUgIT0gRFJQQVVTRSkKLQkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIGpzLT5kcnN0b3Bfc3RhdGUpOwotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQkvKiBOb3cgZXh0cmFjdCB0aGUgcmV0dXJuZWQgZGF0YSBmcm9tIHRoZSBidWZmZXIgKi8KLQkJYWx0ZXJhX2V4dHJhY3RfdGFyZ2V0X2RhdGEoanMtPmRyX2J1ZmZlciwKLQkJCQkJb3V0X2RhdGEsCi0JCQkJCW91dF9pbmRleCwKLQkJCQkJanMtPmRyX3ByZSwKLQkJCQkJY291bnQpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBhbHRlcmFfZnJlZV9idWZmZXJzKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSkKLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JLyogSWYgdGhlIEpUQUcgaW50ZXJmYWNlIHdhcyB1c2VkLCByZXNldCBpdCB0byBUTFIgKi8KLQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gSUxMRUdBTF9KVEFHX1NUQVRFKQotCQlhbHRlcmFfanJlc2V0X2lkbGUoYXN0YXRlKTsKLQotCWtmcmVlKGpzLT5kcl9wcmVfZGF0YSk7Ci0JanMtPmRyX3ByZV9kYXRhID0gTlVMTDsKLQotCWtmcmVlKGpzLT5kcl9wb3N0X2RhdGEpOwotCWpzLT5kcl9wb3N0X2RhdGEgPSBOVUxMOwotCi0Ja2ZyZWUoanMtPmRyX2J1ZmZlcik7Ci0JanMtPmRyX2J1ZmZlciA9IE5VTEw7Ci0KLQlrZnJlZShqcy0+aXJfcHJlX2RhdGEpOwotCWpzLT5pcl9wcmVfZGF0YSA9IE5VTEw7Ci0KLQlrZnJlZShqcy0+aXJfcG9zdF9kYXRhKTsKLQlqcy0+aXJfcG9zdF9kYXRhID0gTlVMTDsKLQotCWtmcmVlKGpzLT5pcl9idWZmZXIpOwotCWpzLT5pcl9idWZmZXIgPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZWZmNmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MzcgKzAsMCBAQAotLyoKLSAqIGFsdGVyYS5jCi0gKgotICogYWx0ZXJhIEZQR0EgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSBBbHRlcmEgQ29ycG9yYXRpb24gMTk5OC0yMDAxCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsMjAxMSBOZXRVUCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsMjAxMSBJZ29yIE0uIExpcGxpYW5pbiA8bGlwbGlhbmluQG5ldHVwLnJ1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSAiYWx0ZXJhLmgiCi0jaW5jbHVkZSAiYWx0ZXJhLWV4cHJ0LmgiCi0jaW5jbHVkZSAiYWx0ZXJhLWp0YWcuaCIKLQotc3RhdGljIGludCBkZWJ1ZyA9IDE7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oImFsdGVyYSBGUEdBIGtlcm5lbCBtb2R1bGUiKTsKLU1PRFVMRV9BVVRIT1IoIklnb3IgTS4gTGlwbGlhbmluICA8bGlwbGlhbmluQG5ldHVwLnJ1PiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAotCWlmIChkZWJ1ZykgeyBcCi0JCXByaW50ayhLRVJOX0RFQlVHIGFyZ3MpOyBcCi0JfQotCi1lbnVtIGFsdGVyYV9mcGdhX29wY29kZSB7Ci0JT1BfTk9QID0gMCwKLQlPUF9EVVAsCi0JT1BfU1dQLAotCU9QX0FERCwKLQlPUF9TVUIsCi0JT1BfTVVMVCwKLQlPUF9ESVYsCi0JT1BfTU9ELAotCU9QX1NITCwKLQlPUF9TSFIsCi0JT1BfTk9ULAotCU9QX0FORCwKLQlPUF9PUiwKLQlPUF9YT1IsCi0JT1BfSU5WLAotCU9QX0dULAotCU9QX0xULAotCU9QX1JFVCwKLQlPUF9DTVBTLAotCU9QX1BJTlQsCi0JT1BfUFJOVCwKLQlPUF9EU1MsCi0JT1BfRFNTQywKLQlPUF9JU1MsCi0JT1BfSVNTQywKLQlPUF9EUFIgPSAweDFjLAotCU9QX0RQUkwsCi0JT1BfRFBPLAotCU9QX0RQT0wsCi0JT1BfSVBSLAotCU9QX0lQUkwsCi0JT1BfSVBPLAotCU9QX0lQT0wsCi0JT1BfUENIUiwKLQlPUF9FWElULAotCU9QX0VRVSwKLQlPUF9QT1BULAotCU9QX0FCUyA9IDB4MmMsCi0JT1BfQkNIMCwKLQlPUF9QU0gwID0gMHgyZiwKLQlPUF9QU0hMID0gMHg0MCwKLQlPUF9QU0hWLAotCU9QX0pNUCwKLQlPUF9DQUxMLAotCU9QX05FWFQsCi0JT1BfUFNUUiwKLQlPUF9TSU5UID0gMHg0NywKLQlPUF9TVCwKLQlPUF9JU1RQLAotCU9QX0RTVFAsCi0JT1BfU1dQTiwKLQlPUF9EVVBOLAotCU9QX1BPUFYsCi0JT1BfUE9QRSwKLQlPUF9QT1BBLAotCU9QX0pNUFosCi0JT1BfRFMsCi0JT1BfSVMsCi0JT1BfRFBSQSwKLQlPUF9EUE9BLAotCU9QX0lQUkEsCi0JT1BfSVBPQSwKLQlPUF9FWFBULAotCU9QX1BTSEUsCi0JT1BfUFNIQSwKLQlPUF9EWU5BLAotCU9QX0VYUFYgPSAweDVjLAotCU9QX0NPUFkgPSAweDgwLAotCU9QX1JFVkEsCi0JT1BfRFNDLAotCU9QX0lTQywKLQlPUF9XQUlULAotCU9QX1ZTLAotCU9QX0NNUEEgPSAweGMwLAotCU9QX1ZTQywKLX07Ci0KLXN0cnVjdCBhbHRlcmFfcHJvY2luZm8gewotCWNoYXIJCQkqbmFtZTsKLQl1OAkJCWF0dHJzOwotCXN0cnVjdCBhbHRlcmFfcHJvY2luZm8JKm5leHQ7Ci19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBlbm91Z2ggcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzdGFjay4gKi8KLXN0YXRpYyBpbnQgYWx0ZXJhX2NoZWNrX3N0YWNrKGludCBzdGFja19wdHIsIGludCBjb3VudCwgaW50ICpzdGF0dXMpCi17Ci0JaWYgKHN0YWNrX3B0ciA8IGNvdW50KSB7Ci0JCSpzdGF0dXMgPSAtRU9WRVJGTE9XOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgYWx0ZXJhX2V4cG9ydF9pbnQoY2hhciAqa2V5LCBzMzIgdmFsdWUpCi17Ci0JZHByaW50aygiRXhwb3J0OiBrZXkgPSBcIiVzXCIsIHZhbHVlID0gJWRcbiIsIGtleSwgdmFsdWUpOwotfQotCi0jZGVmaW5lIEhFWF9MSU5FX0NIQVJTIDcyCi0jZGVmaW5lIEhFWF9MSU5FX0JJVFMgKEhFWF9MSU5FX0NIQVJTICogNCkKLQotc3RhdGljIHZvaWQgYWx0ZXJhX2V4cG9ydF9ib29sX2FycmF5KGNoYXIgKmtleSwgdTggKmRhdGEsIHMzMiBjb3VudCkKLXsKLQljaGFyIHN0cmluZ1tIRVhfTElORV9DSEFSUyArIDFdOwotCXMzMiBpLCBvZmZzZXQ7Ci0JdTMyIHNpemUsIGxpbmUsIGxpbmVzLCBsaW5lYml0cywgdmFsdWUsIGosIGs7Ci0KLQlpZiAoY291bnQgPiBIRVhfTElORV9CSVRTKSB7Ci0JCWRwcmludGsoIkV4cG9ydDoga2V5ID0gXCIlc1wiLCAlZCBiaXRzLCB2YWx1ZSA9IEhFWFxuIiwKLQkJCQkJCQlrZXksIGNvdW50KTsKLQkJbGluZXMgPSAoY291bnQgKyAoSEVYX0xJTkVfQklUUyAtIDEpKSAvIEhFWF9MSU5FX0JJVFM7Ci0KLQkJZm9yIChsaW5lID0gMDsgbGluZSA8IGxpbmVzOyArK2xpbmUpIHsKLQkJCWlmIChsaW5lIDwgKGxpbmVzIC0gMSkpIHsKLQkJCQlsaW5lYml0cyA9IEhFWF9MSU5FX0JJVFM7Ci0JCQkJc2l6ZSA9IEhFWF9MSU5FX0NIQVJTOwotCQkJCW9mZnNldCA9IGNvdW50IC0gKChsaW5lICsgMSkgKiBIRVhfTElORV9CSVRTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGluZWJpdHMgPQotCQkJCQljb3VudCAtICgobGluZXMgLSAxKSAqIEhFWF9MSU5FX0JJVFMpOwotCQkJCXNpemUgPSAobGluZWJpdHMgKyAzKSAvIDQ7Ci0JCQkJb2Zmc2V0ID0gMEw7Ci0JCQl9Ci0KLQkJCXN0cmluZ1tzaXplXSA9ICdcMCc7Ci0JCQlqID0gc2l6ZSAtIDE7Ci0JCQl2YWx1ZSA9IDA7Ci0KLQkJCWZvciAoayA9IDA7IGsgPCBsaW5lYml0czsgKytrKSB7Ci0JCQkJaSA9IGsgKyBvZmZzZXQ7Ci0JCQkJaWYgKGRhdGFbaSA+PiAzXSAmICgxIDw8IChpICYgNykpKQotCQkJCQl2YWx1ZSB8PSAoMSA8PCAoaSAmIDMpKTsKLQkJCQlpZiAoKGkgJiAzKSA9PSAzKSB7Ci0JCQkJCXNwcmludGYoJnN0cmluZ1tqXSwgIiUxeCIsIHZhbHVlKTsKLQkJCQkJdmFsdWUgPSAwOwotCQkJCQktLWo7Ci0JCQkJfQotCQkJfQotCQkJaWYgKChrICYgMykgPiAwKQotCQkJCXNwcmludGYoJnN0cmluZ1tqXSwgIiUxeCIsIHZhbHVlKTsKLQotCQkJZHByaW50aygiJXNcbiIsIHN0cmluZyk7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCXNpemUgPSAoY291bnQgKyAzKSAvIDQ7Ci0JCXN0cmluZ1tzaXplXSA9ICdcMCc7Ci0JCWogPSBzaXplIC0gMTsKLQkJdmFsdWUgPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCQlpZiAoZGF0YVtpID4+IDNdICYgKDEgPDwgKGkgJiA3KSkpCi0JCQkJdmFsdWUgfD0gKDEgPDwgKGkgJiAzKSk7Ci0JCQlpZiAoKGkgJiAzKSA9PSAzKSB7Ci0JCQkJc3ByaW50Zigmc3RyaW5nW2pdLCAiJTF4IiwgdmFsdWUpOwotCQkJCXZhbHVlID0gMDsKLQkJCQktLWo7Ci0JCQl9Ci0JCX0KLQkJaWYgKChpICYgMykgPiAwKQotCQkJc3ByaW50Zigmc3RyaW5nW2pdLCAiJTF4IiwgdmFsdWUpOwotCi0JCWRwcmludGsoIkV4cG9ydDoga2V5ID0gXCIlc1wiLCAlZCBiaXRzLCB2YWx1ZSA9IEhFWCAlc1xuIiwKLQkJCWtleSwgY291bnQsIHN0cmluZyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGFsdGVyYV9leGVjdXRlKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKLQkJCQl1OCAqcCwKLQkJCQlzMzIgcHJvZ3JhbV9zaXplLAotCQkJCXMzMiAqZXJyb3JfYWRkcmVzcywKLQkJCQlpbnQgKmV4aXRfY29kZSwKLQkJCQlpbnQgKmZvcm1hdF92ZXJzaW9uKQotewotCXN0cnVjdCBhbHRlcmFfY29uZmlnICphY29uZiA9IGFzdGF0ZS0+Y29uZmlnOwotCWNoYXIgKm1zZ19idWZmID0gYXN0YXRlLT5tc2dfYnVmZjsKLQlsb25nICpzdGFjayA9IGFzdGF0ZS0+c3RhY2s7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTMyIGZpcnN0X3dvcmQgPSAwTDsKLQl1MzIgYWN0aW9uX3RhYmxlID0gMEw7Ci0JdTMyIHByb2NfdGFibGUgPSAwTDsKLQl1MzIgc3RyX3RhYmxlID0gMEw7Ci0JdTMyIHN5bV90YWJsZSA9IDBMOwotCXUzMiBkYXRhX3NlY3QgPSAwTDsKLQl1MzIgY29kZV9zZWN0ID0gMEw7Ci0JdTMyIGRlYnVnX3NlY3QgPSAwTDsKLQl1MzIgYWN0aW9uX2NvdW50ID0gMEw7Ci0JdTMyIHByb2NfY291bnQgPSAwTDsKLQl1MzIgc3ltX2NvdW50ID0gMEw7Ci0JbG9uZyAqdmFycyA9IE5VTEw7Ci0JczMyICp2YXJfc2l6ZSA9IE5VTEw7Ci0JY2hhciAqYXR0cnMgPSBOVUxMOwotCXU4ICpwcm9jX2F0dHJpYnV0ZXMgPSBOVUxMOwotCXUzMiBwYzsKLQl1MzIgb3Bjb2RlX2FkZHJlc3M7Ci0JdTMyIGFyZ3NbM107Ci0JdTMyIG9wY29kZTsKLQl1MzIgbmFtZV9pZDsKLQl1OCBjaGFyYnVmWzRdOwotCWxvbmcgbG9uZ190bXA7Ci0JdTMyIHZhcmlhYmxlX2lkOwotCXU4ICpjaGFycHRyX3RtcDsKLQl1OCAqY2hhcnB0cl90bXAyOwotCWxvbmcgKmxvbmdwdHJfdG1wOwotCWludCB2ZXJzaW9uID0gMDsKLQlpbnQgZGVsdGEgPSAwOwotCWludCBzdGFja19wdHIgPSAwOwotCXUzMiBhcmdfY291bnQ7Ci0JaW50IGRvbmUgPSAwOwotCWludCBiYWRfb3Bjb2RlID0gMDsKLQl1MzIgY291bnQ7Ci0JdTMyIGluZGV4OwotCXUzMiBpbmRleDI7Ci0JczMyIGxvbmdfY291bnQ7Ci0JczMyIGxvbmdfaWR4OwotCXMzMiBsb25nX2lkeDI7Ci0JdTMyIGk7Ci0JdTMyIGo7Ci0JdTMyIHVuY29tcF9zaXplOwotCXUzMiBvZmZzZXQ7Ci0JdTMyIHZhbHVlOwotCWludCBjdXJyZW50X3Byb2MgPSAwOwotCWludCByZXZlcnNlOwotCi0JY2hhciAqbmFtZTsKLQotCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBSZWFkIGhlYWRlciBpbmZvcm1hdGlvbiAqLwotCWlmIChwcm9ncmFtX3NpemUgPiA1MkwpIHsKLQkJZmlyc3Rfd29yZCAgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFswXSk7Ci0JCXZlcnNpb24gPSAoZmlyc3Rfd29yZCAmIDFMKTsKLQkJKmZvcm1hdF92ZXJzaW9uID0gdmVyc2lvbiArIDE7Ci0JCWRlbHRhID0gdmVyc2lvbiAqIDg7Ci0KLQkJYWN0aW9uX3RhYmxlICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0XSk7Ci0JCXByb2NfdGFibGUgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbOF0pOwotCQlzdHJfdGFibGUgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzQgKyBkZWx0YV0pOwotCQlzeW1fdGFibGUgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzE2ICsgZGVsdGFdKTsKLQkJZGF0YV9zZWN0ICA9IGdldF91bmFsaWduZWRfYmUzMigmcFsyMCArIGRlbHRhXSk7Ci0JCWNvZGVfc2VjdCAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMjQgKyBkZWx0YV0pOwotCQlkZWJ1Z19zZWN0ID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzI4ICsgZGVsdGFdKTsKLQkJYWN0aW9uX2NvdW50ICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0MCArIGRlbHRhXSk7Ci0JCXByb2NfY291bnQgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNDQgKyBkZWx0YV0pOwotCQlzeW1fY291bnQgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzQ4ICsgKDIgKiBkZWx0YSldKTsKLQl9Ci0KLQlpZiAoKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMEwpICYmIChmaXJzdF93b3JkICE9IDB4NEE0MTREMDFMKSkgewotCQlkb25lID0gMTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBleGl0X2RvbmU7Ci0JfQotCi0JaWYgKHN5bV9jb3VudCA8PSAwKQotCQlnb3RvIGV4aXRfZG9uZTsKLQotCXZhcnMgPSBremFsbG9jKHN5bV9jb3VudCAqIHNpemVvZihsb25nKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAodmFycyA9PSBOVUxMKQotCQlzdGF0dXMgPSAtRU5PTUVNOwotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCXZhcl9zaXplID0ga3phbGxvYyhzeW1fY291bnQgKiBzaXplb2YoczMyKSwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKHZhcl9zaXplID09IE5VTEwpCi0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCX0KLQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlhdHRycyA9IGt6YWxsb2Moc3ltX2NvdW50LCBHRlBfS0VSTkVMKTsKLQotCQlpZiAoYXR0cnMgPT0gTlVMTCkKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JfQotCi0JaWYgKChzdGF0dXMgPT0gMCkgJiYgKHZlcnNpb24gPiAwKSkgewotCQlwcm9jX2F0dHJpYnV0ZXMgPSBremFsbG9jKHByb2NfY291bnQsIEdGUF9LRVJORUwpOwotCi0JCWlmIChwcm9jX2F0dHJpYnV0ZXMgPT0gTlVMTCkKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JfQotCi0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGV4aXRfZG9uZTsKLQotCWRlbHRhID0gdmVyc2lvbiAqIDI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3ltX2NvdW50OyArK2kpIHsKLQkJb2Zmc2V0ID0gKHN5bV90YWJsZSArICgoMTEgKyBkZWx0YSkgKiBpKSk7Ci0KLQkJdmFsdWUgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbb2Zmc2V0ICsgMyArIGRlbHRhXSk7Ci0KLQkJYXR0cnNbaV0gPSBwW29mZnNldF07Ci0KLQkJLyoKLQkJICogdXNlIGJpdCA3IG9mIGF0dHJpYnV0ZSBieXRlIHRvIGluZGljYXRlIHRoYXQKLQkJICogdGhpcyBidWZmZXIgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAotCQkgKiBhbmQgc2hvdWxkIGJlIGZyZWVkIGxhdGVyCi0JCSAqLwotCQlhdHRyc1tpXSAmPSAweDdmOwotCi0JCXZhcl9zaXplW2ldID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW29mZnNldCArIDcgKyBkZWx0YV0pOwotCi0JCS8qCi0JCSAqIEF0dHJpYnV0ZSBiaXRzOgotCQkgKiBiaXQgMDogMCA9IHJlYWQtb25seSwgMSA9IHJlYWQtd3JpdGUKLQkJICogYml0IDE6IDAgPSBub3QgY29tcHJlc3NlZCwgMSA9IGNvbXByZXNzZWQKLQkJICogYml0IDI6IDAgPSBub3QgaW5pdGlhbGl6ZWQsIDEgPSBpbml0aWFsaXplZAotCQkgKiBiaXQgMzogMCA9IHNjYWxhciwgMSA9IGFycmF5Ci0JCSAqIGJpdCA0OiAwID0gQm9vbGVhbiwgMSA9IGludGVnZXIKLQkJICogYml0IDU6IDAgPSBkZWNsYXJlZCB2YXJpYWJsZSwKLQkJICoJMSA9IGNvbXBpbGVyIGNyZWF0ZWQgdGVtcG9yYXJ5IHZhcmlhYmxlCi0JCSAqLwotCi0JCWlmICgoYXR0cnNbaV0gJiAweDBjKSA9PSAweDA0KQotCQkJLyogaW5pdGlhbGl6ZWQgc2NhbGFyIHZhcmlhYmxlICovCi0JCQl2YXJzW2ldID0gdmFsdWU7Ci0JCWVsc2UgaWYgKChhdHRyc1tpXSAmIDB4MWUpID09IDB4MGUpIHsKLQkJCS8qIGluaXRpYWxpemVkIGNvbXByZXNzZWQgQm9vbGVhbiBhcnJheSAqLwotCQkJdW5jb21wX3NpemUgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnBbZGF0YV9zZWN0ICsgdmFsdWVdKTsKLQotCQkJLyogYWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLwotCQkJdmFyc1tpXSA9IChsb25nKWt6YWxsb2ModW5jb21wX3NpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKHZhcnNbaV0gPT0gMEwpCi0JCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCWVsc2UgewotCQkJCS8qIHNldCBmbGFnIHNvIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGxhdGVyICovCi0JCQkJYXR0cnNbaV0gfD0gMHg4MDsKLQotCQkJCS8qIHVuY29tcHJlc3MgdGhlIGRhdGEgKi8KLQkJCQlpZiAoYWx0ZXJhX3NocmluaygmcFtkYXRhX3NlY3QgKyB2YWx1ZV0sCi0JCQkJCQl2YXJfc2l6ZVtpXSwKLQkJCQkJCSh1OCAqKXZhcnNbaV0sCi0JCQkJCQl1bmNvbXBfc2l6ZSwKLQkJCQkJCXZlcnNpb24pICE9IHVuY29tcF9zaXplKQotCQkJCQkvKiBkZWNvbXByZXNzaW9uIGZhaWxlZCAqLwotCQkJCQlzdGF0dXMgPSAtRUlPOwotCQkJCWVsc2UKLQkJCQkJdmFyX3NpemVbaV0gPSB1bmNvbXBfc2l6ZSAqIDhMOwotCi0JCQl9Ci0JCX0gZWxzZSBpZiAoKGF0dHJzW2ldICYgMHgxZSkgPT0gMHgwYykgewotCQkJLyogaW5pdGlhbGl6ZWQgQm9vbGVhbiBhcnJheSAqLwotCQkJdmFyc1tpXSA9IHZhbHVlICsgZGF0YV9zZWN0ICsgKGxvbmcpcDsKLQkJfSBlbHNlIGlmICgoYXR0cnNbaV0gJiAweDFjKSA9PSAweDFjKSB7Ci0JCQkvKiBpbml0aWFsaXplZCBpbnRlZ2VyIGFycmF5ICovCi0JCQl2YXJzW2ldID0gdmFsdWUgKyBkYXRhX3NlY3Q7Ci0JCX0gZWxzZSBpZiAoKGF0dHJzW2ldICYgMHgwYykgPT0gMHgwOCkgewotCQkJLyogdW5pbml0aWFsaXplZCBhcnJheSAqLwotCi0JCQkvKiBmbGFnIGF0dHJzIHNvIHRoYXQgbWVtb3J5IGlzIGZyZWVkICovCi0JCQlhdHRyc1tpXSB8PSAweDgwOwotCi0JCQlpZiAodmFyX3NpemVbaV0gPiAwKSB7Ci0JCQkJdTMyIHNpemU7Ci0KLQkJCQlpZiAoYXR0cnNbaV0gJiAweDEwKQotCQkJCQkvKiBpbnRlZ2VyIGFycmF5ICovCi0JCQkJCXNpemUgPSAodmFyX3NpemVbaV0gKiBzaXplb2YoczMyKSk7Ci0JCQkJZWxzZQotCQkJCQkvKiBCb29sZWFuIGFycmF5ICovCi0JCQkJCXNpemUgPSAoKHZhcl9zaXplW2ldICsgN0wpIC8gOEwpOwotCi0JCQkJdmFyc1tpXSA9IChsb25nKWt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQkJCQlpZiAodmFyc1tpXSA9PSAwKSB7Ci0JCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogemVybyBvdXQgbWVtb3J5ICovCi0JCQkJCWZvciAoaiA9IDA7IGogPCBzaXplOyArK2opCi0JCQkJCQkoKHU4ICopKHZhcnNbaV0pKVtqXSA9IDA7Ci0KLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQl2YXJzW2ldID0gMDsKLQotCQl9IGVsc2UKLQkJCXZhcnNbaV0gPSAwOwotCi0JfQotCi1leGl0X2RvbmU6Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlkb25lID0gMTsKLQotCWFsdGVyYV9qaW5pdChhc3RhdGUpOwotCi0JcGMgPSBjb2RlX3NlY3Q7Ci0JbXNnX2J1ZmZbMF0gPSAnXDAnOwotCi0JLyoKLQkgKiBGb3IgSkJDIHZlcnNpb24gMiwgd2Ugd2lsbCBleGVjdXRlIHRoZSBwcm9jZWR1cmVzIGNvcnJlc3BvbmRpbmcgdG8KLQkgKiB0aGUgc2VsZWN0ZWQgQUNUSU9OCi0JICovCi0JaWYgKHZlcnNpb24gPiAwKSB7Ci0JCWlmIChhY29uZi0+YWN0aW9uID09IE5VTEwpIHsKLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlkb25lID0gMTsKLQkJfSBlbHNlIHsKLQkJCWludCBhY3Rpb25fZm91bmQgPSAwOwotCQkJZm9yIChpID0gMDsgKGkgPCBhY3Rpb25fY291bnQpICYmICFhY3Rpb25fZm91bmQ7ICsraSkgewotCQkJCW5hbWVfaWQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbYWN0aW9uX3RhYmxlICsKLQkJCQkJCQkJKDEyICogaSldKTsKLQotCQkJCW5hbWUgPSAmcFtzdHJfdGFibGUgKyBuYW1lX2lkXTsKLQotCQkJCWlmIChzdHJuaWNtcChhY29uZi0+YWN0aW9uLCBuYW1lLCBzdHJsZW4obmFtZSkpID09IDApIHsKLQkJCQkJYWN0aW9uX2ZvdW5kID0gMTsKLQkJCQkJY3VycmVudF9wcm9jID0KLQkJCQkJCWdldF91bmFsaWduZWRfYmUzMigmcFthY3Rpb25fdGFibGUgKwotCQkJCQkJCQkoMTIgKiBpKSArIDhdKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghYWN0aW9uX2ZvdW5kKSB7Ci0JCQkJc3RhdHVzID0gLUVJTlZBTDsKLQkJCQlkb25lID0gMTsKLQkJCX0KLQkJfQotCi0JCWlmIChzdGF0dXMgPT0gMCkgewotCQkJaW50IGZpcnN0X3RpbWUgPSAxOwotCQkJaSA9IGN1cnJlbnRfcHJvYzsKLQkJCXdoaWxlICgoaSAhPSAwKSB8fCBmaXJzdF90aW1lKSB7Ci0JCQkJZmlyc3RfdGltZSA9IDA7Ci0JCQkJLyogY2hlY2sgcHJvY2VkdXJlIGF0dHJpYnV0ZSBieXRlICovCi0JCQkJcHJvY19hdHRyaWJ1dGVzW2ldID0KLQkJCQkJCShwW3Byb2NfdGFibGUgKwotCQkJCQkJCQkoMTMgKiBpKSArIDhdICYKLQkJCQkJCQkJCTB4MDMpOwotCi0JCQkJLyoKLQkJCQkgKiBCSVQwIC0gT1BUSU9OQUwKLQkJCQkgKiBCSVQxIC0gUkVDT01NRU5ERUQKLQkJCQkgKiBCSVQ2IC0gRk9SQ0VEIE9GRgotCQkJCSAqIEJJVDcgLSBGT1JDRUQgT04KLQkJCQkgKi8KLQotCQkJCWkgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbcHJvY190YWJsZSArCi0JCQkJCQkJKDEzICogaSkgKyA0XSk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBTZXQgY3VycmVudF9wcm9jIHRvIHRoZSBmaXJzdCBwcm9jZWR1cmUKLQkJCSAqIHRvIGJlIGV4ZWN1dGVkCi0JCQkgKi8KLQkJCWkgPSBjdXJyZW50X3Byb2M7Ci0JCQl3aGlsZSAoKGkgIT0gMCkgJiYKLQkJCQkoKHByb2NfYXR0cmlidXRlc1tpXSA9PSAxKSB8fAotCQkJCSgocHJvY19hdHRyaWJ1dGVzW2ldICYgMHhjMCkgPT0gMHg0MCkpKSB7Ci0JCQkJaSA9IGdldF91bmFsaWduZWRfYmUzMigmcFtwcm9jX3RhYmxlICsKLQkJCQkJCQkoMTMgKiBpKSArIDRdKTsKLQkJCX0KLQotCQkJaWYgKChpICE9IDApIHx8ICgoaSA9PSAwKSAmJiAoY3VycmVudF9wcm9jID09IDApICYmCi0JCQkJKChwcm9jX2F0dHJpYnV0ZXNbMF0gIT0gMSkgJiYKLQkJCQkoKHByb2NfYXR0cmlidXRlc1swXSAmIDB4YzApICE9IDB4NDApKSkpIHsKLQkJCQljdXJyZW50X3Byb2MgPSBpOwotCQkJCXBjID0gY29kZV9zZWN0ICsKLQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW3Byb2NfdGFibGUgKwotCQkJCQkJCQkoMTMgKiBpKSArIDldKTsKLQkJCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fCAocGMgPj0gZGVidWdfc2VjdCkpCi0JCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQl9IGVsc2UKLQkJCQkvKiB0aGVyZSBhcmUgbm8gcHJvY2VkdXJlcyB0byBleGVjdXRlISAqLwotCQkJCWRvbmUgPSAxOwotCi0JCX0KLQl9Ci0KLQltc2dfYnVmZlswXSA9ICdcMCc7Ci0KLQl3aGlsZSAoIWRvbmUpIHsKLQkJb3Bjb2RlID0gKHBbcGNdICYgMHhmZik7Ci0JCW9wY29kZV9hZGRyZXNzID0gcGM7Ci0JCSsrcGM7Ci0KLQkJaWYgKGRlYnVnID4gMSkKLQkJCXByaW50aygib3Bjb2RlOiAlMDJ4XG4iLCBvcGNvZGUpOwotCi0JCWFyZ19jb3VudCA9IChvcGNvZGUgPj4gNikgJiAzOwotCQlmb3IgKGkgPSAwOyBpIDwgYXJnX2NvdW50OyArK2kpIHsKLQkJCWFyZ3NbaV0gPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbcGNdKTsKLQkJCXBjICs9IDQ7Ci0JCX0KLQotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIE9QX05PUDoKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RVUDoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgewotCQkJCXN0YWNrW3N0YWNrX3B0cl0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQkrK3N0YWNrX3B0cjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1NXUDoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gMl07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMl0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfQUREOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gKz0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1NVQjoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCS0tc3RhY2tfcHRyOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdIC09IHN0YWNrW3N0YWNrX3B0cl07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9NVUxUOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gKj0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX0RJVjoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCS0tc3RhY2tfcHRyOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdIC89IHN0YWNrW3N0YWNrX3B0cl07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9NT0Q6Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKLQkJCQktLXN0YWNrX3B0cjsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSAlPSBzdGFja1tzdGFja19wdHJdOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfU0hMOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPDw9IHN0YWNrW3N0YWNrX3B0cl07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9TSFI6Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKLQkJCQktLXN0YWNrX3B0cjsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA+Pj0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX05PVDoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSBePSAoLTFMKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfQU5EOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gJj0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX09SOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gfD0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1hPUjoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCS0tc3RhY2tfcHRyOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdIF49IHN0YWNrW3N0YWNrX3B0cl07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9JTlY6Ci0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBzdGFja1tzdGFja19wdHIgLSAxXSA/IDBMIDogMUw7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9HVDoKLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQktLXN0YWNrX3B0cjsKLQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0KLQkJCQkoc3RhY2tbc3RhY2tfcHRyIC0gMV0gPiBzdGFja1tzdGFja19wdHJdKSA/Ci0JCQkJCQkJCQkxTCA6IDBMOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9MVDoKLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQktLXN0YWNrX3B0cjsKLQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0KLQkJCQkoc3RhY2tbc3RhY2tfcHRyIC0gMV0gPCBzdGFja1tzdGFja19wdHJdKSA/Ci0JCQkJCQkJCQkxTCA6IDBMOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9SRVQ6Ci0JCQlpZiAoKHZlcnNpb24gPiAwKSAmJiAoc3RhY2tfcHRyID09IDApKSB7Ci0JCQkJLyoKLQkJCQkgKiBXZSBjb21wbGV0ZWQgb25lIG9mIHRoZSBtYWluIHByb2NlZHVyZXMKLQkJCQkgKiBvZiBhbiBBQ1RJT04uCi0JCQkJICogRmluZCB0aGUgbmV4dCBwcm9jZWR1cmUKLQkJCQkgKiB0byBiZSBleGVjdXRlZCBhbmQganVtcCB0byBpdC4KLQkJCQkgKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBwcm9jZWR1cmVzLCB0aGVuIEVYSVQuCi0JCQkJICovCi0JCQkJaSA9IGdldF91bmFsaWduZWRfYmUzMigmcFtwcm9jX3RhYmxlICsKLQkJCQkJCSgxMyAqIGN1cnJlbnRfcHJvYykgKyA0XSk7Ci0JCQkJd2hpbGUgKChpICE9IDApICYmCi0JCQkJCSgocHJvY19hdHRyaWJ1dGVzW2ldID09IDEpIHx8Ci0JCQkJCSgocHJvY19hdHRyaWJ1dGVzW2ldICYgMHhjMCkgPT0gMHg0MCkpKQotCQkJCQlpID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW3Byb2NfdGFibGUgKwotCQkJCQkJCQkoMTMgKiBpKSArIDRdKTsKLQotCQkJCWlmIChpID09IDApIHsKLQkJCQkJLyogbm8gcHJvY2VkdXJlcyB0byBleGVjdXRlISAqLwotCQkJCQlkb25lID0gMTsKLQkJCQkJKmV4aXRfY29kZSA9IDA7CS8qIHN1Y2Nlc3MgKi8KLQkJCQl9IGVsc2UgewotCQkJCQljdXJyZW50X3Byb2MgPSBpOwotCQkJCQlwYyA9IGNvZGVfc2VjdCArIGdldF91bmFsaWduZWRfYmUzMigKLQkJCQkJCQkJJnBbcHJvY190YWJsZSArCi0JCQkJCQkJCSgxMyAqIGkpICsgOV0pOwotCQkJCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fAotCQkJCQkgICAgKHBjID49IGRlYnVnX3NlY3QpKQotCQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQl9Ci0KLQkJCX0gZWxzZQotCQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgewotCQkJCQlwYyA9IHN0YWNrWy0tc3RhY2tfcHRyXSArIGNvZGVfc2VjdDsKLQkJCQkJaWYgKChwYyA8PSBjb2RlX3NlY3QpIHx8Ci0JCQkJCSAgICAocGMgPj0gZGVidWdfc2VjdCkpCi0JCQkJCQlzdGF0dXMgPSAtRVJBTkdFOwotCi0JCQkJfQotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9DTVBTOgotCQkJLyoKLQkJCSAqIEFycmF5IHNob3J0IGNvbXBhcmUKLQkJCSAqIC4uLnN0YWNrIDAgaXMgc291cmNlIDEgdmFsdWUKLQkJCSAqIC4uLnN0YWNrIDEgaXMgc291cmNlIDIgdmFsdWUKLQkJCSAqIC4uLnN0YWNrIDIgaXMgbWFzayB2YWx1ZQotCQkJICogLi4uc3RhY2sgMyBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgNCwgJnN0YXR1cykpIHsKLQkJCQlzMzIgYSA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlzMzIgYiA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQljb3VudCA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCi0JCQkJaWYgKChjb3VudCA8IDEpIHx8IChjb3VudCA+IDMyKSkKLQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQllbHNlIHsKLQkJCQkJbG9uZ190bXAgJj0gKCgtMUwpID4+ICgzMiAtIGNvdW50KSk7Ci0KLQkJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPQotCQkJCQkoKGEgJiBsb25nX3RtcCkgPT0gKGIgJiBsb25nX3RtcCkpCi0JCQkJCQkJCT8gMUwgOiAwTDsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9QSU5UOgotCQkJLyoKLQkJCSAqIFBSSU5UIGFkZCBpbnRlZ2VyCi0JCQkgKiAuLi5zdGFjayAwIGlzIGludGVnZXIgdmFsdWUKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCXNwcmludGYoJm1zZ19idWZmW3N0cmxlbihtc2dfYnVmZildLAotCQkJCQkiJWxkIiwgc3RhY2tbLS1zdGFja19wdHJdKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1BSTlQ6Ci0JCQkvKiBQUklOVCBmaW5pc2ggKi8KLQkJCWlmIChkZWJ1ZykKLQkJCQlwcmludGsobXNnX2J1ZmYsICJcbiIpOwotCi0JCQltc2dfYnVmZlswXSA9ICdcMCc7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9EU1M6Ci0JCQkvKgotCQkJICogRFJTQ0FOIHNob3J0Ci0JCQkgKiAuLi5zdGFjayAwIGlzIHNjYW4gZGF0YQotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOwotCQkJc3RhdHVzID0gYWx0ZXJhX2Ryc2Nhbihhc3RhdGUsIGNvdW50LCBjaGFyYnVmLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RTU0M6Ci0JCQkvKgotCQkJICogRFJTQ0FOIHNob3J0IHdpdGggY2FwdHVyZQotCQkJICogLi4uc3RhY2sgMCBpcyBzY2FuIGRhdGEKLQkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJY291bnQgPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOwotCQkJc3RhdHVzID0gYWx0ZXJhX3N3YXBfZHIoYXN0YXRlLCBjb3VudCwgY2hhcmJ1ZiwKLQkJCQkJCQkwLCBjaGFyYnVmLCAwKTsKLQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZjaGFyYnVmWzBdKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0lTUzoKLQkJCS8qCi0JCQkgKiBJUlNDQU4gc2hvcnQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgc2NhbiBkYXRhCi0JCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50Ci0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQlzdGF0dXMgPSBhbHRlcmFfaXJzY2FuKGFzdGF0ZSwgY291bnQsIGNoYXJidWYsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVNTQzoKLQkJCS8qCi0JCQkgKiBJUlNDQU4gc2hvcnQgd2l0aCBjYXB0dXJlCi0JCQkgKiAuLi5zdGFjayAwIGlzIHNjYW4gZGF0YQotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc3dhcF9pcihhc3RhdGUsIGNvdW50LCBjaGFyYnVmLAotCQkJCQkJCTAsIGNoYXJidWYsIDApOwotCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBnZXRfdW5hbGlnbmVkX2xlMzIoJmNoYXJidWZbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfRFBSOgotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9kcl9wcmUoJmFzdGF0ZS0+anMsIGNvdW50LCAwLCBOVUxMKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RQUkw6Ci0JCQkvKgotCQkJICogRFJQUkUgd2l0aCBsaXRlcmFsIGRhdGEKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqIC4uLnN0YWNrIDEgaXMgbGl0ZXJhbCBkYXRhCi0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2RyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsIDAsCi0JCQkJCQljaGFyYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RQTzoKLQkJCS8qCi0JCQkgKiBEUlBPU1QKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqLwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKSB7Ci0JCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9kcl9wb3N0KCZhc3RhdGUtPmpzLCBjb3VudCwKLQkJCQkJCQkJMCwgTlVMTCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9EUE9MOgotCQkJLyoKLQkJCSAqIERSUE9TVCB3aXRoIGxpdGVyYWwgZGF0YQotCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAotCQkJICogLi4uc3RhY2sgMSBpcyBsaXRlcmFsIGRhdGEKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQlwdXRfdW5hbGlnbmVkX2xlMzIobG9uZ190bXAsICZjaGFyYnVmWzBdKTsKLQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfZHJfcG9zdCgmYXN0YXRlLT5qcywgY291bnQsIDAsCi0JCQkJCQkJY2hhcmJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9JUFI6Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKLQkJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsCi0JCQkJCQkJCTAsIE5VTEwpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVBSTDoKLQkJCS8qCi0JCQkgKiBJUlBSRSB3aXRoIGxpdGVyYWwgZGF0YQotCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAotCQkJICogLi4uc3RhY2sgMSBpcyBsaXRlcmFsIGRhdGEKLQkJCSAqLwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9pcl9wcmUoJmFzdGF0ZS0+anMsIGNvdW50LAotCQkJCQkJCTAsIGNoYXJidWYpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVBPOgotCQkJLyoKLQkJCSAqIElSUE9TVAotCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKLQkJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3Bvc3QoJmFzdGF0ZS0+anMsIGNvdW50LAotCQkJCQkJCTAsIE5VTEwpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVBPTDoKLQkJCS8qCi0JCQkgKiBJUlBPU1Qgd2l0aCBsaXRlcmFsIGRhdGEKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqIC4uLnN0YWNrIDEgaXMgbGl0ZXJhbCBkYXRhCi0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3Bvc3QoJmFzdGF0ZS0+anMsIGNvdW50LCAwLAotCQkJCQkJCWNoYXJidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUENIUjoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgewotCQkJCXU4IGNoOwotCQkJCWNvdW50ID0gc3RybGVuKG1zZ19idWZmKTsKLQkJCQljaCA9IChjaGFyKSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJaWYgKChjaCA8IDEpIHx8IChjaCA+IDEyNykpIHsKLQkJCQkJLyoKLQkJCQkJICogY2hhcmFjdGVyIGNvZGUgb3V0IG9mIHJhbmdlCi0JCQkJCSAqIGluc3RlYWQgb2YgZmxhZ2dpbmcgYW4gZXJyb3IsCi0JCQkJCSAqIGZvcmNlIHRoZSB2YWx1ZSB0byAxMjcKLQkJCQkJICovCi0JCQkJCWNoID0gMTI3OwotCQkJCX0KLQkJCQltc2dfYnVmZltjb3VudF0gPSBjaDsKLQkJCQltc2dfYnVmZltjb3VudCArIDFdID0gJ1wwJzsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX0VYSVQ6Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCi0JCQkJKmV4aXRfY29kZSA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJZG9uZSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9FUVU6Ci0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJLS1zdGFja19wdHI7Ci0JCQlzdGFja1tzdGFja19wdHIgLSAxXSA9Ci0JCQkJKHN0YWNrW3N0YWNrX3B0ciAtIDFdID09IHN0YWNrW3N0YWNrX3B0cl0pID8KLQkJCQkJCQkJCTFMIDogMEw7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9QT1BUOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCS0tc3RhY2tfcHRyOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9BQlM6Ci0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJaWYgKHN0YWNrW3N0YWNrX3B0ciAtIDFdIDwgMCkKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IDAgLSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfQkNIMDoKLQkJCS8qCi0JCQkgKiBCYXRjaCBvcGVyYXRpb24gMAotCQkJICogU1dQCi0JCQkgKiBTV1BOIDcKLQkJCSAqIFNXUAotCQkJICogU1dQTiA2Ci0JCQkgKiBEVVBOIDgKLQkJCSAqIFNXUE4gMgotCQkJICogU1dQCi0JCQkgKiBEVVBOIDYKLQkJCSAqIERVUE4gNgotCQkJICovCi0KLQkJCS8qIFNXUCAgKi8KLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gMl07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMl0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCi0JCQkvKiBTV1BOIDcgKi8KLQkJCWluZGV4ID0gNyArIDE7Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7Ci0JCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKLQkJCX0KLQotCQkJLyogU1dQICAqLwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSAyXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7Ci0JCQl9Ci0KLQkJCS8qIFNXUE4gNiAqLwotCQkJaW5kZXggPSA2ICsgMTsKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKLQkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSBpbmRleF0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCi0JCQkvKiBEVVBOIDggKi8KLQkJCWluZGV4ID0gOCArIDE7Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKLQkJCQkrK3N0YWNrX3B0cjsKLQkJCX0KLQotCQkJLyogU1dQTiAyICovCi0JCQlpbmRleCA9IDIgKyAxOwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgewotCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7Ci0JCQl9Ci0KLQkJCS8qIFNXUCAgKi8KLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gMl07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMl0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCi0JCQkvKiBEVVBOIDYgKi8KLQkJCWluZGV4ID0gNiArIDE7Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKLQkJCQkrK3N0YWNrX3B0cjsKLQkJCX0KLQotCQkJLyogRFVQTiA2ICovCi0JCQlpbmRleCA9IDYgKyAxOwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgewotCQkJCXN0YWNrW3N0YWNrX3B0cl0gPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07Ci0JCQkJKytzdGFja19wdHI7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9QU0gwOgotCQkJc3RhY2tbc3RhY2tfcHRyKytdID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1BTSEw6Ci0JCQlzdGFja1tzdGFja19wdHIrK10gPSAoczMyKSBhcmdzWzBdOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUFNIVjoKLQkJCXN0YWNrW3N0YWNrX3B0cisrXSA9IHZhcnNbYXJnc1swXV07Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9KTVA6Ci0JCQlwYyA9IGFyZ3NbMF0gKyBjb2RlX3NlY3Q7Ci0JCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fCAocGMgPj0gZGVidWdfc2VjdCkpCi0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0NBTEw6Ci0JCQlzdGFja1tzdGFja19wdHIrK10gPSBwYzsKLQkJCXBjID0gYXJnc1swXSArIGNvZGVfc2VjdDsKLQkJCWlmICgocGMgPCBjb2RlX3NlY3QpIHx8IChwYyA+PSBkZWJ1Z19zZWN0KSkKLQkJCQlzdGF0dXMgPSAtRVJBTkdFOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfTkVYVDoKLQkJCS8qCi0JCQkgKiBQcm9jZXNzIEZPUiAvIE5FWFQgbG9vcAotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBzdGVwIHZhbHVlCi0JCQkgKiAuLi5zdGFjayAxIGlzIGVuZCB2YWx1ZQotCQkJICogLi4uc3RhY2sgMiBpcyB0b3AgYWRkcmVzcwotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMywgJnN0YXR1cykpIHsKLQkJCQlzMzIgc3RlcCA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCQkJCXMzMiBlbmQgPSBzdGFja1tzdGFja19wdHIgLSAyXTsKLQkJCQlzMzIgdG9wID0gc3RhY2tbc3RhY2tfcHRyIC0gM107Ci0JCQkJczMyIGl0ZXJhdG9yID0gdmFyc1thcmdzWzBdXTsKLQkJCQlpbnQgYnJlYWtfb3V0ID0gMDsKLQotCQkJCWlmIChzdGVwIDwgMCkgewotCQkJCQlpZiAoaXRlcmF0b3IgPD0gZW5kKQotCQkJCQkJYnJlYWtfb3V0ID0gMTsKLQkJCQl9IGVsc2UgaWYgKGl0ZXJhdG9yID49IGVuZCkKLQkJCQkJYnJlYWtfb3V0ID0gMTsKLQotCQkJCWlmIChicmVha19vdXQpIHsKLQkJCQkJc3RhY2tfcHRyIC09IDM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFyc1thcmdzWzBdXSA9IGl0ZXJhdG9yICsgc3RlcDsKLQkJCQkJcGMgPSB0b3AgKyBjb2RlX3NlY3Q7Ci0JCQkJCWlmICgocGMgPCBjb2RlX3NlY3QpIHx8Ci0JCQkJCSAgICAocGMgPj0gZGVidWdfc2VjdCkpCi0JCQkJCQlzdGF0dXMgPSAtRVJBTkdFOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1BTVFI6Ci0JCQkvKgotCQkJICogUFJJTlQgYWRkIHN0cmluZwotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdHJpbmcgSUQKLQkJCSAqLwotCQkJY291bnQgPSBzdHJsZW4obXNnX2J1ZmYpOwotCQkJc3RybGNweSgmbXNnX2J1ZmZbY291bnRdLAotCQkJCSZwW3N0cl90YWJsZSArIGFyZ3NbMF1dLAotCQkJCUFMVEVSQV9NRVNTQUdFX0xFTkdUSCAtIGNvdW50KTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1NJTlQ6Ci0JCQkvKgotCQkJICogU1RBVEUgaW50ZXJtZWRpYXRlIHN0YXRlCi0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHN0YXRlIGNvZGUKLQkJCSAqLwotCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgYXJnc1swXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9TVDoKLQkJCS8qCi0JCQkgKiBTVEFURSBmaW5hbCBzdGF0ZQotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdGF0ZSBjb2RlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIGFyZ3NbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVNUUDoKLQkJCS8qCi0JCQkgKiBJUlNUT1Agc3RhdGUKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RhdGUgY29kZQotCQkJICovCi0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyc3RvcCgmYXN0YXRlLT5qcywgYXJnc1swXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9EU1RQOgotCQkJLyoKLQkJCSAqIERSU1RPUCBzdGF0ZQotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdGF0ZSBjb2RlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfZHJzdG9wKCZhc3RhdGUtPmpzLCBhcmdzWzBdKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT1BfU1dQTjoKLQkJCS8qCi0JCQkgKiBFeGNoYW5nZSB0b3Agd2l0aCBOdGggc3RhY2sgdmFsdWUKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgMC1iYXNlZCBzdGFjayBlbnRyeQotCQkJICogdG8gc3dhcCB3aXRoIHRvcCBlbGVtZW50Ci0JCQkgKi8KLQkJCWluZGV4ID0gKGFyZ3NbMF0pICsgMTsKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKLQkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSBpbmRleF0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfRFVQTjoKLQkJCS8qCi0JCQkgKiBEdXBsaWNhdGUgTnRoIHN0YWNrIHZhbHVlCi0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIDAtYmFzZWQgc3RhY2sgZW50cnkgdG8gZHVwbGljYXRlCi0JCQkgKi8KLQkJCWluZGV4ID0gKGFyZ3NbMF0pICsgMTsKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKLQkJCQlzdGFja1tzdGFja19wdHJdID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOwotCQkJCSsrc3RhY2tfcHRyOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUE9QVjoKLQkJCS8qCi0JCQkgKiBQb3Agc3RhY2sgaW50byBzY2FsYXIgdmFyaWFibGUKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgdmFsdWUKLQkJCSAqLwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCXZhcnNbYXJnc1swXV0gPSBzdGFja1stLXN0YWNrX3B0cl07Ci0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1BPUEU6Ci0JCQkvKgotCQkJICogUG9wIHN0YWNrIGludG8gaW50ZWdlciBhcnJheSBlbGVtZW50Ci0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIGFycmF5IGluZGV4Ci0JCQkgKiAuLi5zdGFjayAxIGlzIHZhbHVlCi0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMF07Ci0KLQkJCS8qCi0JCQkgKiBJZiB2YXJpYWJsZSBpcyByZWFkLW9ubHksCi0JCQkgKiBjb252ZXJ0IHRvIHdyaXRhYmxlIGFycmF5Ci0JCQkgKi8KLQkJCWlmICgodmVyc2lvbiA+IDApICYmCi0JCQkJKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDljKSA9PSAweDFjKSkgewotCQkJCS8qIEFsbG9jYXRlIGEgd3JpdGFibGUgYnVmZmVyIGZvciB0aGlzIGFycmF5ICovCi0JCQkJY291bnQgPSB2YXJfc2l6ZVt2YXJpYWJsZV9pZF07Ci0JCQkJbG9uZ190bXAgPSB2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCQlsb25ncHRyX3RtcCA9IGt6YWxsb2MoY291bnQgKiBzaXplb2YobG9uZyksCi0JCQkJCQkJCUdGUF9LRVJORUwpOwotCQkJCXZhcnNbdmFyaWFibGVfaWRdID0gKGxvbmcpbG9uZ3B0cl90bXA7Ci0KLQkJCQlpZiAodmFyc1t2YXJpYWJsZV9pZF0gPT0gMCkgewotCQkJCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvKiBjb3B5IHByZXZpb3VzIGNvbnRlbnRzIGludG8gYnVmZmVyICovCi0JCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCQkJbG9uZ3B0cl90bXBbaV0gPQotCQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2xvbmdfdG1wXSk7Ci0JCQkJCWxvbmdfdG1wICs9IHNpemVvZihsb25nKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIHNldCBiaXQgNyAtIGJ1ZmZlciB3YXMKLQkJCQkgKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQKLQkJCQkgKi8KLQkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHg4MDsKLQotCQkJCS8qIGNsZWFyIGJpdCAyIC0gdmFyaWFibGUgaXMgd3JpdGFibGUgKi8KLQkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gJj0gfjB4MDQ7Ci0JCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4MDE7Ci0KLQkJCX0KLQotCQkJLyogY2hlY2sgdGhhdCB2YXJpYWJsZSBpcyBhIHdyaXRhYmxlIGludGVnZXIgYXJyYXkgKi8KLQkJCWlmICgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxYykgIT0gMHgxOCkKLQkJCQlzdGF0dXMgPSAtRVJBTkdFOwotCQkJZWxzZSB7Ci0JCQkJbG9uZ3B0cl90bXAgPSAobG9uZyAqKXZhcnNbdmFyaWFibGVfaWRdOwotCi0JCQkJLyogcG9wIHRoZSBhcnJheSBpbmRleCAqLwotCQkJCWluZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQkJLyogcG9wIHRoZSB2YWx1ZSBhbmQgc3RvcmUgaXQgaW50byB0aGUgYXJyYXkgKi8KLQkJCQlsb25ncHRyX3RtcFtpbmRleF0gPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1BPUEE6Ci0JCQkvKgotCQkJICogUG9wIHN0YWNrIGludG8gQm9vbGVhbiBhcnJheQotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAotCQkJICogLi4uc3RhY2sgMSBpcyBhcnJheSBpbmRleAotCQkJICogLi4uc3RhY2sgMiBpcyB2YWx1ZQotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDMsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJdmFyaWFibGVfaWQgPSBhcmdzWzBdOwotCi0JCQkvKgotCQkJICogSWYgdmFyaWFibGUgaXMgcmVhZC1vbmx5LAotCQkJICogY29udmVydCB0byB3cml0YWJsZSBhcnJheQotCQkJICovCi0JCQlpZiAoKHZlcnNpb24gPiAwKSAmJgotCQkJCSgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHg5YykgPT0gMHgwYykpIHsKLQkJCQkvKiBBbGxvY2F0ZSBhIHdyaXRhYmxlIGJ1ZmZlciBmb3IgdGhpcyBhcnJheSAqLwotCQkJCWxvbmdfdG1wID0KLQkJCQkJKHZhcl9zaXplW3ZhcmlhYmxlX2lkXSArIDdMKSA+PiAzTDsKLQkJCQljaGFycHRyX3RtcDIgPSAodTggKil2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCQljaGFycHRyX3RtcCA9Ci0JCQkJCWt6YWxsb2MobG9uZ190bXAsIEdGUF9LRVJORUwpOwotCQkJCXZhcnNbdmFyaWFibGVfaWRdID0gKGxvbmcpY2hhcnB0cl90bXA7Ci0KLQkJCQlpZiAodmFyc1t2YXJpYWJsZV9pZF0gPT0gMCkgewotCQkJCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvKiB6ZXJvIHRoZSBidWZmZXIgKi8KLQkJCQlmb3IgKGxvbmdfaWR4ID0gMEw7Ci0JCQkJCWxvbmdfaWR4IDwgbG9uZ190bXA7Ci0JCQkJCSsrbG9uZ19pZHgpIHsKLQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHhdID0gMDsKLQkJCQl9Ci0KLQkJCQkvKiBjb3B5IHByZXZpb3VzIGNvbnRlbnRzIGludG8gYnVmZmVyICovCi0JCQkJZm9yIChsb25nX2lkeCA9IDBMOwotCQkJCQlsb25nX2lkeCA8IHZhcl9zaXplW3ZhcmlhYmxlX2lkXTsKLQkJCQkJKytsb25nX2lkeCkgewotCQkJCQlsb25nX2lkeDIgPSBsb25nX2lkeDsKLQotCQkJCQlpZiAoY2hhcnB0cl90bXAyW2xvbmdfaWR4MiA+PiAzXSAmCi0JCQkJCQkoMSA8PCAobG9uZ19pZHgyICYgNykpKSB7Ci0JCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeCA+PiAzXSB8PQotCQkJCQkJCSgxIDw8IChsb25nX2lkeCAmIDcpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogc2V0IGJpdCA3IC0gYnVmZmVyIHdhcwotCQkJCSAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAotCQkJCSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDgwOwotCi0JCQkJLyogY2xlYXIgYml0IDIgLSB2YXJpYWJsZSBpcyB3cml0YWJsZSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSAmPSB+MHgwNDsKLQkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHgwMTsKLQotCQkJfQotCi0JCQkvKgotCQkJICogY2hlY2sgdGhhdCB2YXJpYWJsZSBpcwotCQkJICogYSB3cml0YWJsZSBCb29sZWFuIGFycmF5Ci0JCQkgKi8KLQkJCWlmICgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxYykgIT0gMHgwOCkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1t2YXJpYWJsZV9pZF07Ci0KLQkJCS8qIHBvcCB0aGUgY291bnQgKG51bWJlciBvZiBiaXRzIHRvIGNvcHkpICovCi0JCQlsb25nX2NvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQkvKiBwb3AgdGhlIGFycmF5IGluZGV4ICovCi0JCQlsb25nX2lkeCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJcmV2ZXJzZSA9IDA7Ci0KLQkJCWlmICh2ZXJzaW9uID4gMCkgewotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQotCQkJCWlmIChsb25nX2lkeCA+IGxvbmdfY291bnQpIHsKLQkJCQkJcmV2ZXJzZSA9IDE7Ci0JCQkJCWxvbmdfdG1wID0gbG9uZ19jb3VudDsKLQkJCQkJbG9uZ19jb3VudCA9IDEgKyBsb25nX2lkeCAtCi0JCQkJCQkJCWxvbmdfY291bnQ7Ci0JCQkJCWxvbmdfaWR4ID0gbG9uZ190bXA7Ci0KLQkJCQkJLyogcmV2ZXJzZSBQT1BBIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlCi0JCQkJCWxvbmdfY291bnQgPSAxICsgbG9uZ19jb3VudCAtCi0JCQkJCQkJCWxvbmdfaWR4OwotCi0JCQl9Ci0KLQkJCS8qIHBvcCB0aGUgZGF0YSAqLwotCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0KLQkJCWlmIChsb25nX2NvdW50IDwgMSkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBsb25nX2NvdW50OyArK2kpIHsKLQkJCQlpZiAobG9uZ190bXAgJiAoMUwgPDwgKHMzMikgaSkpCi0JCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4ID4+IDNMXSB8PQotCQkJCQkJKDFMIDw8IChsb25nX2lkeCAmIDdMKSk7Ci0JCQkJZWxzZQotCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeCA+PiAzTF0gJj0KLQkJCQkJCX4oMUwgPDwgKGxvbmdfaWR4ICYgN0wpKTsKLQotCQkJCSsrbG9uZ19pZHg7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQljYXNlIE9QX0pNUFo6Ci0JCQkvKgotCQkJICogUG9wIHN0YWNrIGFuZCBicmFuY2ggaWYgemVybwotCQkJICogLi4uYXJndW1lbnQgMCBpcyBhZGRyZXNzCi0JCQkgKiAuLi5zdGFjayAwIGlzIGNvbmRpdGlvbiB2YWx1ZQotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKLQkJCQlpZiAoc3RhY2tbLS1zdGFja19wdHJdID09IDApIHsKLQkJCQkJcGMgPSBhcmdzWzBdICsgY29kZV9zZWN0OwotCQkJCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fAotCQkJCQkgICAgKHBjID49IGRlYnVnX3NlY3QpKQotCQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9EUzoKLQkJY2FzZSBPUF9JUzoKLQkJCS8qCi0JCQkgKiBEUlNDQU4KLQkJCSAqIElSU0NBTgotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzY2FuIGRhdGEgdmFyaWFibGUgSUQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgYXJyYXkgaW5kZXgKLQkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWxvbmdfaWR4ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJbG9uZ19jb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCXJldmVyc2UgPSAwOwotCQkJaWYgKHZlcnNpb24gPiAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBzdGFjayAwID0gYXJyYXkgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gYXJyYXkgbGVmdCBpbmRleAotCQkJCSAqIHN0YWNrIDIgPSBjb3VudAotCQkJCSAqLwotCQkJCWxvbmdfdG1wID0gbG9uZ19jb3VudDsKLQkJCQlsb25nX2NvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQkJaWYgKGxvbmdfaWR4ID4gbG9uZ190bXApIHsKLQkJCQkJcmV2ZXJzZSA9IDE7Ci0JCQkJCWxvbmdfaWR4ID0gbG9uZ190bXA7Ci0JCQkJfQotCQkJfQotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0KLQkJCWlmIChyZXZlcnNlKSB7Ci0JCQkJLyoKLQkJCQkgKiBhbGxvY2F0ZSBhIGJ1ZmZlcgotCQkJCSAqIGFuZCByZXZlcnNlIHRoZSBkYXRhIG9yZGVyCi0JCQkJICovCi0JCQkJY2hhcnB0cl90bXAyID0gY2hhcnB0cl90bXA7Ci0JCQkJY2hhcnB0cl90bXAgPSBremFsbG9jKChsb25nX2NvdW50ID4+IDMpICsgMSwKLQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKGNoYXJwdHJfdG1wID09IE5VTEwpIHsKLQkJCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJbG9uZ190bXAgPSBsb25nX2lkeCArIGxvbmdfY291bnQgLSAxOwotCQkJCWxvbmdfaWR4MiA9IDA7Ci0JCQkJd2hpbGUgKGxvbmdfaWR4MiA8IGxvbmdfY291bnQpIHsKLQkJCQkJaWYgKGNoYXJwdHJfdG1wMltsb25nX3RtcCA+PiAzXSAmCi0JCQkJCQkJKDEgPDwgKGxvbmdfdG1wICYgNykpKQotCQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHgyID4+IDNdIHw9Ci0JCQkJCQkJKDEgPDwgKGxvbmdfaWR4MiAmIDcpKTsKLQkJCQkJZWxzZQotCQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHgyID4+IDNdICY9Ci0JCQkJCQkJfigxIDw8IChsb25nX2lkeDIgJiA3KSk7Ci0KLQkJCQkJLS1sb25nX3RtcDsKLQkJCQkJKytsb25nX2lkeDI7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAob3Bjb2RlID09IDB4NTEpIC8qIERTICovCi0JCQkJc3RhdHVzID0gYWx0ZXJhX2Ryc2Nhbihhc3RhdGUsIGxvbmdfY291bnQsCi0JCQkJCQljaGFycHRyX3RtcCwgbG9uZ19pZHgpOwotCQkJZWxzZSAvKiBJUyAqLwotCQkJCXN0YXR1cyA9IGFsdGVyYV9pcnNjYW4oYXN0YXRlLCBsb25nX2NvdW50LAotCQkJCQkJY2hhcnB0cl90bXAsIGxvbmdfaWR4KTsKLQotCQkJaWYgKHJldmVyc2UpCi0JCQkJa2ZyZWUoY2hhcnB0cl90bXApOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9EUFJBOgotCQkJLyoKLQkJCSAqIERSUFJFIHdpdGggYXJyYXkgZGF0YQotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQkJCQljb3VudCA9IDEgKyBjb3VudCAtIGluZGV4OwotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2RyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsIGluZGV4LAotCQkJCQkJCWNoYXJwdHJfdG1wKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RQT0E6Ci0JCQkvKgotCQkJICogRFJQT1NUIHdpdGggYXJyYXkgZGF0YQotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQkJCQljb3VudCA9IDEgKyBjb3VudCAtIGluZGV4OwotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2RyX3Bvc3QoJmFzdGF0ZS0+anMsIGNvdW50LCBpbmRleCwKLQkJCQkJCQljaGFycHRyX3RtcCk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9JUFJBOgotCQkJLyoKLQkJCSAqIElSUFJFIHdpdGggYXJyYXkgZGF0YQotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQkJCQljb3VudCA9IDEgKyBjb3VudCAtIGluZGV4OwotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsIGluZGV4LAotCQkJCQkJCWNoYXJwdHJfdG1wKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVBPQToKLQkJCS8qCi0JCQkgKiBJUlBPU1Qgd2l0aCBhcnJheSBkYXRhCi0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIGFycmF5IGluZGV4Ci0JCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50Ci0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQlpbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQlpZiAodmVyc2lvbiA+IDApCi0JCQkJLyoKLQkJCQkgKiBzdGFjayAwID0gYXJyYXkgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gYXJyYXkgbGVmdCBpbmRleAotCQkJCSAqLwotCQkJCWNvdW50ID0gMSArIGNvdW50IC0gaW5kZXg7Ci0KLQkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1thcmdzWzBdXTsKLQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfaXJfcG9zdCgmYXN0YXRlLT5qcywgY291bnQsIGluZGV4LAotCQkJCQkJCWNoYXJwdHJfdG1wKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfRVhQVDoKLQkJCS8qCi0JCQkgKiBFWFBPUlQKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RyaW5nIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIGludGVnZXIgZXhwcmVzc2lvbgotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKLQkJCQluYW1lID0gJnBbc3RyX3RhYmxlICsgYXJnc1swXV07Ci0JCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJYWx0ZXJhX2V4cG9ydF9pbnQobmFtZSwgbG9uZ190bXApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUFNIRToKLQkJCS8qCi0JCQkgKiBQdXNoIGludGVnZXIgYXJyYXkgZWxlbWVudAotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJdmFyaWFibGVfaWQgPSBhcmdzWzBdOwotCQkJaW5kZXggPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQotCQkJLyogY2hlY2sgdmFyaWFibGUgdHlwZSAqLwotCQkJaWYgKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDFmKSA9PSAweDE5KSB7Ci0JCQkJLyogd3JpdGFibGUgaW50ZWdlciBhcnJheSAqLwotCQkJCWxvbmdwdHJfdG1wID0gKGxvbmcgKil2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdwdHJfdG1wW2luZGV4XTsKLQkJCX0gZWxzZSBpZiAoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4MWYpID09IDB4MWMpIHsKLQkJCQkvKiByZWFkLW9ubHkgaW50ZWdlciBhcnJheSAqLwotCQkJCWxvbmdfdG1wID0gdmFyc1t2YXJpYWJsZV9pZF0gKwotCQkJCQkJKGluZGV4ICogc2l6ZW9mKGxvbmcpKTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9Ci0JCQkJCWdldF91bmFsaWduZWRfYmUzMigmcFtsb25nX3RtcF0pOwotCQkJfSBlbHNlCi0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUFNIQToKLQkJCS8qCi0JCQkgKiBQdXNoIEJvb2xlYW4gYXJyYXkKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqIC4uLnN0YWNrIDEgaXMgYXJyYXkgaW5kZXgKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCXZhcmlhYmxlX2lkID0gYXJnc1swXTsKLQotCQkJLyogY2hlY2sgdGhhdCB2YXJpYWJsZSBpcyBhIEJvb2xlYW4gYXJyYXkgKi8KLQkJCWlmICgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxOCkgIT0gMHgwOCkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1t2YXJpYWJsZV9pZF07Ci0KLQkJCS8qIHBvcCB0aGUgY291bnQgKG51bWJlciBvZiBiaXRzIHRvIGNvcHkpICovCi0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJLyogcG9wIHRoZSBhcnJheSBpbmRleCAqLwotCQkJaW5kZXggPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQkJCQljb3VudCA9IDEgKyBjb3VudCAtIGluZGV4OwotCi0JCQlpZiAoKGNvdW50IDwgMSkgfHwgKGNvdW50ID4gMzIpKSB7Ci0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbG9uZ190bXAgPSAwTDsKLQotCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCi0JCQkJaWYgKGNoYXJwdHJfdG1wWyhpICsgaW5kZXgpID4+IDNdICYKLQkJCQkJCSgxIDw8ICgoaSArIGluZGV4KSAmIDcpKSkKLQkJCQkJbG9uZ190bXAgfD0gKDFMIDw8IGkpOwotCi0JCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9EWU5BOgotCQkJLyoKLQkJCSAqIER5bmFtaWNhbGx5IGNoYW5nZSBzaXplIG9mIGFycmF5Ci0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIG5ldyBzaXplCi0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMF07Ci0JCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKGxvbmdfdG1wID4gdmFyX3NpemVbdmFyaWFibGVfaWRdKSB7Ci0JCQkJdmFyX3NpemVbdmFyaWFibGVfaWRdID0gbG9uZ190bXA7Ci0KLQkJCQlpZiAoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxMCkKLQkJCQkJLyogYWxsb2NhdGUgaW50ZWdlciBhcnJheSAqLwotCQkJCQlsb25nX3RtcCAqPSBzaXplb2YobG9uZyk7Ci0JCQkJZWxzZQotCQkJCQkvKiBhbGxvY2F0ZSBCb29sZWFuIGFycmF5ICovCi0JCQkJCWxvbmdfdG1wID0gKGxvbmdfdG1wICsgNykgPj4gMzsKLQotCQkJCS8qCi0JCQkJICogSWYgdGhlIGJ1ZmZlciB3YXMgcHJldmlvdXNseSBhbGxvY2F0ZWQsCi0JCQkJICogZnJlZSBpdAotCQkJCSAqLwotCQkJCWlmIChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDgwKSB7Ci0JCQkJCWtmcmVlKCh2b2lkICopdmFyc1t2YXJpYWJsZV9pZF0pOwotCQkJCQl2YXJzW3ZhcmlhYmxlX2lkXSA9IDA7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIKLQkJCQkgKiBvZiB0aGUgcmVxdWVzdGVkIHNpemUKLQkJCQkgKi8KLQkJCQl2YXJzW3ZhcmlhYmxlX2lkXSA9IChsb25nKQotCQkJCQlremFsbG9jKGxvbmdfdG1wLCBHRlBfS0VSTkVMKTsKLQotCQkJCWlmICh2YXJzW3ZhcmlhYmxlX2lkXSA9PSAwKSB7Ci0JCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogU2V0IHRoZSBhdHRyaWJ1dGUgYml0IHRvIGluZGljYXRlIHRoYXQKLQkJCQkgKiB0aGlzIGJ1ZmZlciB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZAotCQkJCSAqIHNob3VsZCBiZSBmcmVlZCBsYXRlcgotCQkJCSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDgwOwotCi0JCQkJLyogemVybyBvdXQgbWVtb3J5ICovCi0JCQkJY291bnQgPSAoKHZhcl9zaXplW3ZhcmlhYmxlX2lkXSArIDdMKSAvCi0JCQkJCQkJCQk4TCk7Ci0JCQkJY2hhcnB0cl90bXAgPSAodTggKikodmFyc1t2YXJpYWJsZV9pZF0pOwotCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyArK2luZGV4KQotCQkJCQljaGFycHRyX3RtcFtpbmRleF0gPSAwOwotCi0JCQl9Ci0KLQkJCWJyZWFrOwotCQljYXNlIE9QX0VYUFY6Ci0JCQkvKgotCQkJICogRXhwb3J0IEJvb2xlYW4gYXJyYXkKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RyaW5nIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIHZhcmlhYmxlIElECi0JCQkgKiAuLi5zdGFjayAxIGlzIGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkgKiAuLi5zdGFjayAyIGlzIGFycmF5IGxlZnQgaW5kZXgKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAzLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWlmICh2ZXJzaW9uID09IDApIHsKLQkJCQkvKiBFWFBWIGlzIG5vdCBzdXBwb3J0ZWQgaW4gSkJDIDEuMCAqLwotCQkJCWJhZF9vcGNvZGUgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbmFtZSA9ICZwW3N0cl90YWJsZSArIGFyZ3NbMF1dOwotCQkJdmFyaWFibGVfaWQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQlsb25nX2lkeCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsvKiByaWdodCBpbmR4ICovCi0JCQlsb25nX2lkeDIgPSBzdGFja1stLXN0YWNrX3B0cl07LyogbGVmdCBpbmR4ICovCi0KLQkJCWlmIChsb25nX2lkeCA+IGxvbmdfaWR4MikgewotCQkJCS8qIHJldmVyc2UgaW5kaWNlcyBub3Qgc3VwcG9ydGVkICovCi0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbG9uZ19jb3VudCA9IDEgKyBsb25nX2lkeDIgLSBsb25nX2lkeDsKLQotCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCWNoYXJwdHJfdG1wMiA9IE5VTEw7Ci0KLQkJCWlmICgobG9uZ19pZHggJiA3TCkgIT0gMCkgewotCQkJCXMzMiBrID0gbG9uZ19pZHg7Ci0JCQkJY2hhcnB0cl90bXAyID0KLQkJCQkJa3phbGxvYygoKGxvbmdfY291bnQgKyA3TCkgLyA4TCksCi0JCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKGNoYXJwdHJfdG1wMiA9PSBOVUxMKSB7Ci0JCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWZvciAoaSA9IDA7IGkgPCBsb25nX2NvdW50OyArK2kpIHsKLQkJCQkJaWYgKGNoYXJwdHJfdG1wW2sgPj4gM10gJgotCQkJCQkJCSgxIDw8IChrICYgNykpKQotCQkJCQkJY2hhcnB0cl90bXAyW2kgPj4gM10gfD0KLQkJCQkJCQkJKDEgPDwgKGkgJiA3KSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNoYXJwdHJfdG1wMltpID4+IDNdICY9Ci0JCQkJCQkJCX4oMSA8PCAoaSAmIDcpKTsKLQotCQkJCQkrK2s7Ci0JCQkJfQotCQkJCWNoYXJwdHJfdG1wID0gY2hhcnB0cl90bXAyOwotCi0JCQl9IGVsc2UgaWYgKGxvbmdfaWR4ICE9IDApCi0JCQkJY2hhcnB0cl90bXAgPSAmY2hhcnB0cl90bXBbbG9uZ19pZHggPj4gM107Ci0KLQkJCWFsdGVyYV9leHBvcnRfYm9vbF9hcnJheShuYW1lLCBjaGFycHRyX3RtcCwKLQkJCQkJCQlsb25nX2NvdW50KTsKLQotCQkJLyogZnJlZSBhbGxvY2F0ZWQgYnVmZmVyICovCi0JCQlpZiAoKGxvbmdfaWR4ICYgN0wpICE9IDApCi0JCQkJa2ZyZWUoY2hhcnB0cl90bXAyKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfQ09QWTogewotCQkJLyoKLQkJCSAqIEFycmF5IGNvcHkKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgZGVzdCBJRAotCQkJICogLi4uYXJndW1lbnQgMSBpcyBzb3VyY2UgSUQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqIC4uLnN0YWNrIDEgaXMgZGVzdCBpbmRleAotCQkJICogLi4uc3RhY2sgMiBpcyBzb3VyY2UgaW5kZXgKLQkJCSAqLwotCQkJczMyIGNvcHlfY291bnQ7Ci0JCQlzMzIgY29weV9pbmRleDsKLQkJCXMzMiBjb3B5X2luZGV4MjsKLQkJCXMzMiBkZXN0bGVmdDsKLQkJCXMzMiBzcmNfY291bnQ7Ci0JCQlzMzIgZGVzdF9jb3VudDsKLQkJCWludCBzcmNfcmV2ZXJzZSA9IDA7Ci0JCQlpbnQgZGVzdF9yZXZlcnNlID0gMDsKLQotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAzLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQotCQkJY29weV9jb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWNvcHlfaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3B5X2luZGV4MiA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCXJldmVyc2UgPSAwOwotCi0JCQlpZiAodmVyc2lvbiA+IDApIHsKLQkJCQkvKgotCQkJCSAqIHN0YWNrIDAgPSBzb3VyY2UgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gc291cmNlIGxlZnQgaW5kZXgKLQkJCQkgKiBzdGFjayAyID0gZGVzdGluYXRpb24gcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAzID0gZGVzdGluYXRpb24gbGVmdCBpbmRleAotCQkJCSAqLwotCQkJCWRlc3RsZWZ0ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQkJaWYgKGNvcHlfY291bnQgPiBjb3B5X2luZGV4KSB7Ci0JCQkJCXNyY19yZXZlcnNlID0gMTsKLQkJCQkJcmV2ZXJzZSA9IDE7Ci0JCQkJCXNyY19jb3VudCA9IDEgKyBjb3B5X2NvdW50IC0gY29weV9pbmRleDsKLQkJCQkJLyogY29weV9pbmRleCA9IHNvdXJjZSBzdGFydCBpbmRleCAqLwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNyY19jb3VudCA9IDEgKyBjb3B5X2luZGV4IC0gY29weV9jb3VudDsKLQkJCQkJLyogc291cmNlIHN0YXJ0IGluZGV4ICovCi0JCQkJCWNvcHlfaW5kZXggPSBjb3B5X2NvdW50OwotCQkJCX0KLQotCQkJCWlmIChjb3B5X2luZGV4MiA+IGRlc3RsZWZ0KSB7Ci0JCQkJCWRlc3RfcmV2ZXJzZSA9IDE7Ci0JCQkJCXJldmVyc2UgPSAhcmV2ZXJzZTsKLQkJCQkJZGVzdF9jb3VudCA9IDEgKyBjb3B5X2luZGV4MiAtIGRlc3RsZWZ0OwotCQkJCQkvKiBkZXN0aW5hdGlvbiBzdGFydCBpbmRleCAqLwotCQkJCQljb3B5X2luZGV4MiA9IGRlc3RsZWZ0OwotCQkJCX0gZWxzZQotCQkJCQlkZXN0X2NvdW50ID0gMSArIGRlc3RsZWZ0IC0gY29weV9pbmRleDI7Ci0KLQkJCQljb3B5X2NvdW50ID0gKHNyY19jb3VudCA8IGRlc3RfY291bnQpID8KLQkJCQkJCQlzcmNfY291bnQgOiBkZXN0X2NvdW50OwotCi0JCQkJaWYgKChzcmNfcmV2ZXJzZSB8fCBkZXN0X3JldmVyc2UpICYmCi0JCQkJCShzcmNfY291bnQgIT0gZGVzdF9jb3VudCkpCi0JCQkJCS8qCi0JCQkJCSAqIElmIGVpdGhlciB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uCi0JCQkJCSAqIGlzIHJldmVyc2VkLCB3ZSBjYW4ndCB0b2xlcmF0ZQotCQkJCQkgKiBhIGxlbmd0aCBtaXNtYXRjaCwgYmVjYXVzZSB3ZQotCQkJCQkgKiAibGVmdCBqdXN0aWZ5IiBhcnJheXMgd2hlbiBjb3B5aW5nLgotCQkJCQkgKiBUaGlzIHdvbid0IHdvcmsgY29ycmVjdGx5Ci0JCQkJCSAqIHdpdGggcmV2ZXJzZWQgYXJyYXlzLgotCQkJCQkgKi8KLQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQotCQkJfQotCi0JCQljb3VudCA9IGNvcHlfY291bnQ7Ci0JCQlpbmRleCA9IGNvcHlfaW5kZXg7Ci0JCQlpbmRleDIgPSBjb3B5X2luZGV4MjsKLQotCQkJLyoKLQkJCSAqIElmIGRlc3RpbmF0aW9uIGlzIGEgcmVhZC1vbmx5IGFycmF5LAotCQkJICogYWxsb2NhdGUgYSBidWZmZXIgYW5kIGNvbnZlcnQgaXQgdG8gYSB3cml0YWJsZSBhcnJheQotCQkJICovCi0JCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMV07Ci0JCQlpZiAoKHZlcnNpb24gPiAwKSAmJgotCQkJCSgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHg5YykgPT0gMHgwYykpIHsKLQkJCQkvKiBBbGxvY2F0ZSBhIHdyaXRhYmxlIGJ1ZmZlciBmb3IgdGhpcyBhcnJheSAqLwotCQkJCWxvbmdfdG1wID0KLQkJCQkJKHZhcl9zaXplW3ZhcmlhYmxlX2lkXSArIDdMKSA+PiAzTDsKLQkJCQljaGFycHRyX3RtcDIgPSAodTggKil2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCQljaGFycHRyX3RtcCA9Ci0JCQkJCWt6YWxsb2MobG9uZ190bXAsIEdGUF9LRVJORUwpOwotCQkJCXZhcnNbdmFyaWFibGVfaWRdID0gKGxvbmcpY2hhcnB0cl90bXA7Ci0KLQkJCQlpZiAodmFyc1t2YXJpYWJsZV9pZF0gPT0gMCkgewotCQkJCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvKiB6ZXJvIHRoZSBidWZmZXIgKi8KLQkJCQlmb3IgKGxvbmdfaWR4ID0gMEw7IGxvbmdfaWR4IDwgbG9uZ190bXA7Ci0JCQkJCQkJCSsrbG9uZ19pZHgpCi0JCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4XSA9IDA7Ci0KLQkJCQkvKiBjb3B5IHByZXZpb3VzIGNvbnRlbnRzIGludG8gYnVmZmVyICovCi0JCQkJZm9yIChsb25nX2lkeCA9IDBMOwotCQkJCQlsb25nX2lkeCA8IHZhcl9zaXplW3ZhcmlhYmxlX2lkXTsKLQkJCQkJCQkJKytsb25nX2lkeCkgewotCQkJCQlsb25nX2lkeDIgPSBsb25nX2lkeDsKLQotCQkJCQlpZiAoY2hhcnB0cl90bXAyW2xvbmdfaWR4MiA+PiAzXSAmCi0JCQkJCQkoMSA8PCAobG9uZ19pZHgyICYgNykpKQotCQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHggPj4gM10gfD0KLQkJCQkJCQkoMSA8PCAobG9uZ19pZHggJiA3KSk7Ci0KLQkJCQl9Ci0KLQkJCQkvKgotCQkJCXNldCBiaXQgNyAtIGJ1ZmZlciB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkICovCi0JCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4ODA7Ci0KLQkJCQkvKiBjbGVhciBiaXQgMiAtIHZhcmlhYmxlIGlzIHdyaXRhYmxlICovCi0JCQkJYXR0cnNbdmFyaWFibGVfaWRdICY9IH4weDA0OwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDAxOwotCQkJfQotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1sxXV07Ci0JCQljaGFycHRyX3RtcDIgPSAodTggKil2YXJzW2FyZ3NbMF1dOwotCi0JCQkvKiBjaGVjayBpZiBkZXN0aW5hdGlvbiBpcyBhIHdyaXRhYmxlIEJvb2xlYW4gYXJyYXkgKi8KLQkJCWlmICgoYXR0cnNbYXJnc1sxXV0gJiAweDFjKSAhPSAweDA4KSB7Ci0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNvdW50IDwgMSkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChyZXZlcnNlKQotCQkJCWluZGV4MiArPSAoY291bnQgLSAxKTsKLQotCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCQlpZiAoY2hhcnB0cl90bXAyW2luZGV4ID4+IDNdICYKLQkJCQkJCQkoMSA8PCAoaW5kZXggJiA3KSkpCi0JCQkJCWNoYXJwdHJfdG1wW2luZGV4MiA+PiAzXSB8PQotCQkJCQkJCSgxIDw8IChpbmRleDIgJiA3KSk7Ci0JCQkJZWxzZQotCQkJCQljaGFycHRyX3RtcFtpbmRleDIgPj4gM10gJj0KLQkJCQkJCX4oMSA8PCAoaW5kZXgyICYgNykpOwotCi0JCQkJKytpbmRleDsKLQkJCQlpZiAocmV2ZXJzZSkKLQkJCQkJLS1pbmRleDI7Ci0JCQkJZWxzZQotCQkJCQkrK2luZGV4MjsKLQkJCX0KLQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBPUF9EU0M6Ci0JCWNhc2UgT1BfSVNDOiB7Ci0JCQkvKgotCQkJICogRFJTQ0FOIHdpdGggY2FwdHVyZQotCQkJICogSVJTQ0FOIHdpdGggY2FwdHVyZQotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzY2FuIGRhdGEgdmFyaWFibGUgSUQKLQkJCSAqIC4uLmFyZ3VtZW50IDEgaXMgY2FwdHVyZSB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBjYXB0dXJlIGluZGV4Ci0JCQkgKiAuLi5zdGFjayAxIGlzIHNjYW4gZGF0YSBpbmRleAotCQkJICogLi4uc3RhY2sgMiBpcyBjb3VudAotCQkJICovCi0JCQlzMzIgc2Nhbl9yaWdodCwgc2Nhbl9sZWZ0OwotCQkJczMyIGNhcHR1cmVfY291bnQgPSAwOwotCQkJczMyIHNjYW5fY291bnQgPSAwOwotCQkJczMyIGNhcHR1cmVfaW5kZXg7Ci0JCQlzMzIgc2Nhbl9pbmRleDsKLQotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAzLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQotCQkJY2FwdHVyZV9pbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCXNjYW5faW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0KLQkJCWlmICh2ZXJzaW9uID4gMCkgewotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGNhcHR1cmUgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gY2FwdHVyZSBsZWZ0IGluZGV4Ci0JCQkJICogc3RhY2sgMiA9IHNjYW4gcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAzID0gc2NhbiBsZWZ0IGluZGV4Ci0JCQkJICogc3RhY2sgNCA9IGNvdW50Ci0JCQkJICovCi0JCQkJc2Nhbl9yaWdodCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlzY2FuX2xlZnQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJY2FwdHVyZV9jb3VudCA9IDEgKyBzY2FuX2luZGV4IC0gY2FwdHVyZV9pbmRleDsKLQkJCQlzY2FuX2NvdW50ID0gMSArIHNjYW5fbGVmdCAtIHNjYW5fcmlnaHQ7Ci0JCQkJc2Nhbl9pbmRleCA9IHNjYW5fcmlnaHQ7Ci0JCQl9Ci0KLQkJCWxvbmdfY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkvKgotCQkJICogSWYgY2FwdHVyZSBhcnJheSBpcyByZWFkLW9ubHksIGFsbG9jYXRlIGEgYnVmZmVyCi0JCQkgKiBhbmQgY29udmVydCBpdCB0byBhIHdyaXRhYmxlIGFycmF5Ci0JCQkgKi8KLQkJCXZhcmlhYmxlX2lkID0gYXJnc1sxXTsKLQkJCWlmICgodmVyc2lvbiA+IDApICYmCi0JCQkJKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDljKSA9PSAweDBjKSkgewotCQkJCS8qIEFsbG9jYXRlIGEgd3JpdGFibGUgYnVmZmVyIGZvciB0aGlzIGFycmF5ICovCi0JCQkJbG9uZ190bXAgPQotCQkJCQkodmFyX3NpemVbdmFyaWFibGVfaWRdICsgN0wpID4+IDNMOwotCQkJCWNoYXJwdHJfdG1wMiA9ICh1OCAqKXZhcnNbdmFyaWFibGVfaWRdOwotCQkJCWNoYXJwdHJfdG1wID0KLQkJCQkJa3phbGxvYyhsb25nX3RtcCwgR0ZQX0tFUk5FTCk7Ci0JCQkJdmFyc1t2YXJpYWJsZV9pZF0gPSAobG9uZyljaGFycHRyX3RtcDsKLQotCQkJCWlmICh2YXJzW3ZhcmlhYmxlX2lkXSA9PSAwKSB7Ci0JCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8qIHplcm8gdGhlIGJ1ZmZlciAqLwotCQkJCWZvciAobG9uZ19pZHggPSAwTDsgbG9uZ19pZHggPCBsb25nX3RtcDsKLQkJCQkJCQkJKytsb25nX2lkeCkKLQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHhdID0gMDsKLQotCQkJCS8qIGNvcHkgcHJldmlvdXMgY29udGVudHMgaW50byBidWZmZXIgKi8KLQkJCQlmb3IgKGxvbmdfaWR4ID0gMEw7Ci0JCQkJCWxvbmdfaWR4IDwgdmFyX3NpemVbdmFyaWFibGVfaWRdOwotCQkJCQkJCQkrK2xvbmdfaWR4KSB7Ci0JCQkJCWxvbmdfaWR4MiA9IGxvbmdfaWR4OwotCi0JCQkJCWlmIChjaGFycHRyX3RtcDJbbG9uZ19pZHgyID4+IDNdICYKLQkJCQkJCSgxIDw8IChsb25nX2lkeDIgJiA3KSkpCi0JCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeCA+PiAzXSB8PQotCQkJCQkJCSgxIDw8IChsb25nX2lkeCAmIDcpKTsKLQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogc2V0IGJpdCA3IC0gYnVmZmVyIHdhcwotCQkJCSAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAotCQkJCSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDgwOwotCi0JCQkJLyogY2xlYXIgYml0IDIgLSB2YXJpYWJsZSBpcyB3cml0YWJsZSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSAmPSB+MHgwNDsKLQkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHgwMTsKLQotCQkJfQotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQljaGFycHRyX3RtcDIgPSAodTggKil2YXJzW2FyZ3NbMV1dOwotCi0JCQlpZiAoKHZlcnNpb24gPiAwKSAmJgotCQkJCQkoKGxvbmdfY291bnQgPiBjYXB0dXJlX2NvdW50KSB8fAotCQkJCQkobG9uZ19jb3VudCA+IHNjYW5fY291bnQpKSkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBjaGVjayB0aGF0IGNhcHR1cmUgYXJyYXkKLQkJCSAqIGlzIGEgd3JpdGFibGUgQm9vbGVhbiBhcnJheQotCQkJICovCi0JCQlpZiAoKGF0dHJzW2FyZ3NbMV1dICYgMHgxYykgIT0gMHgwOCkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChzdGF0dXMgPT0gMCkgewotCQkJCWlmIChvcGNvZGUgPT0gMHg4MikgLyogRFNDICovCi0JCQkJCXN0YXR1cyA9IGFsdGVyYV9zd2FwX2RyKGFzdGF0ZSwKLQkJCQkJCQlsb25nX2NvdW50LAotCQkJCQkJCWNoYXJwdHJfdG1wLAotCQkJCQkJCXNjYW5faW5kZXgsCi0JCQkJCQkJY2hhcnB0cl90bXAyLAotCQkJCQkJCWNhcHR1cmVfaW5kZXgpOwotCQkJCWVsc2UgLyogSVNDICovCi0JCQkJCXN0YXR1cyA9IGFsdGVyYV9zd2FwX2lyKGFzdGF0ZSwKLQkJCQkJCQlsb25nX2NvdW50LAotCQkJCQkJCWNoYXJwdHJfdG1wLAotCQkJCQkJCXNjYW5faW5kZXgsCi0JCQkJCQkJY2hhcnB0cl90bXAyLAotCQkJCQkJCWNhcHR1cmVfaW5kZXgpOwotCi0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgT1BfV0FJVDoKLQkJCS8qCi0JCQkgKiBXQUlUCi0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHdhaXQgc3RhdGUKLQkJCSAqIC4uLmFyZ3VtZW50IDEgaXMgZW5kIHN0YXRlCi0JCQkgKiAuLi5zdGFjayAwIGlzIGN5Y2xlcwotCQkJICogLi4uc3RhY2sgMSBpcyBtaWNyb3NlY29uZHMKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQlpZiAobG9uZ190bXAgIT0gMEwpCi0JCQkJc3RhdHVzID0gYWx0ZXJhX3dhaXRfY3ljbGVzKGFzdGF0ZSwgbG9uZ190bXAsCi0JCQkJCQkJCWFyZ3NbMF0pOwotCi0JCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKChzdGF0dXMgPT0gMCkgJiYgKGxvbmdfdG1wICE9IDBMKSkKLQkJCQlzdGF0dXMgPSBhbHRlcmFfd2FpdF9tc2Vjcyhhc3RhdGUsCi0JCQkJCQkJCWxvbmdfdG1wLAotCQkJCQkJCQlhcmdzWzBdKTsKLQotCQkJaWYgKChzdGF0dXMgPT0gMCkgJiYgKGFyZ3NbMV0gIT0gYXJnc1swXSkpCi0JCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwKLQkJCQkJCQkJYXJnc1sxXSk7Ci0KLQkJCWlmICh2ZXJzaW9uID4gMCkgewotCQkJCS0tc3RhY2tfcHRyOyAvKiB0aHJvdyBhd2F5IE1BWCBjeWNsZXMgKi8KLQkJCQktLXN0YWNrX3B0cjsgLyogdGhyb3cgYXdheSBNQVggbWljcm9zZWNvbmRzICovCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9DTVBBOiB7Ci0JCQkvKgotCQkJICogQXJyYXkgY29tcGFyZQotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzb3VyY2UgMSBJRAotCQkJICogLi4uYXJndW1lbnQgMSBpcyBzb3VyY2UgMiBJRAotCQkJICogLi4uYXJndW1lbnQgMiBpcyBtYXNrIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIHNvdXJjZSAxIGluZGV4Ci0JCQkgKiAuLi5zdGFjayAxIGlzIHNvdXJjZSAyIGluZGV4Ci0JCQkgKiAuLi5zdGFjayAyIGlzIG1hc2sgaW5kZXgKLQkJCSAqIC4uLnN0YWNrIDMgaXMgY291bnQKLQkJCSAqLwotCQkJczMyIGEsIGI7Ci0JCQl1OCAqc291cmNlMSA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQl1OCAqc291cmNlMiA9ICh1OCAqKXZhcnNbYXJnc1sxXV07Ci0JCQl1OCAqbWFzayA9ICh1OCAqKXZhcnNbYXJnc1syXV07Ci0JCQl1MzIgaW5kZXgxOwotCQkJdTMyIGluZGV4MjsKLQkJCXUzMiBtYXNrX2luZGV4OwotCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDQsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCi0JCQlpbmRleDEgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQlpbmRleDIgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQltYXNrX2luZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJbG9uZ19jb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBzdGFjayAwID0gc291cmNlIDEgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gc291cmNlIDEgbGVmdCBpbmRleAotCQkJCSAqIHN0YWNrIDIgPSBzb3VyY2UgMiByaWdodCBpbmRleAotCQkJCSAqIHN0YWNrIDMgPSBzb3VyY2UgMiBsZWZ0IGluZGV4Ci0JCQkJICogc3RhY2sgNCA9IG1hc2sgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayA1ID0gbWFzayBsZWZ0IGluZGV4Ci0JCQkJICovCi0JCQkJczMyIG1hc2tfcmlnaHQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJczMyIG1hc2tfbGVmdCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQkvKiBzb3VyY2UgMSBjb3VudCAqLwotCQkJCWEgPSAxICsgaW5kZXgyIC0gaW5kZXgxOwotCQkJCS8qIHNvdXJjZSAyIGNvdW50ICovCi0JCQkJYiA9IDEgKyBsb25nX2NvdW50IC0gbWFza19pbmRleDsKLQkJCQlhID0gKGEgPCBiKSA/IGEgOiBiOwotCQkJCS8qIG1hc2sgY291bnQgKi8KLQkJCQliID0gMSArIG1hc2tfbGVmdCAtIG1hc2tfcmlnaHQ7Ci0JCQkJYSA9IChhIDwgYikgPyBhIDogYjsKLQkJCQkvKiBzb3VyY2UgMiBzdGFydCBpbmRleCAqLwotCQkJCWluZGV4MiA9IG1hc2tfaW5kZXg7Ci0JCQkJLyogbWFzayBzdGFydCBpbmRleCAqLwotCQkJCW1hc2tfaW5kZXggPSBtYXNrX3JpZ2h0OwotCQkJCWxvbmdfY291bnQgPSBhOwotCQkJfQotCi0JCQlsb25nX3RtcCA9IDFMOwotCi0JCQlpZiAobG9uZ19jb3VudCA8IDEpCi0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCWVsc2UgewotCQkJCWNvdW50ID0gbG9uZ19jb3VudDsKLQotCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCQkJCWlmIChtYXNrW21hc2tfaW5kZXggPj4gM10gJgotCQkJCQkJKDEgPDwgKG1hc2tfaW5kZXggJiA3KSkpIHsKLQkJCQkJCWEgPSBzb3VyY2UxW2luZGV4MSA+PiAzXSAmCi0JCQkJCQkJKDEgPDwgKGluZGV4MSAmIDcpKQotCQkJCQkJCQk/IDEgOiAwOwotCQkJCQkJYiA9IHNvdXJjZTJbaW5kZXgyID4+IDNdICYKLQkJCQkJCQkoMSA8PCAoaW5kZXgyICYgNykpCi0JCQkJCQkJCT8gMSA6IDA7Ci0KLQkJCQkJCWlmIChhICE9IGIpIC8qIGZhaWx1cmUgKi8KLQkJCQkJCQlsb25nX3RtcCA9IDBMOwotCQkJCQl9Ci0JCQkJCSsraW5kZXgxOwotCQkJCQkrK2luZGV4MjsKLQkJCQkJKyttYXNrX2luZGV4OwotCQkJCX0KLQkJCX0KLQotCQkJc3RhY2tbc3RhY2tfcHRyKytdID0gbG9uZ190bXA7Ci0KLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBVbnJlY29nbml6ZWQgb3Bjb2RlIC0tIEVSUk9SISAqLwotCQkJYmFkX29wY29kZSA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChiYWRfb3Bjb2RlKQotCQkJc3RhdHVzID0gLUVOT1NZUzsKLQotCQlpZiAoKHN0YWNrX3B0ciA8IDApIHx8IChzdGFja19wdHIgPj0gQUxURVJBX1NUQUNLX1NJWkUpKQotCQkJc3RhdHVzID0gLUVPVkVSRkxPVzsKLQotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWRvbmUgPSAxOwotCQkJKmVycm9yX2FkZHJlc3MgPSAoczMyKShvcGNvZGVfYWRkcmVzcyAtIGNvZGVfc2VjdCk7Ci0JCX0KLQl9Ci0KLQlhbHRlcmFfZnJlZV9idWZmZXJzKGFzdGF0ZSk7Ci0KLQkvKiBGcmVlIGFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYXJyYXlzICovCi0JaWYgKChhdHRycyAhPSBOVUxMKSAmJiAodmFycyAhPSBOVUxMKSkKLQkJZm9yIChpID0gMDsgaSA8IHN5bV9jb3VudDsgKytpKQotCQkJaWYgKGF0dHJzW2ldICYgMHg4MCkKLQkJCQlrZnJlZSgodm9pZCAqKXZhcnNbaV0pOwotCi0Ja2ZyZWUodmFycyk7Ci0Ja2ZyZWUodmFyX3NpemUpOwotCWtmcmVlKGF0dHJzKTsKLQlrZnJlZShwcm9jX2F0dHJpYnV0ZXMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBhbHRlcmFfZ2V0X25vdGUodTggKnAsIHMzMiBwcm9ncmFtX3NpemUsCi0JCQlzMzIgKm9mZnNldCwgY2hhciAqa2V5LCBjaGFyICp2YWx1ZSwgaW50IGxlbmd0aCkKLS8qCi0gKiBHZXRzIGtleSBhbmQgdmFsdWUgb2YgTk9URSBmaWVsZHMgaW4gdGhlIEpCQyBmaWxlLgotICogQ2FuIGJlIGNhbGxlZCBpbiB0d28gbW9kZXM6ICBpZiBvZmZzZXQgcG9pbnRlciBpcyBOVUxMLAotICogdGhlbiB0aGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIG5vdGUgZmllbGRzIHdoaWNoIG1hdGNoCi0gKiB0aGUga2V5IHN0cmluZyBwcm92aWRlZC4gIElmIG9mZnNldCBpcyBub3QgTlVMTCwgdGhlbgotICogdGhlIGZ1bmN0aW9uIGZpbmRzIHRoZSBuZXh0IG5vdGUgZmllbGQgb2YgYW55IGtleSwKLSAqIHN0YXJ0aW5nIGF0IHRoZSBvZmZzZXQgc3BlY2lmaWVkIGJ5IHRoZSBvZmZzZXQgcG9pbnRlci4KLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlCi0gKi8KLXsKLQlpbnQgc3RhdHVzID0gLUVOT0RBVEE7Ci0JdTMyIG5vdGVfc3RyaW5ncyA9IDBMOwotCXUzMiBub3RlX3RhYmxlID0gMEw7Ci0JdTMyIG5vdGVfY291bnQgPSAwTDsKLQl1MzIgZmlyc3Rfd29yZCA9IDBMOwotCWludCB2ZXJzaW9uID0gMDsKLQlpbnQgZGVsdGEgPSAwOwotCWNoYXIgKmtleV9wdHI7Ci0JY2hhciAqdmFsdWVfcHRyOwotCWludCBpOwotCi0JLyogUmVhZCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLQlpZiAocHJvZ3JhbV9zaXplID4gNTJMKSB7Ci0JCWZpcnN0X3dvcmQgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMF0pOwotCQl2ZXJzaW9uID0gKGZpcnN0X3dvcmQgJiAxTCk7Ci0JCWRlbHRhID0gdmVyc2lvbiAqIDg7Ci0KLQkJbm90ZV9zdHJpbmdzICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs4ICsgZGVsdGFdKTsKLQkJbm90ZV90YWJsZSAgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFsxMiArIGRlbHRhXSk7Ci0JCW5vdGVfY291bnQgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNDQgKyAoMiAqIGRlbHRhKV0pOwotCX0KLQotCWlmICgoZmlyc3Rfd29yZCAhPSAweDRBNDE0RDAwTCkgJiYgKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMUwpKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmIChub3RlX2NvdW50IDw9IDBMKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JaWYgKG9mZnNldCA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIFdlIHdpbGwgc2VhcmNoIGZvciB0aGUgZmlyc3Qgbm90ZSB3aXRoIGEgc3BlY2lmaWMga2V5LAotCQkgKiBhbmQgcmV0dXJuIG9ubHkgdGhlIHZhbHVlCi0JCSAqLwotCQlmb3IgKGkgPSAwOyAoaSA8IG5vdGVfY291bnQpICYmCi0JCQkJCQkoc3RhdHVzICE9IDApOyArK2kpIHsKLQkJCWtleV9wdHIgPSAmcFtub3RlX3N0cmluZ3MgKwotCQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoCi0JCQkJCSZwW25vdGVfdGFibGUgKyAoOCAqIGkpXSldOwotCQkJaWYgKChzdHJuaWNtcChrZXksIGtleV9wdHIsIHN0cmxlbihrZXlfcHRyKSkgPT0gMCkgJiYKLQkJCQkJCShrZXkgIT0gTlVMTCkpIHsKLQkJCQlzdGF0dXMgPSAwOwotCi0JCQkJdmFsdWVfcHRyID0gJnBbbm90ZV9zdHJpbmdzICsKLQkJCQkJCWdldF91bmFsaWduZWRfYmUzMigKLQkJCQkJCSZwW25vdGVfdGFibGUgKyAoOCAqIGkpICsgNF0pXTsKLQotCQkJCWlmICh2YWx1ZSAhPSBOVUxMKQotCQkJCQlzdHJsY3B5KHZhbHVlLCB2YWx1ZV9wdHIsIGxlbmd0aCk7Ci0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFdlIHdpbGwgc2VhcmNoIGZvciB0aGUgbmV4dCBub3RlLCByZWdhcmRsZXNzIG9mIHRoZSBrZXksCi0JCSAqIGFuZCByZXR1cm4gYm90aCB0aGUgdmFsdWUgYW5kIHRoZSBrZXkKLQkJICovCi0KLQkJaSA9ICpvZmZzZXQ7Ci0KLQkJaWYgKChpID49IDApICYmIChpIDwgbm90ZV9jb3VudCkpIHsKLQkJCXN0YXR1cyA9IDA7Ci0KLQkJCWlmIChrZXkgIT0gTlVMTCkKLQkJCQlzdHJsY3B5KGtleSwgJnBbbm90ZV9zdHJpbmdzICsKLQkJCQkJCWdldF91bmFsaWduZWRfYmUzMigKLQkJCQkJCSZwW25vdGVfdGFibGUgKyAoOCAqIGkpXSldLAotCQkJCQlsZW5ndGgpOwotCi0JCQlpZiAodmFsdWUgIT0gTlVMTCkKLQkJCQlzdHJsY3B5KHZhbHVlLCAmcFtub3RlX3N0cmluZ3MgKwotCQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKAotCQkJCQkJJnBbbm90ZV90YWJsZSArICg4ICogaSkgKyA0XSldLAotCQkJCQlsZW5ndGgpOwotCi0JCQkqb2Zmc2V0ID0gaSArIDE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGFsdGVyYV9jaGVja19jcmModTggKnAsIHMzMiBwcm9ncmFtX3NpemUpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTE2IGxvY2FsX2V4cGVjdGVkID0gMCwKLQkgICAgbG9jYWxfYWN0dWFsID0gMCwKLQkgICAgc2hpZnRfcmVnID0gMHhmZmZmOwotCWludCBiaXQsIGZlZWRiYWNrOwotCXU4IGRhdGFieXRlOwotCXUzMiBpOwotCXUzMiBjcmNfc2VjdGlvbiA9IDBMOwotCXUzMiBmaXJzdF93b3JkID0gMEw7Ci0JaW50IHZlcnNpb24gPSAwOwotCWludCBkZWx0YSA9IDA7Ci0KLQlpZiAocHJvZ3JhbV9zaXplID4gNTJMKSB7Ci0JCWZpcnN0X3dvcmQgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzBdKTsKLQkJdmVyc2lvbiA9IChmaXJzdF93b3JkICYgMUwpOwotCQlkZWx0YSA9IHZlcnNpb24gKiA4OwotCi0JCWNyY19zZWN0aW9uID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzMyICsgZGVsdGFdKTsKLQl9Ci0KLQlpZiAoKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMEwpICYmIChmaXJzdF93b3JkICE9IDB4NEE0MTREMDFMKSkKLQkJc3RhdHVzID0gLUVJTzsKLQotCWlmIChjcmNfc2VjdGlvbiA+PSBwcm9ncmFtX3NpemUpCi0JCXN0YXR1cyA9IC1FSU87Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJbG9jYWxfZXhwZWN0ZWQgPSAodTE2KWdldF91bmFsaWduZWRfYmUxNigmcFtjcmNfc2VjdGlvbl0pOwotCi0JCWZvciAoaSA9IDA7IGkgPCBjcmNfc2VjdGlvbjsgKytpKSB7Ci0JCQlkYXRhYnl0ZSA9IHBbaV07Ci0JCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7Ci0JCQkJZmVlZGJhY2sgPSAoZGF0YWJ5dGUgXiBzaGlmdF9yZWcpICYgMHgwMTsKLQkJCQlzaGlmdF9yZWcgPj49IDE7Ci0JCQkJaWYgKGZlZWRiYWNrKQotCQkJCQlzaGlmdF9yZWcgXj0gMHg4NDA4OwotCi0JCQkJZGF0YWJ5dGUgPj49IDE7Ci0JCQl9Ci0JCX0KLQotCQlsb2NhbF9hY3R1YWwgPSAodTE2KX5zaGlmdF9yZWc7Ci0KLQkJaWYgKGxvY2FsX2V4cGVjdGVkICE9IGxvY2FsX2FjdHVhbCkKLQkJCXN0YXR1cyA9IC1FSUxTRVE7Ci0KLQl9Ci0KLQlpZiAoZGVidWcgfHwgc3RhdHVzKSB7Ci0JCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCWNhc2UgMDoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDUkMgbWF0Y2hlZDogJTA0eFxuIiwgX19mdW5jX18sCi0JCQkJbG9jYWxfYWN0dWFsKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FSUxTRVE6Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDUkMgbWlzbWF0Y2g6IGV4cGVjdGVkICUwNHgsICIKLQkJCQkiYWN0dWFsICUwNHhcbiIsIF9fZnVuY19fLCBsb2NhbF9leHBlY3RlZCwKLQkJCQlsb2NhbF9hY3R1YWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVOT0RBVEE6Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBleHBlY3RlZCBDUkMgbm90IGZvdW5kLCAiCi0JCQkJImFjdHVhbCBDUkMgPSAlMDR4XG4iLCBfX2Z1bmNfXywKLQkJCQlsb2NhbF9hY3R1YWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVJTzoKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yOiBmb3JtYXQgaXNuJ3QgIgotCQkJCSJyZWNvZ25pemVkLlxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDUkMgZnVuY3Rpb24gcmV0dXJuZWQgZXJyb3IgIgotCQkJCSJjb2RlICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBhbHRlcmFfZ2V0X2ZpbGVfaW5mbyh1OCAqcCwKLQkJCQkJczMyIHByb2dyYW1fc2l6ZSwKLQkJCQkJaW50ICpmb3JtYXRfdmVyc2lvbiwKLQkJCQkJaW50ICphY3Rpb25fY291bnQsCi0JCQkJCWludCAqcHJvY2VkdXJlX2NvdW50KQotewotCWludCBzdGF0dXMgPSAtRUlPOwotCXUzMiBmaXJzdF93b3JkID0gMDsKLQlpbnQgdmVyc2lvbiA9IDA7Ci0KLQlpZiAocHJvZ3JhbV9zaXplIDw9IDUyTCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCWZpcnN0X3dvcmQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMF0pOwotCi0JaWYgKChmaXJzdF93b3JkID09IDB4NEE0MTREMDBMKSB8fCAoZmlyc3Rfd29yZCA9PSAweDRBNDE0RDAxTCkpIHsKLQkJc3RhdHVzID0gMDsKLQotCQl2ZXJzaW9uID0gKGZpcnN0X3dvcmQgJiAxTCk7Ci0JCSpmb3JtYXRfdmVyc2lvbiA9IHZlcnNpb24gKyAxOwotCi0JCWlmICh2ZXJzaW9uID4gMCkgewotCQkJKmFjdGlvbl9jb3VudCA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0OF0pOwotCQkJKnByb2NlZHVyZV9jb3VudCA9IGdldF91bmFsaWduZWRfYmUzMigmcFs1Ml0pOwotCQl9Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBhbHRlcmFfZ2V0X2FjdF9pbmZvKHU4ICpwLAotCQkJCQlzMzIgcHJvZ3JhbV9zaXplLAotCQkJCQlpbnQgaW5kZXgsCi0JCQkJCWNoYXIgKipuYW1lLAotCQkJCQljaGFyICoqZGVzY3JpcHRpb24sCi0JCQkJCXN0cnVjdCBhbHRlcmFfcHJvY2luZm8gKipwcm9jX2xpc3QpCi17Ci0JaW50IHN0YXR1cyA9IC1FSU87Ci0Jc3RydWN0IGFsdGVyYV9wcm9jaW5mbyAqcHJvY3B0ciA9IE5VTEw7Ci0Jc3RydWN0IGFsdGVyYV9wcm9jaW5mbyAqdG1wcHRyID0gTlVMTDsKLQl1MzIgZmlyc3Rfd29yZCA9IDBMOwotCXUzMiBhY3Rpb25fdGFibGUgPSAwTDsKLQl1MzIgcHJvY190YWJsZSA9IDBMOwotCXUzMiBzdHJfdGFibGUgPSAwTDsKLQl1MzIgbm90ZV9zdHJpbmdzID0gMEw7Ci0JdTMyIGFjdGlvbl9jb3VudCA9IDBMOwotCXUzMiBwcm9jX2NvdW50ID0gMEw7Ci0JdTMyIGFjdF9uYW1lX2lkID0gMEw7Ci0JdTMyIGFjdF9kZXNjX2lkID0gMEw7Ci0JdTMyIGFjdF9wcm9jX2lkID0gMEw7Ci0JdTMyIGFjdF9wcm9jX25hbWUgPSAwTDsKLQl1OCBhY3RfcHJvY19hdHRyaWJ1dGUgPSAwOwotCi0JaWYgKHByb2dyYW1fc2l6ZSA8PSA1MkwpCi0JCXJldHVybiBzdGF0dXM7Ci0JLyogUmVhZCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLQlmaXJzdF93b3JkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzBdKTsKLQotCWlmIChmaXJzdF93b3JkICE9IDB4NEE0MTREMDFMKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JYWN0aW9uX3RhYmxlID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzRdKTsKLQlwcm9jX3RhYmxlICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbOF0pOwotCXN0cl90YWJsZSA9IGdldF91bmFsaWduZWRfYmUzMigmcFsxMl0pOwotCW5vdGVfc3RyaW5ncyA9IGdldF91bmFsaWduZWRfYmUzMigmcFsxNl0pOwotCWFjdGlvbl9jb3VudCA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0OF0pOwotCXByb2NfY291bnQgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs1Ml0pOwotCi0JaWYgKGluZGV4ID49IGFjdGlvbl9jb3VudCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCWFjdF9uYW1lX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2FjdGlvbl90YWJsZSArICgxMiAqIGluZGV4KV0pOwotCWFjdF9kZXNjX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2FjdGlvbl90YWJsZSArICgxMiAqIGluZGV4KSArIDRdKTsKLQlhY3RfcHJvY19pZCA9IGdldF91bmFsaWduZWRfYmUzMigmcFthY3Rpb25fdGFibGUgKyAoMTIgKiBpbmRleCkgKyA4XSk7Ci0KLQkqbmFtZSA9ICZwW3N0cl90YWJsZSArIGFjdF9uYW1lX2lkXTsKLQotCWlmIChhY3RfZGVzY19pZCA8IChub3RlX3N0cmluZ3MgLSBzdHJfdGFibGUpKQotCQkqZGVzY3JpcHRpb24gPSAmcFtzdHJfdGFibGUgKyBhY3RfZGVzY19pZF07Ci0KLQlkbyB7Ci0JCWFjdF9wcm9jX25hbWUgPSBnZXRfdW5hbGlnbmVkX2JlMzIoCi0JCQkJCSZwW3Byb2NfdGFibGUgKyAoMTMgKiBhY3RfcHJvY19pZCldKTsKLQkJYWN0X3Byb2NfYXR0cmlidXRlID0KLQkJCShwW3Byb2NfdGFibGUgKyAoMTMgKiBhY3RfcHJvY19pZCkgKyA4XSAmIDB4MDMpOwotCi0JCXByb2NwdHIgPQotCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbHRlcmFfcHJvY2luZm8pLAotCQkJCQkJCQlHRlBfS0VSTkVMKTsKLQotCQlpZiAocHJvY3B0ciA9PSBOVUxMKQotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZWxzZSB7Ci0JCQlwcm9jcHRyLT5uYW1lID0gJnBbc3RyX3RhYmxlICsgYWN0X3Byb2NfbmFtZV07Ci0JCQlwcm9jcHRyLT5hdHRycyA9IGFjdF9wcm9jX2F0dHJpYnV0ZTsKLQkJCXByb2NwdHItPm5leHQgPSBOVUxMOwotCi0JCQkvKiBhZGQgcmVjb3JkIHRvIGVuZCBvZiBsaW5rZWQgbGlzdCAqLwotCQkJaWYgKCpwcm9jX2xpc3QgPT0gTlVMTCkKLQkJCQkqcHJvY19saXN0ID0gcHJvY3B0cjsKLQkJCWVsc2UgewotCQkJCXRtcHB0ciA9ICpwcm9jX2xpc3Q7Ci0JCQkJd2hpbGUgKHRtcHB0ci0+bmV4dCAhPSBOVUxMKQotCQkJCQl0bXBwdHIgPSB0bXBwdHItPm5leHQ7Ci0JCQkJdG1wcHRyLT5uZXh0ID0gcHJvY3B0cjsKLQkJCX0KLQkJfQotCi0JCWFjdF9wcm9jX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKAotCQkJCSZwW3Byb2NfdGFibGUgKyAoMTMgKiBhY3RfcHJvY19pZCkgKyA0XSk7Ci0JfSB3aGlsZSAoKGFjdF9wcm9jX2lkICE9IDApICYmIChhY3RfcHJvY19pZCA8IHByb2NfY291bnQpKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBhbHRlcmFfaW5pdChzdHJ1Y3QgYWx0ZXJhX2NvbmZpZyAqY29uZmlnLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQotewotCXN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSA9IE5VTEw7Ci0Jc3RydWN0IGFsdGVyYV9wcm9jaW5mbyAqcHJvY19saXN0ID0gTlVMTDsKLQlzdHJ1Y3QgYWx0ZXJhX3Byb2NpbmZvICpwcm9jcHRyID0gTlVMTDsKLQljaGFyICprZXkgPSBOVUxMOwotCWNoYXIgKnZhbHVlID0gTlVMTDsKLQljaGFyICphY3Rpb25fbmFtZSA9IE5VTEw7Ci0JY2hhciAqZGVzY3JpcHRpb24gPSBOVUxMOwotCWludCBleGVjX3Jlc3VsdCA9IDA7Ci0JaW50IGV4aXRfY29kZSA9IDA7Ci0JaW50IGZvcm1hdF92ZXJzaW9uID0gMDsKLQlpbnQgYWN0aW9uX2NvdW50ID0gMDsKLQlpbnQgcHJvY2VkdXJlX2NvdW50ID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCXMzMiBvZmZzZXQgPSAwTDsKLQlzMzIgZXJyb3JfYWRkcmVzcyA9IDBMOwotCWludCByZXR2YWwgPSAwOwotCi0Ja2V5ID0ga3phbGxvYygzMywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrZXkpIHsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCXZhbHVlID0ga3phbGxvYygyNTcsIEdGUF9LRVJORUwpOwotCWlmICghdmFsdWUpIHsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBmcmVlX2tleTsKLQl9Ci0JYXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFsdGVyYV9zdGF0ZSksIEdGUF9LRVJORUwpOwotCWlmICghYXN0YXRlKSB7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZnJlZV92YWx1ZTsKLQl9Ci0KLQlhc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKLQlpZiAoIWFzdGF0ZS0+Y29uZmlnLT5qdGFnX2lvKSB7Ci0JCWRwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgYnl0ZWJsYXN0ZXIhXG4iLCBfX2Z1bmNfXyk7Ci0JCWFzdGF0ZS0+Y29uZmlnLT5qdGFnX2lvID0gbmV0dXBfanRhZ19pb19scHQ7Ci0JfQotCi0JYWx0ZXJhX2NoZWNrX2NyYygodTggKilmdy0+ZGF0YSwgZnctPnNpemUpOwotCi0JaWYgKGRlYnVnKSB7Ci0JCWFsdGVyYV9nZXRfZmlsZV9pbmZvKCh1OCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSwgJmZvcm1hdF92ZXJzaW9uLAotCQkJCQkmYWN0aW9uX2NvdW50LCAmcHJvY2VkdXJlX2NvdW50KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZpbGUgZm9ybWF0IGlzICVzIEJ5dGVDb2RlIGZvcm1hdFxuIiwKLQkJCV9fZnVuY19fLCAoZm9ybWF0X3ZlcnNpb24gPT0gMikgPyAiSmFtIFNUQVBMIiA6Ci0JCQkJCQkicHJlLXN0YW5kYXJkaXplZCBKYW0gMS4xIik7Ci0JCXdoaWxlIChhbHRlcmFfZ2V0X25vdGUoKHU4ICopZnctPmRhdGEsIGZ3LT5zaXplLAotCQkJCQkmb2Zmc2V0LCBrZXksIHZhbHVlLCAyNTYpID09IDApCi0JCQlwcmludGsoS0VSTl9JTkZPICIlczogTk9URSBcIiVzXCIgPSBcIiVzXCJcbiIsCi0JCQkJCV9fZnVuY19fLCBrZXksIHZhbHVlKTsKLQl9Ci0KLQlpZiAoZGVidWcgJiYgKGZvcm1hdF92ZXJzaW9uID09IDIpICYmIChhY3Rpb25fY291bnQgPiAwKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogQWN0aW9ucyBhdmFpbGFibGU6XG4iLCBfX2Z1bmNfXyk7Ci0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFjdGlvbl9jb3VudDsgKytpbmRleCkgewotCQkJYWx0ZXJhX2dldF9hY3RfaW5mbygodTggKilmdy0+ZGF0YSwgZnctPnNpemUsCi0JCQkJCQlpbmRleCwgJmFjdGlvbl9uYW1lLAotCQkJCQkJJmRlc2NyaXB0aW9uLAotCQkJCQkJJnByb2NfbGlzdCk7Ci0KLQkJCWlmIChkZXNjcmlwdGlvbiA9PSBOVUxMKQotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwKLQkJCQkJCV9fZnVuY19fLAotCQkJCQkJYWN0aW9uX25hbWUpOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBcIiVzXCJcbiIsCi0JCQkJCQlfX2Z1bmNfXywKLQkJCQkJCWFjdGlvbl9uYW1lLAotCQkJCQkJZGVzY3JpcHRpb24pOwotCi0JCQlwcm9jcHRyID0gcHJvY19saXN0OwotCQkJd2hpbGUgKHByb2NwdHIgIT0gTlVMTCkgewotCQkJCWlmIChwcm9jcHRyLT5hdHRycyAhPSAwKQotCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogICAgJXMgKCVzKVxuIiwKLQkJCQkJCV9fZnVuY19fLAotCQkJCQkJcHJvY3B0ci0+bmFtZSwKLQkJCQkJCShwcm9jcHRyLT5hdHRycyA9PSAxKSA/Ci0JCQkJCQkib3B0aW9uYWwiIDogInJlY29tbWVuZGVkIik7Ci0KLQkJCQlwcm9jX2xpc3QgPSBwcm9jcHRyLT5uZXh0OwotCQkJCWtmcmVlKHByb2NwdHIpOwotCQkJCXByb2NwdHIgPSBwcm9jX2xpc3Q7Ci0JCQl9Ci0JCX0KLQotCQlwcmludGsoS0VSTl9JTkZPICJcbiIpOwotCX0KLQotCWV4ZWNfcmVzdWx0ID0gYWx0ZXJhX2V4ZWN1dGUoYXN0YXRlLCAodTggKilmdy0+ZGF0YSwgZnctPnNpemUsCi0JCQkJJmVycm9yX2FkZHJlc3MsICZleGl0X2NvZGUsICZmb3JtYXRfdmVyc2lvbik7Ci0KLQlpZiAoZXhpdF9jb2RlKQotCQlleGVjX3Jlc3VsdCA9IC1FUkVNT1RFSU87Ci0KLQlpZiAoKGZvcm1hdF92ZXJzaW9uID09IDIpICYmIChleGVjX3Jlc3VsdCA9PSAtRUlOVkFMKSkgewotCQlpZiAoYXN0YXRlLT5jb25maWctPmFjdGlvbiA9PSBOVUxMKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IG5vIGFjdGlvbiBzcGVjaWZpZWQgZm9yICIKLQkJCQkiSmFtIFNUQVBMIGZpbGUuXG5wcm9ncmFtIHRlcm1pbmF0ZWQuXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IGFjdGlvbiBcIiVzXCIiCi0JCQkJIiBpcyBub3Qgc3VwcG9ydGVkICIKLQkJCQkiZm9yIHRoaXMgSmFtIFNUQVBMIGZpbGUuXG4iCi0JCQkJIlByb2dyYW0gdGVybWluYXRlZC5cbiIsIF9fZnVuY19fLAotCQkJCWFzdGF0ZS0+Y29uZmlnLT5hY3Rpb24pOwotCi0JfSBlbHNlIGlmIChleGVjX3Jlc3VsdCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWRcbiIsIF9fZnVuY19fLCBleGVjX3Jlc3VsdCk7Ci0KLQlrZnJlZShhc3RhdGUpOwotZnJlZV92YWx1ZToKLQlrZnJlZSh2YWx1ZSk7Ci1mcmVlX2tleToKLQlrZnJlZShrZXkpOwotb3V0OgotCXJldHVybiByZXR2YWw7Ci19Ci1FWFBPUlRfU1lNQk9MKGFsdGVyYV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliYTUwYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVRvZG86Ci0JLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCi0JLSBzcGFyc2UgY2xlYW51cHMKLQotUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRmYzA4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDIwMTIgKzAsMCBAQAotLyoKLSAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KLSAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+Ci0gKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgotICogIFBhcnRzIGFkYXB0ZWQvdGFrZW4gZnJvbSBFZHVhcmRvIE1vc2Nvc28gUnViaW5vCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5IEVkdWFyZG8gTW9zY29zbyBSdWJpbm8gPG1vc2Nvc29AVG9wb0xvZ2ljYS5jb20+Ci0gKgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQotI2luY2x1ZGUgImN4MjU4MjEtdmlkZW8uaCIKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwyIGRyaXZlciBtb2R1bGUgZm9yIGN4MjU4MjEgYmFzZWQgVFYgY2FyZHMiKTsKLU1PRFVMRV9BVVRIT1IoIkhpZXAgSHV5bmggPGhpZXAuaHV5bmhAY29uZXhhbnQuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX25yW10gPSB7WzAgLi4uIChDWDI1ODIxX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IHJhZGlvX25yW10gPSB7WzAgLi4uIChDWDI1ODIxX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07Ci0KLW1vZHVsZV9wYXJhbV9hcnJheSh2aWRlb19uciwgaW50LCBOVUxMLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheShyYWRpb19uciwgaW50LCBOVUxMLCAwNDQ0KTsKLQotTU9EVUxFX1BBUk1fREVTQyh2aWRlb19uciwgInZpZGVvIGRldmljZSBudW1iZXJzIik7Ci1NT0RVTEVfUEFSTV9ERVNDKHJhZGlvX25yLCAicmFkaW8gZGV2aWNlIG51bWJlcnMiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19kZWJ1ZyA9IFZJREVPX0RFQlVHOwotbW9kdWxlX3BhcmFtKHZpZGVvX2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh2aWRlb19kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbdmlkZW9dIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2RlYnVnOwotbW9kdWxlX3BhcmFtKGlycV9kZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJxX2RlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFtJUlEgaGFuZGxlcl0iKTsKLQotdW5zaWduZWQgaW50IHZpZF9saW1pdCA9IDE2OwotbW9kdWxlX3BhcmFtKHZpZF9saW1pdCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModmlkX2xpbWl0LCAiY2FwdHVyZSBtZW1vcnkgbGltaXQgaW4gbWVnYWJ5dGVzIik7Ci0KLXN0YXRpYyB2b2lkIGN4MjU4MjFfaW5pdF9jb250cm9scyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IGNoYW5fbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzOwotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2aWRlb19pb2N0bF9vcHM7Ci0KLSNkZWZpbmUgRk9STUFUX0ZMQUdTX1BBQ0tFRCAgICAgICAweDAxCi0KLXN0cnVjdCBjeDI1ODIxX2ZtdCBmb3JtYXRzW10gPSB7Ci0JewotCQkubmFtZSA9ICI4IGJwcCwgZ3JheSIsCi0JCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfR1JFWSwKLQkJLmRlcHRoID0gOCwKLQkJLmZsYWdzID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKLQkgfSwgewotCQkubmFtZSA9ICI0OjE6MSwgcGFja2VkLCBZNDFQIiwKLQkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZNDFQLAotCQkuZGVwdGggPSAxMiwKLQkJLmZsYWdzID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKLQl9LCB7Ci0JCS5uYW1lID0gIjQ6MjoyLCBwYWNrZWQsIFlVWVYiLAotCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1lVWVYsCi0JCS5kZXB0aCA9IDE2LAotCQkuZmxhZ3MgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAotCX0sIHsKLQkJLm5hbWUgPSAiNDoyOjIsIHBhY2tlZCwgVVlWWSIsCi0JCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfVVlWWSwKLQkJLmRlcHRoID0gMTYsCi0JCS5mbGFncyA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCi0JfSwgewotCQkubmFtZSA9ICI0OjI6MCwgWVVWIiwKLQkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZVVY0MjAsCi0JCS5kZXB0aCA9IDEyLAotCQkuZmxhZ3MgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAotCX0sCi19OwotCi1pbnQgY3gyNTgyMV9nZXRfZm9ybWF0X3NpemUodm9pZCkKLXsKLQlyZXR1cm4gQVJSQVlfU0laRShmb3JtYXRzKTsKLX0KLQotc3RydWN0IGN4MjU4MjFfZm10ICpjeDI1ODIxX2Zvcm1hdF9ieV9mb3VyY2ModW5zaWduZWQgaW50IGZvdXJjYykKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmIChmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1k0MVAgfHwgZm91cmNjID09IFY0TDJfUElYX0ZNVF9ZVVY0MTFQKQotCQlyZXR1cm4gZm9ybWF0cyArIDE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JtYXRzKTsgaSsrKQotCQlpZiAoZm9ybWF0c1tpXS5mb3VyY2MgPT0gZm91cmNjKQotCQkJcmV0dXJuIGZvcm1hdHMgKyBpOwotCi0JcHJfZXJyKCIlcygweCUwOHgpIE5PVCBGT1VORFxuIiwgX19mdW5jX18sIGZvdXJjYyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgY3gyNTgyMV9kdW1wX3ZpZGVvX3F1ZXVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJICAgICAgc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEpCi17Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKLQlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9mb3JfZWFjaChpdGVtLCAmcS0+YWN0aXZlKQotCQkgICAgYnVmID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQl9Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpIHsKLQkJbGlzdF9mb3JfZWFjaChpdGVtLCAmcS0+cXVldWVkKQotCQkgICAgYnVmID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQl9Ci0KLX0KLQotdm9pZCBjeDI1ODIxX3ZpZGVvX3dha2V1cChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEsCi0JCQkgIHUzMiBjb3VudCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZjsKLQlpbnQgYmM7Ci0KLQlmb3IgKGJjID0gMDs7IGJjKyspIHsKLQkJaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJCWRwcmludGsoMSwgImJjPSVkICg9MDogYWN0aXZlIGVtcHR5KVxuIiwgYmMpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlidWYgPQotCQkgICAgbGlzdF9lbnRyeShxLT5hY3RpdmUubmV4dCwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5xdWV1ZSk7Ci0KLQkJLyogY291bnQgY29tZXMgZnJvbSB0aGUgaHcgYW5kIGl0IGlzIDE2Yml0IHdpZGUgLS0KLQkJICogdGhpcyB0cmljayBoYW5kbGVzIHdyYXAtYXJvdW5kcyBjb3JyZWN0bHkgZm9yCi0JCSAqIHVwIHRvIDMyNzY3IGJ1ZmZlcnMgaW4gZmxpZ2h0Li4uICovCi0JCWlmICgoczE2KSAoY291bnQgLSBidWYtPmNvdW50KSA8IDApCi0JCQlicmVhazsKLQotCQlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dmIudHMpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfRE9ORTsKLQkJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOwotCQl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOwotCX0KLQotCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKQotCQlkZWxfdGltZXIoJnEtPnRpbWVvdXQpOwotCWVsc2UKLQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCWlmIChiYyAhPSAxKQotCQlwcl9lcnIoIiVzOiAlZCBidWZmZXJzIGhhbmRsZWQgKHNob3VsZCBiZSAxKVxuIiwgX19mdW5jX18sIGJjKTsKLX0KLQotI2lmZGVmIFRVTkVSX0ZMQUcKLWludCBjeDI1ODIxX3NldF90dm5vcm0oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHY0bDJfc3RkX2lkIG5vcm0pCi17Ci0JZHByaW50aygxLCAiJXMobm9ybSA9IDB4JTA4eCkgbmFtZTogWyVzXVxuIiwKLQkJX19mdW5jX18sICh1bnNpZ25lZCBpbnQpbm9ybSwgdjRsMl9ub3JtX3RvX25hbWUobm9ybSkpOwotCi0JZGV2LT50dm5vcm0gPSBub3JtOwotCi0JLyogVGVsbCB0aGUgaW50ZXJuYWwgQS9WIGRlY29kZXIgKi8KLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgc19zdGQsIG5vcm0pOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RydWN0IHZpZGVvX2RldmljZSAqY3gyNTgyMV92ZGV2X2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCQkJICAgICAgIHN0cnVjdCB2aWRlb19kZXZpY2UgKnRlbXBsYXRlLAotCQkJCSAgICAgICBjaGFyICp0eXBlKQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKLQlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0KLQl2ZmQgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKLQlpZiAoTlVMTCA9PSB2ZmQpCi0JCXJldHVybiBOVUxMOwotCSp2ZmQgPSAqdGVtcGxhdGU7Ci0JdmZkLT52NGwyX2RldiA9ICZkZXYtPnY0bDJfZGV2OwotCXZmZC0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOwotCXNucHJpbnRmKHZmZC0+bmFtZSwgc2l6ZW9mKHZmZC0+bmFtZSksICIlcyAlcyAoJXMpIiwgZGV2LT5uYW1lLCB0eXBlLAotCQkgY3gyNTgyMV9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSk7Ci0JdmlkZW9fc2V0X2RydmRhdGEodmZkLCBkZXYpOwotCXJldHVybiB2ZmQ7Ci19Ci0KLS8qCi1zdGF0aWMgaW50IGN4MjU4MjFfY3RybF9xdWVyeShzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKQotewotCWludCBpOwotCi0JaWYgKHFjdHJsLT5pZCA8IFY0TDJfQ0lEX0JBU0UgfHwgcWN0cmwtPmlkID49IFY0TDJfQ0lEX0xBU1RQMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKQotCQlpZiAoY3gyNTgyMV9jdGxzW2ldLnYuaWQgPT0gcWN0cmwtPmlkKQotCQkJYnJlYWs7Ci0JaWYgKGkgPT0gQ1gyNTgyMV9DVExTKSB7Ci0JCSpxY3RybCA9IG5vX2N0bDsKLQkJcmV0dXJuIDA7Ci0JfQotCSpxY3RybCA9IGN4MjU4MjFfY3Rsc1tpXS52OwotCXJldHVybiAwOwotfQotKi8KLQotLyogcmVzb3VyY2UgbWFuYWdlbWVudCAqLwotaW50IGN4MjU4MjFfcmVzX2dldChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IGN4MjU4MjFfZmggKmZoLAotCQkgICAgdW5zaWduZWQgaW50IGJpdCkKLXsKLQlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKGZoLT5yZXNvdXJjZXMgJiBiaXQpCi0JCS8qIGhhdmUgaXQgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KLQkJcmV0dXJuIDE7Ci0KLQkvKiBpcyBpdCBmcmVlPyAqLwotCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JaWYgKGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnJlc291cmNlcyAmIGJpdCkgewotCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogaXQncyBmcmVlLCBncmFiIGl0ICovCi0JZmgtPnJlc291cmNlcyB8PSBiaXQ7Ci0JZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzIHw9IGJpdDsKLQlkcHJpbnRrKDEsICJyZXM6IGdldCAlZFxuIiwgYml0KTsKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0JcmV0dXJuIDE7Ci19Ci0KLWludCBjeDI1ODIxX3Jlc19jaGVjayhzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCi17Ci0JcmV0dXJuIGZoLT5yZXNvdXJjZXMgJiBiaXQ7Ci19Ci0KLWludCBjeDI1ODIxX3Jlc19sb2NrZWQoc3RydWN0IGN4MjU4MjFfZmggKmZoLCB1bnNpZ25lZCBpbnQgYml0KQotewotCXJldHVybiBmaC0+ZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzICYgYml0OwotfQotCi12b2lkIGN4MjU4MjFfcmVzX2ZyZWUoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwKLQkJICAgICAgdW5zaWduZWQgaW50IGJpdHMpCi17Ci0JQlVHX09OKChmaC0+cmVzb3VyY2VzICYgYml0cykgIT0gYml0cyk7Ci0JZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQlmaC0+cmVzb3VyY2VzICY9IH5iaXRzOwotCWRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnJlc291cmNlcyAmPSB+Yml0czsKLQlkcHJpbnRrKDEsICJyZXM6IHB1dCAlZFxuIiwgYml0cyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotfQotCi1pbnQgY3gyNTgyMV92aWRlb19tdXgoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBpbnB1dCkKLXsKLQlzdHJ1Y3QgdjRsMl9yb3V0aW5nIHJvdXRlOwotCW1lbXNldCgmcm91dGUsIDAsIHNpemVvZihyb3V0ZSkpOwotCi0JZHByaW50aygxLCAiJXMoKTogdmlkZW9fbXV4OiAlZCBbdm11eD0lZCwgZ3Bpbz0weCV4LDB4JXgsMHgleCwweCV4XVxuIiwKLQkJX19mdW5jX18sIGlucHV0LCBJTlBVVChpbnB1dCktPnZtdXgsIElOUFVUKGlucHV0KS0+Z3BpbzAsCi0JCUlOUFVUKGlucHV0KS0+Z3BpbzEsIElOUFVUKGlucHV0KS0+Z3BpbzIsIElOUFVUKGlucHV0KS0+Z3BpbzMpOwotCWRldi0+aW5wdXQgPSBpbnB1dDsKLQotCXJvdXRlLmlucHV0ID0gSU5QVVQoaW5wdXQpLT52bXV4OwotCi0JLyogVGVsbCB0aGUgaW50ZXJuYWwgQS9WIGRlY29kZXIgKi8KLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgdmlkZW8sIHNfcm91dGluZywgSU5QVVQoaW5wdXQpLT52bXV4LCAwLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV9zdGFydF92aWRlb19kbWEoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCi0JCQkgICAgc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEsCi0JCQkgICAgc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYsCi0JCQkgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbCkKLXsKLQlpbnQgdG1wID0gMDsKLQotCS8qIHNldHVwIGZpZm8gKyBmb3JtYXQgKi8KLQljeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cChkZXYsIGNoYW5uZWwsIGJ1Zi0+YnBsLCBidWYtPnJpc2MuZG1hKTsKLQotCS8qIHJlc2V0IGNvdW50ZXIgKi8KLQljeF93cml0ZShjaGFubmVsLT5ncGNudF9jdGwsIDMpOwotCXEtPmNvdW50ID0gMTsKLQotCS8qIGVuYWJsZSBpcnEgKi8KLQljeF9zZXQoUENJX0lOVF9NU0ssIGN4X3JlYWQoUENJX0lOVF9NU0spIHwgKDEgPDwgY2hhbm5lbC0+aSkpOwotCWN4X3NldChjaGFubmVsLT5pbnRfbXNrLCAweDExKTsKLQotCS8qIHN0YXJ0IGRtYSAqLwotCWN4X3dyaXRlKGNoYW5uZWwtPmRtYV9jdGwsIDB4MTEpOwkvKiBGSUZPIGFuZCBSSVNDIGVuYWJsZSAqLwotCi0JLyogbWFrZSBzdXJlIHVwc3RyZWFtIHNldHRpbmcgaWYgYW55IGlzIHJldmVyc2VkICovCi0JdG1wID0gY3hfcmVhZChWSURfQ0hfTU9ERV9TRUwpOwotCWN4X3dyaXRlKFZJRF9DSF9NT0RFX1NFTCwgdG1wICYgMHhGRkZGRkUwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfcmVzdGFydF92aWRlb19xdWV1ZShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSwKLQkJCQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsKQotewotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmLCAqcHJldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JCWJ1ZiA9Ci0JCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQotCQljeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShkZXYsIHEsIGJ1ZiwgY2hhbm5lbCk7Ci0KLQkJbGlzdF9mb3JfZWFjaChpdGVtLCAmcS0+YWN0aXZlKSB7Ci0JCQlidWYgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOwotCQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7Ci0JCX0KLQotCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXByZXYgPSBOVUxMOwotCWZvciAoOzspIHsKLQkJaWYgKGxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpCi0JCQlyZXR1cm4gMDsKLQotCQlidWYgPQotCQkgICAgbGlzdF9lbnRyeShxLT5xdWV1ZWQubmV4dCwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5xdWV1ZSk7Ci0KLQkJaWYgKE5VTEwgPT0gcHJldikgewotCQkJbGlzdF9tb3ZlX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCQkJY3gyNTgyMV9zdGFydF92aWRlb19kbWEoZGV2LCBxLCBidWYsIGNoYW5uZWwpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKLQkJCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCQl9IGVsc2UgaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGggJiYKLQkJCSAgIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodCAmJgotCQkJICAgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X21vdmVfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7Ci0JCQlwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOwotCQkJcHJldi0+cmlzYy5qbXBbMl0gPSBjcHVfdG9fbGUzMigwKTsgLyogQml0cyA2MyAtIDMyICovCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwcmV2ID0gYnVmOwotCX0KLX0KLQotdm9pZCBjeDI1ODIxX3ZpZF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kYXRhICp0aW1lb3V0X2RhdGEgPSAoc3RydWN0IGN4MjU4MjFfZGF0YSAqKWRhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSB0aW1lb3V0X2RhdGEtPmRldjsKLQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsID0gdGltZW91dF9kYXRhLT5jaGFubmVsOwotCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxID0gJmRldi0+Y2hhbm5lbHNbY2hhbm5lbC0+aV0udmlkcTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogY3gyNTgyMV9zcmFtX2NoYW5uZWxfZHVtcChkZXYsIGNoYW5uZWwpOyAqLwotCWN4X2NsZWFyKGNoYW5uZWwtPmRtYV9jdGwsIDB4MTEpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJYnVmID0KLQkJICAgIGxpc3RfZW50cnkocS0+YWN0aXZlLm5leHQsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOwotCQlsaXN0X2RlbCgmYnVmLT52Yi5xdWV1ZSk7Ci0KLQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0VSUk9SOwotCQl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOwotCX0KLQotCWN4MjU4MjFfcmVzdGFydF92aWRlb19xdWV1ZShkZXYsIHEsIGNoYW5uZWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKLX0KLQotaW50IGN4MjU4MjFfdmlkZW9faXJxKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbl9udW0sIHUzMiBzdGF0dXMpCi17Ci0JdTMyIGNvdW50ID0gMDsKLQlpbnQgaGFuZGxlZCA9IDA7Ci0JdTMyIG1hc2s7Ci0Jc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbCA9IGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnNyYW1fY2hhbm5lbHM7Ci0KLQltYXNrID0gY3hfcmVhZChjaGFubmVsLT5pbnRfbXNrKTsKLQlpZiAoMCA9PSAoc3RhdHVzICYgbWFzaykpCi0JCXJldHVybiBoYW5kbGVkOwotCi0JY3hfd3JpdGUoY2hhbm5lbC0+aW50X3N0YXQsIHN0YXR1cyk7Ci0KLQkvKiByaXNjIG9wIGNvZGUgZXJyb3IgKi8KLQlpZiAoc3RhdHVzICYgKDEgPDwgMTYpKSB7Ci0JCXByX3dhcm4oIiVzLCAlczogdmlkZW8gcmlzYyBvcCBjb2RlIGVycm9yXG4iLAotCQkJZGV2LT5uYW1lLCBjaGFubmVsLT5uYW1lKTsKLQkJY3hfY2xlYXIoY2hhbm5lbC0+ZG1hX2N0bCwgMHgxMSk7Ci0JCWN4MjU4MjFfc3JhbV9jaGFubmVsX2R1bXAoZGV2LCBjaGFubmVsKTsKLQl9Ci0KLQkvKiByaXNjMSB5ICovCi0JaWYgKHN0YXR1cyAmIEZMRF9WSURfRFNUX1JJU0MxKSB7Ci0JCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7Ci0JCWNvdW50ID0gY3hfcmVhZChjaGFubmVsLT5ncGNudCk7Ci0JCWN4MjU4MjFfdmlkZW9fd2FrZXVwKGRldiwgJmRldi0+Y2hhbm5lbHNbY2hhbm5lbC0+aV0udmlkcSwKLQkJCQljb3VudCk7Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKLQkJaGFuZGxlZCsrOwotCX0KLQotCS8qIHJpc2MyIHkgKi8KLQlpZiAoc3RhdHVzICYgMHgxMCkgewotCQlkcHJpbnRrKDIsICJzdG9wcGVyIHZpZGVvXG4iKTsKLQkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKLQkJY3gyNTgyMV9yZXN0YXJ0X3ZpZGVvX3F1ZXVlKGRldiwKLQkJCQkmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxLCBjaGFubmVsKTsKLQkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOwotCQloYW5kbGVkKys7Ci0JfQotCXJldHVybiBoYW5kbGVkOwotfQotCi12b2lkIGN4MjU4MjFfdmlkZW9pb2N0bF91bnJlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KQotewotCWlmIChkZXYtPmlvY3RsX2RldikgewotCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPmlvY3RsX2RldikpCi0JCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPmlvY3RsX2Rldik7Ci0JCWVsc2UKLQkJCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+aW9jdGxfZGV2KTsKLQotCQlkZXYtPmlvY3RsX2RldiA9IE5VTEw7Ci0JfQotfQotCi12b2lkIGN4MjU4MjFfdmlkZW9fdW5yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IGNoYW5fbnVtKQotewotCWN4X2NsZWFyKFBDSV9JTlRfTVNLLCAxKTsKLQotCWlmIChkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpIHsKLQkJaWYgKHZpZGVvX2lzX3JlZ2lzdGVyZWQoZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KSkKLQkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKAotCQkJCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpOwotCQllbHNlCi0JCQl2aWRlb19kZXZpY2VfcmVsZWFzZSgKLQkJCQkJZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KTsKLQotCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYgPSBOVUxMOwotCi0JCWJ0Y3hfcmlzY21lbV9mcmVlKGRldi0+cGNpLAotCQkJCSZkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRxLnN0b3BwZXIpOwotCi0JCXByX3dhcm4oImRldmljZSAlZCByZWxlYXNlZCFcbiIsIGNoYW5fbnVtKTsKLQl9Ci0KLX0KLQotaW50IGN4MjU4MjFfdmlkZW9fcmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpCi17Ci0JaW50IGVycjsKLQlpbnQgaTsKLQotCXN0cnVjdCB2aWRlb19kZXZpY2UgY3gyNTgyMV92aWRlb19kZXZpY2UgPSB7Ci0JCS5uYW1lID0gImN4MjU4MjEtdmlkZW8iLAotCQkuZm9wcyA9ICZ2aWRlb19mb3BzLAotCQkubWlub3IgPSAtMSwKLQkJLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JCS50dm5vcm1zID0gQ1gyNTgyMV9OT1JNUywKLQkJLmN1cnJlbnRfbm9ybSA9IFY0TDJfU1REX05UU0NfTSwKLQl9OwotCi0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9WSURfQ0hBTk5FTF9OVU0gLSAxOyArK2kpIHsKLQkJY3gyNTgyMV9pbml0X2NvbnRyb2xzKGRldiwgaSk7Ci0KLQkJY3gyNTgyMV9yaXNjX3N0b3BwZXIoZGV2LT5wY2ksICZkZXYtPmNoYW5uZWxzW2ldLnZpZHEuc3RvcHBlciwKLQkJCQlkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMtPmRtYV9jdGwsCi0JCQkJMHgxMSwgMCk7Ci0KLQkJZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzID0gJmN4MjU4MjFfc3JhbV9jaGFubmVsc1tpXTsKLQkJZGV2LT5jaGFubmVsc1tpXS52aWRlb19kZXYgPSBOVUxMOwotCQlkZXYtPmNoYW5uZWxzW2ldLnJlc291cmNlcyA9IDA7Ci0KLQkJY3hfd3JpdGUoZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzLT5pbnRfc3RhdCwgMHhmZmZmZmZmZik7Ci0KLQkJSU5JVF9MSVNUX0hFQUQoJmRldi0+Y2hhbm5lbHNbaV0udmlkcS5hY3RpdmUpOwotCQlJTklUX0xJU1RfSEVBRCgmZGV2LT5jaGFubmVsc1tpXS52aWRxLnF1ZXVlZCk7Ci0KLQkJZGV2LT5jaGFubmVsc1tpXS50aW1lb3V0X2RhdGEuZGV2ID0gZGV2OwotCQlkZXYtPmNoYW5uZWxzW2ldLnRpbWVvdXRfZGF0YS5jaGFubmVsID0KLQkJCSZjeDI1ODIxX3NyYW1fY2hhbm5lbHNbaV07Ci0JCWRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0LmZ1bmN0aW9uID0KLQkJCWN4MjU4MjFfdmlkX3RpbWVvdXQ7Ci0JCWRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0LmRhdGEgPQotCQkJKHVuc2lnbmVkIGxvbmcpJmRldi0+Y2hhbm5lbHNbaV0udGltZW91dF9kYXRhOwotCQlpbml0X3RpbWVyKCZkZXYtPmNoYW5uZWxzW2ldLnZpZHEudGltZW91dCk7Ci0KLQkJLyogcmVnaXN0ZXIgdjRsIGRldmljZXMgKi8KLQkJZGV2LT5jaGFubmVsc1tpXS52aWRlb19kZXYgPSBjeDI1ODIxX3ZkZXZfaW5pdChkZXYsCi0JCQkJZGV2LT5wY2ksICZjeDI1ODIxX3ZpZGVvX2RldmljZSwgInZpZGVvIik7Ci0KLQkJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2LAotCQkJCVZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yW2Rldi0+bnJdKTsKLQotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZmFpbF91bnJlZzsKLQotCX0KLQotCS8qIHNldCBQQ0kgaW50ZXJydXB0ICovCi0JY3hfc2V0KFBDSV9JTlRfTVNLLCAweGZmKTsKLQotCS8qIGluaXRpYWwgZGV2aWNlIGNvbmZpZ3VyYXRpb24gKi8KLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotI2lmZGVmIFRVTkVSX0ZMQUcKLQlkZXYtPnR2bm9ybSA9IGN4MjU4MjFfdmlkZW9fZGV2aWNlLmN1cnJlbnRfbm9ybTsKLQljeDI1ODIxX3NldF90dm5vcm0oZGV2LCBkZXYtPnR2bm9ybSk7Ci0jZW5kaWYKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0KLQotCXJldHVybiAwOwotCi1mYWlsX3VucmVnOgotCWN4MjU4MjFfdmlkZW9fdW5yZWdpc3RlcihkZXYsIGkpOwotCXJldHVybiBlcnI7Ci19Ci0KLWludCBjeDI1ODIxX2J1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHVuc2lnbmVkIGludCAqY291bnQsCi0JCSB1bnNpZ25lZCBpbnQgKnNpemUpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcS0+cHJpdl9kYXRhOwotCi0JKnNpemUgPSBmaC0+Zm10LT5kZXB0aCAqIGZoLT53aWR0aCAqIGZoLT5oZWlnaHQgPj4gMzsKLQotCWlmICgwID09ICpjb3VudCkKLQkJKmNvdW50ID0gMzI7Ci0KLQlpZiAoKnNpemUgKiAqY291bnQgPiB2aWRfbGltaXQgKiAxMDI0ICogMTAyNCkKLQkJKmNvdW50ID0gKHZpZF9saW1pdCAqIDEwMjQgKiAxMDI0KSAvICpzaXplOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCi0JCSAgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KLQkgICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKLQlpbnQgcmMsIGluaXRfYnVmZmVyID0gMDsKLQl1MzIgbGluZTBfb2Zmc2V0LCBsaW5lMV9vZmZzZXQ7Ci0Jc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKCZidWYtPnZiKTsKLQlpbnQgYnBsX2xvY2FsID0gTElORV9TSVpFX0QxOwotCWludCBjaGFubmVsX29wZW5lZCA9IGZoLT5jaGFubmVsX2lkOwotCi0JQlVHX09OKE5VTEwgPT0gZmgtPmZtdCk7Ci0JaWYgKGZoLT53aWR0aCA8IDQ4IHx8IGZoLT53aWR0aCA+IDcyMCB8fAotCSAgICBmaC0+aGVpZ2h0IDwgMzIgfHwgZmgtPmhlaWdodCA+IDU3NikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlidWYtPnZiLnNpemUgPSAoZmgtPndpZHRoICogZmgtPmhlaWdodCAqIGZoLT5mbXQtPmRlcHRoKSA+PiAzOwotCi0JaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAmJiBidWYtPnZiLmJzaXplIDwgYnVmLT52Yi5zaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChidWYtPmZtdCAhPSBmaC0+Zm10IHx8Ci0JICAgIGJ1Zi0+dmIud2lkdGggIT0gZmgtPndpZHRoIHx8Ci0JICAgIGJ1Zi0+dmIuaGVpZ2h0ICE9IGZoLT5oZWlnaHQgfHwgYnVmLT52Yi5maWVsZCAhPSBmaWVsZCkgewotCQlidWYtPmZtdCA9IGZoLT5mbXQ7Ci0JCWJ1Zi0+dmIud2lkdGggPSBmaC0+d2lkdGg7Ci0JCWJ1Zi0+dmIuaGVpZ2h0ID0gZmgtPmhlaWdodDsKLQkJYnVmLT52Yi5maWVsZCA9IGZpZWxkOwotCQlpbml0X2J1ZmZlciA9IDE7Ci0JfQotCi0JaWYgKFZJREVPQlVGX05FRURTX0lOSVQgPT0gYnVmLT52Yi5zdGF0ZSkgewotCQlpbml0X2J1ZmZlciA9IDE7Ci0JCXJjID0gdmlkZW9idWZfaW9sb2NrKHEsICZidWYtPnZiLCBOVUxMKTsKLQkJaWYgKDAgIT0gcmMpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdCgidmlkZW9idWZfaW9sb2NrIGZhaWxlZCFcbiIpKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0KLQotCWRwcmludGsoMSwgImluaXRfYnVmZmVyPSVkXG4iLCBpbml0X2J1ZmZlcik7Ci0KLQlpZiAoaW5pdF9idWZmZXIpIHsKLQotCQljaGFubmVsX29wZW5lZCA9IGRldi0+Y2hhbm5lbF9vcGVuZWQ7Ci0JCWlmIChjaGFubmVsX29wZW5lZCA8IDAgfHwgY2hhbm5lbF9vcGVuZWQgPiA3KQotCQkJY2hhbm5lbF9vcGVuZWQgPSA3OwotCi0JCWlmIChkZXYtPmNoYW5uZWxzW2NoYW5uZWxfb3BlbmVkXS5waXhlbF9mb3JtYXRzID09Ci0JCQkJUElYRUxfRlJNVF80MTEpCi0JCQlidWYtPmJwbCA9IChidWYtPmZtdC0+ZGVwdGggKiBidWYtPnZiLndpZHRoKSA+PiAzOwotCQllbHNlCi0JCQlidWYtPmJwbCA9IChidWYtPmZtdC0+ZGVwdGggPj4gMykgKiAoYnVmLT52Yi53aWR0aCk7Ci0KLQkJaWYgKGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9vcGVuZWRdLnBpeGVsX2Zvcm1hdHMgPT0KLQkJCQlQSVhFTF9GUk1UXzQxMSkgewotCQkJYnBsX2xvY2FsID0gYnVmLT5icGw7Ci0JCX0gZWxzZSB7Ci0JCQlicGxfbG9jYWwgPSBidWYtPmJwbDsgICAvKiBEZWZhdWx0ICovCi0KLQkJCWlmIChjaGFubmVsX29wZW5lZCA+PSAwICYmIGNoYW5uZWxfb3BlbmVkIDw9IDcpIHsKLQkJCQlpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0KLQkJCQkJCS51c2VfY2lmX3Jlc29sdXRpb24pIHsKLQkJCQkJaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHCi0JCQkJCSAgICB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykKLQkJCQkJCWJwbF9sb2NhbCA9IDM1MiA8PCAxOwotCQkJCQllbHNlCi0JCQkJCQlicGxfbG9jYWwgPQotCQkJCQkJIGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9vcGVuZWRdLgotCQkJCQkJIGNpZl93aWR0aCA8PAotCQkJCQkJIDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3dpdGNoIChidWYtPnZiLmZpZWxkKSB7Ci0JCWNhc2UgVjRMMl9GSUVMRF9UT1A6Ci0JCQljeDI1ODIxX3Jpc2NfYnVmZmVyKGRldi0+cGNpLCAmYnVmLT5yaXNjLAotCQkJCQkgICAgZG1hLT5zZ2xpc3QsIDAsIFVOU0VULAotCQkJCQkgICAgYnVmLT5icGwsIDAsIGJ1Zi0+dmIuaGVpZ2h0KTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfRklFTERfQk9UVE9NOgotCQkJY3gyNTgyMV9yaXNjX2J1ZmZlcihkZXYtPnBjaSwgJmJ1Zi0+cmlzYywKLQkJCQkJICAgIGRtYS0+c2dsaXN0LCBVTlNFVCwgMCwKLQkJCQkJICAgIGJ1Zi0+YnBsLCAwLCBidWYtPnZiLmhlaWdodCk7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6Ci0JCQkvKiBBbGwgb3RoZXIgZm9ybWF0cyBhcmUgdG9wIGZpZWxkIGZpcnN0ICovCi0JCQlsaW5lMF9vZmZzZXQgPSAwOwotCQkJbGluZTFfb2Zmc2V0ID0gYnVmLT5icGw7Ci0JCQlkcHJpbnRrKDEsICJ0b3AgZmllbGQgZmlyc3RcbiIpOwotCi0JCQljeDI1ODIxX3Jpc2NfYnVmZmVyKGRldi0+cGNpLCAmYnVmLT5yaXNjLAotCQkJCQkgICAgZG1hLT5zZ2xpc3QsIGxpbmUwX29mZnNldCwKLQkJCQkJICAgIGJwbF9sb2NhbCwgYnBsX2xvY2FsLCBicGxfbG9jYWwsCi0JCQkJCSAgICBidWYtPnZiLmhlaWdodCA+PiAxKTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfRklFTERfU0VRX1RCOgotCQkJY3gyNTgyMV9yaXNjX2J1ZmZlcihkZXYtPnBjaSwgJmJ1Zi0+cmlzYywKLQkJCQkJICAgIGRtYS0+c2dsaXN0LAotCQkJCQkgICAgMCwgYnVmLT5icGwgKiAoYnVmLT52Yi5oZWlnaHQgPj4gMSksCi0JCQkJCSAgICBidWYtPmJwbCwgMCwgYnVmLT52Yi5oZWlnaHQgPj4gMSk7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0ZJRUxEX1NFUV9CVDoKLQkJCWN4MjU4MjFfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCi0JCQkJCSAgICBkbWEtPnNnbGlzdCwKLQkJCQkJICAgIGJ1Zi0+YnBsICogKGJ1Zi0+dmIuaGVpZ2h0ID4+IDEpLCAwLAotCQkJCQkgICAgYnVmLT5icGwsIDAsIGJ1Zi0+dmIuaGVpZ2h0ID4+IDEpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlCVUcoKTsKLQkJfQotCX0KLQotCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3ByZXAgLSAlZHglZCAlZGJwcCBcIiVzXCIgLSBkbWE9MHglMDhseFxuIiwKLQkJYnVmLCBidWYtPnZiLmksIGZoLT53aWR0aCwgZmgtPmhlaWdodCwgZmgtPmZtdC0+ZGVwdGgsCi0JCWZoLT5mbXQtPm5hbWUsICh1bnNpZ25lZCBsb25nKWJ1Zi0+cmlzYy5kbWEpOwotCi0JYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JY3gyNTgyMV9mcmVlX2J1ZmZlcihxLCBidWYpOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBjeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKLQkJCSAgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yik7Ci0KLQljeDI1ODIxX2ZyZWVfYnVmZmVyKHEsIGJ1Zik7Ci19Ci0KLXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqZ2V0X3F1ZXVlKHN0cnVjdCBjeDI1ODIxX2ZoICpmaCkKLXsKLQlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCXJldHVybiAmZmgtPnZpZHE7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLX0KLQotaW50IGN4MjU4MjFfZ2V0X3Jlc291cmNlKHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwgaW50IHJlc291cmNlKQotewotCXN3aXRjaCAoZmgtPnR5cGUpIHsKLQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKLQkJcmV0dXJuIHJlc291cmNlOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGVvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXJldHVybiB2aWRlb2J1Zl9tbWFwX21hcHBlcihnZXRfcXVldWUoZmgpLCB2bWEpOwotfQotCi0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKnByZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0udmlkcTsKLQotCS8qIGFkZCBqdW1wIHRvIHN0b3BwZXIgKi8KLQlidWYtPnJpc2Muam1wWzBdID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QIHwgUklTQ19JUlExIHwgUklTQ19DTlRfSU5DKTsKLQlidWYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIocS0+c3RvcHBlci5kbWEpOwotCWJ1Zi0+cmlzYy5qbXBbMl0gPSBjcHVfdG9fbGUzMigwKTsgICAgICAvKiBiaXRzIDYzLTMyICovCi0KLQlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCQlidWYtPnZiLmkpOwotCi0JfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCQljeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShkZXYsIHEsIGJ1ZiwKLQkJCQlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5zcmFtX2NoYW5uZWxzKTsKLQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKLQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7Ci0JCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcyArIEJVRkZFUl9USU1FT1VUKTsKLQkJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgcS0+Y291bnQgPSAlZFxuIiwKLQkJCQlidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCwgcS0+Y291bnQpOwotCX0gZWxzZSB7Ci0JCXByZXYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsCi0JCQkJdmIucXVldWUpOwotCQlpZiAocHJldi0+dmIud2lkdGggPT0gYnVmLT52Yi53aWR0aAotCQkgICAmJiBwcmV2LT52Yi5oZWlnaHQgPT0gYnVmLT52Yi5oZWlnaHQKLQkJICAgJiYgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0KLQkJCS8qIDY0IGJpdCBiaXRzIDYzLTMyICovCi0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwotCQkJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBhcHBlbmQgdG8gYWN0aXZlLCBidWYtPmNvdW50PSVkXG4iLAotCQkJCQlidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCk7Ci0KLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKLQkJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgcXVldWVkXG4iLCBidWYsCi0JCQkJCWJ1Zi0+dmIuaSk7Ci0JCX0KLQl9Ci0KLQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkKLQkJZHByaW50aygyLCAiYWN0aXZlIHF1ZXVlIGVtcHR5IVxuIik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjU4MjFfdmlkZW9fcW9wcyA9IHsKLQkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCi0JLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKLQkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAotCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpoLCAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmg7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQlpbnQgbWlub3IgPSB2aWRlb19kZXZkYXRhKGZpbGUpLT5taW5vcjsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQl1MzIgcGl4X2Zvcm1hdDsKLQlpbnQgY2hfaWQgPSAwOwotCWludCBpOwotCi0JZHByaW50aygxLCAib3BlbiBkZXY9JXMgdHlwZT0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKLQkJCXY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7Ci0KLQkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwotCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gZmgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXV0ZXhfbG9jaygmY3gyNTgyMV9kZXZsaXN0X211dGV4KTsKLQotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmN4MjU4MjFfZGV2bGlzdCkKLQl7Ci0JCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDI1ODIxX2RldiwgZGV2bGlzdCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9WSURfQ0hBTk5FTF9OVU07IGkrKykgewotCQkJaWYgKGgtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiAmJgotCQkJICAgaC0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikgewotCQkJCWRldiA9IGg7Ci0JCQkJY2hfaWQgPSBpOwotCQkJCXR5cGUgID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKE5VTEwgPT0gZGV2KSB7Ci0JCW11dGV4X3VubG9jaygmY3gyNTgyMV9kZXZsaXN0X211dGV4KTsKLQkJa2ZyZWUoZmgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLQlmaC0+ZGV2ID0gZGV2OwotCWZoLT50eXBlID0gdHlwZTsKLQlmaC0+d2lkdGggPSA3MjA7Ci0JZmgtPmNoYW5uZWxfaWQgPSBjaF9pZDsKLQotCWlmIChkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9CRyB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykKLQkJZmgtPmhlaWdodCA9IDU3NjsKLQllbHNlCi0JCWZoLT5oZWlnaHQgPSA0ODA7Ci0KLQlkZXYtPmNoYW5uZWxfb3BlbmVkID0gZmgtPmNoYW5uZWxfaWQ7Ci0JaWYgKGRldi0+Y2hhbm5lbHNbY2hfaWRdLnBpeGVsX2Zvcm1hdHMgPT0gUElYRUxfRlJNVF80MTEpCi0JCXBpeF9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfWTQxUDsKLQllbHNlCi0JCXBpeF9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKLQlmaC0+Zm10ID0gY3gyNTgyMV9mb3JtYXRfYnlfZm91cmNjKHBpeF9mb3JtYXQpOwotCi0JdjRsMl9wcmlvX29wZW4oJmRldi0+Y2hhbm5lbHNbY2hfaWRdLnByaW8sICZmaC0+cHJpbyk7Ci0KLQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmlkcSwgJmN4MjU4MjFfdmlkZW9fcW9wcywKLQkJCSAgICAgICZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5zbG9jaywKLQkJCSAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkJCSAgICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgY3gyNTgyMV9idWZmZXIpLCBmaCwgTlVMTCk7Ci0KLQlkcHJpbnRrKDEsICJwb3N0IHZpZGVvYnVmX3F1ZXVlX2luaXQoKVxuIik7Ci0JbXV0ZXhfdW5sb2NrKCZjeDI1ODIxX2Rldmxpc3RfbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogZGF0YSwgc2l6ZV90IGNvdW50LAotCQkJIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCWlmIChjeDI1ODIxX3Jlc19sb2NrZWQoZmgsIFJFU09VUkNFX1ZJREVPMCkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQlmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOwotCi0JaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTzApKSB7Ci0JCS8qIHN0cmVhbWluZyBjYXB0dXJlICovCi0JCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcS5zdHJlYW0pKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPnZpZHEuc3RyZWFtLm5leHQsCi0JCQkJc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQoKSBjYXB0dXJlICovCi0JCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkJaWYgKE5VTEwgPT0gYnVmKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JfQotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgewotCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7Ci0JCQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkJCWlmIChkZXYgJiYgZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KLQkJCQkJLnVzZV9jaWZfcmVzb2x1dGlvbikgewotCQkJCXU4IGNhbV9pZCA9ICooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMyk7Ci0JCQkJbWVtY3B5KChjaGFyICopYnVmLT52Yi5iYWRkciwKLQkJCQkgICAgICAoY2hhciAqKWJ1Zi0+dmIuYmFkZHIgKyAoZmgtPndpZHRoICogMiksCi0JCQkJICAgICAgKGZoLT53aWR0aCAqIDIpKTsKLQkJCQkqKChjaGFyICopYnVmLT52Yi5iYWRkciArIDMpID0gY2FtX2lkOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW9fcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCi0JLyogc3RvcCB0aGUgcmlzYyBlbmdpbmUgYW5kIGZpZm8gKi8KLQljeF93cml0ZShjaGFubmVsMC0+ZG1hX2N0bCwgMCk7IC8qIEZJRk8gYW5kIFJJU0MgZGlzYWJsZSAqLwotCi0JLyogc3RvcCB2aWRlbyBjYXB0dXJlICovCi0JaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTzApKSB7Ci0JCXZpZGVvYnVmX3F1ZXVlX2NhbmNlbCgmZmgtPnZpZHEpOwotCQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIFJFU09VUkNFX1ZJREVPMCk7Ci0JfQotCi0JaWYgKGZoLT52aWRxLnJlYWRfYnVmKSB7Ci0JCWN4MjU4MjFfYnVmZmVyX3JlbGVhc2UoJmZoLT52aWRxLCBmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JCWtmcmVlKGZoLT52aWRxLnJlYWRfYnVmKTsKLQl9Ci0KLQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52aWRxKTsKLQotCXY0bDJfcHJpb19jbG9zZSgmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywgZmgtPnByaW8pOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Ja2ZyZWUoZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLCBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwKLQkJCQkJCVJFU09VUkNFX1ZJREVPMCkpKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJldHVybiB2aWRlb2J1Zl9zdHJlYW1vbihnZXRfcXVldWUoZmgpKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQlpbnQgZXJyLCByZXM7Ci0KLQlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoaSAhPSBmaC0+dHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXMgPSBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU8wKTsKLQllcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoZ2V0X3F1ZXVlKGZoKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCByZXMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKLQlpbnQgZXJyOwotCWludCBwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MjI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAotCQkJCSAgICAgIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlkcHJpbnRrKDIsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JZXJyID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKGZpbGUsIHByaXYsIGYpOwotCi0JaWYgKDAgIT0gZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZmgtPmZtdCA9IGN4MjU4MjFfZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlmaC0+dmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0KLQkvKiBjaGVjayBpZiB3aWR0aCBhbmQgaGVpZ2h0IGlzIHZhbGlkIGJhc2VkIG9uIHNldCBzdGFuZGFyZCAqLwotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX3dpZHRoKGYtPmZtdC5waXgud2lkdGgsIGRldi0+dHZub3JtKSkKLQkJZmgtPndpZHRoID0gZi0+Zm10LnBpeC53aWR0aDsKLQotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX2hlaWdodChmLT5mbXQucGl4LmhlaWdodCwgZGV2LT50dm5vcm0pKQotCQlmaC0+aGVpZ2h0ID0gZi0+Zm10LnBpeC5oZWlnaHQ7Ci0KLQlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWTQxUCkKLQkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDExOwotCWVsc2UgaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpCi0JCXBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgU1JBTV9DSDAwLCBwaXhfZm9ybWF0KTsKLQotCS8qIGNoZWNrIGlmIGNpZiByZXNvbHV0aW9uICovCi0JaWYgKGZoLT53aWR0aCA9PSAzMjAgfHwgZmgtPndpZHRoID09IDM1MikKLQkJZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0udXNlX2NpZl9yZXNvbHV0aW9uID0gMTsKLQllbHNlCi0JCWRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnVzZV9jaWZfcmVzb2x1dGlvbiA9IDA7Ci0KLQlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5jaWZfd2lkdGggPSBmaC0+d2lkdGg7Ci0JbWVkdXNhX3NldF9yZXNvbHV0aW9uKGRldiwgZmgtPndpZHRoLCBTUkFNX0NIMDApOwotCi0JZHByaW50aygyLCAiJXMoKTogd2lkdGg9JWQgaGVpZ2h0PSVkIGZpZWxkPSVkXG4iLCBfX2Z1bmNfXywgZmgtPndpZHRoLAotCQlmaC0+aGVpZ2h0LCBmaC0+dmlkcS5maWVsZCk7Ci0JdjRsMl9maWxsX21idXNfZm9ybWF0KCZtYnVzX2ZtdCwgJmYtPmZtdC5waXgsIFY0TDJfTUJVU19GTVRfRklYRUQpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19tYnVzX2ZtdCwgJm1idXNfZm10KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCWludCByZXRfdmFsID0gMDsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0KLQlyZXRfdmFsID0gdmlkZW9idWZfZHFidWYoZ2V0X3F1ZXVlKGZoKSwgcCwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JcC0+c2VxdWVuY2UgPSBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS52aWRxLmNvdW50OwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2xvZ19zdGF0dXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCWNoYXIgbmFtZVszMiArIDJdOwotCi0Jc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaCA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCi0JCQkJCQkJCS5zcmFtX2NoYW5uZWxzOwotCXUzMiB0bXAgPSAwOwotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvMiIsIGRldi0+bmFtZSk7Ci0JcHJfaW5mbygiJXMvMjogPT09PT09PT09PT09ICBTVEFSVCBMT0cgU1RBVFVTICA9PT09PT09PT09PT1cbiIsCi0JCWRldi0+bmFtZSk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOwotCXRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7Ci0JcHJfaW5mbygiVmlkZW8gaW5wdXQgMCBpcyAlc1xuIiwKLQkJKHRtcCAmIDB4MTEpID8gInN0cmVhbWluZyIgOiAic3RvcHBlZCIpOwotCXByX2luZm8oIiVzLzI6ID09PT09PT09PT09PT0gIEVORCBMT0cgU1RBVFVTICA9PT09PT09PT09PT09XG4iLAotCQlkZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAotCQkJCSAgICAgIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gY3gyNTgyMV9zZXRfY29udHJvbChkZXYsIGN0bCwgZmgtPmNoYW5uZWxfaWQpOwotfQotCi0vKiBWSURFTyBJT0NUTFMgKi8KLWludCBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQotCWYtPmZtdC5waXgud2lkdGggPSBmaC0+d2lkdGg7Ci0JZi0+Zm10LnBpeC5oZWlnaHQgPSBmaC0+aGVpZ2h0OwotCWYtPmZtdC5waXguZmllbGQgPSBmaC0+dmlkcS5maWVsZDsKLQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gZmgtPmZtdC0+Zm91cmNjOwotCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gKGYtPmZtdC5waXgud2lkdGggKiBmaC0+Zm10LT5kZXB0aCkgPj4gMzsKLQlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZm10ICpmbXQ7Ci0JZW51bSB2NGwyX2ZpZWxkIGZpZWxkOwotCXVuc2lnbmVkIGludCBtYXh3LCBtYXhoOwotCi0JZm10ID0gY3gyNTgyMV9mb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwotCWlmIChOVUxMID09IGZtdCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmaWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0JbWF4dyA9IDcyMDsKLQltYXhoID0gNTc2OwotCi0JaWYgKFY0TDJfRklFTERfQU5ZID09IGZpZWxkKSB7Ci0JCWlmIChmLT5mbXQucGl4LmhlaWdodCA+IG1heGggLyAyKQotCQkJZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JCWVsc2UKLQkJCWZpZWxkID0gVjRMMl9GSUVMRF9UT1A7Ci0JfQotCi0Jc3dpdGNoIChmaWVsZCkgewotCWNhc2UgVjRMMl9GSUVMRF9UT1A6Ci0JY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTToKLQkJbWF4aCA9IG1heGggLyAyOwotCQlicmVhazsKLQljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZi0+Zm10LnBpeC5maWVsZCA9IGZpZWxkOwotCWlmIChmLT5mbXQucGl4LmhlaWdodCA8IDMyKQotCQlmLT5mbXQucGl4LmhlaWdodCA9IDMyOwotCWlmIChmLT5mbXQucGl4LmhlaWdodCA+IG1heGgpCi0JCWYtPmZtdC5waXguaGVpZ2h0ID0gbWF4aDsKLQlpZiAoZi0+Zm10LnBpeC53aWR0aCA8IDQ4KQotCQlmLT5mbXQucGl4LndpZHRoID0gNDg7Ci0JaWYgKGYtPmZtdC5waXgud2lkdGggPiBtYXh3KQotCQlmLT5mbXQucGl4LndpZHRoID0gbWF4dzsKLQlmLT5mbXQucGl4LndpZHRoICY9IH4weDAzOwotCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gKGYtPmZtdC5waXgud2lkdGggKiBmbXQtPmRlcHRoKSA+PiAzOwotCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0KLQlzdHJjcHkoY2FwLT5kcml2ZXIsICJjeDI1ODIxIik7Ci0Jc3RybGNweShjYXAtPmNhcmQsIGN4MjU4MjFfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKLQlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0llOiVzIiwgcGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBDWDI1ODIxX1ZFUlNJT05fQ09ERTsKLQljYXAtPmNhcGFiaWxpdGllcyA9Ci0JICAgIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7Ci0JaWYgKFVOU0VUICE9IGRldi0+dHVuZXJfdHlwZSkKLQkJY2FwLT5jYXBhYmlsaXRpZXMgfD0gVjRMMl9DQVBfVFVORVI7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCi17Ci0JaWYgKHVubGlrZWx5KGYtPmluZGV4ID49IEFSUkFZX1NJWkUoZm9ybWF0cykpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN0cmxjcHkoZi0+ZGVzY3JpcHRpb24sIGZvcm1hdHNbZi0+aW5kZXhdLm5hbWUsIHNpemVvZihmLT5kZXNjcmlwdGlvbikpOwotCWYtPnBpeGVsZm9ybWF0ID0gZm9ybWF0c1tmLT5pbmRleF0uZm91cmNjOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcyhnZXRfcXVldWUoZmgpLCBwKTsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZihnZXRfcXVldWUoZmgpLCBwKTsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXJldHVybiB2aWRlb2J1Zl9xYnVmKGdldF9xdWV1ZShmaCksIHApOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfZ19wcmlvcml0eShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZiwgZW51bSB2NGwyX3ByaW9yaXR5ICpwKQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKWYpLT5kZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZjsKLQotCSpwID0gdjRsMl9wcmlvX21heCgmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX3NfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmYsCi0JCQkgICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgcHJpbykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKWYpLT5kZXY7Ci0KLQlyZXR1cm4gdjRsMl9wcmlvX2NoYW5nZSgmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywgJmZoLT5wcmlvLAotCQkJcHJpbyk7Ci19Ci0KLSNpZmRlZiBUVU5FUl9GTEFHCi1pbnQgY3gyNTgyMV92aWRpb2Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICogdHZub3JtcykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JaW50IGVycjsKLQotCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sCi0JCQkJICAgICAgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChkZXYtPnR2bm9ybSA9PSAqdHZub3JtcykKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCWN4MjU4MjFfc2V0X3R2bm9ybShkZXYsICp0dm5vcm1zKTsKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0KLQltZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoZGV2KTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLWludCBjeDI1ODIxX2VudW1faW5wdXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2lucHV0ICppKQotewotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5hbWVbXSA9IHsKLQkJW0NYMjU4MjFfVk1VWF9DT01QT1NJVEVdID0gIkNvbXBvc2l0ZSIsCi0JCVtDWDI1ODIxX1ZNVVhfU1ZJREVPXSA9ICJTLVZpZGVvIiwKLQkJW0NYMjU4MjFfVk1VWF9ERUJVR10gPSAiZm9yIGRlYnVnIG9ubHkiLAotCX07Ci0JdW5zaWduZWQgaW50IG47Ci0JZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCi0JbiA9IGktPmluZGV4OwotCWlmIChuID49IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKDAgPT0gSU5QVVQobiktPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0Jc3RyY3B5KGktPm5hbWUsIGluYW1lW0lOUFVUKG4pLT50eXBlXSk7Ci0KLQlpLT5zdGQgPSBDWDI1ODIxX05PUk1TOwotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppKQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCXJldHVybiBjeDI1ODIxX2VudW1faW5wdXQoZGV2LCBpKTsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCi0JKmkgPSBkZXYtPmlucHV0OwotCWRwcmludGsoMSwgIiVzKCk6IHJldHVybnMgJWRcbiIsIF9fZnVuY19fLCAqaSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JaW50IGVycjsKLQotCWRwcmludGsoMSwgIiVzKCVkKVxuIiwgX19mdW5jX18sIGkpOwotCi0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKLQkJCQkgICAgICBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKGkgPiAyKSB7Ci0JCWRwcmludGsoMSwgIiVzKCk6IC1FSU5WQUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQljeDI1ODIxX3ZpZGVvX211eChkZXYsIGkpOwotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIFRVTkVSX0ZMQUcKLWludCBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQlmLT5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7Ci0KLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgdHVuZXIsIGdfZnJlcXVlbmN5LCBmKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV9zZXRfZnJlcShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQotewotCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JZGV2LT5mcmVxID0gZi0+ZnJlcXVlbmN5OwotCi0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgZik7Ci0KLQkvKiBXaGVuIGNoYW5naW5nIGNoYW5uZWxzIGl0IGlzIHJlcXVpcmVkIHRvIHJlc2V0IFRWQVVESU8gKi8KLQltc2xlZXAoMTApOwotCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldjsKLQlpbnQgZXJyOwotCi0JaWYgKGZoKSB7Ci0JCWRldiA9IGZoLT5kZXY7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKLQkJCQkgICAgICBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJJbnZhbGlkIGZoIHBvaW50ZXIhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGN4MjU4MjFfc2V0X2ZyZXEoZGV2LCBmKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotaW50IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAotCQkgICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilmaCktPmRldjsKLQotCWlmICghdjRsMl9jaGlwX21hdGNoX2hvc3QoJnJlZy0+bWF0Y2gpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBnX3JlZ2lzdGVyLCByZWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKLQkJICAgICAgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZmgpLT5kZXY7Ci0KLQlpZiAoIXY0bDJfY2hpcF9tYXRjaF9ob3N0KCZyZWctPm1hdGNoKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgc19yZWdpc3RlciwgcmVnKTsKLQotCXJldHVybiAwOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIFRVTkVSX0ZMQUcKLWludCBjeDI1ODIxX3ZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl90dW5lciAqdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCi0JaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICgwICE9IHQtPmluZGV4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN0cmNweSh0LT5uYW1lLCAiVGVsZXZpc2lvbiIpOwotCXQtPnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKLQl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTk9STTsKLQl0LT5yYW5nZWhpZ2ggPSAweGZmZmZmZmZmVUw7Ci0KLQl0LT5zaWduYWwgPSAweGZmZmY7CS8qIExPQ0tFRCAqLwotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfdHVuZXIgKnQpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAotCQkJCSAgICAgIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKDAgIT0gdC0+aW5kZXgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBub19jdGwgPSB7Ci0JLm5hbWUgPSAiNDIiLAotCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBjeDI1ODIxX2N0bHNbXSA9IHsKLQkvKiAtLS0gdmlkZW8gLS0tICovCi0JewotCSAuaWQgPSBWNEwyX0NJRF9CUklHSFRORVNTLAotCSAubmFtZSA9ICJCcmlnaHRuZXNzIiwKLQkgLm1pbmltdW0gPSAwLAotCSAubWF4aW11bSA9IDEwMDAwLAotCSAuc3RlcCA9IDEsCi0JIC5kZWZhdWx0X3ZhbHVlID0gNjIwMCwKLQkgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSB9LCB7Ci0JICAgICAuaWQgPSBWNEwyX0NJRF9DT05UUkFTVCwKLQkgICAgIC5uYW1lID0gIkNvbnRyYXN0IiwKLQkgICAgIC5taW5pbXVtID0gMCwKLQkgICAgIC5tYXhpbXVtID0gMTAwMDAsCi0JICAgICAuc3RlcCA9IDEsCi0JICAgICAuZGVmYXVsdF92YWx1ZSA9IDUwMDAsCi0JICAgICAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgICB9LCB7Ci0JCSAuaWQgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAotCQkgLm5hbWUgPSAiU2F0dXJhdGlvbiIsCi0JCSAubWluaW11bSA9IDAsCi0JCSAubWF4aW11bSA9IDEwMDAwLAotCQkgLnN0ZXAgPSAxLAotCQkgLmRlZmF1bHRfdmFsdWUgPSA1MDAwLAotCQkgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkgfSwgewotCQkgICAgIC5pZCA9IFY0TDJfQ0lEX0hVRSwKLQkJICAgICAubmFtZSA9ICJIdWUiLAotCQkgICAgIC5taW5pbXVtID0gMCwKLQkJICAgICAubWF4aW11bSA9IDEwMDAwLAotCQkgICAgIC5zdGVwID0gMSwKLQkJICAgICAuZGVmYXVsdF92YWx1ZSA9IDUwMDAsCi0JCSAgICAgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkgICAgIH0KLX07Ci1zdGF0aWMgY29uc3QgaW50IENYMjU4MjFfQ1RMUyA9IEFSUkFZX1NJWkUoY3gyNTgyMV9jdGxzKTsKLQotc3RhdGljIGludCBjeDI1ODIxX2N0cmxfcXVlcnkoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKLXsKLQlpbnQgaTsKLQotCWlmIChxY3RybC0+aWQgPCBWNEwyX0NJRF9CQVNFIHx8IHFjdHJsLT5pZCA+PSBWNEwyX0NJRF9MQVNUUDEpCi0JCXJldHVybiAtRUlOVkFMOwotCWZvciAoaSA9IDA7IGkgPCBDWDI1ODIxX0NUTFM7IGkrKykKLQkJaWYgKGN4MjU4MjFfY3Rsc1tpXS5pZCA9PSBxY3RybC0+aWQpCi0JCQlicmVhazsKLQlpZiAoaSA9PSBDWDI1ODIxX0NUTFMpIHsKLQkJKnFjdHJsID0gbm9fY3RsOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnFjdHJsID0gY3gyNTgyMV9jdGxzW2ldOwotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkgICAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCi17Ci0JcmV0dXJuIGN4MjU4MjFfY3RybF9xdWVyeShxY3RybCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogVklERU8gQ1RSTCBJT0NUTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmxfYnlfaWQodW5zaWduZWQgaW50IGlkKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKQotCQlpZiAoY3gyNTgyMV9jdGxzW2ldLmlkID09IGlkKQotCQkJcmV0dXJuIGN4MjU4MjFfY3RscyArIGk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0KLQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmw7Ci0KLQljdHJsID0gY3RybF9ieV9pZChjdGwtPmlkKTsKLQotCWlmIChOVUxMID09IGN0cmwpCi0JCXJldHVybiAtRUlOVkFMOwotCXN3aXRjaCAoY3RsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9icmlnaHQ7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfSFVFOgotCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX2h1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9jb250cmFzdDsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgotCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX3NhdHVyYXRpb247Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfc2V0X2NvbnRyb2woc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCi0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwsIGludCBjaGFuX251bSkKLXsKLQlpbnQgZXJyOwotCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybDsKLQotCWVyciA9IC1FSU5WQUw7Ci0KLQljdHJsID0gY3RybF9ieV9pZChjdGwtPmlkKTsKLQotCWlmIChOVUxMID09IGN0cmwpCi0JCXJldHVybiBlcnI7Ci0KLQlzd2l0Y2ggKGN0cmwtPnR5cGUpIHsKLQljYXNlIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU46Ci0JY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgotCWNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKLQkJaWYgKGN0bC0+dmFsdWUgPCBjdHJsLT5taW5pbXVtKQotCQkJY3RsLT52YWx1ZSA9IGN0cmwtPm1pbmltdW07Ci0JCWlmIChjdGwtPnZhbHVlID4gY3RybC0+bWF4aW11bSkKLQkJCWN0bC0+dmFsdWUgPSBjdHJsLT5tYXhpbXVtOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBub3RoaW5nICovIDsKLQl9Ci0KLQlzd2l0Y2ggKGN0bC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9icmlnaHQgPSBjdGwtPnZhbHVlOwotCQltZWR1c2Ffc2V0X2JyaWdodG5lc3MoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfSFVFOgotCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5jdGxfaHVlID0gY3RsLT52YWx1ZTsKLQkJbWVkdXNhX3NldF9odWUoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9jb250cmFzdCA9IGN0bC0+dmFsdWU7Ci0JCW1lZHVzYV9zZXRfY29udHJhc3QoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJZGV2LT5jaGFubmVsc1tjaGFuX251bV0uY3RsX3NhdHVyYXRpb24gPSBjdGwtPnZhbHVlOwotCQltZWR1c2Ffc2V0X3NhdHVyYXRpb24oZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7Ci0JCWJyZWFrOwotCX0KLQotCWVyciA9IDA7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBjeDI1ODIxX2luaXRfY29udHJvbHMoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSkKLXsKLQlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKSB7Ci0JCWN0cmwuaWQgPSBjeDI1ODIxX2N0bHNbaV0uaWQ7Ci0JCWN0cmwudmFsdWUgPSBjeDI1ODIxX2N0bHNbaV0uZGVmYXVsdF92YWx1ZTsKLQotCQljeDI1ODIxX3NldF9jb250cm9sKGRldiwgJmN0cmwsIGNoYW5fbnVtKTsKLQl9Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCi0JaWYgKGNyb3BjYXAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQljcm9wY2FwLT5ib3VuZHMudG9wID0gY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOwotCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IDcyMDsKLQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gZGV2LT50dm5vcm0gPT0gVjRMMl9TVERfUEFMX0JHID8gNTc2IDogNDgwOwotCWNyb3BjYXAtPnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9Ci0JCWRldi0+dHZub3JtID09IFY0TDJfU1REX1BBTF9CRyA/IDU5IDogMTA7Ci0JY3JvcGNhcC0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPQotCQlkZXYtPnR2bm9ybSA9PSBWNEwyX1NURF9QQUxfQkcgPyA1NCA6IDExOwotCWNyb3BjYXAtPmRlZnJlY3QgPSBjcm9wY2FwLT5ib3VuZHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19zX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAotCQkJCSAgICAgIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JLyogY3gyNTgyMV92aWRpb2Nfc19jcm9wIG5vdCBzdXBwb3J0ZWQgKi8KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX2dfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY3JvcCAqY3JvcCkKLXsKLQkvKiBjeDI1ODIxX3ZpZGlvY19nX2Nyb3Agbm90IHN1cHBvcnRlZCAqLwotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfcXVlcnlzdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICogbm9ybSkKLXsKLQkvKiBtZWR1c2EgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBzdGFuZGFyZCBzZW5zaW5nIG9mIGN1cnJlbnQgaW5wdXQgKi8KLQkqbm9ybSA9IENYMjU4MjFfTk9STVM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgodTMyIHdpZHRoLCB2NGwyX3N0ZF9pZCB0dm5vcm0pCi17Ci0JaWYgKHR2bm9ybSA9PSBWNEwyX1NURF9QQUxfQkcpIHsKLQkJaWYgKHdpZHRoID09IDM1MiB8fCB3aWR0aCA9PSA3MjApCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHR2bm9ybSA9PSBWNEwyX1NURF9OVFNDX00pIHsKLQkJaWYgKHdpZHRoID09IDMyMCB8fCB3aWR0aCA9PSAzNTIgfHwgd2lkdGggPT0gNzIwKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KHUzMiBoZWlnaHQsIHY0bDJfc3RkX2lkIHR2bm9ybSkKLXsKLQlpZiAodHZub3JtID09IFY0TDJfU1REX1BBTF9CRykgewotCQlpZiAoaGVpZ2h0ID09IDU3NiB8fCBoZWlnaHQgPT0gMjg4KQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQotCWlmICh0dm5vcm0gPT0gVjRMMl9TVERfTlRTQ19NKSB7Ci0JCWlmIChoZWlnaHQgPT0gNDgwIHx8IGhlaWdodCA9PSAyNDApCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQlpbnQgY29tbWFuZCA9IDA7Ci0Jc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKLQotCWRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKLQotCWlmICghZGF0YV9mcm9tX3VzZXIpIHsKLQkJcHJfZXJyKCIlcygpOiBVcHN0cmVhbSBkYXRhIGlzIElOVkFMSUQuIFJldHVybmluZ1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7Ci0KLQlpZiAoY29tbWFuZCAhPSBVUFNUUkVBTV9TVEFSVF9WSURFTyAmJiBjb21tYW5kICE9IFVQU1RSRUFNX1NUT1BfVklERU8pCi0JCXJldHVybiAwOwotCi0JZGV2LT5pbnB1dF9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKLQlkZXYtPmlucHV0X2F1ZGlvZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7Ci0JZGV2LT52aWRfc3RkbmFtZSA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKLQlkZXYtPnBpeGVsX2Zvcm1hdCA9IGRhdGFfZnJvbV91c2VyLT5waXhlbF9mb3JtYXQ7Ci0JZGV2LT5jaGFubmVsX3NlbGVjdCA9IGRhdGFfZnJvbV91c2VyLT5jaGFubmVsX3NlbGVjdDsKLQlkZXYtPmNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKLQotCXN3aXRjaCAoY29tbWFuZCkgewotCWNhc2UgVVBTVFJFQU1fU1RBUlRfVklERU86Ci0JCWN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gxKGRldiwgZGF0YV9mcm9tX3VzZXIpOwotCQlicmVhazsKLQotCWNhc2UgVVBTVFJFQU1fU1RPUF9WSURFTzoKLQkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMShkZXYpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfdXBzdHJlYW0xMChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50IGNvbW1hbmQgPSAwOwotCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7Ci0KLQlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7Ci0KLQlpZiAoIWRhdGFfZnJvbV91c2VyKSB7Ci0JCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOwotCi0JaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfVklERU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX1ZJREVPKQotCQlyZXR1cm4gMDsKLQotCWRldi0+aW5wdXRfZmlsZW5hbWVfY2gyID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOwotCWRldi0+aW5wdXRfYXVkaW9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKLQlkZXYtPnZpZF9zdGRuYW1lX2NoMiA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKLQlkZXYtPnBpeGVsX2Zvcm1hdF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwotCWRldi0+Y2hhbm5lbF9zZWxlY3RfY2gyID0gZGF0YV9mcm9tX3VzZXItPmNoYW5uZWxfc2VsZWN0OwotCWRldi0+Y29tbWFuZF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKLQotCXN3aXRjaCAoY29tbWFuZCkgewotCWNhc2UgVVBTVFJFQU1fU1RBUlRfVklERU86Ci0JCWN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gyKGRldiwgZGF0YV9mcm9tX3VzZXIpOwotCQlicmVhazsKLQotCWNhc2UgVVBTVFJFQU1fU1RPUF9WSURFTzoKLQkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMihkZXYpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfdXBzdHJlYW0xMShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50IGNvbW1hbmQgPSAwOwotCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7Ci0KLQlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7Ci0KLQlpZiAoIWRhdGFfZnJvbV91c2VyKSB7Ci0JCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOwotCi0JaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfQVVESU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX0FVRElPKQotCQlyZXR1cm4gMDsKLQotCWRldi0+aW5wdXRfZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7Ci0JZGV2LT5pbnB1dF9hdWRpb2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOwotCWRldi0+dmlkX3N0ZG5hbWUgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7Ci0JZGV2LT5waXhlbF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwotCWRldi0+Y2hhbm5lbF9zZWxlY3QgPSBkYXRhX2Zyb21fdXNlci0+Y2hhbm5lbF9zZWxlY3Q7Ci0JZGV2LT5jb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFVQU1RSRUFNX1NUQVJUX0FVRElPOgotCQljeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKGRldiwgZGF0YV9mcm9tX3VzZXIpOwotCQlicmVhazsKLQotCWNhc2UgVVBTVFJFQU1fU1RPUF9BVURJTzoKLQkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX2F1ZGlvKGRldik7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyB2aWRlb19pb2N0bF9zZXQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKLQlpbnQgY29tbWFuZDsKLQlpbnQgd2lkdGggPSA3MjA7Ci0JaW50IHNlbGVjdGVkX2NoYW5uZWwgPSAwLCBwaXhfZm9ybWF0ID0gMCwgaSA9IDA7Ci0JaW50IGNpZl9lbmFibGUgPSAwLCBjaWZfd2lkdGggPSAwOwotCXUzMiB2YWx1ZSA9IDA7Ci0KLQlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgZG93bnN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKLQotCWlmICghZGF0YV9mcm9tX3VzZXIpIHsKLQkJcHJfZXJyKCIlcygpOiBVc2VyIGRhdGEgaXMgSU5WQUxJRC4gUmV0dXJuaW5nXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKLQotCWlmIChjb21tYW5kICE9IFNFVF9WSURFT19TVEQgJiYgY29tbWFuZCAhPSBTRVRfUElYRUxfRk9STUFUCi0JICAgJiYgY29tbWFuZCAhPSBFTkFCTEVfQ0lGX1JFU09MVVRJT04gJiYgY29tbWFuZCAhPSBSRUdfUkVBRAotCSAgICYmIGNvbW1hbmQgIT0gUkVHX1dSSVRFICYmIGNvbW1hbmQgIT0gTUVEVVNBX1JFQUQKLQkgICAmJiBjb21tYW5kICE9IE1FRFVTQV9XUklURSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFNFVF9WSURFT19TVEQ6Ci0JCWlmICghc3RyY21wKGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZSwgIlBBTCIpKQotCQkJZGV2LT50dm5vcm0gPSBWNEwyX1NURF9QQUxfQkc7Ci0JCWVsc2UKLQkJCWRldi0+dHZub3JtID0gVjRMMl9TVERfTlRTQ19NOwotCQltZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoZGV2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNFVF9QSVhFTF9GT1JNQVQ6Ci0JCXNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7Ci0JCXBpeF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwotCi0JCWlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7Ci0JCQlzZWxlY3RlZF9jaGFubmVsIC09IDQ7Ci0JCQlzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7Ci0JCX0KLQotCQlpZiAoc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKQotCQkJY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgc2VsZWN0ZWRfY2hhbm5lbCwKLQkJCQkJCXBpeF9mb3JtYXQpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBFTkFCTEVfQ0lGX1JFU09MVVRJT046Ci0JCXNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7Ci0JCWNpZl9lbmFibGUgPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3Jlc29sdXRpb25fZW5hYmxlOwotCQljaWZfd2lkdGggPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3dpZHRoOwotCi0JCWlmIChjaWZfZW5hYmxlKSB7Ci0JCQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcKLQkJCSAgICB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykgewotCQkJCXdpZHRoID0gMzUyOwotCQkJfSBlbHNlIHsKLQkJCQl3aWR0aCA9IGNpZl93aWR0aDsKLQkJCQlpZiAoY2lmX3dpZHRoICE9IDMyMCAmJiBjaWZfd2lkdGggIT0gMzUyKQotCQkJCQl3aWR0aCA9IDMyMDsKLQkJCX0KLQkJfQotCi0JCWlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7Ci0JCQlzZWxlY3RlZF9jaGFubmVsIC09IDQ7Ci0JCQlzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7Ci0JCX0KLQotCQlpZiAoc2VsZWN0ZWRfY2hhbm5lbCA8PSA3ICYmIHNlbGVjdGVkX2NoYW5uZWwgPj0gMCkgewotCQkJZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS4KLQkJCQl1c2VfY2lmX3Jlc29sdXRpb24gPSBjaWZfZW5hYmxlOwotCQkJZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS5jaWZfd2lkdGggPSB3aWR0aDsKLQkJfSBlbHNlIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBWSURfQ0hBTk5FTF9OVU07IGkrKykgewotCQkJCWRldi0+Y2hhbm5lbHNbaV0udXNlX2NpZl9yZXNvbHV0aW9uID0KLQkJCQkJY2lmX2VuYWJsZTsKLQkJCQlkZXYtPmNoYW5uZWxzW2ldLmNpZl93aWR0aCA9IHdpZHRoOwotCQkJfQotCQl9Ci0KLQkJbWVkdXNhX3NldF9yZXNvbHV0aW9uKGRldiwgd2lkdGgsIHNlbGVjdGVkX2NoYW5uZWwpOwotCQlicmVhazsKLQljYXNlIFJFR19SRUFEOgotCQlkYXRhX2Zyb21fdXNlci0+cmVnX2RhdGEgPSBjeF9yZWFkKGRhdGFfZnJvbV91c2VyLT5yZWdfYWRkcmVzcyk7Ci0JCWJyZWFrOwotCWNhc2UgUkVHX1dSSVRFOgotCQljeF93cml0ZShkYXRhX2Zyb21fdXNlci0+cmVnX2FkZHJlc3MsIGRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgTUVEVVNBX1JFQUQ6Ci0JCXZhbHVlID0gY3gyNTgyMV9pMmNfcmVhZCgmZGV2LT5pMmNfYnVzWzBdLAotCQkJCQkgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAotCQkJCQkgJmRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgTUVEVVNBX1dSSVRFOgotCQljeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLAotCQkJCSAgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAotCQkJCSAgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGN4MjU4MjFfdmlkZW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50ICByZXQgPSAwOwotCi0Jc3RydWN0IGN4MjU4MjFfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQkvKiBjaGVjayB0byBzZWUgaWYgaXQncyB0aGUgdmlkZW8gdXBzdHJlYW0gKi8KLQlpZiAoZmgtPmNoYW5uZWxfaWQgPT0gU1JBTV9DSDA5KSB7Ci0JCXJldCA9IHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShmaWxlLCBjbWQsIGFyZyk7Ci0JCXJldHVybiByZXQ7Ci0JfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTApIHsKLQkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMChmaWxlLCBjbWQsIGFyZyk7Ci0JCXJldHVybiByZXQ7Ci0JfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTEpIHsKLQkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMShmaWxlLCBjbWQsIGFyZyk7Ci0JCXJldCA9IHZpZGVvX2lvY3RsX3NldChmaWxlLCBjbWQsIGFyZyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIHZpZGVvX2lvY3RsMihmaWxlLCBjbWQsIGFyZyk7Ci19Ci0KLS8qIGV4cG9ydGVkIHN0dWZmICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSB2aWRlb19vcGVuLAotCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKLQkucmVhZCA9IHZpZGVvX3JlYWQsCi0JLnBvbGwgPSB2aWRlb19wb2xsLAotCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAotCS5pb2N0bCA9IGN4MjU4MjFfdmlkZW9faW9jdGwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCi0JLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKLSNlbmRpZgotCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCi0JLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCi0JLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCi0JLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAotCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAotCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCi0JLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAotCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKLQkudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9pb2N0bF90ZW1wbGF0ZSA9IHsKLQkubmFtZSA9ICJjeDI1ODIxLXZpZGVvaW9jdGwiLAotCS5mb3BzID0gJnZpZGVvX2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAotCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS5oIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI2MTViLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vKgotICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjU4MjEgUENJZSBicmlkZ2UKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5IENvbmV4YW50IFN5c3RlbXMgSW5jLgotICogIEF1dGhvcnMgIDxzaHUubGluQGNvbmV4YW50LmNvbT4sIDxoaWVwLmh1eW5oQGNvbmV4YW50LmNvbT4KLSAqICBCYXNlZCBvbiBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+IGN4MjM4ODUgZHJpdmVyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2lmbmRlZiBDWDI1ODIxX0hfCi0jZGVmaW5lIENYMjU4MjFfSF8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgotI2luY2x1ZGUgPG1lZGlhL3R2ZWVwcm9tLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLXNnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZHZiLmg+Ci0KLSNpbmNsdWRlICJidGN4LXJpc2MuaCIKLSNpbmNsdWRlICJjeDI1ODIxLXJlZy5oIgotI2luY2x1ZGUgImN4MjU4MjEtbWVkdXNhLXJlZy5oIgotI2luY2x1ZGUgImN4MjU4MjEtc3JhbS5oIgotI2luY2x1ZGUgImN4MjU4MjEtYXVkaW8uaCIKLSNpbmNsdWRlICJtZWRpYS9jeDIzNDF4LmgiCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotI2RlZmluZSBDWDI1ODIxX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCAxMDYpCi0KLSNkZWZpbmUgVU5TRVQgKC0xVSkKLSNkZWZpbmUgTk9fU1lOQ19MSU5FICgtMVUpCi0KLSNkZWZpbmUgQ1gyNTgyMV9NQVhCT0FSRFMgMgotCi0jZGVmaW5lIFRSVUUgICAgMQotI2RlZmluZSBGQUxTRSAgIDAKLSNkZWZpbmUgTElORV9TSVpFX0QxICAgIDE0NDAKLQotLyogTnVtYmVyIG9mIGRlY29kZXJzIGFuZCBlbmNvZGVycyAqLwotI2RlZmluZSBNQVhfREVDT0RFUlMgICAgICAgICAgICA4Ci0jZGVmaW5lIE1BWF9FTkNPREVSUyAgICAgICAgICAgIDIKLSNkZWZpbmUgUVVBRF9ERUNPREVSUyAgICAgICAgICAgNAotI2RlZmluZSBNQVhfQ0FNRVJBUyAgICAgICAgICAgICAxNgotCi0vKiBNYXggbnVtYmVyIG9mIGlucHV0cyBieSBjYXJkICovCi0jZGVmaW5lIE1BWF9DWDI1ODIxX0lOUFVUIDgKLSNkZWZpbmUgSU5QVVQobnIpICgmY3gyNTgyMV9ib2FyZHNbZGV2LT5ib2FyZF0uaW5wdXRbbnJdKQotI2RlZmluZSBSRVNPVVJDRV9WSURFTzAgICAgICAgMQotI2RlZmluZSBSRVNPVVJDRV9WSURFTzEgICAgICAgMgotI2RlZmluZSBSRVNPVVJDRV9WSURFTzIgICAgICAgNAotI2RlZmluZSBSRVNPVVJDRV9WSURFTzMgICAgICAgOAotI2RlZmluZSBSRVNPVVJDRV9WSURFTzQgICAgICAgMTYKLSNkZWZpbmUgUkVTT1VSQ0VfVklERU81ICAgICAgIDMyCi0jZGVmaW5lIFJFU09VUkNFX1ZJREVPNiAgICAgICA2NAotI2RlZmluZSBSRVNPVVJDRV9WSURFTzcgICAgICAgMTI4Ci0jZGVmaW5lIFJFU09VUkNFX1ZJREVPOCAgICAgICAyNTYKLSNkZWZpbmUgUkVTT1VSQ0VfVklERU85ICAgICAgIDUxMgotI2RlZmluZSBSRVNPVVJDRV9WSURFTzEwICAgICAgMTAyNAotI2RlZmluZSBSRVNPVVJDRV9WSURFTzExICAgICAgMjA0OAotI2RlZmluZSBSRVNPVVJDRV9WSURFT19JT0NUTCAgNDA5NgotCi0jZGVmaW5lIEJVRkZFUl9USU1FT1VUICAgICAoSFopCS8qIDAuNSBzZWNvbmRzICovCi0KLSNkZWZpbmUgVU5LTk9XTl9CT0FSRCAgICAgICAwCi0jZGVmaW5lIENYMjU4MjFfQk9BUkQgICAgICAgIDEKLQotLyogQ3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCi0jZGVmaW5lIENYMjU4MjFfTk9STVMgKFwKLQlWNEwyX1NURF9OVFNDX00gfCAgVjRMMl9TVERfTlRTQ19NX0pQIHwgVjRMMl9TVERfTlRTQ19NX0tSIHwgXAotCVY0TDJfU1REX1BBTF9CRyB8ICBWNEwyX1NURF9QQUxfREsgICAgfCAgVjRMMl9TVERfUEFMX0kgICAgfCBcCi0JVjRMMl9TVERfUEFMX00gIHwgIFY0TDJfU1REX1BBTF9OICAgICB8ICBWNEwyX1NURF9QQUxfSCAgICB8IFwKLQlWNEwyX1NURF9QQUxfTmMpCi0KLSNkZWZpbmUgQ1gyNTgyMV9CT0FSRF9DT05FWEFOVF9BVEhFTkExMCAxCi0jZGVmaW5lIE1BWF9WSURfQ0hBTk5FTF9OVU0gICAgIDEyCi0jZGVmaW5lIFZJRF9DSEFOTkVMX05VTSA4Ci0KLXN0cnVjdCBjeDI1ODIxX2ZtdCB7Ci0JY2hhciAqbmFtZTsKLQl1MzIgZm91cmNjOwkJLyogdjRsMiBmb3JtYXQgaWQgKi8KLQlpbnQgZGVwdGg7Ci0JaW50IGZsYWdzOwotCXUzMiBjeGZvcm1hdDsKLX07Ci0KLXN0cnVjdCBjeDI1ODIxX2N0cmwgewotCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB2OwotCXUzMiBvZmY7Ci0JdTMyIHJlZzsKLQl1MzIgbWFzazsKLQl1MzIgc2hpZnQ7Ci19OwotCi1zdHJ1Y3QgY3gyNTgyMV90dm5vcm0gewotCWNoYXIgKm5hbWU7Ci0JdjRsMl9zdGRfaWQgaWQ7Ci0JdTMyIGN4aWZvcm1hdDsKLQl1MzIgY3hvZm9ybWF0OwotfTsKLQotc3RydWN0IGN4MjU4MjFfZmggewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2OwotCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlOwotCWludCByYWRpbzsKLQl1MzIgcmVzb3VyY2VzOwotCi0JZW51bSB2NGwyX3ByaW9yaXR5IHByaW87Ci0KLQkvKiB2aWRlbyBvdmVybGF5ICovCi0Jc3RydWN0IHY0bDJfd2luZG93IHdpbjsKLQlzdHJ1Y3QgdjRsMl9jbGlwICpjbGlwczsKLQl1bnNpZ25lZCBpbnQgbmNsaXBzOwotCi0JLyogdmlkZW8gY2FwdHVyZSAqLwotCXN0cnVjdCBjeDI1ODIxX2ZtdCAqZm10OwotCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OwotCWludCBjaGFubmVsX2lkOwotCi0JLyogdmJpIGNhcHR1cmUgKi8KLQlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgdmlkcTsKLQlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgdmJpcTsKLQotCS8qIEgyNjQgRW5jb2RlciBzcGVjaWZpY3MgT05MWSAqLwotCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSBtcGVncTsKLQlhdG9taWNfdCB2NGxfcmVhZGluZzsKLX07Ci0KLWVudW0gY3gyNTgyMV9pdHlwZSB7Ci0JQ1gyNTgyMV9WTVVYX0NPTVBPU0lURSA9IDEsCi0JQ1gyNTgyMV9WTVVYX1NWSURFTywKLQlDWDI1ODIxX1ZNVVhfREVCVUcsCi0JQ1gyNTgyMV9SQURJTywKLX07Ci0KLWVudW0gY3gyNTgyMV9zcmNfc2VsX3R5cGUgewotCUNYMjU4MjFfU1JDX1NFTF9FWFRfNjU2X1ZJREVPID0gMCwKLQlDWDI1ODIxX1NSQ19TRUxfUEFSQUxMRUxfTVBFR19WSURFTwotfTsKLQotLyogYnVmZmVyIGZvciBvbmUgdmlkZW8gZnJhbWUgKi8KLXN0cnVjdCBjeDI1ODIxX2J1ZmZlciB7Ci0JLyogY29tbW9uIHY0bCBidWZmZXIgc3R1ZmYgLS0gbXVzdCBiZSBmaXJzdCAqLwotCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgdmI7Ci0KLQkvKiBjeDI1ODIxIHNwZWNpZmljICovCi0JdW5zaWduZWQgaW50IGJwbDsKLQlzdHJ1Y3QgYnRjeF9yaXNjbWVtIHJpc2M7Ci0Jc3RydWN0IGN4MjU4MjFfZm10ICpmbXQ7Ci0JdTMyIGNvdW50OwotfTsKLQotc3RydWN0IGN4MjU4MjFfaW5wdXQgewotCWVudW0gY3gyNTgyMV9pdHlwZSB0eXBlOwotCXVuc2lnbmVkIGludCB2bXV4OwotCXUzMiBncGlvMCwgZ3BpbzEsIGdwaW8yLCBncGlvMzsKLX07Ci0KLWVudW0gcG9ydCB7Ci0JQ1gyNTgyMV9VTkRFRklORUQgPSAwLAotCUNYMjU4MjFfUkFXLAotCUNYMjU4MjFfMjY0Ci19OwotCi1zdHJ1Y3QgY3gyNTgyMV9ib2FyZCB7Ci0JY2hhciAqbmFtZTsKLQllbnVtIHBvcnQgcG9ydGE7Ci0JZW51bSBwb3J0IHBvcnRiOwotCWVudW0gcG9ydCBwb3J0YzsKLQl1bnNpZ25lZCBpbnQgdHVuZXJfdHlwZTsKLQl1bnNpZ25lZCBpbnQgcmFkaW9fdHlwZTsKLQl1bnNpZ25lZCBjaGFyIHR1bmVyX2FkZHI7Ci0JdW5zaWduZWQgY2hhciByYWRpb19hZGRyOwotCi0JdTMyIGNsa19mcmVxOwotCXN0cnVjdCBjeDI1ODIxX2lucHV0IGlucHV0WzJdOwotfTsKLQotc3RydWN0IGN4MjU4MjFfc3ViaWQgewotCXUxNiBzdWJ2ZW5kb3I7Ci0JdTE2IHN1YmRldmljZTsKLQl1MzIgY2FyZDsKLX07Ci0KLXN0cnVjdCBjeDI1ODIxX2kyYyB7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXY7Ci0KLQlpbnQgbnI7Ci0KLQkvKiBpMmMgaS9vICovCi0Jc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwOwotCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBpMmNfYWxnbzsKLQlzdHJ1Y3QgaTJjX2NsaWVudCBpMmNfY2xpZW50OwotCXUzMiBpMmNfcmM7Ci0KLQkvKiBjeDI1ODIxIHJlZ2lzdGVycyB1c2VkIGZvciByYXcgYWRkZXNzICovCi0JdTMyIGkyY19wZXJpb2Q7Ci0JdTMyIHJlZ19jdHJsOwotCXUzMiByZWdfc3RhdDsKLQl1MzIgcmVnX2FkZHI7Ci0JdTMyIHJlZ19yZGF0YTsKLQl1MzIgcmVnX3dkYXRhOwotfTsKLQotc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgewotCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlOwotCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVkOwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7Ci0Jc3RydWN0IGJ0Y3hfcmlzY21lbSBzdG9wcGVyOwotCXUzMiBjb3VudDsKLX07Ci0KLXN0cnVjdCBjeDI1ODIxX2RhdGEgewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2OwotCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgY3gyNTgyMV9jaGFubmVsIHsKLQlzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlIHByaW87Ci0KLQlpbnQgY3RsX2JyaWdodDsKLQlpbnQgY3RsX2NvbnRyYXN0OwotCWludCBjdGxfaHVlOwotCWludCBjdGxfc2F0dXJhdGlvbjsKLQlzdHJ1Y3QgY3gyNTgyMV9kYXRhIHRpbWVvdXRfZGF0YTsKLQotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvX2RldjsKLQlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSB2aWRxOwotCi0Jc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaGFubmVsczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCWludCByZXNvdXJjZXM7Ci0KLQlpbnQgcGl4ZWxfZm9ybWF0czsKLQlpbnQgdXNlX2NpZl9yZXNvbHV0aW9uOwotCWludCBjaWZfd2lkdGg7Ci19OwotCi1zdHJ1Y3QgY3gyNTgyMV9kZXYgewotCXN0cnVjdCBsaXN0X2hlYWQgZGV2bGlzdDsKLQlhdG9taWNfdCByZWZjb3VudDsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7Ci0KLQkvKiBwY2kgc3R1ZmYgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqcGNpOwotCXVuc2lnbmVkIGNoYXIgcGNpX3JldiwgcGNpX2xhdDsKLQlpbnQgcGNpX2J1cywgcGNpX3Nsb3Q7Ci0JdTMyIGJhc2VfaW9fYWRkcjsKLQl1MzIgX19pb21lbSAqbG1taW87Ci0JdTggX19pb21lbSAqYm1taW87Ci0JaW50IHBjaV9pcnFtYXNrOwotCWludCBod3JldmlzaW9uOwotCi0JdTMyIGNsa19mcmVxOwotCi0JLyogSTJDIGFkYXB0ZXJzOiBNYXN0ZXIgMSAmIDIgKEV4dGVybmFsKSAmIE1hc3RlciAzIChJbnRlcm5hbCBvbmx5KSAqLwotCXN0cnVjdCBjeDI1ODIxX2kyYyBpMmNfYnVzWzNdOwotCi0JaW50IG5yOwotCXN0cnVjdCBtdXRleCBsb2NrOwotCi0Jc3RydWN0IGN4MjU4MjFfY2hhbm5lbCBjaGFubmVsc1tNQVhfVklEX0NIQU5ORUxfTlVNXTsKLQotCS8qIGJvYXJkIGRldGFpbHMgKi8KLQl1bnNpZ25lZCBpbnQgYm9hcmQ7Ci0JY2hhciBuYW1lWzMyXTsKLQotCS8qIEFuYWxvZyB2aWRlbyAqLwotCXUzMiByZXNvdXJjZXM7Ci0JdW5zaWduZWQgaW50IGlucHV0OwotCXUzMiB0dmF1ZGlvOwotCXY0bDJfc3RkX2lkIHR2bm9ybTsKLQl1bnNpZ25lZCBpbnQgdHVuZXJfdHlwZTsKLQl1bnNpZ25lZCBjaGFyIHR1bmVyX2FkZHI7Ci0JdW5zaWduZWQgaW50IHJhZGlvX3R5cGU7Ci0JdW5zaWduZWQgY2hhciByYWRpb19hZGRyOwotCXVuc2lnbmVkIGludCBoYXNfcmFkaW87Ci0JdW5zaWduZWQgaW50IHZpZGVjX3R5cGU7Ci0JdW5zaWduZWQgY2hhciB2aWRlY19hZGRyOwotCXVuc2lnbmVkIHNob3J0IF9tYXhfbnVtX2RlY29kZXJzOwotCi0JLyogQW5hbG9nIEF1ZGlvIFVwc3RyZWFtICovCi0JaW50IF9hdWRpb19pc19ydW5uaW5nOwotCWludCBfYXVkaW9waXhlbF9mb3JtYXQ7Ci0JaW50IF9pc19maXJzdF9hdWRpb19mcmFtZTsKLQlpbnQgX2F1ZGlvZmlsZV9zdGF0dXM7Ci0JaW50IF9hdWRpb19saW5lc19jb3VudDsKLQlpbnQgX2F1ZGlvZnJhbWVfY291bnQ7Ci0JaW50IF9hdWRpb191cHN0cmVhbV9jaGFubmVsOwotCWludCBfbGFzdF9pbmRleF9pcnE7ICAgIC8qIFRoZSBsYXN0IGludGVycnVwdCBpbmRleCBwcm9jZXNzZWQuICovCi0KLQlfX2xlMzIgKl9yaXNjX2F1ZGlvX2ptcF9hZGRyOwotCV9fbGUzMiAqX3Jpc2NfdmlydF9zdGFydF9hZGRyOwotCV9fbGUzMiAqX3Jpc2NfdmlydF9hZGRyOwotCWRtYV9hZGRyX3QgX3Jpc2NfcGh5c19hZGRyOwotCWRtYV9hZGRyX3QgX3Jpc2NfcGh5c19zdGFydF9hZGRyOwotCi0JdW5zaWduZWQgaW50IF9hdWRpb3Jpc2Nfc2l6ZTsKLQl1bnNpZ25lZCBpbnQgX2F1ZGlvZGF0YV9idWZfc2l6ZTsKLQlfX2xlMzIgKl9hdWRpb2RhdGFfYnVmX3ZpcnRfYWRkcjsKLQlkbWFfYWRkcl90IF9hdWRpb2RhdGFfYnVmX3BoeXNfYWRkcjsKLQljaGFyICpfYXVkaW9maWxlbmFtZTsKLQotCS8qIFY0bCAqLwotCXUzMiBmcmVxOwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZiaV9kZXY7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqcmFkaW9fZGV2OwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmlvY3RsX2RldjsKLQotCXNwaW5sb2NrX3Qgc2xvY2s7Ci0KLQkvKiBWaWRlbyBVcHN0cmVhbSAqLwotCWludCBfbGluZV9zaXplOwotCWludCBfcHJvZ19jbnQ7Ci0JaW50IF9waXhlbF9mb3JtYXQ7Ci0JaW50IF9pc19maXJzdF9mcmFtZTsKLQlpbnQgX2lzX3J1bm5pbmc7Ci0JaW50IF9maWxlX3N0YXR1czsKLQlpbnQgX2xpbmVzX2NvdW50OwotCWludCBfZnJhbWVfY291bnQ7Ci0JaW50IF9jaGFubmVsX3Vwc3RyZWFtX3NlbGVjdDsKLQl1bnNpZ25lZCBpbnQgX3Jpc2Nfc2l6ZTsKLQotCV9fbGUzMiAqX2RtYV92aXJ0X3N0YXJ0X2FkZHI7Ci0JX19sZTMyICpfZG1hX3ZpcnRfYWRkcjsKLQlkbWFfYWRkcl90IF9kbWFfcGh5c19hZGRyOwotCWRtYV9hZGRyX3QgX2RtYV9waHlzX3N0YXJ0X2FkZHI7Ci0KLQl1bnNpZ25lZCBpbnQgX2RhdGFfYnVmX3NpemU7Ci0JX19sZTMyICpfZGF0YV9idWZfdmlydF9hZGRyOwotCWRtYV9hZGRyX3QgX2RhdGFfYnVmX3BoeXNfYWRkcjsKLQljaGFyICpfZmlsZW5hbWU7Ci0JY2hhciAqX2RlZmF1bHRuYW1lOwotCi0JaW50IF9saW5lX3NpemVfY2gyOwotCWludCBfcHJvZ19jbnRfY2gyOwotCWludCBfcGl4ZWxfZm9ybWF0X2NoMjsKLQlpbnQgX2lzX2ZpcnN0X2ZyYW1lX2NoMjsKLQlpbnQgX2lzX3J1bm5pbmdfY2gyOwotCWludCBfZmlsZV9zdGF0dXNfY2gyOwotCWludCBfbGluZXNfY291bnRfY2gyOwotCWludCBfZnJhbWVfY291bnRfY2gyOwotCWludCBfY2hhbm5lbDJfdXBzdHJlYW1fc2VsZWN0OwotCXVuc2lnbmVkIGludCBfcmlzY19zaXplX2NoMjsKLQotCV9fbGUzMiAqX2RtYV92aXJ0X3N0YXJ0X2FkZHJfY2gyOwotCV9fbGUzMiAqX2RtYV92aXJ0X2FkZHJfY2gyOwotCWRtYV9hZGRyX3QgX2RtYV9waHlzX2FkZHJfY2gyOwotCWRtYV9hZGRyX3QgX2RtYV9waHlzX3N0YXJ0X2FkZHJfY2gyOwotCi0JdW5zaWduZWQgaW50IF9kYXRhX2J1Zl9zaXplX2NoMjsKLQlfX2xlMzIgKl9kYXRhX2J1Zl92aXJ0X2FkZHJfY2gyOwotCWRtYV9hZGRyX3QgX2RhdGFfYnVmX3BoeXNfYWRkcl9jaDI7Ci0JY2hhciAqX2ZpbGVuYW1lX2NoMjsKLQljaGFyICpfZGVmYXVsdG5hbWVfY2gyOwotCi0JLyogTVBFRyBFbmNvZGVyIE9OTFkgc2V0dGluZ3MgKi8KLQl1MzIgY3gyMzQxN19tYWlsYm94OwotCXN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zIG1wZWdfcGFyYW1zOwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnY0bF9kZXZpY2U7Ci0JYXRvbWljX3QgdjRsX3JlYWRlcl9jb3VudDsKLQlzdHJ1Y3QgY3gyNTgyMV90dm5vcm0gZW5jb2Rlcm5vcm07Ci0KLQl1MzIgdXBzdHJlYW1fcmlzY2J1Zl9zaXplOwotCXUzMiB1cHN0cmVhbV9kYXRhYnVmX3NpemU7Ci0JdTMyIHVwc3RyZWFtX3Jpc2NidWZfc2l6ZV9jaDI7Ci0JdTMyIHVwc3RyZWFtX2RhdGFidWZfc2l6ZV9jaDI7Ci0JdTMyIGF1ZGlvX3Vwc3RyZWFtX3Jpc2NidWZfc2l6ZTsKLQl1MzIgYXVkaW9fdXBzdHJlYW1fZGF0YWJ1Zl9zaXplOwotCWludCBfaXNOVFNDOwotCWludCBfZnJhbWVfaW5kZXg7Ci0JaW50IF9hdWRpb2ZyYW1lX2luZGV4OwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpfaXJxX3F1ZXVlczsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgX2lycV93b3JrX2VudHJ5OwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpfaXJxX3F1ZXVlc19jaDI7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IF9pcnFfd29ya19lbnRyeV9jaDI7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9pcnFfYXVkaW9fcXVldWVzOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBfYXVkaW9fd29ya19lbnRyeTsKLQljaGFyICppbnB1dF9maWxlbmFtZTsKLQljaGFyICppbnB1dF9maWxlbmFtZV9jaDI7Ci0JaW50IF9mcmFtZV9pbmRleF9jaDI7Ci0JaW50IF9pc05UU0NfY2gyOwotCWNoYXIgKnZpZF9zdGRuYW1lX2NoMjsKLQlpbnQgcGl4ZWxfZm9ybWF0X2NoMjsKLQlpbnQgY2hhbm5lbF9zZWxlY3RfY2gyOwotCWludCBjb21tYW5kX2NoMjsKLQljaGFyICppbnB1dF9hdWRpb2ZpbGVuYW1lOwotCWNoYXIgKnZpZF9zdGRuYW1lOwotCWludCBwaXhlbF9mb3JtYXQ7Ci0JaW50IGNoYW5uZWxfc2VsZWN0OwotCWludCBjb21tYW5kOwotCWludCBjaGFubmVsX29wZW5lZDsKLX07Ci0KLXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCB7Ci0JY2hhciAqaW5wdXRfZmlsZW5hbWU7Ci0JY2hhciAqdmlkX3N0ZG5hbWU7Ci0JaW50IHBpeGVsX2Zvcm1hdDsKLQlpbnQgY2hhbm5lbF9zZWxlY3Q7Ci0JaW50IGNvbW1hbmQ7Ci19OwotCi1zdHJ1Y3QgZG93bnN0cmVhbV91c2VyX3N0cnVjdCB7Ci0JY2hhciAqdmlkX3N0ZG5hbWU7Ci0JaW50IHBpeGVsX2Zvcm1hdDsKLQlpbnQgY2lmX3Jlc29sdXRpb25fZW5hYmxlOwotCWludCBjaWZfd2lkdGg7Ci0JaW50IGRlY29kZXJfc2VsZWN0OwotCWludCBjb21tYW5kOwotCWludCByZWdfYWRkcmVzczsKLQlpbnQgcmVnX2RhdGE7Ci19OwotCi1leHRlcm4gc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICp1cF9kYXRhOwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjeDI1ODIxX2RldiAqZ2V0X2N4MjU4MjEoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKHY0bDJfZGV2LCBzdHJ1Y3QgY3gyNTgyMV9kZXYsIHY0bDJfZGV2KTsKLX0KLQotI2RlZmluZSBjeDI1ODIxX2NhbGxfYWxsKGRldiwgbywgZiwgYXJncy4uLikgXAotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBvLCBmLCAjI2FyZ3MpCi0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGN4MjU4MjFfZGV2bGlzdDsKLWV4dGVybiBzdHJ1Y3QgbXV0ZXggY3gyNTgyMV9kZXZsaXN0X211dGV4OwotCi1leHRlcm4gc3RydWN0IGN4MjU4MjFfYm9hcmQgY3gyNTgyMV9ib2FyZHNbXTsKLWV4dGVybiBzdHJ1Y3QgY3gyNTgyMV9zdWJpZCBjeDI1ODIxX3N1Ymlkc1tdOwotCi0jZGVmaW5lIFNSQU1fQ0gwMCAgMAkJLyogVmlkZW8gQSAqLwotI2RlZmluZSBTUkFNX0NIMDEgIDEJCS8qIFZpZGVvIEIgKi8KLSNkZWZpbmUgU1JBTV9DSDAyICAyCQkvKiBWaWRlbyBDICovCi0jZGVmaW5lIFNSQU1fQ0gwMyAgMwkJLyogVmlkZW8gRCAqLwotI2RlZmluZSBTUkFNX0NIMDQgIDQJCS8qIFZpZGVvIEUgKi8KLSNkZWZpbmUgU1JBTV9DSDA1ICA1CQkvKiBWaWRlbyBGICovCi0jZGVmaW5lIFNSQU1fQ0gwNiAgNgkJLyogVmlkZW8gRyAqLwotI2RlZmluZSBTUkFNX0NIMDcgIDcJCS8qIFZpZGVvIEggKi8KLQotI2RlZmluZSBTUkFNX0NIMDggIDgJCS8qIEF1ZGlvIEEgKi8KLSNkZWZpbmUgU1JBTV9DSDA5ICA5CQkvKiBWaWRlbyBVcHN0cmVhbSBJICovCi0jZGVmaW5lIFNSQU1fQ0gxMCAgMTAJCS8qIFZpZGVvIFVwc3RyZWFtIEogKi8KLSNkZWZpbmUgU1JBTV9DSDExICAxMQkJLyogQXVkaW8gVXBzdHJlYW0gQVVEX0NIQU5ORUxfQiAqLwotCi0jZGVmaW5lIFZJRF9VUFNUUkVBTV9TUkFNX0NIQU5ORUxfSSAgICAgU1JBTV9DSDA5Ci0jZGVmaW5lIFZJRF9VUFNUUkVBTV9TUkFNX0NIQU5ORUxfSiAgICAgU1JBTV9DSDEwCi0jZGVmaW5lIEFVRElPX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9CICAgU1JBTV9DSDExCi0jZGVmaW5lIFZJREVPX0lPQ1RMX0NIICAxMQotCi1zdHJ1Y3Qgc3JhbV9jaGFubmVsIHsKLQljaGFyICpuYW1lOwotCXUzMiBpOwotCXUzMiBjbWRzX3N0YXJ0OwotCXUzMiBjdHJsX3N0YXJ0OwotCXUzMiBjZHQ7Ci0JdTMyIGZpZm9fc3RhcnQ7Ci0JdTMyIGZpZm9fc2l6ZTsKLQl1MzIgcHRyMV9yZWc7Ci0JdTMyIHB0cjJfcmVnOwotCXUzMiBjbnQxX3JlZzsKLQl1MzIgY250Ml9yZWc7Ci0JdTMyIGludF9tc2s7Ci0JdTMyIGludF9zdGF0OwotCXUzMiBpbnRfbXN0YXQ7Ci0JdTMyIGRtYV9jdGw7Ci0JdTMyIGdwY250X2N0bDsKLQl1MzIgZ3BjbnQ7Ci0JdTMyIGF1ZF9sZW5ndGg7Ci0JdTMyIGF1ZF9jZmc7Ci0JdTMyIGZsZF9hdWRfZmlmb19lbjsKLQl1MzIgZmxkX2F1ZF9yaXNjX2VuOwotCi0JLyogRm9yIFVwc3RyZWFtIFZpZGVvICovCi0JdTMyIHZpZF9mbXRfY3RsOwotCXUzMiB2aWRfYWN0aXZlX2N0bDE7Ci0JdTMyIHZpZF9hY3RpdmVfY3RsMjsKLQl1MzIgdmlkX2NkdF9zaXplOwotCi0JdTMyIHZpcF9jdGw7Ci0JdTMyIHBpeF9mcm10OwotCXUzMiBqdW1wb25seTsKLQl1MzIgaXJxX2JpdDsKLX07Ci1leHRlcm4gc3RydWN0IHNyYW1fY2hhbm5lbCBjeDI1ODIxX3NyYW1fY2hhbm5lbHNbXTsKLQotI2RlZmluZSBTVEFUVVNfU1VDQ0VTUyAgICAgICAgIDAKLSNkZWZpbmUgU1RBVFVTX1VOU1VDQ0VTU0ZVTCAgICAtMQotCi0jZGVmaW5lIGN4X3JlYWQocmVnKSAgICAgICAgICAgICByZWFkbChkZXYtPmxtbWlvICsgKChyZWcpPj4yKSkKLSNkZWZpbmUgY3hfd3JpdGUocmVnLCB2YWx1ZSkgICAgIHdyaXRlbCgodmFsdWUpLCBkZXYtPmxtbWlvICsgKChyZWcpPj4yKSkKLQotI2RlZmluZSBjeF9hbmRvcihyZWcsIG1hc2ssIHZhbHVlKSBcCi0Jd3JpdGVsKChyZWFkbChkZXYtPmxtbWlvKygocmVnKT4+MikpICYgfihtYXNrKSkgfFwKLQkoKHZhbHVlKSAmIChtYXNrKSksIGRldi0+bG1taW8rKChyZWcpPj4yKSkKLQotI2RlZmluZSBjeF9zZXQocmVnLCBiaXQpICAgICAgICAgIGN4X2FuZG9yKChyZWcpLCAoYml0KSwgKGJpdCkpCi0jZGVmaW5lIGN4X2NsZWFyKHJlZywgYml0KSAgICAgICAgY3hfYW5kb3IoKHJlZyksIChiaXQpLCAwKQotCi0jZGVmaW5lIFNldF9HUElPX0JpdChCaXQpICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBCaXQpCi0jZGVmaW5lIENsZWFyX0dQSU9fQml0KEJpdCkgICAgICAgICAgICAgICAgICAgICAofigxIDw8IEJpdCkpCi0KLSNkZWZpbmUgQ1gyNTgyMV9FUlIoZm10LCBhcmdzLi4uKQkJCVwKLQlwcl9lcnIoIiglZCk6ICIgZm10LCBkZXYtPmJvYXJkLCAjI2FyZ3MpCi0jZGVmaW5lIENYMjU4MjFfV0FSTihmbXQsIGFyZ3MuLi4pCQkJXAotCXByX3dhcm4oIiglZCk6ICIgZm10LCBkZXYtPmJvYXJkLCAjI2FyZ3MpCi0jZGVmaW5lIENYMjU4MjFfSU5GTyhmbXQsIGFyZ3MuLi4pCQkJXAotCXByX2luZm8oIiglZCk6ICIgZm10LCBkZXYtPmJvYXJkLCAjI2FyZ3MpCi0KLWV4dGVybiBpbnQgY3gyNTgyMV9pMmNfcmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfaTJjICpidXMpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9jYXJkX3NldHVwKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKLWV4dGVybiBpbnQgY3gyNTgyMV9pcl9pbml0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKLWV4dGVybiBpbnQgY3gyNTgyMV9pMmNfcmVhZChzdHJ1Y3QgY3gyNTgyMV9pMmMgKmJ1cywgdTE2IHJlZ19hZGRyLCBpbnQgKnZhbHVlKTsKLWV4dGVybiBpbnQgY3gyNTgyMV9pMmNfd3JpdGUoc3RydWN0IGN4MjU4MjFfaTJjICpidXMsIHUxNiByZWdfYWRkciwgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgY3gyNTgyMV9pMmNfdW5yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9pMmMgKmJ1cyk7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX2dwaW9faW5pdChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3NldF9ncGlvcGluX2RpcmVjdGlvbihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICBpbnQgcGluX251bWJlciwgaW50IHBpbl9sb2dpY192YWx1ZSk7Ci0KLWV4dGVybiBpbnQgbWVkdXNhX3ZpZGVvX2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIGludCBtZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgbWVkdXNhX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgd2lkdGgsCi0JCQkJICBpbnQgZGVjb2Rlcl9zZWxlY3QpOwotZXh0ZXJuIGludCBtZWR1c2Ffc2V0X2JyaWdodG5lc3Moc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBicmlnaHRuZXNzLAotCQkJCSBpbnQgZGVjb2Rlcik7Ci1leHRlcm4gaW50IG1lZHVzYV9zZXRfY29udHJhc3Qoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjb250cmFzdCwKLQkJCSAgICAgICBpbnQgZGVjb2Rlcik7Ci1leHRlcm4gaW50IG1lZHVzYV9zZXRfaHVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgaHVlLCBpbnQgZGVjb2Rlcik7Ci1leHRlcm4gaW50IG1lZHVzYV9zZXRfc2F0dXJhdGlvbihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IHNhdHVyYXRpb24sCi0JCQkJIGludCBkZWNvZGVyKTsKLQotZXh0ZXJuIGludCBjeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCwgdW5zaWduZWQgaW50IGJwbCwKLQkJCQkgICAgICB1MzIgcmlzYyk7Ci0KLWV4dGVybiBpbnQgY3gyNTgyMV9yaXNjX2J1ZmZlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAotCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCB0b3Bfb2Zmc2V0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBib3R0b21fb2Zmc2V0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBicGwsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHBhZGRpbmcsIHVuc2lnbmVkIGludCBsaW5lcyk7Ci1leHRlcm4gaW50IGN4MjU4MjFfcmlzY19kYXRhYnVmZmVyX2F1ZGlvKHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCQkJCSBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAotCQkJCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCi0JCQkJCSB1bnNpZ25lZCBpbnQgYnBsLAotCQkJCQkgdW5zaWduZWQgaW50IGxpbmVzLCB1bnNpZ25lZCBpbnQgbHBpKTsKLWV4dGVybiB2b2lkIGN4MjU4MjFfZnJlZV9idWZmZXIoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAotCQkJCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmKTsKLWV4dGVybiBpbnQgY3gyNTgyMV9yaXNjX3N0b3BwZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IGJ0Y3hfcmlzY21lbSAqcmlzYywKLQkJCQl1MzIgcmVnLCB1MzIgbWFzaywgdTMyIHZhbHVlKTsKLWV4dGVybiB2b2lkIGN4MjU4MjFfc3JhbV9jaGFubmVsX2R1bXAoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCi0JCQkJICAgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9zcmFtX2NoYW5uZWxfZHVtcF9hdWRpbyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoKTsKLQotZXh0ZXJuIHN0cnVjdCBjeDI1ODIxX2RldiAqY3gyNTgyMV9kZXZfZ2V0KHN0cnVjdCBwY2lfZGV2ICpwY2kpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9wcmludF9pcnFiaXRzKGNoYXIgKm5hbWUsIGNoYXIgKnRhZywgY2hhciAqKnN0cmluZ3MsCi0JCQkJICBpbnQgbGVuLCB1MzIgYml0cywgdTMyIG1hc2spOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7Ci1leHRlcm4gaW50IGN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJCQkgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gsCi0JCQkJCSAgICB1bnNpZ25lZCBpbnQgYnBsLCB1MzIgcmlzYyk7Ci0KLWV4dGVybiBpbnQgY3gyNTgyMV92aWR1cHN0cmVhbV9pbml0X2NoMShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJaW50IGNoYW5uZWxfc2VsZWN0LCBpbnQgcGl4ZWxfZm9ybWF0KTsKLWV4dGVybiBpbnQgY3gyNTgyMV92aWR1cHN0cmVhbV9pbml0X2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJaW50IGNoYW5uZWxfc2VsZWN0LCBpbnQgcGl4ZWxfZm9ybWF0KTsKLWV4dGVybiBpbnQgY3gyNTgyMV9hdWRpb191cHN0cmVhbV9pbml0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJCSAgICAgICBpbnQgY2hhbm5lbF9zZWxlY3QpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9mcmVlX21lbV91cHN0cmVhbV9jaDEoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9mcmVlX21lbV91cHN0cmVhbV9jaDIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9mcmVlX21lbV91cHN0cmVhbV9hdWRpbyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX3ZpZGVvX2NoMShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICAgICBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QKLQkJCQkJICAgICAqdXBfZGF0YSk7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX3ZpZGVvX2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICAgICBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QKLQkJCQkJICAgICAqdXBfZGF0YSk7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJCQkgc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICp1cF9kYXRhKTsKLWV4dGVybiB2b2lkIGN4MjU4MjFfc3RvcF91cHN0cmVhbV92aWRlb19jaDEoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3N0b3BfdXBzdHJlYW1fYXVkaW8oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIGludCBjeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cF91cHN0cmVhbShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICAgICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGJwbCwgdTMyIHJpc2MpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbm5lbCwKLQkJCQkgICAgIHUzMiBmb3JtYXQpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV92aWRlb2lvY3RsX3VucmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2UgKmN4MjU4MjFfdmRldl9pbml0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpLAotCQkJCQkgICAgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp0ZW1wbGF0ZSwKLQkJCQkJICAgICAgY2hhciAqdHlwZSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYwppbmRleCAyNGUwMDljLi45MTFjMGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5jIGIvZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9kdDMxNTV2NGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyMTJkYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgYnkgTWFyaW4gTWl0b3YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgbWl0b3ZAaXNzcC5iYXMuYmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+Ci0KLSNpbmNsdWRlICJkdDMxNTV2NGwuaCIKLQotI2RlZmluZSBEVDMxNTVfVkVORE9SX0lEIDB4ODA4NgotI2RlZmluZSBEVDMxNTVfREVWSUNFX0lEIDB4MTIyMwotCi0vKiBEVDMxNTVfQ0hVTktfU0laRSBpcyA0TSAoMl4yMikgOCBmdWxsIHNpemUgYnVmZmVycyAqLwotI2RlZmluZSBEVDMxNTVfQ0hVTktfU0laRSAoMVUgPDwgMjIpCi0KLSNkZWZpbmUgRFQzMTU1X0NPSF9GTEFHUyAoR0ZQX0tFUk5FTCB8IEdGUF9ETUEzMiB8IF9fR0ZQX0NPTEQgfCBfX0dGUF9OT1dBUk4pCi0KLSNkZWZpbmUgRFQzMTU1X0JVRl9TSVpFICg3NjggKiA1NzYpCi0KLSNpZmRlZiBDT05GSUdfRFQzMTU1X1NUUkVBTUlORwotI2RlZmluZSBEVDMxNTVfQ0FQVFVSRV9NRVRIT0QgVjRMMl9DQVBfU1RSRUFNSU5HCi0jZWxzZQotI2RlZmluZSBEVDMxNTVfQ0FQVFVSRV9NRVRIT0QgVjRMMl9DQVBfUkVBRFdSSVRFCi0jZW5kaWYKLQotLyogIGdsb2JhbCBpbml0aWFsaXplcnMgKGZvciBhbGwgYm9hcmRzKSAgKi8KLSNpZmRlZiBDT05GSUdfRFQzMTU1X0NDSVIKLXN0YXRpYyBjb25zdCB1OCBjc3IyX2luaXQgPSBWVF81MEhaOwotI2RlZmluZSBEVDMxNTVfQ1VSUkVOVF9OT1JNIFY0TDJfU1REXzYyNV81MAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbWdfd2lkdGggPSA3Njg7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltZ19oZWlnaHQgPSA1NzY7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGZyYW1lc19wZXJfc2VjID0gMjU7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZm10ZGVzYyBmcmFtZV9zdGRbXSA9IHsKLQl7Ci0JLmluZGV4ID0gMCwKLQkudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkuZmxhZ3MgPSAwLAotCS5kZXNjcmlwdGlvbiA9ICJDQ0lSLzUwSHogOCBiaXRzIGdyYXkiLAotCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9HUkVZLAotCX0sCi19OwotI2Vsc2UKLXN0YXRpYyBjb25zdCB1OCBjc3IyX2luaXQgPSBWVF82MEhaOwotI2RlZmluZSBEVDMxNTVfQ1VSUkVOVF9OT1JNIFY0TDJfU1REXzUyNV82MAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbWdfd2lkdGggPSA2NDA7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltZ19oZWlnaHQgPSA0ODA7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGZyYW1lc19wZXJfc2VjID0gMzA7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZm10ZGVzYyBmcmFtZV9zdGRbXSA9IHsKLQl7Ci0JLmluZGV4ID0gMCwKLQkudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkuZmxhZ3MgPSAwLAotCS5kZXNjcmlwdGlvbiA9ICJSUy0xNzAvNjBIeiA4IGJpdHMgZ3JheSIsCi0JLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVksCi0JfSwKLX07Ci0jZW5kaWYKLQotI2RlZmluZSBOVU1fT0ZfRk9STUFUUyBBUlJBWV9TSVpFKGZyYW1lX3N0ZCkKLQotc3RhdGljIHU4IGNvbmZpZ19pbml0ID0gQUNRX01PREVfRVZFTjsKLQotLyoqCi0gKiByZWFkX2kyY19yZWcgLSByZWFkcyBhbiBpbnRlcm5hbCBpMmMgcmVnaXN0ZXIKLSAqCi0gKiBAYWRkcjoJZHQzMTU1IG1taW8gYmFzZSBhZGRyZXNzCi0gKiBAaW5kZXg6CWluZGV4IChpbnRlcm5hbCBhZGRyZXNzKSBvZiByZWdpc3RlciB0byByZWFkCi0gKiBAZGF0YToJcG9pbnRlciB0byBieXRlIHRoZSByZWFkIGRhdGEgd2lsbCBiZSBwbGFjZWQgaW4KLSAqCi0gKiByZXR1cm5zOgl6ZXJvIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHJlYWRpbmcgdGhlIHNwZWNpZmllZCAoYnkgaW5kZXgpIHJlZ2lzdGVyCi0gKiBhbmQgYnVzeSB3YWl0cyBmb3IgdGhlIHByb2Nlc3MgdG8gZmluaXNoLiBUaGUgcmVzdWx0IGlzIHBsYWNlZAotICogaW4gYSBieXRlIHBvaW50ZWQgYnkgZGF0YS4KLSAqLwotc3RhdGljIGludAotcmVhZF9pMmNfcmVnKHZvaWQgX19pb21lbSAqYWRkciwgdTggaW5kZXgsIHU4ICpkYXRhKQotewotCXUzMiB0bXAgPSBpbmRleDsKLQotCWlvd3JpdGUzMigodG1wPDwxNykgfCBJSUNfUkVBRCwgYWRkciArIElJQ19DU1IyKTsKLQltbWlvd2IoKTsKLQl1ZGVsYXkoNDUpOyAvKiB3YWl0IGF0IGxlYXN0IDQzIHVzZWMgZm9yIE5FV19DWUNMRSB0byBjbGVhciAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKQotCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IE5FV19DWUNMRSBub3QgY2xlYXJlZCAqLwotCXRtcCA9IGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMSk7Ci0JaWYgKHRtcCAmIERJUkVDVF9BQk9SVCkgewotCQkvKiByZXNldCBESVJFQ1RfQUJPUlQgYml0ICovCi0JCWlvd3JpdGUzMihESVJFQ1RfQUJPUlQsIGFkZHIgKyBJSUNfQ1NSMSk7Ci0JCXJldHVybiAtRUlPOyAvKiBlcnJvcjogRElSRUNUX0FCT1JUIHNldCAqLwotCX0KLQkqZGF0YSA9IHRtcD4+MjQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogd3JpdGVfaTJjX3JlZyAtIHdyaXRlcyB0byBhbiBpbnRlcm5hbCBpMmMgcmVnaXN0ZXIKLSAqCi0gKiBAYWRkcjoJZHQzMTU1IG1taW8gYmFzZSBhZGRyZXNzCi0gKiBAaW5kZXg6CWluZGV4IChpbnRlcm5hbCBhZGRyZXNzKSBvZiByZWdpc3RlciB0byByZWFkCi0gKiBAZGF0YToJZGF0YSB0byBiZSB3cml0dGVuCi0gKgotICogcmV0dXJuczoJemVybyBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB3cml0dGluZyB0aGUgc3BlY2lmaWVkIChieSBpbmRleCkgcmVnaXN0ZXIKLSAqIGFuZCBidXN5IHdhaXRzIGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2guCi0gKi8KLXN0YXRpYyBpbnQKLXdyaXRlX2kyY19yZWcodm9pZCBfX2lvbWVtICphZGRyLCB1OCBpbmRleCwgdTggZGF0YSkKLXsKLQl1MzIgdG1wID0gaW5kZXg7Ci0KLQlpb3dyaXRlMzIoKHRtcDw8MTcpIHwgSUlDX1dSSVRFIHwgZGF0YSwgYWRkciArIElJQ19DU1IyKTsKLQltbWlvd2IoKTsKLQl1ZGVsYXkoNjUpOyAvKiB3YWl0IGF0IGxlYXN0IDYzIHVzZWMgZm9yIE5FV19DWUNMRSB0byBjbGVhciAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKQotCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IE5FV19DWUNMRSBub3QgY2xlYXJlZCAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjEpICYgRElSRUNUX0FCT1JUKSB7Ci0JCS8qIHJlc2V0IERJUkVDVF9BQk9SVCBiaXQgKi8KLQkJaW93cml0ZTMyKERJUkVDVF9BQk9SVCwgYWRkciArIElJQ19DU1IxKTsKLQkJcmV0dXJuIC1FSU87IC8qIGVycm9yOiBESVJFQ1RfQUJPUlQgc2V0ICovCi0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHdyaXRlX2kyY19yZWdfbm93YWl0IC0gd3JpdGVzIHRvIGFuIGludGVybmFsIGkyYyByZWdpc3RlcgotICoKLSAqIEBhZGRyOglkdDMxNTUgbW1pbyBiYXNlIGFkZHJlc3MKLSAqIEBpbmRleDoJaW5kZXggKGludGVybmFsIGFkZHJlc3MpIG9mIHJlZ2lzdGVyIHRvIHJlYWQKLSAqIEBkYXRhOglkYXRhIHRvIGJlIHdyaXR0ZW4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB3cml0dGluZyB0aGUgc3BlY2lmaWVkIChieSBpbmRleCkgcmVnaXN0ZXIKLSAqIGFuZCB0aGVuIHJldHVybnMuCi0gKi8KLXN0YXRpYyB2b2lkIHdyaXRlX2kyY19yZWdfbm93YWl0KHZvaWQgX19pb21lbSAqYWRkciwgdTggaW5kZXgsIHU4IGRhdGEpCi17Ci0JdTMyIHRtcCA9IGluZGV4OwotCi0JaW93cml0ZTMyKCh0bXA8PDE3KSB8IElJQ19XUklURSB8IGRhdGEsIGFkZHIgKyBJSUNfQ1NSMik7Ci0JbW1pb3diKCk7Ci19Ci0KLS8qKgotICogd2FpdF9pMmNfcmVnIC0gd2FpdHMgdGhlIHJlYWQvd3JpdGUgdG8gZmluaXNoCi0gKgotICogQGFkZHI6CWR0MzE1NSBtbWlvIGJhc2UgYWRkcmVzcwotICoKLSAqIHJldHVybnM6CXplcm8gb24gc3VjY2VzcyBvciBlcnJvciBjb2RlCi0gKgotICogVGhpcyBmdW5jdGlvbiB3YWl0cyByZWFkaW5nL3dyaXR0aW5nIHRvIGZpbmlzaC4KLSAqLwotc3RhdGljIGludCB3YWl0X2kyY19yZWcodm9pZCBfX2lvbWVtICphZGRyKQotewotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKQotCQl1ZGVsYXkoNjUpOyAvKiB3YWl0IGF0IGxlYXN0IDYzIHVzZWMgZm9yIE5FV19DWUNMRSB0byBjbGVhciAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKQotCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IE5FV19DWUNMRSBub3QgY2xlYXJlZCAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjEpICYgRElSRUNUX0FCT1JUKSB7Ci0JCS8qIHJlc2V0IERJUkVDVF9BQk9SVCBiaXQgKi8KLQkJaW93cml0ZTMyKERJUkVDVF9BQk9SVCwgYWRkciArIElJQ19DU1IxKTsKLQkJcmV0dXJuIC1FSU87IC8qIGVycm9yOiBESVJFQ1RfQUJPUlQgc2V0ICovCi0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfc3RhcnRfYWNxKHN0cnVjdCBkdDMxNTVfcHJpdiAqcGQpCi17Ci0Jc3RydWN0IHZiMl9idWZmZXIgKnZiID0gcGQtPmN1cnJfYnVmOwotCWRtYV9hZGRyX3QgZG1hX2FkZHI7Ci0KLQlkbWFfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKLQlpb3dyaXRlMzIoZG1hX2FkZHIsIHBkLT5yZWdzICsgRVZFTl9ETUFfU1RBUlQpOwotCWlvd3JpdGUzMihkbWFfYWRkciArIGltZ193aWR0aCwgcGQtPnJlZ3MgKyBPRERfRE1BX1NUQVJUKTsKLQlpb3dyaXRlMzIoaW1nX3dpZHRoLCBwZC0+cmVncyArIEVWRU5fRE1BX1NUUklERSk7Ci0JaW93cml0ZTMyKGltZ193aWR0aCwgcGQtPnJlZ3MgKyBPRERfRE1BX1NUUklERSk7Ci0JLyogZW5hYmxlIGludGVycnVwdHMsIGNsZWFyIGFsbCBpcnEgZmxhZ3MgKi8KLQlpb3dyaXRlMzIoRkxEX1NUQVJUX0VOIHwgRkxEX0VORF9PRERfRU4gfCBGTERfU1RBUlQgfAotCQkJRkxEX0VORF9FVkVOIHwgRkxEX0VORF9PREQsIHBkLT5yZWdzICsgSU5UX0NTUik7Ci0JaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgRkxEX0NSUFRfT0REIHwgRkxEX0NSUFRfRVZFTiB8Ci0JCSAgRkxEX0ROX09ERCB8IEZMRF9ETl9FVkVOIHwgQ0FQX0NPTlRfRVZFTiB8IENBUF9DT05UX09ERCwKLQkJCQkJCQlwZC0+cmVncyArIENTUjEpOwotCXdhaXRfaTJjX3JlZyhwZC0+cmVncyk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ09ORklHLCBwZC0+Y29uZmlnKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBFVkVOX0NTUiwgQ1NSX0VSUk9SIHwgQ1NSX0RPTkUpOwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIE9ERF9DU1IsIENTUl9FUlJPUiB8IENTUl9ET05FKTsKLQotCS8qICBzdGFydCB0aGUgYm9hcmQgICovCi0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ1NSMiwgcGQtPmNzcjIgfCBCVVNZX0VWRU4gfCBCVVNZX09ERCk7Ci0JcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgICovCi19Ci0KLS8qCi0gKglkcml2ZXItc3BlY2lmaWMgY2FsbGJhY2tzICh2YjJfb3BzKQotICovCi1zdGF0aWMgaW50Ci1kdDMxNTVfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywKLQkJCXVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAotCQkJCQkJdm9pZCAqYWxsb2NfY3R4c1tdKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2YjJfZ2V0X2Rydl9wcml2KHEpOwotCXZvaWQgKnJldDsKLQotCWlmICgqbnVtX2J1ZmZlcnMgPT0gMCkKLQkJKm51bV9idWZmZXJzID0gMTsKLQkqbnVtX3BsYW5lcyA9IDE7Ci0Jc2l6ZXNbMF0gPSBpbWdfd2lkdGggKiBpbWdfaGVpZ2h0OwotCWlmIChwZC0+cS0+YWxsb2NfY3R4WzBdKQotCQlyZXR1cm4gMDsKLQlyZXQgPSB2YjJfZG1hX2NvbnRpZ19pbml0X2N0eCgmcGQtPnBkZXYtPmRldik7Ci0JaWYgKElTX0VSUihyZXQpKQotCQlyZXR1cm4gUFRSX0VSUihyZXQpOwotCXBkLT5xLT5hbGxvY19jdHhbMF0gPSByZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdDMxNTVfd2FpdF9wcmVwYXJlKHN0cnVjdCB2YjJfcXVldWUgKnEpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7Ci0KLQltdXRleF91bmxvY2socGQtPnZkZXYtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZAotZHQzMTU1X3dhaXRfZmluaXNoKHN0cnVjdCB2YjJfcXVldWUgKnEpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7Ci0KLQltdXRleF9sb2NrKHBkLT52ZGV2LT5sb2NrKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2J1Zl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKLXsKLQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIsIDAsIGltZ193aWR0aCAqIGltZ19oZWlnaHQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9zdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2YjJfZ2V0X2Rydl9wcml2KHEpOwotCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKLQotCXNwaW5fbG9ja19pcnEoJnBkLT5sb2NrKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnBkLT5kbWFxKSkgewotCQl2YiA9IGxpc3RfZmlyc3RfZW50cnkoJnBkLT5kbWFxLCB0eXBlb2YoKnZiKSwgZG9uZV9lbnRyeSk7Ci0JCWxpc3RfZGVsKCZ2Yi0+ZG9uZV9lbnRyeSk7Ci0JCXZiMl9idWZmZXJfZG9uZSh2YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmcGQtPmxvY2spOwotCW1zbGVlcCg0NSk7IC8qIGlycSBoZW5kbGVyIHdpbGwgc3RvcCB0aGUgaGFyZHdhcmUgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWR0MzE1NV9idWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOwotCi0JLyogIHBkLT5xLT5zdHJlYW1pbmcgPSAxIHdoZW4gZHQzMTU1X2J1Zl9xdWV1ZSgpIGlzIGludm9rZWQgICovCi0Jc3Bpbl9sb2NrX2lycSgmcGQtPmxvY2spOwotCWlmIChwZC0+Y3Vycl9idWYpCi0JCWxpc3RfYWRkX3RhaWwoJnZiLT5kb25lX2VudHJ5LCAmcGQtPmRtYXEpOwotCWVsc2UgewotCQlwZC0+Y3Vycl9idWYgPSB2YjsKLQkJZHQzMTU1X3N0YXJ0X2FjcShwZCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmcGQtPmxvY2spOwotfQotLyoKLSAqCWVuZCBkcml2ZXItc3BlY2lmaWMgY2FsbGJhY2tzCi0gKi8KLQotY29uc3Qgc3RydWN0IHZiMl9vcHMgcV9vcHMgPSB7Ci0JLnF1ZXVlX3NldHVwID0gZHQzMTU1X3F1ZXVlX3NldHVwLAotCS53YWl0X3ByZXBhcmUgPSBkdDMxNTVfd2FpdF9wcmVwYXJlLAotCS53YWl0X2ZpbmlzaCA9IGR0MzE1NV93YWl0X2ZpbmlzaCwKLQkuYnVmX3ByZXBhcmUgPSBkdDMxNTVfYnVmX3ByZXBhcmUsCi0JLnN0YXJ0X3N0cmVhbWluZyA9IGR0MzE1NV9zdGFydF9zdHJlYW1pbmcsCi0JLnN0b3Bfc3RyZWFtaW5nID0gZHQzMTU1X3N0b3Bfc3RyZWFtaW5nLAotCS5idWZfcXVldWUgPSBkdDMxNTVfYnVmX3F1ZXVlLAotfTsKLQotc3RhdGljIGlycXJldHVybl90Ci1kdDMxNTVfaXJxX2hhbmRsZXJfZXZlbihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICppcGQgPSBkZXZfaWQ7Ci0Jc3RydWN0IHZiMl9idWZmZXIgKml2YjsKLQlkbWFfYWRkcl90IGRtYV9hZGRyOwotCXUzMiB0bXA7Ci0KLQl0bXAgPSBpb3JlYWQzMihpcGQtPnJlZ3MgKyBJTlRfQ1NSKSAmIChGTERfU1RBUlQgfCBGTERfRU5EX09ERCk7Ci0JaWYgKCF0bXApCi0JCXJldHVybiBJUlFfTk9ORTsgIC8qIG5vdCBvdXIgaXJxICovCi0JaWYgKCh0bXAgJiBGTERfU1RBUlQpICYmICEodG1wICYgRkxEX0VORF9PREQpKSB7Ci0JCWlvd3JpdGUzMihGTERfU1RBUlRfRU4gfCBGTERfRU5EX09ERF9FTiB8IEZMRF9TVEFSVCwKLQkJCQkJCQlpcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKLQkJaXBkLT5maWVsZF9jb3VudCsrOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7IC8qIHN0YXJ0IG9mIGZpZWxkIGlycSAqLwotCX0KLQlpZiAoKHRtcCAmIEZMRF9TVEFSVCkgJiYgKHRtcCAmIEZMRF9FTkRfT0REKSkKLQkJaXBkLT5zdGF0cy5zdGFydF9iZWZvcmVfZW5kKys7Ci0JLyoJY2hlY2sgZm9yIGNvcnJ1cHRlZCBmaWVsZHMgICAgICovCi0vKgl3cml0ZV9pMmNfcmVnKGlwZC0+cmVncywgRVZFTl9DU1IsIENTUl9FUlJPUiB8IENTUl9ET05FKTsJKi8KLS8qCXdyaXRlX2kyY19yZWcoaXBkLT5yZWdzLCBPRERfQ1NSLCBDU1JfRVJST1IgfCBDU1JfRE9ORSk7CSovCi0JdG1wID0gaW9yZWFkMzIoaXBkLT5yZWdzICsgQ1NSMSkgJiAoRkxEX0NSUFRfRVZFTiB8IEZMRF9DUlBUX09ERCk7Ci0JaWYgKHRtcCkgewotCQlpcGQtPnN0YXRzLmNvcnJ1cHRlZF9maWVsZHMrKzsKLQkJaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgRkxEX0NSUFRfT0REIHwgRkxEX0NSUFRfRVZFTiB8Ci0JCQkJCQlGTERfRE5fT0REIHwgRkxEX0ROX0VWRU4gfAotCQkJCQkJQ0FQX0NPTlRfRVZFTiB8IENBUF9DT05UX09ERCwKLQkJCQkJCQlpcGQtPnJlZ3MgKyBDU1IxKTsKLQkJbW1pb3diKCk7Ci0JfQotCi0Jc3Bpbl9sb2NrKCZpcGQtPmxvY2spOwotCWlmIChpcGQtPmN1cnJfYnVmKSB7Ci0JCWRvX2dldHRpbWVvZmRheSgmaXBkLT5jdXJyX2J1Zi0+djRsMl9idWYudGltZXN0YW1wKTsKLQkJaXBkLT5jdXJyX2J1Zi0+djRsMl9idWYuc2VxdWVuY2UgPSAoaXBkLT5maWVsZF9jb3VudCkgPj4gMTsKLQkJdmIyX2J1ZmZlcl9kb25lKGlwZC0+Y3Vycl9idWYsIFZCMl9CVUZfU1RBVEVfRE9ORSk7Ci0JfQotCi0JaWYgKCFpcGQtPnEtPnN0cmVhbWluZyB8fCBsaXN0X2VtcHR5KCZpcGQtPmRtYXEpKQotCQlnb3RvIHN0b3BfZG1hOwotCWl2YiA9IGxpc3RfZmlyc3RfZW50cnkoJmlwZC0+ZG1hcSwgdHlwZW9mKCppdmIpLCBkb25lX2VudHJ5KTsKLQlsaXN0X2RlbCgmaXZiLT5kb25lX2VudHJ5KTsKLQlpcGQtPmN1cnJfYnVmID0gaXZiOwotCWRtYV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoaXZiLCAwKTsKLQlpb3dyaXRlMzIoZG1hX2FkZHIsIGlwZC0+cmVncyArIEVWRU5fRE1BX1NUQVJUKTsKLQlpb3dyaXRlMzIoZG1hX2FkZHIgKyBpbWdfd2lkdGgsIGlwZC0+cmVncyArIE9ERF9ETUFfU1RBUlQpOwotCWlvd3JpdGUzMihpbWdfd2lkdGgsIGlwZC0+cmVncyArIEVWRU5fRE1BX1NUUklERSk7Ci0JaW93cml0ZTMyKGltZ193aWR0aCwgaXBkLT5yZWdzICsgT0REX0RNQV9TVFJJREUpOwotCW1taW93YigpOwotCS8qIGVuYWJsZSBpbnRlcnJ1cHRzLCBjbGVhciBhbGwgaXJxIGZsYWdzICovCi0JaW93cml0ZTMyKEZMRF9TVEFSVF9FTiB8IEZMRF9FTkRfT0REX0VOIHwgRkxEX1NUQVJUIHwKLQkJCUZMRF9FTkRfRVZFTiB8IEZMRF9FTkRfT0RELCBpcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKLQlzcGluX3VubG9jaygmaXBkLT5sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLXN0b3BfZG1hOgotCWlwZC0+Y3Vycl9idWYgPSBOVUxMOwotCS8qIHN0b3AgdGhlIGJvYXJkICovCi0Jd3JpdGVfaTJjX3JlZ19ub3dhaXQoaXBkLT5yZWdzLCBDU1IyLCBpcGQtPmNzcjIpOwotCWlvd3JpdGUzMihGSUZPX0VOIHwgU1JTVCB8IEZMRF9DUlBUX09ERCB8IEZMRF9DUlBUX0VWRU4gfAotCQkgIEZMRF9ETl9PREQgfCBGTERfRE5fRVZFTiwgaXBkLT5yZWdzICsgQ1NSMSk7Ci0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzLCBjbGVhciBhbGwgaXJxIGZsYWdzICovCi0JaW93cml0ZTMyKEZMRF9TVEFSVCB8IEZMRF9FTkRfRVZFTiB8IEZMRF9FTkRfT0RELCBpcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKLQlzcGluX3VubG9jaygmaXBkLT5sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9vcGVuKHN0cnVjdCBmaWxlICpmaWxwKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JaWYgKCFwZC0+dXNlcnMpIHsKLQkJcGQtPnEgPSBremFsbG9jKHNpemVvZigqcGQtPnEpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwZC0+cSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX2FsbG9jX3F1ZXVlOwotCQl9Ci0JCXBkLT5xLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlwZC0+cS0+aW9fbW9kZXMgPSBWQjJfUkVBRCB8IFZCMl9NTUFQOwotCQlwZC0+cS0+b3BzID0gJnFfb3BzOwotCQlwZC0+cS0+bWVtX29wcyA9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7Ci0JCXBkLT5xLT5kcnZfcHJpdiA9IHBkOwotCQlwZC0+Y3Vycl9idWYgPSBOVUxMOwotCQlwZC0+ZmllbGRfY291bnQgPSAwOwotCQl2YjJfcXVldWVfaW5pdChwZC0+cSk7IC8qIGNhbm5vdCBmYWlsICovCi0JCUlOSVRfTElTVF9IRUFEKCZwZC0+ZG1hcSk7Ci0JCXNwaW5fbG9ja19pbml0KCZwZC0+bG9jayk7Ci0JCS8qIGRpc2FibGUgYWxsIGlycXMsIGNsZWFyIGFsbCBpcnEgZmxhZ3MgKi8KLQkJaW93cml0ZTMyKEZMRF9TVEFSVCB8IEZMRF9FTkRfRVZFTiB8IEZMRF9FTkRfT0RELAotCQkJCQkJcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKLQkJcmV0ID0gcmVxdWVzdF9pcnEocGQtPnBkZXYtPmlycSwgZHQzMTU1X2lycV9oYW5kbGVyX2V2ZW4sCi0JCQkJCQlJUlFGX1NIQVJFRCwgRFQzMTU1X05BTUUsIHBkKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX3JlcXVlc3RfaXJxOwotCX0KLQlwZC0+dXNlcnMrKzsKLQlyZXR1cm4gMDsgLyogc3VjY2VzcyAqLwotZXJyX3JlcXVlc3RfaXJxOgotCWtmcmVlKHBkLT5xKTsKLQlwZC0+cSA9IE5VTEw7Ci1lcnJfYWxsb2NfcXVldWU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7Ci0KLQlwZC0+dXNlcnMtLTsKLQlCVUdfT04ocGQtPnVzZXJzIDwgMCk7Ci0JaWYgKCFwZC0+dXNlcnMpIHsKLQkJdmIyX3F1ZXVlX3JlbGVhc2UocGQtPnEpOwotCQlmcmVlX2lycShwZC0+cGRldi0+aXJxLCBwZCk7Ci0JCWlmIChwZC0+cS0+YWxsb2NfY3R4WzBdKQotCQkJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgocGQtPnEtPmFsbG9jX2N0eFswXSk7Ci0JCWtmcmVlKHBkLT5xKTsKLQkJcGQtPnEgPSBOVUxMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QKLWR0MzE1NV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdXNlciwgc2l6ZV90IHNpemUsIGxvZmZfdCAqbG9mZikKLXsKLQlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKLQotCXJldHVybiB2YjJfcmVhZChwZC0+cSwgdXNlciwgc2l6ZSwgbG9mZiwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kdDMxNTVfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwb2xsdGJsKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9wb2xsKHBkLT5xLCBmaWxwLCBwb2xsdGJsKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9tbWFwKHBkLT5xLCB2bWEpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGR0MzE1NV9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gZHQzMTU1X29wZW4sCi0JLnJlbGVhc2UgPSBkdDMxNTVfcmVsZWFzZSwKLQkucmVhZCA9IGR0MzE1NV9yZWFkLAotCS5wb2xsID0gZHQzMTU1X3BvbGwsCi0JLnVubG9ja2VkX2lvY3RsID0gdmlkZW9faW9jdGwyLCAvKiBWNEwyIGlvY3RsIGhhbmRsZXIgKi8KLQkubW1hcCA9IGR0MzE1NV9tbWFwLAotfTsKLQotc3RhdGljIGludAotZHQzMTU1X2lvY19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7Ci0KLQlyZXR1cm4gdmIyX3N0cmVhbW9uKHBkLT5xLCB0eXBlKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9zdHJlYW1vZmYocGQtPnEsIHR5cGUpOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7Ci0KLQlzdHJjcHkoY2FwLT5kcml2ZXIsIERUMzE1NV9OQU1FKTsKLQlzdHJjcHkoY2FwLT5jYXJkLCBEVDMxNTVfTkFNRSAiIGZyYW1lIGdyYWJiZXIiKTsKLQlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0k6JXMiLCBwY2lfbmFtZShwZC0+cGRldikpOwotCWNhcC0+dmVyc2lvbiA9Ci0JICAgICAgIEtFUk5FTF9WRVJTSU9OKERUMzE1NV9WRVJfTUFKLCBEVDMxNTVfVkVSX01JTiwgRFQzMTU1X1ZFUl9FWFQpOwotCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0JCQkJRFQzMTU1X0NBUFRVUkVfTUVUSE9EOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCi17Ci0JaWYgKGYtPmluZGV4ID49IE5VTV9PRl9GT1JNQVRTKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkqZiA9IGZyYW1lX3N0ZFtmLT5pbmRleF07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9pb2NfZ19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZi0+Zm10LnBpeC53aWR0aCA9IGltZ193aWR0aDsKLQlmLT5mbXQucGl4LmhlaWdodCA9IGltZ19oZWlnaHQ7Ci0JZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9HUkVZOwotCWYtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSBmLT5mbXQucGl4LndpZHRoOwotCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC53aWR0aCAqIGYtPmZtdC5waXguaGVpZ2h0OwotCWYtPmZtdC5waXguY29sb3JzcGFjZSA9IDA7Ci0JZi0+Zm10LnBpeC5wcml2ID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChmLT5mbXQucGl4LndpZHRoID09IGltZ193aWR0aCAmJgotCQlmLT5mbXQucGl4LmhlaWdodCA9PSBpbWdfaGVpZ2h0ICYmCi0JCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0dSRVkgJiYKLQkJZi0+Zm10LnBpeC5maWVsZCA9PSBWNEwyX0ZJRUxEX05PTkUgJiYKLQkJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPT0gZi0+Zm10LnBpeC53aWR0aCAmJgotCQlmLT5mbXQucGl4LnNpemVpbWFnZSA9PSBmLT5mbXQucGl4LndpZHRoICogZi0+Zm10LnBpeC5oZWlnaHQpCi0JCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlyZXR1cm4gZHQzMTU1X2lvY19nX2ZtdF92aWRfY2FwKGZpbHAsIHAsIGYpOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9yZXFidWZzKHBkLT5xLCBiKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9xdWVyeWJ1ZihwZC0+cSwgYik7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9pb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9xYnVmKHBkLT5xLCBiKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9kcWJ1ZihwZC0+cSwgYiwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3F1ZXJ5c3RkKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCB2NGwyX3N0ZF9pZCAqbm9ybSkKLXsKLQkqbm9ybSA9IERUMzE1NV9DVVJSRU5UX05PUk07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9pb2NfZ19zdGQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHY0bDJfc3RkX2lkICpub3JtKQotewotCSpub3JtID0gRFQzMTU1X0NVUlJFTlRfTk9STTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgdjRsMl9zdGRfaWQgKm5vcm0pCi17Ci0JaWYgKCpub3JtICYgRFQzMTU1X0NVUlJFTlRfTk9STSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9pb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfaW5wdXQgKmlucHV0KQotewotCWlmIChpbnB1dC0+aW5kZXgpCi0JCXJldHVybiAtRUlOVkFMOwotCXN0cmNweShpbnB1dC0+bmFtZSwgIkNvYXggaW4iKTsKLQlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0JLyoKLQkgKiBGSVhNRTogaW5wdXQtPnN0ZCA9IDAgYWNjb3JkaW5nIHRvIHY0bDIgQVBJCi0JICogVklESU9DX0dfU1RELCBWSURJT0NfU19TVEQsIFZJRElPQ19RVUVSWVNURCBhbmQgVklESU9DX0VOVU1TVEQKLQkgKiBzaG91bGQgcmV0dXJuIC1FSU5WQUwKLQkgKi8KLQlpbnB1dC0+c3RkID0gRFQzMTU1X0NVUlJFTlRfTk9STTsKLQlpbnB1dC0+c3RhdHVzID0gMDsvKiBGSVhNRTogYWRkIHN5bmMgZGV0ZWN0aW9uICYgVjRMMl9JTl9TVF9OT19IX0xPQ0sgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0JKmkgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHVuc2lnbmVkIGludCBpKQotewotCWlmIChpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19nX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm1zKQotewotCWlmIChwYXJtcy0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSA9IFY0TDJfQ0FQX1RJTUVQRVJGUkFNRTsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlID0gMDsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSAxMDAxOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gZnJhbWVzX3Blcl9zZWMgKiAxMDAwOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gMTsgLyogRklYTUU6IDIgYnVmZmVycz8gKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm1zKQotewotCWlmIChwYXJtcy0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSA9IFY0TDJfQ0FQX1RJTUVQRVJGUkFNRTsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlID0gMDsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSAxMDAxOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gZnJhbWVzX3Blcl9zZWMgKiAxMDAwOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gMTsgLyogRklYTUU6IDIgYnVmZmVycz8gKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBkdDMxNTVfaW9jdGxfb3BzID0gewotCS52aWRpb2Nfc3RyZWFtb24gPSBkdDMxNTVfaW9jX3N0cmVhbW9uLAotCS52aWRpb2Nfc3RyZWFtb2ZmID0gZHQzMTU1X2lvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19xdWVyeWNhcCA9IGR0MzE1NV9pb2NfcXVlcnljYXAsCi0vKgotCS52aWRpb2NfZ19wcmlvcml0eSA9IGR0MzE1NV9pb2NfZ19wcmlvcml0eSwKLQkudmlkaW9jX3NfcHJpb3JpdHkgPSBkdDMxNTVfaW9jX3NfcHJpb3JpdHksCi0qLwotCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IGR0MzE1NV9pb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcCA9IGR0MzE1NV9pb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcCA9IGR0MzE1NV9pb2NfZ19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3NfZm10X3ZpZF9jYXAgPSBkdDMxNTVfaW9jX3NfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19yZXFidWZzID0gZHQzMTU1X2lvY19yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYgPSBkdDMxNTVfaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IGR0MzE1NV9pb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmID0gZHQzMTU1X2lvY19kcWJ1ZiwKLQkudmlkaW9jX3F1ZXJ5c3RkID0gZHQzMTU1X2lvY19xdWVyeXN0ZCwKLQkudmlkaW9jX2dfc3RkID0gZHQzMTU1X2lvY19nX3N0ZCwKLQkudmlkaW9jX3Nfc3RkID0gZHQzMTU1X2lvY19zX3N0ZCwKLQkudmlkaW9jX2VudW1faW5wdXQgPSBkdDMxNTVfaW9jX2VudW1faW5wdXQsCi0JLnZpZGlvY19nX2lucHV0ID0gZHQzMTU1X2lvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCA9IGR0MzE1NV9pb2Nfc19pbnB1dCwKLS8qCi0JLnZpZGlvY19xdWVyeWN0cmwgPSBkdDMxNTVfaW9jX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX2dfY3RybCA9IGR0MzE1NV9pb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsID0gZHQzMTU1X2lvY19zX2N0cmwsCi0JLnZpZGlvY19xdWVyeW1lbnUgPSBkdDMxNTVfaW9jX3F1ZXJ5bWVudSwKLQkudmlkaW9jX2dfZXh0X2N0cmxzID0gZHQzMTU1X2lvY19nX2V4dF9jdHJscywKLQkudmlkaW9jX3NfZXh0X2N0cmxzID0gZHQzMTU1X2lvY19zX2V4dF9jdHJscywKLSovCi0JLnZpZGlvY19nX3Bhcm0gPSBkdDMxNTVfaW9jX2dfcGFybSwKLQkudmlkaW9jX3NfcGFybSA9IGR0MzE1NV9pb2Nfc19wYXJtLAotLyoKLQkudmlkaW9jX2Nyb3BjYXAgPSBkdDMxNTVfaW9jX2Nyb3BjYXAsCi0JLnZpZGlvY19nX2Nyb3AgPSBkdDMxNTVfaW9jX2dfY3JvcCwKLQkudmlkaW9jX3NfY3JvcCA9IGR0MzE1NV9pb2Nfc19jcm9wLAotCS52aWRpb2NfZW51bV9mcmFtZXNpemVzID0gZHQzMTU1X2lvY19lbnVtX2ZyYW1lc2l6ZXMsCi0JLnZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzID0gZHQzMTU1X2lvY19lbnVtX2ZyYW1laW50ZXJ2YWxzLAotKi8KLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1kdDMxNTVfaW5pdF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXZvaWQgKmJ1Zl9jcHU7Ci0JZG1hX2FkZHJfdCBidWZfZG1hOwotCWludCBpOwotCXU4IHRtcDsKLQotCXBjaV9zZXRfbWFzdGVyKHBkZXYpOyAvKiBkdDMxNTUgbmVlZHMgaXQgKi8KLQotCS8qICByZXNldHRpbmcgdGhlIGFkYXB0ZXIgICovCi0JaW93cml0ZTMyKEZMRF9DUlBUX09ERCB8IEZMRF9DUlBUX0VWRU4gfCBGTERfRE5fT0REIHwgRkxEX0ROX0VWRU4sCi0JCQkJCQkJcGQtPnJlZ3MgKyBDU1IxKTsKLQltbWlvd2IoKTsKLQltc2xlZXAoMjApOwotCi0JLyogIGluaXRpYWxpemluZyBhZGFwZXIgcmVnaXN0ZXJzICAqLwotCWlvd3JpdGUzMihGSUZPX0VOIHwgU1JTVCwgcGQtPnJlZ3MgKyBDU1IxKTsKLQltbWlvd2IoKTsKLQlpb3dyaXRlMzIoMHhFRUVFRUUwMSwgcGQtPnJlZ3MgKyBFVkVOX1BJWEVMX0ZNVCk7Ci0JaW93cml0ZTMyKDB4RUVFRUVFMDEsIHBkLT5yZWdzICsgT0REX1BJWEVMX0ZNVCk7Ci0JaW93cml0ZTMyKDB4MDAwMDAwMjAsIHBkLT5yZWdzICsgRklGT19UUklHRVIpOwotCWlvd3JpdGUzMigweDAwMDAwMTAzLCBwZC0+cmVncyArIFhGRVJfTU9ERSk7Ci0JaW93cml0ZTMyKDAsIHBkLT5yZWdzICsgUkVUUllfV0FJVF9DTlQpOwotCWlvd3JpdGUzMigwLCBwZC0+cmVncyArIElOVF9DU1IpOwotCWlvd3JpdGUzMigxLCBwZC0+cmVncyArIEVWRU5fRkxEX01BU0spOwotCWlvd3JpdGUzMigxLCBwZC0+cmVncyArIE9ERF9GTERfTUFTSyk7Ci0JaW93cml0ZTMyKDAsIHBkLT5yZWdzICsgTUFTS19MRU5HVEgpOwotCWlvd3JpdGUzMigweDAwMDUwMDdDLCBwZC0+cmVncyArIEZJRk9fRkxBR19DTlQpOwotCWlvd3JpdGUzMigweDAxMDEwMTAxLCBwZC0+cmVncyArIElJQ19DTEtfRFVSKTsKLQltbWlvd2IoKTsKLQotCS8qIHZlcmlmeWluZyB0aGF0IHdlIGhhdmUgYSBEVDMxNTUgYm9hcmQgKG5vdCBqdXN0IGEgU0FBNzExNiBjaGlwKSAqLwotCXJlYWRfaTJjX3JlZyhwZC0+cmVncywgRFRfSUQsICZ0bXApOwotCWlmICh0bXAgIT0gRFQzMTU1X0lEKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIGluaXRpYWxpemUgQUQgTFVUICovCi0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgMCk7Ci0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9MVVQsIGkpOwotCi0JLyogaW5pdGlhbGl6ZSBBREMgcmVmZXJlbmNlcyAqLwotCS8qIEZJWE1FOiBwb3NfcmVmICYgbmVnX3JlZiBkZXBlbmQgb24gVlRfNTBIWiAqLwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEFEX0FERFIsIEFEX0NNRF9SRUcpOwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEFEX0NNRCwgVklERU9fQ05MXzEgfCBTWU5DX0NOTF8xIHwgU1lOQ19MVkxfMyk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgQURfUE9TX1JFRik7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQ01ELCAzNCk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgQURfTkVHX1JFRik7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQ01ELCAwKTsKLQotCS8qIGluaXRpYWxpemUgUE0gTFVUICovCi0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ09ORklHLCBwZC0+Y29uZmlnIHwgUE1fTFVUX1BHTSk7Ci0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIFBNX0xVVF9BRERSLCBpKTsKLQkJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgUE1fTFVUX0RBVEEsIGkpOwotCX0KLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcgfCBQTV9MVVRfUEdNIHwgUE1fTFVUX1NFTCk7Ci0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIFBNX0xVVF9BRERSLCBpKTsKLQkJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgUE1fTFVUX0RBVEEsIGkpOwotCX0KLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcpOyAvKiAgQUNRX01PREVfRVZFTiAgKi8KLQotCS8qIHNlbGVjdCBjaGFuZWwgMSBmb3IgaW5wdXQgYW5kIHNldCBzeW5jIGxldmVsICovCi0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgQURfQ01EX1JFRyk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQ01ELCBWSURFT19DTkxfMSB8IFNZTkNfQ05MXzEgfCBTWU5DX0xWTF8zKTsKLQotCS8qIGFsbG9jYXRlIG1lbW9yeSwgYW5kIGluaXRpYWxpemUgdGhlIERNQSBtYWNoaW5lICovCi0JYnVmX2NwdSA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBEVDMxNTVfQlVGX1NJWkUsICZidWZfZG1hLAotCQkJCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1Zl9jcHUpCi0JCXJldHVybiAtRU5PTUVNOwotCWlvd3JpdGUzMihidWZfZG1hLCBwZC0+cmVncyArIEVWRU5fRE1BX1NUQVJUKTsKLQlpb3dyaXRlMzIoYnVmX2RtYSwgcGQtPnJlZ3MgKyBPRERfRE1BX1NUQVJUKTsKLQlpb3dyaXRlMzIoMCwgcGQtPnJlZ3MgKyBFVkVOX0RNQV9TVFJJREUpOwotCWlvd3JpdGUzMigwLCBwZC0+cmVncyArIE9ERF9ETUFfU1RSSURFKTsKLQotCS8qICBQZXJmb3JtIGEgcHNldWRvIGV2ZW4gZmllbGQgYWNxdWlyZSAgICAqLwotCWlvd3JpdGUzMihGSUZPX0VOIHwgU1JTVCB8IENBUF9DT05UX09ERCwgcGQtPnJlZ3MgKyBDU1IxKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDU1IyLCBwZC0+Y3NyMiB8IFNZTkNfU05UTCk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ09ORklHLCBwZC0+Y29uZmlnKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBFVkVOX0NTUiwgQ1NSX1NOR0wpOwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENTUjIsIHBkLT5jc3IyIHwgQlVTWV9FVkVOIHwgU1lOQ19TTlRMKTsKLQltc2xlZXAoMTAwKTsKLQlyZWFkX2kyY19yZWcocGQtPnJlZ3MsIENTUjIsICZ0bXApOwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEVWRU5fQ1NSLCBDU1JfRVJST1IgfCBDU1JfU05HTCB8IENTUl9ET05FKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBPRERfQ1NSLCBDU1JfRVJST1IgfCBDU1JfU05HTCB8IENTUl9ET05FKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDU1IyLCBwZC0+Y3NyMik7Ci0JaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgRkxEX0ROX0VWRU4gfCBGTERfRE5fT0RELCBwZC0+cmVncyArIENTUjEpOwotCi0JLyogIGRlYWxsb2NhdGUgbWVtb3J5ICAqLwotCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIERUMzE1NV9CVUZfU0laRSwgYnVmX2NwdSwgYnVmX2RtYSk7Ci0JaWYgKHRtcCAmIEJVU1lfRVZFTikKLQkJcmV0dXJuIC1FSU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGR0MzE1NV92ZGV2ID0gewotCS5uYW1lID0gRFQzMTU1X05BTUUsCi0JLmZvcHMgPSAmZHQzMTU1X2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZkdDMxNTVfaW9jdGxfb3BzLAotCS5taW5vciA9IC0xLAotCS5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCi0JLnR2bm9ybXMgPSBEVDMxNTVfQ1VSUkVOVF9OT1JNLAotCS5jdXJyZW50X25vcm0gPSBEVDMxNTVfQ1VSUkVOVF9OT1JNLAotfTsKLQotLyogc2FtZSBhcyBpbiBkcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMgKi8KLXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtIHsKLQl2b2lkCQkqdmlydF9iYXNlOwotCWRtYV9hZGRyX3QJZGV2aWNlX2Jhc2U7Ci0JaW50CQlzaXplOwotCWludAkJZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwkqYml0bWFwOwotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQKLWR0MzE1NV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbTsKLQlkbWFfYWRkcl90IGRldl9iYXNlOwotCWludCBwYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKLQlpbnQgYml0bWFwX3NpemUgPSBCSVRTX1RPX0xPTkdTKHBhZ2VzKSAqIHNpemVvZihsb25nKTsKLQotCWlmICgoZmxhZ3MgJiBETUFfTUVNT1JZX01BUCkgPT0gMCkKLQkJZ290byBvdXQ7Ci0JaWYgKCFzaXplKQotCQlnb3RvIG91dDsKLQlpZiAoZGV2LT5kbWFfbWVtKQotCQlnb3RvIG91dDsKLQotCW1lbSA9IGt6YWxsb2Moc2l6ZW9mKCptZW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1lbSkKLQkJZ290byBvdXQ7Ci0JbWVtLT52aXJ0X2Jhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCAmZGV2X2Jhc2UsCi0JCQkJCQkJRFQzMTU1X0NPSF9GTEFHUyk7Ci0JaWYgKCFtZW0tPnZpcnRfYmFzZSkKLQkJZ290byBlcnJfYWxsb2NfY29oZXJlbnQ7Ci0JbWVtLT5iaXRtYXAgPSBremFsbG9jKGJpdG1hcF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1lbS0+Yml0bWFwKQotCQlnb3RvIGVycl9iaXRtYXA7Ci0KLQkvKiBjb2hlcmVudF9kbWFfbWFzayBpcyBhbHJlYWR5IHNldCB0byAzMiBiaXRzICovCi0JbWVtLT5kZXZpY2VfYmFzZSA9IGRldl9iYXNlOwotCW1lbS0+c2l6ZSA9IHBhZ2VzOwotCW1lbS0+ZmxhZ3MgPSBmbGFnczsKLQlkZXYtPmRtYV9tZW0gPSBtZW07Ci0JcmV0dXJuIERNQV9NRU1PUllfTUFQOwotCi1lcnJfYml0bWFwOgotCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgbWVtLT52aXJ0X2Jhc2UsIGRldl9iYXNlKTsKLWVycl9hbGxvY19jb2hlcmVudDoKLQlrZnJlZShtZW0pOwotb3V0OgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQKLWR0MzE1NV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtID0gZGV2LT5kbWFfbWVtOwotCi0JaWYgKCFtZW0pCi0JCXJldHVybjsKLQlkZXYtPmRtYV9tZW0gPSBOVUxMOwotCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgbWVtLT5zaXplIDw8IFBBR0VfU0hJRlQsCi0JCQkJCW1lbS0+dmlydF9iYXNlLCBtZW0tPmRldmljZV9iYXNlKTsKLQlrZnJlZShtZW0tPmJpdG1hcCk7Ci0Ja2ZyZWUobWVtKTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQKLWR0MzE1NV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQotewotCWludCBlcnI7Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZDsKLQotCWVyciA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQllcnIgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcGQgPSBremFsbG9jKHNpemVvZigqcGQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwZC0+dmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmICghcGQtPnZkZXYpCi0JCWdvdG8gZXJyX3ZpZGVvX2RldmljZV9hbGxvYzsKLQkqcGQtPnZkZXYgPSBkdDMxNTVfdmRldjsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgcGQpOyAgICAvKiBmb3IgdXNlIGluIGR0MzE1NV9yZW1vdmUoKSAqLwotCXZpZGVvX3NldF9kcnZkYXRhKHBkLT52ZGV2LCBwZCk7ICAvKiBmb3IgdXNlIGluIHZpZGVvX2ZvcHMgKi8KLQlwZC0+dXNlcnMgPSAwOwotCXBkLT5wZGV2ID0gcGRldjsKLQlJTklUX0xJU1RfSEVBRCgmcGQtPmRtYXEpOwotCW11dGV4X2luaXQoJnBkLT5tdXgpOwotCXBkLT52ZGV2LT5sb2NrID0gJnBkLT5tdXg7IC8qIGZvciBsb2NraW5nIHY0bDJfZmlsZV9vcGVyYXRpb25zICovCi0Jc3Bpbl9sb2NrX2luaXQoJnBkLT5sb2NrKTsKLQlwZC0+Y3NyMiA9IGNzcjJfaW5pdDsKLQlwZC0+Y29uZmlnID0gY29uZmlnX2luaXQ7Ci0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZW5hYmxlX2RldjsKLQllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgcGNpX25hbWUocGRldikpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlcV9yZWdpb247Ci0JcGQtPnJlZ3MgPSBwY2lfaW9tYXAocGRldiwgMCwgcGNpX3Jlc291cmNlX2xlbihwZC0+cGRldiwgMCkpOwotCWlmICghcGQtPnJlZ3MpCi0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3BjaV9pb21hcDsKLQllcnIgPSBkdDMxNTVfaW5pdF9ib2FyZChwZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9pbml0X2JvYXJkOwotCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShwZC0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2luaXRfYm9hcmQ7Ci0JaWYgKGR0MzE1NV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBEVDMxNTVfQ0hVTktfU0laRSwKLQkJCQkJCQlETUFfTUVNT1JZX01BUCkpCi0JCWRldl9pbmZvKCZwZGV2LT5kZXYsICJwcmVhbGxvY2F0ZWQgOCBidWZmZXJzXG4iKTsKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiL2Rldi92aWRlbyVpIGlzIHJlYWR5XG4iLCBwZC0+dmRldi0+bWlub3IpOwotCXJldHVybiAwOyAgLyogICBzdWNjZXNzICAgKi8KLQotZXJyX2luaXRfYm9hcmQ6Ci0JcGNpX2lvdW5tYXAocGRldiwgcGQtPnJlZ3MpOwotZXJyX3BjaV9pb21hcDoKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7Ci1lcnJfcmVxX3JlZ2lvbjoKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci1lcnJfZW5hYmxlX2RldjoKLQl2aWRlb19kZXZpY2VfcmVsZWFzZShwZC0+dmRldik7Ci1lcnJfdmlkZW9fZGV2aWNlX2FsbG9jOgotCWtmcmVlKHBkKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQKLWR0MzE1NV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWR0MzE1NV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYpOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHBkLT52ZGV2KTsKLQlwY2lfaW91bm1hcChwZGV2LCBwZC0+cmVncyk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQkvKgotCSAqIHZpZGVvX2RldmljZV9yZWxlYXNlKCkgaXMgaW52b2tlZCBhdXRvbWF0aWNhbGx5Ci0JICogc2VlOiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGR0MzE1NV92ZGV2Ci0JICovCi0Ja2ZyZWUocGQpOwotfQotCi1zdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocGNpX2lkcykgPSB7Ci0JeyBQQ0lfREVWSUNFKERUMzE1NV9WRU5ET1JfSUQsIERUMzE1NV9ERVZJQ0VfSUQpIH0sCi0JeyAwLCAvKiB6ZXJvIG1hcmtzIHRoZSBlbmQgKi8gfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX2lkcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwY2lfZHJpdmVyID0gewotCS5uYW1lID0gRFQzMTU1X05BTUUsCi0JLmlkX3RhYmxlID0gcGNpX2lkcywKLQkucHJvYmUgPSBkdDMxNTVfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGR0MzE1NV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQKLWR0MzE1NV9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwY2lfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci1kdDMxNTVfZXhpdF9tb2R1bGUodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjaV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChkdDMxNTVfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoZHQzMTU1X2V4aXRfbW9kdWxlKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJ2aWRlbzRsaW51eCBwY2ktZHJpdmVyIGZvciBkdDMxNTUgZnJhbWUgZ3JhYmJlciIpOwotTU9EVUxFX0FVVEhPUigiTWFyaW4gTWl0b3YgPG1pdG92QGlzc3AuYmFzLmJnPiIpOwotTU9EVUxFX1ZFUlNJT04oRFQzMTU1X1ZFUlNJT04pOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9pbnRlbF9pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvaW50ZWxfaTJjLmMKaW5kZXggZTMzNDMyZC4uNTFjYmY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9pbnRlbF9pMmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2ludGVsX2kyYy5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInBzYl9kcnYuaCIKICNpbmNsdWRlICJwc2JfaW50ZWxfcmVnLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21kZmxkX2RzaV9vdXRwdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfZHNpX291dHB1dC5jCmluZGV4IDkwNTBjMGYuLjNmOTc5ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfZHNpX291dHB1dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfZHNpX291dHB1dC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KICNpbmNsdWRlICJtZGZsZF9kc2lfcGtnX3NlbmRlci5oIgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAjZGVmaW5lIE1ERkxEX0RTSV9CUklHSFRORVNTX01BWF9MRVZFTCAxMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9tZGZsZF9vdXRwdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfb3V0cHV0LmMKaW5kZXggZWU1NWY4Ny4uZWFiZjUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9tZGZsZF9vdXRwdXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21kZmxkX291dHB1dC5jCkBAIC0yNiw2ICsyNiw3IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSAibWRmbGRfZHNpX2RiaS5oIgogI2luY2x1ZGUgIm1kZmxkX2RzaV9kcGkuaCIKICNpbmNsdWRlICJtZGZsZF9kc2lfb3V0cHV0LmgiCkBAIC0xNjcsNCArMTY4LDQgQEAKIAkJZWxzZQogCQkJbWRmbGRfZGJpX2Rzcl9pbml0KGRldik7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWlkX2Jpb3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWlkX2Jpb3MuYwppbmRleCA4Y2ZlMzAxLi5lZTNjMDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21pZF9iaW9zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9taWRfYmlvcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAgKiAtIENoZWNrIGlvcmVtYXAgZmFpbHVyZXMKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogI2luY2x1ZGUgPGRybS9kcm0uaD4KICNpbmNsdWRlICJwc2JfZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21yc3RfaGRtaV9pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbXJzdF9oZG1pX2kyYy5jCmluZGV4IDM1MWI5ZDguLjM2ZTdlZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbXJzdF9oZG1pX2kyYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbXJzdF9oZG1pX2kyYy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJwc2JfZHJ2LmgiCiAKICNkZWZpbmUgSERNSV9SRUFEKHJlZykJCXJlYWRsKGhkbWlfZGV2LT5yZWdzICsgKHJlZykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5jCmluZGV4IGRjNjc2YzIuLjk4NmEwNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhY3BpL3ZpZGVvLmg+CiAKIHN0YXRpYyBpbnQgZHJtX3BzYl90cmFwX3BhZ2VmYXVsdHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUKaW5kZXggZTA3MWMxMi4uMGY1NWNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZQpAQCAtMSw0ICsxLDMgQEAKLW9iai0kKENPTkZJR19IWVBFUlYpCQkrPSBodl90aW1lc291cmNlLm8KIG9iai0kKENPTkZJR19IWVBFUlZfU1RPUkFHRSkJKz0gaHZfc3RvcnZzYy5vCiBvYmotJChDT05GSUdfSFlQRVJWX05FVCkJKz0gaHZfbmV0dnNjLm8KIG9iai0kKENPTkZJR19IWVBFUlZfTU9VU0UpCSs9IGh2X21vdXNlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl90aW1lc291cmNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfdGltZXNvdXJjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjBmOWFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl90aW1lc291cmNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIEEgY2xvY2tzb3VyY2UgZm9yIExpbnV4IHJ1bm5pbmcgb24gSHlwZXJWLgotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE5vdmVsbCwgSW5jLgotICogQXV0aG9yIDogSy4gWS4gU3Jpbml2YXNhbiA8a3NyaW5pdmFzYW5Abm92ZWxsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLSNpbmNsdWRlIDxhc20vaHlwZXJ2Lmg+Ci0jaW5jbHVkZSA8YXNtL21zaHlwZXJ2Lmg+Ci0jaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KLQotI2RlZmluZSBIVl9DTE9DS19TSElGVAkyMgotCi1zdGF0aWMgY3ljbGVfdCByZWFkX2h2X2Nsb2NrKHN0cnVjdCBjbG9ja3NvdXJjZSAqYXJnKQotewotCWN5Y2xlX3QgY3VycmVudF90aWNrOwotCS8qCi0JICogUmVhZCB0aGUgcGFydGl0aW9uIGNvdW50ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IHRpY2sgY291bnQuIFRoaXMgY291bnQKLQkgKiBpcyBzZXQgdG8gMCB3aGVuIHRoZSBwYXJ0aXRpb24gaXMgY3JlYXRlZCBhbmQgaXMgaW5jcmVtZW50ZWQgaW4KLQkgKiAxMDAgbmFub3NlY29uZCB1bml0cy4KLQkgKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVCwgY3VycmVudF90aWNrKTsKLQlyZXR1cm4gY3VycmVudF90aWNrOwotfQotCi1zdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGh5cGVydl9jcyA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaHlwZXJ2X2Nsb2Nrc291cmNlIiwKLQkucmF0aW5nICAgICAgICAgPSA0MDAsIC8qIHVzZSB0aGlzIHdoZW4gcnVubmluZyBvbiBIeXBlcnYqLwotCS5yZWFkICAgICAgICAgICA9IHJlYWRfaHZfY2xvY2ssCi0JLm1hc2sgICAgICAgICAgID0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCi0JLyoKLQkgKiBUaGUgdGltZSByZWYgY291bnRlciBpbiBIeXBlclYgaXMgaW4gMTAwbnMgdW5pdHMuCi0JICogVGhlIGRlZmluaXRpb24gb2YgbXVsdCBpczoKLQkgKiBtdWx0LzJec2hpZnQgPSBucy9jeWMgPSAxMDAKLQkgKiBtdWx0ID0gKDEwMCA8PCBzaGlmdCkKLQkgKi8KLQkubXVsdCAgICAgICAgICAgPSAoMTAwIDw8IEhWX0NMT0NLX1NISUZUKSwKLQkuc2hpZnQgICAgICAgICAgPSBIVl9DTE9DS19TSElGVCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRjb25zdAotaHZfdGltZXNvdXJjZV9kbWlfdGFibGVbXSBfX21heWJlX3VudXNlZCAgPSB7Ci0JewotCQkuaWRlbnQgPSAiSHlwZXItViIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTWljcm9zb2Z0IENvcnBvcmF0aW9uIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZpcnR1YWwgTWFjaGluZSIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiVmlydHVhbCBNYWNoaW5lIiksCi0JCX0sCi0JfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShkbWksIGh2X3RpbWVzb3VyY2VfZG1pX3RhYmxlKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9faW5pdGNvbnN0Ci1odl90aW1lc291cmNlX3BjaV90YWJsZVtdIF9fbWF5YmVfdW51c2VkID0gewotCXsgUENJX0RFVklDRSgweDE0MTQsIDB4NTM1MykgfSwgLyogVkdBIGNvbXBhdGlibGUgY29udHJvbGxlciAqLwotCXsgMCB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGh2X3RpbWVzb3VyY2VfcGNpX3RhYmxlKTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2h2X2Nsb2Nrc291cmNlKHZvaWQpCi17Ci0JaWYgKCh4ODZfaHlwZXIgIT0gJng4Nl9oeXBlcl9tc19oeXBlcnYpIHx8Ci0JCSEobXNfaHlwZXJ2LmZlYXR1cmVzICYgSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVF9BVkFJTEFCTEUpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghZG1pX2NoZWNrX3N5c3RlbShodl90aW1lc291cmNlX2RtaV90YWJsZSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHJfaW5mbygiUmVnaXN0ZXJpbmcgSHlwZXJWIGNsb2NrIHNvdXJjZVxuIik7Ci0JcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZoeXBlcnZfY3MpOwotfQotCi1tb2R1bGVfaW5pdChpbml0X2h2X2Nsb2Nrc291cmNlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSHlwZXJWIGJhc2VkIGNsb2Nrc291cmNlIik7Ci1NT0RVTEVfQVVUSE9SKCJLLiBZLiBTcmluaXZhc2FuIDxrc3Jpbml2YXNhbkBub3ZlbGwuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jCmluZGV4IGRiZDg4MzIuLjAwMTZlZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9yaW5nLmMKQEAgLTEsMyArMSw0IEBACisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3RyaWdnZXIuYwppbmRleCBmNDQ4MjU4Li5iY2U1MDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV90cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfdHJpZ2dlci5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYwppbmRleCA4MzhkMzAxLi4xZmRmZTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfcmluZy5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM190cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM190cmlnZ2VyLmMKaW5kZXggNTAxNjVmOS4uMjRiY2I4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3RyaWdnZXIuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9yaW5nLmMKaW5kZXggMDg1NTFiYi4uNmZkM2Q4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3JpbmcuYwpAQCAtMSwzICsxLDQgQEAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jCmluZGV4IDU1YjY2MWMuLjZlNTQyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF90cmlnZ2VyLmMKQEAgLTEsNiArMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jCmluZGV4IGJiNjYzNjQuLmQxN2UzOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9yaW5nLmMKQEAgLTEsMyArMSw0IEBACisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3RyaWdnZXIuYwppbmRleCA4ZGY4YTk3Li5jNWQ4MmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV90cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfdHJpZ2dlci5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3JpbmcuYwppbmRleCAzNGYxZTdlLi5iOTA3Y2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfcmluZy5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF90cmlnZ2VyLmMKaW5kZXggMTNmMWQxNC4uOGUwY2U1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3RyaWdnZXIuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMKaW5kZXggNWM1NDJkZC4uODk1MjdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYwpAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzkzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3OTMuYwppbmRleCBhODMxYjkyLi45OTlmOGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3OTMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3OTMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2ODYuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTY4Ni5jCmluZGV4IDQ4Mzg5ZTEuLjk3NGM2ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTY4Ni5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTY4Ni5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA2MF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwX2NvcmUuYwppbmRleCAzOGNmM2Y0Li5mZjFiNWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwX2NvcmUuYwpAQCAtNiw2ICs2LDcgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3JpbmcuYwppbmRleCA2NzljMTUxLi41MmE5ZTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3JpbmcuYwpAQCAtMSwzICsxLDQgQEAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3RyaWdnZXIuYwppbmRleCAyZjJiMjE2Li44Mjk5Y2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3RyaWdnZXIuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfYnVmZmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfYnVmZmVyLmMKaW5kZXggZjBiMzZkMi4uZWRhZDBlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fc2ltcGxlX2R1bW15X2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX3NpbXBsZV9kdW1teV9idWZmZXIuYwpAQCAtMTIsNiArMTIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3JpbmcuYwppbmRleCBjMzY4MjQ1Li5mZDg4NmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9yaW5nLmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfdHJpZ2dlci5jCmluZGV4IGJmOTkxNTMuLjViZjAwMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF90cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3RyaWdnZXIuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCmluZGV4IDZkZDVkN2QuLjlkZjBjZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiAtIEFsdGVybmF0aXZlIGFjY2VzcyB0ZWNobmlxdWVzPwogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3JpbmcuYwppbmRleCA5OWFkZTY1Li4wMGZhMmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKQEAgLTUsNiArNSw3IEBACiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgogICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF90cmlnZ2VyLmMKaW5kZXggMzkyZGZlMy4uYjY1NjljNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfdHJpZ2dlci5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmgKaW5kZXggNTk4ZmNiMy4uNWNjNDJhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmgKQEAgLTExNSw4ICsxMTUsNyBAQAogCiBpcnFyZXR1cm5fdCBpaW9fdHJpZ2dlcl9nZW5lcmljX2RhdGFfcmR5X3BvbGwoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSk7CiAKLXN0cnVjdCBpaW9fdHJpZ2dlciAqaWlvX2FsbG9jYXRlX3RyaWdnZXIoY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKK19fcHJpbnRmKDEsIDIpIHN0cnVjdCBpaW9fdHJpZ2dlciAqaWlvX2FsbG9jYXRlX3RyaWdnZXIoY29uc3QgY2hhciAqZm10LCAuLi4pOwogdm9pZCBpaW9fZnJlZV90cmlnZ2VyKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7CiAKICNlbmRpZiAvKiBfSUlPX1RSSUdHRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5jCmluZGV4IGMzMDNkODUuLmZmOWFhZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vbXJzdC5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9pb2N0bC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHJ2X2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHJ2X2ludGVyZmFjZS5jCmluZGV4IDY5ZGFhMTQuLjIyYmQyOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2Rydl9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kcnZfaW50ZXJmYWNlLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9pb2N0bC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9md19pcGMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9hdWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKaW5kZXggNjFkYjFmOS4uOGU3Mzk4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJkcml2ZXIuaCIKICNpbmNsdWRlICJhdWRpby5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTVjYWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL0tjb25maWcKQEAgLTAsMCArMSwzNyBAQAorbWVudWNvbmZpZyBTVEFHSU5HX01FRElBCisgICAgICAgIGJvb2wgIk1lZGlhIHN0YWdpbmcgZHJpdmVycyIKKyAgICAgICAgZGVmYXVsdCBuCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNlbGVjdCBhIG51bWJlciBvZiBtZWRpYSBkcml2ZXJzIHRoYXQKKwkgIGRvbid0IGhhdmUgdGhlICJub3JtYWwiIExpbnV4IGtlcm5lbCBxdWFsaXR5IGxldmVsLgorCSAgTW9zdCBvZiB0aGVtIGRvbid0IGZvbGxvdyBwcm9wZXJseSB0aGUgVjRMLCBEVkIgYW5kL29yIFJDIEFQSSdzLAorCSAgc28sIHRoZXkgd29uJ3QgbGlrZWx5IHdvcmsgZmluZSB3aXRoIHRoZSBleGlzdGluZyBhcHBsaWNhdGlvbnMuCisJICBUaGF0IGFsc28gbWVhbnMgdGhhdCwgb25lIGZpeGVkLCB0aGVpciBBUEkncyB3aWxsIGNoYW5nZSB0byBtYXRjaAorCSAgdGhlIGV4aXN0aW5nIG9uZXMuCisKKyAgICAgICAgICBJZiB5b3Ugd2lzaCB0byB3b3JrIG9uIHRoZXNlIGRyaXZlcnMsIHRvIGhlbHAgaW1wcm92ZSB0aGVtLCBvcgorICAgICAgICAgIHRvIHJlcG9ydCBwcm9ibGVtcyB5b3UgaGF2ZSB3aXRoIHRoZW0sIHBsZWFzZSB1c2UgdGhlCisJICBsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcgbWFpbGluZyBsaXN0LgorCisgICAgICAgICAgSWYgaW4gZG91YnQsIHNheSBOIGhlcmUuCisKKworaWYgU1RBR0lOR19NRURJQQorCisjIFBsZWFzZSBrZWVwIHRoZW0gaW4gYWxwaGFiZXRpYyBvcmRlcgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWRpYS9kdDMxNTV2NGwvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZWFzeWNhcC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvS2NvbmZpZyIKKworIyBLZWVwIExJUkMgYXQgdGhlIGVuZCwgYXMgaXQgaGFzIHN1Yi1tZW51cworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9LY29uZmlnIgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OTEyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACitvYmotJChDT05GSUdfRFZCX0FTMTAyKQkJKz0gYXMxMDIvCitvYmotJChDT05GSUdfRFZCX0NYRDIwOTkpCSs9IGN4ZDIwOTkvCitvYmotJChDT05GSUdfRUFTWUNBUCkJCSs9IGVhc3ljYXAvCitvYmotJChDT05GSUdfTElSQ19TVEFHSU5HKQkrPSBsaXJjLworb2JqLSQoQ09ORklHX1NPTE82WDEwKQkJKz0gc29sbzZ4MTAvCitvYmotJChDT05GSUdfVklERU9fRFQzMTU1KQkrPSBkdDMxNTV2NGwvCitvYmotJChDT05GSUdfVklERU9fR083MDA3KQkrPSBnbzcwMDcvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjUwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvS2NvbmZpZwpAQCAtMCwwICsxLDcgQEAKK2NvbmZpZyBEVkJfQVMxMDIKKwl0cmlzdGF0ZSAiQWJpbGlzIEFTMTAyIERWQiByZWNlaXZlciIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFVTQiAmJiBJMkMgJiYgSU5QVVQKKwloZWxwCisJICBDaG9vc2UgWSBvciBNIGhlcmUgaWYgeW91IGhhdmUgYSBkZXZpY2UgY29udGFpbmluZyBhbiBBUzEwMgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkYmI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKK2R2Yi1hczEwMi1vYmpzIDo9IGFzMTAyX2Rydi5vIGFzMTAyX2Z3Lm8gYXMxMHhfY21kLm8gYXMxMHhfY21kX3N0cmVhbS5vIFwKKwkJYXMxMDJfZmUubyBhczEwMl91c2JfZHJ2Lm8gYXMxMHhfY21kX2NmZy5vCisKK29iai0kKENPTkZJR19EVkJfQVMxMDIpICs9IGR2Yi1hczEwMi5vCisKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19BUzEwMl9VU0IgLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzVjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZHJ2LmMKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGV2aW4gSGVpdG11ZWxsZXIgPGRoZWl0bXVlbGxlckBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisvKiBoZWFkZXIgZmlsZSBmb3IgVXNiIGRldmljZSBkcml2ZXIqLworI2luY2x1ZGUgImFzMTAyX2Rydi5oIgorI2luY2x1ZGUgImFzMTAyX2Z3LmgiCisjaW5jbHVkZSAiZHZiZGV2LmgiCisKK2ludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nIChkZWZhdWx0OiBvZmYpIik7CisKK2ludCBkdWFsX3R1bmVyOworbW9kdWxlX3BhcmFtX25hbWVkKGR1YWxfdHVuZXIsIGR1YWxfdHVuZXIsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR1YWxfdHVuZXIsICJBY3RpdmF0ZSBEdWFsLVR1bmVyIGNvbmZpZyAoZGVmYXVsdDogb2ZmKSIpOworCitzdGF0aWMgaW50IGZ3X3VwbG9hZCA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoZndfdXBsb2FkLCBmd191cGxvYWQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZ3X3VwbG9hZCwgIlR1cm4gb24vb2ZmIGRlZmF1bHQgRlcgdXBsb2FkIChkZWZhdWx0OiBvbikiKTsKKworc3RhdGljIGludCBwaWRfZmlsdGVyaW5nOworbW9kdWxlX3BhcmFtX25hbWVkKHBpZF9maWx0ZXJpbmcsIHBpZF9maWx0ZXJpbmcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBpZF9maWx0ZXJpbmcsICJBY3RpdmF0ZSBIVyBQSUQgZmlsdGVyaW5nIChkZWZhdWx0OiBvZmYpIik7CisKK3N0YXRpYyBpbnQgdHNfYXV0b19kaXNhYmxlOworbW9kdWxlX3BhcmFtX25hbWVkKHRzX2F1dG9fZGlzYWJsZSwgdHNfYXV0b19kaXNhYmxlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh0c19hdXRvX2Rpc2FibGUsICJTdHJlYW0gQXV0byBFbmFibGUgb24gRlcgKGRlZmF1bHQ6IG9mZikiKTsKKworaW50IGVsbmFfZW5hYmxlID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZChlbG5hX2VuYWJsZSwgZWxuYV9lbmFibGUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVsbmFfZW5hYmxlLCAiQWN0aXZhdGUgZUxOQSAoZGVmYXVsdDogb24pIik7CisKKyNpZmRlZiBEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUgorRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisjZW5kaWYKKworc3RhdGljIHZvaWQgYXMxMDJfc3RvcF9zdHJlYW0oc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpCit7CisJc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwOworCisJaWYgKGRldiAhPSBOVUxMKQorCQlidXNfYWRhcCA9ICZkZXYtPmJ1c19hZGFwOworCWVsc2UKKwkJcmV0dXJuOworCisJaWYgKGJ1c19hZGFwLT5vcHMtPnN0b3Bfc3RyZWFtICE9IE5VTEwpCisJCWJ1c19hZGFwLT5vcHMtPnN0b3Bfc3RyZWFtKGRldik7CisKKwlpZiAodHNfYXV0b19kaXNhYmxlKSB7CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+YnVzX2FkYXAubG9jaykpCisJCQlyZXR1cm47CisKKwkJaWYgKGFzMTB4X2NtZF9zdG9wX3N0cmVhbWluZyhidXNfYWRhcCkgPCAwKQorCQkJZHByaW50ayhkZWJ1ZywgImFzMTB4X2NtZF9zdG9wX3N0cmVhbWluZyBmYWlsZWRcbiIpOworCisJCW11dGV4X3VubG9jaygmZGV2LT5idXNfYWRhcC5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfc3RhcnRfc3RyZWFtKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2KQoreworCXN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcDsKKwlpbnQgcmV0ID0gLUVGQVVMVDsKKworCWlmIChkZXYgIT0gTlVMTCkKKwkJYnVzX2FkYXAgPSAmZGV2LT5idXNfYWRhcDsKKwllbHNlCisJCXJldHVybiByZXQ7CisKKwlpZiAoYnVzX2FkYXAtPm9wcy0+c3RhcnRfc3RyZWFtICE9IE5VTEwpCisJCXJldCA9IGJ1c19hZGFwLT5vcHMtPnN0YXJ0X3N0cmVhbShkZXYpOworCisJaWYgKHRzX2F1dG9fZGlzYWJsZSkgeworCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPmJ1c19hZGFwLmxvY2spKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0ID0gYXMxMHhfY21kX3N0YXJ0X3N0cmVhbWluZyhidXNfYWRhcCk7CisKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1c19hZGFwLmxvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXMxMHhfcGlkX2ZpbHRlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldiwKKwkJCSAgICBpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikgeworCisJc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwID0gJmRldi0+YnVzX2FkYXA7CisJaW50IHJldCA9IC1FRkFVTFQ7CisKKwlFTlRFUigpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5idXNfYWRhcC5sb2NrKSkgeworCQlkcHJpbnRrKGRlYnVnLCAibXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGxvY2spIGZhaWxlZCAhXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzd2l0Y2ggKG9ub2ZmKSB7CisJY2FzZSAwOgorCSAgICByZXQgPSBhczEweF9jbWRfZGVsX1BJRF9maWx0ZXIoYnVzX2FkYXAsICh1aW50MTZfdCkgcGlkKTsKKwkgICAgZHByaW50ayhkZWJ1ZywgIkRFTF9QSURfRklMVEVSKFslMDJkXSAweCUwNHgpIHJldCA9ICVkXG4iLAorCQkgICAgaW5kZXgsIHBpZCwgcmV0KTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCXsKKwkgICAgc3RydWN0IGFzMTB4X3RzX2ZpbHRlciBmaWx0ZXI7CisKKwkgICAgZmlsdGVyLnR5cGUgPSBUU19QSURfVFlQRV9UUzsKKwkgICAgZmlsdGVyLmlkeCA9IDB4RkY7CisJICAgIGZpbHRlci5waWQgPSBwaWQ7CisKKwkgICAgcmV0ID0gYXMxMHhfY21kX2FkZF9QSURfZmlsdGVyKGJ1c19hZGFwLCAmZmlsdGVyKTsKKwkgICAgZHByaW50ayhkZWJ1ZywgIkFERF9QSURfRklMVEVSKFslMDJkIC0+ICUwMmRdLCAweCUwNHgpIHJldCA9ICVkXG4iLAorCQkgICAgaW5kZXgsIGZpbHRlci5pZHgsIGZpbHRlci5waWQsIHJldCk7CisJICAgIGJyZWFrOworCX0KKwl9CisKKwltdXRleF91bmxvY2soJmRldi0+YnVzX2FkYXAubG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZHZiX2RteF9zdGFydF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGR2YmRteGZlZWQtPmRlbXV4OworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2ID0gZGVtdXgtPnByaXY7CisKKwlFTlRFUigpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYXMxMDJfZGV2LT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKHBpZF9maWx0ZXJpbmcpIHsKKwkJYXMxMHhfcGlkX2ZpbHRlcihhczEwMl9kZXYsCisJCQkJZHZiZG14ZmVlZC0+aW5kZXgsIGR2YmRteGZlZWQtPnBpZCwgMSk7CisJfQorCisJaWYgKGFzMTAyX2Rldi0+c3RyZWFtaW5nKysgPT0gMCkKKwkJcmV0ID0gYXMxMDJfc3RhcnRfc3RyZWFtKGFzMTAyX2Rldik7CisKKwltdXRleF91bmxvY2soJmFzMTAyX2Rldi0+c2VtKTsKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZHZiX2RteF9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQoreworCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CisJc3RydWN0IGFzMTAyX2Rldl90ICphczEwMl9kZXYgPSBkZW11eC0+cHJpdjsKKworCUVOVEVSKCk7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhczEwMl9kZXYtPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoLS1hczEwMl9kZXYtPnN0cmVhbWluZyA9PSAwKQorCQlhczEwMl9zdG9wX3N0cmVhbShhczEwMl9kZXYpOworCisJaWYgKHBpZF9maWx0ZXJpbmcpIHsKKwkJYXMxMHhfcGlkX2ZpbHRlcihhczEwMl9kZXYsCisJCQkJZHZiZG14ZmVlZC0+aW5kZXgsIGR2YmRteGZlZWQtPnBpZCwgMCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZhczEwMl9kZXYtPnNlbSk7CisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFzMTAyX2R2Yl9yZWdpc3RlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmFzMTAyX2RldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlFTlRFUigpOworCisJcmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmFzMTAyX2Rldi0+ZHZiX2FkYXAsCisJCQkJICAgYXMxMDJfZGV2LT5uYW1lLAorCQkJCSAgIFRISVNfTU9EVUxFLAorI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1VTQikKKwkJCQkgICAmYXMxMDJfZGV2LT5idXNfYWRhcC51c2JfZGV2LT5kZXYKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FTMTAyX1NQSSkKKwkJCQkgICAmYXMxMDJfZGV2LT5idXNfYWRhcC5zcGlfZGV2LT5kZXYKKyNlbHNlCisjZXJyb3IgPj4+IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyIDw8PAorI2VuZGlmCisjaWZkZWYgRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIKKwkJCQkgICAsIGFkYXB0ZXJfbnIKKyNlbmRpZgorCQkJCSAgICk7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCIlczogZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoKSBmYWlsZWQgKGVycm5vID0gJWQpIiwKKwkJICAgIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlhczEwMl9kZXYtPmR2Yl9kbXgucHJpdiA9IGFzMTAyX2RldjsKKwlhczEwMl9kZXYtPmR2Yl9kbXguZmlsdGVybnVtID0gcGlkX2ZpbHRlcmluZyA/IDE2IDogMjU2OworCWFzMTAyX2Rldi0+ZHZiX2RteC5mZWVkbnVtID0gMjU2OworCWFzMTAyX2Rldi0+ZHZiX2RteC5zdGFydF9mZWVkID0gYXMxMDJfZHZiX2RteF9zdGFydF9mZWVkOworCWFzMTAyX2Rldi0+ZHZiX2RteC5zdG9wX2ZlZWQgPSBhczEwMl9kdmJfZG14X3N0b3BfZmVlZDsKKworCWFzMTAyX2Rldi0+ZHZiX2RteC5kbXguY2FwYWJpbGl0aWVzID0gRE1YX1RTX0ZJTFRFUklORyB8CisJCQkJCSAgICAgIERNWF9TRUNUSU9OX0ZJTFRFUklORzsKKworCWFzMTAyX2Rldi0+ZHZiX2RteGRldi5maWx0ZXJudW0gPSBhczEwMl9kZXYtPmR2Yl9kbXguZmlsdGVybnVtOworCWFzMTAyX2Rldi0+ZHZiX2RteGRldi5kZW11eCA9ICZhczEwMl9kZXYtPmR2Yl9kbXguZG14OworCWFzMTAyX2Rldi0+ZHZiX2RteGRldi5jYXBhYmlsaXRpZXMgPSAwOworCisJcmV0ID0gZHZiX2RteF9pbml0KCZhczEwMl9kZXYtPmR2Yl9kbXgpOworCWlmIChyZXQgPCAwKSB7CisJCWVycigiJXM6IGR2Yl9kbXhfaW5pdCgpIGZhaWxlZCAoZXJybm8gPSAlZCkiLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJcmV0ID0gZHZiX2RteGRldl9pbml0KCZhczEwMl9kZXYtPmR2Yl9kbXhkZXYsICZhczEwMl9kZXYtPmR2Yl9hZGFwKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnIoIiVzOiBkdmJfZG14ZGV2X2luaXQoKSBmYWlsZWQgKGVycm5vID0gJWQpIiwgX19mdW5jX18sCisJCSAgICByZXQpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlyZXQgPSBhczEwMl9kdmJfcmVnaXN0ZXJfZmUoYXMxMDJfZGV2LCAmYXMxMDJfZGV2LT5kdmJfZmUpOworCWlmIChyZXQgPCAwKSB7CisJCWVycigiJXM6IGFzMTAyX2R2Yl9yZWdpc3Rlcl9mcm9udGVuZCgpIGZhaWxlZCAoZXJybm8gPSAlZCkiLAorCQkgICAgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qIGluaXQgYnVzIG11dGV4IGZvciB0b2tlbiBsb2NraW5nICovCisJbXV0ZXhfaW5pdCgmYXMxMDJfZGV2LT5idXNfYWRhcC5sb2NrKTsKKworCS8qIGluaXQgc3RhcnQgLyBzdG9wIHN0cmVhbSBtdXRleCAqLworCW11dGV4X2luaXQoJmFzMTAyX2Rldi0+c2VtKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0ZXX0xPQURFUikgfHwgZGVmaW5lZChDT05GSUdfRldfTE9BREVSX01PRFVMRSkKKwkvKgorCSAqIHRyeSB0byBsb2FkIGFzMTAyIGZpcm13YXJlLiBJZiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkLCB3ZSdsbCBiZQorCSAqIGFibGUgdG8gdXBsb2FkIGl0IGxhdGVyLgorCSAqLworCWlmIChmd191cGxvYWQpCisJCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGFzMTAyX2Z3X3VwbG9hZCgmYXMxMDJfZGV2LT5idXNfYWRhcCksCisJCQkJImZpcm13YXJlX2NsYXNzIik7CisjZW5kaWYKKworZmFpbGVkOgorCUxFQVZFKCk7CisJLyogRklYTUU6IGZyZWUgZHZiX1hYWCAqLworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXMxMDJfZHZiX3VucmVnaXN0ZXIoc3RydWN0IGFzMTAyX2Rldl90ICphczEwMl9kZXYpCit7CisJRU5URVIoKTsKKworCS8qIHVucmVnaXN0ZXIgYXMxMDIgZnJvbnRlbmQgKi8KKwlhczEwMl9kdmJfdW5yZWdpc3Rlcl9mZSgmYXMxMDJfZGV2LT5kdmJfZmUpOworCisJLyogdW5yZWdpc3RlciBkZW11eCBkZXZpY2UgKi8KKwlkdmJfZG14ZGV2X3JlbGVhc2UoJmFzMTAyX2Rldi0+ZHZiX2RteGRldik7CisJZHZiX2RteF9yZWxlYXNlKCZhczEwMl9kZXYtPmR2Yl9kbXgpOworCisJLyogdW5yZWdpc3RlciBkdmIgYWRhcHRlciAqLworCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmFzMTAyX2Rldi0+ZHZiX2FkYXApOworCisJTEVBVkUoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXMxMDJfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBsb3cgbGV2ZWwgc3Vic3lzdGVtICovCisjaWYgZGVmaW5lZChDT05GSUdfQVMxMDJfVVNCKQorCXJldCA9IHVzYl9yZWdpc3RlcigmYXMxMDJfdXNiX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkIChyZXQgPSAlZCkiLCByZXQpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVMxMDJfU1BJKQorCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFzMTAyX3NwaV9kcml2ZXIpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAic3BpX3JlZ2lzdGVyIGZhaWxlZCAocmV0ID0gJWQpIiwgcmV0KTsKKyNlbmRpZgorCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTWFuZGF0b3J5IGZ1bmN0aW9uIDogQWRkcyBhIHNwZWNpYWwgc2VjdGlvbiB0byB0aGUgbW9kdWxlIGluZGljYXRpbmcKKyAqIHdoZXJlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGlzIGRlZmluZWQKKyAqLworbW9kdWxlX2luaXQoYXMxMDJfZHJpdmVyX2luaXQpOworCisvKioKKyAqIGFzMTAyX2RyaXZlcl9leGl0IC0gYXMxMDIgZHJpdmVyIGV4aXQgcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRldmljZSBoYXMgdG8gYmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGFzMTAyX2RyaXZlcl9leGl0KHZvaWQpCit7CisJRU5URVIoKTsKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIGxvdyBsZXZlbCBidXMgc3Vic3lzdGVtICovCisjaWYgZGVmaW5lZChDT05GSUdfQVMxMDJfVVNCKQorCXVzYl9kZXJlZ2lzdGVyKCZhczEwMl91c2JfZHJpdmVyKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1NQSSkKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFzMTAyX3NwaV9kcml2ZXIpOworI2VuZGlmCisJTEVBVkUoKTsKK30KKworLyoKKyAqIHJlcXVpcmVkIGZ1bmN0aW9uIGZvciB1bmxvYWQ6IEFkZHMgYSBzcGVjaWFsIHNlY3Rpb24gdG8gdGhlIG1vZHVsZQorICogaW5kaWNhdGluZyB3aGVyZSB1bmxvYWQgZnVuY3Rpb24gaXMgZGVmaW5lZAorICovCittb2R1bGVfZXhpdChhczEwMl9kcml2ZXJfZXhpdCk7CisvKiBtb2RpbmZvIGRldGFpbHMgKi8KK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfRlVMTF9OQU1FKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4iKTsKKworLyogRU9GIC0gdmltOiBzZXQgdGV4dHdpZHRoPTgwIHRzPTggc3c9OCBzdHM9OCBub2V0OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZGE2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZHJ2LmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1VTQikKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KK2V4dGVybiBzdHJ1Y3QgdXNiX2RyaXZlciBhczEwMl91c2JfZHJpdmVyOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9TUEkpCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKworZXh0ZXJuIHN0cnVjdCBzcGlfZHJpdmVyIGFzMTAyX3NwaV9kcml2ZXI7CisjZW5kaWYKKworI2luY2x1ZGUgImR2Yl9kZW11eC5oIgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImRteGRldi5oIgorCisjZGVmaW5lIERSSVZFUl9GVUxMX05BTUUgIkFiaWxpcyBTeXN0ZW1zIGFzMTB4IHVzYiBkcml2ZXIiCisjZGVmaW5lIERSSVZFUl9OQU1FICJhczEweF91c2IiCisKK2V4dGVybiBpbnQgZGVidWc7CisKKyNkZWZpbmUgZHByaW50ayhkZWJ1ZywgYXJncy4uLikgXAorCWRvIHsgaWYgKGRlYnVnKSB7CVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiLF9fRlVOQ1RJT05fXyk7CVwKKwkJcHJpbnRrKGFyZ3MpOwlcCisJfSB9IHdoaWxlICgwKQorCisjaWZkZWYgVFJBQ0UKKyNkZWZpbmUgRU5URVIoKSAgICAgICAgICAgICAgICAgcHJpbnRrKCI+PiBlbnRlciAlc1xuIiwgX19GVU5DVElPTl9fKQorI2RlZmluZSBMRUFWRSgpICAgICAgICAgICAgICAgICBwcmludGsoIjw8IGxlYXZlICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZWxzZQorI2RlZmluZSBFTlRFUigpCisjZGVmaW5lIExFQVZFKCkKKyNlbmRpZgorCisjZGVmaW5lIEFTMTAyX0RFVklDRV9NQUpPUgkxOTIKKworI2RlZmluZSBBUzEwMl9VU0JfQlVGX1NJWkUJNTEyCisjZGVmaW5lIE1BWF9TVFJFQU1fVVJCCQkzMgorCisjaW5jbHVkZSAiYXMxMHhfY21kLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9VU0IpCisjaW5jbHVkZSAiYXMxMDJfdXNiX2Rydi5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9TUEkpCisjaW5jbHVkZSAiYXMxMHhfc3BpX2Rydi5oIgorI2VuZGlmCisKKworc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgeworI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1VTQikKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FTMTAyX1NQSSkKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKKwlzdHJ1Y3QgY2RldiBjZGV2OyAvKiBzcGlkZXYgcmF3IGRldmljZSAqLworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IGNvbXBsZXRpb24geGZlcl9kb25lOworI2VuZGlmCisJLyogYnVzIHRva2VuIGxvY2sgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwkvKiBsb3cgbGV2ZWwgaW50ZXJmYWNlIGZvciBidXMgYWRhcHRlciAqLworCXVuaW9uIGFzMTB4X2J1c190b2tlbl90IHsKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9VU0IpCisJCS8qIHVzYiB0b2tlbiAqLworCQlzdHJ1Y3QgYXMxMHhfdXNiX3Rva2VuX2NtZF90IHVzYjsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1NQSSkKKwkJLyogc3BpIHRva2VuICovCisJCXN0cnVjdCBhczEweF9zcGlfdG9rZW5fY21kX3Qgc3BpOworI2VuZGlmCisJfSB0b2tlbjsKKworCS8qIHRva2VuIGNtZCB4ZmVyIGlkICovCisJdWludDE2X3QgY21kX3hpZDsKKworCS8qIGFzMTB4IGNvbW1hbmQgYW5kIHJlc3BvbnNlIGZvciBkdmIgaW50ZXJmYWNlKi8KKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKmNtZCwgKnJzcDsKKworCS8qIGJ1cyBhZGFwdGVyIHByaXZhdGUgb3BzIGNhbGxiYWNrICovCisJc3RydWN0IGFzMTAyX3ByaXZfb3BzX3QgKm9wczsKK307CisKK3N0cnVjdCBhczEwMl9kZXZfdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCBidXNfYWRhcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZV9lbnRyeTsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXVuc2lnbmVkIGxvbmcgbWlub3I7CisKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgZHZiX2FkYXA7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBkdmJfZmU7CisJc3RydWN0IGR2Yl9kZW11eCBkdmJfZG14OworCXN0cnVjdCBkbXhkZXYgZHZiX2RteGRldjsKKworCS8qIGRlbW9kdWxhdG9yIHN0YXRzICovCisJc3RydWN0IGFzMTB4X2RlbW9kX3N0YXRzIGRlbW9kX3N0YXRzOworCS8qIHNpZ25hbCBzdHJlbmd0aCAqLworCXVpbnQxNl90IHNpZ25hbF9zdHJlbmd0aDsKKwkvKiBiaXQgZXJyb3IgcmF0ZSAqLworCXVpbnQzMl90IGJlcjsKKworCS8qIHRpbWVyIGhhbmRsZSB0byB0cmlnIHRzIHN0cmVhbSBkb3dubG9hZCAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX2hhbmRsZTsKKworCXN0cnVjdCBtdXRleCBzZW07CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl2b2lkICpzdHJlYW07CisJaW50IHN0cmVhbWluZzsKKwlzdHJ1Y3QgdXJiICpzdHJlYW1fdXJiW01BWF9TVFJFQU1fVVJCXTsKK307CisKK2ludCBhczEwMl9kdmJfcmVnaXN0ZXIoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpOwordm9pZCBhczEwMl9kdmJfdW5yZWdpc3RlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7CisKK2ludCBhczEwMl9kdmJfcmVnaXN0ZXJfZmUoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYsIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKK2ludCBhczEwMl9kdmJfdW5yZWdpc3Rlcl9mZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkZXYpOworCisvKiBFT0YgLSB2aW06IHNldCB0ZXh0d2lkdGg9ODAgdHM9OCBzdz04IHN0cz04IG5vZXQ6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9mZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NTBmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZmUuYwpAQCAtMCwwICsxLDYwMyBAQAorLyoKKyAqIEFiaWxpcyBTeXN0ZW1zIFNpbmdsZSBEVkItVCBSZWNlaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBEZXZpbiBIZWl0bXVlbGxlciA8ZGhlaXRtdWVsbGVyQGtlcm5lbGxhYnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAiYXMxMDJfZHJ2LmgiCisjaW5jbHVkZSAiYXMxMHhfdHlwZXMuaCIKKyNpbmNsdWRlICJhczEweF9jbWQuaCIKKworZXh0ZXJuIGludCBlbG5hX2VuYWJsZTsKKworc3RhdGljIHZvaWQgYXMxMHhfZmVfY29weV90cHNfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmRzdCwKKwkJCQkJIHN0cnVjdCBhczEweF90cHMgKnNyYyk7CisKK3N0YXRpYyB2b2lkIGFzMTAyX2ZlX2NvcHlfdHVuZV9wYXJhbWV0ZXJzKHN0cnVjdCBhczEweF90dW5lX2FyZ3MgKmRzdCwKKwkJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnNyYyk7CisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKwlzdHJ1Y3QgYXMxMHhfdHVuZV9hcmdzIHR1bmVfYXJncyA9IHsgMCB9OworCisJRU5URVIoKTsKKworCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+YnVzX2FkYXAubG9jaykpCisJCXJldHVybiAtRUJVU1k7CisKKwlhczEwMl9mZV9jb3B5X3R1bmVfcGFyYW1ldGVycygmdHVuZV9hcmdzLCBwYXJhbXMpOworCisJLyogc2VuZCBhYmlsaXMgY29tbWFuZDogU0VUX1RVTkUgKi8KKwlyZXQgPSAgYXMxMHhfY21kX3NldF90dW5lKCZkZXYtPmJ1c19hZGFwLCAmdHVuZV9hcmdzKTsKKwlpZiAocmV0ICE9IDApCisJCWRwcmludGsoZGVidWcsICJhczEweF9jbWRfc2V0X3R1bmUgZmFpbGVkLiAoZXJyID0gJWQpXG4iLCByZXQpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1c19hZGFwLmxvY2spOworCisJTEVBVkUoKTsKKwlyZXR1cm4gKHJldCA8IDApID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApIHsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKwlzdHJ1Y3QgYXMxMHhfdHBzIHRwcyA9IHsgMCB9OworCisJRU5URVIoKTsKKworCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+YnVzX2FkYXAubG9jaykpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBzZW5kIGFiaWxpcyBjb21tYW5kOiBHRVRfVFBTICovCisJcmV0ID0gYXMxMHhfY21kX2dldF90cHMoJmRldi0+YnVzX2FkYXAsICZ0cHMpOworCisJaWYgKHJldCA9PSAwKQorCQlhczEweF9mZV9jb3B5X3Rwc19wYXJhbWV0ZXJzKHAsICZ0cHMpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1c19hZGFwLmxvY2spOworCisJTEVBVkUoKTsKKwlyZXR1cm4gKHJldCA8IDApID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnNldHRpbmdzKSB7CisJRU5URVIoKTsKKworI2lmIDAKKwlkcHJpbnRrKGRlYnVnLCAic3RlcF9zaXplICAgID0gJWRcbiIsIHNldHRpbmdzLT5zdGVwX3NpemUpOworCWRwcmludGsoZGVidWcsICJtYXhfZHJpZnQgICAgPSAlZFxuIiwgc2V0dGluZ3MtPm1heF9kcmlmdCk7CisJZHByaW50ayhkZWJ1ZywgIm1pbl9kZWxheV9tcyA9ICVkIC0+ICVkXG4iLCBzZXR0aW5ncy0+bWluX2RlbGF5X21zLAorCQkxMDAwKTsKKyNlbmRpZgorCisJc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDEwMDA7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFzMTAyX2Rldl90ICpkZXY7CisJc3RydWN0IGFzMTB4X3R1bmVfc3RhdHVzIHRzdGF0ZSA9IHsgMCB9OworCisJRU5URVIoKTsKKworCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+YnVzX2FkYXAubG9jaykpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBzZW5kIGFiaWxpcyBjb21tYW5kOiBHRVRfVFVORV9TVEFUVVMgKi8KKwlyZXQgPSBhczEweF9jbWRfZ2V0X3R1bmVfc3RhdHVzKCZkZXYtPmJ1c19hZGFwLCAmdHN0YXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkcHJpbnRrKGRlYnVnLCAiYXMxMHhfY21kX2dldF90dW5lX3N0YXR1cyBmYWlsZWQgKGVyciA9ICVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWRldi0+c2lnbmFsX3N0cmVuZ3RoICA9IHRzdGF0ZS5zaWduYWxfc3RyZW5ndGg7CisJZGV2LT5iZXIgID0gdHN0YXRlLkJFUjsKKworCXN3aXRjaCAodHN0YXRlLnR1bmVfc3RhdGUpIHsKKwljYXNlIFRVTkVfU1RBVFVTX1NJR05BTF9EVkJfT0s6CisJCSpzdGF0dXMgPSBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVI7CisJCWJyZWFrOworCWNhc2UgVFVORV9TVEFUVVNfU1RSRUFNX0RFVEVDVEVEOgorCQkqc3RhdHVzID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX1NZTkM7CisJCWJyZWFrOworCWNhc2UgVFVORV9TVEFUVVNfU1RSRUFNX1RVTkVEOgorCQkqc3RhdHVzID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX1NZTkMgfAorCQkJRkVfSEFTX0xPQ0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpzdGF0dXMgPSBUVU5FX1NUQVRVU19OT1RfVFVORUQ7CisJfQorCisJZHByaW50ayhkZWJ1ZywgInR1bmVyIHN0YXR1czogMHglMDJ4LCBzdHJlbmd0aCAlZCwgcGVyOiAlZCwgYmVyOiAlZFxuIiwKKwkJCXRzdGF0ZS50dW5lX3N0YXRlLCB0c3RhdGUuc2lnbmFsX3N0cmVuZ3RoLAorCQkJdHN0YXRlLlBFUiwgdHN0YXRlLkJFUik7CisKKwlpZiAoKnN0YXR1cyAmIEZFX0hBU19MT0NLKSB7CisJCWlmIChhczEweF9jbWRfZ2V0X2RlbW9kX3N0YXRzKCZkZXYtPmJ1c19hZGFwLAorCQkJKHN0cnVjdCBhczEweF9kZW1vZF9zdGF0cyAqKSAmZGV2LT5kZW1vZF9zdGF0cykgPCAwKSB7CisJCQltZW1zZXQoJmRldi0+ZGVtb2Rfc3RhdHMsIDAsIHNpemVvZihkZXYtPmRlbW9kX3N0YXRzKSk7CisJCQlkcHJpbnRrKGRlYnVnLCAiYXMxMHhfY21kX2dldF9kZW1vZF9zdGF0cyBmYWlsZWQgIgorCQkJCSIocHJvYmFibHkgbm90IHR1bmVkKVxuIik7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKGRlYnVnLAorCQkJCSJkZW1vZCBzdGF0dXM6IGZjOiAweCUwOHgsIGJhZCBmYzogMHglMDh4LCAiCisJCQkJImJ5dGVzIGNvcnJlY3RlZDogMHglMDh4ICwgTUVSOiAweCUwNHhcbiIsCisJCQkJZGV2LT5kZW1vZF9zdGF0cy5mcmFtZV9jb3VudCwKKwkJCQlkZXYtPmRlbW9kX3N0YXRzLmJhZF9mcmFtZV9jb3VudCwKKwkJCQlkZXYtPmRlbW9kX3N0YXRzLmJ5dGVzX2ZpeGVkX2J5X3JzLAorCQkJCWRldi0+ZGVtb2Rfc3RhdHMubWVyKTsKKwkJfQorCX0gZWxzZSB7CisJCW1lbXNldCgmZGV2LT5kZW1vZF9zdGF0cywgMCwgc2l6ZW9mKGRldi0+ZGVtb2Rfc3RhdHMpKTsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJmRldi0+YnVzX2FkYXAubG9jayk7CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTm90ZToKKyAqIC0gaW4gQVMxMDIgU05SPU1FUgorICogICAtIHRoZSBTTlIgd2lsbCBiZSByZXR1cm5lZCBpbiBsaW5lYXIgdGVybXMsIGkuZS4gbm90IGluIGRCCisgKiAgIC0gdGhlIGFjY3VyYWN5IGVxdWFscyDCsTJkQiBmb3IgYSBTTlIgcmFuZ2UgZnJvbSA0ZEIgdG8gMzBkQgorICogICAtIHRoZSBhY2N1cmFjeSBpcyA+MmRCIGZvciBTTlIgdmFsdWVzIG91dHNpZGUgdGhpcyByYW5nZQorICovCitzdGF0aWMgaW50IGFzMTAyX2ZlX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKnNucikKK3sKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqc25yID0gZGV2LT5kZW1vZF9zdGF0cy5tZXI7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzMTAyX2ZlX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJlcikKK3sKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqYmVyID0gZGV2LT5iZXI7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzMTAyX2ZlX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkgdTE2ICpzdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqc3RyZW5ndGggPSAoKCgweGZmZmYgKiA0MDApICogZGV2LT5zaWduYWxfc3RyZW5ndGggKyA0MTAwMCkgKiAyKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZGV2LT5kZW1vZF9zdGF0cy5oYXNfc3RhcnRlZCkKKwkJKnVjYmxvY2tzID0gZGV2LT5kZW1vZF9zdGF0cy5iYWRfZnJhbWVfY291bnQ7CisJZWxzZQorCQkqdWNibG9ja3MgPSAwOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhczEwMl9mZV90c19idXNfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGFjcXVpcmUpCit7CisJc3RydWN0IGFzMTAyX2Rldl90ICpkZXY7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPmJ1c19hZGFwLmxvY2spKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGFjcXVpcmUpIHsKKwkJaWYgKGVsbmFfZW5hYmxlKQorCQkJYXMxMHhfY21kX3NldF9jb250ZXh0KCZkZXYtPmJ1c19hZGFwLCAxMDEwLCAweEMwKTsKKworCQlyZXQgPSBhczEweF9jbWRfdHVybl9vbigmZGV2LT5idXNfYWRhcCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gYXMxMHhfY21kX3R1cm5fb2ZmKCZkZXYtPmJ1c19hZGFwKTsKKwl9CisKKwltdXRleF91bmxvY2soJmRldi0+YnVzX2FkYXAubG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBhczEwMl9mZV9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lCQkJPSAiVW5rbm93biBBUzEwMiBkZXZpY2UiLAorCQkudHlwZQkJCT0gRkVfT0ZETSwKKwkJLmZyZXF1ZW5jeV9taW4JCT0gMTc0MDAwMDAwLAorCQkuZnJlcXVlbmN5X21heAkJPSA4NjIwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUJPSAxNjY2NjcsCisJCS5jYXBzID0gRkVfQ0FOX0lOVkVSU0lPTl9BVVRPCisJCQl8IEZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfCBGRV9DQU5fRkVDXzNfNAorCQkJfCBGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwgRkVfQ0FOX0ZFQ19BVVRPCisJCQl8IEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fUUFNXzY0IHwgRkVfQ0FOX1FQU0sKKwkJCXwgRkVfQ0FOX1FBTV9BVVRPCisJCQl8IEZFX0NBTl9UUkFOU01JU1NJT05fTU9ERV9BVVRPCisJCQl8IEZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPCisJCQl8IEZFX0NBTl9ISUVSQVJDSFlfQVVUTworCQkJfCBGRV9DQU5fUkVDT1ZFUgorCQkJfCBGRV9DQU5fTVVURV9UUworCX0sCisKKwkuc2V0X2Zyb250ZW5kCQk9IGFzMTAyX2ZlX3NldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kCQk9IGFzMTAyX2ZlX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MJPSBhczEwMl9mZV9nZXRfdHVuZV9zZXR0aW5ncywKKworCS5yZWFkX3N0YXR1cwkJPSBhczEwMl9mZV9yZWFkX3N0YXR1cywKKwkucmVhZF9zbnIJCT0gYXMxMDJfZmVfcmVhZF9zbnIsCisJLnJlYWRfYmVyCQk9IGFzMTAyX2ZlX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aAk9IGFzMTAyX2ZlX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3VjYmxvY2tzCQk9IGFzMTAyX2ZlX3JlYWRfdWNibG9ja3MsCisJLnRzX2J1c19jdHJsCQk9IGFzMTAyX2ZlX3RzX2J1c19jdHJsLAorfTsKKworaW50IGFzMTAyX2R2Yl91bnJlZ2lzdGVyX2ZlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCS8qIHVucmVnaXN0ZXIgZnJvbnRlbmQgKi8KKwlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChmZSk7CisKKwkvKiBkZXRhY2ggZnJvbnRlbmQgKi8KKwlkdmJfZnJvbnRlbmRfZGV0YWNoKGZlKTsKKworCXJldHVybiAwOworfQorCitpbnQgYXMxMDJfZHZiX3JlZ2lzdGVyX2ZlKHN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2LAorCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkdmJfZmUpCit7CisJaW50IGVycm5vOworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXA7CisKKwlpZiAoYXMxMDJfZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZXh0cmFjdCBkdmJfYWRhcHRlciAqLworCWR2Yl9hZGFwID0gJmFzMTAyX2Rldi0+ZHZiX2FkYXA7CisKKwkvKiBpbml0IGZyb250ZW5kIGNhbGxiYWNrIG9wcyAqLworCW1lbWNweSgmZHZiX2ZlLT5vcHMsICZhczEwMl9mZV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0cm5jcHkoZHZiX2ZlLT5vcHMuaW5mby5uYW1lLCBhczEwMl9kZXYtPm5hbWUsCisJCXNpemVvZihkdmJfZmUtPm9wcy5pbmZvLm5hbWUpKTsKKworCS8qIHJlZ2lzdGVyIGRidmIgZnJvbnRlbmQgKi8KKwllcnJubyA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZChkdmJfYWRhcCwgZHZiX2ZlKTsKKwlpZiAoZXJybm8gPT0gMCkKKwkJZHZiX2ZlLT50dW5lcl9wcml2ID0gYXMxMDJfZGV2OworCisJcmV0dXJuIGVycm5vOworfQorCitzdGF0aWMgdm9pZCBhczEweF9mZV9jb3B5X3Rwc19wYXJhbWV0ZXJzKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZHN0LAorCQkJCQkgc3RydWN0IGFzMTB4X3RwcyAqYXMxMHhfdHBzKQoreworCisJc3RydWN0IGR2Yl9vZmRtX3BhcmFtZXRlcnMgKmZlX3RwcyA9ICZkc3QtPnUub2ZkbTsKKworCS8qIGV4dHJhY3QgY29uc3RlYWxsYXRpb24gKi8KKwlzd2l0Y2ggKGFzMTB4X3Rwcy0+Y29uc3RlbGxhdGlvbikgeworCWNhc2UgQ09OU1RfUVBTSzoKKwkJZmVfdHBzLT5jb25zdGVsbGF0aW9uID0gUVBTSzsKKwkJYnJlYWs7CisJY2FzZSBDT05TVF9RQU0xNjoKKwkJZmVfdHBzLT5jb25zdGVsbGF0aW9uID0gUUFNXzE2OworCQlicmVhazsKKwljYXNlIENPTlNUX1FBTTY0OgorCQlmZV90cHMtPmNvbnN0ZWxsYXRpb24gPSBRQU1fNjQ7CisJCWJyZWFrOworCX0KKworCS8qIGV4dHJhY3QgaGllcmFyY2h5ICovCisJc3dpdGNoIChhczEweF90cHMtPmhpZXJhcmNoeSkgeworCWNhc2UgSElFUl9OT05FOgorCQlmZV90cHMtPmhpZXJhcmNoeV9pbmZvcm1hdGlvbiA9IEhJRVJBUkNIWV9OT05FOworCQlicmVhazsKKwljYXNlIEhJRVJfQUxQSEFfMToKKwkJZmVfdHBzLT5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPSBISUVSQVJDSFlfMTsKKwkJYnJlYWs7CisJY2FzZSBISUVSX0FMUEhBXzI6CisJCWZlX3Rwcy0+aGllcmFyY2h5X2luZm9ybWF0aW9uID0gSElFUkFSQ0hZXzI7CisJCWJyZWFrOworCWNhc2UgSElFUl9BTFBIQV80OgorCQlmZV90cHMtPmhpZXJhcmNoeV9pbmZvcm1hdGlvbiA9IEhJRVJBUkNIWV80OworCQlicmVhazsKKwl9CisKKwkvKiBleHRyYWN0IGNvZGUgcmF0ZSBIUCAqLworCXN3aXRjaCAoYXMxMHhfdHBzLT5jb2RlX3JhdGVfSFApIHsKKwljYXNlIENPREVfUkFURV8xXzI6CisJCWZlX3Rwcy0+Y29kZV9yYXRlX0hQID0gRkVDXzFfMjsKKwkJYnJlYWs7CisJY2FzZSBDT0RFX1JBVEVfMl8zOgorCQlmZV90cHMtPmNvZGVfcmF0ZV9IUCA9IEZFQ18yXzM7CisJCWJyZWFrOworCWNhc2UgQ09ERV9SQVRFXzNfNDoKKwkJZmVfdHBzLT5jb2RlX3JhdGVfSFAgPSBGRUNfM180OworCQlicmVhazsKKwljYXNlIENPREVfUkFURV81XzY6CisJCWZlX3Rwcy0+Y29kZV9yYXRlX0hQID0gRkVDXzVfNjsKKwkJYnJlYWs7CisJY2FzZSBDT0RFX1JBVEVfN184OgorCQlmZV90cHMtPmNvZGVfcmF0ZV9IUCA9IEZFQ183Xzg7CisJCWJyZWFrOworCX0KKworCS8qIGV4dHJhY3QgY29kZSByYXRlIExQICovCisJc3dpdGNoIChhczEweF90cHMtPmNvZGVfcmF0ZV9MUCkgeworCWNhc2UgQ09ERV9SQVRFXzFfMjoKKwkJZmVfdHBzLT5jb2RlX3JhdGVfTFAgPSBGRUNfMV8yOworCQlicmVhazsKKwljYXNlIENPREVfUkFURV8yXzM6CisJCWZlX3Rwcy0+Y29kZV9yYXRlX0xQID0gRkVDXzJfMzsKKwkJYnJlYWs7CisJY2FzZSBDT0RFX1JBVEVfM180OgorCQlmZV90cHMtPmNvZGVfcmF0ZV9MUCA9IEZFQ18zXzQ7CisJCWJyZWFrOworCWNhc2UgQ09ERV9SQVRFXzVfNjoKKwkJZmVfdHBzLT5jb2RlX3JhdGVfTFAgPSBGRUNfNV82OworCQlicmVhazsKKwljYXNlIENPREVfUkFURV83Xzg6CisJCWZlX3Rwcy0+Y29kZV9yYXRlX0xQID0gRkVDXzdfODsKKwkJYnJlYWs7CisJfQorCisJLyogZXh0cmFjdCBndWFyZCBpbnRlcnZhbCAqLworCXN3aXRjaCAoYXMxMHhfdHBzLT5ndWFyZF9pbnRlcnZhbCkgeworCWNhc2UgR1VBUkRfSU5UXzFfMzI6CisJCWZlX3Rwcy0+Z3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRFUlZBTF8xXzMyOworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVF8xXzE2OgorCQlmZV90cHMtPmd1YXJkX2ludGVydmFsID0gR1VBUkRfSU5URVJWQUxfMV8xNjsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRfMV84OgorCQlmZV90cHMtPmd1YXJkX2ludGVydmFsID0gR1VBUkRfSU5URVJWQUxfMV84OworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVF8xXzQ6CisJCWZlX3Rwcy0+Z3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRFUlZBTF8xXzQ7CisJCWJyZWFrOworCX0KKworCS8qIGV4dHJhY3QgdHJhbnNtaXNzaW9uIG1vZGUgKi8KKwlzd2l0Y2ggKGFzMTB4X3Rwcy0+dHJhbnNtaXNzaW9uX21vZGUpIHsKKwljYXNlIFRSQU5TX01PREVfMks6CisJCWZlX3Rwcy0+dHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV8ySzsKKwkJYnJlYWs7CisJY2FzZSBUUkFOU19NT0RFXzhLOgorCQlmZV90cHMtPnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNNSVNTSU9OX01PREVfOEs7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHVpbnQ4X3QgYXMxMDJfZmVfZ2V0X2NvZGVfcmF0ZShmZV9jb2RlX3JhdGVfdCBhcmcpCit7CisJdWludDhfdCBjOworCisJc3dpdGNoIChhcmcpIHsKKwljYXNlIEZFQ18xXzI6CisJCWMgPSBDT0RFX1JBVEVfMV8yOworCQlicmVhazsKKwljYXNlIEZFQ18yXzM6CisJCWMgPSBDT0RFX1JBVEVfMl8zOworCQlicmVhazsKKwljYXNlIEZFQ18zXzQ6CisJCWMgPSBDT0RFX1JBVEVfM180OworCQlicmVhazsKKwljYXNlIEZFQ181XzY6CisJCWMgPSBDT0RFX1JBVEVfNV82OworCQlicmVhazsKKwljYXNlIEZFQ183Xzg6CisJCWMgPSBDT0RFX1JBVEVfN184OworCQlicmVhazsKKwlkZWZhdWx0OgorCQljID0gQ09ERV9SQVRFX1VOS05PV047CisJCWJyZWFrOworCX0KKworCXJldHVybiBjOworfQorCitzdGF0aWMgdm9pZCBhczEwMl9mZV9jb3B5X3R1bmVfcGFyYW1ldGVycyhzdHJ1Y3QgYXMxMHhfdHVuZV9hcmdzICp0dW5lX2FyZ3MsCisJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCisJLyogc2V0IGZyZXF1ZW5jeSAqLworCXR1bmVfYXJncy0+ZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTAwMDsKKworCS8qIGZpeCBpbnRlcmxlYXZpbmdfbW9kZSAqLworCXR1bmVfYXJncy0+aW50ZXJsZWF2aW5nX21vZGUgPSBJTlRMVl9OQVRJVkU7CisKKwlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgeworCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQl0dW5lX2FyZ3MtPmJhbmR3aWR0aCA9IEJXXzhfTUhaOworCQlicmVhazsKKwljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJdHVuZV9hcmdzLT5iYW5kd2lkdGggPSBCV183X01IWjsKKwkJYnJlYWs7CisJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCXR1bmVfYXJncy0+YmFuZHdpZHRoID0gQldfNl9NSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXR1bmVfYXJncy0+YmFuZHdpZHRoID0gQldfOF9NSFo7CisJfQorCisJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCkgeworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8zMjoKKwkJdHVuZV9hcmdzLT5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVF8xXzMyOworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVEVSVkFMXzFfMTY6CisJCXR1bmVfYXJncy0+Z3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRfMV8xNjsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzg6CisJCXR1bmVfYXJncy0+Z3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRfMV84OworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVEVSVkFMXzFfNDoKKwkJdHVuZV9hcmdzLT5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVF8xXzQ7CisJCWJyZWFrOworCWNhc2UgR1VBUkRfSU5URVJWQUxfQVVUTzoKKwlkZWZhdWx0OgorCQl0dW5lX2FyZ3MtPmd1YXJkX2ludGVydmFsID0gR1VBUkRfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS5jb25zdGVsbGF0aW9uKSB7CisJY2FzZSBRUFNLOgorCQl0dW5lX2FyZ3MtPmNvbnN0ZWxsYXRpb24gPSBDT05TVF9RUFNLOworCQlicmVhazsKKwljYXNlIFFBTV8xNjoKKwkJdHVuZV9hcmdzLT5jb25zdGVsbGF0aW9uID0gQ09OU1RfUUFNMTY7CisJCWJyZWFrOworCWNhc2UgUUFNXzY0OgorCQl0dW5lX2FyZ3MtPmNvbnN0ZWxsYXRpb24gPSBDT05TVF9RQU02NDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHVuZV9hcmdzLT5jb25zdGVsbGF0aW9uID0gQ09OU1RfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSkgeworCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfMks6CisJCXR1bmVfYXJncy0+dHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU19NT0RFXzJLOworCQlicmVhazsKKwljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzhLOgorCQl0dW5lX2FyZ3MtPnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNfTU9ERV84SzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHVuZV9hcmdzLT50cmFuc21pc3Npb25fbW9kZSA9IFRSQU5TX01PREVfVU5LTk9XTjsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmhpZXJhcmNoeV9pbmZvcm1hdGlvbikgeworCWNhc2UgSElFUkFSQ0hZX05PTkU6CisJCXR1bmVfYXJncy0+aGllcmFyY2h5ID0gSElFUl9OT05FOworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV8xOgorCQl0dW5lX2FyZ3MtPmhpZXJhcmNoeSA9IEhJRVJfQUxQSEFfMTsKKwkJYnJlYWs7CisJY2FzZSBISUVSQVJDSFlfMjoKKwkJdHVuZV9hcmdzLT5oaWVyYXJjaHkgPSBISUVSX0FMUEhBXzI7CisJCWJyZWFrOworCWNhc2UgSElFUkFSQ0hZXzQ6CisJCXR1bmVfYXJncy0+aGllcmFyY2h5ID0gSElFUl9BTFBIQV80OworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV9BVVRPOgorCQl0dW5lX2FyZ3MtPmhpZXJhcmNoeSA9IEhJRVJfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJZHByaW50ayhkZWJ1ZywgInR1bmVyIHBhcmFtZXRlcnM6IGZyZXE6ICVkICBidzogMHglMDJ4ICBnaTogMHglMDJ4XG4iLAorCQkJcGFyYW1zLT5mcmVxdWVuY3ksCisJCQl0dW5lX2FyZ3MtPmJhbmR3aWR0aCwKKwkJCXR1bmVfYXJncy0+Z3VhcmRfaW50ZXJ2YWwpOworCisJLyoKKwkgKiBEZXRlY3QgYSBoaWVyYXJjaHkgc2VsZWN0aW9uCisJICogaWYgSFAvTFAgYXJlIGJvdGggc2V0IHRvIEZFQ19OT05FLCBIUCB3aWxsIGJlIHNlbGVjdGVkLgorCSAqLworCWlmICgodHVuZV9hcmdzLT5oaWVyYXJjaHkgIT0gSElFUl9OT05FKSAmJgorCQkgICAgICAgKChwYXJhbXMtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPT0gRkVDX05PTkUpIHx8CisJCQkocGFyYW1zLT51Lm9mZG0uY29kZV9yYXRlX0hQID09IEZFQ19OT05FKSkpIHsKKworCQlpZiAocGFyYW1zLT51Lm9mZG0uY29kZV9yYXRlX0xQID09IEZFQ19OT05FKSB7CisJCQl0dW5lX2FyZ3MtPmhpZXJfc2VsZWN0ID0gSElFUl9ISUdIX1BSSU9SSVRZOworCQkJdHVuZV9hcmdzLT5jb2RlX3JhdGUgPQorCQkJICAgYXMxMDJfZmVfZ2V0X2NvZGVfcmF0ZShwYXJhbXMtPnUub2ZkbS5jb2RlX3JhdGVfSFApOworCQl9CisKKwkJaWYgKHBhcmFtcy0+dS5vZmRtLmNvZGVfcmF0ZV9IUCA9PSBGRUNfTk9ORSkgeworCQkJdHVuZV9hcmdzLT5oaWVyX3NlbGVjdCA9IEhJRVJfTE9XX1BSSU9SSVRZOworCQkJdHVuZV9hcmdzLT5jb2RlX3JhdGUgPQorCQkJICAgYXMxMDJfZmVfZ2V0X2NvZGVfcmF0ZShwYXJhbXMtPnUub2ZkbS5jb2RlX3JhdGVfTFApOworCQl9CisKKwkJZHByaW50ayhkZWJ1ZywgIlx0aGllcmFyY2h5OiAweCUwMnggICIKKwkJCQkic2VsZWN0ZWQ6ICVzICBjb2RlX3JhdGVfJXM6IDB4JTAyeFxuIiwKKwkJCXR1bmVfYXJncy0+aGllcmFyY2h5LAorCQkJdHVuZV9hcmdzLT5oaWVyX3NlbGVjdCA9PSBISUVSX0hJR0hfUFJJT1JJVFkgPworCQkJIkhQIiA6ICJMUCIsCisJCQl0dW5lX2FyZ3MtPmhpZXJfc2VsZWN0ID09IEhJRVJfSElHSF9QUklPUklUWSA/CisJCQkiSFAiIDogIkxQIiwKKwkJCXR1bmVfYXJncy0+Y29kZV9yYXRlKTsKKwl9IGVsc2UgeworCQl0dW5lX2FyZ3MtPmNvZGVfcmF0ZSA9CisJCQlhczEwMl9mZV9nZXRfY29kZV9yYXRlKHBhcmFtcy0+dS5vZmRtLmNvZGVfcmF0ZV9IUCk7CisJfQorfQorCisvKiBFT0YgLSB2aW06IHNldCB0ZXh0d2lkdGg9ODAgdHM9OCBzdz04IHN0cz04IG5vZXQ6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTlkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuYwpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIEFiaWxpcyBTeXN0ZW1zIFNpbmdsZSBEVkItVCBSZWNlaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBEZXZpbiBIZWl0bXVlbGxlciA8ZGhlaXRtdWVsbGVyQGtlcm5lbGxhYnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImFzMTAyX2Rydi5oIgorI2luY2x1ZGUgImFzMTAyX2Z3LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19GV19MT0FERVIpIHx8IGRlZmluZWQoQ09ORklHX0ZXX0xPQURFUl9NT0RVTEUpCitjaGFyIGFzMTAyX3N0X2Z3MVtdID0gImFzMTAyX2RhdGExX3N0LmhleCI7CitjaGFyIGFzMTAyX3N0X2Z3MltdID0gImFzMTAyX2RhdGEyX3N0LmhleCI7CitjaGFyIGFzMTAyX2R0X2Z3MVtdID0gImFzMTAyX2RhdGExX2R0LmhleCI7CitjaGFyIGFzMTAyX2R0X2Z3MltdID0gImFzMTAyX2RhdGEyX2R0LmhleCI7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0b2h4KHVuc2lnbmVkIGNoYXIgKmRzdCwgY2hhciAqc3JjKQoreworCXVuc2lnbmVkIGNoYXIgdmFsdWUgPSAwOworCisJY2hhciBtc2IgPSB0b2xvd2VyKCpzcmMpIC0gJzAnOworCWNoYXIgbHNiID0gdG9sb3dlcigqKHNyYyArIDEpKSAtICcwJzsKKworCWlmIChtc2IgPiA5KQorCQltc2IgLT0gNzsKKwlpZiAobHNiID4gOSkKKwkJbHNiIC09IDc7CisKKwkqZHN0ID0gdmFsdWUgPSAoKG1zYiAmIDB4RikgPDwgNCkgfCAobHNiICYgMHhGKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBQYXJzZSBJTlRFTCBIRVggZmlybXdhcmUgZmlsZSB0byBleHRyYWN0IGFkZHJlc3MgYW5kIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfaGV4X2xpbmUodW5zaWduZWQgY2hhciAqZndfZGF0YSwgdW5zaWduZWQgY2hhciAqYWRkciwKKwkJCSAgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50ICpkYXRhTGVuZ3RoLAorCQkJICB1bnNpZ25lZCBjaGFyICphZGRyX2hhc19jaGFuZ2VkKSB7CisKKwlpbnQgY291bnQgPSAwOworCXVuc2lnbmVkIGNoYXIgKnNyYywgZHN0OworCisJaWYgKCpmd19kYXRhKysgIT0gJzonKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBmaXJtd2FyZSBmaWxlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogbG9jYXRlIGVuZCBvZiBsaW5lICovCisJZm9yIChzcmMgPSBmd19kYXRhOyAqc3JjICE9ICdcbic7IHNyYyArPSAyKSB7CisJCWF0b2h4KCZkc3QsIHNyYyk7CisJCS8qIHBhcnNlIGxpbmUgdG8gc3BsaXQgYWRkciAvIGRhdGEgKi8KKwkJc3dpdGNoIChjb3VudCkgeworCQljYXNlIDA6CisJCQkqZGF0YUxlbmd0aCA9IGRzdDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlhZGRyWzJdID0gZHN0OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWFkZHJbM10gPSBkc3Q7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJLyogY2hlY2sgaWYgZGF0YSBpcyBhbiBhZGRyZXNzICovCisJCQlpZiAoZHN0ID09IDB4MDQpCisJCQkJKmFkZHJfaGFzX2NoYW5nZWQgPSAxOworCQkJZWxzZQorCQkJCSphZGRyX2hhc19jaGFuZ2VkID0gMDsKKwkJCWJyZWFrOworCQljYXNlICA0OgorCQljYXNlICA1OgorCQkJaWYgKCphZGRyX2hhc19jaGFuZ2VkKQorCQkJCWFkZHJbKGNvdW50IC0gNCldID0gZHN0OworCQkJZWxzZQorCQkJCWRhdGFbKGNvdW50IC0gNCldID0gZHN0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkYXRhWyhjb3VudCAtIDQpXSA9IGRzdDsKKwkJCWJyZWFrOworCQl9CisJCWNvdW50Kys7CisJfQorCisJLyogcmV0dXJuIHJlYWQgdmFsdWUgKyAnOicgKyAnXG4nICovCisJcmV0dXJuIChjb3VudCAqIDIpICsgMjsKK30KKworc3RhdGljIGludCBhczEwMl9maXJtd2FyZV91cGxvYWQoc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAorCQkJCSB1bnNpZ25lZCBjaGFyICpjbWQsCisJCQkJIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmUpIHsKKworCXN0cnVjdCBhczEweF9md19wa3RfdCBmd19wa3Q7CisJaW50IHRvdGFsX3JlYWRfYnl0ZXMgPSAwLCBlcnJubyA9IDA7CisJdW5zaWduZWQgY2hhciBhZGRyX2hhc19jaGFuZ2VkID0gMDsKKworCUVOVEVSKCk7CisKKwlmb3IgKHRvdGFsX3JlYWRfYnl0ZXMgPSAwOyB0b3RhbF9yZWFkX2J5dGVzIDwgZmlybXdhcmUtPnNpemU7ICkgeworCQlpbnQgcmVhZF9ieXRlcyA9IDAsIGRhdGFfbGVuID0gMDsKKworCQkvKiBwYXJzZSBpbnRlbCBoZXggbGluZSAqLworCQlyZWFkX2J5dGVzID0gcGFyc2VfaGV4X2xpbmUoCisJCQkJKHU4ICopIChmaXJtd2FyZS0+ZGF0YSArIHRvdGFsX3JlYWRfYnl0ZXMpLAorCQkJCWZ3X3BrdC5yYXcuYWRkcmVzcywKKwkJCQlmd19wa3QucmF3LmRhdGEsCisJCQkJJmRhdGFfbGVuLAorCQkJCSZhZGRyX2hhc19jaGFuZ2VkKTsKKworCQlpZiAocmVhZF9ieXRlcyA8PSAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBkZXRlY3QgdGhlIGVuZCBvZiBmaWxlICovCisJCXRvdGFsX3JlYWRfYnl0ZXMgKz0gcmVhZF9ieXRlczsKKwkJaWYgKHRvdGFsX3JlYWRfYnl0ZXMgPT0gZmlybXdhcmUtPnNpemUpIHsKKwkJCWZ3X3BrdC51LnJlcXVlc3RbMF0gPSAweDAwOworCQkJZndfcGt0LnUucmVxdWVzdFsxXSA9IDB4MDM7CisKKwkJCS8qIHNlbmQgRU9GIGNvbW1hbmQgKi8KKwkJCWVycm5vID0gYnVzX2FkYXAtPm9wcy0+dXBsb2FkX2Z3X3BrdChidXNfYWRhcCwKKwkJCQkJCQkgICAgICh1aW50OF90ICopCisJCQkJCQkJICAgICAmZndfcGt0LCAyLCAwKTsKKwkJCWlmIChlcnJubyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlIHsKKwkJCWlmICghYWRkcl9oYXNfY2hhbmdlZCkgeworCQkJCS8qIHByZXBhcmUgY29tbWFuZCB0byBzZW5kICovCisJCQkJZndfcGt0LnUucmVxdWVzdFswXSA9IDB4MDA7CisJCQkJZndfcGt0LnUucmVxdWVzdFsxXSA9IDB4MDE7CisKKwkJCQlkYXRhX2xlbiArPSBzaXplb2YoZndfcGt0LnUucmVxdWVzdCk7CisJCQkJZGF0YV9sZW4gKz0gc2l6ZW9mKGZ3X3BrdC5yYXcuYWRkcmVzcyk7CisKKwkJCQkvKiBzZW5kIGNtZCB0byBkZXZpY2UgKi8KKwkJCQllcnJubyA9IGJ1c19hZGFwLT5vcHMtPnVwbG9hZF9md19wa3QoYnVzX2FkYXAsCisJCQkJCQkJCSAgICAgKHVpbnQ4X3QgKikKKwkJCQkJCQkJICAgICAmZndfcGt0LAorCQkJCQkJCQkgICAgIGRhdGFfbGVuLAorCQkJCQkJCQkgICAgIDApOworCQkJCWlmIChlcnJubyA8IDApCisJCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwl9CitlcnJvcjoKKwlMRUFWRSgpOworCXJldHVybiAoZXJybm8gPT0gMCkgPyB0b3RhbF9yZWFkX2J5dGVzIDogZXJybm87Cit9CisKK2ludCBhczEwMl9md191cGxvYWQoc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwKQoreworCWludCBlcnJubyA9IC1FRkFVTFQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKKwl1bnNpZ25lZCBjaGFyICpjbWRfYnVmID0gTlVMTDsKKwljaGFyICpmdzEsICpmdzI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9VU0IpCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGJ1c19hZGFwLT51c2JfZGV2OworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVMxMDJfU1BJKQorCXN0cnVjdCBzcGlfZGV2aWNlICpkZXYgPSBidXNfYWRhcC0+c3BpX2RldjsKKyNlbmRpZgorCUVOVEVSKCk7CisKKwkvKiBzZWxlY3QgZncgZmlsZSB0byB1cGxvYWQgKi8KKwlpZiAoZHVhbF90dW5lcikgeworCQlmdzEgPSBhczEwMl9kdF9mdzE7CisJCWZ3MiA9IGFzMTAyX2R0X2Z3MjsKKwl9IGVsc2UgeworCQlmdzEgPSBhczEwMl9zdF9mdzE7CisJCWZ3MiA9IGFzMTAyX3N0X2Z3MjsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19GV19MT0FERVIpIHx8IGRlZmluZWQoQ09ORklHX0ZXX0xPQURFUl9NT0RVTEUpCisJLyogYWxsb2NhdGUgYnVmZmVyIHRvIHN0b3JlIGZpcm13YXJlIHVwbG9hZCBjb21tYW5kIGFuZCBkYXRhICovCisJY21kX2J1ZiA9IGt6YWxsb2MoTUFYX0ZXX1BLVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoY21kX2J1ZiA9PSBOVUxMKSB7CisJCWVycm5vID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiByZXF1ZXN0IGtlcm5lbCB0byBsb2NhdGUgZmlybXdhcmUgZmlsZTogcGFydDEgKi8KKwllcnJubyA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBmdzEsICZkZXYtPmRldik7CisJaWYgKGVycm5vIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gbG9jYXRlIGZpcm13YXJlIGZpbGU6ICVzXG4iLAorCQkJCSBEUklWRVJfTkFNRSwgZncxKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBpbml0aWF0ZSBmaXJtd2FyZSB1cGxvYWQgKi8KKwllcnJubyA9IGFzMTAyX2Zpcm13YXJlX3VwbG9hZChidXNfYWRhcCwgY21kX2J1ZiwgZmlybXdhcmUpOworCWlmIChlcnJubyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgZHVyaW5nIGZpcm13YXJlIHVwbG9hZCBwYXJ0MVxuIiwKKwkJCQkgRFJJVkVSX05BTUUpOworCQlnb3RvIGVycm9yOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBmaW1yd2FyZTogJXMgbG9hZGVkIHdpdGggc3VjY2Vzc1xuIiwKKwkJCSBEUklWRVJfTkFNRSwgZncxKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKKworCS8qIHdhaXQgZm9yIGJvb3QgdG8gY29tcGxldGUgKi8KKwltZGVsYXkoMTAwKTsKKworCS8qIHJlcXVlc3Qga2VybmVsIHRvIGxvY2F0ZSBmaXJtd2FyZSBmaWxlOiBwYXJ0MiAqLworCWVycm5vID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIGZ3MiwgJmRldi0+ZGV2KTsKKwlpZiAoZXJybm8gPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBsb2NhdGUgZmlybXdhcmUgZmlsZTogJXNcbiIsCisJCQkJIERSSVZFUl9OQU1FLCBmdzIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGluaXRpYXRlIGZpcm13YXJlIHVwbG9hZCAqLworCWVycm5vID0gYXMxMDJfZmlybXdhcmVfdXBsb2FkKGJ1c19hZGFwLCBjbWRfYnVmLCBmaXJtd2FyZSk7CisJaWYgKGVycm5vIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBkdXJpbmcgZmlybXdhcmUgdXBsb2FkIHBhcnQyXG4iLAorCQkJCSBEUklWRVJfTkFNRSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZpbXJ3YXJlOiAlcyBsb2FkZWQgd2l0aCBzdWNjZXNzXG4iLAorCQkJRFJJVkVSX05BTUUsIGZ3Mik7CitlcnJvcjoKKwkvKiBmcmVlIGRhdGEgYnVmZmVyICovCisJa2ZyZWUoY21kX2J1Zik7CisJLyogcmVsZWFzZSBmaXJtd2FyZSBpZiBuZWVkZWQgKi8KKwlpZiAoZmlybXdhcmUgIT0gTlVMTCkKKwkJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisjZW5kaWYKKwlMRUFWRSgpOworCXJldHVybiBlcnJubzsKK30KKyNlbmRpZgorCisvKiBFT0YgLSB2aW06IHNldCB0ZXh0d2lkdGg9ODAgdHM9OCBzdz04IHN0cz04IG5vZXQ6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTUzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQWJpbGlzIFN5c3RlbXMgU2luZ2xlIERWQi1UIFJlY2VpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGllcnJpY2sgSGFzY29ldCA8cGllcnJpY2suaGFzY29ldEBhYmlsaXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjZGVmaW5lIE1BWF9GV19QS1RfU0laRQk2NAorCitleHRlcm4gaW50IGR1YWxfdHVuZXI7CisKKyNwcmFnbWEgcGFjaygxKQorc3RydWN0IGFzMTB4X3Jhd19md19wa3QgeworCXVuc2lnbmVkIGNoYXIgYWRkcmVzc1s0XTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbTUFYX0ZXX1BLVF9TSVpFIC0gNl07Cit9OworCitzdHJ1Y3QgYXMxMHhfZndfcGt0X3QgeworCXVuaW9uIHsKKwkJdW5zaWduZWQgY2hhciByZXF1ZXN0WzJdOworCQl1bnNpZ25lZCBjaGFyIGxlbmd0aFsyXTsKKwl9IHU7CisJc3RydWN0IGFzMTB4X3Jhd19md19wa3QgcmF3OworfTsKKyNwcmFnbWEgcGFjaygpCisKKyNpZmRlZiBfX0tFUk5FTF9fCitpbnQgYXMxMDJfZndfdXBsb2FkKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCk7CisjZW5kaWYKKworLyogRU9GIC0gdmltOiBzZXQgdGV4dHdpZHRoPTgwIHRzPTggc3c9OCBzdHM9OCBub2V0OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX3VzYl9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl91c2JfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YmUyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl91c2JfZHJ2LmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGV2aW4gSGVpdG11ZWxsZXIgPGRoZWl0bXVlbGxlckBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJhczEwMl9kcnYuaCIKKyNpbmNsdWRlICJhczEwMl91c2JfZHJ2LmgiCisjaW5jbHVkZSAiYXMxMDJfZncuaCIKKworc3RhdGljIHZvaWQgYXMxMDJfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7CitzdGF0aWMgaW50IGFzMTAyX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKKworc3RhdGljIGludCBhczEwMl91c2Jfc3RhcnRfc3RyZWFtKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2KTsKK3N0YXRpYyB2b2lkIGFzMTAyX3VzYl9zdG9wX3N0cmVhbShzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7CisKK3N0YXRpYyBpbnQgYXMxMDJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFzMTAyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXMxMDJfdXNiX2lkX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKEFTMTAyX1VTQl9ERVZJQ0VfVkVORE9SX0lELCBBUzEwMl9VU0JfREVWSUNFX1BJRF8wMDAxKSB9LAorCXsgVVNCX0RFVklDRShQQ1RWXzc0RV9VU0JfVklELCBQQ1RWXzc0RV9VU0JfUElEKSB9LAorCXsgVVNCX0RFVklDRShFTEdBVE9fRVlFVFZfRFRUX1VTQl9WSUQsIEVMR0FUT19FWUVUVl9EVFRfVVNCX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoTkJPWF9EVkJUX0RPTkdMRV9VU0JfVklELCBOQk9YX0RWQlRfRE9OR0xFX1VTQl9QSUQpIH0sCisJeyB9IC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCisvKiBOb3RlIHRoYXQgdGhpcyB0YWJsZSBtdXN0IGFsd2F5cyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIHRoZQorICAgYXMxMDJfdXNiX2lkX3RhYmxlIHN0cnVjdCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFzMTAyX2RldmljZV9uYW1lc1tdID0geworCUFTMTAyX1JFRkVSRU5DRV9ERVNJR04sCisJQVMxMDJfUENUVl83NEUsCisJQVMxMDJfRUxHQVRPX0VZRVRWX0RUVF9OQU1FLAorCUFTMTAyX05CT1hfRFZCVF9ET05HTEVfTkFNRSwKKwlOVUxMIC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitzdHJ1Y3QgdXNiX2RyaXZlciBhczEwMl91c2JfZHJpdmVyID0geworCS5uYW1lICAgICAgID0gIERSSVZFUl9GVUxMX05BTUUsCisJLnByb2JlICAgICAgPSAgYXMxMDJfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gIGFzMTAyX3VzYl9kaXNjb25uZWN0LAorCS5pZF90YWJsZSAgID0gIGFzMTAyX3VzYl9pZF90YWJsZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXMxMDJfZGV2X2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IGFzMTAyX29wZW4sCisJLnJlbGVhc2UgPSBhczEwMl9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIGFzMTAyX3VzYl9jbGFzc19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImF0b24yLSVkIiwKKwkuZm9wcwkJPSAmYXMxMDJfZGV2X2ZvcHMsCisJLm1pbm9yX2Jhc2UJPSBBUzEwMl9ERVZJQ0VfTUFKT1IsCit9OworCitzdGF0aWMgaW50IGFzMTAyX3VzYl94ZmVyX2NtZChzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyICpzZW5kX2J1ZiwgaW50IHNlbmRfYnVmX2xlbiwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKnJlY3ZfYnVmLCBpbnQgcmVjdl9idWZfbGVuKQoreworCWludCByZXQgPSAwOworCUVOVEVSKCk7CisKKwlpZiAoc2VuZF9idWYgIT0gTlVMTCkgeworCQlyZXQgPSB1c2JfY29udHJvbF9tc2coYnVzX2FkYXAtPnVzYl9kZXYsCisJCQkJICAgICAgdXNiX3NuZGN0cmxwaXBlKGJ1c19hZGFwLT51c2JfZGV2LCAwKSwKKwkJCQkgICAgICBBUzEwMl9VU0JfREVWSUNFX1RYX0NUUkxfQ01ELAorCQkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgICAgICBVU0JfUkVDSVBfREVWSUNFLAorCQkJCSAgICAgIGJ1c19hZGFwLT5jbWRfeGlkLCAvKiB2YWx1ZSAqLworCQkJCSAgICAgIDAsIC8qIGluZGV4ICovCisJCQkJICAgICAgc2VuZF9idWYsIHNlbmRfYnVmX2xlbiwKKwkJCQkgICAgICBVU0JfQ1RSTF9TRVRfVElNRU9VVCAvKiAyMDAgKi8pOworCQlpZiAocmV0IDwgMCkgeworCQkJZHByaW50ayhkZWJ1ZywgInVzYl9jb250cm9sX21zZyhzZW5kKSBmYWlsZWQsIGVyciAlaVxuIiwKKwkJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAocmV0ICE9IHNlbmRfYnVmX2xlbikgeworCQkJZHByaW50ayhkZWJ1ZywgIm9ubHkgd3JvdGUgJWQgb2YgJWQgYnl0ZXNcbiIsCisJCQkJCXJldCwgc2VuZF9idWZfbGVuKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChyZWN2X2J1ZiAhPSBOVUxMKSB7CisjaWZkZWYgVFJBQ0UKKwkJZHByaW50ayhkZWJ1ZywgIndhbnQgdG8gcmVhZDogJWQgYnl0ZXNcbiIsIHJlY3ZfYnVmX2xlbik7CisjZW5kaWYKKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGJ1c19hZGFwLT51c2JfZGV2LAorCQkJCSAgICAgIHVzYl9yY3ZjdHJscGlwZShidXNfYWRhcC0+dXNiX2RldiwgMCksCisJCQkJICAgICAgQVMxMDJfVVNCX0RFVklDRV9SWF9DVFJMX0NNRCwKKwkJCQkgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgICAgICBVU0JfUkVDSVBfREVWSUNFLAorCQkJCSAgICAgIGJ1c19hZGFwLT5jbWRfeGlkLCAvKiB2YWx1ZSAqLworCQkJCSAgICAgIDAsIC8qIGluZGV4ICovCisJCQkJICAgICAgcmVjdl9idWYsIHJlY3ZfYnVmX2xlbiwKKwkJCQkgICAgICBVU0JfQ1RSTF9HRVRfVElNRU9VVCAvKiAyMDAgKi8pOworCQlpZiAocmV0IDwgMCkgeworCQkJZHByaW50ayhkZWJ1ZywgInVzYl9jb250cm9sX21zZyhyZWN2KSBmYWlsZWQsIGVyciAlaVxuIiwKKwkJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKyNpZmRlZiBUUkFDRQorCQlkcHJpbnRrKGRlYnVnLCAicmVhZCAlZCBieXRlc1xuIiwgcmVjdl9idWZfbGVuKTsKKyNlbmRpZgorCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhczEwMl9zZW5kX2VwMShzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJCQkgIHVuc2lnbmVkIGNoYXIgKnNlbmRfYnVmLAorCQkJICBpbnQgc2VuZF9idWZfbGVuLAorCQkJICBpbnQgc3dhcDMyKQoreworCWludCByZXQgPSAwLCBhY3R1YWxfbGVuOworCisJcmV0ID0gdXNiX2J1bGtfbXNnKGJ1c19hZGFwLT51c2JfZGV2LAorCQkJICAgdXNiX3NuZGJ1bGtwaXBlKGJ1c19hZGFwLT51c2JfZGV2LCAxKSwKKwkJCSAgIHNlbmRfYnVmLCBzZW5kX2J1Zl9sZW4sICZhY3R1YWxfbGVuLCAyMDApOworCWlmIChyZXQpIHsKKwkJZHByaW50ayhkZWJ1ZywgInVzYl9idWxrX21zZyhzZW5kKSBmYWlsZWQsIGVyciAlaVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoYWN0dWFsX2xlbiAhPSBzZW5kX2J1Zl9sZW4pIHsKKwkJZHByaW50ayhkZWJ1ZywgIm9ubHkgd3JvdGUgJWQgb2YgJWQgYnl0ZXNcbiIsCisJCQkJYWN0dWFsX2xlbiwgc2VuZF9idWZfbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gcmV0ID8gcmV0IDogYWN0dWFsX2xlbjsKK30KKworc3RhdGljIGludCBhczEwMl9yZWFkX2VwMihzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJCSAgIHVuc2lnbmVkIGNoYXIgKnJlY3ZfYnVmLCBpbnQgcmVjdl9idWZfbGVuKQoreworCWludCByZXQgPSAwLCBhY3R1YWxfbGVuOworCisJaWYgKHJlY3ZfYnVmID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdXNiX2J1bGtfbXNnKGJ1c19hZGFwLT51c2JfZGV2LAorCQkJICAgdXNiX3JjdmJ1bGtwaXBlKGJ1c19hZGFwLT51c2JfZGV2LCAyKSwKKwkJCSAgIHJlY3ZfYnVmLCByZWN2X2J1Zl9sZW4sICZhY3R1YWxfbGVuLCAyMDApOworCWlmIChyZXQpIHsKKwkJZHByaW50ayhkZWJ1ZywgInVzYl9idWxrX21zZyhyZWN2KSBmYWlsZWQsIGVyciAlaVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoYWN0dWFsX2xlbiAhPSByZWN2X2J1Zl9sZW4pIHsKKwkJZHByaW50ayhkZWJ1ZywgIm9ubHkgcmVhZCAlZCBvZiAlZCBieXRlc1xuIiwKKwkJCQlhY3R1YWxfbGVuLCByZWN2X2J1Zl9sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiByZXQgPyByZXQgOiBhY3R1YWxfbGVuOworfQorCitzdHJ1Y3QgYXMxMDJfcHJpdl9vcHNfdCBhczEwMl9wcml2X29wcyA9IHsKKwkudXBsb2FkX2Z3X3BrdAk9IGFzMTAyX3NlbmRfZXAxLAorCS54ZmVyX2NtZAk9IGFzMTAyX3VzYl94ZmVyX2NtZCwKKwkuYXMxMDJfcmVhZF9lcDIJPSBhczEwMl9yZWFkX2VwMiwKKwkuc3RhcnRfc3RyZWFtCT0gYXMxMDJfdXNiX3N0YXJ0X3N0cmVhbSwKKwkuc3RvcF9zdHJlYW0JPSBhczEwMl91c2Jfc3RvcF9zdHJlYW0sCit9OworCitzdGF0aWMgaW50IGFzMTAyX3N1Ym1pdF91cmJfc3RyZWFtKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IGVycjsKKworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwKKwkJCSAgZGV2LT5idXNfYWRhcC51c2JfZGV2LAorCQkJICB1c2JfcmN2YnVsa3BpcGUoZGV2LT5idXNfYWRhcC51c2JfZGV2LCAweDIpLAorCQkJICB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCSAgQVMxMDJfVVNCX0JVRl9TSVpFLAorCQkJICBhczEwMl91cmJfc3RyZWFtX2lycSwKKwkJCSAgZGV2KTsKKworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKGVycikKKwkJZHByaW50ayhkZWJ1ZywgIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgYXMxMDJfdXJiX3N0cmVhbV9pcnEoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2ID0gdXJiLT5jb250ZXh0OworCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJZHZiX2RteF9zd2ZpbHRlcigmYXMxMDJfZGV2LT5kdmJfZG14LAorCQkJCSB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApCisJCQltZW1zZXQodXJiLT50cmFuc2Zlcl9idWZmZXIsIDAsIEFTMTAyX1VTQl9CVUZfU0laRSk7CisJfQorCisJLyogaXMgbm90IHN0b3BwZWQsIHJlLXN1Ym1pdCB1cmIgKi8KKwlpZiAoYXMxMDJfZGV2LT5zdHJlYW1pbmcpCisJCWFzMTAyX3N1Ym1pdF91cmJfc3RyZWFtKGFzMTAyX2RldiwgdXJiKTsKK30KKworc3RhdGljIHZvaWQgYXMxMDJfZnJlZV91c2Jfc3RyZWFtX2J1ZmZlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldikKK3sKKwlpbnQgaTsKKworCUVOVEVSKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NUUkVBTV9VUkI7IGkrKykKKwkJdXNiX2ZyZWVfdXJiKGRldi0+c3RyZWFtX3VyYltpXSk7CisKKwl1c2JfZnJlZV9jb2hlcmVudChkZXYtPmJ1c19hZGFwLnVzYl9kZXYsCisJCQlNQVhfU1RSRUFNX1VSQiAqIEFTMTAyX1VTQl9CVUZfU0laRSwKKwkJCWRldi0+c3RyZWFtLAorCQkJZGV2LT5kbWFfYWRkcik7CisJTEVBVkUoKTsKK30KKworc3RhdGljIGludCBhczEwMl9hbGxvY191c2Jfc3RyZWFtX2J1ZmZlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlkZXYtPnN0cmVhbSA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPmJ1c19hZGFwLnVzYl9kZXYsCisJCQkJICAgICAgIE1BWF9TVFJFQU1fVVJCICogQVMxMDJfVVNCX0JVRl9TSVpFLAorCQkJCSAgICAgICBHRlBfS0VSTkVMLAorCQkJCSAgICAgICAmZGV2LT5kbWFfYWRkcik7CisJaWYgKCFkZXYtPnN0cmVhbSkgeworCQlkcHJpbnRrKGRlYnVnLCAiJXM6IHVzYl9idWZmZXJfYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChkZXYtPnN0cmVhbSwgMCwgTUFYX1NUUkVBTV9VUkIgKiBBUzEwMl9VU0JfQlVGX1NJWkUpOworCisJLyogaW5pdCB1cmIgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRUFNX1VSQjsgaSsrKSB7CisJCXN0cnVjdCB1cmIgKnVyYjsKKworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCQlpZiAodXJiID09IE5VTEwpIHsKKwkJCWRwcmludGsoZGVidWcsICIlczogdXNiX2FsbG9jX3VyYiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWFzMTAyX2ZyZWVfdXNiX3N0cmVhbV9idWZmZXIoZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBkZXYtPnN0cmVhbSArIChpICogQVMxMDJfVVNCX0JVRl9TSVpFKTsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gQVMxMDJfVVNCX0JVRl9TSVpFOworCisJCWRldi0+c3RyZWFtX3VyYltpXSA9IHVyYjsKKwl9CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhczEwMl91c2Jfc3RvcF9zdHJlYW0oc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NUUkVBTV9VUkI7IGkrKykKKwkJdXNiX2tpbGxfdXJiKGRldi0+c3RyZWFtX3VyYltpXSk7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfdXNiX3N0YXJ0X3N0cmVhbShzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRUFNX1VSQjsgaSsrKSB7CisJCXJldCA9IGFzMTAyX3N1Ym1pdF91cmJfc3RyZWFtKGRldiwgZGV2LT5zdHJlYW1fdXJiW2ldKTsKKwkJaWYgKHJldCkgeworCQkJYXMxMDJfdXNiX3N0b3Bfc3RyZWFtKGRldik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFzMTAyX3VzYl9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2OworCisJRU5URVIoKTsKKworCWFzMTAyX2RldiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgYXMxMDJfZGV2X3QsIGtyZWYpOworCWlmIChhczEwMl9kZXYgIT0gTlVMTCkgeworCQl1c2JfcHV0X2RldihhczEwMl9kZXYtPmJ1c19hZGFwLnVzYl9kZXYpOworCQlrZnJlZShhczEwMl9kZXYpOworCX0KKworCUxFQVZFKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzMTAyX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2OworCisJRU5URVIoKTsKKworCS8qIGV4dHJhY3QgYXMxMDJfZGV2X3QgZnJvbSB1c2JfZGV2aWNlIHByaXZhdGUgZGF0YSAqLworCWFzMTAyX2RldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwkvKiB1bnJlZ2lzdGVyIGR2YiBsYXllciAqLworCWFzMTAyX2R2Yl91bnJlZ2lzdGVyKGFzMTAyX2Rldik7CisKKwkvKiBmcmVlIHVzYiBidWZmZXJzICovCisJYXMxMDJfZnJlZV91c2Jfc3RyZWFtX2J1ZmZlcihhczEwMl9kZXYpOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKworCS8qIHVzYiB1bnJlZ2lzdGVyIGRldmljZSAqLworCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRmLCAmYXMxMDJfdXNiX2NsYXNzX2RyaXZlcik7CisKKwkvKiBkZWNyZW1lbnQgdXNhZ2UgY291bnRlciAqLworCWtyZWZfcHV0KCZhczEwMl9kZXYtPmtyZWYsIGFzMTAyX3VzYl9yZWxlYXNlKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBkZXZpY2UgaGFzIGJlZW4gZGlzY29ubmVjdGVkXG4iLCBEUklWRVJfTkFNRSk7CisKKwlMRUFWRSgpOworfQorCitzdGF0aWMgaW50IGFzMTAyX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2OworCWludCBpOworCisJRU5URVIoKTsKKworCWFzMTAyX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhczEwMl9kZXZfdCksIEdGUF9LRVJORUwpOworCWlmIChhczEwMl9kZXYgPT0gTlVMTCkgeworCQllcnIoIiVzOiBremFsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgYWN0dWFsbHkgaGFwcGVuICovCisJaWYgKChzaXplb2YoYXMxMDJfdXNiX2lkX3RhYmxlKSAvIHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9pZCkpICE9CisJICAgIChzaXplb2YoYXMxMDJfZGV2aWNlX25hbWVzKSAvIHNpemVvZihjb25zdCBjaGFyICopKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRldmljZSBuYW1lcyB0YWJsZSBpbnZhbGlkIHNpemUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQXNzaWduIHRoZSB1c2VyLWZyaWVuZGx5IGRldmljZSBuYW1lICovCisJZm9yIChpID0gMDsgaSA8IChzaXplb2YoYXMxMDJfdXNiX2lkX3RhYmxlKSAvCisJCQkgc2l6ZW9mKHN0cnVjdCB1c2JfZGV2aWNlX2lkKSk7IGkrKykgeworCQlpZiAoaWQgPT0gJmFzMTAyX3VzYl9pZF90YWJsZVtpXSkKKwkJCWFzMTAyX2Rldi0+bmFtZSA9IGFzMTAyX2RldmljZV9uYW1lc1tpXTsKKwl9CisKKwlpZiAoYXMxMDJfZGV2LT5uYW1lID09IE5VTEwpCisJCWFzMTAyX2Rldi0+bmFtZSA9ICJVbmtub3duIEFTMTAyIGRldmljZSI7CisKKwkvKiBzZXQgcHJpdmF0ZSBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKwlhczEwMl9kZXYtPmJ1c19hZGFwLm9wcyA9ICZhczEwMl9wcml2X29wczsKKworCS8qIGluaXQgY21kIHRva2VuIGZvciB1c2IgYnVzICovCisJYXMxMDJfZGV2LT5idXNfYWRhcC5jbWQgPSAmYXMxMDJfZGV2LT5idXNfYWRhcC50b2tlbi51c2IuYzsKKwlhczEwMl9kZXYtPmJ1c19hZGFwLnJzcCA9ICZhczEwMl9kZXYtPmJ1c19hZGFwLnRva2VuLnVzYi5yOworCisJLyogaW5pdCBrZXJuZWwgZGV2aWNlIHJlZmVyZW5jZSAqLworCWtyZWZfaW5pdCgmYXMxMDJfZGV2LT5rcmVmKTsKKworCS8qIHN0b3JlIGFzMTAyIGRldmljZSB0byB1c2JfZGV2aWNlIHByaXZhdGUgZGF0YSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgKHZvaWQgKikgYXMxMDJfZGV2KTsKKworCS8qIHN0b3JlIGluIGFzMTAyIGRldmljZSB0aGUgdXNiX2RldmljZSBwb2ludGVyICovCisJYXMxMDJfZGV2LT5idXNfYWRhcC51c2JfZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSk7CisKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJcmV0ID0gdXNiX3JlZ2lzdGVyX2RldihpbnRmLCAmYXMxMDJfdXNiX2NsYXNzX2RyaXZlcik7CisJaWYgKHJldCA8IDApIHsKKwkJLyogc29tZXRoaW5nIHByZXZlbnRlZCB1cyBmcm9tIHJlZ2lzdGVyaW5nIHRoaXMgZHJpdmVyICovCisJCWVycigiJXM6IHVzYl9yZWdpc3Rlcl9kZXYoKSBmYWlsZWQgKGVycm5vID0gJWQpIiwKKwkJICAgIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogZGV2aWNlIGhhcyBiZWVuIGRldGVjdGVkXG4iLCBEUklWRVJfTkFNRSk7CisKKwkvKiByZXF1ZXN0IGJ1ZmZlciBhbGxvY2F0aW9uIGZvciBzdHJlYW1pbmcgKi8KKwlyZXQgPSBhczEwMl9hbGxvY191c2Jfc3RyZWFtX2J1ZmZlcihhczEwMl9kZXYpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBmYWlsZWQ7CisKKwkvKiByZWdpc3RlciBkdmIgbGF5ZXIgKi8KKwlyZXQgPSBhczEwMl9kdmJfcmVnaXN0ZXIoYXMxMDJfZGV2KTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKKworZmFpbGVkOgorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJa2ZyZWUoYXMxMDJfZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFzMTAyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldCA9IDAsIG1pbm9yID0gMDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IE5VTEw7CisJc3RydWN0IGFzMTAyX2Rldl90ICpkZXYgPSBOVUxMOworCisJRU5URVIoKTsKKworCS8qIHJlYWQgbWlub3IgZnJvbSBpbm9kZSAqLworCW1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCS8qIGZldGNoIGRldmljZSBmcm9tIHVzYiBpbnRlcmZhY2UgKi8KKwlpbnRmID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZhczEwMl91c2JfZHJpdmVyLCBtaW5vcik7CisJaWYgKGludGYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCQkJX19mdW5jX18sIG1pbm9yKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCS8qIGdldCBvdXIgZGV2aWNlICovCisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBleGl0OworCX0KKworCS8qIHNhdmUgb3VyIGRldmljZSBvYmplY3QgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKworCS8qIGluY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgZm9yIHRoZSBkZXZpY2UgKi8KKwlrcmVmX2dldCgmZGV2LT5rcmVmKTsKKworZXhpdDoKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldiA9IE5VTEw7CisKKwlFTlRFUigpOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChkZXYgIT0gTlVMTCkgeworCQkvKiBkZWNyZW1lbnQgdGhlIGNvdW50IG9uIG91ciBkZXZpY2UgKi8KKwkJa3JlZl9wdXQoJmRldi0+a3JlZiwgYXMxMDJfdXNiX3JlbGVhc2UpOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGFzMTAyX3VzYl9pZF90YWJsZSk7CisKKy8qIEVPRiAtIHZpbTogc2V0IHRleHR3aWR0aD04MCB0cz04IHN3PTggc3RzPTggbm9ldDogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl91c2JfZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfdXNiX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWZjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfdXNiX2Rydi5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGV2aW4gSGVpdG11ZWxsZXIgPGRoZWl0bXVlbGxlckBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmbmRlZiBfQVMxMDJfVVNCX0RSVl9IXworI2RlZmluZSBfQVMxMDJfVVNCX0RSVl9IXworCisjZGVmaW5lIEFTMTAyX1VTQl9ERVZJQ0VfVFhfQ1RSTF9DTUQJMHhGMQorI2RlZmluZSBBUzEwMl9VU0JfREVWSUNFX1JYX0NUUkxfQ01ECTB4RjIKKworLyogZGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB0aGUgc3VwcG9ydGVkIGRldmljZXMgKi8KKworLyogQWJpbGlzIHN5c3RlbTogIlRJVEFOIiAqLworI2RlZmluZSBBUzEwMl9SRUZFUkVOQ0VfREVTSUdOCQkiQWJpbGlzIFN5c3RlbXMgRFZCLVRpdGFuIgorI2RlZmluZSBBUzEwMl9VU0JfREVWSUNFX1ZFTkRPUl9JRAkweDFCQTYKKyNkZWZpbmUgQVMxMDJfVVNCX0RFVklDRV9QSURfMDAwMQkweDAwMDEKKworLyogUENUViBTeXN0ZW1zOiBQQ1RWIHBpY29TdGljayAoNzRlKSAqLworI2RlZmluZSBBUzEwMl9QQ1RWXzc0RQkJCSJQQ1RWIFN5c3RlbXMgcGljb1N0aWNrICg3NGUpIgorI2RlZmluZSBQQ1RWXzc0RV9VU0JfVklECQkweDIwMTMKKyNkZWZpbmUgUENUVl83NEVfVVNCX1BJRAkJMHgwMjQ2CisKKy8qIEVsZ2F0bzogRXllVFYgRFRUIERlbHV4ZSAqLworI2RlZmluZSBBUzEwMl9FTEdBVE9fRVlFVFZfRFRUX05BTUUJIkVsZ2F0byBFeWVUViBEVFQgRGVsdXhlIgorI2RlZmluZSBFTEdBVE9fRVlFVFZfRFRUX1VTQl9WSUQJMHgwZmQ5CisjZGVmaW5lIEVMR0FUT19FWUVUVl9EVFRfVVNCX1BJRAkweDAwMmMKKworLyogbkJveDogbkJveCBEVkItVCBEb25nbGUgKi8KKyNkZWZpbmUgQVMxMDJfTkJPWF9EVkJUX0RPTkdMRV9OQU1FCSJuQm94IERWQi1UIERvbmdsZSIKKyNkZWZpbmUgTkJPWF9EVkJUX0RPTkdMRV9VU0JfVklECTB4MGI4OQorI2RlZmluZSBOQk9YX0RWQlRfRE9OR0xFX1VTQl9QSUQJMHgwMDA3CisKK3ZvaWQgYXMxMDJfdXJiX3N0cmVhbV9pcnEoc3RydWN0IHVyYiAqdXJiKTsKKworc3RydWN0IGFzMTB4X3VzYl90b2tlbl9jbWRfdCB7CisJLyogdG9rZW4gY21kICovCisJc3RydWN0IGFzMTB4X2NtZF90IGM7CisJLyogdG9rZW4gcmVzcG9uc2UgKi8KKwlzdHJ1Y3QgYXMxMHhfY21kX3QgcjsKK307CisjZW5kaWYKKy8qIEVPRiAtIHZpbTogc2V0IHRleHR3aWR0aD04MCB0cz04IHN3PTggc3RzPTggbm9ldDogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGNiYTgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZC5jCkBAIC0wLDAgKzEsNDUyIEBACisvKgorICogQWJpbGlzIFN5c3RlbXMgU2luZ2xlIERWQi1UIFJlY2VpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGllcnJpY2sgSGFzY29ldCA8cGllcnJpY2suaGFzY29ldEBhYmlsaXMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwIERldmluIEhlaXRtdWVsbGVyIDxkaGVpdG11ZWxsZXJAa2VybmVsbGFicy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgImFzMTAyX2Rydi5oIgorI2luY2x1ZGUgImFzMTB4X3R5cGVzLmgiCisjaW5jbHVkZSAiYXMxMHhfY21kLmgiCisKKy8qKgorICogYXMxMHhfY21kX3R1cm5fb24gLSBzZW5kIHR1cm4gb24gY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICAgcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqCisgKiBSZXR1cm4gMCB3aGVuIG5vIGVycm9yLCA8IDAgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF90dXJuX29uKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LnR1cm5fb24ucmVxKSk7CisKKwkvKiBmaWxsIGNvbW1hbmQgKi8KKwlwY21kLT5ib2R5LnR1cm5fb24ucmVxLnByb2NfaWQgPSBjcHVfdG9fbGUxNihDT05UUk9MX1BST0NfVFVSTk9OKTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZChwaGFuZGxlLCAodWludDhfdCAqKSBwY21kLAorCQkJCQkgICAgICAgc2l6ZW9mKHBjbWQtPmJvZHkudHVybl9vbi5yZXEpICsKKwkJCQkJICAgICAgIEhFQURFUl9TSVpFLAorCQkJCQkgICAgICAgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQkJICAgICAgIHNpemVvZihwcnNwLT5ib2R5LnR1cm5fb24ucnNwKSArCisJCQkJCSAgICAgICBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19UVVJOT05fUlNQKTsKKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF90dXJuX29mZiAtIHNlbmQgdHVybiBvZmYgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICAgcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2ludCBhczEweF9jbWRfdHVybl9vZmYoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CisKKwlFTlRFUigpOworCisJcGNtZCA9IHBoYW5kbGUtPmNtZDsKKwlwcnNwID0gcGhhbmRsZS0+cnNwOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJYXMxMHhfY21kX2J1aWxkKHBjbWQsICgrK3BoYW5kbGUtPmNtZF94aWQpLAorCQkJc2l6ZW9mKHBjbWQtPmJvZHkudHVybl9vZmYucmVxKSk7CisKKwkvKiBmaWxsIGNvbW1hbmQgKi8KKwlwY21kLT5ib2R5LnR1cm5fb2ZmLnJlcS5wcm9jX2lkID0gY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX1RVUk5PRkYpOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQpIHsKKwkJZXJyb3IgPSBwaGFuZGxlLT5vcHMtPnhmZXJfY21kKAorCQkJcGhhbmRsZSwgKHVpbnQ4X3QgKikgcGNtZCwKKwkJCXNpemVvZihwY21kLT5ib2R5LnR1cm5fb2ZmLnJlcSkgKyBIRUFERVJfU0laRSwKKwkJCSh1aW50OF90ICopIHByc3AsCisJCQlzaXplb2YocHJzcC0+Ym9keS50dXJuX29mZi5yc3ApICsgSEVBREVSX1NJWkUpOworCX0gZWxzZSB7CisJCWVycm9yID0gQVMxMFhfQ01EX0VSUk9SOworCX0KKworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogcGFyc2UgcmVzcG9uc2UgKi8KKwllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfVFVSTk9GRl9SU1ApOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogYXMxMHhfY21kX3NldF90dW5lIC0gc2VuZCBzZXQgdHVuZSBjb21tYW5kIHRvIEFTMTB4CisgKiBAcGhhbmRsZTogcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqIEBwdHVuZTogICB0dW5lIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2ludCBhczEweF9jbWRfc2V0X3R1bmUoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsIHN0cnVjdCBhczEweF90dW5lX2FyZ3MgKnB0dW5lKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnByZXEsICpwcnNwOworCisJRU5URVIoKTsKKworCXByZXEgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwcmVxLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwcmVxLT5ib2R5LnNldF90dW5lLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEucHJvY19pZCA9IGNwdV90b19sZTE2KENPTlRST0xfUFJPQ19TRVRUVU5FKTsKKwlwcmVxLT5ib2R5LnNldF90dW5lLnJlcS5hcmdzLmZyZXEgPSBjcHVfdG9fbGUzMihwdHVuZS0+ZnJlcSk7CisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEuYXJncy5iYW5kd2lkdGggPSBwdHVuZS0+YmFuZHdpZHRoOworCXByZXEtPmJvZHkuc2V0X3R1bmUucmVxLmFyZ3MuaGllcl9zZWxlY3QgPSBwdHVuZS0+aGllcl9zZWxlY3Q7CisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEuYXJncy5jb25zdGVsbGF0aW9uID0gcHR1bmUtPmNvbnN0ZWxsYXRpb247CisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEuYXJncy5oaWVyYXJjaHkgPSBwdHVuZS0+aGllcmFyY2h5OworCXByZXEtPmJvZHkuc2V0X3R1bmUucmVxLmFyZ3MuaW50ZXJsZWF2aW5nX21vZGUgID0KKwkJcHR1bmUtPmludGVybGVhdmluZ19tb2RlOworCXByZXEtPmJvZHkuc2V0X3R1bmUucmVxLmFyZ3MuY29kZV9yYXRlICA9IHB0dW5lLT5jb2RlX3JhdGU7CisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEuYXJncy5ndWFyZF9pbnRlcnZhbCA9IHB0dW5lLT5ndWFyZF9pbnRlcnZhbDsKKwlwcmVxLT5ib2R5LnNldF90dW5lLnJlcS5hcmdzLnRyYW5zbWlzc2lvbl9tb2RlICA9CisJCXB0dW5lLT50cmFuc21pc3Npb25fbW9kZTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZChwaGFuZGxlLAorCQkJCQkgICAgICAgKHVpbnQ4X3QgKikgcHJlcSwKKwkJCQkJICAgICAgIHNpemVvZihwcmVxLT5ib2R5LnNldF90dW5lLnJlcSkKKwkJCQkJICAgICAgICsgSEVBREVSX1NJWkUsCisJCQkJCSAgICAgICAodWludDhfdCAqKSBwcnNwLAorCQkJCQkgICAgICAgc2l6ZW9mKHByc3AtPmJvZHkuc2V0X3R1bmUucnNwKQorCQkJCQkgICAgICAgKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19TRVRUVU5FX1JTUCk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jbWRfZ2V0X3R1bmVfc3RhdHVzIC0gc2VuZCBnZXQgdHVuZSBzdGF0dXMgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6IHBvaW50ZXIgdG8gQVMxMHggaGFuZGxlCisgKiBAcHN0YXR1czogcG9pbnRlciB0byB1cGRhdGVkIHN0YXR1cyBzdHJ1Y3R1cmUgb2YgdGhlIGN1cnJlbnQgdHVuZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9nZXRfdHVuZV9zdGF0dXMoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsCisJCQkgICAgICBzdHJ1Y3QgYXMxMHhfdHVuZV9zdGF0dXMgKnBzdGF0dXMpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBhczEweF9jbWRfdCAgKnByZXEsICpwcnNwOworCisJRU5URVIoKTsKKworCXByZXEgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwcmVxLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwcmVxLT5ib2R5LmdldF90dW5lX3N0YXR1cy5yZXEpKTsKKworCS8qIGZpbGwgY29tbWFuZCAqLworCXByZXEtPmJvZHkuZ2V0X3R1bmVfc3RhdHVzLnJlcS5wcm9jX2lkID0KKwkJY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0dFVFRVTkVTVEFUKTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZCgKKwkJCXBoYW5kbGUsCisJCQkodWludDhfdCAqKSBwcmVxLAorCQkJc2l6ZW9mKHByZXEtPmJvZHkuZ2V0X3R1bmVfc3RhdHVzLnJlcSkgKyBIRUFERVJfU0laRSwKKwkJCSh1aW50OF90ICopIHByc3AsCisJCQlzaXplb2YocHJzcC0+Ym9keS5nZXRfdHVuZV9zdGF0dXMucnNwKSArIEhFQURFUl9TSVpFKTsKKwl9IGVsc2UgeworCQllcnJvciA9IEFTMTBYX0NNRF9FUlJPUjsKKwl9CisKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIHBhcnNlIHJlc3BvbnNlICovCisJZXJyb3IgPSBhczEweF9yc3BfcGFyc2UocHJzcCwgQ09OVFJPTF9QUk9DX0dFVFRVTkVTVEFUX1JTUCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBSZXNwb25zZSBPSyAtPiBnZXQgcmVzcG9uc2UgZGF0YSAqLworCXBzdGF0dXMtPnR1bmVfc3RhdGUgPSBwcnNwLT5ib2R5LmdldF90dW5lX3N0YXR1cy5yc3Auc3RzLnR1bmVfc3RhdGU7CisJcHN0YXR1cy0+c2lnbmFsX3N0cmVuZ3RoICA9CisJCWxlMTZfdG9fY3B1KHByc3AtPmJvZHkuZ2V0X3R1bmVfc3RhdHVzLnJzcC5zdHMuc2lnbmFsX3N0cmVuZ3RoKTsKKwlwc3RhdHVzLT5QRVIgPSBsZTE2X3RvX2NwdShwcnNwLT5ib2R5LmdldF90dW5lX3N0YXR1cy5yc3Auc3RzLlBFUik7CisJcHN0YXR1cy0+QkVSID0gbGUxNl90b19jcHUocHJzcC0+Ym9keS5nZXRfdHVuZV9zdGF0dXMucnNwLnN0cy5CRVIpOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogc2VuZCBnZXQgVFBTIGNvbW1hbmQgdG8gQVMxMHgKKyAqIEBwaGFuZGxlOiAgIHBvaW50ZXIgdG8gQVMxMHggaGFuZGxlCisgKiBAcHRwczogICAgICBwb2ludGVyIHRvIFRQUyBwYXJhbWV0ZXJzIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9nZXRfdHBzKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlLCBzdHJ1Y3QgYXMxMHhfdHBzICpwdHBzKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmdldF90cHMucmVxKSk7CisKKwkvKiBmaWxsIGNvbW1hbmQgKi8KKwlwY21kLT5ib2R5LmdldF90dW5lX3N0YXR1cy5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19HRVRUUFMpOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQpIHsKKwkJZXJyb3IgPSBwaGFuZGxlLT5vcHMtPnhmZXJfY21kKHBoYW5kbGUsCisJCQkJCSAgICAgICAodWludDhfdCAqKSBwY21kLAorCQkJCQkgICAgICAgc2l6ZW9mKHBjbWQtPmJvZHkuZ2V0X3Rwcy5yZXEpICsKKwkJCQkJICAgICAgIEhFQURFUl9TSVpFLAorCQkJCQkgICAgICAgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQkJICAgICAgIHNpemVvZihwcnNwLT5ib2R5LmdldF90cHMucnNwKSArCisJCQkJCSAgICAgICBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19HRVRUUFNfUlNQKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIFJlc3BvbnNlIE9LIC0+IGdldCByZXNwb25zZSBkYXRhICovCisJcHRwcy0+Y29uc3RlbGxhdGlvbiA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLmNvbnN0ZWxsYXRpb247CisJcHRwcy0+aGllcmFyY2h5ID0gcHJzcC0+Ym9keS5nZXRfdHBzLnJzcC50cHMuaGllcmFyY2h5OworCXB0cHMtPmludGVybGVhdmluZ19tb2RlID0gcHJzcC0+Ym9keS5nZXRfdHBzLnJzcC50cHMuaW50ZXJsZWF2aW5nX21vZGU7CisJcHRwcy0+Y29kZV9yYXRlX0hQID0gcHJzcC0+Ym9keS5nZXRfdHBzLnJzcC50cHMuY29kZV9yYXRlX0hQOworCXB0cHMtPmNvZGVfcmF0ZV9MUCA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLmNvZGVfcmF0ZV9MUDsKKwlwdHBzLT5ndWFyZF9pbnRlcnZhbCA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLmd1YXJkX2ludGVydmFsOworCXB0cHMtPnRyYW5zbWlzc2lvbl9tb2RlICA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLnRyYW5zbWlzc2lvbl9tb2RlOworCXB0cHMtPkRWQkhfbWFza19IUCA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLkRWQkhfbWFza19IUDsKKwlwdHBzLT5EVkJIX21hc2tfTFAgPSBwcnNwLT5ib2R5LmdldF90cHMucnNwLnRwcy5EVkJIX21hc2tfTFA7CisJcHRwcy0+Y2VsbF9JRCA9IGxlMTZfdG9fY3B1KHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLmNlbGxfSUQpOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogYXMxMHhfY21kX2dldF9kZW1vZF9zdGF0cyAtIHNlbmQgZ2V0IGRlbW9kIHN0YXRzIGNvbW1hbmQgdG8gQVMxMHgKKyAqIEBwaGFuZGxlOiAgICAgICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICogQHBkZW1vZF9zdGF0czogIHBvaW50ZXIgdG8gZGVtb2Qgc3RhdHMgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2ludCBhczEweF9jbWRfZ2V0X2RlbW9kX3N0YXRzKGFzMTB4X2hhbmRsZV90ICAqcGhhbmRsZSwKKwkJCSAgICAgIHN0cnVjdCBhczEweF9kZW1vZF9zdGF0cyAqcGRlbW9kX3N0YXRzKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yZXEpKTsKKworCS8qIGZpbGwgY29tbWFuZCAqLworCXBjbWQtPmJvZHkuZ2V0X2RlbW9kX3N0YXRzLnJlcS5wcm9jX2lkID0KKwkJY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0dFVF9ERU1PRF9TVEFUUyk7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwKKwkJCQkodWludDhfdCAqKSBwY21kLAorCQkJCXNpemVvZihwY21kLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwKKwkJCQkodWludDhfdCAqKSBwcnNwLAorCQkJCXNpemVvZihwcnNwLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19HRVRfREVNT0RfU1RBVFNfUlNQKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIFJlc3BvbnNlIE9LIC0+IGdldCByZXNwb25zZSBkYXRhICovCisJcGRlbW9kX3N0YXRzLT5mcmFtZV9jb3VudCA9CisJCWxlMzJfdG9fY3B1KHByc3AtPmJvZHkuZ2V0X2RlbW9kX3N0YXRzLnJzcC5zdGF0cy5mcmFtZV9jb3VudCk7CisJcGRlbW9kX3N0YXRzLT5iYWRfZnJhbWVfY291bnQgPQorCQlsZTMyX3RvX2NwdShwcnNwLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yc3Auc3RhdHMuYmFkX2ZyYW1lX2NvdW50KTsKKwlwZGVtb2Rfc3RhdHMtPmJ5dGVzX2ZpeGVkX2J5X3JzID0KKwkJbGUzMl90b19jcHUocHJzcC0+Ym9keS5nZXRfZGVtb2Rfc3RhdHMucnNwLnN0YXRzLmJ5dGVzX2ZpeGVkX2J5X3JzKTsKKwlwZGVtb2Rfc3RhdHMtPm1lciA9CisJCWxlMTZfdG9fY3B1KHByc3AtPmJvZHkuZ2V0X2RlbW9kX3N0YXRzLnJzcC5zdGF0cy5tZXIpOworCXBkZW1vZF9zdGF0cy0+aGFzX3N0YXJ0ZWQgPQorCQlwcnNwLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yc3Auc3RhdHMuaGFzX3N0YXJ0ZWQ7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jbWRfZ2V0X2ltcHVsc2VfcmVzcCAtIHNlbmQgZ2V0IGltcHVsc2UgcmVzcG9uc2UgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICogQGlzX3JlYWR5OiBwb2ludGVyIHRvIHZhbHVlIGluZGljYXRpbmcgd2hlbiBpbXB1bHNlCisgKgkgICAgICByZXNwb25zZSBkYXRhIGlzIHJlYWR5CisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgYXMxMHhfY21kX2dldF9pbXB1bHNlX3Jlc3AoYXMxMHhfaGFuZGxlX3QgICAgICpwaGFuZGxlLAorCQkJICAgICAgIHVpbnQ4X3QgKmlzX3JlYWR5KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmdldF9pbXB1bHNlX3JzcC5yZXEpKTsKKworCS8qIGZpbGwgY29tbWFuZCAqLworCXBjbWQtPmJvZHkuZ2V0X2ltcHVsc2VfcnNwLnJlcS5wcm9jX2lkID0KKwkJY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0dFVF9JTVBVTFNFX1JFU1ApOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQpIHsKKwkJZXJyb3IgPSBwaGFuZGxlLT5vcHMtPnhmZXJfY21kKHBoYW5kbGUsCisJCQkJCSh1aW50OF90ICopIHBjbWQsCisJCQkJCXNpemVvZihwY21kLT5ib2R5LmdldF9pbXB1bHNlX3JzcC5yZXEpCisJCQkJCSsgSEVBREVSX1NJWkUsCisJCQkJCSh1aW50OF90ICopIHByc3AsCisJCQkJCXNpemVvZihwcnNwLT5ib2R5LmdldF9pbXB1bHNlX3JzcC5yc3ApCisJCQkJCSsgSEVBREVSX1NJWkUpOworCX0gZWxzZSB7CisJCWVycm9yID0gQVMxMFhfQ01EX0VSUk9SOworCX0KKworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogcGFyc2UgcmVzcG9uc2UgKi8KKwllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfR0VUX0lNUFVMU0VfUkVTUF9SU1ApOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogUmVzcG9uc2UgT0sgLT4gZ2V0IHJlc3BvbnNlIGRhdGEgKi8KKwkqaXNfcmVhZHkgPSBwcnNwLT5ib2R5LmdldF9pbXB1bHNlX3JzcC5yc3AuaXNfcmVhZHk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jbWRfYnVpbGQgLSBidWlsZCBBUzEweCBjb21tYW5kIGhlYWRlcgorICogQHBjbWQ6ICAgICBwb2ludGVyIHRvIEFTMTB4IGNvbW1hbmQgYnVmZmVyCisgKiBAeGlkOiAgICAgIHNlcXVlbmNlIGlkIG9mIHRoZSBjb21tYW5kCisgKiBAY21kX2xlbjogIGxlbmd0aCBvZiB0aGUgY29tbWFuZAorICovCit2b2lkIGFzMTB4X2NtZF9idWlsZChzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsCisJCSAgICAgdWludDE2X3QgeGlkLCB1aW50MTZfdCBjbWRfbGVuKQoreworCXBjbWQtPmhlYWRlci5yZXFfaWQgPSBjcHVfdG9fbGUxNih4aWQpOworCXBjbWQtPmhlYWRlci5wcm9nID0gY3B1X3RvX2xlMTYoU0VSVklDRV9QUk9HX0lEKTsKKwlwY21kLT5oZWFkZXIudmVyc2lvbiA9IGNwdV90b19sZTE2KFNFUlZJQ0VfUFJPR19WRVJTSU9OKTsKKwlwY21kLT5oZWFkZXIuZGF0YV9sZW4gPSBjcHVfdG9fbGUxNihjbWRfbGVuKTsKK30KKworLyoqCisgKiBhczEweF9yc3BfcGFyc2UgLSBQYXJzZSBjb21tYW5kIHJlc3BvbnNlCisgKiBAcHJzcDogICAgICAgcG9pbnRlciB0byBBUzEweCBjb21tYW5kIGJ1ZmZlcgorICogQHByb2NfaWQ6ICAgIGlkIG9mIHRoZSBjb21tYW5kCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgYXMxMHhfcnNwX3BhcnNlKHN0cnVjdCBhczEweF9jbWRfdCAqcHJzcCwgdWludDE2X3QgcHJvY19pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwkvKiBleHRyYWN0IGNvbW1hbmQgZXJyb3IgY29kZSAqLworCWVycm9yID0gcHJzcC0+Ym9keS5jb21tb24ucnNwLmVycm9yOworCisJaWYgKChlcnJvciA9PSAwKSAmJgorCSAgICAobGUxNl90b19jcHUocHJzcC0+Ym9keS5jb21tb24ucnNwLnByb2NfaWQpID09IHByb2NfaWQpKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBBUzEwWF9DTURfRVJST1I7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhNzE2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWQuaApAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIEFiaWxpcyBTeXN0ZW1zIFNpbmdsZSBEVkItVCBSZWNlaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2lmbmRlZiBfQVMxMFhfQ01EX0hfCisjZGVmaW5lIF9BUzEwWF9DTURfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYXMxMHhfdHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgIE1BQ1JPIERFRklOSVRJT05TICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBUzEwWF9DTURfRVJST1IgLTEKKworI2RlZmluZSBTRVJWSUNFX1BST0dfSUQgICAgICAgIDB4MDAwMgorI2RlZmluZSBTRVJWSUNFX1BST0dfVkVSU0lPTiAgIDB4MDAwMQorCisjZGVmaW5lIEhJRVJfTk9ORSAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBISUVSX0xPV19QUklPUklUWSAgICAgIDB4MDEKKworI2RlZmluZSBIRUFERVJfU0laRSAoc2l6ZW9mKHN0cnVjdCBhczEweF9jbWRfaGVhZGVyX3QpKQorCisvKiBjb250ZXh0IHJlcXVlc3QgdHlwZXMgKi8KKyNkZWZpbmUgR0VUX0NPTlRFWFRfREFUQSAgICAgICAgMQorI2RlZmluZSBTRVRfQ09OVEVYVF9EQVRBICAgICAgICAyCisKKy8qIE9EU1Agc3VzcGVuZCBtb2RlcyAqLworI2RlZmluZSBDRkdfTU9ERV9PRFNQX1JFU1VNRSAgMAorI2RlZmluZSBDRkdfTU9ERV9PRFNQX1NVU1BFTkQgMQorCisvKiBEdW1wIG1lbW9yeSBzaXplICovCisjZGVmaW5lIERVTVBfQkxPQ0tfU0laRV9NQVggICAweDIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgVFlQRSBERUZJTklUSU9OICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgICBDT05UUk9MX1BST0NfVFVSTk9OICAgICAgICAgICAgICAgPSAweDAwMDEsCisgICBDT05UUk9MX1BST0NfVFVSTk9OX1JTUCAgICAgICAgICAgPSAweDAxMDAsCisgICBDT05UUk9MX1BST0NfU0VUX1JFR0lTVEVSICAgICAgICAgPSAweDAwMDIsCisgICBDT05UUk9MX1BST0NfU0VUX1JFR0lTVEVSX1JTUCAgICAgPSAweDAyMDAsCisgICBDT05UUk9MX1BST0NfR0VUX1JFR0lTVEVSICAgICAgICAgPSAweDAwMDMsCisgICBDT05UUk9MX1BST0NfR0VUX1JFR0lTVEVSX1JTUCAgICAgPSAweDAzMDAsCisgICBDT05UUk9MX1BST0NfU0VUVFVORSAgICAgICAgICAgICAgPSAweDAwMEEsCisgICBDT05UUk9MX1BST0NfU0VUVFVORV9SU1AgICAgICAgICAgPSAweDBBMDAsCisgICBDT05UUk9MX1BST0NfR0VUVFVORVNUQVQgICAgICAgICAgPSAweDAwMEIsCisgICBDT05UUk9MX1BST0NfR0VUVFVORVNUQVRfUlNQICAgICAgPSAweDBCMDAsCisgICBDT05UUk9MX1BST0NfR0VUVFBTICAgICAgICAgICAgICAgPSAweDAwMEQsCisgICBDT05UUk9MX1BST0NfR0VUVFBTX1JTUCAgICAgICAgICAgPSAweDBEMDAsCisgICBDT05UUk9MX1BST0NfU0VURklMVEVSICAgICAgICAgICAgPSAweDAwMEUsCisgICBDT05UUk9MX1BST0NfU0VURklMVEVSX1JTUCAgICAgICAgPSAweDBFMDAsCisgICBDT05UUk9MX1BST0NfUkVNT1ZFRklMVEVSICAgICAgICAgPSAweDAwMEYsCisgICBDT05UUk9MX1BST0NfUkVNT1ZFRklMVEVSX1JTUCAgICAgPSAweDBGMDAsCisgICBDT05UUk9MX1BST0NfR0VUX0lNUFVMU0VfUkVTUCAgICAgPSAweDAwMTIsCisgICBDT05UUk9MX1BST0NfR0VUX0lNUFVMU0VfUkVTUF9SU1AgPSAweDEyMDAsCisgICBDT05UUk9MX1BST0NfU1RBUlRfU1RSRUFNSU5HICAgICAgPSAweDAwMTMsCisgICBDT05UUk9MX1BST0NfU1RBUlRfU1RSRUFNSU5HX1JTUCAgPSAweDEzMDAsCisgICBDT05UUk9MX1BST0NfU1RPUF9TVFJFQU1JTkcgICAgICAgPSAweDAwMTQsCisgICBDT05UUk9MX1BST0NfU1RPUF9TVFJFQU1JTkdfUlNQICAgPSAweDE0MDAsCisgICBDT05UUk9MX1BST0NfR0VUX0RFTU9EX1NUQVRTICAgICAgPSAweDAwMTUsCisgICBDT05UUk9MX1BST0NfR0VUX0RFTU9EX1NUQVRTX1JTUCAgPSAweDE1MDAsCisgICBDT05UUk9MX1BST0NfRUxOQV9DSEFOR0VfTU9ERSAgICAgPSAweDAwMTYsCisgICBDT05UUk9MX1BST0NfRUxOQV9DSEFOR0VfTU9ERV9SU1AgPSAweDE2MDAsCisgICBDT05UUk9MX1BST0NfT0RTUF9DSEFOR0VfTU9ERSAgICAgPSAweDAwMTcsCisgICBDT05UUk9MX1BST0NfT0RTUF9DSEFOR0VfTU9ERV9SU1AgPSAweDE3MDAsCisgICBDT05UUk9MX1BST0NfQUdDX0NIQU5HRV9NT0RFICAgICAgPSAweDAwMTgsCisgICBDT05UUk9MX1BST0NfQUdDX0NIQU5HRV9NT0RFX1JTUCAgPSAweDE4MDAsCisKKyAgIENPTlRST0xfUFJPQ19DT05URVhUICAgICAgICAgICAgICA9IDB4MDBGQywKKyAgIENPTlRST0xfUFJPQ19DT05URVhUX1JTUCAgICAgICAgICA9IDB4RkMwMCwKKyAgIENPTlRST0xfUFJPQ19EVU1QX01FTU9SWSAgICAgICAgICA9IDB4MDBGRCwKKyAgIENPTlRST0xfUFJPQ19EVU1QX01FTU9SWV9SU1AgICAgICA9IDB4RkQwMCwKKyAgIENPTlRST0xfUFJPQ19EVU1QTE9HX01FTU9SWSAgICAgICA9IDB4MDBGRSwKKyAgIENPTlRST0xfUFJPQ19EVU1QTE9HX01FTU9SWV9SU1AgICA9IDB4RkUwMCwKKyAgIENPTlRST0xfUFJPQ19UVVJOT0ZGICAgICAgICAgICAgICA9IDB4MDBGRiwKKyAgIENPTlRST0xfUFJPQ19UVVJOT0ZGX1JTUCAgICAgICAgICA9IDB4RkYwMAorfSBjb250cm9sX3Byb2M7CisKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgfSByc3A7Cit9IFRVUk5fT047CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyOworICAgfSByc3A7Cit9IFRVUk5fT0ZGOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiB0dW5lIHBhcmFtcyAqLworICAgICAgc3RydWN0IGFzMTB4X3R1bmVfYXJncyBhcmdzOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZXNwb25zZSBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgIH0gcnNwOworfSBTRVRfVFVORTsKKwordHlwZWRlZiB1bmlvbiB7CisgICAvKiByZXF1ZXN0ICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVxdWVzdCBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZXNwb25zZSBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgICAgIC8qIHR1bmUgc3RhdHVzICovCisgICAgICBzdHJ1Y3QgYXMxMHhfdHVuZV9zdGF0dXMgc3RzOworICAgfSByc3A7Cit9IEdFVF9UVU5FX1NUQVRVUzsKKwordHlwZWRlZiB1bmlvbiB7CisgICAvKiByZXF1ZXN0ICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVxdWVzdCBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZXNwb25zZSBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgICAgIC8qIHRwcyBkZXRhaWxzICovCisgICAgICBzdHJ1Y3QgYXMxMHhfdHBzIHRwczsKKyAgIH0gcnNwOworfSBHRVRfVFBTOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90ICBwcm9jX2lkOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZXNwb25zZSBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgIH0gcnNwOworfSBDT01NT047CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgIHByb2NfaWQ7CisgICAgICAvKiBQSUQgdG8gZmlsdGVyICovCisgICAgICB1aW50MTZfdCAgcGlkOworICAgICAgLyogc3RyZWFtIHR5cGUgKE1QRSwgUFNJL1NJIG9yIFBFUyApKi8KKyAgICAgIHVpbnQ4X3Qgc3RyZWFtX3R5cGU7CisgICAgICAvKiBQSUQgaW5kZXggaW4gZmlsdGVyIHRhYmxlICovCisgICAgICB1aW50OF90IGlkeDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogcmVzcG9uc2UgZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICAgICAvKiBGaWx0ZXIgaWQgKi8KKyAgICAgIHVpbnQ4X3QgZmlsdGVyX2lkOworICAgfSByc3A7Cit9IEFERF9QSURfRklMVEVSOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90ICBwcm9jX2lkOworICAgICAgLyogUElEIHRvIHJlbW92ZSAqLworICAgICAgdWludDE2X3QgIHBpZDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogcmVzcG9uc2UgZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICB9IHJzcDsKK30gREVMX1BJRF9GSUxURVI7CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICB9IHJzcDsKK30gU1RBUlRfU1RSRUFNSU5HOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgfSByc3A7Cit9IFNUT1BfU1RSRUFNSU5HOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgICAgLyogZGVtb2Qgc3RhdHMgKi8KKyAgICAgIHN0cnVjdCBhczEweF9kZW1vZF9zdGF0cyBzdGF0czsKKyAgIH0gcnNwOworfSBHRVRfREVNT0RfU1RBVFM7CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICAgICAvKiBpbXB1bHNlIHJlc3BvbnNlIHJlYWR5ICovCisgICAgICB1aW50OF90IGlzX3JlYWR5OworICAgfSByc3A7Cit9IEdFVF9JTVBVTFNFX1JFU1A7CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIHZhbHVlIHRvIHdyaXRlIChmb3Igc2V0IGNvbnRleHQpKi8KKyAgICAgIHN0cnVjdCBhczEweF9yZWdpc3Rlcl92YWx1ZSByZWdfdmFsOworICAgICAgLyogY29udGV4dCB0YWcgKi8KKyAgICAgIHVpbnQxNl90IHRhZzsKKyAgICAgIC8qIGNvbnRleHQgcmVxdWVzdCB0eXBlICovCisgICAgICB1aW50MTZfdCB0eXBlOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiB2YWx1ZSByZWFkIChmb3IgZ2V0IGNvbnRleHQpICovCisgICAgICBzdHJ1Y3QgYXMxMHhfcmVnaXN0ZXJfdmFsdWUgcmVnX3ZhbDsKKyAgICAgIC8qIGNvbnRleHQgcmVxdWVzdCB0eXBlICovCisgICAgICB1aW50MTZfdCB0eXBlOworICAgICAgLyogZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICB9IHJzcDsKK30gRldfQ09OVEVYVDsKKwordHlwZWRlZiB1bmlvbiB7CisgICAvKiByZXF1ZXN0ICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIHJlZ2lzdGVyIGRlc2NyaXB0aW9uICovCisgICAgICBzdHJ1Y3QgYXMxMHhfcmVnaXN0ZXJfYWRkciByZWdfYWRkcjsKKyAgICAgIC8qIHJlZ2lzdGVyIGNvbnRlbnQgKi8KKyAgICAgIHN0cnVjdCBhczEweF9yZWdpc3Rlcl92YWx1ZSByZWdfdmFsOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgIH0gcnNwOworfSBTRVRfUkVHSVNURVI7CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZWdpc3RlciBkZXNjcmlwdGlvbiAqLworICAgICAgc3RydWN0IGFzMTB4X3JlZ2lzdGVyX2FkZHIgcmVnX2FkZHI7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgICAgLyogcmVnaXN0ZXIgY29udGVudCAqLworICAgICAgc3RydWN0IGFzMTB4X3JlZ2lzdGVyX3ZhbHVlIHJlZ192YWw7CisgICB9IHJzcDsKK30gR0VUX1JFR0lTVEVSOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBtb2RlICovCisgICAgICB1aW50OF90IG1vZGU7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgfSByc3A7Cit9IENGR19DSEFOR0VfTU9ERTsKKworc3RydWN0IGFzMTB4X2NtZF9oZWFkZXJfdCB7CisgICB1aW50MTZfdCByZXFfaWQ7CisgICB1aW50MTZfdCBwcm9nOworICAgdWludDE2X3QgdmVyc2lvbjsKKyAgIHVpbnQxNl90IGRhdGFfbGVuOworfTsKKworI2RlZmluZSBEVU1QX0JMT0NLX1NJWkUgMTYKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGR1bXAgbWVtb3J5IHR5cGUgcmVxdWVzdCAqLworICAgICAgdWludDhfdCBkdW1wX3JlcTsKKyAgICAgIC8qIHJlZ2lzdGVyIGRlc2NyaXB0aW9uICovCisgICAgICBzdHJ1Y3QgYXMxMHhfcmVnaXN0ZXJfYWRkciByZWdfYWRkcjsKKyAgICAgIC8qIG5iIGJsb2NrcyB0byByZWFkICovCisgICAgICB1aW50MTZfdCBudW1fYmxvY2tzOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgICAgIC8qIGR1bXAgcmVzcG9uc2UgKi8KKyAgICAgIHVpbnQ4X3QgZHVtcF9yc3A7CisgICAgICAvKiBkYXRhICovCisgICAgICB1bmlvbiB7CisJIHVpbnQ4X3QgIGRhdGE4W0RVTVBfQkxPQ0tfU0laRV07CisJIHVpbnQxNl90IGRhdGExNltEVU1QX0JMT0NLX1NJWkUgLyBzaXplb2YodWludDE2X3QpXTsKKwkgdWludDMyX3QgZGF0YTMyW0RVTVBfQkxPQ0tfU0laRSAvIHNpemVvZih1aW50MzJfdCldOworICAgICAgfSB1OworICAgfSByc3A7Cit9IERVTVBfTUVNT1JZOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBkdW1wIG1lbW9yeSB0eXBlIHJlcXVlc3QgKi8KKyAgICAgIHVpbnQ4X3QgZHVtcF9yZXE7CisgICB9IHJlcTsKKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgICAgIC8qIGR1bXAgcmVzcG9uc2UgKi8KKyAgICAgIHVpbnQ4X3QgZHVtcF9yc3A7CisgICAgICAvKiBkdW1wIGRhdGEgKi8KKyAgICAgIHVpbnQ4X3QgZGF0YVtEVU1QX0JMT0NLX1NJWkVdOworICAgfSByc3A7Cit9IERVTVBMT0dfTUVNT1JZOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgdWludDhfdCBkYXRhWzY0IC0gc2l6ZW9mKHN0cnVjdCBhczEweF9jbWRfaGVhZGVyX3QpIC0yIC8qIHByb2NfaWQgKi9dOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICB1aW50OF90IGVycm9yOworICAgICAgdWludDhfdCBkYXRhWzY0IC0gc2l6ZW9mKHN0cnVjdCBhczEweF9jbWRfaGVhZGVyX3QpIC8qIGhlYWRlciAqLworCQkgICAgICAtIDIgLyogcHJvY19pZCAqLyAtIDEgLyogcmMgKi9dOworICAgfSByc3A7Cit9IFJBV19EQVRBOworCitzdHJ1Y3QgYXMxMHhfY21kX3QgeworICAgLyogaGVhZGVyICovCisgICBzdHJ1Y3QgYXMxMHhfY21kX2hlYWRlcl90IGhlYWRlcjsKKyAgIC8qIGJvZHkgKi8KKyAgIHVuaW9uIHsKKyAgICAgIFRVUk5fT04gICAgICAgICAgIHR1cm5fb247CisgICAgICBUVVJOX09GRiAgICAgICAgICB0dXJuX29mZjsKKyAgICAgIFNFVF9UVU5FICAgICAgICAgIHNldF90dW5lOworICAgICAgR0VUX1RVTkVfU1RBVFVTICAgZ2V0X3R1bmVfc3RhdHVzOworICAgICAgR0VUX1RQUyAgICAgICAgICAgZ2V0X3RwczsKKyAgICAgIENPTU1PTiAgICAgICAgICAgIGNvbW1vbjsKKyAgICAgIEFERF9QSURfRklMVEVSICAgIGFkZF9waWRfZmlsdGVyOworICAgICAgREVMX1BJRF9GSUxURVIgICAgZGVsX3BpZF9maWx0ZXI7CisgICAgICBTVEFSVF9TVFJFQU1JTkcgICBzdGFydF9zdHJlYW1pbmc7CisgICAgICBTVE9QX1NUUkVBTUlORyAgICBzdG9wX3N0cmVhbWluZzsKKyAgICAgIEdFVF9ERU1PRF9TVEFUUyAgIGdldF9kZW1vZF9zdGF0czsKKyAgICAgIEdFVF9JTVBVTFNFX1JFU1AgIGdldF9pbXB1bHNlX3JzcDsKKyAgICAgIEZXX0NPTlRFWFQgICAgICAgIGNvbnRleHQ7CisgICAgICBTRVRfUkVHSVNURVIgICAgICBzZXRfcmVnaXN0ZXI7CisgICAgICBHRVRfUkVHSVNURVIgICAgICBnZXRfcmVnaXN0ZXI7CisgICAgICBDRkdfQ0hBTkdFX01PREUgICBjZmdfY2hhbmdlX21vZGU7CisgICAgICBEVU1QX01FTU9SWSAgICAgICBkdW1wX21lbW9yeTsKKyAgICAgIERVTVBMT0dfTUVNT1JZICAgIGR1bXBsb2dfbWVtb3J5OworICAgICAgUkFXX0RBVEEgICAgICAgICAgcmF3X2RhdGE7CisgICB9IGJvZHk7Cit9OworCitzdHJ1Y3QgYXMxMHhfdG9rZW5fY21kX3QgeworICAgLyogdG9rZW4gY21kICovCisgICBzdHJ1Y3QgYXMxMHhfY21kX3QgYzsKKyAgIC8qIHRva2VuIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgYXMxMHhfY21kX3QgcjsKK307CisjcHJhZ21hIHBhY2soKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OIERFQ0xBUkFUSU9OICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhczEweF9jbWRfYnVpbGQoc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCB1aW50MTZfdCBwcm9jX2lkLAorCQkgICAgICB1aW50MTZfdCBjbWRfbGVuKTsKK2ludCBhczEweF9yc3BfcGFyc2Uoc3RydWN0IGFzMTB4X2NtZF90ICpyLCB1aW50MTZfdCBwcm9jX2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBhczEweCBjbWQgKi8KK2ludCBhczEweF9jbWRfdHVybl9vbihhczEweF9oYW5kbGVfdCAqcGhhbmRsZSk7CitpbnQgYXMxMHhfY21kX3R1cm5fb2ZmKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlKTsKKworaW50IGFzMTB4X2NtZF9zZXRfdHVuZShhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJICAgICAgIHN0cnVjdCBhczEweF90dW5lX2FyZ3MgKnB0dW5lKTsKKworaW50IGFzMTB4X2NtZF9nZXRfdHVuZV9zdGF0dXMoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsCisJCQkgICAgICBzdHJ1Y3QgYXMxMHhfdHVuZV9zdGF0dXMgKnBzdGF0dXMpOworCitpbnQgYXMxMHhfY21kX2dldF90cHMoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsCisJCSAgICAgIHN0cnVjdCBhczEweF90cHMgKnB0cHMpOworCitpbnQgYXMxMHhfY21kX2dldF9kZW1vZF9zdGF0cyhhczEweF9oYW5kbGVfdCAgKnBoYW5kbGUsCisJCQkgICAgICBzdHJ1Y3QgYXMxMHhfZGVtb2Rfc3RhdHMgKnBkZW1vZF9zdGF0cyk7CisKK2ludCBhczEweF9jbWRfZ2V0X2ltcHVsc2VfcmVzcChhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJCSAgICAgICB1aW50OF90ICppc19yZWFkeSk7CisKKy8qIGFzMTB4IGNtZCBzdHJlYW0gKi8KK2ludCBhczEweF9jbWRfYWRkX1BJRF9maWx0ZXIoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBhczEweF90c19maWx0ZXIgKmZpbHRlcik7CitpbnQgYXMxMHhfY21kX2RlbF9QSURfZmlsdGVyKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlLAorCQkJICAgICB1aW50MTZfdCBwaWRfdmFsdWUpOworCitpbnQgYXMxMHhfY21kX3N0YXJ0X3N0cmVhbWluZyhhczEweF9oYW5kbGVfdCAqcGhhbmRsZSk7CitpbnQgYXMxMHhfY21kX3N0b3Bfc3RyZWFtaW5nKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlKTsKKworLyogYXMxMHggY21kIGNmZyAqLworaW50IGFzMTB4X2NtZF9zZXRfY29udGV4dChhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJCSAgdWludDE2X3QgdGFnLAorCQkJICB1aW50MzJfdCB2YWx1ZSk7CitpbnQgYXMxMHhfY21kX2dldF9jb250ZXh0KGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlLAorCQkJICB1aW50MTZfdCB0YWcsCisJCQkgIHVpbnQzMl90ICpwdmFsdWUpOworCitpbnQgYXMxMHhfY21kX2VMTkFfY2hhbmdlX21vZGUoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsIHVpbnQ4X3QgbW9kZSk7CitpbnQgYXMxMHhfY29udGV4dF9yc3BfcGFyc2Uoc3RydWN0IGFzMTB4X2NtZF90ICpwcnNwLCB1aW50MTZfdCBwcm9jX2lkKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKKy8qIEVPRiAtIHZpbTogc2V0IHRleHR3aWR0aD04MCB0cz0zIHN3PTMgc3RzPTMgZXQ6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfY21kX2NmZy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZF9jZmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzZmNjlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZF9jZmcuYwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIEFiaWxpcyBTeXN0ZW1zIFNpbmdsZSBEVkItVCBSZWNlaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSAiYXMxMDJfZHJ2LmgiCisjaW5jbHVkZSAiYXMxMHhfdHlwZXMuaCIKKyNpbmNsdWRlICJhczEweF9jbWQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OIERFRklOSVRJT04gICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGFzMTB4X2NtZF9nZXRfY29udGV4dCAtIFNlbmQgZ2V0IGNvbnRleHQgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICAgcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqIEB0YWc6ICAgICAgIGNvbnRleHQgdGFnCisgKiBAcHZhbHVlOiAgICBwb2ludGVyIHdoZXJlIHRvIHN0b3JlIGNvbnRleHQgdmFsdWUgcmVhZAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9nZXRfY29udGV4dChhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwgdWludDE2X3QgdGFnLAorCQkJICB1aW50MzJfdCAqcHZhbHVlKQoreworCWludCAgZXJyb3I7CisJc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCAqcHJzcDsKKworCUVOVEVSKCk7CisKKwlwY21kID0gcGhhbmRsZS0+Y21kOworCXByc3AgPSBwaGFuZGxlLT5yc3A7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwlhczEweF9jbWRfYnVpbGQocGNtZCwgKCsrcGhhbmRsZS0+Y21kX3hpZCksCisJCQlzaXplb2YocGNtZC0+Ym9keS5jb250ZXh0LnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5jb250ZXh0LnJlcS5wcm9jX2lkID0gY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0NPTlRFWFQpOworCXBjbWQtPmJvZHkuY29udGV4dC5yZXEudGFnID0gY3B1X3RvX2xlMTYodGFnKTsKKwlwY21kLT5ib2R5LmNvbnRleHQucmVxLnR5cGUgPSBjcHVfdG9fbGUxNihHRVRfQ09OVEVYVF9EQVRBKTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yICA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwKKwkJCQkJCSh1aW50OF90ICopIHBjbWQsCisJCQkJCQlzaXplb2YocGNtZC0+Ym9keS5jb250ZXh0LnJlcSkKKwkJCQkJCSsgSEVBREVSX1NJWkUsCisJCQkJCQkodWludDhfdCAqKSBwcnNwLAorCQkJCQkJc2l6ZW9mKHByc3AtPmJvZHkuY29udGV4dC5yc3ApCisJCQkJCQkrIEhFQURFUl9TSVpFKTsKKwl9IGVsc2UgeworCQllcnJvciA9IEFTMTBYX0NNRF9FUlJPUjsKKwl9CisKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIHBhcnNlIHJlc3BvbnNlOiBjb250ZXh0IGNvbW1hbmQgZG8gbm90IGZvbGxvdyB0aGUgY29tbW9uIHJlc3BvbnNlICovCisJLyogc3RydWN0dXJlIC0+IHNwZWNpZmljIGhhbmRsaW5nIHJlc3BvbnNlIHBhcnNlIHJlcXVpcmVkICAgICAgICAgICAgKi8KKwllcnJvciA9IGFzMTB4X2NvbnRleHRfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19DT05URVhUX1JTUCk7CisKKwlpZiAoZXJyb3IgPT0gMCkgeworCQkvKiBSZXNwb25zZSBPSyAtPiBnZXQgcmVzcG9uc2UgZGF0YSAqLworCQkqcHZhbHVlID0gbGUzMl90b19jcHUocHJzcC0+Ym9keS5jb250ZXh0LnJzcC5yZWdfdmFsLnUudmFsdWUzMik7CisJCS8qIHZhbHVlIHJldHVybmVkIGlzIGFsd2F5cyBhIDMyLWJpdCB2YWx1ZSAqLworCX0KKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF9zZXRfY29udGV4dCAtIHNlbmQgc2V0IGNvbnRleHQgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICAgcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqIEB0YWc6ICAgICAgIGNvbnRleHQgdGFnCisgKiBAdmFsdWU6ICAgICB2YWx1ZSB0byBzZXQgaW4gY29udGV4dAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9zZXRfY29udGV4dChhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwgdWludDE2X3QgdGFnLAorCQkJICB1aW50MzJfdCB2YWx1ZSkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCAqcHJzcDsKKworCUVOVEVSKCk7CisKKwlwY21kID0gcGhhbmRsZS0+Y21kOworCXByc3AgPSBwaGFuZGxlLT5yc3A7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwlhczEweF9jbWRfYnVpbGQocGNtZCwgKCsrcGhhbmRsZS0+Y21kX3hpZCksCisJCQlzaXplb2YocGNtZC0+Ym9keS5jb250ZXh0LnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5jb250ZXh0LnJlcS5wcm9jX2lkID0gY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0NPTlRFWFQpOworCS8qIHBjbWQtPmJvZHkuY29udGV4dC5yZXEucmVnX3ZhbC5tb2RlIGluaXRpYWxpemF0aW9uIGlzIG5vdCByZXF1aXJlZCAqLworCXBjbWQtPmJvZHkuY29udGV4dC5yZXEucmVnX3ZhbC51LnZhbHVlMzIgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisJcGNtZC0+Ym9keS5jb250ZXh0LnJlcS50YWcgPSBjcHVfdG9fbGUxNih0YWcpOworCXBjbWQtPmJvZHkuY29udGV4dC5yZXEudHlwZSA9IGNwdV90b19sZTE2KFNFVF9DT05URVhUX0RBVEEpOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQpIHsKKwkJZXJyb3IgID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZChwaGFuZGxlLAorCQkJCQkJKHVpbnQ4X3QgKikgcGNtZCwKKwkJCQkJCXNpemVvZihwY21kLT5ib2R5LmNvbnRleHQucmVxKQorCQkJCQkJKyBIRUFERVJfU0laRSwKKwkJCQkJCSh1aW50OF90ICopIHByc3AsCisJCQkJCQlzaXplb2YocHJzcC0+Ym9keS5jb250ZXh0LnJzcCkKKwkJCQkJCSsgSEVBREVSX1NJWkUpOworCX0gZWxzZSB7CisJCWVycm9yID0gQVMxMFhfQ01EX0VSUk9SOworCX0KKworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogcGFyc2UgcmVzcG9uc2U6IGNvbnRleHQgY29tbWFuZCBkbyBub3QgZm9sbG93IHRoZSBjb21tb24gcmVzcG9uc2UgKi8KKwkvKiBzdHJ1Y3R1cmUgLT4gc3BlY2lmaWMgaGFuZGxpbmcgcmVzcG9uc2UgcGFyc2UgcmVxdWlyZWQgICAgICAgICAgICAqLworCWVycm9yID0gYXMxMHhfY29udGV4dF9yc3BfcGFyc2UocHJzcCwgQ09OVFJPTF9QUk9DX0NPTlRFWFRfUlNQKTsKKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF9lTE5BX2NoYW5nZV9tb2RlIC0gc2VuZCBlTE5BIGNoYW5nZSBtb2RlIGNvbW1hbmQgdG8gQVMxMHgKKyAqIEBwaGFuZGxlOiAgIHBvaW50ZXIgdG8gQVMxMHggaGFuZGxlCisgKiBAbW9kZTogICAgICBtb2RlIHNlbGVjdGVkOgorICoJICAgICAgICAtIE9OICAgIDogMHgwID0+IGVMTkEgYWx3YXlzIE9OCisgKgkgICAgICAgIC0gT0ZGICAgOiAweDEgPT4gZUxOQSBhbHdheXMgT0ZGCisgKgkgICAgICAgIC0gQVVUTyAgOiAweDIgPT4gZUxOQSBmb2xsb3cgaHlzdGVyZXNpcyBwYXJhbWV0ZXJzCisgKgkJCQkgdG8gYmUgT04gb3IgT0ZGCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgYXMxMHhfY21kX2VMTkFfY2hhbmdlX21vZGUoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsIHVpbnQ4X3QgbW9kZSkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCAqcHJzcDsKKworCUVOVEVSKCk7CisKKwlwY21kID0gcGhhbmRsZS0+Y21kOworCXByc3AgPSBwaGFuZGxlLT5yc3A7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwlhczEweF9jbWRfYnVpbGQocGNtZCwgKCsrcGhhbmRsZS0+Y21kX3hpZCksCisJCQlzaXplb2YocGNtZC0+Ym9keS5jZmdfY2hhbmdlX21vZGUucmVxKSk7CisKKwkvKiBmaWxsIGNvbW1hbmQgKi8KKwlwY21kLT5ib2R5LmNmZ19jaGFuZ2VfbW9kZS5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19FTE5BX0NIQU5HRV9NT0RFKTsKKwlwY21kLT5ib2R5LmNmZ19jaGFuZ2VfbW9kZS5yZXEubW9kZSA9IG1vZGU7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciAgPSBwaGFuZGxlLT5vcHMtPnhmZXJfY21kKHBoYW5kbGUsICh1aW50OF90ICopIHBjbWQsCisJCQkJc2l6ZW9mKHBjbWQtPmJvZHkuY2ZnX2NoYW5nZV9tb2RlLnJlcSkKKwkJCQkrIEhFQURFUl9TSVpFLCAodWludDhfdCAqKSBwcnNwLAorCQkJCXNpemVvZihwcnNwLT5ib2R5LmNmZ19jaGFuZ2VfbW9kZS5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19FTE5BX0NIQU5HRV9NT0RFX1JTUCk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jb250ZXh0X3JzcF9wYXJzZSAtIFBhcnNlIGNvbnRleHQgY29tbWFuZCByZXNwb25zZQorICogQHByc3A6ICAgICAgIHBvaW50ZXIgdG8gQVMxMHggY29tbWFuZCByZXNwb25zZSBidWZmZXIKKyAqIEBwcm9jX2lkOiAgICBpZCBvZiB0aGUgY29tbWFuZAorICoKKyAqIFNpbmNlIHRoZSBjb250ZXggY29tbWFuZCByZXBvbnNlIGRvZXMgbm90IGZvbGxvdyB0aGUgY29tbW9uCisgKiByZXNwb25zZSwgYSBzcGVjaWZpYyBwYXJzZSBmdW5jdGlvbiBpcyByZXF1aXJlZC4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NvbnRleHRfcnNwX3BhcnNlKHN0cnVjdCBhczEweF9jbWRfdCAqcHJzcCwgdWludDE2X3QgcHJvY19pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJzcC0+Ym9keS5jb250ZXh0LnJzcC5lcnJvcjsKKworCWlmICgoZXJyID09IDApICYmCisJICAgIChsZTE2X3RvX2NwdShwcnNwLT5ib2R5LmNvbnRleHQucnNwLnByb2NfaWQpID09IHByb2NfaWQpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gQVMxMFhfQ01EX0VSUk9SOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZF9zdHJlYW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWRfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1YzcwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWRfc3RyZWFtLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgImFzMTAyX2Rydi5oIgorI2luY2x1ZGUgImFzMTB4X2NtZC5oIgorCisvKioKKyAqIGFzMTB4X2NtZF9hZGRfUElEX2ZpbHRlciAtIHNlbmQgYWRkIGZpbHRlciBjb21tYW5kIHRvIEFTMTB4CisgKiBAcGhhbmRsZTogICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICogQGZpbHRlcjogICAgVFNGaWx0ZXIgZmlsdGVyIGZvciBEVkItVAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9hZGRfUElEX2ZpbHRlcihhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJCSAgICAgc3RydWN0IGFzMTB4X3RzX2ZpbHRlciAqZmlsdGVyKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmFkZF9waWRfZmlsdGVyLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5hZGRfcGlkX2ZpbHRlci5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19TRVRGSUxURVIpOworCXBjbWQtPmJvZHkuYWRkX3BpZF9maWx0ZXIucmVxLnBpZCA9IGNwdV90b19sZTE2KGZpbHRlci0+cGlkKTsKKwlwY21kLT5ib2R5LmFkZF9waWRfZmlsdGVyLnJlcS5zdHJlYW1fdHlwZSA9IGZpbHRlci0+dHlwZTsKKworCWlmIChmaWx0ZXItPmlkeCA8IDE2KQorCQlwY21kLT5ib2R5LmFkZF9waWRfZmlsdGVyLnJlcS5pZHggPSBmaWx0ZXItPmlkeDsKKwllbHNlCisJCXBjbWQtPmJvZHkuYWRkX3BpZF9maWx0ZXIucmVxLmlkeCA9IDB4RkY7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwgKHVpbnQ4X3QgKikgcGNtZCwKKwkJCQlzaXplb2YocGNtZC0+Ym9keS5hZGRfcGlkX2ZpbHRlci5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQlzaXplb2YocHJzcC0+Ym9keS5hZGRfcGlkX2ZpbHRlci5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19TRVRGSUxURVJfUlNQKTsKKworCWlmIChlcnJvciA9PSAwKSB7CisJCS8qIFJlc3BvbnNlIE9LIC0+IGdldCByZXNwb25zZSBkYXRhICovCisJCWZpbHRlci0+aWR4ID0gcHJzcC0+Ym9keS5hZGRfcGlkX2ZpbHRlci5yc3AuZmlsdGVyX2lkOworCX0KKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF9kZWxfUElEX2ZpbHRlciAtIFNlbmQgZGVsZXRlIGZpbHRlciBjb21tYW5kIHRvIEFTMTB4CisgKiBAcGhhbmRsZTogICAgICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICogQHBpZF92YWx1ZTogICAgUElEIHRvIGRlbGV0ZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9kZWxfUElEX2ZpbHRlcihhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJCSAgICAgdWludDE2X3QgcGlkX3ZhbHVlKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmRlbF9waWRfZmlsdGVyLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5kZWxfcGlkX2ZpbHRlci5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19SRU1PVkVGSUxURVIpOworCXBjbWQtPmJvZHkuZGVsX3BpZF9maWx0ZXIucmVxLnBpZCA9IGNwdV90b19sZTE2KHBpZF92YWx1ZSk7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwgKHVpbnQ4X3QgKikgcGNtZCwKKwkJCQlzaXplb2YocGNtZC0+Ym9keS5kZWxfcGlkX2ZpbHRlci5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQlzaXplb2YocHJzcC0+Ym9keS5kZWxfcGlkX2ZpbHRlci5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19SRU1PVkVGSUxURVJfUlNQKTsKKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF9zdGFydF9zdHJlYW1pbmcgLSBTZW5kIHN0YXJ0IHN0cmVhbWluZyBjb21tYW5kIHRvIEFTMTB4CisgKiBAcGhhbmRsZTogICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9zdGFydF9zdHJlYW1pbmcoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CisKKwlFTlRFUigpOworCisJcGNtZCA9IHBoYW5kbGUtPmNtZDsKKwlwcnNwID0gcGhhbmRsZS0+cnNwOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJYXMxMHhfY21kX2J1aWxkKHBjbWQsICgrK3BoYW5kbGUtPmNtZF94aWQpLAorCQkJc2l6ZW9mKHBjbWQtPmJvZHkuc3RhcnRfc3RyZWFtaW5nLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5zdGFydF9zdHJlYW1pbmcucmVxLnByb2NfaWQgPQorCQljcHVfdG9fbGUxNihDT05UUk9MX1BST0NfU1RBUlRfU1RSRUFNSU5HKTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZChwaGFuZGxlLCAodWludDhfdCAqKSBwY21kLAorCQkJCXNpemVvZihwY21kLT5ib2R5LnN0YXJ0X3N0cmVhbWluZy5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQlzaXplb2YocHJzcC0+Ym9keS5zdGFydF9zdHJlYW1pbmcucnNwKQorCQkJCSsgSEVBREVSX1NJWkUpOworCX0gZWxzZSB7CisJCWVycm9yID0gQVMxMFhfQ01EX0VSUk9SOworCX0KKworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogcGFyc2UgcmVzcG9uc2UgKi8KKwllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfU1RBUlRfU1RSRUFNSU5HX1JTUCk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jbWRfc3RvcF9zdHJlYW1pbmcgLSBTZW5kIHN0b3Agc3RyZWFtaW5nIGNvbW1hbmQgdG8gQVMxMHgKKyAqIEBwaGFuZGxlOiAgIHBvaW50ZXIgdG8gQVMxMHggaGFuZGxlCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgYXMxMHhfY21kX3N0b3Bfc3RyZWFtaW5nKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlKQoreworCWludDhfdCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LnN0b3Bfc3RyZWFtaW5nLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5zdG9wX3N0cmVhbWluZy5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19TVE9QX1NUUkVBTUlORyk7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwgKHVpbnQ4X3QgKikgcGNtZCwKKwkJCQlzaXplb2YocGNtZC0+Ym9keS5zdG9wX3N0cmVhbWluZy5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQlzaXplb2YocHJzcC0+Ym9keS5zdG9wX3N0cmVhbWluZy5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19TVE9QX1NUUkVBTUlOR19SU1ApOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfaGFuZGxlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfaGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwMWE3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9oYW5kbGUuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQWJpbGlzIFN5c3RlbXMgU2luZ2xlIERWQi1UIFJlY2VpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGllcnJpY2sgSGFzY29ldCA8cGllcnJpY2suaGFzY29ldEBhYmlsaXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaWZkZWYgX19LRVJORUxfXworc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3Q7CitzdHJ1Y3QgYXMxMDJfZGV2X3Q7CisKKyNkZWZpbmUgYXMxMHhfaGFuZGxlX3Qgc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QKKyNpbmNsdWRlICJhczEweF9jbWQuaCIKKworLyogdmFsdWVzIGZvciAibW9kZSIgZmllbGQgKi8KKyNkZWZpbmUgUkVHTU9ERTggICAgICAgICA4CisjZGVmaW5lIFJFR01PREUxNiAgICAgICAgMTYKKyNkZWZpbmUgUkVHTU9ERTMyICAgICAgICAzMgorCitzdHJ1Y3QgYXMxMDJfcHJpdl9vcHNfdCB7CisJaW50ICgqdXBsb2FkX2Z3X3BrdCkgKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHN3YXAzMik7CisKKwlpbnQgKCpzZW5kX2NtZCkgKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwkJCSB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4pOworCisJaW50ICgqeGZlcl9jbWQpIChzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJCQkgdW5zaWduZWQgY2hhciAqc2VuZF9idWYsIGludCBzZW5kX2J1Zl9sZW4sCisJCQkgdW5zaWduZWQgY2hhciAqcmVjdl9idWYsIGludCByZWN2X2J1Zl9sZW4pOworLyoKKwlpbnQgKCpwaWRfZmlsdGVyKSAoc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAorCQkJICAgaW50IGluZGV4LCB1MTYgcGlkLCBpbnQgb25vZmYpOworKi8KKwlpbnQgKCpzdGFydF9zdHJlYW0pIChzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7CisJdm9pZCAoKnN0b3Bfc3RyZWFtKSAoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpOworCisJaW50ICgqcmVzZXRfdGFyZ2V0KSAoc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwKTsKKworCWludCAoKnJlYWRfd3JpdGUpKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwgdWludDhfdCBtb2RlLAorCQkJICB1aW50MzJfdCByZF9hZGRyLCB1aW50MTZfdCByZF9sZW4sCisJCQkgIHVpbnQzMl90IHdyX2FkZHIsIHVpbnQxNl90IHdyX2xlbik7CisKKwlpbnQgKCphczEwMl9yZWFkX2VwMikgKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpyZWN2X2J1ZiwKKwkJCSAgICAgICBpbnQgcmVjdl9idWZfbGVuKTsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlZGIzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF90eXBlcy5oCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQWJpbGlzIFN5c3RlbXMgU2luZ2xlIERWQi1UIFJlY2VpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGllcnJpY2sgSGFzY29ldCA8cGllcnJpY2suaGFzY29ldEBhYmlsaXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaWZuZGVmIF9BUzEwWF9UWVBFU19IXworI2RlZmluZSBfQVMxMFhfVFlQRVNfSF8KKworI2luY2x1ZGUgImFzMTB4X2hhbmRsZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgTUFDUk8gREVGSU5JVElPTlMgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGJhbmR3aWR0aCBjb25zdGFudCB2YWx1ZXMgKi8KKyNkZWZpbmUgQldfNV9NSFogICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQldfNl9NSFogICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQldfN19NSFogICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQldfOF9NSFogICAgICAgICAgIDB4MDMKKworLyogaGllcmFyY2h5IHByaW9yaXR5IHNlbGVjdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgSElFUl9OT19QUklPUklUWSAgIDB4MDAKKyNkZWZpbmUgSElFUl9MT1dfUFJJT1JJVFkgIDB4MDEKKyNkZWZpbmUgSElFUl9ISUdIX1BSSU9SSVRZIDB4MDIKKworLyogY29uc3RlbGxhdGlvbiBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIENPTlNUX1FQU0sgICAgICAgICAweDAwCisjZGVmaW5lIENPTlNUX1FBTTE2ICAgICAgICAweDAxCisjZGVmaW5lIENPTlNUX1FBTTY0ICAgICAgICAweDAyCisjZGVmaW5lIENPTlNUX1VOS05PV04gICAgICAweEZGCisKKy8qIGhpZXJhcmNoeSBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIEhJRVJfTk9ORSAgICAgICAgIDB4MDAKKyNkZWZpbmUgSElFUl9BTFBIQV8xICAgICAgMHgwMQorI2RlZmluZSBISUVSX0FMUEhBXzIgICAgICAweDAyCisjZGVmaW5lIEhJRVJfQUxQSEFfNCAgICAgIDB4MDMKKyNkZWZpbmUgSElFUl9VTktOT1dOICAgICAgMHhGRgorCisvKiBpbnRlcmxlYXZpbmcgYXZhaWxhYmxlIHZhbHVlcyAqLworI2RlZmluZSBJTlRMVl9OQVRJVkUgICAgICAweDAwCisjZGVmaW5lIElOVExWX0lOX0RFUFRIICAgIDB4MDEKKyNkZWZpbmUgSU5UTFZfVU5LTk9XTiAgICAgMHhGRgorCisvKiBjb2RlIHJhdGUgYXZhaWxhYmxlIHZhbHVlcyAqLworI2RlZmluZSBDT0RFX1JBVEVfMV8yICAgICAweDAwCisjZGVmaW5lIENPREVfUkFURV8yXzMgICAgIDB4MDEKKyNkZWZpbmUgQ09ERV9SQVRFXzNfNCAgICAgMHgwMgorI2RlZmluZSBDT0RFX1JBVEVfNV82ICAgICAweDAzCisjZGVmaW5lIENPREVfUkFURV83XzggICAgIDB4MDQKKyNkZWZpbmUgQ09ERV9SQVRFX1VOS05PV04gMHhGRgorCisvKiBndWFyZCBpbnRlcnZhbCBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIEdVQVJEX0lOVF8xXzMyICAgIDB4MDAKKyNkZWZpbmUgR1VBUkRfSU5UXzFfMTYgICAgMHgwMQorI2RlZmluZSBHVUFSRF9JTlRfMV84ICAgICAweDAyCisjZGVmaW5lIEdVQVJEX0lOVF8xXzQgICAgIDB4MDMKKyNkZWZpbmUgR1VBUkRfVU5LTk9XTiAgICAgMHhGRgorCisvKiB0cmFuc21pc3Npb24gbW9kZSBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIFRSQU5TX01PREVfMksgICAgICAweDAwCisjZGVmaW5lIFRSQU5TX01PREVfOEsgICAgICAweDAxCisjZGVmaW5lIFRSQU5TX01PREVfNEsgICAgICAweDAyCisjZGVmaW5lIFRSQU5TX01PREVfVU5LTk9XTiAweEZGCisKKy8qIERWQkggc2lnbmFsbGluZyBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIFRJTUVTTElDSU5HX1BSRVNFTlQgICAweDAxCisjZGVmaW5lIE1QRV9GRUNfUFJFU0VOVCAgICAgICAweDAyCisKKy8qIHR1bmUgc3RhdGUgYXZhaWxhYmxlICovCisjZGVmaW5lIFRVTkVfU1RBVFVTX05PVF9UVU5FRCAgICAgICAweDAwCisjZGVmaW5lIFRVTkVfU1RBVFVTX0lETEUgICAgICAgICAgICAweDAxCisjZGVmaW5lIFRVTkVfU1RBVFVTX0xPQ0tJTkcgICAgICAgICAweDAyCisjZGVmaW5lIFRVTkVfU1RBVFVTX1NJR05BTF9EVkJfT0sgICAweDAzCisjZGVmaW5lIFRVTkVfU1RBVFVTX1NUUkVBTV9ERVRFQ1RFRCAweDA0CisjZGVmaW5lIFRVTkVfU1RBVFVTX1NUUkVBTV9UVU5FRCAgICAweDA1CisjZGVmaW5lIFRVTkVfU1RBVFVTX0VSUk9SICAgICAgICAgICAweEZGCisKKy8qIGF2YWlsYWJsZSBUUyBGSUQgZmlsdGVyIHR5cGVzICovCisjZGVmaW5lIFRTX1BJRF9UWVBFX1RTICAgICAgIDAKKyNkZWZpbmUgVFNfUElEX1RZUEVfUFNJX1NJICAgMQorI2RlZmluZSBUU19QSURfVFlQRV9NUEUgICAgICAyCisKKy8qIG51bWJlciBvZiBlY2hvcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTUFYX0VDSE9TICAgMTUKKworLyogQ29udGV4dCB0eXBlcyAqLworI2RlZmluZSBDT05URVhUX0xOQSAgICAgICAgICAgICAgICAgICAxMDEwCisjZGVmaW5lIENPTlRFWFRfRUxOQV9IWVNURVJFU0lTICAgICAgIDQwMDMKKyNkZWZpbmUgQ09OVEVYVF9FTE5BX0dBSU4gICAgICAgICAgICAgNDAwNAorI2RlZmluZSBDT05URVhUX01FUl9USFJFU0hPTEQgICAgICAgICA1MDA1CisjZGVmaW5lIENPTlRFWFRfTUVSX09GRlNFVCAgICAgICAgICAgIDUwMDYKKyNkZWZpbmUgQ09OVEVYVF9JUl9TVEFURSAgICAgICAgICAgICAgNzAwMAorI2RlZmluZSBDT05URVhUX1RTT1VUX01TQl9GSVJTVCAgICAgICA3MDA0CisjZGVmaW5lIENPTlRFWFRfVFNPVVRfRkFMTElOR19FREdFICAgIDcwMDUKKworLyogQ29uZmlndXJhdGlvbiBtb2RlcyAqLworI2RlZmluZSBDRkdfTU9ERV9PTiAgICAgMAorI2RlZmluZSBDRkdfTU9ERV9PRkYgICAgMQorI2RlZmluZSBDRkdfTU9ERV9BVVRPICAgMgorCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBhczEweF90cHMgeworICAgdWludDhfdCBjb25zdGVsbGF0aW9uOworICAgdWludDhfdCBoaWVyYXJjaHk7CisgICB1aW50OF90IGludGVybGVhdmluZ19tb2RlOworICAgdWludDhfdCBjb2RlX3JhdGVfSFA7CisgICB1aW50OF90IGNvZGVfcmF0ZV9MUDsKKyAgIHVpbnQ4X3QgZ3VhcmRfaW50ZXJ2YWw7CisgICB1aW50OF90IHRyYW5zbWlzc2lvbl9tb2RlOworICAgdWludDhfdCBEVkJIX21hc2tfSFA7CisgICB1aW50OF90IERWQkhfbWFza19MUDsKKyAgIHVpbnQxNl90IGNlbGxfSUQ7Cit9OworCitzdHJ1Y3QgYXMxMHhfdHVuZV9hcmdzIHsKKyAgIC8qIGZyZXF1ZW5jeSAqLworICAgdWludDMyX3QgZnJlcTsKKyAgIC8qIGJhbmR3aWR0aCAqLworICAgdWludDhfdCBiYW5kd2lkdGg7CisgICAvKiBoaWVyYXJjaHkgc2VsZWN0aW9uICovCisgICB1aW50OF90IGhpZXJfc2VsZWN0OworICAgLyogY29uc3RlbGxhdGlvbiAqLworICAgdWludDhfdCBjb25zdGVsbGF0aW9uOworICAgLyogaGllcmFyY2h5ICovCisgICB1aW50OF90IGhpZXJhcmNoeTsKKyAgIC8qIGludGVybGVhdmluZyBtb2RlICovCisgICB1aW50OF90IGludGVybGVhdmluZ19tb2RlOworICAgLyogY29kZSByYXRlICovCisgICB1aW50OF90IGNvZGVfcmF0ZTsKKyAgIC8qIGd1YXJkIGludGVydmFsICovCisgICB1aW50OF90IGd1YXJkX2ludGVydmFsOworICAgLyogdHJhbnNtaXNzaW9uIG1vZGUgKi8KKyAgIHVpbnQ4X3QgdHJhbnNtaXNzaW9uX21vZGU7Cit9OworCitzdHJ1Y3QgYXMxMHhfdHVuZV9zdGF0dXMgeworICAgLyogdHVuZSBzdGF0dXMgKi8KKyAgIHVpbnQ4X3QgdHVuZV9zdGF0ZTsKKyAgIC8qIHNpZ25hbCBzdHJlbmd0aCAqLworICAgaW50MTZfdCBzaWduYWxfc3RyZW5ndGg7CisgICAvKiBwYWNrZXQgZXJyb3IgcmF0ZSAxMF4tNCAqLworICAgdWludDE2X3QgUEVSOworICAgLyogYml0IGVycm9yIHJhdGUgMTBeLTQgKi8KKyAgIHVpbnQxNl90IEJFUjsKK307CisKK3N0cnVjdCBhczEweF9kZW1vZF9zdGF0cyB7CisgICAvKiBmcmFtZSBjb3VudGVyICovCisgICB1aW50MzJfdCBmcmFtZV9jb3VudDsKKyAgIC8qIEJhZCBmcmFtZSBjb3VudGVyICovCisgICB1aW50MzJfdCBiYWRfZnJhbWVfY291bnQ7CisgICAvKiBOdW1iZXIgb2Ygd3JvbmcgYnl0ZXMgZml4ZWQgYnkgUmVlZC1Tb2xvbW9uICovCisgICB1aW50MzJfdCBieXRlc19maXhlZF9ieV9yczsKKyAgIC8qIEF2ZXJhZ2VkIE1FUiAqLworICAgdWludDE2X3QgbWVyOworICAgLyogc3RhdGlzdGljcyBjYWxjdWxhdGlvbiBzdGF0ZSBpbmRpY2F0b3IgKHN0YXJ0ZWQgb3Igbm90KSAqLworICAgdWludDhfdCBoYXNfc3RhcnRlZDsKK307CisKK3N0cnVjdCBhczEweF90c19maWx0ZXIgeworICAgdWludDE2X3QgcGlkOyAgLyoqIHZhbGlkIFBJRCB2YWx1ZSAweDAwIDogMHgyMDAwICovCisgICB1aW50OF90ICB0eXBlOyAvKiogUmVkIFRTX1BJRF9UWVBFXzxOPiB2YWx1ZXMgKi8KKyAgIHVpbnQ4X3QgIGlkeDsgIC8qKiBpbmRleCBpbiBmaWx0ZXJpbmcgdGFibGUgKi8KK307CisKK3N0cnVjdCBhczEweF9yZWdpc3Rlcl92YWx1ZSB7CisgICB1aW50OF90ICAgICAgIG1vZGU7CisgICB1bmlvbiB7CisgICAgICB1aW50OF90ICAgIHZhbHVlODsgICAgLyogOCBiaXQgdmFsdWUgKi8KKyAgICAgIHVpbnQxNl90ICAgdmFsdWUxNjsgICAvKiAxNiBiaXQgdmFsdWUgKi8KKyAgICAgIHVpbnQzMl90ICAgdmFsdWUzMjsgICAvKiAzMiBiaXQgdmFsdWUgKi8KKyAgIH11OworfTsKKworI3ByYWdtYSBwYWNrKCkKKworc3RydWN0IGFzMTB4X3JlZ2lzdGVyX2FkZHIgeworICAgLyogcmVnaXN0ZXIgYWRkciAqLworICAgdWludDMyX3QgYWRkcjsKKyAgIC8qIHJlZ2lzdGVyIG1vZGUgYWNjZXNzICovCisgICB1aW50OF90IG1vZGU7Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L0tjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L01ha2VmaWxlCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L1RPRE8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L1RPRE8KcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L1RPRE8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L2N4ZDIwOTkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvY3hkMjA5OS5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L2N4ZDIwOTkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvY3hkMjA5OS5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTV2NGwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kdDMxNTV2NGwvS2NvbmZpZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9LY29uZmlnCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTV2NGwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL01ha2VmaWxlCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL01ha2VmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL2R0MzE1NXY0bC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU5M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuYwpAQCAtMCwwICsxLDk5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBieSBNYXJpbiBNaXRvdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBtaXRvdkBpc3NwLmJhcy5iZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KKworI2luY2x1ZGUgImR0MzE1NXY0bC5oIgorCisjZGVmaW5lIERUMzE1NV9WRU5ET1JfSUQgMHg4MDg2CisjZGVmaW5lIERUMzE1NV9ERVZJQ0VfSUQgMHgxMjIzCisKKy8qIERUMzE1NV9DSFVOS19TSVpFIGlzIDRNICgyXjIyKSA4IGZ1bGwgc2l6ZSBidWZmZXJzICovCisjZGVmaW5lIERUMzE1NV9DSFVOS19TSVpFICgxVSA8PCAyMikKKworI2RlZmluZSBEVDMxNTVfQ09IX0ZMQUdTIChHRlBfS0VSTkVMIHwgR0ZQX0RNQTMyIHwgX19HRlBfQ09MRCB8IF9fR0ZQX05PV0FSTikKKworI2RlZmluZSBEVDMxNTVfQlVGX1NJWkUgKDc2OCAqIDU3NikKKworI2lmZGVmIENPTkZJR19EVDMxNTVfU1RSRUFNSU5HCisjZGVmaW5lIERUMzE1NV9DQVBUVVJFX01FVEhPRCBWNEwyX0NBUF9TVFJFQU1JTkcKKyNlbHNlCisjZGVmaW5lIERUMzE1NV9DQVBUVVJFX01FVEhPRCBWNEwyX0NBUF9SRUFEV1JJVEUKKyNlbmRpZgorCisvKiAgZ2xvYmFsIGluaXRpYWxpemVycyAoZm9yIGFsbCBib2FyZHMpICAqLworI2lmZGVmIENPTkZJR19EVDMxNTVfQ0NJUgorc3RhdGljIGNvbnN0IHU4IGNzcjJfaW5pdCA9IFZUXzUwSFo7CisjZGVmaW5lIERUMzE1NV9DVVJSRU5UX05PUk0gVjRMMl9TVERfNjI1XzUwCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltZ193aWR0aCA9IDc2ODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW1nX2hlaWdodCA9IDU3NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZnJhbWVzX3Blcl9zZWMgPSAyNTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZyYW1lX3N0ZFtdID0geworCXsKKwkuaW5kZXggPSAwLAorCS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCS5mbGFncyA9IDAsCisJLmRlc2NyaXB0aW9uID0gIkNDSVIvNTBIeiA4IGJpdHMgZ3JheSIsCisJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVksCisJfSwKK307CisjZWxzZQorc3RhdGljIGNvbnN0IHU4IGNzcjJfaW5pdCA9IFZUXzYwSFo7CisjZGVmaW5lIERUMzE1NV9DVVJSRU5UX05PUk0gVjRMMl9TVERfNTI1XzYwCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltZ193aWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW1nX2hlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZnJhbWVzX3Blcl9zZWMgPSAzMDsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZyYW1lX3N0ZFtdID0geworCXsKKwkuaW5kZXggPSAwLAorCS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCS5mbGFncyA9IDAsCisJLmRlc2NyaXB0aW9uID0gIlJTLTE3MC82MEh6IDggYml0cyBncmF5IiwKKwkucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfR1JFWSwKKwl9LAorfTsKKyNlbmRpZgorCisjZGVmaW5lIE5VTV9PRl9GT1JNQVRTIEFSUkFZX1NJWkUoZnJhbWVfc3RkKQorCitzdGF0aWMgdTggY29uZmlnX2luaXQgPSBBQ1FfTU9ERV9FVkVOOworCisvKioKKyAqIHJlYWRfaTJjX3JlZyAtIHJlYWRzIGFuIGludGVybmFsIGkyYyByZWdpc3RlcgorICoKKyAqIEBhZGRyOglkdDMxNTUgbW1pbyBiYXNlIGFkZHJlc3MKKyAqIEBpbmRleDoJaW5kZXggKGludGVybmFsIGFkZHJlc3MpIG9mIHJlZ2lzdGVyIHRvIHJlYWQKKyAqIEBkYXRhOglwb2ludGVyIHRvIGJ5dGUgdGhlIHJlYWQgZGF0YSB3aWxsIGJlIHBsYWNlZCBpbgorICoKKyAqIHJldHVybnM6CXplcm8gb24gc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBzdGFydHMgcmVhZGluZyB0aGUgc3BlY2lmaWVkIChieSBpbmRleCkgcmVnaXN0ZXIKKyAqIGFuZCBidXN5IHdhaXRzIGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2guIFRoZSByZXN1bHQgaXMgcGxhY2VkCisgKiBpbiBhIGJ5dGUgcG9pbnRlZCBieSBkYXRhLgorICovCitzdGF0aWMgaW50CityZWFkX2kyY19yZWcodm9pZCBfX2lvbWVtICphZGRyLCB1OCBpbmRleCwgdTggKmRhdGEpCit7CisJdTMyIHRtcCA9IGluZGV4OworCisJaW93cml0ZTMyKCh0bXA8PDE3KSB8IElJQ19SRUFELCBhZGRyICsgSUlDX0NTUjIpOworCW1taW93YigpOworCXVkZWxheSg0NSk7IC8qIHdhaXQgYXQgbGVhc3QgNDMgdXNlYyBmb3IgTkVXX0NZQ0xFIHRvIGNsZWFyICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpCisJCXJldHVybiAtRUlPOyAvKiBlcnJvcjogTkVXX0NZQ0xFIG5vdCBjbGVhcmVkICovCisJdG1wID0gaW9yZWFkMzIoYWRkciArIElJQ19DU1IxKTsKKwlpZiAodG1wICYgRElSRUNUX0FCT1JUKSB7CisJCS8qIHJlc2V0IERJUkVDVF9BQk9SVCBiaXQgKi8KKwkJaW93cml0ZTMyKERJUkVDVF9BQk9SVCwgYWRkciArIElJQ19DU1IxKTsKKwkJcmV0dXJuIC1FSU87IC8qIGVycm9yOiBESVJFQ1RfQUJPUlQgc2V0ICovCisJfQorCSpkYXRhID0gdG1wPj4yNDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3cml0ZV9pMmNfcmVnIC0gd3JpdGVzIHRvIGFuIGludGVybmFsIGkyYyByZWdpc3RlcgorICoKKyAqIEBhZGRyOglkdDMxNTUgbW1pbyBiYXNlIGFkZHJlc3MKKyAqIEBpbmRleDoJaW5kZXggKGludGVybmFsIGFkZHJlc3MpIG9mIHJlZ2lzdGVyIHRvIHJlYWQKKyAqIEBkYXRhOglkYXRhIHRvIGJlIHdyaXR0ZW4KKyAqCisgKiByZXR1cm5zOgl6ZXJvIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHdyaXR0aW5nIHRoZSBzcGVjaWZpZWQgKGJ5IGluZGV4KSByZWdpc3RlcgorICogYW5kIGJ1c3kgd2FpdHMgZm9yIHRoZSBwcm9jZXNzIHRvIGZpbmlzaC4KKyAqLworc3RhdGljIGludAord3JpdGVfaTJjX3JlZyh2b2lkIF9faW9tZW0gKmFkZHIsIHU4IGluZGV4LCB1OCBkYXRhKQoreworCXUzMiB0bXAgPSBpbmRleDsKKworCWlvd3JpdGUzMigodG1wPDwxNykgfCBJSUNfV1JJVEUgfCBkYXRhLCBhZGRyICsgSUlDX0NTUjIpOworCW1taW93YigpOworCXVkZWxheSg2NSk7IC8qIHdhaXQgYXQgbGVhc3QgNjMgdXNlYyBmb3IgTkVXX0NZQ0xFIHRvIGNsZWFyICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpCisJCXJldHVybiAtRUlPOyAvKiBlcnJvcjogTkVXX0NZQ0xFIG5vdCBjbGVhcmVkICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMSkgJiBESVJFQ1RfQUJPUlQpIHsKKwkJLyogcmVzZXQgRElSRUNUX0FCT1JUIGJpdCAqLworCQlpb3dyaXRlMzIoRElSRUNUX0FCT1JULCBhZGRyICsgSUlDX0NTUjEpOworCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IERJUkVDVF9BQk9SVCBzZXQgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd3JpdGVfaTJjX3JlZ19ub3dhaXQgLSB3cml0ZXMgdG8gYW4gaW50ZXJuYWwgaTJjIHJlZ2lzdGVyCisgKgorICogQGFkZHI6CWR0MzE1NSBtbWlvIGJhc2UgYWRkcmVzcworICogQGluZGV4OglpbmRleCAoaW50ZXJuYWwgYWRkcmVzcykgb2YgcmVnaXN0ZXIgdG8gcmVhZAorICogQGRhdGE6CWRhdGEgdG8gYmUgd3JpdHRlbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHdyaXR0aW5nIHRoZSBzcGVjaWZpZWQgKGJ5IGluZGV4KSByZWdpc3RlcgorICogYW5kIHRoZW4gcmV0dXJucy4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfaTJjX3JlZ19ub3dhaXQodm9pZCBfX2lvbWVtICphZGRyLCB1OCBpbmRleCwgdTggZGF0YSkKK3sKKwl1MzIgdG1wID0gaW5kZXg7CisKKwlpb3dyaXRlMzIoKHRtcDw8MTcpIHwgSUlDX1dSSVRFIHwgZGF0YSwgYWRkciArIElJQ19DU1IyKTsKKwltbWlvd2IoKTsKK30KKworLyoqCisgKiB3YWl0X2kyY19yZWcgLSB3YWl0cyB0aGUgcmVhZC93cml0ZSB0byBmaW5pc2gKKyAqCisgKiBAYWRkcjoJZHQzMTU1IG1taW8gYmFzZSBhZGRyZXNzCisgKgorICogcmV0dXJuczoJemVybyBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHJlYWRpbmcvd3JpdHRpbmcgdG8gZmluaXNoLgorICovCitzdGF0aWMgaW50IHdhaXRfaTJjX3JlZyh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpCisJCXVkZWxheSg2NSk7IC8qIHdhaXQgYXQgbGVhc3QgNjMgdXNlYyBmb3IgTkVXX0NZQ0xFIHRvIGNsZWFyICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpCisJCXJldHVybiAtRUlPOyAvKiBlcnJvcjogTkVXX0NZQ0xFIG5vdCBjbGVhcmVkICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMSkgJiBESVJFQ1RfQUJPUlQpIHsKKwkJLyogcmVzZXQgRElSRUNUX0FCT1JUIGJpdCAqLworCQlpb3dyaXRlMzIoRElSRUNUX0FCT1JULCBhZGRyICsgSUlDX0NTUjEpOworCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IERJUkVDVF9BQk9SVCBzZXQgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9zdGFydF9hY3Eoc3RydWN0IGR0MzE1NV9wcml2ICpwZCkKK3sKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIgPSBwZC0+Y3Vycl9idWY7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCWRtYV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOworCWlvd3JpdGUzMihkbWFfYWRkciwgcGQtPnJlZ3MgKyBFVkVOX0RNQV9TVEFSVCk7CisJaW93cml0ZTMyKGRtYV9hZGRyICsgaW1nX3dpZHRoLCBwZC0+cmVncyArIE9ERF9ETUFfU1RBUlQpOworCWlvd3JpdGUzMihpbWdfd2lkdGgsIHBkLT5yZWdzICsgRVZFTl9ETUFfU1RSSURFKTsKKwlpb3dyaXRlMzIoaW1nX3dpZHRoLCBwZC0+cmVncyArIE9ERF9ETUFfU1RSSURFKTsKKwkvKiBlbmFibGUgaW50ZXJydXB0cywgY2xlYXIgYWxsIGlycSBmbGFncyAqLworCWlvd3JpdGUzMihGTERfU1RBUlRfRU4gfCBGTERfRU5EX09ERF9FTiB8IEZMRF9TVEFSVCB8CisJCQlGTERfRU5EX0VWRU4gfCBGTERfRU5EX09ERCwgcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKKwlpb3dyaXRlMzIoRklGT19FTiB8IFNSU1QgfCBGTERfQ1JQVF9PREQgfCBGTERfQ1JQVF9FVkVOIHwKKwkJICBGTERfRE5fT0REIHwgRkxEX0ROX0VWRU4gfCBDQVBfQ09OVF9FVkVOIHwgQ0FQX0NPTlRfT0RELAorCQkJCQkJCXBkLT5yZWdzICsgQ1NSMSk7CisJd2FpdF9pMmNfcmVnKHBkLT5yZWdzKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEVWRU5fQ1NSLCBDU1JfRVJST1IgfCBDU1JfRE9ORSk7CisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgT0REX0NTUiwgQ1NSX0VSUk9SIHwgQ1NSX0RPTkUpOworCisJLyogIHN0YXJ0IHRoZSBib2FyZCAgKi8KKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDU1IyLCBwZC0+Y3NyMiB8IEJVU1lfRVZFTiB8IEJVU1lfT0REKTsKKwlyZXR1cm4gMDsgLyogc3VjY2VzcyAgKi8KK30KKworLyoKKyAqCWRyaXZlci1zcGVjaWZpYyBjYWxsYmFja3MgKHZiMl9vcHMpCisgKi8KK3N0YXRpYyBpbnQKK2R0MzE1NV9xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgKm51bV9idWZmZXJzLAorCQkJdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCisJCQkJCQl2b2lkICphbGxvY19jdHhzW10pCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7CisJdm9pZCAqcmV0OworCisJaWYgKCpudW1fYnVmZmVycyA9PSAwKQorCQkqbnVtX2J1ZmZlcnMgPSAxOworCSpudW1fcGxhbmVzID0gMTsKKwlzaXplc1swXSA9IGltZ193aWR0aCAqIGltZ19oZWlnaHQ7CisJaWYgKHBkLT5xLT5hbGxvY19jdHhbMF0pCisJCXJldHVybiAwOworCXJldCA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KCZwZC0+cGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKHJldCkpCisJCXJldHVybiBQVFJfRVJSKHJldCk7CisJcGQtPnEtPmFsbG9jX2N0eFswXSA9IHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2R0MzE1NV93YWl0X3ByZXBhcmUoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmIyX2dldF9kcnZfcHJpdihxKTsKKworCW11dGV4X3VubG9jayhwZC0+dmRldi0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitkdDMxNTVfd2FpdF9maW5pc2goc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmIyX2dldF9kcnZfcHJpdihxKTsKKworCW11dGV4X2xvY2socGQtPnZkZXYtPmxvY2spOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgaW1nX3dpZHRoICogaW1nX2hlaWdodCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHQzMTU1X3N0b3Bfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7CisJc3RydWN0IHZiMl9idWZmZXIgKnZiOworCisJc3Bpbl9sb2NrX2lycSgmcGQtPmxvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmcGQtPmRtYXEpKSB7CisJCXZiID0gbGlzdF9maXJzdF9lbnRyeSgmcGQtPmRtYXEsIHR5cGVvZigqdmIpLCBkb25lX2VudHJ5KTsKKwkJbGlzdF9kZWwoJnZiLT5kb25lX2VudHJ5KTsKKwkJdmIyX2J1ZmZlcl9kb25lKHZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwZC0+bG9jayk7CisJbXNsZWVwKDQ1KTsgLyogaXJxIGhlbmRsZXIgd2lsbCBzdG9wIHRoZSBoYXJkd2FyZSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZHQzMTU1X2J1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisKKwkvKiAgcGQtPnEtPnN0cmVhbWluZyA9IDEgd2hlbiBkdDMxNTVfYnVmX3F1ZXVlKCkgaXMgaW52b2tlZCAgKi8KKwlzcGluX2xvY2tfaXJxKCZwZC0+bG9jayk7CisJaWYgKHBkLT5jdXJyX2J1ZikKKwkJbGlzdF9hZGRfdGFpbCgmdmItPmRvbmVfZW50cnksICZwZC0+ZG1hcSk7CisJZWxzZSB7CisJCXBkLT5jdXJyX2J1ZiA9IHZiOworCQlkdDMxNTVfc3RhcnRfYWNxKHBkKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwZC0+bG9jayk7Cit9CisvKgorICoJZW5kIGRyaXZlci1zcGVjaWZpYyBjYWxsYmFja3MKKyAqLworCitjb25zdCBzdHJ1Y3QgdmIyX29wcyBxX29wcyA9IHsKKwkucXVldWVfc2V0dXAgPSBkdDMxNTVfcXVldWVfc2V0dXAsCisJLndhaXRfcHJlcGFyZSA9IGR0MzE1NV93YWl0X3ByZXBhcmUsCisJLndhaXRfZmluaXNoID0gZHQzMTU1X3dhaXRfZmluaXNoLAorCS5idWZfcHJlcGFyZSA9IGR0MzE1NV9idWZfcHJlcGFyZSwKKwkuc3RhcnRfc3RyZWFtaW5nID0gZHQzMTU1X3N0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcgPSBkdDMxNTVfc3RvcF9zdHJlYW1pbmcsCisJLmJ1Zl9xdWV1ZSA9IGR0MzE1NV9idWZfcXVldWUsCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2R0MzE1NV9pcnFfaGFuZGxlcl9ldmVuKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKmlwZCA9IGRldl9pZDsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqaXZiOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTMyIHRtcDsKKworCXRtcCA9IGlvcmVhZDMyKGlwZC0+cmVncyArIElOVF9DU1IpICYgKEZMRF9TVEFSVCB8IEZMRF9FTkRfT0REKTsKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIElSUV9OT05FOyAgLyogbm90IG91ciBpcnEgKi8KKwlpZiAoKHRtcCAmIEZMRF9TVEFSVCkgJiYgISh0bXAgJiBGTERfRU5EX09ERCkpIHsKKwkJaW93cml0ZTMyKEZMRF9TVEFSVF9FTiB8IEZMRF9FTkRfT0REX0VOIHwgRkxEX1NUQVJULAorCQkJCQkJCWlwZC0+cmVncyArIElOVF9DU1IpOworCQlpcGQtPmZpZWxkX2NvdW50Kys7CisJCXJldHVybiBJUlFfSEFORExFRDsgLyogc3RhcnQgb2YgZmllbGQgaXJxICovCisJfQorCWlmICgodG1wICYgRkxEX1NUQVJUKSAmJiAodG1wICYgRkxEX0VORF9PREQpKQorCQlpcGQtPnN0YXRzLnN0YXJ0X2JlZm9yZV9lbmQrKzsKKwkvKgljaGVjayBmb3IgY29ycnVwdGVkIGZpZWxkcyAgICAgKi8KKy8qCXdyaXRlX2kyY19yZWcoaXBkLT5yZWdzLCBFVkVOX0NTUiwgQ1NSX0VSUk9SIHwgQ1NSX0RPTkUpOwkqLworLyoJd3JpdGVfaTJjX3JlZyhpcGQtPnJlZ3MsIE9ERF9DU1IsIENTUl9FUlJPUiB8IENTUl9ET05FKTsJKi8KKwl0bXAgPSBpb3JlYWQzMihpcGQtPnJlZ3MgKyBDU1IxKSAmIChGTERfQ1JQVF9FVkVOIHwgRkxEX0NSUFRfT0REKTsKKwlpZiAodG1wKSB7CisJCWlwZC0+c3RhdHMuY29ycnVwdGVkX2ZpZWxkcysrOworCQlpb3dyaXRlMzIoRklGT19FTiB8IFNSU1QgfCBGTERfQ1JQVF9PREQgfCBGTERfQ1JQVF9FVkVOIHwKKwkJCQkJCUZMRF9ETl9PREQgfCBGTERfRE5fRVZFTiB8CisJCQkJCQlDQVBfQ09OVF9FVkVOIHwgQ0FQX0NPTlRfT0RELAorCQkJCQkJCWlwZC0+cmVncyArIENTUjEpOworCQltbWlvd2IoKTsKKwl9CisKKwlzcGluX2xvY2soJmlwZC0+bG9jayk7CisJaWYgKGlwZC0+Y3Vycl9idWYpIHsKKwkJZG9fZ2V0dGltZW9mZGF5KCZpcGQtPmN1cnJfYnVmLT52NGwyX2J1Zi50aW1lc3RhbXApOworCQlpcGQtPmN1cnJfYnVmLT52NGwyX2J1Zi5zZXF1ZW5jZSA9IChpcGQtPmZpZWxkX2NvdW50KSA+PiAxOworCQl2YjJfYnVmZmVyX2RvbmUoaXBkLT5jdXJyX2J1ZiwgVkIyX0JVRl9TVEFURV9ET05FKTsKKwl9CisKKwlpZiAoIWlwZC0+cS0+c3RyZWFtaW5nIHx8IGxpc3RfZW1wdHkoJmlwZC0+ZG1hcSkpCisJCWdvdG8gc3RvcF9kbWE7CisJaXZiID0gbGlzdF9maXJzdF9lbnRyeSgmaXBkLT5kbWFxLCB0eXBlb2YoKml2YiksIGRvbmVfZW50cnkpOworCWxpc3RfZGVsKCZpdmItPmRvbmVfZW50cnkpOworCWlwZC0+Y3Vycl9idWYgPSBpdmI7CisJZG1hX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihpdmIsIDApOworCWlvd3JpdGUzMihkbWFfYWRkciwgaXBkLT5yZWdzICsgRVZFTl9ETUFfU1RBUlQpOworCWlvd3JpdGUzMihkbWFfYWRkciArIGltZ193aWR0aCwgaXBkLT5yZWdzICsgT0REX0RNQV9TVEFSVCk7CisJaW93cml0ZTMyKGltZ193aWR0aCwgaXBkLT5yZWdzICsgRVZFTl9ETUFfU1RSSURFKTsKKwlpb3dyaXRlMzIoaW1nX3dpZHRoLCBpcGQtPnJlZ3MgKyBPRERfRE1BX1NUUklERSk7CisJbW1pb3diKCk7CisJLyogZW5hYmxlIGludGVycnVwdHMsIGNsZWFyIGFsbCBpcnEgZmxhZ3MgKi8KKwlpb3dyaXRlMzIoRkxEX1NUQVJUX0VOIHwgRkxEX0VORF9PRERfRU4gfCBGTERfU1RBUlQgfAorCQkJRkxEX0VORF9FVkVOIHwgRkxEX0VORF9PREQsIGlwZC0+cmVncyArIElOVF9DU1IpOworCXNwaW5fdW5sb2NrKCZpcGQtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKKworc3RvcF9kbWE6CisJaXBkLT5jdXJyX2J1ZiA9IE5VTEw7CisJLyogc3RvcCB0aGUgYm9hcmQgKi8KKwl3cml0ZV9pMmNfcmVnX25vd2FpdChpcGQtPnJlZ3MsIENTUjIsIGlwZC0+Y3NyMik7CisJaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgRkxEX0NSUFRfT0REIHwgRkxEX0NSUFRfRVZFTiB8CisJCSAgRkxEX0ROX09ERCB8IEZMRF9ETl9FVkVOLCBpcGQtPnJlZ3MgKyBDU1IxKTsKKwkvKiBkaXNhYmxlIGludGVycnVwdHMsIGNsZWFyIGFsbCBpcnEgZmxhZ3MgKi8KKwlpb3dyaXRlMzIoRkxEX1NUQVJUIHwgRkxEX0VORF9FVkVOIHwgRkxEX0VORF9PREQsIGlwZC0+cmVncyArIElOVF9DU1IpOworCXNwaW5fdW5sb2NrKCZpcGQtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludAorZHQzMTU1X29wZW4oc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlpZiAoIXBkLT51c2VycykgeworCQlwZC0+cSA9IGt6YWxsb2Moc2l6ZW9mKCpwZC0+cSksIEdGUF9LRVJORUwpOworCQlpZiAoIXBkLT5xKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfYWxsb2NfcXVldWU7CisJCX0KKwkJcGQtPnEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCXBkLT5xLT5pb19tb2RlcyA9IFZCMl9SRUFEIHwgVkIyX01NQVA7CisJCXBkLT5xLT5vcHMgPSAmcV9vcHM7CisJCXBkLT5xLT5tZW1fb3BzID0gJnZiMl9kbWFfY29udGlnX21lbW9wczsKKwkJcGQtPnEtPmRydl9wcml2ID0gcGQ7CisJCXBkLT5jdXJyX2J1ZiA9IE5VTEw7CisJCXBkLT5maWVsZF9jb3VudCA9IDA7CisJCXZiMl9xdWV1ZV9pbml0KHBkLT5xKTsgLyogY2Fubm90IGZhaWwgKi8KKwkJSU5JVF9MSVNUX0hFQUQoJnBkLT5kbWFxKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBkLT5sb2NrKTsKKwkJLyogZGlzYWJsZSBhbGwgaXJxcywgY2xlYXIgYWxsIGlycSBmbGFncyAqLworCQlpb3dyaXRlMzIoRkxEX1NUQVJUIHwgRkxEX0VORF9FVkVOIHwgRkxEX0VORF9PREQsCisJCQkJCQlwZC0+cmVncyArIElOVF9DU1IpOworCQlyZXQgPSByZXF1ZXN0X2lycShwZC0+cGRldi0+aXJxLCBkdDMxNTVfaXJxX2hhbmRsZXJfZXZlbiwKKwkJCQkJCUlSUUZfU0hBUkVELCBEVDMxNTVfTkFNRSwgcGQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcmVxdWVzdF9pcnE7CisJfQorCXBkLT51c2VycysrOworCXJldHVybiAwOyAvKiBzdWNjZXNzICovCitlcnJfcmVxdWVzdF9pcnE6CisJa2ZyZWUocGQtPnEpOworCXBkLT5xID0gTlVMTDsKK2Vycl9hbGxvY19xdWV1ZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitkdDMxNTVfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKKworCXBkLT51c2Vycy0tOworCUJVR19PTihwZC0+dXNlcnMgPCAwKTsKKwlpZiAoIXBkLT51c2VycykgeworCQl2YjJfcXVldWVfcmVsZWFzZShwZC0+cSk7CisJCWZyZWVfaXJxKHBkLT5wZGV2LT5pcnEsIHBkKTsKKwkJaWYgKHBkLT5xLT5hbGxvY19jdHhbMF0pCisJCQl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChwZC0+cS0+YWxsb2NfY3R4WzBdKTsKKwkJa2ZyZWUocGQtPnEpOworCQlwZC0+cSA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorZHQzMTU1X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1c2VyLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpsb2ZmKQoreworCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOworCisJcmV0dXJuIHZiMl9yZWFkKHBkLT5xLCB1c2VyLCBzaXplLCBsb2ZmLCBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2R0MzE1NV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnBvbGx0YmwpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3BvbGwocGQtPnEsIGZpbHAsIHBvbGx0YmwpOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX21tYXAocGQtPnEsIHZtYSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgZHQzMTU1X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBkdDMxNTVfb3BlbiwKKwkucmVsZWFzZSA9IGR0MzE1NV9yZWxlYXNlLAorCS5yZWFkID0gZHQzMTU1X3JlYWQsCisJLnBvbGwgPSBkdDMxNTVfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsIC8qIFY0TDIgaW9jdGwgaGFuZGxlciAqLworCS5tbWFwID0gZHQzMTU1X21tYXAsCit9OworCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKKworCXJldHVybiB2YjJfc3RyZWFtb24ocGQtPnEsIHR5cGUpOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3N0cmVhbW9mZihwZC0+cSwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKKworCXN0cmNweShjYXAtPmRyaXZlciwgRFQzMTU1X05BTUUpOworCXN0cmNweShjYXAtPmNhcmQsIERUMzE1NV9OQU1FICIgZnJhbWUgZ3JhYmJlciIpOworCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlBDSTolcyIsIHBjaV9uYW1lKHBkLT5wZGV2KSk7CisJY2FwLT52ZXJzaW9uID0KKwkgICAgICAgS0VSTkVMX1ZFUlNJT04oRFQzMTU1X1ZFUl9NQUosIERUMzE1NV9WRVJfTUlOLCBEVDMxNTVfVkVSX0VYVCk7CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJCQlEVDMxNTVfQ0FQVFVSRV9NRVRIT0Q7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlpZiAoZi0+aW5kZXggPj0gTlVNX09GX0ZPUk1BVFMpCisJCXJldHVybiAtRUlOVkFMOworCSpmID0gZnJhbWVfc3RkW2YtPmluZGV4XTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHQzMTU1X2lvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmLT5mbXQucGl4LndpZHRoID0gaW1nX3dpZHRoOworCWYtPmZtdC5waXguaGVpZ2h0ID0gaW1nX2hlaWdodDsKKwlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVk7CisJZi0+Zm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IGYtPmZtdC5waXgud2lkdGg7CisJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPSBmLT5mbXQucGl4LndpZHRoICogZi0+Zm10LnBpeC5oZWlnaHQ7CisJZi0+Zm10LnBpeC5jb2xvcnNwYWNlID0gMDsKKwlmLT5mbXQucGl4LnByaXYgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGYtPmZtdC5waXgud2lkdGggPT0gaW1nX3dpZHRoICYmCisJCWYtPmZtdC5waXguaGVpZ2h0ID09IGltZ19oZWlnaHQgJiYKKwkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfR1JFWSAmJgorCQlmLT5mbXQucGl4LmZpZWxkID09IFY0TDJfRklFTERfTk9ORSAmJgorCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9PSBmLT5mbXQucGl4LndpZHRoICYmCisJCWYtPmZtdC5waXguc2l6ZWltYWdlID09IGYtPmZtdC5waXgud2lkdGggKiBmLT5mbXQucGl4LmhlaWdodCkKKwkJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXJldHVybiBkdDMxNTVfaW9jX2dfZm10X3ZpZF9jYXAoZmlscCwgcCwgZik7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3JlcWJ1ZnMocGQtPnEsIGIpOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3F1ZXJ5YnVmKHBkLT5xLCBiKTsKK30KKworc3RhdGljIGludAorZHQzMTU1X2lvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3FidWYocGQtPnEsIGIpOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX2RxYnVmKHBkLT5xLCBiLCBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2NfcXVlcnlzdGQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHY0bDJfc3RkX2lkICpub3JtKQoreworCSpub3JtID0gRFQzMTU1X0NVUlJFTlRfTk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHQzMTU1X2lvY19nX3N0ZChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgdjRsMl9zdGRfaWQgKm5vcm0pCit7CisJKm5vcm0gPSBEVDMxNTVfQ1VSUkVOVF9OT1JNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCB2NGwyX3N0ZF9pZCAqbm9ybSkKK3sKKwlpZiAoKm5vcm0gJiBEVDMxNTVfQ1VSUkVOVF9OT1JNKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludAorZHQzMTU1X2lvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wdXQpCit7CisJaWYgKGlucHV0LT5pbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RyY3B5KGlucHV0LT5uYW1lLCAiQ29heCBpbiIpOworCWlucHV0LT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwkvKgorCSAqIEZJWE1FOiBpbnB1dC0+c3RkID0gMCBhY2NvcmRpbmcgdG8gdjRsMiBBUEkKKwkgKiBWSURJT0NfR19TVEQsIFZJRElPQ19TX1NURCwgVklESU9DX1FVRVJZU1REIGFuZCBWSURJT0NfRU5VTVNURAorCSAqIHNob3VsZCByZXR1cm4gLUVJTlZBTAorCSAqLworCWlucHV0LT5zdGQgPSBEVDMxNTVfQ1VSUkVOVF9OT1JNOworCWlucHV0LT5zdGF0dXMgPSAwOy8qIEZJWE1FOiBhZGQgc3luYyBkZXRlY3Rpb24gJiBWNEwyX0lOX1NUX05PX0hfTE9DSyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHVuc2lnbmVkIGludCAqaSkKK3sKKwkqaSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX2dfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCit7CisJaWYgKHBhcm1zLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5ID0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOworCXBhcm1zLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgPSAwOworCXBhcm1zLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IDEwMDE7CisJcGFybXMtPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSBmcmFtZXNfcGVyX3NlYyAqIDEwMDA7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUgPSAwOworCXBhcm1zLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSAxOyAvKiBGSVhNRTogMiBidWZmZXJzPyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3NfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCit7CisJaWYgKHBhcm1zLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5ID0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOworCXBhcm1zLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgPSAwOworCXBhcm1zLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IDEwMDE7CisJcGFybXMtPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSBmcmFtZXNfcGVyX3NlYyAqIDEwMDA7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUgPSAwOworCXBhcm1zLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSAxOyAvKiBGSVhNRTogMiBidWZmZXJzPyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIGR0MzE1NV9pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19zdHJlYW1vbiA9IGR0MzE1NV9pb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgPSBkdDMxNTVfaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX3F1ZXJ5Y2FwID0gZHQzMTU1X2lvY19xdWVyeWNhcCwKKy8qCisJLnZpZGlvY19nX3ByaW9yaXR5ID0gZHQzMTU1X2lvY19nX3ByaW9yaXR5LAorCS52aWRpb2Nfc19wcmlvcml0eSA9IGR0MzE1NV9pb2Nfc19wcmlvcml0eSwKKyovCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gZHQzMTU1X2lvY19lbnVtX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gZHQzMTU1X2lvY190cnlfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwID0gZHQzMTU1X2lvY19nX2ZtdF92aWRfY2FwLAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IGR0MzE1NV9pb2Nfc19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3JlcWJ1ZnMgPSBkdDMxNTVfaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiA9IGR0MzE1NV9pb2NfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmID0gZHQzMTU1X2lvY19xYnVmLAorCS52aWRpb2NfZHFidWYgPSBkdDMxNTVfaW9jX2RxYnVmLAorCS52aWRpb2NfcXVlcnlzdGQgPSBkdDMxNTVfaW9jX3F1ZXJ5c3RkLAorCS52aWRpb2NfZ19zdGQgPSBkdDMxNTVfaW9jX2dfc3RkLAorCS52aWRpb2Nfc19zdGQgPSBkdDMxNTVfaW9jX3Nfc3RkLAorCS52aWRpb2NfZW51bV9pbnB1dCA9IGR0MzE1NV9pb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQgPSBkdDMxNTVfaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ID0gZHQzMTU1X2lvY19zX2lucHV0LAorLyoKKwkudmlkaW9jX3F1ZXJ5Y3RybCA9IGR0MzE1NV9pb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsID0gZHQzMTU1X2lvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgPSBkdDMxNTVfaW9jX3NfY3RybCwKKwkudmlkaW9jX3F1ZXJ5bWVudSA9IGR0MzE1NV9pb2NfcXVlcnltZW51LAorCS52aWRpb2NfZ19leHRfY3RybHMgPSBkdDMxNTVfaW9jX2dfZXh0X2N0cmxzLAorCS52aWRpb2Nfc19leHRfY3RybHMgPSBkdDMxNTVfaW9jX3NfZXh0X2N0cmxzLAorKi8KKwkudmlkaW9jX2dfcGFybSA9IGR0MzE1NV9pb2NfZ19wYXJtLAorCS52aWRpb2Nfc19wYXJtID0gZHQzMTU1X2lvY19zX3Bhcm0sCisvKgorCS52aWRpb2NfY3JvcGNhcCA9IGR0MzE1NV9pb2NfY3JvcGNhcCwKKwkudmlkaW9jX2dfY3JvcCA9IGR0MzE1NV9pb2NfZ19jcm9wLAorCS52aWRpb2Nfc19jcm9wID0gZHQzMTU1X2lvY19zX2Nyb3AsCisJLnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMgPSBkdDMxNTVfaW9jX2VudW1fZnJhbWVzaXplcywKKwkudmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMgPSBkdDMxNTVfaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMsCisqLworfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2R0MzE1NV9pbml0X2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCAqYnVmX2NwdTsKKwlkbWFfYWRkcl90IGJ1Zl9kbWE7CisJaW50IGk7CisJdTggdG1wOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7IC8qIGR0MzE1NSBuZWVkcyBpdCAqLworCisJLyogIHJlc2V0dGluZyB0aGUgYWRhcHRlciAgKi8KKwlpb3dyaXRlMzIoRkxEX0NSUFRfT0REIHwgRkxEX0NSUFRfRVZFTiB8IEZMRF9ETl9PREQgfCBGTERfRE5fRVZFTiwKKwkJCQkJCQlwZC0+cmVncyArIENTUjEpOworCW1taW93YigpOworCW1zbGVlcCgyMCk7CisKKwkvKiAgaW5pdGlhbGl6aW5nIGFkYXBlciByZWdpc3RlcnMgICovCisJaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNULCBwZC0+cmVncyArIENTUjEpOworCW1taW93YigpOworCWlvd3JpdGUzMigweEVFRUVFRTAxLCBwZC0+cmVncyArIEVWRU5fUElYRUxfRk1UKTsKKwlpb3dyaXRlMzIoMHhFRUVFRUUwMSwgcGQtPnJlZ3MgKyBPRERfUElYRUxfRk1UKTsKKwlpb3dyaXRlMzIoMHgwMDAwMDAyMCwgcGQtPnJlZ3MgKyBGSUZPX1RSSUdFUik7CisJaW93cml0ZTMyKDB4MDAwMDAxMDMsIHBkLT5yZWdzICsgWEZFUl9NT0RFKTsKKwlpb3dyaXRlMzIoMCwgcGQtPnJlZ3MgKyBSRVRSWV9XQUlUX0NOVCk7CisJaW93cml0ZTMyKDAsIHBkLT5yZWdzICsgSU5UX0NTUik7CisJaW93cml0ZTMyKDEsIHBkLT5yZWdzICsgRVZFTl9GTERfTUFTSyk7CisJaW93cml0ZTMyKDEsIHBkLT5yZWdzICsgT0REX0ZMRF9NQVNLKTsKKwlpb3dyaXRlMzIoMCwgcGQtPnJlZ3MgKyBNQVNLX0xFTkdUSCk7CisJaW93cml0ZTMyKDB4MDAwNTAwN0MsIHBkLT5yZWdzICsgRklGT19GTEFHX0NOVCk7CisJaW93cml0ZTMyKDB4MDEwMTAxMDEsIHBkLT5yZWdzICsgSUlDX0NMS19EVVIpOworCW1taW93YigpOworCisJLyogdmVyaWZ5aW5nIHRoYXQgd2UgaGF2ZSBhIERUMzE1NSBib2FyZCAobm90IGp1c3QgYSBTQUE3MTE2IGNoaXApICovCisJcmVhZF9pMmNfcmVnKHBkLT5yZWdzLCBEVF9JRCwgJnRtcCk7CisJaWYgKHRtcCAhPSBEVDMxNTVfSUQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogaW5pdGlhbGl6ZSBBRCBMVVQgKi8KKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9BRERSLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEFEX0xVVCwgaSk7CisKKwkvKiBpbml0aWFsaXplIEFEQyByZWZlcmVuY2VzICovCisJLyogRklYTUU6IHBvc19yZWYgJiBuZWdfcmVmIGRlcGVuZCBvbiBWVF81MEhaICovCisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgQURfQ01EX1JFRyk7CisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQ01ELCBWSURFT19DTkxfMSB8IFNZTkNfQ05MXzEgfCBTWU5DX0xWTF8zKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9BRERSLCBBRF9QT1NfUkVGKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9DTUQsIDM0KTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9BRERSLCBBRF9ORUdfUkVGKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9DTUQsIDApOworCisJLyogaW5pdGlhbGl6ZSBQTSBMVVQgKi8KKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcgfCBQTV9MVVRfUEdNKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgUE1fTFVUX0FERFIsIGkpOworCQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBQTV9MVVRfREFUQSwgaSk7CisJfQorCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENPTkZJRywgcGQtPmNvbmZpZyB8IFBNX0xVVF9QR00gfCBQTV9MVVRfU0VMKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgUE1fTFVUX0FERFIsIGkpOworCQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBQTV9MVVRfREFUQSwgaSk7CisJfQorCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENPTkZJRywgcGQtPmNvbmZpZyk7IC8qICBBQ1FfTU9ERV9FVkVOICAqLworCisJLyogc2VsZWN0IGNoYW5lbCAxIGZvciBpbnB1dCBhbmQgc2V0IHN5bmMgbGV2ZWwgKi8KKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9BRERSLCBBRF9DTURfUkVHKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9DTUQsIFZJREVPX0NOTF8xIHwgU1lOQ19DTkxfMSB8IFNZTkNfTFZMXzMpOworCisJLyogYWxsb2NhdGUgbWVtb3J5LCBhbmQgaW5pdGlhbGl6ZSB0aGUgRE1BIG1hY2hpbmUgKi8KKwlidWZfY3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIERUMzE1NV9CVUZfU0laRSwgJmJ1Zl9kbWEsCisJCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghYnVmX2NwdSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW93cml0ZTMyKGJ1Zl9kbWEsIHBkLT5yZWdzICsgRVZFTl9ETUFfU1RBUlQpOworCWlvd3JpdGUzMihidWZfZG1hLCBwZC0+cmVncyArIE9ERF9ETUFfU1RBUlQpOworCWlvd3JpdGUzMigwLCBwZC0+cmVncyArIEVWRU5fRE1BX1NUUklERSk7CisJaW93cml0ZTMyKDAsIHBkLT5yZWdzICsgT0REX0RNQV9TVFJJREUpOworCisJLyogIFBlcmZvcm0gYSBwc2V1ZG8gZXZlbiBmaWVsZCBhY3F1aXJlICAgICovCisJaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgQ0FQX0NPTlRfT0RELCBwZC0+cmVncyArIENTUjEpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENTUjIsIHBkLT5jc3IyIHwgU1lOQ19TTlRMKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEVWRU5fQ1NSLCBDU1JfU05HTCk7CisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ1NSMiwgcGQtPmNzcjIgfCBCVVNZX0VWRU4gfCBTWU5DX1NOVEwpOworCW1zbGVlcCgxMDApOworCXJlYWRfaTJjX3JlZyhwZC0+cmVncywgQ1NSMiwgJnRtcCk7CisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgRVZFTl9DU1IsIENTUl9FUlJPUiB8IENTUl9TTkdMIHwgQ1NSX0RPTkUpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIE9ERF9DU1IsIENTUl9FUlJPUiB8IENTUl9TTkdMIHwgQ1NSX0RPTkUpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENTUjIsIHBkLT5jc3IyKTsKKwlpb3dyaXRlMzIoRklGT19FTiB8IFNSU1QgfCBGTERfRE5fRVZFTiB8IEZMRF9ETl9PREQsIHBkLT5yZWdzICsgQ1NSMSk7CisKKwkvKiAgZGVhbGxvY2F0ZSBtZW1vcnkgICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgRFQzMTU1X0JVRl9TSVpFLCBidWZfY3B1LCBidWZfZG1hKTsKKwlpZiAodG1wICYgQlVTWV9FVkVOKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgZHQzMTU1X3ZkZXYgPSB7CisJLm5hbWUgPSBEVDMxNTVfTkFNRSwKKwkuZm9wcyA9ICZkdDMxNTVfZm9wcywKKwkuaW9jdGxfb3BzID0gJmR0MzE1NV9pb2N0bF9vcHMsCisJLm1pbm9yID0gLTEsCisJLnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwkudHZub3JtcyA9IERUMzE1NV9DVVJSRU5UX05PUk0sCisJLmN1cnJlbnRfbm9ybSA9IERUMzE1NV9DVVJSRU5UX05PUk0sCit9OworCisvKiBzYW1lIGFzIGluIGRyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYyAqLworc3RydWN0IGRtYV9jb2hlcmVudF9tZW0geworCXZvaWQJCSp2aXJ0X2Jhc2U7CisJZG1hX2FkZHJfdAlkZXZpY2VfYmFzZTsKKwlpbnQJCXNpemU7CisJaW50CQlmbGFnczsKKwl1bnNpZ25lZCBsb25nCSpiaXRtYXA7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZHQzMTU1X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtOworCWRtYV9hZGRyX3QgZGV2X2Jhc2U7CisJaW50IHBhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCWludCBiaXRtYXBfc2l6ZSA9IEJJVFNfVE9fTE9OR1MocGFnZXMpICogc2l6ZW9mKGxvbmcpOworCisJaWYgKChmbGFncyAmIERNQV9NRU1PUllfTUFQKSA9PSAwKQorCQlnb3RvIG91dDsKKwlpZiAoIXNpemUpCisJCWdvdG8gb3V0OworCWlmIChkZXYtPmRtYV9tZW0pCisJCWdvdG8gb3V0OworCisJbWVtID0ga3phbGxvYyhzaXplb2YoKm1lbSksIEdGUF9LRVJORUwpOworCWlmICghbWVtKQorCQlnb3RvIG91dDsKKwltZW0tPnZpcnRfYmFzZSA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsICZkZXZfYmFzZSwKKwkJCQkJCQlEVDMxNTVfQ09IX0ZMQUdTKTsKKwlpZiAoIW1lbS0+dmlydF9iYXNlKQorCQlnb3RvIGVycl9hbGxvY19jb2hlcmVudDsKKwltZW0tPmJpdG1hcCA9IGt6YWxsb2MoYml0bWFwX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghbWVtLT5iaXRtYXApCisJCWdvdG8gZXJyX2JpdG1hcDsKKworCS8qIGNvaGVyZW50X2RtYV9tYXNrIGlzIGFscmVhZHkgc2V0IHRvIDMyIGJpdHMgKi8KKwltZW0tPmRldmljZV9iYXNlID0gZGV2X2Jhc2U7CisJbWVtLT5zaXplID0gcGFnZXM7CisJbWVtLT5mbGFncyA9IGZsYWdzOworCWRldi0+ZG1hX21lbSA9IG1lbTsKKwlyZXR1cm4gRE1BX01FTU9SWV9NQVA7CisKK2Vycl9iaXRtYXA6CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCBtZW0tPnZpcnRfYmFzZSwgZGV2X2Jhc2UpOworZXJyX2FsbG9jX2NvaGVyZW50OgorCWtmcmVlKG1lbSk7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorZHQzMTU1X2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtICptZW0gPSBkZXYtPmRtYV9tZW07CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCWRldi0+ZG1hX21lbSA9IE5VTEw7CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBtZW0tPnNpemUgPDwgUEFHRV9TSElGVCwKKwkJCQkJbWVtLT52aXJ0X2Jhc2UsIG1lbS0+ZGV2aWNlX2Jhc2UpOworCWtmcmVlKG1lbS0+Yml0bWFwKTsKKwlrZnJlZShtZW0pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZHQzMTU1X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkOworCisJZXJyID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChlcnIpCisJCXJldHVybiAtRU5PREVWOworCWVyciA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwZCA9IGt6YWxsb2Moc2l6ZW9mKCpwZCksIEdGUF9LRVJORUwpOworCWlmICghcGQpCisJCXJldHVybiAtRU5PTUVNOworCXBkLT52ZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKCFwZC0+dmRldikKKwkJZ290byBlcnJfdmlkZW9fZGV2aWNlX2FsbG9jOworCSpwZC0+dmRldiA9IGR0MzE1NV92ZGV2OworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwZCk7ICAgIC8qIGZvciB1c2UgaW4gZHQzMTU1X3JlbW92ZSgpICovCisJdmlkZW9fc2V0X2RydmRhdGEocGQtPnZkZXYsIHBkKTsgIC8qIGZvciB1c2UgaW4gdmlkZW9fZm9wcyAqLworCXBkLT51c2VycyA9IDA7CisJcGQtPnBkZXYgPSBwZGV2OworCUlOSVRfTElTVF9IRUFEKCZwZC0+ZG1hcSk7CisJbXV0ZXhfaW5pdCgmcGQtPm11eCk7CisJcGQtPnZkZXYtPmxvY2sgPSAmcGQtPm11eDsgLyogZm9yIGxvY2tpbmcgdjRsMl9maWxlX29wZXJhdGlvbnMgKi8KKwlzcGluX2xvY2tfaW5pdCgmcGQtPmxvY2spOworCXBkLT5jc3IyID0gY3NyMl9pbml0OworCXBkLT5jb25maWcgPSBjb25maWdfaW5pdDsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9lbmFibGVfZGV2OworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAwLCBwY2lfbmFtZShwZGV2KSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVxX3JlZ2lvbjsKKwlwZC0+cmVncyA9IHBjaV9pb21hcChwZGV2LCAwLCBwY2lfcmVzb3VyY2VfbGVuKHBkLT5wZGV2LCAwKSk7CisJaWYgKCFwZC0+cmVncykKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfcGNpX2lvbWFwOworCWVyciA9IGR0MzE1NV9pbml0X2JvYXJkKHBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2luaXRfYm9hcmQ7CisJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHBkLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfaW5pdF9ib2FyZDsKKwlpZiAoZHQzMTU1X2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIERUMzE1NV9DSFVOS19TSVpFLAorCQkJCQkJCURNQV9NRU1PUllfTUFQKSkKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgInByZWFsbG9jYXRlZCA4IGJ1ZmZlcnNcbiIpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIvZGV2L3ZpZGVvJWkgaXMgcmVhZHlcbiIsIHBkLT52ZGV2LT5taW5vcik7CisJcmV0dXJuIDA7ICAvKiAgIHN1Y2Nlc3MgICAqLworCitlcnJfaW5pdF9ib2FyZDoKKwlwY2lfaW91bm1hcChwZGV2LCBwZC0+cmVncyk7CitlcnJfcGNpX2lvbWFwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKK2Vycl9yZXFfcmVnaW9uOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9lbmFibGVfZGV2OgorCXZpZGVvX2RldmljZV9yZWxlYXNlKHBkLT52ZGV2KTsKK2Vycl92aWRlb19kZXZpY2VfYWxsb2M6CisJa2ZyZWUocGQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorZHQzMTU1X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZHQzMTU1X2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldik7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UocGQtPnZkZXYpOworCXBjaV9pb3VubWFwKHBkZXYsIHBkLT5yZWdzKTsKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCS8qCisJICogdmlkZW9fZGV2aWNlX3JlbGVhc2UoKSBpcyBpbnZva2VkIGF1dG9tYXRpY2FsbHkKKwkgKiBzZWU6IHN0cnVjdCB2aWRlb19kZXZpY2UgZHQzMTU1X3ZkZXYKKwkgKi8KKwlrZnJlZShwZCk7Cit9CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShwY2lfaWRzKSA9IHsKKwl7IFBDSV9ERVZJQ0UoRFQzMTU1X1ZFTkRPUl9JRCwgRFQzMTU1X0RFVklDRV9JRCkgfSwKKwl7IDAsIC8qIHplcm8gbWFya3MgdGhlIGVuZCAqLyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEVDMxNTVfTkFNRSwKKwkuaWRfdGFibGUgPSBwY2lfaWRzLAorCS5wcm9iZSA9IGR0MzE1NV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoZHQzMTU1X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdAorZHQzMTU1X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2R0MzE1NV9leGl0X21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGR0MzE1NV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkdDMxNTVfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oInZpZGVvNGxpbnV4IHBjaS1kcml2ZXIgZm9yIGR0MzE1NSBmcmFtZSBncmFiYmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYXJpbiBNaXRvdiA8bWl0b3ZAaXNzcC5iYXMuYmc+Iik7CitNT0RVTEVfVkVSU0lPTihEVDMxNTVfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9kdDMxNTV2NGwuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL0tjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZWFzeWNhcC9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvUkVBRE1FCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL1JFQURNRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcC5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXAuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2lvY3RsLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9sb3cuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF9tYWluLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZWFzeWNhcC9lYXN5Y2FwX21haW4uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zZXR0aW5ncy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF9zZXR0aW5ncy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NldHRpbmdzLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfc2V0dGluZ3MuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zb3VuZC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF9zb3VuZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF90ZXN0Y2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF90ZXN0Y2FyZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3Rlc3RjYXJkLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfdGVzdGNhcmQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9LY29uZmlnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvS2NvbmZpZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9SRUFETUUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvUkVBRE1FCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L1JFQURNRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWRyaXZlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1mdy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctZncuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZncuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctZncuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1pMmMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctaTJjLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWkyYy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1wcml2LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1wcml2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctcHJpdi5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LXVzYi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctdXNiLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LXY0bDIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdjRsMi5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy12NGwyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LnR4dApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDcudHh0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWJvYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3MyMjUwLWJvYXJkLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtYm9hcmQuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zMjI1MC1ib2FyZC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWxvYWRlci5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvczIyNTAtbG9hZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtbG9hZGVyLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvczIyNTAtbG9hZGVyLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zYWE3MTM0LWdvNzAwNy5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3NhYTcxMzQtZ283MDA3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc25kLWdvNzAwNy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zbmQtZ283MDA3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc25kLWdvNzAwNy5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3NuZC1nbzcwMDcuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy1pMmMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLWkyYy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1vdjc2NDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLW92NzY0MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1vdjc2NDAuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy93aXMtb3Y3NjQwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNhYTcxMTMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLXNhYTcxMTMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc2FhNzExMy5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy1zYWE3MTEzLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNhYTcxMTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLXNhYTcxMTUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc2FhNzExNS5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy1zYWE3MTE1LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc29ueS10dW5lci5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy1zb255LXR1bmVyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXR3MjgwNC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy93aXMtdHcyODA0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXR3MjgwNC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy10dzI4MDQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtdHc5OTAzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy10dzk5MDMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtdHc5OTAzLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLXR3OTkwMy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy11ZGExMzQyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy11ZGExMzQyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXVkYTEzNDIuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy93aXMtdWRhMTM0Mi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvS2NvbmZpZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvS2NvbmZpZwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvS2NvbmZpZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvTWFrZWZpbGUKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL01ha2VmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvVE9ETwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvVE9ETwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvVE9ETwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvVE9ETy5saXJjX3ppbG9nIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvVE9ETy5saXJjX3ppbG9nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvbGlyYy9UT0RPLmxpcmNfemlsb2cKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL1RPRE8ubGlyY196aWxvZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19idDgyOS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19idDgyOS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2J0ODI5LmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfYnQ4MjkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19lbmUwMTAwLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2VuZTAxMDAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19lbmUwMTAwLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfZW5lMDEwMC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2lnb3JwbHVndXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2lnb3JwbHVndXNiLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaWdvcnBsdWd1c2IuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pZ29ycGx1Z3VzYi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pbW9uLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfcGFyYWxsZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19wYXJhbGxlbC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfcGFyYWxsZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19wYXJhbGxlbC5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2FzZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zYXNlbS5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2VyaWFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3NlcmlhbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3NlcmlhbC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3NlcmlhbC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3Npci5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zaXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zaXIuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zaXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY190dHVzYmlyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3R0dXNiaXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY190dHVzYmlyLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfdHR1c2Jpci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3ppbG9nLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3ppbG9nLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfemlsb2cuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY196aWxvZy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9LY29uZmlnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvS2NvbmZpZwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL01ha2VmaWxlCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL1RPRE8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9UT0RPCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvVE9ETwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9jb3JlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9jb3JlLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9jb3JlLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9kaXNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvZGlzcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvZGlzcC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvZGlzcC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvZW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvZW5jLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9lbmMuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2VuYy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvZzcyMy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2c3MjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2QwZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2c3MjMuYwpAQCAtMCwwICsxLDQwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSAic29sbzZ4MTAuaCIKKyNpbmNsdWRlICJ0dzI4LmgiCisKKyNkZWZpbmUgRzcyM19JTlRSX09SREVSCQkwCisjZGVmaW5lIEc3MjNfRkRNQV9QQUdFUwkJMzIKKyNkZWZpbmUgRzcyM19QRVJJT0RfQllURVMJNDgKKyNkZWZpbmUgRzcyM19QRVJJT0RfQkxPQ0sJMTAyNAorI2RlZmluZSBHNzIzX0ZSQU1FU19QRVJfUEFHRQk0OAorCisvKiBTZXRzIHVwIGNoYW5uZWxzIDE2LTE5IGZvciBkZWNvZGluZyBhbmQgMC0xNSBmb3IgZW5jb2RpbmcgKi8KKyNkZWZpbmUgT1VUTU9ERV9NQVNLCQkweDMwMAorCisjZGVmaW5lIFNBTVBMRVJBVEUJCTgwMDAKKyNkZWZpbmUgQklUUkFURQkJCTI1CisKKy8qIFRoZSBzb2xvIHdyaXRlcyB0byAxayBieXRlIHBhZ2VzLCAzMiBwYWdlcywgaW4gdGhlIGRtYS4gRWFjaCAxayBwYWdlCisgKiBpcyBicm9rZW4gZG93biB0byAyMCAqIDQ4IGJ5dGUgcmVnaW9ucyAob25lIGZvciBlYWNoIGNoYW5uZWwgcG9zc2libGUpCisgKiB3aXRoIHRoZSByZXN0IG9mIHRoZSBwYWdlIGJlaW5nIGR1bW15IGRhdGEuICovCisjZGVmaW5lIE1BWF9CVUZGRVIJCShHNzIzX1BFUklPRF9CWVRFUyAqIFBFUklPRFNfTUFYKQorI2RlZmluZSBJUlFfUEFHRVMJCTQgLyogMCAtIDQgKi8KKyNkZWZpbmUgUEVSSU9EU19NSU4JCSgxIDw8IElSUV9QQUdFUykKKyNkZWZpbmUgUEVSSU9EU19NQVgJCUc3MjNfRkRNQV9QQUdFUworCitzdHJ1Y3Qgc29sb19zbmRfcGNtIHsKKwlpbnQJCW9uOworCXNwaW5sb2NrX3QJbG9jazsKKwlzdHJ1Y3Qgc29sb19kZXYJKnNvbG9fZGV2OworCXVuc2lnbmVkIGNoYXIJZzcyM19idWZbRzcyM19QRVJJT0RfQllURVNdOworfTsKKworc3RhdGljIHZvaWQgc29sb19nNzIzX2NvbmZpZyhzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQoreworCWludCBjbGtfZGl2OworCisJY2xrX2RpdiA9IFNPTE9fQ0xPQ0tfTUhaIC8gKFNBTVBMRVJBVEUgKiAoQklUUkFURSAqIDIpICogMik7CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19BVURJT19TQU1QTEUsCisJCSAgICAgICBTT0xPX0FVRElPX0JJVFJBVEUoQklUUkFURSkgfAorCQkgICAgICAgU09MT19BVURJT19DTEtfRElWKGNsa19kaXYpKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0ZETUFfSU5UUiwKKwkJICAgICAgU09MT19BVURJT19GRE1BX0lOVEVSVkFMKElSUV9QQUdFUykgfAorCQkgICAgICBTT0xPX0FVRElPX0lOVFJfT1JERVIoRzcyM19JTlRSX09SREVSKSB8CisJCSAgICAgIFNPTE9fQVVESU9fRkRNQV9CQVNFKFNPTE9fRzcyM19FWFRfQUREUihzb2xvX2RldikgPj4gMTYpKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0NPTlRST0wsCisJCSAgICAgICBTT0xPX0FVRElPX0VOQUJMRSB8IFNPTE9fQVVESU9fSTJTX01PREUgfAorCQkgICAgICAgU09MT19BVURJT19JMlNfTVVMVEkoMykgfCBTT0xPX0FVRElPX01PREUoT1VUTU9ERV9NQVNLKSk7Cit9CisKK3ZvaWQgc29sb19nNzIzX2lzcihzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQoreworCXN0cnVjdCBzbmRfcGNtX3N0ciAqcHN0ciA9CisJCSZzb2xvX2Rldi0+c25kX3BjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3M7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY207CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19JUlFfU1RBVCwgU09MT19JUlFfRzcyMyk7CisKKwlmb3IgKHNzID0gcHN0ci0+c3Vic3RyZWFtOyBzcyAhPSBOVUxMOyBzcyA9IHNzLT5uZXh0KSB7CisJCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJLyogVGhpcyBtZWFucyBvcGVuKCkgaGFzbid0IGJlZW4gY2FsbGVkIG9uIHRoaXMgb25lICovCisJCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBzb2xvX2RldikKKwkJCWNvbnRpbnVlOworCisJCS8qIEhhdmVuJ3QgdHJpZ2dlcmVkIGEgc3RhcnQgeWV0ICovCisJCXNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisJCWlmICghc29sb19wY20tPm9uKQorCQkJY29udGludWU7CisKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzcyk7CisJfQorfQorCitzdGF0aWMgaW50IHNuZF9zb2xvX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzcywgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBzbmRfc29sb19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3MpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3NvbG9fcGNtX2h3ID0geworCS5pbmZvCQkJPSAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1U4LAorCS5yYXRlcwkJCT0gU05EUlZfUENNX1JBVEVfODAwMCwKKwkucmF0ZV9taW4JCT0gODAwMCwKKwkucmF0ZV9tYXgJCT0gODAwMCwKKwkuY2hhbm5lbHNfbWluCQk9IDEsCisJLmNoYW5uZWxzX21heAkJPSAxLAorCS5idWZmZXJfYnl0ZXNfbWF4CT0gTUFYX0JVRkZFUiwKKwkucGVyaW9kX2J5dGVzX21pbgk9IEc3MjNfUEVSSU9EX0JZVEVTLAorCS5wZXJpb2RfYnl0ZXNfbWF4CT0gRzcyM19QRVJJT0RfQllURVMsCisJLnBlcmlvZHNfbWluCQk9IFBFUklPRFNfTUlOLAorCS5wZXJpb2RzX21heAkJPSBQRVJJT0RTX01BWCwKK307CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKK3sKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY207CisKKwlzb2xvX3BjbSA9IGt6YWxsb2Moc2l6ZW9mKCpzb2xvX3BjbSksIEdGUF9LRVJORUwpOworCWlmIChzb2xvX3BjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZzb2xvX3BjbS0+bG9jayk7CisJc29sb19wY20tPnNvbG9fZGV2ID0gc29sb19kZXY7CisJc3MtPnJ1bnRpbWUtPmh3ID0gc25kX3NvbG9fcGNtX2h3OworCisJc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcykgPSBzb2xvX3BjbTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb2xvX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzKQoreworCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisKKwlzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9IHNvbG9fcGNtLT5zb2xvX2RldjsKKwlrZnJlZShzb2xvX3BjbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29sb19wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzLCBpbnQgY21kKQoreworCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisJc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldiA9IHNvbG9fcGNtLT5zb2xvX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmc29sb19wY20tPmxvY2spOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlpZiAoc29sb19wY20tPm9uID09IDApIHsKKwkJCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIsIHN3aXRjaCBvbiBpbnRlcnJ1cHRzICovCisJCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnNvbG9fZGV2LT5zbmRfdXNlcnMpID09IDEpCisJCQkJc29sb19pcnFfb24oc29sb19kZXYsIFNPTE9fSVJRX0c3MjMpOworCQkJc29sb19wY20tPm9uID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWlmIChzb2xvX3BjbS0+b24pIHsKKwkJCS8qIElmIHRoaXMgd2FzIG91ciBsYXN0IHVzZXIsIHN3aXRjaCB0aGVtIG9mZiAqLworCQkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZzb2xvX2Rldi0+c25kX3VzZXJzKSA9PSAwKQorCQkJCXNvbG9faXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRzcyMyk7CisJCQlzb2xvX3BjbS0+b24gPSAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJc3Bpbl91bmxvY2soJnNvbG9fcGNtLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9zb2xvX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc29sb19wY20tPnNvbG9fZGV2OworCXNuZF9wY21fdWZyYW1lc190IGlkeCA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fQVVESU9fU1RBKSAmIDB4MWY7CisKKwlyZXR1cm4gaWR4ICogRzcyM19GUkFNRVNfUEVSX1BBR0U7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcywgaW50IGNoYW5uZWwsCisJCQkgICAgIHNuZF9wY21fdWZyYW1lc190IHBvcywgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCSAgICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc29sb19wY20tPnNvbG9fZGV2OworCWludCBlcnIsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGNvdW50IC8gRzcyM19GUkFNRVNfUEVSX1BBR0UpOyBpKyspIHsKKwkJaW50IHBhZ2UgPSAocG9zIC8gRzcyM19GUkFNRVNfUEVSX1BBR0UpICsgaTsKKworCQllcnIgPSBzb2xvX3AybV9kbWEoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9HNzIzRSwgMCwKKwkJCQkgICBzb2xvX3BjbS0+ZzcyM19idWYsCisJCQkJICAgU09MT19HNzIzX0VYVF9BRERSKHNvbG9fZGV2KSArCisJCQkJICAgKHBhZ2UgKiBHNzIzX1BFUklPRF9CTE9DSykgKworCQkJCSAgIChzcy0+bnVtYmVyICogRzcyM19QRVJJT0RfQllURVMpLAorCQkJCSAgIEc3MjNfUEVSSU9EX0JZVEVTKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZXJyID0gY29weV90b191c2VyKGRzdCArIChpICogRzcyM19QRVJJT0RfQllURVMpLAorCQkJCSAgIHNvbG9fcGNtLT5nNzIzX2J1ZiwgRzcyM19QRVJJT0RfQllURVMpOworCisJCWlmIChlcnIpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfc29sb19wY21fb3BzID0geworCS5vcGVuID0gc25kX3NvbG9fcGNtX29wZW4sCisJLmNsb3NlID0gc25kX3NvbG9fcGNtX2Nsb3NlLAorCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPSBzbmRfc29sb19od19wYXJhbXMsCisJLmh3X2ZyZWUgPSBzbmRfc29sb19od19mcmVlLAorCS5wcmVwYXJlID0gc25kX3NvbG9fcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPSBzbmRfc29sb19wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9IHNuZF9zb2xvX3BjbV9wb2ludGVyLAorCS5jb3B5ID0gc25kX3NvbG9fcGNtX2NvcHksCit9OworCitzdGF0aWMgaW50IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKK3sKKwlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCWluZm8tPmNvdW50ID0gMTsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxNTsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLnN0ZXAgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXU4IGNoID0gdmFsdWUtPmlkLm51bWlkIC0gMTsKKworCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdHcyOF9nZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXU4IGNoID0gdmFsdWUtPmlkLm51bWlkIC0gMTsKKwl1OCBvbGRfdmFsOworCisJb2xkX3ZhbCA9IHR3MjhfZ2V0X2F1ZGlvX2dhaW4oc29sb19kZXYsIGNoKTsKKwlpZiAob2xkX3ZhbCA9PSB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwl0dzI4X3NldF9hdWRpb19nYWluKHNvbG9fZGV2LCBjaCwgdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJDYXB0dXJlIFZvbHVtZSIsCisJLmluZm8gPSBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZV9pbmZvLAorCS5nZXQgPSBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZV9nZXQsCisJLnB1dCA9IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX3B1dCwKK307CisKK3N0YXRpYyBpbnQgc29sb19zbmRfcGNtX2luaXQoc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBzb2xvX2Rldi0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzOworCWludCByZXQ7CisJaW50IGk7CisKKwlyZXQgPSBzbmRfcGNtX25ldyhjYXJkLCBjYXJkLT5kcml2ZXIsIDAsIDAsIHNvbG9fZGV2LT5ucl9jaGFucywKKwkJCSAgJnBjbSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCisJCQkmc25kX3NvbG9fcGNtX29wcyk7CisKKwlzbmRfcGNtX2NoaXAocGNtKSA9IHNvbG9fZGV2OworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KHBjbS0+bmFtZSwgY2FyZC0+c2hvcnRuYW1lKTsKKworCWZvciAoaSA9IDAsIHNzID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtOworCSAgICAgc3M7IHNzID0gc3MtPm5leHQsIGkrKykKKwkJc3ByaW50Zihzcy0+bmFtZSwgIkNhbWVyYSAjJWQgQXVkaW8iLCBpKTsKKworCXJldCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAorCQkJCQlTTkRSVl9ETUFfVFlQRV9DT05USU5VT1VTLAorCQkJCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKKwkJCQkJTUFYX0JVRkZFUiwgTUFYX0JVRkZFUik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzb2xvX2Rldi0+c25kX3BjbSA9IHBjbTsKKworCXJldHVybiAwOworfQorCitpbnQgc29sb19nNzIzX2luaXQoc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldikKK3sKKwlzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsgTlVMTCB9OworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBrY3RsOworCWNoYXIgbmFtZVszMl07CisJaW50IHJldDsKKworCWF0b21pY19zZXQoJnNvbG9fZGV2LT5zbmRfdXNlcnMsIDApOworCisJLyogQWxsb3dzIGZvciBlYXNpZXIgbWFwcGluZyBiZXR3ZWVuIHZpZGVvIGFuZCBhdWRpbyAqLworCXNwcmludGYobmFtZSwgIlNvZnRsb2dpYyVkIiwgc29sb19kZXYtPnZmZC0+bnVtKTsKKworCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIG5hbWUsIFRISVNfTU9EVUxFLCAwLAorCQkJICAgICAgJnNvbG9fZGV2LT5zbmRfY2FyZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwljYXJkID0gc29sb19kZXYtPnNuZF9jYXJkOworCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgU09MTzZYMTBfTkFNRSk7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlNPTE8tNngxMCBBdWRpbyIpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBvbiAlcyBJUlEgJWQiLCBjYXJkLT5zaG9ydG5hbWUsCisJCXBjaV9uYW1lKHNvbG9fZGV2LT5wZGV2KSwgc29sb19kZXYtPnBkZXYtPmlycSk7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmc29sb19kZXYtPnBkZXYtPmRldik7CisKKwlyZXQgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIHNvbG9fZGV2LCAmb3BzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBzbmRfZXJyb3I7CisKKwkvKiBNaXhlciBjb250cm9scyAqLworCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJTT0xPLTZ4MTAiKTsKKwlrY3RsID0gc25kX3NvbG9fY2FwdHVyZV92b2x1bWU7CisJa2N0bC5jb3VudCA9IHNvbG9fZGV2LT5ucl9jaGFuczsKKwlyZXQgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJmtjdGwsIHNvbG9fZGV2KSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzb2xvX3NuZF9wY21faW5pdChzb2xvX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc25kX2Vycm9yOworCisJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc25kX2Vycm9yOworCisJc29sb19nNzIzX2NvbmZpZyhzb2xvX2Rldik7CisKKwlkZXZfaW5mbygmc29sb19kZXYtPnBkZXYtPmRldiwgIkFsc2Egc291bmQgY2FyZCBhcyAlc1xuIiwgbmFtZSk7CisKKwlyZXR1cm4gMDsKKworc25kX2Vycm9yOgorCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzb2xvX2c3MjNfZXhpdChzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQoreworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0NPTlRST0wsIDApOworCXNvbG9faXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRzcyMyk7CisKKwlzbmRfY2FyZF9mcmVlKHNvbG9fZGV2LT5zbmRfY2FyZCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2dwaW8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL2dwaW8uYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2dwaW8uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL2kyYy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2kyYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvaTJjLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9pMmMuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL2pwZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9qcGVnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9qcGVnLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9qcGVnLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9vZmZzZXRzLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvb2Zmc2V0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvb2Zmc2V0cy5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvb2Zmc2V0cy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvb3NkLWZvbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9vc2QtZm9udC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvb3NkLWZvbnQuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL29zZC1mb250LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9wMm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9wMm0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3AybS5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvcDJtLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9yZWdpc3RlcnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9yZWdpc3RlcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3JlZ2lzdGVycy5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvcmVnaXN0ZXJzLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNngxMC5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNngxMC5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3R3MjguYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC90dzI4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC90dzI4LmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC90dzI4LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC90dzI4LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvdHcyOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvdHcyOC5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvdHcyOC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvdjRsMi1lbmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC92NGwyLWVuYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvdjRsMi1lbmMuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3Y0bDItZW5jLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC92NGwyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvdjRsMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvdjRsMi5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvdjRsMi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvaW5vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9pbm9kZS5jCmluZGV4IGYzYzYwNjAuLjdhMTk1NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9pbm9kZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9pbm9kZS5jCkBAIC0xMTk3LDcgKzExOTcsNyBAQAogdm9pZCBwb2htZWxmc19maWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZXRmc19pbm9kZV9pbmZvICppbmZvKQogewogCWlub2RlLT5pX21vZGUgPSBpbmZvLT5tb2RlOwotCWlub2RlLT5pX25saW5rID0gaW5mby0+bmxpbms7CisJc2V0X25saW5rKGlub2RlLCBpbmZvLT5ubGluayk7CiAJaW5vZGUtPmlfdWlkID0gaW5mby0+dWlkOwogCWlub2RlLT5pX2dpZCA9IGluZm8tPmdpZDsKIAlpbm9kZS0+aV9ibG9ja3MgPSBpbmZvLT5ibG9ja3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuYwppbmRleCAzYjMyZjllLi44N2M5Y2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9zY3NpLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9nNzIzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvZzcyMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI3NGJmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9nNzIzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSAic29sbzZ4MTAuaCIKLSNpbmNsdWRlICJ0dzI4LmgiCi0KLSNkZWZpbmUgRzcyM19JTlRSX09SREVSCQkwCi0jZGVmaW5lIEc3MjNfRkRNQV9QQUdFUwkJMzIKLSNkZWZpbmUgRzcyM19QRVJJT0RfQllURVMJNDgKLSNkZWZpbmUgRzcyM19QRVJJT0RfQkxPQ0sJMTAyNAotI2RlZmluZSBHNzIzX0ZSQU1FU19QRVJfUEFHRQk0OAotCi0vKiBTZXRzIHVwIGNoYW5uZWxzIDE2LTE5IGZvciBkZWNvZGluZyBhbmQgMC0xNSBmb3IgZW5jb2RpbmcgKi8KLSNkZWZpbmUgT1VUTU9ERV9NQVNLCQkweDMwMAotCi0jZGVmaW5lIFNBTVBMRVJBVEUJCTgwMDAKLSNkZWZpbmUgQklUUkFURQkJCTI1Ci0KLS8qIFRoZSBzb2xvIHdyaXRlcyB0byAxayBieXRlIHBhZ2VzLCAzMiBwYWdlcywgaW4gdGhlIGRtYS4gRWFjaCAxayBwYWdlCi0gKiBpcyBicm9rZW4gZG93biB0byAyMCAqIDQ4IGJ5dGUgcmVnaW9ucyAob25lIGZvciBlYWNoIGNoYW5uZWwgcG9zc2libGUpCi0gKiB3aXRoIHRoZSByZXN0IG9mIHRoZSBwYWdlIGJlaW5nIGR1bW15IGRhdGEuICovCi0jZGVmaW5lIE1BWF9CVUZGRVIJCShHNzIzX1BFUklPRF9CWVRFUyAqIFBFUklPRFNfTUFYKQotI2RlZmluZSBJUlFfUEFHRVMJCTQgLyogMCAtIDQgKi8KLSNkZWZpbmUgUEVSSU9EU19NSU4JCSgxIDw8IElSUV9QQUdFUykKLSNkZWZpbmUgUEVSSU9EU19NQVgJCUc3MjNfRkRNQV9QQUdFUwotCi1zdHJ1Y3Qgc29sb19zbmRfcGNtIHsKLQlpbnQJCW9uOwotCXNwaW5sb2NrX3QJbG9jazsKLQlzdHJ1Y3Qgc29sb19kZXYJKnNvbG9fZGV2OwotCXVuc2lnbmVkIGNoYXIJZzcyM19idWZbRzcyM19QRVJJT0RfQllURVNdOwotfTsKLQotc3RhdGljIHZvaWQgc29sb19nNzIzX2NvbmZpZyhzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQotewotCWludCBjbGtfZGl2OwotCi0JY2xrX2RpdiA9IFNPTE9fQ0xPQ0tfTUhaIC8gKFNBTVBMRVJBVEUgKiAoQklUUkFURSAqIDIpICogMik7Ci0KLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19BVURJT19TQU1QTEUsCi0JCSAgICAgICBTT0xPX0FVRElPX0JJVFJBVEUoQklUUkFURSkgfAotCQkgICAgICAgU09MT19BVURJT19DTEtfRElWKGNsa19kaXYpKTsKLQotCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0ZETUFfSU5UUiwKLQkJICAgICAgU09MT19BVURJT19GRE1BX0lOVEVSVkFMKElSUV9QQUdFUykgfAotCQkgICAgICBTT0xPX0FVRElPX0lOVFJfT1JERVIoRzcyM19JTlRSX09SREVSKSB8Ci0JCSAgICAgIFNPTE9fQVVESU9fRkRNQV9CQVNFKFNPTE9fRzcyM19FWFRfQUREUihzb2xvX2RldikgPj4gMTYpKTsKLQotCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0NPTlRST0wsCi0JCSAgICAgICBTT0xPX0FVRElPX0VOQUJMRSB8IFNPTE9fQVVESU9fSTJTX01PREUgfAotCQkgICAgICAgU09MT19BVURJT19JMlNfTVVMVEkoMykgfCBTT0xPX0FVRElPX01PREUoT1VUTU9ERV9NQVNLKSk7Ci19Ci0KLXZvaWQgc29sb19nNzIzX2lzcihzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQotewotCXN0cnVjdCBzbmRfcGNtX3N0ciAqcHN0ciA9Ci0JCSZzb2xvX2Rldi0+c25kX3BjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3M7Ci0Jc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY207Ci0KLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19JUlFfU1RBVCwgU09MT19JUlFfRzcyMyk7Ci0KLQlmb3IgKHNzID0gcHN0ci0+c3Vic3RyZWFtOyBzcyAhPSBOVUxMOyBzcyA9IHNzLT5uZXh0KSB7Ci0JCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJLyogVGhpcyBtZWFucyBvcGVuKCkgaGFzbid0IGJlZW4gY2FsbGVkIG9uIHRoaXMgb25lICovCi0JCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBzb2xvX2RldikKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEhhdmVuJ3QgdHJpZ2dlcmVkIGEgc3RhcnQgeWV0ICovCi0JCXNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7Ci0JCWlmICghc29sb19wY20tPm9uKQotCQkJY29udGludWU7Ci0KLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzcyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHNuZF9zb2xvX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzLAotCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCi17Ci0JcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzcywgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKLX0KLQotc3RhdGljIGludCBzbmRfc29sb19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCi17Ci0JcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3MpOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3NvbG9fcGNtX2h3ID0gewotCS5pbmZvCQkJPSAoU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCSAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKLQkJCQkgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKLQkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1U4LAotCS5yYXRlcwkJCT0gU05EUlZfUENNX1JBVEVfODAwMCwKLQkucmF0ZV9taW4JCT0gODAwMCwKLQkucmF0ZV9tYXgJCT0gODAwMCwKLQkuY2hhbm5lbHNfbWluCQk9IDEsCi0JLmNoYW5uZWxzX21heAkJPSAxLAotCS5idWZmZXJfYnl0ZXNfbWF4CT0gTUFYX0JVRkZFUiwKLQkucGVyaW9kX2J5dGVzX21pbgk9IEc3MjNfUEVSSU9EX0JZVEVTLAotCS5wZXJpb2RfYnl0ZXNfbWF4CT0gRzcyM19QRVJJT0RfQllURVMsCi0JLnBlcmlvZHNfbWluCQk9IFBFUklPRFNfTUlOLAotCS5wZXJpb2RzX21heAkJPSBQRVJJT0RTX01BWCwKLX07Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKLXsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7Ci0Jc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY207Ci0KLQlzb2xvX3BjbSA9IGt6YWxsb2Moc2l6ZW9mKCpzb2xvX3BjbSksIEdGUF9LRVJORUwpOwotCWlmIChzb2xvX3BjbSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19pbml0KCZzb2xvX3BjbS0+bG9jayk7Ci0Jc29sb19wY20tPnNvbG9fZGV2ID0gc29sb19kZXY7Ci0Jc3MtPnJ1bnRpbWUtPmh3ID0gc25kX3NvbG9fcGNtX2h3OwotCi0Jc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcykgPSBzb2xvX3BjbTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9zb2xvX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzKQotewotCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7Ci0KLQlzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9IHNvbG9fcGNtLT5zb2xvX2RldjsKLQlrZnJlZShzb2xvX3BjbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfc29sb19wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzLCBpbnQgY21kKQotewotCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7Ci0Jc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldiA9IHNvbG9fcGNtLT5zb2xvX2RldjsKLQlpbnQgcmV0ID0gMDsKLQotCXNwaW5fbG9jaygmc29sb19wY20tPmxvY2spOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlpZiAoc29sb19wY20tPm9uID09IDApIHsKLQkJCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIsIHN3aXRjaCBvbiBpbnRlcnJ1cHRzICovCi0JCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnNvbG9fZGV2LT5zbmRfdXNlcnMpID09IDEpCi0JCQkJc29sb19pcnFfb24oc29sb19kZXYsIFNPTE9fSVJRX0c3MjMpOwotCQkJc29sb19wY20tPm9uID0gMTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCWlmIChzb2xvX3BjbS0+b24pIHsKLQkJCS8qIElmIHRoaXMgd2FzIG91ciBsYXN0IHVzZXIsIHN3aXRjaCB0aGVtIG9mZiAqLwotCQkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZzb2xvX2Rldi0+c25kX3VzZXJzKSA9PSAwKQotCQkJCXNvbG9faXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRzcyMyk7Ci0JCQlzb2xvX3BjbS0+b24gPSAwOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0Jc3Bpbl91bmxvY2soJnNvbG9fcGNtLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9zb2xvX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCi17Ci0Jc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc29sb19wY20tPnNvbG9fZGV2OwotCXNuZF9wY21fdWZyYW1lc190IGlkeCA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fQVVESU9fU1RBKSAmIDB4MWY7Ci0KLQlyZXR1cm4gaWR4ICogRzcyM19GUkFNRVNfUEVSX1BBR0U7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcywgaW50IGNoYW5uZWwsCi0JCQkgICAgIHNuZF9wY21fdWZyYW1lc190IHBvcywgdm9pZCBfX3VzZXIgKmRzdCwKLQkJCSAgICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCi17Ci0Jc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc29sb19wY20tPnNvbG9fZGV2OwotCWludCBlcnIsIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKGNvdW50IC8gRzcyM19GUkFNRVNfUEVSX1BBR0UpOyBpKyspIHsKLQkJaW50IHBhZ2UgPSAocG9zIC8gRzcyM19GUkFNRVNfUEVSX1BBR0UpICsgaTsKLQotCQllcnIgPSBzb2xvX3AybV9kbWEoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9HNzIzRSwgMCwKLQkJCQkgICBzb2xvX3BjbS0+ZzcyM19idWYsCi0JCQkJICAgU09MT19HNzIzX0VYVF9BRERSKHNvbG9fZGV2KSArCi0JCQkJICAgKHBhZ2UgKiBHNzIzX1BFUklPRF9CTE9DSykgKwotCQkJCSAgIChzcy0+bnVtYmVyICogRzcyM19QRVJJT0RfQllURVMpLAotCQkJCSAgIEc3MjNfUEVSSU9EX0JZVEVTKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJZXJyID0gY29weV90b191c2VyKGRzdCArIChpICogRzcyM19QRVJJT0RfQllURVMpLAotCQkJCSAgIHNvbG9fcGNtLT5nNzIzX2J1ZiwgRzcyM19QRVJJT0RfQllURVMpOwotCi0JCWlmIChlcnIpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfc29sb19wY21fb3BzID0gewotCS5vcGVuID0gc25kX3NvbG9fcGNtX29wZW4sCi0JLmNsb3NlID0gc25kX3NvbG9fcGNtX2Nsb3NlLAotCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAotCS5od19wYXJhbXMgPSBzbmRfc29sb19od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSBzbmRfc29sb19od19mcmVlLAotCS5wcmVwYXJlID0gc25kX3NvbG9fcGNtX3ByZXBhcmUsCi0JLnRyaWdnZXIgPSBzbmRfc29sb19wY21fdHJpZ2dlciwKLQkucG9pbnRlciA9IHNuZF9zb2xvX3BjbV9wb2ludGVyLAotCS5jb3B5ID0gc25kX3NvbG9fcGNtX2NvcHksCi19OwotCi1zdGF0aWMgaW50IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKLXsKLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwotCWluZm8tPmNvdW50ID0gMTsKLQlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxNTsKLQlpbmZvLT52YWx1ZS5pbnRlZ2VyLnN0ZXAgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXU4IGNoID0gdmFsdWUtPmlkLm51bWlkIC0gMTsKLQotCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdHcyOF9nZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXU4IGNoID0gdmFsdWUtPmlkLm51bWlkIC0gMTsKLQl1OCBvbGRfdmFsOwotCi0Jb2xkX3ZhbCA9IHR3MjhfZ2V0X2F1ZGlvX2dhaW4oc29sb19kZXYsIGNoKTsKLQlpZiAob2xkX3ZhbCA9PSB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKLQkJcmV0dXJuIDA7Ci0KLQl0dzI4X3NldF9hdWRpb19nYWluKHNvbG9fZGV2LCBjaCwgdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZSA9IHsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9ICJDYXB0dXJlIFZvbHVtZSIsCi0JLmluZm8gPSBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZV9pbmZvLAotCS5nZXQgPSBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZV9nZXQsCi0JLnB1dCA9IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX3B1dCwKLX07Ci0KLXN0YXRpYyBpbnQgc29sb19zbmRfcGNtX2luaXQoc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldikKLXsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBzb2xvX2Rldi0+c25kX2NhcmQ7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzOwotCWludCByZXQ7Ci0JaW50IGk7Ci0KLQlyZXQgPSBzbmRfcGNtX25ldyhjYXJkLCBjYXJkLT5kcml2ZXIsIDAsIDAsIHNvbG9fZGV2LT5ucl9jaGFucywKLQkJCSAgJnBjbSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCi0JCQkmc25kX3NvbG9fcGNtX29wcyk7Ci0KLQlzbmRfcGNtX2NoaXAocGNtKSA9IHNvbG9fZGV2OwotCXBjbS0+aW5mb19mbGFncyA9IDA7Ci0Jc3RyY3B5KHBjbS0+bmFtZSwgY2FyZC0+c2hvcnRuYW1lKTsKLQotCWZvciAoaSA9IDAsIHNzID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtOwotCSAgICAgc3M7IHNzID0gc3MtPm5leHQsIGkrKykKLQkJc3ByaW50Zihzcy0+bmFtZSwgIkNhbWVyYSAjJWQgQXVkaW8iLCBpKTsKLQotCXJldCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAotCQkJCQlTTkRSVl9ETUFfVFlQRV9DT05USU5VT1VTLAotCQkJCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKLQkJCQkJTUFYX0JVRkZFUiwgTUFYX0JVRkZFUik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzb2xvX2Rldi0+c25kX3BjbSA9IHBjbTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgc29sb19nNzIzX2luaXQoc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldikKLXsKLQlzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsgTlVMTCB9OwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBrY3RsOwotCWNoYXIgbmFtZVszMl07Ci0JaW50IHJldDsKLQotCWF0b21pY19zZXQoJnNvbG9fZGV2LT5zbmRfdXNlcnMsIDApOwotCi0JLyogQWxsb3dzIGZvciBlYXNpZXIgbWFwcGluZyBiZXR3ZWVuIHZpZGVvIGFuZCBhdWRpbyAqLwotCXNwcmludGYobmFtZSwgIlNvZnRsb2dpYyVkIiwgc29sb19kZXYtPnZmZC0+bnVtKTsKLQotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIG5hbWUsIFRISVNfTU9EVUxFLCAwLAotCQkJICAgICAgJnNvbG9fZGV2LT5zbmRfY2FyZCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQljYXJkID0gc29sb19kZXYtPnNuZF9jYXJkOwotCi0Jc3RyY3B5KGNhcmQtPmRyaXZlciwgU09MTzZYMTBfTkFNRSk7Ci0Jc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlNPTE8tNngxMCBBdWRpbyIpOwotCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBvbiAlcyBJUlEgJWQiLCBjYXJkLT5zaG9ydG5hbWUsCi0JCXBjaV9uYW1lKHNvbG9fZGV2LT5wZGV2KSwgc29sb19kZXYtPnBkZXYtPmlycSk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmc29sb19kZXYtPnBkZXYtPmRldik7Ci0KLQlyZXQgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIHNvbG9fZGV2LCAmb3BzKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBzbmRfZXJyb3I7Ci0KLQkvKiBNaXhlciBjb250cm9scyAqLwotCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJTT0xPLTZ4MTAiKTsKLQlrY3RsID0gc25kX3NvbG9fY2FwdHVyZV92b2x1bWU7Ci0Ja2N0bC5jb3VudCA9IHNvbG9fZGV2LT5ucl9jaGFuczsKLQlyZXQgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJmtjdGwsIHNvbG9fZGV2KSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzb2xvX3NuZF9wY21faW5pdChzb2xvX2Rldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gc25kX2Vycm9yOwotCi0JcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gc25kX2Vycm9yOwotCi0Jc29sb19nNzIzX2NvbmZpZyhzb2xvX2Rldik7Ci0KLQlkZXZfaW5mbygmc29sb19kZXYtPnBkZXYtPmRldiwgIkFsc2Egc291bmQgY2FyZCBhcyAlc1xuIiwgbmFtZSk7Ci0KLQlyZXR1cm4gMDsKLQotc25kX2Vycm9yOgotCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBzb2xvX2c3MjNfZXhpdChzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQotewotCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0NPTlRST0wsIDApOwotCXNvbG9faXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRzcyMyk7Ci0KLQlzbmRfY2FyZF9mcmVlKHNvbG9fZGV2LT5zbmRfY2FyZCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbXRkLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbXRkLmMKaW5kZXggMmJkMzQ2Ni4uYTljMzA5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX210ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9tdGQuYwpAQCAtMzQwLDcgKzM0MCw3IEBACiAJCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJCWludCByZXQ7CiAKLQkJb3BzLm1vZGUgPSBNVERfT09CX0FVVE87CisJCW9wcy5tb2RlID0gTVREX09QU19BVVRPX09PQjsKIAkJb3BzLmRhdGJ1ZiA9IHJlYWRfZGF0YTsKIAkJb3BzLmxlbiA9IERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKIAkJb3BzLm9vYmJ1ZiA9IHJlYWRfZGF0YSArIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSArIEJUU0lHX09GRlNFVDsKQEAgLTQwMCw3ICs0MDAsNyBAQAogCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCQlpbnQgcmV0OwogCi0JCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSA9IE1URF9PUFNfQVVUT19PT0I7CiAJCW9wcy5kYXRidWYgPSB3cml0ZV9kYXRhOwogCQlvcHMubGVuID0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplOwogCQlvcHMub29iYnVmID0gd3JpdGVfZGF0YSArIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSArIEJUU0lHX09GRlNFVDsKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCQlpbnQgcmV0OwogCi0JCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSA9IE1URF9PUFNfQVVUT19PT0I7CiAJCW9wcy5kYXRidWYgPSBOVUxMOwogCQlvcHMubGVuID0gMDsKIAkJb3BzLm9vYmJ1ZiA9IHJlYWRfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDBlYmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1Ub2RvOgotCS0gRml4IHRoZSBsb3NzIG9mIHNvbWUgYmxvY2tzIHdoZW4gcmVjZWl2aW5nIHRoZSB2aWRlbyBVUkIncwotCS0gQWRkIGEgbG9jayBhdCB0bTYwMDBfcmVhZF93cml0ZV91c2IoKSB0byBwcmV2ZW50IHR3byBzaW11bHRhbmVvdXMgYWNjZXNzIHRvIHRoZQotCSAgVVJCIGNvbnRyb2wgdHJhbnNmZXJzCi0JLSBQcm9wZXJseSBhZGQgdGhlIGxvY2tzIGF0IHRtNjAwMC12aWRlbwotCS0gQWRkIGF1ZGlvIHN1cHBvcnQKLQktIEFkZCB2Ymkgc3VwcG9ydAotCS0gQWRkIElSIHN1cHBvcnQKLQktIERvIHNldmVyYWwgY2xlYW51cHMKLQktIEkgdGhpbmsgdGhhdCBmcmFtZTEvZnJhbWUwIGFyZSBpbnZlcnRlZC4gVGhpcyBjYXVzZXMgYSBmdW5ueSBlZmZlY3QgYXQgdGhlIGltYWdlLgotCSAgdGhlIGZpeCBpcyB0cml2aWFsLCBidXQgcmVxdWlyZSBzb21lIHRlc3RzCi0JLSBNeSB0bTYwMTAgZGV2aWNlcyBzb21ldGltZXMgaW5zaXN0IG9uIHN0b3Agd29ya2luZy4gSSBuZWVkIHRvIHR1cm4gdGhlbSBvZmYsIHJlbW92aW5nCi0JICBmcm9tIG15IG1hY2hpbmUgYW5kIHdhaXQgZm9yIGEgd2hpbGUgZm9yIGl0IHRvIHdvcmsgYWdhaW4uIEknbSBzdGFydGluZyB0byB0aGluayB0aGF0Ci0JICBpdCBpcyBhbiBvdmVyaGVhdCBpc3N1ZSAtIGlzIHRoZXJlIGEgd29ya2Fyb3VuZCB0aGF0IHdlIGNvdWxkIGRvPwotCS0gU29tZXRpbWVzLCB0bTYwMTAgZG9lc24ndCByZWFkIGVlcHJvbSBhdCB0aGUgcHJvcGVyIHRpbWUgKGhhcmR3YXJlIGJ1ZykuIFNvLCB0aGUgZGV2aWNlCi0JICBnb3QgbWlzcy1kZXRlY3RlZCBhcyBhICJnZW5lcmljIiB0bTYwMDAuIFRoaXMgY2FuIGJlIHJlYWxseSBiYWQgaWYgdGhlIHR1bmVyIGlzIHRoZQotCSAgTG93IFBvd2VyIG9uZSwgYXMgaXQgbWF5IHJlc3VsdCBvbiBsb2FkaW5nIHRoZSBoaWdoIHBvd2VyIGZpcm13YXJlLCB0aGF0IGNvdWxkIGRhbWFnZQotCSAgdGhlIGRldmljZS4gTWF5YmUgd2UgbWF5IHJlYWQgZWVwcm9tIHRvIGRvdWJsZSBjaGVjaywgd2hlbiB0aGUgZGV2aWNlIGlzIG1hcmtlZCBhcyAiZ2VuZXJpYyIKLQktIENvZGluZyBTdHlsZSBmaXhlcwotCS0gc3BhcnNlIGNsZWFudXBzCi0KLVBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNWQwZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1UaGVyZSBhIGZldyB0aGluZ3MgdG8gZG8gYmVmb3JlIHB1dHRpbmcgdGhpcyBkcml2ZXIgaW4gcHJvZHVjdGlvbjoKLQktIElSIE5FQyB3aXRoIHRtNTYwMC82MDAwIFRWIGNhcmRzCi0JLSBJUiBSQzUgd2l0aCB0bTU2MDAvNjAwMC82MDEwIFRWIGNhcmRzCi0JLSBDb2RpbmdTdHlsZTsKLQktIEZpeCBhdWRpbzsKLQktIEZpeCBzb21lIHBhbmljL09PUFMgY29uZGl0aW9ucy4KLQotUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWFsc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWFsc2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZmE4OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1hbHNhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoKLSAqCi0gKiAgU3VwcG9ydCBmb3IgYXVkaW8gY2FwdHVyZSBmb3IgdG01NjAwLzYwMDAvNjAxMAotICogICAgKGMpIDIwMDctMjAwOCBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KLSAqCi0gKiAgQmFzZWQgb24gY3g4OC1hbHNhLmMKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgotCi0KLSNpbmNsdWRlICJ0bTYwMDAuaCIKLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotCi0jdW5kZWYgZHByaW50awotCi0jZGVmaW5lIGRwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKSBkbyB7CQkJCSAgIFwKLQlpZiAoZGVidWcgPj0gbGV2ZWwpCQkJCQkJICAgXAotCQlwcmludGsoS0VSTl9JTkZPICIlcy8xOiAiIGZtdCwgY2hpcC0+Y29yZS0+bmFtZSAsICMjIGFyZyk7IFwKLQl9IHdoaWxlICgwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkJTW9kdWxlIGdsb2JhbCBzdGF0aWMgdmFycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCi0KLXN0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IHsxLCBbMSAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMX07Ci0KLW1vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgdG02MDAweCBzb3VuZGNhcmQuIGRlZmF1bHQgZW5hYmxlZC4iKTsKLQotbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciB0bTYwMDB4IGNhcHR1cmUgaW50ZXJmYWNlKHMpLiIpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQkJTW9kdWxlIG1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLU1PRFVMRV9ERVNDUklQVElPTigiQUxTQSBkcml2ZXIgbW9kdWxlIGZvciB0bTU2MDAvdG02MDAwL3RtNjAxMCBiYXNlZCBUViBjYXJkcyIpOwotTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tUcmlkZW50LHRtNTYwMH0sIgotCQkJInt7VHJpZGVudCx0bTYwMDB9LCIKLQkJCSJ7e1RyaWRlbnQsdG02MDEwfSIpOwotc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCU1vZHVsZSBzcGVjaWZpYyBmdW50aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBCT0FSRCBTcGVjaWZpYzogU2V0cyBhdWRpbyBETUEKLSAqLwotCi1zdGF0aWMgaW50IF90bTYwMDBfc3RhcnRfYXVkaW9fZG1hKHN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXApCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpjb3JlID0gY2hpcC0+Y29yZTsKLQotCWRwcmludGsoMSwgIlN0YXJ0aW5nIGF1ZGlvIERNQVxuIik7Ci0KLQkvKiBFbmFibGVzIGF1ZGlvICovCi0JdG02MDAwX3NldF9yZWdfbWFzayhjb3JlLCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9WSURFT19JRiwgMHg0MCwgMHg0MCk7Ci0KLQl0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoY29yZSwgNDgwMDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBCT0FSRCBTcGVjaWZpYzogUmVzZXRzIGF1ZGlvIERNQQotICovCi1zdGF0aWMgaW50IF90bTYwMDBfc3RvcF9hdWRpb19kbWEoc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUgPSBjaGlwLT5jb3JlOwotCi0JZHByaW50aygxLCAiU3RvcHBpbmcgYXVkaW8gRE1BXG4iKTsKLQotCS8qIERpc2FibGVzIGF1ZGlvICovCi0JdG02MDAwX3NldF9yZWdfbWFzayhjb3JlLCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9WSURFT19JRiwgMHgwMCwgMHg0MCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZHNwX2J1ZmZlcl9mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0KLQlkcHJpbnRrKDIsICJGcmVlaW5nIGJ1ZmZlclxuIik7Ci0KLQl2ZnJlZShzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKTsKLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9ieXRlcyA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHNwX2J1ZmZlcl9hbGxvYyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IHNpemUpCi17Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQotCWRwcmludGsoMiwgIkFsbG9jYXRpbmcgYnVmZmVyXG4iKTsKLQotCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKSB7Ci0JCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9ieXRlcyA+IHNpemUpCi0JCQlyZXR1cm4gMDsKLQotCQlkc3BfYnVmZmVyX2ZyZWUoc3Vic3RyZWFtKTsKLQl9Ci0KLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gdm1hbGxvYyhzaXplKTsKLQlpZiAoIXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPSBzaXplOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCQlBTFNBIFBDTSBJbnRlcmZhY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogRGlnaXRhbCBoYXJkd2FyZSBkZWZpbml0aW9uCi0gKi8KLSNkZWZpbmUgREVGQVVMVF9GSUZPX1NJWkUJNDA5NgotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3RtNjAwMF9kaWdpdGFsX2h3ID0gewotCS5pbmZvID0gU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElELAotCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0KLQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAotCS5yYXRlX21pbiA9IDQ4MDAwLAotCS5yYXRlX21heCA9IDQ4MDAwLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS5wZXJpb2RfYnl0ZXNfbWluID0gNjQsCi0JLnBlcmlvZF9ieXRlc19tYXggPSAxMjU0NCwKLQkucGVyaW9kc19taW4gPSAxLAotCS5wZXJpb2RzX21heCA9IDk4LAotCS5idWZmZXJfYnl0ZXNfbWF4ID0gNjI3MjAgKiA4LAotfTsKLQotLyoKLSAqIGF1ZGlvIHBjbSBjYXB0dXJlIG9wZW4gY2FsbGJhY2sKLSAqLwotc3RhdGljIGludCBzbmRfdG02MDAwX3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlpbnQgZXJyOwotCi0JZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X3BvdzIocnVudGltZSwgMCwKLQkJCQkJIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBfZXJyb3I7Ci0KLQljaGlwLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0KLQlydW50aW1lLT5odyA9IHNuZF90bTYwMDBfZGlnaXRhbF9odzsKLQotCXJldHVybiAwOwotX2Vycm9yOgotCWRwcmludGsoMSwgIkVycm9yIG9wZW5pbmcgUENNIVxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIGF1ZGlvIGNsb3NlIGNhbGxiYWNrCi0gKi8KLXN0YXRpYyBpbnQgc25kX3RtNjAwMF9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNoaXAtPmNvcmU7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmNvcmUtPnN0cmVhbV9zdGFydGVkKSA+IDApIHsKLQkJYXRvbWljX3NldCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQsIDApOwotCQlzY2hlZHVsZV93b3JrKCZjb3JlLT53cV90cmlnZ2VyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0bTYwMDBfZmlsbGJ1ZihzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCi17Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IGNvcmUtPmFkZXY7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBjaGlwLT5zdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKLQlpbnQgcGVyaW9kX2VsYXBzZWQgPSAwOwotCXVuc2lnbmVkIGludCBzdHJpZGUsIGJ1Zl9wb3M7Ci0JaW50IGxlbmd0aDsKLQotCWlmIChhdG9taWNfcmVhZCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQpID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKCFzaXplIHx8ICFzdWJzdHJlYW0pIHsKLQkJZHByaW50aygxLCAic3Vic3RyZWFtIHdhcyBOVUxMXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlpZiAoIXJ1bnRpbWUgfHwgIXJ1bnRpbWUtPmRtYV9hcmVhKSB7Ci0JCWRwcmludGsoMSwgInJ1bnRpbWUgd2FzIE5VTExcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlidWZfcG9zID0gY2hpcC0+YnVmX3BvczsKLQlzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7Ci0KLQlpZiAoc3RyaWRlID09IDApIHsKLQkJZHByaW50aygxLCAic3RyaWRlIGlzIHplcm9cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlsZW5ndGggPSBzaXplIC8gc3RyaWRlOwotCWlmIChsZW5ndGggPT0gMCkgewotCQlkcHJpbnRrKDEsICIlczogbGVuZ3RoIHdhcyB6ZXJvXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRwcmludGsoMSwgIkNvcHlpbmcgJWQgYnl0ZXMgYXQgJXBbJWRdIC0gYnVmIHNpemU9JWQgeCAlZFxuIiwgc2l6ZSwKLQkJcnVudGltZS0+ZG1hX2FyZWEsIGJ1Zl9wb3MsCi0JCSh1bnNpZ25lZCBpbnQpcnVudGltZS0+YnVmZmVyX3NpemUsIHN0cmlkZSk7Ci0KLQlpZiAoYnVmX3BvcyArIGxlbmd0aCA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkgewotCQl1bnNpZ25lZCBpbnQgY250ID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBidWZfcG9zOwotCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyBidWZfcG9zICogc3RyaWRlLCBidWYsIGNudCAqIHN0cmlkZSk7Ci0JCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgYnVmICsgY250ICogc3RyaWRlLAotCQkJbGVuZ3RoICogc3RyaWRlIC0gY250ICogc3RyaWRlKTsKLQl9IGVsc2UKLQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgYnVmX3BvcyAqIHN0cmlkZSwgYnVmLAotCQkJbGVuZ3RoICogc3RyaWRlKTsKLQotCXNuZF9wY21fc3RyZWFtX2xvY2soc3Vic3RyZWFtKTsKLQotCWNoaXAtPmJ1Zl9wb3MgKz0gbGVuZ3RoOwotCWlmIChjaGlwLT5idWZfcG9zID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQotCQljaGlwLT5idWZfcG9zIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwotCi0JY2hpcC0+cGVyaW9kX3BvcyArPSBsZW5ndGg7Ci0JaWYgKGNoaXAtPnBlcmlvZF9wb3MgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKLQkJY2hpcC0+cGVyaW9kX3BvcyAtPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKLQkJcGVyaW9kX2VsYXBzZWQgPSAxOwotCX0KLQotCXNuZF9wY21fc3RyZWFtX3VubG9jayhzdWJzdHJlYW0pOwotCi0JaWYgKHBlcmlvZF9lbGFwc2VkKQotCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGh3X3BhcmFtcyBjYWxsYmFjawotICovCi1zdGF0aWMgaW50IHNuZF90bTYwMDBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCi17Ci0JaW50IHNpemUsIHJjOwotCi0Jc2l6ZSA9IHBhcmFtc19wZXJpb2RfYnl0ZXMoaHdfcGFyYW1zKSAqIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyk7Ci0KLQlyYyA9IGRzcF9idWZmZXJfYWxsb2Moc3Vic3RyZWFtLCBzaXplKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGh3IGZyZWUgY2FsbGJhY2sKLSAqLwotc3RhdGljIGludCBzbmRfdG02MDAwX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUgPSBjaGlwLT5jb3JlOwotCi0JaWYgKGF0b21pY19yZWFkKCZjb3JlLT5zdHJlYW1fc3RhcnRlZCkgPiAwKSB7Ci0JCWF0b21pY19zZXQoJmNvcmUtPnN0cmVhbV9zdGFydGVkLCAwKTsKLQkJc2NoZWR1bGVfd29yaygmY29yZS0+d3FfdHJpZ2dlcik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBwcmVwYXJlIGNhbGxiYWNrCi0gKi8KLXN0YXRpYyBpbnQgc25kX3RtNjAwMF9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0KLQljaGlwLT5idWZfcG9zID0gMDsKLQljaGlwLT5wZXJpb2RfcG9zID0gMDsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiB0cmlnZ2VyIGNhbGxiYWNrCi0gKi8KLXN0YXRpYyB2b2lkIGF1ZGlvX3RyaWdnZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdG02MDAwX2NvcmUsCi0JCQkJCQl3cV90cmlnZ2VyKTsKLQlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gY29yZS0+YWRldjsKLQotCWlmIChhdG9taWNfcmVhZCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQpKSB7Ci0JCWRwcmludGsoMSwgInN0YXJ0aW5nIGNhcHR1cmUiKTsKLQkJX3RtNjAwMF9zdGFydF9hdWRpb19kbWEoY2hpcCk7Ci0JfSBlbHNlIHsKLQkJZHByaW50aygxLCAic3RvcHBpbmcgY2FwdHVyZSIpOwotCQlfdG02MDAwX3N0b3BfYXVkaW9fZG1hKGNoaXApOwotCX0KLX0KLQotc3RhdGljIGludCBzbmRfdG02MDAwX2NhcmRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKLXsKLQlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNoaXAtPmNvcmU7Ci0JaW50IGVyciA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JCWF0b21pY19zZXQoJmNvcmUtPnN0cmVhbV9zdGFydGVkLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlhdG9taWNfc2V0KCZjb3JlLT5zdHJlYW1fc3RhcnRlZCwgMCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlzY2hlZHVsZV93b3JrKCZjb3JlLT53cV90cmlnZ2VyKTsKLQotCXJldHVybiBlcnI7Ci19Ci0vKgotICogcG9pbnRlciBjYWxsYmFjawotICovCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3RtNjAwMF9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0KLQlyZXR1cm4gY2hpcC0+YnVmX3BvczsKLX0KLQotLyoKLSAqIG9wZXJhdG9ycwotICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90bTYwMDBfcGNtX29wcyA9IHsKLQkub3BlbiA9IHNuZF90bTYwMDBfcGNtX29wZW4sCi0JLmNsb3NlID0gc25kX3RtNjAwMF9jbG9zZSwKLQkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKLQkuaHdfcGFyYW1zID0gc25kX3RtNjAwMF9od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSBzbmRfdG02MDAwX2h3X2ZyZWUsCi0JLnByZXBhcmUgPSBzbmRfdG02MDAwX3ByZXBhcmUsCi0JLnRyaWdnZXIgPSBzbmRfdG02MDAwX2NhcmRfdHJpZ2dlciwKLQkucG9pbnRlciA9IHNuZF90bTYwMDBfcG9pbnRlciwKLX07Ci0KLS8qCi0gKiBjcmVhdGUgYSBQQ00gZGV2aWNlCi0gKi8KLQotLyogRklYTUU6IENvbnRyb2wgaW50ZXJmYWNlIC0gSG93IHRvIGNvbnRyb2wgdm9sdW1lL211dGU/ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQlCYXNpYyBGbG93IGZvciBTb3VuZCBEZXZpY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEFsc2EgQ29uc3RydWN0b3IgLSBDb21wb25lbnQgcHJvYmUKLSAqLwotaW50IHRtNjAwMF9hdWRpb19pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCBzbmRfY2FyZAkJKmNhcmQ7Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZAkqY2hpcDsKLQlpbnQJCQlyYzsKLQlzdGF0aWMgaW50CQlkZXZucjsKLQljaGFyCQkJY29tcG9uZW50WzE0XTsKLQlzdHJ1Y3Qgc25kX3BjbQkJKnBjbTsKLQotCWlmICghZGV2KQotCQlyZXR1cm4gMDsKLQotCWlmIChkZXZuciA+PSBTTkRSVl9DQVJEUykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoIWVuYWJsZVtkZXZucl0pCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmMgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnJdLCAidG02MDAwIiwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgY2FyZCBpbnN0YW5jZSAlZFxuIiwgZGV2bnIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCXN0cmNweShjYXJkLT5kcml2ZXIsICJ0bTYwMDAtYWxzYSIpOwotCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJUTTU2MDAvNjB4MCIpOwotCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJUTTU2MDAvNjB4MCBBdWRpbyBhdCBidXMgJWQgZGV2aWNlICVkIiwKLQkJZGV2LT51ZGV2LT5idXMtPmJ1c251bSwgZGV2LT51ZGV2LT5kZXZudW0pOwotCi0Jc3ByaW50Zihjb21wb25lbnQsICJVU0IlMDR4OiUwNHgiLAotCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAotCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7Ci0Jc25kX2NvbXBvbmVudF9hZGQoY2FyZCwgY29tcG9uZW50KTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXYtPnVkZXYtPmRldik7Ci0KLQljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF90bTYwMDBfY2FyZCksIEdGUF9LRVJORUwpOwotCWlmICghY2hpcCkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JY2hpcC0+Y29yZSA9IGRldjsKLQljaGlwLT5jYXJkID0gY2FyZDsKLQlkZXYtPmFkZXYgPSBjaGlwOwotCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7Ci0KLQlyYyA9IHNuZF9wY21fbmV3KGNhcmQsICJUTTYwMDAgQXVkaW8iLCAwLCAwLCAxLCAmcGNtKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycm9yX2NoaXA7Ci0KLQlwY20tPmluZm9fZmxhZ3MgPSAwOwotCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKLQlzdHJjcHkocGNtLT5uYW1lLCAiVHJpZGVudCBUTTU2MDAvNjB4MCIpOwotCi0Jc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX3RtNjAwMF9wY21fb3BzKTsKLQotCUlOSVRfV09SSygmZGV2LT53cV90cmlnZ2VyLCBhdWRpb190cmlnZ2VyKTsKLQlyYyA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyb3JfY2hpcDsKLQotCWRwcmludGsoMSwgIlJlZ2lzdGVyZWQgYXVkaW8gZHJpdmVyIGZvciAlc1xuIiwgY2FyZC0+bG9uZ25hbWUpOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yX2NoaXA6Ci0Ja2ZyZWUoY2hpcCk7Ci0JZGV2LT5hZGV2ID0gTlVMTDsKLWVycm9yOgotCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHRtNjAwMF9hdWRpb19maW5pKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQJKmNoaXAgPSBkZXYtPmFkZXY7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWNoaXApCi0JCXJldHVybiAwOwotCi0JaWYgKCFjaGlwLT5jYXJkKQotCQlyZXR1cm4gMDsKLQotCXNuZF9jYXJkX2ZyZWUoY2hpcC0+Y2FyZCk7Ci0JY2hpcC0+Y2FyZCA9IE5VTEw7Ci0Ja2ZyZWUoY2hpcCk7Ci0JZGV2LT5hZGV2ID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgdG02MDAwX29wcyBhdWRpb19vcHMgPSB7Ci0JLnR5cGUJPSBUTTYwMDBfQVVESU8sCi0JLm5hbWUJPSAiVE02MDAwIEF1ZGlvIEV4dGVuc2lvbiIsCi0JLmluaXQJPSB0bTYwMDBfYXVkaW9faW5pdCwKLQkuZmluaQk9IHRtNjAwMF9hdWRpb19maW5pLAotCS5maWxsYnVmID0gdG02MDAwX2ZpbGxidWYsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCB0bTYwMDBfYWxzYV9yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZhdWRpb19vcHMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdG02MDAwX2Fsc2FfdW5yZWdpc3Rlcih2b2lkKQotewotCXRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbigmYXVkaW9fb3BzKTsKLX0KLQotbW9kdWxlX2luaXQodG02MDAwX2Fsc2FfcmVnaXN0ZXIpOwotbW9kdWxlX2V4aXQodG02MDAwX2Fsc2FfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1jYXJkcy5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtY2FyZHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyN2RiNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1jYXJkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4MiArMCwwIEBACi0vKgotICogIHRtNjAwMC1jYXJkcy5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgotI2luY2x1ZGUgPG1lZGlhL3R2YXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9pMmMtYWRkci5oPgotI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgotCi0jaW5jbHVkZSAidG02MDAwLmgiCi0jaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKLSNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKLSNpbmNsdWRlICJ4YzUwMDAuaCIKLQotI2RlZmluZSBUTTYwMDBfQk9BUkRfVU5LTk9XTgkJCTAKLSNkZWZpbmUgVE01NjAwX0JPQVJEX0dFTkVSSUMJCQkxCi0jZGVmaW5lIFRNNjAwMF9CT0FSRF9HRU5FUklDCQkJMgotI2RlZmluZSBUTTYwMTBfQk9BUkRfR0VORVJJQwkJCTMKLSNkZWZpbmUgVE01NjAwX0JPQVJEXzEwTU9PTlNfVVQ4MjEJCTQKLSNkZWZpbmUgVE01NjAwX0JPQVJEXzEwTU9PTlNfVVQzMzAJCTUKLSNkZWZpbmUgVE02MDAwX0JPQVJEX0FEU1RFQ0hfRFVBTF9UVgkJNgotI2RlZmluZSBUTTYwMDBfQk9BUkRfRlJFRUNPTV9BTkRfU0lNSUxBUgk3Ci0jZGVmaW5lIFRNNjAwMF9CT0FSRF9BRFNURUNIX01JTklfRFVBTF9UVgk4Ci0jZGVmaW5lIFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSAkJOQotI2RlZmluZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUgkJMTAKLSNkZWZpbmUgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSCQkxMQotI2RlZmluZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEUJMTIKLSNkZWZpbmUgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDEJCTEzCi0jZGVmaW5lIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSX0xJVEUJCTE0Ci0jZGVmaW5lIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUl9MSVRFCTE1Ci0jZGVmaW5lIFRNNTYwMF9CT0FSRF9URVJSQVRFQ19HUkFCU1RFUgkJMTYKLQotI2RlZmluZSBpc19nZW5lcmljKG1vZGVsKSAoKG1vZGVsID09IFRNNjAwMF9CT0FSRF9VTktOT1dOKSB8fCBcCi0JCQkgICAobW9kZWwgPT0gVE01NjAwX0JPQVJEX0dFTkVSSUMpIHx8IFwKLQkJCSAgIChtb2RlbCA9PSBUTTYwMDBfQk9BUkRfR0VORVJJQykgfHwgXAotCQkJICAgKG1vZGVsID09IFRNNjAxMF9CT0FSRF9HRU5FUklDKSkKLQotI2RlZmluZSBUTTYwMDBfTUFYQk9BUkRTICAgICAgICAxNgotc3RhdGljIHVuc2lnbmVkIGludCBjYXJkW10gICAgID0ge1swIC4uLiAoVE02MDAwX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07Ci0KLW1vZHVsZV9wYXJhbV9hcnJheShjYXJkLCAgaW50LCBOVUxMLCAwNDQ0KTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgdG02MDAwX2RldnVzZWQ7Ci0KLQotc3RydWN0IHRtNjAwMF9ib2FyZCB7Ci0JY2hhciAgICAgICAgICAgICpuYW1lOwotCWNoYXIJCWVlbmFtZVsxNl07CQkvKiBFRVBST00gbmFtZSAqLwotCXVuc2lnbmVkCWVlbmFtZV9zaXplOwkJLyogc2l6ZSBvZiBFRVBST00gbmFtZSAqLwotCXVuc2lnbmVkCWVlbmFtZV9wb3M7CQkvKiBQb3NpdGlvbiB3aGVyZSBpdCBhcHBlYXJzIGF0IFJPTSAqLwotCi0Jc3RydWN0IHRtNjAwMF9jYXBhYmlsaXRpZXMgY2FwczsKLQotCWVudW0JCXRtNjAwMF9kZXZ0eXBlIHR5cGU7CS8qIHZhcmlhbnQgb2YgdGhlIGNoaXBzZXQgKi8KLQlpbnQgICAgICAgICAgICAgdHVuZXJfdHlwZTsgICAgIC8qIHR5cGUgb2YgdGhlIHR1bmVyICovCi0JaW50ICAgICAgICAgICAgIHR1bmVyX2FkZHI7ICAgICAvKiB0dW5lciBhZGRyZXNzICovCi0JaW50ICAgICAgICAgICAgIGRlbW9kX2FkZHI7ICAgICAvKiBkZW1vZHVsYXRvciBhZGRyZXNzICovCi0KLQlzdHJ1Y3QgdG02MDAwX2dwaW8gZ3BpbzsKLQotCXN0cnVjdCB0bTYwMDBfaW5wdXQJdmlucHV0WzNdOwotCXN0cnVjdCB0bTYwMDBfaW5wdXQJcmlucHV0OwotCi0JY2hhcgkJKmlyX2NvZGVzOwotfTsKLQotc3RydWN0IHRtNjAwMF9ib2FyZCB0bTYwMDBfYm9hcmRzW10gPSB7Ci0JW1RNNjAwMF9CT0FSRF9VTktOT1dOXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJVbmtub3duIHRtNjAwMCB2aWRlbyBncmFiYmVyIiwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyCT0gMSwKLQkJCS5oYXNfZWVwcm9tCT0gMSwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMDBfR1BJT18xLAotCQl9LAotCQkudmlucHV0ID0geyB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwKLQkJfSwKLQl9LAotCVtUTTU2MDBfQk9BUkRfR0VORVJJQ10gPSB7Ci0JCS5uYW1lICAgICAgICAgPSAiR2VuZXJpYyB0bTU2MDAgYm9hcmQiLAotCQkudHlwZSAgICAgICAgID0gVE01NjAwLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAotCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIJPSAxLAotCQkJLmhhc19lZXByb20JPSAxLAotCQl9LAotCQkuZ3BpbyA9IHsKLQkJCS50dW5lcl9yZXNldAk9IFRNNjAwMF9HUElPXzEsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAwMF9CT0FSRF9HRU5FUklDXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJHZW5lcmljIHRtNjAwMCBib2FyZCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCi0JCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lcgk9IDEsCi0JCQkuaGFzX2VlcHJvbQk9IDEsCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDAwX0dQSU9fMSwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JfSwKLQlbVE02MDEwX0JPQVJEX0dFTkVSSUNdID0gewotCQkubmFtZSAgICAgICAgID0gIkdlbmVyaWMgdG02MDEwIGJvYXJkIiwKLQkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKLQkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKLQkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKLQkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyCT0gMSwKLQkJCS5oYXNfZHZiCT0gMSwKLQkJCS5oYXNfemwxMDM1Mwk9IDEsCi0JCQkuaGFzX2VlcHJvbQk9IDEsCi0JCQkuaGFzX3JlbW90ZQk9IDEsCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMiwKLQkJCS50dW5lcl9vbgk9IFRNNjAxMF9HUElPXzMsCi0JCQkuZGVtb2RfcmVzZXQJPSBUTTYwMTBfR1BJT18xLAotCQkJLmRlbW9kX29uCT0gVE02MDEwX0dQSU9fNCwKLQkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT183LAotCQkJLmR2Yl9sZWQJPSBUTTYwMTBfR1BJT181LAotCQkJLmlyCQk9IFRNNjAxMF9HUElPXzAsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNTYwMF9CT0FSRF8xME1PT05TX1VUODIxXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICIxME1vb25zIFVUIDgyMSIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCi0JCS5lZW5hbWUgICAgICAgPSB7ICcxJywgJzAnLCAnTScsICdPJywgJ08nLCAnTicsICdTJywgJzUnLCAnNicsICcwJywgJzAnLCAweGZmLCAweDQ1LCAweDVifSwKLQkJLmVlbmFtZV9zaXplICA9IDE0LAotCQkuZWVuYW1lX3BvcyAgID0gMHgxNCwKLQkJLnR5cGUgICAgICAgICA9IFRNNTYwMCwKLQkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyICAgID0gMSwKLQkJCS5oYXNfZWVwcm9tICAgPSAxLAotCQl9LAotCQkuZ3BpbyA9IHsKLQkJCS50dW5lcl9yZXNldAk9IFRNNjAwMF9HUElPXzEsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNTYwMF9CT0FSRF8xME1PT05TX1VUMzMwXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICIxME1vb25zIFVUIDMzMCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9QSElMSVBTX0ZRMTIxNkFNRV9NSzQsCi0JCS50dW5lcl9hZGRyICAgPSAweGM4ID4+IDEsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lciAgICA9IDEsCi0JCQkuaGFzX2R2YiAgICAgID0gMCwKLQkJCS5oYXNfemwxMDM1MyAgPSAwLAotCQkJLmhhc19lZXByb20gICA9IDEsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAwMF9CT0FSRF9BRFNURUNIX0RVQUxfVFZdID0gewotCQkubmFtZSAgICAgICAgID0gIkFEU1RFQ0ggRHVhbCBUViBVU0IiLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAotCQkudHVuZXJfYWRkciAgID0gMHhjOCA+PiAxLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIgICAgPSAxLAotCQkJLmhhc190ZGE5ODc0ICA9IDEsCi0JCQkuaGFzX2R2YiAgICAgID0gMSwKLQkJCS5oYXNfemwxMDM1MyAgPSAxLAotCQkJLmhhc19lZXByb20gICA9IDEsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAwMF9CT0FSRF9GUkVFQ09NX0FORF9TSU1JTEFSXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJGcmVlY29tIEh5YnJpZCBTdGljayAvIE1va2EgRFZCLVQgUmVjZWl2ZXIgRHVhbCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsIC8qIGhhcyBhIFhDMzAyOCAqLwotCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAotCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIgICAgPSAxLAotCQkJLmhhc19kdmIgICAgICA9IDEsCi0JCQkuaGFzX3psMTAzNTMgID0gMSwKLQkJCS5oYXNfZWVwcm9tICAgPSAwLAotCQkJLmhhc19yZW1vdGUgICA9IDEsCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDAwX0dQSU9fNCwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JfSwKLQlbVE02MDAwX0JPQVJEX0FEU1RFQ0hfTUlOSV9EVUFMX1RWXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJBRFNURUNIIE1pbmkgRHVhbCBUViBVU0IiLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LCAvKiBoYXMgYSBYQzMwMjggKi8KLQkJLnR1bmVyX2FkZHIgICA9IDB4YzggPj4gMSwKLQkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyICAgID0gMSwKLQkJCS5oYXNfZHZiICAgICAgPSAxLAotCQkJLmhhc196bDEwMzUzICA9IDEsCi0JCQkuaGFzX2VlcHJvbSAgID0gMCwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMDBfR1BJT180LAotCQl9LAotCQkudmlucHV0ID0geyB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwKLQkJfSwKLQl9LAotCVtUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEhdID0gewotCQkubmFtZSAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBIVlItOTAwSCAvIFdpblRWIFVTQjItU3RpY2siLAotCQkuZWVuYW1lICAgICAgID0geyAnSCcsIDAsICdWJywgMCwgJ1InLCAwLCAnOScsIDAsICcwJywgMCwgJzAnLCAwLCAnSCcsIDAgfSwKLQkJLmVlbmFtZV9zaXplICA9IDE0LAotCQkuZWVuYW1lX3BvcyAgID0gMHg0MiwKLQkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwgLyogaGFzIGEgWEMzMDI4ICovCi0JCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCi0JCS5kZW1vZF9hZGRyICAgPSAweDFlID4+IDEsCi0JCS50eXBlICAgICAgICAgPSBUTTYwMTAsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lciAgICA9IDEsCi0JCQkuaGFzX2R2YiAgICAgID0gMSwKLQkJCS5oYXNfemwxMDM1MyAgPSAxLAotCQkJLmhhc19lZXByb20gICA9IDEsCi0JCQkuaGFzX3JlbW90ZSAgID0gMSwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18yLAotCQkJLnR1bmVyX29uCT0gVE02MDEwX0dQSU9fMywKLQkJCS5kZW1vZF9yZXNldAk9IFRNNjAxMF9HUElPXzEsCi0JCQkuZGVtb2Rfb24JPSBUTTYwMTBfR1BJT180LAotCQkJLnBvd2VyX2xlZAk9IFRNNjAxMF9HUElPXzcsCi0JCQkuZHZiX2xlZAk9IFRNNjAxMF9HUElPXzUsCi0JCQkuaXIJCT0gVE02MDEwX0dQSU9fMCwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JfSwKLQlbVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJdID0gewotCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFdhbmRlciBEVkItVC9UVi9GTSBVU0IyLjAiLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEM1MDAwLAotCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAotCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAotCQkudHlwZSAgICAgICAgID0gVE02MDEwLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIgICAgICA9IDEsCi0JCQkuaGFzX2R2YiAgICAgICAgPSAxLAotCQkJLmhhc196bDEwMzUzICAgID0gMSwKLQkJCS5oYXNfZWVwcm9tICAgICA9IDEsCi0JCQkuaGFzX3JlbW90ZSAgICAgPSAxLAotCQkJLmhhc19yYWRpbwk9IDEuCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMCwKLQkJCS5kZW1vZF9yZXNldAk9IFRNNjAxMF9HUElPXzEsCi0JCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNiwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JCS5yaW5wdXQgPSB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJfSwKLQl9LAotCVtUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJdID0gewotCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFZveWFnZXIgVFYvRk0gVVNCMi4wIiwKLQkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDNTAwMCwKLQkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKLQkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyICAgICAgPSAxLAotCQkJLmhhc19kdmIgICAgICAgID0gMCwKLQkJCS5oYXNfemwxMDM1MyAgICA9IDAsCi0JCQkuaGFzX2VlcHJvbSAgICAgPSAxLAotCQkJLmhhc19yZW1vdGUgICAgID0gMSwKLQkJCS5oYXNfcmFkaW8JPSAxLAotCQl9LAotCQkuZ3BpbyA9IHsKLQkJCS50dW5lcl9yZXNldAk9IFRNNjAxMF9HUElPXzAsCi0JCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNiwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JCS5yaW5wdXQgPSB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJfSwKLQl9LAotCVtUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEVdID0gewotCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgSHlicmlkIFhFIC8gQ2luZXJneSBIeWJyaWQtU3RpY2siLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LCAvKiBoYXMgYSBYQzMwMjggKi8KLQkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKLQkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKLQkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyICAgID0gMSwKLQkJCS5oYXNfZHZiICAgICAgPSAxLAotCQkJLmhhc196bDEwMzUzICA9IDEsCi0JCQkuaGFzX2VlcHJvbSAgID0gMSwKLQkJCS5oYXNfcmVtb3RlICAgPSAxLAotCQl9LAotCQkuZ3BpbyA9IHsKLQkJCS50dW5lcl9yZXNldAk9IFRNNjAxMF9HUElPXzIsCi0JCQkudHVuZXJfb24JPSBUTTYwMTBfR1BJT18zLAotCQkJLmRlbW9kX3Jlc2V0CT0gVE02MDEwX0dQSU9fMSwKLQkJCS5kZW1vZF9vbgk9IFRNNjAxMF9HUElPXzQsCi0JCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNywKLQkJCS5kdmJfbGVkCT0gVE02MDEwX0dQSU9fNSwKLQkJCS5pcgkJPSBUTTYwMTBfR1BJT18wLAotCQl9LAotCQkuaXJfY29kZXMgPSBSQ19NQVBfTkVDX1RFUlJBVEVDX0NJTkVSR1lfWFMsCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNTYwMF9CT0FSRF9URVJSQVRFQ19HUkFCU1RFUl0gPSB7Ci0JCS5uYW1lICAgICAgICAgPSAiVGVycmF0ZWMgR3JhYnN0ZXIgQVYgMTUwLzI1MCBNWCIsCi0JCS50eXBlICAgICAgICAgPSBUTTU2MDAsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9BQlNFTlQsCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJUd2luaGFuIFRVNTAxKDcwNEQxKSIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsIC8qIGhhcyBhIFhDMzAyOCAqLwotCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAotCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAotCQkudHlwZSAgICAgICAgID0gVE02MDEwLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIgICAgPSAxLAotCQkJLmhhc19kdmIgICAgICA9IDEsCi0JCQkuaGFzX3psMTAzNTMgID0gMSwKLQkJCS5oYXNfZWVwcm9tICAgPSAxLAotCQkJLmhhc19yZW1vdGUgICA9IDEsCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMiwKLQkJCS50dW5lcl9vbgk9IFRNNjAxMF9HUElPXzMsCi0JCQkuZGVtb2RfcmVzZXQJPSBUTTYwMTBfR1BJT18xLAotCQkJLmRlbW9kX29uCT0gVE02MDEwX0dQSU9fNCwKLQkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT183LAotCQkJLmR2Yl9sZWQJPSBUTTYwMTBfR1BJT181LAotCQkJLmlyCQk9IFRNNjAxMF9HUElPXzAsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSX0xJVEVdID0gewotCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFdhbmRlciBMaXRlIERWQi1UL1RWL0ZNIFVTQjIuMCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzUwMDAsCi0JCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCi0JCS5kZW1vZF9hZGRyICAgPSAweDFlID4+IDEsCi0JCS50eXBlICAgICAgICAgPSBUTTYwMTAsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lciAgICAgID0gMSwKLQkJCS5oYXNfZHZiICAgICAgICA9IDEsCi0JCQkuaGFzX3psMTAzNTMgICAgPSAxLAotCQkJLmhhc19lZXByb20gICAgID0gMSwKLQkJCS5oYXNfcmVtb3RlICAgICA9IDAsCi0JCQkuaGFzX3JhZGlvCT0gMSwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18wLAotCQkJLmRlbW9kX3Jlc2V0CT0gVE02MDEwX0dQSU9fMSwKLQkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT182LAotCQl9LAotCQkudmlucHV0ID0geyB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfU0lGMSwKLQkJCX0sCi0JCX0sCi0JCS5yaW5wdXQgPSB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJfSwKLQl9LAotCVtUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURV0gPSB7Ci0JCS5uYW1lICAgICAgICAgPSAiQmVob2xkZXIgVm95YWdlciBMaXRlIFRWL0ZNIFVTQjIuMCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzUwMDAsCi0JCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCi0JCS50eXBlICAgICAgICAgPSBUTTYwMTAsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lciAgICAgID0gMSwKLQkJCS5oYXNfZHZiICAgICAgICA9IDAsCi0JCQkuaGFzX3psMTAzNTMgICAgPSAwLAotCQkJLmhhc19lZXByb20gICAgID0gMSwKLQkJCS5oYXNfcmVtb3RlICAgICA9IDAsCi0JCQkuaGFzX3JhZGlvCT0gMSwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18wLAotCQkJLnBvd2VyX2xlZAk9IFRNNjAxMF9HUElPXzYsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAotCQkJfSwKLQkJfSwKLQkJLnJpbnB1dCA9IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1JBRElPLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQl9LAotCX0sCi19OwotCi0vKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCi1zdHJ1Y3QgdXNiX2RldmljZV9pZCB0bTYwMDBfaWRfdGFibGVbXSA9IHsKLQl7IFVTQl9ERVZJQ0UoMHg2MDAwLCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBUTTU2MDBfQk9BUkRfR0VORVJJQyB9LAotCXsgVVNCX0RFVklDRSgweDYwMDAsIDB4MDAwMiksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9HRU5FUklDIH0sCi0JeyBVU0JfREVWSUNFKDB4MDZlMSwgMHhmMzMyKSwgLmRyaXZlcl9pbmZvID0gVE02MDAwX0JPQVJEX0FEU1RFQ0hfRFVBTF9UViB9LAotCXsgVVNCX0RFVklDRSgweDE0YWEsIDB4MDYyMCksIC5kcml2ZXJfaW5mbyA9IFRNNjAwMF9CT0FSRF9GUkVFQ09NX0FORF9TSU1JTEFSIH0sCi0JeyBVU0JfREVWSUNFKDB4MDZlMSwgMHhiMzM5KSwgLmRyaXZlcl9pbmZvID0gVE02MDAwX0JPQVJEX0FEU1RFQ0hfTUlOSV9EVUFMX1RWIH0sCi0JeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg2NjAwKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIIH0sCi0JeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg2NjAxKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIIH0sCi0JeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg2NjEwKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIIH0sCi0JeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg2NjExKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIIH0sCi0JeyBVU0JfREVWSUNFKDB4NjAwMCwgMHhkZWMwKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVIgfSwKLQl7IFVTQl9ERVZJQ0UoMHg2MDAwLCAweGRlYzEpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVIgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwODYpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEUgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwQTUpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEUgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwNzkpLCAuZHJpdmVyX2luZm8gPSBUTTU2MDBfQk9BUkRfVEVSUkFURUNfR1JBQlNURVIgfSwKLQl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMyNDApLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMSB9LAotCXsgVVNCX0RFVklDRSgweDEzZDMsIDB4MzI0MSksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxIH0sCi0JeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzMjQzKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDEgfSwKLQl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMyNjQpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMSB9LAotCXsgVVNCX0RFVklDRSgweDYwMDAsIDB4ZGVjMiksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSX0xJVEUgfSwKLQl7IFVTQl9ERVZJQ0UoMHg2MDAwLCAweGRlYzMpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURSB9LAotCXsgfSwKLX07Ci0KLS8qIENvbnRyb2wgcG93ZXIgbGVkIGZvciBzaG93IHNvbWUgYWN0aXZpdHkgKi8KLXZvaWQgdG02MDAwX2ZsYXNoX2xlZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggc3RhdGUpCi17Ci0JLyogUG93ZXIgTEVEIHVuY29uZmlndXJlZCAqLwotCWlmICghZGV2LT5ncGlvLnBvd2VyX2xlZCkKLQkJcmV0dXJuOwotCi0JLyogT04gUG93ZXIgTEVEICovCi0JaWYgKHN0YXRlKSB7Ci0JCXN3aXRjaCAoZGV2LT5tb2RlbCkgewotCQljYXNlIFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSDoKLQkJY2FzZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEU6Ci0JCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkJZGV2LT5ncGlvLnBvd2VyX2xlZCwgMHgwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUjoKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVI6Ci0JCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURToKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCS8qIE9GRiBQb3dlciBMRUQgKi8KLQllbHNlIHsKLQkJc3dpdGNoIChkZXYtPm1vZGVsKSB7Ci0JCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgotCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKLQkJY2FzZSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMToKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSOgotCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUjoKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUl9MSVRFOgotCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUl9MSVRFOgotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCWRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLS8qIFR1bmVyIGNhbGxiYWNrIHRvIHByb3ZpZGUgdGhlIHByb3BlciBncGlvIGNoYW5nZXMgbmVlZGVkIGZvciB4YzUwMDAgKi8KLWludCB0bTYwMDBfeGM1MDAwX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IHB0cjsKLQotCWlmIChkZXYtPnR1bmVyX3R5cGUgIT0gVFVORVJfWEM1MDAwKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAoY29tbWFuZCkgewotCWNhc2UgWEM1MDAwX1RVTkVSX1JFU0VUOgotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJbXNsZWVwKDE1KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7Ci0JCW1zbGVlcCgxNSk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDEpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3hjNTAwMF9jYWxsYmFjayk7Ci0KLS8qIFR1bmVyIGNhbGxiYWNrIHRvIHByb3ZpZGUgdGhlIHByb3BlciBncGlvIGNoYW5nZXMgbmVlZGVkIGZvciB4YzIwMjggKi8KLQotaW50IHRtNjAwMF90dW5lcl9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBwdHI7Ci0KLQlpZiAoZGV2LT50dW5lcl90eXBlICE9IFRVTkVSX1hDMjAyOCkKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFhDMjAyOF9SRVNFVF9DTEs6Ci0JCXRtNjAwMF9pcl93YWl0KGRldiwgMCk7Ci0KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULAotCQkJCQkweDAyLCBhcmcpOwotCQltc2xlZXAoMTApOwotCQlyYyA9IHRtNjAwMF9pMmNfcmVzZXQoZGV2LCAxMCk7Ci0JCWJyZWFrOwotCWNhc2UgWEMyMDI4X1RVTkVSX1JFU0VUOgotCQkvKiBSZXNldCBjb2RlcyBkdXJpbmcgbG9hZCBmaXJtd2FyZSAqLwotCQlzd2l0Y2ggKGFyZykgewotCQljYXNlIDA6Ci0JCQkvKiBuZXdlciB0dW5lciBjYW4gZmFzdGVyIHJlc2V0ICovCi0JCQlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKLQkJCWNhc2UgVE01NjAwX0JPQVJEXzEwTU9PTlNfVVQ4MjE6Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkJCSAgICAgICAweDMwMCwgMHgwMSk7Ci0JCQkJbXNsZWVwKDEwKTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDApOwotCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJICAgICAgIDB4MzAwLCAweDAwKTsKLQkJCQltc2xlZXAoMTApOwotCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMSk7Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkgICAgICAgMHgzMDAsIDB4MDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEg6Ci0JCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKLQkJCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJCQltc2xlZXAoNjApOwotCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7Ci0JCQkJbXNsZWVwKDc1KTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDEpOwotCQkJCW1zbGVlcCg2MCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7Ci0JCQkJbXNsZWVwKDEzMCk7Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJCQltc2xlZXAoMTMwKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJdG02MDAwX2lyX3dhaXQoZGV2LCAxKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsCi0JCQkJCQkweDAyLCAweDAxKTsKLQkJCW1zbGVlcCgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcmMgPSB0bTYwMDBfaTJjX3Jlc2V0KGRldiwgMTAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHRtNjAwMF90dW5lcl9jYWxsYmFjayk7Ci0KLWludCB0bTYwMDBfY2FyZHNfc2V0dXAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IGksIHJjOwotCi0JLyoKLQkgKiBCb2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4gSGFuZGxlcyBhbGwgR1BJTwotCSAqIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlcyB0aGF0IGFyZSBib2FyZC1zcGVjaWZpYy4KLQkgKiBVcCB0byBub3csIGFsbCBmb3VuZCBkZXZpY2VzIHVzZSBHUElPMSBhbmQgR1BJTzQgYXQgdGhlIHNhbWUgd2F5LgotCSAqIFByb2JhYmx5LCB0aGV5J3JlIGFsbCBiYXNlZCBvbiBzb21lIHJlZmVyZW5jZSBkZXZpY2UuIER1ZSB0byB0aGF0LAotCSAqIHRoZXJlJ3MgYSBjb21tb24gcm91dGluZSBhdCB0aGUgZW5kIHRvIGhhbmRsZSB0aG9zZSBHUElPJ3MuIERldmljZXMKLQkgKiB0aGF0IHVzZSBkaWZmZXJlbnQgcGludXBzIG9yIGluaXQgc2VxdWVuY2VzIGNhbiBqdXN0IHJldHVybiBhdAotCSAqIHRoZSBib2FyZC1zcGVjaWZpYyBzZXNzaW9uLgotCSAqLwotCXN3aXRjaCAoZGV2LT5tb2RlbCkgewotCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgotCWNhc2UgVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFOgotCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6Ci0JY2FzZSBUTTYwMTBfQk9BUkRfR0VORVJJQzoKLQkJLyogVHVybiB4Y2VpdmUgMzAyOCBvbiAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby50dW5lcl9vbiwgMHgwMSk7Ci0JCW1zbGVlcCgxNSk7Ci0JCS8qIFR1cm4gemFybGluayB6bDEwMzUzIG9uICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmRlbW9kX29uLCAweDAwKTsKLQkJbXNsZWVwKDE1KTsKLQkJLyogUmVzZXQgemFybGluayB6bDEwMzUzICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmRlbW9kX3Jlc2V0LCAweDAwKTsKLQkJbXNsZWVwKDUwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2RfcmVzZXQsIDB4MDEpOwotCQltc2xlZXAoMTUpOwotCQkvKiBUdXJuIHphcmxpbmsgemwxMDM1MyBvZmYgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2Rfb24sIDB4MDEpOwotCQltc2xlZXAoMTUpOwotCQkvKiBpciA/ICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmlyLCAweDAxKTsKLQkJbXNsZWVwKDE1KTsKLQkJLyogUG93ZXIgbGVkIG9uIChibHVlKSAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDApOwotCQltc2xlZXAoMTUpOwotCQkvKiBEVkIgbGVkIG9mZiAob3JhbmdlKSAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kdmJfbGVkLCAweDAxKTsKLQkJbXNsZWVwKDE1KTsKLQkJLyogVHVybiB6YXJsaW5rIHpsMTAzNTMgb24gKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2Rfb24sIDB4MDApOwotCQltc2xlZXAoMTUpOwotCQlicmVhazsKLQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSOgotCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKLQkJLyogUG93ZXIgbGVkIG9uIChibHVlKSAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDEpOwotCQltc2xlZXAoMTUpOwotCQkvKiBSZXNldCB6YXJsaW5rIHpsMTAzNTMgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2RfcmVzZXQsIDB4MDApOwotCQltc2xlZXAoNTApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kZW1vZF9yZXNldCwgMHgwMSk7Ci0JCW1zbGVlcCgxNSk7Ci0JCWJyZWFrOwotCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSOgotCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSX0xJVEU6Ci0JCS8qIFBvd2VyIGxlZCBvbiAoYmx1ZSkgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKLQkJbXNsZWVwKDE1KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBEZWZhdWx0IGluaXRpYWxpemF0aW9uLiBNb3N0IG9mIHRoZSBkZXZpY2VzIHNlZW0gdG8gdXNlIEdQSU8xCi0JICogYW5kIEdQSU80Lm9uIHRoZSBzYW1lIHdheSwgc28sIHRoaXMgaGFuZGxlcyB0aGUgY29tbW9uIHNlcXVlbmNlCi0JICogdXNlZCBieSBtb3N0IGRldmljZXMuCi0JICogSWYgYSBkZXZpY2UgdXNlcyBhIGRpZmZlcmVudCBzZXF1ZW5jZSBvciBkaWZmZXJlbnQgR1BJTyBwaW5zIGZvcgotCSAqIHJlc2V0LCBqdXN0IGFkZCB0aGUgY29kZSBhdCB0aGUgYm9hcmQtc3BlY2lmaWMgcGFydAotCSAqLwotCi0JaWYgKGRldi0+Z3Bpby50dW5lcl9yZXNldCkgewotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJCWRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSBkb2luZyB0dW5lciByZXNldFxuIiwgcmMpOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQotCQkJbXNsZWVwKDEwKTsgLyogSnVzdCB0byBiZSBjb25zZXJ2YXRpdmUgKi8KLQkJCXJjID0gdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkJZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVpIGRvaW5nIHR1bmVyIHJlc2V0XG4iLCByYyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJUdW5lciByZXNldCBpcyBub3QgY29uZmlndXJlZFxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQltc2xlZXAoNTApOwotCi0JcmV0dXJuIDA7Ci19OwotCi1zdGF0aWMgdm9pZCB0bTYwMDBfY29uZmlnX3R1bmVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7Ci0KLQkvKiBMb2FkIHR1bmVyIG1vZHVsZSAqLwotCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwLAotCQkidHVuZXIiLCBkZXYtPnR1bmVyX2FkZHIsIE5VTEwpOwotCi0JbWVtc2V0KCZ0dW5fc2V0dXAsIDAsIHNpemVvZih0dW5fc2V0dXApKTsKLQl0dW5fc2V0dXAudHlwZSA9IGRldi0+dHVuZXJfdHlwZTsKLQl0dW5fc2V0dXAuYWRkciA9IGRldi0+dHVuZXJfYWRkcjsKLQotCXR1bl9zZXR1cC5tb2RlX21hc2sgPSAwOwotCWlmIChkZXYtPmNhcHMuaGFzX3R1bmVyKQotCQl0dW5fc2V0dXAubW9kZV9tYXNrIHw9IChUX0FOQUxPR19UViB8IFRfUkFESU8pOwotCi0Jc3dpdGNoIChkZXYtPnR1bmVyX3R5cGUpIHsKLQljYXNlIFRVTkVSX1hDMjAyODoKLQkJdHVuX3NldHVwLnR1bmVyX2NhbGxiYWNrID0gdG02MDAwX3R1bmVyX2NhbGxiYWNrOwotCQlicmVhazsKLQljYXNlIFRVTkVSX1hDNTAwMDoKLQkJdHVuX3NldHVwLnR1bmVyX2NhbGxiYWNrID0gdG02MDAwX3hjNTAwMF9jYWxsYmFjazsKLQkJYnJlYWs7Ci0JfQotCi0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3R5cGVfYWRkciwgJnR1bl9zZXR1cCk7Ci0KLQlzd2l0Y2ggKGRldi0+dHVuZXJfdHlwZSkgewotCWNhc2UgVFVORVJfWEMyMDI4OiB7Ci0JCXN0cnVjdCB2NGwyX3ByaXZfdHVuX2NvbmZpZyB4YzIwMjhfY2ZnOwotCQlzdHJ1Y3QgeGMyMDI4X2N0cmwgY3RsOwotCi0JCW1lbXNldCgmeGMyMDI4X2NmZywgMCwgc2l6ZW9mKHhjMjAyOF9jZmcpKTsKLQkJbWVtc2V0KCZjdGwsIDAsIHNpemVvZihjdGwpKTsKLQotCQljdGwuZGVtb2QgPSBYQzMwMjhfRkVfWkFSTElOSzQ1NjsKLQotCQl4YzIwMjhfY2ZnLnR1bmVyID0gVFVORVJfWEMyMDI4OwotCQl4YzIwMjhfY2ZnLnByaXYgID0gJmN0bDsKLQotCQlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKLQkJY2FzZSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEg6Ci0JCWNhc2UgVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFOgotCQljYXNlIFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxOgotCQkJY3RsLmZuYW1lID0gInhjMzAyOEwtdjM2LmZ3IjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKQotCQkJCWN0bC5mbmFtZSA9ICJ4YzMwMjgtdjI3LmZ3IjsKLQkJCWVsc2UKLQkJCQljdGwuZm5hbWUgPSAieGMzMDI4LXYyNC5mdyI7Ci0JCX0KLQotCQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIGZpcm13YXJlIHBhcmFtZXRlcnMgZm9yIHhjMjAyOFxuIik7Ci0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19jb25maWcsCi0JCQkJICAgICAmeGMyMDI4X2NmZyk7Ci0KLQkJfQotCQlicmVhazsKLQljYXNlIFRVTkVSX1hDNTAwMDoKLQkJewotCQlzdHJ1Y3QgdjRsMl9wcml2X3R1bl9jb25maWcgIHhjNTAwMF9jZmc7Ci0JCXN0cnVjdCB4YzUwMDBfY29uZmlnIGN0bCA9IHsKLQkJCS5pMmNfYWRkcmVzcyA9IGRldi0+dHVuZXJfYWRkciwKLQkJCS5pZl9raHogICAgICA9IDQ1NzAsCi0JCQkucmFkaW9faW5wdXQgPSBYQzUwMDBfUkFESU9fRk0xX01PTk8sCi0JCQl9OwotCi0JCXhjNTAwMF9jZmcudHVuZXIgPSBUVU5FUl9YQzUwMDA7Ci0JCXhjNTAwMF9jZmcucHJpdiAgPSAmY3RsOwotCi0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19jb25maWcsCi0JCQkJICAgICAmeGM1MDAwX2NmZyk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biB0dW5lciB0eXBlLiBUdW5lciBpcyBub3QgY29uZmlndXJlZC5cbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZmlsbF9ib2FyZF9zcGVjaWZpY19kYXRhKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCWludCByYzsKLQotCWRldi0+ZGV2X3R5cGUgICA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0udHlwZTsKLQlkZXYtPnR1bmVyX3R5cGUgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLnR1bmVyX3R5cGU7Ci0JZGV2LT50dW5lcl9hZGRyID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS50dW5lcl9hZGRyOwotCi0JZGV2LT5ncGlvID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS5ncGlvOwotCi0JZGV2LT5pcl9jb2RlcyA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0uaXJfY29kZXM7Ci0KLQlkZXYtPmRlbW9kX2FkZHIgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLmRlbW9kX2FkZHI7Ci0KLQlkZXYtPmNhcHMgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLmNhcHM7Ci0KLQlkZXYtPnZpbnB1dFswXSA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0udmlucHV0WzBdOwotCWRldi0+dmlucHV0WzFdID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS52aW5wdXRbMV07Ci0JZGV2LT52aW5wdXRbMl0gPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLnZpbnB1dFsyXTsKLQlkZXYtPnJpbnB1dCA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0ucmlucHV0OwotCi0JLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSAqLwotCXJjID0gdG02MDAwX2luaXQoZGV2KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJmRldi0+dWRldi0+ZGV2LCAmZGV2LT52NGwyX2Rldik7Ci19Ci0KLQotc3RhdGljIHZvaWQgdXNlX2FsdGVybmF0aXZlX2RldGVjdGlvbl9tZXRob2Qoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IGksIG1vZGVsID0gLTE7Ci0KLQlpZiAoIWRldi0+ZWVkYXRhX3NpemUpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRtNjAwMF9ib2FyZHMpOyBpKyspIHsKLQkJaWYgKCF0bTYwMDBfYm9hcmRzW2ldLmVlbmFtZV9zaXplKQotCQkJY29udGludWU7Ci0JCWlmIChkZXYtPmVlZGF0YV9zaXplIDwgdG02MDAwX2JvYXJkc1tpXS5lZW5hbWVfcG9zICsKLQkJCQkgICAgICAgdG02MDAwX2JvYXJkc1tpXS5lZW5hbWVfc2l6ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghbWVtY21wKCZkZXYtPmVlZGF0YVt0bTYwMDBfYm9hcmRzW2ldLmVlbmFtZV9wb3NdLAotCQkJICAgIHRtNjAwMF9ib2FyZHNbaV0uZWVuYW1lLAotCQkJICAgIHRtNjAwMF9ib2FyZHNbaV0uZWVuYW1lX3NpemUpKSB7Ci0JCQltb2RlbCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAobW9kZWwgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkRldmljZSBoYXMgZWVwcm9tIGJ1dCBpcyBjdXJyZW50bHkgdW5rbm93blxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlkZXYtPm1vZGVsID0gbW9kZWw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJEZXZpY2UgaWRlbnRpZmllZCB2aWEgZWVwcm9tIGFzICVzICh0eXBlID0gJWQpXG4iLAotCSAgICAgICB0bTYwMDBfYm9hcmRzW21vZGVsXS5uYW1lLCBtb2RlbCk7Ci19Ci0KLXN0YXRpYyBpbnQgdG02MDAwX2luaXRfZGV2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSBmOwotCWludCByYyA9IDA7Ci0KLQltdXRleF9pbml0KCZkZXYtPmxvY2spOwotCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0KLQlpZiAoIWlzX2dlbmVyaWMoZGV2LT5tb2RlbCkpIHsKLQkJcmMgPSBmaWxsX2JvYXJkX3NwZWNpZmljX2RhdGEoZGV2KTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZXJyOwotCi0JCS8qIHJlZ2lzdGVyIGkyYyBidXMgKi8KLQkJcmMgPSB0bTYwMDBfaTJjX3JlZ2lzdGVyKGRldik7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGVycjsKLQl9IGVsc2UgewotCQkvKiByZWdpc3RlciBpMmMgYnVzICovCi0JCXJjID0gdG02MDAwX2kyY19yZWdpc3RlcihkZXYpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBlcnI7Ci0KLQkJdXNlX2FsdGVybmF0aXZlX2RldGVjdGlvbl9tZXRob2QoZGV2KTsKLQotCQlyYyA9IGZpbGxfYm9hcmRfc3BlY2lmaWNfZGF0YShkZXYpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBlcnI7Ci0JfQotCi0JLyogRGVmYXVsdCB2YWx1ZXMgZm9yIFNURCBhbmQgcmVzb2x1dGlvbnMgKi8KLQlkZXYtPndpZHRoID0gNzIwOwotCWRldi0+aGVpZ2h0ID0gNDgwOwotCWRldi0+bm9ybSA9IFY0TDJfU1REX1BBTF9NOwotCi0JLyogQ29uZmlndXJlIHR1bmVyICovCi0JdG02MDAwX2NvbmZpZ190dW5lcihkZXYpOwotCi0JLyogU2V0IHZpZGVvIHN0YW5kYXJkICovCi0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIGNvcmUsIHNfc3RkLCBkZXYtPm5vcm0pOwotCi0JLyogU2V0IHR1bmVyIGZyZXF1ZW5jeSAtIGFsc28gbG9hZHMgZmlybXdhcmUgb24geGMyMDI4L3hjMzAyOCAqLwotCWYudHVuZXIgPSAwOwotCWYudHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCWYuZnJlcXVlbmN5ID0gMzA5MjsJLyogMTkzLjI1IE1IeiAqLwotCWRldi0+ZnJlcSA9IGYuZnJlcXVlbmN5OwotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19mcmVxdWVuY3ksICZmKTsKLQotCWlmIChkZXYtPmNhcHMuaGFzX3RkYTk4NzQpCi0JCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwLAotCQkJInR2YXVkaW8iLCBJMkNfQUREUl9UREE5ODc0LCBOVUxMKTsKLQotCS8qIHJlZ2lzdGVyIGFuZCBpbml0aWFsaXplIFY0TDIgKi8KLQlyYyA9IHRtNjAwMF92NGwyX3JlZ2lzdGVyKGRldik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBlcnI7Ci0KLQl0bTYwMDBfYWRkX2ludG9fZGV2bGlzdChkZXYpOwotCXRtNjAwMF9pbml0X2V4dGVuc2lvbihkZXYpOwotCi0JdG02MDAwX2lyX2luaXQoZGV2KTsKLQotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKLQlyZXR1cm4gMDsKLQotZXJyOgotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIGhpZ2ggYmFuZHdpZHRoIG11bHRpcGxpZXIsIGFzIGVuY29kZWQgaW4gaGlnaHNwZWVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCi0jZGVmaW5lIGhiX211bHQod01heFBhY2tldFNpemUpICgxICsgKCgod01heFBhY2tldFNpemUpID4+IDExKSAmIDB4MDMpKQotCi1zdGF0aWMgdm9pZCBnZXRfbWF4X2VuZHBvaW50KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJICAgICBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQsCi0JCQkgICAgIGNoYXIgKm1zZ3R5cGUsCi0JCQkgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqY3Vycl9lLAotCQkJICAgICBzdHJ1Y3QgdG02MDAwX2VuZHBvaW50ICp0bV9lcCkKLXsKLQl1MTYgdG1wID0gbGUxNl90b19jcHUoY3Vycl9lLT5kZXNjLndNYXhQYWNrZXRTaXplKTsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHRtcCAmIDB4N2ZmOwotCi0JaWYgKHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQotCQlzaXplID0gc2l6ZSAqIGhiX211bHQodG1wKTsKLQotCWlmIChzaXplID4gdG1fZXAtPm1heHNpemUpIHsKLQkJdG1fZXAtPmVuZHAgPSBjdXJyX2U7Ci0JCXRtX2VwLT5tYXhzaXplID0gc2l6ZTsKLQkJdG1fZXAtPmJJbnRlcmZhY2VOdW1iZXIgPSBhbHQtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKLQkJdG1fZXAtPmJBbHRlcm5hdGVTZXR0aW5nID0gYWx0LT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nOwotCi0JCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogJXMgZW5kcG9pbnQ6IDB4JTAyeCAobWF4IHNpemU9JXUgYnl0ZXMpXG4iLAotCQkJCQltc2d0eXBlLCBjdXJyX2UtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywKLQkJCQkJc2l6ZSk7Ci0JfQotfQotCi0vKgotICogdG02MDAwX3VzYl9wcm9iZSgpCi0gKiBjaGVja3MgZm9yIHN1cHBvcnRlZCBkZXZpY2VzCi0gKi8KLXN0YXRpYyBpbnQgdG02MDAwX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAotCQkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gTlVMTDsKLQlpbnQgaSwgcmMgPSAwOwotCWludCBuciA9IDA7Ci0JY2hhciAqc3BlZWQ7Ci0KLQl1c2JkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOwotCi0JLyogU2VsZWN0cyB0aGUgcHJvcGVyIGludGVyZmFjZSAqLwotCXJjID0gdXNiX3NldF9pbnRlcmZhY2UodXNiZGV2LCAwLCAxKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycjsKLQotCS8qIENoZWNrIHRvIHNlZSBuZXh0IGZyZWUgZGV2aWNlIGFuZCBtYXJrIGFzIHVzZWQgKi8KLQluciA9IGZpbmRfZmlyc3RfemVyb19iaXQoJnRtNjAwMF9kZXZ1c2VkLCBUTTYwMDBfTUFYQk9BUkRTKTsKLQlpZiAobnIgPj0gVE02MDAwX01BWEJPQVJEUykgewotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogU3VwcG9ydHMgb25seSAlaSB0bTYweHggYm9hcmRzLlxuIiwgVE02MDAwX01BWEJPQVJEUyk7Ci0JCXVzYl9wdXRfZGV2KHVzYmRldik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBkZXYgc3RydWN0ICovCi0JZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMCIgIjogb3V0IG9mIG1lbW9yeSFcbiIpOwotCQl1c2JfcHV0X2Rldih1c2JkZXYpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOwotCi0JLyogSW5jcmVtZW50IHVzYWdlIGNvdW50ICovCi0JdG02MDAwX2RldnVzZWQgfD0gMTw8bnI7Ci0Jc25wcmludGYoZGV2LT5uYW1lLCAyOSwgInRtNjAwMCAjJWQiLCBucik7Ci0KLQlkZXYtPm1vZGVsID0gaWQtPmRyaXZlcl9pbmZvOwotCWlmICgoY2FyZFtucl0gPj0gMCkgJiYgKGNhcmRbbnJdIDwgQVJSQVlfU0laRSh0bTYwMDBfYm9hcmRzKSkpCi0JCWRldi0+bW9kZWwgPSBjYXJkW25yXTsKLQotCWRldi0+dWRldiA9IHVzYmRldjsKLQlkZXYtPmRldm5vID0gbnI7Ci0KLQlzd2l0Y2ggKHVzYmRldi0+c3BlZWQpIHsKLQljYXNlIFVTQl9TUEVFRF9MT1c6Ci0JCXNwZWVkID0gIjEuNSI7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NQRUVEX1VOS05PV046Ci0JY2FzZSBVU0JfU1BFRURfRlVMTDoKLQkJc3BlZWQgPSAiMTIiOwotCQlicmVhazsKLQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQlzcGVlZCA9ICI0ODAiOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzcGVlZCA9ICJ1bmtub3duIjsKLQl9Ci0KLQotCi0JLyogR2V0IGVuZHBvaW50cyAqLwotCWZvciAoaSA9IDA7IGkgPCBpbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nOyBpKyspIHsKLQkJaW50IGVwOwotCi0JCWZvciAoZXAgPSAwOyBlcCA8IGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5kZXNjLmJOdW1FbmRwb2ludHM7IGVwKyspIHsKLQkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludAkqZTsKLQkJCWludCBkaXJfb3V0OwotCi0JCQllID0gJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5lbmRwb2ludFtlcF07Ci0KLQkJCWRpcl9vdXQgPSAoKGUtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmCi0JCQkJCVVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpOwotCi0JCQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IGFsdCAlZCwgaW50ZXJmYWNlICVpLCBjbGFzcyAlaVxuIiwKLQkJCSAgICAgICBpLAotCQkJICAgICAgIGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCi0JCQkgICAgICAgaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLmRlc2MuYkludGVyZmFjZUNsYXNzKTsKLQotCQkJc3dpdGNoIChlLT5kZXNjLmJtQXR0cmlidXRlcykgewotCQkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgotCQkJCWlmICghZGlyX291dCkgewotCQkJCQlnZXRfbWF4X2VuZHBvaW50KHVzYmRldiwKLQkJCQkJCQkgJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSwKLQkJCQkJCQkgIkJ1bGsgSU4iLCBlLAotCQkJCQkJCSAmZGV2LT5idWxrX2luKTsKLQkJCQl9IGVsc2UgewotCQkJCQlnZXRfbWF4X2VuZHBvaW50KHVzYmRldiwKLQkJCQkJCQkgJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSwKLQkJCQkJCQkgIkJ1bGsgT1VUIiwgZSwKLQkJCQkJCQkgJmRldi0+YnVsa19vdXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSVNPQzoKLQkJCQlpZiAoIWRpcl9vdXQpIHsKLQkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCi0JCQkJCQkJICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCi0JCQkJCQkJICJJU09DIElOIiwgZSwKLQkJCQkJCQkgJmRldi0+aXNvY19pbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCi0JCQkJCQkJICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCi0JCQkJCQkJICJJU09DIE9VVCIsIGUsCi0JCQkJCQkJICZkZXYtPmlzb2Nfb3V0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKLQkJCQlpZiAoIWRpcl9vdXQpIHsKLQkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCi0JCQkJCQkJJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSwKLQkJCQkJCQkiSU5UIElOIiwgZSwKLQkJCQkJCQkmZGV2LT5pbnRfaW4pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWdldF9tYXhfZW5kcG9pbnQodXNiZGV2LAotCQkJCQkJCSZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCi0JCQkJCQkJIklOVCBPVVQiLCBlLAotCQkJCQkJCSZkZXYtPmludF9vdXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBOZXcgdmlkZW8gZGV2aWNlIEAgJXMgTWJwcyAoJTA0eDolMDR4LCBpZm51bSAlZClcbiIsCi0JCXNwZWVkLAotCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAotCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKLQkJaW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwotCi0vKiBjaGVjayBpZiB0aGUgdGhlIGRldmljZSBoYXMgdGhlIGlzbyBpbiBlbmRwb2ludCBhdCB0aGUgY29ycmVjdCBwbGFjZSAqLwotCWlmICghZGV2LT5pc29jX2luLmVuZHApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IHByb2JpbmcgZXJyb3I6IG5vIElOIElTT0MgZW5kcG9pbnQhXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCi0JCWdvdG8gZXJyOwotCX0KLQotCS8qIHNhdmUgb3VyIGRhdGEgcG9pbnRlciBpbiB0aGlzIGludGVyZmFjZSBkZXZpY2UgKi8KLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKLQotCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogRm91bmQgJXNcbiIsIHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0ubmFtZSk7Ci0KLQlyYyA9IHRtNjAwMF9pbml0X2RldihkZXYpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBlcnI7Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBFcnJvciAlZCB3aGlsZSByZWdpc3RlcmluZ1xuIiwgcmMpOwotCi0JdG02MDAwX2RldnVzZWQgJj0gfigxPDxucik7Ci0JdXNiX3B1dF9kZXYodXNiZGV2KTsKLQotCWtmcmVlKGRldik7Ci0JcmV0dXJuIHJjOwotfQotCi0vKgotICogdG02MDAwX3VzYl9kaXNjb25uZWN0KCkKLSAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaWNvbmVuY3RlZAotICogdmlkZW8gZGV2aWNlIHdpbGwgYmUgdW5yZWdpc3RlcmVkIG9uIHY0bDJfY2xvc2UgaW4gY2FzZSBpdCBpcyBzdGlsbCBvcGVuCi0gKi8KLXN0YXRpYyB2b2lkIHRtNjAwMF91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLQotCWlmICghZGV2KQotCQlyZXR1cm47Ci0KLQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IGRpc2Nvbm5lY3RpbmcgJXNcbiIsIGRldi0+bmFtZSk7Ci0KLQl0bTYwMDBfaXJfZmluaShkZXYpOwotCi0JaWYgKGRldi0+Z3Bpby5wb3dlcl9sZWQpIHsKLQkJc3dpdGNoIChkZXYtPm1vZGVsKSB7Ci0JCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgotCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKLQkJY2FzZSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMToKLQkJCS8qIFBvd2VyIGxlZCBvZmYgKi8KLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKLQkJCW1zbGVlcCgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUjoKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVI6Ci0JCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURToKLQkJCS8qIFBvd2VyIGxlZCBvZmYgKi8KLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAwKTsKLQkJCW1zbGVlcCgxNSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQl0bTYwMDBfdjRsMl91bnJlZ2lzdGVyKGRldik7Ci0KLQl0bTYwMDBfaTJjX3VucmVnaXN0ZXIoZGV2KTsKLQotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOwotCi0JZGV2LT5zdGF0ZSB8PSBERVZfRElTQ09OTkVDVEVEOwotCi0JdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKLQotCXRtNjAwMF9jbG9zZV9leHRlbnNpb24oZGV2KTsKLQl0bTYwMDBfcmVtb3ZlX2Zyb21fZGV2bGlzdChkZXYpOwotCi0Ja2ZyZWUoZGV2KTsKLX0KLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHRtNjAwMF91c2JfZHJpdmVyID0gewotCQkubmFtZSA9ICJ0bTYwMDAiLAotCQkucHJvYmUgPSB0bTYwMDBfdXNiX3Byb2JlLAotCQkuZGlzY29ubmVjdCA9IHRtNjAwMF91c2JfZGlzY29ubmVjdCwKLQkJLmlkX3RhYmxlID0gdG02MDAwX2lkX3RhYmxlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdG02MDAwX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQotCXByaW50ayhLRVJOX0lORk8gInRtNjAwMCIgIiB2NGwyIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKFRNNjAwMF9WRVJTSU9OICA+PiAxNikgJiAweGZmLAotCSAgICAgICAoVE02MDAwX1ZFUlNJT04gID4+IDgpICYgMHhmZiwgVE02MDAwX1ZFUlNJT04gICYgMHhmZik7Ci0KLQkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCi0JcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZ0bTYwMDBfdXNiX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCkKLQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDAiCi0JCQkgICAiIHVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZC5cbiIsIHJlc3VsdCk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdG02MDAwX21vZHVsZV9leGl0KHZvaWQpCi17Ci0JLyogZGVyZWdpc3RlciBhdCBVU0Igc3Vic3lzdGVtICovCi0JdXNiX2RlcmVnaXN0ZXIoJnRtNjAwMF91c2JfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQodG02MDAwX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KHRtNjAwMF9tb2R1bGVfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiVHJpZGVudCBUVk1hc3RlciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IyIGFkYXB0ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ViMmUyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDkwOSArMCwwIEBACi0vKgotICogIHRtNjAwMC1jb3JlLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Ci0gKgotICogIENvcHlyaWdodCAoQykgMjAwNyBNaWNoZWwgTHVkd2lnIDxtaWNoZWwubHVkd2lnQGdtYWlsLmNvbT4KLSAqICAgICAgLSBEVkItVCBzdXBwb3J0Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlICJ0bTYwMDAuaCIKLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KLQotI2RlZmluZSBVU0JfVElNRU9VVAkoNSAqIEhaKSAvKiBtcyAqLwotCi1pbnQgdG02MDAwX3JlYWRfd3JpdGVfdXNiKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXFfdHlwZSwgdTggcmVxLAotCQkJICB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdTggKmJ1ZiwgdTE2IGxlbikKLXsKLQlpbnQgICAgICAgICAgcmV0LCBpOwotCXVuc2lnbmVkIGludCBwaXBlOwotCXU4CSAgICAgKmRhdGEgPSBOVUxMOwotCi0JaWYgKGxlbikKLQkJZGF0YSA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQotCi0JaWYgKHJlcV90eXBlICYgVVNCX0RJUl9JTikKLQkJcGlwZSA9IHVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApOwotCWVsc2UgewotCQlwaXBlID0gdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCk7Ci0JCW1lbWNweShkYXRhLCBidWYsIGxlbik7Ci0JfQotCi0JaWYgKHRtNjAwMF9kZWJ1ZyAmIFY0TDJfREVCVUdfSTJDKSB7Ci0JCXByaW50aygiKGRldiAlcCwgcGlwZSAlMDh4KTogIiwgZGV2LT51ZGV2LCBwaXBlKTsKLQotCQlwcmludGsoIiVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIiwKLQkJCShyZXFfdHlwZSAmIFVTQl9ESVJfSU4pID8gIiBJTiIgOiAiT1VUIiwKLQkJCXJlcV90eXBlLCByZXEsIHZhbHVlJjB4ZmYsIHZhbHVlPj44LCBpbmRleCYweGZmLAotCQkJaW5kZXg+PjgsIGxlbiYweGZmLCBsZW4+PjgpOwotCi0JCWlmICghKHJlcV90eXBlICYgVVNCX0RJUl9JTikpIHsKLQkJCXByaW50aygiPj4+ICIpOwotCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJCXByaW50aygiICUwMngiLCBidWZbaV0pOwotCQlwcmludGsoIlxuIik7Ci0JCX0KLQl9Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCBwaXBlLCByZXEsIHJlcV90eXBlLCB2YWx1ZSwgaW5kZXgsCi0JCQkgICAgICBkYXRhLCBsZW4sIFVTQl9USU1FT1VUKTsKLQotCWlmIChyZXFfdHlwZSAmICBVU0JfRElSX0lOKQotCQltZW1jcHkoYnVmLCBkYXRhLCBsZW4pOwotCi0JaWYgKHRtNjAwMF9kZWJ1ZyAmIFY0TDJfREVCVUdfSTJDKSB7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlpZiAocmVxX3R5cGUgJiAgVVNCX0RJUl9JTikKLQkJCQlwcmludGsoIjw8PCAobGVuPSVkKVxuIiwgbGVuKTsKLQotCQkJcHJpbnRrKCIlczogRXJyb3IgIyVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0JCX0gZWxzZSBpZiAocmVxX3R5cGUgJiAgVVNCX0RJUl9JTikgewotCQkJcHJpbnRrKCI8PDwgIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJcHJpbnRrKCIgJTAyeCIsIGJ1ZltpXSk7Ci0JCQlwcmludGsoIlxuIik7Ci0JCX0KLQl9Ci0KLQlrZnJlZShkYXRhKTsKLQotCW1zbGVlcCg1KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB0bTYwMDBfc2V0X3JlZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKLXsKLQlyZXR1cm4KLQkJdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IsCi0JCQkJICAgICAgcmVxLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDApOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3NldF9yZWcpOwotCi1pbnQgdG02MDAwX2dldF9yZWcoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCi17Ci0JaW50IHJjOwotCXU4IGJ1ZlsxXTsKLQotCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiwgcmVxLAotCQkJCQl2YWx1ZSwgaW5kZXgsIGJ1ZiwgMSk7Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gKmJ1ZjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHRtNjAwMF9nZXRfcmVnKTsKLQotaW50IHRtNjAwMF9zZXRfcmVnX21hc2soc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLAotCQkJCQkJdTE2IGluZGV4LCB1MTYgbWFzaykKLXsKLQlpbnQgcmM7Ci0JdTggYnVmWzFdOwotCXU4IG5ld19pbmRleDsKLQotCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiwgcmVxLAotCQkJCQl2YWx1ZSwgaW5kZXgsIGJ1ZiwgMSk7Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQluZXdfaW5kZXggPSAoYnVmWzBdICYgfm1hc2spIHwgKGluZGV4ICYgbWFzayk7Ci0KLQlpZiAobmV3X2luZGV4ID09IGluZGV4KQotCQlyZXR1cm4gMDsKLQotCXJldHVybiB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiwKLQkJCQkgICAgICByZXEsIHZhbHVlLCBuZXdfaW5kZXgsIE5VTEwsIDApOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3NldF9yZWdfbWFzayk7Ci0KLWludCB0bTYwMDBfZ2V0X3JlZzE2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQotewotCWludCByYzsKLQl1OCBidWZbMl07Ci0KLQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsIHJlcSwKLQkJCQkJdmFsdWUsIGluZGV4LCBidWYsIDIpOwotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIGJ1ZlsxXXxidWZbMF08PDg7Ci19Ci0KLWludCB0bTYwMDBfZ2V0X3JlZzMyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQotewotCWludCByYzsKLQl1OCBidWZbNF07Ci0KLQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsIHJlcSwKLQkJCQkJdmFsdWUsIGluZGV4LCBidWYsIDQpOwotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIGJ1ZlszXSB8IGJ1ZlsyXSA8PCA4IHwgYnVmWzFdIDw8IDE2IHwgYnVmWzBdIDw8IDI0OwotfQotCi1pbnQgdG02MDAwX2kyY19yZXNldChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTE2IHRzbGVlcCkKLXsKLQlpbnQgcmM7Ci0KLQlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgVE02MDAwX0dQSU9fQ0xLLCAwKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQltc2xlZXAodHNsZWVwKTsKLQotCXJjID0gdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBUTTYwMDBfR1BJT19DTEssIDEpOwotCW1zbGVlcCh0c2xlZXApOwotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIHRtNjAwMF9zZXRfZm91cmNjX2Zvcm1hdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKLQkJaW50IHZhbDsKLQotCQl2YWwgPSB0bTYwMDBfZ2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX1ZJREVPX0lGLCAwKSAmIDB4ZmM7Ci0JCWlmIChkZXYtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfVVlWWSkKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfVklERU9fSUYsIHZhbCk7Ci0JCWVsc2UKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfVklERU9fSUYsIHZhbCB8IDEpOwotCX0gZWxzZSB7Ci0JCWlmIChkZXYtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfVVlWWSkKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMV9UUkVTSE9MRCwgMHhkMCk7Ci0JCWVsc2UKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMV9UUkVTSE9MRCwgMHg5MCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0bTYwMDBfc2V0X3ZiaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQkvKgotCSAqIEZJWE1FOgotCSAqIFZCSSBsaW5lcyBhbmQgc3RhcnQvZW5kIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiA2MEh6IGFuZCA1MEh6Ci0JICogU28sIGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGNvbmZpZyB0bwotCSAqIHNvbWV0aGluZyB0aGF0IHRha2VzIGl0IGludG8gYWNjb3VudCwgZG9pbmcgc29tZXRoaW5nIGRpZmZlcmVudAotCSAqIGlmIChkZXYtPm5vcm0gJiBWNEwyX1NURF81MjVfNjApCi0JICovCi0KLQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjQxX1RFTEVURVhUX1ZCSV9DT0RFMSwgMHgyNyk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I0Ml9WQklfREFUQV9ISUdIX0xFVkVMLCAweDU1KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjQzX1ZCSV9EQVRBX1RZUEVfTElORTcsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNDRfVkJJX0RBVEFfVFlQRV9MSU5FOCwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I0NV9WQklfREFUQV9UWVBFX0xJTkU5LCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I0Nl9WQklfREFUQV9UWVBFX0xJTkUxMCwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNDdfVkJJX0RBVEFfVFlQRV9MSU5FMTEsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjQ4X1ZCSV9EQVRBX1RZUEVfTElORTEyLCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I0OV9WQklfREFUQV9UWVBFX0xJTkUxMywgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNEFfVkJJX0RBVEFfVFlQRV9MSU5FMTQsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjRCX1ZCSV9EQVRBX1RZUEVfTElORTE1LCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I0Q19WQklfREFUQV9UWVBFX0xJTkUxNiwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNERfVkJJX0RBVEFfVFlQRV9MSU5FMTcsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjRFX1ZCSV9EQVRBX1RZUEVfTElORTE4LCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I0Rl9WQklfREFUQV9UWVBFX0xJTkUxOSwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNTBfVkJJX0RBVEFfVFlQRV9MSU5FMjAsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjUxX1ZCSV9EQVRBX1RZUEVfTElORTIxLCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I1Ml9WQklfREFUQV9UWVBFX0xJTkUyMiwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNTNfVkJJX0RBVEFfVFlQRV9MSU5FMjMsIDB4MDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjU0X1ZCSV9EQVRBX1RZUEVfUkxJTkVTLCAweDAwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I1NV9WQklfTE9PUF9GSUxURVJfR0FJTiwgMHgwMSk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNTZfVkJJX0xPT1BfRklMVEVSX0lfR0FJTiwgMHgwMCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNTdfVkJJX0xPT1BfRklMVEVSX1BfR0FJTiwgMHgwMik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I1OF9WQklfQ0FQVElPTl9EVE8xLCAweDM1KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjU5X1ZCSV9DQVBUSU9OX0RUTzAsIDB4YTApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNUFfVkJJX1RFTEVURVhUX0RUTzEsIDB4MTEpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNUJfVkJJX1RFTEVURVhUX0RUTzAsIDB4NGMpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNDBfVEVMRVRFWFRfVkJJX0NPREUwLCAweDAxKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwKTsKLQl9Ci19Ci0KLWludCB0bTYwMDBfaW5pdF9hbmFsb2dfbW9kZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgZjsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgewotCQkvKiBFbmFibGUgdmlkZW8gYW5kIGF1ZGlvICovCi0JCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9WSURFT19JRiwKLQkJCQkJCQkweDYwLCAweDYwKTsKLQkJLyogRGlzYWJsZSBUUyBpbnB1dCAqLwotCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLAotCQkJCQkJCTB4MDAsIDB4NDApOwotCX0gZWxzZSB7Ci0JCS8qIEVuYWJsZXMgc29mdCByZXNldCAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEpOwotCi0JCWlmIChkZXYtPnNjYWxlcikKLQkJCS8qIERpc2FibGUgSGZpbHRlciBhbmQgRW5hYmxlIFRTIERyb3AgZXJyICovCi0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwgMHgyMCk7Ci0JCWVsc2UJLyogRW5hYmxlIEhmaWx0ZXIgYW5kIGRpc2FibGUgVFMgRHJvcCBlcnIgKi8KLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLCAweDgwKTsKLQotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMSwgMHg4OCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JEQV9DTEtfU0VMLCAweDIzKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQxX0FERFJfRk9SX1JFUTEsIDB4YzApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDJfQUREUl9GT1JfUkVRMiwgMHhkOCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JENl9FTkRQX1JFUTFfUkVRMiwgMHgwNik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JERl9QV0RPV05fQUNMSywgMHgxZik7Ci0KLQkJLyogQVAgU29mdHdhcmUgcmVzZXQgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDgpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRkZfU09GVF9SRVNFVCwgMHgwMCk7Ci0KLQkJdG02MDAwX3NldF9mb3VyY2NfZm9ybWF0KGRldik7Ci0KLQkJLyogRGlzYWJsZXMgc29mdCByZXNldCAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDApOwotCX0KLQltc2xlZXAoMjApOwotCi0JLyogVHVuZXIgZmlybXdhcmUgY2FuIG5vdyBiZSBsb2FkZWQgKi8KLQotCS8qCi0JICogRklYTUU6IFRoaXMgaXMgYSBoYWNrISB4YzMwMjggInNsZWVwcyIgd2hlbiBubyBjaGFubmVsIGlzIGRldGVjdGVkCi0JICogZm9yIG1vcmUgdGhhbiBhIGZldyBzZWNvbmRzLiBOb3Qgc3VyZSB3aHksIGFzIHRoaXMgYmVoYXZpb3IgZG9lcwotCSAqIG5vdCBoYXBwZW4gb24gb3RoZXIgZGV2aWNlcyB3aXRoIHhjMzAyOC4gU28sIEkgc3VzcGVjdCB0aGF0IGl0Ci0JICogaXMgeWV0IGFub3RoZXIgYnVnIGF0IHRtNjAwMC4gQWZ0ZXIgc3RhcnQgc2xlZXBpbmcsIGRlY29kaW5nIAotCSAqIGRvZXNuJ3Qgc3RhcnQgYXV0b21hdGljYWxseS4gSW5zdGVhZCwgaXQgcmVxdWlyZXMgc29tZQotCSAqIEkyQyBjb21tYW5kcyB0byB3YWtlIGl0IHVwLiBBcyB3ZSB3YW50IHRvIGhhdmUgaW1hZ2UgYXQgdGhlCi0JICogYmVnaW5uaW5nLCB3ZSBuZWVkZWQgdG8gYWRkIHRoaXMgaGFjay4gVGhlIGJldHRlciB3b3VsZCBiZSB0bwotCSAqIGRpc2NvdmVyIHNvbWUgd2F5IHRvIG1ha2UgdG02MDAwIHRvIHdha2UgdXAgd2l0aG91dCB0aGlzIGhhY2suCi0JICovCi0JZi5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7Ci0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgJmYpOwotCi0JbXNsZWVwKDEwMCk7Ci0JdG02MDAwX3NldF9zdGFuZGFyZChkZXYpOwotCXRtNjAwMF9zZXRfdmJpKGRldik7Ci0JdG02MDAwX3NldF9hdWRpb19iaXRyYXRlKGRldiwgNDgwMDApOwotCi0JLyogc3dpdGNoIGR2YiBsZWQgb2ZmICovCi0JaWYgKGRldi0+Z3Bpby5kdmJfbGVkKSB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCWRldi0+Z3Bpby5kdmJfbGVkLCAweDAxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHRtNjAwMF9pbml0X2RpZ2l0YWxfbW9kZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKLQkJLyogRGlzYWJsZSB2aWRlbyBhbmQgYXVkaW8gKi8KLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX1ZJREVPX0lGLAotCQkJCTB4MDAsIDB4NjApOwotCQkvKiBFbmFibGUgVFMgaW5wdXQgKi8KLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwKLQkJCQkweDQwLCAweDQwKTsKLQkJLyogYWxsIHBvd2VyIGRvd24sIGJ1dCBub3QgdGhlIGRpZ2l0YWwgZGF0YSBwb3J0ICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JGRV9QT1dFUl9ET1dOLCAweDI4KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEsIDB4ZmMpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTZfUE9XRVJfRE9XTl9DVFJMMiwgMHhmZik7Ci0JfSBlbHNlICB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JGRl9TT0ZUX1JFU0VULCAweDA4KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SREZfUFdET1dOX0FDTEssIDB4MDgpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRTJfVkFEQ19TVEFUVVNfQ1RMLCAweDBjKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkU4X1ZBRENfUFdET1dOX0NUTCwgMHhmZik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwgMHhkOCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLCAweDQwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMxX1RSRVNIT0xELCAweGQwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMzX0hTVEFSVDEsIDB4MDkpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SREFfQ0xLX1NFTCwgMHgzNyk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEMV9BRERSX0ZPUl9SRVExLCAweGQ4KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQyX0FERFJfRk9SX1JFUTIsIDB4YzApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDZfRU5EUF9SRVExX1JFUTIsIDB4NjApOwotCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFMl9WQURDX1NUQVRVU19DVEwsIDB4MGMpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweGZmKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLCAweDA4KTsKLQkJbXNsZWVwKDUwKTsKLQotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsIDB4MDAyMCwgMHgwMCk7Ci0JCW1zbGVlcCg1MCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMHgwMDIwLCAweDAxKTsKLQkJbXNsZWVwKDUwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAweDAwMjAsIDB4MDApOwotCQltc2xlZXAoMTAwKTsKLQl9Ci0KLQkvKiBzd2l0Y2ggZHZiIGxlZCBvbiAqLwotCWlmIChkZXYtPmdwaW8uZHZiX2xlZCkgewotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQlkZXYtPmdwaW8uZHZiX2xlZCwgMHgwMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHRtNjAwMF9pbml0X2RpZ2l0YWxfbW9kZSk7Ci0KLXN0cnVjdCByZWdfaW5pdCB7Ci0JdTggcmVxOwotCXU4IHJlZzsKLQl1OCB2YWw7Ci19OwotCi0vKiBUaGUgbWVhbmluZyBvZiB0aG9zZSBpbml0aWFsaXphdGlvbnMgYXJlIHVua25vd24gKi8KLXN0cnVjdCByZWdfaW5pdCB0bTYwMDBfaW5pdF90YWJbXSA9IHsKLQkvKiBSRUcgIFZBTFVFICovCi0JeyBUTTYwMDBfUkVRMDdfUkRGX1BXRE9XTl9BQ0xLLCAweDFmIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDggfSwKLQl7IFRNNjAxMF9SRVEwN19SRkZfU09GVF9SRVNFVCwgMHgwMCB9LAotCXsgVE02MDEwX1JFUTA3X1JENV9QT1dFUlNBVkUsIDB4NGYgfSwKLQl7IFRNNjAwMF9SRVEwN19SREFfQ0xLX1NFTCwgMHgyMyB9LAotCXsgVE02MDAwX1JFUTA3X1JEQl9PVVRfU0VMLCAweDA4IH0sCi0JeyBUTTYwMDBfUkVRMDdfUkUyX1ZBRENfU1RBVFVTX0NUTCwgMHgwMCB9LAotCXsgVE02MDAwX1JFUTA3X1JFM19WQURDX0lOUF9MUEZfU0VMMSwgMHgxMCB9LAotCXsgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMiwgMHgwMCB9LAotCXsgVE02MDAwX1JFUTA3X1JFOF9WQURDX1BXRE9XTl9DVEwsIDB4MDAgfSwKLQl7IFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUsIDB4NjQgfSwJLyogNDgwMDAgYml0cy9zYW1wbGUsIGV4dGVybmFsIGlucHV0ICovCi0JeyBUTTYwMDBfUkVRMDdfUkVFX1ZBRENfQ1RSTF9TRUxfQ09OVFJPTCwgMHhjMiB9LAotCi0JeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCQkvKiBTdGFydCBvZiBzb2Z0IHJlc2V0ICovCi0JeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDAwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDA3IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjA1X05PSVNFX1RIUkVTSE9MRCwgMHg2NCB9LAotCXsgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgwMSB9LAotCXsgVE02MDEwX1JFUTA3X1IwOF9MVU1BX0NPTlRSQVNUX0FESiwgMHg4MiB9LAotCXsgVE02MDEwX1JFUTA3X1IwOV9MVU1BX0JSSUdIVE5FU1NfQURKLCAweDM2IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjBBX0NIUk9NQV9TQVRVUkFUSU9OX0FESiwgMHg1MCB9LAotCXsgVE02MDEwX1JFUTA3X1IwQ19DSFJPTUFfQUdDX0NPTlRST0wsIDB4NmEgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTFfQUdDX1BFQUtfQ09OVFJPTCwgMHhjOSB9LAotCXsgVE02MDEwX1JFUTA3X1IxMl9BR0NfR0FURV9TVEFSVEgsIDB4MDcgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTNfQUdDX0dBVEVfU1RBUlRMLCAweDNiIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjE0X0FHQ19HQVRFX1dJRFRILCAweDQ3IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjE1X0FHQ19CUF9ERUxBWSwgMHg2ZiB9LAotCXsgVE02MDEwX1JFUTA3X1IxN19ITE9PUF9NQVhTVEFURSwgMHhjZCB9LAotCXsgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWUgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDhiIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhhMiB9LAotCXsgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTkgfSwKLQl7IFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWMgfSwKLQl7IFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2MgfSwKLQl7IFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2MgfSwKLQl7IFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2QgfSwKLQl7IFRNNjAxMF9SRVEwN19SMjBfSFNZTkNfUklTSU5HX0VER0VfVElNRSwgMHgzYyB9LAotCXsgVE02MDEwX1JFUTA3X1IyMV9IU1lOQ19QSEFTRV9PRkZTRVQsIDB4M2MgfSwKLQl7IFRNNjAxMF9SRVEwN19SMkRfQ0hST01BX0JVUlNUX0VORCwgMHg0OCB9LAotCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjIgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHg2MSB9LAotCXsgVE02MDEwX1JFUTA3X1IzMl9WU1lOQ19ITE9DS19NSU4sIDB4NzQgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDFjIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjM0X1ZTWU5DX0FHQ19NSU4sIDB4NzQgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAotCXsgVE02MDEwX1JFUTA3X1IzNl9WU1lOQ19WQklfTUlOLCAweDdhIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjM3X1ZTWU5DX1ZCSV9NQVgsIDB4MjYgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzhfVlNZTkNfVEhSRVNIT0xELCAweDQwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjM5X1ZTWU5DX1RJTUVfQ09OU1RBTlQsIDB4MGEgfSwKLQl7IFRNNjAxMF9SRVEwN19SNDJfVkJJX0RBVEFfSElHSF9MRVZFTCwgMHg1NSB9LAotCXsgVE02MDEwX1JFUTA3X1I1MV9WQklfREFUQV9UWVBFX0xJTkUyMSwgMHgxMSB9LAotCXsgVE02MDEwX1JFUTA3X1I1NV9WQklfTE9PUF9GSUxURVJfR0FJTiwgMHgwMSB9LAotCXsgVE02MDEwX1JFUTA3X1I1N19WQklfTE9PUF9GSUxURVJfUF9HQUlOLCAweDAyIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjU4X1ZCSV9DQVBUSU9OX0RUTzEsIDB4MzUgfSwKLQl7IFRNNjAxMF9SRVEwN19SNTlfVkJJX0NBUFRJT05fRFRPMCwgMHhhMCB9LAotCXsgVE02MDEwX1JFUTA3X1I4MF9DT01CX0ZJTFRFUl9UUkVTSE9MRCwgMHgxNSB9LAotCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NDIgfSwKLQl7IFRNNjAxMF9SRVEwN19SQzFfVFJFU0hPTEQsIDB4ZDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMSwgMHg4OCB9LAotCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCB9LAkJLyogRW5kIG9mIHRoZSBzb2Z0IHJlc2V0ICovCi0JeyBUTTYwMTBfUkVRMDVfUjE4X0lNQVNLNywgMHgwMCB9LAotfTsKLQotc3RydWN0IHJlZ19pbml0IHRtNjAxMF9pbml0X3RhYltdID0gewotCXsgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLCAweDAwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkM0X0hTVEFSVDAsIDB4YTAgfSwKLQl7IFRNNjAxMF9SRVEwN19SQzZfSEVORDAsIDB4NDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SQ0FfVkVORDAsIDB4MzEgfSwKLQl7IFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX1ZJREVPX0lGLCAweGUxIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkUwX0RWSURFT19TT1VSQ0UsIDB4MDMgfSwKLQl7IFRNNjAxMF9SRVEwN19SRkVfUE9XRVJfRE9XTiwgMHg3ZiB9LAotCi0JeyBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEsIDB4ZjAgfSwKLQl7IFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwsIDB4ZjQgfSwKLQl7IFRNNjAxMF9SRVEwOF9SRTRfQURDX0lOMl9TRUwsIDB4ZjggfSwKLQl7IFRNNjAxMF9SRVEwOF9SRTZfUE9XRVJfRE9XTl9DVFJMMiwgMHgwMCB9LAotCXsgVE02MDEwX1JFUTA4X1JFQV9CVUZGX0RSVl9DVFJMLCAweGYyIH0sCi0JeyBUTTYwMTBfUkVRMDhfUkVCX1NJRl9HQUlOX0NUUkwsIDB4ZjAgfSwKLQl7IFRNNjAxMF9SRVEwOF9SRUNfUkVWRVJTRV9ZQ19DVFJMLCAweGMyIH0sCi0JeyBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcsIDB4NjAgfSwKLQl7IFRNNjAxMF9SRVEwOF9SRjFfQUFEQ19QT1dFUl9ET1dOLCAweGZjIH0sCi0KLQl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MDcgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWYgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDVfTk9JU0VfVEhSRVNIT0xELCAweDY0IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDAxIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjA4X0xVTUFfQ09OVFJBU1RfQURKLCAweDgyIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjA5X0xVTUFfQlJJR0hUTkVTU19BREosIDB4MzYgfSwKLQl7IFRNNjAxMF9SRVEwN19SMEFfQ0hST01BX1NBVFVSQVRJT05fQURKLCAweDUwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjBDX0NIUk9NQV9BR0NfQ09OVFJPTCwgMHg2YSB9LAotCXsgVE02MDEwX1JFUTA3X1IxMV9BR0NfUEVBS19DT05UUk9MLCAweGM5IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjEyX0FHQ19HQVRFX1NUQVJUSCwgMHgwNyB9LAotCXsgVE02MDEwX1JFUTA3X1IxM19BR0NfR0FURV9TVEFSVEwsIDB4M2IgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTRfQUdDX0dBVEVfV0lEVEgsIDB4NDcgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTVfQUdDX0JQX0RFTEFZLCAweDZmIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjE3X0hMT09QX01BWFNUQVRFLCAweGNkIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZSB9LAotCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OGIgfSwKLQl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweGEyIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHhlOSB9LAotCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAotCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAotCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAotCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAotCXsgVE02MDEwX1JFUTA3X1IyMF9IU1lOQ19SSVNJTkdfRURHRV9USU1FLCAweDNjIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjIxX0hTWU5DX1BIQVNFX09GRlNFVCwgMHgzYyB9LAotCXsgVE02MDEwX1JFUTA3X1IyRF9DSFJPTUFfQlVSU1RfRU5ELCAweDQ4IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4ODggfSwKLQl7IFRNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyMiB9LAotCXsgVE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweDYxIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjMyX1ZTWU5DX0hMT0NLX01JTiwgMHg3NCB9LAotCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MWMgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzRfVlNZTkNfQUdDX01JTiwgMHg3NCB9LAotCXsgVE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjM2X1ZTWU5DX1ZCSV9NSU4sIDB4N2EgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzdfVlNZTkNfVkJJX01BWCwgMHgyNiB9LAotCXsgVE02MDEwX1JFUTA3X1IzOF9WU1lOQ19USFJFU0hPTEQsIDB4NDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzlfVlNZTkNfVElNRV9DT05TVEFOVCwgMHgwYSB9LAotCXsgVE02MDEwX1JFUTA3X1I0Ml9WQklfREFUQV9ISUdIX0xFVkVMLCAweDU1IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjUxX1ZCSV9EQVRBX1RZUEVfTElORTIxLCAweDExIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjU1X1ZCSV9MT09QX0ZJTFRFUl9HQUlOLCAweDAxIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjU3X1ZCSV9MT09QX0ZJTFRFUl9QX0dBSU4sIDB4MDIgfSwKLQl7IFRNNjAxMF9SRVEwN19SNThfVkJJX0NBUFRJT05fRFRPMSwgMHgzNSB9LAotCXsgVE02MDEwX1JFUTA3X1I1OV9WQklfQ0FQVElPTl9EVE8wLCAweGEwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjgwX0NPTUJfRklMVEVSX1RSRVNIT0xELCAweDE1IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg0MiB9LAotCXsgVE02MDEwX1JFUTA3X1JDMV9UUkVTSE9MRCwgMHhkMCB9LAotCXsgVE02MDEwX1JFUTA3X1JDM19IU1RBUlQxLCAweDg4IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCi0KLQl7IFRNNjAxMF9SRVEwNV9SMThfSU1BU0s3LCAweDAwIH0sCi0KLQl7IFRNNjAxMF9SRVEwN19SRDhfSVJfTEVBREVSMSwgMHhhYSB9LAotCXsgVE02MDEwX1JFUTA3X1JEOF9JUl9MRUFERVIwLCAweDMwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkQ4X0lSX1BVTFNFX0NOVDEsIDB4MjAgfSwKLQl7IFRNNjAxMF9SRVEwN19SRDhfSVJfUFVMU0VfQ05UMCwgMHhkMCB9LAotCXsgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMHgwMiwgMHgwMCB9LAotCXsgVE02MDEwX1JFUTA3X1JEOF9JUiwgMHgyZiB9LAotCi0JLyogc2V0IHJlbW90ZSB3YWtldXAga2V5OmFueSBrZXkgd2FrZXVwICovCi0JeyBUTTYwMTBfUkVRMDdfUkU1X1JFTU9URV9XQUtFVVAsICAweGZlIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9TRUwsICAweGZmIH0sCi19OwotCi1pbnQgdG02MDAwX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IGJvYXJkLCByYyA9IDAsIGksIHNpemU7Ci0Jc3RydWN0IHJlZ19pbml0ICp0YWI7Ci0KLQkvKiBDaGVjayBib2FyZCByZXZpc2lvbiAqLwotCWJvYXJkID0gdG02MDAwX2dldF9yZWczMihkZXYsIFJFUV80MF9HRVRfVkVSU0lPTiwgMCwgMCk7Ci0JaWYgKGJvYXJkID49IDApIHsKLQkJc3dpdGNoIChib2FyZCAmIDB4ZmYpIHsKLQkJY2FzZSAweGYzOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgdG02MDAwXG4iKTsKLQkJCWlmIChkZXYtPmRldl90eXBlICE9IFRNNjAwMCkKLQkJCQlkZXYtPmRldl90eXBlID0gVE02MDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHhmNDoKLQkJCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIHRtNjAxMFxuIik7Ci0JCQlpZiAoZGV2LT5kZXZfdHlwZSAhPSBUTTYwMTApCi0JCQkJZGV2LT5kZXZfdHlwZSA9IFRNNjAxMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBib2FyZCB2ZXJzaW9uID0gMHglMDh4XG4iLCBib2FyZCk7Ci0JCX0KLQl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSB3aGlsZSByZXRyaWV2aW5nIGJvYXJkIHZlcnNpb25cbiIsIGJvYXJkKTsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgewotCQl0YWIgPSB0bTYwMTBfaW5pdF90YWI7Ci0JCXNpemUgPSBBUlJBWV9TSVpFKHRtNjAxMF9pbml0X3RhYik7Ci0JfSBlbHNlIHsKLQkJdGFiID0gdG02MDAwX2luaXRfdGFiOwotCQlzaXplID0gQVJSQVlfU0laRSh0bTYwMDBfaW5pdF90YWIpOwotCX0KLQotCS8qIExvYWQgYm9hcmQncyBpbml0aWFsaXphdGlvbiB0YWJsZSAqLwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJcmMgPSB0bTYwMDBfc2V0X3JlZyhkZXYsIHRhYltpXS5yZXEsIHRhYltpXS5yZWcsIHRhYltpXS52YWwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVpIHdoaWxlIHNldHRpbmcgcmVxICVkLCAiCi0JCQkJCSJyZWcgJWQgdG8gdmFsdWUgJWRcbiIsIHJjLAotCQkJCQl0YWJbaV0ucmVxLCB0YWJbaV0ucmVnLCB0YWJbaV0udmFsKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCW1zbGVlcCg1KTsgLyogSnVzdCB0byBiZSBjb25zZXJ2YXRpdmUgKi8KLQotCXJjID0gdG02MDAwX2NhcmRzX3NldHVwKGRldik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCB0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCBiaXRyYXRlKQotewotCWludCB2YWwgPSAwOwotCXU4IGFyZWdfZjAgPSAweDYwOyAvKiBBREMgTUNMSyA9IDI1MCBGcyAqLwotCXU4IGFyZWdfMGEgPSAweDkxOyAvKiBTSUYgNDhLSHogKi8KLQotCXN3aXRjaCAoYml0cmF0ZSkgewotCWNhc2UgNDgwMDA6Ci0JCWFyZWdfZjAgPSAweDYwOyAvKiBBREMgTUNMSyA9IDI1MCBGcyAqLwotCQlhcmVnXzBhID0gMHg5MTsgLyogU0lGIDQ4S0h6ICovCi0JCWRldi0+YXVkaW9fYml0cmF0ZSA9IGJpdHJhdGU7Ci0JCWJyZWFrOwotCWNhc2UgMzIwMDA6Ci0JCWFyZWdfZjAgPSAweDAwOyAvKiBBREMgTUNMSyA9IDM3NSBGcyAqLwotCQlhcmVnXzBhID0gMHg5MDsgLyogU0lGIDMyS0h6ICovCi0JCWRldi0+YXVkaW9fYml0cmF0ZSA9IGJpdHJhdGU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCi0JLyogZW5hYmxlIEkyUywgaWYgd2UgdXNlIHNpZiBvciBleHRlcm5hbCBJMlMgZGV2aWNlICovCi0JaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7Ci0JCXZhbCA9IHRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwQV9BX0kyU19NT0QsIGFyZWdfMGEpOwotCQlpZiAodmFsIDwgMCkKLQkJCXJldHVybiB2YWw7Ci0KLQkJdmFsID0gdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywKLQkJCQkJCQlhcmVnX2YwLCAweGYwKTsKLQkJaWYgKHZhbCA8IDApCi0JCQlyZXR1cm4gdmFsOwotCX0gZWxzZSB7Ci0JCXZhbCA9IHRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLAotCQkJCQkJCWFyZWdfZjAsIDB4ZjApOwotCQlpZiAodmFsIDwgMCkKLQkJCXJldHVybiB2YWw7Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3NldF9hdWRpb19iaXRyYXRlKTsKLQotaW50IHRtNjAwMF9zZXRfYXVkaW9fcmlucHV0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgewotCQkvKiBBdWRpbyBjcm9zc2JhciBzZXR0aW5nLCBkZWZhdWx0IFNJRjEgKi8KLQkJdTggYXJlZ19mMDsKLQotCQlzd2l0Y2ggKGRldi0+cmlucHV0LmFtdXgpIHsKLQkJY2FzZSBUTTYwMDBfQU1VWF9TSUYxOgotCQljYXNlIFRNNjAwMF9BTVVYX1NJRjI6Ci0JCQlhcmVnX2YwID0gMHgwMzsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6Ci0JCQlhcmVnX2YwID0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAwMF9BTVVYX0FEQzI6Ci0JCQlhcmVnX2YwID0gMHgwODsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAwMF9BTVVYX0kyUzoKLQkJCWFyZWdfZjAgPSAweDA0OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogYXVkaW8gaW5wdXQgZG9zbid0IHN1cHBvcnRcbiIsCi0JCQkJZGV2LT5uYW1lKTsKLQkJCXJldHVybiAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogU2V0IGF1ZGlvIGlucHV0IGNyb3NzYmFyICovCi0JCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcsCi0JCQkJCQkJYXJlZ19mMCwgMHgwZik7Ci0JfSBlbHNlIHsKLQkJdTggYXJlZ19lYjsKLQkJLyogQXVkaW8gc2V0dGluZywgZGVmYXVsdCBMSU5FMSAqLwotCQlzd2l0Y2ggKGRldi0+cmlucHV0LmFtdXgpIHsKLQkJY2FzZSBUTTYwMDBfQU1VWF9BREMxOgotCQkJYXJlZ19lYiA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMDBfQU1VWF9BREMyOgotCQkJYXJlZ19lYiA9IDB4MDQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdWRpbyBpbnB1dCBkb3NuJ3Qgc3VwcG9ydFxuIiwKLQkJCQlkZXYtPm5hbWUpOwotCQkJcmV0dXJuIDA7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBTZXQgYXVkaW8gaW5wdXQgKi8KLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUsCi0JCQkJCQkJYXJlZ19lYiwgMHgwZik7Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkIHRtNjAxMF9zZXRfbXV0ZV9zaWYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IG11dGUpCi17Ci0JdTggbXV0ZV9yZWcgPSAwOwotCi0JaWYgKG11dGUpCi0JCW11dGVfcmVnID0gMHgwODsKLQotCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUjBBX0FfSTJTX01PRCwgbXV0ZV9yZWcsIDB4MDgpOwotfQotCi12b2lkIHRtNjAxMF9zZXRfbXV0ZV9hZGMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IG11dGUpCi17Ci0JdTggbXV0ZV9yZWcgPSAwOwotCi0JaWYgKG11dGUpCi0JCW11dGVfcmVnID0gMHgyMDsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgewotCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMl9MRUZUX0NIQU5ORUxfVk9MLAotCQkJCQkJCW11dGVfcmVnLCAweDIwKTsKLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjNfUklHSFRfQ0hBTk5FTF9WT0wsCi0JCQkJCQkJbXV0ZV9yZWcsIDB4MjApOwotCX0gZWxzZSB7Ci0JCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMDBfUkVRMDdfUkVDX1ZBRENfQUFEQ19MVk9MLAotCQkJCQkJCW11dGVfcmVnLCAweDIwKTsKLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAwMF9SRVEwN19SRURfVkFEQ19BQURDX1JWT0wsCi0JCQkJCQkJbXV0ZV9yZWcsIDB4MjApOwotCX0KLX0KLQotaW50IHRtNjAwMF90dmF1ZGlvX3NldF9tdXRlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCBtdXRlKQotewotCWVudW0gdG02MDAwX211eCBtdXg7Ci0KLQlpZiAoZGV2LT5yYWRpbykKLQkJbXV4ID0gZGV2LT5yaW5wdXQuYW11eDsKLQllbHNlCi0JCW11eCA9IGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXg7Ci0KLQlzd2l0Y2ggKG11eCkgewotCWNhc2UgVE02MDAwX0FNVVhfU0lGMToKLQljYXNlIFRNNjAwMF9BTVVYX1NJRjI6Ci0JCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKLQkJCXRtNjAxMF9zZXRfbXV0ZV9zaWYoZGV2LCBtdXRlKTsKLQkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJFUlJPUjogVE01NjAwIGFuZCBUTTYwMDAgZG9uJ3QgaGFzIgotCQkJCQkiIFNJRiBhdWRpbyBpbnB1dHMuIFBsZWFzZSBjaGVjayB0aGUgJXMiCi0JCQkJCSIgY29uZmlndXJhdGlvbi5cbiIsIGRldi0+bmFtZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6Ci0JY2FzZSBUTTYwMDBfQU1VWF9BREMyOgotCQl0bTYwMTBfc2V0X211dGVfYWRjKGRldiwgbXV0ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgdG02MDEwX3NldF92b2x1bWVfc2lmKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBpbnQgdm9sKQotewotCXU4IHZvbF9yZWc7Ci0KLQl2b2xfcmVnID0gdm9sICYgMHgwRjsKLQotCWlmICh2b2wgPCAwKQotCQl2b2xfcmVnIHw9IDB4NDA7Ci0KLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDdfQV9MRUZUX1ZPTCwgdm9sX3JlZyk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA4X0FfUklHSFRfVk9MLCB2b2xfcmVnKTsKLX0KLQotdm9pZCB0bTYwMTBfc2V0X3ZvbHVtZV9hZGMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCB2b2wpCi17Ci0JdTggdm9sX3JlZzsKLQotCXZvbF9yZWcgPSAodm9sICsgMHgxMCkgJiAweDFmOwotCi0JaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JGMl9MRUZUX0NIQU5ORUxfVk9MLCB2b2xfcmVnKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkYzX1JJR0hUX0NIQU5ORUxfVk9MLCB2b2xfcmVnKTsKLQl9IGVsc2UgewotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRUNfVkFEQ19BQURDX0xWT0wsIHZvbF9yZWcpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRURfVkFEQ19BQURDX1JWT0wsIHZvbF9yZWcpOwotCX0KLX0KLQotdm9pZCB0bTYwMDBfc2V0X3ZvbHVtZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IHZvbCkKLXsKLQllbnVtIHRtNjAwMF9tdXggbXV4OwotCi0JaWYgKGRldi0+cmFkaW8pIHsKLQkJbXV4ID0gZGV2LT5yaW5wdXQuYW11eDsKLQkJdm9sICs9IDg7IC8qIE9mZnNldCB0byAwIGRCICovCi0JfSBlbHNlCi0JCW11eCA9IGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXg7Ci0KLQlzd2l0Y2ggKG11eCkgewotCWNhc2UgVE02MDAwX0FNVVhfU0lGMToKLQljYXNlIFRNNjAwMF9BTVVYX1NJRjI6Ci0JCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKLQkJCXRtNjAxMF9zZXRfdm9sdW1lX3NpZihkZXYsIHZvbCk7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX0lORk8gIkVSUk9SOiBUTTU2MDAgYW5kIFRNNjAwMCBkb24ndCBoYXMiCi0JCQkJCSIgU0lGIGF1ZGlvIGlucHV0cy4gUGxlYXNlIGNoZWNrIHRoZSAlcyIKLQkJCQkJIiBjb25maWd1cmF0aW9uLlxuIiwgZGV2LT5uYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBUTTYwMDBfQU1VWF9BREMxOgotCWNhc2UgVE02MDAwX0FNVVhfQURDMjoKLQkJdG02MDEwX3NldF92b2x1bWVfYWRjKGRldiwgdm9sKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgTElTVF9IRUFEKHRtNjAwMF9kZXZsaXN0KTsKLXN0YXRpYyBERUZJTkVfTVVURVgodG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCi0vKgotICogdG02MDAwX3JlYWxlYXNlX3Jlc291cmNlKCkKLSAqLwotCi12b2lkIHRtNjAwMF9yZW1vdmVfZnJvbV9kZXZsaXN0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCW11dGV4X2xvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLQlsaXN0X2RlbCgmZGV2LT5kZXZsaXN0KTsKLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLX07Ci0KLXZvaWQgdG02MDAwX2FkZF9pbnRvX2Rldmxpc3Qoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2bGlzdCwgJnRtNjAwMF9kZXZsaXN0KTsKLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLX07Ci0KLS8qCi0gKiBFeHRlbnNpb24gaW50ZXJmYWNlCi0gKi8KLQotc3RhdGljIExJU1RfSEVBRCh0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QpOwotCi1pbnQgdG02MDAwX2NhbGxfZmlsbGJ1ZihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgZW51bSB0bTYwMDBfb3BzX3R5cGUgdHlwZSwKLQkJCWNoYXIgKmJ1ZiwgaW50IHNpemUpCi17Ci0Jc3RydWN0IHRtNjAwMF9vcHMgKm9wcyA9IE5VTEw7Ci0KLQkvKiBGSVhNRTogdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0X2xvY2sgc2hvdWxkIGJlIGEgc3BpbmxvY2sgKi8KLQotCWlmICghbGlzdF9lbXB0eSgmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgewotCQkJaWYgKG9wcy0+ZmlsbGJ1ZiAmJiBvcHMtPnR5cGUgPT0gdHlwZSkKLQkJCQlvcHMtPmZpbGxidWYoZGV2LCBidWYsIHNpemUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJm9wcy0+bmV4dCwgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ0bTYwMDBfZGV2bGlzdCwgZGV2bGlzdCkgewotCQlvcHMtPmluaXQoZGV2KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemVkICglcykgZXh0ZW5zaW9uXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBvcHMtPm5hbWUpOwotCX0KLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wodG02MDAwX3JlZ2lzdGVyX2V4dGVuc2lvbik7Ci0KLXZvaWQgdG02MDAwX3VucmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdG02MDAwX2Rldmxpc3QsIGRldmxpc3QpCi0JCW9wcy0+ZmluaShkZXYpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBSZW1vdmUgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7Ci0JbGlzdF9kZWwoJm9wcy0+bmV4dCk7Ci0JbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZGV2bGlzdF9tdXRleCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbik7Ci0KLXZvaWQgdG02MDAwX2luaXRfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0bTYwMDBfb3BzICpvcHMgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgewotCQkJaWYgKG9wcy0+aW5pdCkKLQkJCQlvcHMtPmluaXQoZGV2KTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLX0KLQotdm9pZCB0bTYwMDBfY2xvc2VfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0bTYwMDBfb3BzICpvcHMgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgewotCQkJaWYgKG9wcy0+ZmluaSkKLQkJCQlvcHMtPmZpbmkoZGV2KTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWR2Yi5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtZHZiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGRmY2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtZHZiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoKLSAqICB0bTYwMDAtZHZiLmMgLSBkdmItdCBzdXBwb3J0IGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNyBNaWNoZWwgTHVkd2lnIDxtaWNoZWwubHVkd2lnQGdtYWlsLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotCi0jaW5jbHVkZSAidG02MDAwLmgiCi0jaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKLQotI2luY2x1ZGUgInpsMTAzNTMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+Ci0KLSNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKLSNpbmNsdWRlICJ4YzUwMDAuaCIKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJEVkIgZHJpdmVyIGV4dGVuc2lvbiBtb2R1bGUgZm9yIHRtNTYwMC82MDAwLzYwMTAgYmFzZWQgVFYgY2FyZHMiKTsKLU1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tUcmlkZW50LCB0bTU2MDB9LCIKLQkJCSJ7e1RyaWRlbnQsIHRtNjAwMH0sIgotCQkJInt7VHJpZGVudCwgdG02MDEwfSIpOwotCi1zdGF0aWMgaW50IGRlYnVnOwotCi1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2UiKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHByaW50X2Vycl9zdGF0dXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCi0JCQkJICAgIGludCBwYWNrZXQsIGludCBzdGF0dXMpCi17Ci0JY2hhciAqZXJybXNnID0gIlVua25vd24iOwotCi0Jc3dpdGNoIChzdGF0dXMpIHsKLQljYXNlIC1FTk9FTlQ6Ci0JCWVycm1zZyA9ICJ1bmxpbmtlZCBzeW5jaHJvbnVvdXNseSI7Ci0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JCWVycm1zZyA9ICJ1bmxpbmtlZCBhc3luY2hyb251b3VzbHkiOwotCQlicmVhazsKLQljYXNlIC1FTk9TUjoKLQkJZXJybXNnID0gIkJ1ZmZlciBlcnJvciAob3ZlcnJ1bikiOwotCQlicmVhazsKLQljYXNlIC1FUElQRToKLQkJZXJybXNnID0gIlN0YWxsZWQgKGRldmljZSBub3QgcmVzcG9uZGluZykiOwotCQlicmVhazsKLQljYXNlIC1FT1ZFUkZMT1c6Ci0JCWVycm1zZyA9ICJCYWJibGUgKGJhZCBjYWJsZT8pIjsKLQkJYnJlYWs7Ci0JY2FzZSAtRVBST1RPOgotCQllcnJtc2cgPSAiQml0LXN0dWZmIGVycm9yIChiYWQgY2FibGU/KSI7Ci0JCWJyZWFrOwotCWNhc2UgLUVJTFNFUToKLQkJZXJybXNnID0gIkNSQy9UaW1lb3V0IChjb3VsZCBiZSBhbnl0aGluZykiOwotCQlicmVhazsKLQljYXNlIC1FVElNRToKLQkJZXJybXNnID0gIkRldmljZSBkb2VzIG5vdCByZXNwb25kIjsKLQkJYnJlYWs7Ci0JfQotCWlmIChwYWNrZXQgPCAwKSB7Ci0JCWRwcmludGsoZGV2LCAxLCAiVVJCIHN0YXR1cyAlZCBbJXNdLlxuIiwKLQkJCXN0YXR1cywgZXJybXNnKTsKLQl9IGVsc2UgewotCQlkcHJpbnRrKGRldiwgMSwgIlVSQiBwYWNrZXQgJWQsIHN0YXR1cyAlZCBbJXNdLlxuIiwKLQkJCXBhY2tldCwgc3RhdHVzLCBlcnJtc2cpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdG02MDAwX3VyYl9yZWNlaXZlZChzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IHVyYi0+Y29udGV4dDsKLQotCWlmICh1cmItPnN0YXR1cyAhPSAwKQotCQlwcmludF9lcnJfc3RhdHVzKGRldiwgMCwgdXJiLT5zdGF0dXMpOwotCWVsc2UgaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApCi0JCWR2Yl9kbXhfc3dmaWx0ZXIoJmRldi0+ZHZiLT5kZW11eCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkJCQkgICB1cmItPmFjdHVhbF9sZW5ndGgpOwotCi0JaWYgKGRldi0+ZHZiLT5zdHJlYW1zID4gMCkgewotCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6ICBlcnJvciAlc1xuIiwgX19mdW5jX18pOwotCQkJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOwotCQkJdXNiX2ZyZWVfdXJiKHVyYik7Ci0JCX0KLQl9Ci19Ci0KLWludCB0bTYwMDBfc3RhcnRfc3RyZWFtKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHBpcGUsIHNpemU7Ci0Jc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBnb3Qgc3RhcnQgc3RyZWFtIHJlcXVlc3QgJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChkZXYtPm1vZGUgIT0gVE02MDAwX01PREVfRElHSVRBTCkgewotCQl0bTYwMDBfaW5pdF9kaWdpdGFsX21vZGUoZGV2KTsKLQkJZGV2LT5tb2RlID0gVE02MDAwX01PREVfRElHSVRBTDsKLQl9Ci0KLQlkdmItPmJ1bGtfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoZHZiLT5idWxrX3VyYiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCBhbGxvY2F0ZSB1cmJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwaXBlID0gdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgZGV2LT5idWxrX2luLmVuZHAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcwotCQkJCQkJCSAgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOwotCi0Jc2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7Ci0Jc2l6ZSA9IHNpemUgKiAxNTsgLyogNTEyIHggOCBvciAxMiBvciAxNSAqLwotCi0JZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJdXNiX2ZyZWVfdXJiKGR2Yi0+YnVsa191cmIpOwotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogY291bGRuJ3QgYWxsb2NhdGUgdHJhbnNmZXIgYnVmZmVyIVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXVzYl9maWxsX2J1bGtfdXJiKGR2Yi0+YnVsa191cmIsIGRldi0+dWRldiwgcGlwZSwKLQkJCQkJCSBkdmItPmJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkJCQkgc2l6ZSwKLQkJCQkJCSB0bTYwMDBfdXJiX3JlY2VpdmVkLCBkZXYpOwotCi0JcmV0ID0gdXNiX2NsZWFyX2hhbHQoZGV2LT51ZGV2LCBwaXBlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogZXJyb3IgJWkgaW4gJXMgZHVyaW5nIHBpcGUgcmVzZXRcbiIsCi0JCQkJCQkJcmV0LCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBwaXBlIHJlc2V0dGVkXG4iKTsKLQotLyoJbXV0ZXhfbG9jaygmdG02MDAwX2RyaXZlci5vcGVuX2Nsb3NlX211dGV4KTsgKi8KLQlyZXQgPSB1c2Jfc3VibWl0X3VyYihkdmItPmJ1bGtfdXJiLCBHRlBfS0VSTkVMKTsKLQotLyoJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZHJpdmVyLm9wZW5fY2xvc2VfbXV0ZXgpOyAqLwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IHN1Ym1pdCBvZiB1cmIgZmFpbGVkIChlcnJvcj0laSlcbiIsCi0JCQkJCQkJCQlyZXQpOwotCi0JCWtmcmVlKGR2Yi0+YnVsa191cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JCXVzYl9mcmVlX3VyYihkdmItPmJ1bGtfdXJiKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB0bTYwMDBfc3RvcF9zdHJlYW0oc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0Jc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOwotCi0JaWYgKGR2Yi0+YnVsa191cmIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAidXJiIGtpbGxpbmdcbiIpOwotCQl1c2Jfa2lsbF91cmIoZHZiLT5idWxrX3VyYik7Ci0JCXByaW50ayhLRVJOX0lORk8gInVyYiBidWZmZXIgZnJlZVxuIik7Ci0JCWtmcmVlKGR2Yi0+YnVsa191cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JCXVzYl9mcmVlX3VyYihkdmItPmJ1bGtfdXJiKTsKLQkJZHZiLT5idWxrX3VyYiA9IE5VTEw7Ci0JfQotfQotCi1pbnQgdG02MDAwX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQotewotCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBkZW11eC0+cHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7Ci0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBnb3Qgc3RhcnQgZmVlZCByZXF1ZXN0ICVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZkdmItPm11dGV4KTsKLQlpZiAoZHZiLT5zdHJlYW1zID09IDApIHsKLQkJZHZiLT5zdHJlYW1zID0gMTsKLS8qCQltdXRleF9pbml0KCZ0bTYwMDBfZGV2LT5zdHJlbWluZ19tdXRleCk7ICovCi0JCXRtNjAwMF9zdGFydF9zdHJlYW0oZGV2KTsKLQl9IGVsc2UKLQkJKysoZHZiLT5zdHJlYW1zKTsKLQltdXRleF91bmxvY2soJmR2Yi0+bXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB0bTYwMDBfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCkKLXsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGZlZWQtPmRlbXV4OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZGVtdXgtPnByaXY7Ci0Jc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBnb3Qgc3RvcCBmZWVkIHJlcXVlc3QgJXNcbiIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJmR2Yi0+bXV0ZXgpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAic3RyZWFtICUjeFxuIiwgZHZiLT5zdHJlYW1zKTsKLQktLShkdmItPnN0cmVhbXMpOwotCWlmIChkdmItPnN0cmVhbXMgPT0gMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJzdG9wIHN0cmVhbVxuIik7Ci0JCXRtNjAwMF9zdG9wX3N0cmVhbShkZXYpOwotLyoJCW11dGV4X2Rlc3Ryb3koJnRtNjAwMF9kZXYtPnN0cmVhbWluZ19tdXRleCk7ICovCi0JfQotCW11dGV4X3VubG9jaygmZHZiLT5tdXRleCk7Ci0vKgltdXRleF9kZXN0cm95KCZ0bTYwMDBfZGV2LT5zdHJlYW1pbmdfbXV0ZXgpOyAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB0bTYwMDBfZHZiX2F0dGFjaF9mcm9udGVuZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7Ci0KLQlpZiAoZGV2LT5jYXBzLmhhc196bDEwMzUzKSB7Ci0JCXN0cnVjdCB6bDEwMzUzX2NvbmZpZyBjb25maWcgPSB7Ci0JCQkJICAgICAuZGVtb2RfYWRkcmVzcyA9IGRldi0+ZGVtb2RfYWRkciwKLQkJCQkgICAgIC5ub190dW5lciA9IDEsCi0JCQkJICAgICAucGFyYWxsZWxfdHMgPSAxLAotCQkJCSAgICAgLmlmMiA9IDQ1NzAwLAotCQkJCSAgICAgLmRpc2FibGVfaTJjX2dhdGVfY3RybCA9IDEsCi0JCQkJICAgIH07Ci0KLQkJZHZiLT5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsICZjb25maWcsCi0JCQkJCQkJICAgJmRldi0+aTJjX2FkYXApOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBubyBmcm9udGVuZCBkZWZpbmVkIGZvciB0aGUgZGV2aWNlIVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gKCFkdmItPmZyb250ZW5kKSA/IC0xIDogMDsKLX0KLQotRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7Ci0KLWludCByZWdpc3Rlcl9kdmIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IHJldCA9IC0xOwotCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKLQotCW11dGV4X2luaXQoJmR2Yi0+bXV0ZXgpOwotCi0JZHZiLT5zdHJlYW1zID0gMDsKLQotCS8qIGF0dGFjaCB0aGUgZnJvbnRlbmQgKi8KLQlyZXQgPSB0bTYwMDBfZHZiX2F0dGFjaF9mcm9udGVuZChkZXYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCBhdHRhY2ggdGhlIGZyb250ZW5kIVxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIsICJUcmlkZW50IFRWTWFzdGVyIDYwMDAgRFZCLVQiLAotCQkJCQlUSElTX01PRFVMRSwgJmRldi0+dWRldi0+ZGV2LCBhZGFwdGVyX25yKTsKLQlkdmItPmFkYXB0ZXIucHJpdiA9IGRldjsKLQotCWlmIChkdmItPmZyb250ZW5kKSB7Ci0JCXN3aXRjaCAoZGV2LT50dW5lcl90eXBlKSB7Ci0JCWNhc2UgVFVORVJfWEMyMDI4OiB7Ci0JCQlzdHJ1Y3QgeGMyMDI4X2NvbmZpZyBjZmcgPSB7Ci0JCQkJLmkyY19hZGFwID0gJmRldi0+aTJjX2FkYXAsCi0JCQkJLmkyY19hZGRyID0gZGV2LT50dW5lcl9hZGRyLAotCQkJfTsKLQotCQkJZHZiLT5mcm9udGVuZC0+Y2FsbGJhY2sgPSB0bTYwMDBfdHVuZXJfY2FsbGJhY2s7Ci0JCQlyZXQgPSBkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmR2Yi0+YWRhcHRlciwgZHZiLT5mcm9udGVuZCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkidG02MDAwOiBjb3VsZG4ndCByZWdpc3RlciBmcm9udGVuZFxuIik7Ci0JCQkJZ290byBhZGFwdGVyX2VycjsKLQkJCX0KLQotCQkJaWYgKCFkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIGR2Yi0+ZnJvbnRlbmQsICZjZmcpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGNvdWxkbid0IHJlZ2lzdGVyICIKLQkJCQkJCSJmcm9udGVuZCAoeGMzMDI4KVxuIik7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIGZyb250ZW5kX2VycjsKLQkJCX0KLQkJCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogWEMyMDI4LzMwMjggYXNrZWQgdG8gYmUgIgotCQkJCQkgImF0dGFjaGVkIHRvIGZyb250ZW5kIVxuIik7Ci0JCQlicmVhazsKLQkJCX0KLQkJY2FzZSBUVU5FUl9YQzUwMDA6IHsKLQkJCXN0cnVjdCB4YzUwMDBfY29uZmlnIGNmZyA9IHsKLQkJCQkuaTJjX2FkZHJlc3MgPSBkZXYtPnR1bmVyX2FkZHIsCi0JCQl9OwotCi0JCQlkdmItPmZyb250ZW5kLT5jYWxsYmFjayA9IHRtNjAwMF94YzUwMDBfY2FsbGJhY2s7Ci0JCQlyZXQgPSBkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmR2Yi0+YWRhcHRlciwgZHZiLT5mcm9udGVuZCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkidG02MDAwOiBjb3VsZG4ndCByZWdpc3RlciBmcm9udGVuZFxuIik7Ci0JCQkJZ290byBhZGFwdGVyX2VycjsKLQkJCX0KLQotCQkJaWYgKCFkdmJfYXR0YWNoKHhjNTAwMF9hdHRhY2gsIGR2Yi0+ZnJvbnRlbmQsICZkZXYtPmkyY19hZGFwLCAmY2ZnKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCByZWdpc3RlciAiCi0JCQkJCQkiZnJvbnRlbmQgKHhjNTAwMClcbiIpOwotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBmcm9udGVuZF9lcnI7Ci0JCQl9Ci0JCQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IFhDNTAwMCBhc2tlZCB0byBiZSAiCi0JCQkJCSAiYXR0YWNoZWQgdG8gZnJvbnRlbmQhXG4iKTsKLQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBubyBmcm9udGVuZCBmb3VuZFxuIik7Ci0KLQlkdmItPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPSBETVhfVFNfRklMVEVSSU5HIHwgRE1YX1NFQ1RJT05fRklMVEVSSU5HCi0JCQkJCQkJICAgIHwgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkc7Ci0JZHZiLT5kZW11eC5wcml2ID0gZGV2OwotCWR2Yi0+ZGVtdXguZmlsdGVybnVtID0gODsKLQlkdmItPmRlbXV4LmZlZWRudW0gPSA4OwotCWR2Yi0+ZGVtdXguc3RhcnRfZmVlZCA9IHRtNjAwMF9zdGFydF9mZWVkOwotCWR2Yi0+ZGVtdXguc3RvcF9mZWVkID0gdG02MDAwX3N0b3BfZmVlZDsKLQlkdmItPmRlbXV4LndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOwotCXJldCA9IGR2Yl9kbXhfaW5pdCgmZHZiLT5kZW11eCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJ0bTYwMDA6IGR2Yl9kbXhfaW5pdCBmYWlsZWQgKGVycm5vID0gJWQpXG4iLCByZXQpOwotCQlnb3RvIGZyb250ZW5kX2VycjsKLQl9Ci0KLQlkdmItPmRteGRldi5maWx0ZXJudW0gPSBkZXYtPmR2Yi0+ZGVtdXguZmlsdGVybnVtOwotCWR2Yi0+ZG14ZGV2LmRlbXV4ID0gJmRldi0+ZHZiLT5kZW11eC5kbXg7Ci0JZHZiLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKLQotCXJldCA9ICBkdmJfZG14ZGV2X2luaXQoJmR2Yi0+ZG14ZGV2LCAmZHZiLT5hZGFwdGVyKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoInRtNjAwMDogZHZiX2RteGRldl9pbml0IGZhaWxlZCAoZXJybm8gPSAlZClcbiIsIHJldCk7Ci0JCWdvdG8gZHZiX2RteF9lcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWR2Yl9kbXhfZXJyOgotCWR2Yl9kbXhfcmVsZWFzZSgmZHZiLT5kZW11eCk7Ci1mcm9udGVuZF9lcnI6Ci0JaWYgKGR2Yi0+ZnJvbnRlbmQpIHsKLQkJZHZiX2Zyb250ZW5kX2RldGFjaChkdmItPmZyb250ZW5kKTsKLQkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoZHZiLT5mcm9udGVuZCk7Ci0JfQotYWRhcHRlcl9lcnI6Ci0JZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZHZiLT5hZGFwdGVyKTsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHVucmVnaXN0ZXJfZHZiKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKLQotCWlmIChkdmItPmJ1bGtfdXJiICE9IE5VTEwpIHsKLQkJc3RydWN0IHVyYiAqYnVsa191cmIgPSBkdmItPmJ1bGtfdXJiOwotCi0JCWtmcmVlKGJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwotCQlidWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKLQkJdXNiX3VubGlua191cmIoYnVsa191cmIpOwotCQl1c2JfZnJlZV91cmIoYnVsa191cmIpOwotCX0KLQotLyoJbXV0ZXhfbG9jaygmdG02MDAwX2RyaXZlci5vcGVuX2Nsb3NlX211dGV4KTsgKi8KLQlpZiAoZHZiLT5mcm9udGVuZCkgewotCQlkdmJfZnJvbnRlbmRfZGV0YWNoKGR2Yi0+ZnJvbnRlbmQpOwotCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChkdmItPmZyb250ZW5kKTsKLQl9Ci0KLQlkdmJfZG14ZGV2X3JlbGVhc2UoJmR2Yi0+ZG14ZGV2KTsKLQlkdmJfZG14X3JlbGVhc2UoJmR2Yi0+ZGVtdXgpOwotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlcik7Ci0JbXV0ZXhfZGVzdHJveSgmZHZiLT5tdXRleCk7Ci0vKgltdXRleF91bmxvY2soJnRtNjAwMF9kcml2ZXIub3Blbl9jbG9zZV9tdXRleCk7ICovCi19Ci0KLXN0YXRpYyBpbnQgZHZiX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0Jc3RydWN0IHRtNjAwMF9kdmIgKmR2YjsKLQlpbnQgcmM7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWRldi0+Y2Fwcy5oYXNfZHZiKQotCQlyZXR1cm4gMDsKLQotCWR2YiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bTYwMDBfZHZiKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkdmIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRldi0+ZHZiID0gZHZiOwotCi0JcmMgPSByZWdpc3Rlcl9kdmIoZGV2KTsKLQlpZiAocmMgPCAwKSB7Ci0JCWtmcmVlKGR2Yik7Ci0JCWRldi0+ZHZiID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHZiX2Zpbmkoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaWYgKCFkZXYpCi0JCXJldHVybiAwOwotCi0JaWYgKCFkZXYtPmNhcHMuaGFzX2R2YikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZGV2LT5kdmIpIHsKLQkJdW5yZWdpc3Rlcl9kdmIoZGV2KTsKLQkJa2ZyZWUoZGV2LT5kdmIpOwotCQlkZXYtPmR2YiA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdG02MDAwX29wcyBkdmJfb3BzID0gewotCS50eXBlCT0gVE02MDAwX0RWQiwKLQkubmFtZQk9ICJUTTYwMDAgZHZiIEV4dGVuc2lvbiIsCi0JLmluaXQJPSBkdmJfaW5pdCwKLQkuZmluaQk9IGR2Yl9maW5pLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdG02MDAwX2R2Yl9yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZkdmJfb3BzKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHRtNjAwMF9kdmJfdW5yZWdpc3Rlcih2b2lkKQotewotCXRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbigmZHZiX29wcyk7Ci19Ci0KLW1vZHVsZV9pbml0KHRtNjAwMF9kdmJfcmVnaXN0ZXIpOwotbW9kdWxlX2V4aXQodG02MDAwX2R2Yl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWkyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaTJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjUxZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaTJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqICB0bTYwMDAtaTJjLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Ci0gKgotICogIENvcHlyaWdodCAoQykgMjAwNyBNaWNoZWwgTHVkd2lnIDxtaWNoZWwubHVkd2lnQGdtYWlsLmNvbT4KLSAqCS0gRml4IFNNQnVzIFJlYWQgQnl0ZSBjb21tYW5kCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotCi0jaW5jbHVkZSAidG02MDAwLmgiCi0jaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgotI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+Ci0jaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludCBpMmNfZGVidWc7Ci1tb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpMmNfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2kyY10iKTsKLQotI2RlZmluZSBpMmNfZHByaW50ayhsdmwsIGZtdCwgYXJncy4uLikgaWYgKGkyY19kZWJ1ZyA+PSBsdmwpIGRvIHsgXAotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGF0ICVzOiAiIGZtdCwgXAotCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXywgIyNhcmdzKTsgfSB3aGlsZSAoMCkKLQotc3RhdGljIGludCB0bTYwMDBfaTJjX3NlbmRfcmVncyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyLAotCQkJCV9fdTggcmVnLCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50IHJjOwotCXVuc2lnbmVkIGludCB0c2xlZXA7Ci0JdW5zaWduZWQgaW50IGkyY19wYWNrZXRfbGltaXQgPSAxNjsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKLQkJaTJjX3BhY2tldF9saW1pdCA9IDY0OwotCi0JaWYgKCFidWYpCi0JCXJldHVybiAtMTsKLQotCWlmIChsZW4gPCAxIHx8IGxlbiA+IGkyY19wYWNrZXRfbGltaXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgbGVuZ3RoIG9mIGkyYyBwYWNrZXQgPSAlZCwgbGltaXQgc2V0IHRvICVkXG4iLAotCQkJbGVuLCBpMmNfcGFja2V0X2xpbWl0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGNhcHR1cmUgbXV0ZXggKi8KLQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKLQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4sCi0JCWFkZHIgfCByZWcgPDwgOCwgMCwgYnVmLCBsZW4pOwotCi0JaWYgKHJjIDwgMCkgewotCQkvKiByZWxlYXNlIG11dGV4ICovCi0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgZGVsYXkgdGltZSwgMTQwMDB1cyBmb3IgNjQgYnl0ZXMgKi8KLQl0c2xlZXAgPSAoKGxlbiAqIDIwMCkgKyAyMDAgKyAxMDAwKSAvIDEwMDA7Ci0JbXNsZWVwKHRzbGVlcCk7Ci0KLQkvKiByZWxlYXNlIG11dGV4ICovCi0JcmV0dXJuIHJjOwotfQotCi0vKiBHZW5lcmljIHJlYWQgLSBkb2Vzbid0IHdvcmsgZmluZSB3aXRoIDE2Yml0IHJlZ2lzdGVycyAqLwotc3RhdGljIGludCB0bTYwMDBfaTJjX3JlY3ZfcmVncyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyLAotCQkJCV9fdTggcmVnLCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50IHJjOwotCXU4IGJbMl07Ci0JdW5zaWduZWQgaW50IGkyY19wYWNrZXRfbGltaXQgPSAxNjsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKLQkJaTJjX3BhY2tldF9saW1pdCA9IDY0OwotCi0JaWYgKCFidWYpCi0JCXJldHVybiAtMTsKLQotCWlmIChsZW4gPCAxIHx8IGxlbiA+IGkyY19wYWNrZXRfbGltaXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgbGVuZ3RoIG9mIGkyYyBwYWNrZXQgPSAlZCwgbGltaXQgc2V0IHRvICVkXG4iLAotCQkJbGVuLCBpMmNfcGFja2V0X2xpbWl0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGNhcHR1cmUgbXV0ZXggKi8KLQlpZiAoKGRldi0+Y2Fwcy5oYXNfemwxMDM1MykgJiYgKGRldi0+ZGVtb2RfYWRkciA8PCAxID09IGFkZHIpICYmIChyZWcgJSAyID09IDApKSB7Ci0JCS8qCi0JCSAqIFdvcmthcm91bmQgYW4gSTJDIGJ1ZyB3aGVuIHJlYWRpbmcgZnJvbSB6bDEwMzUzCi0JCSAqLwotCQlyZWcgLT0gMTsKLQkJbGVuICs9IDE7Ci0KLQkJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCVJFUV8xNl9TRVRfR0VUX0kyQ19XUjFfUkROLCBhZGRyIHwgcmVnIDw8IDgsIDAsIGIsIGxlbik7Ci0KLQkJKmJ1ZiA9IGJbMV07Ci0JfSBlbHNlIHsKLQkJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCVJFUV8xNl9TRVRfR0VUX0kyQ19XUjFfUkROLCBhZGRyIHwgcmVnIDw8IDgsIDAsIGJ1ZiwgbGVuKTsKLQl9Ci0KLQkvKiByZWxlYXNlIG11dGV4ICovCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogcmVhZCBmcm9tIGEgMTZiaXQgcmVnaXN0ZXIKLSAqIGZvciBleGFtcGxlIHhjMjAyOCwgeGMzMDI4IG9yIHhjMzAyOEwKLSAqLwotc3RhdGljIGludCB0bTYwMDBfaTJjX3JlY3ZfcmVnczE2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHIsCi0JCQkJICBfX3UxNiByZWcsIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgcmM7Ci0JdW5zaWduZWQgY2hhciB1cmVnOwotCi0JaWYgKCFidWYgfHwgbGVuICE9IDIpCi0JCXJldHVybiAtMTsKLQotCS8qIGNhcHR1cmUgbXV0ZXggKi8KLQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKLQkJdXJlZyA9IHJlZyAmIDB4RkY7Ci0JCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAotCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4sCi0JCQlhZGRyIHwgKHJlZyAmIDB4RkYwMCksIDAsICZ1cmVnLCAxKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQkvKiByZWxlYXNlIG11dGV4ICovCi0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQltc2xlZXAoMTQwMCAvIDEwMDApOwotCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAotCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzM1X0FGVEVLX1RVTkVSX1JFQUQsCi0JCQlyZWcsIDAsIGJ1ZiwgbGVuKTsKLQl9IGVsc2UgewotCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAotCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzE0X1NFVF9HRVRfSTJDX1dSMl9SRE4sCi0JCQlhZGRyLCByZWcsIGJ1ZiwgbGVuKTsKLQl9Ci0KLQkvKiByZWxlYXNlIG11dGV4ICovCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHRtNjAwMF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAotCQkJICAgc3RydWN0IGkyY19tc2cgbXNnc1tdLCBpbnQgbnVtKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKLQlpbnQgYWRkciwgcmMsIGksIGJ5dGU7Ci0KLQlpZiAobnVtIDw9IDApCi0JCXJldHVybiAwOwotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlhZGRyID0gKG1zZ3NbaV0uYWRkciA8PCAxKSAmIDB4ZmY7Ci0JCWkyY19kcHJpbnRrKDIsICIlcyAlcyBhZGRyPTB4JXggbGVuPSVkOiIsCi0JCQkgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgPyAicmVhZCIgOiAid3JpdGUiLAotCQkJIGkgPT0gbnVtIC0gMSA/ICJzdG9wIiA6ICJub25zdG9wIiwgYWRkciwgbXNnc1tpXS5sZW4pOwotCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7Ci0JCQkvKiByZWFkIHJlcXVlc3Qgd2l0aG91dCBwcmVjZWRpbmcgcmVnaXN0ZXIgc2VsZWN0aW9uICovCi0JCQkvKgotCQkJICogVGhlIFRNNjAwMCBvbmx5IHN1cHBvcnRzIGEgcmVhZCB0cmFuc2FjdGlvbgotCQkJICogaW1tZWRpYXRlbHkgYWZ0ZXIgYSAxIG9yIDIgYnl0ZSB3cml0ZSB0byBzZWxlY3QKLQkJCSAqIGEgcmVnaXN0ZXIuICBXZSBjYW5ub3QgZnVsZmlsIHRoaXMgcmVxdWVzdC4KLQkJCSAqLwotCQkJaTJjX2RwcmludGsoMiwgIiByZWFkIHdpdGhvdXQgcHJlY2VkaW5nIHdyaXRlIG5vdCIKLQkJCQkgICAgICAgIiBzdXBwb3J0ZWQiKTsKLQkJCXJjID0gLUVPUE5PVFNVUFA7Ci0JCQlnb3RvIGVycjsKLQkJfSBlbHNlIGlmIChpICsgMSA8IG51bSAmJiBtc2dzW2ldLmxlbiA8PSAyICYmCi0JCQkgICAobXNnc1tpICsgMV0uZmxhZ3MgJiBJMkNfTV9SRCkgJiYKLQkJCSAgIG1zZ3NbaV0uYWRkciA9PSBtc2dzW2kgKyAxXS5hZGRyKSB7Ci0JCQkvKiAxIG9yIDIgYnl0ZSB3cml0ZSBmb2xsb3dlZCBieSBhIHJlYWQgKi8KLQkJCWlmIChpMmNfZGVidWcgPj0gMikKLQkJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykKLQkJCQkJcHJpbnRrKCIgJTAyeCIsIG1zZ3NbaV0uYnVmW2J5dGVdKTsKLQkJCWkyY19kcHJpbnRrKDIsICI7IGpvaW5lZCB0byByZWFkICVzIGxlbj0lZDoiLAotCQkJCSAgICBpID09IG51bSAtIDIgPyAic3RvcCIgOiAibm9uc3RvcCIsCi0JCQkJICAgIG1zZ3NbaSArIDFdLmxlbik7Ci0KLQkJCWlmIChtc2dzW2ldLmxlbiA9PSAyKSB7Ci0JCQkJcmMgPSB0bTYwMDBfaTJjX3JlY3ZfcmVnczE2KGRldiwgYWRkciwKLQkJCQkJbXNnc1tpXS5idWZbMF0gPDwgOCB8IG1zZ3NbaV0uYnVmWzFdLAotCQkJCQltc2dzW2kgKyAxXS5idWYsIG1zZ3NbaSArIDFdLmxlbik7Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gdG02MDAwX2kyY19yZWN2X3JlZ3MoZGV2LCBhZGRyLCBtc2dzW2ldLmJ1ZlswXSwKLQkJCQkJbXNnc1tpICsgMV0uYnVmLCBtc2dzW2kgKyAxXS5sZW4pOwotCQkJfQotCi0JCQlpKys7Ci0KLQkJCWlmIChhZGRyID09IGRldi0+dHVuZXJfYWRkciA8PCAxKSB7Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfNTBfU0VUX1NUQVJULCAwLCAwKTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV81MV9TRVRfU1RPUCwgMCwgMCk7Ci0JCQl9Ci0JCQlpZiAoaTJjX2RlYnVnID49IDIpCi0JCQkJZm9yIChieXRlID0gMDsgYnl0ZSA8IG1zZ3NbaV0ubGVuOyBieXRlKyspCi0JCQkJCXByaW50aygiICUwMngiLCBtc2dzW2ldLmJ1ZltieXRlXSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiB3cml0ZSBieXRlcyAqLwotCQkJaWYgKGkyY19kZWJ1ZyA+PSAyKQotCQkJCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBtc2dzW2ldLmxlbjsgYnl0ZSsrKQotCQkJCQlwcmludGsoIiAlMDJ4IiwgbXNnc1tpXS5idWZbYnl0ZV0pOwotCQkJcmMgPSB0bTYwMDBfaTJjX3NlbmRfcmVncyhkZXYsIGFkZHIsIG1zZ3NbaV0uYnVmWzBdLAotCQkJCW1zZ3NbaV0uYnVmICsgMSwgbXNnc1tpXS5sZW4gLSAxKTsKLQotCQkJaWYgKGFkZHIgPT0gZGV2LT50dW5lcl9hZGRyICA8PCAxKSB7Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfNTBfU0VUX1NUQVJULCAwLCAwKTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV81MV9TRVRfU1RPUCwgMCwgMCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGkyY19kZWJ1ZyA+PSAyKQotCQkJcHJpbnRrKCJcbiIpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBlcnI7Ci0JfQotCi0JcmV0dXJuIG51bTsKLWVycjoKLQlpMmNfZHByaW50aygyLCAiIEVSUk9SOiAlaVxuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB0bTYwMDBfaTJjX2VlcHJvbShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpbnQgaSwgcmM7Ci0JdW5zaWduZWQgY2hhciAqcCA9IGRldi0+ZWVkYXRhOwotCXVuc2lnbmVkIGNoYXIgYnl0ZXNbMTddOwotCi0JZGV2LT5pMmNfY2xpZW50LmFkZHIgPSAweGEwID4+IDE7Ci0JZGV2LT5lZWRhdGFfc2l6ZSA9IDA7Ci0KLQlieXRlc1sxNl0gPSAnXDAnOwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZGV2LT5lZWRhdGEpOyApIHsKLQkJKnAgPSBpOwotCQlyYyA9IHRtNjAwMF9pMmNfcmVjdl9yZWdzKGRldiwgMHhhMCwgaSwgcCwgMSk7Ci0JCWlmIChyYyA8IDEpIHsKLQkJCWlmIChwID09IGRldi0+ZWVkYXRhKQotCQkJCWdvdG8gbm9lZXByb207Ci0JCQllbHNlIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJIiVzOiBpMmMgZWVwcm9tIHJlYWQgZXJyb3IgKGVycj0lZClcbiIsCi0JCQkJZGV2LT5uYW1lLCByYyk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlkZXYtPmVlZGF0YV9zaXplKys7Ci0JCXArKzsKLQkJaWYgKDAgPT0gKGkgJSAxNikpCi0JCQlwcmludGsoS0VSTl9JTkZPICIlczogaTJjIGVlcHJvbSAlMDJ4OiIsIGRldi0+bmFtZSwgaSk7Ci0JCXByaW50aygiICUwMngiLCBkZXYtPmVlZGF0YVtpXSk7Ci0JCWlmICgoZGV2LT5lZWRhdGFbaV0gPj0gJyAnKSAmJiAoZGV2LT5lZWRhdGFbaV0gPD0gJ3onKSkKLQkJCWJ5dGVzW2klMTZdID0gZGV2LT5lZWRhdGFbaV07Ci0JCWVsc2UKLQkJCWJ5dGVzW2klMTZdID0gJy4nOwotCi0JCWkrKzsKLQotCQlpZiAoMCA9PSAoaSAlIDE2KSkgewotCQkJYnl0ZXNbMTZdID0gJ1wwJzsKLQkJCXByaW50aygiICAlc1xuIiwgYnl0ZXMpOwotCQl9Ci0JfQotCWlmICgwICE9IChpJTE2KSkgewotCQlieXRlc1tpJTE2XSA9ICdcMCc7Ci0JCWZvciAoaSAlPSAxNjsgaSA8IDE2OyBpKyspCi0JCQlwcmludGsoIiAgICIpOwotCQlwcmludGsoIiAgJXNcbiIsIGJ5dGVzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotbm9lZXByb206Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEh1aCwgbm8gZWVwcm9tIHByZXNlbnQgKGVycj0lZCk/XG4iLAotCSAgICAgICBkZXYtPm5hbWUsIHJjKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAqIGZ1bmN0aW9uYWxpdHkoKQotICovCi1zdGF0aWMgdTMyIGZ1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXJldHVybiBJMkNfRlVOQ19TTUJVU19FTVVMOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gdG02MDAwX2FsZ28gPSB7Ci0JLm1hc3Rlcl94ZmVyICAgPSB0bTYwMDBfaTJjX3hmZXIsCi0JLmZ1bmN0aW9uYWxpdHkgPSBmdW5jdGlvbmFsaXR5LAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAqIHRtNjAwMF9pMmNfcmVnaXN0ZXIoKQotICogcmVnaXN0ZXIgaTJjIGJ1cwotICovCi1pbnQgdG02MDAwX2kyY19yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpbnQgcmM7Ci0KLQlkZXYtPmkyY19hZGFwLm93bmVyID0gVEhJU19NT0RVTEU7Ci0JZGV2LT5pMmNfYWRhcC5hbGdvID0gJnRtNjAwMF9hbGdvOwotCWRldi0+aTJjX2FkYXAuZGV2LnBhcmVudCA9ICZkZXYtPnVkZXYtPmRldjsKLQlzdHJsY3B5KGRldi0+aTJjX2FkYXAubmFtZSwgZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5pMmNfYWRhcC5uYW1lKSk7Ci0JZGV2LT5pMmNfYWRhcC5hbGdvX2RhdGEgPSBkZXY7Ci0JaTJjX3NldF9hZGFwZGF0YSgmZGV2LT5pMmNfYWRhcCwgJmRldi0+djRsMl9kZXYpOwotCXJjID0gaTJjX2FkZF9hZGFwdGVyKCZkZXYtPmkyY19hZGFwKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCWRldi0+aTJjX2NsaWVudC5hZGFwdGVyID0gJmRldi0+aTJjX2FkYXA7Ci0Jc3RybGNweShkZXYtPmkyY19jbGllbnQubmFtZSwgInRtNjAwMCBpbnRlcm5hbCIsIEkyQ19OQU1FX1NJWkUpOwotCXRtNjAwMF9pMmNfZWVwcm9tKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHRtNjAwMF9pMmNfdW5yZWdpc3RlcigpCi0gKiB1bnJlZ2lzdGVyIGkyY19idXMKLSAqLwotaW50IHRtNjAwMF9pMmNfdW5yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpMmNfZGVsX2FkYXB0ZXIoJmRldi0+aTJjX2FkYXApOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaW5wdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWlucHV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTJjNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaW5wdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKgotICogIHRtNjAwMC1pbnB1dC5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMCBTdGVmYW4gUmluZ2VsIDxzdGVmYW4ucmluZ2VsQGFyY29yLmRlPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+Ci0KLSNpbmNsdWRlICJ0bTYwMDAuaCIKLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotCi1zdGF0aWMgdW5zaWduZWQgaW50IGlyX2RlYnVnOwotbW9kdWxlX3BhcmFtKGlyX2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpcl9kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlIFtJUl0iKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBlbmFibGVfaXIgPSAxOwotbW9kdWxlX3BhcmFtKGVuYWJsZV9pciwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2lyLCAiZW5hYmxlIGlyIChkZWZhdWx0IGlzIGVuYWJsZSkiKTsKLQotLyogbnVtYmVyIG9mIDUwbXMgZm9yIE9OLU9GRi1PTiBwb3dlciBsZWQgKi8KLS8qIHNob3cgSVIgYWN0aXZpdHkgKi8KLSNkZWZpbmUgUFdMRURfT0ZGIDIKLQotI3VuZGVmIGRwcmludGsKLQotI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKSBcCi0JaWYgKGlyX2RlYnVnKSB7IFwKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzL2lyOiAiIGZtdCwgaXItPm5hbWUgLCAjIyBhcmcpOyBcCi0JfQotCi1zdHJ1Y3QgdG02MDAwX2lyX3BvbGxfcmVzdWx0IHsKLQl1MTYgcmNfZGF0YTsKLX07Ci0KLXN0cnVjdCB0bTYwMDBfSVIgewotCXN0cnVjdCB0bTYwMDBfY29yZQkqZGV2OwotCXN0cnVjdCByY19kZXYJCSpyYzsKLQljaGFyCQkJbmFtZVszMl07Ci0JY2hhcgkJCXBoeXNbMzJdOwotCi0JLyogcG9sbCBleHBlcm5hbCBkZWNvZGVyICovCi0JaW50CQkJcG9sbGluZzsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrCXdvcms7Ci0JdTgJCQl3YWl0OjE7Ci0JdTgJCQlrZXk6MTsKLQl1OAkJCXB3bGVkOjE7Ci0JdTgJCQlwd2xlZGNudDsKLQl1MTYJCQlrZXlfYWRkcjsKLQlzdHJ1Y3QgdXJiCQkqaW50X3VyYjsKLQl1OAkJCSp1cmJfZGF0YTsKLQotCWludCAoKmdldF9rZXkpIChzdHJ1Y3QgdG02MDAwX0lSICosIHN0cnVjdCB0bTYwMDBfaXJfcG9sbF9yZXN1bHQgKik7Ci0KLQkvKiBJUiBkZXZpY2UgcHJvcGVydGllcyAqLwotCXU2NAkJCXJjX3R5cGU7Ci19OwotCi0KLXZvaWQgdG02MDAwX2lyX3dhaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHN0YXRlKQotewotCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gZGV2LT5pcjsKLQotCWlmICghZGV2LT5pcikKLQkJcmV0dXJuOwotCi0JaWYgKHN0YXRlKQotCQlpci0+d2FpdCA9IDE7Ci0JZWxzZQotCQlpci0+d2FpdCA9IDA7Ci19Ci0KLQotc3RhdGljIGludCB0bTYwMDBfaXJfY29uZmlnKHN0cnVjdCB0bTYwMDBfSVIgKmlyKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gaXItPmRldjsKLQl1OCBidWZbMTBdOwotCWludCByYzsKLQotCXN3aXRjaCAoaXItPnJjX3R5cGUpIHsKLQljYXNlIFJDX1RZUEVfTkVDOgotCQkvKiBTZXR1cCBJUiBkZWNvZGVyIGZvciBORUMgc3RhbmRhcmQgMTJNSHogc3lzdGVtIGNsb2NrICovCi0JCS8qIElSX0xFQURFUl9DTlQgPSAwLjltcyAgICAgICAgICAgICAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDhfSVJfTEVBREVSMSwgMHhhYSk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEOF9JUl9MRUFERVIwLCAweDMwKTsKLQkJLyogSVJfUFVMU0VfQ05UID0gMC43bXMgICAgICAgICAgICAgICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEOF9JUl9QVUxTRV9DTlQxLCAweDIwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1BVTFNFX0NOVDAsIDB4ZDApOwotCQkvKiBSZW1vdGUgV0FLRVVQID0gZW5hYmxlICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JFNV9SRU1PVEVfV0FLRVVQLCAweGZlKTsKLQkJLyogSVJfV0tVUF9TRUwgPSBMb3cgYnl0ZSBpbiBkZWNvZGVkIElSIGRhdGEgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9TRUwsIDB4ZmYpOwotCQkvKiBJUl9XS1VfQUREIGNvZGUgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9BREQsIDB4ZmYpOwotCQl0bTYwMDBfZmxhc2hfbGVkKGRldiwgMCk7Ci0JCW1zbGVlcCgxMDApOwotCQl0bTYwMDBfZmxhc2hfbGVkKGRldiwgMSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGhhY2sgKi8KLQkJYnVmWzBdID0gMHhmZjsKLQkJYnVmWzFdID0gMHhmZjsKLQkJYnVmWzJdID0gMHhmMjsKLQkJYnVmWzNdID0gMHgyYjsKLQkJYnVmWzRdID0gMHgyMDsKLQkJYnVmWzVdID0gMHgzNTsKLQkJYnVmWzZdID0gMHg2MDsKLQkJYnVmWzddID0gMHgwNDsKLQkJYnVmWzhdID0gMHhjMDsKLQkJYnVmWzldID0gMHgwODsKLQotCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKLQkJCVVTQl9SRUNJUF9ERVZJQ0UsIFJFUV8wMF9TRVRfSVJfVkFMVUUsIDAsIDAsIGJ1ZiwgMHgwYSk7Ci0JCW1zbGVlcCgxMDApOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIklSIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRtNjAwMF9pcl91cmJfcmVjZWl2ZWQoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gZGV2LT5pcjsKLQlpbnQgcmM7Ci0KLQlpZiAodXJiLT5zdGF0dXMgIT0gMCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAibm90IHJlYWR5XG4iKTsKLQllbHNlIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7Ci0JCW1lbWNweShpci0+dXJiX2RhdGEsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCi0JCWRwcmludGsoImRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgaXItPnVyYl9kYXRhWzBdLAotCQkJaXItPnVyYl9kYXRhWzFdLCBpci0+dXJiX2RhdGFbMl0sIGlyLT51cmJfZGF0YVszXSk7Ci0KLQkJaXItPmtleSA9IDE7Ci0JfQotCi0JcmMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotfQotCi1zdGF0aWMgaW50IGRlZmF1bHRfcG9sbGluZ19nZXRrZXkoc3RydWN0IHRtNjAwMF9JUiAqaXIsCi0JCQkJc3RydWN0IHRtNjAwMF9pcl9wb2xsX3Jlc3VsdCAqcG9sbF9yZXN1bHQpCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBpci0+ZGV2OwotCWludCByYzsKLQl1OCBidWZbMl07Ci0KLQlpZiAoaXItPndhaXQgJiYgISZkZXYtPmludF9pbikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoJmRldi0+aW50X2luKSB7Ci0JCXN3aXRjaCAoaXItPnJjX3R5cGUpIHsKLQkJY2FzZSBSQ19UWVBFX1JDNToKLQkJCXBvbGxfcmVzdWx0LT5yY19kYXRhID0gaXItPnVyYl9kYXRhWzBdOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkNfVFlQRV9ORUM6Ci0JCQlpZiAoaXItPnVyYl9kYXRhWzFdID09ICgoaXItPmtleV9hZGRyID4+IDgpICYgMHhmZikpIHsKLQkJCQlwb2xsX3Jlc3VsdC0+cmNfZGF0YSA9IGlyLT51cmJfZGF0YVswXQotCQkJCQkJCXwgaXItPnVyYl9kYXRhWzFdIDw8IDg7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXBvbGxfcmVzdWx0LT5yY19kYXRhID0gaXItPnVyYl9kYXRhWzBdCi0JCQkJCXwgaXItPnVyYl9kYXRhWzFdIDw8IDg7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMiwgMCk7Ci0JCW1zbGVlcCgxMCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMiwgMSk7Ci0JCW1zbGVlcCgxMCk7Ci0KLQkJaWYgKGlyLT5yY190eXBlID09IFJDX1RZUEVfUkM1KSB7Ci0JCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfAotCQkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkJUkVRXzAyX0dFVF9JUl9DT0RFLCAwLCAwLCBidWYsIDEpOwotCi0JCQltc2xlZXAoMTApOwotCi0JCQlkcHJpbnRrKCJyZWFkIGRhdGE9JTAyeFxuIiwgYnVmWzBdKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlwb2xsX3Jlc3VsdC0+cmNfZGF0YSA9IGJ1ZlswXTsKLQkJfSBlbHNlIHsKLQkJCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8Ci0JCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCQlSRVFfMDJfR0VUX0lSX0NPREUsIDAsIDAsIGJ1ZiwgMik7Ci0KLQkJCW1zbGVlcCgxMCk7Ci0KLQkJCWRwcmludGsoInJlYWQgZGF0YT0lMDR4XG4iLCBidWZbMF0gfCBidWZbMV0gPDwgOCk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJcG9sbF9yZXN1bHQtPnJjX2RhdGEgPSBidWZbMF0gfCBidWZbMV0gPDwgODsKLQkJfQotCQlpZiAoKHBvbGxfcmVzdWx0LT5yY19kYXRhICYgMHgwMGZmKSAhPSAweGZmKQotCQkJaXItPmtleSA9IDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0bTYwMDBfaXJfaGFuZGxlX2tleShzdHJ1Y3QgdG02MDAwX0lSICppcikKLXsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGlyLT5kZXY7Ci0JaW50IHJlc3VsdDsKLQlzdHJ1Y3QgdG02MDAwX2lyX3BvbGxfcmVzdWx0IHBvbGxfcmVzdWx0OwotCi0JLyogcmVhZCB0aGUgcmVnaXN0ZXJzIGNvbnRhaW5pbmcgdGhlIElSIHN0YXR1cyAqLwotCXJlc3VsdCA9IGlyLT5nZXRfa2V5KGlyLCAmcG9sbF9yZXN1bHQpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImlyLT5nZXRfa2V5KCkgZmFpbGVkICVkXG4iLCByZXN1bHQpOwotCQlyZXR1cm47Ci0JfQotCi0JZHByaW50aygiaXItPmdldF9rZXkgcmVzdWx0IGRhdGE9JTA0eFxuIiwgcG9sbF9yZXN1bHQucmNfZGF0YSk7Ci0KLQlpZiAoaXItPnB3bGVkKSB7Ci0JCWlmIChpci0+cHdsZWRjbnQgPj0gUFdMRURfT0ZGKSB7Ci0JCQlpci0+cHdsZWQgPSAwOwotCQkJaXItPnB3bGVkY250ID0gMDsKLQkJCXRtNjAwMF9mbGFzaF9sZWQoZGV2LCAxKTsKLQkJfSBlbHNlCi0JCQlpci0+cHdsZWRjbnQgKz0gMTsKLQl9Ci0KLQlpZiAoaXItPmtleSkgewotCQlyY19rZXlkb3duKGlyLT5yYywgcG9sbF9yZXN1bHQucmNfZGF0YSwgMCk7Ci0JCWlyLT5rZXkgPSAwOwotCQlpci0+cHdsZWQgPSAxOwotCQlpci0+cHdsZWRjbnQgPSAwOwotCQl0bTYwMDBfZmxhc2hfbGVkKGRldiwgMCk7Ci0JfQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdG02MDAwX2lyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0bTYwMDBfSVIsIHdvcmsud29yayk7Ci0KLQl0bTYwMDBfaXJfaGFuZGxlX2tleShpcik7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpci0+d29yaywgbXNlY3NfdG9famlmZmllcyhpci0+cG9sbGluZykpOwotfQotCi1zdGF0aWMgaW50IHRtNjAwMF9pcl9zdGFydChzdHJ1Y3QgcmNfZGV2ICpyYykKLXsKLQlzdHJ1Y3QgdG02MDAwX0lSICppciA9IHJjLT5wcml2OwotCi0JSU5JVF9ERUxBWUVEX1dPUksoJmlyLT53b3JrLCB0bTYwMDBfaXJfd29yayk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpci0+d29yaywgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdG02MDAwX2lyX3N0b3Aoc3RydWN0IHJjX2RldiAqcmMpCi17Ci0Jc3RydWN0IHRtNjAwMF9JUiAqaXIgPSByYy0+cHJpdjsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaXItPndvcmspOwotfQotCi1pbnQgdG02MDAwX2lyX2NoYW5nZV9wcm90b2NvbChzdHJ1Y3QgcmNfZGV2ICpyYywgdTY0IHJjX3R5cGUpCi17Ci0Jc3RydWN0IHRtNjAwMF9JUiAqaXIgPSByYy0+cHJpdjsKLQotCWlmICghaXIpCi0JCXJldHVybiAwOwotCi0JaWYgKChyYy0+cmNfbWFwLnNjYW4pICYmIChyY190eXBlID09IFJDX1RZUEVfTkVDKSkKLQkJaXItPmtleV9hZGRyID0gKChyYy0+cmNfbWFwLnNjYW5bMF0uc2NhbmNvZGUgPj4gOCkgJiAweGZmZmYpOwotCi0JaXItPmdldF9rZXkgPSBkZWZhdWx0X3BvbGxpbmdfZ2V0a2V5OwotCWlyLT5yY190eXBlID0gcmNfdHlwZTsKLQotCXRtNjAwMF9pcl9jb25maWcoaXIpOwotCS8qIFRPRE8gKi8KLQlyZXR1cm4gMDsKLX0KLQotaW50IHRtNjAwMF9pcl9pbnRfc3RhcnQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0Jc3RydWN0IHRtNjAwMF9JUiAqaXIgPSBkZXYtPmlyOwotCWludCBwaXBlLCBzaXplOwotCWludCBlcnIgPSAtRU5PTUVNOwotCi0KLQlpZiAoIWlyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlyLT5pbnRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlyLT5pbnRfdXJiKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBpcGUgPSB1c2JfcmN2aW50cGlwZShkZXYtPnVkZXYsCi0JCWRldi0+aW50X2luLmVuZHAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcwotCQkmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7Ci0KLQlzaXplID0gdXNiX21heHBhY2tldChkZXYtPnVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKLQlkcHJpbnRrKCJJUiBtYXggc2l6ZTogJWRcbiIsIHNpemUpOwotCi0JaXItPmludF91cmItPnRyYW5zZmVyX2J1ZmZlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGlyLT5pbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewotCQl1c2JfZnJlZV91cmIoaXItPmludF91cmIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlkcHJpbnRrKCJpbnQgaW50ZXJ2YWw6ICVkXG4iLCBkZXYtPmludF9pbi5lbmRwLT5kZXNjLmJJbnRlcnZhbCk7Ci0JdXNiX2ZpbGxfaW50X3VyYihpci0+aW50X3VyYiwgZGV2LT51ZGV2LCBwaXBlLAotCQlpci0+aW50X3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBzaXplLAotCQl0bTYwMDBfaXJfdXJiX3JlY2VpdmVkLCBkZXYsCi0JCWRldi0+aW50X2luLmVuZHAtPmRlc2MuYkludGVydmFsKTsKLQllcnIgPSB1c2Jfc3VibWl0X3VyYihpci0+aW50X3VyYiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGVycikgewotCQlrZnJlZShpci0+aW50X3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJdXNiX2ZyZWVfdXJiKGlyLT5pbnRfdXJiKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JaXItPnVyYl9kYXRhID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHRtNjAwMF9pcl9pbnRfc3RvcChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX0lSICppciA9IGRldi0+aXI7Ci0KLQlpZiAoIWlyKQotCQlyZXR1cm47Ci0KLQl1c2Jfa2lsbF91cmIoaXItPmludF91cmIpOwotCWtmcmVlKGlyLT5pbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwotCXVzYl9mcmVlX3VyYihpci0+aW50X3VyYik7Ci0JaXItPmludF91cmIgPSBOVUxMOwotCWtmcmVlKGlyLT51cmJfZGF0YSk7Ci0JaXItPnVyYl9kYXRhID0gTlVMTDsKLX0KLQotaW50IHRtNjAwMF9pcl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0bTYwMDBfSVIgKmlyOwotCXN0cnVjdCByY19kZXYgKnJjOwotCWludCBlcnIgPSAtRU5PTUVNOwotCi0JaWYgKCFlbmFibGVfaXIpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCFkZXYtPmNhcHMuaGFzX3JlbW90ZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWRldi0+aXJfY29kZXMpCi0JCXJldHVybiAwOwotCi0JaXIgPSBremFsbG9jKHNpemVvZigqaXIpLCBHRlBfS0VSTkVMKTsKLQlyYyA9IHJjX2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghaXIgfHwgIXJjKQotCQlnb3RvIG91dDsKLQotCS8qIHJlY29yZCBoYW5kbGVzIHRvIG91cnNlbGYgKi8KLQlpci0+ZGV2ID0gZGV2OwotCWRldi0+aXIgPSBpcjsKLQlpci0+cmMgPSByYzsKLQotCS8qIGlucHV0IGVpbnJpY2h0ZW4gKi8KLQlyYy0+YWxsb3dlZF9wcm90b3MgPSBSQ19UWVBFX1JDNSB8IFJDX1RZUEVfTkVDOwotCXJjLT5wcml2ID0gaXI7Ci0JcmMtPmNoYW5nZV9wcm90b2NvbCA9IHRtNjAwMF9pcl9jaGFuZ2VfcHJvdG9jb2w7Ci0JcmMtPm9wZW4gPSB0bTYwMDBfaXJfc3RhcnQ7Ci0JcmMtPmNsb3NlID0gdG02MDAwX2lyX3N0b3A7Ci0JcmMtPmRyaXZlcl90eXBlID0gUkNfRFJJVkVSX1NDQU5DT0RFOwotCi0JaXItPnBvbGxpbmcgPSA1MDsKLQlpci0+cHdsZWQgPSAwOwotCWlyLT5wd2xlZGNudCA9IDA7Ci0KLQotCXNucHJpbnRmKGlyLT5uYW1lLCBzaXplb2YoaXItPm5hbWUpLCAidG01NjAwLzYweDAgSVIgKCVzKSIsCi0JCQkJCQlkZXYtPm5hbWUpOwotCi0JdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpKTsKLQlzdHJsY2F0KGlyLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihpci0+cGh5cykpOwotCi0JdG02MDAwX2lyX2NoYW5nZV9wcm90b2NvbChyYywgUkNfVFlQRV9VTktOT1dOKTsKLQotCXJjLT5pbnB1dF9uYW1lID0gaXItPm5hbWU7Ci0JcmMtPmlucHV0X3BoeXMgPSBpci0+cGh5czsKLQlyYy0+aW5wdXRfaWQuYnVzdHlwZSA9IEJVU19VU0I7Ci0JcmMtPmlucHV0X2lkLnZlcnNpb24gPSAxOwotCXJjLT5pbnB1dF9pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwotCXJjLT5pbnB1dF9pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0JcmMtPm1hcF9uYW1lID0gZGV2LT5pcl9jb2RlczsKLQlyYy0+ZHJpdmVyX25hbWUgPSAidG02MDAwIjsKLQlyYy0+ZGV2LnBhcmVudCA9ICZkZXYtPnVkZXYtPmRldjsKLQotCWlmICgmZGV2LT5pbnRfaW4pIHsKLQkJZHByaW50aygiSVIgb3ZlciBpbnRcbiIpOwotCi0JCWVyciA9IHRtNjAwMF9pcl9pbnRfc3RhcnQoZGV2KTsKLQotCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JLyogaXIgcmVnaXN0ZXIgKi8KLQllcnIgPSByY19yZWdpc3Rlcl9kZXZpY2UocmMpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JcmV0dXJuIDA7Ci0KLW91dDoKLQlkZXYtPmlyID0gTlVMTDsKLQlyY19mcmVlX2RldmljZShyYyk7Ci0Ja2ZyZWUoaXIpOwotCXJldHVybiBlcnI7Ci19Ci0KLWludCB0bTYwMDBfaXJfZmluaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX0lSICppciA9IGRldi0+aXI7Ci0KLQkvKiBza2lwIGRldGFjaCBvbiBub24gYXR0YWNoZWQgYm9hcmQgKi8KLQotCWlmICghaXIpCi0JCXJldHVybiAwOwotCi0JcmNfdW5yZWdpc3Rlcl9kZXZpY2UoaXItPnJjKTsKLQotCWlmIChpci0+aW50X3VyYikKLQkJdG02MDAwX2lyX2ludF9zdG9wKGRldik7Ci0KLQlrZnJlZShpcik7Ci0JZGV2LT5pciA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXJlZ3MuaCBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXJlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3NWE4My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTggKzAsMCBAQAotLyoKLSAqICB0bTYwMDAtcmVncy5oIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLS8qCi0gKiBEZWZpbmUgVFYgTWFzdGVyIFRNNTYwMC9UTTYwMDAvVE02MDEwIFJlcXVlc3QgY29kZXMKLSAqLwotI2RlZmluZSBSRVFfMDBfU0VUX0lSX1ZBTFVFCQkwCi0jZGVmaW5lIFJFUV8wMV9TRVRfV0FLRVVQX0lSQ09ERQkxCi0jZGVmaW5lIFJFUV8wMl9HRVRfSVJfQ09ERQkJMgotI2RlZmluZSBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOCQkzCi0jZGVmaW5lIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQJNAotI2RlZmluZSBSRVFfMDVfU0VUX0dFVF9VU0JSRUcJCTUKLQkvKiBXcml0ZTogUmVnTnVtLCBWYWx1ZSwgMCAqLwotCS8qIFJlYWQgOiBSZWdOdW0sIFZhbHVlLCAxLCBSZWdTdGF0dXMgKi8KLSNkZWZpbmUgUkVRXzA2X1NFVF9HRVRfVVNCUkVHX0JJVAk2Ci0jZGVmaW5lIFJFUV8wN19TRVRfR0VUX0FWUkVHCQk3Ci0JLyogV3JpdGU6IFJlZ051bSwgVmFsdWUsIDAgKi8KLQkvKiBSZWFkIDogUmVnTnVtLCBWYWx1ZSwgMSwgUmVnU3RhdHVzICovCi0jZGVmaW5lIFJFUV8wOF9TRVRfR0VUX0FWUkVHX0JJVAk4Ci0jZGVmaW5lIFJFUV8wOV9TRVRfR0VUX1RVTkVSX0ZRCQk5Ci0jZGVmaW5lIFJFUV8xMF9TRVRfVFVORVJfU1lTVEVNCQkxMAotI2RlZmluZSBSRVFfMTFfU0VUX0VFUFJPTV9BRERSCQkxMQotI2RlZmluZSBSRVFfMTJfU0VUX0dFVF9FRVBST01CWVRFCTEyCi0jZGVmaW5lIFJFUV8xM19HRVRfRUVQUk9NX1NFUVJFQUQJMTMKLSNkZWZpbmUgUkVRXzE0X1NFVF9HRVRfSTJDX1dSMl9SRE4JMTQKLSNkZWZpbmUgUkVRXzE1X1NFVF9HRVRfSTJDQllURQkJMTUKLQkvKiBXcml0ZTogU3ViYWRkciwgU2xhdmUgQWRkciwgdmFsdWUsIDAgKi8KLQkvKiBSZWFkIDogU3ViYWRkciwgU2xhdmUgQWRkciwgdmFsdWUsIDEgKi8KLSNkZWZpbmUgUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4JMTYKLQkvKiBTdWJhZGRyLCBTbGF2ZSBBZGRyLCAwLCBsZW5ndGggKi8KLSNkZWZpbmUgUkVRXzE3X1NFVF9HRVRfSTJDRlAJCTE3Ci0JLyogV3JpdGU6IFNsYXZlIEFkZHIsIHJlZ2lzdGVyLCB2YWx1ZSAqLwotCS8qIFJlYWQgOiBTbGF2ZSBBZGRyLCByZWdpc3RlciwgMiwgZGF0YSAqLwotI2RlZmluZSBSRVFfMjBfREFUQV9UUkFOU0ZFUgkJMjAKLSNkZWZpbmUgUkVRXzMwX0kyQ19XUklURQkJMzAKLSNkZWZpbmUgUkVRXzMxX0kyQ19SRUFECQkJMzEKLSNkZWZpbmUgUkVRXzM1X0FGVEVLX1RVTkVSX1JFQUQJCTM1Ci0jZGVmaW5lIFJFUV80MF9HRVRfVkVSU0lPTgkJNDAKLSNkZWZpbmUgUkVRXzUwX1NFVF9TVEFSVAkJNTAKLSNkZWZpbmUgUkVRXzUxX1NFVF9TVE9QCQkJNTEKLSNkZWZpbmUgUkVRXzUyX1RSQU5TTUlUX0RBVEEJCTUyCi0jZGVmaW5lIFJFUV81M19TUElfSU5JVElBTAkJNTMKLSNkZWZpbmUgUkVRXzU0X1NQSV9TRVRTVEFSVAkJNTQKLSNkZWZpbmUgUkVRXzU1X1NQSV9JTk9VVERBVEEJCTU1Ci0jZGVmaW5lIFJFUV81Nl9TUElfU0VUU1RPUAkJNTYKLQotLyoKLSAqIERlZmluZSBUViBNYXN0ZXIgVE01NjAwL1RNNjAwMC9UTTYwMTAgR1BJTyBsaW5lcwotICovCi0KLSNkZWZpbmUgVE02MDAwX0dQSU9fQ0xLCQkweDEwMQotI2RlZmluZSBUTTYwMDBfR1BJT19EQVRBCTB4MTAwCi0KLSNkZWZpbmUgVE02MDAwX0dQSU9fMQkJMHgxMDIKLSNkZWZpbmUgVE02MDAwX0dQSU9fMgkJMHgxMDMKLSNkZWZpbmUgVE02MDAwX0dQSU9fMwkJMHgxMDQKLSNkZWZpbmUgVE02MDAwX0dQSU9fNAkJMHgzMDAKLSNkZWZpbmUgVE02MDAwX0dQSU9fNQkJMHgzMDEKLSNkZWZpbmUgVE02MDAwX0dQSU9fNgkJMHgzMDQKLSNkZWZpbmUgVE02MDAwX0dQSU9fNwkJMHgzMDUKLQotLyogdG02MDEwIGRlZmluZXMgR1BJTyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKi8KLSNkZWZpbmUgVE02MDEwX0dQSU9fMCAgICAgIDB4MDEwMgotI2RlZmluZSBUTTYwMTBfR1BJT18xICAgICAgMHgwMTAzCi0jZGVmaW5lIFRNNjAxMF9HUElPXzIgICAgICAweDAxMDQKLSNkZWZpbmUgVE02MDEwX0dQSU9fMyAgICAgIDB4MDEwNQotI2RlZmluZSBUTTYwMTBfR1BJT180ICAgICAgMHgwMTA2Ci0jZGVmaW5lIFRNNjAxMF9HUElPXzUgICAgICAweDAxMDcKLSNkZWZpbmUgVE02MDEwX0dQSU9fNiAgICAgIDB4MDMwMAotI2RlZmluZSBUTTYwMTBfR1BJT183ICAgICAgMHgwMzAxCi0jZGVmaW5lIFRNNjAxMF9HUElPXzkgICAgICAweDAzMDUKLS8qCi0gKiBEZWZpbmUgVFYgTWFzdGVyIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVSQiBtZXNzYWdlIGNvZGVzIGFuZCBsZW5ndGgKLSAqLwotCi1lbnVtIHsKLQlUTTYwMDBfVVJCX01TR19WSURFTz0xLAotCVRNNjAwMF9VUkJfTVNHX0FVRElPLAotCVRNNjAwMF9VUkJfTVNHX1ZCSSwKLQlUTTYwMDBfVVJCX01TR19QVFMsCi0JVE02MDAwX1VSQl9NU0dfRVJSLAotfTsKLQotLyogRGVmaW5lIHNwZWNpZmljIFRNNjAwMCBWaWRlbyBkZWNvZGVyIHJlZ2lzdGVycyAqLwotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkQ4X1RFU1RfU0VMCQkJMHgwNywgMHhkOAotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkQ5X0FfU0lNX1NFTAkJCTB4MDcsIDB4ZDkKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JEQV9DTEtfU0VMCQkJMHgwNywgMHhkYQotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkRCX09VVF9TRUwJCQkweDA3LCAweGRiCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRENfTlNFTF9JMlMJCQkweDA3LCAweGRjCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRERfR1BJTzJfTURSVgkJCTB4MDcsIDB4ZGQKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JERV9HUElPMV9NRFJWCQkJMHgwNywgMHhkZQotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkRGX1BXRE9XTl9BQ0xLCQkJMHgwNywgMHhkZgotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkUwX1ZBRENfUkVGX0NUTAkJCTB4MDcsIDB4ZTAKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JFMV9WQURDX0RBQ0xJTVAJCQkweDA3LCAweGUxCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTJfVkFEQ19TVEFUVVNfQ1RMCQkweDA3LCAweGUyCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTNfVkFEQ19JTlBfTFBGX1NFTDEJCTB4MDcsIDB4ZTMKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JFNF9WQURDX1RBUkdFVDEJCQkweDA3LCAweGU0Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTVfVkFEQ19JTlBfTFBGX1NFTDIJCTB4MDcsIDB4ZTUKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JFNl9WQURDX1RBUkdFVDIJCQkweDA3LCAweGU2Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTdfVkFEQ19BR0FJTl9DVEwJCQkweDA3LCAweGU3Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMCQkweDA3LCAweGU4Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTlfVkFEQ19JTlBVVF9DVEwxCQkweDA3LCAweGU5Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUFfVkFEQ19JTlBVVF9DVEwyCQkweDA3LCAweGVhCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUJCQkweDA3LCAweGViCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUNfVkFEQ19BQURDX0xWT0wJCQkweDA3LCAweGVjCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRURfVkFEQ19BQURDX1JWT0wJCQkweDA3LCAweGVkCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUVfVkFEQ19DVFJMX1NFTF9DT05UUk9MCQkweDA3LCAweGVlCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUZfVkFEQ19HQUlOX01BUF9DVEwJCTB4MDcsIDB4ZWYKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JGRF9CSVNUX0VSUl9WU1RfTE9XCQkweDA3LCAweGZkCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRkVfQklTVF9FUlJfVlNUX0hJR0gJCTB4MDcsIDB4ZmUKLQotLyogRGVmaW5lIFRNNjAwMC9UTTYwMTAgVmlkZW8gZGVjb2RlciByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMAkJCTB4MDcsIDB4MDAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMQkJCTB4MDcsIDB4MDEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMgkJCTB4MDcsIDB4MDIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTAkJCTB4MDcsIDB4MDMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTAkJMHgwNywgMHgwNAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA1X05PSVNFX1RIUkVTSE9MRAkJMHgwNywgMHgwNQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA2X0FHQ19HQVRFX1RIUkVTSE9MRAkJMHgwNywgMHgwNgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MCQkJMHgwNywgMHgwNwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA4X0xVTUFfQ09OVFJBU1RfQURKCQkweDA3LCAweDA4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMDlfTFVNQV9CUklHSFRORVNTX0FESgkJMHgwNywgMHgwOQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjBBX0NIUk9NQV9TQVRVUkFUSU9OX0FESgkJMHgwNywgMHgwYQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjBCX0NIUk9NQV9IVUVfUEhBU0VfQURKCQkweDA3LCAweDBiCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMENfQ0hST01BX0FHQ19DT05UUk9MCQkweDA3LCAweDBjCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwJCTB4MDcsIDB4MGQKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwRl9DSFJPTUFfQVVUT19QT1NJVElPTgkJMHgwNywgMHgwZgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjEwX0FHQ19QRUFLX05PTUlOQUwJCTB4MDcsIDB4MTAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IxMV9BR0NfUEVBS19DT05UUk9MCQkweDA3LCAweDExCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTJfQUdDX0dBVEVfU1RBUlRICQkweDA3LCAweDEyCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTNfQUdDX0dBVEVfU1RBUlRMCQkweDA3LCAweDEzCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTRfQUdDX0dBVEVfV0lEVEgJCQkweDA3LCAweDE0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTVfQUdDX0JQX0RFTEFZCQkJMHgwNywgMHgxNQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjE2X0xPQ0tfQ09VTlQJCQkweDA3LCAweDE2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTdfSExPT1BfTUFYU1RBVEUJCQkweDA3LCAweDE3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzCQkweDA3LCAweDE4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyCQkweDA3LCAweDE5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxCQkweDA3LCAweDFhCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwCQkweDA3LCAweDFiCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMJCTB4MDcsIDB4MWMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMgkJMHgwNywgMHgxZAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxCQkweDA3LCAweDFlCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAJCTB4MDcsIDB4MWYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyMF9IU1lOQ19SSVNJTkdfRURHRV9USU1FCQkweDA3LCAweDIwCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMjFfSFNZTkNfUEhBU0VfT0ZGU0VUCQkweDA3LCAweDIxCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMjJfSFNZTkNfUExMX1NUQVJUX1RJTUUJCTB4MDcsIDB4MjIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyM19IU1lOQ19QTExfRU5EX1RJTUUJCTB4MDcsIDB4MjMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyNF9IU1lOQ19USVBfU1RBUlRfVElNRQkJMHgwNywgMHgyNAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjI1X0hTWU5DX1RJUF9FTkRfVElNRQkJMHgwNywgMHgyNQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjI2X0hTWU5DX1JJU0lOR19FREdFX1NUQVJUCTB4MDcsIDB4MjYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyN19IU1lOQ19SSVNJTkdfRURHRV9FTkQJCTB4MDcsIDB4MjcKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyOF9CQUNLUE9SQ0hfU1RBUlQJCTB4MDcsIDB4MjgKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyOV9CQUNLUE9SQ0hfRU5ECQkJMHgwNywgMHgyOQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjJBX0hTWU5DX0ZJTFRFUl9TVEFSVAkJMHgwNywgMHgyYQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjJCX0hTWU5DX0ZJTFRFUl9FTkQJCTB4MDcsIDB4MmIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyQ19DSFJPTUFfQlVSU1RfU1RBUlQJCTB4MDcsIDB4MmMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyRF9DSFJPTUFfQlVSU1RfRU5ECQkweDA3LCAweDJkCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVAkJMHgwNywgMHgyZQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjJGX0FDVElWRV9WSURFT19IV0lEVEgJCTB4MDcsIDB4MmYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJUCQkweDA3LCAweDMwCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVAkJMHgwNywgMHgzMQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjMyX1ZTWU5DX0hMT0NLX01JTgkJMHgwNywgMHgzMgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWAkJMHgwNywgMHgzMwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjM0X1ZTWU5DX0FHQ19NSU4JCQkweDA3LCAweDM0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWAkJCTB4MDcsIDB4MzUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IzNl9WU1lOQ19WQklfTUlOCQkJMHgwNywgMHgzNgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjM3X1ZTWU5DX1ZCSV9NQVgJCQkweDA3LCAweDM3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMzhfVlNZTkNfVEhSRVNIT0xECQkweDA3LCAweDM4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMzlfVlNZTkNfVElNRV9DT05TVEFOVAkJMHgwNywgMHgzOQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjNBX1NUQVRVUzEJCQkweDA3LCAweDNhCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SM0JfU1RBVFVTMgkJCTB4MDcsIDB4M2IKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IzQ19TVEFUVVMzCQkJMHgwNywgMHgzYwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjNGX1JFU0VUCQkJCTB4MDcsIDB4M2YKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0MF9URUxFVEVYVF9WQklfQ09ERTAJCTB4MDcsIDB4NDAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0MV9URUxFVEVYVF9WQklfQ09ERTEJCTB4MDcsIDB4NDEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0Ml9WQklfREFUQV9ISUdIX0xFVkVMCQkweDA3LCAweDQyCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNDNfVkJJX0RBVEFfVFlQRV9MSU5FNwkJMHgwNywgMHg0MwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQ0X1ZCSV9EQVRBX1RZUEVfTElORTgJCTB4MDcsIDB4NDQKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0NV9WQklfREFUQV9UWVBFX0xJTkU5CQkweDA3LCAweDQ1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNDZfVkJJX0RBVEFfVFlQRV9MSU5FMTAJCTB4MDcsIDB4NDYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0N19WQklfREFUQV9UWVBFX0xJTkUxMQkJMHgwNywgMHg0NwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQ4X1ZCSV9EQVRBX1RZUEVfTElORTEyCQkweDA3LCAweDQ4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNDlfVkJJX0RBVEFfVFlQRV9MSU5FMTMJCTB4MDcsIDB4NDkKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0QV9WQklfREFUQV9UWVBFX0xJTkUxNAkJMHgwNywgMHg0YQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjRCX1ZCSV9EQVRBX1RZUEVfTElORTE1CQkweDA3LCAweDRiCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNENfVkJJX0RBVEFfVFlQRV9MSU5FMTYJCTB4MDcsIDB4NGMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0RF9WQklfREFUQV9UWVBFX0xJTkUxNwkJMHgwNywgMHg0ZAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjRFX1ZCSV9EQVRBX1RZUEVfTElORTE4CQkweDA3LCAweDRlCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNEZfVkJJX0RBVEFfVFlQRV9MSU5FMTkJCTB4MDcsIDB4NGYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1MF9WQklfREFUQV9UWVBFX0xJTkUyMAkJMHgwNywgMHg1MAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjUxX1ZCSV9EQVRBX1RZUEVfTElORTIxCQkweDA3LCAweDUxCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNTJfVkJJX0RBVEFfVFlQRV9MSU5FMjIJCTB4MDcsIDB4NTIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1M19WQklfREFUQV9UWVBFX0xJTkUyMwkJMHgwNywgMHg1MwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjU0X1ZCSV9EQVRBX1RZUEVfUkxJTkVTCQkweDA3LCAweDU0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNTVfVkJJX0xPT1BfRklMVEVSX0dBSU4JCTB4MDcsIDB4NTUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1Nl9WQklfTE9PUF9GSUxURVJfSV9HQUlOCQkweDA3LCAweDU2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNTdfVkJJX0xPT1BfRklMVEVSX1BfR0FJTgkJMHgwNywgMHg1NwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjU4X1ZCSV9DQVBUSU9OX0RUTzEJCTB4MDcsIDB4NTgKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1OV9WQklfQ0FQVElPTl9EVE8wCQkweDA3LCAweDU5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNUFfVkJJX1RFTEVURVhUX0RUTzEJCTB4MDcsIDB4NWEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1Ql9WQklfVEVMRVRFWFRfRFRPMAkJMHgwNywgMHg1YgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjVDX1ZCSV9XU1M2MjVfRFRPMQkJMHgwNywgMHg1YwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjVEX1ZCSV9XU1M2MjVfRFRPMAkJMHgwNywgMHg1ZAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjVFX1ZCSV9DQVBUSU9OX0ZSQU1FX1NUQVJUCTB4MDcsIDB4NWUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1Rl9WQklfV1NTNjI1X0ZSQU1FX1NUQVJUCQkweDA3LCAweDVmCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNjBfVEVMRVRFWFRfRlJBTUVfU1RBUlQJCTB4MDcsIDB4NjAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I2MV9WQklfQ0NEQVRBMQkJCTB4MDcsIDB4NjEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I2Ml9WQklfQ0NEQVRBMgkJCTB4MDcsIDB4NjIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I2M19WQklfV1NTNjI1X0RBVEExCQkweDA3LCAweDYzCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNjRfVkJJX1dTUzYyNV9EQVRBMgkJMHgwNywgMHg2NAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjY1X1ZCSV9EQVRBX1NUQVRVUwkJMHgwNywgMHg2NQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjY2X1ZCSV9DQVBUSU9OX1NUQVJUCQkweDA3LCAweDY2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNjdfVkJJX1dTUzYyNV9TVEFSVAkJMHgwNywgMHg2NwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjY4X1ZCSV9URUxFVEVYVF9TVEFSVAkJMHgwNywgMHg2OAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjcwX0hTWU5DX0RUT19JTkNfU1RBVFVTMwkJMHgwNywgMHg3MAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjcxX0hTWU5DX0RUT19JTkNfU1RBVFVTMgkJMHgwNywgMHg3MQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjcyX0hTWU5DX0RUT19JTkNfU1RBVFVTMQkJMHgwNywgMHg3MgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjczX0hTWU5DX0RUT19JTkNfU1RBVFVTMAkJMHgwNywgMHg3MwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjc0X0NIUk9NQV9EVE9fSU5DX1NUQVRVUzMJCTB4MDcsIDB4NzQKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I3NV9DSFJPTUFfRFRPX0lOQ19TVEFUVVMyCQkweDA3LCAweDc1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNzZfQ0hST01BX0RUT19JTkNfU1RBVFVTMQkJMHgwNywgMHg3NgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjc3X0NIUk9NQV9EVE9fSU5DX1NUQVRVUzAJCTB4MDcsIDB4NzcKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I3OF9BR0NfQUdBSU5fU1RBVFVTCQkweDA3LCAweDc4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNzlfQUdDX0RHQUlOX1NUQVRVUwkJMHgwNywgMHg3OQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjdBX0NIUk9NQV9NQUdfU1RBVFVTCQkweDA3LCAweDdhCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SN0JfQ0hST01BX0dBSU5fU1RBVFVTMQkJMHgwNywgMHg3YgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjdDX0NIUk9NQV9HQUlOX1NUQVRVUzAJCTB4MDcsIDB4N2MKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I3RF9DT1JESUNfRlJFUV9TVEFUVVMJCTB4MDcsIDB4N2QKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I3Rl9TVEFUVVNfTk9JU0UJCQkweDA3LCAweDdmCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SODBfQ09NQl9GSUxURVJfVFJFU0hPTEQJCTB4MDcsIDB4ODAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcJCTB4MDcsIDB4ODIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcJCTB4MDcsIDB4ODMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4NF9OT0lTRV9OVFNDX0MJCQkweDA3LCAweDg0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SODVfTk9JU0VfUEFMX0MJCQkweDA3LCAweDg1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SODZfTk9JU0VfUEhBU0VfQwkJCTB4MDcsIDB4ODYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4N19OT0lTRV9QSEFTRV9ZCQkJMHgwNywgMHg4NwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjhBX0NIUk9NQV9MT09QRklMVEVSX1NUQVRFCTB4MDcsIDB4OGEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4Ql9DSFJPTUFfSFJFU0FNUExFUgkJMHgwNywgMHg4YgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjhEX0NQVU1QX0RFTEFZX0FESgkJMHgwNywgMHg4ZAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjhFX0NQVU1QX0FESgkJCTB4MDcsIDB4OGUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4Rl9DUFVNUF9ERUxBWQkJCTB4MDcsIDB4OGYKLQotLyogRGVmaW5lIFRNNjAwMC9UTTYwMTAgTWlzY2VsbGFuZW91cyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFCQkweDA3LCAweGMwCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQzFfVFJFU0hPTEQJCQkweDA3LCAweGMxCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQzJfSFNZTkNfV0lEVEgJCQkweDA3LCAweGMyCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMQkJCTB4MDcsIDB4YzMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDNF9IU1RBUlQwCQkJMHgwNywgMHhjNAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkM1X0hFTkQxCQkJCTB4MDcsIDB4YzUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDNl9IRU5EMAkJCQkweDA3LCAweGM2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQzdfVlNUQVJUMQkJCTB4MDcsIDB4YzcKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDOF9WU1RBUlQwCQkJMHgwNywgMHhjOAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkM5X1ZFTkQxCQkJCTB4MDcsIDB4YzkKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDQV9WRU5EMAkJCQkweDA3LCAweGNhCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQ0JfREVMQVkJCQkJMHgwNywgMHhjYgotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX1ZJREVPX0lGCQkweDA3LCAweGNjCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDBfVVNCX1BFUklQSEVSWV9DT05UUk9MCQkweDA3LCAweGQwCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDFfQUREUl9GT1JfUkVRMQkJCTB4MDcsIDB4ZDEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEMl9BRERSX0ZPUl9SRVEyCQkJMHgwNywgMHhkMgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQzX0FERFJfRk9SX1JFUTMJCQkweDA3LCAweGQzCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDRfQUREUl9GT1JfUkVRNAkJCTB4MDcsIDB4ZDQKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JENV9QT1dFUlNBVkUJCQkweDA3LCAweGQ1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDZfRU5EUF9SRVExX1JFUTIJCQkweDA3LCAweGQ2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDdfRU5EUF9SRVEzX1JFUTQJCQkweDA3LCAweGQ3Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUgkJCQkweDA3LCAweGQ4Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9CU0laRQkJCTB4MDcsIDB4ZDkKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9TRUwJCQkweDA3LCAweGRhCi0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9XQUtFVVBfQURECQkJMHgwNywgMHhkYgotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVJfTEVBREVSMQkJCTB4MDcsIDB4ZGMKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSX0xFQURFUjAJCQkweDA3LCAweGRkCi0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9QVUxTRV9DTlQxCQkJMHgwNywgMHhkZQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVJfUFVMU0VfQ05UMAkJCTB4MDcsIDB4ZGYKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkUwX0RWSURFT19TT1VSQ0UJCQkweDA3LCAweGUwCi0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JFMF9EVklERU9fU09VUkNFX0lGCQkweDA3LCAweGUxCi0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JFMl9PVVRfU0VMMgkJCTB4MDcsIDB4ZTIKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkUzX09VVF9TRUwxCQkJMHgwNywgMHhlMwotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRTRfT1VUX1NFTDAJCQkweDA3LCAweGU0Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JFNV9SRU1PVEVfV0FLRVVQCQkJMHgwNywgMHhlNQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRTdfUFVCX0dQSU8JCQkweDA3LCAweGU3Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JFOF9UWVBFU0VMX01PU19JMlMJCTB4MDcsIDB4ZTgKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkU5X1RZUEVTRUxfTU9TX1RTCQkJMHgwNywgMHhlOQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRUFfVFlQRVNFTF9NT1NfQ0NJUgkJMHgwNywgMHhlYQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjBfQklTVF9DUkNfUkVTVUxUMAkJMHgwNywgMHhmMAotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjFfQklTVF9DUkNfUkVTVUxUMQkJMHgwNywgMHhmMQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjJfQklTVF9DUkNfUkVTVUxUMgkJMHgwNywgMHhmMgotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjNfQklTVF9DUkNfUkVTVUxUMwkJMHgwNywgMHhmMwotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjRfQklTVF9FUlJfVlNUMgkJCTB4MDcsIDB4ZjQKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkY1X0JJU1RfRVJSX1ZTVDEJCQkweDA3LCAweGY1Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JGNl9CSVNUX0VSUl9WU1QwCQkJMHgwNywgMHhmNgotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjdfQklTVAkJCQkweDA3LCAweGY3Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JGRV9QT1dFUl9ET1dOCQkJMHgwNywgMHhmZQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQJCQkweDA3LCAweGZmCi0KLS8qIERlZmluZSBUTTYwMDAvVE02MDEwIFVTQiByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwMF9NQUlOX0NUUkwJCTB4MDUsIDB4MDAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwMV9ERVZBRERSCQkweDA1LCAweDAxCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDJfVEVTVAkJCTB4MDUsIDB4MDIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwNF9TT0ZOMAkJCTB4MDUsIDB4MDQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwNV9TT0ZOMQkJCTB4MDUsIDB4MDUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwNl9TT0ZUTTAJCQkweDA1LCAweDA2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDdfU09GVE0xCQkJMHgwNSwgMHgwNwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjA4X1BIWV9URVNUCQkweDA1LCAweDA4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDlfVkNUTAkJCTB4MDUsIDB4MDkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwQV9WU1RBCQkJMHgwNSwgMHgwYQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjBCX0NYX0NGRwkJCTB4MDUsIDB4MGIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwQ19FTkRQMF9SRUcwCQkweDA1LCAweDBjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTBfR01BU0sJCQkweDA1LCAweDEwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTFfSU1BU0swCQkJMHgwNSwgMHgxMQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjEyX0lNQVNLMQkJCTB4MDUsIDB4MTIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IxM19JTUFTSzIJCQkweDA1LCAweDEzCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTRfSU1BU0szCQkJMHgwNSwgMHgxNAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjE1X0lNQVNLNAkJCTB4MDUsIDB4MTUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IxNl9JTUFTSzUJCQkweDA1LCAweDE2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTdfSU1BU0s2CQkJMHgwNSwgMHgxNwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjE4X0lNQVNLNwkJCTB4MDUsIDB4MTgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IxOV9aRVJPUDAJCQkweDA1LCAweDE5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMUFfWkVST1AxCQkJMHgwNSwgMHgxYQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjFDX0ZJRk9fRU1QMAkJMHgwNSwgMHgxYwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjFEX0ZJRk9fRU1QMQkJMHgwNSwgMHgxZAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjIwX0lSUV9HUk9VUAkJMHgwNSwgMHgyMAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjIxX0lSUV9TT1VSQ0UwCQkweDA1LCAweDIxCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjJfSVJRX1NPVVJDRTEJCTB4MDUsIDB4MjIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IyM19JUlFfU09VUkNFMgkJMHgwNSwgMHgyMwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjI0X0lSUV9TT1VSQ0UzCQkweDA1LCAweDI0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjVfSVJRX1NPVVJDRTQJCTB4MDUsIDB4MjUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IyNl9JUlFfU09VUkNFNQkJMHgwNSwgMHgyNgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjI3X0lSUV9TT1VSQ0U2CQkweDA1LCAweDI3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjhfSVJRX1NPVVJDRTcJCTB4MDUsIDB4MjgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IyOV9TRVFfRVJSMAkJMHgwNSwgMHgyOQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjJBX1NFUV9FUlIxCQkweDA1LCAweDJhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMkJfU0VRX0FCT1JUMAkJMHgwNSwgMHgyYgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjJDX1NFUV9BQk9SVDEJCTB4MDUsIDB4MmMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IyRF9UWF9aRVJPMAkJMHgwNSwgMHgyZAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjJFX1RYX1pFUk8xCQkweDA1LCAweDJlCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMkZfSURMRV9DTlQJCTB4MDUsIDB4MmYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDEJCQkweDA1LCAweDMwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzFfRk5PX1AyCQkJMHgwNSwgMHgzMQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMyX0ZOT19QMwkJCTB4MDUsIDB4MzIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzM19GTk9fUDQJCQkweDA1LCAweDMzCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzRfRk5PX1A1CQkJMHgwNSwgMHgzNAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjM1X0ZOT19QNgkJCTB4MDUsIDB4MzUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzNl9GTk9fUDcJCQkweDA1LCAweDM2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzdfRk5PX1A4CQkJMHgwNSwgMHgzNwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjM4X0ZOT19QOQkJCTB4MDUsIDB4MzgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDEwCQkweDA1LCAweDM5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzBfRk5PX1AxMQkJMHgwNSwgMHgzYQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMwX0ZOT19QMTIJCTB4MDUsIDB4M2IKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDEzCQkweDA1LCAweDNjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzBfRk5PX1AxNAkJMHgwNSwgMHgzZAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMwX0ZOT19QMTUJCTB4MDUsIDB4M2UKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxCQkweDA1LCAweDQwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDEJCTB4MDUsIDB4NDEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0Ml9JTl9NQVhQU19MT1cyCQkweDA1LCAweDQyCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDNfSU5fTUFYUFNfSElHSDIJCTB4MDUsIDB4NDMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0NF9JTl9NQVhQU19MT1czCQkweDA1LCAweDQ0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDVfSU5fTUFYUFNfSElHSDMJCTB4MDUsIDB4NDUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0Nl9JTl9NQVhQU19MT1c0CQkweDA1LCAweDQ2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDdfSU5fTUFYUFNfSElHSDQJCTB4MDUsIDB4NDcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0OF9JTl9NQVhQU19MT1c1CQkweDA1LCAweDQ4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDlfSU5fTUFYUFNfSElHSDUJCTB4MDUsIDB4NDkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0QV9JTl9NQVhQU19MT1c2CQkweDA1LCAweDRhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNEJfSU5fTUFYUFNfSElHSDYJCTB4MDUsIDB4NGIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0Q19JTl9NQVhQU19MT1c3CQkweDA1LCAweDRjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNERfSU5fTUFYUFNfSElHSDcJCTB4MDUsIDB4NGQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0RV9JTl9NQVhQU19MT1c4CQkweDA1LCAweDRlCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNEZfSU5fTUFYUFNfSElHSDgJCTB4MDUsIDB4NGYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I1MF9JTl9NQVhQU19MT1c5CQkweDA1LCAweDUwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNTFfSU5fTUFYUFNfSElHSDkJCTB4MDUsIDB4NTEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxMAkJMHgwNSwgMHg1MgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQxX0lOX01BWFBTX0hJR0gxMAkweDA1LCAweDUzCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDBfSU5fTUFYUFNfTE9XMTEJCTB4MDUsIDB4NTQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MV9JTl9NQVhQU19ISUdIMTEJMHgwNSwgMHg1NQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQwX0lOX01BWFBTX0xPVzEyCQkweDA1LCAweDU2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDEyCTB4MDUsIDB4NTcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxMwkJMHgwNSwgMHg1OAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQxX0lOX01BWFBTX0hJR0gxMwkweDA1LCAweDU5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDBfSU5fTUFYUFNfTE9XMTQJCTB4MDUsIDB4NWEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MV9JTl9NQVhQU19ISUdIMTQJMHgwNSwgMHg1YgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQwX0lOX01BWFBTX0xPVzE1CQkweDA1LCAweDVjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDE1CTB4MDUsIDB4NWQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMQkJMHgwNSwgMHg2MAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMQkweDA1LCAweDYxCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjJfT1VUX01BWFBTX0xPVzIJCTB4MDUsIDB4NjIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2M19PVVRfTUFYUFNfSElHSDIJMHgwNSwgMHg2MwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjY0X09VVF9NQVhQU19MT1czCQkweDA1LCAweDY0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjVfT1VUX01BWFBTX0hJR0gzCTB4MDUsIDB4NjUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2Nl9PVVRfTUFYUFNfTE9XNAkJMHgwNSwgMHg2NgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjY3X09VVF9NQVhQU19ISUdINAkweDA1LCAweDY3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjhfT1VUX01BWFBTX0xPVzUJCTB4MDUsIDB4NjgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2OV9PVVRfTUFYUFNfSElHSDUJMHgwNSwgMHg2OQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjZBX09VVF9NQVhQU19MT1c2CQkweDA1LCAweDZhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNkJfT1VUX01BWFBTX0hJR0g2CTB4MDUsIDB4NmIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2Q19PVVRfTUFYUFNfTE9XNwkJMHgwNSwgMHg2YwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjZEX09VVF9NQVhQU19ISUdINwkweDA1LCAweDZkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNkVfT1VUX01BWFBTX0xPVzgJCTB4MDUsIDB4NmUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2Rl9PVVRfTUFYUFNfSElHSDgJMHgwNSwgMHg2ZgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjcwX09VVF9NQVhQU19MT1c5CQkweDA1LCAweDcwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNzFfT1VUX01BWFBTX0hJR0g5CTB4MDUsIDB4NzEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMTAJMHgwNSwgMHg3MgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMTAJMHgwNSwgMHg3MwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYwX09VVF9NQVhQU19MT1cxMQkweDA1LCAweDc0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjFfT1VUX01BWFBTX0hJR0gxMQkweDA1LCAweDc1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjBfT1VUX01BWFBTX0xPVzEyCTB4MDUsIDB4NzYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MV9PVVRfTUFYUFNfSElHSDEyCTB4MDUsIDB4NzcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMTMJMHgwNSwgMHg3OAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMTMJMHgwNSwgMHg3OQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYwX09VVF9NQVhQU19MT1cxNAkweDA1LCAweDdhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjFfT1VUX01BWFBTX0hJR0gxNAkweDA1LCAweDdiCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjBfT1VUX01BWFBTX0xPVzE1CTB4MDUsIDB4N2MKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MV9PVVRfTUFYUFNfSElHSDE1CTB4MDUsIDB4N2QKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MF9GSUZPMAkJCTB4MDUsIDB4ODAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMQkJCTB4MDUsIDB4ODEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4Ml9GSUZPMgkJCTB4MDUsIDB4ODIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4M19GSUZPMwkJCTB4MDUsIDB4ODMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4NF9GSUZPNAkJCTB4MDUsIDB4ODQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4NV9GSUZPNQkJCTB4MDUsIDB4ODUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4Nl9GSUZPNgkJCTB4MDUsIDB4ODYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4N19GSUZPNwkJCTB4MDUsIDB4ODcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4OF9GSUZPOAkJCTB4MDUsIDB4ODgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4OV9GSUZPOQkJCTB4MDUsIDB4ODkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMTAJCQkweDA1LCAweDhhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SODFfRklGTzExCQkJMHgwNSwgMHg4YgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgxX0ZJRk8xMgkJCTB4MDUsIDB4OGMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMTMJCQkweDA1LCAweDhkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SODFfRklGTzE0CQkJMHgwNSwgMHg4ZQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgxX0ZJRk8xNQkJCTB4MDUsIDB4OGYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MF9DRkdfRklGTzAJCTB4MDUsIDB4OTAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzEJCTB4MDUsIDB4OTEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5Ml9DRkdfRklGTzIJCTB4MDUsIDB4OTIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5M19DRkdfRklGTzMJCTB4MDUsIDB4OTMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5NF9DRkdfRklGTzQJCTB4MDUsIDB4OTQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5NV9DRkdfRklGTzUJCTB4MDUsIDB4OTUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5Nl9DRkdfRklGTzYJCTB4MDUsIDB4OTYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5N19DRkdfRklGTzcJCTB4MDUsIDB4OTcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5OF9DRkdfRklGTzgJCTB4MDUsIDB4OTgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5OV9DRkdfRklGTzkJCTB4MDUsIDB4OTkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzEwCQkweDA1LCAweDlhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTFfQ0ZHX0ZJRk8xMQkJMHgwNSwgMHg5YgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkxX0NGR19GSUZPMTIJCTB4MDUsIDB4OWMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzEzCQkweDA1LCAweDlkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTFfQ0ZHX0ZJRk8xNAkJMHgwNSwgMHg5ZQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkxX0NGR19GSUZPMTUJCTB4MDUsIDB4OWYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMF9DVExfRklGTzAJCTB4MDUsIDB4YTAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzEJCTB4MDUsIDB4YTEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMl9DVExfRklGTzIJCTB4MDUsIDB4YTIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBM19DVExfRklGTzMJCTB4MDUsIDB4YTMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBNF9DVExfRklGTzQJCTB4MDUsIDB4YTQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBNV9DVExfRklGTzUJCTB4MDUsIDB4YTUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBNl9DVExfRklGTzYJCTB4MDUsIDB4YTYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBN19DVExfRklGTzcJCTB4MDUsIDB4YTcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBOF9DVExfRklGTzgJCTB4MDUsIDB4YTgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBOV9DVExfRklGTzkJCTB4MDUsIDB4YTkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzEwCQkweDA1LCAweGFhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTFfQ1RMX0ZJRk8xMQkJMHgwNSwgMHhhYgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkExX0NUTF9GSUZPMTIJCTB4MDUsIDB4YWMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzEzCQkweDA1LCAweGFkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTFfQ1RMX0ZJRk8xNAkJMHgwNSwgMHhhZQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkExX0NUTF9GSUZPMTUJCTB4MDUsIDB4YWYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMF9CQ19MT1dfRklGTzAJCTB4MDUsIDB4YjAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzEJCTB4MDUsIDB4YjEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMl9CQ19MT1dfRklGTzIJCTB4MDUsIDB4YjIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCM19CQ19MT1dfRklGTzMJCTB4MDUsIDB4YjMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCNF9CQ19MT1dfRklGTzQJCTB4MDUsIDB4YjQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCNV9CQ19MT1dfRklGTzUJCTB4MDUsIDB4YjUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCNl9CQ19MT1dfRklGTzYJCTB4MDUsIDB4YjYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCN19CQ19MT1dfRklGTzcJCTB4MDUsIDB4YjcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCOF9CQ19MT1dfRklGTzgJCTB4MDUsIDB4YjgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCOV9CQ19MT1dfRklGTzkJCTB4MDUsIDB4YjkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzEwCQkweDA1LCAweGJhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjFfQkNfTE9XX0ZJRk8xMQkJMHgwNSwgMHhiYgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIxX0JDX0xPV19GSUZPMTIJCTB4MDUsIDB4YmMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzEzCQkweDA1LCAweGJkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjFfQkNfTE9XX0ZJRk8xNAkJMHgwNSwgMHhiZQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIxX0JDX0xPV19GSUZPMTUJCTB4MDUsIDB4YmYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JDMF9EQVRBX0ZJRk8wCQkweDA1LCAweGMwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMQkJMHgwNSwgMHhjNAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM4X0RBVEFfRklGTzIJCTB4MDUsIDB4YzgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JDQ19EQVRBX0ZJRk8zCQkweDA1LCAweGNjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SRDBfREFUQV9GSUZPNAkJMHgwNSwgMHhkMAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkQ0X0RBVEFfRklGTzUJCTB4MDUsIDB4ZDQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JEOF9EQVRBX0ZJRk82CQkweDA1LCAweGQ4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SRENfREFUQV9GSUZPNwkJMHgwNSwgMHhkYwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkUwX0RBVEFfRklGTzgJCTB4MDUsIDB4ZTAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JFNF9EQVRBX0ZJRk85CQkweDA1LCAweGU0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMTAJCTB4MDUsIDB4ZTgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JDNF9EQVRBX0ZJRk8xMQkJMHgwNSwgMHhlYwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM0X0RBVEFfRklGTzEyCQkweDA1LCAweGYwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMTMJCTB4MDUsIDB4ZjQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JDNF9EQVRBX0ZJRk8xNAkJMHgwNSwgMHhmOAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM0X0RBVEFfRklGTzE1CQkweDA1LCAweGZjCi0KLS8qIERlZmluZSBUTTYwMTAgQXVkaW8gZGVjb2RlciByZWdpc3RlcnMgKi8KLS8qIFRoaXMgY29yZSBhdmFpbGFibGUgb25seSBpbiBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwMF9BX1ZFUlNJT04JCTB4MDgsIDB4MDAKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwMV9BX0lOSVQJCQkweDA4LCAweDAxCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDJfQV9GSVhfR0FJTl9DVFJMCTB4MDgsIDB4MDIKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwM19BX0FVVE9fR0FJTl9DVFJMCTB4MDgsIDB4MDMKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwNF9BX1NJRl9BTVBfQ1RSTAkJMHgwOCwgMHgwNAotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjA1X0FfU1RBTkRBUkRfTU9ECQkweDA4LCAweDA1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDZfQV9TT1VORF9NT0QJCTB4MDgsIDB4MDYKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwN19BX0xFRlRfVk9MCQkweDA4LCAweDA3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDhfQV9SSUdIVF9WT0wJCTB4MDgsIDB4MDgKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwOV9BX01BSU5fVk9MCQkweDA4LCAweDA5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMEFfQV9JMlNfTU9ECQkweDA4LCAweDBhCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMEJfQV9BU0RfVEhSRVMxCQkweDA4LCAweDBiCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMENfQV9BU0RfVEhSRVMyCQkweDA4LCAweDBjCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMERfQV9BTURfVEhSRVMJCTB4MDgsIDB4MGQKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwRV9BX01PTk9fVEhSRVMxCQkweDA4LCAweDBlCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMEZfQV9NT05PX1RIUkVTMgkJMHgwOCwgMHgwZgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjEwX0FfTVVURV9USFJFUzEJCTB4MDgsIDB4MTAKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxMV9BX01VVEVfVEhSRVMyCQkweDA4LCAweDExCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTJfQV9BR0NfVQkJMHgwOCwgMHgxMgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjEzX0FfQUdDX0VSUl9UCQkweDA4LCAweDEzCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTRfQV9BR0NfR0FJTl9JTklUCTB4MDgsIDB4MTQKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxNV9BX0FHQ19TVEVQX1RIUgkJMHgwOCwgMHgxNQotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjE2X0FfQUdDX0dBSU5fTUFYCQkweDA4LCAweDE2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTdfQV9BR0NfR0FJTl9NSU4JCTB4MDgsIDB4MTcKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxOF9BX1RSX0NUUkwJCTB4MDgsIDB4MTgKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxOV9BX0ZIXzJGSF9HQUlOCQkweDA4LCAweDE5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMUFfQV9OSUNBTV9TRVJfTUFYCTB4MDgsIDB4MWEKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxQl9BX05JQ0FNX1NFUl9NSU4JMHgwOCwgMHgxYgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjFFX0FfR0FJTl9ERUVNUEhfT1VUCTB4MDgsIDB4MWUKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxRl9BX1RFU1RfSU5URl9TRUwJMHgwOCwgMHgxZgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjIwX0FfVEVTVF9QSU5fU0VMCQkweDA4LCAweDIwCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjFfQV9BR0NfRVJSCQkweDA4LCAweDIxCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjJfQV9BR0NfR0FJTgkJMHgwOCwgMHgyMgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjIzX0FfTklDQU1fSU5GTwkJMHgwOCwgMHgyMwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjI0X0FfU0VSCQkJMHgwOCwgMHgyNAotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjI1X0FfQzFfQU1QCQkweDA4LCAweDI1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjZfQV9DMl9BTVAJCTB4MDgsIDB4MjYKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IyN19BX05PSVNFX0FNUAkJMHgwOCwgMHgyNwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjI4X0FfQVVESU9fTU9ERV9SRVMJMHgwOCwgMHgyOAotCi0vKiBEZWZpbmUgVE02MDEwIFZpZGVvIEFEQyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFMF9BRENfUkVGCQkweDA4LCAweGUwCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTFfREFDX0NMTVAJCTB4MDgsIDB4ZTEKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFMl9QT1dFUl9ET1dOX0NUUkwxCTB4MDgsIDB4ZTIKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFM19BRENfSU4xX1NFTAkJMHgwOCwgMHhlMwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkU0X0FEQ19JTjJfU0VMCQkweDA4LCAweGU0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTVfR0FJTl9QQVJBTQkJMHgwOCwgMHhlNQotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkU2X1BPV0VSX0RPV05fQ1RSTDIJMHgwOCwgMHhlNgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkU3X1JFR19HQUlOX1kJCTB4MDgsIDB4ZTcKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFOF9SRUdfR0FJTl9DCQkweDA4LCAweGU4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTlfQklBU19DVFJMCQkweDA4LCAweGU5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRUFfQlVGRl9EUlZfQ1RSTAkJMHgwOCwgMHhlYQotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkVCX1NJRl9HQUlOX0NUUkwJCTB4MDgsIDB4ZWIKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFQ19SRVZFUlNFX1lDX0NUUkwJMHgwOCwgMHhlYwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkVEX0dBSU5fU0VMCQkweDA4LCAweGVkCi0KLS8qIERlZmluZSBUTTYwMTAgQXVkaW8gQURDIHJlZ2lzdGVycyAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcJMHgwOCwgMHhmMAotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkYxX0FBRENfUE9XRVJfRE9XTgkweDA4LCAweGYxCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRjJfTEVGVF9DSEFOTkVMX1ZPTAkweDA4LCAweGYyCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRjNfUklHSFRfQ0hBTk5FTF9WT0wJMHgwOCwgMHhmMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtc3Rkcy5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtc3Rkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjI5ZDczLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXN0ZHMuYworKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0vKgotICogIHRtNjAwMC1zdGRzLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlICJ0bTYwMDAuaCIKLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotCi1zdGF0aWMgdW5zaWduZWQgaW50IHRtNjAxMF9hX21vZGUgPSAwOwotbW9kdWxlX3BhcmFtKHRtNjAxMF9hX21vZGUsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRtNjAxMF9hX21vZGUsICJzZXQgdG02MDEwIHNpZiBhdWRpbyBtb2RlIik7Ci0KLXN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzIHsKLQl1bnNpZ25lZCBjaGFyIHJlcTsKLQl1bnNpZ25lZCBjaGFyIHJlZzsKLQl1bnNpZ25lZCBjaGFyIHZhbHVlOwotfTsKLQotCi1zdHJ1Y3QgdG02MDAwX3N0ZF9zZXR0aW5ncyB7Ci0JdjRsMl9zdGRfaWQgaWQ7Ci0Jc3RydWN0IHRtNjAwMF9yZWdfc2V0dGluZ3MgY29tbW9uWzI3XTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG02MDAwX3N0ZF9zZXR0aW5ncyBjb21wb3NpdGVfc3Rkc1tdID0gewotCXsKLQkJLmlkID0gVjRMMl9TVERfUEFMX00sCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwNH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDgzfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgwYX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTB9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OH0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIwfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDBjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDUyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2Rn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQkgfSwgewotCQkuaWQgPSBWNEwyX1NURF9QQUxfTmMsCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgzNn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDkxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgxZn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4MGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4Y30sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDJjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4YzF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDBjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDUyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2Rn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQl9LCB7Ci0JCS5pZCA9IFY0TDJfU1REX1BBTCwKLQkJLmNvbW1vbiA9IHsKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDMyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgyNX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4ZDV9LAotCQkJe1RNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDYzfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHg1MH0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZH0sCi0JCQl7VE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDhjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MmN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHhjMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTJ9LAotCQkJe1RNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZGfSwKLQotCQkJe1RNNjAxMF9SRVEwN19SMDRfTFVNQV9IQUdDX0NPTlRST0wsIDB4ZGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDd9LAotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDB9LAotCQkJezAsIDAsIDB9LAotCQl9LAotCSB9LCB7Ci0JCS5pZCA9IFY0TDJfU1REX1NFQ0FNLAotCQkuY29tbW9uID0gewotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDF9LAotCQkJe1RNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4Mzh9LAotCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGV9LAotCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDJ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzF9LAotCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDI0fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg5Mn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4ZTh9LAotCQkJe1RNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGVkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4OGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyY30sCi0JCQl7VE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweGMxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgyY30sCi0JCQl7VE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDE4fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg0Mn0sCi0JCQl7VE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4RkZ9LAotCi0JCQl7VE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwN30sCi0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMH0sCi0JCQl7MCwgMCwgMH0sCi0JCX0sCi0JfSwgewotCQkuaWQgPSBWNEwyX1NURF9OVFNDLAotCQkuY29tbW9uID0gewotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDF9LAotCQkJe1RNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MDB9LAotCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGZ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDB9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzF9LAotCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg4Yn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4YTJ9LAotCQkJe1RNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGU5fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4ODh9LAotCQkJe1RNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyMn0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweDYxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg0Mn0sCi0JCQl7VE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4NkZ9LAotCi0JCQl7VE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTCwgMHhkZH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwN30sCi0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMH0sCi0JCQl7MCwgMCwgMH0sCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG02MDAwX3N0ZF9zZXR0aW5ncyBzdmlkZW9fc3Rkc1tdID0gewotCXsKLQkJLmlkID0gVjRMMl9TVERfUEFMX00sCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwNX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwNH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDgzfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgwYX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTB9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OH0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDBjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDUyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2Rn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQl9LCB7Ci0JCS5pZCA9IFY0TDJfU1REX1BBTF9OYywKLQkJLmNvbW1vbiA9IHsKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDM3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDA0fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OTF9LAotCQkJe1RNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDFmfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHgwY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZH0sCi0JCQl7VE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjJ9LAotCQkJe1RNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHhjMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTJ9LAotCQkJe1RNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZGfSwKLQotCQkJe1RNNjAxMF9SRVEwN19SMDRfTFVNQV9IQUdDX0NPTlRST0wsIDB4ZGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDd9LAotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDB9LAotCQkJezAsIDAsIDB9LAotCQl9LAotCX0sIHsKLQkJLmlkID0gVjRMMl9TVERfUEFMLAotCQkuY29tbW9uID0gewotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDF9LAotCQkJe1RNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MzN9LAotCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGV9LAotCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDR9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzB9LAotCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDI1fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHhkNX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4NjN9LAotCQkJe1RNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweDUwfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4OGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyYX0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweGMxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgwY30sCi0JCQl7VE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg1Mn0sCi0JCQl7VE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4NkZ9LAotCi0JCQl7VE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTCwgMHhkY30sCi0JCQl7VE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwN30sCi0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMH0sCi0JCQl7MCwgMCwgMH0sCi0JCX0sCi0JIH0sIHsKLQkJLmlkID0gVjRMMl9TVERfU0VDQU0sCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgzOX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwM30sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MjR9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDkyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhlOH0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZWR9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4Y30sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDJhfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4YzF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDJjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MTh9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDQyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHhGRn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQl9LCB7Ci0JCS5pZCA9IFY0TDJfU1REX05UU0MsCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwM30sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMH0sCi0JCQl7VE02MDEwX1JFUTA3X1IxN19ITE9PUF9NQVhTVEFURSwgMHg4Yn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDhifSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhhMn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTl9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OH0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDQyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2Rn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQl9LAotfTsKLQotCi1zdGF0aWMgaW50IHRtNjAwMF9zZXRfYXVkaW9fc3RkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXVpbnQ4X3QgYXJlZ18wMiA9IDB4MDQ7IC8qIEdDMSBGaXhlZCBnYWluIDBkQiAqLwotCXVpbnQ4X3QgYXJlZ18wNSA9IDB4MDE7IC8qIEF1dG8gNC41ID0gTSBKYXBhbiwgQXV0byA2LjUgPSBESyAqLwotCXVpbnQ4X3QgYXJlZ18wNiA9IDB4MDI7IC8qIEF1dG8gZGUtZW1waGFzaXMsIG1hbm51YWwgY2hhbm5lbCBtb2RlICovCi0JdWludDhfdCBuaWNhbV9mbGFnID0gMDsgLyogTm8gTklDQU0gKi8KLQotCWlmIChkZXYtPnJhZGlvKSB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwMV9BX0lOSVQsIDB4MDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDJfQV9GSVhfR0FJTl9DVFJMLCAweDA0KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAzX0FfQVVUT19HQUlOX0NUUkwsIDB4MDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDRfQV9TSUZfQU1QX0NUUkwsIDB4ODApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDVfQV9TVEFOREFSRF9NT0QsIDB4MGMpOwotCQkvKiBzZXQgbW9ubyBvciBzdGVyZW8gKi8KLQkJaWYgKGRldi0+YW1vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCi0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDZfQV9TT1VORF9NT0QsIDB4MDApOwotCQllbHNlIGlmIChkZXYtPmFtb2RlID09IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8pCi0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDZfQV9TT1VORF9NT0QsIDB4MDIpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDlfQV9NQUlOX1ZPTCwgMHgxOCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwQ19BX0FTRF9USFJFUzIsIDB4MGEpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMERfQV9BTURfVEhSRVMsIDB4NDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRjFfQUFEQ19QT1dFUl9ET1dOLCAweGZlKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjFFX0FfR0FJTl9ERUVNUEhfT1VULCAweDEzKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVCwgMHg4MCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAodG02MDEwX2FfbW9kZSkgewotCS8qIGF1dG8gKi8KLQljYXNlIDA6Ci0JCXN3aXRjaCAoZGV2LT5ub3JtKSB7Ci0JCWNhc2UgVjRMMl9TVERfTlRTQ19NX0tSOgotCQkJYXJlZ18wNSB8PSAweDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfTlRTQ19NX0pQOgotCQkJYXJlZ18wNSB8PSAweDQwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfTlRTQ19NOgotCQljYXNlIFY0TDJfU1REX1BBTF9NOgotCQljYXNlIFY0TDJfU1REX1BBTF9OOgotCQkJYXJlZ18wNSB8PSAweDIwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfUEFMX05jOgotCQkJYXJlZ18wNSB8PSAweDYwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfU0VDQU1fTDoKLQkJCWFyZWdfMDUgfD0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfU1REX0RLOgotCQkJYXJlZ18wNSB8PSAweDEwOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JLyogQTIgKi8KLQljYXNlIDE6Ci0JCXN3aXRjaCAoZGV2LT5ub3JtKSB7Ci0JCWNhc2UgVjRMMl9TVERfQjoKLQkJY2FzZSBWNEwyX1NURF9HSDoKLQkJCWFyZWdfMDUgPSAweDA1OwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfREs6Ci0JCQlhcmVnXzA1ID0gMHgwOTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCS8qIE5JQ0FNICovCi0JY2FzZSAyOgotCQlzd2l0Y2ggKGRldi0+bm9ybSkgewotCQljYXNlIFY0TDJfU1REX0I6Ci0JCWNhc2UgVjRMMl9TVERfR0g6Ci0JCQlhcmVnXzA1ID0gMHgwNzsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfU1REX0RLOgotCQkJYXJlZ18wNSA9IDB4MDY7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX1NURF9QQUxfSToKLQkJCWFyZWdfMDUgPSAweDA4OwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfU0VDQU1fTDoKLQkJCWFyZWdfMDUgPSAweDBhOwotCQkJYXJlZ18wMiA9IDB4MDI7Ci0JCQlicmVhazsKLQkJfQotCQluaWNhbV9mbGFnID0gMTsKLQkJYnJlYWs7Ci0JLyogb3RoZXIgKi8KLQljYXNlIDM6Ci0JCXN3aXRjaCAoZGV2LT5ub3JtKSB7Ci0JCS8qIERLM19BMiAqLwotCQljYXNlIFY0TDJfU1REX0RLOgotCQkJYXJlZ18wNSA9IDB4MGI7Ci0JCQlicmVhazsKLQkJLyogS29yZWEgKi8KLQkJY2FzZSBWNEwyX1NURF9OVFNDX01fS1I6Ci0JCQlhcmVnXzA1ID0gMHgwNDsKLQkJCWJyZWFrOwotCQkvKiBFSUFKICovCi0JCWNhc2UgVjRMMl9TVERfTlRTQ19NX0pQOgotCQkJYXJlZ18wNSA9IDB4MDM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWFyZWdfMDUgPSAweDAyOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVCwgMHgwMCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAyX0FfRklYX0dBSU5fQ1RSTCwgYXJlZ18wMik7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAzX0FfQVVUT19HQUlOX0NUUkwsIDB4MDApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwNF9BX1NJRl9BTVBfQ1RSTCwgMHhhMCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA1X0FfU1RBTkRBUkRfTU9ELCBhcmVnXzA1KTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDZfQV9TT1VORF9NT0QsIGFyZWdfMDYpOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwN19BX0xFRlRfVk9MLCAweDAwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDhfQV9SSUdIVF9WT0wsIDB4MDApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwOV9BX01BSU5fVk9MLCAweDA4KTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEFfQV9JMlNfTU9ELCAweDkxKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEJfQV9BU0RfVEhSRVMxLCAweDIwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMENfQV9BU0RfVEhSRVMyLCAweDEyKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMERfQV9BTURfVEhSRVMsIDB4MjApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwRV9BX01PTk9fVEhSRVMxLCAweGYwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEZfQV9NT05PX1RIUkVTMiwgMHg4MCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjEwX0FfTVVURV9USFJFUzEsIDB4YzApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxMV9BX01VVEVfVEhSRVMyLCAweDgwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTJfQV9BR0NfVSwgMHgxMik7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjEzX0FfQUdDX0VSUl9ULCAweGZlKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTRfQV9BR0NfR0FJTl9JTklULCAweDIwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTVfQV9BR0NfU1RFUF9USFIsIDB4MTQpOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxNl9BX0FHQ19HQUlOX01BWCwgMHhmZSk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjE3X0FfQUdDX0dBSU5fTUlOLCAweDAxKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMThfQV9UUl9DVFJMLCAweGEwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTlfQV9GSF8yRkhfR0FJTiwgMHgzMik7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjFBX0FfTklDQU1fU0VSX01BWCwgMHg2NCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjFCX0FfTklDQU1fU0VSX01JTiwgMHgyMCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDhfU0VUX0dFVF9BVlJFR19CSVQsIDB4MWMsIDB4MDApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA4X1NFVF9HRVRfQVZSRUdfQklULCAweDFkLCAweDAwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMUVfQV9HQUlOX0RFRU1QSF9PVVQsIDB4MTMpOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxRl9BX1RFU1RfSU5URl9TRUwsIDB4MDApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IyMF9BX1RFU1RfUElOX1NFTCwgMHgwMCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVCwgMHg4MCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB0bTYwMDBfZ2V0X3N0ZF9yZXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JLyogQ3VycmVudGx5LCB0aG9zZSBhcmUgdGhlIG9ubHkgc3VwcG9ydGVkIHJlc29sdGlvbnMgKi8KLQlpZiAoZGV2LT5ub3JtICYgVjRMMl9TVERfNTI1XzYwKQotCQlkZXYtPmhlaWdodCA9IDQ4MDsKLQllbHNlCi0JCWRldi0+aGVpZ2h0ID0gNTc2OwotCi0JZGV2LT53aWR0aCA9IDcyMDsKLX0KLQotc3RhdGljIGludCB0bTYwMDBfbG9hZF9zdGQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCi0JCQkgICBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyAqc2V0LCBpbnQgbWF4X3NpemUpCi17Ci0JaW50IGksIHJjOwotCi0JLyogTG9hZCBib2FyZCdzIGluaXRpYWxpemF0aW9uIHRhYmxlICovCi0JZm9yIChpID0gMDsgbWF4X3NpemU7IGkrKykgewotCQlpZiAoIXNldFtpXS5yZXEpCi0JCQlyZXR1cm4gMDsKLQotCQlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgc2V0W2ldLnJlcSwgc2V0W2ldLnJlZywgc2V0W2ldLnZhbHVlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSB3aGlsZSBzZXR0aW5nICIKLQkJCSAgICAgICAicmVxICVkLCByZWcgJWQgdG8gdmFsdWUgJWRcbiIsCi0JCQkgICAgICAgcmMsIHNldFtpXS5yZXEsIHNldFtpXS5yZWcsIHNldFtpXS52YWx1ZSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHRtNjAwMF9zZXRfc3RhbmRhcmQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IGksIHJjID0gMDsKLQl1OCByZWdfMDdfZmUgPSAweDhhOwotCXU4IHJlZ18wOF9mMSA9IDB4ZmM7Ci0JdTggcmVnXzA4X2UyID0gMHhmMDsKLQl1OCByZWdfMDhfZTYgPSAweDBmOwotCi0JdG02MDAwX2dldF9zdGRfcmVzKGRldik7Ci0KLQlpZiAoZGV2LT5yYWRpbykgewotCQkvKiB0b2RvICovCi0JfQotCi0JaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7Ci0JCXN3aXRjaCAoZGV2LT52aW5wdXRbZGV2LT5pbnB1dF0udm11eCkgewotCQljYXNlIFRNNjAwMF9WTVVYX1ZJREVPX0E6Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwsIDB4ZjQpOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVBX0JVRkZfRFJWX0NUUkwsIDB4ZjEpOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVCX1NJRl9HQUlOX0NUUkwsIDB4ZTApOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVDX1JFVkVSU0VfWUNfQ1RSTCwgMHhjMik7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRURfR0FJTl9TRUwsIDB4ZTgpOwotCQkJcmVnXzA3X2ZlIHw9IDB4MDE7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMDBfVk1VWF9WSURFT19COgotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUzX0FEQ19JTjFfU0VMLCAweGY4KTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQV9CVUZGX0RSVl9DVFJMLCAweGYxKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQl9TSUZfR0FJTl9DVFJMLCAweGUwKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQ19SRVZFUlNFX1lDX0NUUkwsIDB4YzIpOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVEX0dBSU5fU0VMLCAweGU4KTsKLQkJCXJlZ18wN19mZSB8PSAweDAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX1ZNVVhfVklERU9fQUI6Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwsIDB4ZmMpOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkU0X0FEQ19JTjJfU0VMLCAweGY4KTsKLQkJCXJlZ18wOF9lNiA9IDB4MDA7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUFfQlVGRl9EUlZfQ1RSTCwgMHhmMik7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUJfU0lGX0dBSU5fQ1RSTCwgMHhmMCk7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUNfUkVWRVJTRV9ZQ19DVFJMLCAweGMyKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFRF9HQUlOX1NFTCwgMHhlMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCXN3aXRjaCAoZGV2LT52aW5wdXRbZGV2LT5pbnB1dF0uYW11eCkgewotCQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6Ci0JCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHLAotCQkJCTB4MDAsIDB4MGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX0FNVVhfQURDMjoKLQkJCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcsCi0JCQkJMHgwOCwgMHgwZik7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMDBfQU1VWF9TSUYxOgotCQkJcmVnXzA4X2UyIHw9IDB4MDI7Ci0JCQlyZWdfMDhfZTYgPSAweDA4OwotCQkJcmVnXzA3X2ZlIHw9IDB4NDA7Ci0JCQlyZWdfMDhfZjEgfD0gMHgwMjsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFNF9BRENfSU4yX1NFTCwgMHhmMyk7Ci0JCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHLAotCQkJCTB4MDIsIDB4MGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX0FNVVhfU0lGMjoKLQkJCXJlZ18wOF9lMiB8PSAweDAyOwotCQkJcmVnXzA4X2U2ID0gMHgwODsKLQkJCXJlZ18wN19mZSB8PSAweDQwOwotCQkJcmVnXzA4X2YxIHw9IDB4MDI7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTRfQURDX0lOMl9TRUwsIDB4ZjcpOwotCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywKLQkJCQkweDAyLCAweDBmKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEsIHJlZ18wOF9lMik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFNl9QT1dFUl9ET1dOX0NUUkwyLCByZWdfMDhfZTYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRjFfQUFEQ19QT1dFUl9ET1dOLCByZWdfMDhfZjEpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRkVfUE9XRVJfRE9XTiwgcmVnXzA3X2ZlKTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLnZtdXgpIHsKLQkJY2FzZSBUTTYwMDBfVk1VWF9WSURFT19BOgotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkUzX1ZBRENfSU5QX0xQRl9TRUwxLCAweDEwKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMiwgMHgwMCk7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweDBmKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCSAgICBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPnZpbnB1dFtkZXYtPmlucHV0XS52X2dwaW8sIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX1ZNVVhfVklERU9fQjoKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFM19WQURDX0lOUF9MUEZfU0VMMSwgMHgwMCk7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRTVfVkFEQ19JTlBfTFBGX1NFTDIsIDB4MDApOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkU4X1ZBRENfUFdET1dOX0NUTCwgMHgwZik7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQkgICAgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT52aW5wdXRbZGV2LT5pbnB1dF0udl9ncGlvLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAwMF9WTVVYX1ZJREVPX0FCOgotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkUzX1ZBRENfSU5QX0xQRl9TRUwxLCAweDEwKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMiwgMHgxMCk7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweDAwKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCSAgICBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPnZpbnB1dFtkZXYtPmlucHV0XS52X2dwaW8sIDEpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlzd2l0Y2ggKGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXgpIHsKLQkJY2FzZSBUTTYwMDBfQU1VWF9BREMxOgotCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsCi0JCQkJVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwgMHgwMCwgMHgwZik7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMDBfQU1VWF9BREMyOgotCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsCi0JCQkJVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwgMHgwNCwgMHgwZik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChkZXYtPnZpbnB1dFtkZXYtPmlucHV0XS50eXBlID09IFRNNjAwMF9JTlBVVF9TVklERU8pIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3ZpZGVvX3N0ZHMpOyBpKyspIHsKLQkJCWlmIChkZXYtPm5vcm0gJiBzdmlkZW9fc3Rkc1tpXS5pZCkgewotCQkJCXJjID0gdG02MDAwX2xvYWRfc3RkKGRldiwgc3ZpZGVvX3N0ZHNbaV0uY29tbW9uLAotCQkJCQkJICAgICBzaXplb2Yoc3ZpZGVvX3N0ZHNbaV0uCi0JCQkJCQkJICAgIGNvbW1vbikpOwotCQkJCWdvdG8gcmV0OwotCQkJfQotCQl9Ci0JCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbXBvc2l0ZV9zdGRzKTsgaSsrKSB7Ci0JCQlpZiAoZGV2LT5ub3JtICYgY29tcG9zaXRlX3N0ZHNbaV0uaWQpIHsKLQkJCQlyYyA9IHRtNjAwMF9sb2FkX3N0ZChkZXYsCi0JCQkJCQkgICAgIGNvbXBvc2l0ZV9zdGRzW2ldLmNvbW1vbiwKLQkJCQkJCSAgICAgc2l6ZW9mKGNvbXBvc2l0ZV9zdGRzW2ldLgotCQkJCQkJCSAgICBjb21tb24pKTsKLQkJCQlnb3RvIHJldDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLXJldDoKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSAmJgotCSAgICAoKGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXggPT0gVE02MDAwX0FNVVhfU0lGMSkgfHwKLQkgICAgKGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXggPT0gVE02MDAwX0FNVVhfU0lGMikpKQotCQl0bTYwMDBfc2V0X2F1ZGlvX3N0ZChkZXYpOwotCi0JbXNsZWVwKDQwKTsKLQotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC11c2ItaXNvYy5oIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtdXNiLWlzb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0YzJhOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC11c2ItaXNvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqICB0bTYwMDAtYnVmLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotCi0jZGVmaW5lIFRNNjAwMF9VUkJfTVNHX0xFTiAxODAKLQotc3RydWN0IHVzYl9pc29jX2N0bCB7Ci0JCS8qIG1heCBwYWNrZXQgc2l6ZSBvZiBpc29jIHRyYW5zYWN0aW9uICovCi0JaW50CQkJCW1heF9wa3Rfc2l6ZTsKLQotCQkvKiBudW1iZXIgb2YgYWxsb2NhdGVkIHVyYnMgKi8KLQlpbnQJCQkJbnVtX2J1ZnM7Ci0KLQkJLyogdXJiIGZvciBpc29jIHRyYW5zZmVycyAqLwotCXN0cnVjdCB1cmIJCQkqKnVyYjsKLQotCQkvKiB0cmFuc2ZlciBidWZmZXJzIGZvciBpc29jIHRyYW5zZmVyICovCi0JY2hhcgkJCQkqKnRyYW5zZmVyX2J1ZmZlcjsKLQotCQkvKiBMYXN0IGJ1ZmZlciBjb21tYW5kIGFuZCByZWdpb24gKi8KLQl1OAkJCQljbWQ7Ci0JaW50CQkJCXBvcywgc2l6ZSwgcGt0c2l6ZTsKLQotCQkvKiBMYXN0IGZpZWxkOiBPREQgb3IgRVZFTj8gKi8KLQlpbnQJCQkJdmZpZWxkLCBmaWVsZDsKLQotCQkvKiBTdG9yZXMgaW5jb21wbGV0ZSBjb21tYW5kcyAqLwotCXUzMgkJCQl0bXBfYnVmOwotCWludAkJCQl0bXBfYnVmX2xlbjsKLQotCQkvKiBTdG9yZXMgYWxyZWFkeSByZXF1ZXN0ZWQgYnVmZmVycyAqLwotCXN0cnVjdCB0bTYwMDBfYnVmZmVyICAgIAkqYnVmOwotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXZpZGVvLmMgYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC12aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDhiOTM5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODA5ICswLDAgQEAKLS8qCi0gKiAgIHRtNjAwMC12aWRlby5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGVsIEx1ZHdpZyA8bWljaGVsLmx1ZHdpZ0BnbWFpbC5jb20+Ci0gKgktIEZpeGVkIG1vZHVsZSBsb2FkL3VubG9hZAotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0KLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotI2luY2x1ZGUgInRtNjAwMC5oIgotCi0jZGVmaW5lIEJVRkZFUl9USU1FT1VUICAgICBtc2Vjc190b19qaWZmaWVzKDIwMDApICAvKiAyIHNlY29uZHMgKi8KLQotLyogTGltaXRzIG1pbmltdW0gYW5kIGRlZmF1bHQgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KLSNkZWZpbmUgVE02MDAwX01JTl9CVUYgNAotI2RlZmluZSBUTTYwMDBfREVGX0JVRiA4Ci0KLSNkZWZpbmUgVE02MDAwX01BWF9JU09fUEFDS0VUUwk0NgkvKiBNYXggbnVtYmVyIG9mIElTTyBwYWNrZXRzICovCi0KLS8qIERlY2xhcmUgc3RhdGljIHZhcnMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcGFyYW1ldGVycyAqLwotc3RhdGljIHVuc2lnbmVkIGludCB2aWRfbGltaXQgPSAxNjsJLyogVmlkZW8gbWVtb3J5IGxpbWl0LCBpbiBNYiAqLwotc3RhdGljIGludCB2aWRlb19uciA9IC0xOwkJLyogL2Rldi92aWRlb04sIC0xIGZvciBhdXRvZGV0ZWN0ICovCi1zdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CQkvKiAvZGV2L3JhZGlvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KLQotLyogRGVidWcgbGV2ZWwgKi8KLWludCB0bTYwMDBfZGVidWc7Ci1FWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfZGVidWcpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIG5vX2N0cmwgPSB7Ci0JLm5hbWUgID0gIjQyIiwKLQkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKLX07Ci0KLS8qIHN1cHBvcnRlZCBjb250cm9scyAqLwotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB0bTYwMDBfcWN0cmxbXSA9IHsKLQl7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZSAgICAgICAgICA9ICJCcmlnaHRuZXNzIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDI1NSwKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDU0LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIkNvbnRyYXN0IiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDI1NSwKLQkJLnN0ZXAgICAgICAgICAgPSAweDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMTE5LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiU2F0dXJhdGlvbiIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAyNTUsCi0JCS5zdGVwICAgICAgICAgID0gMHgxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDExMiwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9IVUUsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKLQkJLm1pbmltdW0gICAgICAgPSAtMTI4LAotCQkubWF4aW11bSAgICAgICA9IDEyNywKLQkJLnN0ZXAgICAgICAgICAgPSAweDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMCwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sCi0JCS8qIC0tLSBhdWRpbyAtLS0gKi8KLQl7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKLQkJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKLQkJLm5hbWUgICAgICAgICAgPSAiVm9sdW1lIiwKLQkJLm1pbmltdW0gICAgICAgPSAtMTUsCi0JCS5tYXhpbXVtICAgICAgID0gMTUsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSAwLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBDVFJMUyA9IEFSUkFZX1NJWkUodG02MDAwX3FjdHJsKTsKLXN0YXRpYyBpbnQgcWN0bF9yZWdzW0FSUkFZX1NJWkUodG02MDAwX3FjdHJsKV07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG02MDAwX2ZtdCBmb3JtYXRbXSA9IHsKLQl7Ci0JCS5uYW1lICAgICA9ICI0OjI6MiwgcGFja2VkLCBZVlkyIiwKLQkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVWVYsCi0JCS5kZXB0aCAgICA9IDE2LAotCX0sIHsKLQkJLm5hbWUgICAgID0gIjQ6MjoyLCBwYWNrZWQsIFVZVlkiLAotCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfVVlWWSwKLQkJLmRlcHRoICAgID0gMTYsCi0JfSwgewotCQkubmFtZSAgICAgPSAiQS9WICsgVkJJIG11eCBwYWNrZXQiLAotCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfVE02MDAwLAotCQkuZGVwdGggICAgPSAxNiwKLQl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsX2J5X2lkKHVuc2lnbmVkIGludCBpZCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBDVFJMUzsgaSsrKQotCQlpZiAodG02MDAwX3FjdHJsW2ldLmlkID09IGlkKQotCQkJcmV0dXJuIHRtNjAwMF9xY3RybCtpOwotCXJldHVybiBOVUxMOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCURNQSBhbmQgdGhyZWFkIGZ1bmN0aW9ucwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2RlZmluZSBub3JtX21heHcoYSkgNzIwCi0jZGVmaW5lIG5vcm1fbWF4aChhKSA1NzYKLQotI2RlZmluZSBub3JtX21pbncoYSkgbm9ybV9tYXh3KGEpCi0jZGVmaW5lIG5vcm1fbWluaChhKSBub3JtX21heGgoYSkKLQotLyoKLSAqIHZpZGVvLWJ1ZiBnZW5lcmljIHJvdXRpbmUgdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBidWZmZXIKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGdldF9uZXh0X2J1ZihzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSwKLQkJCSAgICAgICBzdHJ1Y3QgdG02MDAwX2J1ZmZlciAgICoqYnVmKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gY29udGFpbmVyX29mKGRtYV9xLCBzdHJ1Y3QgdG02MDAwX2NvcmUsIHZpZHEpOwotCWNoYXIgKm91dHA7Ci0KLQlpZiAobGlzdF9lbXB0eSgmZG1hX3EtPmFjdGl2ZSkpIHsKLQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUVVFVUUsICJObyBhY3RpdmUgcXVldWUgdG8gc2VydmVcbiIpOwotCQkqYnVmID0gTlVMTDsKLQkJcmV0dXJuOwotCX0KLQotCSpidWYgPSBsaXN0X2VudHJ5KGRtYV9xLT5hY3RpdmUubmV4dCwKLQkJCXN0cnVjdCB0bTYwMDBfYnVmZmVyLCB2Yi5xdWV1ZSk7Ci0KLQkvKiBDbGVhbnMgdXAgYnVmZmVyIC0gVXNlZnVsIGZvciB0ZXN0aW5nIGZvciBmcmFtZS9VUkIgbG9zcyAqLwotCW91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCYoKmJ1ZiktPnZiKTsKLQotCXJldHVybjsKLX0KLQotLyoKLSAqIEFubm91bmNlcyB0aGF0IGEgYnVmZmVyIHdlcmUgZmlsbGVkIGFuZCByZXF1ZXN0IHRoZSBuZXh0Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBidWZmZXJfZmlsbGVkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LAotCQkJCSBzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSwKLQkJCQkgc3RydWN0IHRtNjAwMF9idWZmZXIgKmJ1ZikKLXsKLQkvKiBBZHZpY2UgdGhhdCBidWZmZXIgd2FzIGZpbGxlZCAqLwotCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX0lTT0MsICJbJXAvJWRdIHdha2V1cFxuIiwgYnVmLCBidWYtPnZiLmkpOwotCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ET05FOwotCWJ1Zi0+dmIuZmllbGRfY291bnQrKzsKLQlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dmIudHMpOwotCi0JbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOwotCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7Ci19Ci0KLWNvbnN0IGNoYXIgKnRtNjAwMF9tc2dfdHlwZVtdID0gewotCSJ1bmtub3duKDApIiwgICAvKiAwICovCi0JInZpZGVvIiwgICAgICAgIC8qIDEgKi8KLQkiYXVkaW8iLCAgICAgICAgLyogMiAqLwotCSJ2YmkiLCAgICAgICAgICAvKiAzICovCi0JInB0cyIsICAgICAgICAgIC8qIDQgKi8KLQkiZXJyIiwgICAgICAgICAgLyogNSAqLwotCSJ1bmtub3duKDYpIiwgICAvKiA2ICovCi0JInVua25vd24oNykiLCAgIC8qIDcgKi8KLX07Ci0KLS8qCi0gKiBJZGVudGlmeSB0aGUgdG01NjAwLzYwMDAgYnVmZmVyIGhlYWRlciB0eXBlIGFuZCBwcm9wZXJseSBoYW5kbGVzCi0gKi8KLXN0YXRpYyBpbnQgY29weV9zdHJlYW1zKHU4ICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCXN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBjb250YWluZXJfb2YoZG1hX3EsIHN0cnVjdCB0bTYwMDBfY29yZSwgdmlkcSk7Ci0JdTggKnB0ciA9IGRhdGEsICplbmRwID0gZGF0YStsZW4sIGM7Ci0JdW5zaWduZWQgbG9uZyBoZWFkZXIgPSAwOwotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgaW50IGNtZCwgY3B5c2l6ZSwgcGt0c2l6ZSwgc2l6ZSwgZmllbGQsIGJsb2NrLCBsaW5lLCBwb3MgPSAwOwotCXN0cnVjdCB0bTYwMDBfYnVmZmVyICp2YnVmID0gTlVMTDsKLQljaGFyICp2b3V0cCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGxpbmV3aWR0aDsKLQotCWlmICghZGV2LT5yYWRpbykgewotCQkvKiBnZXQgdmlkZW8gYnVmZmVyICovCi0JCWdldF9uZXh0X2J1ZihkbWFfcSwgJnZidWYpOwotCi0JCWlmICghdmJ1ZikKLQkJCXJldHVybiByYzsKLQkJdm91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCZ2YnVmLT52Yik7Ci0KLQkJaWYgKCF2b3V0cCkKLQkJCXJldHVybiAwOwotCX0KLQotCWZvciAocHRyID0gZGF0YTsgcHRyIDwgZW5kcDspIHsKLQkJaWYgKCFkZXYtPmlzb2NfY3RsLmNtZCkgewotCQkJLyogSGVhZGVyICovCi0JCQlpZiAoZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiA+IDApIHsKLQkJCQkvKiBmcm9tIGxhc3QgdXJiIG9yIHBhY2tldCAqLwotCQkJCWhlYWRlciA9IGRldi0+aXNvY19jdGwudG1wX2J1ZjsKLQkJCQlpZiAoNCAtIGRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4gPiAwKSB7Ci0JCQkJCW1lbWNweSgodTggKikmaGVhZGVyICsKLQkJCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4sCi0JCQkJCQlwdHIsCi0JCQkJCQk0IC0gZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbik7Ci0JCQkJCXB0ciArPSA0IC0gZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbjsKLQkJCQl9Ci0JCQkJZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwdHIgKyAzID49IGVuZHApIHsKLQkJCQkJLyogaGF2ZSBpbmNvbXBsZXRlIGhlYWRlciAqLwotCQkJCQlkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuID0gZW5kcCAtIHB0cjsKLQkJCQkJbWVtY3B5KCZkZXYtPmlzb2NfY3RsLnRtcF9idWYsIHB0ciwKLQkJCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4pOwotCQkJCQlyZXR1cm4gcmM7Ci0JCQkJfQotCQkJCS8qIFNlZWsgZm9yIHN5bmMgKi8KLQkJCQlmb3IgKDsgcHRyIDwgZW5kcCAtIDM7IHB0cisrKSB7Ci0JCQkJCWlmICgqKHB0ciArIDMpID09IDB4NDcpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogR2V0IG1lc3NhZ2UgaGVhZGVyICovCi0JCQkJaGVhZGVyID0gKih1bnNpZ25lZCBsb25nICopcHRyOwotCQkJCXB0ciArPSA0OwotCQkJfQotCi0JCQkvKiBzcGxpdCB0aGUgaGVhZGVyIGZpZWxkcyAqLwotCQkJYyA9IChoZWFkZXIgPj4gMjQpICYgMHhmZjsKLQkJCXNpemUgPSAoKGhlYWRlciAmIDB4N2UpIDw8IDEpOwotCQkJaWYgKHNpemUgPiAwKQotCQkJCXNpemUgLT0gNDsKLQkJCWJsb2NrID0gKGhlYWRlciA+PiA3KSAmIDB4ZjsKLQkJCWZpZWxkID0gKGhlYWRlciA+PiAxMSkgJiAweDE7Ci0JCQlsaW5lICA9IChoZWFkZXIgPj4gMTIpICYgMHgxZmY7Ci0JCQljbWQgICA9IChoZWFkZXIgPj4gMjEpICYgMHg3OwotCQkJLyogVmFsaWRhdGVzIGhhZWRlciBmaWVsZHMgKi8KLQkJCWlmIChzaXplID4gVE02MDAwX1VSQl9NU0dfTEVOKQotCQkJCXNpemUgPSBUTTYwMDBfVVJCX01TR19MRU47Ci0JCQlwa3RzaXplID0gVE02MDAwX1VSQl9NU0dfTEVOOwotCQkJLyogY2FsY3VsYXRlIHBvc2l0aW9uIGluIGJ1ZmZlcgotCQkJICogYW5kIGNoYW5nZSB0aGUgYnVmZmVyCi0JCQkgKi8KLQkJCXN3aXRjaCAoY21kKSB7Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZJREVPOgotCQkJCWlmICghZGV2LT5yYWRpbykgewotCQkJCQlpZiAoKGRldi0+aXNvY19jdGwudmZpZWxkICE9IGZpZWxkKSAmJgotCQkJCQkJKGZpZWxkID09IDEpKSB7Ci0JCQkJCS8qIEFubm91bmNlcyB0aGF0IGEgbmV3IGJ1ZmZlcgotCQkJCQkgKiB3ZXJlIGZpbGxlZAotCQkJCQkgKi8KLQkJCQkJCWJ1ZmZlcl9maWxsZWQoZGV2LCBkbWFfcSwgdmJ1Zik7Ci0JCQkJCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JU09DLAotCQkJCQkJCSJuZXcgYnVmZmVyIGZpbGxlZFxuIik7Ci0JCQkJCQlnZXRfbmV4dF9idWYoZG1hX3EsICZ2YnVmKTsKLQkJCQkJCWlmICghdmJ1ZikKLQkJCQkJCQlyZXR1cm4gcmM7Ci0JCQkJCQl2b3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJnZidWYtPnZiKTsKLQkJCQkJCWlmICghdm91dHApCi0JCQkJCQkJcmV0dXJuIHJjOwotCQkJCQkJbWVtc2V0KHZvdXRwLCAwLCB2YnVmLT52Yi5zaXplKTsKLQkJCQkJfQotCQkJCQlsaW5ld2lkdGggPSB2YnVmLT52Yi53aWR0aCA8PCAxOwotCQkJCQlwb3MgPSAoKGxpbmUgPDwgMSkgLSBmaWVsZCAtIDEpICoKLQkJCQkJbGluZXdpZHRoICsgYmxvY2sgKiBUTTYwMDBfVVJCX01TR19MRU47Ci0JCQkJCS8qIERvbid0IGFsbG93IHRvIHdyaXRlIG91dCBvZiB0aGUgYnVmZmVyICovCi0JCQkJCWlmIChwb3MgKyBzaXplID4gdmJ1Zi0+dmIuc2l6ZSkKLQkJCQkJCWNtZCA9IFRNNjAwMF9VUkJfTVNHX0VSUjsKLQkJCQkJZGV2LT5pc29jX2N0bC52ZmllbGQgPSBmaWVsZDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZCSToKLQkJCQlicmVhazsKLQkJCWNhc2UgVE02MDAwX1VSQl9NU0dfQVVESU86Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1BUUzoKLQkJCQlzaXplID0gcGt0c2l6ZTsJCS8qIFNpemUgaXMgYWx3YXlzIDE4MCBieXRlcyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogQ29udGludWUgdGhlIGxhc3QgY29weSAqLwotCQkJY21kID0gZGV2LT5pc29jX2N0bC5jbWQ7Ci0JCQlzaXplID0gZGV2LT5pc29jX2N0bC5zaXplOwotCQkJcG9zID0gZGV2LT5pc29jX2N0bC5wb3M7Ci0JCQlwa3RzaXplID0gZGV2LT5pc29jX2N0bC5wa3RzaXplOwotCQkJZmllbGQgPSBkZXYtPmlzb2NfY3RsLmZpZWxkOwotCQl9Ci0JCWNweXNpemUgPSAoZW5kcCAtIHB0ciA+IHNpemUpID8gc2l6ZSA6IGVuZHAgLSBwdHI7Ci0JCWlmIChjcHlzaXplKSB7Ci0JCQkvKiBjb3B5IGRhdGEgaW4gZGlmZmVyZW50IGJ1ZmZlcnMgKi8KLQkJCXN3aXRjaCAoY21kKSB7Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZJREVPOgotCQkJCS8qIEZpbGxzIHZpZGVvIGJ1ZmZlciAqLwotCQkJCWlmICh2YnVmKQotCQkJCQltZW1jcHkoJnZvdXRwW3Bvc10sIHB0ciwgY3B5c2l6ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX0FVRElPOiB7Ci0JCQkJaW50IGk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGNweXNpemU7IGkgKz0gMikKLQkJCQkJc3dhYjE2cygodTE2ICopKHB0ciArIGkpKTsKLQotCQkJCXRtNjAwMF9jYWxsX2ZpbGxidWYoZGV2LCBUTTYwMDBfQVVESU8sIHB0ciwgY3B5c2l6ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZCSToKLQkJCQkvKiBOZWVkIHNvbWUgY29kZSB0byBjb3B5IHZiaSBidWZmZXIgKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgVE02MDAwX1VSQl9NU0dfUFRTOiB7Ci0JCQkJLyogTmVlZCBzb21lIGNvZGUgdG8gY29weSBwdHMgKi8KLQkJCQl1MzIgcHRzOwotCQkJCXB0cyA9ICoodTMyICopcHRyOwotCQkJCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX0lTT0MsICJmaWVsZCAlZCwgUFRTICV4IiwKLQkJCQkJZmllbGQsIHB0cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHB0ciArIHBrdHNpemUgPiBlbmRwKSB7Ci0JCQkvKiBFbmQgb2YgVVJCIHBhY2tldCwgYnV0IGNtZCBwcm9jZXNzaW5nIGlzIG5vdAotCQkJICogY29tcGxldGUuIFByZXNlcnZlIHRoZSBzdGF0ZSBmb3IgYSBuZXh0IHBhY2tldAotCQkJICovCi0JCQlkZXYtPmlzb2NfY3RsLnBvcyA9IHBvcyArIGNweXNpemU7Ci0JCQlkZXYtPmlzb2NfY3RsLnNpemUgPSBzaXplIC0gY3B5c2l6ZTsKLQkJCWRldi0+aXNvY19jdGwuY21kID0gY21kOwotCQkJZGV2LT5pc29jX2N0bC5maWVsZCA9IGZpZWxkOwotCQkJZGV2LT5pc29jX2N0bC5wa3RzaXplID0gcGt0c2l6ZSAtIChlbmRwIC0gcHRyKTsKLQkJCXB0ciArPSBlbmRwIC0gcHRyOwotCQl9IGVsc2UgewotCQkJZGV2LT5pc29jX2N0bC5jbWQgPSAwOwotCQkJcHRyICs9IHBrdHNpemU7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBJZGVudGlmeSB0aGUgdG01NjAwLzYwMDAgYnVmZmVyIGhlYWRlciB0eXBlIGFuZCBwcm9wZXJseSBoYW5kbGVzCi0gKi8KLXN0YXRpYyBpbnQgY29weV9tdWx0aXBsZXhlZCh1OCAqcHRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCXN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBjb250YWluZXJfb2YoZG1hX3EsIHN0cnVjdCB0bTYwMDBfY29yZSwgdmlkcSk7Ci0JdW5zaWduZWQgaW50IHBvcyA9IGRldi0+aXNvY19jdGwucG9zLCBjcHlzaXplOwotCWludCByYyA9IDE7Ci0Jc3RydWN0IHRtNjAwMF9idWZmZXIgKmJ1ZjsKLQljaGFyICpvdXRwID0gTlVMTDsKLQotCWdldF9uZXh0X2J1ZihkbWFfcSwgJmJ1Zik7Ci0JaWYgKGJ1ZikKLQkJb3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJmJ1Zi0+dmIpOwotCi0JaWYgKCFvdXRwKQotCQlyZXR1cm4gMDsKLQotCXdoaWxlIChsZW4gPiAwKSB7Ci0JCWNweXNpemUgPSBtaW4obGVuLCBidWYtPnZiLnNpemUtcG9zKTsKLQkJbWVtY3B5KCZvdXRwW3Bvc10sIHB0ciwgY3B5c2l6ZSk7Ci0JCXBvcyArPSBjcHlzaXplOwotCQlwdHIgKz0gY3B5c2l6ZTsKLQkJbGVuIC09IGNweXNpemU7Ci0JCWlmIChwb3MgPj0gYnVmLT52Yi5zaXplKSB7Ci0JCQlwb3MgPSAwOwotCQkJLyogQW5ub3VuY2VzIHRoYXQgYSBuZXcgYnVmZmVyIHdlcmUgZmlsbGVkICovCi0JCQlidWZmZXJfZmlsbGVkKGRldiwgZG1hX3EsIGJ1Zik7Ci0JCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JU09DLCAibmV3IGJ1ZmZlciBmaWxsZWRcbiIpOwotCQkJZ2V0X25leHRfYnVmKGRtYV9xLCAmYnVmKTsKLQkJCWlmICghYnVmKQotCQkJCWJyZWFrOwotCQkJb3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJihidWYtPnZiKSk7Ci0JCQlpZiAoIW91dHApCi0JCQkJcmV0dXJuIHJjOwotCQkJcG9zID0gMDsKLQkJfQotCX0KLQotCWRldi0+aXNvY19jdGwucG9zID0gcG9zOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHByaW50X2Vycl9zdGF0dXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCi0JCQkJICAgICBpbnQgcGFja2V0LCBpbnQgc3RhdHVzKQotewotCWNoYXIgKmVycm1zZyA9ICJVbmtub3duIjsKLQotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSAtRU5PRU5UOgotCQllcnJtc2cgPSAidW5saW5rZWQgc3luY2hyb251b3VzbHkiOwotCQlicmVhazsKLQljYXNlIC1FQ09OTlJFU0VUOgotCQllcnJtc2cgPSAidW5saW5rZWQgYXN5bmNocm9udW91c2x5IjsKLQkJYnJlYWs7Ci0JY2FzZSAtRU5PU1I6Ci0JCWVycm1zZyA9ICJCdWZmZXIgZXJyb3IgKG92ZXJydW4pIjsKLQkJYnJlYWs7Ci0JY2FzZSAtRVBJUEU6Ci0JCWVycm1zZyA9ICJTdGFsbGVkIChkZXZpY2Ugbm90IHJlc3BvbmRpbmcpIjsKLQkJYnJlYWs7Ci0JY2FzZSAtRU9WRVJGTE9XOgotCQllcnJtc2cgPSAiQmFiYmxlIChiYWQgY2FibGU/KSI7Ci0JCWJyZWFrOwotCWNhc2UgLUVQUk9UTzoKLQkJZXJybXNnID0gIkJpdC1zdHVmZiBlcnJvciAoYmFkIGNhYmxlPykiOwotCQlicmVhazsKLQljYXNlIC1FSUxTRVE6Ci0JCWVycm1zZyA9ICJDUkMvVGltZW91dCAoY291bGQgYmUgYW55dGhpbmcpIjsKLQkJYnJlYWs7Ci0JY2FzZSAtRVRJTUU6Ci0JCWVycm1zZyA9ICJEZXZpY2UgZG9lcyBub3QgcmVzcG9uZCI7Ci0JCWJyZWFrOwotCX0KLQlpZiAocGFja2V0IDwgMCkgewotCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19RVUVVRSwgIlVSQiBzdGF0dXMgJWQgWyVzXS5cbiIsCi0JCQlzdGF0dXMsIGVycm1zZyk7Ci0JfSBlbHNlIHsKLQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUVVFVUUsICJVUkIgcGFja2V0ICVkLCBzdGF0dXMgJWQgWyVzXS5cbiIsCi0JCQlwYWNrZXQsIHN0YXR1cywgZXJybXNnKTsKLQl9Ci19Ci0KLQotLyoKLSAqIENvbnRyb2xzIHRoZSBpc29jIGNvcHkgb2YgZWFjaCB1cmIgcGFja2V0Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRtNjAwMF9pc29jX2NvcHkoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICpkbWFfcSA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGNvbnRhaW5lcl9vZihkbWFfcSwgc3RydWN0IHRtNjAwMF9jb3JlLCB2aWRxKTsKLQlpbnQgaSwgbGVuID0gMCwgcmMgPSAxLCBzdGF0dXM7Ci0JY2hhciAqcDsKLQotCWlmICh1cmItPnN0YXR1cyA8IDApIHsKLQkJcHJpbnRfZXJyX3N0YXR1cyhkZXYsIC0xLCB1cmItPnN0YXR1cyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKLQkJc3RhdHVzID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7Ci0KLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCXByaW50X2Vycl9zdGF0dXMoZGV2LCBpLCBzdGF0dXMpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlsZW4gPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7Ci0KLQkJaWYgKGxlbiA+IDApIHsKLQkJCXAgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OwotCQkJaWYgKCF1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykgewotCQkJCWlmICgoZGV2LT5mb3VyY2MpID09IFY0TDJfUElYX0ZNVF9UTTYwMDApIHsKLQkJCQkJcmMgPSBjb3B5X211bHRpcGxleGVkKHAsIGxlbiwgdXJiKTsKLQkJCQkJaWYgKHJjIDw9IDApCi0JCQkJCQlyZXR1cm4gcmM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29weV9zdHJlYW1zKHAsIGxlbiwgdXJiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCVVSQiBjb250cm9sCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0vKgotICogSVJRIGNhbGxiYWNrLCBjYWxsZWQgYnkgVVJCIGNhbGxiYWNrCi0gKi8KLXN0YXRpYyB2b2lkIHRtNjAwMF9pcnFfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICpkbWFfcSA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGNvbnRhaW5lcl9vZihkbWFfcSwgc3RydWN0IHRtNjAwMF9jb3JlLCB2aWRxKTsKLQlpbnQgaTsKLQotCWlmICghZGV2KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2soJmRldi0+c2xvY2spOwotCXRtNjAwMF9pc29jX2NvcHkodXJiKTsKLQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7Ci0KLQkvKiBSZXNldCB1cmIgYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKLQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgPSAwOwotCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggPSAwOwotCX0KLQotCXVyYi0+c3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAodXJiLT5zdGF0dXMpCi0JCXRtNjAwMF9lcnIoInVyYiByZXN1Ym1pdCBmYWlsZWQgKGVycm9yPSVpKVxuIiwKLQkJCXVyYi0+c3RhdHVzKTsKLX0KLQotLyoKLSAqIFN0b3AgYW5kIERlYWxsb2NhdGUgVVJCcwotICovCi1zdGF0aWMgdm9pZCB0bTYwMDBfdW5pbml0X2lzb2Moc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0Jc3RydWN0IHVyYiAqdXJiOwotCWludCBpOwotCi0JZGV2LT5pc29jX2N0bC5idWYgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBkZXYtPmlzb2NfY3RsLm51bV9idWZzOyBpKyspIHsKLQkJdXJiID0gZGV2LT5pc29jX2N0bC51cmJbaV07Ci0JCWlmICh1cmIpIHsKLQkJCXVzYl9raWxsX3VyYih1cmIpOwotCQkJdXNiX3VubGlua191cmIodXJiKTsKLQkJCWlmIChkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcltpXSkgewotCQkJCXVzYl9mcmVlX2NvaGVyZW50KGRldi0+dWRldiwKLQkJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCQkJCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyW2ldLAotCQkJCQkJdXJiLT50cmFuc2Zlcl9kbWEpOwotCQkJfQotCQkJdXNiX2ZyZWVfdXJiKHVyYik7Ci0JCQlkZXYtPmlzb2NfY3RsLnVyYltpXSA9IE5VTEw7Ci0JCX0KLQkJZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0gPSBOVUxMOwotCX0KLQotCWtmcmVlKGRldi0+aXNvY19jdGwudXJiKTsKLQlrZnJlZShkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcik7Ci0KLQlkZXYtPmlzb2NfY3RsLnVyYiA9IE5VTEw7Ci0JZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOwotCWRldi0+aXNvY19jdGwubnVtX2J1ZnMgPSAwOwotfQotCi0vKgotICogQWxsb2NhdGUgVVJCcyBhbmQgc3RhcnQgSVJRCi0gKi8KLXN0YXRpYyBpbnQgdG02MDAwX3ByZXBhcmVfaXNvYyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSA9ICZkZXYtPnZpZHE7Ci0JaW50IGksIGosIHNiX3NpemUsIHBpcGUsIHNpemUsIG1heF9wYWNrZXRzLCBudW1fYnVmcyA9IDg7Ci0Jc3RydWN0IHVyYiAqdXJiOwotCi0JLyogRGUtYWxsb2NhdGVzIGFsbCBwZW5kaW5nIHN0dWZmICovCi0JdG02MDAwX3VuaW5pdF9pc29jKGRldik7Ci0JLyogU3RvcCBpbnRlcnJ1cHQgVVNCIHBpcGUgKi8KLQl0bTYwMDBfaXJfaW50X3N0b3AoZGV2KTsKLQotCXVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwKLQkJCSAgZGV2LT5pc29jX2luLmJJbnRlcmZhY2VOdW1iZXIsCi0JCQkgIGRldi0+aXNvY19pbi5iQWx0ZXJuYXRlU2V0dGluZyk7Ci0KLQkvKiBTdGFydCBpbnRlcnJ1cHQgVVNCIHBpcGUgKi8KLQl0bTYwMDBfaXJfaW50X3N0YXJ0KGRldik7Ci0KLQlwaXBlID0gdXNiX3Jjdmlzb2NwaXBlKGRldi0+dWRldiwKLQkJCSAgICAgICBkZXYtPmlzb2NfaW4uZW5kcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYKLQkJCSAgICAgICBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOwotCi0Jc2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7Ci0KLQlpZiAoc2l6ZSA+IGRldi0+aXNvY19pbi5tYXhzaXplKQotCQlzaXplID0gZGV2LT5pc29jX2luLm1heHNpemU7Ci0KLQlkZXYtPmlzb2NfY3RsLm1heF9wa3Rfc2l6ZSA9IHNpemU7Ci0KLQltYXhfcGFja2V0cyA9IFRNNjAwMF9NQVhfSVNPX1BBQ0tFVFM7Ci0Jc2Jfc2l6ZSA9IG1heF9wYWNrZXRzICogc2l6ZTsKLQotCWRldi0+aXNvY19jdGwubnVtX2J1ZnMgPSBudW1fYnVmczsKLQotCWRldi0+aXNvY19jdGwudXJiID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSpudW1fYnVmcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmlzb2NfY3RsLnVyYikgewotCQl0bTYwMDBfZXJyKCJjYW5ub3QgYWxsb2MgbWVtb3J5IGZvciB1c2IgYnVmZmVyc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSpudW1fYnVmcywKLQkJCQkgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyKSB7Ci0JCXRtNjAwMF9lcnIoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHVzYnRyYW5zZmVyXG4iKTsKLQkJa2ZyZWUoZGV2LT5pc29jX2N0bC51cmIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19RVUVVRSwgIkFsbG9jYXRpbmcgJWQgeCAlZCBwYWNrZXRzIgotCQkgICAgIiAoJWQgYnl0ZXMpIG9mICVkIGJ5dGVzIGVhY2ggdG8gaGFuZGxlICV1IHNpemVcbiIsCi0JCSAgICBtYXhfcGFja2V0cywgbnVtX2J1ZnMsIHNiX3NpemUsCi0JCSAgICBkZXYtPmlzb2NfaW4ubWF4c2l6ZSwgc2l6ZSk7Ci0KLQkvKiBhbGxvY2F0ZSB1cmJzIGFuZCB0cmFuc2ZlciBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewotCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF1cmIpIHsKLQkJCXRtNjAwMF9lcnIoImNhbm5vdCBhbGxvYyBpc29jX2N0bC51cmIgJWlcbiIsIGkpOwotCQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7Ci0JCQl1c2JfZnJlZV91cmIodXJiKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWRldi0+aXNvY19jdGwudXJiW2ldID0gdXJiOwotCi0JCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyW2ldID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwKLQkJCXNiX3NpemUsIEdGUF9LRVJORUwsICZ1cmItPnRyYW5zZmVyX2RtYSk7Ci0JCWlmICghZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0pIHsKLQkJCXRtNjAwMF9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSAlaSBieXRlcyBmb3IgdHJhbnNmZXIiCi0JCQkJCSIgYnVmZmVyICVpJXNcbiIsCi0JCQkJCXNiX3NpemUsIGksCi0JCQkJCWluX2ludGVycnVwdCgpID8gIiB3aGlsZSBpbiBpbnQiIDogIiIpOwotCQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQltZW1zZXQoZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0sIDAsIHNiX3NpemUpOwotCi0JCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgZGV2LT51ZGV2LCBwaXBlLAotCQkJCSAgZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0sIHNiX3NpemUsCi0JCQkJICB0bTYwMDBfaXJxX2NhbGxiYWNrLCBkbWFfcSk7Ci0JCXVyYi0+aW50ZXJ2YWwgPSBkZXYtPmlzb2NfaW4uZW5kcC0+ZGVzYy5iSW50ZXJ2YWw7Ci0JCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBtYXhfcGFja2V0czsKLQkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUCB8IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwotCi0JCWZvciAoaiA9IDA7IGogPCBtYXhfcGFja2V0czsgaisrKSB7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IHNpemUgKiBqOwotCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBzaXplOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdG02MDAwX3N0YXJ0X3RocmVhZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSA9ICZkZXYtPnZpZHE7Ci0JaW50IGk7Ci0KLQlkbWFfcS0+ZnJhbWUgPSAwOwotCWRtYV9xLT5pbmlfamlmZmllcyA9IGppZmZpZXM7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFfcS0+d3EpOwotCi0JLyogc3VibWl0IHVyYnMgYW5kIGVuYWJsZXMgSVJRICovCi0JZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewotCQlpbnQgcmMgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmlzb2NfY3RsLnVyYltpXSwgR0ZQX0FUT01JQyk7Ci0JCWlmIChyYykgewotCQkJdG02MDAwX2Vycigic3VibWl0IG9mIHVyYiAlaSBmYWlsZWQgKGVycm9yPSVpKVxuIiwgaSwKLQkJCQkgICByYyk7Ci0JCQl0bTYwMDBfdW5pbml0X2lzb2MoZGV2KTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCVZpZGVvYnVmIG9wZXJhdGlvbnMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyBpbnQKLWJ1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKnNpemUpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSB2cS0+cHJpdl9kYXRhOwotCi0JKnNpemUgPSBmaC0+Zm10LT5kZXB0aCAqIGZoLT53aWR0aCAqIGZoLT5oZWlnaHQgPj4gMzsKLQlpZiAoMCA9PSAqY291bnQpCi0JCSpjb3VudCA9IFRNNjAwMF9ERUZfQlVGOwotCi0JaWYgKCpjb3VudCA8IFRNNjAwMF9NSU5fQlVGKQotCQkqY291bnQgPSBUTTYwMDBfTUlOX0JVRjsKLQotCXdoaWxlICgqc2l6ZSAqICpjb3VudCA+IHZpZF9saW1pdCAqIDEwMjQgKiAxMDI0KQotCQkoKmNvdW50KS0tOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB0bTYwMDBfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCB0bTYwMDBfY29yZSAgICpkZXYgPSBmaC0+ZGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoaW5faW50ZXJydXB0KCkpCi0JCUJVRygpOwotCi0JLyogV2UgdXNlZCB0byB3YWl0IGZvciB0aGUgYnVmZmVyIHRvIGZpbmlzaCBoZXJlLCBidXQgdGhpcyBkaWRuJ3Qgd29yawotCSAgIGJlY2F1c2UsIGFzIHdlIHdlcmUga2VlcGluZyB0aGUgc3RhdGUgYXMgVklERU9CVUZfUVVFVUVELAotCSAgIHZpZGVvYnVmX3F1ZXVlX2NhbmNlbCBtYXJrZWQgaXQgYXMgZmluaXNoZWQgZm9yIHVzLgotCSAgIChBbHNvLCBpdCBjb3VsZCB3ZWRnZSBmb3JldmVyIGlmIHRoZSBoYXJkd2FyZSB3YXMgbWlzY29uZmlndXJlZC4pCi0KLQkgICBUaGlzIHNob3VsZCBiZSBzYWZlOyBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSwgdGhlIGJ1ZmZlciBpc24ndAotCSAgIHF1ZXVlZCBhbnltb3JlLiBJZiB3ZSBldmVyIHN0YXJ0IG1hcmtpbmcgdGhlIGJ1ZmZlcnMgYXMKLQkgICBWSURFT0JVRl9BQ1RJVkUsIGl0IHdvbid0IGJlLCB0aG91Z2guCi0JKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwotCWlmIChkZXYtPmlzb2NfY3RsLmJ1ZiA9PSBidWYpCi0JCWRldi0+aXNvY19jdGwuYnVmID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLCBmbGFncyk7Ci0KLQl2aWRlb2J1Zl92bWFsbG9jX2ZyZWUoJmJ1Zi0+dmIpOwotCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOwotfQotCi1zdGF0aWMgaW50Ci1idWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKLQkJCQkJCWVudW0gdjRsMl9maWVsZCBmaWVsZCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgICAqZmggID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgdG02MDAwX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgdG02MDAwX2J1ZmZlciwgdmIpOwotCXN0cnVjdCB0bTYwMDBfY29yZSAgICpkZXYgPSBmaC0+ZGV2OwotCWludCByYyA9IDAsIHVyYl9pbml0ID0gMDsKLQotCUJVR19PTihOVUxMID09IGZoLT5mbXQpOwotCi0KLQkvKiBGSVhNRTogSXQgYXNzdW1lcyBkZXB0aD0yICovCi0JLyogVGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZCBmb3JtYXQgaXMgMTYgYml0cy9waXhlbCAqLwotCWJ1Zi0+dmIuc2l6ZSA9IGZoLT5mbXQtPmRlcHRoKmZoLT53aWR0aCpmaC0+aGVpZ2h0ID4+IDM7Ci0JaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBidWYtPnZiLnNpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGJ1Zi0+Zm10ICAgICAgICE9IGZoLT5mbXQgICAgfHwKLQkgICAgYnVmLT52Yi53aWR0aCAgIT0gZmgtPndpZHRoICB8fAotCSAgICBidWYtPnZiLmhlaWdodCAhPSBmaC0+aGVpZ2h0IHx8Ci0JICAgIGJ1Zi0+dmIuZmllbGQgICE9IGZpZWxkKSB7Ci0JCWJ1Zi0+Zm10ICAgICAgID0gZmgtPmZtdDsKLQkJYnVmLT52Yi53aWR0aCAgPSBmaC0+d2lkdGg7Ci0JCWJ1Zi0+dmIuaGVpZ2h0ID0gZmgtPmhlaWdodDsKLQkJYnVmLT52Yi5maWVsZCAgPSBmaWVsZDsKLQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7Ci0JfQotCi0JaWYgKFZJREVPQlVGX05FRURTX0lOSVQgPT0gYnVmLT52Yi5zdGF0ZSkgewotCQlyYyA9IHZpZGVvYnVmX2lvbG9jayh2cSwgJmJ1Zi0+dmIsIE5VTEwpOwotCQlpZiAocmMgIT0gMCkKLQkJCWdvdG8gZmFpbDsKLQkJdXJiX2luaXQgPSAxOwotCX0KLQotCWlmICghZGV2LT5pc29jX2N0bC5udW1fYnVmcykKLQkJdXJiX2luaXQgPSAxOwotCi0JaWYgKHVyYl9pbml0KSB7Ci0JCXJjID0gdG02MDAwX3ByZXBhcmVfaXNvYyhkZXYpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBmYWlsOwotCi0JCXJjID0gdG02MDAwX3N0YXJ0X3RocmVhZChkZXYpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBmYWlsOwotCi0JfQotCi0JYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOwotCXJldHVybiAwOwotCi1mYWlsOgotCWZyZWVfYnVmZmVyKHZxLCBidWYpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQKLWJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgdG02MDAwX2J1ZmZlciAgICAqYnVmICAgICA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHRtNjAwMF9idWZmZXIsIHZiKTsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgICAgICAqZmggICAgICA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICAgICAgKmRldiAgICAgPSBmaC0+ZGV2OwotCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICp2aWRxICAgID0gJmRldi0+dmlkcTsKLQotCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnZpZHEtPmFjdGl2ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQotewotCXN0cnVjdCB0bTYwMDBfYnVmZmVyICAgKmJ1ZiAgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCB0bTYwMDBfYnVmZmVyLCB2Yik7Ci0KLQlmcmVlX2J1ZmZlcih2cSwgYnVmKTsKLX0KLQotc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgdG02MDAwX3ZpZGVvX3FvcHMgPSB7Ci0JLmJ1Zl9zZXR1cCAgICAgID0gYnVmZmVyX3NldHVwLAotCS5idWZfcHJlcGFyZSAgICA9IGJ1ZmZlcl9wcmVwYXJlLAotCS5idWZfcXVldWUgICAgICA9IGJ1ZmZlcl9xdWV1ZSwKLQkuYnVmX3JlbGVhc2UgICAgPSBidWZmZXJfcmVsZWFzZSwKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoJSU9DVEwgaGFuZGxpbmcKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyBib29sIGlzX3Jlc19yZWFkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCkKLXsKLQkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLwotCWlmIChkZXYtPnJlc291cmNlcyA9PSBmaCAmJiBkZXYtPmlzX3Jlc19yZWFkKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaXNfcmVzX3N0cmVhbWluZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgc3RydWN0IHRtNjAwMF9maCAqZmgpCi17Ci0JLyogSXMgdGhlIGN1cnJlbnQgZmggaGFuZGxpbmcgaXQ/IGlmIHNvLCB0aGF0J3MgT0sgKi8KLQlpZiAoZGV2LT5yZXNvdXJjZXMgPT0gZmgpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCByZXNfZ2V0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCwKLQkJICAgYm9vbCBpc19yZXNfcmVhZCkKLXsKLQkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLwotCWlmIChkZXYtPnJlc291cmNlcyA9PSBmaCAmJiBkZXYtPmlzX3Jlc19yZWFkID09IGlzX3Jlc19yZWFkKQotCQlyZXR1cm4gdHJ1ZTsKLQotCS8qIGlzIGl0IGZyZWU/ICovCi0JaWYgKGRldi0+cmVzb3VyY2VzKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBncmFiIGl0ICovCi0JZGV2LT5yZXNvdXJjZXMgPSBmaDsKLQlkZXYtPmlzX3Jlc19yZWFkID0gaXNfcmVzX3JlYWQ7Ci0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUkVTX0xPQ0ssICJyZXM6IGdldFxuIik7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc19mcmVlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCkKLXsKLQkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLwotCWlmIChkZXYtPnJlc291cmNlcyAhPSBmaCkKLQkJcmV0dXJuOwotCi0JZGV2LT5yZXNvdXJjZXMgPSBOVUxMOwotCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX1JFU19MT0NLLCAicmVzOiBwdXRcbiIpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCUlPQ1RMIHZpZGlvYyBoYW5kbGluZwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gKChzdHJ1Y3QgdG02MDAwX2ZoICopcHJpdiktPmRldjsKLQotCXN0cmxjcHkoY2FwLT5kcml2ZXIsICJ0bTYwMDAiLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKLQlzdHJsY3B5KGNhcC0+Y2FyZCwgIlRyaWRlbnQgVFZNYXN0ZXIgVE01NjAwLzYwMDAvNjAxMCIsIHNpemVvZihjYXAtPmNhcmQpKTsKLQljYXAtPnZlcnNpb24gPSBUTTYwMDBfVkVSU0lPTjsKLQljYXAtPmNhcGFiaWxpdGllcyA9CVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAotCQkJCVY0TDJfQ0FQX1NUUkVBTUlORyAgICAgfAotCQkJCVY0TDJfQ0FQX0FVRElPICAgICAgICAgfAotCQkJCVY0TDJfQ0FQX1JFQURXUklURTsKLQotCWlmIChkZXYtPnR1bmVyX3R5cGUgIT0gVFVORVJfQUJTRU5UKQotCQljYXAtPmNhcGFiaWxpdGllcyB8PSBWNEwyX0NBUF9UVU5FUjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKLXsKLQlpZiAodW5saWtlbHkoZi0+aW5kZXggPj0gQVJSQVlfU0laRShmb3JtYXQpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzdHJsY3B5KGYtPmRlc2NyaXB0aW9uLCBmb3JtYXRbZi0+aW5kZXhdLm5hbWUsIHNpemVvZihmLT5kZXNjcmlwdGlvbikpOwotCWYtPnBpeGVsZm9ybWF0ID0gZm9ybWF0W2YtPmluZGV4XS5mb3VyY2M7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OwotCi0JZi0+Zm10LnBpeC53aWR0aCAgICAgICAgPSBmaC0+d2lkdGg7Ci0JZi0+Zm10LnBpeC5oZWlnaHQgICAgICAgPSBmaC0+aGVpZ2h0OwotCWYtPmZtdC5waXguZmllbGQgICAgICAgID0gZmgtPnZiX3ZpZHEuZmllbGQ7Ci0JZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAgPSBmaC0+Zm10LT5mb3VyY2M7Ci0JZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQotCQkoZi0+Zm10LnBpeC53aWR0aCAqIGZoLT5mbXQtPmRlcHRoKSA+PiAzOwotCWYtPmZtdC5waXguc2l6ZWltYWdlID0KLQkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHRtNjAwMF9mbXQgKmZvcm1hdF9ieV9mb3VyY2ModW5zaWduZWQgaW50IGZvdXJjYykKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdCk7IGkrKykKLQkJaWYgKGZvcm1hdFtpXS5mb3VyY2MgPT0gZm91cmNjKQotCQkJcmV0dXJuIGZvcm1hdCtpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSAoKHN0cnVjdCB0bTYwMDBfZmggKilwcml2KS0+ZGV2OwotCXN0cnVjdCB0bTYwMDBfZm10ICpmbXQ7Ci0JZW51bSB2NGwyX2ZpZWxkIGZpZWxkOwotCi0JZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlpZiAoTlVMTCA9PSBmbXQpIHsKLQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfSU9DVExfQVJHLCAiRm91cmNjIGZvcm1hdCAoMHglMDh4KSIKLQkJCQkiIGludmFsaWQuXG4iLCBmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCi0JaWYgKGZpZWxkID09IFY0TDJfRklFTERfQU5ZKQotCQlmaWVsZCA9IFY0TDJfRklFTERfU0VRX1RCOwotCWVsc2UgaWYgKFY0TDJfRklFTERfSU5URVJMQUNFRCAhPSBmaWVsZCkgewotCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JT0NUTF9BUkcsICJGaWVsZCB0eXBlIGludmFsaWQuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdG02MDAwX2dldF9zdGRfcmVzKGRldik7Ci0KLQlmLT5mbXQucGl4LndpZHRoICA9IGRldi0+d2lkdGg7Ci0JZi0+Zm10LnBpeC5oZWlnaHQgPSBkZXYtPmhlaWdodDsKLQotCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDE7Ci0KLQlmLT5mbXQucGl4LmZpZWxkID0gZmllbGQ7Ci0KLQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9Ci0JCShmLT5mbXQucGl4LndpZHRoICogZm10LT5kZXB0aCkgPj4gMzsKLQlmLT5mbXQucGl4LnNpemVpbWFnZSA9Ci0JCWYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLypGSVhNRTogVGhpcyBzZWVtcyB0byBiZSBnZW5lcmljIGVub3VnaCB0byBiZSBhdCB2aWRlb2RldjIgKi8KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQlpbnQgcmV0ID0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBmaCwgZik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlmaC0+Zm10ICAgICAgICAgICA9IGZvcm1hdF9ieV9mb3VyY2MoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7Ci0JZmgtPndpZHRoICAgICAgICAgPSBmLT5mbXQucGl4LndpZHRoOwotCWZoLT5oZWlnaHQgICAgICAgID0gZi0+Zm10LnBpeC5oZWlnaHQ7Ci0JZmgtPnZiX3ZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCWZoLT50eXBlICAgICAgICAgID0gZi0+dHlwZTsKLQotCWRldi0+Zm91cmNjICAgICAgID0gZi0+Zm10LnBpeC5waXhlbGZvcm1hdDsKLQotCXRtNjAwMF9zZXRfZm91cmNjX2Zvcm1hdChkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OwotCi0JcmV0dXJuIHZpZGVvYnVmX3JlcWJ1ZnMoJmZoLT52Yl92aWRxLCBwKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0KLQlyZXR1cm4gdmlkZW9idWZfcXVlcnlidWYoJmZoLT52Yl92aWRxLCBwKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0KLQlyZXR1cm4gdmlkZW9idWZfcWJ1ZigmZmgtPnZiX3ZpZHEsIHApOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0KLQlyZXR1cm4gdmlkZW9idWZfZHFidWYoJmZoLT52Yl92aWRxLCBwLAotCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgICAgPSBmaC0+ZGV2OwotCi0JaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGkgIT0gZmgtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFyZXNfZ2V0KGRldiwgZmgsIGZhbHNlKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oJmZoLT52Yl92aWRxKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ICAgID0gZmgtPmRldjsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPnZiX3ZpZHEpOwotCXJlc19mcmVlKGRldiwgZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqbm9ybSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQotCWRldi0+bm9ybSA9ICpub3JtOwotCXJjID0gdG02MDAwX2luaXRfYW5hbG9nX21vZGUoZGV2KTsKLQotCWZoLT53aWR0aCAgPSBkZXYtPndpZHRoOwotCWZoLT5oZWlnaHQgPSBkZXYtPmhlaWdodDsKLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBjb3JlLCBzX3N0ZCwgZGV2LT5ub3JtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqaW5hbWVbXSA9IHsKLQlbVE02MDAwX0lOUFVUX1RWXSA9ICJUZWxldmlzaW9uIiwKLQlbVE02MDAwX0lOUFVUX0NPTVBPU0lURTFdID0gIkNvbXBvc2l0ZSAxIiwKLQlbVE02MDAwX0lOUFVUX0NPTVBPU0lURTJdID0gIkNvbXBvc2l0ZSAyIiwKLQlbVE02MDAwX0lOUFVUX1NWSURFT10gPSAiUy1WaWRlbyIsCi19OwotCi1zdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppKQotewotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQl1bnNpZ25lZCBpbnQgbjsKLQotCW4gPSBpLT5pbmRleDsKLQlpZiAobiA+PSAzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZGV2LT52aW5wdXRbbl0udHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpLT5pbmRleCA9IG47Ci0KLQlpZiAoZGV2LT52aW5wdXRbbl0udHlwZSA9PSBUTTYwMDBfSU5QVVRfVFYpCi0JCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7Ci0JZWxzZQotCQlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQotCXN0cmNweShpLT5uYW1lLCBpbmFtZVtkZXYtPnZpbnB1dFtuXS50eXBlXSk7Ci0KLQlpLT5zdGQgPSBUTTYwMDBfU1REOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQkqaSA9IGRldi0+aW5wdXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAgICpmaCA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OwotCWludCByYyA9IDA7Ci0KLQlpZiAoaSA+PSAzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIWRldi0+dmlucHV0W2ldLnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2LT5pbnB1dCA9IGk7Ci0KLQlyYyA9IHZpZGlvY19zX3N0ZChmaWxlLCBwcml2LCAmZGV2LT52ZmQtPmN1cnJlbnRfbm9ybSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLSBjb250cm9scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRtNjAwMF9xY3RybCk7IGkrKykKLQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gdG02MDAwX3FjdHJsW2ldLmlkKSB7Ci0JCQltZW1jcHkocWMsICYodG02MDAwX3FjdHJsW2ldKSwKLQkJCQlzaXplb2YoKnFjKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgICAgPSBmaC0+ZGV2OwotCWludCAgdmFsOwotCi0JLyogRklYTUU6IFByb2JhYmx5LCB0aG9zZSB3b24ndCB3b3JrISBNYXliZSB3ZSBuZWVkIHNoYWRvdyByZWdzICovCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCXZhbCA9IHRtNjAwMF9nZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwOF9MVU1BX0NPTlRSQVNUX0FESiwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJdmFsID0gdG02MDAwX2dldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjA5X0xVTUFfQlJJR0hUTkVTU19BREosIDApOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCXZhbCA9IHRtNjAwMF9nZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwQV9DSFJPTUFfU0FUVVJBVElPTl9BREosIDApOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJdmFsID0gdG02MDAwX2dldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjBCX0NIUk9NQV9IVUVfUEhBU0VfQURKLCAwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQl2YWwgPSBkZXYtPmN0bF9tdXRlOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJdmFsID0gZGV2LT5jdGxfdm9sdW1lOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodmFsIDwgMCkKLQkJcmV0dXJuIHZhbDsKLQotCWN0cmwtPnZhbHVlID0gdmFsOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoICA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OwotCXU4ICB2YWwgPSBjdHJsLT52YWx1ZTsKLQotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SMDhfTFVNQV9DT05UUkFTVF9BREosIHZhbCk7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjA5X0xVTUFfQlJJR0hUTkVTU19BREosIHZhbCk7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjBBX0NIUk9NQV9TQVRVUkFUSU9OX0FESiwgdmFsKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9IVUU6Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwQl9DSFJPTUFfSFVFX1BIQVNFX0FESiwgdmFsKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQlkZXYtPmN0bF9tdXRlID0gdmFsOwotCQl0bTYwMDBfdHZhdWRpb19zZXRfbXV0ZShkZXYsIHZhbCk7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQlkZXYtPmN0bF92b2x1bWUgPSB2YWw7Ci0JCXRtNjAwMF9zZXRfdm9sdW1lKGRldiwgdmFsKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQotewotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAodW5saWtlbHkoVU5TRVQgPT0gZGV2LT50dW5lcl90eXBlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKDAgIT0gdC0+aW5kZXgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3RyY3B5KHQtPm5hbWUsICJUZWxldmlzaW9uIik7Ci0JdC0+dHlwZSAgICAgICA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCXQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9OT1JNOwotCXQtPnJhbmdlaGlnaCAgPSAweGZmZmZmZmZmVUw7Ci0JdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgZ190dW5lciwgdCk7Ci0KLQl0LT5hdWRtb2RlID0gZGV2LT5hbW9kZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQotewotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAoVU5TRVQgPT0gZGV2LT50dW5lcl90eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoMCAhPSB0LT5pbmRleCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXYtPmFtb2RlID0gdC0+YXVkbW9kZTsKLQlkcHJpbnRrKGRldiwgMywgImF1ZGlvIG1vZGU6ICV4XG4iLCB0LT5hdWRtb2RlKTsKLQotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc190dW5lciwgdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQotewotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAodW5saWtlbHkoVU5TRVQgPT0gZGV2LT50dW5lcl90eXBlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmLT50eXBlID0gZmgtPnJhZGlvID8gVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCWYtPmZyZXF1ZW5jeSA9IGRldi0+ZnJlcTsKLQotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgZ19mcmVxdWVuY3ksIGYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoICA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OwotCi0JaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh1bmxpa2VseShmLT50dW5lciAhPSAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKDAgPT0gZmgtPnJhZGlvICYmIFY0TDJfVFVORVJfQU5BTE9HX1RWICE9IGYtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICgxID09IGZoLT5yYWRpbyAmJiBWNEwyX1RVTkVSX1JBRElPICE9IGYtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2LT5mcmVxID0gZi0+ZnJlcXVlbmN5OwotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19mcmVxdWVuY3ksIGYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFkaW9fcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlzdHJjcHkoY2FwLT5kcml2ZXIsICJ0bTYwMDAiKTsKLQlzdHJsY3B5KGNhcC0+Y2FyZCwgZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5uYW1lKSk7Ci0Jc3ByaW50ZihjYXAtPmJ1c19pbmZvLCAiVVNCJTA0eDolMDR4IiwKLQkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwotCWNhcC0+dmVyc2lvbiA9IGRldi0+ZGV2X3R5cGU7Ci0JY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8Ci0JCQlWNEwyX0NBUF9BVURJTyAgICAgfAotCQkJVjRMMl9DQVBfUkFESU8gICAgIHwKLQkJCVY0TDJfQ0FQX1JFQURXUklURSB8Ci0JCQlWNEwyX0NBUF9TVFJFQU1JTkc7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByYWRpb19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAoMCAhPSB0LT5pbmRleCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7Ci0Jc3RyY3B5KHQtPm5hbWUsICJSYWRpbyIpOwotCXQtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0KLQl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIGdfdHVuZXIsIHQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFkaW9fc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnQpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OwotCi0JaWYgKDAgIT0gdC0+aW5kZXgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3R1bmVyLCB0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhZGlvX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppKQotewotCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAoaS0+aW5kZXggIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWRldi0+cmlucHV0LnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3RyY3B5KGktPm5hbWUsICJSYWRpbyIpOwotCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByYWRpb19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQotCWlmIChkZXYtPmlucHV0ICE9IDUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JKmkgPSBkZXYtPmlucHV0IC0gNTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhZGlvX2dfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQotewotCW1lbXNldChhLCAwLCBzaXplb2YoKmEpKTsKLQlzdHJjcHkoYS0+bmFtZSwgIlJhZGlvIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFkaW9fc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFkaW9fc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQotCWlmIChpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZGV2LT5yaW5wdXQudHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXYtPmlucHV0ID0gaSArIDU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByYWRpb19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHY0bDJfc3RkX2lkICpub3JtKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhZGlvX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjKQotewotCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybDsKLQotCWlmIChjLT5pZCA8ICBWNEwyX0NJRF9CQVNFIHx8Ci0JICAgIGMtPmlkID49IFY0TDJfQ0lEX0xBU1RQMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGMtPmlkID09IFY0TDJfQ0lEX0FVRElPX01VVEUpIHsKLQkJY3RybCA9IGN0cmxfYnlfaWQoYy0+aWQpOwotCQkqYyA9ICpjdHJsOwotCX0gZWxzZQotCQkqYyA9IG5vX2N0cmw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JRmlsZSBvcGVyYXRpb25zIGZvciB0aGUgZGV2aWNlCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHRtNjAwMF9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdG02MDAwX2ZoICpmaDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQlpbnQgaSwgcmM7Ci0JaW50IHJhZGlvID0gMDsKLQotCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogb3BlbiBjYWxsZWQgKGRldj0lcylcbiIsCi0JCXZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpOwotCi0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgInRtNjAwMDogb3BlbiBjYWxsZWQgKGRldj0lcylcbiIsCi0JCXZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpOwotCi0Jc3dpdGNoICh2ZGV2LT52ZmxfdHlwZSkgewotCWNhc2UgVkZMX1RZUEVfR1JBQkJFUjoKLQkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkxfVFlQRV9WQkk6Ci0JCXR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOwotCQlicmVhazsKLQljYXNlIFZGTF9UWVBFX1JBRElPOgotCQlyYWRpbyA9IDE7Ci0JCWJyZWFrOwotCX0KLQotCS8qIElmIG1vcmUgdGhhbiBvbmUgdXNlciwgbXV0ZXggc2hvdWxkIGJlIGFkZGVkICovCi0JZGV2LT51c2VycysrOwotCi0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgIm9wZW4gZGV2PSVzIHR5cGU9JXMgdXNlcnM9JWRcbiIsCi0JCXZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldiksIHY0bDJfdHlwZV9uYW1lc1t0eXBlXSwKLQkJZGV2LT51c2Vycyk7Ci0KLQkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwotCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gZmgpIHsKLQkJZGV2LT51c2Vycy0tOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLQlmaC0+ZGV2ICAgICAgPSBkZXY7Ci0JZmgtPnJhZGlvICAgID0gcmFkaW87Ci0JZGV2LT5yYWRpbyAgID0gcmFkaW87Ci0JZmgtPnR5cGUgICAgID0gdHlwZTsKLQlkZXYtPmZvdXJjYyAgPSBmb3JtYXRbMF0uZm91cmNjOwotCi0JZmgtPmZtdCAgICAgID0gZm9ybWF0X2J5X2ZvdXJjYyhkZXYtPmZvdXJjYyk7Ci0KLQl0bTYwMDBfZ2V0X3N0ZF9yZXMoZGV2KTsKLQotCWZoLT53aWR0aCAgICA9IGRldi0+d2lkdGg7Ci0JZmgtPmhlaWdodCAgID0gZGV2LT5oZWlnaHQ7Ci0KLQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19PUEVOLCAiT3BlbjogZmg9MHglMDhseCwgZGV2PTB4JTA4bHgsICIKLQkJCQkJCSJkZXYtPnZpZHE9MHglMDhseFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcpZmgsICh1bnNpZ25lZCBsb25nKWRldiwgKHVuc2lnbmVkIGxvbmcpJmRldi0+dmlkcSk7Ci0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgIk9wZW46IGxpc3RfZW1wdHkgIgotCQkJCSJxdWV1ZWQ9JWRcbiIsIGxpc3RfZW1wdHkoJmRldi0+dmlkcS5xdWV1ZWQpKTsKLQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19PUEVOLCAiT3BlbjogbGlzdF9lbXB0eSAiCi0JCQkJImFjdGl2ZT0lZFxuIiwgbGlzdF9lbXB0eSgmZGV2LT52aWRxLmFjdGl2ZSkpOwotCi0JLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSBvbiBhbmFsb2cgbW9kZSAqLwotCXJjID0gdG02MDAwX2luaXRfYW5hbG9nX21vZGUoZGV2KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoZGV2LT5tb2RlICE9IFRNNjAwMF9NT0RFX0FOQUxPRykgewotCQkvKiBQdXQgYWxsIGNvbnRyb2xzIGF0IGEgc2FuZSBzdGF0ZSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0bTYwMDBfcWN0cmwpOyBpKyspCi0JCQlxY3RsX3JlZ3NbaV0gPSB0bTYwMDBfcWN0cmxbaV0uZGVmYXVsdF92YWx1ZTsKLQotCQlkZXYtPm1vZGUgPSBUTTYwMDBfTU9ERV9BTkFMT0c7Ci0JfQotCi0JdmlkZW9idWZfcXVldWVfdm1hbGxvY19pbml0KCZmaC0+dmJfdmlkcSwgJnRtNjAwMF92aWRlb19xb3BzLAotCQkJTlVMTCwgJmRldi0+c2xvY2ssCi0JCQlmaC0+dHlwZSwKLQkJCVY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCXNpemVvZihzdHJ1Y3QgdG02MDAwX2J1ZmZlciksIGZoLCAmZGV2LT5sb2NrKTsKLQotCWlmIChmaC0+cmFkaW8pIHsKLQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgInZpZGVvX29wZW46IHNldHRpbmcgcmFkaW8gZGV2aWNlXG4iKTsKLQkJZGV2LT5pbnB1dCA9IDU7Ci0JCXRtNjAwMF9zZXRfYXVkaW9fcmlucHV0KGRldik7Ci0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19yYWRpbyk7Ci0JCXRtNjAwMF9wcmVwYXJlX2lzb2MoZGV2KTsKLQkJdG02MDAwX3N0YXJ0X3RocmVhZChkZXYpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdAotdG02MDAwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCB0bTYwMDBfZmggICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWlmIChmaC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJaWYgKCFyZXNfZ2V0KGZoLT5kZXYsIGZoLCB0cnVlKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfc3RyZWFtKCZmaC0+dmJfdmlkcSwgZGF0YSwgY291bnQsIHBvcywgMCwKLQkJCQkJZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotdG02MDAwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgICAgICAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHRtNjAwMF9idWZmZXIgICAgKmJ1ZjsKLQotCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgIT0gZmgtPnR5cGUpCi0JCXJldHVybiBQT0xMRVJSOwotCi0JaWYgKCEhaXNfcmVzX3N0cmVhbWluZyhmaC0+ZGV2LCBmaCkpCi0JCXJldHVybiBQT0xMRVJSOwotCi0JaWYgKCFpc19yZXNfcmVhZChmaC0+ZGV2LCBmaCkpIHsKLQkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmZoLT52Yl92aWRxLnN0cmVhbSkpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmJfdmlkcS5zdHJlYW0ubmV4dCwgc3RydWN0IHRtNjAwMF9idWZmZXIsIHZiLnN0cmVhbSk7Ci0JfSBlbHNlIHsKLQkJLyogcmVhZCgpIGNhcHR1cmUgKi8KLQkJcmV0dXJuIHZpZGVvYnVmX3BvbGxfc3RyZWFtKGZpbGUsICZmaC0+dmJfdmlkcSwKLQkJCQkJICAgIHdhaXQpOwotCX0KLQlwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+dmIuZG9uZSwgd2FpdCk7Ci0JaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRE9ORSB8fAotCSAgICBidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0VSUk9SKQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0bTYwMDBfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgICAgICAgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB0bTYwMDBfY29yZSAgICAgICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCB2aWRlb19kZXZpY2UgICAgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCi0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgInRtNjAwMDogY2xvc2UgY2FsbGVkIChkZXY9JXMsIHVzZXJzPSVkKVxuIiwKLQkJdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwgZGV2LT51c2Vycyk7Ci0KLQlkZXYtPnVzZXJzLS07Ci0KLQlyZXNfZnJlZShkZXYsIGZoKTsKLQlpZiAoIWRldi0+dXNlcnMpIHsKLQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7Ci0JCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZiX3ZpZHEpOwotCX0KLQotCWtmcmVlKGZoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRtNjAwMF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAgICAgICAgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSB2aWRlb2J1Zl9tbWFwX21hcHBlcigmZmgtPnZiX3ZpZHEsIHZtYSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHRtNjAwMF9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSB0bTYwMDBfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSB0bTYwMDBfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSB2aWRlb19pb2N0bDIsIC8qIFY0TDIgaW9jdGwgaGFuZGxlciAqLwotCS5yZWFkICAgICAgICAgICA9IHRtNjAwMF9yZWFkLAotCS5wb2xsCQk9IHRtNjAwMF9wb2xsLAotCS5tbWFwCQk9IHRtNjAwMF9tbWFwLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2aWRlb19pb2N0bF9vcHMgPSB7Ci0JLnZpZGlvY19xdWVyeWNhcCAgICAgICAgICA9IHZpZGlvY19xdWVyeWNhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgID0gdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19nX2ZtdF92aWRfY2FwICAgICA9IHZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwICAgPSB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcCAgICAgPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3Nfc3RkICAgICAgICAgICAgID0gdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfZW51bV9pbnB1dCAgICAgICAgPSB2aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQgICAgICAgICAgID0gdmlkaW9jX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0ICAgICAgICAgICA9IHZpZGlvY19zX2lucHV0LAotCS52aWRpb2NfcXVlcnljdHJsICAgICAgICAgPSB2aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsICAgICAgICAgICAgPSB2aWRpb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsICAgICAgICAgICAgPSB2aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfZ190dW5lciAgICAgICAgICAgPSB2aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgICAgICAgICAgID0gdmlkaW9jX3NfdHVuZXIsCi0JLnZpZGlvY19nX2ZyZXF1ZW5jeSAgICAgICA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ICAgICAgID0gdmlkaW9jX3NfZnJlcXVlbmN5LAotCS52aWRpb2Nfc3RyZWFtb24gICAgICAgICAgPSB2aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgICAgICAgICA9IHZpZGlvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19yZXFidWZzICAgICAgICAgICA9IHZpZGlvY19yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYgICAgICAgICAgPSB2aWRpb2NfcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmICAgICAgICAgICAgICA9IHZpZGlvY19xYnVmLAotCS52aWRpb2NfZHFidWYgICAgICAgICAgICAgPSB2aWRpb2NfZHFidWYsCi19OwotCi1zdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB0bTYwMDBfdGVtcGxhdGUgPSB7Ci0JLm5hbWUJCT0gInRtNjAwMCIsCi0JLmZvcHMgICAgICAgICAgID0gJnRtNjAwMF9mb3BzLAotCS5pb2N0bF9vcHMgICAgICA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKLQkudHZub3JtcyAgICAgICAgPSBUTTYwMDBfU1RELAotCS5jdXJyZW50X25vcm0gICA9IFY0TDJfU1REX05UU0NfTSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgcmFkaW9fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gdG02MDAwX29wZW4sCi0JLnJlbGVhc2UJPSB0bTYwMDBfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSB2aWRlb19pb2N0bDIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHJhZGlvX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwCT0gcmFkaW9fcXVlcnljYXAsCi0JLnZpZGlvY19nX3R1bmVyCQk9IHJhZGlvX2dfdHVuZXIsCi0JLnZpZGlvY19lbnVtX2lucHV0CT0gcmFkaW9fZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfYXVkaW8JCT0gcmFkaW9fZ19hdWRpbywKLQkudmlkaW9jX3NfdHVuZXIJCT0gcmFkaW9fc190dW5lciwKLQkudmlkaW9jX3NfYXVkaW8JCT0gcmFkaW9fc19hdWRpbywKLQkudmlkaW9jX3NfaW5wdXQJCT0gcmFkaW9fc19pbnB1dCwKLQkudmlkaW9jX3Nfc3RkCQk9IHJhZGlvX3Nfc3RkLAotCS52aWRpb2NfcXVlcnljdHJsCT0gcmFkaW9fcXVlcnljdHJsLAotCS52aWRpb2NfZ19pbnB1dAkJPSByYWRpb19nX2lucHV0LAotCS52aWRpb2NfZ19jdHJsCQk9IHZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwJCT0gdmlkaW9jX3NfY3RybCwKLQkudmlkaW9jX2dfZnJlcXVlbmN5CT0gdmlkaW9jX2dfZnJlcXVlbmN5LAotCS52aWRpb2Nfc19mcmVxdWVuY3kJPSB2aWRpb2Nfc19mcmVxdWVuY3ksCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIHRtNjAwMF9yYWRpb190ZW1wbGF0ZSA9IHsKLQkubmFtZQkJCT0gInRtNjAwMCIsCi0JLmZvcHMJCQk9ICZyYWRpb19mb3BzLAotCS5pb2N0bF9vcHMJCT0gJnJhZGlvX2lvY3RsX29wcywKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKglJbml0aWFsaXphdGlvbiBhbmQgbW9kdWxlIHN0dWZmCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1zdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LAotCQljb25zdCBzdHJ1Y3QgdmlkZW9fZGV2aWNlCi0JCSp0ZW1wbGF0ZSwgY29uc3QgY2hhciAqdHlwZV9uYW1lKQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKLQotCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmIChOVUxMID09IHZmZCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkqdmZkID0gKnRlbXBsYXRlOwotCXZmZC0+djRsMl9kZXYgPSAmZGV2LT52NGwyX2RldjsKLQl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKLQl2ZmQtPmRlYnVnID0gdG02MDAwX2RlYnVnOwotCXZmZC0+bG9jayA9ICZkZXYtPmxvY2s7Ci0KLQlzbnByaW50Zih2ZmQtPm5hbWUsIHNpemVvZih2ZmQtPm5hbWUpLCAiJXMgJXMiLCBkZXYtPm5hbWUsIHR5cGVfbmFtZSk7Ci0KLQl2aWRlb19zZXRfZHJ2ZGF0YSh2ZmQsIGRldik7Ci0JcmV0dXJuIHZmZDsKLX0KLQotaW50IHRtNjAwMF92NGwyX3JlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCWludCByZXQgPSAtMTsKLQotCWRldi0+dmZkID0gdmRldl9pbml0KGRldiwgJnRtNjAwMF90ZW1wbGF0ZSwgInZpZGVvIik7Ci0KLQlpZiAoIWRldi0+dmZkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBjYW4ndCByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBpbml0IHZpZGVvIGRtYSBxdWV1ZXMgKi8KLQlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLmFjdGl2ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+dmlkcS5xdWV1ZWQpOwotCi0JcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkLCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShkZXYtPnZmZCkpOwotCi0JaWYgKGRldi0+Y2Fwcy5oYXNfcmFkaW8pIHsKLQkJZGV2LT5yYWRpb19kZXYgPSB2ZGV2X2luaXQoZGV2LCAmdG02MDAwX3JhZGlvX3RlbXBsYXRlLAotCQkJCQkJCSAgICJyYWRpbyIpOwotCQlpZiAoIWRldi0+cmFkaW9fZGV2KSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcmVnaXN0ZXIgcmFkaW8gZGV2aWNlXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCQlyZXR1cm4gcmV0OyAvKiBGSVhNRSByZWxlYXNlIHJlc291cmNlICovCi0JCX0KLQotCQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT5yYWRpb19kZXYsIFZGTF9UWVBFX1JBRElPLAotCQkJCQkgICAgcmFkaW9fbnIpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IHJlZ2lzdGVyIHJhZGlvIGRldmljZVxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUpOwotCQkJcmV0dXJuIHJldDsgLyogRklYTUUgcmVsZWFzZSByZXNvdXJjZSAqLwotCQl9Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+cmFkaW9fZGV2KSk7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiVHJpZGVudCBUVk1hc3RlciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IyIGJvYXJkIChMb2FkIHN0YXR1czogJWQpXG4iLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCB0bTYwMDBfdjRsMl91bnJlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkKTsKLQotCWlmIChkZXYtPnJhZGlvX2RldikgewotCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPnJhZGlvX2RldikpCi0JCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnJhZGlvX2Rldik7Ci0JCWVsc2UKLQkJCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+cmFkaW9fZGV2KTsKLQkJZGV2LT5yYWRpb19kZXYgPSBOVUxMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgdG02MDAwX3Y0bDJfZXhpdCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1tb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAiQWxsb3cgY2hhbmdpbmcgdmlkZW8gZGV2aWNlIG51bWJlciIpOwotCi1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIHRtNjAwMF9kZWJ1ZywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJhY3RpdmF0ZXMgZGVidWcgaW5mbyIpOwotCi1tb2R1bGVfcGFyYW0odmlkX2xpbWl0LCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh2aWRfbGltaXQsICJjYXB0dXJlIG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMiKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmRhNjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKgotICogIHRtNjAwMC5oIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGVsIEx1ZHdpZyA8bWljaGVsLmx1ZHdpZ0BnbWFpbC5jb20+Ci0gKgktIERWQi1UIHN1cHBvcnQKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0vKiBVc2UgdGhlIHRtNjAwMC1oYWNrLCBpbnN0ZWFkIG9mIHRoZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gY29kZSBpKi8KLS8qICNkZWZpbmUgSEFDSyAxICovCi0KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgotI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLXZtYWxsb2MuaD4KLSNpbmNsdWRlICJ0bTYwMDAtdXNiLWlzb2MuaCIKLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgotI2luY2x1ZGUgImR2Yl9kZW11eC5oIgotI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgotI2luY2x1ZGUgImRteGRldi5oIgotCi0jZGVmaW5lIFRNNjAwMF9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCi0KLS8qIElucHV0cyAqLwotZW51bSB0bTYwMDBfaXR5cGUgewotCVRNNjAwMF9JTlBVVF9UVgk9IDEsCi0JVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCi0JVE02MDAwX0lOUFVUX0NPTVBPU0lURTIsCi0JVE02MDAwX0lOUFVUX1NWSURFTywKLQlUTTYwMDBfSU5QVVRfRFZCLAotCVRNNjAwMF9JTlBVVF9SQURJTywKLX07Ci0KLWVudW0gdG02MDAwX211eCB7Ci0JVE02MDAwX1ZNVVhfVklERU9fQSA9IDEsCi0JVE02MDAwX1ZNVVhfVklERU9fQiwKLQlUTTYwMDBfVk1VWF9WSURFT19BQiwKLQlUTTYwMDBfQU1VWF9BREMxLAotCVRNNjAwMF9BTVVYX0FEQzIsCi0JVE02MDAwX0FNVVhfU0lGMSwKLQlUTTYwMDBfQU1VWF9TSUYyLAotCVRNNjAwMF9BTVVYX0kyUywKLX07Ci0KLWVudW0gdG02MDAwX2RldnR5cGUgewotCVRNNjAwMCA9IDAsCi0JVE01NjAwLAotCVRNNjAxMCwKLX07Ci0KLXN0cnVjdCB0bTYwMDBfaW5wdXQgewotCWVudW0gdG02MDAwX2l0eXBlCXR5cGU7Ci0JZW51bSB0bTYwMDBfbXV4CQl2bXV4OwotCWVudW0gdG02MDAwX211eAkJYW11eDsKLQl1bnNpZ25lZCBpbnQJCXZfZ3BpbzsKLQl1bnNpZ25lZCBpbnQJCWFfZ3BpbzsKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoJQmFzaWMgc3RydWN0dXJlcwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotc3RydWN0IHRtNjAwMF9mbXQgewotCWNoYXIgICpuYW1lOwotCXUzMiAgIGZvdXJjYzsgICAgICAgICAgLyogdjRsMiBmb3JtYXQgaWQgKi8KLQlpbnQgICBkZXB0aDsKLX07Ci0KLS8qIGJ1ZmZlciBmb3Igb25lIHZpZGVvIGZyYW1lICovCi1zdHJ1Y3QgdG02MDAwX2J1ZmZlciB7Ci0JLyogY29tbW9uIHY0bCBidWZmZXIgc3R1ZmYgLS0gbXVzdCBiZSBmaXJzdCAqLwotCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgdmI7Ci0KLQlzdHJ1Y3QgdG02MDAwX2ZtdCAgICAgICpmbXQ7Ci19OwotCi1zdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIGFjdGl2ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIHF1ZXVlZDsKLQotCS8qIHRocmVhZCBmb3IgZ2VuZXJhdGluZyB2aWRlbyBzdHJlYW0qLwotCXN0cnVjdCB0YXNrX3N0cnVjdCAgICAgICAgICprdGhyZWFkOwotCXdhaXRfcXVldWVfaGVhZF90ICAgICAgICAgIHdxOwotCS8qIENvdW50ZXJzIHRvIGNvbnRyb2wgZnBzIHJhdGUgKi8KLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICBpbmlfamlmZmllczsKLX07Ci0KLS8qIGRldmljZSBzdGF0ZXMgKi8KLWVudW0gdG02MDAwX2NvcmVfc3RhdGUgewotCURFVl9JTklUSUFMSVpFRCAgID0gMHgwMSwKLQlERVZfRElTQ09OTkVDVEVEICA9IDB4MDIsCi0JREVWX01JU0NPTkZJR1VSRUQgPSAweDA0LAotfTsKLQotLyogaW8gbWV0aG9kcyAqLwotZW51bSB0bTYwMDBfaW9fbWV0aG9kIHsKLQlJT19OT05FLAotCUlPX1JFQUQsCi0JSU9fTU1BUCwKLX07Ci0KLWVudW0gdG02MDAwX21vZGUgewotCVRNNjAwMF9NT0RFX1VOS05PV04gPSAwLAotCVRNNjAwMF9NT0RFX0FOQUxPRywKLQlUTTYwMDBfTU9ERV9ESUdJVEFMLAotfTsKLQotc3RydWN0IHRtNjAwMF9ncGlvIHsKLQlpbnQJCXR1bmVyX3Jlc2V0OwotCWludAkJdHVuZXJfb247Ci0JaW50CQlkZW1vZF9yZXNldDsKLQlpbnQJCWRlbW9kX29uOwotCWludAkJcG93ZXJfbGVkOwotCWludAkJZHZiX2xlZDsKLQlpbnQJCWlyOwotfTsKLQotc3RydWN0IHRtNjAwMF9jYXBhYmlsaXRpZXMgewotCXVuc2lnbmVkIGludCAgICBoYXNfdHVuZXI6MTsKLQl1bnNpZ25lZCBpbnQgICAgaGFzX3RkYTk4NzQ6MTsKLQl1bnNpZ25lZCBpbnQgICAgaGFzX2R2YjoxOwotCXVuc2lnbmVkIGludCAgICBoYXNfemwxMDM1MzoxOwotCXVuc2lnbmVkIGludCAgICBoYXNfZWVwcm9tOjE7Ci0JdW5zaWduZWQgaW50ICAgIGhhc19yZW1vdGU6MTsKLQl1bnNpZ25lZCBpbnQgICAgaGFzX3JhZGlvOjE7Ci19OwotCi1zdHJ1Y3QgdG02MDAwX2R2YiB7Ci0Jc3RydWN0IGR2Yl9hZGFwdGVyCWFkYXB0ZXI7Ci0Jc3RydWN0IGR2Yl9kZW11eAlkZW11eDsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kCSpmcm9udGVuZDsKLQlzdHJ1Y3QgZG14ZGV2CQlkbXhkZXY7Ci0JdW5zaWduZWQgaW50CQlzdHJlYW1zOwotCXN0cnVjdCB1cmIJCSpidWxrX3VyYjsKLQlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwotfTsKLQotc3RydWN0IHNuZF90bTYwMDBfY2FyZCB7Ci0Jc3RydWN0IHNuZF9jYXJkCQkJKmNhcmQ7Ci0Jc3BpbmxvY2tfdAkJCXJlZ19sb2NrOwotCXN0cnVjdCB0bTYwMDBfY29yZQkJKmNvcmU7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtCSpzdWJzdHJlYW07Ci0KLQkvKiB0ZW1wb3JhcnkgZGF0YSBmb3IgYnVmZmVyIGZpbGwgcHJvY2Vzc2luZyAqLwotCXVuc2lnbmVkCQkJYnVmX3BvczsKLQl1bnNpZ25lZAkJCXBlcmlvZF9wb3M7Ci19OwotCi1zdHJ1Y3QgdG02MDAwX2VuZHBvaW50IHsKLQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQJKmVuZHA7Ci0JX191OAkJCQliSW50ZXJmYWNlTnVtYmVyOwotCV9fdTgJCQkJYkFsdGVybmF0ZVNldHRpbmc7Ci0JdW5zaWduZWQJCQltYXhzaXplOwotfTsKLQotc3RydWN0IHRtNjAwMF9jb3JlIHsKLQkvKiBnZW5lcmljIGRldmljZSBwcm9wZXJ0aWVzICovCi0JY2hhcgkJCQluYW1lWzMwXTsJLyogbmFtZSAoaW5jbHVkaW5nIG1pbm9yKSBvZiB0aGUgZGV2aWNlICovCi0JaW50CQkJCW1vZGVsOwkJLyogaW5kZXggaW4gdGhlIGRldmljZV9kYXRhIHN0cnVjdCAqLwotCWludAkJCQlkZXZubzsJCS8qIG1hcmtzIHRoZSBudW1iZXIgb2YgdGhpcyBkZXZpY2UgKi8KLQllbnVtIHRtNjAwMF9kZXZ0eXBlCQlkZXZfdHlwZTsJLyogdHlwZSBvZiBkZXZpY2UgKi8KLQl1bnNpZ25lZCBjaGFyCQkJZWVkYXRhWzI1Nl07CS8qIEVlcHJvbSBkYXRhICovCi0JdW5zaWduZWQJCQllZWRhdGFfc2l6ZTsJLyogU2l6ZSBvZiB0aGUgZWVwcm9tIGluZm8gKi8KLQotCXY0bDJfc3RkX2lkICAgICAgICAgICAgICAgICAgICAgbm9ybTsgICAgICAgICAgIC8qIEN1cnJlbnQgbm9ybSAqLwotCWludAkJCQl3aWR0aCwgaGVpZ2h0OwkvKiBTZWxlY3RlZCByZXNvbHV0aW9uICovCi0KLQllbnVtIHRtNjAwMF9jb3JlX3N0YXRlCQlzdGF0ZTsKLQotCS8qIERldmljZSBDYXBhYmlsaXRpZXMqLwotCXN0cnVjdCB0bTYwMDBfY2FwYWJpbGl0aWVzCWNhcHM7Ci0KLQkvKiBUdW5lciBjb25maWd1cmF0aW9uICovCi0JaW50CQkJCXR1bmVyX3R5cGU7CQkvKiB0eXBlIG9mIHRoZSB0dW5lciAqLwotCWludAkJCQl0dW5lcl9hZGRyOwkJLyogdHVuZXIgYWRkcmVzcyAqLwotCi0Jc3RydWN0IHRtNjAwMF9ncGlvCQlncGlvOwotCi0JY2hhcgkJCQkqaXJfY29kZXM7Ci0KLQlfX3U4CQkJCXJhZGlvOwotCi0JLyogRGVtb2R1bGF0b3IgY29uZmlndXJhdGlvbiAqLwotCWludAkJCQlkZW1vZF9hZGRyOwkvKiBkZW1vZHVsYXRvciBhZGRyZXNzICovCi0KLQlpbnQJCQkJYXVkaW9fYml0cmF0ZTsKLQkvKiBpMmMgaS9vICovCi0Jc3RydWN0IGkyY19hZGFwdGVyCQlpMmNfYWRhcDsKLQlzdHJ1Y3QgaTJjX2NsaWVudAkJaTJjX2NsaWVudDsKLQotCi0JLyogZXh0ZW5zaW9uICovCi0Jc3RydWN0IGxpc3RfaGVhZAkJZGV2bGlzdDsKLQotCS8qIHZpZGVvIGZvciBsaW51eCAqLwotCWludAkJCQl1c2VyczsKLQotCS8qIHZhcmlvdXMgZGV2aWNlIGluZm8gKi8KLQlzdHJ1Y3QgdG02MDAwX2ZoCQkqcmVzb3VyY2VzOwkvKiBQb2ludHMgdG8gZmggdGhhdCBpcyBzdHJlYW1pbmcgKi8KLQlib29sCQkJCWlzX3Jlc19yZWFkOwotCi0Jc3RydWN0IHZpZGVvX2RldmljZQkJKnZmZDsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlCQkqcmFkaW9fZGV2OwotCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUJCXZpZHE7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlCQl2NGwyX2RldjsKLQotCWludAkJCQlpbnB1dDsKLQlzdHJ1Y3QgdG02MDAwX2lucHV0CQl2aW5wdXRbM107CS8qIHZpZGVvIGlucHV0ICovCi0Jc3RydWN0IHRtNjAwMF9pbnB1dAkJcmlucHV0OwkJLyogcmFkaW8gaW5wdXQgKi8KLQotCWludAkJCQlmcmVxOwotCXVuc2lnbmVkIGludAkJCWZvdXJjYzsKLQotCWVudW0gdG02MDAwX21vZGUJCW1vZGU7Ci0KLQlpbnQJCQkJY3RsX211dGU7ICAgICAgICAgICAgIC8qIGF1ZGlvICovCi0JaW50CQkJCWN0bF92b2x1bWU7Ci0JaW50CQkJCWFtb2RlOwotCi0JLyogRFZCLVQgc3VwcG9ydCAqLwotCXN0cnVjdCB0bTYwMDBfZHZiCQkqZHZiOwotCi0JLyogYXVkaW8gc3VwcG9ydCAqLwotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQJCSphZGV2OwotCXN0cnVjdCB3b3JrX3N0cnVjdAkJd3FfdHJpZ2dlcjsgICAvKiBUcmlnZ2VyIHRvIHN0YXJ0L3N0b3AgYXVkaW8gZm9yIGFsc2EgbW9kdWxlICovCi0JYXRvbWljX3QJCQlzdHJlYW1fc3RhcnRlZDsgIC8qIHN0cmVhbSBzaG91bGQgYmUgcnVubmluZyBpZiB0cnVlICovCi0KLQlzdHJ1Y3QgdG02MDAwX0lSCQkqaXI7Ci0KLQkvKiBsb2NrcyAqLwotCXN0cnVjdCBtdXRleAkJCWxvY2s7Ci0KLQkvKiB1c2IgdHJhbnNmZXIgKi8KLQlzdHJ1Y3QgdXNiX2RldmljZQkJKnVkZXY7CQkvKiB0aGUgdXNiIGRldmljZSAqLwotCi0Jc3RydWN0IHRtNjAwMF9lbmRwb2ludAkJYnVsa19pbiwgYnVsa19vdXQsIGlzb2NfaW4sIGlzb2Nfb3V0OwotCXN0cnVjdCB0bTYwMDBfZW5kcG9pbnQJCWludF9pbiwgaW50X291dDsKLQotCS8qIHNjYWxlciE9MCBpZiBzY2FsZXIgaXMgYWN0aXZlKi8KLQlpbnQJCQkJc2NhbGVyOwotCi0JCS8qIElzb2MgY29udHJvbCBzdHJ1Y3QgKi8KLQlzdHJ1Y3QgdXNiX2lzb2NfY3RsICAgICAgICAgIGlzb2NfY3RsOwotCi0Jc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgICBzbG9jazsKLX07Ci0KLWVudW0gdG02MDAwX29wc190eXBlIHsKLQlUTTYwMDBfQVVESU8gPSAweDEwLAotCVRNNjAwMF9EVkIgPSAweDIwLAotfTsKLQotc3RydWN0IHRtNjAwMF9vcHMgewotCXN0cnVjdCBsaXN0X2hlYWQJbmV4dDsKLQljaGFyCQkJKm5hbWU7Ci0JZW51bSB0bTYwMDBfb3BzX3R5cGUJdHlwZTsKLQlpbnQgKCppbml0KShzdHJ1Y3QgdG02MDAwX2NvcmUgKik7Ci0JaW50ICgqZmluaSkoc3RydWN0IHRtNjAwMF9jb3JlICopOwotCWludCAoKmZpbGxidWYpKHN0cnVjdCB0bTYwMDBfY29yZSAqLCBjaGFyICpidWYsIGludCBzaXplKTsKLX07Ci0KLXN0cnVjdCB0bTYwMDBfZmggewotCXN0cnVjdCB0bTYwMDBfY29yZSAgICAgICAgICAgKmRldjsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgIHJhZGlvOwotCi0JLyogdmlkZW8gY2FwdHVyZSAqLwotCXN0cnVjdCB0bTYwMDBfZm10ICAgICAgICAgICAgKmZtdDsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQ7Ci0Jc3RydWN0IHZpZGVvYnVmX3F1ZXVlICAgICAgICB2Yl92aWRxOwotCi0JZW51bSB2NGwyX2J1Zl90eXBlICAgICAgICAgICB0eXBlOwotfTsKLQotI2RlZmluZSBUTTYwMDBfU1RECShWNEwyX1NURF9QQUx8VjRMMl9TVERfUEFMX058VjRMMl9TVERfUEFMX05jfCAgICBcCi0JCQlWNEwyX1NURF9QQUxfTXxWNEwyX1NURF9QQUxfNjB8VjRMMl9TVERfTlRTQ19NfCBcCi0JCQlWNEwyX1NURF9OVFNDX01fSlB8VjRMMl9TVERfU0VDQU0pCi0KLS8qIEluIHRtNjAwMC1jYXJkcy5jICovCi0KLWludCB0bTYwMDBfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7Ci1pbnQgdG02MDAwX3hjNTAwMF9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKTsKLWludCB0bTYwMDBfY2FyZHNfc2V0dXAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotdm9pZCB0bTYwMDBfZmxhc2hfbGVkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCBzdGF0ZSk7Ci0KLS8qIEluIHRtNjAwMC1jb3JlLmMgKi8KLQotaW50IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxdHlwZSwgdTggcmVxLAotCQkJICAgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpidWYsIHUxNiBsZW4pOwotaW50IHRtNjAwMF9nZXRfcmVnKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKLWludCB0bTYwMDBfZ2V0X3JlZzE2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKLWludCB0bTYwMDBfZ2V0X3JlZzMyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKLWludCB0bTYwMDBfc2V0X3JlZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCk7Ci1pbnQgdG02MDAwX3NldF9yZWdfbWFzayhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsCi0JCQkJCQl1MTYgaW5kZXgsIHUxNiBtYXNrKTsKLWludCB0bTYwMDBfaTJjX3Jlc2V0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1MTYgdHNsZWVwKTsKLWludCB0bTYwMDBfaW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci0KLWludCB0bTYwMDBfaW5pdF9hbmFsb2dfbW9kZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX2luaXRfZGlnaXRhbF9tb2RlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKLWludCB0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCBiaXRyYXRlKTsKLWludCB0bTYwMDBfc2V0X2F1ZGlvX3JpbnB1dChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX3R2YXVkaW9fc2V0X211dGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IG11dGUpOwotdm9pZCB0bTYwMDBfc2V0X3ZvbHVtZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IHZvbCk7Ci0KLWludCB0bTYwMDBfdjRsMl9yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX3Y0bDJfdW5yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX3Y0bDJfZXhpdCh2b2lkKTsKLXZvaWQgdG02MDAwX3NldF9mb3VyY2NfZm9ybWF0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKLQotdm9pZCB0bTYwMDBfcmVtb3ZlX2Zyb21fZGV2bGlzdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci12b2lkIHRtNjAwMF9hZGRfaW50b19kZXZsaXN0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKLWludCB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpOwotdm9pZCB0bTYwMDBfdW5yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IHRtNjAwMF9vcHMgKm9wcyk7Ci12b2lkIHRtNjAwMF9pbml0X2V4dGVuc2lvbihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci12b2lkIHRtNjAwMF9jbG9zZV9leHRlbnNpb24oc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotaW50IHRtNjAwMF9jYWxsX2ZpbGxidWYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGVudW0gdG02MDAwX29wc190eXBlIHR5cGUsCi0JCQljaGFyICpidWYsIGludCBzaXplKTsKLQotCi0vKiBJbiB0bTYwMDAtc3Rkcy5jICovCi12b2lkIHRtNjAwMF9nZXRfc3RkX3JlcyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX3NldF9zdGFuZGFyZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci0KLS8qIEluIHRtNjAwMC1pMmMuYyAqLwotaW50IHRtNjAwMF9pMmNfcmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotaW50IHRtNjAwMF9pMmNfdW5yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci0KLS8qIEluIHRtNjAwMC1xdWV1ZS5jICovCi0KLWludCB0bTYwMDBfdjRsMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci0KLWludCB0bTYwMDBfdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgZW51bSB2NGwyX2J1Zl90eXBlIGkpOwotaW50IHRtNjAwMF92aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgIGVudW0gdjRsMl9idWZfdHlwZSBpKTsKLWludCB0bTYwMDBfdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYik7Ci1pbnQgdG02MDAwX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7Ci1pbnQgdG02MDAwX3ZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpOwotaW50IHRtNjAwMF92aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7Ci1zc2l6ZV90IHRtNjAwMF92NGwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsCi0JCQkgbG9mZl90ICpmX3Bvcyk7Ci11bnNpZ25lZCBpbnQgdG02MDAwX3Y0bDJfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7Ci1pbnQgdG02MDAwX3F1ZXVlX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotCi0vKiBJbiB0bTYwMDAtYWxzYS5jICovCi0vKmludCB0bTYwMDBfYXVkaW9faW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IGlkeCk7Ki8KLQotLyogSW4gdG02MDAwLWlucHV0LmMgKi8KLWludCB0bTYwMDBfaXJfaW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX2lyX2Zpbmkoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotdm9pZCB0bTYwMDBfaXJfd2FpdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggc3RhdGUpOwotaW50IHRtNjAwMF9pcl9pbnRfc3RhcnQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotdm9pZCB0bTYwMDBfaXJfaW50X3N0b3Aoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotCi0vKiBEZWJ1ZyBzdHVmZiAqLwotCi1leHRlcm4gaW50IHRtNjAwMF9kZWJ1ZzsKLQotI2RlZmluZSBkcHJpbnRrKGRldiwgbGV2ZWwsIGZtdCwgYXJnLi4uKSBkbyB7XAotCWlmICh0bTYwMDBfZGVidWcgJiBsZXZlbCkgXAotCQlwcmludGsoS0VSTl9JTkZPICIoJWx1KSAlcyAlcyA6ImZtdCwgamlmZmllcywgXAotCQkJIGRldi0+bmFtZSwgX19GVU5DVElPTl9fICwgIyNhcmcpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFY0TDJfREVCVUdfUkVHCQkweDAwMDQKLSNkZWZpbmUgVjRMMl9ERUJVR19JMkMJCTB4MDAwOAotI2RlZmluZSBWNEwyX0RFQlVHX1FVRVVFCTB4MDAxMAotI2RlZmluZSBWNEwyX0RFQlVHX0lTT0MJCTB4MDAyMAotI2RlZmluZSBWNEwyX0RFQlVHX1JFU19MT0NLCTB4MDA0MAkvKiBSZXNvdXJjZSBsb2NraW5nICovCi0jZGVmaW5lIFY0TDJfREVCVUdfT1BFTgkJMHgwMDgwCS8qIHZpZGVvIG9wZW4vY2xvc2UgZGVidWcgKi8KLQotI2RlZmluZSB0bTYwMDBfZXJyKGZtdCwgYXJnLi4uKSBkbyB7XAotCXByaW50ayhLRVJOX0VSUiAidG02MDAwICVzIDoiZm10LCBcCi0JCV9fRlVOQ1RJT05fXyAsICMjYXJnKTsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uYwppbmRleCBmNGI1M2QxLi4zYjdhODQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2V2ZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfZXZlbnQuYwppbmRleCBlY2QxODYyLi5kMzMyYTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfZXZlbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfZXZlbnQuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKaW5kZXggYTJlOGJkNC4uZjk1OGViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJtZHNfZi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmMKaW5kZXggMzIxNTgwMi4uMmZhZWUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5jCkBAIC04Miw2ICs4Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwppbmRleCAzNmRiMjMxLi4yNzdlNDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwpAQCAtMTMwMCwyNyArMTMwMCwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IFhHSWZiX3Bhbl92YXIoc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8sCi0JCQkgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCitzdGF0aWMgaW50IFhHSWZiX3Bhbl92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogeworCXN0cnVjdCB4Z2lmYl92aWRlb19pbmZvICp4Z2lmYl9pbmZvID0gaW5mby0+cGFyOwogCXVuc2lnbmVkIGludCBiYXNlOwogCiAJLyogcHJpbnRrKCJJbnNpZGUgcGFuX3ZhciIpOyAqLwogCi0JaWYgKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpIHsKLQkJLyogcHJpbnRrKCJQYW46IHhvOiAlZCB4diAlZCB4ciAlZFxuIiwKLQkJCXZhci0+eG9mZnNldCwgdmFyLT54cmVzX3ZpcnR1YWwsIHZhci0+eHJlcyk7ICovCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAodmFyLT55b2Zmc2V0ID4gKHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzKSkgewotCQkvKiBwcmludGsoIlBhbjogeW86ICVkIHl2ICVkIHlyICVkXG4iLAotCQkJdmFyLT55b2Zmc2V0LCB2YXItPnlyZXNfdmlydHVhbCwgdmFyLT55cmVzKTsgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWJhc2UgPSB2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCArIHZhci0+eG9mZnNldDsKKwliYXNlID0gdmFyLT55b2Zmc2V0ICogaW5mby0+dmFyLnhyZXNfdmlydHVhbCArIHZhci0+eG9mZnNldDsKIAogCS8qIGNhbGN1bGF0ZSBiYXNlIGJwcCBkZXAuICovCi0Jc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDE2OgogCQliYXNlID4+PSAxOwogCQlicmVhazsKQEAgLTE2MTUsMTMgKzE2MDUsMTIgQEAKIAkJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgeGdpZmJfdmlkZW9faW5mbyAqeGdpZmJfaW5mbyA9IGluZm8tPnBhcjsKIAogCS8qIHByaW50aygiXG5JbnNpZGUgcGFuX2Rpc3BsYXk6XG4iKTsgKi8KIAotCWlmICh2YXItPnhvZmZzZXQgPiAodmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXMpKQorCWlmICh2YXItPnhvZmZzZXQgPiAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCAtIGluZm8tPnZhci54cmVzKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHZhci0+eW9mZnNldCA+ICh2YXItPnlyZXNfdmlydHVhbCAtIHZhci0+eXJlcykpCisJaWYgKHZhci0+eW9mZnNldCA+IChpbmZvLT52YXIueXJlc192aXJ0dWFsIC0gaW5mby0+dmFyLnlyZXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApIHsKQEAgLTE2MzQsNyArMTYyMyw3IEBACiAJCQkJCQk+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZXJyID0gWEdJZmJfcGFuX3Zhcih4Z2lmYl9pbmZvLCB2YXIpOworCWVyciA9IFhHSWZiX3Bhbl92YXIodmFyLCBpbmZvKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmMKaW5kZXggYjk5MjZlZS4uMDlkZTk5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5jCkBAIC01NTYsNyArNTU2LDcgQEAKIC8qCiAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciBhbGwgenJhbSBJL08gcmVxdWVzdHMuCiAgKi8KLXN0YXRpYyBpbnQgenJhbV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCB6cmFtX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWUsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgenJhbSAqenJhbSA9IHF1ZXVlLT5xdWV1ZWRhdGE7CiAKQEAgLTU3NSwxMyArNTc1LDEyIEBACiAJX196cmFtX21ha2VfcmVxdWVzdCh6cmFtLCBiaW8sIGJpb19kYXRhX2RpcihiaW8pKTsKIAl1cF9yZWFkKCZ6cmFtLT5pbml0X2xvY2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogCiBlcnJvcl91bmxvY2s6CiAJdXBfcmVhZCgmenJhbS0+aW5pdF9sb2NrKTsKIGVycm9yOgogCWJpb19pb19lcnJvcihiaW8pOwotCXJldHVybiAwOwogfQogCiB2b2lkIF9fenJhbV9yZXNldF9kZXZpY2Uoc3RydWN0IHpyYW0gKnpyYW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCmluZGV4IDRkMDE3NjguLjBmZDk2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfcHJvdG8uaD4KQEAgLTEwNzksNyArMTA4MCw5IEBACiAJICovCiAJaWYgKCFjbWQtPmltbWVkaWF0ZV9kYXRhKSB7CiAJCWNtZHNuX3JldCA9IGlzY3NpdF9zZXF1ZW5jZV9jbWQoY29ubiwgY21kLCBoZHItPmNtZHNuKTsKLQkJaWYgKGNtZHNuX3JldCA9PSBDTURTTl9FUlJPUl9DQU5OT1RfUkVDT1ZFUikKKwkJaWYgKGNtZHNuX3JldCA9PSBDTURTTl9MT1dFUl9USEFOX0VYUCkKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChjbWRzbl9yZXQgPT0gQ01EU05fRVJST1JfQ0FOTk9UX1JFQ09WRVIpCiAJCQlyZXR1cm4gaXNjc2l0X2FkZF9yZWplY3RfZnJvbV9jbWQoCiAJCQkJSVNDU0lfUkVBU09OX1BST1RPQ09MX0VSUk9SLAogCQkJCTEsIDAsIGJ1ZiwgY21kKTsKQEAgLTE4MTksMTcgKzE4MjIsMTYgQEAKIAkJaW50IGNtZHNuX3JldCA9IGlzY3NpdF9zZXF1ZW5jZV9jbWQoY29ubiwgY21kLCBoZHItPmNtZHNuKTsKIAkJaWYgKGNtZHNuX3JldCA9PSBDTURTTl9ISUdIRVJfVEhBTl9FWFApCiAJCQlvdXRfb2Zfb3JkZXJfY21kc24gPSAxOwotCQllbHNlIGlmIChjbWRzbl9yZXQgPT0gQ01EU05fTE9XRVJfVEhBTl9FWFApIHsKKwkJZWxzZSBpZiAoY21kc25fcmV0ID09IENNRFNOX0xPV0VSX1RIQU5fRVhQKQogCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7IC8qIChjbWRzbl9yZXQgPT0gQ01EU05fRVJST1JfQ0FOTk9UX1JFQ09WRVIpICovCisJCWVsc2UgaWYgKGNtZHNuX3JldCA9PSBDTURTTl9FUlJPUl9DQU5OT1RfUkVDT1ZFUikKIAkJCXJldHVybiBpc2NzaXRfYWRkX3JlamVjdF9mcm9tX2NtZCgKIAkJCQkJSVNDU0lfUkVBU09OX1BST1RPQ09MX0VSUk9SLAogCQkJCQkxLCAwLCBidWYsIGNtZCk7Ci0JCX0KIAl9CiAJaXNjc2l0X2Fja19mcm9tX2V4cHN0YXRzbihjb25uLCBoZHItPmV4cF9zdGF0c24pOwogCi0JaWYgKG91dF9vZl9vcmRlcl9jbWRzbikKKwlpZiAob3V0X29mX29yZGVyX2NtZHNuIHx8ICEoaGRyLT5vcGNvZGUgJiBJU0NTSV9PUF9JTU1FRElBVEUpKQogCQlyZXR1cm4gMDsKIAkvKgogCSAqIEZvdW5kIHRoZSByZWZlcmVuY2VkIHRhc2ssIHNlbmQgdG8gdHJhbnNwb3J0IGZvciBwcm9jZXNzaW5nLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2NvbmZpZ2ZzLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYwppbmRleCBmMTY0M2RiLi5kYjMyNzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYwpAQCAtMjAsNiArMjAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9iYXNlLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfb3BzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfc3RhdC5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3N0YXQuYwppbmRleCBiYmRiZTkzLi5mMWRiODMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfc3RhdC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9zdGF0LmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfcHJvdG8uaD4KICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oPgogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMgYi9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCmluZGV4IGIxNWQ4Y2IuLjNkZjFjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMKKysrIGIvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuYwpAQCAtMTc0LDYgKzE3NCwyNCBAQAogCQlzZ2xfYmlkaSA9IHNkYi0+dGFibGUuc2dsOwogCQlzZ2xfYmlkaV9jb3VudCA9IHNkYi0+dGFibGUubmVudHM7CiAJfQorCS8qCisJICogQmVjYXVzZSBzb21lIHVzZXJzcGFjZSBjb2RlIHZpYSBzY3NpLWdlbmVyaWMgZG8gbm90IG1lbXNldCB0aGVpcgorCSAqIGFzc29jaWF0ZWQgcmVhZCBidWZmZXJzLCBnbyBhaGVhZCBhbmQgZG8gdGhhdCBoZXJlIGZvciB0eXBlCisJICogU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIuICBBbHNvIG5vdGUgdGhhdCB0aGlzIGlzIGN1cnJlbnRseQorCSAqIGd1YXJhbnRlZWQgdG8gYmUgYSBzaW5nbGUgU0dMIGZvciBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQgorCSAqIGJ5IHRhcmdldCBjb3JlIGluIHRyYW5zcG9ydF9nZW5lcmljX2FsbG9jYXRlX3Rhc2tzKCkgLT4KKwkgKiB0cmFuc3BvcnRfZ2VuZXJpY19jbWRfc2VxdWVuY2VyKCkuCisJICovCisJaWYgKHNlX2NtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIgJiYKKwkgICAgc2VfY21kLT5kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNjc2lfc2dsaXN0KHNjKTsKKwkJdW5zaWduZWQgY2hhciAqYnVmID0ga21hcChzZ19wYWdlKHNnKSkgKyBzZy0+b2Zmc2V0OworCisJCWlmIChidWYgIT0gTlVMTCkgeworCQkJbWVtc2V0KGJ1ZiwgMCwgc2ctPmxlbmd0aCk7CisJCQlrdW5tYXAoc2dfcGFnZShzZykpOworCQl9CisJfQogCiAJLyogVGVsbCB0aGUgY29yZSBhYm91dCBvdXIgcHJlYWxsb2NhdGVkIG1lbW9yeSAqLwogCXJldCA9IHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kKHNlX2NtZCwgc2NzaV9zZ2xpc3Qoc2MpLApAQCAtMTg3LDcgKzIwNSw3IEBACiAvKgogICogQ2FsbGVkIGZyb20gc3RydWN0IHRhcmdldF9jb3JlX2ZhYnJpY19vcHMtPmNoZWNrX3N0b3BfZnJlZSgpCiAgKi8KLXN0YXRpYyB2b2lkIHRjbV9sb29wX2NoZWNrX3N0b3BfZnJlZShzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCitzdGF0aWMgaW50IHRjbV9sb29wX2NoZWNrX3N0b3BfZnJlZShzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCiB7CiAJLyoKIAkgKiBEbyBub3QgcmVsZWFzZSBzdHJ1Y3Qgc2VfY21kJ3MgY29udGFpbmluZyBhIHZhbGlkIFRNUgpAQCAtMTk1LDEyICsyMTMsMTMgQEAKIAkgKiB3aXRoIHRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKCkuCiAJICovCiAJaWYgKHNlX2NtZC0+c2VfdG1yX3JlcSkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAkvKgogCSAqIFJlbGVhc2UgdGhlIHN0cnVjdCBzZV9jbWQsIHdoaWNoIHdpbGwgbWFrZSBhIGNhbGxiYWNrIHRvIHJlbGVhc2UKIAkgKiBzdHJ1Y3QgdGNtX2xvb3BfY21kICogaW4gdGNtX2xvb3BfZGVhbGxvY2F0ZV9jb3JlX2NtZCgpCiAJICovCiAJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoc2VfY21kLCAwKTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgdGNtX2xvb3BfcmVsZWFzZV9jbWQoc3RydWN0IHNlX2NtZCAqc2VfY21kKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5jCmluZGV4IDhmNDQ0NzcuLjg4ZjJhZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9hbHVhLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKQEAgLTU4LDggKzU5LDkgQEAKICAqCiAgKiBTZWUgc3BjNHIxNyBzZWN0aW9uIDYuMjcKICAqLwotaW50IGNvcmVfZW11bGF0ZV9yZXBvcnRfdGFyZ2V0X3BvcnRfZ3JvdXBzKHN0cnVjdCBzZV9jbWQgKmNtZCkKK2ludCB0YXJnZXRfZW11bGF0ZV9yZXBvcnRfdGFyZ2V0X3BvcnRfZ3JvdXBzKHN0cnVjdCBzZV90YXNrICp0YXNrKQogeworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBjbWQtPnNlX2Rldi0+c2Vfc3ViX2RldjsKIAlzdHJ1Y3Qgc2VfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwOwpAQCAtMTY0LDYgKzE2Niw4IEBACiAKIAl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwogCisJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3Miw4ICsxNzYsOSBAQAogICoKICAqIFNlZSBzcGM0cjE3IHNlY3Rpb24gNi4zNQogICovCi1pbnQgY29yZV9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHMoc3RydWN0IHNlX2NtZCAqY21kKQoraW50IHRhcmdldF9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHMoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiA9IGRldi0+c2Vfc3ViX2RldjsKIAlzdHJ1Y3Qgc2VfcG9ydCAqcG9ydCwgKmxfcG9ydCA9IGNtZC0+c2VfbHVuLT5sdW5fc2VwOwpAQCAtMzQxLDcgKzM0Niw4IEBACiAKIG91dDoKIAl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwotCisJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuaCBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuaAppbmRleCBjODZmOTdhLi5jNWI0ZWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9hbHVhLmgKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5oCkBAIC02Niw4ICs2Niw4IEBACiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnQxMF9hbHVhX3RnX3B0X2dwX2NhY2hlOwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICp0MTBfYWx1YV90Z19wdF9ncF9tZW1fY2FjaGU7CiAKLWV4dGVybiBpbnQgY29yZV9lbXVsYXRlX3JlcG9ydF90YXJnZXRfcG9ydF9ncm91cHMoc3RydWN0IHNlX2NtZCAqKTsKLWV4dGVybiBpbnQgY29yZV9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHMoc3RydWN0IHNlX2NtZCAqKTsKK2V4dGVybiBpbnQgdGFyZ2V0X2VtdWxhdGVfcmVwb3J0X3RhcmdldF9wb3J0X2dyb3VwcyhzdHJ1Y3Qgc2VfdGFzayAqKTsKK2V4dGVybiBpbnQgdGFyZ2V0X2VtdWxhdGVfc2V0X3RhcmdldF9wb3J0X2dyb3VwcyhzdHJ1Y3Qgc2VfdGFzayAqKTsKIGV4dGVybiBpbnQgY29yZV9hbHVhX2NoZWNrX25vbm9wX2RlbGF5KHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gaW50IGNvcmVfYWx1YV9kb19wb3J0X3RyYW5zaXRpb24oc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwICosCiAJCQkJc3RydWN0IHNlX2RldmljZSAqLCBzdHJ1Y3Qgc2VfcG9ydCAqLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY2RiLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jZGIuYwppbmRleCAzODUzNWViMS4uNjgzYmEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY2RiLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY2RiLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19vcHMuaD4KICNpbmNsdWRlICJ0YXJnZXRfY29yZV91YS5oIgorI2luY2x1ZGUgInRhcmdldF9jb3JlX2NkYi5oIgogCiBzdGF0aWMgdm9pZAogdGFyZ2V0X2ZpbGxfYWx1YV9kYXRhKHN0cnVjdCBzZV9wb3J0ICpwb3J0LCB1bnNpZ25lZCBjaGFyICpidWYpCkBAIC02NzksMTYgKzY4MCwxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci10YXJnZXRfZW11bGF0ZV9pbnF1aXJ5KHN0cnVjdCBzZV9jbWQgKmNtZCkKK2ludCB0YXJnZXRfZW11bGF0ZV9pbnF1aXJ5KHN0cnVjdCBzZV90YXNrICp0YXNrKQogeworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBjaGFyICpjZGIgPSBjbWQtPnRfdGFza19jZGI7CiAJaW50IHAsIHJldDsKIAotCWlmICghKGNkYlsxXSAmIDB4MSkpCi0JCXJldHVybiB0YXJnZXRfZW11bGF0ZV9pbnF1aXJ5X3N0ZChjbWQpOworCWlmICghKGNkYlsxXSAmIDB4MSkpIHsKKwkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfaW5xdWlyeV9zdGQoY21kKTsKKwkJZ290byBvdXQ7CisJfQogCiAJLyoKIAkgKiBNYWtlIHN1cmUgd2UgYXQgbGVhc3QgaGF2ZSA0IGJ5dGVzIG9mIElOUVVJUlkgcmVzcG9uc2UKQEAgLTcwNywyMiArNzEwLDMwIEBACiAKIAlidWZbMF0gPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldik7CiAKLQlmb3IgKHAgPSAwOyBwIDwgQVJSQVlfU0laRShldnBkX2hhbmRsZXJzKTsgKytwKQorCWZvciAocCA9IDA7IHAgPCBBUlJBWV9TSVpFKGV2cGRfaGFuZGxlcnMpOyArK3ApIHsKIAkJaWYgKGNkYlsyXSA9PSBldnBkX2hhbmRsZXJzW3BdLnBhZ2UpIHsKIAkJCWJ1ZlsxXSA9IGNkYlsyXTsKIAkJCXJldCA9IGV2cGRfaGFuZGxlcnNbcF0uZW11bGF0ZShjbWQsIGJ1Zik7Ci0JCQl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0X3VubWFwOwogCQl9CisJfQogCi0JdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKIAlwcl9lcnIoIlVua25vd24gVlBEIENvZGU6IDB4JTAyeFxuIiwgY2RiWzJdKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSAtRUlOVkFMOworCitvdXRfdW5tYXA6CisJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKK291dDoKKwlpZiAoIXJldCkgeworCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQKLXRhcmdldF9lbXVsYXRlX3JlYWRjYXBhY2l0eShzdHJ1Y3Qgc2VfY21kICpjbWQpCitpbnQgdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5KHN0cnVjdCBzZV90YXNrICp0YXNrKQogeworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tzX2xvbmcgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2Jsb2NrcyhkZXYpOwpAQCAtNzUxLDEyICs3NjIsMTQgQEAKIAogCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CiAKKwl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAxKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5XzE2KHN0cnVjdCBzZV9jbWQgKmNtZCkKK2ludCB0YXJnZXRfZW11bGF0ZV9yZWFkY2FwYWNpdHlfMTYoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAJdW5zaWduZWQgY2hhciAqYnVmOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja3MgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2Jsb2NrcyhkZXYpOwpAQCAtNzg0LDYgKzc5Nyw4IEBACiAKIAl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwogCisJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkyMiwxNCArOTM3LDE1IEBACiAJfQogfQogCi1zdGF0aWMgaW50Ci10YXJnZXRfZW11bGF0ZV9tb2Rlc2Vuc2Uoc3RydWN0IHNlX2NtZCAqY21kLCBpbnQgdGVuKQoraW50IHRhcmdldF9lbXVsYXRlX21vZGVzZW5zZShzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKKwlzdHJ1Y3Qgc2VfY21kICpjbWQgPSB0YXNrLT50YXNrX3NlX2NtZDsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAljaGFyICpjZGIgPSBjbWQtPnRfdGFza19jZGI7CiAJdW5zaWduZWQgY2hhciAqcmJ1ZjsKIAlpbnQgdHlwZSA9IGRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3R5cGUoZGV2KTsKLQlpbnQgb2Zmc2V0ID0gKHRlbikgPyA4IDogNDsKKwlpbnQgdGVuID0gKGNtZC0+dF90YXNrX2NkYlswXSA9PSBNT0RFX1NFTlNFXzEwKTsKKwlpbnQgb2Zmc2V0ID0gdGVuID8gOCA6IDQ7CiAJaW50IGxlbmd0aCA9IDA7CiAJdW5zaWduZWQgY2hhciBidWZbU0VfTU9ERV9QQUdFX0JVRl07CiAKQEAgLTk5NSwxMiArMTAxMSwxNCBAQAogCW1lbWNweShyYnVmLCBidWYsIG9mZnNldCk7CiAJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKIAorCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOworCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci10YXJnZXRfZW11bGF0ZV9yZXF1ZXN0X3NlbnNlKHN0cnVjdCBzZV9jbWQgKmNtZCkKK2ludCB0YXJnZXRfZW11bGF0ZV9yZXF1ZXN0X3NlbnNlKHN0cnVjdCBzZV90YXNrICp0YXNrKQogeworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXVuc2lnbmVkIGNoYXIgKmNkYiA9IGNtZC0+dF90YXNrX2NkYjsKIAl1bnNpZ25lZCBjaGFyICpidWY7CiAJdTggdWFfYXNjID0gMCwgdWFfYXNjcSA9IDA7CkBAIC0xMDU5LDcgKzEwNzcsOCBAQAogCiBlbmQ6CiAJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKLQorCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOworCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDY3LDggKzEwODYsNyBAQAogICogVXNlZCBmb3IgVENNL0lCTE9DSyBhbmQgVENNL0ZJTEVJTyBmb3IgYmxvY2svYmxrLWxpYi5jIGxldmVsIGRpc2NhcmQgc3VwcG9ydC4KICAqIE5vdGUgdGhpcyBpcyBub3QgdXNlZCBmb3IgVENNL3BTQ1NJIHBhc3N0aHJvdWdoCiAgKi8KLXN0YXRpYyBpbnQKLXRhcmdldF9lbXVsYXRlX3VubWFwKHN0cnVjdCBzZV90YXNrICp0YXNrKQoraW50IHRhcmdldF9lbXVsYXRlX3VubWFwKHN0cnVjdCBzZV90YXNrICp0YXNrKQogewogCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwpAQCAtMTA3OSw2ICsxMDk3LDEyIEBACiAJaW50IHJldCA9IDAsIG9mZnNldDsKIAl1bnNpZ25lZCBzaG9ydCBkbCwgYmRfZGw7CiAKKwlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19kaXNjYXJkKSB7CisJCXByX2VycigiVU5NQVAgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yOiAlc1xuIiwKKwkJCQlkZXYtPnRyYW5zcG9ydC0+bmFtZSk7CisJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwl9CisKIAkvKiBGaXJzdCBVTk1BUCBibG9jayBkZXNjcmlwdG9yIHN0YXJ0cyBhdCA4IGJ5dGUgb2Zmc2V0ICovCiAJb2Zmc2V0ID0gODsKIAlzaXplIC09IDg7CkBAIC0xMTEwLDcgKzExMzQsMTAgQEAKIAogZXJyOgogCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7Ci0KKwlpZiAoIXJldCkgeworCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMTgsMTQgKzExNDUsMjggQEAKICAqIFVzZWQgZm9yIFRDTS9JQkxPQ0sgYW5kIFRDTS9GSUxFSU8gZm9yIGJsb2NrL2Jsay1saWIuYyBsZXZlbCBkaXNjYXJkIHN1cHBvcnQuCiAgKiBOb3RlIHRoaXMgaXMgbm90IHVzZWQgZm9yIFRDTS9wU0NTSSBwYXNzdGhyb3VnaAogICovCi1zdGF0aWMgaW50Ci10YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHN0cnVjdCBzZV90YXNrICp0YXNrLCB1MzIgbnVtX2Jsb2NrcykKK2ludCB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHN0cnVjdCBzZV90YXNrICp0YXNrKQogewogCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXNlY3Rvcl90IHJhbmdlOwogCXNlY3Rvcl90IGxiYSA9IGNtZC0+dF90YXNrX2xiYTsKKwl1MzIgbnVtX2Jsb2NrczsKIAlpbnQgcmV0OworCisJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fZGlzY2FyZCkgeworCQlwcl9lcnIoIldSSVRFX1NBTUUgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQiCisJCQkJIiBmb3I6ICVzXG4iLCBkZXYtPnRyYW5zcG9ydC0+bmFtZSk7CisJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwl9CisKKwlpZiAoY21kLT50X3Rhc2tfY2RiWzBdID09IFdSSVRFX1NBTUUpCisJCW51bV9ibG9ja3MgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNtZC0+dF90YXNrX2NkYls3XSk7CisJZWxzZSBpZiAoY21kLT50X3Rhc2tfY2RiWzBdID09IFdSSVRFX1NBTUVfMTYpCisJCW51bV9ibG9ja3MgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJmNtZC0+dF90YXNrX2NkYlsxMF0pOworCWVsc2UgLyogV1JJVEVfU0FNRV8zMiB2aWEgVkFSSUFCTEVfTEVOR1RIX0NNRCAqLworCQludW1fYmxvY2tzID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZjbWQtPnRfdGFza19jZGJbMjhdKTsKKwogCS8qCiAJICogVXNlIHRoZSBleHBsaWNpdCByYW5nZSB3aGVuIG5vbiB6ZXJvIGlzIHN1cHBsaWVkLCBvdGhlcndpc2UgY2FsY3VsYXRlCiAJICogdGhlIHJlbWFpbmluZyByYW5nZSBiYXNlZCBvbiAtPmdldF9ibG9ja3MoKSAtIHN0YXJ0aW5nIExCQS4KQEAgLTExNDQsMTI3ICsxMTg1LDMwIEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKLWludAotdHJhbnNwb3J0X2VtdWxhdGVfY29udHJvbF9jZGIoc3RydWN0IHNlX3Rhc2sgKnRhc2spCitpbnQgdGFyZ2V0X2VtdWxhdGVfc3luY2hyb25pemVfY2FjaGUoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7Ci0JdW5zaWduZWQgc2hvcnQgc2VydmljZV9hY3Rpb247Ci0JaW50IHJldCA9IDA7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gdGFzay0+dGFza19zZV9jbWQtPnNlX2RldjsKIAotCXN3aXRjaCAoY21kLT50X3Rhc2tfY2RiWzBdKSB7Ci0JY2FzZSBJTlFVSVJZOgotCQlyZXQgPSB0YXJnZXRfZW11bGF0ZV9pbnF1aXJ5KGNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgUkVBRF9DQVBBQ0lUWToKLQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5KGNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgTU9ERV9TRU5TRToKLQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfbW9kZXNlbnNlKGNtZCwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgTU9ERV9TRU5TRV8xMDoKLQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfbW9kZXNlbnNlKGNtZCwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgU0VSVklDRV9BQ1RJT05fSU46Ci0JCXN3aXRjaCAoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZikgewotCQljYXNlIFNBSV9SRUFEX0NBUEFDSVRZXzE2OgotCQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5XzE2KGNtZCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiVW5zdXBwb3J0ZWQgU0E6IDB4JTAyeFxuIiwKLQkJCQljbWQtPnRfdGFza19jZGJbMV0gJiAweDFmKTsKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKLQkJfQotCQlicmVhazsKLQljYXNlIFJFUVVFU1RfU0VOU0U6Ci0JCXJldCA9IHRhcmdldF9lbXVsYXRlX3JlcXVlc3Rfc2Vuc2UoY21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBVTk1BUDoKLQkJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fZGlzY2FyZCkgewotCQkJcHJfZXJyKCJVTk1BUCBlbXVsYXRpb24gbm90IHN1cHBvcnRlZCBmb3I6ICVzXG4iLAotCQkJCQlkZXYtPnRyYW5zcG9ydC0+bmFtZSk7Ci0JCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7Ci0JCX0KLQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfdW5tYXAodGFzayk7Ci0JCWJyZWFrOwotCWNhc2UgV1JJVEVfU0FNRToKLQkJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fZGlzY2FyZCkgewotCQkJcHJfZXJyKCJXUklURV9TQU1FIGVtdWxhdGlvbiBub3Qgc3VwcG9ydGVkIgotCQkJCQkiIGZvcjogJXNcbiIsIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKLQkJfQotCQlyZXQgPSB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHRhc2ssCi0JCQkJZ2V0X3VuYWxpZ25lZF9iZTE2KCZjbWQtPnRfdGFza19jZGJbN10pKTsKLQkJYnJlYWs7Ci0JY2FzZSBXUklURV9TQU1FXzE2OgotCQlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19kaXNjYXJkKSB7Ci0JCQlwcl9lcnIoIldSSVRFX1NBTUVfMTYgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQiCi0JCQkJCSIgZm9yOiAlc1xuIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUpOwotCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwotCQl9Ci0JCXJldCA9IHRhcmdldF9lbXVsYXRlX3dyaXRlX3NhbWUodGFzaywKLQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoJmNtZC0+dF90YXNrX2NkYlsxMF0pKTsKLQkJYnJlYWs7Ci0JY2FzZSBWQVJJQUJMRV9MRU5HVEhfQ01EOgotCQlzZXJ2aWNlX2FjdGlvbiA9Ci0JCQlnZXRfdW5hbGlnbmVkX2JlMTYoJmNtZC0+dF90YXNrX2NkYls4XSk7Ci0JCXN3aXRjaCAoc2VydmljZV9hY3Rpb24pIHsKLQkJY2FzZSBXUklURV9TQU1FXzMyOgotCQkJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fZGlzY2FyZCkgewotCQkJCXByX2VycigiV1JJVEVfU0FNRV8zMiBTQSBlbXVsYXRpb24gbm90IgotCQkJCQkiIHN1cHBvcnRlZCBmb3I6ICVzXG4iLAotCQkJCQlkZXYtPnRyYW5zcG9ydC0+bmFtZSk7Ci0JCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwotCQkJfQotCQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfd3JpdGVfc2FtZSh0YXNrLAotCQkJCWdldF91bmFsaWduZWRfYmUzMigmY21kLT50X3Rhc2tfY2RiWzI4XSkpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIlVuc3VwcG9ydGVkIFZBUklBQkxFX0xFTkdUSF9DTUQgU0E6IgotCQkJCQkiIDB4JTAyeFxuIiwgc2VydmljZV9hY3Rpb24pOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKLQljYXNlIDB4OTE6IC8qIFNZTkNIUk9OSVpFX0NBQ0hFXzE2OiAqLwotCQlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19zeW5jX2NhY2hlKSB7Ci0JCQlwcl9lcnIoIlNZTkNIUk9OSVpFX0NBQ0hFIGVtdWxhdGlvbiBub3Qgc3VwcG9ydGVkIgotCQkJCSIgZm9yOiAlc1xuIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUpOwotCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwotCQl9Ci0JCWRldi0+dHJhbnNwb3J0LT5kb19zeW5jX2NhY2hlKHRhc2spOwotCQlicmVhazsKLQljYXNlIEFMTE9XX01FRElVTV9SRU1PVkFMOgotCWNhc2UgRVJBU0U6Ci0JY2FzZSBSRVpFUk9fVU5JVDoKLQljYXNlIFNFRUtfMTA6Ci0JY2FzZSBTUEFDRToKLQljYXNlIFNUQVJUX1NUT1A6Ci0JY2FzZSBURVNUX1VOSVRfUkVBRFk6Ci0JY2FzZSBWRVJJRlk6Ci0JY2FzZSBXUklURV9GSUxFTUFSS1M6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiVW5zdXBwb3J0ZWQgU0NTSSBPcGNvZGU6IDB4JTAyeCBmb3IgJXNcbiIsCi0JCQljbWQtPnRfdGFza19jZGJbMF0sIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKKwlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19zeW5jX2NhY2hlKSB7CisJCXByX2VycigiU1lOQ0hST05JWkVfQ0FDSEUgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQiCisJCQkiIGZvcjogJXNcbiIsIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwogCX0KIAotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCS8qCi0JICogSGFuZGxlIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gaGVyZSB1bmxlc3MgYSBjYWxsZXIKLQkgKiBoYXMgZXhwbGljdGx5IHJlcXVlc3RlZCBhbiBhc3ljaHJvbm91cyBjb21wbGV0aW9uLgotCSAqLwotCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX0VNVUxBVEVfQ0RCX0FTWU5DKSkgewotCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKLQkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7Ci0JfQorCWRldi0+dHJhbnNwb3J0LT5kb19zeW5jX2NhY2hlKHRhc2spOworCXJldHVybiAwOworfQogCi0JcmV0dXJuIFBZWF9UUkFOU1BPUlRfU0VOVF9UT19UUkFOU1BPUlQ7CitpbnQgdGFyZ2V0X2VtdWxhdGVfbm9vcChzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKK3sKKwl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAxKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NkYi5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY2RiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2YjFlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NkYi5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgVEFSR0VUX0NPUkVfQ0RCX0gKKyNkZWZpbmUgVEFSR0VUX0NPUkVfQ0RCX0gKKworaW50IHRhcmdldF9lbXVsYXRlX2lucXVpcnkoc3RydWN0IHNlX3Rhc2sgKnRhc2spOworaW50IHRhcmdldF9lbXVsYXRlX3JlYWRjYXBhY2l0eShzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CitpbnQgdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5XzE2KHN0cnVjdCBzZV90YXNrICp0YXNrKTsKK2ludCB0YXJnZXRfZW11bGF0ZV9tb2Rlc2Vuc2Uoc3RydWN0IHNlX3Rhc2sgKnRhc2spOworaW50IHRhcmdldF9lbXVsYXRlX3JlcXVlc3Rfc2Vuc2Uoc3RydWN0IHNlX3Rhc2sgKnRhc2spOworaW50IHRhcmdldF9lbXVsYXRlX3VubWFwKHN0cnVjdCBzZV90YXNrICp0YXNrKTsKK2ludCB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHN0cnVjdCBzZV90YXNrICp0YXNrKTsKK2ludCB0YXJnZXRfZW11bGF0ZV9zeW5jaHJvbml6ZV9jYWNoZShzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CitpbnQgdGFyZ2V0X2VtdWxhdGVfbm9vcChzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CisKKyNlbmRpZiAvKiBUQVJHRVRfQ09SRV9DREJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYwppbmRleCBmODcwYzNiLi5iYTVlZGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CkBAIC02NTEsMjMgKzY1MiwxNSBAQAogCWx1bi0+bHVuX3NlX2RldiA9IE5VTEw7CiB9CiAKLWludCB0cmFuc3BvcnRfY29yZV9yZXBvcnRfbHVuX3Jlc3BvbnNlKHN0cnVjdCBzZV9jbWQgKnNlX2NtZCkKK2ludCB0YXJnZXRfcmVwb3J0X2x1bnMoc3RydWN0IHNlX3Rhc2sgKnNlX3Rhc2spCiB7CisJc3RydWN0IHNlX2NtZCAqc2VfY21kID0gc2VfdGFzay0+dGFza19zZV9jbWQ7CiAJc3RydWN0IHNlX2Rldl9lbnRyeSAqZGV2ZTsKIAlzdHJ1Y3Qgc2VfbHVuICpzZV9sdW47CiAJc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MgPSBzZV9jbWQtPnNlX3Nlc3M7Ci0Jc3RydWN0IHNlX3Rhc2sgKnNlX3Rhc2s7CiAJdW5zaWduZWQgY2hhciAqYnVmOwogCXUzMiBjZGJfb2Zmc2V0ID0gMCwgbHVuX2NvdW50ID0gMCwgb2Zmc2V0ID0gOCwgaTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VfdGFzaywgJnNlX2NtZC0+dF90YXNrX2xpc3QsIHRfbGlzdCkKLQkJYnJlYWs7Ci0KLQlpZiAoIXNlX3Rhc2spIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBzZV90YXNrIGZvciBzdHJ1Y3Qgc2VfY21kXG4iKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwotCX0KLQogCWJ1ZiA9IHRyYW5zcG9ydF9rbWFwX2ZpcnN0X2RhdGFfcGFnZShzZV9jbWQpOwogCiAJLyoKQEAgLTcxMyw2ICs3MDYsOCBAQAogCWJ1ZlsyXSA9ICgobHVuX2NvdW50ID4+IDgpICYgMHhmZik7CiAJYnVmWzNdID0gKGx1bl9jb3VudCAmIDB4ZmYpOwogCisJc2VfdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2soc2VfdGFzaywgMSk7CiAJcmV0dXJuIFBZWF9UUkFOU1BPUlRfU0VOVF9UT19UUkFOU1BPUlQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19saWIuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19saWIuYwppbmRleCAzOWYwMjFiLi5lYzQyNDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfbGliLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX2xpYi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYwppbmRleCAxOWEwYmU5Li42N2NkNmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaGJhLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9oYmEuYwppbmRleCAwNjM5Yjk3Li5jNjgwMTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9oYmEuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9oYmEuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKaW5kZXggNDFhZDAyYi4uNzY5OGVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuYwppbmRleCAwYzRmNzgzLi41YTRlYmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmMKQEAgLTExNiwxMTQgKzExNiwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY29yZV9zY3NpMl9yZXNlcnZhdGlvbl9yZWxlYXNlKHN0cnVjdCBzZV9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKLQlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2VzcyA9IGNtZC0+c2Vfc2VzczsKLQlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICp0cGcgPSBzZXNzLT5zZV90cGc7Ci0KLQlpZiAoIXNlc3MgfHwgIXRwZykKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCWlmICghZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgfHwgIXNlc3MpIHsKLQkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgIT0gc2Vzcy0+c2Vfbm9kZV9hY2wpIHsKLQkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgPSBOVUxMOwotCWRldi0+ZGV2X2ZsYWdzICY9IH5ERl9TUEMyX1JFU0VSVkFUSU9OUzsKLQlpZiAoZGV2LT5kZXZfZmxhZ3MgJiBERl9TUEMyX1JFU0VSVkFUSU9OU19XSVRIX0lTSUQpIHsKLQkJZGV2LT5kZXZfcmVzX2Jpbl9pc2lkID0gMDsKLQkJZGV2LT5kZXZfZmxhZ3MgJj0gfkRGX1NQQzJfUkVTRVJWQVRJT05TX1dJVEhfSVNJRDsKLQl9Ci0JcHJfZGVidWcoIlNDU0ktMiBSZWxlYXNlZCByZXNlcnZhdGlvbiBmb3IgJXMgTFVOOiAldSAtPiIKLQkJIiBNQVBQRUQgTFVOOiAldSBmb3IgJXNcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCi0JCWNtZC0+c2VfbHVuLT51bnBhY2tlZF9sdW4sIGNtZC0+c2VfZGV2ZS0+bWFwcGVkX2x1biwKLQkJc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUpOwotCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvcmVfc2NzaTJfcmVzZXJ2YXRpb25fcmVzZXJ2ZShzdHJ1Y3Qgc2VfY21kICpjbWQpCi17Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7Ci0Jc3RydWN0IHNlX3Nlc3Npb24gKnNlc3MgPSBjbWQtPnNlX3Nlc3M7Ci0Jc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdHBnID0gc2Vzcy0+c2VfdHBnOwotCi0JaWYgKChjbWQtPnRfdGFza19jZGJbMV0gJiAweDAxKSAmJgotCSAgICAoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgwMikpIHsKLQkJcHJfZXJyKCJMb25nSU8gYW5kIE9ic2VsZXRlIEJpdHMgc2V0LCByZXR1cm5pbmciCi0JCQkJIiBJTExFR0FMX1JFUVVFU1RcbiIpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTExFR0FMX1JFUVVFU1Q7Ci0JfQotCS8qCi0JICogVGhpcyBpcyBjdXJyZW50bHkgdGhlIGNhc2UgZm9yIHRhcmdldF9jb3JlX21vZCBwYXNzdGhyb3VnaCBzdHJ1Y3Qgc2VfY21kCi0JICogb3BzCi0JICovCi0JaWYgKCFzZXNzIHx8ICF0cGcpCi0JCXJldHVybiAwOwotCi0Jc3Bpbl9sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKLQlpZiAoZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgJiYKLQkgICAoZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgIT0gc2Vzcy0+c2Vfbm9kZV9hY2wpKSB7Ci0JCXByX2VycigiU0NTSS0yIFJFU0VSVkFUSU9OIENPTkZMSUZUIGZvciAlcyBmYWJyaWNcbiIsCi0JCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpKTsKLQkJcHJfZXJyKCJPcmlnaW5hbCByZXNlcnZlciBMVU46ICV1ICVzXG4iLAotCQkJY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwKLQkJCWRldi0+ZGV2X3Jlc2VydmVkX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKLQkJcHJfZXJyKCJDdXJyZW50IGF0dGVtcHQgLSBMVU46ICV1IC0+IE1BUFBFRCBMVU46ICV1IgotCQkJIiBmcm9tICVzIFxuIiwgY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwKLQkJCWNtZC0+c2VfZGV2ZS0+bWFwcGVkX2x1biwKLQkJCXNlc3MtPnNlX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKLQkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKLQl9Ci0KLQlkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCA9IHNlc3MtPnNlX25vZGVfYWNsOwotCWRldi0+ZGV2X2ZsYWdzIHw9IERGX1NQQzJfUkVTRVJWQVRJT05TOwotCWlmIChzZXNzLT5zZXNzX2Jpbl9pc2lkICE9IDApIHsKLQkJZGV2LT5kZXZfcmVzX2Jpbl9pc2lkID0gc2Vzcy0+c2Vzc19iaW5faXNpZDsKLQkJZGV2LT5kZXZfZmxhZ3MgfD0gREZfU1BDMl9SRVNFUlZBVElPTlNfV0lUSF9JU0lEOwotCX0KLQlwcl9kZWJ1ZygiU0NTSS0yIFJlc2VydmVkICVzIExVTjogJXUgLT4gTUFQUEVEIExVTjogJXUiCi0JCSIgZm9yICVzXG4iLCB0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAotCQljbWQtPnNlX2x1bi0+dW5wYWNrZWRfbHVuLCBjbWQtPnNlX2RldmUtPm1hcHBlZF9sdW4sCi0JCXNlc3MtPnNlX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKLQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uICpjb3JlX3Njc2kzX2xvY2F0ZV9wcl9yZWcoc3RydWN0IHNlX2RldmljZSAqLAogCQkJCQlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKiwgc3RydWN0IHNlX3Nlc3Npb24gKik7CiBzdGF0aWMgdm9pZCBjb3JlX3Njc2kzX3B1dF9wcl9yZWcoc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKik7CiAKLS8qCi0gKiBTZXR1cCBpbiB0YXJnZXRfY29yZV90cmFuc3BvcnQuYzp0cmFuc3BvcnRfZ2VuZXJpY19jbWRfc2VxdWVuY2VyKCkKLSAqIGFuZCBjYWxsZWQgdmlhIHN0cnVjdCBzZV9jbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYigpIGluIFRDTSBwcm9jZXNzaW5nCi0gKiB0aHJlYWQgY29udGV4dC4KLSAqLwotaW50IGNvcmVfc2NzaTJfZW11bGF0ZV9jcmgoc3RydWN0IHNlX2NtZCAqY21kKQorc3RhdGljIGludCB0YXJnZXRfY2hlY2tfc2NzaTJfcmVzZXJ2YXRpb25fY29uZmxpY3Qoc3RydWN0IHNlX2NtZCAqY21kLCBpbnQgKnJldCkKIHsKIAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IGNtZC0+c2Vfc2VzczsKIAlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gY21kLT5zZV9kZXYtPnNlX3N1Yl9kZXY7CiAJc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKnByX3JlZzsKIAlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICpwcl90bXBsID0gJnN1X2Rldi0+dDEwX3ByOwotCXVuc2lnbmVkIGNoYXIgKmNkYiA9ICZjbWQtPnRfdGFza19jZGJbMF07CiAJaW50IGNyaCA9IChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKTsKIAlpbnQgY29uZmxpY3QgPSAwOwogCi0JaWYgKCFzZV9zZXNzKQotCQlyZXR1cm4gMDsKLQogCWlmICghY3JoKQotCQlnb3RvIGFmdGVyX2NyaDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJcHJfcmVnID0gY29yZV9zY3NpM19sb2NhdGVfcHJfcmVnKGNtZC0+c2VfZGV2LCBzZV9zZXNzLT5zZV9ub2RlX2FjbCwKIAkJCXNlX3Nlc3MpOwpAQCAtMjUxLDE0ICsxNTgsMTYgQEAKIAkJICovCiAJCWlmIChwcl9yZWctPnByX3Jlc19ob2xkZXIpIHsKIAkJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwotCQkJcmV0dXJuIDA7CisJCQkqcmV0ID0gMDsKKwkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlpZiAoKHByX3JlZy0+cHJfcmVzX3R5cGUgPT0gUFJfVFlQRV9XUklURV9FWENMVVNJVkVfUkVHT05MWSkgfHwKIAkJICAgIChwcl9yZWctPnByX3Jlc190eXBlID09IFBSX1RZUEVfRVhDTFVTSVZFX0FDQ0VTU19SRUdPTkxZKSB8fAogCQkgICAgKHByX3JlZy0+cHJfcmVzX3R5cGUgPT0gUFJfVFlQRV9XUklURV9FWENMVVNJVkVfQUxMUkVHKSB8fAogCQkgICAgKHByX3JlZy0+cHJfcmVzX3R5cGUgPT0gUFJfVFlQRV9FWENMVVNJVkVfQUNDRVNTX0FMTFJFRykpIHsKIAkJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwotCQkJcmV0dXJuIDA7CisJCQkqcmV0ID0gMDsKKwkJCXJldHVybiB0cnVlOwogCQl9CiAJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwogCQljb25mbGljdCA9IDE7CkBAIC0yODIsMTggKzE5MSwxMTggQEAKIAkJcHJfZXJyKCJSZWNlaXZlZCBsZWdhY3kgU1BDLTIgUkVTRVJWRS9SRUxFQVNFIgogCQkJIiB3aGlsZSBhY3RpdmUgU1BDLTMgcmVnaXN0cmF0aW9ucyBleGlzdCwiCiAJCQkiIHJldHVybmluZyBSRVNFUlZBVElPTl9DT05GTElDVFxuIik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQkqcmV0ID0gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi1hZnRlcl9jcmg6Ci0JaWYgKChjZGJbMF0gPT0gUkVTRVJWRSkgfHwgKGNkYlswXSA9PSBSRVNFUlZFXzEwKSkKLQkJcmV0dXJuIGNvcmVfc2NzaTJfcmVzZXJ2YXRpb25fcmVzZXJ2ZShjbWQpOwotCWVsc2UgaWYgKChjZGJbMF0gPT0gUkVMRUFTRSkgfHwgKGNkYlswXSA9PSBSRUxFQVNFXzEwKSkKLQkJcmV0dXJuIGNvcmVfc2NzaTJfcmVzZXJ2YXRpb25fcmVsZWFzZShjbWQpOwotCWVsc2UKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CisJcmV0dXJuIGZhbHNlOwogfQogCitpbnQgdGFyZ2V0X3Njc2kyX3Jlc2VydmF0aW9uX3JlbGVhc2Uoc3RydWN0IHNlX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CisJc3RydWN0IHNlX3Nlc3Npb24gKnNlc3MgPSBjbWQtPnNlX3Nlc3M7CisJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdHBnID0gc2Vzcy0+c2VfdHBnOworCWludCByZXQgPSAwOworCisJaWYgKCFzZXNzIHx8ICF0cGcpCisJCWdvdG8gb3V0OworCWlmICh0YXJnZXRfY2hlY2tfc2NzaTJfcmVzZXJ2YXRpb25fY29uZmxpY3QoY21kLCAmcmV0KSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAwOworCXNwaW5fbG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CisJaWYgKCFkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCB8fCAhc2VzcykKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKGRldi0+ZGV2X3Jlc2VydmVkX25vZGVfYWNsICE9IHNlc3MtPnNlX25vZGVfYWNsKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCA9IE5VTEw7CisJZGV2LT5kZXZfZmxhZ3MgJj0gfkRGX1NQQzJfUkVTRVJWQVRJT05TOworCWlmIChkZXYtPmRldl9mbGFncyAmIERGX1NQQzJfUkVTRVJWQVRJT05TX1dJVEhfSVNJRCkgeworCQlkZXYtPmRldl9yZXNfYmluX2lzaWQgPSAwOworCQlkZXYtPmRldl9mbGFncyAmPSB+REZfU1BDMl9SRVNFUlZBVElPTlNfV0lUSF9JU0lEOworCX0KKwlwcl9kZWJ1ZygiU0NTSS0yIFJlbGVhc2VkIHJlc2VydmF0aW9uIGZvciAlcyBMVU46ICV1IC0+IgorCQkiIE1BUFBFRCBMVU46ICV1IGZvciAlc1xuIiwgdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKKwkJY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwgY21kLT5zZV9kZXZlLT5tYXBwZWRfbHVuLAorCQlzZXNzLT5zZV9ub2RlX2FjbC0+aW5pdGlhdG9ybmFtZSk7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOworb3V0OgorCWlmICghcmV0KSB7CisJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOworCQl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IHRhcmdldF9zY3NpMl9yZXNlcnZhdGlvbl9yZXNlcnZlKHN0cnVjdCBzZV90YXNrICp0YXNrKQoreworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXN0cnVjdCBzZV9zZXNzaW9uICpzZXNzID0gY21kLT5zZV9zZXNzOworCXN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnRwZyA9IHNlc3MtPnNlX3RwZzsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgwMSkgJiYKKwkgICAgKGNtZC0+dF90YXNrX2NkYlsxXSAmIDB4MDIpKSB7CisJCXByX2VycigiTG9uZ0lPIGFuZCBPYnNlbGV0ZSBCaXRzIHNldCwgcmV0dXJuaW5nIgorCQkJCSIgSUxMRUdBTF9SRVFVRVNUXG4iKTsKKwkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTExFR0FMX1JFUVVFU1Q7CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIFRoaXMgaXMgY3VycmVudGx5IHRoZSBjYXNlIGZvciB0YXJnZXRfY29yZV9tb2QgcGFzc3Rocm91Z2ggc3RydWN0IHNlX2NtZAorCSAqIG9wcworCSAqLworCWlmICghc2VzcyB8fCAhdHBnKQorCQlnb3RvIG91dDsKKwlpZiAodGFyZ2V0X2NoZWNrX3Njc2kyX3Jlc2VydmF0aW9uX2NvbmZsaWN0KGNtZCwgJnJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMDsKKwlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOworCWlmIChkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCAmJgorCSAgIChkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCAhPSBzZXNzLT5zZV9ub2RlX2FjbCkpIHsKKwkJcHJfZXJyKCJTQ1NJLTIgUkVTRVJWQVRJT04gQ09ORkxJRlQgZm9yICVzIGZhYnJpY1xuIiwKKwkJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCkpOworCQlwcl9lcnIoIk9yaWdpbmFsIHJlc2VydmVyIExVTjogJXUgJXNcbiIsCisJCQljbWQtPnNlX2x1bi0+dW5wYWNrZWRfbHVuLAorCQkJZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUpOworCQlwcl9lcnIoIkN1cnJlbnQgYXR0ZW1wdCAtIExVTjogJXUgLT4gTUFQUEVEIExVTjogJXUiCisJCQkiIGZyb20gJXMgXG4iLCBjbWQtPnNlX2x1bi0+dW5wYWNrZWRfbHVuLAorCQkJY21kLT5zZV9kZXZlLT5tYXBwZWRfbHVuLAorCQkJc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUpOworCQlyZXQgPSBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgPSBzZXNzLT5zZV9ub2RlX2FjbDsKKwlkZXYtPmRldl9mbGFncyB8PSBERl9TUEMyX1JFU0VSVkFUSU9OUzsKKwlpZiAoc2Vzcy0+c2Vzc19iaW5faXNpZCAhPSAwKSB7CisJCWRldi0+ZGV2X3Jlc19iaW5faXNpZCA9IHNlc3MtPnNlc3NfYmluX2lzaWQ7CisJCWRldi0+ZGV2X2ZsYWdzIHw9IERGX1NQQzJfUkVTRVJWQVRJT05TX1dJVEhfSVNJRDsKKwl9CisJcHJfZGVidWcoIlNDU0ktMiBSZXNlcnZlZCAlcyBMVU46ICV1IC0+IE1BUFBFRCBMVU46ICV1IgorCQkiIGZvciAlc1xuIiwgdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKKwkJY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwgY21kLT5zZV9kZXZlLT5tYXBwZWRfbHVuLAorCQlzZXNzLT5zZV9ub2RlX2FjbC0+aW5pdGlhdG9ybmFtZSk7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOworb3V0OgorCWlmICghcmV0KSB7CisJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOworCQl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCiAvKgogICogQmVnaW4gU1BDLTMvU1BDLTQgUGVyc2lzdGVudCBSZXNlcnZhdGlvbnMgZW11bGF0aW9uIHN1cHBvcnQKICAqCkBAIC00MTgsMTIgKzQyNywxMiBAQAogCQlicmVhazsKIAljYXNlIFJFTEVBU0U6CiAJY2FzZSBSRUxFQVNFXzEwOgotCQkvKiBIYW5kbGVkIGJ5IENSSD0xIGluIGNvcmVfc2NzaTJfZW11bGF0ZV9jcmgoKSAqLworCQkvKiBIYW5kbGVkIGJ5IENSSD0xIGluIHRhcmdldF9zY3NpMl9yZXNlcnZhdGlvbl9yZWxlYXNlKCkgKi8KIAkJcmV0ID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBSRVNFUlZFOgogCWNhc2UgUkVTRVJWRV8xMDoKLQkJLyogSGFuZGxlZCBieSBDUkg9MSBpbiBjb3JlX3Njc2kyX2VtdWxhdGVfY3JoKCkgKi8KKwkJLyogSGFuZGxlZCBieSBDUkg9MSBpbiB0YXJnZXRfc2NzaTJfcmVzZXJ2YXRpb25fcmVzZXJ2ZSgpICovCiAJCXJldCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgVEVTVF9VTklUX1JFQURZOgpAQCAtMzczOSwxMiArMzc0OCwzMyBAQAogLyoKICAqIFNlZSBzcGM0cjE3IHNlY3Rpb24gNi4xNCBUYWJsZSAxNzAKICAqLwotc3RhdGljIGludCBjb3JlX3Njc2kzX2VtdWxhdGVfcHJfb3V0KHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqY2RiKQoraW50IHRhcmdldF9zY3NpM19lbXVsYXRlX3ByX291dChzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKKwlzdHJ1Y3Qgc2VfY21kICpjbWQgPSB0YXNrLT50YXNrX3NlX2NtZDsKKwl1bnNpZ25lZCBjaGFyICpjZGIgPSAmY21kLT50X3Rhc2tfY2RiWzBdOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1NjQgcmVzX2tleSwgc2FfcmVzX2tleTsKIAlpbnQgc2EsIHNjb3BlLCB0eXBlLCBhcHRwbDsKIAlpbnQgc3BlY19pX3B0ID0gMCwgYWxsX3RnX3B0ID0gMCwgdW5yZWcgPSAwOworCWludCByZXQ7CisKKwkvKgorCSAqIEZvbGxvd2luZyBzcGMycjIwIDUuNS4xIFJlc2VydmF0aW9ucyBvdmVydmlldzoKKwkgKgorCSAqIElmIGEgbG9naWNhbCB1bml0IGhhcyBiZWVuIHJlc2VydmVkIGJ5IGFueSBSRVNFUlZFIGNvbW1hbmQgYW5kIGlzCisJICogc3RpbGwgcmVzZXJ2ZWQgYnkgYW55IGluaXRpYXRvciwgYWxsIFBFUlNJU1RFTlQgUkVTRVJWRSBJTiBhbmQgYWxsCisJICogUEVSU0lTVEVOVCBSRVNFUlZFIE9VVCBjb21tYW5kcyBzaGFsbCBjb25mbGljdCByZWdhcmRsZXNzIG9mCisJICogaW5pdGlhdG9yIG9yIHNlcnZpY2UgYWN0aW9uIGFuZCBzaGFsbCB0ZXJtaW5hdGUgd2l0aCBhIFJFU0VSVkFUSU9OCisJICogQ09ORkxJQ1Qgc3RhdHVzLgorCSAqLworCWlmIChjbWQtPnNlX2Rldi0+ZGV2X2ZsYWdzICYgREZfU1BDMl9SRVNFUlZBVElPTlMpIHsKKwkJcHJfZXJyKCJSZWNlaXZlZCBQRVJTSVNURU5UX1JFU0VSVkUgQ0RCIHdoaWxlIGxlZ2FjeSIKKwkJCSIgU1BDLTIgcmVzZXJ2YXRpb24gaXMgaGVsZCwgcmV0dXJuaW5nIgorCQkJIiBSRVNFUlZBVElPTl9DT05GTElDVFxuIik7CisJCXJldCA9IFBZWF9UUkFOU1BPUlRfUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCWdvdG8gb3V0OworCX0KKwogCS8qCiAJICogRklYTUU6IEEgTlVMTCBzdHJ1Y3Qgc2Vfc2Vzc2lvbiBwb2ludGVyIG1lYW5zIGFuIHRoaXMgaXMgbm90IGNvbWluZyBmcm9tCiAJICogYSAkRkFCUklDX01PRCdzIG5leHVzLCBidXQgZnJvbSBpbnRlcm5hbCBwYXNzdGhyb3VnaCBvcHMuCkBAIC0zNzU1LDcgKzM3ODUsOCBAQAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgMjQpIHsKIAkJcHJfd2FybigiU1BDLVBSOiBSZWNlaXZlZCBQUiBPVVQgcGFyYW1ldGVyIGxpc3QiCiAJCQkiIGxlbmd0aCB0b28gc21hbGw6ICV1XG4iLCBjbWQtPmRhdGFfbGVuZ3RoKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlnb3RvIG91dDsKIAl9CiAJLyoKIAkgKiBGcm9tIHRoZSBQRVJTSVNURU5UX1JFU0VSVkVfT1VUIGNvbW1hbmQgZGVzY3JpcHRvciBibG9jayAoQ0RCKQpAQCAtMzc4OCw4ICszODE5LDExIEBACiAJLyoKIAkgKiBTUEVDX0lfUFQ9MSBpcyBvbmx5IHZhbGlkIGZvciBTZXJ2aWNlIGFjdGlvbjogUkVHSVNURVIKIAkgKi8KLQlpZiAoc3BlY19pX3B0ICYmICgoY2RiWzFdICYgMHgxZikgIT0gUFJPX1JFR0lTVEVSKSkKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwlpZiAoc3BlY19pX3B0ICYmICgoY2RiWzFdICYgMHgxZikgIT0gUFJPX1JFR0lTVEVSKSkgeworCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWdvdG8gb3V0OworCX0KKwogCS8qCiAJICogRnJvbSBzcGM0cjE3IHNlY3Rpb24gNi4xNDoKIAkgKgpAQCAtMzgwMyw3ICszODM3LDggQEAKIAkgICAgKGNtZC0+ZGF0YV9sZW5ndGggIT0gMjQpKSB7CiAJCXByX3dhcm4oIlNQQy1QUjogUmVjZWl2ZWQgUFIgT1VUIGlsbGVnYWwgcGFyYW1ldGVyIgogCQkJIiBsaXN0IGxlbmd0aDogJXVcbiIsIGNtZC0+ZGF0YV9sZW5ndGgpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWdvdG8gb3V0OwogCX0KIAkvKgogCSAqIChjb3JlX3Njc2kzX2VtdWxhdGVfcHJvXyogZnVuY3Rpb24gcGFyYW1ldGVycwpAQCAtMzgxMiwzNSArMzg0Nyw0NyBAQAogCSAqLwogCXN3aXRjaCAoc2EpIHsKIAljYXNlIFBST19SRUdJU1RFUjoKLQkJcmV0dXJuIGNvcmVfc2NzaTNfZW11bGF0ZV9wcm9fcmVnaXN0ZXIoY21kLAorCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3JlZ2lzdGVyKGNtZCwKIAkJCXJlc19rZXksIHNhX3Jlc19rZXksIGFwdHBsLCBhbGxfdGdfcHQsIHNwZWNfaV9wdCwgMCk7CisJCWJyZWFrOwogCWNhc2UgUFJPX1JFU0VSVkU6Ci0JCXJldHVybiBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3Jlc2VydmUoY21kLAotCQkJdHlwZSwgc2NvcGUsIHJlc19rZXkpOworCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3Jlc2VydmUoY21kLCB0eXBlLCBzY29wZSwgcmVzX2tleSk7CisJCWJyZWFrOwogCWNhc2UgUFJPX1JFTEVBU0U6Ci0JCXJldHVybiBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3JlbGVhc2UoY21kLAotCQkJdHlwZSwgc2NvcGUsIHJlc19rZXkpOworCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3JlbGVhc2UoY21kLCB0eXBlLCBzY29wZSwgcmVzX2tleSk7CisJCWJyZWFrOwogCWNhc2UgUFJPX0NMRUFSOgotCQlyZXR1cm4gY29yZV9zY3NpM19lbXVsYXRlX3Byb19jbGVhcihjbWQsIHJlc19rZXkpOworCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX2NsZWFyKGNtZCwgcmVzX2tleSk7CisJCWJyZWFrOwogCWNhc2UgUFJPX1BSRUVNUFQ6Ci0JCXJldHVybiBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3ByZWVtcHQoY21kLCB0eXBlLCBzY29wZSwKKwkJcmV0ID0gY29yZV9zY3NpM19lbXVsYXRlX3Byb19wcmVlbXB0KGNtZCwgdHlwZSwgc2NvcGUsCiAJCQkJCXJlc19rZXksIHNhX3Jlc19rZXksIDApOworCQlicmVhazsKIAljYXNlIFBST19QUkVFTVBUX0FORF9BQk9SVDoKLQkJcmV0dXJuIGNvcmVfc2NzaTNfZW11bGF0ZV9wcm9fcHJlZW1wdChjbWQsIHR5cGUsIHNjb3BlLAorCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3ByZWVtcHQoY21kLCB0eXBlLCBzY29wZSwKIAkJCQkJcmVzX2tleSwgc2FfcmVzX2tleSwgMSk7CisJCWJyZWFrOwogCWNhc2UgUFJPX1JFR0lTVEVSX0FORF9JR05PUkVfRVhJU1RJTkdfS0VZOgotCQlyZXR1cm4gY29yZV9zY3NpM19lbXVsYXRlX3Byb19yZWdpc3RlcihjbWQsCisJCXJldCA9IGNvcmVfc2NzaTNfZW11bGF0ZV9wcm9fcmVnaXN0ZXIoY21kLAogCQkJMCwgc2FfcmVzX2tleSwgYXB0cGwsIGFsbF90Z19wdCwgc3BlY19pX3B0LCAxKTsKKwkJYnJlYWs7CiAJY2FzZSBQUk9fUkVHSVNURVJfQU5EX01PVkU6Ci0JCXJldHVybiBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3JlZ2lzdGVyX2FuZF9tb3ZlKGNtZCwgcmVzX2tleSwKKwkJcmV0ID0gY29yZV9zY3NpM19lbXVsYXRlX3Byb19yZWdpc3Rlcl9hbmRfbW92ZShjbWQsIHJlc19rZXksCiAJCQkJc2FfcmVzX2tleSwgYXB0cGwsIHVucmVnKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJVbmtub3duIFBFUlNJU1RFTlRfUkVTRVJWRV9PVVQgc2VydmljZSIKIAkJCSIgYWN0aW9uOiAweCUwMnhcbiIsIGNkYlsxXSAmIDB4MWYpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CitvdXQ6CisJaWYgKCFyZXQpIHsKKwkJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtNDE5MCwyOSArNDIzNywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNvcmVfc2NzaTNfZW11bGF0ZV9wcl9pbihzdHJ1Y3Qgc2VfY21kICpjbWQsIHVuc2lnbmVkIGNoYXIgKmNkYikKK2ludCB0YXJnZXRfc2NzaTNfZW11bGF0ZV9wcl9pbihzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKLQlzd2l0Y2ggKGNkYlsxXSAmIDB4MWYpIHsKLQljYXNlIFBSSV9SRUFEX0tFWVM6Ci0JCXJldHVybiBjb3JlX3Njc2kzX3ByaV9yZWFkX2tleXMoY21kKTsKLQljYXNlIFBSSV9SRUFEX1JFU0VSVkFUSU9OOgotCQlyZXR1cm4gY29yZV9zY3NpM19wcmlfcmVhZF9yZXNlcnZhdGlvbihjbWQpOwotCWNhc2UgUFJJX1JFUE9SVF9DQVBBQklMSVRJRVM6Ci0JCXJldHVybiBjb3JlX3Njc2kzX3ByaV9yZXBvcnRfY2FwYWJpbGl0aWVzKGNtZCk7Ci0JY2FzZSBQUklfUkVBRF9GVUxMX1NUQVRVUzoKLQkJcmV0dXJuIGNvcmVfc2NzaTNfcHJpX3JlYWRfZnVsbF9zdGF0dXMoY21kKTsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIlVua25vd24gUEVSU0lTVEVOVF9SRVNFUlZFX0lOIHNlcnZpY2UiCi0JCQkiIGFjdGlvbjogMHglMDJ4XG4iLCBjZGJbMV0gJiAweDFmKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7Ci0JfQorCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOworCWludCByZXQ7CiAKLX0KLQotaW50IGNvcmVfc2NzaTNfZW11bGF0ZV9wcihzdHJ1Y3Qgc2VfY21kICpjbWQpCi17Ci0JdW5zaWduZWQgY2hhciAqY2RiID0gJmNtZC0+dF90YXNrX2NkYlswXTsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAkvKgogCSAqIEZvbGxvd2luZyBzcGMycjIwIDUuNS4xIFJlc2VydmF0aW9ucyBvdmVydmlldzoKIAkgKgpAQCAtNDIyMiwxNiArNDI1MSwzOCBAQAogCSAqIGluaXRpYXRvciBvciBzZXJ2aWNlIGFjdGlvbiBhbmQgc2hhbGwgdGVybWluYXRlIHdpdGggYSBSRVNFUlZBVElPTgogCSAqIENPTkZMSUNUIHN0YXR1cy4KIAkgKi8KLQlpZiAoZGV2LT5kZXZfZmxhZ3MgJiBERl9TUEMyX1JFU0VSVkFUSU9OUykgeworCWlmIChjbWQtPnNlX2Rldi0+ZGV2X2ZsYWdzICYgREZfU1BDMl9SRVNFUlZBVElPTlMpIHsKIAkJcHJfZXJyKCJSZWNlaXZlZCBQRVJTSVNURU5UX1JFU0VSVkUgQ0RCIHdoaWxlIGxlZ2FjeSIKIAkJCSIgU1BDLTIgcmVzZXJ2YXRpb24gaXMgaGVsZCwgcmV0dXJuaW5nIgogCQkJIiBSRVNFUlZBVElPTl9DT05GTElDVFxuIik7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOwogCX0KIAotCXJldHVybiAoY2RiWzBdID09IFBFUlNJU1RFTlRfUkVTRVJWRV9PVVQpID8KLQkgICAgICAgY29yZV9zY3NpM19lbXVsYXRlX3ByX291dChjbWQsIGNkYikgOgotCSAgICAgICBjb3JlX3Njc2kzX2VtdWxhdGVfcHJfaW4oY21kLCBjZGIpOworCXN3aXRjaCAoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZikgeworCWNhc2UgUFJJX1JFQURfS0VZUzoKKwkJcmV0ID0gY29yZV9zY3NpM19wcmlfcmVhZF9rZXlzKGNtZCk7CisJCWJyZWFrOworCWNhc2UgUFJJX1JFQURfUkVTRVJWQVRJT046CisJCXJldCA9IGNvcmVfc2NzaTNfcHJpX3JlYWRfcmVzZXJ2YXRpb24oY21kKTsKKwkJYnJlYWs7CisJY2FzZSBQUklfUkVQT1JUX0NBUEFCSUxJVElFUzoKKwkJcmV0ID0gY29yZV9zY3NpM19wcmlfcmVwb3J0X2NhcGFiaWxpdGllcyhjbWQpOworCQlicmVhazsKKwljYXNlIFBSSV9SRUFEX0ZVTExfU1RBVFVTOgorCQlyZXQgPSBjb3JlX3Njc2kzX3ByaV9yZWFkX2Z1bGxfc3RhdHVzKGNtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiVW5rbm93biBQRVJTSVNURU5UX1JFU0VSVkVfSU4gc2VydmljZSIKKwkJCSIgYWN0aW9uOiAweCUwMnhcbiIsIGNtZC0+dF90YXNrX2NkYlsxXSAmIDB4MWYpOworCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOworCQlicmVhazsKKwl9CisKKwlpZiAoIXJldCkgeworCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgY29yZV9wdF9yZXNlcnZhdGlvbl9jaGVjayhzdHJ1Y3Qgc2VfY21kICpjbWQsIHUzMiAqcHJfcmVzX3R5cGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuaAppbmRleCBjOGY0N2QwLi5iOTdmNjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmgKQEAgLTQ3LDcgKzQ3LDggQEAKIAogZXh0ZXJuIGludCBjb3JlX3ByX2R1bXBfaW5pdGlhdG9yX3BvcnQoc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKiwKIAkJCWNoYXIgKiwgdTMyKTsKLWV4dGVybiBpbnQgY29yZV9zY3NpMl9lbXVsYXRlX2NyaChzdHJ1Y3Qgc2VfY21kICopOworZXh0ZXJuIGludCB0YXJnZXRfc2NzaTJfcmVzZXJ2YXRpb25fcmVsZWFzZShzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CitleHRlcm4gaW50IHRhcmdldF9zY3NpMl9yZXNlcnZhdGlvbl9yZXNlcnZlKHN0cnVjdCBzZV90YXNrICp0YXNrKTsKIGV4dGVybiBpbnQgY29yZV9zY3NpM19hbGxvY19hcHRwbF9yZWdpc3RyYXRpb24oCiAJCQlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICosIHU2NCwKIAkJCXVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1MzIsCkBAIC02MSw3ICs2Miw5IEBACiBleHRlcm4gdW5zaWduZWQgY2hhciAqY29yZV9zY3NpM19wcl9kdW1wX3R5cGUoaW50KTsKIGV4dGVybiBpbnQgY29yZV9zY3NpM19jaGVja19jZGJfYWJvcnRfYW5kX3ByZWVtcHQoc3RydWN0IGxpc3RfaGVhZCAqLAogCQkJCQkJICBzdHJ1Y3Qgc2VfY21kICopOwotZXh0ZXJuIGludCBjb3JlX3Njc2kzX2VtdWxhdGVfcHIoc3RydWN0IHNlX2NtZCAqKTsKKworZXh0ZXJuIGludCB0YXJnZXRfc2NzaTNfZW11bGF0ZV9wcl9pbihzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CitleHRlcm4gaW50IHRhcmdldF9zY3NpM19lbXVsYXRlX3ByX291dChzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CiBleHRlcm4gaW50IGNvcmVfc2V0dXBfcmVzZXJ2YXRpb25zKHN0cnVjdCBzZV9kZXZpY2UgKiwgaW50KTsKIAogI2VuZGlmIC8qIFRBUkdFVF9DT1JFX1BSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3BzY3NpLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wc2NzaS5jCmluZGV4IGRhZDY3MWQuLmVkMzJlMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3BzY3NpLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHNjc2kuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CkBAIC0xMDkxLDcgKzEwOTIsNyBAQAogCiAJCXJlcSA9IGJsa19tYWtlX3JlcXVlc3QocGR2LT5wZHZfc2QtPnJlcXVlc3RfcXVldWUsIGhiaW8sCiAJCQkJICAgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIXJlcSkgeworCQlpZiAoSVNfRVJSKHJlcSkpIHsKIAkJCXByX2VycigicFNDU0k6IGJsa19tYWtlX3JlcXVlc3QoKSBmYWlsZWRcbiIpOwogCQkJZ290byBmYWlsOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90bXIuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jCmluZGV4IDU3MGIxNDQuLjIxN2UyOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKQEAgLTExOCw3ICsxMTksNyBAQAogCQkvKgogCQkgKiBBbGxvdyB0aGUgcmVjZWl2ZWQgVE1SIHRvIHJldHVybiB3aXRoIEZVTkNUSU9OX0NPTVBMRVRFLgogCQkgKi8KLQkJaWYgKHRtciAmJiAodG1yX3AgPT0gdG1yKSkKKwkJaWYgKHRtcl9wID09IHRtcikKIAkJCWNvbnRpbnVlOwogCiAJCWNtZCA9IHRtcl9wLT50YXNrX2NtZDsKQEAgLTE0NywxOSArMTQ4LDE4IEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJmNtZC0+dF9zdGF0ZV9sb2NrKTsKIAotCQlsaXN0X21vdmVfdGFpbCgmdG1yLT50bXJfbGlzdCwgJmRyYWluX3Rtcl9saXN0KTsKKwkJbGlzdF9tb3ZlX3RhaWwoJnRtcl9wLT50bXJfbGlzdCwgJmRyYWluX3Rtcl9saXN0KTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zZV90bXJfbG9jaywgZmxhZ3MpOwogCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZkcmFpbl90bXJfbGlzdCkpIHsKLQkJdG1yID0gbGlzdF9lbnRyeShkcmFpbl90bXJfbGlzdC5uZXh0LCBzdHJ1Y3Qgc2VfdG1yX3JlcSwgdG1yX2xpc3QpOwotCQlsaXN0X2RlbCgmdG1yLT50bXJfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcl9wLCB0bXJfcHAsICZkcmFpbl90bXJfbGlzdCwgdG1yX2xpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmdG1yX3AtPnRtcl9saXN0KTsKIAkJY21kID0gdG1yX3AtPnRhc2tfY21kOwogCiAJCXByX2RlYnVnKCJMVU5fUkVTRVQ6ICVzIHJlbGVhc2luZyBUTVIgJXAgRnVuY3Rpb246IDB4JTAyeCwiCiAJCQkiIFJlc3BvbnNlOiAweCUwMngsIHRfc3RhdGU6ICVkXG4iLAotCQkJKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QpID8gIlByZWVtcHQiIDogIiIsIHRtciwKLQkJCXRtci0+ZnVuY3Rpb24sIHRtci0+cmVzcG9uc2UsIGNtZC0+dF9zdGF0ZSk7CisJCQkocHJlZW1wdF9hbmRfYWJvcnRfbGlzdCkgPyAiUHJlZW1wdCIgOiAiIiwgdG1yX3AsCisJCQl0bXJfcC0+ZnVuY3Rpb24sIHRtcl9wLT5yZXNwb25zZSwgY21kLT50X3N0YXRlKTsKIAogCQl0cmFuc3BvcnRfY21kX2ZpbmlzaF9hYm9ydChjbWQsIDEpOwogCX0KQEAgLTMzMCwxNiArMzMwLDYgQEAKIAkJICovCiAJCWlmIChwcm91dF9jbWQgPT0gY21kKQogCQkJY29udGludWU7Ci0JCS8qCi0JCSAqIFNraXAgZGlyZWN0IHByb2Nlc3Npbmcgb2YgVFJBTlNQT1JUX0ZSRUVfQ01EX0lOVFIgZm9yCi0JCSAqIEhXIHRhcmdldCBtb2RlIGZhYnJpY3MuCi0JCSAqLwotCQlzcGluX2xvY2soJmNtZC0+dF9zdGF0ZV9sb2NrKTsKLQkJaWYgKGNtZC0+dF9zdGF0ZSA9PSBUUkFOU1BPUlRfRlJFRV9DTURfSU5UUikgewotCQkJc3Bpbl91bmxvY2soJmNtZC0+dF9zdGF0ZV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZjbWQtPnRfc3RhdGVfbG9jayk7CiAKIAkJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9xdWV1ZV9hY3RpdmUsIDApOwogCQlhdG9taWNfZGVjKCZxb2JqLT5xdWV1ZV9jbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHBnLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYwppbmRleCA0OWZkMGE5Li44ZGRkMTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCmluZGV4IGQ3NTI1NTguLjM0MDBhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CkBAIC01Miw2ICs1Myw3IEBACiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmg+CiAKICNpbmNsdWRlICJ0YXJnZXRfY29yZV9hbHVhLmgiCisjaW5jbHVkZSAidGFyZ2V0X2NvcmVfY2RiLmgiCiAjaW5jbHVkZSAidGFyZ2V0X2NvcmVfaGJhLmgiCiAjaW5jbHVkZSAidGFyZ2V0X2NvcmVfcHIuaCIKICNpbmNsdWRlICJ0YXJnZXRfY29yZV91YS5oIgpAQCAtMjY4LDYgKzI3MCw5IEBACiAJfQogCUlOSVRfTElTVF9IRUFEKCZzZV9zZXNzLT5zZXNzX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZzZV9zZXNzLT5zZXNzX2FjbF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmc2Vfc2Vzcy0+c2Vzc19jbWRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnNlX3Nlc3MtPnNlc3Nfd2FpdF9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jayk7CiAKIAlyZXR1cm4gc2Vfc2VzczsKIH0KQEAgLTUxNCwxMyArNTE5LDE2IEBACiAJCQkgKiBTb21lIGZhYnJpYyBtb2R1bGVzIGxpa2UgdGNtX2xvb3AgY2FuIHJlbGVhc2UKIAkJCSAqIHRoZWlyIGludGVybmFsbHkgYWxsb2NhdGVkIEkvTyByZWZlcmVuY2Ugbm93IGFuZAogCQkJICogc3RydWN0IHNlX2NtZCBub3cuCisJCQkgKgorCQkJICogRmFicmljIG1vZHVsZXMgYXJlIGV4cGVjdGVkIHRvIHJldHVybiAnMScgaGVyZSBpZiB0aGUKKwkJCSAqIHNlX2NtZCBiZWluZyBwYXNzZWQgaXMgcmVsZWFzZWQgYXQgdGhpcyBwb2ludCwKKwkJCSAqIG9yIHplcm8gaWYgbm90IGJlaW5nIHJlbGVhc2VkLgogCQkJICovCiAJCQlpZiAoY21kLT5zZV90Zm8tPmNoZWNrX3N0b3BfZnJlZSAhPSBOVUxMKSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKIAkJCQkJJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKLQkJCQljbWQtPnNlX3Rmby0+Y2hlY2tfc3RvcF9mcmVlKGNtZCk7Ci0JCQkJcmV0dXJuIDE7CisJCQkJcmV0dXJuIGNtZC0+c2VfdGZvLT5jaGVja19zdG9wX2ZyZWUoY21kKTsKIAkJCX0KIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwpAQCAtNzMwLDYgKzczOCwxMCBAQAogCQljb21wbGV0ZSgmdGFzay0+dGFza19zdG9wX2NvbXApOwogCQlyZXR1cm47CiAJfQorCisJaWYgKCFzdWNjZXNzKQorCQljbWQtPnRfdGFza3NfZmFpbGVkID0gMTsKKwogCS8qCiAJICogRGVjcmVtZW50IHRoZSBvdXRzdGFuZGluZyB0X3Rhc2tfY2Ric19sZWZ0IGNvdW50LiAgVGhlIGxhc3QKIAkgKiBzdHJ1Y3Qgc2VfdGFzayBmcm9tIHN0cnVjdCBzZV9jbWQgd2lsbCBjb21wbGV0ZSBpdHNlbGYgaW50byB0aGUKQEAgLTc0MCw3ICs3NTIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKCFzdWNjZXNzIHx8IGNtZC0+dF90YXNrc19mYWlsZWQpIHsKKwlpZiAoY21kLT50X3Rhc2tzX2ZhaWxlZCkgewogCQlpZiAoIXRhc2stPnRhc2tfZXJyb3Jfc3RhdHVzKSB7CiAJCQl0YXNrLT50YXNrX2Vycm9yX3N0YXR1cyA9CiAJCQkJUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7CkBAIC05MDgsNyArOTIwLDcgQEAKIH0KIAogLyoKLSAqIEhhbmRsZSBRVUVVRV9GVUxMIC8gLUVBR0FJTiBzdGF0dXMKKyAqIEhhbmRsZSBRVUVVRV9GVUxMIC8gLUVBR0FJTiBhbmQgLUVOT01FTSBzdGF0dXMKICAqLwogCiBzdGF0aWMgdm9pZCB0YXJnZXRfcWZfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0xNDk4LDExICsxNTEwLDEyIEBACiAJSU5JVF9MSVNUX0hFQUQoJmNtZC0+c2Vfb3JkZXJlZF9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT5zZV9xZl9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT5zZV9xdWV1ZV9ub2RlKTsKLQorCUlOSVRfTElTVF9IRUFEKCZjbWQtPnNlX2NtZF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT50X3Rhc2tfbGlzdCk7CiAJaW5pdF9jb21wbGV0aW9uKCZjbWQtPnRyYW5zcG9ydF9sdW5fZmVfc3RvcF9jb21wKTsKIAlpbml0X2NvbXBsZXRpb24oJmNtZC0+dHJhbnNwb3J0X2x1bl9zdG9wX2NvbXApOwogCWluaXRfY29tcGxldGlvbigmY21kLT50X3RyYW5zcG9ydF9zdG9wX2NvbXApOworCWluaXRfY29tcGxldGlvbigmY21kLT5jbWRfd2FpdF9jb21wKTsKIAlzcGluX2xvY2tfaW5pdCgmY21kLT50X3N0YXRlX2xvY2spOwogCWF0b21pY19zZXQoJmNtZC0+dHJhbnNwb3J0X2Rldl9hY3RpdmUsIDEpOwogCkBAIC0xNjQ1LDkgKzE2NTgsNyBAQAogCSAqIGFuZCBjYWxsIHRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZSgpIGlmIG5lY2Vzc2FyeS4uCiAJICovCiAJcmV0ID0gdHJhbnNwb3J0X2dlbmVyaWNfbmV3X2NtZChjbWQpOwotCWlmIChyZXQgPT0gLUVBR0FJTikKLQkJcmV0dXJuIDA7Ci0JZWxzZSBpZiAocmV0IDwgMCkgeworCWlmIChyZXQgPCAwKSB7CiAJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IHJldDsKIAkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCwgMCwKIAkJCQkoY21kLT5kYXRhX2RpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKSk7CkBAIC0xNzE3LDEzICsxNzI4LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX3Rtcik7CiAKLXZvaWQgdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWRfaW50cigKLQlzdHJ1Y3Qgc2VfY21kICpjbWQpCi17Ci0JdHJhbnNwb3J0X2FkZF9jbWRfdG9fcXVldWUoY21kLCBUUkFOU1BPUlRfRlJFRV9DTURfSU5UUiwgZmFsc2UpOwotfQotRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZF9pbnRyKTsKLQogLyoKICAqIElmIHRoZSB0YXNrIGlzIGFjdGl2ZSwgcmVxdWVzdCBpdCB0byBiZSBzdG9wcGVkIGFuZCBzbGVlcCB1bnRpbCBpdAogICogaGFzIGNvbXBsZXRlZC4KQEAgLTE4ODYsNyArMTg5MCw3IEBACiAJCQkJQVNDUV8yQ0hfUFJFVklPVVNfUkVTRVJWQVRJT05fQ09ORkxJQ1RfU1RBVFVTKTsKIAogCQlyZXQgPSBjbWQtPnNlX3Rmby0+cXVldWVfc3RhdHVzKGNtZCk7Ci0JCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRU5PTUVNKQogCQkJZ290byBxdWV1ZV9mdWxsOwogCQlnb3RvIGNoZWNrX3N0b3A7CiAJY2FzZSBQWVhfVFJBTlNQT1JUX1VTRV9TRU5TRV9SRUFTT046CkBAIC0xOTEzLDcgKzE5MTcsNyBAQAogCWVsc2UgewogCQlyZXQgPSB0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKGNtZCwKIAkJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uLCAwKTsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQlpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9NRU0pCiAJCQlnb3RvIHF1ZXVlX2Z1bGw7CiAJfQogCkBAIC0yMTUzLDYyICsyMTU3LDIwIEBACiAJCWF0b21pY19zZXQoJmNtZC0+dF90cmFuc3BvcnRfc2VudCwgMSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogVGhlIHN0cnVjdCBzZV9jbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYigpIGZ1bmN0aW9uIHBvaW50ZXIgaXMgdXNlZAotCSAqIHRvIGdyYWIgUkVQT1JUX0xVTlMgYW5kIG90aGVyIENEQnMgd2Ugd2FudCB0byBoYW5kbGUgYmVmb3JlIHRoZXkgaGl0IHRoZQotCSAqIHN0cnVjdCBzZV9zdWJzeXN0ZW1fYXBpLT5kb190YXNrKCkgY2FsbGVyIGJlbG93LgotCSAqLwotCWlmIChjbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYikgewotCQllcnJvciA9IGNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiKGNtZCk7Ci0JCWlmIChlcnJvciAhPSAwKSB7Ci0JCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPSBlcnJvcjsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQkJdGFzay0+dGFza19mbGFncyAmPSB+VEZfQUNUSVZFOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJCWF0b21pY19zZXQoJmNtZC0+dF90cmFuc3BvcnRfc2VudCwgMCk7Ci0JCQl0cmFuc3BvcnRfc3RvcF90YXNrc19mb3JfY21kKGNtZCk7Ci0JCQlhdG9taWNfaW5jKCZkZXYtPmRlcHRoX2xlZnQpOwotCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCwgMCwgMSk7Ci0JCQlnb3RvIGNoZWNrX2RlcHRoOwotCQl9Ci0JCS8qCi0JCSAqIEhhbmRsZSB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGZvciB0cmFuc3BvcnRfZW11bGF0ZV9jZGIoKQotCQkgKiBmb3Igc3luY2hyb25vdXMgb3BlcmF0aW9uLCBmb2xsb3dpbmcgU0NGX0VNVUxBVEVfQ0RCX0FTWU5DCi0JCSAqIE90aGVyd2lzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrIHdpdGgKLQkJICogcHJvcGVyIHN0YXR1cy4KLQkJICovCi0JCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX0VNVUxBVEVfQ0RCX0FTWU5DKSkgewotCQkJY21kLT5zY3NpX3N0YXR1cyA9IFNBTV9TVEFUX0dPT0Q7Ci0JCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKLQkJCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogQ3VycmVudGx5IGZvciBhbGwgdmlydHVhbCBUQ00gcGx1Z2lucyBpbmNsdWRpbmcgSUJMT0NLLCBGSUxFSU8gYW5kCi0JCSAqIFJBTURJU0sgd2UgdXNlIHRoZSBpbnRlcm5hbCB0cmFuc3BvcnRfZW11bGF0ZV9jb250cm9sX2NkYigpIGxvZ2ljCi0JCSAqIHdpdGggc3RydWN0IHNlX3N1YnN5c3RlbV9hcGkgY2FsbGVycyBmb3IgdGhlIHByaW1hcnkgU1BDLTMgVFlQRV9ESVNLCi0JCSAqIExVTiBlbXVsYXRpb24gY29kZS4KLQkJICoKLQkJICogRm9yIFRDTS9wU0NTSSBhbmQgYWxsIG90aGVyIFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCIEkvTyB0YXNrcyB3ZQotCQkgKiBjYWxsIC0+ZG9fdGFzaygpIGRpcmVjdGx5IGFuZCBsZXQgdGhlIHVuZGVybHlpbmcgVENNIHN1YnN5c3RlbSBwbHVnaW4KLQkJICogY29kZSBoYW5kbGUgdGhlIENEQiBlbXVsYXRpb24uCi0JCSAqLwotCQlpZiAoKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSAhPSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVikgJiYKLQkJICAgICghKHRhc2stPnRhc2tfc2VfY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQikpKQotCQkJZXJyb3IgPSB0cmFuc3BvcnRfZW11bGF0ZV9jb250cm9sX2NkYih0YXNrKTsKLQkJZWxzZQotCQkJZXJyb3IgPSBkZXYtPnRyYW5zcG9ydC0+ZG9fdGFzayh0YXNrKTsKIAotCQlpZiAoZXJyb3IgIT0gMCkgewotCQkJY21kLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzID0gZXJyb3I7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJCXRhc2stPnRhc2tfZmxhZ3MgJj0gflRGX0FDVElWRTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCQlhdG9taWNfc2V0KCZjbWQtPnRfdHJhbnNwb3J0X3NlbnQsIDApOwotCQkJdHJhbnNwb3J0X3N0b3BfdGFza3NfZm9yX2NtZChjbWQpOwotCQkJYXRvbWljX2luYygmZGV2LT5kZXB0aF9sZWZ0KTsKLQkJCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQsIDAsIDEpOwotCQl9CisJaWYgKGNtZC0+ZXhlY3V0ZV90YXNrKQorCQllcnJvciA9IGNtZC0+ZXhlY3V0ZV90YXNrKHRhc2spOworCWVsc2UKKwkJZXJyb3IgPSBkZXYtPnRyYW5zcG9ydC0+ZG9fdGFzayh0YXNrKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPSBlcnJvcjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXRhc2stPnRhc2tfZmxhZ3MgJj0gflRGX0FDVElWRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9zZW50LCAwKTsKKwkJdHJhbnNwb3J0X3N0b3BfdGFza3NfZm9yX2NtZChjbWQpOworCQlhdG9taWNfaW5jKCZkZXYtPmRlcHRoX2xlZnQpOworCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kLCAwLCAxKTsKIAl9CiAKIAlnb3RvIGNoZWNrX2RlcHRoOwpAQCAtMjY0Miw2ICsyNjA0LDEzIEBACiAJCSAqLwogCX0KIAorCS8qCisJICogSWYgd2Ugb3BlcmF0ZSBpbiBwYXNzdGhyb3VnaCBtb2RlIHdlIHNraXAgbW9zdCBDREIgZW11bGF0aW9uIGFuZAorCSAqIGluc3RlYWQgaGFuZCB0aGUgY29tbWFuZHMgZG93biB0byB0aGUgcGh5c2ljYWwgU0NTSSBkZXZpY2UuCisJICovCisJcGFzc3Rocm91Z2ggPQorCQkoZGV2LT50cmFuc3BvcnQtPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKTsKKwogCXN3aXRjaCAoY2RiWzBdKSB7CiAJY2FzZSBSRUFEXzY6CiAJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfNihjZGIsIGNtZCwgJnNlY3Rvcl9yZXQpOwpAQCAtMjcyMSw5ICsyNjkwLDEyIEBACiAJCWNtZC0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMzIoY2RiKTsKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfREFUQV9TR19JT19DREI7CiAKLQkJaWYgKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSA9PQotCQkJCVRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKQorCQkvKgorCQkgKiBEbyBub3cgYWxsb3cgQklESSBjb21tYW5kcyBmb3IgcGFzc3Rocm91Z2ggbW9kZS4KKwkJICovCisJCWlmIChwYXNzdGhyb3VnaCkKIAkJCWdvdG8gb3V0X3Vuc3VwcG9ydGVkX2NkYjsKKwogCQkvKgogCQkgKiBTZXR1cCBCSURJIFhPUiBjYWxsYmFjayB0byBiZSBydW4gYWZ0ZXIgSS9PIGNvbXBsZXRpb24uCiAJCSAqLwpAQCAtMjczMiwxMyArMjcwNCw2IEBACiAJCWJyZWFrOwogCWNhc2UgVkFSSUFCTEVfTEVOR1RIX0NNRDoKIAkJc2VydmljZV9hY3Rpb24gPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNkYls4XSk7Ci0JCS8qCi0JCSAqIERldGVybWluZSBpZiB0aGlzIGlzIFRDTS9QU0NTSSBkZXZpY2UgYW5kIHdlIHNob3VsZCBkaXNhYmxlCi0JCSAqIGludGVybmFsIGVtdWxhdGlvbiBmb3IgdGhpcyBDREIuCi0JCSAqLwotCQlwYXNzdGhyb3VnaCA9IChkZXYtPnRyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0KLQkJCQkJVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpOwotCiAJCXN3aXRjaCAoc2VydmljZV9hY3Rpb24pIHsKIAkJY2FzZSBYRFdSSVRFUkVBRF8zMjoKIAkJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMzIoY2RiLCBjbWQsICZzZWN0b3JfcmV0KTsKQEAgLTI3NTIsOCArMjcxNywxMiBAQAogCQkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV82NF9leHQoY2RiKTsKIAkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCOwogCisJCQkvKgorCQkJICogRG8gbm93IGFsbG93IEJJREkgY29tbWFuZHMgZm9yIHBhc3N0aHJvdWdoIG1vZGUuCisJCQkgKi8KIAkJCWlmIChwYXNzdGhyb3VnaCkKIAkJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CisKIAkJCS8qCiAJCQkgKiBTZXR1cCBCSURJIFhPUiBjYWxsYmFjayB0byBiZSBydW4gZHVyaW5nIGFmdGVyIEkvTwogCQkJICogY29tcGxldGlvbi4KQEAgLTI3NzksNyArMjc0OCw4IEBACiAKIAkJCWlmICh0YXJnZXRfY2hlY2tfd3JpdGVfc2FtZV9kaXNjYXJkKCZjZGJbMTBdLCBkZXYpIDwgMCkKIAkJCQlnb3RvIG91dF9pbnZhbGlkX2NkYl9maWVsZDsKLQorCQkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX3dyaXRlX3NhbWU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByX2VycigiVkFSSUFCTEVfTEVOR1RIX0NNRCBzZXJ2aWNlIGFjdGlvbiIKQEAgLTI3OTMsMTIgKzI3NjMsMTAgQEAKIAkJCS8qCiAJCQkgKiBDaGVjayBmb3IgZW11bGF0ZWQgTUlfUkVQT1JUX1RBUkdFVF9QR1MuCiAJCQkgKi8KLQkJCWlmIChjZGJbMV0gPT0gTUlfUkVQT1JUX1RBUkdFVF9QR1MpIHsKLQkJCQljbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYiA9Ci0JCQkJKHN1X2Rldi0+dDEwX2FsdWEuYWx1YV90eXBlID09Ci0JCQkJIFNQQzNfQUxVQV9FTVVMQVRFRCkgPwotCQkJCWNvcmVfZW11bGF0ZV9yZXBvcnRfdGFyZ2V0X3BvcnRfZ3JvdXBzIDoKLQkJCQlOVUxMOworCQkJaWYgKGNkYlsxXSA9PSBNSV9SRVBPUlRfVEFSR0VUX1BHUyAmJgorCQkJICAgIHN1X2Rldi0+dDEwX2FsdWEuYWx1YV90eXBlID09IFNQQzNfQUxVQV9FTVVMQVRFRCkgeworCQkJCWNtZC0+ZXhlY3V0ZV90YXNrID0KKwkJCQkJdGFyZ2V0X2VtdWxhdGVfcmVwb3J0X3RhcmdldF9wb3J0X2dyb3VwczsKIAkJCX0KIAkJCXNpemUgPSAoY2RiWzZdIDw8IDI0KSB8IChjZGJbN10gPDwgMTYpIHwKIAkJCSAgICAgICAoY2RiWzhdIDw8IDgpIHwgY2RiWzldOwpAQCAtMjgxOSw4ICsyNzg3LDE1IEBACiAJY2FzZSBNT0RFX1NFTlNFOgogCQlzaXplID0gY2RiWzRdOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKKwkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCWNtZC0+ZXhlY3V0ZV90YXNrID0gdGFyZ2V0X2VtdWxhdGVfbW9kZXNlbnNlOwogCQlicmVhazsKIAljYXNlIE1PREVfU0VOU0VfMTA6CisJCXNpemUgPSAoY2RiWzddIDw8IDgpICsgY2RiWzhdOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKKwkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCWNtZC0+ZXhlY3V0ZV90YXNrID0gdGFyZ2V0X2VtdWxhdGVfbW9kZXNlbnNlOworCQlicmVhazsKIAljYXNlIEdQQ01EX1JFQURfQlVGRkVSX0NBUEFDSVRZOgogCWNhc2UgR1BDTURfU0VORF9PUEM6CiAJY2FzZSBMT0dfU0VMRUNUOgpAQCAtMjg0MCwxMSArMjgxNSwxNCBAQAogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBQRVJTSVNURU5UX1JFU0VSVkVfSU46CisJCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfc2NzaTNfZW11bGF0ZV9wcl9pbjsKKwkJc2l6ZSA9IChjZGJbN10gPDwgOCkgKyBjZGJbOF07CisJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOworCQlicmVhazsKIAljYXNlIFBFUlNJU1RFTlRfUkVTRVJWRV9PVVQ6Ci0JCWNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiID0KLQkJCShzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PQotCQkJIFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlMpID8KLQkJCWNvcmVfc2NzaTNfZW11bGF0ZV9wciA6IE5VTEw7CisJCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfc2NzaTNfZW11bGF0ZV9wcl9vdXQ7CiAJCXNpemUgPSAoY2RiWzddIDw8IDgpICsgY2RiWzhdOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CkBAIC0yODYzLDEyICsyODQxLDEwIEBACiAJCQkgKgogCQkJICogQ2hlY2sgZm9yIGVtdWxhdGVkIE1PX1NFVF9UQVJHRVRfUEdTLgogCQkJICovCi0JCQlpZiAoY2RiWzFdID09IE1PX1NFVF9UQVJHRVRfUEdTKSB7Ci0JCQkJY21kLT50cmFuc3BvcnRfZW11bGF0ZV9jZGIgPQotCQkJCShzdV9kZXYtPnQxMF9hbHVhLmFsdWFfdHlwZSA9PQotCQkJCQlTUEMzX0FMVUFfRU1VTEFURUQpID8KLQkJCQljb3JlX2VtdWxhdGVfc2V0X3RhcmdldF9wb3J0X2dyb3VwcyA6Ci0JCQkJTlVMTDsKKwkJCWlmIChjZGJbMV0gPT0gTU9fU0VUX1RBUkdFVF9QR1MgJiYKKwkJCSAgICBzdV9kZXYtPnQxMF9hbHVhLmFsdWFfdHlwZSA9PSBTUEMzX0FMVUFfRU1VTEFURUQpIHsKKwkJCQljbWQtPmV4ZWN1dGVfdGFzayA9CisJCQkJCXRhcmdldF9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHM7CiAJCQl9CiAKIAkJCXNpemUgPSAoY2RiWzZdIDw8IDI0KSB8IChjZGJbN10gPDwgMTYpIHwKQEAgLTI4ODgsNiArMjg2NCw4IEBACiAJCWlmIChjbWQtPnNlX2Rldi0+ZGV2X3Rhc2tfYXR0cl90eXBlID09IFNBTV9UQVNLX0FUVFJfRU1VTEFURUQpCiAJCQljbWQtPnNhbV90YXNrX2F0dHIgPSBNU0dfSEVBRF9UQUc7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOworCQlpZiAoIXBhc3N0aHJvdWdoKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfZW11bGF0ZV9pbnF1aXJ5OwogCQlicmVhazsKIAljYXNlIFJFQURfQlVGRkVSOgogCQlzaXplID0gKGNkYls2XSA8PCAxNikgKyAoY2RiWzddIDw8IDgpICsgY2RiWzhdOwpAQCAtMjg5Niw2ICsyODc0LDggQEAKIAljYXNlIFJFQURfQ0FQQUNJVFk6CiAJCXNpemUgPSBSRUFEX0NBUF9MRU47CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOworCQlpZiAoIXBhc3N0aHJvdWdoKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfZW11bGF0ZV9yZWFkY2FwYWNpdHk7CiAJCWJyZWFrOwogCWNhc2UgUkVBRF9NRURJQV9TRVJJQUxfTlVNQkVSOgogCWNhc2UgU0VDVVJJVFlfUFJPVE9DT0xfSU46CkBAIC0yOTA0LDYgKzI4ODQsMjEgQEAKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CiAJCWJyZWFrOwogCWNhc2UgU0VSVklDRV9BQ1RJT05fSU46CisJCXN3aXRjaCAoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZikgeworCQljYXNlIFNBSV9SRUFEX0NBUEFDSVRZXzE2OgorCQkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCQljbWQtPmV4ZWN1dGVfdGFzayA9CisJCQkJCXRhcmdldF9lbXVsYXRlX3JlYWRjYXBhY2l0eV8xNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHBhc3N0aHJvdWdoKQorCQkJCWJyZWFrOworCisJCQlwcl9lcnIoIlVuc3VwcG9ydGVkIFNBOiAweCUwMnhcbiIsCisJCQkJY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZik7CisJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CisJCX0KKwkJLypGQUxMVEhST1VHSCovCiAJY2FzZSBBQ0NFU1NfQ09OVFJPTF9JTjoKIAljYXNlIEFDQ0VTU19DT05UUk9MX09VVDoKIAljYXNlIEVYVEVOREVEX0NPUFk6CkBAIC0yOTM0LDYgKzI5MjksOCBAQAogCWNhc2UgUkVRVUVTVF9TRU5TRToKIAkJc2l6ZSA9IGNkYls0XTsKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CisJCWlmICghcGFzc3Rocm91Z2gpCisJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX3JlcXVlc3Rfc2Vuc2U7CiAJCWJyZWFrOwogCWNhc2UgUkVBRF9FTEVNRU5UX1NUQVRVUzoKIAkJc2l6ZSA9IDY1NTM2ICogY2RiWzddICsgMjU2ICogY2RiWzhdICsgY2RiWzldOwpAQCAtMjk2MSwxMCArMjk1OCw4IEBACiAJCSAqIGlzIHJ1bm5pbmcgaW4gU1BDX1BBU1NUSFJPVUdILCBhbmQgd2FudHMgcmVzZXJ2YXRpb25zCiAJCSAqIGVtdWxhdGlvbiBkaXNhYmxlZC4KIAkJICovCi0JCWNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiID0KLQkJCQkoc3VfZGV2LT50MTBfcHIucmVzX3R5cGUgIT0KLQkJCQkgU1BDX1BBU1NUSFJPVUdIKSA/Ci0JCQkJY29yZV9zY3NpMl9lbXVsYXRlX2NyaCA6IE5VTEw7CisJCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSAhPSBTUENfUEFTU1RIUk9VR0gpCisJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9zY3NpMl9yZXNlcnZhdGlvbl9yZXNlcnZlOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9OT05fREFUQV9DREI7CiAJCWJyZWFrOwogCWNhc2UgUkVMRUFTRToKQEAgLTI5NzgsMTAgKzI5NzMsOCBAQAogCQllbHNlCiAJCQlzaXplID0gY21kLT5kYXRhX2xlbmd0aDsKIAotCQljbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYiA9Ci0JCQkJKHN1X2Rldi0+dDEwX3ByLnJlc190eXBlICE9Ci0JCQkJIFNQQ19QQVNTVEhST1VHSCkgPwotCQkJCWNvcmVfc2NzaTJfZW11bGF0ZV9jcmggOiBOVUxMOworCQlpZiAoc3VfZGV2LT50MTBfcHIucmVzX3R5cGUgIT0gU1BDX1BBU1NUSFJPVUdIKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfc2NzaTJfcmVzZXJ2YXRpb25fcmVsZWFzZTsKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfTk9OX0RBVEFfQ0RCOwogCQlicmVhazsKIAljYXNlIFNZTkNIUk9OSVpFX0NBQ0hFOgpAQCAtMzAwMiwxNiArMjk5NSw5IEBACiAJCXNpemUgPSB0cmFuc3BvcnRfZ2V0X3NpemUoc2VjdG9ycywgY2RiLCBjbWQpOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9OT05fREFUQV9DREI7CiAKLQkJLyoKLQkJICogRm9yIFRDTS9wU0NTSSBwYXNzdGhyb3VnaCwgc2tpcCBjbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYigpCi0JCSAqLwotCQlpZiAoZGV2LT50cmFuc3BvcnQtPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKQorCQlpZiAocGFzc3Rocm91Z2gpCiAJCQlicmVhazsKLQkJLyoKLQkJICogU2V0IFNDRl9FTVVMQVRFX0NEQl9BU1lOQyB0byBlbnN1cmUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbgotCQkgKiBmb3IgU1lOQ0hST05JWkVfQ0FDSEUqIEltbWVkPTEgY2FzZSBpbiBfX3RyYW5zcG9ydF9leGVjdXRlX3Rhc2tzKCkKLQkJICovCi0JCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9FTVVMQVRFX0NEQl9BU1lOQzsKKwogCQkvKgogCQkgKiBDaGVjayB0byBlbnN1cmUgdGhhdCBMQkEgKyBSYW5nZSBkb2VzIG5vdCBleGNlZWQgcGFzdCBlbmQgb2YKIAkJICogZGV2aWNlIGZvciBJQkxPQ0sgYW5kIEZJTEVJTyAtPmRvX3N5bmNfY2FjaGUoKSBiYWNrZW5kIGNhbGxzCkBAIC0zMDIwLDEwICszMDA2LDEzIEBACiAJCQlpZiAodHJhbnNwb3J0X2NtZF9nZXRfdmFsaWRfc2VjdG9ycyhjbWQpIDwgMCkKIAkJCQlnb3RvIG91dF9pbnZhbGlkX2NkYl9maWVsZDsKIAkJfQorCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX3N5bmNocm9uaXplX2NhY2hlOwogCQlicmVhazsKIAljYXNlIFVOTUFQOgogCQlzaXplID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZjZGJbN10pOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKKwkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCWNtZC0+ZXhlY3V0ZV90YXNrID0gdGFyZ2V0X2VtdWxhdGVfdW5tYXA7CiAJCWJyZWFrOwogCWNhc2UgV1JJVEVfU0FNRV8xNjoKIAkJc2VjdG9ycyA9IHRyYW5zcG9ydF9nZXRfc2VjdG9yc18xNihjZGIsIGNtZCwgJnNlY3Rvcl9yZXQpOwpAQCAtMzA0Miw2ICszMDMxLDggQEAKIAogCQlpZiAodGFyZ2V0X2NoZWNrX3dyaXRlX3NhbWVfZGlzY2FyZCgmY2RiWzFdLCBkZXYpIDwgMCkKIAkJCWdvdG8gb3V0X2ludmFsaWRfY2RiX2ZpZWxkOworCQlpZiAoIXBhc3N0aHJvdWdoKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lOwogCQlicmVhazsKIAljYXNlIFdSSVRFX1NBTUU6CiAJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMTAoY2RiLCBjbWQsICZzZWN0b3JfcmV0KTsKQEAgLTMwNjMsMjYgKzMwNTQsMzEgQEAKIAkJICovCiAJCWlmICh0YXJnZXRfY2hlY2tfd3JpdGVfc2FtZV9kaXNjYXJkKCZjZGJbMV0sIGRldikgPCAwKQogCQkJZ290byBvdXRfaW52YWxpZF9jZGJfZmllbGQ7CisJCWlmICghcGFzc3Rocm91Z2gpCisJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX3dyaXRlX3NhbWU7CiAJCWJyZWFrOwogCWNhc2UgQUxMT1dfTUVESVVNX1JFTU9WQUw6Ci0JY2FzZSBHUENNRF9DTE9TRV9UUkFDSzoKIAljYXNlIEVSQVNFOgotCWNhc2UgSU5JVElBTElaRV9FTEVNRU5UX1NUQVRVUzoKLQljYXNlIEdQQ01EX0xPQURfVU5MT0FEOgogCWNhc2UgUkVaRVJPX1VOSVQ6CiAJY2FzZSBTRUVLXzEwOgotCWNhc2UgR1BDTURfU0VUX1NQRUVEOgogCWNhc2UgU1BBQ0U6CiAJY2FzZSBTVEFSVF9TVE9QOgogCWNhc2UgVEVTVF9VTklUX1JFQURZOgogCWNhc2UgVkVSSUZZOgogCWNhc2UgV1JJVEVfRklMRU1BUktTOgorCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9OT05fREFUQV9DREI7CisJCWlmICghcGFzc3Rocm91Z2gpCisJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX25vb3A7CisJCWJyZWFrOworCWNhc2UgR1BDTURfQ0xPU0VfVFJBQ0s6CisJY2FzZSBJTklUSUFMSVpFX0VMRU1FTlRfU1RBVFVTOgorCWNhc2UgR1BDTURfTE9BRF9VTkxPQUQ6CisJY2FzZSBHUENNRF9TRVRfU1BFRUQ6CiAJY2FzZSBNT1ZFX01FRElVTToKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfTk9OX0RBVEFfQ0RCOwogCQlicmVhazsKIAljYXNlIFJFUE9SVF9MVU5TOgotCQljbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYiA9Ci0JCQkJdHJhbnNwb3J0X2NvcmVfcmVwb3J0X2x1bl9yZXNwb25zZTsKKwkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfcmVwb3J0X2x1bnM7CiAJCXNpemUgPSAoY2RiWzZdIDw8IDI0KSB8IChjZGJbN10gPDwgMTYpIHwgKGNkYls4XSA8PCA4KSB8IGNkYls5XTsKIAkJLyoKIAkJICogRG8gaW1wbGljdCBIRUFEX09GX1FVRVVFIHByb2Nlc3NpbmcgZm9yIFJFUE9SVF9MVU5TCkBAIC0zMTM0LDYgKzMxMzAsMTEgQEAKIAkJY21kLT5kYXRhX2xlbmd0aCA9IHNpemU7CiAJfQogCisJLyogcmVqZWN0IGFueSBjb21tYW5kIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGhhbmRsZXIgZm9yICovCisJaWYgKCEocGFzc3Rocm91Z2ggfHwgY21kLT5leGVjdXRlX3Rhc2sgfHwKKwkgICAgIChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCKSkpCisJCWdvdG8gb3V0X3Vuc3VwcG9ydGVkX2NkYjsKKwogCS8qIExldCdzIGxpbWl0IGNvbnRyb2wgY2RicyB0byBhIHBhZ2UsIGZvciBzaW1wbGljaXR5J3Mgc2FrZS4gKi8KIAlpZiAoKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIpICYmCiAJICAgIHNpemUgPiBQQUdFX1NJWkUpCkBAIC0zMzA4LDcgKzMzMDksNyBAQAogCQlpZiAoY21kLT5zY3NpX3N0YXR1cykgewogCQkJcmV0ID0gdHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZSgKIAkJCQkJY21kLCByZWFzb24sIDEpOwotCQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRU5PTUVNKQogCQkJCWdvdG8gcXVldWVfZnVsbDsKIAogCQkJdHJhbnNwb3J0X2x1bl9yZW1vdmVfY21kKGNtZCk7CkBAIC0zMzMzLDcgKzMzMzQsNyBAQAogCQlzcGluX3VubG9jaygmY21kLT5zZV9sdW4tPmx1bl9zZXBfbG9jayk7CiAKIAkJcmV0ID0gY21kLT5zZV90Zm8tPnF1ZXVlX2RhdGFfaW4oY21kKTsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQlpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9NRU0pCiAJCQlnb3RvIHF1ZXVlX2Z1bGw7CiAJCWJyZWFrOwogCWNhc2UgRE1BX1RPX0RFVklDRToKQEAgLTMzNTQsMTQgKzMzNTUsMTQgQEAKIAkJCX0KIAkJCXNwaW5fdW5sb2NrKCZjbWQtPnNlX2x1bi0+bHVuX3NlcF9sb2NrKTsKIAkJCXJldCA9IGNtZC0+c2VfdGZvLT5xdWV1ZV9kYXRhX2luKGNtZCk7Ci0JCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCQlpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9NRU0pCiAJCQkJZ290byBxdWV1ZV9mdWxsOwogCQkJYnJlYWs7CiAJCX0KIAkJLyogRmFsbCB0aHJvdWdoIGZvciBETUFfVE9fREVWSUNFICovCiAJY2FzZSBETUFfTk9ORToKIAkJcmV0ID0gY21kLT5zZV90Zm8tPnF1ZXVlX3N0YXR1cyhjbWQpOwotCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCWlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVOT01FTSkKIAkJCWdvdG8gcXVldWVfZnVsbDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTM4OTAsNyArMzg5MSwxMCBAQAogCiBzdGF0aWMgdm9pZCB0cmFuc3BvcnRfd3JpdGVfcGVuZGluZ19xZihzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0JaWYgKGNtZC0+c2VfdGZvLT53cml0ZV9wZW5kaW5nKGNtZCkgPT0gLUVBR0FJTikgeworCWludCByZXQ7CisKKwlyZXQgPSBjbWQtPnNlX3Rmby0+d3JpdGVfcGVuZGluZyhjbWQpOworCWlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVOT01FTSkgewogCQlwcl9kZWJ1ZygiSGFuZGxpbmcgd3JpdGVfcGVuZGluZyBRVUVVRV9fRlVMTDogc2VfY21kOiAlcFxuIiwKIAkJCSBjbWQpOwogCQl0cmFuc3BvcnRfaGFuZGxlX3F1ZXVlX2Z1bGwoY21kLCBjbWQtPnNlX2Rldik7CkBAIC0zOTIwLDcgKzM5MjQsNyBAQAogCSAqIGZyb250ZW5kIGtub3cgdGhhdCBXUklURSBidWZmZXJzIGFyZSByZWFkeS4KIAkgKi8KIAlyZXQgPSBjbWQtPnNlX3Rmby0+d3JpdGVfcGVuZGluZyhjbWQpOwotCWlmIChyZXQgPT0gLUVBR0FJTikKKwlpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9NRU0pCiAJCWdvdG8gcXVldWVfZnVsbDsKIAllbHNlIGlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtMzkzMSw3ICszOTM1LDcgQEAKIAlwcl9kZWJ1ZygiSGFuZGxpbmcgd3JpdGVfcGVuZGluZyBRVUVVRV9fRlVMTDogc2VfY21kOiAlcFxuIiwgY21kKTsKIAljbWQtPnRfc3RhdGUgPSBUUkFOU1BPUlRfQ09NUExFVEVfUUZfV1A7CiAJdHJhbnNwb3J0X2hhbmRsZV9xdWV1ZV9mdWxsKGNtZCwgY21kLT5zZV9kZXYpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMzk0OSw2ICszOTUzLDE0IEBACiAJCWNvcmVfdG1yX3JlbGVhc2VfcmVxKGNtZC0+c2VfdG1yX3JlcSk7CiAJaWYgKGNtZC0+dF90YXNrX2NkYiAhPSBjbWQtPl9fdF90YXNrX2NkYikKIAkJa2ZyZWUoY21kLT50X3Rhc2tfY2RiKTsKKwkvKgorCSAqIENoZWNrIGlmIHRhcmdldF93YWl0X2Zvcl9zZXNzX2NtZHMoKSBpcyBleHBlY3RpbmcgdG8KKwkgKiByZWxlYXNlIHNlX2NtZCBkaXJlY3RseSBoZXJlLi4KKwkgKi8KKwlpZiAoY21kLT5jaGVja19yZWxlYXNlICE9IDAgJiYgY21kLT5zZV90Zm8tPmNoZWNrX3JlbGVhc2VfY21kKQorCQlpZiAoY21kLT5zZV90Zm8tPmNoZWNrX3JlbGVhc2VfY21kKGNtZCkgIT0gMCkKKwkJCXJldHVybjsKKwogCWNtZC0+c2VfdGZvLT5yZWxlYXNlX2NtZChjbWQpOwogfQogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfcmVsZWFzZV9jbWQpOwpAQCAtMzk3Niw2ICszOTg4LDExNCBAQAogfQogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZCk7CiAKKy8qIHRhcmdldF9nZXRfc2Vzc19jbWQgLSBBZGQgY29tbWFuZCB0byBhY3RpdmUgLT5zZXNzX2NtZF9saXN0CisgKiBAc2Vfc2VzczoJc2Vzc2lvbiB0byByZWZlcmVuY2UKKyAqIEBzZV9jbWQ6CWNvbW1hbmQgZGVzY3JpcHRvciB0byBhZGQKKyAqLwordm9pZCB0YXJnZXRfZ2V0X3Nlc3NfY21kKHN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzLCBzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZV9zZXNzLT5zZXNzX2NtZF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmc2VfY21kLT5zZV9jbWRfbGlzdCwgJnNlX3Nlc3MtPnNlc3NfY21kX2xpc3QpOworCXNlX2NtZC0+Y2hlY2tfcmVsZWFzZSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTCh0YXJnZXRfZ2V0X3Nlc3NfY21kKTsKKworLyogdGFyZ2V0X3B1dF9zZXNzX2NtZCAtIENoZWNrIGZvciBhY3RpdmUgSS9PIHNodXRkb3duIG9yIGxpc3QgZGVsZXRlCisgKiBAc2Vfc2VzczogCXNlc3Npb24gdG8gcmVmZXJlbmNlCisgKiBAc2VfY21kOgljb21tYW5kIGRlc2NyaXB0b3IgdG8gZHJvcAorICovCitpbnQgdGFyZ2V0X3B1dF9zZXNzX2NtZChzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2Vzcywgc3RydWN0IHNlX2NtZCAqc2VfY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZzZV9jbWQtPnNlX2NtZF9saXN0KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9zZXNzLT5zZXNzX2NtZF9sb2NrLCBmbGFncyk7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZV9zZXNzLT5zZXNzX3RlYXJpbmdfZG93biAmJiBzZV9jbWQtPmNtZF93YWl0X3NldCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9zZXNzLT5zZXNzX2NtZF9sb2NrLCBmbGFncyk7CisJCWNvbXBsZXRlKCZzZV9jbWQtPmNtZF93YWl0X2NvbXApOworCQlyZXR1cm4gMTsKKwl9CisJbGlzdF9kZWwoJnNlX2NtZC0+c2VfY21kX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlX3Nlc3MtPnNlc3NfY21kX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh0YXJnZXRfcHV0X3Nlc3NfY21kKTsKKworLyogdGFyZ2V0X3NwbGljZV9zZXNzX2NtZF9saXN0IC0gU3BsaXQgYWN0aXZlIGNtZHMgaW50byBzZXNzX3dhaXRfbGlzdAorICogQHNlX3Nlc3M6CXNlc3Npb24gdG8gc3BsaXQKKyAqLwordm9pZCB0YXJnZXRfc3BsaWNlX3Nlc3NfY21kX2xpc3Qoc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MpCit7CisJc3RydWN0IHNlX2NtZCAqc2VfY21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZzZV9zZXNzLT5zZXNzX3dhaXRfbGlzdCkpOworCUlOSVRfTElTVF9IRUFEKCZzZV9zZXNzLT5zZXNzX3dhaXRfbGlzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jaywgZmxhZ3MpOworCXNlX3Nlc3MtPnNlc3NfdGVhcmluZ19kb3duID0gMTsKKworCWxpc3Rfc3BsaWNlX2luaXQoJnNlX3Nlc3MtPnNlc3NfY21kX2xpc3QsICZzZV9zZXNzLT5zZXNzX3dhaXRfbGlzdCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlX2NtZCwgJnNlX3Nlc3MtPnNlc3Nfd2FpdF9saXN0LCBzZV9jbWRfbGlzdCkKKwkJc2VfY21kLT5jbWRfd2FpdF9zZXQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTCh0YXJnZXRfc3BsaWNlX3Nlc3NfY21kX2xpc3QpOworCisvKiB0YXJnZXRfd2FpdF9mb3Jfc2Vzc19jbWRzIC0gV2FpdCBmb3Igb3V0c3RhbmRpbmcgZGVzY3JpcHRvcnMKKyAqIEBzZV9zZXNzOiAgICBzZXNzaW9uIHRvIHdhaXQgZm9yIGFjdGl2ZSBJL08KKyAqIEB3YWl0X2Zvcl90YXNrczoJTWFrZSBleHRyYSB0cmFuc3BvcnRfd2FpdF9mb3JfdGFza3MgY2FsbAorICovCit2b2lkIHRhcmdldF93YWl0X2Zvcl9zZXNzX2NtZHMoCisJc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MsCisJaW50IHdhaXRfZm9yX3Rhc2tzKQoreworCXN0cnVjdCBzZV9jbWQgKnNlX2NtZCwgKnRtcF9jbWQ7CisJYm9vbCByYyA9IGZhbHNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlX2NtZCwgdG1wX2NtZCwKKwkJCQkmc2Vfc2Vzcy0+c2Vzc193YWl0X2xpc3QsIHNlX2NtZF9saXN0KSB7CisJCWxpc3RfZGVsKCZzZV9jbWQtPnNlX2NtZF9saXN0KTsKKworCQlwcl9kZWJ1ZygiV2FpdGluZyBmb3Igc2VfY21kOiAlcCB0X3N0YXRlOiAlZCwgZmFicmljIHN0YXRlOiIKKwkJCSIgJWRcbiIsIHNlX2NtZCwgc2VfY21kLT50X3N0YXRlLAorCQkJc2VfY21kLT5zZV90Zm8tPmdldF9jbWRfc3RhdGUoc2VfY21kKSk7CisKKwkJaWYgKHdhaXRfZm9yX3Rhc2tzKSB7CisJCQlwcl9kZWJ1ZygiQ2FsbGluZyB0cmFuc3BvcnRfd2FpdF9mb3JfdGFza3Mgc2VfY21kOiAlcCB0X3N0YXRlOiAlZCwiCisJCQkJIiBmYWJyaWMgc3RhdGU6ICVkXG4iLCBzZV9jbWQsIHNlX2NtZC0+dF9zdGF0ZSwKKwkJCQlzZV9jbWQtPnNlX3Rmby0+Z2V0X2NtZF9zdGF0ZShzZV9jbWQpKTsKKworCQkJcmMgPSB0cmFuc3BvcnRfd2FpdF9mb3JfdGFza3Moc2VfY21kKTsKKworCQkJcHJfZGVidWcoIkFmdGVyIHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyBzZV9jbWQ6ICVwIHRfc3RhdGU6ICVkLCIKKwkJCQkiIGZhYnJpYyBzdGF0ZTogJWRcbiIsIHNlX2NtZCwgc2VfY21kLT50X3N0YXRlLAorCQkJCXNlX2NtZC0+c2VfdGZvLT5nZXRfY21kX3N0YXRlKHNlX2NtZCkpOworCQl9CisKKwkJaWYgKCFyYykgeworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmc2VfY21kLT5jbWRfd2FpdF9jb21wKTsKKwkJCXByX2RlYnVnKCJBZnRlciBjbWRfd2FpdF9jb21wOiBzZV9jbWQ6ICVwIHRfc3RhdGU6ICVkIgorCQkJCSIgZmFicmljIHN0YXRlOiAlZFxuIiwgc2VfY21kLCBzZV9jbWQtPnRfc3RhdGUsCisJCQkJc2VfY21kLT5zZV90Zm8tPmdldF9jbWRfc3RhdGUoc2VfY21kKSk7CisJCX0KKworCQlzZV9jbWQtPnNlX3Rmby0+cmVsZWFzZV9jbWQoc2VfY21kKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHRhcmdldF93YWl0X2Zvcl9zZXNzX2NtZHMpOworCiAvKgl0cmFuc3BvcnRfbHVuX3dhaXRfZm9yX3Rhc2tzKCk6CiAgKgogICoJQ2FsbGVkIGZyb20gQ29uZmlnRlMgY29udGV4dCB0byBzdG9wIHRoZSBwYXNzZWQgc3RydWN0IHNlX2NtZCB0byBhbGxvdwpAQCAtNDE1MiwxNCArNDI3MiwxNCBAQAogICogQ2FsbGVkIGZyb20gZnJvbnRlbmQgZmFicmljIGNvbnRleHQgdG8gd2FpdCBmb3Igc3RvcmFnZSBlbmdpbmUKICAqIHRvIHBhdXNlIGFuZC9vciByZWxlYXNlIGZyb250ZW5kIGdlbmVyYXRlZCBzdHJ1Y3Qgc2VfY21kLgogICovCi12b2lkIHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyhzdHJ1Y3Qgc2VfY21kICpjbWQpCitib29sIHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyhzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NFX0xVTl9DTUQpICYmICEoY21kLT5zZV90bXJfcmVxKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47CisJCXJldHVybiBmYWxzZTsKIAl9CiAJLyoKIAkgKiBPbmx5IHBlcmZvcm0gYSBwb3NzaWJsZSB3YWl0X2Zvcl90YXNrcyBpZiBTQ0ZfU1VQUE9SVEVEX1NBTV9PUENPREUKQEAgLTQxNjcsNyArNDI4Nyw3IEBACiAJICovCiAJaWYgKCEoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU1VQUE9SVEVEX1NBTV9PUENPREUpICYmICFjbWQtPnNlX3Rtcl9yZXEpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCS8qCiAJICogSWYgd2UgYXJlIGFscmVhZHkgc3RvcHBlZCBkdWUgdG8gYW4gZXh0ZXJuYWwgZXZlbnQgKGllOiBMVU4gc2h1dGRvd24pCkBAIC00MjEwLDcgKzQzMzAsNyBAQAogCWlmICghYXRvbWljX3JlYWQoJmNtZC0+dF90cmFuc3BvcnRfYWN0aXZlKSB8fAogCSAgICAgYXRvbWljX3JlYWQoJmNtZC0+dF90cmFuc3BvcnRfYWJvcnRlZCkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9zdG9wLCAxKTsKQEAgLTQyMzUsNiArNDM1NSw4IEBACiAJCWNtZC0+c2VfdGZvLT5nZXRfdGFza190YWcoY21kKSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHRydWU7CiB9CiBFWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyk7CiAKQEAgLTQ1ODMsOSArNDcwNSw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlyZXQgPSB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKGNtZCk7Ci0JCQlpZiAocmV0ID09IC1FQUdBSU4pCi0JCQkJYnJlYWs7Ci0JCQllbHNlIGlmIChyZXQgPCAwKSB7CisJCQlpZiAocmV0IDwgMCkgewogCQkJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IHJldDsKIAkJCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kLAogCQkJCQkwLCAoY21kLT5kYXRhX2RpcmVjdGlvbiAhPQpAQCAtNDU5NSw5ICs0NzE1LDYgQEAKIAkJY2FzZSBUUkFOU1BPUlRfUFJPQ0VTU19XUklURToKIAkJCXRyYW5zcG9ydF9nZW5lcmljX3Byb2Nlc3Nfd3JpdGUoY21kKTsKIAkJCWJyZWFrOwotCQljYXNlIFRSQU5TUE9SVF9GUkVFX0NNRF9JTlRSOgotCQkJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoY21kLCAwKTsKLQkJCWJyZWFrOwogCQljYXNlIFRSQU5TUE9SVF9QUk9DRVNTX1RNUjoKIAkJCXRyYW5zcG9ydF9nZW5lcmljX2RvX3RtcihjbWQpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmggYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmgKaW5kZXggMzc0OWQ4Yi4uZTA1YzU1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RjbV9mYy5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90Y21fZmMuaApAQCAtMTU2LDcgKzE1Niw3IEBACiAvKgogICogSU8gbWV0aG9kcy4KICAqLwotdm9pZCBmdF9jaGVja19zdG9wX2ZyZWUoc3RydWN0IHNlX2NtZCAqKTsKK2ludCBmdF9jaGVja19zdG9wX2ZyZWUoc3RydWN0IHNlX2NtZCAqKTsKIHZvaWQgZnRfcmVsZWFzZV9jbWQoc3RydWN0IHNlX2NtZCAqKTsKIGludCBmdF9xdWV1ZV9zdGF0dXMoc3RydWN0IHNlX2NtZCAqKTsKIGludCBmdF9xdWV1ZV9kYXRhX2luKHN0cnVjdCBzZV9jbWQgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYwppbmRleCA2MTk1MDI2Li40ZmFjMzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKQEAgLTExMiw5ICsxMTIsMTAgQEAKIAlmdF9mcmVlX2NtZChjbWQpOwogfQogCi12b2lkIGZ0X2NoZWNrX3N0b3BfZnJlZShzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCitpbnQgZnRfY2hlY2tfc3RvcF9mcmVlKHN0cnVjdCBzZV9jbWQgKnNlX2NtZCkKIHsKIAl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZChzZV9jbWQsIDApOworCXJldHVybiAxOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYwppbmRleCA3MDhmOGU5Li5kZDlhNTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYworKysgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYwpAQCAtNjc4LDEwICs2NzgsMTAgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGRlbGF5ID4gMTAwMCkKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCYodHotPnBvbGxfcXVldWUpLAorCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX2ZyZWV6YWJsZV93cSwgJih0ei0+cG9sbF9xdWV1ZSksCiAJCQkJICAgICAgcm91bmRfamlmZmllcyhtc2Vjc190b19qaWZmaWVzKGRlbGF5KSkpOwogCWVsc2UKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCYodHotPnBvbGxfcXVldWUpLAorCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX2ZyZWV6YWJsZV93cSwgJih0ei0+cG9sbF9xdWV1ZSksCiAJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9LY29uZmlnIGIvZHJpdmVycy90dHkvS2NvbmZpZwppbmRleCA4ODE2ZjUzLi5iM2QxNzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdHR5L0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgVlQKIAlib29sICJWaXJ0dWFsIHRlcm1pbmFsIiBpZiBFWFBFUlQKLQlkZXBlbmRzIG9uICFTMzkwCisJZGVwZW5kcyBvbiAhUzM5MCAmJiAhVU1MCiAJc2VsZWN0IElOUFVUCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvaHZjL0tjb25maWcgYi9kcml2ZXJzL3R0eS9odmMvS2NvbmZpZwppbmRleCBlMzcxNzUzLi40MjIyMDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9odmMvS2NvbmZpZworKysgYi9kcml2ZXJzL3R0eS9odmMvS2NvbmZpZwpAQCAtMzQsNiArMzQsMTUgQEAKIAloZWxwCiAJICBpU2VyaWVzIG1hY2hpbmVzIHN1cHBvcnQgYSBoeXBlcnZpc29yIHZpcnR1YWwgY29uc29sZS4KIAorY29uZmlnIEhWQ19PUEFMCisJYm9vbCAiT1BBTCBDb25zb2xlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQUENfUE9XRVJOVgorCXNlbGVjdCBIVkNfRFJJVkVSCisJc2VsZWN0IEhWQ19JUlEKKwlkZWZhdWx0IHkKKwloZWxwCisJICBQb3dlck5WIG1hY2hpbmVzIHJ1bm5pbmcgdW5kZXIgT1BBTCBuZWVkIHRoYXQgZHJpdmVyIHRvIGdldCBhIGNvbnNvbGUKKwogY29uZmlnIEhWQ19SVEFTCiAJYm9vbCAiSUJNIFJUQVMgQ29uc29sZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUFBDX1JUQVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9NYWtlZmlsZSBiL2RyaXZlcnMvdHR5L2h2Yy9NYWtlZmlsZQppbmRleCBlMjkyMDUzLi44OWFiZjQwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIG9iai0kKENPTkZJR19IVkNfQ09OU09MRSkJKz0gaHZjX3Zpby5vIGh2c2lfbGliLm8KK29iai0kKENPTkZJR19IVkNfT1BBTCkJCSs9IGh2Y19vcGFsLm8gaHZzaV9saWIubwogb2JqLSQoQ09ORklHX0hWQ19PTERfSFZTSSkJKz0gaHZzaS5vCiBvYmotJChDT05GSUdfSFZDX0lTRVJJRVMpCSs9IGh2Y19pc2VyaWVzLm8KIG9iai0kKENPTkZJR19IVkNfUlRBUykJCSs9IGh2Y19ydGFzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jIGIvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKaW5kZXggNzQzMGJjMy4uYjZiMmQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKQEAgLTg1Miw3ICs4NTIsNyBAQAogCSAqIGZpbmQgaW5kZXggdG8gdXNlOgogCSAqIHNlZSBpZiB0aGlzIHZ0ZXJtIGlkIG1hdGNoZXMgb25lIHJlZ2lzdGVyZWQgZm9yIGNvbnNvbGUuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OUl9IVkNfQ09OU09MRVM7IGkrKykKKwlmb3IgKGk9MDsgaSA8IE1BWF9OUl9IVkNfQ09OU09MRVM7IGkrKykKIAkJaWYgKHZ0ZXJtbm9zW2ldID09IGhwLT52dGVybW5vICYmCiAJCSAgICBjb25zX29wc1tpXSA9PSBocC0+b3BzKQogCQkJYnJlYWs7CkBAIC04NjIsMTMgKzg2Miw5IEBACiAJCWkgPSArK2xhc3RfaHZjOwogCiAJaHAtPmluZGV4ID0gaTsKLQlodmNfY29uc29sZS5pbmRleCA9IGk7Ci0JdnRlcm1ub3NbaV0gPSB2dGVybW5vOwotCWNvbnNfb3BzW2ldID0gb3BzOwogCiAJbGlzdF9hZGRfdGFpbCgmKGhwLT5uZXh0KSwgJmh2Y19zdHJ1Y3RzKTsKIAlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7Ci0JcmVnaXN0ZXJfY29uc29sZSgmaHZjX2NvbnNvbGUpOwogCiAJcmV0dXJuIGhwOwogfQpAQCAtODc5LDcgKzg3NSw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCi0JdW5yZWdpc3Rlcl9jb25zb2xlKCZodmNfY29uc29sZSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CiAJdHR5ID0gdHR5X2tyZWZfZ2V0KGhwLT50dHkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9odmMvaHZjX2lzZXJpZXMuYyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfaXNlcmllcy5jCmluZGV4IDIxYzU0OTUuLjNmNGE4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfaXNlcmllcy5jCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfaXNlcmllcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfb3BhbC5jIGIvZHJpdmVycy90dHkvaHZjL2h2Y19vcGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkMjZjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfb3BhbC5jCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogb3BhbCBkcml2ZXIgaW50ZXJmYWNlIHRvIGh2Y19jb25zb2xlLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCisjaW5jbHVkZSA8YXNtL2h2Y29uc29sZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL2h2c2kuaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisKKyNpbmNsdWRlICJodmNfY29uc29sZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBodmNfb3BhbF9uYW1lW10gPSAiaHZjX29wYWwiOworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBodmNfb3BhbF9tYXRjaFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAubmFtZSA9ICJzZXJpYWwiLCAuY29tcGF0aWJsZSA9ICJpYm0sb3BhbC1jb25zb2xlLXJhdyIgfSwKKwl7IC5uYW1lID0gInNlcmlhbCIsIC5jb21wYXRpYmxlID0gImlibSxvcGFsLWNvbnNvbGUtaHZzaSIgfSwKKwl7IH0sCit9OworCit0eXBlZGVmIGVudW0gaHZfcHJvdG9jb2wgeworCUhWX1BST1RPQ09MX1JBVywKKwlIVl9QUk9UT0NPTF9IVlNJCit9IGh2X3Byb3RvY29sX3Q7CisKK3N0cnVjdCBodmNfb3BhbF9wcml2IHsKKwlodl9wcm90b2NvbF90CQlwcm90bzsJLyogUmF3IGRhdGEgb3IgSFZTSSBwYWNrZXRzICovCisJc3RydWN0IGh2c2lfcHJpdglodnNpOwkvKiBIVlNJIHNwZWNpZmljIGRhdGEgKi8KK307CitzdGF0aWMgc3RydWN0IGh2Y19vcGFsX3ByaXYgKmh2Y19vcGFsX3ByaXZzW01BWF9OUl9IVkNfQ09OU09MRVNdOworCisvKiBGb3IgZWFybHkgYm9vdCBjb25zb2xlICovCitzdGF0aWMgc3RydWN0IGh2Y19vcGFsX3ByaXYgaHZjX29wYWxfYm9vdF9wcml2Oworc3RhdGljIHUzMiBodmNfb3BhbF9ib290X3Rlcm1ubzsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBodl9vcHMgaHZjX29wYWxfcmF3X29wcyA9IHsKKwkuZ2V0X2NoYXJzID0gb3BhbF9nZXRfY2hhcnMsCisJLnB1dF9jaGFycyA9IG9wYWxfcHV0X2NoYXJzLAorCS5ub3RpZmllcl9hZGQgPSBub3RpZmllcl9hZGRfaXJxLAorCS5ub3RpZmllcl9kZWwgPSBub3RpZmllcl9kZWxfaXJxLAorCS5ub3RpZmllcl9oYW5ndXAgPSBub3RpZmllcl9oYW5ndXBfaXJxLAorfTsKKworc3RhdGljIGludCBodmNfb3BhbF9odnNpX2dldF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZjX29wYWxfcHJpdiAqcHYgPSBodmNfb3BhbF9wcml2c1t2dGVybW5vXTsKKworCWlmIChXQVJOX09OKCFwdikpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGh2c2lsaWJfZ2V0X2NoYXJzKCZwdi0+aHZzaSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgaHZjX29wYWxfaHZzaV9wdXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY29uc3QgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGh2Y19vcGFsX3ByaXYgKnB2ID0gaHZjX29wYWxfcHJpdnNbdnRlcm1ub107CisKKwlpZiAoV0FSTl9PTighcHYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBodnNpbGliX3B1dF9jaGFycygmcHYtPmh2c2ksIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW50IGh2Y19vcGFsX2h2c2lfb3BlbihzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIGludCBkYXRhKQoreworCXN0cnVjdCBodmNfb3BhbF9wcml2ICpwdiA9IGh2Y19vcGFsX3ByaXZzW2hwLT52dGVybW5vXTsKKwlpbnQgcmM7CisKKwlwcl9kZXZlbCgiSFZTSUAleDogZG8gb3BlbiAhXG4iLCBocC0+dnRlcm1ubyk7CisKKwlyYyA9IG5vdGlmaWVyX2FkZF9pcnEoaHAsIGRhdGEpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGh2c2lsaWJfb3BlbigmcHYtPmh2c2ksIGhwKTsKK30KKworc3RhdGljIHZvaWQgaHZjX29wYWxfaHZzaV9jbG9zZShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIGludCBkYXRhKQoreworCXN0cnVjdCBodmNfb3BhbF9wcml2ICpwdiA9IGh2Y19vcGFsX3ByaXZzW2hwLT52dGVybW5vXTsKKworCXByX2RldmVsKCJIVlNJQCV4OiBkbyBjbG9zZSAhXG4iLCBocC0+dnRlcm1ubyk7CisKKwlodnNpbGliX2Nsb3NlKCZwdi0+aHZzaSwgaHApOworCisJbm90aWZpZXJfZGVsX2lycShocCwgZGF0YSk7Cit9CisKK3ZvaWQgaHZjX29wYWxfaHZzaV9oYW5ndXAoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwLCBpbnQgZGF0YSkKK3sKKwlzdHJ1Y3QgaHZjX29wYWxfcHJpdiAqcHYgPSBodmNfb3BhbF9wcml2c1tocC0+dnRlcm1ub107CisKKwlwcl9kZXZlbCgiSFZTSUAleDogZG8gaGFuZ3VwICFcbiIsIGhwLT52dGVybW5vKTsKKworCWh2c2lsaWJfY2xvc2UoJnB2LT5odnNpLCBocCk7CisKKwlub3RpZmllcl9oYW5ndXBfaXJxKGhwLCBkYXRhKTsKK30KKworc3RhdGljIGludCBodmNfb3BhbF9odnNpX3Rpb2NtZ2V0KHN0cnVjdCBodmNfc3RydWN0ICpocCkKK3sKKwlzdHJ1Y3QgaHZjX29wYWxfcHJpdiAqcHYgPSBodmNfb3BhbF9wcml2c1tocC0+dnRlcm1ub107CisKKwlpZiAoIXB2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcHYtPmh2c2kubWN0cmw7Cit9CisKK3N0YXRpYyBpbnQgaHZjX29wYWxfaHZzaV90aW9jbXNldChzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIHVuc2lnbmVkIGludCBzZXQsCisJCQkJdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBodmNfb3BhbF9wcml2ICpwdiA9IGh2Y19vcGFsX3ByaXZzW2hwLT52dGVybW5vXTsKKworCXByX2RldmVsKCJIVlNJQCV4OiBTZXQgbW9kZW0gY29udHJvbCwgc2V0PSV4LGNscj0leFxuIiwKKwkJIGhwLT52dGVybW5vLCBzZXQsIGNsZWFyKTsKKworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWh2c2lsaWJfd3JpdGVfbWN0cmwoJnB2LT5odnNpLCAxKTsKKwllbHNlIGlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJaHZzaWxpYl93cml0ZV9tY3RybCgmcHYtPmh2c2ksIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfb3BzIGh2Y19vcGFsX2h2c2lfb3BzID0geworCS5nZXRfY2hhcnMgPSBodmNfb3BhbF9odnNpX2dldF9jaGFycywKKwkucHV0X2NoYXJzID0gaHZjX29wYWxfaHZzaV9wdXRfY2hhcnMsCisJLm5vdGlmaWVyX2FkZCA9IGh2Y19vcGFsX2h2c2lfb3BlbiwKKwkubm90aWZpZXJfZGVsID0gaHZjX29wYWxfaHZzaV9jbG9zZSwKKwkubm90aWZpZXJfaGFuZ3VwID0gaHZjX29wYWxfaHZzaV9oYW5ndXAsCisJLnRpb2NtZ2V0ID0gaHZjX29wYWxfaHZzaV90aW9jbWdldCwKKwkudGlvY21zZXQgPSBodmNfb3BhbF9odnNpX3Rpb2Ntc2V0LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaHZjX29wYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBodl9vcHMgKm9wczsKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7CisJc3RydWN0IGh2Y19vcGFsX3ByaXYgKnB2OworCWh2X3Byb3RvY29sX3QgcHJvdG87CisJdW5zaWduZWQgaW50IHRlcm1ubywgYm9vdCA9IDA7CisJY29uc3QgX19iZTMyICpyZWc7CisKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5kZXYub2Zfbm9kZSwgImlibSxvcGFsLWNvbnNvbGUtcmF3IikpIHsKKwkJcHJvdG8gPSBIVl9QUk9UT0NPTF9SQVc7CisJCW9wcyA9ICZodmNfb3BhbF9yYXdfb3BzOworCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJICAgImlibSxvcGFsLWNvbnNvbGUtaHZzaSIpKSB7CisJCXByb3RvID0gSFZfUFJPVE9DT0xfSFZTSTsKKwkJb3BzID0gJmh2Y19vcGFsX2h2c2lfb3BzOworCX0gZWxzZSB7CisJCXByX2VycigiaHZjX29wYWw6IFVua293biBwcm90b2NvbCBmb3IgJXNcbiIsCisJCSAgICAgICBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShkZXYtPmRldi5vZl9ub2RlLCAicmVnIiwgTlVMTCk7CisJdGVybW5vID0gcmVnID8gYmUzMl90b19jcHVwKHJlZykgOiAwOworCisJLyogSXMgaXQgb3VyIGJvb3Qgb25lID8gKi8KKwlpZiAoaHZjX29wYWxfcHJpdnNbdGVybW5vXSA9PSAmaHZjX29wYWxfYm9vdF9wcml2KSB7CisJCXB2ID0gaHZjX29wYWxfcHJpdnNbdGVybW5vXTsKKwkJYm9vdCA9IDE7CisJfSBlbHNlIGlmIChodmNfb3BhbF9wcml2c1t0ZXJtbm9dID09IE5VTEwpIHsKKwkJcHYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaHZjX29wYWxfcHJpdiksIEdGUF9LRVJORUwpOworCQlpZiAoIXB2KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXB2LT5wcm90byA9IHByb3RvOworCQlodmNfb3BhbF9wcml2c1t0ZXJtbm9dID0gcHY7CisJCWlmIChwcm90byA9PSBIVl9QUk9UT0NPTF9IVlNJKQorCQkJaHZzaWxpYl9pbml0KCZwdi0+aHZzaSwgb3BhbF9nZXRfY2hhcnMsIG9wYWxfcHV0X2NoYXJzLAorCQkJCSAgICAgdGVybW5vLCAwKTsKKworCQkvKiBJbnN0YW5jaWF0ZSBub3cgdG8gZXN0YWJsaXNoIGEgbWFwcGluZyBpbmRleD09dnRlcm1ubyAqLworCQlodmNfaW5zdGFudGlhdGUodGVybW5vLCB0ZXJtbm8sIG9wcyk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJodmNfb3BhbDogRGV2aWNlICVzIGhhcyBkdXBsaWNhdGUgdGVybWluYWwgbnVtYmVyICMlZFxuIiwKKwkJICAgICAgIGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSwgdGVybW5vKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlwcl9pbmZvKCJodmMlZDogJXMgcHJvdG9jb2wgb24gJXMlc1xuIiwgdGVybW5vLAorCQlwcm90byA9PSBIVl9QUk9UT0NPTF9SQVcgPyAicmF3IiA6ICJodnNpIiwKKwkJZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lLAorCQlib290ID8gIiAoYm9vdCBjb25zb2xlKSIgOiAiIik7CisKKwkvKiBXZSBkb24ndCBkbyBJUlEgeWV0ICovCisJaHAgPSBodmNfYWxsb2ModGVybW5vLCAwLCBvcHMsIE1BWF9WSU9fUFVUX0NIQVJTKTsKKwlpZiAoSVNfRVJSKGhwKSkKKwkJcmV0dXJuIFBUUl9FUlIoaHApOworCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGhwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBodmNfb3BhbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCWludCByYywgdGVybW5vOworCisJdGVybW5vID0gaHAtPnZ0ZXJtbm87CisJcmMgPSBodmNfcmVtb3ZlKGhwKTsKKwlpZiAocmMgPT0gMCkgeworCQlpZiAoaHZjX29wYWxfcHJpdnNbdGVybW5vXSAhPSAmaHZjX29wYWxfYm9vdF9wcml2KQorCQkJa2ZyZWUoaHZjX29wYWxfcHJpdnNbdGVybW5vXSk7CisJCWh2Y19vcGFsX3ByaXZzW3Rlcm1ub10gPSBOVUxMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGh2Y19vcGFsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaHZjX29wYWxfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChodmNfb3BhbF9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IGh2Y19vcGFsX25hbWUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBodmNfb3BhbF9tYXRjaCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBodmNfb3BhbF9pbml0KHZvaWQpCit7CisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFJlZ2lzdGVyIGFzIGEgdmlvIGRldmljZSB0byByZWNlaXZlIGNhbGxiYWNrcyAqLworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmh2Y19vcGFsX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChodmNfb3BhbF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGh2Y19vcGFsX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaHZjX29wYWxfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGh2Y19vcGFsX2V4aXQpOworCitzdGF0aWMgdm9pZCB1ZGJnX29wYWxfcHV0YyhjaGFyIGMpCit7CisJdW5zaWduZWQgaW50IHRlcm1ubyA9IGh2Y19vcGFsX2Jvb3RfdGVybW5vOworCWludCBjb3VudCA9IC0xOworCisJaWYgKGMgPT0gJ1xuJykKKwkJdWRiZ19vcGFsX3B1dGMoJ1xyJyk7CisKKwlkbyB7CisJCXN3aXRjaChodmNfb3BhbF9ib290X3ByaXYucHJvdG8pIHsKKwkJY2FzZSBIVl9QUk9UT0NPTF9SQVc6CisJCQljb3VudCA9IG9wYWxfcHV0X2NoYXJzKHRlcm1ubywgJmMsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgSFZfUFJPVE9DT0xfSFZTSToKKwkJCWNvdW50ID0gaHZjX29wYWxfaHZzaV9wdXRfY2hhcnModGVybW5vLCAmYywgMSk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUoY291bnQgPT0gMCB8fCBjb3VudCA9PSAtRUFHQUlOKTsKK30KKworc3RhdGljIGludCB1ZGJnX29wYWxfZ2V0Y19wb2xsKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRlcm1ubyA9IGh2Y19vcGFsX2Jvb3RfdGVybW5vOworCWludCByYyA9IDA7CisJY2hhciBjOworCisJc3dpdGNoKGh2Y19vcGFsX2Jvb3RfcHJpdi5wcm90bykgeworCWNhc2UgSFZfUFJPVE9DT0xfUkFXOgorCQlyYyA9IG9wYWxfZ2V0X2NoYXJzKHRlcm1ubywgJmMsIDEpOworCQlicmVhazsKKwljYXNlIEhWX1BST1RPQ09MX0hWU0k6CisJCXJjID0gaHZjX29wYWxfaHZzaV9nZXRfY2hhcnModGVybW5vLCAmYywgMSk7CisJCWJyZWFrOworCX0KKwlpZiAoIXJjKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbnQgdWRiZ19vcGFsX2dldGModm9pZCkKK3sKKwlpbnQgY2g7CisJZm9yICg7OykgeworCQljaCA9IHVkYmdfb3BhbF9nZXRjX3BvbGwoKTsKKwkJaWYgKGNoID09IC0xKSB7CisJCQkvKiBUaGlzIHNob3VsZG4ndCBiZSBuZWVkZWQuLi5idXQuLi4gKi8KKwkJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZGVsYXk7CisJCQlmb3IgKGRlbGF5PTA7IGRlbGF5IDwgMjAwMDAwMDsgZGVsYXkrKykKKwkJCQk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gY2g7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVkYmdfaW5pdF9vcGFsX2NvbW1vbih2b2lkKQoreworCXVkYmdfcHV0YyA9IHVkYmdfb3BhbF9wdXRjOworCXVkYmdfZ2V0YyA9IHVkYmdfb3BhbF9nZXRjOworCXVkYmdfZ2V0Y19wb2xsID0gdWRiZ19vcGFsX2dldGNfcG9sbDsKKwl0Yl90aWNrc19wZXJfdXNlYyA9IDB4MjAwOyAvKiBNYWtlIHVkZWxheSBub3Qgc3VjayAqLworfQorCit2b2lkIF9faW5pdCBodmNfb3BhbF9pbml0X2Vhcmx5KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzdGRvdXRfbm9kZSA9IE5VTEw7CisJY29uc3QgdTMyICp0ZXJtbm87CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGh2X29wcyAqb3BzOworCXUzMiBpbmRleDsKKworCS8qIGZpbmQgdGhlIGJvb3QgY29uc29sZSBmcm9tIC9jaG9zZW4vc3Rkb3V0ICovCisJaWYgKG9mX2Nob3NlbikKKwkJbmFtZSA9IG9mX2dldF9wcm9wZXJ0eShvZl9jaG9zZW4sICJsaW51eCxzdGRvdXQtcGF0aCIsIE5VTEwpOworCWlmIChuYW1lKSB7CisJCXN0ZG91dF9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgobmFtZSk7CisJCWlmICghc3Rkb3V0X25vZGUpIHsKKwkJCXByX2VycigiaHZjX29wYWw6IEZhaWxlZCB0byBsb2NhdGUgZGVmYXVsdCBjb25zb2xlIVxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9wYWwsICpucDsKKworCQkvKiBDdXJyZW50IE9QQUwgdGFrZW92ZXIgZG9lc24ndCBwcm92aWRlIHRoZSBzdGRvdXQKKwkJICogcGF0aCwgc28gd2UgaGFyZCB3aXJlIGl0CisJCSAqLworCQlvcGFsID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sb3BhbC9jb25zb2xlcyIpOworCQlpZiAob3BhbCkKKwkJCXByX2RldmVsKCJodmNfb3BhbDogRm91bmQgY29uc29sZXMgaW4gbmV3IGxvY2F0aW9uXG4iKTsKKwkJaWYgKCFvcGFsKSB7CisJCQlvcGFsID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sb3BhbCIpOworCQkJaWYgKG9wYWwpCisJCQkJcHJfZGV2ZWwoImh2Y19vcGFsOiAiCisJCQkJCSAiRm91bmQgY29uc29sZXMgaW4gb2xkIGxvY2F0aW9uXG4iKTsKKwkJfQorCQlpZiAoIW9wYWwpCisJCQlyZXR1cm47CisJCWZvcl9lYWNoX2NoaWxkX29mX25vZGUob3BhbCwgbnApIHsKKwkJCWlmICghc3RyY21wKG5wLT5uYW1lLCAic2VyaWFsIikpIHsKKwkJCQlzdGRvdXRfbm9kZSA9IG5wOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW9mX25vZGVfcHV0KG9wYWwpOworCX0KKwlpZiAoIXN0ZG91dF9ub2RlKQorCQlyZXR1cm47CisJdGVybW5vID0gb2ZfZ2V0X3Byb3BlcnR5KHN0ZG91dF9ub2RlLCAicmVnIiwgTlVMTCk7CisJaW5kZXggPSB0ZXJtbm8gPyAqdGVybW5vIDogMDsKKwlpZiAoaW5kZXggPj0gTUFYX05SX0hWQ19DT05TT0xFUykKKwkJcmV0dXJuOworCWh2Y19vcGFsX3ByaXZzW2luZGV4XSA9ICZodmNfb3BhbF9ib290X3ByaXY7CisKKwkvKiBDaGVjayB0aGUgcHJvdG9jb2wgKi8KKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoc3Rkb3V0X25vZGUsICJpYm0sb3BhbC1jb25zb2xlLXJhdyIpKSB7CisJCWh2Y19vcGFsX2Jvb3RfcHJpdi5wcm90byA9IEhWX1BST1RPQ09MX1JBVzsKKwkJb3BzID0gJmh2Y19vcGFsX3Jhd19vcHM7CisJCXByX2RldmVsKCJodmNfb3BhbDogRm91bmQgUkFXIGNvbnNvbGVcbiIpOworCX0KKwllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdGRvdXRfbm9kZSwiaWJtLG9wYWwtY29uc29sZS1odnNpIikpIHsKKwkJaHZjX29wYWxfYm9vdF9wcml2LnByb3RvID0gSFZfUFJPVE9DT0xfSFZTSTsKKwkJb3BzID0gJmh2Y19vcGFsX2h2c2lfb3BzOworCQlodnNpbGliX2luaXQoJmh2Y19vcGFsX2Jvb3RfcHJpdi5odnNpLCBvcGFsX2dldF9jaGFycywKKwkJCSAgICAgb3BhbF9wdXRfY2hhcnMsIGluZGV4LCAxKTsKKwkJLyogSFZTSSwgcGVyZm9ybSB0aGUgaGFuZHNoYWtlIG5vdyAqLworCQlodnNpbGliX2VzdGFibGlzaCgmaHZjX29wYWxfYm9vdF9wcml2Lmh2c2kpOworCQlwcl9kZXZlbCgiaHZjX29wYWw6IEZvdW5kIEhWU0kgY29uc29sZVxuIik7CisJfSBlbHNlCisJCWdvdG8gb3V0OworCWh2Y19vcGFsX2Jvb3RfdGVybW5vID0gaW5kZXg7CisJdWRiZ19pbml0X29wYWxfY29tbW9uKCk7CisJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJodmMiLCBpbmRleCwgTlVMTCk7CisJaHZjX2luc3RhbnRpYXRlKGluZGV4LCBpbmRleCwgb3BzKTsKK291dDoKKwlvZl9ub2RlX3B1dChzdGRvdXRfbm9kZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX09QQUxfUkFXCit2b2lkIF9faW5pdCB1ZGJnX2luaXRfZGVidWdfb3BhbCh2b2lkKQoreworCXUzMiBpbmRleCA9IENPTkZJR19QUENfRUFSTFlfREVCVUdfT1BBTF9WVEVSTU5POworCWh2Y19vcGFsX3ByaXZzW2luZGV4XSA9ICZodmNfb3BhbF9ib290X3ByaXY7CisJaHZjX29wYWxfYm9vdF9wcml2LnByb3RvID0gSFZfUFJPVE9DT0xfUkFXOworCWh2Y19vcGFsX2Jvb3RfdGVybW5vID0gaW5kZXg7CisJdWRiZ19pbml0X29wYWxfY29tbW9uKCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMX1JBVyAqLworCisjaWZkZWYgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMX0hWU0kKK3ZvaWQgX19pbml0IHVkYmdfaW5pdF9kZWJ1Z19vcGFsX2h2c2kodm9pZCkKK3sKKwl1MzIgaW5kZXggPSBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX09QQUxfVlRFUk1OTzsKKwlodmNfb3BhbF9wcml2c1tpbmRleF0gPSAmaHZjX29wYWxfYm9vdF9wcml2OworCWh2Y19vcGFsX2Jvb3RfdGVybW5vID0gaW5kZXg7CisJdWRiZ19pbml0X29wYWxfY29tbW9uKCk7CisJaHZzaWxpYl9pbml0KCZodmNfb3BhbF9ib290X3ByaXYuaHZzaSwgb3BhbF9nZXRfY2hhcnMsIG9wYWxfcHV0X2NoYXJzLAorCQkgICAgIGluZGV4LCAxKTsKKwlodnNpbGliX2VzdGFibGlzaCgmaHZjX29wYWxfYm9vdF9wcml2Lmh2c2kpOworfQorI2VuZGlmIC8qIENPTkZJR19QUENfRUFSTFlfREVCVUdfT1BBTF9IVlNJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9odmMvaHZjX3Zpby5jIGIvZHJpdmVycy90dHkvaHZjL2h2Y192aW8uYwppbmRleCAxMzBhYWNlLi5mYzNjM2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9odmMvaHZjX3Zpby5jCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfdmlvLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaHZjb25zb2xlLmg+CiAjaW5jbHVkZSA8YXNtL3Zpby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvaHZjL2h2Y3MuYyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNzLmMKaW5kZXggNTU4ODJiNS4uYjkwNDBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL2h2Y3MuYworKysgYi9kcml2ZXJzL3R0eS9odmMvaHZjcy5jCkBAIC0xNTMyLDcgKzE1MzIsNyBAQAogCQlnb3RvIHJlZ2lzdGVyX2ZhaWw7CiAJfQogCi0JaHZjc19waV9idWZmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWh2Y3NfcGlfYnVmZiA9ICh1bnNpZ25lZCBsb25nICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWh2Y3NfcGlfYnVmZikgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gYnVmZl9hbGxvY19mYWlsOwpAQCAtMTU0OCw3ICsxNTQ4LDcgQEAKIAlyZXR1cm4gMDsKIAoga3RocmVhZF9mYWlsOgotCWtmcmVlKGh2Y3NfcGlfYnVmZik7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWh2Y3NfcGlfYnVmZik7CiBidWZmX2FsbG9jX2ZhaWw6CiAJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7CiByZWdpc3Rlcl9mYWlsOgpAQCAtMTU5Nyw3ICsxNTk3LDcgQEAKIAlrdGhyZWFkX3N0b3AoaHZjc190YXNrKTsKIAogCXNwaW5fbG9jaygmaHZjc19waV9sb2NrKTsKLQlrZnJlZShodmNzX3BpX2J1ZmYpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylodmNzX3BpX2J1ZmYpOwogCWh2Y3NfcGlfYnVmZiA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmh2Y3NfcGlfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odnNpX2xpYi5jIGIvZHJpdmVycy90dHkvaHZjL2h2c2lfbGliLmMKaW5kZXggYmQ5YjA5OC4uNmY0ZGQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL2h2c2lfbGliLmMKKysrIGIvZHJpdmVycy90dHkvaHZjL2h2c2lfbGliLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCXVuc2lnbmVkIGludCB0cmllcywgcmVhZCA9IDA7CiAKIAlpZiAoV0FSTl9PTighcHYpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIElmIHdlIGFyZW4ndCBvcGVuLCBkb24ndCBkbyBhbnl0aGluZyBpbiBvcmRlciB0byBhdm9pZCByYWNlcwogCSAqIHdpdGggY29ubmVjdGlvbiBlc3RhYmxpc2htZW50LiBUaGUgaHZjIGNvcmUgd2lsbCBjYWxsIHRoaXMKQEAgLTIzNCw3ICsyMzQsNyBAQAogCWludCByYywgYWRqY291bnQgPSBtaW4oY291bnQsIEhWU0lfTUFYX09VVEdPSU5HX0RBVEEpOwogCiAJaWYgKFdBUk5fT04oIXB2KSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PREVWOwogCiAJZHAuaGRyLnR5cGUgPSBWU19EQVRBX1BBQ0tFVF9IRUFERVI7CiAJZHAuaGRyLmxlbiA9IGFkamNvdW50ICsgc2l6ZW9mKHN0cnVjdCBodnNpX2hlYWRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9uX2dzbS5jIGIvZHJpdmVycy90dHkvbl9nc20uYwppbmRleCA0Y2IwZDBhLi5mYzdiYmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9uX2dzbS5jCisrKyBiL2RyaXZlcnMvdHR5L25fZ3NtLmMKQEAgLTY2LDE0ICs2NiwxNiBAQAogc3RhdGljIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjAwKTsKIAotI2RlZmluZSBUMQkoSFovMTApCi0jZGVmaW5lIFQyCShIWi8zKQotI2RlZmluZSBOMgkzCisvKiBEZWZhdWx0czogdGhlc2UgYXJlIGZyb20gdGhlIHNwZWNpZmljYXRpb24gKi8KKworI2RlZmluZSBUMQkxMAkJLyogMTAwbVMgKi8KKyNkZWZpbmUgVDIJMzQJCS8qIDMzM21TICovCisjZGVmaW5lIE4yCTMJCS8qIFJldHJ5IDMgdGltZXMgKi8KIAogLyogVXNlIGxvbmcgdGltZXJzIGZvciB0ZXN0aW5nIGF0IGxvdyBzcGVlZCB3aXRoIGRlYnVnIG9uICovCiAjaWZkZWYgREVCVUdfVElNSU5HCi0jZGVmaW5lIFQxCUhaCi0jZGVmaW5lIFQyCSgyICogSFopCisjZGVmaW5lIFQxCTEwMAorI2RlZmluZSBUMgkyMDAKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLmMKaW5kZXggYTg3YTU2Yy4uZWVhZGYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC5jCkBAIC00NTAsMjQgKzQ1MCw2IEBACiAJX19yYXdfd3JpdGVsKHZhbHVlLCBwLT5tZW1iYXNlICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCB0c2lfc2VyaWFsX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQpCi17Ci0JdW5zaWduZWQgaW50IHRtcDsKLQlvZmZzZXQgPSBtYXBfODI1MF9pbl9yZWcocCwgb2Zmc2V0KSA8PCBwLT5yZWdzaGlmdDsKLQlpZiAob2Zmc2V0ID09IFVBUlRfSUlSKSB7Ci0JCXRtcCA9IHJlYWRsKHAtPm1lbWJhc2UgKyAoVUFSVF9JSVIgJiB+MykpOwotCQlyZXR1cm4gKHRtcCA+PiAxNikgJiAweGZmOyAvKiBVQVJUX0lJUiAlIDQgPT0gMiAqLwotCX0gZWxzZQotCQlyZXR1cm4gcmVhZGIocC0+bWVtYmFzZSArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRzaV9zZXJpYWxfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlvZmZzZXQgPSBtYXBfODI1MF9vdXRfcmVnKHAsIG9mZnNldCkgPDwgcC0+cmVnc2hpZnQ7Ci0JaWYgKCEoKG9mZnNldCA9PSBVQVJUX0lFUikgJiYgKHZhbHVlICYgVUFSVF9JRVJfVVVFKSkpCi0JCXdyaXRlYih2YWx1ZSwgcC0+bWVtYmFzZSArIG9mZnNldCk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW9fc2VyaWFsX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQpCiB7CiAJb2Zmc2V0ID0gbWFwXzgyNTBfaW5fcmVnKHAsIG9mZnNldCkgPDwgcC0+cmVnc2hpZnQ7CkBAIC01MDgsMTEgKzQ5MCw2IEBACiAJCXAtPnNlcmlhbF9vdXQgPSBhdV9zZXJpYWxfb3V0OwogCQlicmVhazsKIAotCWNhc2UgVVBJT19UU0k6Ci0JCXAtPnNlcmlhbF9pbiA9IHRzaV9zZXJpYWxfaW47Ci0JCXAtPnNlcmlhbF9vdXQgPSB0c2lfc2VyaWFsX291dDsKLQkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQlwLT5zZXJpYWxfaW4gPSBpb19zZXJpYWxfaW47CiAJCXAtPnNlcmlhbF9vdXQgPSBpb19zZXJpYWxfb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV9qdGFndWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV9qdGFndWFydC5jCmluZGV4IDAwYTczZWMuLjUzMDE4MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfanRhZ3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX2p0YWd1YXJ0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpAQCAtNDcyLDggKzQ3Myw2IEBACiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWx0ZXJhX2p0YWd1YXJ0X21hdGNoKTsKLSNlbHNlCi0jZGVmaW5lIGFsdGVyYV9qdGFndWFydF9tYXRjaCBOVUxMCiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFsdGVyYV9qdGFndWFydF9wbGF0Zm9ybV9kcml2ZXIgPSB7CkBAIC00ODIsNyArNDgxLDcgQEAKIAkuZHJpdmVyCT0gewogCQkubmFtZQkJPSBEUlZfTkFNRSwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUJPSBhbHRlcmFfanRhZ3VhcnRfbWF0Y2gsCisJCS5vZl9tYXRjaF90YWJsZQk9IG9mX21hdGNoX3B0cihhbHRlcmFfanRhZ3VhcnRfbWF0Y2gpLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jCmluZGV4IGQ5MDI1NTguLjFkMDRjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jCkBAIC02MTYsOCArNjE2LDYgQEAKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhbHRlcmFfdWFydF9tYXRjaCk7Ci0jZWxzZQotI2RlZmluZSBhbHRlcmFfdWFydF9tYXRjaCBOVUxMCiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFsdGVyYV91YXJ0X3BsYXRmb3JtX2RyaXZlciA9IHsKQEAgLTYyNiw3ICs2MjQsNyBAQAogCS5kcml2ZXIJPSB7CiAJCS5uYW1lCQk9IERSVl9OQU1FLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZQk9IGFsdGVyYV91YXJ0X21hdGNoLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBvZl9tYXRjaF9wdHIoYWx0ZXJhX3VhcnRfbWF0Y2gpLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTAuYwppbmRleCBjMGQxMGM0Li5lZmRmOTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDEwLmMKQEAgLTMxMiwxMiArMzEyLDE2IEBACiAJc3RydWN0IHVhcnRfYW1iYV9wb3J0ICp1YXAgPSAoc3RydWN0IHVhcnRfYW1iYV9wb3J0ICopcG9ydDsKIAlpbnQgcmV0dmFsOwogCisJcmV0dmFsID0gY2xrX3ByZXBhcmUodWFwLT5jbGspOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCiAJLyoKIAkgKiBUcnkgdG8gZW5hYmxlIHRoZSBjbG9jayBwcm9kdWNlci4KIAkgKi8KIAlyZXR2YWwgPSBjbGtfZW5hYmxlKHVhcC0+Y2xrKTsKIAlpZiAocmV0dmFsKQotCQlnb3RvIG91dDsKKwkJZ290byBjbGtfdW5wcmVwOwogCiAJdWFwLT5wb3J0LnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUodWFwLT5jbGspOwogCkBAIC0zNDMsNiArMzQ3LDggQEAKIAogIGNsa19kaXM6CiAJY2xrX2Rpc2FibGUodWFwLT5jbGspOworIGNsa191bnByZXA6CisJY2xrX3VucHJlcGFyZSh1YXAtPmNsayk7CiAgb3V0OgogCXJldHVybiByZXR2YWw7CiB9CkBAIC0zNzAsNiArMzc2LDcgQEAKIAkgKiBTaHV0IGRvd24gdGhlIGNsb2NrIHByb2R1Y2VyCiAJICovCiAJY2xrX2Rpc2FibGUodWFwLT5jbGspOworCWNsa191bnByZXBhcmUodWFwLT5jbGspOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNjI2LDYgKzYzMyw3IEBACiAJaW50IGJpdHMgPSA4OwogCWludCBwYXJpdHkgPSAnbic7CiAJaW50IGZsb3cgPSAnbic7CisJaW50IHJldDsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciBhbiBpbnZhbGlkIHVhcnQgbnVtYmVyIGhhcyBiZWVuIHNwZWNpZmllZCwgYW5kCkBAIC02MzgsNiArNjQ2LDEwIEBACiAJaWYgKCF1YXApCiAJCXJldHVybiAtRU5PREVWOwogCisJcmV0ID0gY2xrX3ByZXBhcmUodWFwLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAl1YXAtPnBvcnQudWFydGNsayA9IGNsa19nZXRfcmF0ZSh1YXAtPmNsayk7CiAKIAlpZiAob3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCmluZGV4IGY1ZjY4MzEuLjAwMjMzYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYwpAQCAtMTM2NywxMiArMTM2NywxNiBAQAogCXVuc2lnbmVkIGludCBjcjsKIAlpbnQgcmV0dmFsOwogCisJcmV0dmFsID0gY2xrX3ByZXBhcmUodWFwLT5jbGspOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCiAJLyoKIAkgKiBUcnkgdG8gZW5hYmxlIHRoZSBjbG9jayBwcm9kdWNlci4KIAkgKi8KIAlyZXR2YWwgPSBjbGtfZW5hYmxlKHVhcC0+Y2xrKTsKIAlpZiAocmV0dmFsKQotCQlnb3RvIG91dDsKKwkJZ290byBjbGtfdW5wcmVwOwogCiAJdWFwLT5wb3J0LnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUodWFwLT5jbGspOwogCkBAIC0xNDQ2LDYgKzE0NTAsOCBAQAogCiAgY2xrX2RpczoKIAljbGtfZGlzYWJsZSh1YXAtPmNsayk7CisgY2xrX3VucHJlcDoKKwljbGtfdW5wcmVwYXJlKHVhcC0+Y2xrKTsKICBvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE0OTcsNiArMTUwMyw3IEBACiAJICogU2h1dCBkb3duIHRoZSBjbG9jayBwcm9kdWNlcgogCSAqLwogCWNsa19kaXNhYmxlKHVhcC0+Y2xrKTsKKwljbGtfdW5wcmVwYXJlKHVhcC0+Y2xrKTsKIAogCWlmICh1YXAtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhKSB7CiAJCXN0cnVjdCBhbWJhX3BsMDExX2RhdGEgKnBsYXQ7CkBAIC0xODAwLDYgKzE4MDcsNyBAQAogCWludCBiaXRzID0gODsKIAlpbnQgcGFyaXR5ID0gJ24nOwogCWludCBmbG93ID0gJ24nOworCWludCByZXQ7CiAKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgYW4gaW52YWxpZCB1YXJ0IG51bWJlciBoYXMgYmVlbiBzcGVjaWZpZWQsIGFuZApAQCAtMTgxMiw2ICsxODIwLDEwIEBACiAJaWYgKCF1YXApCiAJCXJldHVybiAtRU5PREVWOwogCisJcmV0ID0gY2xrX3ByZXBhcmUodWFwLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlpZiAodWFwLT5wb3J0LmRldi0+cGxhdGZvcm1fZGF0YSkgewogCQlzdHJ1Y3QgYW1iYV9wbDAxMV9kYXRhICpwbGF0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKaW5kZXggOTk4OGMwYy4uNGEwZjg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYwpAQCAtNDgsNyArNDgsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FSTQogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNlbmRpZgogCiAjZGVmaW5lIFBEQ19CVUZGRVJfU0laRQkJNTEyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKaW5kZXggNTRmZmRjNi4uMTYzZmM5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYwpAQCAtMTI5MCwxNyArMTI5MCwyMCBAQAogc3RhdGljIGludCBzZXJpYWxfaW14X3Byb2JlX2R0KHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQsCiAJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RhdGljIGludCBwb3J0bnVtID0gMDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQogCQkJb2ZfbWF0Y2hfZGV2aWNlKGlteF91YXJ0X2R0X2lkcywgJnBkZXYtPmRldik7CisJaW50IHJldDsKIAogCWlmICghbnApCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3BvcnQtPnBvcnQubGluZSA9IHBvcnRudW0rKzsKLQlpZiAoc3BvcnQtPnBvcnQubGluZSA+PSBVQVJUX05SKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBvZl9hbGlhc19nZXRfaWQobnAsICJzZXJpYWwiKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGFsaWFzIGlkLCBlcnJubyAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXNwb3J0LT5wb3J0LmxpbmUgPSByZXQ7CiAKIAlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnNsLHVhcnQtaGFzLXJ0c2N0cyIsIE5VTEwpKQogCQlzcG9ydC0+aGF2ZV9ydHNjdHMgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2pzbS9qc21fZHJpdmVyLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYwppbmRleCA2NDhiNmEzLi43Yzg2N2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYwpAQCAtMjQsNyArMjQsNyBAQAogICoKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9rZ2Rib2MuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9rZ2Rib2MuYwppbmRleCA4N2U3ZTZjLi4yYjQyYTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwva2dkYm9jLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2tnZGJvYy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIE1BWF9DT05GSUdfTEVOCQk0MAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDAuYwppbmRleCAyYWY1YWE1Li44YTZjYzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTAwLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTA3LWFhdmEuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTA3LWFhdmEuYwppbmRleCBkNzNhYWRkLi45MGM0MGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwNy1hYXZhLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDctYWF2YS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9tcnN0Lmg+CiAjaW5jbHVkZSAibWF4MzEwNy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwNy5jIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDcuYwppbmRleCBkYjAwYjU5Li43ODI3MDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwNy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTA3LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJtYXgzMTA3LmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYmF1ZF90YWJsZSBicmcyNl9leHRbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbC5jCmluZGV4IDI5Y2JmZDguLjgxMzFlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuYwpAQCAtMTksNiArMTksNyBAQAogIyBkZWZpbmUgU1VQUE9SVF9TWVNSUQogI2VuZGlmCiAKKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTMzLDYgKzM0LDggQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlICJtc21fc2VyaWFsLmgiCiAKQEAgLTU4OSw5ICs1OTIsOCBAQAogCQlpb3dyaXRlMzIoR1NCSV9QUk9UT0NPTF9JRExFLCBtc21fcG9ydC0+Z3NiaV9iYXNlICsKIAkJCSAgR1NCSV9DT05UUk9MKTsKIAotCQlnc2JpX3Jlc291cmNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAotCQkJCQkJCSAgICAgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQkJICAgICAiZ3NiaV9yZXNvdXJjZSIpOworCQlnc2JpX3Jlc291cmNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsCisJCQkJCQkJSU9SRVNPVVJDRV9NRU0sIDEpOwogCiAJCWlmICh1bmxpa2VseSghZ3NiaV9yZXNvdXJjZSkpCiAJCQlyZXR1cm47CkBAIC02MTIsOCArNjE0LDcgQEAKIAlyZXNvdXJjZV9zaXplX3Qgc2l6ZTsKIAlpbnQgcmV0OwogCi0JdWFydF9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQkgICAgICJ1YXJ0X3Jlc291cmNlIik7CisJdWFydF9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKHVubGlrZWx5KCF1YXJ0X3Jlc291cmNlKSkKIAkJcmV0dXJuIC1FTlhJTzsKIApAQCAtNjI4LDggKzYyOSw3IEBACiAJCWdvdG8gZmFpbF9yZWxlYXNlX3BvcnQ7CiAJfQogCi0JZ3NiaV9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQkgICAgICJnc2JpX3Jlc291cmNlIik7CisJZ3NiaV9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CiAJLyogSXMgdGhpcyBhIEdTQkktYmFzZWQgcG9ydD8gKi8KIAlpZiAoZ3NiaV9yZXNvdXJjZSkgewogCQlzaXplID0gcmVzb3VyY2Vfc2l6ZShnc2JpX3Jlc291cmNlKTsKQEAgLTg1Nyw2ICs4NTcsOCBAQAogCS5jb25zID0gTVNNX0NPTlNPTEUsCiB9OwogCitzdGF0aWMgYXRvbWljX3QgbXNtX3VhcnRfbmV4dF9pZCA9IEFUT01JQ19JTklUKDApOworCiBzdGF0aWMgaW50IF9faW5pdCBtc21fc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG1zbV9wb3J0ICptc21fcG9ydDsKQEAgLTg2NCw2ICs4NjYsOSBAQAogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CiAJaW50IGlycTsKIAorCWlmIChwZGV2LT5pZCA9PSAtMSkKKwkJcGRldi0+aWQgPSBhdG9taWNfaW5jX3JldHVybigmbXNtX3VhcnRfbmV4dF9pZCkgLSAxOworCiAJaWYgKHVubGlrZWx5KHBkZXYtPmlkIDwgMCB8fCBwZGV2LT5pZCA+PSBVQVJUX05SKSkKIAkJcmV0dXJuIC1FTlhJTzsKIApAQCAtODczLDcgKzg3OCw3IEBACiAJcG9ydC0+ZGV2ID0gJnBkZXYtPmRldjsKIAltc21fcG9ydCA9IFVBUlRfVE9fTVNNKHBvcnQpOwogCi0JaWYgKHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJnc2JpX3Jlc291cmNlIikpCisJaWYgKHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSkpCiAJCW1zbV9wb3J0LT5pc191YXJ0ZG0gPSAxOwogCWVsc2UKIAkJbXNtX3BvcnQtPmlzX3VhcnRkbSA9IDA7CkBAIC04OTcsOCArOTAyLDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJ1YXJ0Y2xrID0gJWRcbiIsIHBvcnQtPnVhcnRjbGspOwogCiAKLQlyZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQkgICAgICJ1YXJ0X3Jlc291cmNlIik7CisJcmVzb3VyY2UgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICh1bmxpa2VseSghcmVzb3VyY2UpKQogCQlyZXR1cm4gLUVOWElPOwogCXBvcnQtPm1hcGJhc2UgPSByZXNvdXJjZS0+c3RhcnQ7CkBAIC05MjIsMTEgKzkyNiwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtc21fbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnQiIH0sCisJe30KK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9wbGF0Zm9ybV9kcml2ZXIgPSB7CiAJLnJlbW92ZSA9IG1zbV9zZXJpYWxfcmVtb3ZlLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIm1zbV9zZXJpYWwiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX21hdGNoX3RhYmxlLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbndwc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbndwc2VyaWFsLmMKaW5kZXggOWJlYWZmMS4uZGQ0YzMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL253cHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9ud3BzZXJpYWwuYwpAQCAtMTAsNiArMTAsNyBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL29mX3NlcmlhbC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL29mX3NlcmlhbC5jCmluZGV4IGU1OGNlY2UuLmU4YzljZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9vZl9zZXJpYWwuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvb2Zfc2VyaWFsLmMKQEAgLTIwMCwxNyArMjAwLDcgQEAKIAkucmVtb3ZlID0gb2ZfcGxhdGZvcm1fc2VyaWFsX3JlbW92ZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IG9mX3BsYXRmb3JtX3NlcmlhbF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb2ZfcGxhdGZvcm1fc2VyaWFsX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChvZl9wbGF0Zm9ybV9zZXJpYWxfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBvZl9wbGF0Zm9ybV9zZXJpYWxfZXhpdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb2ZfcGxhdGZvcm1fc2VyaWFsX2RyaXZlcik7Ci19OwotbW9kdWxlX2V4aXQob2ZfcGxhdGZvcm1fc2VyaWFsX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihvZl9wbGF0Zm9ybV9zZXJpYWxfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiQXJuZCBCZXJnbWFubiA8YXJuZEBhcm5kYi5kZT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYwppbmRleCA5ODcxYzU3Li5hZmY5ZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCkBAIC0yMDcsNiArMjA3LDI1IEBACiAJfSwKIAogCS8qCisJICogQ29tbW9uIFNILTIoQSkgU0NJRiBkZWZpbml0aW9ucyBmb3IgcG9ydHMgd2l0aCBGSUZPIGRhdGEKKwkgKiBjb3VudCByZWdpc3RlcnMuCisJICovCisJW1NDSXhfU0gyX1NDSUZfRklGT0RBVEFfUkVHVFlQRV0gPSB7CisJCVtTQ1NNUl0JCT0geyAweDAwLCAxNiB9LAorCQlbU0NCUlJdCQk9IHsgMHgwNCwgIDggfSwKKwkJW1NDU0NSXQkJPSB7IDB4MDgsIDE2IH0sCisJCVtTQ3hURFJdCT0geyAweDBjLCAgOCB9LAorCQlbU0N4U1JdCQk9IHsgMHgxMCwgMTYgfSwKKwkJW1NDeFJEUl0JPSB7IDB4MTQsICA4IH0sCisJCVtTQ0ZDUl0JCT0geyAweDE4LCAxNiB9LAorCQlbU0NGRFJdCQk9IHsgMHgxYywgMTYgfSwKKwkJW1NDVEZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1JGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NTUFRSXQk9IHsgMHgyMCwgMTYgfSwKKwkJW1NDTFNSXQkJPSB7IDB4MjQsIDE2IH0sCisJfSwKKworCS8qCiAJICogQ29tbW9uIFNILTMgU0NJRiBkZWZpbml0aW9ucy4KIAkgKi8KIAlbU0NJeF9TSDNfU0NJRl9SRUdUWVBFXSA9IHsKQEAgLTE0NDYsMTIgKzE0NjUsOCBAQAogCWRldl9kYmcoY2hhbi0+ZGV2aWNlLT5kZXYsICIlczogc2xhdmUgSUQgJWRcbiIsIF9fZnVuY19fLAogCQlwYXJhbS0+c2xhdmVfaWQpOwogCi0JaWYgKHBhcmFtLT5kbWFfZGV2ID09IGNoYW4tPmRldmljZS0+ZGV2KSB7Ci0JCWNoYW4tPnByaXZhdGUgPSBwYXJhbTsKLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KKwljaGFuLT5wcml2YXRlID0gcGFyYW07CisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIHJ4X3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgYXJnKQpAQCAtMTQ3NywxMCArMTQ5MiwxMCBAQAogCWRtYV9jYXBfbWFza190IG1hc2s7CiAJaW50IG5lbnQ7CiAKLQlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBwb3J0ICVkIERNQSAlcFxuIiwgX19mdW5jX18sCi0JCXBvcnQtPmxpbmUsIHMtPmNmZy0+ZG1hX2Rldik7CisJZGV2X2RiZyhwb3J0LT5kZXYsICIlczogcG9ydCAlZFxuIiwgX19mdW5jX18sCisJCXBvcnQtPmxpbmUpOwogCi0JaWYgKCFzLT5jZmctPmRtYV9kZXYpCisJaWYgKHMtPmNmZy0+ZG1hX3NsYXZlX3R4IDw9IDAgfHwgcy0+Y2ZnLT5kbWFfc2xhdmVfcnggPD0gMCkKIAkJcmV0dXJuOwogCiAJZG1hX2NhcF96ZXJvKG1hc2spOwpAQCAtMTQ5MCw3ICsxNTA1LDYgQEAKIAogCS8qIFNsYXZlIElELCBlLmcuLCBTSERNQV9TTEFWRV9TQ0lGMF9UWCAqLwogCXBhcmFtLT5zbGF2ZV9pZCA9IHMtPmNmZy0+ZG1hX3NsYXZlX3R4OwotCXBhcmFtLT5kbWFfZGV2ID0gcy0+Y2ZnLT5kbWFfZGV2OwogCiAJcy0+Y29va2llX3R4ID0gLUVJTlZBTDsKIAljaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBmaWx0ZXIsIHBhcmFtKTsKQEAgLTE1MTksNyArMTUzMyw2IEBACiAKIAkvKiBTbGF2ZSBJRCwgZS5nLiwgU0hETUFfU0xBVkVfU0NJRjBfUlggKi8KIAlwYXJhbS0+c2xhdmVfaWQgPSBzLT5jZmctPmRtYV9zbGF2ZV9yeDsKLQlwYXJhbS0+ZG1hX2RldiA9IHMtPmNmZy0+ZG1hX2RldjsKIAogCWNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGZpbHRlciwgcGFyYW0pOwogCWRldl9kYmcocG9ydC0+ZGV2LCAiJXM6IFJYOiBnb3QgY2hhbm5lbCAlcFxuIiwgX19mdW5jX18sIGNoYW4pOwpAQCAtMTU2NCw5ICsxNTc3LDYgQEAKIHsKIAlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSB0b19zY2lfcG9ydChwb3J0KTsKIAotCWlmICghcy0+Y2ZnLT5kbWFfZGV2KQotCQlyZXR1cm47Ci0KIAlpZiAocy0+Y2hhbl90eCkKIAkJc2NpX3R4X2RtYV9yZWxlYXNlKHMsIGZhbHNlKTsKIAlpZiAocy0+Y2hhbl9yeCkKQEAgLTE5ODEsOSArMTk5MSw5IEBACiAJcG9ydC0+c2VyaWFsX2luCQk9IHNjaV9zZXJpYWxfaW47CiAJcG9ydC0+c2VyaWFsX291dAk9IHNjaV9zZXJpYWxfb3V0OwogCi0JaWYgKHAtPmRtYV9kZXYpCi0JCWRldl9kYmcocG9ydC0+ZGV2LCAiRE1BIGRldmljZSAlcCwgdHggJWQsIHJ4ICVkXG4iLAotCQkJcC0+ZG1hX2RldiwgcC0+ZG1hX3NsYXZlX3R4LCBwLT5kbWFfc2xhdmVfcngpOworCWlmIChwLT5kbWFfc2xhdmVfdHggPiAwICYmIHAtPmRtYV9zbGF2ZV9yeCA+IDApCisJCWRldl9kYmcocG9ydC0+ZGV2LCAiRE1BIHR4ICVkLCByeCAlZFxuIiwKKwkJCXAtPmRtYV9zbGF2ZV90eCwgcC0+ZG1hX3NsYXZlX3J4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3RpbWJ1YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYwppbmRleCBhNGI2M2JmLi5lNzZjOGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInRpbWJ1YXJ0LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC91YXJ0bGl0ZS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKaW5kZXggYjkwODYxNS4uNmNkNDE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKQEAgLTU2OSw4ICs1NjksNiBAQAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdWxpdGVfb2ZfbWF0Y2gpOwotI2Vsc2UgLyogQ09ORklHX09GICovCi0jZGVmaW5lIHVsaXRlX29mX21hdGNoIE5VTEwKICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAogc3RhdGljIGludCBfX2RldmluaXQgdWxpdGVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTYxMCw3ICs2MDgsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkubmFtZSAgPSAidWFydGxpdGUiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSB1bGl0ZV9vZl9tYXRjaCwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHVsaXRlX29mX21hdGNoKSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3hpbGlueF91YXJ0cHMuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC94aWxpbnhfdWFydHBzLmMKaW5kZXggOGMwM2IxMi4uYjYyNzM2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3hpbGlueF91YXJ0cHMuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwveGlsaW54X3VhcnRwcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIFhVQVJUUFNfVFRZX05BTUUJInR0eVBTIgogI2RlZmluZSBYVUFSVFBTX05BTUUJCSJ4dWFydHBzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvdnQvdmNfc2NyZWVuLmMgYi9kcml2ZXJzL3R0eS92dC92Y19zY3JlZW4uYwppbmRleCA2NjgyNWM5Li43YTM2N2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS92dC92Y19zY3JlZW4uYworKysgYi9kcml2ZXJzL3R0eS92dC92Y19zY3JlZW4uYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX3BkcnYuYyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2LmMKaW5kZXggYmRjM2RiOS4uZmY1MDU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvX3BkcnYuYworKysgYi9kcml2ZXJzL3Vpby91aW9fcGRydi5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvX2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAidWlvX3BkcnYiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCmluZGV4IDBiMmVkNzEuLjI1ZGUzMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdWlvX2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcKaW5kZXggNGFjMjc1MC4uNzkxZjExYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9LY29uZmlnCkBAIC02Miw3ICs2Miw2IEBACiAJYm9vbGVhbgogCWRlZmF1bHQgeSBpZiBGU0xfU09DCiAJZGVmYXVsdCB5IGlmIFBQQ19NUEM1MTJ4Ci0JZGVmYXVsdCB5IGlmIFNPQ19BVTEyMDAKIAlkZWZhdWx0IHkgaWYgQVJDSF9JWFA0WFgKIAlkZWZhdWx0IHkgaWYgQVJDSF9XOTBYOTAwCiAJZGVmYXVsdCB5IGlmIEFSQ0hfQVQ5MVNBTTlHNDUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2M2N3gwMC9jNjd4MDAtZHJ2LmMgYi9kcml2ZXJzL3VzYi9jNjd4MDAvYzY3eDAwLWRydi5jCmluZGV4IDYyMDUwZjcuLjU3YWU0NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2M2N3gwMC9jNjd4MDAtZHJ2LmMKKysrIGIvZHJpdmVycy91c2IvYzY3eDAwL2M2N3gwMC1kcnYuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvYzY3eDAwLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IDNiMDI5YTAuLjQ1ODg3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9xdWlya3MuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CkBAIC0xNjY3LDYgKzE2NjgsMTEgQEAKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9ib3RoKHVkZXYsIFBNU0dfQVVUT19TVVNQRU5EKTsKKworCS8qIEFsbG93IGEgcmV0cnkgaWYgYXV0b3N1c3BlbmQgZmFpbGVkIHRlbXBvcmFyaWx5ICovCisJaWYgKHN0YXR1cyA9PSAtRUFHQUlOIHx8IHN0YXR1cyA9PSAtRUJVU1kpCisJCXVzYl9tYXJrX2xhc3RfYnVzeSh1ZGV2KTsKKwogCS8qIFRoZSBQTSBjb3JlIHJlYWN0cyBiYWRseSB1bmxlc3MgdGhlIHJldHVybiBjb2RlIGlzIDAsCiAJICogLUVBR0FJTiwgb3IgLUVCVVNZLCBzbyBhbHdheXMgcmV0dXJuIC1FQlVTWSBvbiBhbiBlcnJvci4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbm90aWZ5LmMgYi9kcml2ZXJzL3VzYi9jb3JlL25vdGlmeS5jCmluZGV4IDc1NDJkY2UuLjc3MjhjOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbm90aWZ5LmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9ub3RpZnkuYwpAQCAtMTAsNiArMTAsNyBAQAogCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY2RjMi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NkYzIuYwppbmRleCA2NzI2NzRjLi43MjU1NTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvY2RjMi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jZGMyLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInVfZXRoZXIuaCIKICNpbmNsdWRlICJ1X3NlcmlhbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCmluZGV4IDhhNTUyOWQuLmY3MWIwNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9kYmdwLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZGJncC5jCmluZGV4IGY4NTVlY2YuLjYyNTY0MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9kYmdwLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2RiZ3AuYwpAQCAtOSw2ICs5LDcgQEAKIC8qIHZlcmJvc2UgbWVzc2FnZXMgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9mcy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfZnMuYwppbmRleCA2YjFjMjBiLi5hY2IzODAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9mcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2ZzLmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxsaW51eC91c2IvY29tcG9zaXRlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9vYmV4LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9vYmV4LmMKaW5kZXggZTNmNzRiZi4uNWY0MDBmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfb2JleC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX29iZXguYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInVfc2VyaWFsLmgiCiAjaW5jbHVkZSAiZ2FkZ2V0X2NoaXBzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zb3VyY2VzaW5rLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zb3VyY2VzaW5rLmMKaW5kZXggMTY4OTA2ZC4uN2FhN2FjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc291cmNlc2luay5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NvdXJjZXNpbmsuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImdfemVyby5oIgogI2luY2x1ZGUgImdhZGdldF9jaGlwcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCmluZGV4IDNhYzRmNTEuLmY3ZTM5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKQEAgLTI0Myw2ICsyNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdXNiMzAwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1c2IzMDBfdWRjLmMKaW5kZXggZTU5M2YyOC4uNzRkYTIwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1c2IzMDBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1c2IzMDBfdWRjLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nbWlkaS5jCmluZGV4IDhmY2RlMzdhLi42ODFiZDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X3NlcmlhbC5jCmluZGV4IDNhNGE2NjQuLjY1OTdhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X3NlcmlhbC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ1X3NlcmlhbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlIGIvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQppbmRleCBlZDQ4YTVkLi43Y2EyOTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKQEAgLTM2LDMgKzM2LDQgQEAKIG9iai0kKENPTkZJR19VU0JfSU1YMjFfSENEKQkrPSBpbXgyMS1oY2Qubwogb2JqLSQoQ09ORklHX1VTQl9GU0xfTVBIX0RSX09GKQkrPSBmc2wtbXBoLWRyLW9mLm8KIG9iai0kKENPTkZJR19VU0JfT0NURU9OMl9DT01NT04pICs9IG9jdGVvbjItY29tbW9uLm8KK29iai0kKENPTkZJR19NSVBTX0FMQ0hFTVkpCSs9IGFsY2hlbXktY29tbW9uLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvYWxjaGVteS1jb21tb24uYyBiL2RyaXZlcnMvdXNiL2hvc3QvYWxjaGVteS1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE5MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaG9zdC9hbGNoZW15LWNvbW1vbi5jCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogVVNCIGJsb2NrIHBvd2VyL2FjY2VzcyBtYW5hZ2VtZW50IGFic3RyYWN0aW9uLgorICoKKyAqIEF1MTAwMCs6IFRoZSBPSENJIGJsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgaXMgYXQgdGhlIGZhciBlbmQgb2YgdGhlIE9IQ0kgbWVtb3J5CisgKgkgICAgYXJlYS4gQXUxNTUwIGhhcyBPSENJIG9uIGRpZmZlcmVudCBiYXNlIGFkZHJlc3MuIE5vIG5lZWQgdG8gaGFuZGxlCisgKgkgICAgVURDIGhlcmUuCisgKiBBdTEyMDA6ICBvbmUgcmVnaXN0ZXIgdG8gY29udHJvbCBhY2Nlc3MgYW5kIGNsb2NrcyB0byBPL0VIQ0ksIFVEQyBhbmQgT1RHCisgKgkgICAgYXMgd2VsbCBhcyB0aGUgUEhZIGZvciBFSENJIGFuZCBVREMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorCisvKiBjb250cm9sIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgQVUxMDAwX09IQ0lDRkcJMHg3ZmZmYworI2RlZmluZSBBVTE1NTBfT0hDSUNGRwkweDA3ZmZjCisjZGVmaW5lIEFVMTIwMF9VU0JDRkcJMHgwNAorCisvKiBBdTEwMDAgVVNCIGJsb2NrIGNvbmZpZyBiaXRzICovCisjZGVmaW5lIFVTQkhFTl9SRAkoMSA8PCA0KQkJLyogT0hDSSByZXNldC1kb25lIGluZGljYXRvciAqLworI2RlZmluZSBVU0JIRU5fQ0UJKDEgPDwgMykJCS8qIE9IQ0kgYmxvY2sgY2xvY2sgZW5hYmxlICovCisjZGVmaW5lIFVTQkhFTl9FCSgxIDw8IDIpCQkvKiBPSENJIGJsb2NrIGVuYWJsZSAqLworI2RlZmluZSBVU0JIRU5fQwkoMSA8PCAxKQkJLyogT0hDSSBibG9jayBjb2hlcmVuY3kgYml0ICovCisjZGVmaW5lIFVTQkhFTl9CRQkoMSA8PCAwKQkJLyogT0hDSSBCaWctRW5kaWFuICovCisKKy8qIEF1MTIwMCBVU0IgY29uZmlnIGJpdHMgKi8KKyNkZWZpbmUgVVNCQ0ZHX1BGRU4JKDEgPDwgMzEpCQkvKiBwcmVmZXRjaCBlbmFibGUgKHVuZG9jKSAqLworI2RlZmluZSBVU0JDRkdfUkRDT01CCSgxIDw8IDMwKQkJLyogcmVhZCBjb21iaW5pbmcgKHVuZG9jKSAqLworI2RlZmluZSBVU0JDRkdfVU5LTk9XTgkoNSA8PCAyMCkJCS8qIHVua25vd24sIGxlYXZlIHRoaXMgd2F5ICovCisjZGVmaW5lIFVTQkNGR19TU0QJKDEgPDwgMjMpCQkvKiBzZXJpYWwgc2hvcnQgZGV0ZWN0IGVuICovCisjZGVmaW5lIFVTQkNGR19QUEUJKDEgPDwgMTkpCQkvKiBIUyBQSFkgUExMICovCisjZGVmaW5lIFVTQkNGR19VQ0UJKDEgPDwgMTgpCQkvKiBVREMgY2xvY2sgZW5hYmxlICovCisjZGVmaW5lIFVTQkNGR19FQ0UJKDEgPDwgMTcpCQkvKiBFSENJIGNsb2NrIGVuYWJsZSAqLworI2RlZmluZSBVU0JDRkdfT0NFCSgxIDw8IDE2KQkJLyogT0hDSSBjbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgVVNCQ0ZHX0ZMQSh4KQkoKCh4KSAmIDB4M2YpIDw8IDgpCisjZGVmaW5lIFVTQkNGR19VQ0FNCSgxIDw8IDcpCQkvKiBjb2hlcmVudCBhY2Nlc3MgKHVuZG9jKSAqLworI2RlZmluZSBVU0JDRkdfR01FCSgxIDw8IDYpCQkvKiBPVEcgbWVtIGFjY2VzcyAqLworI2RlZmluZSBVU0JDRkdfREJFCSgxIDw8IDUpCQkvKiBVREMgYnVzbWFzdGVyIGVuYWJsZSAqLworI2RlZmluZSBVU0JDRkdfRE1FCSgxIDw8IDQpCQkvKiBVREMgbWVtIGVuYWJsZSAqLworI2RlZmluZSBVU0JDRkdfRUJFCSgxIDw8IDMpCQkvKiBFSENJIGJ1c21hc3RlciBlbmFibGUgKi8KKyNkZWZpbmUgVVNCQ0ZHX0VNRQkoMSA8PCAyKQkJLyogRUhDSSBtZW0gZW5hYmxlICovCisjZGVmaW5lIFVTQkNGR19PQkUJKDEgPDwgMSkJCS8qIE9IQ0kgYnVzbWFzdGVyIGVuYWJsZSAqLworI2RlZmluZSBVU0JDRkdfT01FCSgxIDw8IDApCQkvKiBPSENJIG1lbSBlbmFibGUgKi8KKyNkZWZpbmUgVVNCQ0ZHX0lOSVRfQVUxMjAwCShVU0JDRkdfUEZFTiB8IFVTQkNGR19SRENPTUIgfCBVU0JDRkdfVU5LTk9XTiB8XAorCQkJCSBVU0JDRkdfU1NEIHwgVVNCQ0ZHX0ZMQSgweDIwKSB8IFVTQkNGR19VQ0FNIHwgXAorCQkJCSBVU0JDRkdfR01FIHwgVVNCQ0ZHX0RCRSB8IFVTQkNGR19ETUUgfAkgICAgICAgXAorCQkJCSBVU0JDRkdfRUJFIHwgVVNCQ0ZHX0VNRSB8IFVTQkNGR19PQkUgfAkgICAgICAgXAorCQkJCSBVU0JDRkdfT01FKQorCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWxjaGVteV91c2JfbG9jayk7CisKKworc3RhdGljIGlubGluZSB2b2lkIF9fYXUxMjAwX29oY2lfY29udHJvbCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyByID0gX19yYXdfcmVhZGwoYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCWlmIChlbmFibGUpIHsKKwkJX19yYXdfd3JpdGVsKHIgfCBVU0JDRkdfT0NFLCBiYXNlICsgQVUxMjAwX1VTQkNGRyk7CisJCXdtYigpOworCQl1ZGVsYXkoMjAwMCk7CisJfSBlbHNlIHsKKwkJX19yYXdfd3JpdGVsKHIgJiB+VVNCQ0ZHX09DRSwgYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCQl3bWIoKTsKKwkJdWRlbGF5KDEwMDApOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fYXUxMjAwX2VoY2lfY29udHJvbCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyByID0gX19yYXdfcmVhZGwoYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCWlmIChlbmFibGUpIHsKKwkJX19yYXdfd3JpdGVsKHIgfCBVU0JDRkdfRUNFIHwgVVNCQ0ZHX1BQRSwgYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCQl3bWIoKTsKKwkJdWRlbGF5KDEwMDApOworCX0gZWxzZSB7CisJCWlmICghKHIgJiBVU0JDRkdfVUNFKSkJCS8qIFVEQyBhbHNvIG9mZj8gKi8KKwkJCXIgJj0gflVTQkNGR19QUEU7CS8qIHllczogZGlzYWJsZSBIUyBQSFkgUExMICovCisJCV9fcmF3X3dyaXRlbChyICYgflVTQkNGR19FQ0UsIGJhc2UgKyBBVTEyMDBfVVNCQ0ZHKTsKKwkJd21iKCk7CisJCXVkZWxheSgxMDAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2F1MTIwMF91ZGNfY29udHJvbCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyByID0gX19yYXdfcmVhZGwoYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCWlmIChlbmFibGUpIHsKKwkJX19yYXdfd3JpdGVsKHIgfCBVU0JDRkdfVUNFIHwgVVNCQ0ZHX1BQRSwgYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCQl3bWIoKTsKKwl9IGVsc2UgeworCQlpZiAoIShyICYgVVNCQ0ZHX0VDRSkpCQkvKiBFSENJIGFsc28gb2ZmPyAqLworCQkJciAmPSB+VVNCQ0ZHX1BQRTsJLyogeWVzOiBkaXNhYmxlIEhTIFBIWSBQTEwgKi8KKwkJX19yYXdfd3JpdGVsKHIgJiB+VVNCQ0ZHX1VDRSwgYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCQl3bWIoKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1MTIwMF9jb2hlcmVuY3lfYnVnKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfRE1BX0NPSEVSRU5UKQorCS8qIEF1MTIwMCBBQiBVU0IgZG9lcyBub3Qgc3VwcG9ydCBjb2hlcmVudCBtZW1vcnkgKi8KKwlpZiAoIShyZWFkX2MwX3ByaWQoKSAmIDB4ZmYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkF1MTIwMCBVU0I6IHRoaXMgaXMgY2hpcCByZXZpc2lvbiBBQiAhIVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIkF1MTIwMCBVU0I6IHVwZGF0ZSB5b3VyIGJvYXJkIG9yIHJlLWNvbmZpZ3VyZSIKKwkJCQkgIiB0aGUga2VybmVsXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1MTIwMF91c2JfY29udHJvbChpbnQgYmxvY2ssIGludCBlbmFibGUpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlID0KKwkJCSh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMjAwX1VTQl9DVExfUEhZU19BRERSKTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoYmxvY2spIHsKKwljYXNlIEFMQ0hFTVlfVVNCX09IQ0kwOgorCQlyZXQgPSBhdTEyMDBfY29oZXJlbmN5X2J1ZygpOworCQlpZiAocmV0ICYmIGVuYWJsZSkKKwkJCWdvdG8gb3V0OworCQlfX2F1MTIwMF9vaGNpX2NvbnRyb2woYmFzZSwgZW5hYmxlKTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX1VTQl9VREMwOgorCQlfX2F1MTIwMF91ZGNfY29udHJvbChiYXNlLCBlbmFibGUpOworCQlicmVhazsKKwljYXNlIEFMQ0hFTVlfVVNCX0VIQ0kwOgorCQlyZXQgPSBhdTEyMDBfY29oZXJlbmN5X2J1ZygpOworCQlpZiAocmV0ICYmIGVuYWJsZSkKKwkJCWdvdG8gb3V0OworCQlfX2F1MTIwMF9laGNpX2NvbnRyb2woYmFzZSwgZW5hYmxlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCisvKiBpbml0aWFsaXplIFVTQiBibG9jayhzKSB0byBhIGtub3duIHdvcmtpbmcgc3RhdGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdTEyMDBfdXNiX2luaXQodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPQorCQkJKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTEyMDBfVVNCX0NUTF9QSFlTX0FERFIpOworCV9fcmF3X3dyaXRlbChVU0JDRkdfSU5JVF9BVTEyMDAsIGJhc2UgKyBBVTEyMDBfVVNCQ0ZHKTsKKwl3bWIoKTsKKwl1ZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdTEwMDBfdXNiX2luaXQodW5zaWduZWQgbG9uZyByYiwgaW50IHJlZykKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKHJiICsgcmVnKTsKKwl1bnNpZ25lZCBsb25nIHIgPSBfX3Jhd19yZWFkbChiYXNlKTsKKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXIgfD0gVVNCSEVOX0JFOworI2VuZGlmCisJciB8PSBVU0JIRU5fQzsKKworCV9fcmF3X3dyaXRlbChyLCBiYXNlKTsKKwl3bWIoKTsKKwl1ZGVsYXkoMTAwMCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIF9fYXUxeHgwX29oY2lfY29udHJvbChpbnQgZW5hYmxlLCB1bnNpZ25lZCBsb25nIHJiLCBpbnQgY3JlZykKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKHJiKTsKKwl1bnNpZ25lZCBsb25nIHIgPSBfX3Jhd19yZWFkbChiYXNlICsgY3JlZyk7CisKKwlpZiAoZW5hYmxlKSB7CisJCV9fcmF3X3dyaXRlbChyIHwgVVNCSEVOX0NFLCBiYXNlICsgY3JlZyk7CisJCXdtYigpOworCQl1ZGVsYXkoMTAwMCk7CisJCV9fcmF3X3dyaXRlbChyIHwgVVNCSEVOX0NFIHwgVVNCSEVOX0UsIGJhc2UgKyBjcmVnKTsKKwkJd21iKCk7CisJCXVkZWxheSgxMDAwKTsKKworCQkvKiB3YWl0IGZvciByZXNldCBjb21wbGV0ZSAocmVhZCByZWcgdHdpY2U6IGF1MTUwMCBlcnJhdHVtKSAqLworCQl3aGlsZSAoX19yYXdfcmVhZGwoYmFzZSArIGNyZWcpLAorCQkJIShfX3Jhd19yZWFkbChiYXNlICsgY3JlZykgJiBVU0JIRU5fUkQpKQorCQkJdWRlbGF5KDEwMDApOworCX0gZWxzZSB7CisJCV9fcmF3X3dyaXRlbChyICYgfihVU0JIRU5fQ0UgfCBVU0JIRU5fRSksIGJhc2UgKyBjcmVnKTsKKwkJd21iKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBhdTEwMDBfdXNiX2NvbnRyb2woaW50IGJsb2NrLCBpbnQgZW5hYmxlLCB1bnNpZ25lZCBsb25nIHJiLAorCQkJCSAgICAgaW50IGNyZWcpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGJsb2NrKSB7CisJY2FzZSBBTENIRU1ZX1VTQl9PSENJMDoKKwkJX19hdTF4eDBfb2hjaV9jb250cm9sKGVuYWJsZSwgcmIsIGNyZWcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREVWOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogYWxjaGVteV91c2JfY29udHJvbCAtIGNvbnRyb2wgQWxjaGVteSBvbi1jaGlwIFVTQiBibG9ja3MKKyAqIEBibG9jazoJVVNCIGJsb2NrIHRvIHRhcmdldAorICogQGVuYWJsZToJc2V0IDEgdG8gZW5hYmxlIGEgYmxvY2ssIDAgdG8gZGlzYWJsZQorICovCitpbnQgYWxjaGVteV91c2JfY29udHJvbChpbnQgYmxvY2ssIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFsY2hlbXlfdXNiX2xvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMDAwOgorCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTAwOgorCWNhc2UgQUxDSEVNWV9DUFVfQVUxMTAwOgorCQlyZXQgPSBhdTEwMDBfdXNiX2NvbnRyb2woYmxvY2ssIGVuYWJsZSwKKwkJCQlBVTEwMDBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTEwMDBfT0hDSUNGRyk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTUwOgorCQlyZXQgPSBhdTEwMDBfdXNiX2NvbnRyb2woYmxvY2ssIGVuYWJsZSwKKwkJCQlBVTE1NTBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTE1NTBfT0hDSUNGRyk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgorCQlyZXQgPSBhdTEyMDBfdXNiX2NvbnRyb2woYmxvY2ssIGVuYWJsZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9ERVY7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFsY2hlbXlfdXNiX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWxjaGVteV91c2JfY29udHJvbCk7CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxjaGVteV91c2JfcG1kYXRhWzJdOworCitzdGF0aWMgdm9pZCBhdTEwMDBfdXNiX3BtKHVuc2lnbmVkIGxvbmcgYnIsIGludCBjcmVnLCBpbnQgc3VzcCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKGJyKTsKKworCWlmIChzdXNwKSB7CisJCWFsY2hlbXlfdXNiX3BtZGF0YVswXSA9IF9fcmF3X3JlYWRsKGJhc2UgKyBjcmVnKTsKKwkJLyogVGhlcmUgYXBwZWFycyB0byBiZSBzb21lIHVuZG9jdW1lbnRlZCByZXNldCByZWdpc3Rlci4uLi4gKi8KKwkJX19yYXdfd3JpdGVsKDAsIGJhc2UgKyAweDA0KTsKKwkJd21iKCk7CisJCV9fcmF3X3dyaXRlbCgwLCBiYXNlICsgY3JlZyk7CisJCXdtYigpOworCX0gZWxzZSB7CisJCV9fcmF3X3dyaXRlbChhbGNoZW15X3VzYl9wbWRhdGFbMF0sIGJhc2UgKyBjcmVnKTsKKwkJd21iKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdTEyMDBfdXNiX3BtKGludCBzdXNwKQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9CisJCQkodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTIwMF9VU0JfT1RHX1BIWVNfQUREUik7CisJaWYgKHN1c3ApIHsKKwkJLyogc2F2ZSBPVEdfQ0FQL01VWCByZWdpc3RlcnMgd2hpY2ggaW5kaWNhdGUgcG9ydCByb3V0aW5nICovCisJCS8qIEZJWE1FOiB3cml0ZSBhbiBPVEcgZHJpdmVyIHRvIGRvIHRoYXQgKi8KKwkJYWxjaGVteV91c2JfcG1kYXRhWzBdID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDApOworCQlhbGNoZW15X3VzYl9wbWRhdGFbMV0gPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwNCk7CisJfSBlbHNlIHsKKwkJLyogcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIE1NSU8gYXJlYXMgKi8KKwkJYXUxMjAwX3VzYl9pbml0KCk7CisKKwkJLyogcmVzdG9yZSBPVEdfQ0FQL01VWCByZWdpc3RlcnMgKi8KKwkJX19yYXdfd3JpdGVsKGFsY2hlbXlfdXNiX3BtZGF0YVswXSwgYmFzZSArIDB4MDApOworCQlfX3Jhd193cml0ZWwoYWxjaGVteV91c2JfcG1kYXRhWzFdLCBiYXNlICsgMHgwNCk7CisJCXdtYigpOworCX0KK30KKworc3RhdGljIHZvaWQgYWxjaGVteV91c2JfcG0oaW50IHN1c3ApCit7CisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTAwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTUwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTEwMDoKKwkJYXUxMDAwX3VzYl9wbShBVTEwMDBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTEwMDBfT0hDSUNGRywgc3VzcCk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTUwOgorCQlhdTEwMDBfdXNiX3BtKEFVMTU1MF9VU0JfT0hDSV9QSFlTX0FERFIsIEFVMTU1MF9PSENJQ0ZHLCBzdXNwKTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTEyMDA6CisJCWF1MTIwMF91c2JfcG0oc3VzcCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBhbGNoZW15X3VzYl9zdXNwZW5kKHZvaWQpCit7CisJYWxjaGVteV91c2JfcG0oMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFsY2hlbXlfdXNiX3Jlc3VtZSh2b2lkKQoreworCWFsY2hlbXlfdXNiX3BtKDApOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGFsY2hlbXlfdXNiX3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IGFsY2hlbXlfdXNiX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhbGNoZW15X3VzYl9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbGNoZW15X3VzYl9pbml0KHZvaWQpCit7CisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTAwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTUwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTEwMDoKKwkJYXUxMDAwX3VzYl9pbml0KEFVMTAwMF9VU0JfT0hDSV9QSFlTX0FERFIsIEFVMTAwMF9PSENJQ0ZHKTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTE1NTA6CisJCWF1MTAwMF91c2JfaW5pdChBVTE1NTBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTE1NTBfT0hDSUNGRyk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgorCQlhdTEyMDBfdXNiX2luaXQoKTsKKwkJYnJlYWs7CisJfQorCisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmFsY2hlbXlfdXNiX3BtX29wcyk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoYWxjaGVteV91c2JfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXUxeHh4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXUxeHh4LmMKaW5kZXggNjU3MTllOC4uMThiYWZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWF1MXh4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1hdTF4eHguYwpAQCAtMTQsNjEgKzE0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAKLSNkZWZpbmUgVVNCX0hPU1RfQ09ORklHICAgKFVTQl9NU1JfQkFTRSArIFVTQl9NU1JfTUNGRykKLSNkZWZpbmUgVVNCX01DRkdfUEZFTiAgICAgKDE8PDMxKQotI2RlZmluZSBVU0JfTUNGR19SRENPTUIgICAoMTw8MzApCi0jZGVmaW5lIFVTQl9NQ0ZHX1NTREVOICAgICgxPDwyMykKLSNkZWZpbmUgVVNCX01DRkdfUEhZUExMRU4gKDE8PDE5KQotI2RlZmluZSBVU0JfTUNGR19VQ0VDTEtFTiAoMTw8MTgpCi0jZGVmaW5lIFVTQl9NQ0ZHX0VIQ0NMS0VOICgxPDwxNykKLSNpZmRlZiBDT05GSUdfRE1BX0NPSEVSRU5UCi0jZGVmaW5lIFVTQl9NQ0ZHX1VDQU0gICAgICgxPDw3KQotI2Vsc2UKLSNkZWZpbmUgVVNCX01DRkdfVUNBTSAgICAgKDApCi0jZW5kaWYKLSNkZWZpbmUgVVNCX01DRkdfRUJNRU4gICAgKDE8PDMpCi0jZGVmaW5lIFVTQl9NQ0ZHX0VNRU1FTiAgICgxPDwyKQotCi0jZGVmaW5lIFVTQkhfRU5BQkxFX0NFCShVU0JfTUNGR19QSFlQTExFTiB8IFVTQl9NQ0ZHX0VIQ0NMS0VOKQotI2RlZmluZSBVU0JIX0VOQUJMRV9JTklUIChVU0JfTUNGR19QRkVOICB8IFVTQl9NQ0ZHX1JEQ09NQiB8CVwKLQkJCSAgVVNCSF9FTkFCTEVfQ0UgfCBVU0JfTUNGR19TU0RFTiAgfAlcCi0JCQkgIFVTQl9NQ0ZHX1VDQU0gIHwgVVNCX01DRkdfRUJNRU4gIHwJXAotCQkJICBVU0JfTUNGR19FTUVNRU4pCi0KLSNkZWZpbmUgVVNCSF9ESVNBQkxFICAgICAgKFVTQl9NQ0ZHX0VCTUVOIHwgVVNCX01DRkdfRU1FTUVOKQogCiBleHRlcm4gaW50IHVzYl9kaXNhYmxlZCh2b2lkKTsKIAotc3RhdGljIHZvaWQgYXUxeHh4X3N0YXJ0X2VoYyh2b2lkKQotewotCS8qIGVuYWJsZSBjbG9jayB0byBFSENJIGJsb2NrIGFuZCBIUyBQSFkgUExMKi8KLQlhdV93cml0ZWwoYXVfcmVhZGwoVVNCX0hPU1RfQ09ORklHKSB8IFVTQkhfRU5BQkxFX0NFLCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiBlbmFibGUgRUhDSSBtbWlvICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRykgfCBVU0JIX0VOQUJMRV9JTklULCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLQl1ZGVsYXkoMTAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1MXh4eF9zdG9wX2VoYyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgYzsKLQotCS8qIERpc2FibGUgbWVtICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRykgJiB+VVNCSF9ESVNBQkxFLCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiBEaXNhYmxlIEVIQyBjbG9jay4gSWYgdGhlIEhTIFBIWSBpcyB1bnVzZWQgZGlzYWJsZSBpdCB0b28uICovCi0JYyA9IGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRykgJiB+VVNCX01DRkdfRUhDQ0xLRU47Ci0JaWYgKCEoYyAmIFVTQl9NQ0ZHX1VDRUNMS0VOKSkJCS8qIFVEQyBkaXNhYmxlZD8gKi8KLQkJYyAmPSB+VVNCX01DRkdfUEhZUExMRU47CS8qIHllczogZGlzYWJsZSBIUyBQSFkgUExMICovCi0JYXVfd3JpdGVsKGMsIFVTQl9IT1NUX0NPTkZJRyk7Ci0JYXVfc3luYygpOwotfQotCiBzdGF0aWMgaW50IGF1MXh4eF9laGNpX3NldHVwKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IGVoY2lfaGNkICplaGNpID0gaGNkX3RvX2VoY2koaGNkKTsKQEAgLTEzNiwxNiArODQsNiBAQAogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMjAwKSAmJiBkZWZpbmVkKENPTkZJR19ETUFfQ09IRVJFTlQpCi0JLyogQXUxMjAwIEFCIFVTQiBkb2VzIG5vdCBzdXBwb3J0IGNvaGVyZW50IG1lbW9yeSAqLwotCWlmICghKHJlYWRfYzBfcHJpZCgpICYgMHhmZikpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHRoaXMgaXMgY2hpcCByZXZpc2lvbiBBQiFcbiIsIHBkZXYtPm5hbWUpOwotCQlwcmludGsoS0VSTl9JTkZPICIlczogdXBkYXRlIHlvdXIgYm9hcmQgb3IgcmUtY29uZmlndXJlIgotCQkJCSAiIHRoZSBrZXJuZWxcbiIsIHBkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0jZW5kaWYKLQogCWlmIChwZGV2LT5yZXNvdXJjZVsxXS5mbGFncyAhPSBJT1JFU09VUkNFX0lSUSkgewogCQlwcl9kZWJ1ZygicmVzb3VyY2VbMV0gaXMgbm90IElPUkVTT1VSQ0VfSVJRIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTcxLDcgKzEwOSwxMSBAQAogCQlnb3RvIGVycjI7CiAJfQogCi0JYXUxeHh4X3N0YXJ0X2VoYygpOworCWlmIChhbGNoZW15X3VzYl9jb250cm9sKEFMQ0hFTVlfVVNCX0VIQ0kwLCAxKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY29udHJvbGxlciBpbml0IGZhaWxlZCFcbiIsIHBkZXYtPm5hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjM7CisJfQogCiAJZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CiAJZWhjaS0+Y2FwcyA9IGhjZC0+cmVnczsKQEAgLTE4Nyw3ICsxMjksOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWF1MXh4eF9zdG9wX2VoYygpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfRUhDSTAsIDApOworZXJyMzoKIAlpb3VubWFwKGhjZC0+cmVncyk7CiBlcnIyOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOwpAQCAtMjAxLDEwICsxNDQsMTAgQEAKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAl1c2JfcmVtb3ZlX2hjZChoY2QpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfRUhDSTAsIDApOwogCWlvdW5tYXAoaGNkLT5yZWdzKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKIAl1c2JfcHV0X2hjZChoY2QpOwotCWF1MXh4eF9zdG9wX2VoYygpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCiAJcmV0dXJuIDA7CkBAIC0yMzYsNyArMTc5LDcgQEAKIAkvLyBjb3VsZCBzYXZlIEZMQURKIGluIGNhc2Ugb2YgVmF1eCBwb3dlciBsb3NzCiAJLy8gLi4uIHdlJ2Qgb25seSB1c2UgaXQgdG8gaGFuZGxlIGNsb2NrIHNrZXcKIAotCWF1MXh4eF9zdG9wX2VoYygpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfRUhDSTAsIDApOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMjQ2LDcgKzE4OSw3IEBACiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CiAKLQlhdTF4eHhfc3RhcnRfZWhjKCk7CisJYWxjaGVteV91c2JfY29udHJvbChBTENIRU1ZX1VTQl9FSENJMCwgMSk7CiAKIAkvLyBtYXliZSByZXN0b3JlIEZMQURKCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwppbmRleCA1OWU4MTYxLi4zZmY5ZjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCkBAIC0xMjI0LDcgKzEyMjQsNyBAQAogI2RlZmluZSBQTEFURk9STV9EUklWRVIJCWVoY2lfaGNkX3NoX2RyaXZlcgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAorI2lmZGVmIENPTkZJR19NSVBTX0FMQ0hFTVkKICNpbmNsdWRlICJlaGNpLWF1MXh4eC5jIgogI2RlZmluZQlQTEFURk9STV9EUklWRVIJCWVoY2lfaGNkX2F1MXh4eF9kcml2ZXIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9mc2wtbXBoLWRyLW9mLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYwppbmRleCA3OWE2NmQ2Li45MDM3MDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IGZzbF91c2IyX2Rldl9kYXRhIHsKIAljaGFyICpkcl9tb2RlOwkJLyogY29udHJvbGxlciBtb2RlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaWYuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jCmluZGV4IDJjN2ZjODMuLmE3ZGMxZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxNzYwLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2hjZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKaW5kZXggOTQ0MjkxZS4uYmEzYTQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCkBAIC0zNSw4ICszNSw3IEBACiAKIHN0YXRpYyB2b2lkIGF0OTFfc3RhcnRfY2xvY2sodm9pZCkKIHsKLQlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzEwKCkpCi0JCWNsa19lbmFibGUoaGNsayk7CisJY2xrX2VuYWJsZShoY2xrKTsKIAljbGtfZW5hYmxlKGljbGspOwogCWNsa19lbmFibGUoZmNsayk7CiAJY2xvY2tlZCA9IDE7CkBAIC00Niw4ICs0NSw3IEBACiB7CiAJY2xrX2Rpc2FibGUoZmNsayk7CiAJY2xrX2Rpc2FibGUoaWNsayk7Ci0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQotCQljbGtfZGlzYWJsZShoY2xrKTsKKwljbGtfZGlzYWJsZShoY2xrKTsKIAljbG9ja2VkID0gMDsKIH0KIApAQCAtMTQyLDggKzE0MCw3IEBACiAKIAlpY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAib2hjaV9jbGsiKTsKIAlmY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAidWhwY2siKTsKLQlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzEwKCkpCi0JCWhjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJoY2swIik7CisJaGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImhjbGsiKTsKIAogCWF0OTFfc3RhcnRfaGMocGRldik7CiAJb2hjaV9oY2RfaW5pdChoY2RfdG9fb2hjaShoY2QpKTsKQEAgLTE1NSw4ICsxNTIsNyBAQAogCS8qIEVycm9yIGhhbmRsaW5nICovCiAJYXQ5MV9zdG9wX2hjKHBkZXYpOwogCi0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQotCQljbGtfcHV0KGhjbGspOworCWNsa19wdXQoaGNsayk7CiAJY2xrX3B1dChmY2xrKTsKIAljbGtfcHV0KGljbGspOwogCkBAIC0xOTIsOCArMTg4LDcgQEAKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKIAl1c2JfcHV0X2hjZChoY2QpOwogCi0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQotCQljbGtfcHV0KGhjbGspOworCWNsa19wdXQoaGNsayk7CiAJY2xrX3B1dChmY2xrKTsKIAljbGtfcHV0KGljbGspOwogCWZjbGsgPSBpY2xrID0gaGNsayA9IE5VTEw7CkBAIC0yMjMsNiArMjE4LDE1NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBvaGNpX2F0OTFfdXNiX3NldF9wb3dlcihzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgKnBkYXRhLCBpbnQgcG9ydCwgaW50IGVuYWJsZSkKK3sKKwlpZiAocG9ydCA8IDAgfHwgcG9ydCA+PSAyKQorCQlyZXR1cm47CisKKwlncGlvX3NldF92YWx1ZShwZGF0YS0+dmJ1c19waW5bcG9ydF0sICFwZGF0YS0+dmJ1c19waW5faW52ZXJ0ZWQgXiBlbmFibGUpOworfQorCitzdGF0aWMgaW50IG9oY2lfYXQ5MV91c2JfZ2V0X3Bvd2VyKHN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqcGRhdGEsIGludCBwb3J0KQoreworCWlmIChwb3J0IDwgMCB8fCBwb3J0ID49IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKHBkYXRhLT52YnVzX3Bpbltwb3J0XSkgXiAhcGRhdGEtPnZidXNfcGluX2ludmVydGVkOworfQorCisvKgorICogVXBkYXRlIHRoZSBzdGF0dXMgZGF0YSBmcm9tIHRoZSBodWIgd2l0aCB0aGUgb3Zlci1jdXJyZW50IGluZGljYXRvciBjaGFuZ2UuCisgKi8KK3N0YXRpYyBpbnQgb2hjaV9hdDkxX2h1Yl9zdGF0dXNfZGF0YShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IGF0OTFfdXNiaF9kYXRhICpwZGF0YSA9IGhjZC0+c2VsZi5jb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhOworCWludCBsZW5ndGggPSBvaGNpX2h1Yl9zdGF0dXNfZGF0YShoY2QsIGJ1Zik7CisJaW50IHBvcnQ7CisKKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgQVJSQVlfU0laRShwZGF0YS0+b3ZlcmN1cnJlbnRfcGluKTsgcG9ydCsrKSB7CisJCWlmIChwZGF0YS0+b3ZlcmN1cnJlbnRfY2hhbmdlZFtwb3J0XSkgeworCQkJaWYgKCEgbGVuZ3RoKQorCQkJCWxlbmd0aCA9IDE7CisJCQlidWZbMF0gfD0gMSA8PCAocG9ydCArIDEpOworCQl9CisJfQorCisJcmV0dXJuIGxlbmd0aDsKK30KKworLyoKKyAqIExvb2sgYXQgdGhlIGNvbnRyb2wgcmVxdWVzdHMgdG8gdGhlIHJvb3QgaHViIGFuZCBzZWUgaWYgd2UgbmVlZCB0byBvdmVycmlkZS4KKyAqLworc3RhdGljIGludCBvaGNpX2F0OTFfaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwgdTE2IHR5cGVSZXEsIHUxNiB3VmFsdWUsCisJCQkJIHUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCit7CisJc3RydWN0IGF0OTFfdXNiaF9kYXRhICpwZGF0YSA9IGhjZC0+c2VsZi5jb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2M7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdTMyICpkYXRhID0gKHUzMiAqKWJ1ZjsKKworCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCSJvaGNpX2F0OTFfaHViX2NvbnRyb2woJXAsMHglMDR4LDB4JTA0eCwweCUwNHgsJXAsJTA0eClcbiIsCisJCWhjZCwgdHlwZVJlcSwgd1ZhbHVlLCB3SW5kZXgsIGJ1Ziwgd0xlbmd0aCk7CisKKwlzd2l0Y2ggKHR5cGVSZXEpIHsKKwljYXNlIFNldFBvcnRGZWF0dXJlOgorCQlpZiAod1ZhbHVlID09IFVTQl9QT1JUX0ZFQVRfUE9XRVIpIHsKKwkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJTZXRQb3J0RmVhdDogUE9XRVJcbiIpOworCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHdJbmRleCAtIDEsIDEpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVDoKKwkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCQkJIkNsZWFyUG9ydEZlYXR1cmU6IENfT1ZFUl9DVVJSRU5UXG4iKTsKKworCQkJaWYgKHdJbmRleCA9PSAxIHx8IHdJbmRleCA9PSAyKSB7CisJCQkJcGRhdGEtPm92ZXJjdXJyZW50X2NoYW5nZWRbd0luZGV4LTFdID0gMDsKKwkJCQlwZGF0YS0+b3ZlcmN1cnJlbnRfc3RhdHVzW3dJbmRleC0xXSA9IDA7CisJCQl9CisKKwkJCWdvdG8gb3V0OworCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9PVkVSX0NVUlJFTlQ6CisJCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJCSJDbGVhclBvcnRGZWF0dXJlOiBPVkVSX0NVUlJFTlRcbiIpOworCisJCQlpZiAod0luZGV4ID09IDEgfHwgd0luZGV4ID09IDIpIHsKKwkJCQlwZGF0YS0+b3ZlcmN1cnJlbnRfc3RhdHVzW3dJbmRleC0xXSA9IDA7CisJCQl9CisKKwkJCWdvdG8gb3V0OworCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKKwkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCQkJIkNsZWFyUG9ydEZlYXR1cmU6IFBPV0VSXG4iKTsKKworCQkJaWYgKHdJbmRleCA9PSAxIHx8IHdJbmRleCA9PSAyKSB7CisJCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHdJbmRleCAtIDEsIDApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldCA9IG9oY2lfaHViX2NvbnRyb2woaGNkLCB0eXBlUmVxLCB3VmFsdWUsIHdJbmRleCwgYnVmLCB3TGVuZ3RoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAodHlwZVJlcSkgeworCWNhc2UgR2V0SHViRGVzY3JpcHRvcjoKKworCQkvKiB1cGRhdGUgdGhlIGh1YidzIGRlc2NyaXB0b3IgKi8KKworCQlkZXNjID0gKHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKilidWY7CisKKwkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIndIdWJDaGFyYWN0ZXJpc3RpY3MgMHglMDR4XG4iLAorCQkJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyk7CisKKwkJLyogcmVtb3ZlIHRoZSBvbGQgY29uZmlndXJhdGlvbnMgZm9yIHBvd2VyLXN3aXRjaGluZywgYW5kCisJCSAqIG92ZXItY3VycmVudCBwcm90ZWN0aW9uLCBhbmQgaW5zZXJ0IG91ciBuZXcgY29uZmlndXJhdGlvbgorCQkgKi8KKworCQlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzICY9IH5jcHVfdG9fbGUxNihIVUJfQ0hBUl9MUFNNKTsKKwkJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyB8PSBjcHVfdG9fbGUxNigweDAwMDEpOworCisJCWlmIChwZGF0YS0+b3ZlcmN1cnJlbnRfc3VwcG9ydGVkKSB7CisJCQlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzICY9IH5jcHVfdG9fbGUxNihIVUJfQ0hBUl9PQ1BNKTsKKwkJCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgfD0gIGNwdV90b19sZTE2KDB4MDAwOHwweDAwMDEpOworCQl9CisKKwkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIndIdWJDaGFyYWN0ZXJpc3RpY3MgYWZ0ZXIgMHglMDR4XG4iLAorCQkJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyk7CisKKwkJcmV0dXJuIHJldDsKKworCWNhc2UgR2V0UG9ydFN0YXR1czoKKwkJLyogY2hlY2sgcG9ydCBzdGF0dXMgKi8KKworCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiR2V0UG9ydFN0YXR1cyglZClcbiIsIHdJbmRleCk7CisKKwkJaWYgKHdJbmRleCA9PSAxIHx8IHdJbmRleCA9PSAyKSB7CisJCQlpZiAoISBvaGNpX2F0OTFfdXNiX2dldF9wb3dlcihwZGF0YSwgd0luZGV4LTEpKSB7CisJCQkJKmRhdGEgJj0gfmNwdV90b19sZTMyKFJIX1BTX1BQUyk7CisJCQl9CisKKwkJCWlmIChwZGF0YS0+b3ZlcmN1cnJlbnRfY2hhbmdlZFt3SW5kZXgtMV0pIHsKKwkJCQkqZGF0YSB8PSBjcHVfdG9fbGUzMihSSF9QU19PQ0lDKTsKKwkJCX0KKworCQkJaWYgKHBkYXRhLT5vdmVyY3VycmVudF9zdGF0dXNbd0luZGV4LTFdKSB7CisJCQkJKmRhdGEgfD0gY3B1X3RvX2xlMzIoUkhfUFNfUE9DSSk7CisJCQl9CisJCX0KKwl9CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgb2hjaV9hdDkxX2hjX2RyaXZlciA9IHsKQEAgLTI1OCw4ICs0MDMsOCBAQAogCS8qCiAJICogcm9vdCBodWIgc3VwcG9ydAogCSAqLwotCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKLQkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKKwkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9hdDkxX2h1Yl9zdGF0dXNfZGF0YSwKKwkuaHViX2NvbnRyb2wgPQkJb2hjaV9hdDkxX2h1Yl9jb250cm9sLAogI2lmZGVmIENPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKQEAgLTI2OSwyMiArNDE0LDcxIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBvaGNpX2hjZF9hdDkxX292ZXJjdXJyZW50X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBkYXRhOworCXN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgdmFsLCBncGlvLCBwb3J0OworCisJLyogRnJvbSB0aGUgR1BJTyBub3RpZnlpbmcgdGhlIG92ZXItY3VycmVudCBzaXR1YXRpb24sIGZpbmQKKwkgKiBvdXQgdGhlIGNvcnJlc3BvbmRpbmcgcG9ydCAqLworCWdwaW8gPSBpcnFfdG9fZ3BpbyhpcnEpOworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBBUlJBWV9TSVpFKHBkYXRhLT5vdmVyY3VycmVudF9waW4pOyBwb3J0KyspIHsKKwkJaWYgKHBkYXRhLT5vdmVyY3VycmVudF9waW5bcG9ydF0gPT0gZ3BpbykKKwkJCWJyZWFrOworCX0KKworCWlmIChwb3J0ID09IEFSUkFZX1NJWkUocGRhdGEtPm92ZXJjdXJyZW50X3BpbikpIHsKKwkJZGV2X2VycigmIHBkZXYtPmRldiwgIm92ZXJjdXJyZW50IGludGVycnVwdCBmcm9tIHVua25vd24gR1BJT1xuIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwl2YWwgPSBncGlvX2dldF92YWx1ZShncGlvKTsKKworCS8qIFdoZW4gbm90aWZpZWQgb2YgYW4gb3Zlci1jdXJyZW50IHNpdHVhdGlvbiwgZGlzYWJsZSBwb3dlcgorCSAgIG9uIHRoZSBjb3JyZXNwb25kaW5nIHBvcnQsIGFuZCBtYXJrIHRoaXMgcG9ydCBpbgorCSAgIG92ZXItY3VycmVudC4gKi8KKwlpZiAoISB2YWwpIHsKKwkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHBvcnQsIDApOworCQlwZGF0YS0+b3ZlcmN1cnJlbnRfc3RhdHVzW3BvcnRdICA9IDE7CisJCXBkYXRhLT5vdmVyY3VycmVudF9jaGFuZ2VkW3BvcnRdID0gMTsKKwl9CisKKwlkZXZfZGJnKCYgcGRldi0+ZGV2LCAib3ZlcmN1cnJlbnQgc2l0dWF0aW9uICVzXG4iLAorCQl2YWwgPyAiZXhpdGVkIiA6ICJub3RpZmllZCIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiBzdGF0aWMgaW50IG9oY2lfaGNkX2F0OTFfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGF0OTFfdXNiaF9kYXRhCSpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludAkJCWk7CiAKIAlpZiAocGRhdGEpIHsKLQkJLyogUkVWSVNJVCBtYWtlIHRoZSBkcml2ZXIgc3VwcG9ydCBwZXItcG9ydCBwb3dlciBzd2l0Y2hpbmcsCi0JCSAqIGFuZCBhbHNvIG92ZXJjdXJyZW50IGRldGVjdGlvbi4gIEhlcmUgd2UgYXNzdW1lIHRoZSBwb3J0cwotCQkgKiBhcmUgYWx3YXlzIHBvd2VyZWQgd2hpbGUgdGhpcyBkcml2ZXIgaXMgYWN0aXZlLCBhbmQgdXNlCi0JCSAqIGFjdGl2ZS1sb3cgcG93ZXIgc3dpdGNoZXMuCi0JCSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwZGF0YS0+dmJ1c19waW4pOyBpKyspIHsKIAkJCWlmIChwZGF0YS0+dmJ1c19waW5baV0gPD0gMCkKIAkJCQljb250aW51ZTsKIAkJCWdwaW9fcmVxdWVzdChwZGF0YS0+dmJ1c19waW5baV0sICJvaGNpX3ZidXMiKTsKLQkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+dmJ1c19waW5baV0sIDApOworCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIGksIDEpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGRhdGEtPm92ZXJjdXJyZW50X3Bpbik7IGkrKykgeworCQkJaW50IHJldDsKKworCQkJaWYgKHBkYXRhLT5vdmVyY3VycmVudF9waW5baV0gPD0gMCkKKwkJCQljb250aW51ZTsKKwkJCWdwaW9fcmVxdWVzdChwZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldLCAib2hjaV9vdmVyY3VycmVudCIpOworCisJCQlyZXQgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShwZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldKSwKKwkJCQkJICBvaGNpX2hjZF9hdDkxX292ZXJjdXJyZW50X2lycSwKKwkJCQkJICBJUlFGX1NIQVJFRCwgIm9oY2lfb3ZlcmN1cnJlbnQiLCBwZGV2KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlncGlvX2ZyZWUocGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSk7CisJCQkJZGV2X3dhcm4oJiBwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IEdQSU8gSVJRIGZvciBvdmVyY3VycmVudFxuIik7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTMwMSw5ICs0OTUsMTYgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGRhdGEtPnZidXNfcGluKTsgaSsrKSB7CiAJCQlpZiAocGRhdGEtPnZidXNfcGluW2ldIDw9IDApCiAJCQkJY29udGludWU7Ci0JCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPnZidXNfcGluW2ldLCAxKTsKKwkJCW9oY2lfYXQ5MV91c2Jfc2V0X3Bvd2VyKHBkYXRhLCBpLCAwKTsKIAkJCWdwaW9fZnJlZShwZGF0YS0+dmJ1c19waW5baV0pOwogCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGRhdGEtPm92ZXJjdXJyZW50X3Bpbik7IGkrKykgeworCQkJaWYgKHBkYXRhLT5vdmVyY3VycmVudF9waW5baV0gPD0gMCkKKwkJCQljb250aW51ZTsKKwkJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5vdmVyY3VycmVudF9waW5baV0pLCBwZGV2KTsKKwkJCWdwaW9fZnJlZShwZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldKTsKKwkJfQogCX0KIAogCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdTF4eHguYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdTF4eHguYwppbmRleCA2YjdiYzUwLi45YjY2ZGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXUxeHh4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF1MXh4eC5jCkBAIC0yMyw5MiArMjMsOSBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogCi0jaWZuZGVmCUNPTkZJR19TT0NfQVUxMjAwCi0KLSNkZWZpbmUgVVNCSF9FTkFCTEVfQkUgKDE8PDApCi0jZGVmaW5lIFVTQkhfRU5BQkxFX0MgICgxPDwxKQotI2RlZmluZSBVU0JIX0VOQUJMRV9FICAoMTw8MikKLSNkZWZpbmUgVVNCSF9FTkFCTEVfQ0UgKDE8PDMpCi0jZGVmaW5lIFVTQkhfRU5BQkxFX1JEICgxPDw0KQotCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0jZGVmaW5lIFVTQkhfRU5BQkxFX0lOSVQgKFVTQkhfRU5BQkxFX0NFIHwgVVNCSF9FTkFCTEVfRSB8IFVTQkhfRU5BQkxFX0MpCi0jZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLSNkZWZpbmUgVVNCSF9FTkFCTEVfSU5JVCAoVVNCSF9FTkFCTEVfQ0UgfCBVU0JIX0VOQUJMRV9FIHwgVVNCSF9FTkFCTEVfQyB8IFwKLQkJCSAgVVNCSF9FTkFCTEVfQkUpCi0jZWxzZQotI2Vycm9yIG5vdCBieXRlIG9yZGVyIGRlZmluZWQKLSNlbmRpZgotCi0jZWxzZSAgIC8qIEF1MTIwMCAqLwotCi0jZGVmaW5lIFVTQl9IT1NUX0NPTkZJRyAgICAoVVNCX01TUl9CQVNFICsgVVNCX01TUl9NQ0ZHKQotI2RlZmluZSBVU0JfTUNGR19QRkVOICAgICAoMTw8MzEpCi0jZGVmaW5lIFVTQl9NQ0ZHX1JEQ09NQiAgICgxPDwzMCkKLSNkZWZpbmUgVVNCX01DRkdfU1NERU4gICAgKDE8PDIzKQotI2RlZmluZSBVU0JfTUNGR19PSENDTEtFTiAoMTw8MTYpCi0jaWZkZWYgQ09ORklHX0RNQV9DT0hFUkVOVAotI2RlZmluZSBVU0JfTUNGR19VQ0FNICAgICAoMTw8NykKLSNlbHNlCi0jZGVmaW5lIFVTQl9NQ0ZHX1VDQU0gICAgICgwKQotI2VuZGlmCi0jZGVmaW5lIFVTQl9NQ0ZHX09CTUVOICAgICgxPDwxKQotI2RlZmluZSBVU0JfTUNGR19PTUVNRU4gICAoMTw8MCkKLQotI2RlZmluZSBVU0JIX0VOQUJMRV9DRSAgICBVU0JfTUNGR19PSENDTEtFTgotCi0jZGVmaW5lIFVTQkhfRU5BQkxFX0lOSVQgIChVU0JfTUNGR19QRkVOICB8IFVTQl9NQ0ZHX1JEQ09NQiAJfAlcCi0JCQkgICBVU0JIX0VOQUJMRV9DRSB8IFVTQl9NQ0ZHX1NTREVOCXwJXAotCQkJICAgVVNCX01DRkdfVUNBTSAgfAkJCQlcCi0JCQkgICBVU0JfTUNGR19PQk1FTiB8IFVTQl9NQ0ZHX09NRU1FTikKLQotI2RlZmluZSBVU0JIX0RJU0FCTEUgICAgICAoVVNCX01DRkdfT0JNRU4gfCBVU0JfTUNGR19PTUVNRU4pCi0KLSNlbmRpZiAgLyogQXUxMjAwICovCiAKIGV4dGVybiBpbnQgdXNiX2Rpc2FibGVkKHZvaWQpOwogCi1zdGF0aWMgdm9pZCBhdTF4eHhfc3RhcnRfb2hjKHZvaWQpCi17Ci0JLyogZW5hYmxlIGhvc3QgY29udHJvbGxlciAqLwotI2lmbmRlZiBDT05GSUdfU09DX0FVMTIwMAotCWF1X3dyaXRlbChVU0JIX0VOQUJMRV9DRSwgVVNCX0hPU1RfQ09ORklHKTsKLQlhdV9zeW5jKCk7Ci0JdWRlbGF5KDEwMDApOwotCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRykgfCBVU0JIX0VOQUJMRV9JTklULCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiB3YWl0IGZvciByZXNldCBjb21wbGV0ZSAocmVhZCByZWdpc3RlciB0d2ljZTsgc2VlIGF1MTUwMCBlcnJhdGEpICovCi0Jd2hpbGUgKGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRyksCi0JCSEoYXVfcmVhZGwoVVNCX0hPU1RfQ09ORklHKSAmIFVTQkhfRU5BQkxFX1JEKSkKLQkJdWRlbGF5KDEwMDApOwotCi0jZWxzZSAgIC8qIEF1MTIwMCAqLwotCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfSE9TVF9DT05GSUcpIHwgVVNCSF9FTkFCTEVfQ0UsIFVTQl9IT1NUX0NPTkZJRyk7Ci0JYXVfc3luYygpOwotCXVkZWxheSgxMDAwKTsKLQotCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfSE9TVF9DT05GSUcpIHwgVVNCSF9FTkFCTEVfSU5JVCwgVVNCX0hPU1RfQ09ORklHKTsKLQlhdV9zeW5jKCk7Ci0JdWRlbGF5KDIwMDApOwotI2VuZGlmICAvKiBBdTEyMDAgKi8KLX0KLQotc3RhdGljIHZvaWQgYXUxeHh4X3N0b3Bfb2hjKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLQkvKiBEaXNhYmxlIG1lbSAqLwotCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfSE9TVF9DT05GSUcpICYgflVTQkhfRElTQUJMRSwgVVNCX0hPU1RfQ09ORklHKTsKLQlhdV9zeW5jKCk7Ci0JdWRlbGF5KDEwMDApOwotI2VuZGlmCi0JLyogRGlzYWJsZSBjbG9jayAqLwotCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfSE9TVF9DT05GSUcpICYgflVTQkhfRU5BQkxFX0NFLCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLX0KLQogc3RhdGljIGludCBfX2RldmluaXQgb2hjaV9hdTF4eHhfc3RhcnQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwpAQCAtMTc4LDE3ICs5NSw2IEBACiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTEyMDApICYmIGRlZmluZWQoQ09ORklHX0RNQV9DT0hFUkVOVCkKLQkvKiBBdTEyMDAgQUIgVVNCIGRvZXMgbm90IHN1cHBvcnQgY29oZXJlbnQgbWVtb3J5ICovCi0JaWYgKCEocmVhZF9jMF9wcmlkKCkgJiAweGZmKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogdGhpcyBpcyBjaGlwIHJldmlzaW9uIEFCICEhXG4iLAotCQkJcGRldi0+bmFtZSk7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiB1cGRhdGUgeW91ciBib2FyZCBvciByZS1jb25maWd1cmUgIgotCQkJCSAidGhlIGtlcm5lbFxuIiwgcGRldi0+bmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLSNlbmRpZgotCiAJaWYgKHBkZXYtPnJlc291cmNlWzFdLmZsYWdzICE9IElPUkVTT1VSQ0VfSVJRKSB7CiAJCXByX2RlYnVnKCJyZXNvdXJjZVsxXSBpcyBub3QgSU9SRVNPVVJDRV9JUlFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIxNCw3ICsxMjAsMTIgQEAKIAkJZ290byBlcnIyOwogCX0KIAotCWF1MXh4eF9zdGFydF9vaGMoKTsKKwlpZiAoYWxjaGVteV91c2JfY29udHJvbChBTENIRU1ZX1VTQl9PSENJMCwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbnRyb2xsZXIgaW5pdCBmYWlsZWQhXG4iLCBwZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnIzOworCX0KKwogCW9oY2lfaGNkX2luaXQoaGNkX3RvX29oY2koaGNkKSk7CiAKIAlyZXQgPSB1c2JfYWRkX2hjZChoY2QsIHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0LApAQCAtMjI0LDcgKzEzNSw4IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JYXUxeHh4X3N0b3Bfb2hjKCk7CisJYWxjaGVteV91c2JfY29udHJvbChBTENIRU1ZX1VTQl9PSENJMCwgMCk7CitlcnIzOgogCWlvdW5tYXAoaGNkLT5yZWdzKTsKIGVycjI6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CkBAIC0yMzgsNyArMTUwLDcgQEAKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAl1c2JfcmVtb3ZlX2hjZChoY2QpOwotCWF1MXh4eF9zdG9wX29oYygpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfT0hDSTAsIDApOwogCWlvdW5tYXAoaGNkLT5yZWdzKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKIAl1c2JfcHV0X2hjZChoY2QpOwpAQCAtMjc1LDcgKzE4Nyw3IEBACiAKIAljbGVhcl9iaXQoSENEX0ZMQUdfSFdfQUNDRVNTSUJMRSwgJmhjZC0+ZmxhZ3MpOwogCi0JYXUxeHh4X3N0b3Bfb2hjKCk7CisJYWxjaGVteV91c2JfY29udHJvbChBTENIRU1ZX1VTQl9PSENJMCwgMCk7CiBiYWlsOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9oY2ktPmxvY2ssIGZsYWdzKTsKIApAQCAtMjg2LDcgKzE5OCw3IEBACiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JYXUxeHh4X3N0YXJ0X29oYygpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfT0hDSTAsIDEpOwogCiAJc2V0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7CiAJb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoaGNkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCmluZGV4IDlhZDhiZWUuLjAwMTNkYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYwpAQCAtMjYsNyArMjYsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNkZWZpbmUgVVNCX0NUUkwJSU9fQUREUkVTUyhQTlg0MDA4X1BXUk1BTl9CQVNFICsgMHg2NCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYwppbmRleCA2MjlhOTY4Li4yN2EzZGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlICJwY2ktcXVpcmtzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvZGVidWcuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCmluZGV4IDc2N2FmMjYuLmJhNjFkYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi8uLi93dXNiY29yZS93dXNiaGMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2hjZC5jIGIvZHJpdmVycy91c2IvaG9zdC93aGNpL2hjZC5jCmluZGV4IDk1NDZmNmMuLjFlMTQxZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaGNkLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91d2IvdW1jLmg+CiAKICNpbmNsdWRlICIuLi8uLi93dXNiY29yZS93dXNiaGMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYwppbmRleCA0MzFlZmU3Li40MzBlODhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSAieGhjaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCmluZGV4IDlmNTFmODguLmVmOThiMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInhoY2kuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYyBiL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKaW5kZXggYTA0YjJmZi4uOTFjZDg1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYworKysgYi9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX3N0YXQuYyBiL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCmluZGV4IGU1Y2U0MmIuLmViZDYxODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCkBAIC05LDYgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9tb25fdGV4dC5jIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKaW5kZXggMWMzYWZjYy4uYWQ0MDgyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9kYXZpbmNpLmMgYi9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYwppbmRleCA4YmRmMjVhLi5mOWEzZjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYwpAQCAtMzUsNyArMzUsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NwdXR5cGUuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZGVidWdmcy5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RlYnVnZnMuYwppbmRleCBiMDE3NmU0Li42MWY0ZWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kZWJ1Z2ZzLmMKQEAgLTQxLDEyICs0MSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKLSNpZmRlZglDT05GSUdfQVJNCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNlbmRpZgotCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgIm11c2JfY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL2dwaW9fdmJ1cy5jIGIvZHJpdmVycy91c2Ivb3RnL2dwaW9fdmJ1cy5jCmluZGV4IDUyNzMzZDkuLmZiNjQ0YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL290Zy9ncGlvX3ZidXMuYworKysgYi9kcml2ZXJzL3VzYi9vdGcvZ3Bpb192YnVzLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL290Zy5jIGIvZHJpdmVycy91c2Ivb3RnL290Zy5jCmluZGV4IGZiN2FkZWYuLjMwN2MyN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL290Zy9vdGcuYworKysgYi9kcml2ZXJzL3VzYi9vdGcvb3RnLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvdWxwaS5jIGIvZHJpdmVycy91c2Ivb3RnL3VscGkuYwppbmRleCA3NzBkNzk5Li4wYjA0NjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9vdGcvdWxwaS5jCisrKyBiL2RyaXZlcnMvdXNiL290Zy91bHBpLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3VscGkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJjYWJsZS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMKaW5kZXggYWJhMjAxYy4uYjQzZDA3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3Fjc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcWNzZXJpYWwuYwppbmRleCBiOWJiMjQ3Li5hYTkzNjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcWNzZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcWNzZXJpYWwuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb3B0aW9uX21zLmMKaW5kZXggODk0NjAxOC4uZTBmNzZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL29wdGlvbl9tcy5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJ1c2IuaCIKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuYwppbmRleCBmYzMxMGY3Li45M2MxYTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9wcm90b2NvbC5jCkBAIC00Myw2ICs0Myw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NpZXJyYV9tcy5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zaWVycmFfbXMuYwppbmRleCAxZGVjYTA3Li4zNzUzOWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NpZXJyYV9tcy5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2llcnJhX21zLmMKQEAgLTMsNiArMyw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAidXNiLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwppbmRleCBmZjMyMzkwLi4wZTVjOTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC91c2IvcXVpcmtzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Vhcy5jCmluZGV4IDIzZjBkZDkuLjFkMTBkNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9zdG9yYWdlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYwppbmRleCA3ZWMyNGU0Li4yMzEwMDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvZGV2Y29ubmVjdC5jCkBAIC05MCw2ICs5MCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAid3VzYmhjLmgiCiAKIHN0YXRpYyB2b2lkIHd1c2JoY19kZXZjb25uZWN0X2Fja2VkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL21tYy5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvbW1jLmMKaW5kZXggMGE1N2ZmMC4uYjhjNzI1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvbW1jLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvbW1jLmMKQEAgLTM4LDYgKzM4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3VzYi93dXNiLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgInd1c2JoYy5oIgogCiAvKiBJbml0aWFsaXplIHRoZSBNTUNJRXMgaGFuZGxpbmcgbWVjaGFuaXNtICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvcmguYwppbmRleCAzOWRlMzkwLi41OWZmMjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3JoLmMKQEAgLTcwLDYgKzcwLDcgQEAKICAqIHd1c2JoY19yaF9zdGFydF9wb3J0X3Jlc2V0KCkgPz8/IHVuaW1wbGVtZW50ZWQKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ3dXNiaGMuaCIKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9zZWN1cml0eS5jCmluZGV4IGI2MDc5OWIuLjM3MWY2MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvc2VjdXJpdHkuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAid3VzYmhjLmgiCiAKIHN0YXRpYyB2b2lkIHd1c2JoY19zZXRfZ3RrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtaGMuYwppbmRleCAwZDE4NjNjLi45ZTRhOTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLWhjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICAqIEZJWE1FOiBkb2NzCiAgKi8KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAid3VzYmhjLmgiCiAjaW5jbHVkZSAid2EtaGMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtcnBpcGUuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXJwaXBlLmMKaW5kZXggMmFjYzdmNS4uZjBkNTQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtcnBpcGUuYworKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1ycGlwZS5jCkBAIC02MSw2ICs2MSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAid3VzYmhjLmgiCiAjaW5jbHVkZSAid2EtaGMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYwppbmRleCA0MTkzMzQ1Li41N2MwMWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jCkBAIC04NCw2ICs4NCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIndhLWhjLmgiCiAjaW5jbHVkZSAid3VzYmhjLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9lc3QuYyBiL2RyaXZlcnMvdXdiL2VzdC5jCmluZGV4IGEyZWFhM2MuLmRlODFlYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2VzdC5jCisrKyBiL2RyaXZlcnMvdXdiL2VzdC5jCkBAIC00MSw2ICs0MSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInV3Yi1pbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9pMTQ4MC9kZnUvZGZ1LmMgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9kZnUvZGZ1LmMKaW5kZXggZGE3YjFkMC4uYjA4ZDFjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaTE0ODAvZGZ1L2RmdS5jCisrKyBiL2RyaXZlcnMvdXdiL2kxNDgwL2RmdS9kZnUuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3V3Yi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKgogICogaTE0ODBfcmNlYl9jaGVjayAtIENoZWNrIFJDRUIgZm9yIGV4cGVjdGVkIGZpZWxkIHZhbHVlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaWUuYyBiL2RyaXZlcnMvdXdiL2llLmMKaW5kZXggMzBhY2VjNy4uOTAyYjBmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaWUuYworKysgYi9kcml2ZXJzL3V3Yi9pZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ1d2ItaW50ZXJuYWwuaCIKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9sYy1kZXYuYyBiL2RyaXZlcnMvdXdiL2xjLWRldi5jCmluZGV4IDkwMTEzYmEuLjUyNDFmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2xjLWRldi5jCisrKyBiL2RyaXZlcnMvdXdiL2xjLWRldi5jCkBAIC0yNSw5ICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSAidXdiLWludGVybmFsLmgiCiAKIC8qIFdlIGluaXRpYWxpemUgYWRkcmVzc2VzIHRvIDB4ZmYgKGludmFsaWQsIGFzIGl0IGlzIGJjYXN0KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvbGMtcmMuYyBiL2RyaXZlcnMvdXdiL2xjLXJjLmMKaW5kZXggYjQzOTVmNC4uNGQ2ODhjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvbGMtcmMuYworKysgYi9kcml2ZXJzL3V3Yi9sYy1yYy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ1d2ItaW50ZXJuYWwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvbmVoLmMgYi9kcml2ZXJzL3V3Yi9uZWguYwppbmRleCA2OTdlNTZhLi5hMjY5OTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9uZWguYworKysgYi9kcml2ZXJzL3V3Yi9uZWguYwpAQCAtODUsNiArODUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAidXdiLWludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL3BhbC5jIGIvZHJpdmVycy91d2IvcGFsLmMKaW5kZXggOTlhMTljMS4uOGVlN2Q5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvcGFsLmMKKysrIGIvZHJpdmVycy91d2IvcGFsLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdXdiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ1d2ItaW50ZXJuYWwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvcmFkaW8uYyBiL2RyaXZlcnMvdXdiL3JhZGlvLmMKaW5kZXggZjBkNTU0OS4uZDU4ZGZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvcmFkaW8uYworKysgYi9kcml2ZXJzL3V3Yi9yYWRpby5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC91d2IuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInV3Yi1pbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9yZXNldC5jIGIvZHJpdmVycy91d2IvcmVzZXQuYwppbmRleCAzZGU2MzBiLi43MDMyMjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9yZXNldC5jCisrKyBiL2RyaXZlcnMvdXdiL3Jlc2V0LmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInV3Yi1pbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9yc3YuYyBiL2RyaXZlcnMvdXdiL3Jzdi5jCmluZGV4IDc4Yzg5MjIuLjBiMGQ4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3Jzdi5jCisrKyBiL2RyaXZlcnMvdXdiL3Jzdi5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXdiLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAidXdiLWludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL3NjYW4uYyBiL2RyaXZlcnMvdXdiL3NjYW4uYwppbmRleCAzNjdhYTEyLi5jYmI2YTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9zY2FuLmMKKysrIGIvZHJpdmVycy91d2Ivc2Nhbi5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlICJ1d2ItaW50ZXJuYWwuaCIKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi91bWMtYnVzLmMgYi9kcml2ZXJzL3V3Yi91bWMtYnVzLmMKaW5kZXggNWZhZDRlNy4uODJhODRkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvdW1jLWJ1cy5jCisrKyBiL2RyaXZlcnMvdXdiL3VtYy1idXMuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3V3Yi91bWMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvdW1jLWRldi5jIGIvZHJpdmVycy91d2IvdW1jLWRldi5jCmluZGV4IGIyOTQ4ZWMuLjQ2MTNjMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3VtYy1kZXYuYworKysgYi9kcml2ZXJzL3V3Yi91bWMtZGV2LmMKQEAgLTYsNiArNiw3IEBACiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHUEwgdjIuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXdiL3VtYy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi91bWMtZHJ2LmMgYi9kcml2ZXJzL3V3Yi91bWMtZHJ2LmMKaW5kZXggMzY3YjVlYjguLjI2ZDBhZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3VtYy1kcnYuYworKysgYi9kcml2ZXJzL3V3Yi91bWMtZHJ2LmMKQEAgLTYsNiArNiw3IEBACiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHUEwgdjIuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91d2IvdW1jLmg+CiAKIGludCBfX3VtY19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHVtY19kcml2ZXIgKnVtY19kcnYsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL3doY2kuYyBiL2RyaXZlcnMvdXdiL3doY2kuYwppbmRleCBiMjIxMTQyLi5mNDgwOTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi93aGNpLmMKKysrIGIvZHJpdmVycy91d2Ivd2hjaS5jCkBAIC03LDYgKzcsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKaW5kZXggNzVhMzllYS4uYTQyNWQ2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby82ODMyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKQEAgLTM3OCw4ICszNzgsOCBAQAogCQkgICAgfHwgdmFyLT54b2Zmc2V0KQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKLQkJaWYgKHZhci0+eG9mZnNldCArIHZhci0+eHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgfHwKLQkJICAgIHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCisJCWlmICh2YXItPnhvZmZzZXQgKyBpbmZvLT52YXIueHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgfHwKKwkJICAgIHZhci0+eW9mZnNldCArIGluZm8tPnZhci55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpbmZvLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCA1NDliOTYwNi4uZDgzZTk2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtMjU5LDYgKzI1OSwxNSBAQAogY29tbWVudCAiRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBGQgogCitjb25maWcgRkJfR1JWR0EKKwl0cmlzdGF0ZSAiQWVyb2ZsZXggR2Fpc2xlciBmcmFtZWJ1ZmZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gRkIgJiYgU1BBUkMKKwlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCisJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJLS0taGVscC0tLQorCVRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU1ZHQUNUUkwgZnJhbWVidWZmZXIgaW4gdGhlIEdSTElCIElQIGxpYnJhcnkgZnJvbSBBZXJvZmxleCBHYWlzbGVyLgorCiBjb25maWcgRkJfQ0lSUlVTCiAJdHJpc3RhdGUgIkNpcnJ1cyBMb2dpYyBzdXBwb3J0IgogCWRlcGVuZHMgb24gRkIgJiYgKFpPUlJPIHx8IFBDSSkKQEAgLTE3NDQsNyArMTc1Myw3IEBACiAKIGNvbmZpZyBGQl9BVTExMDAKIAlib29sICJBdTExMDAgTENEIERyaXZlciIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIE1JUFMgJiYgU09DX0FVMTEwMAorCWRlcGVuZHMgb24gKEZCID0geSkgJiYgTUlQU19BTENIRU1ZCiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVApAQCAtMTc1NSwxMCArMTc2NCwxMSBAQAogCiBjb25maWcgRkJfQVUxMjAwCiAJYm9vbCAiQXUxMjAwIExDRCBEcml2ZXIiCi0JZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBNSVBTICYmIFNPQ19BVTEyMDAKLQlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCi0Jc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQotCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBNSVBTX0FMQ0hFTVkKKwlzZWxlY3QgRkJfU1lTX0ZJTExSRUNUCisJc2VsZWN0IEZCX1NZU19DT1BZQVJFQQorCXNlbGVjdCBGQl9TWVNfSU1BR0VCTElUCisJc2VsZWN0IEZCX1NZU19GT1BTCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgZnJhbWVidWZmZXIgZHJpdmVyIGZvciB0aGUgQU1EIEF1MTIwMCBTT0MuICBJdCBjYW4gZHJpdmUKIAkgIHZhcmlvdXMgcGFuZWxzIGFuZCBDUlRzIGJ5IHBhc3NpbmcgaW4ga2VybmVsIGNtZCBsaW5lIG9wdGlvbgpAQCAtMjAyNyw3ICsyMDM3LDcgQEAKIAogY29uZmlnIEZCX1MzQwogCXRyaXN0YXRlICJTYW1zdW5nIFMzQyBmcmFtZWJ1ZmZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gRkIgJiYgUzNDX0RFVl9GQgorCWRlcGVuZHMgb24gRkIgJiYgKFMzQ19ERVZfRkIgfHwgUzVQX0RFVl9GSU1EMCkKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCkBAIC0yMTEwLDYgKzIxMjAsMjIgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIEZCX1NNU0NVRlgKKwl0cmlzdGF0ZSAiU01TQyBVRlg2MDAwLzcwMDAgVVNCIEZyYW1lYnVmZmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQiAmJiBVU0IKKwlzZWxlY3QgRkJfTU9ERV9IRUxQRVJTCisJc2VsZWN0IEZCX1NZU19GSUxMUkVDVAorCXNlbGVjdCBGQl9TWVNfQ09QWUFSRUEKKwlzZWxlY3QgRkJfU1lTX0lNQUdFQkxJVAorCXNlbGVjdCBGQl9TWVNfRk9QUworCXNlbGVjdCBGQl9ERUZFUlJFRF9JTworCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBrZXJuZWwgZnJhbWVidWZmZXIgZHJpdmVyIGZvciBTTVNDIFVGWCBVU0IgZGV2aWNlcy4KKwkgIFN1cHBvcnRzIGZiZGV2IGNsaWVudHMgbGlrZSB4Zjg2LXZpZGVvLWZiZGV2LCBrZHJpdmUsIGZiaSwgYW5kCisJICBtcGxheWVyIC12byBmYmRldi4gU3VwcG9ydHMgYm90aCBVRlg2MDAwIChVU0IgMi4wKSBhbmQgVUZYNzAwMAorCSAgKFVTQiAzLjApIGRldmljZXMuCisJICBUbyBjb21waWxlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIG5hbWUgaXMgc21zY3VmeC4KKwogY29uZmlnIEZCX1VETAogCXRyaXN0YXRlICJEaXNwbGF5bGluayBVU0IgRnJhbWVidWZmZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCICYmIFVTQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKaW5kZXggOGI4MzEyOS4uOWI5ZDhmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCkBAIC0zMyw2ICszMyw3IEBACiBvYmotJChDT05GSUdfRkJfQVJDKSAgICAgICAgICAgICAgKz0gYXJjZmIubwogb2JqLSQoQ09ORklHX0ZCX0NMUFM3MTFYKSAgICAgICAgICs9IGNscHM3MTF4ZmIubwogb2JqLSQoQ09ORklHX0ZCX0NZQkVSMjAwMCkgICAgICAgICs9IGN5YmVyMjAwMGZiLm8KK29iai0kKENPTkZJR19GQl9HUlZHQSkgICAgICAgICAgICArPSBncnZnYS5vCiBvYmotJChDT05GSUdfRkJfUE0yKSAgICAgICAgICAgICAgKz0gcG0yZmIubwogb2JqLSQoQ09ORklHX0ZCX1BNMykJCSAgKz0gcG0zZmIubwogCkBAIC0xMjcsNiArMTI4LDcgQEAKIG9iai0kKENPTkZJR19GQl9QUzMpCQkgICs9IHBzM2ZiLm8KIG9iai0kKENPTkZJR19GQl9TTTUwMSkgICAgICAgICAgICArPSBzbTUwMWZiLm8KIG9iai0kKENPTkZJR19GQl9VREwpCQkgICs9IHVkbGZiLm8KK29iai0kKENPTkZJR19GQl9TTVNDVUZYKQkgICs9IHNtc2N1Zngubwogb2JqLSQoQ09ORklHX0ZCX1hJTElOWCkgICAgICAgICAgICs9IHhpbGlueGZiLm8KIG9iai0kKENPTkZJR19TSF9NSVBJX0RTSSkJICArPSBzaF9taXBpX2RzaS5vCiBvYmotJChDT05GSUdfRkJfU0hfTU9CSUxFX0hETUkpCSAgKz0gc2hfbW9iaWxlX2hkbWkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hY29ybmZiLmMgYi9kcml2ZXJzL3ZpZGVvL2Fjb3JuZmIuYwppbmRleCA2MTgzYTU3Li5iMzAzZjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Fjb3JuZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Fjb3JuZmIuYwpAQCAtODUwLDkgKzg1MCwxMCBAQAogCXVfaW50IHlfYm90dG9tID0gdmFyLT55b2Zmc2V0OwogCiAJaWYgKCEodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSkKLQkJeV9ib3R0b20gKz0gdmFyLT55cmVzOworCQl5X2JvdHRvbSArPSBpbmZvLT52YXIueXJlczsKIAotCUJVR19PTih5X2JvdHRvbSA+IHZhci0+eXJlc192aXJ0dWFsKTsKKwlpZiAoeV9ib3R0b20gPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWFjb3JuZmJfdXBkYXRlX2RtYShpbmZvLCB2YXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jIGIvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYwppbmRleCBjZjAzYWQwLi4yY2RhNmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKQEAgLTQ0Nyw2ICs0NDcsMTAgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJcmV0ID0gY2xrX3ByZXBhcmUoZmItPmNsayk7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX2NsazsKKwogCWZiLT5mYi5kZXZpY2UJCT0gJmZiLT5kZXYtPmRldjsKIAogCWZiLT5mYi5maXgubW1pb19zdGFydAk9IGZiLT5kZXYtPnJlcy5zdGFydDsKQEAgLTQ1Niw3ICs0NjAsNyBAQAogCWlmICghZmItPnJlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDTENEOiB1bmFibGUgdG8gcmVtYXAgcmVnaXN0ZXJzXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmcmVlX2NsazsKKwkJZ290byBjbGtfdW5wcmVwOwogCX0KIAogCWZiLT5mYi5mYm9wcwkJPSAmY2xjZGZiX29wczsKQEAgLTUzMCw2ICs1MzQsOCBAQAogCWZiX2RlYWxsb2NfY21hcCgmZmItPmZiLmNtYXApOwogIHVubWFwOgogCWlvdW5tYXAoZmItPnJlZ3MpOworIGNsa191bnByZXA6CisJY2xrX3VucHJlcGFyZShmYi0+Y2xrKTsKICBmcmVlX2NsazoKIAljbGtfcHV0KGZiLT5jbGspOwogIG91dDoKQEAgLTU5NSw2ICs2MDEsNyBAQAogCWlmIChmYi0+ZmIuY21hcC5sZW4pCiAJCWZiX2RlYWxsb2NfY21hcCgmZmItPmZiLmNtYXApOwogCWlvdW5tYXAoZmItPnJlZ3MpOworCWNsa191bnByZXBhcmUoZmItPmNsayk7CiAJY2xrX3B1dChmYi0+Y2xrKTsKIAogCWZiLT5ib2FyZC0+cmVtb3ZlKGZiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXJrZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXJrZmIuYwppbmRleCA4Njg2NDI5Li41NTVkZDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Fya2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hcmtmYi5jCkBAIC05MDgsMTMgKzkwOCwxNCBAQAogCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAKIAkvKiBDYWxjdWxhdGUgdGhlIG9mZnNldCAqLwotCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDApIHsKLQkJb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAvIDE2KSAqICh2YXItPnhyZXNfdmlydHVhbCAvIDIpICsgKHZhci0+eG9mZnNldCAvIDIpOworCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gMCkgeworCQlvZmZzZXQgPSAodmFyLT55b2Zmc2V0IC8gMTYpICogKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgLyAyKQorCQkgICAgICAgKyAodmFyLT54b2Zmc2V0IC8gMik7CiAJCW9mZnNldCA9IG9mZnNldCA+PiAyOwogCX0gZWxzZSB7CiAJCW9mZnNldCA9ICh2YXItPnlvZmZzZXQgKiBpbmZvLT5maXgubGluZV9sZW5ndGgpICsKLQkJCSAodmFyLT54b2Zmc2V0ICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDgpOwotCQlvZmZzZXQgPSBvZmZzZXQgPj4gKCh2YXItPmJpdHNfcGVyX3BpeGVsID09IDQpID8gMiA6IDMpOworCQkJICh2YXItPnhvZmZzZXQgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4KTsKKwkJb2Zmc2V0ID0gb2Zmc2V0ID4+ICgoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDQpID8gMiA6IDMpOwogCX0KIAogCS8qIFNldCB0aGUgb2Zmc2V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMKaW5kZXggODE3YWI2MC4uNjM0MDljMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdG1lbF9sY2RmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXRtZWxfbGNkZmIuYwpAQCAtMTgsMTAgKzE4LDExIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CiAKQEAgLTM5LDcgKzQwLDggQEAKIAkJCQkJIHwgRkJJTkZPX0hXQUNDRUxfWVBBTikKIAogc3RhdGljIGlubGluZSB2b2lkIGF0bWVsX2xjZGZiX3VwZGF0ZV9kbWEyZChzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqc2luZm8sCi0JCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQorCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAKIH0KQEAgLTUwLDE0ICs1MiwxNiBAQAogCQkJCQl8IEZCSU5GT19IV0FDQ0VMX1lQQU4pCiAKIHN0YXRpYyB2b2lkIGF0bWVsX2xjZGZiX3VwZGF0ZV9kbWEyZChzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqc2luZm8sCi0JCQkJICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKKwkJCQkgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJdTMyIGRtYTJkY2ZnOwogCXUzMiBwaXhlbG9mZjsKIAotCXBpeGVsb2ZmID0gKHZhci0+eG9mZnNldCAqIHZhci0+Yml0c19wZXJfcGl4ZWwpICYgMHgxZjsKKwlwaXhlbG9mZiA9ICh2YXItPnhvZmZzZXQgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpICYgMHgxZjsKIAotCWRtYTJkY2ZnID0gKCh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykgKiB2YXItPmJpdHNfcGVyX3BpeGVsKSAvIDg7CisJZG1hMmRjZmcgPSAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCAtIGluZm8tPnZhci54cmVzKQorCQkgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4OwogCWRtYTJkY2ZnIHw9IHBpeGVsb2ZmIDw8IEFUTUVMX0xDRENfUElYRUxPRkZfT0ZGU0VUOwogCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQTJEQ0ZHLCBkbWEyZGNmZyk7CiAKQEAgLTI0OSwxNCArMjUzLDE0IEBACiAJdW5zaWduZWQgbG9uZyBkbWFfYWRkcjsKIAogCWRtYV9hZGRyID0gKGZpeC0+c21lbV9zdGFydCArIHZhci0+eW9mZnNldCAqIGZpeC0+bGluZV9sZW5ndGgKLQkJICAgICsgdmFyLT54b2Zmc2V0ICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDgpOworCQkgICAgKyB2YXItPnhvZmZzZXQgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4KTsKIAogCWRtYV9hZGRyICY9IH4zVUw7CiAKIAkvKiBTZXQgZnJhbWVidWZmZXIgRE1BIGJhc2UgYWRkcmVzcyBhbmQgcGl4ZWwgb2Zmc2V0ICovCiAJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfRE1BQkFERFIxLCBkbWFfYWRkcik7CiAKLQlhdG1lbF9sY2RmYl91cGRhdGVfZG1hMmQoc2luZm8sIHZhcik7CisJYXRtZWxfbGNkZmJfdXBkYXRlX2RtYTJkKHNpbmZvLCB2YXIsIGluZm8pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfbGNkZmJfZnJlZV92aWRlb19tZW1vcnkoc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gKnNpbmZvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKaW5kZXggMzJmOGNmNi4uMTUwNjg0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCkBAIC04NDUsMTYgKzg0NSwxNiBAQAogewogICAgICAgICBzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8gPSBpbmZvLT5wYXI7CiAKLSAgICAgICAgaWYgKCh2YXItPnhvZmZzZXQgKyB2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCkKLQkgICAgfHwgKHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKSkKLSAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmICgodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsKQorCSAgICB8fCAodmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgIGlmIChyaW5mby0+YXNsZWVwKQogICAgICAgICAJcmV0dXJuIDA7CiAKIAlyYWRlb25fZmlmb193YWl0KDIpOwotICAgICAgICBPVVRSRUcoQ1JUQ19PRkZTRVQsICgodmFyLT55b2Zmc2V0ICogdmFyLT54cmVzX3ZpcnR1YWwgKyB2YXItPnhvZmZzZXQpCi0JCQkgICAgICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDgpICYgfjcpOworCU9VVFJFRyhDUlRDX09GRlNFVCwgKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCArCisJCQkgICAgIHZhci0+eG9mZnNldCAqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpICYgfjcpOwogICAgICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdTExMDBmYi5jIGIvZHJpdmVycy92aWRlby9hdTExMDBmYi5jCmluZGV4IDAxYThmZGUuLjY0OWNiMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMKQEAgLTExMCwxMiArMTEwLDYgQEAKIAkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXUxMTAwZmJfZHJ2X2luZm8gZHJ2X2luZm87Ci0KLXN0YXRpYyBpbnQgbm9jdXJzb3IgPSAwOwotbW9kdWxlX3BhcmFtKG5vY3Vyc29yLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhub2N1cnNvciwgImN1cnNvciBlbmFibGUvZGlzYWJsZSIpOwotCiAvKiBmYl9ibGFuawogICogQmxhbmsgdGhlIHNjcmVlbi4gRGVwZW5kaW5nIG9uIHRoZSBtb2RlLCB0aGUgc2NyZWVuIHdpbGwgYmUKICAqIGFjdGl2YXRlZCB3aXRoIHRoZSBiYWNrbGlnaHQgY29sb3IsIG9yIGRlc2FjdGl2YXRlZApAQCAtMTMyLDcgKzEyNiw3IEBACiAJCQkvKiBUdXJuIG9uIHBhbmVsICovCiAJCQlmYmRldi0+cmVncy0+bGNkX2NvbnRyb2wgfD0gTENEX0NPTlRST0xfR087CiAjaWZkZWYgQ09ORklHX01JUFNfUEIxMTAwCi0JCQlpZiAoZHJ2X2luZm8ucGFuZWxfaWR4ID09IDEpIHsKKwkJCWlmIChmYmRldi0+cGFuZWxfaWR4ID09IDEpIHsKIAkJCQlhdV93cml0ZXcoYXVfcmVhZHcoUEIxMTAwX0dfQ09OVFJPTCkKIAkJCQkJICB8IChQQjExMDBfR19DT05UUk9MX0JMIHwgUEIxMTAwX0dfQ09OVFJPTF9WREQpLAogCQkJUEIxMTAwX0dfQ09OVFJPTCk7CkBAIC0xNDcsNyArMTQxLDcgQEAKIAkJCS8qIFR1cm4gb2ZmIHBhbmVsICovCiAJCQlmYmRldi0+cmVncy0+bGNkX2NvbnRyb2wgJj0gfkxDRF9DT05UUk9MX0dPOwogI2lmZGVmIENPTkZJR19NSVBTX1BCMTEwMAotCQkJaWYgKGRydl9pbmZvLnBhbmVsX2lkeCA9PSAxKSB7CisJCQlpZiAoZmJkZXYtPnBhbmVsX2lkeCA9PSAxKSB7CiAJCQkJYXVfd3JpdGV3KGF1X3JlYWR3KFBCMTEwMF9HX0NPTlRST0wpCiAJCQkJICAJICAmIH4oUEIxMTAwX0dfQ09OVFJPTF9CTCB8IFBCMTEwMF9HX0NPTlRST0xfVkREKSwKIAkJCVBCMTEwMF9HX0NPTlRST0wpOwpAQCAtNDI4LDE3ICs0MjIsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBmYl9jdXJzb3IKLSAqIFVzZWQgdG8gZGlzYWJsZSBjdXJzb3IgZHJhd2luZy4uLgotICovCi1pbnQgYXUxMTAwZmJfZmJfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfY3Vyc29yICpjdXJzb3IpCi17Ci0JaWYgKG5vY3Vyc29yKQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwkvKiBqdXN0IHRvIGZvcmNlIHNvZnRfY3Vyc29yKCkgY2FsbCAqLwotfQotCiBzdGF0aWMgc3RydWN0IGZiX29wcyBhdTExMDBmYl9vcHMgPQogewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCkBAIC00NTAsMTMgKzQzMyw1MyBAQAogCS5mYl9pbWFnZWJsaXQJCT0gY2ZiX2ltYWdlYmxpdCwKIAkuZmJfcm90YXRlCQk9IGF1MTEwMGZiX2ZiX3JvdGF0ZSwKIAkuZmJfbW1hcAkJPSBhdTExMDBmYl9mYl9tbWFwLAotCS5mYl9jdXJzb3IJCT0gYXUxMTAwZmJfZmJfY3Vyc29yLAogfTsKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBBVTExMDAgTENEIGNvbnRyb2xsZXIgZGV2aWNlIGRyaXZlciAqLworc3RhdGljIGludCBhdTExMDBmYl9zZXR1cChzdHJ1Y3QgYXUxMTAwZmJfZGV2aWNlICpmYmRldikKK3sKKwljaGFyICp0aGlzX29wdCwgKm9wdGlvbnM7CisJaW50IG51bV9wYW5lbHMgPSBBUlJBWV9TSVpFKGtub3duX2xjZF9wYW5lbHMpOworCisJaWYgKG51bV9wYW5lbHMgPD0gMCkgeworCQlwcmludF9lcnIoIk5vIExDRCBwYW5lbHMgc3VwcG9ydGVkIGJ5IGRyaXZlciEiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGZiX2dldF9vcHRpb25zKERSSVZFUl9OQU1FLCAmb3B0aW9ucykpCisJCXJldHVybiAtRU5PREVWOworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCS8qIFBhbmVsIG9wdGlvbiAqLworCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJwYW5lbDoiLCA2KSkgeworCQkJaW50IGk7CisJCQl0aGlzX29wdCArPSA2OworCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYW5lbHM7IGkrKykgeworCQkJCWlmICghc3RybmNtcCh0aGlzX29wdCwga25vd25fbGNkX3BhbmVsc1tpXS5uYW1lLAorCQkJCQkgICAgIHN0cmxlbih0aGlzX29wdCkpKSB7CisJCQkJCWZiZGV2LT5wYW5lbCA9ICZrbm93bl9sY2RfcGFuZWxzW2ldOworCQkJCQlmYmRldi0+cGFuZWxfaWR4ID0gaTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGkgPj0gbnVtX3BhbmVscykgeworCQkJCXByaW50X3dhcm4oIlBhbmVsICclcycgbm90IHN1cHBvcnRlZCEiLCB0aGlzX29wdCk7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCX0KKwkJLyogVW5zdXBwb3J0ZWQgb3B0aW9uICovCisJCWVsc2UKKwkJCXByaW50X3dhcm4oIlVuc3VwcG9ydGVkIG9wdGlvbiBcIiVzXCIiLCB0aGlzX29wdCk7CisJfQorCisJcHJpbnRfaW5mbygiUGFuZWw9JXMiLCBmYmRldi0+cGFuZWwtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGF1MTEwMGZiX2Rydl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CkBAIC00NjUsMjIgKzQ4OCwyMSBAQAogCXVuc2lnbmVkIGxvbmcgcGFnZTsKIAl1MzIgc3lzX2Nsa3NyYzsKIAotCWlmICghZGV2KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkvKiBBbGxvY2F0ZSBuZXcgZGV2aWNlIHByaXZhdGUgKi8KLQlpZiAoIShmYmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdTExMDBmYl9kZXZpY2UpLCBHRlBfS0VSTkVMKSkpIHsKKwlmYmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdTExMDBmYl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZiZGV2KSB7CiAJCXByaW50X2VycigiZmFpbCB0byBhbGxvY2F0ZSBkZXZpY2UgcHJpdmF0ZSByZWNvcmQiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZmJkZXYtPnBhbmVsID0gJmtub3duX2xjZF9wYW5lbHNbZHJ2X2luZm8ucGFuZWxfaWR4XTsKKwlpZiAoYXUxMTAwZmJfc2V0dXAoZmJkZXYpKQorCQlnb3RvIGZhaWxlZDsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKilmYmRldik7CiAKIAkvKiBBbGxvY2F0ZSByZWdpb24gZm9yIG91ciByZWdpc3RlcnMgYW5kIG1hcCB0aGVtICovCi0JaWYgKCEocmVnc19yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UodG9fcGxhdGZvcm1fZGV2aWNlKGRldiksCi0JCQkJCUlPUkVTT1VSQ0VfTUVNLCAwKSkpIHsKKwlyZWdzX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlZ3NfcmVzKSB7CiAJCXByaW50X2VycigiZmFpbCB0byByZXRyaWV2ZSByZWdpc3RlcnMgcmVzb3VyY2UiKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtNTAwLDEzICs1MjIsMTEgQEAKIAlwcmludF9kYmcoIlJlZ2lzdGVyIG1lbW9yeSBtYXAgYXQgJXAiLCBmYmRldi0+cmVncyk7CiAJcHJpbnRfZGJnKCJwaHlzPTB4JTA4eCwgc2l6ZT0lZCIsIGZiZGV2LT5yZWdzX3BoeXMsIGZiZGV2LT5yZWdzX2xlbik7CiAKLQotCiAJLyogQWxsb2NhdGUgdGhlIGZyYW1lYnVmZmVyIHRvIHRoZSBtYXhpbXVtIHNjcmVlbiBzaXplICogbmJyIG9mIHZpZGVvIGJ1ZmZlcnMgKi8KIAlmYmRldi0+ZmJfbGVuID0gZmJkZXYtPnBhbmVsLT54cmVzICogZmJkZXYtPnBhbmVsLT55cmVzICoKIAkJICAJKGZiZGV2LT5wYW5lbC0+YnBwID4+IDMpICogQVUxMTAwRkJfTkJSX1ZJREVPX0JVRkZFUlM7CiAKLQlmYmRldi0+ZmJfbWVtID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwKKwlmYmRldi0+ZmJfbWVtID0gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPmRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwKIAkJCQkJJmZiZGV2LT5mYl9waHlzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZiZGV2LT5mYl9tZW0pIHsKIAkJcHJpbnRfZXJyKCJmYWlsIHRvIGFsbG9jYXRlIGZyYW1idWZmZXIgKHNpemU6ICVkSykpIiwKQEAgLTUyNSw3ICs1NDUsNyBAQAogCSAgICAgcGFnZSA8IFBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpZmJkZXYtPmZiX21lbSArIGZiZGV2LT5mYl9sZW4pOwogCSAgICAgcGFnZSArPSBQQUdFX1NJWkUpIHsKICNpZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCi0JCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoQ0FDX0FERFIocGFnZSkpKTsKKwkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShDQUNfQUREUigodm9pZCAqKXBhZ2UpKSk7CiAjZWxzZQogCQlTZXRQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBhZ2UpKTsKICNlbmRpZgpAQCAtNTc4LDcgKzU5OCw4IEBACiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihmYmRldi0+cmVnc19waHlzLCBmYmRldi0+cmVnc19sZW4pOwogCX0KIAlpZiAoZmJkZXYtPmZiX21lbSkgewotCQlkbWFfZnJlZV9ub25jb2hlcmVudChkZXYsIGZiZGV2LT5mYl9sZW4sIGZiZGV2LT5mYl9tZW0sIGZiZGV2LT5mYl9waHlzKTsKKwkJZG1hX2ZyZWVfbm9uY29oZXJlbnQoJmRldi0+ZGV2LCBmYmRldi0+ZmJfbGVuLCBmYmRldi0+ZmJfbWVtLAorCQkJCSAgICAgZmJkZXYtPmZiX3BoeXMpOwogCX0KIAlpZiAoZmJkZXYtPmluZm8uY21hcC5sZW4gIT0gMCkgewogCQlmYl9kZWFsbG9jX2NtYXAoJmZiZGV2LT5pbmZvLmNtYXApOwpAQCAtNjA4LDcgKzYyOSw4IEBACiAKIAlyZWxlYXNlX21lbV9yZWdpb24oZmJkZXYtPnJlZ3NfcGh5cywgZmJkZXYtPnJlZ3NfbGVuKTsKIAotCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwgZmJkZXYtPmZiX21lbSwgZmJkZXYtPmZiX3BoeXMpOworCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPmRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwgZmJkZXYtPmZiX21lbSwKKwkJCSAgZmJkZXYtPmZiX3BoeXMpOwogCiAJZmJfZGVhbGxvY19jbWFwKCZmYmRldi0+aW5mby5jbWFwKTsKIAlrZnJlZShmYmRldi0+aW5mby5wc2V1ZG9fcGFsZXR0ZSk7CkBAIC02NzUsMTAxICs2OTcsMTggQEAKICAgICAgICAgLnJlc3VtZQkJPSBhdTExMDBmYl9kcnZfcmVzdW1lLAogfTsKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogS2VybmVsIGRyaXZlciAqLwotCi1pbnQgYXUxMTAwZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3N0YXRpYyBpbnQgX19pbml0IGF1MTEwMGZiX2xvYWQodm9pZCkKIHsKLQljaGFyKiB0aGlzX29wdDsKLQlpbnQgbnVtX3BhbmVscyA9IEFSUkFZX1NJWkUoa25vd25fbGNkX3BhbmVscyk7Ci0JY2hhciogbW9kZSA9IE5VTEw7Ci0JaW50IHBhbmVsX2lkeCA9IDA7Ci0KLQlpZiAobnVtX3BhbmVscyA8PSAwKSB7Ci0JCXByaW50X2VycigiTm8gTENEIHBhbmVscyBzdXBwb3J0ZWQgYnkgZHJpdmVyISIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQotCWlmIChvcHRpb25zKSB7Ci0JCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsIiwiKSkgIT0gTlVMTCkgewotCQkJLyogUGFuZWwgb3B0aW9uICovCi0JCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJwYW5lbDoiLCA2KSkgewotCQkJCWludCBpOwotCQkJCXRoaXNfb3B0ICs9IDY7Ci0JCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYW5lbHM7IGkrKykgewotCQkJCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsCi0JCQkJCSAgICAgIAkgICAgIGtub3duX2xjZF9wYW5lbHNbaV0ubmFtZSwKLQkJCQkJCQlzdHJsZW4odGhpc19vcHQpKSkgewotCQkJCQkJcGFuZWxfaWR4ID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpID49IG51bV9wYW5lbHMpIHsKLSAJCQkJCXByaW50X3dhcm4oIlBhbmVsICVzIG5vdCBzdXBwb3J0ZWQhIiwgdGhpc19vcHQpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm5vY3Vyc29yIiwgOCkpIHsKLQkJCQl0aGlzX29wdCArPSA4OwotCQkJCW5vY3Vyc29yID0gMTsKLQkJCQlwcmludF9pbmZvKCJDdXJzb3IgZGlzYWJsZWQiKTsKLQkJCX0KLQkJCS8qIE1vZGUgb3B0aW9uIChvbmx5IG9wdGlvbiB0aGF0IHN0YXJ0IHdpdGggZGlnaXQpICovCi0JCQllbHNlIGlmIChpc2RpZ2l0KHRoaXNfb3B0WzBdKSkgewotCQkJCW1vZGUgPSBrc3RyZHVwKHRoaXNfb3B0LCBHRlBfS0VSTkVMKTsKLQkJCQlpZiAoIW1vZGUpIHsKLQkJCQkJcHJpbnRfZXJyKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQkJfQotCQkJfQotCQkJLyogVW5zdXBwb3J0ZWQgb3B0aW9uICovCi0JCQllbHNlIHsKLQkJCQlwcmludF93YXJuKCJVbnN1cHBvcnRlZCBvcHRpb24gXCIlc1wiIiwgdGhpc19vcHQpOwotCQkJfQotCQl9Ci0JfQotCi0JZHJ2X2luZm8ucGFuZWxfaWR4ID0gcGFuZWxfaWR4OwotCWRydl9pbmZvLm9wdF9tb2RlID0gbW9kZTsKLQotCXByaW50X2luZm8oIlBhbmVsPSVzIE1vZGU9JXMiLAotCQkJa25vd25fbGNkX3BhbmVsc1tkcnZfaW5mby5wYW5lbF9pZHhdLm5hbWUsCi0JCSAgICAgIAlkcnZfaW5mby5vcHRfbW9kZSA/IGRydl9pbmZvLm9wdF9tb2RlIDogImRlZmF1bHQiKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgX19pbml0IGF1MTEwMGZiX2luaXQodm9pZCkKLXsKLQljaGFyKiBvcHRpb25zOwotCWludCByZXQ7Ci0KLQlwcmludF9pbmZvKCIiIERSSVZFUl9ERVNDICIiKTsKLQotCW1lbXNldCgmZHJ2X2luZm8sIDAsIHNpemVvZihkcnZfaW5mbykpOwotCi0JaWYgKGZiX2dldF9vcHRpb25zKERSSVZFUl9OQU1FLCAmb3B0aW9ucykpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogU2V0dXAgZHJpdmVyIHdpdGggb3B0aW9ucyAqLwotCXJldCA9IGF1MTEwMGZiX3NldHVwKG9wdGlvbnMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50X2VycigiRmFpbCB0byBzZXR1cCBkcml2ZXIiKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdTExMDBmYl9kcml2ZXIpOwogfQogCi12b2lkIF9fZXhpdCBhdTExMDBmYl9jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYXUxMTAwZmJfdW5sb2FkKHZvaWQpCiB7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1MTEwMGZiX2RyaXZlcik7Ci0KLQlrZnJlZShkcnZfaW5mby5vcHRfbW9kZSk7CiB9CiAKLW1vZHVsZV9pbml0KGF1MTEwMGZiX2luaXQpOwotbW9kdWxlX2V4aXQoYXUxMTAwZmJfY2xlYW51cCk7Cittb2R1bGVfaW5pdChhdTExMDBmYl9sb2FkKTsKK21vZHVsZV9leGl0KGF1MTEwMGZiX3VubG9hZCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmggYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmgKaW5kZXggMTY0ZmUyZi4uMTJkOTY0MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmgKQEAgLTEwOCw2ICsxMDgsNyBAQAogCXVuc2lnbmVkIGNoYXIqIAkJZmJfbWVtOwkJLyogRnJhbWVCdWZmZXIgbWVtb3J5IG1hcCAqLwogCXNpemVfdAkgICAgICAJCWZiX2xlbjsKIAlkbWFfYWRkcl90ICAgIAkJZmJfcGh5czsKKwlpbnQJCQlwYW5lbF9pZHg7CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNjQsMTEgKzM2NSw2IEBACiAJfSwKIH07CiAKLXN0cnVjdCBhdTExMDBmYl9kcnZfaW5mbyB7Ci0JaW50CXBhbmVsX2lkeDsKLQljaGFyIAkqb3B0X21vZGU7Ci19OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIElubGluZSBoZWxwZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F1MTIwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F1MTIwMGZiLmMKaW5kZXggNWRmZjMyYS4uNzIwMDU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdTEyMDBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXUxMjAwZmIuYwpAQCAtNDYsMTggKzQ2LDEwIEBACiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgImF1MTIwMGZiLmgiCiAKLSNpZmRlZiBDT05GSUdfUE0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BtLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfRkJfQVUxMjAwX0RFVlMKLSNkZWZpbmUgQ09ORklHX0ZCX0FVMTIwMF9ERVZTIDQKLSNlbmRpZgotCiAjZGVmaW5lIERSSVZFUl9OQU1FICJhdTEyMDBmYiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkxDRCBjb250cm9sbGVyIGRyaXZlciBmb3IgQVUxMjAwIHByb2Nlc3NvcnMiCiAKLSNkZWZpbmUgREVCVUcgMQorI2RlZmluZSBERUJVRyAwCiAKICNkZWZpbmUgcHJpbnRfZXJyKGYsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6ICIgZiAiXG4iLCAjIyBhcmcpCiAjZGVmaW5lIHByaW50X3dhcm4oZiwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FICI6ICIgZiAiXG4iLCAjIyBhcmcpCkBAIC0xNTAsNyArMTQyLDcgQEAKIAogLyogUHJpdmF0ZSwgcGVyLWZyYW1lYnVmZmVyIG1hbmFnZW1lbnQgaW5mb3JtYXRpb24gKGluZGVwZW5kZW50IG9mIHRoZSBwYW5lbCBpdHNlbGYpICovCiBzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlIHsKLQlzdHJ1Y3QgZmJfaW5mbyBmYl9pbmZvOwkJCS8qIEZCIGRyaXZlciBpbmZvIHJlY29yZCAqLworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvOwkJLyogRkIgZHJpdmVyIGluZm8gcmVjb3JkICovCiAKIAlpbnQJCQkJCXBsYW5lOwogCXVuc2lnbmVkIGNoYXIqIAkJZmJfbWVtOwkJLyogRnJhbWVCdWZmZXIgbWVtb3J5IG1hcCAqLwpAQCAtMTU4LDcgKzE1MCw2IEBACiAJZG1hX2FkZHJfdCAgICAJCWZiX3BoeXM7CiB9OwogCi1zdGF0aWMgc3RydWN0IGF1MTIwMGZiX2RldmljZSBfYXUxMjAwZmJfZGV2aWNlc1tDT05GSUdfRkJfQVUxMjAwX0RFVlNdOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBMQ0QgY29udHJvbGxlciByZXN0cmljdGlvbnMgKi8KQEAgLTE3MSwxMCArMTYyLDE4IEBACiAvKiBEZWZhdWx0IG51bWJlciBvZiB2aXNpYmxlIHNjcmVlbiBidWZmZXIgdG8gYWxsb2NhdGUgKi8KICNkZWZpbmUgQVUxMjAwRkJfTkJSX1ZJREVPX0JVRkZFUlMgMQogCisvKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGZiIGRldmljZXMgdG8gY3JlYXRlICovCisjZGVmaW5lIE1BWF9ERVZJQ0VfQ09VTlQJNAorCisvKiBEZWZhdWx0IHdpbmRvdyBjb25maWd1cmF0aW9uIGVudHJ5IHRvIHVzZSAoc2VlIHdpbmRvd3NbXSkgKi8KKyNkZWZpbmUgREVGQVVMVF9XSU5ET1dfSU5ERVgJMgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqX2F1MTIwMGZiX2luZm9zW01BWF9ERVZJQ0VfQ09VTlRdOwogc3RhdGljIHN0cnVjdCBhdTEyMDBfbGNkICpsY2QgPSAoc3RydWN0IGF1MTIwMF9sY2QgKikgQVUxMjAwX0xDRF9BRERSOwotc3RhdGljIGludCB3aW5kb3dfaW5kZXggPSAyOyAvKiBkZWZhdWx0IGlzIHplcm8gKi8KK3N0YXRpYyBpbnQgZGV2aWNlX2NvdW50ID0gTUFYX0RFVklDRV9DT1VOVDsKK3N0YXRpYyBpbnQgd2luZG93X2luZGV4ID0gREVGQVVMVF9XSU5ET1dfSU5ERVg7CS8qIGRlZmF1bHQgaXMgemVybyAqLwogc3RhdGljIGludCBwYW5lbF9pbmRleCA9IDI7IC8qIGRlZmF1bHQgaXMgemVybyAqLwogc3RhdGljIHN0cnVjdCB3aW5kb3dfc2V0dGluZ3MgKndpbjsKIHN0YXRpYyBzdHJ1Y3QgcGFuZWxfc2V0dGluZ3MgKnBhbmVsOwpAQCAtMjA1LDEyICsyMDQsNiBAQAogZXh0ZXJuIGludCBib2FyZF9hdTEyMDBmYl9wYW5lbF9pbml0ICh2b2lkKTsKIGV4dGVybiBpbnQgYm9hcmRfYXUxMjAwZmJfcGFuZWxfc2h1dGRvd24gKHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX1BNCi1pbnQgYXUxMjAwZmJfcG1fY2FsbGJhY2soYXUxeHh4X3Bvd2VyX2Rldl90ICpkZXYsCi0JCWF1MXh4eF9yZXF1ZXN0X3QgcmVxdWVzdCwgdm9pZCAqZGF0YSk7Ci1hdTF4eHhfcG93ZXJfZGV2X3QgKkxDRF9wbV9kZXY7Ci0jZW5kaWYKLQogLyoKICAqIERlZmF1bHQgd2luZG93IGNvbmZpZ3VyYXRpb25zCiAgKi8KQEAgLTY1MiwyNSArNjQ1LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNldF9icmlnaHRuZXNzKHVuc2lnbmVkIGludCBicmlnaHRuZXNzKQotewotCXVuc2lnbmVkIGludCBoaTEsIGRpdmlkZXI7Ci0KLQkvKiBsaW1pdCBicmlnaHRuZXNzIHB3bSBkdXR5IHRvID49IDMwLzE2MDAgKi8KLQlpZiAoYnJpZ2h0bmVzcyA8IDMwKSB7Ci0JCWJyaWdodG5lc3MgPSAzMDsKLQl9Ci0JZGl2aWRlciA9IChsY2QtPnB3bWRpdiAmIDB4M0ZGRkYpICsgMTsKLQloaTEgPSAobGNkLT5wd21oaSA+PiAxNikgKyAxOwotCWhpMSA9ICgoKGJyaWdodG5lc3MgJiAweEZGKSArIDEpICogZGl2aWRlciA+PiA4KTsKLQlsY2QtPnB3bWhpICY9IDB4RkZGRjsKLQlsY2QtPnB3bWhpIHw9IChoaTEgPDwgMTYpOwotCi0JcmV0dXJuIGJyaWdodG5lc3M7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KIHN0YXRpYyBpbnQgd2luYnBwICh1bnNpZ25lZCBpbnQgd2luY3RybDEpCiB7CiAJaW50IGJpdHMgPSAwOwpAQCAtNzEyLDggKzY4Niw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX0ZCX0FVMTIwMF9ERVZTOyArK2kpIHsKLQkJaWYgKGZiX2luZm8gPT0gKHN0cnVjdCBmYl9pbmZvICopKCZfYXUxMjAwZmJfZGV2aWNlc1tpXS5mYl9pbmZvKSkKKwlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlX2NvdW50OyArK2kpIHsKKwkJaWYgKGZiX2luZm8gPT0gX2F1MTIwMGZiX2luZm9zW2ldKQogCQkJcmV0dXJuIGk7CiAJfQogCXByaW50aygiYXUxMjAwZmI6IEVSUk9SOiBmYmluZm8yaW5kZXggZmFpbGVkIVxuIik7CkBAIC05NjIsNyArOTM2LDcgQEAKIAlsY2QtPndpbmRvd1twbGFuZV0ud2luY3RybDIgPSAoIDAKIAkJfCBMQ0RfV0lOQ1RSTDJfQ0tNT0RFXzAwCiAJCXwgTENEX1dJTkNUUkwyX0RCTQotCQl8IExDRF9XSU5DVFJMMl9CWF9OKCBmYmRldi0+ZmJfaW5mby5maXgubGluZV9sZW5ndGgpCisJCXwgTENEX1dJTkNUUkwyX0JYX04oZmJkZXYtPmZiX2luZm8tPmZpeC5saW5lX2xlbmd0aCkKIAkJfCBMQ0RfV0lOQ1RSTDJfU0NYXzEKIAkJfCBMQ0RfV0lOQ1RSTDJfU0NZXzEKIAkJKSA7CkBAIC0xMDUwLDcgKzEwMjQsNyBAQAogc3RhdGljIGludCBhdTEyMDBmYl9mYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJc3RydWN0IGZiX2luZm8gKmZiaSkKIHsKLQlzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICopZmJpOworCXN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKmZiZGV2ID0gZmJpLT5wYXI7CiAJdTMyIHBpeGNsb2NrOwogCWludCBzY3JlZW5fc2l6ZSwgcGxhbmU7CiAKQEAgLTExNDIsNyArMTExNiw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYXUxMjAwZmJfZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqZmJpKQogewotCXN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKilmYmk7CisJc3RydWN0IGF1MTIwMGZiX2RldmljZSAqZmJkZXYgPSBmYmktPnBhcjsKIAogCWF1MTIwMGZiX3VwZGF0ZV9mYmluZm8oZmJpKTsKIAlhdTEyMDBfc2V0bW9kZShmYmRldik7CkBAIC0xMjQ2LDExICsxMjIwLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQ9MCwgb2ZmOwotCXN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKikgaW5mbzsKLQotI2lmZGVmIENPTkZJR19QTQotCWF1MXh4eF9wbV9hY2Nlc3MoTENEX3BtX2Rldik7Ci0jZW5kaWYKKwlzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICpmYmRldiA9IGluZm8tPnBhcjsKIAogCWlmICh2bWEtPnZtX3Bnb2ZmID4gKH4wVUwgPj4gUEFHRV9TSElGVCkpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDYxLDEwICsxNDMxLDYgQEAKIAlpbnQgcGxhbmU7CiAJaW50IHZhbDsKIAotI2lmZGVmIENPTkZJR19QTQotCWF1MXh4eF9wbV9hY2Nlc3MoTENEX3BtX2Rldik7Ci0jZW5kaWYKLQogCXBsYW5lID0gZmJpbmZvMmluZGV4KGluZm8pOwogCXByaW50X2RiZygiYXUxMjAwZmI6IGlvY3RsICVkIG9uIHBsYW5lICVkXG4iLCBjbWQsIHBsYW5lKTsKIApAQCAtMTUzNiw5ICsxNTAyLDExIEBACiAJLmZiX3NldF9wYXIJPSBhdTEyMDBmYl9mYl9zZXRfcGFyLAogCS5mYl9zZXRjb2xyZWcJPSBhdTEyMDBmYl9mYl9zZXRjb2xyZWcsCiAJLmZiX2JsYW5rCT0gYXUxMjAwZmJfZmJfYmxhbmssCi0JLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKLQkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfZmlsbHJlY3QJPSBzeXNfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gc3lzX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQJPSBzeXNfaW1hZ2VibGl0LAorCS5mYl9yZWFkCT0gZmJfc3lzX3JlYWQsCisJLmZiX3dyaXRlCT0gZmJfc3lzX3dyaXRlLAogCS5mYl9zeW5jCT0gTlVMTCwKIAkuZmJfaW9jdGwJPSBhdTEyMDBmYl9pb2N0bCwKIAkuZmJfbW1hcAk9IGF1MTIwMGZiX2ZiX21tYXAsCkBAIC0xNTYxLDEwICsxNTI5LDkgQEAKIAogc3RhdGljIGludCBhdTEyMDBmYl9pbml0X2ZiaW5mbyhzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICpmYmRldikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gJmZiZGV2LT5mYl9pbmZvOworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBmYmRldi0+ZmJfaW5mbzsKIAlpbnQgYnBwOwogCi0JbWVtc2V0KGZiaSwgMCwgc2l6ZW9mKHN0cnVjdCBmYl9pbmZvKSk7CiAJZmJpLT5mYm9wcyA9ICZhdTEyMDBmYl9mYl9vcHM7CiAKIAlicHAgPSB3aW5icHAod2luLT53W2ZiZGV2LT5wbGFuZV0ubW9kZV93aW5jdHJsMSk7CkBAIC0xNjIzLDI0ICsxNTkwLDM2IEBACiAKIC8qIEFVMTIwMCBMQ0QgY29udHJvbGxlciBkZXZpY2UgZHJpdmVyICovCiAKLXN0YXRpYyBpbnQgYXUxMjAwZmJfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF1MTIwMGZiX2Rydl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGF1MTIwMGZiX2RldmljZSAqZmJkZXY7CisJc3RydWN0IGZiX2luZm8gKmZiaSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBwYWdlOwotCWludCBicHAsIHBsYW5lLCByZXQ7CisJaW50IGJwcCwgcGxhbmUsIHJldCwgaXJxOwogCi0JaWYgKCFkZXYpCi0JCXJldHVybiAtRUlOVkFMOworCS8qIHNodXQgZ2NjIHVwICovCisJcmV0ID0gMDsKKwlmYmRldiA9IE5VTEw7CiAKLQlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBDT05GSUdfRkJfQVUxMjAwX0RFVlM7ICsrcGxhbmUpIHsKKwkvKiBLaWNrc3RhcnQgdGhlIHBhbmVsICovCisJYXUxMjAwX3NldHBhbmVsKHBhbmVsKTsKKworCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IGRldmljZV9jb3VudDsgKytwbGFuZSkgewogCQlicHAgPSB3aW5icHAod2luLT53W3BsYW5lXS5tb2RlX3dpbmN0cmwxKTsKIAkJaWYgKHdpbi0+d1twbGFuZV0ueHJlcyA9PSAwKQogCQkJd2luLT53W3BsYW5lXS54cmVzID0gcGFuZWwtPlhyZXM7CiAJCWlmICh3aW4tPndbcGxhbmVdLnlyZXMgPT0gMCkKIAkJCXdpbi0+d1twbGFuZV0ueXJlcyA9IHBhbmVsLT5ZcmVzOwogCi0JCWZiZGV2ID0gJl9hdTEyMDBmYl9kZXZpY2VzW3BsYW5lXTsKLQkJbWVtc2V0KGZiZGV2LCAwLCBzaXplb2Yoc3RydWN0IGF1MTIwMGZiX2RldmljZSkpOworCQlmYmkgPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGF1MTIwMGZiX2RldmljZSksCisJCQkJCSZkZXYtPmRldik7CisJCWlmICghZmJpKQorCQkJZ290byBmYWlsZWQ7CisKKwkJX2F1MTIwMGZiX2luZm9zW3BsYW5lXSA9IGZiaTsKKwkJZmJkZXYgPSBmYmktPnBhcjsKKwkJZmJkZXYtPmZiX2luZm8gPSBmYmk7CisKIAkJZmJkZXYtPnBsYW5lID0gcGxhbmU7CiAKIAkJLyogQWxsb2NhdGUgdGhlIGZyYW1lYnVmZmVyIHRvIHRoZSBtYXhpbXVtIHNjcmVlbiBzaXplICovCkBAIC0xNjczLDMwICsxNjUyLDMxIEBACiAJCQlnb3RvIGZhaWxlZDsKIAogCQkvKiBSZWdpc3RlciBuZXcgZnJhbWVidWZmZXIgKi8KLQkJaWYgKChyZXQgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmZmJkZXYtPmZiX2luZm8pKSA8IDApIHsKKwkJcmV0ID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJpKTsKKwkJaWYgKHJldCA8IDApIHsKIAkJCXByaW50X2VycigiY2Fubm90IHJlZ2lzdGVyIG5ldyBmcmFtZWJ1ZmZlciIpOwogCQkJZ290byBmYWlsZWQ7CiAJCX0KIAotCQlhdTEyMDBmYl9mYl9zZXRfcGFyKCZmYmRldi0+ZmJfaW5mbyk7CisJCWF1MTIwMGZiX2ZiX3NldF9wYXIoZmJpKTsKIAogI2lmICFkZWZpbmVkKENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19MT0dPKQogCQlpZiAocGxhbmUgPT0gMCkKLQkJCWlmIChmYl9wcmVwYXJlX2xvZ28oJmZiZGV2LT5mYl9pbmZvLCBGQl9ST1RBVEVfVVIpKSB7CisJCQlpZiAoZmJfcHJlcGFyZV9sb2dvKGZiaSwgRkJfUk9UQVRFX1VSKSkgewogCQkJCS8qIFN0YXJ0IGRpc3BsYXkgYW5kIHNob3cgbG9nbyBvbiBib290ICovCi0JCQkJZmJfc2V0X2NtYXAoJmZiZGV2LT5mYl9pbmZvLmNtYXAsCi0JCQkJCQkmZmJkZXYtPmZiX2luZm8pOwotCi0JCQkJZmJfc2hvd19sb2dvKCZmYmRldi0+ZmJfaW5mbywgRkJfUk9UQVRFX1VSKTsKKwkJCQlmYl9zZXRfY21hcCgmZmJpLT5jbWFwLCBmYmkpOworCQkJCWZiX3Nob3dfbG9nbyhmYmksIEZCX1JPVEFURV9VUik7CiAJCQl9CiAjZW5kaWYKIAl9CiAKIAkvKiBOb3cgaG9vayBpbnRlcnJ1cHQgdG9vICovCi0JaWYgKChyZXQgPSByZXF1ZXN0X2lycShBVTEyMDBfTENEX0lOVCwgYXUxMjAwZmJfaGFuZGxlX2lycSwKLQkJIAkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwgImxjZCIsICh2b2lkICopZGV2KSkgPCAwKSB7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgYXUxMjAwZmJfaGFuZGxlX2lycSwKKwkJCSAgSVJRRl9TSEFSRUQsICJsY2QiLCAodm9pZCAqKWRldik7CisJaWYgKHJldCkgewogCQlwcmludF9lcnIoImZhaWwgdG8gcmVxdWVzdCBpbnRlcnJ1cHQgbGluZSAlZCAoZXJyOiAlZCkiLAotCQkJICBBVTEyMDBfTENEX0lOVCwgcmV0KTsKKwkJCSAgaXJxLCByZXQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTE3MDUsODQgKzE2ODUsMTA4IEBACiBmYWlsZWQ6CiAJLyogTk9URTogVGhpcyBvbmx5IGRvZXMgdGhlIGN1cnJlbnQgcGxhbmUvd2luZG93IHRoYXQgZmFpbGVkOyBvdGhlcnMgYXJlIHN0aWxsIGFjdGl2ZSAqLwogCWlmIChmYmRldi0+ZmJfbWVtKQotCQlkbWFfZnJlZV9ub25jb2hlcmVudChkZXYsIFBBR0VfQUxJR04oZmJkZXYtPmZiX2xlbiksCisJCWRtYV9mcmVlX25vbmNvaGVyZW50KCZkZXYtPmRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwKIAkJCQlmYmRldi0+ZmJfbWVtLCBmYmRldi0+ZmJfcGh5cyk7Ci0JaWYgKGZiZGV2LT5mYl9pbmZvLmNtYXAubGVuICE9IDApCi0JCWZiX2RlYWxsb2NfY21hcCgmZmJkZXYtPmZiX2luZm8uY21hcCk7Ci0JaWYgKGZiZGV2LT5mYl9pbmZvLnBzZXVkb19wYWxldHRlKQotCQlrZnJlZShmYmRldi0+ZmJfaW5mby5wc2V1ZG9fcGFsZXR0ZSk7CisJaWYgKGZiaSkgeworCQlpZiAoZmJpLT5jbWFwLmxlbiAhPSAwKQorCQkJZmJfZGVhbGxvY19jbWFwKCZmYmktPmNtYXApOworCQlrZnJlZShmYmktPnBzZXVkb19wYWxldHRlKTsKKwl9CiAJaWYgKHBsYW5lID09IDApCiAJCWZyZWVfaXJxKEFVMTIwMF9MQ0RfSU5ULCAodm9pZCopZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF1MTIwMGZiX2Rydl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgYXUxMjAwZmJfZHJ2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGF1MTIwMGZiX2RldmljZSAqZmJkZXY7CisJc3RydWN0IGZiX2luZm8gKmZiaTsKIAlpbnQgcGxhbmU7CiAKLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAkvKiBUdXJuIG9mZiB0aGUgcGFuZWwgKi8KIAlhdTEyMDBfc2V0cGFuZWwoTlVMTCk7CiAKLQlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBDT05GSUdfRkJfQVUxMjAwX0RFVlM7ICsrcGxhbmUpCi0JewotCQlmYmRldiA9ICZfYXUxMjAwZmJfZGV2aWNlc1twbGFuZV07CisJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgZGV2aWNlX2NvdW50OyArK3BsYW5lKQl7CisJCWZiaSA9IF9hdTEyMDBmYl9pbmZvc1twbGFuZV07CisJCWZiZGV2ID0gZmJpLT5wYXI7CiAKIAkJLyogQ2xlYW4gdXAgYWxsIHByb2JlIGRhdGEgKi8KLQkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmZmJkZXYtPmZiX2luZm8pOworCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiaSk7CiAJCWlmIChmYmRldi0+ZmJfbWVtKQogCQkJZG1hX2ZyZWVfbm9uY29oZXJlbnQoJmRldi0+ZGV2LAogCQkJCQlQQUdFX0FMSUdOKGZiZGV2LT5mYl9sZW4pLAogCQkJCQlmYmRldi0+ZmJfbWVtLCBmYmRldi0+ZmJfcGh5cyk7Ci0JCWlmIChmYmRldi0+ZmJfaW5mby5jbWFwLmxlbiAhPSAwKQotCQkJZmJfZGVhbGxvY19jbWFwKCZmYmRldi0+ZmJfaW5mby5jbWFwKTsKLQkJaWYgKGZiZGV2LT5mYl9pbmZvLnBzZXVkb19wYWxldHRlKQotCQkJa2ZyZWUoZmJkZXYtPmZiX2luZm8ucHNldWRvX3BhbGV0dGUpOworCQlpZiAoZmJpLT5jbWFwLmxlbiAhPSAwKQorCQkJZmJfZGVhbGxvY19jbWFwKCZmYmktPmNtYXApOworCQlrZnJlZShmYmktPnBzZXVkb19wYWxldHRlKTsKKworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGZiaSk7CisJCV9hdTEyMDBmYl9pbmZvc1twbGFuZV0gPSBOVUxMOwogCX0KIAotCWZyZWVfaXJxKEFVMTIwMF9MQ0RfSU5ULCAodm9pZCAqKWRldik7CisJZnJlZV9pcnEocGxhdGZvcm1fZ2V0X2lycShkZXYsIDApLCAodm9pZCAqKWRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBhdTEyMDBmYl9kcnZfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSkKK3N0YXRpYyBpbnQgYXUxMjAwZmJfZHJ2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCS8qIFRPRE8gKi8KKwlhdTEyMDBfc2V0cGFuZWwoTlVMTCk7CisKKwlsY2QtPm91dG1hc2sgPSAwOworCWF1X3N5bmMoKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF1MTIwMGZiX2Rydl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhdTEyMDBmYl9kcnZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQkvKiBUT0RPICovCisJc3RydWN0IGZiX2luZm8gKmZiaTsKKwlpbnQgaTsKKworCS8qIEtpY2tzdGFydCB0aGUgcGFuZWwgKi8KKwlhdTEyMDBfc2V0cGFuZWwocGFuZWwpOworCisJZm9yIChpID0gMDsgaSA8IGRldmljZV9jb3VudDsgaSsrKSB7CisJCWZiaSA9IF9hdTEyMDBmYl9pbmZvc1tpXTsKKwkJYXUxMjAwZmJfZmJfc2V0X3BhcihmYmkpOworCX0KKwogCXJldHVybiAwOwogfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYXUxMjAwZmJfcG1vcHMgPSB7CisJLnN1c3BlbmQJPSBhdTEyMDBmYl9kcnZfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGF1MTIwMGZiX2Rydl9yZXN1bWUsCisJLmZyZWV6ZQkJPSBhdTEyMDBmYl9kcnZfc3VzcGVuZCwKKwkudGhhdwkJPSBhdTEyMDBmYl9kcnZfcmVzdW1lLAorfTsKKworI2RlZmluZSBBVTEyMDBGQl9QTU9QUwkoJmF1MTIwMGZiX3Btb3BzKQorCisjZWxzZQorI2RlZmluZSBBVTEyMDBGQl9QTU9QUwlOVUxMCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1MTIwMGZiX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZQkJPSAiYXUxMjAwLWxjZCIsCi0JCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJhdTEyMDAtbGNkIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wbQk9IEFVMTIwMEZCX1BNT1BTLAogCX0sCiAJLnByb2JlCQk9IGF1MTIwMGZiX2Rydl9wcm9iZSwKLQkucmVtb3ZlCQk9IGF1MTIwMGZiX2Rydl9yZW1vdmUsCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBhdTEyMDBmYl9kcnZfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGF1MTIwMGZiX2Rydl9yZXN1bWUsCi0jZW5kaWYKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF1MTIwMGZiX2Rydl9yZW1vdmUpLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogS2VybmVsIGRyaXZlciAqLwogCi1zdGF0aWMgdm9pZCBhdTEyMDBmYl9zZXR1cCh2b2lkKQorc3RhdGljIGludCBhdTEyMDBmYl9zZXR1cCh2b2lkKQogewotCWNoYXIqIG9wdGlvbnMgPSBOVUxMOwotCWNoYXIqIHRoaXNfb3B0OworCWNoYXIgKm9wdGlvbnMgPSBOVUxMOworCWNoYXIgKnRoaXNfb3B0LCAqZW5kcHRyOwogCWludCBudW1fcGFuZWxzID0gQVJSQVlfU0laRShrbm93bl9sY2RfcGFuZWxzKTsKIAlpbnQgcGFuZWxfaWR4ID0gLTE7CiAKQEAgLTE4MjcsNzAgKzE4MzEsNDIgQEAKIAkJCQlub2h3Y3Vyc29yID0gMTsKIAkJCX0KIAorCQkJZWxzZSBpZiAoc3RybmNtcCh0aGlzX29wdCwgImRldmljZXM6IiwgOCkgPT0gMCkgeworCQkJCXRoaXNfb3B0ICs9IDg7CisJCQkJZGV2aWNlX2NvdW50ID0gc2ltcGxlX3N0cnRvbCh0aGlzX29wdCwKKwkJCQkJCQkgICAgICZlbmRwdHIsIDApOworCQkJCWlmICgoZGV2aWNlX2NvdW50IDwgMCkgfHwKKwkJCQkgICAgKGRldmljZV9jb3VudCA+IE1BWF9ERVZJQ0VfQ09VTlQpKQorCQkJCQlkZXZpY2VfY291bnQgPSBNQVhfREVWSUNFX0NPVU5UOworCQkJfQorCisJCQllbHNlIGlmIChzdHJuY21wKHRoaXNfb3B0LCAid2luY2ZnOiIsIDcpID09IDApIHsKKwkJCQl0aGlzX29wdCArPSA3OworCQkJCXdpbmRvd19pbmRleCA9IHNpbXBsZV9zdHJ0b2wodGhpc19vcHQsCisJCQkJCQkJICAgICAmZW5kcHRyLCAwKTsKKwkJCQlpZiAoKHdpbmRvd19pbmRleCA8IDApIHx8CisJCQkJICAgICh3aW5kb3dfaW5kZXggPj0gQVJSQVlfU0laRSh3aW5kb3dzKSkpCisJCQkJCXdpbmRvd19pbmRleCA9IERFRkFVTFRfV0lORE9XX0lOREVYOworCQkJfQorCisJCQllbHNlIGlmIChzdHJuY21wKHRoaXNfb3B0LCAib2ZmIiwgMykgPT0gMCkKKwkJCQlyZXR1cm4gMTsKIAkJCS8qIFVuc3VwcG9ydGVkIG9wdGlvbiAqLwogCQkJZWxzZSB7CiAJCQkJcHJpbnRfd2FybigiVW5zdXBwb3J0ZWQgb3B0aW9uIFwiJXNcIiIsIHRoaXNfb3B0KTsKIAkJCX0KIAkJfQogCX0KKwlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBhdTEyMDBmYl9wbV9jYWxsYmFjayhhdTF4eHhfcG93ZXJfZGV2X3QgKmRldiwKLQkJYXUxeHh4X3JlcXVlc3RfdCByZXF1ZXN0LCB2b2lkICpkYXRhKSB7Ci0JaW50IHJldHZhbCA9IC0xOwotCXVuc2lnbmVkIGludCBkID0gMDsKLQl1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzcyA9IDA7Ci0KLQlpZiAocmVxdWVzdCA9PSBBVTFYWFhfUE1fU0xFRVApIHsKLQkJYm9hcmRfYXUxMjAwZmJfcGFuZWxfc2h1dGRvd24oKTsKLQl9Ci0JZWxzZSBpZiAocmVxdWVzdCA9PSBBVTFYWFhfUE1fV0FLRVVQKSB7Ci0JCWlmKGRldi0+cHJldl9zdGF0ZSA9PSBTTEVFUF9TVEFURSkKLQkJewotCQkJaW50IHBsYW5lOwotCQkJYXUxMjAwX3NldHBhbmVsKHBhbmVsKTsKLQkJCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IENPTkZJR19GQl9BVTEyMDBfREVWUzsgKytwbGFuZSkgCXsKLQkJCQlzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICpmYmRldjsKLQkJCQlmYmRldiA9ICZfYXUxMjAwZmJfZGV2aWNlc1twbGFuZV07Ci0JCQkJYXUxMjAwZmJfZmJfc2V0X3BhcigmZmJkZXYtPmZiX2luZm8pOwotCQkJfQotCQl9Ci0KLQkJZCA9ICooKHVuc2lnbmVkIGludCopZGF0YSk7Ci0JCWlmKGQgPD0xMCkgYnJpZ2h0bmVzcyA9IDI2OwotCQllbHNlIGlmKGQ8PTIwKSBicmlnaHRuZXNzID0gNTE7Ci0JCWVsc2UgaWYoZDw9MzApIGJyaWdodG5lc3MgPSA3NzsKLQkJZWxzZSBpZihkPD00MCkgYnJpZ2h0bmVzcyA9IDEwMjsKLQkJZWxzZSBpZihkPD01MCkgYnJpZ2h0bmVzcyA9IDEyODsKLQkJZWxzZSBpZihkPD02MCkgYnJpZ2h0bmVzcyA9IDE1MzsKLQkJZWxzZSBpZihkPD03MCkgYnJpZ2h0bmVzcyA9IDE3OTsKLQkJZWxzZSBpZihkPD04MCkgYnJpZ2h0bmVzcyA9IDIwNDsKLQkJZWxzZSBpZihkPD05MCkgYnJpZ2h0bmVzcyA9IDIzMDsKLQkJZWxzZSBicmlnaHRuZXNzID0gMjU1OwotCQlzZXRfYnJpZ2h0bmVzcyhicmlnaHRuZXNzKTsKLQl9IGVsc2UgaWYgKHJlcXVlc3QgPT0gQVUxWFhYX1BNX0dFVFNUQVRVUykgewotCQlyZXR1cm4gZGV2LT5jdXJfc3RhdGU7Ci0JfSBlbHNlIGlmIChyZXF1ZXN0ID09IEFVMVhYWF9QTV9BQ0NFU1MpIHsKLQkJaWYgKGRldi0+Y3VyX3N0YXRlICE9IFNMRUVQX1NUQVRFKQotCQkJcmV0dXJuIHJldHZhbDsKLQkJZWxzZSB7Ci0JCQlhdTEyMDBfc2V0cGFuZWwocGFuZWwpOwotCQl9Ci0JfSBlbHNlIGlmIChyZXF1ZXN0ID09IEFVMVhYWF9QTV9JRExFKSB7Ci0JfSBlbHNlIGlmIChyZXF1ZXN0ID09IEFVMVhYWF9QTV9DTEVBTlVQKSB7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IF9faW5pdCBhdTEyMDBmYl9pbml0KHZvaWQpCiB7CiAJcHJpbnRfaW5mbygiIiBEUklWRVJfREVTQyAiIik7CiAKIAkvKiBTZXR1cCBkcml2ZXIgd2l0aCBvcHRpb25zICovCi0JYXUxMjAwZmJfc2V0dXAoKTsKKwlpZiAoYXUxMjAwZmJfc2V0dXAoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBQb2ludCB0byB0aGUgcGFuZWwgc2VsZWN0ZWQgKi8KIAlwYW5lbCA9ICZrbm93bl9sY2RfcGFuZWxzW3BhbmVsX2luZGV4XTsKQEAgLTE4OTksMTcgKzE4NzUsNiBAQAogCXByaW50ayhEUklWRVJfTkFNRSAiOiBQYW5lbCAlZCAlc1xuIiwgcGFuZWxfaW5kZXgsIHBhbmVsLT5uYW1lKTsKIAlwcmludGsoRFJJVkVSX05BTUUgIjogV2luICVkICVzXG4iLCB3aW5kb3dfaW5kZXgsIHdpbi0+bmFtZSk7CiAKLQkvKiBLaWNrc3RhcnQgdGhlIHBhbmVsLCB0aGUgZnJhbWVidWZmZXJzL3dpbmRvd3MgY29tZSBzb29uIGVub3VnaCAqLwotCWF1MTIwMF9zZXRwYW5lbChwYW5lbCk7Ci0KLQkjaWZkZWYgQ09ORklHX1BNCi0JTENEX3BtX2RldiA9IG5ld19hdTF4eHhfcG93ZXJfZGV2aWNlKCJMQ0QiLCAmYXUxMjAwZmJfcG1fY2FsbGJhY2ssIE5VTEwpOwotCWlmICggTENEX3BtX2RldiA9PSBOVUxMKQotCQlwcmludGsoS0VSTl9JTkZPICJVbmFibGUgdG8gY3JlYXRlIGEgcG93ZXIgbWFuYWdlbWVudCBkZXZpY2UgZW50cnkgZm9yIHRoZSBhdTEyMDBmYi5cbiIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUG93ZXIgbWFuYWdlbWVudCBkZXZpY2UgZW50cnkgZm9yIHRoZSBhdTEyMDBmYiBsb2FkZWQuXG4iKTsKLQkjZW5kaWYKLQogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF1MTIwMGZiX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0Lzg4cG04NjB4X2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC84OHBtODYweF9ibC5jCmluZGV4IGMwNGI5NGQuLjExMDVmYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0Lzg4cG04NjB4X2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvODhwbTg2MHhfYmwuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC84OHBtODYweC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIE1BWF9CUklHSFRORVNTCQkoMHhGRikKICNkZWZpbmUgTUlOX0JSSUdIVE5FU1MJCSgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwNTUyMF9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwNTUyMF9ibC5jCmluZGV4IGQxYWVlNzMuLmRmYjc2M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDU1MjBfYmwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA1NTIwX2JsLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvYWRwNTUyMC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IGFkcDU1MjBfYmwgewogCXN0cnVjdCBkZXZpY2UgKm1hc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NjBfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NjBfYmwuYwppbmRleCAxODNiNmY2Li42NmJjNzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODYwX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg2MF9ibC5jCkBAIC03LDcgKzcsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NzBfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NzBfYmwuYwppbmRleCBkMDY4ODZhLi42YzY4YTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODcwX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg3MF9ibC5jCkBAIC03LDcgKzcsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KQEAgLTkzMiw3ICs5MzEsNiBAQAogb3V0MToKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmwpOwogb3V0MjoKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKIAlrZnJlZShkYXRhKTsKIAogCXJldHVybiByZXQ7CkBAIC05NTIsNyArOTUwLDYgQEAKIAkJCSZhZHA4ODcwX2JsX2F0dHJfZ3JvdXApOwogCiAJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmJsKTsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKIAlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYW1zMzY5ZmcwNi5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYW1zMzY5ZmcwNi5jCmluZGV4IDlmMGE0OTFlLi43ODM4YTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hbXMzNjlmZzA2LmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYW1zMzY5ZmcwNi5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZGE5MDN4X2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9kYTkwM3hfYmwuYwppbmRleCA2MjA0M2YxLi5kNjhmMTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9kYTkwM3hfYmwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9kYTkwM3hfYmwuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwM3guaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgREE5MDMwX1dMRURfQ09OVFJPTAkweDI1CiAjZGVmaW5lIERBOTAzMF9XTEVEX0NQX0VOCSgxIDw8IDYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9lcDkzeHhfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2VwOTN4eF9ibC5jCmluZGV4IGIwNTgyOTEuLmM3NGE2ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2VwOTN4eF9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2VwOTN4eF9ibC5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9nZW5lcmljX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9nZW5lcmljX2JsLmMKaW5kZXggOGM2YmVmZC4uYWRiMTkxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZ2VuZXJpY19ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2dlbmVyaWNfYmwuYwpAQCAtNTYsNyArNTYsNyBAQAogICogQ2FsbGVkIHdoZW4gdGhlIGJhdHRlcnkgaXMgbG93IHRvIGxpbWl0IHRoZSBiYWNrbGlnaHQgaW50ZW5zaXR5LgogICogSWYgbGltaXQ9PTAgY2xlYXIgYW55IGxpbWl0LCBvdGhlcndpc2UgbGltaXQgdGhlIGludGVuc2l0eQogICovCi12b2lkIGNvcmdpYmxfbGltaXRfaW50ZW5zaXR5KGludCBsaW1pdCkKK3ZvaWQgZ2VuZXJpY2JsX2xpbWl0X2ludGVuc2l0eShpbnQgbGltaXQpCiB7CiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkID0gZ2VuZXJpY19iYWNrbGlnaHRfZGV2aWNlOwogCkBAIC02OCw3ICs2OCw3IEBACiAJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoZ2VuZXJpY19iYWNrbGlnaHRfZGV2aWNlKTsKIAltdXRleF91bmxvY2soJmJkLT5vcHNfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNvcmdpYmxfbGltaXRfaW50ZW5zaXR5KTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY2JsX2xpbWl0X2ludGVuc2l0eSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBnZW5lcmljYmxfb3BzID0gewogCS5vcHRpb25zID0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbDRmMDAyNDJ0MDMuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2w0ZjAwMjQydDAzLmMKaW5kZXggOThhZDNlNS4uNGY1ZDFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbDRmMDAyNDJ0MDMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sNGYwMDI0MnQwMy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbGNkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTIsMTUgKzUzLDExIEBACiAKIAlkZXZfZGJnKCZzcGktPmRldiwgImluaXRpYWxpemluZyBMQ0RcbiIpOwogCi0JaWYgKHByaXYtPmlvX3JlZykgewotCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UocHJpdi0+aW9fcmVnLCAxODAwMDAwLCAxODAwMDAwKTsKLQkJcmVndWxhdG9yX2VuYWJsZShwcml2LT5pb19yZWcpOwotCX0KKwlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UocHJpdi0+aW9fcmVnLCAxODAwMDAwLCAxODAwMDAwKTsKKwlyZWd1bGF0b3JfZW5hYmxlKHByaXYtPmlvX3JlZyk7CiAKLQlpZiAocHJpdi0+Y29yZV9yZWcpIHsKLQkJcmVndWxhdG9yX3NldF92b2x0YWdlKHByaXYtPmNvcmVfcmVnLCAyODAwMDAwLCAyODAwMDAwKTsKLQkJcmVndWxhdG9yX2VuYWJsZShwcml2LT5jb3JlX3JlZyk7Ci0JfQorCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShwcml2LT5jb3JlX3JlZywgMjgwMDAwMCwgMjgwMDAwMCk7CisJcmVndWxhdG9yX2VuYWJsZShwcml2LT5jb3JlX3JlZyk7CiAKIAlsNGYwMDI0MnQwM19yZXNldChwZGF0YS0+cmVzZXRfZ3Bpbyk7CiAKQEAgLTc4LDExICs3NSw4IEBACiAKIAlncGlvX3NldF92YWx1ZShwZGF0YS0+ZGF0YV9lbmFibGVfZ3BpbywgMCk7CiAKLQlpZiAocHJpdi0+aW9fcmVnKQotCQlyZWd1bGF0b3JfZGlzYWJsZShwcml2LT5pb19yZWcpOwotCi0JaWYgKHByaXYtPmNvcmVfcmVnKQotCQlyZWd1bGF0b3JfZGlzYWJsZShwcml2LT5jb3JlX3JlZyk7CisJcmVndWxhdG9yX2Rpc2FibGUocHJpdi0+aW9fcmVnKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShwcml2LT5jb3JlX3JlZyk7CiB9CiAKIHN0YXRpYyBpbnQgbDRmMDAyNDJ0MDNfbGNkX3Bvd2VyX2dldChzdHJ1Y3QgbGNkX2RldmljZSAqbGQpCkBAIC0xNzgsNDcgKzE3MiwzNCBAQAogCiAJcHJpdi0+c3BpID0gc3BpOwogCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5yZXNldF9ncGlvLCAibGNkIGw0ZjAwMjQydDAzIHJlc2V0Iik7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShwZGF0YS0+cmVzZXRfZ3BpbywgR1BJT0ZfT1VUX0lOSVRfSElHSCwKKwkJCQkJCSJsY2QgbDRmMDAyNDJ0MDMgcmVzZXQiKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LAogCQkJIlVuYWJsZSB0byBnZXQgdGhlIGxjZCBsNGYwMDI0MnQwMyByZXNldCBncGlvLlxuIik7CiAJCWdvdG8gZXJyOwogCX0KIAotCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+cmVzZXRfZ3BpbywgMSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnIyOwotCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5kYXRhX2VuYWJsZV9ncGlvLAotCQkJCSJsY2QgbDRmMDAyNDJ0MDMgZGF0YSBlbmFibGUiKTsKKwlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHBkYXRhLT5kYXRhX2VuYWJsZV9ncGlvLCBHUElPRl9PVVRfSU5JVF9MT1csCisJCQkJCQkibGNkIGw0ZjAwMjQydDAzIGRhdGEgZW5hYmxlIik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZzcGktPmRldiwKIAkJCSJVbmFibGUgdG8gZ2V0IHRoZSBsY2QgbDRmMDAyNDJ0MDMgZGF0YSBlbiBncGlvLlxuIik7CiAJCWdvdG8gZXJyMjsKIAl9CiAKLQlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPmRhdGFfZW5hYmxlX2dwaW8sIDApOwotCWlmIChyZXQpCisJcHJpdi0+aW9fcmVnID0gcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2ZGQiKTsKKwlpZiAoSVNfRVJSKHByaXYtPmlvX3JlZykpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogVW5hYmxlIHRvIGdldCB0aGUgSU8gcmVndWxhdG9yXG4iLAorCQkgICAgICAgX19mdW5jX18pOwogCQlnb3RvIGVycjM7Ci0KLQlpZiAocGRhdGEtPmlvX3N1cHBseSkgewotCQlwcml2LT5pb19yZWcgPSByZWd1bGF0b3JfZ2V0KE5VTEwsIHBkYXRhLT5pb19zdXBwbHkpOwotCi0JCWlmIChJU19FUlIocHJpdi0+aW9fcmVnKSkgewotCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdldCB0aGUgSU8gcmVndWxhdG9yXG4iLAotCQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycjM7Ci0JCX0KIAl9CiAKLQlpZiAocGRhdGEtPmNvcmVfc3VwcGx5KSB7Ci0JCXByaXYtPmNvcmVfcmVnID0gcmVndWxhdG9yX2dldChOVUxMLCBwZGF0YS0+Y29yZV9zdXBwbHkpOwotCi0JCWlmIChJU19FUlIocHJpdi0+Y29yZV9yZWcpKSB7Ci0JCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IHRoZSBjb3JlIHJlZ3VsYXRvclxuIiwKLQkJCQkJCQkJX19mdW5jX18pOwotCQkJZ290byBlcnI0OwotCQl9CisJcHJpdi0+Y29yZV9yZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjb3JlIik7CisJaWYgKElTX0VSUihwcml2LT5jb3JlX3JlZykpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogVW5hYmxlIHRvIGdldCB0aGUgY29yZSByZWd1bGF0b3JcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyNDsKIAl9CiAKIAlwcml2LT5sZCA9IGxjZF9kZXZpY2VfcmVnaXN0ZXIoImw0ZjAwMjQydDAzIiwKQEAgLTIzOCwxMSArMjE5LDkgQEAKIAlyZXR1cm4gMDsKIAogZXJyNToKLQlpZiAocHJpdi0+Y29yZV9yZWcpCi0JCXJlZ3VsYXRvcl9wdXQocHJpdi0+Y29yZV9yZWcpOworCXJlZ3VsYXRvcl9wdXQocHJpdi0+Y29yZV9yZWcpOwogZXJyNDoKLQlpZiAocHJpdi0+aW9fcmVnKQotCQlyZWd1bGF0b3JfcHV0KHByaXYtPmlvX3JlZyk7CisJcmVndWxhdG9yX3B1dChwcml2LT5pb19yZWcpOwogZXJyMzoKIAlncGlvX2ZyZWUocGRhdGEtPmRhdGFfZW5hYmxlX2dwaW8pOwogZXJyMjoKQEAgLTI2NiwxMCArMjQ1LDggQEAKIAlncGlvX2ZyZWUocGRhdGEtPmRhdGFfZW5hYmxlX2dwaW8pOwogCWdwaW9fZnJlZShwZGF0YS0+cmVzZXRfZ3Bpbyk7CiAKLQlpZiAocHJpdi0+aW9fcmVnKQotCQlyZWd1bGF0b3JfcHV0KHByaXYtPmlvX3JlZyk7Ci0JaWYgKHByaXYtPmNvcmVfcmVnKQotCQlyZWd1bGF0b3JfcHV0KHByaXYtPmNvcmVfcmVnKTsKKwlyZWd1bGF0b3JfcHV0KHByaXYtPmlvX3JlZyk7CisJcmVndWxhdG9yX3B1dChwcml2LT5jb3JlX3JlZyk7CiAKIAlrZnJlZShwcml2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGQ5MDQwLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYwppbmRleCA1OTM0NjU1Li5kYTlhNWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAibGQ5MDQwX2dhbW1hLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xtczI4M2dmMDUuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xtczI4M2dmMDUuYwppbmRleCA1ZDNjZjMzLi40ZWM3OGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sbXMyODNnZjA1LmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG1zMjgzZ2YwNS5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2xtczI4M2dmMDUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IGxtczI4M2dmMDVfc3RhdGUgewogCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYXg4OTI1X2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYXg4OTI1X2JsLmMKaW5kZXggMDdlOGUyNy4uN2JiYzgwMjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYXg4OTI1X2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbWF4ODkyNV9ibC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL21heDg5MjUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgTUFYX0JSSUdIVE5FU1MJCSgweGZmKQogI2RlZmluZSBNSU5fQlJJR0hUTkVTUwkJKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9zNmU2M20wLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9zNmU2M20wLmMKaW5kZXggNjk0ZTVhYS4uZTEzMjE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvczZlNjNtMC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3M2ZTYzbTAuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiczZlNjNtMF9nYW1tYS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC93bTgzMXhfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3dtODMxeF9ibC5jCmluZGV4IGQ0YzZlYjIuLmZiZTllOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3dtODMxeF9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3dtODMxeF9ibC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iZjU0eC1scTA0M2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmNTR4LWxxMDQzZmIuYwppbmRleCAyNDY0YjkxLi41NjcyMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JmNTR4LWxxMDQzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JmNTR4LWxxMDQzZmIuYwpAQCAtNjMzLDcgKzYzMyw3IEBACiAJCWdvdG8gb3V0NzsKIAl9CiAKLQlpZiAocmVxdWVzdF9pcnEoaW5mby0+aXJxLCBiZmluX2JmNTR4X2lycV9lcnJvciwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoaW5mby0+aXJxLCBiZmluX2JmNTR4X2lycV9lcnJvciwgMCwKIAkJCSJQUEkgRVJST1IiLCBpbmZvKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FCiAJCSAgICAgICAiOiB1bmFibGUgdG8gcmVxdWVzdCBQUEkgRVJST1IgSVJRXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmZpbi1scTAzNXExLWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tbHEwMzVxMS1mYi5jCmluZGV4IDIzYjZjNGIuLmM2MzMwNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmZpbi1scTAzNXExLWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9iZmluLWxxMDM1cTEtZmIuYwpAQCAtNjk1LDcgKzY5NSw3IEBACiAJCWdvdG8gb3V0NzsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpbmZvLT5pcnEsIGJmaW5fbHEwMzVxMV9pcnFfZXJyb3IsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaW5mby0+aXJxLCBiZmluX2xxMDM1cTFfaXJxX2Vycm9yLCAwLAogCQkJRFJJVkVSX05BTUUiIFBQSSBFUlJPUiIsIGluZm8pOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byByZXF1ZXN0IFBQSSBFUlJPUiBJUlFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iZmluLXQzNTBtY3FiLWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYwppbmRleCBkOGRlMjlmLi5kNWUxMjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYwpAQCAtNTI5LDcgKzUyOSw3IEBACiAJCWdvdG8gb3V0NzsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpbmZvLT5pcnEsIGJmaW5fdDM1MG1jcWJfaXJxX2Vycm9yLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKGluZm8tPmlycSwgYmZpbl90MzUwbWNxYl9pcnFfZXJyb3IsIDAsCiAJCQkiUFBJIEVSUk9SIiwgaW5mbyk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JmaW5fYWR2NzM5M2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmaW5fYWR2NzM5M2ZiLmMKaW5kZXggODQ4NmY1NC4uODExZGQ3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iZmluX2FkdjczOTNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmZpbl9hZHY3MzkzZmIuYwpAQCAtNDgxLDcgKzQ4MSw3IEBACiAJCWdvdG8gb3V0XzQ7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKElSUV9QUElfRVJST1IsIHBwaV9pcnFfZXJyb3IsIElSUUZfRElTQUJMRUQsCisJaWYgKHJlcXVlc3RfaXJxKElSUV9QUElfRVJST1IsIHBwaV9pcnFfZXJyb3IsIDAsCiAJCQkiUFBJIEVSUk9SIiwgZmJkZXYpIDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZXF1ZXN0IFBQSSBFUlJPUiBJUlFcbiIpOwogCQlyZXQgPSAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYyBiL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMKaW5kZXggY2FhYTI3ZC4uMmM3NmZkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiY2FybWluZWZiLmgiCiAjaW5jbHVkZSAiY2FybWluZWZiX3JlZ3MuaCIKQEAgLTMyLDExICszMywxMSBAQAogI2RlZmluZSBDQVJNSU5FRkJfREVGQVVMVF9WSURFT19NT0RFCTEKIAogc3RhdGljIHVuc2lnbmVkIGludCBmYl9tb2RlID0gQ0FSTUlORUZCX0RFRkFVTFRfVklERU9fTU9ERTsKLW1vZHVsZV9wYXJhbShmYl9tb2RlLCB1aW50LCA0NDQpOworbW9kdWxlX3BhcmFtKGZiX21vZGUsIHVpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhmYl9tb2RlLCAiSW5pdGlhbCB2aWRlbyBtb2RlIGFzIGludGVnZXIuIik7CiAKIHN0YXRpYyBjaGFyICpmYl9tb2RlX3N0cjsKLW1vZHVsZV9wYXJhbShmYl9tb2RlX3N0ciwgY2hhcnAsIDQ0NCk7Cittb2R1bGVfcGFyYW0oZmJfbW9kZV9zdHIsIGNoYXJwLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZmJfbW9kZV9zdHIsICJJbml0aWFsIHZpZGVvIG1vZGUgaW4gY2hhcmFjdGVycy4iKTsKIAogLyoKQEAgLTQ2LDcgKzQ3LDcgQEAKICAqIDBiMDEwIERpc3BsYXkgMQogICovCiBzdGF0aWMgaW50IGZiX2Rpc3BsYXlzID0gQ0FSTUlORV9VU0VfRElTUExBWTAgfCBDQVJNSU5FX1VTRV9ESVNQTEFZMTsKLW1vZHVsZV9wYXJhbShmYl9kaXNwbGF5cywgaW50LCA0NDQpOworbW9kdWxlX3BhcmFtKGZiX2Rpc3BsYXlzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhmYl9kaXNwbGF5cywgIkJpdCBtb2RlLCB3aGljaCBkaXNwbGF5cyBhcmUgdXNlZCIpOwogCiBzdHJ1Y3QgY2FybWluZV9odyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvYmFsdF9sY2RmYi5jIGIvZHJpdmVycy92aWRlby9jb2JhbHRfbGNkZmIuYwppbmRleCBlMDI3NjQzLi5mNTY2OTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvYmFsdF9sY2RmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29iYWx0X2xjZGZiLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBDdXJzb3IgcG9zaXRpb24gYWRkcmVzcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb250cm9sZmIuYyBiL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKaW5kZXggOTA3NWJlYTUuLjdiMmM0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jb250cm9sZmIuYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAKIAogLyoKLSAqIFBhcnNlIHVzZXIgc3BlZmljaWVkIG9wdGlvbnMgKGB2aWRlbz1jb250cm9sZmI6JykKKyAqIFBhcnNlIHVzZXIgc3BlY2lmaWVkIG9wdGlvbnMgKGB2aWRlbz1jb250cm9sZmI6JykKICAqLwogc3RhdGljIHZvaWQgX19pbml0IGNvbnRyb2xfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZGE4eHgtZmIuYyBiL2RyaXZlcnMvdmlkZW8vZGE4eHgtZmIuYwppbmRleCBmY2RhYzg3Li41NWY5MWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2RhOHh4LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9kYTh4eC1mYi5jCkBAIC0zNSw2ICszNSw5IEBACiAKICNkZWZpbmUgRFJJVkVSX05BTUUgImRhOHh4X2xjZGMiCiAKKyNkZWZpbmUgTENEX1ZFUlNJT05fMQkxCisjZGVmaW5lIExDRF9WRVJTSU9OXzIJMgorCiAvKiBMQ0QgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lIExDRF9FTkRfT0ZfRlJBTUUxCQlCSVQoOSkKICNkZWZpbmUgTENEX0VORF9PRl9GUkFNRTAJCUJJVCg4KQpAQCAtNDksNyArNTIsOSBAQAogI2RlZmluZSBMQ0RfRE1BX0JVUlNUXzQJCQkweDIKICNkZWZpbmUgTENEX0RNQV9CVVJTVF84CQkJMHgzCiAjZGVmaW5lIExDRF9ETUFfQlVSU1RfMTYJCTB4NAotI2RlZmluZSBMQ0RfRU5EX09GX0ZSQU1FX0lOVF9FTkEJQklUKDIpCisjZGVmaW5lIExDRF9WMV9FTkRfT0ZfRlJBTUVfSU5UX0VOQQlCSVQoMikKKyNkZWZpbmUgTENEX1YyX0VORF9PRl9GUkFNRTBfSU5UX0VOQQlCSVQoOCkKKyNkZWZpbmUgTENEX1YyX0VORF9PRl9GUkFNRTFfSU5UX0VOQQlCSVQoOSkKICNkZWZpbmUgTENEX0RVQUxfRlJBTUVfQlVGRkVSX0VOQUJMRQlCSVQoMCkKIAogLyogTENEIENvbnRyb2wgUmVnaXN0ZXIgKi8KQEAgLTY1LDEyICs3MCwxOCBAQAogI2RlZmluZSBMQ0RfTU9OT184QklUX01PREUJCUJJVCg5KQogI2RlZmluZSBMQ0RfUkFTVEVSX09SREVSCQlCSVQoOCkKICNkZWZpbmUgTENEX1RGVF9NT0RFCQkJQklUKDcpCi0jZGVmaW5lIExDRF9VTkRFUkZMT1dfSU5UX0VOQQkJQklUKDYpCi0jZGVmaW5lIExDRF9QTF9FTkFCTEUJCQlCSVQoNCkKKyNkZWZpbmUgTENEX1YxX1VOREVSRkxPV19JTlRfRU5BCUJJVCg2KQorI2RlZmluZSBMQ0RfVjJfVU5ERVJGTE9XX0lOVF9FTkEJQklUKDUpCisjZGVmaW5lIExDRF9WMV9QTF9JTlRfRU5BCQlCSVQoNCkKKyNkZWZpbmUgTENEX1YyX1BMX0lOVF9FTkEJCUJJVCg2KQogI2RlZmluZSBMQ0RfTU9OT0NIUk9NRV9NT0RFCQlCSVQoMSkKICNkZWZpbmUgTENEX1JBU1RFUl9FTkFCTEUJCUJJVCgwKQogI2RlZmluZSBMQ0RfVEZUX0FMVF9FTkFCTEUJCUJJVCgyMykKICNkZWZpbmUgTENEX1NUTl81NjVfRU5BQkxFCQlCSVQoMjQpCisjZGVmaW5lIExDRF9WMl9ETUFfQ0xLX0VOCQlCSVQoMikKKyNkZWZpbmUgTENEX1YyX0xJRERfQ0xLX0VOCQlCSVQoMSkKKyNkZWZpbmUgTENEX1YyX0NPUkVfQ0xLX0VOCQlCSVQoMCkKKyNkZWZpbmUgTENEX1YyX0xQUF9CMTAJCQkyNgogCiAvKiBMQ0QgUmFzdGVyIFRpbWluZyAyIFJlZ2lzdGVyICovCiAjZGVmaW5lIExDRF9BQ19CSUFTX1RSQU5TSVRJT05TX1BFUl9JTlQoeCkJKCh4KSA8PCAxNikKQEAgLTgyLDYgKzkzLDcgQEAKICNkZWZpbmUgTENEX0lOVkVSVF9GUkFNRV9DTE9DSwkJCUJJVCgyMCkKIAogLyogTENEIEJsb2NrICovCisjZGVmaW5lICBMQ0RfUElEX1JFRwkJCQkweDAKICNkZWZpbmUgIExDRF9DVFJMX1JFRwkJCQkweDQKICNkZWZpbmUgIExDRF9TVEFUX1JFRwkJCQkweDgKICNkZWZpbmUgIExDRF9SQVNURVJfQ1RSTF9SRUcJCQkweDI4CkBAIC05NCw2ICsxMDYsMTcgQEAKICNkZWZpbmUgIExDRF9ETUFfRlJNX0JVRl9CQVNFX0FERFJfMV9SRUcJMHg0QwogI2RlZmluZSAgTENEX0RNQV9GUk1fQlVGX0NFSUxJTkdfQUREUl8xX1JFRwkweDUwCiAKKy8qIEludGVycnVwdCBSZWdpc3RlcnMgYXZhaWxhYmxlIG9ubHkgaW4gVmVyc2lvbiAyICovCisjZGVmaW5lICBMQ0RfUkFXX1NUQVRfUkVHCQkJMHg1OAorI2RlZmluZSAgTENEX01BU0tFRF9TVEFUX1JFRwkJCTB4NWMKKyNkZWZpbmUgIExDRF9JTlRfRU5BQkxFX1NFVF9SRUcJCQkweDYwCisjZGVmaW5lICBMQ0RfSU5UX0VOQUJMRV9DTFJfUkVHCQkJMHg2NAorI2RlZmluZSAgTENEX0VORF9PRl9JTlRfSU5EX1JFRwkJCTB4NjgKKworLyogQ2xvY2sgcmVnaXN0ZXJzIGF2YWlsYWJsZSBvbmx5IG9uIFZlcnNpb24gMiAqLworI2RlZmluZSAgTENEX0NMS19FTkFCTEVfUkVHCQkJMHg2YworI2RlZmluZSAgTENEX0NMS19SRVNFVF9SRUcJCQkweDcwCisKICNkZWZpbmUgTENEX05VTV9CVUZGRVJTCTIKIAogI2RlZmluZSBXU0lfVElNRU9VVAk1MApAQCAtMTA1LDYgKzEyOCw4IEBACiAKIHN0YXRpYyByZXNvdXJjZV9zaXplX3QgZGE4eHhfZmJfcmVnX2Jhc2U7CiBzdGF0aWMgc3RydWN0IHJlc291cmNlICpsY2RjX3JlZ3M7CitzdGF0aWMgdW5zaWduZWQgaW50IGxjZF9yZXZpc2lvbjsKK3N0YXRpYyBpcnFfaGFuZGxlcl90IGxjZGNfaXJxX2hhbmRsZXI7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGxjZGNfcmVhZCh1bnNpZ25lZCBpbnQgYWRkcikKIHsKQEAgLTI0MCw2ICsyNjUsNyBAQAogCXUzMiBlbmQ7CiAJdTMyIHJlZ19yYXM7CiAJdTMyIHJlZ19kbWE7CisJdTMyIHJlZ19pbnQ7CiAKIAkvKiBpbml0IHJlZyB0byBjbGVhciBQTE0gKGxvYWRpbmcgbW9kZSkgZmllbGRzICovCiAJcmVnX3JhcyA9IGxjZGNfcmVhZChMQ0RfUkFTVEVSX0NUUkxfUkVHKTsKQEAgLTI1Miw3ICsyNzgsMTQgQEAKIAkJZW5kICAgICAgPSBwYXItPmRtYV9lbmQ7CiAKIAkJcmVnX3JhcyB8PSBMQ0RfUEFMRVRURV9MT0FEX01PREUoREFUQV9PTkxZKTsKLQkJcmVnX2RtYSB8PSBMQ0RfRU5EX09GX0ZSQU1FX0lOVF9FTkE7CisJCWlmIChsY2RfcmV2aXNpb24gPT0gTENEX1ZFUlNJT05fMSkgeworCQkJcmVnX2RtYSB8PSBMQ0RfVjFfRU5EX09GX0ZSQU1FX0lOVF9FTkE7CisJCX0gZWxzZSB7CisJCQlyZWdfaW50ID0gbGNkY19yZWFkKExDRF9JTlRfRU5BQkxFX1NFVF9SRUcpIHwKKwkJCQlMQ0RfVjJfRU5EX09GX0ZSQU1FMF9JTlRfRU5BIHwKKwkJCQlMQ0RfVjJfRU5EX09GX0ZSQU1FMV9JTlRfRU5BOworCQkJbGNkY193cml0ZShyZWdfaW50LCBMQ0RfSU5UX0VOQUJMRV9TRVRfUkVHKTsKKwkJfQogCQlyZWdfZG1hIHw9IExDRF9EVUFMX0ZSQU1FX0JVRkZFUl9FTkFCTEU7CiAKIAkJbGNkY193cml0ZShzdGFydCwgTENEX0RNQV9GUk1fQlVGX0JBU0VfQUREUl8wX1JFRyk7CkBAIC0yNjQsNyArMjk3LDE0IEBACiAJCWVuZCAgICAgID0gc3RhcnQgKyBwYXItPnBhbGV0dGVfc3ogLSAxOwogCiAJCXJlZ19yYXMgfD0gTENEX1BBTEVUVEVfTE9BRF9NT0RFKFBBTEVUVEVfT05MWSk7Ci0JCXJlZ19yYXMgfD0gTENEX1BMX0VOQUJMRTsKKworCQlpZiAobGNkX3JldmlzaW9uID09IExDRF9WRVJTSU9OXzEpIHsKKwkJCXJlZ19yYXMgfD0gTENEX1YxX1BMX0lOVF9FTkE7CisJCX0gZWxzZSB7CisJCQlyZWdfaW50ID0gbGNkY19yZWFkKExDRF9JTlRfRU5BQkxFX1NFVF9SRUcpIHwKKwkJCQlMQ0RfVjJfUExfSU5UX0VOQTsKKwkJCWxjZGNfd3JpdGUocmVnX2ludCwgTENEX0lOVF9FTkFCTEVfU0VUX1JFRyk7CisJCX0KIAogCQlsY2RjX3dyaXRlKHN0YXJ0LCBMQ0RfRE1BX0ZSTV9CVUZfQkFTRV9BRERSXzBfUkVHKTsKIAkJbGNkY193cml0ZShlbmQsIExDRF9ETUFfRlJNX0JVRl9DRUlMSU5HX0FERFJfMF9SRUcpOwpAQCAtMzQ4LDYgKzM4OCw3IEBACiBzdGF0aWMgaW50IGxjZF9jZmdfZGlzcGxheShjb25zdCBzdHJ1Y3QgbGNkX2N0cmxfY29uZmlnICpjZmcpCiB7CiAJdTMyIHJlZzsKKwl1MzIgcmVnX2ludDsKIAogCXJlZyA9IGxjZGNfcmVhZChMQ0RfUkFTVEVSX0NUUkxfUkVHKSAmIH4oTENEX1RGVF9NT0RFIHwKIAkJCQkJCUxDRF9NT05PXzhCSVRfTU9ERSB8CkBAIC0zNzUsNyArNDE2LDEzIEBACiAJfQogCiAJLyogZW5hYmxlIGFkZGl0aW9uYWwgaW50ZXJydXB0cyBoZXJlICovCi0JcmVnIHw9IExDRF9VTkRFUkZMT1dfSU5UX0VOQTsKKwlpZiAobGNkX3JldmlzaW9uID09IExDRF9WRVJTSU9OXzEpIHsKKwkJcmVnIHw9IExDRF9WMV9VTkRFUkZMT1dfSU5UX0VOQTsKKwl9IGVsc2UgeworCQlyZWdfaW50ID0gbGNkY19yZWFkKExDRF9JTlRfRU5BQkxFX1NFVF9SRUcpIHwKKwkJCUxDRF9WMl9VTkRFUkZMT1dfSU5UX0VOQTsKKwkJbGNkY193cml0ZShyZWdfaW50LCBMQ0RfSU5UX0VOQUJMRV9TRVRfUkVHKTsKKwl9CiAKIAlsY2RjX3dyaXRlKHJlZywgTENEX1JBU1RFUl9DVFJMX1JFRyk7CiAKQEAgLTQxMywxOCArNDYwLDQzIEBACiAKIAkvKiBTZXQgdGhlIFBhbmVsIFdpZHRoICovCiAJLyogUGl4ZWxzIHBlciBsaW5lID0gKFBQTCArIDEpKjE2ICovCi0JLyoweDNGIGluIGJpdHMgNC4uOSBnaXZlcyBtYXggaG9yaXNvbnRhbCByZXNvbHV0aW9uID0gMTAyNCBwaXhlbHMqLwotCXdpZHRoICY9IDB4M2YwOworCWlmIChsY2RfcmV2aXNpb24gPT0gTENEX1ZFUlNJT05fMSkgeworCQkvKgorCQkgKiAweDNGIGluIGJpdHMgNC4uOSBnaXZlcyBtYXggaG9yaXpvbnRhbCByZXNvbHV0aW9uID0gMTAyNAorCQkgKiBwaXhlbHMuCisJCSAqLworCQl3aWR0aCAmPSAweDNmMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAweDdGIGluIGJpdHMgNC4uMTAgZ2l2ZXMgbWF4IGhvcml6b250YWwgcmVzb2x1dGlvbiA9IDIwNDgKKwkJICogcGl4ZWxzLgorCQkgKi8KKwkJd2lkdGggJj0gMHg3ZjA7CisJfQorCiAJcmVnID0gbGNkY19yZWFkKExDRF9SQVNURVJfVElNSU5HXzBfUkVHKTsKIAlyZWcgJj0gMHhmZmZmZmMwMDsKLQlyZWcgfD0gKCh3aWR0aCA+PiA0KSAtIDEpIDw8IDQ7CisJaWYgKGxjZF9yZXZpc2lvbiA9PSBMQ0RfVkVSU0lPTl8xKSB7CisJCXJlZyB8PSAoKHdpZHRoID4+IDQpIC0gMSkgPDwgNDsKKwl9IGVsc2UgeworCQl3aWR0aCA9ICh3aWR0aCA+PiA0KSAtIDE7CisJCXJlZyB8PSAoKHdpZHRoICYgMHgzZikgPDwgNCkgfCAoKHdpZHRoICYgMHg0MCkgPj4gMyk7CisJfQogCWxjZGNfd3JpdGUocmVnLCBMQ0RfUkFTVEVSX1RJTUlOR18wX1JFRyk7CiAKIAkvKiBTZXQgdGhlIFBhbmVsIEhlaWdodCAqLworCS8qIFNldCBiaXRzIDk6MCBvZiBMaW5lcyBQZXIgUGl4ZWwgKi8KIAlyZWcgPSBsY2RjX3JlYWQoTENEX1JBU1RFUl9USU1JTkdfMV9SRUcpOwogCXJlZyA9ICgoaGVpZ2h0IC0gMSkgJiAweDNmZikgfCAocmVnICYgMHhmZmZmZmMwMCk7CiAJbGNkY193cml0ZShyZWcsIExDRF9SQVNURVJfVElNSU5HXzFfUkVHKTsKIAorCS8qIFNldCBiaXQgMTAgb2YgTGluZXMgUGVyIFBpeGVsICovCisJaWYgKGxjZF9yZXZpc2lvbiA9PSBMQ0RfVkVSU0lPTl8yKSB7CisJCXJlZyA9IGxjZGNfcmVhZChMQ0RfUkFTVEVSX1RJTUlOR18yX1JFRyk7CisJCXJlZyB8PSAoKGhlaWdodCAtIDEpICYgMHg0MDApIDw8IDE2OworCQlsY2RjX3dyaXRlKHJlZywgTENEX1JBU1RFUl9USU1JTkdfMl9SRUcpOworCX0KKwogCS8qIFNldCB0aGUgUmFzdGVyIE9yZGVyIG9mIHRoZSBGcmFtZSBCdWZmZXIgKi8KIAlyZWcgPSBsY2RjX3JlYWQoTENEX1JBU1RFUl9DVFJMX1JFRykgJiB+KDEgPDwgOCk7CiAJaWYgKHJhc3Rlcl9vcmRlcikKQEAgLTUxMSw2ICs1ODMsOSBAQAogCS8qIERNQSBoYXMgdG8gYmUgZGlzYWJsZWQgKi8KIAlsY2RjX3dyaXRlKDAsIExDRF9ETUFfQ1RSTF9SRUcpOwogCWxjZGNfd3JpdGUoMCwgTENEX1JBU1RFUl9DVFJMX1JFRyk7CisKKwlpZiAobGNkX3JldmlzaW9uID09IExDRF9WRVJTSU9OXzIpCisJCWxjZGNfd3JpdGUoMCwgTENEX0lOVF9FTkFCTEVfU0VUX1JFRyk7CiB9CiAKIHN0YXRpYyB2b2lkIGxjZF9jYWxjX2Nsa19kaXZpZGVyKHN0cnVjdCBkYTh4eF9mYl9wYXIgKnBhcikKQEAgLTUyMyw2ICs1OTgsMTEgQEAKIAkvKiBDb25maWd1cmUgdGhlIExDRCBjbG9jayBkaXZpc29yLiAqLwogCWxjZGNfd3JpdGUoTENEX0NMS19ESVZJU09SKGRpdikgfAogCQkJKExDRF9SQVNURVJfTU9ERSAmIDB4MSksIExDRF9DVFJMX1JFRyk7CisKKwlpZiAobGNkX3JldmlzaW9uID09IExDRF9WRVJTSU9OXzIpCisJCWxjZGNfd3JpdGUoTENEX1YyX0RNQV9DTEtfRU4gfCBMQ0RfVjJfTElERF9DTEtfRU4gfAorCQkJCUxDRF9WMl9DT1JFX0NMS19FTiwgTENEX0NMS19FTkFCTEVfUkVHKTsKKwogfQogCiBzdGF0aWMgaW50IGxjZF9pbml0KHN0cnVjdCBkYTh4eF9mYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGxjZF9jdHJsX2NvbmZpZyAqY2ZnLApAQCAtNTgzLDcgKzY2Myw2MyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgbGNkY19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpCisvKiBJUlEgaGFuZGxlciBmb3IgdmVyc2lvbiAyIG9mIExDREMgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBsY2RjX2lycV9oYW5kbGVyX3JldjAyKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZGE4eHhfZmJfcGFyICpwYXIgPSBhcmc7CisJdTMyIHN0YXQgPSBsY2RjX3JlYWQoTENEX01BU0tFRF9TVEFUX1JFRyk7CisJdTMyIHJlZ19pbnQ7CisKKwlpZiAoKHN0YXQgJiBMQ0RfU1lOQ19MT1NUKSAmJiAoc3RhdCAmIExDRF9GSUZPX1VOREVSRkxPVykpIHsKKwkJbGNkX2Rpc2FibGVfcmFzdGVyKCk7CisJCWxjZGNfd3JpdGUoc3RhdCwgTENEX01BU0tFRF9TVEFUX1JFRyk7CisJCWxjZF9lbmFibGVfcmFzdGVyKCk7CisJfSBlbHNlIGlmIChzdGF0ICYgTENEX1BMX0xPQURfRE9ORSkgeworCQkvKgorCQkgKiBNdXN0IGRpc2FibGUgcmFzdGVyIGJlZm9yZSBjaGFuZ2luZyBzdGF0ZSBvZiBhbnkgY29udHJvbCBiaXQuCisJCSAqIEFuZCBhbHNvIG11c3QgYmUgZGlzYWJsZWQgYmVmb3JlIGNsZWFyaW5nIHRoZSBQTCBsb2FkaW5nCisJCSAqIGludGVycnVwdCB2aWEgdGhlIGZvbGxvd2luZyB3cml0ZSB0byB0aGUgc3RhdHVzIHJlZ2lzdGVyLiBJZgorCQkgKiB0aGlzIGlzIGRvbmUgYWZ0ZXIgdGhlbiBvbmUgZ2V0cyBtdWx0aXBsZSBQTCBkb25lIGludGVycnVwdHMuCisJCSAqLworCQlsY2RfZGlzYWJsZV9yYXN0ZXIoKTsKKworCQlsY2RjX3dyaXRlKHN0YXQsIExDRF9NQVNLRURfU1RBVF9SRUcpOworCisJCS8qIERpc2FibGUgUEwgY29tcGxldGlvbiBpbmVycnVwdCAqLworCQlyZWdfaW50ID0gbGNkY19yZWFkKExDRF9JTlRfRU5BQkxFX0NMUl9SRUcpIHwKKwkJICAgICAgIChMQ0RfVjJfUExfSU5UX0VOQSk7CisJCWxjZGNfd3JpdGUocmVnX2ludCwgTENEX0lOVF9FTkFCTEVfQ0xSX1JFRyk7CisKKwkJLyogU2V0dXAgYW5kIHN0YXJ0IGRhdGEgbG9hZGluZyBtb2RlICovCisJCWxjZF9ibGl0KExPQURfREFUQSwgcGFyKTsKKwl9IGVsc2UgeworCQlsY2RjX3dyaXRlKHN0YXQsIExDRF9NQVNLRURfU1RBVF9SRUcpOworCisJCWlmIChzdGF0ICYgTENEX0VORF9PRl9GUkFNRTApIHsKKwkJCWxjZGNfd3JpdGUocGFyLT5kbWFfc3RhcnQsCisJCQkJICAgTENEX0RNQV9GUk1fQlVGX0JBU0VfQUREUl8wX1JFRyk7CisJCQlsY2RjX3dyaXRlKHBhci0+ZG1hX2VuZCwKKwkJCQkgICBMQ0RfRE1BX0ZSTV9CVUZfQ0VJTElOR19BRERSXzBfUkVHKTsKKwkJCXBhci0+dnN5bmNfZmxhZyA9IDE7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBhci0+dnN5bmNfd2FpdCk7CisJCX0KKworCQlpZiAoc3RhdCAmIExDRF9FTkRfT0ZfRlJBTUUxKSB7CisJCQlsY2RjX3dyaXRlKHBhci0+ZG1hX3N0YXJ0LAorCQkJCSAgIExDRF9ETUFfRlJNX0JVRl9CQVNFX0FERFJfMV9SRUcpOworCQkJbGNkY193cml0ZShwYXItPmRtYV9lbmQsCisJCQkJICAgTENEX0RNQV9GUk1fQlVGX0NFSUxJTkdfQUREUl8xX1JFRyk7CisJCQlwYXItPnZzeW5jX2ZsYWcgPSAxOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwYXItPnZzeW5jX3dhaXQpOworCQl9CisJfQorCisJbGNkY193cml0ZSgwLCBMQ0RfRU5EX09GX0lOVF9JTkRfUkVHKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIElSUSBoYW5kbGVyIGZvciB2ZXJzaW9uIDEgTENEQyAqLworc3RhdGljIGlycXJldHVybl90IGxjZGNfaXJxX2hhbmRsZXJfcmV2MDEoaW50IGlycSwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBkYTh4eF9mYl9wYXIgKnBhciA9IGFyZzsKIAl1MzIgc3RhdCA9IGxjZGNfcmVhZChMQ0RfU1RBVF9SRUcpOwpAQCAtNjA2LDcgKzc0Miw3IEBACiAKIAkJLyogRGlzYWJsZSBQTCBjb21wbGV0aW9uIGluZXJydXB0ICovCiAJCXJlZ19yYXMgID0gbGNkY19yZWFkKExDRF9SQVNURVJfQ1RSTF9SRUcpOwotCQlyZWdfcmFzICY9IH5MQ0RfUExfRU5BQkxFOworCQlyZWdfcmFzICY9IH5MQ0RfVjFfUExfSU5UX0VOQTsKIAkJbGNkY193cml0ZShyZWdfcmFzLCBMQ0RfUkFTVEVSX0NUUkxfUkVHKTsKIAogCQkvKiBTZXR1cCBhbmQgc3RhcnQgZGF0YSBsb2FkaW5nIG1vZGUgKi8KQEAgLTg3Nyw4ICsxMDEzLDggQEAKIAogCQkJc3RhcnQJPSBmaXgtPnNtZW1fc3RhcnQgKwogCQkJCW5ld192YXIueW9mZnNldCAqIGZpeC0+bGluZV9sZW5ndGggKwotCQkJCW5ld192YXIueG9mZnNldCAqIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OwotCQkJZW5kCT0gc3RhcnQgKyB2YXItPnlyZXMgKiBmaXgtPmxpbmVfbGVuZ3RoIC0gMTsKKwkJCQluZXdfdmFyLnhvZmZzZXQgKiBmYmktPnZhci5iaXRzX3Blcl9waXhlbCAvIDg7CisJCQllbmQJPSBzdGFydCArIGZiaS0+dmFyLnlyZXMgKiBmaXgtPmxpbmVfbGVuZ3RoIC0gMTsKIAkJCXBhci0+ZG1hX3N0YXJ0CT0gc3RhcnQ7CiAJCQlwYXItPmRtYV9lbmQJPSBlbmQ7CiAJCX0KQEAgLTk0NSw2ICsxMDgxLDIyIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfY2xrX3B1dDsKIAorCS8qIERldGVybWluZSBMQ0QgSVAgVmVyc2lvbiAqLworCXN3aXRjaCAobGNkY19yZWFkKExDRF9QSURfUkVHKSkgeworCWNhc2UgMHg0QzEwMDEwMjoKKwkJbGNkX3JldmlzaW9uID0gTENEX1ZFUlNJT05fMTsKKwkJYnJlYWs7CisJY2FzZSAweDRGMjAwODAwOgorCQlsY2RfcmV2aXNpb24gPSBMQ0RfVkVSU0lPTl8yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmZGV2aWNlLT5kZXYsICJVbmtub3duIFBJRCBSZWcgdmFsdWUgMHgleCwgIgorCQkJCSJkZWZhdWx0aW5nIHRvIExDRCByZXZpc2lvbiAxXG4iLAorCQkJCWxjZGNfcmVhZChMQ0RfUElEX1JFRykpOworCQlsY2RfcmV2aXNpb24gPSBMQ0RfVkVSU0lPTl8xOworCQlicmVhazsKKwl9CisKIAlmb3IgKGkgPSAwLCBsY2RjX2luZm8gPSBrbm93bl9sY2RfcGFuZWxzOwogCQlpIDwgQVJSQVlfU0laRShrbm93bl9sY2RfcGFuZWxzKTsKIAkJaSsrLCBsY2RjX2luZm8rKykgewpAQCAtMTA4NSw3ICsxMjM3LDEzIEBACiAJfQogI2VuZGlmCiAKLQlyZXQgPSByZXF1ZXN0X2lycShwYXItPmlycSwgbGNkY19pcnFfaGFuZGxlciwgMCwgRFJJVkVSX05BTUUsIHBhcik7CisJaWYgKGxjZF9yZXZpc2lvbiA9PSBMQ0RfVkVSU0lPTl8xKQorCQlsY2RjX2lycV9oYW5kbGVyID0gbGNkY19pcnFfaGFuZGxlcl9yZXYwMTsKKwllbHNlCisJCWxjZGNfaXJxX2hhbmRsZXIgPSBsY2RjX2lycV9oYW5kbGVyX3JldjAyOworCisJcmV0ID0gcmVxdWVzdF9pcnEocGFyLT5pcnEsIGxjZGNfaXJxX2hhbmRsZXIsIDAsCisJCQlEUklWRVJfTkFNRSwgcGFyKTsKIAlpZiAocmV0KQogCQlnb3RvIGlycV9mcmVxOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9lcDkzeHgtZmIuYyBiL2RyaXZlcnMvdmlkZW8vZXA5M3h4LWZiLmMKaW5kZXggNDBlNWYxNy4uMmU4MzBlYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZXA5M3h4LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9lcDkzeHgtZmIuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmItcHV2My5jIGIvZHJpdmVycy92aWRlby9mYi1wdXYzLmMKaW5kZXggMjdmMmM1Ny4uNjBhNzg3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYi1wdXYzLmMKKysrIGIvZHJpdmVycy92aWRlby9mYi1wdXYzLmMKQEAgLTYyNCw4ICs2MjQsOCBAQAogCQkgICAgfHwgdmFyLT54b2Zmc2V0KQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKLQkJaWYgKHZhci0+eG9mZnNldCArIHZhci0+eHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgfHwKLQkJICAgIHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCisJCWlmICh2YXItPnhvZmZzZXQgKyBpbmZvLT52YXIueHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgfHwKKwkJICAgIHZhci0+eW9mZnNldCArIGluZm8tPnZhci55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpbmZvLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJfZGRjLmMgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RkYy5jCmluZGV4IDRhODc0YzguLjJiMTA2ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJfZGRjLmMKKysrIGIvZHJpdmVycy92aWRlby9mYl9kZGMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBkcml2ZXIvdmlkZS9mYl9kZGMuYyAtIEREQy9FRElEIHJlYWQgc3VwcG9ydC4KKyAqIGRyaXZlcnMvdmlkZW8vZmJfZGRjLmMgLSBEREMvRURJRCByZWFkIHN1cHBvcnQuCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNiBEZW5uaXMgTXVuc2llIDxkbXVuc2llQGNlY3JvcGlhLmNvbT4KICAqCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYl9kZWZpby5jIGIvZHJpdmVycy92aWRlby9mYl9kZWZpby5jCmluZGV4IDMyODE0ZTguLmMyN2UxNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJfZGVmaW8uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RlZmlvLmMKQEAgLTIyMyw4ICsyMjMsNyBAQAogCWludCBpOwogCiAJQlVHX09OKCFmYmRlZmlvKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZpbmZvLT5kZWZlcnJlZF93b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaW5mby0+ZGVmZXJyZWRfd29yayk7CiAKIAkvKiBjbGVhciBvdXQgdGhlIG1hcHBpbmcgdGhhdCB3ZSBzZXR1cCAqLwogCWZvciAoaSA9IDAgOyBpIDwgaW5mby0+Zml4LnNtZW1fbGVuOyBpICs9IFBBR0VfU0laRSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYl9ub3RpZnkuYyBiL2RyaXZlcnMvdmlkZW8vZmJfbm90aWZ5LmMKaW5kZXggOGMwMjAzOC4uNzRjMmRhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYl9ub3RpZnkuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZiX25vdGlmeS5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBCTE9DS0lOR19OT1RJRklFUl9IRUFEKGZiX25vdGlmaWVyX2xpc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKaW5kZXggNWFhYzAwZS4uYWQ5MzYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwpAQCAtMTczOCw4ICsxNzM4LDYgQEAKIHsKIAlzdHJ1Y3QgZmJfZXZlbnQgZXZlbnQ7CiAKLQlpZiAoIWxvY2tfZmJfaW5mbyhpbmZvKSkKLQkJcmV0dXJuOwogCWV2ZW50LmluZm8gPSBpbmZvOwogCWlmIChzdGF0ZSkgewogCQlmYl9ub3RpZmllcl9jYWxsX2NoYWluKEZCX0VWRU5UX1NVU1BFTkQsICZldmVudCk7CkBAIC0xNzQ4LDcgKzE3NDYsNiBAQAogCQlpbmZvLT5zdGF0ZSA9IEZCSU5GT19TVEFURV9SVU5OSU5HOwogCQlmYl9ub3RpZmllcl9jYWxsX2NoYWluKEZCX0VWRU5UX1JFU1VNRSwgJmV2ZW50KTsKIAl9Ci0JdW5sb2NrX2ZiX2luZm8oaW5mbyk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1vbi5jIGIvZHJpdmVycy92aWRlby9mYm1vbi5jCmluZGV4IDRmNTc0ODUuLmNlZjY1NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibW9uLmMKQEAgLTQ5Myw3ICs0OTMsOCBAQAogCXJldHVybiBudW07CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3N0ZF90aW1pbmcodW5zaWduZWQgY2hhciAqYmxvY2ssIHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUpCitzdGF0aWMgaW50IGdldF9zdGRfdGltaW5nKHVuc2lnbmVkIGNoYXIgKmJsb2NrLCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlLAorCQlpbnQgdmVyLCBpbnQgcmV2KQogewogCWludCB4cmVzLCB5cmVzID0gMCwgcmVmcmVzaCwgcmF0aW8sIGk7CiAKQEAgLTUwNCw3ICs1MDUsMTEgQEAKIAlyYXRpbyA9IChibG9ja1sxXSAmIDB4YzApID4+IDY7CiAJc3dpdGNoIChyYXRpbykgewogCWNhc2UgMDoKLQkJeXJlcyA9IHhyZXM7CisJCS8qIGluIEVESUQgMS4zIHRoZSBtZWFuaW5nIG9mIDAgY2hhbmdlZCB0byAxNjoxMCAocHJpb3IgMToxKSAqLworCQlpZiAodmVyIDwgMSB8fCAodmVyID09IDEgJiYgcmV2IDwgMykpCisJCQl5cmVzID0geHJlczsKKwkJZWxzZQorCQkJeXJlcyA9ICh4cmVzICogMTApLzE2OwogCQlicmVhazsKIAljYXNlIDE6CiAJCXlyZXMgPSAoeHJlcyAqIDMpLzQ7CkBAIC01MzMsMTIgKzUzOCwxMiBAQAogfQogCiBzdGF0aWMgaW50IGdldF9kc3RfdGltaW5nKHVuc2lnbmVkIGNoYXIgKmJsb2NrLAotCQkJICBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlKQorCQkJICBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlLCBpbnQgdmVyLCBpbnQgcmV2KQogewogCWludCBqLCBudW0gPSAwOwogCiAJZm9yIChqID0gMDsgaiA8IDY7IGorKywgYmxvY2sgKz0gU1REX1RJTUlOR19ERVNDUklQVElPTl9TSVpFKQotCQludW0gKz0gZ2V0X3N0ZF90aW1pbmcoYmxvY2ssICZtb2RlW251bV0pOworCQludW0gKz0gZ2V0X3N0ZF90aW1pbmcoYmxvY2ssICZtb2RlW251bV0sIHZlciwgcmV2KTsKIAogCXJldHVybiBudW07CiB9CkBAIC01OTksNiArNjA0LDEwIEBACiAJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSwgKm07CiAJdW5zaWduZWQgY2hhciAqYmxvY2s7CiAJaW50IG51bSA9IDAsIGksIGZpcnN0ID0gMTsKKwlpbnQgdmVyLCByZXY7CisKKwl2ZXIgPSBlZGlkW0VESURfU1RSVUNUX1ZFUlNJT05dOworCXJldiA9IGVkaWRbRURJRF9TVFJVQ1RfUkVWSVNJT05dOwogCiAJbW9kZSA9IGt6YWxsb2MoNTAgKiBzaXplb2Yoc3RydWN0IGZiX3ZpZGVvbW9kZSksIEdGUF9LRVJORUwpOwogCWlmIChtb2RlID09IE5VTEwpCkBAIC02MzIsMTIgKzY0MSwxMiBAQAogCURQUklOVEsoIiAgIFN0YW5kYXJkIFRpbWluZ3NcbiIpOwogCWJsb2NrID0gZWRpZCArIFNURF9USU1JTkdfREVTQ1JJUFRJT05TX1NUQVJUOwogCWZvciAoaSA9IDA7IGkgPCBTVERfVElNSU5HOyBpKyssIGJsb2NrICs9IFNURF9USU1JTkdfREVTQ1JJUFRJT05fU0laRSkKLQkJbnVtICs9IGdldF9zdGRfdGltaW5nKGJsb2NrLCAmbW9kZVtudW1dKTsKKwkJbnVtICs9IGdldF9zdGRfdGltaW5nKGJsb2NrLCAmbW9kZVtudW1dLCB2ZXIsIHJldik7CiAKIAlibG9jayA9IGVkaWQgKyBERVRBSUxFRF9USU1JTkdfREVTQ1JJUFRJT05TX1NUQVJUOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGJsb2NrKz0gREVUQUlMRURfVElNSU5HX0RFU0NSSVBUSU9OX1NJWkUpIHsKIAkJaWYgKGJsb2NrWzBdID09IDB4MDAgJiYgYmxvY2tbMV0gPT0gMHgwMCAmJiBibG9ja1szXSA9PSAweGZhKQotCQkJbnVtICs9IGdldF9kc3RfdGltaW5nKGJsb2NrICsgNSwgJm1vZGVbbnVtXSk7CisJCQludW0gKz0gZ2V0X2RzdF90aW1pbmcoYmxvY2sgKyA1LCAmbW9kZVtudW1dLCB2ZXIsIHJldik7CiAJfQogCiAJLyogWWlrZXMsIEVESUQgZGF0YSBpcyB0b3RhbGx5IHVzZWxlc3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKaW5kZXggMDQyNTFjZS4uNjdhZmE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKKysrIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKQEAgLTM5OSw5ICszOTksMTIgQEAKIAogCXN0YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmbGFzdCwgMCk7CiAKKwlpZiAoIWxvY2tfZmJfaW5mbyhmYl9pbmZvKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAJY29uc29sZV9sb2NrKCk7CiAJZmJfc2V0X3N1c3BlbmQoZmJfaW5mbywgKGludClzdGF0ZSk7CiAJY29uc29sZV91bmxvY2soKTsKKwl1bmxvY2tfZmJfaW5mbyhmYl9pbmZvKTsKIAogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jIGIvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKaW5kZXggMGFjYzdkNi4uYTE2YmVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKQEAgLTMwLDM3ICszMCw0MCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbC1kaXUtZmIuaD4KICNpbmNsdWRlICJlZGlkLmgiCiAKLS8qCi0gKiBUaGVzZSBwYXJhbWV0ZXJzIGdpdmUgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gKiBmb3IgdmlkZW8gb3V0cHV0IDEwMjR4NzY4LAotICogRklYTUUgLSBjaGFuZ2UgdGltaW5nIHRvIHByb3BlciBhbW91bnRzCi0gKiBoc3luYyAzMS41a0h6LCB2c3luYyA2MEh6Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIF9fZGV2aW5pdGRhdGEgZnNsX2RpdV9kZWZhdWx0X21vZGUgPSB7Ci0JLnJlZnJlc2gJPSA2MCwKLQkueHJlcwkJPSAxMDI0LAotCS55cmVzCQk9IDc2OCwKLQkucGl4Y2xvY2sJPSAxNTM4NSwKLQkubGVmdF9tYXJnaW4JPSAxNjAsCi0JLnJpZ2h0X21hcmdpbgk9IDI0LAotCS51cHBlcl9tYXJnaW4JPSAyOSwKLQkubG93ZXJfbWFyZ2luCT0gMywKLQkuaHN5bmNfbGVuCT0gMTM2LAotCS52c3luY19sZW4JPSA2LAotCS5zeW5jCQk9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKLQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorI2RlZmluZSBGU0xfQU9JX05VTQk2CS8qIDUgQU9JcyBhbmQgb25lIGR1bW15IEFPSSAqLworCQkJCS8qIDEgZm9yIHBsYW5lIDAsIDIgZm9yIHBsYW5lIDEmMiBlYWNoICovCisKKy8qIEhXIGN1cnNvciBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1BWF9DVVJTCQkzMgorCisvKiBJTlRfU1RBVFVTL0lOVF9NQVNLIGZpZWxkIGRlc2NyaXB0aW9ucyAqLworI2RlZmluZSBJTlRfVlNZTkMJMHgwMQkvKiBWc3luYyBpbnRlcnJ1cHQgICovCisjZGVmaW5lIElOVF9WU1lOQ19XQgkweDAyCS8qIFZzeW5jIGludGVycnVwdCBmb3Igd3JpdGUgYmFjayBvcGVyYXRpb24gKi8KKyNkZWZpbmUgSU5UX1VORFJVTgkweDA0CS8qIFVuZGVyIHJ1biBleGNlcHRpb24gaW50ZXJydXB0ICovCisjZGVmaW5lIElOVF9QQVJFUlIJMHgwOAkvKiBEaXNwbGF5IHBhcmFtZXRlcnMgZXJyb3IgaW50ZXJydXB0ICovCisjZGVmaW5lIElOVF9MU19CRl9WUwkweDEwCS8qIExpbmVzIGJlZm9yZSB2c3luYy4gaW50ZXJydXB0ICovCisKK3N0cnVjdCBkaXVfYWRkciB7CisJdm9pZCAqdmFkZHI7CQkvKiBWaXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IHBhZGRyOwkvKiBQaHlzaWNhbCBhZGRyZXNzICovCisJX191MzIgb2Zmc2V0OwogfTsKIAorLyoKKyAqIExpc3Qgb2Ygc3VwcG9ydGVkIHZpZGVvIG1vZGVzCisgKgorICogVGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBkZWZhdWx0IHZpZGVvIG1vZGUuICBUaGUgcmVtYWluIGVudHJpZXMgYXJlIGluCisgKiBvcmRlciBpZiBpbmNyZWFzaW5nIHJlc29sdXRpb24gYW5kIGZyZXF1ZW5jeS4gIFRoZSAzMjB4MjQwLTYwIG1vZGUgaXMKKyAqIHRoZSBpbml0aWFsIEFPSSBmb3IgdGhlIHNlY29uZCBhbmQgdGhpcmQgcGxhbmVzLgorICovCiBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBfX2RldmluaXRkYXRhIGZzbF9kaXVfbW9kZV9kYltdID0gewogCXsKLQkJLm5hbWUJCT0gIjEwMjR4NzY4LTYwIiwKIAkJLnJlZnJlc2gJPSA2MCwKIAkJLnhyZXMJCT0gMTAyNCwKIAkJLnlyZXMJCT0gNzY4LApAQCAtNzUsNyArNzgsMTMyIEBACiAJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECiAJfSwKIAl7Ci0JCS5uYW1lCQk9ICIxMDI0eDc2OC03MCIsCisJCS5yZWZyZXNoCT0gNjAsCisJCS54cmVzCQk9IDMyMCwKKwkJLnlyZXMJCT0gMjQwLAorCQkucGl4Y2xvY2sJPSA3OTQ0MCwKKwkJLmxlZnRfbWFyZ2luCT0gMTYsCisJCS5yaWdodF9tYXJnaW4JPSAxNiwKKwkJLnVwcGVyX21hcmdpbgk9IDE2LAorCQkubG93ZXJfbWFyZ2luCT0gNSwKKwkJLmhzeW5jX2xlbgk9IDQ4LAorCQkudnN5bmNfbGVuCT0gMSwKKwkJLnN5bmMJCT0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA2MCwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDM5NzIyLAorCQkubGVmdF9tYXJnaW4gICAgPSA0OCwKKwkJLnJpZ2h0X21hcmdpbiAgID0gMTYsCisJCS51cHBlcl9tYXJnaW4gICA9IDMzLAorCQkubG93ZXJfbWFyZ2luICAgPSAxMCwKKwkJLmhzeW5jX2xlbiAgICAgID0gOTYsCisJCS52c3luY19sZW4gICAgICA9IDIsCisJCS5zeW5jICAgICAgICAgICA9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA3MiwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDMyMDUyLAorCQkubGVmdF9tYXJnaW4gICAgPSAxMjgsCisJCS5yaWdodF9tYXJnaW4gICA9IDI0LAorCQkudXBwZXJfbWFyZ2luICAgPSAyOCwKKwkJLmxvd2VyX21hcmdpbiAgID0gOSwKKwkJLmhzeW5jX2xlbiAgICAgID0gNDAsCisJCS52c3luY19sZW4gICAgICA9IDMsCisJCS5zeW5jICAgICAgICAgICA9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA3NSwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDMxNzQ3LAorCQkubGVmdF9tYXJnaW4gICAgPSAxMjAsCisJCS5yaWdodF9tYXJnaW4gICA9IDE2LAorCQkudXBwZXJfbWFyZ2luICAgPSAxNiwKKwkJLmxvd2VyX21hcmdpbiAgID0gMSwKKwkJLmhzeW5jX2xlbiAgICAgID0gNjQsCisJCS52c3luY19sZW4gICAgICA9IDMsCisJCS5zeW5jICAgICAgICAgICA9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA5MCwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDI1MDU3LAorCQkubGVmdF9tYXJnaW4gICAgPSAxMjAsCisJCS5yaWdodF9tYXJnaW4gICA9IDMyLAorCQkudXBwZXJfbWFyZ2luICAgPSAxNCwKKwkJLmxvd2VyX21hcmdpbiAgID0gMjUsCisJCS5oc3luY19sZW4gICAgICA9IDQwLAorCQkudnN5bmNfbGVuICAgICAgPSAxNCwKKwkJLnN5bmMgICAgICAgICAgID0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQkudm1vZGUgICAgICAgICAgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJfSwKKwl7CisJCS5yZWZyZXNoICAgICAgICA9IDEwMCwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDIyMjcyLAorCQkubGVmdF9tYXJnaW4gICAgPSA0OCwKKwkJLnJpZ2h0X21hcmdpbiAgID0gMzIsCisJCS51cHBlcl9tYXJnaW4gICA9IDE3LAorCQkubG93ZXJfbWFyZ2luICAgPSAyMiwKKwkJLmhzeW5jX2xlbiAgICAgID0gMTI4LAorCQkudnN5bmNfbGVuICAgICAgPSAxMiwKKwkJLnN5bmMgICAgICAgICAgID0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQkudm1vZGUgICAgICAgICAgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJfSwKKwl7CisJCS5yZWZyZXNoCT0gNjAsCisJCS54cmVzCQk9IDgwMCwKKwkJLnlyZXMJCT0gNDgwLAorCQkucGl4Y2xvY2sJPSAzMzgwNSwKKwkJLmxlZnRfbWFyZ2luCT0gOTYsCisJCS5yaWdodF9tYXJnaW4JPSAyNCwKKwkJLnVwcGVyX21hcmdpbgk9IDEwLAorCQkubG93ZXJfbWFyZ2luCT0gMywKKwkJLmhzeW5jX2xlbgk9IDcyLAorCQkudnN5bmNfbGVuCT0gNywKKwkJLnN5bmMJCT0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA2MCwKKwkJLnhyZXMgICAgICAgICAgID0gODAwLAorCQkueXJlcyAgICAgICAgICAgPSA2MDAsCisJCS5waXhjbG9jayAgICAgICA9IDI1MDAwLAorCQkubGVmdF9tYXJnaW4gICAgPSA4OCwKKwkJLnJpZ2h0X21hcmdpbiAgID0gNDAsCisJCS51cHBlcl9tYXJnaW4gICA9IDIzLAorCQkubG93ZXJfbWFyZ2luICAgPSAxLAorCQkuaHN5bmNfbGVuICAgICAgPSAxMjgsCisJCS52c3luY19sZW4gICAgICA9IDQsCisJCS5zeW5jICAgICAgICAgICA9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaAk9IDYwLAorCQkueHJlcwkJPSA4NTQsCisJCS55cmVzCQk9IDQ4MCwKKwkJLnBpeGNsb2NrCT0gMzE1MTgsCisJCS5sZWZ0X21hcmdpbgk9IDEwNCwKKwkJLnJpZ2h0X21hcmdpbgk9IDE2LAorCQkudXBwZXJfbWFyZ2luCT0gMTMsCisJCS5sb3dlcl9tYXJnaW4JPSAxLAorCQkuaHN5bmNfbGVuCT0gODgsCisJCS52c3luY19sZW4JPSAzLAorCQkuc3luYwkJPSBGQl9TWU5DX0NPTVBfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJfSwKKwl7CiAJCS5yZWZyZXNoCT0gNzAsCiAJCS54cmVzCQk9IDEwMjQsCiAJCS55cmVzCQk9IDc2OCwKQEAgLTkwLDcgKzIxOCw2IEBACiAJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECiAJfSwKIAl7Ci0JCS5uYW1lCQk9ICIxMDI0eDc2OC03NSIsCiAJCS5yZWZyZXNoCT0gNzUsCiAJCS54cmVzCQk9IDEwMjQsCiAJCS55cmVzCQk9IDc2OCwKQEAgLTEwNSw3ICsyMzIsMzQgQEAKIAkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKIAl9LAogCXsKLQkJLm5hbWUJCT0gIjEyODB4MTAyNC02MCIsCisJCS5yZWZyZXNoCT0gNjAsCisJCS54cmVzCQk9IDEyODAsCisJCS55cmVzCQk9IDQ4MCwKKwkJLnBpeGNsb2NrCT0gMTg5MzksCisJCS5sZWZ0X21hcmdpbgk9IDM1MywKKwkJLnJpZ2h0X21hcmdpbgk9IDQ3LAorCQkudXBwZXJfbWFyZ2luCT0gMzksCisJCS5sb3dlcl9tYXJnaW4JPSA0LAorCQkuaHN5bmNfbGVuCT0gOCwKKwkJLnZzeW5jX2xlbgk9IDIsCisJCS5zeW5jCQk9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwl9LAorCXsKKwkJLnJlZnJlc2gJPSA2MCwKKwkJLnhyZXMJCT0gMTI4MCwKKwkJLnlyZXMJCT0gNzIwLAorCQkucGl4Y2xvY2sJPSAxMzQyNiwKKwkJLmxlZnRfbWFyZ2luCT0gMTkyLAorCQkucmlnaHRfbWFyZ2luCT0gNjQsCisJCS51cHBlcl9tYXJnaW4JPSAyMiwKKwkJLmxvd2VyX21hcmdpbgk9IDEsCisJCS5oc3luY19sZW4JPSAxMzYsCisJCS52c3luY19sZW4JPSAzLAorCQkuc3luYwkJPSBGQl9TWU5DX0NPTVBfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJfSwKKwl7CiAJCS5yZWZyZXNoCT0gNjAsCiAJCS54cmVzCQk9IDEyODAsCiAJCS55cmVzCQk9IDEwMjQsCkBAIC0xMjAsNyArMjc0LDYgQEAKIAkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKIAl9LAogCXsKLQkJLm5hbWUJCT0gIjEyODB4MTAyNC03MCIsCiAJCS5yZWZyZXNoCT0gNzAsCiAJCS54cmVzCQk9IDEyODAsCiAJCS55cmVzCQk9IDEwMjQsCkBAIC0xMzUsNyArMjg4LDYgQEAKIAkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKIAl9LAogCXsKLQkJLm5hbWUJCT0gIjEyODB4MTAyNC03NSIsCiAJCS5yZWZyZXNoCT0gNzUsCiAJCS54cmVzCQk9IDEyODAsCiAJCS55cmVzCQk9IDEwMjQsCkBAIC0xNTAsNDAgKzMwMiwyNSBAQAogCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAogCX0sCiAJewotCQkubmFtZQkJPSAiMzIweDI0MCIsCQkvKiBmb3IgQU9JIG9ubHkgKi8KIAkJLnJlZnJlc2gJPSA2MCwKLQkJLnhyZXMJCT0gMzIwLAotCQkueXJlcwkJPSAyNDAsCi0JCS5waXhjbG9jawk9IDE1Mzg1LAotCQkubGVmdF9tYXJnaW4JPSAwLAotCQkucmlnaHRfbWFyZ2luCT0gMCwKLQkJLnVwcGVyX21hcmdpbgk9IDAsCi0JCS5sb3dlcl9tYXJnaW4JPSAwLAotCQkuaHN5bmNfbGVuCT0gMCwKLQkJLnZzeW5jX2xlbgk9IDAsCi0JCS5zeW5jCQk9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKLQkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLQl9LAotCXsKLQkJLm5hbWUJCT0gIjEyODB4NDgwLTYwIiwKLQkJLnJlZnJlc2gJPSA2MCwKLQkJLnhyZXMJCT0gMTI4MCwKLQkJLnlyZXMJCT0gNDgwLAotCQkucGl4Y2xvY2sJPSAxODkzOSwKLQkJLmxlZnRfbWFyZ2luCT0gMzUzLAotCQkucmlnaHRfbWFyZ2luCT0gNDcsCi0JCS51cHBlcl9tYXJnaW4JPSAzOSwKLQkJLmxvd2VyX21hcmdpbgk9IDQsCi0JCS5oc3luY19sZW4JPSA4LAotCQkudnN5bmNfbGVuCT0gMiwKKwkJLnhyZXMJCT0gMTkyMCwKKwkJLnlyZXMJCT0gMTA4MCwKKwkJLnBpeGNsb2NrCT0gNTc4NywKKwkJLmxlZnRfbWFyZ2luCT0gMzI4LAorCQkucmlnaHRfbWFyZ2luCT0gMTIwLAorCQkudXBwZXJfbWFyZ2luCT0gMzQsCisJCS5sb3dlcl9tYXJnaW4JPSAxLAorCQkuaHN5bmNfbGVuCT0gMjA4LAorCQkudnN5bmNfbGVuCT0gMywKIAkJLnN5bmMJCT0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAogCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAogCX0sCiB9OwogCi1zdGF0aWMgY2hhciAqZmJfbW9kZSA9ICIxMDI0eDc2OC0zMkA2MCI7CitzdGF0aWMgY2hhciAqZmJfbW9kZTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRfYnBwID0gMzI7Ci1zdGF0aWMgaW50IG1vbml0b3JfcG9ydDsKK3N0YXRpYyBlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IG1vbml0b3JfcG9ydDsKK3N0YXRpYyBjaGFyICptb25pdG9yX3N0cmluZzsKIAogI2lmIGRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKIHN0YXRpYyB1OCAqY29oZXJlbmNlX2RhdGE7CkBAIC0yMDEsMTUgKzMzOCwyNyBAQAogCXZvaWQgKmR1bW15X2FvaV92aXJ0OwogCXVuc2lnbmVkIGludCBpcnE7CiAJaW50IGZiX2VuYWJsZWQ7Ci0JaW50IG1vbml0b3JfcG9ydDsKKwllbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IG1vbml0b3JfcG9ydDsKKwlzdHJ1Y3QgZGl1IF9faW9tZW0gKmRpdV9yZWc7CisJc3BpbmxvY2tfdCByZWdfbG9jazsKKwlzdHJ1Y3QgZGl1X2FkZHIgYWQ7CisJc3RydWN0IGRpdV9hZGRyIGdhbW1hOworCXN0cnVjdCBkaXVfYWRkciBwYWxsZXRlOworCXN0cnVjdCBkaXVfYWRkciBjdXJzb3I7Cit9OworCitlbnVtIG1mYl9pbmRleCB7CisJUExBTkUwID0gMCwJLyogUGxhbmUgMCwgb25seSBvbmUgQU9JIHRoYXQgZmlsbHMgdGhlIHNjcmVlbiAqLworCVBMQU5FMV9BT0kwLAkvKiBQbGFuZSAxLCBmaXJzdCBBT0kgKi8KKwlQTEFORTFfQU9JMSwJLyogUGxhbmUgMSwgc2Vjb25kIEFPSSAqLworCVBMQU5FMl9BT0kwLAkvKiBQbGFuZSAyLCBmaXJzdCBBT0kgKi8KKwlQTEFORTJfQU9JMSwJLyogUGxhbmUgMiwgc2Vjb25kIEFPSSAqLwogfTsKIAogc3RydWN0IG1mYl9pbmZvIHsKLQlpbnQgaW5kZXg7Ci0JaW50IHR5cGU7CisJZW51bSBtZmJfaW5kZXggaW5kZXg7CiAJY2hhciAqaWQ7CiAJaW50IHJlZ2lzdGVyZWQ7Ci0JaW50IGJsYW5rOwogCXVuc2lnbmVkIGxvbmcgcHNldWRvX3BhbGV0dGVbMTZdOwogCXN0cnVjdCBkaXVfYWQgKmFkOwogCWludCBjdXJzb3JfcmVzZXQ7CkBAIC0yMjMsNjMgKzM3Miw4MiBAQAogCiAKIHN0YXRpYyBzdHJ1Y3QgbWZiX2luZm8gbWZiX3RlbXBsYXRlW10gPSB7Ci0JewkJLyogQU9JIDAgZm9yIHBsYW5lIDAgKi8KLQkuaW5kZXggPSAwLAotCS50eXBlID0gTUZCX1RZUEVfT1VUUFVULAotCS5pZCA9ICJQYW5lbDAiLAotCS5yZWdpc3RlcmVkID0gMCwKLQkuY291bnQgPSAwLAotCS54X2FvaV9kID0gMCwKLQkueV9hb2lfZCA9IDAsCisJeworCQkuaW5kZXggPSBQTEFORTAsCisJCS5pZCA9ICJQYW5lbDAiLAorCQkucmVnaXN0ZXJlZCA9IDAsCisJCS5jb3VudCA9IDAsCisJCS54X2FvaV9kID0gMCwKKwkJLnlfYW9pX2QgPSAwLAogCX0sCi0JewkJLyogQU9JIDAgZm9yIHBsYW5lIDEgKi8KLQkuaW5kZXggPSAxLAotCS50eXBlID0gTUZCX1RZUEVfT1VUUFVULAotCS5pZCA9ICJQYW5lbDEgQU9JMCIsCi0JLnJlZ2lzdGVyZWQgPSAwLAotCS5nX2FscGhhID0gMHhmZiwKLQkuY291bnQgPSAwLAotCS54X2FvaV9kID0gMCwKLQkueV9hb2lfZCA9IDAsCisJeworCQkuaW5kZXggPSBQTEFORTFfQU9JMCwKKwkJLmlkID0gIlBhbmVsMSBBT0kwIiwKKwkJLnJlZ2lzdGVyZWQgPSAwLAorCQkuZ19hbHBoYSA9IDB4ZmYsCisJCS5jb3VudCA9IDAsCisJCS54X2FvaV9kID0gMCwKKwkJLnlfYW9pX2QgPSAwLAogCX0sCi0JewkJLyogQU9JIDEgZm9yIHBsYW5lIDEgKi8KLQkuaW5kZXggPSAyLAotCS50eXBlID0gTUZCX1RZUEVfT1VUUFVULAotCS5pZCA9ICJQYW5lbDEgQU9JMSIsCi0JLnJlZ2lzdGVyZWQgPSAwLAotCS5nX2FscGhhID0gMHhmZiwKLQkuY291bnQgPSAwLAotCS54X2FvaV9kID0gMCwKLQkueV9hb2lfZCA9IDQ4MCwKKwl7CisJCS5pbmRleCA9IFBMQU5FMV9BT0kxLAorCQkuaWQgPSAiUGFuZWwxIEFPSTEiLAorCQkucmVnaXN0ZXJlZCA9IDAsCisJCS5nX2FscGhhID0gMHhmZiwKKwkJLmNvdW50ID0gMCwKKwkJLnhfYW9pX2QgPSAwLAorCQkueV9hb2lfZCA9IDQ4MCwKIAl9LAotCXsJCS8qIEFPSSAwIGZvciBwbGFuZSAyICovCi0JLmluZGV4ID0gMywKLQkudHlwZSA9IE1GQl9UWVBFX09VVFBVVCwKLQkuaWQgPSAiUGFuZWwyIEFPSTAiLAotCS5yZWdpc3RlcmVkID0gMCwKLQkuZ19hbHBoYSA9IDB4ZmYsCi0JLmNvdW50ID0gMCwKLQkueF9hb2lfZCA9IDY0MCwKLQkueV9hb2lfZCA9IDAsCisJeworCQkuaW5kZXggPSBQTEFORTJfQU9JMCwKKwkJLmlkID0gIlBhbmVsMiBBT0kwIiwKKwkJLnJlZ2lzdGVyZWQgPSAwLAorCQkuZ19hbHBoYSA9IDB4ZmYsCisJCS5jb3VudCA9IDAsCisJCS54X2FvaV9kID0gNjQwLAorCQkueV9hb2lfZCA9IDAsCiAJfSwKLQl7CQkvKiBBT0kgMSBmb3IgcGxhbmUgMiAqLwotCS5pbmRleCA9IDQsCi0JLnR5cGUgPSBNRkJfVFlQRV9PVVRQVVQsCi0JLmlkID0gIlBhbmVsMiBBT0kxIiwKLQkucmVnaXN0ZXJlZCA9IDAsCi0JLmdfYWxwaGEgPSAweGZmLAotCS5jb3VudCA9IDAsCi0JLnhfYW9pX2QgPSA2NDAsCi0JLnlfYW9pX2QgPSA0ODAsCisJeworCQkuaW5kZXggPSBQTEFORTJfQU9JMSwKKwkJLmlkID0gIlBhbmVsMiBBT0kxIiwKKwkJLnJlZ2lzdGVyZWQgPSAwLAorCQkuZ19hbHBoYSA9IDB4ZmYsCisJCS5jb3VudCA9IDAsCisJCS54X2FvaV9kID0gNjQwLAorCQkueV9hb2lfZCA9IDQ4MCwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBkaXVfaHcgZHIgPSB7Ci0JLm1vZGUgPSBNRkJfTU9ERTEsCi0JLnJlZ19sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoZGl1X2h3LnJlZ19sb2NrKSwKLX07CisvKioKKyAqIGZzbF9kaXVfbmFtZV90b19wb3J0IC0gY29udmVydCBhIHBvcnQgbmFtZSB0byBhIG1vbml0b3IgcG9ydCBlbnVtCisgKgorICogVGFrZXMgdGhlIG5hbWUgb2YgYSBtb25pdG9yIHBvcnQgKCJkdmkiLCAibHZkcyIsIG9yICJkbHZkcyIpIGFuZCByZXR1cm5zCisgKiB0aGUgZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXQgc3RyaW5nLgorICoKKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMsIGEgbnVtYmVyICgiMCIsICIxIiwgb3IgIjIiKSBpcyBhbHNvCisgKiBzdXBwb3J0ZWQuCisgKgorICogSWYgdGhlIHN0cmluZyBpcyB1bmtub3duLCBEVkkgaXMgYXNzdW1lZC4KKyAqCisgKiBJZiB0aGUgcGFydGljdWxhciBwb3J0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLCBhbm90aGVyIHBvcnQKKyAqIChwbGF0Zm9ybS1zcGVjaWZpYykgaXMgY2hvc2VuIGluc3RlYWQuCisgKi8KK3N0YXRpYyBlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IGZzbF9kaXVfbmFtZV90b19wb3J0KGNvbnN0IGNoYXIgKnMpCit7CisJZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0ID0gRlNMX0RJVV9QT1JUX0RWSTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKIAotc3RhdGljIHN0cnVjdCBkaXVfcG9vbCBwb29sOworCWlmIChzKSB7CisJCWlmICghc3RyaWN0X3N0cnRvdWwocywgMTAsICZ2YWwpICYmICh2YWwgPD0gMikpCisJCQlwb3J0ID0gKGVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQpIHZhbDsKKwkJZWxzZSBpZiAoc3RybmNtcChzLCAibHZkcyIsIDQpID09IDApCisJCQlwb3J0ID0gRlNMX0RJVV9QT1JUX0xWRFM7CisJCWVsc2UgaWYgKHN0cm5jbXAocywgImRsdmRzIiwgNSkgPT0gMCkKKwkJCXBvcnQgPSBGU0xfRElVX1BPUlRfRExWRFM7CisJfQorCisJcmV0dXJuIGRpdV9vcHMudmFsaWRfbW9uaXRvcl9wb3J0KHBvcnQpOworfQogCiAvKioKICAqIGZzbF9kaXVfYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBESVUKQEAgLTI5MiwxNCArNDYwLDkgQEAKIHsKIAl2b2lkICp2aXJ0OwogCi0JcHJfZGVidWcoInNpemU9JXp1XG4iLCBzaXplKTsKLQogCXZpcnQgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBHRlBfRE1BIHwgX19HRlBfWkVSTyk7Ci0JaWYgKHZpcnQpIHsKKwlpZiAodmlydCkKIAkJKnBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7Ci0JCXByX2RlYnVnKCJ2aXJ0PSVwIHBoeXM9JWxseFxuIiwgdmlydCwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKnBoeXMpOwotCX0KIAogCXJldHVybiB2aXJ0OwogfQpAQCAtMzEzLDggKzQ3Niw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIGZzbF9kaXVfZnJlZSh2b2lkICp2aXJ0LCBzaXplX3Qgc2l6ZSkKIHsKLQlwcl9kZWJ1ZygidmlydD0lcCBzaXplPSV6dVxuIiwgdmlydCwgc2l6ZSk7Ci0KIAlpZiAodmlydCAmJiBzaXplKQogCQlmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpOwogfQpAQCAtMzMwLDgyICs0OTEsNzIgQEAKIAl9IHdoaWxlIChpbl9iZTMyKHJlZykgIT0gdmFsKTsKIH0KIAotc3RhdGljIGludCBmc2xfZGl1X2VuYWJsZV9wYW5lbChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyB2b2lkIGZzbF9kaXVfZW5hYmxlX3BhbmVsKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBtZmJfaW5mbyAqcG1mYmksICpjbWZiaSwgKm1mYmkgPSBpbmZvLT5wYXI7Ci0Jc3RydWN0IGRpdSAqaHcgPSBkci5kaXVfcmVnOwogCXN0cnVjdCBkaXVfYWQgKmFkID0gbWZiaS0+YWQ7CiAJc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhID0gbWZiaS0+cGFyZW50OwotCWludCByZXMgPSAwOwotCi0JcHJfZGVidWcoImVuYWJsZV9wYW5lbCBpbmRleCAlZFxuIiwgbWZiaS0+aW5kZXgpOwotCWlmIChtZmJpLT50eXBlICE9IE1GQl9UWVBFX09GRikgewotCQlzd2l0Y2ggKG1mYmktPmluZGV4KSB7Ci0JCWNhc2UgMDoJCQkJLyogcGxhbmUgMCAqLwotCQkJaWYgKGh3LT5kZXNjWzBdICE9IGFkLT5wYWRkcikKLQkJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzBdLCBhZC0+cGFkZHIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToJCQkJLyogcGxhbmUgMSBBT0kgMCAqLwotCQkJY21mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1syXS0+cGFyOwotCQkJaWYgKGh3LT5kZXNjWzFdICE9IGFkLT5wYWRkcikgewkvKiBBT0kwIGNsb3NlZCAqLwotCQkJCWlmIChjbWZiaS0+Y291bnQgPiAwKQkvKiBBT0kxIG9wZW4gKi8KLQkJCQkJYWQtPm5leHRfYWQgPQotCQkJCQkJY3B1X3RvX2xlMzIoY21mYmktPmFkLT5wYWRkcik7Ci0JCQkJZWxzZQotCQkJCQlhZC0+bmV4dF9hZCA9IDA7Ci0JCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgYWQtPnBhZGRyKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDM6CQkJCS8qIHBsYW5lIDIgQU9JIDAgKi8KLQkJCWNtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bNF0tPnBhcjsKLQkJCWlmIChody0+ZGVzY1syXSAhPSBhZC0+cGFkZHIpIHsJLyogQU9JMCBjbG9zZWQgKi8KLQkJCQlpZiAoY21mYmktPmNvdW50ID4gMCkJLyogQU9JMSBvcGVuICovCi0JCQkJCWFkLT5uZXh0X2FkID0KLQkJCQkJCWNwdV90b19sZTMyKGNtZmJpLT5hZC0+cGFkZHIpOwotCQkJCWVsc2UKLQkJCQkJYWQtPm5leHRfYWQgPSAwOwotCQkJCXdyX3JlZ193YSgmaHctPmRlc2NbMl0sIGFkLT5wYWRkcik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyOgkJCQkvKiBwbGFuZSAxIEFPSSAxICovCi0JCQlwbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzFdLT5wYXI7Ci0JCQlhZC0+bmV4dF9hZCA9IDA7Ci0JCQlpZiAoaHctPmRlc2NbMV0gPT0gbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpCi0JCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgYWQtPnBhZGRyKTsKLQkJCWVsc2UJCQkJCS8qIEFPSTAgb3BlbiAqLwotCQkJCXBtZmJpLT5hZC0+bmV4dF9hZCA9IGNwdV90b19sZTMyKGFkLT5wYWRkcik7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgkJCQkvKiBwbGFuZSAyIEFPSSAxICovCi0JCQlwbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzNdLT5wYXI7Ci0JCQlhZC0+bmV4dF9hZCA9IDA7Ci0JCQlpZiAoaHctPmRlc2NbMl0gPT0gbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpCi0JCQkJd3JfcmVnX3dhKCZody0+ZGVzY1syXSwgYWQtPnBhZGRyKTsKLQkJCWVsc2UJCQkJLyogQU9JMCB3YXMgb3BlbiAqLwotCQkJCXBtZmJpLT5hZC0+bmV4dF9hZCA9IGNwdV90b19sZTMyKGFkLT5wYWRkcik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJlcyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZQotCQlyZXMgPSAtRUlOVkFMOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgZnNsX2RpdV9kaXNhYmxlX3BhbmVsKHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBtZmJfaW5mbyAqcG1mYmksICpjbWZiaSwgKm1mYmkgPSBpbmZvLT5wYXI7Ci0Jc3RydWN0IGRpdSAqaHcgPSBkci5kaXVfcmVnOwotCXN0cnVjdCBkaXVfYWQgKmFkID0gbWZiaS0+YWQ7Ci0Jc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhID0gbWZiaS0+cGFyZW50OwotCWludCByZXMgPSAwOworCXN0cnVjdCBkaXUgX19pb21lbSAqaHcgPSBtYWNoaW5lX2RhdGEtPmRpdV9yZWc7CiAKIAlzd2l0Y2ggKG1mYmktPmluZGV4KSB7Ci0JY2FzZSAwOgkJCQkJLyogcGxhbmUgMCAqLworCWNhc2UgUExBTkUwOgorCQlpZiAoaHctPmRlc2NbMF0gIT0gYWQtPnBhZGRyKQorCQkJd3JfcmVnX3dhKCZody0+ZGVzY1swXSwgYWQtPnBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBQTEFORTFfQU9JMDoKKwkJY21mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1syXS0+cGFyOworCQlpZiAoaHctPmRlc2NbMV0gIT0gYWQtPnBhZGRyKSB7CS8qIEFPSTAgY2xvc2VkICovCisJCQlpZiAoY21mYmktPmNvdW50ID4gMCkJLyogQU9JMSBvcGVuICovCisJCQkJYWQtPm5leHRfYWQgPQorCQkJCQljcHVfdG9fbGUzMihjbWZiaS0+YWQtPnBhZGRyKTsKKwkJCWVsc2UKKwkJCQlhZC0+bmV4dF9hZCA9IDA7CisJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzFdLCBhZC0+cGFkZHIpOworCQl9CisJCWJyZWFrOworCWNhc2UgUExBTkUyX0FPSTA6CisJCWNtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bNF0tPnBhcjsKKwkJaWYgKGh3LT5kZXNjWzJdICE9IGFkLT5wYWRkcikgewkvKiBBT0kwIGNsb3NlZCAqLworCQkJaWYgKGNtZmJpLT5jb3VudCA+IDApCS8qIEFPSTEgb3BlbiAqLworCQkJCWFkLT5uZXh0X2FkID0KKwkJCQkJY3B1X3RvX2xlMzIoY21mYmktPmFkLT5wYWRkcik7CisJCQllbHNlCisJCQkJYWQtPm5leHRfYWQgPSAwOworCQkJd3JfcmVnX3dhKCZody0+ZGVzY1syXSwgYWQtPnBhZGRyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBMQU5FMV9BT0kxOgorCQlwbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzFdLT5wYXI7CisJCWFkLT5uZXh0X2FkID0gMDsKKwkJaWYgKGh3LT5kZXNjWzFdID09IG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKQorCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgYWQtPnBhZGRyKTsKKwkJZWxzZQkJCQkJLyogQU9JMCBvcGVuICovCisJCQlwbWZiaS0+YWQtPm5leHRfYWQgPSBjcHVfdG9fbGUzMihhZC0+cGFkZHIpOworCQlicmVhazsKKwljYXNlIFBMQU5FMl9BT0kxOgorCQlwbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzNdLT5wYXI7CisJCWFkLT5uZXh0X2FkID0gMDsKKwkJaWYgKGh3LT5kZXNjWzJdID09IG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKQorCQkJd3JfcmVnX3dhKCZody0+ZGVzY1syXSwgYWQtPnBhZGRyKTsKKwkJZWxzZQkJCQkvKiBBT0kwIHdhcyBvcGVuICovCisJCQlwbWZiaS0+YWQtPm5leHRfYWQgPSBjcHVfdG9fbGUzMihhZC0+cGFkZHIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9kaXVfZGlzYWJsZV9wYW5lbChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbWZiX2luZm8gKnBtZmJpLCAqY21mYmksICptZmJpID0gaW5mby0+cGFyOworCXN0cnVjdCBkaXVfYWQgKmFkID0gbWZiaS0+YWQ7CisJc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhID0gbWZiaS0+cGFyZW50OworCXN0cnVjdCBkaXUgX19pb21lbSAqaHcgPSBtYWNoaW5lX2RhdGEtPmRpdV9yZWc7CisKKwlzd2l0Y2ggKG1mYmktPmluZGV4KSB7CisJY2FzZSBQTEFORTA6CiAJCWlmIChody0+ZGVzY1swXSAhPSBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcikKIAkJCXdyX3JlZ193YSgmaHctPmRlc2NbMF0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAkJYnJlYWs7Ci0JY2FzZSAxOgkJCQkJLyogcGxhbmUgMSBBT0kgMCAqLworCWNhc2UgUExBTkUxX0FPSTA6CiAJCWNtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bMl0tPnBhcjsKIAkJaWYgKGNtZmJpLT5jb3VudCA+IDApCS8qIEFPSTEgaXMgb3BlbiAqLwogCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgY21mYmktPmFkLT5wYWRkcik7CkBAIC00MTQsNyArNTY1LDcgQEAKIAkJCXdyX3JlZ193YSgmaHctPmRlc2NbMV0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAkJCQkJLyogY2xvc2UgQU9JIDAgKi8KIAkJYnJlYWs7Ci0JY2FzZSAzOgkJCQkJLyogcGxhbmUgMiBBT0kgMCAqLworCWNhc2UgUExBTkUyX0FPSTA6CiAJCWNtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bNF0tPnBhcjsKIAkJaWYgKGNtZmJpLT5jb3VudCA+IDApCS8qIEFPSTEgaXMgb3BlbiAqLwogCQkJd3JfcmVnX3dhKCZody0+ZGVzY1syXSwgY21mYmktPmFkLT5wYWRkcik7CkBAIC00MjMsNyArNTc0LDcgQEAKIAkJCXdyX3JlZ193YSgmaHctPmRlc2NbMl0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAkJCQkJLyogY2xvc2UgQU9JIDAgKi8KIAkJYnJlYWs7Ci0JY2FzZSAyOgkJCQkJLyogcGxhbmUgMSBBT0kgMSAqLworCWNhc2UgUExBTkUxX0FPSTE6CiAJCXBtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bMV0tPnBhcjsKIAkJaWYgKGh3LT5kZXNjWzFdICE9IGFkLT5wYWRkcikgewogCQkJCS8qIEFPSTEgaXMgbm90IHRoZSBmaXJzdCBpbiB0aGUgY2hhaW4gKi8KQEAgLTQzNCw3ICs1ODUsNyBAQAogCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpOwogCQkJCQkvKiBjbG9zZSBBT0kgMSAqLwogCQlicmVhazsKLQljYXNlIDQ6CQkJCQkvKiBwbGFuZSAyIEFPSSAxICovCisJY2FzZSBQTEFORTJfQU9JMToKIAkJcG1mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1szXS0+cGFyOwogCQlpZiAoaHctPmRlc2NbMl0gIT0gYWQtPnBhZGRyKSB7CiAJCQkJLyogQU9JMSBpcyBub3QgdGhlIGZpcnN0IGluIHRoZSBjaGFpbiAqLwpAQCAtNDQ1LDMxICs1OTYsMjYgQEAKIAkJCXdyX3JlZ193YSgmaHctPmRlc2NbMl0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAkJCQkvKiBjbG9zZSBBT0kgMSAqLwogCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXMgPSAtRUlOVkFMOwotCQlicmVhazsKIAl9Ci0KLQlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfbGNkYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZGl1ICpodyA9IGRyLmRpdV9yZWc7CiAJc3RydWN0IG1mYl9pbmZvICptZmJpID0gaW5mby0+cGFyOwogCXN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSA9IG1mYmktPnBhcmVudDsKKwlzdHJ1Y3QgZGl1IF9faW9tZW0gKmh3ID0gbWFjaGluZV9kYXRhLT5kaXVfcmVnOwogCiAJaWYgKCFtYWNoaW5lX2RhdGEtPmZiX2VuYWJsZWQpIHsKLQkJb3V0X2JlMzIoJmh3LT5kaXVfbW9kZSwgZHIubW9kZSk7CisJCW91dF9iZTMyKCZody0+ZGl1X21vZGUsIE1GQl9NT0RFMSk7CiAJCW1hY2hpbmVfZGF0YS0+ZmJfZW5hYmxlZCsrOwogCX0KIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9sY2RjKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBkaXUgKmh3ID0gZHIuZGl1X3JlZzsKIAlzdHJ1Y3QgbWZiX2luZm8gKm1mYmkgPSBpbmZvLT5wYXI7CiAJc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhID0gbWZiaS0+cGFyZW50OworCXN0cnVjdCBkaXUgX19pb21lbSAqaHcgPSBtYWNoaW5lX2RhdGEtPmRpdV9yZWc7CiAKIAlpZiAobWFjaGluZV9kYXRhLT5mYl9lbmFibGVkKSB7CiAJCW91dF9iZTMyKCZody0+ZGl1X21vZGUsIDApOwpAQCAtNDgyLDcgKzYyOCw4IEBACiB7CiAJc3RydWN0IG1mYl9pbmZvICpsb3dlcl9hb2lfbWZiaSwgKnVwcGVyX2FvaV9tZmJpLCAqbWZiaSA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZnNsX2RpdV9kYXRhICptYWNoaW5lX2RhdGEgPSBtZmJpLT5wYXJlbnQ7Ci0JaW50IGF2YWlsYWJsZV9oZWlnaHQsIHVwcGVyX2FvaV9ib3R0b20sIGluZGV4ID0gbWZiaS0+aW5kZXg7CisJaW50IGF2YWlsYWJsZV9oZWlnaHQsIHVwcGVyX2FvaV9ib3R0b207CisJZW51bSBtZmJfaW5kZXggaW5kZXggPSBtZmJpLT5pbmRleDsKIAlpbnQgbG93ZXJfYW9pX2lzX29wZW4sIHVwcGVyX2FvaV9pc19vcGVuOwogCV9fdTMyIGJhc2VfcGxhbmVfd2lkdGgsIGJhc2VfcGxhbmVfaGVpZ2h0LCB1cHBlcl9hb2lfaGVpZ2h0OwogCkBAIC00OTQsMTQgKzY0MSwxNCBAQAogCWlmIChtZmJpLT55X2FvaV9kIDwgMCkKIAkJbWZiaS0+eV9hb2lfZCA9IDA7CiAJc3dpdGNoIChpbmRleCkgewotCWNhc2UgMDoKKwljYXNlIFBMQU5FMDoKIAkJaWYgKG1mYmktPnhfYW9pX2QgIT0gMCkKIAkJCW1mYmktPnhfYW9pX2QgPSAwOwogCQlpZiAobWZiaS0+eV9hb2lfZCAhPSAwKQogCQkJbWZiaS0+eV9hb2lfZCA9IDA7CiAJCWJyZWFrOwotCWNhc2UgMToJCQkvKiBBT0kgMCAqLwotCWNhc2UgMzoKKwljYXNlIFBMQU5FMV9BT0kwOgorCWNhc2UgUExBTkUyX0FPSTA6CiAJCWxvd2VyX2FvaV9tZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baW5kZXgrMV0tPnBhcjsKIAkJbG93ZXJfYW9pX2lzX29wZW4gPSBsb3dlcl9hb2lfbWZiaS0+Y291bnQgPiAwID8gMSA6IDA7CiAJCWlmICh2YXItPnhyZXMgPiBiYXNlX3BsYW5lX3dpZHRoKQpAQCAtNTE4LDggKzY2NSw4IEBACiAJCWlmICgobWZiaS0+eV9hb2lfZCArIHZhci0+eXJlcykgPiBhdmFpbGFibGVfaGVpZ2h0KQogCQkJbWZiaS0+eV9hb2lfZCA9IGF2YWlsYWJsZV9oZWlnaHQgLSB2YXItPnlyZXM7CiAJCWJyZWFrOwotCWNhc2UgMjoJCQkvKiBBT0kgMSAqLwotCWNhc2UgNDoKKwljYXNlIFBMQU5FMV9BT0kxOgorCWNhc2UgUExBTkUyX0FPSTE6CiAJCXVwcGVyX2FvaV9tZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baW5kZXgtMV0tPnBhcjsKIAkJdXBwZXJfYW9pX2hlaWdodCA9CiAJCQkJbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baW5kZXgtMV0tPnZhci55cmVzOwpAQCAtNTU1LDkgKzcwMiw2IEBACiBzdGF0aWMgaW50IGZzbF9kaXVfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXByX2RlYnVnKCJjaGVja192YXIgeHJlczogJWRcbiIsIHZhci0+eHJlcyk7Ci0JcHJfZGVidWcoImNoZWNrX3ZhciB5cmVzOiAlZFxuIiwgdmFyLT55cmVzKTsKLQogCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykKIAkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CiAJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQpAQCAtNjUyLDcgKzc5Niw3IEBACiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOwogCXN0cnVjdCBtZmJfaW5mbyAqbWZiaSA9IGluZm8tPnBhcjsKIAotCXN0cm5jcHkoZml4LT5pZCwgbWZiaS0+aWQsIHN0cmxlbihtZmJpLT5pZCkpOworCXN0cm5jcHkoZml4LT5pZCwgbWZiaS0+aWQsIHNpemVvZihmaXgtPmlkKSk7CiAJZml4LT5saW5lX2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDg7CiAJZml4LT50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOwogCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9OT05FOwpAQCAtNjY2LDQ1ICs4MTAsMzcgQEAKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7CiAJc3RydWN0IG1mYl9pbmZvICptZmJpID0gaW5mby0+cGFyOwogCXN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSA9IG1mYmktPnBhcmVudDsKLQlzdHJ1Y3QgZGl1ICpodzsKKwlzdHJ1Y3QgZGl1IF9faW9tZW0gKmh3OwogCWludCBpLCBqOwogCWNoYXIgX19pb21lbSAqY3Vyc29yX2Jhc2UsICpnYW1tYV90YWJsZV9iYXNlOwogCiAJdTMyIHRlbXA7CiAKLQlodyA9IGRyLmRpdV9yZWc7Ci0KLQlpZiAobWZiaS0+dHlwZSA9PSBNRkJfVFlQRV9PRkYpIHsKLQkJZnNsX2RpdV9kaXNhYmxlX3BhbmVsKGluZm8pOwotCQlyZXR1cm47Ci0JfQorCWh3ID0gbWFjaGluZV9kYXRhLT5kaXVfcmVnOwogCiAJZGl1X29wcy5zZXRfbW9uaXRvcl9wb3J0KG1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0KTsKLQlnYW1tYV90YWJsZV9iYXNlID0gcG9vbC5nYW1tYS52YWRkcjsKLQljdXJzb3JfYmFzZSA9IHBvb2wuY3Vyc29yLnZhZGRyOworCWdhbW1hX3RhYmxlX2Jhc2UgPSBtYWNoaW5lX2RhdGEtPmdhbW1hLnZhZGRyOworCWN1cnNvcl9iYXNlID0gbWFjaGluZV9kYXRhLT5jdXJzb3IudmFkZHI7CiAJLyogUHJlcCBmb3IgRElVIGluaXQgIC0gZ2FtbWEgdGFibGUsIGN1cnNvciB0YWJsZSAqLwogCiAJZm9yIChpID0gMDsgaSA8PSAyOyBpKyspCi0JICAgZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykKLQkgICAgICAqZ2FtbWFfdGFibGVfYmFzZSsrID0gajsKKwkJZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykKKwkJCSpnYW1tYV90YWJsZV9iYXNlKysgPSBqOwogCi0JZGl1X29wcy5zZXRfZ2FtbWFfdGFibGUobWFjaGluZV9kYXRhLT5tb25pdG9yX3BvcnQsIHBvb2wuZ2FtbWEudmFkZHIpOworCWRpdV9vcHMuc2V0X2dhbW1hX3RhYmxlKG1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0LAorCQkJCW1hY2hpbmVfZGF0YS0+Z2FtbWEudmFkZHIpOwogCi0JcHJfZGVidWcoInVwZGF0ZS1sY2RjOiBIVyAtICVwXG4gRGlzYWJsaW5nIERJVVxuIiwgaHcpOwogCWRpc2FibGVfbGNkYyhpbmZvKTsKIAogCS8qIFByb2dyYW0gRElVIHJlZ2lzdGVycyAqLwogCi0Jb3V0X2JlMzIoJmh3LT5nYW1tYSwgcG9vbC5nYW1tYS5wYWRkcik7Ci0Jb3V0X2JlMzIoJmh3LT5jdXJzb3IsIHBvb2wuY3Vyc29yLnBhZGRyKTsKKwlvdXRfYmUzMigmaHctPmdhbW1hLCBtYWNoaW5lX2RhdGEtPmdhbW1hLnBhZGRyKTsKKwlvdXRfYmUzMigmaHctPmN1cnNvciwgbWFjaGluZV9kYXRhLT5jdXJzb3IucGFkZHIpOwogCiAJb3V0X2JlMzIoJmh3LT5iZ25kLCAweDAwN0Y3RjdGKTsgCS8qIEJHTkQgKi8KIAlvdXRfYmUzMigmaHctPmJnbmRfd2IsIDApOyAJCS8qIEJHTkRfV0IgKi8KIAlvdXRfYmUzMigmaHctPmRpc3Bfc2l6ZSwgKHZhci0+eXJlcyA8PCAxNiB8IHZhci0+eHJlcykpOwogCQkJCQkJLyogRElTUCBTSVpFICovCi0JcHJfZGVidWcoIkRJVSB4cmVzOiAlZFxuIiwgdmFyLT54cmVzKTsKLQlwcl9kZWJ1ZygiRElVIHlyZXM6ICVkXG4iLCB2YXItPnlyZXMpOwotCiAJb3V0X2JlMzIoJmh3LT53Yl9zaXplLCAwKTsgLyogV0IgU0laRSAqLwogCW91dF9iZTMyKCZody0+d2JfbWVtX2FkZHIsIDApOyAvKiBXQiBNRU0gQUREUiAqLwogCkBAIC03MjEsMTUgKzg1Nyw2IEBACiAKIAlvdXRfYmUzMigmaHctPnZzeW5fcGFyYSwgdGVtcCk7CiAKLQlwcl9kZWJ1ZygiRElVIHJpZ2h0X21hcmdpbiAtICVkXG4iLCB2YXItPnJpZ2h0X21hcmdpbik7Ci0JcHJfZGVidWcoIkRJVSBsZWZ0X21hcmdpbiAtICVkXG4iLCB2YXItPmxlZnRfbWFyZ2luKTsKLQlwcl9kZWJ1ZygiRElVIGhzeW5jX2xlbiAtICVkXG4iLCB2YXItPmhzeW5jX2xlbik7Ci0JcHJfZGVidWcoIkRJVSB1cHBlcl9tYXJnaW4gLSAlZFxuIiwgdmFyLT51cHBlcl9tYXJnaW4pOwotCXByX2RlYnVnKCJESVUgbG93ZXJfbWFyZ2luIC0gJWRcbiIsIHZhci0+bG93ZXJfbWFyZ2luKTsKLQlwcl9kZWJ1ZygiRElVIHZzeW5jX2xlbiAtICVkXG4iLCB2YXItPnZzeW5jX2xlbik7Ci0JcHJfZGVidWcoIkRJVSBIU1lOQyAtIDB4JTA4eFxuIiwgaHctPmhzeW5fcGFyYSk7Ci0JcHJfZGVidWcoIkRJVSBWU1lOQyAtIDB4JTA4eFxuIiwgaHctPnZzeW5fcGFyYSk7Ci0KIAlkaXVfb3BzLnNldF9waXhlbF9jbG9jayh2YXItPnBpeGNsb2NrKTsKIAogCW91dF9iZTMyKCZody0+c3luX3BvbCwgMCk7CS8qIFNZTkMgU0lHTkFMUyBQT0xBUklUWSAqLwpAQCAtNzQ2LDE0ICs4NzMsOSBAQAogCXBoeXNfYWRkcl90IHBoeXM7CiAJdTMyIHNtZW1fbGVuID0gaW5mby0+Zml4LmxpbmVfbGVuZ3RoICogaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKIAotCXByX2RlYnVnKCJpbmZvLT52YXIueHJlc192aXJ0dWFsID0gJWRcbiIsIGluZm8tPnZhci54cmVzX3ZpcnR1YWwpOwotCXByX2RlYnVnKCJpbmZvLT52YXIueXJlc192aXJ0dWFsID0gJWRcbiIsIGluZm8tPnZhci55cmVzX3ZpcnR1YWwpOwotCXByX2RlYnVnKCJpbmZvLT5maXgubGluZV9sZW5ndGggID0gJWRcbiIsIGluZm8tPmZpeC5saW5lX2xlbmd0aCk7Ci0JcHJfZGVidWcoIk1BUF9WSURFT19NRU1PUlk6IHNtZW1fbGVuID0gJXVcbiIsIHNtZW1fbGVuKTsKLQogCWluZm8tPnNjcmVlbl9iYXNlID0gZnNsX2RpdV9hbGxvYyhzbWVtX2xlbiwgJnBoeXMpOwogCWlmIChpbmZvLT5zY3JlZW5fYmFzZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGZiIG1lbW9yeVxuIik7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGZiIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltdXRleF9sb2NrKCZpbmZvLT5tbV9sb2NrKTsKQEAgLTc2MiwxMCArODg0LDYgQEAKIAltdXRleF91bmxvY2soJmluZm8tPm1tX2xvY2spOwogCWluZm8tPnNjcmVlbl9zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwogCi0JcHJfZGVidWcoIkFsbG9jYXRlZCBmYiBAIHBhZGRyPTB4JTA4bHgsIHNpemU9JWQuXG4iLAotCQkgaW5mby0+Zml4LnNtZW1fc3RhcnQsIGluZm8tPmZpeC5zbWVtX2xlbik7Ci0JcHJfZGVidWcoInNjcmVlbiBiYXNlICVwXG4iLCBpbmZvLT5zY3JlZW5fYmFzZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODEwLDkgKzkyOCw5IEBACiAJc3RydWN0IG1mYl9pbmZvICptZmJpID0gaW5mby0+cGFyOwogCXN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSA9IG1mYmktPnBhcmVudDsKIAlzdHJ1Y3QgZGl1X2FkICphZCA9IG1mYmktPmFkOwotCXN0cnVjdCBkaXUgKmh3OworCXN0cnVjdCBkaXUgX19pb21lbSAqaHc7CiAKLQlodyA9IGRyLmRpdV9yZWc7CisJaHcgPSBtYWNoaW5lX2RhdGEtPmRpdV9yZWc7CiAKIAlzZXRfZml4KGluZm8pOwogCW1mYmktPmN1cnNvcl9yZXNldCA9IDE7CkBAIC04MjIsMTggKzk0MCwxNiBAQAogCWlmIChsZW4gIT0gaW5mby0+Zml4LnNtZW1fbGVuKSB7CiAJCWlmIChpbmZvLT5maXguc21lbV9zdGFydCkKIAkJCXVubWFwX3ZpZGVvX21lbW9yeShpbmZvKTsKLQkJcHJfZGVidWcoIlNFVCBQQVI6IHNtZW1fbGVuID0gJWRcbiIsIGluZm8tPmZpeC5zbWVtX2xlbik7CiAKIAkJLyogTWVtb3J5IGFsbG9jYXRpb24gZm9yIGZyYW1lYnVmZmVyICovCiAJCWlmIChtYXBfdmlkZW9fbWVtb3J5KGluZm8pKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBmYiBtZW1vcnkgMVxuIik7CisJCQlkZXZfZXJyKGluZm8tPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBmYiBtZW1vcnkgMVxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KIAotCWFkLT5waXhfZm10ID0KLQkJZGl1X29wcy5nZXRfcGl4ZWxfZm9ybWF0KHZhci0+Yml0c19wZXJfcGl4ZWwsCi0JCQkJCSBtYWNoaW5lX2RhdGEtPm1vbml0b3JfcG9ydCk7CisJYWQtPnBpeF9mbXQgPSBkaXVfb3BzLmdldF9waXhlbF9mb3JtYXQobWFjaGluZV9kYXRhLT5tb25pdG9yX3BvcnQsCisJCQkJCSAgICAgICB2YXItPmJpdHNfcGVyX3BpeGVsKTsKIAlhZC0+YWRkciAgICA9IGNwdV90b19sZTMyKGluZm8tPmZpeC5zbWVtX3N0YXJ0KTsKIAlhZC0+c3JjX3NpemVfZ19hbHBoYSA9IGNwdV90b19sZTMyKCh2YXItPnlyZXNfdmlydHVhbCA8PCAxMikgfAogCQkJCXZhci0+eHJlc192aXJ0dWFsKSB8IG1mYmktPmdfYWxwaGE7CkBAIC04NTEsMTQgKzk2NywxNCBAQAogCWFkLT5ja21pbl9nID0gMjU1OwogCWFkLT5ja21pbl9iID0gMjU1OwogCi0JaWYgKG1mYmktPmluZGV4ID09IDApCisJaWYgKG1mYmktPmluZGV4ID09IFBMQU5FMCkKIAkJdXBkYXRlX2xjZGMoaW5mbyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgX191MzIgQ05WVF9UT0hXKF9fdTMyIHZhbCwgX191MzIgd2lkdGgpCiB7Ci0JcmV0dXJuICgodmFsPDx3aWR0aCkgKyAweDdGRkYgLSB2YWwpPj4xNjsKKwlyZXR1cm4gKCh2YWwgPDwgd2lkdGgpICsgMHg3RkZGIC0gdmFsKSA+PiAxNjsKIH0KIAogLyoKQEAgLTg3MCw4ICs5ODYsOSBAQAogICogcHNldWRvX3BhbGV0dGUgaW4gc3RydWN0IGZiX2luZm8uIEZvciBwc2V1ZG9jb2xvciBtb2RlIHdlIGhhdmUgYSBsaW1pdGVkCiAgKiBjb2xvciBwYWxldHRlLgogICovCi1zdGF0aWMgaW50IGZzbF9kaXVfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAotCQkJICAgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgZnNsX2RpdV9zZXRjb2xyZWcodW5zaWduZWQgaW50IHJlZ25vLCB1bnNpZ25lZCBpbnQgcmVkLAorCQkJICAgICB1bnNpZ25lZCBpbnQgZ3JlZW4sIHVuc2lnbmVkIGludCBibHVlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlpbnQgcmV0ID0gMTsKIApAQCAtOTA2LDkgKzEwMjMsNiBAQAogCQkJcmV0ID0gMDsKIAkJfQogCQlicmVhazsKLQljYXNlIEZCX1ZJU1VBTF9TVEFUSUNfUFNFVURPQ09MT1I6Ci0JY2FzZSBGQl9WSVNVQUxfUFNFVURPQ09MT1I6Ci0JCWJyZWFrOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC05NDQsMzcgKzEwNTgsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogQmxhbmsgdGhlIHNjcmVlbiBpZiBibGFua19tb2RlICE9IDAsIGVsc2UgdW5ibGFuay4gUmV0dXJuIDAgaWYgYmxhbmtpbmcKLSAqIHN1Y2NlZWRlZCwgIT0gMCBpZiB1bi0vYmxhbmtpbmcgZmFpbGVkLgotICogYmxhbmtfbW9kZSA9PSAyOiBzdXNwZW5kIHZzeW5jCi0gKiBibGFua19tb2RlID09IDM6IHN1c3BlbmQgaHN5bmMKLSAqIGJsYW5rX21vZGUgPT0gNDogcG93ZXJkb3duCi0gKi8KLXN0YXRpYyBpbnQgZnNsX2RpdV9ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IG1mYl9pbmZvICptZmJpID0gaW5mby0+cGFyOwotCi0JbWZiaS0+YmxhbmsgPSBibGFua19tb2RlOwotCi0Jc3dpdGNoIChibGFua19tb2RlKSB7Ci0JY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgotCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKLQkvKiBGSVhNRTogZml4ZXMgdG8gZW5hYmxlX3BhbmVsIGFuZCBlbmFibGUgbGNkYyBuZWVkZWQgKi8KLQljYXNlIEZCX0JMQU5LX05PUk1BTDoKLQkvKglmc2xfZGl1X2Rpc2FibGVfcGFuZWwoaW5mbyk7Ki8KLQkJYnJlYWs7Ci0JY2FzZSBGQl9CTEFOS19QT1dFUkRPV046Ci0JLyoJZGlzYWJsZV9sY2RjKGluZm8pOwkqLwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX1VOQkxBTks6Ci0JLyoJZnNsX2RpdV9lbmFibGVfcGFuZWwoaW5mbyk7Ki8KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZnNsX2RpdV9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtOTg5LDI1ICsxMDcyLDI5IEBACiAJaWYgKCFhcmcpCiAJCXJldHVybiAtRUlOVkFMOwogCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNRkJfU0VUX1BJWEZNVF9PTEQ6CisJCWRldl93YXJuKGluZm8tPmRldiwKKwkJCSAiTUZCX1NFVF9QSVhGTVQgdmFsdWUgb2YgMHglMDh4IGlzIGRlcHJlY2F0ZWQuXG4iLAorCQkJIE1GQl9TRVRfUElYRk1UX09MRCk7CiAJY2FzZSBNRkJfU0VUX1BJWEZNVDoKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZwaXhfZm10LCBidWYsIHNpemVvZihwaXhfZm10KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJYWQtPnBpeF9mbXQgPSBwaXhfZm10OwotCQlwcl9kZWJ1ZygiU2V0IHBpeGVsIGZvcm1hdCB0byAweCUwOHhcbiIsIGFkLT5waXhfZm10KTsKIAkJYnJlYWs7CisJY2FzZSBNRkJfR0VUX1BJWEZNVF9PTEQ6CisJCWRldl93YXJuKGluZm8tPmRldiwKKwkJCSAiTUZCX0dFVF9QSVhGTVQgdmFsdWUgb2YgMHglMDh4IGlzIGRlcHJlY2F0ZWQuXG4iLAorCQkJIE1GQl9HRVRfUElYRk1UX09MRCk7CiAJY2FzZSBNRkJfR0VUX1BJWEZNVDoKIAkJcGl4X2ZtdCA9IGFkLT5waXhfZm10OwogCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJnBpeF9mbXQsIHNpemVvZihwaXhfZm10KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJcHJfZGVidWcoImdldCBwaXhlbCBmb3JtYXQgMHglMDh4XG4iLCBhZC0+cGl4X2ZtdCk7CiAJCWJyZWFrOwogCWNhc2UgTUZCX1NFVF9BT0lEOgogCQlpZiAoY29weV9mcm9tX3VzZXIoJmFvaV9kLCBidWYsIHNpemVvZihhb2lfZCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCW1mYmktPnhfYW9pX2QgPSBhb2lfZC54X2FvaV9kOwogCQltZmJpLT55X2FvaV9kID0gYW9pX2QueV9hb2lfZDsKLQkJcHJfZGVidWcoInNldCBBT0kgZGlzcGxheSBvZmZzZXQgb2YgaW5kZXggJWQgdG8gKCVkLCVkKVxuIiwKLQkJCQkgbWZiaS0+aW5kZXgsIGFvaV9kLnhfYW9pX2QsIGFvaV9kLnlfYW9pX2QpOwogCQlmc2xfZGl1X2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKTsKIAkJZnNsX2RpdV9zZXRfYW9pKGluZm8pOwogCQlicmVhazsKQEAgLTEwMTYsMTQgKzExMDMsMTEgQEAKIAkJYW9pX2QueV9hb2lfZCA9IG1mYmktPnlfYW9pX2Q7CiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmYW9pX2QsIHNpemVvZihhb2lfZCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXByX2RlYnVnKCJnZXQgQU9JIGRpc3BsYXkgb2Zmc2V0IG9mIGluZGV4ICVkICglZCwlZClcbiIsCi0JCQkJbWZiaS0+aW5kZXgsIGFvaV9kLnhfYW9pX2QsIGFvaV9kLnlfYW9pX2QpOwogCQlicmVhazsKIAljYXNlIE1GQl9HRVRfQUxQSEE6CiAJCWdsb2JhbF9hbHBoYSA9IG1mYmktPmdfYWxwaGE7CiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZ2xvYmFsX2FscGhhLCBzaXplb2YoZ2xvYmFsX2FscGhhKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJcHJfZGVidWcoImdldCBnbG9iYWwgYWxwaGEgb2YgaW5kZXggJWRcbiIsIG1mYmktPmluZGV4KTsKIAkJYnJlYWs7CiAJY2FzZSBNRkJfU0VUX0FMUEhBOgogCQkvKiBzZXQgcGFuZWwgaW5mb3JtYXRpb24gKi8KQEAgLTEwMzIsNyArMTExNiw2IEBACiAJCWFkLT5zcmNfc2l6ZV9nX2FscGhhID0gKGFkLT5zcmNfc2l6ZV9nX2FscGhhICYgKH4weGZmKSkgfAogCQkJCQkJCShnbG9iYWxfYWxwaGEgJiAweGZmKTsKIAkJbWZiaS0+Z19hbHBoYSA9IGdsb2JhbF9hbHBoYTsKLQkJcHJfZGVidWcoInNldCBnbG9iYWwgYWxwaGEgZm9yIGluZGV4ICVkXG4iLCBtZmJpLT5pbmRleCk7CiAJCWJyZWFrOwogCWNhc2UgTUZCX1NFVF9DSFJPTUFfS0VZOgogCQkvKiBzZXQgcGFuZWwgd2luZm9ybWF0aW9uICovCkBAIC0xMDYwLDI3ICsxMTQzLDkgQEAKIAkJCWFkLT5ja21pbl9nID0gY2suZ3JlZW5fbWluOwogCQkJYWQtPmNrbWluX2IgPSBjay5ibHVlX21pbjsKIAkJfQotCQlwcl9kZWJ1Zygic2V0IGNocm9tYSBrZXlcbiIpOwogCQlicmVhazsKLQljYXNlIEZCSU9HRVRfR1dJTkZPOgotCQlpZiAobWZiaS0+dHlwZSA9PSBNRkJfVFlQRV9PRkYpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJLyogZ2V0IGdyYXBoaWMgd2luZG93IGluZm9ybWF0aW9uICovCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBhZCwgc2l6ZW9mKCphZCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgRkJJT0dFVF9IV0NJTkZPOgotCQlwcl9kZWJ1ZygiRkJJT0dFVF9IV0NJTkZPOjB4JTA4eFxuIiwgRkJJT0dFVF9IV0NJTkZPKTsKLQkJYnJlYWs7Ci0JY2FzZSBGQklPUFVUX01PREVJTkZPOgotCQlwcl9kZWJ1ZygiRkJJT1BVVF9NT0RFSU5GTzoweCUwOHhcbiIsIEZCSU9QVVRfTU9ERUlORk8pOwotCQlicmVhazsKLQljYXNlIEZCSU9HRVRfRElTUElORk86Ci0JCXByX2RlYnVnKCJGQklPR0VUX0RJU1BJTkZPOjB4JTA4eFxuIiwgRkJJT0dFVF9ESVNQSU5GTyk7Ci0JCWJyZWFrOwotCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIGlvY3RsIGNvbW1hbmQgKDB4JTA4WClcbiIsIGNtZCk7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAidW5rbm93biBpb2N0bCBjb21tYW5kICgweCUwOFgpXG4iLCBjbWQpOwogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KIApAQCAtMTA5NSwyMiArMTE2MCwxOCBAQAogCWludCByZXMgPSAwOwogCiAJLyogZnJlZSBib290IHNwbGFzaCBtZW1vcnkgb24gZmlyc3QgL2Rldi9mYjAgb3BlbiAqLwotCWlmICghbWZiaS0+aW5kZXggJiYgZGl1X29wcy5yZWxlYXNlX2Jvb3RtZW0pCisJaWYgKChtZmJpLT5pbmRleCA9PSBQTEFORTApICYmIGRpdV9vcHMucmVsZWFzZV9ib290bWVtKQogCQlkaXVfb3BzLnJlbGVhc2VfYm9vdG1lbSgpOwogCiAJc3Bpbl9sb2NrKCZkaXVfbG9jayk7CiAJbWZiaS0+Y291bnQrKzsKIAlpZiAobWZiaS0+Y291bnQgPT0gMSkgewotCQlwcl9kZWJ1Zygib3BlbiBwbGFuZSBpbmRleCAlZFxuIiwgbWZiaS0+aW5kZXgpOwogCQlmc2xfZGl1X2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKTsKIAkJcmVzID0gZnNsX2RpdV9zZXRfcGFyKGluZm8pOwogCQlpZiAocmVzIDwgMCkKIAkJCW1mYmktPmNvdW50LS07Ci0JCWVsc2UgewotCQkJcmVzID0gZnNsX2RpdV9lbmFibGVfcGFuZWwoaW5mbyk7Ci0JCQlpZiAocmVzIDwgMCkKLQkJCQltZmJpLT5jb3VudC0tOwotCQl9CisJCWVsc2UKKwkJCWZzbF9kaXVfZW5hYmxlX3BhbmVsKGluZm8pOwogCX0KIAogCXNwaW5fdW5sb2NrKCZkaXVfbG9jayk7CkBAIC0xMTI2LDEyICsxMTg3LDkgQEAKIAogCXNwaW5fbG9jaygmZGl1X2xvY2spOwogCW1mYmktPmNvdW50LS07Ci0JaWYgKG1mYmktPmNvdW50ID09IDApIHsKLQkJcHJfZGVidWcoInJlbGVhc2UgcGxhbmUgaW5kZXggJWRcbiIsIG1mYmktPmluZGV4KTsKLQkJcmVzID0gZnNsX2RpdV9kaXNhYmxlX3BhbmVsKGluZm8pOwotCQlpZiAocmVzIDwgMCkKLQkJCW1mYmktPmNvdW50Kys7Ci0JfQorCWlmIChtZmJpLT5jb3VudCA9PSAwKQorCQlmc2xfZGl1X2Rpc2FibGVfcGFuZWwoaW5mbyk7CisKIAlzcGluX3VubG9jaygmZGl1X2xvY2spOwogCXJldHVybiByZXM7CiB9CkBAIC0xMTQxLDcgKzExOTksNiBAQAogCS5mYl9jaGVja192YXIgPSBmc2xfZGl1X2NoZWNrX3ZhciwKIAkuZmJfc2V0X3BhciA9IGZzbF9kaXVfc2V0X3BhciwKIAkuZmJfc2V0Y29scmVnID0gZnNsX2RpdV9zZXRjb2xyZWcsCi0JLmZiX2JsYW5rID0gZnNsX2RpdV9ibGFuaywKIAkuZmJfcGFuX2Rpc3BsYXkgPSBmc2xfZGl1X3Bhbl9kaXNwbGF5LAogCS5mYl9maWxscmVjdCA9IGNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEgPSBjZmJfY29weWFyZWEsCkBAIC0xMTc4LDcgKzEyMzUsNyBAQAogCWlmIChpbml0X2ZiaW5mbyhpbmZvKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAobWZiaS0+aW5kZXggPT0gMCkgewkvKiBwbGFuZSAwICovCisJaWYgKG1mYmktPmluZGV4ID09IFBMQU5FMCkgewogCQlpZiAobWZiaS0+ZWRpZF9kYXRhKSB7CiAJCQkvKiBOb3cgYnVpbGQgbW9kZWRiIGZyb20gRURJRCAqLwogCQkJZmJfZWRpZF90b19tb25zcGVjcyhtZmJpLT5lZGlkX2RhdGEsICZpbmZvLT5tb25zcGVjcyk7CkBAIC0xMTkyLDQzICsxMjQ5LDIzIEBACiAJfSBlbHNlIHsKIAkJYW9pX21vZGUgPSBpbml0X2FvaV9tb2RlOwogCX0KLQlwcl9kZWJ1ZygibW9kZSB1c2VkID0gJXNcbiIsIGFvaV9tb2RlKTsKLQlyYyA9IGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBhb2lfbW9kZSwgZGIsIGRic2l6ZSwKLQkJCSAgJmZzbF9kaXVfZGVmYXVsdF9tb2RlLCBkZWZhdWx0X2JwcCk7Ci0Jc3dpdGNoIChyYykgewotCWNhc2UgMToKLQkJcHJfZGVidWcoInVzaW5nIG1vZGUgc3BlY2lmaWVkIGluIEBtb2RlXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlwcl9kZWJ1ZygidXNpbmcgbW9kZSBzcGVjaWZpZWQgaW4gQG1vZGUgIgotCQkJIndpdGggaWdub3JlZCByZWZyZXNoIHJhdGVcbiIpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXByX2RlYnVnKCJ1c2luZyBtb2RlIGRlZmF1bHQgbW9kZVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJcHJfZGVidWcoInVzaW5nIG1vZGUgZnJvbSBsaXN0XG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoInJjID0gJWRcbiIsIHJjKTsKLQkJcHJfZGVidWcoImZhaWxlZCB0byBmaW5kIG1vZGVcbiIpOworCXJjID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIGFvaV9tb2RlLCBkYiwgZGJzaXplLCBOVUxMLAorCQkJICBkZWZhdWx0X2JwcCk7CisJaWYgKCFyYykgewogCQkvKgogCQkgKiBGb3IgcGxhbmUgMCB3ZSBjb250aW51ZSBhbmQgbG9vayBpbnRvCiAJCSAqIGRyaXZlcidzIGludGVybmFsIG1vZGVkYi4KIAkJICovCi0JCWlmIChtZmJpLT5pbmRleCA9PSAwICYmIG1mYmktPmVkaWRfZGF0YSkKKwkJaWYgKChtZmJpLT5pbmRleCA9PSBQTEFORTApICYmIG1mYmktPmVkaWRfZGF0YSkKIAkJCWhhc19kZWZhdWx0X21vZGUgPSAwOwogCQllbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7CiAJfQogCiAJaWYgKCFoYXNfZGVmYXVsdF9tb2RlKSB7CiAJCXJjID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIGFvaV9tb2RlLCBmc2xfZGl1X21vZGVfZGIsCi0JCQkJICBBUlJBWV9TSVpFKGZzbF9kaXVfbW9kZV9kYiksCi0JCQkJICAmZnNsX2RpdV9kZWZhdWx0X21vZGUsCi0JCQkJICBkZWZhdWx0X2JwcCk7Ci0JCWlmIChyYyA+IDAgJiYgcmMgPCA1KQorCQkJQVJSQVlfU0laRShmc2xfZGl1X21vZGVfZGIpLCBOVUxMLCBkZWZhdWx0X2JwcCk7CisJCWlmIChyYykKIAkJCWhhc19kZWZhdWx0X21vZGUgPSAxOwogCX0KIApAQCAtMTI1NiwzMyArMTI5MywyMiBAQAogCQlmYl92aWRlb21vZGVfdG9fdmFyKCZpbmZvLT52YXIsIG1vZGVkYik7CiAJfQogCi0JcHJfZGVidWcoInhyZXNfdmlydHVhbCAlZFxuIiwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCk7Ci0JcHJfZGVidWcoImJpdHNfcGVyX3BpeGVsICVkXG4iLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwotCi0JcHJfZGVidWcoImluZm8tPnZhci55cmVzX3ZpcnR1YWwgPSAlZFxuIiwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCk7Ci0JcHJfZGVidWcoImluZm8tPmZpeC5saW5lX2xlbmd0aCA9ICVkXG4iLCBpbmZvLT5maXgubGluZV9sZW5ndGgpOwotCi0JaWYgKG1mYmktPnR5cGUgPT0gTUZCX1RZUEVfT0ZGKQotCQltZmJpLT5ibGFuayA9IEZCX0JMQU5LX05PUk1BTDsKLQllbHNlCi0JCW1mYmktPmJsYW5rID0gRkJfQkxBTktfVU5CTEFOSzsKLQogCWlmIChmc2xfZGl1X2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKSkgewotCQlwcmludGsoS0VSTl9FUlIgImZiX2NoZWNrX3ZhciBmYWlsZWQiKTsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJmc2xfZGl1X2NoZWNrX3ZhciBmYWlsZWRcbiIpOworCQl1bm1hcF92aWRlb19tZW1vcnkoaW5mbyk7CiAJCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyZWdpc3Rlcl9mcmFtZWJ1ZmZlciBmYWlsZWQiKTsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJyZWdpc3Rlcl9mcmFtZWJ1ZmZlciBmYWlsZWRcbiIpOwogCQl1bm1hcF92aWRlb19tZW1vcnkoaW5mbyk7CiAJCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCW1mYmktPnJlZ2lzdGVyZWQgPSAxOwotCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZiIGRldmljZSByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseS5cbiIsCi0JCSBpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQpOworCWRldl9pbmZvKGluZm8tPmRldiwgIiVzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5XG4iLCBtZmJpLT5pZCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyOTQsNyArMTMyMCw3IEBACiAJaWYgKCFtZmJpLT5yZWdpc3RlcmVkKQogCQlyZXR1cm47CiAKLQlpZiAobWZiaS0+aW5kZXggPT0gMCkKKwlpZiAobWZiaS0+aW5kZXggPT0gUExBTkUwKQogCQlrZnJlZShtZmJpLT5lZGlkX2RhdGEpOwogCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKQEAgLTEzMDcsMjAgKzEzMzMsMjAgQEAKIAogc3RhdGljIGlycXJldHVybl90IGZzbF9kaXVfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgZGl1ICpodyA9IGRyLmRpdV9yZWc7CisJc3RydWN0IGRpdSBfX2lvbWVtICpodyA9IGRldl9pZDsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzID0gaW5fYmUzMigmaHctPmludF9zdGF0dXMpOwogCiAJaWYgKHN0YXR1cykgewogCQkvKiBUaGlzIGlzIHRoZSB3b3JrYXJvdW5kIGZvciB1bmRlcnJ1biAqLwogCQlpZiAoc3RhdHVzICYgSU5UX1VORFJVTikgewogCQkJb3V0X2JlMzIoJmh3LT5kaXVfbW9kZSwgMCk7Ci0JCQlwcl9kZWJ1ZygiRXJyOiBESVUgb2NjdXJzIHVuZGVycnVuIVxuIik7CiAJCQl1ZGVsYXkoMSk7CiAJCQlvdXRfYmUzMigmaHctPmRpdV9tb2RlLCAxKTsKIAkJfQogI2lmIGRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKIAkJZWxzZSBpZiAoc3RhdHVzICYgSU5UX1ZTWU5DKSB7CiAJCQl1bnNpZ25lZCBpbnQgaTsKKwogCQkJZm9yIChpID0gMDsgaSA8IGNvaGVyZW5jZV9kYXRhX3NpemU7CiAJCQkJaSArPSBkX2NhY2hlX2xpbmVfc2l6ZSkKIAkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCkBAIC0xMzMzLDQzICsxMzU5LDM4IEBACiAJcmV0dXJuIElSUV9OT05FOwogfQogCi1zdGF0aWMgaW50IHJlcXVlc3RfaXJxX2xvY2FsKGludCBpcnEpCitzdGF0aWMgaW50IHJlcXVlc3RfaXJxX2xvY2FsKHN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXR1cywgaW50czsKLQlzdHJ1Y3QgZGl1ICpodzsKKwlzdHJ1Y3QgZGl1IF9faW9tZW0gKmh3ID0gbWFjaGluZV9kYXRhLT5kaXVfcmVnOworCXUzMiBpbnRzOwogCWludCByZXQ7CiAKLQlodyA9IGRyLmRpdV9yZWc7Ci0KIAkvKiBSZWFkIHRvIGNsZWFyIHRoZSBzdGF0dXMgKi8KLQlzdGF0dXMgPSBpbl9iZTMyKCZody0+aW50X3N0YXR1cyk7CisJaW5fYmUzMigmaHctPmludF9zdGF0dXMpOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBmc2xfZGl1X2lzciwgMCwgImRpdSIsIE5VTEwpOwotCWlmIChyZXQpCi0JCXByX2luZm8oIlJlcXVlc3QgZGl1IElSUSBmYWlsZWQuXG4iKTsKLQllbHNlIHsKKwlyZXQgPSByZXF1ZXN0X2lycShtYWNoaW5lX2RhdGEtPmlycSwgZnNsX2RpdV9pc3IsIDAsICJmc2wtZGl1LWZiIiwgaHcpOworCWlmICghcmV0KSB7CiAJCWludHMgPSBJTlRfUEFSRVJSIHwgSU5UX0xTX0JGX1ZTOwogI2lmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJCWludHMgfD0JSU5UX1ZTWU5DOwogI2VuZGlmCi0JCWlmIChkci5tb2RlID09IE1GQl9NT0RFMiB8fCBkci5tb2RlID09IE1GQl9NT0RFMykKLQkJCWludHMgfD0gSU5UX1ZTWU5DX1dCOwogCiAJCS8qIFJlYWQgdG8gY2xlYXIgdGhlIHN0YXR1cyAqLwotCQlzdGF0dXMgPSBpbl9iZTMyKCZody0+aW50X3N0YXR1cyk7CisJCWluX2JlMzIoJmh3LT5pbnRfc3RhdHVzKTsKIAkJb3V0X2JlMzIoJmh3LT5pbnRfbWFzaywgaW50cyk7CiAJfQorCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9pcnFfbG9jYWwoaW50IGlycSkKK3N0YXRpYyB2b2lkIGZyZWVfaXJxX2xvY2FsKHN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSkKIHsKLQlzdHJ1Y3QgZGl1ICpodyA9IGRyLmRpdV9yZWc7CisJc3RydWN0IGRpdSBfX2lvbWVtICpodyA9IG1hY2hpbmVfZGF0YS0+ZGl1X3JlZzsKIAogCS8qIERpc2FibGUgYWxsIExDREMgaW50ZXJydXB0ICovCiAJb3V0X2JlMzIoJmh3LT5pbnRfbWFzaywgMHgxZik7CiAKLQlmcmVlX2lycShpcnEsIE5VTEwpOworCWZyZWVfaXJxKG1hY2hpbmVfZGF0YS0+aXJxLCBOVUxMKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpAQCAtMTQwNiw0OSArMTQyNyw0MiBAQAogc3RhdGljIGludCBhbGxvY2F0ZV9idWYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGl1X2FkZHIgKmJ1ZiwgdTMyIHNpemUsCiAJCQl1MzIgYnl0ZXNfYWxpZ24pCiB7Ci0JdTMyIG9mZnNldCwgc3NpemU7Ci0JdTMyIG1hc2s7Ci0JZG1hX2FkZHJfdCBwYWRkciA9IDA7CisJdTMyIG9mZnNldDsKKwlkbWFfYWRkcl90IG1hc2s7CiAKLQlzc2l6ZSA9IHNpemUgKyBieXRlc19hbGlnbjsKLQlidWYtPnZhZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc3NpemUsICZwYWRkciwgR0ZQX0RNQSB8Ci0JCQkJCQkJICAgICBfX0dGUF9aRVJPKTsKKwlidWYtPnZhZGRyID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSArIGJ5dGVzX2FsaWduLCAmYnVmLT5wYWRkciwKKwkJCQkgICBHRlBfRE1BIHwgX19HRlBfWkVSTyk7CiAJaWYgKCFidWYtPnZhZGRyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWJ1Zi0+cGFkZHIgPSAoX191MzIpIHBhZGRyOwotCiAJbWFzayA9IGJ5dGVzX2FsaWduIC0gMTsKLQlvZmZzZXQgPSAodTMyKWJ1Zi0+cGFkZHIgJiBtYXNrOworCW9mZnNldCA9IGJ1Zi0+cGFkZHIgJiBtYXNrOwogCWlmIChvZmZzZXQpIHsKIAkJYnVmLT5vZmZzZXQgPSBieXRlc19hbGlnbiAtIG9mZnNldDsKLQkJYnVmLT5wYWRkciA9ICh1MzIpYnVmLT5wYWRkciArIG9mZnNldDsKKwkJYnVmLT5wYWRkciA9IGJ1Zi0+cGFkZHIgKyBvZmZzZXQ7CiAJfSBlbHNlCiAJCWJ1Zi0+b2Zmc2V0ID0gMDsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBmcmVlX2J1ZihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkaXVfYWRkciAqYnVmLCB1MzIgc2l6ZSwKIAkJICAgICB1MzIgYnl0ZXNfYWxpZ24pCiB7Ci0JZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplICsgYnl0ZXNfYWxpZ24sCi0JCQkJYnVmLT52YWRkciwgKGJ1Zi0+cGFkZHIgLSBidWYtPm9mZnNldCkpOwotCXJldHVybjsKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUgKyBieXRlc19hbGlnbiwgYnVmLT52YWRkciwKKwkJCSAgYnVmLT5wYWRkciAtIGJ1Zi0+b2Zmc2V0KTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfbW9uaXRvcihzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCWludCBvbGRfbW9uaXRvcl9wb3J0OwotCXVuc2lnbmVkIGxvbmcgdmFsOworCWVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgb2xkX21vbml0b3JfcG9ydDsKIAlzdHJ1Y3QgZnNsX2RpdV9kYXRhICptYWNoaW5lX2RhdGEgPQogCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGZzbF9kaXVfZGF0YSwgZGV2X2F0dHIpOwogCi0JaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpKQotCQlyZXR1cm4gMDsKLQogCW9sZF9tb25pdG9yX3BvcnQgPSBtYWNoaW5lX2RhdGEtPm1vbml0b3JfcG9ydDsKLQltYWNoaW5lX2RhdGEtPm1vbml0b3JfcG9ydCA9IGRpdV9vcHMuc2V0X3N5c2ZzX21vbml0b3JfcG9ydCh2YWwpOworCW1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0ID0gZnNsX2RpdV9uYW1lX3RvX3BvcnQoYnVmKTsKIAogCWlmIChvbGRfbW9uaXRvcl9wb3J0ICE9IG1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0KSB7CiAJCS8qIEFsbCBBT0lzIG5lZWQgYWRqdXN0IHBpeGVsIGZvcm1hdApAQCAtMTQ2OCwxNiArMTQ4MiwyNSBAQAogewogCXN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSA9CiAJCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgZnNsX2RpdV9kYXRhLCBkZXZfYXR0cik7Ci0JcmV0dXJuIGRpdV9vcHMuc2hvd19tb25pdG9yX3BvcnQobWFjaGluZV9kYXRhLT5tb25pdG9yX3BvcnQsIGJ1Zik7CisKKwlzd2l0Y2ggKG1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0KSB7CisJY2FzZSBGU0xfRElVX1BPUlRfRFZJOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJEVklcbiIpOworCWNhc2UgRlNMX0RJVV9QT1JUX0xWRFM6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlNpbmdsZS1saW5rIExWRFNcbiIpOworCWNhc2UgRlNMX0RJVV9QT1JUX0RMVkRTOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJEdWFsLWxpbmsgTFZEU1xuIik7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGZzbF9kaXVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmc2xfZGl1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IG1mYl9pbmZvICptZmJpOwotCXBoeXNfYWRkcl90IGR1bW15X2FkX2FkZHI7CisJcGh5c19hZGRyX3QgZHVtbXlfYWRfYWRkciA9IDA7CiAJaW50IHJldCwgaSwgZXJyb3IgPSAwOwotCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhOwogCWludCBkaXVfbW9kZTsKIApAQCAtMTQ4NSwxMSArMTUwOCwxMyBAQAogCWlmICghbWFjaGluZV9kYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXNwaW5fbG9ja19pbml0KCZtYWNoaW5lX2RhdGEtPnJlZ19sb2NrKTsKKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKSB7CiAJCW1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvW2ldID0KLQkJCWZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgbWZiX2luZm8pLCAmb2ZkZXYtPmRldik7CisJCQlmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IG1mYl9pbmZvKSwgJnBkZXYtPmRldik7CiAJCWlmICghbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baV0pIHsKLQkJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3IyOwogCQl9CkBAIC0xNDk3LDcgKzE1MjIsNyBAQAogCQltZW1jcHkobWZiaSwgJm1mYl90ZW1wbGF0ZVtpXSwgc2l6ZW9mKHN0cnVjdCBtZmJfaW5mbykpOwogCQltZmJpLT5wYXJlbnQgPSBtYWNoaW5lX2RhdGE7CiAKLQkJaWYgKG1mYmktPmluZGV4ID09IDApIHsKKwkJaWYgKG1mYmktPmluZGV4ID09IFBMQU5FMCkgewogCQkJY29uc3QgdTggKnByb3A7CiAJCQlpbnQgbGVuOwogCkBAIC0xNTA5LDYwICsxNTM0LDQ5IEBACiAJCX0KIAl9CiAKLQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjb3VsZCBub3Qgb2J0YWluIERJVSBhZGRyZXNzXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKCFyZXMuc3RhcnQpIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImludmFsaWQgRElVIGFkZHJlc3NcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlkZXZfZGJnKCZvZmRldi0+ZGV2LCAiJXMsIHJlcy5zdGFydDogMHglMDh4XG4iLCBfX2Z1bmNfXywgcmVzLnN0YXJ0KTsKLQotCWRyLmRpdV9yZWcgPSBpb3JlbWFwKHJlcy5zdGFydCwgc2l6ZW9mKHN0cnVjdCBkaXUpKTsKLQlpZiAoIWRyLmRpdV9yZWcpIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgIkVycjogY2FuJ3QgbWFwIERJVSByZWdpc3RlcnMhXG4iKTsKKwltYWNoaW5lX2RhdGEtPmRpdV9yZWcgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCFtYWNoaW5lX2RhdGEtPmRpdV9yZWcpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG1hcCBESVUgcmVnaXN0ZXJzXG4iKTsKIAkJcmV0ID0gLUVGQVVMVDsKIAkJZ290byBlcnJvcjI7CiAJfQogCi0JZGl1X21vZGUgPSBpbl9iZTMyKCZkci5kaXVfcmVnLT5kaXVfbW9kZSk7Ci0JaWYgKGRpdV9tb2RlICE9IE1GQl9NT0RFMSkKLQkJb3V0X2JlMzIoJmRyLmRpdV9yZWctPmRpdV9tb2RlLCAwKTsJLyogZGlzYWJsZSBESVUgKi8KKwlkaXVfbW9kZSA9IGluX2JlMzIoJm1hY2hpbmVfZGF0YS0+ZGl1X3JlZy0+ZGl1X21vZGUpOworCWlmIChkaXVfbW9kZSA9PSBNRkJfTU9ERTApCisJCW91dF9iZTMyKCZtYWNoaW5lX2RhdGEtPmRpdV9yZWctPmRpdV9tb2RlLCAwKTsgLyogZGlzYWJsZSBESVUgKi8KIAogCS8qIEdldCB0aGUgSVJRIG9mIHRoZSBESVUgKi8KIAltYWNoaW5lX2RhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKIAogCWlmICghbWFjaGluZV9kYXRhLT5pcnEpIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgRElVIElSUVxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgRElVIElSUVxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyb3I7CiAJfQogCW1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0ID0gbW9uaXRvcl9wb3J0OwogCiAJLyogQXJlYSBkZXNjcmlwdG9yIG1lbW9yeSBwb29sIGFsaWducyB0byA2NC1iaXQgYm91bmRhcnkgKi8KLQlpZiAoYWxsb2NhdGVfYnVmKCZvZmRldi0+ZGV2LCAmcG9vbC5hZCwKKwlpZiAoYWxsb2NhdGVfYnVmKCZwZGV2LT5kZXYsICZtYWNoaW5lX2RhdGEtPmFkLAogCQkJIHNpemVvZihzdHJ1Y3QgZGl1X2FkKSAqIEZTTF9BT0lfTlVNLCA4KSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBHZXQgbWVtb3J5IGZvciBHYW1tYSBUYWJsZSAgLSAzMi1ieXRlIGFsaWduZWQgbWVtb3J5ICovCi0JaWYgKGFsbG9jYXRlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuZ2FtbWEsIDc2OCwgMzIpKSB7CisJaWYgKGFsbG9jYXRlX2J1ZigmcGRldi0+ZGV2LCAmbWFjaGluZV9kYXRhLT5nYW1tYSwgNzY4LCAzMikpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CiAKIAkvKiBGb3IgcGVyZm9ybWFuY2UsIGN1cnNvciBiaXRtYXAgYnVmZmVyIGFsaWducyB0byAzMi1ieXRlIGJvdW5kYXJ5ICovCi0JaWYgKGFsbG9jYXRlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuY3Vyc29yLCBNQVhfQ1VSUyAqIE1BWF9DVVJTICogMiwKLQkJCSAzMikpIHsKKwlpZiAoYWxsb2NhdGVfYnVmKCZwZGV2LT5kZXYsICZtYWNoaW5lX2RhdGEtPmN1cnNvciwKKwkJCSBNQVhfQ1VSUyAqIE1BWF9DVVJTICogMiwgMzIpKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJaSA9IEFSUkFZX1NJWkUobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm8pOwotCW1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQgPSAoc3RydWN0IGRpdV9hZCAqKQotCQkJKCh1MzIpcG9vbC5hZC52YWRkciArIHBvb2wuYWQub2Zmc2V0KSArIGk7Ci0JbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIgPSBwb29sLmFkLnBhZGRyICsKKwltYWNoaW5lX2RhdGEtPmR1bW15X2FkID0gKHN0cnVjdCBkaXVfYWQgKikoKHUzMiltYWNoaW5lX2RhdGEtPmFkLnZhZGRyICsKKwkJCW1hY2hpbmVfZGF0YS0+YWQub2Zmc2V0KSArIGk7CisJbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIgPSBtYWNoaW5lX2RhdGEtPmFkLnBhZGRyICsKIAkJCWkgKiBzaXplb2Yoc3RydWN0IGRpdV9hZCk7CiAJbWFjaGluZV9kYXRhLT5kdW1teV9hb2lfdmlydCA9IGZzbF9kaXVfYWxsb2MoNjQsICZkdW1teV9hZF9hZGRyKTsKIAlpZiAoIW1hY2hpbmVfZGF0YS0+ZHVtbXlfYW9pX3ZpcnQpIHsKQEAgLTE1ODEsMzAgKzE1OTUsMjkgQEAKIAkgKiBMZXQgRElVIGRpc3BsYXkgc3BsYXNoIHNjcmVlbiBpZiBpdCB3YXMgcHJlLWluaXRpYWxpemVkCiAJICogYnkgdGhlIGJvb3Rsb2FkZXIsIHNldCBkdW1teSBhcmVhIGRlc2NyaXB0b3Igb3RoZXJ3aXNlLgogCSAqLwotCWlmIChkaXVfbW9kZSAhPSBNRkJfTU9ERTEpCi0JCW91dF9iZTMyKCZkci5kaXVfcmVnLT5kZXNjWzBdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CisJaWYgKGRpdV9tb2RlID09IE1GQl9NT0RFMCkKKwkJb3V0X2JlMzIoJm1hY2hpbmVfZGF0YS0+ZGl1X3JlZy0+ZGVzY1swXSwKKwkJCSBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CiAKLQlvdXRfYmUzMigmZHIuZGl1X3JlZy0+ZGVzY1sxXSwgbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpOwotCW91dF9iZTMyKCZkci5kaXVfcmVnLT5kZXNjWzJdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CisJb3V0X2JlMzIoJm1hY2hpbmVfZGF0YS0+ZGl1X3JlZy0+ZGVzY1sxXSwgbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpOworCW91dF9iZTMyKCZtYWNoaW5lX2RhdGEtPmRpdV9yZWctPmRlc2NbMl0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKSB7CiAJCW1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvW2ldLT5maXguc21lbV9zdGFydCA9IDA7CiAJCW1mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1tpXS0+cGFyOwotCQltZmJpLT5hZCA9IChzdHJ1Y3QgZGl1X2FkICopKCh1MzIpcG9vbC5hZC52YWRkcgotCQkJCQkrIHBvb2wuYWQub2Zmc2V0KSArIGk7Ci0JCW1mYmktPmFkLT5wYWRkciA9IHBvb2wuYWQucGFkZHIgKyBpICogc2l6ZW9mKHN0cnVjdCBkaXVfYWQpOworCQltZmJpLT5hZCA9IChzdHJ1Y3QgZGl1X2FkICopKCh1MzIpbWFjaGluZV9kYXRhLT5hZC52YWRkcgorCQkJCQkrIG1hY2hpbmVfZGF0YS0+YWQub2Zmc2V0KSArIGk7CisJCW1mYmktPmFkLT5wYWRkciA9CisJCQltYWNoaW5lX2RhdGEtPmFkLnBhZGRyICsgaSAqIHNpemVvZihzdHJ1Y3QgZGl1X2FkKTsKIAkJcmV0ID0gaW5zdGFsbF9mYihtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1tpXSk7CiAJCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJm9mZGV2LT5kZXYsCi0JCQkJIkZhaWxlZCB0byByZWdpc3RlciBmcmFtZWJ1ZmZlciAlZFxuIiwKLQkJCQlpKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBmYiAlZFxuIiwgaSk7CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxX2xvY2FsKG1hY2hpbmVfZGF0YS0+aXJxKSkgewotCQlkZXZfZXJyKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzBdLT5kZXYsCi0JCQkiY291bGQgbm90IHJlcXVlc3QgaXJxIGZvciBkaXUuIik7CisJaWYgKHJlcXVlc3RfaXJxX2xvY2FsKG1hY2hpbmVfZGF0YSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGNsYWltIGlycVxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0xNjE2LDI5ICsxNjI5LDI4IEBACiAJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bMF0tPmRldiwKIAkJCQkgICZtYWNoaW5lX2RhdGEtPmRldl9hdHRyKTsKIAlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycihtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1swXS0+ZGV2LAotCQkJImNvdWxkIG5vdCBjcmVhdGUgc3lzZnMgJXMgZmlsZVxuIiwKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGNyZWF0ZSBzeXNmcyBmaWxlICVzXG4iLAogCQkJbWFjaGluZV9kYXRhLT5kZXZfYXR0ci5hdHRyLm5hbWUpOwogCX0KIAotCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgbWFjaGluZV9kYXRhKTsKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbWFjaGluZV9kYXRhKTsKIAlyZXR1cm4gMDsKIAogZXJyb3I6Ci0JZm9yIChpID0gQVJSQVlfU0laRShtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mbyk7Ci0JCWkgPiAwOyBpLS0pCi0JCXVuaW5zdGFsbF9mYihtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1tpIC0gMV0pOwotCWlmIChwb29sLmFkLnZhZGRyKQotCQlmcmVlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuYWQsCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm8pOyBpKyspCisJCXVuaW5zdGFsbF9mYihtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1tpXSk7CisKKwlpZiAobWFjaGluZV9kYXRhLT5hZC52YWRkcikKKwkJZnJlZV9idWYoJnBkZXYtPmRldiwgJm1hY2hpbmVfZGF0YS0+YWQsCiAJCQkgc2l6ZW9mKHN0cnVjdCBkaXVfYWQpICogRlNMX0FPSV9OVU0sIDgpOwotCWlmIChwb29sLmdhbW1hLnZhZGRyKQotCQlmcmVlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuZ2FtbWEsIDc2OCwgMzIpOwotCWlmIChwb29sLmN1cnNvci52YWRkcikKLQkJZnJlZV9idWYoJm9mZGV2LT5kZXYsICZwb29sLmN1cnNvciwgTUFYX0NVUlMgKiBNQVhfQ1VSUyAqIDIsCi0JCQkgMzIpOworCWlmIChtYWNoaW5lX2RhdGEtPmdhbW1hLnZhZGRyKQorCQlmcmVlX2J1ZigmcGRldi0+ZGV2LCAmbWFjaGluZV9kYXRhLT5nYW1tYSwgNzY4LCAzMik7CisJaWYgKG1hY2hpbmVfZGF0YS0+Y3Vyc29yLnZhZGRyKQorCQlmcmVlX2J1ZigmcGRldi0+ZGV2LCAmbWFjaGluZV9kYXRhLT5jdXJzb3IsCisJCQkgTUFYX0NVUlMgKiBNQVhfQ1VSUyAqIDIsIDMyKTsKIAlpZiAobWFjaGluZV9kYXRhLT5kdW1teV9hb2lfdmlydCkKIAkJZnNsX2RpdV9mcmVlKG1hY2hpbmVfZGF0YS0+ZHVtbXlfYW9pX3ZpcnQsIDY0KTsKLQlpb3VubWFwKGRyLmRpdV9yZWcpOworCWlvdW5tYXAobWFjaGluZV9kYXRhLT5kaXVfcmVnKTsKIAogZXJyb3IyOgogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKQpAQCAtMTY0OSwyOCArMTY2MSwyNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLQotc3RhdGljIGludCBmc2xfZGl1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKK3N0YXRpYyBpbnQgZnNsX2RpdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZnNsX2RpdV9kYXRhICptYWNoaW5lX2RhdGE7CiAJaW50IGk7CiAKLQltYWNoaW5lX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJm9mZGV2LT5kZXYpOworCW1hY2hpbmVfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKIAlkaXNhYmxlX2xjZGMobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bMF0pOwotCWZyZWVfaXJxX2xvY2FsKG1hY2hpbmVfZGF0YS0+aXJxKTsKLQlmb3IgKGkgPSBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSA+IDA7IGktLSkKLQkJdW5pbnN0YWxsX2ZiKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvW2kgLSAxXSk7Ci0JaWYgKHBvb2wuYWQudmFkZHIpCi0JCWZyZWVfYnVmKCZvZmRldi0+ZGV2LCAmcG9vbC5hZCwKKwlmcmVlX2lycV9sb2NhbChtYWNoaW5lX2RhdGEpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKQorCQl1bmluc3RhbGxfZmIobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baV0pOworCWlmIChtYWNoaW5lX2RhdGEtPmFkLnZhZGRyKQorCQlmcmVlX2J1ZigmcGRldi0+ZGV2LCAmbWFjaGluZV9kYXRhLT5hZCwKIAkJCSBzaXplb2Yoc3RydWN0IGRpdV9hZCkgKiBGU0xfQU9JX05VTSwgOCk7Ci0JaWYgKHBvb2wuZ2FtbWEudmFkZHIpCi0JCWZyZWVfYnVmKCZvZmRldi0+ZGV2LCAmcG9vbC5nYW1tYSwgNzY4LCAzMik7Ci0JaWYgKHBvb2wuY3Vyc29yLnZhZGRyKQotCQlmcmVlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuY3Vyc29yLCBNQVhfQ1VSUyAqIE1BWF9DVVJTICogMiwKLQkJCSAzMik7CisJaWYgKG1hY2hpbmVfZGF0YS0+Z2FtbWEudmFkZHIpCisJCWZyZWVfYnVmKCZwZGV2LT5kZXYsICZtYWNoaW5lX2RhdGEtPmdhbW1hLCA3NjgsIDMyKTsKKwlpZiAobWFjaGluZV9kYXRhLT5jdXJzb3IudmFkZHIpCisJCWZyZWVfYnVmKCZwZGV2LT5kZXYsICZtYWNoaW5lX2RhdGEtPmN1cnNvciwKKwkJCSBNQVhfQ1VSUyAqIE1BWF9DVVJTICogMiwgMzIpOwogCWlmIChtYWNoaW5lX2RhdGEtPmR1bW15X2FvaV92aXJ0KQogCQlmc2xfZGl1X2ZyZWUobWFjaGluZV9kYXRhLT5kdW1teV9hb2lfdmlydCwgNjQpOwotCWlvdW5tYXAoZHIuZGl1X3JlZyk7CisJaW91bm1hcChtYWNoaW5lX2RhdGEtPmRpdV9yZWcpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKQogCQlpZiAobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baV0pCiAJCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvW2ldKTsKQEAgLTE2OTIsOCArMTcwMyw3IEBACiAJCWlmICghKm9wdCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXN0cm5jbXAob3B0LCAibW9uaXRvcj0iLCA4KSkgewotCQkJaWYgKCFzdHJpY3Rfc3RydG91bChvcHQgKyA4LCAxMCwgJnZhbCkgJiYgKHZhbCA8PSAyKSkKLQkJCQltb25pdG9yX3BvcnQgPSB2YWw7CisJCQltb25pdG9yX3BvcnQgPSBmc2xfZGl1X25hbWVfdG9fcG9ydChvcHQgKyA4KTsKIAkJfSBlbHNlIGlmICghc3RybmNtcChvcHQsICJicHA9IiwgNCkpIHsKIAkJCWlmICghc3RyaWN0X3N0cnRvdWwob3B0ICsgNCwgMTAsICZ2YWwpKQogCQkJCWRlZmF1bHRfYnBwID0gdmFsOwpAQCAtMTcyMCw3ICsxNzMwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX2RpdV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiZnNsX2RpdSIsCisJCS5uYW1lID0gImZzbC1kaXUtZmIiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gZnNsX2RpdV9tYXRjaCwKIAl9LApAQCAtMTc0Niw0OCArMTc1Niw1NCBAQAogCWlmIChmYl9nZXRfb3B0aW9ucygiZnNsZmIiLCAmb3B0aW9uKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJZnNsX2RpdV9zZXR1cChvcHRpb24pOworI2Vsc2UKKwltb25pdG9yX3BvcnQgPSBmc2xfZGl1X25hbWVfdG9fcG9ydChtb25pdG9yX3N0cmluZyk7CiAjZW5kaWYKLQlwcmludGsoS0VSTl9JTkZPICJGcmVlc2NhbGUgRElVIGRyaXZlclxuIik7CisJcHJfaW5mbygiRnJlZXNjYWxlIERpc3BsYXkgSW50ZXJmYWNlIFVuaXQgKERJVSkgZnJhbWVidWZmZXIgZHJpdmVyXG4iKTsKIAogI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKIAlpZiAoIW5wKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyOiBjYW4ndCBmaW5kIGRldmljZSBub2RlICdjcHUnXG4iKTsKKwkJcHJfZXJyKCJmc2wtZGl1LWZiOiBjYW4ndCBmaW5kICdjcHUnIGRldmljZSBub2RlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImQtY2FjaGUtc2l6ZSIsIE5VTEwpOwogCWlmIChwcm9wID09IE5VTEwpIHsKKwkJcHJfZXJyKCJmc2wtZGl1LWZiOiBtaXNzaW5nICdkLWNhY2hlLXNpemUnIHByb3BlcnR5JyAiCisJCSAgICAgICAiaW4gJ2NwdScgbm9kZVxuIik7CiAJCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyogRnJlZXNjYWxlIFBMUlUgcmVxdWlyZXMgMTMvOCB0aW1lcyB0aGUgY2FjaGUgc2l6ZSB0byBkbyBhIHByb3BlcgotCSAgIGRpc3BsYWNlbWVudCBmbHVzaAorCS8qCisJICogRnJlZXNjYWxlIFBMUlUgcmVxdWlyZXMgMTMvOCB0aW1lcyB0aGUgY2FjaGUgc2l6ZSB0byBkbyBhIHByb3BlcgorCSAqIGRpc3BsYWNlbWVudCBmbHVzaAogCSAqLwotCWNvaGVyZW5jZV9kYXRhX3NpemUgPSAqcHJvcCAqIDEzOworCWNvaGVyZW5jZV9kYXRhX3NpemUgPSBiZTMyX3RvX2NwdXAocHJvcCkgKiAxMzsKIAljb2hlcmVuY2VfZGF0YV9zaXplIC89IDg7CiAKIAlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZC1jYWNoZS1saW5lLXNpemUiLCBOVUxMKTsKIAlpZiAocHJvcCA9PSBOVUxMKSB7CisJCXByX2VycigiZnNsLWRpdS1mYjogbWlzc2luZyAnZC1jYWNoZS1saW5lLXNpemUnIHByb3BlcnR5JyAiCisJCSAgICAgICAiaW4gJ2NwdScgbm9kZVxuIik7CiAJCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWRfY2FjaGVfbGluZV9zaXplID0gKnByb3A7CisJZF9jYWNoZV9saW5lX3NpemUgPSBiZTMyX3RvX2NwdXAocHJvcCk7CiAKIAlvZl9ub2RlX3B1dChucCk7CiAJY29oZXJlbmNlX2RhdGEgPSB2bWFsbG9jKGNvaGVyZW5jZV9kYXRhX3NpemUpOwogCWlmICghY29oZXJlbmNlX2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogI2VuZGlmCisKIAlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzbF9kaXVfZHJpdmVyKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJImZzbC1kaXU6IGZhaWxlZCB0byByZWdpc3RlciBwbGF0Zm9ybSBkcml2ZXJcbiIpOworCQlwcl9lcnIoImZzbC1kaXUtZmI6IGZhaWxlZCB0byByZWdpc3RlciBwbGF0Zm9ybSBkcml2ZXJcbiIpOwogI2lmIGRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKIAkJdmZyZWUoY29oZXJlbmNlX2RhdGEpOwogI2VuZGlmCi0JCWlvdW5tYXAoZHIuZGl1X3JlZyk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0xODExLDggKzE4MjcsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhtb2RlLAogCSJTcGVjaWZ5IHJlc29sdXRpb24gYXMgXCI8eHJlcz54PHlyZXM+Wy08YnBwPl1bQDxyZWZyZXNoPl1cIiAiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChicHAsIGRlZmF1bHRfYnBwLCB1bG9uZywgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGJwcCwgIlNwZWNpZnkgYml0LXBlci1waXhlbCBpZiBub3Qgc3BlY2lmaWVkIG1vZGUiKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChtb25pdG9yLCBtb25pdG9yX3BvcnQsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1vbml0b3IsCi0JIlNwZWNpZnkgdGhlIG1vbml0b3IgcG9ydCAoMCwgMSBvciAyKSBpZiBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIik7CitNT0RVTEVfUEFSTV9ERVNDKGJwcCwgIlNwZWNpZnkgYml0LXBlci1waXhlbCBpZiBub3Qgc3BlY2lmaWVkIGluICdtb2RlJyIpOworbW9kdWxlX3BhcmFtX25hbWVkKG1vbml0b3IsIG1vbml0b3Jfc3RyaW5nLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vbml0b3IsICJTcGVjaWZ5IHRoZSBtb25pdG9yIHBvcnQgIgorCSIoXCJkdmlcIiwgXCJsdmRzXCIsIG9yIFwiZGx2ZHNcIikgaWYgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2czNjRmYi5jIGIvZHJpdmVycy92aWRlby9nMzY0ZmIuYwppbmRleCBkNjYyMzE3Li4yMjM4OTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2czNjRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZzM2NGZiLmMKQEAgLTE0OSwxMCArMTQ5LDExIEBACiBzdGF0aWMgaW50IGczNjRmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgCiAJCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlpZiAodmFyLT54b2Zmc2V0IHx8IHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKQorCWlmICh2YXItPnhvZmZzZXQgfHwKKwkgICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSoodW5zaWduZWQgaW50ICopIFRPUF9SRUcgPSB2YXItPnlvZmZzZXQgKiB2YXItPnhyZXM7CisJKih1bnNpZ25lZCBpbnQgKikgVE9QX1JFRyA9IHZhci0+eW9mZnNldCAqIGluZm8tPnZhci54cmVzOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dydmdhLmMgYi9kcml2ZXJzL3ZpZGVvL2dydmdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3ZTAyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vZ3J2Z2EuYwpAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqIERyaXZlciBmb3IgQWVyb2ZsZXggR2Fpc2xlciBTVkdBQ1RSTCBmcmFtZWJ1ZmZlciBkZXZpY2UuCisgKgorICogMjAxMSAoYykgQWVyb2ZsZXggR2Fpc2xlciBBQgorICoKKyAqIEZ1bGwgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29yZSBjYW4gYmUgZm91bmQgaGVyZToKKyAqIGh0dHA6Ly93d3cuZ2Fpc2xlci5jb20vcHJvZHVjdHMvZ3JsaWIvZ3JpcC5wZGYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvbnRyaWJ1dG9yczogS3Jpc3RvZmZlciBHbGVtYm8gPGtyaXN0b2ZmZXJAZ2Fpc2xlci5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKK3N0cnVjdCBncnZnYV9yZWdzIHsKKwl1MzIgc3RhdHVzOyAJCS8qIDB4MDAgKi8KKwl1MzIgdmlkZW9fbGVuZ3RoOyAJLyogMHgwNCAqLworCXUzMiBmcm9udF9wb3JjaDsJLyogMHgwOCAqLworCXUzMiBzeW5jX2xlbmd0aDsJLyogMHgwQyAqLworCXUzMiBsaW5lX2xlbmd0aDsJLyogMHgxMCAqLworCXUzMiBmYl9wb3M7CQkvKiAweDE0ICovCisJdTMyIGNsa192ZWN0b3JbNF07CS8qIDB4MTggKi8KKwl1MzIgY2x1dDsJICAgICAgICAvKiAweDIwICovCit9OworCitzdHJ1Y3QgZ3J2Z2FfcGFyIHsKKwlzdHJ1Y3QgZ3J2Z2FfcmVncyAqcmVnczsKKwl1MzIgY29sb3JfcGFsZXR0ZVsxNl07ICAvKiAxNiBlbnRyeSBwc2V1ZG8gcGFsZXR0ZSB1c2VkIGJ5IGZiY29uIGluIHRydWUgY29sb3IgbW9kZSAqLworCWludCBjbGtfc2VsOworCWludCBmYl9hbGxvY2VkOyAgICAgICAgIC8qID0gMSBpZiBmcmFtZWJ1ZmZlciBpcyBhbGxvY2F0ZWQgaW4gbWFpbiBtZW1vcnkgKi8KK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgZ3J2Z2FfbW9kZWRiW10gPSB7CisgICAgeworCS8qIDY0MHg0ODAgQCA2MCBIeiAqLworCU5VTEwsIDYwLCA2NDAsIDQ4MCwgNDAwMDAsIDQ4LCAxNiwgMzksIDExLCA5NiwgMiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDgwMHg2MDAgQCA2MCBIeiAqLworCU5VTEwsIDYwLCA4MDAsIDYwMCwgMjUwMDAsIDg4LCA0MCwgMjMsIDEsIDEyOCwgNCwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDgwMHg2MDAgQCA3MiBIeiAqLworCU5VTEwsIDcyLCA4MDAsIDYwMCwgMjAwMDAsIDY0LCA1NiwgMjMsIDM3LCAxMjAsIDYsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMDI0eDc2OCBAIDYwIEh6ICovCisJTlVMTCwgNjAsIDEwMjQsIDc2OCwgMTUzODUsIDE2MCwgMjQsIDI5LCAzLCAxMzYsIDYsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0KKyB9OworCitzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGdydmdhX2ZpeCBfX2luaXRkYXRhID0geworCS5pZCA9CQkiQUcgU1ZHQUNUUkwiLAorCS50eXBlID0JCUZCX1RZUEVfUEFDS0VEX1BJWEVMUywKKwkudmlzdWFsID0gICAgICAgRkJfVklTVUFMX1BTRVVET0NPTE9SLAorCS54cGFuc3RlcCA9CTAsCisJLnlwYW5zdGVwID0JMSwKKwkueXdyYXBzdGVwID0JMCwKKwkuYWNjZWwgPQlGQl9BQ0NFTF9OT05FLAorfTsKKworc3RhdGljIGludCBncnZnYV9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZ3J2Z2FfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJaW50IGk7CisKKwlpZiAoIXZhci0+eHJlcykKKwkJdmFyLT54cmVzID0gMTsKKwlpZiAoIXZhci0+eXJlcykKKwkJdmFyLT55cmVzID0gMTsKKwlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSA4KQorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gODsKKwllbHNlIGlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDw9IDE2KQorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJZWxzZSBpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSAyNCkKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDI0OworCWVsc2UgaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPD0gMzIpCisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAzMjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CisJdmFyLT55cmVzX3ZpcnR1YWwgPSAyKnZhci0+eXJlczsKKworCWlmIChpbmZvLT5maXguc21lbV9sZW4pIHsKKwkJaWYgKCh2YXItPnlyZXNfdmlydHVhbCp2YXItPnhyZXNfdmlydHVhbCp2YXItPmJpdHNfcGVyX3BpeGVsLzgpID4gaW5mby0+Zml4LnNtZW1fbGVuKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogV2hpY2ggY2xvY2tzIHRoYXQgYXJlIGF2YWlsYWJsZSBjYW4gYmUgcmVhZCBvdXQgaW4gdGhlc2UgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8PSAzIDsgaSsrKSB7CisJCWlmICh2YXItPnBpeGNsb2NrID09IHBhci0+cmVncy0+Y2xrX3ZlY3RvcltpXSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA8PSAzKQorCQlwYXItPmNsa19zZWwgPSBpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgODoKKwkJdmFyLT5yZWQgICA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpIHswLCA4LCAwfTsgICAgICAvKiBvZmZzZXQsIGxlbmd0aCwgbXNiLXJpZ2h0ICovCisJCXZhci0+Z3JlZW4gPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7MCwgOCwgMH07CisJCXZhci0+Ymx1ZSAgPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7MCwgOCwgMH07CisJCXZhci0+dHJhbnNwID0gKHN0cnVjdCBmYl9iaXRmaWVsZCkgezAsIDAsIDB9OworCQlicmVhazsKKwljYXNlIDE2OgorCQl2YXItPnJlZCAgID0gKHN0cnVjdCBmYl9iaXRmaWVsZCkgezExLCA1LCAwfTsKKwkJdmFyLT5ncmVlbiA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpIHs1LCA2LCAwfTsKKwkJdmFyLT5ibHVlICA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpIHswLCA1LCAwfTsKKwkJdmFyLT50cmFuc3AgPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7MCwgMCwgMH07CisJCWJyZWFrOworCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwkJdmFyLT5yZWQgICA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpIHsxNiwgOCwgMH07CisJCXZhci0+Z3JlZW4gPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7OCwgOCwgMH07CisJCXZhci0+Ymx1ZSAgPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7MCwgOCwgMH07CisJCXZhci0+dHJhbnNwID0gKHN0cnVjdCBmYl9iaXRmaWVsZCkgezI0LCA4LCAwfTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3J2Z2Ffc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKworCXUzMiBmdW5jID0gMDsKKwlzdHJ1Y3QgZ3J2Z2FfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwlfX3Jhd193cml0ZWwoKChpbmZvLT52YXIueXJlcyAtIDEpIDw8IDE2KSB8IChpbmZvLT52YXIueHJlcyAtIDEpLAorCQkgICAgICZwYXItPnJlZ3MtPnZpZGVvX2xlbmd0aCk7CisKKwlfX3Jhd193cml0ZWwoKGluZm8tPnZhci5sb3dlcl9tYXJnaW4gPDwgMTYpIHwgKGluZm8tPnZhci5yaWdodF9tYXJnaW4pLAorCQkgICAgICZwYXItPnJlZ3MtPmZyb250X3BvcmNoKTsKKworCV9fcmF3X3dyaXRlbCgoaW5mby0+dmFyLnZzeW5jX2xlbiA8PCAxNikgfCAoaW5mby0+dmFyLmhzeW5jX2xlbiksCisJCSAgICAgJnBhci0+cmVncy0+c3luY19sZW5ndGgpOworCisJX19yYXdfd3JpdGVsKCgoaW5mby0+dmFyLnlyZXMgKyBpbmZvLT52YXIubG93ZXJfbWFyZ2luICsgaW5mby0+dmFyLnVwcGVyX21hcmdpbiArIGluZm8tPnZhci52c3luY19sZW4gLSAxKSA8PCAxNikgfAorCQkgICAgIChpbmZvLT52YXIueHJlcyArIGluZm8tPnZhci5yaWdodF9tYXJnaW4gKyBpbmZvLT52YXIubGVmdF9tYXJnaW4gKyBpbmZvLT52YXIuaHN5bmNfbGVuIC0gMSksCisJCSAgICAgJnBhci0+cmVncy0+bGluZV9sZW5ndGgpOworCisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CisJCWZ1bmMgPSAxOworCQlicmVhazsKKwljYXNlIDE2OgorCQlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJZnVuYyA9IDI7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCWZ1bmMgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlfX3Jhd193cml0ZWwoKHBhci0+Y2xrX3NlbCA8PCA2KSB8IChmdW5jIDw8IDQpIHwgMSwKKwkJICAgICAmcGFyLT5yZWdzLT5zdGF0dXMpOworCisJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwqaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKS84OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdydmdhX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZ3J2Z2FfcGFyICpwYXI7CisJcGFyID0gaW5mby0+cGFyOworCisJaWYgKHJlZ25vID49IDI1NikJLyogU2l6ZSBvZiBDTFVUICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGluZm8tPnZhci5ncmF5c2NhbGUpIHsKKwkJLyogZ3JheXNjYWxlID0gMC4zMCpSICsgMC41OSpHICsgMC4xMSpCICovCisJCXJlZCA9IGdyZWVuID0gYmx1ZSA9IChyZWQgKiA3NyArIGdyZWVuICogMTUxICsgYmx1ZSAqIDI4KSA+PiA4OworCX0KKworCisKKyNkZWZpbmUgQ05WVF9UT0hXKHZhbCwgd2lkdGgpICgoKCh2YWwpPDwod2lkdGgpKSsweDdGRkYtKHZhbCkpPj4xNikKKworCXJlZCAgICA9IENOVlRfVE9IVyhyZWQsICAgaW5mby0+dmFyLnJlZC5sZW5ndGgpOworCWdyZWVuICA9IENOVlRfVE9IVyhncmVlbiwgaW5mby0+dmFyLmdyZWVuLmxlbmd0aCk7CisJYmx1ZSAgID0gQ05WVF9UT0hXKGJsdWUsICBpbmZvLT52YXIuYmx1ZS5sZW5ndGgpOworCXRyYW5zcCA9IENOVlRfVE9IVyh0cmFuc3AsIGluZm8tPnZhci50cmFuc3AubGVuZ3RoKTsKKworI3VuZGVmIENOVlRfVE9IVworCisJLyogSW4gUFNFVURPQ09MT1Igd2UgdXNlIHRoZSBoYXJkd2FyZSBDTFVUICovCisJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1BTRVVET0NPTE9SKQorCQlfX3Jhd193cml0ZWwoKHJlZ25vIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZSwKKwkJCSAgICAgJnBhci0+cmVncy0+Y2x1dCk7CisKKwkvKiBUcnVlY29sb3IgdXNlcyB0aGUgcHNldWRvIHBhbGV0dGUgKi8KKwllbHNlIGlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IpIHsKKwkJdTMyIHY7CisJCWlmIChyZWdubyA+PSAxNikKKwkJCXJldHVybiAtRUlOVkFMOworCisKKwkJdiA9ICAgICAocmVkICAgIDw8IGluZm8tPnZhci5yZWQub2Zmc2V0KSAgIHwKKwkJCShncmVlbiAgPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJKGJsdWUgICA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpICB8CisJCQkodHJhbnNwIDw8IGluZm8tPnZhci50cmFuc3Aub2Zmc2V0KTsKKworCQkoKHUzMiAqKSAoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSB2OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncnZnYV9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGdydmdhX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4ID0gJmluZm8tPmZpeDsKKwl1MzIgYmFzZV9hZGRyOworCisJaWYgKHZhci0+eG9mZnNldCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJhc2VfYWRkciA9IGZpeC0+c21lbV9zdGFydCArICh2YXItPnlvZmZzZXQgKiBmaXgtPmxpbmVfbGVuZ3RoKTsKKwliYXNlX2FkZHIgJj0gfjNVTDsKKworCS8qIFNldCBmcmFtZWJ1ZmZlciBiYXNlIGFkZHJlc3MgICovCisJX19yYXdfd3JpdGVsKGJhc2VfYWRkciwKKwkJICAgICAmcGFyLT5yZWdzLT5mYl9wb3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIGdydmdhX29wcyA9IHsKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkuZmJfY2hlY2tfdmFyICAgPSBncnZnYV9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBncnZnYV9zZXRfcGFyLAorCS5mYl9zZXRjb2xyZWcgICA9IGdydmdhX3NldGNvbHJlZywKKwkuZmJfcGFuX2Rpc3BsYXkgPSBncnZnYV9wYW5fZGlzcGxheSwKKwkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBncnZnYV9wYXJzZV9jdXN0b20oY2hhciAqb3B0aW9ucywKKwkJCQkgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqc2NyZWVuZGF0YSkKK3sKKwljaGFyICp0aGlzX29wdDsKKwlpbnQgY291bnQgPSAwOworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAtMTsKKworCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIgIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqdGhpc19vcHQpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGNvdW50KSB7CisJCWNhc2UgMDoKKwkJCXNjcmVlbmRhdGEtPnBpeGNsb2NrID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQsIE5VTEwsIDApOworCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzY3JlZW5kYXRhLT54cmVzID0gc2NyZWVuZGF0YS0+eHJlc192aXJ0dWFsID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQsIE5VTEwsIDApOworCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzY3JlZW5kYXRhLT5yaWdodF9tYXJnaW4gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCwgTlVMTCwgMCk7CisJCQljb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXNjcmVlbmRhdGEtPmhzeW5jX2xlbiA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0LCBOVUxMLCAwKTsKKwkJCWNvdW50Kys7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJc2NyZWVuZGF0YS0+bGVmdF9tYXJnaW4gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCwgTlVMTCwgMCk7CisJCQljb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCXNjcmVlbmRhdGEtPnlyZXMgPSBzY3JlZW5kYXRhLT55cmVzX3ZpcnR1YWwgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCwgTlVMTCwgMCk7CisJCQljb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCXNjcmVlbmRhdGEtPmxvd2VyX21hcmdpbiA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0LCBOVUxMLCAwKTsKKwkJCWNvdW50Kys7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJc2NyZWVuZGF0YS0+dnN5bmNfbGVuID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQsIE5VTEwsIDApOworCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlzY3JlZW5kYXRhLT51cHBlcl9tYXJnaW4gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCwgTlVMTCwgMCk7CisJCQljb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCXNjcmVlbmRhdGEtPmJpdHNfcGVyX3BpeGVsID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQsIE5VTEwsIDApOworCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXNjcmVlbmRhdGEtPmFjdGl2YXRlICA9IEZCX0FDVElWQVRFX05PVzsKKwlzY3JlZW5kYXRhLT52bW9kZSAgICAgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBncnZnYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJdW5zaWduZWQgbG9uZyB2aXJ0dWFsX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgZ3J2Z2FfZml4X2FkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgcGh5c2ljYWxfc3RhcnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZ3J2Z2FfbWVtX3NpemUgPSAwOworCXN0cnVjdCBncnZnYV9wYXIgKnBhciA9IE5VTEw7CisJY2hhciAqb3B0aW9ucyA9IE5VTEwsICptb2RlX29wdCA9IE5VTEw7CisKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBncnZnYV9wYXIpLCAmZGV2LT5kZXYpOworCWlmICghaW5mbykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImZyYW1lYnVmZmVyX2FsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEV4cGVjdGluZzogImdydmdhOiBtb2Rlc3RyaW5nLCBbYWRkcjo8ZnJhbWVidWZmZXIgcGh5c2ljYWwgYWRkcmVzcz5dLCBbc2l6ZTo8ZnJhbWVidWZmZXIgc2l6ZT5dCisJICoKKwkgKiBJZiBtb2Rlc3RyaW5nIGlzIGN1c3RvbTo8Y3VzdG9tIG1vZGUgc3RyaW5nPiB3ZSBwYXJzZSB0aGUgc3RyaW5nIHdoaWNoIHRoZW4gY29udGFpbnMgYWxsIHZpZGVvcGFyYW1ldGVycworCSAqIElmIGFkZHJlc3MgaXMgbGVmdCBvdXQsIHdlIGFsbG9jYXRlIG1lbW9yeSwKKwkgKiBpZiBzaXplIGlzIGxlZnQgb3V0IHdlIG9ubHkgYWxsb2NhdGUgZW5vdWdoIHRvIHN1cHBvcnQgdGhlIGdpdmVuIG1vZGUuCisJICovCisJaWYgKGZiX2dldF9vcHRpb25zKCJncnZnYSIsICZvcHRpb25zKSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlvcHRpb25zID0gICI2NDB4NDgwLThANjAiOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqdGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIik7CisKKwkJaWYgKCF0aGlzX29wdCkKKwkJCWJyZWFrOworCisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgImN1c3RvbSIsIDYpKSB7CisJCQlpZiAoZ3J2Z2FfcGFyc2VfY3VzdG9tKHRoaXNfb3B0LCAmaW5mby0+dmFyKSA8IDApIHsKKwkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkZhaWxlZCB0byBwYXJzZSBjdXN0b20gbW9kZSAoJXMpLlxuIiwgdGhpc19vcHQpOworCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnIxOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiYWRkciIsIDQpKQorCQkJZ3J2Z2FfZml4X2FkZHIgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDE2KTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJzaXplIiwgNCkpCisJCQlncnZnYV9tZW1fc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7CisJCWVsc2UKKwkJCW1vZGVfb3B0ID0gdGhpc19vcHQ7CisJfQorCisJcGFyID0gaW5mby0+cGFyOworCWluZm8tPmZib3BzID0gJmdydmdhX29wczsKKwlpbmZvLT5maXggPSBncnZnYV9maXg7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPmNvbG9yX3BhbGV0dGU7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19QQVJUSUFMX1BBTl9PSyB8IEZCSU5GT19IV0FDQ0VMX1lQQU47CisJaW5mby0+Zml4LnNtZW1fbGVuID0gZ3J2Z2FfbWVtX3NpemU7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZkZXYtPnJlc291cmNlWzBdKSwgImdybGliLXN2Z2FjdHJsIHJlZ3MiKSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgInJlZ2lzdGVycyBhbHJlYWR5IG1hcHBlZFxuIik7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcGFyLT5yZWdzID0gb2ZfaW9yZW1hcCgmZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCSAgICAgICByZXNvdXJjZV9zaXplKCZkZXYtPnJlc291cmNlWzBdKSwKKwkJCSAgICAgICAiZ3JsaWItc3ZnYWN0cmwgcmVncyIpOworCisJaWYgKCFwYXItPnJlZ3MpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIHJlZ2lzdGVyc1xuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyMTsKKwl9CisKKwlyZXR2YWwgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSB3aXRoIGZiX2FsbG9jX2NtYXBcbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycjI7CisJfQorCisJaWYgKG1vZGVfb3B0KSB7CisJCXJldHZhbCA9IGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBtb2RlX29wdCwKKwkJCQkgICAgICBncnZnYV9tb2RlZGIsIHNpemVvZihncnZnYV9tb2RlZGIpLCAmZ3J2Z2FfbW9kZWRiWzBdLCA4KTsKKwkJaWYgKCFyZXR2YWwgfHwgcmV0dmFsID09IDQpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjM7CisJCX0KKwl9CisKKwlpZiAoIWdydmdhX21lbV9zaXplKQorCQlncnZnYV9tZW1fc2l6ZSA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKiBpbmZvLT52YXIueXJlc192aXJ0dWFsICogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLzg7CisKKwlpZiAoZ3J2Z2FfZml4X2FkZHIpIHsKKwkJLyogR290IGZyYW1lYnVmZmVyIGJhc2UgYWRkcmVzcyBmcm9tIGFyZ3VtZW50IGxpc3QgKi8KKworCQlwaHlzaWNhbF9zdGFydCA9IGdydmdhX2ZpeF9hZGRyOworCisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBoeXNpY2FsX3N0YXJ0LCBncnZnYV9tZW1fc2l6ZSwgZGV2LT5uYW1lKSkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycjM7CisJCX0KKworCQl2aXJ0dWFsX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAocGh5c2ljYWxfc3RhcnQsIGdydmdhX21lbV9zaXplKTsKKworCQlpZiAoIXZpcnR1YWxfc3RhcnQpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiZXJyb3IgbWFwcGluZyBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIpOworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyNDsKKwkJfQorCX0gZWxzZSB7CS8qIEFsbG9jYXRlIGZyYW1idWZmZXIgbWVtb3J5ICovCisKKwkJdW5zaWduZWQgbG9uZyBwYWdlOworCisJCXZpcnR1YWxfc3RhcnQgPSAodW5zaWduZWQgbG9uZykgX19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BLAorCQkJCQkJCQkgZ2V0X29yZGVyKGdydmdhX21lbV9zaXplKSk7CisJCWlmICghdmlydHVhbF9zdGFydCkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBmcmFtZWJ1ZmZlciBtZW1vcnkgKCVsdSBieXRlcylcbiIsCisJCQkJZ3J2Z2FfbWVtX3NpemUpOworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyMzsKKwkJfQorCisJCXBoeXNpY2FsX3N0YXJ0ID0gZG1hX21hcF9zaW5nbGUoJmRldi0+ZGV2LCAodm9pZCAqKXZpcnR1YWxfc3RhcnQsIGdydmdhX21lbV9zaXplLCBETUFfVE9fREVWSUNFKTsKKworCQkvKiBTZXQgcGFnZSByZXNlcnZlZCBzbyB0aGF0IG1tYXAgd2lsbCB3b3JrLiBUaGlzIGlzIG5lY2Vzc2FyeQorCQkgKiBzaW5jZSB3ZSdsbCBiZSByZW1hcHBpbmcgbm9ybWFsIG1lbW9yeS4KKwkJICovCisJCWZvciAocGFnZSA9IHZpcnR1YWxfc3RhcnQ7CisJCSAgICAgcGFnZSA8IFBBR0VfQUxJR04odmlydHVhbF9zdGFydCArIGdydmdhX21lbV9zaXplKTsKKwkJICAgICBwYWdlICs9IFBBR0VfU0laRSkgeworCQkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShwYWdlKSk7CisJCX0KKworCQlwYXItPmZiX2FsbG9jZWQgPSAxOworCX0KKworCW1lbXNldCgodW5zaWduZWQgbG9uZyAqKSB2aXJ0dWFsX3N0YXJ0LCAwLCBncnZnYV9tZW1fc2l6ZSk7CisKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyIF9faW9tZW0gKikgdmlydHVhbF9zdGFydDsKKwlpbmZvLT5maXguc21lbV9zdGFydCA9IHBoeXNpY2FsX3N0YXJ0OworCWluZm8tPmZpeC5zbWVtX2xlbiAgID0gZ3J2Z2FfbWVtX3NpemU7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBpbmZvKTsKKworCWRldl9pbmZvKCZkZXYtPmRldiwKKwkJICJBZXJvZmxleCBHYWlzbGVyIGZyYW1lYnVmZmVyIGRldmljZSAoZmIlZCksICVkeCVkLSVkLCB1c2luZyAlbHVLIG9mIHZpZGVvIG1lbW9yeSBAICVwXG4iLAorCQkgaW5mby0+bm9kZSwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCisJCSBncnZnYV9tZW1fc2l6ZSA+PiAxMCwgaW5mby0+c2NyZWVuX2Jhc2UpOworCisJcmV0dmFsID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZnJhbWVidWZmZXJcbiIpOworCQlnb3RvIGVycjQ7CisJfQorCisJX19yYXdfd3JpdGVsKHBoeXNpY2FsX3N0YXJ0LCAmcGFyLT5yZWdzLT5mYl9wb3MpOworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbCgmcGFyLT5yZWdzLT5zdGF0dXMpIHwgMSwgIC8qIEVuYWJsZSBmcmFtZWJ1ZmZlciAqLworCQkgICAgICZwYXItPnJlZ3MtPnN0YXR1cyk7CisKKwlyZXR1cm4gMDsKKworZXJyNDoKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoZ3J2Z2FfZml4X2FkZHIpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHBoeXNpY2FsX3N0YXJ0LCBncnZnYV9tZW1fc2l6ZSk7CisJCWlvdW5tYXAoKHZvaWQgKil2aXJ0dWFsX3N0YXJ0KTsKKwl9IGVsc2UKKwkJa2ZyZWUoKHZvaWQgKil2aXJ0dWFsX3N0YXJ0KTsKK2VycjM6CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKK2VycjI6CisJb2ZfaW91bm1hcCgmZGV2LT5yZXNvdXJjZVswXSwgcGFyLT5yZWdzLAorCQkgICByZXNvdXJjZV9zaXplKCZkZXYtPnJlc291cmNlWzBdKSk7CitlcnIxOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZkZXYtPnJlc291cmNlWzBdKSk7CitlcnI6CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGdydmdhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoJmRldmljZS0+ZGV2KTsKKwlzdHJ1Y3QgZ3J2Z2FfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwlpZiAoaW5mbykgeworCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCisJCW9mX2lvdW5tYXAoJmRldmljZS0+cmVzb3VyY2VbMF0sIHBhci0+cmVncywKKwkJCSAgIHJlc291cmNlX3NpemUoJmRldmljZS0+cmVzb3VyY2VbMF0pKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGRldmljZS0+cmVzb3VyY2VbMF0uc3RhcnQsIHJlc291cmNlX3NpemUoJmRldmljZS0+cmVzb3VyY2VbMF0pKTsKKworCQlpZiAoIXBhci0+ZmJfYWxsb2NlZCkgeworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5maXguc21lbV9sZW4pOworCQkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CisJCX0gZWxzZQorCQkJa2ZyZWUoKHZvaWQgKilpbmZvLT5zY3JlZW5fYmFzZSk7CisKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwkJZGV2X3NldF9kcnZkYXRhKCZkZXZpY2UtPmRldiwgTlVMTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN2Z2FjdHJsX29mX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJHQUlTTEVSX1NWR0FDVFJMIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiMDFfMDYzIiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN2Z2FjdHJsX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3J2Z2FfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImdybGliLXN2Z2FjdHJsIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHN2Z2FjdHJsX29mX21hdGNoLAorCX0sCisJLnByb2JlCQk9IGdydmdhX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ3J2Z2FfcmVtb3ZlKSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgZ3J2Z2FfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdydmdhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBncnZnYV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdydmdhX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGdydmdhX2luaXQpOworbW9kdWxlX2V4aXQoZ3J2Z2FfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFlcm9mbGV4IEdhaXNsZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWVyb2ZsZXggR2Fpc2xlciBmcmFtZWJ1ZmZlciBkZXZpY2UgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYyBiL2RyaXZlcnMvdmlkZW8vZ3h0NDUwMC5jCmluZGV4IDg5NmU1M2QuLjBmYWQyM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ3h0NDUwMC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ3h0NDUwMC5jCkBAIC01NDMsOCArNTQzLDggQEAKIAogCWlmICh2YXItPnhvZmZzZXQgJiA3KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFyLT54b2Zmc2V0ICsgdmFyLT54cmVzID4gdmFyLT54cmVzX3ZpcnR1YWwgfHwKLQkgICAgdmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpCisJaWYgKHZhci0+eG9mZnNldCArIGluZm8tPnZhci54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCB8fAorCSAgICB2YXItPnlvZmZzZXQgKyBpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJd3JpdGVyZWcocGFyLCBSRUZSRVNIX1NUQVJULCAodmFyLT54b2Zmc2V0IDw8IDE2KSB8IHZhci0+eW9mZnNldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2hnYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2hnYWZiLmMKaW5kZXggNDA1MjcxOC4uNDM5NDM4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9oZ2FmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaGdhZmIuYwpAQCAtNDIyLDggKzQyMiw4IEBACiAJCSAgICB2YXItPnhvZmZzZXQpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewotCQlpZiAodmFyLT54b2Zmc2V0ICsgdmFyLT54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbAotCQkgfHwgdmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbAorCQlpZiAodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsCisJCSB8fCB2YXItPnlvZmZzZXQgKyBpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwKIAkJIHx8IHZhci0+eW9mZnNldCAlIDgpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ltc3R0ZmIuYyBiL2RyaXZlcnMvdmlkZW8vaW1zdHRmYi5jCmluZGV4IGVmYjJjMTAuLjgxNDkzNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW1zdHRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaW1zdHRmYi5jCkBAIC03NDksNyArNzQ5LDcgQEAKIHsKIAlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJX191MzIgb2ZmID0gdmFyLT55b2Zmc2V0ICogKGluZm8tPmZpeC5saW5lX2xlbmd0aCA+PiAzKQotCQkgICAgKyAoKHZhci0+eG9mZnNldCAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpKSA+PiAzKTsKKwkJICAgICsgKCh2YXItPnhvZmZzZXQgKiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID4+IDMpKSA+PiAzKTsKIAl3cml0ZV9yZWdfbGUzMihwYXItPmRjX3JlZ3MsIFNTUiwgb2ZmKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jCmluZGV4IDM4MDY1Y2YuLmZiYWQ2MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMKQEAgLTM5MCwxMiArMzkwLDEyIEBACiAJeG9mZnNldCA9IFJPVU5EX0RPV05fVE8odmFyLT54b2Zmc2V0LCA4KTsKIAl5b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OwogCi0JaWYgKCh4b2Zmc2V0ICsgdmFyLT54cmVzID4gdmFyLT54cmVzX3ZpcnR1YWwpIHx8Ci0JICAgICh5b2Zmc2V0ICsgdmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpKQorCWlmICgoeG9mZnNldCArIGluZm8tPnZhci54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCkgfHwKKwkgICAgKHlvZmZzZXQgKyBpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW9mZnNldCA9ICh5b2Zmc2V0ICogZGluZm8tPnBpdGNoKSArCi0JCSAoeG9mZnNldCAqIHZhci0+Yml0c19wZXJfcGl4ZWwpIC8gODsKKwkJICh4b2Zmc2V0ICogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSAvIDg7CiAKIAlvZmZzZXQgKz0gZGluZm8tPmZiLm9mZnNldCA8PCAxMjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYjg2Mnh4L21iODYyeHgtaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL21iODYyeHgvbWI4NjJ4eC1pMmMuYwppbmRleCBiOTUzMDk5Li4yNzM3NjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21iODYyeHgvbWI4NjJ4eC1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL21iODYyeHgvbWI4NjJ4eC1pMmMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIm1iODYyeHhmYi5oIgogI2luY2x1ZGUgIm1iODYyeHhfcmVnLmgiCkBAIC0yMyw3ICsyNCw3IEBACiAJdTMyIHJlZzsKIAogCWRvIHsKLQkJdWRlbGF5KDEpOworCQl1ZGVsYXkoMTApOwogCQlyZWcgPSBpbnJlZyhpMmMsIEdDX0kyQ19CQ1IpOwogCQlpZiAocmVnICYgKEkyQ19JTlQgfCBJMkNfQkVSKSkKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYjg2Mnh4L21iODYyeHhmYmRydi5jIGIvZHJpdmVycy92aWRlby9tYjg2Mnh4L21iODYyeHhmYmRydi5jCmluZGV4IGVlMWRlM2UuLjExYTdhMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWI4NjJ4eC9tYjg2Mnh4ZmJkcnYuYworKysgYi9kcml2ZXJzL3ZpZGVvL21iODYyeHgvbWI4NjJ4eGZiZHJ2LmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTI3OCw3ICsyNzksNyBAQAogCXJlZyA9IHBhY2sodmFyLT55b2Zmc2V0LCB2YXItPnhvZmZzZXQpOwogCW91dHJlZyhkaXNwLCBHQ19MMFdZX0wwV1gsIHJlZyk7CiAKLQlyZWcgPSBwYWNrKHZhci0+eXJlc192aXJ0dWFsLCB2YXItPnhyZXNfdmlydHVhbCk7CisJcmVnID0gcGFjayhpbmZvLT52YXIueXJlc192aXJ0dWFsLCBpbmZvLT52YXIueHJlc192aXJ0dWFsKTsKIAlvdXRyZWcoZGlzcCwgR0NfTDBXSF9MMFdXLCByZWcpOwogCXJldHVybiAwOwogfQpAQCAtNzM3LDcgKzczOCw3IEBACiAJaWYgKG1iODYyeHhfZ2RjX2luaXQocGFyKSkKIAkJZ290byBpb191bm1hcDsKIAotCWlmIChyZXF1ZXN0X2lycShwYXItPmlycSwgbWI4NjJ4eF9pbnRyLCBJUlFGX0RJU0FCTEVELAorCWlmIChyZXF1ZXN0X2lycShwYXItPmlycSwgbWI4NjJ4eF9pbnRyLCAwLAogCQkJRFJWX05BTUUsICh2b2lkICopcGFyKSkgewogCQlkZXZfZXJyKGRldiwgIkNhbm5vdCByZXF1ZXN0IGlycVxuIik7CiAJCWdvdG8gaW9fdW5tYXA7CkBAIC0xMDczLDcgKzEwNzQsNyBAQAogCWlmIChtYjg2Mnh4X3BjaV9nZGNfaW5pdChwYXIpKQogCQlnb3RvIGlvX3VubWFwOwogCi0JaWYgKHJlcXVlc3RfaXJxKHBhci0+aXJxLCBtYjg2Mnh4X2ludHIsIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKwlpZiAocmVxdWVzdF9pcnEocGFyLT5pcnEsIG1iODYyeHhfaW50ciwgSVJRRl9TSEFSRUQsCiAJCQlEUlZfTkFNRSwgKHZvaWQgKilwYXIpKSB7CiAJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHJlcXVlc3QgaXJxXG4iKTsKIAkJZ290byBpb191bm1hcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWJ4L21ieGZiLmMgYi9kcml2ZXJzL3ZpZGVvL21ieC9tYnhmYi5jCmluZGV4IGFmZWE5YWIuLjZjZTM0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWJ4L21ieGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9tYngvbWJ4ZmIuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgInJlZ3MuaCIKICNpbmNsdWRlICJyZWdfYml0cy5oIgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2aXJ0X2Jhc2VfMjcwMDsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnZpcnRfYmFzZV8yNzAwOwogCiAjZGVmaW5lIHdyaXRlX3JlZyh2YWwsIHJlZykgZG8geyB3cml0ZWwoKHZhbCksIChyZWcpKTsgfSB3aGlsZSgwKQogCkBAIC04NTAsNyArODUwLDcgQEAKIHsKIAkvKiBtYWtlIGZyYW1lIGJ1ZmZlciBtZW1vcnkgZW50ZXIgc2VsZi1yZWZyZXNoIG1vZGUgKi8KIAl3cml0ZV9yZWdfZGx5KExNUFdSX01DX1BXUl9TUk0sIExNUFdSKTsKLQl3aGlsZSAoTE1QV1JTVEFUICE9IExNUFdSU1RBVF9NQ19QV1JfU1JNKQorCXdoaWxlIChyZWFkbChMTVBXUlNUQVQpICE9IExNUFdSU1RBVF9NQ19QV1JfU1JNKQogCQk7IC8qIGVtcHR5IHN0YXRlbWVudCAqLwogCiAJLyogcmVzZXQgdGhlIGRldmljZSwgc2luY2UgaXQncyBpbml0aWFsIHN0YXRlIGlzICdtb3N0bHkgc2xlZXBpbmcnICovCkBAIC05NDYsNyArOTQ2LDcgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnIzOwogCX0KLQl2aXJ0X2Jhc2VfMjcwMCA9ICh1bnNpZ25lZCBsb25nKW1mYmktPnJlZ192aXJ0X2FkZHI7CisJdmlydF9iYXNlXzI3MDAgPSBtZmJpLT5yZWdfdmlydF9hZGRyOwogCiAJbWZiaS0+ZmJfdmlydF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKG1mYmktPmZiX3BoeXNfYWRkciwKIAkJCQkJICAgICByZXNfc2l6ZShtZmJpLT5mYl9yZXEpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCmluZGV4IGNiMTc1ZmUuLmE5YTkwN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKKysrIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwpAQCAtNDkxLDU1ICs0OTEsNTYgQEAKIHN0YXRpYyBpbnQgZmJfdHJ5X21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkgICAgICAgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSwgdW5zaWduZWQgaW50IGJwcCkKIHsKLSAgICBpbnQgZXJyID0gMDsKKwlpbnQgZXJyID0gMDsKIAotICAgIERQUklOVEsoIlRyeWluZyBtb2RlICVzICVkeCVkLSVkQCVkXG4iLCBtb2RlLT5uYW1lID8gbW9kZS0+bmFtZSA6ICJub25hbWUiLAotCSAgICBtb2RlLT54cmVzLCBtb2RlLT55cmVzLCBicHAsIG1vZGUtPnJlZnJlc2gpOwotICAgIHZhci0+eHJlcyA9IG1vZGUtPnhyZXM7Ci0gICAgdmFyLT55cmVzID0gbW9kZS0+eXJlczsKLSAgICB2YXItPnhyZXNfdmlydHVhbCA9IG1vZGUtPnhyZXM7Ci0gICAgdmFyLT55cmVzX3ZpcnR1YWwgPSBtb2RlLT55cmVzOwotICAgIHZhci0+eG9mZnNldCA9IDA7Ci0gICAgdmFyLT55b2Zmc2V0ID0gMDsKLSAgICB2YXItPmJpdHNfcGVyX3BpeGVsID0gYnBwOwotICAgIHZhci0+YWN0aXZhdGUgfD0gRkJfQUNUSVZBVEVfVEVTVDsKLSAgICB2YXItPnBpeGNsb2NrID0gbW9kZS0+cGl4Y2xvY2s7Ci0gICAgdmFyLT5sZWZ0X21hcmdpbiA9IG1vZGUtPmxlZnRfbWFyZ2luOwotICAgIHZhci0+cmlnaHRfbWFyZ2luID0gbW9kZS0+cmlnaHRfbWFyZ2luOwotICAgIHZhci0+dXBwZXJfbWFyZ2luID0gbW9kZS0+dXBwZXJfbWFyZ2luOwotICAgIHZhci0+bG93ZXJfbWFyZ2luID0gbW9kZS0+bG93ZXJfbWFyZ2luOwotICAgIHZhci0+aHN5bmNfbGVuID0gbW9kZS0+aHN5bmNfbGVuOwotICAgIHZhci0+dnN5bmNfbGVuID0gbW9kZS0+dnN5bmNfbGVuOwotICAgIHZhci0+c3luYyA9IG1vZGUtPnN5bmM7Ci0gICAgdmFyLT52bW9kZSA9IG1vZGUtPnZtb2RlOwotICAgIGlmIChpbmZvLT5mYm9wcy0+ZmJfY2hlY2tfdmFyKQotICAgIAllcnIgPSBpbmZvLT5mYm9wcy0+ZmJfY2hlY2tfdmFyKHZhciwgaW5mbyk7Ci0gICAgdmFyLT5hY3RpdmF0ZSAmPSB+RkJfQUNUSVZBVEVfVEVTVDsKLSAgICByZXR1cm4gZXJyOworCURQUklOVEsoIlRyeWluZyBtb2RlICVzICVkeCVkLSVkQCVkXG4iLAorCQltb2RlLT5uYW1lID8gbW9kZS0+bmFtZSA6ICJub25hbWUiLAorCQltb2RlLT54cmVzLCBtb2RlLT55cmVzLCBicHAsIG1vZGUtPnJlZnJlc2gpOworCXZhci0+eHJlcyA9IG1vZGUtPnhyZXM7CisJdmFyLT55cmVzID0gbW9kZS0+eXJlczsKKwl2YXItPnhyZXNfdmlydHVhbCA9IG1vZGUtPnhyZXM7CisJdmFyLT55cmVzX3ZpcnR1YWwgPSBtb2RlLT55cmVzOworCXZhci0+eG9mZnNldCA9IDA7CisJdmFyLT55b2Zmc2V0ID0gMDsKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gYnBwOworCXZhci0+YWN0aXZhdGUgfD0gRkJfQUNUSVZBVEVfVEVTVDsKKwl2YXItPnBpeGNsb2NrID0gbW9kZS0+cGl4Y2xvY2s7CisJdmFyLT5sZWZ0X21hcmdpbiA9IG1vZGUtPmxlZnRfbWFyZ2luOworCXZhci0+cmlnaHRfbWFyZ2luID0gbW9kZS0+cmlnaHRfbWFyZ2luOworCXZhci0+dXBwZXJfbWFyZ2luID0gbW9kZS0+dXBwZXJfbWFyZ2luOworCXZhci0+bG93ZXJfbWFyZ2luID0gbW9kZS0+bG93ZXJfbWFyZ2luOworCXZhci0+aHN5bmNfbGVuID0gbW9kZS0+aHN5bmNfbGVuOworCXZhci0+dnN5bmNfbGVuID0gbW9kZS0+dnN5bmNfbGVuOworCXZhci0+c3luYyA9IG1vZGUtPnN5bmM7CisJdmFyLT52bW9kZSA9IG1vZGUtPnZtb2RlOworCWlmIChpbmZvLT5mYm9wcy0+ZmJfY2hlY2tfdmFyKQorCQllcnIgPSBpbmZvLT5mYm9wcy0+ZmJfY2hlY2tfdmFyKHZhciwgaW5mbyk7CisJdmFyLT5hY3RpdmF0ZSAmPSB+RkJfQUNUSVZBVEVfVEVTVDsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioKLSAqCWZiX2ZpbmRfbW9kZSAtIGZpbmRzIGEgdmFsaWQgdmlkZW8gbW9kZQotICoJQHZhcjogZnJhbWUgYnVmZmVyIHVzZXIgZGVmaW5lZCBwYXJ0IG9mIGRpc3BsYXkKLSAqCUBpbmZvOiBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUKLSAqCUBtb2RlX29wdGlvbjogc3RyaW5nIHZpZGVvIG1vZGUgdG8gZmluZAotICoJQGRiOiB2aWRlbyBtb2RlIGRhdGFiYXNlCi0gKglAZGJzaXplOiBzaXplIG9mIEBkYgotICoJQGRlZmF1bHRfbW9kZTogZGVmYXVsdCB2aWRlbyBtb2RlIHRvIGZhbGwgYmFjayB0bwotICoJQGRlZmF1bHRfYnBwOiBkZWZhdWx0IGNvbG9yIGRlcHRoIGluIGJpdHMgcGVyIHBpeGVsCisgKiAgICAgZmJfZmluZF9tb2RlIC0gZmluZHMgYSB2YWxpZCB2aWRlbyBtb2RlCisgKiAgICAgQHZhcjogZnJhbWUgYnVmZmVyIHVzZXIgZGVmaW5lZCBwYXJ0IG9mIGRpc3BsYXkKKyAqICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIGluZm8gc3RydWN0dXJlCisgKiAgICAgQG1vZGVfb3B0aW9uOiBzdHJpbmcgdmlkZW8gbW9kZSB0byBmaW5kCisgKiAgICAgQGRiOiB2aWRlbyBtb2RlIGRhdGFiYXNlCisgKiAgICAgQGRic2l6ZTogc2l6ZSBvZiBAZGIKKyAqICAgICBAZGVmYXVsdF9tb2RlOiBkZWZhdWx0IHZpZGVvIG1vZGUgdG8gZmFsbCBiYWNrIHRvCisgKiAgICAgQGRlZmF1bHRfYnBwOiBkZWZhdWx0IGNvbG9yIGRlcHRoIGluIGJpdHMgcGVyIHBpeGVsCiAgKgotICoJRmluZHMgYSBzdWl0YWJsZSB2aWRlbyBtb2RlLCBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kZQotICoJaW4gQG1vZGVfb3B0aW9uIHdpdGggZmFsbGJhY2sgdG8gQGRlZmF1bHRfbW9kZS4gIElmCi0gKglAZGVmYXVsdF9tb2RlIGZhaWxzLCBhbGwgbW9kZXMgaW4gdGhlIHZpZGVvIG1vZGUgZGF0YWJhc2Ugd2lsbAotICoJYmUgdHJpZWQuCisgKiAgICAgRmluZHMgYSBzdWl0YWJsZSB2aWRlbyBtb2RlLCBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kZQorICogICAgIGluIEBtb2RlX29wdGlvbiB3aXRoIGZhbGxiYWNrIHRvIEBkZWZhdWx0X21vZGUuICBJZgorICogICAgIEBkZWZhdWx0X21vZGUgZmFpbHMsIGFsbCBtb2RlcyBpbiB0aGUgdmlkZW8gbW9kZSBkYXRhYmFzZSB3aWxsCisgKiAgICAgYmUgdHJpZWQuCiAgKgotICoJVmFsaWQgbW9kZSBzcGVjaWZpZXJzIGZvciBAbW9kZV9vcHRpb246CisgKiAgICAgVmFsaWQgbW9kZSBzcGVjaWZpZXJzIGZvciBAbW9kZV9vcHRpb246CiAgKgotICoJPHhyZXM+eDx5cmVzPltNXVtSXVstPGJwcD5dW0A8cmVmcmVzaD5dW2ldW21dIG9yCi0gKgk8bmFtZT5bLTxicHA+XVtAPHJlZnJlc2g+XQorICogICAgIDx4cmVzPng8eXJlcz5bTV1bUl1bLTxicHA+XVtAPHJlZnJlc2g+XVtpXVttXSBvcgorICogICAgIDxuYW1lPlstPGJwcD5dW0A8cmVmcmVzaD5dCiAgKgotICoJd2l0aCA8eHJlcz4sIDx5cmVzPiwgPGJwcD4gYW5kIDxyZWZyZXNoPiBkZWNpbWFsIG51bWJlcnMgYW5kCi0gKgk8bmFtZT4gYSBzdHJpbmcuCisgKiAgICAgd2l0aCA8eHJlcz4sIDx5cmVzPiwgPGJwcD4gYW5kIDxyZWZyZXNoPiBkZWNpbWFsIG51bWJlcnMgYW5kCisgKiAgICAgPG5hbWU+IGEgc3RyaW5nLgogICoKICAqICAgICAgSWYgJ00nIGlzIHByZXNlbnQgYWZ0ZXIgeXJlcyAoYW5kIGJlZm9yZSByZWZyZXNoL2JwcCBpZiBwcmVzZW50KSwKICAqICAgICAgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgdGltaW5ncyB1c2luZyBWRVNBKHRtKSBDb29yZGluYXRlZApAQCAtNTUxLDEyICs1NTIsMTIgQEAKICAqCiAgKiAgICAgIDEwMjR4NzY4TVItOEA2MG0gLSBSZWR1Y2VkIGJsYW5rIHdpdGggbWFyZ2lucyBhdCA2MEh6LgogICoKLSAqCU5PVEU6IFRoZSBwYXNzZWQgc3RydWN0IEB2YXIgaXMgX25vdF8gY2xlYXJlZCEgIFRoaXMgYWxsb3dzIHlvdQotICoJdG8gc3VwcGx5IHZhbHVlcyBmb3IgZS5nLiB0aGUgZ3JheXNjYWxlIGFuZCBhY2NlbF9mbGFncyBmaWVsZHMuCisgKiAgICAgTk9URTogVGhlIHBhc3NlZCBzdHJ1Y3QgQHZhciBpcyBfbm90XyBjbGVhcmVkISAgVGhpcyBhbGxvd3MgeW91CisgKiAgICAgdG8gc3VwcGx5IHZhbHVlcyBmb3IgZS5nLiB0aGUgZ3JheXNjYWxlIGFuZCBhY2NlbF9mbGFncyBmaWVsZHMuCiAgKgotICoJUmV0dXJucyB6ZXJvIGZvciBmYWlsdXJlLCAxIGlmIHVzaW5nIHNwZWNpZmllZCBAbW9kZV9vcHRpb24sCi0gKgkyIGlmIHVzaW5nIHNwZWNpZmllZCBAbW9kZV9vcHRpb24gd2l0aCBhbiBpZ25vcmVkIHJlZnJlc2ggcmF0ZSwKLSAqCTMgaWYgZGVmYXVsdCBtb2RlIGlzIHVzZWQsIDQgaWYgZmFsbCBiYWNrIHRvIGFueSB2YWxpZCBtb2RlLgorICogICAgIFJldHVybnMgemVybyBmb3IgZmFpbHVyZSwgMSBpZiB1c2luZyBzcGVjaWZpZWQgQG1vZGVfb3B0aW9uLAorICogICAgIDIgaWYgdXNpbmcgc3BlY2lmaWVkIEBtb2RlX29wdGlvbiB3aXRoIGFuIGlnbm9yZWQgcmVmcmVzaCByYXRlLAorICogICAgIDMgaWYgZGVmYXVsdCBtb2RlIGlzIHVzZWQsIDQgaWYgZmFsbCBiYWNrIHRvIGFueSB2YWxpZCBtb2RlLgogICoKICAqLwogCkBAIC01NjYsMTk4ICs1NjcsMjAzIEBACiAJCSBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICpkZWZhdWx0X21vZGUsCiAJCSB1bnNpZ25lZCBpbnQgZGVmYXVsdF9icHApCiB7Ci0gICAgaW50IGk7CisJaW50IGk7CiAKLSAgICAvKiBTZXQgdXAgZGVmYXVsdHMgKi8KLSAgICBpZiAoIWRiKSB7Ci0JZGIgPSBtb2RlZGI7Ci0JZGJzaXplID0gQVJSQVlfU0laRShtb2RlZGIpOwotICAgIH0KLQotICAgIGlmICghZGVmYXVsdF9tb2RlKQotCWRlZmF1bHRfbW9kZSA9ICZkYlswXTsKLQotICAgIGlmICghZGVmYXVsdF9icHApCi0JZGVmYXVsdF9icHAgPSA4OwotCi0gICAgLyogRGlkIHRoZSB1c2VyIHNwZWNpZnkgYSB2aWRlbyBtb2RlPyAqLwotICAgIGlmICghbW9kZV9vcHRpb24pCi0JbW9kZV9vcHRpb24gPSBmYl9tb2RlX29wdGlvbjsKLSAgICBpZiAobW9kZV9vcHRpb24pIHsKLQljb25zdCBjaGFyICpuYW1lID0gbW9kZV9vcHRpb247Ci0JdW5zaWduZWQgaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0JaW50IHJlc19zcGVjaWZpZWQgPSAwLCBicHBfc3BlY2lmaWVkID0gMCwgcmVmcmVzaF9zcGVjaWZpZWQgPSAwOwotCXVuc2lnbmVkIGludCB4cmVzID0gMCwgeXJlcyA9IDAsIGJwcCA9IGRlZmF1bHRfYnBwLCByZWZyZXNoID0gMDsKLQlpbnQgeXJlc19zcGVjaWZpZWQgPSAwLCBjdnQgPSAwLCByYiA9IDAsIGludGVybGFjZSA9IDAsIG1hcmdpbnMgPSAwOwotCXUzMiBiZXN0LCBkaWZmLCB0ZGlmZjsKLQotCWZvciAoaSA9IG5hbWVsZW4tMTsgaSA+PSAwOyBpLS0pIHsKLQkgICAgc3dpdGNoIChuYW1lW2ldKSB7Ci0JCWNhc2UgJ0AnOgotCQkgICAgbmFtZWxlbiA9IGk7Ci0JCSAgICBpZiAoIXJlZnJlc2hfc3BlY2lmaWVkICYmICFicHBfc3BlY2lmaWVkICYmCi0JCQkheXJlc19zcGVjaWZpZWQpIHsKLQkJCXJlZnJlc2ggPSBzaW1wbGVfc3RydG9sKCZuYW1lW2krMV0sIE5VTEwsIDEwKTsKLQkJCXJlZnJlc2hfc3BlY2lmaWVkID0gMTsKLQkJCWlmIChjdnQgfHwgcmIpCi0JCQkgICAgY3Z0ID0gMDsKLQkJICAgIH0gZWxzZQotCQkJZ290byBkb25lOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgJy0nOgotCQkgICAgbmFtZWxlbiA9IGk7Ci0JCSAgICBpZiAoIWJwcF9zcGVjaWZpZWQgJiYgIXlyZXNfc3BlY2lmaWVkKSB7Ci0JCQlicHAgPSBzaW1wbGVfc3RydG9sKCZuYW1lW2krMV0sIE5VTEwsIDEwKTsKLQkJCWJwcF9zcGVjaWZpZWQgPSAxOwotCQkJaWYgKGN2dCB8fCByYikKLQkJCSAgICBjdnQgPSAwOwotCQkgICAgfSBlbHNlCi0JCQlnb3RvIGRvbmU7Ci0JCSAgICBicmVhazsKLQkJY2FzZSAneCc6Ci0JCSAgICBpZiAoIXlyZXNfc3BlY2lmaWVkKSB7Ci0JCQl5cmVzID0gc2ltcGxlX3N0cnRvbCgmbmFtZVtpKzFdLCBOVUxMLCAxMCk7Ci0JCQl5cmVzX3NwZWNpZmllZCA9IDE7Ci0JCSAgICB9IGVsc2UKLQkJCWdvdG8gZG9uZTsKLQkJICAgIGJyZWFrOwotCQljYXNlICcwJyAuLi4gJzknOgotCQkgICAgYnJlYWs7Ci0JCWNhc2UgJ00nOgotCQkgICAgaWYgKCF5cmVzX3NwZWNpZmllZCkKLQkJCWN2dCA9IDE7Ci0JCSAgICBicmVhazsKLQkJY2FzZSAnUic6Ci0JCSAgICBpZiAoIWN2dCkKLQkJCXJiID0gMTsKLQkJICAgIGJyZWFrOwotCQljYXNlICdtJzoKLQkJICAgIGlmICghY3Z0KQotCQkJbWFyZ2lucyA9IDE7Ci0JCSAgICBicmVhazsKLQkJY2FzZSAnaSc6Ci0JCSAgICBpZiAoIWN2dCkKLQkJCWludGVybGFjZSA9IDE7Ci0JCSAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGdvdG8gZG9uZTsKLQkgICAgfQotCX0KLQlpZiAoaSA8IDAgJiYgeXJlc19zcGVjaWZpZWQpIHsKLQkgICAgeHJlcyA9IHNpbXBsZV9zdHJ0b2wobmFtZSwgTlVMTCwgMTApOwotCSAgICByZXNfc3BlY2lmaWVkID0gMTsKLQl9Ci1kb25lOgotCWlmIChjdnQpIHsKLQkgICAgc3RydWN0IGZiX3ZpZGVvbW9kZSBjdnRfbW9kZTsKLQkgICAgaW50IHJldDsKLQotCSAgICBEUFJJTlRLKCJDVlQgbW9kZSAlZHglZEAlZEh6JXMlcyVzXG4iLCB4cmVzLCB5cmVzLAotCQkgICAgKHJlZnJlc2gpID8gcmVmcmVzaCA6IDYwLCAocmIpID8gIiByZWR1Y2VkIGJsYW5raW5nIiA6Ci0JCSAgICAiIiwgKG1hcmdpbnMpID8gIiB3aXRoIG1hcmdpbnMiIDogIiIsIChpbnRlcmxhY2UpID8KLQkJICAgICIgaW50ZXJsYWNlZCIgOiAiIik7Ci0KLQkgICAgbWVtc2V0KCZjdnRfbW9kZSwgMCwgc2l6ZW9mKGN2dF9tb2RlKSk7Ci0JICAgIGN2dF9tb2RlLnhyZXMgPSB4cmVzOwotCSAgICBjdnRfbW9kZS55cmVzID0geXJlczsKLQkgICAgY3Z0X21vZGUucmVmcmVzaCA9IChyZWZyZXNoKSA/IHJlZnJlc2ggOiA2MDsKLQotCSAgICBpZiAoaW50ZXJsYWNlKQotCQljdnRfbW9kZS52bW9kZSB8PSBGQl9WTU9ERV9JTlRFUkxBQ0VEOwotCSAgICBlbHNlCi0JCWN2dF9tb2RlLnZtb2RlICY9IH5GQl9WTU9ERV9JTlRFUkxBQ0VEOwotCi0JICAgIHJldCA9IGZiX2ZpbmRfbW9kZV9jdnQoJmN2dF9tb2RlLCBtYXJnaW5zLCByYik7Ci0KLQkgICAgaWYgKCFyZXQgJiYgIWZiX3RyeV9tb2RlKHZhciwgaW5mbywgJmN2dF9tb2RlLCBicHApKSB7Ci0JCURQUklOVEsoIm1vZGVkYiBDVlQ6IENWVCBtb2RlIG9rXG4iKTsKLQkJcmV0dXJuIDE7Ci0JICAgIH0KLQotCSAgICBEUFJJTlRLKCJDVlQgbW9kZSBpbnZhbGlkLCBnZXR0aW5nIG1vZGUgZnJvbSBkYXRhYmFzZVxuIik7CisJLyogU2V0IHVwIGRlZmF1bHRzICovCisJaWYgKCFkYikgeworCQlkYiA9IG1vZGVkYjsKKwkJZGJzaXplID0gQVJSQVlfU0laRShtb2RlZGIpOwogCX0KIAotCURQUklOVEsoIlRyeWluZyBzcGVjaWZpZWQgdmlkZW8gbW9kZSVzICVpeCVpXG4iLAotCSAgICByZWZyZXNoX3NwZWNpZmllZCA/ICIiIDogIiAoaWdub3JpbmcgcmVmcmVzaCByYXRlKSIsIHhyZXMsIHlyZXMpOworCWlmICghZGVmYXVsdF9tb2RlKQorCQlkZWZhdWx0X21vZGUgPSAmZGJbMF07CiAKLQlpZiAoIXJlZnJlc2hfc3BlY2lmaWVkKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBjYWxsZXIgaGFzIHByb3ZpZGVkIGEgY3VzdG9tIG1vZGUgZGF0YWJhc2UgYW5kIGEKLQkJICogdmFsaWQgbW9uc3BlY3Mgc3RydWN0dXJlLCB3ZSBsb29rIGZvciB0aGUgbW9kZSB3aXRoIHRoZQotCQkgKiBoaWdoZXN0IHJlZnJlc2ggcmF0ZS4gIE90aGVyd2lzZSB3ZSBwbGF5IGl0IHNhZmUgaXQgYW5kCi0JCSAqIHRyeSB0byBmaW5kIGEgbW9kZSB3aXRoIGEgcmVmcmVzaCByYXRlIGNsb3Nlc3QgdG8gdGhlCi0JCSAqIHN0YW5kYXJkIDYwIEh6LgotCQkgKi8KLQkJaWYgKGRiICE9IG1vZGVkYiAmJgotCQkgICAgaW5mby0+bW9uc3BlY3MudmZtaW4gJiYgaW5mby0+bW9uc3BlY3MudmZtYXggJiYKLQkJICAgIGluZm8tPm1vbnNwZWNzLmhmbWluICYmIGluZm8tPm1vbnNwZWNzLmhmbWF4ICYmCi0JCSAgICBpbmZvLT5tb25zcGVjcy5kY2xrbWF4KSB7Ci0JCQlyZWZyZXNoID0gMTAwMDsKLQkJfSBlbHNlIHsKLQkJCXJlZnJlc2ggPSA2MDsKKwlpZiAoIWRlZmF1bHRfYnBwKQorCQlkZWZhdWx0X2JwcCA9IDg7CisKKwkvKiBEaWQgdGhlIHVzZXIgc3BlY2lmeSBhIHZpZGVvIG1vZGU/ICovCisJaWYgKCFtb2RlX29wdGlvbikKKwkJbW9kZV9vcHRpb24gPSBmYl9tb2RlX29wdGlvbjsKKwlpZiAobW9kZV9vcHRpb24pIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IG1vZGVfb3B0aW9uOworCQl1bnNpZ25lZCBpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJaW50IHJlc19zcGVjaWZpZWQgPSAwLCBicHBfc3BlY2lmaWVkID0gMCwgcmVmcmVzaF9zcGVjaWZpZWQgPSAwOworCQl1bnNpZ25lZCBpbnQgeHJlcyA9IDAsIHlyZXMgPSAwLCBicHAgPSBkZWZhdWx0X2JwcCwgcmVmcmVzaCA9IDA7CisJCWludCB5cmVzX3NwZWNpZmllZCA9IDAsIGN2dCA9IDAsIHJiID0gMCwgaW50ZXJsYWNlID0gMDsKKwkJaW50IG1hcmdpbnMgPSAwOworCQl1MzIgYmVzdCwgZGlmZiwgdGRpZmY7CisKKwkJZm9yIChpID0gbmFtZWxlbi0xOyBpID49IDA7IGktLSkgeworCQkJc3dpdGNoIChuYW1lW2ldKSB7CisJCQljYXNlICdAJzoKKwkJCQluYW1lbGVuID0gaTsKKwkJCQlpZiAoIXJlZnJlc2hfc3BlY2lmaWVkICYmICFicHBfc3BlY2lmaWVkICYmCisJCQkJICAgICF5cmVzX3NwZWNpZmllZCkgeworCQkJCQlyZWZyZXNoID0gc2ltcGxlX3N0cnRvbCgmbmFtZVtpKzFdLCBOVUxMLAorCQkJCQkJCQkxMCk7CisJCQkJCXJlZnJlc2hfc3BlY2lmaWVkID0gMTsKKwkJCQkJaWYgKGN2dCB8fCByYikKKwkJCQkJCWN2dCA9IDA7CisJCQkJfSBlbHNlCisJCQkJCWdvdG8gZG9uZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJy0nOgorCQkJCW5hbWVsZW4gPSBpOworCQkJCWlmICghYnBwX3NwZWNpZmllZCAmJiAheXJlc19zcGVjaWZpZWQpIHsKKwkJCQkJYnBwID0gc2ltcGxlX3N0cnRvbCgmbmFtZVtpKzFdLCBOVUxMLAorCQkJCQkJCSAgICAxMCk7CisJCQkJCWJwcF9zcGVjaWZpZWQgPSAxOworCQkJCQlpZiAoY3Z0IHx8IHJiKQorCQkJCQkJY3Z0ID0gMDsKKwkJCQl9IGVsc2UKKwkJCQkJZ290byBkb25lOworCQkJCWJyZWFrOworCQkJY2FzZSAneCc6CisJCQkJaWYgKCF5cmVzX3NwZWNpZmllZCkgeworCQkJCQl5cmVzID0gc2ltcGxlX3N0cnRvbCgmbmFtZVtpKzFdLCBOVUxMLAorCQkJCQkJCSAgICAgMTApOworCQkJCQl5cmVzX3NwZWNpZmllZCA9IDE7CisJCQkJfSBlbHNlCisJCQkJCWdvdG8gZG9uZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzAnIC4uLiAnOSc6CisJCQkJYnJlYWs7CisJCQljYXNlICdNJzoKKwkJCQlpZiAoIXlyZXNfc3BlY2lmaWVkKQorCQkJCQljdnQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnUic6CisJCQkJaWYgKCFjdnQpCisJCQkJCXJiID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJCWlmICghY3Z0KQorCQkJCQltYXJnaW5zID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2knOgorCQkJCWlmICghY3Z0KQorCQkJCQlpbnRlcmxhY2UgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGRvbmU7CisJCQl9CiAJCX0KLQl9CisJCWlmIChpIDwgMCAmJiB5cmVzX3NwZWNpZmllZCkgeworCQkJeHJlcyA9IHNpbXBsZV9zdHJ0b2wobmFtZSwgTlVMTCwgMTApOworCQkJcmVzX3NwZWNpZmllZCA9IDE7CisJCX0KK2RvbmU6CisJCWlmIChjdnQpIHsKKwkJCXN0cnVjdCBmYl92aWRlb21vZGUgY3Z0X21vZGU7CisJCQlpbnQgcmV0OwogCi0JZGlmZiA9IC0xOwotCWJlc3QgPSAtMTsKLQlmb3IgKGkgPSAwOyBpIDwgZGJzaXplOyBpKyspIHsKLQkJaWYgKChuYW1lX21hdGNoZXMoZGJbaV0sIG5hbWUsIG5hbWVsZW4pIHx8Ci0JCSAgICAocmVzX3NwZWNpZmllZCAmJiByZXNfbWF0Y2hlcyhkYltpXSwgeHJlcywgeXJlcykpKSAmJgotCQkgICAgIWZiX3RyeV9tb2RlKHZhciwgaW5mbywgJmRiW2ldLCBicHApKSB7Ci0JCQlpZiAocmVmcmVzaF9zcGVjaWZpZWQgJiYgZGJbaV0ucmVmcmVzaCA9PSByZWZyZXNoKSB7CisJCQlEUFJJTlRLKCJDVlQgbW9kZSAlZHglZEAlZEh6JXMlcyVzXG4iLCB4cmVzLCB5cmVzLAorCQkJCShyZWZyZXNoKSA/IHJlZnJlc2ggOiA2MCwKKwkJCQkocmIpID8gIiByZWR1Y2VkIGJsYW5raW5nIiA6ICIiLAorCQkJCShtYXJnaW5zKSA/ICIgd2l0aCBtYXJnaW5zIiA6ICIiLAorCQkJCShpbnRlcmxhY2UpID8gIiBpbnRlcmxhY2VkIiA6ICIiKTsKKworCQkJbWVtc2V0KCZjdnRfbW9kZSwgMCwgc2l6ZW9mKGN2dF9tb2RlKSk7CisJCQljdnRfbW9kZS54cmVzID0geHJlczsKKwkJCWN2dF9tb2RlLnlyZXMgPSB5cmVzOworCQkJY3Z0X21vZGUucmVmcmVzaCA9IChyZWZyZXNoKSA/IHJlZnJlc2ggOiA2MDsKKworCQkJaWYgKGludGVybGFjZSkKKwkJCQljdnRfbW9kZS52bW9kZSB8PSBGQl9WTU9ERV9JTlRFUkxBQ0VEOworCQkJZWxzZQorCQkJCWN2dF9tb2RlLnZtb2RlICY9IH5GQl9WTU9ERV9JTlRFUkxBQ0VEOworCisJCQlyZXQgPSBmYl9maW5kX21vZGVfY3Z0KCZjdnRfbW9kZSwgbWFyZ2lucywgcmIpOworCisJCQlpZiAoIXJldCAmJiAhZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmY3Z0X21vZGUsIGJwcCkpIHsKKwkJCQlEUFJJTlRLKCJtb2RlZGIgQ1ZUOiBDVlQgbW9kZSBva1xuIik7CiAJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCURQUklOVEsoIkNWVCBtb2RlIGludmFsaWQsIGdldHRpbmcgbW9kZSBmcm9tIGRhdGFiYXNlXG4iKTsKKwkJfQorCisJCURQUklOVEsoIlRyeWluZyBzcGVjaWZpZWQgdmlkZW8gbW9kZSVzICVpeCVpXG4iLAorCQkJcmVmcmVzaF9zcGVjaWZpZWQgPyAiIiA6ICIgKGlnbm9yaW5nIHJlZnJlc2ggcmF0ZSkiLAorCQkJeHJlcywgeXJlcyk7CisKKwkJaWYgKCFyZWZyZXNoX3NwZWNpZmllZCkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBjYWxsZXIgaGFzIHByb3ZpZGVkIGEgY3VzdG9tIG1vZGUgZGF0YWJhc2UgYW5kCisJCQkgKiBhIHZhbGlkIG1vbnNwZWNzIHN0cnVjdHVyZSwgd2UgbG9vayBmb3IgdGhlIG1vZGUgd2l0aAorCQkJICogdGhlIGhpZ2hlc3QgcmVmcmVzaCByYXRlLiAgT3RoZXJ3aXNlIHdlIHBsYXkgaXQgc2FmZQorCQkJICogaXQgYW5kIHRyeSB0byBmaW5kIGEgbW9kZSB3aXRoIGEgcmVmcmVzaCByYXRlIGNsb3Nlc3QKKwkJCSAqIHRvIHRoZSBzdGFuZGFyZCA2MCBIei4KKwkJCSAqLworCQkJaWYgKGRiICE9IG1vZGVkYiAmJgorCQkJICAgIGluZm8tPm1vbnNwZWNzLnZmbWluICYmIGluZm8tPm1vbnNwZWNzLnZmbWF4ICYmCisJCQkgICAgaW5mby0+bW9uc3BlY3MuaGZtaW4gJiYgaW5mby0+bW9uc3BlY3MuaGZtYXggJiYKKwkJCSAgICBpbmZvLT5tb25zcGVjcy5kY2xrbWF4KSB7CisJCQkJcmVmcmVzaCA9IDEwMDA7CiAJCQl9IGVsc2UgeworCQkJCXJlZnJlc2ggPSA2MDsKKwkJCX0KKwkJfQorCisJCWRpZmYgPSAtMTsKKwkJYmVzdCA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDwgZGJzaXplOyBpKyspIHsKKwkJCWlmICgobmFtZV9tYXRjaGVzKGRiW2ldLCBuYW1lLCBuYW1lbGVuKSB8fAorCQkJICAgICAocmVzX3NwZWNpZmllZCAmJiByZXNfbWF0Y2hlcyhkYltpXSwgeHJlcywgeXJlcykpKSAmJgorCQkJICAgICFmYl90cnlfbW9kZSh2YXIsIGluZm8sICZkYltpXSwgYnBwKSkgeworCQkJCWlmIChyZWZyZXNoX3NwZWNpZmllZCAmJiBkYltpXS5yZWZyZXNoID09IHJlZnJlc2gpCisJCQkJCXJldHVybiAxOworCiAJCQkJaWYgKGFicyhkYltpXS5yZWZyZXNoIC0gcmVmcmVzaCkgPCBkaWZmKSB7CiAJCQkJCWRpZmYgPSBhYnMoZGJbaV0ucmVmcmVzaCAtIHJlZnJlc2gpOwogCQkJCQliZXN0ID0gaTsKIAkJCQl9CiAJCQl9CiAJCX0KLQl9Ci0JaWYgKGJlc3QgIT0gLTEpIHsKLQkJZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbYmVzdF0sIGJwcCk7Ci0JCXJldHVybiAocmVmcmVzaF9zcGVjaWZpZWQpID8gMiA6IDE7Ci0JfQorCQlpZiAoYmVzdCAhPSAtMSkgeworCQkJZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbYmVzdF0sIGJwcCk7CisJCQlyZXR1cm4gKHJlZnJlc2hfc3BlY2lmaWVkKSA/IDIgOiAxOworCQl9CiAKLQlkaWZmID0gMiAqICh4cmVzICsgeXJlcyk7Ci0JYmVzdCA9IC0xOwotCURQUklOVEsoIlRyeWluZyBiZXN0LWZpdCBtb2Rlc1xuIik7Ci0JZm9yIChpID0gMDsgaSA8IGRic2l6ZTsgaSsrKSB7Ci0JCURQUklOVEsoIlRyeWluZyAlaXglaVxuIiwgZGJbaV0ueHJlcywgZGJbaV0ueXJlcyk7Ci0JCWlmICghZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbaV0sIGJwcCkpIHsKLQkJCXRkaWZmID0gYWJzKGRiW2ldLnhyZXMgLSB4cmVzKSArCi0JCQkJYWJzKGRiW2ldLnlyZXMgLSB5cmVzKTsKKwkJZGlmZiA9IDIgKiAoeHJlcyArIHlyZXMpOworCQliZXN0ID0gLTE7CisJCURQUklOVEsoIlRyeWluZyBiZXN0LWZpdCBtb2Rlc1xuIik7CisJCWZvciAoaSA9IDA7IGkgPCBkYnNpemU7IGkrKykgeworCQkJRFBSSU5USygiVHJ5aW5nICVpeCVpXG4iLCBkYltpXS54cmVzLCBkYltpXS55cmVzKTsKKwkJCWlmICghZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbaV0sIGJwcCkpIHsKKwkJCQl0ZGlmZiA9IGFicyhkYltpXS54cmVzIC0geHJlcykgKworCQkJCQlhYnMoZGJbaV0ueXJlcyAtIHlyZXMpOwogCi0JCQkvKgotCQkJICogUGVuYWxpemUgbW9kZXMgd2l0aCByZXNvbHV0aW9ucyBzbWFsbGVyCi0JCQkgKiB0aGFuIHJlcXVlc3RlZC4KLQkJCSAqLwotCQkJaWYgKHhyZXMgPiBkYltpXS54cmVzIHx8IHlyZXMgPiBkYltpXS55cmVzKQotCQkJCXRkaWZmICs9IHhyZXMgKyB5cmVzOworCQkJCS8qCisJCQkJICogUGVuYWxpemUgbW9kZXMgd2l0aCByZXNvbHV0aW9ucyBzbWFsbGVyCisJCQkJICogdGhhbiByZXF1ZXN0ZWQuCisJCQkJICovCisJCQkJaWYgKHhyZXMgPiBkYltpXS54cmVzIHx8IHlyZXMgPiBkYltpXS55cmVzKQorCQkJCQl0ZGlmZiArPSB4cmVzICsgeXJlczsKIAotCQkJaWYgKGRpZmYgPiB0ZGlmZikgewotCQkJCWRpZmYgPSB0ZGlmZjsKLQkJCQliZXN0ID0gaTsKKwkJCQlpZiAoZGlmZiA+IHRkaWZmKSB7CisJCQkJCWRpZmYgPSB0ZGlmZjsKKwkJCQkJYmVzdCA9IGk7CisJCQkJfQogCQkJfQogCQl9CisJCWlmIChiZXN0ICE9IC0xKSB7CisJCQlmYl90cnlfbW9kZSh2YXIsIGluZm8sICZkYltiZXN0XSwgYnBwKTsKKwkJCXJldHVybiA1OworCQl9CiAJfQotCWlmIChiZXN0ICE9IC0xKSB7Ci0JICAgIGZiX3RyeV9tb2RlKHZhciwgaW5mbywgJmRiW2Jlc3RdLCBicHApOwotCSAgICByZXR1cm4gNTsKLQl9Ci0gICAgfQogCi0gICAgRFBSSU5USygiVHJ5aW5nIGRlZmF1bHQgdmlkZW8gbW9kZVxuIik7Ci0gICAgaWYgKCFmYl90cnlfbW9kZSh2YXIsIGluZm8sIGRlZmF1bHRfbW9kZSwgZGVmYXVsdF9icHApKQotCXJldHVybiAzOworCURQUklOVEsoIlRyeWluZyBkZWZhdWx0IHZpZGVvIG1vZGVcbiIpOworCWlmICghZmJfdHJ5X21vZGUodmFyLCBpbmZvLCBkZWZhdWx0X21vZGUsIGRlZmF1bHRfYnBwKSkKKwkJcmV0dXJuIDM7CiAKLSAgICBEUFJJTlRLKCJUcnlpbmcgYWxsIG1vZGVzXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZGJzaXplOyBpKyspCi0JaWYgKCFmYl90cnlfbW9kZSh2YXIsIGluZm8sICZkYltpXSwgZGVmYXVsdF9icHApKQotCSAgICByZXR1cm4gNDsKKwlEUFJJTlRLKCJUcnlpbmcgYWxsIG1vZGVzXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGJzaXplOyBpKyspCisJCWlmICghZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbaV0sIGRlZmF1bHRfYnBwKSkKKwkJCXJldHVybiA0OwogCi0gICAgRFBSSU5USygiTm8gdmFsaWQgbW9kZSBmb3VuZFxuIik7Ci0gICAgcmV0dXJuIDA7CisJRFBSSU5USygiTm8gdmFsaWQgbW9kZSBmb3VuZFxuIik7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRkaS5jIGIvZHJpdmVycy92aWRlby9tc20vbWRkaS5jCmluZGV4IDE3OGIwNzIuLjQ1MjdjYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kZGkuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZGRpLmMKQEAgLTcxNSw3ICs3MTUsNyBAQAogCiAJbWRkaS0+aW50X2VuYWJsZSA9IDA7CiAJbWRkaV93cml0ZWwobWRkaS0+aW50X2VuYWJsZSwgSU5URU4pOwotCXJldCA9IHJlcXVlc3RfaXJxKG1kZGktPmlycSwgbWRkaV9pc3IsIElSUUZfRElTQUJMRUQsICJtZGRpIiwKKwlyZXQgPSByZXF1ZXN0X2lycShtZGRpLT5pcnEsIG1kZGlfaXNyLCAwLCAibWRkaSIsCiAJCQkgICZtZGRpLT5jbGllbnRfZGF0YSk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIm1kZGk6IGZhaWxlZCB0byByZXF1ZXN0IGVuYWJsZSBpcnEhXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kcC5jIGIvZHJpdmVycy92aWRlby9tc20vbWRwLmMKaW5kZXggMjQzZDE2Zi4uY2IyZGRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRwLmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJtZHBfaHcuaCIKIApAQCAtNDIxLDEwICs0MjIsMTEgQEAKIAljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJtZHBfY2xrIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIm1kcDogZmFpbGVkIHRvIGdldCBtZHAgY2xrIik7Ci0JCXJldHVybiBQVFJfRVJSKGNsayk7CisJCXJldCA9IFBUUl9FUlIoY2xrKTsKKwkJZ290byBlcnJvcl9nZXRfY2xrOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKG1kcC0+aXJxLCBtZHBfaXNyLCBJUlFGX0RJU0FCTEVELCAibXNtX21kcCIsIG1kcCk7CisJcmV0ID0gcmVxdWVzdF9pcnEobWRwLT5pcnEsIG1kcF9pc3IsIDAsICJtc21fbWRwIiwgbWRwKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JlcXVlc3RfaXJxOwogCWRpc2FibGVfaXJxKG1kcC0+aXJxKTsKQEAgLTQ5NSw2ICs0OTcsNyBAQAogZXJyb3JfZGV2aWNlX3JlZ2lzdGVyOgogCWZyZWVfaXJxKG1kcC0+aXJxLCBtZHApOwogZXJyb3JfcmVxdWVzdF9pcnE6CitlcnJvcl9nZXRfY2xrOgogCWlvdW5tYXAobWRwLT5iYXNlKTsKIGVycm9yX2dldF9pcnE6CiBlcnJvcl9pb3JlbWFwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9teDNmYi5jIGIvZHJpdmVycy92aWRlby9teDNmYi5jCmluZGV4IDdlM2E0OTAuLmUzNDA2YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXgzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL214M2ZiLmMKQEAgLTM4Miw2ICszODIsOSBAQAogCXVpbnQzMl90IGVuYWJsZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmIChteDNfZmJpLT50eGQgPT0gTlVMTCkKKwkJcmV0dXJuOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm14M2ZiLT5sb2NrLCBmbGFncyk7CiAKIAllbmFibGVkID0gc2RjX2ZiX3VuaW5pdChteDNfZmJpKTsKQEAgLTk4Niw5ICs5ODksMTkgQEAKIHsKIAlzdHJ1Y3QgbXgzZmJfaW5mbyAqbXgzX2ZiaSA9IGZiaS0+cGFyOwogCXN0cnVjdCBteDNmYl9kYXRhICpteDNmYiA9IG14M19mYmktPm14M2ZiOworCWludCB3YXNfYmxhbmsgPSBteDNfZmJpLT5ibGFuazsKIAogCW14M19mYmktPmJsYW5rID0gYmxhbms7CiAKKwkvKiBBdHRlbnRpb24hCisJICogRG8gbm90IGNhbGwgc2RjX2Rpc2FibGVfY2hhbm5lbCgpIGZvciBhIGNoYW5uZWwgdGhhdCBpcyBkaXNhYmxlZAorCSAqIGFscmVhZHkhIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBrZXJuZWwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlCisJICogKG14M19mYmktPnR4ZCBpcyBOVUxMKS4gSGlkZSB0aGUgZmFjdCwgdGhhdCBhbGwgYmxhbmsgbW9kZXMgYXJlCisJICogaGFuZGxlZCBlcXVhbGx5IGJ5IHRoaXMgZHJpdmVyLgorCSAqLworCWlmIChibGFuayA+IEZCX0JMQU5LX1VOQkxBTksgJiYgd2FzX2JsYW5rID4gRkJfQkxBTktfVU5CTEFOSykKKwkJcmV0dXJuOworCiAJc3dpdGNoIChibGFuaykgewogCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgogCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKQEAgLTEwNjIsMTUgKzEwNzUsMTUgQEAKIAl5X2JvdHRvbSA9IHZhci0+eW9mZnNldDsKIAogCWlmICghKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkpCi0JCXlfYm90dG9tICs9IHZhci0+eXJlczsKKwkJeV9ib3R0b20gKz0gZmJpLT52YXIueXJlczsKIAogCWlmICh5X2JvdHRvbSA+IGZiaS0+dmFyLnlyZXNfdmlydHVhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZteDNfZmJpLT5tdXRleCk7CiAKLQlvZmZzZXQgPSAodmFyLT55b2Zmc2V0ICogdmFyLT54cmVzX3ZpcnR1YWwgKyB2YXItPnhvZmZzZXQpICoKLQkJKHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKKwlvZmZzZXQgPSB2YXItPnlvZmZzZXQgKiBmYmktPmZpeC5saW5lX2xlbmd0aAorCSAgICAgICArIHZhci0+eG9mZnNldCAqIChmYmktPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOwogCWJhc2UgPSBmYmktPmZpeC5zbWVtX3N0YXJ0ICsgb2Zmc2V0OwogCiAJZGV2X2RiZyhmYmktPmRldmljZSwgIlVwZGF0aW5nIFNEQyBCRyBidWYgJWQgYWRkcmVzcz0weCUwOGxYXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9teHNmYi5jIGIvZHJpdmVycy92aWRlby9teHNmYi5jCmluZGV4IDBiMmYyZGQuLmQ4MzdkNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXhzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL214c2ZiLmMKQEAgLTM5LDYgKzM5LDcgQEAKICAqIHRoZSByZXF1aXJlZCB2YWx1ZSBpbiB0aGUgaW14X2ZiX3ZpZGVvbW9kZSBzdHJ1Y3R1cmUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9uZW9mYi5jIGIvZHJpdmVycy92aWRlby9uZW9mYi5jCmluZGV4IDU4ODUyN2EuLmZlZWE3YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbmVvZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKQEAgLTExODUsOCArMTE4NSw4IEBACiAKIAlEQkcoIm5lb2ZiX3VwZGF0ZV9zdGFydCIpOwogCi0JQmFzZSA9ICh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCArIHZhci0+eG9mZnNldCkgPj4gMjsKLQlCYXNlICo9ICh2YXItPmJpdHNfcGVyX3BpeGVsICsgNykgLyA4OworCUJhc2UgPSAodmFyLT55b2Zmc2V0ICogaW5mby0+dmFyLnhyZXNfdmlydHVhbCArIHZhci0+eG9mZnNldCkgPj4gMjsKKwlCYXNlICo9IChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgKyA3KSAvIDg7CiAKIAluZW9VbmxvY2soKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udWM5MDBmYi5jIGIvZHJpdmVycy92aWRlby9udWM5MDBmYi5jCmluZGV4IDBmZmY1OTcuLmQxZmJiZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnVjOTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL251YzkwMGZiLmMKQEAgLTM5LDcgKzM5LDYgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGRtLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgotI2luY2x1ZGUgPG1hY2gvY2xrZGV2Lmg+CiAKICNpbmNsdWRlICJudWM5MDBmYi5oIgogCkBAIC01ODgsNyArNTg3LDcgQEAKIAlmYmluZm8tPmZsYWdzCQkJPSBGQklORk9fRkxBR19ERUZBVUxUOwogCWZiaW5mby0+cHNldWRvX3BhbGV0dGUJCT0gJmZiaS0+cHNldWRvX3BhbDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgbnVjOTAwZmJfaXJxaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIG51YzkwMGZiX2lycWhhbmRsZXIsIDAsCiAJCQkgIHBkZXYtPm5hbWUsIGZiaW5mbyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVnaXN0ZXIgaXJxIGhhbmRsZXIgJWQgLWVyciAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnIGIvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKaW5kZXggMTk2ZmEyZS4uODRmZjIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKQEAgLTksMzUgKzksNiBAQAogCWhlbHAKICAgICAgICAgICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciBPTUFQIGJhc2VkIGJvYXJkcy4KIAotY29uZmlnIEZCX09NQVBfTENEX1ZHQQotICAgICAgICBib29sICJVc2UgTENEIGluIFZHQSBtb2RlIgotCSAgICAgICAgZGVwZW5kcyBvbiBNQUNIX09NQVBfMzQzMFNEUCB8fCBNQUNIX09NQVBfTERQCi0JCWhlbHAKLQkJICBTZXQgTENEIHJlc29sdXRpb24gYXMgVkdBICg2NDAgWCA0ODApLgotCQkgIERlZmF1bHQgcmVzb2x1dGlvbiB3aXRob3V0IHRoaXMgb3B0aW9uIGlzIFFWR0EoMzIwIFggMjQwKS4KLQkJICBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgZHJpdmVycy92aWRlby9vbWFwL2xjZF9sZHAuYyBmaWxlCi0JCSAgZm9yIGxjZCBkcml2ZXIgY29kZS4KLWNob2ljZQotCWRlcGVuZHMgb24gRkJfT01BUCAmJiBNQUNIX09WRVJPCi0JcHJvbXB0ICJTY3JlZW4gcmVzb2x1dGlvbiIKLQlkZWZhdWx0IEZCX09NQVBfMDc5TTNSCi0JaGVscAotCSAgU2VsZWN0ZWQgZGVzaXJlZCBzY3JlZW4gcmVzb2x1dGlvbgotCi1jb25maWcgRkJfT01BUF8wMzFNM1IKLQlib29sZWFuICI2NDAgeCA0ODAgQCA2MCBIeiBSZWR1Y2VkIGJsYW5raW5nIgotCi1jb25maWcgRkJfT01BUF8wNDhNM1IKLQlib29sZWFuICI4MDAgeCA2MDAgQCA2MCBIeiBSZWR1Y2VkIGJsYW5raW5nIgotCi1jb25maWcgRkJfT01BUF8wNzlNM1IKLQlib29sZWFuICIxMDI0IHggNzY4IEAgNjAgSHogUmVkdWNlZCBibGFua2luZyIKLQotY29uZmlnIEZCX09NQVBfMDkyTTlSCi0JYm9vbGVhbiAiMTI4MCB4IDcyMCBAIDYwIEh6IFJlZHVjZWQgYmxhbmtpbmciCi0KLWVuZGNob2ljZQotCiBjb25maWcgRkJfT01BUF9MQ0RDX0VYVEVSTkFMCiAJYm9vbCAiRXh0ZXJuYWwgTENEIGNvbnRyb2xsZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCX09NQVAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZQppbmRleCAyNWRiNTU2Li5lZjc4NTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlCkBAIC0xNyw3ICsxNyw2IEBACiBvYmpzLXkkKENPTkZJR19GQl9PTUFQX0xDRENfQkxJWlpBUkQpICs9IGJsaXp6YXJkLm8KIAogb2Jqcy15JChDT05GSUdfTUFDSF9BTVNfREVMVEEpICs9IGxjZF9hbXNfZGVsdGEubwotb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX0g0KSArPSBsY2RfaDQubwogb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX0gzKSArPSBsY2RfaDMubwogb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX1BBTE1URSkgKz0gbGNkX3BhbG10ZS5vCiBvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfUEFMTVRUKSArPSBsY2RfcGFsbXR0Lm8KQEAgLTI2LDE0ICsyNSw3IEBACiBvYmpzLSQoQ09ORklHX0FSQ0hfT01BUDE1WFgpJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gbGNkX2lubjE1MTAubwogb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX09TSykgKz0gbGNkX29zay5vCiAKLW9ianMteSQoQ09ORklHX01BQ0hfT01BUF9BUE9MTE9OKSArPSBsY2RfYXBvbGxvbi5vCi1vYmpzLXkkKENPTkZJR19NQUNIX09NQVBfMjQzMFNEUCkgKz0gbGNkXzI0MzBzZHAubwotb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQXzM0MzBTRFApICs9IGxjZF8yNDMwc2RwLm8KLW9ianMteSQoQ09ORklHX01BQ0hfT01BUF9MRFApICs9IGxjZF9sZHAubwotb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQM0VWTSkgKz0gbGNkX29tYXAzZXZtLm8KLW9ianMteSQoQ09ORklHX01BQ0hfT01BUDNfQkVBR0xFKSArPSBsY2Rfb21hcDNiZWFnbGUubwogb2Jqcy15JChDT05GSUdfRkJfT01BUF9MQ0RfTUlQSUQpICs9IGxjZF9taXBpZC5vCi1vYmpzLXkkKENPTkZJR19NQUNIX09WRVJPKSArPSBsY2Rfb3Zlcm8ubwogb2Jqcy15JChDT05GSUdfTUFDSF9IRVJBTEQpICs9IGxjZF9odGNoZXJhbGQubwogCiBvbWFwZmItb2JqcyA6PSAkKG9ianMteXkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkXzI0MzBzZHAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfMjQzMHNkcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VjY2M5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfMjQzMHNkcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIDI0MzBTRFAgYm9hcmQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YQotICogQXV0aG9yOiBIdW55dWUgWWF1IDxoeWF1QG12aXN0YS5jb20+Ci0gKgotICogRGVyaXZlZCBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC9sY2QtYXBvbGxvbi5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KLQotI2luY2x1ZGUgPHBsYXQvbXV4Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgIm9tYXBmYi5oIgotCi0jZGVmaW5lIFNEUDI0MzBfTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPCTkxCi0jZGVmaW5lIFNEUDI0MzBfTENEX1BBTkVMX0VOQUJMRV9HUElPCQkxNTQKLSNkZWZpbmUgU0RQMzQzMF9MQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU8JMjQKLSNkZWZpbmUgU0RQMzQzMF9MQ0RfUEFORUxfRU5BQkxFX0dQSU8JCTI4Ci0KLXN0YXRpYyB1bnNpZ25lZCBiYWNrbGlnaHRfZ3BpbzsKLXN0YXRpYyB1bnNpZ25lZCBlbmFibGVfZ3BpbzsKLQotI2RlZmluZSBMQ0RfUElYQ0xPQ0tfTUFYCQk1NDAwIC8qIGZyZXEgNS40IE1IeiAqLwotI2RlZmluZSBQTV9SRUNFSVZFUiAgICAgICAgICAgICBUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUgotI2RlZmluZSBFTkFCTEVfVkFVWDJfREVESUNBVEVEICAweDA5Ci0jZGVmaW5lIEVOQUJMRV9WQVVYMl9ERVZfR1JQICAgIDB4MjAKLSNkZWZpbmUgRU5BQkxFX1ZBVVgzX0RFRElDQVRFRAkweDAzCi0jZGVmaW5lIEVOQUJMRV9WQVVYM19ERVZfR1JQCTB4MjAKLQotI2RlZmluZSBFTkFCTEVfVlBMTDJfREVESUNBVEVEICAgICAgICAgIDB4MDUKLSNkZWZpbmUgRU5BQkxFX1ZQTEwyX0RFVl9HUlAgICAgICAgICAgICAweEUwCi0jZGVmaW5lIFRXTDQwMzBfVlBMTDJfREVWX0dSUCAgICAgICAgICAgMHgzMwotI2RlZmluZSBUV0w0MDMwX1ZQTEwyX0RFRElDQVRFRCAgICAgICAgIDB4MzYKLQotI2RlZmluZSB0Ml9vdXQoYywgciwgdikgdHdsX2kyY193cml0ZV91OChjLCByLCB2KQotCi0KLXN0YXRpYyBpbnQgc2RwMjQzMF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAotCQkJCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKLXsKLQlpZiAobWFjaGluZV9pc19vbWFwXzM0MzBzZHAoKSkgewotCQllbmFibGVfZ3BpbyAgICA9IFNEUDM0MzBfTENEX1BBTkVMX0VOQUJMRV9HUElPOwotCQliYWNrbGlnaHRfZ3BpbyA9IFNEUDM0MzBfTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPOwotCX0gZWxzZSB7Ci0JCWVuYWJsZV9ncGlvICAgID0gU0RQMjQzMF9MQ0RfUEFORUxfRU5BQkxFX0dQSU87Ci0JCWJhY2tsaWdodF9ncGlvID0gU0RQMjQzMF9MQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU87Ci0JfQotCi0JZ3Bpb19yZXF1ZXN0KGVuYWJsZV9ncGlvLCAiTENEIGVuYWJsZSIpOwkvKiBMQ0QgcGFuZWwgKi8KLQlncGlvX3JlcXVlc3QoYmFja2xpZ2h0X2dwaW8sICJMQ0QgYmwiKTsJCS8qIExDRCBiYWNrbGlnaHQgKi8KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZW5hYmxlX2dwaW8sIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChiYWNrbGlnaHRfZ3BpbywgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2RwMjQzMF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fZnJlZShiYWNrbGlnaHRfZ3Bpbyk7Ci0JZ3Bpb19mcmVlKGVuYWJsZV9ncGlvKTsKLX0KLQotc3RhdGljIGludCBzZHAyNDMwX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQl1OCBkZWRfdmFsLCBkZWRfcmVnOwotCXU4IGdycF92YWwsIGdycF9yZWc7Ci0KLQlpZiAobWFjaGluZV9pc19vbWFwXzM0MzBzZHAoKSkgewotCQlkZWRfcmVnID0gVFdMNDAzMF9WQVVYM19ERURJQ0FURUQ7Ci0JCWRlZF92YWwgPSBFTkFCTEVfVkFVWDNfREVESUNBVEVEOwotCQlncnBfcmVnID0gVFdMNDAzMF9WQVVYM19ERVZfR1JQOwotCQlncnBfdmFsID0gRU5BQkxFX1ZBVVgzX0RFVl9HUlA7Ci0KLQkJaWYgKG9tYXBfcmV2KCkgPiBPTUFQMzQzMF9SRVZfRVMxXzApIHsKLQkJCXQyX291dChQTV9SRUNFSVZFUiwgRU5BQkxFX1ZQTEwyX0RFRElDQVRFRCwKLQkJCQkJVFdMNDAzMF9WUExMMl9ERURJQ0FURUQpOwotCQkJdDJfb3V0KFBNX1JFQ0VJVkVSLCBFTkFCTEVfVlBMTDJfREVWX0dSUCwKLQkJCQkJVFdMNDAzMF9WUExMMl9ERVZfR1JQKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWRlZF9yZWcgPSBUV0w0MDMwX1ZBVVgyX0RFRElDQVRFRDsKLQkJZGVkX3ZhbCA9IEVOQUJMRV9WQVVYMl9ERURJQ0FURUQ7Ci0JCWdycF9yZWcgPSBUV0w0MDMwX1ZBVVgyX0RFVl9HUlA7Ci0JCWdycF92YWwgPSBFTkFCTEVfVkFVWDJfREVWX0dSUDsKLQl9Ci0KLQlncGlvX3NldF92YWx1ZShlbmFibGVfZ3BpbywgMSk7Ci0JZ3Bpb19zZXRfdmFsdWUoYmFja2xpZ2h0X2dwaW8sIDEpOwotCi0JaWYgKDAgIT0gdDJfb3V0KFBNX1JFQ0VJVkVSLCBkZWRfdmFsLCBkZWRfcmVnKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKDAgIT0gdDJfb3V0KFBNX1JFQ0VJVkVSLCBncnBfdmFsLCBncnBfcmVnKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2RwMjQzMF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fc2V0X3ZhbHVlKGVuYWJsZV9ncGlvLCAwKTsKLQlncGlvX3NldF92YWx1ZShiYWNrbGlnaHRfZ3BpbywgMCk7Ci0JaWYgKG9tYXBfcmV2KCkgPiBPTUFQMzQzMF9SRVZfRVMxXzApIHsKLQkJdDJfb3V0KFBNX1JFQ0VJVkVSLCAweDAsIFRXTDQwMzBfVlBMTDJfREVESUNBVEVEKTsKLQkJdDJfb3V0KFBNX1JFQ0VJVkVSLCAweDAsIFRXTDQwMzBfVlBMTDJfREVWX0dSUCk7Ci0JCW1zbGVlcCg0KTsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNkcDI0MzBfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBsY2RfcGFuZWwgc2RwMjQzMF9wYW5lbCA9IHsKLQkubmFtZQkJPSAic2RwMjQzMCIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8Ci0JCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMsCi0KLQkuYnBwCQk9IDE2LAotCS5kYXRhX2xpbmVzCT0gMTYsCi0JLnhfcmVzCQk9IDI0MCwKLQkueV9yZXMJCT0gMzIwLAotCS5oc3cJCT0gMywJCS8qIGhzeW5jX2xlbiAoNCkgLSAxICovCi0JLmhmcAkJPSAzLAkJLyogcmlnaHRfbWFyZ2luICg0KSAtIDEgKi8KLQkuaGJwCQk9IDM5LAkJLyogbGVmdF9tYXJnaW4gKDQwKSAtIDEgKi8KLQkudnN3CQk9IDEsCQkvKiB2c3luY19sZW4gKDIpIC0gMSAqLwotCS52ZnAJCT0gMiwJCS8qIGxvd2VyX21hcmdpbiAqLwotCS52YnAJCT0gNywJCS8qIHVwcGVyX21hcmdpbiAoOCkgLSAxICovCi0KLQkucGl4ZWxfY2xvY2sJPSBMQ0RfUElYQ0xPQ0tfTUFYLAotCi0JLmluaXQJCT0gc2RwMjQzMF9wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gc2RwMjQzMF9wYW5lbF9jbGVhbnVwLAotCS5lbmFibGUJCT0gc2RwMjQzMF9wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSBzZHAyNDMwX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gc2RwMjQzMF9wYW5lbF9nZXRfY2FwcywKLX07Ci0KLXN0YXRpYyBpbnQgc2RwMjQzMF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmc2RwMjQzMF9wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2RwMjQzMF9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZHAyNDMwX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQkJcG1fbWVzc2FnZV90IG1lc2cpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2RwMjQzMF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZHAyNDMwX3BhbmVsX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gc2RwMjQzMF9wYW5lbF9wcm9iZSwKLQkucmVtb3ZlCQk9IHNkcDI0MzBfcGFuZWxfcmVtb3ZlLAotCS5zdXNwZW5kCT0gc2RwMjQzMF9wYW5lbF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc2RwMjQzMF9wYW5lbF9yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInNkcDI0MzBfbGNkIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNkcDI0MzBfcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZHAyNDMwX3BhbmVsX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzZHAyNDMwX3BhbmVsX2Rydl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNkcDI0MzBfcGFuZWxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc2RwMjQzMF9wYW5lbF9kcnZfaW5pdCk7Ci1tb2R1bGVfZXhpdChzZHAyNDMwX3BhbmVsX2Rydl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfYXBvbGxvbi5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9hcG9sbG9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDU5ZDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9hcG9sbG9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgU2Ftc3VuZyBPTUFQMiBBcG9sbG9uIGJvYXJkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1LDIwMDYgU2Ftc3VuZyBFbGVjdHJvbmljcwotICogQXV0aG9yOiBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgotICoKLSAqIERlcml2ZWQgZnJvbSBkcml2ZXJzL3ZpZGVvL29tYXAvbGNkLWg0LmMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLQotI2luY2x1ZGUgIm9tYXBmYi5oIgotCi0vKiAjZGVmaW5lIFVTRV8zNUlOQ0hfTENEIDEgKi8KLQotc3RhdGljIGludCBhcG9sbG9uX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCi0JCQkJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhcG9sbG9uX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci19Ci0KLXN0YXRpYyBpbnQgYXBvbGxvbl9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwb2xsb25fcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYXBvbGxvbl9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGxjZF9wYW5lbCBhcG9sbG9uX3BhbmVsID0gewotCS5uYW1lCQk9ICJhcG9sbG9uIiwKLQkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQgfCBPTUFQX0xDRENfSU5WX1ZTWU5DIHwKLQkJCSAgT01BUF9MQ0RDX0lOVl9IU1lOQywKLQotCS5icHAJCT0gMTYsCi0JLmRhdGFfbGluZXMJPSAxOCwKLSNpZmRlZiBVU0VfMzVJTkNIX0xDRAotCS54X3JlcwkJPSAyNDAsCi0JLnlfcmVzCQk9IDMyMCwKLQkuaHN3CQk9IDIsCi0JLmhmcAkJPSAzLAotCS5oYnAJCT0gOSwKLQkudnN3CQk9IDQsCi0JLnZmcAkJPSAzLAotCS52YnAJCT0gNSwKLSNlbHNlCi0JLnhfcmVzCQk9IDQ4MCwKLQkueV9yZXMJCT0gMjcyLAotCS5oc3cJCT0gNDEsCi0JLmhmcAkJPSAyLAotCS5oYnAJCT0gMiwKLQkudnN3CQk9IDEwLAotCS52ZnAJCT0gMiwKLQkudmJwCQk9IDIsCi0jZW5kaWYKLQkucGl4ZWxfY2xvY2sJPSA2MjUwLAotCi0JLmluaXQJCT0gYXBvbGxvbl9wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gYXBvbGxvbl9wYW5lbF9jbGVhbnVwLAotCS5lbmFibGUJCT0gYXBvbGxvbl9wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSBhcG9sbG9uX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gYXBvbGxvbl9wYW5lbF9nZXRfY2FwcywKLX07Ci0KLXN0YXRpYyBpbnQgYXBvbGxvbl9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmYXBvbGxvbl9wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXBvbGxvbl9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhcG9sbG9uX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQkgIHBtX21lc3NhZ2VfdCBtZXNnKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFwb2xsb25fcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXBvbGxvbl9wYW5lbF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGFwb2xsb25fcGFuZWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBhcG9sbG9uX3BhbmVsX3JlbW92ZSwKLQkuc3VzcGVuZAk9IGFwb2xsb25fcGFuZWxfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGFwb2xsb25fcGFuZWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJhcG9sbG9uX2xjZCIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhcG9sbG9uX3BhbmVsX2Rydl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXBvbGxvbl9wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXBvbGxvbl9wYW5lbF9kcnZfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhcG9sbG9uX3BhbmVsX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGFwb2xsb25fcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQoYXBvbGxvbl9wYW5lbF9kcnZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMKaW5kZXggOGRmNjg4Ny4uNjIyYWQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oMy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDMuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy90cHM2NTAxMC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlICJvbWFwZmIuaCIKIAogI2RlZmluZSBNT0RVTEVfTkFNRQkib21hcGZiLWxjZF9oMyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhMDZhOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUCBINCBib2FyZAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgotICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSAib21hcGZiLmgiCi0KLXN0YXRpYyBpbnQgaDRfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBoNF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotfQotCi1zdGF0aWMgaW50IGg0X3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaDRfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaDRfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbGNkX3BhbmVsIGg0X3BhbmVsID0gewotCS5uYW1lCQk9ICJoNCIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAotCi0JLmJwcAkJPSAxNiwKLQkuZGF0YV9saW5lcwk9IDE2LAotCS54X3JlcwkJPSAyNDAsCi0JLnlfcmVzCQk9IDMyMCwKLQkucGl4ZWxfY2xvY2sJPSA2MjUwLAotCS5oc3cJCT0gMTUsCi0JLmhmcAkJPSAxNSwKLQkuaGJwCQk9IDYwLAotCS52c3cJCT0gMSwKLQkudmZwCQk9IDEsCi0JLnZicAkJPSAxLAotCi0JLmluaXQJCT0gaDRfcGFuZWxfaW5pdCwKLQkuY2xlYW51cAk9IGg0X3BhbmVsX2NsZWFudXAsCi0JLmVuYWJsZQkJPSBoNF9wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSBoNF9wYW5lbF9kaXNhYmxlLAotCS5nZXRfY2Fwcwk9IGg0X3BhbmVsX2dldF9jYXBzLAotfTsKLQotc3RhdGljIGludCBoNF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmaDRfcGFuZWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGg0X3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGg0X3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaDRfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGg0X3BhbmVsX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gaDRfcGFuZWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBoNF9wYW5lbF9yZW1vdmUsCi0JLnN1c3BlbmQJPSBoNF9wYW5lbF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gaDRfcGFuZWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJsY2RfaDQiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaDRfcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoNF9wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaDRfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaDRfcGFuZWxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoaDRfcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQoaDRfcGFuZWxfZHJ2X2NsZWFudXApOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE2MTAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCmluZGV4IDlmZmY4NmYuLjEyY2M1MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgIm9tYXBmYi5oIgogCiAjZGVmaW5lIE1PRFVMRV9OQU1FCSJvbWFwZmItbGNkX2gzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9sZHAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbGRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNTk1MmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9sZHAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBMRFAgYm9hcmQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgV2luZFJpdmVyCi0gKiBBdXRob3I6IFN0YW5sZXkgTWlhbyA8c3RhbmxleS5taWFvQHdpbmRyaXZlci5jb20+Ci0gKgotICogRGVyaXZlZCBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC9sY2QtMjQzMHNkcC5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgotCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8cGxhdC9tdXguaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSAib21hcGZiLmgiCi0KLSNkZWZpbmUgTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPCSgxNSArIE9NQVBfTUFYX0dQSU9fTElORVMpCi0jZGVmaW5lIExDRF9QQU5FTF9FTkFCTEVfR1BJTwkJKDcgKyBPTUFQX01BWF9HUElPX0xJTkVTKQotCi0jZGVmaW5lIExDRF9QQU5FTF9SRVNFVF9HUElPCQk1NQotI2RlZmluZSBMQ0RfUEFORUxfUVZHQV9HUElPCQk1NgotCi0jaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEX1ZHQQotI2RlZmluZSBMQ0RfWFJFUwkJNDgwCi0jZGVmaW5lIExDRF9ZUkVTCQk2NDAKLSNkZWZpbmUgTENEX1BJWENMT0NLX01BWAk0MTcwMAotI2Vsc2UKLSNkZWZpbmUgTENEX1hSRVMJCTI0MAotI2RlZmluZSBMQ0RfWVJFUwkJMzIwCi0jZGVmaW5lIExDRF9QSVhDTE9DS19NQVgJMTg1MTg2Ci0jZW5kaWYKLQotI2RlZmluZSBQTV9SRUNFSVZFUiAgICAgICAgICAgICBUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUgotI2RlZmluZSBFTkFCTEVfVkFVWDJfREVESUNBVEVEICAweDA5Ci0jZGVmaW5lIEVOQUJMRV9WQVVYMl9ERVZfR1JQICAgIDB4MjAKLSNkZWZpbmUgRU5BQkxFX1ZBVVgzX0RFRElDQVRFRAkweDAzCi0jZGVmaW5lIEVOQUJMRV9WQVVYM19ERVZfR1JQCTB4MjAKLQotI2RlZmluZSBFTkFCTEVfVlBMTDJfREVESUNBVEVEICAgICAgICAgIDB4MDUKLSNkZWZpbmUgRU5BQkxFX1ZQTEwyX0RFVl9HUlAgICAgICAgICAgICAweEUwCi0jZGVmaW5lIFRXTDQwMzBfVlBMTDJfREVWX0dSUCAgICAgICAgICAgMHgzMwotI2RlZmluZSBUV0w0MDMwX1ZQTEwyX0RFRElDQVRFRCAgICAgICAgIDB4MzYKLQotI2RlZmluZSB0Ml9vdXQoYywgciwgdikgdHdsX2kyY193cml0ZV91OChjLCByLCB2KQotCi0KLXN0YXRpYyBpbnQgbGRwX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCi0JCQkJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQotewotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfUkVTRVRfR1BJTywgImxjZCByZXNldCIpOwotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfUVZHQV9HUElPLCAibGNkIHF2Z2EiKTsKLQlncGlvX3JlcXVlc3QoTENEX1BBTkVMX0VOQUJMRV9HUElPLCAibGNkIHBhbmVsIik7Ci0JZ3Bpb19yZXF1ZXN0KExDRF9QQU5FTF9CQUNLTElHSFRfR1BJTywgImxjZCBiYWNrbGlnaHQiKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfUVZHQV9HUElPLCAwKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoTENEX1BBTkVMX1JFU0VUX0dQSU8sIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfRU5BQkxFX0dQSU8sIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU8sIDApOwotCi0jaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEX1ZHQQotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9RVkdBX0dQSU8sIDApOwotI2Vsc2UKLQlncGlvX3NldF92YWx1ZShMQ0RfUEFORUxfUVZHQV9HUElPLCAxKTsKLSNlbmRpZgotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9SRVNFVF9HUElPLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBsZHBfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlncGlvX2ZyZWUoTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPKTsKLQlncGlvX2ZyZWUoTENEX1BBTkVMX0VOQUJMRV9HUElPKTsKLQlncGlvX2ZyZWUoTENEX1BBTkVMX1FWR0FfR1BJTyk7Ci0JZ3Bpb19mcmVlKExDRF9QQU5FTF9SRVNFVF9HUElPKTsKLX0KLQotc3RhdGljIGludCBsZHBfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWlmICgwICE9IHQyX291dChQTV9SRUNFSVZFUiwgRU5BQkxFX1ZQTEwyX0RFRElDQVRFRCwKLQkJCVRXTDQwMzBfVlBMTDJfREVESUNBVEVEKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKDAgIT0gdDJfb3V0KFBNX1JFQ0VJVkVSLCBFTkFCTEVfVlBMTDJfREVWX0dSUCwKLQkJCVRXTDQwMzBfVlBMTDJfREVWX0dSUCkpCi0JCXJldHVybiAtRUlPOwotCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KExDRF9QQU5FTF9FTkFCTEVfR1BJTywgMSk7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KExDRF9QQU5FTF9CQUNLTElHSFRfR1BJTywgMSk7Ci0KLQlpZiAoMCAhPSB0Ml9vdXQoUE1fUkVDRUlWRVIsIEVOQUJMRV9WQVVYM19ERURJQ0FURUQsCi0JCQkJVFdMNDAzMF9WQVVYM19ERURJQ0FURUQpKQotCQlyZXR1cm4gLUVJTzsKLQlpZiAoMCAhPSB0Ml9vdXQoUE1fUkVDRUlWRVIsIEVOQUJMRV9WQVVYM19ERVZfR1JQLAotCQkJCVRXTDQwMzBfVkFVWDNfREVWX0dSUCkpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGxkcF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfRU5BQkxFX0dQSU8sIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU8sIDApOwotCi0JdDJfb3V0KFBNX1JFQ0VJVkVSLCAweDAsIFRXTDQwMzBfVlBMTDJfREVESUNBVEVEKTsKLQl0Ml9vdXQoUE1fUkVDRUlWRVIsIDB4MCwgVFdMNDAzMF9WUExMMl9ERVZfR1JQKTsKLQltc2xlZXAoNCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxkcF9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGxjZF9wYW5lbCBsZHBfcGFuZWwgPSB7Ci0JLm5hbWUJCT0gImxkcCIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8Ci0JCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMsCi0KLQkuYnBwCQk9IDE2LAotCS5kYXRhX2xpbmVzCT0gMTgsCi0JLnhfcmVzCQk9IExDRF9YUkVTLAotCS55X3JlcwkJPSBMQ0RfWVJFUywKLQkuaHN3CQk9IDMsCQkvKiBoc3luY19sZW4gKDQpIC0gMSAqLwotCS5oZnAJCT0gMywJCS8qIHJpZ2h0X21hcmdpbiAoNCkgLSAxICovCi0JLmhicAkJPSAzOSwJCS8qIGxlZnRfbWFyZ2luICg0MCkgLSAxICovCi0JLnZzdwkJPSAxLAkJLyogdnN5bmNfbGVuICgyKSAtIDEgKi8KLQkudmZwCQk9IDIsCQkvKiBsb3dlcl9tYXJnaW4gKi8KLQkudmJwCQk9IDcsCQkvKiB1cHBlcl9tYXJnaW4gKDgpIC0gMSAqLwotCi0JLnBpeGVsX2Nsb2NrCT0gTENEX1BJWENMT0NLX01BWCwKLQotCS5pbml0CQk9IGxkcF9wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gbGRwX3BhbmVsX2NsZWFudXAsCi0JLmVuYWJsZQkJPSBsZHBfcGFuZWxfZW5hYmxlLAotCS5kaXNhYmxlCT0gbGRwX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gbGRwX3BhbmVsX2dldF9jYXBzLAotfTsKLQotc3RhdGljIGludCBsZHBfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJmxkcF9wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbGRwX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxkcF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxkcF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHBsYXRmb3JtX2RyaXZlciBsZHBfcGFuZWxfZHJpdmVyID0gewotCS5wcm9iZQkJPSBsZHBfcGFuZWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBsZHBfcGFuZWxfcmVtb3ZlLAotCS5zdXNwZW5kCT0gbGRwX3BhbmVsX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBsZHBfcGFuZWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJsZHBfbGNkIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGxkcF9wYW5lbF9kcnZfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmxkcF9wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbGRwX3BhbmVsX2Rydl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmxkcF9wYW5lbF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChsZHBfcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQobGRwX3BhbmVsX2Rydl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbWlwaWQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbWlwaWQuYwppbmRleCA5MGUzYmRkLi5lYjM4MWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX21pcGlkLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9taXBpZC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHBsYXQvbGNkX21pcGlkLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb21hcDNiZWFnbGUuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb21hcDNiZWFnbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjNmMzZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29tYXAzYmVhZ2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUDMgQmVhZ2xlIGJvYXJkCi0gKgotICogQXV0aG9yOiBLb2VuIEtvb2kgPGtvZW5Ab3BlbmVtYmVkZGVkLm9yZz4KLSAqCi0gKiBEZXJpdmVkIGZyb20gZHJpdmVycy92aWRlby9vbWFwL2xjZC1vbWFwM2V2bS5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSAib21hcGZiLmgiCi0KLSNkZWZpbmUgTENEX1BBTkVMX0VOQUJMRV9HUElPICAgICAgIDE3MAotCi1zdGF0aWMgaW50IG9tYXAzYmVhZ2xlX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCi0JCQkJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQotewotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfRU5BQkxFX0dQSU8sICJMQ0QgZW5hYmxlIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXAzYmVhZ2xlX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JZ3Bpb19mcmVlKExDRF9QQU5FTF9FTkFCTEVfR1BJTyk7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcDNiZWFnbGVfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9FTkFCTEVfR1BJTywgMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXAzYmVhZ2xlX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoTENEX1BBTkVMX0VOQUJMRV9HUElPLCAwKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcDNiZWFnbGVfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBsY2RfcGFuZWwgb21hcDNiZWFnbGVfcGFuZWwgPSB7Ci0JLm5hbWUJCT0gIm9tYXAzYmVhZ2xlIiwKLQkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCi0KLQkuYnBwCQk9IDE2LAotCS5kYXRhX2xpbmVzCT0gMjQsCi0JLnhfcmVzCQk9IDEwMjQsCi0JLnlfcmVzCQk9IDc2OCwKLQkuaHN3CQk9IDMsCQkvKiBoc3luY19sZW4gKDQpIC0gMSAqLwotCS5oZnAJCT0gMywJCS8qIHJpZ2h0X21hcmdpbiAoNCkgLSAxICovCi0JLmhicAkJPSAzOSwJCS8qIGxlZnRfbWFyZ2luICg0MCkgLSAxICovCi0JLnZzdwkJPSAxLAkJLyogdnN5bmNfbGVuICgyKSAtIDEgKi8KLQkudmZwCQk9IDIsCQkvKiBsb3dlcl9tYXJnaW4gKi8KLQkudmJwCQk9IDcsCQkvKiB1cHBlcl9tYXJnaW4gKDgpIC0gMSAqLwotCi0JLnBpeGVsX2Nsb2NrCT0gNjQwMDAsCi0KLQkuaW5pdAkJPSBvbWFwM2JlYWdsZV9wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gb21hcDNiZWFnbGVfcGFuZWxfY2xlYW51cCwKLQkuZW5hYmxlCQk9IG9tYXAzYmVhZ2xlX3BhbmVsX2VuYWJsZSwKLQkuZGlzYWJsZQk9IG9tYXAzYmVhZ2xlX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gb21hcDNiZWFnbGVfcGFuZWxfZ2V0X2NhcHMsCi19OwotCi1zdGF0aWMgaW50IG9tYXAzYmVhZ2xlX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZvbWFwM2JlYWdsZV9wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcDNiZWFnbGVfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcDNiZWFnbGVfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJCSAgIHBtX21lc3NhZ2VfdCBtZXNnKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXAzYmVhZ2xlX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXAzYmVhZ2xlX3BhbmVsX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gb21hcDNiZWFnbGVfcGFuZWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBvbWFwM2JlYWdsZV9wYW5lbF9yZW1vdmUsCi0JLnN1c3BlbmQJPSBvbWFwM2JlYWdsZV9wYW5lbF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gb21hcDNiZWFnbGVfcGFuZWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJvbWFwM2JlYWdsZV9sY2QiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgb21hcDNiZWFnbGVfcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwM2JlYWdsZV9wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgb21hcDNiZWFnbGVfcGFuZWxfZHJ2X2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcDNiZWFnbGVfcGFuZWxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQob21hcDNiZWFnbGVfcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQob21hcDNiZWFnbGVfcGFuZWxfZHJ2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vbWFwM2V2bS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vbWFwM2V2bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjg0MGRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb21hcDNldm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQMyBFVk0gYm9hcmQKLSAqCi0gKiBBdXRob3I6IFN0ZXZlIFNha29tYW4gPHN0ZXZlQHNha29tYW4uY29tPgotICoKLSAqIERlcml2ZWQgZnJvbSBkcml2ZXJzL3ZpZGVvL29tYXAvbGNkLWFwb2xsb24uYwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgotCi0jaW5jbHVkZSA8cGxhdC9tdXguaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSAib21hcGZiLmgiCi0KLSNkZWZpbmUgTENEX1BBTkVMX0VOQUJMRV9HUElPICAgICAgIDE1MwotI2RlZmluZSBMQ0RfUEFORUxfTFIgICAgICAgICAgICAgICAgMgotI2RlZmluZSBMQ0RfUEFORUxfVUQgICAgICAgICAgICAgICAgMwotI2RlZmluZSBMQ0RfUEFORUxfSU5JICAgICAgICAgICAgICAgMTUyCi0jZGVmaW5lIExDRF9QQU5FTF9RVkdBICAgICAgICAgICAgICAxNTQKLSNkZWZpbmUgTENEX1BBTkVMX1JFU0IgICAgICAgICAgICAgIDE1NQotCi0jZGVmaW5lIEVOQUJMRV9WREFDX0RFRElDQVRFRAkweDAzCi0jZGVmaW5lIEVOQUJMRV9WREFDX0RFVl9HUlAJMHgyMAotI2RlZmluZSBFTkFCTEVfVlBMTDJfREVESUNBVEVECTB4MDUKLSNkZWZpbmUgRU5BQkxFX1ZQTEwyX0RFVl9HUlAJMHhFMAotCi0jZGVmaW5lIFRXTF9MRURfTEVERU4JCTB4MDAKLSNkZWZpbmUgVFdMX1BXTUFfUFdNQU9OCQkweDAwCi0jZGVmaW5lIFRXTF9QV01BX1BXTUFPRkYJMHgwMQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGJrbGlnaHRfbGV2ZWw7Ci0KLXN0YXRpYyBpbnQgb21hcDNldm1fcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKLQkJCQlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCi17Ci0JZ3Bpb19yZXF1ZXN0KExDRF9QQU5FTF9MUiwgIkxDRCBsciIpOwotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfVUQsICJMQ0QgdWQiKTsKLQlncGlvX3JlcXVlc3QoTENEX1BBTkVMX0lOSSwgIkxDRCBpbmkiKTsKLQlncGlvX3JlcXVlc3QoTENEX1BBTkVMX1JFU0IsICJMQ0QgcmVzYiIpOwotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfUVZHQSwgIkxDRCBxdmdhIik7Ci0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoTENEX1BBTkVMX1JFU0IsIDEpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfSU5JLCAxKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoTENEX1BBTkVMX1FWR0EsIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfTFIsIDEpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfVUQsIDEpOwotCi0JdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9MRUQsIDB4MTEsIFRXTF9MRURfTEVERU4pOwotCXR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUFdNQSwgMHgwMSwgVFdMX1BXTUFfUFdNQU9OKTsKLQl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BXTUEsIDB4MDIsIFRXTF9QV01BX1BXTUFPRkYpOwotCWJrbGlnaHRfbGV2ZWwgPSAxMDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgb21hcDNldm1fcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlncGlvX2ZyZWUoTENEX1BBTkVMX1FWR0EpOwotCWdwaW9fZnJlZShMQ0RfUEFORUxfUkVTQik7Ci0JZ3Bpb19mcmVlKExDRF9QQU5FTF9JTkkpOwotCWdwaW9fZnJlZShMQ0RfUEFORUxfVUQpOwotCWdwaW9fZnJlZShMQ0RfUEFORUxfTFIpOwotfQotCi1zdGF0aWMgaW50IG9tYXAzZXZtX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlncGlvX3NldF92YWx1ZShMQ0RfUEFORUxfRU5BQkxFX0dQSU8sIDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwM2V2bV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9FTkFCTEVfR1BJTywgMSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAzZXZtX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXAzZXZtX2JrbGlnaHRfc2V0bGV2ZWwoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCi0JCQkJCQl1bnNpZ25lZCBpbnQgbGV2ZWwpCi17Ci0JdTggYzsKLQlpZiAoKGxldmVsID49IDApICYmIChsZXZlbCA8PSAxMDApKSB7Ci0JCWMgPSAoMTI1ICogKDEwMCAtIGxldmVsKSkgLyAxMDAgKyAyOwotCQl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BXTUEsIGMsIFRXTF9QV01BX1BXTUFPRkYpOwotCQlia2xpZ2h0X2xldmVsID0gbGV2ZWw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG9tYXAzZXZtX2JrbGlnaHRfZ2V0bGV2ZWwoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIGJrbGlnaHRfbGV2ZWw7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgb21hcDNldm1fYmtsaWdodF9nZXRtYXhsZXZlbChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlyZXR1cm4gMTAwOwotfQotCi1zdHJ1Y3QgbGNkX3BhbmVsIG9tYXAzZXZtX3BhbmVsID0gewotCS5uYW1lCQk9ICJvbWFwM2V2bSIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8Ci0JCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMsCi0KLQkuYnBwCQk9IDE2LAotCS5kYXRhX2xpbmVzCT0gMTgsCi0JLnhfcmVzCQk9IDQ4MCwKLQkueV9yZXMJCT0gNjQwLAotCS5oc3cJCT0gMywJCS8qIGhzeW5jX2xlbiAoNCkgLSAxICovCi0JLmhmcAkJPSAzLAkJLyogcmlnaHRfbWFyZ2luICg0KSAtIDEgKi8KLQkuaGJwCQk9IDM5LAkJLyogbGVmdF9tYXJnaW4gKDQwKSAtIDEgKi8KLQkudnN3CQk9IDEsCQkvKiB2c3luY19sZW4gKDIpIC0gMSAqLwotCS52ZnAJCT0gMiwJCS8qIGxvd2VyX21hcmdpbiAqLwotCS52YnAJCT0gNywJCS8qIHVwcGVyX21hcmdpbiAoOCkgLSAxICovCi0KLQkucGl4ZWxfY2xvY2sJPSAyNjAwMCwKLQotCS5pbml0CQk9IG9tYXAzZXZtX3BhbmVsX2luaXQsCi0JLmNsZWFudXAJPSBvbWFwM2V2bV9wYW5lbF9jbGVhbnVwLAotCS5lbmFibGUJCT0gb21hcDNldm1fcGFuZWxfZW5hYmxlLAotCS5kaXNhYmxlCT0gb21hcDNldm1fcGFuZWxfZGlzYWJsZSwKLQkuZ2V0X2NhcHMJPSBvbWFwM2V2bV9wYW5lbF9nZXRfY2FwcywKLQkuc2V0X2JrbGlnaHRfbGV2ZWwgICAgICA9IG9tYXAzZXZtX2JrbGlnaHRfc2V0bGV2ZWwsCi0JLmdldF9ia2xpZ2h0X2xldmVsICAgICAgPSBvbWFwM2V2bV9ia2xpZ2h0X2dldGxldmVsLAotCS5nZXRfYmtsaWdodF9tYXggICAgICAgID0gb21hcDNldm1fYmtsaWdodF9nZXRtYXhsZXZlbCwKLX07Ci0KLXN0YXRpYyBpbnQgb21hcDNldm1fcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJm9tYXAzZXZtX3BhbmVsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvbWFwM2V2bV9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvbWFwM2V2bV9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkJICAgcG1fbWVzc2FnZV90IG1lc2cpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcDNldm1fcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcDNldm1fcGFuZWxfZHJpdmVyID0gewotCS5wcm9iZQkJPSBvbWFwM2V2bV9wYW5lbF9wcm9iZSwKLQkucmVtb3ZlCQk9IG9tYXAzZXZtX3BhbmVsX3JlbW92ZSwKLQkuc3VzcGVuZAk9IG9tYXAzZXZtX3BhbmVsX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBvbWFwM2V2bV9wYW5lbF9yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gIm9tYXAzZXZtX2xjZCIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwM2V2bV9wYW5lbF9kcnZfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXAzZXZtX3BhbmVsX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBvbWFwM2V2bV9wYW5lbF9kcnZfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwM2V2bV9wYW5lbF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChvbWFwM2V2bV9wYW5lbF9kcnZfaW5pdCk7Ci1tb2R1bGVfZXhpdChvbWFwM2V2bV9wYW5lbF9kcnZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYwppbmRleCBiODdlOGI4Li42ZjhkMTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3NrLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlICJvbWFwZmIuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vdmVyby5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vdmVyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ5MzNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3Zlcm8uYworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBHdW1zdGl4IE92ZXJvCi0gKgotICogQXV0aG9yOiBTdGV2ZSBTYWtvbWFuIDxzdGV2ZUBzYWtvbWFuLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KLQotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPHBsYXQvbXV4Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgIm9tYXBmYi5oIgotCi0jZGVmaW5lIExDRF9FTkFCTEUgICAgICAgMTQ0Ci0KLXN0YXRpYyBpbnQgb3Zlcm9fcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKLQkJCQlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCi17Ci0JaWYgKChncGlvX3JlcXVlc3QoTENEX0VOQUJMRSwgIkxDRF9FTkFCTEUiKSA9PSAwKSAmJgotCSAgICAoZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KExDRF9FTkFCTEUsIDEpID09IDApKQotCQlncGlvX2V4cG9ydChMQ0RfRU5BQkxFLCAwKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiY291bGQgbm90IG9idGFpbiBncGlvIGZvciBMQ0RfRU5BQkxFXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBvdmVyb19wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fZnJlZShMQ0RfRU5BQkxFKTsKLX0KLQotc3RhdGljIGludCBvdmVyb19wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoTENEX0VOQUJMRSwgMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG92ZXJvX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoTENEX0VOQUJMRSwgMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG92ZXJvX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgbGNkX3BhbmVsIG92ZXJvX3BhbmVsID0gewotCS5uYW1lCQk9ICJvdmVybyIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAotCS5icHAJCT0gMTYsCi0JLmRhdGFfbGluZXMJPSAyNCwKLQotI2lmIGRlZmluZWQgQ09ORklHX0ZCX09NQVBfMDMxTTNSCi0KLQkvKiA2NDAgeCA0ODAgQCA2MCBIeiAgUmVkdWNlZCBibGFua2luZyBWRVNBIENWVCAwLjMxTTMtUiAqLwotCS54X3JlcwkJPSA2NDAsCi0JLnlfcmVzCQk9IDQ4MCwKLQkuaGZwCQk9IDQ4LAotCS5oc3cJCT0gMzIsCi0JLmhicAkJPSA4MCwKLQkudmZwCQk9IDMsCi0JLnZzdwkJPSA0LAotCS52YnAJCT0gNywKLQkucGl4ZWxfY2xvY2sJPSAyMzUwMCwKLQotI2VsaWYgZGVmaW5lZCBDT05GSUdfRkJfT01BUF8wNDhNM1IKLQotCS8qIDgwMCB4IDYwMCBAIDYwIEh6ICBSZWR1Y2VkIGJsYW5raW5nIFZFU0EgQ1ZUIDAuNDhNMy1SICovCi0JLnhfcmVzCQk9IDgwMCwKLQkueV9yZXMJCT0gNjAwLAotCS5oZnAJCT0gNDgsCi0JLmhzdwkJPSAzMiwKLQkuaGJwCQk9IDgwLAotCS52ZnAJCT0gMywKLQkudnN3CQk9IDQsCi0JLnZicAkJPSAxMSwKLQkucGl4ZWxfY2xvY2sJPSAzNTUwMCwKLQotI2VsaWYgZGVmaW5lZCBDT05GSUdfRkJfT01BUF8wNzlNM1IKLQotCS8qIDEwMjQgeCA3NjggQCA2MCBIeiAgUmVkdWNlZCBibGFua2luZyBWRVNBIENWVCAwLjc5TTMtUiAqLwotCS54X3JlcwkJPSAxMDI0LAotCS55X3JlcwkJPSA3NjgsCi0JLmhmcAkJPSA0OCwKLQkuaHN3CQk9IDMyLAotCS5oYnAJCT0gODAsCi0JLnZmcAkJPSAzLAotCS52c3cJCT0gNCwKLQkudmJwCQk9IDE1LAotCS5waXhlbF9jbG9jawk9IDU2MDAwLAotCi0jZWxpZiBkZWZpbmVkIENPTkZJR19GQl9PTUFQXzA5Mk05UgotCi0JLyogMTI4MCB4IDcyMCBAIDYwIEh6ICBSZWR1Y2VkIGJsYW5raW5nIFZFU0EgQ1ZUIDAuOTJNOS1SICovCi0JLnhfcmVzCQk9IDEyODAsCi0JLnlfcmVzCQk9IDcyMCwKLQkuaGZwCQk9IDQ4LAotCS5oc3cJCT0gMzIsCi0JLmhicAkJPSA4MCwKLQkudmZwCQk9IDMsCi0JLnZzdwkJPSA1LAotCS52YnAJCT0gMTMsCi0JLnBpeGVsX2Nsb2NrCT0gNjQwMDAsCi0KLSNlbHNlCi0KLQkvKiB1c2UgNjQwIHggNDgwIGlmIG5vIGNvbmZpZyBvcHRpb24gKi8KLQkvKiA2NDAgeCA0ODAgQCA2MCBIeiAgUmVkdWNlZCBibGFua2luZyBWRVNBIENWVCAwLjMxTTMtUiAqLwotCS54X3JlcwkJPSA2NDAsCi0JLnlfcmVzCQk9IDQ4MCwKLQkuaGZwCQk9IDQ4LAotCS5oc3cJCT0gMzIsCi0JLmhicAkJPSA4MCwKLQkudmZwCQk9IDMsCi0JLnZzdwkJPSA0LAotCS52YnAJCT0gNywKLQkucGl4ZWxfY2xvY2sJPSAyMzUwMCwKLQotI2VuZGlmCi0KLQkuaW5pdAkJPSBvdmVyb19wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gb3Zlcm9fcGFuZWxfY2xlYW51cCwKLQkuZW5hYmxlCQk9IG92ZXJvX3BhbmVsX2VuYWJsZSwKLQkuZGlzYWJsZQk9IG92ZXJvX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gb3Zlcm9fcGFuZWxfZ2V0X2NhcHMsCi19OwotCi1zdGF0aWMgaW50IG92ZXJvX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZvdmVyb19wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Zlcm9fcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JLyogb21hcGZiIGRvZXMgbm90IGhhdmUgdW5yZWdpc3Rlcl9wYW5lbCAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvdmVyb19wYW5lbF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IG92ZXJvX3BhbmVsX3Byb2JlLAotCS5yZW1vdmUJCT0gb3Zlcm9fcGFuZWxfcmVtb3ZlLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJvdmVyb19sY2QiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgb3Zlcm9fcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvdmVyb19wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgb3Zlcm9fcGFuZWxfZHJ2X2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3Zlcm9fcGFuZWxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQob3Zlcm9fcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQob3Zlcm9fcGFuZWxfZHJ2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXR0LmMKaW5kZXggZmYwZTZkNy4uYjUxYjMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10dC5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSAib21hcGZiLmgiCiAKIHN0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCmluZGV4IGIzZGRkNzQuLjI1ZDhlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9LY29uZmlnIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9LY29uZmlnCmluZGV4IDYwOWEyODAuLjhkOGUxZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL0tjb25maWcKQEAgLTEwLDYgKzEwLDEzIEBACiAJICBTdXBwb3J0cyBMQ0QgUGFuZWwgdXNlZCBpbiBUSSBTRFAzNDMwIGFuZCBFVk0gYm9hcmRzLAogCSAgT01BUDM1MTcgRVZNIGJvYXJkcyBhbmQgQ00tVDM1LgogCitjb25maWcgUEFORUxfRFZJCisJdHJpc3RhdGUgIkRWSSBvdXRwdXQiCisJZGVwZW5kcyBvbiBPTUFQMl9EU1NfRFBJCisJaGVscAorCSAgRHJpdmVyIGZvciBleHRlcm5hbCBtb25pdG9ycywgY29ubmVjdGVkIHZpYSBEVkkuIFRoZSBkcml2ZXIgdXNlcyBpMmMKKwkgIHRvIHJlYWQgRURJRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtb25pdG9yLgorCiBjb25maWcgUEFORUxfTEdQSElMSVBTX0xCMDM1UTAyCiAJdHJpc3RhdGUgIkxHLlBoaWxpcHMgTEIwMzVRMDIgTENEIFBhbmVsIgogCWRlcGVuZHMgb24gT01BUDJfRFNTX0RQSSAmJiBTUEkKQEAgLTE5LDIwICsyNiwzMCBAQAogY29uZmlnIFBBTkVMX1NIQVJQX0xTMDM3VjdEVzAxCiAgICAgICAgIHRyaXN0YXRlICJTaGFycCBMUzAzN1Y3RFcwMSBMQ0QgUGFuZWwiCiAgICAgICAgIGRlcGVuZHMgb24gT01BUDJfRFNTX0RQSQotICAgICAgICBzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorICAgICAgICBkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKICAgICAgICAgaGVscAogICAgICAgICAgIExDRCBQYW5lbCB1c2VkIGluIFRJJ3MgU0RQMzQzMCBhbmQgRVZNIGJvYXJkcwogCiBjb25maWcgUEFORUxfTkVDX05MODA0OEhMMTFfMDFCCiAJdHJpc3RhdGUgIk5FQyBOTDgwNDhITDExLTAxQiBQYW5lbCIKIAlkZXBlbmRzIG9uIE9NQVAyX0RTU19EUEkKKwlkZXBlbmRzIG9uIFNQSQorCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogCWhlbHAKIAkJVGhpcyBORUMgTkw4MDQ4SEwxMS0wMUIgcGFuZWwgaXMgVEZUIExDRAogCQl1c2VkIGluIHRoZSBab29tMi8zLzM2MzAgc2RwIGJvYXJkcy4KIAorY29uZmlnIFBBTkVMX1BJQ09ETFAKKwl0cmlzdGF0ZSAiVEkgUElDTyBETFAgbWluaS1wcm9qZWN0b3IiCisJZGVwZW5kcyBvbiBPTUFQMl9EU1MgJiYgSTJDCisJaGVscAorCQlBIG1pbmktcHJvamVjdG9yIHVzZWQgaW4gVEkncyBTRFA0NDMwIGFuZCBFVk0gYm9hcmRzCisJCUZvciBtb3JlIGluZm8gcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cuZGxwLmNvbS9wcm9qZWN0b3IvCisKIGNvbmZpZyBQQU5FTF9UQUFMCiAgICAgICAgIHRyaXN0YXRlICJUYWFsIERTSSBQYW5lbCIKICAgICAgICAgZGVwZW5kcyBvbiBPTUFQMl9EU1NfRFNJCisgICAgICAgIGRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogICAgICAgICBoZWxwCiAgICAgICAgICAgVGFhbCBEU0kgY29tbWFuZCBtb2RlIHBhbmVsIGZyb20gVFBPLgogCkBAIC00NSw3ICs2MiwxNCBAQAogY29uZmlnIFBBTkVMX0FDWDU2NUFLTQogCXRyaXN0YXRlICJBQ1g1NjVBS00gUGFuZWwiCiAJZGVwZW5kcyBvbiBPTUFQMl9EU1NfU0RJICYmIFNQSQotCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgTENEIHBhbmVsIHVzZWQgb24gTm9raWEgTjkwMAorCitjb25maWcgUEFORUxfTjhYMAorCXRyaXN0YXRlICJOOFgwIFBhbmVsIgorCWRlcGVuZHMgb24gT01BUDJfRFNTX1JGQkkgJiYgU1BJCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJaGVscAorCSAgVGhpcyBpcyB0aGUgTENEIHBhbmVsIHVzZWQgb24gTm9raWEgTjh4MAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvTWFrZWZpbGUKaW5kZXggMGY2MDFhYjNhLi5mYmZhZmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvTWFrZWZpbGUKQEAgLTEsOCArMSwxMSBAQAogb2JqLSQoQ09ORklHX1BBTkVMX0dFTkVSSUNfRFBJKSArPSBwYW5lbC1nZW5lcmljLWRwaS5vCitvYmotJChDT05GSUdfUEFORUxfRFZJKSArPSBwYW5lbC1kdmkubwogb2JqLSQoQ09ORklHX1BBTkVMX0xHUEhJTElQU19MQjAzNVEwMikgKz0gcGFuZWwtbGdwaGlsaXBzLWxiMDM1cTAyLm8KIG9iai0kKENPTkZJR19QQU5FTF9TSEFSUF9MUzAzN1Y3RFcwMSkgKz0gcGFuZWwtc2hhcnAtbHMwMzd2N2R3MDEubwogb2JqLSQoQ09ORklHX1BBTkVMX05FQ19OTDgwNDhITDExXzAxQikgKz0gcGFuZWwtbmVjLW5sODA0OGhsMTEtMDFiLm8KIAogb2JqLSQoQ09ORklHX1BBTkVMX1RBQUwpICs9IHBhbmVsLXRhYWwubworb2JqLSQoQ09ORklHX1BBTkVMX1BJQ09ETFApICs9ICBwYW5lbC1waWNvZGxwLm8KIG9iai0kKENPTkZJR19QQU5FTF9UUE9fVEQwNDNNVEVBMSkgKz0gcGFuZWwtdHBvLXRkMDQzbXRlYTEubwogb2JqLSQoQ09ORklHX1BBTkVMX0FDWDU2NUFLTSkgKz0gcGFuZWwtYWN4NTY1YWttLm8KK29iai0kKENPTkZJR19QQU5FTF9OOFgwKSArPSBwYW5lbC1uOHgwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtZHZpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWR2aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZWIxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWR2aS5jCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogRFZJIG91dHB1dCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzIEluYworICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9lZGlkLmg+CisKKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWR2aS5oPgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyBwYW5lbF9kdmlfZGVmYXVsdF90aW1pbmdzID0geworCS54X3JlcwkJPSA2NDAsCisJLnlfcmVzCQk9IDQ4MCwKKworCS5waXhlbF9jbG9jawk9IDIzNTAwLAorCisJLmhmcAkJPSA0OCwKKwkuaHN3CQk9IDMyLAorCS5oYnAJCT0gODAsCisKKwkudmZwCQk9IDMsCisJLnZzdwkJPSA0LAorCS52YnAJCT0gNywKK307CisKK3N0cnVjdCBwYW5lbF9kcnZfZGF0YSB7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OworCisJc3RydWN0IG11dGV4IGxvY2s7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YQorKmdldF9wZGF0YShjb25zdCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuIGRzc2Rldi0+ZGF0YTsKK30KKworc3RhdGljIGludCBwYW5lbF9kdmlfcG93ZXJfb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBnZXRfcGRhdGEoZHNzZGV2KTsKKwlpbnQgcjsKKworCWlmIChkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKQorCQlyZXR1cm4gMDsKKworCXIgPSBvbWFwZHNzX2RwaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOworCWlmIChyKQorCQlnb3RvIGVycjA7CisKKwlpZiAocGRhdGEtPnBsYXRmb3JtX2VuYWJsZSkgeworCQlyID0gcGRhdGEtPnBsYXRmb3JtX2VuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCWdvdG8gZXJyMTsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjE6CisJb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnIwOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBwYW5lbF9kdmlfcG93ZXJfb2ZmKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZ2V0X3BkYXRhKGRzc2Rldik7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJcmV0dXJuOworCisJaWYgKHBkYXRhLT5wbGF0Zm9ybV9kaXNhYmxlKQorCQlwZGF0YS0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOworCisJb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhOworCisJZGRhdGEgPSBremFsbG9jKHNpemVvZigqZGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9IHBhbmVsX2R2aV9kZWZhdWx0X3RpbWluZ3M7CisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUOworCisJZGRhdGEtPmRzc2RldiA9IGRzc2RldjsKKwltdXRleF9pbml0KCZkZGF0YS0+bG9jayk7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2LCBkZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBhbmVsX2R2aV9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYsIE5VTEwpOworCisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlrZnJlZShkZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCWludCByOworCisJbXV0ZXhfbG9jaygmZGRhdGEtPmxvY2spOworCisJciA9IHBhbmVsX2R2aV9wb3dlcl9vbihkc3NkZXYpOworCWlmIChyID09IDApCisJCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBhbmVsX2R2aV9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlwYW5lbF9kdmlfcG93ZXJfb2ZmKGRzc2Rldik7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRDsKKworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworfQorCitzdGF0aWMgaW50IHBhbmVsX2R2aV9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlwYW5lbF9kdmlfcG93ZXJfb2ZmKGRzc2Rldik7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQ7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbmVsX2R2aV9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwlpbnQgcjsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCXIgPSBwYW5lbF9kdmlfcG93ZXJfb24oZHNzZGV2KTsKKwlpZiAociA9PSAwKQorCQlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBwYW5lbF9kdmlfc2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKwlkcGlfc2V0X3RpbWluZ3MoZHNzZGV2LCB0aW1pbmdzKTsKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcGFuZWxfZHZpX2dldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisJKnRpbWluZ3MgPSBkc3NkZXYtPnBhbmVsLnRpbWluZ3M7CisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX2NoZWNrX3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwlpbnQgcjsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKwlyID0gZHBpX2NoZWNrX3RpbWluZ3MoZHNzZGV2LCB0aW1pbmdzKTsKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiByOworfQorCisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX2RkY19yZWFkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJdW5zaWduZWQgY2hhciAqYnVmLCB1MTYgY291bnQsIHU4IG9mZnNldCkKK3sKKwlpbnQgciwgcmV0cmllczsKKworCWZvciAocmV0cmllcyA9IDM7IHJldHJpZXMgPiAwOyByZXRyaWVzLS0pIHsKKwkJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQkJeworCQkJCS5hZGRyICAgPSBERENfQUREUiwKKwkJCQkuZmxhZ3MgID0gMCwKKwkJCQkubGVuICAgID0gMSwKKwkJCQkuYnVmICAgID0gJm9mZnNldCwKKwkJCX0sIHsKKwkJCQkuYWRkciAgID0gRERDX0FERFIsCisJCQkJLmZsYWdzICA9IEkyQ19NX1JELAorCQkJCS5sZW4gICAgPSBjb3VudCwKKwkJCQkuYnVmICAgID0gYnVmLAorCQkJfQorCQl9OworCisJCXIgPSBpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMik7CisJCWlmIChyID09IDIpCisJCQlyZXR1cm4gMDsKKworCQlpZiAociAhPSAtRUFHQUlOKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHIgPCAwID8gciA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX3JlYWRfZWRpZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCXU4ICplZGlkLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZ2V0X3BkYXRhKGRzc2Rldik7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCWludCByLCBsLCBieXRlc19yZWFkOworCisJbXV0ZXhfbG9jaygmZGRhdGEtPmxvY2spOworCisJaWYgKHBkYXRhLT5pMmNfYnVzX251bSA9PSAwKSB7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHBkYXRhLT5pMmNfYnVzX251bSk7CisJaWYgKCFhZGFwdGVyKSB7CisJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBJMkMgYWRhcHRlciwgYnVzICVkXG4iLAorCQkJCXBkYXRhLT5pMmNfYnVzX251bSk7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlsID0gbWluKEVESURfTEVOR1RILCBsZW4pOworCXIgPSBwYW5lbF9kdmlfZGRjX3JlYWQoYWRhcHRlciwgZWRpZCwgbCwgMCk7CisJaWYgKHIpCisJCWdvdG8gZXJyOworCisJYnl0ZXNfcmVhZCA9IGw7CisKKwkvKiBpZiB0aGVyZSBhcmUgZXh0ZW5zaW9ucywgcmVhZCBzZWNvbmQgYmxvY2sgKi8KKwlpZiAobGVuID4gRURJRF9MRU5HVEggJiYgZWRpZFsweDdlXSA+IDApIHsKKwkJbCA9IG1pbihFRElEX0xFTkdUSCwgbGVuIC0gRURJRF9MRU5HVEgpOworCisJCXIgPSBwYW5lbF9kdmlfZGRjX3JlYWQoYWRhcHRlciwgZWRpZCArIEVESURfTEVOR1RILAorCQkJCWwsIEVESURfTEVOR1RIKTsKKwkJaWYgKHIpCisJCQlnb3RvIGVycjsKKworCQlieXRlc19yZWFkICs9IGw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gYnl0ZXNfcmVhZDsKKworZXJyOgorCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgYm9vbCBwYW5lbF9kdmlfZGV0ZWN0KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJc3RydWN0IHBhbmVsX2R2aV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGdldF9wZGF0YShkc3NkZXYpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwl1bnNpZ25lZCBjaGFyIG91dDsKKwlpbnQgcjsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCWlmIChwZGF0YS0+aTJjX2J1c19udW0gPT0gMCkKKwkJZ290byBvdXQ7CisKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHBkYXRhLT5pMmNfYnVzX251bSk7CisJaWYgKCFhZGFwdGVyKQorCQlnb3RvIG91dDsKKworCXIgPSBwYW5lbF9kdmlfZGRjX3JlYWQoYWRhcHRlciwgJm91dCwgMSwgMCk7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiByID09IDA7CisKK291dDoKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgcGFuZWxfZHZpX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcGFuZWxfZHZpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19leGl0X3AocGFuZWxfZHZpX3JlbW92ZSksCisKKwkuZW5hYmxlCQk9IHBhbmVsX2R2aV9lbmFibGUsCisJLmRpc2FibGUJPSBwYW5lbF9kdmlfZGlzYWJsZSwKKwkuc3VzcGVuZAk9IHBhbmVsX2R2aV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcGFuZWxfZHZpX3Jlc3VtZSwKKworCS5zZXRfdGltaW5ncwk9IHBhbmVsX2R2aV9zZXRfdGltaW5ncywKKwkuZ2V0X3RpbWluZ3MJPSBwYW5lbF9kdmlfZ2V0X3RpbWluZ3MsCisJLmNoZWNrX3RpbWluZ3MJPSBwYW5lbF9kdmlfY2hlY2tfdGltaW5ncywKKworCS5yZWFkX2VkaWQJPSBwYW5lbF9kdmlfcmVhZF9lZGlkLAorCS5kZXRlY3QJCT0gcGFuZWxfZHZpX2RldGVjdCwKKworCS5kcml2ZXIgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJkdmkiLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBhbmVsX2R2aV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9tYXBfZHNzX3JlZ2lzdGVyX2RyaXZlcigmcGFuZWxfZHZpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYW5lbF9kdmlfZXhpdCh2b2lkKQoreworCW9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKCZwYW5lbF9kdmlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGFuZWxfZHZpX2luaXQpOworbW9kdWxlX2V4aXQocGFuZWxfZHZpX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1nZW5lcmljLWRwaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1nZW5lcmljLWRwaS5jCmluZGV4IDljOTBmNzUuLjUxOWM0N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtZ2VuZXJpYy1kcGkuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWdlbmVyaWMtZHBpLmMKQEAgLTU4LDMwICs1OCw2IEBACiAKIC8qIFBhbmVsIGNvbmZpZ3VyYXRpb25zICovCiBzdGF0aWMgc3RydWN0IHBhbmVsX2NvbmZpZyBnZW5lcmljX2RwaV9wYW5lbHNbXSA9IHsKLQkvKiBHZW5lcmljIFBhbmVsICovCi0JewotCQl7Ci0JCQkueF9yZXMJCT0gNjQwLAotCQkJLnlfcmVzCQk9IDQ4MCwKLQotCQkJLnBpeGVsX2Nsb2NrCT0gMjM1MDAsCi0KLQkJCS5oZnAJCT0gNDgsCi0JCQkuaHN3CQk9IDMyLAotCQkJLmhicAkJPSA4MCwKLQotCQkJLnZmcAkJPSAzLAotCQkJLnZzdwkJPSA0LAotCQkJLnZicAkJPSA3LAotCQl9LAotCQkuYWNiaQkJCT0gMHgwLAotCQkuYWNiCQkJPSAweDAsCi0JCS5jb25maWcJCQk9IE9NQVBfRFNTX0xDRF9URlQsCi0JCS5wb3dlcl9vbl9kZWxheQkJPSAwLAotCQkucG93ZXJfb2ZmX2RlbGF5CT0gMCwKLQkJLm5hbWUJCQk9ICJnZW5lcmljIiwKLQl9LAotCiAJLyogU2hhcnAgTFEwNDNUMURHMDEgKi8KIAl7CiAJCXsKQEAgLTIzMiw2ICsyMDgsOTUgQEAKIAkJLnBvd2VyX29mZl9kZWxheQk9IDAsCiAJCS5uYW1lCQkJPSAicG93ZXJ0aXBfcGg0ODAyNzJ0IiwKIAl9LAorCisJLyogSW5ub2x1eCBBVDA3MFROODMgKi8KKwl7CisJCXsKKwkJCS54X3JlcwkJPSA4MDAsCisJCQkueV9yZXMJCT0gNDgwLAorCisJCQkucGl4ZWxfY2xvY2sJPSA0MDAwMCwKKworCQkJLmhzdwkJPSA0OCwKKwkJCS5oZnAJCT0gMSwKKwkJCS5oYnAJCT0gMSwKKworCQkJLnZzdwkJPSAzLAorCQkJLnZmcAkJPSAxMiwKKwkJCS52YnAJCT0gMjUsCisJCX0sCisJCS5hY2JpCQkJPSAweDAsCisJCS5hY2IJCQk9IDB4MjgsCisJCS5jb25maWcJCQk9IE9NQVBfRFNTX0xDRF9URlQgfCBPTUFQX0RTU19MQ0RfSVZTIHwKKwkJCQkJICBPTUFQX0RTU19MQ0RfSUhTLAorCQkucG93ZXJfb25fZGVsYXkJCT0gMCwKKwkJLnBvd2VyX29mZl9kZWxheQk9IDAsCisJCS5uYW1lCQkJPSAiaW5ub2x1eF9hdDA3MHRuODMiLAorCX0sCisKKwkvKiBORUMgTkwyNDMyRFIyMi0xMUIgKi8KKwl7CisJCXsKKwkJCS54X3JlcwkJPSAyNDAsCisJCQkueV9yZXMJCT0gMzIwLAorCisJCQkucGl4ZWxfY2xvY2sJPSA1NDAwLAorCisJCQkuaHN3CQk9IDMsCisJCQkuaGZwCQk9IDMsCisJCQkuaGJwCQk9IDM5LAorCisJCQkudnN3CQk9IDEsCisJCQkudmZwCQk9IDIsCisJCQkudmJwCQk9IDcsCisJCX0sCisJCS5jb25maWcJCQk9IE9NQVBfRFNTX0xDRF9URlQgfCBPTUFQX0RTU19MQ0RfSVZTIHwKKwkJCQkJCU9NQVBfRFNTX0xDRF9JSFMsCisJCS5uYW1lCQkJPSAibmVjX25sMjQzMmRyMjItMTFiIiwKKwl9LAorCisJLyogVW5rbm93biBwYW5lbCB1c2VkIGluIE9NQVAgSDQgKi8KKwl7CisJCXsKKwkJCS54X3JlcwkJPSAyNDAsCisJCQkueV9yZXMJCT0gMzIwLAorCisJCQkucGl4ZWxfY2xvY2sJPSA2MjUwLAorCisJCQkuaHN3CQk9IDE1LAorCQkJLmhmcAkJPSAxNSwKKwkJCS5oYnAJCT0gNjAsCisKKwkJCS52c3cJCT0gMSwKKwkJCS52ZnAJCT0gMSwKKwkJCS52YnAJCT0gMSwKKwkJfSwKKwkJLmNvbmZpZwkJCT0gT01BUF9EU1NfTENEX1RGVCwKKworCQkubmFtZQkJCT0gImg0IiwKKwl9LAorCisJLyogVW5rbm93biBwYW5lbCB1c2VkIGluIFNhbXN1bmcgT01BUDIgQXBvbGxvbiAqLworCXsKKwkJeworCQkJLnhfcmVzCQk9IDQ4MCwKKwkJCS55X3JlcwkJPSAyNzIsCisKKwkJCS5waXhlbF9jbG9jawk9IDYyNTAsCisKKwkJCS5oc3cJCT0gNDEsCisJCQkuaGZwCQk9IDIsCisJCQkuaGJwCQk9IDIsCisKKwkJCS52c3cJCT0gMTAsCisJCQkudmZwCQk9IDIsCisJCQkudmJwCQk9IDIsCisJCX0sCisJCS5jb25maWcJCQk9IE9NQVBfRFNTX0xDRF9URlQgfCBPTUFQX0RTU19MQ0RfSVZTIHwKKwkJCQkJCU9NQVBfRFNTX0xDRF9JSFMsCisKKwkJLm5hbWUJCQk9ICJhcG9sbG9uIiwKKwl9LAogfTsKIAogc3RydWN0IHBhbmVsX2Rydl9kYXRhIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtbjh4MC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1uOHgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwZThiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtbjh4MC5jCkBAIC0wLDAgKzEsNzQ3IEBACisvKiAjZGVmaW5lIERFQlVHICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1uOHgwLmg+CisKKyNkZWZpbmUgQkxJWlpBUkRfUkVWX0NPREUgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBCTElaWkFSRF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEJMSVpaQVJEX1BMTF9ESVYgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0xPQ0tfUkFOR0UgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBCTElaWkFSRF9QTExfQ0xPQ0tfU1lOVEhfMCAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8xICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgQkxJWlpBUkRfUExMX01PREUgICAgICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBCTElaWkFSRF9DTEtfU1JDICAgICAgICAgICAgICAgICAgICAgICAweDBlCisjZGVmaW5lIEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURSAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQkxJWlpBUkRfTUVNX0JBTkswX1NUQVRVUyAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBCTElaWkFSRF9QQU5FTF9DT05GSUdVUkFUSU9OICAgICAgICAgICAweDI4CisjZGVmaW5lIEJMSVpaQVJEX0hESVNQICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmEKKyNkZWZpbmUgQkxJWlpBUkRfSE5EUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyYworI2RlZmluZSBCTElaWkFSRF9WRElTUDAgICAgICAgICAgICAgICAgICAgICAgICAweDJlCisjZGVmaW5lIEJMSVpaQVJEX1ZESVNQMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgQkxJWlpBUkRfVk5EUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBCTElaWkFSRF9IU1cgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM0CisjZGVmaW5lIEJMSVpaQVJEX1ZTVyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgKKyNkZWZpbmUgQkxJWlpBUkRfRElTUExBWV9NT0RFICAgICAgICAgICAgICAgICAgMHg2OAorI2RlZmluZSBCTElaWkFSRF9JTlBVVF9XSU5fWF9TVEFSVF8wICAgICAgICAgICAweDZjCisjZGVmaW5lIEJMSVpaQVJEX0RBVEFfU09VUkNFX1NFTEVDVCAgICAgICAgICAgIDB4OGUKKyNkZWZpbmUgQkxJWlpBUkRfRElTUF9NRU1fREFUQV9QT1JUICAgICAgICAgICAgMHg5MAorI2RlZmluZSBCTElaWkFSRF9ESVNQX01FTV9SRUFEX0FERFIwICAgICAgICAgICAweDkyCisjZGVmaW5lIEJMSVpaQVJEX1BPV0VSX1NBVkUgICAgICAgICAgICAgICAgICAgIDB4RTYKKyNkZWZpbmUgQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMgICAgICAgICAgICAgMHhFOAorCisvKiBEYXRhIHNvdXJjZSBzZWxlY3QgKi8KKy8qIEZvciBTMUQxMzc0NSAqLworI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0JBQ0tHUk9VTkQJMHgwMAorI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0RFU1RSVUNUSVZFCTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX1dSSVRFX09WRVJMQVlfRU5BQkxFCTB4MDQKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX0RJU0FCTEVfT1ZFUkxBWQkJMHgwNQorLyogRm9yIFMxRDEzNzQ0ICovCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9MQ0QJCQkweDAwCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19CTFRfTENECQkJMHgwNgorCisjZGVmaW5lIEJMSVpaQVJEX0NPTE9SX1JHQjU2NQkJCTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfQ09MT1JfWVVWNDIwCQkJMHgwOQorCisjZGVmaW5lIEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDUJCTB4MDEJLyogSGFpbHN0b3JtICovCisjZGVmaW5lIEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDQJCTB4MDIJLyogQmxpenphcmQgKi8KKworI2RlZmluZSBNSVBJRF9DTURfUkVBRF9ESVNQX0lECQkweDA0CisjZGVmaW5lIE1JUElEX0NNRF9SRUFEX1JFRAkJMHgwNgorI2RlZmluZSBNSVBJRF9DTURfUkVBRF9HUkVFTgkJMHgwNworI2RlZmluZSBNSVBJRF9DTURfUkVBRF9CTFVFCQkweDA4CisjZGVmaW5lIE1JUElEX0NNRF9SRUFEX0RJU1BfU1RBVFVTCTB4MDkKKyNkZWZpbmUgTUlQSURfQ01EX1JERFNEUgkJMHgwRgorI2RlZmluZSBNSVBJRF9DTURfU0xFRVBfSU4JCTB4MTAKKyNkZWZpbmUgTUlQSURfQ01EX1NMRUVQX09VVAkJMHgxMQorI2RlZmluZSBNSVBJRF9DTURfRElTUF9PRkYJCTB4MjgKKyNkZWZpbmUgTUlQSURfQ01EX0RJU1BfT04JCTB4MjkKKworc3RhdGljIHN0cnVjdCBwYW5lbF9kcnZfZGF0YSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaWRldjsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxkZXY7CisKKwlpbnQgYmxpenphcmRfdmVyOworfSBzX2Rydl9kYXRhOworCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBwYW5lbF9uOHgwX2RhdGEgKmdldF9ib2FyZF9kYXRhKGNvbnN0IHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlyZXR1cm4gZHNzZGV2LT5kYXRhOworfQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmdldF9kcnZfZGF0YShjb25zdCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuICZzX2Rydl9kYXRhOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibGl6emFyZF9jbWQodTggY21kKQoreworCW9tYXBfcmZiaV93cml0ZV9jb21tYW5kKCZjbWQsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmxpenphcmRfd3JpdGUodTggY21kLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQoreworCW9tYXBfcmZiaV93cml0ZV9jb21tYW5kKCZjbWQsIDEpOworCW9tYXBfcmZiaV93cml0ZV9kYXRhKGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJsaXp6YXJkX3JlYWQodTggY21kLCB1OCAqYnVmLCBpbnQgbGVuKQoreworCW9tYXBfcmZiaV93cml0ZV9jb21tYW5kKCZjbWQsIDEpOworCW9tYXBfcmZiaV9yZWFkX2RhdGEoYnVmLCBsZW4pOworfQorCitzdGF0aWMgdTggYmxpenphcmRfcmVhZF9yZWcodTggY21kKQoreworCXU4IGRhdGE7CisJYmxpenphcmRfcmVhZChjbWQsICZkYXRhLCAxKTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfY3RybF9zZXR1cF91cGRhdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZ2V0X2Rydl9kYXRhKGRzc2Rldik7CisJdTggdG1wWzE4XTsKKwlpbnQgeF9lbmQsIHlfZW5kOworCisJeF9lbmQgPSB4ICsgdyAtIDE7CisJeV9lbmQgPSB5ICsgaCAtIDE7CisKKwl0bXBbMF0gPSB4OworCXRtcFsxXSA9IHggPj4gODsKKwl0bXBbMl0gPSB5OworCXRtcFszXSA9IHkgPj4gODsKKwl0bXBbNF0gPSB4X2VuZDsKKwl0bXBbNV0gPSB4X2VuZCA+PiA4OworCXRtcFs2XSA9IHlfZW5kOworCXRtcFs3XSA9IHlfZW5kID4+IDg7CisKKwkvKiBzY2FsaW5nPyAqLworCXRtcFs4XSA9IHg7CisJdG1wWzldID0geCA+PiA4OworCXRtcFsxMF0gPSB5OworCXRtcFsxMV0gPSB5ID4+IDg7CisJdG1wWzEyXSA9IHhfZW5kOworCXRtcFsxM10gPSB4X2VuZCA+PiA4OworCXRtcFsxNF0gPSB5X2VuZDsKKwl0bXBbMTVdID0geV9lbmQgPj4gODsKKworCXRtcFsxNl0gPSBCTElaWkFSRF9DT0xPUl9SR0I1NjU7CisKKwlpZiAoZGRhdGEtPmJsaXp6YXJkX3ZlciA9PSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ1KQorCQl0bXBbMTddID0gQkxJWlpBUkRfU1JDX1dSSVRFX0xDRF9CQUNLR1JPVU5EOworCWVsc2UKKwkJdG1wWzE3XSA9IGRkYXRhLT5ibGl6emFyZF92ZXIgPT0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NCA/CisJCQlCTElaWkFSRF9TUkNfV1JJVEVfTENEIDoKKwkJCUJMSVpaQVJEX1NSQ19XUklURV9MQ0RfREVTVFJVQ1RJVkU7CisKKwlvbWFwX3JmYmlfY29uZmlndXJlKGRzc2RldiwgMTYsIDgpOworCisJYmxpenphcmRfd3JpdGUoQkxJWlpBUkRfSU5QVVRfV0lOX1hfU1RBUlRfMCwgdG1wLCAxOCk7CisKKwlvbWFwX3JmYmlfY29uZmlndXJlKGRzc2RldiwgMTYsIDE2KTsKK30KKworc3RhdGljIHZvaWQgbWlwaWRfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGNtZCwgY29uc3QgdTggKndidWYsCisJCWludCB3bGVuLCB1OCAqcmJ1ZiwgaW50IHJsZW4pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlCW07CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqeCwgeGZlcls0XTsKKwl1MTYJCQl3OworCWludAkJCXI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKworCW1lbXNldCh4ZmVyLCAwLCBzaXplb2YoeGZlcikpOworCXggPSAmeGZlclswXTsKKworCWNtZCAmPSAgMHhmZjsKKwl4LT50eF9idWYJCT0gJmNtZDsKKwl4LT5iaXRzX3Blcl93b3JkCT0gOTsKKwl4LT5sZW4JCQk9IDI7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgJm0pOworCisJaWYgKHdsZW4pIHsKKwkJeCsrOworCQl4LT50eF9idWYJCT0gd2J1ZjsKKwkJeC0+bGVuCQkJPSB3bGVuOworCQl4LT5iaXRzX3Blcl93b3JkCT0gOTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgJm0pOworCX0KKworCWlmIChybGVuKSB7CisJCXgrKzsKKwkJeC0+cnhfYnVmCT0gJnc7CisJCXgtPmxlbgkJPSAxOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCAmbSk7CisKKwkJaWYgKHJsZW4gPiAxKSB7CisJCQkvKiBBcnJhbmdlIGZvciB0aGUgZXh0cmEgY2xvY2sgYmVmb3JlIHRoZSBmaXJzdAorCQkJICogZGF0YSBiaXQuCisJCQkgKi8KKwkJCXgtPmJpdHNfcGVyX3dvcmQgPSA5OworCQkJeC0+bGVuCQkgPSAyOworCisJCQl4Kys7CisJCQl4LT5yeF9idWYJID0gJnJidWZbMV07CisJCQl4LT5sZW4JCSA9IHJsZW4gLSAxOworCQkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgJm0pOworCQl9CisJfQorCisJciA9IHNwaV9zeW5jKHNwaSwgJm0pOworCWlmIChyIDwgMCkKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzcGlfc3luYyAlZFxuIiwgcik7CisKKwlpZiAocmxlbikKKwkJcmJ1ZlswXSA9IHcgJiAweGZmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWlwaWRfY21kKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBjbWQpCit7CisJbWlwaWRfdHJhbnNmZXIoc3BpLCBjbWQsIE5VTEwsIDAsIE5VTEwsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWlwaWRfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJaW50IHJlZywgY29uc3QgdTggKmJ1ZiwgaW50IGxlbikKK3sKKwltaXBpZF90cmFuc2ZlcihzcGksIHJlZywgYnVmLCBsZW4sIE5VTEwsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWlwaWRfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlpbnQgcmVnLCB1OCAqYnVmLCBpbnQgbGVuKQoreworCW1pcGlkX3RyYW5zZmVyKHNwaSwgcmVnLCBOVUxMLCAwLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kYXRhX2xpbmVzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBkYXRhX2xpbmVzKQoreworCXUxNiBwYXI7CisKKwlzd2l0Y2ggKGRhdGFfbGluZXMpIHsKKwljYXNlIDE2OgorCQlwYXIgPSAweDE1MDsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJcGFyID0gMHgxNjA7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXBhciA9IDB4MTcwOworCQlicmVhazsKKwl9CisKKwltaXBpZF93cml0ZShzcGksIDB4M2EsICh1OCAqKSZwYXIsIDIpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2luaXRfc3RyaW5nKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdTE2IGluaXRwYXJbXSA9IHsgMHgwMTAyLCAweDAxMDAsIDB4MDEwMCB9OworCW1pcGlkX3dyaXRlKHNwaSwgMHhjMiwgKHU4ICopaW5pdHBhciwgc2l6ZW9mKGluaXRwYXIpKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9kaXNwbGF5X29uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJbWlwaWRfY21kKHNwaSwgTUlQSURfQ01EX0RJU1BfT04pOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2Rpc3BsYXlfb2ZmKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJbWlwaWRfY21kKHNwaSwgTUlQSURfQ01EX0RJU1BfT0ZGKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9zbGVlcF9vdXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwltaXBpZF9jbWQoc3BpLCBNSVBJRF9DTURfU0xFRVBfT1VUKTsKKwltc2xlZXAoMTIwKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9zbGVlcF9pbihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCW1pcGlkX2NtZChzcGksIE1JUElEX0NNRF9TTEVFUF9JTik7CisJbXNsZWVwKDUwKTsKK30KKworc3RhdGljIGludCBuOHgwX3BhbmVsX3Bvd2VyX29uKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgcGFuZWxfbjh4MF9kYXRhICpiZGF0YSA9IGdldF9ib2FyZF9kYXRhKGRzc2Rldik7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGdldF9kcnZfZGF0YShkc3NkZXYpOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBkZGF0YS0+c3BpZGV2OworCXU4IHJldiwgY29uZjsKKwl1OCBkaXNwbGF5X2lkWzNdOworCWNvbnN0IGNoYXIgKnBhbmVsX25hbWU7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJcmV0dXJuIDA7CisKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoYmRhdGEtPmN0cmxfcHdyZG93biwgMSk7CisKKwlpZiAoYmRhdGEtPnBsYXRmb3JtX2VuYWJsZSkgeworCQlyID0gYmRhdGEtPnBsYXRmb3JtX2VuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCWdvdG8gZXJyX3BsYXRfZW47CisJfQorCisJciA9IG9tYXBkc3NfcmZiaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOworCWlmIChyKQorCQlnb3RvIGVycl9yZmJpX2VuOworCisJcmV2ID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUkVWX0NPREUpOworCWNvbmYgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9DT05GSUcpOworCisJc3dpdGNoIChyZXYgJiAweGZjKSB7CisJY2FzZSAweDljOgorCQlkZGF0YS0+YmxpenphcmRfdmVyID0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NDsKKwkJZGV2X2luZm8oJmRzc2Rldi0+ZGV2LCAiczFkMTM3NDQgTENEIGNvbnRyb2xsZXIgcmV2ICVkICIKKwkJCSJpbml0aWFsaXplZCAoQ05GIHBpbnMgJXgpXG4iLCByZXYgJiAweDAzLCBjb25mICYgMHgwNyk7CisJCWJyZWFrOworCWNhc2UgMHhhNDoKKwkJZGRhdGEtPmJsaXp6YXJkX3ZlciA9IEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDU7CisJCWRldl9pbmZvKCZkc3NkZXYtPmRldiwgInMxZDEzNzQ1IExDRCBjb250cm9sbGVyIHJldiAlZCAiCisJCQkiaW5pdGlhbGl6ZWQgKENORiBwaW5zICV4KVxuIiwgcmV2ICYgMHgwMywgY29uZiAmIDB4MDcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImludmFsaWQgczFkMTM3NHggcmV2aXNpb24gJTAyeFxuIiwgcmV2KTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2ludl9jaGlwOworCX0KKworCS8qIHBhbmVsICovCisKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoYmRhdGEtPnBhbmVsX3Jlc2V0LCAxKTsKKworCW1pcGlkX3JlYWQoc3BpLCBNSVBJRF9DTURfUkVBRF9ESVNQX0lELCBkaXNwbGF5X2lkLCAzKTsKKwlkZXZfZGJnKCZzcGktPmRldiwgIk1JUEkgZGlzcGxheSBJRDogJTAyeCUwMnglMDJ4XG4iLAorCQkJZGlzcGxheV9pZFswXSwgZGlzcGxheV9pZFsxXSwgZGlzcGxheV9pZFsyXSk7CisKKwlzd2l0Y2ggKGRpc3BsYXlfaWRbMF0pIHsKKwljYXNlIDB4NDU6CisJCXBhbmVsX25hbWUgPSAibHBoODkyMyI7CisJCWJyZWFrOworCWNhc2UgMHg4MzoKKwkJcGFuZWxfbmFtZSA9ICJsczA0MXkzIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmZHNzZGV2LT5kZXYsICJpbnZhbGlkIGRpc3BsYXkgSUQgMHgleFxuIiwKKwkJCQlkaXNwbGF5X2lkWzBdKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2ludl9wYW5lbDsKKwl9CisKKwlkZXZfaW5mbygmZHNzZGV2LT5kZXYsICIlcyByZXYgJTAyeCBMQ0QgZGV0ZWN0ZWRcbiIsCisJCQlwYW5lbF9uYW1lLCBkaXNwbGF5X2lkWzFdKTsKKworCXNlbmRfc2xlZXBfb3V0KHNwaSk7CisJc2VuZF9pbml0X3N0cmluZyhzcGkpOworCXNldF9kYXRhX2xpbmVzKHNwaSwgMjQpOworCXNlbmRfZGlzcGxheV9vbihzcGkpOworCisJcmV0dXJuIDA7CisKK2Vycl9pbnZfcGFuZWw6CisJLyoKKwkgKiBIQUNLOiB3ZSBzaG91bGQgdHVybiBvZmYgdGhlIHBhbmVsIGhlcmUsIGJ1dCB0aGVyZSBpcyBzb21lIHByb2JsZW0KKwkgKiB3aXRoIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSwgYW5kIHdlIGZhaWwgdG8gaW5pdCB0aGUgcGFuZWwgaWYgd2UKKwkgKiBoYXZlIHR1cm5lZCBpdCBvZmYKKwkgKi8KKwkvKiBncGlvX2RpcmVjdGlvbl9vdXRwdXQoYmRhdGEtPnBhbmVsX3Jlc2V0LCAwKTsgKi8KK2Vycl9pbnZfY2hpcDoKKwlvbWFwZHNzX3JmYmlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnJfcmZiaV9lbjoKKwlpZiAoYmRhdGEtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWJkYXRhLT5wbGF0Zm9ybV9kaXNhYmxlKGRzc2Rldik7CitlcnJfcGxhdF9lbjoKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoYmRhdGEtPmN0cmxfcHdyZG93biwgMCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG44eDBfcGFuZWxfcG93ZXJfb2ZmKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfbjh4MF9kYXRhICpiZGF0YSA9IGdldF9ib2FyZF9kYXRhKGRzc2Rldik7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGdldF9kcnZfZGF0YShkc3NkZXYpOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBkZGF0YS0+c3BpZGV2OworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCisJCXJldHVybjsKKworCXNlbmRfZGlzcGxheV9vZmYoc3BpKTsKKwlzZW5kX3NsZWVwX2luKHNwaSk7CisKKwlpZiAoYmRhdGEtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWJkYXRhLT5wbGF0Zm9ybV9kaXNhYmxlKGRzc2Rldik7CisKKwkvKgorCSAqIEhBQ0s6IHdlIHNob3VsZCB0dXJuIG9mZiB0aGUgcGFuZWwgaGVyZSwgYnV0IHRoZXJlIGlzIHNvbWUgcHJvYmxlbQorCSAqIHdpdGggdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLCBhbmQgd2UgZmFpbCB0byBpbml0IHRoZSBwYW5lbCBpZiB3ZQorCSAqIGhhdmUgdHVybmVkIGl0IG9mZgorCSAqLworCS8qIGdwaW9fZGlyZWN0aW9uX291dHB1dChiZGF0YS0+cGFuZWxfcmVzZXQsIDApOyAqLworCWdwaW9fZGlyZWN0aW9uX291dHB1dChiZGF0YS0+Y3RybF9wd3Jkb3duLCAwKTsKKwlvbWFwZHNzX3JmYmlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmZiaV90aW1pbmdzIG44eDBfcGFuZWxfdGltaW5ncyA9IHsKKwkuY3Nfb25fdGltZSAgICAgPSAwLAorCisJLndlX29uX3RpbWUgICAgID0gOTAwMCwKKwkud2Vfb2ZmX3RpbWUgICAgPSAxODAwMCwKKwkud2VfY3ljbGVfdGltZSAgPSAzNjAwMCwKKworCS5yZV9vbl90aW1lICAgICA9IDkwMDAsCisJLnJlX29mZl90aW1lICAgID0gMjcwMDAsCisJLnJlX2N5Y2xlX3RpbWUgID0gMzYwMDAsCisKKwkuYWNjZXNzX3RpbWUgICAgPSAyNzAwMCwKKwkuY3Nfb2ZmX3RpbWUgICAgPSAzNjAwMCwKKworCS5jc19wdWxzZV93aWR0aCA9IDAsCit9OworCitzdGF0aWMgaW50IG44eDBfYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCXN0cnVjdCBwYW5lbF9uOHgwX2RhdGEgKmJkYXRhID0gZ2V0X2JvYXJkX2RhdGEoZHNzZGV2KTsKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZ2V0X2Rydl9kYXRhKGRzc2Rldik7CisJaW50IHI7CisJaW50IGxldmVsOworCisJbXV0ZXhfbG9jaygmZGRhdGEtPmxvY2spOworCisJaWYgKGRldi0+cHJvcHMuZmJfYmxhbmsgPT0gRkJfQkxBTktfVU5CTEFOSyAmJgorCQkJZGV2LT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKQorCQlsZXZlbCA9IGRldi0+cHJvcHMuYnJpZ2h0bmVzczsKKwllbHNlCisJCWxldmVsID0gMDsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAidXBkYXRlIGJyaWdodG5lc3MgdG8gJWRcbiIsIGxldmVsKTsKKworCWlmICghYmRhdGEtPnNldF9iYWNrbGlnaHQpCisJCXIgPSAtRUlOVkFMOworCWVsc2UKKwkJciA9IGJkYXRhLT5zZXRfYmFja2xpZ2h0KGRzc2RldiwgbGV2ZWwpOworCisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBuOHgwX2JsX2dldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5wcm9wcy5mYl9ibGFuayA9PSBGQl9CTEFOS19VTkJMQU5LICYmCisJCQlkZXYtPnByb3BzLnBvd2VyID09IEZCX0JMQU5LX1VOQkxBTkspCisJCXJldHVybiBkZXYtPnByb3BzLmJyaWdodG5lc3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIG44eDBfYmxfb3BzID0geworCS5nZXRfYnJpZ2h0bmVzcyA9IG44eDBfYmxfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyAgPSBuOHgwX2JsX3VwZGF0ZV9zdGF0dXMsCit9OworCitzdGF0aWMgaW50IG44eDBfcGFuZWxfcHJvYmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9uOHgwX2RhdGEgKmJkYXRhID0gZ2V0X2JvYXJkX2RhdGEoZHNzZGV2KTsKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibGRldjsKKwlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CisJaW50IHI7CisKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgInByb2JlXG4iKTsKKworCWlmICghYmRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJc19kcnZfZGF0YS5kc3NkZXYgPSBkc3NkZXY7CisKKwlkZGF0YSA9ICZzX2Rydl9kYXRhOworCisJbXV0ZXhfaW5pdCgmZGRhdGEtPmxvY2spOworCisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUOworCWRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcyA9IDgwMDsKKwlkc3NkZXYtPnBhbmVsLnRpbWluZ3MueV9yZXMgPSA0ODA7CisJZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUgPSAxNjsKKwlkc3NkZXYtPmN0cmwucmZiaV90aW1pbmdzID0gbjh4MF9wYW5lbF90aW1pbmdzOworCisJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHByb3BzKSk7CisJcHJvcHMubWF4X2JyaWdodG5lc3MgPSAxMjc7CisJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9QTEFURk9STTsKKwlibGRldiA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoZGV2X25hbWUoJmRzc2Rldi0+ZGV2KSwgJmRzc2Rldi0+ZGV2LAorCQkJZHNzZGV2LCAmbjh4MF9ibF9vcHMsICZwcm9wcyk7CisJaWYgKElTX0VSUihibGRldikpIHsKKwkJciA9IFBUUl9FUlIoYmxkZXYpOworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgInJlZ2lzdGVyIGJhY2tsaWdodCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlkZGF0YS0+YmxkZXYgPSBibGRldjsKKworCWJsZGV2LT5wcm9wcy5mYl9ibGFuayA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmxkZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwlibGRldi0+cHJvcHMuYnJpZ2h0bmVzcyA9IDEyNzsKKworCW44eDBfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbjh4MF9wYW5lbF9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxkZXY7CisKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgInJlbW92ZVxuIik7CisKKwlibGRldiA9IGRkYXRhLT5ibGRldjsKKwlibGRldi0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJbjh4MF9ibF91cGRhdGVfc3RhdHVzKGJsZGV2KTsKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmxkZXYpOworCisJZGV2X3NldF9kcnZkYXRhKCZkc3NkZXYtPmRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgbjh4MF9wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKwlpbnQgcjsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAiZW5hYmxlXG4iKTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCXJmYmlfYnVzX2xvY2soKTsKKworCXIgPSBuOHgwX3BhbmVsX3Bvd2VyX29uKGRzc2Rldik7CisKKwlyZmJpX2J1c191bmxvY2soKTsKKworCWlmIChyKSB7CisJCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCQlyZXR1cm4gcjsKKwl9CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuOHgwX3BhbmVsX2Rpc2FibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAiZGlzYWJsZVxuIik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlyZmJpX2J1c19sb2NrKCk7CisKKwluOHgwX3BhbmVsX3Bvd2VyX29mZihkc3NkZXYpOworCisJcmZiaV9idXNfdW5sb2NrKCk7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRDsKKworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworfQorCitzdGF0aWMgaW50IG44eDBfcGFuZWxfc3VzcGVuZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGdldF9kcnZfZGF0YShkc3NkZXYpOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJzdXNwZW5kXG4iKTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCXJmYmlfYnVzX2xvY2soKTsKKworCW44eDBfcGFuZWxfcG93ZXJfb2ZmKGRzc2Rldik7CisKKwlyZmJpX2J1c191bmxvY2soKTsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX1NVU1BFTkRFRDsKKworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbjh4MF9wYW5lbF9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKwlpbnQgcjsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAicmVzdW1lXG4iKTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCXJmYmlfYnVzX2xvY2soKTsKKworCXIgPSBuOHgwX3BhbmVsX3Bvd2VyX29uKGRzc2Rldik7CisKKwlyZmJpX2J1c191bmxvY2soKTsKKworCWlmIChyKSB7CisJCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCQlyZXR1cm4gcjsKKwl9CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuOHgwX3BhbmVsX2dldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwkqdGltaW5ncyA9IGRzc2Rldi0+cGFuZWwudGltaW5nczsKK30KKworc3RhdGljIHZvaWQgbjh4MF9wYW5lbF9nZXRfcmVzb2x1dGlvbihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCXUxNiAqeHJlcywgdTE2ICp5cmVzKQoreworCSp4cmVzID0gZHNzZGV2LT5wYW5lbC50aW1pbmdzLnhfcmVzOworCSp5cmVzID0gZHNzZGV2LT5wYW5lbC50aW1pbmdzLnlfcmVzOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZG9uZSh2b2lkICpkYXRhKQoreworCXJmYmlfYnVzX3VubG9jaygpOworfQorCitzdGF0aWMgaW50IG44eDBfcGFuZWxfdXBkYXRlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpCit7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGdldF9kcnZfZGF0YShkc3NkZXYpOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJ1cGRhdGVcbiIpOworCisJbXV0ZXhfbG9jaygmZGRhdGEtPmxvY2spOworCXJmYmlfYnVzX2xvY2soKTsKKworCW9tYXBfcmZiaV9wcmVwYXJlX3VwZGF0ZShkc3NkZXYsICZ4LCAmeSwgJncsICZoKTsKKworCWJsaXp6YXJkX2N0cmxfc2V0dXBfdXBkYXRlKGRzc2RldiwgeCwgeSwgdywgaCk7CisKKwlvbWFwX3JmYmlfdXBkYXRlKGRzc2RldiwgeCwgeSwgdywgaCwgdXBkYXRlX2RvbmUsIE5VTEwpOworCisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuOHgwX3BhbmVsX3N5bmMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAic3luY1xuIik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisJcmZiaV9idXNfbG9jaygpOworCXJmYmlfYnVzX3VubG9jaygpOworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyIG44eDBfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBuOHgwX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gbjh4MF9wYW5lbF9yZW1vdmUsCisKKwkuZW5hYmxlCQk9IG44eDBfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gbjh4MF9wYW5lbF9kaXNhYmxlLAorCS5zdXNwZW5kCT0gbjh4MF9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gbjh4MF9wYW5lbF9yZXN1bWUsCisKKwkudXBkYXRlCQk9IG44eDBfcGFuZWxfdXBkYXRlLAorCS5zeW5jCQk9IG44eDBfcGFuZWxfc3luYywKKworCS5nZXRfcmVzb2x1dGlvbgk9IG44eDBfcGFuZWxfZ2V0X3Jlc29sdXRpb24sCisJLmdldF9yZWNvbW1lbmRlZF9icHAgPSBvbWFwZHNzX2RlZmF1bHRfZ2V0X3JlY29tbWVuZGVkX2JwcCwKKworCS5nZXRfdGltaW5ncwk9IG44eDBfcGFuZWxfZ2V0X3RpbWluZ3MsCisKKwkuZHJpdmVyICAgICAgICAgPSB7CisJCS5uYW1lICAgPSAibjh4MF9wYW5lbCIsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworLyogUEFORUwgKi8KKworc3RhdGljIGludCBtaXBpZF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlkZXZfZGJnKCZzcGktPmRldiwgIm1pcGlkX3NwaV9wcm9iZVxuIik7CisKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8wOworCisJc19kcnZfZGF0YS5zcGlkZXYgPSBzcGk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaXBpZF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJZGV2X2RiZygmc3BpLT5kZXYsICJtaXBpZF9zcGlfcmVtb3ZlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1pcGlkX3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAibGNkX21pcGlkIiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCT0gbWlwaWRfc3BpX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChtaXBpZF9zcGlfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG44eDBfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXIgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZtaXBpZF9zcGlfZHJpdmVyKTsKKwlpZiAocikgeworCQlwcl9lcnIoIm44eDBfcGFuZWw6IHNwaSBkcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiByOworCX0KKworCXIgPSBvbWFwX2Rzc19yZWdpc3Rlcl9kcml2ZXIoJm44eDBfcGFuZWxfZHJpdmVyKTsKKwlpZiAocikgeworCQlwcl9lcnIoIm44eDBfcGFuZWw6IGRzcyBkcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbWlwaWRfc3BpX2RyaXZlcik7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbjh4MF9wYW5lbF9kcnZfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbWlwaWRfc3BpX2RyaXZlcik7CisKKwlvbWFwX2Rzc191bnJlZ2lzdGVyX2RyaXZlcigmbjh4MF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChuOHgwX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KG44eDBfcGFuZWxfZHJ2X2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1waWNvZGxwLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXBpY29kbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGViZGFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1waWNvZGxwLmMKQEAgLTAsMCArMSw1OTQgQEAKKy8qCisgKiBwaWNvZGxwIHBhbmVsIGRyaXZlcgorICogcGljb2RscF9pMmNfZHJpdmVyOiBpMmNfY2xpZW50IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIFRleGFzIEluc3RydW1lbnRzCisgKiBBdXRob3I6IE15dGhyaSBQIEsgPG15dGhyaXBrQHRpLmNvbT4KKyAqIE1heXVyZXNoIEphbm9ya2FyIDxtYXl1ckB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtcGljb2RscC5oPgorCisjaW5jbHVkZSAicGFuZWwtcGljb2RscC5oIgorCitzdHJ1Y3QgcGljb2RscF9kYXRhIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqcGljb2RscF9pMmNfY2xpZW50OworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBwaWNvZGxwX2kyY19ib2FyZF9pbmZvID0geworCUkyQ19CT0FSRF9JTkZPKCJwaWNvZGxwX2kyY19kcml2ZXIiLCAweDFiKSwKK307CisKK3N0cnVjdCBwaWNvZGxwX2kyY19kYXRhIHsKKwlzdHJ1Y3QgbXV0ZXggeGZlcl9sb2NrOworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBpY29kbHBfaTJjX2lkW10gPSB7CisJeyAicGljb2RscF9pMmNfZHJpdmVyIiwgMCB9LAorfTsKKworc3RydWN0IHBpY29kbHBfaTJjX2NvbW1hbmQgeworCXU4IHJlZzsKKwl1MzIgdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyBwaWNvX2xzX3RpbWluZ3MgPSB7CisJLnhfcmVzCQk9IDg2NCwKKwkueV9yZXMJCT0gNDgwLAorCS5oc3cJCT0gNywKKwkuaGZwCQk9IDExLAorCS5oYnAJCT0gNywKKworCS5waXhlbF9jbG9jawk9IDE5MjAwLAorCisJLnZzdwkJPSAyLAorCS52ZnAJCT0gMywKKwkudmJwCQk9IDE0LAorfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGljb2RscF9wYW5lbF9kYXRhCisJCSpnZXRfcGFuZWxfZGF0YShjb25zdCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuIChzdHJ1Y3QgcGljb2RscF9wYW5lbF9kYXRhICopIGRzc2Rldi0+ZGF0YTsKK30KKworc3RhdGljIHUzMiBwaWNvZGxwX2kyY19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwl1OCByZWFkX2NtZFtdID0ge1JFQURfUkVHX1NFTEVDVCwgcmVnfSwgZGF0YVs0XTsKKwlzdHJ1Y3QgcGljb2RscF9pMmNfZGF0YSAqcGljb2RscF9pMmNfZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKKworCW11dGV4X2xvY2soJnBpY29kbHBfaTJjX2RhdGEtPnhmZXJfbG9jayk7CisKKwltc2dbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwltc2dbMF0uZmxhZ3MgPSAwOworCW1zZ1swXS5sZW4gPSAyOworCW1zZ1swXS5idWYgPSByZWFkX2NtZDsKKworCW1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOworCW1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCW1zZ1sxXS5sZW4gPSA0OworCW1zZ1sxXS5idWYgPSBkYXRhOworCisJaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNnLCAyKTsKKwltdXRleF91bmxvY2soJnBpY29kbHBfaTJjX2RhdGEtPnhmZXJfbG9jayk7CisJcmV0dXJuIChkYXRhWzNdIHwgKGRhdGFbMl0gPDwgOCkgfCAoZGF0YVsxXSA8PCAxNikgfCAoZGF0YVswXSA8PCAyNCkpOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfaTJjX3dyaXRlX2Jsb2NrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJCXU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZzsKKwlpbnQgaSwgciwgbXNnX2NvdW50ID0gMTsKKworCXN0cnVjdCBwaWNvZGxwX2kyY19kYXRhICpwaWNvZGxwX2kyY19kYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAobGVuIDwgMSB8fCBsZW4gPiAzMikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJ0b28gbG9uZyBzeW5fd3JpdGVfYmxvY2sgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXV0ZXhfbG9jaygmcGljb2RscF9pMmNfZGF0YS0+eGZlcl9sb2NrKTsKKworCW1zZy5hZGRyID0gY2xpZW50LT5hZGRyOworCW1zZy5mbGFncyA9IDA7CisJbXNnLmxlbiA9IGxlbjsKKwltc2cuYnVmID0gZGF0YTsKKwlyID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgJm1zZywgbXNnX2NvdW50KTsKKwltdXRleF91bmxvY2soJnBpY29kbHBfaTJjX2RhdGEtPnhmZXJfbG9jayk7CisKKwkvKgorCSAqIGkyY190cmFuc2ZlciByZXR1cm5zOgorCSAqIG51bWJlciBvZiBtZXNzYWdlcyBzZW50IGluIGNhc2Ugb2Ygc3VjY2VzcworCSAqIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIGluIGNhc2Ugb2YgZmFpbHVyZQorCSAqLworCWlmIChyICE9IG1zZ19jb3VudCkKKwkJZ290byBlcnI7CisKKwkvKiBJbiBjYXNlIG9mIHN1Y2Nlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkJImFkZHIgJXggYncgMHglMDJ4WyVkXTogMHglMDJ4XG4iLAorCQkJY2xpZW50LT5hZGRyLCBkYXRhWzBdICsgaSwgaSwgZGF0YVtpXSk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgInBpY29kbHBfaTJjX3dyaXRlIGVycm9yXG4iKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBwaWNvZGxwX2kyY193cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUzMiB2YWx1ZSkKK3sKKwl1OCBkYXRhWzVdOworCWludCBpOworCisJZGF0YVswXSA9IHJlZzsKKwlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQorCQlkYXRhW2ldID0gKHZhbHVlID4+ICgzMiAtIChpKSAqIDgpKSAmIDB4RkY7CisKKwlyZXR1cm4gcGljb2RscF9pMmNfd3JpdGVfYmxvY2soY2xpZW50LCBkYXRhLCA1KTsKK30KKworc3RhdGljIGludCBwaWNvZGxwX2kyY193cml0ZV9hcnJheShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IHBpY29kbHBfaTJjX2NvbW1hbmQgY29tbWFuZHNbXSwKKwkJCWludCBjb3VudCkKK3sKKwlpbnQgaSwgciA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJciA9IHBpY29kbHBfaTJjX3dyaXRlKGNsaWVudCwgY29tbWFuZHNbaV0ucmVnLAorCQkJCQkJY29tbWFuZHNbaV0udmFsdWUpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBwaWNvZGxwX3dhaXRfZm9yX2RtYV9kb25lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggdHJpYWwgPSAxMDA7CisKKwlkbyB7CisJCW1zbGVlcCgxKTsKKwkJaWYgKCF0cmlhbC0tKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJfSB3aGlsZSAocGljb2RscF9pMmNfcmVhZChjbGllbnQsIE1BSU5fU1RBVFVTKSAmIERNQV9TVEFUVVMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcGljb2RscF9pMmNfaW5pdDoJaTJjX2luaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAqIGNsaWVudDoJaTJjX2NsaWVudCBmb3IgY29tbXVuaWNhdGlvbgorICoKKyAqIHJldHVybgorICoJCTAJOiBTdWNjZXNzLCBubyBlcnJvcgorICoJZXJyb3IgY29kZQk6IEZhaWx1cmUKKyAqLworc3RhdGljIGludCBwaWNvZGxwX2kyY19pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHI7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwaWNvZGxwX2kyY19jb21tYW5kIGluaXRfY21kX3NldDFbXSA9IHsKKwkJe1NPRlRfUkVTRVQsIDF9LAorCQl7RE1EX1BBUktfVFJJR0dFUiwgMX0sCisJCXtNSVNDX1JFRywgNX0sCisJCXtTRVFfQ09OVFJPTCwgMH0sCisJCXtTRVFfVkVDVE9SLCAweDEwMH0sCisJCXtETURfQkxPQ0tfQ09VTlQsIDd9LAorCQl7RE1EX1ZDQ19DT05UUk9MLCAweDEwOX0sCisJCXtETURfUEFSS19QVUxTRV9DT1VOVCwgMHhBfSwKKwkJe0RNRF9QQVJLX1BVTFNFX1dJRFRILCAweEJ9LAorCQl7RE1EX1BBUktfREVMQVksIDB4MkVEfSwKKwkJe0RNRF9TSEFET1dfRU5BQkxFLCAwfSwKKwkJe0ZMQVNIX09QQ09ERSwgMHhCfSwKKwkJe0ZMQVNIX0RVTU1ZX0JZVEVTLCAxfSwKKwkJe0ZMQVNIX0FERFJfQllURVMsIDN9LAorCQl7UEJDX0NPTlRST0wsIDB9LAorCQl7RkxBU0hfU1RBUlRfQUREUiwgQ01UX0xVVF8wX1NUQVJUX0FERFJ9LAorCQl7RkxBU0hfUkVBRF9CWVRFUywgQ01UX0xVVF8wX1NJWkV9LAorCQl7Q01UX1NQTEFTSF9MVVRfU1RBUlRfQUREUiwgMH0sCisJCXtDTVRfU1BMQVNIX0xVVF9ERVNUX1NFTEVDVCwgQ01UX0xVVF9BTEx9LAorCQl7UEJDX0NPTlRST0wsIDF9LAorCX07CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHBpY29kbHBfaTJjX2NvbW1hbmQgaW5pdF9jbWRfc2V0MltdID0geworCQl7UEJDX0NPTlRST0wsIDB9LAorCQl7Q01UX1NQTEFTSF9MVVRfREVTVF9TRUxFQ1QsIDB9LAorCQl7UEJDX0NPTlRST0wsIDB9LAorCQl7RkxBU0hfU1RBUlRfQUREUiwgU0VRVUVOQ0VfMF9TVEFSVF9BRERSfSwKKwkJe0ZMQVNIX1JFQURfQllURVMsIFNFUVVFTkNFXzBfU0laRX0sCisJCXtTRVFfUkVTRVRfTFVUX1NUQVJUX0FERFIsIDB9LAorCQl7U0VRX1JFU0VUX0xVVF9ERVNUX1NFTEVDVCwgU0VRX1NFUV9MVVR9LAorCQl7UEJDX0NPTlRST0wsIDF9LAorCX07CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHBpY29kbHBfaTJjX2NvbW1hbmQgaW5pdF9jbWRfc2V0M1tdID0geworCQl7UEJDX0NPTlRST0wsIDB9LAorCQl7U0VRX1JFU0VUX0xVVF9ERVNUX1NFTEVDVCwgMH0sCisJCXtQQkNfQ09OVFJPTCwgMH0sCisJCXtGTEFTSF9TVEFSVF9BRERSLCBEUkNfVEFCTEVfMF9TVEFSVF9BRERSfSwKKwkJe0ZMQVNIX1JFQURfQllURVMsIERSQ19UQUJMRV8wX1NJWkV9LAorCQl7U0VRX1JFU0VUX0xVVF9TVEFSVF9BRERSLCAwfSwKKwkJe1NFUV9SRVNFVF9MVVRfREVTVF9TRUxFQ1QsIFNFUV9EUkNfTFVUX0FMTH0sCisJCXtQQkNfQ09OVFJPTCwgMX0sCisJfTsKKworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGljb2RscF9pMmNfY29tbWFuZCBpbml0X2NtZF9zZXQ0W10gPSB7CisJCXtQQkNfQ09OVFJPTCwgMH0sCisJCXtTRVFfUkVTRVRfTFVUX0RFU1RfU0VMRUNULCAwfSwKKwkJe1NEQ19FTkFCTEUsIDF9LAorCQl7QUdDX0NUUkwsIDd9LAorCQl7Q0NBX0MxQSwgMHgxMDB9LAorCQl7Q0NBX0MxQiwgMHgwfSwKKwkJe0NDQV9DMUMsIDB4MH0sCisJCXtDQ0FfQzJBLCAweDB9LAorCQl7Q0NBX0MyQiwgMHgxMDB9LAorCQl7Q0NBX0MyQywgMHgwfSwKKwkJe0NDQV9DM0EsIDB4MH0sCisJCXtDQ0FfQzNCLCAweDB9LAorCQl7Q0NBX0MzQywgMHgxMDB9LAorCQl7Q0NBX0M3QSwgMHgxMDB9LAorCQl7Q0NBX0M3QiwgMHgxMDB9LAorCQl7Q0NBX0M3QywgMHgxMDB9LAorCQl7Q0NBX0VOQUJMRSwgMX0sCisJCXtDUFVfSUZfTU9ERSwgMX0sCisJCXtTSE9SVF9GTElQLCAxfSwKKwkJe0NVUlRBSU5fQ09OVFJPTCwgMH0sCisJCXtETURfUEFSS19UUklHR0VSLCAwfSwKKwkJe1JfRFJJVkVfQ1VSUkVOVCwgMHgyOTh9LAorCQl7R19EUklWRV9DVVJSRU5ULCAweDI5OH0sCisJCXtCX0RSSVZFX0NVUlJFTlQsIDB4Mjk4fSwKKwkJe1JHQl9EUklWRVJfRU5BQkxFLCA3fSwKKwkJe1NFUV9DT05UUk9MLCAwfSwKKwkJe0FDVEdFTl9DT05UUk9MLCAweDEwfSwKKwkJe1NFUVVFTkNFX01PREUsIFNFUV9MT0NLfSwKKwkJe0RBVEFfRk9STUFULCBSR0I4ODh9LAorCQl7SU5QVVRfUkVTT0xVVElPTiwgV1ZHQV84NjRfTEFORFNDQVBFfSwKKwkJe0lOUFVUX1NPVVJDRSwgUEFSQUxMRUxfUkdCfSwKKwkJe0NQVV9JRl9TWU5DX01FVEhPRCwgMX0sCisJCXtTRVFfQ09OVFJPTCwgMX0KKwl9OworCisJciA9IHBpY29kbHBfaTJjX3dyaXRlX2FycmF5KGNsaWVudCwgaW5pdF9jbWRfc2V0MSwKKwkJCQkJCUFSUkFZX1NJWkUoaW5pdF9jbWRfc2V0MSkpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBwaWNvZGxwX3dhaXRfZm9yX2RtYV9kb25lKGNsaWVudCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHBpY29kbHBfaTJjX3dyaXRlX2FycmF5KGNsaWVudCwgaW5pdF9jbWRfc2V0MiwKKwkJCQkJQVJSQVlfU0laRShpbml0X2NtZF9zZXQyKSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHBpY29kbHBfd2FpdF9mb3JfZG1hX2RvbmUoY2xpZW50KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gcGljb2RscF9pMmNfd3JpdGVfYXJyYXkoY2xpZW50LCBpbml0X2NtZF9zZXQzLAorCQkJCQlBUlJBWV9TSVpFKGluaXRfY21kX3NldDMpKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gcGljb2RscF93YWl0X2Zvcl9kbWFfZG9uZShjbGllbnQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBwaWNvZGxwX2kyY193cml0ZV9hcnJheShjbGllbnQsIGluaXRfY21kX3NldDQsCisJCQkJCUFSUkFZX1NJWkUoaW5pdF9jbWRfc2V0NCkpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcGljb2RscF9pMmNfZGF0YSAqcGljb2RscF9pMmNfZGF0YTsKKworCXBpY29kbHBfaTJjX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGljb2RscF9pMmNfZGF0YSksIEdGUF9LRVJORUwpOworCisJaWYgKCFwaWNvZGxwX2kyY19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJnBpY29kbHBfaTJjX2RhdGEtPnhmZXJfbG9jayk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcGljb2RscF9pMmNfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaWNvZGxwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcGljb2RscF9pMmNfZGF0YSAqcGljb2RscF9pMmNfZGF0YSA9CisJCQkJCWkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWtmcmVlKHBpY29kbHBfaTJjX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGljb2RscF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInBpY29kbHBfaTJjX2RyaXZlciIsCisJfSwKKwkucHJvYmUJCT0gcGljb2RscF9pMmNfcHJvYmUsCisJLnJlbW92ZQkJPSBwaWNvZGxwX2kyY19yZW1vdmUsCisJLmlkX3RhYmxlCT0gcGljb2RscF9pMmNfaWQsCit9OworCitzdGF0aWMgaW50IHBpY29kbHBfcGFuZWxfcG93ZXJfb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByLCB0cmlhbCA9IDEwMDsKKwlzdHJ1Y3QgcGljb2RscF9kYXRhICpwaWNvZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCXN0cnVjdCBwaWNvZGxwX3BhbmVsX2RhdGEgKnBpY29kbHBfcGRhdGEgPSBnZXRfcGFuZWxfZGF0YShkc3NkZXYpOworCisJaWYgKGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKSB7CisJCXIgPSBkc3NkZXYtPnBsYXRmb3JtX2VuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCWdwaW9fc2V0X3ZhbHVlKHBpY29kbHBfcGRhdGEtPnB3cmdvb2RfZ3BpbywgMCk7CisJbXNsZWVwKDEpOworCWdwaW9fc2V0X3ZhbHVlKHBpY29kbHBfcGRhdGEtPnB3cmdvb2RfZ3BpbywgMSk7CisKKwl3aGlsZSAoIWdwaW9fZ2V0X3ZhbHVlKHBpY29kbHBfcGRhdGEtPmVtdV9kb25lX2dwaW8pKSB7CisJCWlmICghdHJpYWwtLSkgeworCQkJZGV2X2VycigmZHNzZGV2LT5kZXYsICJlbXVfZG9uZSBzaWduYWwgbm90IgorCQkJCQkJIiBnb2luZyBoaWdoXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCW1zbGVlcCg1KTsKKwl9CisJLyoKKwkgKiBBcyBwZXIgZHBwMjYwMCBwcm9ncmFtbWluZyBndWlkZSwKKwkgKiBpdCBpcyByZXF1aXJlZCB0byBzbGVlcCBmb3IgMTAwMG1zIGFmdGVyIGVtdV9kb25lIHNpZ25hbCBnb2VzIGhpZ2gKKwkgKiB0aGVuIG9ubHkgaTJjIGNvbW1hbmRzIGNhbiBiZSBzdWNjZXNzZnVsbHkgc2VudCB0byBkcHAyNjAwCisJICovCisJbXNsZWVwKDEwMDApOworCXIgPSBvbWFwZHNzX2RwaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBEUElcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJciA9IHBpY29kbHBfaTJjX2luaXQocGljb2QtPnBpY29kbHBfaTJjX2NsaWVudCk7CisJaWYgKHIpCisJCWdvdG8gZXJyOworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFOworCisJcmV0dXJuIHI7CitlcnI6CisJb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnIxOgorCWlmIChkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBpY29kbHBfcGFuZWxfcG93ZXJfb2ZmKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGljb2RscF9wYW5lbF9kYXRhICpwaWNvZGxwX3BkYXRhID0gZ2V0X3BhbmVsX2RhdGEoZHNzZGV2KTsKKworCW9tYXBkc3NfZHBpX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOworCisJZ3Bpb19zZXRfdmFsdWUocGljb2RscF9wZGF0YS0+ZW11X2RvbmVfZ3BpbywgMCk7CisJZ3Bpb19zZXRfdmFsdWUocGljb2RscF9wZGF0YS0+cHdyZ29vZF9ncGlvLCAwKTsKKworCWlmIChkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfcGFuZWxfcHJvYmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwaWNvZGxwX2RhdGEgKnBpY29kOworCXN0cnVjdCBwaWNvZGxwX3BhbmVsX2RhdGEgKnBpY29kbHBfcGRhdGEgPSBnZXRfcGFuZWxfZGF0YShkc3NkZXYpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqcGljb2RscF9pMmNfY2xpZW50OworCWludCByID0gMCwgcGljb2RscF9hZGFwdGVyX2lkOworCisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUIHwgT01BUF9EU1NfTENEX09OT0ZGIHwKKwkJCQlPTUFQX0RTU19MQ0RfSUhTIHwgT01BUF9EU1NfTENEX0lWUzsKKwlkc3NkZXYtPnBhbmVsLmFjYiA9IDB4MDsKKwlkc3NkZXYtPnBhbmVsLnRpbWluZ3MgPSBwaWNvX2xzX3RpbWluZ3M7CisKKwlwaWNvZCA9ICBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGljb2RscF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaWNvZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZwaWNvZC0+bG9jayk7CisKKwlwaWNvZGxwX2FkYXB0ZXJfaWQgPSBwaWNvZGxwX3BkYXRhLT5waWNvZGxwX2FkYXB0ZXJfaWQ7CisKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHBpY29kbHBfYWRhcHRlcl9pZCk7CisJaWYgKCFhZGFwdGVyKSB7CisJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiY2FuJ3QgZ2V0IGkyYyBhZGFwdGVyXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCXBpY29kbHBfaTJjX2NsaWVudCA9IGkyY19uZXdfZGV2aWNlKGFkYXB0ZXIsICZwaWNvZGxwX2kyY19ib2FyZF9pbmZvKTsKKwlpZiAoIXBpY29kbHBfaTJjX2NsaWVudCkgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZGV2aWNlOjoiCisJCQkJCSAiIHBpY29kbHBfaTJjX2NsaWVudCBpcyBOVUxMXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCXBpY29kLT5waWNvZGxwX2kyY19jbGllbnQgPSBwaWNvZGxwX2kyY19jbGllbnQ7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2LCBwaWNvZCk7CisJcmV0dXJuIHI7CitlcnI6CisJa2ZyZWUocGljb2QpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBwaWNvZGxwX3BhbmVsX3JlbW92ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHBpY29kbHBfZGF0YSAqcGljb2QgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCWkyY191bnJlZ2lzdGVyX2RldmljZShwaWNvZC0+cGljb2RscF9pMmNfY2xpZW50KTsKKwlkZXZfc2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2LCBOVUxMKTsKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgInJlbW92aW5nIHBpY29kbHAgcGFuZWxcbiIpOworCisJa2ZyZWUocGljb2QpOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfcGFuZWxfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGljb2RscF9kYXRhICpwaWNvZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCWludCByOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJlbmFibGluZyBwaWNvZGxwIHBhbmVsXG4iKTsKKworCW11dGV4X2xvY2soJnBpY29kLT5sb2NrKTsKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEKSB7CisJCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyID0gcGljb2RscF9wYW5lbF9wb3dlcl9vbihkc3NkZXYpOworCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBpY29kbHBfcGFuZWxfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHBpY29kbHBfZGF0YSAqcGljb2QgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCW11dGV4X2xvY2soJnBpY29kLT5sb2NrKTsKKwkvKiBUdXJuIG9mZiBETFAgUG93ZXIgKi8KKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJcGljb2RscF9wYW5lbF9wb3dlcl9vZmYoZHNzZGV2KTsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOworCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJkaXNhYmxpbmcgcGljb2RscCBwYW5lbFxuIik7Cit9CisKK3N0YXRpYyBpbnQgcGljb2RscF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGljb2RscF9kYXRhICpwaWNvZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCisJbXV0ZXhfbG9jaygmcGljb2QtPmxvY2spOworCS8qIFR1cm4gb2ZmIERMUCBQb3dlciAqLworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKSB7CisJCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgInVuYWJsZSB0byBzdXNwZW5kIHBpY29kbHAgcGFuZWwsIgorCQkJCQkiIHBhbmVsIGlzIG5vdCBBQ1RJVkVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaWNvZGxwX3BhbmVsX3Bvd2VyX29mZihkc3NkZXYpOworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEOworCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJzdXNwZW5kaW5nIHBpY29kbHAgcGFuZWxcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfcGFuZWxfcmVzdW1lKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGljb2RscF9kYXRhICpwaWNvZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCWludCByOworCisJbXV0ZXhfbG9jaygmcGljb2QtPmxvY2spOworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKSB7CisJCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgInVuYWJsZSB0byByZXN1bWUgcGljb2RscCBwYW5lbCwiCisJCQkiIHBhbmVsIGlzIG5vdCBBQ1RJVkVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyID0gcGljb2RscF9wYW5lbF9wb3dlcl9vbihkc3NkZXYpOworCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAicmVzdW1pbmcgcGljb2RscCBwYW5lbFxuIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBpY29kbHBfZ2V0X3Jlc29sdXRpb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJCQl1MTYgKnhyZXMsIHUxNiAqeXJlcykKK3sKKwkqeHJlcyA9IGRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlczsKKwkqeXJlcyA9IGRzc2Rldi0+cGFuZWwudGltaW5ncy55X3JlczsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgcGljb2RscF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBpY29kbHBfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBwaWNvZGxwX3BhbmVsX3JlbW92ZSwKKworCS5lbmFibGUJCT0gcGljb2RscF9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBwaWNvZGxwX3BhbmVsX2Rpc2FibGUsCisKKwkuZ2V0X3Jlc29sdXRpb24JPSBwaWNvZGxwX2dldF9yZXNvbHV0aW9uLAorCisJLnN1c3BlbmQJPSBwaWNvZGxwX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwaWNvZGxwX3BhbmVsX3Jlc3VtZSwKKworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJwaWNvZGxwX3BhbmVsIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBpY29kbHBfaW5pdCh2b2lkKQoreworCWludCByID0gMDsKKworCXIgPSBpMmNfYWRkX2RyaXZlcigmcGljb2RscF9pMmNfZHJpdmVyKTsKKwlpZiAocikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwaWNvZGxwX2kyY19kcml2ZXIiIFwKKwkJCSIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiByOworCX0KKworCXIgPSBvbWFwX2Rzc19yZWdpc3Rlcl9kcml2ZXIoJnBpY29kbHBfZHJpdmVyKTsKKwlpZiAocikKKwkJaTJjX2RlbF9kcml2ZXIoJnBpY29kbHBfaTJjX2RyaXZlcik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBpY29kbHBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZwaWNvZGxwX2kyY19kcml2ZXIpOworCW9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKCZwaWNvZGxwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBpY29kbHBfaW5pdCk7Cittb2R1bGVfZXhpdChwaWNvZGxwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNeXRocmkgUCBLIDxteXRocmlwa0B0aS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInBpY29kbHAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXBpY29kbHAuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtcGljb2RscC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGI0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXBpY29kbHAuaApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIEhlYWRlciBmaWxlIHJlcXVpcmVkIGJ5IHBpY29kbHAgcGFuZWwgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIEF1dGhvcjogTXl0aHJpIFAgSyA8bXl0aHJpcGtAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisqLworCisjaWZuZGVmIF9fT01BUDJfRElTUExBWV9QQU5FTF9QSUNPRExQX0gKKyNkZWZpbmUgX19PTUFQMl9ESVNQTEFZX1BBTkVMX1BJQ09ETFBfSAorCisvKiBDb21tYW5kcyB1c2VkIGZvciBjb25maWd1cmluZyBwaWNvZGxwIHBhbmVsICovCisKKyNkZWZpbmUgTUFJTl9TVEFUVVMJCQkweDAzCisjZGVmaW5lIFBCQ19DT05UUk9MCQkJMHgwOAorI2RlZmluZSBJTlBVVF9TT1VSQ0UJCQkweDBCCisjZGVmaW5lIElOUFVUX1JFU09MVVRJT04JCTB4MEMKKyNkZWZpbmUgREFUQV9GT1JNQVQJCQkweDBECisjZGVmaW5lIElNR19ST1RBVElPTgkJCTB4MEUKKyNkZWZpbmUgTE9OR19GTElQCQkJMHgwRgorI2RlZmluZSBTSE9SVF9GTElQCQkJMHgxMAorI2RlZmluZSBURVNUX1BBVF9TRUxFQ1QJCQkweDExCisjZGVmaW5lIFJfRFJJVkVfQ1VSUkVOVAkJCTB4MTIKKyNkZWZpbmUgR19EUklWRV9DVVJSRU5UCQkJMHgxMworI2RlZmluZSBCX0RSSVZFX0NVUlJFTlQJCQkweDE0CisjZGVmaW5lIFJFQURfUkVHX1NFTEVDVAkJCTB4MTUKKyNkZWZpbmUgUkdCX0RSSVZFUl9FTkFCTEUJCTB4MTYKKworI2RlZmluZSBDUFVfSUZfTU9ERQkJCTB4MTgKKyNkZWZpbmUgRlJBTUVfUkFURQkJCTB4MTkKKyNkZWZpbmUgQ1BVX0lGX1NZTkNfTUVUSE9ECQkweDFBCisjZGVmaW5lIENQVV9JRl9TT0YJCQkweDFCCisjZGVmaW5lIENQVV9JRl9FT0YJCQkweDFDCisjZGVmaW5lIENQVV9JRl9TTEVFUAkJCTB4MUQKKworI2RlZmluZSBTRVFVRU5DRV9NT0RFCQkJMHgxRQorI2RlZmluZSBTT0ZUX1JFU0VUCQkJMHgxRgorI2RlZmluZSBGUk9OVF9FTkRfUkVTRVQJCQkweDIxCisjZGVmaW5lIEFVVE9fUFdSX0VOQUJMRQkJCTB4MjIKKworI2RlZmluZSBWU1lOQ19MSU5FX0RFTEFZCQkweDIzCisjZGVmaW5lIENQVV9QSV9IT1JJWl9TVEFSVAkJMHgyNAorI2RlZmluZSBDUFVfUElfVkVSVF9TVEFSVAkJMHgyNQorI2RlZmluZSBDUFVfUElfSE9SSVpfV0lEVEgJCTB4MjYKKyNkZWZpbmUgQ1BVX1BJX1ZFUlRfSEVJR0hUCQkweDI3CisKKyNkZWZpbmUgUElYRUxfTUFTS19DUk9QCQkJMHgyOAorI2RlZmluZSBDUk9QX0ZJUlNUX0xJTkUJCQkweDI5CisjZGVmaW5lIENST1BfTEFTVF9MSU5FCQkJMHgyQQorI2RlZmluZSBDUk9QX0ZJUlNUX1BJWEVMCQkweDJCCisjZGVmaW5lIENST1BfTEFTVF9QSVhFTAkJCTB4MkMKKyNkZWZpbmUgRE1EX1BBUktfVFJJR0dFUgkJMHgyRAorCisjZGVmaW5lIE1JU0NfUkVHCQkJMHgzMAorCisvKiBBR0MgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFHQ19DVFJMCQkJMHg1MAorI2RlZmluZSBBR0NfQ0xJUFBFRF9QSVhTCQkweDU1CisjZGVmaW5lIEFHQ19CUklHSFRfUElYUwkJCTB4NTYKKyNkZWZpbmUgQUdDX0JHX1BJWFMJCQkweDU3CisjZGVmaW5lIEFHQ19TQUZFVFlfTUFSR0lOCQkweDE3CisKKy8qIENvbG9yIENvb3JkaW5hdGUgQWRqdXN0bWVudCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ0NBX0VOQUJMRQkJMHg1RQorI2RlZmluZSBDQ0FfQzFBCQkJMHg1RgorI2RlZmluZSBDQ0FfQzFCCQkJMHg2MAorI2RlZmluZSBDQ0FfQzFDCQkJMHg2MQorI2RlZmluZSBDQ0FfQzJBCQkJMHg2MgorI2RlZmluZSBDQ0FfQzJCCQkJMHg2MworI2RlZmluZSBDQ0FfQzJDCQkJMHg2NAorI2RlZmluZSBDQ0FfQzNBCQkJMHg2NQorI2RlZmluZSBDQ0FfQzNCCQkJMHg2NgorI2RlZmluZSBDQ0FfQzNDCQkJMHg2NworI2RlZmluZSBDQ0FfQzdBCQkJMHg3MQorI2RlZmluZSBDQ0FfQzdCCQkJMHg3MgorI2RlZmluZSBDQ0FfQzdDCQkJMHg3MworCisvKioKKyAqIERMUCBQaWNvIFByb2Nlc3NvciAyNjAwIGNvbWVzIHdpdGggZmxhc2gKKyAqIFdlIGNhbiBkbyBETUEgb3BlcmF0aW9ucyBmcm9tIGZsYXNoIGZvciBhY2Nlc3NpbmcgTG9vayBVcCBUYWJsZXMKKyAqLworI2RlZmluZSBETUFfU1RBVFVTCQkJMHgxMDAKKyNkZWZpbmUgRkxBU0hfQUREUl9CWVRFUwkJMHg3NAorI2RlZmluZSBGTEFTSF9EVU1NWV9CWVRFUwkJMHg3NQorI2RlZmluZSBGTEFTSF9XUklURV9CWVRFUwkJMHg3NgorI2RlZmluZSBGTEFTSF9SRUFEX0JZVEVTCQkweDc3CisjZGVmaW5lIEZMQVNIX09QQ09ERQkJCTB4NzgKKyNkZWZpbmUgRkxBU0hfU1RBUlRfQUREUgkJMHg3OQorI2RlZmluZSBGTEFTSF9EVU1NWTIJCQkweDdBCisjZGVmaW5lIEZMQVNIX1dSSVRFX0RBVEEJCTB4N0IKKworI2RlZmluZSBURU1QT1JBTF9ESVRIX0RJU0FCTEUJCTB4N0UKKyNkZWZpbmUgU0VRX0NPTlRST0wJCQkweDgyCisjZGVmaW5lIFNFUV9WRUNUT1IJCQkweDgzCisKKy8qIERNRCBpcyBEaWdpdGFsIE1pY3JvbWlycm9yIERldmljZSAqLworI2RlZmluZSBETURfQkxPQ0tfQ09VTlQJCQkweDg0CisjZGVmaW5lIERNRF9WQ0NfQ09OVFJPTAkJCTB4ODYKKyNkZWZpbmUgRE1EX1BBUktfUFVMU0VfQ09VTlQJCTB4ODcKKyNkZWZpbmUgRE1EX1BBUktfUFVMU0VfV0lEVEgJCTB4ODgKKyNkZWZpbmUgRE1EX1BBUktfREVMQVkJCQkweDg5CisjZGVmaW5lIERNRF9TSEFET1dfRU5BQkxFCQkweDhFCisjZGVmaW5lIFNFUV9TVEFUVVMJCQkweDhGCisjZGVmaW5lIEZMQVNIX0NMT0NLX0NPTlRST0wJCTB4OTgKKyNkZWZpbmUgRE1EX1BBUksJCQkweDJECisKKyNkZWZpbmUgU0RSQU1fQklTVF9FTkFCTEUJCTB4NDYKKyNkZWZpbmUgRERSX0RSSVZFUl9TVFJFTkdUSAkJMHg5QQorI2RlZmluZSBTRENfRU5BQkxFCQkJMHg5RAorI2RlZmluZSBTRENfQlVGRl9TV0FQX0RJU0FCTEUJCTB4QTMKKyNkZWZpbmUgQ1VSVEFJTl9DT05UUk9MCQkJMHhBNgorI2RlZmluZSBERFJfQlVTX1NXQVBfRU5BQkxFCQkweEE3CisjZGVmaW5lIERNRF9UUkNfRU5BQkxFCQkJMHhBOAorI2RlZmluZSBETURfQlVTX1NXQVBfRU5BQkxFCQkweEE5CisKKyNkZWZpbmUgQUNUR0VOX0VOQUJMRQkJCTB4QUUKKyNkZWZpbmUgQUNUR0VOX0NPTlRST0wJCQkweEFGCisjZGVmaW5lIEFDVEdFTl9IT1JJWl9CUAkJCTB4QjAKKyNkZWZpbmUgQUNUR0VOX1ZFUlRfQlAJCQkweEIxCisKKy8qIExvb2sgVXAgVGFibGUgYWNjZXNzICovCisjZGVmaW5lIENNVF9TUExBU0hfTFVUX1NUQVJUX0FERFIJMHhGQQorI2RlZmluZSBDTVRfU1BMQVNIX0xVVF9ERVNUX1NFTEVDVAkweEZCCisjZGVmaW5lIENNVF9TUExBU0hfTFVUX0RBVEEJCTB4RkMKKyNkZWZpbmUgU0VRX1JFU0VUX0xVVF9TVEFSVF9BRERSCTB4RkQKKyNkZWZpbmUgU0VRX1JFU0VUX0xVVF9ERVNUX1NFTEVDVAkweEZFCisjZGVmaW5lIFNFUV9SRVNFVF9MVVRfREFUQQkJMHhGRgorCisvKiBJbnB1dCBzb3VyY2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUEFSQUxMRUxfUkdCCQkwCisjZGVmaW5lIElOVF9URVNUX1BBVFRFUk4JMQorI2RlZmluZSBTUExBU0hfU0NSRUVOCQkyCisjZGVmaW5lIENQVV9JTlRGCQkzCisjZGVmaW5lIEJUNjU2CQkJNAorCisvKiBTdGFuZGFyZCBpbnB1dCByZXNvbHV0aW9uIGRlZmluaXRpb25zICovCisjZGVmaW5lIFFXVkdBX0xBTkRTQ0FQRQkJMwkvKiAoNDI3aCoyNDB2KSAqLworI2RlZmluZSBXVkdBXzg2NF9MQU5EU0NBUEUJMjEJLyogKDg2NGgqNDgwdikgKi8KKyNkZWZpbmUgV1ZHQV9ETURfT1BUSUNBTF9URVNUCTM1CS8qICg2MDhoKjY4NHYpICovCisKKy8qIFN0YW5kYXJkIGRhdGEgZm9ybWF0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFJHQjU2NQkJCTAKKyNkZWZpbmUgUkdCNjY2CQkJMQorI2RlZmluZSBSR0I4ODgJCQkyCisKKy8qIFRlc3QgUGF0dGVybiBkZWZpbml0aW9ucyAqLworI2RlZmluZSBUUEdfQ0hFQ0tFUkJPQVJECTAKKyNkZWZpbmUgVFBHX0JMQUNLCQkxCisjZGVmaW5lIFRQR19XSElURQkJMgorI2RlZmluZSBUUEdfUkVECQkJMworI2RlZmluZSBUUEdfQkxVRQkJNAorI2RlZmluZSBUUEdfR1JFRU4JCTUKKyNkZWZpbmUgVFBHX1ZMSU5FU19CTEFDSwk2CisjZGVmaW5lIFRQR19ITElORVNfQkxBQ0sJNworI2RlZmluZSBUUEdfVkxJTkVTX0FMVAkJOAorI2RlZmluZSBUUEdfSExJTkVTX0FMVAkJOQorI2RlZmluZSBUUEdfRElBR19MSU5FUwkJMTAKKyNkZWZpbmUgVFBHX0dSRVlSQU1QX1ZFUlQJMTEKKyNkZWZpbmUgVFBHX0dSRVlSQU1QX0hPUklaCTEyCisjZGVmaW5lIFRQR19BTlNJX0NIRUNLRVJCT0FSRAkxMworCisvKiBzZXF1ZW5jZSBtb2RlIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNFUV9GUkVFX1JVTgkJMAorI2RlZmluZSBTRVFfTE9DSwkJMQorCisvKiBjdXJ0YWluIGNvbG9yIGRlZmluaXRpb25zICovCisjZGVmaW5lIENVUlRBSU5fQkxBQ0sJCTAKKyNkZWZpbmUgQ1VSVEFJTl9SRUQJCTEKKyNkZWZpbmUgQ1VSVEFJTl9HUkVFTgkJMgorI2RlZmluZSBDVVJUQUlOX0JMVUUJCTMKKyNkZWZpbmUgQ1VSVEFJTl9ZRUxMT1cJCTQKKyNkZWZpbmUgQ1VSVEFJTl9NQUdFTlRBCQk1CisjZGVmaW5lIENVUlRBSU5fQ1lBTgkJNgorI2RlZmluZSBDVVJUQUlOX1dISVRFCQk3CisKKy8qIExVVCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDTVRfTFVUX05PTkUJCTAKKyNkZWZpbmUgQ01UX0xVVF9HUkVFTgkJMQorI2RlZmluZSBDTVRfTFVUX1JFRAkJMgorI2RlZmluZSBDTVRfTFVUX0JMVUUJCTMKKyNkZWZpbmUgQ01UX0xVVF9BTEwJCTQKKyNkZWZpbmUgU1BMQVNIX0xVVAkJNQorCisjZGVmaW5lIFNFUV9MVVRfTk9ORQkJMAorI2RlZmluZSBTRVFfRFJDX0xVVF8wCQkxCisjZGVmaW5lIFNFUV9EUkNfTFVUXzEJCTIKKyNkZWZpbmUgU0VRX0RSQ19MVVRfMgkJMworI2RlZmluZSBTRVFfRFJDX0xVVF8zCQk0CisjZGVmaW5lIFNFUV9TRVFfTFVUCQk1CisjZGVmaW5lIFNFUV9EUkNfTFVUX0FMTAkJNgorI2RlZmluZSBXUENfUFJPR1JBTV9MVVQJCTcKKworI2RlZmluZSBCSVRTVFJFQU1fU1RBUlRfQUREUgkJMHgwMDAwMDAwMAorI2RlZmluZSBCSVRTVFJFQU1fU0laRQkJCTB4MDAwNDAwMDAKKworI2RlZmluZSBXUENfRldfMF9TVEFSVF9BRERSCQkweDAwMDQwMDAwCisjZGVmaW5lIFdQQ19GV18wX1NJWkUJCQkweDAwMDAwY2U4CisKKyNkZWZpbmUgU0VRVUVOQ0VfMF9TVEFSVF9BRERSCQkweDAwMDQ0MDAwCisjZGVmaW5lIFNFUVVFTkNFXzBfU0laRQkJCTB4MDAwMDEwMDAKKworI2RlZmluZSBTRVFVRU5DRV8xX1NUQVJUX0FERFIJCTB4MDAwNDUwMDAKKyNkZWZpbmUgU0VRVUVOQ0VfMV9TSVpFCQkJMHgwMDAwMGQxMAorCisjZGVmaW5lIFNFUVVFTkNFXzJfU1RBUlRfQUREUgkJMHgwMDA0NjAwMAorI2RlZmluZSBTRVFVRU5DRV8yX1NJWkUJCQkweDAwMDAwZDEwCisKKyNkZWZpbmUgU0VRVUVOQ0VfM19TVEFSVF9BRERSCQkweDAwMDQ3MDAwCisjZGVmaW5lIFNFUVVFTkNFXzNfU0laRQkJCTB4MDAwMDBkMTAKKworI2RlZmluZSBTRVFVRU5DRV80X1NUQVJUX0FERFIJCTB4MDAwNDgwMDAKKyNkZWZpbmUgU0VRVUVOQ0VfNF9TSVpFCQkJMHgwMDAwMGQxMAorCisjZGVmaW5lIFNFUVVFTkNFXzVfU1RBUlRfQUREUgkJMHgwMDA0OTAwMAorI2RlZmluZSBTRVFVRU5DRV81X1NJWkUJCQkweDAwMDAwZDEwCisKKyNkZWZpbmUgU0VRVUVOQ0VfNl9TVEFSVF9BRERSCQkweDAwMDRhMDAwCisjZGVmaW5lIFNFUVVFTkNFXzZfU0laRQkJCTB4MDAwMDBkMTAKKworI2RlZmluZSBDTVRfTFVUXzBfU1RBUlRfQUREUgkJMHgwMDA0YjIwMAorI2RlZmluZSBDTVRfTFVUXzBfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzFfU1RBUlRfQUREUgkJMHgwMDA0YjgwMAorI2RlZmluZSBDTVRfTFVUXzFfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzJfU1RBUlRfQUREUgkJMHgwMDA0YmUwMAorI2RlZmluZSBDTVRfTFVUXzJfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzNfU1RBUlRfQUREUgkJMHgwMDA0YzQwMAorI2RlZmluZSBDTVRfTFVUXzNfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzRfU1RBUlRfQUREUgkJMHgwMDA0Y2EwMAorI2RlZmluZSBDTVRfTFVUXzRfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzVfU1RBUlRfQUREUgkJMHgwMDA0ZDAwMAorI2RlZmluZSBDTVRfTFVUXzVfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzZfU1RBUlRfQUREUgkJMHgwMDA0ZDYwMAorI2RlZmluZSBDTVRfTFVUXzZfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBEUkNfVEFCTEVfMF9TVEFSVF9BRERSCQkweDAwMDRkYzAwCisjZGVmaW5lIERSQ19UQUJMRV8wX1NJWkUJCTB4MDAwMDAxMDAKKworI2RlZmluZSBTUExBU0hfMF9TVEFSVF9BRERSCQkweDAwMDRkZDAwCisjZGVmaW5lIFNQTEFTSF8wX1NJWkUJCQkweDAwMDMyMjgwCisKKyNkZWZpbmUgU0VRVUVOQ0VfN19TVEFSVF9BRERSCQkweDAwMDgwMDAwCisjZGVmaW5lIFNFUVVFTkNFXzdfU0laRQkJCTB4MDAwMDBkMTAKKworI2RlZmluZSBTRVFVRU5DRV84X1NUQVJUX0FERFIJCTB4MDAwODE4MDAKKyNkZWZpbmUgU0VRVUVOQ0VfOF9TSVpFCQkJMHgwMDAwMGQxMAorCisjZGVmaW5lIFNFUVVFTkNFXzlfU1RBUlRfQUREUgkJMHgwMDA4MzAwMAorI2RlZmluZSBTRVFVRU5DRV85X1NJWkUJCQkweDAwMDAwZDEwCisKKyNkZWZpbmUgQ01UX0xVVF83X1NUQVJUX0FERFIJCTB4MDAwOGUwMDAKKyNkZWZpbmUgQ01UX0xVVF83X1NJWkUJCQkweDAwMDAwNjAwCisKKyNkZWZpbmUgQ01UX0xVVF84X1NUQVJUX0FERFIJCTB4MDAwOGU4MDAKKyNkZWZpbmUgQ01UX0xVVF84X1NJWkUJCQkweDAwMDAwNjAwCisKKyNkZWZpbmUgQ01UX0xVVF85X1NUQVJUX0FERFIJCTB4MDAwOGYwMDAKKyNkZWZpbmUgQ01UX0xVVF85X1NJWkUJCQkweDAwMDAwNjAwCisKKyNkZWZpbmUgU1BMQVNIXzFfU1RBUlRfQUREUgkJMHgwMDA5YTAwMAorI2RlZmluZSBTUExBU0hfMV9TSVpFCQkJMHgwMDAzMjI4MAorCisjZGVmaW5lIFNQTEFTSF8yX1NUQVJUX0FERFIJCTB4MDAwY2QwMDAKKyNkZWZpbmUgU1BMQVNIXzJfU0laRQkJCTB4MDAwMzIyODAKKworI2RlZmluZSBTUExBU0hfM19TVEFSVF9BRERSCQkweDAwMTAwMDAwCisjZGVmaW5lIFNQTEFTSF8zX1NJWkUJCQkweDAwMDMyMjgwCisKKyNkZWZpbmUgT1BUX1NQTEFTSF8wX1NUQVJUX0FERFIJCTB4MDAxMzQwMDAKKyNkZWZpbmUgT1BUX1NQTEFTSF8wX1NJWkUJCTB4MDAwY2IxMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXRhYWwuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jCmluZGV4IDRlODg4YWMuLjgwYzNmNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jCkBAIC0zNSwyNiArMzUsMTIgQEAKIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLW5va2lhLWRzaS5oPgorI2luY2x1ZGUgPHZpZGVvL21pcGlfZGlzcGxheS5oPgogCiAvKiBEU0kgVmlydHVhbCBjaGFubmVsLiBIYXJkY29kZWQgZm9yIG5vdy4gKi8KICNkZWZpbmUgVENIIDAKIAogI2RlZmluZSBEQ1NfUkVBRF9OVU1fRVJST1JTCTB4MDUKLSNkZWZpbmUgRENTX1JFQURfUE9XRVJfTU9ERQkweDBhCi0jZGVmaW5lIERDU19SRUFEX01BRENUTAkJMHgwYgotI2RlZmluZSBEQ1NfUkVBRF9QSVhFTF9GT1JNQVQJMHgwYwotI2RlZmluZSBEQ1NfUkREU0RSCQkweDBmCi0jZGVmaW5lIERDU19TTEVFUF9JTgkJMHgxMAotI2RlZmluZSBEQ1NfU0xFRVBfT1VUCQkweDExCi0jZGVmaW5lIERDU19ESVNQTEFZX09GRgkJMHgyOAotI2RlZmluZSBEQ1NfRElTUExBWV9PTgkJMHgyOQotI2RlZmluZSBEQ1NfQ09MVU1OX0FERFIJCTB4MmEKLSNkZWZpbmUgRENTX1BBR0VfQUREUgkJMHgyYgotI2RlZmluZSBEQ1NfTUVNT1JZX1dSSVRFCTB4MmMKLSNkZWZpbmUgRENTX1RFQVJfT0ZGCQkweDM0Ci0jZGVmaW5lIERDU19URUFSX09OCQkweDM1Ci0jZGVmaW5lIERDU19NRU1fQUNDX0NUUkwJMHgzNgotI2RlZmluZSBEQ1NfUElYRUxfRk9STUFUCTB4M2EKICNkZWZpbmUgRENTX0JSSUdIVE5FU1MJCTB4NTEKICNkZWZpbmUgRENTX0NUUkxfRElTUExBWQkweDUzCiAjZGVmaW5lIERDU19XUklURV9DQUJDCQkweDU1CkBAIC0yMjIsOCArMjA4LDYgQEAKIAogCXN0cnVjdCBkZWxheWVkX3dvcmsgdGVfdGltZW91dF93b3JrOwogCi0JYm9vbCB1c2VfZHNpX2JsOwotCiAJYm9vbCBjYWJjX2Jyb2tlbjsKIAl1bnNpZ25lZCBjYWJjX21vZGU7CiAKQEAgLTMwMiw3ICsyODYsNyBAQAogCiAJaHdfZ3VhcmRfd2FpdCh0ZCk7CiAKLQljbWQgPSBEQ1NfU0xFRVBfSU47CisJY21kID0gTUlQSV9EQ1NfRU5URVJfU0xFRVBfTU9ERTsKIAlyID0gZHNpX3ZjX2Rjc193cml0ZV9ub3N5bmModGQtPmRzc2RldiwgdGQtPmNoYW5uZWwsICZjbWQsIDEpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTMyMSw3ICszMDUsNyBAQAogCiAJaHdfZ3VhcmRfd2FpdCh0ZCk7CiAKLQlyID0gdGFhbF9kY3Nfd3JpdGVfMCh0ZCwgRENTX1NMRUVQX09VVCk7CisJciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIE1JUElfRENTX0VYSVRfU0xFRVBfTU9ERSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCkBAIC0zNTYsNyArMzQwLDcgQEAKIAl1OCBtb2RlOwogCWludCBiNSwgYjYsIGI3OwogCi0JciA9IHRhYWxfZGNzX3JlYWRfMSh0ZCwgRENTX1JFQURfTUFEQ1RMLCAmbW9kZSk7CisJciA9IHRhYWxfZGNzX3JlYWRfMSh0ZCwgTUlQSV9EQ1NfR0VUX0FERFJFU1NfTU9ERSwgJm1vZGUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIApAQCAtMzkwLDcgKzM3NCw3IEBACiAJbW9kZSAmPSB+KCgxPDw3KSB8ICgxPDw2KSB8ICgxPDw1KSk7CiAJbW9kZSB8PSAoYjcgPDwgNykgfCAoYjYgPDwgNikgfCAoYjUgPDwgNSk7CiAKLQlyZXR1cm4gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgRENTX01FTV9BQ0NfQ1RSTCwgbW9kZSk7CisJcmV0dXJuIHRhYWxfZGNzX3dyaXRlXzEodGQsIE1JUElfRENTX1NFVF9BRERSRVNTX01PREUsIG1vZGUpOwogfQogCiBzdGF0aWMgaW50IHRhYWxfc2V0X3VwZGF0ZV93aW5kb3coc3RydWN0IHRhYWxfZGF0YSAqdGQsCkBAIC00MDMsNyArMzg3LDcgQEAKIAl1MTYgeTIgPSB5ICsgaCAtIDE7CiAKIAl1OCBidWZbNV07Ci0JYnVmWzBdID0gRENTX0NPTFVNTl9BRERSOworCWJ1ZlswXSA9IE1JUElfRENTX1NFVF9DT0xVTU5fQUREUkVTUzsKIAlidWZbMV0gPSAoeDEgPj4gOCkgJiAweGZmOwogCWJ1ZlsyXSA9ICh4MSA+PiAwKSAmIDB4ZmY7CiAJYnVmWzNdID0gKHgyID4+IDgpICYgMHhmZjsKQEAgLTQxMyw3ICszOTcsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWJ1ZlswXSA9IERDU19QQUdFX0FERFI7CisJYnVmWzBdID0gTUlQSV9EQ1NfU0VUX1BBR0VfQUREUkVTUzsKIAlidWZbMV0gPSAoeTEgPj4gOCkgJiAweGZmOwogCWJ1ZlsyXSA9ICh5MSA+PiAwKSAmIDB4ZmY7CiAJYnVmWzNdID0gKHkyID4+IDgpICYgMHhmZjsKQEAgLTU1NSw3ICs1MzksNiBAQAogewogCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOwogCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7Ci0Jc3RydWN0IG5va2lhX2RzaV9wYW5lbF9kYXRhICpwYW5lbF9kYXRhID0gZ2V0X3BhbmVsX2RhdGEoZHNzZGV2KTsKIAlpbnQgcjsKIAlpbnQgbGV2ZWw7CiAKQEAgLTU2OSwyMyArNTUyLDE2IEBACiAKIAltdXRleF9sb2NrKCZ0ZC0+bG9jayk7CiAKLQlpZiAodGQtPnVzZV9kc2lfYmwpIHsKLQkJaWYgKHRkLT5lbmFibGVkKSB7Ci0JCQlkc2lfYnVzX2xvY2soZHNzZGV2KTsKKwlpZiAodGQtPmVuYWJsZWQpIHsKKwkJZHNpX2J1c19sb2NrKGRzc2Rldik7CiAKLQkJCXIgPSB0YWFsX3dha2VfdXAoZHNzZGV2KTsKLQkJCWlmICghcikKLQkJCQlyID0gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgRENTX0JSSUdIVE5FU1MsIGxldmVsKTsKKwkJciA9IHRhYWxfd2FrZV91cChkc3NkZXYpOworCQlpZiAoIXIpCisJCQlyID0gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgRENTX0JSSUdIVE5FU1MsIGxldmVsKTsKIAotCQkJZHNpX2J1c191bmxvY2soZHNzZGV2KTsKLQkJfSBlbHNlIHsKLQkJCXIgPSAwOwotCQl9CisJCWRzaV9idXNfdW5sb2NrKGRzc2Rldik7CiAJfSBlbHNlIHsKLQkJaWYgKCFwYW5lbF9kYXRhLT5zZXRfYmFja2xpZ2h0KQotCQkJciA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXIgPSBwYW5lbF9kYXRhLT5zZXRfYmFja2xpZ2h0KGRzc2RldiwgbGV2ZWwpOworCQlyID0gMDsKIAl9CiAKIAltdXRleF91bmxvY2soJnRkLT5sb2NrKTsKQEAgLTk2NCw3ICs5NDAsNyBAQAogewogCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKIAlzdHJ1Y3QgdGFhbF9kYXRhICp0ZDsKLQlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxkZXY7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsZGV2ID0gTlVMTDsKIAlzdHJ1Y3Qgbm9raWFfZHNpX3BhbmVsX2RhdGEgKnBhbmVsX2RhdGEgPSBnZXRfcGFuZWxfZGF0YShkc3NkZXYpOwogCXN0cnVjdCBwYW5lbF9jb25maWcgKnBhbmVsX2NvbmZpZyA9IE5VTEw7CiAJaW50IHIsIGk7CkBAIC05OTAsNyArOTY2LDcgQEAKIAogCWRzc2Rldi0+cGFuZWwuY29uZmlnID0gT01BUF9EU1NfTENEX1RGVDsKIAlkc3NkZXYtPnBhbmVsLnRpbWluZ3MgPSBwYW5lbF9jb25maWctPnRpbWluZ3M7Ci0JZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUgPSAyNDsKKwlkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10ID0gT01BUF9EU1NfRFNJX0ZNVF9SR0I4ODg7CiAKIAl0ZCA9IGt6YWxsb2Moc2l6ZW9mKCp0ZCksIEdGUF9LRVJORUwpOwogCWlmICghdGQpIHsKQEAgLTEwMjUsMzUgKzEwMDEsMjYgQEAKIAogCXRhYWxfaHdfcmVzZXQoZHNzZGV2KTsKIAotCS8qIGlmIG5vIHBsYXRmb3JtIHNldF9iYWNrbGlnaHQoKSBkZWZpbmVkLCBwcmVzdW1lIERTSSBiYWNrbGlnaHQKLQkgKiBjb250cm9sICovCi0JbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOwotCWlmICghcGFuZWxfZGF0YS0+c2V0X2JhY2tsaWdodCkKLQkJdGQtPnVzZV9kc2lfYmwgPSB0cnVlOwotCi0JaWYgKHRkLT51c2VfZHNpX2JsKQorCWlmIChwYW5lbF9kYXRhLT51c2VfZHNpX2JhY2tsaWdodCkgeworCQltZW1zZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7CiAJCXByb3BzLm1heF9icmlnaHRuZXNzID0gMjU1OwotCWVsc2UKLQkJcHJvcHMubWF4X2JyaWdodG5lc3MgPSAxMjc7CiAKLQlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1JBVzsKLQlibGRldiA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoZGV2X25hbWUoJmRzc2Rldi0+ZGV2KSwgJmRzc2Rldi0+ZGV2LAotCQkJCQlkc3NkZXYsICZ0YWFsX2JsX29wcywgJnByb3BzKTsKLQlpZiAoSVNfRVJSKGJsZGV2KSkgewotCQlyID0gUFRSX0VSUihibGRldik7Ci0JCWdvdG8gZXJyX2JsOwotCX0KKwkJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7CisJCWJsZGV2ID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihkZXZfbmFtZSgmZHNzZGV2LT5kZXYpLAorCQkJCSZkc3NkZXYtPmRldiwgZHNzZGV2LCAmdGFhbF9ibF9vcHMsICZwcm9wcyk7CisJCWlmIChJU19FUlIoYmxkZXYpKSB7CisJCQlyID0gUFRSX0VSUihibGRldik7CisJCQlnb3RvIGVycl9ibDsKKwkJfQogCi0JdGQtPmJsZGV2ID0gYmxkZXY7CisJCXRkLT5ibGRldiA9IGJsZGV2OwogCi0JYmxkZXYtPnByb3BzLmZiX2JsYW5rID0gRkJfQkxBTktfVU5CTEFOSzsKLQlibGRldi0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOwotCWlmICh0ZC0+dXNlX2RzaV9ibCkKKwkJYmxkZXYtPnByb3BzLmZiX2JsYW5rID0gRkJfQkxBTktfVU5CTEFOSzsKKwkJYmxkZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKIAkJYmxkZXYtPnByb3BzLmJyaWdodG5lc3MgPSAyNTU7Ci0JZWxzZQotCQlibGRldi0+cHJvcHMuYnJpZ2h0bmVzcyA9IDEyNzsKIAotCXRhYWxfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7CisJCXRhYWxfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7CisJfQogCiAJaWYgKHBhbmVsX2RhdGEtPnVzZV9leHRfdGUpIHsKIAkJaW50IGdwaW8gPSBwYW5lbF9kYXRhLT5leHRfdGVfZ3BpbzsKQEAgLTEwNjcsNyArMTAzNCw3IEBACiAJCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOwogCiAJCXIgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShncGlvKSwgdGFhbF90ZV9pc3IsCi0JCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKIAkJCQkidGFhbCB2c3luYyIsIGRzc2Rldik7CiAKIAkJaWYgKHIpIHsKQEAgLTExMTEsNyArMTA3OCw4IEBACiAJaWYgKHBhbmVsX2RhdGEtPnVzZV9leHRfdGUpCiAJCWdwaW9fZnJlZShwYW5lbF9kYXRhLT5leHRfdGVfZ3Bpbyk7CiBlcnJfZ3BpbzoKLQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmxkZXYpOworCWlmIChibGRldiAhPSBOVUxMKQorCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmxkZXYpOwogZXJyX2JsOgogCWRlc3Ryb3lfd29ya3F1ZXVlKHRkLT53b3JrcXVldWUpOwogZXJyX3dxOgpAQCAtMTE0MCw5ICsxMTA4LDExIEBACiAJfQogCiAJYmxkZXYgPSB0ZC0+YmxkZXY7Ci0JYmxkZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOwotCXRhYWxfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7Ci0JYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGJsZGV2KTsKKwlpZiAoYmxkZXYgIT0gTlVMTCkgeworCQlibGRldi0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJCXRhYWxfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7CisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihibGRldik7CisJfQogCiAJdGFhbF9jYW5jZWxfdWxwc193b3JrKGRzc2Rldik7CiAJdGFhbF9jYW5jZWxfZXNkX3dvcmsoZHNzZGV2KTsKQEAgLTExOTUsNyArMTE2NSw4IEBACiAJaWYgKHIpCiAJCWdvdG8gZXJyOwogCi0JciA9IHRhYWxfZGNzX3dyaXRlXzEodGQsIERDU19QSVhFTF9GT1JNQVQsIDB4Nyk7IC8qIDI0Yml0L3BpeGVsICovCisJciA9IHRhYWxfZGNzX3dyaXRlXzEodGQsIE1JUElfRENTX1NFVF9QSVhFTF9GT1JNQVQsCisJCU1JUElfRENTX1BJWEVMX0ZNVF8yNEJJVCk7CiAJaWYgKHIpCiAJCWdvdG8gZXJyOwogCkBAIC0xMjA5LDcgKzExODAsNyBAQAogCQkJZ290byBlcnI7CiAJfQogCi0JciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIERDU19ESVNQTEFZX09OKTsKKwlyID0gdGFhbF9kY3Nfd3JpdGVfMCh0ZCwgTUlQSV9EQ1NfU0VUX0RJU1BMQVlfT04pOwogCWlmIChyKQogCQlnb3RvIGVycjsKIApAQCAtMTI0Niw3ICsxMjE3LDcgQEAKIAlzdHJ1Y3QgdGFhbF9kYXRhICp0ZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOwogCWludCByOwogCi0JciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIERDU19ESVNQTEFZX09GRik7CisJciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIE1JUElfRENTX1NFVF9ESVNQTEFZX09GRik7CiAJaWYgKCFyKQogCQlyID0gdGFhbF9zbGVlcF9pbih0ZCk7CiAKQEAgLTE1MjksOSArMTUwMCw5IEBACiAJaW50IHI7CiAKIAlpZiAoZW5hYmxlKQotCQlyID0gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgRENTX1RFQVJfT04sIDApOworCQlyID0gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgTUlQSV9EQ1NfU0VUX1RFQVJfT04sIDApOwogCWVsc2UKLQkJciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIERDU19URUFSX09GRik7CisJCXIgPSB0YWFsX2Rjc193cml0ZV8wKHRkLCBNSVBJX0RDU19TRVRfVEVBUl9PRkYpOwogCiAJaWYgKCFwYW5lbF9kYXRhLT51c2VfZXh0X3RlKQogCQlvbWFwZHNzX2RzaV9lbmFibGVfdGUoZHNzZGV2LCBlbmFibGUpOwpAQCAtMTg1MSw3ICsxODIyLDcgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JciA9IHRhYWxfZGNzX3JlYWRfMSh0ZCwgRENTX1JERFNEUiwgJnN0YXRlMSk7CisJciA9IHRhYWxfZGNzX3JlYWRfMSh0ZCwgTUlQSV9EQ1NfR0VUX0RJQUdOT1NUSUNfUkVTVUxULCAmc3RhdGUxKTsKIAlpZiAocikgewogCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImZhaWxlZCB0byByZWFkIFRhYWwgc3RhdHVzXG4iKTsKIAkJZ290byBlcnI7CkBAIC0xODY0LDcgKzE4MzUsNyBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlyID0gdGFhbF9kY3NfcmVhZF8xKHRkLCBEQ1NfUkREU0RSLCAmc3RhdGUyKTsKKwlyID0gdGFhbF9kY3NfcmVhZF8xKHRkLCBNSVBJX0RDU19HRVRfRElBR05PU1RJQ19SRVNVTFQsICZzdGF0ZTIpOwogCWlmIChyKSB7CiAJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgVGFhbCBzdGF0dXNcbiIpOwogCQlnb3RvIGVycjsKQEAgLTE4ODAsNyArMTg1MSw3IEBACiAJLyogU2VsZi1kaWFnbm9zdGljcyByZXN1bHQgaXMgYWxzbyBzaG93biBvbiBURSBHUElPIGxpbmUuIFdlIG5lZWQKIAkgKiB0byByZS1lbmFibGUgVEUgYWZ0ZXIgc2VsZiBkaWFnbm9zdGljcyAqLwogCWlmICh0ZC0+dGVfZW5hYmxlZCAmJiBwYW5lbF9kYXRhLT51c2VfZXh0X3RlKSB7Ci0JCXIgPSB0YWFsX2Rjc193cml0ZV8xKHRkLCBEQ1NfVEVBUl9PTiwgMCk7CisJCXIgPSB0YWFsX2Rjc193cml0ZV8xKHRkLCBNSVBJX0RDU19TRVRfVEVBUl9PTiwgMCk7CiAJCWlmIChyKQogCQkJZ290byBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL0tjb25maWcKaW5kZXggMGQxMjUyNC4uN2JlN2MwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogbWVudWNvbmZpZyBPTUFQMl9EU1MKLSAgICAgICAgdHJpc3RhdGUgIk9NQVAyKyBEaXNwbGF5IFN1YnN5c3RlbSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorICAgICAgICB0cmlzdGF0ZSAiT01BUDIrIERpc3BsYXkgU3Vic3lzdGVtIHN1cHBvcnQiCiAgICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMKICAgICAgICAgaGVscAogCSAgT01BUDIrIERpc3BsYXkgU3Vic3lzdGVtIHN1cHBvcnQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL01ha2VmaWxlCmluZGV4IDEwZDlkM2IuLmJkMzRhYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL01ha2VmaWxlCkBAIC02LDQgKzYsNCBAQAogb21hcGRzcy0kKENPTkZJR19PTUFQMl9EU1NfU0RJKSArPSBzZGkubwogb21hcGRzcy0kKENPTkZJR19PTUFQMl9EU1NfRFNJKSArPSBkc2kubwogb21hcGRzcy0kKENPTkZJR19PTUFQNF9EU1NfSERNSSkgKz0gaGRtaS5vIFwKLQkJCQkgICAgaGRtaV9vbWFwNF9wYW5lbC5vCisJCQkJICAgIGhkbWlfcGFuZWwubyB0aV9oZG1pXzR4eHhfaXAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvY29yZS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvY29yZS5jCmluZGV4IDc2ODIxZmUuLjg2ZWMxMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9jb3JlLmMKQEAgLTE0NSw2ICsxNDUsMTAgQEAKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ2ZW5jIiwgU19JUlVHTywgZHNzX2RlYnVnZnNfZGlyLAogCQkJJnZlbmNfZHVtcF9yZWdzLCAmZHNzX2RlYnVnX2ZvcHMpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX09NQVA0X0RTU19IRE1JCisJZGVidWdmc19jcmVhdGVfZmlsZSgiaGRtaSIsIFNfSVJVR08sIGRzc19kZWJ1Z2ZzX2RpciwKKwkJCSZoZG1pX2R1bXBfcmVncywgJmRzc19kZWJ1Z19mb3BzKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuYwppbmRleCAwZjM5NjFhLi4zNTMyNzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KQEAgLTEwNiw3ICsxMDcsNyBAQAogCWludCBpcnE7CiAJc3RydWN0IGNsayAqZHNzX2NsazsKIAotCXUzMglmaWZvX3NpemVbM107CisJdTMyCWZpZm9fc2l6ZVtNQVhfRFNTX09WRVJMQVlTXTsKIAogCXNwaW5sb2NrX3QgaXJxX2xvY2s7CiAJdTMyIGlycV9lcnJvcl9tYXNrOwpAQCAtMTcxLDE3MyArMTcyLDk5IEBACiAKIHN0YXRpYyB2b2lkIGRpc3BjX3NhdmVfY29udGV4dCh2b2lkKQogewotCWludCBpOworCWludCBpLCBqOwogCiAJRFNTREJHKCJkaXNwY19zYXZlX2NvbnRleHRcbiIpOwogCiAJU1IoSVJRRU5BQkxFKTsKIAlTUihDT05UUk9MKTsKIAlTUihDT05GSUcpOwotCVNSKERFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlTUihERUZBVUxUX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpKTsKLQlTUihUUkFOU19DT0xPUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVNSKFRSQU5TX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpKTsKIAlTUihMSU5FX05VTUJFUik7Ci0JU1IoVElNSU5HX0goT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlTUihUSU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVNSKFBPTF9GUkVRKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JU1IoRElWSVNPUm8oT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRklYRURfWk9SREVSKSB8fAorCQkJZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRlJFRV9aT1JERVIpKQogCQlTUihHTE9CQUxfQUxQSEEpOwotCVNSKFNJWkVfTUdSKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpKTsKLQlTUihTSVpFX01HUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKIAkJU1IoQ09OVFJPTDIpOwotCQlTUihERUZBVUxUX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlTUihUUkFOU19DT0xPUihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJU1IoU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVNSKFRJTUlOR19IKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlTUihUSU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJU1IoUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVNSKERJVklTT1JvKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwogCQlTUihDT05GSUcyKTsKIAl9CiAKLQlTUihPVkxfQkEwKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9CQTEoT01BUF9EU1NfR0ZYKSk7Ci0JU1IoT1ZMX1BPU0lUSU9OKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9TSVpFKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9BVFRSSUJVVEVTKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9GSUZPX1RIUkVTSE9MRChPTUFQX0RTU19HRlgpKTsKLQlTUihPVkxfUk9XX0lOQyhPTUFQX0RTU19HRlgpKTsKLQlTUihPVkxfUElYRUxfSU5DKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9XSU5ET1dfU0tJUChPTUFQX0RTU19HRlgpKTsKLQlTUihPVkxfVEFCTEVfQkEoT01BUF9EU1NfR0ZYKSk7CisJZm9yIChpID0gMDsgaSA8IGRzc19mZWF0X2dldF9udW1fbWdycygpOyBpKyspIHsKKwkJU1IoREVGQVVMVF9DT0xPUihpKSk7CisJCVNSKFRSQU5TX0NPTE9SKGkpKTsKKwkJU1IoU0laRV9NR1IoaSkpOworCQlpZiAoaSA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQorCQkJY29udGludWU7CisJCVNSKFRJTUlOR19IKGkpKTsKKwkJU1IoVElNSU5HX1YoaSkpOworCQlTUihQT0xfRlJFUShpKSk7CisJCVNSKERJVklTT1JvKGkpKTsKIAotCVNSKERBVEFfQ1lDTEUxKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JU1IoREFUQV9DWUNMRTIoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlTUihEQVRBX0NZQ0xFMyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCQlTUihEQVRBX0NZQ0xFMShpKSk7CisJCVNSKERBVEFfQ1lDTEUyKGkpKTsKKwkJU1IoREFUQV9DWUNMRTMoaSkpOwogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NQUikpIHsKLQkJU1IoQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCQlTUihDUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JCVNSKENQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQl9Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgewogCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgewotCQkJU1IoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJCVNSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCQlTUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQkJU1IoQ1BSX0NPRUZfUihpKSk7CisJCQlTUihDUFJfQ09FRl9HKGkpKTsKKwkJCVNSKENQUl9DT0VGX0IoaSkpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRzc19mZWF0X2dldF9udW1fb3ZscygpOyBpKyspIHsKKwkJU1IoT1ZMX0JBMChpKSk7CisJCVNSKE9WTF9CQTEoaSkpOworCQlTUihPVkxfUE9TSVRJT04oaSkpOworCQlTUihPVkxfU0laRShpKSk7CisJCVNSKE9WTF9BVFRSSUJVVEVTKGkpKTsKKwkJU1IoT1ZMX0ZJRk9fVEhSRVNIT0xEKGkpKTsKKwkJU1IoT1ZMX1JPV19JTkMoaSkpOworCQlTUihPVkxfUElYRUxfSU5DKGkpKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQorCQkJU1IoT1ZMX1BSRUxPQUQoaSkpOworCQlpZiAoaSA9PSBPTUFQX0RTU19HRlgpIHsKKwkJCVNSKE9WTF9XSU5ET1dfU0tJUChpKSk7CisJCQlTUihPVkxfVEFCTEVfQkEoaSkpOworCQkJY29udGludWU7CisJCX0KKwkJU1IoT1ZMX0ZJUihpKSk7CisJCVNSKE9WTF9QSUNUVVJFX1NJWkUoaSkpOworCQlTUihPVkxfQUNDVTAoaSkpOworCQlTUihPVkxfQUNDVTEoaSkpOworCisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQlTUihPVkxfRklSX0NPRUZfSChpLCBqKSk7CisKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCVNSKE9WTF9GSVJfQ09FRl9IVihpLCBqKSk7CisKKwkJZm9yIChqID0gMDsgaiA8IDU7IGorKykKKwkJCVNSKE9WTF9DT05WX0NPRUYoaSwgaikpOworCisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9GSVJfQ09FRl9WKSkgeworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlTUihPVkxfRklSX0NPRUZfVihpLCBqKSk7CiAJCX0KIAotCQlTUihEQVRBX0NZQ0xFMShPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJU1IoREFUQV9DWUNMRTIoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVNSKERBVEFfQ1lDTEUzKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgeworCQkJU1IoT1ZMX0JBMF9VVihpKSk7CisJCQlTUihPVkxfQkExX1VWKGkpKTsKKwkJCVNSKE9WTF9GSVIyKGkpKTsKKwkJCVNSKE9WTF9BQ0NVMl8wKGkpKTsKKwkJCVNSKE9WTF9BQ0NVMl8xKGkpKTsKKworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlTUihPVkxfRklSX0NPRUZfSDIoaSwgaikpOworCisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCVNSKE9WTF9GSVJfQ09FRl9IVjIoaSwgaikpOworCisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCVNSKE9WTF9GSVJfQ09FRl9WMihpLCBqKSk7CisJCX0KKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FUVFIyKSkKKwkJCVNSKE9WTF9BVFRSSUJVVEVTMihpKSk7CiAJfQogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQotCQlTUihPVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKLQotCS8qIFZJRDEgKi8KLQlTUihPVkxfQkEwKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9CQTEoT01BUF9EU1NfVklERU8xKSk7Ci0JU1IoT1ZMX1BPU0lUSU9OKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9TSVpFKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9BVFRSSUJVVEVTKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9GSUZPX1RIUkVTSE9MRChPTUFQX0RTU19WSURFTzEpKTsKLQlTUihPVkxfUk9XX0lOQyhPTUFQX0RTU19WSURFTzEpKTsKLQlTUihPVkxfUElYRUxfSU5DKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9GSVIoT01BUF9EU1NfVklERU8xKSk7Ci0JU1IoT1ZMX1BJQ1RVUkVfU0laRShPTUFQX0RTU19WSURFTzEpKTsKLQlTUihPVkxfQUNDVTAoT01BUF9EU1NfVklERU8xKSk7Ci0JU1IoT1ZMX0FDQ1UxKE9NQVBfRFNTX1ZJREVPMSkpOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJU1IoT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8xLCBpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlTUihPVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8xLCBpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCQlTUihPVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgaSkpOwotCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlTUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIGkpKTsKLQl9Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgewotCQlTUihPVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlTUihPVkxfQkExX1VWKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlTUihPVkxfRklSMihPTUFQX0RTU19WSURFTzEpKTsKLQkJU1IoT1ZMX0FDQ1UyXzAoT01BUF9EU1NfVklERU8xKSk7Ci0JCVNSKE9WTF9BQ0NVMl8xKE9NQVBfRFNTX1ZJREVPMSkpOwotCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlTUihPVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8xLCBpKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVNSKE9WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8xLCBpKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVNSKE9WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzEsIGkpKTsKLQl9Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FUVFIyKSkKLQkJU1IoT1ZMX0FUVFJJQlVURVMyKE9NQVBfRFNTX1ZJREVPMSkpOwotCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQotCQlTUihPVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzEpKTsKLQotCS8qIFZJRDIgKi8KLQlTUihPVkxfQkEwKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9CQTEoT01BUF9EU1NfVklERU8yKSk7Ci0JU1IoT1ZMX1BPU0lUSU9OKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9TSVpFKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9BVFRSSUJVVEVTKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9GSUZPX1RIUkVTSE9MRChPTUFQX0RTU19WSURFTzIpKTsKLQlTUihPVkxfUk9XX0lOQyhPTUFQX0RTU19WSURFTzIpKTsKLQlTUihPVkxfUElYRUxfSU5DKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9GSVIoT01BUF9EU1NfVklERU8yKSk7Ci0JU1IoT1ZMX1BJQ1RVUkVfU0laRShPTUFQX0RTU19WSURFTzIpKTsKLQlTUihPVkxfQUNDVTAoT01BUF9EU1NfVklERU8yKSk7Ci0JU1IoT1ZMX0FDQ1UxKE9NQVBfRFNTX1ZJREVPMikpOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJU1IoT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlTUihPVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCQlTUihPVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgaSkpOwotCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlTUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQl9Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgewotCQlTUihPVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMikpOwotCQlTUihPVkxfQkExX1VWKE9NQVBfRFNTX1ZJREVPMikpOwotCQlTUihPVkxfRklSMihPTUFQX0RTU19WSURFTzIpKTsKLQkJU1IoT1ZMX0FDQ1UyXzAoT01BUF9EU1NfVklERU8yKSk7Ci0JCVNSKE9WTF9BQ0NVMl8xKE9NQVBfRFNTX1ZJREVPMikpOwotCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlTUihPVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVNSKE9WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVNSKE9WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQl9Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FUVFIyKSkKLQkJU1IoT1ZMX0FUVFJJQlVURVMyKE9NQVBfRFNTX1ZJREVPMikpOwotCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQotCQlTUihPVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzIpKTsKLQogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DT1JFX0NMS19ESVYpKQogCQlTUihESVZJU09SKTsKIApAQCAtMzQ5LDcgKzI3Niw3IEBACiAKIHN0YXRpYyB2b2lkIGRpc3BjX3Jlc3RvcmVfY29udGV4dCh2b2lkKQogewotCWludCBpLCBjdHg7CisJaW50IGksIGosIGN0eDsKIAogCURTU0RCRygiZGlzcGNfcmVzdG9yZV9jb250ZXh0XG4iKTsKIApAQCAtMzY3LDE2NiArMjk0LDkwIEBACiAJLypSUihJUlFFTkFCTEUpOyovCiAJLypSUihDT05UUk9MKTsqLwogCVJSKENPTkZJRyk7Ci0JUlIoREVGQVVMVF9DT0xPUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVJSKERFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwotCVJSKFRSQU5TX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JUlIoVFJBTlNfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwogCVJSKExJTkVfTlVNQkVSKTsKLQlSUihUSU1JTkdfSChPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVJSKFRJTUlOR19WKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JUlIoUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlSUihESVZJU09SbyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQorCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIpIHx8CisJCQlkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BTFBIQV9GUkVFX1pPUkRFUikpCiAJCVJSKEdMT0JBTF9BTFBIQSk7Ci0JUlIoU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwotCVJSKFNJWkVfTUdSKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgewotCQlSUihERUZBVUxUX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlSUihUUkFOU19DT0xPUihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJUlIoU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVJSKFRJTUlOR19IKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlSUihUSU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJUlIoUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVJSKERJVklTT1JvKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpCiAJCVJSKENPTkZJRzIpOwotCX0KIAotCVJSKE9WTF9CQTAoT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX0JBMShPTUFQX0RTU19HRlgpKTsKLQlSUihPVkxfUE9TSVRJT04oT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX1NJWkUoT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX0ZJRk9fVEhSRVNIT0xEKE9NQVBfRFNTX0dGWCkpOwotCVJSKE9WTF9ST1dfSU5DKE9NQVBfRFNTX0dGWCkpOwotCVJSKE9WTF9QSVhFTF9JTkMoT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX1dJTkRPV19TS0lQKE9NQVBfRFNTX0dGWCkpOwotCVJSKE9WTF9UQUJMRV9CQShPTUFQX0RTU19HRlgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZHNzX2ZlYXRfZ2V0X251bV9tZ3JzKCk7IGkrKykgeworCQlSUihERUZBVUxUX0NPTE9SKGkpKTsKKwkJUlIoVFJBTlNfQ09MT1IoaSkpOworCQlSUihTSVpFX01HUihpKSk7CisJCWlmIChpID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCisJCQljb250aW51ZTsKKwkJUlIoVElNSU5HX0goaSkpOworCQlSUihUSU1JTkdfVihpKSk7CisJCVJSKFBPTF9GUkVRKGkpKTsKKwkJUlIoRElWSVNPUm8oaSkpOwogCi0KLQlSUihEQVRBX0NZQ0xFMShPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVJSKERBVEFfQ1lDTEUyKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JUlIoREFUQV9DWUNMRTMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKSB7Ci0JCVJSKENQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQkJUlIoQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCQlSUihDUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JfQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKLQkJUlIoREFUQV9DWUNMRTEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVJSKERBVEFfQ1lDTEUyKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlSUihEQVRBX0NZQ0xFMyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKKwkJUlIoREFUQV9DWUNMRTEoaSkpOworCQlSUihEQVRBX0NZQ0xFMihpKSk7CisJCVJSKERBVEFfQ1lDTEUzKGkpKTsKIAogCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgewotCQkJUlIoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJCVJSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCQlSUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQkJUlIoQ1BSX0NPRUZfUihpKSk7CisJCQlSUihDUFJfQ09FRl9HKGkpKTsKKwkJCVJSKENQUl9DT0VGX0IoaSkpOwogCQl9CiAJfQogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQotCQlSUihPVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCk7IGkrKykgeworCQlSUihPVkxfQkEwKGkpKTsKKwkJUlIoT1ZMX0JBMShpKSk7CisJCVJSKE9WTF9QT1NJVElPTihpKSk7CisJCVJSKE9WTF9TSVpFKGkpKTsKKwkJUlIoT1ZMX0FUVFJJQlVURVMoaSkpOworCQlSUihPVkxfRklGT19USFJFU0hPTEQoaSkpOworCQlSUihPVkxfUk9XX0lOQyhpKSk7CisJCVJSKE9WTF9QSVhFTF9JTkMoaSkpOworCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCisJCQlSUihPVkxfUFJFTE9BRChpKSk7CisJCWlmIChpID09IE9NQVBfRFNTX0dGWCkgeworCQkJUlIoT1ZMX1dJTkRPV19TS0lQKGkpKTsKKwkJCVJSKE9WTF9UQUJMRV9CQShpKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlSUihPVkxfRklSKGkpKTsKKwkJUlIoT1ZMX1BJQ1RVUkVfU0laRShpKSk7CisJCVJSKE9WTF9BQ0NVMChpKSk7CisJCVJSKE9WTF9BQ0NVMShpKSk7CiAKLQkvKiBWSUQxICovCi0JUlIoT1ZMX0JBMChPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfQkExKE9NQVBfRFNTX1ZJREVPMSkpOwotCVJSKE9WTF9QT1NJVElPTihPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfU0laRShPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfQVRUUklCVVRFUyhPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfRklGT19USFJFU0hPTEQoT01BUF9EU1NfVklERU8xKSk7Ci0JUlIoT1ZMX1JPV19JTkMoT01BUF9EU1NfVklERU8xKSk7Ci0JUlIoT1ZMX1BJWEVMX0lOQyhPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfRklSKE9NQVBfRFNTX1ZJREVPMSkpOwotCVJSKE9WTF9QSUNUVVJFX1NJWkUoT01BUF9EU1NfVklERU8xKSk7Ci0JUlIoT1ZMX0FDQ1UwKE9NQVBfRFNTX1ZJREVPMSkpOwotCVJSKE9WTF9BQ0NVMShPTUFQX0RTU19WSURFTzEpKTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCVJSKE9WTF9GSVJfQ09FRl9IKGksIGopKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCVJSKE9WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMSwgaSkpOworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJUlIoT1ZMX0ZJUl9DT0VGX0hWKGksIGopKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCVJSKE9WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIGkpKTsKKwkJZm9yIChqID0gMDsgaiA8IDU7IGorKykKKwkJCVJSKE9WTF9DT05WX0NPRUYoaSwgaikpOwogCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJUlIoT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIGkpKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCVJSKE9WTF9GSVJfQ09FRl9WKGksIGopKTsKKwkJfQogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlSUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIGkpKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSkpIHsKKwkJCVJSKE9WTF9CQTBfVVYoaSkpOworCQkJUlIoT1ZMX0JBMV9VVihpKSk7CisJCQlSUihPVkxfRklSMihpKSk7CisJCQlSUihPVkxfQUNDVTJfMChpKSk7CisJCQlSUihPVkxfQUNDVTJfMShpKSk7CisKKwkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQkJUlIoT1ZMX0ZJUl9DT0VGX0gyKGksIGopKTsKKworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlSUihPVkxfRklSX0NPRUZfSFYyKGksIGopKTsKKworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlSUihPVkxfRklSX0NPRUZfVjIoaSwgaikpOworCQl9CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCisJCQlSUihPVkxfQVRUUklCVVRFUzIoaSkpOwogCX0KIAotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7Ci0JCVJSKE9WTF9CQTBfVVYoT01BUF9EU1NfVklERU8xKSk7Ci0JCVJSKE9WTF9CQTFfVVYoT01BUF9EU1NfVklERU8xKSk7Ci0JCVJSKE9WTF9GSVIyKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlSUihPVkxfQUNDVTJfMChPTUFQX0RTU19WSURFTzEpKTsKLQkJUlIoT1ZMX0FDQ1UyXzEoT01BUF9EU1NfVklERU8xKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVJSKE9WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzEsIGkpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJUlIoT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzEsIGkpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJUlIoT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMSwgaSkpOwotCX0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQVRUUjIpKQotCQlSUihPVkxfQVRUUklCVVRFUzIoT01BUF9EU1NfVklERU8xKSk7Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCi0JCVJSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMSkpOwotCi0JLyogVklEMiAqLwotCVJSKE9WTF9CQTAoT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX0JBMShPTUFQX0RTU19WSURFTzIpKTsKLQlSUihPVkxfUE9TSVRJT04oT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX1NJWkUoT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX0ZJRk9fVEhSRVNIT0xEKE9NQVBfRFNTX1ZJREVPMikpOwotCVJSKE9WTF9ST1dfSU5DKE9NQVBfRFNTX1ZJREVPMikpOwotCVJSKE9WTF9QSVhFTF9JTkMoT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX0ZJUihPTUFQX0RTU19WSURFTzIpKTsKLQlSUihPVkxfUElDVFVSRV9TSVpFKE9NQVBfRFNTX1ZJREVPMikpOwotCVJSKE9WTF9BQ0NVMChPTUFQX0RTU19WSURFTzIpKTsKLQlSUihPVkxfQUNDVTEoT01BUF9EU1NfVklERU8yKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlSUihPVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzIsIGkpKTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCVJSKE9WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCVJSKE9WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRklSX0NPRUZfVikpIHsKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVJSKE9WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgaSkpOwotCX0KLQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7Ci0JCVJSKE9WTF9CQTBfVVYoT01BUF9EU1NfVklERU8yKSk7Ci0JCVJSKE9WTF9CQTFfVVYoT01BUF9EU1NfVklERU8yKSk7Ci0JCVJSKE9WTF9GSVIyKE9NQVBfRFNTX1ZJREVPMikpOwotCQlSUihPVkxfQUNDVTJfMChPTUFQX0RTU19WSURFTzIpKTsKLQkJUlIoT1ZMX0FDQ1UyXzEoT01BUF9EU1NfVklERU8yKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVJSKE9WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJUlIoT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJUlIoT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMiwgaSkpOwotCX0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQVRUUjIpKQotCQlSUihPVkxfQVRUUklCVVRFUzIoT01BUF9EU1NfVklERU8yKSk7Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCi0JCVJSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOwotCiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NPUkVfQ0xLX0RJVikpCiAJCVJSKERJVklTT1IpOwogCkBAIC01NzAsMTMgKzQyMSwyOCBAQAogCVdBUk5fT04ociA8IDApOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgZGlzcGNfbWdyX2lzX2xjZChlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQoreworCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEIHx8CisJCQljaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CiAKLWJvb2wgZGlzcGNfZ29fYnVzeShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQorc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BjX21ncl9nZXRfZGV2aWNlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCit7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IgPQorCQlvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGNoYW5uZWwpOworCisJcmV0dXJuIG1nciA/IG1nci0+ZGV2aWNlIDogTlVMTDsKK30KKworYm9vbCBkaXNwY19tZ3JfZ29fYnVzeShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewogCWludCBiaXQ7CiAKLQlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCB8fAotCQkJY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCisJaWYgKGRpc3BjX21ncl9pc19sY2QoY2hhbm5lbCkpCiAJCWJpdCA9IDU7IC8qIEdPTENEICovCiAJZWxzZQogCQliaXQgPSA2OyAvKiBHT0RJR0lUICovCkBAIC01ODcsMTMgKzQ1MywxMiBAQAogCQlyZXR1cm4gUkVHX0dFVChESVNQQ19DT05UUk9MLCBiaXQsIGJpdCkgPT0gMTsKIH0KIAotdm9pZCBkaXNwY19nbyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQordm9pZCBkaXNwY19tZ3JfZ28oZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKIAlpbnQgYml0OwogCWJvb2wgZW5hYmxlX2JpdCwgZ29fYml0OwogCi0JaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgfHwKLQkJCWNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCWlmIChkaXNwY19tZ3JfaXNfbGNkKGNoYW5uZWwpKQogCQliaXQgPSAwOyAvKiBMQ0RFTkFCTEUgKi8KIAllbHNlCiAJCWJpdCA9IDE7IC8qIERJR0lUQUxFTkFCTEUgKi8KQEAgLTYwNyw4ICs0NzIsNyBAQAogCWlmICghZW5hYmxlX2JpdCkKIAkJcmV0dXJuOwogCi0JaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgfHwKLQkJCWNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCWlmIChkaXNwY19tZ3JfaXNfbGNkKGNoYW5uZWwpKQogCQliaXQgPSA1OyAvKiBHT0xDRCAqLwogCWVsc2UKIAkJYml0ID0gNjsgLyogR09ESUdJVCAqLwpAQCAtNjMyLDQzICs0OTYsNDQgQEAKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgMSwgYml0LCBiaXQpOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfd3JpdGVfZmlyaF9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfd3JpdGVfZmlyaF9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCiB7CiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9GSVJfQ09FRl9IKHBsYW5lLCByZWcpLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY193cml0ZV9maXJodl9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfd3JpdGVfZmlyaHZfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQogewogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfRklSX0NPRUZfSFYocGxhbmUsIHJlZyksIHZhbHVlKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3dyaXRlX2ZpcnZfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3dyaXRlX2ZpcnZfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQogewogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfRklSX0NPRUZfVihwbGFuZSwgcmVnKSwgdmFsdWUpOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfd3JpdGVfZmlyaDJfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3dyaXRlX2ZpcmgyX3JlZyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCByZWcsIHUzMiB2YWx1ZSkKIHsKIAlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKIAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfRklSX0NPRUZfSDIocGxhbmUsIHJlZyksIHZhbHVlKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3dyaXRlX2Zpcmh2Ml9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfd3JpdGVfZmlyaHYyX3JlZyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCByZWcsCisJCXUzMiB2YWx1ZSkKIHsKIAlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKIAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKHBsYW5lLCByZWcpLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY193cml0ZV9maXJ2Ml9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfd3JpdGVfZmlydjJfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQogewogCUJVR19PTihwbGFuZSA9PSBPTUFQX0RTU19HRlgpOwogCiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9GSVJfQ09FRl9WMihwbGFuZSwgcmVnKSwgdmFsdWUpOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3NjYWxlX2NvZWYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaHNjYWxldXAsCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3NjYWxlX2NvZWYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaHNjYWxldXAsCiAJCQkJICBpbnQgdnNjYWxldXAsIGludCBmaXZlX3RhcHMsCiAJCQkJICBlbnVtIG9tYXBfY29sb3JfY29tcG9uZW50IGNvbG9yX2NvbXApCiB7CkBAIC03NjksMTEgKzYzNCwxMSBAQAogCQkJfCBGTERfVkFMKHZfY29lZltpXS52YzIsIDMxLCAyNCk7CiAKIAkJaWYgKGNvbG9yX2NvbXAgPT0gRElTUENfQ09MT1JfQ09NUE9ORU5UX1JHQl9ZKSB7Ci0JCQlfZGlzcGNfd3JpdGVfZmlyaF9yZWcocGxhbmUsIGksIGgpOwotCQkJX2Rpc3BjX3dyaXRlX2Zpcmh2X3JlZyhwbGFuZSwgaSwgaHYpOworCQkJZGlzcGNfb3ZsX3dyaXRlX2ZpcmhfcmVnKHBsYW5lLCBpLCBoKTsKKwkJCWRpc3BjX292bF93cml0ZV9maXJodl9yZWcocGxhbmUsIGksIGh2KTsKIAkJfSBlbHNlIHsKLQkJCV9kaXNwY193cml0ZV9maXJoMl9yZWcocGxhbmUsIGksIGgpOwotCQkJX2Rpc3BjX3dyaXRlX2Zpcmh2Ml9yZWcocGxhbmUsIGksIGh2KTsKKwkJCWRpc3BjX292bF93cml0ZV9maXJoMl9yZWcocGxhbmUsIGksIGgpOworCQkJZGlzcGNfb3ZsX3dyaXRlX2Zpcmh2Ml9yZWcocGxhbmUsIGksIGh2KTsKIAkJfQogCiAJfQpAQCAtNzg0LDE1ICs2NDksMTYgQEAKIAkJCXYgPSBGTERfVkFMKHZfY29lZltpXS52YzAwLCA3LCAwKQogCQkJCXwgRkxEX1ZBTCh2X2NvZWZbaV0udmMyMiwgMTUsIDgpOwogCQkJaWYgKGNvbG9yX2NvbXAgPT0gRElTUENfQ09MT1JfQ09NUE9ORU5UX1JHQl9ZKQotCQkJCV9kaXNwY193cml0ZV9maXJ2X3JlZyhwbGFuZSwgaSwgdik7CisJCQkJZGlzcGNfb3ZsX3dyaXRlX2ZpcnZfcmVnKHBsYW5lLCBpLCB2KTsKIAkJCWVsc2UKLQkJCQlfZGlzcGNfd3JpdGVfZmlydjJfcmVnKHBsYW5lLCBpLCB2KTsKKwkJCQlkaXNwY19vdmxfd3JpdGVfZmlydjJfcmVnKHBsYW5lLCBpLCB2KTsKIAkJfQogCX0KIH0KIAogc3RhdGljIHZvaWQgX2Rpc3BjX3NldHVwX2NvbG9yX2NvbnZfY29lZih2b2lkKQogeworCWludCBpOwogCWNvbnN0IHN0cnVjdCBjb2xvcl9jb252X2NvZWYgewogCQlpbnQgIHJ5LCAgcmNyLCAgcmNiLCAgIGd5LCAgZ2NyLCAgZ2NiLCAgIGJ5LCAgYmNyLCAgYmNiOwogCQlpbnQgIGZ1bGxfcmFuZ2U7CkBAIC04MDYsNjUgKzY3Miw1NCBAQAogCiAJY3QgPSAmY3RibF9idDYwMV81OwogCi0JZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8xLCAwKSwKLQkJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDEpLAotCQlDVkFMKGN0LT5neSwgIGN0LT5yY2IpKTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDIpLAotCQlDVkFMKGN0LT5nY2IsIGN0LT5nY3IpKTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDMpLAotCQlDVkFMKGN0LT5iY3IsIGN0LT5ieSkpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgNCksCi0JCUNWQUwoMCwgY3QtPmJjYikpOworCWZvciAoaSA9IDE7IGkgPCBkc3NfZmVhdF9nZXRfbnVtX292bHMoKTsgaSsrKSB7CisJCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQ09OVl9DT0VGKGksIDApLAorCQkJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKKwkJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoaSwgMSksCisJCQlDVkFMKGN0LT5neSwgIGN0LT5yY2IpKTsKKwkJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoaSwgMiksCisJCQlDVkFMKGN0LT5nY2IsIGN0LT5nY3IpKTsKKwkJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoaSwgMyksCisJCQlDVkFMKGN0LT5iY3IsIGN0LT5ieSkpOworCQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihpLCA0KSwKKwkJCUNWQUwoMCwgY3QtPmJjYikpOwogCi0JZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCAwKSwKLQkJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzIsIDEpLAotCQlDVkFMKGN0LT5neSwgY3QtPnJjYikpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMiksCi0JCUNWQUwoY3QtPmdjYiwgY3QtPmdjcikpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMyksCi0JCUNWQUwoY3QtPmJjciwgY3QtPmJ5KSk7Ci0JZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCA0KSwKLQkJQ1ZBTCgwLCBjdC0+YmNiKSk7CisJCVJFR19GTERfTU9EKERJU1BDX09WTF9BVFRSSUJVVEVTKGkpLCBjdC0+ZnVsbF9yYW5nZSwKKwkJCTExLCAxMSk7CisJfQogCiAjdW5kZWYgQ1ZBTAotCi0JUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfVklERU8xKSwKLQkJY3QtPmZ1bGxfcmFuZ2UsIDExLCAxMSk7Ci0JUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfVklERU8yKSwKLQkJY3QtPmZ1bGxfcmFuZ2UsIDExLCAxMSk7CiB9CiAKIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9iYTAoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2JhMChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcikKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0JBMChwbGFuZSksIHBhZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9iYTEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2JhMShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcikKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0JBMShwbGFuZSksIHBhZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9iYTBfdXYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2JhMF91dihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcikKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0JBMF9VVihwbGFuZSksIHBhZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9iYTFfdXYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2JhMV91dihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcikKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0JBMV9VVihwbGFuZSksIHBhZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9wb3MoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgeCwgaW50IHkpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3BvcyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCB4LCBpbnQgeSkKIHsKIAl1MzIgdmFsID0gRkxEX1ZBTCh5LCAyNiwgMTYpIHwgRkxEX1ZBTCh4LCAxMCwgMCk7CiAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX1BPU0lUSU9OKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9waWNfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfcGljX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7CiAJdTMyIHZhbCA9IEZMRF9WQUwoaGVpZ2h0IC0gMSwgMjYsIDE2KSB8IEZMRF9WQUwod2lkdGggLSAxLCAxMCwgMCk7CiAKQEAgLTg3NCw3ICs3MjksNyBAQAogCQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX1BJQ1RVUkVfU0laRShwbGFuZSksIHZhbCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfdmlkX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3ZpZF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogCXUzMiB2YWw7CiAKQEAgLTg4NSw0NCArNzQwLDYxIEBACiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9TSVpFKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wcmVfbXVsdF9hbHBoYShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF96b3JkZXIoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCB6b3JkZXIpCiB7Ci0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVfTVVMVF9BTFBIQSkpCisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkocGxhbmUpOworCisJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUikgPT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEFfVklEMSkgJiYKLQkJcGxhbmUgPT0gT01BUF9EU1NfVklERU8xKQorCVJFR19GTERfTU9EKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSwgem9yZGVyLCAyNywgMjYpOworfQorCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfZW5hYmxlX3pvcmRlcl9wbGFuZXModm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRlJFRV9aT1JERVIpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCk7IGkrKykKKwkJUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMoaSksIDEsIDI1LCAyNSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfcHJlX211bHRfYWxwaGEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShwbGFuZSk7CisKKwlpZiAoKG92bC0+Y2FwcyAmIE9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEpID09IDApCiAJCXJldHVybjsKIAogCVJFR19GTERfTU9EKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSwgZW5hYmxlID8gMSA6IDAsIDI4LCAyOCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXR1cF9nbG9iYWxfYWxwaGEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCBnbG9iYWxfYWxwaGEpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0dXBfZ2xvYmFsX2FscGhhKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTggZ2xvYmFsX2FscGhhKQogewotCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hpZnRzW10gPSB7IDAsIDgsIDE2LCAyNCwgfTsKKwlpbnQgc2hpZnQ7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkocGxhbmUpOworCisJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSkgPT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEFfVklEMSkgJiYKLQkJcGxhbmUgPT0gT01BUF9EU1NfVklERU8xKQotCQlyZXR1cm47Ci0KLQlpZiAocGxhbmUgPT0gT01BUF9EU1NfR0ZYKQotCQlSRUdfRkxEX01PRChESVNQQ19HTE9CQUxfQUxQSEEsIGdsb2JhbF9hbHBoYSwgNywgMCk7Ci0JZWxzZSBpZiAocGxhbmUgPT0gT01BUF9EU1NfVklERU8yKQotCQlSRUdfRkxEX01PRChESVNQQ19HTE9CQUxfQUxQSEEsIGdsb2JhbF9hbHBoYSwgMjMsIDE2KTsKKwlzaGlmdCA9IHNoaWZ0c1twbGFuZV07CisJUkVHX0ZMRF9NT0QoRElTUENfR0xPQkFMX0FMUEhBLCBnbG9iYWxfYWxwaGEsIHNoaWZ0ICsgNywgc2hpZnQpOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3BpeF9pbmMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBzMzIgaW5jKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF9waXhfaW5jKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgczMyIGluYykKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX1BJWEVMX0lOQyhwbGFuZSksIGluYyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfcm93X2luYyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHMzMiBpbmMpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3Jvd19pbmMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBzMzIgaW5jKQogewogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfUk9XX0lOQyhwbGFuZSksIGluYyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfY29sb3JfbW9kZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2NvbG9yX21vZGUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAogCQllbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlKQogewogCXUzMiBtID0gMDsKQEAgLTEwMDMsNyArODc1LDcgQEAKIAlSRUdfRkxEX01PRChESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIG0sIDQsIDEpOwogfQogCi12b2lkIGRpc3BjX3NldF9jaGFubmVsX291dChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2NoYW5uZWxfb3V0KGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKIAlpbnQgc2hpZnQ7CkBAIC0xMDE2LDYgKzg4OCw3IEBACiAJCWJyZWFrOwogCWNhc2UgT01BUF9EU1NfVklERU8xOgogCWNhc2UgT01BUF9EU1NfVklERU8yOgorCWNhc2UgT01BUF9EU1NfVklERU8zOgogCQlzaGlmdCA9IDE2OwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTA1MCwyNCArOTIzLDEzIEBACiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgZGlzcGNfc2V0X2J1cnN0X3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF9idXJzdF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2J1cnN0X3NpemUgYnVyc3Rfc2l6ZSkKIHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hpZnRzW10gPSB7IDYsIDE0LCAxNCwgMTQsIH07CiAJaW50IHNoaWZ0OwogCi0Jc3dpdGNoIChwbGFuZSkgewotCWNhc2UgT01BUF9EU1NfR0ZYOgotCQlzaGlmdCA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgT01BUF9EU1NfVklERU8xOgotCWNhc2UgT01BUF9EU1NfVklERU8yOgotCQlzaGlmdCA9IDE0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJcmV0dXJuOwotCX0KLQorCXNoaWZ0ID0gc2hpZnRzW3BsYW5lXTsKIAlSRUdfRkxEX01PRChESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIGJ1cnN0X3NpemUsIHNoaWZ0ICsgMSwgc2hpZnQpOwogfQogCkBAIC0xMDc4LDEwICs5NDAsMTAgQEAKIAogCS8qIENvbmZpZ3VyZSBidXJzdCBzaXplIGFsd2F5cyB0byBtYXhpbXVtIHNpemUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5cygpOyArK2kpCi0JCWRpc3BjX3NldF9idXJzdF9zaXplKGksIGJ1cnN0X3NpemUpOworCQlkaXNwY19vdmxfc2V0X2J1cnN0X3NpemUoaSwgYnVyc3Rfc2l6ZSk7CiB9CiAKLXUzMiBkaXNwY19nZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpCit1MzIgZGlzcGNfb3ZsX2dldF9idXJzdF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSkKIHsKIAl1bnNpZ25lZCB1bml0ID0gZHNzX2ZlYXRfZ2V0X2J1cnN0X3NpemVfdW5pdCgpOwogCS8qIGJ1cnN0IG11bHRpcGxpZXIgaXMgYWx3YXlzIHg4IChzZWUgZGlzcGNfY29uZmlndXJlX2J1cnN0X3NpemVzKCkpICovCkBAIC0xMTAyLDcgKzk2NCw3IEBACiAJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUsIDksIDkpOwogfQogCi12b2lkIGRpc3BjX2VuYWJsZV9jcHIoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCit2b2lkIGRpc3BjX21ncl9lbmFibGVfY3ByKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQogewogCXUxNiByZWc7CiAKQEAgLTExMTYsMTIgKzk3OCwxMiBAQAogCVJFR19GTERfTU9EKHJlZywgZW5hYmxlLCAxNSwgMTUpOwogfQogCi12b2lkIGRpc3BjX3NldF9jcHJfY29lZihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAordm9pZCBkaXNwY19tZ3Jfc2V0X2Nwcl9jb2VmKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCiAJCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgKmNvZWZzKQogewogCXUzMiBjb2VmX3IsIGNvZWZfZywgY29lZl9iOwogCi0JaWYgKGNoYW5uZWwgIT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgJiYgY2hhbm5lbCAhPSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCisJaWYgKCFkaXNwY19tZ3JfaXNfbGNkKGNoYW5uZWwpKQogCQlyZXR1cm47CiAKIAljb2VmX3IgPSBGTERfVkFMKGNvZWZzLT5yciwgMzEsIDIyKSB8IEZMRF9WQUwoY29lZnMtPnJnLCAyMCwgMTEpIHwKQEAgLTExMzYsNyArOTk4LDcgQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfQ1BSX0NPRUZfQihjaGFubmVsKSwgY29lZl9iKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfY29sb3JfY29udihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF92aWRfY29sb3JfY29udihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQogewogCXUzMiB2YWw7CiAKQEAgLTExNDcsMTkgKzEwMDksMTYgQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCB2YWwpOwogfQogCi12b2lkIGRpc3BjX2VuYWJsZV9yZXBsaWNhdGlvbihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX2VuYWJsZV9yZXBsaWNhdGlvbihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQogewotCWludCBiaXQ7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNoaWZ0c1tdID0geyA1LCAxMCwgMTAsIDEwIH07CisJaW50IHNoaWZ0OwogCi0JaWYgKHBsYW5lID09IE9NQVBfRFNTX0dGWCkKLQkJYml0ID0gNTsKLQllbHNlCi0JCWJpdCA9IDEwOwotCi0JUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCBlbmFibGUsIGJpdCwgYml0KTsKKwlzaGlmdCA9IHNoaWZ0c1twbGFuZV07CisJUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCBlbmFibGUsIHNoaWZ0LCBzaGlmdCk7CiB9CiAKLXZvaWQgZGlzcGNfc2V0X2xjZF9zaXplKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUxNiB3aWR0aCwgdTE2IGhlaWdodCkKK3ZvaWQgZGlzcGNfbWdyX3NldF9sY2Rfc2l6ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpCiB7CiAJdTMyIHZhbDsKIAlCVUdfT04oKHdpZHRoID4gKDEgPDwgMTEpKSB8fCAoaGVpZ2h0ID4gKDEgPDwgMTEpKSk7CkBAIC0xMTg2LDE5ICsxMDQ1LDIwIEBACiAKIAlkc3NfZmVhdF9nZXRfcmVnX2ZpZWxkKEZFQVRfUkVHX0ZJRk9TSVpFLCAmc3RhcnQsICZlbmQpOwogCi0JZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgQVJSQVlfU0laRShkaXNwYy5maWZvX3NpemUpOyArK3BsYW5lKSB7CisJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCk7ICsrcGxhbmUpIHsKIAkJc2l6ZSA9IFJFR19HRVQoRElTUENfT1ZMX0ZJRk9fU0laRV9TVEFUVVMocGxhbmUpLCBzdGFydCwgZW5kKTsKIAkJc2l6ZSAqPSB1bml0OwogCQlkaXNwYy5maWZvX3NpemVbcGxhbmVdID0gc2l6ZTsKIAl9CiB9CiAKLXUzMiBkaXNwY19nZXRfcGxhbmVfZmlmb19zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSkKK3UzMiBkaXNwY19vdmxfZ2V0X2ZpZm9fc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpCiB7CiAJcmV0dXJuIGRpc3BjLmZpZm9fc2l6ZVtwbGFuZV07CiB9CiAKLXZvaWQgZGlzcGNfc2V0X2ZpZm9fdGhyZXNob2xkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywgdTMyIGhpZ2gpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2ZpZm9fdGhyZXNob2xkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywKKwkJdTMyIGhpZ2gpCiB7CiAJdTggaGlfc3RhcnQsIGhpX2VuZCwgbG9fc3RhcnQsIGxvX2VuZDsKIAl1MzIgdW5pdDsKQEAgLTEyMzMsNyArMTA5Myw3IEBACiAJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUgPyAxIDogMCwgMTQsIDE0KTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9maXIoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF9maXIoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAogCQkJCWludCBoaW5jLCBpbnQgdmluYywKIAkJCQllbnVtIG9tYXBfY29sb3JfY29tcG9uZW50IGNvbG9yX2NvbXApCiB7CkBAIC0xMjU2LDcgKzExMTYsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTAoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaGFjY3UsIGludCB2YWNjdSkKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfdmlkX2FjY3UwKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IGhhY2N1LCBpbnQgdmFjY3UpCiB7CiAJdTMyIHZhbDsKIAl1OCBob3Jfc3RhcnQsIGhvcl9lbmQsIHZlcnRfc3RhcnQsIHZlcnRfZW5kOwpAQCAtMTI3MCw3ICsxMTMwLDcgQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0FDQ1UwKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaGFjY3UsIGludCB2YWNjdSkKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfdmlkX2FjY3UxKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IGhhY2N1LCBpbnQgdmFjY3UpCiB7CiAJdTMyIHZhbDsKIAl1OCBob3Jfc3RhcnQsIGhvcl9lbmQsIHZlcnRfc3RhcnQsIHZlcnRfZW5kOwpAQCAtMTI4NCw3ICsxMTQ0LDggQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0FDQ1UxKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTJfMChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCBoYWNjdSwgaW50IHZhY2N1KQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF92aWRfYWNjdTJfMChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCBoYWNjdSwKKwkJaW50IHZhY2N1KQogewogCXUzMiB2YWw7CiAKQEAgLTEyOTIsNyArMTE1Myw4IEBACiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9BQ0NVMl8wKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTJfMShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCBoYWNjdSwgaW50IHZhY2N1KQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF92aWRfYWNjdTJfMShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCBoYWNjdSwKKwkJaW50IHZhY2N1KQogewogCXUzMiB2YWw7CiAKQEAgLTEzMDAsNyArMTE2Miw3IEBACiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9BQ0NVMl8xKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9zY2FsZV9wYXJhbShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3NjYWxlX3BhcmFtKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJdTE2IG9yaWdfd2lkdGgsIHUxNiBvcmlnX2hlaWdodCwKIAkJdTE2IG91dF93aWR0aCwgdTE2IG91dF9oZWlnaHQsCiAJCWJvb2wgZml2ZV90YXBzLCB1OCByb3RhdGlvbiwKQEAgLTEzMTIsMTUgKzExNzQsMTYgQEAKIAloc2NhbGV1cCA9IG9yaWdfd2lkdGggPD0gb3V0X3dpZHRoOwogCXZzY2FsZXVwID0gb3JpZ19oZWlnaHQgPD0gb3V0X2hlaWdodDsKIAotCV9kaXNwY19zZXRfc2NhbGVfY29lZihwbGFuZSwgaHNjYWxldXAsIHZzY2FsZXVwLCBmaXZlX3RhcHMsIGNvbG9yX2NvbXApOworCWRpc3BjX292bF9zZXRfc2NhbGVfY29lZihwbGFuZSwgaHNjYWxldXAsIHZzY2FsZXVwLCBmaXZlX3RhcHMsCisJCQljb2xvcl9jb21wKTsKIAogCWZpcl9oaW5jID0gMTAyNCAqIG9yaWdfd2lkdGggLyBvdXRfd2lkdGg7CiAJZmlyX3ZpbmMgPSAxMDI0ICogb3JpZ19oZWlnaHQgLyBvdXRfaGVpZ2h0OwogCi0JX2Rpc3BjX3NldF9maXIocGxhbmUsIGZpcl9oaW5jLCBmaXJfdmluYywgY29sb3JfY29tcCk7CisJZGlzcGNfb3ZsX3NldF9maXIocGxhbmUsIGZpcl9oaW5jLCBmaXJfdmluYywgY29sb3JfY29tcCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfc2NhbGluZ19jb21tb24oZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF9zY2FsaW5nX2NvbW1vbihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCiAJCXUxNiBvcmlnX3dpZHRoLCB1MTYgb3JpZ19oZWlnaHQsCiAJCXUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAogCQlib29sIGlsYWNlLCBib29sIGZpdmVfdGFwcywKQEAgLTEzMzEsNyArMTE5NCw3IEBACiAJaW50IGFjY3UxID0gMDsKIAl1MzIgbDsKIAotCV9kaXNwY19zZXRfc2NhbGVfcGFyYW0ocGxhbmUsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LAorCWRpc3BjX292bF9zZXRfc2NhbGVfcGFyYW0ocGxhbmUsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LAogCQkJCW91dF93aWR0aCwgb3V0X2hlaWdodCwgZml2ZV90YXBzLAogCQkJCXJvdGF0aW9uLCBESVNQQ19DT0xPUl9DT01QT05FTlRfUkdCX1kpOwogCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSkpOwpAQCAtMTM3MCwxMSArMTIzMywxMSBAQAogCQl9CiAJfQogCi0JX2Rpc3BjX3NldF92aWRfYWNjdTAocGxhbmUsIDAsIGFjY3UwKTsKLQlfZGlzcGNfc2V0X3ZpZF9hY2N1MShwbGFuZSwgMCwgYWNjdTEpOworCWRpc3BjX292bF9zZXRfdmlkX2FjY3UwKHBsYW5lLCAwLCBhY2N1MCk7CisJZGlzcGNfb3ZsX3NldF92aWRfYWNjdTEocGxhbmUsIDAsIGFjY3UxKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9zY2FsaW5nX3V2KGVudW0gb21hcF9wbGFuZSBwbGFuZSwKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfc2NhbGluZ191dihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCiAJCXUxNiBvcmlnX3dpZHRoLCB1MTYgb3JpZ19oZWlnaHQsCiAJCXUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAogCQlib29sIGlsYWNlLCBib29sIGZpdmVfdGFwcywKQEAgLTE0MjIsNyArMTI4NSw3IEBACiAJaWYgKG91dF9oZWlnaHQgIT0gb3JpZ19oZWlnaHQpCiAJCXNjYWxlX3kgPSB0cnVlOwogCi0JX2Rpc3BjX3NldF9zY2FsZV9wYXJhbShwbGFuZSwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsCisJZGlzcGNfb3ZsX3NldF9zY2FsZV9wYXJhbShwbGFuZSwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsCiAJCQlvdXRfd2lkdGgsIG91dF9oZWlnaHQsIGZpdmVfdGFwcywKIAkJCQlyb3RhdGlvbiwgRElTUENfQ09MT1JfQ09NUE9ORU5UX1VWKTsKIApAQCAtMTQzMywxMSArMTI5NiwxMSBAQAogCS8qIHNldCBWIHNjYWxpbmcgKi8KIAlSRUdfRkxEX01PRChESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIHNjYWxlX3kgPyAxIDogMCwgNiwgNik7CiAKLQlfZGlzcGNfc2V0X3ZpZF9hY2N1Ml8wKHBsYW5lLCAweDgwLCAwKTsKLQlfZGlzcGNfc2V0X3ZpZF9hY2N1Ml8xKHBsYW5lLCAweDgwLCAwKTsKKwlkaXNwY19vdmxfc2V0X3ZpZF9hY2N1Ml8wKHBsYW5lLCAweDgwLCAwKTsKKwlkaXNwY19vdmxfc2V0X3ZpZF9hY2N1Ml8xKHBsYW5lLCAweDgwLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9zY2FsaW5nKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfc2NhbGluZyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCiAJCXUxNiBvcmlnX3dpZHRoLCB1MTYgb3JpZ19oZWlnaHQsCiAJCXUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAogCQlib29sIGlsYWNlLCBib29sIGZpdmVfdGFwcywKQEAgLTE0NDYsMTQgKzEzMDksMTQgQEAKIHsKIAlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKIAotCV9kaXNwY19zZXRfc2NhbGluZ19jb21tb24ocGxhbmUsCisJZGlzcGNfb3ZsX3NldF9zY2FsaW5nX2NvbW1vbihwbGFuZSwKIAkJCW9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LAogCQkJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LAogCQkJaWxhY2UsIGZpdmVfdGFwcywKIAkJCWZpZWxkbW9kZSwgY29sb3JfbW9kZSwKIAkJCXJvdGF0aW9uKTsKIAotCV9kaXNwY19zZXRfc2NhbGluZ191dihwbGFuZSwKKwlkaXNwY19vdmxfc2V0X3NjYWxpbmdfdXYocGxhbmUsCiAJCW9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LAogCQlvdXRfd2lkdGgsIG91dF9oZWlnaHQsCiAJCWlsYWNlLCBmaXZlX3RhcHMsCkBAIC0xNDYxLDcgKzEzMjQsNyBAQAogCQlyb3RhdGlvbik7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfcm90YXRpb25fYXR0cnMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCByb3RhdGlvbiwKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfcm90YXRpb25fYXR0cnMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCByb3RhdGlvbiwKIAkJYm9vbCBtaXJyb3JpbmcsIGVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUpCiB7CiAJYm9vbCByb3dfcmVwZWF0ID0gZmFsc2U7CkBAIC0xNzg5LDEyICsxNjUyLDExIEBACiAJCWVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUpCiB7CiAJdTMyIGZjbGsgPSAwOwotCS8qIEZJWE1FIHZlbmMgcGNsaz8gKi8KLQl1NjQgdG1wLCBwY2xrID0gZGlzcGNfcGNsa19yYXRlKGNoYW5uZWwpOworCXU2NCB0bXAsIHBjbGsgPSBkaXNwY19tZ3JfcGNsa19yYXRlKGNoYW5uZWwpOwogCiAJaWYgKGhlaWdodCA+IG91dF9oZWlnaHQpIHsKLQkJLyogRklYTUUgZ2V0IHJlYWwgZGlzcGxheSBQUEwgKi8KLQkJdW5zaWduZWQgaW50IHBwbCA9IDgwMDsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gZGlzcGNfbWdyX2dldF9kZXZpY2UoY2hhbm5lbCk7CisJCXVuc2lnbmVkIGludCBwcGwgPSBkc3NkZXYtPnBhbmVsLnRpbWluZ3MueF9yZXM7CiAKIAkJdG1wID0gcGNsayAqIGhlaWdodCAqIG91dF93aWR0aDsKIAkJZG9fZGl2KHRtcCwgMiAqIG91dF9oZWlnaHQgKiBwcGwpOwpAQCAtMTg0NiwxMTQgKzE3MDgsMTIwIEBACiAJZWxzZQogCQl2ZiA9IDE7CiAKLQkvKiBGSVhNRSB2ZW5jIHBjbGs/ICovCi0JcmV0dXJuIGRpc3BjX3BjbGtfcmF0ZShjaGFubmVsKSAqIHZmICogaGY7CisJcmV0dXJuIGRpc3BjX21ncl9wY2xrX3JhdGUoY2hhbm5lbCkgKiB2ZiAqIGhmOwogfQogCi1pbnQgZGlzcGNfc2V0dXBfcGxhbmUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAotCQl1MzIgcGFkZHIsIHUxNiBzY3JlZW5fd2lkdGgsCi0JCXUxNiBwb3NfeCwgdTE2IHBvc195LAotCQl1MTYgd2lkdGgsIHUxNiBoZWlnaHQsCitzdGF0aWMgaW50IGRpc3BjX292bF9jYWxjX3NjYWxpbmcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorCQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQsCiAJCXUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAotCQllbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlLAotCQlib29sIGlsYWNlLAotCQllbnVtIG9tYXBfZHNzX3JvdGF0aW9uX3R5cGUgcm90YXRpb25fdHlwZSwKLQkJdTggcm90YXRpb24sIGJvb2wgbWlycm9yLAotCQl1OCBnbG9iYWxfYWxwaGEsIHU4IHByZV9tdWx0X2FscGhhLAotCQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MzIgcHV2X2FkZHIpCisJCWVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUsIGJvb2wgKmZpdmVfdGFwcykKIHsKLQljb25zdCBpbnQgbWF4ZG93bnNjYWxlID0gY3B1X2lzX29tYXAzNHh4KCkgPyA0IDogMjsKLQlib29sIGZpdmVfdGFwcyA9IDA7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkocGxhbmUpOworCWNvbnN0IGludCBtYXhkb3duc2NhbGUgPSBkc3NfZmVhdF9nZXRfcGFyYW1fbWF4KEZFQVRfUEFSQU1fRE9XTlNDQUxFKTsKKwl1bnNpZ25lZCBsb25nIGZjbGsgPSAwOworCisJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFKSA9PSAwKSB7CisJCWlmICh3aWR0aCAhPSBvdXRfd2lkdGggfHwgaGVpZ2h0ICE9IG91dF9oZWlnaHQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKG91dF93aWR0aCA8IHdpZHRoIC8gbWF4ZG93bnNjYWxlIHx8CisJCQlvdXRfd2lkdGggPiB3aWR0aCAqIDgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG91dF9oZWlnaHQgPCBoZWlnaHQgLyBtYXhkb3duc2NhbGUgfHwKKwkJCW91dF9oZWlnaHQgPiBoZWlnaHQgKiA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE11c3QgdXNlIDUtdGFwIGZpbHRlcj8gKi8KKwkqZml2ZV90YXBzID0gaGVpZ2h0ID4gb3V0X2hlaWdodCAqIDI7CisKKwlpZiAoISpmaXZlX3RhcHMpIHsKKwkJZmNsayA9IGNhbGNfZmNsayhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LCBvdXRfd2lkdGgsCisJCQkJb3V0X2hlaWdodCk7CisKKwkJLyogVHJ5IDUtdGFwIGZpbHRlciBpZiAzLXRhcCBmY2xrIGlzIHRvbyBoaWdoICovCisJCWlmIChjcHVfaXNfb21hcDM0eHgoKSAmJiBoZWlnaHQgPiBvdXRfaGVpZ2h0ICYmCisJCQkJZmNsayA+IGRpc3BjX2ZjbGtfcmF0ZSgpKQorCQkJKmZpdmVfdGFwcyA9IHRydWU7CisJfQorCisJaWYgKHdpZHRoID4gKDIwNDggPj4gKmZpdmVfdGFwcykpIHsKKwkJRFNTRVJSKCJmYWlsZWQgdG8gc2V0IHVwIHNjYWxpbmcsIGZjbGsgdG9vIGxvd1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgqZml2ZV90YXBzKQorCQlmY2xrID0gY2FsY19mY2xrX2ZpdmVfdGFwcyhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LAorCQkJCW91dF93aWR0aCwgb3V0X2hlaWdodCwgY29sb3JfbW9kZSk7CisKKwlEU1NEQkcoInJlcXVpcmVkIGZjbGsgcmF0ZSA9ICVsdSBIelxuIiwgZmNsayk7CisJRFNTREJHKCJjdXJyZW50IGZjbGsgcmF0ZSA9ICVsdSBIelxuIiwgZGlzcGNfZmNsa19yYXRlKCkpOworCisJaWYgKCFmY2xrIHx8IGZjbGsgPiBkaXNwY19mY2xrX3JhdGUoKSkgeworCQlEU1NFUlIoImZhaWxlZCB0byBzZXQgdXAgc2NhbGluZywgIgorCQkJInJlcXVpcmVkIGZjbGsgcmF0ZSA9ICVsdSBIeiwgIgorCQkJImN1cnJlbnQgZmNsayByYXRlID0gJWx1IEh6XG4iLAorCQkJZmNsaywgZGlzcGNfZmNsa19yYXRlKCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRpc3BjX292bF9zZXR1cChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyAqb2ksCisJCWJvb2wgaWxhY2UsIGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgcmVwbGljYXRpb24sCisJCXUzMiBmaWZvX2xvdywgdTMyIGZpZm9faGlnaCkKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShwbGFuZSk7CisJYm9vbCBmaXZlX3RhcHMgPSBmYWxzZTsKIAlib29sIGZpZWxkbW9kZSA9IDA7Ci0JaW50IGNjb252ID0gMDsKKwlpbnQgciwgY2NvbnYgPSAwOwogCXVuc2lnbmVkIG9mZnNldDAsIG9mZnNldDE7CiAJczMyIHJvd19pbmM7CiAJczMyIHBpeF9pbmM7Ci0JdTE2IGZyYW1lX2hlaWdodCA9IGhlaWdodDsKKwl1MTYgZnJhbWVfaGVpZ2h0ID0gb2ktPmhlaWdodDsKIAl1bnNpZ25lZCBpbnQgZmllbGRfb2Zmc2V0ID0gMDsKIAotCURTU0RCRygiZGlzcGNfc2V0dXBfcGxhbmUgJWQsIHBhICV4LCBzdyAlZCwgJWQsJWQsICVkeCVkIC0+ICIKLQkgICAgICAgIiVkeCVkLCBpbGFjZSAlZCwgY21vZGUgJXgsIHJvdCAlZCwgbWlyICVkIGNoYW4gJWRcbiIsCi0JICAgICAgIHBsYW5lLCBwYWRkciwgc2NyZWVuX3dpZHRoLCBwb3NfeCwgcG9zX3ksCi0JICAgICAgIHdpZHRoLCBoZWlnaHQsCi0JICAgICAgIG91dF93aWR0aCwgb3V0X2hlaWdodCwKLQkgICAgICAgaWxhY2UsIGNvbG9yX21vZGUsCi0JICAgICAgIHJvdGF0aW9uLCBtaXJyb3IsIGNoYW5uZWwpOworCURTU0RCRygiZGlzcGNfb3ZsX3NldHVwICVkLCBwYSAleCwgcGFfdXYgJXgsIHN3ICVkLCAlZCwlZCwgJWR4JWQgLT4gIgorCQkiJWR4JWQsIGNtb2RlICV4LCByb3QgJWQsIG1pciAlZCwgaWxhY2UgJWQgY2hhbiAlZCByZXBsICVkICIKKwkJImZpZm9fbG93ICVkIGZpZm8gaGlnaCAlZFxuIiwgcGxhbmUsIG9pLT5wYWRkciwgb2ktPnBfdXZfYWRkciwKKwkJb2ktPnNjcmVlbl93aWR0aCwgb2ktPnBvc194LCBvaS0+cG9zX3ksIG9pLT53aWR0aCwgb2ktPmhlaWdodCwKKwkJb2ktPm91dF93aWR0aCwgb2ktPm91dF9oZWlnaHQsIG9pLT5jb2xvcl9tb2RlLCBvaS0+cm90YXRpb24sCisJCW9pLT5taXJyb3IsIGlsYWNlLCBjaGFubmVsLCByZXBsaWNhdGlvbiwgZmlmb19sb3csIGZpZm9faGlnaCk7CiAKLQlpZiAocGFkZHIgPT0gMCkKKwlpZiAob2ktPnBhZGRyID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGlsYWNlICYmIGhlaWdodCA9PSBvdXRfaGVpZ2h0KQorCWlmIChpbGFjZSAmJiBvaS0+aGVpZ2h0ID09IG9pLT5vdXRfaGVpZ2h0KQogCQlmaWVsZG1vZGUgPSAxOwogCiAJaWYgKGlsYWNlKSB7CiAJCWlmIChmaWVsZG1vZGUpCi0JCQloZWlnaHQgLz0gMjsKLQkJcG9zX3kgLz0gMjsKLQkJb3V0X2hlaWdodCAvPSAyOworCQkJb2ktPmhlaWdodCAvPSAyOworCQlvaS0+cG9zX3kgLz0gMjsKKwkJb2ktPm91dF9oZWlnaHQgLz0gMjsKIAogCQlEU1NEQkcoImFkanVzdGluZyBmb3IgaWxhY2U6IGhlaWdodCAlZCwgcG9zX3kgJWQsICIKIAkJCQkib3V0X2hlaWdodCAlZFxuIiwKLQkJCQloZWlnaHQsIHBvc195LCBvdXRfaGVpZ2h0KTsKKwkJCQlvaS0+aGVpZ2h0LCBvaS0+cG9zX3ksIG9pLT5vdXRfaGVpZ2h0KTsKIAl9CiAKLQlpZiAoIWRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKHBsYW5lLCBjb2xvcl9tb2RlKSkKKwlpZiAoIWRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKHBsYW5lLCBvaS0+Y29sb3JfbW9kZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHBsYW5lID09IE9NQVBfRFNTX0dGWCkgewotCQlpZiAod2lkdGggIT0gb3V0X3dpZHRoIHx8IGhlaWdodCAhPSBvdXRfaGVpZ2h0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJLyogdmlkZW8gcGxhbmUgKi8KKwlyID0gZGlzcGNfb3ZsX2NhbGNfc2NhbGluZyhwbGFuZSwgY2hhbm5lbCwgb2ktPndpZHRoLCBvaS0+aGVpZ2h0LAorCQkJb2ktPm91dF93aWR0aCwgb2ktPm91dF9oZWlnaHQsIG9pLT5jb2xvcl9tb2RlLAorCQkJJmZpdmVfdGFwcyk7CisJaWYgKHIpCisJCXJldHVybiByOwogCi0JCXVuc2lnbmVkIGxvbmcgZmNsayA9IDA7Ci0KLQkJaWYgKG91dF93aWR0aCA8IHdpZHRoIC8gbWF4ZG93bnNjYWxlIHx8Ci0JCSAgIG91dF93aWR0aCA+IHdpZHRoICogOCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChvdXRfaGVpZ2h0IDwgaGVpZ2h0IC8gbWF4ZG93bnNjYWxlIHx8Ci0JCSAgIG91dF9oZWlnaHQgPiBoZWlnaHQgKiA4KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfWVVWMiB8fAotCQkJY29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9VWVZZIHx8Ci0JCQljb2xvcl9tb2RlID09IE9NQVBfRFNTX0NPTE9SX05WMTIpCi0JCQljY29udiA9IDE7Ci0KLQkJLyogTXVzdCB1c2UgNS10YXAgZmlsdGVyPyAqLwotCQlmaXZlX3RhcHMgPSBoZWlnaHQgPiBvdXRfaGVpZ2h0ICogMjsKLQotCQlpZiAoIWZpdmVfdGFwcykgewotCQkJZmNsayA9IGNhbGNfZmNsayhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LCBvdXRfd2lkdGgsCi0JCQkJCW91dF9oZWlnaHQpOwotCi0JCQkvKiBUcnkgNS10YXAgZmlsdGVyIGlmIDMtdGFwIGZjbGsgaXMgdG9vIGhpZ2ggKi8KLQkJCWlmIChjcHVfaXNfb21hcDM0eHgoKSAmJiBoZWlnaHQgPiBvdXRfaGVpZ2h0ICYmCi0JCQkJCWZjbGsgPiBkaXNwY19mY2xrX3JhdGUoKSkKLQkJCQlmaXZlX3RhcHMgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKHdpZHRoID4gKDIwNDggPj4gZml2ZV90YXBzKSkgewotCQkJRFNTRVJSKCJmYWlsZWQgdG8gc2V0IHVwIHNjYWxpbmcsIGZjbGsgdG9vIGxvd1xuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChmaXZlX3RhcHMpCi0JCQlmY2xrID0gY2FsY19mY2xrX2ZpdmVfdGFwcyhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LAotCQkJCQlvdXRfd2lkdGgsIG91dF9oZWlnaHQsIGNvbG9yX21vZGUpOwotCi0JCURTU0RCRygicmVxdWlyZWQgZmNsayByYXRlID0gJWx1IEh6XG4iLCBmY2xrKTsKLQkJRFNTREJHKCJjdXJyZW50IGZjbGsgcmF0ZSA9ICVsdSBIelxuIiwgZGlzcGNfZmNsa19yYXRlKCkpOwotCi0JCWlmICghZmNsayB8fCBmY2xrID4gZGlzcGNfZmNsa19yYXRlKCkpIHsKLQkJCURTU0VSUigiZmFpbGVkIHRvIHNldCB1cCBzY2FsaW5nLCAiCi0JCQkJCSJyZXF1aXJlZCBmY2xrIHJhdGUgPSAlbHUgSHosICIKLQkJCQkJImN1cnJlbnQgZmNsayByYXRlID0gJWx1IEh6XG4iLAotCQkJCQlmY2xrLCBkaXNwY19mY2xrX3JhdGUoKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KKwlpZiAob2ktPmNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfWVVWMiB8fAorCQkJb2ktPmNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfVVlWWSB8fAorCQkJb2ktPmNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfTlYxMikKKwkJY2NvbnYgPSAxOwogCiAJaWYgKGlsYWNlICYmICFmaWVsZG1vZGUpIHsKIAkJLyoKQEAgLTE5NjMsNjkgKzE4MzEsNzYgQEAKIAkJICogc28gdGhlIGludGVnZXIgcGFydCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlCiAJCSAqIGJvdHRvbSBmaWVsZC4KIAkJICovCi0JCWlmICghaGVpZ2h0IHx8IGhlaWdodCA9PSBvdXRfaGVpZ2h0KQorCQlpZiAoIW9pLT5oZWlnaHQgfHwgb2ktPmhlaWdodCA9PSBvaS0+b3V0X2hlaWdodCkKIAkJCWZpZWxkX29mZnNldCA9IDA7CiAJCWVsc2UKLQkJCWZpZWxkX29mZnNldCA9IGhlaWdodCAvIG91dF9oZWlnaHQgLyAyOworCQkJZmllbGRfb2Zmc2V0ID0gb2ktPmhlaWdodCAvIG9pLT5vdXRfaGVpZ2h0IC8gMjsKIAl9CiAKIAkvKiBGaWVsZHMgYXJlIGluZGVwZW5kZW50IGJ1dCBpbnRlcmxlYXZlZCBpbiBtZW1vcnkuICovCiAJaWYgKGZpZWxkbW9kZSkKIAkJZmllbGRfb2Zmc2V0ID0gMTsKIAotCWlmIChyb3RhdGlvbl90eXBlID09IE9NQVBfRFNTX1JPVF9ETUEpCi0JCWNhbGNfZG1hX3JvdGF0aW9uX29mZnNldChyb3RhdGlvbiwgbWlycm9yLAotCQkJCXNjcmVlbl93aWR0aCwgd2lkdGgsIGZyYW1lX2hlaWdodCwgY29sb3JfbW9kZSwKLQkJCQlmaWVsZG1vZGUsIGZpZWxkX29mZnNldCwKKwlpZiAob2ktPnJvdGF0aW9uX3R5cGUgPT0gT01BUF9EU1NfUk9UX0RNQSkKKwkJY2FsY19kbWFfcm90YXRpb25fb2Zmc2V0KG9pLT5yb3RhdGlvbiwgb2ktPm1pcnJvciwKKwkJCQlvaS0+c2NyZWVuX3dpZHRoLCBvaS0+d2lkdGgsIGZyYW1lX2hlaWdodCwKKwkJCQlvaS0+Y29sb3JfbW9kZSwgZmllbGRtb2RlLCBmaWVsZF9vZmZzZXQsCiAJCQkJJm9mZnNldDAsICZvZmZzZXQxLCAmcm93X2luYywgJnBpeF9pbmMpOwogCWVsc2UKLQkJY2FsY192cmZiX3JvdGF0aW9uX29mZnNldChyb3RhdGlvbiwgbWlycm9yLAotCQkJCXNjcmVlbl93aWR0aCwgd2lkdGgsIGZyYW1lX2hlaWdodCwgY29sb3JfbW9kZSwKLQkJCQlmaWVsZG1vZGUsIGZpZWxkX29mZnNldCwKKwkJY2FsY192cmZiX3JvdGF0aW9uX29mZnNldChvaS0+cm90YXRpb24sIG9pLT5taXJyb3IsCisJCQkJb2ktPnNjcmVlbl93aWR0aCwgb2ktPndpZHRoLCBmcmFtZV9oZWlnaHQsCisJCQkJb2ktPmNvbG9yX21vZGUsIGZpZWxkbW9kZSwgZmllbGRfb2Zmc2V0LAogCQkJCSZvZmZzZXQwLCAmb2Zmc2V0MSwgJnJvd19pbmMsICZwaXhfaW5jKTsKIAogCURTU0RCRygib2Zmc2V0MCAldSwgb2Zmc2V0MSAldSwgcm93X2luYyAlZCwgcGl4X2luYyAlZFxuIiwKIAkJCW9mZnNldDAsIG9mZnNldDEsIHJvd19pbmMsIHBpeF9pbmMpOwogCi0JX2Rpc3BjX3NldF9jb2xvcl9tb2RlKHBsYW5lLCBjb2xvcl9tb2RlKTsKKwlkaXNwY19vdmxfc2V0X2NvbG9yX21vZGUocGxhbmUsIG9pLT5jb2xvcl9tb2RlKTsKIAotCV9kaXNwY19zZXRfcGxhbmVfYmEwKHBsYW5lLCBwYWRkciArIG9mZnNldDApOwotCV9kaXNwY19zZXRfcGxhbmVfYmExKHBsYW5lLCBwYWRkciArIG9mZnNldDEpOworCWRpc3BjX292bF9zZXRfYmEwKHBsYW5lLCBvaS0+cGFkZHIgKyBvZmZzZXQwKTsKKwlkaXNwY19vdmxfc2V0X2JhMShwbGFuZSwgb2ktPnBhZGRyICsgb2Zmc2V0MSk7CiAKLQlpZiAoT01BUF9EU1NfQ09MT1JfTlYxMiA9PSBjb2xvcl9tb2RlKSB7Ci0JCV9kaXNwY19zZXRfcGxhbmVfYmEwX3V2KHBsYW5lLCBwdXZfYWRkciArIG9mZnNldDApOwotCQlfZGlzcGNfc2V0X3BsYW5lX2JhMV91dihwbGFuZSwgcHV2X2FkZHIgKyBvZmZzZXQxKTsKKwlpZiAoT01BUF9EU1NfQ09MT1JfTlYxMiA9PSBvaS0+Y29sb3JfbW9kZSkgeworCQlkaXNwY19vdmxfc2V0X2JhMF91dihwbGFuZSwgb2ktPnBfdXZfYWRkciArIG9mZnNldDApOworCQlkaXNwY19vdmxfc2V0X2JhMV91dihwbGFuZSwgb2ktPnBfdXZfYWRkciArIG9mZnNldDEpOwogCX0KIAogCi0JX2Rpc3BjX3NldF9yb3dfaW5jKHBsYW5lLCByb3dfaW5jKTsKLQlfZGlzcGNfc2V0X3BpeF9pbmMocGxhbmUsIHBpeF9pbmMpOworCWRpc3BjX292bF9zZXRfcm93X2luYyhwbGFuZSwgcm93X2luYyk7CisJZGlzcGNfb3ZsX3NldF9waXhfaW5jKHBsYW5lLCBwaXhfaW5jKTsKIAotCURTU0RCRygiJWQsJWQgJWR4JWQgLT4gJWR4JWRcbiIsIHBvc194LCBwb3NfeSwgd2lkdGgsIGhlaWdodCwKLQkJCW91dF93aWR0aCwgb3V0X2hlaWdodCk7CisJRFNTREJHKCIlZCwlZCAlZHglZCAtPiAlZHglZFxuIiwgb2ktPnBvc194LCBvaS0+cG9zX3ksIG9pLT53aWR0aCwKKwkJCW9pLT5oZWlnaHQsIG9pLT5vdXRfd2lkdGgsIG9pLT5vdXRfaGVpZ2h0KTsKIAotCV9kaXNwY19zZXRfcGxhbmVfcG9zKHBsYW5lLCBwb3NfeCwgcG9zX3kpOworCWRpc3BjX292bF9zZXRfcG9zKHBsYW5lLCBvaS0+cG9zX3gsIG9pLT5wb3NfeSk7CiAKLQlfZGlzcGNfc2V0X3BpY19zaXplKHBsYW5lLCB3aWR0aCwgaGVpZ2h0KTsKKwlkaXNwY19vdmxfc2V0X3BpY19zaXplKHBsYW5lLCBvaS0+d2lkdGgsIG9pLT5oZWlnaHQpOwogCi0JaWYgKHBsYW5lICE9IE9NQVBfRFNTX0dGWCkgewotCQlfZGlzcGNfc2V0X3NjYWxpbmcocGxhbmUsIHdpZHRoLCBoZWlnaHQsCi0JCQkJICAgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LAorCWlmIChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFKSB7CisJCWRpc3BjX292bF9zZXRfc2NhbGluZyhwbGFuZSwgb2ktPndpZHRoLCBvaS0+aGVpZ2h0LAorCQkJCSAgIG9pLT5vdXRfd2lkdGgsIG9pLT5vdXRfaGVpZ2h0LAogCQkJCSAgIGlsYWNlLCBmaXZlX3RhcHMsIGZpZWxkbW9kZSwKLQkJCQkgICBjb2xvcl9tb2RlLCByb3RhdGlvbik7Ci0JCV9kaXNwY19zZXRfdmlkX3NpemUocGxhbmUsIG91dF93aWR0aCwgb3V0X2hlaWdodCk7Ci0JCV9kaXNwY19zZXRfdmlkX2NvbG9yX2NvbnYocGxhbmUsIGNjb252KTsKKwkJCQkgICBvaS0+Y29sb3JfbW9kZSwgb2ktPnJvdGF0aW9uKTsKKwkJZGlzcGNfb3ZsX3NldF92aWRfc2l6ZShwbGFuZSwgb2ktPm91dF93aWR0aCwgb2ktPm91dF9oZWlnaHQpOworCQlkaXNwY19vdmxfc2V0X3ZpZF9jb2xvcl9jb252KHBsYW5lLCBjY29udik7CiAJfQogCi0JX2Rpc3BjX3NldF9yb3RhdGlvbl9hdHRycyhwbGFuZSwgcm90YXRpb24sIG1pcnJvciwgY29sb3JfbW9kZSk7CisJZGlzcGNfb3ZsX3NldF9yb3RhdGlvbl9hdHRycyhwbGFuZSwgb2ktPnJvdGF0aW9uLCBvaS0+bWlycm9yLAorCQkJb2ktPmNvbG9yX21vZGUpOwogCi0JX2Rpc3BjX3NldF9wcmVfbXVsdF9hbHBoYShwbGFuZSwgcHJlX211bHRfYWxwaGEpOwotCV9kaXNwY19zZXR1cF9nbG9iYWxfYWxwaGEocGxhbmUsIGdsb2JhbF9hbHBoYSk7CisJZGlzcGNfb3ZsX3NldF96b3JkZXIocGxhbmUsIG9pLT56b3JkZXIpOworCWRpc3BjX292bF9zZXRfcHJlX211bHRfYWxwaGEocGxhbmUsIG9pLT5wcmVfbXVsdF9hbHBoYSk7CisJZGlzcGNfb3ZsX3NldHVwX2dsb2JhbF9hbHBoYShwbGFuZSwgb2ktPmdsb2JhbF9hbHBoYSk7CisKKwlkaXNwY19vdmxfc2V0X2NoYW5uZWxfb3V0KHBsYW5lLCBjaGFubmVsKTsKKworCWRpc3BjX292bF9lbmFibGVfcmVwbGljYXRpb24ocGxhbmUsIHJlcGxpY2F0aW9uKTsKKwlkaXNwY19vdmxfc2V0X2ZpZm9fdGhyZXNob2xkKHBsYW5lLCBmaWZvX2xvdywgZmlmb19oaWdoKTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgZGlzcGNfZW5hYmxlX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpCitpbnQgZGlzcGNfb3ZsX2VuYWJsZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQogewogCURTU0RCRygiZGlzcGNfZW5hYmxlX3BsYW5lICVkLCAlZFxuIiwgcGxhbmUsIGVuYWJsZSk7CiAKQEAgLTIwNDgsNyArMTkyMyw3IEBACiAJCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGVuYWJsZSA/IDEgOiAwLCAwLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgZGlzcGNfZW5hYmxlX2xjZF9vdXQoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCitzdGF0aWMgdm9pZCBkaXNwY19tZ3JfZW5hYmxlX2xjZF9vdXQoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IGNvbXBsZXRpb24gZnJhbWVfZG9uZV9jb21wbGV0aW9uOwogCWJvb2wgaXNfb247CkBAIC0yMDk1LDE0ICsxOTcwLDE5IEBACiAJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgZW5hYmxlID8gMSA6IDAsIDEsIDEpOwogfQogCi1zdGF0aWMgdm9pZCBkaXNwY19lbmFibGVfZGlnaXRfb3V0KGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgZGlzcGNfbWdyX2VuYWJsZV9kaWdpdF9vdXQoYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IGNvbXBsZXRpb24gZnJhbWVfZG9uZV9jb21wbGV0aW9uOwotCWludCByOworCWVudW0gZHNzX2hkbWlfdmVuY19jbGtfc291cmNlX3NlbGVjdCBzcmM7CisJaW50IHIsIGk7CisJdTMyIGlycV9tYXNrOworCWludCBudW1faXJxczsKIAogCWlmIChSRUdfR0VUKERJU1BDX0NPTlRST0wsIDEsIDEpID09IGVuYWJsZSkKIAkJcmV0dXJuOwogCisJc3JjID0gZHNzX2dldF9oZG1pX3ZlbmNfY2xrX3NvdXJjZSgpOworCiAJaWYgKGVuYWJsZSkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQkvKiBXaGVuIHdlIGVuYWJsZSBkaWdpdCBvdXRwdXQsIHdlJ2xsIGdldCBhbiBleHRyYSBkaWdpdApAQCAtMjExOSw0MyArMTk5OSw0NyBAQAogCSAqIHdhaXQgZm9yIHRoZSBleHRyYSBzeW5jIGxvc3RzICovCiAJaW5pdF9jb21wbGV0aW9uKCZmcmFtZV9kb25lX2NvbXBsZXRpb24pOwogCisJaWYgKHNyYyA9PSBEU1NfSERNSV9NX1BDTEsgJiYgZW5hYmxlID09IGZhbHNlKSB7CisJCWlycV9tYXNrID0gRElTUENfSVJRX0ZSQU1FRE9ORVRWOworCQludW1faXJxcyA9IDE7CisJfSBlbHNlIHsKKwkJaXJxX21hc2sgPSBESVNQQ19JUlFfRVZTWU5DX0VWRU4gfCBESVNQQ19JUlFfRVZTWU5DX09ERDsKKwkJLyogWFhYIEkgdW5kZXJzdGFuZCBmcm9tIFRSTSB0aGF0IHdlIHNob3VsZCBvbmx5IHdhaXQgZm9yIHRoZQorCQkgKiBjdXJyZW50IGZpZWxkIHRvIGNvbXBsZXRlLiBCdXQgaXQgc2VlbXMgd2UgaGF2ZSB0byB3YWl0IGZvcgorCQkgKiBib3RoIGZpZWxkcyAqLworCQludW1faXJxcyA9IDI7CisJfQorCiAJciA9IG9tYXBfZGlzcGNfcmVnaXN0ZXJfaXNyKGRpc3BjX2Rpc2FibGVfaXNyLCAmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAotCQkJRElTUENfSVJRX0VWU1lOQ19FVkVOIHwgRElTUENfSVJRX0VWU1lOQ19PREQpOworCQkJaXJxX21hc2spOwogCWlmIChyKQotCQlEU1NFUlIoImZhaWxlZCB0byByZWdpc3RlciBFVlNZTkMgaXNyXG4iKTsKKwkJRFNTRVJSKCJmYWlsZWQgdG8gcmVnaXN0ZXIgJXggaXNyXG4iLCBpcnFfbWFzayk7CiAKIAlfZW5hYmxlX2RpZ2l0X291dChlbmFibGUpOwogCi0JLyogWFhYIEkgdW5kZXJzdGFuZCBmcm9tIFRSTSB0aGF0IHdlIHNob3VsZCBvbmx5IHdhaXQgZm9yIHRoZQotCSAqIGN1cnJlbnQgZmllbGQgdG8gY29tcGxldGUuIEJ1dCBpdCBzZWVtcyB3ZSBoYXZlIHRvIHdhaXQKLQkgKiBmb3IgYm90aCBmaWVsZHMgKi8KLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSkpCi0JCURTU0VSUigidGltZW91dCB3YWl0aW5nIGZvciBFVlNZTkNcbiIpOworCWZvciAoaSA9IDA7IGkgPCBudW1faXJxczsgKytpKSB7CisJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmcmFtZV9kb25lX2NvbXBsZXRpb24sCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSkpCisJCQlEU1NFUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgZGlnaXQgb3V0IHRvICVzXG4iLAorCQkJCQllbmFibGUgPyAic3RhcnQiIDogInN0b3AiKTsKKwl9CiAKLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSkpCi0JCURTU0VSUigidGltZW91dCB3YWl0aW5nIGZvciBFVlNZTkNcbiIpOwotCi0JciA9IG9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZGlzcGNfZGlzYWJsZV9pc3IsCi0JCQkmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAotCQkJRElTUENfSVJRX0VWU1lOQ19FVkVOIHwgRElTUENfSVJRX0VWU1lOQ19PREQpOworCXIgPSBvbWFwX2Rpc3BjX3VucmVnaXN0ZXJfaXNyKGRpc3BjX2Rpc2FibGVfaXNyLCAmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAorCQkJaXJxX21hc2spOwogCWlmIChyKQotCQlEU1NFUlIoImZhaWxlZCB0byB1bnJlZ2lzdGVyIEVWU1lOQyBpc3JcbiIpOworCQlEU1NFUlIoImZhaWxlZCB0byB1bnJlZ2lzdGVyICV4IGlzclxuIiwgaXJxX21hc2spOwogCiAJaWYgKGVuYWJsZSkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKLQkJZGlzcGMuaXJxX2Vycm9yX21hc2sgPSBESVNQQ19JUlFfTUFTS19FUlJPUjsKLQkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkKLQkJCWRpc3BjLmlycV9lcnJvcl9tYXNrIHw9IERJU1BDX0lSUV9TWU5DX0xPU1QyOworCQlkaXNwYy5pcnFfZXJyb3JfbWFzayB8PSBESVNQQ19JUlFfU1lOQ19MT1NUX0RJR0lUOwogCQlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCBESVNQQ19JUlFfU1lOQ19MT1NUX0RJR0lUKTsKIAkJX29tYXBfZGlzcGNfc2V0X2lycXMoKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKLWJvb2wgZGlzcGNfaXNfY2hhbm5lbF9lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCitib29sIGRpc3BjX21ncl9pc19lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCiB7CiAJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCXJldHVybiAhIVJFR19HRVQoRElTUENfQ09OVFJPTCwgMCwgMCk7CkBAIC0yMTY3LDEzICsyMDUxLDEyIEBACiAJCUJVRygpOwogfQogCi12b2lkIGRpc3BjX2VuYWJsZV9jaGFubmVsKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQordm9pZCBkaXNwY19tZ3JfZW5hYmxlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQogewotCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEIHx8Ci0JCQljaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKLQkJZGlzcGNfZW5hYmxlX2xjZF9vdXQoY2hhbm5lbCwgZW5hYmxlKTsKKwlpZiAoZGlzcGNfbWdyX2lzX2xjZChjaGFubmVsKSkKKwkJZGlzcGNfbWdyX2VuYWJsZV9sY2Rfb3V0KGNoYW5uZWwsIGVuYWJsZSk7CiAJZWxzZSBpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQotCQlkaXNwY19lbmFibGVfZGlnaXRfb3V0KGVuYWJsZSk7CisJCWRpc3BjX21ncl9lbmFibGVfZGlnaXRfb3V0KGVuYWJsZSk7CiAJZWxzZQogCQlCVUcoKTsKIH0KQEAgLTIyMDIsNyArMjA4NSw3IEBACiAJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgZW5hYmxlID8gMSA6IDAsIDI3LCAyNyk7CiB9CiAKLXZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9oYW5kY2hlY2soZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCit2b2lkIGRpc3BjX21ncl9lbmFibGVfZmlmb2hhbmRjaGVjayhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIGVuYWJsZSkKIHsKIAlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRzIsIGVuYWJsZSA/IDEgOiAwLCAxNiwgMTYpOwpAQCAtMjIxMSw3ICsyMDk0LDcgQEAKIH0KIAogCi12b2lkIGRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCit2b2lkIGRpc3BjX21ncl9zZXRfbGNkX2Rpc3BsYXlfdHlwZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAogCQllbnVtIG9tYXBfbGNkX2Rpc3BsYXlfdHlwZSB0eXBlKQogewogCWludCBtb2RlOwpAQCAtMjI0MiwxMiArMjEyNSwxMiBAQAogfQogCiAKLXZvaWQgZGlzcGNfc2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTMyIGNvbG9yKQordm9pZCBkaXNwY19tZ3Jfc2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTMyIGNvbG9yKQogewogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19ERUZBVUxUX0NPTE9SKGNoYW5uZWwpLCBjb2xvcik7CiB9CiAKLXUzMiBkaXNwY19nZXRfZGVmYXVsdF9jb2xvcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQordTMyIGRpc3BjX21ncl9nZXRfZGVmYXVsdF9jb2xvcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewogCXUzMiBsOwogCkBAIC0yMjYwLDcgKzIxNDMsNyBAQAogCXJldHVybiBsOwogfQogCi12b2lkIGRpc3BjX3NldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCit2b2lkIGRpc3BjX21ncl9zZXRfdHJhbnNfa2V5KGVudW0gb21hcF9jaGFubmVsIGNoLAogCQllbnVtIG9tYXBfZHNzX3RyYW5zX2tleV90eXBlIHR5cGUsCiAJCXUzMiB0cmFuc19rZXkpCiB7CkBAIC0yMjc0LDcgKzIxNTcsNyBAQAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19UUkFOU19DT0xPUihjaCksIHRyYW5zX2tleSk7CiB9CiAKLXZvaWQgZGlzcGNfZ2V0X3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwKK3ZvaWQgZGlzcGNfbWdyX2dldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCiAJCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgKnR5cGUsCiAJCXUzMiAqdHJhbnNfa2V5KQogewpAQCAtMjI5Myw3ICsyMTc2LDcgQEAKIAkJKnRyYW5zX2tleSA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1RSQU5TX0NPTE9SKGNoKSk7CiB9CiAKLXZvaWQgZGlzcGNfZW5hYmxlX3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpCit2b2lkIGRpc3BjX21ncl9lbmFibGVfdHJhbnNfa2V5KGVudW0gb21hcF9jaGFubmVsIGNoLCBib29sIGVuYWJsZSkKIHsKIAlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlLCAxMCwgMTApOwpAQCAtMjMwMiwzOSArMjE4NSwzNiBAQAogCWVsc2UgLyogT01BUF9EU1NfQ0hBTk5FTF9MQ0QyICovCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRzIsIGVuYWJsZSwgMTAsIDEwKTsKIH0KLXZvaWQgZGlzcGNfZW5hYmxlX2FscGhhX2JsZW5kaW5nKGVudW0gb21hcF9jaGFubmVsIGNoLCBib29sIGVuYWJsZSkKKwordm9pZCBkaXNwY19tZ3JfZW5hYmxlX2FscGhhX2ZpeGVkX3pvcmRlcihlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpCiB7Ci0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQorCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRklYRURfWk9SREVSKSkKIAkJcmV0dXJuOwogCiAJaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSwgMTgsIDE4KTsKIAllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSwgMTksIDE5KTsKLQllbHNlIC8qIE9NQVBfRFNTX0NIQU5ORUxfTENEMiAqLwotCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcyLCBlbmFibGUsIDE4LCAxOCk7CiB9Ci1ib29sIGRpc3BjX2FscGhhX2JsZW5kaW5nX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpCisKK2Jvb2wgZGlzcGNfbWdyX2FscGhhX2ZpeGVkX3pvcmRlcl9lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoKQogewogCWJvb2wgZW5hYmxlZDsKIAotCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKKwlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZJWEVEX1pPUkRFUikpCiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKIAkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxOCwgMTgpOwogCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCiAJCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRywgMTksIDE5KTsKLQllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCi0JCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRzIsIDE4LCAxOCk7CiAJZWxzZQogCQlCVUcoKTsKIAogCXJldHVybiBlbmFibGVkOwogfQogCi0KLWJvb2wgZGlzcGNfdHJhbnNfa2V5X2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpCitib29sIGRpc3BjX21ncl90cmFuc19rZXlfZW5hYmxlZChlbnVtIG9tYXBfY2hhbm5lbCBjaCkKIHsKIAlib29sIGVuYWJsZWQ7CiAKQEAgLTIzNTEsNyArMjIzMSw3IEBACiB9CiAKIAotdm9pZCBkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXMoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTggZGF0YV9saW5lcykKK3ZvaWQgZGlzcGNfbWdyX3NldF90ZnRfZGF0YV9saW5lcyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1OCBkYXRhX2xpbmVzKQogewogCWludCBjb2RlOwogCkBAIC0yMzc5LDQ2ICsyMjU5LDQxIEBACiAJCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGNvZGUsIDksIDgpOwogfQogCi12b2lkIGRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAotCQllbnVtIG9tYXBfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUgbW9kZSkKK3ZvaWQgZGlzcGNfbWdyX3NldF9pb19wYWRfbW9kZShlbnVtIGRzc19pb19wYWRfbW9kZSBtb2RlKQogewogCXUzMiBsOwotCWludCBzdGFsbG1vZGU7Ci0JaW50IGdwb3V0MCA9IDE7Ci0JaW50IGdwb3V0MTsKKwlpbnQgZ3BvdXQwLCBncG91dDE7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIE9NQVBfRFNTX1BBUkFMTEVMTU9ERV9CWVBBU1M6Ci0JCXN0YWxsbW9kZSA9IDA7Ci0JCWdwb3V0MSA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBPTUFQX0RTU19QQVJBTExFTE1PREVfUkZCSToKLQkJc3RhbGxtb2RlID0gMTsKKwljYXNlIERTU19JT19QQURfTU9ERV9SRVNFVDoKKwkJZ3BvdXQwID0gMDsKIAkJZ3BvdXQxID0gMDsKIAkJYnJlYWs7Ci0KLQljYXNlIE9NQVBfRFNTX1BBUkFMTEVMTU9ERV9EU0k6Ci0JCXN0YWxsbW9kZSA9IDE7CisJY2FzZSBEU1NfSU9fUEFEX01PREVfUkZCSToKKwkJZ3BvdXQwID0gMTsKKwkJZ3BvdXQxID0gMDsKKwkJYnJlYWs7CisJY2FzZSBEU1NfSU9fUEFEX01PREVfQllQQVNTOgorCQlncG91dDAgPSAxOwogCQlncG91dDEgPSAxOwogCQlicmVhazsKLQogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSB7Ci0JCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05UUk9MMik7Ci0JCWwgPSBGTERfTU9EKGwsIHN0YWxsbW9kZSwgMTEsIDExKTsKLQkJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTlRST0wyLCBsKTsKLQl9IGVsc2UgewotCQlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7Ci0JCWwgPSBGTERfTU9EKGwsIHN0YWxsbW9kZSwgMTEsIDExKTsKLQkJbCA9IEZMRF9NT0QobCwgZ3BvdXQwLCAxNSwgMTUpOwotCQlsID0gRkxEX01PRChsLCBncG91dDEsIDE2LCAxNik7Ci0JCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05UUk9MLCBsKTsKLQl9CisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCWwgPSBGTERfTU9EKGwsIGdwb3V0MCwgMTUsIDE1KTsKKwlsID0gRkxEX01PRChsLCBncG91dDEsIDE2LCAxNik7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTlRST0wsIGwpOworfQorCit2b2lkIGRpc3BjX21ncl9lbmFibGVfc3RhbGxtb2RlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQoreworCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTDIsIGVuYWJsZSwgMTEsIDExKTsKKwllbHNlCisJCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGVuYWJsZSwgMTEsIDExKTsKIH0KIAogc3RhdGljIGJvb2wgX2Rpc3BjX2xjZF90aW1pbmdzX29rKGludCBoc3csIGludCBoZnAsIGludCBoYnAsCkBAIC0yNDUyLDcgKzIzMjcsNyBAQAogCQkJdGltaW5ncy0+dmZwLCB0aW1pbmdzLT52YnApOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfc2V0X2xjZF90aW1pbmdzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGludCBoc3csCitzdGF0aWMgdm9pZCBfZGlzcGNfbWdyX3NldF9sY2RfdGltaW5ncyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBpbnQgaHN3LAogCQlpbnQgaGZwLCBpbnQgaGJwLCBpbnQgdnN3LCBpbnQgdmZwLCBpbnQgdmJwKQogewogCXUzMiB0aW1pbmdfaCwgdGltaW5nX3Y7CkBAIC0yNDc2LDcgKzIzNTEsNyBAQAogfQogCiAvKiBjaGFuZ2UgbmFtZSB0byBtb2RlPyAqLwotdm9pZCBkaXNwY19zZXRfbGNkX3RpbWluZ3MoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKK3ZvaWQgZGlzcGNfbWdyX3NldF9sY2RfdGltaW5ncyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAogCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQogewogCXVuc2lnbmVkIHh0b3QsIHl0b3Q7CkBAIC0yNDg3LDExICsyMzYyLDExIEBACiAJCQkJdGltaW5ncy0+dmZwLCB0aW1pbmdzLT52YnApKQogCQlCVUcoKTsKIAotCV9kaXNwY19zZXRfbGNkX3RpbWluZ3MoY2hhbm5lbCwgdGltaW5ncy0+aHN3LCB0aW1pbmdzLT5oZnAsCisJX2Rpc3BjX21ncl9zZXRfbGNkX3RpbWluZ3MoY2hhbm5lbCwgdGltaW5ncy0+aHN3LCB0aW1pbmdzLT5oZnAsCiAJCQl0aW1pbmdzLT5oYnAsIHRpbWluZ3MtPnZzdywgdGltaW5ncy0+dmZwLAogCQkJdGltaW5ncy0+dmJwKTsKIAotCWRpc3BjX3NldF9sY2Rfc2l6ZShjaGFubmVsLCB0aW1pbmdzLT54X3JlcywgdGltaW5ncy0+eV9yZXMpOworCWRpc3BjX21ncl9zZXRfbGNkX3NpemUoY2hhbm5lbCwgdGltaW5ncy0+eF9yZXMsIHRpbWluZ3MtPnlfcmVzKTsKIAogCXh0b3QgPSB0aW1pbmdzLT54X3JlcyArIHRpbWluZ3MtPmhmcCArIHRpbWluZ3MtPmhzdyArIHRpbWluZ3MtPmhicDsKIAl5dG90ID0gdGltaW5ncy0+eV9yZXMgKyB0aW1pbmdzLT52ZnAgKyB0aW1pbmdzLT52c3cgKyB0aW1pbmdzLT52YnA7CkBAIC0yNTA5LDE3ICsyMzg0LDE3IEBACiAJRFNTREJHKCJoc3luYyAlbHVIeiwgdnN5bmMgJWx1SHpcbiIsIGh0LCB2dCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc3BjX3NldF9sY2RfZGl2aXNvcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgbGNrX2RpdiwKK3N0YXRpYyB2b2lkIGRpc3BjX21ncl9zZXRfbGNkX2Rpdmlzb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTE2IGxja19kaXYsCiAJCXUxNiBwY2tfZGl2KQogewogCUJVR19PTihsY2tfZGl2IDwgMSk7Ci0JQlVHX09OKHBja19kaXYgPCAyKTsKKwlCVUdfT04ocGNrX2RpdiA8IDEpOwogCiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0RJVklTT1JvKGNoYW5uZWwpLAogCQkJRkxEX1ZBTChsY2tfZGl2LCAyMywgMTYpIHwgRkxEX1ZBTChwY2tfZGl2LCA3LCAwKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc3BjX2dldF9sY2RfZGl2aXNvcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBpbnQgKmxja19kaXYsCitzdGF0aWMgdm9pZCBkaXNwY19tZ3JfZ2V0X2xjZF9kaXZpc29yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGludCAqbGNrX2RpdiwKIAkJaW50ICpwY2tfZGl2KQogewogCXUzMiBsOwpAQCAtMjU1Miw3ICsyNDI3LDcgQEAKIAlyZXR1cm4gcjsKIH0KIAotdW5zaWduZWQgbG9uZyBkaXNwY19sY2xrX3JhdGUoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKK3Vuc2lnbmVkIGxvbmcgZGlzcGNfbWdyX2xjbGtfcmF0ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldjsKIAlpbnQgbGNkOwpAQCAtMjU4MiwxOSArMjQ1NywzNCBAQAogCXJldHVybiByIC8gbGNkOwogfQogCi11bnNpZ25lZCBsb25nIGRpc3BjX3BjbGtfcmF0ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQordW5zaWduZWQgbG9uZyBkaXNwY19tZ3JfcGNsa19yYXRlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCiB7Ci0JaW50IHBjZDsKIAl1bnNpZ25lZCBsb25nIHI7Ci0JdTMyIGw7CiAKLQlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfRElWSVNPUm8oY2hhbm5lbCkpOworCWlmIChkaXNwY19tZ3JfaXNfbGNkKGNoYW5uZWwpKSB7CisJCWludCBwY2Q7CisJCXUzMiBsOwogCi0JcGNkID0gRkxEX0dFVChsLCA3LCAwKTsKKwkJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RJVklTT1JvKGNoYW5uZWwpKTsKIAotCXIgPSBkaXNwY19sY2xrX3JhdGUoY2hhbm5lbCk7CisJCXBjZCA9IEZMRF9HRVQobCwgNywgMCk7CiAKLQlyZXR1cm4gciAvIHBjZDsKKwkJciA9IGRpc3BjX21ncl9sY2xrX3JhdGUoY2hhbm5lbCk7CisKKwkJcmV0dXJuIHIgLyBwY2Q7CisJfSBlbHNlIHsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0KKwkJCWRpc3BjX21ncl9nZXRfZGV2aWNlKGNoYW5uZWwpOworCisJCXN3aXRjaCAoZHNzZGV2LT50eXBlKSB7CisJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfVkVOQzoKKwkJCXJldHVybiB2ZW5jX2dldF9waXhlbF9jbG9jaygpOworCQljYXNlIE9NQVBfRElTUExBWV9UWVBFX0hETUk6CisJCQlyZXR1cm4gaGRtaV9nZXRfcGl4ZWxfY2xvY2soKTsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfQogfQogCiB2b2lkIGRpc3BjX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcykKQEAgLTI2MzEsMTIgKzI1MjEsMTIgQEAKIAkJZHNzX2dldF9nZW5lcmljX2Nsa19zb3VyY2VfbmFtZShsY2RfY2xrX3NyYyksCiAJCWRzc19mZWF0X2dldF9jbGtfc291cmNlX25hbWUobGNkX2Nsa19zcmMpKTsKIAotCWRpc3BjX2dldF9sY2RfZGl2aXNvcihPTUFQX0RTU19DSEFOTkVMX0xDRCwgJmxjZCwgJnBjZCk7CisJZGlzcGNfbWdyX2dldF9sY2RfZGl2aXNvcihPTUFQX0RTU19DSEFOTkVMX0xDRCwgJmxjZCwgJnBjZCk7CiAKIAlzZXFfcHJpbnRmKHMsICJsY2tcdFx0JS0xNmx1bGNrIGRpdlx0JXVcbiIsCi0JCQlkaXNwY19sY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpLCBsY2QpOworCQkJZGlzcGNfbWdyX2xjbGtfcmF0ZShPTUFQX0RTU19DSEFOTkVMX0xDRCksIGxjZCk7CiAJc2VxX3ByaW50ZihzLCAicGNrXHRcdCUtMTZsdXBjayBkaXZcdCV1XG4iLAotCQkJZGlzcGNfcGNsa19yYXRlKE9NQVBfRFNTX0NIQU5ORUxfTENEKSwgcGNkKTsKKwkJCWRpc3BjX21ncl9wY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpLCBwY2QpOwogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKIAkJc2VxX3ByaW50ZihzLCAiLSBMQ0QyIC1cbiIpOwogCkBAIC0yNjQ2LDEyICsyNTM2LDEyIEBACiAJCQlkc3NfZ2V0X2dlbmVyaWNfY2xrX3NvdXJjZV9uYW1lKGxjZF9jbGtfc3JjKSwKIAkJCWRzc19mZWF0X2dldF9jbGtfc291cmNlX25hbWUobGNkX2Nsa19zcmMpKTsKIAotCQlkaXNwY19nZXRfbGNkX2Rpdmlzb3IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyLCAmbGNkLCAmcGNkKTsKKwkJZGlzcGNfbWdyX2dldF9sY2RfZGl2aXNvcihPTUFQX0RTU19DSEFOTkVMX0xDRDIsICZsY2QsICZwY2QpOwogCiAJCXNlcV9wcmludGYocywgImxja1x0XHQlLTE2bHVsY2sgZGl2XHQldVxuIiwKLQkJCQlkaXNwY19sY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSwgbGNkKTsKKwkJCQlkaXNwY19tZ3JfbGNsa19yYXRlKE9NQVBfRFNTX0NIQU5ORUxfTENEMiksIGxjZCk7CiAJCXNlcV9wcmludGYocywgInBja1x0XHQlLTE2bHVwY2sgZGl2XHQldVxuIiwKLQkJCQlkaXNwY19wY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSwgcGNkKTsKKwkJCQlkaXNwY19tZ3JfcGNsa19yYXRlKE9NQVBfRFNTX0NIQU5ORUxfTENEMiksIHBjZCk7CiAJfQogCiAJZGlzcGNfcnVudGltZV9wdXQoKTsKQEAgLTI2OTIsNiArMjU4MiwxMCBAQAogCVBJUyhWSUQxX0VORF9XSU4pOwogCVBJUyhWSUQyX0ZJRk9fVU5ERVJGTE9XKTsKIAlQSVMoVklEMl9FTkRfV0lOKTsKKwlpZiAoZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCkgPiAzKSB7CisJCVBJUyhWSUQzX0ZJRk9fVU5ERVJGTE9XKTsKKwkJUElTKFZJRDNfRU5EX1dJTik7CisJfQogCVBJUyhTWU5DX0xPU1QpOwogCVBJUyhTWU5DX0xPU1RfRElHSVQpOwogCVBJUyhXQUtFVVApOwpAQCAtMjcwNywxMSArMjYwMSwyNiBAQAogCiB2b2lkIGRpc3BjX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCiB7CisJaW50IGksIGo7CisJY29uc3QgY2hhciAqbWdyX25hbWVzW10gPSB7CisJCVtPTUFQX0RTU19DSEFOTkVMX0xDRF0JCT0gIkxDRCIsCisJCVtPTUFQX0RTU19DSEFOTkVMX0RJR0lUXQk9ICJUViIsCisJCVtPTUFQX0RTU19DSEFOTkVMX0xDRDJdCQk9ICJMQ0QyIiwKKwl9OworCWNvbnN0IGNoYXIgKm92bF9uYW1lc1tdID0geworCQlbT01BUF9EU1NfR0ZYXQkJPSAiR0ZYIiwKKwkJW09NQVBfRFNTX1ZJREVPMV0JPSAiVklEMSIsCisJCVtPTUFQX0RTU19WSURFTzJdCT0gIlZJRDIiLAorCQlbT01BUF9EU1NfVklERU8zXQk9ICJWSUQzIiwKKwl9OworCWNvbnN0IGNoYXIgKipwX25hbWVzOworCiAjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS01MHMgJTA4eFxuIiwgI3IsIGRpc3BjX3JlYWRfcmVnKHIpKQogCiAJaWYgKGRpc3BjX3J1bnRpbWVfZ2V0KCkpCiAJCXJldHVybjsKIAorCS8qIERJU1BDIGNvbW1vbiByZWdpc3RlcnMgKi8KIAlEVU1QUkVHKERJU1BDX1JFVklTSU9OKTsKIAlEVU1QUkVHKERJU1BDX1NZU0NPTkZJRyk7CiAJRFVNUFJFRyhESVNQQ19TWVNTVEFUVVMpOwpAQCAtMjcyMCwyNDcgKzI2MjksMTM5IEBACiAJRFVNUFJFRyhESVNQQ19DT05UUk9MKTsKIAlEVU1QUkVHKERJU1BDX0NPTkZJRyk7CiAJRFVNUFJFRyhESVNQQ19DQVBBQkxFKTsKLQlEVU1QUkVHKERJU1BDX0RFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlEVU1QUkVHKERJU1BDX0RFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwotCURVTVBSRUcoRElTUENfVFJBTlNfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlEVU1QUkVHKERJU1BDX1RSQU5TX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpKTsKIAlEVU1QUkVHKERJU1BDX0xJTkVfU1RBVFVTKTsKIAlEVU1QUkVHKERJU1BDX0xJTkVfTlVNQkVSKTsKLQlEVU1QUkVHKERJU1BDX1RJTUlOR19IKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JRFVNUFJFRyhESVNQQ19USU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCURVTVBSRUcoRElTUENfUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlEVU1QUkVHKERJU1BDX0RJVklTT1JvKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0dMT0JBTF9BTFBIQSkpCisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZJWEVEX1pPUkRFUikgfHwKKwkJCWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZSRUVfWk9SREVSKSkKIAkJRFVNUFJFRyhESVNQQ19HTE9CQUxfQUxQSEEpOwotCURVTVBSRUcoRElTUENfU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwotCURVTVBSRUcoRElTUENfU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKSB7CiAJCURVTVBSRUcoRElTUENfQ09OVFJPTDIpOwogCQlEVU1QUkVHKERJU1BDX0NPTkZJRzIpOwotCQlEVU1QUkVHKERJU1BDX0RFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfVFJBTlNfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfVElNSU5HX0goT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfVElNSU5HX1YoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfRElWSVNPUm8oT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CiAJfQogCi0JRFVNUFJFRyhESVNQQ19PVkxfQkEwKE9NQVBfRFNTX0dGWCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0JBMShPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9QT1NJVElPTihPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9TSVpFKE9NQVBfRFNTX0dGWCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfR0ZYKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklGT19USFJFU0hPTEQoT01BUF9EU1NfR0ZYKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklGT19TSVpFX1NUQVRVUyhPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9ST1dfSU5DKE9NQVBfRFNTX0dGWCkpOwotCURVTVBSRUcoRElTUENfT1ZMX1BJWEVMX0lOQyhPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9XSU5ET1dfU0tJUChPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9UQUJMRV9CQShPTUFQX0RTU19HRlgpKTsKKyN1bmRlZiBEVU1QUkVHCiAKLQlEVU1QUkVHKERJU1BDX0RBVEFfQ1lDTEUxKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKyNkZWZpbmUgRElTUENfUkVHKGksIG5hbWUpIG5hbWUoaSkKKyNkZWZpbmUgRFVNUFJFRyhpLCByKSBzZXFfcHJpbnRmKHMsICIlcyglcyklKnMgJTA4eFxuIiwgI3IsIHBfbmFtZXNbaV0sIFwKKwk0OCAtIHN0cmxlbigjcikgLSBzdHJsZW4ocF9uYW1lc1tpXSksICIgIiwgXAorCWRpc3BjX3JlYWRfcmVnKERJU1BDX1JFRyhpLCByKSkpCiAKLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgewotCQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCX0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKSB7Ci0JCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTIoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJcF9uYW1lcyA9IG1ncl9uYW1lczsKKworCS8qIERJU1BDIGNoYW5uZWwgc3BlY2lmaWMgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IGRzc19mZWF0X2dldF9udW1fbWdycygpOyBpKyspIHsKKwkJRFVNUFJFRyhpLCBESVNQQ19ERUZBVUxUX0NPTE9SKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19UUkFOU19DT0xPUik7CisJCURVTVBSRUcoaSwgRElTUENfU0laRV9NR1IpOworCisJCWlmIChpID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCisJCQljb250aW51ZTsKKworCQlEVU1QUkVHKGksIERJU1BDX0RFRkFVTFRfQ09MT1IpOworCQlEVU1QUkVHKGksIERJU1BDX1RSQU5TX0NPTE9SKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19USU1JTkdfSCk7CisJCURVTVBSRUcoaSwgRElTUENfVElNSU5HX1YpOworCQlEVU1QUkVHKGksIERJU1BDX1BPTF9GUkVRKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19ESVZJU09Sbyk7CisJCURVTVBSRUcoaSwgRElTUENfU0laRV9NR1IpOworCisJCURVTVBSRUcoaSwgRElTUENfREFUQV9DWUNMRTEpOworCQlEVU1QUkVHKGksIERJU1BDX0RBVEFfQ1lDTEUyKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19EQVRBX0NZQ0xFMyk7CiAKIAkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NQUikpIHsKLQkJCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKKwkJCURVTVBSRUcoaSwgRElTUENfQ1BSX0NPRUZfUik7CisJCQlEVU1QUkVHKGksIERJU1BDX0NQUl9DT0VGX0cpOworCQkJRFVNUFJFRyhpLCBESVNQQ19DUFJfQ09FRl9CKTsKIAkJfQogCX0KIAotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKLQkJRFVNUFJFRyhESVNQQ19PVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKKwlwX25hbWVzID0gb3ZsX25hbWVzOwogCi0JRFVNUFJFRyhESVNQQ19PVkxfQkEwKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0JBMShPTUFQX0RTU19WSURFTzEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9QT1NJVElPTihPTUFQX0RTU19WSURFTzEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9TSVpFKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfVklERU8xKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklGT19USFJFU0hPTEQoT01BUF9EU1NfVklERU8xKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklGT19TSVpFX1NUQVRVUyhPTUFQX0RTU19WSURFTzEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9ST1dfSU5DKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX1BJWEVMX0lOQyhPTUFQX0RTU19WSURFTzEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVIoT01BUF9EU1NfVklERU8xKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfUElDVFVSRV9TSVpFKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0FDQ1UwKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0FDQ1UxKE9NQVBfRFNTX1ZJREVPMSkpOworCWZvciAoaSA9IDA7IGkgPCBkc3NfZmVhdF9nZXRfbnVtX292bHMoKTsgaSsrKSB7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0JBMCk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0JBMSk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX1BPU0lUSU9OKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19PVkxfU0laRSk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0FUVFJJQlVURVMpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSUZPX1RIUkVTSE9MRCk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0ZJRk9fU0laRV9TVEFUVVMpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9ST1dfSU5DKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19PVkxfUElYRUxfSU5DKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQorCQkJRFVNUFJFRyhpLCBESVNQQ19PVkxfUFJFTE9BRCk7CiAKLQlEVU1QUkVHKERJU1BDX09WTF9CQTAoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQkExKE9NQVBfRFNTX1ZJREVPMikpOwotCURVTVBSRUcoRElTUENfT1ZMX1BPU0lUSU9OKE9NQVBfRFNTX1ZJREVPMikpOwotCURVTVBSRUcoRElTUENfT1ZMX1NJWkUoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQVRUUklCVVRFUyhPTUFQX0RTU19WSURFTzIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSUZPX1RIUkVTSE9MRChPTUFQX0RTU19WSURFTzIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSUZPX1NJWkVfU1RBVFVTKE9NQVBfRFNTX1ZJREVPMikpOwotCURVTVBSRUcoRElTUENfT1ZMX1JPV19JTkMoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfUElYRUxfSU5DKE9NQVBfRFNTX1ZJREVPMikpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUihPTUFQX0RTU19WSURFTzIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9QSUNUVVJFX1NJWkUoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQUNDVTAoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQUNDVTEoT01BUF9EU1NfVklERU8yKSk7CisJCWlmIChpID09IE9NQVBfRFNTX0dGWCkgeworCQkJRFVNUFJFRyhpLCBESVNQQ19PVkxfV0lORE9XX1NLSVApOworCQkJRFVNUFJFRyhpLCBESVNQQ19PVkxfVEFCTEVfQkEpOworCQkJY29udGludWU7CisJCX0KIAotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8xLCAwKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzEsIDEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8xLCAzKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzEsIDQpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8xLCA2KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzEsIDcpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDApKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDMpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDQpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDUpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDYpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDcpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8xLCAwKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8xLCAzKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgNCkpOwotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9GSVJfQ09FRl9WKSkgewotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMCkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMykpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNCkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNykpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSVIpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9QSUNUVVJFX1NJWkUpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9BQ0NVMCk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0FDQ1UxKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSkpIHsKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0JBMF9VVik7CisJCQlEVU1QUkVHKGksIERJU1BDX09WTF9CQTFfVVYpOworCQkJRFVNUFJFRyhpLCBESVNQQ19PVkxfRklSMik7CisJCQlEVU1QUkVHKGksIERJU1BDX09WTF9BQ0NVMl8wKTsKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0FDQ1UyXzEpOworCQl9CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCisJCQlEVU1QUkVHKGksIERJU1BDX09WTF9BVFRSSUJVVEVTMik7CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX1BSRUxPQUQpOwogCX0KIAotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0JBMF9VVihPTUFQX0RTU19WSURFTzEpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfQkExX1VWKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVIyKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9BQ0NVMl8wKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9BQ0NVMl8xKE9NQVBfRFNTX1ZJREVPMSkpOworI3VuZGVmIERJU1BDX1JFRworI3VuZGVmIERVTVBSRUcKIAotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzEsIDApKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8xLCAxKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0gyKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzEsIDMpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8xLCA0KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0gyKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzEsIDYpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8xLCA3KSk7CisjZGVmaW5lIERJU1BDX1JFRyhwbGFuZSwgbmFtZSwgaSkgbmFtZShwbGFuZSwgaSkKKyNkZWZpbmUgRFVNUFJFRyhwbGFuZSwgbmFtZSwgaSkgXAorCXNlcV9wcmludGYocywgIiVzXyVkKCVzKSUqcyAlMDh4XG4iLCAjbmFtZSwgaSwgcF9uYW1lc1twbGFuZV0sIFwKKwk0NiAtIHN0cmxlbigjbmFtZSkgLSBzdHJsZW4ocF9uYW1lc1twbGFuZV0pLCAiICIsIFwKKwlkaXNwY19yZWFkX3JlZyhESVNQQ19SRUcocGxhbmUsIG5hbWUsIGkpKSkKIAotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8xLCAwKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzEsIDEpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8xLCAzKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzEsIDQpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8xLCA2KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzEsIDcpKTsKKwkvKiBWaWRlbyBwaXBlbGluZSBjb2VmZmljaWVudCByZWdpc3RlcnMgKi8KIAotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzEsIDApKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8xLCAxKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzEsIDMpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8xLCA0KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzEsIDYpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8xLCA3KSk7Ci0JfQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCi0JCURVTVBSRUcoRElTUENfT1ZMX0FUVFJJQlVURVMyKE9NQVBfRFNTX1ZJREVPMSkpOworCS8qIHN0YXJ0IGZyb20gT01BUF9EU1NfVklERU8xICovCisJZm9yIChpID0gMTsgaSA8IGRzc19mZWF0X2dldF9udW1fb3ZscygpOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0ZJUl9DT0VGX0gsIGopOwogCisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSVJfQ09FRl9IViwgaik7CiAKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMiwgMCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8yLCAxKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzIsIDIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMiwgMykpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzIsIDUpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMiwgNikpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8yLCA3KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCAwKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCAxKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCAyKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCAzKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCA1KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCA2KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCA3KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzIsIDEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCAyKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMykpOwotCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzIsIDQpKTsKKwkJZm9yIChqID0gMDsgaiA8IDU7IGorKykKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0NPTlZfQ09FRiwgaik7CiAKLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRklSX0NPRUZfVikpIHsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDApKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDEpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDIpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDMpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDQpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDUpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDYpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDcpKTsKLQl9CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9GSVJfQ09FRl9WKSkgeworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSVJfQ09FRl9WLCBqKTsKKwkJfQogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSkpIHsKLQkJRFVNUFJFRyhESVNQQ19PVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9CQTFfVVYoT01BUF9EU1NfVklERU8yKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUjIoT01BUF9EU1NfVklERU8yKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0FDQ1UyXzAoT01BUF9EU1NfVklERU8yKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0FDQ1UyXzEoT01BUF9EU1NfVklERU8yKSk7CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0ZJUl9DT0VGX0gyLCBqKTsKIAotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzIsIDApKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8yLCAxKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0gyKE9NQVBfRFNTX1ZJREVPMiwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzIsIDMpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0gyKE9NQVBfRFNTX1ZJREVPMiwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzIsIDYpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8yLCA3KSk7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0ZJUl9DT0VGX0hWMiwgaik7CiAKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMiwgMCkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8yLCAxKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzIsIDIpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMiwgMykpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzIsIDUpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMiwgNikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8yLCA3KSk7Ci0KLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8yLCAwKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMiwgMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzIsIDIpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8yLCAzKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMiwgNCkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzIsIDUpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8yLCA2KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMiwgNykpOwotCX0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQVRUUjIpKQotCQlEVU1QUkVHKERJU1BDX09WTF9BVFRSSUJVVEVTMihPTUFQX0RTU19WSURFTzIpKTsKLQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkgewotCQlEVU1QUkVHKERJU1BDX09WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSVJfQ09FRl9WMiwgaik7CisJCX0KIAl9CiAKIAlkaXNwY19ydW50aW1lX3B1dCgpOworCisjdW5kZWYgRElTUENfUkVHCiAjdW5kZWYgRFVNUFJFRwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3BvbF9mcmVxKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgb25vZmYsIGJvb2wgcmYsCi0JCWJvb2wgaWVvLCBib29sIGlwYywgYm9vbCBpaHMsIGJvb2wgaXZzLCB1OCBhY2JpLCB1OCBhY2IpCitzdGF0aWMgdm9pZCBfZGlzcGNfbWdyX3NldF9wb2xfZnJlcShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIG9ub2ZmLAorCQlib29sIHJmLCBib29sIGllbywgYm9vbCBpcGMsIGJvb2wgaWhzLCBib29sIGl2cywgdTggYWNiaSwKKwkJdTggYWNiKQogewogCXUzMiBsID0gMDsKIApAQCAtMjk3OSwxMCArMjc4MCwxMCBAQAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19QT0xfRlJFUShjaGFubmVsKSwgbCk7CiB9CiAKLXZvaWQgZGlzcGNfc2V0X3BvbF9mcmVxKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCit2b2lkIGRpc3BjX21ncl9zZXRfcG9sX2ZyZXEoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKIAkJZW51bSBvbWFwX3BhbmVsX2NvbmZpZyBjb25maWcsIHU4IGFjYmksIHU4IGFjYikKIHsKLQlfZGlzcGNfc2V0X3BvbF9mcmVxKGNoYW5uZWwsIChjb25maWcgJiBPTUFQX0RTU19MQ0RfT05PRkYpICE9IDAsCisJX2Rpc3BjX21ncl9zZXRfcG9sX2ZyZXEoY2hhbm5lbCwgKGNvbmZpZyAmIE9NQVBfRFNTX0xDRF9PTk9GRikgIT0gMCwKIAkJCShjb25maWcgJiBPTUFQX0RTU19MQ0RfUkYpICE9IDAsCiAJCQkoY29uZmlnICYgT01BUF9EU1NfTENEX0lFTykgIT0gMCwKIAkJCShjb25maWcgJiBPTUFQX0RTU19MQ0RfSVBDKSAhPSAwLApAQCAtMjk5NSwxMSArMjc5NiwxNyBAQAogdm9pZCBkaXNwY19maW5kX2Nsa19kaXZzKGJvb2wgaXNfdGZ0LCB1bnNpZ25lZCBsb25nIHJlcV9wY2ssIHVuc2lnbmVkIGxvbmcgZmNrLAogCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pCiB7Ci0JdTE2IHBjZF9taW4gPSBpc190ZnQgPyAyIDogMzsKKwl1MTYgcGNkX21pbiwgcGNkX21heDsKIAl1bnNpZ25lZCBsb25nIGJlc3RfcGNrOwogCXUxNiBiZXN0X2xkLCBjdXJfbGQ7CiAJdTE2IGJlc3RfcGQsIGN1cl9wZDsKIAorCXBjZF9taW4gPSBkc3NfZmVhdF9nZXRfcGFyYW1fbWluKEZFQVRfUEFSQU1fRFNTX1BDRCk7CisJcGNkX21heCA9IGRzc19mZWF0X2dldF9wYXJhbV9tYXgoRkVBVF9QQVJBTV9EU1NfUENEKTsKKworCWlmICghaXNfdGZ0KQorCQlwY2RfbWluID0gMzsKKwogCWJlc3RfcGNrID0gMDsKIAliZXN0X2xkID0gMDsKIAliZXN0X3BkID0gMDsKQEAgLTMwMDcsNyArMjgxNCw3IEBACiAJZm9yIChjdXJfbGQgPSAxOyBjdXJfbGQgPD0gMjU1OyArK2N1cl9sZCkgewogCQl1bnNpZ25lZCBsb25nIGxjayA9IGZjayAvIGN1cl9sZDsKIAotCQlmb3IgKGN1cl9wZCA9IHBjZF9taW47IGN1cl9wZCA8PSAyNTU7ICsrY3VyX3BkKSB7CisJCWZvciAoY3VyX3BkID0gcGNkX21pbjsgY3VyX3BkIDw9IHBjZF9tYXg7ICsrY3VyX3BkKSB7CiAJCQl1bnNpZ25lZCBsb25nIHBjayA9IGxjayAvIGN1cl9wZDsKIAkJCWxvbmcgb2xkX2RlbHRhID0gYWJzKGJlc3RfcGNrIC0gcmVxX3Bjayk7CiAJCQlsb25nIG5ld19kZWx0YSA9IGFicyhwY2sgLSByZXFfcGNrKTsKQEAgLTMwNDIsNyArMjg0OSw3IEBACiB7CiAJaWYgKGNpbmZvLT5sY2tfZGl2ID4gMjU1IHx8IGNpbmZvLT5sY2tfZGl2ID09IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChjaW5mby0+cGNrX2RpdiA8IDIgfHwgY2luZm8tPnBja19kaXYgPiAyNTUpCisJaWYgKGNpbmZvLT5wY2tfZGl2IDwgMSB8fCBjaW5mby0+cGNrX2RpdiA+IDI1NSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljaW5mby0+bGNrID0gZGlzcGNfZmNsa19yYXRlIC8gY2luZm8tPmxja19kaXY7CkBAIC0zMDUxLDE4ICsyODU4LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkaXNwY19zZXRfY2xvY2tfZGl2KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCitpbnQgZGlzcGNfbWdyX3NldF9jbG9ja19kaXYoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKIAkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKQogewogCURTU0RCRygibGNrID0gJWx1ICgldSlcbiIsIGNpbmZvLT5sY2ssIGNpbmZvLT5sY2tfZGl2KTsKIAlEU1NEQkcoInBjayA9ICVsdSAoJXUpXG4iLCBjaW5mby0+cGNrLCBjaW5mby0+cGNrX2Rpdik7CiAKLQlkaXNwY19zZXRfbGNkX2Rpdmlzb3IoY2hhbm5lbCwgY2luZm8tPmxja19kaXYsIGNpbmZvLT5wY2tfZGl2KTsKKwlkaXNwY19tZ3Jfc2V0X2xjZF9kaXZpc29yKGNoYW5uZWwsIGNpbmZvLT5sY2tfZGl2LCBjaW5mby0+cGNrX2Rpdik7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRpc3BjX2dldF9jbG9ja19kaXYoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKK2ludCBkaXNwY19tZ3JfZ2V0X2Nsb2NrX2RpdihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAogCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pCiB7CiAJdW5zaWduZWQgbG9uZyBmY2s7CkBAIC0zMjA3LDYgKzMwMTQsOCBAQAogCVBJUyhPQ1BfRVJSKTsKIAlQSVMoVklEMV9GSUZPX1VOREVSRkxPVyk7CiAJUElTKFZJRDJfRklGT19VTkRFUkZMT1cpOworCWlmIChkc3NfZmVhdF9nZXRfbnVtX292bHMoKSA+IDMpCisJCVBJUyhWSUQzX0ZJRk9fVU5ERVJGTE9XKTsKIAlQSVMoU1lOQ19MT1NUKTsKIAlQSVMoU1lOQ19MT1NUX0RJR0lUKTsKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKQpAQCAtMzMwMCwxNzggKzMxMDksNzIgQEAKIAlpbnQgaTsKIAl1MzIgZXJyb3JzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGZpZm9fdW5kZXJmbG93X2JpdHNbXSA9IHsKKwkJRElTUENfSVJRX0dGWF9GSUZPX1VOREVSRkxPVywKKwkJRElTUENfSVJRX1ZJRDFfRklGT19VTkRFUkZMT1csCisJCURJU1BDX0lSUV9WSUQyX0ZJRk9fVU5ERVJGTE9XLAorCQlESVNQQ19JUlFfVklEM19GSUZPX1VOREVSRkxPVywKKwl9OworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN5bmNfbG9zdF9iaXRzW10gPSB7CisJCURJU1BDX0lSUV9TWU5DX0xPU1QsCisJCURJU1BDX0lSUV9TWU5DX0xPU1RfRElHSVQsCisJCURJU1BDX0lSUV9TWU5DX0xPU1QyLAorCX07CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKIAllcnJvcnMgPSBkaXNwYy5lcnJvcl9pcnFzOwogCWRpc3BjLmVycm9yX2lycXMgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpc3BjLmlycV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXJyb3JzICYgRElTUENfSVJRX0dGWF9GSUZPX1VOREVSRkxPVykgewotCQlEU1NFUlIoIkdGWF9GSUZPX1VOREVSRkxPVywgZGlzYWJsaW5nIEdGWFxuIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKCk7ICsraSkgewotCQkJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOwotCQkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CisJZGlzcGNfcnVudGltZV9nZXQoKTsKIAotCQkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCi0JCQkJY29udGludWU7CisJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7CisJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKKwkJdW5zaWduZWQgYml0OwogCi0JCQlpZiAob3ZsLT5pZCA9PSAwKSB7Ci0JCQkJZGlzcGNfZW5hYmxlX3BsYW5lKG92bC0+aWQsIDApOwotCQkJCWRpc3BjX2dvKG92bC0+bWFuYWdlci0+aWQpOwotCQkJCW1kZWxheSg1MCk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCW92bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KGkpOworCQliaXQgPSBmaWZvX3VuZGVyZmxvd19iaXRzW2ldOworCisJCWlmIChiaXQgJiBlcnJvcnMpIHsKKwkJCURTU0VSUigiRklGTyBVTkRFUkZMT1cgb24gJXMsIGRpc2FibGluZyB0aGUgb3ZlcmxheVxuIiwKKwkJCQkJb3ZsLT5uYW1lKTsKKwkJCWRpc3BjX292bF9lbmFibGUob3ZsLT5pZCwgZmFsc2UpOworCQkJZGlzcGNfbWdyX2dvKG92bC0+bWFuYWdlci0+aWQpOworCQkJbWRlbGF5KDUwKTsKIAkJfQogCX0KIAotCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfVklEMV9GSUZPX1VOREVSRkxPVykgewotCQlEU1NFUlIoIlZJRDFfRklGT19VTkRFUkZMT1csIGRpc2FibGluZyBWSUQxXG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7Ci0JCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7Ci0JCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKKwlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgeworCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKKwkJdW5zaWduZWQgYml0OwogCi0JCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKLQkJCQljb250aW51ZTsKKwkJbWdyID0gb21hcF9kc3NfZ2V0X292ZXJsYXlfbWFuYWdlcihpKTsKKwkJYml0ID0gc3luY19sb3N0X2JpdHNbaV07CiAKLQkJCWlmIChvdmwtPmlkID09IDEpIHsKLQkJCQlkaXNwY19lbmFibGVfcGxhbmUob3ZsLT5pZCwgMCk7Ci0JCQkJZGlzcGNfZ28ob3ZsLT5tYW5hZ2VyLT5pZCk7Ci0JCQkJbWRlbGF5KDUwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKwkJaWYgKGJpdCAmIGVycm9ycykgeworCQkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gbWdyLT5kZXZpY2U7CisJCQlib29sIGVuYWJsZTsKIAotCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfVklEMl9GSUZPX1VOREVSRkxPVykgewotCQlEU1NFUlIoIlZJRDJfRklGT19VTkRFUkZMT1csIGRpc2FibGluZyBWSUQyXG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7Ci0JCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7Ci0JCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKKwkJCURTU0VSUigiU1lOQ19MT1NUIG9uIGNoYW5uZWwgJXMsIHJlc3RhcnRpbmcgdGhlIG91dHB1dCAiCisJCQkJCSJ3aXRoIHZpZGVvIG92ZXJsYXlzIGRpc2FibGVkXG4iLAorCQkJCQltZ3ItPm5hbWUpOwogCi0JCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKLQkJCQljb250aW51ZTsKKwkJCWVuYWJsZSA9IGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisJCQlkc3NkZXYtPmRyaXZlci0+ZGlzYWJsZShkc3NkZXYpOwogCi0JCQlpZiAob3ZsLT5pZCA9PSAyKSB7Ci0JCQkJZGlzcGNfZW5hYmxlX3BsYW5lKG92bC0+aWQsIDApOwotCQkJCWRpc3BjX2dvKG92bC0+bWFuYWdlci0+aWQpOwotCQkJCW1kZWxheSg1MCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoZXJyb3JzICYgRElTUENfSVJRX1NZTkNfTE9TVCkgewotCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1hbmFnZXIgPSBOVUxMOwotCQlib29sIGVuYWJsZSA9IGZhbHNlOwotCi0JCURTU0VSUigiU1lOQ19MT1NULCBkaXNhYmxpbmcgTENEXG4iKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgewotCQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7Ci0JCQltZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGkpOwotCi0JCQlpZiAobWdyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgewotCQkJCW1hbmFnZXIgPSBtZ3I7Ci0JCQkJZW5hYmxlID0gbWdyLT5kZXZpY2UtPnN0YXRlID09Ci0JCQkJCQlPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKLQkJCQltZ3ItPmRldmljZS0+ZHJpdmVyLT5kaXNhYmxlKG1nci0+ZGV2aWNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChtYW5hZ2VyKSB7Ci0JCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBtYW5hZ2VyLT5kZXZpY2U7CiAJCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5cygpOyArK2kpIHsKIAkJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CiAJCQkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CiAKLQkJCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAob3ZsLT5pZCAhPSAwICYmIG92bC0+bWFuYWdlciA9PSBtYW5hZ2VyKQotCQkJCQlkaXNwY19lbmFibGVfcGxhbmUob3ZsLT5pZCwgMCk7CisJCQkJaWYgKG92bC0+aWQgIT0gT01BUF9EU1NfR0ZYICYmCisJCQkJCQlvdmwtPm1hbmFnZXIgPT0gbWdyKQorCQkJCQlkaXNwY19vdmxfZW5hYmxlKG92bC0+aWQsIGZhbHNlKTsKIAkJCX0KIAotCQkJZGlzcGNfZ28obWFuYWdlci0+aWQpOworCQkJZGlzcGNfbWdyX2dvKG1nci0+aWQpOwogCQkJbWRlbGF5KDUwKTsKLQkJCWlmIChlbmFibGUpCi0JCQkJZHNzZGV2LT5kcml2ZXItPmVuYWJsZShkc3NkZXYpOwotCQl9Ci0JfQogCi0JaWYgKGVycm9ycyAmIERJU1BDX0lSUV9TWU5DX0xPU1RfRElHSVQpIHsKLQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptYW5hZ2VyID0gTlVMTDsKLQkJYm9vbCBlbmFibGUgPSBmYWxzZTsKLQotCQlEU1NFUlIoIlNZTkNfTE9TVF9ESUdJVCwgZGlzYWJsaW5nIFRWXG4iKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgewotCQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7Ci0JCQltZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGkpOwotCi0JCQlpZiAobWdyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKSB7Ci0JCQkJbWFuYWdlciA9IG1ncjsKLQkJCQllbmFibGUgPSBtZ3ItPmRldmljZS0+c3RhdGUgPT0KLQkJCQkJCU9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFOwotCQkJCW1nci0+ZGV2aWNlLT5kcml2ZXItPmRpc2FibGUobWdyLT5kZXZpY2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1hbmFnZXIpIHsKLQkJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IG1hbmFnZXItPmRldmljZTsKLQkJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKCk7ICsraSkgewotCQkJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKLQkJCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKLQotCQkJCWlmICghKG92bC0+Y2FwcyAmIE9NQVBfRFNTX09WTF9DQVBfRElTUEMpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChvdmwtPmlkICE9IDAgJiYgb3ZsLT5tYW5hZ2VyID09IG1hbmFnZXIpCi0JCQkJCWRpc3BjX2VuYWJsZV9wbGFuZShvdmwtPmlkLCAwKTsKLQkJCX0KLQotCQkJZGlzcGNfZ28obWFuYWdlci0+aWQpOwotCQkJbWRlbGF5KDUwKTsKLQkJCWlmIChlbmFibGUpCi0JCQkJZHNzZGV2LT5kcml2ZXItPmVuYWJsZShkc3NkZXYpOwotCQl9Ci0JfQotCi0JaWYgKGVycm9ycyAmIERJU1BDX0lSUV9TWU5DX0xPU1QyKSB7Ci0JCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWFuYWdlciA9IE5VTEw7Ci0JCWJvb2wgZW5hYmxlID0gZmFsc2U7Ci0KLQkJRFNTRVJSKCJTWU5DX0xPU1QgZm9yIExDRDIsIGRpc2FibGluZyBMQ0QyXG4iKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgewotCQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7Ci0JCQltZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGkpOwotCi0JCQlpZiAobWdyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpIHsKLQkJCQltYW5hZ2VyID0gbWdyOwotCQkJCWVuYWJsZSA9IG1nci0+ZGV2aWNlLT5zdGF0ZSA9PQotCQkJCQkJT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7Ci0JCQkJbWdyLT5kZXZpY2UtPmRyaXZlci0+ZGlzYWJsZShtZ3ItPmRldmljZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobWFuYWdlcikgewotCQkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gbWFuYWdlci0+ZGV2aWNlOwotCQkJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7Ci0JCQkJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOwotCQkJCW92bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KGkpOwotCi0JCQkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKG92bC0+aWQgIT0gMCAmJiBvdmwtPm1hbmFnZXIgPT0gbWFuYWdlcikKLQkJCQkJZGlzcGNfZW5hYmxlX3BsYW5lKG92bC0+aWQsIDApOwotCQkJfQotCi0JCQlkaXNwY19nbyhtYW5hZ2VyLT5pZCk7Ci0JCQltZGVsYXkoNTApOwogCQkJaWYgKGVuYWJsZSkKIAkJCQlkc3NkZXYtPmRyaXZlci0+ZW5hYmxlKGRzc2Rldik7CiAJCX0KQEAgLTM0ODIsOSArMzE4NSw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlfbWFuYWdlcnMoKTsgKytpKSB7CiAJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKIAkJCW1nciA9IG9tYXBfZHNzX2dldF9vdmVybGF5X21hbmFnZXIoaSk7Ci0KLQkJCWlmIChtZ3ItPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKQotCQkJCW1nci0+ZGV2aWNlLT5kcml2ZXItPmRpc2FibGUobWdyLT5kZXZpY2UpOworCQkJbWdyLT5kZXZpY2UtPmRyaXZlci0+ZGlzYWJsZShtZ3ItPmRldmljZSk7CiAJCX0KIAl9CiAKQEAgLTM0OTIsNiArMzE5Myw4IEBACiAJZGlzcGMuaXJxX2Vycm9yX21hc2sgfD0gZXJyb3JzOwogCV9vbWFwX2Rpc3BjX3NldF9pcnFzKCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKKworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiB9CiAKIGludCBvbWFwX2Rpc3BjX3dhaXRfZm9yX2lycV90aW1lb3V0KHUzMiBpcnFtYXNrLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCkBAIC0zNTg2LDYgKzMyODksOCBAQAogCWRpc3BjLmlycV9lcnJvcl9tYXNrID0gRElTUENfSVJRX01BU0tfRVJST1I7CiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkKIAkJZGlzcGMuaXJxX2Vycm9yX21hc2sgfD0gRElTUENfSVJRX1NZTkNfTE9TVDI7CisJaWYgKGRzc19mZWF0X2dldF9udW1fb3ZscygpID4gMykKKwkJZGlzcGMuaXJxX2Vycm9yX21hc2sgfD0gRElTUENfSVJRX1ZJRDNfRklGT19VTkRFUkZMT1c7CiAKIAkvKiB0aGVyZSdzIFNZTkNfTE9TVF9ESUdJVCB3YWl0aW5nIGFmdGVyIGVuYWJsaW5nIHRoZSBEU1MsCiAJICogc28gY2xlYXIgaXQgKi8KQEAgLTM2MzUsNiArMzM0MCw4IEBACiAJZGlzcGNfcmVhZF9wbGFuZV9maWZvX3NpemVzKCk7CiAKIAlkaXNwY19jb25maWd1cmVfYnVyc3Rfc2l6ZXMoKTsKKworCWRpc3BjX292bF9lbmFibGVfem9yZGVyX3BsYW5lcygpOwogfQogCiAvKiBESVNQQyBIVyBJUCBpbml0aWFsaXNhdGlvbiAqLwpAQCAtMzczNCw3ICszNDQxLDYgQEAKIHN0YXRpYyBpbnQgZGlzcGNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlkaXNwY19zYXZlX2NvbnRleHQoKTsKLQljbGtfZGlzYWJsZShkaXNwYy5kc3NfY2xrKTsKIAlkc3NfcnVudGltZV9wdXQoKTsKIAogCXJldHVybiAwOwpAQCAtMzc0OCw3ICszNDU0LDYgQEAKIAlpZiAociA8IDApCiAJCXJldHVybiByOwogCi0JY2xrX2VuYWJsZShkaXNwYy5kc3NfY2xrKTsKIAlkaXNwY19yZXN0b3JlX2NvbnRleHQoKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmgKaW5kZXggNmM5ZWUwYS4uYzA2ZWZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5oCkBAIC0yOTEsNiArMjkxLDggQEAKIAkJcmV0dXJuIDB4MDBCQzsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDE0QzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDMwMDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zMDQsNiArMzA2LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAwMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAwODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zMTYsNiArMzIwLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAwNDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAwQzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zMzAsNiArMzM2LDggQEAKIAkJcmV0dXJuIDB4MDU0NDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDRCQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDMxMDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zNDQsNiArMzUyLDggQEAKIAkJcmV0dXJuIDB4MDU0ODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDRDMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDMxNDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zNTYsNiArMzY2LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAwODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA5QzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zNjgsNiArMzgwLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAwQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDBBODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zODEsNiArMzk1LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAxMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA3MDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zOTUsNiArNDExLDggQEAKIAkJcmV0dXJuIDB4MDU2ODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDREQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDMyQzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00MDgsNiArNDI2LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAxNDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA4QzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00MjEsNiArNDQxLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAxODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA4ODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00MzQsNiArNDU2LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAxQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDBBNDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00NDcsNiArNDcxLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAyMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA5ODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00NTksNiArNDg1LDcgQEAKIAkJcmV0dXJuIDB4MDAzNDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKIAkJQlVHKCk7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC00NzIsNiArNDk5LDcgQEAKIAkJcmV0dXJuIDB4MDAzODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKIAkJQlVHKCk7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC00ODYsNiArNTE0LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAyNDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA5MDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01MDAsNiArNTMwLDggQEAKIAkJcmV0dXJuIDB4MDU4MDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU1QzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDQyNDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01MTMsNiArNTQ1LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAyODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA5NDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01MjcsNiArNTYxLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAyQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAwMDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01NDEsNiArNTc3LDggQEAKIAkJcmV0dXJuIDB4MDU4NDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU2MDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDQyODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01NTQsNiArNTkyLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAzMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAwNDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01NjgsNiArNjA4LDggQEAKIAkJcmV0dXJuIDB4MDU4ODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU2NDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDQyQzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01ODIsNiArNjI0LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAzNCArIGkgKiAweDg7CisJY2FzZSBPTUFQX0RTU19WSURFTzM6CisJCXJldHVybiAweDAwMTAgKyBpICogMHg4OwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTU5Nyw2ICs2NDEsOCBAQAogCQlyZXR1cm4gMHgwNThDICsgaSAqIDB4ODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU2OCArIGkgKiAweDg7CisJY2FzZSBPTUFQX0RTU19WSURFTzM6CisJCXJldHVybiAweDA0MzAgKyBpICogMHg4OwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTYxMSw2ICs2NTcsOCBAQAogCWNhc2UgT01BUF9EU1NfVklERU8xOgogCWNhc2UgT01BUF9EU1NfVklERU8yOgogCQlyZXR1cm4gMHgwMDM4ICsgaSAqIDB4ODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAxNCArIGkgKiAweDg7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpAQCAtNjI2LDYgKzY3NCw4IEBACiAJCXJldHVybiAweDA1OTAgKyBpICogODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU2QyArIGkgKiAweDg7CisJY2FzZSBPTUFQX0RTU19WSURFTzM6CisJCXJldHVybiAweDA0MzQgKyBpICogMHg4OwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTYzOSw2ICs2ODksNyBAQAogCQlCVUcoKTsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKIAkJcmV0dXJuIDB4MDA3NCArIGkgKiAweDQ7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC02NTUsNiArNzA2LDggQEAKIAkJcmV0dXJuIDB4MDEyNCArIGkgKiAweDQ7CiAJY2FzZSBPTUFQX0RTU19WSURFTzI6CiAJCXJldHVybiAweDAwQjQgKyBpICogMHg0OworCWNhc2UgT01BUF9EU1NfVklERU8zOgorCQlyZXR1cm4gMHgwMDUwICsgaSAqIDB4NDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC02NzAsNiArNzIzLDggQEAKIAkJcmV0dXJuIDB4MDVDQyArIGkgKiAweDQ7CiAJY2FzZSBPTUFQX0RTU19WSURFTzI6CiAJCXJldHVybiAweDA1QTggKyBpICogMHg0OworCWNhc2UgT01BUF9EU1NfVklERU8zOgorCQlyZXR1cm4gMHgwNDcwICsgaSAqIDB4NDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC02ODQsNiArNzM5LDggQEAKIAkJcmV0dXJuIDB4MDE3NDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDBFODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDBBMDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwbGF5LmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwbGF5LmMKaW5kZXggOTQ0OTVlNC4uYmUzMzFkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BsYXkuYwpAQCAtNDUsMTQgKzQ1LDEzIEBACiAJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOwotCWludCByLCBlbmFibGVkOworCWludCByOworCWJvb2wgZW5hYmxlZDsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmZW5hYmxlZCk7CisJciA9IHN0cnRvYm9vbChidWYsICZlbmFibGVkKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQllbmFibGVkID0gISFlbmFibGVkOwotCiAJaWYgKGVuYWJsZWQgIT0gKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkpIHsKIAkJaWYgKGVuYWJsZWQpIHsKIAkJCXIgPSBkc3NkZXYtPmRyaXZlci0+ZW5hYmxlKGRzc2Rldik7CkBAIC03OSwxNyArNzgsMTYgQEAKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOwotCWludCB0ZSwgcjsKKwlpbnQgcjsKKwlib29sIHRlOwogCiAJaWYgKCFkc3NkZXYtPmRyaXZlci0+ZW5hYmxlX3RlIHx8ICFkc3NkZXYtPmRyaXZlci0+Z2V0X3RlKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmdGUpOworCXIgPSBzdHJ0b2Jvb2woYnVmLCAmdGUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCXRlID0gISF0ZTsKLQogCXIgPSBkc3NkZXYtPmRyaXZlci0+ZW5hYmxlX3RlKGRzc2RldiwgdGUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTE5NSwxNyArMTkzLDE2IEBACiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKLQlpbnQgbWlycm9yLCByOworCWludCByOworCWJvb2wgbWlycm9yOwogCiAJaWYgKCFkc3NkZXYtPmRyaXZlci0+c2V0X21pcnJvciB8fCAhZHNzZGV2LT5kcml2ZXItPmdldF9taXJyb3IpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JciA9IGtzdHJ0b2ludChidWYsIDAsICZtaXJyb3IpOworCXIgPSBzdHJ0b2Jvb2woYnVmLCAmbWlycm9yKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQltaXJyb3IgPSAhIW1pcnJvcjsKLQogCXIgPSBkc3NkZXYtPmRyaXZlci0+c2V0X21pcnJvcihkc3NkZXYsIG1pcnJvcik7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtMzAyLDExICsyOTksMTUgQEAKIAkJCXJldHVybiAxNjsKIAogCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfREJJOgotCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFNJOgogCQlpZiAoZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUgPT0gMjQpCiAJCQlyZXR1cm4gMjQ7CiAJCWVsc2UKIAkJCXJldHVybiAxNjsKKwljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RTSToKKwkJaWYgKGRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KSA+IDE2KQorCQkJcmV0dXJuIDI0OworCQllbHNlCisJCQlyZXR1cm4gMTY7CiAJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DOgogCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfU0RJOgogCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfSERNSToKQEAgLTM0Miw5ICszNDMsMTEgQEAKIAkJYnBwID0gMjQ7CiAJCWJyZWFrOwogCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfREJJOgotCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFNJOgogCQlicHAgPSBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZTsKIAkJYnJlYWs7CisJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9EU0k6CisJCWJwcCA9IGRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kcGkuYwppbmRleCBmMDUzYjE4Li45NzZhYzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kcGkuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kcGkuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtODIsOSArODMsMTEgQEAKIAogCWRzc19zZWxlY3RfZGlzcGNfY2xrX3NvdXJjZShkc3NkZXYtPmNsb2Nrcy5kaXNwYy5kaXNwY19mY2xrX3NyYyk7CiAKLQlyID0gZGlzcGNfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOwotCWlmIChyKQorCXIgPSBkaXNwY19tZ3Jfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOworCWlmIChyKSB7CisJCWRzc19zZWxlY3RfZGlzcGNfY2xrX3NvdXJjZShPTUFQX0RTU19DTEtfU1JDX0ZDSyk7CiAJCXJldHVybiByOworCX0KIAogCSpmY2sgPSBkc2lfY2luZm8uZHNpX3BsbF9oc2Rpdl9kaXNwY19jbGs7CiAJKmxja19kaXYgPSBkaXNwY19jaW5mby5sY2tfZGl2OwpAQCAtMTA5LDcgKzExMiw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JciA9IGRpc3BjX3NldF9jbG9ja19kaXYoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJmRpc3BjX2NpbmZvKTsKKwlyID0gZGlzcGNfbWdyX3NldF9jbG9ja19kaXYoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJmRpc3BjX2NpbmZvKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTEyOSw3ICsxMzIsNyBAQAogCWJvb2wgaXNfdGZ0OwogCWludCByID0gMDsKIAotCWRpc3BjX3NldF9wb2xfZnJlcShkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPnBhbmVsLmNvbmZpZywKKwlkaXNwY19tZ3Jfc2V0X3BvbF9mcmVxKGRzc2Rldi0+bWFuYWdlci0+aWQsIGRzc2Rldi0+cGFuZWwuY29uZmlnLAogCQkJZHNzZGV2LT5wYW5lbC5hY2JpLCBkc3NkZXYtPnBhbmVsLmFjYik7CiAKIAlpc190ZnQgPSAoZHNzZGV2LT5wYW5lbC5jb25maWcgJiBPTUFQX0RTU19MQ0RfVEZUKSAhPSAwOwpAQCAtMTUzLDcgKzE1Niw3IEBACiAJCXQtPnBpeGVsX2Nsb2NrID0gcGNrOwogCX0KIAotCWRpc3BjX3NldF9sY2RfdGltaW5ncyhkc3NkZXYtPm1hbmFnZXItPmlkLCB0KTsKKwlkaXNwY19tZ3Jfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsIHQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjQsMTEgKzE2NywxMiBAQAogCiAJaXNfdGZ0ID0gKGRzc2Rldi0+cGFuZWwuY29uZmlnICYgT01BUF9EU1NfTENEX1RGVCkgIT0gMDsKIAotCWRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShkc3NkZXYtPm1hbmFnZXItPmlkLAotCQkJT01BUF9EU1NfUEFSQUxMRUxNT0RFX0JZUEFTUyk7Ci0JZGlzcGNfc2V0X2xjZF9kaXNwbGF5X3R5cGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgaXNfdGZ0ID8KKwlkaXNwY19tZ3Jfc2V0X2lvX3BhZF9tb2RlKERTU19JT19QQURfTU9ERV9CWVBBU1MpOworCWRpc3BjX21ncl9lbmFibGVfc3RhbGxtb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsIGZhbHNlKTsKKworCWRpc3BjX21ncl9zZXRfbGNkX2Rpc3BsYXlfdHlwZShkc3NkZXYtPm1hbmFnZXItPmlkLCBpc190ZnQgPwogCQkJT01BUF9EU1NfTENEX0RJU1BMQVlfVEZUIDogT01BUF9EU1NfTENEX0RJU1BMQVlfU1ROKTsKLQlkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXMoZHNzZGV2LT5tYW5hZ2VyLT5pZCwKKwlkaXNwY19tZ3Jfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsCiAJCQlkc3NkZXYtPnBoeS5kcGkuZGF0YV9saW5lcyk7CiB9CiAKQEAgLTE3Niw2ICsxODAsMTEgQEAKIHsKIAlpbnQgcjsKIAorCWlmIChkc3NkZXYtPm1hbmFnZXIgPT0gTlVMTCkgeworCQlEU1NFUlIoImZhaWxlZCB0byBlbmFibGUgZGlzcGxheTogbm8gbWFuYWdlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKIAlpZiAocikgewogCQlEU1NFUlIoImZhaWxlZCB0byBzdGFydCBkZXZpY2VcbiIpOwpAQCAtMjc3LDcgKzI4Niw3IEBACiAJCX0KIAogCQlkcGlfc2V0X21vZGUoZHNzZGV2KTsKLQkJZGlzcGNfZ28oZHNzZGV2LT5tYW5hZ2VyLT5pZCk7CisJCWRpc3BjX21ncl9nbyhkc3NkZXYtPm1hbmFnZXItPmlkKTsKIAogCQlkaXNwY19ydW50aW1lX3B1dCgpOwogCQlkc3NfcnVudGltZV9wdXQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNpLmMKaW5kZXggN2FkYmJlYi4uNWFiZjhlN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0zOSw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgorI2luY2x1ZGUgPHZpZGVvL21pcGlfZGlzcGxheS5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KIAogI2luY2x1ZGUgImRzcy5oIgpAQCAtMTMxLDcgKzEzMyw3IEBACiAjZGVmaW5lIERTSV9JUlFfVEFfVElNRU9VVAkoMSA8PCAyMCkKICNkZWZpbmUgRFNJX0lSUV9FUlJPUl9NQVNLIFwKIAkoRFNJX0lSUV9IU19UWF9USU1FT1VUIHwgRFNJX0lSUV9MUF9SWF9USU1FT1VUIHwgRFNJX0lSUV9TWU5DX0xPU1QgfCBcCi0JRFNJX0lSUV9UQV9USU1FT1VUKQorCURTSV9JUlFfVEFfVElNRU9VVCB8IERTSV9JUlFfU1lOQ19MT1NUKQogI2RlZmluZSBEU0lfSVJRX0NIQU5ORUxfTUFTSwkweGYKIAogLyogVmlydHVhbCBjaGFubmVsIGludGVycnVwdHMgKi8KQEAgLTE5OCwxOCArMjAwLDYgQEAKIAkgRFNJX0NJT19JUlFfRVJSQ09OVEVOVElPTkxQMF80IHwgRFNJX0NJT19JUlFfRVJSQ09OVEVOVElPTkxQMV80IHwgXAogCSBEU0lfQ0lPX0lSUV9FUlJDT05URU5USU9OTFAwXzUgfCBEU0lfQ0lPX0lSUV9FUlJDT05URU5USU9OTFAxXzUpCiAKLSNkZWZpbmUgRFNJX0RUX0RDU19TSE9SVF9XUklURV8wCTB4MDUKLSNkZWZpbmUgRFNJX0RUX0RDU19TSE9SVF9XUklURV8xCTB4MTUKLSNkZWZpbmUgRFNJX0RUX0RDU19SRUFECQkJMHgwNgotI2RlZmluZSBEU0lfRFRfU0VUX01BWF9SRVRfUEtHX1NJWkUJMHgzNwotI2RlZmluZSBEU0lfRFRfTlVMTF9QQUNLRVQJCTB4MDkKLSNkZWZpbmUgRFNJX0RUX0RDU19MT05HX1dSSVRFCQkweDM5Ci0KLSNkZWZpbmUgRFNJX0RUX1JYX0FDS19XSVRIX0VSUgkJMHgwMgotI2RlZmluZSBEU0lfRFRfUlhfRENTX0xPTkdfUkVBRAkJMHgxYwotI2RlZmluZSBEU0lfRFRfUlhfU0hPUlRfUkVBRF8xCQkweDIxCi0jZGVmaW5lIERTSV9EVF9SWF9TSE9SVF9SRUFEXzIJCTB4MjIKLQogdHlwZWRlZiB2b2lkICgqb21hcF9kc2lfaXNyX3QpICh2b2lkICphcmcsIHUzMiBtYXNrKTsKIAogI2RlZmluZSBEU0lfTUFYX05SX0lTUlMgICAgICAgICAgICAgICAgMgpAQCAtMjI4LDkgKzIxOCw5IEBACiAJRFNJX0ZJRk9fU0laRV8xMjgJPSA0LAogfTsKIAotZW51bSBkc2lfdmNfbW9kZSB7Ci0JRFNJX1ZDX01PREVfTDQgPSAwLAotCURTSV9WQ19NT0RFX1ZQLAorZW51bSBkc2lfdmNfc291cmNlIHsKKwlEU0lfVkNfU09VUkNFX0w0ID0gMCwKKwlEU0lfVkNfU09VUkNFX1ZQLAogfTsKIAogZW51bSBkc2lfbGFuZSB7CkBAIC0yNzQsNyArMjY0LDggQEAKIAlzdHJ1Y3QgY2xrICpkc3NfY2xrOwogCXN0cnVjdCBjbGsgKnN5c19jbGs7CiAKLQl2b2lkICgqZHNpX211eF9wYWRzKShib29sIGVuYWJsZSk7CisJaW50ICgqZW5hYmxlX3BhZHMpKGludCBkc2lfaWQsIHVuc2lnbmVkIGxhbmVfbWFzayk7CisJdm9pZCAoKmRpc2FibGVfcGFkcykoaW50IGRzaV9pZCwgdW5zaWduZWQgbGFuZV9tYXNrKTsKIAogCXN0cnVjdCBkc2lfY2xvY2tfaW5mbyBjdXJyZW50X2NpbmZvOwogCkBAIC0yODIsNyArMjczLDcgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yICp2ZGRzX2RzaV9yZWc7CiAKIAlzdHJ1Y3QgewotCQllbnVtIGRzaV92Y19tb2RlIG1vZGU7CisJCWVudW0gZHNpX3ZjX3NvdXJjZSBzb3VyY2U7CiAJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldjsKIAkJZW51bSBmaWZvX3NpemUgZmlmb19zaXplOwogCQlpbnQgdmNfaWQ7CkBAIC0zNjgsMTQgKzM1OSw5IEBACiAJcmV0dXJuIGRzaV9wZGV2X21hcFttb2R1bGVdOwogfQogCi1zdGF0aWMgaW50IGRzaV9nZXRfZHNpZGV2X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3N0YXRpYyBpbmxpbmUgaW50IGRzaV9nZXRfZHNpZGV2X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKIHsKLQkvKiBURU1QOiBQYXNzIDAgYXMgdGhlIGRzaSBtb2R1bGUgaW5kZXggdGlsbCB0aGUgdGltZSB0aGUgZHNpIHBsYXRmb3JtCi0JICogZGV2aWNlIG5hbWVzIGFyZW4ndCBjaGFuZ2VkIHRvIHRoZSBmb3JtICJvbWFwZHNzX2RzaS4wIiwKLQkgKiAib21hcGRzc19kc2kuMSIgYW5kIHNvIG9uICovCi0JQlVHX09OKGRzaWRldi0+aWQgIT0gLTEpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGRzaWRldi0+aWQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkc2lfd3JpdGVfcmVnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwKQEAgLTQzNyw2ICs0MjMsMjEgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKK3U4IGRzaV9nZXRfcGl4ZWxfc2l6ZShlbnVtIG9tYXBfZHNzX2RzaV9waXhlbF9mb3JtYXQgZm10KQoreworCXN3aXRjaCAoZm10KSB7CisJY2FzZSBPTUFQX0RTU19EU0lfRk1UX1JHQjg4ODoKKwljYXNlIE9NQVBfRFNTX0RTSV9GTVRfUkdCNjY2OgorCQlyZXR1cm4gMjQ7CisJY2FzZSBPTUFQX0RTU19EU0lfRk1UX1JHQjY2Nl9QQUNLRUQ6CisJCXJldHVybiAxODsKKwljYXNlIE9NQVBfRFNTX0RTSV9GTVRfUkdCNTY1OgorCQlyZXR1cm4gMTY7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCiAjaWZkZWYgREVCVUcKIHN0YXRpYyB2b2lkIGRzaV9wZXJmX21hcmtfc2V0dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQogewpAQCAtNDUzLDYgKzQ1NCw3IEBACiBzdGF0aWMgdm9pZCBkc2lfcGVyZl9zaG93KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBkc2ktPnVwZGF0ZV9yZWdpb24uZGV2aWNlOwogCWt0aW1lX3QgdCwgc2V0dXBfdGltZSwgdHJhbnNfdGltZTsKIAl1MzIgdG90YWxfYnl0ZXM7CiAJdTMyIHNldHVwX3VzLCB0cmFuc191cywgdG90YWxfdXM7CkBAIC00NzYsNyArNDc4LDcgQEAKIAogCXRvdGFsX2J5dGVzID0gZHNpLT51cGRhdGVfcmVnaW9uLncgKgogCQlkc2ktPnVwZGF0ZV9yZWdpb24uaCAqCi0JCWRzaS0+dXBkYXRlX3JlZ2lvbi5kZXZpY2UtPmN0cmwucGl4ZWxfc2l6ZSAvIDg7CisJCWRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KSAvIDg7CiAKIAlwcmludGsoS0VSTl9JTkZPICJEU0koJXMpOiAldSB1cyArICV1IHVzID0gJXUgdXMgKCV1SHopLCAiCiAJCQkiJXUgYnl0ZXMsICV1IGtieXRlcy9zZWNcbiIsCkBAIC0xMjg3LDcgKzEyODksNyBAQAogCQkgKiB3aXRoIERTU19TWVNfQ0xLIHNvdXJjZSBhbHNvICovCiAJCWNpbmZvLT5oaWdoZnJlcSA9IDA7CiAJfSBlbHNlIHsKLQkJY2luZm8tPmNsa2luID0gZGlzcGNfcGNsa19yYXRlKGRzc2Rldi0+bWFuYWdlci0+aWQpOworCQljaW5mby0+Y2xraW4gPSBkaXNwY19tZ3JfcGNsa19yYXRlKGRzc2Rldi0+bWFuYWdlci0+aWQpOwogCiAJCWlmIChjaW5mby0+Y2xraW4gPCAzMjAwMDAwMCkKIAkJCWNpbmZvLT5oaWdoZnJlcSA9IDA7CkBAIC0yMzYwLDYgKzIzNjIsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGRzaV9nZXRfbGFuZV9tYXNrKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwl1bnNpZ25lZCBsYW5lcyA9IDA7CisKKwlpZiAoZHNzZGV2LT5waHkuZHNpLmNsa19sYW5lICE9IDApCisJCWxhbmVzIHw9IDEgPDwgKGRzc2Rldi0+cGh5LmRzaS5jbGtfbGFuZSAtIDEpOworCWlmIChkc3NkZXYtPnBoeS5kc2kuZGF0YTFfbGFuZSAhPSAwKQorCQlsYW5lcyB8PSAxIDw8IChkc3NkZXYtPnBoeS5kc2kuZGF0YTFfbGFuZSAtIDEpOworCWlmIChkc3NkZXYtPnBoeS5kc2kuZGF0YTJfbGFuZSAhPSAwKQorCQlsYW5lcyB8PSAxIDw8IChkc3NkZXYtPnBoeS5kc2kuZGF0YTJfbGFuZSAtIDEpOworCWlmIChkc3NkZXYtPnBoeS5kc2kuZGF0YTNfbGFuZSAhPSAwKQorCQlsYW5lcyB8PSAxIDw8IChkc3NkZXYtPnBoeS5kc2kuZGF0YTNfbGFuZSAtIDEpOworCWlmIChkc3NkZXYtPnBoeS5kc2kuZGF0YTRfbGFuZSAhPSAwKQorCQlsYW5lcyB8PSAxIDw8IChkc3NkZXYtPnBoeS5kc2kuZGF0YTRfbGFuZSAtIDEpOworCisJcmV0dXJuIGxhbmVzOworfQorCiBzdGF0aWMgaW50IGRzaV9jaW9faW5pdChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKQEAgLTIzNzAsOCArMjM5MCw5IEBACiAKIAlEU1NEQkdGKCk7CiAKLQlpZiAoZHNpLT5kc2lfbXV4X3BhZHMpCi0JCWRzaS0+ZHNpX211eF9wYWRzKHRydWUpOworCXIgPSBkc2ktPmVuYWJsZV9wYWRzKGRzaWRldi0+aWQsIGRzaV9nZXRfbGFuZV9tYXNrKGRzc2RldikpOworCWlmIChyKQorCQlyZXR1cm4gcjsKIAogCWRzaV9lbmFibGVfc2NwX2Nsayhkc2lkZXYpOwogCkBAIC0yNDUyLDYgKzI0NzMsMTIgQEAKIAogCWRzaV9jaW9fdGltaW5ncyhkc2lkZXYpOwogCisJaWYgKGRzc2Rldi0+cGFuZWwuZHNpX21vZGUgPT0gT01BUF9EU1NfRFNJX1ZJREVPX01PREUpIHsKKwkJLyogRERSX0NMS19BTFdBWVNfT04gKi8KKwkJUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfQ0xLX0NUUkwsCisJCQlkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLmRkcl9jbGtfYWx3YXlzX29uLCAxMywgMTMpOworCX0KKwogCWRzaS0+dWxwc19lbmFibGVkID0gZmFsc2U7CiAKIAlEU1NEQkcoIkNJTyBpbml0IGRvbmVcbiIpOwpAQCAtMjQ2NywxOSArMjQ5NCwyMSBAQAogCQlkc2lfY2lvX2Rpc2FibGVfbGFuZV9vdmVycmlkZShkc2lkZXYpOwogZXJyX3NjcF9jbGtfZG9tOgogCWRzaV9kaXNhYmxlX3NjcF9jbGsoZHNpZGV2KTsKLQlpZiAoZHNpLT5kc2lfbXV4X3BhZHMpCi0JCWRzaS0+ZHNpX211eF9wYWRzKGZhbHNlKTsKKwlkc2ktPmRpc2FibGVfcGFkcyhkc2lkZXYtPmlkLCBkc2lfZ2V0X2xhbmVfbWFzayhkc3NkZXYpKTsKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIHZvaWQgZHNpX2Npb191bmluaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQorc3RhdGljIHZvaWQgZHNpX2Npb191bmluaXQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CiAJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CiAKKwkvKiBERFJfQ0xLX0FMV0FZU19PTiAqLworCVJFR19GTERfTU9EKGRzaWRldiwgRFNJX0NMS19DVFJMLCAwLCAxMywgMTMpOworCiAJZHNpX2Npb19wb3dlcihkc2lkZXYsIERTSV9DT01QTEVYSU9fUE9XRVJfT0ZGKTsKIAlkc2lfZGlzYWJsZV9zY3BfY2xrKGRzaWRldik7Ci0JaWYgKGRzaS0+ZHNpX211eF9wYWRzKQotCQlkc2ktPmRzaV9tdXhfcGFkcyhmYWxzZSk7CisJZHNpLT5kaXNhYmxlX3BhZHMoZHNpZGV2LT5pZCwgZHNpX2dldF9sYW5lX21hc2soZHNzZGV2KSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRzaV9jb25maWdfdHhfZmlmbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYsCkBAIC0yNjY5LDEwICsyNjk4LDEwIEBACiAJaWYgKCFkc2lfdmNfaXNfZW5hYmxlZChkc2lkZXYsIGNoYW5uZWwpKQogCQlyZXR1cm4gMDsKIAotCXN3aXRjaCAoZHNpLT52Y1tjaGFubmVsXS5tb2RlKSB7Ci0JY2FzZSBEU0lfVkNfTU9ERV9WUDoKKwlzd2l0Y2ggKGRzaS0+dmNbY2hhbm5lbF0uc291cmNlKSB7CisJY2FzZSBEU0lfVkNfU09VUkNFX1ZQOgogCQlyZXR1cm4gZHNpX3N5bmNfdmNfdnAoZHNpZGV2LCBjaGFubmVsKTsKLQljYXNlIERTSV9WQ19NT0RFX0w0OgorCWNhc2UgRFNJX1ZDX1NPVVJDRV9MNDoKIAkJcmV0dXJuIGRzaV9zeW5jX3ZjX2w0KGRzaWRldiwgY2hhbm5lbCk7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC0yNzI2LDQzICsyNzU1LDEyIEBACiAJZHNpX3dyaXRlX3JlZyhkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCByKTsKIH0KIAotc3RhdGljIGludCBkc2lfdmNfY29uZmlnX2w0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwgaW50IGNoYW5uZWwpCitzdGF0aWMgaW50IGRzaV92Y19jb25maWdfc291cmNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwgaW50IGNoYW5uZWwsCisJCWVudW0gZHNpX3ZjX3NvdXJjZSBzb3VyY2UpCiB7CiAJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CiAKLQlpZiAoZHNpLT52Y1tjaGFubmVsXS5tb2RlID09IERTSV9WQ19NT0RFX0w0KQotCQlyZXR1cm4gMDsKLQotCURTU0RCR0YoIiVkIiwgY2hhbm5lbCk7Ci0KLQlkc2lfc3luY192Yyhkc2lkZXYsIGNoYW5uZWwpOwotCi0JZHNpX3ZjX2VuYWJsZShkc2lkZXYsIGNoYW5uZWwsIDApOwotCi0JLyogVkNfQlVTWSAqLwotCWlmICh3YWl0X2Zvcl9iaXRfY2hhbmdlKGRzaWRldiwgRFNJX1ZDX0NUUkwoY2hhbm5lbCksIDE1LCAwKSAhPSAwKSB7Ci0JCURTU0VSUigidmMoJWQpIGJ1c3kgd2hlbiB0cnlpbmcgdG8gY29uZmlnIGZvciBMNFxuIiwgY2hhbm5lbCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCVJFR19GTERfTU9EKGRzaWRldiwgRFNJX1ZDX0NUUkwoY2hhbm5lbCksIDAsIDEsIDEpOyAvKiBTT1VSQ0UsIDAgPSBMNCAqLwotCi0JLyogRENTX0NNRF9FTkFCTEUgKi8KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDKSkKLQkJUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfVkNfQ1RSTChjaGFubmVsKSwgMCwgMzAsIDMwKTsKLQotCWRzaV92Y19lbmFibGUoZHNpZGV2LCBjaGFubmVsLCAxKTsKLQotCWRzaS0+dmNbY2hhbm5lbF0ubW9kZSA9IERTSV9WQ19NT0RFX0w0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHNpX3ZjX2NvbmZpZ192cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYsIGludCBjaGFubmVsKQotewotCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOwotCi0JaWYgKGRzaS0+dmNbY2hhbm5lbF0ubW9kZSA9PSBEU0lfVkNfTU9ERV9WUCkKKwlpZiAoZHNpLT52Y1tjaGFubmVsXS5zb3VyY2UgPT0gc291cmNlKQogCQlyZXR1cm4gMDsKIAogCURTU0RCR0YoIiVkIiwgY2hhbm5lbCk7CkBAIC0yNzc3LDIxICsyNzc1LDIyIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCS8qIFNPVVJDRSwgMSA9IHZpZGVvIHBvcnQgKi8KLQlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCAxLCAxLCAxKTsKKwkvKiBTT1VSQ0UsIDAgPSBMNCwgMSA9IHZpZGVvIHBvcnQgKi8KKwlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCBzb3VyY2UsIDEsIDEpOwogCiAJLyogRENTX0NNRF9FTkFCTEUgKi8KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDKSkKLQkJUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfVkNfQ1RSTChjaGFubmVsKSwgMSwgMzAsIDMwKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDKSkgeworCQlib29sIGVuYWJsZSA9IHNvdXJjZSA9PSBEU0lfVkNfU09VUkNFX1ZQOworCQlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCBlbmFibGUsIDMwLCAzMCk7CisJfQogCiAJZHNpX3ZjX2VuYWJsZShkc2lkZXYsIGNoYW5uZWwsIDEpOwogCi0JZHNpLT52Y1tjaGFubmVsXS5tb2RlID0gRFNJX1ZDX01PREVfVlA7CisJZHNpLT52Y1tjaGFubmVsXS5zb3VyY2UgPSBzb3VyY2U7CiAKIAlyZXR1cm4gMDsKIH0KIAotCiB2b2lkIG9tYXBkc3NfZHNpX3ZjX2VuYWJsZV9ocyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLAogCQlib29sIGVuYWJsZSkKIHsKQEAgLTI4MTAsNiArMjgwOSwxMCBAQAogCWRzaV9pZl9lbmFibGUoZHNpZGV2LCAxKTsKIAogCWRzaV9mb3JjZV90eF9zdG9wX21vZGVfaW8oZHNpZGV2KTsKKworCS8qIHN0YXJ0IHRoZSBERFIgY2xvY2sgYnkgc2VuZGluZyBhIE5VTEwgcGFja2V0ICovCisJaWYgKGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEuZGRyX2Nsa19hbHdheXNfb24gJiYgZW5hYmxlKQorCQlkc2lfdmNfc2VuZF9udWxsKGRzc2RldiwgY2hhbm5lbCk7CiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBkc3NfZHNpX3ZjX2VuYWJsZV9ocyk7CiAKQEAgLTI4NzMsMTYgKzI4NzYsMTYgQEAKIAkJdmFsID0gZHNpX3JlYWRfcmVnKGRzaWRldiwgRFNJX1ZDX1NIT1JUX1BBQ0tFVF9IRUFERVIoY2hhbm5lbCkpOwogCQlEU1NFUlIoIlx0cmF3dmFsICUjMDh4XG4iLCB2YWwpOwogCQlkdCA9IEZMRF9HRVQodmFsLCA1LCAwKTsKLQkJaWYgKGR0ID09IERTSV9EVF9SWF9BQ0tfV0lUSF9FUlIpIHsKKwkJaWYgKGR0ID09IE1JUElfRFNJX1JYX0FDS05PV0xFREdFX0FORF9FUlJPUl9SRVBPUlQpIHsKIAkJCXUxNiBlcnIgPSBGTERfR0VUKHZhbCwgMjMsIDgpOwogCQkJZHNpX3Nob3dfcnhfYWNrX3dpdGhfZXJyKGVycik7Ci0JCX0gZWxzZSBpZiAoZHQgPT0gRFNJX0RUX1JYX1NIT1JUX1JFQURfMSkgeworCQl9IGVsc2UgaWYgKGR0ID09IE1JUElfRFNJX1JYX0RDU19TSE9SVF9SRUFEX1JFU1BPTlNFXzFCWVRFKSB7CiAJCQlEU1NFUlIoIlx0RENTIHNob3J0IHJlc3BvbnNlLCAxIGJ5dGU6ICUjeFxuIiwKIAkJCQkJRkxEX0dFVCh2YWwsIDIzLCA4KSk7Ci0JCX0gZWxzZSBpZiAoZHQgPT0gRFNJX0RUX1JYX1NIT1JUX1JFQURfMikgeworCQl9IGVsc2UgaWYgKGR0ID09IE1JUElfRFNJX1JYX0RDU19TSE9SVF9SRUFEX1JFU1BPTlNFXzJCWVRFKSB7CiAJCQlEU1NFUlIoIlx0RENTIHNob3J0IHJlc3BvbnNlLCAyIGJ5dGU6ICUjeFxuIiwKIAkJCQkJRkxEX0dFVCh2YWwsIDIzLCA4KSk7Ci0JCX0gZWxzZSBpZiAoZHQgPT0gRFNJX0RUX1JYX0RDU19MT05HX1JFQUQpIHsKKwkJfSBlbHNlIGlmIChkdCA9PSBNSVBJX0RTSV9SWF9EQ1NfTE9OR19SRUFEX1JFU1BPTlNFKSB7CiAJCQlEU1NFUlIoIlx0RENTIGxvbmcgcmVzcG9uc2UsIGxlbiAlZFxuIiwKIAkJCQkJRkxEX0dFVCh2YWwsIDIzLCA4KSk7CiAJCQlkc2lfdmNfZmx1c2hfbG9uZ19kYXRhKGRzaWRldiwgY2hhbm5lbCk7CkBAIC0zMDA3LDcgKzMwMTAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkc2lfdmNfY29uZmlnX2w0KGRzaWRldiwgY2hhbm5lbCk7CisJZHNpX3ZjX2NvbmZpZ19zb3VyY2UoZHNpZGV2LCBjaGFubmVsLCBEU0lfVkNfU09VUkNFX0w0KTsKIAogCWRzaV92Y193cml0ZV9sb25nX2hlYWRlcihkc2lkZXYsIGNoYW5uZWwsIGRhdGFfdHlwZSwgbGVuLCBlY2MpOwogCkBAIC0zMDY2LDcgKzMwNjksNyBAQAogCQkJCWNoYW5uZWwsCiAJCQkJZGF0YV90eXBlLCBkYXRhICYgMHhmZiwgKGRhdGEgPj4gOCkgJiAweGZmKTsKIAotCWRzaV92Y19jb25maWdfbDQoZHNpZGV2LCBjaGFubmVsKTsKKwlkc2lfdmNfY29uZmlnX3NvdXJjZShkc2lkZXYsIGNoYW5uZWwsIERTSV9WQ19TT1VSQ0VfTDQpOwogCiAJaWYgKEZMRF9HRVQoZHNpX3JlYWRfcmVnKGRzaWRldiwgRFNJX1ZDX0NUUkwoY2hhbm5lbCkpLCAxNiwgMTYpKSB7CiAJCURTU0VSUigiRVJST1IgRklGTyBGVUxMLCBhYm9ydGluZyB0cmFuc2ZlclxuIik7CkBAIC0zMDg1LDQ0ICszMDg4LDY2IEBACiBpbnQgZHNpX3ZjX3NlbmRfbnVsbChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7Ci0JdTggbnVsbHBrZ1tdID0gezAsIDAsIDAsIDB9OwogCi0JcmV0dXJuIGRzaV92Y19zZW5kX2xvbmcoZHNpZGV2LCBjaGFubmVsLCBEU0lfRFRfTlVMTF9QQUNLRVQsIG51bGxwa2csCi0JCTQsIDApOworCXJldHVybiBkc2lfdmNfc2VuZF9sb25nKGRzaWRldiwgY2hhbm5lbCwgTUlQSV9EU0lfTlVMTF9QQUNLRVQsIE5VTEwsCisJCTAsIDApOwogfQogRVhQT1JUX1NZTUJPTChkc2lfdmNfc2VuZF9udWxsKTsKIAotaW50IGRzaV92Y19kY3Nfd3JpdGVfbm9zeW5jKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCi0JCXU4ICpkYXRhLCBpbnQgbGVuKQorc3RhdGljIGludCBkc2lfdmNfd3JpdGVfbm9zeW5jX2NvbW1vbihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCWludCBjaGFubmVsLCB1OCAqZGF0YSwgaW50IGxlbiwgZW51bSBkc3NfZHNpX2NvbnRlbnRfdHlwZSB0eXBlKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CiAJaW50IHI7CiAKLQlCVUdfT04obGVuID09IDApOwotCi0JaWYgKGxlbiA9PSAxKSB7Ci0JCXIgPSBkc2lfdmNfc2VuZF9zaG9ydChkc2lkZXYsIGNoYW5uZWwsIERTSV9EVF9EQ1NfU0hPUlRfV1JJVEVfMCwKLQkJCQlkYXRhWzBdLCAwKTsKKwlpZiAobGVuID09IDApIHsKKwkJQlVHX09OKHR5cGUgPT0gRFNTX0RTSV9DT05URU5UX0RDUyk7CisJCXIgPSBkc2lfdmNfc2VuZF9zaG9ydChkc2lkZXYsIGNoYW5uZWwsCisJCQkJTUlQSV9EU0lfR0VORVJJQ19TSE9SVF9XUklURV8wX1BBUkFNLCAwLCAwKTsKKwl9IGVsc2UgaWYgKGxlbiA9PSAxKSB7CisJCXIgPSBkc2lfdmNfc2VuZF9zaG9ydChkc2lkZXYsIGNoYW5uZWwsCisJCQkJdHlwZSA9PSBEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyA/CisJCQkJTUlQSV9EU0lfR0VORVJJQ19TSE9SVF9XUklURV8xX1BBUkFNIDoKKwkJCQlNSVBJX0RTSV9EQ1NfU0hPUlRfV1JJVEUsIGRhdGFbMF0sIDApOwogCX0gZWxzZSBpZiAobGVuID09IDIpIHsKLQkJciA9IGRzaV92Y19zZW5kX3Nob3J0KGRzaWRldiwgY2hhbm5lbCwgRFNJX0RUX0RDU19TSE9SVF9XUklURV8xLAorCQlyID0gZHNpX3ZjX3NlbmRfc2hvcnQoZHNpZGV2LCBjaGFubmVsLAorCQkJCXR5cGUgPT0gRFNTX0RTSV9DT05URU5UX0dFTkVSSUMgPworCQkJCU1JUElfRFNJX0dFTkVSSUNfU0hPUlRfV1JJVEVfMl9QQVJBTSA6CisJCQkJTUlQSV9EU0lfRENTX1NIT1JUX1dSSVRFX1BBUkFNLAogCQkJCWRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSwgMCk7CiAJfSBlbHNlIHsKLQkJLyogMHgzOSA9IERDUyBMb25nIFdyaXRlICovCi0JCXIgPSBkc2lfdmNfc2VuZF9sb25nKGRzaWRldiwgY2hhbm5lbCwgRFNJX0RUX0RDU19MT05HX1dSSVRFLAotCQkJCWRhdGEsIGxlbiwgMCk7CisJCXIgPSBkc2lfdmNfc2VuZF9sb25nKGRzaWRldiwgY2hhbm5lbCwKKwkJCQl0eXBlID09IERTU19EU0lfQ09OVEVOVF9HRU5FUklDID8KKwkJCQlNSVBJX0RTSV9HRU5FUklDX0xPTkdfV1JJVEUgOgorCQkJCU1JUElfRFNJX0RDU19MT05HX1dSSVRFLCBkYXRhLCBsZW4sIDApOwogCX0KIAogCXJldHVybiByOwogfQorCitpbnQgZHNpX3ZjX2Rjc193cml0ZV9ub3N5bmMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKKwkJdTggKmRhdGEsIGludCBsZW4pCit7CisJcmV0dXJuIGRzaV92Y193cml0ZV9ub3N5bmNfY29tbW9uKGRzc2RldiwgY2hhbm5lbCwgZGF0YSwgbGVuLAorCQkJRFNTX0RTSV9DT05URU5UX0RDUyk7Cit9CiBFWFBPUlRfU1lNQk9MKGRzaV92Y19kY3Nfd3JpdGVfbm9zeW5jKTsKIAotaW50IGRzaV92Y19kY3Nfd3JpdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggKmRhdGEsCi0JCWludCBsZW4pCitpbnQgZHNpX3ZjX2dlbmVyaWNfd3JpdGVfbm9zeW5jKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4ICpkYXRhLCBpbnQgbGVuKQoreworCXJldHVybiBkc2lfdmNfd3JpdGVfbm9zeW5jX2NvbW1vbihkc3NkZXYsIGNoYW5uZWwsIGRhdGEsIGxlbiwKKwkJCURTU19EU0lfQ09OVEVOVF9HRU5FUklDKTsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZjX2dlbmVyaWNfd3JpdGVfbm9zeW5jKTsKKworc3RhdGljIGludCBkc2lfdmNfd3JpdGVfY29tbW9uKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4ICpkYXRhLCBpbnQgbGVuLCBlbnVtIGRzc19kc2lfY29udGVudF90eXBlIHR5cGUpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKIAlpbnQgcjsKIAotCXIgPSBkc2lfdmNfZGNzX3dyaXRlX25vc3luYyhkc3NkZXYsIGNoYW5uZWwsIGRhdGEsIGxlbik7CisJciA9IGRzaV92Y193cml0ZV9ub3N5bmNfY29tbW9uKGRzc2RldiwgY2hhbm5lbCwgZGF0YSwgbGVuLCB0eXBlKTsKIAlpZiAocikKIAkJZ290byBlcnI7CiAKQEAgLTMxNDAsMTggKzMxNjUsMzkgQEAKIAogCXJldHVybiAwOwogZXJyOgotCURTU0VSUigiZHNpX3ZjX2Rjc193cml0ZShjaCAlZCwgY21kIDB4JTAyeCwgbGVuICVkKSBmYWlsZWRcbiIsCisJRFNTRVJSKCJkc2lfdmNfd3JpdGVfY29tbW9uKGNoICVkLCBjbWQgMHglMDJ4LCBsZW4gJWQpIGZhaWxlZFxuIiwKIAkJCWNoYW5uZWwsIGRhdGFbMF0sIGxlbik7CiAJcmV0dXJuIHI7CiB9CisKK2ludCBkc2lfdmNfZGNzX3dyaXRlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4ICpkYXRhLAorCQlpbnQgbGVuKQoreworCXJldHVybiBkc2lfdmNfd3JpdGVfY29tbW9uKGRzc2RldiwgY2hhbm5lbCwgZGF0YSwgbGVuLAorCQkJRFNTX0RTSV9DT05URU5UX0RDUyk7Cit9CiBFWFBPUlRfU1lNQk9MKGRzaV92Y19kY3Nfd3JpdGUpOwogCitpbnQgZHNpX3ZjX2dlbmVyaWNfd3JpdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggKmRhdGEsCisJCWludCBsZW4pCit7CisJcmV0dXJuIGRzaV92Y193cml0ZV9jb21tb24oZHNzZGV2LCBjaGFubmVsLCBkYXRhLCBsZW4sCisJCQlEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyk7Cit9CitFWFBPUlRfU1lNQk9MKGRzaV92Y19nZW5lcmljX3dyaXRlKTsKKwogaW50IGRzaV92Y19kY3Nfd3JpdGVfMChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCBkY3NfY21kKQogewogCXJldHVybiBkc2lfdmNfZGNzX3dyaXRlKGRzc2RldiwgY2hhbm5lbCwgJmRjc19jbWQsIDEpOwogfQogRVhQT1JUX1NZTUJPTChkc2lfdmNfZGNzX3dyaXRlXzApOwogCitpbnQgZHNpX3ZjX2dlbmVyaWNfd3JpdGVfMChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsKQoreworCXJldHVybiBkc2lfdmNfZ2VuZXJpY193cml0ZShkc3NkZXYsIGNoYW5uZWwsIE5VTEwsIDApOworfQorRVhQT1JUX1NZTUJPTChkc2lfdmNfZ2VuZXJpY193cml0ZV8wKTsKKwogaW50IGRzaV92Y19kY3Nfd3JpdGVfMShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCBkY3NfY21kLAogCQl1OCBwYXJhbSkKIHsKQEAgLTMxNjIsMjYgKzMyMDgsODggQEAKIH0KIEVYUE9SVF9TWU1CT0woZHNpX3ZjX2Rjc193cml0ZV8xKTsKIAotaW50IGRzaV92Y19kY3NfcmVhZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCBkY3NfY21kLAotCQl1OCAqYnVmLCBpbnQgYnVmbGVuKQoraW50IGRzaV92Y19nZW5lcmljX3dyaXRlXzEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKKwkJdTggcGFyYW0pCit7CisJcmV0dXJuIGRzaV92Y19nZW5lcmljX3dyaXRlKGRzc2RldiwgY2hhbm5lbCwgJnBhcmFtLCAxKTsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZjX2dlbmVyaWNfd3JpdGVfMSk7CisKK2ludCBkc2lfdmNfZ2VuZXJpY193cml0ZV8yKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4IHBhcmFtMSwgdTggcGFyYW0yKQoreworCXU4IGJ1ZlsyXTsKKwlidWZbMF0gPSBwYXJhbTE7CisJYnVmWzFdID0gcGFyYW0yOworCXJldHVybiBkc2lfdmNfZ2VuZXJpY193cml0ZShkc3NkZXYsIGNoYW5uZWwsIGJ1ZiwgMik7Cit9CitFWFBPUlRfU1lNQk9MKGRzaV92Y19nZW5lcmljX3dyaXRlXzIpOworCitzdGF0aWMgaW50IGRzaV92Y19kY3Nfc2VuZF9yZWFkX3JlcXVlc3Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCkKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYgPSBkc2lfZ2V0X2RzaWRldl9mcm9tX2Rzc2Rldihkc3NkZXYpOwogCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOworCWludCByOworCisJaWYgKGRzaS0+ZGVidWdfcmVhZCkKKwkJRFNTREJHKCJkc2lfdmNfZGNzX3NlbmRfcmVhZF9yZXF1ZXN0KGNoJWQsIGRjc19jbWQgJXgpXG4iLAorCQkJY2hhbm5lbCwgZGNzX2NtZCk7CisKKwlyID0gZHNpX3ZjX3NlbmRfc2hvcnQoZHNpZGV2LCBjaGFubmVsLCBNSVBJX0RTSV9EQ1NfUkVBRCwgZGNzX2NtZCwgMCk7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJkc2lfdmNfZGNzX3NlbmRfcmVhZF9yZXF1ZXN0KGNoICVkLCBjbWQgMHglMDJ4KSIKKwkJCSIgZmFpbGVkXG4iLCBjaGFubmVsLCBkY3NfY21kKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNpX3ZjX2dlbmVyaWNfc2VuZF9yZWFkX3JlcXVlc3Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlpbnQgY2hhbm5lbCwgdTggKnJlcWRhdGEsIGludCByZXFsZW4pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKKwlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKKwl1MTYgZGF0YTsKKwl1OCBkYXRhX3R5cGU7CisJaW50IHI7CisKKwlpZiAoZHNpLT5kZWJ1Z19yZWFkKQorCQlEU1NEQkcoImRzaV92Y19nZW5lcmljX3NlbmRfcmVhZF9yZXF1ZXN0KGNoICVkLCByZXFsZW4gJWQpXG4iLAorCQkJY2hhbm5lbCwgcmVxbGVuKTsKKworCWlmIChyZXFsZW4gPT0gMCkgeworCQlkYXRhX3R5cGUgPSBNSVBJX0RTSV9HRU5FUklDX1JFQURfUkVRVUVTVF8wX1BBUkFNOworCQlkYXRhID0gMDsKKwl9IGVsc2UgaWYgKHJlcWxlbiA9PSAxKSB7CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX0dFTkVSSUNfUkVBRF9SRVFVRVNUXzFfUEFSQU07CisJCWRhdGEgPSByZXFkYXRhWzBdOworCX0gZWxzZSBpZiAocmVxbGVuID09IDIpIHsKKwkJZGF0YV90eXBlID0gTUlQSV9EU0lfR0VORVJJQ19SRUFEX1JFUVVFU1RfMl9QQVJBTTsKKwkJZGF0YSA9IHJlcWRhdGFbMF0gfCAocmVxZGF0YVsxXSA8PCA4KTsKKwl9IGVsc2UgeworCQlCVUcoKTsKKwl9CisKKwlyID0gZHNpX3ZjX3NlbmRfc2hvcnQoZHNpZGV2LCBjaGFubmVsLCBkYXRhX3R5cGUsIGRhdGEsIDApOworCWlmIChyKSB7CisJCURTU0VSUigiZHNpX3ZjX2dlbmVyaWNfc2VuZF9yZWFkX3JlcXVlc3QoY2ggJWQsIHJlcWxlbiAlZCkiCisJCQkiIGZhaWxlZFxuIiwgY2hhbm5lbCwgcmVxbGVuKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNpX3ZjX3JlYWRfcnhfZmlmbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYsIGludCBjaGFubmVsLAorCQl1OCAqYnVmLCBpbnQgYnVmbGVuLCBlbnVtIGRzc19kc2lfY29udGVudF90eXBlIHR5cGUpCit7CisJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CiAJdTMyIHZhbDsKIAl1OCBkdDsKIAlpbnQgcjsKIAotCWlmIChkc2ktPmRlYnVnX3JlYWQpCi0JCURTU0RCRygiZHNpX3ZjX2Rjc19yZWFkKGNoJWQsIGRjc19jbWQgJXgpXG4iLCBjaGFubmVsLCBkY3NfY21kKTsKLQotCXIgPSBkc2lfdmNfc2VuZF9zaG9ydChkc2lkZXYsIGNoYW5uZWwsIERTSV9EVF9EQ1NfUkVBRCwgZGNzX2NtZCwgMCk7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyOwotCi0JciA9IGRzaV92Y19zZW5kX2J0YV9zeW5jKGRzc2RldiwgY2hhbm5lbCk7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyOwotCiAJLyogUlhfRklGT19OT1RfRU1QVFkgKi8KIAlpZiAoUkVHX0dFVChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCAyMCwgMjApID09IDApIHsKIAkJRFNTRVJSKCJSWCBmaWZvIGVtcHR5IHdoZW4gdHJ5aW5nIHRvIHJlYWQuXG4iKTsKQEAgLTMxOTMsMTYgKzMzMDEsMjAgQEAKIAlpZiAoZHNpLT5kZWJ1Z19yZWFkKQogCQlEU1NEQkcoIlx0aGVhZGVyOiAlMDh4XG4iLCB2YWwpOwogCWR0ID0gRkxEX0dFVCh2YWwsIDUsIDApOwotCWlmIChkdCA9PSBEU0lfRFRfUlhfQUNLX1dJVEhfRVJSKSB7CisJaWYgKGR0ID09IE1JUElfRFNJX1JYX0FDS05PV0xFREdFX0FORF9FUlJPUl9SRVBPUlQpIHsKIAkJdTE2IGVyciA9IEZMRF9HRVQodmFsLCAyMywgOCk7CiAJCWRzaV9zaG93X3J4X2Fja193aXRoX2VycihlcnIpOwogCQlyID0gLUVJTzsKIAkJZ290byBlcnI7CiAKLQl9IGVsc2UgaWYgKGR0ID09IERTSV9EVF9SWF9TSE9SVF9SRUFEXzEpIHsKKwl9IGVsc2UgaWYgKGR0ID09ICh0eXBlID09IERTU19EU0lfQ09OVEVOVF9HRU5FUklDID8KKwkJCU1JUElfRFNJX1JYX0dFTkVSSUNfU0hPUlRfUkVBRF9SRVNQT05TRV8xQllURSA6CisJCQlNSVBJX0RTSV9SWF9EQ1NfU0hPUlRfUkVBRF9SRVNQT05TRV8xQllURSkpIHsKIAkJdTggZGF0YSA9IEZMRF9HRVQodmFsLCAxNSwgOCk7CiAJCWlmIChkc2ktPmRlYnVnX3JlYWQpCi0JCQlEU1NEQkcoIlx0RENTIHNob3J0IHJlc3BvbnNlLCAxIGJ5dGU6ICUwMnhcbiIsIGRhdGEpOworCQkJRFNTREJHKCJcdCVzIHNob3J0IHJlc3BvbnNlLCAxIGJ5dGU6ICUwMnhcbiIsCisJCQkJdHlwZSA9PSBEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyA/ICJHRU5FUklDIiA6CisJCQkJIkRDUyIsIGRhdGEpOwogCiAJCWlmIChidWZsZW4gPCAxKSB7CiAJCQlyID0gLUVJTzsKQEAgLTMyMTIsMTAgKzMzMjQsMTQgQEAKIAkJYnVmWzBdID0gZGF0YTsKIAogCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKGR0ID09IERTSV9EVF9SWF9TSE9SVF9SRUFEXzIpIHsKKwl9IGVsc2UgaWYgKGR0ID09ICh0eXBlID09IERTU19EU0lfQ09OVEVOVF9HRU5FUklDID8KKwkJCU1JUElfRFNJX1JYX0dFTkVSSUNfU0hPUlRfUkVBRF9SRVNQT05TRV8yQllURSA6CisJCQlNSVBJX0RTSV9SWF9EQ1NfU0hPUlRfUkVBRF9SRVNQT05TRV8yQllURSkpIHsKIAkJdTE2IGRhdGEgPSBGTERfR0VUKHZhbCwgMjMsIDgpOwogCQlpZiAoZHNpLT5kZWJ1Z19yZWFkKQotCQkJRFNTREJHKCJcdERDUyBzaG9ydCByZXNwb25zZSwgMiBieXRlOiAlMDR4XG4iLCBkYXRhKTsKKwkJCURTU0RCRygiXHQlcyBzaG9ydCByZXNwb25zZSwgMiBieXRlOiAlMDR4XG4iLAorCQkJCXR5cGUgPT0gRFNTX0RTSV9DT05URU5UX0dFTkVSSUMgPyAiR0VORVJJQyIgOgorCQkJCSJEQ1MiLCBkYXRhKTsKIAogCQlpZiAoYnVmbGVuIDwgMikgewogCQkJciA9IC1FSU87CkBAIC0zMjI2LDExICszMzQyLDE1IEBACiAJCWJ1ZlsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKIAogCQlyZXR1cm4gMjsKLQl9IGVsc2UgaWYgKGR0ID09IERTSV9EVF9SWF9EQ1NfTE9OR19SRUFEKSB7CisJfSBlbHNlIGlmIChkdCA9PSAodHlwZSA9PSBEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyA/CisJCQlNSVBJX0RTSV9SWF9HRU5FUklDX0xPTkdfUkVBRF9SRVNQT05TRSA6CisJCQlNSVBJX0RTSV9SWF9EQ1NfTE9OR19SRUFEX1JFU1BPTlNFKSkgewogCQlpbnQgdzsKIAkJaW50IGxlbiA9IEZMRF9HRVQodmFsLCAyMywgOCk7CiAJCWlmIChkc2ktPmRlYnVnX3JlYWQpCi0JCQlEU1NEQkcoIlx0RENTIGxvbmcgcmVzcG9uc2UsIGxlbiAlZFxuIiwgbGVuKTsKKwkJCURTU0RCRygiXHQlcyBsb25nIHJlc3BvbnNlLCBsZW4gJWRcbiIsCisJCQkJdHlwZSA9PSBEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyA/ICJHRU5FUklDIiA6CisJCQkJIkRDUyIsIGxlbik7CiAKIAkJaWYgKGxlbiA+IGJ1ZmxlbikgewogCQkJciA9IC1FSU87CkBAIC0zMjY2LDU4ICszMzg2LDEyNiBAQAogCiAJQlVHKCk7CiBlcnI6Ci0JRFNTRVJSKCJkc2lfdmNfZGNzX3JlYWQoY2ggJWQsIGNtZCAweCUwMngpIGZhaWxlZFxuIiwKLQkJCWNoYW5uZWwsIGRjc19jbWQpOwotCXJldHVybiByOworCURTU0VSUigiZHNpX3ZjX3JlYWRfcnhfZmlmbyhjaCAlZCB0eXBlICVzKSBmYWlsZWRcbiIsIGNoYW5uZWwsCisJCXR5cGUgPT0gRFNTX0RTSV9DT05URU5UX0dFTkVSSUMgPyAiR0VORVJJQyIgOiAiRENTIik7CiAKKwlyZXR1cm4gcjsKK30KKworaW50IGRzaV92Y19kY3NfcmVhZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCBkY3NfY21kLAorCQl1OCAqYnVmLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CisJaW50IHI7CisKKwlyID0gZHNpX3ZjX2Rjc19zZW5kX3JlYWRfcmVxdWVzdChkc3NkZXYsIGNoYW5uZWwsIGRjc19jbWQpOworCWlmIChyKQorCQlnb3RvIGVycjsKKworCXIgPSBkc2lfdmNfc2VuZF9idGFfc3luYyhkc3NkZXYsIGNoYW5uZWwpOworCWlmIChyKQorCQlnb3RvIGVycjsKKworCXIgPSBkc2lfdmNfcmVhZF9yeF9maWZvKGRzaWRldiwgY2hhbm5lbCwgYnVmLCBidWZsZW4sCisJCURTU19EU0lfQ09OVEVOVF9EQ1MpOworCWlmIChyIDwgMCkKKwkJZ290byBlcnI7CisKKwlpZiAociAhPSBidWZsZW4pIHsKKwkJciA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworZXJyOgorCURTU0VSUigiZHNpX3ZjX2Rjc19yZWFkKGNoICVkLCBjbWQgMHglMDJ4KSBmYWlsZWRcbiIsIGNoYW5uZWwsIGRjc19jbWQpOworCXJldHVybiByOwogfQogRVhQT1JUX1NZTUJPTChkc2lfdmNfZGNzX3JlYWQpOwogCi1pbnQgZHNpX3ZjX2Rjc19yZWFkXzEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwKLQkJdTggKmRhdGEpCitzdGF0aWMgaW50IGRzaV92Y19nZW5lcmljX3JlYWQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKKwkJdTggKnJlcWRhdGEsIGludCByZXFsZW4sIHU4ICpidWYsIGludCBidWZsZW4pCiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKIAlpbnQgcjsKIAotCXIgPSBkc2lfdmNfZGNzX3JlYWQoZHNzZGV2LCBjaGFubmVsLCBkY3NfY21kLCBkYXRhLCAxKTsKKwlyID0gZHNpX3ZjX2dlbmVyaWNfc2VuZF9yZWFkX3JlcXVlc3QoZHNzZGV2LCBjaGFubmVsLCByZXFkYXRhLCByZXFsZW4pOworCWlmIChyKQorCQlyZXR1cm4gcjsKIAorCXIgPSBkc2lfdmNfc2VuZF9idGFfc3luYyhkc3NkZXYsIGNoYW5uZWwpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkc2lfdmNfcmVhZF9yeF9maWZvKGRzaWRldiwgY2hhbm5lbCwgYnVmLCBidWZsZW4sCisJCURTU19EU0lfQ09OVEVOVF9HRU5FUklDKTsKIAlpZiAociA8IDApCiAJCXJldHVybiByOwogCi0JaWYgKHIgIT0gMSkKLQkJcmV0dXJuIC1FSU87CisJaWYgKHIgIT0gYnVmbGVuKSB7CisJCXIgPSAtRUlPOworCQlyZXR1cm4gcjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woZHNpX3ZjX2Rjc19yZWFkXzEpOwogCi1pbnQgZHNpX3ZjX2Rjc19yZWFkXzIoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwKLQkJdTggKmRhdGExLCB1OCAqZGF0YTIpCitpbnQgZHNpX3ZjX2dlbmVyaWNfcmVhZF8wKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4ICpidWYsCisJCWludCBidWZsZW4pCiB7Ci0JdTggYnVmWzJdOwogCWludCByOwogCi0JciA9IGRzaV92Y19kY3NfcmVhZChkc3NkZXYsIGNoYW5uZWwsIGRjc19jbWQsIGJ1ZiwgMik7Ci0KLQlpZiAociA8IDApCisJciA9IGRzaV92Y19nZW5lcmljX3JlYWQoZHNzZGV2LCBjaGFubmVsLCBOVUxMLCAwLCBidWYsIGJ1Zmxlbik7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJkc2lfdmNfZ2VuZXJpY19yZWFkXzAoY2ggJWQpIGZhaWxlZFxuIiwgY2hhbm5lbCk7CiAJCXJldHVybiByOwotCi0JaWYgKHIgIT0gMikKLQkJcmV0dXJuIC1FSU87Ci0KLQkqZGF0YTEgPSBidWZbMF07Ci0JKmRhdGEyID0gYnVmWzFdOworCX0KIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChkc2lfdmNfZGNzX3JlYWRfMik7CitFWFBPUlRfU1lNQk9MKGRzaV92Y19nZW5lcmljX3JlYWRfMCk7CisKK2ludCBkc2lfdmNfZ2VuZXJpY19yZWFkXzEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggcGFyYW0sCisJCXU4ICpidWYsIGludCBidWZsZW4pCit7CisJaW50IHI7CisKKwlyID0gZHNpX3ZjX2dlbmVyaWNfcmVhZChkc3NkZXYsIGNoYW5uZWwsICZwYXJhbSwgMSwgYnVmLCBidWZsZW4pOworCWlmIChyKSB7CisJCURTU0VSUigiZHNpX3ZjX2dlbmVyaWNfcmVhZF8xKGNoICVkKSBmYWlsZWRcbiIsIGNoYW5uZWwpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZjX2dlbmVyaWNfcmVhZF8xKTsKKworaW50IGRzaV92Y19nZW5lcmljX3JlYWRfMihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLAorCQl1OCBwYXJhbTEsIHU4IHBhcmFtMiwgdTggKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlpbnQgcjsKKwl1OCByZXFkYXRhWzJdOworCisJcmVxZGF0YVswXSA9IHBhcmFtMTsKKwlyZXFkYXRhWzFdID0gcGFyYW0yOworCisJciA9IGRzaV92Y19nZW5lcmljX3JlYWQoZHNzZGV2LCBjaGFubmVsLCByZXFkYXRhLCAyLCBidWYsIGJ1Zmxlbik7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJkc2lfdmNfZ2VuZXJpY19yZWFkXzIoY2ggJWQpIGZhaWxlZFxuIiwgY2hhbm5lbCk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkc2lfdmNfZ2VuZXJpY19yZWFkXzIpOwogCiBpbnQgZHNpX3ZjX3NldF9tYXhfcnhfcGFja2V0X3NpemUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKIAkJdTE2IGxlbikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYgPSBkc2lfZ2V0X2RzaWRldl9mcm9tX2Rzc2Rldihkc3NkZXYpOwogCi0JcmV0dXJuIGRzaV92Y19zZW5kX3Nob3J0KGRzaWRldiwgY2hhbm5lbCwgRFNJX0RUX1NFVF9NQVhfUkVUX1BLR19TSVpFLAotCQkJbGVuLCAwKTsKKwlyZXR1cm4gZHNpX3ZjX3NlbmRfc2hvcnQoZHNpZGV2LCBjaGFubmVsLAorCQkJTUlQSV9EU0lfU0VUX01BWElNVU1fUkVUVVJOX1BBQ0tFVF9TSVpFLCBsZW4sIDApOwogfQogRVhQT1JUX1NZTUJPTChkc2lfdmNfc2V0X21heF9yeF9wYWNrZXRfc2l6ZSk7CiAKQEAgLTM1MDgsNiArMzY5Niw3NSBAQAogCQkJdGlja3MsIHg0ID8gIiB4NCIgOiAiIiwgeDE2ID8gIiB4MTYiIDogIiIsCiAJCQkodG90YWxfdGlja3MgKiAxMDAwKSAvIChmY2sgLyAxMDAwIC8gMTAwMCkpOwogfQorCitzdGF0aWMgdm9pZCBkc2lfY29uZmlnX3ZwX251bV9saW5lX2J1ZmZlcnMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CisJaW50IG51bV9saW5lX2J1ZmZlcnM7CisKKwlpZiAoZHNzZGV2LT5wYW5lbC5kc2lfbW9kZSA9PSBPTUFQX0RTU19EU0lfVklERU9fTU9ERSkgeworCQlpbnQgYnBwID0gZHNpX2dldF9waXhlbF9zaXplKGRzc2Rldi0+cGFuZWwuZHNpX3BpeF9mbXQpOworCQl1bnNpZ25lZCBsaW5lX2J1Zl9zaXplID0gZHNpX2dldF9saW5lX2J1Zl9zaXplKGRzaWRldik7CisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MgPSAmZHNzZGV2LT5wYW5lbC50aW1pbmdzOworCQkvKgorCQkgKiBEb24ndCB1c2UgbGluZSBidWZmZXJzIGlmIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmlkZW8KKwkJICogcG9ydCdzIGxpbmUgYnVmZmVyIHNpemUKKwkJICovCisJCWlmIChsaW5lX2J1Zl9zaXplIDw9IHRpbWluZ3MtPnhfcmVzICogYnBwIC8gOCkKKwkJCW51bV9saW5lX2J1ZmZlcnMgPSAwOworCQllbHNlCisJCQludW1fbGluZV9idWZmZXJzID0gMjsKKwl9IGVsc2UgeworCQkvKiBVc2UgbWF4aW11bSBudW1iZXIgb2YgbGluZSBidWZmZXJzIGluIGNvbW1hbmQgbW9kZSAqLworCQludW1fbGluZV9idWZmZXJzID0gMjsKKwl9CisKKwkvKiBMSU5FX0JVRkZFUiAqLworCVJFR19GTERfTU9EKGRzaWRldiwgRFNJX0NUUkwsIG51bV9saW5lX2J1ZmZlcnMsIDEzLCAxMik7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9jb25maWdfdnBfc3luY19ldmVudHMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CisJaW50IGRlX3BvbCA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEudnBfZGVfcG9sOworCWludCBoc3luY19wb2wgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLnZwX2hzeW5jX3BvbDsKKwlpbnQgdnN5bmNfcG9sID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS52cF92c3luY19wb2w7CisJYm9vbCB2c3luY19lbmQgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLnZwX3ZzeW5jX2VuZDsKKwlib29sIGhzeW5jX2VuZCA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEudnBfaHN5bmNfZW5kOworCXUzMiByOworCisJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9DVFJMKTsKKwlyID0gRkxEX01PRChyLCBkZV9wb2wsIDksIDkpOwkJLyogVlBfREVfUE9MICovCisJciA9IEZMRF9NT0QociwgaHN5bmNfcG9sLCAxMCwgMTApOwkvKiBWUF9IU1lOQ19QT0wgKi8KKwlyID0gRkxEX01PRChyLCB2c3luY19wb2wsIDExLCAxMSk7CS8qIFZQX1ZTWU5DX1BPTCAqLworCXIgPSBGTERfTU9EKHIsIDEsIDE1LCAxNSk7CQkvKiBWUF9WU1lOQ19TVEFSVCAqLworCXIgPSBGTERfTU9EKHIsIHZzeW5jX2VuZCwgMTYsIDE2KTsJLyogVlBfVlNZTkNfRU5EICovCisJciA9IEZMRF9NT0QociwgMSwgMTcsIDE3KTsJCS8qIFZQX0hTWU5DX1NUQVJUICovCisJciA9IEZMRF9NT0QociwgaHN5bmNfZW5kLCAxOCwgMTgpOwkvKiBWUF9IU1lOQ19FTkQgKi8KKwlkc2lfd3JpdGVfcmVnKGRzaWRldiwgRFNJX0NUUkwsIHIpOworfQorCitzdGF0aWMgdm9pZCBkc2lfY29uZmlnX2JsYW5raW5nX21vZGVzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYgPSBkc2lfZ2V0X2RzaWRldl9mcm9tX2Rzc2Rldihkc3NkZXYpOworCWludCBibGFua2luZ19tb2RlID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS5ibGFua2luZ19tb2RlOworCWludCBoZnBfYmxhbmtpbmdfbW9kZSA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEuaGZwX2JsYW5raW5nX21vZGU7CisJaW50IGhicF9ibGFua2luZ19tb2RlID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS5oYnBfYmxhbmtpbmdfbW9kZTsKKwlpbnQgaHNhX2JsYW5raW5nX21vZGUgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLmhzYV9ibGFua2luZ19tb2RlOworCXUzMiByOworCisJLyoKKwkgKiAwID0gVFggRklGTyBwYWNrZXRzIHNlbnQgb3IgTFBTIGluIGNvcnJlc3BvbmRpbmcgYmxhbmtpbmcgcGVyaW9kcworCSAqIDEgPSBMb25nIGJsYW5raW5nIHBhY2tldHMgYXJlIHNlbnQgaW4gY29ycmVzcG9uZGluZyBibGFua2luZyBwZXJpb2RzCisJICovCisJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9DVFJMKTsKKwlyID0gRkxEX01PRChyLCBibGFua2luZ19tb2RlLCAyMCwgMjApOwkJLyogQkxBTktJTkdfTU9ERSAqLworCXIgPSBGTERfTU9EKHIsIGhmcF9ibGFua2luZ19tb2RlLCAyMSwgMjEpOwkvKiBIRlBfQkxBTktJTkcgKi8KKwlyID0gRkxEX01PRChyLCBoYnBfYmxhbmtpbmdfbW9kZSwgMjIsIDIyKTsJLyogSEJQX0JMQU5LSU5HICovCisJciA9IEZMRF9NT0QociwgaHNhX2JsYW5raW5nX21vZGUsIDIzLCAyMyk7CS8qIEhTQV9CTEFOS0lORyAqLworCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfQ1RSTCwgcik7Cit9CisKIHN0YXRpYyBpbnQgZHNpX3Byb3RvX2NvbmZpZyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKQEAgLTM1MzAsNyArMzc4Nyw3IEBACiAJZHNpX3NldF9scF9yeF90aW1lb3V0KGRzaWRldiwgMHgxZmZmLCB0cnVlLCB0cnVlKTsKIAlkc2lfc2V0X2hzX3R4X3RpbWVvdXQoZHNpZGV2LCAweDFmZmYsIHRydWUsIHRydWUpOwogCi0Jc3dpdGNoIChkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSkgeworCXN3aXRjaCAoZHNpX2dldF9waXhlbF9zaXplKGRzc2Rldi0+cGFuZWwuZHNpX3BpeF9mbXQpKSB7CiAJY2FzZSAxNjoKIAkJYnVzd2lkdGggPSAwOwogCQlicmVhazsKQEAgLTM1NTEsNyArMzgwOCw2IEBACiAJciA9IEZMRF9NT0QociwgMSwgNCwgNCk7CS8qIFZQX0NMS19SQVRJTywgYWx3YXlzIDEsIHNlZSBlcnJhdGEqLwogCXIgPSBGTERfTU9EKHIsIGJ1c3dpZHRoLCA3LCA2KTsgLyogVlBfREFUQV9CVVNfV0lEVEggKi8KIAlyID0gRkxEX01PRChyLCAwLCA4LCA4KTsJLyogVlBfQ0xLX1BPTCAqLwotCXIgPSBGTERfTU9EKHIsIDIsIDEzLCAxMik7CS8qIExJTkVfQlVGRkVSLCAyIGxpbmVzICovCiAJciA9IEZMRF9NT0QociwgMSwgMTQsIDE0KTsJLyogVFJJR0dFUl9SRVNFVF9NT0RFICovCiAJciA9IEZMRF9NT0QociwgMSwgMTksIDE5KTsJLyogRU9UX0VOQUJMRSAqLwogCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDKSkgewpAQCAtMzU2Miw2ICszODE4LDEzIEBACiAKIAlkc2lfd3JpdGVfcmVnKGRzaWRldiwgRFNJX0NUUkwsIHIpOwogCisJZHNpX2NvbmZpZ192cF9udW1fbGluZV9idWZmZXJzKGRzc2Rldik7CisKKwlpZiAoZHNzZGV2LT5wYW5lbC5kc2lfbW9kZSA9PSBPTUFQX0RTU19EU0lfVklERU9fTU9ERSkgeworCQlkc2lfY29uZmlnX3ZwX3N5bmNfZXZlbnRzKGRzc2Rldik7CisJCWRzaV9jb25maWdfYmxhbmtpbmdfbW9kZXMoZHNzZGV2KTsKKwl9CisKIAlkc2lfdmNfaW5pdGlhbF9jb25maWcoZHNpZGV2LCAwKTsKIAlkc2lfdmNfaW5pdGlhbF9jb25maWcoZHNpZGV2LCAxKTsKIAlkc2lfdmNfaW5pdGlhbF9jb25maWcoZHNpZGV2LCAyKTsKQEAgLTM1ODAsNiArMzg0Myw3IEBACiAJdW5zaWduZWQgZGRyX2Nsa19wcmUsIGRkcl9jbGtfcG9zdDsKIAl1bnNpZ25lZCBlbnRlcl9oc19tb2RlX2xhdCwgZXhpdF9oc19tb2RlX2xhdDsKIAl1bnNpZ25lZCB0aHNfZW90OworCWludCBuZGwgPSBkc2lfZ2V0X251bV9kYXRhX2xhbmVzX2Rzc2Rldihkc3NkZXYpOwogCXUzMiByOwogCiAJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9EU0lQSFlfQ0ZHMCk7CkBAIC0zNjAyLDcgKzM4NjYsNyBAQAogCS8qIG1pbiA2MG5zICsgNTIqVUkgKi8KIAl0Y2xrX3Bvc3QgPSBuczJkZHIoZHNpZGV2LCA2MCkgKyAyNjsKIAotCXRoc19lb3QgPSBESVZfUk9VTkRfVVAoNCwgZHNpX2dldF9udW1fZGF0YV9sYW5lc19kc3NkZXYoZHNzZGV2KSk7CisJdGhzX2VvdCA9IERJVl9ST1VORF9VUCg0LCBuZGwpOwogCiAJZGRyX2Nsa19wcmUgPSBESVZfUk9VTkRfVVAodGNsa19wcmUgKyB0bHB4ICsgdGNsa196ZXJvICsgdGNsa19wcmVwYXJlLAogCQkJNCk7CkBAIC0zNjMyLDE2MiArMzg5NiwxMTQgQEAKIAogCURTU0RCRygiZW50ZXJfaHNfbW9kZV9sYXQgJXUsIGV4aXRfaHNfbW9kZV9sYXQgJXVcbiIsCiAJCQllbnRlcl9oc19tb2RlX2xhdCwgZXhpdF9oc19tb2RlX2xhdCk7CisKKwkgaWYgKGRzc2Rldi0+cGFuZWwuZHNpX21vZGUgPT0gT01BUF9EU1NfRFNJX1ZJREVPX01PREUpIHsKKwkJLyogVE9ETzogSW1wbGVtZW50IGEgdmlkZW8gbW9kZSBjaGVja190aW1pbmdzIGZ1bmN0aW9uICovCisJCWludCBoc2EgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLmhzYTsKKwkJaW50IGhmcCA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEuaGZwOworCQlpbnQgaGJwID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS5oYnA7CisJCWludCB2c2EgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLnZzYTsKKwkJaW50IHZmcCA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEudmZwOworCQlpbnQgdmJwID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS52YnA7CisJCWludCB3aW5kb3dfc3luYyA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEud2luZG93X3N5bmM7CisJCWJvb2wgaHN5bmNfZW5kID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS52cF9oc3luY19lbmQ7CisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MgPSAmZHNzZGV2LT5wYW5lbC50aW1pbmdzOworCQlpbnQgYnBwID0gZHNpX2dldF9waXhlbF9zaXplKGRzc2Rldi0+cGFuZWwuZHNpX3BpeF9mbXQpOworCQlpbnQgdGwsIHRfaGUsIHdpZHRoX2J5dGVzOworCisJCXRfaGUgPSBoc3luY19lbmQgPworCQkJKChoc2EgPT0gMCAmJiBuZGwgPT0gMykgPyAxIDogRElWX1JPVU5EX1VQKDQsIG5kbCkpIDogMDsKKworCQl3aWR0aF9ieXRlcyA9IERJVl9ST1VORF9VUCh0aW1pbmdzLT54X3JlcyAqIGJwcCwgOCk7CisKKwkJLyogVEwgPSB0X0hTICsgSFNBICsgdF9IRSArIEhGUCArIGNlaWwoKFdDICsgNikgLyBOREwpICsgSEJQICovCisJCXRsID0gRElWX1JPVU5EX1VQKDQsIG5kbCkgKyAoaHN5bmNfZW5kID8gaHNhIDogMCkgKyB0X2hlICsgaGZwICsKKwkJCURJVl9ST1VORF9VUCh3aWR0aF9ieXRlcyArIDYsIG5kbCkgKyBoYnA7CisKKwkJRFNTREJHKCJIQlA6ICVkLCBIRlA6ICVkLCBIU0E6ICVkLCBUTDogJWQgVFhCWVRFQ0xLSFNcbiIsIGhicCwKKwkJCWhmcCwgaHN5bmNfZW5kID8gaHNhIDogMCwgdGwpOworCQlEU1NEQkcoIlZCUDogJWQsIFZGUDogJWQsIFZTQTogJWQsIFZBQ1Q6ICVkIGxpbmVzXG4iLCB2YnAsIHZmcCwKKwkJCXZzYSwgdGltaW5ncy0+eV9yZXMpOworCisJCXIgPSBkc2lfcmVhZF9yZWcoZHNpZGV2LCBEU0lfVk1fVElNSU5HMSk7CisJCXIgPSBGTERfTU9EKHIsIGhicCwgMTEsIDApOwkvKiBIQlAgKi8KKwkJciA9IEZMRF9NT0QociwgaGZwLCAyMywgMTIpOwkvKiBIRlAgKi8KKwkJciA9IEZMRF9NT0QociwgaHN5bmNfZW5kID8gaHNhIDogMCwgMzEsIDI0KTsJLyogSFNBICovCisJCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVk1fVElNSU5HMSwgcik7CisKKwkJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9WTV9USU1JTkcyKTsKKwkJciA9IEZMRF9NT0QociwgdmJwLCA3LCAwKTsJLyogVkJQICovCisJCXIgPSBGTERfTU9EKHIsIHZmcCwgMTUsIDgpOwkvKiBWRlAgKi8KKwkJciA9IEZMRF9NT0QociwgdnNhLCAyMywgMTYpOwkvKiBWU0EgKi8KKwkJciA9IEZMRF9NT0Qociwgd2luZG93X3N5bmMsIDI3LCAyNCk7CS8qIFdJTkRPV19TWU5DICovCisJCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVk1fVElNSU5HMiwgcik7CisKKwkJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9WTV9USU1JTkczKTsKKwkJciA9IEZMRF9NT0QociwgdGltaW5ncy0+eV9yZXMsIDE0LCAwKTsJLyogVkFDVCAqLworCQlyID0gRkxEX01PRChyLCB0bCwgMzEsIDE2KTsJCS8qIFRMICovCisJCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVk1fVElNSU5HMywgcik7CisJfQogfQogCi0KLSNkZWZpbmUgRFNJX0RFQ0xfVkFSUyBcCi0JaW50IF9fZHNpX2NiID0gMDsgdTMyIF9fZHNpX2N2ID0gMDsKLQotI2RlZmluZSBEU0lfRkxVU0goZHNpZGV2LCBjaCkgXAotCWlmIChfX2RzaV9jYiA+IDApIHsgXAotCQkvKkRTU0RCRygic2VuZGluZyBsb25nIHBhY2tldCAlIzAxMHhcbiIsIF9fZHNpX2N2KTsqLyBcCi0JCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVkNfTE9OR19QQUNLRVRfUEFZTE9BRChjaCksIF9fZHNpX2N2KTsgXAotCQlfX2RzaV9jYiA9IF9fZHNpX2N2ID0gMDsgXAotCX0KLQotI2RlZmluZSBEU0lfUFVTSChkc2lkZXYsIGNoLCBkYXRhKSBcCi0JZG8geyBcCi0JCV9fZHNpX2N2IHw9IChkYXRhKSA8PCAoX19kc2lfY2IgKiA4KTsgXAotCQkvKkRTU0RCRygiY3YgPSAlIzAxMHgsIGNiID0gJWRcbiIsIF9fZHNpX2N2LCBfX2RzaV9jYik7Ki8gXAotCQlpZiAoKytfX2RzaV9jYiA+IDMpIFwKLQkJCURTSV9GTFVTSChkc2lkZXYsIGNoKTsgXAotCX0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbnQgZHNpX3VwZGF0ZV9zY3JlZW5fbDQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAotCQkJaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCitpbnQgZHNpX3ZpZGVvX21vZGVfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwpCiB7Ci0JLyogTm90ZTogc3VwcG9ydHMgb25seSAyNGJpdCBjb2xvcnMgaW4gMzJiaXQgY29udGFpbmVyICovCiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKLQlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKLQlpbnQgZmlyc3QgPSAxOwotCWludCBmaWZvX3N0YWxscyA9IDA7Ci0JaW50IG1heF9kc2lfcGFja2V0X3NpemU7Ci0JaW50IG1heF9kYXRhX3Blcl9wYWNrZXQ7Ci0JaW50IG1heF9waXhlbHNfcGVyX3BhY2tldDsKLQlpbnQgcGl4ZWxzX2xlZnQ7Ci0JaW50IGJ5dGVzcHAgPSBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSAvIDg7Ci0JaW50IHNjcl93aWR0aDsKLQl1MzIgX19pb21lbSAqZGF0YTsKLQlpbnQgc3RhcnRfb2Zmc2V0OwotCWludCBob3Jpel9pbmM7Ci0JaW50IGN1cnJlbnRfeDsKLQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJaW50IGJwcCA9IGRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KTsKKwl1OCBkYXRhX3R5cGU7CisJdTE2IHdvcmRfY291bnQ7CiAKLQlkZWJ1Z19pcnEgPSAwOworCXN3aXRjaCAoZHNzZGV2LT5wYW5lbC5kc2lfcGl4X2ZtdCkgeworCWNhc2UgT01BUF9EU1NfRFNJX0ZNVF9SR0I4ODg6CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX1BBQ0tFRF9QSVhFTF9TVFJFQU1fMjQ7CisJCWJyZWFrOworCWNhc2UgT01BUF9EU1NfRFNJX0ZNVF9SR0I2NjY6CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX1BJWEVMX1NUUkVBTV8zQllURV8xODsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RTU19EU0lfRk1UX1JHQjY2Nl9QQUNLRUQ6CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX1BBQ0tFRF9QSVhFTF9TVFJFQU1fMTg7CisJCWJyZWFrOworCWNhc2UgT01BUF9EU1NfRFNJX0ZNVF9SR0I1NjU6CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX1BBQ0tFRF9QSVhFTF9TVFJFQU1fMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX07CiAKLQlEU1NEQkcoImRzaV91cGRhdGVfc2NyZWVuX2w0ICglZCwlZCAlZHglZClcbiIsCi0JCQl4LCB5LCB3LCBoKTsKKwlkc2lfaWZfZW5hYmxlKGRzaWRldiwgZmFsc2UpOworCWRzaV92Y19lbmFibGUoZHNpZGV2LCBjaGFubmVsLCBmYWxzZSk7CiAKLQlvdmwgPSBkc3NkZXYtPm1hbmFnZXItPm92ZXJsYXlzWzBdOworCS8qIE1PREUsIDEgPSB2aWRlbyBtb2RlICovCisJUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfVkNfQ1RSTChjaGFubmVsKSwgMSwgNCwgNCk7CiAKLQlpZiAob3ZsLT5pbmZvLmNvbG9yX21vZGUgIT0gT01BUF9EU1NfQ09MT1JfUkdCMjRVKQotCQlyZXR1cm4gLUVJTlZBTDsKKwl3b3JkX2NvdW50ID0gRElWX1JPVU5EX1VQKGRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcyAqIGJwcCwgOCk7CiAKLQlpZiAoZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUgIT0gMjQpCi0JCXJldHVybiAtRUlOVkFMOworCWRzaV92Y193cml0ZV9sb25nX2hlYWRlcihkc2lkZXYsIGNoYW5uZWwsIGRhdGFfdHlwZSwgd29yZF9jb3VudCwgMCk7CiAKLQlzY3Jfd2lkdGggPSBvdmwtPmluZm8uc2NyZWVuX3dpZHRoOwotCWRhdGEgPSBvdmwtPmluZm8udmFkZHI7CisJZHNpX3ZjX2VuYWJsZShkc2lkZXYsIGNoYW5uZWwsIHRydWUpOworCWRzaV9pZl9lbmFibGUoZHNpZGV2LCB0cnVlKTsKIAotCXN0YXJ0X29mZnNldCA9IHNjcl93aWR0aCAqIHkgKyB4OwotCWhvcml6X2luYyA9IHNjcl93aWR0aCAtIHc7Ci0JY3VycmVudF94ID0geDsKLQotCS8qIFdlIG5lZWQgaGVhZGVyKDQpICsgRENTQ01EKDEpICsgcGl4ZWxzKG51bXBpeCpieXRlc3BwKSBieXRlcwotCSAqIGluIGZpZm8gKi8KLQotCS8qIFdoZW4gdXNpbmcgQ1BVLCBtYXggbG9uZyBwYWNrZXQgc2l6ZSBpcyBUWCBidWZmZXIgc2l6ZSAqLwotCW1heF9kc2lfcGFja2V0X3NpemUgPSBkc2ktPnZjWzBdLmZpZm9fc2l6ZSAqIDMyICogNDsKLQotCS8qIHdlIHNlZW0gdG8gZ2V0IGJldHRlciBwZXJmIGlmIHdlIGRpdmlkZSB0aGUgdHggZmlmbyB0byBoYWxmLAotCSAgIGFuZCB3aGlsZSB0aGUgb3RoZXIgaGFsZiBpcyBiZWluZyBzZW50LCB3ZSBmaWxsIHRoZSBvdGhlciBoYWxmCi0JICAgbWF4X2RzaV9wYWNrZXRfc2l6ZSAvPSAyOyAqLwotCi0JbWF4X2RhdGFfcGVyX3BhY2tldCA9IG1heF9kc2lfcGFja2V0X3NpemUgLSA0IC0gMTsKLQotCW1heF9waXhlbHNfcGVyX3BhY2tldCA9IG1heF9kYXRhX3Blcl9wYWNrZXQgLyBieXRlc3BwOwotCi0JRFNTREJHKCJtYXhfcGl4ZWxzX3Blcl9wYWNrZXQgJWRcbiIsIG1heF9waXhlbHNfcGVyX3BhY2tldCk7Ci0KLQlwaXhlbHNfbGVmdCA9IHcgKiBoOwotCi0JRFNTREJHKCJ0b3RhbCBwaXhlbHMgJWRcbiIsIHBpeGVsc19sZWZ0KTsKLQotCWRhdGEgKz0gc3RhcnRfb2Zmc2V0OwotCi0Jd2hpbGUgKHBpeGVsc19sZWZ0ID4gMCkgewotCQkvKiAweDJjID0gd3JpdGVfbWVtb3J5X3N0YXJ0ICovCi0JCS8qIDB4M2MgPSB3cml0ZV9tZW1vcnlfY29udGludWUgKi8KLQkJdTggZGNzX2NtZCA9IGZpcnN0ID8gMHgyYyA6IDB4M2M7Ci0JCWludCBwaXhlbHM7Ci0JCURTSV9ERUNMX1ZBUlM7Ci0JCWZpcnN0ID0gMDsKLQotI2lmIDEKLQkJLyogdXNpbmcgZmlmbyBub3QgZW1wdHkgKi8KLQkJLyogVFhfRklGT19OT1RfRU1QVFkgKi8KLQkJd2hpbGUgKEZMRF9HRVQoZHNpX3JlYWRfcmVnKGRzaWRldiwgRFNJX1ZDX0NUUkwoMCkpLCA1LCA1KSkgewotCQkJZmlmb19zdGFsbHMrKzsKLQkJCWlmIChmaWZvX3N0YWxscyA+IDB4ZmZmZmYpIHsKLQkJCQlEU1NFUlIoImZpZm8gc3RhbGxzIG92ZXJmbG93LCBwaXhlbHMgbGVmdCAlZFxuIiwKLQkJCQkJCXBpeGVsc19sZWZ0KTsKLQkJCQlkc2lfaWZfZW5hYmxlKGRzaWRldiwgMCk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLSNlbGlmIDEKLQkJLyogdXNpbmcgZmlmbyBlbXB0aW5lc3MgKi8KLQkJd2hpbGUgKChSRUdfR0VUKGRzaWRldiwgRFNJX1RYX0ZJRk9fVkNfRU1QVElORVNTLCA3LCAwKSsxKSo0IDwKLQkJCQltYXhfZHNpX3BhY2tldF9zaXplKSB7Ci0JCQlmaWZvX3N0YWxscysrOwotCQkJaWYgKGZpZm9fc3RhbGxzID4gMHhmZmZmZikgewotCQkJCURTU0VSUigiZmlmbyBzdGFsbHMgb3ZlcmZsb3csIHBpeGVscyBsZWZ0ICVkXG4iLAotCQkJCQkgICAgICAgcGl4ZWxzX2xlZnQpOwotCQkJCWRzaV9pZl9lbmFibGUoZHNpZGV2LCAwKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQkJfQotI2Vsc2UKLQkJd2hpbGUgKChSRUdfR0VUKGRzaWRldiwgRFNJX1RYX0ZJRk9fVkNfRU1QVElORVNTLAotCQkJCTcsIDApICsgMSkgKiA0ID09IDApIHsKLQkJCWZpZm9fc3RhbGxzKys7Ci0JCQlpZiAoZmlmb19zdGFsbHMgPiAweGZmZmZmKSB7Ci0JCQkJRFNTRVJSKCJmaWZvIHN0YWxscyBvdmVyZmxvdywgcGl4ZWxzIGxlZnQgJWRcbiIsCi0JCQkJCSAgICAgICBwaXhlbHNfbGVmdCk7Ci0JCQkJZHNpX2lmX2VuYWJsZShkc2lkZXYsIDApOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQotCQl9Ci0jZW5kaWYKLQkJcGl4ZWxzID0gbWluKG1heF9waXhlbHNfcGVyX3BhY2tldCwgcGl4ZWxzX2xlZnQpOwotCi0JCXBpeGVsc19sZWZ0IC09IHBpeGVsczsKLQotCQlkc2lfdmNfd3JpdGVfbG9uZ19oZWFkZXIoZHNpZGV2LCAwLCBEU0lfRFRfRENTX0xPTkdfV1JJVEUsCi0JCQkJMSArIHBpeGVscyAqIGJ5dGVzcHAsIDApOwotCi0JCURTSV9QVVNIKGRzaWRldiwgMCwgZGNzX2NtZCk7Ci0KLQkJd2hpbGUgKHBpeGVscy0tID4gMCkgewotCQkJdTMyIHBpeCA9IF9fcmF3X3JlYWRsKGRhdGErKyk7Ci0KLQkJCURTSV9QVVNIKGRzaWRldiwgMCwgKHBpeCA+PiAxNikgJiAweGZmKTsKLQkJCURTSV9QVVNIKGRzaWRldiwgMCwgKHBpeCA+PiA4KSAmIDB4ZmYpOwotCQkJRFNJX1BVU0goZHNpZGV2LCAwLCAocGl4ID4+IDApICYgMHhmZik7Ci0KLQkJCWN1cnJlbnRfeCsrOwotCQkJaWYgKGN1cnJlbnRfeCA9PSB4K3cpIHsKLQkJCQljdXJyZW50X3ggPSB4OwotCQkJCWRhdGEgKz0gaG9yaXpfaW5jOwotCQkJfQotCQl9Ci0KLQkJRFNJX0ZMVVNIKGRzaWRldiwgMCk7Ci0JfQorCWRzc2Rldi0+bWFuYWdlci0+ZW5hYmxlKGRzc2Rldi0+bWFuYWdlcik7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZHNpX3ZpZGVvX21vZGVfZW5hYmxlKTsKKwordm9pZCBkc2lfdmlkZW9fbW9kZV9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKKworCWRzaV9pZl9lbmFibGUoZHNpZGV2LCBmYWxzZSk7CisJZHNpX3ZjX2VuYWJsZShkc2lkZXYsIGNoYW5uZWwsIGZhbHNlKTsKKworCS8qIE1PREUsIDAgPSBjb21tYW5kIG1vZGUgKi8KKwlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCAwLCA0LCA0KTsKKworCWRzaV92Y19lbmFibGUoZHNpZGV2LCBjaGFubmVsLCB0cnVlKTsKKwlkc2lfaWZfZW5hYmxlKGRzaWRldiwgdHJ1ZSk7CisKKwlkc3NkZXYtPm1hbmFnZXItPmRpc2FibGUoZHNzZGV2LT5tYW5hZ2VyKTsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZpZGVvX21vZGVfZGlzYWJsZSk7CiAKIHN0YXRpYyB2b2lkIGRzaV91cGRhdGVfc2NyZWVuX2Rpc3BjKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKIAkJdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpCkBAIC0zODA4LDkgKzQwMjQsOSBAQAogCURTU0RCRygiZHNpX3VwZGF0ZV9zY3JlZW5fZGlzcGMoJWQsJWQgJWR4JWQpXG4iLAogCQkJeCwgeSwgdywgaCk7CiAKLQlkc2lfdmNfY29uZmlnX3ZwKGRzaWRldiwgY2hhbm5lbCk7CisJZHNpX3ZjX2NvbmZpZ19zb3VyY2UoZHNpZGV2LCBjaGFubmVsLCBEU0lfVkNfU09VUkNFX1ZQKTsKIAotCWJ5dGVzcHAJPSBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSAvIDg7CisJYnl0ZXNwcAk9IGRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KSAvIDg7CiAJYnl0ZXNwbCA9IHcgKiBieXRlc3BwOwogCWJ5dGVzcGYgPSBieXRlc3BsICogaDsKIApAQCAtMzgzMSw3ICs0MDQ3LDcgQEAKIAlsID0gRkxEX1ZBTCh0b3RhbF9sZW4sIDIzLCAwKTsgLyogVEVfU0laRSAqLwogCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVkNfVEUoY2hhbm5lbCksIGwpOwogCi0JZHNpX3ZjX3dyaXRlX2xvbmdfaGVhZGVyKGRzaWRldiwgY2hhbm5lbCwgRFNJX0RUX0RDU19MT05HX1dSSVRFLAorCWRzaV92Y193cml0ZV9sb25nX2hlYWRlcihkc2lkZXYsIGNoYW5uZWwsIE1JUElfRFNJX0RDU19MT05HX1dSSVRFLAogCQlwYWNrZXRfbGVuLCAwKTsKIAogCWlmIChkc2ktPnRlX2VuYWJsZWQpCkBAIC0zOTU2LDExICs0MTcyLDkgQEAKIAogCWRzaV9wZXJmX21hcmtfc2V0dXAoZHNpZGV2KTsKIAotCWlmIChkc3NkZXYtPm1hbmFnZXItPmNhcHMgJiBPTUFQX0RTU19PVkxfTUdSX0NBUF9ESVNQQykgewotCQlkc3Nfc2V0dXBfcGFydGlhbF9wbGFuZXMoZHNzZGV2LCB4LCB5LCB3LCBoLAotCQkJCWVubGFyZ2VfdXBkYXRlX2FyZWEpOwotCQlkaXNwY19zZXRfbGNkX3NpemUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgKncsICpoKTsKLQl9CisJZHNzX3NldHVwX3BhcnRpYWxfcGxhbmVzKGRzc2RldiwgeCwgeSwgdywgaCwKKwkJCWVubGFyZ2VfdXBkYXRlX2FyZWEpOworCWRpc3BjX21ncl9zZXRfbGNkX3NpemUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgKncsICpoKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzk4MiwyNyArNDE5NiwxNiBAQAogCSAqIHNlZSByYXRoZXIgb2JzY3VyZSBIVyBlcnJvciBoYXBwZW5pbmcsIGFzIERTUyBoYWx0cy4gKi8KIAlCVUdfT04oeCAlIDIgPT0gMSk7CiAKLQlpZiAoZHNzZGV2LT5tYW5hZ2VyLT5jYXBzICYgT01BUF9EU1NfT1ZMX01HUl9DQVBfRElTUEMpIHsKLQkJZHNpLT5mcmFtZWRvbmVfY2FsbGJhY2sgPSBjYWxsYmFjazsKLQkJZHNpLT5mcmFtZWRvbmVfZGF0YSA9IGRhdGE7CisJZHNpLT5mcmFtZWRvbmVfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlkc2ktPmZyYW1lZG9uZV9kYXRhID0gZGF0YTsKIAotCQlkc2ktPnVwZGF0ZV9yZWdpb24ueCA9IHg7Ci0JCWRzaS0+dXBkYXRlX3JlZ2lvbi55ID0geTsKLQkJZHNpLT51cGRhdGVfcmVnaW9uLncgPSB3OwotCQlkc2ktPnVwZGF0ZV9yZWdpb24uaCA9IGg7Ci0JCWRzaS0+dXBkYXRlX3JlZ2lvbi5kZXZpY2UgPSBkc3NkZXY7CisJZHNpLT51cGRhdGVfcmVnaW9uLnggPSB4OworCWRzaS0+dXBkYXRlX3JlZ2lvbi55ID0geTsKKwlkc2ktPnVwZGF0ZV9yZWdpb24udyA9IHc7CisJZHNpLT51cGRhdGVfcmVnaW9uLmggPSBoOworCWRzaS0+dXBkYXRlX3JlZ2lvbi5kZXZpY2UgPSBkc3NkZXY7CiAKLQkJZHNpX3VwZGF0ZV9zY3JlZW5fZGlzcGMoZHNzZGV2LCB4LCB5LCB3LCBoKTsKLQl9IGVsc2UgewotCQlpbnQgcjsKLQotCQlyID0gZHNpX3VwZGF0ZV9zY3JlZW5fbDQoZHNzZGV2LCB4LCB5LCB3LCBoKTsKLQkJaWYgKHIpCi0JCQlyZXR1cm4gcjsKLQotCQlkc2lfcGVyZl9zaG93KGRzaWRldiwgIkw0Iik7Ci0JCWNhbGxiYWNrKDAsIGRhdGEpOwotCX0KKwlkc2lfdXBkYXRlX3NjcmVlbl9kaXNwYyhkc3NkZXYsIHgsIHksIHcsIGgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDEzLDI4ICs0MjE2LDkgQEAKIHN0YXRpYyBpbnQgZHNpX2Rpc3BsYXlfaW5pdF9kaXNwYyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJaW50IHI7Ci0JdTMyIGlycTsKIAotCWlycSA9IGRzc2Rldi0+bWFuYWdlci0+aWQgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgPwotCQlESVNQQ19JUlFfRlJBTUVET05FIDogRElTUENfSVJRX0ZSQU1FRE9ORTI7Ci0KLQlyID0gb21hcF9kaXNwY19yZWdpc3Rlcl9pc3IoZHNpX2ZyYW1lZG9uZV9pcnFfY2FsbGJhY2ssICh2b2lkICopIGRzc2RldiwKLQkJCWlycSk7Ci0JaWYgKHIpIHsKLQkJRFNTRVJSKCJjYW4ndCBnZXQgRlJBTUVET05FIGlycVxuIik7Ci0JCXJldHVybiByOwotCX0KLQotCWRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCi0JCQlPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOwotCi0JZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsCi0JCQlPTUFQX0RTU19QQVJBTExFTE1PREVfRFNJKTsKLQlkaXNwY19lbmFibGVfZmlmb2hhbmRjaGVjayhkc3NkZXYtPm1hbmFnZXItPmlkLCAxKTsKLQotCWRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSk7Ci0KLQl7CisJaWYgKGRzc2Rldi0+cGFuZWwuZHNpX21vZGUgPT0gT01BUF9EU1NfRFNJX0NNRF9NT0RFKSB7CisJCXUzMiBpcnE7CiAJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdGltaW5ncyA9IHsKIAkJCS5oc3cJCT0gMSwKIAkJCS5oZnAJCT0gMSwKQEAgLTQwNDQsMjEgKzQyMjgsNDYgQEAKIAkJCS52YnAJCT0gMCwKIAkJfTsKIAotCQlkaXNwY19zZXRfbGNkX3RpbWluZ3MoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJnRpbWluZ3MpOworCQlpcnEgPSBkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEID8KKwkJCURJU1BDX0lSUV9GUkFNRURPTkUgOiBESVNQQ19JUlFfRlJBTUVET05FMjsKKworCQlyID0gb21hcF9kaXNwY19yZWdpc3Rlcl9pc3IoZHNpX2ZyYW1lZG9uZV9pcnFfY2FsbGJhY2ssCisJCQkodm9pZCAqKSBkc3NkZXYsIGlycSk7CisJCWlmIChyKSB7CisJCQlEU1NFUlIoImNhbid0IGdldCBGUkFNRURPTkUgaXJxXG4iKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJZGlzcGNfbWdyX2VuYWJsZV9zdGFsbG1vZGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgdHJ1ZSk7CisJCWRpc3BjX21ncl9lbmFibGVfZmlmb2hhbmRjaGVjayhkc3NkZXYtPm1hbmFnZXItPmlkLCAxKTsKKworCQlkaXNwY19tZ3Jfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsICZ0aW1pbmdzKTsKKwl9IGVsc2UgeworCQlkaXNwY19tZ3JfZW5hYmxlX3N0YWxsbW9kZShkc3NkZXYtPm1hbmFnZXItPmlkLCBmYWxzZSk7CisJCWRpc3BjX21ncl9lbmFibGVfZmlmb2hhbmRjaGVjayhkc3NkZXYtPm1hbmFnZXItPmlkLCAwKTsKKworCQlkaXNwY19tZ3Jfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQkmZHNzZGV2LT5wYW5lbC50aW1pbmdzKTsKIAl9CiAKKwkJZGlzcGNfbWdyX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQlPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOworCQlkaXNwY19tZ3Jfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQlkc2lfZ2V0X3BpeGVsX3NpemUoZHNzZGV2LT5wYW5lbC5kc2lfcGl4X2ZtdCkpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkc2lfZGlzcGxheV91bmluaXRfZGlzcGMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewotCXUzMiBpcnE7CisJaWYgKGRzc2Rldi0+cGFuZWwuZHNpX21vZGUgPT0gT01BUF9EU1NfRFNJX0NNRF9NT0RFKSB7CisJCXUzMiBpcnE7CiAKLQlpcnEgPSBkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEID8KLQkJRElTUENfSVJRX0ZSQU1FRE9ORSA6IERJU1BDX0lSUV9GUkFNRURPTkUyOworCQlpcnEgPSBkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEID8KKwkJCURJU1BDX0lSUV9GUkFNRURPTkUgOiBESVNQQ19JUlFfRlJBTUVET05FMjsKIAotCW9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZHNpX2ZyYW1lZG9uZV9pcnFfY2FsbGJhY2ssICh2b2lkICopIGRzc2RldiwKLQkJCWlycSk7CisJCW9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZHNpX2ZyYW1lZG9uZV9pcnFfY2FsbGJhY2ssCisJCQkodm9pZCAqKSBkc3NkZXYsIGlycSk7CisJfQogfQogCiBzdGF0aWMgaW50IGRzaV9jb25maWd1cmVfZHNpX2Nsb2NrcyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCkBAIC00MTA2LDcgKzQzMTUsNyBAQAogCQlyZXR1cm4gcjsKIAl9CiAKLQlyID0gZGlzcGNfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOworCXIgPSBkaXNwY19tZ3Jfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOwogCWlmIChyKSB7CiAJCURTU0VSUigiRmFpbGVkIHRvIHNldCBkaXNwYyBjbG9ja3NcbiIpOwogCQlyZXR1cm4gcjsKQEAgLTQxNjYsMTAgKzQzNzUsMTIgQEAKIAogCXJldHVybiAwOwogZXJyMzoKLQlkc2lfY2lvX3VuaW5pdChkc2lkZXYpOworCWRzaV9jaW9fdW5pbml0KGRzc2Rldik7CiBlcnIyOgogCWRzc19zZWxlY3RfZGlzcGNfY2xrX3NvdXJjZShPTUFQX0RTU19DTEtfU1JDX0ZDSyk7CiAJZHNzX3NlbGVjdF9kc2lfY2xrX3NvdXJjZShkc2lfbW9kdWxlLCBPTUFQX0RTU19DTEtfU1JDX0ZDSyk7CisJZHNzX3NlbGVjdF9sY2RfY2xrX3NvdXJjZShkc3NkZXYtPm1hbmFnZXItPmlkLCBPTUFQX0RTU19DTEtfU1JDX0ZDSyk7CisKIGVycjE6CiAJZHNpX3BsbF91bmluaXQoZHNpZGV2LCB0cnVlKTsKIGVycjA6CkBAIC00MTk1LDcgKzQ0MDYsOCBAQAogCiAJZHNzX3NlbGVjdF9kaXNwY19jbGtfc291cmNlKE9NQVBfRFNTX0NMS19TUkNfRkNLKTsKIAlkc3Nfc2VsZWN0X2RzaV9jbGtfc291cmNlKGRzaV9tb2R1bGUsIE9NQVBfRFNTX0NMS19TUkNfRkNLKTsKLQlkc2lfY2lvX3VuaW5pdChkc2lkZXYpOworCWRzc19zZWxlY3RfbGNkX2Nsa19zb3VyY2UoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgT01BUF9EU1NfQ0xLX1NSQ19GQ0spOworCWRzaV9jaW9fdW5pbml0KGRzc2Rldik7CiAJZHNpX3BsbF91bmluaXQoZHNpZGV2LCBkaXNjb25uZWN0X2xhbmVzKTsKIH0KIApAQCAtNDIxMSw2ICs0NDIzLDEyIEBACiAKIAltdXRleF9sb2NrKCZkc2ktPmxvY2spOwogCisJaWYgKGRzc2Rldi0+bWFuYWdlciA9PSBOVUxMKSB7CisJCURTU0VSUigiZmFpbGVkIHRvIGVuYWJsZSBkaXNwbGF5OiBubyBtYW5hZ2VyXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3N0YXJ0X2RldjsKKwl9CisKIAlyID0gb21hcF9kc3Nfc3RhcnRfZGV2aWNlKGRzc2Rldik7CiAJaWYgKHIpIHsKIAkJRFNTRVJSKCJmYWlsZWQgdG8gc3RhcnQgZGV2aWNlXG4iKTsKQEAgLTQzMDcsOSArNDUyNSwxMCBAQAogCiAJRFNTREJHKCJEU0kgaW5pdFxuIik7CiAKLQkvKiBYWFggdGhlc2Ugc2hvdWxkIGJlIGZpZ3VyZWQgb3V0IGR5bmFtaWNhbGx5ICovCi0JZHNzZGV2LT5jYXBzID0gT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSB8Ci0JCU9NQVBfRFNTX0RJU1BMQVlfQ0FQX1RFQVJfRUxJTTsKKwlpZiAoZHNzZGV2LT5wYW5lbC5kc2lfbW9kZSA9PSBPTUFQX0RTU19EU0lfQ01EX01PREUpIHsKKwkJZHNzZGV2LT5jYXBzID0gT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSB8CisJCQlPTUFQX0RTU19ESVNQTEFZX0NBUF9URUFSX0VMSU07CisJfQogCiAJaWYgKGRzaS0+dmRkc19kc2lfcmVnID09IE5VTEwpIHsKIAkJc3RydWN0IHJlZ3VsYXRvciAqdmRkc19kc2k7CkBAIC00NDM1LDEwICs0NjU0LDcgQEAKIAogCWRzaS0+ZHNzX2NsayA9IGNsazsKIAotCWlmIChjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDM2MzAoKSkKLQkJY2xrID0gY2xrX2dldCgmZHNpZGV2LT5kZXYsICJkc3MyX2Fsd29uX2ZjayIpOwotCWVsc2UKLQkJY2xrID0gY2xrX2dldCgmZHNpZGV2LT5kZXYsICJzeXNfY2xrIik7CisJY2xrID0gY2xrX2dldCgmZHNpZGV2LT5kZXYsICJzeXNfY2xrIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCURTU0VSUigiY2FuJ3QgZ2V0IHN5c19jbGtcbiIpOwogCQljbGtfcHV0KGRzaS0+ZHNzX2Nsayk7CkBAIC00NDYyLDcgKzQ2NzgsNyBAQAogfQogCiAvKiBEU0kxIEhXIElQIGluaXRpYWxpc2F0aW9uICovCi1zdGF0aWMgaW50IG9tYXBfZHNpMWh3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3N0YXRpYyBpbnQgb21hcF9kc2lod19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCiB7CiAJc3RydWN0IG9tYXBfZGlzcGxheV9wbGF0Zm9ybV9kYXRhICpkc3NfcGxhdF9kYXRhOwogCXN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvICpib2FyZF9pbmZvOwpAQCAtNDQ4Myw3ICs0Njk5LDggQEAKIAogCWRzc19wbGF0X2RhdGEgPSBkc2lkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWJvYXJkX2luZm8gPSBkc3NfcGxhdF9kYXRhLT5ib2FyZF9kYXRhOwotCWRzaS0+ZHNpX211eF9wYWRzID0gYm9hcmRfaW5mby0+ZHNpX211eF9wYWRzOworCWRzaS0+ZW5hYmxlX3BhZHMgPSBib2FyZF9pbmZvLT5kc2lfZW5hYmxlX3BhZHM7CisJZHNpLT5kaXNhYmxlX3BhZHMgPSBib2FyZF9pbmZvLT5kc2lfZGlzYWJsZV9wYWRzOwogCiAJc3Bpbl9sb2NrX2luaXQoJmRzaS0+aXJxX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkc2ktPmVycm9yc19sb2NrKTsKQEAgLTQ1MzksNyArNDc1Niw3IEBACiAKIAkvKiBEU0kgVkNzIGluaXRpYWxpemF0aW9uICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHNpLT52Yyk7IGkrKykgewotCQlkc2ktPnZjW2ldLm1vZGUgPSBEU0lfVkNfTU9ERV9MNDsKKwkJZHNpLT52Y1tpXS5zb3VyY2UgPSBEU0lfVkNfU09VUkNFX0w0OwogCQlkc2ktPnZjW2ldLmRzc2RldiA9IE5VTEw7CiAJCWRzaS0+dmNbaV0udmNfaWQgPSAwOwogCX0KQEAgLTQ1NzIsNyArNDc4OSw3IEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9kc2kxaHdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3N0YXRpYyBpbnQgb21hcF9kc2lod19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQogewogCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOwogCkBAIC00NjAyLDEwICs0ODE5LDYgQEAKIAogc3RhdGljIGludCBkc2lfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOwotCi0JY2xrX2Rpc2FibGUoZHNpLT5kc3NfY2xrKTsKLQogCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiAJZHNzX3J1bnRpbWVfcHV0KCk7CiAKQEAgLTQ2MTQsNyArNDgyNyw2IEBACiAKIHN0YXRpYyBpbnQgZHNpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOwogCWludCByOwogCiAJciA9IGRzc19ydW50aW1lX2dldCgpOwpAQCAtNDYyNSw4ICs0ODM3LDYgQEAKIAlpZiAocikKIAkJZ290byBlcnJfZ2V0X2Rpc3BjOwogCi0JY2xrX2VuYWJsZShkc2ktPmRzc19jbGspOwotCiAJcmV0dXJuIDA7CiAKIGVycl9nZXRfZGlzcGM6CkBAIC00NjQwLDExICs0ODUwLDExIEBACiAJLnJ1bnRpbWVfcmVzdW1lID0gZHNpX3J1bnRpbWVfcmVzdW1lLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9kc2kxaHdfZHJpdmVyID0gewotCS5wcm9iZSAgICAgICAgICA9IG9tYXBfZHNpMWh3X3Byb2JlLAotCS5yZW1vdmUgICAgICAgICA9IG9tYXBfZHNpMWh3X3JlbW92ZSwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfZHNpaHdfZHJpdmVyID0geworCS5wcm9iZSAgICAgICAgICA9IG9tYXBfZHNpaHdfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gb21hcF9kc2lod19yZW1vdmUsCiAJLmRyaXZlciAgICAgICAgID0gewotCQkubmFtZSAgID0gIm9tYXBkc3NfZHNpMSIsCisJCS5uYW1lICAgPSAib21hcGRzc19kc2kiLAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsCiAJCS5wbQk9ICZkc2lfcG1fb3BzLAogCX0sCkBAIC00NjUyLDEwICs0ODYyLDEwIEBACiAKIGludCBkc2lfaW5pdF9wbGF0Zm9ybV9kcml2ZXIodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwX2RzaTFod19kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBfZHNpaHdfZHJpdmVyKTsKIH0KIAogdm9pZCBkc2lfdW5pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9kc2kxaHdfZHJpdmVyKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfZHNpaHdfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmMKaW5kZXggMGY5YzNhNi4uMTcwMzM0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmMKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtNjM5LDYgKzY0MCwxNyBAQAogCVJFR19GTERfTU9EKERTU19DT05UUk9MLCBoZG1pLCAxNSwgMTUpOwkvKiBWRU5DX0hETUlfU1dJVENIICovCiB9CiAKK2VudW0gZHNzX2hkbWlfdmVuY19jbGtfc291cmNlX3NlbGVjdCBkc3NfZ2V0X2hkbWlfdmVuY19jbGtfc291cmNlKHZvaWQpCit7CisJZW51bSBvbWFwX2Rpc3BsYXlfdHlwZSBkaXNwbGF5czsKKworCWRpc3BsYXlzID0gZHNzX2ZlYXRfZ2V0X3N1cHBvcnRlZF9kaXNwbGF5cyhPTUFQX0RTU19DSEFOTkVMX0RJR0lUKTsKKwlpZiAoKGRpc3BsYXlzICYgT01BUF9ESVNQTEFZX1RZUEVfSERNSSkgPT0gMCkKKwkJcmV0dXJuIERTU19WRU5DX1RWX0NMSzsKKworCXJldHVybiBSRUdfR0VUKERTU19DT05UUk9MLCAxNSwgMTUpOworfQorCiBzdGF0aWMgaW50IGRzc19nZXRfY2xvY2tzKHZvaWQpCiB7CiAJc3RydWN0IGNsayAqY2xrOwpAQCAtNjkxLDExICs3MDMsNiBAQAogCWNsa19wdXQoZHNzLmRzc19jbGspOwogfQogCi1zdHJ1Y3QgY2xrICpkc3NfZ2V0X2ljayh2b2lkKQotewotCXJldHVybiBjbGtfZ2V0KCZkc3MucGRldi0+ZGV2LCAiaWNrIik7Ci19Ci0KIGludCBkc3NfcnVudGltZV9nZXQodm9pZCkKIHsKIAlpbnQgcjsKQEAgLTgyNCwxMyArODMxLDExIEBACiBzdGF0aWMgaW50IGRzc19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCWRzc19zYXZlX2NvbnRleHQoKTsKLQljbGtfZGlzYWJsZShkc3MuZHNzX2Nsayk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZHNzX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQljbGtfZW5hYmxlKGRzcy5kc3NfY2xrKTsKIAlkc3NfcmVzdG9yZV9jb250ZXh0KCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3MuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCmluZGV4IDljOTRiMTEuLjYzMDhmYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCkBAIC05NywxMCArOTcsMTAgQEAKICNkZWZpbmUgRkxEX01PRChvcmlnLCB2YWwsIHN0YXJ0LCBlbmQpIFwKIAkoKChvcmlnKSAmIH5GTERfTUFTSyhzdGFydCwgZW5kKSkgfCBGTERfVkFMKHZhbCwgc3RhcnQsIGVuZCkpCiAKLWVudW0gb21hcF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZSB7Ci0JT01BUF9EU1NfUEFSQUxMRUxNT0RFX0JZUEFTUywJCS8qIE1JUEkgRFBJICovCi0JT01BUF9EU1NfUEFSQUxMRUxNT0RFX1JGQkksCQkvKiBNSVBJIERCSSAqLwotCU9NQVBfRFNTX1BBUkFMTEVMTU9ERV9EU0ksCitlbnVtIGRzc19pb19wYWRfbW9kZSB7CisJRFNTX0lPX1BBRF9NT0RFX1JFU0VULAorCURTU19JT19QQURfTU9ERV9SRkJJLAorCURTU19JT19QQURfTU9ERV9CWVBBU1MsCiB9OwogCiBlbnVtIGRzc19oZG1pX3ZlbmNfY2xrX3NvdXJjZV9zZWxlY3QgewpAQCAtMTA4LDYgKzEwOCwxMSBAQAogCURTU19IRE1JX01fUENMSyA9IDEsCiB9OwogCitlbnVtIGRzc19kc2lfY29udGVudF90eXBlIHsKKwlEU1NfRFNJX0NPTlRFTlRfRENTLAorCURTU19EU0lfQ09OVEVOVF9HRU5FUklDLAorfTsKKwogc3RydWN0IGRzc19jbG9ja19pbmZvIHsKIAkvKiByYXRlcyB0aGF0IHdlIGdldCB3aXRoIGRpdmlkZXJzIGJlbG93ICovCiAJdW5zaWduZWQgbG9uZyBmY2s7CkBAIC0xNTAsMTYgKzE1NSw2IEBACiAJYm9vbCB1c2Vfc3lzX2NsazsKIH07CiAKLS8qIEhETUkgUExMIHN0cnVjdHVyZSAqLwotc3RydWN0IGhkbWlfcGxsX2luZm8gewotCXUxNiByZWduOwotCXUxNiByZWdtOwotCXUzMiByZWdtZjsKLQl1MTYgcmVnbTI7Ci0JdTE2IHJlZ3NkOwotCXUxNiBkY29mcmVxOwotfTsKLQogc3RydWN0IHNlcV9maWxlOwogc3RydWN0IHBsYXRmb3JtX2RldmljZTsKIApAQCAtMjA5LDkgKzIwNCw4IEBACiBpbnQgZHNzX3J1bnRpbWVfZ2V0KHZvaWQpOwogdm9pZCBkc3NfcnVudGltZV9wdXQodm9pZCk7CiAKLXN0cnVjdCBjbGsgKmRzc19nZXRfaWNrKHZvaWQpOwotCiB2b2lkIGRzc19zZWxlY3RfaGRtaV92ZW5jX2Nsa19zb3VyY2UoZW51bSBkc3NfaGRtaV92ZW5jX2Nsa19zb3VyY2Vfc2VsZWN0KTsKK2VudW0gZHNzX2hkbWlfdmVuY19jbGtfc291cmNlX3NlbGVjdCBkc3NfZ2V0X2hkbWlfdmVuY19jbGtfc291cmNlKHZvaWQpOwogY29uc3QgY2hhciAqZHNzX2dldF9nZW5lcmljX2Nsa19zb3VyY2VfbmFtZShlbnVtIG9tYXBfZHNzX2Nsa19zb3VyY2UgY2xrX3NyYyk7CiB2b2lkIGRzc19kdW1wX2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOwogCkBAIC0yNzksNiArMjczLDggQEAKIAogaW50IGRzaV9pbml0X2Rpc3BsYXkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSk7CiB2b2lkIGRzaV9pcnFfaGFuZGxlcih2b2lkKTsKK3U4IGRzaV9nZXRfcGl4ZWxfc2l6ZShlbnVtIG9tYXBfZHNzX2RzaV9waXhlbF9mb3JtYXQgZm10KTsKKwogdW5zaWduZWQgbG9uZyBkc2lfZ2V0X3BsbF9oc2Rpdl9kaXNwY19yYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldik7CiBpbnQgZHNpX3BsbF9zZXRfY2xvY2tfZGl2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwKIAkJc3RydWN0IGRzaV9jbG9ja19pbmZvICpjaW5mbyk7CkBAIC0zMDksNiArMzA1LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZHNpX3J1bnRpbWVfcHV0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKIHsKIH0KK3N0YXRpYyBpbmxpbmUgdTggZHNpX2dldF9waXhlbF9zaXplKGVudW0gb21hcF9kc3NfZHNpX3BpeGVsX2Zvcm1hdCBmbXQpCit7CisJV0FSTigiJXM6IERTSSBub3QgY29tcGlsZWQgaW4sIHJldHVybmluZyBwaXhlbF9zaXplIGFzIDBcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkc2lfZ2V0X3BsbF9oc2Rpdl9kaXNwY19yYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKIHsKIAlXQVJOKCIlczogRFNJIG5vdCBjb21waWxlZCBpbiwgcmV0dXJuaW5nIHJhdGUgYXMgMFxuIiwgX19mdW5jX18pOwpAQCAtMzg1LDkwICszODYsNzEgQEAKIHZvaWQgZGlzcGNfbGNkX2VuYWJsZV9zaWduYWxfcG9sYXJpdHkoYm9vbCBhY3RfaGlnaCk7CiB2b2lkIGRpc3BjX2xjZF9lbmFibGVfc2lnbmFsKGJvb2wgZW5hYmxlKTsKIHZvaWQgZGlzcGNfcGNrX2ZyZWVfZW5hYmxlKGJvb2wgZW5hYmxlKTsKLXZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9oYW5kY2hlY2soZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpOwotCi12b2lkIGRpc3BjX3NldF9sY2Rfc2l6ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpOwogdm9pZCBkaXNwY19zZXRfZGlnaXRfc2l6ZSh1MTYgd2lkdGgsIHUxNiBoZWlnaHQpOwotdTMyIGRpc3BjX2dldF9wbGFuZV9maWZvX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lKTsKLXZvaWQgZGlzcGNfc2V0X2ZpZm9fdGhyZXNob2xkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywgdTMyIGhpZ2gpOwogdm9pZCBkaXNwY19lbmFibGVfZmlmb21lcmdlKGJvb2wgZW5hYmxlKTsKLXUzMiBkaXNwY19nZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOwotdm9pZCBkaXNwY19lbmFibGVfY3ByKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKTsKLXZvaWQgZGlzcGNfc2V0X2Nwcl9jb2VmKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCi0JCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgKmNvZWZzKTsKLQotdm9pZCBkaXNwY19zZXRfcGxhbmVfYmEwKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIHBhZGRyKTsKLXZvaWQgZGlzcGNfc2V0X3BsYW5lX2JhMShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcik7Ci12b2lkIGRpc3BjX3NldF9wbGFuZV9wb3MoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MTYgeCwgdTE2IHkpOwotdm9pZCBkaXNwY19zZXRfcGxhbmVfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUxNiB3aWR0aCwgdTE2IGhlaWdodCk7Ci12b2lkIGRpc3BjX3NldF9jaGFubmVsX291dChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCi0JCWVudW0gb21hcF9jaGFubmVsIGNoYW5uZWxfb3V0KTsKLQogdm9pZCBkaXNwY19lbmFibGVfZ2FtbWFfdGFibGUoYm9vbCBlbmFibGUpOwotaW50IGRpc3BjX3NldHVwX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKLQkJICAgICAgdTMyIHBhZGRyLCB1MTYgc2NyZWVuX3dpZHRoLAotCQkgICAgICB1MTYgcG9zX3gsIHUxNiBwb3NfeSwKLQkJICAgICAgdTE2IHdpZHRoLCB1MTYgaGVpZ2h0LAotCQkgICAgICB1MTYgb3V0X3dpZHRoLCB1MTYgb3V0X2hlaWdodCwKLQkJICAgICAgZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSwKLQkJICAgICAgYm9vbCBpbGFjZSwKLQkJICAgICAgZW51bSBvbWFwX2Rzc19yb3RhdGlvbl90eXBlIHJvdGF0aW9uX3R5cGUsCi0JCSAgICAgIHU4IHJvdGF0aW9uLCBib29sIG1pcnJvciwKLQkJICAgICAgdTggZ2xvYmFsX2FscGhhLCB1OCBwcmVfbXVsdF9hbHBoYSwKLQkJICAgICAgZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKLQkJICAgICAgdTMyIHB1dl9hZGRyKTsKLQotYm9vbCBkaXNwY19nb19idXN5KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwotdm9pZCBkaXNwY19nbyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKTsKLXZvaWQgZGlzcGNfZW5hYmxlX2NoYW5uZWwoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpOwotYm9vbCBkaXNwY19pc19jaGFubmVsX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Ci1pbnQgZGlzcGNfZW5hYmxlX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpOwotdm9pZCBkaXNwY19lbmFibGVfcmVwbGljYXRpb24oZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSk7Ci0KLXZvaWQgZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCi0JCWVudW0gb21hcF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZSBtb2RlKTsKLXZvaWQgZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHU4IGRhdGFfbGluZXMpOwotdm9pZCBkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAotCQllbnVtIG9tYXBfbGNkX2Rpc3BsYXlfdHlwZSB0eXBlKTsKIHZvaWQgZGlzcGNfc2V0X2xvYWRtb2RlKGVudW0gb21hcF9kc3NfbG9hZF9tb2RlIG1vZGUpOwogCi12b2lkIGRpc3BjX3NldF9kZWZhdWx0X2NvbG9yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUzMiBjb2xvcik7Ci11MzIgZGlzcGNfZ2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Ci12b2lkIGRpc3BjX3NldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCi0JCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgdHlwZSwKLQkJdTMyIHRyYW5zX2tleSk7Ci12b2lkIGRpc3BjX2dldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCi0JCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgKnR5cGUsCi0JCXUzMiAqdHJhbnNfa2V5KTsKLXZvaWQgZGlzcGNfZW5hYmxlX3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpOwotdm9pZCBkaXNwY19lbmFibGVfYWxwaGFfYmxlbmRpbmcoZW51bSBvbWFwX2NoYW5uZWwgY2gsIGJvb2wgZW5hYmxlKTsKLWJvb2wgZGlzcGNfdHJhbnNfa2V5X2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpOwotYm9vbCBkaXNwY19hbHBoYV9ibGVuZGluZ19lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoKTsKLQogYm9vbCBkaXNwY19sY2RfdGltaW5nc19vayhzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKTsKLXZvaWQgZGlzcGNfc2V0X2xjZF90aW1pbmdzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCi0JCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpOwogdW5zaWduZWQgbG9uZyBkaXNwY19mY2xrX3JhdGUodm9pZCk7Ci11bnNpZ25lZCBsb25nIGRpc3BjX2xjbGtfcmF0ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZGlzcGNfcGNsa19yYXRlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwotdm9pZCBkaXNwY19zZXRfcG9sX2ZyZXEoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKLQkJZW51bSBvbWFwX3BhbmVsX2NvbmZpZyBjb25maWcsIHU4IGFjYmksIHU4IGFjYik7CiB2b2lkIGRpc3BjX2ZpbmRfY2xrX2RpdnMoYm9vbCBpc190ZnQsIHVuc2lnbmVkIGxvbmcgcmVxX3BjaywgdW5zaWduZWQgbG9uZyBmY2ssCiAJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7CiBpbnQgZGlzcGNfY2FsY19jbG9ja19yYXRlcyh1bnNpZ25lZCBsb25nIGRpc3BjX2ZjbGtfcmF0ZSwKIAkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKTsKLWludCBkaXNwY19zZXRfY2xvY2tfZGl2KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCi0JCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7Ci1pbnQgZGlzcGNfZ2V0X2Nsb2NrX2RpdihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAotCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pOwogCiAKK3UzMiBkaXNwY19vdmxfZ2V0X2ZpZm9fc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOwordTMyIGRpc3BjX292bF9nZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOworaW50IGRpc3BjX292bF9zZXR1cChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyAqb2ksCisJCWJvb2wgaWxhY2UsIGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgcmVwbGljYXRpb24sCisJCXUzMiBmaWZvX2xvdywgdTMyIGZpZm9faGlnaCk7CitpbnQgZGlzcGNfb3ZsX2VuYWJsZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKTsKKworCit2b2lkIGRpc3BjX21ncl9lbmFibGVfZmlmb2hhbmRjaGVjayhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIGVuYWJsZSk7Cit2b2lkIGRpc3BjX21ncl9zZXRfbGNkX3NpemUoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTE2IHdpZHRoLCB1MTYgaGVpZ2h0KTsKK3ZvaWQgZGlzcGNfbWdyX2VuYWJsZV9jcHIoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpOwordm9pZCBkaXNwY19tZ3Jfc2V0X2Nwcl9jb2VmKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgKmNvZWZzKTsKK2Jvb2wgZGlzcGNfbWdyX2dvX2J1c3koZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Cit2b2lkIGRpc3BjX21ncl9nbyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKTsKK3ZvaWQgZGlzcGNfbWdyX2VuYWJsZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIGVuYWJsZSk7Citib29sIGRpc3BjX21ncl9pc19jaGFubmVsX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Cit2b2lkIGRpc3BjX21ncl9zZXRfaW9fcGFkX21vZGUoZW51bSBkc3NfaW9fcGFkX21vZGUgbW9kZSk7Cit2b2lkIGRpc3BjX21ncl9lbmFibGVfc3RhbGxtb2RlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKTsKK3ZvaWQgZGlzcGNfbWdyX3NldF90ZnRfZGF0YV9saW5lcyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1OCBkYXRhX2xpbmVzKTsKK3ZvaWQgZGlzcGNfbWdyX3NldF9sY2RfZGlzcGxheV90eXBlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCWVudW0gb21hcF9sY2RfZGlzcGxheV90eXBlIHR5cGUpOwordm9pZCBkaXNwY19tZ3Jfc2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTMyIGNvbG9yKTsKK3UzMiBkaXNwY19tZ3JfZ2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Cit2b2lkIGRpc3BjX21ncl9zZXRfdHJhbnNfa2V5KGVudW0gb21hcF9jaGFubmVsIGNoLAorCQllbnVtIG9tYXBfZHNzX3RyYW5zX2tleV90eXBlIHR5cGUsCisJCXUzMiB0cmFuc19rZXkpOwordm9pZCBkaXNwY19tZ3JfZ2V0X3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwKKwkJZW51bSBvbWFwX2Rzc190cmFuc19rZXlfdHlwZSAqdHlwZSwKKwkJdTMyICp0cmFuc19rZXkpOwordm9pZCBkaXNwY19tZ3JfZW5hYmxlX3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpOwordm9pZCBkaXNwY19tZ3JfZW5hYmxlX2FscGhhX2ZpeGVkX3pvcmRlcihlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpOworYm9vbCBkaXNwY19tZ3JfdHJhbnNfa2V5X2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpOworYm9vbCBkaXNwY19tZ3JfYWxwaGFfZml4ZWRfem9yZGVyX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpOwordm9pZCBkaXNwY19tZ3Jfc2V0X2xjZF90aW1pbmdzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpOwordm9pZCBkaXNwY19tZ3Jfc2V0X3BvbF9mcmVxKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCWVudW0gb21hcF9wYW5lbF9jb25maWcgY29uZmlnLCB1OCBhY2JpLCB1OCBhY2IpOwordW5zaWduZWQgbG9uZyBkaXNwY19tZ3JfbGNsa19yYXRlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwordW5zaWduZWQgbG9uZyBkaXNwY19tZ3JfcGNsa19yYXRlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOworaW50IGRpc3BjX21ncl9zZXRfY2xvY2tfZGl2KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7CitpbnQgZGlzcGNfbWdyX2dldF9jbG9ja19kaXYoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKKwkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKTsKKwogLyogVkVOQyAqLwogI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfVkVOQwogaW50IHZlbmNfaW5pdF9wbGF0Zm9ybV9kcml2ZXIodm9pZCk7CiB2b2lkIHZlbmNfdW5pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKTsKIHZvaWQgdmVuY19kdW1wX3JlZ3Moc3RydWN0IHNlcV9maWxlICpzKTsKIGludCB2ZW5jX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KTsKK3Vuc2lnbmVkIGxvbmcgdmVuY19nZXRfcGl4ZWxfY2xvY2sodm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgdmVuY19pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKQogewpAQCAtNDc3LDYgKzQ1OSwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIHZlbmNfdW5pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKQogewogfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZlbmNfZ2V0X3BpeGVsX2Nsb2NrKHZvaWQpCit7CisJV0FSTigiJXM6IFZFTkMgbm90IGNvbXBpbGVkIGluLCByZXR1cm5pbmcgcGNsayBhcyAwXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAogLyogSERNSSAqLwpAQCAtNDg0LDYgKzQ3MSw4IEBACiBpbnQgaGRtaV9pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKTsKIHZvaWQgaGRtaV91bmluaXRfcGxhdGZvcm1fZHJpdmVyKHZvaWQpOwogaW50IGhkbWlfaW5pdF9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7Cit1bnNpZ25lZCBsb25nIGhkbWlfZ2V0X3BpeGVsX2Nsb2NrKHZvaWQpOwordm9pZCBoZG1pX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGhkbWlfaW5pdF9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKQEAgLTQ5NiwxMiArNDg1LDE5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV91bmluaXRfcGxhdGZvcm1fZHJpdmVyKHZvaWQpCiB7CiB9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaGRtaV9nZXRfcGl4ZWxfY2xvY2sodm9pZCkKK3sKKwlXQVJOKCIlczogSERNSSBub3QgY29tcGlsZWQgaW4sIHJldHVybmluZyBwY2xrIGFzIDBcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogaW50IG9tYXBkc3NfaGRtaV9kaXNwbGF5X2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOwogdm9pZCBvbWFwZHNzX2hkbWlfZGlzcGxheV9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CiB2b2lkIG9tYXBkc3NfaGRtaV9kaXNwbGF5X3NldF90aW1pbmcoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKIGludCBvbWFwZHNzX2hkbWlfZGlzcGxheV9jaGVja190aW1pbmcoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAogCQkJCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKTsKK2ludCBvbWFwZHNzX2hkbWlfcmVhZF9lZGlkKHU4ICpidWYsIGludCBsZW4pOworYm9vbCBvbWFwZHNzX2hkbWlfZGV0ZWN0KHZvaWQpOwogaW50IGhkbWlfcGFuZWxfaW5pdCh2b2lkKTsKIHZvaWQgaGRtaV9wYW5lbF9leGl0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCmluZGV4IGI0MTVjNGUuLmI0MDI2OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCkBAIC00Nyw2ICs0Nyw3IEBACiAJY29uc3QgaW50IG51bV9vdmxzOwogCWNvbnN0IGVudW0gb21hcF9kaXNwbGF5X3R5cGUgKnN1cHBvcnRlZF9kaXNwbGF5czsKIAljb25zdCBlbnVtIG9tYXBfY29sb3JfbW9kZSAqc3VwcG9ydGVkX2NvbG9yX21vZGVzOworCWNvbnN0IGVudW0gb21hcF9vdmVybGF5X2NhcHMgKm92ZXJsYXlfY2FwczsKIAljb25zdCBjaGFyICogY29uc3QgKmNsa3NyY19uYW1lczsKIAljb25zdCBzdHJ1Y3QgZHNzX3BhcmFtX3JhbmdlICpkc3NfcGFyYW1zOwogCkBAIC0yMDksNiArMjEwLDY4IEBACiAJT01BUF9EU1NfQ09MT1JfQVJHQjE2IHwgT01BUF9EU1NfQ09MT1JfWFJHQjE2XzE1NTUgfAogCU9NQVBfRFNTX0NPTE9SX0FSR0IzMiB8IE9NQVBfRFNTX0NPTE9SX1JHQlgxNiB8CiAJT01BUF9EU1NfQ09MT1JfUkdCWDMyLAorCisJLyogT01BUF9EU1NfVklERU8zICovCisJT01BUF9EU1NfQ09MT1JfUkdCMTYgfCBPTUFQX0RTU19DT0xPUl9SR0IxMlUgfAorCU9NQVBfRFNTX0NPTE9SX1lVVjIgfCBPTUFQX0RTU19DT0xPUl9BUkdCMTZfMTU1NSB8CisJT01BUF9EU1NfQ09MT1JfUkdCQTMyIHwgT01BUF9EU1NfQ09MT1JfTlYxMiB8CisJT01BUF9EU1NfQ09MT1JfUkdCQTE2IHwgT01BUF9EU1NfQ09MT1JfUkdCMjRVIHwKKwlPTUFQX0RTU19DT0xPUl9SR0IyNFAgfCBPTUFQX0RTU19DT0xPUl9VWVZZIHwKKwlPTUFQX0RTU19DT0xPUl9BUkdCMTYgfCBPTUFQX0RTU19DT0xPUl9YUkdCMTZfMTU1NSB8CisJT01BUF9EU1NfQ09MT1JfQVJHQjMyIHwgT01BUF9EU1NfQ09MT1JfUkdCWDE2IHwKKwlPTUFQX0RTU19DT0xPUl9SR0JYMzIsCit9OworCitzdGF0aWMgY29uc3QgZW51bSBvbWFwX292ZXJsYXlfY2FwcyBvbWFwMl9kc3Nfb3ZlcmxheV9jYXBzW10gPSB7CisJLyogT01BUF9EU1NfR0ZYICovCisJMCwKKworCS8qIE9NQVBfRFNTX1ZJREVPMSAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUsCisKKwkvKiBPTUFQX0RTU19WSURFTzIgKi8KKwlPTUFQX0RTU19PVkxfQ0FQX1NDQUxFLAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gb21hcF9vdmVybGF5X2NhcHMgb21hcDM0MzBfZHNzX292ZXJsYXlfY2Fwc1tdID0geworCS8qIE9NQVBfRFNTX0dGWCAqLworCU9NQVBfRFNTX09WTF9DQVBfR0xPQkFMX0FMUEhBLAorCisJLyogT01BUF9EU1NfVklERU8xICovCisJT01BUF9EU1NfT1ZMX0NBUF9TQ0FMRSwKKworCS8qIE9NQVBfRFNTX1ZJREVPMiAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUgfCBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIG9tYXBfb3ZlcmxheV9jYXBzIG9tYXAzNjMwX2Rzc19vdmVybGF5X2NhcHNbXSA9IHsKKwkvKiBPTUFQX0RTU19HRlggKi8KKwlPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8IE9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEsCisKKwkvKiBPTUFQX0RTU19WSURFTzEgKi8KKwlPTUFQX0RTU19PVkxfQ0FQX1NDQUxFLAorCisJLyogT01BUF9EU1NfVklERU8yICovCisJT01BUF9EU1NfT1ZMX0NBUF9TQ0FMRSB8IE9NQVBfRFNTX09WTF9DQVBfR0xPQkFMX0FMUEhBIHwKKwkJT01BUF9EU1NfT1ZMX0NBUF9QUkVfTVVMVF9BTFBIQSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIG9tYXBfb3ZlcmxheV9jYXBzIG9tYXA0X2Rzc19vdmVybGF5X2NhcHNbXSA9IHsKKwkvKiBPTUFQX0RTU19HRlggKi8KKwlPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8IE9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgfAorCQlPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUiwKKworCS8qIE9NQVBfRFNTX1ZJREVPMSAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUgfCBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8CisJCU9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgfCBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUiwKKworCS8qIE9NQVBfRFNTX1ZJREVPMiAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUgfCBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8CisJCU9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgfCBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUiwKKworCS8qIE9NQVBfRFNTX1ZJREVPMyAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUgfCBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8CisJCU9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgfCBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb21hcDJfZHNzX2Nsa19zb3VyY2VfbmFtZXNbXSA9IHsKQEAgLTIzMywzMiArMjk2LDM4IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHNzX3BhcmFtX3JhbmdlIG9tYXAyX2Rzc19wYXJhbV9yYW5nZVtdID0gewogCVtGRUFUX1BBUkFNX0RTU19GQ0tdCQkJPSB7IDAsIDE3MzAwMDAwMCB9LAorCVtGRUFUX1BBUkFNX0RTU19QQ0RdCQkJPSB7IDIsIDI1NSB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9SRUdOXQkJPSB7IDAsIDAgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTV0JCT0geyAwLCAwIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX1JFR01fRElTUENdCQk9IHsgMCwgMCB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9SRUdNX0RTSV0JCT0geyAwLCAwIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX0ZJTlRdCQk9IHsgMCwgMCB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9MUERJVl0JCT0geyAwLCAwIH0sCisJW0ZFQVRfUEFSQU1fRE9XTlNDQUxFXQkJCT0geyAxLCAyIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRzc19wYXJhbV9yYW5nZSBvbWFwM19kc3NfcGFyYW1fcmFuZ2VbXSA9IHsKIAlbRkVBVF9QQVJBTV9EU1NfRkNLXQkJCT0geyAwLCAxNzMwMDAwMDAgfSwKKwlbRkVBVF9QQVJBTV9EU1NfUENEXQkJCT0geyAxLCAyNTUgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTl0JCT0geyAwLCAoMSA8PCA3KSAtIDEgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTV0JCT0geyAwLCAoMSA8PCAxMSkgLSAxIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX1JFR01fRElTUENdCQk9IHsgMCwgKDEgPDwgNCkgLSAxIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX1JFR01fRFNJXQkJPSB7IDAsICgxIDw8IDQpIC0gMSB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9GSU5UXQkJPSB7IDc1MDAwMCwgMjEwMDAwMCB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9MUERJVl0JCT0geyAxLCAoMSA8PCAxMykgLSAxfSwKKwlbRkVBVF9QQVJBTV9ET1dOU0NBTEVdCQkJPSB7IDEsIDQgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHNzX3BhcmFtX3JhbmdlIG9tYXA0X2Rzc19wYXJhbV9yYW5nZVtdID0gewogCVtGRUFUX1BBUkFNX0RTU19GQ0tdCQkJPSB7IDAsIDE4NjAwMDAwMCB9LAorCVtGRUFUX1BBUkFNX0RTU19QQ0RdCQkJPSB7IDEsIDI1NSB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9SRUdOXQkJPSB7IDAsICgxIDw8IDgpIC0gMSB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9SRUdNXQkJPSB7IDAsICgxIDw8IDEyKSAtIDEgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTV9ESVNQQ10JCT0geyAwLCAoMSA8PCA1KSAtIDEgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTV9EU0ldCQk9IHsgMCwgKDEgPDwgNSkgLSAxIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX0ZJTlRdCQk9IHsgNTAwMDAwLCAyNTAwMDAwIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX0xQRElWXQkJPSB7IDAsICgxIDw8IDEzKSAtIDEgfSwKKwlbRkVBVF9QQVJBTV9ET1dOU0NBTEVdCQkJPSB7IDEsIDQgfSwKIH07CiAKIC8qIE9NQVAyIERTUyBGZWF0dXJlcyAqLwpAQCAtMjc1LDYgKzM0NCw3IEBACiAJLm51bV9vdmxzID0gMywKIAkuc3VwcG9ydGVkX2Rpc3BsYXlzID0gb21hcDJfZHNzX3N1cHBvcnRlZF9kaXNwbGF5cywKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDJfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKKwkub3ZlcmxheV9jYXBzID0gb21hcDJfZHNzX292ZXJsYXlfY2FwcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDJfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwMl9kc3NfcGFyYW1fcmFuZ2UsCiAJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxLApAQCAtMjg3LDE4ICszNTcsMTkgQEAKIAkubnVtX3JlZ19maWVsZHMgPSBBUlJBWV9TSVpFKG9tYXAzX2Rzc19yZWdfZmllbGRzKSwKIAogCS5oYXNfZmVhdHVyZQk9Ci0JCUZFQVRfR0xPQkFMX0FMUEhBIHwgRkVBVF9MQ0RFTkFCTEVQT0wgfAorCQlGRUFUX0xDREVOQUJMRVBPTCB8CiAJCUZFQVRfTENERU5BQkxFU0lHTkFMIHwgRkVBVF9QQ0tGUkVFRU5BQkxFIHwKIAkJRkVBVF9GVU5DR0FURUQgfCBGRUFUX1JPV1JFUEVBVEVOQUJMRSB8CiAJCUZFQVRfTElORUJVRkZFUlNQTElUIHwgRkVBVF9SRVNJWkVDT05GIHwKIAkJRkVBVF9EU0lfUExMX0ZSRVFTRUwgfCBGRUFUX0RTSV9SRVZFUlNFX1RYQ0xLRVNDIHwKIAkJRkVBVF9WRU5DX1JFUVVJUkVTX1RWX0RBQ19DTEsgfCBGRUFUX0NQUiB8IEZFQVRfUFJFTE9BRCB8Ci0JCUZFQVRfRklSX0NPRUZfViwKKwkJRkVBVF9GSVJfQ09FRl9WIHwgRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIsCiAKIAkubnVtX21ncnMgPSAyLAogCS5udW1fb3ZscyA9IDMsCiAJLnN1cHBvcnRlZF9kaXNwbGF5cyA9IG9tYXAzNDMwX2Rzc19zdXBwb3J0ZWRfZGlzcGxheXMsCiAJLnN1cHBvcnRlZF9jb2xvcl9tb2RlcyA9IG9tYXAzX2Rzc19zdXBwb3J0ZWRfY29sb3JfbW9kZXMsCisJLm92ZXJsYXlfY2FwcyA9IG9tYXAzNDMwX2Rzc19vdmVybGF5X2NhcHMsCiAJLmNsa3NyY19uYW1lcyA9IG9tYXAzX2Rzc19jbGtfc291cmNlX25hbWVzLAogCS5kc3NfcGFyYW1zID0gb21hcDNfZHNzX3BhcmFtX3JhbmdlLAogCS5idWZmZXJfc2l6ZV91bml0ID0gMSwKQEAgLTMxMCwxOCArMzgxLDE5IEBACiAJLm51bV9yZWdfZmllbGRzID0gQVJSQVlfU0laRShvbWFwM19kc3NfcmVnX2ZpZWxkcyksCiAKIAkuaGFzX2ZlYXR1cmUgICAgPQotCQlGRUFUX0dMT0JBTF9BTFBIQSB8IEZFQVRfTENERU5BQkxFUE9MIHwKKwkJRkVBVF9MQ0RFTkFCTEVQT0wgfAogCQlGRUFUX0xDREVOQUJMRVNJR05BTCB8IEZFQVRfUENLRlJFRUVOQUJMRSB8Ci0JCUZFQVRfUFJFX01VTFRfQUxQSEEgfCBGRUFUX0ZVTkNHQVRFRCB8CisJCUZFQVRfRlVOQ0dBVEVEIHwKIAkJRkVBVF9ST1dSRVBFQVRFTkFCTEUgfCBGRUFUX0xJTkVCVUZGRVJTUExJVCB8CiAJCUZFQVRfUkVTSVpFQ09ORiB8IEZFQVRfRFNJX1BMTF9QV1JfQlVHIHwKIAkJRkVBVF9EU0lfUExMX0ZSRVFTRUwgfCBGRUFUX0NQUiB8IEZFQVRfUFJFTE9BRCB8Ci0JCUZFQVRfRklSX0NPRUZfViwKKwkJRkVBVF9GSVJfQ09FRl9WIHwgRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIsCiAKIAkubnVtX21ncnMgPSAyLAogCS5udW1fb3ZscyA9IDMsCiAJLnN1cHBvcnRlZF9kaXNwbGF5cyA9IG9tYXAzNjMwX2Rzc19zdXBwb3J0ZWRfZGlzcGxheXMsCiAJLnN1cHBvcnRlZF9jb2xvcl9tb2RlcyA9IG9tYXAzX2Rzc19zdXBwb3J0ZWRfY29sb3JfbW9kZXMsCisJLm92ZXJsYXlfY2FwcyA9IG9tYXAzNjMwX2Rzc19vdmVybGF5X2NhcHMsCiAJLmNsa3NyY19uYW1lcyA9IG9tYXAzX2Rzc19jbGtfc291cmNlX25hbWVzLAogCS5kc3NfcGFyYW1zID0gb21hcDNfZHNzX3BhcmFtX3JhbmdlLAogCS5idWZmZXJfc2l6ZV91bml0ID0gMSwKQEAgLTMzNSwxNyArNDA3LDE4IEBACiAJLm51bV9yZWdfZmllbGRzID0gQVJSQVlfU0laRShvbWFwNF9kc3NfcmVnX2ZpZWxkcyksCiAKIAkuaGFzX2ZlYXR1cmUJPQotCQlGRUFUX0dMT0JBTF9BTFBIQSB8IEZFQVRfUFJFX01VTFRfQUxQSEEgfAotCQlGRUFUX01HUl9MQ0QyIHwgRkVBVF9HTE9CQUxfQUxQSEFfVklEMSB8CisJCUZFQVRfTUdSX0xDRDIgfAogCQlGRUFUX0NPUkVfQ0xLX0RJViB8IEZFQVRfTENEX0NMS19TUkMgfAogCQlGRUFUX0RTSV9EQ1NfQ01EX0NPTkZJR19WQyB8IEZFQVRfRFNJX1ZDX09DUF9XSURUSCB8CiAJCUZFQVRfRFNJX0dOUSB8IEZFQVRfSEFORExFX1VWX1NFUEFSQVRFIHwgRkVBVF9BVFRSMiB8Ci0JCUZFQVRfQ1BSIHwgRkVBVF9QUkVMT0FEIHwgRkVBVF9GSVJfQ09FRl9WLAorCQlGRUFUX0NQUiB8IEZFQVRfUFJFTE9BRCB8IEZFQVRfRklSX0NPRUZfViB8CisJCUZFQVRfQUxQSEFfRlJFRV9aT1JERVIsCiAKIAkubnVtX21ncnMgPSAzLAotCS5udW1fb3ZscyA9IDMsCisJLm51bV9vdmxzID0gNCwKIAkuc3VwcG9ydGVkX2Rpc3BsYXlzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9kaXNwbGF5cywKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKKwkub3ZlcmxheV9jYXBzID0gb21hcDRfZHNzX292ZXJsYXlfY2FwcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDRfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwNF9kc3NfcGFyYW1fcmFuZ2UsCiAJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxNiwKQEAgLTM1OCwyNCArNDMxLDUwIEBACiAJLm51bV9yZWdfZmllbGRzID0gQVJSQVlfU0laRShvbWFwNF9kc3NfcmVnX2ZpZWxkcyksCiAKIAkuaGFzX2ZlYXR1cmUJPQotCQlGRUFUX0dMT0JBTF9BTFBIQSB8IEZFQVRfUFJFX01VTFRfQUxQSEEgfAotCQlGRUFUX01HUl9MQ0QyIHwgRkVBVF9HTE9CQUxfQUxQSEFfVklEMSB8CisJCUZFQVRfTUdSX0xDRDIgfAogCQlGRUFUX0NPUkVfQ0xLX0RJViB8IEZFQVRfTENEX0NMS19TUkMgfAogCQlGRUFUX0RTSV9EQ1NfQ01EX0NPTkZJR19WQyB8IEZFQVRfRFNJX1ZDX09DUF9XSURUSCB8CiAJCUZFQVRfRFNJX0dOUSB8IEZFQVRfSERNSV9DVFNfU1dNT0RFIHwKIAkJRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUgfCBGRUFUX0FUVFIyIHwgRkVBVF9DUFIgfAotCQlGRUFUX1BSRUxPQUQgfCBGRUFUX0ZJUl9DT0VGX1YsCisJCUZFQVRfUFJFTE9BRCB8IEZFQVRfRklSX0NPRUZfViB8IEZFQVRfQUxQSEFfRlJFRV9aT1JERVIsCiAKIAkubnVtX21ncnMgPSAzLAotCS5udW1fb3ZscyA9IDMsCisJLm51bV9vdmxzID0gNCwKIAkuc3VwcG9ydGVkX2Rpc3BsYXlzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9kaXNwbGF5cywKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKKwkub3ZlcmxheV9jYXBzID0gb21hcDRfZHNzX292ZXJsYXlfY2FwcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDRfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwNF9kc3NfcGFyYW1fcmFuZ2UsCiAJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxNiwKIAkuYnVyc3Rfc2l6ZV91bml0ID0gMTYsCiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDRfRFNTX0hETUkpCisvKiBIRE1JIE9NQVA0IEZ1bmN0aW9ucyovCitzdGF0aWMgY29uc3Qgc3RydWN0IHRpX2hkbWlfaXBfb3BzIG9tYXA0X2hkbWlfZnVuY3Rpb25zID0geworCisJLnZpZGVvX2NvbmZpZ3VyZQk9CXRpX2hkbWlfNHh4eF9iYXNpY19jb25maWd1cmUsCisJLnBoeV9lbmFibGUJCT0JdGlfaGRtaV80eHh4X3BoeV9lbmFibGUsCisJLnBoeV9kaXNhYmxlCQk9CXRpX2hkbWlfNHh4eF9waHlfZGlzYWJsZSwKKwkucmVhZF9lZGlkCQk9CXRpX2hkbWlfNHh4eF9yZWFkX2VkaWQsCisJLmRldGVjdAkJCT0JdGlfaGRtaV80eHh4X2RldGVjdCwKKwkucGxsX2VuYWJsZQkJPQl0aV9oZG1pXzR4eHhfcGxsX2VuYWJsZSwKKwkucGxsX2Rpc2FibGUJCT0JdGlfaGRtaV80eHh4X3BsbF9kaXNhYmxlLAorCS52aWRlb19lbmFibGUJCT0JdGlfaGRtaV80eHh4X3dwX3ZpZGVvX3N0YXJ0LAorCS5kdW1wX3dyYXBwZXIJCT0JdGlfaGRtaV80eHh4X3dwX2R1bXAsCisJLmR1bXBfY29yZQkJPQl0aV9oZG1pXzR4eHhfY29yZV9kdW1wLAorCS5kdW1wX3BsbAkJPQl0aV9oZG1pXzR4eHhfcGxsX2R1bXAsCisJLmR1bXBfcGh5CQk9CXRpX2hkbWlfNHh4eF9waHlfZHVtcCwKKworfTsKKwordm9pZCBkc3NfaW5pdF9oZG1pX2lwX29wcyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkKKwkJaXBfZGF0YS0+b3BzID0gJm9tYXA0X2hkbWlfZnVuY3Rpb25zOworfQorI2VuZGlmCisKIC8qIEZ1bmN0aW9ucyByZXR1cm5pbmcgdmFsdWVzIHJlbGF0ZWQgdG8gYSBEU1MgZmVhdHVyZSAqLwogaW50IGRzc19mZWF0X2dldF9udW1fbWdycyh2b2lkKQogewpAQCAtNDA3LDYgKzUwNiwxMSBAQAogCXJldHVybiBvbWFwX2N1cnJlbnRfZHNzX2ZlYXR1cmVzLT5zdXBwb3J0ZWRfY29sb3JfbW9kZXNbcGxhbmVdOwogfQogCitlbnVtIG9tYXBfb3ZlcmxheV9jYXBzIGRzc19mZWF0X2dldF9vdmVybGF5X2NhcHMoZW51bSBvbWFwX3BsYW5lIHBsYW5lKQoreworCXJldHVybiBvbWFwX2N1cnJlbnRfZHNzX2ZlYXR1cmVzLT5vdmVybGF5X2NhcHNbcGxhbmVdOworfQorCiBib29sIGRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5oIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmgKaW5kZXggYjczOThjYi4uNmE2YzA1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmgKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmgKQEAgLTIwLDE2ICsyMCwxNyBAQAogI2lmbmRlZiBfX09NQVAyX0RTU19GRUFUVVJFU19ICiAjZGVmaW5lIF9fT01BUDJfRFNTX0ZFQVRVUkVTX0gKIAorI2lmIGRlZmluZWQoQ09ORklHX09NQVA0X0RTU19IRE1JKQorI2luY2x1ZGUgInRpX2hkbWkuaCIKKyNlbmRpZgorCiAjZGVmaW5lIE1BWF9EU1NfTUFOQUdFUlMJMwotI2RlZmluZSBNQVhfRFNTX09WRVJMQVlTCTMKKyNkZWZpbmUgTUFYX0RTU19PVkVSTEFZUwk0CiAjZGVmaW5lIE1BWF9EU1NfTENEX01BTkFHRVJTCTIKICNkZWZpbmUgTUFYX05VTV9EU0kJCTIKIAogLyogRFNTIGhhcyBmZWF0dXJlIGlkICovCiBlbnVtIGRzc19mZWF0X2lkIHsKLQlGRUFUX0dMT0JBTF9BTFBIQQkJPSAxIDw8IDAsCi0JRkVBVF9HTE9CQUxfQUxQSEFfVklEMQkJPSAxIDw8IDEsCi0JRkVBVF9QUkVfTVVMVF9BTFBIQQkJPSAxIDw8IDIsCiAJRkVBVF9MQ0RFTkFCTEVQT0wJCT0gMSA8PCAzLAogCUZFQVRfTENERU5BQkxFU0lHTkFMCQk9IDEgPDwgNCwKIAlGRUFUX1BDS0ZSRUVFTkFCTEUJCT0gMSA8PCA1LApAQCAtNTUsNiArNTYsOCBAQAogCUZFQVRfQ1BSCQkJPSAxIDw8IDIzLAogCUZFQVRfUFJFTE9BRAkJCT0gMSA8PCAyNCwKIAlGRUFUX0ZJUl9DT0VGX1YJCQk9IDEgPDwgMjUsCisJRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIJCT0gMSA8PCAyNiwKKwlGRUFUX0FMUEhBX0ZSRUVfWk9SREVSCQk9IDEgPDwgMjcsCiB9OwogCiAvKiBEU1MgcmVnaXN0ZXIgZmllbGQgaWQgKi8KQEAgLTc1LDEyICs3OCwxNCBAQAogCiBlbnVtIGRzc19yYW5nZV9wYXJhbSB7CiAJRkVBVF9QQVJBTV9EU1NfRkNLLAorCUZFQVRfUEFSQU1fRFNTX1BDRCwKIAlGRUFUX1BBUkFNX0RTSVBMTF9SRUdOLAogCUZFQVRfUEFSQU1fRFNJUExMX1JFR00sCiAJRkVBVF9QQVJBTV9EU0lQTExfUkVHTV9ESVNQQywKIAlGRUFUX1BBUkFNX0RTSVBMTF9SRUdNX0RTSSwKIAlGRUFUX1BBUkFNX0RTSVBMTF9GSU5ULAogCUZFQVRfUEFSQU1fRFNJUExMX0xQRElWLAorCUZFQVRfUEFSQU1fRE9XTlNDQUxFLAogfTsKIAogLyogRFNTIEZlYXR1cmUgRnVuY3Rpb25zICovCkBAIC05MCw2ICs5NSw3IEBACiB1bnNpZ25lZCBsb25nIGRzc19mZWF0X2dldF9wYXJhbV9tYXgoZW51bSBkc3NfcmFuZ2VfcGFyYW0gcGFyYW0pOwogZW51bSBvbWFwX2Rpc3BsYXlfdHlwZSBkc3NfZmVhdF9nZXRfc3VwcG9ydGVkX2Rpc3BsYXlzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwogZW51bSBvbWFwX2NvbG9yX21vZGUgZHNzX2ZlYXRfZ2V0X3N1cHBvcnRlZF9jb2xvcl9tb2RlcyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOworZW51bSBvbWFwX292ZXJsYXlfY2FwcyBkc3NfZmVhdF9nZXRfb3ZlcmxheV9jYXBzKGVudW0gb21hcF9wbGFuZSBwbGFuZSk7CiBib29sIGRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSk7CiBjb25zdCBjaGFyICpkc3NfZmVhdF9nZXRfY2xrX3NvdXJjZV9uYW1lKGVudW0gb21hcF9kc3NfY2xrX3NvdXJjZSBpZCk7CkBAIC0xMDAsNCArMTA2LDcgQEAKIGJvb2wgZHNzX2hhc19mZWF0dXJlKGVudW0gZHNzX2ZlYXRfaWQgaWQpOwogdm9pZCBkc3NfZmVhdF9nZXRfcmVnX2ZpZWxkKGVudW0gZHNzX2ZlYXRfcmVnX2ZpZWxkIGlkLCB1OCAqc3RhcnQsIHU4ICplbmQpOwogdm9pZCBkc3NfZmVhdHVyZXNfaW5pdCh2b2lkKTsKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQNF9EU1NfSERNSSkKK3ZvaWQgZHNzX2luaXRfaGRtaV9pcF9vcHMoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7CisjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaS5jCmluZGV4IDI1NmYyN2EuLjMyNjJmMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWkuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9oZG1pLmMKQEAgLTM3LDI2ICszNyw0MSBAQAogCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JX01PRFVMRSkKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSAidGlfaGRtaV80eHh4X2lwLmgiCiAjZW5kaWYKIAorI2luY2x1ZGUgInRpX2hkbWkuaCIKICNpbmNsdWRlICJkc3MuaCIKLSNpbmNsdWRlICJoZG1pLmgiCiAjaW5jbHVkZSAiZHNzX2ZlYXR1cmVzLmgiCiAKKyNkZWZpbmUgSERNSV9XUAkJCTB4MAorI2RlZmluZSBIRE1JX0NPUkVfU1lTCQkweDQwMAorI2RlZmluZSBIRE1JX0NPUkVfQVYJCTB4OTAwCisjZGVmaW5lIEhETUlfUExMQ1RSTAkJMHgyMDAKKyNkZWZpbmUgSERNSV9QSFkJCTB4MzAwCisKKy8qIEhETUkgRURJRCBMZW5ndGggbW92ZSB0aGlzICovCisjZGVmaW5lIEhETUlfRURJRF9NQVhfTEVOR1RICQkJMjU2CisjZGVmaW5lIEVESURfVElNSU5HX0RFU0NSSVBUT1JfU0laRQkJMHgxMgorI2RlZmluZSBFRElEX0RFU0NSSVBUT1JfQkxPQ0swX0FERFJFU1MJCTB4MzYKKyNkZWZpbmUgRURJRF9ERVNDUklQVE9SX0JMT0NLMV9BRERSRVNTCQkweDgwCisjZGVmaW5lIEVESURfU0laRV9CTE9DSzBfVElNSU5HX0RFU0NSSVBUT1IJNAorI2RlZmluZSBFRElEX1NJWkVfQkxPQ0sxX1RJTUlOR19ERVNDUklQVE9SCTQKKworI2RlZmluZSBPTUFQX0hETUlfVElNSU5HU19OQgkJCTM0CisKKyNkZWZpbmUgSERNSV9ERUZBVUxUX1JFR04gMTYKKyNkZWZpbmUgSERNSV9ERUZBVUxUX1JFR00yIDEKKwogc3RhdGljIHN0cnVjdCB7CiAJc3RydWN0IG11dGV4IGxvY2s7CiAJc3RydWN0IG9tYXBfZGlzcGxheV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXZvaWQgX19pb21lbSAqYmFzZV93cDsJLyogSERNSSB3cmFwcGVyICovCisJc3RydWN0IGhkbWlfaXBfZGF0YSBpcF9kYXRhOwogCWludCBjb2RlOwogCWludCBtb2RlOwotCXU4IGVkaWRbSERNSV9FRElEX01BWF9MRU5HVEhdOwotCXU4IGVkaWRfc2V0OwotCWJvb2wgY3VzdG9tX3NldDsKLQlzdHJ1Y3QgaGRtaV9jb25maWcgY2ZnOwogCiAJc3RydWN0IGNsayAqc3lzX2NsazsKLQlzdHJ1Y3QgY2xrICpoZG1pX2NsazsKIH0gaGRtaTsKIAogLyoKQEAgLTE0NCwzMCArMTU5LDYgQEAKIAktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKIAktMSwgMjcsIDI4LCAtMSwgMzN9OwogCi1zdGF0aWMgY29uc3QgdTggZWRpZF9oZWFkZXJbOF0gPSB7MHgwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDB9OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGRtaV93cml0ZV9yZWcoY29uc3Qgc3RydWN0IGhkbWlfcmVnIGlkeCwgdTMyIHZhbCkKLXsKLQlfX3Jhd193cml0ZWwodmFsLCBoZG1pLmJhc2Vfd3AgKyBpZHguaWR4KTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgaGRtaV9yZWFkX3JlZyhjb25zdCBzdHJ1Y3QgaGRtaV9yZWcgaWR4KQotewotCXJldHVybiBfX3Jhd19yZWFkbChoZG1pLmJhc2Vfd3AgKyBpZHguaWR4KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKGNvbnN0IHN0cnVjdCBoZG1pX3JlZyBpZHgsCi0JCQkJaW50IGIyLCBpbnQgYjEsIHUzMiB2YWwpCi17Ci0JdTMyIHQgPSAwOwotCXdoaWxlICh2YWwgIT0gUkVHX0dFVChpZHgsIGIyLCBiMSkpIHsKLQkJdWRlbGF5KDEpOwotCQlpZiAodCsrID4gMTAwMDApCi0JCQlyZXR1cm4gIXZhbDsKLQl9Ci0JcmV0dXJuIHZhbDsKLX0KLQogc3RhdGljIGludCBoZG1pX3J1bnRpbWVfZ2V0KHZvaWQpCiB7CiAJaW50IHI7CkBAIC0xOTMsMzA0ICsxODQsNyBAQAogewogCURTU0RCRygiaW5pdF9kaXNwbGF5XG4iKTsKIAotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhkbWlfcGxsX2luaXQoZW51bSBoZG1pX2Nsa19yZWZzZWwgcmVmc2VsLCBpbnQgZGNvZnJlcSwKLQkJc3RydWN0IGhkbWlfcGxsX2luZm8gKmZtdCwgdTE2IHNkKQotewotCXUzMiByOwotCi0JLyogUExMIHN0YXJ0IGFsd2F5cyB1c2UgbWFudWFsIG1vZGUgKi8KLQlSRUdfRkxEX01PRChQTExDVFJMX1BMTF9DT05UUk9MLCAweDAsIDAsIDApOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkcxKTsKLQlyID0gRkxEX01PRChyLCBmbXQtPnJlZ20sIDIwLCA5KTsgLyogQ0ZHMV9QTExfUkVHTSAqLwotCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVnbiwgOCwgMSk7ICAvKiBDRkcxX1BMTF9SRUdOICovCi0KLQloZG1pX3dyaXRlX3JlZyhQTExDVFJMX0NGRzEsIHIpOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkcyKTsKLQotCXIgPSBGTERfTU9EKHIsIDB4MCwgMTIsIDEyKTsgLyogUExMX0hJR0hGUkVRIGRpdmlkZSBieSAyICovCi0JciA9IEZMRF9NT0QociwgMHgxLCAxMywgMTMpOyAvKiBQTExfUkVGRU4gKi8KLQlyID0gRkxEX01PRChyLCAweDAsIDE0LCAxNCk7IC8qIFBIWV9DTEtJTkVOIGRlLWFzc2VydCBkdXJpbmcgbG9ja2luZyAqLwotCi0JaWYgKGRjb2ZyZXEpIHsKLQkJLyogZGl2aWRlciBwcm9ncmFtbWluZyBmb3IgZnJlcXVlbmN5IGJleW9uZCAxMDAwTWh6ICovCi0JCVJFR19GTERfTU9EKFBMTENUUkxfQ0ZHMywgc2QsIDE3LCAxMCk7Ci0JCXIgPSBGTERfTU9EKHIsIDB4NCwgMywgMSk7IC8qIDEwMDBNSHogYW5kIDIwMDBNSHogKi8KLQl9IGVsc2UgewotCQlyID0gRkxEX01PRChyLCAweDIsIDMsIDEpOyAvKiA1MDBNSHogYW5kIDEwMDBNSHogKi8KLQl9Ci0KLQloZG1pX3dyaXRlX3JlZyhQTExDVFJMX0NGRzIsIHIpOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkc0KTsKLQlyID0gRkxEX01PRChyLCBmbXQtPnJlZ20yLCAyNCwgMTgpOwotCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVnbWYsIDE3LCAwKTsKLQotCWhkbWlfd3JpdGVfcmVnKFBMTENUUkxfQ0ZHNCwgcik7Ci0KLQkvKiBnbyBub3cgKi8KLQlSRUdfRkxEX01PRChQTExDVFJMX1BMTF9HTywgMHgxLCAwLCAwKTsKLQotCS8qIHdhaXQgZm9yIGJpdCBjaGFuZ2UgKi8KLQlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKFBMTENUUkxfUExMX0dPLCAwLCAwLCAxKSAhPSAxKSB7Ci0JCURTU0VSUigiUExMIEdPIGJpdCBub3Qgc2V0XG4iKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfQotCi0JLyogV2FpdCB0aWxsIHRoZSBsb2NrIGJpdCBpcyBzZXQgaW4gUExMIHN0YXR1cyAqLwotCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoUExMQ1RSTF9QTExfU1RBVFVTLCAxLCAxLCAxKSAhPSAxKSB7Ci0JCURTU1dBUk4oImNhbm5vdCBsb2NrIFBMTFxuIik7Ci0JCURTU1dBUk4oIkNGRzEgMHgleFxuIiwKLQkJCWhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkcxKSk7Ci0JCURTU1dBUk4oIkNGRzIgMHgleFxuIiwKLQkJCWhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkcyKSk7Ci0JCURTU1dBUk4oIkNGRzQgMHgleFxuIiwKLQkJCWhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkc0KSk7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCURTU0RCRygiUExMIGxvY2tlZCFcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFBIWV9QV1JfQ01EICovCi1zdGF0aWMgaW50IGhkbWlfc2V0X3BoeV9wd3IoZW51bSBoZG1pX3BoeV9wd3IgdmFsKQotewotCS8qIENvbW1hbmQgZm9yIHBvd2VyIGNvbnRyb2wgb2YgSERNSSBQSFkgKi8KLQlSRUdfRkxEX01PRChIRE1JX1dQX1BXUl9DVFJMLCB2YWwsIDcsIDYpOwotCi0JLyogU3RhdHVzIG9mIHRoZSBwb3dlciBjb250cm9sIG9mIEhETUkgUEhZICovCi0JaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShIRE1JX1dQX1BXUl9DVFJMLCA1LCA0LCB2YWwpICE9IHZhbCkgewotCQlEU1NFUlIoIkZhaWxlZCB0byBzZXQgUEhZIHBvd2VyIG1vZGUgdG8gJWRcbiIsIHZhbCk7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBQTExfUFdSX0NNRCAqLwotc3RhdGljIGludCBoZG1pX3NldF9wbGxfcHdyKGVudW0gaGRtaV9wbGxfcHdyIHZhbCkKLXsKLQkvKiBDb21tYW5kIGZvciBwb3dlciBjb250cm9sIG9mIEhETUkgUExMICovCi0JUkVHX0ZMRF9NT0QoSERNSV9XUF9QV1JfQ1RSTCwgdmFsLCAzLCAyKTsKLQotCS8qIHdhaXQgdGlsbCBQSFlfUFdSX1NUQVRVUyBpcyBzZXQgKi8KLQlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKEhETUlfV1BfUFdSX0NUUkwsIDEsIDAsIHZhbCkgIT0gdmFsKSB7Ci0JCURTU0VSUigiRmFpbGVkIHRvIHNldCBQSFlfUFdSX1NUQVRVU1xuIik7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhkbWlfcGxsX3Jlc2V0KHZvaWQpCi17Ci0JLyogU1lTUkVTRVQgIGNvbnRyb2xsZWQgYnkgcG93ZXIgRlNNICovCi0JUkVHX0ZMRF9NT0QoUExMQ1RSTF9QTExfQ09OVFJPTCwgMHgwLCAzLCAzKTsKLQotCS8qIFJFQUQgMHgwIHJlc2V0IGlzIGluIHByb2dyZXNzICovCi0JaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShQTExDVFJMX1BMTF9TVEFUVVMsIDAsIDAsIDEpICE9IDEpIHsKLQkJRFNTRVJSKCJGYWlsZWQgdG8gc3lzcmVzZXQgUExMXG4iKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGRtaV9waHlfaW5pdCh2b2lkKQotewotCXUxNiByID0gMDsKLQotCXIgPSBoZG1pX3NldF9waHlfcHdyKEhETUlfUEhZUFdSQ01EX0xET09OKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlyID0gaGRtaV9zZXRfcGh5X3B3cihIRE1JX1BIWVBXUkNNRF9UWE9OKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQkvKgotCSAqIFJlYWQgYWRkcmVzcyAwIGluIG9yZGVyIHRvIGdldCB0aGUgU0NQIHJlc2V0IGRvbmUgY29tcGxldGVkCi0JICogRHVtbXkgYWNjZXNzIHBlcmZvcm1lZCB0byBtYWtlIHN1cmUgcmVzZXQgaXMgZG9uZQotCSAqLwotCWhkbWlfcmVhZF9yZWcoSERNSV9UWFBIWV9UWF9DVFJMKTsKLQotCS8qCi0JICogV3JpdGUgdG8gcGh5IGFkZHJlc3MgMCB0byBjb25maWd1cmUgdGhlIGNsb2NrCi0JICogdXNlIEhGQklUQ0xLIHdyaXRlIEhETUlfVFhQSFlfVFhfQ09OVFJPTF9GUkVRT1VUIGZpZWxkCi0JICovCi0JUkVHX0ZMRF9NT0QoSERNSV9UWFBIWV9UWF9DVFJMLCAweDEsIDMxLCAzMCk7Ci0KLQkvKiBXcml0ZSB0byBwaHkgYWRkcmVzcyAxIHRvIHN0YXJ0IEhETUkgbGluZSAoVFhWQUxJRCBhbmQgVE1EU0NMS0VOKSAqLwotCWhkbWlfd3JpdGVfcmVnKEhETUlfVFhQSFlfRElHSVRBTF9DVFJMLCAweEYwMDAwMDAwKTsKLQotCS8qIFNldHVwIG1heCBMRE8gdm9sdGFnZSAqLwotCVJFR19GTERfTU9EKEhETUlfVFhQSFlfUE9XRVJfQ1RSTCwgMHhCLCAzLCAwKTsKLQotCS8qIFdyaXRlIHRvIHBoeSBhZGRyZXNzIDMgdG8gY2hhbmdlIHRoZSBwb2xhcml0eSBjb250cm9sICovCi0JUkVHX0ZMRF9NT0QoSERNSV9UWFBIWV9QQURfQ0ZHX0NUUkwsIDB4MSwgMjcsIDI3KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhkbWlfcGxsX3Byb2dyYW0oc3RydWN0IGhkbWlfcGxsX2luZm8gKmZtdCkKLXsKLQl1MTYgciA9IDA7Ci0JZW51bSBoZG1pX2Nsa19yZWZzZWwgcmVmc2VsOwotCi0JciA9IGhkbWlfc2V0X3BsbF9wd3IoSERNSV9QTExQV1JDTURfQUxMT0ZGKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlyID0gaGRtaV9zZXRfcGxsX3B3cihIRE1JX1BMTFBXUkNNRF9CT1RIT05fQUxMQ0xLUyk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JciA9IGhkbWlfcGxsX3Jlc2V0KCk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JcmVmc2VsID0gSERNSV9SRUZTRUxfU1lTQ0xLOwotCi0JciA9IGhkbWlfcGxsX2luaXQocmVmc2VsLCBmbXQtPmRjb2ZyZXEsIGZtdCwgZm10LT5yZWdzZCk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfcGh5X29mZih2b2lkKQotewotCWhkbWlfc2V0X3BoeV9wd3IoSERNSV9QSFlQV1JDTURfT0ZGKTsKLX0KLQotc3RhdGljIGludCBoZG1pX2NvcmVfZGRjX2VkaWQodTggKnBlZGlkLCBpbnQgZXh0KQotewotCXUzMiBpLCBqOwotCWNoYXIgY2hlY2tzdW0gPSAwOwotCXUzMiBvZmZzZXQgPSAwOwotCi0JLyogVHVybiBvbiBDTEsgZm9yIEREQyAqLwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9EUEQsIDB4NywgMiwgMCk7Ci0KLQkvKgotCSAqIFNXIEhBQ0sgOiBXaXRob3V0IHRoZSBEZWxheSBEREMoaTJjIGJ1cykgcmVhZHMgMCB2YWx1ZXMgLwotCSAqIHJpZ2h0IHNoaWZ0ZWQgdmFsdWVzKCBUaGUgYmVoYXZpb3IgaXMgbm90IGNvbnNpc3RlbnQgYW5kIHNlZW4gb25seQotCSAqIHdpdGggc29tZSBUVidzKQotCSAqLwotCXVzbGVlcF9yYW5nZSg4MDAsIDEwMDApOwotCi0JaWYgKCFleHQpIHsKLQkJLyogQ2xrIFNDTCBEZXZpY2VzICovCi0JCVJFR19GTERfTU9EKEhETUlfQ09SRV9ERENfQ01ELCAweEEsIDMsIDApOwotCi0JCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0lOX1BST0cgKi8KLQkJaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShIRE1JX0NPUkVfRERDX1NUQVRVUywKLQkJCQkJCTQsIDQsIDApICE9IDApIHsKLQkJCURTU0VSUigiRmFpbGVkIHRvIHByb2dyYW0gRERDXG4iKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0KLQkJLyogQ2xlYXIgRklGTyAqLwotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX0NNRCwgMHg5LCAzLCAwKTsKLQotCQkvKiBIRE1JX0NPUkVfRERDX1NUQVRVU19JTl9QUk9HICovCi0JCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoSERNSV9DT1JFX0REQ19TVEFUVVMsCi0JCQkJCQk0LCA0LCAwKSAhPSAwKSB7Ci0JCQlEU1NFUlIoIkZhaWxlZCB0byBwcm9ncmFtIEREQ1xuIik7Ci0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJfQotCi0JfSBlbHNlIHsKLQkJaWYgKGV4dCAlIDIgIT0gMCkKLQkJCW9mZnNldCA9IDB4ODA7Ci0JfQotCi0JLyogTG9hZCBTZWdtZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX1NFR00sIGV4dC8yLCA3LCAwKTsKLQotCS8qIExvYWQgU2xhdmUgQWRkcmVzcyBSZWdpc3RlciAqLwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9ERENfQUREUiwgMHhBMCA+PiAxLCA3LCAxKTsKLQotCS8qIExvYWQgT2Zmc2V0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX09GRlNFVCwgb2Zmc2V0LCA3LCAwKTsKLQotCS8qIExvYWQgQnl0ZSBDb3VudCAqLwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9ERENfQ09VTlQxLCAweDgwLCA3LCAwKTsKLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX0NPVU5UMiwgMHgwLCAxLCAwKTsKLQotCS8qIFNldCBERENfQ01EICovCi0JaWYgKGV4dCkKLQkJUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0REQ19DTUQsIDB4NCwgMywgMCk7Ci0JZWxzZQotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX0NNRCwgMHgyLCAzLCAwKTsKLQotCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0JVU19MT1cgKi8KLQlpZiAoUkVHX0dFVChIRE1JX0NPUkVfRERDX1NUQVRVUywgNiwgNikgPT0gMSkgewotCQlEU1NXQVJOKCJJMkMgQnVzIExvdz9cbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JLyogSERNSV9DT1JFX0REQ19TVEFUVVNfTk9fQUNLICovCi0JaWYgKFJFR19HRVQoSERNSV9DT1JFX0REQ19TVEFUVVMsIDUsIDUpID09IDEpIHsKLQkJRFNTV0FSTigiSTJDIE5vIEFja1xuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWkgPSBleHQgKiAxMjg7Ci0JaiA9IDA7Ci0Jd2hpbGUgKCgoUkVHX0dFVChIRE1JX0NPUkVfRERDX1NUQVRVUywgNCwgNCkgPT0gMSkgfHwKLQkJCShSRUdfR0VUKEhETUlfQ09SRV9ERENfU1RBVFVTLCAyLCAyKSA9PSAwKSkgJiYKLQkJCWogPCAxMjgpIHsKLQotCQlpZiAoUkVHX0dFVChIRE1JX0NPUkVfRERDX1NUQVRVUywgMiwgMikgPT0gMCkgewotCQkJLyogRklGTyBub3QgZW1wdHkgKi8KLQkJCXBlZGlkW2krK10gPSBSRUdfR0VUKEhETUlfQ09SRV9ERENfREFUQSwgNywgMCk7Ci0JCQlqKys7Ci0JCX0KLQl9Ci0KLQlmb3IgKGogPSAwOyBqIDwgMTI4OyBqKyspCi0JCWNoZWNrc3VtICs9IHBlZGlkW2pdOwotCi0JaWYgKGNoZWNrc3VtICE9IDApIHsKLQkJRFNTRVJSKCJFLUVESUQgY2hlY2tzdW0gZmFpbGVkISFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZWFkX2VkaWQodTggKnBlZGlkLCB1MTYgbWF4X2xlbmd0aCkKLXsKLQlpbnQgciA9IDAsIG4gPSAwLCBpID0gMDsKLQlpbnQgbWF4X2V4dF9ibG9ja3MgPSAobWF4X2xlbmd0aCAvIDEyOCkgLSAxOwotCi0JciA9IGhkbWlfY29yZV9kZGNfZWRpZChwZWRpZCwgMCk7Ci0JaWYgKHIpIHsKLQkJcmV0dXJuIHI7Ci0JfSBlbHNlIHsKLQkJbiA9IHBlZGlkWzB4N2VdOwotCi0JCS8qCi0JCSAqIFJFQURNRTogbmVlZCB0byBjb21wbHkgd2l0aCBtYXhfbGVuZ3RoIHNldCBieSB0aGUgY2FsbGVyLgotCQkgKiBCZXR0ZXIgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHRvIGFsbG9jYXRlIG5lY2Vzc2FyeQotCQkgKiBtZW1vcnkgdG8gc3RvcmUgRURJRCBhY2NvcmRpbmcgdG8gbmJfYmxvY2sgZmllbGQgZm91bmQKLQkJICogaW4gZmlyc3QgYmxvY2sKLQkJICovCi0JCWlmIChuID4gbWF4X2V4dF9ibG9ja3MpCi0JCQluID0gbWF4X2V4dF9ibG9ja3M7Ci0KLQkJZm9yIChpID0gMTsgaSA8PSBuOyBpKyspIHsKLQkJCXIgPSBoZG1pX2NvcmVfZGRjX2VkaWQocGVkaWQsIGkpOwotCQkJaWYgKHIpCi0JCQkJcmV0dXJuIHI7Ci0JCX0KLQl9CisJZHNzX2luaXRfaGRtaV9pcF9vcHMoJmhkbWkuaXBfZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxOCw3ICsyMTIsNyBAQAogewogCWludCBpID0gMCwgY29kZSA9IC0xLCB0ZW1wX3ZzeW5jID0gMCwgdGVtcF9oc3luYyA9IDA7CiAJaW50IHRpbWluZ192c3luYyA9IDAsIHRpbWluZ19oc3luYyA9IDA7Ci0Jc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyB0ZW1wOworCXN0cnVjdCBoZG1pX3ZpZGVvX3RpbWluZ3MgdGVtcDsKIAlzdHJ1Y3QgaGRtaV9jbSBjbSA9IHstMX07CiAJRFNTREJHKCJoZG1pX2dldF9jb2RlXG4iKTsKIApAQCAtNTU2LDUwMCArMjUwLDYgQEAKIAlyZXR1cm4gY207CiB9CiAKLXN0YXRpYyB2b2lkIGdldF9ob3J6X3ZlcnRfdGltaW5nX2luZm8oaW50IGN1cnJlbnRfZGVzY3JpcHRvcl9hZGRycywgdTggKmVkaWQgLAotCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQotewotCS8qIFggYW5kIFkgcmVzb2x1dGlvbiAqLwotCXRpbWluZ3MtPnhfcmVzID0gKCgoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyA0XSAmIDB4RjApIDw8IDQpIHwKLQkJCSBlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDJdKTsKLQl0aW1pbmdzLT55X3JlcyA9ICgoKGVkaWRbY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzICsgN10gJiAweEYwKSA8PCA0KSB8Ci0JCQkgZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyA1XSk7Ci0KLQl0aW1pbmdzLT5waXhlbF9jbG9jayA9ICgoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAxXSA8PCA4KSB8Ci0JCQkJZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnNdKTsKLQotCXRpbWluZ3MtPnBpeGVsX2Nsb2NrID0gMTAgKiB0aW1pbmdzLT5waXhlbF9jbG9jazsKLQotCS8qIEhPUklaT05UQUwgRlJPTlQgUE9SQ0ggKi8KLQl0aW1pbmdzLT5oZnAgPSBlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDhdIHwKLQkJCSgoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAxMV0gJiAweGMwKSA8PCAyKTsKLQkvKiBIT1JJWk9OVEFMIFNZTkMgV0lEVEggKi8KLQl0aW1pbmdzLT5oc3cgPSBlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDldIHwKLQkJCSgoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAxMV0gJiAweDMwKSA8PCA0KTsKLQkvKiBIT1JJWk9OVEFMIEJBQ0sgUE9SQ0ggKi8KLQl0aW1pbmdzLT5oYnAgPSAoKChlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDRdICYgMHgwRikgPDwgOCkgfAotCQkJZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAzXSkgLQotCQkJKHRpbWluZ3MtPmhmcCArIHRpbWluZ3MtPmhzdyk7Ci0JLyogVkVSVElDQUwgRlJPTlQgUE9SQ0ggKi8KLQl0aW1pbmdzLT52ZnAgPSAoKGVkaWRbY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzICsgMTBdICYgMHhGMCkgPj4gNCkgfAotCQkJKChlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDExXSAmIDB4MGYpIDw8IDIpOwotCS8qIFZFUlRJQ0FMIFNZTkMgV0lEVEggKi8KLQl0aW1pbmdzLT52c3cgPSAoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAxMF0gJiAweDBGKSB8Ci0JCQkoKGVkaWRbY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzICsgMTFdICYgMHgwMykgPDwgNCk7Ci0JLyogVkVSVElDQUwgQkFDSyBQT1JDSCAqLwotCXRpbWluZ3MtPnZicCA9ICgoKGVkaWRbY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzICsgN10gJiAweDBGKSA8PCA4KSB8Ci0JCQllZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDZdKSAtCi0JCQkodGltaW5ncy0+dmZwICsgdGltaW5ncy0+dnN3KTsKLQotfQotCi0vKiBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiBmcm9tIEVESUQgKi8KLXN0YXRpYyB2b2lkIGdldF9lZGlkX3RpbWluZ19kYXRhKHU4ICplZGlkKQotewotCXU4IGNvdW50OwotCXUxNiBjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnM7Ci0Jc3RydWN0IGhkbWlfY20gY207Ci0Jc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyBlZGlkX3RpbWluZ3M7Ci0KLQkvKiBzZWFyY2ggYmxvY2sgMCwgdGhlcmUgYXJlIDQgRFREcyBhcnJhbmdlZCBpbiBwcmlvcml0eSBvcmRlciAqLwotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEVESURfU0laRV9CTE9DSzBfVElNSU5HX0RFU0NSSVBUT1I7IGNvdW50KyspIHsKLQkJY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzID0KLQkJCUVESURfREVTQ1JJUFRPUl9CTE9DSzBfQUREUkVTUyArCi0JCQljb3VudCAqIEVESURfVElNSU5HX0RFU0NSSVBUT1JfU0laRTsKLQkJZ2V0X2hvcnpfdmVydF90aW1pbmdfaW5mbyhjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMsCi0JCQkJZWRpZCwgJmVkaWRfdGltaW5ncyk7Ci0JCWNtID0gaGRtaV9nZXRfY29kZSgmZWRpZF90aW1pbmdzKTsKLQkJRFNTREJHKCJCbG9jazBbJWRdIHZhbHVlIG1hdGNoZXMgY29kZSA9ICVkICwgbW9kZSA9ICVkXG4iLAotCQkJY291bnQsIGNtLmNvZGUsIGNtLm1vZGUpOwotCQlpZiAoY20uY29kZSA9PSAtMSkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQloZG1pLmNvZGUgPSBjbS5jb2RlOwotCQkJaGRtaS5tb2RlID0gY20ubW9kZTsKLQkJCURTU0RCRygiY29kZSA9ICVkICwgbW9kZSA9ICVkXG4iLAotCQkJCWhkbWkuY29kZSwgaGRtaS5tb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlpZiAoZWRpZFsweDdlXSAhPSAweDAwKSB7Ci0JCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEVESURfU0laRV9CTE9DSzFfVElNSU5HX0RFU0NSSVBUT1I7Ci0JCQljb3VudCsrKSB7Ci0JCQljdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgPQotCQkJRURJRF9ERVNDUklQVE9SX0JMT0NLMV9BRERSRVNTICsKLQkJCWNvdW50ICogRURJRF9USU1JTkdfREVTQ1JJUFRPUl9TSVpFOwotCQkJZ2V0X2hvcnpfdmVydF90aW1pbmdfaW5mbyhjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMsCi0JCQkJCQllZGlkLCAmZWRpZF90aW1pbmdzKTsKLQkJCWNtID0gaGRtaV9nZXRfY29kZSgmZWRpZF90aW1pbmdzKTsKLQkJCURTU0RCRygiQmxvY2sxWyVkXSB2YWx1ZSBtYXRjaGVzIGNvZGUgPSAlZCwgbW9kZSA9ICVkIiwKLQkJCQljb3VudCwgY20uY29kZSwgY20ubW9kZSk7Ci0JCQlpZiAoY20uY29kZSA9PSAtMSkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQloZG1pLmNvZGUgPSBjbS5jb2RlOwotCQkJCWhkbWkubW9kZSA9IGNtLm1vZGU7Ci0JCQkJRFNTREJHKCJjb2RlID0gJWQgLCBtb2RlID0gJWRcbiIsCi0JCQkJCWhkbWkuY29kZSwgaGRtaS5tb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlEU1NJTkZPKCJubyB2YWxpZCB0aW1pbmcgZm91bmQgLCBmYWxsaW5nIGJhY2sgdG8gVkdBXG4iKTsKLQloZG1pLmNvZGUgPSA0OyAvKiBzZXR0aW5nIGRlZmF1bHQgdmFsdWUgb2YgNjQwIDQ4MCBWR0EgKi8KLQloZG1pLm1vZGUgPSBIRE1JX0RWSTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9yZWFkX2VkaWQoc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqZHApCi17Ci0JaW50IHJldCA9IDAsIGNvZGU7Ci0KLQltZW1zZXQoaGRtaS5lZGlkLCAwLCBIRE1JX0VESURfTUFYX0xFTkdUSCk7Ci0KLQlpZiAoIWhkbWkuZWRpZF9zZXQpCi0JCXJldCA9IHJlYWRfZWRpZChoZG1pLmVkaWQsIEhETUlfRURJRF9NQVhfTEVOR1RIKTsKLQotCWlmICghcmV0KSB7Ci0JCWlmICghbWVtY21wKGhkbWkuZWRpZCwgZWRpZF9oZWFkZXIsIHNpemVvZihlZGlkX2hlYWRlcikpKSB7Ci0JCQkvKiBzZWFyY2ggZm9yIHRpbWluZ3Mgb2YgZGVmYXVsdCByZXNvbHV0aW9uICovCi0JCQlnZXRfZWRpZF90aW1pbmdfZGF0YShoZG1pLmVkaWQpOwotCQkJaGRtaS5lZGlkX3NldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlEU1NXQVJOKCJmYWlsZWQgdG8gcmVhZCBFLUVESURcbiIpOwotCX0KLQotCWlmICghaGRtaS5lZGlkX3NldCkgewotCQlEU1NJTkZPKCJmYWxsYmFjayB0byBWR0FcbiIpOwotCQloZG1pLmNvZGUgPSA0OyAvKiBzZXR0aW5nIGRlZmF1bHQgdmFsdWUgb2YgNjQwIDQ4MCBWR0EgKi8KLQkJaGRtaS5tb2RlID0gSERNSV9EVkk7Ci0JfQotCi0JY29kZSA9IGdldF90aW1pbmdzX2luZGV4KCk7Ci0KLQkqZHAgPSBjZWFfdmVzYV90aW1pbmdzW2NvZGVdLnRpbWluZ3M7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV9pbml0KHN0cnVjdCBoZG1pX2NvcmVfdmlkZW9fY29uZmlnICp2aWRlb19jZmcsCi0JCQlzdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdmkgKmF2aV9jZmcsCi0JCQlzdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0ICpyZXBlYXRfY2ZnKQotewotCURTU0RCRygiRW50ZXIgaGRtaV9jb3JlX2luaXRcbiIpOwotCi0JLyogdmlkZW8gY29yZSAqLwotCXZpZGVvX2NmZy0+aXBfYnVzX3dpZHRoID0gSERNSV9JTlBVVF84QklUOwotCXZpZGVvX2NmZy0+b3BfZGl0aGVyX3RydWMgPSBIRE1JX09VVFBVVFRSVU5DQVRJT05fOEJJVDsKLQl2aWRlb19jZmctPmRlZXBfY29sb3JfcGt0ID0gSERNSV9ERUVQQ09MT1JQQUNLRUNURElTQUJMRTsKLQl2aWRlb19jZmctPnBrdF9tb2RlID0gSERNSV9QQUNLRVRNT0RFUkVTRVJWRURWQUxVRTsKLQl2aWRlb19jZmctPmhkbWlfZHZpID0gSERNSV9EVkk7Ci0JdmlkZW9fY2ZnLT50Y2xrX3NlbF9jbGttdWx0ID0gSERNSV9GUExMMTBJRENLOwotCi0JLyogaW5mbyBmcmFtZSAqLwotCWF2aV9jZmctPmRiMV9mb3JtYXQgPSAwOwotCWF2aV9jZmctPmRiMV9hY3RpdmVfaW5mbyA9IDA7Ci0JYXZpX2NmZy0+ZGIxX2Jhcl9pbmZvX2R2ID0gMDsKLQlhdmlfY2ZnLT5kYjFfc2Nhbl9pbmZvID0gMDsKLQlhdmlfY2ZnLT5kYjJfY29sb3JpbWV0cnkgPSAwOwotCWF2aV9jZmctPmRiMl9hc3BlY3RfcmF0aW8gPSAwOwotCWF2aV9jZmctPmRiMl9hY3RpdmVfZm10X2FyID0gMDsKLQlhdmlfY2ZnLT5kYjNfaXRjID0gMDsKLQlhdmlfY2ZnLT5kYjNfZWMgPSAwOwotCWF2aV9jZmctPmRiM19xX3JhbmdlID0gMDsKLQlhdmlfY2ZnLT5kYjNfbnVwX3NjYWxpbmcgPSAwOwotCWF2aV9jZmctPmRiNF92aWRlb2NvZGUgPSAwOwotCWF2aV9jZmctPmRiNV9waXhlbF9yZXBlYXQgPSAwOwotCWF2aV9jZmctPmRiNl83X2xpbmVfZW9mdG9wID0gMCA7Ci0JYXZpX2NmZy0+ZGI4XzlfbGluZV9zb2Zib3R0b20gPSAwOwotCWF2aV9jZmctPmRiMTBfMTFfcGl4ZWxfZW9mbGVmdCA9IDA7Ci0JYXZpX2NmZy0+ZGIxMl8xM19waXhlbF9zb2ZyaWdodCA9IDA7Ci0KLQkvKiBwYWNrZXQgZW5hYmxlIGFuZCByZXBlYXQgKi8KLQlyZXBlYXRfY2ZnLT5hdWRpb19wa3QgPSAwOwotCXJlcGVhdF9jZmctPmF1ZGlvX3BrdF9yZXBlYXQgPSAwOwotCXJlcGVhdF9jZmctPmF2aV9pbmZvZnJhbWUgPSAwOwotCXJlcGVhdF9jZmctPmF2aV9pbmZvZnJhbWVfcmVwZWF0ID0gMDsKLQlyZXBlYXRfY2ZnLT5nZW5fY250cmxfcGt0ID0gMDsKLQlyZXBlYXRfY2ZnLT5nZW5fY250cmxfcGt0X3JlcGVhdCA9IDA7Ci0JcmVwZWF0X2NmZy0+Z2VuZXJpY19wa3QgPSAwOwotCXJlcGVhdF9jZmctPmdlbmVyaWNfcGt0X3JlcGVhdCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV9wb3dlcmRvd25fZGlzYWJsZSh2b2lkKQotewotCURTU0RCRygiRW50ZXIgaGRtaV9jb3JlX3Bvd2VyZG93bl9kaXNhYmxlXG4iKTsKLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQ1RSTDEsIDB4MCwgMCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV9zd3Jlc2V0X3JlbGVhc2Uodm9pZCkKLXsKLQlEU1NEQkcoIkVudGVyIGhkbWlfY29yZV9zd3Jlc2V0X3JlbGVhc2VcbiIpOwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9TWVNfU1JTVCwgMHgwLCAwLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9jb3JlX3N3cmVzZXRfYXNzZXJ0KHZvaWQpCi17Ci0JRFNTREJHKCJFbnRlciBoZG1pX2NvcmVfc3dyZXNldF9hc3NlcnRcbiIpOwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9TWVNfU1JTVCwgMHgxLCAwLCAwKTsKLX0KLQotLyogRFNTX0hETUlfQ09SRV9WSURFT19DT05GSUcgKi8KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV92aWRlb19jb25maWcoc3RydWN0IGhkbWlfY29yZV92aWRlb19jb25maWcgKmNmZykKLXsKLQl1MzIgciA9IDA7Ci0KLQkvKiBzeXNfY3RybDEgZGVmYXVsdCBjb25maWd1cmF0aW9uIG5vdCB0dW5hYmxlICovCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9DT1JFX0NUUkwxKTsKLQlyID0gRkxEX01PRChyLCBIRE1JX0NPUkVfQ1RSTDFfVkVOX0ZPTExPV1ZTWU5DLCA1LCA1KTsKLQlyID0gRkxEX01PRChyLCBIRE1JX0NPUkVfQ1RSTDFfSEVOX0ZPTExPV0hTWU5DLCA0LCA0KTsKLQlyID0gRkxEX01PRChyLCBIRE1JX0NPUkVfQ1RSTDFfQlNFTF8yNEJJVEJVUywgMiwgMik7Ci0JciA9IEZMRF9NT0QociwgSERNSV9DT1JFX0NUUkwxX0VER0VfUklTSU5HRURHRSwgMSwgMSk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0NUUkwxLCByKTsKLQotCVJFR19GTERfTU9EKEhETUlfQ09SRV9TWVNfVklEX0FDRU4sIGNmZy0+aXBfYnVzX3dpZHRoLCA3LCA2KTsKLQotCS8qIFZpZF9Nb2RlICovCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9DT1JFX1NZU19WSURfTU9ERSk7Ci0KLQkvKiBkaXRoZXIgdHJ1bmNhdGlvbiBjb25maWd1cmF0aW9uICovCi0JaWYgKGNmZy0+b3BfZGl0aGVyX3RydWMgPiBIRE1JX09VVFBVVFRSVU5DQVRJT05fMTJCSVQpIHsKLQkJciA9IEZMRF9NT0QociwgY2ZnLT5vcF9kaXRoZXJfdHJ1YyAtIDMsIDcsIDYpOwotCQlyID0gRkxEX01PRChyLCAxLCA1LCA1KTsKLQl9IGVsc2UgewotCQlyID0gRkxEX01PRChyLCBjZmctPm9wX2RpdGhlcl90cnVjLCA3LCA2KTsKLQkJciA9IEZMRF9NT0QociwgMCwgNSwgNSk7Ci0JfQotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9TWVNfVklEX01PREUsIHIpOwotCi0JLyogSERNSV9DdHJsICovCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCk7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5kZWVwX2NvbG9yX3BrdCwgNiwgNik7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5wa3RfbW9kZSwgNSwgMyk7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5oZG1pX2R2aSwgMCwgMCk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCwgcik7Ci0KLQkvKiBUTURTX0NUUkwgKi8KLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfU1lTX1RNRFNfQ1RSTCwKLQkJY2ZnLT50Y2xrX3NlbF9jbGttdWx0LCA2LCA1KTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9jb3JlX2F1eF9pbmZvZnJhbWVfYXZpX2NvbmZpZygKLQkJc3RydWN0IGhkbWlfY29yZV9pbmZvZnJhbWVfYXZpIGluZm9fYXZpKQotewotCXUzMiB2YWw7Ci0JY2hhciBzdW0gPSAwLCBjaGVja3N1bSA9IDA7Ci0KLQlzdW0gKz0gMHg4MiArIDB4MDAyICsgMHgwMEQ7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9UWVBFLCAweDA4Mik7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9WRVJTLCAweDAwMik7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9MRU4sIDB4MDBEKTsKLQotCXZhbCA9IChpbmZvX2F2aS5kYjFfZm9ybWF0IDw8IDUpIHwKLQkJKGluZm9fYXZpLmRiMV9hY3RpdmVfaW5mbyA8PCA0KSB8Ci0JCShpbmZvX2F2aS5kYjFfYmFyX2luZm9fZHYgPDwgMikgfAotCQkoaW5mb19hdmkuZGIxX3NjYW5faW5mbyk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSgwKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKGluZm9fYXZpLmRiMl9jb2xvcmltZXRyeSA8PCA2KSB8Ci0JCShpbmZvX2F2aS5kYjJfYXNwZWN0X3JhdGlvIDw8IDQpIHwKLQkJKGluZm9fYXZpLmRiMl9hY3RpdmVfZm10X2FyKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDEpLCB2YWwpOwotCXN1bSArPSB2YWw7Ci0KLQl2YWwgPSAoaW5mb19hdmkuZGIzX2l0YyA8PCA3KSB8Ci0JCShpbmZvX2F2aS5kYjNfZWMgPDwgNCkgfAotCQkoaW5mb19hdmkuZGIzX3FfcmFuZ2UgPDwgMikgfAotCQkoaW5mb19hdmkuZGIzX251cF9zY2FsaW5nKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDIpLCB2YWwpOwotCXN1bSArPSB2YWw7Ci0KLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDMpLCBpbmZvX2F2aS5kYjRfdmlkZW9jb2RlKTsKLQlzdW0gKz0gaW5mb19hdmkuZGI0X3ZpZGVvY29kZTsKLQotCXZhbCA9IGluZm9fYXZpLmRiNV9waXhlbF9yZXBlYXQ7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg0KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gaW5mb19hdmkuZGI2XzdfbGluZV9lb2Z0b3AgJiAweDAwRkY7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg1KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKChpbmZvX2F2aS5kYjZfN19saW5lX2VvZnRvcCA+PiA4KSAmIDB4MDBGRik7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg2KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gaW5mb19hdmkuZGI4XzlfbGluZV9zb2Zib3R0b20gJiAweDAwRkY7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg3KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKChpbmZvX2F2aS5kYjhfOV9saW5lX3NvZmJvdHRvbSA+PiA4KSAmIDB4MDBGRik7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg4KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gaW5mb19hdmkuZGIxMF8xMV9waXhlbF9lb2ZsZWZ0ICYgMHgwMEZGOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVklfREJZVEUoOSksIHZhbCk7Ci0Jc3VtICs9IHZhbDsKLQotCXZhbCA9ICgoaW5mb19hdmkuZGIxMF8xMV9waXhlbF9lb2ZsZWZ0ID4+IDgpICYgMHgwMEZGKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDEwKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gaW5mb19hdmkuZGIxMl8xM19waXhlbF9zb2ZyaWdodCAmIDB4MDBGRjsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDExKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKChpbmZvX2F2aS5kYjEyXzEzX3BpeGVsX3NvZnJpZ2h0ID4+IDgpICYgMHgwMEZGKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDEyKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JY2hlY2tzdW0gPSAweDEwMCAtIHN1bTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0NIU1VNLCBjaGVja3N1bSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV9hdl9wYWNrZXRfY29uZmlnKAotCQlzdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0IHJlcGVhdF9jZmcpCi17Ci0JLyogZW5hYmxlL3JlcGVhdCB0aGUgaW5mb2ZyYW1lICovCi0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX1BCX0NUUkwxLAotCQkocmVwZWF0X2NmZy5hdWRpb19wa3QgPDwgNSkgfAotCQkocmVwZWF0X2NmZy5hdWRpb19wa3RfcmVwZWF0IDw8IDQpIHwKLQkJKHJlcGVhdF9jZmcuYXZpX2luZm9mcmFtZSA8PCAxKSB8Ci0JCShyZXBlYXRfY2ZnLmF2aV9pbmZvZnJhbWVfcmVwZWF0KSk7Ci0KLQkvKiBlbmFibGUvcmVwZWF0IHRoZSBwYWNrZXQgKi8KLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfUEJfQ1RSTDIsCi0JCShyZXBlYXRfY2ZnLmdlbl9jbnRybF9wa3QgPDwgMykgfAotCQkocmVwZWF0X2NmZy5nZW5fY250cmxfcGt0X3JlcGVhdCA8PCAyKSB8Ci0JCShyZXBlYXRfY2ZnLmdlbmVyaWNfcGt0IDw8IDEpIHwKLQkJKHJlcGVhdF9jZmcuZ2VuZXJpY19wa3RfcmVwZWF0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfaW5pdChzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzLAotCQkJc3RydWN0IGhkbWlfdmlkZW9fZm9ybWF0ICp2aWRlb19mbXQsCi0JCQlzdHJ1Y3QgaGRtaV92aWRlb19pbnRlcmZhY2UgKnZpZGVvX2ludCkKLXsKLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfaW5pdFxuIik7Ci0KLQl0aW1pbmdzLT5oYnAgPSAwOwotCXRpbWluZ3MtPmhmcCA9IDA7Ci0JdGltaW5ncy0+aHN3ID0gMDsKLQl0aW1pbmdzLT52YnAgPSAwOwotCXRpbWluZ3MtPnZmcCA9IDA7Ci0JdGltaW5ncy0+dnN3ID0gMDsKLQotCXZpZGVvX2ZtdC0+cGFja2luZ19tb2RlID0gSERNSV9QQUNLXzEwYl9SR0JfWVVWNDQ0OwotCXZpZGVvX2ZtdC0+eV9yZXMgPSAwOwotCXZpZGVvX2ZtdC0+eF9yZXMgPSAwOwotCi0JdmlkZW9faW50LT52c3AgPSAwOwotCXZpZGVvX2ludC0+aHNwID0gMDsKLQotCXZpZGVvX2ludC0+aW50ZXJsYWNpbmcgPSAwOwotCXZpZGVvX2ludC0+dG0gPSAwOyAvKiBIRE1JX1RJTUlOR19TTEFWRSAqLwotCi19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9fc3RhcnQoYm9vbCBzdGFydCkKLXsKLQlSRUdfRkxEX01PRChIRE1JX1dQX1ZJREVPX0NGRywgc3RhcnQsIDMxLCAzMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXQoc3RydWN0IGhkbWlfdmlkZW9fZm9ybWF0ICp2aWRlb19mbXQsCi0Jc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncywgc3RydWN0IGhkbWlfY29uZmlnICpwYXJhbSkKLXsKLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXRcbiIpOwotCi0JdmlkZW9fZm10LT55X3JlcyA9IHBhcmFtLT50aW1pbmdzLnRpbWluZ3MueV9yZXM7Ci0JdmlkZW9fZm10LT54X3JlcyA9IHBhcmFtLT50aW1pbmdzLnRpbWluZ3MueF9yZXM7Ci0KLQl0aW1pbmdzLT5oYnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhicDsKLQl0aW1pbmdzLT5oZnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhmcDsKLQl0aW1pbmdzLT5oc3cgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhzdzsKLQl0aW1pbmdzLT52YnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZicDsKLQl0aW1pbmdzLT52ZnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZmcDsKLQl0aW1pbmdzLT52c3cgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZzdzsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV93cF92aWRlb19jb25maWdfZm9ybWF0KAotCQlzdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgKnZpZGVvX2ZtdCkKLXsKLQl1MzIgbCA9IDA7Ci0KLQlSRUdfRkxEX01PRChIRE1JX1dQX1ZJREVPX0NGRywgdmlkZW9fZm10LT5wYWNraW5nX21vZGUsIDEwLCA4KTsKLQotCWwgfD0gRkxEX1ZBTCh2aWRlb19mbXQtPnlfcmVzLCAzMSwgMTYpOwotCWwgfD0gRkxEX1ZBTCh2aWRlb19mbXQtPnhfcmVzLCAxNSwgMCk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9XUF9WSURFT19TSVpFLCBsKTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV93cF92aWRlb19jb25maWdfaW50ZXJmYWNlKAotCQlzdHJ1Y3QgaGRtaV92aWRlb19pbnRlcmZhY2UgKnZpZGVvX2ludCkKLXsKLQl1MzIgcjsKLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfdmlkZW9fY29uZmlnX2ludGVyZmFjZVxuIik7Ci0KLQlyID0gaGRtaV9yZWFkX3JlZyhIRE1JX1dQX1ZJREVPX0NGRyk7Ci0JciA9IEZMRF9NT0QociwgdmlkZW9faW50LT52c3AsIDcsIDcpOwotCXIgPSBGTERfTU9EKHIsIHZpZGVvX2ludC0+aHNwLCA2LCA2KTsKLQlyID0gRkxEX01PRChyLCB2aWRlb19pbnQtPmludGVybGFjaW5nLCAzLCAzKTsKLQlyID0gRkxEX01PRChyLCB2aWRlb19pbnQtPnRtLCAxLCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX1ZJREVPX0NGRywgcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9fY29uZmlnX3RpbWluZygKLQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKLXsKLQl1MzIgdGltaW5nX2ggPSAwOwotCXUzMiB0aW1pbmdfdiA9IDA7Ci0KLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfdmlkZW9fY29uZmlnX3RpbWluZ1xuIik7Ci0KLQl0aW1pbmdfaCB8PSBGTERfVkFMKHRpbWluZ3MtPmhicCwgMzEsIDIwKTsKLQl0aW1pbmdfaCB8PSBGTERfVkFMKHRpbWluZ3MtPmhmcCwgMTksIDgpOwotCXRpbWluZ19oIHw9IEZMRF9WQUwodGltaW5ncy0+aHN3LCA3LCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX1ZJREVPX1RJTUlOR19ILCB0aW1pbmdfaCk7Ci0KLQl0aW1pbmdfdiB8PSBGTERfVkFMKHRpbWluZ3MtPnZicCwgMzEsIDIwKTsKLQl0aW1pbmdfdiB8PSBGTERfVkFMKHRpbWluZ3MtPnZmcCwgMTksIDgpOwotCXRpbWluZ192IHw9IEZMRF9WQUwodGltaW5ncy0+dnN3LCA3LCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX1ZJREVPX1RJTUlOR19WLCB0aW1pbmdfdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfYmFzaWNfY29uZmlndXJlKHN0cnVjdCBoZG1pX2NvbmZpZyAqY2ZnKQotewotCS8qIEhETUkgKi8KLQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHZpZGVvX3RpbWluZzsKLQlzdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgdmlkZW9fZm9ybWF0OwotCXN0cnVjdCBoZG1pX3ZpZGVvX2ludGVyZmFjZSB2aWRlb19pbnRlcmZhY2U7Ci0JLyogSERNSSBjb3JlICovCi0Jc3RydWN0IGhkbWlfY29yZV9pbmZvZnJhbWVfYXZpIGF2aV9jZmc7Ci0Jc3RydWN0IGhkbWlfY29yZV92aWRlb19jb25maWcgdl9jb3JlX2NmZzsKLQlzdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0IHJlcGVhdF9jZmc7Ci0KLQloZG1pX3dwX2luaXQoJnZpZGVvX3RpbWluZywgJnZpZGVvX2Zvcm1hdCwKLQkJJnZpZGVvX2ludGVyZmFjZSk7Ci0KLQloZG1pX2NvcmVfaW5pdCgmdl9jb3JlX2NmZywKLQkJJmF2aV9jZmcsCi0JCSZyZXBlYXRfY2ZnKTsKLQotCWhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXQoJnZpZGVvX2Zvcm1hdCwKLQkJCSZ2aWRlb190aW1pbmcsIGNmZyk7Ci0KLQloZG1pX3dwX3ZpZGVvX2NvbmZpZ190aW1pbmcoJnZpZGVvX3RpbWluZyk7Ci0KLQkvKiB2aWRlbyBjb25maWcgKi8KLQl2aWRlb19mb3JtYXQucGFja2luZ19tb2RlID0gSERNSV9QQUNLXzI0Yl9SR0JfWVVWNDQ0X1lVVjQyMjsKLQotCWhkbWlfd3BfdmlkZW9fY29uZmlnX2Zvcm1hdCgmdmlkZW9fZm9ybWF0KTsKLQotCXZpZGVvX2ludGVyZmFjZS52c3AgPSBjZmctPnRpbWluZ3MudnN5bmNfcG9sOwotCXZpZGVvX2ludGVyZmFjZS5oc3AgPSBjZmctPnRpbWluZ3MuaHN5bmNfcG9sOwotCXZpZGVvX2ludGVyZmFjZS5pbnRlcmxhY2luZyA9IGNmZy0+aW50ZXJsYWNlOwotCXZpZGVvX2ludGVyZmFjZS50bSA9IDEgOyAvKiBIRE1JX1RJTUlOR19NQVNURVJfMjRCSVQgKi8KLQotCWhkbWlfd3BfdmlkZW9fY29uZmlnX2ludGVyZmFjZSgmdmlkZW9faW50ZXJmYWNlKTsKLQotCS8qCi0JICogY29uZmlndXJlIGNvcmUgdmlkZW8gcGFydAotCSAqIHNldCBzb2Z0d2FyZSByZXNldCBpbiB0aGUgY29yZQotCSAqLwotCWhkbWlfY29yZV9zd3Jlc2V0X2Fzc2VydCgpOwotCi0JLyogcG93ZXIgZG93biBvZmYgKi8KLQloZG1pX2NvcmVfcG93ZXJkb3duX2Rpc2FibGUoKTsKLQotCXZfY29yZV9jZmcucGt0X21vZGUgPSBIRE1JX1BBQ0tFVE1PREUyNEJJVFBFUlBJWEVMOwotCXZfY29yZV9jZmcuaGRtaV9kdmkgPSBjZmctPmNtLm1vZGU7Ci0KLQloZG1pX2NvcmVfdmlkZW9fY29uZmlnKCZ2X2NvcmVfY2ZnKTsKLQotCS8qIHJlbGVhc2Ugc29mdHdhcmUgcmVzZXQgaW4gdGhlIGNvcmUgKi8KLQloZG1pX2NvcmVfc3dyZXNldF9yZWxlYXNlKCk7Ci0KLQkvKgotCSAqIGNvbmZpZ3VyZSBwYWNrZXQKLQkgKiBpbmZvIGZyYW1lIHZpZGVvIHNlZSBkb2MgQ0VBODYxLUQgcGFnZSA2NQotCSAqLwotCWF2aV9jZmcuZGIxX2Zvcm1hdCA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjFZX1JHQjsKLQlhdmlfY2ZnLmRiMV9hY3RpdmVfaW5mbyA9Ci0JCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFBX0FDVElWRV9GT1JNQVRfT0ZGOwotCWF2aV9jZmcuZGIxX2Jhcl9pbmZvX2R2ID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMUJfTk87Ci0JYXZpX2NmZy5kYjFfc2Nhbl9pbmZvID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMVNfMDsKLQlhdmlfY2ZnLmRiMl9jb2xvcmltZXRyeSA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjJDX05POwotCWF2aV9jZmcuZGIyX2FzcGVjdF9yYXRpbyA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjJNX05POwotCWF2aV9jZmcuZGIyX2FjdGl2ZV9mbXRfYXIgPSBIRE1JX0lORk9GUkFNRV9BVklfREIyUl9TQU1FOwotCWF2aV9jZmcuZGIzX2l0YyA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjNJVENfTk87Ci0JYXZpX2NmZy5kYjNfZWMgPSBIRE1JX0lORk9GUkFNRV9BVklfREIzRUNfWFZZVVY2MDE7Ci0JYXZpX2NmZy5kYjNfcV9yYW5nZSA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjNRX0RFRkFVTFQ7Ci0JYXZpX2NmZy5kYjNfbnVwX3NjYWxpbmcgPSBIRE1JX0lORk9GUkFNRV9BVklfREIzU0NfTk87Ci0JYXZpX2NmZy5kYjRfdmlkZW9jb2RlID0gY2ZnLT5jbS5jb2RlOwotCWF2aV9jZmcuZGI1X3BpeGVsX3JlcGVhdCA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl9OTzsKLQlhdmlfY2ZnLmRiNl83X2xpbmVfZW9mdG9wID0gMDsKLQlhdmlfY2ZnLmRiOF85X2xpbmVfc29mYm90dG9tID0gMDsKLQlhdmlfY2ZnLmRiMTBfMTFfcGl4ZWxfZW9mbGVmdCA9IDA7Ci0JYXZpX2NmZy5kYjEyXzEzX3BpeGVsX3NvZnJpZ2h0ID0gMDsKLQotCWhkbWlfY29yZV9hdXhfaW5mb2ZyYW1lX2F2aV9jb25maWcoYXZpX2NmZyk7Ci0KLQkvKiBlbmFibGUvcmVwZWF0IHRoZSBpbmZvZnJhbWUgKi8KLQlyZXBlYXRfY2ZnLmF2aV9pbmZvZnJhbWUgPSBIRE1JX1BBQ0tFVEVOQUJMRTsKLQlyZXBlYXRfY2ZnLmF2aV9pbmZvZnJhbWVfcmVwZWF0ID0gSERNSV9QQUNLRVRSRVBFQVRPTjsKLQkvKiB3YWtldXAgKi8KLQlyZXBlYXRfY2ZnLmF1ZGlvX3BrdCA9IEhETUlfUEFDS0VURU5BQkxFOwotCXJlcGVhdF9jZmcuYXVkaW9fcGt0X3JlcGVhdCA9IEhETUlfUEFDS0VUUkVQRUFUT047Ci0JaGRtaV9jb3JlX2F2X3BhY2tldF9jb25maWcocmVwZWF0X2NmZyk7Ci19Ci0KIHN0YXRpYyB2b2lkIHVwZGF0ZV9oZG1pX3RpbWluZ3Moc3RydWN0IGhkbWlfY29uZmlnICpjZmcsCiAJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MsIGludCBjb2RlKQogewpAQCAtMTA2Niw2ICsyNjYsMTIgQEAKIAljZmctPnRpbWluZ3MuaHN5bmNfcG9sID0gY2VhX3Zlc2FfdGltaW5nc1tjb2RlXS5oc3luY19wb2w7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgaGRtaV9nZXRfcGl4ZWxfY2xvY2sodm9pZCkKK3sKKwkvKiBIRE1JIFBpeGVsIENsb2NrIGluIE1oeiAqLworCXJldHVybiBoZG1pLmlwX2RhdGEuY2ZnLnRpbWluZ3MudGltaW5ncy5waXhlbF9jbG9jayAqIDEwMDAwOworfQorCiBzdGF0aWMgdm9pZCBoZG1pX2NvbXB1dGVfcGxsKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IHBoeSwKIAkJc3RydWN0IGhkbWlfcGxsX2luZm8gKnBpKQogewpAQCAtMTA3NywxNSArMjgzLDIzIEBACiAJICogSW5wdXQgY2xvY2sgaXMgcHJlZGl2aWRlZCBieSBOICsgMQogCSAqIG91dCBwdXQgb2Ygd2hpY2ggaXMgcmVmZXJlbmNlIGNsawogCSAqLwotCXBpLT5yZWduID0gZHNzZGV2LT5jbG9ja3MuaGRtaS5yZWduOwotCXJlZmNsayA9IGNsa2luIC8gKHBpLT5yZWduICsgMSk7CisJaWYgKGRzc2Rldi0+Y2xvY2tzLmhkbWkucmVnbiA9PSAwKQorCQlwaS0+cmVnbiA9IEhETUlfREVGQVVMVF9SRUdOOworCWVsc2UKKwkJcGktPnJlZ24gPSBkc3NkZXYtPmNsb2Nrcy5oZG1pLnJlZ247CisKKwlyZWZjbGsgPSBjbGtpbiAvIHBpLT5yZWduOwogCiAJLyoKIAkgKiBtdWx0aXBsaWVyIGlzIHBpeGVsX2Nsay9yZWZfY2xrCiAJICogTXVsdGlwbHlpbmcgYnkgMTAwIHRvIGF2b2lkIGZyYWN0aW9uYWwgcGFydCByZW1vdmFsCiAJICovCiAJcGktPnJlZ20gPSAocGh5ICogMTAwIC8gKHJlZmNsaykpIC8gMTAwOwotCXBpLT5yZWdtMiA9IGRzc2Rldi0+Y2xvY2tzLmhkbWkucmVnbTI7CisKKwlpZiAoZHNzZGV2LT5jbG9ja3MuaGRtaS5yZWdtMiA9PSAwKQorCQlwaS0+cmVnbTIgPSBIRE1JX0RFRkFVTFRfUkVHTTI7CisJZWxzZQorCQlwaS0+cmVnbTIgPSBkc3NkZXYtPmNsb2Nrcy5oZG1pLnJlZ20yOwogCiAJLyoKIAkgKiBmcmFjdGlvbmFsIG11bHRpcGxpZXIgaXMgcmVtYWluZGVyIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KQEAgLTExMDAsNyArMzE0LDEwIEBACiAJICogaXMgZ3JlYXRlciB0aGFuIDEwMDBNSHoKIAkgKi8KIAlwaS0+ZGNvZnJlcSA9IHBoeSA+IDEwMDAgKiAxMDA7Ci0JcGktPnJlZ3NkID0gKChwaS0+cmVnbSAqIGNsa2luIC8gMTApIC8gKChwaS0+cmVnbiArIDEpICogMjUwKSArIDUpIC8gMTA7CisJcGktPnJlZ3NkID0gKChwaS0+cmVnbSAqIGNsa2luIC8gMTApIC8gKHBpLT5yZWduICogMjUwKSArIDUpIC8gMTA7CisKKwkvKiBTZXQgdGhlIHJlZmVyZW5jZSBjbG9jayB0byBzeXNjbGsgcmVmZXJlbmNlICovCisJcGktPnJlZnNlbCA9IEhETUlfUkVGU0VMX1NZU0NMSzsKIAogCURTU0RCRygiTSA9ICVkIE1mID0gJWRcbiIsIHBpLT5yZWdtLCBwaS0+cmVnbWYpOwogCURTU0RCRygicmFuZ2UgPSAlZCBzZCA9ICVkXG4iLCBwaS0+ZGNvZnJlcSwgcGktPnJlZ3NkKTsKQEAgLTExMDksNyArMzI2LDYgQEAKIHN0YXRpYyBpbnQgaGRtaV9wb3dlcl9vbihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJaW50IHIsIGNvZGUgPSAwOwotCXN0cnVjdCBoZG1pX3BsbF9pbmZvIHBsbF9kYXRhOwogCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnA7CiAJdW5zaWduZWQgbG9uZyBwaHk7CiAKQEAgLTExMTcsNyArMzMzLDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlkaXNwY19lbmFibGVfY2hhbm5lbChPTUFQX0RTU19DSEFOTkVMX0RJR0lULCAwKTsKKwlkaXNwY19tZ3JfZW5hYmxlKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQsIDApOwogCiAJcCA9ICZkc3NkZXYtPnBhbmVsLnRpbWluZ3M7CiAKQEAgLTExMjUsMzYgKzM0MSwzMSBAQAogCQlkc3NkZXYtPnBhbmVsLnRpbWluZ3MueF9yZXMsCiAJCWRzc2Rldi0+cGFuZWwudGltaW5ncy55X3Jlcyk7CiAKLQlpZiAoIWhkbWkuY3VzdG9tX3NldCkgewotCQlEU1NEQkcoIlJlYWQgRURJRCBhcyBubyBFRElEIGlzIG5vdCBzZXQgb24gcG93ZXJvblxuIik7Ci0JCWhkbWlfcmVhZF9lZGlkKHApOwotCX0KIAljb2RlID0gZ2V0X3RpbWluZ3NfaW5kZXgoKTsKLQlkc3NkZXYtPnBhbmVsLnRpbWluZ3MgPSBjZWFfdmVzYV90aW1pbmdzW2NvZGVdLnRpbWluZ3M7Ci0JdXBkYXRlX2hkbWlfdGltaW5ncygmaGRtaS5jZmcsIHAsIGNvZGUpOworCXVwZGF0ZV9oZG1pX3RpbWluZ3MoJmhkbWkuaXBfZGF0YS5jZmcsIHAsIGNvZGUpOwogCiAJcGh5ID0gcC0+cGl4ZWxfY2xvY2s7CiAKLQloZG1pX2NvbXB1dGVfcGxsKGRzc2RldiwgcGh5LCAmcGxsX2RhdGEpOworCWhkbWlfY29tcHV0ZV9wbGwoZHNzZGV2LCBwaHksICZoZG1pLmlwX2RhdGEucGxsX2RhdGEpOwogCi0JaGRtaV93cF92aWRlb19zdGFydCgwKTsKKwloZG1pLmlwX2RhdGEub3BzLT52aWRlb19lbmFibGUoJmhkbWkuaXBfZGF0YSwgMCk7CiAKLQkvKiBjb25maWcgdGhlIFBMTCBhbmQgUEhZIGZpcnN0ICovCi0JciA9IGhkbWlfcGxsX3Byb2dyYW0oJnBsbF9kYXRhKTsKKwkvKiBjb25maWcgdGhlIFBMTCBhbmQgUEhZIGhkbWlfc2V0X3BsbF9wd3JmaXJzdCAqLworCXIgPSBoZG1pLmlwX2RhdGEub3BzLT5wbGxfZW5hYmxlKCZoZG1pLmlwX2RhdGEpOwogCWlmIChyKSB7CiAJCURTU0RCRygiRmFpbGVkIHRvIGxvY2sgUExMXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCi0JciA9IGhkbWlfcGh5X2luaXQoKTsKKwlyID0gaGRtaS5pcF9kYXRhLm9wcy0+cGh5X2VuYWJsZSgmaGRtaS5pcF9kYXRhKTsKIAlpZiAocikgewogCQlEU1NEQkcoIkZhaWxlZCB0byBzdGFydCBQSFlcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKLQloZG1pLmNmZy5jbS5tb2RlID0gaGRtaS5tb2RlOwotCWhkbWkuY2ZnLmNtLmNvZGUgPSBoZG1pLmNvZGU7Ci0JaGRtaV9iYXNpY19jb25maWd1cmUoJmhkbWkuY2ZnKTsKKwloZG1pLmlwX2RhdGEuY2ZnLmNtLm1vZGUgPSBoZG1pLm1vZGU7CisJaGRtaS5pcF9kYXRhLmNmZy5jbS5jb2RlID0gaGRtaS5jb2RlOworCWhkbWkuaXBfZGF0YS5vcHMtPnZpZGVvX2NvbmZpZ3VyZSgmaGRtaS5pcF9kYXRhKTsKIAogCS8qIE1ha2Ugc2VsZWN0aW9uIG9mIEhETUkgaW4gRFNTICovCiAJZHNzX3NlbGVjdF9oZG1pX3ZlbmNfY2xrX3NvdXJjZShEU1NfSERNSV9NX1BDTEspOwpAQCAtMTE3NCw5ICszODUsOSBAQAogCWRpc3BjX3NldF9kaWdpdF9zaXplKGRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcywKIAkJCWRzc2Rldi0+cGFuZWwudGltaW5ncy55X3Jlcyk7CiAKLQlkaXNwY19lbmFibGVfY2hhbm5lbChPTUFQX0RTU19DSEFOTkVMX0RJR0lULCAxKTsKKwloZG1pLmlwX2RhdGEub3BzLT52aWRlb19lbmFibGUoJmhkbWkuaXBfZGF0YSwgMSk7CiAKLQloZG1pX3dwX3ZpZGVvX3N0YXJ0KDEpOworCWRpc3BjX21ncl9lbmFibGUoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCwgMSk7CiAKIAlyZXR1cm4gMDsKIGVycjoKQEAgLTExODYsMTQgKzM5NywxMiBAQAogCiBzdGF0aWMgdm9pZCBoZG1pX3Bvd2VyX29mZihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7Ci0JZGlzcGNfZW5hYmxlX2NoYW5uZWwoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCwgMCk7CisJZGlzcGNfbWdyX2VuYWJsZShPTUFQX0RTU19DSEFOTkVMX0RJR0lULCAwKTsKIAotCWhkbWlfd3BfdmlkZW9fc3RhcnQoMCk7Ci0JaGRtaV9waHlfb2ZmKCk7Ci0JaGRtaV9zZXRfcGxsX3B3cihIRE1JX1BMTFBXUkNNRF9BTExPRkYpOworCWhkbWkuaXBfZGF0YS5vcHMtPnZpZGVvX2VuYWJsZSgmaGRtaS5pcF9kYXRhLCAwKTsKKwloZG1pLmlwX2RhdGEub3BzLT5waHlfZGlzYWJsZSgmaGRtaS5pcF9kYXRhKTsKKwloZG1pLmlwX2RhdGEub3BzLT5wbGxfZGlzYWJsZSgmaGRtaS5pcF9kYXRhKTsKIAloZG1pX3J1bnRpbWVfcHV0KCk7Ci0KLQloZG1pLmVkaWRfc2V0ID0gMDsKIH0KIAogaW50IG9tYXBkc3NfaGRtaV9kaXNwbGF5X2NoZWNrX3RpbWluZyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCkBAIC0xMjAzLDcgKzQxMiw2IEBACiAKIAljbSA9IGhkbWlfZ2V0X2NvZGUodGltaW5ncyk7CiAJaWYgKGNtLmNvZGUgPT0gLTEpIHsKLQkJRFNTRVJSKCJJbnZhbGlkIHRpbWluZyBlbnRlcmVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMjE1LDEyICs0MjMsNjkgQEAKIHsKIAlzdHJ1Y3QgaGRtaV9jbSBjbTsKIAotCWhkbWkuY3VzdG9tX3NldCA9IDE7CiAJY20gPSBoZG1pX2dldF9jb2RlKCZkc3NkZXYtPnBhbmVsLnRpbWluZ3MpOwogCWhkbWkuY29kZSA9IGNtLmNvZGU7CiAJaGRtaS5tb2RlID0gY20ubW9kZTsKLQlvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKLQloZG1pLmN1c3RvbV9zZXQgPSAwOworCisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKKwkJaW50IHI7CisKKwkJaGRtaV9wb3dlcl9vZmYoZHNzZGV2KTsKKworCQlyID0gaGRtaV9wb3dlcl9vbihkc3NkZXYpOworCQlpZiAocikKKwkJCURTU0VSUigiZmFpbGVkIHRvIHBvd2VyIG9uIGRldmljZVxuIik7CisJfQorfQorCit2b2lkIGhkbWlfZHVtcF9yZWdzKHN0cnVjdCBzZXFfZmlsZSAqcykKK3sKKwltdXRleF9sb2NrKCZoZG1pLmxvY2spOworCisJaWYgKGhkbWlfcnVudGltZV9nZXQoKSkKKwkJcmV0dXJuOworCisJaGRtaS5pcF9kYXRhLm9wcy0+ZHVtcF93cmFwcGVyKCZoZG1pLmlwX2RhdGEsIHMpOworCWhkbWkuaXBfZGF0YS5vcHMtPmR1bXBfcGxsKCZoZG1pLmlwX2RhdGEsIHMpOworCWhkbWkuaXBfZGF0YS5vcHMtPmR1bXBfcGh5KCZoZG1pLmlwX2RhdGEsIHMpOworCWhkbWkuaXBfZGF0YS5vcHMtPmR1bXBfY29yZSgmaGRtaS5pcF9kYXRhLCBzKTsKKworCWhkbWlfcnVudGltZV9wdXQoKTsKKwltdXRleF91bmxvY2soJmhkbWkubG9jayk7Cit9CisKK2ludCBvbWFwZHNzX2hkbWlfcmVhZF9lZGlkKHU4ICpidWYsIGludCBsZW4pCit7CisJaW50IHI7CisKKwltdXRleF9sb2NrKCZoZG1pLmxvY2spOworCisJciA9IGhkbWlfcnVudGltZV9nZXQoKTsKKwlCVUdfT04ocik7CisKKwlyID0gaGRtaS5pcF9kYXRhLm9wcy0+cmVhZF9lZGlkKCZoZG1pLmlwX2RhdGEsIGJ1ZiwgbGVuKTsKKworCWhkbWlfcnVudGltZV9wdXQoKTsKKwltdXRleF91bmxvY2soJmhkbWkubG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworYm9vbCBvbWFwZHNzX2hkbWlfZGV0ZWN0KHZvaWQpCit7CisJaW50IHI7CisKKwltdXRleF9sb2NrKCZoZG1pLmxvY2spOworCisJciA9IGhkbWlfcnVudGltZV9nZXQoKTsKKwlCVUdfT04ocik7CisKKwlyID0gaGRtaS5pcF9kYXRhLm9wcy0+ZGV0ZWN0KCZoZG1pLmlwX2RhdGEpOworCisJaGRtaV9ydW50aW1lX3B1dCgpOworCW11dGV4X3VubG9jaygmaGRtaS5sb2NrKTsKKworCXJldHVybiByID09IDE7CiB9CiAKIGludCBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQpAQCAtMTIzMSw2ICs0OTYsMTIgQEAKIAogCW11dGV4X2xvY2soJmhkbWkubG9jayk7CiAKKwlpZiAoZHNzZGV2LT5tYW5hZ2VyID09IE5VTEwpIHsKKwkJRFNTRVJSKCJmYWlsZWQgdG8gZW5hYmxlIGRpc3BsYXk6IG5vIG1hbmFnZXJcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnIwOworCX0KKwogCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKIAlpZiAocikgewogCQlEU1NFUlIoImZhaWxlZCB0byBzdGFydCBkZXZpY2VcbiIpOwpAQCAtMTI4MiwyMTkgKzU1Myw5IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSSkgfHwgXAogCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JX01PRFVMRSkKLXN0YXRpYyB2b2lkIGhkbWlfd3BfYXVkaW9fY29uZmlnX2Zvcm1hdCgKLQkJc3RydWN0IGhkbWlfYXVkaW9fZm9ybWF0ICphdWRfZm10KQotewotCXUzMiByOwogCi0JRFNTREJHKCJFbnRlciBoZG1pX3dwX2F1ZGlvX2NvbmZpZ19mb3JtYXRcbiIpOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9XUF9BVURJT19DRkcpOwotCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnN0ZXJlb19jaGFubmVscywgMjYsIDI0KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT5hY3RpdmVfY2hubmxzX21zaywgMjMsIDE2KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT5lbl9zaWdfYmxrX3N0cnRfZW5kLCA1LCA1KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT50eXBlLCA0LCA0KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT5qdXN0aWZpY2F0aW9uLCAzLCAzKTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT5zYW1wbGVfb3JkZXIsIDIsIDIpOwotCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnNhbXBsZXNfcGVyX3dvcmQsIDEsIDEpOwotCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnNhbXBsZV9zaXplLCAwLCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX0FVRElPX0NGRywgcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfYXVkaW9fY29uZmlnX2RtYShzdHJ1Y3QgaGRtaV9hdWRpb19kbWEgKmF1ZF9kbWEpCi17Ci0JdTMyIHI7Ci0KLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfYXVkaW9fY29uZmlnX2RtYVxuIik7Ci0KLQlyID0gaGRtaV9yZWFkX3JlZyhIRE1JX1dQX0FVRElPX0NGRzIpOwotCXIgPSBGTERfTU9EKHIsIGF1ZF9kbWEtPnRyYW5zZmVyX3NpemUsIDE1LCA4KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZG1hLT5ibG9ja19zaXplLCA3LCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX0FVRElPX0NGRzIsIHIpOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9XUF9BVURJT19DVFJMKTsKLQlyID0gRkxEX01PRChyLCBhdWRfZG1hLT5tb2RlLCA5LCA5KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZG1hLT5maWZvX3RocmVzaG9sZCwgOCwgMCk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9XUF9BVURJT19DVFJMLCByKTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9jb3JlX2F1ZGlvX2NvbmZpZyhzdHJ1Y3QgaGRtaV9jb3JlX2F1ZGlvX2NvbmZpZyAqY2ZnKQotewotCXUzMiByOwotCi0JLyogYXVkaW8gY2xvY2sgcmVjb3ZlcnkgcGFyYW1ldGVycyAqLwotCXIgPSBoZG1pX3JlYWRfcmVnKEhETUlfQ09SRV9BVl9BQ1JfQ1RSTCk7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT51c2VfbWNsaywgMiwgMik7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5lbl9hY3JfcGt0LCAxLCAxKTsKLQlyID0gRkxEX01PRChyLCBjZmctPmN0c19tb2RlLCAwLCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQUNSX0NUUkwsIHIpOwotCi0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX05fU1ZBTDEsIGNmZy0+biwgNywgMCk7Ci0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX05fU1ZBTDIsIGNmZy0+biA+PiA4LCA3LCAwKTsKLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfTl9TVkFMMywgY2ZnLT5uID4+IDE2LCA3LCAwKTsKLQotCWlmIChjZmctPmN0c19tb2RlID09IEhETUlfQVVESU9fQ1RTX01PREVfU1cpIHsKLQkJUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0NUU19TVkFMMSwgY2ZnLT5jdHMsIDcsIDApOwotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfQ1RTX1NWQUwyLCBjZmctPmN0cyA+PiA4LCA3LCAwKTsKLQkJUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0NUU19TVkFMMywgY2ZnLT5jdHMgPj4gMTYsIDcsIDApOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIEhETUkgSVAgdXNlcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gZGl2aWRlIHRoZSBNQ0xLIHRvCi0JCSAqIHVwZGF0ZSBDVFMgdmFsdWUuCi0JCSAqLwotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfRlJFUV9TVkFMLCBjZmctPm1jbGtfbW9kZSwgMiwgMCk7Ci0KLQkJLyogQ29uZmlndXJlIGNsb2NrIGZvciBhdWRpbyBwYWNrZXRzICovCi0JCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18xLAotCQkJY2ZnLT5hdWRfcGFyX2J1c2NsaywgNywgMCk7Ci0JCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18yLAotCQkJKGNmZy0+YXVkX3Bhcl9idXNjbGsgPj4gOCksIDcsIDApOwotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMywKLQkJCShjZmctPmF1ZF9wYXJfYnVzY2xrID4+IDE2KSwgNywgMCk7Ci0JfQotCi0JLyogT3ZlcnJpZGUgb2YgU1BESUYgc2FtcGxlIGZyZXF1ZW5jeSB3aXRoIHZhbHVlIGluIEkyU19DSFNUNCAqLwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9TUERJRl9DVFJMLCBjZmctPmZzX292ZXJyaWRlLCAxLCAxKTsKLQotCS8qIEkyUyBwYXJhbWV0ZXJzICovCi0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0kyU19DSFNUNCwgY2ZnLT5mcmVxX3NhbXBsZSwgMywgMCk7Ci0KLQlyID0gaGRtaV9yZWFkX3JlZyhIRE1JX0NPUkVfQVZfSTJTX0lOX0NUUkwpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5lbl9oaWdoX2JpdHJhdGVfYXVkLCA3LCA3KTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcuc2NrX2VkZ2VfbW9kZSwgNiwgNik7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmNiaXRfb3JkZXIsIDUsIDUpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy52Yml0LCA0LCA0KTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcud3NfcG9sYXJpdHksIDMsIDMpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5qdXN0aWZpY2F0aW9uLCAyLCAyKTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcuZGlyZWN0aW9uLCAxLCAxKTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcuc2hpZnQsIDAsIDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9JMlNfSU5fQ1RSTCwgcik7Ci0KLQlyID0gaGRtaV9yZWFkX3JlZyhIRE1JX0NPUkVfQVZfSTJTX0NIU1Q1KTsKLQlyID0gRkxEX01PRChyLCBjZmctPmZyZXFfc2FtcGxlLCA3LCA0KTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcud29yZF9sZW5ndGgsIDMsIDEpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy53b3JkX21heF9sZW5ndGgsIDAsIDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDUsIHIpOwotCi0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0kyU19JTl9MRU4sIGNmZy0+aTJzX2NmZy5pbl9sZW5ndGhfYml0cywgMywgMCk7Ci0KLQkvKiBBdWRpbyBjaGFubmVscyBhbmQgbW9kZSBwYXJhbWV0ZXJzICovCi0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCwgY2ZnLT5sYXlvdXQsIDIsIDEpOwotCXIgPSBoZG1pX3JlYWRfcmVnKEhETUlfQ09SRV9BVl9BVURfTU9ERSk7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmFjdGl2ZV9zZHMsIDcsIDQpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+ZW5fZHNkX2F1ZGlvLCAzLCAzKTsKLQlyID0gRkxEX01PRChyLCBjZmctPmVuX3BhcmFsbGVsX2F1ZF9pbnB1dCwgMiwgMik7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5lbl9zcGRpZiwgMSwgMSk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FVRF9NT0RFLCByKTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9jb3JlX2F1ZGlvX2luZm9mcmFtZV9jb25maWcoCi0JCXN0cnVjdCBoZG1pX2NvcmVfaW5mb2ZyYW1lX2F1ZGlvICppbmZvX2F1ZCkKLXsKLQl1OCB2YWw7Ci0JdTggc3VtID0gMCwgY2hlY2tzdW0gPSAwOwotCi0JLyoKLQkgKiBTZXQgYXVkaW8gaW5mbyBmcmFtZSB0eXBlLCB2ZXJzaW9uIGFuZCBsZW5ndGggYXMKLQkgKiBkZXNjcmliZWQgaW4gSERNSSAxLjRhIFNlY3Rpb24gOC4yLjIgc3BlY2lmaWNhdGlvbi4KLQkgKiBDaGVja3N1bSBjYWxjdWxhdGlvbiBpcyBkZWZpbmVkIGluIFNlY3Rpb24gNS4zLjUuCi0JICovCi0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FVRElPX1RZUEUsIDB4ODQpOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURJT19WRVJTLCAweDAxKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVVESU9fTEVOLCAweDBhKTsKLQlzdW0gKz0gMHg4NCArIDB4MDAxICsgMHgwMGE7Ci0KLQl2YWwgPSAoaW5mb19hdWQtPmRiMV9jb2RpbmdfdHlwZSA8PCA0KQotCQkJfCAoaW5mb19hdWQtPmRiMV9jaGFubmVsX2NvdW50IC0gMSk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FVRF9EQllURSgwKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKGluZm9fYXVkLT5kYjJfc2FtcGxlX2ZyZXEgPDwgMikgfCBpbmZvX2F1ZC0+ZGIyX3NhbXBsZV9zaXplOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoMSksIHZhbCk7Ci0Jc3VtICs9IHZhbDsKLQotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoMiksIDB4MDApOwotCi0JdmFsID0gaW5mb19hdWQtPmRiNF9jaGFubmVsX2FsbG9jOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoMyksIHZhbCk7Ci0Jc3VtICs9IHZhbDsKLQotCXZhbCA9IChpbmZvX2F1ZC0+ZGI1X2Rvd25taXhfaW5oIDw8IDcpIHwgKGluZm9fYXVkLT5kYjVfbHN2IDw8IDMpOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoNCksIHZhbCk7Ci0Jc3VtICs9IHZhbDsKLQotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoNSksIDB4MDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoNiksIDB4MDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoNyksIDB4MDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoOCksIDB4MDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoOSksIDB4MDApOwotCi0JY2hlY2tzdW0gPSAweDEwMCAtIHN1bTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVVESU9fQ0hTVU0sIGNoZWNrc3VtKTsKLQotCS8qCi0JICogVE9ETzogQWRkIE1QRUcgYW5kIFNQRCBlbmFibGUgYW5kIHJlcGVhdCBjZmcgd2hlbiBFRElEIHBhcnNpbmcKLQkgKiBpcyBhdmFpbGFibGUuCi0JICovCi19Ci0KLXN0YXRpYyBpbnQgaGRtaV9jb25maWdfYXVkaW9fYWNyKHUzMiBzYW1wbGVfZnJlcSwgdTMyICpuLCB1MzIgKmN0cykKLXsKLQl1MzIgcjsKLQl1MzIgZGVlcF9jb2xvciA9IDA7Ci0JdTMyIHBjbGsgPSBoZG1pLmNmZy50aW1pbmdzLnRpbWluZ3MucGl4ZWxfY2xvY2s7Ci0KLQlpZiAobiA9PSBOVUxMIHx8IGN0cyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkvKgotCSAqIE9idGFpbiBjdXJyZW50IGRlZXAgY29sb3IgY29uZmlndXJhdGlvbi4gVGhpcyBuZWVkZWQKLQkgKiB0byBjYWxjdWxhdGUgdGhlIFRNRFMgY2xvY2sgYmFzZWQgb24gdGhlIHBpeGVsIGNsb2NrLgotCSAqLwotCXIgPSBSRUdfR0VUKEhETUlfV1BfVklERU9fQ0ZHLCAxLCAwKTsKLQlzd2l0Y2ggKHIpIHsKLQljYXNlIDE6IC8qIE5vIGRlZXAgY29sb3Igc2VsZWN0ZWQgKi8KLQkJZGVlcF9jb2xvciA9IDEwMDsKLQkJYnJlYWs7Ci0JY2FzZSAyOiAvKiAxMC1iaXQgZGVlcCBjb2xvciBzZWxlY3RlZCAqLwotCQlkZWVwX2NvbG9yID0gMTI1OwotCQlicmVhazsKLQljYXNlIDM6IC8qIDEyLWJpdCBkZWVwIGNvbG9yIHNlbGVjdGVkICovCi0JCWRlZXBfY29sb3IgPSAxNTA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAoc2FtcGxlX2ZyZXEpIHsKLQljYXNlIDMyMDAwOgotCQlpZiAoKGRlZXBfY29sb3IgPT0gMTI1KSAmJiAoKHBjbGsgPT0gNTQwNTQpCi0JCQkJfHwgKHBjbGsgPT0gNzQyNTApKSkKLQkJCSpuID0gODE5MjsKLQkJZWxzZQotCQkJKm4gPSA0MDk2OwotCQlicmVhazsKLQljYXNlIDQ0MTAwOgotCQkqbiA9IDYyNzI7Ci0JCWJyZWFrOwotCWNhc2UgNDgwMDA6Ci0JCWlmICgoZGVlcF9jb2xvciA9PSAxMjUpICYmICgocGNsayA9PSA1NDA1NCkKLQkJCQl8fCAocGNsayA9PSA3NDI1MCkpKQotCQkJKm4gPSA4MTkyOwotCQllbHNlCi0JCQkqbiA9IDYxNDQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCSpuID0gMDsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIENUUy4gU2VlIEhETUkgMS4zYSBvciAxLjRhIHNwZWNpZmljYXRpb25zICovCi0JKmN0cyA9IHBjbGsgKiAoKm4gLyAxMjgpICogZGVlcF9jb2xvciAvIChzYW1wbGVfZnJlcSAvIDEwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhkbWlfYXVkaW9faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorc3RhdGljIGludCBoZG1pX2F1ZGlvX2h3X3BhcmFtcyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewpAQCAtMTU0OCw3ICs2MDksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQllcnIgPSBoZG1pX2NvbmZpZ19hdWRpb19hY3IocGFyYW1zX3JhdGUocGFyYW1zKSwgJm4sICZjdHMpOworCWVyciA9IGhkbWlfY29uZmlnX2F1ZGlvX2FjcihpcF9kYXRhLCBwYXJhbXNfcmF0ZShwYXJhbXMpLCAmbiwgJmN0cyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTE1NjQsOCArNjI1LDggQEAKIAlhdWRpb19kbWEubW9kZSA9IEhETUlfQVVESU9fVFJBTlNGX0RNQTsKIAlhdWRpb19kbWEuZmlmb190aHJlc2hvbGQgPSAweDIwOyAvKiBpbiBudW1iZXIgb2Ygc2FtcGxlcyAqLwogCi0JaGRtaV93cF9hdWRpb19jb25maWdfZG1hKCZhdWRpb19kbWEpOwotCWhkbWlfd3BfYXVkaW9fY29uZmlnX2Zvcm1hdCgmYXVkaW9fZm9ybWF0KTsKKwloZG1pX3dwX2F1ZGlvX2NvbmZpZ19kbWEoaXBfZGF0YSwgJmF1ZGlvX2RtYSk7CisJaGRtaV93cF9hdWRpb19jb25maWdfZm9ybWF0KGlwX2RhdGEsICZhdWRpb19mb3JtYXQpOwogCiAJLyoKIAkgKiBJMlMgY29uZmlnCkBAIC0xNjA5LDcgKzY3MCw3IEBACiAJLyogVXNlIHBhcmFsbGVsIGF1ZGlvIGludGVyZmFjZSAqLwogCWNvcmVfY2ZnLmVuX3BhcmFsbGVsX2F1ZF9pbnB1dCA9IHRydWU7CiAKLQloZG1pX2NvcmVfYXVkaW9fY29uZmlnKCZjb3JlX2NmZyk7CisJaGRtaV9jb3JlX2F1ZGlvX2NvbmZpZyhpcF9kYXRhLCAmY29yZV9jZmcpOwogCiAJLyoKIAkgKiBDb25maWd1cmUgcGFja2V0CkBAIC0xNjIzLDM2ICs2ODQsMTAgQEAKIAlhdWRfaWZfY2ZnLmRiNV9kb3dubWl4X2luaCA9IGZhbHNlOwogCWF1ZF9pZl9jZmcuZGI1X2xzdiA9IDA7CiAKLQloZG1pX2NvcmVfYXVkaW9faW5mb2ZyYW1lX2NvbmZpZygmYXVkX2lmX2NmZyk7CisJaGRtaV9jb3JlX2F1ZGlvX2luZm9mcmFtZV9jb25maWcoaXBfZGF0YSwgJmF1ZF9pZl9jZmcpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhkbWlfYXVkaW9fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCwKLQkJCQkgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWludCBlcnIgPSAwOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9BVURfTU9ERSwgMSwgMCwgMCk7Ci0JCVJFR19GTERfTU9EKEhETUlfV1BfQVVESU9fQ1RSTCwgMSwgMzEsIDMxKTsKLQkJUkVHX0ZMRF9NT0QoSERNSV9XUF9BVURJT19DVFJMLCAxLCAzMCwgMzApOwotCQlicmVhazsKLQotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfQVVEX01PREUsIDAsIDAsIDApOwotCQlSRUdfRkxEX01PRChIRE1JX1dQX0FVRElPX0NUUkwsIDAsIDMwLCAzMCk7Ci0JCVJFR19GTERfTU9EKEhETUlfV1BfQVVESU9fQ1RSTCwgMCwgMzEsIDMxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQogc3RhdGljIGludCBoZG1pX2F1ZGlvX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKQEAgLTE2OTgsMTUgKzczMyw2IEBACiAKIAloZG1pLnN5c19jbGsgPSBjbGs7CiAKLQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJkc3NfNDhtaHpfY2xrIik7Ci0JaWYgKElTX0VSUihjbGspKSB7Ci0JCURTU0VSUigiY2FuJ3QgZ2V0IGhkbWlfY2xrXG4iKTsKLQkJY2xrX3B1dChoZG1pLnN5c19jbGspOwotCQlyZXR1cm4gUFRSX0VSUihjbGspOwotCX0KLQotCWhkbWkuaGRtaV9jbGsgPSBjbGs7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTcxNCw4ICs3NDAsNiBAQAogewogCWlmIChoZG1pLnN5c19jbGspCiAJCWNsa19wdXQoaGRtaS5zeXNfY2xrKTsKLQlpZiAoaGRtaS5oZG1pX2NsaykKLQkJY2xrX3B1dChoZG1pLmhkbWlfY2xrKTsKIH0KIAogLyogSERNSSBIVyBJUCBpbml0aWFsaXNhdGlvbiAqLwpAQCAtMTczNiwyMCArNzYwLDI2IEBACiAJfQogCiAJLyogQmFzZSBhZGRyZXNzIHRha2VuIGZyb20gcGxhdGZvcm0gKi8KLQloZG1pLmJhc2Vfd3AgPSBpb3JlbWFwKGhkbWlfbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShoZG1pX21lbSkpOwotCWlmICghaGRtaS5iYXNlX3dwKSB7CisJaGRtaS5pcF9kYXRhLmJhc2Vfd3AgPSBpb3JlbWFwKGhkbWlfbWVtLT5zdGFydCwKKwkJCQkJCXJlc291cmNlX3NpemUoaGRtaV9tZW0pKTsKKwlpZiAoIWhkbWkuaXBfZGF0YS5iYXNlX3dwKSB7CiAJCURTU0VSUigiY2FuJ3QgaW9yZW1hcCBXUFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXIgPSBoZG1pX2dldF9jbG9ja3MocGRldik7CiAJaWYgKHIpIHsKLQkJaW91bm1hcChoZG1pLmJhc2Vfd3ApOworCQlpb3VubWFwKGhkbWkuaXBfZGF0YS5iYXNlX3dwKTsKIAkJcmV0dXJuIHI7CiAJfQogCiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAKKwloZG1pLmlwX2RhdGEuY29yZV9zeXNfb2Zmc2V0ID0gSERNSV9DT1JFX1NZUzsKKwloZG1pLmlwX2RhdGEuY29yZV9hdl9vZmZzZXQgPSBIRE1JX0NPUkVfQVY7CisJaGRtaS5pcF9kYXRhLnBsbF9vZmZzZXQgPSBIRE1JX1BMTENUUkw7CisJaGRtaS5pcF9kYXRhLnBoeV9vZmZzZXQgPSBIRE1JX1BIWTsKKwogCWhkbWlfcGFuZWxfaW5pdCgpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUkpIHx8IFwKQEAgLTE3NzksMTQgKzgwOSwxMyBAQAogCiAJaGRtaV9wdXRfY2xvY2tzKCk7CiAKLQlpb3VubWFwKGhkbWkuYmFzZV93cCk7CisJaW91bm1hcChoZG1pLmlwX2RhdGEuYmFzZV93cCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBoZG1pX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JY2xrX2Rpc2FibGUoaGRtaS5oZG1pX2Nsayk7CiAJY2xrX2Rpc2FibGUoaGRtaS5zeXNfY2xrKTsKIAogCWRpc3BjX3J1bnRpbWVfcHV0KCk7CkBAIC0xODA5LDcgKzgzOCw2IEBACiAKIAogCWNsa19lbmFibGUoaGRtaS5zeXNfY2xrKTsKLQljbGtfZW5hYmxlKGhkbWkuaGRtaV9jbGspOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWkuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4NWY5Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9oZG1pLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoKLSAqIGhkbWkuaAotICoKLSAqIEhETUkgZHJpdmVyIGRlZmluaXRpb24gZm9yIFRJIE9NQVA0IHByb2Nlc3NvcnMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqLwotCi0jaWZuZGVmIF9PTUFQNF9EU1NfSERNSV9IXwotI2RlZmluZSBfT01BUDRfRFNTX0hETUlfSF8KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KLQotI2RlZmluZSBIRE1JX1dQCQkweDAKLSNkZWZpbmUgSERNSV9DT1JFX1NZUwkJMHg0MDAKLSNkZWZpbmUgSERNSV9DT1JFX0FWCQkweDkwMAotI2RlZmluZSBIRE1JX1BMTENUUkwJCTB4MjAwCi0jZGVmaW5lIEhETUlfUEhZCQkweDMwMAotCi1zdHJ1Y3QgaGRtaV9yZWcgeyB1MTYgaWR4OyB9OwotCi0jZGVmaW5lIEhETUlfUkVHKGlkeCkJCQkoKGNvbnN0IHN0cnVjdCBoZG1pX3JlZykgeyBpZHggfSkKLQotLyogSERNSSBXcmFwcGVyICovCi0jZGVmaW5lIEhETUlfV1BfUkVHKGlkeCkJCQlIRE1JX1JFRyhIRE1JX1dQICsgaWR4KQotCi0jZGVmaW5lIEhETUlfV1BfUkVWSVNJT04JCQlIRE1JX1dQX1JFRygweDApCi0jZGVmaW5lIEhETUlfV1BfU1lTQ09ORklHCQkJSERNSV9XUF9SRUcoMHgxMCkKLSNkZWZpbmUgSERNSV9XUF9JUlFTVEFUVVNfUkFXCQkJSERNSV9XUF9SRUcoMHgyNCkKLSNkZWZpbmUgSERNSV9XUF9JUlFTVEFUVVMJCQlIRE1JX1dQX1JFRygweDI4KQotI2RlZmluZSBIRE1JX1dQX1BXUl9DVFJMCQkJSERNSV9XUF9SRUcoMHg0MCkKLSNkZWZpbmUgSERNSV9XUF9JUlFFTkFCTEVfU0VUCQkJSERNSV9XUF9SRUcoMHgyQykKLSNkZWZpbmUgSERNSV9XUF9WSURFT19DRkcJCQlIRE1JX1dQX1JFRygweDUwKQotI2RlZmluZSBIRE1JX1dQX1ZJREVPX1NJWkUJCQlIRE1JX1dQX1JFRygweDYwKQotI2RlZmluZSBIRE1JX1dQX1ZJREVPX1RJTUlOR19ICQkJSERNSV9XUF9SRUcoMHg2OCkKLSNkZWZpbmUgSERNSV9XUF9WSURFT19USU1JTkdfVgkJCUhETUlfV1BfUkVHKDB4NkMpCi0jZGVmaW5lIEhETUlfV1BfV1BfQ0xLCQkJCUhETUlfV1BfUkVHKDB4NzApCi0jZGVmaW5lIEhETUlfV1BfQVVESU9fQ0ZHCQkJSERNSV9XUF9SRUcoMHg4MCkKLSNkZWZpbmUgSERNSV9XUF9BVURJT19DRkcyCQkJSERNSV9XUF9SRUcoMHg4NCkKLSNkZWZpbmUgSERNSV9XUF9BVURJT19DVFJMCQkJSERNSV9XUF9SRUcoMHg4OCkKLSNkZWZpbmUgSERNSV9XUF9BVURJT19EQVRBCQkJSERNSV9XUF9SRUcoMHg4QykKLQotLyogSERNSSBJUCBDb3JlIFN5c3RlbSAqLwotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1JFRyhpZHgpCQkJSERNSV9SRUcoSERNSV9DT1JFX1NZUyArIGlkeCkKLQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1ZORF9JREwJCQlIRE1JX0NPUkVfU1lTX1JFRygweDApCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfREVWX0lETAkJCUhETUlfQ09SRV9TWVNfUkVHKDB4OCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERVZfSURICQkJSERNSV9DT1JFX1NZU19SRUcoMHhDKQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFVl9SRVYJCQlIRE1JX0NPUkVfU1lTX1JFRygweDEwKQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1NSU1QJCQlIRE1JX0NPUkVfU1lTX1JFRygweDE0KQotI2RlZmluZSBIRE1JX0NPUkVfQ1RSTDEJCQlIRE1JX0NPUkVfU1lTX1JFRygweDIwKQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1NZU19TVEFUCQkJSERNSV9DT1JFX1NZU19SRUcoMHgyNCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19WSURfQUNFTgkJCUhETUlfQ09SRV9TWVNfUkVHKDB4MTI0KQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1ZJRF9NT0RFCQkJSERNSV9DT1JFX1NZU19SRUcoMHgxMjgpCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUl9TVEFURQkJSERNSV9DT1JFX1NZU19SRUcoMHgxQzApCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUjEJCQlIRE1JX0NPUkVfU1lTX1JFRygweDFDNCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19JTlRSMgkJCUhETUlfQ09SRV9TWVNfUkVHKDB4MUM4KQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX0lOVFIzCQkJSERNSV9DT1JFX1NZU19SRUcoMHgxQ0MpCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUjQJCQlIRE1JX0NPUkVfU1lTX1JFRygweDFEMCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19VTUFTSzEJCQlIRE1JX0NPUkVfU1lTX1JFRygweDFENCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19UTURTX0NUUkwJCUhETUlfQ09SRV9TWVNfUkVHKDB4MjA4KQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFX0RMWQkJCUhETUlfQ09SRV9TWVNfUkVHKDB4QzgpCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfREVfQ1RSTAkJCUhETUlfQ09SRV9TWVNfUkVHKDB4Q0MpCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfREVfVE9QCQkJSERNSV9DT1JFX1NZU19SRUcoMHhEMCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9DTlRMCQkJSERNSV9DT1JFX1NZU19SRUcoMHhEOCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9DTlRICQkJSERNSV9DT1JFX1NZU19SRUcoMHhEQykKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9MSU5MCQkJSERNSV9DT1JFX1NZU19SRUcoMHhFMCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9MSU5IXzEJCUhETUlfQ09SRV9TWVNfUkVHKDB4RTQpCi0jZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9WRU5fRk9MTE9XVlNZTkMJMHgxCi0jZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9IRU5fRk9MTE9XSFNZTkMJMHgxCi0jZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9CU0VMXzI0QklUQlVTCQkweDEKLSNkZWZpbmUgSERNSV9DT1JFX0NUUkwxX0VER0VfUklTSU5HRURHRQkweDEKLQotLyogSERNSSBEREMgRS1ESUQgKi8KLSNkZWZpbmUgSERNSV9DT1JFX0REQ19DTUQJCQlIRE1JX0NPUkVfU1lTX1JFRygweDNDQykKLSNkZWZpbmUgSERNSV9DT1JFX0REQ19TVEFUVVMJCQlIRE1JX0NPUkVfU1lTX1JFRygweDNDOCkKLSNkZWZpbmUgSERNSV9DT1JFX0REQ19BRERSCQkJSERNSV9DT1JFX1NZU19SRUcoMHgzQjQpCi0jZGVmaW5lIEhETUlfQ09SRV9ERENfT0ZGU0VUCQkJSERNSV9DT1JFX1NZU19SRUcoMHgzQkMpCi0jZGVmaW5lIEhETUlfQ09SRV9ERENfQ09VTlQxCQkJSERNSV9DT1JFX1NZU19SRUcoMHgzQzApCi0jZGVmaW5lIEhETUlfQ09SRV9ERENfQ09VTlQyCQkJSERNSV9DT1JFX1NZU19SRUcoMHgzQzQpCi0jZGVmaW5lIEhETUlfQ09SRV9ERENfREFUQQkJCUhETUlfQ09SRV9TWVNfUkVHKDB4M0QwKQotI2RlZmluZSBIRE1JX0NPUkVfRERDX1NFR00JCQlIRE1JX0NPUkVfU1lTX1JFRygweDNCOCkKLQotLyogSERNSSBJUCBDb3JlIEF1ZGlvIFZpZGVvICovCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9SRUcoaWR4KQkJCUhETUlfUkVHKEhETUlfQ09SRV9BViArIGlkeCkKLQotI2RlZmluZSBIRE1JX0NPUkVfQVZfSERNSV9DVFJMCQkJSERNSV9DT1JFX0FWX1JFRygweEJDKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfRFBECQkJSERNSV9DT1JFX0FWX1JFRygweEY0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfUEJfQ1RSTDEJCQlIRE1JX0NPUkVfQVZfUkVHKDB4RjgpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9QQl9DVFJMMgkJCUhETUlfQ09SRV9BVl9SRUcoMHhGQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9UWVBFCQkJSERNSV9DT1JFX0FWX1JFRygweDEwMCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9WRVJTCQkJSERNSV9DT1JFX0FWX1JFRygweDEwNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9MRU4JCQlIRE1JX0NPUkVfQVZfUkVHKDB4MTA4KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX0NIU1VNCQkJSERNSV9DT1JFX0FWX1JFRygweDEwQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9EQllURShuKQkJSERNSV9DT1JFX0FWX1JFRyhuICogNCArIDB4MTEwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFX05FTEVNUwkJSERNSV9DT1JFX0FWX1JFRygxNSkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX1NQRF9EQllURQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxOTApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfREJZVEVfTkVMRU1TCQlIRE1JX0NPUkVfQVZfUkVHKDI3KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX0RCWVRFKG4pCQlIRE1JX0NPUkVfQVZfUkVHKG4gKiA0ICsgMHgyMTApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVURfREJZVEVfTkVMRU1TCQlIRE1JX0NPUkVfQVZfUkVHKDEwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19EQllURQkJSERNSV9DT1JFX0FWX1JFRygweDI5MCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX01QRUdfREJZVEVfTkVMRU1TCQlIRE1JX0NPUkVfQVZfUkVHKDI3KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfR0VOX0RCWVRFCQkJSERNSV9DT1JFX0FWX1JFRygweDMwMCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0dFTl9EQllURV9ORUxFTVMJCUhETUlfQ09SRV9BVl9SRUcoMzEpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9HRU4yX0RCWVRFCQlIRE1JX0NPUkVfQVZfUkVHKDB4MzgwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfR0VOMl9EQllURV9ORUxFTVMJCUhETUlfQ09SRV9BVl9SRUcoMzEpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BQ1JfQ1RSTAkJCUhETUlfQ09SRV9BVl9SRUcoMHg0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfRlJFUV9TVkFMCQkJSERNSV9DT1JFX0FWX1JFRygweDgpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9OX1NWQUwxCQkJSERNSV9DT1JFX0FWX1JFRygweEMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9OX1NWQUwyCQkJSERNSV9DT1JFX0FWX1JFRygweDEwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfTl9TVkFMMwkJCUhETUlfQ09SRV9BVl9SRUcoMHgxNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19TVkFMMQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxOCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19TVkFMMgkJCUhETUlfQ09SRV9BVl9SRUcoMHgxQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19TVkFMMwkJCUhETUlfQ09SRV9BVl9SRUcoMHgyMCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19IVkFMMQkJCUhETUlfQ09SRV9BVl9SRUcoMHgyNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19IVkFMMgkJCUhETUlfQ09SRV9BVl9SRUcoMHgyOCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19IVkFMMwkJCUhETUlfQ09SRV9BVl9SRUcoMHgyQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRF9NT0RFCQkJSERNSV9DT1JFX0FWX1JFRygweDUwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BESUZfQ1RSTAkJSERNSV9DT1JFX0FWX1JFRygweDU0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfSFdfU1BESUZfRlMJCUhETUlfQ09SRV9BVl9SRUcoMHg2MCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX1NXQVBfSTJTCQkJSERNSV9DT1JFX0FWX1JFRygweDY0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BESUZfRVJUSAkJSERNSV9DT1JFX0FWX1JFRygweDZDKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0lOX01BUAkJSERNSV9DT1JFX0FWX1JFRygweDcwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0lOX0NUUkwJCUhETUlfQ09SRV9BVl9SRUcoMHg3NCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUMAkJCUhETUlfQ09SRV9BVl9SRUcoMHg3OCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUMQkJCUhETUlfQ09SRV9BVl9SRUcoMHg3QykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUMgkJCUhETUlfQ09SRV9BVl9SRUcoMHg4MCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUNAkJCUhETUlfQ09SRV9BVl9SRUcoMHg4NCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUNQkJCUhETUlfQ09SRV9BVl9SRUcoMHg4OCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FTUkMJCQlIRE1JX0NPUkVfQVZfUkVHKDB4OEMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9JMlNfSU5fTEVOCQlIRE1JX0NPUkVfQVZfUkVHKDB4OTApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9IRE1JX0NUUkwJCQlIRE1JX0NPUkVfQVZfUkVHKDB4QkMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVURPX1RYU1RBVAkJSERNSV9DT1JFX0FWX1JFRygweEMwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMQkJSERNSV9DT1JFX0FWX1JFRygweENDKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMgkJSERNSV9DT1JFX0FWX1JFRygweEQwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMwkJSERNSV9DT1JFX0FWX1JFRygweEQ0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfVEVTVF9UWENUUkwJCUhETUlfQ09SRV9BVl9SRUcoMHhGMCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0RQRAkJCUhETUlfQ09SRV9BVl9SRUcoMHhGNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX1BCX0NUUkwxCQkJSERNSV9DT1JFX0FWX1JFRygweEY4KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfUEJfQ1RSTDIJCQlIRE1JX0NPUkVfQVZfUkVHKDB4RkMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfVFlQRQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxMDApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfVkVSUwkJCUhETUlfQ09SRV9BVl9SRUcoMHgxMDQpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfTEVOCQkJSERNSV9DT1JFX0FWX1JFRygweDEwOCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9DSFNVTQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxMEMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfVFlQRQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxODApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfVkVSUwkJCUhETUlfQ09SRV9BVl9SRUcoMHgxODQpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfTEVOCQkJSERNSV9DT1JFX0FWX1JFRygweDE4OCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX1NQRF9DSFNVTQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxOEMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVURJT19UWVBFCQlIRE1JX0NPUkVfQVZfUkVHKDB4MjAwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVESU9fVkVSUwkJSERNSV9DT1JFX0FWX1JFRygweDIwNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRElPX0xFTgkJCUhETUlfQ09SRV9BVl9SRUcoMHgyMDgpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVURJT19DSFNVTQkJSERNSV9DT1JFX0FWX1JFRygweDIwQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX01QRUdfVFlQRQkJCUhETUlfQ09SRV9BVl9SRUcoMHgyODApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX1ZFUlMJCQlIRE1JX0NPUkVfQVZfUkVHKDB4Mjg0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19MRU4JCQlIRE1JX0NPUkVfQVZfUkVHKDB4Mjg4KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19DSFNVTQkJSERNSV9DT1JFX0FWX1JFRygweDI4QykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NQX0JZVEUxCQkJSERNSV9DT1JFX0FWX1JFRygweDM3QykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NFQ19BRERSX0lECQlIRE1JX0NPUkVfQVZfUkVHKDB4M0ZDKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BEX0RCWVRFX0VMU0laRQkJMHg0Ci0jZGVmaW5lIEhETUlfQ09SRV9BVl9HRU4yX0RCWVRFX0VMU0laRQkJMHg0Ci0jZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0RCWVRFX0VMU0laRQkJMHg0Ci0jZGVmaW5lIEhETUlfQ09SRV9BVl9HRU5fREJZVEVfRUxTSVpFCQkweDQKLQotLyogUExMICovCi0jZGVmaW5lIEhETUlfUExMX1JFRyhpZHgpCQkJSERNSV9SRUcoSERNSV9QTExDVFJMICsgaWR4KQotCi0jZGVmaW5lIFBMTENUUkxfUExMX0NPTlRST0wJCQlIRE1JX1BMTF9SRUcoMHgwKQotI2RlZmluZSBQTExDVFJMX1BMTF9TVEFUVVMJCQlIRE1JX1BMTF9SRUcoMHg0KQotI2RlZmluZSBQTExDVFJMX1BMTF9HTwkJCQlIRE1JX1BMTF9SRUcoMHg4KQotI2RlZmluZSBQTExDVFJMX0NGRzEJCQkJSERNSV9QTExfUkVHKDB4QykKLSNkZWZpbmUgUExMQ1RSTF9DRkcyCQkJCUhETUlfUExMX1JFRygweDEwKQotI2RlZmluZSBQTExDVFJMX0NGRzMJCQkJSERNSV9QTExfUkVHKDB4MTQpCi0jZGVmaW5lIFBMTENUUkxfQ0ZHNAkJCQlIRE1JX1BMTF9SRUcoMHgyMCkKLQotLyogSERNSSBQSFkgKi8KLSNkZWZpbmUgSERNSV9QSFlfUkVHKGlkeCkJCQlIRE1JX1JFRyhIRE1JX1BIWSArIGlkeCkKLQotI2RlZmluZSBIRE1JX1RYUEhZX1RYX0NUUkwJCQlIRE1JX1BIWV9SRUcoMHgwKQotI2RlZmluZSBIRE1JX1RYUEhZX0RJR0lUQUxfQ1RSTAkJSERNSV9QSFlfUkVHKDB4NCkKLSNkZWZpbmUgSERNSV9UWFBIWV9QT1dFUl9DVFJMCQkJSERNSV9QSFlfUkVHKDB4OCkKLSNkZWZpbmUgSERNSV9UWFBIWV9QQURfQ0ZHX0NUUkwJCUhETUlfUEhZX1JFRygweEMpCi0KLS8qIEhETUkgRURJRCBMZW5ndGggICovCi0jZGVmaW5lIEhETUlfRURJRF9NQVhfTEVOR1RICQkJMjU2Ci0jZGVmaW5lIEVESURfVElNSU5HX0RFU0NSSVBUT1JfU0laRQkJMHgxMgotI2RlZmluZSBFRElEX0RFU0NSSVBUT1JfQkxPQ0swX0FERFJFU1MJCTB4MzYKLSNkZWZpbmUgRURJRF9ERVNDUklQVE9SX0JMT0NLMV9BRERSRVNTCQkweDgwCi0jZGVmaW5lIEVESURfU0laRV9CTE9DSzBfVElNSU5HX0RFU0NSSVBUT1IJNAotI2RlZmluZSBFRElEX1NJWkVfQkxPQ0sxX1RJTUlOR19ERVNDUklQVE9SCTQKLQotI2RlZmluZSBPTUFQX0hETUlfVElNSU5HU19OQgkJCTM0Ci0KLSNkZWZpbmUgUkVHX0ZMRF9NT0QoaWR4LCB2YWwsIHN0YXJ0LCBlbmQpIFwKLQloZG1pX3dyaXRlX3JlZyhpZHgsIEZMRF9NT0QoaGRtaV9yZWFkX3JlZyhpZHgpLCB2YWwsIHN0YXJ0LCBlbmQpKQotI2RlZmluZSBSRUdfR0VUKGlkeCwgc3RhcnQsIGVuZCkgXAotCUZMRF9HRVQoaGRtaV9yZWFkX3JlZyhpZHgpLCBzdGFydCwgZW5kKQotCi0vKiBIRE1JIHRpbWluZyBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBoZG1pX3RpbWluZ3MgewotCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdGltaW5nczsKLQlpbnQgdnN5bmNfcG9sOwotCWludCBoc3luY19wb2w7Ci19OwotCi1lbnVtIGhkbWlfcGh5X3B3ciB7Ci0JSERNSV9QSFlQV1JDTURfT0ZGID0gMCwKLQlIRE1JX1BIWVBXUkNNRF9MRE9PTiA9IDEsCi0JSERNSV9QSFlQV1JDTURfVFhPTiA9IDIKLX07Ci0KLWVudW0gaGRtaV9wbGxfcHdyIHsKLQlIRE1JX1BMTFBXUkNNRF9BTExPRkYgPSAwLAotCUhETUlfUExMUFdSQ01EX1BMTE9OTFkgPSAxLAotCUhETUlfUExMUFdSQ01EX0JPVEhPTl9BTExDTEtTID0gMiwKLQlIRE1JX1BMTFBXUkNNRF9CT1RIT05fTk9QSFlDTEsgPSAzCi19OwotCi1lbnVtIGhkbWlfY2xrX3JlZnNlbCB7Ci0JSERNSV9SRUZTRUxfUENMSyA9IDAsCi0JSERNSV9SRUZTRUxfUkVGMSA9IDEsCi0JSERNSV9SRUZTRUxfUkVGMiA9IDIsCi0JSERNSV9SRUZTRUxfU1lTQ0xLID0gMwotfTsKLQotZW51bSBoZG1pX2NvcmVfaW5wdXRidXNfd2lkdGggewotCUhETUlfSU5QVVRfOEJJVCA9IDAsCi0JSERNSV9JTlBVVF8xMEJJVCA9IDEsCi0JSERNSV9JTlBVVF8xMkJJVCA9IDIKLX07Ci0KLWVudW0gaGRtaV9jb3JlX2RpdGhlcl90cnVuYyB7Ci0JSERNSV9PVVRQVVRUUlVOQ0FUSU9OXzhCSVQgPSAwLAotCUhETUlfT1VUUFVUVFJVTkNBVElPTl8xMEJJVCA9IDEsCi0JSERNSV9PVVRQVVRUUlVOQ0FUSU9OXzEyQklUID0gMiwKLQlIRE1JX09VVFBVVERJVEhFUl84QklUID0gMywKLQlIRE1JX09VVFBVVERJVEhFUl8xMEJJVCA9IDQsCi0JSERNSV9PVVRQVVRESVRIRVJfMTJCSVQgPSA1Ci19OwotCi1lbnVtIGhkbWlfY29yZV9kZWVwY29sb3JfZWQgewotCUhETUlfREVFUENPTE9SUEFDS0VDVERJU0FCTEUgPSAwLAotCUhETUlfREVFUENPTE9SUEFDS0VDVEVOQUJMRSA9IDEKLX07Ci0KLWVudW0gaGRtaV9jb3JlX3BhY2tldF9tb2RlIHsKLQlIRE1JX1BBQ0tFVE1PREVSRVNFUlZFRFZBTFVFID0gMCwKLQlIRE1JX1BBQ0tFVE1PREUyNEJJVFBFUlBJWEVMID0gNCwKLQlIRE1JX1BBQ0tFVE1PREUzMEJJVFBFUlBJWEVMID0gNSwKLQlIRE1JX1BBQ0tFVE1PREUzNkJJVFBFUlBJWEVMID0gNiwKLQlIRE1JX1BBQ0tFVE1PREU0OEJJVFBFUlBJWEVMID0gNwotfTsKLQotZW51bSBoZG1pX2NvcmVfaGRtaV9kdmkgewotCUhETUlfRFZJID0gMCwKLQlIRE1JX0hETUkgPSAxCi19OwotCi1lbnVtIGhkbWlfY29yZV90Y2xrc2VsY2xrbXVsdCB7Ci0JSERNSV9GUExMMDVJRENLID0gMCwKLQlIRE1JX0ZQTEwxMElEQ0sgPSAxLAotCUhETUlfRlBMTDIwSURDSyA9IDIsCi0JSERNSV9GUExMNDBJRENLID0gMwotfTsKLQotZW51bSBoZG1pX2NvcmVfcGFja2V0X2N0cmwgewotCUhETUlfUEFDS0VURU5BQkxFID0gMSwKLQlIRE1JX1BBQ0tFVERJU0FCTEUgPSAwLAotCUhETUlfUEFDS0VUUkVQRUFUT04gPSAxLAotCUhETUlfUEFDS0VUUkVQRUFUT0ZGID0gMAotfTsKLQotLyogSU5GT0ZSQU1FX0FWSV8gYW5kIElORk9GUkFNRV9BVURJT18gZGVmaW5pdGlvbnMgKi8KLWVudW0gaGRtaV9jb3JlX2luZm9mcmFtZSB7Ci0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMVlfUkdCID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIxWV9ZVVY0MjIgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFZX1lVVjQ0NCA9IDIsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMUFfQUNUSVZFX0ZPUk1BVF9PRkYgPSAwLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFBX0FDVElWRV9GT1JNQVRfT04gPSAgMSwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIxQl9OTyA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMUJfVkVSVCA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMUJfSE9SSSA9IDIsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMUJfVkVSVEhPUkkgPSAzLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFTXzAgPSAwLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFTXzEgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFTXzIgPSAyLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJDX05PID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIyQ19JVFU2MDEgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJDX0lUVTcwOSA9IDIsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMkNfRUNfRVhURU5ERUQgPSAzLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJNX05PID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIyTV80MyA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMk1fMTY5ID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIyUl9TQU1FID0gOCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIyUl80MyA9IDksCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMlJfMTY5ID0gMTAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMlJfMTQ5ID0gMTEsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM0lUQ19OTyA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM0lUQ19ZRVMgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNFQ19YVllVVjYwMSA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM0VDX1hWWVVWNzA5ID0gMSwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIzUV9ERUZBVUxUID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIzUV9MUiA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM1FfRlIgPSAyLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNTQ19OTyA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM1NDX0hPUkkgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNTQ19WRVJUID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIzU0NfSE9SSVZFUlQgPSAzLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl9OTyA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzIgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl8zID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfNCA9IDMsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzUgPSA0LAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl82ID0gNSwKLQlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfNyA9IDYsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzggPSA3LAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl85ID0gOCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfMTAgPSA5LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX0ZST01fU1RSRUFNID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9JRUM2MDk1OCA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfQUMzID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9NUEVHMSA9IDMsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfTVAzID0gNCwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9NUEVHMl9NVUxUSUNIID0gNSwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9BQUMgPSA2LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX0RUUyA9IDcsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfQVRSQUMgPSA4LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX09ORUJJVCA9IDksCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRE9MQllfRElHSVRBTF9QTFVTID0gMTAsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRFRTX0hEID0gMTEsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfTUFUID0gMTIsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRFNUID0gMTMsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfV01BX1BSTyA9IDE0LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGX0ZST01fU1RSRUFNID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl8zMjAwMCA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfNDQxMDAgPSAyLAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGXzQ4MDAwID0gMywKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl84ODIwMCA9IDQsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfOTYwMDAgPSA1LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGXzE3NjQwMCA9IDYsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfMTkyMDAwID0gNywKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTU19GUk9NX1NUUkVBTSA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU1NfMTZCSVQgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNTXzIwQklUID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTU18yNEJJVCA9IDMsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREI1X0RNX0lOSF9QRVJNSVRURUQgPSAwLAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCNV9ETV9JTkhfUFJPSElCSVRFRCA9IDEKLX07Ci0KLWVudW0gaGRtaV9wYWNraW5nX21vZGUgewotCUhETUlfUEFDS18xMGJfUkdCX1lVVjQ0NCA9IDAsCi0JSERNSV9QQUNLXzI0Yl9SR0JfWVVWNDQ0X1lVVjQyMiA9IDEsCi0JSERNSV9QQUNLXzIwYl9ZVVY0MjIgPSAyLAotCUhETUlfUEFDS19BTFJFQURZUEFDS0VEID0gNwotfTsKLQotZW51bSBoZG1pX2NvcmVfYXVkaW9fc2FtcGxlX2ZyZXEgewotCUhETUlfQVVESU9fRlNfMzIwMDAgPSAweDMsCi0JSERNSV9BVURJT19GU180NDEwMCA9IDB4MCwKLQlIRE1JX0FVRElPX0ZTXzQ4MDAwID0gMHgyLAotCUhETUlfQVVESU9fRlNfODgyMDAgPSAweDgsCi0JSERNSV9BVURJT19GU185NjAwMCA9IDB4QSwKLQlIRE1JX0FVRElPX0ZTXzE3NjQwMCA9IDB4QywKLQlIRE1JX0FVRElPX0ZTXzE5MjAwMCA9IDB4RSwKLQlIRE1JX0FVRElPX0ZTX05PVF9JTkRJQ0FURUQgPSAweDEKLX07Ci0KLWVudW0gaGRtaV9jb3JlX2F1ZGlvX2xheW91dCB7Ci0JSERNSV9BVURJT19MQVlPVVRfMkNIID0gMCwKLQlIRE1JX0FVRElPX0xBWU9VVF84Q0ggPSAxCi19OwotCi1lbnVtIGhkbWlfY29yZV9jdHNfbW9kZSB7Ci0JSERNSV9BVURJT19DVFNfTU9ERV9IVyA9IDAsCi0JSERNSV9BVURJT19DVFNfTU9ERV9TVyA9IDEKLX07Ci0KLWVudW0gaGRtaV9zdGVyZW9fY2hhbm5lbHMgewotCUhETUlfQVVESU9fU1RFUkVPX05PQ0hBTk5FTFMgPSAwLAotCUhETUlfQVVESU9fU1RFUkVPX09ORUNIQU5ORUwgPSAxLAotCUhETUlfQVVESU9fU1RFUkVPX1RXT0NIQU5ORUxTID0gMiwKLQlIRE1JX0FVRElPX1NURVJFT19USFJFRUNIQU5ORUxTID0gMywKLQlIRE1JX0FVRElPX1NURVJFT19GT1VSQ0hBTk5FTFMgPSA0Ci19OwotCi1lbnVtIGhkbWlfYXVkaW9fdHlwZSB7Ci0JSERNSV9BVURJT19UWVBFX0xQQ00gPSAwLAotCUhETUlfQVVESU9fVFlQRV9JRUMgPSAxCi19OwotCi1lbnVtIGhkbWlfYXVkaW9fanVzdGlmeSB7Ci0JSERNSV9BVURJT19KVVNUSUZZX0xFRlQgPSAwLAotCUhETUlfQVVESU9fSlVTVElGWV9SSUdIVCA9IDEKLX07Ci0KLWVudW0gaGRtaV9hdWRpb19zYW1wbGVfb3JkZXIgewotCUhETUlfQVVESU9fU0FNUExFX1JJR0hUX0ZJUlNUID0gMCwKLQlIRE1JX0FVRElPX1NBTVBMRV9MRUZUX0ZJUlNUID0gMQotfTsKLQotZW51bSBoZG1pX2F1ZGlvX3NhbXBsZXNfcGVyd29yZCB7Ci0JSERNSV9BVURJT19PTkVXT1JEX09ORVNBTVBMRSA9IDAsCi0JSERNSV9BVURJT19PTkVXT1JEX1RXT1NBTVBMRVMgPSAxCi19OwotCi1lbnVtIGhkbWlfYXVkaW9fc2FtcGxlX3NpemUgewotCUhETUlfQVVESU9fU0FNUExFXzE2QklUUyA9IDAsCi0JSERNSV9BVURJT19TQU1QTEVfMjRCSVRTID0gMQotfTsKLQotZW51bSBoZG1pX2F1ZGlvX3RyYW5zZl9tb2RlIHsKLQlIRE1JX0FVRElPX1RSQU5TRl9ETUEgPSAwLAotCUhETUlfQVVESU9fVFJBTlNGX0lSUSA9IDEKLX07Ci0KLWVudW0gaGRtaV9hdWRpb19ibGtfc3RydF9lbmRfc2lnIHsKLQlIRE1JX0FVRElPX0JMT0NLX1NJR19TVEFSVEVORF9PTiA9IDAsCi0JSERNSV9BVURJT19CTE9DS19TSUdfU1RBUlRFTkRfT0ZGID0gMQotfTsKLQotZW51bSBoZG1pX2F1ZGlvX2kyc19jb25maWcgewotCUhETUlfQVVESU9fSTJTX1dTX1BPTEFSSVRZX0xPV19JU19MRUZUID0gMCwKLQlIRE1JX0FVRElPX0kyU19XU19QT0xBUklUX1lMT1dfSVNfUklHSFQgPSAxLAotCUhETUlfQVVESU9fSTJTX01TQl9TSElGVEVEX0ZJUlNUID0gMCwKLQlIRE1JX0FVRElPX0kyU19MU0JfU0hJRlRFRF9GSVJTVCA9IDEsCi0JSERNSV9BVURJT19JMlNfTUFYX1dPUkRfMjBCSVRTID0gMCwKLQlIRE1JX0FVRElPX0kyU19NQVhfV09SRF8yNEJJVFMgPSAxLAotCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF9OT1RfU1BFQ0lGSUVEID0gMCwKLQlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMTZfQklUUyA9IDEsCi0JSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzE3X0JJVFMgPSA2LAotCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8xOF9CSVRTID0gMiwKLQlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMTlfQklUUyA9IDQsCi0JSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzIwX0JJVFNfMjBNQVggPSA1LAotCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8yMF9CSVRTXzI0TUFYID0gMSwKLQlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMjFfQklUUyA9IDYsCi0JSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzIyX0JJVFMgPSAyLAotCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8yM19CSVRTID0gNCwKLQlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMjRfQklUUyA9IDUsCi0JSERNSV9BVURJT19JMlNfU0NLX0VER0VfRkFMTElORyA9IDAsCi0JSERNSV9BVURJT19JMlNfU0NLX0VER0VfUklTSU5HID0gMSwKLQlIRE1JX0FVRElPX0kyU19WQklUX0ZPUl9QQ00gPSAwLAotCUhETUlfQVVESU9fSTJTX1ZCSVRfRk9SX0NPTVBSRVNTRUQgPSAxLAotCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF9OQSA9IDAsCi0JSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzE2ID0gMiwKLQlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMTcgPSAxMiwKLQlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMTggPSA0LAotCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8xOSA9IDgsCi0JSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzIwID0gMTAsCi0JSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzIxID0gMTMsCi0JSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzIyID0gNSwKLQlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMjMgPSA5LAotCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8yNCA9IDExLAotCUhETUlfQVVESU9fSTJTX0ZJUlNUX0JJVF9TSElGVCA9IDAsCi0JSERNSV9BVURJT19JMlNfRklSU1RfQklUX05PX1NISUZUID0gMSwKLQlIRE1JX0FVRElPX0kyU19TRDBfRU4gPSAxLAotCUhETUlfQVVESU9fSTJTX1NEMV9FTiA9IDEgPDwgMSwKLQlIRE1JX0FVRElPX0kyU19TRDJfRU4gPSAxIDw8IDIsCi0JSERNSV9BVURJT19JMlNfU0QzX0VOID0gMSA8PCAzLAotfTsKLQotZW51bSBoZG1pX2F1ZGlvX21jbGtfbW9kZSB7Ci0JSERNSV9BVURJT19NQ0xLXzEyOEZTID0gMCwKLQlIRE1JX0FVRElPX01DTEtfMjU2RlMgPSAxLAotCUhETUlfQVVESU9fTUNMS18zODRGUyA9IDIsCi0JSERNSV9BVURJT19NQ0xLXzUxMkZTID0gMywKLQlIRE1JX0FVRElPX01DTEtfNzY4RlMgPSA0LAotCUhETUlfQVVESU9fTUNMS18xMDI0RlMgPSA1LAotCUhETUlfQVVESU9fTUNMS18xMTUyRlMgPSA2LAotCUhETUlfQVVESU9fTUNMS18xOTJGUyA9IDcKLX07Ci0KLXN0cnVjdCBoZG1pX2NvcmVfdmlkZW9fY29uZmlnIHsKLQllbnVtIGhkbWlfY29yZV9pbnB1dGJ1c193aWR0aAlpcF9idXNfd2lkdGg7Ci0JZW51bSBoZG1pX2NvcmVfZGl0aGVyX3RydW5jCW9wX2RpdGhlcl90cnVjOwotCWVudW0gaGRtaV9jb3JlX2RlZXBjb2xvcl9lZAlkZWVwX2NvbG9yX3BrdDsKLQllbnVtIGhkbWlfY29yZV9wYWNrZXRfbW9kZQlwa3RfbW9kZTsKLQllbnVtIGhkbWlfY29yZV9oZG1pX2R2aQkJaGRtaV9kdmk7Ci0JZW51bSBoZG1pX2NvcmVfdGNsa3NlbGNsa211bHQJdGNsa19zZWxfY2xrbXVsdDsKLX07Ci0KLS8qCi0gKiBSZWZlciB0byBzZWN0aW9uIDguMiBpbiBIRE1JIDEuMyBzcGVjaWZpY2F0aW9uIGZvcgotICogZGV0YWlscyBhYm91dCBpbmZvZnJhbWUgZGF0YWJ5dGVzCi0gKi8KLXN0cnVjdCBoZG1pX2NvcmVfaW5mb2ZyYW1lX2F2aSB7Ci0JdTgJZGIxX2Zvcm1hdDsKLQkJLyogWTAsIFkxIHJnYix5Q2JDciAqLwotCXU4CWRiMV9hY3RpdmVfaW5mbzsKLQkJLyogQTAgIEFjdGl2ZSBpbmZvcm1hdGlvbiBQcmVzZW50ICovCi0JdTgJZGIxX2Jhcl9pbmZvX2R2OwotCQkvKiBCMCwgQjEgQmFyIGluZm8gZGF0YSB2YWxpZCAqLwotCXU4CWRiMV9zY2FuX2luZm87Ci0JCS8qIFMwLCBTMSBzY2FuIGluZm9ybWF0aW9uICovCi0JdTgJZGIyX2NvbG9yaW1ldHJ5OwotCQkvKiBDMCwgQzEgY29sb3JpbWV0cnkgKi8KLQl1OAlkYjJfYXNwZWN0X3JhdGlvOwotCQkvKiBNMCwgTTEgQXNwZWN0IHJhdGlvICg0OjMsIDE2OjkpICovCi0JdTgJZGIyX2FjdGl2ZV9mbXRfYXI7Ci0JCS8qIFIwLi4uUjMgQWN0aXZlIGZvcm1hdCBhc3BlY3QgcmF0aW8gKi8KLQl1OAlkYjNfaXRjOwotCQkvKiBJVEMgSVQgY29udGVudC4gKi8KLQl1OAlkYjNfZWM7Ci0JCS8qIEVDMCwgRUMxLCBFQzIgRXh0ZW5kZWQgY29sb3JpbWV0cnkgKi8KLQl1OAlkYjNfcV9yYW5nZTsKLQkJLyogUTEsIFEwIFF1YW50aXphdGlvbiByYW5nZSAqLwotCXU4CWRiM19udXBfc2NhbGluZzsKLQkJLyogU0MxLCBTQzAgTm9uLXVuaWZvcm0gcGljdHVyZSBzY2FsaW5nICovCi0JdTgJZGI0X3ZpZGVvY29kZTsKLQkJLyogVklDMC4uNiBWaWRlbyBmb3JtYXQgaWRlbnRpZmljYXRpb24gKi8KLQl1OAlkYjVfcGl4ZWxfcmVwZWF0OwotCQkvKiBQUjAuLlBSMyBQaXhlbCByZXBldGl0aW9uIGZhY3RvciAqLwotCXUxNglkYjZfN19saW5lX2VvZnRvcDsKLQkJLyogTGluZSBudW1iZXIgZW5kIG9mIHRvcCBiYXIgKi8KLQl1MTYJZGI4XzlfbGluZV9zb2Zib3R0b207Ci0JCS8qIExpbmUgbnVtYmVyIHN0YXJ0IG9mIGJvdHRvbSBiYXIgKi8KLQl1MTYJZGIxMF8xMV9waXhlbF9lb2ZsZWZ0OwotCQkvKiBQaXhlbCBudW1iZXIgZW5kIG9mIGxlZnQgYmFyICovCi0JdTE2CWRiMTJfMTNfcGl4ZWxfc29mcmlnaHQ7Ci0JCS8qIFBpeGVsIG51bWJlciBzdGFydCBvZiByaWdodCBiYXIgKi8KLX07Ci0vKgotICogUmVmZXIgdG8gc2VjdGlvbiA4LjIgaW4gSERNSSAxLjMgc3BlY2lmaWNhdGlvbiBmb3IKLSAqIGRldGFpbHMgYWJvdXQgaW5mb2ZyYW1lIGRhdGFieXRlcwotICovCi1zdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdWRpbyB7Ci0JdTggZGIxX2NvZGluZ190eXBlOwotCXU4IGRiMV9jaGFubmVsX2NvdW50OwotCXU4IGRiMl9zYW1wbGVfZnJlcTsKLQl1OCBkYjJfc2FtcGxlX3NpemU7Ci0JdTggZGI0X2NoYW5uZWxfYWxsb2M7Ci0JYm9vbCBkYjVfZG93bm1peF9pbmg7Ci0JdTggZGI1X2xzdjsJLyogTGV2ZWwgc2hpZnQgdmFsdWVzIGZvciBkb3dubWl4ICovCi19OwotCi1zdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0IHsKLQl1MzIJYXVkaW9fcGt0OwotCXUzMglhdWRpb19wa3RfcmVwZWF0OwotCXUzMglhdmlfaW5mb2ZyYW1lOwotCXUzMglhdmlfaW5mb2ZyYW1lX3JlcGVhdDsKLQl1MzIJZ2VuX2NudHJsX3BrdDsKLQl1MzIJZ2VuX2NudHJsX3BrdF9yZXBlYXQ7Ci0JdTMyCWdlbmVyaWNfcGt0OwotCXUzMglnZW5lcmljX3BrdF9yZXBlYXQ7Ci19OwotCi1zdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgewotCWVudW0gaGRtaV9wYWNraW5nX21vZGUJcGFja2luZ19tb2RlOwotCXUzMgkJCXlfcmVzOwkvKiBMaW5lIHBlciBwYW5lbCAqLwotCXUzMgkJCXhfcmVzOwkvKiBwaXhlbCBwZXIgbGluZSAqLwotfTsKLQotc3RydWN0IGhkbWlfdmlkZW9faW50ZXJmYWNlIHsKLQlpbnQJdnNwOwkvKiBWc3luYyBwb2xhcml0eSAqLwotCWludAloc3A7CS8qIEhzeW5jIHBvbGFyaXR5ICovCi0JaW50CWludGVybGFjaW5nOwotCWludAl0bTsJLyogVGltaW5nIG1vZGUgKi8KLX07Ci0KLXN0cnVjdCBoZG1pX2NtIHsKLQlpbnQJY29kZTsKLQlpbnQJbW9kZTsKLX07Ci0KLXN0cnVjdCBoZG1pX2NvbmZpZyB7Ci0Jc3RydWN0IGhkbWlfdGltaW5ncyB0aW1pbmdzOwotCXUxNglpbnRlcmxhY2U7Ci0Jc3RydWN0IGhkbWlfY20gY207Ci19OwotCi1zdHJ1Y3QgaGRtaV9hdWRpb19mb3JtYXQgewotCWVudW0gaGRtaV9zdGVyZW9fY2hhbm5lbHMJCXN0ZXJlb19jaGFubmVsczsKLQl1OAkJCQkJYWN0aXZlX2Nobm5sc19tc2s7Ci0JZW51bSBoZG1pX2F1ZGlvX3R5cGUJCQl0eXBlOwotCWVudW0gaGRtaV9hdWRpb19qdXN0aWZ5CQkJanVzdGlmaWNhdGlvbjsKLQllbnVtIGhkbWlfYXVkaW9fc2FtcGxlX29yZGVyCQlzYW1wbGVfb3JkZXI7Ci0JZW51bSBoZG1pX2F1ZGlvX3NhbXBsZXNfcGVyd29yZAkJc2FtcGxlc19wZXJfd29yZDsKLQllbnVtIGhkbWlfYXVkaW9fc2FtcGxlX3NpemUJCXNhbXBsZV9zaXplOwotCWVudW0gaGRtaV9hdWRpb19ibGtfc3RydF9lbmRfc2lnCWVuX3NpZ19ibGtfc3RydF9lbmQ7Ci19OwotCi1zdHJ1Y3QgaGRtaV9hdWRpb19kbWEgewotCXU4CQkJCXRyYW5zZmVyX3NpemU7Ci0JdTgJCQkJYmxvY2tfc2l6ZTsKLQllbnVtIGhkbWlfYXVkaW9fdHJhbnNmX21vZGUJbW9kZTsKLQl1MTYJCQkJZmlmb190aHJlc2hvbGQ7Ci19OwotCi1zdHJ1Y3QgaGRtaV9jb3JlX2F1ZGlvX2kyc19jb25maWcgewotCXU4IHdvcmRfbWF4X2xlbmd0aDsKLQl1OCB3b3JkX2xlbmd0aDsKLQl1OCBpbl9sZW5ndGhfYml0czsKLQl1OCBqdXN0aWZpY2F0aW9uOwotCXU4IGVuX2hpZ2hfYml0cmF0ZV9hdWQ7Ci0JdTggc2NrX2VkZ2VfbW9kZTsKLQl1OCBjYml0X29yZGVyOwotCXU4IHZiaXQ7Ci0JdTggd3NfcG9sYXJpdHk7Ci0JdTggZGlyZWN0aW9uOwotCXU4IHNoaWZ0OwotCXU4IGFjdGl2ZV9zZHM7Ci19OwotCi1zdHJ1Y3QgaGRtaV9jb3JlX2F1ZGlvX2NvbmZpZyB7Ci0Jc3RydWN0IGhkbWlfY29yZV9hdWRpb19pMnNfY29uZmlnCWkyc19jZmc7Ci0JZW51bSBoZG1pX2NvcmVfYXVkaW9fc2FtcGxlX2ZyZXEJZnJlcV9zYW1wbGU7Ci0JYm9vbAkJCQkJZnNfb3ZlcnJpZGU7Ci0JdTMyCQkJCQluOwotCXUzMgkJCQkJY3RzOwotCXUzMgkJCQkJYXVkX3Bhcl9idXNjbGs7Ci0JZW51bSBoZG1pX2NvcmVfYXVkaW9fbGF5b3V0CQlsYXlvdXQ7Ci0JZW51bSBoZG1pX2NvcmVfY3RzX21vZGUJCQljdHNfbW9kZTsKLQlib29sCQkJCQl1c2VfbWNsazsKLQllbnVtIGhkbWlfYXVkaW9fbWNsa19tb2RlCQltY2xrX21vZGU7Ci0JYm9vbAkJCQkJZW5fYWNyX3BrdDsKLQlib29sCQkJCQllbl9kc2RfYXVkaW87Ci0JYm9vbAkJCQkJZW5fcGFyYWxsZWxfYXVkX2lucHV0OwotCWJvb2wJCQkJCWVuX3NwZGlmOwotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaV9vbWFwNF9wYW5lbC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaV9vbWFwNF9wYW5lbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRmMmJkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWlfb21hcDRfcGFuZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogaGRtaV9vbWFwNF9wYW5lbC5jCi0gKgotICogSERNSSBsaWJyYXJ5IHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQNCBwcm9jZXNzb3JzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLwotICogQXV0aG9yczoJTXl0aHJpIFAgayA8bXl0aHJpcGtAdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+Ci0KLSNpbmNsdWRlICJkc3MuaCIKLQotc3RhdGljIHN0cnVjdCB7Ci0Jc3RydWN0IG11dGV4IGhkbWlfbG9jazsKLX0gaGRtaTsKLQotCi1zdGF0aWMgaW50IGhkbWlfcGFuZWxfcHJvYmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCURTU0RCRygiRU5URVIgaGRtaV9wYW5lbF9wcm9iZVxuIik7Ci0KLQlkc3NkZXYtPnBhbmVsLmNvbmZpZyA9IE9NQVBfRFNTX0xDRF9URlQgfAotCQkJT01BUF9EU1NfTENEX0lWUyB8IE9NQVBfRFNTX0xDRF9JSFM7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIHRpbWluZ3MgdG8gNjQwICogNDgwCi0JICogVGhpcyBpcyBvbmx5IGZvciBmcmFtZWJ1ZmZlciB1cGRhdGUgbm90IGZvciBUViB0aW1pbmcgc2V0dGluZwotCSAqIFNldHRpbmcgVFYgdGltaW5nIHdpbGwgYmUgZG9uZSBvbmx5IG9uIGVuYWJsZQotCSAqLwotCWRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcyA9IDY0MDsKLQlkc3NkZXYtPnBhbmVsLnRpbWluZ3MueV9yZXMgPSA0ODA7Ci0KLQlEU1NEQkcoImhkbWlfcGFuZWxfcHJvYmUgeF9yZXM9ICVkIHlfcmVzID0gJWRcbiIsCi0JCWRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcywKLQkJZHNzZGV2LT5wYW5lbC50aW1pbmdzLnlfcmVzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9wYW5lbF9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCi19Ci0KLXN0YXRpYyBpbnQgaGRtaV9wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCWludCByID0gMDsKLQlEU1NEQkcoIkVOVEVSIGhkbWlfcGFuZWxfZW5hYmxlXG4iKTsKLQotCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKLQotCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQpIHsKLQkJciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKLQlpZiAocikgewotCQlEU1NFUlIoImZhaWxlZCB0byBwb3dlciBvblxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKLQotZXJyOgotCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfcGFuZWxfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCi0JCW9tYXBkc3NfaGRtaV9kaXNwbGF5X2Rpc2FibGUoZHNzZGV2KTsKLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOwotCi0JbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgaGRtaV9wYW5lbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlpbnQgciA9IDA7Ci0KLQltdXRleF9sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci0KLQlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkgewotCQlyID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEOwotCi0Jb21hcGRzc19oZG1pX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOwotCi1lcnI6Ci0JbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci0KLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIGludCBoZG1pX3BhbmVsX3Jlc3VtZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JaW50IHIgPSAwOwotCi0JbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQpIHsKLQkJciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKLQlpZiAocikgewotCQlEU1NFUlIoImZhaWxlZCB0byBwb3dlciBvblxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKLQotZXJyOgotCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfZ2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAotCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKLXsKLQltdXRleF9sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci0KLQkqdGltaW5ncyA9IGRzc2Rldi0+cGFuZWwudGltaW5nczsKLQotCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBoZG1pX3NldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKLQkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCi17Ci0JRFNTREJHKCJoZG1pX3NldF90aW1pbmdzXG4iKTsKLQotCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKLQotCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9ICp0aW1pbmdzOwotCi0JaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKLQkJLyogdHVybiB0aGUgaGRtaSBvZmYgYW5kIG9uIHRvIGdldCBuZXcgdGltaW5ncyB0byB1c2UgKi8KLQkJb21hcGRzc19oZG1pX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOwotCQlvbWFwZHNzX2hkbWlfZGlzcGxheV9zZXRfdGltaW5nKGRzc2Rldik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgaGRtaV9jaGVja190aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKLQkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCi17Ci0JaW50IHIgPSAwOwotCi0JRFNTREJHKCJoZG1pX2NoZWNrX3RpbWluZ3NcbiIpOwotCi0JbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JciA9IG9tYXBkc3NfaGRtaV9kaXNwbGF5X2NoZWNrX3RpbWluZyhkc3NkZXYsIHRpbWluZ3MpOwotCWlmIChyKSB7Ci0JCURTU0VSUigiVGltaW5nIGNhbm5vdCBiZSBhcHBsaWVkXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotZXJyOgotCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOwotCXJldHVybiByOwotfQotCi1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RyaXZlciBoZG1pX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gaGRtaV9wYW5lbF9wcm9iZSwKLQkucmVtb3ZlCQk9IGhkbWlfcGFuZWxfcmVtb3ZlLAotCS5lbmFibGUJCT0gaGRtaV9wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSBoZG1pX3BhbmVsX2Rpc2FibGUsCi0JLnN1c3BlbmQJPSBoZG1pX3BhbmVsX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBoZG1pX3BhbmVsX3Jlc3VtZSwKLQkuZ2V0X3RpbWluZ3MJPSBoZG1pX2dldF90aW1pbmdzLAotCS5zZXRfdGltaW5ncwk9IGhkbWlfc2V0X3RpbWluZ3MsCi0JLmNoZWNrX3RpbWluZ3MJPSBoZG1pX2NoZWNrX3RpbWluZ3MsCi0JLmRyaXZlcgkJCT0gewotCQkubmFtZSAgID0gImhkbWlfcGFuZWwiLAotCQkub3duZXIgID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLWludCBoZG1pX3BhbmVsX2luaXQodm9pZCkKLXsKLQltdXRleF9pbml0KCZoZG1pLmhkbWlfbG9jayk7Ci0KLQlvbWFwX2Rzc19yZWdpc3Rlcl9kcml2ZXIoJmhkbWlfZHJpdmVyKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGhkbWlfcGFuZWxfZXhpdCh2b2lkKQotewotCW9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKCZoZG1pX2RyaXZlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWlfcGFuZWwuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWlfcGFuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzNkNWRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaV9wYW5lbC5jCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogaGRtaV9wYW5lbC5jCisgKgorICogSERNSSBsaWJyYXJ5IHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQNCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICogQXV0aG9yczoJTXl0aHJpIFAgayA8bXl0aHJpcGtAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZHNzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBtdXRleCBoZG1pX2xvY2s7Cit9IGhkbWk7CisKKworc3RhdGljIGludCBoZG1pX3BhbmVsX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlEU1NEQkcoIkVOVEVSIGhkbWlfcGFuZWxfcHJvYmVcbiIpOworCisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUIHwKKwkJCU9NQVBfRFNTX0xDRF9JVlMgfCBPTUFQX0RTU19MQ0RfSUhTOworCisJZHNzZGV2LT5wYW5lbC50aW1pbmdzID0gKHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MpezY0MCwgNDgwLCAyNTE3NSwgOTYsIDE2LCA0OCwgMiAsIDExLCAzMX07CisKKwlEU1NEQkcoImhkbWlfcGFuZWxfcHJvYmUgeF9yZXM9ICVkIHlfcmVzID0gJWRcbiIsCisJCWRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcywKKwkJZHNzZGV2LT5wYW5lbC50aW1pbmdzLnlfcmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGRtaV9wYW5lbF9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCit9CisKK3N0YXRpYyBpbnQgaGRtaV9wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByID0gMDsKKwlEU1NEQkcoIkVOVEVSIGhkbWlfcGFuZWxfZW5hYmxlXG4iKTsKKworCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKKworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKKwlpZiAocikgeworCQlEU1NFUlIoImZhaWxlZCB0byBwb3dlciBvblxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKworZXJyOgorCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfcGFuZWxfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCisJCW9tYXBkc3NfaGRtaV9kaXNwbGF5X2Rpc2FibGUoZHNzZGV2KTsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOworCisJbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9wYW5lbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgciA9IDA7CisKKwltdXRleF9sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkgeworCQlyID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEOworCisJb21hcGRzc19oZG1pX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOworCitlcnI6CisJbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBoZG1pX3BhbmVsX3Jlc3VtZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaW50IHIgPSAwOworCisJbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKKwlpZiAocikgeworCQlEU1NFUlIoImZhaWxlZCB0byBwb3dlciBvblxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKworZXJyOgorCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfZ2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwltdXRleF9sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwkqdGltaW5ncyA9IGRzc2Rldi0+cGFuZWwudGltaW5nczsKKworCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3NldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCit7CisJRFNTREJHKCJoZG1pX3NldF90aW1pbmdzXG4iKTsKKworCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKKworCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9ICp0aW1pbmdzOworCW9tYXBkc3NfaGRtaV9kaXNwbGF5X3NldF90aW1pbmcoZHNzZGV2KTsKKworCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworfQorCitzdGF0aWMgaW50IGhkbWlfY2hlY2tfdGltaW5ncyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCWludCByID0gMDsKKworCURTU0RCRygiaGRtaV9jaGVja190aW1pbmdzXG4iKTsKKworCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKKworCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9jaGVja190aW1pbmcoZHNzZGV2LCB0aW1pbmdzKTsKKworCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGhkbWlfcmVhZF9lZGlkKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgdTggKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgcjsKKworCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKKworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKSB7CisJCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKKwkJaWYgKHIpCisJCQlnb3RvIGVycjsKKwl9CisKKwlyID0gb21hcGRzc19oZG1pX3JlYWRfZWRpZChidWYsIGxlbik7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEIHx8CisJCQlkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKQorCQlvbWFwZHNzX2hkbWlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGJvb2wgaGRtaV9kZXRlY3Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByOworCisJbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKKwkJciA9IG9tYXBkc3NfaGRtaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCWdvdG8gZXJyOworCX0KKworCXIgPSBvbWFwZHNzX2hkbWlfZGV0ZWN0KCk7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEIHx8CisJCQlkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKQorCQlvbWFwZHNzX2hkbWlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgaGRtaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGhkbWlfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBoZG1pX3BhbmVsX3JlbW92ZSwKKwkuZW5hYmxlCQk9IGhkbWlfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gaGRtaV9wYW5lbF9kaXNhYmxlLAorCS5zdXNwZW5kCT0gaGRtaV9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaGRtaV9wYW5lbF9yZXN1bWUsCisJLmdldF90aW1pbmdzCT0gaGRtaV9nZXRfdGltaW5ncywKKwkuc2V0X3RpbWluZ3MJPSBoZG1pX3NldF90aW1pbmdzLAorCS5jaGVja190aW1pbmdzCT0gaGRtaV9jaGVja190aW1pbmdzLAorCS5yZWFkX2VkaWQJPSBoZG1pX3JlYWRfZWRpZCwKKwkuZGV0ZWN0CQk9IGhkbWlfZGV0ZWN0LAorCS5kcml2ZXIJCQk9IHsKKwkJLm5hbWUgICA9ICJoZG1pX3BhbmVsIiwKKwkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitpbnQgaGRtaV9wYW5lbF9pbml0KHZvaWQpCit7CisJbXV0ZXhfaW5pdCgmaGRtaS5oZG1pX2xvY2spOworCisJb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZoZG1pX2RyaXZlcik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBoZG1pX3BhbmVsX2V4aXQodm9pZCkKK3sKKwlvbWFwX2Rzc191bnJlZ2lzdGVyX2RyaXZlcigmaGRtaV9kcml2ZXIpOworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMKaW5kZXggMTNkNzJkNS4uNmU2Mzg0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL21hbmFnZXIuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2RlZmF1bHRfY29sb3Jfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKIAkJCQkJICBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG1nci0+aW5mby5kZWZhdWx0X2NvbG9yKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlI3hcbiIsIG1nci0+aW5mby5kZWZhdWx0X2NvbG9yKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbWFuYWdlcl9kZWZhdWx0X2NvbG9yX3N0b3JlKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLApAQCAtMTE2LDggKzExNiw5IEBACiAJdTMyIGNvbG9yOwogCWludCByOwogCi0JaWYgKHNzY2FuZihidWYsICIlZCIsICZjb2xvcikgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJciA9IGtzdHJ0b3VpbnQoYnVmLCAwLCAmY29sb3IpOworCWlmIChyKQorCQlyZXR1cm4gcjsKIAogCW1nci0+Z2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKIApAQCAtMTg0LDcgKzE4NSw3IEBACiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX3RyYW5zX2tleV92YWx1ZV9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAogCQkJCQkgICAgY2hhciAqYnVmKQogewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBtZ3ItPmluZm8udHJhbnNfa2V5KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlI3hcbiIsIG1nci0+aW5mby50cmFuc19rZXkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX3RyYW5zX2tleV92YWx1ZV9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKQEAgLTE5NCw4ICsxOTUsOSBAQAogCXUzMiBrZXlfdmFsdWU7CiAJaW50IHI7CiAKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmtleV92YWx1ZSkgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJciA9IGtzdHJ0b3VpbnQoYnVmLCAwLCAma2V5X3ZhbHVlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKIAltZ3ItPmdldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CiAKQEAgLTIyMiwxNSArMjI0LDE2IEBACiAJCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87Ci0JaW50IGVuYWJsZTsKKwlib29sIGVuYWJsZTsKIAlpbnQgcjsKIAotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmZW5hYmxlKSAhPSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyID0gc3RydG9ib29sKGJ1ZiwgJmVuYWJsZSk7CisJaWYgKHIpCisJCXJldHVybiByOwogCiAJbWdyLT5nZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOwogCi0JaW5mby50cmFuc19lbmFibGVkID0gZW5hYmxlID8gdHJ1ZSA6IGZhbHNlOworCWluZm8udHJhbnNfZW5hYmxlZCA9IGVuYWJsZTsKIAogCXIgPSBtZ3ItPnNldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CiAJaWYgKHIpCkBAIC0yNDYsNyArMjQ5LDEwIEBACiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2FscGhhX2JsZW5kaW5nX2VuYWJsZWRfc2hvdygKIAkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IsIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgbWdyLT5pbmZvLmFscGhhX2VuYWJsZWQpOworCVdBUk5fT04oIWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZJWEVEX1pPUkRFUikpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCW1nci0+aW5mby5wYXJ0aWFsX2FscGhhX2VuYWJsZWQpOwogfQogCiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2FscGhhX2JsZW5kaW5nX2VuYWJsZWRfc3RvcmUoCkBAIC0yNTQsMTUgKzI2MCwxOCBAQAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87Ci0JaW50IGVuYWJsZTsKKwlib29sIGVuYWJsZTsKIAlpbnQgcjsKIAotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmZW5hYmxlKSAhPSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlXQVJOX09OKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIpKTsKKworCXIgPSBzdHJ0b2Jvb2woYnVmLCAmZW5hYmxlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKIAltZ3ItPmdldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CiAKLQlpbmZvLmFscGhhX2VuYWJsZWQgPSBlbmFibGUgPyB0cnVlIDogZmFsc2U7CisJaW5mby5wYXJ0aWFsX2FscGhhX2VuYWJsZWQgPSBlbmFibGU7CiAKIAlyID0gbWdyLT5zZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOwogCWlmIChyKQpAQCAtMjg1LDE5ICsyOTQsMTYgQEAKIAkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXJfaW5mbyBpbmZvOwotCWludCB2OwogCWludCByOwogCWJvb2wgZW5hYmxlOwogCiAJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmdik7CisJciA9IHN0cnRvYm9vbChidWYsICZlbmFibGUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWVuYWJsZSA9ICEhdjsKLQogCW1nci0+Z2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKIAogCWlmIChpbmZvLmNwcl9lbmFibGUgPT0gZW5hYmxlKQpAQCAtNTg2LDYgKzU5MiwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKgorCSAqIERvbid0IGFsbG93IGN1cnJlbnRseSBlbmFibGVkIGRpc3BsYXlzIHRvIGhhdmUgdGhlIG92ZXJsYXkgbWFuYWdlcgorCSAqIHB1bGxlZCBvdXQgZnJvbSB1bmRlcm5lYXRoIHRoZW0KKwkgKi8KKwlpZiAobWdyLT5kZXZpY2UtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQpCisJCXJldHVybiAtRUlOVkFMOworCiAJbWdyLT5kZXZpY2UtPm1hbmFnZXIgPSBOVUxMOwogCW1nci0+ZGV2aWNlID0gTlVMTDsKIAltZ3ItPmRldmljZV9jaGFuZ2VkID0gdHJ1ZTsKQEAgLTgwMSw3ICs4MTQsNyBAQAogewogCXN0cnVjdCBvdmVybGF5X2NhY2hlX2RhdGEgKmM7CiAJc3RydWN0IG1hbmFnZXJfY2FjaGVfZGF0YSAqbWM7Ci0Jc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICpvaTsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gKm9pLCBuZXdfb2k7CiAJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2luZm8gKm1pOwogCXUxNiBvdXR3LCBvdXRoOwogCXUxNiB4LCB5LCB3LCBoOwpAQCAtODE1LDcgKzgyOCw3IEBACiAJb2kgPSAmYy0+aW5mbzsKIAogCWlmICghYy0+ZW5hYmxlZCkgewotCQlkaXNwY19lbmFibGVfcGxhbmUocGxhbmUsIDApOworCQlkaXNwY19vdmxfZW5hYmxlKHBsYW5lLCAwKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC04NDMsNyArODU2LDcgQEAKIAkJLyogSWYgdGhlIG92ZXJsYXkgaXMgb3V0c2lkZSB0aGUgdXBkYXRlIHJlZ2lvbiwgZGlzYWJsZSBpdCAqLwogCQlpZiAoIXJlY3RhbmdsZV9pbnRlcnNlY3RzKG1jLT54LCBtYy0+eSwgbWMtPncsIG1jLT5oLAogCQkJCQl4LCB5LCBvdXR3LCBvdXRoKSkgewotCQkJZGlzcGNfZW5hYmxlX3BsYW5lKHBsYW5lLCAwKTsKKwkJCWRpc3BjX292bF9lbmFibGUocGxhbmUsIDApOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtOTIxLDM0ICs5MzQsMjcgQEAKIAkJfQogCX0KIAotCXIgPSBkaXNwY19zZXR1cF9wbGFuZShwbGFuZSwKLQkJCXBhZGRyLAotCQkJb2ktPnNjcmVlbl93aWR0aCwKLQkJCXgsIHksCi0JCQl3LCBoLAotCQkJb3V0dywgb3V0aCwKLQkJCW9pLT5jb2xvcl9tb2RlLAotCQkJYy0+aWxhY2UsCi0JCQlvaS0+cm90YXRpb25fdHlwZSwKLQkJCW9pLT5yb3RhdGlvbiwKLQkJCW9pLT5taXJyb3IsCi0JCQlvaS0+Z2xvYmFsX2FscGhhLAotCQkJb2ktPnByZV9tdWx0X2FscGhhLAotCQkJYy0+Y2hhbm5lbCwKLQkJCW9pLT5wX3V2X2FkZHIpOworCW5ld19vaSA9ICpvaTsKIAorCS8qIHVwZGF0ZSBuZXdfb2kgbWVtYmVycyB3aGljaCBjb3VsZCBoYXZlIGJlZW4gcG9zc2libHkgdXBkYXRlZCAqLworCW5ld19vaS5wb3NfeCA9IHg7CisJbmV3X29pLnBvc195ID0geTsKKwluZXdfb2kud2lkdGggPSB3OworCW5ld19vaS5oZWlnaHQgPSBoOworCW5ld19vaS5vdXRfd2lkdGggPSBvdXR3OworCW5ld19vaS5vdXRfaGVpZ2h0ID0gb3V0aDsKKwluZXdfb2kucGFkZHIgPSBwYWRkcjsKKworCXIgPSBkaXNwY19vdmxfc2V0dXAocGxhbmUsICZuZXdfb2ksIGMtPmlsYWNlLCBjLT5jaGFubmVsLAorCQljLT5yZXBsaWNhdGlvbiwgYy0+Zmlmb19sb3csIGMtPmZpZm9faGlnaCk7CiAJaWYgKHIpIHsKIAkJLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCi0JCURTU0VSUigiZGlzcGNfc2V0dXBfcGxhbmUgZmFpbGVkIGZvciBvdmwgJWRcbiIsIHBsYW5lKTsKLQkJZGlzcGNfZW5hYmxlX3BsYW5lKHBsYW5lLCAwKTsKKwkJRFNTRVJSKCJkaXNwY19vdmxfc2V0dXAgZmFpbGVkIGZvciBvdmwgJWRcbiIsIHBsYW5lKTsKKwkJZGlzcGNfb3ZsX2VuYWJsZShwbGFuZSwgMCk7CiAJCXJldHVybiByOwogCX0KIAotCWRpc3BjX2VuYWJsZV9yZXBsaWNhdGlvbihwbGFuZSwgYy0+cmVwbGljYXRpb24pOwotCi0JZGlzcGNfc2V0X2ZpZm9fdGhyZXNob2xkKHBsYW5lLCBjLT5maWZvX2xvdywgYy0+Zmlmb19oaWdoKTsKLQotCWRpc3BjX2VuYWJsZV9wbGFuZShwbGFuZSwgMSk7CisJZGlzcGNfb3ZsX2VuYWJsZShwbGFuZSwgMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk2MiwxMyArOTY4LDEzIEBACiAJLyogcGlja2luZyBpbmZvIGZyb20gdGhlIGNhY2hlICovCiAJbWkgPSAmZHNzX2NhY2hlLm1hbmFnZXJfY2FjaGVbY2hhbm5lbF0uaW5mbzsKIAotCWRpc3BjX3NldF9kZWZhdWx0X2NvbG9yKGNoYW5uZWwsIG1pLT5kZWZhdWx0X2NvbG9yKTsKLQlkaXNwY19zZXRfdHJhbnNfa2V5KGNoYW5uZWwsIG1pLT50cmFuc19rZXlfdHlwZSwgbWktPnRyYW5zX2tleSk7Ci0JZGlzcGNfZW5hYmxlX3RyYW5zX2tleShjaGFubmVsLCBtaS0+dHJhbnNfZW5hYmxlZCk7Ci0JZGlzcGNfZW5hYmxlX2FscGhhX2JsZW5kaW5nKGNoYW5uZWwsIG1pLT5hbHBoYV9lbmFibGVkKTsKKwlkaXNwY19tZ3Jfc2V0X2RlZmF1bHRfY29sb3IoY2hhbm5lbCwgbWktPmRlZmF1bHRfY29sb3IpOworCWRpc3BjX21ncl9zZXRfdHJhbnNfa2V5KGNoYW5uZWwsIG1pLT50cmFuc19rZXlfdHlwZSwgbWktPnRyYW5zX2tleSk7CisJZGlzcGNfbWdyX2VuYWJsZV90cmFuc19rZXkoY2hhbm5lbCwgbWktPnRyYW5zX2VuYWJsZWQpOworCWRpc3BjX21ncl9lbmFibGVfYWxwaGFfZml4ZWRfem9yZGVyKGNoYW5uZWwsIG1pLT5wYXJ0aWFsX2FscGhhX2VuYWJsZWQpOwogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKSB7Ci0JCWRpc3BjX2VuYWJsZV9jcHIoY2hhbm5lbCwgbWktPmNwcl9lbmFibGUpOwotCQlkaXNwY19zZXRfY3ByX2NvZWYoY2hhbm5lbCwgJm1pLT5jcHJfY29lZnMpOworCQlkaXNwY19tZ3JfZW5hYmxlX2NwcihjaGFubmVsLCBtaS0+Y3ByX2VuYWJsZSk7CisJCWRpc3BjX21ncl9zZXRfY3ByX2NvZWYoY2hhbm5lbCwgJm1pLT5jcHJfY29lZnMpOwogCX0KIH0KIApAQCAtOTkyLDcgKzk5OCw3IEBACiAJYnVzeSA9IGZhbHNlOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyBpKyspIHsKLQkJbWdyX2J1c3lbaV0gPSBkaXNwY19nb19idXN5KGkpOworCQltZ3JfYnVzeVtpXSA9IGRpc3BjX21ncl9nb19idXN5KGkpOwogCQltZ3JfZ29baV0gPSBmYWxzZTsKIAl9CiAKQEAgLTEwNTMsNyArMTA1OSw3IEBACiAJCSAqIGFsd2F5cyBiZSB0dXJuZWQgb2ZmIGFmdGVyIGZyYW1lLCBhbmQgbmV3IHNldHRpbmdzIHdpbGwgYmUKIAkJICogdGFrZW4gaW4gdG8gdXNlIGF0IG5leHQgdXBkYXRlICovCiAJCWlmICghbWMtPm1hbnVhbF91cGRhdGUpCi0JCQlkaXNwY19nbyhpKTsKKwkJCWRpc3BjX21ncl9nbyhpKTsKIAl9CiAKIAlpZiAoYnVzeSkKQEAgLTEyNTgsNyArMTI2NCw3IEBACiAJdTMyIGlycV9tYXNrOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyBpKyspCi0JCW1ncl9idXN5W2ldID0gZGlzcGNfZ29fYnVzeShpKTsKKwkJbWdyX2J1c3lbaV0gPSBkaXNwY19tZ3JfZ29fYnVzeShpKTsKIAogCXNwaW5fbG9jaygmZHNzX2NhY2hlLmxvY2spOwogCkBAIC0xMjgwLDcgKzEyODYsNyBAQAogCiAJLyogcmUtcmVhZCBidXN5IGZsYWdzICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyBpKyspCi0JCW1ncl9idXN5W2ldID0gZGlzcGNfZ29fYnVzeShpKTsKKwkJbWdyX2J1c3lbaV0gPSBkaXNwY19tZ3JfZ29fYnVzeShpKTsKIAogCS8qIGtlZXAgcnVubmluZyBhcyBsb25nIGFzIHRoZXJlIGFyZSBidXN5IG1hbmFnZXJzLCBzbyB0aGF0CiAJICogd2UgY2FuIGNvbGxlY3Qgb3ZlcmxheS1hcHBsaWVkIGluZm9ybWF0aW9uICovCkBAIC0xMzI2LDExICsxMzMyLDEzIEBACiAKIAkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CiAKLQkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCi0JCQljb250aW51ZTsKLQogCQlvYyA9ICZkc3NfY2FjaGUub3ZlcmxheV9jYWNoZVtvdmwtPmlkXTsKIAorCQlpZiAob3ZsLT5tYW5hZ2VyX2NoYW5nZWQpIHsKKwkJCW92bC0+bWFuYWdlcl9jaGFuZ2VkID0gZmFsc2U7CisJCQlvdmwtPmluZm9fZGlydHkgID0gdHJ1ZTsKKwkJfQorCiAJCWlmICghb3ZlcmxheV9lbmFibGVkKG92bCkpIHsKIAkJCWlmIChvYy0+ZW5hYmxlZCkgewogCQkJCW9jLT5lbmFibGVkID0gZmFsc2U7CkBAIC0xMzc1LDkgKzEzODMsNiBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkobWdyLCAmbWFuYWdlcl9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldjsKIAotCQlpZiAoIShtZ3ItPmNhcHMgJiBPTUFQX0RTU19PVkxfTUdSX0NBUF9ESVNQQykpCi0JCQljb250aW51ZTsKLQogCQltYyA9ICZkc3NfY2FjaGUubWFuYWdlcl9jYWNoZVttZ3ItPmlkXTsKIAogCQlpZiAobWdyLT5kZXZpY2VfY2hhbmdlZCkgewpAQCAtMTQyMyw5ICsxNDI4LDYgQEAKIAogCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKIAotCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKLQkJCWNvbnRpbnVlOwotCiAJCW9jID0gJmRzc19jYWNoZS5vdmVybGF5X2NhY2hlW292bC0+aWRdOwogCiAJCWlmICghb2MtPmVuYWJsZWQpCkBAIC0xNDMzLDExICsxNDM1LDExIEBACiAKIAkJZHNzZGV2ID0gb3ZsLT5tYW5hZ2VyLT5kZXZpY2U7CiAKLQkJc2l6ZSA9IGRpc3BjX2dldF9wbGFuZV9maWZvX3NpemUob3ZsLT5pZCk7CisJCXNpemUgPSBkaXNwY19vdmxfZ2V0X2ZpZm9fc2l6ZShvdmwtPmlkKTsKIAkJaWYgKHVzZV9maWZvbWVyZ2UpCiAJCQlzaXplICo9IDM7CiAKLQkJYnVyc3Rfc2l6ZSA9IGRpc3BjX2dldF9idXJzdF9zaXplKG92bC0+aWQpOworCQlidXJzdF9zaXplID0gZGlzcGNfb3ZsX2dldF9idXJzdF9zaXplKG92bC0+aWQpOwogCiAJCXN3aXRjaCAoZHNzZGV2LT50eXBlKSB7CiAJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFBJOgpAQCAtMTQ4NCwxMiArMTQ4NiwxNyBAQAogCiBzdGF0aWMgaW50IGRzc19jaGVja19tYW5hZ2VyKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyKQogewotCS8qIE9NQVAgc3VwcG9ydHMgb25seSBncmFwaGljcyBzb3VyY2UgdHJhbnNwYXJlbmN5IGNvbG9yIGtleSBhbmQgYWxwaGEKLQkgKiBibGVuZGluZyBzaW11bHRhbmVvdXNseS4gU2VlIFRSTSAxNS40LjIuNC4yLjIgQWxwaGEgTW9kZSAqLwotCi0JaWYgKG1nci0+aW5mby5hbHBoYV9lbmFibGVkICYmIG1nci0+aW5mby50cmFuc19lbmFibGVkICYmCi0JCQltZ3ItPmluZm8udHJhbnNfa2V5X3R5cGUgIT0gT01BUF9EU1NfQ09MT1JfS0VZX0dGWF9EU1QpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIpKSB7CisJCS8qCisJCSAqIE9NQVAzIHN1cHBvcnRzIG9ubHkgZ3JhcGhpY3Mgc291cmNlIHRyYW5zcGFyZW5jeSBjb2xvciBrZXkKKwkJICogYW5kIGFscGhhIGJsZW5kaW5nIHNpbXVsdGFuZW91c2x5LiBTZWUgVFJNIDE1LjQuMi40LjIuMgorCQkgKiBBbHBoYSBNb2RlCisJCSAqLworCQlpZiAobWdyLT5pbmZvLnBhcnRpYWxfYWxwaGFfZW5hYmxlZCAmJiBtZ3ItPmluZm8udHJhbnNfZW5hYmxlZAorCQkJJiYgbWdyLT5pbmZvLnRyYW5zX2tleV90eXBlICE9CisJCQkJT01BUF9EU1NfQ09MT1JfS0VZX0dGWF9EU1QpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MjIsMTMgKzE1MjksMTMgQEAKIAogc3RhdGljIGludCBkc3NfbWdyX2VuYWJsZShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncikKIHsKLQlkaXNwY19lbmFibGVfY2hhbm5lbChtZ3ItPmlkLCAxKTsKKwlkaXNwY19tZ3JfZW5hYmxlKG1nci0+aWQsIDEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRzc19tZ3JfZGlzYWJsZShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncikKIHsKLQlkaXNwY19lbmFibGVfY2hhbm5lbChtZ3ItPmlkLCAwKTsKKwlkaXNwY19tZ3JfZW5hYmxlKG1nci0+aWQsIDApOwogCXJldHVybiAwOwogfQogCkBAIC0xNTgwLDcgKzE1ODcsNyBAQAogCQltZ3ItPmVuYWJsZSA9ICZkc3NfbWdyX2VuYWJsZTsKIAkJbWdyLT5kaXNhYmxlID0gJmRzc19tZ3JfZGlzYWJsZTsKIAotCQltZ3ItPmNhcHMgPSBPTUFQX0RTU19PVkxfTUdSX0NBUF9ESVNQQzsKKwkJbWdyLT5jYXBzID0gMDsKIAkJbWdyLT5zdXBwb3J0ZWRfZGlzcGxheXMgPQogCQkJZHNzX2ZlYXRfZ2V0X3N1cHBvcnRlZF9kaXNwbGF5cyhtZ3ItPmlkKTsKIApAQCAtMTU5Nyw0MiArMTYwNCw2IEBACiAJCX0KIAl9CiAKLSNpZmRlZiBMNF9FWEFNUExFCi0JewotCQlpbnQgb21hcF9kc3NfbWdyX2FwcGx5X2w0KHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyKQotCQl7Ci0JCQlEU1NEQkcoIm9tYXBfZHNzX21ncl9hcHBseV9sNCglcylcbiIsIG1nci0+bmFtZSk7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7Ci0JCW1nciA9IGt6YWxsb2Moc2l6ZW9mKCptZ3IpLCBHRlBfS0VSTkVMKTsKLQotCQlCVUdfT04obWdyID09IE5VTEwpOwotCi0JCW1nci0+bmFtZSA9ICJsNCI7Ci0JCW1nci0+c3VwcG9ydGVkX2Rpc3BsYXlzID0KLQkJCU9NQVBfRElTUExBWV9UWVBFX0RCSSB8IE9NQVBfRElTUExBWV9UWVBFX0RTSTsKLQotCQltZ3ItPnNldF9kZXZpY2UgPSAmb21hcF9kc3Nfc2V0X2RldmljZTsKLQkJbWdyLT51bnNldF9kZXZpY2UgPSAmb21hcF9kc3NfdW5zZXRfZGV2aWNlOwotCQltZ3ItPmFwcGx5ID0gJm9tYXBfZHNzX21ncl9hcHBseV9sNDsKLQkJbWdyLT5zZXRfbWFuYWdlcl9pbmZvID0gJm9tYXBfZHNzX21ncl9zZXRfaW5mbzsKLQkJbWdyLT5nZXRfbWFuYWdlcl9pbmZvID0gJm9tYXBfZHNzX21ncl9nZXRfaW5mbzsKLQotCQlkc3Nfb3ZlcmxheV9zZXR1cF9sNF9tYW5hZ2VyKG1ncik7Ci0KLQkJb21hcF9kc3NfYWRkX292ZXJsYXlfbWFuYWdlcihtZ3IpOwotCi0JCXIgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmbWdyLT5rb2JqLCAmbWFuYWdlcl9rdHlwZSwKLQkJCQkmcGRldi0+ZGV2LmtvYmosICJtYW5hZ2VybDQiKTsKLQotCQlpZiAocikKLQkJCURTU0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlXG4iKTsKLQl9Ci0jZW5kaWYKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9vdmVybGF5LmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9vdmVybGF5LmMKaW5kZXggYzg0MzgwYy4uYWI4ZTQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvb3ZlcmxheS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL292ZXJsYXkuYwpAQCAtMjExLDE2ICsyMTEsMTcgQEAKIHN0YXRpYyBzc2l6ZV90IG92ZXJsYXlfZW5hYmxlZF9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJc2l6ZV90IHNpemUpCiB7Ci0JaW50IHIsIGVuYWJsZTsKKwlpbnQgcjsKKwlib29sIGVuYWJsZTsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gaW5mbzsKIAogCW92bC0+Z2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmZW5hYmxlKTsKKwlyID0gc3RydG9ib29sKGJ1ZiwgJmVuYWJsZSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JaW5mby5lbmFibGVkID0gISFlbmFibGU7CisJaW5mby5lbmFibGVkID0gZW5hYmxlOwogCiAJciA9IG92bC0+c2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKIAlpZiAocikKQEAgLTI0OCw3ICsyNDksNyBAQAogCXU4IGFscGhhOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOwogCi0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQorCWlmICgob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9HTE9CQUxfQUxQSEEpID09IDApCiAJCXJldHVybiAtRU5PREVWOwogCiAJciA9IGtzdHJ0b3U4KGJ1ZiwgMCwgJmFscGhhKTsKQEAgLTI1NywxNCArMjU4LDcgQEAKIAogCW92bC0+Z2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKIAotCS8qIFZpZGVvMSBwbGFuZSBkb2VzIG5vdCBzdXBwb3J0IGdsb2JhbCBhbHBoYQotCSAqIHRvIGFsd2F5cyBtYWtlIGl0IDI1NSBjb21wbGV0ZWx5IG9wYXF1ZQotCSAqLwotCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBX1ZJRDEpICYmCi0JCQlvdmwtPmlkID09IE9NQVBfRFNTX1ZJREVPMSkKLQkJaW5mby5nbG9iYWxfYWxwaGEgPSAyNTU7Ci0JZWxzZQotCQlpbmZvLmdsb2JhbF9hbHBoYSA9IGFscGhhOworCWluZm8uZ2xvYmFsX2FscGhhID0gYWxwaGE7CiAKIAlyID0gb3ZsLT5zZXRfb3ZlcmxheV9pbmZvKG92bCwgJmluZm8pOwogCWlmIChyKQpAQCAtMjkzLDIwICsyODcsNTIgQEAKIAl1OCBhbHBoYTsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gaW5mbzsKIAorCWlmICgob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9QUkVfTVVMVF9BTFBIQSkgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlyID0ga3N0cnRvdTgoYnVmLCAwLCAmYWxwaGEpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAogCW92bC0+Z2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKIAotCS8qIG9ubHkgR0ZYIGFuZCBWaWRlbzIgcGxhbmUgc3VwcG9ydCBwcmUgYWxwaGEgbXVsdGlwbGllZAotCSAqIHNldCB6ZXJvIGZvciBWaWRlbzEgcGxhbmUKLQkgKi8KLQlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0dMT0JBTF9BTFBIQV9WSUQxKSAmJgotCQlvdmwtPmlkID09IE9NQVBfRFNTX1ZJREVPMSkKLQkJaW5mby5wcmVfbXVsdF9hbHBoYSA9IDA7Ci0JZWxzZQotCQlpbmZvLnByZV9tdWx0X2FscGhhID0gYWxwaGE7CisJaW5mby5wcmVfbXVsdF9hbHBoYSA9IGFscGhhOworCisJciA9IG92bC0+c2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAob3ZsLT5tYW5hZ2VyKSB7CisJCXIgPSBvdmwtPm1hbmFnZXItPmFwcGx5KG92bC0+bWFuYWdlcik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfem9yZGVyX3Nob3coc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG92bC0+aW5mby56b3JkZXIpOworfQorCitzdGF0aWMgc3NpemVfdCBvdmVybGF5X3pvcmRlcl9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IHI7CisJdTggem9yZGVyOworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOworCisJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUikgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyID0ga3N0cnRvdTgoYnVmLCAwLCAmem9yZGVyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlvdmwtPmdldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CisKKwlpbmZvLnpvcmRlciA9IHpvcmRlcjsKIAogCXIgPSBvdmwtPnNldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CiAJaWYgKHIpCkBAIC0zNDcsNiArMzczLDggQEAKIHN0YXRpYyBPVkVSTEFZX0FUVFIocHJlX211bHRfYWxwaGEsIFNfSVJVR098U19JV1VTUiwKIAkJb3ZlcmxheV9wcmVfbXVsdF9hbHBoYV9zaG93LAogCQlvdmVybGF5X3ByZV9tdWx0X2FscGhhX3N0b3JlKTsKK3N0YXRpYyBPVkVSTEFZX0FUVFIoem9yZGVyLCBTX0lSVUdPfFNfSVdVU1IsCisJCW92ZXJsYXlfem9yZGVyX3Nob3csIG92ZXJsYXlfem9yZGVyX3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm92ZXJsYXlfc3lzZnNfYXR0cnNbXSA9IHsKIAkmb3ZlcmxheV9hdHRyX25hbWUuYXR0ciwKQEAgLTM1OCw2ICszODYsNyBAQAogCSZvdmVybGF5X2F0dHJfZW5hYmxlZC5hdHRyLAogCSZvdmVybGF5X2F0dHJfZ2xvYmFsX2FscGhhLmF0dHIsCiAJJm92ZXJsYXlfYXR0cl9wcmVfbXVsdF9hbHBoYS5hdHRyLAorCSZvdmVybGF5X2F0dHJfem9yZGVyLmF0dHIsCiAJTlVMTAogfTsKIApAQCAtNDA3LDYgKzQzNiw3IEBACiAJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICppbmZvOwogCXUxNiBvdXR3LCBvdXRoOwogCXUxNiBkdywgZGg7CisJaW50IGk7CiAKIAlpZiAoIWRzc2RldikKIAkJcmV0dXJuIDA7CkBAIC00NjIsNiArNDkyLDMxIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUikgeworCQlpZiAoaW5mby0+em9yZGVyIDwgMCB8fCBpbmZvLT56b3JkZXIgPiAzKSB7CisJCQlEU1NFUlIoInpvcmRlciBvdXQgb2YgcmFuZ2U6ICVkXG4iLAorCQkJCWluZm8tPnpvcmRlcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKgorCQkgKiBDaGVjayB0aGF0IHpvcmRlciBkb2Vzbid0IG1hdGNoIHdpdGggem9yZGVyIG9mIGFueSBvdGhlcgorCQkgKiBvdmVybGF5IHdoaWNoIGlzIGVuYWJsZWQgYW5kIGlzIGFsc28gY29ubmVjdGVkIHRvIHRoZSBzYW1lCisJCSAqIG1hbmFnZXIKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKCk7IGkrKykgeworCQkJc3RydWN0IG9tYXBfb3ZlcmxheSAqdG1wX292bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KGkpOworCisJCQlpZiAodG1wX292bC0+aWQgIT0gb3ZsLT5pZCAmJgorCQkJCQl0bXBfb3ZsLT5tYW5hZ2VyID09IG92bC0+bWFuYWdlciAmJgorCQkJCQl0bXBfb3ZsLT5pbmZvLmVuYWJsZWQgPT0gdHJ1ZSAmJgorCQkJCQl0bXBfb3ZsLT5pbmZvLnpvcmRlciA9PSBpbmZvLT56b3JkZXIpIHsKKwkJCQlEU1NFUlIoIiVzIGFuZCAlcyBoYXZlIHNhbWUgem9yZGVyOiAlZFxuIiwKKwkJCQkJb3ZsLT5uYW1lLCB0bXBfb3ZsLT5uYW1lLCBpbmZvLT56b3JkZXIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxNiw2ICs1NzEsNyBAQAogCX0KIAogCW92bC0+bWFuYWdlciA9IG1ncjsKKwlvdmwtPm1hbmFnZXJfY2hhbmdlZCA9IHRydWU7CiAKIAkvKiBYWFg6IFdoZW4gdGhlcmUgaXMgYW4gb3ZlcmxheSBvbiBhIERTSSBtYW51YWwgdXBkYXRlIGRpc3BsYXksIGFuZAogCSAqIHRoZSBvdmVybGF5IGlzIGZpcnN0IGRpc2FibGVkLCB0aGVuIG1vdmVkIHRvIHR2LCBhbmQgZW5hYmxlZCwgd2UKQEAgLTUyOSwxNSArNTg1LDEyIEBACiAJICogVXNlcnNwYWNlIHdvcmthcm91bmQgZm9yIHRoaXMgaXMgdG8gdXBkYXRlIHRoZSBMQ0QgYWZ0ZXIgZGlzYWJsaW5nCiAJICogdGhlIG92ZXJsYXksIGJ1dCBiZWZvcmUgbW92aW5nIHRoZSBvdmVybGF5IHRvIFRWLgogCSAqLwotCWRpc3BjX3NldF9jaGFubmVsX291dChvdmwtPmlkLCBtZ3ItPmlkKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG9tYXBfZHNzX3Vuc2V0X21hbmFnZXIoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsKQogewotCWludCByOwotCiAJaWYgKCFvdmwtPm1hbmFnZXIpIHsKIAkJRFNTRVJSKCJmYWlsZWQgdG8gZGV0YWNoIG92ZXJsYXk6IG1hbmFnZXIgbm90IHNldFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTQ4LDExICs2MDEsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyID0gb3ZsLT53YWl0X2Zvcl9nbyhvdmwpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQogCW92bC0+bWFuYWdlciA9IE5VTEw7CisJb3ZsLT5tYW5hZ2VyX2NoYW5nZWQgPSB0cnVlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MTgsMjIgKzY2OCwyOSBAQAogCQljYXNlIDA6CiAJCQlvdmwtPm5hbWUgPSAiZ2Z4IjsKIAkJCW92bC0+aWQgPSBPTUFQX0RTU19HRlg7Ci0JCQlvdmwtPmNhcHMgPSBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDOwogCQkJb3ZsLT5pbmZvLmdsb2JhbF9hbHBoYSA9IDI1NTsKKwkJCW92bC0+aW5mby56b3JkZXIgPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKIAkJCW92bC0+bmFtZSA9ICJ2aWQxIjsKIAkJCW92bC0+aWQgPSBPTUFQX0RTU19WSURFTzE7Ci0JCQlvdmwtPmNhcHMgPSBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFIHwKLQkJCQlPTUFQX0RTU19PVkxfQ0FQX0RJU1BDOwogCQkJb3ZsLT5pbmZvLmdsb2JhbF9hbHBoYSA9IDI1NTsKKwkJCW92bC0+aW5mby56b3JkZXIgPQorCQkJCWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZSRUVfWk9SREVSKSA/IDMgOiAwOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKIAkJCW92bC0+bmFtZSA9ICJ2aWQyIjsKIAkJCW92bC0+aWQgPSBPTUFQX0RTU19WSURFTzI7Ci0JCQlvdmwtPmNhcHMgPSBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFIHwKLQkJCQlPTUFQX0RTU19PVkxfQ0FQX0RJU1BDOwogCQkJb3ZsLT5pbmZvLmdsb2JhbF9hbHBoYSA9IDI1NTsKKwkJCW92bC0+aW5mby56b3JkZXIgPQorCQkJCWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZSRUVfWk9SREVSKSA/IDIgOiAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCW92bC0+bmFtZSA9ICJ2aWQzIjsKKwkJCW92bC0+aWQgPSBPTUFQX0RTU19WSURFTzM7CisJCQlvdmwtPmluZm8uZ2xvYmFsX2FscGhhID0gMjU1OworCQkJb3ZsLT5pbmZvLnpvcmRlciA9CisJCQkJZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRlJFRV9aT1JERVIpID8gMSA6IDA7CiAJCQlicmVhazsKIAkJfQogCkBAIC02NDMsNiArNzAwLDcgQEAKIAkJb3ZsLT5nZXRfb3ZlcmxheV9pbmZvID0gJmRzc19vdmxfZ2V0X292ZXJsYXlfaW5mbzsKIAkJb3ZsLT53YWl0X2Zvcl9nbyA9ICZkc3Nfb3ZsX3dhaXRfZm9yX2dvOwogCisJCW92bC0+Y2FwcyA9IGRzc19mZWF0X2dldF9vdmVybGF5X2NhcHMob3ZsLT5pZCk7CiAJCW92bC0+c3VwcG9ydGVkX21vZGVzID0KIAkJCWRzc19mZWF0X2dldF9zdXBwb3J0ZWRfY29sb3JfbW9kZXMob3ZsLT5pZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYwppbmRleCAzOWY0YzU5Li4xMTMwYzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9yZmJpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvcmZiaS5jCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMzA5LDkgKzMxMCw5IEBACiAKIAlEU1NEQkcoInJmYmlfdHJhbnNmZXJfYXJlYSAlZHglZFxuIiwgd2lkdGgsIGhlaWdodCk7CiAKLQlkaXNwY19zZXRfbGNkX3NpemUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgd2lkdGgsIGhlaWdodCk7CisJZGlzcGNfbWdyX3NldF9sY2Rfc2l6ZShkc3NkZXYtPm1hbmFnZXItPmlkLCB3aWR0aCwgaGVpZ2h0KTsKIAotCWRpc3BjX2VuYWJsZV9jaGFubmVsKGRzc2Rldi0+bWFuYWdlci0+aWQsIHRydWUpOworCWRpc3BjX21ncl9lbmFibGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgdHJ1ZSk7CiAKIAlyZmJpLmZyYW1lZG9uZV9jYWxsYmFjayA9IGNhbGxiYWNrOwogCXJmYmkuZnJhbWVkb25lX2NhbGxiYWNrX2RhdGEgPSBkYXRhOwpAQCAtNzgzLDEwICs3ODQsOCBAQAogCWlmICgqdyA9PSAwIHx8ICpoID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGRzc2Rldi0+bWFuYWdlci0+Y2FwcyAmIE9NQVBfRFNTX09WTF9NR1JfQ0FQX0RJU1BDKSB7Ci0JCWRzc19zZXR1cF9wYXJ0aWFsX3BsYW5lcyhkc3NkZXYsIHgsIHksIHcsIGgsIHRydWUpOwotCQlkaXNwY19zZXRfbGNkX3NpemUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgKncsICpoKTsKLQl9CisJZHNzX3NldHVwX3BhcnRpYWxfcGxhbmVzKGRzc2RldiwgeCwgeSwgdywgaCwgdHJ1ZSk7CisJZGlzcGNfbWdyX3NldF9sY2Rfc2l6ZShkc3NkZXYtPm1hbmFnZXItPmlkLCAqdywgKmgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03OTYsMjIgKzc5NSw3IEBACiAJCXUxNiB4LCB1MTYgeSwgdTE2IHcsIHUxNiBoLAogCQl2b2lkICgqY2FsbGJhY2spKHZvaWQgKiksIHZvaWQgKmRhdGEpCiB7Ci0JaWYgKGRzc2Rldi0+bWFuYWdlci0+Y2FwcyAmIE9NQVBfRFNTX09WTF9NR1JfQ0FQX0RJU1BDKSB7Ci0JCXJmYmlfdHJhbnNmZXJfYXJlYShkc3NkZXYsIHcsIGgsIGNhbGxiYWNrLCBkYXRhKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7Ci0JCXZvaWQgX19pb21lbSAqYWRkcjsKLQkJaW50IHNjcl93aWR0aDsKLQotCQlvdmwgPSBkc3NkZXYtPm1hbmFnZXItPm92ZXJsYXlzWzBdOwotCQlzY3Jfd2lkdGggPSBvdmwtPmluZm8uc2NyZWVuX3dpZHRoOwotCQlhZGRyID0gb3ZsLT5pbmZvLnZhZGRyOwotCi0JCW9tYXBfcmZiaV93cml0ZV9waXhlbHMoYWRkciwgc2NyX3dpZHRoLCB4LCB5LCB3LCBoKTsKLQotCQljYWxsYmFjayhkYXRhKTsKLQl9Ci0KKwlyZmJpX3RyYW5zZmVyX2FyZWEoZHNzZGV2LCB3LCBoLCBjYWxsYmFjaywgZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBfcmZiaV91cGRhdGUpOwpAQCAtODYwLDYgKzg0NCwxMSBAQAogewogCWludCByOwogCisJaWYgKGRzc2Rldi0+bWFuYWdlciA9PSBOVUxMKSB7CisJCURTU0VSUigiZmFpbGVkIHRvIGVuYWJsZSBkaXNwbGF5OiBubyBtYW5hZ2VyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJciA9IHJmYmlfcnVudGltZV9nZXQoKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CkBAIC04NzcsMTMgKzg2NiwxMyBAQAogCQlnb3RvIGVycjE7CiAJfQogCi0JZGlzcGNfc2V0X2xjZF9kaXNwbGF5X3R5cGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwKKwlkaXNwY19tZ3Jfc2V0X2xjZF9kaXNwbGF5X3R5cGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwKIAkJCU9NQVBfRFNTX0xDRF9ESVNQTEFZX1RGVCk7CiAKLQlkaXNwY19zZXRfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwKLQkJCU9NQVBfRFNTX1BBUkFMTEVMTU9ERV9SRkJJKTsKKwlkaXNwY19tZ3Jfc2V0X2lvX3BhZF9tb2RlKERTU19JT19QQURfTU9ERV9SRkJJKTsKKwlkaXNwY19tZ3JfZW5hYmxlX3N0YWxsbW9kZShkc3NkZXYtPm1hbmFnZXItPmlkLCB0cnVlKTsKIAotCWRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSk7CisJZGlzcGNfbWdyX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSk7CiAKIAlyZmJpX2NvbmZpZ3VyZShkc3NkZXYtPnBoeS5yZmJpLmNoYW5uZWwsCiAJCQkgICAgICAgZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUsCkBAIC05NTIsMTAgKzk0MSw3IEBACiAKIAltc2xlZXAoMTApOwogCi0JaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwMzYzMCgpKQotCQljbGsgPSBkc3NfZ2V0X2ljaygpOwotCWVsc2UKLQkJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiaWNrIik7CisJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiaWNrIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCURTU0VSUigiY2FuJ3QgZ2V0IGlja1xuIik7CiAJCXIgPSBQVFJfRVJSKGNsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9zZGkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jCmluZGV4IDNhNjg4YzguLjQwMzA1YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlICJkc3MuaCIKQEAgLTM1LDEzICszNiwxMyBAQAogc3RhdGljIHZvaWQgc2RpX2Jhc2ljX2luaXQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogCiB7Ci0JZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsCi0JCQlPTUFQX0RTU19QQVJBTExFTE1PREVfQllQQVNTKTsKKwlkaXNwY19tZ3Jfc2V0X2lvX3BhZF9tb2RlKERTU19JT19QQURfTU9ERV9CWVBBU1MpOworCWRpc3BjX21ncl9lbmFibGVfc3RhbGxtb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsIGZhbHNlKTsKIAotCWRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJZGlzcGNfbWdyX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCiAJCQlPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOwogCi0JZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsIDI0KTsKKwlkaXNwY19tZ3Jfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsIDI0KTsKIAlkaXNwY19sY2RfZW5hYmxlX3NpZ25hbF9wb2xhcml0eSgxKTsKIH0KIApAQCAtNTUsNiArNTYsMTEgQEAKIAl1bnNpZ25lZCBsb25nIHBjazsKIAlpbnQgcjsKIAorCWlmIChkc3NkZXYtPm1hbmFnZXIgPT0gTlVMTCkgeworCQlEU1NFUlIoImZhaWxlZCB0byBlbmFibGUgZGlzcGxheTogbm8gbWFuYWdlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKIAlpZiAocikgewogCQlEU1NFUlIoImZhaWxlZCB0byBzdGFydCBkZXZpY2VcbiIpOwpAQCAtNzgsNyArODQsNyBAQAogCS8qIDE1LjUuOS4xLjIgKi8KIAlkc3NkZXYtPnBhbmVsLmNvbmZpZyB8PSBPTUFQX0RTU19MQ0RfUkYgfCBPTUFQX0RTU19MQ0RfT05PRkY7CiAKLQlkaXNwY19zZXRfcG9sX2ZyZXEoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgZHNzZGV2LT5wYW5lbC5jb25maWcsCisJZGlzcGNfbWdyX3NldF9wb2xfZnJlcShkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPnBhbmVsLmNvbmZpZywKIAkJCWRzc2Rldi0+cGFuZWwuYWNiaSwgZHNzZGV2LT5wYW5lbC5hY2IpOwogCiAJciA9IGRzc19jYWxjX2Nsb2NrX2RpdigxLCB0LT5waXhlbF9jbG9jayAqIDEwMDAsCkBAIC0xMDEsMTMgKzEwNywxMyBAQAogCX0KIAogCi0JZGlzcGNfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsIHQpOworCWRpc3BjX21ncl9zZXRfbGNkX3RpbWluZ3MoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgdCk7CiAKIAlyID0gZHNzX3NldF9jbG9ja19kaXYoJmRzc19jaW5mbyk7CiAJaWYgKHIpCiAJCWdvdG8gZXJyX3NldF9kc3NfY2xvY2tfZGl2OwogCi0JciA9IGRpc3BjX3NldF9jbG9ja19kaXYoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJmRpc3BjX2NpbmZvKTsKKwlyID0gZGlzcGNfbWdyX3NldF9jbG9ja19kaXYoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJmRpc3BjX2NpbmZvKTsKIAlpZiAocikKIAkJZ290byBlcnJfc2V0X2Rpc3BjX2Nsb2NrX2RpdjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdGlfaGRtaS5oIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdGlfaGRtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzQ0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy90aV9oZG1pLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiB0aV9oZG1pLmgKKyAqCisgKiBIRE1JIGRyaXZlciBkZWZpbml0aW9uIGZvciBUSSBPTUFQNCwgRE04MXh4LCBETTM4eHggIFByb2Nlc3Nvci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX1RJX0hETUlfSAorI2RlZmluZSBfVElfSERNSV9ICisKK3N0cnVjdCBoZG1pX2lwX2RhdGE7CisKK2VudW0gaGRtaV9wbGxfcHdyIHsKKwlIRE1JX1BMTFBXUkNNRF9BTExPRkYgPSAwLAorCUhETUlfUExMUFdSQ01EX1BMTE9OTFkgPSAxLAorCUhETUlfUExMUFdSQ01EX0JPVEhPTl9BTExDTEtTID0gMiwKKwlIRE1JX1BMTFBXUkNNRF9CT1RIT05fTk9QSFlDTEsgPSAzCit9OworCitlbnVtIGhkbWlfY29yZV9oZG1pX2R2aSB7CisJSERNSV9EVkkgPSAwLAorCUhETUlfSERNSSA9IDEKK307CisKK2VudW0gaGRtaV9jbGtfcmVmc2VsIHsKKwlIRE1JX1JFRlNFTF9QQ0xLID0gMCwKKwlIRE1JX1JFRlNFTF9SRUYxID0gMSwKKwlIRE1JX1JFRlNFTF9SRUYyID0gMiwKKwlIRE1JX1JFRlNFTF9TWVNDTEsgPSAzCit9OworCitzdHJ1Y3QgaGRtaV92aWRlb190aW1pbmdzIHsKKwl1MTYgeF9yZXM7CisJdTE2IHlfcmVzOworCS8qIFVuaXQ6IEtIeiAqLworCXUzMiBwaXhlbF9jbG9jazsKKwl1MTYgaHN3OworCXUxNiBoZnA7CisJdTE2IGhicDsKKwl1MTYgdnN3OworCXUxNiB2ZnA7CisJdTE2IHZicDsKK307CisKKy8qIEhETUkgdGltaW5nIHN0cnVjdHVyZSAqLworc3RydWN0IGhkbWlfdGltaW5ncyB7CisJc3RydWN0IGhkbWlfdmlkZW9fdGltaW5ncyB0aW1pbmdzOworCWludCB2c3luY19wb2w7CisJaW50IGhzeW5jX3BvbDsKK307CisKK3N0cnVjdCBoZG1pX2NtIHsKKwlpbnQJY29kZTsKKwlpbnQJbW9kZTsKK307CisKK3N0cnVjdCBoZG1pX2NvbmZpZyB7CisJc3RydWN0IGhkbWlfdGltaW5ncyB0aW1pbmdzOworCXUxNglpbnRlcmxhY2U7CisJc3RydWN0IGhkbWlfY20gY207Cit9OworCisvKiBIRE1JIFBMTCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBoZG1pX3BsbF9pbmZvIHsKKwl1MTYgcmVnbjsKKwl1MTYgcmVnbTsKKwl1MzIgcmVnbWY7CisJdTE2IHJlZ20yOworCXUxNiByZWdzZDsKKwl1MTYgZGNvZnJlcTsKKwllbnVtIGhkbWlfY2xrX3JlZnNlbCByZWZzZWw7Cit9OworCitzdHJ1Y3QgdGlfaGRtaV9pcF9vcHMgeworCisJdm9pZCAoKnZpZGVvX2NvbmZpZ3VyZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7CisKKwlpbnQgKCpwaHlfZW5hYmxlKShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKTsKKworCXZvaWQgKCpwaHlfZGlzYWJsZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7CisKKwlpbnQgKCpyZWFkX2VkaWQpKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIHU4ICplZGlkLCBpbnQgbGVuKTsKKworCWJvb2wgKCpkZXRlY3QpKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpOworCisJaW50ICgqcGxsX2VuYWJsZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7CisKKwl2b2lkICgqcGxsX2Rpc2FibGUpKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpOworCisJdm9pZCAoKnZpZGVvX2VuYWJsZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgYm9vbCBzdGFydCk7CisKKwl2b2lkICgqZHVtcF93cmFwcGVyKShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOworCisJdm9pZCAoKmR1bXBfY29yZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKTsKKworCXZvaWQgKCpkdW1wX3BsbCkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKTsKKworCXZvaWQgKCpkdW1wX3BoeSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKTsKKworfTsKKworc3RydWN0IGhkbWlfaXBfZGF0YSB7CisJdm9pZCBfX2lvbWVtCSpiYXNlX3dwOwkvKiBIRE1JIHdyYXBwZXIgKi8KKwl1bnNpZ25lZCBsb25nCWNvcmVfc3lzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nCWNvcmVfYXZfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcJcGxsX29mZnNldDsKKwl1bnNpZ25lZCBsb25nCXBoeV9vZmZzZXQ7CisJY29uc3Qgc3RydWN0IHRpX2hkbWlfaXBfb3BzICpvcHM7CisJc3RydWN0IGhkbWlfY29uZmlnIGNmZzsKKwlzdHJ1Y3QgaGRtaV9wbGxfaW5mbyBwbGxfZGF0YTsKK307CitpbnQgdGlfaGRtaV80eHh4X3BoeV9lbmFibGUoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7Cit2b2lkIHRpX2hkbWlfNHh4eF9waHlfZGlzYWJsZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKTsKK2ludCB0aV9oZG1pXzR4eHhfcmVhZF9lZGlkKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIHU4ICplZGlkLCBpbnQgbGVuKTsKK2Jvb2wgdGlfaGRtaV80eHh4X2RldGVjdChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKTsKK3ZvaWQgdGlfaGRtaV80eHh4X3dwX3ZpZGVvX3N0YXJ0KHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIGJvb2wgc3RhcnQpOworaW50IHRpX2hkbWlfNHh4eF9wbGxfZW5hYmxlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpOwordm9pZCB0aV9oZG1pXzR4eHhfcGxsX2Rpc2FibGUoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7Cit2b2lkIHRpX2hkbWlfNHh4eF9iYXNpY19jb25maWd1cmUoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7Cit2b2lkIHRpX2hkbWlfNHh4eF93cF9kdW1wKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIHN0cnVjdCBzZXFfZmlsZSAqcyk7Cit2b2lkIHRpX2hkbWlfNHh4eF9wbGxfZHVtcChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOwordm9pZCB0aV9oZG1pXzR4eHhfY29yZV9kdW1wKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIHN0cnVjdCBzZXFfZmlsZSAqcyk7Cit2b2lkIHRpX2hkbWlfNHh4eF9waHlfZHVtcChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3RpX2hkbWlfNHh4eF9pcC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdGlfaGRtaV80eHh4X2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhNmNlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3RpX2hkbWlfNHh4eF9pcC5jCkBAIC0wLDAgKzEsMTIzOSBAQAorLyoKKyAqIHRpX2hkbWlfNHh4eF9pcC5jCisgKgorICogSERNSSBUSTgxeHgsIFRJMzh4eCwgVEkgT01BUDQgZXRjIElQIGRyaXZlciBMaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqIEF1dGhvcnM6IFlvbmcgWmhpCisgKglNeXRocmkgcGsgPG15dGhyaXBrQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSAidGlfaGRtaV80eHh4X2lwLmgiCisjaW5jbHVkZSAiZHNzLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZG1pX3dyaXRlX3JlZyh2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwKKwkJCQljb25zdCB1MTYgaWR4LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIGJhc2VfYWRkciArIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhkbWlfcmVhZF9yZWcodm9pZCBfX2lvbWVtICpiYXNlX2FkZHIsCisJCQkJY29uc3QgdTE2IGlkeCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoYmFzZV9hZGRyICsgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmhkbWlfd3BfYmFzZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXJldHVybiBpcF9kYXRhLT5iYXNlX3dwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaGRtaV9waHlfYmFzZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXJldHVybiBpcF9kYXRhLT5iYXNlX3dwICsgaXBfZGF0YS0+cGh5X29mZnNldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmhkbWlfcGxsX2Jhc2Uoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSkKK3sKKwlyZXR1cm4gaXBfZGF0YS0+YmFzZV93cCArIGlwX2RhdGEtPnBsbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpoZG1pX2F2X2Jhc2Uoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSkKK3sKKwlyZXR1cm4gaXBfZGF0YS0+YmFzZV93cCArIGlwX2RhdGEtPmNvcmVfYXZfb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaGRtaV9jb3JlX3N5c19iYXNlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJcmV0dXJuIGlwX2RhdGEtPmJhc2Vfd3AgKyBpcF9kYXRhLT5jb3JlX3N5c19vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZSh2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwKKwkJCQljb25zdCB1MTYgaWR4LAorCQkJCWludCBiMiwgaW50IGIxLCB1MzIgdmFsKQoreworCXUzMiB0ID0gMDsKKwl3aGlsZSAodmFsICE9IFJFR19HRVQoYmFzZV9hZGRyLCBpZHgsIGIyLCBiMSkpIHsKKwkJdWRlbGF5KDEpOworCQlpZiAodCsrID4gMTAwMDApCisJCQlyZXR1cm4gIXZhbDsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBoZG1pX3BsbF9pbml0KHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJdTMyIHI7CisJdm9pZCBfX2lvbWVtICpwbGxfYmFzZSA9IGhkbWlfcGxsX2Jhc2UoaXBfZGF0YSk7CisJc3RydWN0IGhkbWlfcGxsX2luZm8gKmZtdCA9ICZpcF9kYXRhLT5wbGxfZGF0YTsKKworCS8qIFBMTCBzdGFydCBhbHdheXMgdXNlIG1hbnVhbCBtb2RlICovCisJUkVHX0ZMRF9NT0QocGxsX2Jhc2UsIFBMTENUUkxfUExMX0NPTlRST0wsIDB4MCwgMCwgMCk7CisKKwlyID0gaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcxKTsKKwlyID0gRkxEX01PRChyLCBmbXQtPnJlZ20sIDIwLCA5KTsgLyogQ0ZHMV9QTExfUkVHTSAqLworCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVnbiAtIDEsIDgsIDEpOyAgLyogQ0ZHMV9QTExfUkVHTiAqLworCisJaGRtaV93cml0ZV9yZWcocGxsX2Jhc2UsIFBMTENUUkxfQ0ZHMSwgcik7CisKKwlyID0gaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcyKTsKKworCXIgPSBGTERfTU9EKHIsIDB4MCwgMTIsIDEyKTsgLyogUExMX0hJR0hGUkVRIGRpdmlkZSBieSAyICovCisJciA9IEZMRF9NT0QociwgMHgxLCAxMywgMTMpOyAvKiBQTExfUkVGRU4gKi8KKwlyID0gRkxEX01PRChyLCAweDAsIDE0LCAxNCk7IC8qIFBIWV9DTEtJTkVOIGRlLWFzc2VydCBkdXJpbmcgbG9ja2luZyAqLworCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVmc2VsLCAyMiwgMjEpOyAvKiBSRUZTRUwgKi8KKworCWlmIChmbXQtPmRjb2ZyZXEpIHsKKwkJLyogZGl2aWRlciBwcm9ncmFtbWluZyBmb3IgZnJlcXVlbmN5IGJleW9uZCAxMDAwTWh6ICovCisJCVJFR19GTERfTU9EKHBsbF9iYXNlLCBQTExDVFJMX0NGRzMsIGZtdC0+cmVnc2QsIDE3LCAxMCk7CisJCXIgPSBGTERfTU9EKHIsIDB4NCwgMywgMSk7IC8qIDEwMDBNSHogYW5kIDIwMDBNSHogKi8KKwl9IGVsc2UgeworCQlyID0gRkxEX01PRChyLCAweDIsIDMsIDEpOyAvKiA1MDBNSHogYW5kIDEwMDBNSHogKi8KKwl9CisKKwloZG1pX3dyaXRlX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcyLCByKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKHBsbF9iYXNlLCBQTExDVFJMX0NGRzQpOworCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVnbTIsIDI0LCAxOCk7CisJciA9IEZMRF9NT0QociwgZm10LT5yZWdtZiwgMTcsIDApOworCisJaGRtaV93cml0ZV9yZWcocGxsX2Jhc2UsIFBMTENUUkxfQ0ZHNCwgcik7CisKKwkvKiBnbyBub3cgKi8KKwlSRUdfRkxEX01PRChwbGxfYmFzZSwgUExMQ1RSTF9QTExfR08sIDB4MSwgMCwgMCk7CisKKwkvKiB3YWl0IGZvciBiaXQgY2hhbmdlICovCisJaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShwbGxfYmFzZSwgUExMQ1RSTF9QTExfR08sCisJCQkJCQkJMCwgMCwgMSkgIT0gMSkgeworCQlwcl9lcnIoIlBMTCBHTyBiaXQgbm90IHNldFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qIFdhaXQgdGlsbCB0aGUgbG9jayBiaXQgaXMgc2V0IGluIFBMTCBzdGF0dXMgKi8KKwlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKHBsbF9iYXNlLAorCQkJCVBMTENUUkxfUExMX1NUQVRVUywgMSwgMSwgMSkgIT0gMSkgeworCQlwcl9lcnIoImNhbm5vdCBsb2NrIFBMTFxuIik7CisJCXByX2VycigiQ0ZHMSAweCV4XG4iLAorCQkJaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcxKSk7CisJCXByX2VycigiQ0ZHMiAweCV4XG4iLAorCQkJaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcyKSk7CisJCXByX2VycigiQ0ZHNCAweCV4XG4iLAorCQkJaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkc0KSk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXByX2RlYnVnKCJQTEwgbG9ja2VkIVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUEhZX1BXUl9DTUQgKi8KK3N0YXRpYyBpbnQgaGRtaV9zZXRfcGh5X3B3cihzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBlbnVtIGhkbWlfcGh5X3B3ciB2YWwpCit7CisJLyogQ29tbWFuZCBmb3IgcG93ZXIgY29udHJvbCBvZiBIRE1JIFBIWSAqLworCVJFR19GTERfTU9EKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9QV1JfQ1RSTCwgdmFsLCA3LCA2KTsKKworCS8qIFN0YXR1cyBvZiB0aGUgcG93ZXIgY29udHJvbCBvZiBIRE1JIFBIWSAqLworCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoaGRtaV93cF9iYXNlKGlwX2RhdGEpLAorCQkJCUhETUlfV1BfUFdSX0NUUkwsIDUsIDQsIHZhbCkgIT0gdmFsKSB7CisJCXByX2VycigiRmFpbGVkIHRvIHNldCBQSFkgcG93ZXIgbW9kZSB0byAlZFxuIiwgdmFsKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFBMTF9QV1JfQ01EICovCitzdGF0aWMgaW50IGhkbWlfc2V0X3BsbF9wd3Ioc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgZW51bSBoZG1pX3BsbF9wd3IgdmFsKQoreworCS8qIENvbW1hbmQgZm9yIHBvd2VyIGNvbnRyb2wgb2YgSERNSSBQTEwgKi8KKwlSRUdfRkxEX01PRChoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfUFdSX0NUUkwsIHZhbCwgMywgMik7CisKKwkvKiB3YWl0IHRpbGwgUEhZX1BXUl9TVEFUVVMgaXMgc2V0ICovCisJaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfUFdSX0NUUkwsCisJCQkJCQkxLCAwLCB2YWwpICE9IHZhbCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgUExMX1BXUl9TVEFUVVNcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pX3BsbF9yZXNldChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCS8qIFNZU1JFU0VUICBjb250cm9sbGVkIGJ5IHBvd2VyIEZTTSAqLworCVJFR19GTERfTU9EKGhkbWlfcGxsX2Jhc2UoaXBfZGF0YSksIFBMTENUUkxfUExMX0NPTlRST0wsIDB4MCwgMywgMyk7CisKKwkvKiBSRUFEIDB4MCByZXNldCBpcyBpbiBwcm9ncmVzcyAqLworCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoaGRtaV9wbGxfYmFzZShpcF9kYXRhKSwKKwkJCQlQTExDVFJMX1BMTF9TVEFUVVMsIDAsIDAsIDEpICE9IDEpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc3lzcmVzZXQgUExMXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB0aV9oZG1pXzR4eHhfcGxsX2VuYWJsZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXUxNiByID0gMDsKKworCXIgPSBoZG1pX3NldF9wbGxfcHdyKGlwX2RhdGEsIEhETUlfUExMUFdSQ01EX0FMTE9GRik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGhkbWlfc2V0X3BsbF9wd3IoaXBfZGF0YSwgSERNSV9QTExQV1JDTURfQk9USE9OX0FMTENMS1MpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBoZG1pX3BsbF9yZXNldChpcF9kYXRhKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gaGRtaV9wbGxfaW5pdChpcF9kYXRhKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB0aV9oZG1pXzR4eHhfcGxsX2Rpc2FibGUoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSkKK3sKKwloZG1pX3NldF9wbGxfcHdyKGlwX2RhdGEsIEhETUlfUExMUFdSQ01EX0FMTE9GRik7Cit9CisKK2ludCB0aV9oZG1pXzR4eHhfcGh5X2VuYWJsZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXUxNiByID0gMDsKKwl2b2lkIF9faW9tZW0gKnBoeV9iYXNlID0gaGRtaV9waHlfYmFzZShpcF9kYXRhKTsKKworCXIgPSBoZG1pX3NldF9waHlfcHdyKGlwX2RhdGEsIEhETUlfUEhZUFdSQ01EX0xET09OKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gaGRtaV9zZXRfcGh5X3B3cihpcF9kYXRhLCBIRE1JX1BIWVBXUkNNRF9UWE9OKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwkvKgorCSAqIFJlYWQgYWRkcmVzcyAwIGluIG9yZGVyIHRvIGdldCB0aGUgU0NQIHJlc2V0IGRvbmUgY29tcGxldGVkCisJICogRHVtbXkgYWNjZXNzIHBlcmZvcm1lZCB0byBtYWtlIHN1cmUgcmVzZXQgaXMgZG9uZQorCSAqLworCWhkbWlfcmVhZF9yZWcocGh5X2Jhc2UsIEhETUlfVFhQSFlfVFhfQ1RSTCk7CisKKwkvKgorCSAqIFdyaXRlIHRvIHBoeSBhZGRyZXNzIDAgdG8gY29uZmlndXJlIHRoZSBjbG9jaworCSAqIHVzZSBIRkJJVENMSyB3cml0ZSBIRE1JX1RYUEhZX1RYX0NPTlRST0xfRlJFUU9VVCBmaWVsZAorCSAqLworCVJFR19GTERfTU9EKHBoeV9iYXNlLCBIRE1JX1RYUEhZX1RYX0NUUkwsIDB4MSwgMzEsIDMwKTsKKworCS8qIFdyaXRlIHRvIHBoeSBhZGRyZXNzIDEgdG8gc3RhcnQgSERNSSBsaW5lIChUWFZBTElEIGFuZCBUTURTQ0xLRU4pICovCisJaGRtaV93cml0ZV9yZWcocGh5X2Jhc2UsIEhETUlfVFhQSFlfRElHSVRBTF9DVFJMLCAweEYwMDAwMDAwKTsKKworCS8qIFNldHVwIG1heCBMRE8gdm9sdGFnZSAqLworCVJFR19GTERfTU9EKHBoeV9iYXNlLCBIRE1JX1RYUEhZX1BPV0VSX0NUUkwsIDB4QiwgMywgMCk7CisKKwkvKiBXcml0ZSB0byBwaHkgYWRkcmVzcyAzIHRvIGNoYW5nZSB0aGUgcG9sYXJpdHkgY29udHJvbCAqLworCVJFR19GTERfTU9EKHBoeV9iYXNlLCBIRE1JX1RYUEhZX1BBRF9DRkdfQ1RSTCwgMHgxLCAyNywgMjcpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdGlfaGRtaV80eHh4X3BoeV9kaXNhYmxlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJaGRtaV9zZXRfcGh5X3B3cihpcF9kYXRhLCBIRE1JX1BIWVBXUkNNRF9PRkYpOworfQorCitzdGF0aWMgaW50IGhkbWlfY29yZV9kZGNfaW5pdChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IGhkbWlfY29yZV9zeXNfYmFzZShpcF9kYXRhKTsKKworCS8qIFR1cm4gb24gQ0xLIGZvciBEREMgKi8KKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfQVZfRFBELCAweDcsIDIsIDApOworCisJLyogSU5fUFJPRyAqLworCWlmIChSRUdfR0VUKGJhc2UsIEhETUlfQ09SRV9ERENfU1RBVFVTLCA0LCA0KSA9PSAxKSB7CisJCS8qIEFib3J0IHRyYW5zYWN0aW9uICovCisJCVJFR19GTERfTU9EKGJhc2UsIEhETUlfQ09SRV9ERENfQ01ELCAweGYsIDMsIDApOworCQkvKiBJTl9QUk9HICovCisJCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoYmFzZSwgSERNSV9DT1JFX0REQ19TVEFUVVMsCisJCQkJCTQsIDQsIDApICE9IDApIHsKKwkJCURTU0VSUigiVGltZW91dCBhYm9ydGluZyBEREMgdHJhbnNhY3Rpb25cbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisKKwkvKiBDbGsgU0NMIERldmljZXMgKi8KKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX0NNRCwgMHhBLCAzLCAwKTsKKworCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0lOX1BST0cgKi8KKwlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKGJhc2UsIEhETUlfQ09SRV9ERENfU1RBVFVTLAorCQkJCTQsIDQsIDApICE9IDApIHsKKwkJRFNTRVJSKCJUaW1lb3V0IHN0YXJ0aW5nIFNDTCBjbG9ja1xuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qIENsZWFyIEZJRk8gKi8KKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX0NNRCwgMHg5LCAzLCAwKTsKKworCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0lOX1BST0cgKi8KKwlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKGJhc2UsIEhETUlfQ09SRV9ERENfU1RBVFVTLAorCQkJCTQsIDQsIDApICE9IDApIHsKKwkJRFNTRVJSKCJUaW1lb3V0IGNsZWFyaW5nIEREQyBmaWZvXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9jb3JlX2RkY19lZGlkKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCXU4ICpwZWRpZCwgaW50IGV4dCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBoZG1pX2NvcmVfc3lzX2Jhc2UoaXBfZGF0YSk7CisJdTMyIGk7CisJY2hhciBjaGVja3N1bTsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0lOX1BST0cgKi8KKwlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKGJhc2UsIEhETUlfQ09SRV9ERENfU1RBVFVTLAorCQkJCTQsIDQsIDApICE9IDApIHsKKwkJRFNTRVJSKCJUaW1lb3V0IHdhaXRpbmcgRERDIHRvIGJlIHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJaWYgKGV4dCAlIDIgIT0gMCkKKwkJb2Zmc2V0ID0gMHg4MDsKKworCS8qIExvYWQgU2VnbWVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisJUkVHX0ZMRF9NT0QoYmFzZSwgSERNSV9DT1JFX0REQ19TRUdNLCBleHQgLyAyLCA3LCAwKTsKKworCS8qIExvYWQgU2xhdmUgQWRkcmVzcyBSZWdpc3RlciAqLworCVJFR19GTERfTU9EKGJhc2UsIEhETUlfQ09SRV9ERENfQUREUiwgMHhBMCA+PiAxLCA3LCAxKTsKKworCS8qIExvYWQgT2Zmc2V0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX09GRlNFVCwgb2Zmc2V0LCA3LCAwKTsKKworCS8qIExvYWQgQnl0ZSBDb3VudCAqLworCVJFR19GTERfTU9EKGJhc2UsIEhETUlfQ09SRV9ERENfQ09VTlQxLCAweDgwLCA3LCAwKTsKKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX0NPVU5UMiwgMHgwLCAxLCAwKTsKKworCS8qIFNldCBERENfQ01EICovCisJaWYgKGV4dCkKKwkJUkVHX0ZMRF9NT0QoYmFzZSwgSERNSV9DT1JFX0REQ19DTUQsIDB4NCwgMywgMCk7CisJZWxzZQorCQlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX0NNRCwgMHgyLCAzLCAwKTsKKworCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0JVU19MT1cgKi8KKwlpZiAoUkVHX0dFVChiYXNlLCBIRE1JX0NPUkVfRERDX1NUQVRVUywgNiwgNikgPT0gMSkgeworCQlwcl9lcnIoIkkyQyBCdXMgTG93P1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKwkvKiBIRE1JX0NPUkVfRERDX1NUQVRVU19OT19BQ0sgKi8KKwlpZiAoUkVHX0dFVChiYXNlLCBIRE1JX0NPUkVfRERDX1NUQVRVUywgNSwgNSkgPT0gMSkgeworCQlwcl9lcnIoIkkyQyBObyBBY2tcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMHg4MDsgKytpKSB7CisJCWludCB0OworCisJCS8qIElOX1BST0cgKi8KKwkJaWYgKFJFR19HRVQoYmFzZSwgSERNSV9DT1JFX0REQ19TVEFUVVMsIDQsIDQpID09IDApIHsKKwkJCURTU0VSUigib3BlcmF0aW9uIHN0b3BwZWQgd2hlbiByZWFkaW5nIGVkaWRcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQl0ID0gMDsKKwkJLyogRklGT19FTVBUWSAqLworCQl3aGlsZSAoUkVHX0dFVChiYXNlLCBIRE1JX0NPUkVfRERDX1NUQVRVUywgMiwgMikgPT0gMSkgeworCQkJaWYgKHQrKyA+IDEwMDAwKSB7CisJCQkJRFNTRVJSKCJ0aW1lb3V0IHJlYWRpbmcgZWRpZFxuIik7CisJCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCQl9CisJCQl1ZGVsYXkoMSk7CisJCX0KKworCQlwZWRpZFtpXSA9IFJFR19HRVQoYmFzZSwgSERNSV9DT1JFX0REQ19EQVRBLCA3LCAwKTsKKwl9CisKKwljaGVja3N1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDB4ODA7ICsraSkKKwkJY2hlY2tzdW0gKz0gcGVkaWRbaV07CisKKwlpZiAoY2hlY2tzdW0gIT0gMCkgeworCQlwcl9lcnIoIkUtRURJRCBjaGVja3N1bSBmYWlsZWQhIVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgdGlfaGRtaV80eHh4X3JlYWRfZWRpZChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCXU4ICplZGlkLCBpbnQgbGVuKQoreworCWludCByLCBsOworCisJaWYgKGxlbiA8IDEyOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyID0gaGRtaV9jb3JlX2RkY19pbml0KGlwX2RhdGEpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBoZG1pX2NvcmVfZGRjX2VkaWQoaXBfZGF0YSwgZWRpZCwgMCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJbCA9IDEyODsKKworCWlmIChsZW4gPj0gMTI4ICogMiAmJiBlZGlkWzB4N2VdID4gMCkgeworCQlyID0gaGRtaV9jb3JlX2RkY19lZGlkKGlwX2RhdGEsIGVkaWQgKyAweDgwLCAxKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwkJbCArPSAxMjg7CisJfQorCisJcmV0dXJuIGw7Cit9CisKK2Jvb2wgdGlfaGRtaV80eHh4X2RldGVjdChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCWludCByOworCisJdm9pZCBfX2lvbWVtICpiYXNlID0gaGRtaV9jb3JlX3N5c19iYXNlKGlwX2RhdGEpOworCisJLyogSFBEICovCisJciA9IFJFR19HRVQoYmFzZSwgSERNSV9DT1JFX1NZU19TWVNfU1RBVCwgMSwgMSk7CisKKwlyZXR1cm4gciA9PSAxOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2NvcmVfaW5pdChzdHJ1Y3QgaGRtaV9jb3JlX3ZpZGVvX2NvbmZpZyAqdmlkZW9fY2ZnLAorCQkJc3RydWN0IGhkbWlfY29yZV9pbmZvZnJhbWVfYXZpICphdmlfY2ZnLAorCQkJc3RydWN0IGhkbWlfY29yZV9wYWNrZXRfZW5hYmxlX3JlcGVhdCAqcmVwZWF0X2NmZykKK3sKKwlwcl9kZWJ1ZygiRW50ZXIgaGRtaV9jb3JlX2luaXRcbiIpOworCisJLyogdmlkZW8gY29yZSAqLworCXZpZGVvX2NmZy0+aXBfYnVzX3dpZHRoID0gSERNSV9JTlBVVF84QklUOworCXZpZGVvX2NmZy0+b3BfZGl0aGVyX3RydWMgPSBIRE1JX09VVFBVVFRSVU5DQVRJT05fOEJJVDsKKwl2aWRlb19jZmctPmRlZXBfY29sb3JfcGt0ID0gSERNSV9ERUVQQ09MT1JQQUNLRUNURElTQUJMRTsKKwl2aWRlb19jZmctPnBrdF9tb2RlID0gSERNSV9QQUNLRVRNT0RFUkVTRVJWRURWQUxVRTsKKwl2aWRlb19jZmctPmhkbWlfZHZpID0gSERNSV9EVkk7CisJdmlkZW9fY2ZnLT50Y2xrX3NlbF9jbGttdWx0ID0gSERNSV9GUExMMTBJRENLOworCisJLyogaW5mbyBmcmFtZSAqLworCWF2aV9jZmctPmRiMV9mb3JtYXQgPSAwOworCWF2aV9jZmctPmRiMV9hY3RpdmVfaW5mbyA9IDA7CisJYXZpX2NmZy0+ZGIxX2Jhcl9pbmZvX2R2ID0gMDsKKwlhdmlfY2ZnLT5kYjFfc2Nhbl9pbmZvID0gMDsKKwlhdmlfY2ZnLT5kYjJfY29sb3JpbWV0cnkgPSAwOworCWF2aV9jZmctPmRiMl9hc3BlY3RfcmF0aW8gPSAwOworCWF2aV9jZmctPmRiMl9hY3RpdmVfZm10X2FyID0gMDsKKwlhdmlfY2ZnLT5kYjNfaXRjID0gMDsKKwlhdmlfY2ZnLT5kYjNfZWMgPSAwOworCWF2aV9jZmctPmRiM19xX3JhbmdlID0gMDsKKwlhdmlfY2ZnLT5kYjNfbnVwX3NjYWxpbmcgPSAwOworCWF2aV9jZmctPmRiNF92aWRlb2NvZGUgPSAwOworCWF2aV9jZmctPmRiNV9waXhlbF9yZXBlYXQgPSAwOworCWF2aV9jZmctPmRiNl83X2xpbmVfZW9mdG9wID0gMCA7CisJYXZpX2NmZy0+ZGI4XzlfbGluZV9zb2Zib3R0b20gPSAwOworCWF2aV9jZmctPmRiMTBfMTFfcGl4ZWxfZW9mbGVmdCA9IDA7CisJYXZpX2NmZy0+ZGIxMl8xM19waXhlbF9zb2ZyaWdodCA9IDA7CisKKwkvKiBwYWNrZXQgZW5hYmxlIGFuZCByZXBlYXQgKi8KKwlyZXBlYXRfY2ZnLT5hdWRpb19wa3QgPSAwOworCXJlcGVhdF9jZmctPmF1ZGlvX3BrdF9yZXBlYXQgPSAwOworCXJlcGVhdF9jZmctPmF2aV9pbmZvZnJhbWUgPSAwOworCXJlcGVhdF9jZmctPmF2aV9pbmZvZnJhbWVfcmVwZWF0ID0gMDsKKwlyZXBlYXRfY2ZnLT5nZW5fY250cmxfcGt0ID0gMDsKKwlyZXBlYXRfY2ZnLT5nZW5fY250cmxfcGt0X3JlcGVhdCA9IDA7CisJcmVwZWF0X2NmZy0+Z2VuZXJpY19wa3QgPSAwOworCXJlcGVhdF9jZmctPmdlbmVyaWNfcGt0X3JlcGVhdCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfY29yZV9wb3dlcmRvd25fZGlzYWJsZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXByX2RlYnVnKCJFbnRlciBoZG1pX2NvcmVfcG93ZXJkb3duX2Rpc2FibGVcbiIpOworCVJFR19GTERfTU9EKGhkbWlfY29yZV9zeXNfYmFzZShpcF9kYXRhKSwgSERNSV9DT1JFX0NUUkwxLCAweDAsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2NvcmVfc3dyZXNldF9yZWxlYXNlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJcHJfZGVidWcoIkVudGVyIGhkbWlfY29yZV9zd3Jlc2V0X3JlbGVhc2VcbiIpOworCVJFR19GTERfTU9EKGhkbWlfY29yZV9zeXNfYmFzZShpcF9kYXRhKSwgSERNSV9DT1JFX1NZU19TUlNULCAweDAsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2NvcmVfc3dyZXNldF9hc3NlcnQoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSkKK3sKKwlwcl9kZWJ1ZygiRW50ZXIgaGRtaV9jb3JlX3N3cmVzZXRfYXNzZXJ0XG4iKTsKKwlSRUdfRkxEX01PRChoZG1pX2NvcmVfc3lzX2Jhc2UoaXBfZGF0YSksIEhETUlfQ09SRV9TWVNfU1JTVCwgMHgxLCAwLCAwKTsKK30KKworLyogSERNSV9DT1JFX1ZJREVPX0NPTkZJRyAqLworc3RhdGljIHZvaWQgaGRtaV9jb3JlX3ZpZGVvX2NvbmZpZyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCXN0cnVjdCBoZG1pX2NvcmVfdmlkZW9fY29uZmlnICpjZmcpCit7CisJdTMyIHIgPSAwOworCXZvaWQgX19pb21lbSAqY29yZV9zeXNfYmFzZSA9IGhkbWlfY29yZV9zeXNfYmFzZShpcF9kYXRhKTsKKworCS8qIHN5c19jdHJsMSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbm90IHR1bmFibGUgKi8KKwlyID0gaGRtaV9yZWFkX3JlZyhjb3JlX3N5c19iYXNlLCBIRE1JX0NPUkVfQ1RSTDEpOworCXIgPSBGTERfTU9EKHIsIEhETUlfQ09SRV9DVFJMMV9WRU5fRk9MTE9XVlNZTkMsIDUsIDUpOworCXIgPSBGTERfTU9EKHIsIEhETUlfQ09SRV9DVFJMMV9IRU5fRk9MTE9XSFNZTkMsIDQsIDQpOworCXIgPSBGTERfTU9EKHIsIEhETUlfQ09SRV9DVFJMMV9CU0VMXzI0QklUQlVTLCAyLCAyKTsKKwlyID0gRkxEX01PRChyLCBIRE1JX0NPUkVfQ1RSTDFfRURHRV9SSVNJTkdFREdFLCAxLCAxKTsKKwloZG1pX3dyaXRlX3JlZyhjb3JlX3N5c19iYXNlLCBIRE1JX0NPUkVfQ1RSTDEsIHIpOworCisJUkVHX0ZMRF9NT0QoY29yZV9zeXNfYmFzZSwKKwkJCUhETUlfQ09SRV9TWVNfVklEX0FDRU4sIGNmZy0+aXBfYnVzX3dpZHRoLCA3LCA2KTsKKworCS8qIFZpZF9Nb2RlICovCisJciA9IGhkbWlfcmVhZF9yZWcoY29yZV9zeXNfYmFzZSwgSERNSV9DT1JFX1NZU19WSURfTU9ERSk7CisKKwkvKiBkaXRoZXIgdHJ1bmNhdGlvbiBjb25maWd1cmF0aW9uICovCisJaWYgKGNmZy0+b3BfZGl0aGVyX3RydWMgPiBIRE1JX09VVFBVVFRSVU5DQVRJT05fMTJCSVQpIHsKKwkJciA9IEZMRF9NT0QociwgY2ZnLT5vcF9kaXRoZXJfdHJ1YyAtIDMsIDcsIDYpOworCQlyID0gRkxEX01PRChyLCAxLCA1LCA1KTsKKwl9IGVsc2UgeworCQlyID0gRkxEX01PRChyLCBjZmctPm9wX2RpdGhlcl90cnVjLCA3LCA2KTsKKwkJciA9IEZMRF9NT0QociwgMCwgNSwgNSk7CisJfQorCWhkbWlfd3JpdGVfcmVnKGNvcmVfc3lzX2Jhc2UsIEhETUlfQ09SRV9TWVNfVklEX01PREUsIHIpOworCisJLyogSERNSV9DdHJsICovCisJciA9IGhkbWlfcmVhZF9yZWcoaGRtaV9hdl9iYXNlKGlwX2RhdGEpLCBIRE1JX0NPUkVfQVZfSERNSV9DVFJMKTsKKwlyID0gRkxEX01PRChyLCBjZmctPmRlZXBfY29sb3JfcGt0LCA2LCA2KTsKKwlyID0gRkxEX01PRChyLCBjZmctPnBrdF9tb2RlLCA1LCAzKTsKKwlyID0gRkxEX01PRChyLCBjZmctPmhkbWlfZHZpLCAwLCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX2F2X2Jhc2UoaXBfZGF0YSksIEhETUlfQ09SRV9BVl9IRE1JX0NUUkwsIHIpOworCisJLyogVE1EU19DVFJMICovCisJUkVHX0ZMRF9NT0QoY29yZV9zeXNfYmFzZSwKKwkJCUhETUlfQ09SRV9TWVNfVE1EU19DVFJMLCBjZmctPnRjbGtfc2VsX2Nsa211bHQsIDYsIDUpOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2NvcmVfYXV4X2luZm9mcmFtZV9hdmlfY29uZmlnKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCXN0cnVjdCBoZG1pX2NvcmVfaW5mb2ZyYW1lX2F2aSBpbmZvX2F2aSkKK3sKKwl1MzIgdmFsOworCWNoYXIgc3VtID0gMCwgY2hlY2tzdW0gPSAwOworCXZvaWQgX19pb21lbSAqYXZfYmFzZSA9IGhkbWlfYXZfYmFzZShpcF9kYXRhKTsKKworCXN1bSArPSAweDgyICsgMHgwMDIgKyAweDAwRDsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX1RZUEUsIDB4MDgyKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX1ZFUlMsIDB4MDAyKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0xFTiwgMHgwMEQpOworCisJdmFsID0gKGluZm9fYXZpLmRiMV9mb3JtYXQgPDwgNSkgfAorCQkoaW5mb19hdmkuZGIxX2FjdGl2ZV9pbmZvIDw8IDQpIHwKKwkJKGluZm9fYXZpLmRiMV9iYXJfaW5mb19kdiA8PCAyKSB8CisJCShpbmZvX2F2aS5kYjFfc2Nhbl9pbmZvKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDApLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoaW5mb19hdmkuZGIyX2NvbG9yaW1ldHJ5IDw8IDYpIHwKKwkJKGluZm9fYXZpLmRiMl9hc3BlY3RfcmF0aW8gPDwgNCkgfAorCQkoaW5mb19hdmkuZGIyX2FjdGl2ZV9mbXRfYXIpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMSksIHZhbCk7CisJc3VtICs9IHZhbDsKKworCXZhbCA9IChpbmZvX2F2aS5kYjNfaXRjIDw8IDcpIHwKKwkJKGluZm9fYXZpLmRiM19lYyA8PCA0KSB8CisJCShpbmZvX2F2aS5kYjNfcV9yYW5nZSA8PCAyKSB8CisJCShpbmZvX2F2aS5kYjNfbnVwX3NjYWxpbmcpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMiksIHZhbCk7CisJc3VtICs9IHZhbDsKKworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMyksCisJCQkJCWluZm9fYXZpLmRiNF92aWRlb2NvZGUpOworCXN1bSArPSBpbmZvX2F2aS5kYjRfdmlkZW9jb2RlOworCisJdmFsID0gaW5mb19hdmkuZGI1X3BpeGVsX3JlcGVhdDsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDQpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSBpbmZvX2F2aS5kYjZfN19saW5lX2VvZnRvcCAmIDB4MDBGRjsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDUpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoKGluZm9fYXZpLmRiNl83X2xpbmVfZW9mdG9wID4+IDgpICYgMHgwMEZGKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDYpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSBpbmZvX2F2aS5kYjhfOV9saW5lX3NvZmJvdHRvbSAmIDB4MDBGRjsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDcpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoKGluZm9fYXZpLmRiOF85X2xpbmVfc29mYm90dG9tID4+IDgpICYgMHgwMEZGKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDgpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSBpbmZvX2F2aS5kYjEwXzExX3BpeGVsX2VvZmxlZnQgJiAweDAwRkY7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FWSV9EQllURSg5KSwgdmFsKTsKKwlzdW0gKz0gdmFsOworCisJdmFsID0gKChpbmZvX2F2aS5kYjEwXzExX3BpeGVsX2VvZmxlZnQgPj4gOCkgJiAweDAwRkYpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMTApLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSBpbmZvX2F2aS5kYjEyXzEzX3BpeGVsX3NvZnJpZ2h0ICYgMHgwMEZGOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMTEpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoKGluZm9fYXZpLmRiMTJfMTNfcGl4ZWxfc29mcmlnaHQgPj4gOCkgJiAweDAwRkYpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMTIpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwljaGVja3N1bSA9IDB4MTAwIC0gc3VtOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfQ0hTVU0sIGNoZWNrc3VtKTsKK30KKworc3RhdGljIHZvaWQgaGRtaV9jb3JlX2F2X3BhY2tldF9jb25maWcoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwKKwkJc3RydWN0IGhkbWlfY29yZV9wYWNrZXRfZW5hYmxlX3JlcGVhdCByZXBlYXRfY2ZnKQoreworCS8qIGVuYWJsZS9yZXBlYXQgdGhlIGluZm9mcmFtZSAqLworCWhkbWlfd3JpdGVfcmVnKGhkbWlfYXZfYmFzZShpcF9kYXRhKSwgSERNSV9DT1JFX0FWX1BCX0NUUkwxLAorCQkocmVwZWF0X2NmZy5hdWRpb19wa3QgPDwgNSkgfAorCQkocmVwZWF0X2NmZy5hdWRpb19wa3RfcmVwZWF0IDw8IDQpIHwKKwkJKHJlcGVhdF9jZmcuYXZpX2luZm9mcmFtZSA8PCAxKSB8CisJCShyZXBlYXRfY2ZnLmF2aV9pbmZvZnJhbWVfcmVwZWF0KSk7CisKKwkvKiBlbmFibGUvcmVwZWF0IHRoZSBwYWNrZXQgKi8KKwloZG1pX3dyaXRlX3JlZyhoZG1pX2F2X2Jhc2UoaXBfZGF0YSksIEhETUlfQ09SRV9BVl9QQl9DVFJMMiwKKwkJKHJlcGVhdF9jZmcuZ2VuX2NudHJsX3BrdCA8PCAzKSB8CisJCShyZXBlYXRfY2ZnLmdlbl9jbnRybF9wa3RfcmVwZWF0IDw8IDIpIHwKKwkJKHJlcGVhdF9jZmcuZ2VuZXJpY19wa3QgPDwgMSkgfAorCQkocmVwZWF0X2NmZy5nZW5lcmljX3BrdF9yZXBlYXQpKTsKK30KKworc3RhdGljIHZvaWQgaGRtaV93cF9pbml0KHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MsCisJCQlzdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgKnZpZGVvX2ZtdCwKKwkJCXN0cnVjdCBoZG1pX3ZpZGVvX2ludGVyZmFjZSAqdmlkZW9faW50KQoreworCXByX2RlYnVnKCJFbnRlciBoZG1pX3dwX2luaXRcbiIpOworCisJdGltaW5ncy0+aGJwID0gMDsKKwl0aW1pbmdzLT5oZnAgPSAwOworCXRpbWluZ3MtPmhzdyA9IDA7CisJdGltaW5ncy0+dmJwID0gMDsKKwl0aW1pbmdzLT52ZnAgPSAwOworCXRpbWluZ3MtPnZzdyA9IDA7CisKKwl2aWRlb19mbXQtPnBhY2tpbmdfbW9kZSA9IEhETUlfUEFDS18xMGJfUkdCX1lVVjQ0NDsKKwl2aWRlb19mbXQtPnlfcmVzID0gMDsKKwl2aWRlb19mbXQtPnhfcmVzID0gMDsKKworCXZpZGVvX2ludC0+dnNwID0gMDsKKwl2aWRlb19pbnQtPmhzcCA9IDA7CisKKwl2aWRlb19pbnQtPmludGVybGFjaW5nID0gMDsKKwl2aWRlb19pbnQtPnRtID0gMDsgLyogSERNSV9USU1JTkdfU0xBVkUgKi8KKworfQorCit2b2lkIHRpX2hkbWlfNHh4eF93cF92aWRlb19zdGFydChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBib29sIHN0YXJ0KQoreworCVJFR19GTERfTU9EKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9WSURFT19DRkcsIHN0YXJ0LCAzMSwgMzEpOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3dwX3ZpZGVvX2luaXRfZm9ybWF0KHN0cnVjdCBoZG1pX3ZpZGVvX2Zvcm1hdCAqdmlkZW9fZm10LAorCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MsIHN0cnVjdCBoZG1pX2NvbmZpZyAqcGFyYW0pCit7CisJcHJfZGVidWcoIkVudGVyIGhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXRcbiIpOworCisJdmlkZW9fZm10LT55X3JlcyA9IHBhcmFtLT50aW1pbmdzLnRpbWluZ3MueV9yZXM7CisJdmlkZW9fZm10LT54X3JlcyA9IHBhcmFtLT50aW1pbmdzLnRpbWluZ3MueF9yZXM7CisKKwl0aW1pbmdzLT5oYnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhicDsKKwl0aW1pbmdzLT5oZnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhmcDsKKwl0aW1pbmdzLT5oc3cgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhzdzsKKwl0aW1pbmdzLT52YnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZicDsKKwl0aW1pbmdzLT52ZnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZmcDsKKwl0aW1pbmdzLT52c3cgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZzdzsKK30KKworc3RhdGljIHZvaWQgaGRtaV93cF92aWRlb19jb25maWdfZm9ybWF0KHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCXN0cnVjdCBoZG1pX3ZpZGVvX2Zvcm1hdCAqdmlkZW9fZm10KQoreworCXUzMiBsID0gMDsKKworCVJFR19GTERfTU9EKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9WSURFT19DRkcsCisJCQl2aWRlb19mbXQtPnBhY2tpbmdfbW9kZSwgMTAsIDgpOworCisJbCB8PSBGTERfVkFMKHZpZGVvX2ZtdC0+eV9yZXMsIDMxLCAxNik7CisJbCB8PSBGTERfVkFMKHZpZGVvX2ZtdC0+eF9yZXMsIDE1LCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfVklERU9fU0laRSwgbCk7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9fY29uZmlnX2ludGVyZmFjZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQlzdHJ1Y3QgaGRtaV92aWRlb19pbnRlcmZhY2UgKnZpZGVvX2ludCkKK3sKKwl1MzIgcjsKKwlwcl9kZWJ1ZygiRW50ZXIgaGRtaV93cF92aWRlb19jb25maWdfaW50ZXJmYWNlXG4iKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9WSURFT19DRkcpOworCXIgPSBGTERfTU9EKHIsIHZpZGVvX2ludC0+dnNwLCA3LCA3KTsKKwlyID0gRkxEX01PRChyLCB2aWRlb19pbnQtPmhzcCwgNiwgNik7CisJciA9IEZMRF9NT0QociwgdmlkZW9faW50LT5pbnRlcmxhY2luZywgMywgMyk7CisJciA9IEZMRF9NT0QociwgdmlkZW9faW50LT50bSwgMSwgMCk7CisJaGRtaV93cml0ZV9yZWcoaGRtaV93cF9iYXNlKGlwX2RhdGEpLCBIRE1JX1dQX1ZJREVPX0NGRywgcik7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9fY29uZmlnX3RpbWluZyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCXUzMiB0aW1pbmdfaCA9IDA7CisJdTMyIHRpbWluZ192ID0gMDsKKworCXByX2RlYnVnKCJFbnRlciBoZG1pX3dwX3ZpZGVvX2NvbmZpZ190aW1pbmdcbiIpOworCisJdGltaW5nX2ggfD0gRkxEX1ZBTCh0aW1pbmdzLT5oYnAsIDMxLCAyMCk7CisJdGltaW5nX2ggfD0gRkxEX1ZBTCh0aW1pbmdzLT5oZnAsIDE5LCA4KTsKKwl0aW1pbmdfaCB8PSBGTERfVkFMKHRpbWluZ3MtPmhzdywgNywgMCk7CisJaGRtaV93cml0ZV9yZWcoaGRtaV93cF9iYXNlKGlwX2RhdGEpLCBIRE1JX1dQX1ZJREVPX1RJTUlOR19ILCB0aW1pbmdfaCk7CisKKwl0aW1pbmdfdiB8PSBGTERfVkFMKHRpbWluZ3MtPnZicCwgMzEsIDIwKTsKKwl0aW1pbmdfdiB8PSBGTERfVkFMKHRpbWluZ3MtPnZmcCwgMTksIDgpOworCXRpbWluZ192IHw9IEZMRF9WQUwodGltaW5ncy0+dnN3LCA3LCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfVklERU9fVElNSU5HX1YsIHRpbWluZ192KTsKK30KKwordm9pZCB0aV9oZG1pXzR4eHhfYmFzaWNfY29uZmlndXJlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJLyogSERNSSAqLworCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdmlkZW9fdGltaW5nOworCXN0cnVjdCBoZG1pX3ZpZGVvX2Zvcm1hdCB2aWRlb19mb3JtYXQ7CisJc3RydWN0IGhkbWlfdmlkZW9faW50ZXJmYWNlIHZpZGVvX2ludGVyZmFjZTsKKwkvKiBIRE1JIGNvcmUgKi8KKwlzdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdmkgYXZpX2NmZzsKKwlzdHJ1Y3QgaGRtaV9jb3JlX3ZpZGVvX2NvbmZpZyB2X2NvcmVfY2ZnOworCXN0cnVjdCBoZG1pX2NvcmVfcGFja2V0X2VuYWJsZV9yZXBlYXQgcmVwZWF0X2NmZzsKKwlzdHJ1Y3QgaGRtaV9jb25maWcgKmNmZyA9ICZpcF9kYXRhLT5jZmc7CisKKwloZG1pX3dwX2luaXQoJnZpZGVvX3RpbWluZywgJnZpZGVvX2Zvcm1hdCwKKwkJJnZpZGVvX2ludGVyZmFjZSk7CisKKwloZG1pX2NvcmVfaW5pdCgmdl9jb3JlX2NmZywKKwkJJmF2aV9jZmcsCisJCSZyZXBlYXRfY2ZnKTsKKworCWhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXQoJnZpZGVvX2Zvcm1hdCwgJnZpZGVvX3RpbWluZywgY2ZnKTsKKworCWhkbWlfd3BfdmlkZW9fY29uZmlnX3RpbWluZyhpcF9kYXRhLCAmdmlkZW9fdGltaW5nKTsKKworCS8qIHZpZGVvIGNvbmZpZyAqLworCXZpZGVvX2Zvcm1hdC5wYWNraW5nX21vZGUgPSBIRE1JX1BBQ0tfMjRiX1JHQl9ZVVY0NDRfWVVWNDIyOworCisJaGRtaV93cF92aWRlb19jb25maWdfZm9ybWF0KGlwX2RhdGEsICZ2aWRlb19mb3JtYXQpOworCisJdmlkZW9faW50ZXJmYWNlLnZzcCA9IGNmZy0+dGltaW5ncy52c3luY19wb2w7CisJdmlkZW9faW50ZXJmYWNlLmhzcCA9IGNmZy0+dGltaW5ncy5oc3luY19wb2w7CisJdmlkZW9faW50ZXJmYWNlLmludGVybGFjaW5nID0gY2ZnLT5pbnRlcmxhY2U7CisJdmlkZW9faW50ZXJmYWNlLnRtID0gMSA7IC8qIEhETUlfVElNSU5HX01BU1RFUl8yNEJJVCAqLworCisJaGRtaV93cF92aWRlb19jb25maWdfaW50ZXJmYWNlKGlwX2RhdGEsICZ2aWRlb19pbnRlcmZhY2UpOworCisJLyoKKwkgKiBjb25maWd1cmUgY29yZSB2aWRlbyBwYXJ0CisJICogc2V0IHNvZnR3YXJlIHJlc2V0IGluIHRoZSBjb3JlCisJICovCisJaGRtaV9jb3JlX3N3cmVzZXRfYXNzZXJ0KGlwX2RhdGEpOworCisJLyogcG93ZXIgZG93biBvZmYgKi8KKwloZG1pX2NvcmVfcG93ZXJkb3duX2Rpc2FibGUoaXBfZGF0YSk7CisKKwl2X2NvcmVfY2ZnLnBrdF9tb2RlID0gSERNSV9QQUNLRVRNT0RFMjRCSVRQRVJQSVhFTDsKKwl2X2NvcmVfY2ZnLmhkbWlfZHZpID0gY2ZnLT5jbS5tb2RlOworCisJaGRtaV9jb3JlX3ZpZGVvX2NvbmZpZyhpcF9kYXRhLCAmdl9jb3JlX2NmZyk7CisKKwkvKiByZWxlYXNlIHNvZnR3YXJlIHJlc2V0IGluIHRoZSBjb3JlICovCisJaGRtaV9jb3JlX3N3cmVzZXRfcmVsZWFzZShpcF9kYXRhKTsKKworCS8qCisJICogY29uZmlndXJlIHBhY2tldAorCSAqIGluZm8gZnJhbWUgdmlkZW8gc2VlIGRvYyBDRUE4NjEtRCBwYWdlIDY1CisJICovCisJYXZpX2NmZy5kYjFfZm9ybWF0ID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMVlfUkdCOworCWF2aV9jZmcuZGIxX2FjdGl2ZV9pbmZvID0KKwkJSERNSV9JTkZPRlJBTUVfQVZJX0RCMUFfQUNUSVZFX0ZPUk1BVF9PRkY7CisJYXZpX2NmZy5kYjFfYmFyX2luZm9fZHYgPSBIRE1JX0lORk9GUkFNRV9BVklfREIxQl9OTzsKKwlhdmlfY2ZnLmRiMV9zY2FuX2luZm8gPSBIRE1JX0lORk9GUkFNRV9BVklfREIxU18wOworCWF2aV9jZmcuZGIyX2NvbG9yaW1ldHJ5ID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMkNfTk87CisJYXZpX2NmZy5kYjJfYXNwZWN0X3JhdGlvID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMk1fTk87CisJYXZpX2NmZy5kYjJfYWN0aXZlX2ZtdF9hciA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjJSX1NBTUU7CisJYXZpX2NmZy5kYjNfaXRjID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCM0lUQ19OTzsKKwlhdmlfY2ZnLmRiM19lYyA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjNFQ19YVllVVjYwMTsKKwlhdmlfY2ZnLmRiM19xX3JhbmdlID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCM1FfREVGQVVMVDsKKwlhdmlfY2ZnLmRiM19udXBfc2NhbGluZyA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjNTQ19OTzsKKwlhdmlfY2ZnLmRiNF92aWRlb2NvZGUgPSBjZmctPmNtLmNvZGU7CisJYXZpX2NmZy5kYjVfcGl4ZWxfcmVwZWF0ID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSX05POworCWF2aV9jZmcuZGI2XzdfbGluZV9lb2Z0b3AgPSAwOworCWF2aV9jZmcuZGI4XzlfbGluZV9zb2Zib3R0b20gPSAwOworCWF2aV9jZmcuZGIxMF8xMV9waXhlbF9lb2ZsZWZ0ID0gMDsKKwlhdmlfY2ZnLmRiMTJfMTNfcGl4ZWxfc29mcmlnaHQgPSAwOworCisJaGRtaV9jb3JlX2F1eF9pbmZvZnJhbWVfYXZpX2NvbmZpZyhpcF9kYXRhLCBhdmlfY2ZnKTsKKworCS8qIGVuYWJsZS9yZXBlYXQgdGhlIGluZm9mcmFtZSAqLworCXJlcGVhdF9jZmcuYXZpX2luZm9mcmFtZSA9IEhETUlfUEFDS0VURU5BQkxFOworCXJlcGVhdF9jZmcuYXZpX2luZm9mcmFtZV9yZXBlYXQgPSBIRE1JX1BBQ0tFVFJFUEVBVE9OOworCS8qIHdha2V1cCAqLworCXJlcGVhdF9jZmcuYXVkaW9fcGt0ID0gSERNSV9QQUNLRVRFTkFCTEU7CisJcmVwZWF0X2NmZy5hdWRpb19wa3RfcmVwZWF0ID0gSERNSV9QQUNLRVRSRVBFQVRPTjsKKwloZG1pX2NvcmVfYXZfcGFja2V0X2NvbmZpZyhpcF9kYXRhLCByZXBlYXRfY2ZnKTsKK30KKwordm9pZCB0aV9oZG1pXzR4eHhfd3BfZHVtcChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsXAorCQloZG1pX3JlYWRfcmVnKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgcikpCisKKwlEVU1QUkVHKEhETUlfV1BfUkVWSVNJT04pOworCURVTVBSRUcoSERNSV9XUF9TWVNDT05GSUcpOworCURVTVBSRUcoSERNSV9XUF9JUlFTVEFUVVNfUkFXKTsKKwlEVU1QUkVHKEhETUlfV1BfSVJRU1RBVFVTKTsKKwlEVU1QUkVHKEhETUlfV1BfUFdSX0NUUkwpOworCURVTVBSRUcoSERNSV9XUF9JUlFFTkFCTEVfU0VUKTsKKwlEVU1QUkVHKEhETUlfV1BfVklERU9fQ0ZHKTsKKwlEVU1QUkVHKEhETUlfV1BfVklERU9fU0laRSk7CisJRFVNUFJFRyhIRE1JX1dQX1ZJREVPX1RJTUlOR19IKTsKKwlEVU1QUkVHKEhETUlfV1BfVklERU9fVElNSU5HX1YpOworCURVTVBSRUcoSERNSV9XUF9XUF9DTEspOworCURVTVBSRUcoSERNSV9XUF9BVURJT19DRkcpOworCURVTVBSRUcoSERNSV9XUF9BVURJT19DRkcyKTsKKwlEVU1QUkVHKEhETUlfV1BfQVVESU9fQ1RSTCk7CisJRFVNUFJFRyhIRE1JX1dQX0FVRElPX0RBVEEpOworfQorCit2b2lkIHRpX2hkbWlfNHh4eF9wbGxfZHVtcChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisjZGVmaW5lIERVTVBQTEwocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsXAorCQloZG1pX3JlYWRfcmVnKGhkbWlfcGxsX2Jhc2UoaXBfZGF0YSksIHIpKQorCisJRFVNUFBMTChQTExDVFJMX1BMTF9DT05UUk9MKTsKKwlEVU1QUExMKFBMTENUUkxfUExMX1NUQVRVUyk7CisJRFVNUFBMTChQTExDVFJMX1BMTF9HTyk7CisJRFVNUFBMTChQTExDVFJMX0NGRzEpOworCURVTVBQTEwoUExMQ1RSTF9DRkcyKTsKKwlEVU1QUExMKFBMTENUUkxfQ0ZHMyk7CisJRFVNUFBMTChQTExDVFJMX0NGRzQpOworfQorCit2b2lkIHRpX2hkbWlfNHh4eF9jb3JlX2R1bXAoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKQoreworCWludCBpOworCisjZGVmaW5lIENPUkVfUkVHKGksIG5hbWUpIG5hbWUoaSkKKyNkZWZpbmUgRFVNUENPUkUocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsXAorCQloZG1pX3JlYWRfcmVnKGhkbWlfcGxsX2Jhc2UoaXBfZGF0YSksIHIpKQorI2RlZmluZSBEVU1QQ09SRUFWKGksIHIpIHNlcV9wcmludGYocywgIiVzWyVkXSUqcyAlMDh4XG4iLCAjciwgaSwgXAorCQkoaSA8IDEwKSA/IDMyIC0gc3RybGVuKCNyKSA6IDMxIC0gc3RybGVuKCNyKSwgIiAiLCBcCisJCWhkbWlfcmVhZF9yZWcoaGRtaV9wbGxfYmFzZShpcF9kYXRhKSwgQ09SRV9SRUcoaSwgcikpKQorCisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19WTkRfSURMKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0RFVl9JREwpOworCURVTVBDT1JFKEhETUlfQ09SRV9TWVNfREVWX0lESCk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19ERVZfUkVWKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX1NSU1QpOworCURVTVBDT1JFKEhETUlfQ09SRV9DVFJMMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19TWVNfU1RBVCk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19WSURfQUNFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19WSURfTU9ERSk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19JTlRSX1NUQVRFKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0lOVFIxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0lOVFIyKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0lOVFIzKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0lOVFI0KTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX1VNQVNLMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19UTURTX0NUUkwpOworCURVTVBDT1JFKEhETUlfQ09SRV9TWVNfREVfRExZKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0RFX0NUUkwpOworCURVTVBDT1JFKEhETUlfQ09SRV9TWVNfREVfVE9QKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0RFX0NOVEwpOworCURVTVBDT1JFKEhETUlfQ09SRV9TWVNfREVfQ05USCk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19ERV9MSU5MKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0RFX0xJTkhfMSk7CisKKwlEVU1QQ09SRShIRE1JX0NPUkVfRERDX0NNRCk7CisJRFVNUENPUkUoSERNSV9DT1JFX0REQ19TVEFUVVMpOworCURVTVBDT1JFKEhETUlfQ09SRV9ERENfQUREUik7CisJRFVNUENPUkUoSERNSV9DT1JFX0REQ19PRkZTRVQpOworCURVTVBDT1JFKEhETUlfQ09SRV9ERENfQ09VTlQxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfRERDX0NPVU5UMik7CisJRFVNUENPUkUoSERNSV9DT1JFX0REQ19EQVRBKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfRERDX1NFR00pOworCisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0RQRCk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1BCX0NUUkwxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfUEJfQ1RSTDIpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVklfVFlQRSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FWSV9WRVJTKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVZJX0xFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FWSV9DSFNVTSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSERNSV9DT1JFX0FWX0FWSV9EQllURV9ORUxFTVM7IGkrKykKKwkJRFVNUENPUkVBVihpLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKTsKKworCWZvciAoaSA9IDA7IGkgPCBIRE1JX0NPUkVfQVZfU1BEX0RCWVRFX05FTEVNUzsgaSsrKQorCQlEVU1QQ09SRUFWKGksIEhETUlfQ09SRV9BVl9TUERfREJZVEUpOworCisJZm9yIChpID0gMDsgaSA8IEhETUlfQ09SRV9BVl9BVURfREJZVEVfTkVMRU1TOyBpKyspCisJCURVTVBDT1JFQVYoaSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSERNSV9DT1JFX0FWX01QRUdfREJZVEVfTkVMRU1TOyBpKyspCisJCURVTVBDT1JFQVYoaSwgSERNSV9DT1JFX0FWX01QRUdfREJZVEUpOworCisJZm9yIChpID0gMDsgaSA8IEhETUlfQ09SRV9BVl9HRU5fREJZVEVfTkVMRU1TOyBpKyspCisJCURVTVBDT1JFQVYoaSwgSERNSV9DT1JFX0FWX0dFTl9EQllURSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSERNSV9DT1JFX0FWX0dFTjJfREJZVEVfTkVMRU1TOyBpKyspCisJCURVTVBDT1JFQVYoaSwgSERNSV9DT1JFX0FWX0dFTjJfREJZVEUpOworCisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FDUl9DVFJMKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfRlJFUV9TVkFMKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfTl9TVkFMMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX05fU1ZBTDIpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9OX1NWQUwzKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX1NWQUwxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX1NWQUwyKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX1NWQUwzKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX0hWQUwxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX0hWQUwyKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX0hWQUwzKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVVEX01PREUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9TUERJRl9DVFJMKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfSFdfU1BESUZfRlMpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9TV0FQX0kyUyk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1NQRElGX0VSVEgpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfSU5fTUFQKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfSTJTX0lOX0NUUkwpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDApOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDEpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDIpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDQpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BU1JDKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfSTJTX0lOX0xFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FVRE9fVFhTVEFUKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FVRF9QQVJfQlVTQ0xLXzIpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18zKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfVEVTVF9UWENUUkwpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9EUEQpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9QQl9DVFJMMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1BCX0NUUkwyKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVZJX1RZUEUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVklfVkVSUyk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FWSV9MRU4pOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVklfQ0hTVU0pOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9TUERfVFlQRSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1NQRF9WRVJTKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfU1BEX0xFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1NQRF9DSFNVTSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FVRElPX1RZUEUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVURJT19WRVJTKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVVESU9fTEVOKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVVESU9fQ0hTVU0pOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9NUEVHX1RZUEUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9NUEVHX1ZFUlMpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9NUEVHX0xFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX01QRUdfQ0hTVU0pOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9DUF9CWVRFMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0NFQ19BRERSX0lEKTsKK30KKwordm9pZCB0aV9oZG1pXzR4eHhfcGh5X2R1bXAoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKQoreworI2RlZmluZSBEVU1QUEhZKHIpIHNlcV9wcmludGYocywgIiUtMzVzICUwOHhcbiIsICNyLFwKKwkJaGRtaV9yZWFkX3JlZyhoZG1pX3BoeV9iYXNlKGlwX2RhdGEpLCByKSkKKworCURVTVBQSFkoSERNSV9UWFBIWV9UWF9DVFJMKTsKKwlEVU1QUEhZKEhETUlfVFhQSFlfRElHSVRBTF9DVFJMKTsKKwlEVU1QUEhZKEhETUlfVFhQSFlfUE9XRVJfQ1RSTCk7CisJRFVNUFBIWShIRE1JX1RYUEhZX1BBRF9DRkdfQ1RSTCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSSkgfHwgXAorCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JX01PRFVMRSkKK3ZvaWQgaGRtaV93cF9hdWRpb19jb25maWdfZm9ybWF0KHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCQkJCXN0cnVjdCBoZG1pX2F1ZGlvX2Zvcm1hdCAqYXVkX2ZtdCkKK3sKKwl1MzIgcjsKKworCURTU0RCRygiRW50ZXIgaGRtaV93cF9hdWRpb19jb25maWdfZm9ybWF0XG4iKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9BVURJT19DRkcpOworCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnN0ZXJlb19jaGFubmVscywgMjYsIDI0KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT5hY3RpdmVfY2hubmxzX21zaywgMjMsIDE2KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT5lbl9zaWdfYmxrX3N0cnRfZW5kLCA1LCA1KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT50eXBlLCA0LCA0KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT5qdXN0aWZpY2F0aW9uLCAzLCAzKTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT5zYW1wbGVfb3JkZXIsIDIsIDIpOworCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnNhbXBsZXNfcGVyX3dvcmQsIDEsIDEpOworCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnNhbXBsZV9zaXplLCAwLCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfQVVESU9fQ0ZHLCByKTsKK30KKwordm9pZCBoZG1pX3dwX2F1ZGlvX2NvbmZpZ19kbWEoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwKKwkJCQkJc3RydWN0IGhkbWlfYXVkaW9fZG1hICphdWRfZG1hKQoreworCXUzMiByOworCisJRFNTREJHKCJFbnRlciBoZG1pX3dwX2F1ZGlvX2NvbmZpZ19kbWFcbiIpOworCisJciA9IGhkbWlfcmVhZF9yZWcoaGRtaV93cF9iYXNlKGlwX2RhdGEpLCBIRE1JX1dQX0FVRElPX0NGRzIpOworCXIgPSBGTERfTU9EKHIsIGF1ZF9kbWEtPnRyYW5zZmVyX3NpemUsIDE1LCA4KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZG1hLT5ibG9ja19zaXplLCA3LCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfQVVESU9fQ0ZHMiwgcik7CisKKwlyID0gaGRtaV9yZWFkX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfQVVESU9fQ1RSTCk7CisJciA9IEZMRF9NT0QociwgYXVkX2RtYS0+bW9kZSwgOSwgOSk7CisJciA9IEZMRF9NT0QociwgYXVkX2RtYS0+Zmlmb190aHJlc2hvbGQsIDgsIDApOworCWhkbWlfd3JpdGVfcmVnKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9BVURJT19DVFJMLCByKTsKK30KKwordm9pZCBoZG1pX2NvcmVfYXVkaW9fY29uZmlnKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCQkJCXN0cnVjdCBoZG1pX2NvcmVfYXVkaW9fY29uZmlnICpjZmcpCit7CisJdTMyIHI7CisJdm9pZCBfX2lvbWVtICphdl9iYXNlID0gaGRtaV9hdl9iYXNlKGlwX2RhdGEpOworCisJLyogYXVkaW8gY2xvY2sgcmVjb3ZlcnkgcGFyYW1ldGVycyAqLworCXIgPSBoZG1pX3JlYWRfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BQ1JfQ1RSTCk7CisJciA9IEZMRF9NT0QociwgY2ZnLT51c2VfbWNsaywgMiwgMik7CisJciA9IEZMRF9NT0QociwgY2ZnLT5lbl9hY3JfcGt0LCAxLCAxKTsKKwlyID0gRkxEX01PRChyLCBjZmctPmN0c19tb2RlLCAwLCAwKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQUNSX0NUUkwsIHIpOworCisJUkVHX0ZMRF9NT0QoYXZfYmFzZSwgSERNSV9DT1JFX0FWX05fU1ZBTDEsIGNmZy0+biwgNywgMCk7CisJUkVHX0ZMRF9NT0QoYXZfYmFzZSwgSERNSV9DT1JFX0FWX05fU1ZBTDIsIGNmZy0+biA+PiA4LCA3LCAwKTsKKwlSRUdfRkxEX01PRChhdl9iYXNlLCBIRE1JX0NPUkVfQVZfTl9TVkFMMywgY2ZnLT5uID4+IDE2LCA3LCAwKTsKKworCWlmIChjZmctPmN0c19tb2RlID09IEhETUlfQVVESU9fQ1RTX01PREVfU1cpIHsKKwkJUkVHX0ZMRF9NT0QoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0NUU19TVkFMMSwgY2ZnLT5jdHMsIDcsIDApOworCQlSRUdfRkxEX01PRChhdl9iYXNlLAorCQkJCUhETUlfQ09SRV9BVl9DVFNfU1ZBTDIsIGNmZy0+Y3RzID4+IDgsIDcsIDApOworCQlSRUdfRkxEX01PRChhdl9iYXNlLAorCQkJCUhETUlfQ09SRV9BVl9DVFNfU1ZBTDMsIGNmZy0+Y3RzID4+IDE2LCA3LCAwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBIRE1JIElQIHVzZXMgdGhpcyBjb25maWd1cmF0aW9uIHRvIGRpdmlkZSB0aGUgTUNMSyB0bworCQkgKiB1cGRhdGUgQ1RTIHZhbHVlLgorCQkgKi8KKwkJUkVHX0ZMRF9NT0QoYXZfYmFzZSwKKwkJCQlIRE1JX0NPUkVfQVZfRlJFUV9TVkFMLCBjZmctPm1jbGtfbW9kZSwgMiwgMCk7CisKKwkJLyogQ29uZmlndXJlIGNsb2NrIGZvciBhdWRpbyBwYWNrZXRzICovCisJCVJFR19GTERfTU9EKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18xLAorCQkJCWNmZy0+YXVkX3Bhcl9idXNjbGssIDcsIDApOworCQlSRUdfRkxEX01PRChhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMiwKKwkJCQkoY2ZnLT5hdWRfcGFyX2J1c2NsayA+PiA4KSwgNywgMCk7CisJCVJFR19GTERfTU9EKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18zLAorCQkJCShjZmctPmF1ZF9wYXJfYnVzY2xrID4+IDE2KSwgNywgMCk7CisJfQorCisJLyogT3ZlcnJpZGUgb2YgU1BESUYgc2FtcGxlIGZyZXF1ZW5jeSB3aXRoIHZhbHVlIGluIEkyU19DSFNUNCAqLworCVJFR19GTERfTU9EKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9TUERJRl9DVFJMLAorCQkJCQkJY2ZnLT5mc19vdmVycmlkZSwgMSwgMSk7CisKKwkvKiBJMlMgcGFyYW1ldGVycyAqLworCVJFR19GTERfTU9EKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9JMlNfQ0hTVDQsCisJCQkJCQljZmctPmZyZXFfc2FtcGxlLCAzLCAwKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9JMlNfSU5fQ1RSTCk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmVuX2hpZ2hfYml0cmF0ZV9hdWQsIDcsIDcpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5zY2tfZWRnZV9tb2RlLCA2LCA2KTsKKwlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcuY2JpdF9vcmRlciwgNSwgNSk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLnZiaXQsIDQsIDQpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy53c19wb2xhcml0eSwgMywgMyk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmp1c3RpZmljYXRpb24sIDIsIDIpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5kaXJlY3Rpb24sIDEsIDEpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5zaGlmdCwgMCwgMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0kyU19JTl9DVFJMLCByKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9JMlNfQ0hTVDUpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+ZnJlcV9zYW1wbGUsIDcsIDQpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy53b3JkX2xlbmd0aCwgMywgMSk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLndvcmRfbWF4X2xlbmd0aCwgMCwgMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0kyU19DSFNUNSwgcik7CisKKwlSRUdfRkxEX01PRChhdl9iYXNlLCBIRE1JX0NPUkVfQVZfSTJTX0lOX0xFTiwKKwkJCWNmZy0+aTJzX2NmZy5pbl9sZW5ndGhfYml0cywgMywgMCk7CisKKwkvKiBBdWRpbyBjaGFubmVscyBhbmQgbW9kZSBwYXJhbWV0ZXJzICovCisJUkVHX0ZMRF9NT0QoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0hETUlfQ1RSTCwgY2ZnLT5sYXlvdXQsIDIsIDEpOworCXIgPSBoZG1pX3JlYWRfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVURfTU9ERSk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmFjdGl2ZV9zZHMsIDcsIDQpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+ZW5fZHNkX2F1ZGlvLCAzLCAzKTsKKwlyID0gRkxEX01PRChyLCBjZmctPmVuX3BhcmFsbGVsX2F1ZF9pbnB1dCwgMiwgMik7CisJciA9IEZMRF9NT0QociwgY2ZnLT5lbl9zcGRpZiwgMSwgMSk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9NT0RFLCByKTsKK30KKwordm9pZCBoZG1pX2NvcmVfYXVkaW9faW5mb2ZyYW1lX2NvbmZpZyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQlzdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdWRpbyAqaW5mb19hdWQpCit7CisJdTggdmFsOworCXU4IHN1bSA9IDAsIGNoZWNrc3VtID0gMDsKKwl2b2lkIF9faW9tZW0gKmF2X2Jhc2UgPSBoZG1pX2F2X2Jhc2UoaXBfZGF0YSk7CisKKwkvKgorCSAqIFNldCBhdWRpbyBpbmZvIGZyYW1lIHR5cGUsIHZlcnNpb24gYW5kIGxlbmd0aCBhcworCSAqIGRlc2NyaWJlZCBpbiBIRE1JIDEuNGEgU2VjdGlvbiA4LjIuMiBzcGVjaWZpY2F0aW9uLgorCSAqIENoZWNrc3VtIGNhbGN1bGF0aW9uIGlzIGRlZmluZWQgaW4gU2VjdGlvbiA1LjMuNS4KKwkgKi8KKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVVESU9fVFlQRSwgMHg4NCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRElPX1ZFUlMsIDB4MDEpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVURJT19MRU4sIDB4MGEpOworCXN1bSArPSAweDg0ICsgMHgwMDEgKyAweDAwYTsKKworCXZhbCA9IChpbmZvX2F1ZC0+ZGIxX2NvZGluZ190eXBlIDw8IDQpCisJCQl8IChpbmZvX2F1ZC0+ZGIxX2NoYW5uZWxfY291bnQgLSAxKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVVEX0RCWVRFKDApLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoaW5mb19hdWQtPmRiMl9zYW1wbGVfZnJlcSA8PCAyKSB8IGluZm9fYXVkLT5kYjJfc2FtcGxlX3NpemU7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSgxKSwgdmFsKTsKKwlzdW0gKz0gdmFsOworCisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSgyKSwgMHgwMCk7CisKKwl2YWwgPSBpbmZvX2F1ZC0+ZGI0X2NoYW5uZWxfYWxsb2M7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSgzKSwgdmFsKTsKKwlzdW0gKz0gdmFsOworCisJdmFsID0gKGluZm9fYXVkLT5kYjVfZG93bm1peF9pbmggPDwgNykgfCAoaW5mb19hdWQtPmRiNV9sc3YgPDwgMyk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg0KSwgdmFsKTsKKwlzdW0gKz0gdmFsOworCisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg1KSwgMHgwMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg2KSwgMHgwMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg3KSwgMHgwMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg4KSwgMHgwMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg5KSwgMHgwMCk7CisKKwljaGVja3N1bSA9IDB4MTAwIC0gc3VtOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsCisJCQkJCUhETUlfQ09SRV9BVl9BVURJT19DSFNVTSwgY2hlY2tzdW0pOworCisJLyoKKwkgKiBUT0RPOiBBZGQgTVBFRyBhbmQgU1BEIGVuYWJsZSBhbmQgcmVwZWF0IGNmZyB3aGVuIEVESUQgcGFyc2luZworCSAqIGlzIGF2YWlsYWJsZS4KKwkgKi8KK30KKworaW50IGhkbWlfY29uZmlnX2F1ZGlvX2FjcihzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCXUzMiBzYW1wbGVfZnJlcSwgdTMyICpuLCB1MzIgKmN0cykKK3sKKwl1MzIgcjsKKwl1MzIgZGVlcF9jb2xvciA9IDA7CisJdTMyIHBjbGsgPSBpcF9kYXRhLT5jZmcudGltaW5ncy50aW1pbmdzLnBpeGVsX2Nsb2NrOworCisJaWYgKG4gPT0gTlVMTCB8fCBjdHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBPYnRhaW4gY3VycmVudCBkZWVwIGNvbG9yIGNvbmZpZ3VyYXRpb24uIFRoaXMgbmVlZGVkCisJICogdG8gY2FsY3VsYXRlIHRoZSBUTURTIGNsb2NrIGJhc2VkIG9uIHRoZSBwaXhlbCBjbG9jay4KKwkgKi8KKwlyID0gUkVHX0dFVChoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfVklERU9fQ0ZHLCAxLCAwKTsKKwlzd2l0Y2ggKHIpIHsKKwljYXNlIDE6IC8qIE5vIGRlZXAgY29sb3Igc2VsZWN0ZWQgKi8KKwkJZGVlcF9jb2xvciA9IDEwMDsKKwkJYnJlYWs7CisJY2FzZSAyOiAvKiAxMC1iaXQgZGVlcCBjb2xvciBzZWxlY3RlZCAqLworCQlkZWVwX2NvbG9yID0gMTI1OworCQlicmVhazsKKwljYXNlIDM6IC8qIDEyLWJpdCBkZWVwIGNvbG9yIHNlbGVjdGVkICovCisJCWRlZXBfY29sb3IgPSAxNTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc2FtcGxlX2ZyZXEpIHsKKwljYXNlIDMyMDAwOgorCQlpZiAoKGRlZXBfY29sb3IgPT0gMTI1KSAmJiAoKHBjbGsgPT0gNTQwNTQpCisJCQkJfHwgKHBjbGsgPT0gNzQyNTApKSkKKwkJCSpuID0gODE5MjsKKwkJZWxzZQorCQkJKm4gPSA0MDk2OworCQlicmVhazsKKwljYXNlIDQ0MTAwOgorCQkqbiA9IDYyNzI7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCWlmICgoZGVlcF9jb2xvciA9PSAxMjUpICYmICgocGNsayA9PSA1NDA1NCkKKwkJCQl8fCAocGNsayA9PSA3NDI1MCkpKQorCQkJKm4gPSA4MTkyOworCQllbHNlCisJCQkqbiA9IDYxNDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpuID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2FsY3VsYXRlIENUUy4gU2VlIEhETUkgMS4zYSBvciAxLjRhIHNwZWNpZmljYXRpb25zICovCisJKmN0cyA9IHBjbGsgKiAoKm4gLyAxMjgpICogZGVlcF9jb2xvciAvIChzYW1wbGVfZnJlcSAvIDEwKTsKKworCXJldHVybiAwOworfQorCitpbnQgaGRtaV9hdWRpb190cmlnZ2VyKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJaW50IGVyciA9IDA7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJUkVHX0ZMRF9NT0QoaGRtaV9hdl9iYXNlKGlwX2RhdGEpLAorCQkJCQlIRE1JX0NPUkVfQVZfQVVEX01PREUsIDEsIDAsIDApOworCQlSRUdfRkxEX01PRChoZG1pX3dwX2Jhc2UoaXBfZGF0YSksCisJCQkJCUhETUlfV1BfQVVESU9fQ1RSTCwgMSwgMzEsIDMxKTsKKwkJUkVHX0ZMRF9NT0QoaGRtaV93cF9iYXNlKGlwX2RhdGEpLAorCQkJCQlIRE1JX1dQX0FVRElPX0NUUkwsIDEsIDMwLCAzMCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCVJFR19GTERfTU9EKGhkbWlfYXZfYmFzZShpcF9kYXRhKSwKKwkJCQkJSERNSV9DT1JFX0FWX0FVRF9NT0RFLCAwLCAwLCAwKTsKKwkJUkVHX0ZMRF9NT0QoaGRtaV93cF9iYXNlKGlwX2RhdGEpLAorCQkJCQlIRE1JX1dQX0FVRElPX0NUUkwsIDAsIDMwLCAzMCk7CisJCVJFR19GTERfTU9EKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwKKwkJCQkJSERNSV9XUF9BVURJT19DVFJMLCAwLCAzMSwgMzEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy90aV9oZG1pXzR4eHhfaXAuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3RpX2hkbWlfNHh4eF9pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDA5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy90aV9oZG1pXzR4eHhfaXAuaApAQCAtMCwwICsxLDU5MyBAQAorLyoKKyAqIHRpX2hkbWlfNHh4eF9pcC5oCisgKgorICogSERNSSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IgRE04MXh4LCBETTM4eHgsIFRJIE9NQVA0IGV0YyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfSERNSV9USV80eHh4X0hfCisjZGVmaW5lIF9IRE1JX1RJXzR4eHhfSF8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KKyNpbmNsdWRlICJ0aV9oZG1pLmgiCisjaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUkpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSV9NT0RVTEUpCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2VuZGlmCisKKy8qIEhETUkgV3JhcHBlciAqLworCisjZGVmaW5lIEhETUlfV1BfUkVWSVNJT04JCQkweDAKKyNkZWZpbmUgSERNSV9XUF9TWVNDT05GSUcJCQkweDEwCisjZGVmaW5lIEhETUlfV1BfSVJRU1RBVFVTX1JBVwkJCTB4MjQKKyNkZWZpbmUgSERNSV9XUF9JUlFTVEFUVVMJCQkweDI4CisjZGVmaW5lIEhETUlfV1BfUFdSX0NUUkwJCQkweDQwCisjZGVmaW5lIEhETUlfV1BfSVJRRU5BQkxFX1NFVAkJCTB4MkMKKyNkZWZpbmUgSERNSV9XUF9WSURFT19DRkcJCQkweDUwCisjZGVmaW5lIEhETUlfV1BfVklERU9fU0laRQkJCTB4NjAKKyNkZWZpbmUgSERNSV9XUF9WSURFT19USU1JTkdfSAkJCTB4NjgKKyNkZWZpbmUgSERNSV9XUF9WSURFT19USU1JTkdfVgkJCTB4NkMKKyNkZWZpbmUgSERNSV9XUF9XUF9DTEsJCQkJMHg3MAorI2RlZmluZSBIRE1JX1dQX0FVRElPX0NGRwkJCTB4ODAKKyNkZWZpbmUgSERNSV9XUF9BVURJT19DRkcyCQkJMHg4NAorI2RlZmluZSBIRE1JX1dQX0FVRElPX0NUUkwJCQkweDg4CisjZGVmaW5lIEhETUlfV1BfQVVESU9fREFUQQkJCTB4OEMKKworLyogSERNSSBJUCBDb3JlIFN5c3RlbSAqLworCisjZGVmaW5lIEhETUlfQ09SRV9TWVNfVk5EX0lETAkJCTB4MAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFVl9JREwJCQkweDgKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19ERVZfSURICQkJMHhDCisjZGVmaW5lIEhETUlfQ09SRV9TWVNfREVWX1JFVgkJCTB4MTAKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19TUlNUCQkJMHgxNAorI2RlZmluZSBIRE1JX0NPUkVfQ1RSTDEJCQkJMHgyMAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX1NZU19TVEFUCQkJMHgyNAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX1ZJRF9BQ0VOCQkJMHgxMjQKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19WSURfTU9ERQkJCTB4MTI4CisjZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUl9TVEFURQkJMHgxQzAKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19JTlRSMQkJCTB4MUM0CisjZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUjIJCQkweDFDOAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX0lOVFIzCQkJMHgxQ0MKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19JTlRSNAkJCTB4MUQwCisjZGVmaW5lIEhETUlfQ09SRV9TWVNfVU1BU0sxCQkJMHgxRDQKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19UTURTX0NUUkwJCQkweDIwOAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFX0RMWQkJCTB4QzgKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9DVFJMCQkJMHhDQworI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFX1RPUAkJCTB4RDAKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9DTlRMCQkJMHhEOAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFX0NOVEgJCQkweERDCisjZGVmaW5lIEhETUlfQ09SRV9TWVNfREVfTElOTAkJCTB4RTAKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9MSU5IXzEJCQkweEU0CisjZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9WRU5fRk9MTE9XVlNZTkMJMHgxCisjZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9IRU5fRk9MTE9XSFNZTkMJMHgxCisjZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9CU0VMXzI0QklUQlVTCQkweDEKKyNkZWZpbmUgSERNSV9DT1JFX0NUUkwxX0VER0VfUklTSU5HRURHRQkweDEKKworLyogSERNSSBEREMgRS1ESUQgKi8KKyNkZWZpbmUgSERNSV9DT1JFX0REQ19DTUQJCQkweDNDQworI2RlZmluZSBIRE1JX0NPUkVfRERDX1NUQVRVUwkJCTB4M0M4CisjZGVmaW5lIEhETUlfQ09SRV9ERENfQUREUgkJCTB4M0I0CisjZGVmaW5lIEhETUlfQ09SRV9ERENfT0ZGU0VUCQkJMHgzQkMKKyNkZWZpbmUgSERNSV9DT1JFX0REQ19DT1VOVDEJCQkweDNDMAorI2RlZmluZSBIRE1JX0NPUkVfRERDX0NPVU5UMgkJCTB4M0M0CisjZGVmaW5lIEhETUlfQ09SRV9ERENfREFUQQkJCTB4M0QwCisjZGVmaW5lIEhETUlfQ09SRV9ERENfU0VHTQkJCTB4M0I4CisKKy8qIEhETUkgSVAgQ29yZSBBdWRpbyBWaWRlbyAqLworCisjZGVmaW5lIEhETUlfQ09SRV9BVl9IRE1JX0NUUkwJCQkweEJDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9EUEQJCQkweEY0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9QQl9DVFJMMQkJCTB4RjgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX1BCX0NUUkwyCQkJMHhGQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX1RZUEUJCQkweDEwMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX1ZFUlMJCQkweDEwNAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX0xFTgkJCTB4MTA4CisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfQ0hTVU0JCQkweDEwQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKG4pCQkobiAqIDQgKyAweDExMCkKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9EQllURV9ORUxFTVMJCTE1CisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfREJZVEUobikJCShuICogNCArIDB4MTkwKQorI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BEX0RCWVRFX05FTEVNUwkJMjcKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRF9EQllURShuKQkJKG4gKiA0ICsgMHgyMTApCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVURfREJZVEVfTkVMRU1TCQkxMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19EQllURShuKQkJKG4gKiA0ICsgMHgyOTApCisjZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0RCWVRFX05FTEVNUwkJMjcKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0dFTl9EQllURShuKQkJKG4gKiA0ICsgMHgzMDApCisjZGVmaW5lIEhETUlfQ09SRV9BVl9HRU5fREJZVEVfTkVMRU1TCQkzMQorI2RlZmluZSBIRE1JX0NPUkVfQVZfR0VOMl9EQllURShuKQkJKG4gKiA0ICsgMHgzODApCisjZGVmaW5lIEhETUlfQ09SRV9BVl9HRU4yX0RCWVRFX05FTEVNUwkJMzEKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FDUl9DVFJMCQkJMHg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9GUkVRX1NWQUwJCQkweDgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX05fU1ZBTDEJCQkweEMKKyNkZWZpbmUgSERNSV9DT1JFX0FWX05fU1ZBTDIJCQkweDEwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9OX1NWQUwzCQkJMHgxNAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX1NWQUwxCQkJMHgxOAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX1NWQUwyCQkJMHgxQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX1NWQUwzCQkJMHgyMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX0hWQUwxCQkJMHgyNAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX0hWQUwyCQkJMHgyOAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX0hWQUwzCQkJMHgyQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX01PREUJCQkweDUwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERJRl9DVFJMCQkJMHg1NAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSFdfU1BESUZfRlMJCTB4NjAKKyNkZWZpbmUgSERNSV9DT1JFX0FWX1NXQVBfSTJTCQkJMHg2NAorI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BESUZfRVJUSAkJCTB4NkMKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19JTl9NQVAJCQkweDcwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9JMlNfSU5fQ1RSTAkJMHg3NAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1QwCQkJMHg3OAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1QxCQkJMHg3QworI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1QyCQkJMHg4MAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1Q0CQkJMHg4NAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1Q1CQkJMHg4OAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVNSQwkJCTB4OEMKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19JTl9MRU4JCQkweDkwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9IRE1JX0NUUkwJCQkweEJDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVURPX1RYU1RBVAkJMHhDMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMQkJMHhDQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMgkJMHhEMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMwkJMHhENAorI2RlZmluZSBIRE1JX0NPUkVfQVZfVEVTVF9UWENUUkwJCTB4RjAKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0RQRAkJCTB4RjQKKyNkZWZpbmUgSERNSV9DT1JFX0FWX1BCX0NUUkwxCQkJMHhGOAorI2RlZmluZSBIRE1JX0NPUkVfQVZfUEJfQ1RSTDIJCQkweEZDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfVFlQRQkJCTB4MTAwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfVkVSUwkJCTB4MTA0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfTEVOCQkJMHgxMDgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9DSFNVTQkJCTB4MTBDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfVFlQRQkJCTB4MTgwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfVkVSUwkJCTB4MTg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfTEVOCQkJMHgxODgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX1NQRF9DSFNVTQkJCTB4MThDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVURJT19UWVBFCQkJMHgyMDAKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRElPX1ZFUlMJCQkweDIwNAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVESU9fTEVOCQkJMHgyMDgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRElPX0NIU1VNCQkweDIwQworI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19UWVBFCQkJMHgyODAKKyNkZWZpbmUgSERNSV9DT1JFX0FWX01QRUdfVkVSUwkJCTB4Mjg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0xFTgkJCTB4Mjg4CisjZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0NIU1VNCQkJMHgyOEMKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0NQX0JZVEUxCQkJMHgzN0MKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0NFQ19BRERSX0lECQkweDNGQworI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BEX0RCWVRFX0VMU0laRQkJMHg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9HRU4yX0RCWVRFX0VMU0laRQkJMHg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0RCWVRFX0VMU0laRQkJMHg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9HRU5fREJZVEVfRUxTSVpFCQkweDQKKworLyogUExMICovCisKKyNkZWZpbmUgUExMQ1RSTF9QTExfQ09OVFJPTAkJCTB4MAorI2RlZmluZSBQTExDVFJMX1BMTF9TVEFUVVMJCQkweDQKKyNkZWZpbmUgUExMQ1RSTF9QTExfR08JCQkJMHg4CisjZGVmaW5lIFBMTENUUkxfQ0ZHMQkJCQkweEMKKyNkZWZpbmUgUExMQ1RSTF9DRkcyCQkJCTB4MTAKKyNkZWZpbmUgUExMQ1RSTF9DRkczCQkJCTB4MTQKKyNkZWZpbmUgUExMQ1RSTF9DRkc0CQkJCTB4MjAKKworLyogSERNSSBQSFkgKi8KKworI2RlZmluZSBIRE1JX1RYUEhZX1RYX0NUUkwJCQkweDAKKyNkZWZpbmUgSERNSV9UWFBIWV9ESUdJVEFMX0NUUkwJCQkweDQKKyNkZWZpbmUgSERNSV9UWFBIWV9QT1dFUl9DVFJMCQkJMHg4CisjZGVmaW5lIEhETUlfVFhQSFlfUEFEX0NGR19DVFJMCQkJMHhDCisKKyNkZWZpbmUgUkVHX0ZMRF9NT0QoYmFzZSwgaWR4LCB2YWwsIHN0YXJ0LCBlbmQpIFwKKwloZG1pX3dyaXRlX3JlZyhiYXNlLCBpZHgsIEZMRF9NT0QoaGRtaV9yZWFkX3JlZyhiYXNlLCBpZHgpLFwKKwkJCQkJCQl2YWwsIHN0YXJ0LCBlbmQpKQorI2RlZmluZSBSRUdfR0VUKGJhc2UsIGlkeCwgc3RhcnQsIGVuZCkgXAorCUZMRF9HRVQoaGRtaV9yZWFkX3JlZyhiYXNlLCBpZHgpLCBzdGFydCwgZW5kKQorCitlbnVtIGhkbWlfcGh5X3B3ciB7CisJSERNSV9QSFlQV1JDTURfT0ZGID0gMCwKKwlIRE1JX1BIWVBXUkNNRF9MRE9PTiA9IDEsCisJSERNSV9QSFlQV1JDTURfVFhPTiA9IDIKK307CisKK2VudW0gaGRtaV9jb3JlX2lucHV0YnVzX3dpZHRoIHsKKwlIRE1JX0lOUFVUXzhCSVQgPSAwLAorCUhETUlfSU5QVVRfMTBCSVQgPSAxLAorCUhETUlfSU5QVVRfMTJCSVQgPSAyCit9OworCitlbnVtIGhkbWlfY29yZV9kaXRoZXJfdHJ1bmMgeworCUhETUlfT1VUUFVUVFJVTkNBVElPTl84QklUID0gMCwKKwlIRE1JX09VVFBVVFRSVU5DQVRJT05fMTBCSVQgPSAxLAorCUhETUlfT1VUUFVUVFJVTkNBVElPTl8xMkJJVCA9IDIsCisJSERNSV9PVVRQVVRESVRIRVJfOEJJVCA9IDMsCisJSERNSV9PVVRQVVRESVRIRVJfMTBCSVQgPSA0LAorCUhETUlfT1VUUFVURElUSEVSXzEyQklUID0gNQorfTsKKworZW51bSBoZG1pX2NvcmVfZGVlcGNvbG9yX2VkIHsKKwlIRE1JX0RFRVBDT0xPUlBBQ0tFQ1RESVNBQkxFID0gMCwKKwlIRE1JX0RFRVBDT0xPUlBBQ0tFQ1RFTkFCTEUgPSAxCit9OworCitlbnVtIGhkbWlfY29yZV9wYWNrZXRfbW9kZSB7CisJSERNSV9QQUNLRVRNT0RFUkVTRVJWRURWQUxVRSA9IDAsCisJSERNSV9QQUNLRVRNT0RFMjRCSVRQRVJQSVhFTCA9IDQsCisJSERNSV9QQUNLRVRNT0RFMzBCSVRQRVJQSVhFTCA9IDUsCisJSERNSV9QQUNLRVRNT0RFMzZCSVRQRVJQSVhFTCA9IDYsCisJSERNSV9QQUNLRVRNT0RFNDhCSVRQRVJQSVhFTCA9IDcKK307CisKK2VudW0gaGRtaV9jb3JlX3RjbGtzZWxjbGttdWx0IHsKKwlIRE1JX0ZQTEwwNUlEQ0sgPSAwLAorCUhETUlfRlBMTDEwSURDSyA9IDEsCisJSERNSV9GUExMMjBJRENLID0gMiwKKwlIRE1JX0ZQTEw0MElEQ0sgPSAzCit9OworCitlbnVtIGhkbWlfY29yZV9wYWNrZXRfY3RybCB7CisJSERNSV9QQUNLRVRFTkFCTEUgPSAxLAorCUhETUlfUEFDS0VURElTQUJMRSA9IDAsCisJSERNSV9QQUNLRVRSRVBFQVRPTiA9IDEsCisJSERNSV9QQUNLRVRSRVBFQVRPRkYgPSAwCit9OworCisvKiBJTkZPRlJBTUVfQVZJXyBhbmQgSU5GT0ZSQU1FX0FVRElPXyBkZWZpbml0aW9ucyAqLworZW51bSBoZG1pX2NvcmVfaW5mb2ZyYW1lIHsKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxWV9SR0IgPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFZX1lVVjQyMiA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMVlfWVVWNDQ0ID0gMiwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxQV9BQ1RJVkVfRk9STUFUX09GRiA9IDAsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMUFfQUNUSVZFX0ZPUk1BVF9PTiA9ICAxLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFCX05PID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxQl9WRVJUID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxQl9IT1JJID0gMiwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxQl9WRVJUSE9SSSA9IDMsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMVNfMCA9IDAsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMVNfMSA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMVNfMiA9IDIsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMkNfTk8gPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJDX0lUVTYwMSA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMkNfSVRVNzA5ID0gMiwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIyQ19FQ19FWFRFTkRFRCA9IDMsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMk1fTk8gPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJNXzQzID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIyTV8xNjkgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJSX1NBTUUgPSA4LAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJSXzQzID0gOSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIyUl8xNjkgPSAxMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIyUl8xNDkgPSAxMSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzSVRDX05PID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzSVRDX1lFUyA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCM0VDX1hWWVVWNjAxID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzRUNfWFZZVVY3MDkgPSAxLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNRX0RFRkFVTFQgPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNRX0xSID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzUV9GUiA9IDIsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCM1NDX05PID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzU0NfSE9SSSA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCM1NDX1ZFUlQgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNTQ19IT1JJVkVSVCA9IDMsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSX05PID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfMiA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzMgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl80ID0gMywKKwlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfNSA9IDQsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzYgPSA1LAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl83ID0gNiwKKwlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfOCA9IDcsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzkgPSA4LAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl8xMCA9IDksCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRlJPTV9TVFJFQU0gPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX0lFQzYwOTU4ID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9BQzMgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX01QRUcxID0gMywKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9NUDMgPSA0LAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX01QRUcyX01VTFRJQ0ggPSA1LAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX0FBQyA9IDYsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRFRTID0gNywKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9BVFJBQyA9IDgsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfT05FQklUID0gOSwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9ET0xCWV9ESUdJVEFMX1BMVVMgPSAxMCwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9EVFNfSEQgPSAxMSwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9NQVQgPSAxMiwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9EU1QgPSAxMywKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9XTUFfUFJPID0gMTQsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfRlJPTV9TVFJFQU0gPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGXzMyMDAwID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl80NDEwMCA9IDIsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfNDgwMDAgPSAzLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGXzg4MjAwID0gNCwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl85NjAwMCA9IDUsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfMTc2NDAwID0gNiwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl8xOTIwMDAgPSA3LAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNTX0ZST01fU1RSRUFNID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTU18xNkJJVCA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU1NfMjBCSVQgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNTXzI0QklUID0gMywKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjVfRE1fSU5IX1BFUk1JVFRFRCA9IDAsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREI1X0RNX0lOSF9QUk9ISUJJVEVEID0gMQorfTsKKworZW51bSBoZG1pX3BhY2tpbmdfbW9kZSB7CisJSERNSV9QQUNLXzEwYl9SR0JfWVVWNDQ0ID0gMCwKKwlIRE1JX1BBQ0tfMjRiX1JHQl9ZVVY0NDRfWVVWNDIyID0gMSwKKwlIRE1JX1BBQ0tfMjBiX1lVVjQyMiA9IDIsCisJSERNSV9QQUNLX0FMUkVBRFlQQUNLRUQgPSA3Cit9OworCitlbnVtIGhkbWlfY29yZV9hdWRpb19zYW1wbGVfZnJlcSB7CisJSERNSV9BVURJT19GU18zMjAwMCA9IDB4MywKKwlIRE1JX0FVRElPX0ZTXzQ0MTAwID0gMHgwLAorCUhETUlfQVVESU9fRlNfNDgwMDAgPSAweDIsCisJSERNSV9BVURJT19GU184ODIwMCA9IDB4OCwKKwlIRE1JX0FVRElPX0ZTXzk2MDAwID0gMHhBLAorCUhETUlfQVVESU9fRlNfMTc2NDAwID0gMHhDLAorCUhETUlfQVVESU9fRlNfMTkyMDAwID0gMHhFLAorCUhETUlfQVVESU9fRlNfTk9UX0lORElDQVRFRCA9IDB4MQorfTsKKworZW51bSBoZG1pX2NvcmVfYXVkaW9fbGF5b3V0IHsKKwlIRE1JX0FVRElPX0xBWU9VVF8yQ0ggPSAwLAorCUhETUlfQVVESU9fTEFZT1VUXzhDSCA9IDEKK307CisKK2VudW0gaGRtaV9jb3JlX2N0c19tb2RlIHsKKwlIRE1JX0FVRElPX0NUU19NT0RFX0hXID0gMCwKKwlIRE1JX0FVRElPX0NUU19NT0RFX1NXID0gMQorfTsKKworZW51bSBoZG1pX3N0ZXJlb19jaGFubmVscyB7CisJSERNSV9BVURJT19TVEVSRU9fTk9DSEFOTkVMUyA9IDAsCisJSERNSV9BVURJT19TVEVSRU9fT05FQ0hBTk5FTCA9IDEsCisJSERNSV9BVURJT19TVEVSRU9fVFdPQ0hBTk5FTFMgPSAyLAorCUhETUlfQVVESU9fU1RFUkVPX1RIUkVFQ0hBTk5FTFMgPSAzLAorCUhETUlfQVVESU9fU1RFUkVPX0ZPVVJDSEFOTkVMUyA9IDQKK307CisKK2VudW0gaGRtaV9hdWRpb190eXBlIHsKKwlIRE1JX0FVRElPX1RZUEVfTFBDTSA9IDAsCisJSERNSV9BVURJT19UWVBFX0lFQyA9IDEKK307CisKK2VudW0gaGRtaV9hdWRpb19qdXN0aWZ5IHsKKwlIRE1JX0FVRElPX0pVU1RJRllfTEVGVCA9IDAsCisJSERNSV9BVURJT19KVVNUSUZZX1JJR0hUID0gMQorfTsKKworZW51bSBoZG1pX2F1ZGlvX3NhbXBsZV9vcmRlciB7CisJSERNSV9BVURJT19TQU1QTEVfUklHSFRfRklSU1QgPSAwLAorCUhETUlfQVVESU9fU0FNUExFX0xFRlRfRklSU1QgPSAxCit9OworCitlbnVtIGhkbWlfYXVkaW9fc2FtcGxlc19wZXJ3b3JkIHsKKwlIRE1JX0FVRElPX09ORVdPUkRfT05FU0FNUExFID0gMCwKKwlIRE1JX0FVRElPX09ORVdPUkRfVFdPU0FNUExFUyA9IDEKK307CisKK2VudW0gaGRtaV9hdWRpb19zYW1wbGVfc2l6ZSB7CisJSERNSV9BVURJT19TQU1QTEVfMTZCSVRTID0gMCwKKwlIRE1JX0FVRElPX1NBTVBMRV8yNEJJVFMgPSAxCit9OworCitlbnVtIGhkbWlfYXVkaW9fdHJhbnNmX21vZGUgeworCUhETUlfQVVESU9fVFJBTlNGX0RNQSA9IDAsCisJSERNSV9BVURJT19UUkFOU0ZfSVJRID0gMQorfTsKKworZW51bSBoZG1pX2F1ZGlvX2Jsa19zdHJ0X2VuZF9zaWcgeworCUhETUlfQVVESU9fQkxPQ0tfU0lHX1NUQVJURU5EX09OID0gMCwKKwlIRE1JX0FVRElPX0JMT0NLX1NJR19TVEFSVEVORF9PRkYgPSAxCit9OworCitlbnVtIGhkbWlfYXVkaW9faTJzX2NvbmZpZyB7CisJSERNSV9BVURJT19JMlNfV1NfUE9MQVJJVFlfTE9XX0lTX0xFRlQgPSAwLAorCUhETUlfQVVESU9fSTJTX1dTX1BPTEFSSVRfWUxPV19JU19SSUdIVCA9IDEsCisJSERNSV9BVURJT19JMlNfTVNCX1NISUZURURfRklSU1QgPSAwLAorCUhETUlfQVVESU9fSTJTX0xTQl9TSElGVEVEX0ZJUlNUID0gMSwKKwlIRE1JX0FVRElPX0kyU19NQVhfV09SRF8yMEJJVFMgPSAwLAorCUhETUlfQVVESU9fSTJTX01BWF9XT1JEXzI0QklUUyA9IDEsCisJSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEX05PVF9TUEVDSUZJRUQgPSAwLAorCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8xNl9CSVRTID0gMSwKKwlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMTdfQklUUyA9IDYsCisJSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzE4X0JJVFMgPSAyLAorCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8xOV9CSVRTID0gNCwKKwlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMjBfQklUU18yME1BWCA9IDUsCisJSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzIwX0JJVFNfMjRNQVggPSAxLAorCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8yMV9CSVRTID0gNiwKKwlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMjJfQklUUyA9IDIsCisJSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzIzX0JJVFMgPSA0LAorCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8yNF9CSVRTID0gNSwKKwlIRE1JX0FVRElPX0kyU19TQ0tfRURHRV9GQUxMSU5HID0gMCwKKwlIRE1JX0FVRElPX0kyU19TQ0tfRURHRV9SSVNJTkcgPSAxLAorCUhETUlfQVVESU9fSTJTX1ZCSVRfRk9SX1BDTSA9IDAsCisJSERNSV9BVURJT19JMlNfVkJJVF9GT1JfQ09NUFJFU1NFRCA9IDEsCisJSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIX05BID0gMCwKKwlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMTYgPSAyLAorCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8xNyA9IDEyLAorCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8xOCA9IDQsCisJSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzE5ID0gOCwKKwlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMjAgPSAxMCwKKwlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMjEgPSAxMywKKwlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMjIgPSA1LAorCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8yMyA9IDksCisJSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzI0ID0gMTEsCisJSERNSV9BVURJT19JMlNfRklSU1RfQklUX1NISUZUID0gMCwKKwlIRE1JX0FVRElPX0kyU19GSVJTVF9CSVRfTk9fU0hJRlQgPSAxLAorCUhETUlfQVVESU9fSTJTX1NEMF9FTiA9IDEsCisJSERNSV9BVURJT19JMlNfU0QxX0VOID0gMSA8PCAxLAorCUhETUlfQVVESU9fSTJTX1NEMl9FTiA9IDEgPDwgMiwKKwlIRE1JX0FVRElPX0kyU19TRDNfRU4gPSAxIDw8IDMsCit9OworCitlbnVtIGhkbWlfYXVkaW9fbWNsa19tb2RlIHsKKwlIRE1JX0FVRElPX01DTEtfMTI4RlMgPSAwLAorCUhETUlfQVVESU9fTUNMS18yNTZGUyA9IDEsCisJSERNSV9BVURJT19NQ0xLXzM4NEZTID0gMiwKKwlIRE1JX0FVRElPX01DTEtfNTEyRlMgPSAzLAorCUhETUlfQVVESU9fTUNMS183NjhGUyA9IDQsCisJSERNSV9BVURJT19NQ0xLXzEwMjRGUyA9IDUsCisJSERNSV9BVURJT19NQ0xLXzExNTJGUyA9IDYsCisJSERNSV9BVURJT19NQ0xLXzE5MkZTID0gNworfTsKKworc3RydWN0IGhkbWlfY29yZV92aWRlb19jb25maWcgeworCWVudW0gaGRtaV9jb3JlX2lucHV0YnVzX3dpZHRoCWlwX2J1c193aWR0aDsKKwllbnVtIGhkbWlfY29yZV9kaXRoZXJfdHJ1bmMJb3BfZGl0aGVyX3RydWM7CisJZW51bSBoZG1pX2NvcmVfZGVlcGNvbG9yX2VkCWRlZXBfY29sb3JfcGt0OworCWVudW0gaGRtaV9jb3JlX3BhY2tldF9tb2RlCXBrdF9tb2RlOworCWVudW0gaGRtaV9jb3JlX2hkbWlfZHZpCQloZG1pX2R2aTsKKwllbnVtIGhkbWlfY29yZV90Y2xrc2VsY2xrbXVsdAl0Y2xrX3NlbF9jbGttdWx0OworfTsKKworLyoKKyAqIFJlZmVyIHRvIHNlY3Rpb24gOC4yIGluIEhETUkgMS4zIHNwZWNpZmljYXRpb24gZm9yCisgKiBkZXRhaWxzIGFib3V0IGluZm9mcmFtZSBkYXRhYnl0ZXMKKyAqLworc3RydWN0IGhkbWlfY29yZV9pbmZvZnJhbWVfYXZpIHsKKwkvKiBZMCwgWTEgcmdiLHlDYkNyICovCisJdTgJZGIxX2Zvcm1hdDsKKwkvKiBBMCAgQWN0aXZlIGluZm9ybWF0aW9uIFByZXNlbnQgKi8KKwl1OAlkYjFfYWN0aXZlX2luZm87CisJLyogQjAsIEIxIEJhciBpbmZvIGRhdGEgdmFsaWQgKi8KKwl1OAlkYjFfYmFyX2luZm9fZHY7CisJLyogUzAsIFMxIHNjYW4gaW5mb3JtYXRpb24gKi8KKwl1OAlkYjFfc2Nhbl9pbmZvOworCS8qIEMwLCBDMSBjb2xvcmltZXRyeSAqLworCXU4CWRiMl9jb2xvcmltZXRyeTsKKwkvKiBNMCwgTTEgQXNwZWN0IHJhdGlvICg0OjMsIDE2OjkpICovCisJdTgJZGIyX2FzcGVjdF9yYXRpbzsKKwkvKiBSMC4uLlIzIEFjdGl2ZSBmb3JtYXQgYXNwZWN0IHJhdGlvICovCisJdTgJZGIyX2FjdGl2ZV9mbXRfYXI7CisJLyogSVRDIElUIGNvbnRlbnQuICovCisJdTgJZGIzX2l0YzsKKwkvKiBFQzAsIEVDMSwgRUMyIEV4dGVuZGVkIGNvbG9yaW1ldHJ5ICovCisJdTgJZGIzX2VjOworCS8qIFExLCBRMCBRdWFudGl6YXRpb24gcmFuZ2UgKi8KKwl1OAlkYjNfcV9yYW5nZTsKKwkvKiBTQzEsIFNDMCBOb24tdW5pZm9ybSBwaWN0dXJlIHNjYWxpbmcgKi8KKwl1OAlkYjNfbnVwX3NjYWxpbmc7CisJLyogVklDMC4uNiBWaWRlbyBmb3JtYXQgaWRlbnRpZmljYXRpb24gKi8KKwl1OAlkYjRfdmlkZW9jb2RlOworCS8qIFBSMC4uUFIzIFBpeGVsIHJlcGV0aXRpb24gZmFjdG9yICovCisJdTgJZGI1X3BpeGVsX3JlcGVhdDsKKwkvKiBMaW5lIG51bWJlciBlbmQgb2YgdG9wIGJhciAqLworCXUxNglkYjZfN19saW5lX2VvZnRvcDsKKwkvKiBMaW5lIG51bWJlciBzdGFydCBvZiBib3R0b20gYmFyICovCisJdTE2CWRiOF85X2xpbmVfc29mYm90dG9tOworCS8qIFBpeGVsIG51bWJlciBlbmQgb2YgbGVmdCBiYXIgKi8KKwl1MTYJZGIxMF8xMV9waXhlbF9lb2ZsZWZ0OworCS8qIFBpeGVsIG51bWJlciBzdGFydCBvZiByaWdodCBiYXIgKi8KKwl1MTYJZGIxMl8xM19waXhlbF9zb2ZyaWdodDsKK307CisvKgorICogUmVmZXIgdG8gc2VjdGlvbiA4LjIgaW4gSERNSSAxLjMgc3BlY2lmaWNhdGlvbiBmb3IKKyAqIGRldGFpbHMgYWJvdXQgaW5mb2ZyYW1lIGRhdGFieXRlcworICovCitzdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdWRpbyB7CisJdTggZGIxX2NvZGluZ190eXBlOworCXU4IGRiMV9jaGFubmVsX2NvdW50OworCXU4IGRiMl9zYW1wbGVfZnJlcTsKKwl1OCBkYjJfc2FtcGxlX3NpemU7CisJdTggZGI0X2NoYW5uZWxfYWxsb2M7CisJYm9vbCBkYjVfZG93bm1peF9pbmg7CisJdTggZGI1X2xzdjsJLyogTGV2ZWwgc2hpZnQgdmFsdWVzIGZvciBkb3dubWl4ICovCit9OworCitzdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0IHsKKwl1MzIJYXVkaW9fcGt0OworCXUzMglhdWRpb19wa3RfcmVwZWF0OworCXUzMglhdmlfaW5mb2ZyYW1lOworCXUzMglhdmlfaW5mb2ZyYW1lX3JlcGVhdDsKKwl1MzIJZ2VuX2NudHJsX3BrdDsKKwl1MzIJZ2VuX2NudHJsX3BrdF9yZXBlYXQ7CisJdTMyCWdlbmVyaWNfcGt0OworCXUzMglnZW5lcmljX3BrdF9yZXBlYXQ7Cit9OworCitzdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgeworCWVudW0gaGRtaV9wYWNraW5nX21vZGUJcGFja2luZ19tb2RlOworCXUzMgkJCXlfcmVzOwkvKiBMaW5lIHBlciBwYW5lbCAqLworCXUzMgkJCXhfcmVzOwkvKiBwaXhlbCBwZXIgbGluZSAqLworfTsKKworc3RydWN0IGhkbWlfdmlkZW9faW50ZXJmYWNlIHsKKwlpbnQJdnNwOwkvKiBWc3luYyBwb2xhcml0eSAqLworCWludAloc3A7CS8qIEhzeW5jIHBvbGFyaXR5ICovCisJaW50CWludGVybGFjaW5nOworCWludAl0bTsJLyogVGltaW5nIG1vZGUgKi8KK307CisKK3N0cnVjdCBoZG1pX2F1ZGlvX2Zvcm1hdCB7CisJZW51bSBoZG1pX3N0ZXJlb19jaGFubmVscwkJc3RlcmVvX2NoYW5uZWxzOworCXU4CQkJCQlhY3RpdmVfY2hubmxzX21zazsKKwllbnVtIGhkbWlfYXVkaW9fdHlwZQkJCXR5cGU7CisJZW51bSBoZG1pX2F1ZGlvX2p1c3RpZnkJCQlqdXN0aWZpY2F0aW9uOworCWVudW0gaGRtaV9hdWRpb19zYW1wbGVfb3JkZXIJCXNhbXBsZV9vcmRlcjsKKwllbnVtIGhkbWlfYXVkaW9fc2FtcGxlc19wZXJ3b3JkCQlzYW1wbGVzX3Blcl93b3JkOworCWVudW0gaGRtaV9hdWRpb19zYW1wbGVfc2l6ZQkJc2FtcGxlX3NpemU7CisJZW51bSBoZG1pX2F1ZGlvX2Jsa19zdHJ0X2VuZF9zaWcJZW5fc2lnX2Jsa19zdHJ0X2VuZDsKK307CisKK3N0cnVjdCBoZG1pX2F1ZGlvX2RtYSB7CisJdTgJCQkJdHJhbnNmZXJfc2l6ZTsKKwl1OAkJCQlibG9ja19zaXplOworCWVudW0gaGRtaV9hdWRpb190cmFuc2ZfbW9kZQltb2RlOworCXUxNgkJCQlmaWZvX3RocmVzaG9sZDsKK307CisKK3N0cnVjdCBoZG1pX2NvcmVfYXVkaW9faTJzX2NvbmZpZyB7CisJdTggd29yZF9tYXhfbGVuZ3RoOworCXU4IHdvcmRfbGVuZ3RoOworCXU4IGluX2xlbmd0aF9iaXRzOworCXU4IGp1c3RpZmljYXRpb247CisJdTggZW5faGlnaF9iaXRyYXRlX2F1ZDsKKwl1OCBzY2tfZWRnZV9tb2RlOworCXU4IGNiaXRfb3JkZXI7CisJdTggdmJpdDsKKwl1OCB3c19wb2xhcml0eTsKKwl1OCBkaXJlY3Rpb247CisJdTggc2hpZnQ7CisJdTggYWN0aXZlX3NkczsKK307CisKK3N0cnVjdCBoZG1pX2NvcmVfYXVkaW9fY29uZmlnIHsKKwlzdHJ1Y3QgaGRtaV9jb3JlX2F1ZGlvX2kyc19jb25maWcJaTJzX2NmZzsKKwllbnVtIGhkbWlfY29yZV9hdWRpb19zYW1wbGVfZnJlcQlmcmVxX3NhbXBsZTsKKwlib29sCQkJCQlmc19vdmVycmlkZTsKKwl1MzIJCQkJCW47CisJdTMyCQkJCQljdHM7CisJdTMyCQkJCQlhdWRfcGFyX2J1c2NsazsKKwllbnVtIGhkbWlfY29yZV9hdWRpb19sYXlvdXQJCWxheW91dDsKKwllbnVtIGhkbWlfY29yZV9jdHNfbW9kZQkJCWN0c19tb2RlOworCWJvb2wJCQkJCXVzZV9tY2xrOworCWVudW0gaGRtaV9hdWRpb19tY2xrX21vZGUJCW1jbGtfbW9kZTsKKwlib29sCQkJCQllbl9hY3JfcGt0OworCWJvb2wJCQkJCWVuX2RzZF9hdWRpbzsKKwlib29sCQkJCQllbl9wYXJhbGxlbF9hdWRfaW5wdXQ7CisJYm9vbAkJCQkJZW5fc3BkaWY7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUkpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSV9NT0RVTEUpCitpbnQgaGRtaV9hdWRpb190cmlnZ2VyKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpOworaW50IGhkbWlfY29uZmlnX2F1ZGlvX2FjcihzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCXUzMiBzYW1wbGVfZnJlcSwgdTMyICpuLCB1MzIgKmN0cyk7Cit2b2lkIGhkbWlfY29yZV9hdWRpb19pbmZvZnJhbWVfY29uZmlnKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCXN0cnVjdCBoZG1pX2NvcmVfaW5mb2ZyYW1lX2F1ZGlvICppbmZvX2F1ZCk7Cit2b2lkIGhkbWlfY29yZV9hdWRpb19jb25maWcoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwKKwkJCQkJc3RydWN0IGhkbWlfY29yZV9hdWRpb19jb25maWcgKmNmZyk7Cit2b2lkIGhkbWlfd3BfYXVkaW9fY29uZmlnX2RtYShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCQlzdHJ1Y3QgaGRtaV9hdWRpb19kbWEgKmF1ZF9kbWEpOwordm9pZCBoZG1pX3dwX2F1ZGlvX2NvbmZpZ19mb3JtYXQoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwKKwkJCQkJc3RydWN0IGhkbWlfYXVkaW9fZm9ybWF0ICphdWRfZm10KTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy92ZW5jLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy92ZW5jLmMKaW5kZXggMTczYzY2NC4uNzUzMzQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdmVuYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3ZlbmMuYwpAQCAtMjk1LDcgKzI5NSw2IEBACiAJdTMyIHdzc19kYXRhOwogCXN0cnVjdCByZWd1bGF0b3IgKnZkZGFfZGFjX3JlZzsKIAotCXN0cnVjdCBjbGsJKnR2X2NsazsKIAlzdHJ1Y3QgY2xrCSp0dl9kYWNfY2xrOwogfSB2ZW5jOwogCkBAIC00NjQsOSArNDYzLDExIEBACiAJcmVndWxhdG9yX2Rpc2FibGUodmVuYy52ZGRhX2RhY19yZWcpOwogfQogCi0KLQotCit1bnNpZ25lZCBsb25nIHZlbmNfZ2V0X3BpeGVsX2Nsb2NrKHZvaWQpCit7CisJLyogVkVOQyBQaXhlbCBDbG9jayBpbiBNaHogKi8KKwlyZXR1cm4gMTM1MDAwMDA7Cit9CiAKIC8qIGRyaXZlciAqLwogc3RhdGljIGludCB2ZW5jX3BhbmVsX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKQEAgLTczMiwyMiArNzMzLDEwIEBACiB7CiAJc3RydWN0IGNsayAqY2xrOwogCi0JY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7Ci0JaWYgKElTX0VSUihjbGspKSB7Ci0JCURTU0VSUigiY2FuJ3QgZ2V0IGZja1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKGNsayk7Ci0JfQotCi0JdmVuYy50dl9jbGsgPSBjbGs7Ci0KIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfVkVOQ19SRVFVSVJFU19UVl9EQUNfQ0xLKSkgewotCQlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXAzNjMwKCkpCi0JCQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJkc3NfOTZtX2ZjayIpOwotCQllbHNlCi0JCQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ0dl9kYWNfY2xrIik7CisJCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInR2X2RhY19jbGsiKTsKIAkJaWYgKElTX0VSUihjbGspKSB7CiAJCQlEU1NFUlIoImNhbid0IGdldCB0dl9kYWNfY2xrXG4iKTsKLQkJCWNsa19wdXQodmVuYy50dl9jbGspOwogCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAkJfQogCX0gZWxzZSB7CkBAIC03NjEsOCArNzUwLDYgQEAKIAogc3RhdGljIHZvaWQgdmVuY19wdXRfY2xvY2tzKHZvaWQpCiB7Ci0JaWYgKHZlbmMudHZfY2xrKQotCQljbGtfcHV0KHZlbmMudHZfY2xrKTsKIAlpZiAodmVuYy50dl9kYWNfY2xrKQogCQljbGtfcHV0KHZlbmMudHZfZGFjX2Nsayk7CiB9CkBAIC04MzgsNyArODI1LDYgQEAKIHsKIAlpZiAodmVuYy50dl9kYWNfY2xrKQogCQljbGtfZGlzYWJsZSh2ZW5jLnR2X2RhY19jbGspOwotCWNsa19kaXNhYmxlKHZlbmMudHZfY2xrKTsKIAogCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiAJZHNzX3J1bnRpbWVfcHV0KCk7CkBAIC04NTgsNyArODQ0LDYgQEAKIAlpZiAociA8IDApCiAJCWdvdG8gZXJyX2dldF9kaXNwYzsKIAotCWNsa19lbmFibGUodmVuYy50dl9jbGspOwogCWlmICh2ZW5jLnR2X2RhY19jbGspCiAJCWNsa19lbmFibGUodmVuYy50dl9kYWNfY2xrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL0tjb25maWcKaW5kZXggYWEzMzM4Ni4uODNkM2ZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogbWVudWNvbmZpZyBGQl9PTUFQMgotICAgICAgICB0cmlzdGF0ZSAiT01BUDIrIGZyYW1lIGJ1ZmZlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorICAgICAgICB0cmlzdGF0ZSAiT01BUDIrIGZyYW1lIGJ1ZmZlciBzdXBwb3J0IgogICAgICAgICBkZXBlbmRzIG9uIEZCICYmIE9NQVAyX0RTUwogCiAJc2VsZWN0IE9NQVAyX1ZSQU0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1pb2N0bC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKaW5kZXggNmIxYWMyMy4uZGY3YmNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L29tYXBmYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDxwbGF0L3ZyZmIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItbWFpbi5jCmluZGV4IDYwMmI3MWEuLjcwYWE0N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1tYWluLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLW1haW4uYwpAQCAtODA4LDE5ICs4MDgsMTUgQEAKIHN0YXRpYyB2b2lkIG9tYXBmYl9jYWxjX2FkZHIoY29uc3Qgc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsCi0JCQkgICAgIGludCByb3RhdGlvbiwgdTMyICpwYWRkciwgdm9pZCBfX2lvbWVtICoqdmFkZHIpCisJCQkgICAgIGludCByb3RhdGlvbiwgdTMyICpwYWRkcikKIHsKIAl1MzIgZGF0YV9zdGFydF9wOwotCXZvaWQgX19pb21lbSAqZGF0YV9zdGFydF92OwogCWludCBvZmZzZXQ7CiAKLQlpZiAob2ZiaS0+cm90YXRpb25fdHlwZSA9PSBPTUFQX0RTU19ST1RfVlJGQikgeworCWlmIChvZmJpLT5yb3RhdGlvbl90eXBlID09IE9NQVBfRFNTX1JPVF9WUkZCKQogCQlkYXRhX3N0YXJ0X3AgPSBvbWFwZmJfZ2V0X3JlZ2lvbl9yb3RfcGFkZHIob2ZiaSwgcm90YXRpb24pOwotCQlkYXRhX3N0YXJ0X3YgPSBOVUxMOwotCX0gZWxzZSB7CisJZWxzZQogCQlkYXRhX3N0YXJ0X3AgPSBvbWFwZmJfZ2V0X3JlZ2lvbl9wYWRkcihvZmJpKTsKLQkJZGF0YV9zdGFydF92ID0gb21hcGZiX2dldF9yZWdpb25fdmFkZHIob2ZiaSk7Ci0JfQogCiAJaWYgKG9mYmktPnJvdGF0aW9uX3R5cGUgPT0gT01BUF9EU1NfUk9UX1ZSRkIpCiAJCW9mZnNldCA9IGNhbGNfcm90YXRpb25fb2Zmc2V0X3ZyZmIodmFyLCBmaXgsIHJvdGF0aW9uKTsKQEAgLTgyOCwxNiArODI0LDE0IEBACiAJCW9mZnNldCA9IGNhbGNfcm90YXRpb25fb2Zmc2V0X2RtYSh2YXIsIGZpeCwgcm90YXRpb24pOwogCiAJZGF0YV9zdGFydF9wICs9IG9mZnNldDsKLQlkYXRhX3N0YXJ0X3YgKz0gb2Zmc2V0OwogCiAJaWYgKG9mZnNldCkKIAkJREJHKCJvZmZzZXQgJWQsICVkID0gJWRcbiIsCiAJCSAgICB2YXItPnhvZmZzZXQsIHZhci0+eW9mZnNldCwgb2Zmc2V0KTsKIAotCURCRygicGFkZHIgJXgsIHZhZGRyICVwXG4iLCBkYXRhX3N0YXJ0X3AsIGRhdGFfc3RhcnRfdik7CisJREJHKCJwYWRkciAleFxuIiwgZGF0YV9zdGFydF9wKTsKIAogCSpwYWRkciA9IGRhdGFfc3RhcnRfcDsKLQkqdmFkZHIgPSBkYXRhX3N0YXJ0X3Y7CiB9CiAKIC8qIHNldHVwIG92ZXJsYXkgYWNjb3JkaW5nIHRvIHRoZSBmYiAqLwpAQCAtODUwLDcgKzg0NCw2IEBACiAJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXggPSAmZmJpLT5maXg7CiAJZW51bSBvbWFwX2NvbG9yX21vZGUgbW9kZSA9IDA7CiAJdTMyIGRhdGFfc3RhcnRfcCA9IDA7Ci0Jdm9pZCBfX2lvbWVtICpkYXRhX3N0YXJ0X3YgPSBOVUxMOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOwogCWludCB4cmVzLCB5cmVzOwogCWludCBzY3JlZW5fd2lkdGg7CkBAIC04ODAsOCArODczLDcgQEAKIAl9CiAKIAlpZiAob2ZiaS0+cmVnaW9uLT5zaXplKQotCQlvbWFwZmJfY2FsY19hZGRyKG9mYmksIHZhciwgZml4LCByb3RhdGlvbiwKLQkJCQkgJmRhdGFfc3RhcnRfcCwgJmRhdGFfc3RhcnRfdik7CisJCW9tYXBmYl9jYWxjX2FkZHIob2ZiaSwgdmFyLCBmaXgsIHJvdGF0aW9uLCAmZGF0YV9zdGFydF9wKTsKIAogCXIgPSBmYl9tb2RlX3RvX2Rzc19tb2RlKHZhciwgJm1vZGUpOwogCWlmIChyKSB7CkBAIC05MTAsNyArOTAyLDYgQEAKIAkJbWlycm9yID0gb2ZiaS0+bWlycm9yOwogCiAJaW5mby5wYWRkciA9IGRhdGFfc3RhcnRfcDsKLQlpbmZvLnZhZGRyID0gZGF0YV9zdGFydF92OwogCWluZm8uc2NyZWVuX3dpZHRoID0gc2NyZWVuX3dpZHRoOwogCWluZm8ud2lkdGggPSB4cmVzOwogCWluZm8uaGVpZ2h0ID0geXJlczsKQEAgLTIyNzYsNiArMjI2Nyw4NyBAQAogCXJldHVybiByOwogfQogCitzdGF0aWMgdm9pZCBmYl92aWRlb21vZGVfdG9fb21hcF90aW1pbmdzKHN0cnVjdCBmYl92aWRlb21vZGUgKm0sCisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnQpCit7CisJdC0+eF9yZXMgPSBtLT54cmVzOworCXQtPnlfcmVzID0gbS0+eXJlczsKKwl0LT5waXhlbF9jbG9jayA9IFBJQ09TMktIWihtLT5waXhjbG9jayk7CisJdC0+aHN3ID0gbS0+aHN5bmNfbGVuOworCXQtPmhmcCA9IG0tPnJpZ2h0X21hcmdpbjsKKwl0LT5oYnAgPSBtLT5sZWZ0X21hcmdpbjsKKwl0LT52c3cgPSBtLT52c3luY19sZW47CisJdC0+dmZwID0gbS0+bG93ZXJfbWFyZ2luOworCXQtPnZicCA9IG0tPnVwcGVyX21hcmdpbjsKK30KKworc3RhdGljIGludCBvbWFwZmJfZmluZF9iZXN0X21vZGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSwKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwlzdHJ1Y3QgZmJfbW9uc3BlY3MgKnNwZWNzOworCXU4ICplZGlkOworCWludCByLCBpLCBiZXN0X3hyZXMsIGJlc3RfaWR4LCBsZW47CisKKwlpZiAoIWRpc3BsYXktPmRyaXZlci0+cmVhZF9lZGlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWxlbiA9IDB4ODAgKiAyOworCWVkaWQgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisKKwlyID0gZGlzcGxheS0+ZHJpdmVyLT5yZWFkX2VkaWQoZGlzcGxheSwgZWRpZCwgbGVuKTsKKwlpZiAociA8IDApCisJCWdvdG8gZXJyMTsKKworCXNwZWNzID0ga3phbGxvYyhzaXplb2YoKnNwZWNzKSwgR0ZQX0tFUk5FTCk7CisKKwlmYl9lZGlkX3RvX21vbnNwZWNzKGVkaWQsIHNwZWNzKTsKKworCWlmIChlZGlkWzEyNl0gPiAwKQorCQlmYl9lZGlkX2FkZF9tb25zcGVjcyhlZGlkICsgMHg4MCwgc3BlY3MpOworCisJYmVzdF94cmVzID0gMDsKKwliZXN0X2lkeCA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IHNwZWNzLT5tb2RlZGJfbGVuOyArK2kpIHsKKwkJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbTsKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyB0OworCisJCW0gPSAmc3BlY3MtPm1vZGVkYltpXTsKKworCQlpZiAobS0+cGl4Y2xvY2sgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHNraXAgcmVwZWF0ZWQgcGl4ZWwgbW9kZXMgKi8KKwkJaWYgKG0tPnhyZXMgPT0gMjg4MCB8fCBtLT54cmVzID09IDE0NDApCisJCQljb250aW51ZTsKKworCQlmYl92aWRlb21vZGVfdG9fb21hcF90aW1pbmdzKG0sICZ0KTsKKworCQlyID0gZGlzcGxheS0+ZHJpdmVyLT5jaGVja190aW1pbmdzKGRpc3BsYXksICZ0KTsKKwkJaWYgKHIgPT0gMCAmJiBiZXN0X3hyZXMgPCBtLT54cmVzKSB7CisJCQliZXN0X3hyZXMgPSBtLT54cmVzOworCQkJYmVzdF9pZHggPSBpOworCQl9CisJfQorCisJaWYgKGJlc3RfeHJlcyA9PSAwKSB7CisJCXIgPSAtRU5PRU5UOworCQlnb3RvIGVycjI7CisJfQorCisJZmJfdmlkZW9tb2RlX3RvX29tYXBfdGltaW5ncygmc3BlY3MtPm1vZGVkYltiZXN0X2lkeF0sIHRpbWluZ3MpOworCisJciA9IDA7CisKK2VycjI6CisJZmJfZGVzdHJveV9tb2RlZGIoc3BlY3MtPm1vZGVkYik7CisJa2ZyZWUoc3BlY3MpOworZXJyMToKKwlrZnJlZShlZGlkKTsKKworCXJldHVybiByOworfQorCiBzdGF0aWMgaW50IG9tYXBmYl9pbml0X2Rpc3BsYXkoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiwKIAkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewpAQCAtMjM3Myw4ICsyNDQ1LDEwIEBACiAJCW9tYXBfZHNzX2dldF9kZXZpY2UoZHNzZGV2KTsKIAogCQlpZiAoIWRzc2Rldi0+ZHJpdmVyKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBkcml2ZXIgZm9yIGRpc3BsYXlcbiIpOwotCQkJciA9IC1FTk9ERVY7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAibm8gZHJpdmVyIGZvciBkaXNwbGF5OiAlc1xuIiwKKwkJCQlkc3NkZXYtPm5hbWUpOworCQkJb21hcF9kc3NfcHV0X2RldmljZShkc3NkZXYpOworCQkJY29udGludWU7CiAJCX0KIAogCQlkID0gJmZiZGV2LT5kaXNwbGF5c1tmYmRldi0+bnVtX2Rpc3BsYXlzKytdOwpAQCAtMjQwMiw5ICsyNDc2LDI3IEBACiAJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fbWFuYWdlcnM7IGkrKykKIAkJZmJkZXYtPm1hbmFnZXJzW2ldID0gb21hcF9kc3NfZ2V0X292ZXJsYXlfbWFuYWdlcihpKTsKIAorCS8qIGdmeCBvdmVybGF5IHNob3VsZCBiZSB0aGUgZGVmYXVsdCBvbmUuIGZpbmQgYSBkaXNwbGF5CisJICogY29ubmVjdGVkIHRvIHRoYXQsIGFuZCB1c2UgaXQgYXMgZGVmYXVsdCBkaXNwbGF5ICovCisJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoMCk7CisJaWYgKG92bC0+bWFuYWdlciAmJiBvdmwtPm1hbmFnZXItPmRldmljZSkgeworCQlkZWZfZGlzcGxheSA9IG92bC0+bWFuYWdlci0+ZGV2aWNlOworCX0gZWxzZSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjYW5ub3QgZmluZCBkZWZhdWx0IGRpc3BsYXlcbiIpOworCQlkZWZfZGlzcGxheSA9IE5VTEw7CisJfQorCiAJaWYgKGRlZl9tb2RlICYmIHN0cmxlbihkZWZfbW9kZSkgPiAwKSB7CiAJCWlmIChvbWFwZmJfcGFyc2VfZGVmX21vZGVzKGZiZGV2KSkKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjYW5ub3QgcGFyc2UgZGVmYXVsdCBtb2Rlc1xuIik7CisJfSBlbHNlIGlmIChkZWZfZGlzcGxheSAmJiBkZWZfZGlzcGxheS0+ZHJpdmVyLT5zZXRfdGltaW5ncyAmJgorCQkJZGVmX2Rpc3BsYXktPmRyaXZlci0+Y2hlY2tfdGltaW5ncykgeworCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHQ7CisKKwkJciA9IG9tYXBmYl9maW5kX2Jlc3RfbW9kZShkZWZfZGlzcGxheSwgJnQpOworCisJCWlmIChyID09IDApCisJCQlkZWZfZGlzcGxheS0+ZHJpdmVyLT5zZXRfdGltaW5ncyhkZWZfZGlzcGxheSwgJnQpOwogCX0KIAogCXIgPSBvbWFwZmJfY3JlYXRlX2ZyYW1lYnVmZmVycyhmYmRldik7CkBAIC0yNDIxLDE2ICsyNTEzLDYgQEAKIAogCURCRygibWdyLT5hcHBseSdlZFxuIik7CiAKLQkvKiBnZnggb3ZlcmxheSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgb25lLiBmaW5kIGEgZGlzcGxheQotCSAqIGNvbm5lY3RlZCB0byB0aGF0LCBhbmQgdXNlIGl0IGFzIGRlZmF1bHQgZGlzcGxheSAqLwotCW92bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KDApOwotCWlmIChvdmwtPm1hbmFnZXIgJiYgb3ZsLT5tYW5hZ2VyLT5kZXZpY2UpIHsKLQkJZGVmX2Rpc3BsYXkgPSBvdmwtPm1hbmFnZXItPmRldmljZTsKLQl9IGVsc2UgewotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiY2Fubm90IGZpbmQgZGVmYXVsdCBkaXNwbGF5XG4iKTsKLQkJZGVmX2Rpc3BsYXkgPSBOVUxMOwotCX0KLQogCWlmIChkZWZfZGlzcGxheSkgewogCQlyID0gb21hcGZiX2luaXRfZGlzcGxheShmYmRldiwgZGVmX2Rpc3BsYXkpOwogCQlpZiAocikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLXN5c2ZzLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYwppbmRleCAxNTNiZjFhLi4xNjk0ZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYwpAQCAtMTA0LDE2ICsxMDQsMTQgQEAKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7Ci0JaW50IG1pcnJvcjsKKwlib29sIG1pcnJvcjsKIAlpbnQgcjsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gbmV3X3ZhcjsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmbWlycm9yKTsKKwlyID0gc3RydG9ib29sKGJ1ZiwgJm1pcnJvcik7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JbWlycm9yID0gISFtaXJyb3I7Ci0KIAlpZiAoIWxvY2tfZmJfaW5mbyhmYmkpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwppbmRleCBmMjdhZTE2Li5hZTNjYWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAKIAogLyogCi0gKiBQYXJzZSB1c2VyIHNwZWZpY2llZCBvcHRpb25zIChgdmlkZW89cGxhdGludW1mYjonKQorICogUGFyc2UgdXNlciBzcGVjaWZpZWQgb3B0aW9ucyAoYHZpZGVvPXBsYXRpbnVtZmI6JykKICAqLwogc3RhdGljIGludCBfX2luaXQgcGxhdGludW1mYl9zZXR1cChjaGFyICpvcHRpb25zKQogewpAQCAtNjgzLDcgKzY4Myw3IEBACiAJCS5vZl9tYXRjaF90YWJsZSA9IHBsYXRpbnVtZmJfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gcGxhdGludW1mYl9wcm9iZSwKLQkucmVtb3ZlCQk9IHBsYXRpbnVtZmJfcmVtb3ZlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocGxhdGludW1mYl9yZW1vdmUpLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcGxhdGludW1mYl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMKaW5kZXggMjdmOTNhYS4uZGM3YmZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbTJmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG0yZmIuYwpAQCAtOTczLDggKzk3Myw4IEBACiB7CiAJc3RydWN0IHBtMmZiX3BhciAqcCA9IGluZm8tPnBhcjsKIAl1MzIgYmFzZTsKLQl1MzIgZGVwdGggPSAodmFyLT5iaXRzX3Blcl9waXhlbCArIDcpICYgfjc7Ci0JdTMyIHhyZXMgPSAodmFyLT54cmVzICsgMzEpICYgfjMxOworCXUzMiBkZXB0aCA9IChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgKyA3KSAmIH43OworCXUzMiB4cmVzID0gKGluZm8tPnZhci54cmVzICsgMzEpICYgfjMxOwogCiAJZGVwdGggPSAoZGVwdGggPiAzMikgPyAzMiA6IGRlcHRoOwogCWJhc2UgPSB0bzMyNjQodmFyLT55b2Zmc2V0ICogeHJlcyArIHZhci0+eG9mZnNldCwgZGVwdGgsIDEpOwpAQCAtMTc3Myw3ICsxNzczLDcgQEAKIAogI2lmbmRlZiBNT0RVTEUKIC8qKgotICogUGFyc2UgdXNlciBzcGVmaWNpZWQgb3B0aW9ucy4KKyAqIFBhcnNlIHVzZXIgc3BlY2lmaWVkIG9wdGlvbnMuCiAgKgogICogVGhpcyBpcywgY29tbWEtc2VwYXJhdGVkIG9wdGlvbnMgZm9sbG93aW5nIGB2aWRlbz1wbTJmYjonLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKaW5kZXggNjY2NmY0NS4uNjYzMmVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbTNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwpAQCAtMTE0Nyw5ICsxMTQ3LDkgQEAKIAkJCQkgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHBtM19wYXIgKnBhciA9IGluZm8tPnBhcjsKLQljb25zdCB1MzIgeHJlcyA9ICh2YXItPnhyZXMgKyAzMSkgJiB+MzE7CisJY29uc3QgdTMyIHhyZXMgPSAoaW5mby0+dmFyLnhyZXMgKyAzMSkgJiB+MzE7CiAKLQlwYXItPmJhc2UgPSBwbTNmYl9zaGlmdF9icHAodmFyLT5iaXRzX3Blcl9waXhlbCwKKwlwYXItPmJhc2UgPSBwbTNmYl9zaGlmdF9icHAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLAogCQkJCQkodmFyLT55b2Zmc2V0ICogeHJlcykKIAkJCQkJKyB2YXItPnhvZmZzZXQpOwogCVBNM19XQUlUKHBhciwgMSk7CkBAIC0xNTI1LDcgKzE1MjUsNyBAQAogewogCWNoYXIgKnRoaXNfb3B0OwogCi0JLyogUGFyc2UgdXNlciBzcGVmaWNpZWQgb3B0aW9ucyAoYHZpZGVvPXBtM2ZiOicpICovCisJLyogUGFyc2UgdXNlciBzcGVjaWZpZWQgb3B0aW9ucyAoYHZpZGVvPXBtM2ZiOicpICovCiAJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG54NDAwOC9zZHVtLmMgYi9kcml2ZXJzL3ZpZGVvL3BueDQwMDgvc2R1bS5jCmluZGV4IDVlYzRmMmQuLjUwZTAwMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG54NDAwOC9zZHVtLmMKKysrIGIvZHJpdmVycy92aWRlby9wbng0MDA4L3NkdW0uYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2luY2x1ZGUgInNkdW0uaCIKICNpbmNsdWRlICJmYmNvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wczNmYi5jIGIvZHJpdmVycy92aWRlby9wczNmYi5jCmluZGV4IDY1NTYwYTEuLjIxM2ZiYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHMzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BzM2ZiLmMKQEAgLTEwODIsNyArMTA4Miw3IEBACiAJfQogCiAJcmV0dmFsID0gcmVxdWVzdF9pcnEocHMzZmIuaXJxX25vLCBwczNmYl92c3luY19pbnRlcnJ1cHQsCi0JCQkgICAgIElSUUZfRElTQUJMRUQsIERFVklDRV9OQU1FLCAmZGV2LT5jb3JlKTsKKwkJCSAgICAgMCwgREVWSUNFX05BTUUsICZkZXYtPmNvcmUpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCiAJCQlyZXR2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGEzeHgtZ2N1LmMgYi9kcml2ZXJzL3ZpZGVvL3B4YTN4eC1nY3UuYwppbmRleCAwMjgzYzcwLi4xZWQ4YjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3B4YTN4eC1nY3UuYworKysgYi9kcml2ZXJzL3ZpZGVvL3B4YTN4eC1nY3UuYwpAQCAtMzEsOCArMzEsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KQEAgLTY3OCw3ICs2NzYsNyBAQAogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcHhhM3h4X2djdV9oYW5kbGVfaXJxLAotCQkJICBJUlFGX0RJU0FCTEVELCBEUlZfTkFNRSwgcHJpdik7CisJCQkgIDAsIERSVl9OQU1FLCBwcml2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKIAkJcmV0ID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGFmYi5jIGIvZHJpdmVycy92aWRlby9weGFmYi5jCmluZGV4IDBmNGU4YzkuLjFkMWU0ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKQEAgLTEzMDksMTYgKzEzMDksNiBAQAogCXJldHVybiAwOwogfQogI2Vsc2UKLWludCBweGFmYl9zbWFydF9xdWV1ZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdWludDE2X3QgKmNtZHMsIGludCBuX2NtZHMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBweGFmYl9zbWFydF9mbHVzaChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgcHhhZmJfc21hcnRfaW5pdChzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpKSB7IHJldHVybiAwOyB9CiAjZW5kaWYgLyogQ09ORklHX0ZCX1BYQV9TTUFSVFBBTkVMICovCiAKQEAgLTIxOTEsNyArMjE4MSw3IEBACiAJCWdvdG8gZmFpbGVkX2ZyZWVfbWVtOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcHhhZmJfaGFuZGxlX2lycSwgSVJRRl9ESVNBQkxFRCwgIkxDRCIsIGZiaSk7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBweGFmYl9oYW5kbGVfaXJxLCAwLCAiTENEIiwgZmJpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJcmV0ID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zM2MtZmIuYyBiL2RyaXZlcnMvdmlkZW8vczNjLWZiLmMKaW5kZXggNGFlY2YyMS4uMDc1M2IxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zM2MtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MzYy1mYi5jCkBAIC04MSw2ICs4MSw3IEBACiAgKiBAcGFsZXR0ZTogQWRkcmVzcyBvZiBwYWxldHRlIG1lbW9yeSwgb3IgMCBpZiBub25lLgogICogQGhhc19wcnRjb246IFNldCBpZiBoYXMgUFJUQ09OIHJlZ2lzdGVyLgogICogQGhhc19zaGFkb3djb246IFNldCBpZiBoYXMgU0hBRE9XQ09OIHJlZ2lzdGVyLgorICogQGhhc19jbGtzZWw6IFNldCBpZiBWSURDT04wIHJlZ2lzdGVyIGhhcyBDTEtTRUwgYml0LgogICovCiBzdHJ1Y3QgczNjX2ZiX3ZhcmlhbnQgewogCXVuc2lnbmVkIGludAlpc18yNDQzOjE7CkBAIC05OCw2ICs5OSw3IEBACiAKIAl1bnNpZ25lZCBpbnQJaGFzX3BydGNvbjoxOwogCXVuc2lnbmVkIGludAloYXNfc2hhZG93Y29uOjE7CisJdW5zaWduZWQgaW50CWhhc19jbGtzZWw6MTsKIH07CiAKIC8qKgpAQCAtMTg2LDYgKzE4OCw3IEBACiAgKiBAZGV2OiBUaGUgZGV2aWNlIHRoYXQgd2UgYm91bmQgdG8sIGZvciBwcmludGluZywgZXRjLgogICogQHJlZ3NfcmVzOiBUaGUgcmVzb3VyY2Ugd2UgY2xhaW1lZCBmb3IgdGhlIElPIHJlZ2lzdGVycy4KICAqIEBidXNfY2xrOiBUaGUgY2xrIChoY2xrKSBmZWVkaW5nIG91ciBpbnRlcmZhY2UgYW5kIHBvc3NpYmx5IHBpeGNsay4KKyAqIEBsY2RfY2xrOiBUaGUgY2xrIChzY2xrKSBmZWVkaW5nIHBpeGNsay4KICAqIEByZWdzOiBUaGUgbWFwcGVkIGhhcmR3YXJlIHJlZ2lzdGVycy4KICAqIEB2YXJpYW50OiBWYXJpYW50IGluZm9ybWF0aW9uIGZvciB0aGlzIGhhcmR3YXJlLgogICogQGVuYWJsZWQ6IEEgYml0bWFzayBvZiBlbmFibGVkIGhhcmR3YXJlIHdpbmRvd3MuCkBAIC0yMDAsNiArMjAzLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCByZXNvdXJjZQkJKnJlZ3NfcmVzOwogCXN0cnVjdCBjbGsJCSpidXNfY2xrOworCXN0cnVjdCBjbGsJCSpsY2RfY2xrOwogCXZvaWQgX19pb21lbQkJKnJlZ3M7CiAJc3RydWN0IHMzY19mYl92YXJpYW50CSB2YXJpYW50OwogCkBAIC0zMzYsMTAgKzM0MCwxNSBAQAogICovCiBzdGF0aWMgaW50IHMzY19mYl9jYWxjX3BpeGNsayhzdHJ1Y3QgczNjX2ZiICpzZmIsIHVuc2lnbmVkIGludCBwaXhjbGspCiB7Ci0JdW5zaWduZWQgbG9uZyBjbGsgPSBjbGtfZ2V0X3JhdGUoc2ZiLT5idXNfY2xrKTsKKwl1bnNpZ25lZCBsb25nIGNsazsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOwogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAKKwlpZiAoc2ZiLT52YXJpYW50Lmhhc19jbGtzZWwpCisJCWNsayA9IGNsa19nZXRfcmF0ZShzZmItPmJ1c19jbGspOworCWVsc2UKKwkJY2xrID0gY2xrX2dldF9yYXRlKHNmYi0+bGNkX2Nsayk7CisKIAl0bXAgPSAodW5zaWduZWQgbG9uZyBsb25nKWNsazsKIAl0bXAgKj0gcGl4Y2xrOwogCkBAIC04ODMsNyArODkyLDcgQEAKIAkJfQogCX0KIAkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgZGlzcGxheWVkIGFyZWEgKi8KLQllbmRfYm9mZiA9IHN0YXJ0X2JvZmYgKyB2YXItPnlyZXMgKiBpbmZvLT5maXgubGluZV9sZW5ndGg7CisJZW5kX2JvZmYgPSBzdGFydF9ib2ZmICsgaW5mby0+dmFyLnlyZXMgKiBpbmZvLT5maXgubGluZV9sZW5ndGg7CiAKIAkvKiBUZW1wb3JhcmlseSB0dXJuIG9mZiBwZXItdnN5bmMgdXBkYXRlIGZyb20gc2hhZG93IHJlZ2lzdGVycyB1bnRpbAogCSAqIGJvdGggc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgYXJlIHVwZGF0ZWQgdG8gcHJldmVudCBjb3JydXB0aW9uICovCkBAIC0xMzU0LDEzICsxMzYzLDI0IEBACiAKIAljbGtfZW5hYmxlKHNmYi0+YnVzX2Nsayk7CiAKKwlpZiAoIXNmYi0+dmFyaWFudC5oYXNfY2xrc2VsKSB7CisJCXNmYi0+bGNkX2NsayA9IGNsa19nZXQoZGV2LCAic2Nsa19maW1kIik7CisJCWlmIChJU19FUlIoc2ZiLT5sY2RfY2xrKSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGxjZCBjbG9ja1xuIik7CisJCQlyZXQgPSBQVFJfRVJSKHNmYi0+bGNkX2Nsayk7CisJCQlnb3RvIGVycl9idXNfY2xrOworCQl9CisKKwkJY2xrX2VuYWJsZShzZmItPmxjZF9jbGspOworCX0KKwogCXBtX3J1bnRpbWVfZW5hYmxlKHNmYi0+ZGV2KTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZmluZCByZWdpc3RlcnNcbiIpOwogCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycl9jbGs7CisJCWdvdG8gZXJyX2xjZF9jbGs7CiAJfQogCiAJc2ZiLT5yZWdzX3JlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCkBAIC0xMzY4LDcgKzEzODgsNyBAQAogCWlmICghc2ZiLT5yZWdzX3JlcykgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjbGFpbSByZWdpc3RlciByZWdpb25cbiIpOwogCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycl9jbGs7CisJCWdvdG8gZXJyX2xjZF9jbGs7CiAJfQogCiAJc2ZiLT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwpAQCAtMTQ1MCw3ICsxNDcwLDEzIEBACiBlcnJfcmVxX3JlZ2lvbjoKIAlyZWxlYXNlX21lbV9yZWdpb24oc2ZiLT5yZWdzX3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoc2ZiLT5yZWdzX3JlcykpOwogCi1lcnJfY2xrOgorZXJyX2xjZF9jbGs6CisJaWYgKCFzZmItPnZhcmlhbnQuaGFzX2Nsa3NlbCkgeworCQljbGtfZGlzYWJsZShzZmItPmxjZF9jbGspOworCQljbGtfcHV0KHNmYi0+bGNkX2Nsayk7CisJfQorCitlcnJfYnVzX2NsazoKIAljbGtfZGlzYWJsZShzZmItPmJ1c19jbGspOwogCWNsa19wdXQoc2ZiLT5idXNfY2xrKTsKIApAQCAtMTQ4MSw2ICsxNTA3LDExIEBACiAKIAlpb3VubWFwKHNmYi0+cmVncyk7CiAKKwlpZiAoIXNmYi0+dmFyaWFudC5oYXNfY2xrc2VsKSB7CisJCWNsa19kaXNhYmxlKHNmYi0+bGNkX2Nsayk7CisJCWNsa19wdXQoc2ZiLT5sY2RfY2xrKTsKKwl9CisKIAljbGtfZGlzYWJsZShzZmItPmJ1c19jbGspOwogCWNsa19wdXQoc2ZiLT5idXNfY2xrKTsKIApAQCAtMTUxMCw2ICsxNTQxLDkgQEAKIAkJczNjX2ZiX2JsYW5rKEZCX0JMQU5LX1BPV0VSRE9XTiwgd2luLT5mYmluZm8pOwogCX0KIAorCWlmICghc2ZiLT52YXJpYW50Lmhhc19jbGtzZWwpCisJCWNsa19kaXNhYmxlKHNmYi0+bGNkX2Nsayk7CisKIAljbGtfZGlzYWJsZShzZmItPmJ1c19jbGspOwogCXJldHVybiAwOwogfQpAQCAtMTUyNCw2ICsxNTU4LDkgQEAKIAogCWNsa19lbmFibGUoc2ZiLT5idXNfY2xrKTsKIAorCWlmICghc2ZiLT52YXJpYW50Lmhhc19jbGtzZWwpCisJCWNsa19lbmFibGUoc2ZiLT5sY2RfY2xrKTsKKwogCS8qIHNldHVwIGdwaW8gYW5kIG91dHB1dCBwb2xhcml0eSBjb250cm9scyAqLwogCXBkLT5zZXR1cF9ncGlvKCk7CiAJd3JpdGVsKHBkLT52aWRjb24xLCBzZmItPnJlZ3MgKyBWSURDT04xKTsKQEAgLTE1NjksNiArMTYwNiw5IEBACiAJCXMzY19mYl9ibGFuayhGQl9CTEFOS19QT1dFUkRPV04sIHdpbi0+ZmJpbmZvKTsKIAl9CiAKKwlpZiAoIXNmYi0+dmFyaWFudC5oYXNfY2xrc2VsKQorCQljbGtfZGlzYWJsZShzZmItPmxjZF9jbGspOworCiAJY2xrX2Rpc2FibGUoc2ZiLT5idXNfY2xrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1ODMsNiArMTYyMyw5IEBACiAKIAljbGtfZW5hYmxlKHNmYi0+YnVzX2Nsayk7CiAKKwlpZiAoIXNmYi0+dmFyaWFudC5oYXNfY2xrc2VsKQorCQljbGtfZW5hYmxlKHNmYi0+bGNkX2Nsayk7CisKIAkvKiBzZXR1cCBncGlvIGFuZCBvdXRwdXQgcG9sYXJpdHkgY29udHJvbHMgKi8KIAlwZC0+c2V0dXBfZ3BpbygpOwogCXdyaXRlbChwZC0+dmlkY29uMSwgc2ZiLT5yZWdzICsgVklEQ09OMSk7CkBAIC0xNzU1LDYgKzE3OTgsNyBAQAogCQl9LAogCiAJCS5oYXNfcHJ0Y29uCT0gMSwKKwkJLmhhc19jbGtzZWwJPSAxLAogCX0sCiAJLndpblswXQk9ICZzM2NfZmJfZGF0YV82NHh4X3dpbnNbMF0sCiAJLndpblsxXQk9ICZzM2NfZmJfZGF0YV82NHh4X3dpbnNbMV0sCkBAIC0xNzg1LDYgKzE4MjksNyBAQAogCQl9LAogCiAJCS5oYXNfcHJ0Y29uCT0gMSwKKwkJLmhhc19jbGtzZWwJPSAxLAogCX0sCiAJLndpblswXQk9ICZzM2NfZmJfZGF0YV9zNXBfd2luc1swXSwKIAkud2luWzFdCT0gJnMzY19mYl9kYXRhX3M1cF93aW5zWzFdLApAQCAtMTgxNSw2ICsxODYwLDM3IEBACiAJCX0sCiAKIAkJLmhhc19zaGFkb3djb24JPSAxLAorCQkuaGFzX2Nsa3NlbAk9IDEsCisJfSwKKwkud2luWzBdCT0gJnMzY19mYl9kYXRhX3M1cF93aW5zWzBdLAorCS53aW5bMV0JPSAmczNjX2ZiX2RhdGFfczVwX3dpbnNbMV0sCisJLndpblsyXQk9ICZzM2NfZmJfZGF0YV9zNXBfd2luc1syXSwKKwkud2luWzNdCT0gJnMzY19mYl9kYXRhX3M1cF93aW5zWzNdLAorCS53aW5bNF0JPSAmczNjX2ZiX2RhdGFfczVwX3dpbnNbNF0sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19mYl9kcml2ZXJkYXRhIHMzY19mYl9kYXRhX2V4eW5vczQgPSB7CisJLnZhcmlhbnQgPSB7CisJCS5ucl93aW5kb3dzCT0gNSwKKwkJLnZpZHRjb24JPSBWSURUQ09OMCwKKwkJLndpbmNvbgkJPSBXSU5DT04oMCksCisJCS53aW5tYXAJCT0gV0lOeE1BUCgwKSwKKwkJLmtleWNvbgkJPSBXS0VZQ09OLAorCQkub3NkCQk9IFZJRE9TRF9CQVNFLAorCQkub3NkX3N0cmlkZQk9IDE2LAorCQkuYnVmX3N0YXJ0CT0gVklEV19CVUZfU1RBUlQoMCksCisJCS5idWZfc2l6ZQk9IFZJRFdfQlVGX1NJWkUoMCksCisJCS5idWZfZW5kCT0gVklEV19CVUZfRU5EKDApLAorCisJCS5wYWxldHRlID0geworCQkJWzBdID0gMHgyNDAwLAorCQkJWzFdID0gMHgyODAwLAorCQkJWzJdID0gMHgyYzAwLAorCQkJWzNdID0gMHgzMDAwLAorCQkJWzRdID0gMHgzNDAwLAorCQl9LAorCisJCS5oYXNfc2hhZG93Y29uCT0gMSwKIAl9LAogCS53aW5bMF0JPSAmczNjX2ZiX2RhdGFfczVwX3dpbnNbMF0sCiAJLndpblsxXQk9ICZzM2NfZmJfZGF0YV9zNXBfd2luc1sxXSwKQEAgLTE4NDMsNiArMTkxOSw3IEBACiAJCQlbMF0gPSAweDQwMCwKIAkJCVsxXSA9IDB4ODAwLAogCQl9LAorCQkuaGFzX2Nsa3NlbAk9IDEsCiAJfSwKIAkud2luWzBdID0gJihzdHJ1Y3QgczNjX2ZiX3dpbl92YXJpYW50KSB7CiAJCS5wYWxldHRlX3N6CT0gMjU2LApAQCAtMTg1OSw2ICsxOTM2LDMwIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX2RyaXZlcmRhdGEgczNjX2ZiX2RhdGFfczVwNjR4MCA9IHsKKwkudmFyaWFudCA9IHsKKwkJLm5yX3dpbmRvd3MJPSAzLAorCQkudmlkdGNvbgk9IFZJRFRDT04wLAorCQkud2luY29uCQk9IFdJTkNPTigwKSwKKwkJLndpbm1hcAkJPSBXSU54TUFQKDApLAorCQkua2V5Y29uCQk9IFdLRVlDT04sCisJCS5vc2QJCT0gVklET1NEX0JBU0UsCisJCS5vc2Rfc3RyaWRlCT0gMTYsCisJCS5idWZfc3RhcnQJPSBWSURXX0JVRl9TVEFSVCgwKSwKKwkJLmJ1Zl9zaXplCT0gVklEV19CVUZfU0laRSgwKSwKKwkJLmJ1Zl9lbmQJPSBWSURXX0JVRl9FTkQoMCksCisKKwkJLnBhbGV0dGUgPSB7CisJCQlbMF0gPSAweDI0MDAsCisJCQlbMV0gPSAweDI4MDAsCisJCQlbMl0gPSAweDJjMDAsCisJCX0sCisJfSwKKwkud2luWzBdID0gJnMzY19mYl9kYXRhX3M1cF93aW5zWzBdLAorCS53aW5bMV0gPSAmczNjX2ZiX2RhdGFfczVwX3dpbnNbMV0sCisJLndpblsyXSA9ICZzM2NfZmJfZGF0YV9zNXBfd2luc1syXSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHMzY19mYl9kcml2ZXJfaWRzW10gPSB7CiAJewogCQkubmFtZQkJPSAiczNjLWZiIiwKQEAgLTE4NzAsOCArMTk3MSwxNCBAQAogCQkubmFtZQkJPSAiczVwdjIxMC1mYiIsCiAJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSZzM2NfZmJfZGF0YV9zNXB2MjEwLAogCX0sIHsKKwkJLm5hbWUJCT0gImV4eW5vczQtZmIiLAorCQkuZHJpdmVyX2RhdGEJPSAodW5zaWduZWQgbG9uZykmczNjX2ZiX2RhdGFfZXh5bm9zNCwKKwl9LCB7CiAJCS5uYW1lCQk9ICJzM2MyNDQzLWZiIiwKIAkJLmRyaXZlcl9kYXRhCT0gKHVuc2lnbmVkIGxvbmcpJnMzY19mYl9kYXRhX3MzYzI0NDMsCisJfSwgeworCQkubmFtZQkJPSAiczVwNjR4MC1mYiIsCisJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSZzM2NfZmJfZGF0YV9zNXA2NHgwLAogCX0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYyBiL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMKaW5kZXggMGFhMTM3Ni4uZWU0YzBkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCkBAIC03NjcsNyArNzY3LDYgQEAKIHN0YXRpYyBpbnQgczNjMjQxMGZiX2NwdWZyZXFfdHJhbnNpdGlvbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCQl1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqZnJlcXMgPSBkYXRhOwogCXN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZmJfaW5mbyAqZmJpbmZvOwogCWxvbmcgZGVsdGFfZjsKQEAgLTkxMSw3ICs5MTAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKIAkJaW5mby0+cGFsZXR0ZV9idWZmZXJbaV0gPSBQQUxFVFRFX0JVRkZfQ0xFQVI7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHMzYzI0MTBmYl9pcnEsIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIGluZm8pOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgczNjMjQxMGZiX2lycSwgMCwgcGRldi0+bmFtZSwgaW5mbyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IGlycSAlZCAtIGVyciAlZFxuIiwgaXJxLCByZXQpOwogCQlyZXQgPSAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3MzZmIuYyBiL2RyaXZlcnMvdmlkZW8vczNmYi5jCmluZGV4IDRjYTVkMGMuLjk0NmE5NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vczNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vczNmYi5jCkBAIC0xMDE5LDEyICsxMDE5LDEzIEBACiAJdW5zaWduZWQgaW50IG9mZnNldDsKIAogCS8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0ICovCi0JaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMCkgewotCQlvZmZzZXQgPSAodmFyLT55b2Zmc2V0IC8gMTYpICogKHZhci0+eHJlc192aXJ0dWFsIC8gMikgKyAodmFyLT54b2Zmc2V0IC8gMik7CisJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSAwKSB7CisJCW9mZnNldCA9ICh2YXItPnlvZmZzZXQgLyAxNikgKiAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCAvIDIpCisJCSAgICAgICArICh2YXItPnhvZmZzZXQgLyAyKTsKIAkJb2Zmc2V0ID0gb2Zmc2V0ID4+IDI7CiAJfSBlbHNlIHsKIAkJb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCkgKwotCQkJICh2YXItPnhvZmZzZXQgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCk7CisJCQkgKHZhci0+eG9mZnNldCAqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOwogCQlvZmZzZXQgPSBvZmZzZXQgPj4gMjsKIAl9CiAKQEAgLTE1MDQsNyArMTUwNSw3IEBACiAJLnJlc3VtZQkJPSBzM19wY2lfcmVzdW1lLAogfTsKIAotLyogUGFyc2UgdXNlciBzcGVmaWNpZWQgb3B0aW9ucyAqLworLyogUGFyc2UgdXNlciBzcGVjaWZpZWQgb3B0aW9ucyAqLwogCiAjaWZuZGVmIE1PRFVMRQogc3RhdGljIGludCAgX19pbml0IHMzZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2ExMTAwZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2ExMTAwZmIuYwppbmRleCBlOGI3NmQ2Li45OGQ1NWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhMTEwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zYTExMDBmYi5jCkBAIC0xNDU3LDggKzE0NTcsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBzYTExMDBmYl9oYW5kbGVfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkJICAiTENEIiwgZmJpKTsKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHNhMTEwMGZiX2hhbmRsZV9pcnEsIDAsICJMQ0QiLCBmYmkpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzYTExMDBmYjogcmVxdWVzdF9pcnEgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJZ290byBmYWlsZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9hY2NlbC5jIGIvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfYWNjZWwuYwppbmRleCBiYmNjMDU1Li5iZmVmYTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2FjY2VsLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAic2F2YWdlZmIuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfZHJpdmVyLmMgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwppbmRleCA0ZGU1NDFjLi5iZWI0OTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwpAQCAtMTQ3NywxNSArMTQ3Nyw5IEBACiAJdmdhSFdQcm90ZWN0KHBhciwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNhdmFnZWZiX3VwZGF0ZV9zdGFydChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICAgICAgKnBhciwKLQkJCQkgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQorc3RhdGljIHZvaWQgc2F2YWdlZmJfdXBkYXRlX3N0YXJ0KHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciwgaW50IGJhc2UpCiB7Ci0JaW50IGJhc2U7Ci0KLQliYXNlID0gKCh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCArICh2YXItPnhvZmZzZXQgJiB+MSkpCi0JCSogKCh2YXItPmJpdHNfcGVyX3BpeGVsKzcpIC8gOCkpID4+IDI7Ci0KLQkvKiBub3cgcHJvZ3JhbSB0aGUgc3RhcnQgYWRkcmVzcyByZWdpc3RlcnMgKi8KKwkvKiBwcm9ncmFtIHRoZSBzdGFydCBhZGRyZXNzIHJlZ2lzdGVycyAqLwogCXZnYV9vdXQxNigweDNkNCwgKGJhc2UgJiAweDAwZmYwMCkgfCAweDBjLCBwYXIpOwogCXZnYV9vdXQxNigweDNkNCwgKChiYXNlICYgMHgwMGZmKSA8PCA4KSB8IDB4MGQsIHBhcik7CiAJdmdhX291dDgoMHgzZDQsIDB4NjksIHBhcik7CkBAIC0xNTUwLDggKzE1NDQsMTIgQEAKIAkJCQlzdHJ1Y3QgZmJfaW5mbyAgICAgICAgICAgKmluZm8pCiB7CiAJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCWludCBiYXNlOwogCi0Jc2F2YWdlZmJfdXBkYXRlX3N0YXJ0KHBhciwgdmFyKTsKKwliYXNlID0gKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aAorCSAgICAgKyAodmFyLT54b2Zmc2V0ICYgfjEpICogKChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwrNykgLyA4KSkgPj4gMjsKKworCXNhdmFnZWZiX3VwZGF0ZV9zdGFydChwYXIsIGJhc2UpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NoX21pcGlfZHNpLmMgYi9kcml2ZXJzL3ZpZGVvL3NoX21pcGlfZHNpLmMKaW5kZXggMjQ2NDBjOC4uNzJlZTk2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaF9taXBpX2RzaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2hfbWlwaV9kc2kuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8dmlkZW8vbWlwaV9kaXNwbGF5Lmg+CiAjaW5jbHVkZSA8dmlkZW8vc2hfbWlwaV9kc2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYwppbmRleCA3ZDU0ZTJjLi42NDdiYTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9oZG1pLmMKKysrIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfaGRtaS5jCkBAIC0xMTExLDYgKzExMTEsNyBAQAogc3RhdGljIHZvaWQgc2hfaGRtaV9lZGlkX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBzaF9oZG1pICpoZG1pID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzaF9oZG1pLCBlZGlkX3dvcmsud29yayk7CisJc3RydWN0IGZiX2luZm8gKmluZm87CiAJc3RydWN0IHNoX21vYmlsZV9oZG1pX2luZm8gKnBkYXRhID0gaGRtaS0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaDsKIAlpbnQgcmV0OwpAQCAtMTEyMyw4ICsxMTI0LDkgQEAKIAogCW11dGV4X2xvY2soJmhkbWktPm11dGV4KTsKIAorCWluZm8gPSBoZG1pLT5pbmZvOworCiAJaWYgKGhkbWktPmhwX3N0YXRlID09IEhETUlfSE9UUExVR19DT05ORUNURUQpIHsKLQkJc3RydWN0IGZiX2luZm8gKmluZm8gPSBoZG1pLT5pbmZvOwogCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gMCwgaGRtaV9yYXRlOwogCiAJCXJldCA9IHNoX2hkbWlfcmVhZF9lZGlkKGhkbWksICZoZG1pX3JhdGUsICZwYXJlbnRfcmF0ZSk7CkBAIC0xMTQ4LDQyICsxMTUwLDQ1IEBACiAKIAkJY2ggPSBpbmZvLT5wYXI7CiAKLQkJY29uc29sZV9sb2NrKCk7CisJCWlmIChsb2NrX2ZiX2luZm8oaW5mbykpIHsKKwkJCWNvbnNvbGVfbG9jaygpOwogCi0JCS8qIEhETUkgcGx1ZyBpbiAqLwotCQlpZiAoIXNoX2hkbWlfbXVzdF9yZWNvbmZpZ3VyZShoZG1pKSAmJgotCQkgICAgaW5mby0+c3RhdGUgPT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpIHsKLQkJCS8qCi0JCQkgKiBGaXJzdCBhY3RpdmF0aW9uIHdpdGggdGhlIGRlZmF1bHQgbW9uaXRvciAtIGp1c3QgdHVybgotCQkJICogb24sIGlmIHdlIHJ1biBhIHJlc3VtZSBoZXJlLCB0aGUgbG9nbyBkaXNhcHBlYXJzCi0JCQkgKi8KLQkJCWlmIChsb2NrX2ZiX2luZm8oaW5mbykpIHsKKwkJCS8qIEhETUkgcGx1ZyBpbiAqLworCQkJaWYgKCFzaF9oZG1pX211c3RfcmVjb25maWd1cmUoaGRtaSkgJiYKKwkJCSAgICBpbmZvLT5zdGF0ZSA9PSBGQklORk9fU1RBVEVfUlVOTklORykgeworCQkJCS8qCisJCQkJICogRmlyc3QgYWN0aXZhdGlvbiB3aXRoIHRoZSBkZWZhdWx0IG1vbml0b3IgLSBqdXN0IHR1cm4KKwkJCQkgKiBvbiwgaWYgd2UgcnVuIGEgcmVzdW1lIGhlcmUsIHRoZSBsb2dvIGRpc2FwcGVhcnMKKwkJCQkgKi8KIAkJCQlpbmZvLT52YXIud2lkdGggPSBoZG1pLT52YXIud2lkdGg7CiAJCQkJaW5mby0+dmFyLmhlaWdodCA9IGhkbWktPnZhci5oZWlnaHQ7CiAJCQkJc2hfaGRtaV9kaXNwbGF5X29uKGhkbWksIGluZm8pOwotCQkJCXVubG9ja19mYl9pbmZvKGluZm8pOworCQkJfSBlbHNlIHsKKwkJCQkvKiBOZXcgbW9uaXRvciBvciBoYXZlIHRvIHdha2UgdXAgKi8KKwkJCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIE5ldyBtb25pdG9yIG9yIGhhdmUgdG8gd2FrZSB1cCAqLwotCQkJZmJfc2V0X3N1c3BlbmQoaW5mbywgMCk7Ci0JCX0KIAotCQljb25zb2xlX3VubG9jaygpOworCQkJY29uc29sZV91bmxvY2soKTsKKwkJCXVubG9ja19mYl9pbmZvKGluZm8pOworCQl9CiAJfSBlbHNlIHsKIAkJcmV0ID0gMDsKLQkJaWYgKCFoZG1pLT5pbmZvKQorCQlpZiAoIWluZm8pCiAJCQlnb3RvIG91dDsKIAogCQloZG1pLT5tb25zcGVjLm1vZGVkYl9sZW4gPSAwOwogCQlmYl9kZXN0cm95X21vZGVkYihoZG1pLT5tb25zcGVjLm1vZGVkYik7CiAJCWhkbWktPm1vbnNwZWMubW9kZWRiID0gTlVMTDsKIAotCQljb25zb2xlX2xvY2soKTsKKwkJaWYgKGxvY2tfZmJfaW5mbyhpbmZvKSkgeworCQkJY29uc29sZV9sb2NrKCk7CiAKLQkJLyogSERNSSBkaXNjb25uZWN0ICovCi0JCWZiX3NldF9zdXNwZW5kKGhkbWktPmluZm8sIDEpOworCQkJLyogSERNSSBkaXNjb25uZWN0ICovCisJCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAxKTsKIAotCQljb25zb2xlX3VubG9jaygpOworCQkJY29uc29sZV91bmxvY2soKTsKKwkJCXVubG9ja19mYl9pbmZvKGluZm8pOworCQl9CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jCmluZGV4IGIwNDg0MTcuLmZhY2ZmYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jCkBAIC0yMyw0MCArMjMsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CisjaW5jbHVkZSA8dmlkZW8vc2hfbW9iaWxlX21lcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKICNpbmNsdWRlICJzaF9tb2JpbGVfbGNkY2ZiLmgiCi0jaW5jbHVkZSAic2hfbW9iaWxlX21lcmFtLmgiCiAKICNkZWZpbmUgU0lERV9CX09GRlNFVCAweDEwMDAKICNkZWZpbmUgTUlSUk9SX09GRlNFVCAweDIwMDAKIAotLyogc2hhcmVkIHJlZ2lzdGVycyAqLwotI2RlZmluZSBfTEREQ0tSIDB4NDEwCi0jZGVmaW5lIF9MRERDS1NUUFIgMHg0MTQKLSNkZWZpbmUgX0xESU5UUiAweDQ2OAotI2RlZmluZSBfTERTUiAweDQ2YwotI2RlZmluZSBfTERDTlQxUiAweDQ3MAotI2RlZmluZSBfTERDTlQyUiAweDQ3NAotI2RlZmluZSBfTERSQ05UUiAweDQ3OAotI2RlZmluZSBfTERERFNSIDB4NDdjCi0jZGVmaW5lIF9MRERXRDBSIDB4ODAwCi0jZGVmaW5lIF9MRERSRFIgMHg4NDAKLSNkZWZpbmUgX0xERFdBUiAweDkwMAotI2RlZmluZSBfTEREUkFSIDB4OTA0Ci0KLS8qIHNoYXJlZCByZWdpc3RlcnMgYW5kIHRoZWlyIG9yZGVyIGZvciBjb250ZXh0IHNhdmUvcmVzdG9yZSAqLwotc3RhdGljIGludCBsY2RjX3NoYXJlZF9yZWdzW10gPSB7Ci0JX0xERENLUiwKLQlfTEREQ0tTVFBSLAotCV9MRElOVFIsCi0JX0xERERTUiwKLQlfTERDTlQxUiwKLQlfTERDTlQyUiwKLX07Ci0jZGVmaW5lIE5SX1NIQVJFRF9SRUdTIEFSUkFZX1NJWkUobGNkY19zaGFyZWRfcmVncykKLQogI2RlZmluZSBNQVhfWFJFUyAxOTIwCiAjZGVmaW5lIE1BWF9ZUkVTIDEwODAKIApAQCAtOTgsMjIgKzc0LDYgQEAKIAlbTERQTVJdID0gMHg2M2MsCiB9OwogCi0jZGVmaW5lIFNUQVJUX0xDREMJMHgwMDAwMDAwMQotI2RlZmluZSBMQ0RDX1JFU0VUCTB4MDAwMDAxMDAKLSNkZWZpbmUgRElTUExBWV9CRVUJMHgwMDAwMDAwOAotI2RlZmluZSBMQ0RDX0VOQUJMRQkweDAwMDAwMDAxCi0jZGVmaW5lIExESU5UUl9GRQkweDAwMDAwNDAwCi0jZGVmaW5lIExESU5UUl9WU0UJMHgwMDAwMDIwMAotI2RlZmluZSBMRElOVFJfVkVFCTB4MDAwMDAxMDAKLSNkZWZpbmUgTERJTlRSX0ZTCTB4MDAwMDAwMDQKLSNkZWZpbmUgTERJTlRSX1ZTUwkweDAwMDAwMDAyCi0jZGVmaW5lIExESU5UUl9WRVMJMHgwMDAwMDAwMQotI2RlZmluZSBMRFJDTlRSX1NSUwkweDAwMDIwMDAwCi0jZGVmaW5lIExEUkNOVFJfU1JDCTB4MDAwMTAwMDAKLSNkZWZpbmUgTERSQ05UUl9NUlMJMHgwMDAwMDAwMgotI2RlZmluZSBMRFJDTlRSX01SQwkweDAwMDAwMDAxCi0jZGVmaW5lIExEU1JfTVJTCTB4MDAwMDAxMDAKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgZGVmYXVsdF83MjBwID0gewogCS5uYW1lID0gIkhETUkgNzIwcCIsCiAJLnhyZXMgPSAxMjgwLApAQCAtMTQxLDcgKzEwMSw2IEBACiAJdW5zaWduZWQgbG9uZyBsZGRja3I7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gY2hbMl07CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vdGlmaWVyOwotCXVuc2lnbmVkIGxvbmcgc2F2ZWRfc2hhcmVkX3JlZ3NbTlJfU0hBUkVEX1JFR1NdOwogCWludCBzdGFydGVkOwogCWludCBmb3JjZWRfYnBwOyAvKiAyIGNoYW5uZWwgTENEQyBtdXN0IHNoYXJlIGJwcCBzZXR0aW5nICovCiAJc3RydWN0IHNoX21vYmlsZV9tZXJhbV9pbmZvICptZXJhbV9kZXY7CkBAIC0yMTgsMzMgKzE3NywzNiBAQAogewogCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaCA9IGhhbmRsZTsKIAotCWxjZGNfd3JpdGUoY2gtPmxjZGMsIF9MRERXRDBSLCBkYXRhIHwgMHgxMDAwMDAwMCk7Ci0JbGNkY193YWl0X2JpdChjaC0+bGNkYywgX0xEU1IsIDIsIDApOwotCWxjZGNfd3JpdGUoY2gtPmxjZGMsIF9MRERXQVIsIDEgfCAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkgPyAyIDogMCkpOwotCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCAyLCAwKTsKKwlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0QwUiwgZGF0YSB8IExERFdEeFJfV0RBQ1QpOworCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCBMRFNSX0FTLCAwKTsKKwlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0FSLCBMRERXQVJfV0EgfAorCQkgICAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkgPyAyIDogMCkpOworCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCBMRFNSX0FTLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgbGNkY19zeXNfd3JpdGVfZGF0YSh2b2lkICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBoYW5kbGU7CiAKLQlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0QwUiwgZGF0YSB8IDB4MTEwMDAwMDApOwotCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCAyLCAwKTsKLQlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0FSLCAxIHwgKGxjZGNfY2hhbl9pc19zdWJsY2QoY2gpID8gMiA6IDApKTsKLQlsY2RjX3dhaXRfYml0KGNoLT5sY2RjLCBfTERTUiwgMiwgMCk7CisJbGNkY193cml0ZShjaC0+bGNkYywgX0xERFdEMFIsIGRhdGEgfCBMRERXRHhSX1dEQUNUIHwgTEREV0R4Ul9SU1cpOworCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCBMRFNSX0FTLCAwKTsKKwlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0FSLCBMRERXQVJfV0EgfAorCQkgICAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkgPyAyIDogMCkpOworCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCBMRFNSX0FTLCAwKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGNkY19zeXNfcmVhZF9kYXRhKHZvaWQgKmhhbmRsZSkKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBoYW5kbGU7CiAKLQlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREUkRSLCAweDAxMDAwMDAwKTsKLQlsY2RjX3dhaXRfYml0KGNoLT5sY2RjLCBfTERTUiwgMiwgMCk7Ci0JbGNkY193cml0ZShjaC0+bGNkYywgX0xERFJBUiwgMSB8IChsY2RjX2NoYW5faXNfc3VibGNkKGNoKSA/IDIgOiAwKSk7CisJbGNkY193cml0ZShjaC0+bGNkYywgX0xERFJEUiwgTEREUkRSX1JTUik7CisJbGNkY193YWl0X2JpdChjaC0+bGNkYywgX0xEU1IsIExEU1JfQVMsIDApOworCWxjZGNfd3JpdGUoY2gtPmxjZGMsIF9MRERSQVIsIExERFJBUl9SQSB8CisJCSAgIChsY2RjX2NoYW5faXNfc3VibGNkKGNoKSA/IDIgOiAwKSk7CiAJdWRlbGF5KDEpOwotCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCAyLCAwKTsKKwlsY2RjX3dhaXRfYml0KGNoLT5sY2RjLCBfTERTUiwgTERTUl9BUywgMCk7CiAKLQlyZXR1cm4gbGNkY19yZWFkKGNoLT5sY2RjLCBfTEREUkRSKSAmIDB4M2ZmZmY7CisJcmV0dXJuIGxjZGNfcmVhZChjaC0+bGNkYywgX0xERFJEUikgJiBMRERSRFJfRFJEX01BU0s7CiB9CiAKIHN0cnVjdCBzaF9tb2JpbGVfbGNkY19zeXNfYnVzX29wcyBzaF9tb2JpbGVfbGNkY19zeXNfYnVzX29wcyA9IHsKQEAgLTI1NiwxOCArMjE4LDIyIEBACiBzdGF0aWMgdm9pZCBzaF9tb2JpbGVfbGNkY19jbGtfb24oc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKnByaXYpCiB7CiAJaWYgKGF0b21pY19pbmNfYW5kX3Rlc3QoJnByaXYtPmh3X3VzZWNudCkpIHsKLQkJcG1fcnVudGltZV9nZXRfc3luYyhwcml2LT5kZXYpOwogCQlpZiAocHJpdi0+ZG90X2NsaykKIAkJCWNsa19lbmFibGUocHJpdi0+ZG90X2Nsayk7CisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMocHJpdi0+ZGV2KTsKKwkJaWYgKHByaXYtPm1lcmFtX2RldiAmJiBwcml2LT5tZXJhbV9kZXYtPnBkZXYpCisJCQlwbV9ydW50aW1lX2dldF9zeW5jKCZwcml2LT5tZXJhbV9kZXYtPnBkZXYtPmRldik7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBzaF9tb2JpbGVfbGNkY19jbGtfb2ZmKHN0cnVjdCBzaF9tb2JpbGVfbGNkY19wcml2ICpwcml2KQogewogCWlmIChhdG9taWNfc3ViX3JldHVybigxLCAmcHJpdi0+aHdfdXNlY250KSA9PSAtMSkgeworCQlpZiAocHJpdi0+bWVyYW1fZGV2ICYmIHByaXYtPm1lcmFtX2Rldi0+cGRldikKKwkJCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnByaXYtPm1lcmFtX2Rldi0+cGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXQocHJpdi0+ZGV2KTsKIAkJaWYgKHByaXYtPmRvdF9jbGspCiAJCQljbGtfZGlzYWJsZShwcml2LT5kb3RfY2xrKTsKLQkJcG1fcnVudGltZV9wdXQocHJpdi0+ZGV2KTsKIAl9CiB9CiAKQEAgLTMxOSwxMyArMjg1LDEzIEBACiAJCWlmIChiY2ZnLT5zdGFydF90cmFuc2ZlcikKIAkJCWJjZmctPnN0YXJ0X3RyYW5zZmVyKGJjZmctPmJvYXJkX2RhdGEsIGNoLAogCQkJCQkgICAgICZzaF9tb2JpbGVfbGNkY19zeXNfYnVzX29wcyk7Ci0JCWxjZGNfd3JpdGVfY2hhbihjaCwgTERTTTJSLCAxKTsKKwkJbGNkY193cml0ZV9jaGFuKGNoLCBMRFNNMlIsIExEU00yUl9PU1RSRyk7CiAJCWRtYV91bm1hcF9zZyhpbmZvLT5kZXYsIGNoLT5zZ2xpc3QsIG5yX3BhZ2VzLCBETUFfVE9fREVWSUNFKTsKIAl9IGVsc2UgewogCQlpZiAoYmNmZy0+c3RhcnRfdHJhbnNmZXIpCiAJCQliY2ZnLT5zdGFydF90cmFuc2ZlcihiY2ZnLT5ib2FyZF9kYXRhLCBjaCwKIAkJCQkJICAgICAmc2hfbW9iaWxlX2xjZGNfc3lzX2J1c19vcHMpOwotCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU00yUiwgMSk7CisJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERTTTJSLCBMRFNNMlJfT1NUUkcpOwogCX0KIH0KIApAQCAtMzQxLDIyICszMDcsMTYgQEAKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdiA9IGRhdGE7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gKmNoOwotCXVuc2lnbmVkIGxvbmcgdG1wOwogCXVuc2lnbmVkIGxvbmcgbGRpbnRyOwogCWludCBpc19zdWI7CiAJaW50IGs7CiAKLQkvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KLQlsZGludHIgPSB0bXAgPSBsY2RjX3JlYWQocHJpdiwgX0xESU5UUik7Ci0JLyoKLQkgKiBkaXNhYmxlIGZ1cnRoZXIgVlNZTkMgRW5kIElSUXMsIHByZXNlcnZlIGFsbCBvdGhlciBlbmFibGVkIElSUXMsCi0JICogd3JpdGUgMCB0byBiaXRzIDAtNiB0byBhY2sgYWxsIHRyaWdnZXJlZCBJUlFzLgotCSAqLwotCXRtcCAmPSAweGZmZmZmZjAwICYgfkxESU5UUl9WRUU7Ci0JbGNkY193cml0ZShwcml2LCBfTERJTlRSLCB0bXApOworCS8qIEFja25vd2xlZGdlIGludGVycnVwdHMgYW5kIGRpc2FibGUgZnVydGhlciBWU1lOQyBFbmQgSVJRcy4gKi8KKwlsZGludHIgPSBsY2RjX3JlYWQocHJpdiwgX0xESU5UUik7CisJbGNkY193cml0ZShwcml2LCBfTERJTlRSLCAobGRpbnRyIF4gTERJTlRSX1NUQVRVU19NQVNLKSAmIH5MRElOVFJfVkVFKTsKIAogCS8qIGZpZ3VyZSBvdXQgaWYgdGhpcyBpbnRlcnJ1cHQgaXMgZm9yIG1haW4gb3Igc3ViIGxjZCAqLwotCWlzX3N1YiA9IChsY2RjX3JlYWQocHJpdiwgX0xEU1IpICYgKDEgPDwgMTApKSA/IDEgOiAwOworCWlzX3N1YiA9IChsY2RjX3JlYWQocHJpdiwgX0xEU1IpICYgTERTUl9NU1MpID8gMSA6IDA7CiAKIAkvKiB3YWtlIHVwIGNoYW5uZWwgYW5kIGRpc2FibGUgY2xvY2tzICovCiAJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocHJpdi0+Y2gpOyBrKyspIHsKQEAgLTM2NSw3ICszMjUsNyBAQAogCQlpZiAoIWNoLT5lbmFibGVkKQogCQkJY29udGludWU7CiAKLQkJLyogRnJhbWUgU3RhcnQgKi8KKwkJLyogRnJhbWUgRW5kICovCiAJCWlmIChsZGludHIgJiBMRElOVFJfRlMpIHsKIAkJCWlmIChpc19zdWIgPT0gbGNkY19jaGFuX2lzX3N1YmxjZChjaCkpIHsKIAkJCQljaC0+ZnJhbWVfZW5kID0gMTsKQEAgLTM5MSwxNiArMzUxLDE3IEBACiAKIAkvKiBzdGFydCBvciBzdG9wIHRoZSBsY2RjICovCiAJaWYgKHN0YXJ0KQotCQlsY2RjX3dyaXRlKHByaXYsIF9MRENOVDJSLCB0bXAgfCBTVEFSVF9MQ0RDKTsKKwkJbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgdG1wIHwgTERDTlQyUl9ETyk7CiAJZWxzZQotCQlsY2RjX3dyaXRlKHByaXYsIF9MRENOVDJSLCB0bXAgJiB+U1RBUlRfTENEQyk7CisJCWxjZGNfd3JpdGUocHJpdiwgX0xEQ05UMlIsIHRtcCAmIH5MRENOVDJSX0RPKTsKIAogCS8qIHdhaXQgdW50aWwgcG93ZXIgaXMgYXBwbGllZC9zdG9wcGVkIG9uIGFsbCBjaGFubmVscyAqLwogCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHByaXYtPmNoKTsgaysrKQogCQlpZiAobGNkY19yZWFkKHByaXYsIF9MRENOVDJSKSAmIHByaXYtPmNoW2tdLmVuYWJsZWQpCiAJCQl3aGlsZSAoMSkgewotCQkJCXRtcCA9IGxjZGNfcmVhZF9jaGFuKCZwcml2LT5jaFtrXSwgTERQTVIpICYgMzsKLQkJCQlpZiAoc3RhcnQgJiYgdG1wID09IDMpCisJCQkJdG1wID0gbGNkY19yZWFkX2NoYW4oJnByaXYtPmNoW2tdLCBMRFBNUikKKwkJCQkgICAgJiBMRFBNUl9MUFM7CisJCQkJaWYgKHN0YXJ0ICYmIHRtcCA9PSBMRFBNUl9MUFMpCiAJCQkJCWJyZWFrOwogCQkJCWlmICghc3RhcnQgJiYgdG1wID09IDApCiAJCQkJCWJyZWFrOwpAQCAtNDE4LDEzICszNzksMTMgQEAKIAl1MzIgdG1wOwogCiAJdG1wID0gY2gtPmxkbXQxcl92YWx1ZTsKLQl0bXAgfD0gKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgPyAwIDogMSA8PCAyODsKLQl0bXAgfD0gKHZhci0+c3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKSA/IDAgOiAxIDw8IDI3OwotCXRtcCB8PSAoY2gtPmNmZy5mbGFncyAmIExDRENfRkxBR1NfRFdQT0wpID8gMSA8PCAyNiA6IDA7Ci0JdG1wIHw9IChjaC0+Y2ZnLmZsYWdzICYgTENEQ19GTEFHU19ESVBPTCkgPyAxIDw8IDI1IDogMDsKLQl0bXAgfD0gKGNoLT5jZmcuZmxhZ3MgJiBMQ0RDX0ZMQUdTX0RBUE9MKSA/IDEgPDwgMjQgOiAwOwotCXRtcCB8PSAoY2gtPmNmZy5mbGFncyAmIExDRENfRkxBR1NfSFNDTlQpID8gMSA8PCAxNyA6IDA7Ci0JdG1wIHw9IChjaC0+Y2ZnLmZsYWdzICYgTENEQ19GTEFHU19EV0NOVCkgPyAxIDw8IDE2IDogMDsKKwl0bXAgfD0gKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgPyAwIDogTERNVDFSX1ZQT0w7CisJdG1wIHw9ICh2YXItPnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkgPyAwIDogTERNVDFSX0hQT0w7CisJdG1wIHw9IChjaC0+Y2ZnLmZsYWdzICYgTENEQ19GTEFHU19EV1BPTCkgPyBMRE1UMVJfRFdQT0wgOiAwOworCXRtcCB8PSAoY2gtPmNmZy5mbGFncyAmIExDRENfRkxBR1NfRElQT0wpID8gTERNVDFSX0RJUE9MIDogMDsKKwl0bXAgfD0gKGNoLT5jZmcuZmxhZ3MgJiBMQ0RDX0ZMQUdTX0RBUE9MKSA/IExETVQxUl9EQVBPTCA6IDA7CisJdG1wIHw9IChjaC0+Y2ZnLmZsYWdzICYgTENEQ19GTEFHU19IU0NOVCkgPyBMRE1UMVJfSFNDTlQgOiAwOworCXRtcCB8PSAoY2gtPmNmZy5mbGFncyAmIExDRENfRkxBR1NfRFdDTlQpID8gTERNVDFSX0RXQ05UIDogMDsKIAlsY2RjX3dyaXRlX2NoYW4oY2gsIExETVQxUiwgdG1wKTsKIAogCS8qIHNldHVwIFNZUyBidXMgKi8KQEAgLTQ2MywyNDIgKzQyNCwyMzkgQEAKIAlsY2RjX3dyaXRlX2NoYW4oY2gsIExESEFKUiwgdG1wKTsKIH0KIAotc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19zdGFydChzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdikKKy8qCisgKiBfX3NoX21vYmlsZV9sY2RjX3N0YXJ0IC0gQ29uZmlndXJlIGFuZCB0YXJ0IHRoZSBMQ0RDCisgKiBAcHJpdjogTENEQyBkZXZpY2UKKyAqCisgKiBDb25maWd1cmUgYWxsIGVuYWJsZWQgY2hhbm5lbHMgYW5kIHN0YXJ0IHRoZSBMQ0RDIGRldmljZS4gQWxsIGV4dGVybmFsCisgKiBkZXZpY2VzIChjbG9ja3MsIE1FUkFNLCBwYW5lbHMsIC4uLikgYXJlIG5vdCB0b3VjaGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIF9fc2hfbW9iaWxlX2xjZGNfc3RhcnQoc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gKmNoOwotCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19ib2FyZF9jZmcJKmJvYXJkX2NmZzsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgYnBwID0gMDsKLQl1bnNpZ25lZCBsb25nIGxkZGRzcjsKLQlpbnQgaywgbSwgcmV0OworCWludCBrLCBtOwogCi0JLyogZW5hYmxlIGNsb2NrcyBiZWZvcmUgYWNjZXNzaW5nIHRoZSBoYXJkd2FyZSAqLwotCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHByaXYtPmNoKTsgaysrKSB7Ci0JCWlmIChwcml2LT5jaFtrXS5lbmFibGVkKSB7Ci0JCQlzaF9tb2JpbGVfbGNkY19jbGtfb24ocHJpdik7Ci0JCQlpZiAoIWJwcCkKLQkJCQlicHAgPSBwcml2LT5jaFtrXS5pbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7Ci0JCX0KLQl9CisJLyogRW5hYmxlIExDREMgY2hhbm5lbHMuIFJlYWQgZGF0YSBmcm9tIGV4dGVybmFsIG1lbW9yeSwgYXZvaWQgdXNpbmcgdGhlCisJICogQkVVIGZvciBub3cuCisJICovCisJbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgcHJpdi0+Y2hbMF0uZW5hYmxlZCB8IHByaXYtPmNoWzFdLmVuYWJsZWQpOwogCi0JLyogcmVzZXQgKi8KLQlsY2RjX3dyaXRlKHByaXYsIF9MRENOVDJSLCBsY2RjX3JlYWQocHJpdiwgX0xEQ05UMlIpIHwgTENEQ19SRVNFVCk7Ci0JbGNkY193YWl0X2JpdChwcml2LCBfTERDTlQyUiwgTENEQ19SRVNFVCwgMCk7Ci0KLQkvKiBlbmFibGUgTENEQyBjaGFubmVscyAqLwotCXRtcCA9IGxjZGNfcmVhZChwcml2LCBfTERDTlQyUik7Ci0JdG1wIHw9IHByaXYtPmNoWzBdLmVuYWJsZWQ7Ci0JdG1wIHw9IHByaXYtPmNoWzFdLmVuYWJsZWQ7Ci0JbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgdG1wKTsKLQotCS8qIHJlYWQgZGF0YSBmcm9tIGV4dGVybmFsIG1lbW9yeSwgYXZvaWQgdXNpbmcgdGhlIEJFVSBmb3Igbm93ICovCi0JbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgbGNkY19yZWFkKHByaXYsIF9MRENOVDJSKSAmIH5ESVNQTEFZX0JFVSk7Ci0KLQkvKiBzdG9wIHRoZSBsY2RjIGZpcnN0ICovCisJLyogU3RvcCB0aGUgTENEQyBmaXJzdCBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cy4gKi8KIAlzaF9tb2JpbGVfbGNkY19zdGFydF9zdG9wKHByaXYsIDApOworCWxjZGNfd3JpdGUocHJpdiwgX0xESU5UUiwgMCk7CiAKLQkvKiBjb25maWd1cmUgY2xvY2tzICovCisJLyogQ29uZmlndXJlIHBvd2VyIHN1cHBseSwgZG90IGNsb2NrcyBhbmQgc3RhcnQgdGhlbS4gKi8KIAl0bXAgPSBwcml2LT5sZGRja3I7CiAJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocHJpdi0+Y2gpOyBrKyspIHsKIAkJY2ggPSAmcHJpdi0+Y2hba107Ci0KLQkJaWYgKCFwcml2LT5jaFtrXS5lbmFibGVkKQorCQlpZiAoIWNoLT5lbmFibGVkKQogCQkJY29udGludWU7CiAKKwkJaWYgKCFicHApCisJCQlicHAgPSBjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCisJCS8qIFBvd2VyIHN1cHBseSAqLworCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEUE1SLCAwKTsKKwogCQltID0gY2gtPmNmZy5jbG9ja19kaXZpZGVyOwogCQlpZiAoIW0pCiAJCQljb250aW51ZTsKIAotCQlpZiAobSA9PSAxKQotCQkJbSA9IDEgPDwgNjsKLQkJdG1wIHw9IG0gPDwgKGxjZGNfY2hhbl9pc19zdWJsY2QoY2gpID8gOCA6IDApOwotCi0JCS8qIEZJWE1FOiBzaDc3MjQgY2FuIG9ubHkgdXNlIDQyLCA0OCwgNTQgYW5kIDYwIGZvciB0aGUgZGl2aWRlciBkZW5vbWluYXRvciAqLworCQkvKiBGSVhNRTogc2g3NzI0IGNhbiBvbmx5IHVzZSA0MiwgNDgsIDU0IGFuZCA2MCBmb3IgdGhlIGRpdmlkZXIKKwkJICogZGVub21pbmF0b3IuCisJCSAqLwogCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExERENLUEFUMVIsIDApOwogCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExERENLUEFUMlIsICgxIDw8IChtLzIpKSAtIDEpOworCisJCWlmIChtID09IDEpCisJCQltID0gTEREQ0tSX01PU0VMOworCQl0bXAgfD0gbSA8PCAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkgPyA4IDogMCk7CiAJfQogCiAJbGNkY193cml0ZShwcml2LCBfTEREQ0tSLCB0bXApOwotCi0JLyogc3RhcnQgZG90Y2xvY2sgYWdhaW4gKi8KIAlsY2RjX3dyaXRlKHByaXYsIF9MRERDS1NUUFIsIDApOwogCWxjZGNfd2FpdF9iaXQocHJpdiwgX0xERENLU1RQUiwgfjAsIDApOwogCi0JLyogaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgdG8gYmVnaW4gd2l0aCAqLwotCWxjZGNfd3JpdGUocHJpdiwgX0xESU5UUiwgMCk7Ci0KKwkvKiBTZXR1cCBnZW9tZXRyeSwgZm9ybWF0LCBmcmFtZSBidWZmZXIgbWVtb3J5IGFuZCBvcGVyYXRpb24gbW9kZS4gKi8KIAlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShwcml2LT5jaCk7IGsrKykgewogCQljaCA9ICZwcml2LT5jaFtrXTsKLQogCQlpZiAoIWNoLT5lbmFibGVkKQogCQkJY29udGludWU7CiAKIAkJc2hfbW9iaWxlX2xjZGNfZ2VvbWV0cnkoY2gpOwogCi0JCS8qIHBvd2VyIHN1cHBseSAqLwotCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEUE1SLCAwKTsKKwkJaWYgKGNoLT5pbmZvLT52YXIubm9uc3RkKSB7CisJCQl0bXAgPSAoY2gtPmluZm8tPnZhci5ub25zdGQgPDwgMTYpOworCQkJc3dpdGNoIChjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCQljYXNlIDEyOgorCQkJCXRtcCB8PSBMRERGUl9ZRl80MjA7CisJCQkJYnJlYWs7CisJCQljYXNlIDE2OgorCQkJCXRtcCB8PSBMRERGUl9ZRl80MjI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI0OgorCQkJZGVmYXVsdDoKKwkJCQl0bXAgfD0gTERERlJfWUZfNDQ0OworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCQljYXNlIDE2OgorCQkJCXRtcCA9IExEREZSX1BLRl9SR0IxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjQ6CisJCQkJdG1wID0gTERERlJfUEtGX1JHQjI0OworCQkJCWJyZWFrOworCQkJY2FzZSAzMjoKKwkJCWRlZmF1bHQ6CisJCQkJdG1wID0gTERERlJfUEtGX0FSR0IzMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERERlIsIHRtcCk7CisJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERNTFNSLCBjaC0+cGl0Y2gpOworCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU0ExUiwgY2gtPmJhc2VfYWRkcl95KTsKKwkJaWYgKGNoLT5pbmZvLT52YXIubm9uc3RkKQorCQkJbGNkY193cml0ZV9jaGFuKGNoLCBMRFNBMlIsIGNoLT5iYXNlX2FkZHJfYyk7CisKKwkJLyogV2hlbiB1c2luZyBkZWZlcnJlZCBJL08gbW9kZSwgY29uZmlndXJlIHRoZSBMQ0RDIGZvciBvbmUtc2hvdAorCQkgKiBvcGVyYXRpb24gYW5kIGVuYWJsZSB0aGUgZnJhbWUgZW5kIGludGVycnVwdC4gT3RoZXJ3aXNlIHVzZQorCQkgKiBjb250aW51b3VzIHJlYWQgbW9kZS4KKwkJICovCisJCWlmIChjaC0+bGRtdDFyX3ZhbHVlICYgTERNVDFSX0lGTSAmJgorCQkgICAgY2gtPmNmZy5zeXNfYnVzX2NmZy5kZWZlcnJlZF9pb19tc2VjKSB7CisJCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU00xUiwgTERTTTFSX09TKTsKKwkJCWxjZGNfd3JpdGUocHJpdiwgX0xESU5UUiwgTERJTlRSX0ZFKTsKKwkJfSBlbHNlIHsKKwkJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERTTTFSLCAwKTsKKwkJfQorCX0KKworCS8qIFdvcmQgYW5kIGxvbmcgd29yZCBzd2FwLiAqLworCWlmICAocHJpdi0+Y2hbMF0uaW5mby0+dmFyLm5vbnN0ZCkKKwkJdG1wID0gTERERFNSX0xTIHwgTERERFNSX1dTIHwgTERERFNSX0JTOworCWVsc2UgeworCQlzd2l0Y2ggKGJwcCkgeworCQljYXNlIDE2OgorCQkJdG1wID0gTERERFNSX0xTIHwgTERERFNSX1dTOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQl0bXAgPSBMREREU1JfTFMgfCBMREREU1JfV1MgfCBMREREU1JfQlM7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJZGVmYXVsdDoKKwkJCXRtcCA9IExERERTUl9MUzsKKwkJCWJyZWFrOworCQl9CisJfQorCWxjZGNfd3JpdGUocHJpdiwgX0xERERTUiwgdG1wKTsKKworCS8qIEVuYWJsZSB0aGUgZGlzcGxheSBvdXRwdXQuICovCisJbGNkY193cml0ZShwcml2LCBfTERDTlQxUiwgTERDTlQxUl9ERSk7CisJc2hfbW9iaWxlX2xjZGNfc3RhcnRfc3RvcChwcml2LCAxKTsKKwlwcml2LT5zdGFydGVkID0gMTsKK30KKworc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19zdGFydChzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX2luZm8gKm1kZXYgPSBwcml2LT5tZXJhbV9kZXY7CisJc3RydWN0IHNoX21vYmlsZV9sY2RjX2JvYXJkX2NmZwkqYm9hcmRfY2ZnOworCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgcmV0OworCWludCBrOworCisJLyogZW5hYmxlIGNsb2NrcyBiZWZvcmUgYWNjZXNzaW5nIHRoZSBoYXJkd2FyZSAqLworCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHByaXYtPmNoKTsgaysrKSB7CisJCWlmIChwcml2LT5jaFtrXS5lbmFibGVkKQorCQkJc2hfbW9iaWxlX2xjZGNfY2xrX29uKHByaXYpOworCX0KKworCS8qIHJlc2V0ICovCisJbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgbGNkY19yZWFkKHByaXYsIF9MRENOVDJSKSB8IExEQ05UMlJfQlIpOworCWxjZGNfd2FpdF9iaXQocHJpdiwgX0xEQ05UMlIsIExEQ05UMlJfQlIsIDApOworCisJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocHJpdi0+Y2gpOyBrKyspIHsKKwkJY2ggPSAmcHJpdi0+Y2hba107CisKKwkJaWYgKCFjaC0+ZW5hYmxlZCkKKwkJCWNvbnRpbnVlOwogCiAJCWJvYXJkX2NmZyA9ICZjaC0+Y2ZnLmJvYXJkX2NmZzsKIAkJaWYgKGJvYXJkX2NmZy0+c2V0dXBfc3lzKSB7Ci0JCQlyZXQgPSBib2FyZF9jZmctPnNldHVwX3N5cyhib2FyZF9jZmctPmJvYXJkX2RhdGEsCi0JCQkJCQljaCwgJnNoX21vYmlsZV9sY2RjX3N5c19idXNfb3BzKTsKKwkJCXJldCA9IGJvYXJkX2NmZy0+c2V0dXBfc3lzKGJvYXJkX2NmZy0+Ym9hcmRfZGF0YSwgY2gsCisJCQkJCQkgICAmc2hfbW9iaWxlX2xjZGNfc3lzX2J1c19vcHMpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCi0JLyogd29yZCBhbmQgbG9uZyB3b3JkIHN3YXAgKi8KLQlsZGRkc3IgPSBsY2RjX3JlYWQocHJpdiwgX0xERERTUik7Ci0JaWYgIChwcml2LT5jaFswXS5pbmZvLT52YXIubm9uc3RkKQotCQlsY2RjX3dyaXRlKHByaXYsIF9MREREU1IsIGxkZGRzciB8IDcpOwotCWVsc2UgewotCQlzd2l0Y2ggKGJwcCkgewotCQljYXNlIDE2OgotCQkJbGNkY193cml0ZShwcml2LCBfTERERFNSLCBsZGRkc3IgfCA2KTsKLQkJCWJyZWFrOwotCQljYXNlIDI0OgotCQkJbGNkY193cml0ZShwcml2LCBfTERERFNSLCBsZGRkc3IgfCA3KTsKLQkJCWJyZWFrOwotCQljYXNlIDMyOgotCQkJbGNkY193cml0ZShwcml2LCBfTERERFNSLCBsZGRkc3IgfCA0KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCisJLyogQ29tcHV0ZSBmcmFtZSBidWZmZXIgYmFzZSBhZGRyZXNzIGFuZCBwaXRjaCBmb3IgZWFjaCBjaGFubmVsLiAqLwogCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHByaXYtPmNoKTsgaysrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyX3k7Ci0JCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyX2MgPSAwOwotCQlpbnQgcGl0Y2g7Ci0JCWNoID0gJnByaXYtPmNoW2tdOworCQlzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX2NmZyAqY2ZnOworCQlpbnQgcGl4ZWxmb3JtYXQ7CiAKLQkJaWYgKCFwcml2LT5jaFtrXS5lbmFibGVkKQorCQljaCA9ICZwcml2LT5jaFtrXTsKKwkJaWYgKCFjaC0+ZW5hYmxlZCkKIAkJCWNvbnRpbnVlOwogCi0JCS8qIHNldCBicHAgZm9ybWF0IGluIFBLRls0OjBdICovCi0JCXRtcCA9IGxjZGNfcmVhZF9jaGFuKGNoLCBMRERGUik7Ci0JCXRtcCAmPSB+MHgwMDAzMDMxZjsKLQkJaWYgKGNoLT5pbmZvLT52YXIubm9uc3RkKSB7Ci0JCQl0bXAgfD0gKGNoLT5pbmZvLT52YXIubm9uc3RkIDw8IDE2KTsKLQkJCXN3aXRjaCAoY2gtPmluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewotCQkJY2FzZSAxMjoKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJdG1wIHw9ICgweDEgPDwgOCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJCXRtcCB8PSAoMHgyIDw8IDgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3dpdGNoIChjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7Ci0JCQljYXNlIDE2OgotCQkJCXRtcCB8PSAweDAzOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQl0bXAgfD0gMHgwYjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbGNkY193cml0ZV9jaGFuKGNoLCBMRERGUiwgdG1wKTsKKwkJY2gtPmJhc2VfYWRkcl95ID0gY2gtPmluZm8tPmZpeC5zbWVtX3N0YXJ0OworCQljaC0+YmFzZV9hZGRyX2MgPSBjaC0+YmFzZV9hZGRyX3kKKwkJCQkrIGNoLT5pbmZvLT52YXIueHJlcworCQkJCSogY2gtPmluZm8tPnZhci55cmVzX3ZpcnR1YWw7CisJCWNoLT5waXRjaCA9IGNoLT5pbmZvLT5maXgubGluZV9sZW5ndGg7CiAKLQkJYmFzZV9hZGRyX3kgPSBjaC0+aW5mby0+Zml4LnNtZW1fc3RhcnQ7Ci0JCWJhc2VfYWRkcl9jID0gYmFzZV9hZGRyX3kgKwotCQkJCWNoLT5pbmZvLT52YXIueHJlcyAqCi0JCQkJY2gtPmluZm8tPnZhci55cmVzX3ZpcnR1YWw7Ci0JCXBpdGNoID0gY2gtPmluZm8tPmZpeC5saW5lX2xlbmd0aDsKKwkJLyogRW5hYmxlIE1FUkFNIGlmIHBvc3NpYmxlLiAqLworCQljZmcgPSBjaC0+Y2ZnLm1lcmFtX2NmZzsKKwkJaWYgKG1kZXYgPT0gTlVMTCB8fCBtZGV2LT5vcHMgPT0gTlVMTCB8fCBjZmcgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwogCi0JCS8qIHRlc3QgaWYgd2UgY2FuIGVuYWJsZSBtZXJhbSAqLwotCQlpZiAoY2gtPmNmZy5tZXJhbV9jZmcgJiYgcHJpdi0+bWVyYW1fZGV2ICYmCi0JCQkJcHJpdi0+bWVyYW1fZGV2LT5vcHMpIHsKLQkJCXN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fY2ZnICpjZmc7Ci0JCQlzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX2luZm8gKm1kZXY7Ci0JCQl1bnNpZ25lZCBsb25nIGljYl9hZGRyX3ksIGljYl9hZGRyX2M7Ci0JCQlpbnQgaWNiX3BpdGNoOwotCQkJaW50IHBmOwotCi0JCQljZmcgPSBjaC0+Y2ZnLm1lcmFtX2NmZzsKLQkJCW1kZXYgPSBwcml2LT5tZXJhbV9kZXY7Ci0JCQkvKiB3ZSBuZWVkIHRvIGRlLWluaXQgY29uZmlndXJlZCBJQ0JzIGJlZm9yZSB3ZQotCQkJICogd2UgY2FuIHJlLWluaXRpYWxpemUgdGhlbS4KLQkJCSAqLwotCQkJaWYgKGNoLT5tZXJhbV9lbmFibGVkKQotCQkJCW1kZXYtPm9wcy0+bWVyYW1fdW5yZWdpc3RlcihtZGV2LCBjZmcpOwotCisJCS8qIHdlIG5lZWQgdG8gZGUtaW5pdCBjb25maWd1cmVkIElDQnMgYmVmb3JlIHdlIGNhbgorCQkgKiByZS1pbml0aWFsaXplIHRoZW0uCisJCSAqLworCQlpZiAoY2gtPm1lcmFtX2VuYWJsZWQpIHsKKwkJCW1kZXYtPm9wcy0+bWVyYW1fdW5yZWdpc3RlcihtZGV2LCBjZmcpOwogCQkJY2gtPm1lcmFtX2VuYWJsZWQgPSAwOwotCi0JCQlpZiAoY2gtPmluZm8tPnZhci5ub25zdGQpIHsKLQkJCQlpZiAoY2gtPmluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSAyNCkKLQkJCQkJcGYgPSBTSF9NT0JJTEVfTUVSQU1fUEZfTlYyNDsKLQkJCQllbHNlCi0JCQkJCXBmID0gU0hfTU9CSUxFX01FUkFNX1BGX05WOwotCQkJfSBlbHNlIHsKLQkJCQlwZiA9IFNIX01PQklMRV9NRVJBTV9QRl9SR0I7Ci0JCQl9Ci0KLQkJCXJldCA9IG1kZXYtPm9wcy0+bWVyYW1fcmVnaXN0ZXIobWRldiwgY2ZnLCBwaXRjaCwKLQkJCQkJCWNoLT5pbmZvLT52YXIueXJlcywKLQkJCQkJCXBmLAotCQkJCQkJYmFzZV9hZGRyX3ksCi0JCQkJCQliYXNlX2FkZHJfYywKLQkJCQkJCSZpY2JfYWRkcl95LAotCQkJCQkJJmljYl9hZGRyX2MsCi0JCQkJCQkmaWNiX3BpdGNoKTsKLQkJCWlmICghcmV0KSAgewotCQkJCS8qIHNldCBMRFNBMVIgdmFsdWUgKi8KLQkJCQliYXNlX2FkZHJfeSA9IGljYl9hZGRyX3k7Ci0JCQkJcGl0Y2ggPSBpY2JfcGl0Y2g7Ci0KLQkJCQkvKiBzZXQgTERTQTJSIHZhbHVlIGlmIHJlcXVpcmVkICovCi0JCQkJaWYgKGJhc2VfYWRkcl9jKQotCQkJCQliYXNlX2FkZHJfYyA9IGljYl9hZGRyX2M7Ci0KLQkJCQljaC0+bWVyYW1fZW5hYmxlZCA9IDE7Ci0JCQl9CiAJCX0KIAotCQkvKiBwb2ludCBvdXQgb3VyIGZyYW1lIGJ1ZmZlciAqLwotCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU0ExUiwgYmFzZV9hZGRyX3kpOwotCQlpZiAoY2gtPmluZm8tPnZhci5ub25zdGQpCi0JCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU0EyUiwgYmFzZV9hZGRyX2MpOworCQlpZiAoIWNoLT5pbmZvLT52YXIubm9uc3RkKQorCQkJcGl4ZWxmb3JtYXQgPSBTSF9NT0JJTEVfTUVSQU1fUEZfUkdCOworCQllbHNlIGlmIChjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDI0KQorCQkJcGl4ZWxmb3JtYXQgPSBTSF9NT0JJTEVfTUVSQU1fUEZfTlYyNDsKKwkJZWxzZQorCQkJcGl4ZWxmb3JtYXQgPSBTSF9NT0JJTEVfTUVSQU1fUEZfTlY7CiAKLQkJLyogc2V0IGxpbmUgc2l6ZSAqLwotCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExETUxTUiwgcGl0Y2gpOwotCi0JCS8qIHNldHVwIGRlZmVycmVkIGlvIGlmIFNZUyBidXMgKi8KLQkJdG1wID0gY2gtPmNmZy5zeXNfYnVzX2NmZy5kZWZlcnJlZF9pb19tc2VjOwotCQlpZiAoY2gtPmxkbXQxcl92YWx1ZSAmICgxIDw8IDEyKSAmJiB0bXApIHsKLQkJCWNoLT5kZWZpby5kZWZlcnJlZF9pbyA9IHNoX21vYmlsZV9sY2RjX2RlZmVycmVkX2lvOwotCQkJY2gtPmRlZmlvLmRlbGF5ID0gbXNlY3NfdG9famlmZmllcyh0bXApOwotCQkJY2gtPmluZm8tPmZiZGVmaW8gPSAmY2gtPmRlZmlvOwotCQkJZmJfZGVmZXJyZWRfaW9faW5pdChjaC0+aW5mbyk7Ci0KLQkJCS8qIG9uZS1zaG90IG1vZGUgKi8KLQkJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERTTTFSLCAxKTsKLQotCQkJLyogZW5hYmxlICJGcmFtZSBFbmQgSW50ZXJydXB0IEVuYWJsZSIgYml0ICovCi0JCQlsY2RjX3dyaXRlKHByaXYsIF9MRElOVFIsIExESU5UUl9GRSk7Ci0KLQkJfSBlbHNlIHsKLQkJCS8qIGNvbnRpbnVvdXMgcmVhZCBtb2RlICovCi0JCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU00xUiwgMCk7Ci0JCX0KKwkJcmV0ID0gbWRldi0+b3BzLT5tZXJhbV9yZWdpc3RlcihtZGV2LCBjZmcsIGNoLT5waXRjaCwKKwkJCQkJY2gtPmluZm8tPnZhci55cmVzLCBwaXhlbGZvcm1hdCwKKwkJCQkJY2gtPmJhc2VfYWRkcl95LCBjaC0+YmFzZV9hZGRyX2MsCisJCQkJCSZjaC0+YmFzZV9hZGRyX3ksICZjaC0+YmFzZV9hZGRyX2MsCisJCQkJCSZjaC0+cGl0Y2gpOworCQlpZiAoIXJldCkKKwkJCWNoLT5tZXJhbV9lbmFibGVkID0gMTsKIAl9CiAKLQkvKiBkaXNwbGF5IG91dHB1dCAqLwotCWxjZGNfd3JpdGUocHJpdiwgX0xEQ05UMVIsIExDRENfRU5BQkxFKTsKKwkvKiBTdGFydCB0aGUgTENEQy4gKi8KKwlfX3NoX21vYmlsZV9sY2RjX3N0YXJ0KHByaXYpOwogCi0JLyogc3RhcnQgdGhlIGxjZGMgKi8KLQlzaF9tb2JpbGVfbGNkY19zdGFydF9zdG9wKHByaXYsIDEpOwotCXByaXYtPnN0YXJ0ZWQgPSAxOwotCi0JLyogdGVsbCB0aGUgYm9hcmQgY29kZSB0byBlbmFibGUgdGhlIHBhbmVsICovCisJLyogU2V0dXAgZGVmZXJyZWQgSS9PLCB0ZWxsIHRoZSBib2FyZCBjb2RlIHRvIGVuYWJsZSB0aGUgcGFuZWxzLCBhbmQKKwkgKiB0dXJuIGJhY2tsaWdodCBvbi4KKwkgKi8KIAlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShwcml2LT5jaCk7IGsrKykgewogCQljaCA9ICZwcml2LT5jaFtrXTsKIAkJaWYgKCFjaC0+ZW5hYmxlZCkKIAkJCWNvbnRpbnVlOwogCisJCXRtcCA9IGNoLT5jZmcuc3lzX2J1c19jZmcuZGVmZXJyZWRfaW9fbXNlYzsKKwkJaWYgKGNoLT5sZG10MXJfdmFsdWUgJiBMRE1UMVJfSUZNICYmIHRtcCkgeworCQkJY2gtPmRlZmlvLmRlZmVycmVkX2lvID0gc2hfbW9iaWxlX2xjZGNfZGVmZXJyZWRfaW87CisJCQljaC0+ZGVmaW8uZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKHRtcCk7CisJCQljaC0+aW5mby0+ZmJkZWZpbyA9ICZjaC0+ZGVmaW87CisJCQlmYl9kZWZlcnJlZF9pb19pbml0KGNoLT5pbmZvKTsKKwkJfQorCiAJCWJvYXJkX2NmZyA9ICZjaC0+Y2ZnLmJvYXJkX2NmZzsKIAkJaWYgKGJvYXJkX2NmZy0+ZGlzcGxheV9vbiAmJiB0cnlfbW9kdWxlX2dldChib2FyZF9jZmctPm93bmVyKSkgewogCQkJYm9hcmRfY2ZnLT5kaXNwbGF5X29uKGJvYXJkX2NmZy0+Ym9hcmRfZGF0YSwgY2gtPmluZm8pOwpAQCAtNzc2LDQyICs3MzQsNDIgQEAKIAogc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19jaGVja19pbnRlcmZhY2Uoc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gKmNoKQogewotCWludCBpZm0sIG1pZnR5cDsKKwlpbnQgaW50ZXJmYWNlX3R5cGUgPSBjaC0+Y2ZnLmludGVyZmFjZV90eXBlOwogCi0Jc3dpdGNoIChjaC0+Y2ZnLmludGVyZmFjZV90eXBlKSB7Ci0JY2FzZSBSR0I4OiBpZm0gPSAwOyBtaWZ0eXAgPSAwOyBicmVhazsKLQljYXNlIFJHQjk6IGlmbSA9IDA7IG1pZnR5cCA9IDQ7IGJyZWFrOwotCWNhc2UgUkdCMTJBOiBpZm0gPSAwOyBtaWZ0eXAgPSA1OyBicmVhazsKLQljYXNlIFJHQjEyQjogaWZtID0gMDsgbWlmdHlwID0gNjsgYnJlYWs7Ci0JY2FzZSBSR0IxNjogaWZtID0gMDsgbWlmdHlwID0gNzsgYnJlYWs7Ci0JY2FzZSBSR0IxODogaWZtID0gMDsgbWlmdHlwID0gMTA7IGJyZWFrOwotCWNhc2UgUkdCMjQ6IGlmbSA9IDA7IG1pZnR5cCA9IDExOyBicmVhazsKLQljYXNlIFNZUzhBOiBpZm0gPSAxOyBtaWZ0eXAgPSAwOyBicmVhazsKLQljYXNlIFNZUzhCOiBpZm0gPSAxOyBtaWZ0eXAgPSAxOyBicmVhazsKLQljYXNlIFNZUzhDOiBpZm0gPSAxOyBtaWZ0eXAgPSAyOyBicmVhazsKLQljYXNlIFNZUzhEOiBpZm0gPSAxOyBtaWZ0eXAgPSAzOyBicmVhazsKLQljYXNlIFNZUzk6IGlmbSA9IDE7IG1pZnR5cCA9IDQ7IGJyZWFrOwotCWNhc2UgU1lTMTI6IGlmbSA9IDE7IG1pZnR5cCA9IDU7IGJyZWFrOwotCWNhc2UgU1lTMTZBOiBpZm0gPSAxOyBtaWZ0eXAgPSA3OyBicmVhazsKLQljYXNlIFNZUzE2QjogaWZtID0gMTsgbWlmdHlwID0gODsgYnJlYWs7Ci0JY2FzZSBTWVMxNkM6IGlmbSA9IDE7IG1pZnR5cCA9IDk7IGJyZWFrOwotCWNhc2UgU1lTMTg6IGlmbSA9IDE7IG1pZnR5cCA9IDEwOyBicmVhazsKLQljYXNlIFNZUzI0OiBpZm0gPSAxOyBtaWZ0eXAgPSAxMTsgYnJlYWs7Ci0JZGVmYXVsdDogZ290byBiYWQ7CisJc3dpdGNoIChpbnRlcmZhY2VfdHlwZSkgeworCWNhc2UgUkdCODoKKwljYXNlIFJHQjk6CisJY2FzZSBSR0IxMkE6CisJY2FzZSBSR0IxMkI6CisJY2FzZSBSR0IxNjoKKwljYXNlIFJHQjE4OgorCWNhc2UgUkdCMjQ6CisJY2FzZSBTWVM4QToKKwljYXNlIFNZUzhCOgorCWNhc2UgU1lTOEM6CisJY2FzZSBTWVM4RDoKKwljYXNlIFNZUzk6CisJY2FzZSBTWVMxMjoKKwljYXNlIFNZUzE2QToKKwljYXNlIFNZUzE2QjoKKwljYXNlIFNZUzE2QzoKKwljYXNlIFNZUzE4OgorCWNhc2UgU1lTMjQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIFNVQkxDRCBvbmx5IHN1cHBvcnRzIFNZUyBpbnRlcmZhY2UgKi8KIAlpZiAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkpIHsKLQkJaWYgKGlmbSA9PSAwKQotCQkJZ290byBiYWQ7Ci0JCWVsc2UKLQkJCWlmbSA9IDA7CisJCWlmICghKGludGVyZmFjZV90eXBlICYgTERNVDFSX0lGTSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpbnRlcmZhY2VfdHlwZSAmPSB+TERNVDFSX0lGTTsKIAl9CiAKLQljaC0+bGRtdDFyX3ZhbHVlID0gKGlmbSA8PCAxMikgfCBtaWZ0eXA7CisJY2gtPmxkbXQxcl92YWx1ZSA9IGludGVyZmFjZV90eXBlOwogCXJldHVybiAwOwotIGJhZDoKLQlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19zZXR1cF9jbG9ja3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKQEAgLTgxOSwxOCArNzc3LDI0IEBACiAJCQkJICAgICAgIHN0cnVjdCBzaF9tb2JpbGVfbGNkY19wcml2ICpwcml2KQogewogCWNoYXIgKnN0cjsKLQlpbnQgaWNrc2VsOwogCiAJc3dpdGNoIChjbG9ja19zb3VyY2UpIHsKLQljYXNlIExDRENfQ0xLX0JVUzogc3RyID0gImJ1c19jbGsiOyBpY2tzZWwgPSAwOyBicmVhazsKLQljYXNlIExDRENfQ0xLX1BFUklQSEVSQUw6IHN0ciA9ICJwZXJpcGhlcmFsX2NsayI7IGlja3NlbCA9IDE7IGJyZWFrOwotCWNhc2UgTENEQ19DTEtfRVhURVJOQUw6IHN0ciA9IE5VTEw7IGlja3NlbCA9IDI7IGJyZWFrOworCWNhc2UgTENEQ19DTEtfQlVTOgorCQlzdHIgPSAiYnVzX2NsayI7CisJCXByaXYtPmxkZGNrciA9IExERENLUl9JQ0tTRUxfQlVTOworCQlicmVhazsKKwljYXNlIExDRENfQ0xLX1BFUklQSEVSQUw6CisJCXN0ciA9ICJwZXJpcGhlcmFsX2NsayI7CisJCXByaXYtPmxkZGNrciA9IExERENLUl9JQ0tTRUxfTUlQSTsKKwkJYnJlYWs7CisJY2FzZSBMQ0RDX0NMS19FWFRFUk5BTDoKKwkJc3RyID0gTlVMTDsKKwkJcHJpdi0+bGRkY2tyID0gTEREQ0tSX0lDS1NFTF9IRE1JOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcml2LT5sZGRja3IgPSBpY2tzZWwgPDwgMTY7Ci0KIAlpZiAoc3RyKSB7CiAJCXByaXYtPmRvdF9jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIHN0cik7CiAJCWlmIChJU19FUlIocHJpdi0+ZG90X2NsaykpIHsKQEAgLTkxNCwxMiArODc4LDEyIEBACiAJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHJfeSwgYmFzZV9hZGRyX2M7CiAJdW5zaWduZWQgbG9uZyBjX29mZnNldDsKIAotCWlmICghdmFyLT5ub25zdGQpCi0JCW5ld19wYW5fb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCkgKwotCQkJKHZhci0+eG9mZnNldCAqIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4KSk7CisJaWYgKCFpbmZvLT52YXIubm9uc3RkKQorCQluZXdfcGFuX29mZnNldCA9IHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aAorCQkJICAgICAgICsgdmFyLT54b2Zmc2V0ICogKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOwogCWVsc2UKLQkJbmV3X3Bhbl9vZmZzZXQgPSAodmFyLT55b2Zmc2V0ICogaW5mby0+Zml4LmxpbmVfbGVuZ3RoKSArCi0JCQkodmFyLT54b2Zmc2V0KTsKKwkJbmV3X3Bhbl9vZmZzZXQgPSB2YXItPnlvZmZzZXQgKiBpbmZvLT5maXgubGluZV9sZW5ndGgKKwkJCSAgICAgICArIHZhci0+eG9mZnNldDsKIAogCWlmIChuZXdfcGFuX29mZnNldCA9PSBjaC0+cGFuX29mZnNldCkKIAkJcmV0dXJuIDA7CS8qIE5vIGNoYW5nZSwgZG8gbm90aGluZyAqLwpAQCAtOTI4LDQ1ICs4OTIsNDEgQEAKIAogCS8qIFNldCB0aGUgc291cmNlIGFkZHJlc3MgZm9yIHRoZSBuZXh0IHJlZnJlc2ggKi8KIAliYXNlX2FkZHJfeSA9IGNoLT5kbWFfaGFuZGxlICsgbmV3X3Bhbl9vZmZzZXQ7Ci0JaWYgKHZhci0+bm9uc3RkKSB7CisJaWYgKGluZm8tPnZhci5ub25zdGQpIHsKIAkJLyogU2V0IHkgb2Zmc2V0ICovCi0JCWNfb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAqCi0JCQlpbmZvLT5maXgubGluZV9sZW5ndGggKgotCQkJKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAtIDgpKSAvIDg7Ci0JCWJhc2VfYWRkcl9jID0gY2gtPmRtYV9oYW5kbGUgKyB2YXItPnhyZXMgKiB2YXItPnlyZXNfdmlydHVhbCArCi0JCQljX29mZnNldDsKKwkJY19vZmZzZXQgPSB2YXItPnlvZmZzZXQgKiBpbmZvLT5maXgubGluZV9sZW5ndGgKKwkJCSAqIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLSA4KSAvIDg7CisJCWJhc2VfYWRkcl9jID0gY2gtPmRtYV9oYW5kbGUKKwkJCSAgICArIGluZm8tPnZhci54cmVzICogaW5mby0+dmFyLnlyZXNfdmlydHVhbAorCQkJICAgICsgY19vZmZzZXQ7CiAJCS8qIFNldCB4IG9mZnNldCAqLwogCQlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDI0KQogCQkJYmFzZV9hZGRyX2MgKz0gMiAqIHZhci0+eG9mZnNldDsKIAkJZWxzZQogCQkJYmFzZV9hZGRyX2MgKz0gdmFyLT54b2Zmc2V0OwotCX0gZWxzZQotCQliYXNlX2FkZHJfYyA9IDA7CisJfQogCi0JaWYgKCFjaC0+bWVyYW1fZW5hYmxlZCkgewotCQlsY2RjX3dyaXRlX2NoYW5fbWlycm9yKGNoLCBMRFNBMVIsIGJhc2VfYWRkcl95KTsKLQkJaWYgKGJhc2VfYWRkcl9jKQotCQkJbGNkY193cml0ZV9jaGFuX21pcnJvcihjaCwgTERTQTJSLCBiYXNlX2FkZHJfYyk7Ci0JfSBlbHNlIHsKKwlpZiAoY2gtPm1lcmFtX2VuYWJsZWQpIHsKIAkJc3RydWN0IHNoX21vYmlsZV9tZXJhbV9jZmcgKmNmZzsKIAkJc3RydWN0IHNoX21vYmlsZV9tZXJhbV9pbmZvICptZGV2OwotCQl1bnNpZ25lZCBsb25nIGljYl9hZGRyX3ksIGljYl9hZGRyX2M7CiAJCWludCByZXQ7CiAKIAkJY2ZnID0gY2gtPmNmZy5tZXJhbV9jZmc7CiAJCW1kZXYgPSBwcml2LT5tZXJhbV9kZXY7CiAJCXJldCA9IG1kZXYtPm9wcy0+bWVyYW1fdXBkYXRlKG1kZXYsIGNmZywKIAkJCQkJYmFzZV9hZGRyX3ksIGJhc2VfYWRkcl9jLAotCQkJCQkmaWNiX2FkZHJfeSwgJmljYl9hZGRyX2MpOworCQkJCQkmYmFzZV9hZGRyX3ksICZiYXNlX2FkZHJfYyk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCi0JCWxjZGNfd3JpdGVfY2hhbl9taXJyb3IoY2gsIExEU0ExUiwgaWNiX2FkZHJfeSk7Ci0JCWlmIChpY2JfYWRkcl9jKQotCQkJbGNkY193cml0ZV9jaGFuX21pcnJvcihjaCwgTERTQTJSLCBpY2JfYWRkcl9jKTsKLQogCX0KIAorCWNoLT5iYXNlX2FkZHJfeSA9IGJhc2VfYWRkcl95OworCWNoLT5iYXNlX2FkZHJfYyA9IGJhc2VfYWRkcl9jOworCisJbGNkY193cml0ZV9jaGFuX21pcnJvcihjaCwgTERTQTFSLCBiYXNlX2FkZHJfeSk7CisJaWYgKGluZm8tPnZhci5ub25zdGQpCisJCWxjZGNfd3JpdGVfY2hhbl9taXJyb3IoY2gsIExEU0EyUiwgYmFzZV9hZGRyX2MpOworCiAJaWYgKGxjZGNfY2hhbl9pc19zdWJsY2QoY2gpKQogCQlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTERSQ05UUiwgbGRyY250ciBeIExEUkNOVFJfU1JTKTsKIAllbHNlCkBAIC05ODUsOSArOTQ1LDExIEBACiAJdW5zaWduZWQgbG9uZyBsZGludHI7CiAJaW50IHJldDsKIAotCS8qIEVuYWJsZSBWU3luYyBFbmQgaW50ZXJydXB0ICovCisJLyogRW5hYmxlIFZTeW5jIEVuZCBpbnRlcnJ1cHQgYW5kIGJlIGNhcmVmdWwgbm90IHRvIGFja25vd2xlZGdlIGFueQorCSAqIHBlbmRpbmcgaW50ZXJydXB0LgorCSAqLwogCWxkaW50ciA9IGxjZGNfcmVhZChjaC0+bGNkYywgX0xESU5UUik7Ci0JbGRpbnRyIHw9IExESU5UUl9WRUU7CisJbGRpbnRyIHw9IExESU5UUl9WRUUgfCBMRElOVFJfU1RBVFVTX01BU0s7CiAJbGNkY193cml0ZShjaC0+bGNkYywgX0xESU5UUiwgbGRpbnRyKTsKIAogCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZjaC0+dnN5bmNfY29tcGxldGlvbiwKQEAgLTEwMzcsMTEgKzk5OSw2IEBACiAJCS8qIENvdWxkbid0IHJlY29uZmlndXJlLCBob3BlZnVsbHksIGNhbiBjb250aW51ZSBhcyBiZWZvcmUgKi8KIAkJcmV0dXJuOwogCi0JaWYgKGluZm8tPnZhci5ub25zdGQpCi0JCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IG1vZGUxLnhyZXM7Ci0JZWxzZQotCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBtb2RlMS54cmVzICogKGNoLT5jZmcuYnBwIC8gOCk7Ci0KIAkvKgogCSAqIGZiX3NldF92YXIoKSBjYWxscyB0aGUgbm90aWZpZXIgY2hhbmdlIGludGVybmFsbHksIG9ubHkgaWYKIAkgKiBGQklORk9fTUlTQ19VU0VSRVZFTlQgZmxhZyBpcyBzZXQuIFNpbmNlIHdlIGRvIG5vdCB3YW50IHRvIGZha2UgYQpAQCAtMTA5NCwzMCArMTA1MSwxMjYgQEAKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBpbmZvLT5wYXI7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKnAgPSBjaC0+bGNkYzsKKwl1bnNpZ25lZCBpbnQgYmVzdF9kaXN0ID0gKHVuc2lnbmVkIGludCktMTsKKwl1bnNpZ25lZCBpbnQgYmVzdF94cmVzID0gMDsKKwl1bnNpZ25lZCBpbnQgYmVzdF95cmVzID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCWlmICh2YXItPnhyZXMgPiBNQVhfWFJFUyB8fCB2YXItPnlyZXMgPiBNQVhfWVJFUyB8fAotCSAgICB2YXItPnhyZXMgKiB2YXItPnlyZXMgKiAoY2gtPmNmZy5icHAgLyA4KSAqIDIgPiBpbmZvLT5maXguc21lbV9sZW4pIHsKLQkJZGV2X3dhcm4oaW5mby0+ZGV2LCAiSW52YWxpZCBpbmZvOiAldS0ldS0ldS0ldSB4ICV1LSV1LSV1LSV1IEAgJWx1a0h6IVxuIiwKLQkJCSB2YXItPmxlZnRfbWFyZ2luLCB2YXItPnhyZXMsIHZhci0+cmlnaHRfbWFyZ2luLCB2YXItPmhzeW5jX2xlbiwKLQkJCSB2YXItPnVwcGVyX21hcmdpbiwgdmFyLT55cmVzLCB2YXItPmxvd2VyX21hcmdpbiwgdmFyLT52c3luY19sZW4sCi0JCQkgUElDT1MyS0haKHZhci0+cGl4Y2xvY2spKTsKKwlpZiAodmFyLT54cmVzID4gTUFYX1hSRVMgfHwgdmFyLT55cmVzID4gTUFYX1lSRVMpCiAJCXJldHVybiAtRUlOVkFMOworCisJLyogSWYgYm9hcmQgY29kZSBwcm92aWRlcyB1cyB3aXRoIGEgbGlzdCBvZiBhdmFpbGFibGUgbW9kZXMsIG1ha2Ugc3VyZQorCSAqIHdlIHVzZSBvbmUgb2YgdGhlbS4gRmluZCB0aGUgbW9kZSBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgb25lLiBUaGUKKwkgKiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBtb2RlcyBpcyBkZWZpbmVkIGFzIHRoZSBzaXplIG9mIHRoZQorCSAqIG5vbi1vdmVybGFwcGluZyBwYXJ0cyBvZiB0aGUgdHdvIHJlY3RhbmdsZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IGNoLT5jZmcubnVtX2NmZzsgKytpKSB7CisJCWNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUgPSAmY2gtPmNmZy5sY2RfY2ZnW2ldOworCQl1bnNpZ25lZCBpbnQgZGlzdDsKKworCQkvKiBXZSBjYW4gb25seSByb3VuZCB1cC4gKi8KKwkJaWYgKHZhci0+eHJlcyA+IG1vZGUtPnhyZXMgfHwgdmFyLT55cmVzID4gbW9kZS0+eXJlcykKKwkJCWNvbnRpbnVlOworCisJCWRpc3QgPSB2YXItPnhyZXMgKiB2YXItPnlyZXMgKyBtb2RlLT54cmVzICogbW9kZS0+eXJlcworCQkgICAgIC0gMiAqIG1pbih2YXItPnhyZXMsIG1vZGUtPnhyZXMpCisJCQkgKiBtaW4odmFyLT55cmVzLCBtb2RlLT55cmVzKTsKKworCQlpZiAoZGlzdCA8IGJlc3RfZGlzdCkgeworCQkJYmVzdF94cmVzID0gbW9kZS0+eHJlczsKKwkJCWJlc3RfeXJlcyA9IG1vZGUtPnlyZXM7CisJCQliZXN0X2Rpc3QgPSBkaXN0OworCQl9CiAJfQogCisJLyogSWYgbm8gYXZhaWxhYmxlIG1vZGUgY2FuIGJlIHVzZWQsIHJldHVybiBhbiBlcnJvci4gKi8KKwlpZiAoY2gtPmNmZy5udW1fY2ZnICE9IDApIHsKKwkJaWYgKGJlc3RfZGlzdCA9PSAodW5zaWduZWQgaW50KS0xKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdmFyLT54cmVzID0gYmVzdF94cmVzOworCQl2YXItPnlyZXMgPSBiZXN0X3lyZXM7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSB2aXJ0dWFsIHJlc29sdXRpb24gaXMgYXQgbGVhc3QgYXMgYmlnIGFzIHRoZSB2aXNpYmxlCisJICogcmVzb2x1dGlvbi4KKwkgKi8KKwlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCisJCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOworCWlmICh2YXItPnlyZXNfdmlydHVhbCA8IHZhci0+eXJlcykKKwkJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7CisKKwlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSAxNikgewkJLyogUkdCIDU2NSAqLworCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJCXZhci0+cmVkLm9mZnNldCA9IDExOworCQl2YXItPnJlZC5sZW5ndGggPSA1OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCX0gZWxzZSBpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSAyNCkgewkJLyogUkdCIDg4OCAqLworCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMjQ7CisJCXZhci0+cmVkLm9mZnNldCA9IDE2OworCQl2YXItPnJlZC5sZW5ndGggPSA4OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCX0gZWxzZSBpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSAzMikgewkJLyogUkdCQSA4ODggKi8KKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOworCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKKwkJdmFyLT5yZWQubGVuZ3RoID0gODsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPmJsdWUubGVuZ3RoID0gODsKKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMjQ7CisJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDg7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJdmFyLT5yZWQubXNiX3JpZ2h0ID0gMDsKKwl2YXItPmdyZWVuLm1zYl9yaWdodCA9IDA7CisJdmFyLT5ibHVlLm1zYl9yaWdodCA9IDA7CisJdmFyLT50cmFuc3AubXNiX3JpZ2h0ID0gMDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgb3VyIGFsbG9jYXRlZCBtZW1vcnkuICovCisJaWYgKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT55cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCA+CisJICAgIGluZm8tPmZpeC5zbWVtX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiBvbmx5IGFjY2VwdCB0aGUgZm9yY2VkX2JwcCBmb3IgZHVhbCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zICovCiAJaWYgKHAtPmZvcmNlZF9icHAgJiYgcC0+Zm9yY2VkX2JwcCAhPSB2YXItPmJpdHNfcGVyX3BpeGVsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewotCWNhc2UgMTY6IC8qIFBLRls0OjBdID0gMDAwMTEgLSBSR0IgNTY1ICovCi0JY2FzZSAyNDogLyogUEtGWzQ6MF0gPSAwMTAxMSAtIFJHQiA4ODggKi8KLQljYXNlIDMyOiAvKiBQS0ZbNDowXSA9IDAwMDAwIC0gUkdCQSA4ODggKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hfbW9iaWxlX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gKmNoID0gaW5mby0+cGFyOworCXUzMiBsaW5lX2xlbmd0aCA9IGluZm8tPmZpeC5saW5lX2xlbmd0aDsKKwlpbnQgcmV0OworCisJc2hfbW9iaWxlX2xjZGNfc3RvcChjaC0+bGNkYyk7CisKKwlpZiAoaW5mby0+dmFyLm5vbnN0ZCkKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gaW5mby0+dmFyLnhyZXM7CisJZWxzZQorCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBpbmZvLT52YXIueHJlcworCQkJCSAgICAgICogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsIC8gODsKKworCXJldCA9IHNoX21vYmlsZV9sY2RjX3N0YXJ0KGNoLT5sY2RjKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIiVzOiB1bmFibGUgdG8gcmVzdGFydCBMQ0RDXG4iLCBfX2Z1bmNfXyk7CisJCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IGxpbmVfbGVuZ3RoOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0xMTc3LDYgKzEyMzAsNyBAQAogCS5mYl9vcGVuCT0gc2hfbW9iaWxlX29wZW4sCiAJLmZiX3JlbGVhc2UJPSBzaF9tb2JpbGVfcmVsZWFzZSwKIAkuZmJfY2hlY2tfdmFyCT0gc2hfbW9iaWxlX2NoZWNrX3ZhciwKKwkuZmJfc2V0X3Bhcgk9IHNoX21vYmlsZV9zZXRfcGFyLAogfTsKIAogc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY191cGRhdGVfYmwoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkZXYpCkBAIC0xMjM4LDY2ICsxMjkyLDYgQEAKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmRldik7CiB9CiAKLXN0YXRpYyBpbnQgc2hfbW9iaWxlX2xjZGNfc2V0X2JwcChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGJwcCwKLQkJCQkgICBpbnQgbm9uc3RkKQotewotCWlmIChub25zdGQpIHsKLQkJc3dpdGNoIChicHApIHsKLQkJY2FzZSAxMjoKLQkJY2FzZSAxNjoKLQkJY2FzZSAyNDoKLQkJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBicHA7Ci0JCQl2YXItPm5vbnN0ZCA9IG5vbnN0ZDsKLQkJCXJldHVybiAwOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKGJwcCkgewotCWNhc2UgMTY6IC8qIFBLRls0OjBdID0gMDAwMTEgLSBSR0IgNTY1ICovCi0JCXZhci0+cmVkLm9mZnNldCA9IDExOwotCQl2YXItPnJlZC5sZW5ndGggPSA1OwotCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7Ci0JCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKLQkJdmFyLT5ibHVlLm9mZnNldCA9IDA7Ci0JCXZhci0+Ymx1ZS5sZW5ndGggPSA1OwotCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwotCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwotCQlicmVhazsKLQotCWNhc2UgMjQ6IC8qIFBLRls0OjBdID0gMDEwMTEgLSBSR0IgODg4ICovCi0JCXZhci0+cmVkLm9mZnNldCA9IDE2OwotCQl2YXItPnJlZC5sZW5ndGggPSA4OwotCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7Ci0JCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKLQkJdmFyLT5ibHVlLm9mZnNldCA9IDA7Ci0JCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwotCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwotCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwotCQlicmVhazsKLQotCWNhc2UgMzI6IC8qIFBLRls0OjBdID0gMDAwMDAgLSBSR0JBIDg4OCAqLwotCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKLQkJdmFyLT5yZWQubGVuZ3RoID0gODsKLQkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OwotCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7Ci0JCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwotCQl2YXItPmJsdWUubGVuZ3RoID0gODsKLQkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMjQ7Ci0JCXZhci0+dHJhbnNwLmxlbmd0aCA9IDg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl2YXItPmJpdHNfcGVyX3BpeGVsID0gYnBwOwotCXZhci0+cmVkLm1zYl9yaWdodCA9IDA7Ci0JdmFyLT5ncmVlbi5tc2JfcmlnaHQgPSAwOwotCXZhci0+Ymx1ZS5tc2JfcmlnaHQgPSAwOwotCXZhci0+dHJhbnNwLm1zYl9yaWdodCA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2xjZGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwpAQCAtMTMxNiw0NyArMTMxMCwyMCBAQAogc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaDsKLQlpbnQgaywgbjsKLQotCS8qIHNhdmUgcGVyLWNoYW5uZWwgcmVnaXN0ZXJzICovCi0JZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocC0+Y2gpOyBrKyspIHsKLQkJY2ggPSAmcC0+Y2hba107Ci0JCWlmICghY2gtPmVuYWJsZWQpCi0JCQljb250aW51ZTsKLQkJZm9yIChuID0gMDsgbiA8IE5SX0NIX1JFR1M7IG4rKykKLQkJCWNoLT5zYXZlZF9jaF9yZWdzW25dID0gbGNkY19yZWFkX2NoYW4oY2gsIG4pOwotCX0KLQotCS8qIHNhdmUgc2hhcmVkIHJlZ2lzdGVycyAqLwotCWZvciAobiA9IDA7IG4gPCBOUl9TSEFSRURfUkVHUzsgbisrKQotCQlwLT5zYXZlZF9zaGFyZWRfcmVnc1tuXSA9IGxjZGNfcmVhZChwLCBsY2RjX3NoYXJlZF9yZWdzW25dKTsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJLyogdHVybiBvZmYgTENEQyBoYXJkd2FyZSAqLwotCWxjZGNfd3JpdGUocCwgX0xEQ05UMVIsIDApOworCWxjZGNfd3JpdGUocHJpdiwgX0xEQ05UMVIsIDApOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2xjZGNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaDsKLQlpbnQgaywgbjsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JLyogcmVzdG9yZSBwZXItY2hhbm5lbCByZWdpc3RlcnMgKi8KLQlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShwLT5jaCk7IGsrKykgewotCQljaCA9ICZwLT5jaFtrXTsKLQkJaWYgKCFjaC0+ZW5hYmxlZCkKLQkJCWNvbnRpbnVlOwotCQlmb3IgKG4gPSAwOyBuIDwgTlJfQ0hfUkVHUzsgbisrKQotCQkJbGNkY193cml0ZV9jaGFuKGNoLCBuLCBjaC0+c2F2ZWRfY2hfcmVnc1tuXSk7Ci0JfQotCi0JLyogcmVzdG9yZSBzaGFyZWQgcmVnaXN0ZXJzICovCi0JZm9yIChuID0gMDsgbiA8IE5SX1NIQVJFRF9SRUdTOyBuKyspCi0JCWxjZGNfd3JpdGUocCwgbGNkY19zaGFyZWRfcmVnc1tuXSwgcC0+c2F2ZWRfc2hhcmVkX3JlZ3Nbbl0pOworCV9fc2hfbW9iaWxlX2xjZGNfc3RhcnQocHJpdik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MDgsMjYzICsxMzc1LDYgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi1zdGF0aWMgaW50IHNoX21vYmlsZV9sY2RjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLQotc3RhdGljIGludCBfX2RldmluaXQgc2hfbW9iaWxlX2xjZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdjsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfaW5mbyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgZXJyb3I7Ci0Jdm9pZCAqYnVmOwotCWludCBpLCBqOwotCi0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIGRlZmluZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWkgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmICghcmVzIHx8IGkgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgcGxhdGZvcm0gcmVzb3VyY2VzXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBkZXZpY2UgZGF0YVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwotCi0JZXJyb3IgPSByZXF1ZXN0X2lycShpLCBzaF9tb2JpbGVfbGNkY19pcnEsIElSUUZfRElTQUJMRUQsCi0JCQkgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIHByaXYpOwotCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBpcnFcbiIpOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JcHJpdi0+aXJxID0gaTsKLQlhdG9taWNfc2V0KCZwcml2LT5od191c2VjbnQsIC0xKTsKLQotCWogPSAwOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkYXRhLT5jaCk7IGkrKykgewotCQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBwcml2LT5jaCArIGo7Ci0KLQkJY2gtPmxjZGMgPSBwcml2OwotCQltZW1jcHkoJmNoLT5jZmcsICZwZGF0YS0+Y2hbaV0sIHNpemVvZihwZGF0YS0+Y2hbaV0pKTsKLQotCQllcnJvciA9IHNoX21vYmlsZV9sY2RjX2NoZWNrX2ludGVyZmFjZShjaCk7Ci0JCWlmIChlcnJvcikgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGVcbiIpOwotCQkJZ290byBlcnIxOwotCQl9Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5mcmFtZV9lbmRfd2FpdCk7Ci0JCWluaXRfY29tcGxldGlvbigmY2gtPnZzeW5jX2NvbXBsZXRpb24pOwotCQljaC0+cGFuX29mZnNldCA9IDA7Ci0KLQkJLyogcHJvYmUgdGhlIGJhY2tsaWdodCBpcyB0aGVyZSBpcyBvbmUgZGVmaW5lZCAqLwotCQlpZiAoY2gtPmNmZy5ibF9pbmZvLm1heF9icmlnaHRuZXNzKQotCQkJY2gtPmJsID0gc2hfbW9iaWxlX2xjZGNfYmxfcHJvYmUoJnBkZXYtPmRldiwgY2gpOwotCi0JCXN3aXRjaCAocGRhdGEtPmNoW2ldLmNoYW4pIHsKLQkJY2FzZSBMQ0RDX0NIQU5fTUFJTkxDRDoKLQkJCWNoLT5lbmFibGVkID0gMSA8PCAxOwotCQkJY2gtPnJlZ19vZmZzID0gbGNkY19vZmZzX21haW5sY2Q7Ci0JCQlqKys7Ci0JCQlicmVhazsKLQkJY2FzZSBMQ0RDX0NIQU5fU1VCTENEOgotCQkJY2gtPmVuYWJsZWQgPSAxIDw8IDI7Ci0JCQljaC0+cmVnX29mZnMgPSBsY2RjX29mZnNfc3VibGNkOwotCQkJaisrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIWopIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gY2hhbm5lbHMgZGVmaW5lZFxuIik7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBlcnIxOwotCX0KLQotCS8qIGZvciBkdWFsIGNoYW5uZWwgTENEQyAoTUFJTiArIFNVQikgZm9yY2Ugc2hhcmVkIGJwcCBzZXR0aW5nICovCi0JaWYgKGogPT0gMikKLQkJcHJpdi0+Zm9yY2VkX2JwcCA9IHBkYXRhLT5jaFswXS5icHA7Ci0KLQlwcml2LT5iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKCFwcml2LT5iYXNlKQotCQlnb3RvIGVycjE7Ci0KLQllcnJvciA9IHNoX21vYmlsZV9sY2RjX3NldHVwX2Nsb2NrcyhwZGV2LCBwZGF0YS0+Y2xvY2tfc291cmNlLCBwcml2KTsKLQlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHNldHVwIGNsb2Nrc1xuIik7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlwcml2LT5tZXJhbV9kZXYgPSBwZGF0YS0+bWVyYW1fZGV2OwotCi0JZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcjsKLQkJY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqbGNkX2NmZywgKm1heF9jZmcgPSBOVUxMOwotCQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBwcml2LT5jaCArIGk7Ci0JCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuX2NmZyAqY2ZnID0gJmNoLT5jZmc7Ci0JCWNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUgPSBjZmctPmxjZF9jZmc7Ci0JCXVuc2lnbmVkIGxvbmcgbWF4X3NpemUgPSAwOwotCQlpbnQgazsKLQkJaW50IG51bV9jZmc7Ci0KLQkJY2gtPmluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygwLCAmcGRldi0+ZGV2KTsKLQkJaWYgKCFjaC0+aW5mbykgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGZiX2luZm9cbiIpOwotCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbmZvID0gY2gtPmluZm87Ci0JCXZhciA9ICZpbmZvLT52YXI7Ci0JCWluZm8tPmZib3BzID0gJnNoX21vYmlsZV9sY2RjX29wczsKLQkJaW5mby0+cGFyID0gY2g7Ci0KLQkJbXV0ZXhfaW5pdCgmY2gtPm9wZW5fbG9jayk7Ci0KLQkJZm9yIChrID0gMCwgbGNkX2NmZyA9IG1vZGU7Ci0JCSAgICAgayA8IGNmZy0+bnVtX2NmZyAmJiBsY2RfY2ZnOwotCQkgICAgIGsrKywgbGNkX2NmZysrKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHNpemUgPSBsY2RfY2ZnLT55cmVzICogbGNkX2NmZy0+eHJlczsKLQkJCS8qIE5WMTIgYnVmZmVycyBtdXN0IGhhdmUgZXZlbiBudW1iZXIgb2YgbGluZXMgKi8KLQkJCWlmICgoY2ZnLT5ub25zdGQpICYmIGNmZy0+YnBwID09IDEyICYmCi0JCQkJCShsY2RfY2ZnLT55cmVzICYgMHgxKSkgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgInlyZXMgbXVzdCBiZSBtdWx0aXBsZSBvZiAyIgotCQkJCQkJIiBmb3IgWUNiQ3I0MjAgbW9kZS5cbiIpOwotCQkJCWVycm9yID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycjE7Ci0JCQl9Ci0KLQkJCWlmIChzaXplID4gbWF4X3NpemUpIHsKLQkJCQltYXhfY2ZnID0gbGNkX2NmZzsKLQkJCQltYXhfc2l6ZSA9IHNpemU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIW1vZGUpCi0JCQltYXhfc2l6ZSA9IE1BWF9YUkVTICogTUFYX1lSRVM7Ci0JCWVsc2UgaWYgKG1heF9jZmcpCi0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJGb3VuZCBsYXJnZXN0IHZpZGVvbW9kZSAldXgldVxuIiwKLQkJCQltYXhfY2ZnLT54cmVzLCBtYXhfY2ZnLT55cmVzKTsKLQotCQlpbmZvLT5maXggPSBzaF9tb2JpbGVfbGNkY19maXg7Ci0JCWluZm8tPmZpeC5zbWVtX2xlbiA9IG1heF9zaXplICogMiAqIGNmZy0+YnBwIC8gODsKLQotCQkgLyogT25seSBwYW4gaW4gMiBsaW5lIHN0ZXBzIGZvciBOVjEyICovCi0JCWlmIChjZmctPm5vbnN0ZCAmJiBjZmctPmJwcCA9PSAxMikKLQkJCWluZm8tPmZpeC55cGFuc3RlcCA9IDI7Ci0KLQkJaWYgKCFtb2RlKSB7Ci0JCQltb2RlID0gJmRlZmF1bHRfNzIwcDsKLQkJCW51bV9jZmcgPSAxOwotCQl9IGVsc2UgewotCQkJbnVtX2NmZyA9IGNmZy0+bnVtX2NmZzsKLQkJfQotCi0JCWZiX3ZpZGVvbW9kZV90b19tb2RlbGlzdChtb2RlLCBudW1fY2ZnLCAmaW5mby0+bW9kZWxpc3QpOwotCi0JCWZiX3ZpZGVvbW9kZV90b192YXIodmFyLCBtb2RlKTsKLQkJdmFyLT53aWR0aCA9IGNmZy0+bGNkX3NpemVfY2ZnLndpZHRoOwotCQl2YXItPmhlaWdodCA9IGNmZy0+bGNkX3NpemVfY2ZnLmhlaWdodDsKLQkJLyogRGVmYXVsdCBZIHZpcnR1YWwgcmVzb2x1dGlvbiBpcyAyeCBwYW5lbCBzaXplICovCi0JCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzICogMjsKLQkJdmFyLT5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKLQotCQllcnJvciA9IHNoX21vYmlsZV9sY2RjX3NldF9icHAodmFyLCBjZmctPmJwcCwgY2ZnLT5ub25zdGQpOwotCQlpZiAoZXJyb3IpCi0JCQlicmVhazsKLQotCQlidWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgaW5mby0+Zml4LnNtZW1fbGVuLAotCQkJCQkgJmNoLT5kbWFfaGFuZGxlLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWYpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXJcbiIpOwotCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9ICZjaC0+cHNldWRvX3BhbGV0dGU7Ci0JCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKLQotCQllcnJvciA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIFBBTEVUVEVfTlIsIDApOwotCQlpZiAoZXJyb3IgPCAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgY21hcFxuIik7Ci0JCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBpbmZvLT5maXguc21lbV9sZW4sCi0JCQkJCSAgYnVmLCBjaC0+ZG1hX2hhbmRsZSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gY2gtPmRtYV9oYW5kbGU7Ci0JCWlmICh2YXItPm5vbnN0ZCkKLQkJCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IHZhci0+eHJlczsKLQkJZWxzZQotCQkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gdmFyLT54cmVzICogKGNmZy0+YnBwIC8gOCk7Ci0KLQkJaW5mby0+c2NyZWVuX2Jhc2UgPSBidWY7Ci0JCWluZm8tPmRldmljZSA9ICZwZGV2LT5kZXY7Ci0JCWNoLT5kaXNwbGF5X3ZhciA9ICp2YXI7Ci0JfQotCi0JaWYgKGVycm9yKQotCQlnb3RvIGVycjE7Ci0KLQllcnJvciA9IHNoX21vYmlsZV9sY2RjX3N0YXJ0KHByaXYpOwotCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgaGFyZHdhcmVcbiIpOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBwcml2LT5jaCArIGk7Ci0KLQkJaW5mbyA9IGNoLT5pbmZvOwotCi0JCWlmIChpbmZvLT5mYmRlZmlvKSB7Ci0JCQljaC0+c2dsaXN0ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqCi0JCQkJCWluZm8tPmZpeC5zbWVtX2xlbiA+PiBQQUdFX1NISUZUKTsKLQkJCWlmICghY2gtPnNnbGlzdCkgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBzZ2xpc3RcbiIpOwotCQkJCWdvdG8gZXJyMTsKLQkJCX0KLQkJfQotCi0JCWluZm8tPmJsX2RldiA9IGNoLT5ibDsKLQotCQllcnJvciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBlcnIxOwotCi0JCWRldl9pbmZvKGluZm8tPmRldiwKLQkJCSAicmVnaXN0ZXJlZCAlcy8lcyBhcyAlZHglZCAlZGJwcC5cbiIsCi0JCQkgcGRldi0+bmFtZSwKLQkJCSAoY2gtPmNmZy5jaGFuID09IExDRENfQ0hBTl9NQUlOTENEKSA/Ci0JCQkgIm1haW5sY2QiIDogInN1YmxjZCIsCi0JCQkgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLAotCQkJIGNoLT5jZmcuYnBwKTsKLQotCQkvKiBkZWZlcnJlZCBpbyBtb2RlOiBkaXNhYmxlIGNsb2NrIHRvIHNhdmUgcG93ZXIgKi8KLQkJaWYgKGluZm8tPmZiZGVmaW8gfHwgaW5mby0+c3RhdGUgPT0gRkJJTkZPX1NUQVRFX1NVU1BFTkRFRCkKLQkJCXNoX21vYmlsZV9sY2RjX2Nsa19vZmYocHJpdik7Ci0JfQotCi0JLyogRmFpbHVyZSBpZ25vcmVkICovCi0JcHJpdi0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IHNoX21vYmlsZV9sY2RjX25vdGlmeTsKLQlmYl9yZWdpc3Rlcl9jbGllbnQoJnByaXYtPm5vdGlmaWVyKTsKLQotCXJldHVybiAwOwotZXJyMToKLQlzaF9tb2JpbGVfbGNkY19yZW1vdmUocGRldik7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2xjZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTE3MTYsNiArMTQyNiwyNzkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgc2hfbW9iaWxlX2xjZGNfY2hhbm5lbF9pbml0KHN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaCwKKwkJCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW5fY2ZnICpjZmcgPSAmY2gtPmNmZzsKKwljb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptYXhfbW9kZTsKKwljb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXVuc2lnbmVkIGludCBtYXhfc2l6ZTsKKwlpbnQgbnVtX2NmZzsKKwl2b2lkICpidWY7CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2luaXQoJmNoLT5vcGVuX2xvY2spOworCisJLyogQWxsb2NhdGUgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UuICovCisJY2gtPmluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygwLCBkZXYpOworCWlmICghY2gtPmluZm8pIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgZmJfaW5mb1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWluZm8gPSBjaC0+aW5mbzsKKwlpbmZvLT5mYm9wcyA9ICZzaF9tb2JpbGVfbGNkY19vcHM7CisJaW5mby0+cGFyID0gY2g7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSAmY2gtPnBzZXVkb19wYWxldHRlOworCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKKworCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbW9kZXMgdG8gdmFsaWRhdGUgdGhlbSBhbmQgZmluZCB0aGUgaGlnaGVzdAorCSAqIHJlc29sdXRpb24uCisJICovCisJbWF4X21vZGUgPSBOVUxMOworCW1heF9zaXplID0gMDsKKworCWZvciAoaSA9IDAsIG1vZGUgPSBjZmctPmxjZF9jZmc7IGkgPCBjZmctPm51bV9jZmc7IGkrKywgbW9kZSsrKSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gbW9kZS0+eXJlcyAqIG1vZGUtPnhyZXM7CisKKwkJLyogTlYxMiBidWZmZXJzIG11c3QgaGF2ZSBldmVuIG51bWJlciBvZiBsaW5lcyAqLworCQlpZiAoKGNmZy0+bm9uc3RkKSAmJiBjZmctPmJwcCA9PSAxMiAmJgorCQkJCShtb2RlLT55cmVzICYgMHgxKSkgeworCQkJZGV2X2VycihkZXYsICJ5cmVzIG11c3QgYmUgbXVsdGlwbGUgb2YgMiBmb3IgWUNiQ3I0MjAgIgorCQkJCSJtb2RlLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChzaXplID4gbWF4X3NpemUpIHsKKwkJCW1heF9tb2RlID0gbW9kZTsKKwkJCW1heF9zaXplID0gc2l6ZTsKKwkJfQorCX0KKworCWlmICghbWF4X3NpemUpCisJCW1heF9zaXplID0gTUFYX1hSRVMgKiBNQVhfWVJFUzsKKwllbHNlCisJCWRldl9kYmcoZGV2LCAiRm91bmQgbGFyZ2VzdCB2aWRlb21vZGUgJXV4JXVcbiIsCisJCQltYXhfbW9kZS0+eHJlcywgbWF4X21vZGUtPnlyZXMpOworCisJLyogSW5pdGlhbGl6ZSBmaXhlZCBzY3JlZW4gaW5mb3JtYXRpb24uIFJlc3RyaWN0IHBhbiB0byAyIGxpbmVzIHN0ZXBzCisJICogZm9yIE5WMTIuCisJICovCisJaW5mby0+Zml4ID0gc2hfbW9iaWxlX2xjZGNfZml4OworCWluZm8tPmZpeC5zbWVtX2xlbiA9IG1heF9zaXplICogMiAqIGNmZy0+YnBwIC8gODsKKwlpZiAoY2ZnLT5ub25zdGQgJiYgY2ZnLT5icHAgPT0gMTIpCisJCWluZm8tPmZpeC55cGFuc3RlcCA9IDI7CisKKwkvKiBDcmVhdGUgdGhlIG1vZGUgbGlzdC4gKi8KKwlpZiAoY2ZnLT5sY2RfY2ZnID09IE5VTEwpIHsKKwkJbW9kZSA9ICZkZWZhdWx0XzcyMHA7CisJCW51bV9jZmcgPSAxOworCX0gZWxzZSB7CisJCW1vZGUgPSBjZmctPmxjZF9jZmc7CisJCW51bV9jZmcgPSBjZmctPm51bV9jZmc7CisJfQorCisJZmJfdmlkZW9tb2RlX3RvX21vZGVsaXN0KG1vZGUsIG51bV9jZmcsICZpbmZvLT5tb2RlbGlzdCk7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlIHNjcmVlbiBpbmZvcm1hdGlvbiB1c2luZyB0aGUgZmlyc3QgbW9kZSBhcworCSAqIGRlZmF1bHQuIFRoZSBkZWZhdWx0IFkgdmlydHVhbCByZXNvbHV0aW9uIGlzIHR3aWNlIHRoZSBwYW5lbCBzaXplIHRvCisJICogYWxsb3cgZm9yIGRvdWJsZS1idWZmZXJpbmcuCisJICovCisJdmFyID0gJmluZm8tPnZhcjsKKwlmYl92aWRlb21vZGVfdG9fdmFyKHZhciwgbW9kZSk7CisJdmFyLT5iaXRzX3Blcl9waXhlbCA9IGNmZy0+YnBwOworCXZhci0+d2lkdGggPSBjZmctPmxjZF9zaXplX2NmZy53aWR0aDsKKwl2YXItPmhlaWdodCA9IGNmZy0+bGNkX3NpemVfY2ZnLmhlaWdodDsKKwl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlcyAqIDI7CisJdmFyLT5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKKworCXJldCA9IHNoX21vYmlsZV9jaGVja192YXIodmFyLCBpbmZvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQWxsb2NhdGUgZnJhbWUgYnVmZmVyIG1lbW9yeSBhbmQgY29sb3IgbWFwLiAqLworCWJ1ZiA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIGluZm8tPmZpeC5zbWVtX2xlbiwgJmNoLT5kbWFfaGFuZGxlLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCBQQUxFVFRFX05SLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBjbWFwXG4iKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBpbmZvLT5maXguc21lbV9sZW4sCisJCQkJICBidWYsIGNoLT5kbWFfaGFuZGxlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvLT5maXguc21lbV9zdGFydCA9IGNoLT5kbWFfaGFuZGxlOworCWlmICh2YXItPm5vbnN0ZCkKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gdmFyLT54cmVzOworCWVsc2UKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gdmFyLT54cmVzICogKGNmZy0+YnBwIC8gOCk7CisKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IGJ1ZjsKKwlpbmZvLT5kZXZpY2UgPSBkZXY7CisJY2gtPmRpc3BsYXlfdmFyID0gKnZhcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaF9tb2JpbGVfbGNkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19pbmZvICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19wcml2ICpwcml2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBudW1fY2hhbm5lbHM7CisJaW50IGVycm9yOworCWludCBpOworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWkgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICghcmVzIHx8IGkgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgcGxhdGZvcm0gcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBkZXZpY2UgZGF0YVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJZXJyb3IgPSByZXF1ZXN0X2lycShpLCBzaF9tb2JpbGVfbGNkY19pcnEsIDAsCisJCQkgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIHByaXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBpcnFcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJcHJpdi0+aXJxID0gaTsKKwlhdG9taWNfc2V0KCZwcml2LT5od191c2VjbnQsIC0xKTsKKworCWZvciAoaSA9IDAsIG51bV9jaGFubmVscyA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkYXRhLT5jaCk7IGkrKykgeworCQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBwcml2LT5jaCArIG51bV9jaGFubmVsczsKKworCQljaC0+bGNkYyA9IHByaXY7CisJCW1lbWNweSgmY2gtPmNmZywgJnBkYXRhLT5jaFtpXSwgc2l6ZW9mKHBkYXRhLT5jaFtpXSkpOworCisJCWVycm9yID0gc2hfbW9iaWxlX2xjZGNfY2hlY2tfaW50ZXJmYWNlKGNoKTsKKwkJaWYgKGVycm9yKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZVxuIik7CisJCQlnb3RvIGVycjE7CisJCX0KKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmZyYW1lX2VuZF93YWl0KTsKKwkJaW5pdF9jb21wbGV0aW9uKCZjaC0+dnN5bmNfY29tcGxldGlvbik7CisJCWNoLT5wYW5fb2Zmc2V0ID0gMDsKKworCQkvKiBwcm9iZSB0aGUgYmFja2xpZ2h0IGlzIHRoZXJlIGlzIG9uZSBkZWZpbmVkICovCisJCWlmIChjaC0+Y2ZnLmJsX2luZm8ubWF4X2JyaWdodG5lc3MpCisJCQljaC0+YmwgPSBzaF9tb2JpbGVfbGNkY19ibF9wcm9iZSgmcGRldi0+ZGV2LCBjaCk7CisKKwkJc3dpdGNoIChwZGF0YS0+Y2hbaV0uY2hhbikgeworCQljYXNlIExDRENfQ0hBTl9NQUlOTENEOgorCQkJY2gtPmVuYWJsZWQgPSBMRENOVDJSX01FOworCQkJY2gtPnJlZ19vZmZzID0gbGNkY19vZmZzX21haW5sY2Q7CisJCQludW1fY2hhbm5lbHMrKzsKKwkJCWJyZWFrOworCQljYXNlIExDRENfQ0hBTl9TVUJMQ0Q6CisJCQljaC0+ZW5hYmxlZCA9IExEQ05UMlJfU0U7CisJCQljaC0+cmVnX29mZnMgPSBsY2RjX29mZnNfc3VibGNkOworCQkJbnVtX2NoYW5uZWxzKys7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghbnVtX2NoYW5uZWxzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGNoYW5uZWxzIGRlZmluZWRcbiIpOworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMTsKKwl9CisKKwkvKiBmb3IgZHVhbCBjaGFubmVsIExDREMgKE1BSU4gKyBTVUIpIGZvcmNlIHNoYXJlZCBicHAgc2V0dGluZyAqLworCWlmIChudW1fY2hhbm5lbHMgPT0gMikKKwkJcHJpdi0+Zm9yY2VkX2JwcCA9IHBkYXRhLT5jaFswXS5icHA7CisKKwlwcml2LT5iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFwcml2LT5iYXNlKQorCQlnb3RvIGVycjE7CisKKwllcnJvciA9IHNoX21vYmlsZV9sY2RjX3NldHVwX2Nsb2NrcyhwZGV2LCBwZGF0YS0+Y2xvY2tfc291cmNlLCBwcml2KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHNldHVwIGNsb2Nrc1xuIik7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlwcml2LT5tZXJhbV9kZXYgPSBwZGF0YS0+bWVyYW1fZGV2OworCisJZm9yIChpID0gMDsgaSA8IG51bV9jaGFubmVsczsgaSsrKSB7CisJCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaCA9IHByaXYtPmNoICsgaTsKKworCQllcnJvciA9IHNoX21vYmlsZV9sY2RjX2NoYW5uZWxfaW5pdChjaCwgJnBkZXYtPmRldik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyMTsKKwl9CisKKwllcnJvciA9IHNoX21vYmlsZV9sY2RjX3N0YXJ0KHByaXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgaGFyZHdhcmVcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9jaGFubmVsczsgaSsrKSB7CisJCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaCA9IHByaXYtPmNoICsgaTsKKwkJc3RydWN0IGZiX2luZm8gKmluZm8gPSBjaC0+aW5mbzsKKworCQlpZiAoaW5mby0+ZmJkZWZpbykgeworCQkJY2gtPnNnbGlzdCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkgKgorCQkJCQlpbmZvLT5maXguc21lbV9sZW4gPj4gUEFHRV9TSElGVCk7CisJCQlpZiAoIWNoLT5zZ2xpc3QpIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgc2dsaXN0XG4iKTsKKwkJCQlnb3RvIGVycjE7CisJCQl9CisJCX0KKworCQlpbmZvLT5ibF9kZXYgPSBjaC0+Ymw7CisKKwkJZXJyb3IgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZXJyMTsKKworCQlkZXZfaW5mbyhpbmZvLT5kZXYsCisJCQkgInJlZ2lzdGVyZWQgJXMvJXMgYXMgJWR4JWQgJWRicHAuXG4iLAorCQkJIHBkZXYtPm5hbWUsCisJCQkgKGNoLT5jZmcuY2hhbiA9PSBMQ0RDX0NIQU5fTUFJTkxDRCkgPworCQkJICJtYWlubGNkIiA6ICJzdWJsY2QiLAorCQkJIGluZm8tPnZhci54cmVzLCBpbmZvLT52YXIueXJlcywKKwkJCSBjaC0+Y2ZnLmJwcCk7CisKKwkJLyogZGVmZXJyZWQgaW8gbW9kZTogZGlzYWJsZSBjbG9jayB0byBzYXZlIHBvd2VyICovCisJCWlmIChpbmZvLT5mYmRlZmlvIHx8IGluZm8tPnN0YXRlID09IEZCSU5GT19TVEFURV9TVVNQRU5ERUQpCisJCQlzaF9tb2JpbGVfbGNkY19jbGtfb2ZmKHByaXYpOworCX0KKworCS8qIEZhaWx1cmUgaWdub3JlZCAqLworCXByaXYtPm5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBzaF9tb2JpbGVfbGNkY19ub3RpZnk7CisJZmJfcmVnaXN0ZXJfY2xpZW50KCZwcml2LT5ub3RpZmllcik7CisKKwlyZXR1cm4gMDsKK2VycjE6CisJc2hfbW9iaWxlX2xjZGNfcmVtb3ZlKHBkZXYpOworCisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaF9tb2JpbGVfbGNkY19kcml2ZXIgPSB7CiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCQk9ICJzaF9tb2JpbGVfbGNkY19mYiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuaCBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5oCmluZGV4IGFlZWQ2NjguLmE1OGEwZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5oCkBAIC0xOCw2ICsxOCwxMyBAQAogc3RydWN0IGZiX2luZm87CiBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZTsKIAorLyoKKyAqIHN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuIC0gTENEQyBkaXNwbGF5IGNoYW5uZWwKKyAqCisgKiBAYmFzZV9hZGRyX3k6IEZyYW1lIGJ1ZmZlciB2aWV3cG9ydCBiYXNlIGFkZHJlc3MgKGx1bWEgY29tcG9uZW50KQorICogQGJhc2VfYWRkcl9jOiBGcmFtZSBidWZmZXIgdmlld3BvcnQgYmFzZSBhZGRyZXNzIChjaHJvbWEgY29tcG9uZW50KQorICogQHBpdGNoOiBGcmFtZSBidWZmZXIgbGluZSBwaXRjaAorICovCiBzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiB7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKmxjZGM7CiAJdW5zaWduZWQgbG9uZyAqcmVnX29mZnM7CkBAIC0yNSw3ICszMiw2IEBACiAJdW5zaWduZWQgbG9uZyBlbmFibGVkOyAvKiBNRSBhbmQgU0UgaW4gTERDTlQyUiAqLwogCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuX2NmZyBjZmc7CiAJdTMyIHBzZXVkb19wYWxldHRlW1BBTEVUVEVfTlJdOwotCXVuc2lnbmVkIGxvbmcgc2F2ZWRfY2hfcmVnc1tOUl9DSF9SRUdTXTsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmw7CiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwpAQCAtNDAsNiArNDYsMTAgQEAKIAlpbnQgYmxhbmtfc3RhdHVzOwogCXN0cnVjdCBtdXRleCBvcGVuX2xvY2s7CQkvKiBwcm90ZWN0cyB0aGUgdXNlIGNvdW50ZXIgKi8KIAlpbnQgbWVyYW1fZW5hYmxlZDsKKworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyX3k7CisJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHJfYzsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmMgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9tZXJhbS5jCmluZGV4IGNjN2Q3MzIuLjRkNjM0OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmMKKysrIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uYwpAQCAtMTIsMjkgKzEyLDEwMyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgInNoX21vYmlsZV9tZXJhbS5oIgorI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9tZXJhbS5oPgogCiAvKiBtZXJhbSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTUV4eENUTCAweDAKLSNkZWZpbmUgTUV4eEJTSVpFIDB4NAotI2RlZmluZSBNRXh4TU5DRiAweDgKLSNkZWZpbmUgTUV4eFNBUkEgMHgxMAotI2RlZmluZSBNRXh4U0FSQiAweDE0Ci0jZGVmaW5lIE1FeHhTQlNJWkUgMHgxOAorI2RlZmluZSBNRVZDUjEJCQkweDQKKyNkZWZpbmUgTUVWQ1IxX1JTVAkJKDEgPDwgMzEpCisjZGVmaW5lIE1FVkNSMV9XRAkJKDEgPDwgMzApCisjZGVmaW5lIE1FVkNSMV9BTUQxCQkoMSA8PCAyOSkKKyNkZWZpbmUgTUVWQ1IxX0FNRDAJCSgxIDw8IDI4KQorI2RlZmluZSBNRVFTRUwxCQkJMHg0MAorI2RlZmluZSBNRVFTRUwyCQkJMHg0NAogCi0jZGVmaW5lIE1FUkFNX01FeHhDVExfVkFMKGN0bCwgbmV4dF9pY2IsIGFkZHIpCVwKLQkoKGN0bCkgfCAoKChuZXh0X2ljYikgJiAweDFmKSA8PCAxMSkgfCAoKChhZGRyKSAmIDB4N2ZmKSA8PCAxNikpCi0jZGVmaW5lCU1FUkFNX01FeHhCU0laRV9WQUwoYSwgYiwgYykgXAotCSgoKGEpIDw8IDI4KSB8ICgoYikgPDwgMTYpIHwgKGMpKQorI2RlZmluZSBNRXh4Q1RMCQkJMHg0MDAKKyNkZWZpbmUgTUV4eENUTF9CVgkJKDEgPDwgMzEpCisjZGVmaW5lIE1FeHhDVExfQlNaX1NISUZUCTI4CisjZGVmaW5lIE1FeHhDVExfTVNBUl9NQVNLCSgweDdmZiA8PCBNRXh4Q1RMX01TQVJfU0hJRlQpCisjZGVmaW5lIE1FeHhDVExfTVNBUl9TSElGVAkxNgorI2RlZmluZSBNRXh4Q1RMX05YVF9NQVNLCSgweDFmIDw8IE1FeHhDVExfTlhUX1NISUZUKQorI2RlZmluZSBNRXh4Q1RMX05YVF9TSElGVAkxMQorI2RlZmluZSBNRXh4Q1RMX1dEMQkJKDEgPDwgMTApCisjZGVmaW5lIE1FeHhDVExfV0QwCQkoMSA8PCA5KQorI2RlZmluZSBNRXh4Q1RMX1dTCQkoMSA8PCA4KQorI2RlZmluZSBNRXh4Q1RMX0NCCQkoMSA8PCA3KQorI2RlZmluZSBNRXh4Q1RMX1dCRgkJKDEgPDwgNikKKyNkZWZpbmUgTUV4eENUTF9XRgkJKDEgPDwgNSkKKyNkZWZpbmUgTUV4eENUTF9SRgkJKDEgPDwgNCkKKyNkZWZpbmUgTUV4eENUTF9DTQkJKDEgPDwgMykKKyNkZWZpbmUgTUV4eENUTF9NRF9SRUFECQkoMSA8PCAwKQorI2RlZmluZSBNRXh4Q1RMX01EX1dSSVRFCSgyIDw8IDApCisjZGVmaW5lIE1FeHhDVExfTURfSUNCX1dCCSgzIDw8IDApCisjZGVmaW5lIE1FeHhDVExfTURfSUNCCQkoNCA8PCAwKQorI2RlZmluZSBNRXh4Q1RMX01EX0ZCCQkoNyA8PCAwKQorI2RlZmluZSBNRXh4Q1RMX01EX01BU0sJCSg3IDw8IDApCisjZGVmaW5lIE1FeHhCU0laRQkJMHg0MDQKKyNkZWZpbmUgTUV4eEJTSVpFX1JDTlRfU0hJRlQJMjgKKyNkZWZpbmUgTUV4eEJTSVpFX1lTWk0xX1NISUZUCTE2CisjZGVmaW5lIE1FeHhCU0laRV9YU1pNMV9TSElGVAkwCisjZGVmaW5lIE1FeHhNTkNGCQkweDQwOAorI2RlZmluZSBNRXh4TU5DRl9LV0JOTV9TSElGVAkyOAorI2RlZmluZSBNRXh4TU5DRl9LUkJOTV9TSElGVAkyNAorI2RlZmluZSBNRXh4TU5DRl9CTk1fU0hJRlQJMTYKKyNkZWZpbmUgTUV4eE1OQ0ZfWEJWCQkoMSA8PCAxNSkKKyNkZWZpbmUgTUV4eE1OQ0ZfQ1BMX1lDQkNSNDQ0CSgxIDw8IDEyKQorI2RlZmluZSBNRXh4TU5DRl9DUExfWUNCQ1I0MjAJKDIgPDwgMTIpCisjZGVmaW5lIE1FeHhNTkNGX0NQTF9ZQ0JDUjQyMgkoMyA8PCAxMikKKyNkZWZpbmUgTUV4eE1OQ0ZfQ1BMX01TSwkoMyA8PCAxMikKKyNkZWZpbmUgTUV4eE1OQ0ZfQkwJCSgxIDw8IDIpCisjZGVmaW5lIE1FeHhNTkNGX0xOTV9TSElGVAkwCisjZGVmaW5lIE1FeHhTQVJBCQkweDQxMAorI2RlZmluZSBNRXh4U0FSQgkJMHg0MTQKKyNkZWZpbmUgTUV4eFNCU0laRQkJMHg0MTgKKyNkZWZpbmUgTUV4eFNCU0laRV9IRFYJCSgxIDw8IDMxKQorI2RlZmluZSBNRXh4U0JTSVpFX0hTWjE2CSgwIDw8IDI4KQorI2RlZmluZSBNRXh4U0JTSVpFX0hTWjMyCSgxIDw8IDI4KQorI2RlZmluZSBNRXh4U0JTSVpFX0hTWjY0CSgyIDw8IDI4KQorI2RlZmluZSBNRXh4U0JTSVpFX0hTWjEyOAkoMyA8PCAyOCkKKyNkZWZpbmUgTUV4eFNCU0laRV9TQlNJWlpfU0hJRlQJMAogCi0jZGVmaW5lIE1FVkNSMSAweDQKLSNkZWZpbmUgTUVBQ1RTIDB4MTAKLSNkZWZpbmUgTUVRU0VMMSAweDQwCi0jZGVmaW5lIE1FUVNFTDIgMHg0NAorI2RlZmluZSBNRVJBTV9NRXh4Q1RMX1ZBTChuZXh0LCBhZGRyKQlcCisJKCgoKG5leHQpIDw8IE1FeHhDVExfTlhUX1NISUZUKSAmIE1FeHhDVExfTlhUX01BU0spIHwgXAorCSAoKChhZGRyKSA8PCBNRXh4Q1RMX01TQVJfU0hJRlQpICYgTUV4eENUTF9NU0FSX01BU0spKQorI2RlZmluZQlNRVJBTV9NRXh4QlNJWkVfVkFMKHJjbnQsIHlzem0xLCB4c3ptMSkgXAorCSgoKHJjbnQpIDw8IE1FeHhCU0laRV9SQ05UX1NISUZUKSB8IFwKKwkgKCh5c3ptMSkgPDwgTUV4eEJTSVpFX1lTWk0xX1NISUZUKSB8IFwKKwkgKCh4c3ptMSkgPDwgTUV4eEJTSVpFX1hTWk0xX1NISUZUKSkKKworI2RlZmluZSBTSF9NT0JJTEVfTUVSQU1fSUNCX05VTQkJMzIKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29tbW9uX3JlZ3NbXSA9IHsKKwlNRVZDUjEsCisJTUVRU0VMMSwKKwlNRVFTRUwyLAorfTsKKyNkZWZpbmUgQ01OX1JFR1NfU0laRSBBUlJBWV9TSVpFKGNvbW1vbl9yZWdzKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpY2JfcmVnc1tdID0geworCU1FeHhDVEwsCisJTUV4eEJTSVpFLAorCU1FeHhNTkNGLAorCU1FeHhTQVJBLAorCU1FeHhTQVJCLAorCU1FeHhTQlNJWkUsCit9OworI2RlZmluZSBJQ0JfUkVHU19TSVpFIEFSUkFZX1NJWkUoaWNiX3JlZ3MpCisKK3N0cnVjdCBzaF9tb2JpbGVfbWVyYW1fcHJpdiB7CisJdm9pZCBfX2lvbWVtCSpiYXNlOworCXN0cnVjdCBtdXRleAlsb2NrOworCXVuc2lnbmVkIGxvbmcJdXNlZF9pY2I7CisJaW50CQl1c2VkX21lcmFtX2NhY2hlX3JlZ2lvbnM7CisJdW5zaWduZWQgbG9uZwl1c2VkX21lcmFtX2NhY2hlW1NIX01PQklMRV9NRVJBTV9JQ0JfTlVNXTsKKwl1bnNpZ25lZCBsb25nCWNtbl9zYXZlZF9yZWdzW0NNTl9SRUdTX1NJWkVdOworCXVuc2lnbmVkIGxvbmcJaWNiX3NhdmVkX3JlZ3NbSUNCX1JFR1NfU0laRSAqIFNIX01PQklMRV9NRVJBTV9JQ0JfTlVNXTsKK307CiAKIC8qIHNldHRpbmdzICovCiAjZGVmaW5lIE1FUkFNX1NFQ19MSU5FIDE1CkBAIC00NCw4ICsxMTgsNyBAQAogICogTUVSQU0vSUNCIGFjY2VzcyBmdW5jdGlvbnMKICAqLwogCi0jZGVmaW5lIE1FUkFNX0lDQl9PRkZTRVQoYmFzZSwgaWR4LCBvZmYpCVwKLQkoKGJhc2UpICsgKDB4NDAwICsgKChpZHgpICogMHgyMCkgKyAob2ZmKSkpCisjZGVmaW5lIE1FUkFNX0lDQl9PRkZTRVQoYmFzZSwgaWR4LCBvZmYpCSgoYmFzZSkgKyAob2ZmKSArIChpZHgpICogMHgyMCkKIAogc3RhdGljIGlubGluZSB2b2lkIG1lcmFtX3dyaXRlX2ljYih2b2lkIF9faW9tZW0gKmJhc2UsIGludCBpZHgsIGludCBvZmYsCiAJdW5zaWduZWQgbG9uZyB2YWwpCkBAIC0yODAsMTcgKzM1MywxOCBAQAogCS8qCiAJICogU2V0IE1FUkFNIGZvciBmcmFtZWJ1ZmZlcgogCSAqCi0JICogMHg3MGY6ICBXRCA9IDB4MywgV1M9MHgxLCBDTT0weDEsIE1EPUZCIG1vZGUKIAkgKiB3ZSBhbHNvIGNoYWluIHRoZSBjYWNoZV9pY2IgYW5kIHRoZSBtYXJrZXJfaWNiLgogCSAqIHdlIGFsc28gc3BsaXQgdGhlIGFsbG9jYXRlZCBNRVJBTSBidWZmZXIgYmV0d2VlbiB0d28gSUNCcy4KIAkgKi8KIAltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaWNiLT5jYWNoZV9pY2IsIE1FeHhDVEwsCi0JCQlNRVJBTV9NRXh4Q1RMX1ZBTCgweDcwZiwgaWNiLT5tYXJrZXJfaWNiLAotCQkJCQkgIGljYi0+bWVyYW1fb2Zmc2V0KSk7CisJCQlNRVJBTV9NRXh4Q1RMX1ZBTChpY2ItPm1hcmtlcl9pY2IsIGljYi0+bWVyYW1fb2Zmc2V0KSB8CisJCQlNRXh4Q1RMX1dEMSB8IE1FeHhDVExfV0QwIHwgTUV4eENUTF9XUyB8IE1FeHhDVExfQ00gfAorCQkJTUV4eENUTF9NRF9GQik7CiAJbWVyYW1fd3JpdGVfaWNiKHByaXYtPmJhc2UsIGljYi0+bWFya2VyX2ljYiwgTUV4eENUTCwKLQkJCU1FUkFNX01FeHhDVExfVkFMKDB4NzBmLCBpY2ItPmNhY2hlX2ljYiwKLQkJCQkJICBpY2ItPm1lcmFtX29mZnNldCArCi0JCQkJCSAgaWNiLT5tZXJhbV9zaXplIC8gMikpOworCQkJTUVSQU1fTUV4eENUTF9WQUwoaWNiLT5jYWNoZV9pY2IsIGljYi0+bWVyYW1fb2Zmc2V0ICsKKwkJCQkJICBpY2ItPm1lcmFtX3NpemUgLyAyKSB8CisJCQlNRXh4Q1RMX1dEMSB8IE1FeHhDVExfV0QwIHwgTUV4eENUTF9XUyB8IE1FeHhDVExfQ00gfAorCQkJTUV4eENUTF9NRF9GQik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5OSw4ICszNzMsMTAgQEAKIAkJCXN0cnVjdCBzaF9tb2JpbGVfbWVyYW1faWNiICppY2IpCiB7CiAJLyogZGlzYWJsZSBJQ0IgKi8KLQltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaWNiLT5jYWNoZV9pY2IsICBNRXh4Q1RMLCAwKTsKLQltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaWNiLT5tYXJrZXJfaWNiLCBNRXh4Q1RMLCAwKTsKKwltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaWNiLT5jYWNoZV9pY2IsICBNRXh4Q1RMLAorCQkJTUV4eENUTF9XQkYgfCBNRXh4Q1RMX1dGIHwgTUV4eENUTF9SRik7CisJbWVyYW1fd3JpdGVfaWNiKHByaXYtPmJhc2UsIGljYi0+bWFya2VyX2ljYiwgTUV4eENUTCwKKwkJCU1FeHhDVExfV0JGIHwgTUV4eENUTF9XRiB8IE1FeHhDVExfUkYpOwogCWljYi0+Y2FjaGVfdW5pdCA9IDA7CiB9CiAKQEAgLTMzNywyNCArNDEzLDIyIEBACiAJCXhyZXMsIHlyZXMsICghcGl4ZWxmb3JtYXQpID8gInl1diIgOiAicmdiIiwKIAkJYmFzZV9hZGRyX3ksIGJhc2VfYWRkcl9jKTsKIAotCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwotCiAJLyogd2UgY2FuJ3QgaGFuZGxlIHdpZGVyIHRoYW4gODE5MnB4ICovCiAJaWYgKHhyZXMgPiA4MTkyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIndpZHRoIGV4Y2VlZGluZyB0aGUgbGltaXQgKD4gODE5MikuIik7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKHByaXYtPnVzZWRfbWVyYW1fY2FjaGVfcmVnaW9ucyArIDIgPiBTSF9NT0JJTEVfTUVSQU1fSUNCX05VTSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtb3JlIElDQiBhdmFpbGFibGUuIik7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBlcnI7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIGRvIHdlIGhhdmUgYXQgbGVhc3Qgb25lIElDQiBjb25maWc/ICovCiAJaWYgKGNmZy0+aWNiWzBdLm1hcmtlcl9pY2IgPCAwIHx8IGNmZy0+aWNiWzBdLmNhY2hlX2ljYiA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiYXQgbGVhc3Qgb25lIElDQiBpcyByZXF1aXJlZC4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisKKwlpZiAocHJpdi0+dXNlZF9tZXJhbV9jYWNoZV9yZWdpb25zICsgMiA+IFNIX01PQklMRV9NRVJBTV9JQ0JfTlVNKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1vcmUgSUNCIGF2YWlsYWJsZS4iKTsKIAkJZXJyb3IgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKIAl9CkBAIC00NjAsNiArNTM0LDU3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2hfbW9iaWxlX21lcmFtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBrLCBqOworCisJZm9yIChrID0gMDsgayA8IENNTl9SRUdTX1NJWkU7IGsrKykKKwkJcHJpdi0+Y21uX3NhdmVkX3JlZ3Nba10gPSBtZXJhbV9yZWFkX3JlZyhwcml2LT5iYXNlLAorCQkJY29tbW9uX3JlZ3Nba10pOworCisJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKKwkJaWYgKCF0ZXN0X2JpdChqLCAmcHJpdi0+dXNlZF9pY2IpKQorCQkJY29udGludWU7CisJCWZvciAoayA9IDA7IGsgPCBJQ0JfUkVHU19TSVpFOyBrKyspIHsKKwkJCXByaXYtPmljYl9zYXZlZF9yZWdzW2ogKiBJQ0JfUkVHU19TSVpFICsga10gPQorCQkJCW1lcmFtX3JlYWRfaWNiKHByaXYtPmJhc2UsIGosIGljYl9yZWdzW2tdKTsKKwkJCS8qIFJlc2V0IElDQiBvbiByZXN1bWUgKi8KKwkJCWlmIChpY2JfcmVnc1trXSA9PSBNRXh4Q1RMKQorCQkJCXByaXYtPmljYl9zYXZlZF9yZWdzW2ogKiBJQ0JfUkVHU19TSVpFICsga10gfD0KKwkJCQkJTUV4eENUTF9XQkYgfCBNRXh4Q1RMX1dGIHwgTUV4eENUTF9SRjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaF9tb2JpbGVfbWVyYW1fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaywgajsKKworCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisJCWlmICghdGVzdF9iaXQoaiwgJnByaXYtPnVzZWRfaWNiKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGsgPSAwOyBrIDwgSUNCX1JFR1NfU0laRTsgaysrKSB7CisJCQltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaiwgaWNiX3JlZ3Nba10sCisJCQlwcml2LT5pY2Jfc2F2ZWRfcmVnc1tqICogSUNCX1JFR1NfU0laRSArIGtdKTsKKwkJfQorCX0KKworCWZvciAoayA9IDA7IGsgPCBDTU5fUkVHU19TSVpFOyBrKyspCisJCW1lcmFtX3dyaXRlX3JlZyhwcml2LT5iYXNlLCBjb21tb25fcmVnc1trXSwKKwkJCXByaXYtPmNtbl9zYXZlZF9yZWdzW2tdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNoX21vYmlsZV9tZXJhbV9kZXZfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSBzaF9tb2JpbGVfbWVyYW1fcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IHNoX21vYmlsZV9tZXJhbV9ydW50aW1lX3Jlc3VtZSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX29wcyBzaF9tb2JpbGVfbWVyYW1fb3BzID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAogCS5tZXJhbV9yZWdpc3RlcgkJPSBzaF9tb2JpbGVfbWVyYW1fcmVnaXN0ZXIsCkBAIC01MTMsNyArNjM4LDkgQEAKIAogCS8qIGluaXRpYWxpemUgSUNCIGFkZHJlc3NpbmcgbW9kZSAqLwogCWlmIChwZGF0YS0+YWRkcl9tb2RlID09IFNIX01PQklMRV9NRVJBTV9NT0RFMSkKLQkJbWVyYW1fd3JpdGVfcmVnKHByaXYtPmJhc2UsIE1FVkNSMSwgMSA8PCAyOSk7CisJCW1lcmFtX3dyaXRlX3JlZyhwcml2LT5iYXNlLCBNRVZDUjEsIE1FVkNSMV9BTUQxKTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgInNoX21vYmlsZV9tZXJhbSBpbml0aWFsaXplZC4iKTsKIApAQCAtNTMwLDYgKzY1Nyw4IEBACiB7CiAJc3RydWN0IHNoX21vYmlsZV9tZXJhbV9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisKIAlpZiAocHJpdi0+YmFzZSkKIAkJaW91bm1hcChwcml2LT5iYXNlKTsKIApAQCAtNTQ0LDYgKzY3Myw3IEBACiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJCT0gInNoX21vYmlsZV9tZXJhbSIsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBtCQk9ICZzaF9tb2JpbGVfbWVyYW1fZGV2X3BtX29wcywKIAl9LAogCS5wcm9iZQkJPSBzaF9tb2JpbGVfbWVyYW1fcHJvYmUsCiAJLnJlbW92ZQkJPSBzaF9tb2JpbGVfbWVyYW1fcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uaCBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzU0ZmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSNpZm5kZWYgX19zaF9tb2JpbGVfbWVyYW1faF9fCi0jZGVmaW5lIF9fc2hfbW9iaWxlX21lcmFtX2hfXwotCi0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDx2aWRlby9zaF9tb2JpbGVfbWVyYW0uaD4KLQotLyoKLSAqIE1FUkFNIHByaXZhdGUKLSAqLwotCi0jZGVmaW5lIE1FUkFNX0lDQl9ZIDB4MQotI2RlZmluZSBNRVJBTV9JQ0JfQyAweDIKLQotLyogTUVSQU0gY2FjaGUgc2l6ZSAqLwotI2RlZmluZSBTSF9NT0JJTEVfTUVSQU1fSUNCX05VTQkJMzIKLQotI2RlZmluZSBTSF9NT0JJTEVfTUVSQU1fQ0FDSEVfT0ZGU0VUKHApCSgocCkgPj4gMTYpCi0jZGVmaW5lIFNIX01PQklMRV9NRVJBTV9DQUNIRV9TSVpFKHApCSgocCkgJiAweGZmZmYpCi0KLXN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fcHJpdiB7Ci0Jdm9pZCBfX2lvbWVtCSpiYXNlOwotCXN0cnVjdCBtdXRleAlsb2NrOwotCXVuc2lnbmVkIGxvbmcJdXNlZF9pY2I7Ci0JaW50CQl1c2VkX21lcmFtX2NhY2hlX3JlZ2lvbnM7Ci0JdW5zaWduZWQgbG9uZwl1c2VkX21lcmFtX2NhY2hlW1NIX01PQklMRV9NRVJBTV9JQ0JfTlVNXTsKLX07Ci0KLWludCBzaF9tb2JpbGVfbWVyYW1fYWxsb2NfaWNiKGNvbnN0IHN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fY2ZnICpjZmcsCi0JCSAgIGludCB4cmVzLAotCQkgICBpbnQgeXJlcywKLQkJICAgdW5zaWduZWQgaW50IGJhc2VfYWRkciwKLQkJICAgaW50IHl1dl9tb2RlLAotCQkgICBpbnQgKm1hcmtlcl9pY2IsCi0JCSAgIGludCAqb3V0X3BpdGNoKTsKLQotdm9pZCBzaF9tb2JpbGVfbWVyYW1fZnJlZV9pY2IoaW50IG1hcmtlcl9pY2IpOwotCi0jZGVmaW5lIFNIX01PQklMRV9NRVJBTV9TVEFSVChpbmQsIGFiKSBcCi0JKDB4QzAwMDAwMDAgfCAoKGFiICYgMHgxKSA8PCAyMykgfCAoKGluZCAmIDB4MUYpIDw8IDI0KSkKLQotI2VuZGlmIC8qICFfX3NoX21vYmlsZV9tZXJhbV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCmluZGV4IDc1MjU5ODQuLjA3OGNhMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKKysrIGIvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYwpAQCAtMTMzMywxOSArMTMzMywxNCBAQAogfQogCiBzdGF0aWMgaW50Ci1zaXNmYl9wYW5fdmFyKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3Npc2ZiX3Bhbl92YXIoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHN0cnVjdCBmYl9pbmZvICppbmZvLAorCSAgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewotCWlmKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmKHZhci0+eW9mZnNldCA+ICh2YXItPnlyZXNfdmlydHVhbCAtIHZhci0+eXJlcykpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaXZpZGVvLT5jdXJyZW50X2Jhc2UgPSAodmFyLT55b2Zmc2V0ICogdmFyLT54cmVzX3ZpcnR1YWwpICsgdmFyLT54b2Zmc2V0OworCWl2aWRlby0+Y3VycmVudF9iYXNlID0gdmFyLT55b2Zmc2V0ICogaW5mby0+dmFyLnhyZXNfdmlydHVhbAorCQkJICAgICArIHZhci0+eG9mZnNldDsKIAogCS8qIGNhbGN1bGF0ZSBiYXNlIGJwcCBkZXAuICovCi0Jc3dpdGNoKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewogCWNhc2UgMzI6CiAJCWJyZWFrOwogCWNhc2UgMTY6CkBAIC0xNjM1LDIwICsxNjMwLDE1IEBACiAJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOwogCWludCBlcnI7CiAKLQlpZih2YXItPnhvZmZzZXQgPiAodmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXMpKQorCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYodmFyLT55b2Zmc2V0ID4gKHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzKSkKKwlpZiAodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsIHx8CisJICAgIHZhci0+eW9mZnNldCArIGluZm8tPnZhci55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZih2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsIHx8Ci0JICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmKChlcnIgPSBzaXNmYl9wYW5fdmFyKGl2aWRlbywgdmFyKSkgPCAwKQorCWVyciA9IHNpc2ZiX3Bhbl92YXIoaXZpZGVvLCBpbmZvLCB2YXIpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJaW5mby0+dmFyLnhvZmZzZXQgPSB2YXItPnhvZmZzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NrZWxldG9uZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCmluZGV4IDg5MTU4YmMuLjMwZjdhODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCkBAIC05ODksNyArOTg5LDcgQEAKICAqLwogaW50IF9faW5pdCB4eHhmYl9zZXR1cChjaGFyICpvcHRpb25zKQogewotICAgIC8qIFBhcnNlIHVzZXIgc3BlZmljaWVkIG9wdGlvbnMgKGB2aWRlbz14eHhmYjonKSAqLworICAgIC8qIFBhcnNlIHVzZXIgc3BlY2lmaWVkIG9wdGlvbnMgKGB2aWRlbz14eHhmYjonKSAqLwogfQogI2VuZGlmIC8qIE1PRFVMRSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NtNTAxZmIuYyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCmluZGV4IDYyOTRkY2EuLmE3ODI1NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCkBAIC01ODIsNyArNTgyLDcgQEAKIHsKIAlzdHJ1Y3Qgc201MDFmYl9wYXIgICpwYXIgPSBpbmZvLT5wYXI7CiAJc3RydWN0IHNtNTAxZmJfaW5mbyAqZmJpID0gcGFyLT5pbmZvOwotCXVuc2lnbmVkIGludCBieXRlc19waXhlbCA9IHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OworCXVuc2lnbmVkIGludCBieXRlc19waXhlbCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDg7CiAJdW5zaWduZWQgbG9uZyByZWc7CiAJdW5zaWduZWQgbG9uZyB4b2ZmczsKIApAQCAtNjE0LDEwICs2MTQsMTAgQEAKIAlzdHJ1Y3Qgc201MDFmYl9pbmZvICpmYmkgPSBwYXItPmluZm87CiAJdW5zaWduZWQgbG9uZyByZWc7CiAKLQlyZWcgPSB2YXItPnhvZmZzZXQgfCAodmFyLT54cmVzX3ZpcnR1YWwgPDwgMTYpOworCXJlZyA9IHZhci0+eG9mZnNldCB8IChpbmZvLT52YXIueHJlc192aXJ0dWFsIDw8IDE2KTsKIAlzbWM1MDFfd3JpdGVsKHJlZywgZmJpLT5yZWdzICsgU001MDFfRENfUEFORUxfRkJfV0lEVEgpOwogCi0JcmVnID0gdmFyLT55b2Zmc2V0IHwgKHZhci0+eXJlc192aXJ0dWFsIDw8IDE2KTsKKwlyZWcgPSB2YXItPnlvZmZzZXQgfCAoaW5mby0+dmFyLnlyZXNfdmlydHVhbCA8PCAxNik7CiAJc21jNTAxX3dyaXRlbChyZWcsIGZiaS0+cmVncyArIFNNNTAxX0RDX1BBTkVMX0ZCX0hFSUdIVCk7CiAKIAlzbTUwMWZiX3N5bmNfcmVncyhmYmkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zbXNjdWZ4LmMgYi9kcml2ZXJzL3ZpZGVvL3Ntc2N1ZnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWNjZmZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9zbXNjdWZ4LmMKQEAgLTAsMCArMSwxOTk0IEBACisvKgorICogc21zY3VmeC5jIC0tIEZyYW1lYnVmZmVyIGRyaXZlciBmb3IgU01TQyBVRlggVVNCIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU3RldmUgR2xlbmRpbm5pbmcgPHN0ZXZlLmdsZW5kaW5uaW5nQHNtc2MuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJvYmVydG8gRGUgSW9yaXMgPHJvYmVydG9AdW5iaXQuaXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmF5YSBLdW1hciA8amF5YWt1bWFyLmxrbWxAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IEJlcm5pZSBUaG9tcHNvbiA8YmVybmllQHBsdWdhYmxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2Mi4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBCYXNlZCBvbiB1ZGxmYiwgd2l0aCB3b3JrIGZyb20gRmxvcmlhbiBFY2h0bGVyLCBIZW5yaWsgQmplcnJlZ2FhcmQgUGVkZXJzZW4sCisgKiBhbmQgb3RoZXJzLgorICoKKyAqIFdvcmtzIHdlbGwgd2l0aCBCZXJuaWUgVGhvbXBzb24ncyBYIERBTUFHRSBwYXRjaCB0byB4Zjg2LXZpZGVvLWZiZGV2CisgKiBhdmFpbGFibGUgZnJvbSBodHRwOi8vZ2l0LnBsdWdhYmxlLmNvbQorICoKKyAqIExheW91dCBpcyBiYXNlZCBvbiBza2VsZXRvbmZiIGJ5IEphbWVzIFNpbW1vbnMgYW5kIEdlZXJ0IFV5dHRlcmhvZXZlbiwKKyAqIHVzYi1za2VsZXRvbiBieSBHcmVnS0guCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImVkaWQuaCIKKworI2RlZmluZSBjaGVja193YXJuKHN0YXR1cywgZm10LCBhcmdzLi4uKSBcCisJKHsgaWYgKHN0YXR1cyA8IDApIHByX3dhcm4oZm10LCAjI2FyZ3MpOyB9KQorCisjZGVmaW5lIGNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgZm10LCBhcmdzLi4uKSBcCisJKHsgaWYgKHN0YXR1cyA8IDApIHsgcHJfd2FybihmbXQsICMjYXJncyk7IHJldHVybiBzdGF0dXM7IH0gfSkKKworI2RlZmluZSBjaGVja193YXJuX2dvdG9fZXJyb3Ioc3RhdHVzLCBmbXQsIGFyZ3MuLi4pIFwKKwkoeyBpZiAoc3RhdHVzIDwgMCkgeyBwcl93YXJuKGZtdCwgIyNhcmdzKTsgZ290byBlcnJvcjsgfSB9KQorCisjZGVmaW5lIGFsbF9iaXRzX3NldCh4LCBiaXRzKSAoKCh4KSAmIChiaXRzKSkgPT0gKGJpdHMpKQorCisjZGVmaW5lIFVTQl9WRU5ET1JfUkVRVUVTVF9XUklURV9SRUdJU1RFUgkweEEwCisjZGVmaW5lIFVTQl9WRU5ET1JfUkVRVUVTVF9SRUFEX1JFR0lTVEVSCTB4QTEKKworLyoKKyAqIFRPRE86IFByb3Bvc2Ugc3RhbmRhcmQgZmIuaCBpb2N0bCBmb3IgcmVwb3J0aW5nIGRhbWFnZSwKKyAqIHVzaW5nIF9JT1dSKCkgYW5kIG9uZSBvZiB0aGUgZXhpc3RpbmcgYXJlYSBzdHJ1Y3RzIGZyb20gZmIuaAorICogQ29uc2lkZXIgdGhlc2UgaW9jdGxzIGRlcHJlY2F0ZWQsIGJ1dCB0aGV5J3JlIHN0aWxsIHVzZWQgYnkgdGhlCisgKiBEaXNwbGF5TGluayBYIHNlcnZlciBhcyB5ZXQgLSBuZWVkIGJvdGggdG8gYmUgbW9kaWZpZWQgaW4gdGFuZGVtCisgKiB3aGVuIG5ldyBpb2N0bChzKSBhcmUgcmVhZHkuCisgKi8KKyNkZWZpbmUgVUZYX0lPQ1RMX1JFVFVSTl9FRElECSgweEFEKQorI2RlZmluZSBVRlhfSU9DVExfUkVQT1JUX0RBTUFHRQkoMHhBQSkKKworLyogLUJVTEtfU0laRSBhcyBwZXIgdXNiLXNrZWxldG9uLiBDYW4gd2UgZ2V0IGZ1bGwgcGFnZSBhbmQgYXZvaWQgb3ZlcmhlYWQ/ICovCisjZGVmaW5lIEJVTEtfU0laRQkJKDUxMikKKyNkZWZpbmUgTUFYX1RSQU5TRkVSCQkoUEFHRV9TSVpFKjE2IC0gQlVMS19TSVpFKQorI2RlZmluZSBXUklURVNfSU5fRkxJR0hUCSg0KQorCisjZGVmaW5lIEdFVF9VUkJfVElNRU9VVAkJKEhaKQorI2RlZmluZSBGUkVFX1VSQl9USU1FT1VUCShIWioyKQorCisjZGVmaW5lIEJQUAkJCTIKKworI2RlZmluZSBVRlhfREVGSU9fV1JJVEVfREVMQVkJNSAvKiBmYl9kZWZlcnJlZF9pby5kZWxheSBpbiBqaWZmaWVzICovCisjZGVmaW5lIFVGWF9ERUZJT19XUklURV9ESVNBQkxFCShIWio2MCkgLyogImRpc2FibGUiIHdpdGggbG9uZyBkZWxheSAqLworCitzdHJ1Y3QgZGxvYXJlYSB7CisJaW50IHgsIHk7CisJaW50IHcsIGg7Cit9OworCitzdHJ1Y3QgdXJiX25vZGUgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJc3RydWN0IHVmeF9kYXRhICpkZXY7CisJc3RydWN0IGRlbGF5ZWRfd29yayByZWxlYXNlX3VyYl93b3JrOworCXN0cnVjdCB1cmIgKnVyYjsKK307CisKK3N0cnVjdCB1cmJfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxpbWl0X3NlbTsKKwlpbnQgYXZhaWxhYmxlOworCWludCBjb3VudDsKKwlzaXplX3Qgc2l6ZTsKK307CisKK3N0cnVjdCB1ZnhfZGF0YSB7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IGRldmljZSAqZ2RldjsgLyogJnVkZXYtPmRldiAqLworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCB1cmJfbGlzdCB1cmJzOworCXN0cnVjdCBrcmVmIGtyZWY7CisJaW50IGZiX2NvdW50OworCWJvb2wgdmlydHVhbGl6ZWQ7IC8qIHRydWUgd2hlbiBwaHlzaWNhbCB1c2IgZGV2aWNlIG5vdCBwcmVzZW50ICovCisJc3RydWN0IGRlbGF5ZWRfd29yayBmcmVlX2ZyYW1lYnVmZmVyX3dvcms7CisJYXRvbWljX3QgdXNiX2FjdGl2ZTsgLyogMCA9IHVwZGF0ZSB2aXJ0dWFsIGJ1ZmZlciwgYnV0IG5vIHVzYiB0cmFmZmljICovCisJYXRvbWljX3QgbG9zdF9waXhlbHM7IC8qIDEgPSBhIHJlbmRlciBvcCBmYWlsZWQuIE5lZWQgc2NyZWVuIHJlZnJlc2ggKi8KKwl1OCAqZWRpZDsgLyogbnVsbCB1bnRpbCB3ZSByZWFkIGVkaWQgZnJvbSBodyBvciBnZXQgZnJvbSBzeXNmcyAqLworCXNpemVfdCBlZGlkX3NpemU7CisJdTMyIHBzZXVkb19wYWxldHRlWzI1Nl07Cit9OworCitzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHVmeF9maXggPSB7CisJLmlkID0gICAgICAgICAgICJzbXNjdWZ4IiwKKwkudHlwZSA9ICAgICAgICAgRkJfVFlQRV9QQUNLRURfUElYRUxTLAorCS52aXN1YWwgPSAgICAgICBGQl9WSVNVQUxfVFJVRUNPTE9SLAorCS54cGFuc3RlcCA9ICAgICAwLAorCS55cGFuc3RlcCA9ICAgICAwLAorCS55d3JhcHN0ZXAgPSAgICAwLAorCS5hY2NlbCA9ICAgICAgICBGQl9BQ0NFTF9OT05FLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBzbXNjdWZ4X2luZm9fZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19SRUFEU19GQVNUIHwKKwlGQklORk9fVklSVEZCIHwJRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUIHwgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QgfAorCUZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBIHwgRkJJTkZPX01JU0NfQUxXQVlTX1NFVFBBUjsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwNDI0LCAweDlkMDApLH0sCisJe1VTQl9ERVZJQ0UoMHgwNDI0LCAweDlkMDEpLH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKKworLyogbW9kdWxlIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgY29uc29sZTsgICAvKiBPcHRpb25hbGx5IGFsbG93IGZiY29uIHRvIGNvbnN1bWUgZmlyc3QgZnJhbWVidWZmZXIgKi8KK3N0YXRpYyBpbnQgZmJfZGVmaW8gPSB0cnVlOyAgLyogT3B0aW9uYWxseSBlbmFibGUgZmJfZGVmaW8gbW1hcCBzdXBwb3J0ICovCisKKy8qIHVmeCBrZWVwcyBhIGxpc3Qgb2YgdXJicyBmb3IgZWZmaWNpZW50IGJ1bGsgdHJhbnNmZXJzICovCitzdGF0aWMgdm9pZCB1ZnhfdXJiX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyBzdHJ1Y3QgdXJiICp1ZnhfZ2V0X3VyYihzdHJ1Y3QgdWZ4X2RhdGEgKmRldik7CitzdGF0aWMgaW50IHVmeF9zdWJtaXRfdXJiKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBzdHJ1Y3QgdXJiICogdXJiLCBzaXplX3QgbGVuKTsKK3N0YXRpYyBpbnQgdWZ4X2FsbG9jX3VyYl9saXN0KHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBpbnQgY291bnQsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIHVmeF9mcmVlX3VyYl9saXN0KHN0cnVjdCB1ZnhfZGF0YSAqZGV2KTsKKworLyogcmVhZHMgYSBjb250cm9sIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IHVmeF9yZWdfcmVhZChzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTMyIGluZGV4LCB1MzIgKmRhdGEpCit7CisJdTMyICpidWYgPSBrbWFsbG9jKDQsIEdGUF9LRVJORUwpOworCWludCByZXQ7CisKKwlCVUdfT04oIWRldik7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKKwkJVVNCX1ZFTkRPUl9SRVFVRVNUX1JFQURfUkVHSVNURVIsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkwMCwgaW5kZXgsIGJ1ZiwgNCwgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCisJbGUzMl90b19jcHVzKGJ1Zik7CisJKmRhdGEgPSAqYnVmOworCWtmcmVlKGJ1Zik7CisKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCXByX3dhcm4oIkZhaWxlZCB0byByZWFkIHJlZ2lzdGVyIGluZGV4IDB4JTA4eFxuIiwgaW5kZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyogd3JpdGVzIGEgY29udHJvbCByZWdpc3RlciAqLworc3RhdGljIGludCB1ZnhfcmVnX3dyaXRlKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCB1MzIgaW5kZXgsIHUzMiBkYXRhKQoreworCXUzMiAqYnVmID0ga21hbGxvYyg0LCBHRlBfS0VSTkVMKTsKKwlpbnQgcmV0OworCisJQlVHX09OKCFkZXYpOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJKmJ1ZiA9IGRhdGE7CisJY3B1X3RvX2xlMzJzKGJ1Zik7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKKwkJVVNCX1ZFTkRPUl9SRVFVRVNUX1dSSVRFX1JFR0lTVEVSLAorCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCTAwLCBpbmRleCwgYnVmLCA0LCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisKKwlrZnJlZShidWYpOworCisJaWYgKHVubGlrZWx5KHJldCA8IDApKQorCQlwcl93YXJuKCJGYWlsZWQgdG8gd3JpdGUgcmVnaXN0ZXIgaW5kZXggMHglMDh4IHdpdGggdmFsdWUgIgorCQkJIjB4JTA4eFxuIiwgaW5kZXgsIGRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1ZnhfcmVnX2NsZWFyX2FuZF9zZXRfYml0cyhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTMyIGluZGV4LAorCXUzMiBiaXRzX3RvX2NsZWFyLCB1MzIgYml0c190b19zZXQpCit7CisJdTMyIGRhdGE7CisJaW50IHN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIGluZGV4LCAmZGF0YSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3JlZ19jbGVhcl9hbmRfc2V0X2JpdHMgZXJyb3IgcmVhZGluZyAiCisJCSIweCV4IiwgaW5kZXgpOworCisJZGF0YSAmPSAofmJpdHNfdG9fY2xlYXIpOworCWRhdGEgfD0gYml0c190b19zZXQ7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgaW5kZXgsIGRhdGEpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9yZWdfY2xlYXJfYW5kX3NldF9iaXRzIGVycm9yIHdyaXRpbmcgIgorCQkiMHgleCIsIGluZGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVmeF9yZWdfc2V0X2JpdHMoc3RydWN0IHVmeF9kYXRhICpkZXYsIHUzMiBpbmRleCwgdTMyIGJpdHMpCit7CisJcmV0dXJuIHVmeF9yZWdfY2xlYXJfYW5kX3NldF9iaXRzKGRldiwgaW5kZXgsIDAsIGJpdHMpOworfQorCitzdGF0aWMgaW50IHVmeF9yZWdfY2xlYXJfYml0cyhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTMyIGluZGV4LCB1MzIgYml0cykKK3sKKwlyZXR1cm4gdWZ4X3JlZ19jbGVhcl9hbmRfc2V0X2JpdHMoZGV2LCBpbmRleCwgYml0cywgMCk7Cit9CisKK3N0YXRpYyBpbnQgdWZ4X2xpdGVfcmVzZXQoc3RydWN0IHVmeF9kYXRhICpkZXYpCit7CisJaW50IHN0YXR1czsKKwl1MzIgdmFsdWU7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgzMDA4LCAweDAwMDAwMDAxKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfbGl0ZV9yZXNldCBlcnJvciB3cml0aW5nIDB4MzAwOCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgzMDA4LCAmdmFsdWUpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9saXRlX3Jlc2V0IGVycm9yIHJlYWRpbmcgMHgzMDA4Iik7CisKKwlyZXR1cm4gKHZhbHVlID09IDApID8gMCA6IC1FSU87Cit9CisKKy8qIElmIGRpc3BsYXkgaXMgdW5ibGFua2VkLCB0aGVuIGJsYW5rIGl0ICovCitzdGF0aWMgaW50IHVmeF9ibGFuayhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgYm9vbCB3YWl0KQoreworCXUzMiBkY19jdHJsLCBkY19zdHM7CisJaW50IGk7CisKKwlpbnQgc3RhdHVzID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgyMDA0LCAmZGNfc3RzKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfYmxhbmsgZXJyb3IgcmVhZGluZyAweDIwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MjAwMCwgJmRjX2N0cmwpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9ibGFuayBlcnJvciByZWFkaW5nIDB4MjAwMCIpOworCisJLyogcmV0dXJuIHN1Y2Nlc3MgaWYgZGlzcGxheSBpcyBhbHJlYWR5IGJsYW5rZWQgKi8KKwlpZiAoKGRjX3N0cyAmIDB4MDAwMDAxMDApIHx8IChkY19jdHJsICYgMHgwMDAwMDEwMCkpCisJCXJldHVybiAwOworCisJLyogcmVxdWVzdCB0aGUgREMgdG8gYmxhbmsgdGhlIGRpc3BsYXkgKi8KKwlkY19jdHJsIHw9IDB4MDAwMDAxMDA7CisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MjAwMCwgZGNfY3RybCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X2JsYW5rIGVycm9yIHdyaXRpbmcgMHgyMDAwIik7CisKKwkvKiByZXR1cm4gc3VjY2VzcyBpbW1lZGlhdGVseSBpZiB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgKi8KKwlpZiAoIXdhaXQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IDI1MDsgaSsrKSB7CisJCXN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MjAwNCwgJmRjX3N0cyk7CisJCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9ibGFuayBlcnJvciByZWFkaW5nIDB4MjAwNCIpOworCisJCWlmIChkY19zdHMgJiAweDAwMDAwMTAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogdGltZWQgb3V0IHdhaXRpbmcgZm9yIGRpc3BsYXkgdG8gYmxhbmsgKi8KKwlyZXR1cm4gLUVJTzsKK30KKworLyogSWYgZGlzcGxheSBpcyBibGFua2VkLCB0aGVuIHVuYmxhbmsgaXQgKi8KK3N0YXRpYyBpbnQgdWZ4X3VuYmxhbmsoc3RydWN0IHVmeF9kYXRhICpkZXYsIGJvb2wgd2FpdCkKK3sKKwl1MzIgZGNfY3RybCwgZGNfc3RzOworCWludCBpOworCisJaW50IHN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MjAwNCwgJmRjX3N0cyk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3VuYmxhbmsgZXJyb3IgcmVhZGluZyAweDIwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MjAwMCwgJmRjX2N0cmwpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF91bmJsYW5rIGVycm9yIHJlYWRpbmcgMHgyMDAwIik7CisKKwkvKiByZXR1cm4gc3VjY2VzcyBpZiBkaXNwbGF5IGlzIGFscmVhZHkgdW5ibGFua2VkICovCisJaWYgKCgoZGNfc3RzICYgMHgwMDAwMDEwMCkgPT0gMCkgfHwgKChkY19jdHJsICYgMHgwMDAwMDEwMCkgPT0gMCkpCisJCXJldHVybiAwOworCisJLyogcmVxdWVzdCB0aGUgREMgdG8gdW5ibGFuayB0aGUgZGlzcGxheSAqLworCWRjX2N0cmwgJj0gfjB4MDAwMDAxMDA7CisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MjAwMCwgZGNfY3RybCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3VuYmxhbmsgZXJyb3Igd3JpdGluZyAweDIwMDAiKTsKKworCS8qIHJldHVybiBzdWNjZXNzIGltbWVkaWF0ZWx5IGlmIHdlIGRvbid0IGhhdmUgdG8gd2FpdCAqLworCWlmICghd2FpdCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjUwOyBpKyspIHsKKwkJc3RhdHVzID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgyMDA0LCAmZGNfc3RzKTsKKwkJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3VuYmxhbmsgZXJyb3IgcmVhZGluZyAweDIwMDQiKTsKKworCQlpZiAoKGRjX3N0cyAmIDB4MDAwMDAxMDApID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZGlzcGxheSB0byB1bmJsYW5rICovCisJcmV0dXJuIC1FSU87Cit9CisKKy8qIElmIGRpc3BsYXkgaXMgZW5hYmxlZCwgdGhlbiBkaXNhYmxlIGl0ICovCitzdGF0aWMgaW50IHVmeF9kaXNhYmxlKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBib29sIHdhaXQpCit7CisJdTMyIGRjX2N0cmwsIGRjX3N0czsKKwlpbnQgaTsKKworCWludCBzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDQsICZkY19zdHMpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9kaXNhYmxlIGVycm9yIHJlYWRpbmcgMHgyMDA0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDAsICZkY19jdHJsKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZGlzYWJsZSBlcnJvciByZWFkaW5nIDB4MjAwMCIpOworCisJLyogcmV0dXJuIHN1Y2Nlc3MgaWYgZGlzcGxheSBpcyBhbHJlYWR5IGRpc2FibGVkICovCisJaWYgKCgoZGNfc3RzICYgMHgwMDAwMDAwMSkgPT0gMCkgfHwgKChkY19jdHJsICYgMHgwMDAwMDAwMSkgPT0gMCkpCisJCXJldHVybiAwOworCisJLyogcmVxdWVzdCB0aGUgREMgdG8gZGlzYWJsZSB0aGUgZGlzcGxheSAqLworCWRjX2N0cmwgJj0gfigweDAwMDAwMDAxKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDAwLCBkY19jdHJsKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZGlzYWJsZSBlcnJvciB3cml0aW5nIDB4MjAwMCIpOworCisJLyogcmV0dXJuIHN1Y2Nlc3MgaW1tZWRpYXRlbHkgaWYgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0ICovCisJaWYgKCF3YWl0KQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyNTA7IGkrKykgeworCQlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDQsICZkY19zdHMpOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZGlzYWJsZSBlcnJvciByZWFkaW5nIDB4MjAwNCIpOworCisJCWlmICgoZGNfc3RzICYgMHgwMDAwMDAwMSkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKworCS8qIHRpbWVkIG91dCB3YWl0aW5nIGZvciBkaXNwbGF5IHRvIGRpc2FibGUgKi8KKwlyZXR1cm4gLUVJTzsKK30KKworLyogSWYgZGlzcGxheSBpcyBkaXNhYmxlZCwgdGhlbiBlbmFibGUgaXQgKi8KK3N0YXRpYyBpbnQgdWZ4X2VuYWJsZShzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgYm9vbCB3YWl0KQoreworCXUzMiBkY19jdHJsLCBkY19zdHM7CisJaW50IGk7CisKKwlpbnQgc3RhdHVzID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgyMDA0LCAmZGNfc3RzKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZW5hYmxlIGVycm9yIHJlYWRpbmcgMHgyMDA0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDAsICZkY19jdHJsKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZW5hYmxlIGVycm9yIHJlYWRpbmcgMHgyMDAwIik7CisKKwkvKiByZXR1cm4gc3VjY2VzcyBpZiBkaXNwbGF5IGlzIGFscmVhZHkgZW5hYmxlZCAqLworCWlmICgoZGNfc3RzICYgMHgwMDAwMDAwMSkgfHwgKGRjX2N0cmwgJiAweDAwMDAwMDAxKSkKKwkJcmV0dXJuIDA7CisKKwkvKiByZXF1ZXN0IHRoZSBEQyB0byBlbmFibGUgdGhlIGRpc3BsYXkgKi8KKwlkY19jdHJsIHw9IDB4MDAwMDAwMDE7CisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MjAwMCwgZGNfY3RybCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X2VuYWJsZSBlcnJvciB3cml0aW5nIDB4MjAwMCIpOworCisJLyogcmV0dXJuIHN1Y2Nlc3MgaW1tZWRpYXRlbHkgaWYgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0ICovCisJaWYgKCF3YWl0KQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyNTA7IGkrKykgeworCQlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDQsICZkY19zdHMpOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZW5hYmxlIGVycm9yIHJlYWRpbmcgMHgyMDA0Iik7CisKKwkJaWYgKGRjX3N0cyAmIDB4MDAwMDAwMDEpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZGlzcGxheSB0byBlbmFibGUgKi8KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCB1ZnhfY29uZmlnX3N5c19jbGsoc3RydWN0IHVmeF9kYXRhICpkZXYpCit7CisJaW50IHN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDcwMEMsIDB4ODAwMDAwMEYpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHg3MDBDIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHg3MDE0LCAweDAwMTAwMjRGKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4NzAxNCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4NzAxMCwgMHgwMDAwMDAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDcwMTAiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfY2xlYXJfYml0cyhkZXYsIDB4NzAwQywgMHgwMDAwMDAwQSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3IgY2xlYXJpbmcgUExMMSBieXBhc3MgaW4gMHg3MDBDIik7CisJbXNsZWVwKDEpOworCisJc3RhdHVzID0gdWZ4X3JlZ19jbGVhcl9iaXRzKGRldiwgMHg3MDBDLCAweDgwMDAwMDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciBjbGVhcmluZyBvdXRwdXQgZ2F0ZSBpbiAweDcwMEMiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVmeF9jb25maWdfZGRyMihzdHJ1Y3QgdWZ4X2RhdGEgKmRldikKK3sKKwlpbnQgc3RhdHVzLCBpID0gMDsKKwl1MzIgdG1wOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAwNCwgMHgwMDFGMEY3Nyk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMDgsIDB4RkZGMDAwMDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDA4Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDBDLCAweDBGRkYyMjIyKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAwQyIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAxMCwgMHgwMDAzMDgxNCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMTAiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMTQsIDB4MDA1MDAwMTkpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDE0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDE4LCAweDAyMEQwRjE1KTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAxOCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAxQywgMHgwMjUzMjMwNSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMUMiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMjAsIDB4MEIwMzA5MDUpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDIwIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDI0LCAweDAwMDAwODI3KTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAyNCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAyOCwgMHgwMDAwMDAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMjgiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMkMsIDB4MDAwMDAwNDIpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDJDIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDMwLCAweDA5NTIwMDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAzMCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAzNCwgMHgwMjIyMzMxNCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMzQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMzgsIDB4MDA0MzAwNDMpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDM4Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDNDLCAweEYwMEYwMDBGKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAzQyIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDA0MCwgMHhGMzgwRjAwRik7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwNDAiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwNDQsIDB4RjAwRjA0OTYpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDQ0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDQ4LCAweDAzMDgwNDA2KTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDA0OCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDA0QywgMHgwMDAwMTAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwNEMiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwNUMsIDB4MDAwMDAwMDcpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDVDIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMTAwLCAweDU0RjAwMDEyKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDEwMCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDEwNCwgMHgwMDAwNDAxMik7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAxMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAxMTgsIDB4NDA0MDQwNDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMTE4Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDAwLCAweDAwMDAwMDAxKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAwMCIpOworCisJd2hpbGUgKGkrKyA8IDUwMCkgeworCQlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDAwMDAsICZ0bXApOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciByZWFkaW5nIDB4MDAwMCIpOworCisJCWlmIChhbGxfYml0c19zZXQodG1wLCAweEMwMDAwMDAwKSkKKwkJCXJldHVybiAwOworCX0KKworCXByX2VycigiRERSMiBpbml0aWFsaXNhdGlvbiB0aW1lZCBvdXQsIHJlZyAweDAwMDA9MHglMDh4IiwgdG1wKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RydWN0IHBsbF92YWx1ZXMgeworCXUzMiBkaXZfcjA7CisJdTMyIGRpdl9mMDsKKwl1MzIgZGl2X3EwOworCXUzMiByYW5nZTA7CisJdTMyIGRpdl9yMTsKKwl1MzIgZGl2X2YxOworCXUzMiBkaXZfcTE7CisJdTMyIHJhbmdlMTsKK307CisKK3N0YXRpYyB1MzIgdWZ4X2NhbGNfcmFuZ2UodTMyIHJlZl9mcmVxKQoreworCWlmIChyZWZfZnJlcSA+PSA4ODAwMDAwMCkKKwkJcmV0dXJuIDc7CisKKwlpZiAocmVmX2ZyZXEgPj0gNTQwMDAwMDApCisJCXJldHVybiA2OworCisJaWYgKHJlZl9mcmVxID49IDM0MDAwMDAwKQorCQlyZXR1cm4gNTsKKworCWlmIChyZWZfZnJlcSA+PSAyMTAwMDAwMCkKKwkJcmV0dXJuIDQ7CisKKwlpZiAocmVmX2ZyZXEgPj0gMTMwMDAwMDApCisJCXJldHVybiAzOworCisJaWYgKHJlZl9mcmVxID49IDgwMDAwMDApCisJCXJldHVybiAyOworCisJcmV0dXJuIDE7Cit9CisKKy8qIGNhbGN1bGF0ZXMgUExMIGRpdmlkZXIgc2V0dGluZ3MgZm9yIGEgZGVzaXJlZCB0YXJnZXQgZnJlcXVlbmN5ICovCitzdGF0aWMgdm9pZCB1ZnhfY2FsY19wbGxfdmFsdWVzKGNvbnN0IHUzMiBjbGtfcGl4ZWxfcGxsLCBzdHJ1Y3QgcGxsX3ZhbHVlcyAqYXNpY19wbGwpCit7CisJY29uc3QgdTMyIHJlZl9jbGsgPSAyNTAwMDAwMDsKKwl1MzIgZGl2X3IwLCBkaXZfZjAsIGRpdl9xMCwgZGl2X3IxLCBkaXZfZjEsIGRpdl9xMTsKKwl1MzIgbWluX2Vycm9yID0gY2xrX3BpeGVsX3BsbDsKKworCWZvciAoZGl2X3IwID0gMTsgZGl2X3IwIDw9IDMyOyBkaXZfcjArKykgeworCQl1MzIgcmVmX2ZyZXEwID0gcmVmX2NsayAvIGRpdl9yMDsKKwkJaWYgKHJlZl9mcmVxMCA8IDUwMDAwMDApCisJCQlicmVhazsKKworCQlpZiAocmVmX2ZyZXEwID4gMjAwMDAwMDAwKQorCQkJY29udGludWU7CisKKwkJZm9yIChkaXZfZjAgPSAxOyBkaXZfZjAgPD0gMjU2OyBkaXZfZjArKykgeworCQkJdTMyIHZjb19mcmVxMCA9IHJlZl9mcmVxMCAqIGRpdl9mMDsKKworCQkJaWYgKHZjb19mcmVxMCA8IDM1MDAwMDAwMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHZjb19mcmVxMCA+IDcwMDAwMDAwMCkKKwkJCQlicmVhazsKKworCQkJZm9yIChkaXZfcTAgPSAwOyBkaXZfcTAgPCA3OyBkaXZfcTArKykgeworCQkJCXUzMiBwbGxvdXRfZnJlcTAgPSB2Y29fZnJlcTAgLyAoMSA8PCBkaXZfcTApOworCisJCQkJaWYgKHBsbG91dF9mcmVxMCA8IDUwMDAwMDApCisJCQkJCWJyZWFrOworCisJCQkJaWYgKHBsbG91dF9mcmVxMCA+IDIwMDAwMDAwMCkKKwkJCQkJY29udGludWU7CisKKwkJCQlmb3IgKGRpdl9yMSA9IDE7IGRpdl9yMSA8PSAzMjsgZGl2X3IxKyspIHsKKwkJCQkJdTMyIHJlZl9mcmVxMSA9IHBsbG91dF9mcmVxMCAvIGRpdl9yMTsKKworCQkJCQlpZiAocmVmX2ZyZXExIDwgNTAwMDAwMCkKKwkJCQkJCWJyZWFrOworCisJCQkJCWZvciAoZGl2X2YxID0gMTsgZGl2X2YxIDw9IDI1NjsgZGl2X2YxKyspIHsKKwkJCQkJCXUzMiB2Y29fZnJlcTEgPSByZWZfZnJlcTEgKiBkaXZfZjE7CisKKwkJCQkJCWlmICh2Y29fZnJlcTEgPCAzNTAwMDAwMDApCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJCWlmICh2Y29fZnJlcTEgPiA3MDAwMDAwMDApCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWZvciAoZGl2X3ExID0gMDsgZGl2X3ExIDwgNzsgZGl2X3ExKyspIHsKKwkJCQkJCQl1MzIgcGxsb3V0X2ZyZXExID0gdmNvX2ZyZXExIC8gKDEgPDwgZGl2X3ExKTsKKwkJCQkJCQlpbnQgZXJyb3IgPSBhYnMocGxsb3V0X2ZyZXExIC0gY2xrX3BpeGVsX3BsbCk7CisKKwkJCQkJCQlpZiAocGxsb3V0X2ZyZXExIDwgNTAwMDAwMCkKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQlpZiAocGxsb3V0X2ZyZXExID4gNzAwMDAwMDAwKQorCQkJCQkJCQljb250aW51ZTsKKworCQkJCQkJCWlmIChlcnJvciA8IG1pbl9lcnJvcikgeworCQkJCQkJCQltaW5fZXJyb3IgPSBlcnJvcjsKKworCQkJCQkJCQkvKiBmaW5hbCByZXR1cm5lZCB2YWx1ZSBpcyBlcXVhbCB0byBjYWxjdWxhdGVkIHZhbHVlIC0gMQorCQkJCQkJCQkgKiBiZWNhdXNlIGEgdmFsdWUgb2YgMCA9IGRpdmlkZSBieSAxICovCisJCQkJCQkJCWFzaWNfcGxsLT5kaXZfcjAgPSBkaXZfcjAgLSAxOworCQkJCQkJCQlhc2ljX3BsbC0+ZGl2X2YwID0gZGl2X2YwIC0gMTsKKwkJCQkJCQkJYXNpY19wbGwtPmRpdl9xMCA9IGRpdl9xMDsKKwkJCQkJCQkJYXNpY19wbGwtPmRpdl9yMSA9IGRpdl9yMSAtIDE7CisJCQkJCQkJCWFzaWNfcGxsLT5kaXZfZjEgPSBkaXZfZjEgLSAxOworCQkJCQkJCQlhc2ljX3BsbC0+ZGl2X3ExID0gZGl2X3ExOworCisJCQkJCQkJCWFzaWNfcGxsLT5yYW5nZTAgPSB1ZnhfY2FsY19yYW5nZShyZWZfZnJlcTApOworCQkJCQkJCQlhc2ljX3BsbC0+cmFuZ2UxID0gdWZ4X2NhbGNfcmFuZ2UocmVmX2ZyZXExKTsKKworCQkJCQkJCQlpZiAobWluX2Vycm9yID09IDApCisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvKiBzZXRzIGFuYWxvZyBiaXQgUExMIGNvbmZpZ3VyYXRpb24gdmFsdWVzICovCitzdGF0aWMgaW50IHVmeF9jb25maWdfcGl4X2NsayhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTMyIHBpeGNsb2NrKQoreworCXN0cnVjdCBwbGxfdmFsdWVzIGFzaWNfcGxsID0gezB9OworCXUzMiB2YWx1ZSwgY2xrX3BpeGVsLCBjbGtfcGl4ZWxfcGxsOworCWludCBzdGF0dXM7CisKKwkvKiBjb252ZXJ0IHBpeGNsb2NrIChpbiBwcykgdG8gZnJlcXVlbmN5IChpbiBIeikgKi8KKwljbGtfcGl4ZWwgPSBQSUNPUzJLSFoocGl4Y2xvY2spICogMTAwMDsKKwlwcl9kZWJ1ZygicGl4Y2xvY2sgJWQgcHMgPSBjbGtfcGl4ZWwgJWQgSHoiLCBwaXhjbG9jaywgY2xrX3BpeGVsKTsKKworCS8qIGNsa19waXhlbCA9IDEvMiBjbGtfcGl4ZWxfcGxsICovCisJY2xrX3BpeGVsX3BsbCA9IGNsa19waXhlbCAqIDI7CisKKwl1ZnhfY2FsY19wbGxfdmFsdWVzKGNsa19waXhlbF9wbGwsICZhc2ljX3BsbCk7CisKKwkvKiBLZWVwIEJZUEFTUyBhbmQgUkVTRVQgc2lnbmFscyBhc3NlcnRlZCB1bnRpbCBjb25maWd1cmVkICovCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4NzAwMCwgMHg4MDAwMDAwRik7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDcwMDAiKTsKKworCXZhbHVlID0gKGFzaWNfcGxsLmRpdl9mMSB8IChhc2ljX3BsbC5kaXZfcjEgPDwgOCkgfAorCQkoYXNpY19wbGwuZGl2X3ExIDw8IDE2KSB8IChhc2ljX3BsbC5yYW5nZTEgPDwgMjApKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHg3MDA4LCB2YWx1ZSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDcwMDgiKTsKKworCXZhbHVlID0gKGFzaWNfcGxsLmRpdl9mMCB8IChhc2ljX3BsbC5kaXZfcjAgPDwgOCkgfAorCQkoYXNpY19wbGwuZGl2X3EwIDw8IDE2KSB8IChhc2ljX3BsbC5yYW5nZTAgPDwgMjApKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHg3MDA0LCB2YWx1ZSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDcwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfY2xlYXJfYml0cyhkZXYsIDB4NzAwMCwgMHgwMDAwMDAwNSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLAorCQkiZXJyb3IgY2xlYXJpbmcgUExMMCBieXBhc3MgYml0cyBpbiAweDcwMDAiKTsKKwltc2xlZXAoMSk7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX2NsZWFyX2JpdHMoZGV2LCAweDcwMDAsIDB4MDAwMDAwMEEpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywKKwkJImVycm9yIGNsZWFyaW5nIFBMTDEgYnlwYXNzIGJpdHMgaW4gMHg3MDAwIik7CisJbXNsZWVwKDEpOworCisJc3RhdHVzID0gdWZ4X3JlZ19jbGVhcl9iaXRzKGRldiwgMHg3MDAwLCAweDgwMDAwMDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciBjbGVhcmluZyBnYXRlIGJpdHMgaW4gMHg3MDAwIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1Znhfc2V0X3ZpZF9tb2RlKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwl1MzIgdGVtcDsKKwl1MTYgaF90b3RhbCwgaF9hY3RpdmUsIGhfYmxhbmtfc3RhcnQsIGhfYmxhbmtfZW5kLCBoX3N5bmNfc3RhcnQsIGhfc3luY19lbmQ7CisJdTE2IHZfdG90YWwsIHZfYWN0aXZlLCB2X2JsYW5rX3N0YXJ0LCB2X2JsYW5rX2VuZCwgdl9zeW5jX3N0YXJ0LCB2X3N5bmNfZW5kOworCisJaW50IHN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDgwMjgsIDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3IgZGlzYWJsaW5nIFJHQiBwYWQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDgwMjQsIDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3IgZGlzYWJsaW5nIFZEQUMiKTsKKworCS8qIHNodXQgZXZlcnl0aGluZyBkb3duIGJlZm9yZSBjaGFuZ2luZyB0aW1pbmcgKi8KKwlzdGF0dXMgPSB1ZnhfYmxhbmsoZGV2LCB0cnVlKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIGJsYW5raW5nIGRpc3BsYXkiKTsKKworCXN0YXR1cyA9IHVmeF9kaXNhYmxlKGRldiwgdHJ1ZSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3NldF92aWRfbW9kZSBlcnJvciBkaXNhYmxpbmcgZGlzcGxheSIpOworCisJc3RhdHVzID0gdWZ4X2NvbmZpZ19waXhfY2xrKGRldiwgdmFyLT5waXhjbG9jayk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3NldF92aWRfbW9kZSBlcnJvciBjb25maWd1cmluZyBwaXhjbG9jayIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MjAwMCwgMHgwMDAwMDEwNCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3NldF92aWRfbW9kZSBlcnJvciB3cml0aW5nIDB4MjAwMCIpOworCisJLyogc2V0IGhvcml6b250YWwgdGltaW5ncyAqLworCWhfdG90YWwgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuICsgdmFyLT5sZWZ0X21hcmdpbjsKKwloX2FjdGl2ZSA9IHZhci0+eHJlczsKKwloX2JsYW5rX3N0YXJ0ID0gdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW47CisJaF9ibGFua19lbmQgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuOworCWhfc3luY19zdGFydCA9IHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luOworCWhfc3luY19lbmQgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuOworCisJdGVtcCA9ICgoaF90b3RhbCAtIDEpIDw8IDE2KSB8IChoX2FjdGl2ZSAtIDEpOworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMDgsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMDgiKTsKKworCXRlbXAgPSAoKGhfYmxhbmtfc3RhcnQgLSAxKSA8PCAxNikgfCAoaF9ibGFua19lbmQgLSAxKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDBDLCB0ZW1wKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDBDIik7CisKKwl0ZW1wID0gKChoX3N5bmNfc3RhcnQgLSAxKSA8PCAxNikgfCAoaF9zeW5jX2VuZCAtIDEpOworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMTAsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMTAiKTsKKworCS8qIHNldCB2ZXJ0aWNhbCB0aW1pbmdzICovCisJdl90b3RhbCA9IHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKyB2YXItPnZzeW5jX2xlbjsKKwl2X2FjdGl2ZSA9IHZhci0+eXJlczsKKwl2X2JsYW5rX3N0YXJ0ID0gdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW47CisJdl9ibGFua19lbmQgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuOworCXZfc3luY19zdGFydCA9IHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luOworCXZfc3luY19lbmQgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuOworCisJdGVtcCA9ICgodl90b3RhbCAtIDEpIDw8IDE2KSB8ICh2X2FjdGl2ZSAtIDEpOworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMTQsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMTQiKTsKKworCXRlbXAgPSAoKHZfYmxhbmtfc3RhcnQgLSAxKSA8PCAxNikgfCAodl9ibGFua19lbmQgLSAxKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDE4LCB0ZW1wKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDE4Iik7CisKKwl0ZW1wID0gKCh2X3N5bmNfc3RhcnQgLSAxKSA8PCAxNikgfCAodl9zeW5jX2VuZCAtIDEpOworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMUMsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMUMiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMjAsIDB4MDAwMDAwMDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMjAiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMjQsIDB4MDAwMDAwMDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMjQiKTsKKworCS8qIFNldCB0aGUgZnJhbWUgbGVuZ3RoIHJlZ2lzdGVyICgjcGl4ICogMiBieXRlcy9waXhlbCkgKi8KKwl0ZW1wID0gdmFyLT54cmVzICogdmFyLT55cmVzICogMjsKKwl0ZW1wID0gKHRlbXAgKyA3KSAmICh+MHg3KTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDI4LCB0ZW1wKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDI4Iik7CisKKwkvKiBlbmFibGUgZGVzaXJlZCBvdXRwdXQgaW50ZXJmYWNlICYgZGlzYWJsZSBvdGhlcnMgKi8KKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDQwLCAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDQwIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDQ0LCAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDQ0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDQ4LCAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDQ4Iik7CisKKwkvKiBzZXQgdGhlIHN5bmMgcG9sYXJpdGllcyAmIGVuYWJsZSBiaXQgKi8KKwl0ZW1wID0gMHgwMDAwMDAwMTsKKwlpZiAodmFyLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpCisJCXRlbXAgfD0gMHgwMDAwMDAxMDsKKworCWlmICh2YXItPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpCisJCXRlbXAgfD0gMHgwMDAwMDAwODsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwNDAsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwNDAiKTsKKworCS8qIHN0YXJ0IGV2ZXJ5dGhpbmcgYmFjayB1cCAqLworCXN0YXR1cyA9IHVmeF9lbmFibGUoZGV2LCB0cnVlKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIGVuYWJsaW5nIGRpc3BsYXkiKTsKKworCS8qIFVuYmxhbmsgdGhlIGRpc3BsYXkgKi8KKwlzdGF0dXMgPSB1ZnhfdW5ibGFuayhkZXYsIHRydWUpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3IgdW5ibGFua2luZyBkaXNwbGF5Iik7CisKKwkvKiBlbmFibGUgUkdCIHBhZCAqLworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDgwMjgsIDB4MDAwMDAwMDMpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3IgZW5hYmxpbmcgUkdCIHBhZCIpOworCisJLyogZW5hYmxlIFZEQUMgKi8KKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHg4MDI0LCAweDAwMDAwMDA3KTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIGVuYWJsaW5nIFZEQUMiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVmeF9vcHNfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgcGFnZSwgcG9zOworCisJaWYgKG9mZnNldCArIHNpemUgPiBpbmZvLT5maXguc21lbV9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJcG9zID0gKHVuc2lnbmVkIGxvbmcpaW5mby0+Zml4LnNtZW1fc3RhcnQgKyBvZmZzZXQ7CisKKwlwcl9kZWJ1ZygibW1hcCgpIGZyYW1lYnVmZmVyIGFkZHI6JWx1IHNpemU6JWx1XG4iLAorCQkgIHBvcywgc2l6ZSk7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkKKwkJCXJldHVybiAtRUFHQUlOOworCisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IDA7CisJfQorCisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsJLyogYXZvaWQgdG8gc3dhcCBvdXQgdGhpcyBWTUEgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWZ4X3Jhd19yZWN0KHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCB1MTYgKmNtZCwgaW50IHgsIGludCB5LAorCWludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlzaXplX3QgcGFja2VkX2xpbmVfbGVuID0gQUxJR04oKHdpZHRoICogMiksIDQpOworCXNpemVfdCBwYWNrZWRfcmVjdF9sZW4gPSBwYWNrZWRfbGluZV9sZW4gKiBoZWlnaHQ7CisJaW50IGxpbmU7CisKKwlCVUdfT04oIWRldik7CisJQlVHX09OKCFkZXYtPmluZm8pOworCisJLyogY29tbWFuZCB3b3JkICovCisJKigodTMyICopJmNtZFswXSkgPSBjcHVfdG9fbGUzMigweDAxKTsKKworCS8qIGxlbmd0aCB3b3JkICovCisJKigodTMyICopJmNtZFsyXSkgPSBjcHVfdG9fbGUzMihwYWNrZWRfcmVjdF9sZW4gKyAxNik7CisKKwljbWRbNF0gPSBjcHVfdG9fbGUxNih4KTsKKwljbWRbNV0gPSBjcHVfdG9fbGUxNih5KTsKKwljbWRbNl0gPSBjcHVfdG9fbGUxNih3aWR0aCk7CisJY21kWzddID0gY3B1X3RvX2xlMTYoaGVpZ2h0KTsKKworCS8qIGZyYW1lIGJhc2UgYWRkcmVzcyAqLworCSooKHUzMiAqKSZjbWRbOF0pID0gY3B1X3RvX2xlMzIoMCk7CisKKwkvKiBjb2xvciBtb2RlIGFuZCBob3Jpem9udGFsIHJlc29sdXRpb24gKi8KKwljbWRbMTBdID0gY3B1X3RvX2xlMTYoMHg0MDAwIHwgZGV2LT5pbmZvLT52YXIueHJlcyk7CisKKwkvKiB2ZXJ0aWNhbCByZXNvbHV0aW9uICovCisJY21kWzExXSA9IGNwdV90b19sZTE2KGRldi0+aW5mby0+dmFyLnlyZXMpOworCisJLyogcGFja2VkIGRhdGEgKi8KKwlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaGVpZ2h0OyBsaW5lKyspIHsKKwkJY29uc3QgaW50IGxpbmVfb2Zmc2V0ID0gZGV2LT5pbmZvLT5maXgubGluZV9sZW5ndGggKiAoeSArIGxpbmUpOworCQljb25zdCBpbnQgYnl0ZV9vZmZzZXQgPSBsaW5lX29mZnNldCArICh4ICogQlBQKTsKKwkJbWVtY3B5KCZjbWRbKDI0ICsgKHBhY2tlZF9saW5lX2xlbiAqIGxpbmUpKSAvIDJdLAorCQkJKGNoYXIgKilkZXYtPmluZm8tPmZpeC5zbWVtX3N0YXJ0ICsgYnl0ZV9vZmZzZXQsIHdpZHRoICogQlBQKTsKKwl9Cit9CisKK2ludCB1ZnhfaGFuZGxlX2RhbWFnZShzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgaW50IHgsIGludCB5LAorCWludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlzaXplX3QgcGFja2VkX2xpbmVfbGVuID0gQUxJR04oKHdpZHRoICogMiksIDQpOworCWludCBsZW4sIHN0YXR1cywgdXJiX2xpbmVzLCBzdGFydF9saW5lID0gMDsKKworCWlmICgod2lkdGggPD0gMCkgfHwgKGhlaWdodCA8PSAwKSB8fAorCSAgICAoeCArIHdpZHRoID4gZGV2LT5pbmZvLT52YXIueHJlcykgfHwKKwkgICAgKHkgKyBoZWlnaHQgPiBkZXYtPmluZm8tPnZhci55cmVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWF0b21pY19yZWFkKCZkZXYtPnVzYl9hY3RpdmUpKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChzdGFydF9saW5lIDwgaGVpZ2h0KSB7CisJCXN0cnVjdCB1cmIgKnVyYiA9IHVmeF9nZXRfdXJiKGRldik7CisJCWlmICghdXJiKSB7CisJCQlwcl93YXJuKCJ1ZnhfaGFuZGxlX2RhbWFnZSB1bmFibGUgdG8gZ2V0IHVyYiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBhc3N1bWUgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgdG8gdHJhbnNmZXIgYXQgbGVhc3Qgb25lIGxpbmUgKi8KKwkJQlVHX09OKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA8ICgyNCArICh3aWR0aCAqIDIpKSk7CisKKwkJLyogY2FsY3VsYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB3ZSBjb3VsZCBmaXQgaW4gKi8KKwkJdXJiX2xpbmVzID0gKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtIDI0KSAvIHBhY2tlZF9saW5lX2xlbjsKKworCQkvKiBidXQgd2UgbWlnaHQgbm90IG5lZWQgdGhpcyBtYW55ICovCisJCXVyYl9saW5lcyA9IG1pbih1cmJfbGluZXMsIChoZWlnaHQgLSBzdGFydF9saW5lKSk7CisKKwkJbWVtc2V0KHVyYi0+dHJhbnNmZXJfYnVmZmVyLCAwLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCisJCXVmeF9yYXdfcmVjdChkZXYsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB4LCAoeSArIHN0YXJ0X2xpbmUpLCB3aWR0aCwgdXJiX2xpbmVzKTsKKwkJbGVuID0gMjQgKyAocGFja2VkX2xpbmVfbGVuICogdXJiX2xpbmVzKTsKKworCQlzdGF0dXMgPSB1Znhfc3VibWl0X3VyYihkZXYsIHVyYiwgbGVuKTsKKwkJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiRXJyb3Igc3VibWl0dGluZyBVUkIiKTsKKworCQlzdGFydF9saW5lICs9IHVyYl9saW5lczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUGF0aCB0cmlnZ2VyZWQgYnkgdXNlcm1vZGUgY2xpZW50cyB3aG8gd3JpdGUgdG8gZmlsZXN5c3RlbQorICogZS5nLiBjYXQgZmlsZW5hbWUgPiAvZGV2L2ZiMQorICogTm90IHVzZWQgYnkgWCBXaW5kb3dzIG9yIHRleHQtbW9kZSBjb25zb2xlLiBCdXQgdXNlZnVsIGZvciB0ZXN0aW5nLgorICogU2xvdyBiZWNhdXNlIG9mIGV4dHJhIGNvcHkgYW5kIHdlIG11c3QgYXNzdW1lIGFsbCBwaXhlbHMgZGlydHkuICovCitzdGF0aWMgc3NpemVfdCB1Znhfb3BzX3dyaXRlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IHJlc3VsdDsKKwlzdHJ1Y3QgdWZ4X2RhdGEgKmRldiA9IGluZm8tPnBhcjsKKwl1MzIgb2Zmc2V0ID0gKHUzMikgKnBwb3M7CisKKwlyZXN1bHQgPSBmYl9zeXNfd3JpdGUoaW5mbywgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlpZiAocmVzdWx0ID4gMCkgeworCQlpbnQgc3RhcnQgPSBtYXgoKGludCkob2Zmc2V0IC8gaW5mby0+Zml4LmxpbmVfbGVuZ3RoKSAtIDEsIDApOworCQlpbnQgbGluZXMgPSBtaW4oKHUzMikoKHJlc3VsdCAvIGluZm8tPmZpeC5saW5lX2xlbmd0aCkgKyAxKSwKKwkJCQkodTMyKWluZm8tPnZhci55cmVzKTsKKworCQl1ZnhfaGFuZGxlX2RhbWFnZShkZXYsIDAsIHN0YXJ0LCBpbmZvLT52YXIueHJlcywgbGluZXMpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHVmeF9vcHNfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKQoreworCisJc3RydWN0IHVmeF9kYXRhICpkZXYgPSBpbmZvLT5wYXI7CisKKwlzeXNfY29weWFyZWEoaW5mbywgYXJlYSk7CisKKwl1ZnhfaGFuZGxlX2RhbWFnZShkZXYsIGFyZWEtPmR4LCBhcmVhLT5keSwKKwkJCWFyZWEtPndpZHRoLCBhcmVhLT5oZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCB1Znhfb3BzX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQljb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCisJc3lzX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisKKwl1ZnhfaGFuZGxlX2RhbWFnZShkZXYsIGltYWdlLT5keCwgaW1hZ2UtPmR5LAorCQkJaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgdWZ4X29wc19maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCisJc3lzX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCisJdWZ4X2hhbmRsZV9kYW1hZ2UoZGV2LCByZWN0LT5keCwgcmVjdC0+ZHksIHJlY3QtPndpZHRoLAorCQkJICAgICAgcmVjdC0+aGVpZ2h0KTsKK30KKworLyogTk9URTogZmJfZGVmaW8uYyBpcyBob2xkaW5nIGluZm8tPmZiZGVmaW8ubXV0ZXgKKyAqICAgVG91Y2hpbmcgQU5ZIGZyYW1lYnVmZmVyIG1lbW9yeSB0aGF0IHRyaWdnZXJzIGEgcGFnZSBmYXVsdAorICogICBpbiBmYl9kZWZpbyB3aWxsIGNhdXNlIGEgZGVhZGxvY2ssIHdoZW4gaXQgYWxzbyB0cmllcyB0bworICogICBncmFiIHRoZSBzYW1lIG11dGV4LiAqLworc3RhdGljIHZvaWQgdWZ4X2RweV9kZWZlcnJlZF9pbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlbGlzdCkKK3sKKwlzdHJ1Y3QgcGFnZSAqY3VyOworCXN0cnVjdCBmYl9kZWZlcnJlZF9pbyAqZmJkZWZpbyA9IGluZm8tPmZiZGVmaW87CisJc3RydWN0IHVmeF9kYXRhICpkZXYgPSBpbmZvLT5wYXI7CisKKwlpZiAoIWZiX2RlZmlvKQorCQlyZXR1cm47CisKKwlpZiAoIWF0b21pY19yZWFkKCZkZXYtPnVzYl9hY3RpdmUpKQorCQlyZXR1cm47CisKKwkvKiB3YWxrIHRoZSB3cml0dGVuIHBhZ2UgbGlzdCBhbmQgcmVuZGVyIGVhY2ggdG8gZGV2aWNlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXIsICZmYmRlZmlvLT5wYWdlbGlzdCwgbHJ1KSB7CisJCS8qIGNyZWF0ZSBhIHJlY3RhbmdsZSBvZiBmdWxsIHNjcmVlbiB3aWR0aCB0aGF0IGVuY2xvc2VzIHRoZQorCQkgKiBlbnRpcmUgZGlydHkgZnJhbWVidWZmZXIgcGFnZSAqLworCQljb25zdCBpbnQgeCA9IDA7CisJCWNvbnN0IGludCB3aWR0aCA9IGRldi0+aW5mby0+dmFyLnhyZXM7CisJCWNvbnN0IGludCB5ID0gKGN1ci0+aW5kZXggPDwgUEFHRV9TSElGVCkgLyAod2lkdGggKiAyKTsKKwkJaW50IGhlaWdodCA9IChQQUdFX1NJWkUgLyAod2lkdGggKiAyKSkgKyAxOworCQloZWlnaHQgPSBtaW4oaGVpZ2h0LCAoaW50KShkZXYtPmluZm8tPnZhci55cmVzIC0geSkpOworCisJCUJVR19PTih5ID49IGRldi0+aW5mby0+dmFyLnlyZXMpOworCQlCVUdfT04oKHkgKyBoZWlnaHQpID4gZGV2LT5pbmZvLT52YXIueXJlcyk7CisKKwkJdWZ4X2hhbmRsZV9kYW1hZ2UoZGV2LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdWZ4X29wc19pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwKKwkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdWZ4X2RhdGEgKmRldiA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZGxvYXJlYSAqYXJlYSA9IE5VTEw7CisKKwlpZiAoIWF0b21pY19yZWFkKCZkZXYtPnVzYl9hY3RpdmUpKQorCQlyZXR1cm4gMDsKKworCS8qIFRPRE86IFVwZGF0ZSBYIHNlcnZlciB0byBnZXQgdGhpcyBmcm9tIHN5c2ZzIGluc3RlYWQgKi8KKwlpZiAoY21kID09IFVGWF9JT0NUTF9SRVRVUk5fRURJRCkgeworCQl1OCBfX3VzZXIgKmVkaWQgPSAodTggX191c2VyICopYXJnOworCQlpZiAoY29weV90b191c2VyKGVkaWQsIGRldi0+ZWRpZCwgZGV2LT5lZGlkX3NpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCS8qIFRPRE86IEhlbHAgcHJvcG9zZSBhIHN0YW5kYXJkIGZiLmggaW9jdGwgdG8gcmVwb3J0IG1tYXAgZGFtYWdlICovCisJaWYgKGNtZCA9PSBVRlhfSU9DVExfUkVQT1JUX0RBTUFHRSkgeworCQkvKiBJZiB3ZSBoYXZlIGEgZGFtYWdlLWF3YXJlIGNsaWVudCwgdHVybiBmYl9kZWZpbyAib2ZmIgorCQkgKiBUbyBhdm9pZCBwZXJmIGltYWN0IG9mIHVuZWNlc3NhcnkgcGFnZSBmYXVsdCBoYW5kbGluZy4KKwkJICogRG9uZSBieSByZXNldHRpbmcgdGhlIGRlbGF5IGZvciB0aGlzIGZiX2luZm8gdG8gYSB2ZXJ5CisJCSAqIGxvbmcgcGVyaW9kLiBQYWdlcyB3aWxsIGJlY29tZSB3cml0YWJsZSBhbmQgc3RheSB0aGF0IHdheS4KKwkJICogUmVzZXQgdG8gbm9ybWFsIHZhbHVlIHdoZW4gYWxsIGNsaWVudHMgaGF2ZSBjbG9zZWQgdGhpcyBmYi4KKwkJICovCisJCWlmIChpbmZvLT5mYmRlZmlvKQorCQkJaW5mby0+ZmJkZWZpby0+ZGVsYXkgPSBVRlhfREVGSU9fV1JJVEVfRElTQUJMRTsKKworCQlhcmVhID0gKHN0cnVjdCBkbG9hcmVhICopYXJnOworCisJCWlmIChhcmVhLT54IDwgMCkKKwkJCWFyZWEtPnggPSAwOworCisJCWlmIChhcmVhLT54ID4gaW5mby0+dmFyLnhyZXMpCisJCQlhcmVhLT54ID0gaW5mby0+dmFyLnhyZXM7CisKKwkJaWYgKGFyZWEtPnkgPCAwKQorCQkJYXJlYS0+eSA9IDA7CisKKwkJaWYgKGFyZWEtPnkgPiBpbmZvLT52YXIueXJlcykKKwkJCWFyZWEtPnkgPSBpbmZvLT52YXIueXJlczsKKworCQl1ZnhfaGFuZGxlX2RhbWFnZShkZXYsIGFyZWEtPngsIGFyZWEtPnksIGFyZWEtPncsIGFyZWEtPmgpOworCX0KKworCXJldHVybiAwOworfQorCisvKiB0YWtlbiBmcm9tIHZlc2FmYiAqLworc3RhdGljIGludAordWZ4X29wc19zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCisJICAgICAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocmVnbm8gPj0gaW5mby0+Y21hcC5sZW4pCisJCXJldHVybiAxOworCisJaWYgKHJlZ25vIDwgMTYpIHsKKwkJaWYgKGluZm8tPnZhci5yZWQub2Zmc2V0ID09IDEwKSB7CisJCQkvKiAxOjU6NTo1ICovCisJCQkoKHUzMiAqKSAoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQorCQkJICAgICgocmVkICYgMHhmODAwKSA+PiAxKSB8CisJCQkgICAgKChncmVlbiAmIDB4ZjgwMCkgPj4gNikgfCAoKGJsdWUgJiAweGY4MDApID4+IDExKTsKKwkJfSBlbHNlIHsKKwkJCS8qIDA6NTo2OjUgKi8KKwkJCSgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJCQkgICAgKChyZWQgJiAweGY4MDApKSB8CisJCQkgICAgKChncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfCAoKGJsdWUgJiAweGY4MDApID4+IDExKTsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIEl0J3MgY29tbW9uIGZvciBzZXZlcmFsIGNsaWVudHMgdG8gaGF2ZSBmcmFtZWJ1ZmZlciBvcGVuIHNpbXVsdGFuZW91c2x5LgorICogZS5nLiBib3RoIGZiY29uIGFuZCBYLiBNYWtlcyB0aGluZ3MgaW50ZXJlc3RpbmcuCisgKiBBc3N1bWVzIGNhbGxlciBpcyBob2xkaW5nIGluZm8tPmxvY2sgKGZvciBvcGVuIGFuZCByZWxlYXNlIGF0IGxlYXN0KSAqLworc3RhdGljIGludCB1Znhfb3BzX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCisJLyogZmJjb24gYWdncmVzc2l2ZWx5IGNvbm5lY3RzIHRvIGZpcnN0IGZyYW1lYnVmZmVyIGl0IGZpbmRzLAorCSAqIHByZXZlbnRpbmcgb3RoZXIgY2xpZW50cyAoWCkgZnJvbSB3b3JraW5nIHByb3Blcmx5LiBVc3VhbGx5CisJICogbm90IHdoYXQgdGhlIHVzZXIgd2FudHMuIEZhaWwgYnkgZGVmYXVsdCB3aXRoIG9wdGlvbiB0byBlbmFibGUuICovCisJaWYgKHVzZXIgPT0gMCAmJiAhY29uc29sZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIElmIHRoZSBVU0IgZGV2aWNlIGlzIGdvbmUsIHdlIGRvbid0IGFjY2VwdCBuZXcgb3BlbnMgKi8KKwlpZiAoZGV2LT52aXJ0dWFsaXplZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYtPmZiX2NvdW50Kys7CisKKwlrcmVmX2dldCgmZGV2LT5rcmVmKTsKKworCWlmIChmYl9kZWZpbyAmJiAoaW5mby0+ZmJkZWZpbyA9PSBOVUxMKSkgeworCQkvKiBlbmFibGUgZGVmaW8gYXQgbGFzdCBtb21lbnQgaWYgbm90IGRpc2FibGVkIGJ5IGNsaWVudCAqLworCisJCXN0cnVjdCBmYl9kZWZlcnJlZF9pbyAqZmJkZWZpbzsKKworCQlmYmRlZmlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZiX2RlZmVycmVkX2lvKSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKGZiZGVmaW8pIHsKKwkJCWZiZGVmaW8tPmRlbGF5ID0gVUZYX0RFRklPX1dSSVRFX0RFTEFZOworCQkJZmJkZWZpby0+ZGVmZXJyZWRfaW8gPSB1ZnhfZHB5X2RlZmVycmVkX2lvOworCQl9CisKKwkJaW5mby0+ZmJkZWZpbyA9IGZiZGVmaW87CisJCWZiX2RlZmVycmVkX2lvX2luaXQoaW5mbyk7CisJfQorCisJcHJfZGVidWcoIm9wZW4gL2Rldi9mYiVkIHVzZXI9JWQgZmJfaW5mbz0lcCBjb3VudD0lZCIsCisJCWluZm8tPm5vZGUsIHVzZXIsIGluZm8sIGRldi0+ZmJfY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhbGwgY2xpZW50IGludGVyZmFjZXMgdG8gc3RhcnQgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBkaXNhYmxlZCwKKyAqIGFuZCBhbGwgcmVmZXJlbmNlcyB0byBvdXIgZGV2aWNlIGluc3RhbmNlICh1ZnhfZGF0YSkgYXJlIHJlbGVhc2VkLgorICogRXZlcnkgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGEgcmVmZXJlbmNlLCBzbyB3ZSBrbm93IGFyZSBmdWxseSBzcHVuIGRvd24KKyAqLworc3RhdGljIHZvaWQgdWZ4X2ZyZWUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHVmeF9kYXRhICpkZXYgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHVmeF9kYXRhLCBrcmVmKTsKKworCS8qIHRoaXMgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBhbGwgaW4tZmxpZ2h0IHVyYnMgdG8gY29tcGxldGUgKi8KKwlpZiAoZGV2LT51cmJzLmNvdW50ID4gMCkKKwkJdWZ4X2ZyZWVfdXJiX2xpc3QoZGV2KTsKKworCXByX2RlYnVnKCJmcmVlaW5nIHVmeF9kYXRhICVwIiwgZGV2KTsKKworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHVmeF9yZWxlYXNlX3VyYl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdXJiX25vZGUgKnVub2RlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1cmJfbm9kZSwKKwkJCQkJICAgICAgcmVsZWFzZV91cmJfd29yay53b3JrKTsKKworCXVwKCZ1bm9kZS0+ZGV2LT51cmJzLmxpbWl0X3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkIHVmeF9mcmVlX2ZyYW1lYnVmZmVyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1ZnhfZGF0YSwKKwkJCQkJICAgIGZyZWVfZnJhbWVidWZmZXJfd29yay53b3JrKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldi0+aW5mbzsKKwlpbnQgbm9kZSA9IGluZm8tPm5vZGU7CisKKwl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCisJaWYgKGluZm8tPmNtYXAubGVuICE9IDApCisJCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisJaWYgKGluZm8tPm1vbnNwZWNzLm1vZGVkYikKKwkJZmJfZGVzdHJveV9tb2RlZGIoaW5mby0+bW9uc3BlY3MubW9kZWRiKTsKKwlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCisJCXZmcmVlKGluZm8tPnNjcmVlbl9iYXNlKTsKKworCWZiX2Rlc3Ryb3lfbW9kZWxpc3QoJmluZm8tPm1vZGVsaXN0KTsKKworCWRldi0+aW5mbyA9IDA7CisKKwkvKiBBc3N1bWUgaW5mbyBzdHJ1Y3R1cmUgaXMgZnJlZWQgYWZ0ZXIgdGhpcyBwb2ludCAqLworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisKKwlwcl9kZWJ1ZygiZmJfaW5mbyBmb3IgL2Rldi9mYiVkIGhhcyBiZWVuIGZyZWVkIiwgbm9kZSk7CisKKwkvKiByZWYgdGFrZW4gaW4gcHJvYmUoKSBhcyBwYXJ0IG9mIHJlZ2lzdGVyaW5nIGZyYW1lYmZ1ZmVyICovCisJa3JlZl9wdXQoJmRldi0+a3JlZiwgdWZ4X2ZyZWUpOworfQorCisvKgorICogQXNzdW1lcyBjYWxsZXIgaXMgaG9sZGluZyBpbmZvLT5sb2NrIG11dGV4IChmb3Igb3BlbiBhbmQgcmVsZWFzZSBhdCBsZWFzdCkKKyAqLworc3RhdGljIGludCB1Znhfb3BzX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCisJZGV2LT5mYl9jb3VudC0tOworCisJLyogV2UgY2FuJ3QgZnJlZSBmYl9pbmZvIGhlcmUgLSBmYm1lbSB3aWxsIHRvdWNoIGl0IHdoZW4gd2UgcmV0dXJuICovCisJaWYgKGRldi0+dmlydHVhbGl6ZWQgJiYgKGRldi0+ZmJfY291bnQgPT0gMCkpCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT5mcmVlX2ZyYW1lYnVmZmVyX3dvcmssIEhaKTsKKworCWlmICgoZGV2LT5mYl9jb3VudCA9PSAwKSAmJiAoaW5mby0+ZmJkZWZpbykpIHsKKwkJZmJfZGVmZXJyZWRfaW9fY2xlYW51cChpbmZvKTsKKwkJa2ZyZWUoaW5mby0+ZmJkZWZpbyk7CisJCWluZm8tPmZiZGVmaW8gPSBOVUxMOworCQlpbmZvLT5mYm9wcy0+ZmJfbW1hcCA9IHVmeF9vcHNfbW1hcDsKKwl9CisKKwlwcl9kZWJ1ZygicmVsZWFzZWQgL2Rldi9mYiVkIHVzZXI9JWQgY291bnQ9JWQiLAorCQkgIGluZm8tPm5vZGUsIHVzZXIsIGRldi0+ZmJfY291bnQpOworCisJa3JlZl9wdXQoJmRldi0+a3JlZiwgdWZ4X2ZyZWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgYSB2aWRlbyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgY2hpcAorICogV2Ugc3RhcnQgZnJvbSBtb25pdG9yJ3MgbW9kZXMsIHNvIGRvbid0IG5lZWQgdG8gZmlsdGVyIHRoYXQgaGVyZSAqLworc3RhdGljIGludCB1ZnhfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlLAorCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpZiAoKG1vZGUtPnhyZXMgKiBtb2RlLT55cmVzKSA+ICgyMDQ4ICogMTE1MikpIHsKKwkJcHJfZGVidWcoIiVkeCVkIHRvbyBtYW55IHBpeGVscyIsCisJCSAgICAgICBtb2RlLT54cmVzLCBtb2RlLT55cmVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1vZGUtPnBpeGNsb2NrIDwgNTAwMCkgeworCQlwcl9kZWJ1ZygiJWR4JWQgJWRwcyBwaXhlbCBjbG9jayB0b28gZmFzdCIsCisJCSAgICAgICBtb2RlLT54cmVzLCBtb2RlLT55cmVzLCBtb2RlLT5waXhjbG9jayk7CisJCXJldHVybiAwOworCX0KKworCXByX2RlYnVnKCIlZHglZCAocGl4Y2xrICVkcHMgJWRNSHopIHZhbGlkIG1vZGUiLCBtb2RlLT54cmVzLCBtb2RlLT55cmVzLAorCQltb2RlLT5waXhjbG9jaywgKDEwMDAwMDAgLyBtb2RlLT5waXhjbG9jaykpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB1ZnhfdmFyX2NvbG9yX2Zvcm1hdChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwljb25zdCBzdHJ1Y3QgZmJfYml0ZmllbGQgcmVkID0geyAxMSwgNSwgMCB9OworCWNvbnN0IHN0cnVjdCBmYl9iaXRmaWVsZCBncmVlbiA9IHsgNSwgNiwgMCB9OworCWNvbnN0IHN0cnVjdCBmYl9iaXRmaWVsZCBibHVlID0geyAwLCA1LCAwIH07CisKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJdmFyLT5yZWQgPSByZWQ7CisJdmFyLT5ncmVlbiA9IGdyZWVuOworCXZhci0+Ymx1ZSA9IGJsdWU7Cit9CisKK3N0YXRpYyBpbnQgdWZ4X29wc19jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGZiX3ZpZGVvbW9kZSBtb2RlOworCisJLyogVE9ETzogc3VwcG9ydCBkeW5hbWljYWxseSBjaGFuZ2luZyBmcmFtZWJ1ZmZlciBzaXplICovCisJaWYgKCh2YXItPnhyZXMgKiB2YXItPnlyZXMgKiAyKSA+IGluZm8tPmZpeC5zbWVtX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZXQgZGV2aWNlLXNwZWNpZmljIGVsZW1lbnRzIG9mIHZhciB1bnJlbGF0ZWQgdG8gbW9kZSAqLworCXVmeF92YXJfY29sb3JfZm9ybWF0KHZhcik7CisKKwlmYl92YXJfdG9fdmlkZW9tb2RlKCZtb2RlLCB2YXIpOworCisJaWYgKCF1ZnhfaXNfdmFsaWRfbW9kZSgmbW9kZSwgaW5mbykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWZ4X29wc19zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCWludCByZXN1bHQ7CisJdTE2ICpwaXhfZnJhbWVidWZmZXI7CisJaW50IGk7CisKKwlwcl9kZWJ1Zygic2V0X3BhciBtb2RlICVkeCVkIiwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzKTsKKwlyZXN1bHQgPSB1Znhfc2V0X3ZpZF9tb2RlKGRldiwgJmluZm8tPnZhcik7CisKKwlpZiAoKHJlc3VsdCA9PSAwKSAmJiAoZGV2LT5mYl9jb3VudCA9PSAwKSkgeworCQkvKiBwYWludCBncmVlbnNjcmVlbiAqLworCQlwaXhfZnJhbWVidWZmZXIgPSAodTE2ICopIGluZm8tPnNjcmVlbl9iYXNlOworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+Zml4LnNtZW1fbGVuIC8gMjsgaSsrKQorCQkJcGl4X2ZyYW1lYnVmZmVyW2ldID0gMHgzN2U2OworCisJCXVmeF9oYW5kbGVfZGFtYWdlKGRldiwgMCwgMCwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzKTsKKwl9CisKKwkvKiByZS1lbmFibGUgZGVmaW8gaWYgcHJldmlvdXNseSBkaXNhYmxlZCBieSBkYW1hZ2UgdHJhY2tpbmcgKi8KKwlpZiAoaW5mby0+ZmJkZWZpbykKKwkJaW5mby0+ZmJkZWZpby0+ZGVsYXkgPSBVRlhfREVGSU9fV1JJVEVfREVMQVk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBJbiBvcmRlciB0byBjb21lIGJhY2sgZnJvbSBmdWxsIERQTVMgb2ZmLCB3ZSBuZWVkIHRvIHNldCB0aGUgbW9kZSBhZ2FpbiAqLworc3RhdGljIGludCB1Znhfb3BzX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdWZ4X2RhdGEgKmRldiA9IGluZm8tPnBhcjsKKwl1Znhfc2V0X3ZpZF9tb2RlKGRldiwgJmluZm8tPnZhcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIHVmeF9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX3JlYWQgPSBmYl9zeXNfcmVhZCwKKwkuZmJfd3JpdGUgPSB1Znhfb3BzX3dyaXRlLAorCS5mYl9zZXRjb2xyZWcgPSB1Znhfb3BzX3NldGNvbHJlZywKKwkuZmJfZmlsbHJlY3QgPSB1Znhfb3BzX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYSA9IHVmeF9vcHNfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdCA9IHVmeF9vcHNfaW1hZ2VibGl0LAorCS5mYl9tbWFwID0gdWZ4X29wc19tbWFwLAorCS5mYl9pb2N0bCA9IHVmeF9vcHNfaW9jdGwsCisJLmZiX29wZW4gPSB1Znhfb3BzX29wZW4sCisJLmZiX3JlbGVhc2UgPSB1Znhfb3BzX3JlbGVhc2UsCisJLmZiX2JsYW5rID0gdWZ4X29wc19ibGFuaywKKwkuZmJfY2hlY2tfdmFyID0gdWZ4X29wc19jaGVja192YXIsCisJLmZiX3NldF9wYXIgPSB1Znhfb3BzX3NldF9wYXIsCit9OworCisvKiBBc3N1bWVzICZpbmZvLT5sb2NrIGhlbGQgYnkgY2FsbGVyCisgKiBBc3N1bWVzIG5vIGFjdGl2ZSBjbGllbnRzIGhhdmUgZnJhbWVidWZmZXIgb3BlbiAqLworc3RhdGljIGludCB1ZnhfcmVhbGxvY19mcmFtZWJ1ZmZlcihzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJaW50IG9sZF9sZW4gPSBpbmZvLT5maXguc21lbV9sZW47CisJaW50IG5ld19sZW47CisJdW5zaWduZWQgY2hhciAqb2xkX2ZiID0gaW5mby0+c2NyZWVuX2Jhc2U7CisJdW5zaWduZWQgY2hhciAqbmV3X2ZiOworCisJcHJfZGVidWcoIlJlYWxsb2NhdGluZyBmcmFtZWJ1ZmZlci4gQWRkcmVzc2VzIHdpbGwgY2hhbmdlISIpOworCisJbmV3X2xlbiA9IGluZm8tPmZpeC5saW5lX2xlbmd0aCAqIGluZm8tPnZhci55cmVzOworCisJaWYgKFBBR0VfQUxJR04obmV3X2xlbikgPiBvbGRfbGVuKSB7CisJCS8qCisJCSAqIEFsbG9jIHN5c3RlbSBtZW1vcnkgZm9yIHZpcnR1YWwgZnJhbWVidWZmZXIKKwkJICovCisJCW5ld19mYiA9IHZtYWxsb2MobmV3X2xlbik7CisJCWlmICghbmV3X2ZiKSB7CisJCQlwcl9lcnIoIlZpcnR1YWwgZnJhbWVidWZmZXIgYWxsb2MgZmFpbGVkIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKGluZm8tPnNjcmVlbl9iYXNlKSB7CisJCQltZW1jcHkobmV3X2ZiLCBvbGRfZmIsIG9sZF9sZW4pOworCQkJdmZyZWUoaW5mby0+c2NyZWVuX2Jhc2UpOworCQl9CisKKwkJaW5mby0+c2NyZWVuX2Jhc2UgPSBuZXdfZmI7CisJCWluZm8tPmZpeC5zbWVtX2xlbiA9IFBBR0VfQUxJR04obmV3X2xlbik7CisJCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIG5ld19mYjsKKwkJaW5mby0+ZmxhZ3MgPSBzbXNjdWZ4X2luZm9fZmxhZ3M7CisJfQorCisJcmV0dmFsID0gMDsKKworZXJyb3I6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogc2V0cyB1cCBJMkMgQ29udHJvbGxlciBmb3IgMTAwIEticHMsIHN0ZC4gc3BlZWQsIDctYml0IGFkZHIsIG1hc3RlciwKKyAqIHJlc3RhcnQgZW5hYmxlZCwgYnV0IG5vIHN0YXJ0IGJ5dGUsIGVuYWJsZSBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHVmeF9pMmNfaW5pdChzdHJ1Y3QgdWZ4X2RhdGEgKmRldikKK3sKKwl1MzIgdG1wOworCisJLyogZGlzYWJsZSB0aGUgY29udHJvbGxlciBiZWZvcmUgaXQgY2FuIGJlIHJlcHJvZ3JhbW1lZCAqLworCWludCBzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgxMDZDLCAweDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJmYWlsZWQgdG8gZGlzYWJsZSBJMkMiKTsKKworCS8qIFNldHVwIHRoZSBjbG9jayBjb3VudCByZWdpc3RlcnMKKwkgKiAoMTIrMSkgPSAxMyBjbGtzIEAgMi41IE1IeiA9IDUuMiB1UyAqLworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDEwMTgsIDEyKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MTAxOCIpOworCisJLyogKDYrOCkgPSAxNCBjbGtzIEAgMi41IE1IeiA9IDUuNiB1UyAqLworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDEwMTQsIDYpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgxMDE0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDEwMDAsICZ0bXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHJlYWRpbmcgMHgxMDAwIik7CisKKwkvKiBzZXQgc3BlZWQgdG8gc3RkIG1vZGUgKi8KKwl0bXAgJj0gfigweDA2KTsKKwl0bXAgfD0gMHgwMjsKKworCS8qIDctYml0IChub3QgMTAtYml0KSBhZGRyZXNzaW5nICovCisJdG1wICY9IH4oMHgxMCk7CisKKwkvKiBlbmFibGUgcmVzdGFydCBjb25kaXRpb25zIGFuZCBtYXN0ZXIgbW9kZSAqLworCXRtcCB8PSAweDIxOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MTAwMCwgdG1wKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MTAwMCIpOworCisJLyogU2V0IG5vcm1hbCB0eCB1c2luZyB0YXJnZXQgYWRkcmVzcyAwICovCisJc3RhdHVzID0gdWZ4X3JlZ19jbGVhcl9hbmRfc2V0X2JpdHMoZGV2LCAweDEwMDQsIDB4QzAwLCAweDAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igc2V0dGluZyBUWCBtb2RlIGJpdHMgaW4gMHgxMDA0Iik7CisKKwkvKiBFbmFibGUgdGhlIGNvbnRyb2xsZXIgKi8KKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgxMDZDLCAweDAxKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJmYWlsZWQgdG8gZW5hYmxlIEkyQyIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNldHMgdGhlIEkyQyBwb3J0IG11eCBhbmQgdGFyZ2V0IGFkZHJlc3MgKi8KK3N0YXRpYyBpbnQgdWZ4X2kyY19jb25maWd1cmUoc3RydWN0IHVmeF9kYXRhICpkZXYpCit7CisJaW50IHN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDEwNkMsIDB4MDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImZhaWxlZCB0byBkaXNhYmxlIEkyQyIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MzAxMCwgMHgwMDAwMDAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZmFpbGVkIHRvIHdyaXRlIDB4MzAxMCIpOworCisJLyogQTBoIGlzIHN0ZCBmb3IgYW55IEVESUQsIHJpZ2h0IHNoaWZ0ZWQgYnkgb25lICovCisJc3RhdHVzID0gdWZ4X3JlZ19jbGVhcl9hbmRfc2V0X2JpdHMoZGV2LCAweDEwMDQsIDB4M0ZGLAkoMHhBMCA+PiAxKSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZmFpbGVkIHRvIHNldCBUQVIgYml0cyBpbiAweDEwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDEwNkMsIDB4MDEpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImZhaWxlZCB0byBlbmFibGUgSTJDIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogd2FpdCBmb3IgQlVTWSB0byBjbGVhciwgd2l0aCBhIHRpbWVvdXQgb2YgNTBtcyB3aXRoIDEwbXMgc2xlZXBzLiBpZiBubworICogbW9uaXRvciBpcyBjb25uZWN0ZWQsIHRoZXJlIGlzIG5vIGVycm9yIGV4Y2VwdCBmb3IgdGltZW91dCAqLworc3RhdGljIGludCB1ZnhfaTJjX3dhaXRfYnVzeShzdHJ1Y3QgdWZ4X2RhdGEgKmRldikKK3sKKwl1MzIgdG1wOworCWludCBpLCBzdGF0dXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworCQlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDExMDAsICZ0bXApOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICIweDExMDAgcmVhZCBmYWlsZWQiKTsKKworCQkvKiBpZiBCVVNZIGlzIGNsZWFyLCBjaGVjayBmb3IgZXJyb3IgKi8KKwkJaWYgKCh0bXAgJiAweDgwMDAwMDAwKSA9PSAwKSB7CisJCQlpZiAodG1wICYgMHgyMDAwMDAwMCkgeworCQkJCXByX3dhcm4oIkkyQyByZWFkIGZhaWxlZCwgMHgxMTAwPTB4JTA4eCIsIHRtcCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogcGVyZm9ybSB0aGUgZmlyc3QgMTAgcmV0cmllcyB3aXRob3V0IGRlbGF5ICovCisJCWlmIChpID49IDEwKQorCQkJbXNsZWVwKDEwKTsKKwl9CisKKwlwcl93YXJuKCJJMkMgYWNjZXNzIHRpbWVkIG91dCwgcmVzZXR0aW5nIEkyQyBoYXJkd2FyZSIpOworCXN0YXR1cyA9ICB1ZnhfcmVnX3dyaXRlKGRldiwgMHgxMTAwLCAweDQwMDAwMDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICIweDExMDAgd3JpdGUgZmFpbGVkIik7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyogcmVhZHMgYSAxMjgtYnl0ZSBFRElEIGJsb2NrIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwb3J0IGFuZCBUQVIgKi8KK3N0YXRpYyBpbnQgdWZ4X3JlYWRfZWRpZChzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTggKmVkaWQsIGludCBlZGlkX2xlbikKK3sKKwlpbnQgaSwgaiwgc3RhdHVzOworCXUzMiAqZWRpZF91MzIgPSAodTMyICopZWRpZDsKKworCUJVR19PTihlZGlkX2xlbiAhPSBFRElEX0xFTkdUSCk7CisKKwlzdGF0dXMgPSB1ZnhfaTJjX2NvbmZpZ3VyZShkZXYpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2VycigidWZ4X2kyY19jb25maWd1cmUgZmFpbGVkIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJbWVtc2V0KGVkaWQsIDB4ZmYsIEVESURfTEVOR1RIKTsKKworCS8qIFJlYWQgdGhlIDEyOC1ieXRlIEVESUQgYXMgMiBidXJzdHMgb2YgNjQgYnl0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXUzMiB0ZW1wID0gMHgyODA3MDAwMCB8ICg2MyA8PCAyMCkgfCAoKCh1MzIpKGkgKiA2NCkpIDw8IDgpOworCQlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgxMTAwLCB0ZW1wKTsKKwkJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiRmFpbGVkIHRvIHdyaXRlIDB4MTEwMCIpOworCisJCXRlbXAgfD0gMHg4MDAwMDAwMDsKKwkJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MTEwMCwgdGVtcCk7CisJCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgIkZhaWxlZCB0byB3cml0ZSAweDExMDAiKTsKKworCQlzdGF0dXMgPSB1ZnhfaTJjX3dhaXRfYnVzeShkZXYpOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICJUaW1lb3V0IHdhaXRpbmcgZm9yIEkyQyBCVVNZIHRvIGNsZWFyIik7CisKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCXUzMiBkYXRhX3JlZ19hZGRyID0gMHgxMTEwICsgKGogKiA0KTsKKwkJCXN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIGRhdGFfcmVnX2FkZHIsIGVkaWRfdTMyKyspOworCQkJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiRXJyb3IgcmVhZGluZyBpMmMgZGF0YSIpOworCQl9CisJfQorCisJLyogYWxsIEZGJ3MgaW4gdGhlIGZpcnN0IDE2IGJ5dGVzIGluZGljYXRlcyBub3RoaW5nIGlzIGNvbm5lY3RlZCAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmIChlZGlkW2ldICE9IDB4RkYpIHsKKwkJCXByX2RlYnVnKCJlZGlkIGRhdGEgcmVhZCBzdWNjZXNmdWxseSIpOworCQkJcmV0dXJuIEVESURfTEVOR1RIOworCQl9CisJfQorCisJcHJfd2FybigiZWRpZCBkYXRhIGNvbnRhaW5zIGFsbCAweGZmIik7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qIDEpIHVzZSBzdyBkZWZhdWx0CisgKiAyKSBQYXJzZSBpbnRvIHZhcmlvdXMgZmJfaW5mbyBzdHJ1Y3RzCisgKiAzKSBBbGxvY2F0ZSB2aXJ0dWFsIGZyYW1lYnVmZmVyIG1lbW9yeSB0byBiYWNrIGhpZ2hlc3QgcmVzIG1vZGUKKyAqCisgKiBQYXJzZXMgRURJRCBpbnRvIHRocmVlIHBsYWNlcyB1c2VkIGJ5IHZhcmlvdXMgcGFydHMgb2YgZmJkZXY6CisgKiBmYl92YXJfc2NyZWVuaW5mbyBjb250YWlucyB0aGUgdGltaW5nIG9mIHRoZSBtb25pdG9yJ3MgcHJlZmVycmVkIG1vZGUKKyAqIGZiX2luZm8ubW9uc3BlY3MgaXMgZnVsbCBwYXJzZWQgRURJRCBpbmZvLCBpbmNsdWRpbmcgbW9uc3BlY3MubW9kZWRiCisgKiBmYl9pbmZvLm1vZGVsaXN0IGlzIGEgbGlua2VkIGxpc3Qgb2YgYWxsIG1vbml0b3IgJiBWRVNBIG1vZGVzIHdoaWNoIHdvcmsKKyAqCisgKiBJZiBFRElEIGlzIG5vdCByZWFkYWJsZS92YWxpZCwgdGhlbiBtb2RlbGlzdCBpcyBhbGwgVkVTQSBtb2RlcywKKyAqIG1vbnNwZWNzIGlzIE5VTEwsIGFuZCBmYl92YXJfc2NyZWVuaW5mbyBpcyBzZXQgdG8gc2FmZSBWRVNBIG1vZGUKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsICovCitzdGF0aWMgaW50IHVmeF9zZXR1cF9tb2RlcyhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgc3RydWN0IGZiX2luZm8gKmluZm8sCisJY2hhciAqZGVmYXVsdF9lZGlkLCBzaXplX3QgZGVmYXVsdF9lZGlkX3NpemUpCit7CisJY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqZGVmYXVsdF92bW9kZSA9IE5VTEw7CisJdTggKmVkaWQ7CisJaW50IGksIHJlc3VsdCA9IDAsIHRyaWVzID0gMzsKKworCWlmIChpbmZvLT5kZXYpIC8qIG9ubHkgdXNlIG11dGV4IGlmIGluZm8gaGFzIGJlZW4gcmVnaXN0ZXJlZCAqLworCQltdXRleF9sb2NrKCZpbmZvLT5sb2NrKTsKKworCWVkaWQgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVkaWQpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmYl9kZXN0cm95X21vZGVsaXN0KCZpbmZvLT5tb2RlbGlzdCk7CisJbWVtc2V0KCZpbmZvLT5tb25zcGVjcywgMCwgc2l6ZW9mKGluZm8tPm1vbnNwZWNzKSk7CisKKwkvKiBUcnkgdG8gKHJlKXJlYWQgRURJRCBmcm9tIGhhcmR3YXJlIGZpcnN0CisJICogRURJRCBkYXRhIG1heSByZXR1cm4sIGJ1dCBub3QgcGFyc2UgYXMgdmFsaWQKKwkgKiBUcnkgYWdhaW4gYSBmZXcgdGltZXMsIGluIGNhc2Ugb2YgZS5nLiBhbmFsb2cgY2FibGUgbm9pc2UgKi8KKwl3aGlsZSAodHJpZXMtLSkgeworCQlpID0gdWZ4X3JlYWRfZWRpZChkZXYsIGVkaWQsIEVESURfTEVOR1RIKTsKKworCQlpZiAoaSA+PSBFRElEX0xFTkdUSCkKKwkJCWZiX2VkaWRfdG9fbW9uc3BlY3MoZWRpZCwgJmluZm8tPm1vbnNwZWNzKTsKKworCQlpZiAoaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiA+IDApIHsKKwkJCWRldi0+ZWRpZCA9IGVkaWQ7CisJCQlkZXYtPmVkaWRfc2l6ZSA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIElmIHRoYXQgZmFpbHMsIHVzZSBhIHByZXZpb3VzbHkgcmV0dXJuZWQgRURJRCBpZiBhdmFpbGFibGUgKi8KKwlpZiAoaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiA9PSAwKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGdldCB2YWxpZCBFRElEIGZyb20gZGV2aWNlL2Rpc3BsYXlcbiIpOworCisJCWlmIChkZXYtPmVkaWQpIHsKKwkJCWZiX2VkaWRfdG9fbW9uc3BlY3MoZGV2LT5lZGlkLCAmaW5mby0+bW9uc3BlY3MpOworCQkJaWYgKGluZm8tPm1vbnNwZWNzLm1vZGVkYl9sZW4gPiAwKQorCQkJCXByX2VycigiVXNpbmcgcHJldmlvdXNseSBxdWVyaWVkIEVESURcbiIpOworCQl9CisJfQorCisJLyogSWYgdGhhdCBmYWlscywgdXNlIHRoZSBkZWZhdWx0IEVESUQgd2Ugd2VyZSBoYW5kZWQgKi8KKwlpZiAoaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiA9PSAwKSB7CisJCWlmIChkZWZhdWx0X2VkaWRfc2l6ZSA+PSBFRElEX0xFTkdUSCkgeworCQkJZmJfZWRpZF90b19tb25zcGVjcyhkZWZhdWx0X2VkaWQsICZpbmZvLT5tb25zcGVjcyk7CisJCQlpZiAoaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiA+IDApIHsKKwkJCQltZW1jcHkoZWRpZCwgZGVmYXVsdF9lZGlkLCBkZWZhdWx0X2VkaWRfc2l6ZSk7CisJCQkJZGV2LT5lZGlkID0gZWRpZDsKKwkJCQlkZXYtPmVkaWRfc2l6ZSA9IGRlZmF1bHRfZWRpZF9zaXplOworCQkJCXByX2VycigiVXNpbmcgZGVmYXVsdC9iYWNrdXAgRURJRFxuIik7CisJCQl9CisJCX0KKwl9CisKKwkvKiBJZiB3ZSd2ZSBnb3QgbW9kZXMsIGxldCdzIHBpY2sgYSBiZXN0IGRlZmF1bHQgbW9kZSAqLworCWlmIChpbmZvLT5tb25zcGVjcy5tb2RlZGJfbGVuID4gMCkgeworCisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5tb25zcGVjcy5tb2RlZGJfbGVuOyBpKyspIHsKKwkJCWlmICh1ZnhfaXNfdmFsaWRfbW9kZSgmaW5mby0+bW9uc3BlY3MubW9kZWRiW2ldLCBpbmZvKSkKKwkJCQlmYl9hZGRfdmlkZW9tb2RlKCZpbmZvLT5tb25zcGVjcy5tb2RlZGJbaV0sCisJCQkJCSZpbmZvLT5tb2RlbGlzdCk7CisJCQllbHNlIC8qIGlmIHdlJ3ZlIHJlbW92ZWQgdG9wL2Jlc3QgbW9kZSAqLworCQkJCWluZm8tPm1vbnNwZWNzLm1pc2MgJj0gfkZCX01JU0NfMVNUX0RFVEFJTDsKKwkJfQorCisJCWRlZmF1bHRfdm1vZGUgPSBmYl9maW5kX2Jlc3RfZGlzcGxheSgmaW5mby0+bW9uc3BlY3MsCisJCQkJCQkgICAgICZpbmZvLT5tb2RlbGlzdCk7CisJfQorCisJLyogSWYgZXZlcnl0aGluZyBlbHNlIGhhcyBmYWlsZWQsIGZhbGwgYmFjayB0byBzYWZlIGRlZmF1bHQgbW9kZSAqLworCWlmIChkZWZhdWx0X3Ztb2RlID09IE5VTEwpIHsKKworCQlzdHJ1Y3QgZmJfdmlkZW9tb2RlIGZiX3Ztb2RlID0gezB9OworCisJCS8qIEFkZCB0aGUgc3RhbmRhcmQgVkVTQSBtb2RlcyB0byBvdXIgbW9kZWxpc3QKKwkJICogU2luY2Ugd2UgZG9uJ3QgaGF2ZSBFRElELCB0aGVyZSBtYXkgYmUgbW9kZXMgdGhhdAorCQkgKiBvdmVyc3BlYyBtb25pdG9yIGFuZC9vciBhcmUgaW5jb3JyZWN0IGFzcGVjdCByYXRpbywgZXRjLgorCQkgKiBCdXQgYXQgbGVhc3QgdGhlIHVzZXIgaGFzIGEgY2hhbmNlIHRvIGNob29zZQorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFZFU0FfTU9ERURCX1NJWkU7IGkrKykgeworCQkJaWYgKHVmeF9pc192YWxpZF9tb2RlKChzdHJ1Y3QgZmJfdmlkZW9tb2RlICopCisJCQkJCQkmdmVzYV9tb2Rlc1tpXSwgaW5mbykpCisJCQkJZmJfYWRkX3ZpZGVvbW9kZSgmdmVzYV9tb2Rlc1tpXSwKKwkJCQkJCSAmaW5mby0+bW9kZWxpc3QpOworCQl9CisKKwkJLyogZGVmYXVsdCB0byByZXNvbHV0aW9uIHNhZmUgZm9yIHByb2plY3RvcnMKKwkJICogKHNpbmNlIHRoZXkgYXJlIG1vc3QgY29tbW9uIGNhc2Ugd2l0aG91dCBFRElEKQorCQkgKi8KKwkJZmJfdm1vZGUueHJlcyA9IDgwMDsKKwkJZmJfdm1vZGUueXJlcyA9IDYwMDsKKwkJZmJfdm1vZGUucmVmcmVzaCA9IDYwOworCQlkZWZhdWx0X3Ztb2RlID0gZmJfZmluZF9uZWFyZXN0X21vZGUoJmZiX3Ztb2RlLAorCQkJCQkJICAgICAmaW5mby0+bW9kZWxpc3QpOworCX0KKworCS8qIElmIHdlIGhhdmUgZ29vZCBtb2RlIGFuZCBubyBhY3RpdmUgY2xpZW50cyAqLworCWlmICgoZGVmYXVsdF92bW9kZSAhPSBOVUxMKSAmJiAoZGV2LT5mYl9jb3VudCA9PSAwKSkgeworCisJCWZiX3ZpZGVvbW9kZV90b192YXIoJmluZm8tPnZhciwgZGVmYXVsdF92bW9kZSk7CisJCXVmeF92YXJfY29sb3JfZm9ybWF0KCZpbmZvLT52YXIpOworCisJCS8qIHdpdGggbW9kZSBzaXplIGluZm8sIHdlIGNhbiBub3cgYWxsb2Mgb3VyIGZyYW1lYnVmZmVyICovCisJCW1lbWNweSgmaW5mby0+Zml4LCAmdWZ4X2ZpeCwgc2l6ZW9mKHVmeF9maXgpKTsKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gaW5mby0+dmFyLnhyZXMgKgorCQkJKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOworCisJCXJlc3VsdCA9IHVmeF9yZWFsbG9jX2ZyYW1lYnVmZmVyKGRldiwgaW5mbyk7CisKKwl9IGVsc2UKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKworZXJyb3I6CisJaWYgKGVkaWQgJiYgKGRldi0+ZWRpZCAhPSBlZGlkKSkKKwkJa2ZyZWUoZWRpZCk7CisKKwlpZiAoaW5mby0+ZGV2KQorCQltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB1ZnhfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKKwlzdHJ1Y3QgdWZ4X2RhdGEgKmRldjsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IDA7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJdTMyIGlkX3JldiwgZnBnYV9yZXY7CisKKwkvKiB1c2IgaW5pdGlhbGl6YXRpb24gKi8KKwl1c2JkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisJQlVHX09OKCF1c2JkZXYpOworCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwgInVmeF91c2JfcHJvYmU6IGZhaWxlZCBhbGxvYyBvZiBkZXYgc3RydWN0XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiB3ZSBuZWVkIHRvIHdhaXQgZm9yIGJvdGggdXNiIGFuZCBmYmRldiB0byBzcGluIGRvd24gb24gZGlzY29ubmVjdCAqLworCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsgLyogbWF0Y2hpbmcga3JlZl9wdXQgaW4gdXNiIC5kaXNjb25uZWN0IGZuICovCisJa3JlZl9nZXQoJmRldi0+a3JlZik7IC8qIG1hdGNoaW5nIGtyZWZfcHV0IGluIGZyZWVfZnJhbWVidWZmZXJfd29yayAqLworCisJZGV2LT51ZGV2ID0gdXNiZGV2OworCWRldi0+Z2RldiA9ICZ1c2JkZXYtPmRldjsgLyogb3VyIGdlbmVyaWMgc3RydWN0IGRldmljZSAqICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGRldik7CisKKwlkZXZfZGJnKGRldi0+Z2RldiwgIiVzICVzIC0gc2VyaWFsICMlc1xuIiwKKwkJdXNiZGV2LT5tYW51ZmFjdHVyZXIsIHVzYmRldi0+cHJvZHVjdCwgdXNiZGV2LT5zZXJpYWwpOworCWRldl9kYmcoZGV2LT5nZGV2LCAidmlkXyUwNHgmcGlkXyUwNHgmcmV2XyUwNHggZHJpdmVyJ3MgdWZ4X2RhdGEgc3RydWN0IGF0ICVwXG4iLAorCQl1c2JkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsIHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QsCisJCXVzYmRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UsIGRldik7CisJZGV2X2RiZyhkZXYtPmdkZXYsICJjb25zb2xlIGVuYWJsZT0lZFxuIiwgY29uc29sZSk7CisJZGV2X2RiZyhkZXYtPmdkZXYsICJmYl9kZWZpbyBlbmFibGU9JWRcbiIsIGZiX2RlZmlvKTsKKworCWlmICghdWZ4X2FsbG9jX3VyYl9saXN0KGRldiwgV1JJVEVTX0lOX0ZMSUdIVCwgTUFYX1RSQU5TRkVSKSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlkZXZfZXJyKGRldi0+Z2RldiwgInVmeF9hbGxvY191cmJfbGlzdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFdlIGRvbid0IHJlZ2lzdGVyIGEgbmV3IFVTQiBjbGFzcy4gT3VyIGNsaWVudCBpbnRlcmZhY2UgaXMgZmJkZXYgKi8KKworCS8qIGFsbG9jYXRlcyBmcmFtZWJ1ZmZlciBkcml2ZXIgc3RydWN0dXJlLCBub3QgZnJhbWVidWZmZXIgbWVtb3J5ICovCisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsICZ1c2JkZXYtPmRldik7CisJaWYgKCFpbmZvKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWRldl9lcnIoZGV2LT5nZGV2LCAiZnJhbWVidWZmZXJfYWxsb2MgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPmluZm8gPSBpbmZvOworCWluZm8tPnBhciA9IGRldjsKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IGRldi0+cHNldWRvX3BhbGV0dGU7CisJaW5mby0+ZmJvcHMgPSAmdWZ4X29wczsKKworCXJldHZhbCA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycihkZXYtPmdkZXYsICJmYl9hbGxvY19jbWFwIGZhaWxlZCAleFxuIiwgcmV0dmFsKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlJTklUX0RFTEFZRURfV09SSygmZGV2LT5mcmVlX2ZyYW1lYnVmZmVyX3dvcmssCisJCQkgIHVmeF9mcmVlX2ZyYW1lYnVmZmVyX3dvcmspOworCisJSU5JVF9MSVNUX0hFQUQoJmluZm8tPm1vZGVsaXN0KTsKKworCXJldHZhbCA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MzAwMCwgJmlkX3Jldik7CisJY2hlY2tfd2Fybl9nb3RvX2Vycm9yKHJldHZhbCwgImVycm9yICVkIHJlYWRpbmcgMHgzMDAwIHJlZ2lzdGVyIGZyb20gZGV2aWNlIiwgcmV0dmFsKTsKKwlkZXZfZGJnKGRldi0+Z2RldiwgIklEX1JFViByZWdpc3RlciB2YWx1ZSAweCUwOHgiLCBpZF9yZXYpOworCisJcmV0dmFsID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgzMDA0LCAmZnBnYV9yZXYpOworCWNoZWNrX3dhcm5fZ290b19lcnJvcihyZXR2YWwsICJlcnJvciAlZCByZWFkaW5nIDB4MzAwNCByZWdpc3RlciBmcm9tIGRldmljZSIsIHJldHZhbCk7CisJZGV2X2RiZyhkZXYtPmdkZXYsICJGUEdBX1JFViByZWdpc3RlciB2YWx1ZSAweCUwOHgiLCBmcGdhX3Jldik7CisKKwlkZXZfZGJnKGRldi0+Z2RldiwgInJlc2V0dGluZyBkZXZpY2UiKTsKKwlyZXR2YWwgPSB1ZnhfbGl0ZV9yZXNldChkZXYpOworCWNoZWNrX3dhcm5fZ290b19lcnJvcihyZXR2YWwsICJlcnJvciAlZCByZXNldHRpbmcgZGV2aWNlIiwgcmV0dmFsKTsKKworCWRldl9kYmcoZGV2LT5nZGV2LCAiY29uZmlndXJpbmcgc3lzdGVtIGNsb2NrIik7CisJcmV0dmFsID0gdWZ4X2NvbmZpZ19zeXNfY2xrKGRldik7CisJY2hlY2tfd2Fybl9nb3RvX2Vycm9yKHJldHZhbCwgImVycm9yICVkIGNvbmZpZ3VyaW5nIHN5c3RlbSBjbG9jayIsIHJldHZhbCk7CisKKwlkZXZfZGJnKGRldi0+Z2RldiwgImNvbmZpZ3VyaW5nIEREUjIgY29udHJvbGxlciIpOworCXJldHZhbCA9IHVmeF9jb25maWdfZGRyMihkZXYpOworCWNoZWNrX3dhcm5fZ290b19lcnJvcihyZXR2YWwsICJlcnJvciAlZCBpbml0aWFsaXNpbmcgRERSMiBjb250cm9sbGVyIiwgcmV0dmFsKTsKKworCWRldl9kYmcoZGV2LT5nZGV2LCAiY29uZmlndXJpbmcgSTJDIGNvbnRyb2xsZXIiKTsKKwlyZXR2YWwgPSB1ZnhfaTJjX2luaXQoZGV2KTsKKwljaGVja193YXJuX2dvdG9fZXJyb3IocmV0dmFsLCAiZXJyb3IgJWQgaW5pdGlhbGlzaW5nIEkyQyBjb250cm9sbGVyIiwgcmV0dmFsKTsKKworCWRldl9kYmcoZGV2LT5nZGV2LCAic2VsZWN0aW5nIGRpc3BsYXkgbW9kZSIpOworCXJldHZhbCA9IHVmeF9zZXR1cF9tb2RlcyhkZXYsIGluZm8sIE5VTEwsIDApOworCWNoZWNrX3dhcm5fZ290b19lcnJvcihyZXR2YWwsICJ1bmFibGUgdG8gZmluZCBjb21tb24gbW9kZSBmb3IgZGlzcGxheSBhbmQgYWRhcHRlciIpOworCisJcmV0dmFsID0gdWZ4X3JlZ19zZXRfYml0cyhkZXYsIDB4NDAwMCwgMHgwMDAwMDAwMSk7CisJY2hlY2tfd2Fybl9nb3RvX2Vycm9yKHJldHZhbCwgImVycm9yICVkIGVuYWJsaW5nIGdyYXBoaWNzIGVuZ2luZSIsIHJldHZhbCk7CisKKwkvKiByZWFkeSB0byBiZWdpbiB1c2luZyBkZXZpY2UgKi8KKwlhdG9taWNfc2V0KCZkZXYtPnVzYl9hY3RpdmUsIDEpOworCisJZGV2X2RiZyhkZXYtPmdkZXYsICJjaGVja2luZyB2YXIiKTsKKwlyZXR2YWwgPSB1Znhfb3BzX2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKTsKKwljaGVja193YXJuX2dvdG9fZXJyb3IocmV0dmFsLCAiZXJyb3IgJWQgdWZ4X29wc19jaGVja192YXIiLCByZXR2YWwpOworCisJZGV2X2RiZyhkZXYtPmdkZXYsICJzZXR0aW5nIHBhciIpOworCXJldHZhbCA9IHVmeF9vcHNfc2V0X3BhcihpbmZvKTsKKwljaGVja193YXJuX2dvdG9fZXJyb3IocmV0dmFsLCAiZXJyb3IgJWQgdWZ4X29wc19zZXRfcGFyIiwgcmV0dmFsKTsKKworCWRldl9kYmcoZGV2LT5nZGV2LCAicmVnaXN0ZXJpbmcgZnJhbWVidWZmZXIiKTsKKwlyZXR2YWwgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwljaGVja193YXJuX2dvdG9fZXJyb3IocmV0dmFsLCAiZXJyb3IgJWQgcmVnaXN0ZXJfZnJhbWVidWZmZXIiLCByZXR2YWwpOworCisJZGV2X2luZm8oZGV2LT5nZGV2LCAiU01TQyBVRFggVVNCIGRldmljZSAvZGV2L2ZiJWQgYXR0YWNoZWQuICVkeCVkIHJlc29sdXRpb24uIgorCQkiIFVzaW5nICVkSyBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIsIGluZm8tPm5vZGUsCisJCWluZm8tPnZhci54cmVzLCBpbmZvLT52YXIueXJlcywgaW5mby0+Zml4LnNtZW1fbGVuID4+IDEwKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAoZGV2KSB7CisJCWlmIChpbmZvKSB7CisJCQlpZiAoaW5mby0+Y21hcC5sZW4gIT0gMCkKKwkJCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCQkJaWYgKGluZm8tPm1vbnNwZWNzLm1vZGVkYikKKwkJCQlmYl9kZXN0cm95X21vZGVkYihpbmZvLT5tb25zcGVjcy5tb2RlZGIpOworCQkJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQorCQkJCXZmcmVlKGluZm8tPnNjcmVlbl9iYXNlKTsKKworCQkJZmJfZGVzdHJveV9tb2RlbGlzdCgmaW5mby0+bW9kZWxpc3QpOworCisJCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCQl9CisKKwkJa3JlZl9wdXQoJmRldi0+a3JlZiwgdWZ4X2ZyZWUpOyAvKiByZWYgZm9yIGZyYW1lYnVmZmVyICovCisJCWtyZWZfcHV0KCZkZXYtPmtyZWYsIHVmeF9mcmVlKTsgLyogbGFzdCByZWYgZnJvbSBrcmVmX2luaXQgKi8KKworCQkvKiBkZXYgaGFzIGJlZW4gZGVhbGxvY2F0ZWQuIERvIG5vdCBkZXJlZmVyZW5jZSAqLworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHVmeF91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2OworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWluZm8gPSBkZXYtPmluZm87CisKKwlwcl9kZWJ1ZygiVVNCIGRpc2Nvbm5lY3Qgc3RhcnRpbmdcbiIpOworCisJLyogd2UgdmlydHVhbGl6ZSB1bnRpbCBhbGwgZmIgY2xpZW50cyByZWxlYXNlLiBUaGVuIHdlIGZyZWUgKi8KKwlkZXYtPnZpcnR1YWxpemVkID0gdHJ1ZTsKKworCS8qIFdoZW4gbm9uLWFjdGl2ZSB3ZSdsbCB1cGRhdGUgdmlydHVhbCBmcmFtZWJ1ZmZlciwgYnV0IG5vIG5ldyB1cmJzICovCisJYXRvbWljX3NldCgmZGV2LT51c2JfYWN0aXZlLCAwKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKworCS8qIGlmIGNsaWVudHMgc3RpbGwgaGF2ZSB1cyBvcGVuLCB3aWxsIGJlIGZyZWVkIG9uIGxhc3QgY2xvc2UgKi8KKwlpZiAoZGV2LT5mYl9jb3VudCA9PSAwKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+ZnJlZV9mcmFtZWJ1ZmZlcl93b3JrLCAwKTsKKworCS8qIHJlbGVhc2UgcmVmZXJlbmNlIHRha2VuIGJ5IGtyZWZfaW5pdCBpbiBwcm9iZSgpICovCisJa3JlZl9wdXQoJmRldi0+a3JlZiwgdWZ4X2ZyZWUpOworCisJLyogY29uc2lkZXIgdWZ4X2RhdGEgZnJlZWQgKi8KK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVmeF9kcml2ZXIgPSB7CisJLm5hbWUgPSAic21zY3VmeCIsCisJLnByb2JlID0gdWZ4X3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHVmeF91c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBpZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVmeF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKwlyZXMgPSB1c2JfcmVnaXN0ZXIoJnVmeF9kcml2ZXIpOworCWlmIChyZXMpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmVzKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1ZnhfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmdWZ4X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVmeF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdCh1ZnhfbW9kdWxlX2V4aXQpOworCitzdGF0aWMgdm9pZCB1ZnhfdXJiX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1cmJfbm9kZSAqdW5vZGUgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHVmeF9kYXRhICpkZXYgPSB1bm9kZS0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLworCWlmICh1cmItPnN0YXR1cykgeworCQlpZiAoISh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpIHsKKwkJCXByX2VycigiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJYXRvbWljX3NldCgmZGV2LT5sb3N0X3BpeGVscywgMSk7CisJCX0KKwl9CisKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBkZXYtPnVyYnMuc2l6ZTsgLyogcmVzZXQgdG8gYWN0dWFsICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT51cmJzLmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZ1bm9kZS0+ZW50cnksICZkZXYtPnVyYnMubGlzdCk7CisJZGV2LT51cmJzLmF2YWlsYWJsZSsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dXJicy5sb2NrLCBmbGFncyk7CisKKwkvKiBXaGVuIHVzaW5nIGZiX2RlZmlvLCB3ZSBkZWFkbG9jayBpZiB1cCgpIGlzIGNhbGxlZAorCSAqIHdoaWxlIGFub3RoZXIgaXMgd2FpdGluZy4gU28gcXVldWUgdG8gYW5vdGhlciBwcm9jZXNzICovCisJaWYgKGZiX2RlZmlvKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnVub2RlLT5yZWxlYXNlX3VyYl93b3JrLCAwKTsKKwllbHNlCisJCXVwKCZkZXYtPnVyYnMubGltaXRfc2VtKTsKK30KKworc3RhdGljIHZvaWQgdWZ4X2ZyZWVfdXJiX2xpc3Qoc3RydWN0IHVmeF9kYXRhICpkZXYpCit7CisJaW50IGNvdW50ID0gZGV2LT51cmJzLmNvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CisJc3RydWN0IHVyYl9ub2RlICp1bm9kZTsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIldhaXRpbmcgZm9yIGNvbXBsZXRlcyBhbmQgZnJlZWluZyBhbGwgcmVuZGVyIHVyYnNcbiIpOworCisJLyoga2VlcCB3YWl0aW5nIGFuZCBmcmVlaW5nLCB1bnRpbCB3ZSd2ZSBnb3QgJ2VtIGFsbCAqLworCXdoaWxlIChjb3VudC0tKSB7CisJCS8qIEdldHRpbmcgaW50ZXJydXB0ZWQgbWVhbnMgYSBsZWFrLCBidXQgb2sgYXQgc2h1dGRvd24qLworCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmRldi0+dXJicy5saW1pdF9zZW0pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dXJicy5sb2NrLCBmbGFncyk7CisKKwkJbm9kZSA9IGRldi0+dXJicy5saXN0Lm5leHQ7IC8qIGhhdmUgcmVzZXJ2ZWQgb25lIHdpdGggc2VtICovCisJCWxpc3RfZGVsX2luaXQobm9kZSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT51cmJzLmxvY2ssIGZsYWdzKTsKKworCQl1bm9kZSA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IHVyYl9ub2RlLCBlbnRyeSk7CisJCXVyYiA9IHVub2RlLT51cmI7CisKKwkJLyogRnJlZSBlYWNoIHNlcGFyYXRlbHkgYWxsb2NhdGVkIHBpZWNlICovCisJCXVzYl9mcmVlX2NvaGVyZW50KHVyYi0+ZGV2LCBkZXYtPnVyYnMuc2l6ZSwKKwkJCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2RtYSk7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCQlrZnJlZShub2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdWZ4X2FsbG9jX3VyYl9saXN0KHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBpbnQgY291bnQsIHNpemVfdCBzaXplKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJc3RydWN0IHVyYl9ub2RlICp1bm9kZTsKKwljaGFyICpidWY7CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT51cmJzLmxvY2spOworCisJZGV2LT51cmJzLnNpemUgPSBzaXplOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnVyYnMubGlzdCk7CisKKwl3aGlsZSAoaSA8IGNvdW50KSB7CisJCXVub2RlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVyYl9ub2RlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdW5vZGUpCisJCQlicmVhazsKKwkJdW5vZGUtPmRldiA9IGRldjsKKworCQlJTklUX0RFTEFZRURfV09SSygmdW5vZGUtPnJlbGVhc2VfdXJiX3dvcmssCisJCQkgIHVmeF9yZWxlYXNlX3VyYl93b3JrKTsKKworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYikgeworCQkJa2ZyZWUodW5vZGUpOworCQkJYnJlYWs7CisJCX0KKwkJdW5vZGUtPnVyYiA9IHVyYjsKKworCQlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBzaXplLCBHRlBfS0VSTkVMLAorCQkJCQkgJnVyYi0+dHJhbnNmZXJfZG1hKTsKKwkJaWYgKCFidWYpIHsKKwkJCWtmcmVlKHVub2RlKTsKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggc2V0IHRvIGFjdHVhbCBiZWZvcmUgc3VibWl0ICovCisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgZGV2LT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LCAxKSwKKwkJCWJ1Ziwgc2l6ZSwgdWZ4X3VyYl9jb21wbGV0aW9uLCB1bm9kZSk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwkJbGlzdF9hZGRfdGFpbCgmdW5vZGUtPmVudHJ5LCAmZGV2LT51cmJzLmxpc3QpOworCisJCWkrKzsKKwl9CisKKwlzZW1hX2luaXQoJmRldi0+dXJicy5saW1pdF9zZW0sIGkpOworCWRldi0+dXJicy5jb3VudCA9IGk7CisJZGV2LT51cmJzLmF2YWlsYWJsZSA9IGk7CisKKwlwcl9kZWJ1ZygiYWxsb2NhdGVkICVkICVkIGJ5dGUgdXJic1xuIiwgaSwgKGludCkgc2l6ZSk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHN0cnVjdCB1cmIgKnVmeF9nZXRfdXJiKHN0cnVjdCB1ZnhfZGF0YSAqZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCB1cmJfbm9kZSAqdW5vZGU7CisJc3RydWN0IHVyYiAqdXJiID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogV2FpdCBmb3IgYW4gaW4tZmxpZ2h0IGJ1ZmZlciB0byBjb21wbGV0ZSBhbmQgZ2V0IHJlLXF1ZXVlZCAqLworCXJldCA9IGRvd25fdGltZW91dCgmZGV2LT51cmJzLmxpbWl0X3NlbSwgR0VUX1VSQl9USU1FT1VUKTsKKwlpZiAocmV0KSB7CisJCWF0b21pY19zZXQoJmRldi0+bG9zdF9waXhlbHMsIDEpOworCQlwcl93YXJuKCJ3YWl0IGZvciB1cmIgaW50ZXJydXB0ZWQ6ICV4IGF2YWlsYWJsZTogJWRcbiIsCisJCSAgICAgICByZXQsIGRldi0+dXJicy5hdmFpbGFibGUpOworCQlnb3RvIGVycm9yOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnVyYnMubG9jaywgZmxhZ3MpOworCisJQlVHX09OKGxpc3RfZW1wdHkoJmRldi0+dXJicy5saXN0KSk7IC8qIHJlc2VydmVkIG9uZSB3aXRoIGxpbWl0X3NlbSAqLworCWVudHJ5ID0gZGV2LT51cmJzLmxpc3QubmV4dDsKKwlsaXN0X2RlbF9pbml0KGVudHJ5KTsKKwlkZXYtPnVyYnMuYXZhaWxhYmxlLS07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnVyYnMubG9jaywgZmxhZ3MpOworCisJdW5vZGUgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgdXJiX25vZGUsIGVudHJ5KTsKKwl1cmIgPSB1bm9kZS0+dXJiOworCitlcnJvcjoKKwlyZXR1cm4gdXJiOworfQorCitzdGF0aWMgaW50IHVmeF9zdWJtaXRfdXJiKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIsIHNpemVfdCBsZW4pCit7CisJaW50IHJldDsKKworCUJVR19PTihsZW4gPiBkZXYtPnVyYnMuc2l6ZSk7CisKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBsZW47IC8qIHNldCB0byBhY3R1YWwgcGF5bG9hZCBsZW4gKi8KKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXQpIHsKKwkJdWZ4X3VyYl9jb21wbGV0aW9uKHVyYik7IC8qIGJlY2F1c2Ugbm8gb25lIGVsc2Ugd2lsbCAqLworCQlhdG9taWNfc2V0KCZkZXYtPmxvc3RfcGl4ZWxzLCAxKTsKKwkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYiBlcnJvciAleFxuIiwgcmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworbW9kdWxlX3BhcmFtKGNvbnNvbGUsIGJvb2wsIFNfSVdVU1IgfCBTX0lSVVNSIHwgU19JV0dSUCB8IFNfSVJHUlApOworTU9EVUxFX1BBUk1fREVTQyhjb25zb2xlLCAiQWxsb3cgZmJjb24gdG8gYmUgdXNlZCBvbiB0aGlzIGRpc3BsYXkiKTsKKworbW9kdWxlX3BhcmFtKGZiX2RlZmlvLCBib29sLCBTX0lXVVNSIHwgU19JUlVTUiB8IFNfSVdHUlAgfCBTX0lSR1JQKTsKK01PRFVMRV9QQVJNX0RFU0MoZmJfZGVmaW8sICJFbmFibGUgZmJfZGVmaW8gbW1hcCBzdXBwb3J0Iik7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlIEdsZW5kaW5uaW5nIDxzdGV2ZS5nbGVuZGlubmluZ0BzbXNjLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU01TQyBVRlgga2VybmVsIGZyYW1lYnVmZmVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90bWlvZmIuYyBiL2RyaXZlcnMvdmlkZW8vdG1pb2ZiLmMKaW5kZXggY2QxYzRkY2UuLjhlNGE0NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdG1pb2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby90bWlvZmIuYwpAQCAtNzQ0LDcgKzc0NCw3IEBACiAJCWdvdG8gZXJyX2lvcmVtYXBfdnJhbTsKIAl9CiAKLQlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsICZ0bWlvZmJfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgJnRtaW9mYl9pcnEsIDAsCiAJCQkJCWRldl9uYW1lKCZkZXYtPmRldiksIGluZm8pOwogCiAJaWYgKHJldHZhbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCmluZGV4IGM2Yzc3NTYuLjM0Y2YwMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKKysrIGIvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYwpAQCAtOTg3LDggKzk4Nyw4IEBACiAJdW5zaWduZWQgaW50IG9mZnNldDsKIAogCWRlYnVnKCJlbnRlclxuIik7Ci0Jb2Zmc2V0ID0gKHZhci0+eG9mZnNldCArICh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCkpCi0JCSogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDMyOworCW9mZnNldCA9ICh2YXItPnhvZmZzZXQgKyAodmFyLT55b2Zmc2V0ICogaW5mby0+dmFyLnhyZXNfdmlydHVhbCkpCisJCSogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsIC8gMzI7CiAJc2V0X3NjcmVlbl9zdGFydChwYXIsIG9mZnNldCk7CiAJZGVidWcoImV4aXRcbiIpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby91ZGxmYi5jIGIvZHJpdmVycy92aWRlby91ZGxmYi5jCmluZGV4IDA4N2ZjOTkuLjM0NzNlNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdWRsZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3VkbGZiLmMKQEAgLTQ4LDIwICs0OCwzMCBAQAogCQlGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSB8IEZCSU5GT19NSVNDX0FMV0FZU19TRVRQQVI7CiAKIC8qCi0gKiBUaGVyZSBhcmUgbWFueSBEaXNwbGF5TGluay1iYXNlZCBwcm9kdWN0cywgYWxsIHdpdGggdW5pcXVlIFBJRHMuIFdlIGFyZSBhYmxlCi0gKiB0byBzdXBwb3J0IGFsbCB2b2x1bWUgb25lcyAoY2lyY2EgMjAwOSkgd2l0aCBhIHNpbmdsZSBkcml2ZXIsIHNvIHdlIG1hdGNoCi0gKiBnbG9iYWxseSBvbiBWSUQuIFRPRE86IFByb2JlKCkgbmVlZHMgdG8gZGV0ZWN0IHdoZW4gd2UgbWlnaHQgYmUgcnVubmluZwotICogImZ1dHVyZSIgY2hpcHMsIGFuZCBiYWlsIG9uIHRob3NlLCBzbyBhIGNvbXBhdGlibGUgZHJpdmVyIGNhbiBtYXRjaC4KKyAqIFRoZXJlIGFyZSBtYW55IERpc3BsYXlMaW5rLWJhc2VkIGdyYXBoaWNzIHByb2R1Y3RzLCBhbGwgd2l0aCB1bmlxdWUgUElEcy4KKyAqIFNvIHdlIG1hdGNoIG9uIERpc3BsYXlMaW5rJ3MgVklEICsgVmVuZG9yLURlZmluZWQgSW50ZXJmYWNlIENsYXNzICgweGZmKQorICogV2UgYWxzbyByZXF1aXJlIGEgbWF0Y2ggb24gU3ViQ2xhc3MgKDB4MDApIGFuZCBQcm90b2NvbCAoMHgwMCksCisgKiB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIGtub3duIFVTQiAyLjAgZXJhIGdyYXBoaWNzIGNoaXBzIGFuZCBmaXJtd2FyZSwKKyAqIGJ1dCBhbGxvd3MgRGlzcGxheUxpbmsgdG8gaW5jcmVtZW50IHRob3NlIGZvciBhbnkgZnV0dXJlIGluY29tcGF0aWJsZSBjaGlwcwogICovCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKLQl7LmlkVmVuZG9yID0gMHgxN2U5LCAubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX1ZFTkRPUix9LAorCXsuaWRWZW5kb3IgPSAweDE3ZTksCisJIC5iSW50ZXJmYWNlQ2xhc3MgPSAweGZmLAorCSAuYkludGVyZmFjZVN1YkNsYXNzID0gMHgwMCwKKwkgLmJJbnRlcmZhY2VQcm90b2NvbCA9IDB4MDAsCisJIC5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfVkVORE9SIHwKKwkJVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfQ0xBU1MgfAorCQlVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUyB8CisJCVVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX1BST1RPQ09MLAorCX0sCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKIAogLyogbW9kdWxlIG9wdGlvbnMgKi8KLXN0YXRpYyBpbnQgY29uc29sZTsgICAvKiBPcHRpb25hbGx5IGFsbG93IGZiY29uIHRvIGNvbnN1bWUgZmlyc3QgZnJhbWVidWZmZXIgKi8KLXN0YXRpYyBpbnQgZmJfZGVmaW87ICAvKiBPcHRpb25hbGx5IGVuYWJsZSBleHBlcmltZW50YWwgZmJfZGVmaW8gbW1hcCBzdXBwb3J0ICovCitzdGF0aWMgaW50IGNvbnNvbGUgPSAxOyAvKiBBbGxvdyBmYmNvbiB0byBvcGVuIGZyYW1lYnVmZmVyICovCitzdGF0aWMgaW50IGZiX2RlZmlvID0gMTsgIC8qIERldGVjdCBtbWFwIHdyaXRlcyB1c2luZyBwYWdlIGZhdWx0cyAqLworc3RhdGljIGludCBzaGFkb3cgPSAxOyAvKiBPcHRpb25hbGx5IGRpc2FibGUgc2hhZG93IGZyYW1lYnVmZmVyICovCiAKIC8qIGRsZmIga2VlcHMgYSBsaXN0IG9mIHVyYnMgZm9yIGVmZmljaWVudCBidWxrIHRyYW5zZmVycyAqLwogc3RhdGljIHZvaWQgZGxmYl91cmJfY29tcGxldGlvbihzdHJ1Y3QgdXJiICp1cmIpOwpAQCAtOTQsMTcgKzEwNCwzOSBAQAogfQogCiAvKgotICogT24vT2ZmIGZvciBkcml2aW5nIHRoZSBEaXNwbGF5TGluayBmcmFtZWJ1ZmZlciB0byB0aGUgZGlzcGxheQotICogIDB4MDAgSCBhbmQgViBzeW5jIG9uCi0gKiAgMHgwMSBIIGFuZCBWIHN5bmMgb2ZmIChzY3JlZW4gYmxhbmsgYnV0IHBvd2VyZWQpCi0gKiAgMHgwNyBEUE1TIHBvd2VyZG93biAocmVxdWlyZXMgbW9kZXNldCB0byBjb21lIGJhY2spCisgKiBNYXAgRkJfQkxBTktfKiB0byBEaXNwbGF5TGluayByZWdpc3RlcgorICogRExSZWcgRkJfQkxBTktfKgorICogLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAweDAwIEZCX0JMQU5LX1VOQkxBTksgKDApCisgKiAgMHgwMSBGQl9CTEFOSyAoMSkKKyAqICAweDAzIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQgKDIpCisgKiAgMHgwNSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EICgzKQorICogIDB4MDcgRkJfQkxBTktfUE9XRVJET1dOICg0KSBOb3RlOiByZXF1aXJlcyBtb2Rlc2V0IHRvIGNvbWUgYmFjawogICovCi1zdGF0aWMgY2hhciAqZGxmYl9lbmFibGVfaHZzeW5jKGNoYXIgKmJ1ZiwgYm9vbCBlbmFibGUpCitzdGF0aWMgY2hhciAqZGxmYl9ibGFua2luZyhjaGFyICpidWYsIGludCBmYl9ibGFuaykKIHsKLQlpZiAoZW5hYmxlKQotCQlyZXR1cm4gZGxmYl9zZXRfcmVnaXN0ZXIoYnVmLCAweDFGLCAweDAwKTsKLQllbHNlCi0JCXJldHVybiBkbGZiX3NldF9yZWdpc3RlcihidWYsIDB4MUYsIDB4MDcpOworCXU4IHJlZzsKKworCXN3aXRjaCAoZmJfYmxhbmspIHsKKwljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKKwkJcmVnID0gMHgwNzsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgorCQlyZWcgPSAweDA1OworCQlicmVhazsKKwljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CisJCXJlZyA9IDB4MDM7CisJCWJyZWFrOworCWNhc2UgRkJfQkxBTktfTk9STUFMOgorCQlyZWcgPSAweDAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZWcgPSAweDAwOworCX0KKworCWJ1ZiA9IGRsZmJfc2V0X3JlZ2lzdGVyKGJ1ZiwgMHgxRiwgcmVnKTsKKworCXJldHVybiBidWY7CiB9CiAKIHN0YXRpYyBjaGFyICpkbGZiX3NldF9jb2xvcl9kZXB0aChjaGFyICpidWYsIHU4IHNlbGVjdGlvbikKQEAgLTI3MiwxMyArMzA0LDE1IEBACiAJd3JwdHIgPSBkbGZiX3NldF9iYXNlOGJwcCh3cnB0ciwgZGV2LT5pbmZvLT5maXguc21lbV9sZW4pOwogCiAJd3JwdHIgPSBkbGZiX3NldF92aWRfY21kcyh3cnB0ciwgdmFyKTsKLQl3cnB0ciA9IGRsZmJfZW5hYmxlX2h2c3luYyh3cnB0ciwgdHJ1ZSk7CisJd3JwdHIgPSBkbGZiX2JsYW5raW5nKHdycHRyLCBGQl9CTEFOS19VTkJMQU5LKTsKIAl3cnB0ciA9IGRsZmJfdmlkcmVnX3VubG9jayh3cnB0cik7CiAKIAl3cml0ZXNpemUgPSB3cnB0ciAtIGJ1ZjsKIAogCXJldHZhbCA9IGRsZmJfc3VibWl0X3VyYihkZXYsIHVyYiwgd3JpdGVzaXplKTsKIAorCWRldi0+YmxhbmtfbW9kZSA9IEZCX0JMQU5LX1VOQkxBTks7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC03NTIsMTQgKzc4NiwxMyBAQAogewogCiAJc3RydWN0IGRsZmJfZGF0YSAqZGV2ID0gaW5mby0+cGFyOwotCXN0cnVjdCBkbG9hcmVhICphcmVhID0gTlVMTDsKIAogCWlmICghYXRvbWljX3JlYWQoJmRldi0+dXNiX2FjdGl2ZSkpCiAJCXJldHVybiAwOwogCiAJLyogVE9ETzogVXBkYXRlIFggc2VydmVyIHRvIGdldCB0aGlzIGZyb20gc3lzZnMgaW5zdGVhZCAqLwogCWlmIChjbWQgPT0gRExGQl9JT0NUTF9SRVRVUk5fRURJRCkgewotCQljaGFyICplZGlkID0gKGNoYXIgKilhcmc7CisJCXZvaWQgX191c2VyICplZGlkID0gKHZvaWQgX191c2VyICopYXJnOwogCQlpZiAoY29weV90b191c2VyKGVkaWQsIGRldi0+ZWRpZCwgZGV2LT5lZGlkX3NpemUpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAwOwpAQCAtNzY3LDYgKzgwMCwxMSBAQAogCiAJLyogVE9ETzogSGVscCBwcm9wb3NlIGEgc3RhbmRhcmQgZmIuaCBpb2N0bCB0byByZXBvcnQgbW1hcCBkYW1hZ2UgKi8KIAlpZiAoY21kID09IERMRkJfSU9DVExfUkVQT1JUX0RBTUFHRSkgeworCQlzdHJ1Y3QgZGxvYXJlYSBhcmVhOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYXJlYSwgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBkbG9hcmVhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkvKgogCQkgKiBJZiB3ZSBoYXZlIGEgZGFtYWdlLWF3YXJlIGNsaWVudCwgdHVybiBmYl9kZWZpbyAib2ZmIgpAQCAtNzc4LDIxICs4MTYsMTkgQEAKIAkJaWYgKGluZm8tPmZiZGVmaW8pCiAJCQlpbmZvLT5mYmRlZmlvLT5kZWxheSA9IERMX0RFRklPX1dSSVRFX0RJU0FCTEU7CiAKLQkJYXJlYSA9IChzdHJ1Y3QgZGxvYXJlYSAqKWFyZzsKKwkJaWYgKGFyZWEueCA8IDApCisJCQlhcmVhLnggPSAwOwogCi0JCWlmIChhcmVhLT54IDwgMCkKLQkJCWFyZWEtPnggPSAwOworCQlpZiAoYXJlYS54ID4gaW5mby0+dmFyLnhyZXMpCisJCQlhcmVhLnggPSBpbmZvLT52YXIueHJlczsKIAotCQlpZiAoYXJlYS0+eCA+IGluZm8tPnZhci54cmVzKQotCQkJYXJlYS0+eCA9IGluZm8tPnZhci54cmVzOworCQlpZiAoYXJlYS55IDwgMCkKKwkJCWFyZWEueSA9IDA7CiAKLQkJaWYgKGFyZWEtPnkgPCAwKQotCQkJYXJlYS0+eSA9IDA7CisJCWlmIChhcmVhLnkgPiBpbmZvLT52YXIueXJlcykKKwkJCWFyZWEueSA9IGluZm8tPnZhci55cmVzOwogCi0JCWlmIChhcmVhLT55ID4gaW5mby0+dmFyLnlyZXMpCi0JCQlhcmVhLT55ID0gaW5mby0+dmFyLnlyZXM7Ci0KLQkJZGxmYl9oYW5kbGVfZGFtYWdlKGRldiwgYXJlYS0+eCwgYXJlYS0+eSwgYXJlYS0+dywgYXJlYS0+aCwKKwkJZGxmYl9oYW5kbGVfZGFtYWdlKGRldiwgYXJlYS54LCBhcmVhLnksIGFyZWEudywgYXJlYS5oLAogCQkJICAgaW5mby0+c2NyZWVuX2Jhc2UpOwogCX0KIApAQCAtODQwLDcgKzg3Niw3IEBACiAJICogcHJldmVudGluZyBvdGhlciBjbGllbnRzIChYKSBmcm9tIHdvcmtpbmcgcHJvcGVybHkuIFVzdWFsbHkKIAkgKiBub3Qgd2hhdCB0aGUgdXNlciB3YW50cy4gRmFpbCBieSBkZWZhdWx0IHdpdGggb3B0aW9uIHRvIGVuYWJsZS4KIAkgKi8KLQlpZiAoKHVzZXIgPT0gMCkgJiAoIWNvbnNvbGUpKQorCWlmICgodXNlciA9PSAwKSAmJiAoIWNvbnNvbGUpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJLyogSWYgdGhlIFVTQiBkZXZpY2UgaXMgZ29uZSwgd2UgZG9uJ3QgYWNjZXB0IG5ldyBvcGVucyAqLwpAQCAtMTAzOSwzMiArMTA3NSw1NyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qIFRvIGZvbnppIHRoZSBqdWtlYm94IChlLmcuIG1ha2UgYmxhbmtpbmcgY2hhbmdlcyB0YWtlIGVmZmVjdCkgKi8KK3N0YXRpYyBjaGFyICpkbGZiX2R1bW15X3JlbmRlcihjaGFyICpidWYpCit7CisJKmJ1ZisrID0gMHhBRjsKKwkqYnVmKysgPSAweDZBOyAvKiBjb3B5ICovCisJKmJ1ZisrID0gMHgwMDsgLyogZnJvbSBhZGRyZXNzKi8KKwkqYnVmKysgPSAweDAwOworCSpidWYrKyA9IDB4MDA7CisJKmJ1ZisrID0gMHgwMTsgLyogb25lIHBpeGVsICovCisJKmJ1ZisrID0gMHgwMDsgLyogdG8gYWRkcmVzcyAqLworCSpidWYrKyA9IDB4MDA7CisJKmJ1ZisrID0gMHgwMDsKKwlyZXR1cm4gYnVmOworfQorCiAvKgogICogSW4gb3JkZXIgdG8gY29tZSBiYWNrIGZyb20gZnVsbCBEUE1TIG9mZiwgd2UgbmVlZCB0byBzZXQgdGhlIG1vZGUgYWdhaW4KICAqLwogc3RhdGljIGludCBkbGZiX29wc19ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRsZmJfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCWNoYXIgKmJ1ZnB0cjsKKwlzdHJ1Y3QgdXJiICp1cmI7CiAKLQlpZiAoYmxhbmtfbW9kZSAhPSBGQl9CTEFOS19VTkJMQU5LKSB7Ci0JCWNoYXIgKmJ1ZnB0cjsKLQkJc3RydWN0IHVyYiAqdXJiOworCXByX2luZm8oIi9kZXYvZmIlZCBGQl9CTEFOSyBtb2RlICVkIC0tPiAlZFxuIiwKKwkJaW5mby0+bm9kZSwgZGV2LT5ibGFua19tb2RlLCBibGFua19tb2RlKTsKIAotCQl1cmIgPSBkbGZiX2dldF91cmIoZGV2KTsKLQkJaWYgKCF1cmIpCi0JCQlyZXR1cm4gMDsKKwlpZiAoKGRldi0+YmxhbmtfbW9kZSA9PSBGQl9CTEFOS19QT1dFUkRPV04pICYmCisJICAgIChibGFua19tb2RlICE9IEZCX0JMQU5LX1BPV0VSRE9XTikpIHsKIAotCQlidWZwdHIgPSAoY2hhciAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQkJYnVmcHRyID0gZGxmYl92aWRyZWdfbG9jayhidWZwdHIpOwotCQlidWZwdHIgPSBkbGZiX2VuYWJsZV9odnN5bmMoYnVmcHRyLCBmYWxzZSk7Ci0JCWJ1ZnB0ciA9IGRsZmJfdmlkcmVnX3VubG9jayhidWZwdHIpOwotCi0JCWRsZmJfc3VibWl0X3VyYihkZXYsIHVyYiwgYnVmcHRyIC0KLQkJCQkoY2hhciAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JfSBlbHNlIHsKKwkJLyogcmV0dXJuaW5nIGZyb20gcG93ZXJkb3duIHJlcXVpcmVzIGEgZnJlc2ggbW9kZXNldCAqLwogCQlkbGZiX3NldF92aWRlb19tb2RlKGRldiwgJmluZm8tPnZhcik7CiAJfQogCisJdXJiID0gZGxmYl9nZXRfdXJiKGRldik7CisJaWYgKCF1cmIpCisJCXJldHVybiAwOworCisJYnVmcHRyID0gKGNoYXIgKikgdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJYnVmcHRyID0gZGxmYl92aWRyZWdfbG9jayhidWZwdHIpOworCWJ1ZnB0ciA9IGRsZmJfYmxhbmtpbmcoYnVmcHRyLCBibGFua19tb2RlKTsKKwlidWZwdHIgPSBkbGZiX3ZpZHJlZ191bmxvY2soYnVmcHRyKTsKKworCS8qIHNlZW1zIGxpa2UgYSByZW5kZXIgb3AgaXMgbmVlZGVkIHRvIGhhdmUgYmxhbmsgY2hhbmdlIHRha2UgZWZmZWN0ICovCisJYnVmcHRyID0gZGxmYl9kdW1teV9yZW5kZXIoYnVmcHRyKTsKKworCWRsZmJfc3VibWl0X3VyYihkZXYsIHVyYiwgYnVmcHRyIC0KKwkJCShjaGFyICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKworCWRldi0+YmxhbmtfbW9kZSA9IGJsYW5rX21vZGU7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5Nyw3ICsxMTU4LDcgQEAKIAlpbnQgbmV3X2xlbjsKIAl1bnNpZ25lZCBjaGFyICpvbGRfZmIgPSBpbmZvLT5zY3JlZW5fYmFzZTsKIAl1bnNpZ25lZCBjaGFyICpuZXdfZmI7Ci0JdW5zaWduZWQgY2hhciAqbmV3X2JhY2s7CisJdW5zaWduZWQgY2hhciAqbmV3X2JhY2sgPSAwOwogCiAJcHJfd2FybigiUmVhbGxvY2F0aW5nIGZyYW1lYnVmZmVyLiBBZGRyZXNzZXMgd2lsbCBjaGFuZ2UhXG4iKTsKIApAQCAtMTEyOSw3ICsxMTkwLDggQEAKIAkJICogQnV0IHdpdGggaW1wZXJmZWN0IGRhbWFnZSBpbmZvIHdlIG1heSBzZW5kIHBpeGVscyBvdmVyIFVTQgogCQkgKiB0aGF0IHdlcmUsIGluIGZhY3QsIHVuY2hhbmdlZCAtIHdhc3RpbmcgbGltaXRlZCBVU0IgYmFuZHdpZHRoCiAJCSAqLwotCQluZXdfYmFjayA9IHZ6YWxsb2MobmV3X2xlbik7CisJCWlmIChzaGFkb3cpCisJCQluZXdfYmFjayA9IHZ6YWxsb2MobmV3X2xlbik7CiAJCWlmICghbmV3X2JhY2spCiAJCQlwcl9pbmZvKCJObyBzaGFkb3cvYmFja2luZyBidWZmZXIgYWxsb2NhdGVkXG4iKTsKIAkJZWxzZSB7CkBAIC0xNDMwLDIxICsxNDkyLDMwIEBACiB9CiAKIHN0YXRpYyBpbnQgZGxmYl9wYXJzZV92ZW5kb3JfZGVzY3JpcHRvcihzdHJ1Y3QgZGxmYl9kYXRhICpkZXYsCi0JCQkJCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYpCisJCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7CiAJY2hhciAqZGVzYzsKIAljaGFyICpidWY7CiAJY2hhciAqZGVzY19lbmQ7CiAKLQl1OCB0b3RhbF9sZW4gPSAwOworCWludCB0b3RhbF9sZW4gPSAwOwogCiAJYnVmID0ga3phbGxvYyhNQVhfVkVORE9SX0RFU0NSSVBUT1JfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiBmYWxzZTsKIAlkZXNjID0gYnVmOwogCi0JdG90YWxfbGVuID0gdXNiX2dldF9kZXNjcmlwdG9yKHVzYmRldiwgMHg1ZiwgLyogdmVuZG9yIHNwZWNpZmljICovCi0JCQkJICAgIDAsIGRlc2MsIE1BWF9WRU5ET1JfREVTQ1JJUFRPUl9TSVpFKTsKKwl0b3RhbF9sZW4gPSB1c2JfZ2V0X2Rlc2NyaXB0b3IoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpLAorCQkJCQkweDVmLCAvKiB2ZW5kb3Igc3BlY2lmaWMgKi8KKwkJCQkJMCwgZGVzYywgTUFYX1ZFTkRPUl9ERVNDUklQVE9SX1NJWkUpOworCisJLyogaWYgbm90IGZvdW5kLCBsb29rIGluIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworCWlmICh0b3RhbF9sZW4gPCAwKSB7CisJCWlmICgwID09IHVzYl9nZXRfZXh0cmFfZGVzY3JpcHRvcihpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLAorCQkJMHg1ZiwgJmRlc2MpKQorCQkJdG90YWxfbGVuID0gKGludCkgZGVzY1swXTsKKwl9CisKIAlpZiAodG90YWxfbGVuID4gNSkgewogCQlwcl9pbmZvKCJ2ZW5kb3IgZGVzY3JpcHRvciBsZW5ndGg6JXggZGF0YTolMDJ4ICUwMnggJTAyeCAlMDJ4IiBcCiAJCQkiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKQEAgLTE0ODUsNiArMTU1Niw4IEBACiAJCQl9CiAJCQlkZXNjICs9IGxlbmd0aDsKIAkJfQorCX0gZWxzZSB7CisJCXByX2luZm8oInZlbmRvciBkZXNjcmlwdG9yIG5vdCBhdmFpbGFibGUgKCVkKVxuIiwgdG90YWxfbGVuKTsKIAl9CiAKIAlnb3RvIHN1Y2Nlc3M7CkBAIC0xNTMxLDEwICsxNjA0LDExIEBACiAJCXVzYmRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UsIGRldik7CiAJcHJfaW5mbygiY29uc29sZSBlbmFibGU9JWRcbiIsIGNvbnNvbGUpOwogCXByX2luZm8oImZiX2RlZmlvIGVuYWJsZT0lZFxuIiwgZmJfZGVmaW8pOworCXByX2luZm8oInNoYWRvdyBlbmFibGU9JWRcbiIsIHNoYWRvdyk7CiAKIAlkZXYtPnNrdV9waXhlbF9saW1pdCA9IDIwNDggKiAxMTUyOyAvKiBkZWZhdWx0IHRvIG1heGltdW0gKi8KIAotCWlmICghZGxmYl9wYXJzZV92ZW5kb3JfZGVzY3JpcHRvcihkZXYsIHVzYmRldikpIHsKKwlpZiAoIWRsZmJfcGFyc2VfdmVuZG9yX2Rlc2NyaXB0b3IoZGV2LCBpbnRlcmZhY2UpKSB7CiAJCXByX2VycigiZmlybXdhcmUgbm90IHJlY29nbml6ZWQuIEFzc3VtZSBpbmNvbXBhdGlibGUgZGV2aWNlXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xNTQ4LDcgKzE2MjIsNyBAQAogCS8qIFdlIGRvbid0IHJlZ2lzdGVyIGEgbmV3IFVTQiBjbGFzcy4gT3VyIGNsaWVudCBpbnRlcmZhY2UgaXMgZmJkZXYgKi8KIAogCS8qIGFsbG9jYXRlcyBmcmFtZWJ1ZmZlciBkcml2ZXIgc3RydWN0dXJlLCBub3QgZnJhbWVidWZmZXIgbWVtb3J5ICovCi0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsICZ1c2JkZXYtPmRldik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsICZpbnRlcmZhY2UtPmRldik7CiAJaWYgKCFpbmZvKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCXByX2VycigiZnJhbWVidWZmZXJfYWxsb2MgZmFpbGVkXG4iKTsKQEAgLTE4ODMsMTAgKzE5NTcsMTMgQEAKIH0KIAogbW9kdWxlX3BhcmFtKGNvbnNvbGUsIGJvb2wsIFNfSVdVU1IgfCBTX0lSVVNSIHwgU19JV0dSUCB8IFNfSVJHUlApOwotTU9EVUxFX1BBUk1fREVTQyhjb25zb2xlLCAiQWxsb3cgZmJjb24gdG8gY29uc3VtZSBmaXJzdCBmcmFtZWJ1ZmZlciBmb3VuZCIpOworTU9EVUxFX1BBUk1fREVTQyhjb25zb2xlLCAiQWxsb3cgZmJjb24gdG8gb3BlbiBmcmFtZWJ1ZmZlciIpOwogCiBtb2R1bGVfcGFyYW0oZmJfZGVmaW8sIGJvb2wsIFNfSVdVU1IgfCBTX0lSVVNSIHwgU19JV0dSUCB8IFNfSVJHUlApOwotTU9EVUxFX1BBUk1fREVTQyhmYl9kZWZpbywgIkVuYWJsZSBmYl9kZWZpbyBtbWFwIHN1cHBvcnQuICpFeHBlcmltZW50YWwqIik7CitNT0RVTEVfUEFSTV9ERVNDKGZiX2RlZmlvLCAiUGFnZSBmYXVsdCBkZXRlY3Rpb24gb2YgbW1hcCB3cml0ZXMiKTsKKworbW9kdWxlX3BhcmFtKHNoYWRvdywgYm9vbCwgU19JV1VTUiB8IFNfSVJVU1IgfCBTX0lXR1JQIHwgU19JUkdSUCk7CitNT0RVTEVfUEFSTV9ERVNDKHNoYWRvdywgIlNoYWRvdyB2aWQgbWVtLiBEaXNhYmxlIHRvIHNhdmUgbWVtIGJ1dCBsb3NlIHBlcmYiKTsKIAogTU9EVUxFX0FVVEhPUigiUm9iZXJ0byBEZSBJb3JpcyA8cm9iZXJ0b0B1bmJpdC5pdD4sICIKIAkgICAgICAiSmF5YSBLdW1hciA8amF5YWt1bWFyLmxrbWxAZ21haWwuY29tPiwgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92YWxreXJpZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZhbGt5cmllZmIuYwppbmRleCA2YjUyYmY2Li4zZjVhMDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZhbGt5cmllZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZhbGt5cmllZmIuYwpAQCAtNTU1LDcgKzU1NSw3IEBACiAKIAogLyoKLSAqIFBhcnNlIHVzZXIgc3BlZmljaWVkIG9wdGlvbnMgKGB2aWRlbz12YWxreXJpZWZiOicpCisgKiBQYXJzZSB1c2VyIHNwZWNpZmllZCBvcHRpb25zIChgdmlkZW89dmFsa3lyaWVmYjonKQogICovCiBpbnQgX19pbml0IHZhbGt5cmllZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZmYi5jCmluZGV4IGJjNjcyNTEuLmJmMmY3ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmZiLmMKKysrIGIvZHJpdmVycy92aWRlby92ZmIuYwpAQCAtMzk1LDggKzM5NSw4IEBACiAJCSAgICB8fCB2YXItPnhvZmZzZXQpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewotCQlpZiAodmFyLT54b2Zmc2V0ICsgdmFyLT54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCB8fAotCQkgICAgdmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKKwkJaWYgKHZhci0+eG9mZnNldCArIGluZm8tPnZhci54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCB8fAorCQkgICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWluZm8tPnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92Z2ExNmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwppbmRleCAzMDVjOTc1Li4wMjY3YWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJICogZ3JhbnVsYXJpdHkgaWYgc29tZW9uZSBzdXBwb3J0cyB4b2Zmc2V0IGluIGJpdCByZXNvbHV0aW9uICovCiAJdmdhX2lvX3IoVkdBX0lTMV9SQyk7CQkvKiByZXNldCBmbGlwLWZsb3AgKi8KIAl2Z2FfaW9fdyhWR0FfQVRUX0lXLCBWR0FfQVRDX1BFTCk7Ci0JaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gOCkKKwlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpCiAJCXZnYV9pb193KFZHQV9BVFRfSVcsICh4b2Zmc2V0ICYgMykgPDwgMSk7CiAJZWxzZQogCQl2Z2FfaW9fdyhWR0FfQVRUX0lXLCB4b2Zmc2V0ICYgNyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9kdmkuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5jCmluZGV4IGIxZjM2NDcuLjkxMzhlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5jCkBAIC0xNzIsMzAgKzE3MiwyMCBAQAogfQogCiAvKiBEVkkgU2V0IE1vZGUgKi8KLXZvaWQgdmlhZmJfZHZpX3NldF9tb2RlKHN0cnVjdCBWaWRlb01vZGVUYWJsZSAqbW9kZSwgaW50IG1vZGVfYnBwLAotCWludCBzZXRfaWdhKQordm9pZCB2aWFmYl9kdmlfc2V0X21vZGUoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBpZ2EpCiB7Ci0Jc3RydWN0IFZpZGVvTW9kZVRhYmxlICpyYl9tb2RlOwotCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqcER2aVRpbWluZzsKLQl1bnNpZ25lZCBsb25nIGRlc2lyZVBpeGVsQ2xvY2ssIG1heFBpeGVsQ2xvY2s7Ci0JcER2aVRpbWluZyA9IG1vZGUtPmNydGM7Ci0JZGVzaXJlUGl4ZWxDbG9jayA9IHBEdmlUaW1pbmctPnJlZnJlc2hfcmF0ZQotCQkqIHBEdmlUaW1pbmctPmNydGMuaG9yX3RvdGFsICogcER2aVRpbWluZy0+Y3J0Yy52ZXJfdG90YWwKLQkJLyAxMDAwMDAwOwotCW1heFBpeGVsQ2xvY2sgPSAodW5zaWduZWQgbG9uZyl2aWFwYXJpbmZvLT4KLQkJdG1kc19zZXR0aW5nX2luZm8tPm1heF9waXhlbF9jbG9jazsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZHZpX3ZhciA9ICp2YXI7CisJc3RydWN0IGNydF9tb2RlX3RhYmxlICpyYl9tb2RlOworCWludCBtYXhQaXhlbENsb2NrOwogCi0JREVCVUdfTVNHKEtFUk5fSU5GTyAiXG5EVklfc2V0X21vZGUhIVxuIik7Ci0KLQlpZiAoKG1heFBpeGVsQ2xvY2sgIT0gMCkgJiYgKGRlc2lyZVBpeGVsQ2xvY2sgPiBtYXhQaXhlbENsb2NrKSkgewotCQlyYl9tb2RlID0gdmlhZmJfZ2V0X3JiX21vZGUobW9kZS0+Y3J0Y1swXS5jcnRjLmhvcl9hZGRyLAotCQkJbW9kZS0+Y3J0Y1swXS5jcnRjLnZlcl9hZGRyKTsKLQkJaWYgKHJiX21vZGUpIHsKLQkJCW1vZGUgPSByYl9tb2RlOwotCQkJcER2aVRpbWluZyA9IHJiX21vZGUtPmNydGM7Ci0JCX0KKwltYXhQaXhlbENsb2NrID0gdmlhcGFyaW5mby0+c2hhcmVkLT50bWRzX3NldHRpbmdfaW5mby5tYXhfcGl4ZWxfY2xvY2s7CisJaWYgKG1heFBpeGVsQ2xvY2sgJiYgUElDT1MyS0haKHZhci0+cGl4Y2xvY2spIC8gMTAwMCA+IG1heFBpeGVsQ2xvY2spIHsKKwkJcmJfbW9kZSA9IHZpYWZiX2dldF9iZXN0X3JiX21vZGUodmFyLT54cmVzLCB2YXItPnlyZXMsIDYwKTsKKwkJaWYgKHJiX21vZGUpCisJCQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbygmZHZpX3ZhciwgcmJfbW9kZSk7CiAJfQotCXZpYWZiX2ZpbGxfY3J0Y190aW1pbmcocER2aVRpbWluZywgbW9kZSwgbW9kZV9icHAgLyA4LCBzZXRfaWdhKTsKKworCXZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoJmR2aV92YXIsIGlnYSk7CiB9CiAKIC8qIFNlbnNlIERWSSBDb25uZWN0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5oIGIvZHJpdmVycy92aWRlby92aWEvZHZpLmgKaW5kZXggZjQ3M2RkMC4uZTIxMTZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvZHZpLmgKKysrIGIvZHJpdmVycy92aWRlby92aWEvZHZpLmgKQEAgLTU5LDcgKzU5LDYgQEAKIGJvb2wgX19kZXZpbml0IHZpYWZiX3RtZHNfdHJhc21pdHRlcl9pZGVudGlmeSh2b2lkKTsKIHZvaWQgX19kZXZpbml0IHZpYWZiX2luaXRfZHZpX3NpemUoc3RydWN0IHRtZHNfY2hpcF9pbmZvcm1hdGlvbiAqdG1kc19jaGlwLAogCXN0cnVjdCB0bWRzX3NldHRpbmdfaW5mb3JtYXRpb24gKnRtZHNfc2V0dGluZyk7Ci12b2lkIHZpYWZiX2R2aV9zZXRfbW9kZShzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpZGVvTW9kZSwgaW50IG1vZGVfYnBwLAotCWludCBzZXRfaWdhKTsKK3ZvaWQgdmlhZmJfZHZpX3NldF9tb2RlKGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgaWdhKTsKIAogI2VuZGlmIC8qIF9fRFZJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9nbG9iYWwuYwppbmRleCBlMTBkODI0Li4zMTAyMTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS9nbG9iYWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9nbG9iYWwuYwpAQCAtMzUsNiArMzUsOCBAQAogaW50IHZpYWZiX0xDRDJfT047CiBpbnQgdmlhZmJfU0FNTV9PTjsKIGludCB2aWFmYl9kdWFsX2ZiOwordW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF94cmVzID0gNjQwOwordW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF95cmVzID0gNDgwOwogaW50IHZpYWZiX2hvdHBsdWdfWHJlcyA9IDY0MDsKIGludCB2aWFmYl9ob3RwbHVnX1lyZXMgPSA0ODA7CiBpbnQgdmlhZmJfaG90cGx1Z19icHAgPSAzMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2dsb2JhbC5oIGIvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmgKaW5kZXggZmY5NjlkYy4uMjc1ZGJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmgKKysrIGIvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmgKQEAgLTY3LDYgKzY3LDggQEAKIGV4dGVybiBpbnQgdmlhZmJfbGNkX21vZGU7CiAKIGV4dGVybiBpbnQgdmlhZmJfQ1JUX09OOworZXh0ZXJuIHVuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfeHJlczsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdmlhZmJfc2Vjb25kX3lyZXM7CiBleHRlcm4gaW50IHZpYWZiX2hvdHBsdWdfWHJlczsKIGV4dGVybiBpbnQgdmlhZmJfaG90cGx1Z19ZcmVzOwogZXh0ZXJuIGludCB2aWFmYl9ob3RwbHVnX2JwcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2h3LmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9ody5jCmluZGV4IDQ3YjEzNTMuLmQ1YWFjYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlhL2h3LmMKKysrIGIvZHJpdmVycy92aWRlby92aWEvaHcuYwpAQCAtMTkxLDY3ICsxOTEsNiBAQAogCXtJR0EyX0ZFVENIX0NPVU5UX1JFR19OVU0sIHt7Q1I2NSwgMCwgN30sIHtDUjY3LCAyLCAzfSB9IH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaWdhMV9jcnRjX3RpbWluZyBpZ2ExX2NydGNfcmVnID0gewotCS8qIElHQTEgSG9yaXpvbnRhbCBUb3RhbCAqLwotCXtJR0ExX0hPUl9UT1RBTF9SRUdfTlVNLCB7e0NSMDAsIDAsIDd9LCB7Q1IzNiwgMywgM30gfSB9LAotCS8qIElHQTEgSG9yaXpvbnRhbCBBZGRyZXNzYWJsZSBWaWRlbyAqLwotCXtJR0ExX0hPUl9BRERSX1JFR19OVU0sIHt7Q1IwMSwgMCwgN30gfSB9LAotCS8qIElHQTEgSG9yaXpvbnRhbCBCbGFuayBTdGFydCAqLwotCXtJR0ExX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNLCB7e0NSMDIsIDAsIDd9IH0gfSwKLQkvKiBJR0ExIEhvcml6b250YWwgQmxhbmsgRW5kICovCi0Je0lHQTFfSE9SX0JMQU5LX0VORF9SRUdfTlVNLAotCSB7e0NSMDMsIDAsIDR9LCB7Q1IwNSwgNywgN30sIHtDUjMzLCA1LCA1fSB9IH0sCi0JLyogSUdBMSBIb3Jpem9udGFsIFN5bmMgU3RhcnQgKi8KLQl7SUdBMV9IT1JfU1lOQ19TVEFSVF9SRUdfTlVNLCB7e0NSMDQsIDAsIDd9LCB7Q1IzMywgNCwgNH0gfSB9LAotCS8qIElHQTEgSG9yaXpvbnRhbCBTeW5jIEVuZCAqLwotCXtJR0ExX0hPUl9TWU5DX0VORF9SRUdfTlVNLCB7e0NSMDUsIDAsIDR9IH0gfSwKLQkvKiBJR0ExIFZlcnRpY2FsIFRvdGFsICovCi0Je0lHQTFfVkVSX1RPVEFMX1JFR19OVU0sCi0JIHt7Q1IwNiwgMCwgN30sIHtDUjA3LCAwLCAwfSwge0NSMDcsIDUsIDV9LCB7Q1IzNSwgMCwgMH0gfSB9LAotCS8qIElHQTEgVmVydGljYWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KLQl7SUdBMV9WRVJfQUREUl9SRUdfTlVNLAotCSB7e0NSMTIsIDAsIDd9LCB7Q1IwNywgMSwgMX0sIHtDUjA3LCA2LCA2fSwge0NSMzUsIDIsIDJ9IH0gfSwKLQkvKiBJR0ExIFZlcnRpY2FsIEJsYW5rIFN0YXJ0ICovCi0Je0lHQTFfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU0sCi0JIHt7Q1IxNSwgMCwgN30sIHtDUjA3LCAzLCAzfSwge0NSMDksIDUsIDV9LCB7Q1IzNSwgMywgM30gfSB9LAotCS8qIElHQTEgVmVydGljYWwgQmxhbmsgRW5kICovCi0Je0lHQTFfVkVSX0JMQU5LX0VORF9SRUdfTlVNLCB7e0NSMTYsIDAsIDd9IH0gfSwKLQkvKiBJR0ExIFZlcnRpY2FsIFN5bmMgU3RhcnQgKi8KLQl7SUdBMV9WRVJfU1lOQ19TVEFSVF9SRUdfTlVNLAotCSB7e0NSMTAsIDAsIDd9LCB7Q1IwNywgMiwgMn0sIHtDUjA3LCA3LCA3fSwge0NSMzUsIDEsIDF9IH0gfSwKLQkvKiBJR0ExIFZlcnRpY2FsIFN5bmMgRW5kICovCi0Je0lHQTFfVkVSX1NZTkNfRU5EX1JFR19OVU0sIHt7Q1IxMSwgMCwgM30gfSB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGlnYTJfY3J0Y190aW1pbmcgaWdhMl9jcnRjX3JlZyA9IHsKLQkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgKi8KLQl7SUdBMl9IT1JfVE9UQUxfUkVHX05VTSwge3tDUjUwLCAwLCA3fSwge0NSNTUsIDAsIDN9IH0gfSwKLQkvKiBJR0EyIEhvcml6b250YWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KLQl7SUdBMl9IT1JfQUREUl9SRUdfTlVNLCB7e0NSNTEsIDAsIDd9LCB7Q1I1NSwgNCwgNn0gfSB9LAotCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBTdGFydCAqLwotCXtJR0EyX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNLCB7e0NSNTIsIDAsIDd9LCB7Q1I1NCwgMCwgMn0gfSB9LAotCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KLQl7SUdBMl9IT1JfQkxBTktfRU5EX1JFR19OVU0sCi0JIHt7Q1I1MywgMCwgN30sIHtDUjU0LCAzLCA1fSwge0NSNUQsIDYsIDZ9IH0gfSwKLQkvKiBJR0EyIEhvcml6b250YWwgU3luYyBTdGFydCAqLwotCXtJR0EyX0hPUl9TWU5DX1NUQVJUX1JFR19OVU0sCi0JIHt7Q1I1NiwgMCwgN30sIHtDUjU0LCA2LCA3fSwge0NSNUMsIDcsIDd9LCB7Q1I1RCwgNywgN30gfSB9LAotCS8qIElHQTIgSG9yaXpvbnRhbCBTeW5jIEVuZCAqLwotCXtJR0EyX0hPUl9TWU5DX0VORF9SRUdfTlVNLCB7e0NSNTcsIDAsIDd9LCB7Q1I1QywgNiwgNn0gfSB9LAotCS8qIElHQTIgVmVydGljYWwgVG90YWwgKi8KLQl7SUdBMl9WRVJfVE9UQUxfUkVHX05VTSwge3tDUjU4LCAwLCA3fSwge0NSNUQsIDAsIDJ9IH0gfSwKLQkvKiBJR0EyIFZlcnRpY2FsIEFkZHJlc3NhYmxlIFZpZGVvICovCi0Je0lHQTJfVkVSX0FERFJfUkVHX05VTSwge3tDUjU5LCAwLCA3fSwge0NSNUQsIDMsIDV9IH0gfSwKLQkvKiBJR0EyIFZlcnRpY2FsIEJsYW5rIFN0YXJ0ICovCi0Je0lHQTJfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU0sIHt7Q1I1QSwgMCwgN30sIHtDUjVDLCAwLCAyfSB9IH0sCi0JLyogSUdBMiBWZXJ0aWNhbCBCbGFuayBFbmQgKi8KLQl7SUdBMl9WRVJfQkxBTktfRU5EX1JFR19OVU0sIHt7Q1I1QiwgMCwgN30sIHtDUjVDLCAzLCA1fSB9IH0sCi0JLyogSUdBMiBWZXJ0aWNhbCBTeW5jIFN0YXJ0ICovCi0Je0lHQTJfVkVSX1NZTkNfU1RBUlRfUkVHX05VTSwge3tDUjVFLCAwLCA3fSwge0NSNUYsIDUsIDd9IH0gfSwKLQkvKiBJR0EyIFZlcnRpY2FsIFN5bmMgRW5kICovCi0Je0lHQTJfVkVSX1NZTkNfRU5EX1JFR19OVU0sIHt7Q1I1RiwgMCwgNH0gfSB9Ci19OwotCiBzdGF0aWMgc3RydWN0IHJnYkxVVCBwYWxMVVRfdGFibGVbXSA9IHsKIAkvKiB7UixHLEJ9ICovCiAJLyogSW5kZXggMHgwMH4weDAzICovCkBAIC0xNTI4LDMwMiArMTQ2Nyw0MCBAQAogCXZpYV93cml0ZV9taXNjX3JlZ19tYXNrKDB4MEMsIDB4MEMpOyAvKiBzZWxlY3QgZXh0ZXJuYWwgY2xvY2sgKi8KIH0KIAotdm9pZCB2aWFmYl9sb2FkX2NydGNfdGltaW5nKHN0cnVjdCBkaXNwbGF5X3RpbWluZyBkZXZpY2VfdGltaW5nLAotCWludCBzZXRfaWdhKQorc3RhdGljIHN0cnVjdCBkaXNwbGF5X3RpbWluZyB2YXJfdG9fdGltaW5nKGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewotCWludCBpOwotCWludCB2aWFmYl9sb2FkX3JlZ19udW0gPSAwOwotCWludCByZWdfdmFsdWUgPSAwOwotCXN0cnVjdCBpb19yZWdpc3RlciAqcmVnID0gTlVMTDsKKwlzdHJ1Y3QgZGlzcGxheV90aW1pbmcgdGltaW5nOwogCi0JdmlhZmJfdW5sb2NrX2NydCgpOwotCi0JZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKLQkJaWYgKHNldF9pZ2EgPT0gSUdBMSkgewotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIEhfVE9UQUxfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9IT1JfVE9UQUxfRk9STVVMQShkZXZpY2VfdGltaW5nLgotCQkJCQkJCSAgIGhvcl90b3RhbCk7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkJaWdhMV9jcnRjX3JlZy5ob3JfdG90YWwucmVnX251bTsKLQkJCQlyZWcgPSBpZ2ExX2NydGNfcmVnLmhvcl90b3RhbC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfQUREUl9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0ExX0hPUl9BRERSX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KLQkJCQkJCQkgIGhvcl9hZGRyKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCQlpZ2ExX2NydGNfcmVnLmhvcl9hZGRyLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy5ob3JfYWRkci5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfQkxBTktfU1RBUlRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9IT1JfQkxBTktfU1RBUlRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX2JsYW5rX3N0YXJ0LnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy5ob3JfYmxhbmtfc3RhcnQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBIX0JMQU5LX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0ExX0hPUl9CTEFOS19FTkRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQsCi0JCQkJICAgICBkZXZpY2VfdGltaW5nLmhvcl9ibGFua19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfU1lOQ19TVEFSVF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0ExX0hPUl9TWU5DX1NUQVJUX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcuaG9yX3N5bmNfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX3N5bmNfc3RhcnQucmVnX251bTsKLQkJCQlyZWcgPSBpZ2ExX2NydGNfcmVnLmhvcl9zeW5jX3N0YXJ0LnJlZzsKLQkJCQlicmVhazsKLQkJCWNhc2UgSF9TWU5DX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0ExX0hPUl9TWU5DX0VORF9GT1JNVUxBCi0JCQkJICAgIChkZXZpY2VfdGltaW5nLmhvcl9zeW5jX3N0YXJ0LAotCQkJCSAgICAgZGV2aWNlX3RpbWluZy5ob3Jfc3luY19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX3N5bmNfZW5kLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy5ob3Jfc3luY19lbmQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX1RPVEFMX0lOREVYOgotCQkJCXJlZ192YWx1ZSA9Ci0JCQkJICAgIElHQTFfVkVSX1RPVEFMX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KLQkJCQkJCQkgICB2ZXJfdG90YWwpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJCWlnYTFfY3J0Y19yZWcudmVyX3RvdGFsLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy52ZXJfdG90YWwucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX0FERFJfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9WRVJfQUREUl9GT1JNVUxBKGRldmljZV90aW1pbmcuCi0JCQkJCQkJICB2ZXJfYWRkcik7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkJaWdhMV9jcnRjX3JlZy52ZXJfYWRkci5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcudmVyX2FkZHIucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX0JMQU5LX1NUQVJUX0lOREVYOgotCQkJCXJlZ192YWx1ZSA9Ci0JCQkJICAgIElHQTFfVkVSX0JMQU5LX1NUQVJUX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcudmVyX2JsYW5rX3N0YXJ0KTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9ibGFua19zdGFydC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcudmVyX2JsYW5rX3N0YXJ0LnJlZzsKLQkJCQlicmVhazsKLQkJCWNhc2UgVl9CTEFOS19FTkRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9WRVJfQkxBTktfRU5EX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcudmVyX2JsYW5rX3N0YXJ0LAotCQkJCSAgICAgZGV2aWNlX3RpbWluZy52ZXJfYmxhbmtfZW5kKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9ibGFua19lbmQucmVnX251bTsKLQkJCQlyZWcgPSBpZ2ExX2NydGNfcmVnLnZlcl9ibGFua19lbmQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX1NZTkNfU1RBUlRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9WRVJfU1lOQ19TVEFSVF9GT1JNVUxBCi0JCQkJICAgIChkZXZpY2VfdGltaW5nLnZlcl9zeW5jX3N0YXJ0KTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9zeW5jX3N0YXJ0LnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy52ZXJfc3luY19zdGFydC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfU1lOQ19FTkRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9WRVJfU1lOQ19FTkRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy52ZXJfc3luY19zdGFydCwKLQkJCQkgICAgIGRldmljZV90aW1pbmcudmVyX3N5bmNfZW5kKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9zeW5jX2VuZC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcudmVyX3N5bmNfZW5kLnJlZzsKLQkJCQlicmVhazsKLQotCQkJfQotCQl9Ci0KLQkJaWYgKHNldF9pZ2EgPT0gSUdBMikgewotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIEhfVE9UQUxfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMl9IT1JfVE9UQUxfRk9STVVMQShkZXZpY2VfdGltaW5nLgotCQkJCQkJCSAgIGhvcl90b3RhbCk7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkJaWdhMl9jcnRjX3JlZy5ob3JfdG90YWwucmVnX251bTsKLQkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLmhvcl90b3RhbC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfQUREUl9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX0hPUl9BRERSX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KLQkJCQkJCQkgIGhvcl9hZGRyKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCQlpZ2EyX2NydGNfcmVnLmhvcl9hZGRyLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy5ob3JfYWRkci5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfQkxBTktfU1RBUlRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMl9IT1JfQkxBTktfU1RBUlRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcuaG9yX2JsYW5rX3N0YXJ0LnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy5ob3JfYmxhbmtfc3RhcnQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBIX0JMQU5LX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX0hPUl9CTEFOS19FTkRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQsCi0JCQkJICAgICBkZXZpY2VfdGltaW5nLmhvcl9ibGFua19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTJfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfU1lOQ19TVEFSVF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX0hPUl9TWU5DX1NUQVJUX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcuaG9yX3N5bmNfc3RhcnQpOwotCQkJCWlmIChVTklDSFJPTUVfQ043MDAgPD0KLQkJCQkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lKQotCQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCQkgICAgaWdhMl9jcnRjX3JlZy5ob3Jfc3luY19zdGFydC4KLQkJCQkJICAgIHJlZ19udW07Ci0JCQkJZWxzZQotCQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPSAzOwotCQkJCXJlZyA9IGlnYTJfY3J0Y19yZWcuaG9yX3N5bmNfc3RhcnQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBIX1NZTkNfRU5EX0lOREVYOgotCQkJCXJlZ192YWx1ZSA9Ci0JCQkJICAgIElHQTJfSE9SX1NZTkNfRU5EX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcuaG9yX3N5bmNfc3RhcnQsCi0JCQkJICAgICBkZXZpY2VfdGltaW5nLmhvcl9zeW5jX2VuZCk7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkgICAgaWdhMl9jcnRjX3JlZy5ob3Jfc3luY19lbmQucmVnX251bTsKLQkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLmhvcl9zeW5jX2VuZC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfVE9UQUxfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMl9WRVJfVE9UQUxfRk9STVVMQShkZXZpY2VfdGltaW5nLgotCQkJCQkJCSAgIHZlcl90b3RhbCk7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkJaWdhMl9jcnRjX3JlZy52ZXJfdG90YWwucmVnX251bTsKLQkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLnZlcl90b3RhbC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfQUREUl9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX1ZFUl9BRERSX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KLQkJCQkJCQkgIHZlcl9hZGRyKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCQlpZ2EyX2NydGNfcmVnLnZlcl9hZGRyLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy52ZXJfYWRkci5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfQkxBTktfU1RBUlRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMl9WRVJfQkxBTktfU1RBUlRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy52ZXJfYmxhbmtfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX2JsYW5rX3N0YXJ0LnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy52ZXJfYmxhbmtfc3RhcnQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX0JMQU5LX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX1ZFUl9CTEFOS19FTkRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy52ZXJfYmxhbmtfc3RhcnQsCi0JCQkJICAgICBkZXZpY2VfdGltaW5nLnZlcl9ibGFua19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX2JsYW5rX2VuZC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTJfY3J0Y19yZWcudmVyX2JsYW5rX2VuZC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfU1lOQ19TVEFSVF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX1ZFUl9TWU5DX1NUQVJUX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcudmVyX3N5bmNfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX3N5bmNfc3RhcnQucmVnX251bTsKLQkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLnZlcl9zeW5jX3N0YXJ0LnJlZzsKLQkJCQlicmVhazsKLQkJCWNhc2UgVl9TWU5DX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX1ZFUl9TWU5DX0VORF9GT1JNVUxBCi0JCQkJICAgIChkZXZpY2VfdGltaW5nLnZlcl9zeW5jX3N0YXJ0LAotCQkJCSAgICAgZGV2aWNlX3RpbWluZy52ZXJfc3luY19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX3N5bmNfZW5kLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy52ZXJfc3luY19lbmQucmVnOwotCQkJCWJyZWFrOwotCi0JCQl9Ci0JCX0KLQkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLCB2aWFmYl9sb2FkX3JlZ19udW0sIHJlZywgVklBQ1IpOwotCX0KLQotCXZpYWZiX2xvY2tfY3J0KCk7CisJdGltaW5nLmhvcl9hZGRyID0gdmFyLT54cmVzOworCXRpbWluZy5ob3Jfc3luY19zdGFydCA9IHRpbWluZy5ob3JfYWRkciArIHZhci0+cmlnaHRfbWFyZ2luOworCXRpbWluZy5ob3Jfc3luY19lbmQgPSB0aW1pbmcuaG9yX3N5bmNfc3RhcnQgKyB2YXItPmhzeW5jX2xlbjsKKwl0aW1pbmcuaG9yX3RvdGFsID0gdGltaW5nLmhvcl9zeW5jX2VuZCArIHZhci0+bGVmdF9tYXJnaW47CisJdGltaW5nLmhvcl9ibGFua19zdGFydCA9IHRpbWluZy5ob3JfYWRkcjsKKwl0aW1pbmcuaG9yX2JsYW5rX2VuZCA9IHRpbWluZy5ob3JfdG90YWw7CisJdGltaW5nLnZlcl9hZGRyID0gdmFyLT55cmVzOworCXRpbWluZy52ZXJfc3luY19zdGFydCA9IHRpbWluZy52ZXJfYWRkciArIHZhci0+bG93ZXJfbWFyZ2luOworCXRpbWluZy52ZXJfc3luY19lbmQgPSB0aW1pbmcudmVyX3N5bmNfc3RhcnQgKyB2YXItPnZzeW5jX2xlbjsKKwl0aW1pbmcudmVyX3RvdGFsID0gdGltaW5nLnZlcl9zeW5jX2VuZCArIHZhci0+dXBwZXJfbWFyZ2luOworCXRpbWluZy52ZXJfYmxhbmtfc3RhcnQgPSB0aW1pbmcudmVyX2FkZHI7CisJdGltaW5nLnZlcl9ibGFua19lbmQgPSB0aW1pbmcudmVyX3RvdGFsOworCXJldHVybiB0aW1pbmc7CiB9CiAKLXZvaWQgdmlhZmJfZmlsbF9jcnRjX3RpbWluZyhzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmNydF90YWJsZSwKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpZGVvX21vZGUsIGludCBicHBfYnl0ZSwgaW50IHNldF9pZ2EpCit2b2lkIHZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBpZ2EpCiB7Ci0Jc3RydWN0IGRpc3BsYXlfdGltaW5nIGNydF9yZWc7Ci0JaW50IGk7Ci0JaW50IGluZGV4ID0gMDsKLQlpbnQgaF9hZGRyLCB2X2FkZHI7Ci0JdTMyIGNsb2NrLCByZWZyZXNoID0gdmlhZmJfcmVmcmVzaDsKKwlzdHJ1Y3QgZGlzcGxheV90aW1pbmcgY3J0X3JlZyA9IHZhcl90b190aW1pbmcodmFyKTsKIAotCWlmICh2aWFmYl9TQU1NX09OICYmIHNldF9pZ2EgPT0gSUdBMikKLQkJcmVmcmVzaCA9IHZpYWZiX3JlZnJlc2gxOworCWlmIChpZ2EgPT0gSUdBMSkKKwkJdmlhX3NldF9wcmltYXJ5X3RpbWluZygmY3J0X3JlZyk7CisJZWxzZSBpZiAoaWdhID09IElHQTIpCisJCXZpYV9zZXRfc2Vjb25kYXJ5X3RpbWluZygmY3J0X3JlZyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdmlkZW9fbW9kZS0+bW9kZV9hcnJheTsgaSsrKSB7Ci0JCWluZGV4ID0gaTsKKwl2aWFmYl9sb2FkX2ZldGNoX2NvdW50X3JlZyh2YXItPnhyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4LCBpZ2EpOworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgIT0gVU5JQ0hST01FX0NMRTI2NgorCQkmJiB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgIT0gVU5JQ0hST01FX0s0MDApCisJCXZpYWZiX2xvYWRfRklGT19yZWcoaWdhLCB2YXItPnhyZXMsIHZhci0+eXJlcyk7CiAKLQkJaWYgKGNydF90YWJsZVtpXS5yZWZyZXNoX3JhdGUgPT0gcmVmcmVzaCkKLQkJCWJyZWFrOwotCX0KLQotCWNydF9yZWcgPSBjcnRfdGFibGVbaW5kZXhdLmNydGM7Ci0KLQkvKiBNb2RlIDY0MHg0ODAgaGFzIGJvcmRlciwgYnV0IExDRC9ERlAgZGlkbid0IGhhdmUgYm9yZGVyLiAqLwotCS8qIFNvIHdlIHdvdWxkIGRlbGV0ZSBib3JkZXIuICovCi0JaWYgKCh2aWFmYl9MQ0RfT04gfCB2aWFmYl9EVklfT04pCi0JICAgICYmIHZpZGVvX21vZGUtPmNydGNbMF0uY3J0Yy5ob3JfYWRkciA9PSA2NDAKLQkgICAgJiYgdmlkZW9fbW9kZS0+Y3J0Y1swXS5jcnRjLnZlcl9hZGRyID09IDQ4MAotCSAgICAmJiByZWZyZXNoID09IDYwKSB7Ci0JCS8qIFRoZSBib3JkZXIgaXMgOCBwaXhlbHMuICovCi0JCWNydF9yZWcuaG9yX2JsYW5rX3N0YXJ0ID0gY3J0X3JlZy5ob3JfYmxhbmtfc3RhcnQgLSA4OwotCi0JCS8qIEJsYW5raW5nIHRpbWUgc2hvdWxkIGFkZCBsZWZ0IGFuZCByaWdodCBib3JkZXJzLiAqLwotCQljcnRfcmVnLmhvcl9ibGFua19lbmQgPSBjcnRfcmVnLmhvcl9ibGFua19lbmQgKyAxNjsKLQl9Ci0KLQloX2FkZHIgPSBjcnRfcmVnLmhvcl9hZGRyOwotCXZfYWRkciA9IGNydF9yZWcudmVyX2FkZHI7Ci0JaWYgKHNldF9pZ2EgPT0gSUdBMSkgewotCQl2aWFmYl91bmxvY2tfY3J0KCk7Ci0JCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSMTcsIFZJQUNSLCAweDAwLCBCSVQ3KTsKLQl9Ci0KLQlzd2l0Y2ggKHNldF9pZ2EpIHsKLQljYXNlIElHQTE6Ci0JCXZpYWZiX2xvYWRfY3J0Y190aW1pbmcoY3J0X3JlZywgSUdBMSk7Ci0JCWJyZWFrOwotCWNhc2UgSUdBMjoKLQkJdmlhZmJfbG9hZF9jcnRjX3RpbWluZyhjcnRfcmVnLCBJR0EyKTsKLQkJYnJlYWs7Ci0JfQotCi0JdmlhZmJfbG9ja19jcnQoKTsKLQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjE3LCBWSUFDUiwgMHg4MCwgQklUNyk7Ci0JdmlhZmJfbG9hZF9mZXRjaF9jb3VudF9yZWcoaF9hZGRyLCBicHBfYnl0ZSwgc2V0X2lnYSk7Ci0KLQkvKiBsb2FkIEZJRk8gKi8KLQlpZiAoKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSAhPSBVTklDSFJPTUVfQ0xFMjY2KQotCSAgICAmJiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lICE9IFVOSUNIUk9NRV9LNDAwKSkKLQkJdmlhZmJfbG9hZF9GSUZPX3JlZyhzZXRfaWdhLCBoX2FkZHIsIHZfYWRkcik7Ci0KLQljbG9jayA9IGNydF9yZWcuaG9yX3RvdGFsICogY3J0X3JlZy52ZXJfdG90YWwKLQkJKiBjcnRfdGFibGVbaW5kZXhdLnJlZnJlc2hfcmF0ZTsKLQl2aWFmYl9zZXRfdmNsb2NrKGNsb2NrLCBzZXRfaWdhKTsKLQorCXZpYWZiX3NldF92Y2xvY2soUElDT1MyS0haKHZhci0+cGl4Y2xvY2spICogMTAwMCwgaWdhKTsKIH0KIAogdm9pZCBfX2RldmluaXQgdmlhZmJfaW5pdF9jaGlwX2luZm8oaW50IGNoaXBfdHlwZSkKQEAgLTIwOTIsMjMgKzE3NjksOSBAQAogCXJldHVybiBwb2xhcml0eTsKIH0KIAotaW50IHZpYWZiX3NldG1vZGUoc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bW9kZV90YmwsIGludCB2aWRlb19icHAsCi0Jc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bW9kZV90YmwxLCBpbnQgdmlkZW9fYnBwMSkKK3N0YXRpYyB2b2lkIGh3X2luaXQodm9pZCkKIHsKLQlpbnQgaSwgajsKLQlpbnQgcG9ydDsKLQl1MzIgZGV2aWNlcyA9IHZpYXBhcmluZm8tPnNoYXJlZC0+aWdhMV9kZXZpY2VzCi0JCXwgdmlhcGFyaW5mby0+c2hhcmVkLT5pZ2EyX2RldmljZXM7Ci0JdTggdmFsdWUsIGluZGV4LCBtYXNrOwotCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqY3J0X3RpbWluZzsKLQlzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmNydF90aW1pbmcxID0gTlVMTDsKLQotCWRldmljZV9zY3JlZW5fb2ZmKCk7Ci0JY3J0X3RpbWluZyA9IHZtb2RlX3RibC0+Y3J0YzsKLQotCWlmICh2aWFmYl9TQU1NX09OID09IDEpIHsKLQkJY3J0X3RpbWluZzEgPSB2bW9kZV90YmwxLT5jcnRjOwotCX0KKwlpbnQgaTsKIAogCWluYihWSUFTdGF0dXMpOwogCW91dGIoMHgwMCwgVklBQVIpOwpAQCAtMjE0Nyw5ICsxODEwLDggQEAKIAkJYnJlYWs7CiAJfQogCisJLyogcHJvYmFibHkgdGhpcyBzaG91bGQgZ28gdG8gdGhlIHNjYWxpbmcgY29kZSBvbmUgZGF5ICovCiAJdmlhZmJfd3JpdGVfcmVneChzY2FsaW5nX3BhcmFtZXRlcnMsIEFSUkFZX1NJWkUoc2NhbGluZ19wYXJhbWV0ZXJzKSk7Ci0JZGV2aWNlX29mZigpOwotCXZpYV9zZXRfc3RhdGUoZGV2aWNlcywgVklBX1NUQVRFX09GRik7CiAKIAkvKiBGaWxsIFZQSVQgUGFyYW1ldGVycyAqLwogCS8qIFdyaXRlIE1pc2MgUmVnaXN0ZXIgKi8KQEAgLTIxNzUsMTIgKzE4MzcsMjkgQEAKIAlpbmIoVklBU3RhdHVzKTsKIAlvdXRiKDB4MjAsIFZJQUFSKTsKIAorCWxvYWRfZml4X2JpdF9jcnRjX3JlZygpOworfQorCitpbnQgdmlhZmJfc2V0bW9kZShpbnQgdmlkZW9fYnBwLCBpbnQgdmlkZW9fYnBwMSkKK3sKKwlpbnQgajsKKwlpbnQgcG9ydDsKKwl1MzIgZGV2aWNlcyA9IHZpYXBhcmluZm8tPnNoYXJlZC0+aWdhMV9kZXZpY2VzCisJCXwgdmlhcGFyaW5mby0+c2hhcmVkLT5pZ2EyX2RldmljZXM7CisJdTggdmFsdWUsIGluZGV4LCBtYXNrOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXIyOworCisJZGV2aWNlX3NjcmVlbl9vZmYoKTsKKwlkZXZpY2Vfb2ZmKCk7CisJdmlhX3NldF9zdGF0ZShkZXZpY2VzLCBWSUFfU1RBVEVfT0ZGKTsKKworCWh3X2luaXQoKTsKKwogCS8qIFVwZGF0ZSBQYXRjaCBSZWdpc3RlciAqLwogCiAJaWYgKCh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NMRTI2NgotCSAgICB8fCB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0s0MDApCi0JICAgICYmIHZtb2RlX3RibC0+Y3J0Y1swXS5jcnRjLmhvcl9hZGRyID09IDEwMjQKLQkgICAgJiYgdm1vZGVfdGJsLT5jcnRjWzBdLmNydGMudmVyX2FkZHIgPT0gNzY4KSB7CisJCXx8IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfSzQwMCkKKwkJJiYgdmlhZmJpbmZvLT52YXIueHJlcyA9PSAxMDI0ICYmIHZpYWZiaW5mby0+dmFyLnlyZXMgPT0gNzY4KSB7CiAJCWZvciAoaiA9IDA7IGogPCByZXNfcGF0Y2hfdGFibGVbMF0udGFibGVfbGVuZ3RoOyBqKyspIHsKIAkJCWluZGV4ID0gcmVzX3BhdGNoX3RhYmxlWzBdLmlvX3JlZ190YWJsZVtqXS5pbmRleDsKIAkJCXBvcnQgPSByZXNfcGF0Y2hfdGFibGVbMF0uaW9fcmVnX3RhYmxlW2pdLnBvcnQ7CkBAIC0yMTkwLDcgKzE4NjksNiBAQAogCQl9CiAJfQogCi0JbG9hZF9maXhfYml0X2NydGNfcmVnKCk7CiAJdmlhX3NldF9wcmltYXJ5X3BpdGNoKHZpYWZiaW5mby0+Zml4LmxpbmVfbGVuZ3RoKTsKIAl2aWFfc2V0X3NlY29uZGFyeV9waXRjaCh2aWFmYl9kdWFsX2ZiID8gdmlhZmJpbmZvMS0+Zml4LmxpbmVfbGVuZ3RoCiAJCTogdmlhZmJpbmZvLT5maXgubGluZV9sZW5ndGgpOwpAQCAtMjIwOCwyMyArMTg4NiwyOCBAQAogCiAJLyogQ2xlYXIgT24gU2NyZWVuICovCiAKKwlpZiAodmlhZmJfZHVhbF9mYikgeworCQl2YXIyID0gdmlhZmJpbmZvMS0+dmFyOworCX0gZWxzZSBpZiAodmlhZmJfU0FNTV9PTikgeworCQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbygmdmFyMiwgdmlhZmJfZ2V0X2Jlc3RfbW9kZSgKKwkJCXZpYWZiX3NlY29uZF94cmVzLCB2aWFmYl9zZWNvbmRfeXJlcywgdmlhZmJfcmVmcmVzaDEpKTsKKwkJdmFyMi5iaXRzX3Blcl9waXhlbCA9IHZpYWZiaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCX0KKwogCS8qIENSVCBzZXQgbW9kZSAqLwogCWlmICh2aWFmYl9DUlRfT04pIHsKLQkJaWYgKHZpYWZiX1NBTU1fT04gJiYKLQkJCXZpYXBhcmluZm8tPnNoYXJlZC0+aWdhMl9kZXZpY2VzICYgVklBX0NSVCkgewotCQkJdmlhZmJfZmlsbF9jcnRjX3RpbWluZyhjcnRfdGltaW5nMSwgdm1vZGVfdGJsMSwKLQkJCQl2aWRlb19icHAxIC8gOCwgSUdBMik7Ci0JCX0gZWxzZSB7Ci0JCQl2aWFmYl9maWxsX2NydGNfdGltaW5nKGNydF90aW1pbmcsIHZtb2RlX3RibCwKLQkJCQl2aWRlb19icHAgLyA4LAorCQlpZiAodmlhcGFyaW5mby0+c2hhcmVkLT5pZ2EyX2RldmljZXMgJiBWSUFfQ1JUCisJCQkmJiB2aWFmYl9TQU1NX09OKQorCQkJdmlhZmJfZmlsbF9jcnRjX3RpbWluZygmdmFyMiwgSUdBMik7CisJCWVsc2UKKwkJCXZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoJnZpYWZiaW5mby0+dmFyLAogCQkJCSh2aWFwYXJpbmZvLT5zaGFyZWQtPmlnYTFfZGV2aWNlcyAmIFZJQV9DUlQpCiAJCQkJPyBJR0ExIDogSUdBMik7Ci0JCX0KIAogCQkvKiBQYXRjaCBpZiBzZXRfaHJlcyBpcyBub3QgOCBhbGlnbm1lbnQgKDEzNjYpIHRvIHZpYWZiX3NldG1vZGUKIAkJdG8gOCBhbGlnbm1lbnQgKDEzNjgpLHRoZXJlIGlzIHNldmVyYWwgcGl4ZWxzICgyIHBpeGVscykKIAkJb24gcmlnaHQgc2lkZSBvZiBzY3JlZW4uICovCi0JCWlmICh2bW9kZV90YmwtPmNydGNbMF0uY3J0Yy5ob3JfYWRkciAlIDgpIHsKKwkJaWYgKHZpYWZiaW5mby0+dmFyLnhyZXMgJSA4KSB7CiAJCQl2aWFmYl91bmxvY2tfY3J0KCk7CiAJCQl2aWFmYl93cml0ZV9yZWcoQ1IwMiwgVklBQ1IsCiAJCQkJdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSMDIpIC0gMSk7CkBAIC0yMjMzLDMxICsxOTE2LDIwIEBACiAJfQogCiAJaWYgKHZpYWZiX0RWSV9PTikgewotCQlpZiAodmlhZmJfU0FNTV9PTiAmJgotCQkJKHZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0EyKSkgewotCQkJdmlhZmJfZHZpX3NldF9tb2RlKHZpYWZiX2dldF9tb2RlCi0JCQkJICAgICAodmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmhfYWN0aXZlLAotCQkJCSAgICAgIHZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT4KLQkJCQkgICAgICB2X2FjdGl2ZSksCi0JCQkJICAgICB2aWRlb19icHAxLCB2aWFwYXJpbmZvLT4KLQkJCQkgICAgIHRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQl2aWFmYl9kdmlfc2V0X21vZGUodmlhZmJfZ2V0X21vZGUKLQkJCQkgICAgICh2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+aF9hY3RpdmUsCi0JCQkJICAgICAgdmlhcGFyaW5mby0+Ci0JCQkJICAgICAgdG1kc19zZXR0aW5nX2luZm8tPnZfYWN0aXZlKSwKLQkJCQkgICAgIHZpZGVvX2JwcCwgdmlhcGFyaW5mby0+Ci0JCQkJICAgICB0bWRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGgpOwotCQl9CisJCWlmICh2aWFwYXJpbmZvLT5zaGFyZWQtPnRtZHNfc2V0dGluZ19pbmZvLmlnYV9wYXRoID09IElHQTIKKwkJCSYmIHZpYWZiX1NBTU1fT04pCisJCQl2aWFmYl9kdmlfc2V0X21vZGUoJnZhcjIsIElHQTIpOworCQllbHNlCisJCQl2aWFmYl9kdmlfc2V0X21vZGUoJnZpYWZiaW5mby0+dmFyLAorCQkJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7CiAJfQogCiAJaWYgKHZpYWZiX0xDRF9PTikgewogCQlpZiAodmlhZmJfU0FNTV9PTiAmJgogCQkJKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0EyKSkgewogCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmJwcCA9IHZpZGVvX2JwcDE7Ci0JCQl2aWFmYl9sY2Rfc2V0X21vZGUoY3J0X3RpbWluZzEsIHZpYXBhcmluZm8tPgotCQkJCWx2ZHNfc2V0dGluZ19pbmZvLAotCQkJCSAgICAgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8pOworCQkJdmlhZmJfbGNkX3NldF9tb2RlKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLAorCQkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvKTsKIAkJfSBlbHNlIHsKIAkJCS8qIElHQTEgZG9lc24ndCBoYXZlIExDRCBzY2FsaW5nLCBzbyBzZXQgaXQgY2VudGVyLiAqLwogCQkJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0ExKSB7CkBAIC0yMjY1LDE4ICsxOTM3LDE2IEBACiAJCQkJICAgIExDRF9DRU5URVJJTkc7CiAJCQl9CiAJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+YnBwID0gdmlkZW9fYnBwOwotCQkJdmlhZmJfbGNkX3NldF9tb2RlKGNydF90aW1pbmcsIHZpYXBhcmluZm8tPgotCQkJCWx2ZHNfc2V0dGluZ19pbmZvLAotCQkJCSAgICAgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8pOworCQkJdmlhZmJfbGNkX3NldF9tb2RlKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLAorCQkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvKTsKIAkJfQogCX0KIAlpZiAodmlhZmJfTENEMl9PTikgewogCQlpZiAodmlhZmJfU0FNTV9PTiAmJgogCQkJKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+aWdhX3BhdGggPT0gSUdBMikpIHsKIAkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+YnBwID0gdmlkZW9fYnBwMTsKLQkJCXZpYWZiX2xjZF9zZXRfbW9kZShjcnRfdGltaW5nMSwgdmlhcGFyaW5mby0+Ci0JCQkJbHZkc19zZXR0aW5nX2luZm8yLAotCQkJCSAgICAgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8yKTsKKwkJCXZpYWZiX2xjZF9zZXRfbW9kZSh2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzIsCisJCQkJJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8yKTsKIAkJfSBlbHNlIHsKIAkJCS8qIElHQTEgZG9lc24ndCBoYXZlIExDRCBzY2FsaW5nLCBzbyBzZXQgaXQgY2VudGVyLiAqLwogCQkJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+aWdhX3BhdGggPT0gSUdBMSkgewpAQCAtMjI4NCw5ICsxOTU0LDggQEAKIAkJCQkgICAgTENEX0NFTlRFUklORzsKIAkJCX0KIAkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+YnBwID0gdmlkZW9fYnBwOwotCQkJdmlhZmJfbGNkX3NldF9tb2RlKGNydF90aW1pbmcsIHZpYXBhcmluZm8tPgotCQkJCWx2ZHNfc2V0dGluZ19pbmZvMiwKLQkJCQkgICAgICZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMik7CisJCQl2aWFmYl9sY2Rfc2V0X21vZGUodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLAorCQkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMik7CiAJCX0KIAl9CiAKQEAgLTIyOTYsOCArMTk2NSw4IEBACiAKIAkvKiBJZiBzZXQgbW9kZSBub3JtYWxseSwgc2F2ZSByZXNvbHV0aW9uIGluZm9ybWF0aW9uIGZvciBob3QtcGx1ZyAuICovCiAJaWYgKCF2aWFmYl9ob3RwbHVnKSB7Ci0JCXZpYWZiX2hvdHBsdWdfWHJlcyA9IHZtb2RlX3RibC0+Y3J0Y1swXS5jcnRjLmhvcl9hZGRyOwotCQl2aWFmYl9ob3RwbHVnX1lyZXMgPSB2bW9kZV90YmwtPmNydGNbMF0uY3J0Yy52ZXJfYWRkcjsKKwkJdmlhZmJfaG90cGx1Z19YcmVzID0gdmlhZmJpbmZvLT52YXIueHJlczsKKwkJdmlhZmJfaG90cGx1Z19ZcmVzID0gdmlhZmJpbmZvLT52YXIueXJlczsKIAkJdmlhZmJfaG90cGx1Z19icHAgPSB2aWRlb19icHA7CiAJCXZpYWZiX2hvdHBsdWdfcmVmcmVzaCA9IHZpYWZiX3JlZnJlc2g7CiAKQEAgLTIzNDgsNDIgKzIwMTcsMTQgQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50IHZpYWZiX2dldF9waXhjbG9jayhpbnQgaHJlcywgaW50IHZyZXMsIGludCB2bW9kZV9yZWZyZXNoKQotewotCWludCBpOwotCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqYmVzdDsKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlID0gdmlhZmJfZ2V0X21vZGUoaHJlcywgdnJlcyk7Ci0KLQlpZiAoIXZtb2RlKQotCQlyZXR1cm4gUkVTXzY0MFg0ODBfNjBIWl9QSVhDTE9DSzsKLQotCWJlc3QgPSAmdm1vZGUtPmNydGNbMF07Ci0JZm9yIChpID0gMTsgaSA8IHZtb2RlLT5tb2RlX2FycmF5OyBpKyspIHsKLQkJaWYgKGFicyh2bW9kZS0+Y3J0Y1tpXS5yZWZyZXNoX3JhdGUgLSB2bW9kZV9yZWZyZXNoKQotCQkJPCBhYnMoYmVzdC0+cmVmcmVzaF9yYXRlIC0gdm1vZGVfcmVmcmVzaCkpCi0JCQliZXN0ID0gJnZtb2RlLT5jcnRjW2ldOwotCX0KLQotCXJldHVybiAxMDAwMDAwMDAwIC8gKGJlc3QtPmNydGMuaG9yX3RvdGFsICogYmVzdC0+Y3J0Yy52ZXJfdG90YWwpCi0JCSogMTAwMCAvIGJlc3QtPnJlZnJlc2hfcmF0ZTsKLX0KLQogaW50IHZpYWZiX2dldF9yZWZyZXNoKGludCBocmVzLCBpbnQgdnJlcywgdTMyIGxvbmdfcmVmcmVzaCkKIHsKLQlpbnQgaTsKIAlzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmJlc3Q7Ci0Jc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bW9kZSA9IHZpYWZiX2dldF9tb2RlKGhyZXMsIHZyZXMpOwogCi0JaWYgKCF2bW9kZSkKKwliZXN0ID0gdmlhZmJfZ2V0X2Jlc3RfbW9kZShocmVzLCB2cmVzLCBsb25nX3JlZnJlc2gpOworCWlmICghYmVzdCkKIAkJcmV0dXJuIDYwOwogCi0JYmVzdCA9ICZ2bW9kZS0+Y3J0Y1swXTsKLQlmb3IgKGkgPSAxOyBpIDwgdm1vZGUtPm1vZGVfYXJyYXk7IGkrKykgewotCQlpZiAoYWJzKHZtb2RlLT5jcnRjW2ldLnJlZnJlc2hfcmF0ZSAtIGxvbmdfcmVmcmVzaCkKLQkJCTwgYWJzKGJlc3QtPnJlZnJlc2hfcmF0ZSAtIGxvbmdfcmVmcmVzaCkpCi0JCQliZXN0ID0gJnZtb2RlLT5jcnRjW2ldOwotCX0KLQogCWlmIChhYnMoYmVzdC0+cmVmcmVzaF9yYXRlIC0gbG9uZ19yZWZyZXNoKSA+IDMpIHsKIAkJaWYgKGhyZXMgPT0gMTIwMCAmJiB2cmVzID09IDkwMCkKIAkJCXJldHVybiA0OTsgLyogT0xQQyBEQ09OIG9ubHkgc3VwcG9ydHMgNTAgSHogKi8KQEAgLTI0ODUsMjEgKzIxMjYsMTQgQEAKIH0KIAogLypBY2NvcmRpbmcgdmFyJ3MgeHJlcywgeXJlcyBmaWxsIHZhcidzIG90aGVyIHRpbWluZyBpbmZvcm1hdGlvbiovCi12b2lkIHZpYWZiX2ZpbGxfdmFyX3RpbWluZ19pbmZvKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgcmVmcmVzaCwKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX3RibCkKK3ZvaWQgdmlhZmJfZmlsbF92YXJfdGltaW5nX2luZm8oc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJc3RydWN0IGNydF9tb2RlX3RhYmxlICptb2RlKQogewotCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqY3J0X3RpbWluZyA9IE5VTEw7CiAJc3RydWN0IGRpc3BsYXlfdGltaW5nIGNydF9yZWc7Ci0JaW50IGkgPSAwLCBpbmRleCA9IDA7Ci0JY3J0X3RpbWluZyA9IHZtb2RlX3RibC0+Y3J0YzsKLQlmb3IgKGkgPSAwOyBpIDwgdm1vZGVfdGJsLT5tb2RlX2FycmF5OyBpKyspIHsKLQkJaW5kZXggPSBpOwotCQlpZiAoY3J0X3RpbWluZ1tpXS5yZWZyZXNoX3JhdGUgPT0gcmVmcmVzaCkKLQkJCWJyZWFrOwotCX0KIAotCWNydF9yZWcgPSBjcnRfdGltaW5nW2luZGV4XS5jcnRjOwotCXZhci0+cGl4Y2xvY2sgPSB2aWFmYl9nZXRfcGl4Y2xvY2sodmFyLT54cmVzLCB2YXItPnlyZXMsIHJlZnJlc2gpOworCWNydF9yZWcgPSBtb2RlLT5jcnRjOworCXZhci0+cGl4Y2xvY2sgPSAxMDAwMDAwMDAwIC8gKGNydF9yZWcuaG9yX3RvdGFsICogY3J0X3JlZy52ZXJfdG90YWwpCisJCSogMTAwMCAvIG1vZGUtPnJlZnJlc2hfcmF0ZTsKIAl2YXItPmxlZnRfbWFyZ2luID0KIAkgICAgY3J0X3JlZy5ob3JfdG90YWwgLSAoY3J0X3JlZy5ob3Jfc3luY19zdGFydCArIGNydF9yZWcuaG9yX3N5bmNfZW5kKTsKIAl2YXItPnJpZ2h0X21hcmdpbiA9IGNydF9yZWcuaG9yX3N5bmNfc3RhcnQgLSBjcnRfcmVnLmhvcl9hZGRyOwpAQCAtMjUwOSw4ICsyMTQzLDggQEAKIAl2YXItPmxvd2VyX21hcmdpbiA9IGNydF9yZWcudmVyX3N5bmNfc3RhcnQgLSBjcnRfcmVnLnZlcl9hZGRyOwogCXZhci0+dnN5bmNfbGVuID0gY3J0X3JlZy52ZXJfc3luY19lbmQ7CiAJdmFyLT5zeW5jID0gMDsKLQlpZiAoY3J0X3RpbWluZ1tpbmRleF0uaF9zeW5jX3BvbGFyaXR5ID09IFBPU0lUSVZFKQorCWlmIChtb2RlLT5oX3N5bmNfcG9sYXJpdHkgPT0gUE9TSVRJVkUpCiAJCXZhci0+c3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKLQlpZiAoY3J0X3RpbWluZ1tpbmRleF0udl9zeW5jX3BvbGFyaXR5ID09IFBPU0lUSVZFKQorCWlmIChtb2RlLT52X3N5bmNfcG9sYXJpdHkgPT0gUE9TSVRJVkUpCiAJCXZhci0+c3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9ody5oIGIvZHJpdmVycy92aWRlby92aWEvaHcuaAppbmRleCBjNzIzOWViLi40ZGI1YjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS9ody5oCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2h3LmgKQEAgLTUxLDQwICs1MSw2IEBACiAjZGVmaW5lIFZJQV9IU1lOQ19ORUdBVElWRQkweDAxCiAjZGVmaW5lIFZJQV9WU1lOQ19ORUdBVElWRQkweDAyCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRGVmaW5pdGlvbiBJR0ExIERlc2lnbiBNZXRob2Qgb2YgQ1JUQyBSZWdpc3RlcnMgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgSUdBMV9IT1JfVE9UQUxfRk9STVVMQSh4KSAgICAgICAgICAgKCgoeCkvOCktNSkKLSNkZWZpbmUgSUdBMV9IT1JfQUREUl9GT1JNVUxBKHgpICAgICAgICAgICAgKCgoeCkvOCktMSkKLSNkZWZpbmUgSUdBMV9IT1JfQkxBTktfU1RBUlRfRk9STVVMQSh4KSAgICAgKCgoeCkvOCktMSkKLSNkZWZpbmUgSUdBMV9IT1JfQkxBTktfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICgoKHgreSkvOCktMSkKLSNkZWZpbmUgSUdBMV9IT1JfU1lOQ19TVEFSVF9GT1JNVUxBKHgpICAgICAgKCh4KS84KQotI2RlZmluZSBJR0ExX0hPUl9TWU5DX0VORF9GT1JNVUxBKHgsIHkpICAgICAgKCh4K3kpLzgpCi0KLSNkZWZpbmUgSUdBMV9WRVJfVE9UQUxfRk9STVVMQSh4KSAgICAgICAgICAgKCh4KS0yKQotI2RlZmluZSBJR0ExX1ZFUl9BRERSX0ZPUk1VTEEoeCkgICAgICAgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTFfVkVSX0JMQU5LX1NUQVJUX0ZPUk1VTEEoeCkgICAgICgoeCktMSkKLSNkZWZpbmUgSUdBMV9WRVJfQkxBTktfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICgoeCt5KS0xKQotI2RlZmluZSBJR0ExX1ZFUl9TWU5DX1NUQVJUX0ZPUk1VTEEoeCkgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTFfVkVSX1NZTkNfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICAoKHgreSktMSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiogRGVmaW5pdGlvbiBJR0EyIERlc2lnbiBNZXRob2Qgb2YgQ1JUQyBSZWdpc3RlcnMgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgSUdBMl9IT1JfVE9UQUxfRk9STVVMQSh4KSAgICAgICAgICAgKCh4KS0xKQotI2RlZmluZSBJR0EyX0hPUl9BRERSX0ZPUk1VTEEoeCkgICAgICAgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTJfSE9SX0JMQU5LX1NUQVJUX0ZPUk1VTEEoeCkgICAgICgoeCktMSkKLSNkZWZpbmUgSUdBMl9IT1JfQkxBTktfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICgoeCt5KS0xKQotI2RlZmluZSBJR0EyX0hPUl9TWU5DX1NUQVJUX0ZPUk1VTEEoeCkgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTJfSE9SX1NZTkNfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICAoKHgreSktMSkKLQotI2RlZmluZSBJR0EyX1ZFUl9UT1RBTF9GT1JNVUxBKHgpICAgICAgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTJfVkVSX0FERFJfRk9STVVMQSh4KSAgICAgICAgICAgICgoeCktMSkKLSNkZWZpbmUgSUdBMl9WRVJfQkxBTktfU1RBUlRfRk9STVVMQSh4KSAgICAgKCh4KS0xKQotI2RlZmluZSBJR0EyX1ZFUl9CTEFOS19FTkRfRk9STVVMQSh4LCB5KSAgICAgKCh4K3kpLTEpCi0jZGVmaW5lIElHQTJfVkVSX1NZTkNfU1RBUlRfRk9STVVMQSh4KSAgICAgICgoeCktMSkKLSNkZWZpbmUgSUdBMl9WRVJfU1lOQ19FTkRfRk9STVVMQSh4LCB5KSAgICAgICgoeCt5KS0xKQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlZmluaXRpb24gSUdBMiBEZXNpZ24gTWV0aG9kIG9mIENSVEMgU2hhZG93IFJlZ2lzdGVycyAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NywzMyArNjMsNiBAQAogI2RlZmluZSBJR0EyX1ZFUl9TWU5DX1NUQVJUX1NIQURPV19GT1JNVUxBKHgpICAgICAgKHgpCiAjZGVmaW5lIElHQTJfVkVSX1NZTkNfRU5EX1NIQURPV19GT1JNVUxBKHgsIHkpICAgICAgKHgreSkKIAotLyogRGVmaW5lIFJlZ2lzdGVyIE51bWJlciBmb3IgSUdBMSBDUlRDIFRpbWluZyAqLwotCi0vKiBsb2NhdGlvbjoge0NSMDAsMCw3fSx7Q1IzNiwzLDN9ICovCi0jZGVmaW5lIElHQTFfSE9SX1RPVEFMX1JFR19OVU0JCTIKLS8qIGxvY2F0aW9uOiB7Q1IwMSwwLDd9ICovCi0jZGVmaW5lIElHQTFfSE9SX0FERFJfUkVHX05VTQkJMQotLyogbG9jYXRpb246IHtDUjAyLDAsN30gKi8KLSNkZWZpbmUgSUdBMV9IT1JfQkxBTktfU1RBUlRfUkVHX05VTSAgICAxCi0vKiBsb2NhdGlvbjoge0NSMDMsMCw0fSx7Q1IwNSw3LDd9LHtDUjMzLDUsNX0gKi8KLSNkZWZpbmUgSUdBMV9IT1JfQkxBTktfRU5EX1JFR19OVU0JMwotLyogbG9jYXRpb246IHtDUjA0LDAsN30se0NSMzMsNCw0fSAqLwotI2RlZmluZSBJR0ExX0hPUl9TWU5DX1NUQVJUX1JFR19OVU0JMgotLyogbG9jYXRpb246IHtDUjA1LDAsNH0gKi8KLSNkZWZpbmUgSUdBMV9IT1JfU1lOQ19FTkRfUkVHX05VTSAgICAgICAxCi0vKiBsb2NhdGlvbjoge0NSMDYsMCw3fSx7Q1IwNywwLDB9LHtDUjA3LDUsNX0se0NSMzUsMCwwfSAqLwotI2RlZmluZSBJR0ExX1ZFUl9UT1RBTF9SRUdfTlVNICAgICAgICAgIDQKLS8qIGxvY2F0aW9uOiB7Q1IxMiwwLDd9LHtDUjA3LDEsMX0se0NSMDcsNiw2fSx7Q1IzNSwyLDJ9ICovCi0jZGVmaW5lIElHQTFfVkVSX0FERFJfUkVHX05VTSAgICAgICAgICAgNAotLyogbG9jYXRpb246IHtDUjE1LDAsN30se0NSMDcsMywzfSx7Q1IwOSw1LDV9LHtDUjM1LDMsM30gKi8KLSNkZWZpbmUgSUdBMV9WRVJfQkxBTktfU1RBUlRfUkVHX05VTSAgICA0Ci0vKiBsb2NhdGlvbjoge0NSMTYsMCw3fSAqLwotI2RlZmluZSBJR0ExX1ZFUl9CTEFOS19FTkRfUkVHX05VTSAgICAgIDEKLS8qIGxvY2F0aW9uOiB7Q1IxMCwwLDd9LHtDUjA3LDIsMn0se0NSMDcsNyw3fSx7Q1IzNSwxLDF9ICovCi0jZGVmaW5lIElHQTFfVkVSX1NZTkNfU1RBUlRfUkVHX05VTSAgICAgNAotLyogbG9jYXRpb246IHtDUjExLDAsM30gKi8KLSNkZWZpbmUgSUdBMV9WRVJfU1lOQ19FTkRfUkVHX05VTSAgICAgICAxCi0KIC8qIERlZmluZSBSZWdpc3RlciBOdW1iZXIgZm9yIElHQTIgU2hhZG93IENSVEMgVGltaW5nICovCiAKIC8qIGxvY2F0aW9uOiB7Q1I2RCwwLDd9LHtDUjcxLDMsM30gKi8KQEAgLTE0MywzNyArODIsNiBAQAogLyogbG9jYXRpb246IHtDUjc2LDAsM30gKi8KICNkZWZpbmUgSUdBMl9TSEFET1dfVkVSX1NZTkNfRU5EX1JFR19OVU0gICAgMQogCi0vKiBEZWZpbmUgUmVnaXN0ZXIgTnVtYmVyIGZvciBJR0EyIENSVEMgVGltaW5nICovCi0KLS8qIGxvY2F0aW9uOiB7Q1I1MCwwLDd9LHtDUjU1LDAsM30gKi8KLSNkZWZpbmUgSUdBMl9IT1JfVE9UQUxfUkVHX05VTSAgICAgICAgICAyCi0vKiBsb2NhdGlvbjoge0NSNTEsMCw3fSx7Q1I1NSw0LDZ9ICovCi0jZGVmaW5lIElHQTJfSE9SX0FERFJfUkVHX05VTSAgICAgICAgICAgMgotLyogbG9jYXRpb246IHtDUjUyLDAsN30se0NSNTQsMCwyfSAqLwotI2RlZmluZSBJR0EyX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNICAgIDIKLS8qIGxvY2F0aW9uOiBDTEUyNjY6IHtDUjUzLDAsN30se0NSNTQsMyw1fSA9PiBDTEUyNjYncyBDUjVEWzZdCi1pcyByZXNlcnZlZCwgc28gaXQgbWF5IGhhdmUgcHJvYmxlbSB0byBzZXQgMTYwMHgxMjAwIG9uIElHQTIuICovCi0vKiAgICAgICAgIAlPdGhlcnM6IHtDUjUzLDAsN30se0NSNTQsMyw1fSx7Q1I1RCw2LDZ9ICovCi0jZGVmaW5lIElHQTJfSE9SX0JMQU5LX0VORF9SRUdfTlVNICAgICAgMwotLyogbG9jYXRpb246IHtDUjU2LDAsN30se0NSNTQsNiw3fSx7Q1I1Qyw3LDd9ICovCi0vKiBWVDMzMTQgYW5kIExhdGVyOiB7Q1I1NiwwLDd9LHtDUjU0LDYsN30se0NSNUMsNyw3fSwge0NSNUQsNyw3fSAqLwotI2RlZmluZSBJR0EyX0hPUl9TWU5DX1NUQVJUX1JFR19OVU0gICAgIDQKLQotLyogbG9jYXRpb246IHtDUjU3LDAsN30se0NSNUMsNiw2fSAqLwotI2RlZmluZSBJR0EyX0hPUl9TWU5DX0VORF9SRUdfTlVNICAgICAgIDIKLS8qIGxvY2F0aW9uOiB7Q1I1OCwwLDd9LHtDUjVELDAsMn0gKi8KLSNkZWZpbmUgSUdBMl9WRVJfVE9UQUxfUkVHX05VTSAgICAgICAgICAyCi0vKiBsb2NhdGlvbjoge0NSNTksMCw3fSx7Q1I1RCwzLDV9ICovCi0jZGVmaW5lIElHQTJfVkVSX0FERFJfUkVHX05VTSAgICAgICAgICAgMgotLyogbG9jYXRpb246IHtDUjVBLDAsN30se0NSNUMsMCwyfSAqLwotI2RlZmluZSBJR0EyX1ZFUl9CTEFOS19TVEFSVF9SRUdfTlVNICAgIDIKLS8qIGxvY2F0aW9uOiB7Q1I1RSwwLDd9LHtDUjVDLDMsNX0gKi8KLSNkZWZpbmUgSUdBMl9WRVJfQkxBTktfRU5EX1JFR19OVU0gICAgICAyCi0vKiBsb2NhdGlvbjoge0NSNUUsMCw3fSx7Q1I1Riw1LDd9ICovCi0jZGVmaW5lIElHQTJfVkVSX1NZTkNfU1RBUlRfUkVHX05VTSAgICAgMgotLyogbG9jYXRpb246IHtDUjVGLDAsNH0gKi8KLSNkZWZpbmUgSUdBMl9WRVJfU1lOQ19FTkRfUkVHX05VTSAgICAgICAxCi0KIC8qIERlZmluZSBGZXRjaCBDb3VudCBSZWdpc3RlciovCiAKIC8qIGxvY2F0aW9uOiB7U1IxQywwLDd9LHtTUjFELDAsMX0gKi8KQEAgLTQ0Niw4NyArMzU0LDEyIEBACiAvKiBsb2NhdGlvbjoge0NSNzgsMCw3fSx7Q1I3OSw2LDd9ICovCiAjZGVmaW5lIExDRF9WRVJfU0NBTElOR19GQUNUT1JfUkVHX05VTV9DTEUgIDIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqICAgICBEZWZpbmUgSUdBMSBEaXNwbGF5IFRpbWluZyAgICAgICAqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBpb19yZWdpc3RlciB7CiAJdTggaW9fYWRkcjsKIAl1OCBzdGFydF9iaXQ7CiAJdTggZW5kX2JpdDsKIH07CiAKLS8qIElHQTEgSG9yaXpvbnRhbCBUb3RhbCAqLwotc3RydWN0IGlnYTFfaG9yX3RvdGFsIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfSE9SX1RPVEFMX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBIb3Jpem9udGFsIEFkZHJlc3NhYmxlIFZpZGVvICovCi1zdHJ1Y3QgaWdhMV9ob3JfYWRkciB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX0hPUl9BRERSX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBIb3Jpem9udGFsIEJsYW5rIFN0YXJ0ICovCi1zdHJ1Y3QgaWdhMV9ob3JfYmxhbmtfc3RhcnQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9IT1JfQkxBTktfU1RBUlRfUkVHX05VTV07Ci19OwotCi0vKiBJR0ExIEhvcml6b250YWwgQmxhbmsgRW5kICovCi1zdHJ1Y3QgaWdhMV9ob3JfYmxhbmtfZW5kIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfSE9SX0JMQU5LX0VORF9SRUdfTlVNXTsKLX07Ci0KLS8qIElHQTEgSG9yaXpvbnRhbCBTeW5jIFN0YXJ0ICovCi1zdHJ1Y3QgaWdhMV9ob3Jfc3luY19zdGFydCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX0hPUl9TWU5DX1NUQVJUX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBIb3Jpem9udGFsIFN5bmMgRW5kICovCi1zdHJ1Y3QgaWdhMV9ob3Jfc3luY19lbmQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9IT1JfU1lOQ19FTkRfUkVHX05VTV07Ci19OwotCi0vKiBJR0ExIFZlcnRpY2FsIFRvdGFsICovCi1zdHJ1Y3QgaWdhMV92ZXJfdG90YWwgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9WRVJfVE9UQUxfUkVHX05VTV07Ci19OwotCi0vKiBJR0ExIFZlcnRpY2FsIEFkZHJlc3NhYmxlIFZpZGVvICovCi1zdHJ1Y3QgaWdhMV92ZXJfYWRkciB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX1ZFUl9BRERSX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBWZXJ0aWNhbCBCbGFuayBTdGFydCAqLwotc3RydWN0IGlnYTFfdmVyX2JsYW5rX3N0YXJ0IHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBWZXJ0aWNhbCBCbGFuayBFbmQgKi8KLXN0cnVjdCBpZ2ExX3Zlcl9ibGFua19lbmQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9WRVJfQkxBTktfRU5EX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBWZXJ0aWNhbCBTeW5jIFN0YXJ0ICovCi1zdHJ1Y3QgaWdhMV92ZXJfc3luY19zdGFydCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX1ZFUl9TWU5DX1NUQVJUX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBWZXJ0aWNhbCBTeW5jIEVuZCAqLwotc3RydWN0IGlnYTFfdmVyX3N5bmNfZW5kIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfVkVSX1NZTkNfRU5EX1JFR19OVU1dOwotfTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgICAgIERlZmluZSBJR0EyIFNoYWRvdyBEaXNwbGF5IFRpbWluZyAgICAgICAgICoqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTc5LDgyICs0MTIsNiBAQAogCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9TSEFET1dfVkVSX1NZTkNfRU5EX1JFR19OVU1dOwogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKiAgICAgIERlZmluZSBJR0EyIERpc3BsYXkgVGltaW5nICAgICAgICAgICAgICAgICoqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSUdBMiBIb3Jpem9udGFsIFRvdGFsICovCi1zdHJ1Y3QgaWdhMl9ob3JfdG90YWwgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9IT1JfVE9UQUxfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIEhvcml6b250YWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KLXN0cnVjdCBpZ2EyX2hvcl9hZGRyIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfSE9SX0FERFJfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIEhvcml6b250YWwgQmxhbmsgU3RhcnQgKi8KLXN0cnVjdCBpZ2EyX2hvcl9ibGFua19zdGFydCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNXTsKLX07Ci0KLS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KLXN0cnVjdCBpZ2EyX2hvcl9ibGFua19lbmQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9IT1JfQkxBTktfRU5EX1JFR19OVU1dOwotfTsKLQotLyogSUdBMiBIb3Jpem9udGFsIFN5bmMgU3RhcnQgKi8KLXN0cnVjdCBpZ2EyX2hvcl9zeW5jX3N0YXJ0IHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfSE9SX1NZTkNfU1RBUlRfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIEhvcml6b250YWwgU3luYyBFbmQgKi8KLXN0cnVjdCBpZ2EyX2hvcl9zeW5jX2VuZCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX0hPUl9TWU5DX0VORF9SRUdfTlVNXTsKLX07Ci0KLS8qIElHQTIgVmVydGljYWwgVG90YWwgKi8KLXN0cnVjdCBpZ2EyX3Zlcl90b3RhbCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX1ZFUl9UT1RBTF9SRUdfTlVNXTsKLX07Ci0KLS8qIElHQTIgVmVydGljYWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KLXN0cnVjdCBpZ2EyX3Zlcl9hZGRyIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfVkVSX0FERFJfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIFZlcnRpY2FsIEJsYW5rIFN0YXJ0ICovCi1zdHJ1Y3QgaWdhMl92ZXJfYmxhbmtfc3RhcnQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9WRVJfQkxBTktfU1RBUlRfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIFZlcnRpY2FsIEJsYW5rIEVuZCAqLwotc3RydWN0IGlnYTJfdmVyX2JsYW5rX2VuZCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX1ZFUl9CTEFOS19FTkRfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIFZlcnRpY2FsIFN5bmMgU3RhcnQgKi8KLXN0cnVjdCBpZ2EyX3Zlcl9zeW5jX3N0YXJ0IHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfVkVSX1NZTkNfU1RBUlRfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIFZlcnRpY2FsIFN5bmMgRW5kICovCi1zdHJ1Y3QgaWdhMl92ZXJfc3luY19lbmQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9WRVJfU1lOQ19FTkRfUkVHX05VTV07Ci19OwotCiAvKiBJR0ExIEZldGNoIENvdW50IFJlZ2lzdGVyICovCiBzdHJ1Y3QgaWdhMV9mZXRjaF9jb3VudCB7CiAJaW50IHJlZ19udW07CkBAIC04MTcsMjEgKzU3NCw2IEBACiAJIGlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtX3JlZzsKIH07CiAKLXN0cnVjdCBpZ2ExX2NydGNfdGltaW5nIHsKLQlzdHJ1Y3QgaWdhMV9ob3JfdG90YWwgaG9yX3RvdGFsOwotCXN0cnVjdCBpZ2ExX2hvcl9hZGRyIGhvcl9hZGRyOwotCXN0cnVjdCBpZ2ExX2hvcl9ibGFua19zdGFydCBob3JfYmxhbmtfc3RhcnQ7Ci0Jc3RydWN0IGlnYTFfaG9yX2JsYW5rX2VuZCBob3JfYmxhbmtfZW5kOwotCXN0cnVjdCBpZ2ExX2hvcl9zeW5jX3N0YXJ0IGhvcl9zeW5jX3N0YXJ0OwotCXN0cnVjdCBpZ2ExX2hvcl9zeW5jX2VuZCBob3Jfc3luY19lbmQ7Ci0Jc3RydWN0IGlnYTFfdmVyX3RvdGFsIHZlcl90b3RhbDsKLQlzdHJ1Y3QgaWdhMV92ZXJfYWRkciB2ZXJfYWRkcjsKLQlzdHJ1Y3QgaWdhMV92ZXJfYmxhbmtfc3RhcnQgdmVyX2JsYW5rX3N0YXJ0OwotCXN0cnVjdCBpZ2ExX3Zlcl9ibGFua19lbmQgdmVyX2JsYW5rX2VuZDsKLQlzdHJ1Y3QgaWdhMV92ZXJfc3luY19zdGFydCB2ZXJfc3luY19zdGFydDsKLQlzdHJ1Y3QgaWdhMV92ZXJfc3luY19lbmQgdmVyX3N5bmNfZW5kOwotfTsKLQogc3RydWN0IGlnYTJfc2hhZG93X2NydGNfdGltaW5nIHsKIAlzdHJ1Y3QgaWdhMl9zaGFkb3dfaG9yX3RvdGFsIGhvcl90b3RhbF9zaGFkb3c7CiAJc3RydWN0IGlnYTJfc2hhZG93X2hvcl9ibGFua19lbmQgaG9yX2JsYW5rX2VuZF9zaGFkb3c7CkBAIC04NDMsMjEgKzU4NSw2IEBACiAJc3RydWN0IGlnYTJfc2hhZG93X3Zlcl9zeW5jX2VuZCB2ZXJfc3luY19lbmRfc2hhZG93OwogfTsKIAotc3RydWN0IGlnYTJfY3J0Y190aW1pbmcgewotCXN0cnVjdCBpZ2EyX2hvcl90b3RhbCBob3JfdG90YWw7Ci0Jc3RydWN0IGlnYTJfaG9yX2FkZHIgaG9yX2FkZHI7Ci0Jc3RydWN0IGlnYTJfaG9yX2JsYW5rX3N0YXJ0IGhvcl9ibGFua19zdGFydDsKLQlzdHJ1Y3QgaWdhMl9ob3JfYmxhbmtfZW5kIGhvcl9ibGFua19lbmQ7Ci0Jc3RydWN0IGlnYTJfaG9yX3N5bmNfc3RhcnQgaG9yX3N5bmNfc3RhcnQ7Ci0Jc3RydWN0IGlnYTJfaG9yX3N5bmNfZW5kIGhvcl9zeW5jX2VuZDsKLQlzdHJ1Y3QgaWdhMl92ZXJfdG90YWwgdmVyX3RvdGFsOwotCXN0cnVjdCBpZ2EyX3Zlcl9hZGRyIHZlcl9hZGRyOwotCXN0cnVjdCBpZ2EyX3Zlcl9ibGFua19zdGFydCB2ZXJfYmxhbmtfc3RhcnQ7Ci0Jc3RydWN0IGlnYTJfdmVyX2JsYW5rX2VuZCB2ZXJfYmxhbmtfZW5kOwotCXN0cnVjdCBpZ2EyX3Zlcl9zeW5jX3N0YXJ0IHZlcl9zeW5jX3N0YXJ0OwotCXN0cnVjdCBpZ2EyX3Zlcl9zeW5jX2VuZCB2ZXJfc3luY19lbmQ7Ci19OwotCiAvKiBkZXZpY2UgSUQgKi8KICNkZWZpbmUgQ0xFMjY2X0ZVTkNUSU9OMyAgICAweDMxMjMKICNkZWZpbmUgS000MDBfRlVOQ1RJT04zICAgICAweDMyMDUKQEAgLTkxMCw5ICs2MzcsNyBAQAogZXh0ZXJuIGludCB2aWFmYl9EVklfT047CiBleHRlcm4gaW50IHZpYWZiX2hvdHBsdWc7CiAKLXZvaWQgdmlhZmJfZmlsbF9jcnRjX3RpbWluZyhzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmNydF90YWJsZSwKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpZGVvX21vZGUsIGludCBicHBfYnl0ZSwgaW50IHNldF9pZ2EpOwotCit2b2lkIHZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBpZ2EpOwogdm9pZCB2aWFmYl9zZXRfdmNsb2NrKHUzMiBDTEssIGludCBzZXRfaWdhKTsKIHZvaWQgdmlhZmJfbG9hZF9yZWcoaW50IHRpbWluZ192YWx1ZSwgaW50IHZpYWZiX2xvYWRfcmVnX251bSwKIAlzdHJ1Y3QgaW9fcmVnaXN0ZXIgKnJlZywKQEAgLTkzMiwxMyArNjU3LDExIEBACiB2b2lkIHZpYWZiX3NldF9kcGFfZ2Z4KGludCBvdXRwdXRfaW50ZXJmYWNlLCBzdHJ1Y3QgR0ZYX0RQQV9TRVRUSU5HXAogCQkJCQkqcF9nZnhfZHBhX3NldHRpbmcpOwogCi1pbnQgdmlhZmJfc2V0bW9kZShzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX3RibCwgaW50IHZpZGVvX2JwcCwKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX3RibDEsIGludCB2aWRlb19icHAxKTsKLXZvaWQgdmlhZmJfZmlsbF92YXJfdGltaW5nX2luZm8oc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCByZWZyZXNoLAotCXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm1vZGVfdGJsKTsKK2ludCB2aWFmYl9zZXRtb2RlKGludCB2aWRlb19icHAsIGludCB2aWRlb19icHAxKTsKK3ZvaWQgdmlhZmJfZmlsbF92YXJfdGltaW5nX2luZm8oc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJc3RydWN0IGNydF9tb2RlX3RhYmxlICptb2RlKTsKIHZvaWQgX19kZXZpbml0IHZpYWZiX2luaXRfY2hpcF9pbmZvKGludCBjaGlwX3R5cGUpOwogdm9pZCBfX2RldmluaXQgdmlhZmJfaW5pdF9kYWMoaW50IHNldF9pZ2EpOwotaW50IHZpYWZiX2dldF9waXhjbG9jayhpbnQgaHJlcywgaW50IHZyZXMsIGludCB2bW9kZV9yZWZyZXNoKTsKIGludCB2aWFmYl9nZXRfcmVmcmVzaChpbnQgaHJlcywgaW50IHZyZXMsIHUzMiBmbG9hdF9yZWZyZXNoKTsKIHZvaWQgdmlhZmJfdXBkYXRlX2RldmljZV9zZXR0aW5nKGludCBocmVzLCBpbnQgdnJlcywgaW50IGJwcCwgaW50IGZsYWcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9sY2QuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL2xjZC5jCmluZGV4IDZlMDY5ODEuLjVmM2I0ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlhL2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2xjZC5jCkBAIC01NDgsOSArNTQ4LDggQEAKIH0KIAogLyogTENEIFNldCBNb2RlICovCi12b2lkIHZpYWZiX2xjZF9zZXRfbW9kZShzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKm1vZGVfY3J0X3RhYmxlLAotCQkgIHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24gKnBsdmRzX3NldHRpbmdfaW5mbywKLQkJICBzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pCit2b2lkIHZpYWZiX2xjZF9zZXRfbW9kZShzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uICpwbHZkc19zZXR0aW5nX2luZm8sCisJc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKQogewogCWludCBzZXRfaWdhID0gcGx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aDsKIAlpbnQgbW9kZV9icHAgPSBwbHZkc19zZXR0aW5nX2luZm8tPmJwcDsKQEAgLTU1OSwxNiArNTU4LDE1IEBACiAJaW50IHBhbmVsX2hyZXMgPSBwbHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzOwogCWludCBwYW5lbF92cmVzID0gcGx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfdnJlczsKIAl1MzIgY2xvY2s7Ci0Jc3RydWN0IGRpc3BsYXlfdGltaW5nIG1vZGVfY3J0X3JlZywgcGFuZWxfY3J0X3JlZzsKLQlzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKnBhbmVsX2NydF90YWJsZSA9IE5VTEw7Ci0Jc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bW9kZV90YmwgPSB2aWFmYl9nZXRfbW9kZShwYW5lbF9ocmVzLAotCQlwYW5lbF92cmVzKTsKKwlzdHJ1Y3QgZGlzcGxheV90aW1pbmcgbW9kZV9jcnRfcmVnLCBwYW5lbF9jcnRfcmVnLCB0aW1pbmc7CisJc3RydWN0IGNydF9tb2RlX3RhYmxlICptb2RlX2NydF90YWJsZSwgKnBhbmVsX2NydF90YWJsZTsKIAogCURFQlVHX01TRyhLRVJOX0lORk8gInZpYWZiX2xjZF9zZXRfbW9kZSEhXG4iKTsKIAkvKiBHZXQgbW9kZSB0YWJsZSAqLworCW1vZGVfY3J0X3RhYmxlID0gdmlhZmJfZ2V0X2Jlc3RfbW9kZShzZXRfaHJlcywgc2V0X3ZyZXMsIDYwKTsKIAltb2RlX2NydF9yZWcgPSBtb2RlX2NydF90YWJsZS0+Y3J0YzsKIAkvKiBHZXQgcGFuZWwgdGFibGUgUG9pbnRlciAqLwotCXBhbmVsX2NydF90YWJsZSA9IHZtb2RlX3RibC0+Y3J0YzsKKwlwYW5lbF9jcnRfdGFibGUgPSB2aWFmYl9nZXRfYmVzdF9tb2RlKHBhbmVsX2hyZXMsIHBhbmVsX3ZyZXMsIDYwKTsKIAlwYW5lbF9jcnRfcmVnID0gcGFuZWxfY3J0X3RhYmxlLT5jcnRjOwogCURFQlVHX01TRyhLRVJOX0lORk8gImJlbGxvdyB2aWFmYl9sY2Rfc2V0X21vZGUhIVxuIik7CiAJaWYgKFZUMTYzNl9MVkRTID09IHBsdmRzX2NoaXBfaW5mby0+bHZkc19jaGlwX25hbWUpCkBAIC01NzYsMzEgKzU3NCwyOCBAQAogCWNsb2NrID0gcGFuZWxfY3J0X3JlZy5ob3JfdG90YWwgKiBwYW5lbF9jcnRfcmVnLnZlcl90b3RhbAogCQkqIHBhbmVsX2NydF90YWJsZS0+cmVmcmVzaF9yYXRlOwogCXBsdmRzX3NldHRpbmdfaW5mby0+dmNsayA9IGNsb2NrOwotCWlmIChzZXRfaWdhID09IElHQTEpIHsKLQkJLyogSUdBMSBkb2Vzbid0IGhhdmUgTENEIHNjYWxpbmcsIHNvIHNldCBpdCBhcyBjZW50ZXJpbmcuICovCi0JCXZpYWZiX2xvYWRfY3J0Y190aW1pbmcobGNkX2NlbnRlcmluZ190aW1naW5nCi0JCQkJIChtb2RlX2NydF9yZWcsIHBhbmVsX2NydF9yZWcpLCBJR0ExKTsKKworCWlmIChzZXRfaWdhID09IElHQTIgJiYgKHNldF9ocmVzIDwgcGFuZWxfaHJlcyB8fCBzZXRfdnJlcyA8IHBhbmVsX3ZyZXMpCisJCSYmIHBsdmRzX3NldHRpbmdfaW5mby0+ZGlzcGxheV9tZXRob2QgPT0gTENEX0VYUEFORFNJT04pIHsKKwkJdGltaW5nID0gcGFuZWxfY3J0X3JlZzsKKwkJbG9hZF9sY2Rfc2NhbGluZyhzZXRfaHJlcywgc2V0X3ZyZXMsIHBhbmVsX2hyZXMsIHBhbmVsX3ZyZXMpOwogCX0gZWxzZSB7Ci0JCS8qIEV4cGFuc2lvbiAqLwotCQlpZiAocGx2ZHNfc2V0dGluZ19pbmZvLT5kaXNwbGF5X21ldGhvZCA9PSBMQ0RfRVhQQU5EU0lPTgotCQkJJiYgKHNldF9ocmVzIDwgcGFuZWxfaHJlcyB8fCBzZXRfdnJlcyA8IHBhbmVsX3ZyZXMpKSB7Ci0JCQkvKiBleHBhbnNpb24gdGltaW5nIElHQTIgbG9hZGVkIHBhbmVsIHNldCB0aW1pbmcqLwotCQkJdmlhZmJfbG9hZF9jcnRjX3RpbWluZyhwYW5lbF9jcnRfcmVnLCBJR0EyKTsKLQkJCURFQlVHX01TRyhLRVJOX0lORk8gInZpYWZiX2xvYWRfY3J0Y190aW1pbmchIVxuIik7Ci0JCQlsb2FkX2xjZF9zY2FsaW5nKHNldF9ocmVzLCBzZXRfdnJlcywgcGFuZWxfaHJlcywKLQkJCQkJIHBhbmVsX3ZyZXMpOwotCQkJREVCVUdfTVNHKEtFUk5fSU5GTyAibG9hZF9sY2Rfc2NhbGluZyEhXG4iKTsKLQkJfSBlbHNlIHsJLyogQ2VudGVyaW5nICovCi0JCQkvKiBjZW50ZXJpbmcgdGltaW5nIElHQTIgYWx3YXlzIGxvYWRlZCBwYW5lbAotCQkJICAgYW5kIG1vZGUgcmVsZWF0aXZlIHRpbWluZyAqLwotCQkJdmlhZmJfbG9hZF9jcnRjX3RpbWluZyhsY2RfY2VudGVyaW5nX3RpbWdpbmcKLQkJCQkJIChtb2RlX2NydF9yZWcsIHBhbmVsX2NydF9yZWcpLCBJR0EyKTsKLQkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNzksIFZJQUNSLCAweDAwLAorCQl0aW1pbmcgPSBsY2RfY2VudGVyaW5nX3RpbWdpbmcobW9kZV9jcnRfcmVnLCBwYW5lbF9jcnRfcmVnKTsKKwkJaWYgKHNldF9pZ2EgPT0gSUdBMikKKwkJCS8qIGRpc2FibGUgc2NhbGluZyAqLworCQkJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDc5LCAweDAwLAogCQkJCUJJVDAgKyBCSVQxICsgQklUMik7Ci0JCQkvKiBMQ0Qgc2NhbGluZyBkaXNhYmxlZCAqLwotCQl9CiAJfQogCisJdGltaW5nLmhvcl9ibGFua19lbmQgKz0gdGltaW5nLmhvcl9ibGFua19zdGFydDsKKwl0aW1pbmcuaG9yX3N5bmNfZW5kICs9IHRpbWluZy5ob3Jfc3luY19zdGFydDsKKwl0aW1pbmcudmVyX2JsYW5rX2VuZCArPSB0aW1pbmcudmVyX2JsYW5rX3N0YXJ0OworCXRpbWluZy52ZXJfc3luY19lbmQgKz0gdGltaW5nLnZlcl9zeW5jX3N0YXJ0OworCWlmIChzZXRfaWdhID09IElHQTEpCisJCXZpYV9zZXRfcHJpbWFyeV90aW1pbmcoJnRpbWluZyk7CisJZWxzZSBpZiAoc2V0X2lnYSA9PSBJR0EyKQorCQl2aWFfc2V0X3NlY29uZGFyeV90aW1pbmcoJnRpbWluZyk7CisKIAkvKiBGZXRjaCBjb3VudCBmb3IgSUdBMiBvbmx5ICovCiAJdmlhZmJfbG9hZF9mZXRjaF9jb3VudF9yZWcoc2V0X2hyZXMsIG1vZGVfYnBwIC8gOCwgc2V0X2lnYSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2xjZC5oIGIvZHJpdmVycy92aWRlby92aWEvbGNkLmgKaW5kZXggNzVmNjBhNi4uNzdjYTdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvbGNkLmgKKysrIGIvZHJpdmVycy92aWRlby92aWEvbGNkLmgKQEAgLTc2LDE2ICs3NiwxMyBAQAogCQkJCSpwbHZkc19jaGlwX2luZm8sCiAJCQkJc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgogCQkJCSpwbHZkc19zZXR0aW5nX2luZm8pOwotdm9pZCB2aWFmYl9sY2Rfc2V0X21vZGUoc3RydWN0IGNydF9tb2RlX3RhYmxlICptb2RlX2NydF90YWJsZSwKLQkJICBzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uICpwbHZkc19zZXR0aW5nX2luZm8sCi0JCSAgc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKTsKK3ZvaWQgdmlhZmJfbGNkX3NldF9tb2RlKHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24gKnBsdmRzX3NldHRpbmdfaW5mbywKKwlzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pOwogYm9vbCBfX2RldmluaXQgdmlhZmJfbHZkc190cmFzbWl0dGVyX2lkZW50aWZ5KHZvaWQpOwogdm9pZCB2aWFmYl9pbml0X2x2ZHNfb3V0cHV0X2ludGVyZmFjZShzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uCiAJCQkJKnBsdmRzX2NoaXBfaW5mbywKIAkJCQlzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCiAJCQkJKnBsdmRzX3NldHRpbmdfaW5mbyk7CiBib29sIHZpYWZiX2xjZF9nZXRfbW9iaWxlX3N0YXRlKGJvb2wgKm1vYmlsZSk7Ci12b2lkIHZpYWZiX2xvYWRfY3J0Y190aW1pbmcoc3RydWN0IGRpc3BsYXlfdGltaW5nIGRldmljZV90aW1pbmcsCi0JaW50IHNldF9pZ2EpOwogCiAjZW5kaWYgLyogX19MQ0RfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9zaGFyZS5oIGIvZHJpdmVycy92aWRlby92aWEvc2hhcmUuaAppbmRleCA2MWIwYmQ1Li42OWQ4ODJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS9zaGFyZS5oCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3NoYXJlLmgKQEAgLTIyLDYgKzIyLDggQEAKICNpZm5kZWYgX19TSEFSRV9IX18KICNkZWZpbmUgX19TSEFSRV9IX18KIAorI2luY2x1ZGUgInZpYV9tb2Rlc2V0dGluZy5oIgorCiAvKiBEZWZpbmUgQml0IEZpZWxkICovCiAjZGVmaW5lIEJJVDAgICAgMHgwMQogI2RlZmluZSBCSVQxICAgIDB4MDIKQEAgLTYzNCwxMCArNjM2LDYgQEAKICNkZWZpbmUgVl9TWU5DX1NBVFJUX1NIQURPV19JTkRFWCAgIDE4CiAjZGVmaW5lIFZfU1lOQ19FTkRfU0hBRE9XX0lOREVYICAgICAxOQogCi0vKiBEZWZpbml0aW9uIFZpZGVvIE1vZGUgUGl4ZWwgQ2xvY2sgKHBpY29zZWNvbmRzKQotKi8KLSNkZWZpbmUgUkVTXzY0MFg0ODBfNjBIWl9QSVhDTE9DSyAgICAzOTcyMgotCiAvKiBMQ0QgZGlzcGxheSBtZXRob2QKICovCiAjZGVmaW5lICAgICBMQ0RfRVhQQU5EU0lPTiAgICAgICAgICAgICAgMHgwMApAQCAtNjQ4LDIzICs2NDYsNiBAQAogI2RlZmluZSAgICAgTENEX09QRU5MREkgICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lICAgICBMQ0RfU1BXRyAgICAgICAgICAgICAgICAgIDB4MDEKIAotLyogRGVmaW5lIGRpc3BsYXkgdGltaW5nCi0qLwotc3RydWN0IGRpc3BsYXlfdGltaW5nIHsKLQl1MTYgaG9yX3RvdGFsOwotCXUxNiBob3JfYWRkcjsKLQl1MTYgaG9yX2JsYW5rX3N0YXJ0OwotCXUxNiBob3JfYmxhbmtfZW5kOwotCXUxNiBob3Jfc3luY19zdGFydDsKLQl1MTYgaG9yX3N5bmNfZW5kOwotCXUxNiB2ZXJfdG90YWw7Ci0JdTE2IHZlcl9hZGRyOwotCXUxNiB2ZXJfYmxhbmtfc3RhcnQ7Ci0JdTE2IHZlcl9ibGFua19lbmQ7Ci0JdTE2IHZlcl9zeW5jX3N0YXJ0OwotCXUxNiB2ZXJfc3luY19lbmQ7Ci19OwotCiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgewogCWludCByZWZyZXNoX3JhdGU7CiAJaW50IGhfc3luY19wb2xhcml0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYS1jb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWEtY29yZS5jCmluZGV4IGViMTEyYjYuLmRkNThiNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYS1jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby92aWEvdmlhLWNvcmUuYwpAQCAtMzUsNyArMzUsNyBAQAogICogVGhlIE9MUEMgWE8tMS41IHB1dHMgdGhlIGNhbWVyYSBwb3dlciBhbmQgcmVzZXQgbGluZXMgb250bwogICogR1BJTyAyQy4KICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB2aWFfcG9ydF9jZmcgb2xwY19hZGFwX2NvbmZpZ3NbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdmlhX3BvcnRfY2ZnIG9scGNfYWRhcF9jb25maWdzW10gPSB7CiAJW1ZJQV9QT1JUXzI2XQk9IHsgVklBX1BPUlRfSTJDLCAgVklBX01PREVfSTJDLCBWSUFTUiwgMHgyNiB9LAogCVtWSUFfUE9SVF8zMV0JPSB7IFZJQV9QT1JUX0kyQywgIFZJQV9NT0RFX0kyQywgVklBU1IsIDB4MzEgfSwKIAlbVklBX1BPUlRfMjVdCT0geyBWSUFfUE9SVF9HUElPLCBWSUFfTU9ERV9HUElPLCBWSUFTUiwgMHgyNSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhLWdwaW8uYyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYS1ncGlvLmMKaW5kZXggYWI1MzQxOC4uZDY5Y2ZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvdmlhLWdwaW8uYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWEtZ3Bpby5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdmlhLWNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC92aWEtZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKgogICogVGhlIHBvcnRzIHdlIGtub3cgYWJvdXQuICBOb3RlIHRoYXQgdGhlIHBvcnQtMjUgZ3Bpb3MgYXJlIG5vdApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhX21vZGVzZXR0aW5nLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuYwppbmRleCAzY2RkY2ZmLi4wZTQzMWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuYwpAQCAtMjksNiArMjksMTEwIEBACiAjaW5jbHVkZSAic2hhcmUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisKK3ZvaWQgdmlhX3NldF9wcmltYXJ5X3RpbWluZyhjb25zdCBzdHJ1Y3QgZGlzcGxheV90aW1pbmcgKnRpbWluZykKK3sKKwlzdHJ1Y3QgZGlzcGxheV90aW1pbmcgcmF3OworCisJcmF3Lmhvcl90b3RhbCA9IHRpbWluZy0+aG9yX3RvdGFsIC8gOCAtIDU7CisJcmF3Lmhvcl9hZGRyID0gdGltaW5nLT5ob3JfYWRkciAvIDggLSAxOworCXJhdy5ob3JfYmxhbmtfc3RhcnQgPSB0aW1pbmctPmhvcl9ibGFua19zdGFydCAvIDggLSAxOworCXJhdy5ob3JfYmxhbmtfZW5kID0gdGltaW5nLT5ob3JfYmxhbmtfZW5kIC8gOCAtIDE7CisJcmF3Lmhvcl9zeW5jX3N0YXJ0ID0gdGltaW5nLT5ob3Jfc3luY19zdGFydCAvIDg7CisJcmF3Lmhvcl9zeW5jX2VuZCA9IHRpbWluZy0+aG9yX3N5bmNfZW5kIC8gODsKKwlyYXcudmVyX3RvdGFsID0gdGltaW5nLT52ZXJfdG90YWwgLSAyOworCXJhdy52ZXJfYWRkciA9IHRpbWluZy0+dmVyX2FkZHIgLSAxOworCXJhdy52ZXJfYmxhbmtfc3RhcnQgPSB0aW1pbmctPnZlcl9ibGFua19zdGFydCAtIDE7CisJcmF3LnZlcl9ibGFua19lbmQgPSB0aW1pbmctPnZlcl9ibGFua19lbmQgLSAxOworCXJhdy52ZXJfc3luY19zdGFydCA9IHRpbWluZy0+dmVyX3N5bmNfc3RhcnQgLSAxOworCXJhdy52ZXJfc3luY19lbmQgPSB0aW1pbmctPnZlcl9zeW5jX2VuZCAtIDE7CisKKwkvKiB1bmxvY2sgdGltaW5nIHJlZ2lzdGVycyAqLworCXZpYV93cml0ZV9yZWdfbWFzayhWSUFDUiwgMHgxMSwgMHgwMCwgMHg4MCk7CisKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDAwLCByYXcuaG9yX3RvdGFsICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHgwMSwgcmF3Lmhvcl9hZGRyICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHgwMiwgcmF3Lmhvcl9ibGFua19zdGFydCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWdfbWFzayhWSUFDUiwgMHgwMywgcmF3Lmhvcl9ibGFua19lbmQgJiAweDFGLCAweDFGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDA0LCByYXcuaG9yX3N5bmNfc3RhcnQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnX21hc2soVklBQ1IsIDB4MDUsIChyYXcuaG9yX3N5bmNfZW5kICYgMHgxRikKKwkJfCAocmF3Lmhvcl9ibGFua19lbmQgPDwgKDcgLSA1KSAmIDB4ODApLCAweDlGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDA2LCByYXcudmVyX3RvdGFsICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDA3LCAocmF3LnZlcl90b3RhbCA+PiA4ICYgMHgwMSkKKwkJfCAocmF3LnZlcl9hZGRyID4+ICg4IC0gMSkgJiAweDAyKQorCQl8IChyYXcudmVyX3N5bmNfc3RhcnQgPj4gKDggLSAyKSAmIDB4MDQpCisJCXwgKHJhdy52ZXJfYmxhbmtfc3RhcnQgPj4gKDggLSAzKSAmIDB4MDgpCisJCXwgKHJhdy52ZXJfdG90YWwgPj4gKDkgLSA1KSAmIDB4MjApCisJCXwgKHJhdy52ZXJfYWRkciA+PiAoOSAtIDYpICYgMHg0MCkKKwkJfCAocmF3LnZlcl9zeW5jX3N0YXJ0ID4+ICg5IC0gNykgJiAweDgwKSwgMHhFRik7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDA5LCByYXcudmVyX2JsYW5rX3N0YXJ0ID4+ICg5IC0gNSkgJiAweDIwLAorCQkweDIwKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDEwLCByYXcudmVyX3N5bmNfc3RhcnQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnX21hc2soVklBQ1IsIDB4MTEsIHJhdy52ZXJfc3luY19lbmQgJiAweDBGLCAweDBGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDEyLCByYXcudmVyX2FkZHIgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDE1LCByYXcudmVyX2JsYW5rX3N0YXJ0ICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHgxNiwgcmF3LnZlcl9ibGFua19lbmQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnX21hc2soVklBQ1IsIDB4MzMsIChyYXcuaG9yX3N5bmNfc3RhcnQgPj4gKDggLSA0KSAmIDB4MTApCisJCXwgKHJhdy5ob3JfYmxhbmtfZW5kID4+ICg2IC0gNSkgJiAweDIwKSwgMHgzMCk7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDM1LCAocmF3LnZlcl90b3RhbCA+PiAxMCAmIDB4MDEpCisJCXwgKHJhdy52ZXJfc3luY19zdGFydCA+PiAoMTAgLSAxKSAmIDB4MDIpCisJCXwgKHJhdy52ZXJfYWRkciA+PiAoMTAgLSAyKSAmIDB4MDQpCisJCXwgKHJhdy52ZXJfYmxhbmtfc3RhcnQgPj4gKDEwIC0gMykgJiAweDA4KSwgMHgwRik7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDM2LCByYXcuaG9yX3RvdGFsID4+ICg4IC0gMykgJiAweDA4LCAweDA4KTsKKworCS8qIGxvY2sgdGltaW5nIHJlZ2lzdGVycyAqLworCXZpYV93cml0ZV9yZWdfbWFzayhWSUFDUiwgMHgxMSwgMHg4MCwgMHg4MCk7CisKKwkvKiByZXNldCB0aW1pbmcgY29udHJvbCAqLworCXZpYV93cml0ZV9yZWdfbWFzayhWSUFDUiwgMHgxNywgMHgwMCwgMHg4MCk7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDE3LCAweDgwLCAweDgwKTsKK30KKwordm9pZCB2aWFfc2V0X3NlY29uZGFyeV90aW1pbmcoY29uc3Qgc3RydWN0IGRpc3BsYXlfdGltaW5nICp0aW1pbmcpCit7CisJc3RydWN0IGRpc3BsYXlfdGltaW5nIHJhdzsKKworCXJhdy5ob3JfdG90YWwgPSB0aW1pbmctPmhvcl90b3RhbCAtIDE7CisJcmF3Lmhvcl9hZGRyID0gdGltaW5nLT5ob3JfYWRkciAtIDE7CisJcmF3Lmhvcl9ibGFua19zdGFydCA9IHRpbWluZy0+aG9yX2JsYW5rX3N0YXJ0IC0gMTsKKwlyYXcuaG9yX2JsYW5rX2VuZCA9IHRpbWluZy0+aG9yX2JsYW5rX2VuZCAtIDE7CisJcmF3Lmhvcl9zeW5jX3N0YXJ0ID0gdGltaW5nLT5ob3Jfc3luY19zdGFydCAtIDE7CisJcmF3Lmhvcl9zeW5jX2VuZCA9IHRpbWluZy0+aG9yX3N5bmNfZW5kIC0gMTsKKwlyYXcudmVyX3RvdGFsID0gdGltaW5nLT52ZXJfdG90YWwgLSAxOworCXJhdy52ZXJfYWRkciA9IHRpbWluZy0+dmVyX2FkZHIgLSAxOworCXJhdy52ZXJfYmxhbmtfc3RhcnQgPSB0aW1pbmctPnZlcl9ibGFua19zdGFydCAtIDE7CisJcmF3LnZlcl9ibGFua19lbmQgPSB0aW1pbmctPnZlcl9ibGFua19lbmQgLSAxOworCXJhdy52ZXJfc3luY19zdGFydCA9IHRpbWluZy0+dmVyX3N5bmNfc3RhcnQgLSAxOworCXJhdy52ZXJfc3luY19lbmQgPSB0aW1pbmctPnZlcl9zeW5jX2VuZCAtIDE7CisKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDUwLCByYXcuaG9yX3RvdGFsICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHg1MSwgcmF3Lmhvcl9hZGRyICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHg1MiwgcmF3Lmhvcl9ibGFua19zdGFydCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NTMsIHJhdy5ob3JfYmxhbmtfZW5kICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHg1NCwgKHJhdy5ob3JfYmxhbmtfc3RhcnQgPj4gOCAmIDB4MDcpCisJCXwgKHJhdy5ob3JfYmxhbmtfZW5kID4+ICg4IC0gMykgJiAweDM4KQorCQl8IChyYXcuaG9yX3N5bmNfc3RhcnQgPj4gKDggLSA2KSAmIDB4QzApKTsKKwl2aWFfd3JpdGVfcmVnX21hc2soVklBQ1IsIDB4NTUsIChyYXcuaG9yX3RvdGFsID4+IDggJiAweDBGKQorCQl8IChyYXcuaG9yX2FkZHIgPj4gKDggLSA0KSAmIDB4NzApLCAweDdGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDU2LCByYXcuaG9yX3N5bmNfc3RhcnQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDU3LCByYXcuaG9yX3N5bmNfZW5kICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHg1OCwgcmF3LnZlcl90b3RhbCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NTksIHJhdy52ZXJfYWRkciAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUEsIHJhdy52ZXJfYmxhbmtfc3RhcnQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDVCLCByYXcudmVyX2JsYW5rX2VuZCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUMsIChyYXcudmVyX2JsYW5rX3N0YXJ0ID4+IDggJiAweDA3KQorCQl8IChyYXcudmVyX2JsYW5rX2VuZCA+PiAoOCAtIDMpICYgMHgzOCkKKwkJfCAocmF3Lmhvcl9zeW5jX2VuZCA+PiAoOCAtIDYpICYgMHg0MCkKKwkJfCAocmF3Lmhvcl9zeW5jX3N0YXJ0ID4+ICgxMCAtIDcpICYgMHg4MCkpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUQsIChyYXcudmVyX3RvdGFsID4+IDggJiAweDA3KQorCQl8IChyYXcudmVyX2FkZHIgPj4gKDggLSAzKSAmIDB4MzgpCisJCXwgKHJhdy5ob3JfYmxhbmtfZW5kID4+ICgxMSAtIDYpICYgMHg0MCkKKwkJfCAocmF3Lmhvcl9zeW5jX3N0YXJ0ID4+ICgxMSAtIDcpICYgMHg4MCkpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUUsIHJhdy52ZXJfc3luY19zdGFydCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUYsIChyYXcudmVyX3N5bmNfZW5kICYgMHgxRikKKwkJfCAocmF3LnZlcl9zeW5jX3N0YXJ0ID4+ICg4IC0gNSkgJiAweEUwKSk7Cit9CisKIHZvaWQgdmlhX3NldF9wcmltYXJ5X2FkZHJlc3ModTMyIGFkZHIpCiB7CiAJREVCVUdfTVNHKEtFUk5fREVCVUcgInZpYV9zZXRfcHJpbWFyeV9hZGRyZXNzKDB4JTA4WClcbiIsIGFkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhX21vZGVzZXR0aW5nLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuaAppbmRleCBhZTM1Y2ZkLi4wNmUwOWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuaApAQCAtMjgsNiArMjgsMjkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKKworI2RlZmluZSBWSUFfUElUQ0hfU0laRQkoMTw8MykKKyNkZWZpbmUgVklBX1BJVENIX01BWAkweDNGRjgKKworCitzdHJ1Y3QgZGlzcGxheV90aW1pbmcgeworCXUxNiBob3JfdG90YWw7CisJdTE2IGhvcl9hZGRyOworCXUxNiBob3JfYmxhbmtfc3RhcnQ7CisJdTE2IGhvcl9ibGFua19lbmQ7CisJdTE2IGhvcl9zeW5jX3N0YXJ0OworCXUxNiBob3Jfc3luY19lbmQ7CisJdTE2IHZlcl90b3RhbDsKKwl1MTYgdmVyX2FkZHI7CisJdTE2IHZlcl9ibGFua19zdGFydDsKKwl1MTYgdmVyX2JsYW5rX2VuZDsKKwl1MTYgdmVyX3N5bmNfc3RhcnQ7CisJdTE2IHZlcl9zeW5jX2VuZDsKK307CisKKwordm9pZCB2aWFfc2V0X3ByaW1hcnlfdGltaW5nKGNvbnN0IHN0cnVjdCBkaXNwbGF5X3RpbWluZyAqdGltaW5nKTsKK3ZvaWQgdmlhX3NldF9zZWNvbmRhcnlfdGltaW5nKGNvbnN0IHN0cnVjdCBkaXNwbGF5X3RpbWluZyAqdGltaW5nKTsKIHZvaWQgdmlhX3NldF9wcmltYXJ5X2FkZHJlc3ModTMyIGFkZHIpOwogdm9pZCB2aWFfc2V0X3NlY29uZGFyeV9hZGRyZXNzKHUzMiBhZGRyKTsKIHZvaWQgdmlhX3NldF9wcmltYXJ5X3BpdGNoKHUzMiBwaXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jIGIvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYwppbmRleCA1M2FhNDQzLi5hMTNjMjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYWZiZGV2LmMKQEAgLTM4LDggKzM4LDYgQEAKIHN0YXRpYyBpbnQgdmlhZmJfYnBwID0gMzI7CiBzdGF0aWMgaW50IHZpYWZiX2JwcDEgPSAzMjsKIAotc3RhdGljIHVuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfeHJlcyA9IDY0MDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdmlhZmJfc2Vjb25kX3lyZXMgPSA0ODA7CiBzdGF0aWMgdW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF9vZmZzZXQ7CiBzdGF0aWMgaW50IHZpYWZiX3NlY29uZF9zaXplOwogCkBAIC0xNTEsNyArMTQ5LDggQEAKIAogCWluZm8tPmZpeC52aXN1YWwgPQogCQlicHAgPT0gOCA/IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiA6IEZCX1ZJU1VBTF9UUlVFQ09MT1I7Ci0JaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKiBicHAgLyA4ICsgNykgJiB+NzsKKwlpbmZvLT5maXgubGluZV9sZW5ndGggPSBBTElHTihpbmZvLT52YXIueHJlc192aXJ0dWFsICogYnBwIC8gOCwKKwkJVklBX1BJVENIX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCB2aWFmYl9zZXR1cF9maXhpbmZvKHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LApAQCAtMjAwLDcgKzE5OSw2IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJaW50IGRlcHRoLCByZWZyZXNoOwotCXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm1vZGVfZW50cnk7CiAJc3RydWN0IHZpYWZiX3BhciAqcHBhciA9IGluZm8tPnBhcjsKIAl1MzIgbGluZTsKIApAQCAtMjEwLDggKzIwOCwxMCBAQAogCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCB8fCB2YXItPnZtb2RlICYgRkJfVk1PREVfRE9VQkxFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZtb2RlX2VudHJ5ID0gdmlhZmJfZ2V0X21vZGUodmFyLT54cmVzLCB2YXItPnlyZXMpOwotCWlmICghdm1vZGVfZW50cnkpIHsKKwkvKiB0aGUgcmVmcmVzaCByYXRlIGlzIG5vdCBpbXBvcnRhbnQgaGVyZSwgYXMgd2Ugb25seSB3YW50IHRvIGtub3cKKwkgKiB3aGV0aGVyIHRoZSByZXNvbHV0aW9uIGV4aXN0cworCSAqLworCWlmICghdmlhZmJfZ2V0X2Jlc3RfbW9kZSh2YXItPnhyZXMsIHZhci0+eXJlcywgNjApKSB7CiAJCURFQlVHX01TRyhLRVJOX0lORk8KIAkJCSAgInZpYWZiOiBNb2RlICVkeCVkeCVkIG5vdCBzdXBwb3J0ZWQhIVxuIiwKIAkJCSAgdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwpAQCAtMjM4LDggKzIzOCwxMiBAQAogCQlkZXB0aCA9IDI0OwogCiAJdmlhZmJfZmlsbF92YXJfY29sb3JfaW5mbyh2YXIsIGRlcHRoKTsKLQlsaW5lID0gKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDggKyA3KSAmIH43OwotCWlmIChsaW5lICogdmFyLT55cmVzX3ZpcnR1YWwgPiBwcGFyLT5tZW1zaXplKQorCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykKKwkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CisKKwlsaW5lID0gQUxJR04odmFyLT54cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCwKKwkJVklBX1BJVENIX1NJWkUpOworCWlmIChsaW5lID4gVklBX1BJVENIX01BWCB8fCBsaW5lICogdmFyLT55cmVzX3ZpcnR1YWwgPiBwcGFyLT5tZW1zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEJhc2VkIG9uIHZhciBwYXNzZWQgaW4gdG8gY2FsY3VsYXRlIHRoZSByZWZyZXNoLApAQCAtMjQ5LDcgKzI1Myw4IEBACiAJCWdldF92YXJfcmVmcmVzaCh2YXIpKTsKIAogCS8qIEFkanVzdCB2YXIgYWNjb3JkaW5nIHRvIG91ciBkcml2ZXIncyBvd24gdGFibGUgKi8KLQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbyh2YXIsIHJlZnJlc2gsIHZtb2RlX2VudHJ5KTsKKwl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbyh2YXIsCisJCXZpYWZiX2dldF9iZXN0X21vZGUodmFyLT54cmVzLCB2YXItPnlyZXMsIHJlZnJlc2gpKTsKIAlpZiAodmFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUICYmCiAJCSFwcGFyLT5zaGFyZWQtPnZkZXYtPmVuZ2luZV9tbWlvKQogCQl2YXItPmFjY2VsX2ZsYWdzID0gMDsKQEAgLTI2MCw3ICsyNjUsNiBAQAogc3RhdGljIGludCB2aWFmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCB2aWFmYl9wYXIgKnZpYXBhciA9IGluZm8tPnBhcjsKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX2VudHJ5LCAqdm1vZGVfZW50cnkxID0gTlVMTDsKIAlpbnQgcmVmcmVzaDsKIAlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9zZXRfcGFyIVxuIik7CiAKQEAgLTI2OSwxMCArMjczLDcgQEAKIAl2aWFmYl91cGRhdGVfZGV2aWNlX3NldHRpbmcodmlhZmJpbmZvLT52YXIueHJlcywgdmlhZmJpbmZvLT52YXIueXJlcywKIAkJdmlhZmJpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsIDApOwogCi0Jdm1vZGVfZW50cnkgPSB2aWFmYl9nZXRfbW9kZSh2aWFmYmluZm8tPnZhci54cmVzLCB2aWFmYmluZm8tPnZhci55cmVzKTsKIAlpZiAodmlhZmJfZHVhbF9mYikgewotCQl2bW9kZV9lbnRyeTEgPSB2aWFmYl9nZXRfbW9kZSh2aWFmYmluZm8xLT52YXIueHJlcywKLQkJCXZpYWZiaW5mbzEtPnZhci55cmVzKTsKIAkJdmlhZmJfdXBkYXRlX2RldmljZV9zZXR0aW5nKHZpYWZiaW5mbzEtPnZhci54cmVzLAogCQkJdmlhZmJpbmZvMS0+dmFyLnlyZXMsIHZpYWZiaW5mbzEtPnZhci5iaXRzX3Blcl9waXhlbCwKIAkJCTEpOwpAQCAtMjgwLDggKzI4MSw2IEBACiAJCURFQlVHX01TRyhLRVJOX0lORk8KIAkJInZpYWZiX3NlY29uZF94cmVzID0gJWQsIHZpYWZiX3NlY29uZF95cmVzID0gJWQsIGJwcCA9ICVkXG4iLAogCQkJICB2aWFmYl9zZWNvbmRfeHJlcywgdmlhZmJfc2Vjb25kX3lyZXMsIHZpYWZiX2JwcDEpOwotCQl2bW9kZV9lbnRyeTEgPSB2aWFmYl9nZXRfbW9kZSh2aWFmYl9zZWNvbmRfeHJlcywKLQkJCXZpYWZiX3NlY29uZF95cmVzKTsKIAogCQl2aWFmYl91cGRhdGVfZGV2aWNlX3NldHRpbmcodmlhZmJfc2Vjb25kX3hyZXMsCiAJCQl2aWFmYl9zZWNvbmRfeXJlcywgdmlhZmJfYnBwMSwgMSk7CkBAIC0yODksNyArMjg4LDggQEAKIAogCXJlZnJlc2ggPSB2aWFmYl9nZXRfcmVmcmVzaChpbmZvLT52YXIueHJlcywgaW5mby0+dmFyLnlyZXMsCiAJCWdldF92YXJfcmVmcmVzaCgmaW5mby0+dmFyKSk7Ci0JaWYgKHZtb2RlX2VudHJ5KSB7CisJaWYgKHZpYWZiX2dldF9iZXN0X21vZGUodmlhZmJpbmZvLT52YXIueHJlcywgdmlhZmJpbmZvLT52YXIueXJlcywKKwkJcmVmcmVzaCkpIHsKIAkJaWYgKHZpYWZiX2R1YWxfZmIgJiYgdmlhcGFyLT5pZ2FfcGF0aCA9PSBJR0EyKSB7CiAJCQl2aWFmYl9icHAxID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwogCQkJdmlhZmJfcmVmcmVzaDEgPSByZWZyZXNoOwpAQCAtMzAyLDggKzMwMiw3IEBACiAJCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CiAJCWVsc2UKIAkJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOwotCQl2aWFmYl9zZXRtb2RlKHZtb2RlX2VudHJ5LCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCi0JCQl2bW9kZV9lbnRyeTEsIHZpYWZiX2JwcDEpOworCQl2aWFmYl9zZXRtb2RlKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwgdmlhZmJfYnBwMSk7CiAJCXZpYWZiX3Bhbl9kaXNwbGF5KCZpbmZvLT52YXIsIGluZm8pOwogCX0KIApAQCAtMzQ4LDggKzM0Nyw5IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHZpYWZiX3BhciAqdmlhcGFyID0gaW5mby0+cGFyOwotCXUzMiB2cmFtX2FkZHIgPSAodmFyLT55b2Zmc2V0ICogdmFyLT54cmVzX3ZpcnR1YWwgKyB2YXItPnhvZmZzZXQpCi0JCSogKHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4KSArIHZpYXBhci0+dnJhbV9hZGRyOworCXUzMiB2cmFtX2FkZHIgPSB2aWFwYXItPnZyYW1fYWRkcgorCQkrIHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aAorCQkrIHZhci0+eG9mZnNldCAqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDg7CiAKIAlERUJVR19NU0coS0VSTl9ERUJVRyAidmlhZmJfcGFuX2Rpc3BsYXksIGFkZHJlc3MgPSAlZFxuIiwgdnJhbV9hZGRyKTsKIAlpZiAoIXZpYWZiX2R1YWxfZmIpIHsKQEAgLTExNTgsNyArMTE1OCw4IEBACiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKIAkJaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJCXN0cmljdF9zdHJ0b3VsKHZhbHVlLCAwLCAodW5zaWduZWQgbG9uZyAqKSZyZWdfdmFsKTsKKwkJCWlmIChrc3RydG91OCh2YWx1ZSwgMCwgJnJlZ192YWwpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCURFQlVHX01TRyhLRVJOX0lORk8gIkRWUDA6cmVnX3ZhbFslbF09OiV4XG4iLCBpLAogCQkJCSAgcmVnX3ZhbCk7CiAJCQlzd2l0Y2ggKGkpIHsKQEAgLTEyMjgsNyArMTIyOSw4IEBACiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKIAkJaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJCXN0cmljdF9zdHJ0b3VsKHZhbHVlLCAwLCAodW5zaWduZWQgbG9uZyAqKSZyZWdfdmFsKTsKKwkJCWlmIChrc3RydG91OCh2YWx1ZSwgMCwgJnJlZ192YWwpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXN3aXRjaCAoaSkgewogCQkJY2FzZSAwOgogCQkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOUIsIFZJQUNSLApAQCAtMTI4Niw3ICsxMjg4LDggQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZlswXSwgYnVmZmVyLCBsZW5ndGgpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlidWZbbGVuZ3RoIC0gMV0gPSAnXDAnOwkvKkVuc3VyZSBlbmQgc3RyaW5nICovCi0Jc3RyaWN0X3N0cnRvdWwoJmJ1ZlswXSwgMCwgKHVuc2lnbmVkIGxvbmcgKikmcmVnX3ZhbCk7CisJaWYgKGtzdHJ0b3U4KGJ1ZiwgMCwgJnJlZ192YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NywgVklBQ1IsIHJlZ192YWwsIDB4MGYpOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTEzMjUsNyArMTMyOCw4IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZidWZbMF0sIGJ1ZmZlciwgbGVuZ3RoKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJYnVmW2xlbmd0aCAtIDFdID0gJ1wwJzsJLypFbnN1cmUgZW5kIHN0cmluZyAqLwotCXN0cmljdF9zdHJ0b3VsKCZidWZbMF0sIDAsICh1bnNpZ25lZCBsb25nICopJnJlZ192YWwpOworCWlmIChrc3RydG91OChidWYsIDAsICZyZWdfdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOwogCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTksIFZJQUNSLCByZWdfdmFsLCAweDBmKTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xMzk0LDggKzEzOTgsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKIAkJCWlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0JCQkJc3RyaWN0X3N0cnRvdWwodmFsdWUsIDAsCi0JCQkJCSh1bnNpZ25lZCBsb25nICopJnJlZ192YWwuRGF0YSk7CisJCQkJaWYgKGtzdHJ0b3U4KHZhbHVlLCAwLCAmcmVnX3ZhbC5EYXRhKSA8IDApCisJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCXN3aXRjaCAoaSkgewogCQkJCWNhc2UgMDoKIAkJCQkJcmVnX3ZhbC5JbmRleCA9IDB4MDg7CkBAIC0xNDMxLDggKzE0MzUsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKIAkJCWlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0JCQkJc3RyaWN0X3N0cnRvdWwodmFsdWUsIDAsCi0JCQkJCSh1bnNpZ25lZCBsb25nICopJnJlZ192YWwuRGF0YSk7CisJCQkJaWYgKGtzdHJ0b3U4KHZhbHVlLCAwLCAmcmVnX3ZhbC5EYXRhKSA8IDApCisJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCXN3aXRjaCAoaSkgewogCQkJCWNhc2UgMDoKIAkJCQkJcmVnX3ZhbC5JbmRleCA9IDB4MDg7CkBAIC0xNzI5LDcgKzE3MzMsNiBAQAogaW50IF9fZGV2aW5pdCB2aWFfZmJfcGNpX3Byb2JlKHN0cnVjdCB2aWFmYl9kZXYgKnZkZXYpCiB7CiAJdTMyIGRlZmF1bHRfeHJlcywgZGVmYXVsdF95cmVzOwotCXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm1vZGVfZW50cnk7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGRlZmF1bHRfdmFyOwogCWludCByYzsKIAl1MzIgdmlhZmJfcGFyX2xlbmd0aDsKQEAgLTE4MDIsNyArMTgwNSw2IEBACiAJfQogCiAJcGFyc2VfbW9kZSh2aWFmYl9tb2RlLCAmZGVmYXVsdF94cmVzLCAmZGVmYXVsdF95cmVzKTsKLQl2bW9kZV9lbnRyeSA9IHZpYWZiX2dldF9tb2RlKGRlZmF1bHRfeHJlcywgZGVmYXVsdF95cmVzKTsKIAlpZiAodmlhZmJfU0FNTV9PTiA9PSAxKQogCQlwYXJzZV9tb2RlKHZpYWZiX21vZGUxLCAmdmlhZmJfc2Vjb25kX3hyZXMsCiAJCQkmdmlhZmJfc2Vjb25kX3lyZXMpOwpAQCAtMTgxMiw5ICsxODE0LDggQEAKIAlkZWZhdWx0X3Zhci54cmVzX3ZpcnR1YWwgPSBkZWZhdWx0X3hyZXM7CiAJZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0gZGVmYXVsdF95cmVzOwogCWRlZmF1bHRfdmFyLmJpdHNfcGVyX3BpeGVsID0gdmlhZmJfYnBwOwotCXZpYWZiX2ZpbGxfdmFyX3RpbWluZ19pbmZvKCZkZWZhdWx0X3ZhciwgdmlhZmJfZ2V0X3JlZnJlc2goCi0JCWRlZmF1bHRfdmFyLnhyZXMsIGRlZmF1bHRfdmFyLnlyZXMsIHZpYWZiX3JlZnJlc2gpLAotCQl2aWFmYl9nZXRfbW9kZShkZWZhdWx0X3Zhci54cmVzLCBkZWZhdWx0X3Zhci55cmVzKSk7CisJdmlhZmJfZmlsbF92YXJfdGltaW5nX2luZm8oJmRlZmF1bHRfdmFyLCB2aWFmYl9nZXRfYmVzdF9tb2RlKAorCQlkZWZhdWx0X3Zhci54cmVzLCBkZWZhdWx0X3Zhci55cmVzLCB2aWFmYl9yZWZyZXNoKSk7CiAJdmlhZmJfc2V0dXBfZml4aW5mbygmdmlhZmJpbmZvLT5maXgsIHZpYXBhcmluZm8pOwogCXZpYWZiaW5mby0+dmFyID0gZGVmYXVsdF92YXI7CiAKQEAgLTE4NTMsOSArMTg1NCw4IEBACiAJCWRlZmF1bHRfdmFyLnhyZXNfdmlydHVhbCA9IHZpYWZiX3NlY29uZF94cmVzOwogCQlkZWZhdWx0X3Zhci55cmVzX3ZpcnR1YWwgPSB2aWFmYl9zZWNvbmRfeXJlczsKIAkJZGVmYXVsdF92YXIuYml0c19wZXJfcGl4ZWwgPSB2aWFmYl9icHAxOwotCQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbygmZGVmYXVsdF92YXIsIHZpYWZiX2dldF9yZWZyZXNoKAotCQkJZGVmYXVsdF92YXIueHJlcywgZGVmYXVsdF92YXIueXJlcywgdmlhZmJfcmVmcmVzaDEpLAotCQkJdmlhZmJfZ2V0X21vZGUoZGVmYXVsdF92YXIueHJlcywgZGVmYXVsdF92YXIueXJlcykpOworCQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbygmZGVmYXVsdF92YXIsIHZpYWZiX2dldF9iZXN0X21vZGUoCisJCQlkZWZhdWx0X3Zhci54cmVzLCBkZWZhdWx0X3Zhci55cmVzLCB2aWFmYl9yZWZyZXNoMSkpOwogCiAJCXZpYWZiX3NldHVwX2ZpeGluZm8oJnZpYWZiaW5mbzEtPmZpeCwgdmlhcGFyaW5mbzEpOwogCQl2aWFmYl9jaGVja192YXIoJmRlZmF1bHRfdmFyLCB2aWFmYmluZm8xKTsKQEAgLTE5NTAsNjEgKzE5NTAsNjcgQEAKIAkJaWYgKCEqdGhpc19vcHQpCiAJCQljb250aW51ZTsKIAotCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9tb2RlMT0iLCAxMikpCisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX21vZGUxPSIsIDEyKSkgewogCQkJdmlhZmJfbW9kZTEgPSBrc3RyZHVwKHRoaXNfb3B0ICsgMTIsIEdGUF9LRVJORUwpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX21vZGU9IiwgMTEpKQorCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfbW9kZT0iLCAxMSkpIHsKIAkJCXZpYWZiX21vZGUgPSBrc3RyZHVwKHRoaXNfb3B0ICsgMTEsIEdGUF9LRVJORUwpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2JwcDE9IiwgMTEpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxMSwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9icHAxKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9icHA9IiwgMTApKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxMCwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9icHApOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX3JlZnJlc2gxPSIsIDE1KSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMTUsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfcmVmcmVzaDEpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX3JlZnJlc2g9IiwgMTQpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxNCwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9yZWZyZXNoKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfZHNwX21ldGhvZD0iLCAyMSkpCi0JCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDIxLCAwLAotCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX2xjZF9kc3BfbWV0aG9kKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfcGFuZWxfaWQ9IiwgMTkpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxOSwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9sY2RfcGFuZWxfaWQpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2FjY2VsPSIsIDEyKSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMTIsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfYWNjZWwpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX1NBTU1fT049IiwgMTQpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxNCwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9TQU1NX09OKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9hY3RpdmVfZGV2PSIsIDE3KSkKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2JwcDE9IiwgMTEpKSB7CisJCQlpZiAoa3N0cnRvdWludCh0aGlzX29wdCArIDExLCAwLCAmdmlhZmJfYnBwMSkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfYnBwPSIsIDEwKSkgeworCQkJaWYgKGtzdHJ0b3VpbnQodGhpc19vcHQgKyAxMCwgMCwgJnZpYWZiX2JwcCkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfcmVmcmVzaDE9IiwgMTUpKSB7CisJCQlpZiAoa3N0cnRvaW50KHRoaXNfb3B0ICsgMTUsIDAsICZ2aWFmYl9yZWZyZXNoMSkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfcmVmcmVzaD0iLCAxNCkpIHsKKwkJCWlmIChrc3RydG9pbnQodGhpc19vcHQgKyAxNCwgMCwgJnZpYWZiX3JlZnJlc2gpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2xjZF9kc3BfbWV0aG9kPSIsIDIxKSkgeworCQkJaWYgKGtzdHJ0b2ludCh0aGlzX29wdCArIDIxLCAwLAorCQkJCSAgICAgICZ2aWFmYl9sY2RfZHNwX21ldGhvZCkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfbGNkX3BhbmVsX2lkPSIsIDE5KSkgeworCQkJaWYgKGtzdHJ0b2ludCh0aGlzX29wdCArIDE5LCAwLAorCQkJCSAgICAgICZ2aWFmYl9sY2RfcGFuZWxfaWQpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2FjY2VsPSIsIDEyKSkgeworCQkJaWYgKGtzdHJ0b2ludCh0aGlzX29wdCArIDEyLCAwLCAmdmlhZmJfYWNjZWwpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX1NBTU1fT049IiwgMTQpKSB7CisJCQlpZiAoa3N0cnRvaW50KHRoaXNfb3B0ICsgMTQsIDAsICZ2aWFmYl9TQU1NX09OKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9hY3RpdmVfZGV2PSIsIDE3KSkgewogCQkJdmlhZmJfYWN0aXZlX2RldiA9IGtzdHJkdXAodGhpc19vcHQgKyAxNywgR0ZQX0tFUk5FTCk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LAotCQkJInZpYWZiX2Rpc3BsYXlfaGFyZHdhcmVfbGF5b3V0PSIsIDMwKSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMzAsIDAsCi0JCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9kaXNwbGF5X2hhcmR3YXJlX2xheW91dCk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfc2Vjb25kX3NpemU9IiwgMTgpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxOCwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9zZWNvbmRfc2l6ZSk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LAotCQkJInZpYWZiX3BsYXRmb3JtX2VwaWFfZHZpPSIsIDI0KSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMjQsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfcGxhdGZvcm1fZXBpYV9kdmkpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwKLQkJCSJ2aWFmYl9kZXZpY2VfbGNkX2R1YWxlZGdlPSIsIDI2KSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMjYsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfZGV2aWNlX2xjZF9kdWFsZWRnZSk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfYnVzX3dpZHRoPSIsIDE2KSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMTYsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfYnVzX3dpZHRoKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfbW9kZT0iLCAxNSkpCi0JCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDE1LCAwLAotCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX2xjZF9tb2RlKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfcG9ydD0iLCAxNSkpCisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsCisJCQkidmlhZmJfZGlzcGxheV9oYXJkd2FyZV9sYXlvdXQ9IiwgMzApKSB7CisJCQlpZiAoa3N0cnRvaW50KHRoaXNfb3B0ICsgMzAsIDAsCisJCQkJICAgICAgJnZpYWZiX2Rpc3BsYXlfaGFyZHdhcmVfbGF5b3V0KSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9zZWNvbmRfc2l6ZT0iLCAxOCkpIHsKKwkJCWlmIChrc3RydG9pbnQodGhpc19vcHQgKyAxOCwgMCwgJnZpYWZiX3NlY29uZF9zaXplKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsCisJCQkidmlhZmJfcGxhdGZvcm1fZXBpYV9kdmk9IiwgMjQpKSB7CisJCQlpZiAoa3N0cnRvaW50KHRoaXNfb3B0ICsgMjQsIDAsCisJCQkJICAgICAgJnZpYWZiX3BsYXRmb3JtX2VwaWFfZHZpKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsCisJCQkidmlhZmJfZGV2aWNlX2xjZF9kdWFsZWRnZT0iLCAyNikpIHsKKwkJCWlmIChrc3RydG9pbnQodGhpc19vcHQgKyAyNiwgMCwKKwkJCQkgICAgICAmdmlhZmJfZGV2aWNlX2xjZF9kdWFsZWRnZSkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfYnVzX3dpZHRoPSIsIDE2KSkgeworCQkJaWYgKGtzdHJ0b2ludCh0aGlzX29wdCArIDE2LCAwLCAmdmlhZmJfYnVzX3dpZHRoKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfbW9kZT0iLCAxNSkpIHsKKwkJCWlmIChrc3RydG9pbnQodGhpc19vcHQgKyAxNSwgMCwgJnZpYWZiX2xjZF9tb2RlKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfcG9ydD0iLCAxNSkpIHsKIAkJCXZpYWZiX2xjZF9wb3J0ID0ga3N0cmR1cCh0aGlzX29wdCArIDE1LCBHRlBfS0VSTkVMKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9kdmlfcG9ydD0iLCAxNSkpCisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9kdmlfcG9ydD0iLCAxNSkpIHsKIAkJCXZpYWZiX2R2aV9wb3J0ID0ga3N0cmR1cCh0aGlzX29wdCArIDE1LCBHRlBfS0VSTkVMKTsKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTIwMjgsOSArMjAzNCw5IEBACiAJCXJldHVybiByOwogI2VuZGlmCiAJaWYgKHBhcnNlX21vZGUodmlhZmJfbW9kZSwgJmR1bW15X3gsICZkdW1teV95KQotCQl8fCAhdmlhZmJfZ2V0X21vZGUoZHVtbXlfeCwgZHVtbXlfeSkKKwkJfHwgIXZpYWZiX2dldF9iZXN0X21vZGUoZHVtbXlfeCwgZHVtbXlfeSwgdmlhZmJfcmVmcmVzaCkKIAkJfHwgcGFyc2VfbW9kZSh2aWFmYl9tb2RlMSwgJmR1bW15X3gsICZkdW1teV95KQotCQl8fCAhdmlhZmJfZ2V0X21vZGUoZHVtbXlfeCwgZHVtbXlfeSkKKwkJfHwgIXZpYWZiX2dldF9iZXN0X21vZGUoZHVtbXlfeCwgZHVtbXlfeSwgdmlhZmJfcmVmcmVzaDEpCiAJCXx8IHZpYWZiX2JwcCA8IDAgfHwgdmlhZmJfYnBwID4gMzIKIAkJfHwgdmlhZmJfYnBwMSA8IDAgfHwgdmlhZmJfYnBwMSA+IDMyCiAJCXx8IHBhcnNlX2FjdGl2ZV9kZXYoKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYW1vZGUuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYW1vZGUuYwppbmRleCA1OGRmNzRlLi4wOTExY2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFtb2RlLmMKKysrIGIvZHJpdmVycy92aWRlby92aWEvdmlhbW9kZS5jCkBAIC0yODEsNyArMjgxLDcgQEAKIAkvKnJfcmF0ZSxoc3AsdnNwICovCiAJLypIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCiAJe1JFRlJFU0hfNjAsIE02NDBYNDgwX1I2MF9IU1AsIE02NDBYNDgwX1I2MF9WU1AsCi0JIHs4MDAsIDY0MCwgNjQ4LCAxNDQsIDY1NiwgOTYsIDUyNSwgNDgwLCA0ODAsIDQ1LCA0OTAsIDJ9IH0sCisJIHs4MDAsIDY0MCwgNjQwLCAxNjAsIDY1NiwgOTYsIDUyNSwgNDgwLCA0ODAsIDQ1LCA0OTAsIDJ9IH0sCiAJe1JFRlJFU0hfNzUsIE02NDBYNDgwX1I3NV9IU1AsIE02NDBYNDgwX1I3NV9WU1AsCiAJIHs4NDAsIDY0MCwgNjQwLCAyMDAsIDY1NiwgNjQsIDUwMCwgNDgwLCA0ODAsIDIwLCA0ODEsIDN9IH0sCiAJe1JFRlJFU0hfODUsIE02NDBYNDgwX1I4NV9IU1AsIE02NDBYNDgwX1I4NV9WU1AsCkBAIC04NjMsMjYgKzg2Myw1NiBAQAogaW50IE5VTV9UT1RBTF9QQVRDSF9NT0RFID0gQVJSQVlfU0laRShyZXNfcGF0Y2hfdGFibGUpOwogCiAKLXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdmlhZmJfZ2V0X21vZGUoaW50IGhyZXMsIGludCB2cmVzKQorc3RhdGljIHN0cnVjdCBWaWRlb01vZGVUYWJsZSAqZ2V0X21vZGVzKHN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm10LCBpbnQgbiwKKwlpbnQgaHJlcywgaW50IHZyZXMpCiB7Ci0JdTMyIGk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmlhZmJfbW9kZXMpOyBpKyspCi0JCWlmICh2aWFmYl9tb2Rlc1tpXS5tb2RlX2FycmF5ICYmCi0JCQl2aWFmYl9tb2Rlc1tpXS5jcnRjWzBdLmNydGMuaG9yX2FkZHIgPT0gaHJlcyAmJgotCQkJdmlhZmJfbW9kZXNbaV0uY3J0Y1swXS5jcnRjLnZlcl9hZGRyID09IHZyZXMpCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlpZiAodm10W2ldLm1vZGVfYXJyYXkgJiYKKwkJCXZtdFtpXS5jcnRjWzBdLmNydGMuaG9yX2FkZHIgPT0gaHJlcyAmJgorCQkJdm10W2ldLmNydGNbMF0uY3J0Yy52ZXJfYWRkciA9PSB2cmVzKQogCQkJcmV0dXJuICZ2aWFmYl9tb2Rlc1tpXTsKIAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpYWZiX2dldF9yYl9tb2RlKGludCBocmVzLCBpbnQgdnJlcykKK3N0YXRpYyBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmdldF9iZXN0X21vZGUoc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bXQsCisJaW50IHJlZnJlc2gpCiB7Ci0JdTMyIGk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmlhZmJfcmJfbW9kZXMpOyBpKyspCi0JCWlmICh2aWFmYl9yYl9tb2Rlc1tpXS5tb2RlX2FycmF5ICYmCi0JCQl2aWFmYl9yYl9tb2Rlc1tpXS5jcnRjWzBdLmNydGMuaG9yX2FkZHIgPT0gaHJlcyAmJgotCQkJdmlhZmJfcmJfbW9kZXNbaV0uY3J0Y1swXS5jcnRjLnZlcl9hZGRyID09IHZyZXMpCi0JCQlyZXR1cm4gJnZpYWZiX3JiX21vZGVzW2ldOworCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqYmVzdDsKKwlpbnQgaTsKIAotCXJldHVybiBOVUxMOworCWlmICghdm10KQorCQlyZXR1cm4gTlVMTDsKKworCWJlc3QgPSAmdm10LT5jcnRjWzBdOworCWZvciAoaSA9IDE7IGkgPCB2bXQtPm1vZGVfYXJyYXk7IGkrKykgeworCQlpZiAoYWJzKHZtdC0+Y3J0Y1tpXS5yZWZyZXNoX3JhdGUgLSByZWZyZXNoKQorCQkJPCBhYnMoYmVzdC0+cmVmcmVzaF9yYXRlIC0gcmVmcmVzaCkpCisJCQliZXN0ID0gJnZtdC0+Y3J0Y1tpXTsKKwl9CisKKwlyZXR1cm4gYmVzdDsKK30KKworc3RhdGljIHN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdmlhZmJfZ2V0X21vZGUoaW50IGhyZXMsIGludCB2cmVzKQoreworCXJldHVybiBnZXRfbW9kZXModmlhZmJfbW9kZXMsIEFSUkFZX1NJWkUodmlhZmJfbW9kZXMpLCBocmVzLCB2cmVzKTsKK30KKworc3RydWN0IGNydF9tb2RlX3RhYmxlICp2aWFmYl9nZXRfYmVzdF9tb2RlKGludCBocmVzLCBpbnQgdnJlcywgaW50IHJlZnJlc2gpCit7CisJcmV0dXJuIGdldF9iZXN0X21vZGUodmlhZmJfZ2V0X21vZGUoaHJlcywgdnJlcyksIHJlZnJlc2gpOworfQorCitzdGF0aWMgc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2aWFmYl9nZXRfcmJfbW9kZShpbnQgaHJlcywgaW50IHZyZXMpCit7CisJcmV0dXJuIGdldF9tb2Rlcyh2aWFmYl9yYl9tb2RlcywgQVJSQVlfU0laRSh2aWFmYl9yYl9tb2RlcyksIGhyZXMsCisJCXZyZXMpOworfQorCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKnZpYWZiX2dldF9iZXN0X3JiX21vZGUoaW50IGhyZXMsIGludCB2cmVzLCBpbnQgcmVmcmVzaCkKK3sKKwlyZXR1cm4gZ2V0X2Jlc3RfbW9kZSh2aWFmYl9nZXRfcmJfbW9kZShocmVzLCB2cmVzKSwgcmVmcmVzaCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFtb2RlLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFtb2RlLmgKaW5kZXggMzc1MTI4OS4uNTkxN2EyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvdmlhbW9kZS5oCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYW1vZGUuaApAQCAtNjAsNyArNjAsNyBAQAogZXh0ZXJuIHN0cnVjdCBwYXRjaF90YWJsZSByZXNfcGF0Y2hfdGFibGVbXTsKIGV4dGVybiBzdHJ1Y3QgVlBJVFRhYmxlIFZQSVQ7CiAKLXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdmlhZmJfZ2V0X21vZGUoaW50IGhyZXMsIGludCB2cmVzKTsKLXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdmlhZmJfZ2V0X3JiX21vZGUoaW50IGhyZXMsIGludCB2cmVzKTsKK3N0cnVjdCBjcnRfbW9kZV90YWJsZSAqdmlhZmJfZ2V0X2Jlc3RfbW9kZShpbnQgaHJlcywgaW50IHZyZXMsIGludCByZWZyZXNoKTsKK3N0cnVjdCBjcnRfbW9kZV90YWJsZSAqdmlhZmJfZ2V0X2Jlc3RfcmJfbW9kZShpbnQgaHJlcywgaW50IHZyZXMsIGludCByZWZyZXNoKTsKIAogI2VuZGlmIC8qIF9fVklBTU9ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdnQ4NTAwbGNkZmIuYyBiL2RyaXZlcnMvdmlkZW8vdnQ4NTAwbGNkZmIuYwppbmRleCAwZTEyMGQ2Li43NzdjMjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Z0ODUwMGxjZGZiLmMKKysrIGIvZHJpdmVycy92aWRlby92dDg1MDBsY2RmYi5jCkBAIC0yMTAsOCArMjEwLDggQEAKIAlzdHJ1Y3QgdnQ4NTAwbGNkX2luZm8gKmZiaSA9IHRvX3Z0ODUwMGxjZF9pbmZvKGluZm8pOwogCiAJd3JpdGVsKCgxIDw8IDMxKQotCQl8ICgoKHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzKSAqIHBpeGxlbiAvIDQpIDw8IDIwKQotCQl8IChvZmYgPj4gMiksIGZiaS0+cmVnYmFzZSArIDB4MjApOworCSAgICAgfCAoKChpbmZvLT52YXIueHJlc192aXJ0dWFsIC0gaW5mby0+dmFyLnhyZXMpICogcGl4bGVuIC8gNCkgPDwgMjApCisJICAgICB8IChvZmYgPj4gMiksIGZiaS0+cmVnYmFzZSArIDB4MjApOwogCXJldHVybiAwOwogfQogCkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJZ290byBmYWlsZWRfZnJlZV9wYWxldHRlOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdnQ4NTAwbGNkX2hhbmRsZV9pcnEsIElSUUZfRElTQUJMRUQsICJMQ0QiLCBmYmkpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdnQ4NTAwbGNkX2hhbmRsZV9pcnEsIDAsICJMQ0QiLCBmYmkpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJcmV0ID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92dDg2MjNmYi5jIGIvZHJpdmVycy92aWRlby92dDg2MjNmYi5jCmluZGV4IGY5YjNlM2QuLjRlNzRkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdnQ4NjIzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3Z0ODYyM2ZiLmMKQEAgLTYyMCwxMyArNjIwLDE0IEBACiAJdW5zaWduZWQgaW50IG9mZnNldDsKIAogCS8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0ICovCi0JaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMCkgewotCQlvZmZzZXQgPSAodmFyLT55b2Zmc2V0IC8gMTYpICogdmFyLT54cmVzX3ZpcnR1YWwgKyB2YXItPnhvZmZzZXQ7CisJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSAwKSB7CisJCW9mZnNldCA9ICh2YXItPnlvZmZzZXQgLyAxNikgKiBpbmZvLT52YXIueHJlc192aXJ0dWFsCisJCSAgICAgICArIHZhci0+eG9mZnNldDsKIAkJb2Zmc2V0ID0gb2Zmc2V0ID4+IDM7CiAJfSBlbHNlIHsKIAkJb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCkgKwotCQkJICh2YXItPnhvZmZzZXQgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCk7Ci0JCW9mZnNldCA9IG9mZnNldCA+PiAoKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gNCkgPyAyIDogMSk7CisJCQkgKHZhci0+eG9mZnNldCAqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOworCQlvZmZzZXQgPSBvZmZzZXQgPj4gKChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gNCkgPyAyIDogMSk7CiAJfQogCiAJLyogU2V0IHRoZSBvZmZzZXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdzEwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3cxMDBmYi5jCmluZGV4IGM4YmU4YWYuLjIzNzVlNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdzEwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby93MTAwZmIuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8veGlsaW54ZmIuYyBiL2RyaXZlcnMvdmlkZW8veGlsaW54ZmIuYwppbmRleCA3N2RlYTAxLi5mY2I2Y2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3hpbGlueGZiLmMKKysrIGIvZHJpdmVycy92aWRlby94aWxpbnhmYi5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydC9mc2xfaHlwZXJ2aXNvci5jIGIvZHJpdmVycy92aXJ0L2ZzbF9oeXBlcnZpc29yLmMKaW5kZXggM2Q5MTYyMS4uNDkzOWUwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0L2ZzbF9oeXBlcnZpc29yLmMKKysrIGIvZHJpdmVycy92aXJ0L2ZzbF9oeXBlcnZpc29yLmMKQEAgLTcwNiw2ICs3MDYsNyBAQAogCS5wb2xsID0gZnNsX2h2X3BvbGwsCiAJLnJlYWQgPSBmc2xfaHZfcmVhZCwKIAkudW5sb2NrZWRfaW9jdGwgPSBmc2xfaHZfaW9jdGwsCisJLmNvbXBhdF9pb2N0bCA9IGZzbF9odl9pb2N0bCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBmc2xfaHZfbWlzY19kZXYgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby9LY29uZmlnIGIvZHJpdmVycy92aXJ0aW8vS2NvbmZpZwppbmRleCA1N2U0OTNiLi44MTZlZDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlydGlvL0tjb25maWcKQEAgLTM1LDQgKzM1LDE1IEBACiAKIAkgSWYgdW5zdXJlLCBzYXkgTS4KIAorIGNvbmZpZyBWSVJUSU9fTU1JTworIAl0cmlzdGF0ZSAiUGxhdGZvcm0gYnVzIGRyaXZlciBmb3IgbWVtb3J5IG1hcHBlZCB2aXJ0aW8gZGV2aWNlcyAoRVhQRVJJTUVOVEFMKSIKKyAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKyAJc2VsZWN0IFZJUlRJTworIAlzZWxlY3QgVklSVElPX1JJTkcKKyAJLS0taGVscC0tLQorIAkgVGhpcyBkcml2ZXJzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIG1lbW9yeSBtYXBwZWQgdmlydGlvCisJIHBsYXRmb3JtIGRldmljZSBkcml2ZXIuCisKKyAJIElmIHVuc3VyZSwgc2F5IE4uCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL01ha2VmaWxlIGIvZHJpdmVycy92aXJ0aW8vTWFrZWZpbGUKaW5kZXggNjczOGM0NC4uNWE0YzYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aXJ0aW8vTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiBvYmotJChDT05GSUdfVklSVElPKSArPSB2aXJ0aW8ubwogb2JqLSQoQ09ORklHX1ZJUlRJT19SSU5HKSArPSB2aXJ0aW9fcmluZy5vCitvYmotJChDT05GSUdfVklSVElPX01NSU8pICs9IHZpcnRpb19tbWlvLm8KIG9iai0kKENPTkZJR19WSVJUSU9fUENJKSArPSB2aXJ0aW9fcGNpLm8KIG9iai0kKENPTkZJR19WSVJUSU9fQkFMTE9PTikgKz0gdmlydGlvX2JhbGxvb24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW8uYwppbmRleCBlZmIzNWFhLi45ODRjNTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW8uYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW8uYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC92aXJ0aW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogVW5pcXVlIG51bWJlcmluZyBmb3IgdmlydGlvIGRldmljZXMuICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGRldl9pbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fYmFsbG9vbi5jCmluZGV4IGUwNThhY2UuLjk0ZmQ3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IHZpcnRpb19iYWxsb29uCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fbW1pby5jIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX21taW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2M1ZTQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX21taW8uYwpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIFZpcnRpbyBtZW1vcnkgbWFwcGVkIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSwgQVJNIEx0ZC4KKyAqCisgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdmlydGlvIGRldmljZXMgdG8gYmUgdXNlZCBvdmVyIGEgdmlydHVhbCwgbWVtb3J5IG1hcHBlZAorICogcGxhdGZvcm0gZGV2aWNlLgorICoKKyAqIFJlZ2lzdGVycyBsYXlvdXQgKGFsbCAzMi1iaXQgd2lkZSk6CisgKgorICogb2Zmc2V0IGQuIG5hbWUgICAgICAgICAgICAgZGVzY3JpcHRpb24KKyAqIC0tLS0tLSAtLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogMHgwMDAgIFIgIE1hZ2ljVmFsdWUgICAgICAgTWFnaWMgdmFsdWUgInZpcnQiCisgKiAweDAwNCAgUiAgVmVyc2lvbiAgICAgICAgICBEZXZpY2UgdmVyc2lvbiAoY3VycmVudCBtYXguIDEpCisgKiAweDAwOCAgUiAgRGV2aWNlSUQgICAgICAgICBWaXJ0aW8gZGV2aWNlIElECisgKiAweDAwYyAgUiAgVmVuZG9ySUQgICAgICAgICBWaXJ0aW8gdmVuZG9yIElECisgKgorICogMHgwMTAgIFIgIEhvc3RGZWF0dXJlcyAgICAgRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBob3N0CisgKiAweDAxNCAgVyAgSG9zdEZlYXR1cmVzU2VsICBTZXQgb2YgaG9zdCBmZWF0dXJlcyB0byBhY2Nlc3MgdmlhIEhvc3RGZWF0dXJlcworICoKKyAqIDB4MDIwICBXICBHdWVzdEZlYXR1cmVzICAgIEZlYXR1cmVzIGFjdGl2YXRlZCBieSB0aGUgZ3Vlc3QKKyAqIDB4MDI0ICBXICBHdWVzdEZlYXR1cmVzU2VsIFNldCBvZiBhY3RpdmF0ZWQgZmVhdHVyZXMgdG8gc2V0IHZpYSBHdWVzdEZlYXR1cmVzCisgKiAweDAyOCAgVyAgR3Vlc3RQYWdlU2l6ZSAgICBTaXplIG9mIGd1ZXN0J3MgbWVtb3J5IHBhZ2UgaW4gYnl0ZXMKKyAqCisgKiAweDAzMCAgVyAgUXVldWVTZWwgICAgICAgICBRdWV1ZSBzZWxlY3RvcgorICogMHgwMzQgIFIgIFF1ZXVlTnVtTWF4ICAgICAgTWF4aW11bSBzaXplIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUKKyAqIDB4MDM4ICBXICBRdWV1ZU51bSAgICAgICAgIFF1ZXVlIHNpemUgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUKKyAqIDB4MDNjICBXICBRdWV1ZUFsaWduICAgICAgIFVzZWQgUmluZyBhbGlnbm1lbnQgZm9yIHRoZSBjdXJyZW50IHF1ZXVlCisgKiAweDA0MCAgUlcgUXVldWVQRk4gICAgICAgICBQRk4gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUKKyAqCisgKiAweDA1MCAgVyAgUXVldWVOb3RpZnkgICAgICBRdWV1ZSBub3RpZmllcgorICogMHgwNjAgIFIgIEludGVycnVwdFN0YXR1cyAgSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgorICogMHgwNjAgIFcgIEludGVycnVwdEFDSyAgICAgSW50ZXJydXB0IGFja25vd2xlZGdlIHJlZ2lzdGVyCisgKiAweDA3MCAgUlcgU3RhdHVzICAgICAgICAgICBEZXZpY2Ugc3RhdHVzIHJlZ2lzdGVyCisgKgorICogMHgxMDArIFJXICAgICAgICAgICAgICAgICAgRGV2aWNlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqCisgKiBCYXNlZCBvbiBWaXJ0aW8gUENJIGRyaXZlciBieSBBbnRob255IExpZ3VvcmksIGNvcHlyaWdodCBJQk0gQ29ycC4gMjAwNworICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMiBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19tbWlvLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX3JpbmcuaD4KKworCisKKy8qIFRoZSBhbGlnbm1lbnQgdG8gdXNlIGJldHdlZW4gY29uc3VtZXIgYW5kIHByb2R1Y2VyIHBhcnRzIG9mIHZyaW5nLgorICogQ3VycmVudGx5IGhhcmRjb2RlZCB0byB0aGUgcGFnZSBzaXplLiAqLworI2RlZmluZSBWSVJUSU9fTU1JT19WUklOR19BTElHTgkJUEFHRV9TSVpFCisKKworCisjZGVmaW5lIHRvX3ZpcnRpb19tbWlvX2RldmljZShfcGxhdF9kZXYpIFwKKwljb250YWluZXJfb2YoX3BsYXRfZGV2LCBzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlLCB2ZGV2KQorCitzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlIHsKKwlzdHJ1Y3QgdmlydGlvX2RldmljZSB2ZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgbG9uZyB2ZXJzaW9uOworCisJLyogYSBsaXN0IG9mIHF1ZXVlcyBzbyB3ZSBjYW4gZGlzcGF0Y2ggSVJRcyAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZpcnRxdWV1ZXM7Cit9OworCitzdHJ1Y3QgdmlydGlvX21taW9fdnFfaW5mbyB7CisJLyogdGhlIGFjdHVhbCB2aXJ0cXVldWUgKi8KKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKKworCS8qIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcXVldWUgKi8KKwl1bnNpZ25lZCBpbnQgbnVtOworCisJLyogdGhlIGluZGV4IG9mIHRoZSBxdWV1ZSAqLworCWludCBxdWV1ZV9pbmRleDsKKworCS8qIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHJpbmcgcXVldWUgKi8KKwl2b2lkICpxdWV1ZTsKKworCS8qIHRoZSBsaXN0IG5vZGUgZm9yIHRoZSB2aXJ0cXVldWVzIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Cit9OworCisKKworLyogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgKi8KKworc3RhdGljIHUzMiB2bV9nZXRfZmVhdHVyZXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCisJLyogVE9ETzogRmVhdHVyZXMgPiAzMiBiaXRzICovCisJd3JpdGVsKDAsIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0hPU1RfRkVBVFVSRVNfU0VMKTsKKworCXJldHVybiByZWFkbCh2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19IT1NUX0ZFQVRVUkVTKTsKK30KKworc3RhdGljIHZvaWQgdm1fZmluYWxpemVfZmVhdHVyZXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCWludCBpOworCisJLyogR2l2ZSB2aXJ0aW9fcmluZyBhIGNoYW5jZSB0byBhY2NlcHQgZmVhdHVyZXMuICovCisJdnJpbmdfdHJhbnNwb3J0X2ZlYXR1cmVzKHZkZXYpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmRldi0+ZmVhdHVyZXMpOyBpKyspIHsKKwkJd3JpdGVsKGksIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0dVRVNUX0ZFQVRVUkVTX1NFVCk7CisJCXdyaXRlbCh2ZGV2LT5mZWF0dXJlc1tpXSwKKwkJCQl2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19HVUVTVF9GRUFUVVJFUyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2bV9nZXQoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG9mZnNldCwKKwkJICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCXU4ICpwdHIgPSBidWY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXB0cltpXSA9IHJlYWRiKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0NPTkZJRyArIG9mZnNldCArIGkpOworfQorCitzdGF0aWMgdm9pZCB2bV9zZXQoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG9mZnNldCwKKwkJICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCWNvbnN0IHU4ICpwdHIgPSBidWY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXdyaXRlYihwdHJbaV0sIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0NPTkZJRyArIG9mZnNldCArIGkpOworfQorCitzdGF0aWMgdTggdm1fZ2V0X3N0YXR1cyhzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbW1pb19kZXZpY2UodmRldik7CisKKwlyZXR1cm4gcmVhZGwodm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fU1RBVFVTKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIHZtX3NldF9zdGF0dXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHU4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbW1pb19kZXZpY2UodmRldik7CisKKwkvKiBXZSBzaG91bGQgbmV2ZXIgYmUgc2V0dGluZyBzdGF0dXMgdG8gMC4gKi8KKwlCVUdfT04oc3RhdHVzID09IDApOworCisJd3JpdGVsKHN0YXR1cywgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fU1RBVFVTKTsKK30KKworc3RhdGljIHZvaWQgdm1fcmVzZXQoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCisJLyogMCBzdGF0dXMgbWVhbnMgYSByZXNldC4gKi8KKwl3cml0ZWwoMCwgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fU1RBVFVTKTsKK30KKworCisKKy8qIFRyYW5zcG9ydCBpbnRlcmZhY2UgKi8KKworLyogdGhlIG5vdGlmeSBmdW5jdGlvbiB1c2VkIHdoZW4gY3JlYXRpbmcgYSB2aXJ0IHF1ZXVlICovCitzdGF0aWMgdm9pZCB2bV9ub3RpZnkoc3RydWN0IHZpcnRxdWV1ZSAqdnEpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZxLT52ZGV2KTsKKwlzdHJ1Y3QgdmlydGlvX21taW9fdnFfaW5mbyAqaW5mbyA9IHZxLT5wcml2OworCisJLyogV2Ugd3JpdGUgdGhlIHF1ZXVlJ3Mgc2VsZWN0b3IgaW50byB0aGUgbm90aWZpY2F0aW9uIHJlZ2lzdGVyIHRvCisJICogc2lnbmFsIHRoZSBvdGhlciBlbmQgKi8KKwl3cml0ZWwoaW5mby0+cXVldWVfaW5kZXgsIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1FVRVVFX05PVElGWSk7Cit9CisKKy8qIE5vdGlmeSBhbGwgdmlydHF1ZXVlcyBvbiBhbiBpbnRlcnJ1cHQuICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgdm1faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXYgPSBvcGFxdWU7CisJc3RydWN0IHZpcnRpb19tbWlvX3ZxX2luZm8gKmluZm87CisJc3RydWN0IHZpcnRpb19kcml2ZXIgKnZkcnYgPSBjb250YWluZXJfb2Yodm1fZGV2LT52ZGV2LmRldi5kcml2ZXIsCisJCQlzdHJ1Y3QgdmlydGlvX2RyaXZlciwgZHJpdmVyKTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCisJLyogUmVhZCBhbmQgYWNrbm93bGVkZ2UgaW50ZXJydXB0cyAqLworCXN0YXR1cyA9IHJlYWRsKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0lOVEVSUlVQVF9TVEFUVVMpOworCXdyaXRlbChzdGF0dXMsIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0lOVEVSUlVQVF9BQ0spOworCisJaWYgKHVubGlrZWx5KHN0YXR1cyAmIFZJUlRJT19NTUlPX0lOVF9DT05GSUcpCisJCQkmJiB2ZHJ2ICYmIHZkcnYtPmNvbmZpZ19jaGFuZ2VkKSB7CisJCXZkcnYtPmNvbmZpZ19jaGFuZ2VkKCZ2bV9kZXYtPnZkZXYpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAobGlrZWx5KHN0YXR1cyAmIFZJUlRJT19NTUlPX0lOVF9WUklORykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZ2bV9kZXYtPnZpcnRxdWV1ZXMsIG5vZGUpCisJCQlyZXQgfD0gdnJpbmdfaW50ZXJydXB0KGlycSwgaW5mby0+dnEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2bV9kZXYtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIHZvaWQgdm1fZGVsX3ZxKHN0cnVjdCB2aXJ0cXVldWUgKnZxKQoreworCXN0cnVjdCB2aXJ0aW9fbW1pb19kZXZpY2UgKnZtX2RldiA9IHRvX3ZpcnRpb19tbWlvX2RldmljZSh2cS0+dmRldik7CisJc3RydWN0IHZpcnRpb19tbWlvX3ZxX2luZm8gKmluZm8gPSB2cS0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBzaXplOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZpbmZvLT5ub2RlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2bV9kZXYtPmxvY2ssIGZsYWdzKTsKKworCXZyaW5nX2RlbF92aXJ0cXVldWUodnEpOworCisJLyogU2VsZWN0IGFuZCBkZWFjdGl2YXRlIHRoZSBxdWV1ZSAqLworCXdyaXRlbChpbmZvLT5xdWV1ZV9pbmRleCwgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fUVVFVUVfU0VMKTsKKwl3cml0ZWwoMCwgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fUVVFVUVfUEZOKTsKKworCXNpemUgPSBQQUdFX0FMSUdOKHZyaW5nX3NpemUoaW5mby0+bnVtLCBWSVJUSU9fTU1JT19WUklOR19BTElHTikpOworCWZyZWVfcGFnZXNfZXhhY3QoaW5mby0+cXVldWUsIHNpemUpOworCWtmcmVlKGluZm8pOworfQorCitzdGF0aWMgdm9pZCB2bV9kZWxfdnFzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQoreworCXN0cnVjdCB2aXJ0aW9fbW1pb19kZXZpY2UgKnZtX2RldiA9IHRvX3ZpcnRpb19tbWlvX2RldmljZSh2ZGV2KTsKKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cSwgKm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodnEsIG4sICZ2ZGV2LT52cXMsIGxpc3QpCisJCXZtX2RlbF92cSh2cSk7CisKKwlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHZtX2Rldi0+cGRldiwgMCksIHZtX2Rldik7Cit9CisKKworCitzdGF0aWMgc3RydWN0IHZpcnRxdWV1ZSAqdm1fc2V0dXBfdnEoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIGluZGV4LAorCQkJCSAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdmlydHF1ZXVlICp2cSksCisJCQkJICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB2aXJ0aW9fbW1pb19kZXZpY2UgKnZtX2RldiA9IHRvX3ZpcnRpb19tbWlvX2RldmljZSh2ZGV2KTsKKwlzdHJ1Y3QgdmlydGlvX21taW9fdnFfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBzaXplOworCWludCBlcnI7CisKKwkvKiBTZWxlY3QgdGhlIHF1ZXVlIHdlJ3JlIGludGVyZXN0ZWQgaW4gKi8KKwl3cml0ZWwoaW5kZXgsIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1FVRVVFX1NFTCk7CisKKwkvKiBRdWV1ZSBzaG91bGRuJ3QgYWxyZWFkeSBiZSBzZXQgdXAuICovCisJaWYgKHJlYWRsKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1FVRVVFX1BGTikpIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnJvcl9hdmFpbGFibGU7CisJfQorCisJLyogQWxsb2NhdGUgYW5kIGZpbGwgb3V0IG91ciBhY3RpdmUgcXVldWUgZGVzY3JpcHRpb24gKi8KKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9rbWFsbG9jOworCX0KKwlpbmZvLT5xdWV1ZV9pbmRleCA9IGluZGV4OworCisJLyogQWxsb2NhdGUgcGFnZXMgZm9yIHRoZSBxdWV1ZSAtIHN0YXJ0IHdpdGggYSBxdWV1ZSBhcyBiaWcgYXMKKwkgKiBwb3NzaWJsZSAobGltaXRlZCBieSBtYXhpbXVtIHNpemUgYWxsb3dlZCBieSBkZXZpY2UpLCBkcm9wIGRvd24KKwkgKiB0byBhIG1pbmltYWwgc2l6ZSwganVzdCBiaWcgZW5vdWdoIHRvIGZpdCBkZXNjcmlwdG9yIHRhYmxlCisJICogYW5kIHR3byByaW5ncyAod2hpY2ggbWFrZXMgaXQgImFsaWdubWVudF9zaXplICogMiIpCisJICovCisJaW5mby0+bnVtID0gcmVhZGwodm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fUVVFVUVfTlVNX01BWCk7CisJd2hpbGUgKDEpIHsKKwkJc2l6ZSA9IFBBR0VfQUxJR04odnJpbmdfc2l6ZShpbmZvLT5udW0sCisJCQkJVklSVElPX01NSU9fVlJJTkdfQUxJR04pKTsKKwkJLyogQWxyZWFkeSBzbWFsbGVzdCBwb3NzaWJsZSBhbGxvY2F0aW9uPyAqLworCQlpZiAoc2l6ZSA8PSBWSVJUSU9fTU1JT19WUklOR19BTElHTiAqIDIpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yX2FsbG9jX3BhZ2VzOworCQl9CisKKwkJaW5mby0+cXVldWUgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJCWlmIChpbmZvLT5xdWV1ZSkKKwkJCWJyZWFrOworCisJCWluZm8tPm51bSAvPSAyOworCX0KKworCS8qIEFjdGl2YXRlIHRoZSBxdWV1ZSAqLworCXdyaXRlbChpbmZvLT5udW0sIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1FVRVVFX05VTSk7CisJd3JpdGVsKFZJUlRJT19NTUlPX1ZSSU5HX0FMSUdOLAorCQkJdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fUVVFVUVfQUxJR04pOworCXdyaXRlbCh2aXJ0X3RvX3BoeXMoaW5mby0+cXVldWUpID4+IFBBR0VfU0hJRlQsCisJCQl2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19RVUVVRV9QRk4pOworCisJLyogQ3JlYXRlIHRoZSB2cmluZyAqLworCXZxID0gdnJpbmdfbmV3X3ZpcnRxdWV1ZShpbmZvLT5udW0sIFZJUlRJT19NTUlPX1ZSSU5HX0FMSUdOLAorCQkJCSB2ZGV2LCBpbmZvLT5xdWV1ZSwgdm1fbm90aWZ5LCBjYWxsYmFjaywgbmFtZSk7CisJaWYgKCF2cSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX25ld192aXJ0cXVldWU7CisJfQorCisJdnEtPnByaXYgPSBpbmZvOworCWluZm8tPnZxID0gdnE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdm1fZGV2LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmluZm8tPm5vZGUsICZ2bV9kZXYtPnZpcnRxdWV1ZXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZxOworCitlcnJvcl9uZXdfdmlydHF1ZXVlOgorCXdyaXRlbCgwLCB2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19RVUVVRV9QRk4pOworCWZyZWVfcGFnZXNfZXhhY3QoaW5mby0+cXVldWUsIHNpemUpOworZXJyb3JfYWxsb2NfcGFnZXM6CisJa2ZyZWUoaW5mbyk7CitlcnJvcl9rbWFsbG9jOgorZXJyb3JfYXZhaWxhYmxlOgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgdm1fZmluZF92cXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG52cXMsCisJCSAgICAgICBzdHJ1Y3QgdmlydHF1ZXVlICp2cXNbXSwKKwkJICAgICAgIHZxX2NhbGxiYWNrX3QgKmNhbGxiYWNrc1tdLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZXNbXSkKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbW1pb19kZXZpY2UodmRldik7CisJdW5zaWduZWQgaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEodm1fZGV2LT5wZGV2LCAwKTsKKwlpbnQgaSwgZXJyOworCisJZXJyID0gcmVxdWVzdF9pcnEoaXJxLCB2bV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJZGV2X25hbWUoJnZkZXYtPmRldiksIHZtX2Rldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBudnFzOyArK2kpIHsKKwkJdnFzW2ldID0gdm1fc2V0dXBfdnEodmRldiwgaSwgY2FsbGJhY2tzW2ldLCBuYW1lc1tpXSk7CisJCWlmIChJU19FUlIodnFzW2ldKSkgeworCQkJdm1fZGVsX3Zxcyh2ZGV2KTsKKwkJCXJldHVybiBQVFJfRVJSKHZxc1tpXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgdmlydGlvX2NvbmZpZ19vcHMgdmlydGlvX21taW9fY29uZmlnX29wcyA9IHsKKwkuZ2V0CQk9IHZtX2dldCwKKwkuc2V0CQk9IHZtX3NldCwKKwkuZ2V0X3N0YXR1cwk9IHZtX2dldF9zdGF0dXMsCisJLnNldF9zdGF0dXMJPSB2bV9zZXRfc3RhdHVzLAorCS5yZXNldAkJPSB2bV9yZXNldCwKKwkuZmluZF92cXMJPSB2bV9maW5kX3ZxcywKKwkuZGVsX3Zxcwk9IHZtX2RlbF92cXMsCisJLmdldF9mZWF0dXJlcwk9IHZtX2dldF9mZWF0dXJlcywKKwkuZmluYWxpemVfZmVhdHVyZXMgPSB2bV9maW5hbGl6ZV9mZWF0dXJlcywKK307CisKKworCisvKiBQbGF0Zm9ybSBkZXZpY2UgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgdmlydGlvX21taW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXY7CisJc3RydWN0IHJlc291cmNlICptZW07CisJdW5zaWduZWQgbG9uZyBtYWdpYzsKKworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCBtZW0tPnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZShtZW0pLCBwZGV2LT5uYW1lKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXZtX2RldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnZtX2RldiksIEdGUF9LRVJORUwpOworCWlmICghdm1fZGV2KQorCQlyZXR1cm4gIC1FTk9NRU07CisKKwl2bV9kZXYtPnZkZXYuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJdm1fZGV2LT52ZGV2LmNvbmZpZyA9ICZ2aXJ0aW9fbW1pb19jb25maWdfb3BzOworCXZtX2Rldi0+cGRldiA9IHBkZXY7CisJSU5JVF9MSVNUX0hFQUQoJnZtX2Rldi0+dmlydHF1ZXVlcyk7CisJc3Bpbl9sb2NrX2luaXQoJnZtX2Rldi0+bG9jayk7CisKKwl2bV9kZXYtPmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKwlpZiAodm1fZGV2LT5iYXNlID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogQ2hlY2sgbWFnaWMgdmFsdWUgKi8KKwltYWdpYyA9IHJlYWRsKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX01BR0lDX1ZBTFVFKTsKKwlpZiAobWVtY21wKCZtYWdpYywgInZpcnQiLCA0KSAhPSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJXcm9uZyBtYWdpYyB2YWx1ZSAweCUwOGx4IVxuIiwgbWFnaWMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBDaGVjayBkZXZpY2UgdmVyc2lvbiAqLworCXZtX2Rldi0+dmVyc2lvbiA9IHJlYWRsKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1ZFUlNJT04pOworCWlmICh2bV9kZXYtPnZlcnNpb24gIT0gMSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJWZXJzaW9uICVsZCBub3Qgc3VwcG9ydGVkIVxuIiwKKwkJCQl2bV9kZXYtPnZlcnNpb24pOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXZtX2Rldi0+dmRldi5pZC5kZXZpY2UgPSByZWFkbCh2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19ERVZJQ0VfSUQpOworCXZtX2Rldi0+dmRldi5pZC52ZW5kb3IgPSByZWFkbCh2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19WRU5ET1JfSUQpOworCisJd3JpdGVsKFBBR0VfU0laRSwgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fR1VFU1RfUEFHRV9TSVpFKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHZtX2Rldik7CisKKwlyZXR1cm4gcmVnaXN0ZXJfdmlydGlvX2RldmljZSgmdm1fZGV2LT52ZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdmlydGlvX21taW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl1bnJlZ2lzdGVyX3ZpcnRpb19kZXZpY2UoJnZtX2Rldi0+dmRldik7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIFBsYXRmb3JtIGRyaXZlciAqLworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB2aXJ0aW9fbW1pb19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAidmlydGlvLG1taW8iLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHZpcnRpb19tbWlvX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmlydGlvX21taW9fZHJpdmVyID0geworCS5wcm9iZQkJPSB2aXJ0aW9fbW1pb19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHZpcnRpb19tbWlvX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInZpcnRpby1tbWlvIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZQk9IHZpcnRpb19tbWlvX21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB2aXJ0aW9fbW1pb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmlydGlvX21taW9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZpcnRpb19tbWlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmlydGlvX21taW9fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodmlydGlvX21taW9faW5pdCk7Cittb2R1bGVfZXhpdCh2aXJ0aW9fbW1pb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF3ZWwgTW9sbCA8cGF3ZWwubW9sbEBhcm0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQbGF0Zm9ybSBidXMgZHJpdmVyIGZvciBtZW1vcnkgbWFwcGVkIHZpcnRpbyBkZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMKaW5kZXggNGJjYzhiOC4uM2QxYmY0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jCisrKyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYwpAQCAtNDE1LDkgKzQxNSwxMyBAQAogCQl9CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZwX2Rldi0+bG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkKCZpbmZvLT5ub2RlLCAmdnBfZGV2LT52aXJ0cXVldWVzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cF9kZXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY2FsbGJhY2spIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZwX2Rldi0+bG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZCgmaW5mby0+bm9kZSwgJnZwX2Rldi0+dmlydHF1ZXVlcyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwX2Rldi0+bG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5ub2RlKTsKKwl9CiAKIAlyZXR1cm4gdnE7CiAKQEAgLTU5MCwxMSArNTk0LDExIEBACiAKIHN0YXRpYyB2b2lkIHZpcnRpb19wY2lfcmVsZWFzZV9kZXYoc3RydWN0IGRldmljZSAqX2QpCiB7Ci0Jc3RydWN0IHZpcnRpb19kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihfZCwgc3RydWN0IHZpcnRpb19kZXZpY2UsCi0JCQkJCQkgZGV2KTsKLQlzdHJ1Y3QgdmlydGlvX3BjaV9kZXZpY2UgKnZwX2RldiA9IHRvX3ZwX2RldmljZShkZXYpOwotCi0Ja2ZyZWUodnBfZGV2KTsKKwkvKgorCSAqIE5vIG5lZWQgZm9yIGEgcmVsZWFzZSBtZXRob2QgYXMgd2UgYWxsb2NhdGUvZnJlZQorCSAqIGFsbCBkZXZpY2VzIHRvZ2V0aGVyIHdpdGggdGhlIHBjaSBkZXZpY2VzLgorCSAqIFByb3ZpZGUgYW4gZW1wdHkgb25lIHRvIGF2b2lkIGdldHRpbmcgYSB3YXJuaW5nIGZyb20gY29yZS4KKwkgKi8KIH0KIAogLyogdGhlIFBDSSBwcm9iaW5nIGZ1bmN0aW9uICovCkBAIC02ODIsNiArNjg2LDcgQEAKIAlwY2lfaW91bm1hcChwY2lfZGV2LCB2cF9kZXYtPmlvYWRkcik7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lfZGV2KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisJa2ZyZWUodnBfZGV2KTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKaW5kZXggNGFjZjg4OC4uYzdhMmMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogdmlydGlvIGd1ZXN0IGlzIGNvbW11bmljYXRpbmcgd2l0aCBhIHZpcnR1YWwgImRldmljZSIgdGhhdCBhY3R1YWxseSBydW5zIG9uCiAgKiBhIGhvc3QgcHJvY2Vzc29yLiAgTWVtb3J5IGJhcnJpZXJzIGFyZSB1c2VkIHRvIGNvbnRyb2wgU01QIGVmZmVjdHMuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3NjAuYyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc2MC5jCmluZGV4IDQ4M2Q0NTEuLjU3NTRjOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc2MC5jCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc2MC5jCkBAIC0xMTQsNDMgKzExNCw3IEBACiAJLnJlYWQgPSB3MV9kczI3NjBfcmVhZF9iaW4sCiB9OwogCi1zdGF0aWMgREVGSU5FX0lEUihiYXRfaWRyKTsKLXN0YXRpYyBERUZJTkVfTVVURVgoYmF0X2lkcl9sb2NrKTsKLQotc3RhdGljIGludCBuZXdfYmF0X2lkKHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXdoaWxlICgxKSB7Ci0JCWludCBpZDsKLQotCQlyZXQgPSBpZHJfcHJlX2dldCgmYmF0X2lkciwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCW11dGV4X2xvY2soJmJhdF9pZHJfbG9jayk7Ci0JCXJldCA9IGlkcl9nZXRfbmV3KCZiYXRfaWRyLCBOVUxMLCAmaWQpOwotCQltdXRleF91bmxvY2soJmJhdF9pZHJfbG9jayk7Ci0KLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlyZXQgPSBpZCAmIE1BWF9JRF9NQVNLOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAocmV0ID09IC1FQUdBSU4pIHsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCByZWxlYXNlX2JhdF9pZChpbnQgaWQpCi17Ci0JbXV0ZXhfbG9jaygmYmF0X2lkcl9sb2NrKTsKLQlpZHJfcmVtb3ZlKCZiYXRfaWRyLCBpZCk7Ci0JbXV0ZXhfdW5sb2NrKCZiYXRfaWRyX2xvY2spOwotfQorc3RhdGljIERFRklORV9JREEoYmF0X2lkYSk7CiAKIHN0YXRpYyBpbnQgdzFfZHMyNzYwX2FkZF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewpAQCAtMTU4LDcgKzEyMiw3IEBACiAJaW50IGlkOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKLQlpZCA9IG5ld19iYXRfaWQoKTsKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZiYXRfaWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKIAlpZiAoaWQgPCAwKSB7CiAJCXJldCA9IGlkOwogCQlnb3RvIG5vaWQ7CkBAIC0xODcsNyArMTUxLDcgQEAKIHBkZXZfYWRkX2ZhaWxlZDoKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKIHBkZXZfYWxsb2NfZmFpbGVkOgotCXJlbGVhc2VfYmF0X2lkKGlkKTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmYmF0X2lkYSwgaWQpOwogbm9pZDoKIHN1Y2Nlc3M6CiAJcmV0dXJuIHJldDsKQEAgLTE5OSw3ICsxNjMsNyBAQAogCWludCBpZCA9IHBkZXYtPmlkOwogCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7Ci0JcmVsZWFzZV9iYXRfaWQoaWQpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZiYXRfaWRhLCBpZCk7CiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9kczI3NjBfYmluX2F0dHIpOwogfQogCkBAIC0yMTcsMTQgKzE4MSwxNCBAQAogewogCXByaW50ayhLRVJOX0lORk8gIjEtV2lyZSBkcml2ZXIgZm9yIHRoZSBEUzI3NjAgYmF0dGVyeSBtb25pdG9yICIKIAkgICAgICAgIiBjaGlwICAtIChjKSAyMDA0LTIwMDUsIFN6YWJvbGNzIEd5dXJrb1xuIik7Ci0JaWRyX2luaXQoJmJhdF9pZHIpOworCWlkYV9pbml0KCZiYXRfaWRhKTsKIAlyZXR1cm4gdzFfcmVnaXN0ZXJfZmFtaWx5KCZ3MV9kczI3NjBfZmFtaWx5KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHcxX2RzMjc2MF9leGl0KHZvaWQpCiB7CiAJdzFfdW5yZWdpc3Rlcl9mYW1pbHkoJncxX2RzMjc2MF9mYW1pbHkpOwotCWlkcl9kZXN0cm95KCZiYXRfaWRyKTsKKwlpZGFfZGVzdHJveSgmYmF0X2lkYSk7CiB9CiAKIEVYUE9SVF9TWU1CT0wodzFfZHMyNzYwX3JlYWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvdzFfZHMyNzgwLmMgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3ODAuYwppbmRleCAyNzRjOGYzLi4zOWY3OGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3ODAuYworKysgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3ODAuYwpAQCAtMjYsMjAgKzI2LDE0IEBACiAjaW5jbHVkZSAiLi4vdzFfZmFtaWx5LmgiCiAjaW5jbHVkZSAidzFfZHMyNzgwLmgiCiAKLWludCB3MV9kczI3ODBfaW8oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBhZGRyLCBzaXplX3QgY291bnQsCi0JCQlpbnQgaW8pCitzdGF0aWMgaW50IHcxX2RzMjc4MF9kb19pbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGFkZHIsCisJCQlzaXplX3QgY291bnQsIGludCBpbykKIHsKIAlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX3NsYXZlLCBkZXYpOwogCi0JaWYgKCFkZXYpCi0JCXJldHVybiAtRU5PREVWOworCWlmIChhZGRyID4gRFMyNzgwX0RBVEFfU0laRSB8fCBhZGRyIDwgMCkKKwkJcmV0dXJuIDA7CiAKLQltdXRleF9sb2NrKCZzbC0+bWFzdGVyLT5tdXRleCk7Ci0KLQlpZiAoYWRkciA+IERTMjc4MF9EQVRBX1NJWkUgfHwgYWRkciA8IDApIHsKLQkJY291bnQgPSAwOwotCQlnb3RvIG91dDsKLQl9CiAJY291bnQgPSBtaW5fdChpbnQsIGNvdW50LCBEUzI3ODBfREFUQV9TSVpFIC0gYWRkcik7CiAKIAlpZiAodzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSA9PSAwKSB7CkBAIC00Nyw3ICs0MSw2IEBACiAJCQl3MV93cml0ZV84KHNsLT5tYXN0ZXIsIFcxX0RTMjc4MF9XUklURV9EQVRBKTsKIAkJCXcxX3dyaXRlXzgoc2wtPm1hc3RlciwgYWRkcik7CiAJCQl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCBidWYsIGNvdW50KTsKLQkJCS8qIFhYWCB3MV93cml0ZV9ibG9jayByZXR1cm5zIHZvaWQsIG5vdCBuX3dyaXR0ZW4gKi8KIAkJfSBlbHNlIHsKIAkJCXcxX3dyaXRlXzgoc2wtPm1hc3RlciwgVzFfRFMyNzgwX1JFQURfREFUQSk7CiAJCQl3MV93cml0ZV84KHNsLT5tYXN0ZXIsIGFkZHIpOwpAQCAtNTUsMTMgKzQ4LDQyIEBACiAJCX0KIAl9CiAKLW91dDoKLQltdXRleF91bmxvY2soJnNsLT5tYXN0ZXItPm11dGV4KTsKLQogCXJldHVybiBjb3VudDsKIH0KKworaW50IHcxX2RzMjc4MF9pbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGFkZHIsIHNpemVfdCBjb3VudCwKKwkJCWludCBpbykKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX3NsYXZlLCBkZXYpOworCWludCByZXQ7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZzbC0+bWFzdGVyLT5tdXRleCk7CisKKwlyZXQgPSB3MV9kczI3ODBfZG9faW8oZGV2LCBidWYsIGFkZHIsIGNvdW50LCBpbyk7CisKKwltdXRleF91bmxvY2soJnNsLT5tYXN0ZXItPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CiBFWFBPUlRfU1lNQk9MKHcxX2RzMjc4MF9pbyk7CiAKK2ludCB3MV9kczI3ODBfaW9fbm9sb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgYWRkciwgc2l6ZV90IGNvdW50LAorCQkJaW50IGlvKQoreworCWludCByZXQ7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSB3MV9kczI3ODBfZG9faW8oZGV2LCBidWYsIGFkZHIsIGNvdW50LCBpbyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3MV9kczI3ODBfaW9fbm9sb2NrKTsKKwogaW50IHcxX2RzMjc4MF9lZXByb21fY21kKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGFkZHIsIGludCBjbWQpCiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9zbGF2ZSwgZGV2KTsKQEAgLTk5LDQzICsxMjEsNyBAQAogCS5yZWFkID0gdzFfZHMyNzgwX3JlYWRfYmluLAogfTsKIAotc3RhdGljIERFRklORV9JRFIoYmF0X2lkcik7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGJhdF9pZHJfbG9jayk7Ci0KLXN0YXRpYyBpbnQgbmV3X2JhdF9pZCh2b2lkKQotewotCWludCByZXQ7Ci0KLQl3aGlsZSAoMSkgewotCQlpbnQgaWQ7Ci0KLQkJcmV0ID0gaWRyX3ByZV9nZXQoJmJhdF9pZHIsIEdGUF9LRVJORUwpOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQltdXRleF9sb2NrKCZiYXRfaWRyX2xvY2spOwotCQlyZXQgPSBpZHJfZ2V0X25ldygmYmF0X2lkciwgTlVMTCwgJmlkKTsKLQkJbXV0ZXhfdW5sb2NrKCZiYXRfaWRyX2xvY2spOwotCi0JCWlmIChyZXQgPT0gMCkgewotCQkJcmV0ID0gaWQgJiBNQVhfSURfTUFTSzsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcmVsZWFzZV9iYXRfaWQoaW50IGlkKQotewotCW11dGV4X2xvY2soJmJhdF9pZHJfbG9jayk7Ci0JaWRyX3JlbW92ZSgmYmF0X2lkciwgaWQpOwotCW11dGV4X3VubG9jaygmYmF0X2lkcl9sb2NrKTsKLX0KK3N0YXRpYyBERUZJTkVfSURBKGJhdF9pZGEpOwogCiBzdGF0aWMgaW50IHcxX2RzMjc4MF9hZGRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKIHsKQEAgLTE0Myw3ICsxMjksNyBAQAogCWludCBpZDsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCi0JaWQgPSBuZXdfYmF0X2lkKCk7CisJaWQgPSBpZGFfc2ltcGxlX2dldCgmYmF0X2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGlkIDwgMCkgewogCQlyZXQgPSBpZDsKIAkJZ290byBub2lkOwpAQCAtMTcyLDcgKzE1OCw3IEBACiBwZGV2X2FkZF9mYWlsZWQ6CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CiBwZGV2X2FsbG9jX2ZhaWxlZDoKLQlyZWxlYXNlX2JhdF9pZChpZCk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmJhdF9pZGEsIGlkKTsKIG5vaWQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE4Myw3ICsxNjksNyBAQAogCWludCBpZCA9IHBkZXYtPmlkOwogCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7Ci0JcmVsZWFzZV9iYXRfaWQoaWQpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZiYXRfaWRhLCBpZCk7CiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9kczI3ODBfYmluX2F0dHIpOwogfQogCkBAIC0xOTksMTQgKzE4NSwxNCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB3MV9kczI3ODBfaW5pdCh2b2lkKQogewotCWlkcl9pbml0KCZiYXRfaWRyKTsKKwlpZGFfaW5pdCgmYmF0X2lkYSk7CiAJcmV0dXJuIHcxX3JlZ2lzdGVyX2ZhbWlseSgmdzFfZHMyNzgwX2ZhbWlseSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB3MV9kczI3ODBfZXhpdCh2b2lkKQogewogCXcxX3VucmVnaXN0ZXJfZmFtaWx5KCZ3MV9kczI3ODBfZmFtaWx5KTsKLQlpZHJfZGVzdHJveSgmYmF0X2lkcik7CisJaWRhX2Rlc3Ryb3koJmJhdF9pZGEpOwogfQogCiBtb2R1bGVfaW5pdCh3MV9kczI3ODBfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3ODAuaCBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc4MC5oCmluZGV4IGExZmJhNzkuLjczNzM3OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc4MC5oCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc4MC5oCkBAIC0xMjQsNiArMTI0LDggQEAKIAogZXh0ZXJuIGludCB3MV9kczI3ODBfaW8oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBhZGRyLCBzaXplX3QgY291bnQsCiAJCQlpbnQgaW8pOworZXh0ZXJuIGludCB3MV9kczI3ODBfaW9fbm9sb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgYWRkciwKKwkJCXNpemVfdCBjb3VudCwgaW50IGlvKTsKIGV4dGVybiBpbnQgdzFfZHMyNzgwX2VlcHJvbV9jbWQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgYWRkciwgaW50IGNtZCk7CiAKICNlbmRpZiAvKiAhX1cxX0RTMjc4MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jIGIvZHJpdmVycy93MS93MV9mYW1pbHkuYwppbmRleCA2MzM1OTc5Li5lOTMwOTc3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9mYW1pbHkuYworKysgYi9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIHNjaGVkdWxlX3RpbWVvdXQoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ3MV9mYW1pbHkuaCIKICNpbmNsdWRlICJ3MS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9pbnQuYyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKaW5kZXggZDIyMGJjZS4uNjgyODgzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pbnQuYworKysgYi9kcml2ZXJzL3cxL3cxX2ludC5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlICJ3MS5oIgogI2luY2x1ZGUgIncxX2xvZy5oIgpAQCAtNzgsNiArODAsNyBAQAogCW1lbWNweSgmZGV2LT5kZXYsIGRldmljZSwgc2l6ZW9mKHN0cnVjdCBkZXZpY2UpKTsKIAlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAidzFfYnVzX21hc3RlciV1IiwgZGV2LT5pZCk7CiAJc25wcmludGYoZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5uYW1lKSwgIncxX2J1c19tYXN0ZXIldSIsIGRldi0+aWQpOworCWRldi0+ZGV2LmluaXRfbmFtZSA9IGRldi0+bmFtZTsKIAogCWRldi0+ZHJpdmVyID0gZHJpdmVyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2lvLmMgYi9kcml2ZXJzL3cxL3cxX2lvLmMKaW5kZXggNzY1YjM3Yi4uMzEzNWIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pby5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW8uYwpAQCAtMTU4LDEzICsxNTgsMTggQEAKIHN0YXRpYyB1OCB3MV9yZWFkX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJLyogc2FtcGxlIHRpbWluZyBpcyBjcml0aWNhbCBoZXJlICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWRldi0+YnVzX21hc3Rlci0+d3JpdGVfYml0KGRldi0+YnVzX21hc3Rlci0+ZGF0YSwgMCk7CiAJdzFfZGVsYXkoNik7CiAJZGV2LT5idXNfbWFzdGVyLT53cml0ZV9iaXQoZGV2LT5idXNfbWFzdGVyLT5kYXRhLCAxKTsKIAl3MV9kZWxheSg5KTsKIAogCXJlc3VsdCA9IGRldi0+YnVzX21hc3Rlci0+cmVhZF9iaXQoZGV2LT5idXNfbWFzdGVyLT5kYXRhKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKIAl3MV9kZWxheSg1NSk7CiAKIAlyZXR1cm4gcmVzdWx0ICYgMHgxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IDg2YjA3MzUuLjYyODU4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTY2LDYgKzY2LDcgQEAKIGNvbmZpZyBXTTgzMVhfV0FUQ0hET0cKIAl0cmlzdGF0ZSAiV004MzF4IHdhdGNoZG9nIgogCWRlcGVuZHMgb24gTUZEX1dNODMxWAorCXNlbGVjdCBXQVRDSERPR19DT1JFCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIHdhdGNoZG9nIGluIHRoZSBXTTgzMXggQXVkaW9QbHVzIFBNSUNzLiAgV2hlbgogCSAgdGhlIHdhdGNoZG9nIHRyaWdnZXJzIHRoZSBzeXN0ZW0gd2lsbCBiZSByZXNldC4KQEAgLTE3MCw2ICsxNzEsNyBAQAogY29uZmlnIFMzQzI0MTBfV0FUQ0hET0cKIAl0cmlzdGF0ZSAiUzNDMjQxMCBXYXRjaGRvZyIKIAlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCB8fCBIQVZFX1MzQzI0MTBfV0FUQ0hET0cKKwlzZWxlY3QgV0FUQ0hET0dfQ09SRQogCWhlbHAKIAkgIFdhdGNoZG9nIHRpbWVyIGJsb2NrIGluIHRoZSBTYW1zdW5nIFNvQ3MuIFRoaXMgd2lsbCByZWJvb3QKIAkgIHRoZSBzeXN0ZW0gd2hlbiB0aGUgdGltZXIgZXhwaXJlcyB3aXRoIHRoZSB3YXRjaGRvZyBlbmFibGVkLgpAQCAtNzI2LDcgKzcyOCw3IEBACiAKIGNvbmZpZyBTQkM3MjQwX1dEVAogCXRyaXN0YXRlICJTQkMgTmFubyA3MjQwIFdhdGNoZG9nIFRpbWVyIgotCWRlcGVuZHMgb24gWDg2XzMyCisJZGVwZW5kcyBvbiBYODZfMzIgJiYgIVVNTAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIGZvdW5kIG9uIHRoZSBJRUkKIAkgIHNpbmdsZSBib2FyZCBjb21wdXRlcnMgRVBJQyBOYW5vIDcyNDAgKGFuZCBsaWtlbHkgb3RoZXJzKS4gVGhpcwpAQCAtMTE3NCw2ICsxMTc2LDEwIEBACiAJICBieSBYZW4gNC4wIGFuZCBuZXdlci4gIFRoZSB3YXRjaGRvZyB0aW1lb3V0IHBlcmlvZCBpcyBub3JtYWxseSBvbmUKIAkgIG1pbnV0ZSBidXQgY2FuIGJlIGNoYW5nZWQgd2l0aCBhIGJvb3QtdGltZSBwYXJhbWV0ZXIuCiAKK2NvbmZpZyBVTUxfV0FUQ0hET0cKKwl0cmlzdGF0ZSAiVU1MIHdhdGNoZG9nIgorCWRlcGVuZHMgb24gVU1MCisKICMKICMgSVNBLWJhc2VkIFdhdGNoZG9nIENhcmRzCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2NvaDkwMTMyN193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jCmluZGV4IDkyOTE1MDYuLjAzZjQ0OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jCkBAIC00MjksNyArNDI5LDcgQEAKIAl3cml0ZXcoVTMwMF9XRE9HX1NSX1JFU0VUX1NUQVRVU19SRVNFVCwgdmlydGJhc2UgKyBVMzAwX1dET0dfU1IpOwogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBjb2g5MDEzMjdfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCWlmIChyZXF1ZXN0X2lycShpcnEsIGNvaDkwMTMyN19pbnRlcnJ1cHQsIDAsCiAJCQlEUlZfTkFNRSAiIEJhcmsiLCBwZGV2KSkgewogCQlyZXQgPSAtRUlPOwogCQlnb3RvIG91dF9ub19pcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2V1cm90ZWNod2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2V1cm90ZWNod2R0LmMKaW5kZXggZjFkMWRhNi4uNDEwMThkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9ldXJvdGVjaHdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZXVyb3RlY2h3ZHQuYwpAQCAtNDI3LDcgKzQyNyw3IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZXVyd2R0X2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwgImV1cndkdCIsIE5VTEwpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZXVyd2R0X2ludGVycnVwdCwgMCwgImV1cndkdCIsIE5VTEwpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJldXJ3ZHQ6IElSUSAlZCBpcyBub3QgZnJlZS5cbiIsIGlycSk7CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCmluZGV4IDc1MWE1OTEuLmJhNmFkNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICoJaW50ZWwgVENPIFdhdGNoZG9nIERyaXZlcgogICoKLSAqCShjKSBDb3B5cmlnaHQgMjAwNi0yMDEwIFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+LgorICoJKGMpIENvcHlyaWdodCAyMDA2LTIwMTEgV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4uCiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogLyogTW9kdWxlIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiAjZGVmaW5lIERSVl9OQU1FCSJpVENPX3dkdCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDYiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjA3IgogI2RlZmluZSBQRlgJCURSVl9OQU1FICI6ICIKIAogLyogSW5jbHVkZXMgKi8KQEAgLTM4NCw2ICszODQsMTEgQEAKIAkiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKIAkJCQlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CiAKK3N0YXRpYyBpbnQgdHVybl9TTUlfd2F0Y2hkb2dfY2xlYXJfb2ZmID0gMDsKK21vZHVsZV9wYXJhbSh0dXJuX1NNSV93YXRjaGRvZ19jbGVhcl9vZmYsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHR1cm5fU01JX3dhdGNoZG9nX2NsZWFyX29mZiwKKwkiVHVybiBvZmYgU01JIGNsZWFyaW5nIHdhdGNoZG9nIChkZWZhdWx0PTApIik7CisKIC8qCiAgKiBTb21lIFRDTyBzcGVjaWZpYyBmdW5jdGlvbnMKICAqLwpAQCAtODA4LDEwICs4MTMsMTIgQEAKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXRfdW5tYXA7CiAJfQotCS8qIEJpdCAxMzogVENPX0VOIC0+IDAgPSBEaXNhYmxlcyBUQ08gbG9naWMgZ2VuZXJhdGluZyBhbiBTTUkjICovCi0JdmFsMzIgPSBpbmwoU01JX0VOKTsKLQl2YWwzMiAmPSAweGZmZmZkZmZmOwkvKiBUdXJuIG9mZiBTTUkgY2xlYXJpbmcgd2F0Y2hkb2cgKi8KLQlvdXRsKHZhbDMyLCBTTUlfRU4pOworCWlmICh0dXJuX1NNSV93YXRjaGRvZ19jbGVhcl9vZmYpIHsKKwkJLyogQml0IDEzOiBUQ09fRU4gLT4gMCA9IERpc2FibGVzIFRDTyBsb2dpYyBnZW5lcmF0aW5nIGFuIFNNSSMgKi8KKwkJdmFsMzIgPSBpbmwoU01JX0VOKTsKKwkJdmFsMzIgJj0gMHhmZmZmZGZmZjsJLyogVHVybiBvZmYgU01JIGNsZWFyaW5nIHdhdGNoZG9nICovCisJCW91dGwodmFsMzIsIFNNSV9FTik7CisJfQogCiAJLyogVGhlIFRDTyBJL08gcmVnaXN0ZXJzIHJlc2lkZSBpbiBhIDMyLWJ5dGUgcmFuZ2UgcG9pbnRlZCB0bwogCSAgIGJ5IHRoZSBUQ09CQVNFIHZhbHVlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL21wY29yZV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCmluZGV4IDRkYzMxMDIuLjgyY2NkMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCkBAIC0zNjcsOCArMzY3LDcgQEAKIAkJZ290byBlcnJfbWlzYzsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycSh3ZHQtPmlycSwgbXBjb3JlX3dkdF9maXJlLCBJUlFGX0RJU0FCTEVELAotCQkJCQkJCSJtcGNvcmVfd2R0Iiwgd2R0KTsKKwlyZXQgPSByZXF1ZXN0X2lycSh3ZHQtPmlycSwgbXBjb3JlX3dkdF9maXJlLCAwLCAibXBjb3JlX3dkdCIsIHdkdCk7CiAJaWYgKHJldCkgewogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCB3ZHQtPmRldiwKIAkJCSJjYW5ub3QgcmVnaXN0ZXIgSVJRJWQgZm9yIHdhdGNoZG9nXG4iLCB3ZHQtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL29jdGVvbi13ZHQtbWFpbi5jIGIvZHJpdmVycy93YXRjaGRvZy9vY3Rlb24td2R0LW1haW4uYwppbmRleCA5NDVlZTgzLi43YzBkODYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL29jdGVvbi13ZHQtbWFpbi5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvb2N0ZW9uLXdkdC1tYWluLmMKQEAgLTQwMiw3ICs0MDIsNyBAQAogCWlycSA9IE9DVEVPTl9JUlFfV0RPRzAgKyBjb3JlOwogCiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgb2N0ZW9uX3dkdF9wb2tlX2lycSwKLQkJCUlSUUZfRElTQUJMRUQsICJvY3Rlb25fd2R0Iiwgb2N0ZW9uX3dkdF9wb2tlX2lycSkpCisJCQlJUlFGX05PX1RIUkVBRCwgIm9jdGVvbl93ZHQiLCBvY3Rlb25fd2R0X3Bva2VfaXJxKSkKIAkJcGFuaWMoIm9jdGVvbl93ZHQ6IENvdWxkbid0IG9idGFpbiBpcnEgJWQiLCBpcnEpOwogCiAJY3B1bWFza19zZXRfY3B1KGNwdSwgJmlycV9lbmFibGVkX2NwdXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCmluZGV4IDMwZGE4OGYuLjVkZTdlNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKQEAgLTI3LDkgKzI3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPiAvKiBmb3IgTU9EVUxFX0FMSUFTX01JU0NERVYgKi8KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzgsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKQEAgLTc0LDE0ICs3NCwxMiBAQAogCQkJIjAgdG8gcmVib290IChkZWZhdWx0IDApIik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiV2F0Y2hkb2cgZGVidWcsIHNldCB0byA+MSBmb3IgZGVidWcgKGRlZmF1bHQgMCkiKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Blbl9sb2NrOwogc3RhdGljIHN0cnVjdCBkZXZpY2UgICAgKndkdF9kZXY7CS8qIHBsYXRmb3JtIGRldmljZSBhdHRhY2hlZCB0byAqLwogc3RhdGljIHN0cnVjdCByZXNvdXJjZQkqd2R0X21lbTsKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UJKndkdF9pcnE7CiBzdGF0aWMgc3RydWN0IGNsawkqd2R0X2Nsb2NrOwogc3RhdGljIHZvaWQgX19pb21lbQkqd2R0X2Jhc2U7CiBzdGF0aWMgdW5zaWduZWQgaW50CSB3ZHRfY291bnQ7Ci1zdGF0aWMgY2hhcgkJIGV4cGVjdF9jbG9zZTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sod2R0X2xvY2spOwogCiAvKiB3YXRjaGRvZyBjb250cm9sIHJvdXRpbmVzICovCkBAIC05MywxMSArOTEsMTMgQEAKIAogLyogZnVuY3Rpb25zICovCiAKLXN0YXRpYyB2b2lkIHMzYzI0MTB3ZHRfa2VlcGFsaXZlKHZvaWQpCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfa2VlcGFsaXZlKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKIAlzcGluX2xvY2soJndkdF9sb2NrKTsKIAl3cml0ZWwod2R0X2NvdW50LCB3ZHRfYmFzZSArIFMzQzI0MTBfV1RDTlQpOwogCXNwaW5fdW5sb2NrKCZ3ZHRfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19zM2MyNDEwd2R0X3N0b3Aodm9pZCkKQEAgLTEwOSwxNCArMTA5LDE2IEBACiAJd3JpdGVsKHd0Y29uLCB3ZHRfYmFzZSArIFMzQzI0MTBfV1RDT04pOwogfQogCi1zdGF0aWMgdm9pZCBzM2MyNDEwd2R0X3N0b3Aodm9pZCkKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKIAlzcGluX2xvY2soJndkdF9sb2NrKTsKIAlfX3MzYzI0MTB3ZHRfc3RvcCgpOwogCXNwaW5fdW5sb2NrKCZ3ZHRfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgczNjMjQxMHdkdF9zdGFydCh2b2lkKQorc3RhdGljIGludCBzM2MyNDEwd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKIAl1bnNpZ25lZCBsb25nIHd0Y29uOwogCkBAIC0xNDIsNiArMTQ0LDggQEAKIAl3cml0ZWwod2R0X2NvdW50LCB3ZHRfYmFzZSArIFMzQzI0MTBfV1RDTlQpOwogCXdyaXRlbCh3dGNvbiwgd2R0X2Jhc2UgKyBTM0MyNDEwX1dUQ09OKTsKIAlzcGluX3VubG9jaygmd2R0X2xvY2spOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHMzYzI0MTB3ZHRfaXNfcnVubmluZyh2b2lkKQpAQCAtMTQ5LDcgKzE1Myw3IEBACiAJcmV0dXJuIHJlYWRsKHdkdF9iYXNlICsgUzNDMjQxMF9XVENPTikgJiBTM0MyNDEwX1dUQ09OX0VOQUJMRTsKIH0KIAotc3RhdGljIGludCBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQoaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQsIHVuc2lnbmVkIHRpbWVvdXQpCiB7CiAJdW5zaWduZWQgbG9uZyBmcmVxID0gY2xrX2dldF9yYXRlKHdkdF9jbG9jayk7CiAJdW5zaWduZWQgaW50IGNvdW50OwpAQCAtMTgyLDggKzE4Niw2IEBACiAJCX0KIAl9CiAKLQl0bXJfbWFyZ2luID0gdGltZW91dDsKLQogCURCRygiJXM6IHRpbWVvdXQ9JWQsIGRpdmlzb3I9JWQsIGNvdW50PSVkICglMDh4KVxuIiwKIAkgICAgX19mdW5jX18sIHRpbWVvdXQsIGRpdmlzb3IsIGNvdW50LCBjb3VudC9kaXZpc29yKTsKIApAQCAtMjAxLDcwICsyMDMsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICoJL2Rldi93YXRjaGRvZyBoYW5kbGluZwotICovCi0KLXN0YXRpYyBpbnQgczNjMjQxMHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZvcGVuX2xvY2spKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKG5vd2F5b3V0KQotCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotCi0JZXhwZWN0X2Nsb3NlID0gMDsKLQotCS8qIHN0YXJ0IHRoZSB0aW1lciAqLwotCXMzYzI0MTB3ZHRfc3RhcnQoKTsKLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjQxMHdkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCS8qCi0JICoJU2h1dCBvZmYgdGhlIHRpbWVyLgotCSAqCUxvY2sgaXQgaW4gaWYgaXQncyBhIG1vZHVsZSBhbmQgd2Ugc2V0IG5vd2F5b3V0Ci0JICovCi0KLQlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKQotCQlzM2MyNDEwd2R0X3N0b3AoKTsKLQllbHNlIHsKLQkJZGV2X2Vycih3ZHRfZGV2LCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nXG4iKTsKLQkJczNjMjQxMHdkdF9rZWVwYWxpdmUoKTsKLQl9Ci0JZXhwZWN0X2Nsb3NlID0gMDsKLQljbGVhcl9iaXQoMCwgJm9wZW5fbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHMzYzI0MTB3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAotCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKLXsKLQkvKgotCSAqCVJlZnJlc2ggdGhlIHRpbWVyLgotCSAqLwotCWlmIChsZW4pIHsKLQkJaWYgKCFub3dheW91dCkgewotCQkJc2l6ZV90IGk7Ci0KLQkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLwotCQkJZXhwZWN0X2Nsb3NlID0gMDsKLQotCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgewotCQkJCWNoYXIgYzsKLQotCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmIChjID09ICdWJykKLQkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7Ci0JCQl9Ci0JCX0KLQkJczNjMjQxMHdkdF9rZWVwYWxpdmUoKTsKLQl9Ci0JcmV0dXJuIGxlbjsKLX0KLQogI2RlZmluZSBPUFRJT05TIChXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0UpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBzM2MyNDEwX3dkdF9pZGVudCA9IHsKQEAgLTI3Myw1MyArMjExLDE3IEBACiAJLmlkZW50aXR5ICAgICAgICAgPQkiUzNDMjQxMCBXYXRjaGRvZyIsCiB9OwogCi0KLXN0YXRpYyBsb25nIHMzYzI0MTB3ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCXVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JaW50IF9fdXNlciAqcCA9IGFyZ3A7Ci0JaW50IG5ld19tYXJnaW47Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKLQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmczNjMjQxMF93ZHRfaWRlbnQsCi0JCQlzaXplb2YoczNjMjQxMF93ZHRfaWRlbnQpKSA/IC1FRkFVTFQgOiAwOwotCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgotCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgotCQlzM2MyNDEwd2R0X2tlZXBhbGl2ZSgpOwotCQlyZXR1cm4gMDsKLQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6Ci0JCWlmIChnZXRfdXNlcihuZXdfbWFyZ2luLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoczNjMjQxMHdkdF9zZXRfaGVhcnRiZWF0KG5ld19tYXJnaW4pKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCk7Ci0JCXJldHVybiBwdXRfdXNlcih0bXJfbWFyZ2luLCBwKTsKLQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6Ci0JCXJldHVybiBwdXRfdXNlcih0bXJfbWFyZ2luLCBwKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT1RUWTsKLQl9Ci19Ci0KLS8qIGtlcm5lbCBpbnRlcmZhY2UgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgczNjMjQxMHdkdF9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkud3JpdGUJCT0gczNjMjQxMHdkdF93cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBzM2MyNDEwd2R0X2lvY3RsLAotCS5vcGVuCQk9IHMzYzI0MTB3ZHRfb3BlbiwKLQkucmVsZWFzZQk9IHMzYzI0MTB3ZHRfcmVsZWFzZSwKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHMzYzI0MTB3ZHRfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zdGFydCA9IHMzYzI0MTB3ZHRfc3RhcnQsCisJLnN0b3AgPSBzM2MyNDEwd2R0X3N0b3AsCisJLnBpbmcgPSBzM2MyNDEwd2R0X2tlZXBhbGl2ZSwKKwkuc2V0X3RpbWVvdXQgPSBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgczNjMjQxMHdkdF9taXNjZGV2ID0gewotCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKLQkubmFtZQkJPSAid2F0Y2hkb2ciLAotCS5mb3BzCQk9ICZzM2MyNDEwd2R0X2ZvcHMsCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2RldmljZSBzM2MyNDEwX3dkZCA9IHsKKwkuaW5mbyA9ICZzM2MyNDEwX3dkdF9pZGVudCwKKwkub3BzID0gJnMzYzI0MTB3ZHRfb3BzLAogfTsKIAogLyogaW50ZXJydXB0IGhhbmRsZXIgY29kZSAqLwpAQCAtMzI4LDcgKzIzMCw3IEBACiB7CiAJZGV2X2luZm8od2R0X2RldiwgIndhdGNoZG9nIHRpbWVyIGV4cGlyZWQgKGlycSlcbiIpOwogCi0JczNjMjQxMHdkdF9rZWVwYWxpdmUoKTsKKwlzM2MyNDEwd2R0X2tlZXBhbGl2ZSgmczNjMjQxMF93ZGQpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMzQ5LDE0ICsyNTEsMTQgQEAKIAkJICogdGhlIHdhdGNoZG9nIGlzIHJ1bm5pbmcuCiAJCSAqLwogCi0JCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCk7CisJCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCZzM2MyNDEwX3dkZCk7CiAJfSBlbHNlIGlmICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFKSB7Ci0JCXMzYzI0MTB3ZHRfc3RvcCgpOworCQlzM2MyNDEwd2R0X3N0b3AoJnMzYzI0MTBfd2RkKTsKIAotCQlyZXQgPSBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQodG1yX21hcmdpbik7CisJCXJldCA9IHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdCgmczNjMjQxMF93ZGQsIHMzYzI0MTBfd2RkLnRpbWVvdXQpOwogCiAJCWlmIChyZXQgPj0gMCkKLQkJCXMzYzI0MTB3ZHRfc3RhcnQoKTsKKwkJCXMzYzI0MTB3ZHRfc3RhcnQoJnMzYzI0MTBfd2RkKTsKIAkJZWxzZQogCQkJZ290byBlcnI7CiAJfQpAQCAtMzY1LDcgKzI2Nyw4IEBACiAJcmV0dXJuIDA7CiAKICBlcnI6Ci0JZGV2X2Vycih3ZHRfZGV2LCAiY2Fubm90IHNldCBuZXcgdmFsdWUgZm9yIHRpbWVvdXQgJWRcbiIsIHRtcl9tYXJnaW4pOworCWRldl9lcnIod2R0X2RldiwgImNhbm5vdCBzZXQgbmV3IHZhbHVlIGZvciB0aW1lb3V0ICVkXG4iLAorCQkJCXMzYzI0MTBfd2RkLnRpbWVvdXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM5NiwxMCArMjk5LDYgQEAKIH0KICNlbmRpZgogCi0KLQotLyogZGV2aWNlIGludGVyZmFjZSAqLwotCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzM2MyNDEwd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtNDY2LDggKzM2NSw4IEBACiAJLyogc2VlIGlmIHdlIGNhbiBhY3R1YWxseSBzZXQgdGhlIHJlcXVlc3RlZCB0aW1lciBtYXJnaW4sIGFuZCBpZgogCSAqIG5vdCwgdHJ5IHRoZSBkZWZhdWx0IHZhbHVlICovCiAKLQlpZiAoczNjMjQxMHdkdF9zZXRfaGVhcnRiZWF0KHRtcl9tYXJnaW4pKSB7Ci0JCXN0YXJ0ZWQgPSBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQoCisJaWYgKHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdCgmczNjMjQxMF93ZGQsIHRtcl9tYXJnaW4pKSB7CisJCXN0YXJ0ZWQgPSBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQoJnMzYzI0MTBfd2RkLAogCQkJCQlDT05GSUdfUzNDMjQxMF9XQVRDSERPR19ERUZBVUxUX1RJTUUpOwogCiAJCWlmIChzdGFydGVkID09IDApCkBAIC00NzksMjIgKzM3OCwyMSBAQAogCQkJCQkJCSJjYW5ub3Qgc3RhcnRcbiIpOwogCX0KIAotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnMzYzI0MTB3ZHRfbWlzY2Rldik7CisJcmV0ID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZzM2MyNDEwX3dkZCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkICglZClcbiIsCi0JCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgcmVnaXN0ZXIgd2F0Y2hkb2cgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBlcnJfY3B1ZnJlcTsKIAl9CiAKIAlpZiAodG1yX2F0Ym9vdCAmJiBzdGFydGVkID09IDApIHsKIAkJZGV2X2luZm8oZGV2LCAic3RhcnRpbmcgd2F0Y2hkb2cgdGltZXJcbiIpOwotCQlzM2MyNDEwd2R0X3N0YXJ0KCk7CisJCXMzYzI0MTB3ZHRfc3RhcnQoJnMzYzI0MTBfd2RkKTsKIAl9IGVsc2UgaWYgKCF0bXJfYXRib290KSB7CiAJCS8qIGlmIHdlJ3JlIG5vdCBlbmFibGluZyB0aGUgd2F0Y2hkb2csIHRoZW4gZW5zdXJlIGl0IGlzCiAJCSAqIGRpc2FibGVkIGlmIGl0IGhhcyBiZWVuIGxlZnQgcnVubmluZyBmcm9tIHRoZSBib290bG9hZGVyCiAJCSAqIG9yIG90aGVyIHNvdXJjZSAqLwogCi0JCXMzYzI0MTB3ZHRfc3RvcCgpOworCQlzM2MyNDEwd2R0X3N0b3AoJnMzYzI0MTBfd2RkKTsKIAl9CiAKIAkvKiBwcmludCBvdXQgYSBzdGF0ZW1lbnQgb2YgcmVhZGluZXNzICovCkBAIC01MzAsNyArNDI4LDcgQEAKIAogc3RhdGljIGludCBfX2RldmV4aXQgczNjMjQxMHdkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewotCW1pc2NfZGVyZWdpc3RlcigmczNjMjQxMHdkdF9taXNjZGV2KTsKKwl3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSgmczNjMjQxMF93ZGQpOwogCiAJczNjMjQxMHdkdF9jcHVmcmVxX2RlcmVnaXN0ZXIoKTsKIApAQCAtNTUwLDcgKzQ0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHMzYzI0MTB3ZHRfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewotCXMzYzI0MTB3ZHRfc3RvcCgpOworCXMzYzI0MTB3ZHRfc3RvcCgmczNjMjQxMF93ZGQpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC01NjUsNyArNDYzLDcgQEAKIAl3dGRhdF9zYXZlID0gcmVhZGwod2R0X2Jhc2UgKyBTM0MyNDEwX1dUREFUKTsKIAogCS8qIE5vdGUgdGhhdCBXVENOVCBkb2Vzbid0IG5lZWQgdG8gYmUgc2F2ZWQuICovCi0JczNjMjQxMHdkdF9zdG9wKCk7CisJczNjMjQxMHdkdF9zdG9wKCZzM2MyNDEwX3dkZCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2Jfd2RvZy5jIGIvZHJpdmVycy93YXRjaGRvZy9zYl93ZG9nLmMKaW5kZXggZjMxNDkzZS4uYjAxYTMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zYl93ZG9nLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zYl93ZG9nLmMKQEAgLTMwMCw3ICszMDAsNyBAQAogCSAqIGdldCB0aGUgcmVzb3VyY2VzCiAJICovCiAKLQlyZXQgPSByZXF1ZXN0X2lycSgxLCBzYndkb2dfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoMSwgc2J3ZG9nX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCWlkZW50LmlkZW50aXR5LCAodm9pZCAqKXVzZXJfZG9nKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZXF1ZXN0IGlycSAxIC0gJWRcbiIsCkBAIC0zNTAsNyArMzUwLDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoMSwgc2J3ZG9nX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorCXJldCA9IHJlcXVlc3RfaXJxKDEsIHNid2RvZ19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkiS2VybmVsIFdhdGNoZG9nIiwgSU9BRERSKEFfU0NEX1dET0dfQ0ZHXzApKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0NSSVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2M1MjBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3NjNTIwX3dkdC5jCmluZGV4IDUyYjYzZjIuLmIyODQwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvc2M1MjBfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zYzUyMF93ZHQuYwpAQCAtMzk4LDcgKzM5OCw3IEBACiAJCQkJCQkJV0FUQ0hET0dfVElNRU9VVCk7CiAJfQogCi0Jd2R0bXJjdGwgPSBpb3JlbWFwKCh1bnNpZ25lZCBsb25nKShNTUNSX0JBU0UgKyBPRkZTX1dEVE1SQ1RMKSwgMik7CisJd2R0bXJjdGwgPSBpb3JlbWFwKE1NQ1JfQkFTRSArIE9GRlNfV0RUTVJDVEwsIDIpOwogCWlmICghd2R0bXJjdGwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlbWFwIG1lbW9yeVxuIik7CiAJCXJjID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc3RtcDN4eHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3N0bXAzeHh4X3dkdC5jCmluZGV4IGIzNDIxZmQuLmFjMjM0NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvc3RtcDN4eHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zdG1wM3h4eF93ZHQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ydGMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jCmluZGV4IGU1YzkxZDQuLmRkNWQ2NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ODM2MjdoZl93ZHQuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKIH0KIAotc3RhdGljIHZvaWQgd2R0X2N0cmwoaW50IHRpbWVvdXQpCitzdGF0aWMgdm9pZCB3ZHRfc2V0X3RpbWUoaW50IHRpbWVvdXQpCiB7CiAJc3Bpbl9sb2NrKCZpb19sb2NrKTsKIApAQCAtMTU4LDEzICsxNTgsMTMgQEAKIAogc3RhdGljIGludCB3ZHRfcGluZyh2b2lkKQogewotCXdkdF9jdHJsKHRpbWVvdXQpOworCXdkdF9zZXRfdGltZSh0aW1lb3V0KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB3ZHRfZGlzYWJsZSh2b2lkKQogewotCXdkdF9jdHJsKDApOworCXdkdF9zZXRfdGltZSgwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc2LDYgKzE3NiwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHdkdF9nZXRfdGltZSh2b2lkKQoreworCWludCB0aW1lbGVmdDsKKworCXNwaW5fbG9jaygmaW9fbG9jayk7CisKKwl3ODM2MjdoZl9zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKKworCW91dGJfcCgweEY2LCBXRFRfRUZFUik7ICAgIC8qIFNlbGVjdCBDUkY2ICovCisJdGltZWxlZnQgPSBpbmJfcChXRFRfRUZEUik7IC8qIFJlYWQgVGltZW91dCBjb3VudGVyIHRvIENSRjYgKi8KKworCXc4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CisKKwlzcGluX3VubG9jaygmaW9fbG9jayk7CisKKwlyZXR1cm4gdGltZWxlZnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHdkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpAQCAtMjAyLDcgKzIyMCw3IEBACiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IF9fdXNlciAqcCA9IGFyZ3A7Ci0JaW50IG5ld190aW1lb3V0OworCWludCB0aW1ldmFsOwogCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKIAkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8CiAJCQkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKQEAgLTIzOCwxNCArMjU2LDE3IEBACiAJCXdkdF9waW5nKCk7CiAJCWJyZWFrOwogCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKLQkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJaWYgKGdldF91c2VyKHRpbWV2YWwsIHApKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdChuZXdfdGltZW91dCkpCisJCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdCh0aW1ldmFsKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQl3ZHRfcGluZygpOwogCQkvKiBGYWxsICovCiAJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgogCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CisJY2FzZSBXRElPQ19HRVRUSU1FTEVGVDoKKwkJdGltZXZhbCA9IHdkdF9nZXRfdGltZSgpOworCQlyZXR1cm4gcHV0X3VzZXIodGltZXZhbCwgcCk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9UVFk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2R0LmMKaW5kZXggYmIwM2UxNS4uZDJlZjAwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dkdC5jCkBAIC02MTIsNyArNjEyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB3ZHRfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAid2R0NTAxcCIsIE5VTEwpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgd2R0X2ludGVycnVwdCwgMCwgIndkdDUwMXAiLCBOVUxMKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAid2R0OiBJUlEgJWQgaXMgbm90IGZyZWUuXG4iLCBpcnEpOwogCQlnb3RvIG91dHJlZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0X3BjaS5jIGIvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMKaW5kZXggMTcyZGFkNi4uZTBmYzNiYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0X3BjaS5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2R0X3BjaS5jCkBAIC02NDMsNyArNjQzLDcgQEAKIAlpcnEgPSBkZXYtPmlycTsKIAlpbyA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDIpOwogCi0JaWYgKHJlcXVlc3RfaXJxKGlycSwgd2R0cGNpX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorCWlmIChyZXF1ZXN0X2lycShpcnEsIHdkdHBjaV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICJ3ZHRfcGNpIiwgJndkdHBjaV9taXNjZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJJUlEgJWQgaXMgbm90IGZyZWVcbiIsIGlycSk7CiAJCWdvdG8gb3V0X3JlZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd204MzF4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKaW5kZXggODcxY2FlYS4uN2JlMzg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKQEAgLTEyLDggKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpAQCAtMjksMTkgKzI4LDE5IEBACiAJCSAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKIAkJIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgd204MzF4X3dkdF91c2VyczsKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3bTgzMXhfd2R0X21pc2NkZXY7Ci1zdGF0aWMgaW50IHdtODMxeF93ZHRfZXhwZWN0X2Nsb3NlOwotc3RhdGljIERFRklORV9NVVRFWCh3ZHRfbXV0ZXgpOwotc3RhdGljIHN0cnVjdCB3bTgzMXggKndtODMxeDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdXBkYXRlX2dwaW87Ci1zdGF0aWMgdW5zaWduZWQgaW50IHVwZGF0ZV9zdGF0ZTsKK3N0cnVjdCB3bTgzMXhfd2R0X2RydmRhdGEgeworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2Ugd2R0OworCXN0cnVjdCB3bTgzMXggKndtODMxeDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlpbnQgdXBkYXRlX2dwaW87CisJaW50IHVwZGF0ZV9zdGF0ZTsKK307CiAKIC8qIFdlIGNhbid0IHVzZSB0aGUgc3ViLXNlY29uZCB2YWx1ZXMgaGVyZSBidXQgdGhleSdyZSBpbmNsdWRlZAogICogZm9yIGNvbXBsZXRlbmVzcy4gICovCiBzdGF0aWMgc3RydWN0IHsKLQlpbnQgdGltZTsgIC8qIFNlY29uZHMgKi8KLQl1MTYgdmFsOyAgIC8qIFdET0dfVE8gdmFsdWUgKi8KKwl1bnNpZ25lZCBpbnQgdGltZTsgIC8qIFNlY29uZHMgKi8KKwl1MTYgdmFsOyAgICAgICAgICAgIC8qIFdET0dfVE8gdmFsdWUgKi8KIH0gd204MzF4X3dkdF9jZmdzW10gPSB7CiAJeyAgMSwgMiB9LAogCXsgIDIsIDMgfSwKQEAgLTUyLDMyICs1MSwxMyBAQAogCXsgMzMsIDcgfSwgIC8qIEFjdHVhbGx5IDMyLjc2OHMgc28gaW5jbHVkZSBib3RoLCBvdGhlcnMgcm91bmQgZG93biAqLwogfTsKIAotc3RhdGljIGludCB3bTgzMXhfd2R0X3NldF90aW1lb3V0KHN0cnVjdCB3bTgzMXggKndtODMxeCwgdTE2IHZhbHVlKQorc3RhdGljIGludCB3bTgzMXhfd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkdF9kZXYpCiB7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkcml2ZXJfZGF0YS0+d204MzF4OwogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZ3ZHRfbXV0ZXgpOwotCi0JcmV0ID0gd204MzF4X3JlZ191bmxvY2sod204MzF4KTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX1dBVENIRE9HLAotCQkJCSAgICAgIFdNODMxWF9XRE9HX1RPX01BU0ssIHZhbHVlKTsKLQkJd204MzF4X3JlZ19sb2NrKHdtODMxeCk7Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byB1bmxvY2sgc2VjdXJpdHkga2V5OiAlZFxuIiwKLQkJCXJldCk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ3ZHRfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3bTgzMXhfd2R0X3N0YXJ0KHN0cnVjdCB3bTgzMXggKndtODMxeCkKLXsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmd2R0X211dGV4KTsKKwltdXRleF9sb2NrKCZkcml2ZXJfZGF0YS0+bG9jayk7CiAKIAlyZXQgPSB3bTgzMXhfcmVnX3VubG9jayh3bTgzMXgpOwogCWlmIChyZXQgPT0gMCkgewpAQCAtODksMTYgKzY5LDE4IEBACiAJCQlyZXQpOwogCX0KIAotCW11dGV4X3VubG9jaygmd2R0X211dGV4KTsKKwltdXRleF91bmxvY2soJmRyaXZlcl9kYXRhLT5sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgd204MzF4X3dkdF9zdG9wKHN0cnVjdCB3bTgzMXggKndtODMxeCkKK3N0YXRpYyBpbnQgd204MzF4X3dkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkdF9kZXYpCiB7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkcml2ZXJfZGF0YS0+d204MzF4OwogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZ3ZHRfbXV0ZXgpOworCW11dGV4X2xvY2soJmRyaXZlcl9kYXRhLT5sb2NrKTsKIAogCXJldCA9IHdtODMxeF9yZWdfdW5sb2NrKHdtODMxeCk7CiAJaWYgKHJldCA9PSAwKSB7CkBAIC0xMTAsMjYgKzkyLDI4IEBACiAJCQlyZXQpOwogCX0KIAotCW11dGV4X3VubG9jaygmd2R0X211dGV4KTsKKwltdXRleF91bmxvY2soJmRyaXZlcl9kYXRhLT5sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgd204MzF4X3dkdF9raWNrKHN0cnVjdCB3bTgzMXggKndtODMxeCkKK3N0YXRpYyBpbnQgd204MzF4X3dkdF9waW5nKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkdF9kZXYpCiB7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkcml2ZXJfZGF0YS0+d204MzF4OwogCWludCByZXQ7CiAJdTE2IHJlZzsKIAotCW11dGV4X2xvY2soJndkdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmZHJpdmVyX2RhdGEtPmxvY2spOwogCi0JaWYgKHVwZGF0ZV9ncGlvKSB7Ci0JCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHVwZGF0ZV9ncGlvLCB1cGRhdGVfc3RhdGUpOwotCQl1cGRhdGVfc3RhdGUgPSAhdXBkYXRlX3N0YXRlOworCWlmIChkcml2ZXJfZGF0YS0+dXBkYXRlX2dwaW8pIHsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZHJpdmVyX2RhdGEtPnVwZGF0ZV9ncGlvLAorCQkJCQlkcml2ZXJfZGF0YS0+dXBkYXRlX3N0YXRlKTsKKwkJZHJpdmVyX2RhdGEtPnVwZGF0ZV9zdGF0ZSA9ICFkcml2ZXJfZGF0YS0+dXBkYXRlX3N0YXRlOwogCQlyZXQgPSAwOwogCQlnb3RvIG91dDsKIAl9CiAKLQogCXJlZyA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9XQVRDSERPRyk7CiAKIAlpZiAoIShyZWcgJiBXTTgzMVhfV0RPR19SU1RfU1JDKSkgewpAQCAtMTUwLDE4MiArMTM0LDU5IEBACiAJfQogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ3ZHRfbXV0ZXgpOworCW11dGV4X3VubG9jaygmZHJpdmVyX2RhdGEtPmxvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB3bTgzMXhfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IHdtODMxeF93ZHRfc2V0X3RpbWVvdXQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2R0X2RldiwKKwkJCQkgIHVuc2lnbmVkIGludCB0aW1lb3V0KQogewotCWludCByZXQ7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkcml2ZXJfZGF0YS0+d204MzF4OworCWludCByZXQsIGk7CiAKLQlpZiAoIXdtODMxeCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKTsgaSsrKQorCQlpZiAod204MzF4X3dkdF9jZmdzW2ldLnRpbWUgPT0gdGltZW91dCkKKwkJCWJyZWFrOworCWlmIChpID09IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKSkKKwkJcmV0ID0gLUVJTlZBTDsKIAotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3bTgzMXhfd2R0X3VzZXJzKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJldCA9IHdtODMxeF93ZHRfc3RhcnQod204MzF4KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgd204MzF4X3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWlmICh3bTgzMXhfd2R0X2V4cGVjdF9jbG9zZSkKLQkJd204MzF4X3dkdF9zdG9wKHdtODMxeCk7Ci0JZWxzZSB7Ci0JCWRldl93YXJuKHdtODMxeC0+ZGV2LCAiV2F0Y2hkb2cgZGV2aWNlIGNsb3NlZCB1bmNsZWFubHlcbiIpOwotCQl3bTgzMXhfd2R0X2tpY2sod204MzF4KTsKKwlyZXQgPSB3bTgzMXhfcmVnX3VubG9jayh3bTgzMXgpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfV0FUQ0hET0csCisJCQkJICAgICAgV004MzFYX1dET0dfVE9fTUFTSywKKwkJCQkgICAgICB3bTgzMXhfd2R0X2NmZ3NbaV0udmFsKTsKKwkJd204MzF4X3JlZ19sb2NrKHdtODMxeCk7CisJfSBlbHNlIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byB1bmxvY2sgc2VjdXJpdHkga2V5OiAlZFxuIiwKKwkJCXJldCk7CiAJfQogCi0JY2xlYXJfYml0KDAsICZ3bTgzMXhfd2R0X3VzZXJzKTsKLQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHdtODMxeF93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwKLQkJCQlsb2ZmX3QgKnBwb3MpCi17Ci0Jc2l6ZV90IGk7Ci0KLQlpZiAoY291bnQpIHsKLQkJd204MzF4X3dkdF9raWNrKHdtODMxeCk7Ci0KLQkJaWYgKCFub3dheW91dCkgewotCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCi0JCQl3bTgzMXhfd2R0X2V4cGVjdF9jbG9zZSA9IDA7Ci0KLQkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMKLQkJCSAgIGNoYXJhY3RlciAqLwotCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7Ci0JCQkJY2hhciBjOwotCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmIChjID09ICdWJykKLQkJCQkJd204MzF4X3dkdF9leHBlY3RfY2xvc2UgPSA0MjsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyB3bTgzMXhfd2R0X2luZm8gPSB7CiAJLm9wdGlvbnMgPSBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0UsCiAJLmlkZW50aXR5ID0gIldNODMxeCBXYXRjaGRvZyIsCiB9OwogCi1zdGF0aWMgbG9uZyB3bTgzMXhfd2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0ID0gLUVOT1RUWSwgdGltZSwgaTsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgX191c2VyICpwID0gYXJncDsKLQl1MTYgcmVnOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6Ci0JCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBXRElPQ19HRVRTVEFUVVM6Ci0JY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgotCQlyZXQgPSBwdXRfdXNlcigwLCBwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdESU9DX1NFVE9QVElPTlM6Ci0JewotCQlpbnQgb3B0aW9uczsKLQotCQlpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlyZXQgPSAtRUlOVkFMOwotCi0JCS8qIFNldHRpbmcgYm90aCBzaW11bHRhbmVvdXNseSBtZWFucyBhdCBsZWFzdCBvbmUgbXVzdCBmYWlsICovCi0JCWlmIChvcHRpb25zID09IFdESU9TX0RJU0FCTEVDQVJEKQotCQkJcmV0ID0gd204MzF4X3dkdF9zdGFydCh3bTgzMXgpOwotCi0JCWlmIChvcHRpb25zID09IFdESU9TX0VOQUJMRUNBUkQpCi0JCQlyZXQgPSB3bTgzMXhfd2R0X3N0b3Aod204MzF4KTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBXRElPQ19LRUVQQUxJVkU6Ci0JCXJldCA9IHdtODMxeF93ZHRfa2ljayh3bTgzMXgpOwotCQlicmVhazsKLQotCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKLQkJcmV0ID0gZ2V0X3VzZXIodGltZSwgcCk7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQotCQlpZiAodGltZSA9PSAwKSB7Ci0JCQlpZiAobm93YXlvdXQpCi0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCQl3bTgzMXhfd2R0X3N0b3Aod204MzF4KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKTsgaSsrKQotCQkJaWYgKHdtODMxeF93ZHRfY2Znc1tpXS50aW1lID09IHRpbWUpCi0JCQkJYnJlYWs7Ci0JCWlmIChpID09IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKSkKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXJldCA9IHdtODMxeF93ZHRfc2V0X3RpbWVvdXQod204MzF4LAotCQkJCQkJICAgICB3bTgzMXhfd2R0X2NmZ3NbaV0udmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6Ci0JCXJlZyA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9XQVRDSERPRyk7Ci0JCXJlZyAmPSBXTTgzMVhfV0RPR19UT19NQVNLOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXhfd2R0X2NmZ3MpOyBpKyspCi0JCQlpZiAod204MzF4X3dkdF9jZmdzW2ldLnZhbCA9PSByZWcpCi0JCQkJYnJlYWs7Ci0JCWlmIChpID09IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKSkgewotCQkJZGV2X3dhcm4od204MzF4LT5kZXYsCi0JCQkJICJVbmtub3duIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb246ICV4XG4iLCByZWcpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfSBlbHNlCi0JCQlyZXQgPSBwdXRfdXNlcih3bTgzMXhfd2R0X2NmZ3NbaV0udGltZSwgcCk7Ci0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3bTgzMXhfd2R0X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX29wcyB3bTgzMXhfd2R0X29wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKLQkubGxzZWVrID0gbm9fbGxzZWVrLAotCS53cml0ZSA9IHdtODMxeF93ZHRfd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsID0gd204MzF4X3dkdF9pb2N0bCwKLQkub3BlbiA9IHdtODMxeF93ZHRfb3BlbiwKLQkucmVsZWFzZSA9IHdtODMxeF93ZHRfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3bTgzMXhfd2R0X21pc2NkZXYgPSB7Ci0JLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCi0JLm5hbWUgPSAid2F0Y2hkb2ciLAotCS5mb3BzID0gJndtODMxeF93ZHRfZm9wcywKKwkuc3RhcnQgPSB3bTgzMXhfd2R0X3N0YXJ0LAorCS5zdG9wID0gd204MzF4X3dkdF9zdG9wLAorCS5waW5nID0gd204MzF4X3dkdF9waW5nLAorCS5zZXRfdGltZW91dCA9IHdtODMxeF93ZHRfc2V0X3RpbWVvdXQsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTgzMXhfd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCB3bTgzMXhfcGRhdGEgKmNoaXBfcGRhdGE7CiAJc3RydWN0IHdtODMxeF93YXRjaGRvZ19wZGF0YSAqcGRhdGE7Ci0JaW50IHJlZywgcmV0OwotCi0JaWYgKHdtODMxeCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ3bTgzMXggd2F0Y2hkb2cgYWxyZWFkeSByZWdpc3RlcmVkXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQl3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGE7CisJc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd204MzF4X3dkdDsKKwlpbnQgcmVnLCByZXQsIGk7CiAKIAlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfV0FUQ0hET0cpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0zMzgsNiArMTk5LDM2IEBACiAJaWYgKHJlZyAmIFdNODMxWF9XRE9HX0RFQlVHKQogCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIldhdGNoZG9nIGlzIHBhdXNlZFxuIik7CiAKKwlkcml2ZXJfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkcml2ZXJfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZHJpdmVyX2RhdGEpIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIlVuYWJsZSB0byBhbGxvYWNhdGUgd2F0Y2hkb2cgZGV2aWNlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJbXV0ZXhfaW5pdCgmZHJpdmVyX2RhdGEtPmxvY2spOworCWRyaXZlcl9kYXRhLT53bTgzMXggPSB3bTgzMXg7CisKKwl3bTgzMXhfd2R0ID0gJmRyaXZlcl9kYXRhLT53ZHQ7CisKKwl3bTgzMXhfd2R0LT5pbmZvID0gJndtODMxeF93ZHRfaW5mbzsKKwl3bTgzMXhfd2R0LT5vcHMgPSAmd204MzF4X3dkdF9vcHM7CisJd2F0Y2hkb2dfc2V0X2RydmRhdGEod204MzF4X3dkdCwgZHJpdmVyX2RhdGEpOworCisJaWYgKG5vd2F5b3V0KQorCQl3bTgzMXhfd2R0LT5zdGF0dXMgfD0gV0RPR19OT19XQVlfT1VUOworCisJcmVnID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX1dBVENIRE9HKTsKKwlyZWcgJj0gV004MzFYX1dET0dfVE9fTUFTSzsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXhfd2R0X2NmZ3MpOyBpKyspCisJCWlmICh3bTgzMXhfd2R0X2NmZ3NbaV0udmFsID09IHJlZykKKwkJCWJyZWFrOworCWlmIChpID09IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKSkKKwkJZGV2X3dhcm4od204MzF4LT5kZXYsCisJCQkgIlVua25vd24gd2F0Y2hkb2cgdGltZW91dDogJXhcbiIsIHJlZyk7CisJZWxzZQorCQl3bTgzMXhfd2R0LT50aW1lb3V0ID0gd204MzF4X3dkdF9jZmdzW2ldLnRpbWU7CisKIAkvKiBBcHBseSBhbnkgY29uZmlndXJhdGlvbiAqLwogCWlmIChwZGV2LT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhKSB7CiAJCWNoaXBfcGRhdGEgPSBwZGV2LT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOwpAQCAtMzYxLDcgKzI1Miw3IEBACiAJCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKIAkJCQkJIkZhaWxlZCB0byByZXF1ZXN0IHVwZGF0ZSBHUElPOiAlZFxuIiwKIAkJCQkJcmV0KTsKLQkJCQlnb3RvIGVycjsKKwkJCQlnb3RvIGVycl9hbGxvYzsKIAkJCX0KIAogCQkJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT51cGRhdGVfZ3BpbywgMCk7CkBAIC0zNzIsNyArMjYzLDcgQEAKIAkJCQlnb3RvIGVycl9ncGlvOwogCQkJfQogCi0JCQl1cGRhdGVfZ3BpbyA9IHBkYXRhLT51cGRhdGVfZ3BpbzsKKwkJCWRyaXZlcl9kYXRhLT51cGRhdGVfZ3BpbyA9IHBkYXRhLT51cGRhdGVfZ3BpbzsKIAogCQkJLyogTWFrZSBzdXJlIHRoZSB3YXRjaGRvZyB0YWtlcyBoYXJkd2FyZSB1cGRhdGVzICovCiAJCQlyZWcgfD0gV004MzFYX1dET0dfUlNUX1NSQzsKQEAgLTM4OSwzMyArMjgwLDM0IEBACiAJCX0KIAl9CiAKLQl3bTgzMXhfd2R0X21pc2NkZXYucGFyZW50ID0gJnBkZXYtPmRldjsKLQotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJndtODMxeF93ZHRfbWlzY2Rldik7CisJcmV0ID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZkcml2ZXJfZGF0YS0+d2R0KTsKIAlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBtaXNjZGV2OiAlZFxuIiwgcmV0KTsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIndhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgpIGZhaWxlZDogJWRcbiIsCisJCQlyZXQpOwogCQlnb3RvIGVycl9ncGlvOwogCX0KIAorCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBkcml2ZXJfZGF0YSk7CisKIAlyZXR1cm4gMDsKIAogZXJyX2dwaW86Ci0JaWYgKHVwZGF0ZV9ncGlvKSB7Ci0JCWdwaW9fZnJlZSh1cGRhdGVfZ3Bpbyk7Ci0JCXVwZGF0ZV9ncGlvID0gMDsKLQl9CisJaWYgKGRyaXZlcl9kYXRhLT51cGRhdGVfZ3BpbykKKwkJZ3Bpb19mcmVlKGRyaXZlcl9kYXRhLT51cGRhdGVfZ3Bpbyk7CitlcnJfYWxsb2M6CisJa2ZyZWUoZHJpdmVyX2RhdGEpOwogZXJyOgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IHdtODMxeF93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaWYgKHVwZGF0ZV9ncGlvKSB7Ci0JCWdwaW9fZnJlZSh1cGRhdGVfZ3Bpbyk7Ci0JCXVwZGF0ZV9ncGlvID0gMDsKLQl9CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CiAKLQltaXNjX2RlcmVnaXN0ZXIoJndtODMxeF93ZHRfbWlzY2Rldik7CisJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJmRyaXZlcl9kYXRhLT53ZHQpOworCisJaWYgKGRyaXZlcl9kYXRhLT51cGRhdGVfZ3BpbykKKwkJZ3Bpb19mcmVlKGRyaXZlcl9kYXRhLT51cGRhdGVfZ3Bpbyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2JhbGxvb24uYyBiL2RyaXZlcnMveGVuL2JhbGxvb24uYwppbmRleCA1ODc2ZTFhLi5hNzY3ODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMKKysrIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KQEAgLTkzLDggKzk0LDggQEAKICNkZWZpbmUgaW5jX3RvdGFsaGlnaF9wYWdlcygpICh0b3RhbGhpZ2hfcGFnZXMrKykKICNkZWZpbmUgZGVjX3RvdGFsaGlnaF9wYWdlcygpICh0b3RhbGhpZ2hfcGFnZXMtLSkKICNlbHNlCi0jZGVmaW5lIGluY190b3RhbGhpZ2hfcGFnZXMoKSBkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBkZWNfdG90YWxoaWdoX3BhZ2VzKCkgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgaW5jX3RvdGFsaGlnaF9wYWdlcygpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWNfdG90YWxoaWdoX3BhZ2VzKCkgZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKIAogLyogTGlzdCBvZiBiYWxsb29uZWQgcGFnZXMsIHRocmVhZGVkIHRocm91Z2ggdGhlIG1lbV9tYXAgYXJyYXkuICovCkBAIC0xNTQsOCArMTU1LDcgQEAKIAlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpIHsKIAkJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2hpZ2gtLTsKIAkJaW5jX3RvdGFsaGlnaF9wYWdlcygpOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCWJhbGxvb25fc3RhdHMuYmFsbG9vbl9sb3ctLTsKIAogCXRvdGFscmFtX3BhZ2VzKys7CkBAIC00MjIsNyArNDIyLDcgQEAKIAkJCQkodW5zaWduZWQgbG9uZylfX3ZhKHBmbiA8PCBQQUdFX1NISUZUKSwKIAkJCQlfX3B0ZV9tYSgwKSwgMCk7CiAJCQlCVUdfT04ocmV0KTsKLSAgICAgICAgICAgICAgICB9CisJCX0KIAogCX0KIApAQCAtNTA3LDcgKzUwNyw3IEBACiBpbnQgYWxsb2NfeGVuYmFsbG9vbmVkX3BhZ2VzKGludCBucl9wYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlcywgYm9vbCBoaWdobWVtKQogewogCWludCBwZ25vID0gMDsKLQlzdHJ1Y3QgcGFnZSogcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAltdXRleF9sb2NrKCZiYWxsb29uX211dGV4KTsKIAl3aGlsZSAocGdubyA8IG5yX3BhZ2VzKSB7CiAJCXBhZ2UgPSBiYWxsb29uX3JldHJpZXZlKGhpZ2htZW0pOwpAQCAtNTQwLDcgKzU0MCw3IEBACiAgKiBAbnJfcGFnZXM6IE51bWJlciBvZiBwYWdlcwogICogQHBhZ2VzOiBwYWdlcyB0byByZXR1cm4KICAqLwotdm9pZCBmcmVlX3hlbmJhbGxvb25lZF9wYWdlcyhpbnQgbnJfcGFnZXMsIHN0cnVjdCBwYWdlKiogcGFnZXMpCit2b2lkIGZyZWVfeGVuYmFsbG9vbmVkX3BhZ2VzKGludCBucl9wYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwppbmRleCAwZWI4YTU3Li42ZTA3NWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpAQCAtODUsOCArODUsNyBAQAogICogICAgSVBJIC0gSVBJIHZlY3RvcgogICogICAgRVZUQ0hOIC0KICAqLwotc3RydWN0IGlycV9pbmZvCi17CitzdHJ1Y3QgaXJxX2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAllbnVtIHhlbl9pcnFfdHlwZSB0eXBlOwkvKiB0eXBlICovCiAJdW5zaWduZWQgaXJxOwpAQCAtMjgyLDkgKzI4MSw5IEBACiAJCQkJCSAgIHN0cnVjdCBzaGFyZWRfaW5mbyAqc2gsCiAJCQkJCSAgIHVuc2lnbmVkIGludCBpZHgpCiB7Ci0JcmV0dXJuIChzaC0+ZXZ0Y2huX3BlbmRpbmdbaWR4XSAmCisJcmV0dXJuIHNoLT5ldnRjaG5fcGVuZGluZ1tpZHhdICYKIAkJcGVyX2NwdShjcHVfZXZ0Y2huX21hc2ssIGNwdSlbaWR4XSAmCi0JCX5zaC0+ZXZ0Y2huX21hc2tbaWR4XSk7CisJCX5zaC0+ZXZ0Y2huX21hc2tbaWR4XTsKIH0KIAogc3RhdGljIHZvaWQgYmluZF9ldnRjaG5fdG9fY3B1KHVuc2lnbmVkIGludCBjaG4sIHVuc2lnbmVkIGludCBjcHUpCkBAIC0xMTgwLDcgKzExNzksNyBAQAogCWludCBjcHUgPSBnZXRfY3B1KCk7CiAJc3RydWN0IHNoYXJlZF9pbmZvICpzID0gSFlQRVJWSVNPUl9zaGFyZWRfaW5mbzsKIAlzdHJ1Y3QgdmNwdV9pbmZvICp2Y3B1X2luZm8gPSBfX3RoaXNfY3B1X3JlYWQoeGVuX3ZjcHUpOwotIAl1bnNpZ25lZCBjb3VudDsKKwl1bnNpZ25lZCBjb3VudDsKIAogCWRvIHsKIAkJdW5zaWduZWQgbG9uZyBwZW5kaW5nX3dvcmRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ250ZGV2LmMgYi9kcml2ZXJzL3hlbi9nbnRkZXYuYwppbmRleCA4ODA3OThhLi4zOTg3MTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9nbnRkZXYuYworKysgYi9kcml2ZXJzL3hlbi9nbnRkZXYuYwpAQCAtMTkzLDkgKzE5Myw4IEBACiAKIAlhdG9taWNfc3ViKG1hcC0+Y291bnQsICZwYWdlc19tYXBwZWQpOwogCi0JaWYgKG1hcC0+bm90aWZ5LmZsYWdzICYgVU5NQVBfTk9USUZZX1NFTkRfRVZFTlQpIHsKKwlpZiAobWFwLT5ub3RpZnkuZmxhZ3MgJiBVTk1BUF9OT1RJRllfU0VORF9FVkVOVCkKIAkJbm90aWZ5X3JlbW90ZV92aWFfZXZ0Y2huKG1hcC0+bm90aWZ5LmV2ZW50KTsKLQl9CiAKIAlpZiAobWFwLT5wYWdlcykgewogCQlpZiAoIXVzZV9wdGVtb2QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jIGIvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYwppbmRleCA4YzcxYWI4MC4uYmYxYzA5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYworKysgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAogCW5mbGFncyA9IHNoYXJlZFtyZWZdLmZsYWdzOwogCi0JcmV0dXJuIChuZmxhZ3MgJiAoR1RGX3JlYWRpbmd8R1RGX3dyaXRpbmcpKTsKKwlyZXR1cm4gbmZsYWdzICYgKEdURl9yZWFkaW5nfEdURl93cml0aW5nKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdudHRhYl9xdWVyeV9mb3JlaWduX2FjY2Vzcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL21hbmFnZS5jIGIvZHJpdmVycy94ZW4vbWFuYWdlLmMKaW5kZXggMGI1MzY2Yi4uY2U0ZmEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vbWFuYWdlLmMKKysrIGIvZHJpdmVycy94ZW4vbWFuYWdlLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vcGNpLmMgYi9kcml2ZXJzL3hlbi9wY2kuYwppbmRleCA2NjA1NzA3Li5iODRiZjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9wY2kuYworKysgYi9kcml2ZXJzL3hlbi9wY2kuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAJCQkmbWFuYWdlX3BjaV9leHQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBwaHlzZGV2X21hbmFnZV9wY2kgbWFuYWdlX3BjaSA9IHsKLQkJCS5idXMgCT0gcGNpX2Rldi0+YnVzLT5udW1iZXIsCisJCQkuYnVzCT0gcGNpX2Rldi0+YnVzLT5udW1iZXIsCiAJCQkuZGV2Zm4JPSBwY2lfZGV2LT5kZXZmbiwKIAkJfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vc3dpb3RsYi14ZW4uYyBiL2RyaXZlcnMveGVuL3N3aW90bGIteGVuLmMKaW5kZXggYzk4NDc2OC4uOGU5NjRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vc3dpb3RsYi14ZW4uYworKysgYi9kcml2ZXJzL3hlbi9zd2lvdGxiLXhlbi5jCkBAIC0zNSw2ICszNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDx4ZW4vc3dpb3RsYi14ZW4uaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgogI2luY2x1ZGUgPHhlbi94ZW4tb3BzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tYmFsbG9vbi5jIGIvZHJpdmVycy94ZW4veGVuLWJhbGxvb24uYwppbmRleCA1YzlkYzQzLi45Y2MyMjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW4tYmFsbG9vbi5jCisrKyBiL2RyaXZlcnMveGVuL3hlbi1iYWxsb29uLmMKQEAgLTUwLDExICs1MCw2IEBACiAKIHN0YXRpYyBpbnQgcmVnaXN0ZXJfYmFsbG9vbihzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KTsKIAotc3RhdGljIHN0cnVjdCB4ZW5idXNfd2F0Y2ggdGFyZ2V0X3dhdGNoID0KLXsKLQkubm9kZSA9ICJtZW1vcnkvdGFyZ2V0IgotfTsKLQogLyogUmVhY3QgdG8gYSBjaGFuZ2UgaW4gdGhlIHRhcmdldCBrZXkgKi8KIHN0YXRpYyB2b2lkIHdhdGNoX3RhcmdldChzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKIAkJCSBjb25zdCBjaGFyICoqdmVjLCB1bnNpZ25lZCBpbnQgbGVuKQpAQCAtNzMsNiArNjgsMTEgQEAKIAkgKi8KIAliYWxsb29uX3NldF9uZXdfdGFyZ2V0KG5ld190YXJnZXQgPj4gKFBBR0VfU0hJRlQgLSAxMCkpOwogfQorc3RhdGljIHN0cnVjdCB4ZW5idXNfd2F0Y2ggdGFyZ2V0X3dhdGNoID0geworCS5ub2RlID0gIm1lbW9yeS90YXJnZXQiLAorCS5jYWxsYmFjayA9IHdhdGNoX3RhcmdldCwKK307CisKIAogc3RhdGljIGludCBiYWxsb29uX2luaXRfd2F0Y2hlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLAogCQkJCXVuc2lnbmVkIGxvbmcgZXZlbnQsCkBAIC04Nyw3ICs4Nyw5IEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHhlbnN0b3JlX25vdGlmaWVyOworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5zdG9yZV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGJhbGxvb25faW5pdF93YXRjaGVyLAorfTsKIAogc3RhdGljIGludCBfX2luaXQgYmFsbG9vbl9pbml0KHZvaWQpCiB7CkBAIC0xMDAsOSArMTAyLDYgQEAKIAogCXJlZ2lzdGVyX3hlbl9zZWxmYmFsbG9vbmluZygmYmFsbG9vbl9zeXNkZXYpOwogCi0JdGFyZ2V0X3dhdGNoLmNhbGxiYWNrID0gd2F0Y2hfdGFyZ2V0OwotCXhlbnN0b3JlX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBiYWxsb29uX2luaXRfd2F0Y2hlcjsKLQogCXJlZ2lzdGVyX3hlbnN0b3JlX25vdGlmaWVyKCZ4ZW5zdG9yZV9ub3RpZmllcik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2UuYyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2UuYwppbmRleCA0NDQzNDVhLi41MmZlZDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9jb25mX3NwYWNlLmMKKysrIGIvZHJpdmVycy94ZW4veGVuLXBjaWJhY2svY29uZl9zcGFjZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgInBjaWJhY2suaCIKICNpbmNsdWRlICJjb25mX3NwYWNlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NsaWVudC5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jbGllbnQuYwppbmRleCBjZGFjZjkyLi44MWMzY2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NsaWVudC5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY2xpZW50LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2V2ZW50X2NoYW5uZWwuaD4KQEAgLTQ0Myw3ICs0NDQsNyBAQAogCiAJKnZhZGRyID0gTlVMTDsKIAotCWFyZWEgPSB4ZW5fYWxsb2Nfdm1fYXJlYShQQUdFX1NJWkUpOworCWFyZWEgPSBhbGxvY192bV9hcmVhKFBBR0VfU0laRSk7CiAJaWYgKCFhcmVhKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNDUzLDcgKzQ1NCw3IEBACiAJCUJVRygpOwogCiAJaWYgKG9wLnN0YXR1cyAhPSBHTlRTVF9va2F5KSB7Ci0JCXhlbl9mcmVlX3ZtX2FyZWEoYXJlYSk7CisJCWZyZWVfdm1fYXJlYShhcmVhKTsKIAkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIG9wLnN0YXR1cywKIAkJCQkgIm1hcHBpbmcgaW4gc2hhcmVkIHBhZ2UgJWQgZnJvbSBkb21haW4gJWQiLAogCQkJCSBnbnRfcmVmLCBkZXYtPm90aGVyZW5kX2lkKTsKQEAgLTU1Miw3ICs1NTMsNyBAQAogCQlCVUcoKTsKIAogCWlmIChvcC5zdGF0dXMgPT0gR05UU1Rfb2theSkKLQkJeGVuX2ZyZWVfdm1fYXJlYShhcmVhKTsKKwkJZnJlZV92bV9hcmVhKGFyZWEpOwogCWVsc2UKIAkJeGVuYnVzX2Rldl9lcnJvcihkZXYsIG9wLnN0YXR1cywKIAkJCQkgInVubWFwcGluZyBwYWdlIGF0IGhhbmRsZSAlZCBlcnJvciAlZCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKaW5kZXggY2VmOWIwYi4uMWIxNzhjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0zMDksOCArMzEwLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHhlbmJ1c191bnJlZ2lzdGVyX2RyaXZlcik7CiAKLXN0cnVjdCB4Yl9maW5kX2luZm8KLXsKK3N0cnVjdCB4Yl9maW5kX2luZm8gewogCXN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXY7CiAJY29uc3QgY2hhciAqbm9kZW5hbWU7CiB9OwpAQCAtNjM5LDcgKzYzOSw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfZGV2X2NhbmNlbCk7CiAKIC8qIEEgZmxhZyB0byBkZXRlcm1pbmUgaWYgeGVuc3RvcmVkIGlzICdyZWFkeScgKGkuZS4gaGFzIHN0YXJ0ZWQpICovCi1pbnQgeGVuc3RvcmVkX3JlYWR5ID0gMDsKK2ludCB4ZW5zdG9yZWRfcmVhZHk7CiAKIAogaW50IHJlZ2lzdGVyX3hlbnN0b3JlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCkBAIC03NzAsNyArNzcwLDcgQEAKIAlwcm9jX21rZGlyKCJ4ZW4iLCBOVUxMKTsKICNlbmRpZgogCi0gb3V0X2Vycm9yOgorb3V0X2Vycm9yOgogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaCBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaAppbmRleCBiODE0OTM1Li45YjFkZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmgKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oCkBAIC0zNiw4ICszNiw3IEBACiAKICNkZWZpbmUgWEVOX0JVU19JRF9TSVpFCQkJMjAKIAotc3RydWN0IHhlbl9idXNfdHlwZQoteworc3RydWN0IHhlbl9idXNfdHlwZSB7CiAJY2hhciAqcm9vdDsKIAl1bnNpZ25lZCBpbnQgbGV2ZWxzOwogCWludCAoKmdldF9idXNfaWQpKGNoYXIgYnVzX2lkW1hFTl9CVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfYmFja2VuZC5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9iYWNrZW5kLmMKaW5kZXggMzI0MTdiNS4uYzNjN2NkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9iYWNrZW5kLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9iYWNrZW5kLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfZnJvbnRlbmQuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfZnJvbnRlbmQuYwppbmRleCA1NDA1ODdlLi4yZjczMTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9mcm9udGVuZC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvem9ycm8vcHJvYy5jIGIvZHJpdmVycy96b3Jyby9wcm9jLmMKaW5kZXggZTBjODQ3Mi4uOTg4ODgwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy96b3Jyby9wcm9jLmMKKysrIGIvZHJpdmVycy96b3Jyby9wcm9jLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2lub2RlLmMgYi9mcy85cC92ZnNfaW5vZGUuYwppbmRleCBiNWExMDc2Li44NzllZDg4IDEwMDY0NAotLS0gYS9mcy85cC92ZnNfaW5vZGUuYworKysgYi9mcy85cC92ZnNfaW5vZGUuYwpAQCAtMTEzOCw3ICsxMTM4LDcgQEAKIAlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gc2ItPnNfZnNfaW5mbzsKIAlzdHJ1Y3Qgdjlmc19pbm9kZSAqdjlpbm9kZSA9IFY5RlNfSShpbm9kZSk7CiAKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHN0YXQtPmF0aW1lOwogCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHN0YXQtPm10aW1lOwpAQCAtMTE2NCw3ICsxMTY0LDcgQEAKIAkJCS8qIEhBUkRMSU5LQ09VTlQgJXUgKi8KIAkJCXNzY2FuZihleHQsICIlMTNzICV1IiwgdGFnX25hbWUsICZpX25saW5rKTsKIAkJCWlmICghc3RybmNtcCh0YWdfbmFtZSwgIkhBUkRMSU5LQ09VTlQiLCAxMykpCi0JCQkJaW5vZGUtPmlfbmxpbmsgPSBpX25saW5rOworCQkJCXNldF9ubGluayhpbm9kZSwgaV9ubGluayk7CiAJCX0KIAl9CiAJbW9kZSA9IHN0YXQtPm1vZGUgJiBTX0lBTExVR087CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfaW5vZGVfZG90bC5jIGIvZnMvOXAvdmZzX2lub2RlX2RvdGwuYwppbmRleCBhZGVkNzlmLi4wYjU3NDVlIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfaW5vZGVfZG90bC5jCisrKyBiL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMKQEAgLTYwNiw3ICs2MDYsNyBAQAogCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gc3RhdC0+c3RfY3RpbWVfbnNlYzsKIAkJaW5vZGUtPmlfdWlkID0gc3RhdC0+c3RfdWlkOwogCQlpbm9kZS0+aV9naWQgPSBzdGF0LT5zdF9naWQ7Ci0JCWlub2RlLT5pX25saW5rID0gc3RhdC0+c3Rfbmxpbms7CisJCXNldF9ubGluayhpbm9kZSwgc3RhdC0+c3RfbmxpbmspOwogCiAJCW1vZGUgPSBzdGF0LT5zdF9tb2RlICYgU19JQUxMVUdPOwogCQltb2RlIHw9IGlub2RlLT5pX21vZGUgJiB+U19JQUxMVUdPOwpAQCAtNjMyLDcgKzYzMiw3IEBACiAJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0dJRCkKIAkJCWlub2RlLT5pX2dpZCA9IHN0YXQtPnN0X2dpZDsKIAkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfTkxJTkspCi0JCQlpbm9kZS0+aV9ubGluayA9IHN0YXQtPnN0X25saW5rOworCQkJc2V0X25saW5rKGlub2RlLCBzdGF0LT5zdF9ubGluayk7CiAJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX01PREUpIHsKIAkJCWlub2RlLT5pX21vZGUgPSBzdGF0LT5zdF9tb2RlOwogCQkJaWYgKChTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB8fApkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggOWZlMGIzNC4uNWY0YzQ1ZCAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0xMDksNyArMTA5LDcgQEAKIHNvdXJjZSAiZnMvc3lzZnMvS2NvbmZpZyIKIAogY29uZmlnIFRNUEZTCi0JYm9vbCAiVmlydHVhbCBtZW1vcnkgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoZm9ybWVyIHNobSBmcykiCisJYm9vbCAiVG1wZnMgdmlydHVhbCBtZW1vcnkgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoZm9ybWVyIHNobSBmcykiCiAJZGVwZW5kcyBvbiBTSE1FTQogCWhlbHAKIAkgIFRtcGZzIGlzIGEgZmlsZSBzeXN0ZW0gd2hpY2gga2VlcHMgYWxsIGZpbGVzIGluIHZpcnR1YWwgbWVtb3J5LgpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCA1YzMwYTEzLi5kMmMzMzUzIDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtMTIwLDYgKzEyMCw2IEBACiBvYmotJChDT05GSUdfT0NGUzJfRlMpCQkrPSBvY2ZzMi8KIG9iai0kKENPTkZJR19CVFJGU19GUykJCSs9IGJ0cmZzLwogb2JqLSQoQ09ORklHX0dGUzJfRlMpICAgICAgICAgICArPSBnZnMyLwotb2JqLSQoeSkgICAgICAgICAgCQkrPSBleG9mcy8gIyBNdWx0aXBsZSBtb2RzLCB1c2VkIGJ5IG5mcy9vYmpsYXlvdXQKK29iai15CQkJCSs9IGV4b2ZzLyAjIE11bHRpcGxlIG1vZHVsZXMKIG9iai0kKENPTkZJR19DRVBIX0ZTKQkJKz0gY2VwaC8KIG9iai0kKENPTkZJR19QU1RPUkUpCQkrPSBwc3RvcmUvCmRpZmYgLS1naXQgYS9mcy9hZGZzL2lub2RlLmMgYi9mcy9hZGZzL2lub2RlLmMKaW5kZXggZDUyNTBjNS4uMWRhYjZhMSAxMDA2NDQKLS0tIGEvZnMvYWRmcy9pbm9kZS5jCisrKyBiL2ZzL2FkZnMvaW5vZGUuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJaW5vZGUtPmlfZ2lkCSA9IEFERlNfU0Ioc2IpLT5zX2dpZDsKIAlpbm9kZS0+aV9pbm8JID0gb2JqLT5maWxlX2lkOwogCWlub2RlLT5pX3NpemUJID0gb2JqLT5zaXplOwotCWlub2RlLT5pX25saW5rCSA9IDI7CisJc2V0X25saW5rKGlub2RlLCAyKTsKIAlpbm9kZS0+aV9ibG9ja3MJID0gKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKSA+PgogCQkJICAgIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCmRpZmYgLS1naXQgYS9mcy9hZmZzL2FtaWdhZmZzLmMgYi9mcy9hZmZzL2FtaWdhZmZzLmMKaW5kZXggM2E0NTU3ZS4uZGUzN2VjOCAxMDA2NDQKLS0tIGEvZnMvYWZmcy9hbWlnYWZmcy5jCisrKyBiL2ZzL2FmZnMvYW1pZ2FmZnMuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCWlmICghQUZGU19UQUlMKHNiLCBiaCktPmxpbmtfY2hhaW4pCi0JCQkJCWlub2RlLT5pX25saW5rID0gMTsKKwkJCQkJc2V0X25saW5rKGlub2RlLCAxKTsKIAkJCX0KIAkJCWFmZnNfZnJlZV9ibG9jayhzYiwgbGlua19pbm8pOwogCQkJZ290byBkb25lOwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJaWYgKGlub2RlLT5pX25saW5rID4gMSkKIAkJcmV0dmFsID0gYWZmc19yZW1vdmVfbGluayhkZW50cnkpOwogCWVsc2UKLQkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpbm9kZSk7CiAJYWZmc191bmxvY2tfbGluayhpbm9kZSk7CiAJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9pbm9kZS5jIGIvZnMvYWZmcy9pbm9kZS5jCmluZGV4IDVkODI4OTAuLjg4YTRiMGIgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvaW5vZGUuYworKysgYi9mcy9hZmZzL2lub2RlLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAlwcm90ID0gYmUzMl90b19jcHUodGFpbC0+cHJvdGVjdCk7CiAKIAlpbm9kZS0+aV9zaXplID0gMDsKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAlpbm9kZS0+aV9tb2RlID0gMDsKIAlBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA9IDE7CiAJQUZGU19JKGlub2RlKS0+aV9leHRfbGFzdCA9IH4xOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJCQkJCSAgICAgICBzYmktPnNfaGFzaHNpemUgKyAxOwogCQl9CiAJCWlmICh0YWlsLT5saW5rX2NoYWluKQotCQkJaW5vZGUtPmlfbmxpbmsgPSAyOworCQkJc2V0X25saW5rKGlub2RlLCAyKTsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAoc2JpLT5zX2ZsYWdzICYgU0ZfT0ZTKSA/ICZhZmZzX2FvcHNfb2ZzIDogJmFmZnNfYW9wczsKIAkJaW5vZGUtPmlfb3AgPSAmYWZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZhZmZzX2ZpbGVfb3BlcmF0aW9uczsKQEAgLTMwNCw3ICszMDQsNyBAQAogCWlub2RlLT5pX3VpZCAgICAgPSBjdXJyZW50X2ZzdWlkKCk7CiAJaW5vZGUtPmlfZ2lkICAgICA9IGN1cnJlbnRfZnNnaWQoKTsKIAlpbm9kZS0+aV9pbm8gICAgID0gYmxvY2s7Ci0JaW5vZGUtPmlfbmxpbmsgICA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAlpbm9kZS0+aV9tdGltZSAgID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJYXRvbWljX3NldCgmQUZGU19JKGlub2RlKS0+aV9vcGVuY250LCAwKTsKIAlBRkZTX0koaW5vZGUpLT5pX2Jsa2NudCA9IDA7CkBAIC0zODcsNyArMzg3LDcgQEAKIAkJQUZGU19UQUlMKHNiLCBpbm9kZV9iaCktPmxpbmtfY2hhaW4gPSBjcHVfdG9fYmUzMihibG9jayk7CiAJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGlub2RlX2JoLCBibG9jayAtIGJlMzJfdG9fY3B1KGNoYWluKSk7CiAJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGlub2RlX2JoLCBpbm9kZSk7Ci0JCWlub2RlLT5pX25saW5rID0gMjsKKwkJc2V0X25saW5rKGlub2RlLCAyKTsKIAkJaWhvbGQoaW5vZGUpOwogCX0KIAlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOwpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9uYW1laS5jIGIvZnMvYWZmcy9uYW1laS5jCmluZGV4IGUzZTllZmMuLjc4MGExMWQgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvbmFtZWkuYworKysgYi9mcy9hZmZzL25hbWVpLmMKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gKEFGRlNfU0Ioc2IpLT5zX2ZsYWdzICYgU0ZfT0ZTKSA/ICZhZmZzX2FvcHNfb2ZzIDogJmFmZnNfYW9wczsKIAllcnJvciA9IGFmZnNfYWRkX2VudHJ5KGRpciwgaW5vZGUsIGRlbnRyeSwgU1RfRklMRSk7CiAJaWYgKGVycm9yKSB7Ci0JCWlub2RlLT5pX25saW5rID0gMDsKKwkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTMwNSw3ICszMDUsNyBAQAogCiAJZXJyb3IgPSBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX1VTRVJESVIpOwogCWlmIChlcnJvcikgewotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gZXJyb3I7CkBAIC0zOTIsNyArMzkyLDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyOgotCWlub2RlLT5pX25saW5rID0gMDsKKwljbGVhcl9ubGluayhpbm9kZSk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJaXB1dChpbm9kZSk7CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ZzY2xpZW50LmMgYi9mcy9hZnMvZnNjbGllbnQuYwppbmRleCAzNDZlMzI4Li4yZjIxM2QxIDEwMDY0NAotLS0gYS9mcy9hZnMvZnNjbGllbnQuYworKysgYi9mcy9hZnMvZnNjbGllbnQuYwpAQCAtOTAsNyArOTAsNyBAQAogCQkJdm5vZGUtPnZmc19pbm9kZS5pX3VpZCA9IHN0YXR1cy0+b3duZXI7CiAJCQl2bm9kZS0+dmZzX2lub2RlLmlfZ2lkID0gc3RhdHVzLT5ncm91cDsKIAkJCXZub2RlLT52ZnNfaW5vZGUuaV9nZW5lcmF0aW9uID0gdm5vZGUtPmZpZC51bmlxdWU7Ci0JCQl2bm9kZS0+dmZzX2lub2RlLmlfbmxpbmsgPSBzdGF0dXMtPm5saW5rOworCQkJc2V0X25saW5rKCZ2bm9kZS0+dmZzX2lub2RlLCBzdGF0dXMtPm5saW5rKTsKIAogCQkJbW9kZSA9IHZub2RlLT52ZnNfaW5vZGUuaV9tb2RlOwogCQkJbW9kZSAmPSB+U19JQUxMVUdPOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2lub2RlLmMgYi9mcy9hZnMvaW5vZGUuYwppbmRleCAwZmRhYjZlLi5kODkwYWUzIDEwMDY0NAotLS0gYS9mcy9hZnMvaW5vZGUuYworKysgYi9mcy9hZnMvaW5vZGUuYwpAQCAtNjcsNyArNjcsNyBAQAogCQlmc2NhY2hlX2F0dHJfY2hhbmdlZCh2bm9kZS0+Y2FjaGUpOwogI2VuZGlmCiAKLQlpbm9kZS0+aV9ubGluawkJPSB2bm9kZS0+c3RhdHVzLm5saW5rOworCXNldF9ubGluayhpbm9kZSwgdm5vZGUtPnN0YXR1cy5ubGluayk7CiAJaW5vZGUtPmlfdWlkCQk9IHZub2RlLT5zdGF0dXMub3duZXI7CiAJaW5vZGUtPmlfZ2lkCQk9IDA7CiAJaW5vZGUtPmlfc2l6ZQkJPSB2bm9kZS0+c3RhdHVzLnNpemU7CkBAIC0xNzQsNyArMTc0LDcgQEAKIAlpbm9kZS0+aV9zaXplCQk9IDA7CiAJaW5vZGUtPmlfbW9kZQkJPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR087CiAJaW5vZGUtPmlfb3AJCT0gJmFmc19hdXRvY2VsbF9pbm9kZV9vcGVyYXRpb25zOwotCWlub2RlLT5pX25saW5rCQk9IDI7CisJc2V0X25saW5rKGlub2RlLCAyKTsKIAlpbm9kZS0+aV91aWQJCT0gMDsKIAlpbm9kZS0+aV9naWQJCT0gMDsKIAlpbm9kZS0+aV9jdGltZS50dl9zZWMJPSBnZXRfc2Vjb25kcygpOwpkaWZmIC0tZ2l0IGEvZnMvYWlvLmMgYi9mcy9haW8uYwppbmRleCBlMjllYzQ4Li43OGM1MTRjIDEwMDY0NAotLS0gYS9mcy9haW8uYworKysgYi9mcy9haW8uYwpAQCAtNDQwLDggKzQ0MCw2IEBACiBzdGF0aWMgc3RydWN0IGtpb2NiICpfX2Fpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCkKIHsKIAlzdHJ1Y3Qga2lvY2IgKnJlcSA9IE5VTEw7Ci0Jc3RydWN0IGFpb19yaW5nICpyaW5nOwotCWludCBva2F5ID0gMDsKIAogCXJlcSA9IGttZW1fY2FjaGVfYWxsb2Moa2lvY2JfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXJlcSkpCkBAIC00NTksMzkgKzQ1NywxMTQgQEAKIAlJTklUX0xJU1RfSEVBRCgmcmVxLT5raV9ydW5fbGlzdCk7CiAJcmVxLT5raV9ldmVudGZkID0gTlVMTDsKIAotCS8qIENoZWNrIGlmIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGhhcyBlbm91Z2ggZnJlZSBzcGFjZSB0bwotCSAqIGFjY2VwdCBhbiBldmVudCBmcm9tIHRoaXMgaW8uCi0JICovCi0Jc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7Ci0JcmluZyA9IGttYXBfYXRvbWljKGN0eC0+cmluZ19pbmZvLnJpbmdfcGFnZXNbMF0sIEtNX1VTRVIwKTsKLQlpZiAoY3R4LT5yZXFzX2FjdGl2ZSA8IGFpb19yaW5nX2F2YWlsKCZjdHgtPnJpbmdfaW5mbywgcmluZykpIHsKLQkJbGlzdF9hZGQoJnJlcS0+a2lfbGlzdCwgJmN0eC0+YWN0aXZlX3JlcXMpOwotCQljdHgtPnJlcXNfYWN0aXZlKys7Ci0JCW9rYXkgPSAxOwotCX0KLQlrdW5tYXBfYXRvbWljKHJpbmcsIEtNX1VTRVIwKTsKLQlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOwotCi0JaWYgKCFva2F5KSB7Ci0JCWttZW1fY2FjaGVfZnJlZShraW9jYl9jYWNoZXAsIHJlcSk7Ci0JCXJlcSA9IE5VTEw7Ci0JfQotCiAJcmV0dXJuIHJlcTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qga2lvY2IgKmFpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCkKKy8qCisgKiBzdHJ1Y3Qga2lvY2IncyBhcmUgYWxsb2NhdGVkIGluIGJhdGNoZXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YKKyAqIHRpbWVzIHRoZSBjdHggbG9jayBpcyBhY3F1aXJlZCBhbmQgcmVsZWFzZWQuCisgKi8KKyNkZWZpbmUgS0lPQ0JfQkFUQ0hfU0laRQkzMkwKK3N0cnVjdCBraW9jYl9iYXRjaCB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCWxvbmcgY291bnQ7IC8qIG51bWJlciBvZiByZXF1ZXN0cyBsZWZ0IHRvIGFsbG9jYXRlICovCit9OworCitzdGF0aWMgdm9pZCBraW9jYl9iYXRjaF9pbml0KHN0cnVjdCBraW9jYl9iYXRjaCAqYmF0Y2gsIGxvbmcgdG90YWwpCit7CisJSU5JVF9MSVNUX0hFQUQoJmJhdGNoLT5oZWFkKTsKKwliYXRjaC0+Y291bnQgPSB0b3RhbDsKK30KKworc3RhdGljIHZvaWQga2lvY2JfYmF0Y2hfZnJlZShzdHJ1Y3Qga2lvY2JfYmF0Y2ggKmJhdGNoKQoreworCXN0cnVjdCBraW9jYiAqcmVxLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIG4sICZiYXRjaC0+aGVhZCwga2lfYmF0Y2gpIHsKKwkJbGlzdF9kZWwoJnJlcS0+a2lfYmF0Y2gpOworCQlrbWVtX2NhY2hlX2ZyZWUoa2lvY2JfY2FjaGVwLCByZXEpOworCX0KK30KKworLyoKKyAqIEFsbG9jYXRlIGEgYmF0Y2ggb2Yga2lvY2JzLiAgVGhpcyBhdm9pZHMgdGFraW5nIGFuZCBkcm9wcGluZyB0aGUKKyAqIGNvbnRleHQgbG9jayBhIGxvdCBkdXJpbmcgc2V0dXAuCisgKi8KK3N0YXRpYyBpbnQga2lvY2JfYmF0Y2hfcmVmaWxsKHN0cnVjdCBraW9jdHggKmN0eCwgc3RydWN0IGtpb2NiX2JhdGNoICpiYXRjaCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBhbGxvY2F0ZWQsIHRvX2FsbG9jOworCWxvbmcgYXZhaWw7CisJYm9vbCBjYWxsZWRfZnB1dCA9IGZhbHNlOworCXN0cnVjdCBraW9jYiAqcmVxLCAqbjsKKwlzdHJ1Y3QgYWlvX3JpbmcgKnJpbmc7CisKKwl0b19hbGxvYyA9IG1pbihiYXRjaC0+Y291bnQsIEtJT0NCX0JBVENIX1NJWkUpOworCWZvciAoYWxsb2NhdGVkID0gMDsgYWxsb2NhdGVkIDwgdG9fYWxsb2M7IGFsbG9jYXRlZCsrKSB7CisJCXJlcSA9IF9fYWlvX2dldF9yZXEoY3R4KTsKKwkJaWYgKCFyZXEpCisJCQkvKiBhbGxvY2F0aW9uIGZhaWxlZCwgZ28gd2l0aCB3aGF0IHdlJ3ZlIGdvdCAqLworCQkJYnJlYWs7CisJCWxpc3RfYWRkKCZyZXEtPmtpX2JhdGNoLCAmYmF0Y2gtPmhlYWQpOworCX0KKworCWlmIChhbGxvY2F0ZWQgPT0gMCkKKwkJZ290byBvdXQ7CisKK3JldHJ5OgorCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCXJpbmcgPSBrbWFwX2F0b21pYyhjdHgtPnJpbmdfaW5mby5yaW5nX3BhZ2VzWzBdKTsKKworCWF2YWlsID0gYWlvX3JpbmdfYXZhaWwoJmN0eC0+cmluZ19pbmZvLCByaW5nKSAtIGN0eC0+cmVxc19hY3RpdmU7CisJQlVHX09OKGF2YWlsIDwgMCk7CisJaWYgKGF2YWlsID09IDAgJiYgIWNhbGxlZF9mcHV0KSB7CisJCS8qCisJCSAqIEhhbmRsZSBhIHBvdGVudGlhbCBzdGFydmF0aW9uIGNhc2UuICBJdCBpcyBwb3NzaWJsZSB0aGF0CisJCSAqIHdlIGhvbGQgdGhlIGxhc3QgcmVmZXJlbmNlIG9uIGEgc3RydWN0IGZpbGUsIGNhdXNpbmcgdXMKKwkJICogdG8gZGVsYXkgdGhlIGZpbmFsIGZwdXQgdG8gbm9uLWlycSBjb250ZXh0LiAgSW4gdGhpcyBjYXNlLAorCQkgKiBjdHgtPnJlcXNfYWN0aXZlIGlzIGFydGlmaWNpYWxseSBoaWdoLiAgQ2FsbGluZyB0aGUgZnB1dAorCQkgKiByb3V0aW5lIGhlcmUgbWF5IGZyZWUgdXAgYSBzbG90IGluIHRoZSBldmVudCBjb21wbGV0aW9uCisJCSAqIHJpbmcsIGFsbG93aW5nIHRoaXMgYWxsb2NhdGlvbiB0byBzdWNjZWVkLgorCQkgKi8KKwkJa3VubWFwX2F0b21pYyhyaW5nKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKwkJYWlvX2ZwdXRfcm91dGluZShOVUxMKTsKKwkJY2FsbGVkX2ZwdXQgPSB0cnVlOworCQlnb3RvIHJldHJ5OworCX0KKworCWlmIChhdmFpbCA8IGFsbG9jYXRlZCkgeworCQkvKiBUcmltIGJhY2sgdGhlIG51bWJlciBvZiByZXF1ZXN0cy4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgbiwgJmJhdGNoLT5oZWFkLCBraV9iYXRjaCkgeworCQkJbGlzdF9kZWwoJnJlcS0+a2lfYmF0Y2gpOworCQkJa21lbV9jYWNoZV9mcmVlKGtpb2NiX2NhY2hlcCwgcmVxKTsKKwkJCWlmICgtLWFsbG9jYXRlZCA8PSBhdmFpbCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWJhdGNoLT5jb3VudCAtPSBhbGxvY2F0ZWQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZiYXRjaC0+aGVhZCwga2lfYmF0Y2gpIHsKKwkJbGlzdF9hZGQoJnJlcS0+a2lfbGlzdCwgJmN0eC0+YWN0aXZlX3JlcXMpOworCQljdHgtPnJlcXNfYWN0aXZlKys7CisJfQorCisJa3VubWFwX2F0b21pYyhyaW5nKTsKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCitvdXQ6CisJcmV0dXJuIGFsbG9jYXRlZDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2lvY2IgKmFpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCwKKwkJCQkJc3RydWN0IGtpb2NiX2JhdGNoICpiYXRjaCkKIHsKIAlzdHJ1Y3Qga2lvY2IgKnJlcTsKLQkvKiBIYW5kbGUgYSBwb3RlbnRpYWwgc3RhcnZhdGlvbiBjYXNlIC0tIHNob3VsZCBiZSBleGNlZWRpbmdseSByYXJlIGFzIAotCSAqIHJlcXVlc3RzIHdpbGwgYmUgc3R1Y2sgb24gZnB1dF9oZWFkIG9ubHkgaWYgdGhlIGFpb19mcHV0X3JvdXRpbmUgaXMgCi0JICogZGVsYXllZCBhbmQgdGhlIHJlcXVlc3RzIHdlcmUgdGhlIGxhc3QgdXNlciBvZiB0aGUgc3RydWN0IGZpbGUuCi0JICovCi0JcmVxID0gX19haW9fZ2V0X3JlcShjdHgpOwotCWlmICh1bmxpa2VseShOVUxMID09IHJlcSkpIHsKLQkJYWlvX2ZwdXRfcm91dGluZShOVUxMKTsKLQkJcmVxID0gX19haW9fZ2V0X3JlcShjdHgpOwotCX0KKworCWlmIChsaXN0X2VtcHR5KCZiYXRjaC0+aGVhZCkpCisJCWlmIChraW9jYl9iYXRjaF9yZWZpbGwoY3R4LCBiYXRjaCkgPT0gMCkKKwkJCXJldHVybiBOVUxMOworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnkoJmJhdGNoLT5oZWFkLCBzdHJ1Y3Qga2lvY2IsIGtpX2JhdGNoKTsKKwlsaXN0X2RlbCgmcmVxLT5raV9iYXRjaCk7CiAJcmV0dXJuIHJlcTsKIH0KIApAQCAtMTM4NywxMyArMTQ2MCwxMyBAQAogCQlyZXQgPSBjb21wYXRfcndfY29weV9jaGVja191dmVjdG9yKHR5cGUsCiAJCQkJKHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICopa2lvY2ItPmtpX2J1ZiwKIAkJCQlraW9jYi0+a2lfbmJ5dGVzLCAxLCAma2lvY2ItPmtpX2lubGluZV92ZWMsCi0JCQkJJmtpb2NiLT5raV9pb3ZlYyk7CisJCQkJJmtpb2NiLT5raV9pb3ZlYywgMSk7CiAJZWxzZQogI2VuZGlmCiAJCXJldCA9IHJ3X2NvcHlfY2hlY2tfdXZlY3Rvcih0eXBlLAogCQkJCShzdHJ1Y3QgaW92ZWMgX191c2VyICopa2lvY2ItPmtpX2J1ZiwKIAkJCQlraW9jYi0+a2lfbmJ5dGVzLCAxLCAma2lvY2ItPmtpX2lubGluZV92ZWMsCi0JCQkJJmtpb2NiLT5raV9pb3ZlYyk7CisJCQkJJmtpb2NiLT5raV9pb3ZlYywgMSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCkBAIC0xNTE1LDcgKzE1ODgsOCBAQAogfQogCiBzdGF0aWMgaW50IGlvX3N1Ym1pdF9vbmUoc3RydWN0IGtpb2N0eCAqY3R4LCBzdHJ1Y3QgaW9jYiBfX3VzZXIgKnVzZXJfaW9jYiwKLQkJCSBzdHJ1Y3QgaW9jYiAqaW9jYiwgYm9vbCBjb21wYXQpCisJCQkgc3RydWN0IGlvY2IgKmlvY2IsIHN0cnVjdCBraW9jYl9iYXRjaCAqYmF0Y2gsCisJCQkgYm9vbCBjb21wYXQpCiB7CiAJc3RydWN0IGtpb2NiICpyZXE7CiAJc3RydWN0IGZpbGUgKmZpbGU7CkBAIC0xNTQxLDcgKzE2MTUsNyBAQAogCWlmICh1bmxpa2VseSghZmlsZSkpCiAJCXJldHVybiAtRUJBREY7CiAKLQlyZXEgPSBhaW9fZ2V0X3JlcShjdHgpOwkJLyogcmV0dXJucyB3aXRoIDIgcmVmZXJlbmNlcyB0byByZXEgKi8KKwlyZXEgPSBhaW9fZ2V0X3JlcShjdHgsIGJhdGNoKTsgIC8qIHJldHVybnMgd2l0aCAyIHJlZmVyZW5jZXMgdG8gcmVxICovCiAJaWYgKHVubGlrZWx5KCFyZXEpKSB7CiAJCWZwdXQoZmlsZSk7CiAJCXJldHVybiAtRUFHQUlOOwpAQCAtMTYyMSw4ICsxNjk1LDkgQEAKIHsKIAlzdHJ1Y3Qga2lvY3R4ICpjdHg7CiAJbG9uZyByZXQgPSAwOwotCWludCBpOworCWludCBpID0gMDsKIAlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKKwlzdHJ1Y3Qga2lvY2JfYmF0Y2ggYmF0Y2g7CiAKIAlpZiAodW5saWtlbHkobnIgPCAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjM5LDYgKzE3MTQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlraW9jYl9iYXRjaF9pbml0KCZiYXRjaCwgbnIpOworCiAJYmxrX3N0YXJ0X3BsdWcoJnBsdWcpOwogCiAJLyoKQEAgLTE2NTksMTIgKzE3MzYsMTMgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcmV0ID0gaW9fc3VibWl0X29uZShjdHgsIHVzZXJfaW9jYiwgJnRtcCwgY29tcGF0KTsKKwkJcmV0ID0gaW9fc3VibWl0X29uZShjdHgsIHVzZXJfaW9jYiwgJnRtcCwgJmJhdGNoLCBjb21wYXQpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7CiAJfQogCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAKKwlraW9jYl9iYXRjaF9mcmVlKCZiYXRjaCk7CiAJcHV0X2lvY3R4KGN0eCk7CiAJcmV0dXJuIGkgPyBpIDogcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9pbm9kZS5jIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCmluZGV4IDE4MGZhMjQuLjgxNzlmMWEgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvaW5vZGUuYworKysgYi9mcy9hdXRvZnM0L2lub2RlLmMKQEAgLTM0Miw3ICszNDIsNyBAQAogCWlub2RlLT5pX2lubyA9IGdldF9uZXh0X2lubygpOwogCiAJaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJaW5vZGUtPmlfbmxpbmsgPSAyOworCQlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCQlpbm9kZS0+aV9vcCA9ICZhdXRvZnM0X2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9mb3AgPSAmYXV0b2ZzNF9kaXJfb3BlcmF0aW9uczsKIAl9IGVsc2UgaWYgKFNfSVNMTksobW9kZSkpIHsKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvbGludXh2ZnMuYyBiL2ZzL2JlZnMvbGludXh2ZnMuYwppbmRleCA3MjBkODg1Li44MzQyY2E2IDEwMDY0NAotLS0gYS9mcy9iZWZzL2xpbnV4dmZzLmMKKysrIGIvZnMvYmVmcy9saW51eHZmcy5jCkBAIC0zNTcsNyArMzU3LDcgQEAKIAlpbm9kZS0+aV9naWQgPSBiZWZzX3NiLT5tb3VudF9vcHRzLnVzZV9naWQgPwogCSAgICBiZWZzX3NiLT5tb3VudF9vcHRzLmdpZCA6IChnaWRfdCkgZnMzMl90b19jcHUoc2IsIHJhd19pbm9kZS0+Z2lkKTsKIAotCWlub2RlLT5pX25saW5rID0gMTsKKwlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCiAJLyoKIAkgKiBCRUZTJ3MgdGltZSBpcyA2NCBiaXRzLCBidXQgY3VycmVudCBWRlMgaXMgMzIgYml0cy4uLgpkaWZmIC0tZ2l0IGEvZnMvYmZzL2Rpci5jIGIvZnMvYmZzL2Rpci5jCmluZGV4IGIxNGNlYmYuLjljYzA3NDAxIDEwMDY0NAotLS0gYS9mcy9iZnMvZGlyLmMKKysrIGIvZnMvYmZzL2Rpci5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAkJcHJpbnRmKCJ1bmxpbmtpbmcgbm9uLWV4aXN0ZW50IGZpbGUgJXM6JWx1IChubGluaz0lZClcbiIsCiAJCQkJCWlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCiAJCQkJCWlub2RlLT5pX25saW5rKTsKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCX0KIAlkZS0+aW5vID0gMDsKIAltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgZGlyKTsKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9pbm9kZS5jIGIvZnMvYmZzL2lub2RlLmMKaW5kZXggYThlMzdmOC4uNjk3YWY1YiAxMDA2NDQKLS0tIGEvZnMvYmZzL2lub2RlLmMKKysrIGIvZnMvYmZzL2lub2RlLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAlCRlNfSShpbm9kZSktPmlfZHNrX2lubyA9IGxlMTZfdG9fY3B1KGRpLT5pX2lubyk7CiAJaW5vZGUtPmlfdWlkID0gIGxlMzJfdG9fY3B1KGRpLT5pX3VpZCk7CiAJaW5vZGUtPmlfZ2lkID0gIGxlMzJfdG9fY3B1KGRpLT5pX2dpZCk7Ci0JaW5vZGUtPmlfbmxpbmsgPSAgbGUzMl90b19jcHUoZGktPmlfbmxpbmspOworCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoZGktPmlfbmxpbmspKTsKIAlpbm9kZS0+aV9zaXplID0gQkZTX0ZJTEVTSVpFKGRpKTsKIAlpbm9kZS0+aV9ibG9ja3MgPSBCRlNfRklMRUJMT0NLUyhkaSk7CiAJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gIGxlMzJfdG9fY3B1KGRpLT5pX2F0aW1lKTsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCBkZDBmZGZjLi4yMWFjNWVlIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC03OTUsNyArNzk1LDE2IEBACiAJCQkgKiBtaWdodCB0cnkgdG8gZXhlYy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgYnJrIHdpbGwKIAkJCSAqIGZvbGxvdyB0aGUgbG9hZGVyLCBhbmQgaXMgbm90IG1vdmFibGUuICAqLwogI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfQVJNKQotCQkJbG9hZF9iaWFzID0gMDsKKwkJCS8qIE1lbW9yeSByYW5kb21pemF0aW9uIG1pZ2h0IGhhdmUgYmVlbiBzd2l0Y2hlZCBvZmYKKwkJCSAqIGluIHJ1bnRpbWUgdmlhIHN5c2N0bC4KKwkJCSAqIElmIHRoYXQgaXMgdGhlIGNhc2UsIHJldGFpbiB0aGUgb3JpZ2luYWwgbm9uLXplcm8KKwkJCSAqIGxvYWRfYmlhcyB2YWx1ZSBpbiBvcmRlciB0byBlc3RhYmxpc2ggcHJvcGVyCisJCQkgKiBub24tcmFuZG9taXplZCBtYXBwaW5ncy4KKwkJCSAqLworCQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKQorCQkJCWxvYWRfYmlhcyA9IDA7CisJCQllbHNlCisJCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChFTEZfRVRfRFlOX0JBU0UgLSB2YWRkcik7CiAjZWxzZQogCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChFTEZfRVRfRFlOX0JBU0UgLSB2YWRkcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jCmluZGV4IGJhMWExYWUuLjFlOWVkYmQgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9taXNjLmMKKysrIGIvZnMvYmluZm10X21pc2MuYwpAQCAtNTIxLDcgKzUyMSw3IEBACiAJd3JpdGVfdW5sb2NrKCZlbnRyaWVzX2xvY2spOwogCiAJaWYgKGRlbnRyeSkgewotCQlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmstLTsKKwkJZHJvcF9ubGluayhkZW50cnktPmRfaW5vZGUpOwogCQlkX2Ryb3AoZGVudHJ5KTsKIAkJZHB1dChkZW50cnkpOwogCQlzaW1wbGVfcmVsZWFzZV9mcygmYm1fbW50LCAmZW50cnlfY291bnQpOwpkaWZmIC0tZ2l0IGEvZnMvYmlvLWludGVncml0eS5jIGIvZnMvYmlvLWludGVncml0eS5jCmluZGV4IDljNWU2YjIuLmMyMTgzZjMgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby1pbnRlZ3JpdHkuYworKysgYi9mcy9iaW8taW50ZWdyaXR5LmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDliZmFkZTguLjQxYzkzYzcgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC0yNTUsNyArMjU1LDYgQEAKIHsKIAltZW1zZXQoYmlvLCAwLCBzaXplb2YoKmJpbykpOwogCWJpby0+YmlfZmxhZ3MgPSAxIDw8IEJJT19VUFRPREFURTsKLQliaW8tPmJpX2NvbXBfY3B1ID0gLTE7CiAJYXRvbWljX3NldCgmYmlvLT5iaV9jbnQsIDEpOwogfQogRVhQT1JUX1NZTUJPTChiaW9faW5pdCk7CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IDk1Zjc4NmUuLmIwN2YxZGEgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC05NzEsNyArOTcxLDcgQEAKIAogCWlmICghYmRldi0+YmRfZGlzaykKIAkJcmV0dXJuOwotCWlmIChkaXNrX3BhcnRpdGlvbmFibGUoYmRldi0+YmRfZGlzaykpCisJaWYgKGRpc2tfcGFydF9zY2FuX2VuYWJsZWQoYmRldi0+YmRfZGlzaykpCiAJCWJkZXYtPmJkX2ludmFsaWRhdGVkID0gMTsKIH0KIApAQCAtMTA4NSw2ICsxMDg1LDcgQEAKIHN0YXRpYyBpbnQgX19ibGtkZXZfZ2V0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwgaW50IGZvcl9wYXJ0KQogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCWludCByZXQ7CiAJaW50IHBhcnRubzsKIAlpbnQgcGVybSA9IDA7CkBAIC0xMTEwLDYgKzExMTEsNyBAQAogCWRpc2sgPSBnZXRfZ2VuZGlzayhiZGV2LT5iZF9kZXYsICZwYXJ0bm8pOwogCWlmICghZGlzaykKIAkJZ290byBvdXQ7CisJb3duZXIgPSBkaXNrLT5mb3BzLT5vd25lcjsKIAogCWRpc2tfYmxvY2tfZXZlbnRzKGRpc2spOwogCW11dGV4X2xvY2tfbmVzdGVkKCZiZGV2LT5iZF9tdXRleCwgZm9yX3BhcnQpOwpAQCAtMTEzNyw4ICsxMTM5LDggQEAKIAkJCQkJYmRldi0+YmRfZGlzayA9IE5VTEw7CiAJCQkJCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOwogCQkJCQlkaXNrX3VuYmxvY2tfZXZlbnRzKGRpc2spOwotCQkJCQltb2R1bGVfcHV0KGRpc2stPmZvcHMtPm93bmVyKTsKIAkJCQkJcHV0X2Rpc2soZGlzayk7CisJCQkJCW1vZHVsZV9wdXQob3duZXIpOwogCQkJCQlnb3RvIHJlc3RhcnQ7CiAJCQkJfQogCQkJfQpAQCAtMTE5NCw4ICsxMTk2LDggQEAKIAkJCQlnb3RvIG91dF91bmxvY2tfYmRldjsKIAkJfQogCQkvKiBvbmx5IG9uZSBvcGVuZXIgaG9sZHMgcmVmcyB0byB0aGUgbW9kdWxlIGFuZCBkaXNrICovCi0JCW1vZHVsZV9wdXQoZGlzay0+Zm9wcy0+b3duZXIpOwogCQlwdXRfZGlzayhkaXNrKTsKKwkJbW9kdWxlX3B1dChvd25lcik7CiAJfQogCWJkZXYtPmJkX29wZW5lcnMrKzsKIAlpZiAoZm9yX3BhcnQpCkBAIC0xMjE1LDggKzEyMTcsOCBAQAogIG91dF91bmxvY2tfYmRldjoKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIAlkaXNrX3VuYmxvY2tfZXZlbnRzKGRpc2spOwotCW1vZHVsZV9wdXQoZGlzay0+Zm9wcy0+b3duZXIpOwogCXB1dF9kaXNrKGRpc2spOworCW1vZHVsZV9wdXQob3duZXIpOwogIG91dDoKIAliZHB1dChiZGV2KTsKIApAQCAtMTQ0MiwxNCArMTQ0NCwxNSBAQAogCWlmICghYmRldi0+YmRfb3BlbmVycykgewogCQlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IGRpc2stPmZvcHMtPm93bmVyOwogCi0JCXB1dF9kaXNrKGRpc2spOwotCQltb2R1bGVfcHV0KG93bmVyKTsKIAkJZGlza19wdXRfcGFydChiZGV2LT5iZF9wYXJ0KTsKIAkJYmRldi0+YmRfcGFydCA9IE5VTEw7CiAJCWJkZXYtPmJkX2Rpc2sgPSBOVUxMOwogCQlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKIAkJCXZpY3RpbSA9IGJkZXYtPmJkX2NvbnRhaW5zOwogCQliZGV2LT5iZF9jb250YWlucyA9IE5VTEw7CisKKwkJcHV0X2Rpc2soZGlzayk7CisJCW1vZHVsZV9wdXQob3duZXIpOwogCX0KIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIAliZHB1dChiZGV2KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL01ha2VmaWxlIGIvZnMvYnRyZnMvTWFrZWZpbGUKaW5kZXggNDBlNmFjMC4uYzBkZGZkMiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvTWFrZWZpbGUKKysrIGIvZnMvYnRyZnMvTWFrZWZpbGUKQEAgLTcsNiArNyw3IEBACiAJICAgZXh0ZW50X21hcC5vIHN5c2ZzLm8gc3RydWN0LWZ1bmNzLm8geGF0dHIubyBvcmRlcmVkLWRhdGEubyBcCiAJICAgZXh0ZW50X2lvLm8gdm9sdW1lcy5vIGFzeW5jLXRocmVhZC5vIGlvY3RsLm8gbG9ja2luZy5vIG9ycGhhbi5vIFwKIAkgICBleHBvcnQubyB0cmVlLWxvZy5vIGZyZWUtc3BhY2UtY2FjaGUubyB6bGliLm8gbHpvLm8gXAotCSAgIGNvbXByZXNzaW9uLm8gZGVsYXllZC1yZWYubyByZWxvY2F0aW9uLm8gZGVsYXllZC1pbm9kZS5vIHNjcnViLm8KKwkgICBjb21wcmVzc2lvbi5vIGRlbGF5ZWQtcmVmLm8gcmVsb2NhdGlvbi5vIGRlbGF5ZWQtaW5vZGUubyBzY3J1Yi5vIFwKKwkgICByZWFkYS5vIGJhY2tyZWYubwogCiBidHJmcy0kKENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wpICs9IGFjbC5vCmRpZmYgLS1naXQgYS9mcy9idHJmcy9hY2wuYyBiL2ZzL2J0cmZzL2FjbC5jCmluZGV4IGViMTU5YWEuLjg5YjE1NmQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2FjbC5jCisrKyBiL2ZzL2J0cmZzL2FjbC5jCkBAIC01OSwyMiArNTksMTkgQEAKIAkJaWYgKCF2YWx1ZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCQlzaXplID0gX19idHJmc19nZXR4YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUpOwotCQlpZiAoc2l6ZSA+IDApIHsKLQkJCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKHZhbHVlLCBzaXplKTsKLQkJCWlmIChJU19FUlIoYWNsKSkgewotCQkJCWtmcmVlKHZhbHVlKTsKLQkJCQlyZXR1cm4gYWNsOwotCQkJfQotCQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIHR5cGUsIGFjbCk7Ci0JCX0KLQkJa2ZyZWUodmFsdWUpOworCX0KKwlpZiAoc2l6ZSA+IDApIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHNpemUpOwogCX0gZWxzZSBpZiAoc2l6ZSA9PSAtRU5PRU5UIHx8IHNpemUgPT0gLUVOT0RBVEEgfHwgc2l6ZSA9PSAwKSB7CiAJCS8qIEZJWE1FLCB3aG8gcmV0dXJucyAtRU5PRU5UPyAgSSB0aGluayBub2JvZHkgKi8KIAkJYWNsID0gTlVMTDsKLQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIHR5cGUsIGFjbCk7CiAJfSBlbHNlIHsKIAkJYWNsID0gRVJSX1BUUigtRUlPKTsKIAl9CisJa2ZyZWUodmFsdWUpOworCisJaWYgKCFJU19FUlIoYWNsKSkKKwkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIHR5cGUsIGFjbCk7CiAKIAlyZXR1cm4gYWNsOwogfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYmFja3JlZi5jIGIvZnMvYnRyZnMvYmFja3JlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTVhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9iYWNrcmVmLmMKQEAgLTAsMCArMSw3NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU1RSQVRPLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAiYmFja3JlZi5oIgorCitzdHJ1Y3QgX19kYXRhX3JlZiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXU2NCBpbnVtOworCXU2NCByb290OworCXU2NCBleHRlbnRfZGF0YV9pdGVtX29mZnNldDsKK307CisKK3N0cnVjdCBfX3NoYXJlZF9yZWYgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1NjQgZGlza19ieXRlOworfTsKKworc3RhdGljIGludCBfX2lub2RlX2luZm8odTY0IGludW0sIHU2NCBpb2ZmLCB1OCBrZXlfdHlwZSwKKwkJCXN0cnVjdCBidHJmc19yb290ICpmc19yb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCXN0cnVjdCBidHJmc19rZXkgKmZvdW5kX2tleSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKworCWtleS50eXBlID0ga2V5X3R5cGU7CisJa2V5Lm9iamVjdGlkID0gaW51bTsKKwlrZXkub2Zmc2V0ID0gaW9mZjsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIGZzX3Jvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZWIgPSBwYXRoLT5ub2Rlc1swXTsKKwlpZiAocmV0ICYmIHBhdGgtPnNsb3RzWzBdID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGViKSkgeworCQlyZXQgPSBidHJmc19uZXh0X2xlYWYoZnNfcm9vdCwgcGF0aCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQllYiA9IHBhdGgtPm5vZGVzWzBdOworCX0KKworCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShlYiwgZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CisJaWYgKGZvdW5kX2tleS0+dHlwZSAhPSBrZXkudHlwZSB8fCBmb3VuZF9rZXktPm9iamVjdGlkICE9IGtleS5vYmplY3RpZCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRoaXMgbWFrZXMgdGhlIHBhdGggcG9pbnQgdG8gKGludW0gSU5PREVfSVRFTSBpb2ZmKQorICovCitpbnQgaW5vZGVfaXRlbV9pbmZvKHU2NCBpbnVtLCB1NjQgaW9mZiwgc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsCisJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCkKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlyZXR1cm4gX19pbm9kZV9pbmZvKGludW0sIGlvZmYsIEJUUkZTX0lOT0RFX0lURU1fS0VZLCBmc19yb290LCBwYXRoLAorCQkJCSZrZXkpOworfQorCitzdGF0aWMgaW50IGlub2RlX3JlZl9pbmZvKHU2NCBpbnVtLCB1NjQgaW9mZiwgc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsCisJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJc3RydWN0IGJ0cmZzX2tleSAqZm91bmRfa2V5KQoreworCXJldHVybiBfX2lub2RlX2luZm8oaW51bSwgaW9mZiwgQlRSRlNfSU5PREVfUkVGX0tFWSwgZnNfcm9vdCwgcGF0aCwKKwkJCQlmb3VuZF9rZXkpOworfQorCisvKgorICogdGhpcyBpdGVyYXRlcyB0byB0dXJuIGEgYnRyZnNfaW5vZGVfcmVmIGludG8gYSBmdWxsIGZpbGVzeXN0ZW0gcGF0aC4gZWxlbWVudHMKKyAqIG9mIHRoZSBwYXRoIGFyZSBzZXBhcmF0ZWQgYnkgJy8nIGFuZCB0aGUgcGF0aCBpcyBndWFyYW50ZWVkIHRvIGJlCisgKiAwLXRlcm1pbmF0ZWQuIHRoZSBwYXRoIGlzIG9ubHkgZ2l2ZW4gd2l0aGluIHRoZSBjdXJyZW50IGZpbGUgc3lzdGVtLgorICogVGhlcmVmb3JlLCBpdCBuZXZlciBzdGFydHMgd2l0aCBhICcvJy4gdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0byBwcm92aWRlCisgKiAic2l6ZSIgYnl0ZXMgaW4gImRlc3QiLiB0aGUgZGVzdCBidWZmZXIgd2lsbCBiZSBmaWxsZWQgYmFja3dhcmRzLiBmaW5hbGx5LAorICogdGhlIHN0YXJ0IHBvaW50IG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIHJldHVybmVkLiB0aGlzIHBvaW50ZXIgaXMgd2l0aGluCisgKiBkZXN0LCBub3JtYWxseS4KKyAqIGluIGNhc2UgdGhlIHBhdGggYnVmZmVyIHdvdWxkIG92ZXJmbG93LCB0aGUgcG9pbnRlciBpcyBkZWNyZW1lbnRlZCBmdXJ0aGVyCisgKiBhcyBpZiBvdXRwdXQgd2FzIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlciwgdGhvdWdoIG5vIG1vcmUgb3V0cHV0IGlzIGFjdHVhbGx5CisgKiBnZW5lcmF0ZWQuIHRoYXQgd2F5LCB0aGUgY2FsbGVyIGNhbiBkZXRlcm1pbmUgaG93IG11Y2ggc3BhY2Ugd291bGQgYmUKKyAqIHJlcXVpcmVkIGZvciB0aGUgcGF0aCB0byBmaXQgaW50byB0aGUgYnVmZmVyLiBpbiB0aGF0IGNhc2UsIHRoZSByZXR1cm5lZAorICogdmFsdWUgd2lsbCBiZSBzbWFsbGVyIHRoYW4gZGVzdC4gY2FsbGVycyBtdXN0IGNoZWNrIHRoaXMhCisgKi8KK3N0YXRpYyBjaGFyICppcmVmX3RvX3BhdGgoc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCXN0cnVjdCBidHJmc19pbm9kZV9yZWYgKmlyZWYsCisJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmViX2luLCB1NjQgcGFyZW50LAorCQkJCWNoYXIgKmRlc3QsIHUzMiBzaXplKQoreworCXUzMiBsZW47CisJaW50IHNsb3Q7CisJdTY0IG5leHRfaW51bTsKKwlpbnQgcmV0OworCXM2NCBieXRlc19sZWZ0ID0gc2l6ZSAtIDE7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViID0gZWJfaW47CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisKKwlpZiAoYnl0ZXNfbGVmdCA+PSAwKQorCQlkZXN0W2J5dGVzX2xlZnRdID0gJ1wwJzsKKworCXdoaWxlICgxKSB7CisJCWxlbiA9IGJ0cmZzX2lub2RlX3JlZl9uYW1lX2xlbihlYiwgaXJlZik7CisJCWJ5dGVzX2xlZnQgLT0gbGVuOworCQlpZiAoYnl0ZXNfbGVmdCA+PSAwKQorCQkJcmVhZF9leHRlbnRfYnVmZmVyKGViLCBkZXN0ICsgYnl0ZXNfbGVmdCwKKwkJCQkJCSh1bnNpZ25lZCBsb25nKShpcmVmICsgMSksIGxlbik7CisJCWlmIChlYiAhPSBlYl9pbikKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJCXJldCA9IGlub2RlX3JlZl9pbmZvKHBhcmVudCwgMCwgZnNfcm9vdCwgcGF0aCwgJmZvdW5kX2tleSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJbmV4dF9pbnVtID0gZm91bmRfa2V5Lm9mZnNldDsKKworCQkvKiByZWd1bGFyIGV4aXQgYWhlYWQgKi8KKwkJaWYgKHBhcmVudCA9PSBuZXh0X2ludW0pCisJCQlicmVhazsKKworCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisJCWViID0gcGF0aC0+bm9kZXNbMF07CisJCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gdXNlIGViIGFmdGVyIHJlbGVhc2luZyB0aGUgcGF0aCAqLworCQlpZiAoZWIgIT0gZWJfaW4pCisJCQlhdG9taWNfaW5jKCZlYi0+cmVmcyk7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKKworCQlpcmVmID0gYnRyZnNfaXRlbV9wdHIoZWIsIHNsb3QsIHN0cnVjdCBidHJmc19pbm9kZV9yZWYpOworCQlwYXJlbnQgPSBuZXh0X2ludW07CisJCS0tYnl0ZXNfbGVmdDsKKwkJaWYgKGJ5dGVzX2xlZnQgPj0gMCkKKwkJCWRlc3RbYnl0ZXNfbGVmdF0gPSAnLyc7CisJfQorCisJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCXJldHVybiBkZXN0ICsgYnl0ZXNfbGVmdDsKK30KKworLyoKKyAqIHRoaXMgbWFrZXMgdGhlIHBhdGggcG9pbnQgdG8gKGxvZ2ljYWwgRVhURU5UX0lURU0gKikKKyAqIHJldHVybnMgQlRSRlNfRVhURU5UX0ZMQUdfREFUQSBmb3IgZGF0YSwgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSyBmb3IKKyAqIHRyZWUgYmxvY2tzIGFuZCA8MCBvbiBlcnJvci4KKyAqLworaW50IGV4dGVudF9mcm9tX2xvZ2ljYWwoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIHU2NCBsb2dpY2FsLAorCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHN0cnVjdCBidHJmc19rZXkgKmZvdW5kX2tleSkKK3sKKwlpbnQgcmV0OworCXU2NCBmbGFnczsKKwl1MzIgaXRlbV9zaXplOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCisJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfSVRFTV9LRVk7CisJa2V5Lm9iamVjdGlkID0gbG9naWNhbDsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIGZzX2luZm8tPmV4dGVudF9yb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBidHJmc19wcmV2aW91c19pdGVtKGZzX2luZm8tPmV4dGVudF9yb290LCBwYXRoLAorCQkJCQkwLCBCVFJGU19FWFRFTlRfSVRFTV9LRVkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCBmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwlpZiAoZm91bmRfa2V5LT50eXBlICE9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWSB8fAorCSAgICBmb3VuZF9rZXktPm9iamVjdGlkID4gbG9naWNhbCB8fAorCSAgICBmb3VuZF9rZXktPm9iamVjdGlkICsgZm91bmRfa2V5LT5vZmZzZXQgPD0gbG9naWNhbCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllYiA9IHBhdGgtPm5vZGVzWzBdOworCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihlYiwgcGF0aC0+c2xvdHNbMF0pOworCUJVR19PTihpdGVtX3NpemUgPCBzaXplb2YoKmVpKSk7CisKKwllaSA9IGJ0cmZzX2l0ZW1fcHRyKGViLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtKTsKKwlmbGFncyA9IGJ0cmZzX2V4dGVudF9mbGFncyhlYiwgZWkpOworCisJaWYgKGZsYWdzICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykKKwkJcmV0dXJuIEJUUkZTX0VYVEVOVF9GTEFHX1RSRUVfQkxPQ0s7CisJaWYgKGZsYWdzICYgQlRSRlNfRVhURU5UX0ZMQUdfREFUQSkKKwkJcmV0dXJuIEJUUkZTX0VYVEVOVF9GTEFHX0RBVEE7CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiB0byBpdGVyYXRlIGV4dGVudCBpbmxpbmUgcmVmcy4gcHRyIG11c3QgcG9pbnQgdG8gYSAwIHZhbHVlCisgKiBmb3IgdGhlIGZpcnN0IGNhbGwgYW5kIG1heSBiZSBtb2RpZmllZC4gaXQgaXMgdXNlZCB0byB0cmFjayBzdGF0ZS4KKyAqIGlmIG1vcmUgcmVmcyBleGlzdCwgMCBpcyByZXR1cm5lZCBhbmQgdGhlIG5leHQgY2FsbCB0bworICogX19nZXRfZXh0ZW50X2lubGluZV9yZWYgbXVzdCBwYXNzIHRoZSBtb2RpZmllZCBwdHIgcGFyYW1ldGVyIHRvIGdldCB0aGUKKyAqIG5leHQgcmVmLiBhZnRlciB0aGUgbGFzdCByZWYgd2FzIHByb2Nlc3NlZCwgMSBpcyByZXR1cm5lZC4KKyAqIHJldHVybnMgPDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2dldF9leHRlbnRfaW5saW5lX3JlZih1bnNpZ25lZCBsb25nICpwdHIsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpLCB1MzIgaXRlbV9zaXplLAorCQkJCXN0cnVjdCBidHJmc19leHRlbnRfaW5saW5lX3JlZiAqKm91dF9laXJlZiwKKwkJCQlpbnQgKm91dF90eXBlKQoreworCXVuc2lnbmVkIGxvbmcgZW5kOworCXU2NCBmbGFnczsKKwlzdHJ1Y3QgYnRyZnNfdHJlZV9ibG9ja19pbmZvICppbmZvOworCisJaWYgKCEqcHRyKSB7CisJCS8qIGZpcnN0IGNhbGwgKi8KKwkJZmxhZ3MgPSBidHJmc19leHRlbnRfZmxhZ3MoZWIsIGVpKTsKKwkJaWYgKGZsYWdzICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykgeworCQkJaW5mbyA9IChzdHJ1Y3QgYnRyZnNfdHJlZV9ibG9ja19pbmZvICopKGVpICsgMSk7CisJCQkqb3V0X2VpcmVmID0KKwkJCQkoc3RydWN0IGJ0cmZzX2V4dGVudF9pbmxpbmVfcmVmICopKGluZm8gKyAxKTsKKwkJfSBlbHNlIHsKKwkJCSpvdXRfZWlyZWYgPSAoc3RydWN0IGJ0cmZzX2V4dGVudF9pbmxpbmVfcmVmICopKGVpICsgMSk7CisJCX0KKwkJKnB0ciA9ICh1bnNpZ25lZCBsb25nKSpvdXRfZWlyZWY7CisJCWlmICgodm9pZCAqKSpwdHIgPj0gKHZvaWQgKillaSArIGl0ZW1fc2l6ZSkKKwkJCXJldHVybiAtRU5PRU5UOworCX0KKworCWVuZCA9ICh1bnNpZ25lZCBsb25nKWVpICsgaXRlbV9zaXplOworCSpvdXRfZWlyZWYgPSAoc3RydWN0IGJ0cmZzX2V4dGVudF9pbmxpbmVfcmVmICopKnB0cjsKKwkqb3V0X3R5cGUgPSBidHJmc19leHRlbnRfaW5saW5lX3JlZl90eXBlKGViLCAqb3V0X2VpcmVmKTsKKworCSpwdHIgKz0gYnRyZnNfZXh0ZW50X2lubGluZV9yZWZfc2l6ZSgqb3V0X3R5cGUpOworCVdBUk5fT04oKnB0ciA+IGVuZCk7CisJaWYgKCpwdHIgPT0gZW5kKQorCQlyZXR1cm4gMTsgLyogbGFzdCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWFkcyB0aGUgdHJlZSBibG9jayBiYWNrcmVmIGZvciBhbiBleHRlbnQuIHRyZWUgbGV2ZWwgYW5kIHJvb3QgYXJlIHJldHVybmVkCisgKiB0aHJvdWdoIG91dF9sZXZlbCBhbmQgb3V0X3Jvb3QuIHB0ciBtdXN0IHBvaW50IHRvIGEgMCB2YWx1ZSBmb3IgdGhlIGZpcnN0CisgKiBjYWxsIGFuZCBtYXkgYmUgbW9kaWZpZWQgKHNlZSBfX2dldF9leHRlbnRfaW5saW5lX3JlZiBjb21tZW50KS4KKyAqIHJldHVybnMgMCBpZiBkYXRhIHdhcyBwcm92aWRlZCwgMSBpZiB0aGVyZSB3YXMgbm8gbW9yZSBkYXRhIHRvIHByb3ZpZGUgb3IKKyAqIDwwIG9uIGVycm9yLgorICovCitpbnQgdHJlZV9iYWNrcmVmX2Zvcl9leHRlbnQodW5zaWduZWQgbG9uZyAqcHRyLCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkJc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtICplaSwgdTMyIGl0ZW1fc2l6ZSwKKwkJCQl1NjQgKm91dF9yb290LCB1OCAqb3V0X2xldmVsKQoreworCWludCByZXQ7CisJaW50IHR5cGU7CisJc3RydWN0IGJ0cmZzX3RyZWVfYmxvY2tfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2lubGluZV9yZWYgKmVpcmVmOworCisJaWYgKCpwdHIgPT0gKHVuc2lnbmVkIGxvbmcpLTEpCisJCXJldHVybiAxOworCisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gX19nZXRfZXh0ZW50X2lubGluZV9yZWYocHRyLCBlYiwgZWksIGl0ZW1fc2l6ZSwKKwkJCQkJCSZlaXJlZiwgJnR5cGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHR5cGUgPT0gQlRSRlNfVFJFRV9CTE9DS19SRUZfS0VZIHx8CisJCSAgICB0eXBlID09IEJUUkZTX1NIQVJFRF9CTE9DS19SRUZfS0VZKQorCQkJYnJlYWs7CisKKwkJaWYgKHJldCA9PSAxKQorCQkJcmV0dXJuIDE7CisJfQorCisJLyogd2UgY2FuIHRyZWF0IGJvdGggcmVmIHR5cGVzIGVxdWFsbHkgaGVyZSAqLworCWluZm8gPSAoc3RydWN0IGJ0cmZzX3RyZWVfYmxvY2tfaW5mbyAqKShlaSArIDEpOworCSpvdXRfcm9vdCA9IGJ0cmZzX2V4dGVudF9pbmxpbmVfcmVmX29mZnNldChlYiwgZWlyZWYpOworCSpvdXRfbGV2ZWwgPSBidHJmc190cmVlX2Jsb2NrX2xldmVsKGViLCBpbmZvKTsKKworCWlmIChyZXQgPT0gMSkKKwkJKnB0ciA9ICh1bnNpZ25lZCBsb25nKS0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kYXRhX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHU2NCBpbnVtLAorCQkJCXU2NCBleHRlbnRfZGF0YV9pdGVtX29mZnNldCwgdTY0IHJvb3QpCit7CisJc3RydWN0IF9fZGF0YV9yZWYgKnJlZjsKKworCXJlZiA9IGttYWxsb2Moc2l6ZW9mKCpyZWYpLCBHRlBfTk9GUyk7CisJaWYgKCFyZWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVmLT5pbnVtID0gaW51bTsKKwlyZWYtPmV4dGVudF9kYXRhX2l0ZW1fb2Zmc2V0ID0gZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQ7CisJcmVmLT5yb290ID0gcm9vdDsKKwlsaXN0X2FkZF90YWlsKCZyZWYtPmxpc3QsIGhlYWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kYXRhX2xpc3RfYWRkX2ViKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2RhdGFfcmVmICpkcmVmKQoreworCXJldHVybiBfX2RhdGFfbGlzdF9hZGQoaGVhZCwgYnRyZnNfZXh0ZW50X2RhdGFfcmVmX29iamVjdGlkKGViLCBkcmVmKSwKKwkJCQlidHJmc19leHRlbnRfZGF0YV9yZWZfb2Zmc2V0KGViLCBkcmVmKSwKKwkJCQlidHJmc19leHRlbnRfZGF0YV9yZWZfcm9vdChlYiwgZHJlZikpOworfQorCitzdGF0aWMgaW50IF9fc2hhcmVkX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHU2NCBkaXNrX2J5dGUpCit7CisJc3RydWN0IF9fc2hhcmVkX3JlZiAqcmVmOworCisJcmVmID0ga21hbGxvYyhzaXplb2YoKnJlZiksIEdGUF9OT0ZTKTsKKwlpZiAoIXJlZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZWYtPmRpc2tfYnl0ZSA9IGRpc2tfYnl0ZTsKKwlsaXN0X2FkZF90YWlsKCZyZWYtPmxpc3QsIGhlYWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pdGVyX3NoYXJlZF9pbmxpbmVfcmVmX2lub2RlcyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkJICAgdTY0IGxvZ2ljYWwsIHU2NCBpbnVtLAorCQkJCQkgICB1NjQgZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQsCisJCQkJCSAgIHU2NCBleHRlbnRfb2Zmc2V0LAorCQkJCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqZGF0YV9yZWZzLAorCQkJCQkgICBpdGVyYXRlX2V4dGVudF9pbm9kZXNfdCAqaXRlcmF0ZSwKKwkJCQkJICAgdm9pZCAqY3R4KQoreworCXU2NCByZWZfcm9vdDsKKwl1MzIgaXRlbV9zaXplOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpOworCXN0cnVjdCBidHJmc19leHRlbnRfaW5saW5lX3JlZiAqZWlyZWY7CisJc3RydWN0IF9fZGF0YV9yZWYgKnJlZjsKKwlpbnQgcmV0OworCWludCB0eXBlOworCWludCBsYXN0OworCXVuc2lnbmVkIGxvbmcgcHRyID0gMDsKKworCVdBUk5fT04oIWxpc3RfZW1wdHkoZGF0YV9yZWZzKSk7CisJcmV0ID0gZXh0ZW50X2Zyb21fbG9naWNhbChmc19pbmZvLCBsb2dpY2FsLCBwYXRoLCAma2V5KTsKKwlpZiAocmV0ICYgQlRSRlNfRVhURU5UX0ZMQUdfREFUQSkKKwkJcmV0ID0gLUVJTzsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwllYiA9IHBhdGgtPm5vZGVzWzBdOworCWVpID0gYnRyZnNfaXRlbV9wdHIoZWIsIHBhdGgtPnNsb3RzWzBdLCBzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0pOworCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihlYiwgcGF0aC0+c2xvdHNbMF0pOworCisJcmV0ID0gMDsKKwlyZWZfcm9vdCA9IDA7CisJLyoKKwkgKiBhcyBkb25lIGluIGl0ZXJhdGVfZXh0ZW50X2lub2Rlcywgd2UgZmlyc3QgYnVpbGQgYSBsaXN0IG9mIHJlZnMgdG8KKwkgKiBpdGVyYXRlLCB0aGVuIGZyZWUgdGhlIHBhdGggYW5kIHRoZW4gaXRlcmF0ZSB0aGVtIHRvIGF2b2lkIGRlYWRsb2Nrcy4KKwkgKi8KKwlkbyB7CisJCWxhc3QgPSBfX2dldF9leHRlbnRfaW5saW5lX3JlZigmcHRyLCBlYiwgZWksIGl0ZW1fc2l6ZSwKKwkJCQkJCSZlaXJlZiwgJnR5cGUpOworCQlpZiAobGFzdCA8IDApIHsKKwkJCXJldCA9IGxhc3Q7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAodHlwZSA9PSBCVFJGU19UUkVFX0JMT0NLX1JFRl9LRVkgfHwKKwkJICAgIHR5cGUgPT0gQlRSRlNfU0hBUkVEX0JMT0NLX1JFRl9LRVkpIHsKKwkJCXJlZl9yb290ID0gYnRyZnNfZXh0ZW50X2lubGluZV9yZWZfb2Zmc2V0KGViLCBlaXJlZik7CisJCQlyZXQgPSBfX2RhdGFfbGlzdF9hZGQoZGF0YV9yZWZzLCBpbnVtLAorCQkJCQkJZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQsCisJCQkJCQlyZWZfcm9vdCk7CisJCX0KKwl9IHdoaWxlICghcmV0ICYmICFsYXN0KTsKKworCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKKworCWlmIChyZWZfcm9vdCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZhaWxlZCB0byBmaW5kIHRyZWUgYmxvY2sgcmVmICIKKwkJCSJmb3Igc2hhcmVkIGRhdGEgYmFja3JlZiAlbGx1XG4iLCBsb2dpY2FsKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisKK291dDoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoZGF0YV9yZWZzKSkgeworCQlyZWYgPSBsaXN0X2ZpcnN0X2VudHJ5KGRhdGFfcmVmcywgc3RydWN0IF9fZGF0YV9yZWYsIGxpc3QpOworCQlsaXN0X2RlbCgmcmVmLT5saXN0KTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBpdGVyYXRlKHJlZi0+aW51bSwgZXh0ZW50X29mZnNldCArCisJCQkJCXJlZi0+ZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQsCisJCQkJCXJlZi0+cm9vdCwgY3R4KTsKKwkJa2ZyZWUocmVmKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faXRlcl9zaGFyZWRfaW5saW5lX3JlZihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkgICAgdTY0IGxvZ2ljYWwsIHU2NCBvcmlnX2V4dGVudF9pdGVtX29iamVjdGlkLAorCQkJCSAgICB1NjQgZXh0ZW50X29mZnNldCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRhdGFfcmVmcywKKwkJCQkgICAgaXRlcmF0ZV9leHRlbnRfaW5vZGVzX3QgKml0ZXJhdGUsCisJCQkJICAgIHZvaWQgKmN0eCkKK3sKKwl1NjQgZGlza19ieXRlOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJaW50IHNsb3Q7CisJaW50IG5yaXRlbXM7CisJaW50IHJldDsKKwlpbnQgZm91bmQgPSAwOworCisJZWIgPSByZWFkX3RyZWVfYmxvY2soZnNfaW5mby0+dHJlZV9yb290LCBsb2dpY2FsLAorCQkJCWZzX2luZm8tPnRyZWVfcm9vdC0+bGVhZnNpemUsIDApOworCWlmICghZWIpCisJCXJldHVybiAtRUlPOworCisJLyoKKwkgKiBmcm9tIHRoZSBzaGFyZWQgZGF0YSByZWYsIHdlIG9ubHkgaGF2ZSB0aGUgbGVhZiBidXQgd2UgbmVlZAorCSAqIHRoZSBrZXkuIHRodXMsIHdlIG11c3QgbG9vayBpbnRvIGFsbCBpdGVtcyBhbmQgc2VlIHRoYXQgd2UKKwkgKiBmaW5kIG9uZSAoc29tZSkgd2l0aCBhIHJlZmVyZW5jZSB0byBvdXIgZXh0ZW50IGl0ZW0uCisJICovCisJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGViKTsKKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgbnJpdGVtczsgKytzbG90KSB7CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShlYiwgJmtleSwgc2xvdCk7CisJCWlmIChrZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCisJCQljb250aW51ZTsKKwkJZmkgPSBidHJmc19pdGVtX3B0cihlYiwgc2xvdCwgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCQlpZiAoIWZpKSB7CisJCQlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJZGlza19ieXRlID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIoZWIsIGZpKTsKKwkJaWYgKGRpc2tfYnl0ZSAhPSBvcmlnX2V4dGVudF9pdGVtX29iamVjdGlkKSB7CisJCQlpZiAoZm91bmQpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCX0KKwkJKytmb3VuZDsKKwkJcmV0ID0gX19pdGVyX3NoYXJlZF9pbmxpbmVfcmVmX2lub2Rlcyhmc19pbmZvLCBsb2dpY2FsLAorCQkJCQkJCWtleS5vYmplY3RpZCwKKwkJCQkJCQlrZXkub2Zmc2V0LAorCQkJCQkJCWV4dGVudF9vZmZzZXQsIHBhdGgsCisJCQkJCQkJZGF0YV9yZWZzLAorCQkJCQkJCWl0ZXJhdGUsIGN0eCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZhaWxlZCB0byBmb2xsb3cgc2hhcmVkIGRhdGEgYmFja3JlZiAiCisJCQkidG8gcGFyZW50ICVsbHVcbiIsIGxvZ2ljYWwpOworCQlXQVJOX09OKDEpOworCQlyZXQgPSAtRUlPOworCX0KKworCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGNhbGxzIGl0ZXJhdGUoKSBmb3IgZXZlcnkgaW5vZGUgdGhhdCByZWZlcmVuY2VzIHRoZSBleHRlbnQgaWRlbnRpZmllZCBieQorICogdGhlIGdpdmVuIHBhcmFtZXRlcnMuIHdpbGwgdXNlIHRoZSBwYXRoIGdpdmVuIGFzIGEgcGFyYW1ldGVyIGFuZCByZXR1cm4gaXQKKyAqIHJlbGVhc2VkLgorICogd2hlbiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCBpdGVyYXRpb24gc3RvcHMuCisgKi8KK2ludCBpdGVyYXRlX2V4dGVudF9pbm9kZXMoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJdTY0IGV4dGVudF9pdGVtX29iamVjdGlkLAorCQkJCXU2NCBleHRlbnRfb2Zmc2V0LAorCQkJCWl0ZXJhdGVfZXh0ZW50X2lub2Rlc190ICppdGVyYXRlLCB2b2lkICpjdHgpCit7CisJdW5zaWduZWQgbG9uZyBwdHIgPSAwOworCWludCBsYXN0OworCWludCByZXQ7CisJaW50IHR5cGU7CisJdTY0IGxvZ2ljYWw7CisJdTMyIGl0ZW1fc2l6ZTsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2lubGluZV9yZWYgKmVpcmVmOworCXN0cnVjdCBidHJmc19leHRlbnRfZGF0YV9yZWYgKmRyZWY7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXN0cnVjdCBidHJmc19leHRlbnRfaXRlbSAqZWk7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGxpc3RfaGVhZCBkYXRhX3JlZnMgPSBMSVNUX0hFQURfSU5JVChkYXRhX3JlZnMpOworCXN0cnVjdCBsaXN0X2hlYWQgc2hhcmVkX3JlZnMgPSBMSVNUX0hFQURfSU5JVChzaGFyZWRfcmVmcyk7CisJc3RydWN0IF9fZGF0YV9yZWYgKnJlZl9kOworCXN0cnVjdCBfX3NoYXJlZF9yZWYgKnJlZl9zOworCisJZWIgPSBwYXRoLT5ub2Rlc1swXTsKKwllaSA9IGJ0cmZzX2l0ZW1fcHRyKGViLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtKTsKKwlpdGVtX3NpemUgPSBidHJmc19pdGVtX3NpemVfbnIoZWIsIHBhdGgtPnNsb3RzWzBdKTsKKworCS8qIGZpcnN0IHdlIGl0ZXJhdGUgdGhlIGlubGluZSByZWZzLCAuLi4gKi8KKwlkbyB7CisJCWxhc3QgPSBfX2dldF9leHRlbnRfaW5saW5lX3JlZigmcHRyLCBlYiwgZWksIGl0ZW1fc2l6ZSwKKwkJCQkJCSZlaXJlZiwgJnR5cGUpOworCQlpZiAobGFzdCA9PSAtRU5PRU5UKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxhc3QgPCAwKSB7CisJCQlyZXQgPSBsYXN0OworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodHlwZSA9PSBCVFJGU19FWFRFTlRfREFUQV9SRUZfS0VZKSB7CisJCQlkcmVmID0gKHN0cnVjdCBidHJmc19leHRlbnRfZGF0YV9yZWYgKikoJmVpcmVmLT5vZmZzZXQpOworCQkJcmV0ID0gX19kYXRhX2xpc3RfYWRkX2ViKCZkYXRhX3JlZnMsIGViLCBkcmVmKTsKKwkJfSBlbHNlIGlmICh0eXBlID09IEJUUkZTX1NIQVJFRF9EQVRBX1JFRl9LRVkpIHsKKwkJCWxvZ2ljYWwgPSBidHJmc19leHRlbnRfaW5saW5lX3JlZl9vZmZzZXQoZWIsIGVpcmVmKTsKKwkJCXJldCA9IF9fc2hhcmVkX2xpc3RfYWRkKCZzaGFyZWRfcmVmcywgbG9naWNhbCk7CisJCX0KKwl9IHdoaWxlICghcmV0ICYmICFsYXN0KTsKKworCS8qIC4uLiB0aGVuIHdlIHByb2NlZWQgdG8gaW4tdHJlZSByZWZlcmVuY2VzIGFuZCAuLi4gKi8KKwl3aGlsZSAoIXJldCkgeworCQkrK3BhdGgtPnNsb3RzWzBdOworCQlpZiAocGF0aC0+c2xvdHNbMF0gPiBidHJmc19oZWFkZXJfbnJpdGVtcyhlYikpIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihmc19pbmZvLT5leHRlbnRfcm9vdCwgcGF0aCk7CisJCQlpZiAocmV0KSB7CisJCQkJaWYgKHJldCA9PSAxKQorCQkJCQlyZXQgPSAwOyAvKiB3ZSdyZSBkb25lICovCisJCQkJYnJlYWs7CisJCQl9CisJCQllYiA9IHBhdGgtPm5vZGVzWzBdOworCQl9CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShlYiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoa2V5Lm9iamVjdGlkICE9IGV4dGVudF9pdGVtX29iamVjdGlkKQorCQkJYnJlYWs7CisJCWlmIChrZXkudHlwZSA9PSBCVFJGU19FWFRFTlRfREFUQV9SRUZfS0VZKSB7CisJCQlkcmVmID0gYnRyZnNfaXRlbV9wdHIoZWIsIHBhdGgtPnNsb3RzWzBdLAorCQkJCQkJc3RydWN0IGJ0cmZzX2V4dGVudF9kYXRhX3JlZik7CisJCQlyZXQgPSBfX2RhdGFfbGlzdF9hZGRfZWIoJmRhdGFfcmVmcywgZWIsIGRyZWYpOworCQl9IGVsc2UgaWYgKGtleS50eXBlID09IEJUUkZTX1NIQVJFRF9EQVRBX1JFRl9LRVkpIHsKKwkJCXJldCA9IF9fc2hhcmVkX2xpc3RfYWRkKCZzaGFyZWRfcmVmcywga2V5Lm9mZnNldCk7CisJCX0KKwl9CisKKwlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CisKKwkvKgorCSAqIC4uLiBvbmx5IGF0IHRoZSB2ZXJ5IGVuZCB3ZSBjYW4gcHJvY2VzcyB0aGUgcmVmcyB3ZSBmb3VuZC4gdGhpcyBpcworCSAqIGJlY2F1c2UgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHdlIGNhbGwgaXMgYWxsb3dlZCB0byBtYWtlIHRyZWUgbG9va3VwcworCSAqIGFuZCB3ZSBoYXZlIHRvIGF2b2lkIGRlYWRsb2Nrcy4gYWRkaXRpb25hbGx5LCB3ZSBuZWVkIG1vcmUgdHJlZQorCSAqIGxvb2t1cHMgb3Vyc2VsdmVzIGZvciBzaGFyZWQgZGF0YSByZWZzLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZGF0YV9yZWZzKSkgeworCQlyZWZfZCA9IGxpc3RfZmlyc3RfZW50cnkoJmRhdGFfcmVmcywgc3RydWN0IF9fZGF0YV9yZWYsIGxpc3QpOworCQlsaXN0X2RlbCgmcmVmX2QtPmxpc3QpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGl0ZXJhdGUocmVmX2QtPmludW0sIGV4dGVudF9vZmZzZXQgKworCQkJCQlyZWZfZC0+ZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQsCisJCQkJCXJlZl9kLT5yb290LCBjdHgpOworCQlrZnJlZShyZWZfZCk7CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzaGFyZWRfcmVmcykpIHsKKwkJcmVmX3MgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzaGFyZWRfcmVmcywgc3RydWN0IF9fc2hhcmVkX3JlZiwKKwkJCQkJbGlzdCk7CisJCWxpc3RfZGVsKCZyZWZfcy0+bGlzdCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gX19pdGVyX3NoYXJlZF9pbmxpbmVfcmVmKGZzX2luZm8sCisJCQkJCQkJcmVmX3MtPmRpc2tfYnl0ZSwKKwkJCQkJCQlleHRlbnRfaXRlbV9vYmplY3RpZCwKKwkJCQkJCQlleHRlbnRfb2Zmc2V0LCBwYXRoLAorCQkJCQkJCSZkYXRhX3JlZnMsCisJCQkJCQkJaXRlcmF0ZSwgY3R4KTsKKwkJa2ZyZWUocmVmX3MpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpdGVyYXRlX2lub2Rlc19mcm9tX2xvZ2ljYWwodTY0IGxvZ2ljYWwsIHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCWl0ZXJhdGVfZXh0ZW50X2lub2Rlc190ICppdGVyYXRlLCB2b2lkICpjdHgpCit7CisJaW50IHJldDsKKwl1NjQgb2Zmc2V0OworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCisJcmV0ID0gZXh0ZW50X2Zyb21fbG9naWNhbChmc19pbmZvLCBsb2dpY2FsLCBwYXRoLAorCQkJCQkmZm91bmRfa2V5KTsKKwlpZiAocmV0ICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW9mZnNldCA9IGxvZ2ljYWwgLSBmb3VuZF9rZXkub2JqZWN0aWQ7CisJcmV0ID0gaXRlcmF0ZV9leHRlbnRfaW5vZGVzKGZzX2luZm8sIHBhdGgsIGZvdW5kX2tleS5vYmplY3RpZCwKKwkJCQkJb2Zmc2V0LCBpdGVyYXRlLCBjdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpdGVyYXRlX2lyZWZzKHU2NCBpbnVtLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwKKwkJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQlpdGVyYXRlX2lyZWZzX3QgKml0ZXJhdGUsIHZvaWQgKmN0eCkKK3sKKwlpbnQgcmV0OworCWludCBzbG90OworCXUzMiBjdXI7CisJdTMyIGxlbjsKKwl1MzIgbmFtZV9sZW47CisJdTY0IHBhcmVudCA9IDA7CisJaW50IGZvdW5kID0gMDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJc3RydWN0IGJ0cmZzX2l0ZW0gKml0ZW07CisJc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqaXJlZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKworCXdoaWxlICgxKSB7CisJCXJldCA9IGlub2RlX3JlZl9pbmZvKGludW0sIHBhcmVudCA/IHBhcmVudCsxIDogMCwgZnNfcm9vdCwgcGF0aCwKKwkJCQkJJmZvdW5kX2tleSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IGZvdW5kID8gMCA6IC1FTk9FTlQ7CisJCQlicmVhazsKKwkJfQorCQkrK2ZvdW5kOworCisJCXBhcmVudCA9IGZvdW5kX2tleS5vZmZzZXQ7CisJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKKwkJZWIgPSBwYXRoLT5ub2Rlc1swXTsKKwkJLyogbWFrZSBzdXJlIHdlIGNhbiB1c2UgZWIgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBwYXRoICovCisJCWF0b21pY19pbmMoJmViLT5yZWZzKTsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCisJCWl0ZW0gPSBidHJmc19pdGVtX25yKGViLCBzbG90KTsKKwkJaXJlZiA9IGJ0cmZzX2l0ZW1fcHRyKGViLCBzbG90LCBzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmKTsKKworCQlmb3IgKGN1ciA9IDA7IGN1ciA8IGJ0cmZzX2l0ZW1fc2l6ZShlYiwgaXRlbSk7IGN1ciArPSBsZW4pIHsKKwkJCW5hbWVfbGVuID0gYnRyZnNfaW5vZGVfcmVmX25hbWVfbGVuKGViLCBpcmVmKTsKKwkJCS8qIHBhdGggbXVzdCBiZSByZWxlYXNlZCBiZWZvcmUgY2FsbGluZyBpdGVyYXRlKCkhICovCisJCQlyZXQgPSBpdGVyYXRlKHBhcmVudCwgaXJlZiwgZWIsIGN0eCk7CisJCQlpZiAocmV0KSB7CisJCQkJZnJlZV9leHRlbnRfYnVmZmVyKGViKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWxlbiA9IHNpemVvZigqaXJlZikgKyBuYW1lX2xlbjsKKwkJCWlyZWYgPSAoc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqKSgoY2hhciAqKWlyZWYgKyBsZW4pOworCQl9CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJfQorCisJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHJldHVybnMgMCBpZiB0aGUgcGF0aCBjb3VsZCBiZSBkdW1wZWQgKHByb2JhYmx5IHRydW5jYXRlZCkKKyAqIHJldHVybnMgPDAgaW4gY2FzZSBvZiBhbiBlcnJvcgorICovCitzdGF0aWMgaW50IGlub2RlX3RvX3BhdGgodTY0IGludW0sIHN0cnVjdCBidHJmc19pbm9kZV9yZWYgKmlyZWYsCisJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCB2b2lkICpjdHgpCit7CisJc3RydWN0IGlub2RlX2ZzX3BhdGhzICppcGF0aCA9IGN0eDsKKwljaGFyICpmc3BhdGg7CisJY2hhciAqZnNwYXRoX21pbjsKKwlpbnQgaSA9IGlwYXRoLT5mc3BhdGgtPmVsZW1fY250OworCWNvbnN0IGludCBzX3B0ciA9IHNpemVvZihjaGFyICopOworCXUzMiBieXRlc19sZWZ0OworCisJYnl0ZXNfbGVmdCA9IGlwYXRoLT5mc3BhdGgtPmJ5dGVzX2xlZnQgPiBzX3B0ciA/CisJCQkJCWlwYXRoLT5mc3BhdGgtPmJ5dGVzX2xlZnQgLSBzX3B0ciA6IDA7CisKKwlmc3BhdGhfbWluID0gKGNoYXIgKilpcGF0aC0+ZnNwYXRoLT52YWwgKyAoaSArIDEpICogc19wdHI7CisJZnNwYXRoID0gaXJlZl90b19wYXRoKGlwYXRoLT5mc19yb290LCBpcGF0aC0+YnRyZnNfcGF0aCwgaXJlZiwgZWIsCisJCQkJaW51bSwgZnNwYXRoX21pbiwgYnl0ZXNfbGVmdCk7CisJaWYgKElTX0VSUihmc3BhdGgpKQorCQlyZXR1cm4gUFRSX0VSUihmc3BhdGgpOworCisJaWYgKGZzcGF0aCA+IGZzcGF0aF9taW4pIHsKKwkJaXBhdGgtPmZzcGF0aC0+dmFsW2ldID0gKHU2NClmc3BhdGg7CisJCSsraXBhdGgtPmZzcGF0aC0+ZWxlbV9jbnQ7CisJCWlwYXRoLT5mc3BhdGgtPmJ5dGVzX2xlZnQgPSBmc3BhdGggLSBmc3BhdGhfbWluOworCX0gZWxzZSB7CisJCSsraXBhdGgtPmZzcGF0aC0+ZWxlbV9taXNzZWQ7CisJCWlwYXRoLT5mc3BhdGgtPmJ5dGVzX21pc3NpbmcgKz0gZnNwYXRoX21pbiAtIGZzcGF0aDsKKwkJaXBhdGgtPmZzcGF0aC0+Ynl0ZXNfbGVmdCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0aGlzIGR1bXBzIGFsbCBmaWxlIHN5c3RlbSBwYXRocyB0byB0aGUgaW5vZGUgaW50byB0aGUgaXBhdGggc3RydWN0LCBwcm92aWRlZAorICogaXMgaGFzIGJlZW4gY3JlYXRlZCBsYXJnZSBlbm91Z2guIGVhY2ggcGF0aCBpcyB6ZXJvLXRlcm1pbmF0ZWQgYW5kIGFjY2Vzc2VkCisgKiBmcm9tIGlwYXRoLT5mc3BhdGgtPnZhbFtpXS4KKyAqIHdoZW4gaXQgcmV0dXJucywgdGhlcmUgYXJlIGlwYXRoLT5mc3BhdGgtPmVsZW1fY250IG51bWJlciBvZiBwYXRocyBhdmFpbGFibGUKKyAqIGluIGlwYXRoLT5mc3BhdGgtPnZhbFtdLiB3aGVuIHRoZSBhbGxvY2F0ZWQgc3BhY2Ugd2Fzbid0IHN1ZmZpY2llbnQsIHRoZQorICogbnVtYmVyIG9mIG1pc3NlZCBwYXRocyBpbiByZWNvcmVkIGluIGlwYXRoLT5mc3BhdGgtPmVsZW1fbWlzc2VkLCBvdGhlcndpc2UsCisgKiBpdCdzIHplcm8uIGlwYXRoLT5mc3BhdGgtPmJ5dGVzX21pc3NpbmcgaG9sZHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkCisgKiBoYXZlIGJlZW4gbmVlZGVkIHRvIHJldHVybiBhbGwgcGF0aHMuCisgKi8KK2ludCBwYXRoc19mcm9tX2lub2RlKHU2NCBpbnVtLCBzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMgKmlwYXRoKQoreworCXJldHVybiBpdGVyYXRlX2lyZWZzKGludW0sIGlwYXRoLT5mc19yb290LCBpcGF0aC0+YnRyZnNfcGF0aCwKKwkJCQlpbm9kZV90b19wYXRoLCBpcGF0aCk7Cit9CisKKy8qCisgKiBhbGxvY2F0ZXMgc3BhY2UgdG8gcmV0dXJuIG11bHRpcGxlIGZpbGUgc3lzdGVtIHBhdGhzIGZvciBhbiBpbm9kZS4KKyAqIHRvdGFsX2J5dGVzIHRvIGFsbG9jYXRlIGFyZSBwYXNzZWQsIG5vdGUgdGhhdCBzcGFjZSB1c2FibGUgZm9yIGFjdHVhbCBwYXRoCisgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIHRvdGFsX2J5dGVzIC0gc2l6ZW9mKHN0cnVjdCBpbm9kZV9mc19wYXRocykuCisgKiB0aGUgcmV0dXJuZWQgcG9pbnRlciBtdXN0IGJlIGZyZWVkIHdpdGggZnJlZV9pcGF0aCgpIGluIHRoZSBlbmQuCisgKi8KK3N0cnVjdCBidHJmc19kYXRhX2NvbnRhaW5lciAqaW5pdF9kYXRhX2NvbnRhaW5lcih1MzIgdG90YWxfYnl0ZXMpCit7CisJc3RydWN0IGJ0cmZzX2RhdGFfY29udGFpbmVyICpkYXRhOworCXNpemVfdCBhbGxvY19ieXRlczsKKworCWFsbG9jX2J5dGVzID0gbWF4X3Qoc2l6ZV90LCB0b3RhbF9ieXRlcywgc2l6ZW9mKCpkYXRhKSk7CisJZGF0YSA9IGttYWxsb2MoYWxsb2NfYnl0ZXMsIEdGUF9OT0ZTKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHRvdGFsX2J5dGVzID49IHNpemVvZigqZGF0YSkpIHsKKwkJZGF0YS0+Ynl0ZXNfbGVmdCA9IHRvdGFsX2J5dGVzIC0gc2l6ZW9mKCpkYXRhKTsKKwkJZGF0YS0+Ynl0ZXNfbWlzc2luZyA9IDA7CisJfSBlbHNlIHsKKwkJZGF0YS0+Ynl0ZXNfbWlzc2luZyA9IHNpemVvZigqZGF0YSkgLSB0b3RhbF9ieXRlczsKKwkJZGF0YS0+Ynl0ZXNfbGVmdCA9IDA7CisJfQorCisJZGF0YS0+ZWxlbV9jbnQgPSAwOworCWRhdGEtPmVsZW1fbWlzc2VkID0gMDsKKworCXJldHVybiBkYXRhOworfQorCisvKgorICogYWxsb2NhdGVzIHNwYWNlIHRvIHJldHVybiBtdWx0aXBsZSBmaWxlIHN5c3RlbSBwYXRocyBmb3IgYW4gaW5vZGUuCisgKiB0b3RhbF9ieXRlcyB0byBhbGxvY2F0ZSBhcmUgcGFzc2VkLCBub3RlIHRoYXQgc3BhY2UgdXNhYmxlIGZvciBhY3R1YWwgcGF0aAorICogaW5mb3JtYXRpb24gd2lsbCBiZSB0b3RhbF9ieXRlcyAtIHNpemVvZihzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMpLgorICogdGhlIHJldHVybmVkIHBvaW50ZXIgbXVzdCBiZSBmcmVlZCB3aXRoIGZyZWVfaXBhdGgoKSBpbiB0aGUgZW5kLgorICovCitzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMgKmluaXRfaXBhdGgoczMyIHRvdGFsX2J5dGVzLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwKKwkJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpCit7CisJc3RydWN0IGlub2RlX2ZzX3BhdGhzICppZnA7CisJc3RydWN0IGJ0cmZzX2RhdGFfY29udGFpbmVyICpmc3BhdGg7CisKKwlmc3BhdGggPSBpbml0X2RhdGFfY29udGFpbmVyKHRvdGFsX2J5dGVzKTsKKwlpZiAoSVNfRVJSKGZzcGF0aCkpCisJCXJldHVybiAodm9pZCAqKWZzcGF0aDsKKworCWlmcCA9IGttYWxsb2Moc2l6ZW9mKCppZnApLCBHRlBfTk9GUyk7CisJaWYgKCFpZnApIHsKKwkJa2ZyZWUoZnNwYXRoKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJaWZwLT5idHJmc19wYXRoID0gcGF0aDsKKwlpZnAtPmZzcGF0aCA9IGZzcGF0aDsKKwlpZnAtPmZzX3Jvb3QgPSBmc19yb290OworCisJcmV0dXJuIGlmcDsKK30KKwordm9pZCBmcmVlX2lwYXRoKHN0cnVjdCBpbm9kZV9mc19wYXRocyAqaXBhdGgpCit7CisJa2ZyZWUoaXBhdGgpOworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYmFja3JlZi5oIGIvZnMvYnRyZnMvYmFja3JlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjE4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9iYWNrcmVmLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTVFJBVE8uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19CVFJGU19CQUNLUkVGX18KKyNkZWZpbmUgX19CVFJGU19CQUNLUkVGX18KKworI2luY2x1ZGUgImlvY3RsLmgiCisKK3N0cnVjdCBpbm9kZV9mc19wYXRocyB7CisJc3RydWN0IGJ0cmZzX3BhdGgJCSpidHJmc19wYXRoOworCXN0cnVjdCBidHJmc19yb290CQkqZnNfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfZGF0YV9jb250YWluZXIJKmZzcGF0aDsKK307CisKK3R5cGVkZWYgaW50IChpdGVyYXRlX2V4dGVudF9pbm9kZXNfdCkodTY0IGludW0sIHU2NCBvZmZzZXQsIHU2NCByb290LAorCQl2b2lkICpjdHgpOwordHlwZWRlZiBpbnQgKGl0ZXJhdGVfaXJlZnNfdCkodTY0IHBhcmVudCwgc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqaXJlZiwKKwkJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHZvaWQgKmN0eCk7CisKK2ludCBpbm9kZV9pdGVtX2luZm8odTY0IGludW0sIHU2NCBpb2ZmLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwKKwkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoKTsKKworaW50IGV4dGVudF9mcm9tX2xvZ2ljYWwoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIHU2NCBsb2dpY2FsLAorCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHN0cnVjdCBidHJmc19rZXkgKmZvdW5kX2tleSk7CisKK2ludCB0cmVlX2JhY2tyZWZfZm9yX2V4dGVudCh1bnNpZ25lZCBsb25nICpwdHIsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpLCB1MzIgaXRlbV9zaXplLAorCQkJCXU2NCAqb3V0X3Jvb3QsIHU4ICpvdXRfbGV2ZWwpOworCitpbnQgaXRlcmF0ZV9leHRlbnRfaW5vZGVzKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCXU2NCBleHRlbnRfaXRlbV9vYmplY3RpZCwKKwkJCQl1NjQgZXh0ZW50X29mZnNldCwKKwkJCQlpdGVyYXRlX2V4dGVudF9pbm9kZXNfdCAqaXRlcmF0ZSwgdm9pZCAqY3R4KTsKKworaW50IGl0ZXJhdGVfaW5vZGVzX2Zyb21fbG9naWNhbCh1NjQgbG9naWNhbCwgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJaXRlcmF0ZV9leHRlbnRfaW5vZGVzX3QgKml0ZXJhdGUsIHZvaWQgKmN0eCk7CisKK2ludCBwYXRoc19mcm9tX2lub2RlKHU2NCBpbnVtLCBzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMgKmlwYXRoKTsKKworc3RydWN0IGJ0cmZzX2RhdGFfY29udGFpbmVyICppbml0X2RhdGFfY29udGFpbmVyKHUzMiB0b3RhbF9ieXRlcyk7CitzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMgKmluaXRfaXBhdGgoczMyIHRvdGFsX2J5dGVzLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwKKwkJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpOwordm9pZCBmcmVlX2lwYXRoKHN0cnVjdCBpbm9kZV9mc19wYXRocyAqaXBhdGgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmggYi9mcy9idHJmcy9idHJmc19pbm9kZS5oCmluZGV4IGQ5Zjk5YTEuLjYzNDYwOGQyIDEwMDY0NAotLS0gYS9mcy9idHJmcy9idHJmc19pbm9kZS5oCisrKyBiL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmgKQEAgLTEwMywxMSArMTAzLDYgQEAKIAkgKi8KIAl1NjQgZGVsYWxsb2NfYnl0ZXM7CiAKLQkvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkgYmUgdXNlZCBmb3IgdGhpcyBpbm9kZSBmb3IKLQkgKiBkZWxhbGxvYwotCSAqLwotCXU2NCByZXNlcnZlZF9ieXRlczsKLQogCS8qCiAJICogdGhlIHNpemUgb2YgdGhlIGZpbGUgc3RvcmVkIGluIHRoZSBtZXRhZGF0YSBvbiBkaXNrLiAgZGF0YT1vcmRlcmVkCiAJICogbWVhbnMgdGhlIGluLW1lbW9yeSBpX3NpemUgbWlnaHQgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb24gZGlzawpAQCAtMTE1LDkgKzExMCw2IEBACiAJICovCiAJdTY0IGRpc2tfaV9zaXplOwogCi0JLyogZmxhZ3MgZmllbGQgZnJvbSB0aGUgb24gZGlzayBpbm9kZSAqLwotCXUzMiBmbGFnczsKLQogCS8qCiAJICogaWYgdGhpcyBpcyBhIGRpcmVjdG9yeSB0aGVuIGluZGV4X2NudCBpcyB0aGUgY291bnRlciBmb3IgdGhlIGluZGV4CiAJICogbnVtYmVyIGZvciBuZXcgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZApAQCAtMTMyLDYgKzEyNCwxNSBAQAogCXU2NCBsYXN0X3VubGlua190cmFuczsKIAogCS8qCisJICogTnVtYmVyIG9mIGJ5dGVzIG91dHN0YW5kaW5nIHRoYXQgYXJlIGdvaW5nIHRvIG5lZWQgY3N1bXMuICBUaGlzIGlzCisJICogdXNlZCBpbiBFTk9TUEMgYWNjb3VudGluZy4KKwkgKi8KKwl1NjQgY3N1bV9ieXRlczsKKworCS8qIGZsYWdzIGZpZWxkIGZyb20gdGhlIG9uIGRpc2sgaW5vZGUgKi8KKwl1MzIgZmxhZ3M7CisKKwkvKgogCSAqIENvdW50ZXJzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBleHRlbnQgaXRlbSdzIHdlIG1heSB1c2UgZHVlCiAJICogdG8gZGVsYWxsb2MgYW5kIHN1Y2guICBvdXRzdGFuZGluZ19leHRlbnRzIGlzIHRoZSBudW1iZXIgb2YgZXh0ZW50CiAJICogaXRlbXMgd2UgdGhpbmsgd2UnbGwgZW5kIHVwIHVzaW5nLCBhbmQgcmVzZXJ2ZWRfZXh0ZW50cyBpcyB0aGUgbnVtYmVyCkBAIC0xNDYsMTQgKzE0NywxMiBAQAogCSAqIHRoZSBidHJmcyBmaWxlIHJlbGVhc2UgY2FsbCB3aWxsIGFkZCB0aGlzIGlub2RlIHRvIHRoZQogCSAqIG9yZGVyZWQgb3BlcmF0aW9ucyBsaXN0IHNvIHRoYXQgd2UgbWFrZSBzdXJlIHRvIGZsdXNoIG91dCBhbnkKIAkgKiBuZXcgZGF0YSB0aGUgYXBwbGljYXRpb24gbWF5IGhhdmUgd3JpdHRlbiBiZWZvcmUgY29tbWl0LgotCSAqCi0JICogeWVzLCBpdHMgc2lsbHkgdG8gaGF2ZSBhIHNpbmdsZSBiaXRmbGFnLCBidXQgd2UgbWlnaHQgZ3JvdyBtb3JlCi0JICogb2YgdGhlc2UuCiAJICovCiAJdW5zaWduZWQgb3JkZXJlZF9kYXRhX2Nsb3NlOjE7CiAJdW5zaWduZWQgb3JwaGFuX21ldGFfcmVzZXJ2ZWQ6MTsKIAl1bnNpZ25lZCBkdW1teV9pbm9kZToxOwogCXVuc2lnbmVkIGluX2RlZnJhZzoxOworCXVuc2lnbmVkIGRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQ6MTsKIAogCS8qCiAJICogYWx3YXlzIGNvbXByZXNzIHRoaXMgb25lIGZpbGUKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMgYi9mcy9idHJmcy9jb21wcmVzc2lvbi5jCmluZGV4IDhlYzVkODYuLjE0ZjFjNWEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMKKysrIGIvZnMvYnRyZnMvY29tcHJlc3Npb24uYwpAQCAtODUsNyArODUsOCBAQAogc3RhdGljIGlubGluZSBpbnQgY29tcHJlc3NlZF9iaW9fc2l6ZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIGRpc2tfc2l6ZSkKIHsKLQl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgY29tcHJlc3NlZF9iaW8pICsKIAkJKChkaXNrX3NpemUgKyByb290LT5zZWN0b3JzaXplIC0gMSkgLyByb290LT5zZWN0b3JzaXplKSAqCiAJCWNzdW1fc2l6ZTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2N0cmVlLmMgYi9mcy9idHJmcy9jdHJlZS5jCmluZGV4IDAxMWNhYjMuLjBmZTYxNWUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2N0cmVlLmMKKysrIGIvZnMvYnRyZnMvY3RyZWUuYwpAQCAtOTAyLDkgKzkwMiwxMCBAQAogCiAJb3JpZ19wdHIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKG1pZCwgb3JpZ19zbG90KTsKIAotCWlmIChsZXZlbCA8IEJUUkZTX01BWF9MRVZFTCAtIDEpCisJaWYgKGxldmVsIDwgQlRSRlNfTUFYX0xFVkVMIC0gMSkgewogCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1tsZXZlbCArIDFdOwotCXBzbG90ID0gcGF0aC0+c2xvdHNbbGV2ZWwgKyAxXTsKKwkJcHNsb3QgPSBwYXRoLT5zbG90c1tsZXZlbCArIDFdOworCX0KIAogCS8qCiAJICogZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG9ubHkgb25lIHBvaW50ZXIgaW4gdGhlIHJvb3QKQEAgLTExMDcsOSArMTEwOCwxMCBAQAogCW1pZCA9IHBhdGgtPm5vZGVzW2xldmVsXTsKIAlXQVJOX09OKGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKG1pZCkgIT0gdHJhbnMtPnRyYW5zaWQpOwogCi0JaWYgKGxldmVsIDwgQlRSRlNfTUFYX0xFVkVMIC0gMSkKKwlpZiAobGV2ZWwgPCBCVFJGU19NQVhfTEVWRUwgLSAxKSB7CiAJCXBhcmVudCA9IHBhdGgtPm5vZGVzW2xldmVsICsgMV07Ci0JcHNsb3QgPSBwYXRoLT5zbG90c1tsZXZlbCArIDFdOworCQlwc2xvdCA9IHBhdGgtPnNsb3RzW2xldmVsICsgMV07CisJfQogCiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuaCBiL2ZzL2J0cmZzL2N0cmVlLmgKaW5kZXggMDM5MTJjNS4uYjliYTU5ZiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY3RyZWUuaAorKysgYi9mcy9idHJmcy9jdHJlZS5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9idHJmcy5oPgogI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgImV4dGVudF9pby5oIgogI2luY2x1ZGUgImV4dGVudF9tYXAuaCIKICNpbmNsdWRlICJhc3luYy10aHJlYWQuaCIKQEAgLTM2MCw2ICszNjEsNDcgQEAKICNkZWZpbmUgQlRSRlNfTEFCRUxfU0laRSAyNTYKIAogLyoKKyAqIGp1c3QgaW4gY2FzZSB3ZSBzb21laG93IGxvc2UgdGhlIHJvb3RzIGFuZCBhcmUgbm90IGFibGUgdG8gbW91bnQsCisgKiB3ZSBzdG9yZSBhbiBhcnJheSBvZiB0aGUgcm9vdHMgZnJvbSBwcmV2aW91cyB0cmFuc2FjdGlvbnMKKyAqIGluIHRoZSBzdXBlci4KKyAqLworI2RlZmluZSBCVFJGU19OVU1fQkFDS1VQX1JPT1RTIDQKK3N0cnVjdCBidHJmc19yb290X2JhY2t1cCB7CisJX19sZTY0IHRyZWVfcm9vdDsKKwlfX2xlNjQgdHJlZV9yb290X2dlbjsKKworCV9fbGU2NCBjaHVua19yb290OworCV9fbGU2NCBjaHVua19yb290X2dlbjsKKworCV9fbGU2NCBleHRlbnRfcm9vdDsKKwlfX2xlNjQgZXh0ZW50X3Jvb3RfZ2VuOworCisJX19sZTY0IGZzX3Jvb3Q7CisJX19sZTY0IGZzX3Jvb3RfZ2VuOworCisJX19sZTY0IGRldl9yb290OworCV9fbGU2NCBkZXZfcm9vdF9nZW47CisKKwlfX2xlNjQgY3N1bV9yb290OworCV9fbGU2NCBjc3VtX3Jvb3RfZ2VuOworCisJX19sZTY0IHRvdGFsX2J5dGVzOworCV9fbGU2NCBieXRlc191c2VkOworCV9fbGU2NCBudW1fZGV2aWNlczsKKwkvKiBmdXR1cmUgKi8KKwlfX2xlNjQgdW5zZWRfNjRbNF07CisKKwl1OCB0cmVlX3Jvb3RfbGV2ZWw7CisJdTggY2h1bmtfcm9vdF9sZXZlbDsKKwl1OCBleHRlbnRfcm9vdF9sZXZlbDsKKwl1OCBmc19yb290X2xldmVsOworCXU4IGRldl9yb290X2xldmVsOworCXU4IGNzdW1fcm9vdF9sZXZlbDsKKwkvKiBmdXR1cmUgYW5kIHRvIGFsaWduICovCisJdTggdW51c2VkXzhbMTBdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKgogICogdGhlIHN1cGVyIGJsb2NrIGJhc2ljYWxseSBsaXN0cyB0aGUgbWFpbiB0cmVlcyBvZiB0aGUgRlMKICAqIGl0IGN1cnJlbnRseSBsYWNrcyBhbnkgYmxvY2sgY291bnQgZXRjIGV0YwogICovCkBAIC00MDUsNiArNDQ3LDcgQEAKIAkvKiBmdXR1cmUgZXhwYW5zaW9uICovCiAJX19sZTY0IHJlc2VydmVkWzMxXTsKIAl1OCBzeXNfY2h1bmtfYXJyYXlbQlRSRlNfU1lTVEVNX0NIVU5LX0FSUkFZX1NJWkVdOworCXN0cnVjdCBidHJmc19yb290X2JhY2t1cCBzdXBlcl9yb290c1tCVFJGU19OVU1fQkFDS1VQX1JPT1RTXTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogLyoKQEAgLTc3MiwxNCArODE1LDggQEAKIHN0cnVjdCBidHJmc19ibG9ja19yc3YgewogCXU2NCBzaXplOwogCXU2NCByZXNlcnZlZDsKLQl1NjQgZnJlZWRbMl07CiAJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm87Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXNwaW5sb2NrX3QgbG9jazsKLQlhdG9taWNfdCB1c2FnZTsKLQl1bnNpZ25lZCBpbnQgcHJpb3JpdHk6ODsKLQl1bnNpZ25lZCBpbnQgZHVyYWJsZToxOwotCXVuc2lnbmVkIGludCByZWZpbGxfdXNlZDoxOwogCXVuc2lnbmVkIGludCBmdWxsOjE7CiB9OwogCkBAIC04NDAsMTAgKzg3NywxMCBAQAogCXNwaW5sb2NrX3QgbG9jazsKIAl1NjQgcGlubmVkOwogCXU2NCByZXNlcnZlZDsKLQl1NjQgcmVzZXJ2ZWRfcGlubmVkOwogCXU2NCBieXRlc19zdXBlcjsKIAl1NjQgZmxhZ3M7CiAJdTY0IHNlY3RvcnNpemU7CisJdTY0IGNhY2hlX2dlbmVyYXRpb247CiAJdW5zaWduZWQgaW50IHJvOjE7CiAJdW5zaWduZWQgaW50IGRpcnR5OjE7CiAJdW5zaWduZWQgaW50IGlyZWY6MTsKQEAgLTg5OSw2ICs5MzYsMTAgQEAKIAlzcGlubG9ja190IGJsb2NrX2dyb3VwX2NhY2hlX2xvY2s7CiAJc3RydWN0IHJiX3Jvb3QgYmxvY2tfZ3JvdXBfY2FjaGVfdHJlZTsKIAorCS8qIGtlZXAgdHJhY2sgb2YgdW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlzcGlubG9ja190IGZyZWVfY2h1bmtfbG9jazsKKwl1NjQgZnJlZV9jaHVua19zcGFjZTsKKwogCXN0cnVjdCBleHRlbnRfaW9fdHJlZSBmcmVlZF9leHRlbnRzWzJdOwogCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqcGlubmVkX2V4dGVudHM7CiAKQEAgLTkxNiwxNCArOTU3LDExIEBACiAJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiB0cmFuc19ibG9ja19yc3Y7CiAJLyogYmxvY2sgcmVzZXJ2YXRpb24gZm9yIGNodW5rIHRyZWUgKi8KIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2IGNodW5rX2Jsb2NrX3JzdjsKKwkvKiBibG9jayByZXNlcnZhdGlvbiBmb3IgZGVsYXllZCBvcGVyYXRpb25zICovCisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiBkZWxheWVkX2Jsb2NrX3JzdjsKIAogCXN0cnVjdCBidHJmc19ibG9ja19yc3YgZW1wdHlfYmxvY2tfcnN2OwogCi0JLyogbGlzdCBvZiBibG9jayByZXNlcnZhdGlvbnMgdGhhdCBjcm9zcyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGR1cmFibGVfYmxvY2tfcnN2X2xpc3Q7Ci0KLQlzdHJ1Y3QgbXV0ZXggZHVyYWJsZV9ibG9ja19yc3ZfbXV0ZXg7Ci0KIAl1NjQgZ2VuZXJhdGlvbjsKIAl1NjQgbGFzdF90cmFuc19jb21taXR0ZWQ7CiAKQEAgLTk0Miw4ICs5ODAsOCBAQAogCXdhaXRfcXVldWVfaGVhZF90IHRyYW5zYWN0aW9uX2Jsb2NrZWRfd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBhc3luY19zdWJtaXRfd2FpdDsKIAotCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayBzdXBlcl9jb3B5OwotCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayBzdXBlcl9mb3JfY29tbWl0OworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXJfY29weTsKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKnN1cGVyX2Zvcl9jb21taXQ7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqX19iZGV2OwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJc3RydWN0IGlub2RlICpidHJlZV9pbm9kZTsKQEAgLTEwMzYsNiArMTA3NCw3IEBACiAJc3RydWN0IGJ0cmZzX3dvcmtlcnMgZW5kaW9fZnJlZXNwYWNlX3dvcmtlcjsKIAlzdHJ1Y3QgYnRyZnNfd29ya2VycyBzdWJtaXRfd29ya2VyczsKIAlzdHJ1Y3QgYnRyZnNfd29ya2VycyBjYWNoaW5nX3dvcmtlcnM7CisJc3RydWN0IGJ0cmZzX3dvcmtlcnMgcmVhZGFoZWFkX3dvcmtlcnM7CiAKIAkvKgogCSAqIGZpeHVwIHdvcmtlcnMgdGFrZSBkaXJ0eSBwYWdlcyB0aGF0IGRpZG4ndCBwcm9wZXJseSBnbyB0aHJvdWdoCkBAIC0xMTE5LDYgKzExNTgsMTMgQEAKIAl1NjQgZnNfc3RhdGU7CiAKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yb290ICpkZWxheWVkX3Jvb3Q7CisKKwkvKiByZWFkYWhlYWQgdHJlZSAqLworCXNwaW5sb2NrX3QgcmVhZGFfbG9jazsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IHJlYWRhX3RyZWU7CisKKwkvKiBuZXh0IGJhY2t1cCByb290IHRvIGJlIG92ZXJ3cml0dGVuICovCisJaW50IGJhY2t1cF9yb290X2luZGV4OwogfTsKIAogLyoKQEAgLTEzNjMsNiArMTQwOSw3IEBACiAjZGVmaW5lIEJUUkZTX01PVU5UX0VOT1NQQ19ERUJVRwkgKDEgPDwgMTUpCiAjZGVmaW5lIEJUUkZTX01PVU5UX0FVVE9fREVGUkFHCQkoMSA8PCAxNikKICNkZWZpbmUgQlRSRlNfTU9VTlRfSU5PREVfTUFQX0NBQ0hFCSgxIDw8IDE3KQorI2RlZmluZSBCVFJGU19NT1VOVF9SRUNPVkVSWQkJKDEgPDwgMTgpCiAKICNkZWZpbmUgYnRyZnNfY2xlYXJfb3B0KG8sIG9wdCkJCSgobykgJj0gfkJUUkZTX01PVU5UXyMjb3B0KQogI2RlZmluZSBidHJmc19zZXRfb3B0KG8sIG9wdCkJCSgobykgfD0gQlRSRlNfTU9VTlRfIyNvcHQpCkBAIC0xOTc4LDYgKzIwMjUsNTUgQEAKIAlyZXR1cm4gcm9vdC0+cm9vdF9pdGVtLmZsYWdzICYgQlRSRlNfUk9PVF9TVUJWT0xfUkRPTkxZOwogfQogCisvKiBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAgKi8KK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfdHJlZV9yb290LCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIHRyZWVfcm9vdCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF90cmVlX3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIHRyZWVfcm9vdF9nZW4sIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfdHJlZV9yb290X2xldmVsLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIHRyZWVfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfY2h1bmtfcm9vdCwgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBjaHVua19yb290LCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2NodW5rX3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGNodW5rX3Jvb3RfZ2VuLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2NodW5rX3Jvb3RfbGV2ZWwsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgY2h1bmtfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZXh0ZW50X3Jvb3QsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgZXh0ZW50X3Jvb3QsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZXh0ZW50X3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGV4dGVudF9yb290X2dlbiwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF9leHRlbnRfcm9vdF9sZXZlbCwgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBleHRlbnRfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZnNfcm9vdCwgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBmc19yb290LCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2ZzX3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGZzX3Jvb3RfZ2VuLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2ZzX3Jvb3RfbGV2ZWwsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgZnNfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZGV2X3Jvb3QsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgZGV2X3Jvb3QsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZGV2X3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGRldl9yb290X2dlbiwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF9kZXZfcm9vdF9sZXZlbCwgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBkZXZfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfY3N1bV9yb290LCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGNzdW1fcm9vdCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF9jc3VtX3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGNzdW1fcm9vdF9nZW4sIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfY3N1bV9yb290X2xldmVsLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGNzdW1fcm9vdF9sZXZlbCwgOCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX3RvdGFsX2J5dGVzLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIHRvdGFsX2J5dGVzLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2J5dGVzX3VzZWQsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgYnl0ZXNfdXNlZCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF9udW1fZGV2aWNlcywgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBudW1fZGV2aWNlcywgNjQpOworCiAvKiBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKi8KIAogQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX2J5dGVuciwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLCBieXRlbnIsIDY0KTsKQEAgLTIxMjksNiArMjIyNSwxMSBAQAogCQkoc3BhY2VfaW5mby0+ZmxhZ3MgJiBCVFJGU19CTE9DS19HUk9VUF9EQVRBKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgZ2ZwX3QgYnRyZnNfYWxsb2Nfd3JpdGVfbWFzayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKK3sKKwlyZXR1cm4gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmIH5fX0dGUF9GUzsKK30KKwogLyogZXh0ZW50LXRyZWUuYyAqLwogc3RhdGljIGlubGluZSB1NjQgYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQkJIHVuc2lnbmVkIG51bV9pdGVtcykKQEAgLTIxMzcsNiArMjIzOCwxNyBAQAogCQkzICogbnVtX2l0ZW1zOwogfQogCisvKgorICogRG9pbmcgYSB0cnVuY2F0ZSB3b24ndCByZXN1bHQgaW4gbmV3IG5vZGVzIG9yIGxlYXZlcywganVzdCB3aGF0IHdlIG5lZWQgZm9yCisgKiBDT1cuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IGJ0cmZzX2NhbGNfdHJ1bmNfbWV0YWRhdGFfc2l6ZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJCSB1bnNpZ25lZCBudW1faXRlbXMpCit7CisJcmV0dXJuIChyb290LT5sZWFmc2l6ZSArIHJvb3QtPm5vZGVzaXplICogKEJUUkZTX01BWF9MRVZFTCAtIDEpKSAqCisJCW51bV9pdGVtczsKK30KKwogdm9pZCBidHJmc19wdXRfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSk7CiBpbnQgYnRyZnNfcnVuX2RlbGF5ZWRfcmVmcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1bnNpZ25lZCBsb25nIGNvdW50KTsKQEAgLTIxNDYsNiArMjI1OCw5IEBACiAJCQkgICAgIHU2NCBudW1fYnl0ZXMsIHU2NCAqcmVmcywgdTY0ICpmbGFncyk7CiBpbnQgYnRyZnNfcGluX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJICAgICB1NjQgYnl0ZW5yLCB1NjQgbnVtLCBpbnQgcmVzZXJ2ZWQpOworaW50IGJ0cmZzX3Bpbl9leHRlbnRfZm9yX2xvZ19yZXBsYXkoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzKTsKIGludCBidHJmc19jcm9zc19yZWZfZXhpc3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICB1NjQgb2JqZWN0aWQsIHU2NCBvZmZzZXQsIHU2NCBieXRlbnIpOwpAQCAtMjE5Niw4ICsyMzExLDggQEAKIAkJICAgICAgdTY0IHJvb3Rfb2JqZWN0aWQsIHU2NCBvd25lciwgdTY0IG9mZnNldCk7CiAKIGludCBidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHN0YXJ0LCB1NjQgbGVuKTsKLWludCBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwKLQkJCQl1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZSwgaW50IHNpbmZvKTsKK2ludCBidHJmc19mcmVlX2FuZF9waW5fcmVzZXJ2ZWRfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4pOwogaW50IGJ0cmZzX3ByZXBhcmVfZXh0ZW50X2NvbW1pdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CiBpbnQgYnRyZnNfZmluaXNoX2V4dGVudF9jb21taXQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCkBAIC0yMjQwLDI1ICsyMzU1LDIzIEBACiBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpidHJmc19hbGxvY19ibG9ja19yc3Yoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwogdm9pZCBidHJmc19mcmVlX2Jsb2NrX3JzdihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2KTsKLXZvaWQgYnRyZnNfYWRkX2R1cmFibGVfYmxvY2tfcnN2KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAotCQkJCSBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpyc3YpOwotaW50IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKK2ludCBidHJmc19ibG9ja19yc3ZfYWRkKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LAogCQkJdTY0IG51bV9ieXRlcyk7Ci1pbnQgYnRyZnNfYmxvY2tfcnN2X2NoZWNrKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKK2ludCBidHJmc19ibG9ja19yc3ZfYWRkX25vZmx1c2goc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LAorCQkJCXU2NCBudW1fYnl0ZXMpOworaW50IGJ0cmZzX2Jsb2NrX3Jzdl9jaGVjayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LCBpbnQgbWluX2ZhY3Rvcik7CitpbnQgYnRyZnNfYmxvY2tfcnN2X3JlZmlsbChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LAotCQkJICB1NjQgbWluX3Jlc2VydmVkLCBpbnQgbWluX2ZhY3Rvcik7CisJCQkgIHU2NCBtaW5fcmVzZXJ2ZWQpOwogaW50IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKHN0cnVjdCBidHJmc19ibG9ja19yc3YgKnNyY19yc3YsCiAJCQkgICAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqZHN0X3JzdiwKIAkJCSAgICB1NjQgbnVtX2J5dGVzKTsKIHZvaWQgYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkgICAgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiwKIAkJCSAgICAgdTY0IG51bV9ieXRlcyk7Ci1pbnQgYnRyZnNfdHJ1bmNhdGVfcmVzZXJ2ZV9tZXRhZGF0YShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJICAgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdik7CiBpbnQgYnRyZnNfc2V0X2Jsb2NrX2dyb3VwX3JvKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlKTsKIGludCBidHJmc19zZXRfYmxvY2tfZ3JvdXBfcncoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCkBAIC0yMzc5LDYgKzI0OTIsMTggQEAKIAlzbXBfbWIoKTsKIAlyZXR1cm4gZnNfaW5mby0+Y2xvc2luZzsKIH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2ZzX2luZm8oc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJa2ZyZWUoZnNfaW5mby0+ZGVsYXllZF9yb290KTsKKwlrZnJlZShmc19pbmZvLT5leHRlbnRfcm9vdCk7CisJa2ZyZWUoZnNfaW5mby0+dHJlZV9yb290KTsKKwlrZnJlZShmc19pbmZvLT5jaHVua19yb290KTsKKwlrZnJlZShmc19pbmZvLT5kZXZfcm9vdCk7CisJa2ZyZWUoZnNfaW5mby0+Y3N1bV9yb290KTsKKwlrZnJlZShmc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlrZnJlZShmc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0KTsKKwlrZnJlZShmc19pbmZvKTsKK30KIAogLyogcm9vdC1pdGVtLmMgKi8KIGludCBidHJmc19maW5kX3Jvb3RfcmVmKHN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QsCkBAIC0yNTc5LDExICsyNzA0LDYgQEAKIGludCBidHJmc19vcnBoYW5fYWRkKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBidHJmc19vcnBoYW5fZGVsKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBidHJmc19vcnBoYW5fY2xlYW51cChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7Ci12b2lkIGJ0cmZzX29ycGhhbl9wcmVfc25hcHNob3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJc3RydWN0IGJ0cmZzX3BlbmRpbmdfc25hcHNob3QgKnBlbmRpbmcsCi0JCQkJdTY0ICpieXRlc190b19yZXNlcnZlKTsKLXZvaWQgYnRyZnNfb3JwaGFuX3Bvc3Rfc25hcHNob3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJc3RydWN0IGJ0cmZzX3BlbmRpbmdfc25hcHNob3QgKnBlbmRpbmcpOwogdm9pZCBidHJmc19vcnBoYW5fY29tbWl0X3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CiBpbnQgYnRyZnNfY29udF9leHBhbmQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9sZHNpemUsIGxvZmZfdCBzaXplKTsKQEAgLTI2OTcsNCArMjgxNywyMCBAQAogaW50IGJ0cmZzX3NjcnViX3Byb2dyZXNzKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgZGV2aWQsCiAJCQkgc3RydWN0IGJ0cmZzX3NjcnViX3Byb2dyZXNzICpwcm9ncmVzcyk7CiAKKy8qIHJlYWRhLmMgKi8KK3N0cnVjdCByZWFkYV9jb250cm9sIHsKKwlzdHJ1Y3QgYnRyZnNfcm9vdAkqcm9vdDsJCS8qIHRyZWUgdG8gcHJlZmV0Y2ggKi8KKwlzdHJ1Y3QgYnRyZnNfa2V5CWtleV9zdGFydDsKKwlzdHJ1Y3QgYnRyZnNfa2V5CWtleV9lbmQ7CS8qIGV4Y2x1c2l2ZSAqLworCWF0b21pY190CQllbGVtczsKKwlzdHJ1Y3Qga3JlZgkJcmVmY250OworCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7Cit9Oworc3RydWN0IHJlYWRhX2NvbnRyb2wgKmJ0cmZzX3JlYWRhX2FkZChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKnN0YXJ0LCBzdHJ1Y3QgYnRyZnNfa2V5ICplbmQpOworaW50IGJ0cmZzX3JlYWRhX3dhaXQodm9pZCAqaGFuZGxlKTsKK3ZvaWQgYnRyZnNfcmVhZGFfZGV0YWNoKHZvaWQgKmhhbmRsZSk7CitpbnQgYnRyZWVfcmVhZGFoZWFkX2hvb2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCSB1NjQgc3RhcnQsIGludCBlcnIpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYyBiL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYwppbmRleCBiNTJjNjcyLi41YjE2MzU3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9kZWxheWVkLWlub2RlLmMKKysrIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jCkBAIC01OTEsNyArNTkxLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlzcmNfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQlkc3RfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJZHN0X3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAogCW51bV9ieXRlcyA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCAxKTsKIAlyZXQgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZShzcmNfcnN2LCBkc3RfcnN2LCBudW1fYnl0ZXMpOwpAQCAtNjA5LDcgKzYwOSw3IEBACiAJaWYgKCFpdGVtLT5ieXRlc19yZXNlcnZlZCkKIAkJcmV0dXJuOwogCi0JcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGF5ZWRfYmxvY2tfcnN2OwogCWJ0cmZzX2Jsb2NrX3Jzdl9yZWxlYXNlKHJvb3QsIHJzdiwKIAkJCQlpdGVtLT5ieXRlc19yZXNlcnZlZCk7CiB9CkBAIC02MTcsMjQgKzYxNywxMDIgQEAKIHN0YXRpYyBpbnQgYnRyZnNfZGVsYXllZF9pbm9kZV9yZXNlcnZlX21ldGFkYXRhKAogCQkJCQlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCXN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqc3JjX3JzdjsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpkc3RfcnN2OwogCXU2NCBudW1fYnl0ZXM7CiAJaW50IHJldDsKLQotCWlmICghdHJhbnMtPmJ5dGVzX3Jlc2VydmVkKQotCQlyZXR1cm4gMDsKKwlpbnQgcmVsZWFzZSA9IGZhbHNlOwogCiAJc3JjX3JzdiA9IHRyYW5zLT5ibG9ja19yc3Y7Ci0JZHN0X3JzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCWRzdF9yc3YgPSAmcm9vdC0+ZnNfaW5mby0+ZGVsYXllZF9ibG9ja19yc3Y7CiAKIAludW1fYnl0ZXMgPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgMSk7CisKKwkvKgorCSAqIGJ0cmZzX2RpcnR5X2lub2RlIHdpbGwgdXBkYXRlIHRoZSBpbm9kZSB1bmRlciBidHJmc19qb2luX3RyYW5zYWN0aW9uCisJICogd2hpY2ggZG9lc24ndCByZXNlcnZlIHNwYWNlIGZvciBzcGVlZC4gIFRoaXMgaXMgYSBwcm9ibGVtIHNpbmNlIHdlCisJICogc3RpbGwgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciB0aGlzIHVwZGF0ZSwgc28gdHJ5IHRvIHJlc2VydmUgdGhlCisJICogc3BhY2UuCisJICoKKwkgKiBOb3cgaWYgc3JjX3JzdiA9PSBkZWxhbGxvY19ibG9ja19yc3Ygd2UnbGwgbGV0IGl0IGp1c3Qgc3RlYWwgc2luY2UKKwkgKiB3ZSdyZSBhY2NvdW50ZWQgZm9yLgorCSAqLworCWlmICghdHJhbnMtPmJ5dGVzX3Jlc2VydmVkICYmCisJICAgIHNyY19yc3YgIT0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdikgeworCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfYWRkX25vZmx1c2gocm9vdCwgZHN0X3JzdiwgbnVtX2J5dGVzKTsKKwkJLyoKKwkJICogU2luY2Ugd2UncmUgdW5kZXIgYSB0cmFuc2FjdGlvbiByZXNlcnZlX21ldGFkYXRhX2J5dGVzIGNvdWxkCisJCSAqIHRyeSB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIHdoaWNoIHdpbGwgbWFrZSBpdCByZXR1cm4KKwkJICogRUFHQUlOIHRvIG1ha2UgdXMgc3RvcCB0aGUgdHJhbnNhY3Rpb24gd2UgaGF2ZSwgc28gcmV0dXJuCisJCSAqIEVOT1NQQyBpbnN0ZWFkIHNvIHRoYXQgYnRyZnNfZGlydHlfaW5vZGUga25vd3Mgd2hhdCB0byBkby4KKwkJICovCisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCXJldCA9IC1FTk9TUEM7CisJCWlmICghcmV0KQorCQkJbm9kZS0+Ynl0ZXNfcmVzZXJ2ZWQgPSBudW1fYnl0ZXM7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChzcmNfcnN2ID09ICZyb290LT5mc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3YpIHsKKwkJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CisJCWlmIChCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfbWV0YV9yZXNlcnZlZCkgeworCQkJQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQgPSAwOworCQkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKKwkJCXJlbGVhc2UgPSB0cnVlOworCQkJZ290byBtaWdyYXRlOworCQl9CisJCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CisKKwkJLyogT2sgd2UgZGlkbid0IGhhdmUgc3BhY2UgcHJlLXJlc2VydmVkLiAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuCisJCSAqIHRvbyBvZnRlbiBidXQgaXQgY2FuIGhhcHBlbiBpZiB3ZSBkbyBkZWxhbGxvYyB0byBhbiBleGlzdGluZworCQkgKiBpbm9kZSB3aGljaCBnZXRzIGRpcnRpZWQgYmVjYXVzZSBvZiB0aGUgdGltZSB1cGRhdGUsIGFuZCB0aGVuCisJCSAqIGlzbid0IHRvdWNoZWQgYWdhaW4gdW50aWwgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMgYW5kCisJCSAqIHRoZW4gd2UgdHJ5IHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIEZpcnN0IHRyeSB0byBiZSBuaWNlIGFuZAorCQkgKiByZXNlcnZlIHNvbWV0aGluZyBzdHJpY3RseSBmb3IgdXMuICBJZiBub3QgYmUgYSBwYWluIGFuZCB0cnkKKwkJICogdG8gc3RlYWwgZnJvbSB0aGUgZGVsYWxsb2MgYmxvY2sgcnN2LgorCQkgKi8KKwkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZF9ub2ZsdXNoKHJvb3QsIGRzdF9yc3YsIG51bV9ieXRlcyk7CisJCWlmICghcmV0KQorCQkJZ290byBvdXQ7CisKKwkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X21pZ3JhdGUoc3JjX3JzdiwgZHN0X3JzdiwgbnVtX2J5dGVzKTsKKwkJaWYgKCFyZXQpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBPayB0aGlzIGlzIGEgcHJvYmxlbSwgbGV0J3MganVzdCBzdGVhbCBmcm9tIHRoZSBnbG9iYWwgcnN2CisJCSAqIHNpbmNlIHRoaXMgcmVhbGx5IHNob3VsZG4ndCBoYXBwZW4gdGhhdCBvZnRlbi4KKwkJICovCisJCVdBUk5fT04oMSk7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKCZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LAorCQkJCQkgICAgICBkc3RfcnN2LCBudW1fYnl0ZXMpOworCQlnb3RvIG91dDsKKwl9CisKK21pZ3JhdGU6CiAJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X21pZ3JhdGUoc3JjX3JzdiwgZHN0X3JzdiwgbnVtX2J5dGVzKTsKKworb3V0OgorCS8qCisJICogTWlncmF0ZSBvbmx5IHRha2VzIGEgcmVzZXJ2YXRpb24sIGl0IGRvZXNuJ3QgdG91Y2ggdGhlIHNpemUgb2YgdGhlCisJICogYmxvY2tfcnN2LiAgVGhpcyBpcyB0byBzaW1wbGlmeSBwZW9wbGUgd2hvIGRvbid0IG5vcm1hbGx5IGhhdmUgdGhpbmdzCisJICogbWlncmF0ZWQgZnJvbSB0aGVpciBibG9jayByc3YuICBJZiB0aGV5IGdvIHRvIHJlbGVhc2UgdGhlaXIKKwkgKiByZXNlcnZhdGlvbiwgdGhhdCB3aWxsIGRlY3JlYXNlIHRoZSBzaXplIGFzIHdlbGwsIHNvIGlmIG1pZ3JhdGUKKwkgKiByZWR1Y2VkIHNpemUgd2UnZCBlbmQgdXAgd2l0aCBhIG5lZ2F0aXZlIHNpemUuICBCdXQgZm9yIHRoZQorCSAqIGRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQgc3R1ZmYgd2Ugd2lsbCBvbmx5IGtub3cgdG8gZHJvcCAxIHJlc2VydmF0aW9uLAorCSAqIGJ1dCB3ZSBjb3VsZCBpbiBmYWN0IGRvIHRoaXMgcmVzZXJ2ZS9taWdyYXRlIGRhbmNlIHNldmVyYWwgdGltZXMKKwkgKiBiZXR3ZWVuIHRoZSB0aW1lIHdlIGRpZCB0aGUgb3JpZ2luYWwgcmVzZXJ2YXRpb24gYW5kIHdlJ2QgY2xlYW4gaXQKKwkgKiB1cC4gIFNvIHRvIHRha2UgY2FyZSBvZiB0aGlzLCByZWxlYXNlIHRoZSBzcGFjZSBmb3IgdGhlIG1ldGEKKwkgKiByZXNlcnZhdGlvbiBoZXJlLiAgSSB0aGluayBpdCBtYXkgYmUgdGltZSBmb3IgYSBkb2N1bWVudGF0aW9uIHBhZ2Ugb24KKwkgKiBob3cgYmxvY2sgcnN2cy4gd29yay4KKwkgKi8KIAlpZiAoIXJldCkKIAkJbm9kZS0+Ynl0ZXNfcmVzZXJ2ZWQgPSBudW1fYnl0ZXM7CiAKKwlpZiAocmVsZWFzZSkKKwkJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgc3JjX3JzdiwgbnVtX2J5dGVzKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY0Niw3ICs3MjQsNyBAQAogCWlmICghbm9kZS0+Ynl0ZXNfcmVzZXJ2ZWQpCiAJCXJldHVybjsKIAotCXJzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCXJzdiA9ICZyb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCByc3YsCiAJCQkJbm9kZS0+Ynl0ZXNfcmVzZXJ2ZWQpOwogCW5vZGUtPmJ5dGVzX3Jlc2VydmVkID0gMDsKQEAgLTEwMjYsNyArMTEwNCw3IEBACiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCiAJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAogCWRlbGF5ZWRfcm9vdCA9IGJ0cmZzX2dldF9kZWxheWVkX3Jvb3Qocm9vdCk7CiAKQEAgLTEwNjksNyArMTE0Nyw3IEBACiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCiAJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQl0cmFucy0+YmxvY2tfcnN2ID0gJm5vZGUtPnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZub2RlLT5yb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAogCXJldCA9IGJ0cmZzX2luc2VydF9kZWxheWVkX2l0ZW1zKHRyYW5zLCBwYXRoLCBub2RlLT5yb290LCBub2RlKTsKIAlpZiAoIXJldCkKQEAgLTExNDksNyArMTIyNyw3IEBACiAJCWdvdG8gZnJlZV9wYXRoOwogCiAJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAogCXJldCA9IGJ0cmZzX2luc2VydF9kZWxheWVkX2l0ZW1zKHRyYW5zLCBwYXRoLCByb290LCBkZWxheWVkX25vZGUpOwogCWlmICghcmV0KQpAQCAtMTY0MSw3ICsxNzE5LDcgQEAKIAlpbm9kZS0+aV9naWQgPSBidHJmc19zdGFja19pbm9kZV9naWQoaW5vZGVfaXRlbSk7CiAJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCBidHJmc19zdGFja19pbm9kZV9zaXplKGlub2RlX2l0ZW0pKTsKIAlpbm9kZS0+aV9tb2RlID0gYnRyZnNfc3RhY2tfaW5vZGVfbW9kZShpbm9kZV9pdGVtKTsKLQlpbm9kZS0+aV9ubGluayA9IGJ0cmZzX3N0YWNrX2lub2RlX25saW5rKGlub2RlX2l0ZW0pOworCXNldF9ubGluayhpbm9kZSwgYnRyZnNfc3RhY2tfaW5vZGVfbmxpbmsoaW5vZGVfaXRlbSkpOwogCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgYnRyZnNfc3RhY2tfaW5vZGVfbmJ5dGVzKGlub2RlX2l0ZW0pKTsKIAlCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiA9IGJ0cmZzX3N0YWNrX2lub2RlX2dlbmVyYXRpb24oaW5vZGVfaXRlbSk7CiAJQlRSRlNfSShpbm9kZSktPnNlcXVlbmNlID0gYnRyZnNfc3RhY2tfaW5vZGVfc2VxdWVuY2UoaW5vZGVfaXRlbSk7CkBAIC0xNjg1LDEyICsxNzYzLDEwIEBACiAJCWdvdG8gcmVsZWFzZV9ub2RlOwogCX0KIAotCXJldCA9IGJ0cmZzX2RlbGF5ZWRfaW5vZGVfcmVzZXJ2ZV9tZXRhZGF0YSh0cmFucywgcm9vdCwgZGVsYXllZF9ub2RlKTsKLQkvKgotCSAqIHdlIG11c3QgcmVzZXJ2ZSBlbm91Z2ggc3BhY2Ugd2hlbiB3ZSBzdGFydCBhIG5ldyB0cmFuc2FjdGlvbiwKLQkgKiBzbyByZXNlcnZpbmcgbWV0YWRhdGEgZmFpbHVyZSBpcyBpbXBvc3NpYmxlCi0JICovCi0JQlVHX09OKHJldCk7CisJcmV0ID0gYnRyZnNfZGVsYXllZF9pbm9kZV9yZXNlcnZlX21ldGFkYXRhKHRyYW5zLCByb290LCBpbm9kZSwKKwkJCQkJCSAgIGRlbGF5ZWRfbm9kZSk7CisJaWYgKHJldCkKKwkJZ290byByZWxlYXNlX25vZGU7CiAKIAlmaWxsX3N0YWNrX2lub2RlX2l0ZW0odHJhbnMsICZkZWxheWVkX25vZGUtPmlub2RlX2l0ZW0sIGlub2RlKTsKIAlkZWxheWVkX25vZGUtPmlub2RlX2RpcnR5ID0gMTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpc2staW8uYyBiL2ZzL2J0cmZzL2Rpc2staW8uYwppbmRleCAwN2IzYWM2Li42MmFmZTVjIDEwMDY0NAotLS0gYS9mcy9idHJmcy9kaXNrLWlvLmMKKysrIGIvZnMvYnRyZnMvZGlzay1pby5jCkBAIC0yNTYsOCArMjU2LDcgQEAKIHN0YXRpYyBpbnQgY3N1bV90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmLAogCQkJICAgaW50IHZlcmlmeSkKIHsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWNoYXIgKnJlc3VsdCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBsZW47CiAJdW5zaWduZWQgbG9uZyBjdXJfbGVuOwpAQCAtMzY3LDcgKzM2Niw4IEBACiAJY2xlYXJfYml0KEVYVEVOVF9CVUZGRVJfQ09SUlVQVCwgJmViLT5iZmxhZ3MpOwogCWlvX3RyZWUgPSAmQlRSRlNfSShyb290LT5mc19pbmZvLT5idHJlZV9pbm9kZSktPmlvX3RyZWU7CiAJd2hpbGUgKDEpIHsKLQkJcmV0ID0gcmVhZF9leHRlbnRfYnVmZmVyX3BhZ2VzKGlvX3RyZWUsIGViLCBzdGFydCwgMSwKKwkJcmV0ID0gcmVhZF9leHRlbnRfYnVmZmVyX3BhZ2VzKGlvX3RyZWUsIGViLCBzdGFydCwKKwkJCQkJICAgICAgIFdBSVRfQ09NUExFVEUsCiAJCQkJCSAgICAgICBidHJlZV9nZXRfZXh0ZW50LCBtaXJyb3JfbnVtKTsKIAkJaWYgKCFyZXQgJiYKIAkJICAgICF2ZXJpZnlfcGFyZW50X3RyYW5zaWQoaW9fdHJlZSwgZWIsIHBhcmVudF90cmFuc2lkKSkKQEAgLTYwOCwxMSArNjA4LDQ4IEBACiAJZW5kID0gbWluX3QodTY0LCBlYi0+bGVuLCBQQUdFX0NBQ0hFX1NJWkUpOwogCWVuZCA9IGViLT5zdGFydCArIGVuZCAtIDE7CiBlcnI6CisJaWYgKHRlc3RfYml0KEVYVEVOVF9CVUZGRVJfUkVBREFIRUFELCAmZWItPmJmbGFncykpIHsKKwkJY2xlYXJfYml0KEVYVEVOVF9CVUZGRVJfUkVBREFIRUFELCAmZWItPmJmbGFncyk7CisJCWJ0cmVlX3JlYWRhaGVhZF9ob29rKHJvb3QsIGViLCBlYi0+c3RhcnQsIHJldCk7CisJfQorCiAJZnJlZV9leHRlbnRfYnVmZmVyKGViKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGJ0cmVlX2lvX2ZhaWxlZF9ob29rKHN0cnVjdCBiaW8gKmZhaWxlZF9iaW8sCisJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCSB1NjQgbWlycm9yX251bSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPnJvb3Q7CisKKwl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisJaWYgKHBhZ2UtPnByaXZhdGUgPT0gRVhURU5UX1BBR0VfUFJJVkFURSkKKwkJZ290byBvdXQ7CisJaWYgKCFwYWdlLT5wcml2YXRlKQorCQlnb3RvIG91dDsKKworCWxlbiA9IHBhZ2UtPnByaXZhdGUgPj4gMjsKKwlXQVJOX09OKGxlbiA9PSAwKTsKKworCWViID0gYWxsb2NfZXh0ZW50X2J1ZmZlcih0cmVlLCBzdGFydCwgbGVuLCBwYWdlKTsKKwlpZiAoZWIgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAodGVzdF9iaXQoRVhURU5UX0JVRkZFUl9SRUFEQUhFQUQsICZlYi0+YmZsYWdzKSkgeworCQljbGVhcl9iaXQoRVhURU5UX0JVRkZFUl9SRUFEQUhFQUQsICZlYi0+YmZsYWdzKTsKKwkJYnRyZWVfcmVhZGFoZWFkX2hvb2socm9vdCwgZWIsIGViLT5zdGFydCwgLUVJTyk7CisJfQorCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisKK291dDoKKwlyZXR1cm4gLUVJTzsJLyogd2UgZml4ZWQgbm90aGluZyAqLworfQorCiBzdGF0aWMgdm9pZCBlbmRfd29ya3F1ZXVlX2JpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7CiAJc3RydWN0IGVuZF9pb193cSAqZW5kX2lvX3dxID0gYmlvLT5iaV9wcml2YXRlOwpAQCAtOTA4LDcgKzk0NSw3IEBACiB7CiAJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOwogCXRyZWUgPSAmQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+aW9fdHJlZTsKLQlyZXR1cm4gZXh0ZW50X3JlYWRfZnVsbF9wYWdlKHRyZWUsIHBhZ2UsIGJ0cmVlX2dldF9leHRlbnQpOworCXJldHVybiBleHRlbnRfcmVhZF9mdWxsX3BhZ2UodHJlZSwgcGFnZSwgYnRyZWVfZ2V0X2V4dGVudCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgYnRyZWVfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IGdmcF9mbGFncykKQEAgLTk3NCwxMSArMTAxMSw0MyBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gMDsKIAlyZWFkX2V4dGVudF9idWZmZXJfcGFnZXMoJkJUUkZTX0koYnRyZWVfaW5vZGUpLT5pb190cmVlLAotCQkJCSBidWYsIDAsIDAsIGJ0cmVlX2dldF9leHRlbnQsIDApOworCQkJCSBidWYsIDAsIFdBSVRfTk9ORSwgYnRyZWVfZ2V0X2V4dGVudCwgMCk7CiAJZnJlZV9leHRlbnRfYnVmZmVyKGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHJlYWRhX3RyZWVfYmxvY2tfZmxhZ2dlZChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwgdTMyIGJsb2Nrc2l6ZSwKKwkJCSBpbnQgbWlycm9yX251bSwgc3RydWN0IGV4dGVudF9idWZmZXIgKiplYikKK3sKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmJ0cmVlX2lub2RlID0gcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGU7CisJc3RydWN0IGV4dGVudF9pb190cmVlICppb190cmVlID0gJkJUUkZTX0koYnRyZWVfaW5vZGUpLT5pb190cmVlOworCWludCByZXQ7CisKKwlidWYgPSBidHJmc19maW5kX2NyZWF0ZV90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgYmxvY2tzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CisKKwlzZXRfYml0KEVYVEVOVF9CVUZGRVJfUkVBREFIRUFELCAmYnVmLT5iZmxhZ3MpOworCisJcmV0ID0gcmVhZF9leHRlbnRfYnVmZmVyX3BhZ2VzKGlvX3RyZWUsIGJ1ZiwgMCwgV0FJVF9QQUdFX0xPQ0ssCisJCQkJICAgICAgIGJ0cmVlX2dldF9leHRlbnQsIG1pcnJvcl9udW0pOworCWlmIChyZXQpIHsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKGJ1Zik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHRlc3RfYml0KEVYVEVOVF9CVUZGRVJfQ09SUlVQVCwgJmJ1Zi0+YmZsYWdzKSkgeworCQlmcmVlX2V4dGVudF9idWZmZXIoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfSBlbHNlIGlmIChleHRlbnRfYnVmZmVyX3VwdG9kYXRlKGlvX3RyZWUsIGJ1ZiwgTlVMTCkpIHsKKwkJKmViID0gYnVmOworCX0gZWxzZSB7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihidWYpOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IGV4dGVudF9idWZmZXIgKmJ0cmZzX2ZpbmRfdHJlZV9ibG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJICAgIHU2NCBieXRlbnIsIHUzMiBibG9ja3NpemUpCiB7CkBAIC0xMTM1LDEwICsxMjA0LDEyIEBACiAKIAlnZW5lcmF0aW9uID0gYnRyZnNfcm9vdF9nZW5lcmF0aW9uKCZyb290LT5yb290X2l0ZW0pOwogCWJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgYnRyZnNfcm9vdF9sZXZlbCgmcm9vdC0+cm9vdF9pdGVtKSk7CisJcm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOwogCXJvb3QtPm5vZGUgPSByZWFkX3RyZWVfYmxvY2socm9vdCwgYnRyZnNfcm9vdF9ieXRlbnIoJnJvb3QtPnJvb3RfaXRlbSksCiAJCQkJICAgICBibG9ja3NpemUsIGdlbmVyYXRpb24pOwogCWlmICghcm9vdC0+bm9kZSB8fCAhYnRyZnNfYnVmZmVyX3VwdG9kYXRlKHJvb3QtPm5vZGUsIGdlbmVyYXRpb24pKSB7CiAJCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5ub2RlKTsKKwkJcm9vdC0+bm9kZSA9IE5VTEw7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyb290LT5jb21taXRfcm9vdCA9IGJ0cmZzX3Jvb3Rfbm9kZShyb290KTsKQEAgLTE1NzcsNiArMTY0OCwyMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIHRoaXMgd2lsbCBmaW5kIHRoZSBoaWdoZXN0IGdlbmVyYXRpb24gaW4gdGhlIGFycmF5IG9mCisgKiByb290IGJhY2t1cHMuICBUaGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgYXJyYXkgaXMgcmV0dXJuZWQsCisgKiBvciAtMSBpZiB3ZSBjYW4ndCBmaW5kIGFueXRoaW5nLgorICoKKyAqIFdlIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgYXJyYXkgaXMgdmFsaWQgYnkgY29tcGFyaW5nIHRoZQorICogZ2VuZXJhdGlvbiBvZiB0aGUgbGF0ZXN0ICByb290IGluIHRoZSBhcnJheSB3aXRoIHRoZSBnZW5lcmF0aW9uCisgKiBpbiB0aGUgc3VwZXIgYmxvY2suICBJZiB0aGV5IGRvbid0IG1hdGNoIHdlIHBpdGNoIGl0LgorICovCitzdGF0aWMgaW50IGZpbmRfbmV3ZXN0X3N1cGVyX2JhY2t1cChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywgdTY0IG5ld2VzdF9nZW4pCit7CisJdTY0IGN1cjsKKwlpbnQgbmV3ZXN0X2luZGV4ID0gLTE7CisJc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwICpyb290X2JhY2t1cDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCVFJGU19OVU1fQkFDS1VQX1JPT1RTOyBpKyspIHsKKwkJcm9vdF9iYWNrdXAgPSBpbmZvLT5zdXBlcl9jb3B5LT5zdXBlcl9yb290cyArIGk7CisJCWN1ciA9IGJ0cmZzX2JhY2t1cF90cmVlX3Jvb3RfZ2VuKHJvb3RfYmFja3VwKTsKKwkJaWYgKGN1ciA9PSBuZXdlc3RfZ2VuKQorCQkJbmV3ZXN0X2luZGV4ID0gaTsKKwl9CisKKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgYWN0dWFsbHkgd3JhcHBlZCBhcm91bmQgKi8KKwlpZiAobmV3ZXN0X2luZGV4ID09IEJUUkZTX05VTV9CQUNLVVBfUk9PVFMgLSAxKSB7CisJCXJvb3RfYmFja3VwID0gaW5mby0+c3VwZXJfY29weS0+c3VwZXJfcm9vdHM7CisJCWN1ciA9IGJ0cmZzX2JhY2t1cF90cmVlX3Jvb3RfZ2VuKHJvb3RfYmFja3VwKTsKKwkJaWYgKGN1ciA9PSBuZXdlc3RfZ2VuKQorCQkJbmV3ZXN0X2luZGV4ID0gMDsKKwl9CisJcmV0dXJuIG5ld2VzdF9pbmRleDsKK30KKworCisvKgorICogZmluZCB0aGUgb2xkZXN0IGJhY2t1cCBzbyB3ZSBrbm93IHdoZXJlIHRvIHN0b3JlIG5ldyBlbnRyaWVzCisgKiBpbiB0aGUgYmFja3VwIGFycmF5LiAgVGhpcyB3aWxsIHNldCB0aGUgYmFja3VwX3Jvb3RfaW5kZXgKKyAqIGZpZWxkIGluIHRoZSBmc19pbmZvIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBmaW5kX29sZGVzdF9zdXBlcl9iYWNrdXAoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sCisJCQkJICAgICB1NjQgbmV3ZXN0X2dlbikKK3sKKwlpbnQgbmV3ZXN0X2luZGV4ID0gLTE7CisKKwluZXdlc3RfaW5kZXggPSBmaW5kX25ld2VzdF9zdXBlcl9iYWNrdXAoaW5mbywgbmV3ZXN0X2dlbik7CisJLyogaWYgdGhlcmUgd2FzIGdhcmJhZ2UgaW4gdGhlcmUsIGp1c3QgbW92ZSBhbG9uZyAqLworCWlmIChuZXdlc3RfaW5kZXggPT0gLTEpIHsKKwkJaW5mby0+YmFja3VwX3Jvb3RfaW5kZXggPSAwOworCX0gZWxzZSB7CisJCWluZm8tPmJhY2t1cF9yb290X2luZGV4ID0gKG5ld2VzdF9pbmRleCArIDEpICUgQlRSRlNfTlVNX0JBQ0tVUF9ST09UUzsKKwl9Cit9CisKKy8qCisgKiBjb3B5IGFsbCB0aGUgcm9vdCBwb2ludGVycyBpbnRvIHRoZSBzdXBlciBiYWNrdXAgYXJyYXkuCisgKiB0aGlzIHdpbGwgYnVtcCB0aGUgYmFja3VwIHBvaW50ZXIgYnkgb25lIHdoZW4gaXQgaXMKKyAqIGRvbmUKKyAqLworc3RhdGljIHZvaWQgYmFja3VwX3N1cGVyX3Jvb3RzKHN0cnVjdCBidHJmc19mc19pbmZvICppbmZvKQoreworCWludCBuZXh0X2JhY2t1cDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAgKnJvb3RfYmFja3VwOworCWludCBsYXN0X2JhY2t1cDsKKworCW5leHRfYmFja3VwID0gaW5mby0+YmFja3VwX3Jvb3RfaW5kZXg7CisJbGFzdF9iYWNrdXAgPSAobmV4dF9iYWNrdXAgKyBCVFJGU19OVU1fQkFDS1VQX1JPT1RTIC0gMSkgJQorCQlCVFJGU19OVU1fQkFDS1VQX1JPT1RTOworCisJLyoKKwkgKiBqdXN0IG92ZXJ3cml0ZSB0aGUgbGFzdCBiYWNrdXAgaWYgd2UncmUgYXQgdGhlIHNhbWUgZ2VuZXJhdGlvbgorCSAqIHRoaXMgaGFwcGVucyBvbmx5IGF0IHVtb3VudAorCSAqLworCXJvb3RfYmFja3VwID0gaW5mby0+c3VwZXJfZm9yX2NvbW1pdC0+c3VwZXJfcm9vdHMgKyBsYXN0X2JhY2t1cDsKKwlpZiAoYnRyZnNfYmFja3VwX3RyZWVfcm9vdF9nZW4ocm9vdF9iYWNrdXApID09CisJICAgIGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGluZm8tPnRyZWVfcm9vdC0+bm9kZSkpCisJCW5leHRfYmFja3VwID0gbGFzdF9iYWNrdXA7CisKKwlyb290X2JhY2t1cCA9IGluZm8tPnN1cGVyX2Zvcl9jb21taXQtPnN1cGVyX3Jvb3RzICsgbmV4dF9iYWNrdXA7CisKKwkvKgorCSAqIG1ha2Ugc3VyZSBhbGwgb2Ygb3VyIHBhZGRpbmcgYW5kIGVtcHR5IHNsb3RzIGdldCB6ZXJvIGZpbGxlZAorCSAqIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lcyB3ZSB1c2UgdG9kYXkKKwkgKi8KKwltZW1zZXQocm9vdF9iYWNrdXAsIDAsIHNpemVvZigqcm9vdF9iYWNrdXApKTsKKworCWluZm8tPmJhY2t1cF9yb290X2luZGV4ID0gKG5leHRfYmFja3VwICsgMSkgJSBCVFJGU19OVU1fQkFDS1VQX1JPT1RTOworCisJYnRyZnNfc2V0X2JhY2t1cF90cmVlX3Jvb3Qocm9vdF9iYWNrdXAsIGluZm8tPnRyZWVfcm9vdC0+bm9kZS0+c3RhcnQpOworCWJ0cmZzX3NldF9iYWNrdXBfdHJlZV9yb290X2dlbihyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihpbmZvLT50cmVlX3Jvb3QtPm5vZGUpKTsKKworCWJ0cmZzX3NldF9iYWNrdXBfdHJlZV9yb290X2xldmVsKHJvb3RfYmFja3VwLAorCQkJICAgICAgIGJ0cmZzX2hlYWRlcl9sZXZlbChpbmZvLT50cmVlX3Jvb3QtPm5vZGUpKTsKKworCWJ0cmZzX3NldF9iYWNrdXBfY2h1bmtfcm9vdChyb290X2JhY2t1cCwgaW5mby0+Y2h1bmtfcm9vdC0+bm9kZS0+c3RhcnQpOworCWJ0cmZzX3NldF9iYWNrdXBfY2h1bmtfcm9vdF9nZW4ocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oaW5mby0+Y2h1bmtfcm9vdC0+bm9kZSkpOworCWJ0cmZzX3NldF9iYWNrdXBfY2h1bmtfcm9vdF9sZXZlbChyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfbGV2ZWwoaW5mby0+Y2h1bmtfcm9vdC0+bm9kZSkpOworCisJYnRyZnNfc2V0X2JhY2t1cF9leHRlbnRfcm9vdChyb290X2JhY2t1cCwgaW5mby0+ZXh0ZW50X3Jvb3QtPm5vZGUtPnN0YXJ0KTsKKwlidHJmc19zZXRfYmFja3VwX2V4dGVudF9yb290X2dlbihyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihpbmZvLT5leHRlbnRfcm9vdC0+bm9kZSkpOworCWJ0cmZzX3NldF9iYWNrdXBfZXh0ZW50X3Jvb3RfbGV2ZWwocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2xldmVsKGluZm8tPmV4dGVudF9yb290LT5ub2RlKSk7CisKKwkvKgorCSAqIHdlIG1pZ2h0IGNvbW1pdCBkdXJpbmcgbG9nIHJlY292ZXJ5LCB3aGljaCBoYXBwZW5zIGJlZm9yZSB3ZSBzZXQKKwkgKiB0aGUgZnNfcm9vdC4gIE1ha2Ugc3VyZSBpdCBpcyB2YWxpZCBiZWZvcmUgd2UgZmlsbCBpdCBpbi4KKwkgKi8KKwlpZiAoaW5mby0+ZnNfcm9vdCAmJiBpbmZvLT5mc19yb290LT5ub2RlKSB7CisJCWJ0cmZzX3NldF9iYWNrdXBfZnNfcm9vdChyb290X2JhY2t1cCwKKwkJCQkJIGluZm8tPmZzX3Jvb3QtPm5vZGUtPnN0YXJ0KTsKKwkJYnRyZnNfc2V0X2JhY2t1cF9mc19yb290X2dlbihyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihpbmZvLT5mc19yb290LT5ub2RlKSk7CisJCWJ0cmZzX3NldF9iYWNrdXBfZnNfcm9vdF9sZXZlbChyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfbGV2ZWwoaW5mby0+ZnNfcm9vdC0+bm9kZSkpOworCX0KKworCWJ0cmZzX3NldF9iYWNrdXBfZGV2X3Jvb3Qocm9vdF9iYWNrdXAsIGluZm8tPmRldl9yb290LT5ub2RlLT5zdGFydCk7CisJYnRyZnNfc2V0X2JhY2t1cF9kZXZfcm9vdF9nZW4ocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oaW5mby0+ZGV2X3Jvb3QtPm5vZGUpKTsKKwlidHJmc19zZXRfYmFja3VwX2Rldl9yb290X2xldmVsKHJvb3RfYmFja3VwLAorCQkJCSAgICAgICBidHJmc19oZWFkZXJfbGV2ZWwoaW5mby0+ZGV2X3Jvb3QtPm5vZGUpKTsKKworCWJ0cmZzX3NldF9iYWNrdXBfY3N1bV9yb290KHJvb3RfYmFja3VwLCBpbmZvLT5jc3VtX3Jvb3QtPm5vZGUtPnN0YXJ0KTsKKwlidHJmc19zZXRfYmFja3VwX2NzdW1fcm9vdF9nZW4ocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oaW5mby0+Y3N1bV9yb290LT5ub2RlKSk7CisJYnRyZnNfc2V0X2JhY2t1cF9jc3VtX3Jvb3RfbGV2ZWwocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2xldmVsKGluZm8tPmNzdW1fcm9vdC0+bm9kZSkpOworCisJYnRyZnNfc2V0X2JhY2t1cF90b3RhbF9ieXRlcyhyb290X2JhY2t1cCwKKwkJCSAgICAgYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoaW5mby0+c3VwZXJfY29weSkpOworCWJ0cmZzX3NldF9iYWNrdXBfYnl0ZXNfdXNlZChyb290X2JhY2t1cCwKKwkJCSAgICAgYnRyZnNfc3VwZXJfYnl0ZXNfdXNlZChpbmZvLT5zdXBlcl9jb3B5KSk7CisJYnRyZnNfc2V0X2JhY2t1cF9udW1fZGV2aWNlcyhyb290X2JhY2t1cCwKKwkJCSAgICAgYnRyZnNfc3VwZXJfbnVtX2RldmljZXMoaW5mby0+c3VwZXJfY29weSkpOworCisJLyoKKwkgKiBpZiB3ZSBkb24ndCBjb3B5IHRoaXMgb3V0IHRvIHRoZSBzdXBlcl9jb3B5LCBpdCB3b24ndCBnZXQgcmVtZW1iZXJlZAorCSAqIGZvciB0aGUgbmV4dCBjb21taXQKKwkgKi8KKwltZW1jcHkoJmluZm8tPnN1cGVyX2NvcHktPnN1cGVyX3Jvb3RzLAorCSAgICAgICAmaW5mby0+c3VwZXJfZm9yX2NvbW1pdC0+c3VwZXJfcm9vdHMsCisJICAgICAgIHNpemVvZigqcm9vdF9iYWNrdXApICogQlRSRlNfTlVNX0JBQ0tVUF9ST09UUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvcGllcyBpbmZvIG91dCBvZiB0aGUgcm9vdCBiYWNrdXAgYXJyYXkgYW5kIGJhY2sgaW50bworICogdGhlIGluLW1lbW9yeSBzdXBlciBibG9jay4gIEl0IGlzIG1lYW50IHRvIGhlbHAgaXRlcmF0ZSB0aHJvdWdoCisgKiB0aGUgYXJyYXksIHNvIHlvdSBzZW5kIGl0IHRoZSBudW1iZXIgb2YgYmFja3VwcyB5b3UndmUgYWxyZWFkeQorICogdHJpZWQgYW5kIHRoZSBsYXN0IGJhY2t1cCBpbmRleCB5b3UgdXNlZC4KKyAqCisgKiB0aGlzIHJldHVybnMgLTEgd2hlbiBpdCBoYXMgdHJpZWQgYWxsIHRoZSBiYWNrdXBzCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgbmV4dF9yb290X2JhY2t1cChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywKKwkJCQkgICAgIHN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXIsCisJCQkJICAgICBpbnQgKm51bV9iYWNrdXBzX3RyaWVkLCBpbnQgKmJhY2t1cF9pbmRleCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAgKnJvb3RfYmFja3VwOworCWludCBuZXdlc3QgPSAqYmFja3VwX2luZGV4OworCisJaWYgKCpudW1fYmFja3Vwc190cmllZCA9PSAwKSB7CisJCXU2NCBnZW4gPSBidHJmc19zdXBlcl9nZW5lcmF0aW9uKHN1cGVyKTsKKworCQluZXdlc3QgPSBmaW5kX25ld2VzdF9zdXBlcl9iYWNrdXAoaW5mbywgZ2VuKTsKKwkJaWYgKG5ld2VzdCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKworCQkqYmFja3VwX2luZGV4ID0gbmV3ZXN0OworCQkqbnVtX2JhY2t1cHNfdHJpZWQgPSAxOworCX0gZWxzZSBpZiAoKm51bV9iYWNrdXBzX3RyaWVkID09IEJUUkZTX05VTV9CQUNLVVBfUk9PVFMpIHsKKwkJLyogd2UndmUgdHJpZWQgYWxsIHRoZSBiYWNrdXBzLCBhbGwgZG9uZSAqLworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJLyoganVtcCB0byB0aGUgbmV4dCBvbGRlc3QgYmFja3VwICovCisJCW5ld2VzdCA9ICgqYmFja3VwX2luZGV4ICsgQlRSRlNfTlVNX0JBQ0tVUF9ST09UUyAtIDEpICUKKwkJCUJUUkZTX05VTV9CQUNLVVBfUk9PVFM7CisJCSpiYWNrdXBfaW5kZXggPSBuZXdlc3Q7CisJCSpudW1fYmFja3Vwc190cmllZCArPSAxOworCX0KKwlyb290X2JhY2t1cCA9IHN1cGVyLT5zdXBlcl9yb290cyArIG5ld2VzdDsKKworCWJ0cmZzX3NldF9zdXBlcl9nZW5lcmF0aW9uKHN1cGVyLAorCQkJCSAgIGJ0cmZzX2JhY2t1cF90cmVlX3Jvb3RfZ2VuKHJvb3RfYmFja3VwKSk7CisJYnRyZnNfc2V0X3N1cGVyX3Jvb3Qoc3VwZXIsIGJ0cmZzX2JhY2t1cF90cmVlX3Jvb3Qocm9vdF9iYWNrdXApKTsKKwlidHJmc19zZXRfc3VwZXJfcm9vdF9sZXZlbChzdXBlciwKKwkJCQkgICBidHJmc19iYWNrdXBfdHJlZV9yb290X2xldmVsKHJvb3RfYmFja3VwKSk7CisJYnRyZnNfc2V0X3N1cGVyX2J5dGVzX3VzZWQoc3VwZXIsIGJ0cmZzX2JhY2t1cF9ieXRlc191c2VkKHJvb3RfYmFja3VwKSk7CisKKwkvKgorCSAqIGZpeG1lOiB0aGUgdG90YWwgYnl0ZXMgYW5kIG51bV9kZXZpY2VzIG5lZWQgdG8gbWF0Y2ggb3Igd2Ugc2hvdWxkCisJICogbmVlZCBhIGZzY2sKKwkgKi8KKwlidHJmc19zZXRfc3VwZXJfdG90YWxfYnl0ZXMoc3VwZXIsIGJ0cmZzX2JhY2t1cF90b3RhbF9ieXRlcyhyb290X2JhY2t1cCkpOworCWJ0cmZzX3NldF9zdXBlcl9udW1fZGV2aWNlcyhzdXBlciwgYnRyZnNfYmFja3VwX251bV9kZXZpY2VzKHJvb3RfYmFja3VwKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGhlbHBlciB0byBjbGVhbnVwIHRyZWUgcm9vdHMgKi8KK3N0YXRpYyB2b2lkIGZyZWVfcm9vdF9wb2ludGVycyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywgaW50IGNodW5rX3Jvb3QpCit7CisJZnJlZV9leHRlbnRfYnVmZmVyKGluZm8tPnRyZWVfcm9vdC0+bm9kZSk7CisJZnJlZV9leHRlbnRfYnVmZmVyKGluZm8tPnRyZWVfcm9vdC0+Y29tbWl0X3Jvb3QpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihpbmZvLT5kZXZfcm9vdC0+bm9kZSk7CisJZnJlZV9leHRlbnRfYnVmZmVyKGluZm8tPmRldl9yb290LT5jb21taXRfcm9vdCk7CisJZnJlZV9leHRlbnRfYnVmZmVyKGluZm8tPmV4dGVudF9yb290LT5ub2RlKTsKKwlmcmVlX2V4dGVudF9idWZmZXIoaW5mby0+ZXh0ZW50X3Jvb3QtPmNvbW1pdF9yb290KTsKKwlmcmVlX2V4dGVudF9idWZmZXIoaW5mby0+Y3N1bV9yb290LT5ub2RlKTsKKwlmcmVlX2V4dGVudF9idWZmZXIoaW5mby0+Y3N1bV9yb290LT5jb21taXRfcm9vdCk7CisKKwlpbmZvLT50cmVlX3Jvb3QtPm5vZGUgPSBOVUxMOworCWluZm8tPnRyZWVfcm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOworCWluZm8tPmRldl9yb290LT5ub2RlID0gTlVMTDsKKwlpbmZvLT5kZXZfcm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOworCWluZm8tPmV4dGVudF9yb290LT5ub2RlID0gTlVMTDsKKwlpbmZvLT5leHRlbnRfcm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOworCWluZm8tPmNzdW1fcm9vdC0+bm9kZSA9IE5VTEw7CisJaW5mby0+Y3N1bV9yb290LT5jb21taXRfcm9vdCA9IE5VTEw7CisKKwlpZiAoY2h1bmtfcm9vdCkgeworCQlmcmVlX2V4dGVudF9idWZmZXIoaW5mby0+Y2h1bmtfcm9vdC0+bm9kZSk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihpbmZvLT5jaHVua19yb290LT5jb21taXRfcm9vdCk7CisJCWluZm8tPmNodW5rX3Jvb3QtPm5vZGUgPSBOVUxMOworCQlpbmZvLT5jaHVua19yb290LT5jb21taXRfcm9vdCA9IE5VTEw7CisJfQorfQorCisKIHN0cnVjdCBidHJmc19yb290ICpvcGVuX2N0cmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlcywKIAkJCSAgICAgIGNoYXIgKm9wdGlvbnMpCkBAIC0xNTkwLDI5ICsxODkwLDMyIEBACiAJdTY0IGZlYXR1cmVzOwogCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCi0JCQkJCQkgR0ZQX05PRlMpOwotCXN0cnVjdCBidHJmc19yb290ICpjc3VtX3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCi0JCQkJCQkgR0ZQX05PRlMpOworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqZGlza19zdXBlcjsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290ID0gYnRyZnNfc2Ioc2IpOwotCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqY2h1bmtfcm9vdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidHJmc19yb290KSwKLQkJCQkJCUdGUF9OT0ZTKTsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqZGV2X3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCi0JCQkJCSAgICAgIEdGUF9OT0ZTKTsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHRyZWVfcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmNzdW1fcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqY2h1bmtfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZGV2X3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZ190cmVlX3Jvb3Q7Ci0KIAlpbnQgcmV0OwogCWludCBlcnIgPSAtRUlOVkFMOworCWludCBudW1fYmFja3Vwc190cmllZCA9IDA7CisJaW50IGJhY2t1cF9pbmRleCA9IDA7CiAKLQlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXI7CisJZXh0ZW50X3Jvb3QgPSBmc19pbmZvLT5leHRlbnRfcm9vdCA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidHJmc19yb290KSwgR0ZQX05PRlMpOworCWNzdW1fcm9vdCA9IGZzX2luZm8tPmNzdW1fcm9vdCA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidHJmc19yb290KSwgR0ZQX05PRlMpOworCWNodW5rX3Jvb3QgPSBmc19pbmZvLT5jaHVua19yb290ID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX3Jvb3QpLCBHRlBfTk9GUyk7CisJZGV2X3Jvb3QgPSBmc19pbmZvLT5kZXZfcm9vdCA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidHJmc19yb290KSwgR0ZQX05PRlMpOwogCi0JaWYgKCFleHRlbnRfcm9vdCB8fCAhdHJlZV9yb290IHx8ICF0cmVlX3Jvb3QtPmZzX2luZm8gfHwKLQkgICAgIWNodW5rX3Jvb3QgfHwgIWRldl9yb290IHx8ICFjc3VtX3Jvb3QpIHsKKwlpZiAoIWV4dGVudF9yb290IHx8ICFjc3VtX3Jvb3QgfHwgIWNodW5rX3Jvb3QgfHwgIWRldl9yb290KSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKIAl9Ci0JZnNfaW5mbyA9IHRyZWVfcm9vdC0+ZnNfaW5mbzsKIAogCXJldCA9IGluaXRfc3JjdV9zdHJ1Y3QoJmZzX2luZm8tPnN1YnZvbF9zcmN1KTsKIAlpZiAocmV0KSB7CkBAIC0xNjQ4LDE1ICsxOTUxLDEwIEBACiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5kZWxheWVkX2lwdXRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmRlZnJhZ19pbm9kZXNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CiAJbXV0ZXhfaW5pdCgmZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCiAJaW5pdF9jb21wbGV0aW9uKCZmc19pbmZvLT5rb2JqX3VucmVnaXN0ZXIpOwotCWZzX2luZm8tPnRyZWVfcm9vdCA9IHRyZWVfcm9vdDsKLQlmc19pbmZvLT5leHRlbnRfcm9vdCA9IGV4dGVudF9yb290OwotCWZzX2luZm8tPmNzdW1fcm9vdCA9IGNzdW1fcm9vdDsKLQlmc19pbmZvLT5jaHVua19yb290ID0gY2h1bmtfcm9vdDsKLQlmc19pbmZvLT5kZXZfcm9vdCA9IGRldl9yb290OwotCWZzX2luZm8tPmZzX2RldmljZXMgPSBmc19kZXZpY2VzOwogCUlOSVRfTElTVF9IRUFEKCZmc19pbmZvLT5kaXJ0eV9jb3dvbmx5X3Jvb3RzKTsKIAlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+c3BhY2VfaW5mbyk7CiAJYnRyZnNfbWFwcGluZ19pbml0KCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOwpAQCAtMTY2NSw4ICsxOTYzLDcgQEAKIAlidHJmc19pbml0X2Jsb2NrX3JzdigmZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2KTsKIAlidHJmc19pbml0X2Jsb2NrX3JzdigmZnNfaW5mby0+Y2h1bmtfYmxvY2tfcnN2KTsKIAlidHJmc19pbml0X2Jsb2NrX3JzdigmZnNfaW5mby0+ZW1wdHlfYmxvY2tfcnN2KTsKLQlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+ZHVyYWJsZV9ibG9ja19yc3ZfbGlzdCk7Ci0JbXV0ZXhfaW5pdCgmZnNfaW5mby0+ZHVyYWJsZV9ibG9ja19yc3ZfbXV0ZXgpOworCWJ0cmZzX2luaXRfYmxvY2tfcnN2KCZmc19pbmZvLT5kZWxheWVkX2Jsb2NrX3Jzdik7CiAJYXRvbWljX3NldCgmZnNfaW5mby0+bnJfYXN5bmNfc3VibWl0cywgMCk7CiAJYXRvbWljX3NldCgmZnNfaW5mby0+YXN5bmNfZGVsYWxsb2NfcGFnZXMsIDApOwogCWF0b21pY19zZXQoJmZzX2luZm8tPmFzeW5jX3N1Ym1pdF9kcmFpbmluZywgMCk7CkBAIC0xNjc3LDYgKzE5NzQsMTEgQEAKIAlmc19pbmZvLT5tZXRhZGF0YV9yYXRpbyA9IDA7CiAJZnNfaW5mby0+ZGVmcmFnX2lub2RlcyA9IFJCX1JPT1Q7CiAJZnNfaW5mby0+dHJhbnNfbm9fam9pbiA9IDA7CisJZnNfaW5mby0+ZnJlZV9jaHVua19zcGFjZSA9IDA7CisKKwkvKiByZWFkYWhlYWQgc3RhdGUgKi8KKwlJTklUX1JBRElYX1RSRUUoJmZzX2luZm8tPnJlYWRhX3RyZWUsIEdGUF9OT0ZTICYgfl9fR0ZQX1dBSVQpOworCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKIAogCWZzX2luZm8tPnRocmVhZF9wb29sX3NpemUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLAogCQkJCQkgIG51bV9vbmxpbmVfY3B1cygpICsgMiwgOCk7CkBAIC0xNzA1LDcgKzIwMDcsNyBAQAogCXNiLT5zX2JkaSA9ICZmc19pbmZvLT5iZGk7CiAKIAlmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9pbm8gPSBCVFJGU19CVFJFRV9JTk9ERV9PQkpFQ1RJRDsKLQlmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGZzX2luZm8tPmJ0cmVlX2lub2RlLCAxKTsKIAkvKgogCSAqIHdlIHNldCB0aGUgaV9zaXplIG9uIHRoZSBidHJlZSBpbm9kZSB0byB0aGUgbWF4IHBvc3NpYmxlIGludC4KIAkgKiB0aGUgcmVhbCBlbmQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgZGV0ZXJtaW5lZCBieSBhbGwgb2YKQEAgLTE3NjYsMTQgKzIwNjgsMTQgQEAKIAkJZ290byBmYWlsX2FsbG9jOwogCX0KIAotCW1lbWNweSgmZnNfaW5mby0+c3VwZXJfY29weSwgYmgtPmJfZGF0YSwgc2l6ZW9mKGZzX2luZm8tPnN1cGVyX2NvcHkpKTsKLQltZW1jcHkoJmZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQsICZmc19pbmZvLT5zdXBlcl9jb3B5LAotCSAgICAgICBzaXplb2YoZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCkpOworCW1lbWNweShmc19pbmZvLT5zdXBlcl9jb3B5LCBiaC0+Yl9kYXRhLCBzaXplb2YoKmZzX2luZm8tPnN1cGVyX2NvcHkpKTsKKwltZW1jcHkoZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwgZnNfaW5mby0+c3VwZXJfY29weSwKKwkgICAgICAgc2l6ZW9mKCpmc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0KSk7CiAJYnJlbHNlKGJoKTsKIAotCW1lbWNweShmc19pbmZvLT5mc2lkLCBmc19pbmZvLT5zdXBlcl9jb3B5LmZzaWQsIEJUUkZTX0ZTSURfU0laRSk7CisJbWVtY3B5KGZzX2luZm8tPmZzaWQsIGZzX2luZm8tPnN1cGVyX2NvcHktPmZzaWQsIEJUUkZTX0ZTSURfU0laRSk7CiAKLQlkaXNrX3N1cGVyID0gJmZzX2luZm8tPnN1cGVyX2NvcHk7CisJZGlza19zdXBlciA9IGZzX2luZm8tPnN1cGVyX2NvcHk7CiAJaWYgKCFidHJmc19zdXBlcl9yb290KGRpc2tfc3VwZXIpKQogCQlnb3RvIGZhaWxfYWxsb2M7CiAKQEAgLTE3ODMsNiArMjA4NSwxMyBAQAogCWJ0cmZzX2NoZWNrX3N1cGVyX3ZhbGlkKGZzX2luZm8sIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKIAogCS8qCisJICogcnVuIHRocm91Z2ggb3VyIGFycmF5IG9mIGJhY2t1cCBzdXBlcnMgYW5kIHNldHVwCisJICogb3VyIHJpbmcgcG9pbnRlciB0byB0aGUgb2xkZXN0IG9uZQorCSAqLworCWdlbmVyYXRpb24gPSBidHJmc19zdXBlcl9nZW5lcmF0aW9uKGRpc2tfc3VwZXIpOworCWZpbmRfb2xkZXN0X3N1cGVyX2JhY2t1cChmc19pbmZvLCBnZW5lcmF0aW9uKTsKKworCS8qCiAJICogSW4gdGhlIGxvbmcgdGVybSwgd2UnbGwgc3RvcmUgdGhlIGNvbXByZXNzaW9uIHR5cGUgaW4gdGhlIHN1cGVyCiAJICogYmxvY2ssIGFuZCBpdCdsbCBiZSB1c2VkIGZvciBwZXIgZmlsZSBjb21wcmVzc2lvbiBjb250cm9sLgogCSAqLwpAQCAtMTg3MCw2ICsyMTc5LDkgQEAKIAlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPmRlbGF5ZWRfd29ya2VycywgImRlbGF5ZWQtbWV0YSIsCiAJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplLAogCQkJICAgJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKKwlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPnJlYWRhaGVhZF93b3JrZXJzLCAicmVhZGFoZWFkIiwKKwkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUsCisJCQkgICAmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIpOwogCiAJLyoKIAkgKiBlbmRpb3MgYXJlIGxhcmdlbHkgcGFyYWxsZWwgYW5kIHNob3VsZCBoYXZlIGEgdmVyeQpAQCAtMTg4MCw2ICsyMTkyLDcgQEAKIAogCWZzX2luZm8tPmVuZGlvX3dyaXRlX3dvcmtlcnMuaWRsZV90aHJlc2ggPSAyOwogCWZzX2luZm8tPmVuZGlvX21ldGFfd3JpdGVfd29ya2Vycy5pZGxlX3RocmVzaCA9IDI7CisJZnNfaW5mby0+cmVhZGFoZWFkX3dvcmtlcnMuaWRsZV90aHJlc2ggPSAyOwogCiAJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+d29ya2VycywgMSk7CiAJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIsIDEpOwpAQCAtMTg5Myw2ICsyMjA2LDcgQEAKIAlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19mcmVlc3BhY2Vfd29ya2VyLCAxKTsKIAlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5kZWxheWVkX3dvcmtlcnMsIDEpOwogCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmNhY2hpbmdfd29ya2VycywgMSk7CisJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+cmVhZGFoZWFkX3dvcmtlcnMsIDEpOwogCiAJZnNfaW5mby0+YmRpLnJhX3BhZ2VzICo9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKGRpc2tfc3VwZXIpOwogCWZzX2luZm8tPmJkaS5yYV9wYWdlcyA9IG1heChmc19pbmZvLT5iZGkucmFfcGFnZXMsCkBAIC0xOTM5LDcgKzIyNTMsNyBAQAogCWlmICghdGVzdF9iaXQoRVhURU5UX0JVRkZFUl9VUFRPREFURSwgJmNodW5rX3Jvb3QtPm5vZGUtPmJmbGFncykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6IGZhaWxlZCB0byByZWFkIGNodW5rIHJvb3Qgb24gJXNcbiIsCiAJCSAgICAgICBzYi0+c19pZCk7Ci0JCWdvdG8gZmFpbF9jaHVua19yb290OworCQlnb3RvIGZhaWxfdHJlZV9yb290czsKIAl9CiAJYnRyZnNfc2V0X3Jvb3Rfbm9kZSgmY2h1bmtfcm9vdC0+cm9vdF9pdGVtLCBjaHVua19yb290LT5ub2RlKTsKIAljaHVua19yb290LT5jb21taXRfcm9vdCA9IGJ0cmZzX3Jvb3Rfbm9kZShjaHVua19yb290KTsKQEAgLTE5NTQsMTEgKzIyNjgsMTIgQEAKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzOiBmYWlsZWQgdG8gcmVhZCBjaHVuayB0cmVlIG9uICVzXG4iLAogCQkgICAgICAgc2ItPnNfaWQpOwotCQlnb3RvIGZhaWxfY2h1bmtfcm9vdDsKKwkJZ290byBmYWlsX3RyZWVfcm9vdHM7CiAJfQogCiAJYnRyZnNfY2xvc2VfZXh0cmFfZGV2aWNlcyhmc19kZXZpY2VzKTsKIAorcmV0cnlfcm9vdF9iYWNrdXA6CiAJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZSh0cmVlX3Jvb3QsCiAJCQkJICAgICBidHJmc19zdXBlcl9yb290X2xldmVsKGRpc2tfc3VwZXIpKTsKIAlnZW5lcmF0aW9uID0gYnRyZnNfc3VwZXJfZ2VuZXJhdGlvbihkaXNrX3N1cGVyKTsKQEAgLTE5NjYsMzIgKzIyODEsMzMgQEAKIAl0cmVlX3Jvb3QtPm5vZGUgPSByZWFkX3RyZWVfYmxvY2sodHJlZV9yb290LAogCQkJCQkgIGJ0cmZzX3N1cGVyX3Jvb3QoZGlza19zdXBlciksCiAJCQkJCSAgYmxvY2tzaXplLCBnZW5lcmF0aW9uKTsKLQlpZiAoIXRyZWVfcm9vdC0+bm9kZSkKLQkJZ290byBmYWlsX2NodW5rX3Jvb3Q7Ci0JaWYgKCF0ZXN0X2JpdChFWFRFTlRfQlVGRkVSX1VQVE9EQVRFLCAmdHJlZV9yb290LT5ub2RlLT5iZmxhZ3MpKSB7CisJaWYgKCF0cmVlX3Jvb3QtPm5vZGUgfHwKKwkgICAgIXRlc3RfYml0KEVYVEVOVF9CVUZGRVJfVVBUT0RBVEUsICZ0cmVlX3Jvb3QtPm5vZGUtPmJmbGFncykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6IGZhaWxlZCB0byByZWFkIHRyZWUgcm9vdCBvbiAlc1xuIiwKIAkJICAgICAgIHNiLT5zX2lkKTsKLQkJZ290byBmYWlsX3RyZWVfcm9vdDsKKworCQlnb3RvIHJlY292ZXJ5X3RyZWVfcm9vdDsKIAl9CisKIAlidHJmc19zZXRfcm9vdF9ub2RlKCZ0cmVlX3Jvb3QtPnJvb3RfaXRlbSwgdHJlZV9yb290LT5ub2RlKTsKIAl0cmVlX3Jvb3QtPmNvbW1pdF9yb290ID0gYnRyZnNfcm9vdF9ub2RlKHRyZWVfcm9vdCk7CiAKIAlyZXQgPSBmaW5kX2FuZF9zZXR1cF9yb290KHRyZWVfcm9vdCwgZnNfaW5mbywKIAkJCQkgIEJUUkZTX0VYVEVOVF9UUkVFX09CSkVDVElELCBleHRlbnRfcm9vdCk7CiAJaWYgKHJldCkKLQkJZ290byBmYWlsX3RyZWVfcm9vdDsKKwkJZ290byByZWNvdmVyeV90cmVlX3Jvb3Q7CiAJZXh0ZW50X3Jvb3QtPnRyYWNrX2RpcnR5ID0gMTsKIAogCXJldCA9IGZpbmRfYW5kX3NldHVwX3Jvb3QodHJlZV9yb290LCBmc19pbmZvLAogCQkJCSAgQlRSRlNfREVWX1RSRUVfT0JKRUNUSUQsIGRldl9yb290KTsKIAlpZiAocmV0KQotCQlnb3RvIGZhaWxfZXh0ZW50X3Jvb3Q7CisJCWdvdG8gcmVjb3ZlcnlfdHJlZV9yb290OwogCWRldl9yb290LT50cmFja19kaXJ0eSA9IDE7CiAKIAlyZXQgPSBmaW5kX2FuZF9zZXR1cF9yb290KHRyZWVfcm9vdCwgZnNfaW5mbywKIAkJCQkgIEJUUkZTX0NTVU1fVFJFRV9PQkpFQ1RJRCwgY3N1bV9yb290KTsKIAlpZiAocmV0KQotCQlnb3RvIGZhaWxfZGV2X3Jvb3Q7CisJCWdvdG8gcmVjb3ZlcnlfdHJlZV9yb290OwogCiAJY3N1bV9yb290LT50cmFja19kaXJ0eSA9IDE7CiAKQEAgLTIxMjQsMjIgKzI0NDAsMTMgQEAKIAogZmFpbF9ibG9ja19ncm91cHM6CiAJYnRyZnNfZnJlZV9ibG9ja19ncm91cHMoZnNfaW5mbyk7Ci0JZnJlZV9leHRlbnRfYnVmZmVyKGNzdW1fcm9vdC0+bm9kZSk7Ci0JZnJlZV9leHRlbnRfYnVmZmVyKGNzdW1fcm9vdC0+Y29tbWl0X3Jvb3QpOwotZmFpbF9kZXZfcm9vdDoKLQlmcmVlX2V4dGVudF9idWZmZXIoZGV2X3Jvb3QtPm5vZGUpOwotCWZyZWVfZXh0ZW50X2J1ZmZlcihkZXZfcm9vdC0+Y29tbWl0X3Jvb3QpOwotZmFpbF9leHRlbnRfcm9vdDoKLQlmcmVlX2V4dGVudF9idWZmZXIoZXh0ZW50X3Jvb3QtPm5vZGUpOwotCWZyZWVfZXh0ZW50X2J1ZmZlcihleHRlbnRfcm9vdC0+Y29tbWl0X3Jvb3QpOwotZmFpbF90cmVlX3Jvb3Q6Ci0JZnJlZV9leHRlbnRfYnVmZmVyKHRyZWVfcm9vdC0+bm9kZSk7Ci0JZnJlZV9leHRlbnRfYnVmZmVyKHRyZWVfcm9vdC0+Y29tbWl0X3Jvb3QpOwotZmFpbF9jaHVua19yb290OgotCWZyZWVfZXh0ZW50X2J1ZmZlcihjaHVua19yb290LT5ub2RlKTsKLQlmcmVlX2V4dGVudF9idWZmZXIoY2h1bmtfcm9vdC0+Y29tbWl0X3Jvb3QpOworCitmYWlsX3RyZWVfcm9vdHM6CisJZnJlZV9yb290X3BvaW50ZXJzKGZzX2luZm8sIDEpOworCiBmYWlsX3NiX2J1ZmZlcjoKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKKwlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPnJlYWRhaGVhZF93b3JrZXJzKTsKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmZpeHVwX3dvcmtlcnMpOwogCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+ZGVsYWxsb2Nfd29ya2Vycyk7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT53b3JrZXJzKTsKQEAgLTIxNTIsMjUgKzI0NTksMzcgQEAKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmRlbGF5ZWRfd29ya2Vycyk7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5jYWNoaW5nX3dvcmtlcnMpOwogZmFpbF9hbGxvYzoKLQlrZnJlZShmc19pbmZvLT5kZWxheWVkX3Jvb3QpOwogZmFpbF9pcHV0OgorCWJ0cmZzX21hcHBpbmdfdHJlZV9mcmVlKCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOworCiAJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIoZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7CiAJaXB1dChmc19pbmZvLT5idHJlZV9pbm9kZSk7Ci0KLQlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2luZm8tPmZzX2RldmljZXMpOwotCWJ0cmZzX21hcHBpbmdfdHJlZV9mcmVlKCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOwogZmFpbF9iZGk6CiAJYmRpX2Rlc3Ryb3koJmZzX2luZm8tPmJkaSk7CiBmYWlsX3NyY3U6CiAJY2xlYW51cF9zcmN1X3N0cnVjdCgmZnNfaW5mby0+c3Vidm9sX3NyY3UpOwogZmFpbDoKLQlrZnJlZShleHRlbnRfcm9vdCk7Ci0Ja2ZyZWUodHJlZV9yb290KTsKLQlrZnJlZShmc19pbmZvKTsKLQlrZnJlZShjaHVua19yb290KTsKLQlrZnJlZShkZXZfcm9vdCk7Ci0Ja2ZyZWUoY3N1bV9yb290KTsKKwlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2luZm8tPmZzX2RldmljZXMpOworCWZyZWVfZnNfaW5mbyhmc19pbmZvKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOworCityZWNvdmVyeV90cmVlX3Jvb3Q6CisJaWYgKCFidHJmc190ZXN0X29wdCh0cmVlX3Jvb3QsIFJFQ09WRVJZKSkKKwkJZ290byBmYWlsX3RyZWVfcm9vdHM7CisKKwlmcmVlX3Jvb3RfcG9pbnRlcnMoZnNfaW5mbywgMCk7CisKKwkvKiBkb24ndCB1c2UgdGhlIGxvZyBpbiByZWNvdmVyeSBtb2RlLCBpdCB3b24ndCBiZSB2YWxpZCAqLworCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdChkaXNrX3N1cGVyLCAwKTsKKworCS8qIHdlIGNhbid0IHRydXN0IHRoZSBmcmVlIHNwYWNlIGNhY2hlIGVpdGhlciAqLworCWJ0cmZzX3NldF9vcHQoZnNfaW5mby0+bW91bnRfb3B0LCBDTEVBUl9DQUNIRSk7CisKKwlyZXQgPSBuZXh0X3Jvb3RfYmFja3VwKGZzX2luZm8sIGZzX2luZm8tPnN1cGVyX2NvcHksCisJCQkgICAgICAgJm51bV9iYWNrdXBzX3RyaWVkLCAmYmFja3VwX2luZGV4KTsKKwlpZiAocmV0ID09IC0xKQorCQlnb3RvIGZhaWxfYmxvY2tfZ3JvdXBzOworCWdvdG8gcmV0cnlfcm9vdF9iYWNrdXA7CiB9CiAKIHN0YXRpYyB2b2lkIGJ0cmZzX2VuZF9idWZmZXJfd3JpdGVfc3luYyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCkBAIC0yMzM4LDEwICsyNjU3LDExIEBACiAJaW50IHRvdGFsX2Vycm9ycyA9IDA7CiAJdTY0IGZsYWdzOwogCi0JbWF4X2Vycm9ycyA9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAtIDE7CisJbWF4X2Vycm9ycyA9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpIC0gMTsKIAlkb19iYXJyaWVycyA9ICFidHJmc190ZXN0X29wdChyb290LCBOT0JBUlJJRVIpOworCWJhY2t1cF9zdXBlcl9yb290cyhyb290LT5mc19pbmZvKTsKIAotCXNiID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQ7CisJc2IgPSByb290LT5mc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0OwogCWRldl9pdGVtID0gJnNiLT5kZXZfaXRlbTsKIAogCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmRldmljZV9saXN0X211dGV4KTsKQEAgLTI1NDUsOCArMjg2NSw2IEBACiAJLyogY2xlYXIgb3V0IHRoZSByYnRyZWUgb2YgZGVmcmFnZ2FibGUgaW5vZGVzICovCiAJYnRyZnNfcnVuX2RlZnJhZ19pbm9kZXMocm9vdC0+ZnNfaW5mbyk7CiAKLQlidHJmc19wdXRfYmxvY2tfZ3JvdXBfY2FjaGUoZnNfaW5mbyk7Ci0KIAkvKgogCSAqIEhlcmUgY29tZSAyIHNpdHVhdGlvbnMgd2hlbiBidHJmcyBpcyBicm9rZW4gdG8gZmxpcCByZWFkb25seToKIAkgKgpAQCAtMjU3Miw2ICsyODkwLDggQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGNvbW1pdCBzdXBlciByZXQgJWRcbiIsIHJldCk7CiAJfQogCisJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwX2NhY2hlKGZzX2luZm8pOworCiAJa3RocmVhZF9zdG9wKHJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX2t0aHJlYWQpOwogCWt0aHJlYWRfc3RvcChyb290LT5mc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQpOwogCkBAIC0yNjAzLDcgKzI5MjMsNiBAQAogCWRlbF9mc19yb290cyhmc19pbmZvKTsKIAogCWlwdXQoZnNfaW5mby0+YnRyZWVfaW5vZGUpOwotCWtmcmVlKGZzX2luZm8tPmRlbGF5ZWRfcm9vdCk7CiAKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmZpeHVwX3dvcmtlcnMpOwpAQCAtMjYxNyw2ICsyOTM2LDcgQEAKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPnN1Ym1pdF93b3JrZXJzKTsKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmRlbGF5ZWRfd29ya2Vycyk7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5jYWNoaW5nX3dvcmtlcnMpOworCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+cmVhZGFoZWFkX3dvcmtlcnMpOwogCiAJYnRyZnNfY2xvc2VfZGV2aWNlcyhmc19pbmZvLT5mc19kZXZpY2VzKTsKIAlidHJmc19tYXBwaW5nX3RyZWVfZnJlZSgmZnNfaW5mby0+bWFwcGluZ190cmVlKTsKQEAgLTI2MjQsMTIgKzI5NDQsNyBAQAogCWJkaV9kZXN0cm95KCZmc19pbmZvLT5iZGkpOwogCWNsZWFudXBfc3JjdV9zdHJ1Y3QoJmZzX2luZm8tPnN1YnZvbF9zcmN1KTsKIAotCWtmcmVlKGZzX2luZm8tPmV4dGVudF9yb290KTsKLQlrZnJlZShmc19pbmZvLT50cmVlX3Jvb3QpOwotCWtmcmVlKGZzX2luZm8tPmNodW5rX3Jvb3QpOwotCWtmcmVlKGZzX2luZm8tPmRldl9yb290KTsKLQlrZnJlZShmc19pbmZvLT5jc3VtX3Jvb3QpOwotCWtmcmVlKGZzX2luZm8pOworCWZyZWVfZnNfaW5mbyhmc19pbmZvKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjczNSw3ICszMDUwLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYnRyZWVfbG9ja19wYWdlX2hvb2soc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW50IGJ0cmVlX2xvY2tfcGFnZV9ob29rKHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpkYXRhLAorCQkJCXZvaWQgKCpmbHVzaF9mbikodm9pZCAqKSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwpAQCAtMjc1Miw3ICszMDY4LDEwIEBACiAJaWYgKCFlYikKIAkJZ290byBvdXQ7CiAKLQlidHJmc190cmVlX2xvY2soZWIpOworCWlmICghYnRyZnNfdHJ5X3RyZWVfd3JpdGVfbG9jayhlYikpIHsKKwkJZmx1c2hfZm4oZGF0YSk7CisJCWJ0cmZzX3RyZWVfbG9jayhlYik7CisJfQogCWJ0cmZzX3NldF9oZWFkZXJfZmxhZyhlYiwgQlRSRlNfSEVBREVSX0ZMQUdfV1JJVFRFTik7CiAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVYVEVOVF9CVUZGRVJfRElSVFksICZlYi0+YmZsYWdzKSkgewpAQCAtMjc2Nyw3ICszMDg2LDEwIEBACiAJYnRyZnNfdHJlZV91bmxvY2soZWIpOwogCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CiBvdXQ6Ci0JbG9ja19wYWdlKHBhZ2UpOworCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CisJCWZsdXNoX2ZuKGRhdGEpOworCQlsb2NrX3BhZ2UocGFnZSk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0zMTIzLDYgKzM0NDUsNyBAQAogc3RhdGljIHN0cnVjdCBleHRlbnRfaW9fb3BzIGJ0cmVlX2V4dGVudF9pb19vcHMgPSB7CiAJLndyaXRlX2NhY2hlX3BhZ2VzX2xvY2tfaG9vayA9IGJ0cmVlX2xvY2tfcGFnZV9ob29rLAogCS5yZWFkcGFnZV9lbmRfaW9faG9vayA9IGJ0cmVlX3JlYWRwYWdlX2VuZF9pb19ob29rLAorCS5yZWFkcGFnZV9pb19mYWlsZWRfaG9vayA9IGJ0cmVlX2lvX2ZhaWxlZF9ob29rLAogCS5zdWJtaXRfYmlvX2hvb2sgPSBidHJlZV9zdWJtaXRfYmlvX2hvb2ssCiAJLyogbm90ZSB3ZSdyZSBzaGFyaW5nIHdpdGggaW5vZGUuYyBmb3IgdGhlIG1lcmdlIGJpbyBob29rICovCiAJLm1lcmdlX2Jpb19ob29rID0gYnRyZnNfbWVyZ2VfYmlvX2hvb2ssCmRpZmYgLS1naXQgYS9mcy9idHJmcy9kaXNrLWlvLmggYi9mcy9idHJmcy9kaXNrLWlvLmgKaW5kZXggYmVjM2VhNC4uYzk5ZDBhOGYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2Rpc2staW8uaAorKysgYi9mcy9idHJmcy9kaXNrLWlvLmgKQEAgLTQwLDYgKzQwLDggQEAKIAkJCQkgICAgICB1MzIgYmxvY2tzaXplLCB1NjQgcGFyZW50X3RyYW5zaWQpOwogaW50IHJlYWRhaGVhZF90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgYnl0ZW5yLCB1MzIgYmxvY2tzaXplLAogCQkJIHU2NCBwYXJlbnRfdHJhbnNpZCk7CitpbnQgcmVhZGFfdHJlZV9ibG9ja19mbGFnZ2VkKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgYnl0ZW5yLCB1MzIgYmxvY2tzaXplLAorCQkJIGludCBtaXJyb3JfbnVtLCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqKmViKTsKIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidHJmc19maW5kX2NyZWF0ZV90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQkJICAgdTY0IGJ5dGVuciwgdTMyIGJsb2Nrc2l6ZSk7CiBpbnQgY2xlYW5fdHJlZV9ibG9jayhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKQEAgLTgzLDggKzg1LDYgQEAKIAkJCSAgICAgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pOwogaW50IGJ0cmZzX2FkZF9sb2dfdHJlZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKLWludCBidHJlZV9sb2NrX3BhZ2VfaG9vayhzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci0KIAogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCiB2b2lkIGJ0cmZzX2luaXRfbG9ja2RlcCh2b2lkKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCmluZGV4IGY1YmUwNmEuLmIyMzIxNTAgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlICJjb21wYXQuaCIKICNpbmNsdWRlICJoYXNoLmgiCiAjaW5jbHVkZSAiY3RyZWUuaCIKQEAgLTUyLDYgKzUzLDIxIEBACiAJQ0hVTktfQUxMT0NfTElNSVRFRCA9IDIsCiB9OwogCisvKgorICogQ29udHJvbCBob3cgcmVzZXJ2YXRpb25zIGFyZSBkZWFsdCB3aXRoLgorICoKKyAqIFJFU0VSVkVfRlJFRSAtIGZyZWVpbmcgYSByZXNlcnZhdGlvbi4KKyAqIFJFU0VSVkVfQUxMT0MgLSBhbGxvY2F0aW5nIHNwYWNlIGFuZCB3ZSBuZWVkIHRvIHVwZGF0ZSBieXRlc19tYXlfdXNlIGZvcgorICogICBFTk9TUEMgYWNjb3VudGluZworICogUkVTRVJWRV9BTExPQ19OT19BQ0NPVU5UIC0gYWxsb2NhdGluZyBzcGFjZSBhbmQgd2Ugc2hvdWxkIG5vdCB1cGRhdGUKKyAqICAgYnl0ZXNfbWF5X3VzZSBhcyB0aGUgRU5PU1BDIGFjY291bnRpbmcgaXMgZG9uZSBlbHNld2hlcmUKKyAqLworZW51bSB7CisJUkVTRVJWRV9GUkVFID0gMCwKKwlSRVNFUlZFX0FMTE9DID0gMSwKKwlSRVNFUlZFX0FMTE9DX05PX0FDQ09VTlQgPSAyLAorfTsKKwogc3RhdGljIGludCB1cGRhdGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgICAgIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsIGludCBhbGxvYyk7CkBAIC04MSw2ICs5Nyw4IEBACiAJCQkgc3RydWN0IGJ0cmZzX2tleSAqa2V5KTsKIHN0YXRpYyB2b2lkIGR1bXBfc3BhY2VfaW5mbyhzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqaW5mbywgdTY0IGJ5dGVzLAogCQkJICAgIGludCBkdW1wX2Jsb2NrX2dyb3Vwcyk7CitzdGF0aWMgaW50IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAorCQkJCSAgICAgICB1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZSk7CiAKIHN0YXRpYyBub2lubGluZSBpbnQKIGJsb2NrX2dyb3VwX2NhY2hlX2RvbmUoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSkKQEAgLTEwNCw3ICsxMjIsNiBAQAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjYWNoZS0+Y291bnQpKSB7CiAJCVdBUk5fT04oY2FjaGUtPnBpbm5lZCA+IDApOwogCQlXQVJOX09OKGNhY2hlLT5yZXNlcnZlZCA+IDApOwotCQlXQVJOX09OKGNhY2hlLT5yZXNlcnZlZF9waW5uZWQgPiAwKTsKIAkJa2ZyZWUoY2FjaGUtPmZyZWVfc3BhY2VfY3RsKTsKIAkJa2ZyZWUoY2FjaGUpOwogCX0KQEAgLTQ2NSw3ICs0ODIsOCBAQAogCSAqIHdlIGxpa2VseSBob2xkIGltcG9ydGFudCBsb2Nrcy4KIAkgKi8KIAlpZiAodHJhbnMgJiYgKCF0cmFucy0+dHJhbnNhY3Rpb24tPmluX2NvbW1pdCkgJiYKLQkgICAgKHJvb3QgJiYgcm9vdCAhPSByb290LT5mc19pbmZvLT50cmVlX3Jvb3QpKSB7CisJICAgIChyb290ICYmIHJvb3QgIT0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290KSAmJgorCSAgICBidHJmc190ZXN0X29wdChyb290LCBTUEFDRV9DQUNIRSkpIHsKIAkJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CiAJCWlmIChjYWNoZS0+Y2FjaGVkICE9IEJUUkZTX0NBQ0hFX05PKSB7CiAJCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOwpAQCAtMTc3MCwxOCArMTc4OCwxOCBAQAogewogCWludCByZXQ7CiAJdTY0IGRpc2NhcmRlZF9ieXRlcyA9IDA7Ci0Jc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqbXVsdGkgPSBOVUxMOworCXN0cnVjdCBidHJmc19iaW8gKmJiaW8gPSBOVUxMOwogCiAKIAkvKiBUZWxsIHRoZSBibG9jayBkZXZpY2UocykgdGhhdCB0aGUgc2VjdG9ycyBjYW4gYmUgZGlzY2FyZGVkICovCiAJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKCZyb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWUsIFJFUV9ESVNDQVJELAotCQkJICAgICAgYnl0ZW5yLCAmbnVtX2J5dGVzLCAmbXVsdGksIDApOworCQkJICAgICAgYnl0ZW5yLCAmbnVtX2J5dGVzLCAmYmJpbywgMCk7CiAJaWYgKCFyZXQpIHsKLQkJc3RydWN0IGJ0cmZzX2Jpb19zdHJpcGUgKnN0cmlwZSA9IG11bHRpLT5zdHJpcGVzOworCQlzdHJ1Y3QgYnRyZnNfYmlvX3N0cmlwZSAqc3RyaXBlID0gYmJpby0+c3RyaXBlczsKIAkJaW50IGk7CiAKIAotCQlmb3IgKGkgPSAwOyBpIDwgbXVsdGktPm51bV9zdHJpcGVzOyBpKyssIHN0cmlwZSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBiYmlvLT5udW1fc3RyaXBlczsgaSsrLCBzdHJpcGUrKykgewogCQkJaWYgKCFzdHJpcGUtPmRldi0+Y2FuX2Rpc2NhcmQpCiAJCQkJY29udGludWU7CiAKQEAgLTE4MDAsNyArMTgxOCw3IEBACiAJCQkgKi8KIAkJCXJldCA9IDA7CiAJCX0KLQkJa2ZyZWUobXVsdGkpOworCQlrZnJlZShiYmlvKTsKIAl9CiAKIAlpZiAoYWN0dWFsX2J5dGVzKQpAQCAtMjcwMCw2ICsyNzE4LDEzIEBACiAJCWdvdG8gYWdhaW47CiAJfQogCisJLyogV2UndmUgYWxyZWFkeSBzZXR1cCB0aGlzIHRyYW5zYWN0aW9uLCBnbyBhaGVhZCBhbmQgZXhpdCAqLworCWlmIChibG9ja19ncm91cC0+Y2FjaGVfZ2VuZXJhdGlvbiA9PSB0cmFucy0+dHJhbnNpZCAmJgorCSAgICBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJZGNzID0gQlRSRlNfRENfU0VUVVA7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisKIAkvKgogCSAqIFdlIHdhbnQgdG8gc2V0IHRoZSBnZW5lcmF0aW9uIHRvIDAsIHRoYXQgd2F5IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKIAkgKiBmcm9tIGhlcmUgb24gb3V0IHdlIGtub3cgbm90IHRvIHRydXN0IHRoaXMgY2FjaGUgd2hlbiB3ZSBsb2FkIHVwIG5leHQKQEAgLTI3NDksMTIgKzI3NzQsMTUgQEAKIAlpZiAoIXJldCkKIAkJZGNzID0gQlRSRlNfRENfU0VUVVA7CiAJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBudW1fcGFnZXMpOworCiBvdXRfcHV0OgogCWlwdXQoaW5vZGUpOwogb3V0X2ZyZWU6CiAJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogb3V0OgogCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCWlmICghcmV0KQorCQlibG9ja19ncm91cC0+Y2FjaGVfZ2VuZXJhdGlvbiA9IHRyYW5zLT50cmFuc2lkOwogCWJsb2NrX2dyb3VwLT5kaXNrX2NhY2hlX3N0YXRlID0gZGNzOwogCXNwaW5fdW5sb2NrKCZibG9ja19ncm91cC0+bG9jayk7CiAKQEAgLTMxMjIsMTYgKzMxNTAsMTMgQEAKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCWRhdGFfc2luZm8tPmJ5dGVzX21heV91c2UgKz0gYnl0ZXM7Ci0JQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2J5dGVzICs9IGJ5dGVzOwogCXNwaW5fdW5sb2NrKCZkYXRhX3NpbmZvLT5sb2NrKTsKIAogCXJldHVybiAwOwogfQogCiAvKgotICogY2FsbGVkIHdoZW4gd2UgYXJlIGNsZWFyaW5nIGFuIGRlbGFsbG9jIGV4dGVudCBmcm9tIHRoZQotICogaW5vZGUncyBpb190cmVlIG9yIHRoZXJlIHdhcyBhbiBlcnJvciBmb3Igd2hhdGV2ZXIgcmVhc29uCi0gKiBhZnRlciBjYWxsaW5nIGJ0cmZzX2NoZWNrX2RhdGFfZnJlZV9zcGFjZQorICogQ2FsbGVkIGlmIHdlIG5lZWQgdG8gY2xlYXIgYSBkYXRhIHJlc2VydmF0aW9uIGZvciB0aGlzIGlub2RlLgogICovCiB2b2lkIGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgYnl0ZXMpCiB7CkBAIC0zMTQ0LDcgKzMxNjksNiBAQAogCWRhdGFfc2luZm8gPSBCVFJGU19JKGlub2RlKS0+c3BhY2VfaW5mbzsKIAlzcGluX2xvY2soJmRhdGFfc2luZm8tPmxvY2spOwogCWRhdGFfc2luZm8tPmJ5dGVzX21heV91c2UgLT0gYnl0ZXM7Ci0JQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2J5dGVzIC09IGJ5dGVzOwogCXNwaW5fdW5sb2NrKCZkYXRhX3NpbmZvLT5sb2NrKTsKIH0KIApAQCAtMzE2NSw2ICszMTg5LDcgQEAKIAkJCSAgICAgIHN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzaW5mbywgdTY0IGFsbG9jX2J5dGVzLAogCQkJICAgICAgaW50IGZvcmNlKQogeworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmdsb2JhbF9yc3YgPSAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKIAl1NjQgbnVtX2J5dGVzID0gc2luZm8tPnRvdGFsX2J5dGVzIC0gc2luZm8tPmJ5dGVzX3JlYWRvbmx5OwogCXU2NCBudW1fYWxsb2NhdGVkID0gc2luZm8tPmJ5dGVzX3VzZWQgKyBzaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQ7CiAJdTY0IHRocmVzaDsKQEAgLTMxNzMsMTEgKzMxOTgsMTggQEAKIAkJcmV0dXJuIDE7CiAKIAkvKgorCSAqIFdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGdsb2JhbCByc3YgYmVjYXVzZSBmb3IgYWxsIGludGVudHMKKwkgKiBhbmQgcHVycG9zZXMgaXQncyB1c2VkIHNwYWNlLiAgRG9uJ3Qgd29ycnkgYWJvdXQgbG9ja2luZyB0aGUKKwkgKiBnbG9iYWxfcnN2LCBpdCBkb2Vzbid0IGNoYW5nZSBleGNlcHQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cy4KKwkgKi8KKwludW1fYWxsb2NhdGVkICs9IGdsb2JhbF9yc3YtPnNpemU7CisKKwkvKgogCSAqIGluIGxpbWl0ZWQgbW9kZSwgd2Ugd2FudCB0byBoYXZlIHNvbWUgZnJlZSBzcGFjZSB1cCB0bwogCSAqIGFib3V0IDElIG9mIHRoZSBGUyBzaXplLgogCSAqLwogCWlmIChmb3JjZSA9PSBDSFVOS19BTExPQ19MSU1JVEVEKSB7Ci0JCXRocmVzaCA9IGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwkJdGhyZXNoID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CiAJCXRocmVzaCA9IG1heF90KHU2NCwgNjQgKiAxMDI0ICogMTAyNCwKIAkJCSAgICAgICBkaXZfZmFjdG9yX2ZpbmUodGhyZXNoLCAxKSk7CiAKQEAgLTMxOTksNyArMzIzMSw3IEBACiAJaWYgKG51bV9hbGxvY2F0ZWQgKyBhbGxvY19ieXRlcyA8IGRpdl9mYWN0b3IobnVtX2J5dGVzLCA4KSkKIAkJcmV0dXJuIDA7CiAKLQl0aHJlc2ggPSBidHJmc19zdXBlcl90b3RhbF9ieXRlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CisJdGhyZXNoID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CiAKIAkvKiAyNTZNQiBvciA1JSBvZiB0aGUgRlMgKi8KIAl0aHJlc2ggPSBtYXhfdCh1NjQsIDI1NiAqIDEwMjQgKiAxMDI0LCBkaXZfZmFjdG9yX2ZpbmUodGhyZXNoLCA1KSk7CkBAIC0zMzAyLDI0ICszMzM0LDI2IEBACiAvKgogICogc2hyaW5rIG1ldGFkYXRhIHJlc2VydmF0aW9uIGZvciBkZWxhbGxvYwogICovCi1zdGF0aWMgaW50IHNocmlua19kZWxhbGxvYyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgdG9fcmVjbGFpbSwgaW50IHN5bmMpCitzdGF0aWMgaW50IHNocmlua19kZWxhbGxvYyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHRvX3JlY2xhaW0sCisJCQkgICBib29sIHdhaXRfb3JkZXJlZCkKIHsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3Y7CiAJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm87CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CiAJdTY0IHJlc2VydmVkOwogCXU2NCBtYXhfcmVjbGFpbTsKIAl1NjQgcmVjbGFpbWVkID0gMDsKIAlsb25nIHRpbWVfbGVmdDsKLQlpbnQgbnJfcGFnZXMgPSAoMiAqIDEwMjQgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAoMiAqIDEwMjQgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWludCBsb29wcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBwcm9ncmVzczsKIAorCXRyYW5zID0gKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKiljdXJyZW50LT5qb3VybmFsX2luZm87CiAJYmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAlzcGFjZV9pbmZvID0gYmxvY2tfcnN2LT5zcGFjZV9pbmZvOwogCiAJc21wX21iKCk7Ci0JcmVzZXJ2ZWQgPSBzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZDsKKwlyZXNlcnZlZCA9IHNwYWNlX2luZm8tPmJ5dGVzX21heV91c2U7CiAJcHJvZ3Jlc3MgPSBzcGFjZV9pbmZvLT5yZXNlcnZhdGlvbl9wcm9ncmVzczsKIAogCWlmIChyZXNlcnZlZCA9PSAwKQpAQCAtMzMzNCwxOCArMzM2OCwyMCBAQAogCX0KIAogCW1heF9yZWNsYWltID0gbWluKHJlc2VydmVkLCB0b19yZWNsYWltKTsKLQorCW5yX3BhZ2VzID0gbWF4X3QodW5zaWduZWQgbG9uZywgbnJfcGFnZXMsCisJCQkgbWF4X3JlY2xhaW0gPj4gUEFHRV9DQUNIRV9TSElGVCk7CiAJd2hpbGUgKGxvb3BzIDwgMTAyNCkgewogCQkvKiBoYXZlIHRoZSBmbHVzaGVyIHRocmVhZHMganVtcCBpbiBhbmQgZG8gc29tZSBJTyAqLwogCQlzbXBfbWIoKTsKIAkJbnJfcGFnZXMgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBucl9wYWdlcywKIAkJICAgICAgIHJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2J5dGVzID4+IFBBR0VfQ0FDSEVfU0hJRlQpOwotCQl3cml0ZWJhY2tfaW5vZGVzX3NiX25yX2lmX2lkbGUocm9vdC0+ZnNfaW5mby0+c2IsIG5yX3BhZ2VzKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYl9ucl9pZl9pZGxlKHJvb3QtPmZzX2luZm8tPnNiLCBucl9wYWdlcywKKwkJCQkJCVdCX1JFQVNPTl9GU19GUkVFX1NQQUNFKTsKIAogCQlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOwotCQlpZiAocmVzZXJ2ZWQgPiBzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCkKLQkJCXJlY2xhaW1lZCArPSByZXNlcnZlZCAtIHNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkOwotCQlyZXNlcnZlZCA9IHNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkOworCQlpZiAocmVzZXJ2ZWQgPiBzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlKQorCQkJcmVjbGFpbWVkICs9IHJlc2VydmVkIC0gc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZTsKKwkJcmVzZXJ2ZWQgPSBzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlOwogCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAKIAkJbG9vcHMrKzsKQEAgLTMzNTYsMTEgKzMzOTIsMTUgQEAKIAkJaWYgKHRyYW5zICYmIHRyYW5zLT50cmFuc2FjdGlvbi0+YmxvY2tlZCkKIAkJCXJldHVybiAtRUFHQUlOOwogCi0JCXRpbWVfbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwkJaWYgKHdhaXRfb3JkZXJlZCAmJiAhdHJhbnMpIHsKKwkJCWJ0cmZzX3dhaXRfb3JkZXJlZF9leHRlbnRzKHJvb3QsIDAsIDApOworCQl9IGVsc2UgeworCQkJdGltZV9sZWZ0ID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCi0JCS8qIFdlIHdlcmUgaW50ZXJydXB0ZWQsIGV4aXQgKi8KLQkJaWYgKHRpbWVfbGVmdCkKLQkJCWJyZWFrOworCQkJLyogV2Ugd2VyZSBpbnRlcnJ1cHRlZCwgZXhpdCAqLworCQkJaWYgKHRpbWVfbGVmdCkKKwkJCQlicmVhazsKKwkJfQogCiAJCS8qIHdlJ3ZlIGtpY2tlZCB0aGUgSU8gYSBmZXcgdGltZXMsIGlmIGFueXRoaW5nIGhhcyBiZWVuIGZyZWVkLAogCQkgKiBleGl0LiAgVGhlcmUgaXMgbm8gc2Vuc2UgaW4gbG9vcGluZyBoZXJlIGZvciBhIGxvbmcgdGltZQpAQCAtMzM3NSwzNCArMzQxNSw5MCBAQAogCQl9CiAKIAl9Ci0JaWYgKHJlY2xhaW1lZCA+PSB0b19yZWNsYWltICYmICF0cmFucykKLQkJYnRyZnNfd2FpdF9vcmRlcmVkX2V4dGVudHMocm9vdCwgMCwgMCk7CisKIAlyZXR1cm4gcmVjbGFpbWVkID49IHRvX3JlY2xhaW07CiB9CiAKLS8qCi0gKiBSZXRyaWVzIHRlbGxzIHVzIGhvdyBtYW55IHRpbWVzIHdlJ3ZlIGNhbGxlZCByZXNlcnZlX21ldGFkYXRhX2J5dGVzLiAgVGhlCi0gKiBpZGVhIGlzIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgKHJldHJpZXMgPT0gMCkgdGhlbiB3ZSB3aWxsIGFkZCB0byBvdXIKLSAqIHJlc2VydmVkIGNvdW50IGlmIHdlIGNhbid0IG1ha2UgdGhlIGFsbG9jYXRpb24gaW4gb3JkZXIgdG8gaG9sZCBvdXIgcGxhY2UKLSAqIHdoaWxlIHdlIGdvIGFuZCB0cnkgYW5kIGZyZWUgdXAgc3BhY2UuICBUaGF0IHdheSBmb3IgcmV0cmllcyA+IDEgd2UgZG9uJ3QgdHJ5Ci0gKiBhbmQgYWRkIHNwYWNlLCB3ZSBqdXN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgYW1vdW50IG9mIHVudXNlZCBzcGFjZSBpcyA+PSB0aGUKLSAqIHRvdGFsIHNwYWNlLCBtZWFuaW5nIHRoYXQgb3VyIHJlc2VydmF0aW9uIGlzIHZhbGlkLgorLyoqCisgKiBtYXliZV9jb21taXRfdHJhbnNhY3Rpb24gLSBwb3NzaWJseSBjb21taXQgdGhlIHRyYW5zYWN0aW9uIGlmIGl0cyBvayB0bworICogQHJvb3QgLSB0aGUgcm9vdCB3ZSdyZSBhbGxvY2F0aW5nIGZvcgorICogQGJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB3ZSB3YW50IHRvIHJlc2VydmUKKyAqIEBmb3JjZSAtIGZvcmNlIHRoZSBjb21taXQKICAqCi0gKiBIb3dldmVyIGlmIHdlIGRvbid0IGludGVuZCB0byByZXRyeSB0aGlzIHJlc2VydmF0aW9uLCBwYXNzIC0xIGFzIHJldHJpZXMgc28KLSAqIHRoYXQgaXQgc2hvcnQgY2lyY3VpdHMgdGhpcyBsb2dpYy4KKyAqIFRoaXMgd2lsbCBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBjb21taXR0aW5nIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGFjdHVhbGx5CisgKiBnZXQgdXMgc29tZXdoZXJlIGFuZCB0aGVuIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24gaWYgaXQgZG9lcy4gIE90aGVyd2lzZSBpdAorICogd2lsbCByZXR1cm4gLUVOT1NQQy4KICAqLwotc3RhdGljIGludCByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCitzdGF0aWMgaW50IG1heV9jb21taXRfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICBzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbywKKwkJCQkgIHU2NCBieXRlcywgaW50IGZvcmNlKQoreworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmRlbGF5ZWRfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGF5ZWRfYmxvY2tfcnN2OworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCisJdHJhbnMgPSAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqKWN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwlpZiAodHJhbnMpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKGZvcmNlKQorCQlnb3RvIGNvbW1pdDsKKworCS8qIFNlZSBpZiB0aGVyZSBpcyBlbm91Z2ggcGlubmVkIHNwYWNlIHRvIG1ha2UgdGhpcyByZXNlcnZhdGlvbiAqLworCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJaWYgKHNwYWNlX2luZm8tPmJ5dGVzX3Bpbm5lZCA+PSBieXRlcykgeworCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJCWdvdG8gY29tbWl0OworCX0KKwlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisKKwkvKgorCSAqIFNlZSBpZiB0aGVyZSBpcyBzb21lIHNwYWNlIGluIHRoZSBkZWxheWVkIGluc2VydGlvbiByZXNlcnZhdGlvbiBmb3IKKwkgKiB0aGlzIHJlc2VydmF0aW9uLgorCSAqLworCWlmIChzcGFjZV9pbmZvICE9IGRlbGF5ZWRfcnN2LT5zcGFjZV9pbmZvKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXNwaW5fbG9jaygmZGVsYXllZF9yc3YtPmxvY2spOworCWlmIChkZWxheWVkX3Jzdi0+c2l6ZSA8IGJ5dGVzKSB7CisJCXNwaW5fdW5sb2NrKCZkZWxheWVkX3Jzdi0+bG9jayk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKwlzcGluX3VubG9jaygmZGVsYXllZF9yc3YtPmxvY2spOworCitjb21taXQ6CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOworCWlmIChJU19FUlIodHJhbnMpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXJldHVybiBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworfQorCisvKioKKyAqIHJlc2VydmVfbWV0YWRhdGFfYnl0ZXMgLSB0cnkgdG8gcmVzZXJ2ZSBieXRlcyBmcm9tIHRoZSBibG9ja19yc3YncyBzcGFjZQorICogQHJvb3QgLSB0aGUgcm9vdCB3ZSdyZSBhbGxvY2F0aW5nIGZvcgorICogQGJsb2NrX3JzdiAtIHRoZSBibG9ja19yc3Ygd2UncmUgYWxsb2NhdGluZyBmb3IKKyAqIEBvcmlnX2J5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB3ZSB3YW50CisgKiBAZmx1c2ggLSB3ZXRoZXIgb3Igbm90IHdlIGNhbiBmbHVzaCB0byBtYWtlIG91ciByZXNlcnZhdGlvbgorICoKKyAqIFRoaXMgd2lsbCByZXNlcnZlIG9yZ2lfYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHNwYWNlIGluZm8gYXNzb2NpYXRlZAorICogd2l0aCB0aGUgYmxvY2tfcnN2LiAgSWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBpdCB3aWxsIG1ha2UgYW4gYXR0ZW1wdCB0bworICogZmx1c2ggb3V0IHNwYWNlIHRvIG1ha2Ugcm9vbS4gIEl0IHdpbGwgZG8gdGhpcyBieSBmbHVzaGluZyBkZWxhbGxvYyBpZgorICogcG9zc2libGUgb3IgY29tbWl0dGluZyB0aGUgdHJhbnNhY3Rpb24uICBJZiBmbHVzaCBpcyAwIHRoZW4gbm8gYXR0ZW1wdHMgdG8KKyAqIHJlZ2FpbiByZXNlcnZhdGlvbnMgd2lsbCBiZSBtYWRlIGFuZCB0aGlzIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoCisgKiBzcGFjZSBhbHJlYWR5LgorICovCitzdGF0aWMgaW50IHJlc2VydmVfbWV0YWRhdGFfYnl0ZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJICBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsCiAJCQkJICB1NjQgb3JpZ19ieXRlcywgaW50IGZsdXNoKQogewogCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvID0gYmxvY2tfcnN2LT5zcGFjZV9pbmZvOwotCXU2NCB1bnVzZWQ7CisJdTY0IHVzZWQ7CiAJdTY0IG51bV9ieXRlcyA9IG9yaWdfYnl0ZXM7CiAJaW50IHJldHJpZXMgPSAwOwogCWludCByZXQgPSAwOwogCWJvb2wgY29tbWl0dGVkID0gZmFsc2U7CiAJYm9vbCBmbHVzaGluZyA9IGZhbHNlOworCWJvb2wgd2FpdF9vcmRlcmVkID0gZmFsc2U7CiAKIGFnYWluOgogCXJldCA9IDA7CkBAIC0zNDE5LDcgKzM1MTUsNyBAQAogCQkgKiBkZWFkbG9jayBzaW5jZSB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIGZsdXNoZXIgdG8gZmluaXNoLCBidXQKIAkJICogaG9sZCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBvcGVuLgogCQkgKi8KLQkJaWYgKHRyYW5zKQorCQlpZiAoY3VycmVudC0+am91cm5hbF9pbmZvKQogCQkJcmV0dXJuIC1FQUdBSU47CiAJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzcGFjZV9pbmZvLT53YWl0LAogCQkJCQkgICAgICAgIXNwYWNlX2luZm8tPmZsdXNoKTsKQEAgLTM0MzEsOSArMzUyNyw5IEBACiAJfQogCiAJcmV0ID0gLUVOT1NQQzsKLQl1bnVzZWQgPSBzcGFjZV9pbmZvLT5ieXRlc191c2VkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKwotCQkgc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKwotCQkgc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZTsKKwl1c2VkID0gc3BhY2VfaW5mby0+Ynl0ZXNfdXNlZCArIHNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICsKKwkJc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKworCQlzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlOwogCiAJLyoKIAkgKiBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgd2UndmUgbm90IGFscmVhZHkgb3Zlci1yZXNlcnZlZCB0aGUgYmxvY2sgZ3JvdXAKQEAgLTM0NDIsMTAgKzM1MzgsOSBAQAogCSAqIGxldHMgc3RhcnQgZmx1c2hpbmcgc3R1ZmYgZmlyc3QgYW5kIHRoZW4gY29tZSBiYWNrIGFuZCB0cnkgdG8gbWFrZQogCSAqIG91ciByZXNlcnZhdGlvbi4KIAkgKi8KLQlpZiAodW51c2VkIDw9IHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzKSB7Ci0JCXVudXNlZCA9IHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzIC0gdW51c2VkOwotCQlpZiAodW51c2VkID49IG51bV9ieXRlcykgewotCQkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gb3JpZ19ieXRlczsKKwlpZiAodXNlZCA8PSBzcGFjZV9pbmZvLT50b3RhbF9ieXRlcykgeworCQlpZiAodXNlZCArIG9yaWdfYnl0ZXMgPD0gc3BhY2VfaW5mby0+dG90YWxfYnl0ZXMpIHsKKwkJCXNwYWNlX2luZm8tPmJ5dGVzX21heV91c2UgKz0gb3JpZ19ieXRlczsKIAkJCXJldCA9IDA7CiAJCX0gZWxzZSB7CiAJCQkvKgpAQCAtMzQ2MSwxMCArMzU1Niw2NCBAQAogCQkgKiBhbW91bnQgcGx1cyB0aGUgYW1vdW50IG9mIGJ5dGVzIHRoYXQgd2UgbmVlZCBmb3IgdGhpcwogCQkgKiByZXNlcnZhdGlvbi4KIAkJICovCi0JCW51bV9ieXRlcyA9IHVudXNlZCAtIHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzICsKKwkJd2FpdF9vcmRlcmVkID0gdHJ1ZTsKKwkJbnVtX2J5dGVzID0gdXNlZCAtIHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzICsKIAkJCShvcmlnX2J5dGVzICogKHJldHJpZXMgKyAxKSk7CiAJfQogCisJaWYgKHJldCkgeworCQl1NjQgcHJvZmlsZSA9IGJ0cmZzX2dldF9hbGxvY19wcm9maWxlKHJvb3QsIDApOworCQl1NjQgYXZhaWw7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBhIGxvdCBvZiBzcGFjZSB0aGF0J3MgcGlubmVkLCBkb24ndCBib3RoZXIgZG9pbmcKKwkJICogdGhlIG92ZXJjb21taXQgZGFuY2UgeWV0IGFuZCBqdXN0IGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24uCisJCSAqLworCQlhdmFpbCA9IChzcGFjZV9pbmZvLT50b3RhbF9ieXRlcyAtIHNwYWNlX2luZm8tPmJ5dGVzX3VzZWQpICogODsKKwkJZG9fZGl2KGF2YWlsLCAxMCk7CisJCWlmIChzcGFjZV9pbmZvLT5ieXRlc19waW5uZWQgPj0gYXZhaWwgJiYgZmx1c2ggJiYgIWNvbW1pdHRlZCkgeworCQkJc3BhY2VfaW5mby0+Zmx1c2ggPSAxOworCQkJZmx1c2hpbmcgPSB0cnVlOworCQkJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOworCQkJcmV0ID0gbWF5X2NvbW1pdF90cmFuc2FjdGlvbihyb290LCBzcGFjZV9pbmZvLAorCQkJCQkJICAgICBvcmlnX2J5dGVzLCAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCQljb21taXR0ZWQgPSB0cnVlOworCQkJZ290byBhZ2FpbjsKKwkJfQorCisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwkJYXZhaWwgPSByb290LT5mc19pbmZvLT5mcmVlX2NodW5rX3NwYWNlOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgZHVwLCByYWlkMSBvciByYWlkMTAgdGhlbiBvbmx5IGhhbGYgb2YgdGhlIGZyZWUKKwkJICogc3BhY2UgaXMgYWN0dWFsbHkgdXNlYWJsZS4KKwkJICovCisJCWlmIChwcm9maWxlICYgKEJUUkZTX0JMT0NLX0dST1VQX0RVUCB8CisJCQkgICAgICAgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEgfAorCQkJICAgICAgIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkpCisJCQlhdmFpbCA+Pj0gMTsKKworCQkvKgorCQkgKiBJZiB3ZSBhcmVuJ3QgZmx1c2hpbmcgZG9uJ3QgbGV0IHVzIG92ZXJjb21taXQgdG9vIG11Y2gsIHNheQorCQkgKiAxLzh0aCBvZiB0aGUgc3BhY2UuICBJZiB3ZSBjYW4gZmx1c2gsIGxldCBpdCBvdmVyY29tbWl0IHVwIHRvCisJCSAqIDEvMiBvZiB0aGUgc3BhY2UuCisJCSAqLworCQlpZiAoZmx1c2gpCisJCQlhdmFpbCA+Pj0gMzsKKwkJZWxzZQorCQkJYXZhaWwgPj49IDE7CisJCSBzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKworCQlpZiAodXNlZCArIG51bV9ieXRlcyA8IHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzICsgYXZhaWwpIHsKKwkJCXNwYWNlX2luZm8tPmJ5dGVzX21heV91c2UgKz0gb3JpZ19ieXRlczsKKwkJCXJldCA9IDA7CisJCX0gZWxzZSB7CisJCQl3YWl0X29yZGVyZWQgPSB0cnVlOworCQl9CisJfQorCiAJLyoKIAkgKiBDb3VsZG4ndCBtYWtlIG91ciByZXNlcnZhdGlvbiwgc2F2ZSBvdXIgcGxhY2Ugc28gd2hpbGUgd2UncmUgdHJ5aW5nCiAJICogdG8gcmVjbGFpbSBzcGFjZSB3ZSBjYW4gYWN0dWFsbHkgdXNlIGl0IGluc3RlYWQgb2Ygc29tZWJvZHkgZWxzZQpAQCAtMzQ4NCw3ICszNjMzLDcgQEAKIAkgKiBXZSBkbyBzeW5jaHJvbm91cyBzaHJpbmtpbmcgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHkgdW5yZXNlcnZlCiAJICogbWV0YWRhdGEgdW50aWwgYWZ0ZXIgdGhlIElPIGlzIGNvbXBsZXRlZC4KIAkgKi8KLQlyZXQgPSBzaHJpbmtfZGVsYWxsb2ModHJhbnMsIHJvb3QsIG51bV9ieXRlcywgMSk7CisJcmV0ID0gc2hyaW5rX2RlbGFsbG9jKHJvb3QsIG51bV9ieXRlcywgd2FpdF9vcmRlcmVkKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTM0OTYsMzUgKzM2NDUsMTcgQEAKIAkgKiBzbyBnbyBiYWNrIGFyb3VuZCBhbmQgdHJ5IGFnYWluLgogCSAqLwogCWlmIChyZXRyaWVzIDwgMikgeworCQl3YWl0X29yZGVyZWQgPSB0cnVlOwogCQlyZXRyaWVzKys7CiAJCWdvdG8gYWdhaW47CiAJfQogCi0JLyoKLQkgKiBOb3QgZW5vdWdoIHNwYWNlIHRvIGJlIHJlY2xhaW1lZCwgZG9uJ3QgYm90aGVyIGNvbW1pdHRpbmcgdGhlCi0JICogdHJhbnNhY3Rpb24uCi0JICovCi0Jc3Bpbl9sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKLQlpZiAoc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkIDwgb3JpZ19ieXRlcykKLQkJcmV0ID0gLUVOT1NQQzsKLQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSAtRUFHQUlOOwotCWlmICh0cmFucykKLQkJZ290byBvdXQ7Ci0KIAlyZXQgPSAtRU5PU1BDOwogCWlmIChjb21taXR0ZWQpCiAJCWdvdG8gb3V0OwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwotCWlmIChJU19FUlIodHJhbnMpKQotCQlnb3RvIG91dDsKLQlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCXJldCA9IG1heV9jb21taXRfdHJhbnNhY3Rpb24ocm9vdCwgc3BhY2VfaW5mbywgb3JpZ19ieXRlcywgMCk7CiAJaWYgKCFyZXQpIHsKLQkJdHJhbnMgPSBOVUxMOwogCQljb21taXR0ZWQgPSB0cnVlOwogCQlnb3RvIGFnYWluOwogCX0KQEAgLTM1NDIsMTAgKzM2NzMsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpnZXRfYmxvY2tfcnN2KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQogewotCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdjsKLQlpZiAocm9vdC0+cmVmX2Nvd3MpCisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2ID0gTlVMTDsKKworCWlmIChyb290LT5yZWZfY293cyB8fCByb290ID09IHJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdCkKIAkJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQllbHNlCisKKwlpZiAoIWJsb2NrX3JzdikKIAkJYmxvY2tfcnN2ID0gcm9vdC0+YmxvY2tfcnN2OwogCiAJaWYgKCFibG9ja19yc3YpCkBAIC0zNjE2LDcgKzM3NDksNyBAQAogCQl9CiAJCWlmIChudW1fYnl0ZXMpIHsKIAkJCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7Ci0JCQlzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CisJCQlzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlIC09IG51bV9ieXRlczsKIAkJCXNwYWNlX2luZm8tPnJlc2VydmF0aW9uX3Byb2dyZXNzKys7CiAJCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAJCX0KQEAgLTM2NDAsOSArMzc3Myw2IEBACiB7CiAJbWVtc2V0KHJzdiwgMCwgc2l6ZW9mKCpyc3YpKTsKIAlzcGluX2xvY2tfaW5pdCgmcnN2LT5sb2NrKTsKLQlhdG9taWNfc2V0KCZyc3YtPnVzYWdlLCAxKTsKLQlyc3YtPnByaW9yaXR5ID0gNjsKLQlJTklUX0xJU1RfSEVBRCgmcnN2LT5saXN0KTsKIH0KIAogc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYnRyZnNfYWxsb2NfYmxvY2tfcnN2KHN0cnVjdCBidHJmc19yb290ICpyb290KQpAQCAtMzY2MywzOCArMzc5MywyMCBAQAogdm9pZCBidHJmc19mcmVlX2Jsb2NrX3JzdihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2KQogewotCWlmIChyc3YgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmcnN2LT51c2FnZSkpIHsKLQkJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgcnN2LCAodTY0KS0xKTsKLQkJaWYgKCFyc3YtPmR1cmFibGUpCi0JCQlrZnJlZShyc3YpOwotCX0KKwlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCByc3YsICh1NjQpLTEpOworCWtmcmVlKHJzdik7CiB9CiAKLS8qCi0gKiBtYWtlIHRoZSBibG9ja19yc3Ygc3RydWN0IGJlIGFibGUgdG8gY2FwdHVyZSBmcmVlZCBzcGFjZS4KLSAqIHRoZSBjYXB0dXJlZCBzcGFjZSB3aWxsIHJlLWFkZCB0byB0aGUgdGhlIGJsb2NrX3JzdiBzdHJ1Y3QKLSAqIGFmdGVyIHRyYW5zYWN0aW9uIGNvbW1pdAotICovCi12b2lkIGJ0cmZzX2FkZF9kdXJhYmxlX2Jsb2NrX3JzdihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKLQkJCQkgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2KQotewotCWJsb2NrX3Jzdi0+ZHVyYWJsZSA9IDE7Ci0JbXV0ZXhfbG9jaygmZnNfaW5mby0+ZHVyYWJsZV9ibG9ja19yc3ZfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmJsb2NrX3Jzdi0+bGlzdCwgJmZzX2luZm8tPmR1cmFibGVfYmxvY2tfcnN2X2xpc3QpOwotCW11dGV4X3VubG9jaygmZnNfaW5mby0+ZHVyYWJsZV9ibG9ja19yc3ZfbXV0ZXgpOwotfQotCi1pbnQgYnRyZnNfYmxvY2tfcnN2X2FkZChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LAotCQkJdTY0IG51bV9ieXRlcykKK3N0YXRpYyBpbmxpbmUgaW50IF9fYmxvY2tfcnN2X2FkZChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiwKKwkJCQkgIHU2NCBudW1fYnl0ZXMsIGludCBmbHVzaCkKIHsKIAlpbnQgcmV0OwogCiAJaWYgKG51bV9ieXRlcyA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHJlc2VydmVfbWV0YWRhdGFfYnl0ZXModHJhbnMsIHJvb3QsIGJsb2NrX3JzdiwgbnVtX2J5dGVzLCAxKTsKKwlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHJvb3QsIGJsb2NrX3JzdiwgbnVtX2J5dGVzLCBmbHVzaCk7CiAJaWYgKCFyZXQpIHsKIAkJYmxvY2tfcnN2X2FkZF9ieXRlcyhibG9ja19yc3YsIG51bV9ieXRlcywgMSk7CiAJCXJldHVybiAwOwpAQCAtMzcwMyw1NSArMzgxNSw2NiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBidHJmc19ibG9ja19yc3ZfY2hlY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJICBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsCi0JCQkgIHU2NCBtaW5fcmVzZXJ2ZWQsIGludCBtaW5fZmFjdG9yKQoraW50IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsCisJCQl1NjQgbnVtX2J5dGVzKQoreworCXJldHVybiBfX2Jsb2NrX3Jzdl9hZGQocm9vdCwgYmxvY2tfcnN2LCBudW1fYnl0ZXMsIDEpOworfQorCitpbnQgYnRyZnNfYmxvY2tfcnN2X2FkZF9ub2ZsdXNoKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiwKKwkJCQl1NjQgbnVtX2J5dGVzKQoreworCXJldHVybiBfX2Jsb2NrX3Jzdl9hZGQocm9vdCwgYmxvY2tfcnN2LCBudW1fYnl0ZXMsIDApOworfQorCitpbnQgYnRyZnNfYmxvY2tfcnN2X2NoZWNrKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsIGludCBtaW5fZmFjdG9yKQogewogCXU2NCBudW1fYnl0ZXMgPSAwOwotCWludCBjb21taXRfdHJhbnMgPSAwOwogCWludCByZXQgPSAtRU5PU1BDOwogCiAJaWYgKCFibG9ja19yc3YpCiAJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrKCZibG9ja19yc3YtPmxvY2spOwotCWlmIChtaW5fZmFjdG9yID4gMCkKLQkJbnVtX2J5dGVzID0gZGl2X2ZhY3RvcihibG9ja19yc3YtPnNpemUsIG1pbl9mYWN0b3IpOwotCWlmIChtaW5fcmVzZXJ2ZWQgPiBudW1fYnl0ZXMpCi0JCW51bV9ieXRlcyA9IG1pbl9yZXNlcnZlZDsKLQotCWlmIChibG9ja19yc3YtPnJlc2VydmVkID49IG51bV9ieXRlcykgeworCW51bV9ieXRlcyA9IGRpdl9mYWN0b3IoYmxvY2tfcnN2LT5zaXplLCBtaW5fZmFjdG9yKTsKKwlpZiAoYmxvY2tfcnN2LT5yZXNlcnZlZCA+PSBudW1fYnl0ZXMpCiAJCXJldCA9IDA7Ci0JfSBlbHNlIHsKLQkJbnVtX2J5dGVzIC09IGJsb2NrX3Jzdi0+cmVzZXJ2ZWQ7Ci0JCWlmIChibG9ja19yc3YtPmR1cmFibGUgJiYKLQkJICAgIGJsb2NrX3Jzdi0+ZnJlZWRbMF0gKyBibG9ja19yc3YtPmZyZWVkWzFdID49IG51bV9ieXRlcykKLQkJCWNvbW1pdF90cmFucyA9IDE7Ci0JfQogCXNwaW5fdW5sb2NrKCZibG9ja19yc3YtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGJ0cmZzX2Jsb2NrX3Jzdl9yZWZpbGwoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiwKKwkJCSAgdTY0IG1pbl9yZXNlcnZlZCkKK3sKKwl1NjQgbnVtX2J5dGVzID0gMDsKKwlpbnQgcmV0ID0gLUVOT1NQQzsKKworCWlmICghYmxvY2tfcnN2KQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9jaygmYmxvY2tfcnN2LT5sb2NrKTsKKwludW1fYnl0ZXMgPSBtaW5fcmVzZXJ2ZWQ7CisJaWYgKGJsb2NrX3Jzdi0+cmVzZXJ2ZWQgPj0gbnVtX2J5dGVzKQorCQlyZXQgPSAwOworCWVsc2UKKwkJbnVtX2J5dGVzIC09IGJsb2NrX3Jzdi0+cmVzZXJ2ZWQ7CisJc3Bpbl91bmxvY2soJmJsb2NrX3Jzdi0+bG9jayk7CisKIAlpZiAoIXJldCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoYmxvY2tfcnN2LT5yZWZpbGxfdXNlZCkgewotCQlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHRyYW5zLCByb290LCBibG9ja19yc3YsCi0JCQkJCSAgICAgbnVtX2J5dGVzLCAwKTsKLQkJaWYgKCFyZXQpIHsKLQkJCWJsb2NrX3Jzdl9hZGRfYnl0ZXMoYmxvY2tfcnN2LCBudW1fYnl0ZXMsIDApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlpZiAoY29tbWl0X3RyYW5zKSB7Ci0JCWlmICh0cmFucykKLQkJCXJldHVybiAtRUFHQUlOOwotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7Ci0JCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHJvb3QsIGJsb2NrX3JzdiwgbnVtX2J5dGVzLCAxKTsKKwlpZiAoIXJldCkgeworCQlibG9ja19yc3ZfYWRkX2J5dGVzKGJsb2NrX3JzdiwgbnVtX2J5dGVzLCAwKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIC1FTk9TUEM7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKHN0cnVjdCBidHJmc19ibG9ja19yc3YgKnNyY19yc3YsCkBAIC0zNzgzLDcgKzM5MDYsNyBAQAogCXU2NCBudW1fYnl0ZXM7CiAJdTY0IG1ldGFfdXNlZDsKIAl1NjQgZGF0YV91c2VkOwotCWludCBjc3VtX3NpemUgPSBidHJmc19zdXBlcl9jc3VtX3NpemUoJmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWludCBjc3VtX3NpemUgPSBidHJmc19zdXBlcl9jc3VtX3NpemUoZnNfaW5mby0+c3VwZXJfY29weSk7CiAKIAlzaW5mbyA9IF9fZmluZF9zcGFjZV9pbmZvKGZzX2luZm8sIEJUUkZTX0JMT0NLX0dST1VQX0RBVEEpOwogCXNwaW5fbG9jaygmc2luZm8tPmxvY2spOwpAQCAtMzgyNywxMiArMzk1MCwxMiBAQAogCWlmIChzaW5mby0+dG90YWxfYnl0ZXMgPiBudW1fYnl0ZXMpIHsKIAkJbnVtX2J5dGVzID0gc2luZm8tPnRvdGFsX2J5dGVzIC0gbnVtX2J5dGVzOwogCQlibG9ja19yc3YtPnJlc2VydmVkICs9IG51bV9ieXRlczsKLQkJc2luZm8tPmJ5dGVzX3Jlc2VydmVkICs9IG51bV9ieXRlczsKKwkJc2luZm8tPmJ5dGVzX21heV91c2UgKz0gbnVtX2J5dGVzOwogCX0KIAogCWlmIChibG9ja19yc3YtPnJlc2VydmVkID49IGJsb2NrX3Jzdi0+c2l6ZSkgewogCQludW1fYnl0ZXMgPSBibG9ja19yc3YtPnJlc2VydmVkIC0gYmxvY2tfcnN2LT5zaXplOwotCQlzaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgLT0gbnVtX2J5dGVzOworCQlzaW5mby0+Ynl0ZXNfbWF5X3VzZSAtPSBudW1fYnl0ZXM7CiAJCXNpbmZvLT5yZXNlcnZhdGlvbl9wcm9ncmVzcysrOwogCQlibG9ja19yc3YtPnJlc2VydmVkID0gYmxvY2tfcnN2LT5zaXplOwogCQlibG9ja19yc3YtPmZ1bGwgPSAxOwpAQCAtMzg0OCwxNiArMzk3MSwxMyBAQAogCiAJc3BhY2VfaW5mbyA9IF9fZmluZF9zcGFjZV9pbmZvKGZzX2luZm8sIEJUUkZTX0JMT0NLX0dST1VQX1NZU1RFTSk7CiAJZnNfaW5mby0+Y2h1bmtfYmxvY2tfcnN2LnNwYWNlX2luZm8gPSBzcGFjZV9pbmZvOwotCWZzX2luZm8tPmNodW5rX2Jsb2NrX3Jzdi5wcmlvcml0eSA9IDEwOwogCiAJc3BhY2VfaW5mbyA9IF9fZmluZF9zcGFjZV9pbmZvKGZzX2luZm8sIEJUUkZTX0JMT0NLX0dST1VQX01FVEFEQVRBKTsKIAlmc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LnNwYWNlX2luZm8gPSBzcGFjZV9pbmZvOwotCWZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3YucHJpb3JpdHkgPSAxMDsKLQlmc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LnJlZmlsbF91c2VkID0gMTsKIAlmc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3Yuc3BhY2VfaW5mbyA9IHNwYWNlX2luZm87CiAJZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2LnNwYWNlX2luZm8gPSBzcGFjZV9pbmZvOwogCWZzX2luZm8tPmVtcHR5X2Jsb2NrX3Jzdi5zcGFjZV9pbmZvID0gc3BhY2VfaW5mbzsKLQlmc19pbmZvLT5lbXB0eV9ibG9ja19yc3YucHJpb3JpdHkgPSAxMDsKKwlmc19pbmZvLT5kZWxheWVkX2Jsb2NrX3Jzdi5zcGFjZV9pbmZvID0gc3BhY2VfaW5mbzsKIAogCWZzX2luZm8tPmV4dGVudF9yb290LT5ibG9ja19yc3YgPSAmZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKIAlmc19pbmZvLT5jc3VtX3Jvb3QtPmJsb2NrX3JzdiA9ICZmc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OwpAQCAtMzg2NSwxMCArMzk4NSw2IEBACiAJZnNfaW5mby0+dHJlZV9yb290LT5ibG9ja19yc3YgPSAmZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKIAlmc19pbmZvLT5jaHVua19yb290LT5ibG9ja19yc3YgPSAmZnNfaW5mby0+Y2h1bmtfYmxvY2tfcnN2OwogCi0JYnRyZnNfYWRkX2R1cmFibGVfYmxvY2tfcnN2KGZzX2luZm8sICZmc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2KTsKLQotCWJ0cmZzX2FkZF9kdXJhYmxlX2Jsb2NrX3Jzdihmc19pbmZvLCAmZnNfaW5mby0+ZGVsYWxsb2NfYmxvY2tfcnN2KTsKLQogCXVwZGF0ZV9nbG9iYWxfYmxvY2tfcnN2KGZzX2luZm8pOwogfQogCkBAIC0zODgxLDM3ICszOTk3LDggQEAKIAlXQVJOX09OKGZzX2luZm8tPnRyYW5zX2Jsb2NrX3Jzdi5yZXNlcnZlZCA+IDApOwogCVdBUk5fT04oZnNfaW5mby0+Y2h1bmtfYmxvY2tfcnN2LnNpemUgPiAwKTsKIAlXQVJOX09OKGZzX2luZm8tPmNodW5rX2Jsb2NrX3Jzdi5yZXNlcnZlZCA+IDApOwotfQotCi1pbnQgYnRyZnNfdHJ1bmNhdGVfcmVzZXJ2ZV9tZXRhZGF0YShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJICAgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdikKLXsKLQlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICp0cmFuc19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2OwotCXU2NCBudW1fYnl0ZXM7Ci0JaW50IHJldDsKLQotCS8qCi0JICogVHJ1bmNhdGUgc2hvdWxkIGJlIGZyZWVpbmcgZGF0YSwgYnV0IGdpdmUgdXMgMiBpdGVtcyBqdXN0IGluIGNhc2UgaXQKLQkgKiBuZWVkcyB0byB1c2Ugc29tZSBzcGFjZS4gIFdlIG1heSB3YW50IHRvIGJlIHNtYXJ0ZXIgYWJvdXQgdGhpcyBpbiB0aGUKLQkgKiBmdXR1cmUuCi0JICovCi0JbnVtX2J5dGVzID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIDIpOwotCi0JLyogV2UgYWxyZWFkeSBoYXZlIGVub3VnaCBieXRlcywganVzdCByZXR1cm4gKi8KLQlpZiAocnN2LT5yZXNlcnZlZCA+PSBudW1fYnl0ZXMpCi0JCXJldHVybiAwOwotCi0JbnVtX2J5dGVzIC09IHJzdi0+cmVzZXJ2ZWQ7Ci0KLQkvKgotCSAqIFlvdSBzaG91bGQgaGF2ZSByZXNlcnZlZCBlbm91Z2ggc3BhY2UgYmVmb3JlIGhhbmQgdG8gZG8gdGhpcywgc28gdGhpcwotCSAqIHNob3VsZCBub3QgZmFpbC4KLQkgKi8KLQlyZXQgPSBibG9ja19yc3ZfbWlncmF0ZV9ieXRlcyh0cmFuc19yc3YsIHJzdiwgbnVtX2J5dGVzKTsKLQlCVUdfT04ocmV0KTsKLQotCXJldHVybiAwOworCVdBUk5fT04oZnNfaW5mby0+ZGVsYXllZF9ibG9ja19yc3Yuc2l6ZSA+IDApOworCVdBUk5fT04oZnNfaW5mby0+ZGVsYXllZF9ibG9ja19yc3YucmVzZXJ2ZWQgPiAwKTsKIH0KIAogdm9pZCBidHJmc190cmFuc19yZWxlYXNlX21ldGFkYXRhKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLApAQCAtMzkyMCw5ICs0MDA3LDcgQEAKIAlpZiAoIXRyYW5zLT5ieXRlc19yZXNlcnZlZCkKIAkJcmV0dXJuOwogCi0JQlVHX09OKHRyYW5zLT5ibG9ja19yc3YgIT0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3Jzdik7Ci0JYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgdHJhbnMtPmJsb2NrX3JzdiwKLQkJCQl0cmFucy0+Ynl0ZXNfcmVzZXJ2ZWQpOworCWJ0cmZzX2Jsb2NrX3Jzdl9yZWxlYXNlKHJvb3QsIHRyYW5zLT5ibG9ja19yc3YsIHRyYW5zLT5ieXRlc19yZXNlcnZlZCk7CiAJdHJhbnMtPmJ5dGVzX3Jlc2VydmVkID0gMDsKIH0KIApAQCAtMzk2NCwzMyArNDA0OSw5OSBAQAogCXJldHVybiBibG9ja19yc3ZfbWlncmF0ZV9ieXRlcyhzcmNfcnN2LCBkc3RfcnN2LCBudW1fYnl0ZXMpOwogfQogCisvKioKKyAqIGRyb3Bfb3V0c3RhbmRpbmdfZXh0ZW50IC0gZHJvcCBhbiBvdXRzdGFuZGluZyBleHRlbnQKKyAqIEBpbm9kZTogdGhlIGlub2RlIHdlJ3JlIGRyb3BwaW5nIHRoZSBleHRlbnQgZm9yCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBhcmUgZnJlZWluZyB1cCBhbiBvdXRzdGFuZGluZyBleHRlbnQsIGVpdGhlciBjYWxsZWQKKyAqIGFmdGVyIGFuIGVycm9yIG9yIGFmdGVyIGFuIGV4dGVudCBpcyB3cml0dGVuLiAgVGhpcyB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mCisgKiByZXNlcnZlZCBleHRlbnRzIHRoYXQgbmVlZCB0byBiZSBmcmVlZC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aAorICogQlRSRlNfSShpbm9kZSktPmxvY2sgaGVsZC4KKyAqLwogc3RhdGljIHVuc2lnbmVkIGRyb3Bfb3V0c3RhbmRpbmdfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJdW5zaWduZWQgZHJvcF9pbm9kZV9zcGFjZSA9IDA7CiAJdW5zaWduZWQgZHJvcHBlZF9leHRlbnRzID0gMDsKIAotCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwogCUJVR19PTighQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMpOwogCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzLS07CiAKKwlpZiAoQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMgPT0gMCAmJgorCSAgICBCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfbWV0YV9yZXNlcnZlZCkgeworCQlkcm9wX2lub2RlX3NwYWNlID0gMTsKKwkJQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQgPSAwOworCX0KKwogCS8qCiAJICogSWYgd2UgaGF2ZSBtb3JlIG9yIHRoZSBzYW1lIGFtb3VudCBvZiBvdXRzYW5kaW5nIGV4dGVudHMgdGhhbiB3ZSBoYXZlCiAJICogcmVzZXJ2ZWQgdGhlbiB3ZSBuZWVkIHRvIGxlYXZlIHRoZSByZXNlcnZlZCBleHRlbnRzIGNvdW50IGFsb25lLgogCSAqLwogCWlmIChCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyA+PQogCSAgICBCVFJGU19JKGlub2RlKS0+cmVzZXJ2ZWRfZXh0ZW50cykKLQkJZ290byBvdXQ7CisJCXJldHVybiBkcm9wX2lub2RlX3NwYWNlOwogCiAJZHJvcHBlZF9leHRlbnRzID0gQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2V4dGVudHMgLQogCQlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50czsKIAlCVFJGU19JKGlub2RlKS0+cmVzZXJ2ZWRfZXh0ZW50cyAtPSBkcm9wcGVkX2V4dGVudHM7Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKLQlyZXR1cm4gZHJvcHBlZF9leHRlbnRzOworCXJldHVybiBkcm9wcGVkX2V4dGVudHMgKyBkcm9wX2lub2RlX3NwYWNlOwogfQogCi1zdGF0aWMgdTY0IGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBudW1fYnl0ZXMpCisvKioKKyAqIGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplIC0gcmV0dXJuIHRoZSBhbW91bnQgb2YgbWV0YWRhIHNwYWNlIHRoYXQgbXVzdCBiZQorICoJcmVzZXJ2ZWQvZnJlZSdkIGZvciB0aGUgZ2l2ZW4gYnl0ZXMuCisgKiBAaW5vZGU6IHRoZSBpbm9kZSB3ZSdyZSBtYW5pcHVsYXRpbmcKKyAqIEBudW1fYnl0ZXM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gcXVlc3Rpb24KKyAqIEByZXNlcnZlOiAxIGlmIHdlIGFyZSByZXNlcnZpbmcgc3BhY2UsIDAgaWYgd2UgYXJlIGZyZWVpbmcgc3BhY2UKKyAqCisgKiBUaGlzIGFkanVzdHMgdGhlIG51bWJlciBvZiBjc3VtX2J5dGVzIGluIHRoZSBpbm9kZSBhbmQgdGhlbiByZXR1cm5zIHRoZQorICogY29ycmVjdCBhbW91bnQgb2YgbWV0YWRhdGEgdGhhdCBtdXN0IGVpdGhlciBiZSByZXNlcnZlZCBvciBmcmVlZC4gIFdlCisgKiBjYWxjdWxhdGUgaG93IG1hbnkgY2hlY2tzdW1zIHdlIGNhbiBmaXQgaW50byBvbmUgbGVhZiBhbmQgdGhlbiBkaXZpZGUgdGhlCisgKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3aWxsIG5lZWQgdG8gYmUgY2hlY2tzdW1lZCBieSB0aGlzIHZhbHVlIHRvIGZpZ3VyZSBvdXQKKyAqIGhvdyBtYW55IGNoZWNrc3VtcyB3aWxsIGJlIHJlcXVpcmVkLiAgSWYgd2UgYXJlIGFkZGluZyBieXRlcyB0aGVuIHRoZSBudW1iZXIKKyAqIG1heSBnbyB1cCBhbmQgd2Ugd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzIHRoYXQgbXVzdCBiZQorICogcmVzZXJ2ZWQuICBJZiBpdCBpcyBnb2luZyBkb3duIHdlIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0CisgKiBiZSBmcmVlZC4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHdpdGggQlRSRlNfSShpbm9kZSktPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIHU2NCBjYWxjX2NzdW1fbWV0YWRhdGFfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbnVtX2J5dGVzLAorCQkJCSAgIGludCByZXNlcnZlKQogewotCXJldHVybiBudW1fYnl0ZXMgPj49IDM7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwl1NjQgY3N1bV9zaXplOworCWludCBudW1fY3N1bXNfcGVyX2xlYWY7CisJaW50IG51bV9jc3VtczsKKwlpbnQgb2xkX2NzdW1zOworCisJaWYgKEJUUkZTX0koaW5vZGUpLT5mbGFncyAmIEJUUkZTX0lOT0RFX05PREFUQVNVTSAmJgorCSAgICBCVFJGU19JKGlub2RlKS0+Y3N1bV9ieXRlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCW9sZF9jc3VtcyA9IChpbnQpZGl2NjRfdTY0KEJUUkZTX0koaW5vZGUpLT5jc3VtX2J5dGVzLCByb290LT5zZWN0b3JzaXplKTsKKwlpZiAocmVzZXJ2ZSkKKwkJQlRSRlNfSShpbm9kZSktPmNzdW1fYnl0ZXMgKz0gbnVtX2J5dGVzOworCWVsc2UKKwkJQlRSRlNfSShpbm9kZSktPmNzdW1fYnl0ZXMgLT0gbnVtX2J5dGVzOworCWNzdW1fc2l6ZSA9IEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpIC0gc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKTsKKwludW1fY3N1bXNfcGVyX2xlYWYgPSAoaW50KWRpdjY0X3U2NChjc3VtX3NpemUsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2NzdW1faXRlbSkgKworCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBidHJmc19kaXNrX2tleSkpOworCW51bV9jc3VtcyA9IChpbnQpZGl2NjRfdTY0KEJUUkZTX0koaW5vZGUpLT5jc3VtX2J5dGVzLCByb290LT5zZWN0b3JzaXplKTsKKwludW1fY3N1bXMgPSBudW1fY3N1bXMgKyBudW1fY3N1bXNfcGVyX2xlYWYgLSAxOworCW51bV9jc3VtcyA9IG51bV9jc3VtcyAvIG51bV9jc3Vtc19wZXJfbGVhZjsKKworCW9sZF9jc3VtcyA9IG9sZF9jc3VtcyArIG51bV9jc3Vtc19wZXJfbGVhZiAtIDE7CisJb2xkX2NzdW1zID0gb2xkX2NzdW1zIC8gbnVtX2NzdW1zX3Blcl9sZWFmOworCisJLyogTm8gY2hhbmdlLCBubyBuZWVkIHRvIHJlc2VydmUgbW9yZSAqLworCWlmIChvbGRfY3N1bXMgPT0gbnVtX2NzdW1zKQorCQlyZXR1cm4gMDsKKworCWlmIChyZXNlcnZlKQorCQlyZXR1cm4gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsCisJCQkJCQkgICAgICBudW1fY3N1bXMgLSBvbGRfY3N1bXMpOworCisJcmV0dXJuIGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCBvbGRfY3N1bXMgLSBudW1fY3N1bXMpOwogfQogCiBpbnQgYnRyZnNfZGVsYWxsb2NfcmVzZXJ2ZV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbnVtX2J5dGVzKQpAQCAtMzk5OSw5ICs0MTUwLDEzIEBACiAJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAl1NjQgdG9fcmVzZXJ2ZSA9IDA7CiAJdW5zaWduZWQgbnJfZXh0ZW50cyA9IDA7CisJaW50IGZsdXNoID0gMTsKIAlpbnQgcmV0OwogCi0JaWYgKGJ0cmZzX3RyYW5zYWN0aW9uX2luX2NvbW1pdChyb290LT5mc19pbmZvKSkKKwlpZiAoYnRyZnNfaXNfZnJlZV9zcGFjZV9pbm9kZShyb290LCBpbm9kZSkpCisJCWZsdXNoID0gMDsKKworCWlmIChmbHVzaCAmJiBidHJmc190cmFuc2FjdGlvbl9pbl9jb21taXQocm9vdC0+ZnNfaW5mbykpCiAJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CiAKIAludW1fYnl0ZXMgPSBBTElHTihudW1fYnl0ZXMsIHJvb3QtPnNlY3RvcnNpemUpOwpAQCAtNDAxNCwyMSArNDE2OSw0MSBAQAogCQlucl9leHRlbnRzID0gQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMgLQogCQkJQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2V4dGVudHM7CiAJCUJUUkZTX0koaW5vZGUpLT5yZXNlcnZlZF9leHRlbnRzICs9IG5yX2V4dGVudHM7Ci0KLQkJdG9fcmVzZXJ2ZSA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCBucl9leHRlbnRzKTsKIAl9CisKKwkvKgorCSAqIEFkZCBhbiBpdGVtIHRvIHJlc2VydmUgZm9yIHVwZGF0aW5nIHRoZSBpbm9kZSB3aGVuIHdlIGNvbXBsZXRlIHRoZQorCSAqIGRlbGFsbG9jIGlvLgorCSAqLworCWlmICghQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQpIHsKKwkJbnJfZXh0ZW50cysrOworCQlCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfbWV0YV9yZXNlcnZlZCA9IDE7CisJfQorCisJdG9fcmVzZXJ2ZSA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCBucl9leHRlbnRzKTsKKwl0b19yZXNlcnZlICs9IGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplKGlub2RlLCBudW1fYnl0ZXMsIDEpOwogCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CiAKLQl0b19yZXNlcnZlICs9IGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplKGlub2RlLCBudW1fYnl0ZXMpOwotCXJldCA9IHJlc2VydmVfbWV0YWRhdGFfYnl0ZXMoTlVMTCwgcm9vdCwgYmxvY2tfcnN2LCB0b19yZXNlcnZlLCAxKTsKKwlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHJvb3QsIGJsb2NrX3JzdiwgdG9fcmVzZXJ2ZSwgZmx1c2gpOwogCWlmIChyZXQpIHsKKwkJdTY0IHRvX2ZyZWUgPSAwOwogCQl1bnNpZ25lZCBkcm9wcGVkOwotCQkvKgotCQkgKiBXZSBkb24ndCBuZWVkIHRoZSByZXR1cm4gdmFsdWUgc2luY2Ugb3VyIHJlc2VydmF0aW9uIGZhaWxlZCwKLQkJICogd2UganVzdCBuZWVkIHRvIGNsZWFuIHVwIG91ciBjb3VudGVyLgotCQkgKi8KKworCQlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKIAkJZHJvcHBlZCA9IGRyb3Bfb3V0c3RhbmRpbmdfZXh0ZW50KGlub2RlKTsKLQkJV0FSTl9PTihkcm9wcGVkID4gMSk7CisJCXRvX2ZyZWUgPSBjYWxjX2NzdW1fbWV0YWRhdGFfc2l6ZShpbm9kZSwgbnVtX2J5dGVzLCAwKTsKKwkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKKwkJdG9fZnJlZSArPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgZHJvcHBlZCk7CisKKwkJLyoKKwkJICogU29tZWJvZHkgY291bGQgaGF2ZSBjb21lIGluIGFuZCB0d2lkZGxlZCB3aXRoIHRoZQorCQkgKiByZXNlcnZhdGlvbiwgc28gaWYgd2UgaGF2ZSB0byBmcmVlIG1vcmUgdGhhbiB3ZSB3b3VsZCBoYXZlCisJCSAqIHJlc2VydmVkIGZyb20gdGhpcyByZXNlcnZhdGlvbiBnbyBhaGVhZCBhbmQgcmVsZWFzZSB0aG9zZQorCQkgKiBieXRlcy4KKwkJICovCisJCXRvX2ZyZWUgLT0gdG9fcmVzZXJ2ZTsKKwkJaWYgKHRvX2ZyZWUpCisJCQlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCBibG9ja19yc3YsIHRvX2ZyZWUpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNDAzNyw2ICs0MjEyLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9tZXRhZGF0YSAtIHJlbGVhc2UgYSBtZXRhZGF0YSByZXNlcnZhdGlvbiBmb3IgYW4gaW5vZGUKKyAqIEBpbm9kZTogdGhlIGlub2RlIHRvIHJlbGVhc2UgdGhlIHJlc2VydmF0aW9uIGZvcgorICogQG51bV9ieXRlczogdGhlIG51bWJlciBvZiBieXRlcyB3ZSdyZSByZWxlYXNpbmcKKyAqCisgKiBUaGlzIHdpbGwgcmVsZWFzZSB0aGUgbWV0YWRhdGEgcmVzZXJ2YXRpb24gZm9yIGFuIGlub2RlLiAgVGhpcyBjYW4gYmUgY2FsbGVkCisgKiBvbmNlIHdlIGNvbXBsZXRlIElPIGZvciBhIGdpdmVuIHNldCBvZiBieXRlcyB0byByZWxlYXNlIHRoZWlyIG1ldGFkYXRhCisgKiByZXNlcnZhdGlvbnMuCisgKi8KIHZvaWQgYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbnVtX2J5dGVzKQogewogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CkBAIC00MDQ0LDkgKzQyMjgsMTEgQEAKIAl1bnNpZ25lZCBkcm9wcGVkOwogCiAJbnVtX2J5dGVzID0gQUxJR04obnVtX2J5dGVzLCByb290LT5zZWN0b3JzaXplKTsKKwlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKIAlkcm9wcGVkID0gZHJvcF9vdXRzdGFuZGluZ19leHRlbnQoaW5vZGUpOwogCi0JdG9fZnJlZSA9IGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplKGlub2RlLCBudW1fYnl0ZXMpOworCXRvX2ZyZWUgPSBjYWxjX2NzdW1fbWV0YWRhdGFfc2l6ZShpbm9kZSwgbnVtX2J5dGVzLCAwKTsKKwlzcGluX3VubG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwogCWlmIChkcm9wcGVkID4gMCkKIAkJdG9fZnJlZSArPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgZHJvcHBlZCk7CiAKQEAgLTQwNTQsNiArNDI0MCwyMSBAQAogCQkJCXRvX2ZyZWUpOwogfQogCisvKioKKyAqIGJ0cmZzX2RlbGFsbG9jX3Jlc2VydmVfc3BhY2UgLSByZXNlcnZlIGRhdGEgYW5kIG1ldGFkYXRhIHNwYWNlIGZvciBkZWxhbGxvYworICogQGlub2RlOiBpbm9kZSB3ZSdyZSB3cml0aW5nIHRvCisgKiBAbnVtX2J5dGVzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHdhbnQgdG8gYWxsb2NhdGUKKyAqCisgKiBUaGlzIHdpbGwgZG8gdGhlIGZvbGxvd2luZyB0aGluZ3MKKyAqCisgKiBvIHJlc2VydmUgc3BhY2UgaW4gdGhlIGRhdGEgc3BhY2UgaW5mbyBmb3IgbnVtX2J5dGVzCisgKiBvIHJlc2VydmUgc3BhY2UgaW4gdGhlIG1ldGFkYXRhIHNwYWNlIGluZm8gYmFzZWQgb24gbnVtYmVyIG9mIG91dHN0YW5kaW5nCisgKiAgIGV4dGVudHMgYW5kIGhvdyBtdWNoIGNzdW1zIHdpbGwgYmUgbmVlZGVkCisgKiBvIGFkZCB0byB0aGUgaW5vZGVzIC0+ZGVsYWxsb2NfYnl0ZXMKKyAqIG8gYWRkIGl0IHRvIHRoZSBmc19pbmZvJ3MgZGVsYWxsb2MgaW5vZGVzIGxpc3QuCisgKgorICogVGhpcyB3aWxsIHJldHVybiAwIGZvciBzdWNjZXNzIGFuZCAtRU5PU1BDIGlmIHRoZXJlIGlzIG5vIHNwYWNlIGxlZnQuCisgKi8KIGludCBidHJmc19kZWxhbGxvY19yZXNlcnZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBudW1fYnl0ZXMpCiB7CiAJaW50IHJldDsKQEAgLTQwNzEsNiArNDI3MiwxOSBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGJ0cmZzX2RlbGFsbG9jX3JlbGVhc2Vfc3BhY2UgLSByZWxlYXNlIGRhdGEgYW5kIG1ldGFkYXRhIHNwYWNlIGZvciBkZWxhbGxvYworICogQGlub2RlOiBpbm9kZSB3ZSdyZSByZWxlYXNpbmcgc3BhY2UgZm9yCisgKiBAbnVtX2J5dGVzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHdhbnQgdG8gZnJlZSB1cAorICoKKyAqIFRoaXMgbXVzdCBiZSBtYXRjaGVkIHdpdGggYSBjYWxsIHRvIGJ0cmZzX2RlbGFsbG9jX3Jlc2VydmVfc3BhY2UuICBUaGlzIGlzCisgKiBjYWxsZWQgaW4gdGhlIGNhc2UgdGhhdCB3ZSBkb24ndCBuZWVkIHRoZSBtZXRhZGF0YSBBTkQgZGF0YSByZXNlcnZhdGlvbnMKKyAqIGFueW1vcmUuICBTbyBpZiB0aGVyZSBpcyBhbiBlcnJvciBvciB3ZSBpbnNlcnQgYW4gaW5saW5lIGV4dGVudC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVsZWFzZSB0aGUgbWV0YWRhdGEgc3BhY2UgdGhhdCB3YXMgbm90IHVzZWQgYW5kIHdpbGwKKyAqIGRlY3JlbWVudCAtPmRlbGFsbG9jX2J5dGVzIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZnNfaW5mbyBkZWxhbGxvY19pbm9kZXMKKyAqIGxpc3QgaWYgdGhlcmUgYXJlIG5vIGRlbGFsbG9jIGJ5dGVzIGxlZnQuCisgKi8KIHZvaWQgYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbnVtX2J5dGVzKQogewogCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2VfbWV0YWRhdGEoaW5vZGUsIG51bV9ieXRlcyk7CkBAIC00MDkwLDEyICs0MzA0LDEyIEBACiAKIAkvKiBibG9jayBhY2NvdW50aW5nIGZvciBzdXBlciBibG9jayAqLwogCXNwaW5fbG9jaygmaW5mby0+ZGVsYWxsb2NfbG9jayk7Ci0Jb2xkX3ZhbCA9IGJ0cmZzX3N1cGVyX2J5dGVzX3VzZWQoJmluZm8tPnN1cGVyX2NvcHkpOworCW9sZF92YWwgPSBidHJmc19zdXBlcl9ieXRlc191c2VkKGluZm8tPnN1cGVyX2NvcHkpOwogCWlmIChhbGxvYykKIAkJb2xkX3ZhbCArPSBudW1fYnl0ZXM7CiAJZWxzZQogCQlvbGRfdmFsIC09IG51bV9ieXRlczsKLQlidHJmc19zZXRfc3VwZXJfYnl0ZXNfdXNlZCgmaW5mby0+c3VwZXJfY29weSwgb2xkX3ZhbCk7CisJYnRyZnNfc2V0X3N1cGVyX2J5dGVzX3VzZWQoaW5mby0+c3VwZXJfY29weSwgb2xkX3ZhbCk7CiAJc3Bpbl91bmxvY2soJmluZm8tPmRlbGFsbG9jX2xvY2spOwogCiAJd2hpbGUgKHRvdGFsKSB7CkBAIC00MTIzLDcgKzQzMzcsNyBAQAogCQlzcGluX2xvY2soJmNhY2hlLT5zcGFjZV9pbmZvLT5sb2NrKTsKIAkJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CiAKLQkJaWYgKGJ0cmZzX3N1cGVyX2NhY2hlX2dlbmVyYXRpb24oJmluZm8tPnN1cGVyX2NvcHkpICE9IDAgJiYKKwkJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIFNQQUNFX0NBQ0hFKSAmJgogCQkgICAgY2FjaGUtPmRpc2tfY2FjaGVfc3RhdGUgPCBCVFJGU19EQ19DTEVBUikKIAkJCWNhY2hlLT5kaXNrX2NhY2hlX3N0YXRlID0gQlRSRlNfRENfQ0xFQVI7CiAKQEAgLTQxMzUsNyArNDM0OSw2IEBACiAJCQlidHJmc19zZXRfYmxvY2tfZ3JvdXBfdXNlZCgmY2FjaGUtPml0ZW0sIG9sZF92YWwpOwogCQkJY2FjaGUtPnJlc2VydmVkIC09IG51bV9ieXRlczsKIAkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBudW1fYnl0ZXM7Ci0JCQljYWNoZS0+c3BhY2VfaW5mby0+cmVzZXJ2YXRpb25fcHJvZ3Jlc3MrKzsKIAkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc191c2VkICs9IG51bV9ieXRlczsKIAkJCWNhY2hlLT5zcGFjZV9pbmZvLT5kaXNrX3VzZWQgKz0gbnVtX2J5dGVzICogZmFjdG9yOwogCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKQEAgLTQxODcsNyArNDQwMCw2IEBACiAJaWYgKHJlc2VydmVkKSB7CiAJCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CiAJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBudW1fYnl0ZXM7Ci0JCWNhY2hlLT5zcGFjZV9pbmZvLT5yZXNlcnZhdGlvbl9wcm9ncmVzcysrOwogCX0KIAlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOwogCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CkBAIC00MjE1LDQ1ICs0NDI3LDgyIEBACiB9CiAKIC8qCi0gKiB1cGRhdGUgc2l6ZSBvZiByZXNlcnZlZCBleHRlbnRzLiB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gLUVBR0FJTgotICogaWYgJ3Jlc2VydmUnIGlzIHRydWUgb3IgJ3NpbmZvJyBpcyBmYWxzZS4KKyAqIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aGluIHRyYW5zYWN0aW9uCiAgKi8KLWludCBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwKLQkJCQl1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZSwgaW50IHNpbmZvKQoraW50IGJ0cmZzX3Bpbl9leHRlbnRfZm9yX2xvZ19yZXBsYXkoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzKQogeworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGJ0cmZzX2xvb2t1cF9ibG9ja19ncm91cChyb290LT5mc19pbmZvLCBieXRlbnIpOworCUJVR19PTighY2FjaGUpOworCisJLyoKKwkgKiBwdWxsIGluIHRoZSBmcmVlIHNwYWNlIGNhY2hlIChpZiBhbnkpIHNvIHRoYXQgb3VyIHBpbgorCSAqIHJlbW92ZXMgdGhlIGZyZWUgc3BhY2UgZnJvbSB0aGUgY2FjaGUuICBXZSBoYXZlIGxvYWRfb25seSBzZXQKKwkgKiB0byBvbmUgYmVjYXVzZSB0aGUgc2xvdyBjb2RlIHRvIHJlYWQgaW4gdGhlIGZyZWUgZXh0ZW50cyBkb2VzIGNoZWNrCisJICogdGhlIHBpbm5lZCBleHRlbnRzLgorCSAqLworCWNhY2hlX2Jsb2NrX2dyb3VwKGNhY2hlLCB0cmFucywgcm9vdCwgMSk7CisKKwlwaW5fZG93bl9leHRlbnQocm9vdCwgY2FjaGUsIGJ5dGVuciwgbnVtX2J5dGVzLCAwKTsKKworCS8qIHJlbW92ZSB1cyBmcm9tIHRoZSBmcmVlIHNwYWNlIGNhY2hlIChpZiB3ZSdyZSB0aGVyZSBhdCBhbGwpICovCisJYnRyZnNfcmVtb3ZlX2ZyZWVfc3BhY2UoY2FjaGUsIGJ5dGVuciwgbnVtX2J5dGVzKTsKKwlidHJmc19wdXRfYmxvY2tfZ3JvdXAoY2FjaGUpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyAtIHVwZGF0ZSB0aGUgYmxvY2tfZ3JvdXAgYW5kIHNwYWNlIGluZm8gY291bnRlcnMKKyAqIEBjYWNoZToJVGhlIGNhY2hlIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAqIEBudW1fYnl0ZXM6CVRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gcXVlc3Rpb24KKyAqIEByZXNlcnZlOglPbmUgb2YgdGhlIHJlc2VydmF0aW9uIGVudW1zCisgKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGFsbG9jYXRvciB3aGVuIGl0IHJlc2VydmVzIHNwYWNlLCBvciBieSBzb21lYm9keSB3aG8gaXMKKyAqIGZyZWVpbmcgc3BhY2UgdGhhdCB3YXMgbmV2ZXIgYWN0dWFsbHkgdXNlZCBvbiBkaXNrLiAgRm9yIGV4YW1wbGUgaWYgeW91CisgKiByZXNlcnZlIHNvbWUgc3BhY2UgZm9yIGEgbmV3IGxlYWYgaW4gdHJhbnNhY3Rpb24gQSBhbmQgYmVmb3JlIHRyYW5zYWN0aW9uIEEKKyAqIGNvbW1pdHMgeW91IGZyZWUgdGhhdCBsZWFmLCB5b3UgY2FsbCB0aGlzIHdpdGggcmVzZXJ2ZSBzZXQgdG8gMCBpbiBvcmRlciB0bworICogY2xlYXIgdGhlIHJlc2VydmF0aW9uLgorICoKKyAqIE1ldGFkYXRhIHJlc2VydmF0aW9ucyBzaG91bGQgYmUgY2FsbGVkIHdpdGggUkVTRVJWRV9BTExPQyBzbyB3ZSBkbyB0aGUgcHJvcGVyCisgKiBFTk9TUEMgYWNjb3VudGluZy4gIEZvciBkYXRhIHdlIGhhbmRsZSB0aGUgcmVzZXJ2YXRpb24gdGhyb3VnaCBjbGVhcmluZyB0aGUKKyAqIGRlbGFsbG9jIGJpdHMgaW4gdGhlIGlvX3RyZWUuICBXZSBoYXZlIHRvIGRvIHRoaXMgc2luY2Ugd2UgY291bGQgZW5kIHVwCisgKiBhbGxvY2F0aW5nIGxlc3MgZGlzayBzcGFjZSBmb3IgdGhlIGFtb3VudCBvZiBkYXRhIHdlIGhhdmUgcmVzZXJ2ZWQgaW4gdGhlCisgKiBjYXNlIG9mIGNvbXByZXNzaW9uLgorICoKKyAqIElmIHRoaXMgaXMgYSByZXNlcnZhdGlvbiBhbmQgdGhlIGJsb2NrIGdyb3VwIGhhcyBiZWNvbWUgcmVhZCBvbmx5IHdlIGNhbm5vdAorICogbWFrZSB0aGUgcmVzZXJ2YXRpb24gYW5kIHJldHVybiAtRUFHQUlOLCBvdGhlcndpc2UgdGhpcyBmdW5jdGlvbiBhbHdheXMKKyAqIHN1Y2NlZWRzLgorICovCitzdGF0aWMgaW50IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAorCQkJCSAgICAgICB1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbyA9IGNhY2hlLT5zcGFjZV9pbmZvOwogCWludCByZXQgPSAwOwotCWlmIChzaW5mbykgewotCQlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbyA9IGNhY2hlLT5zcGFjZV9pbmZvOwotCQlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOwotCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKLQkJaWYgKHJlc2VydmUpIHsKLQkJCWlmIChjYWNoZS0+cm8pIHsKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJfSBlbHNlIHsKLQkJCQljYWNoZS0+cmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwotCQkJCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICs9IG51bV9ieXRlczsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjYWNoZS0+cm8pCi0JCQkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKz0gbnVtX2J5dGVzOwotCQkJY2FjaGUtPnJlc2VydmVkIC09IG51bV9ieXRlczsKLQkJCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkIC09IG51bV9ieXRlczsKLQkJCXNwYWNlX2luZm8tPnJlc2VydmF0aW9uX3Byb2dyZXNzKys7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKLQkJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9jaygmY2FjaGUtPmxvY2spOworCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisJaWYgKHJlc2VydmUgIT0gUkVTRVJWRV9GUkVFKSB7CiAJCWlmIChjYWNoZS0+cm8pIHsKIAkJCXJldCA9IC1FQUdBSU47CiAJCX0gZWxzZSB7Ci0JCQlpZiAocmVzZXJ2ZSkKLQkJCQljYWNoZS0+cmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwotCQkJZWxzZQotCQkJCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CisJCQljYWNoZS0+cmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOworCQkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOworCQkJaWYgKHJlc2VydmUgPT0gUkVTRVJWRV9BTExPQykgeworCQkJCUJVR19PTihzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlIDwgbnVtX2J5dGVzKTsKKwkJCQlzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlIC09IG51bV9ieXRlczsKKwkJCX0KIAkJfQotCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCX0gZWxzZSB7CisJCWlmIChjYWNoZS0+cm8pCisJCQlzcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSArPSBudW1fYnl0ZXM7CisJCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CisJCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkIC09IG51bV9ieXRlczsKKwkJc3BhY2VfaW5mby0+cmVzZXJ2YXRpb25fcHJvZ3Jlc3MrKzsKIAl9CisJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDMxOSwxMyArNDU2OCw4IEBACiAJCXNwaW5fbG9jaygmY2FjaGUtPmxvY2spOwogCQljYWNoZS0+cGlubmVkIC09IGxlbjsKIAkJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3Bpbm5lZCAtPSBsZW47Ci0JCWlmIChjYWNoZS0+cm8pIHsKKwkJaWYgKGNhY2hlLT5ybykKIAkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSArPSBsZW47Ci0JCX0gZWxzZSBpZiAoY2FjaGUtPnJlc2VydmVkX3Bpbm5lZCA+IDApIHsKLQkJCWxlbiA9IG1pbihsZW4sIGNhY2hlLT5yZXNlcnZlZF9waW5uZWQpOwotCQkJY2FjaGUtPnJlc2VydmVkX3Bpbm5lZCAtPSBsZW47Ci0JCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gbGVuOwotCQl9CiAJCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CiAJCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CiAJfQpAQCAtNDM0MCwxMSArNDU4NCw4IEBACiB7CiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSByb290LT5mc19pbmZvOwogCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdW5waW47Ci0Jc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2OwotCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKm5leHRfcnN2OwogCXU2NCBzdGFydDsKIAl1NjQgZW5kOwotCWludCBpZHg7CiAJaW50IHJldDsKIAogCWlmIChmc19pbmZvLT5waW5uZWRfZXh0ZW50cyA9PSAmZnNfaW5mby0+ZnJlZWRfZXh0ZW50c1swXSkKQEAgLTQzNjcsMzAgKzQ2MDgsNiBAQAogCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAKLQltdXRleF9sb2NrKCZmc19pbmZvLT5kdXJhYmxlX2Jsb2NrX3Jzdl9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrX3JzdiwgbmV4dF9yc3YsCi0JCQkJICZmc19pbmZvLT5kdXJhYmxlX2Jsb2NrX3Jzdl9saXN0LCBsaXN0KSB7Ci0KLQkJaWR4ID0gdHJhbnMtPnRyYW5zaWQgJiAweDE7Ci0JCWlmIChibG9ja19yc3YtPmZyZWVkW2lkeF0gPiAwKSB7Ci0JCQlibG9ja19yc3ZfYWRkX2J5dGVzKGJsb2NrX3JzdiwKLQkJCQkJICAgIGJsb2NrX3Jzdi0+ZnJlZWRbaWR4XSwgMCk7Ci0JCQlibG9ja19yc3YtPmZyZWVkW2lkeF0gPSAwOwotCQl9Ci0JCWlmIChhdG9taWNfcmVhZCgmYmxvY2tfcnN2LT51c2FnZSkgPT0gMCkgewotCQkJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgYmxvY2tfcnN2LCAodTY0KS0xKTsKLQotCQkJaWYgKGJsb2NrX3Jzdi0+ZnJlZWRbMF0gPT0gMCAmJgotCQkJICAgIGJsb2NrX3Jzdi0+ZnJlZWRbMV0gPT0gMCkgewotCQkJCWxpc3RfZGVsX2luaXQoJmJsb2NrX3Jzdi0+bGlzdCk7Ci0JCQkJa2ZyZWUoYmxvY2tfcnN2KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJ0cmZzX2Jsb2NrX3Jzdl9yZWxlYXNlKHJvb3QsIGJsb2NrX3JzdiwgMCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5kdXJhYmxlX2Jsb2NrX3Jzdl9tdXRleCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDY2OCw3ICs0ODg1LDYgQEAKIAkJCSAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYsCiAJCQkgICB1NjQgcGFyZW50LCBpbnQgbGFzdF9yZWYpCiB7Ci0Jc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2OwogCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUgPSBOVUxMOwogCWludCByZXQ7CiAKQEAgLTQ2ODMsNjQgKzQ4OTksMjQgQEAKIAlpZiAoIWxhc3RfcmVmKQogCQlyZXR1cm47CiAKLQlibG9ja19yc3YgPSBnZXRfYmxvY2tfcnN2KHRyYW5zLCByb290KTsKIAljYWNoZSA9IGJ0cmZzX2xvb2t1cF9ibG9ja19ncm91cChyb290LT5mc19pbmZvLCBidWYtPnN0YXJ0KTsKLQlpZiAoYmxvY2tfcnN2LT5zcGFjZV9pbmZvICE9IGNhY2hlLT5zcGFjZV9pbmZvKQotCQlnb3RvIG91dDsKIAogCWlmIChidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihidWYpID09IHRyYW5zLT50cmFuc2lkKSB7CiAJCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCAhPSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCkgewogCQkJcmV0ID0gY2hlY2tfcmVmX2NsZWFudXAodHJhbnMsIHJvb3QsIGJ1Zi0+c3RhcnQpOwogCQkJaWYgKCFyZXQpCi0JCQkJZ290byBwaW47CisJCQkJZ290byBvdXQ7CiAJCX0KIAogCQlpZiAoYnRyZnNfaGVhZGVyX2ZsYWcoYnVmLCBCVFJGU19IRUFERVJfRkxBR19XUklUVEVOKSkgewogCQkJcGluX2Rvd25fZXh0ZW50KHJvb3QsIGNhY2hlLCBidWYtPnN0YXJ0LCBidWYtPmxlbiwgMSk7Ci0JCQlnb3RvIHBpbjsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJV0FSTl9PTih0ZXN0X2JpdChFWFRFTlRfQlVGRkVSX0RJUlRZLCAmYnVmLT5iZmxhZ3MpKTsKIAogCQlidHJmc19hZGRfZnJlZV9zcGFjZShjYWNoZSwgYnVmLT5zdGFydCwgYnVmLT5sZW4pOwotCQlyZXQgPSBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGJ1Zi0+bGVuLCAwLCAwKTsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCQkvKiBibG9jayBncm91cCBiZWNhbWUgcmVhZC1vbmx5ICovCi0JCQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGJ1Zi0+bGVuLCAwLCAxKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcmV0ID0gMTsKLQkJc3Bpbl9sb2NrKCZibG9ja19yc3YtPmxvY2spOwotCQlpZiAoYmxvY2tfcnN2LT5yZXNlcnZlZCA8IGJsb2NrX3Jzdi0+c2l6ZSkgewotCQkJYmxvY2tfcnN2LT5yZXNlcnZlZCArPSBidWYtPmxlbjsKLQkJCXJldCA9IDA7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmJsb2NrX3Jzdi0+bG9jayk7Ci0KLQkJaWYgKHJldCkgewotCQkJc3Bpbl9sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7Ci0JCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgLT0gYnVmLT5sZW47Ci0JCQljYWNoZS0+c3BhY2VfaW5mby0+cmVzZXJ2YXRpb25fcHJvZ3Jlc3MrKzsKLQkJCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7Ci0JCX0KLQkJZ290byBvdXQ7Ci0JfQotcGluOgotCWlmIChibG9ja19yc3YtPmR1cmFibGUgJiYgIWNhY2hlLT5ybykgewotCQlyZXQgPSAwOwotCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKLQkJaWYgKCFjYWNoZS0+cm8pIHsKLQkJCWNhY2hlLT5yZXNlcnZlZF9waW5uZWQgKz0gYnVmLT5sZW47Ci0JCQlyZXQgPSAxOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7Ci0KLQkJaWYgKHJldCkgewotCQkJc3Bpbl9sb2NrKCZibG9ja19yc3YtPmxvY2spOwotCQkJYmxvY2tfcnN2LT5mcmVlZFt0cmFucy0+dHJhbnNpZCAmIDB4MV0gKz0gYnVmLT5sZW47Ci0JCQlzcGluX3VubG9jaygmYmxvY2tfcnN2LT5sb2NrKTsKLQkJfQorCQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGJ1Zi0+bGVuLCBSRVNFUlZFX0ZSRUUpOwogCX0KIG91dDoKIAkvKgpAQCAtNDg4MywxMCArNTA1OSwxMyBAQAogCWludCBsYXN0X3B0cl9sb29wID0gMDsKIAlpbnQgbG9vcCA9IDA7CiAJaW50IGluZGV4ID0gMDsKKwlpbnQgYWxsb2NfdHlwZSA9IChkYXRhICYgQlRSRlNfQkxPQ0tfR1JPVVBfREFUQSkgPworCQlSRVNFUlZFX0FMTE9DX05PX0FDQ09VTlQgOiBSRVNFUlZFX0FMTE9DOwogCWJvb2wgZm91bmRfdW5jYWNoZWRfYmcgPSBmYWxzZTsKIAlib29sIGZhaWxlZF9jbHVzdGVyX3JlZmlsbCA9IGZhbHNlOwogCWJvb2wgZmFpbGVkX2FsbG9jID0gZmFsc2U7CiAJYm9vbCB1c2VfY2x1c3RlciA9IHRydWU7CisJYm9vbCBoYXZlX2NhY2hpbmdfYmcgPSBmYWxzZTsKIAl1NjQgaWRlYWxfY2FjaGVfcGVyY2VudCA9IDA7CiAJdTY0IGlkZWFsX2NhY2hlX29mZnNldCA9IDA7CiAKQEAgLTQ5NjksNiArNTE0OCw3IEBACiAJCX0KIAl9CiBzZWFyY2g6CisJaGF2ZV9jYWNoaW5nX2JnID0gZmFsc2U7CiAJZG93bl9yZWFkKCZzcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJsb2NrX2dyb3VwLCAmc3BhY2VfaW5mby0+YmxvY2tfZ3JvdXBzW2luZGV4XSwKIAkJCSAgICBsaXN0KSB7CkBAIC01MTc3LDYgKzUzNTcsOCBAQAogCQkJZmFpbGVkX2FsbG9jID0gdHJ1ZTsKIAkJCWdvdG8gaGF2ZV9ibG9ja19ncm91cDsKIAkJfSBlbHNlIGlmICghb2Zmc2V0KSB7CisJCQlpZiAoIWNhY2hlZCkKKwkJCQloYXZlX2NhY2hpbmdfYmcgPSB0cnVlOwogCQkJZ290byBsb29wOwogCQl9CiBjaGVja3M6CkBAIC01MjAyLDggKzUzODQsOCBAQAogCQkJCQkgICAgIHNlYXJjaF9zdGFydCAtIG9mZnNldCk7CiAJCUJVR19PTihvZmZzZXQgPiBzZWFyY2hfc3RhcnQpOwogCi0JCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgbnVtX2J5dGVzLCAxLAotCQkJCQkgICAgKGRhdGEgJiBCVFJGU19CTE9DS19HUk9VUF9EQVRBKSk7CisJCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgbnVtX2J5dGVzLAorCQkJCQkJICBhbGxvY190eXBlKTsKIAkJaWYgKHJldCA9PSAtRUFHQUlOKSB7CiAJCQlidHJmc19hZGRfZnJlZV9zcGFjZShibG9ja19ncm91cCwgb2Zmc2V0LCBudW1fYnl0ZXMpOwogCQkJZ290byBsb29wOwpAQCAtNTIyNyw2ICs1NDA5LDkgQEAKIAl9CiAJdXBfcmVhZCgmc3BhY2VfaW5mby0+Z3JvdXBzX3NlbSk7CiAKKwlpZiAoIWlucy0+b2JqZWN0aWQgJiYgbG9vcCA+PSBMT09QX0NBQ0hJTkdfV0FJVCAmJiBoYXZlX2NhY2hpbmdfYmcpCisJCWdvdG8gc2VhcmNoOworCiAJaWYgKCFpbnMtPm9iamVjdGlkICYmICsraW5kZXggPCBCVFJGU19OUl9SQUlEX1RZUEVTKQogCQlnb3RvIHNlYXJjaDsKIApAQCAtNTMyNSw3ICs1NTEwLDggQEAKIAlpbnQgaW5kZXggPSAwOwogCiAJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQlwcmludGsoS0VSTl9JTkZPICJzcGFjZV9pbmZvIGhhcyAlbGx1IGZyZWUsIGlzICVzZnVsbFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJzcGFjZV9pbmZvICVsbHUgaGFzICVsbHUgZnJlZSwgaXMgJXNmdWxsXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWluZm8tPmZsYWdzLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShpbmZvLT50b3RhbF9ieXRlcyAtIGluZm8tPmJ5dGVzX3VzZWQgLQogCQkJCSAgICBpbmZvLT5ieXRlc19waW5uZWQgLSBpbmZvLT5ieXRlc19yZXNlcnZlZCAtCiAJCQkJICAgIGluZm8tPmJ5dGVzX3JlYWRvbmx5KSwKQEAgLTU0MTEsNyArNTU5Nyw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgc3RhcnQsIHU2NCBsZW4pCitzdGF0aWMgaW50IF9fYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXU2NCBzdGFydCwgdTY0IGxlbiwgaW50IHBpbikKIHsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOwogCWludCByZXQgPSAwOwpAQCAtNTQyNiw4ICs1NjEzLDEyIEBACiAJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIERJU0NBUkQpKQogCQlyZXQgPSBidHJmc19kaXNjYXJkX2V4dGVudChyb290LCBzdGFydCwgbGVuLCBOVUxMKTsKIAotCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGNhY2hlLCBzdGFydCwgbGVuKTsKLQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGxlbiwgMCwgMSk7CisJaWYgKHBpbikKKwkJcGluX2Rvd25fZXh0ZW50KHJvb3QsIGNhY2hlLCBzdGFydCwgbGVuLCAxKTsKKwllbHNlIHsKKwkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoY2FjaGUsIHN0YXJ0LCBsZW4pOworCQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGxlbiwgUkVTRVJWRV9GUkVFKTsKKwl9CiAJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGNhY2hlKTsKIAogCXRyYWNlX2J0cmZzX3Jlc2VydmVkX2V4dGVudF9mcmVlKHJvb3QsIHN0YXJ0LCBsZW4pOwpAQCAtNTQzNSw2ICs1NjI2LDE4IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQl1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJcmV0dXJuIF9fYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQocm9vdCwgc3RhcnQsIGxlbiwgMCk7Cit9CisKK2ludCBidHJmc19mcmVlX2FuZF9waW5fcmVzZXJ2ZWRfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJcmV0dXJuIF9fYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQocm9vdCwgc3RhcnQsIGxlbiwgMSk7Cit9CisKIHN0YXRpYyBpbnQgYWxsb2NfcmVzZXJ2ZWRfZmlsZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJICAgICAgdTY0IHBhcmVudCwgdTY0IHJvb3Rfb2JqZWN0aWQsCkBAIC01NjMwLDcgKzU4MzMsOCBAQAogCQlwdXRfY2FjaGluZ19jb250cm9sKGNhY2hpbmdfY3RsKTsKIAl9CiAKLQlyZXQgPSBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoYmxvY2tfZ3JvdXAsIGlucy0+b2Zmc2V0LCAxLCAxKTsKKwlyZXQgPSBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoYmxvY2tfZ3JvdXAsIGlucy0+b2Zmc2V0LAorCQkJCQkgIFJFU0VSVkVfQUxMT0NfTk9fQUNDT1VOVCk7CiAJQlVHX09OKHJldCk7CiAJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKIAlyZXQgPSBhbGxvY19yZXNlcnZlZF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwgMCwgcm9vdF9vYmplY3RpZCwKQEAgLTU2ODcsOCArNTg5MSw3IEBACiAJYmxvY2tfcnN2ID0gZ2V0X2Jsb2NrX3Jzdih0cmFucywgcm9vdCk7CiAKIAlpZiAoYmxvY2tfcnN2LT5zaXplID09IDApIHsKLQkJcmV0ID0gcmVzZXJ2ZV9tZXRhZGF0YV9ieXRlcyh0cmFucywgcm9vdCwgYmxvY2tfcnN2LAotCQkJCQkgICAgIGJsb2Nrc2l6ZSwgMCk7CisJCXJldCA9IHJlc2VydmVfbWV0YWRhdGFfYnl0ZXMocm9vdCwgYmxvY2tfcnN2LCBibG9ja3NpemUsIDApOwogCQkvKgogCQkgKiBJZiB3ZSBjb3VsZG4ndCByZXNlcnZlIG1ldGFkYXRhIGJ5dGVzIHRyeSBhbmQgdXNlIHNvbWUgZnJvbQogCQkgKiB0aGUgZ2xvYmFsIHJlc2VydmUuCkBAIC01NzA4LDEzICs1OTExLDE1IEBACiAJaWYgKCFyZXQpCiAJCXJldHVybiBibG9ja19yc3Y7CiAJaWYgKHJldCkgewotCQlXQVJOX09OKDEpOwotCQlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHRyYW5zLCByb290LCBibG9ja19yc3YsIGJsb2Nrc2l6ZSwKLQkJCQkJICAgICAwKTsKKwkJc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUoX3JzLAorCQkJCURFRkFVTFRfUkFURUxJTUlUX0lOVEVSVkFMLAorCQkJCS8qREVGQVVMVF9SQVRFTElNSVRfQlVSU1QqLyAyKTsKKwkJaWYgKF9fcmF0ZWxpbWl0KCZfcnMpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYnRyZnM6IGJsb2NrIHJzdiByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJCVdBUk5fT04oMSk7CisJCX0KKwkJcmV0ID0gcmVzZXJ2ZV9tZXRhZGF0YV9ieXRlcyhyb290LCBibG9ja19yc3YsIGJsb2Nrc2l6ZSwgMCk7CiAJCWlmICghcmV0KSB7Ci0JCQlzcGluX2xvY2soJmJsb2NrX3Jzdi0+bG9jayk7Ci0JCQlibG9ja19yc3YtPnNpemUgKz0gYmxvY2tzaXplOwotCQkJc3Bpbl91bmxvY2soJmJsb2NrX3Jzdi0+bG9jayk7CiAJCQlyZXR1cm4gYmxvY2tfcnN2OwogCQl9IGVsc2UgaWYgKHJldCAmJiBibG9ja19yc3YgIT0gZ2xvYmFsX3JzdikgewogCQkJcmV0ID0gYmxvY2tfcnN2X3VzZV9ieXRlcyhnbG9iYWxfcnN2LCBibG9ja3NpemUpOwpAQCAtNjU5MiwxMiArNjc5Nyw5IEBACiAJCSAgICBjYWNoZS0+Ynl0ZXNfc3VwZXIgLSBidHJmc19ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSk7CiAKIAlpZiAoc2luZm8tPmJ5dGVzX3VzZWQgKyBzaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKyBzaW5mby0+Ynl0ZXNfcGlubmVkICsKLQkgICAgc2luZm8tPmJ5dGVzX21heV91c2UgKyBzaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKwotCSAgICBjYWNoZS0+cmVzZXJ2ZWRfcGlubmVkICsgbnVtX2J5dGVzICsgbWluX2FsbG9jYWJsZV9ieXRlcyA8PQotCSAgICBzaW5mby0+dG90YWxfYnl0ZXMpIHsKKwkgICAgc2luZm8tPmJ5dGVzX21heV91c2UgKyBzaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKyBudW1fYnl0ZXMgKworCSAgICBtaW5fYWxsb2NhYmxlX2J5dGVzIDw9IHNpbmZvLT50b3RhbF9ieXRlcykgewogCQlzaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKz0gbnVtX2J5dGVzOwotCQlzaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gY2FjaGUtPnJlc2VydmVkX3Bpbm5lZDsKLQkJY2FjaGUtPnJlc2VydmVkX3Bpbm5lZCA9IDA7CiAJCWNhY2hlLT5ybyA9IDE7CiAJCXJldCA9IDA7CiAJfQpAQCAtNjk2NCw3ICs3MTY2LDggQEAKIAkJCQkJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8sCiAJCQkJCWxpc3QpOwogCQlpZiAoc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkID4gMCB8fAotCQkgICAgc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgPiAwKSB7CisJCSAgICBzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCA+IDAgfHwKKwkJICAgIHNwYWNlX2luZm8tPmJ5dGVzX21heV91c2UgPiAwKSB7CiAJCQlXQVJOX09OKDEpOwogCQkJZHVtcF9zcGFjZV9pbmZvKHNwYWNlX2luZm8sIDAsIDApOwogCQl9CkBAIC03MDA2LDE0ICs3MjA5LDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCXBhdGgtPnJlYWRhID0gMTsKIAotCWNhY2hlX2dlbiA9IGJ0cmZzX3N1cGVyX2NhY2hlX2dlbmVyYXRpb24oJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwotCWlmIChjYWNoZV9nZW4gIT0gMCAmJgotCSAgICBidHJmc19zdXBlcl9nZW5lcmF0aW9uKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAhPSBjYWNoZV9nZW4pCisJY2FjaGVfZ2VuID0gYnRyZnNfc3VwZXJfY2FjaGVfZ2VuZXJhdGlvbihyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgU1BBQ0VfQ0FDSEUpICYmCisJICAgIGJ0cmZzX3N1cGVyX2dlbmVyYXRpb24ocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkgIT0gY2FjaGVfZ2VuKQogCQluZWVkX2NsZWFyID0gMTsKIAlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgQ0xFQVJfQ0FDSEUpKQogCQluZWVkX2NsZWFyID0gMTsKLQlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIFNQQUNFX0NBQ0hFKSAmJiBjYWNoZV9nZW4pCi0JCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBkaXNrIHNwYWNlIGNhY2hpbmcgaXMgZW5hYmxlZFxuIik7CiAKIAl3aGlsZSAoMSkgewogCQlyZXQgPSBmaW5kX2ZpcnN0X2Jsb2NrX2dyb3VwKHJvb3QsIHBhdGgsICZrZXkpOwpAQCAtNzI1Miw3ICs3NDUzLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaW5vZGUgPSBsb29rdXBfZnJlZV9zcGFjZV9pbm9kZShyb290LCBibG9ja19ncm91cCwgcGF0aCk7CisJaW5vZGUgPSBsb29rdXBfZnJlZV9zcGFjZV9pbm9kZSh0cmVlX3Jvb3QsIGJsb2NrX2dyb3VwLCBwYXRoKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJcmV0ID0gYnRyZnNfb3JwaGFuX2FkZCh0cmFucywgaW5vZGUpOwogCQlCVUdfT04ocmV0KTsKQEAgLTcyNjgsNyArNzQ2OSw3IEBACiAJCQlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOwogCQl9CiAJCS8qIE9uZSBmb3Igb3VyIGxvb2t1cCByZWYgKi8KLQkJaXB1dChpbm9kZSk7CisJCWJ0cmZzX2FkZF9kZWxheWVkX2lwdXQoaW5vZGUpOwogCX0KIAogCWtleS5vYmplY3RpZCA9IEJUUkZTX0ZSRUVfU1BBQ0VfT0JKRUNUSUQ7CkBAIC03MzM5LDcgKzc1NDAsNyBAQAogCWludCBtaXhlZCA9IDA7CiAJaW50IHJldDsKIAotCWRpc2tfc3VwZXIgPSAmZnNfaW5mby0+c3VwZXJfY29weTsKKwlkaXNrX3N1cGVyID0gZnNfaW5mby0+c3VwZXJfY29weTsKIAlpZiAoIWJ0cmZzX3N1cGVyX3Jvb3QoZGlza19zdXBlcikpCiAJCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfaW8uYyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCmluZGV4IGQ0MTgxNjQuLjFmODdjNGQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9pby5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiY29tcGF0LmgiCiAjaW5jbHVkZSAiY3RyZWUuaCIKICNpbmNsdWRlICJidHJmc19pbm9kZS5oIgorI2luY2x1ZGUgInZvbHVtZXMuaCIKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHRlbnRfc3RhdGVfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dGVudF9idWZmZXJfY2FjaGU7CkBAIC04OTQsNiArODk1LDE5NCBAQAogCWdvdG8gYWdhaW47CiB9CiAKKy8qKgorICogY29udmVydF9leHRlbnQgLSBjb252ZXJ0IGFsbCBiaXRzIGluIGEgZ2l2ZW4gcmFuZ2UgZnJvbSBvbmUgYml0IHRvIGFub3RoZXIKKyAqIEB0cmVlOgl0aGUgaW8gdHJlZSB0byBzZWFyY2gKKyAqIEBzdGFydDoJdGhlIHN0YXJ0IG9mZnNldCBpbiBieXRlcworICogQGVuZDoJdGhlIGVuZCBvZmZzZXQgaW4gYnl0ZXMgKGluY2x1c2l2ZSkKKyAqIEBiaXRzOgl0aGUgYml0cyB0byBzZXQgaW4gdGhpcyByYW5nZQorICogQGNsZWFyX2JpdHM6CXRoZSBiaXRzIHRvIGNsZWFyIGluIHRoaXMgcmFuZ2UKKyAqIEBtYXNrOgl0aGUgYWxsb2NhdGlvbiBtYXNrCisgKgorICogVGhpcyB3aWxsIGdvIHRocm91Z2ggYW5kIHNldCBiaXRzIGZvciB0aGUgZ2l2ZW4gcmFuZ2UuICBJZiBhbnkgc3RhdGVzIGV4aXN0CisgKiBhbHJlYWR5IGluIHRoaXMgcmFuZ2UgdGhleSBhcmUgc2V0IHdpdGggdGhlIGdpdmVuIGJpdCBhbmQgY2xlYXJlZCBvZiB0aGUKKyAqIGNsZWFyX2JpdHMuICBUaGlzIGlzIG9ubHkgbWVhbnQgdG8gYmUgdXNlZCBieSB0aGluZ3MgdGhhdCBhcmUgbWVyZ2VhYmxlLCBpZQorICogY29udmVydGluZyBmcm9tIHNheSBERUxBTExPQyB0byBESVJUWS4gIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgd2l0aAorICogYm91bmRhcnkgYml0cyBsaWtlIExPQ0suCisgKi8KK2ludCBjb252ZXJ0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgICAgICBpbnQgYml0cywgaW50IGNsZWFyX2JpdHMsIGdmcF90IG1hc2spCit7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqcHJlYWxsb2MgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCWludCBlcnIgPSAwOworCXU2NCBsYXN0X3N0YXJ0OworCXU2NCBsYXN0X2VuZDsKKworYWdhaW46CisJaWYgKCFwcmVhbGxvYyAmJiAobWFzayAmIF9fR0ZQX1dBSVQpKSB7CisJCXByZWFsbG9jID0gYWxsb2NfZXh0ZW50X3N0YXRlKG1hc2spOworCQlpZiAoIXByZWFsbG9jKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKKwkvKgorCSAqIHRoaXMgc2VhcmNoIHdpbGwgZmluZCBhbGwgdGhlIGV4dGVudHMgdGhhdCBlbmQgYWZ0ZXIKKwkgKiBvdXIgcmFuZ2Ugc3RhcnRzLgorCSAqLworCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBzdGFydCk7CisJaWYgKCFub2RlKSB7CisJCXByZWFsbG9jID0gYWxsb2NfZXh0ZW50X3N0YXRlX2F0b21pYyhwcmVhbGxvYyk7CisJCWlmICghcHJlYWxsb2MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gaW5zZXJ0X3N0YXRlKHRyZWUsIHByZWFsbG9jLCBzdGFydCwgZW5kLCAmYml0cyk7CisJCXByZWFsbG9jID0gTlVMTDsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKwkJZ290byBvdXQ7CisJfQorCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CitoaXRfbmV4dDoKKwlsYXN0X3N0YXJ0ID0gc3RhdGUtPnN0YXJ0OworCWxhc3RfZW5kID0gc3RhdGUtPmVuZDsKKworCS8qCisJICogfCAtLS0tIGRlc2lyZWQgcmFuZ2UgLS0tLSB8CisJICogfCBzdGF0ZSB8CisJICoKKwkgKiBKdXN0IGxvY2sgd2hhdCB3ZSBmb3VuZCBhbmQga2VlcCBnb2luZworCSAqLworCWlmIChzdGF0ZS0+c3RhcnQgPT0gc3RhcnQgJiYgc3RhdGUtPmVuZCA8PSBlbmQpIHsKKwkJc3RydWN0IHJiX25vZGUgKm5leHRfbm9kZTsKKworCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBzdGF0ZSwgJmJpdHMpOworCQljbGVhcl9zdGF0ZV9iaXQodHJlZSwgc3RhdGUsICZjbGVhcl9iaXRzLCAwKTsKKworCQltZXJnZV9zdGF0ZSh0cmVlLCBzdGF0ZSk7CisJCWlmIChsYXN0X2VuZCA9PSAodTY0KS0xKQorCQkJZ290byBvdXQ7CisKKwkJc3RhcnQgPSBsYXN0X2VuZCArIDE7CisJCW5leHRfbm9kZSA9IHJiX25leHQoJnN0YXRlLT5yYl9ub2RlKTsKKwkJaWYgKG5leHRfbm9kZSAmJiBzdGFydCA8IGVuZCAmJiBwcmVhbGxvYyAmJiAhbmVlZF9yZXNjaGVkKCkpIHsKKwkJCXN0YXRlID0gcmJfZW50cnkobmV4dF9ub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLAorCQkJCQkgcmJfbm9kZSk7CisJCQlpZiAoc3RhdGUtPnN0YXJ0ID09IHN0YXJ0KQorCQkJCWdvdG8gaGl0X25leHQ7CisJCX0KKwkJZ290byBzZWFyY2hfYWdhaW47CisJfQorCisJLyoKKwkgKiAgICAgfCAtLS0tIGRlc2lyZWQgcmFuZ2UgLS0tLSB8CisJICogfCBzdGF0ZSB8CisJICogICBvcgorCSAqIHwgLS0tLS0tLS0tLS0tLSBzdGF0ZSAtLS0tLS0tLS0tLS0tLSB8CisJICoKKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHRoZSBleHRlbnQgd2UgZm91bmQsIGFuZCBtYXkgZmxpcCBiaXRzIG9uCisJICogc2Vjb25kIGhhbGYuCisJICoKKwkgKiBJZiB0aGUgZXh0ZW50IHdlIGZvdW5kIGV4dGVuZHMgcGFzdCBvdXIKKwkgKiByYW5nZSwgd2UganVzdCBzcGxpdCBhbmQgc2VhcmNoIGFnYWluLiAgSXQnbGwgZ2V0IHNwbGl0CisJICogYWdhaW4gdGhlIG5leHQgdGltZSB0aG91Z2guCisJICoKKwkgKiBJZiB0aGUgZXh0ZW50IHdlIGZvdW5kIGlzIGluc2lkZSBvdXIgcmFuZ2UsIHdlIHNldCB0aGUKKwkgKiBkZXNpcmVkIGJpdCBvbiBpdC4KKwkgKi8KKwlpZiAoc3RhdGUtPnN0YXJ0IDwgc3RhcnQpIHsKKwkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGVfYXRvbWljKHByZWFsbG9jKTsKKwkJaWYgKCFwcmVhbGxvYykKKwkJCXJldHVybiAtRU5PTUVNOworCQllcnIgPSBzcGxpdF9zdGF0ZSh0cmVlLCBzdGF0ZSwgcHJlYWxsb2MsIHN0YXJ0KTsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKwkJcHJlYWxsb2MgPSBOVUxMOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWlmIChzdGF0ZS0+ZW5kIDw9IGVuZCkgeworCQkJc2V0X3N0YXRlX2JpdHModHJlZSwgc3RhdGUsICZiaXRzKTsKKwkJCWNsZWFyX3N0YXRlX2JpdCh0cmVlLCBzdGF0ZSwgJmNsZWFyX2JpdHMsIDApOworCQkJbWVyZ2Vfc3RhdGUodHJlZSwgc3RhdGUpOworCQkJaWYgKGxhc3RfZW5kID09ICh1NjQpLTEpCisJCQkJZ290byBvdXQ7CisJCQlzdGFydCA9IGxhc3RfZW5kICsgMTsKKwkJfQorCQlnb3RvIHNlYXJjaF9hZ2FpbjsKKwl9CisJLyoKKwkgKiB8IC0tLS0gZGVzaXJlZCByYW5nZSAtLS0tIHwKKwkgKiAgICAgfCBzdGF0ZSB8IG9yICAgICAgICAgICAgICAgfCBzdGF0ZSB8CisJICoKKwkgKiBUaGVyZSdzIGEgaG9sZSwgd2UgbmVlZCB0byBpbnNlcnQgc29tZXRoaW5nIGluIGl0IGFuZAorCSAqIGlnbm9yZSB0aGUgZXh0ZW50IHdlIGZvdW5kLgorCSAqLworCWlmIChzdGF0ZS0+c3RhcnQgPiBzdGFydCkgeworCQl1NjQgdGhpc19lbmQ7CisJCWlmIChlbmQgPCBsYXN0X3N0YXJ0KQorCQkJdGhpc19lbmQgPSBlbmQ7CisJCWVsc2UKKwkJCXRoaXNfZW5kID0gbGFzdF9zdGFydCAtIDE7CisKKwkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGVfYXRvbWljKHByZWFsbG9jKTsKKwkJaWYgKCFwcmVhbGxvYykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qCisJCSAqIEF2b2lkIHRvIGZyZWUgJ3ByZWFsbG9jJyBpZiBpdCBjYW4gYmUgbWVyZ2VkIHdpdGgKKwkJICogdGhlIGxhdGVyIGV4dGVudC4KKwkJICovCisJCWVyciA9IGluc2VydF9zdGF0ZSh0cmVlLCBwcmVhbGxvYywgc3RhcnQsIHRoaXNfZW5kLAorCQkJCSAgICZiaXRzKTsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKwkJaWYgKGVycikgeworCQkJZnJlZV9leHRlbnRfc3RhdGUocHJlYWxsb2MpOworCQkJcHJlYWxsb2MgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJlYWxsb2MgPSBOVUxMOworCQlzdGFydCA9IHRoaXNfZW5kICsgMTsKKwkJZ290byBzZWFyY2hfYWdhaW47CisJfQorCS8qCisJICogfCAtLS0tIGRlc2lyZWQgcmFuZ2UgLS0tLSB8CisJICogICAgICAgICAgICAgICAgICAgICAgICB8IHN0YXRlIHwKKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHRoZSBleHRlbnQsIGFuZCBzZXQgdGhlIGJpdAorCSAqIG9uIHRoZSBmaXJzdCBoYWxmCisJICovCisJaWYgKHN0YXRlLT5zdGFydCA8PSBlbmQgJiYgc3RhdGUtPmVuZCA+IGVuZCkgeworCQlwcmVhbGxvYyA9IGFsbG9jX2V4dGVudF9zdGF0ZV9hdG9taWMocHJlYWxsb2MpOworCQlpZiAoIXByZWFsbG9jKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJZXJyID0gc3BsaXRfc3RhdGUodHJlZSwgc3RhdGUsIHByZWFsbG9jLCBlbmQgKyAxKTsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKworCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBwcmVhbGxvYywgJmJpdHMpOworCQljbGVhcl9zdGF0ZV9iaXQodHJlZSwgcHJlYWxsb2MsICZjbGVhcl9iaXRzLCAwKTsKKworCQltZXJnZV9zdGF0ZSh0cmVlLCBwcmVhbGxvYyk7CisJCXByZWFsbG9jID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJZ290byBzZWFyY2hfYWdhaW47CisKK291dDoKKwlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJaWYgKHByZWFsbG9jKQorCQlmcmVlX2V4dGVudF9zdGF0ZShwcmVhbGxvYyk7CisKKwlyZXR1cm4gZXJyOworCitzZWFyY2hfYWdhaW46CisJaWYgKHN0YXJ0ID4gZW5kKQorCQlnb3RvIG91dDsKKwlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJaWYgKG1hc2sgJiBfX0dGUF9XQUlUKQorCQljb25kX3Jlc2NoZWQoKTsKKwlnb3RvIGFnYWluOworfQorCiAvKiB3cmFwcGVycyBhcm91bmQgc2V0L2NsZWFyIGV4dGVudCBiaXQgKi8KIGludCBzZXRfZXh0ZW50X2RpcnR5KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkgICAgIGdmcF90IG1hc2spCkBAIC05MTksNyArMTEwOCw3IEBACiAJCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICoqY2FjaGVkX3N0YXRlLCBnZnBfdCBtYXNrKQogewogCXJldHVybiBzZXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLAotCQkJICAgICAgRVhURU5UX0RFTEFMTE9DIHwgRVhURU5UX0RJUlRZIHwgRVhURU5UX1VQVE9EQVRFLAorCQkJICAgICAgRVhURU5UX0RFTEFMTE9DIHwgRVhURU5UX1VQVE9EQVRFLAogCQkJICAgICAgMCwgTlVMTCwgY2FjaGVkX3N0YXRlLCBtYXNrKTsKIH0KIApAQCAtMTU5OSw2ICsxNzg4LDM2OCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogV2hlbiBJTyBmYWlscywgZWl0aGVyIHdpdGggRUlPIG9yIGNzdW0gdmVyaWZpY2F0aW9uIGZhaWxzLCB3ZQorICogdHJ5IG90aGVyIG1pcnJvcnMgdGhhdCBtaWdodCBoYXZlIGEgZ29vZCBjb3B5IG9mIHRoZSBkYXRhLiAgVGhpcworICogaW9fZmFpbHVyZV9yZWNvcmQgaXMgdXNlZCB0byByZWNvcmQgc3RhdGUgYXMgd2UgZ28gdGhyb3VnaCBhbGwgdGhlCisgKiBtaXJyb3JzLiAgSWYgYW5vdGhlciBtaXJyb3IgaGFzIGdvb2QgZGF0YSwgdGhlIHBhZ2UgaXMgc2V0IHVwIHRvIGRhdGUKKyAqIGFuZCB0aGluZ3MgY29udGludWUuICBJZiBhIGdvb2QgbWlycm9yIGNhbid0IGJlIGZvdW5kLCB0aGUgb3JpZ2luYWwKKyAqIGJpbyBlbmRfaW8gY2FsbGJhY2sgaXMgY2FsbGVkIHRvIGluZGljYXRlIHRoaW5ncyBoYXZlIGZhaWxlZC4KKyAqLworc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1NjQgc3RhcnQ7CisJdTY0IGxlbjsKKwl1NjQgbG9naWNhbDsKKwl1bnNpZ25lZCBsb25nIGJpb19mbGFnczsKKwlpbnQgdGhpc19taXJyb3I7CisJaW50IGZhaWxlZF9taXJyb3I7CisJaW50IGluX3ZhbGlkYXRpb247Cit9OworCitzdGF0aWMgaW50IGZyZWVfaW9fZmFpbHVyZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW9fZmFpbHVyZV9yZWNvcmQgKnJlYywKKwkJCQlpbnQgZGlkX3JlcGFpcikKK3sKKwlpbnQgcmV0OworCWludCBlcnIgPSAwOworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZmFpbHVyZV90cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb19mYWlsdXJlX3RyZWU7CisKKwlzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHJlYy0+c3RhcnQsIDApOworCXJldCA9IGNsZWFyX2V4dGVudF9iaXRzKGZhaWx1cmVfdHJlZSwgcmVjLT5zdGFydCwKKwkJCQlyZWMtPnN0YXJ0ICsgcmVjLT5sZW4gLSAxLAorCQkJCUVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfRElSVFksIEdGUF9OT0ZTKTsKKwlpZiAocmV0KQorCQllcnIgPSByZXQ7CisKKwlpZiAoZGlkX3JlcGFpcikgeworCQlyZXQgPSBjbGVhcl9leHRlbnRfYml0cygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHJlYy0+c3RhcnQsCisJCQkJCXJlYy0+c3RhcnQgKyByZWMtPmxlbiAtIDEsCisJCQkJCUVYVEVOVF9EQU1BR0VELCBHRlBfTk9GUyk7CisJCWlmIChyZXQgJiYgIWVycikKKwkJCWVyciA9IHJldDsKKwl9CisKKwlrZnJlZShyZWMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJlcGFpcl9pb19mYWlsdXJlX2NhbGxiYWNrKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwljb21wbGV0ZShiaW8tPmJpX3ByaXZhdGUpOworfQorCisvKgorICogdGhpcyBieXBhc3NlcyB0aGUgc3RhbmRhcmQgYnRyZnMgc3VibWl0IGZ1bmN0aW9ucyBkZWxpYmVyYXRlbHksIGFzCisgKiB0aGUgc3RhbmRhcmQgYmVoYXZpb3IgaXMgdG8gd3JpdGUgYWxsIGNvcGllcyBpbiBhIHJhaWQgc2V0dXAuIGhlcmUgd2Ugb25seQorICogd2FudCB0byB3cml0ZSB0aGUgb25lIGJhZCBjb3B5LiBzbyB3ZSBkbyB0aGUgbWFwcGluZyBmb3Igb3Vyc2VsdmVzIGFuZCBpc3N1ZQorICogc3VibWl0X2JpbyBkaXJlY3RseS4KKyAqIHRvIGF2b2lkIGFueSBzeW5jaG9uaXphdGlvbiBpc3N1ZXMsIHdhaXQgZm9yIHRoZSBkYXRhIGFmdGVyIHdyaXRpbmcsIHdoaWNoCisgKiBhY3R1YWxseSBwcmV2ZW50cyB0aGUgcmVhZCB0aGF0IHRyaWdnZXJlZCB0aGUgZXJyb3IgZnJvbSBmaW5pc2hpbmcuCisgKiBjdXJyZW50bHksIHRoZXJlIGNhbiBiZSBubyBtb3JlIHRoYW4gdHdvIGNvcGllcyBvZiBldmVyeSBkYXRhIGJpdC4gdGh1cywKKyAqIGV4YWN0bHkgb25lIHJld3JpdGUgaXMgcmVxdWlyZWQuCisgKi8KK2ludCByZXBhaXJfaW9fZmFpbHVyZShzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgdTY0IHN0YXJ0LAorCQkJdTY0IGxlbmd0aCwgdTY0IGxvZ2ljYWwsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJaW50IG1pcnJvcl9udW0pCit7CisJc3RydWN0IGJpbyAqYmlvOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldjsKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhjb21wbCk7CisJdTY0IG1hcF9sZW5ndGggPSAwOworCXU2NCBzZWN0b3I7CisJc3RydWN0IGJ0cmZzX2JpbyAqYmJpbyA9IE5VTEw7CisJaW50IHJldDsKKworCUJVR19PTighbWlycm9yX251bSk7CisKKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIDEpOworCWlmICghYmlvKQorCQlyZXR1cm4gLUVJTzsKKwliaW8tPmJpX3ByaXZhdGUgPSAmY29tcGw7CisJYmlvLT5iaV9lbmRfaW8gPSByZXBhaXJfaW9fZmFpbHVyZV9jYWxsYmFjazsKKwliaW8tPmJpX3NpemUgPSAwOworCW1hcF9sZW5ndGggPSBsZW5ndGg7CisKKwlyZXQgPSBidHJmc19tYXBfYmxvY2sobWFwX3RyZWUsIFdSSVRFLCBsb2dpY2FsLAorCQkJICAgICAgJm1hcF9sZW5ndGgsICZiYmlvLCBtaXJyb3JfbnVtKTsKKwlpZiAocmV0KSB7CisJCWJpb19wdXQoYmlvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCUJVR19PTihtaXJyb3JfbnVtICE9IGJiaW8tPm1pcnJvcl9udW0pOworCXNlY3RvciA9IGJiaW8tPnN0cmlwZXNbbWlycm9yX251bS0xXS5waHlzaWNhbCA+PiA5OworCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCWRldiA9IGJiaW8tPnN0cmlwZXNbbWlycm9yX251bS0xXS5kZXY7CisJa2ZyZWUoYmJpbyk7CisJaWYgKCFkZXYgfHwgIWRldi0+YmRldiB8fCAhZGV2LT53cml0ZWFibGUpIHsKKwkJYmlvX3B1dChiaW8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJYmlvLT5iaV9iZGV2ID0gZGV2LT5iZGV2OworCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIGxlbmd0aCwgc3RhcnQtcGFnZV9vZmZzZXQocGFnZSkpOworCXN1Ym1pdF9iaW8oV1JJVEVfU1lOQywgYmlvKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbCk7CisKKwlpZiAoIXRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpKSB7CisJCS8qIHRyeSB0byByZW1hcCB0aGF0IGV4dGVudCBlbHNld2hlcmU/ICovCisJCWJpb19wdXQoYmlvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnMgcmVhZCBlcnJvciBjb3JyZWN0ZWQ6IGlubyAlbHUgb2ZmICVsbHUgKGRldiAlcyAiCisJCQkic2VjdG9yICVsbHUpXG4iLCBwYWdlLT5tYXBwaW5nLT5ob3N0LT5pX2lubywgc3RhcnQsCisJCQlkZXYtPm5hbWUsIHNlY3Rvcik7CisKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBlYWNoIHRpbWUgYW4gSU8gZmluaXNoZXMsIHdlIGRvIGEgZmFzdCBjaGVjayBpbiB0aGUgSU8gZmFpbHVyZSB0cmVlCisgKiB0byBzZWUgaWYgd2UgbmVlZCB0byBwcm9jZXNzIG9yIGNsZWFuIHVwIGFuIGlvX2ZhaWx1cmVfcmVjb3JkCisgKi8KK3N0YXRpYyBpbnQgY2xlYW5faW9fZmFpbHVyZSh1NjQgc3RhcnQsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXU2NCBwcml2YXRlOworCXU2NCBwcml2YXRlX2ZhaWx1cmU7CisJc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICpmYWlscmVjOworCXN0cnVjdCBidHJmc19tYXBwaW5nX3RyZWUgKm1hcF90cmVlOworCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOworCWludCBudW1fY29waWVzOworCWludCBkaWRfcmVwYWlyID0gMDsKKwlpbnQgcmV0OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCisJcHJpdmF0ZSA9IDA7CisJcmV0ID0gY291bnRfcmFuZ2VfYml0cygmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZSwgJnByaXZhdGUsCisJCQkJKHU2NCktMSwgMSwgRVhURU5UX0RJUlRZLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBnZXRfc3RhdGVfcHJpdmF0ZSgmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZSwgc3RhcnQsCisJCQkJJnByaXZhdGVfZmFpbHVyZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisKKwlmYWlscmVjID0gKHN0cnVjdCBpb19mYWlsdXJlX3JlY29yZCAqKSh1bnNpZ25lZCBsb25nKSBwcml2YXRlX2ZhaWx1cmU7CisJQlVHX09OKCFmYWlscmVjLT50aGlzX21pcnJvcik7CisKKwlpZiAoZmFpbHJlYy0+aW5fdmFsaWRhdGlvbikgeworCQkvKiB0aGVyZSB3YXMgbm8gcmVhbCBlcnJvciwganVzdCBmcmVlIHRoZSByZWNvcmQgKi8KKwkJcHJfZGVidWcoImNsZWFuX2lvX2ZhaWx1cmU6IGZyZWVpbmcgZHVtbXkgZXJyb3IgYXQgJWxsdVxuIiwKKwkJCSBmYWlscmVjLT5zdGFydCk7CisJCWRpZF9yZXBhaXIgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLmxvY2spOworCXN0YXRlID0gZmluZF9maXJzdF9leHRlbnRfYml0X3N0YXRlKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkJICAgIGZhaWxyZWMtPnN0YXJ0LAorCQkJCQkgICAgRVhURU5UX0xPQ0tFRCk7CisJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLmxvY2spOworCisJaWYgKHN0YXRlICYmIHN0YXRlLT5zdGFydCA9PSBmYWlscmVjLT5zdGFydCkgeworCQltYXBfdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+bWFwcGluZ190cmVlOworCQludW1fY29waWVzID0gYnRyZnNfbnVtX2NvcGllcyhtYXBfdHJlZSwgZmFpbHJlYy0+bG9naWNhbCwKKwkJCQkJCWZhaWxyZWMtPmxlbik7CisJCWlmIChudW1fY29waWVzID4gMSkgIHsKKwkJCXJldCA9IHJlcGFpcl9pb19mYWlsdXJlKG1hcF90cmVlLCBzdGFydCwgZmFpbHJlYy0+bGVuLAorCQkJCQkJZmFpbHJlYy0+bG9naWNhbCwgcGFnZSwKKwkJCQkJCWZhaWxyZWMtPmZhaWxlZF9taXJyb3IpOworCQkJZGlkX3JlcGFpciA9ICFyZXQ7CisJCX0KKwl9CisKK291dDoKKwlpZiAoIXJldCkKKwkJcmV0ID0gZnJlZV9pb19mYWlsdXJlKGlub2RlLCBmYWlscmVjLCBkaWRfcmVwYWlyKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0aGlzIGlzIGEgZ2VuZXJpYyBoYW5kbGVyIGZvciByZWFkcGFnZSBlcnJvcnMgKGRlZmF1bHQKKyAqIHJlYWRwYWdlX2lvX2ZhaWxlZF9ob29rKS4gaWYgb3RoZXIgY29waWVzIGV4aXN0LCByZWFkIHRob3NlIGFuZCB3cml0ZSBiYWNrCisgKiBnb29kIGRhdGEgdG8gdGhlIGZhaWxlZCBwb3NpdGlvbi4gZG9lcyBub3QgaW52ZXN0aWdhdGUgaW4gcmVtYXBwaW5nIHRoZQorICogZmFpbGVkIGV4dGVudCBlbHNld2hlcmUsIGhvcGluZyB0aGUgZGV2aWNlIHdpbGwgYmUgc21hcnQgZW5vdWdoIHRvIGRvIHRoaXMgYXMKKyAqIG5lZWRlZAorICovCisKK3N0YXRpYyBpbnQgYmlvX3JlYWRwYWdlX2Vycm9yKHN0cnVjdCBiaW8gKmZhaWxlZF9iaW8sIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCXU2NCBzdGFydCwgdTY0IGVuZCwgaW50IGZhaWxlZF9taXJyb3IsCisJCQkJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICpmYWlscmVjID0gTlVMTDsKKwl1NjQgcHJpdmF0ZTsKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGV4dGVudF9pb190cmVlICpmYWlsdXJlX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZTsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7CisJc3RydWN0IGJpbyAqYmlvOworCWludCBudW1fY29waWVzOworCWludCByZXQ7CisJaW50IHJlYWRfbW9kZTsKKwl1NjQgbG9naWNhbDsKKworCUJVR19PTihmYWlsZWRfYmlvLT5iaV9ydyAmIFJFUV9XUklURSk7CisKKwlyZXQgPSBnZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHN0YXJ0LCAmcHJpdmF0ZSk7CisJaWYgKHJldCkgeworCQlmYWlscmVjID0ga3phbGxvYyhzaXplb2YoKmZhaWxyZWMpLCBHRlBfTk9GUyk7CisJCWlmICghZmFpbHJlYykKKwkJCXJldHVybiAtRU5PTUVNOworCQlmYWlscmVjLT5zdGFydCA9IHN0YXJ0OworCQlmYWlscmVjLT5sZW4gPSBlbmQgLSBzdGFydCArIDE7CisJCWZhaWxyZWMtPnRoaXNfbWlycm9yID0gMDsKKwkJZmFpbHJlYy0+YmlvX2ZsYWdzID0gMDsKKwkJZmFpbHJlYy0+aW5fdmFsaWRhdGlvbiA9IDA7CisKKwkJcmVhZF9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgc3RhcnQsIGZhaWxyZWMtPmxlbik7CisJCWlmICghZW0pIHsKKwkJCXJlYWRfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJCWtmcmVlKGZhaWxyZWMpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoZW0tPnN0YXJ0ID4gc3RhcnQgfHwgZW0tPnN0YXJ0ICsgZW0tPmxlbiA8IHN0YXJ0KSB7CisJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJZW0gPSBOVUxMOworCQl9CisJCXJlYWRfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKworCQlpZiAoIWVtIHx8IElTX0VSUihlbSkpIHsKKwkJCWtmcmVlKGZhaWxyZWMpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJbG9naWNhbCA9IHN0YXJ0IC0gZW0tPnN0YXJ0OworCQlsb2dpY2FsID0gZW0tPmJsb2NrX3N0YXJ0ICsgbG9naWNhbDsKKwkJaWYgKHRlc3RfYml0KEVYVEVOVF9GTEFHX0NPTVBSRVNTRUQsICZlbS0+ZmxhZ3MpKSB7CisJCQlsb2dpY2FsID0gZW0tPmJsb2NrX3N0YXJ0OworCQkJZmFpbHJlYy0+YmlvX2ZsYWdzID0gRVhURU5UX0JJT19DT01QUkVTU0VEOworCQkJZXh0ZW50X3NldF9jb21wcmVzc190eXBlKCZmYWlscmVjLT5iaW9fZmxhZ3MsCisJCQkJCQkgZW0tPmNvbXByZXNzX3R5cGUpOworCQl9CisJCXByX2RlYnVnKCJiaW9fcmVhZHBhZ2VfZXJyb3I6IChuZXcpIGxvZ2ljYWw9JWxsdSwgc3RhcnQ9JWxsdSwgIgorCQkJICJsZW49JWxsdVxuIiwgbG9naWNhbCwgc3RhcnQsIGZhaWxyZWMtPmxlbik7CisJCWZhaWxyZWMtPmxvZ2ljYWwgPSBsb2dpY2FsOworCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCisJCS8qIHNldCB0aGUgYml0cyBpbiB0aGUgcHJpdmF0ZSBmYWlsdXJlIHRyZWUgKi8KKwkJcmV0ID0gc2V0X2V4dGVudF9iaXRzKGZhaWx1cmVfdHJlZSwgc3RhcnQsIGVuZCwKKwkJCQkJRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9ESVJUWSwgR0ZQX05PRlMpOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSBzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHN0YXJ0LAorCQkJCQkJKHU2NCkodW5zaWduZWQgbG9uZylmYWlscmVjKTsKKwkJLyogc2V0IHRoZSBiaXRzIGluIHRoZSBpbm9kZSdzIHRyZWUgKi8KKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gc2V0X2V4dGVudF9iaXRzKHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9EQU1BR0VELAorCQkJCQkJR0ZQX05PRlMpOworCQlpZiAocmV0IDwgMCkgeworCQkJa2ZyZWUoZmFpbHJlYyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJZmFpbHJlYyA9IChzdHJ1Y3QgaW9fZmFpbHVyZV9yZWNvcmQgKikodW5zaWduZWQgbG9uZylwcml2YXRlOworCQlwcl9kZWJ1ZygiYmlvX3JlYWRwYWdlX2Vycm9yOiAoZm91bmQpIGxvZ2ljYWw9JWxsdSwgIgorCQkJICJzdGFydD0lbGx1LCBsZW49JWxsdSwgdmFsaWRhdGlvbj0lZFxuIiwKKwkJCSBmYWlscmVjLT5sb2dpY2FsLCBmYWlscmVjLT5zdGFydCwgZmFpbHJlYy0+bGVuLAorCQkJIGZhaWxyZWMtPmluX3ZhbGlkYXRpb24pOworCQkvKgorCQkgKiB3aGVuIGRhdGEgY2FuIGJlIG9uIGRpc2sgbW9yZSB0aGFuIHR3aWNlLCBhZGQgdG8gZmFpbHJlYyBoZXJlCisJCSAqIChlLmcuIHdpdGggYSBsaXN0IGZvciBmYWlsZWRfbWlycm9yKSB0byBtYWtlCisJCSAqIGNsZWFuX2lvX2ZhaWx1cmUoKSBjbGVhbiBhbGwgdGhvc2UgZXJyb3JzIGF0IG9uY2UuCisJCSAqLworCX0KKwludW1fY29waWVzID0gYnRyZnNfbnVtX2NvcGllcygKKwkJCSAgICAgICZCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+bWFwcGluZ190cmVlLAorCQkJICAgICAgZmFpbHJlYy0+bG9naWNhbCwgZmFpbHJlYy0+bGVuKTsKKwlpZiAobnVtX2NvcGllcyA9PSAxKSB7CisJCS8qCisJCSAqIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBjb3B5IG9mIHRoZSBkYXRhLCBzbyBkb24ndCBib3RoZXIgd2l0aAorCQkgKiBhbGwgdGhlIHJldHJ5IGFuZCBlcnJvciBjb3JyZWN0aW9uIGNvZGUgdGhhdCBmb2xsb3dzLiBubworCQkgKiBtYXR0ZXIgd2hhdCB0aGUgZXJyb3IgaXMsIGl0IGlzIHZlcnkgbGlrZWx5IHRvIHBlcnNpc3QuCisJCSAqLworCQlwcl9kZWJ1ZygiYmlvX3JlYWRwYWdlX2Vycm9yOiBjYW5ub3QgcmVwYWlyLCBudW1fY29waWVzID09IDEuICIKKwkJCSAic3RhdGU9JXAsIG51bV9jb3BpZXM9JWQsIG5leHRfbWlycm9yICVkLCAiCisJCQkgImZhaWxlZF9taXJyb3IgJWRcbiIsIHN0YXRlLCBudW1fY29waWVzLAorCQkJIGZhaWxyZWMtPnRoaXNfbWlycm9yLCBmYWlsZWRfbWlycm9yKTsKKwkJZnJlZV9pb19mYWlsdXJlKGlub2RlLCBmYWlscmVjLCAwKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFzdGF0ZSkgeworCQlzcGluX2xvY2soJnRyZWUtPmxvY2spOworCQlzdGF0ZSA9IGZpbmRfZmlyc3RfZXh0ZW50X2JpdF9zdGF0ZSh0cmVlLCBmYWlscmVjLT5zdGFydCwKKwkJCQkJCSAgICBFWFRFTlRfTE9DS0VEKTsKKwkJaWYgKHN0YXRlICYmIHN0YXRlLT5zdGFydCAhPSBmYWlscmVjLT5zdGFydCkKKwkJCXN0YXRlID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOworCX0KKworCS8qCisJICogdGhlcmUgYXJlIHR3byBwcmVtaXNlczoKKwkgKglhKSBkZWxpdmVyIGdvb2QgZGF0YSB0byB0aGUgY2FsbGVyCisJICoJYikgY29ycmVjdCB0aGUgYmFkIHNlY3RvcnMgb24gZGlzaworCSAqLworCWlmIChmYWlsZWRfYmlvLT5iaV92Y250ID4gMSkgeworCQkvKgorCQkgKiB0byBmdWxmaWxsIGIpLCB3ZSBuZWVkIHRvIGtub3cgdGhlIGV4YWN0IGZhaWxpbmcgc2VjdG9ycywgYXMKKwkJICogd2UgZG9uJ3Qgd2FudCB0byByZXdyaXRlIGFueSBtb3JlIHRoYW4gdGhlIGZhaWxlZCBvbmVzLiB0aHVzLAorCQkgKiB3ZSBuZWVkIHNlcGFyYXRlIHJlYWQgcmVxdWVzdHMgZm9yIHRoZSBmYWlsZWQgYmlvCisJCSAqCisJCSAqIGlmIHRoZSBmb2xsb3dpbmcgQlVHX09OIHRyaWdnZXJzLCBvdXIgdmFsaWRhdGlvbiByZXF1ZXN0IGdvdAorCQkgKiBtZXJnZWQuIHdlIG5lZWQgc2VwYXJhdGUgcmVxdWVzdHMgZm9yIG91ciBhbGdvcml0aG0gdG8gd29yay4KKwkJICovCisJCUJVR19PTihmYWlscmVjLT5pbl92YWxpZGF0aW9uKTsKKwkJZmFpbHJlYy0+aW5fdmFsaWRhdGlvbiA9IDE7CisJCWZhaWxyZWMtPnRoaXNfbWlycm9yID0gZmFpbGVkX21pcnJvcjsKKwkJcmVhZF9tb2RlID0gUkVBRF9TWU5DIHwgUkVRX0ZBSUxGQVNUX0RFVjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSdyZSByZWFkeSB0byBmdWxmaWxsIGEpIGFuZCBiKSBhbG9uZ3NpZGUuIGdldCBhIGdvb2QgY29weQorCQkgKiBvZiB0aGUgZmFpbGVkIHNlY3RvciBhbmQgaWYgd2Ugc3VjY2VlZCwgd2UgaGF2ZSBzZXR1cAorCQkgKiBldmVyeXRoaW5nIGZvciByZXBhaXJfaW9fZmFpbHVyZSB0byBkbyB0aGUgcmVzdCBmb3IgdXMuCisJCSAqLworCQlpZiAoZmFpbHJlYy0+aW5fdmFsaWRhdGlvbikgeworCQkJQlVHX09OKGZhaWxyZWMtPnRoaXNfbWlycm9yICE9IGZhaWxlZF9taXJyb3IpOworCQkJZmFpbHJlYy0+aW5fdmFsaWRhdGlvbiA9IDA7CisJCQlmYWlscmVjLT50aGlzX21pcnJvciA9IDA7CisJCX0KKwkJZmFpbHJlYy0+ZmFpbGVkX21pcnJvciA9IGZhaWxlZF9taXJyb3I7CisJCWZhaWxyZWMtPnRoaXNfbWlycm9yKys7CisJCWlmIChmYWlscmVjLT50aGlzX21pcnJvciA9PSBmYWlsZWRfbWlycm9yKQorCQkJZmFpbHJlYy0+dGhpc19taXJyb3IrKzsKKwkJcmVhZF9tb2RlID0gUkVBRF9TWU5DOworCX0KKworCWlmICghc3RhdGUgfHwgZmFpbHJlYy0+dGhpc19taXJyb3IgPiBudW1fY29waWVzKSB7CisJCXByX2RlYnVnKCJiaW9fcmVhZHBhZ2VfZXJyb3I6IChmYWlsKSBzdGF0ZT0lcCwgbnVtX2NvcGllcz0lZCwgIgorCQkJICJuZXh0X21pcnJvciAlZCwgZmFpbGVkX21pcnJvciAlZFxuIiwgc3RhdGUsCisJCQkgbnVtX2NvcGllcywgZmFpbHJlYy0+dGhpc19taXJyb3IsIGZhaWxlZF9taXJyb3IpOworCQlmcmVlX2lvX2ZhaWx1cmUoaW5vZGUsIGZhaWxyZWMsIDApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIDEpOworCWJpby0+YmlfcHJpdmF0ZSA9IHN0YXRlOworCWJpby0+YmlfZW5kX2lvID0gZmFpbGVkX2Jpby0+YmlfZW5kX2lvOworCWJpby0+Ymlfc2VjdG9yID0gZmFpbHJlYy0+bG9naWNhbCA+PiA5OworCWJpby0+YmlfYmRldiA9IEJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKKwliaW8tPmJpX3NpemUgPSAwOworCisJYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgZmFpbHJlYy0+bGVuLCBzdGFydCAtIHBhZ2Vfb2Zmc2V0KHBhZ2UpKTsKKworCXByX2RlYnVnKCJiaW9fcmVhZHBhZ2VfZXJyb3I6IHN1Ym1pdHRpbmcgbmV3IHJlYWRbJSN4XSB0byAiCisJCSAidGhpc19taXJyb3I9JWQsIG51bV9jb3BpZXM9JWQsIGluX3ZhbGlkYXRpb249JWRcbiIsIHJlYWRfbW9kZSwKKwkJIGZhaWxyZWMtPnRoaXNfbWlycm9yLCBudW1fY29waWVzLCBmYWlscmVjLT5pbl92YWxpZGF0aW9uKTsKKworCXRyZWUtPm9wcy0+c3VibWl0X2Jpb19ob29rKGlub2RlLCByZWFkX21vZGUsIGJpbywgZmFpbHJlYy0+dGhpc19taXJyb3IsCisJCQkJCWZhaWxyZWMtPmJpb19mbGFncywgMCk7CisJcmV0dXJuIDA7Cit9CisKIC8qIGxvdHMgYW5kIGxvdHMgb2Ygcm9vbSBmb3IgcGVyZm9ybWFuY2UgZml4ZXMgaW4gdGhlIGVuZF9iaW8gZnVuY3MgKi8KIAogLyoKQEAgLTE2OTcsNiArMjI0OCw5IEBACiAJCXN0cnVjdCBleHRlbnRfc3RhdGUgKmNhY2hlZCA9IE5VTEw7CiAJCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOwogCisJCXByX2RlYnVnKCJlbmRfYmlvX2V4dGVudF9yZWFkcGFnZTogYmlfdmNudD0lZCwgaWR4PSVkLCBlcnI9JWQsICIKKwkJCSAibWlycm9yPSVsZFxuIiwgYmlvLT5iaV92Y250LCBiaW8tPmJpX2lkeCwgZXJyLAorCQkJIChsb25nIGludCliaW8tPmJpX2JkZXYpOwogCQl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CiAKIAkJc3RhcnQgPSAoKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArCkBAIC0xNzI3LDExICsyMjgxLDE5IEBACiAJCQkJCQkJICAgICAgc3RhdGUpOwogCQkJaWYgKHJldCkKIAkJCQl1cHRvZGF0ZSA9IDA7CisJCQllbHNlCisJCQkJY2xlYW5faW9fZmFpbHVyZShzdGFydCwgcGFnZSk7CiAJCX0KLQkJaWYgKCF1cHRvZGF0ZSAmJiB0cmVlLT5vcHMgJiYKLQkJICAgIHRyZWUtPm9wcy0+cmVhZHBhZ2VfaW9fZmFpbGVkX2hvb2spIHsKLQkJCXJldCA9IHRyZWUtPm9wcy0+cmVhZHBhZ2VfaW9fZmFpbGVkX2hvb2soYmlvLCBwYWdlLAotCQkJCQkJCSBzdGFydCwgZW5kLCBOVUxMKTsKKwkJaWYgKCF1cHRvZGF0ZSkgeworCQkJdTY0IGZhaWxlZF9taXJyb3I7CisJCQlmYWlsZWRfbWlycm9yID0gKHU2NCliaW8tPmJpX2JkZXY7CisJCQlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+cmVhZHBhZ2VfaW9fZmFpbGVkX2hvb2spCisJCQkJcmV0ID0gdHJlZS0+b3BzLT5yZWFkcGFnZV9pb19mYWlsZWRfaG9vaygKKwkJCQkJCWJpbywgcGFnZSwgc3RhcnQsIGVuZCwKKwkJCQkJCWZhaWxlZF9taXJyb3IsIHN0YXRlKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBiaW9fcmVhZHBhZ2VfZXJyb3IoYmlvLCBwYWdlLCBzdGFydCwgZW5kLAorCQkJCQkJCSBmYWlsZWRfbWlycm9yLCBOVUxMKTsKIAkJCWlmIChyZXQgPT0gMCkgewogCQkJCXVwdG9kYXRlID0KIAkJCQkJdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CkBAIC0xODExLDYgKzIzNzMsNyBAQAogCQkJCQkgICBtaXJyb3JfbnVtLCBiaW9fZmxhZ3MsIHN0YXJ0KTsKIAllbHNlCiAJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CisKIAlpZiAoYmlvX2ZsYWdnZWQoYmlvLCBCSU9fRU9QTk9UU1VQUCkpCiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCWJpb19wdXQoYmlvKTsKQEAgLTIwNzYsMTYgKzI2MzksMTYgQEAKIH0KIAogaW50IGV4dGVudF9yZWFkX2Z1bGxfcGFnZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICAgIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCkKKwkJCSAgICBnZXRfZXh0ZW50X3QgKmdldF9leHRlbnQsIGludCBtaXJyb3JfbnVtKQogewogCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MgPSAwOwogCWludCByZXQ7CiAKLQlyZXQgPSBfX2V4dGVudF9yZWFkX2Z1bGxfcGFnZSh0cmVlLCBwYWdlLCBnZXRfZXh0ZW50LCAmYmlvLCAwLAorCXJldCA9IF9fZXh0ZW50X3JlYWRfZnVsbF9wYWdlKHRyZWUsIHBhZ2UsIGdldF9leHRlbnQsICZiaW8sIG1pcnJvcl9udW0sCiAJCQkJICAgICAgJmJpb19mbGFncyk7CiAJaWYgKGJpbykKLQkJcmV0ID0gc3VibWl0X29uZV9iaW8oUkVBRCwgYmlvLCAwLCBiaW9fZmxhZ3MpOworCQlyZXQgPSBzdWJtaXRfb25lX2JpbyhSRUFELCBiaW8sIG1pcnJvcl9udW0sIGJpb19mbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjEzNiw2ICsyNjk5LDcgQEAKIAlpbnQgY29tcHJlc3NlZDsKIAlpbnQgd3JpdGVfZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBucl93cml0dGVuID0gMDsKKwlib29sIGZpbGxfZGVsYWxsb2MgPSB0cnVlOwogCiAJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKQogCQl3cml0ZV9mbGFncyA9IFdSSVRFX1NZTkM7CkBAIC0yMTQ1LDYgKzI3MDksOSBAQAogCXRyYWNlX19fZXh0ZW50X3dyaXRlcGFnZShwYWdlLCBpbm9kZSwgd2JjKTsKIAogCVdBUk5fT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCisJQ2xlYXJQYWdlRXJyb3IocGFnZSk7CisKIAlwZ19vZmZzZXQgPSBpX3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CiAJaWYgKHBhZ2UtPmluZGV4ID4gZW5kX2luZGV4IHx8CiAJICAgKHBhZ2UtPmluZGV4ID09IGVuZF9pbmRleCAmJiAhcGdfb2Zmc2V0KSkgewpAQCAtMjE2NiwxMCArMjczMywxMyBAQAogCiAJc2V0X3BhZ2VfZXh0ZW50X21hcHBlZChwYWdlKTsKIAorCWlmICghdHJlZS0+b3BzIHx8ICF0cmVlLT5vcHMtPmZpbGxfZGVsYWxsb2MpCisJCWZpbGxfZGVsYWxsb2MgPSBmYWxzZTsKKwogCWRlbGFsbG9jX3N0YXJ0ID0gc3RhcnQ7CiAJZGVsYWxsb2NfZW5kID0gMDsKIAlwYWdlX3N0YXJ0ZWQgPSAwOwotCWlmICghZXBkLT5leHRlbnRfbG9ja2VkKSB7CisJaWYgKCFlcGQtPmV4dGVudF9sb2NrZWQgJiYgZmlsbF9kZWxhbGxvYykgewogCQl1NjQgZGVsYWxsb2NfdG9fd3JpdGUgPSAwOwogCQkvKgogCQkgKiBtYWtlIHN1cmUgdGhlIHdiYyBtYXBwaW5nIGluZGV4IGlzIGF0IGxlYXN0IHVwZGF0ZWQKQEAgLTI0MjEsMTAgKzI5OTEsMTYgQEAKIAkJCSAqIHN3aXp6bGVkIGJhY2sgZnJvbSBzd2FwcGVyX3NwYWNlIHRvIHRtcGZzIGZpbGUKIAkJCSAqIG1hcHBpbmcKIAkJCSAqLwotCQkJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPndyaXRlX2NhY2hlX3BhZ2VzX2xvY2tfaG9vaykKLQkJCQl0cmVlLT5vcHMtPndyaXRlX2NhY2hlX3BhZ2VzX2xvY2tfaG9vayhwYWdlKTsKLQkJCWVsc2UKLQkJCQlsb2NrX3BhZ2UocGFnZSk7CisJCQlpZiAodHJlZS0+b3BzICYmCisJCQkgICAgdHJlZS0+b3BzLT53cml0ZV9jYWNoZV9wYWdlc19sb2NrX2hvb2spIHsKKwkJCQl0cmVlLT5vcHMtPndyaXRlX2NhY2hlX3BhZ2VzX2xvY2tfaG9vayhwYWdlLAorCQkJCQkJCSAgICAgICBkYXRhLCBmbHVzaF9mbik7CisJCQl9IGVsc2UgeworCQkJCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CisJCQkJCWZsdXNoX2ZuKGRhdGEpOworCQkJCQlsb2NrX3BhZ2UocGFnZSk7CisJCQkJfQorCQkJfQogCiAJCQlpZiAodW5saWtlbHkocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSkgewogCQkJCXVubG9ja19wYWdlKHBhZ2UpOwpAQCAtMjkyNiw3ICszNTAyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpleHRlbnRfYnVmZmVyX3BhZ2Uoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAoraW5saW5lIHN0cnVjdCBwYWdlICpleHRlbnRfYnVmZmVyX3BhZ2Uoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGkpCiB7CiAJc3RydWN0IHBhZ2UgKnA7CkBAIC0yOTUxLDcgKzM1MjcsNyBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbnVtX2V4dGVudF9wYWdlcyh1NjQgc3RhcnQsIHU2NCBsZW4pCitpbmxpbmUgdW5zaWduZWQgbG9uZyBudW1fZXh0ZW50X3BhZ2VzKHU2NCBzdGFydCwgdTY0IGxlbikKIHsKIAlyZXR1cm4gKChzdGFydCArIGxlbiArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpIC0KIAkJKHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQpOwpAQCAtMzIwNCw2ICszNzgwLDcgQEAKIAkJCQkJCVBBR0VDQUNIRV9UQUdfRElSVFkpOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycSgmcGFnZS0+bWFwcGluZy0+dHJlZV9sb2NrKTsKKwkJQ2xlYXJQYWdlRXJyb3IocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMzNDksOCArMzkyNiw3IEBACiB9CiAKIGludCByZWFkX2V4dGVudF9idWZmZXJfcGFnZXMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAotCQkJICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCi0JCQkgICAgIHU2NCBzdGFydCwgaW50IHdhaXQsCisJCQkgICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgdTY0IHN0YXJ0LCBpbnQgd2FpdCwKIAkJCSAgICAgZ2V0X2V4dGVudF90ICpnZXRfZXh0ZW50LCBpbnQgbWlycm9yX251bSkKIHsKIAl1bnNpZ25lZCBsb25nIGk7CkBAIC0zMzg2LDcgKzM5NjIsNyBAQAogCW51bV9wYWdlcyA9IG51bV9leHRlbnRfcGFnZXMoZWItPnN0YXJ0LCBlYi0+bGVuKTsKIAlmb3IgKGkgPSBzdGFydF9pOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKIAkJcGFnZSA9IGV4dGVudF9idWZmZXJfcGFnZShlYiwgaSk7Ci0JCWlmICghd2FpdCkgeworCQlpZiAod2FpdCA9PSBXQUlUX05PTkUpIHsKIAkJCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKQogCQkJCWdvdG8gdW5sb2NrX2V4aXQ7CiAJCX0gZWxzZSB7CkBAIC0zNDMwLDcgKzQwMDYsNyBAQAogCWlmIChiaW8pCiAJCXN1Ym1pdF9vbmVfYmlvKFJFQUQsIGJpbywgbWlycm9yX251bSwgYmlvX2ZsYWdzKTsKIAotCWlmIChyZXQgfHwgIXdhaXQpCisJaWYgKHJldCB8fCB3YWl0ICE9IFdBSVRfQ09NUExFVEUpCiAJCXJldHVybiByZXQ7CiAKIAlmb3IgKGkgPSBzdGFydF9pOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9pby5oIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKaW5kZXggN2IyZjBjMy4uZmViOWJlMCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X2lvLmgKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKQEAgLTE3LDYgKzE3LDggQEAKICNkZWZpbmUgRVhURU5UX05PREFUQVNVTSAoMSA8PCAxMCkKICNkZWZpbmUgRVhURU5UX0RPX0FDQ09VTlRJTkcgKDEgPDwgMTEpCiAjZGVmaW5lIEVYVEVOVF9GSVJTVF9ERUxBTExPQyAoMSA8PCAxMikKKyNkZWZpbmUgRVhURU5UX05FRURfV0FJVCAoMSA8PCAxMykKKyNkZWZpbmUgRVhURU5UX0RBTUFHRUQgKDEgPDwgMTQpCiAjZGVmaW5lIEVYVEVOVF9JT0JJVFMgKEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfV1JJVEVCQUNLKQogI2RlZmluZSBFWFRFTlRfQ1RMQklUUyAoRVhURU5UX0RPX0FDQ09VTlRJTkcgfCBFWFRFTlRfRklSU1RfREVMQUxMT0MpCiAKQEAgLTMyLDYgKzM0LDcgQEAKICNkZWZpbmUgRVhURU5UX0JVRkZFUl9CTE9DS0lORyAxCiAjZGVmaW5lIEVYVEVOVF9CVUZGRVJfRElSVFkgMgogI2RlZmluZSBFWFRFTlRfQlVGRkVSX0NPUlJVUFQgMworI2RlZmluZSBFWFRFTlRfQlVGRkVSX1JFQURBSEVBRCA0CS8qIHRoaXMgZ290IHRyaWdnZXJlZCBieSByZWFkYWhlYWQgKi8KIAogLyogdGhlc2UgYXJlIGZsYWdzIGZvciBleHRlbnRfY2xlYXJfdW5sb2NrX2RlbGFsbG9jICovCiAjZGVmaW5lIEVYVEVOVF9DTEVBUl9VTkxPQ0tfUEFHRSAweDEKQEAgLTY3LDcgKzcwLDcgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKTsKIAlpbnQgKCpyZWFkcGFnZV9pb19ob29rKShzdHJ1Y3QgcGFnZSAqcGFnZSwgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKIAlpbnQgKCpyZWFkcGFnZV9pb19mYWlsZWRfaG9vaykoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBlbmQsIHU2NCBmYWlsZWRfbWlycm9yLAogCQkJCSAgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSk7CiAJaW50ICgqd3JpdGVwYWdlX2lvX2ZhaWxlZF9ob29rKShzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCQl1NjQgc3RhcnQsIHU2NCBlbmQsCkBAIC04NSw3ICs4OCw4IEBACiAJCQkJICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcik7CiAJdm9pZCAoKnNwbGl0X2V4dGVudF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3JpZywgdTY0IHNwbGl0KTsKLQlpbnQgKCp3cml0ZV9jYWNoZV9wYWdlc19sb2NrX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlKTsKKwlpbnQgKCp3cml0ZV9jYWNoZV9wYWdlc19sb2NrX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpkYXRhLAorCQkJCQkgICB2b2lkICgqZmx1c2hfZm4pKHZvaWQgKikpOwogfTsKIAogc3RydWN0IGV4dGVudF9pb190cmVlIHsKQEAgLTE4NSw3ICsxODksNyBAQAogaW50IHRyeV9sb2NrX2V4dGVudChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKIAkJICAgIGdmcF90IG1hc2spOwogaW50IGV4dGVudF9yZWFkX2Z1bGxfcGFnZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICBnZXRfZXh0ZW50X3QgKmdldF9leHRlbnQpOworCQkJICBnZXRfZXh0ZW50X3QgKmdldF9leHRlbnQsIGludCBtaXJyb3JfbnVtKTsKIGludCBfX2luaXQgZXh0ZW50X2lvX2luaXQodm9pZCk7CiB2b2lkIGV4dGVudF9pb19leGl0KHZvaWQpOwogCkBAIC0yMTQsNiArMjE4LDggQEAKIAkJICAgICBnZnBfdCBtYXNrKTsKIGludCBjbGVhcl9leHRlbnRfZGlydHkoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCSAgICAgICBnZnBfdCBtYXNrKTsKK2ludCBjb252ZXJ0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgICAgICBpbnQgYml0cywgaW50IGNsZWFyX2JpdHMsIGdmcF90IG1hc2spOwogaW50IHNldF9leHRlbnRfZGVsYWxsb2Moc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICoqY2FjaGVkX3N0YXRlLCBnZnBfdCBtYXNrKTsKIGludCBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsCkBAIC0yNDgsOSArMjU0LDE0IEBACiBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZmluZF9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKIAkJCQkJIHU2NCBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4pOwogdm9pZCBmcmVlX2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViKTsKKyNkZWZpbmUgV0FJVF9OT05FCTAKKyNkZWZpbmUgV0FJVF9DT01QTEVURQkxCisjZGVmaW5lIFdBSVRfUEFHRV9MT0NLCTIKIGludCByZWFkX2V4dGVudF9idWZmZXJfcGFnZXMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAogCQkJICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHU2NCBzdGFydCwgaW50IHdhaXQsCiAJCQkgICAgIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCwgaW50IG1pcnJvcl9udW0pOwordW5zaWduZWQgbG9uZyBudW1fZXh0ZW50X3BhZ2VzKHU2NCBzdGFydCwgdTY0IGxlbik7CitzdHJ1Y3QgcGFnZSAqZXh0ZW50X2J1ZmZlcl9wYWdlKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgdW5zaWduZWQgbG9uZyBpKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGV4dGVudF9idWZmZXJfZ2V0KHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKIHsKQEAgLTMwMCw0ICszMTEsMTAgQEAKIHN0cnVjdCBiaW8gKgogYnRyZnNfYmlvX2FsbG9jKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHU2NCBmaXJzdF9zZWN0b3IsIGludCBucl92ZWNzLAogCQlnZnBfdCBnZnBfZmxhZ3MpOworCitzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlOworCitpbnQgcmVwYWlyX2lvX2ZhaWx1cmUoc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUsIHU2NCBzdGFydCwKKwkJCXU2NCBsZW5ndGgsIHU2NCBsb2dpY2FsLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCWludCBtaXJyb3JfbnVtKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZmlsZS1pdGVtLmMgYi9mcy9idHJmcy9maWxlLWl0ZW0uYwppbmRleCBhMWNiNzgyLi5jN2ZiM2E0IDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLWl0ZW0uYworKysgYi9mcy9idHJmcy9maWxlLWl0ZW0uYwpAQCAtOTEsOCArOTEsNyBAQAogCXN0cnVjdCBidHJmc19jc3VtX2l0ZW0gKml0ZW07CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAJdTY0IGNzdW1fb2Zmc2V0ID0gMDsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWludCBjc3Vtc19pbl9pdGVtOwogCiAJZmlsZV9rZXkub2JqZWN0aWQgPSBCVFJGU19FWFRFTlRfQ1NVTV9PQkpFQ1RJRDsKQEAgLTE2Miw4ICsxNjEsNyBAQAogCXU2NCBpdGVtX2xhc3Rfb2Zmc2V0ID0gMDsKIAl1NjQgZGlza19ieXRlbnI7CiAJdTMyIGRpZmY7Ci0JdTE2IGNzdW1fc2l6ZSA9Ci0JCWJ0cmZzX3N1cGVyX2NzdW1fc2l6ZSgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CisJdTE2IGNzdW1fc2l6ZSA9IGJ0cmZzX3N1cGVyX2NzdW1fc2l6ZShyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKIAlpbnQgcmV0OwogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCXN0cnVjdCBidHJmc19jc3VtX2l0ZW0gKml0ZW0gPSBOVUxMOwpAQCAtMjkwLDcgKzI4OCw3IEBACiAJaW50IHJldDsKIAlzaXplX3Qgc2l6ZTsKIAl1NjQgY3N1bV9lbmQ7Ci0JdTE2IGNzdW1fc2l6ZSA9IGJ0cmZzX3N1cGVyX2NzdW1fc2l6ZSgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CisJdTE2IGNzdW1fc2l6ZSA9IGJ0cmZzX3N1cGVyX2NzdW1fc2l6ZShyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQpAQCAtNDkyLDggKzQ5MCw3IEBACiAJCQkJICAgICAgdTY0IGJ5dGVuciwgdTY0IGxlbikKIHsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCXU2NCBjc3VtX2VuZDsKIAl1NjQgZW5kX2J5dGUgPSBieXRlbnIgKyBsZW47CiAJdTMyIGJsb2Nrc2l6ZV9iaXRzID0gcm9vdC0+ZnNfaW5mby0+c2ItPnNfYmxvY2tzaXplX2JpdHM7CkBAIC01NDksOCArNTQ2LDcgQEAKIAl1NjQgY3N1bV9lbmQ7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAJaW50IHJldDsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWludCBibG9ja3NpemVfYml0cyA9IHJvb3QtPmZzX2luZm8tPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCiAJcm9vdCA9IHJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdDsKQEAgLTY3Niw4ICs2NzIsNyBAQAogCXN0cnVjdCBidHJmc19zZWN0b3Jfc3VtICpzZWN0b3Jfc3VtOwogCXUzMiBucml0ZW1zOwogCXUzMiBpbnNfc2l6ZTsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCmRpZmYgLS1naXQgYS9mcy9idHJmcy9maWxlLmMgYi9mcy9idHJmcy9maWxlLmMKaW5kZXggZTRlNTdkNS4uZGFmZGZhMCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZmlsZS5jCisrKyBiL2ZzL2J0cmZzL2ZpbGUuYwpAQCAtMTA2OSw2ICsxMDY5LDcgQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZkZW50cnkoZmlsZSktPmRfaW5vZGU7CisJZ2ZwX3QgbWFzayA9IGJ0cmZzX2FsbG9jX3dyaXRlX21hc2soaW5vZGUtPmlfbWFwcGluZyk7CiAJaW50IGVyciA9IDA7CiAJaW50IGZhaWxpID0gMDsKIAl1NjQgc3RhcnRfcG9zOwpAQCAtMTA4MCw3ICsxMDgxLDcgQEAKIGFnYWluOgogCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgewogCQlwYWdlc1tpXSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXggKyBpLAotCQkJCQkgICAgICAgR0ZQX05PRlMpOworCQkJCQkgICAgICAgbWFzayk7CiAJCWlmICghcGFnZXNbaV0pIHsKIAkJCWZhaWxpID0gaSAtIDE7CiAJCQllcnIgPSAtRU5PTUVNOwpAQCAtMTYxNSwxMCArMTYxNiw2IEBACiAJCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBidHJmc19jaGVja19kYXRhX2ZyZWVfc3BhY2UoaW5vZGUsIGFsbG9jX2VuZCAtIGFsbG9jX3N0YXJ0KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQogCWxvY2tlZF9lbmQgPSBhbGxvY19lbmQgLSAxOwogCXdoaWxlICgxKSB7CiAJCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKQEAgLTE2NjQsMTEgKzE2NjEsMjcgQEAKIAkJaWYgKGVtLT5ibG9ja19zdGFydCA9PSBFWFRFTlRfTUFQX0hPTEUgfHwKIAkJICAgIChjdXJfb2Zmc2V0ID49IGlub2RlLT5pX3NpemUgJiYKIAkJICAgICAhdGVzdF9iaXQoRVhURU5UX0ZMQUdfUFJFQUxMT0MsICZlbS0+ZmxhZ3MpKSkgeworCisJCQkvKgorCQkJICogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGJlZm9yZSB3ZSBkbyB0aGUKKwkJCSAqIGFsbG9jYXRpb24uCisJCQkgKi8KKwkJCXJldCA9IGJ0cmZzX2NoZWNrX2RhdGFfZnJlZV9zcGFjZShpbm9kZSwgbGFzdF9ieXRlIC0KKwkJCQkJCQkgIGN1cl9vZmZzZXQpOworCQkJaWYgKHJldCkgeworCQkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCXJldCA9IGJ0cmZzX3ByZWFsbG9jX2ZpbGVfcmFuZ2UoaW5vZGUsIG1vZGUsIGN1cl9vZmZzZXQsCiAJCQkJCQkJbGFzdF9ieXRlIC0gY3VyX29mZnNldCwKIAkJCQkJCQkxIDw8IGlub2RlLT5pX2Jsa2JpdHMsCiAJCQkJCQkJb2Zmc2V0ICsgbGVuLAogCQkJCQkJCSZhbGxvY19oaW50KTsKKworCQkJLyogTGV0IGdvIG9mIG91ciByZXNlcnZhdGlvbi4gKi8KKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgbGFzdF9ieXRlIC0KKwkJCQkJCSAgICAgICBjdXJfb2Zmc2V0KTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKIAkJCQlicmVhazsKQEAgLTE2OTQsOCArMTcwNyw2IEBACiAJfQogCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgYWxsb2Nfc3RhcnQsIGxvY2tlZF9lbmQsCiAJCQkgICAgICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKLQotCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgYWxsb2NfZW5kIC0gYWxsb2Nfc3RhcnQpOwogb3V0OgogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0xODIxLDcgKzE4MzIsNyBAQAogCXN3aXRjaCAob3JpZ2luKSB7CiAJY2FzZSBTRUVLX0VORDoKIAljYXNlIFNFRUtfQ1VSOgotCQlvZmZzZXQgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwkJb2Zmc2V0ID0gZ2VuZXJpY19maWxlX2xsc2VlayhmaWxlLCBvZmZzZXQsIG9yaWdpbik7CiAJCWdvdG8gb3V0OwogCWNhc2UgU0VFS19EQVRBOgogCWNhc2UgU0VFS19IT0xFOgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jIGIvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jCmluZGV4IDQxYWM5MjcuLjE4MTc2MGYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2ZyZWUtc3BhY2UtY2FjaGUuYworKysgYi9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlICJjdHJlZS5oIgogI2luY2x1ZGUgImZyZWUtc3BhY2UtY2FjaGUuaCIKICNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgpAQCAtODQsNiArODUsNyBAQAogCQkJCSAgICAgICpibG9ja19ncm91cCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJdTMyIGZsYWdzID0gQlRSRlNfSU5PREVfTk9EQVRBU1VNIHwgQlRSRlNfSU5PREVfTk9EQVRBQ09XOwogCiAJc3Bpbl9sb2NrKCZibG9ja19ncm91cC0+bG9jayk7CiAJaWYgKGJsb2NrX2dyb3VwLT5pbm9kZSkKQEAgLTk4LDEzICsxMDAsMTQgQEAKIAkJcmV0dXJuIGlub2RlOwogCiAJc3Bpbl9sb2NrKCZibG9ja19ncm91cC0+bG9jayk7Ci0JaWYgKEJUUkZTX0koaW5vZGUpLT5mbGFncyAmIEJUUkZTX0lOT0RFX05PREFUQVNVTSkgeworCWlmICghKChCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJiBmbGFncykgPT0gZmxhZ3MpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIk9sZCBzdHlsZSBzcGFjZSBpbm9kZSBmb3VuZCwgY29udmVydGluZy5cbiIpOwotCQlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJj0gfkJUUkZTX0lOT0RFX05PREFUQVNVTTsKKwkJQlRSRlNfSShpbm9kZSktPmZsYWdzIHw9IEJUUkZTX0lOT0RFX05PREFUQVNVTSB8CisJCQlCVFJGU19JTk9ERV9OT0RBVEFDT1c7CiAJCWJsb2NrX2dyb3VwLT5kaXNrX2NhY2hlX3N0YXRlID0gQlRSRlNfRENfQ0xFQVI7CiAJfQogCi0JaWYgKCFidHJmc19mc19jbG9zaW5nKHJvb3QtPmZzX2luZm8pKSB7CisJaWYgKCFibG9ja19ncm91cC0+aXJlZikgewogCQlibG9ja19ncm91cC0+aW5vZGUgPSBpZ3JhYihpbm9kZSk7CiAJCWJsb2NrX2dyb3VwLT5pcmVmID0gMTsKIAl9CkBAIC0xMjIsMTIgKzEyNSwxNyBAQAogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2hlYWRlciAqaGVhZGVyOwogCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtOwogCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXU2NCBmbGFncyA9IEJUUkZTX0lOT0RFX05PQ09NUFJFU1MgfCBCVFJGU19JTk9ERV9QUkVBTExPQzsKIAlpbnQgcmV0OwogCiAJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2lub2RlKHRyYW5zLCByb290LCBwYXRoLCBpbm8pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwkvKiBXZSBpbmxpbmUgY3JjJ3MgZm9yIHRoZSBmcmVlIGRpc2sgc3BhY2UgY2FjaGUgKi8KKwlpZiAoaW5vICE9IEJUUkZTX0ZSRUVfSU5PX09CSkVDVElEKQorCQlmbGFncyB8PSBCVFJGU19JTk9ERV9OT0RBVEFTVU0gfCBCVFJGU19JTk9ERV9OT0RBVEFDT1c7CisKIAlsZWFmID0gcGF0aC0+bm9kZXNbMF07CiAJaW5vZGVfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSk7CkBAIC0xNDAsOCArMTQ4LDcgQEAKIAlidHJmc19zZXRfaW5vZGVfdWlkKGxlYWYsIGlub2RlX2l0ZW0sIDApOwogCWJ0cmZzX3NldF9pbm9kZV9naWQobGVhZiwgaW5vZGVfaXRlbSwgMCk7CiAJYnRyZnNfc2V0X2lub2RlX21vZGUobGVhZiwgaW5vZGVfaXRlbSwgU19JRlJFRyB8IDA2MDApOwotCWJ0cmZzX3NldF9pbm9kZV9mbGFncyhsZWFmLCBpbm9kZV9pdGVtLCBCVFJGU19JTk9ERV9OT0NPTVBSRVNTIHwKLQkJCSAgICAgIEJUUkZTX0lOT0RFX1BSRUFMTE9DKTsKKwlidHJmc19zZXRfaW5vZGVfZmxhZ3MobGVhZiwgaW5vZGVfaXRlbSwgZmxhZ3MpOwogCWJ0cmZzX3NldF9pbm9kZV9ubGluayhsZWFmLCBpbm9kZV9pdGVtLCAxKTsKIAlidHJmc19zZXRfaW5vZGVfdHJhbnNpZChsZWFmLCBpbm9kZV9pdGVtLCB0cmFucy0+dHJhbnNpZCk7CiAJYnRyZnNfc2V0X2lub2RlX2Jsb2NrX2dyb3VwKGxlYWYsIGlub2RlX2l0ZW0sIG9mZnNldCk7CkBAIC0xOTEsMTYgKzE5OCwyNCBAQAogCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdjsKKwl1NjQgbmVlZGVkX2J5dGVzOwogCWxvZmZfdCBvbGRzaXplOwogCWludCByZXQgPSAwOwogCiAJcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQl0cmFucy0+YmxvY2tfcnN2ID0gcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdjsKLQlyZXQgPSBidHJmc19ibG9ja19yc3ZfY2hlY2sodHJhbnMsIHJvb3QsCi0JCQkJICAgIHJvb3QtPm9ycGhhbl9ibG9ja19yc3YsCi0JCQkJICAgIDAsIDUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCisJLyogMSBmb3Igc2xhY2sgc3BhY2UsIDEgZm9yIHVwZGF0aW5nIHRoZSBpbm9kZSAqLworCW5lZWRlZF9ieXRlcyA9IGJ0cmZzX2NhbGNfdHJ1bmNfbWV0YWRhdGFfc2l6ZShyb290LCAxKSArCisJCWJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCAxKTsKKworCXNwaW5fbG9jaygmdHJhbnMtPmJsb2NrX3Jzdi0+bG9jayk7CisJaWYgKHRyYW5zLT5ibG9ja19yc3YtPnJlc2VydmVkIDwgbmVlZGVkX2J5dGVzKSB7CisJCXNwaW5fdW5sb2NrKCZ0cmFucy0+YmxvY2tfcnN2LT5sb2NrKTsKKwkJdHJhbnMtPmJsb2NrX3JzdiA9IHJzdjsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmFucy0+YmxvY2tfcnN2LT5sb2NrKTsKIAogCW9sZHNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCAwKTsKQEAgLTIxMywxMyArMjI4LDE1IEBACiAJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfaW5vZGVfaXRlbXModHJhbnMsIHJvb3QsIGlub2RlLAogCQkJCQkgMCwgQlRSRlNfRVhURU5UX0RBVEFfS0VZKTsKIAotCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CiAJaWYgKHJldCkgeworCQl0cmFucy0+YmxvY2tfcnN2ID0gcnN2OwogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNDIsMjYgKzI1OSwzNDMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IGlvX2N0bCB7CisJdm9pZCAqY3VyLCAqb3JpZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgaW5kZXg7CisJaW50IG51bV9wYWdlczsKKwl1bnNpZ25lZCBjaGVja19jcmNzOjE7Cit9OworCitzdGF0aWMgaW50IGlvX2N0bF9pbml0KHN0cnVjdCBpb19jdGwgKmlvX2N0bCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCW1lbXNldChpb19jdGwsIDAsIHNpemVvZihzdHJ1Y3QgaW9fY3RsKSk7CisJaW9fY3RsLT5udW1fcGFnZXMgPSAoaV9zaXplX3JlYWQoaW5vZGUpICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KKwkJUEFHRV9DQUNIRV9TSElGVDsKKwlpb19jdGwtPnBhZ2VzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBpb19jdGwtPm51bV9wYWdlcywKKwkJCQlHRlBfTk9GUyk7CisJaWYgKCFpb19jdGwtPnBhZ2VzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpb19jdGwtPnJvb3QgPSByb290OworCWlmIChidHJmc19pbm8oaW5vZGUpICE9IEJUUkZTX0ZSRUVfSU5PX09CSkVDVElEKQorCQlpb19jdGwtPmNoZWNrX2NyY3MgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpb19jdGxfZnJlZShzdHJ1Y3QgaW9fY3RsICppb19jdGwpCit7CisJa2ZyZWUoaW9fY3RsLT5wYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGlvX2N0bF91bm1hcF9wYWdlKHN0cnVjdCBpb19jdGwgKmlvX2N0bCkKK3sKKwlpZiAoaW9fY3RsLT5jdXIpIHsKKwkJa3VubWFwKGlvX2N0bC0+cGFnZSk7CisJCWlvX2N0bC0+Y3VyID0gTlVMTDsKKwkJaW9fY3RsLT5vcmlnID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlvX2N0bF9tYXBfcGFnZShzdHJ1Y3QgaW9fY3RsICppb19jdGwsIGludCBjbGVhcikKK3sKKwlXQVJOX09OKGlvX2N0bC0+Y3VyKTsKKwlCVUdfT04oaW9fY3RsLT5pbmRleCA+PSBpb19jdGwtPm51bV9wYWdlcyk7CisJaW9fY3RsLT5wYWdlID0gaW9fY3RsLT5wYWdlc1tpb19jdGwtPmluZGV4KytdOworCWlvX2N0bC0+Y3VyID0ga21hcChpb19jdGwtPnBhZ2UpOworCWlvX2N0bC0+b3JpZyA9IGlvX2N0bC0+Y3VyOworCWlvX2N0bC0+c2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlpZiAoY2xlYXIpCisJCW1lbXNldChpb19jdGwtPmN1ciwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKK30KKworc3RhdGljIHZvaWQgaW9fY3RsX2Ryb3BfcGFnZXMoc3RydWN0IGlvX2N0bCAqaW9fY3RsKQoreworCWludCBpOworCisJaW9fY3RsX3VubWFwX3BhZ2UoaW9fY3RsKTsKKworCWZvciAoaSA9IDA7IGkgPCBpb19jdGwtPm51bV9wYWdlczsgaSsrKSB7CisJCUNsZWFyUGFnZUNoZWNrZWQoaW9fY3RsLT5wYWdlc1tpXSk7CisJCXVubG9ja19wYWdlKGlvX2N0bC0+cGFnZXNbaV0pOworCQlwYWdlX2NhY2hlX3JlbGVhc2UoaW9fY3RsLT5wYWdlc1tpXSk7CisJfQorfQorCitzdGF0aWMgaW50IGlvX2N0bF9wcmVwYXJlX3BhZ2VzKHN0cnVjdCBpb19jdGwgKmlvX2N0bCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlpbnQgdXB0b2RhdGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZ2ZwX3QgbWFzayA9IGJ0cmZzX2FsbG9jX3dyaXRlX21hc2soaW5vZGUtPmlfbWFwcGluZyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW9fY3RsLT5udW1fcGFnZXM7IGkrKykgeworCQlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpLCBtYXNrKTsKKwkJaWYgKCFwYWdlKSB7CisJCQlpb19jdGxfZHJvcF9wYWdlcyhpb19jdGwpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaW9fY3RsLT5wYWdlc1tpXSA9IHBhZ2U7CisJCWlmICh1cHRvZGF0ZSAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlidHJmc19yZWFkcGFnZShOVUxMLCBwYWdlKTsKKwkJCWxvY2tfcGFnZShwYWdlKTsKKwkJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogZXJyb3IgcmVhZGluZyBmcmVlICIKKwkJCQkgICAgICAgInNwYWNlIGNhY2hlXG4iKTsKKwkJCQlpb19jdGxfZHJvcF9wYWdlcyhpb19jdGwpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvX2N0bF9zZXRfZ2VuZXJhdGlvbihzdHJ1Y3QgaW9fY3RsICppb19jdGwsIHU2NCBnZW5lcmF0aW9uKQoreworCXU2NCAqdmFsOworCisJaW9fY3RsX21hcF9wYWdlKGlvX2N0bCwgMSk7CisKKwkvKgorCSAqIFNraXAgdGhlIGNzdW0gYXJlYXMuICBJZiB3ZSBkb24ndCBjaGVjayBjcmNzIHRoZW4gd2UganVzdCBoYXZlIGEKKwkgKiA2NGJpdCBjaHVuayBhdCB0aGUgZnJvbnQgb2YgdGhlIGZpcnN0IHBhZ2UuCisJICovCisJaWYgKGlvX2N0bC0+Y2hlY2tfY3JjcykgeworCQlpb19jdGwtPmN1ciArPSAoc2l6ZW9mKHUzMikgKiBpb19jdGwtPm51bV9wYWdlcyk7CisJCWlvX2N0bC0+c2l6ZSAtPSBzaXplb2YodTY0KSArIChzaXplb2YodTMyKSAqIGlvX2N0bC0+bnVtX3BhZ2VzKTsKKwl9IGVsc2UgeworCQlpb19jdGwtPmN1ciArPSBzaXplb2YodTY0KTsKKwkJaW9fY3RsLT5zaXplIC09IHNpemVvZih1NjQpICogMjsKKwl9CisKKwl2YWwgPSBpb19jdGwtPmN1cjsKKwkqdmFsID0gY3B1X3RvX2xlNjQoZ2VuZXJhdGlvbik7CisJaW9fY3RsLT5jdXIgKz0gc2l6ZW9mKHU2NCk7Cit9CisKK3N0YXRpYyBpbnQgaW9fY3RsX2NoZWNrX2dlbmVyYXRpb24oc3RydWN0IGlvX2N0bCAqaW9fY3RsLCB1NjQgZ2VuZXJhdGlvbikKK3sKKwl1NjQgKmdlbjsKKworCS8qCisJICogU2tpcCB0aGUgY3JjIGFyZWEuICBJZiB3ZSBkb24ndCBjaGVjayBjcmNzIHRoZW4gd2UganVzdCBoYXZlIGEgNjRiaXQKKwkgKiBjaHVuayBhdCB0aGUgZnJvbnQgb2YgdGhlIGZpcnN0IHBhZ2UuCisJICovCisJaWYgKGlvX2N0bC0+Y2hlY2tfY3JjcykgeworCQlpb19jdGwtPmN1ciArPSBzaXplb2YodTMyKSAqIGlvX2N0bC0+bnVtX3BhZ2VzOworCQlpb19jdGwtPnNpemUgLT0gc2l6ZW9mKHU2NCkgKworCQkJKHNpemVvZih1MzIpICogaW9fY3RsLT5udW1fcGFnZXMpOworCX0gZWxzZSB7CisJCWlvX2N0bC0+Y3VyICs9IHNpemVvZih1NjQpOworCQlpb19jdGwtPnNpemUgLT0gc2l6ZW9mKHU2NCkgKiAyOworCX0KKworCWdlbiA9IGlvX2N0bC0+Y3VyOworCWlmIChsZTY0X3RvX2NwdSgqZ2VuKSAhPSBnZW5lcmF0aW9uKSB7CisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiYnRyZnM6IHNwYWNlIGNhY2hlIGdlbmVyYXRpb24gIgorCQkJCSAgICIoJUx1KSBkb2VzIG5vdCBtYXRjaCBpbm9kZSAoJUx1KVxuIiwgKmdlbiwKKwkJCQkgICBnZW5lcmF0aW9uKTsKKwkJaW9fY3RsX3VubWFwX3BhZ2UoaW9fY3RsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlvX2N0bC0+Y3VyICs9IHNpemVvZih1NjQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpb19jdGxfc2V0X2NyYyhzdHJ1Y3QgaW9fY3RsICppb19jdGwsIGludCBpbmRleCkKK3sKKwl1MzIgKnRtcDsKKwl1MzIgY3JjID0gfih1MzIpMDsKKwl1bnNpZ25lZCBvZmZzZXQgPSAwOworCisJaWYgKCFpb19jdGwtPmNoZWNrX2NyY3MpIHsKKwkJaW9fY3RsX3VubWFwX3BhZ2UoaW9fY3RsKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmRleCA9PSAwKQorCQlvZmZzZXQgPSBzaXplb2YodTMyKSAqIGlvX2N0bC0+bnVtX3BhZ2VzOzsKKworCWNyYyA9IGJ0cmZzX2NzdW1fZGF0YShpb19jdGwtPnJvb3QsIGlvX2N0bC0+b3JpZyArIG9mZnNldCwgY3JjLAorCQkJICAgICAgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKKwlidHJmc19jc3VtX2ZpbmFsKGNyYywgKGNoYXIgKikmY3JjKTsKKwlpb19jdGxfdW5tYXBfcGFnZShpb19jdGwpOworCXRtcCA9IGttYXAoaW9fY3RsLT5wYWdlc1swXSk7CisJdG1wICs9IGluZGV4OworCSp0bXAgPSBjcmM7CisJa3VubWFwKGlvX2N0bC0+cGFnZXNbMF0pOworfQorCitzdGF0aWMgaW50IGlvX2N0bF9jaGVja19jcmMoc3RydWN0IGlvX2N0bCAqaW9fY3RsLCBpbnQgaW5kZXgpCit7CisJdTMyICp0bXAsIHZhbDsKKwl1MzIgY3JjID0gfih1MzIpMDsKKwl1bnNpZ25lZCBvZmZzZXQgPSAwOworCisJaWYgKCFpb19jdGwtPmNoZWNrX2NyY3MpIHsKKwkJaW9fY3RsX21hcF9wYWdlKGlvX2N0bCwgMCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpbmRleCA9PSAwKQorCQlvZmZzZXQgPSBzaXplb2YodTMyKSAqIGlvX2N0bC0+bnVtX3BhZ2VzOworCisJdG1wID0ga21hcChpb19jdGwtPnBhZ2VzWzBdKTsKKwl0bXAgKz0gaW5kZXg7CisJdmFsID0gKnRtcDsKKwlrdW5tYXAoaW9fY3RsLT5wYWdlc1swXSk7CisKKwlpb19jdGxfbWFwX3BhZ2UoaW9fY3RsLCAwKTsKKwljcmMgPSBidHJmc19jc3VtX2RhdGEoaW9fY3RsLT5yb290LCBpb19jdGwtPm9yaWcgKyBvZmZzZXQsIGNyYywKKwkJCSAgICAgIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCk7CisJYnRyZnNfY3N1bV9maW5hbChjcmMsIChjaGFyICopJmNyYyk7CisJaWYgKHZhbCAhPSBjcmMpIHsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJidHJmczogY3N1bSBtaXNtYXRjaCBvbiBmcmVlICIKKwkJCQkgICAic3BhY2UgY2FjaGVcbiIpOworCQlpb19jdGxfdW5tYXBfcGFnZShpb19jdGwpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb19jdGxfYWRkX2VudHJ5KHN0cnVjdCBpb19jdGwgKmlvX2N0bCwgdTY0IG9mZnNldCwgdTY0IGJ5dGVzLAorCQkJICAgIHZvaWQgKmJpdG1hcCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSAqZW50cnk7CisKKwlpZiAoIWlvX2N0bC0+Y3VyKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWVudHJ5ID0gaW9fY3RsLT5jdXI7CisJZW50cnktPm9mZnNldCA9IGNwdV90b19sZTY0KG9mZnNldCk7CisJZW50cnktPmJ5dGVzID0gY3B1X3RvX2xlNjQoYnl0ZXMpOworCWVudHJ5LT50eXBlID0gKGJpdG1hcCkgPyBCVFJGU19GUkVFX1NQQUNFX0JJVE1BUCA6CisJCUJUUkZTX0ZSRUVfU1BBQ0VfRVhURU5UOworCWlvX2N0bC0+Y3VyICs9IHNpemVvZihzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSk7CisJaW9fY3RsLT5zaXplIC09IHNpemVvZihzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSk7CisKKwlpZiAoaW9fY3RsLT5zaXplID49IHNpemVvZihzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSkpCisJCXJldHVybiAwOworCisJaW9fY3RsX3NldF9jcmMoaW9fY3RsLCBpb19jdGwtPmluZGV4IC0gMSk7CisKKwkvKiBObyBtb3JlIHBhZ2VzIHRvIG1hcCAqLworCWlmIChpb19jdGwtPmluZGV4ID49IGlvX2N0bC0+bnVtX3BhZ2VzKQorCQlyZXR1cm4gMDsKKworCS8qIG1hcCB0aGUgbmV4dCBwYWdlICovCisJaW9fY3RsX21hcF9wYWdlKGlvX2N0bCwgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9fY3RsX2FkZF9iaXRtYXAoc3RydWN0IGlvX2N0bCAqaW9fY3RsLCB2b2lkICpiaXRtYXApCit7CisJaWYgKCFpb19jdGwtPmN1cikKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkvKgorCSAqIElmIHdlIGFyZW4ndCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGFnZSwgdW5tYXAgdGhpcyBvbmUgYW5kCisJICogbWFwIHRoZSBuZXh0IG9uZSBpZiB0aGVyZSBpcyBhbnkgbGVmdC4KKwkgKi8KKwlpZiAoaW9fY3RsLT5jdXIgIT0gaW9fY3RsLT5vcmlnKSB7CisJCWlvX2N0bF9zZXRfY3JjKGlvX2N0bCwgaW9fY3RsLT5pbmRleCAtIDEpOworCQlpZiAoaW9fY3RsLT5pbmRleCA+PSBpb19jdGwtPm51bV9wYWdlcykKKwkJCXJldHVybiAtRU5PU1BDOworCQlpb19jdGxfbWFwX3BhZ2UoaW9fY3RsLCAwKTsKKwl9CisKKwltZW1jcHkoaW9fY3RsLT5jdXIsIGJpdG1hcCwgUEFHRV9DQUNIRV9TSVpFKTsKKwlpb19jdGxfc2V0X2NyYyhpb19jdGwsIGlvX2N0bC0+aW5kZXggLSAxKTsKKwlpZiAoaW9fY3RsLT5pbmRleCA8IGlvX2N0bC0+bnVtX3BhZ2VzKQorCQlpb19jdGxfbWFwX3BhZ2UoaW9fY3RsLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW9fY3RsX3plcm9fcmVtYWluaW5nX3BhZ2VzKHN0cnVjdCBpb19jdGwgKmlvX2N0bCkKK3sKKwkvKgorCSAqIElmIHdlJ3JlIG5vdCBvbiB0aGUgYm91bmRhcnkgd2Uga25vdyB3ZSd2ZSBtb2RpZmllZCB0aGUgcGFnZSBhbmQgd2UKKwkgKiBuZWVkIHRvIGNyYyB0aGUgcGFnZS4KKwkgKi8KKwlpZiAoaW9fY3RsLT5jdXIgIT0gaW9fY3RsLT5vcmlnKQorCQlpb19jdGxfc2V0X2NyYyhpb19jdGwsIGlvX2N0bC0+aW5kZXggLSAxKTsKKwllbHNlCisJCWlvX2N0bF91bm1hcF9wYWdlKGlvX2N0bCk7CisKKwl3aGlsZSAoaW9fY3RsLT5pbmRleCA8IGlvX2N0bC0+bnVtX3BhZ2VzKSB7CisJCWlvX2N0bF9tYXBfcGFnZShpb19jdGwsIDEpOworCQlpb19jdGxfc2V0X2NyYyhpb19jdGwsIGlvX2N0bC0+aW5kZXggLSAxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW9fY3RsX3JlYWRfZW50cnkoc3RydWN0IGlvX2N0bCAqaW9fY3RsLAorCQkJICAgIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlICplbnRyeSwgdTggKnR5cGUpCit7CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkgKmU7CisJaW50IHJldDsKKworCWlmICghaW9fY3RsLT5jdXIpIHsKKwkJcmV0ID0gaW9fY3RsX2NoZWNrX2NyYyhpb19jdGwsIGlvX2N0bC0+aW5kZXgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwllID0gaW9fY3RsLT5jdXI7CisJZW50cnktPm9mZnNldCA9IGxlNjRfdG9fY3B1KGUtPm9mZnNldCk7CisJZW50cnktPmJ5dGVzID0gbGU2NF90b19jcHUoZS0+Ynl0ZXMpOworCSp0eXBlID0gZS0+dHlwZTsKKwlpb19jdGwtPmN1ciArPSBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpOworCWlvX2N0bC0+c2l6ZSAtPSBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpOworCisJaWYgKGlvX2N0bC0+c2l6ZSA+PSBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpKQorCQlyZXR1cm4gMDsKKworCWlvX2N0bF91bm1hcF9wYWdlKGlvX2N0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb19jdGxfcmVhZF9iaXRtYXAoc3RydWN0IGlvX2N0bCAqaW9fY3RsLAorCQkJICAgICAgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmVudHJ5KQoreworCWludCByZXQ7CisKKwlyZXQgPSBpb19jdGxfY2hlY2tfY3JjKGlvX2N0bCwgaW9fY3RsLT5pbmRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1lbWNweShlbnRyeS0+Yml0bWFwLCBpb19jdGwtPmN1ciwgUEFHRV9DQUNIRV9TSVpFKTsKKwlpb19jdGxfdW5tYXBfcGFnZShpb19jdGwpOworCisJcmV0dXJuIDA7Cit9CisKIGludCBfX2xvYWRfZnJlZV9zcGFjZV9jYWNoZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCwKIAkJCSAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IG9mZnNldCkKIHsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9oZWFkZXIgKmhlYWRlcjsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgaW9fY3RsIGlvX2N0bDsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZSwgKm47CiAJc3RydWN0IGxpc3RfaGVhZCBiaXRtYXBzOwogCXU2NCBudW1fZW50cmllczsKIAl1NjQgbnVtX2JpdG1hcHM7CiAJdTY0IGdlbmVyYXRpb247Ci0JcGdvZmZfdCBpbmRleCA9IDA7CisJdTggdHlwZTsKIAlpbnQgcmV0ID0gMDsKIAogCUlOSVRfTElTVF9IRUFEKCZiaXRtYXBzKTsKIAogCS8qIE5vdGhpbmcgaW4gdGhlIHNwYWNlIGNhY2hlLCBnb29kYnllICovCiAJaWYgKCFpX3NpemVfcmVhZChpbm9kZSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAogCWtleS5vYmplY3RpZCA9IEJUUkZTX0ZSRUVfU1BBQ0VfT0JKRUNUSUQ7CiAJa2V5Lm9mZnNldCA9IG9mZnNldDsKQEAgLTI2OSwxMSArNjAzLDEwIEBACiAKIAlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCWVsc2UgaWYgKHJldCA+IDApIHsKIAkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIDA7CiAJfQogCiAJcmV0ID0gLTE7CkBAIC0yOTEsMTY5ICs2MjQsMTAyIEBACiAJCSAgICAgICAiIG5vdCBtYXRjaCBmcmVlIHNwYWNlIGNhY2hlIGdlbmVyYXRpb24gKCVsbHUpXG4iLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZ2VuZXJhdGlvbik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoIW51bV9lbnRyaWVzKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIDA7CiAKKwlpb19jdGxfaW5pdCgmaW9fY3RsLCBpbm9kZSwgcm9vdCk7CiAJcmV0ID0gcmVhZGFoZWFkX2NhY2hlKGlub2RlKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXdoaWxlICgxKSB7Ci0JCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2VudHJ5ICplbnRyeTsKLQkJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmU7Ci0JCXZvaWQgKmFkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKLQkJaW50IG5lZWRfbG9vcCA9IDA7CisJcmV0ID0gaW9fY3RsX3ByZXBhcmVfcGFnZXMoJmlvX2N0bCwgaW5vZGUsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCi0JCWlmICghbnVtX2VudHJpZXMgJiYgIW51bV9iaXRtYXBzKQotCQkJYnJlYWs7CisJcmV0ID0gaW9fY3RsX2NoZWNrX2NyYygmaW9fY3RsLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfY2FjaGU7CiAKLQkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKLQkJaWYgKCFwYWdlKQorCXJldCA9IGlvX2N0bF9jaGVja19nZW5lcmF0aW9uKCZpb19jdGwsIGdlbmVyYXRpb24pOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9jYWNoZTsKKworCXdoaWxlIChudW1fZW50cmllcykgeworCQllID0ga21lbV9jYWNoZV96YWxsb2MoYnRyZnNfZnJlZV9zcGFjZV9jYWNoZXAsCisJCQkJICAgICAgR0ZQX05PRlMpOworCQlpZiAoIWUpCiAJCQlnb3RvIGZyZWVfY2FjaGU7CiAKLQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJCWJ0cmZzX3JlYWRwYWdlKE5VTEwsIHBhZ2UpOwotCQkJbG9ja19wYWdlKHBhZ2UpOwotCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogZXJyb3IgcmVhZGluZyBmcmVlICIKLQkJCQkgICAgICAgInNwYWNlIGNhY2hlXG4iKTsKLQkJCQlnb3RvIGZyZWVfY2FjaGU7Ci0JCQl9CisJCXJldCA9IGlvX2N0bF9yZWFkX2VudHJ5KCZpb19jdGwsIGUsICZ0eXBlKTsKKwkJaWYgKHJldCkgeworCQkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBlKTsKKwkJCWdvdG8gZnJlZV9jYWNoZTsKIAkJfQotCQlhZGRyID0ga21hcChwYWdlKTsKIAotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJdTY0ICpnZW47Ci0KLQkJCS8qCi0JCQkgKiBXZSBwdXQgYSBib2d1cyBjcmMgaW4gdGhlIGZyb250IG9mIHRoZSBmaXJzdCBwYWdlIGluCi0JCQkgKiBjYXNlIG9sZCBrZXJuZWxzIHRyeSB0byBtb3VudCBhIGZzIHdpdGggdGhlIG5ldwotCQkJICogZm9ybWF0IHRvIG1ha2Ugc3VyZSB0aGV5IGRpc2NhcmQgdGhlIGNhY2hlLgotCQkJICovCi0JCQlhZGRyICs9IHNpemVvZih1NjQpOwotCQkJb2Zmc2V0ICs9IHNpemVvZih1NjQpOwotCi0JCQlnZW4gPSBhZGRyOwotCQkJaWYgKCpnZW4gIT0gQlRSRlNfSShpbm9kZSktPmdlbmVyYXRpb24pIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiBzcGFjZSBjYWNoZSBnZW5lcmF0aW9uIgotCQkJCSAgICAgICAiICglbGx1KSBkb2VzIG5vdCBtYXRjaCBpbm9kZSAoJWxsdSlcbiIsCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKmdlbiwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkgICAgICAgQlRSRlNfSShpbm9kZSktPmdlbmVyYXRpb24pOwotCQkJCWt1bm1hcChwYWdlKTsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJZ290byBmcmVlX2NhY2hlOwotCQkJfQotCQkJYWRkciArPSBzaXplb2YodTY0KTsKLQkJCW9mZnNldCArPSBzaXplb2YodTY0KTsKKwkJaWYgKCFlLT5ieXRlcykgeworCQkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBlKTsKKwkJCWdvdG8gZnJlZV9jYWNoZTsKIAkJfQotCQllbnRyeSA9IGFkZHI7CiAKLQkJd2hpbGUgKDEpIHsKLQkJCWlmICghbnVtX2VudHJpZXMpCi0JCQkJYnJlYWs7Ci0KLQkJCW5lZWRfbG9vcCA9IDE7Ci0JCQllID0ga21lbV9jYWNoZV96YWxsb2MoYnRyZnNfZnJlZV9zcGFjZV9jYWNoZXAsCi0JCQkJCSAgICAgIEdGUF9OT0ZTKTsKLQkJCWlmICghZSkgewotCQkJCWt1bm1hcChwYWdlKTsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJZ290byBmcmVlX2NhY2hlOwotCQkJfQotCi0JCQllLT5vZmZzZXQgPSBsZTY0X3RvX2NwdShlbnRyeS0+b2Zmc2V0KTsKLQkJCWUtPmJ5dGVzID0gbGU2NF90b19jcHUoZW50cnktPmJ5dGVzKTsKLQkJCWlmICghZS0+Ynl0ZXMpIHsKLQkJCQlrdW5tYXAocGFnZSk7CisJCWlmICh0eXBlID09IEJUUkZTX0ZSRUVfU1BBQ0VfRVhURU5UKSB7CisJCQlzcGluX2xvY2soJmN0bC0+dHJlZV9sb2NrKTsKKwkJCXJldCA9IGxpbmtfZnJlZV9zcGFjZShjdGwsIGUpOworCQkJc3Bpbl91bmxvY2soJmN0bC0+dHJlZV9sb2NrKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkR1cGxpY2F0ZSBlbnRyaWVzIGluICIKKwkJCQkgICAgICAgImZyZWUgc3BhY2UgY2FjaGUsIGR1bXBpbmdcbiIpOwogCQkJCWttZW1fY2FjaGVfZnJlZShidHJmc19mcmVlX3NwYWNlX2NhY2hlcCwgZSk7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJCWdvdG8gZnJlZV9jYWNoZTsKIAkJCX0KLQotCQkJaWYgKGVudHJ5LT50eXBlID09IEJUUkZTX0ZSRUVfU1BBQ0VfRVhURU5UKSB7Ci0JCQkJc3Bpbl9sb2NrKCZjdGwtPnRyZWVfbG9jayk7Ci0JCQkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgZSk7Ci0JCQkJc3Bpbl91bmxvY2soJmN0bC0+dHJlZV9sb2NrKTsKLQkJCQlpZiAocmV0KSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiRHVwbGljYXRlIGVudHJpZXMgaW4gIgotCQkJCQkgICAgICAgImZyZWUgc3BhY2UgY2FjaGUsIGR1bXBpbmdcbiIpOwotCQkJCQlrdW5tYXAocGFnZSk7Ci0JCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJCWdvdG8gZnJlZV9jYWNoZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWUtPmJpdG1hcCA9IGt6YWxsb2MoUEFHRV9DQUNIRV9TSVpFLCBHRlBfTk9GUyk7Ci0JCQkJaWYgKCFlLT5iaXRtYXApIHsKLQkJCQkJa3VubWFwKHBhZ2UpOwotCQkJCQlrbWVtX2NhY2hlX2ZyZWUoCi0JCQkJCQlidHJmc19mcmVlX3NwYWNlX2NhY2hlcCwgZSk7Ci0JCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJCWdvdG8gZnJlZV9jYWNoZTsKLQkJCQl9Ci0JCQkJc3Bpbl9sb2NrKCZjdGwtPnRyZWVfbG9jayk7Ci0JCQkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgZSk7Ci0JCQkJY3RsLT50b3RhbF9iaXRtYXBzKys7Ci0JCQkJY3RsLT5vcC0+cmVjYWxjX3RocmVzaG9sZHMoY3RsKTsKLQkJCQlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOwotCQkJCWlmIChyZXQpIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJEdXBsaWNhdGUgZW50cmllcyBpbiAiCi0JCQkJCSAgICAgICAiZnJlZSBzcGFjZSBjYWNoZSwgZHVtcGluZ1xuIik7Ci0JCQkJCWt1bm1hcChwYWdlKTsKLQkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCQkJZ290byBmcmVlX2NhY2hlOwotCQkJCX0KLQkJCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYml0bWFwcyk7CisJCX0gZWxzZSB7CisJCQlCVUdfT04oIW51bV9iaXRtYXBzKTsKKwkJCW51bV9iaXRtYXBzLS07CisJCQllLT5iaXRtYXAgPSBremFsbG9jKFBBR0VfQ0FDSEVfU0laRSwgR0ZQX05PRlMpOworCQkJaWYgKCFlLT5iaXRtYXApIHsKKwkJCQlrbWVtX2NhY2hlX2ZyZWUoCisJCQkJCWJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBlKTsKKwkJCQlnb3RvIGZyZWVfY2FjaGU7CiAJCQl9Ci0KLQkJCW51bV9lbnRyaWVzLS07Ci0JCQlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2VudHJ5KTsKLQkJCWlmIChvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpID49Ci0JCQkgICAgUEFHRV9DQUNIRV9TSVpFKQotCQkJCWJyZWFrOwotCQkJZW50cnkrKzsKKwkJCXNwaW5fbG9jaygmY3RsLT50cmVlX2xvY2spOworCQkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgZSk7CisJCQljdGwtPnRvdGFsX2JpdG1hcHMrKzsKKwkJCWN0bC0+b3AtPnJlY2FsY190aHJlc2hvbGRzKGN0bCk7CisJCQlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOworCQkJaWYgKHJldCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRHVwbGljYXRlIGVudHJpZXMgaW4gIgorCQkJCSAgICAgICAiZnJlZSBzcGFjZSBjYWNoZSwgZHVtcGluZ1xuIik7CisJCQkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBlKTsKKwkJCQlnb3RvIGZyZWVfY2FjaGU7CisJCQl9CisJCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYml0bWFwcyk7CiAJCX0KIAotCQkvKgotCQkgKiBXZSByZWFkIGFuIGVudHJ5IG91dCBvZiB0aGlzIHBhZ2UsIHdlIG5lZWQgdG8gbW92ZSBvbiB0byB0aGUKLQkJICogbmV4dCBwYWdlLgotCQkgKi8KLQkJaWYgKG5lZWRfbG9vcCkgewotCQkJa3VubWFwKHBhZ2UpOwotCQkJZ290byBuZXh0OwotCQl9Ci0KLQkJLyoKLQkJICogV2UgYWRkIHRoZSBiaXRtYXBzIGF0IHRoZSBlbmQgb2YgdGhlIGVudHJpZXMgaW4gb3JkZXIgdGhhdAotCQkgKiB0aGUgYml0bWFwIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSBjYWNoZS4KLQkJICovCi0JCWUgPSBsaXN0X2VudHJ5KGJpdG1hcHMubmV4dCwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIGxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZlLT5saXN0KTsKLQkJbWVtY3B5KGUtPmJpdG1hcCwgYWRkciwgUEFHRV9DQUNIRV9TSVpFKTsKLQkJa3VubWFwKHBhZ2UpOwotCQludW1fYml0bWFwcy0tOwotbmV4dDoKLQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJaW5kZXgrKzsKKwkJbnVtX2VudHJpZXMtLTsKIAl9CiAKKwlpb19jdGxfdW5tYXBfcGFnZSgmaW9fY3RsKTsKKworCS8qCisJICogV2UgYWRkIHRoZSBiaXRtYXBzIGF0IHRoZSBlbmQgb2YgdGhlIGVudHJpZXMgaW4gb3JkZXIgdGhhdAorCSAqIHRoZSBiaXRtYXAgZW50cmllcyBhcmUgYWRkZWQgdG8gdGhlIGNhY2hlLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuLCAmYml0bWFwcywgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZlLT5saXN0KTsKKwkJcmV0ID0gaW9fY3RsX3JlYWRfYml0bWFwKCZpb19jdGwsIGUpOworCQlpZiAocmV0KQorCQkJZ290byBmcmVlX2NhY2hlOworCX0KKworCWlvX2N0bF9kcm9wX3BhZ2VzKCZpb19jdGwpOwogCXJldCA9IDE7CiBvdXQ6CisJaW9fY3RsX2ZyZWUoJmlvX2N0bCk7CiAJcmV0dXJuIHJldDsKIGZyZWVfY2FjaGU6CisJaW9fY3RsX2Ryb3BfcGFnZXMoJmlvX2N0bCk7CiAJX19idHJmc19yZW1vdmVfZnJlZV9zcGFjZV9jYWNoZShjdGwpOwogCWdvdG8gb3V0OwogfQpAQCAtNDY1LDcgKzczMSw3IEBACiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBmc19pbmZvLT50cmVlX3Jvb3Q7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCWJvb2wgbWF0Y2hlZDsKIAl1NjQgdXNlZCA9IGJ0cmZzX2Jsb2NrX2dyb3VwX3VzZWQoJmJsb2NrX2dyb3VwLT5pdGVtKTsKIApAQCAtNDk3LDYgKzc2MywxNCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwkvKiBXZSBtYXkgaGF2ZSBjb252ZXJ0ZWQgdGhlIGlub2RlIGFuZCBtYWRlIHRoZSBjYWNoZSBpbnZhbGlkLiAqLworCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCWlmIChibG9ja19ncm91cC0+ZGlza19jYWNoZV9zdGF0ZSAhPSBCVFJGU19EQ19XUklUVEVOKSB7CisJCXNwaW5fdW5sb2NrKCZibG9ja19ncm91cC0+bG9jayk7CisJCWdvdG8gb3V0OworCX0KKwlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCiAJcmV0ID0gX19sb2FkX2ZyZWVfc3BhY2VfY2FjaGUoZnNfaW5mby0+dHJlZV9yb290LCBpbm9kZSwgY3RsLAogCQkJCSAgICAgIHBhdGgsIGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQpOwogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKQEAgLTUzMCw2ICs4MDQsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIF9fYnRyZnNfd3JpdGVfb3V0X2NhY2hlIC0gd3JpdGUgb3V0IGNhY2hlZCBpbmZvIHRvIGFuIGlub2RlCisgKiBAcm9vdCAtIHRoZSByb290IHRoZSBpbm9kZSBiZWxvbmdzIHRvCisgKiBAY3RsIC0gdGhlIGZyZWUgc3BhY2UgY2FjaGUgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIG91dAorICogQGJsb2NrX2dyb3VwIC0gdGhlIGJsb2NrX2dyb3VwIGZvciB0aGlzIGNhY2hlIGlmIGl0IGJlbG9uZ3MgdG8gYSBibG9ja19ncm91cAorICogQHRyYW5zIC0gdGhlIHRyYW5zIGhhbmRsZQorICogQHBhdGggLSB0aGUgcGF0aCB0byB1c2UKKyAqIEBvZmZzZXQgLSB0aGUgb2Zmc2V0IGZvciB0aGUga2V5IHdlJ2xsIGluc2VydAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIG91dCBhIGZyZWUgc3BhY2UgY2FjaGUgc3RydWN0IHRvIGRpc2sgZm9yIHF1aWNrIHJlY292ZXJ5CisgKiBvbiBtb3VudC4gIFRoaXMgd2lsbCByZXR1cm4gMCBpZiBpdCB3YXMgc3VjY2Vzc2Z1bGwgaW4gd3JpdGluZyB0aGUgY2FjaGUgb3V0LAorICogYW5kIC0xIGlmIGl0IHdhcyBub3QuCisgKi8KIGludCBfX2J0cmZzX3dyaXRlX291dF9jYWNoZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCwKIAkJCSAgICBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLApAQCAtNTQwLDQyICs4MjcsMjQgQEAKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOwotCXN0cnVjdCBwYWdlICoqcGFnZXM7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IGV4dGVudF9zdGF0ZSAqY2FjaGVkX3N0YXRlID0gTlVMTDsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9jbHVzdGVyICpjbHVzdGVyID0gTlVMTDsKIAlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnVucGluID0gTlVMTDsKKwlzdHJ1Y3QgaW9fY3RsIGlvX2N0bDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJpdG1hcF9saXN0OwogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCXU2NCBzdGFydCwgZW5kLCBsZW47Ci0JdTY0IGJ5dGVzID0gMDsKLQl1MzIgY3JjID0gfih1MzIpMDsKLQlpbnQgaW5kZXggPSAwLCBudW1fcGFnZXMgPSAwOwogCWludCBlbnRyaWVzID0gMDsKIAlpbnQgYml0bWFwcyA9IDA7Ci0JaW50IHJldCA9IC0xOwotCWJvb2wgbmV4dF9wYWdlID0gZmFsc2U7Ci0JYm9vbCBvdXRfb2Zfc3BhY2UgPSBmYWxzZTsKKwlpbnQgcmV0OworCWludCBlcnIgPSAtMTsKIAogCUlOSVRfTElTVF9IRUFEKCZiaXRtYXBfbGlzdCk7CiAKLQlub2RlID0gcmJfZmlyc3QoJmN0bC0+ZnJlZV9zcGFjZV9vZmZzZXQpOwotCWlmICghbm9kZSkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoIWlfc2l6ZV9yZWFkKGlub2RlKSkKIAkJcmV0dXJuIC0xOwogCi0JbnVtX3BhZ2VzID0gKGlfc2l6ZV9yZWFkKGlub2RlKSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+Ci0JCVBBR0VfQ0FDSEVfU0hJRlQ7Ci0KLQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOwotCWJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShpbm9kZSwgaW5vZGUtPmlfc2l6ZSAmCi0JCQkJIH4ocm9vdC0+c2VjdG9yc2l6ZSAtIDEpLCAodTY0KS0xKTsKLQotCXBhZ2VzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBudW1fcGFnZXMsIEdGUF9OT0ZTKTsKLQlpZiAoIXBhZ2VzKQotCQlyZXR1cm4gLTE7CisJaW9fY3RsX2luaXQoJmlvX2N0bCwgaW5vZGUsIHJvb3QpOwogCiAJLyogR2V0IHRoZSBjbHVzdGVyIGZvciB0aGlzIGJsb2NrX2dyb3VwIGlmIGl0IGV4aXN0cyAqLwogCWlmIChibG9ja19ncm91cCAmJiAhbGlzdF9lbXB0eSgmYmxvY2tfZ3JvdXAtPmNsdXN0ZXJfbGlzdCkpCkBAIC01ODksMzAgKzg1OCw5IEBACiAJICovCiAJdW5waW4gPSByb290LT5mc19pbmZvLT5waW5uZWRfZXh0ZW50czsKIAotCS8qCi0JICogTG9jayBhbGwgcGFnZXMgZmlyc3Qgc28gd2UgY2FuIGxvY2sgdGhlIGV4dGVudCBzYWZlbHkuCi0JICoKLQkgKiBOT1RFOiBCZWNhdXNlIHdlIGhvbGQgdGhlIHJlZiB0aGUgZW50aXJlIHRpbWUgd2UncmUgZ29pbmcgdG8gd3JpdGUgdG8KLQkgKiB0aGUgcGFnZSBmaW5kX2dldF9wYWdlIHNob3VsZCBuZXZlciBmYWlsLCBzbyB3ZSBkb24ndCBkbyBhIGNoZWNrCi0JICogYWZ0ZXIgZmluZF9nZXRfcGFnZSBhdCB0aGlzIHBvaW50LiAgSnVzdCBwdXR0aW5nIHRoaXMgaGVyZSBzbyBwZW9wbGUKLQkgKiBrbm93IGFuZCBkb24ndCBmcmVhayBvdXQuCi0JICovCi0Jd2hpbGUgKGluZGV4IDwgbnVtX3BhZ2VzKSB7Ci0JCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGluZGV4LCBHRlBfTk9GUyk7Ci0JCWlmICghcGFnZSkgewotCQkJaW50IGk7CisJLyogTG9jayBhbGwgcGFnZXMgZmlyc3Qgc28gd2UgY2FuIGxvY2sgdGhlIGV4dGVudCBzYWZlbHkuICovCisJaW9fY3RsX3ByZXBhcmVfcGFnZXMoJmlvX2N0bCwgaW5vZGUsIDApOwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKLQkJCQl1bmxvY2tfcGFnZShwYWdlc1tpXSk7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2ldKTsKLQkJCX0KLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXBhZ2VzW2luZGV4XSA9IHBhZ2U7Ci0JCWluZGV4Kys7Ci0JfQotCi0JaW5kZXggPSAwOwogCWxvY2tfZXh0ZW50X2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCAwLCBpX3NpemVfcmVhZChpbm9kZSkgLSAxLAogCQkJIDAsICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKIApAQCAtNjIzLDE4OSArODcxLDExMSBAQAogCWlmIChibG9ja19ncm91cCkKIAkJc3RhcnQgPSBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkOwogCisJbm9kZSA9IHJiX2ZpcnN0KCZjdGwtPmZyZWVfc3BhY2Vfb2Zmc2V0KTsKKwlpZiAoIW5vZGUgJiYgY2x1c3RlcikgeworCQlub2RlID0gcmJfZmlyc3QoJmNsdXN0ZXItPnJvb3QpOworCQljbHVzdGVyID0gTlVMTDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgY2FuIGZpdCBvdXIgY3JjcyBpbnRvIHRoZSBmaXJzdCBwYWdlICovCisJaWYgKGlvX2N0bC5jaGVja19jcmNzICYmCisJICAgIChpb19jdGwubnVtX3BhZ2VzICogc2l6ZW9mKHUzMikpID49IFBBR0VfQ0FDSEVfU0laRSkgeworCQlXQVJOX09OKDEpOworCQlnb3RvIG91dF9ub3NwYzsKKwl9CisKKwlpb19jdGxfc2V0X2dlbmVyYXRpb24oJmlvX2N0bCwgdHJhbnMtPnRyYW5zaWQpOworCiAJLyogV3JpdGUgb3V0IHRoZSBleHRlbnQgZW50cmllcyAqLwotCWRvIHsKLQkJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkgKmVudHJ5OwotCQl2b2lkICphZGRyLCAqb3JpZzsKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXdoaWxlIChub2RlKSB7CisJCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICplOwogCi0JCW5leHRfcGFnZSA9IGZhbHNlOworCQllID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7CisJCWVudHJpZXMrKzsKIAotCQlpZiAoaW5kZXggPj0gbnVtX3BhZ2VzKSB7Ci0JCQlvdXRfb2Zfc3BhY2UgPSB0cnVlOworCQlyZXQgPSBpb19jdGxfYWRkX2VudHJ5KCZpb19jdGwsIGUtPm9mZnNldCwgZS0+Ynl0ZXMsCisJCQkJICAgICAgIGUtPmJpdG1hcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9ub3NwYzsKKworCQlpZiAoZS0+Yml0bWFwKSB7CisJCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYml0bWFwX2xpc3QpOworCQkJYml0bWFwcysrOworCQl9CisJCW5vZGUgPSByYl9uZXh0KG5vZGUpOworCQlpZiAoIW5vZGUgJiYgY2x1c3RlcikgeworCQkJbm9kZSA9IHJiX2ZpcnN0KCZjbHVzdGVyLT5yb290KTsKKwkJCWNsdXN0ZXIgPSBOVUxMOworCQl9CisJfQorCisJLyoKKwkgKiBXZSB3YW50IHRvIGFkZCBhbnkgcGlubmVkIGV4dGVudHMgdG8gb3VyIGZyZWUgc3BhY2UgY2FjaGUKKwkgKiBzbyB3ZSBkb24ndCBsZWFrIHRoZSBzcGFjZQorCSAqLworCXdoaWxlIChibG9ja19ncm91cCAmJiAoc3RhcnQgPCBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkICsKKwkJCSAgICAgICBibG9ja19ncm91cC0+a2V5Lm9mZnNldCkpIHsKKwkJcmV0ID0gZmluZF9maXJzdF9leHRlbnRfYml0KHVucGluLCBzdGFydCwgJnN0YXJ0LCAmZW5kLAorCQkJCQkgICAgRVhURU5UX0RJUlRZKTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gMDsKIAkJCWJyZWFrOwogCQl9CiAKLQkJcGFnZSA9IHBhZ2VzW2luZGV4XTsKKwkJLyogVGhpcyBwaW5uZWQgZXh0ZW50IGlzIG91dCBvZiBvdXIgcmFuZ2UgKi8KKwkJaWYgKHN0YXJ0ID49IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKworCQkgICAgYmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQpCisJCQlicmVhazsKIAotCQlvcmlnID0gYWRkciA9IGttYXAocGFnZSk7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQl1NjQgKmdlbjsKKwkJbGVuID0gYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCArCisJCQlibG9ja19ncm91cC0+a2V5Lm9mZnNldCAtIHN0YXJ0OworCQlsZW4gPSBtaW4obGVuLCBlbmQgKyAxIC0gc3RhcnQpOwogCi0JCQkvKgotCQkJICogV2UncmUgZ29pbmcgdG8gcHV0IGluIGEgYm9ndXMgY3JjIGZvciB0aGlzIHBhZ2UgdG8KLQkJCSAqIG1ha2Ugc3VyZSB0aGF0IG9sZCBrZXJuZWxzIHdobyBhcmVuJ3QgYXdhcmUgb2YgdGhpcwotCQkJICogZm9ybWF0IHdpbGwgYmUgc3VyZSB0byBkaXNjYXJkIHRoZSBjYWNoZS4KLQkJCSAqLwotCQkJYWRkciArPSBzaXplb2YodTY0KTsKLQkJCW9mZnNldCArPSBzaXplb2YodTY0KTsKKwkJZW50cmllcysrOworCQlyZXQgPSBpb19jdGxfYWRkX2VudHJ5KCZpb19jdGwsIHN0YXJ0LCBsZW4sIE5VTEwpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfbm9zcGM7CiAKLQkJCWdlbiA9IGFkZHI7Ci0JCQkqZ2VuID0gdHJhbnMtPnRyYW5zaWQ7Ci0JCQlhZGRyICs9IHNpemVvZih1NjQpOwotCQkJb2Zmc2V0ICs9IHNpemVvZih1NjQpOwotCQl9Ci0JCWVudHJ5ID0gYWRkcjsKLQotCQltZW1zZXQoYWRkciwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKLQkJd2hpbGUgKG5vZGUgJiYgIW5leHRfcGFnZSkgewotCQkJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmU7Ci0KLQkJCWUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKLQkJCWVudHJpZXMrKzsKLQotCQkJZW50cnktPm9mZnNldCA9IGNwdV90b19sZTY0KGUtPm9mZnNldCk7Ci0JCQllbnRyeS0+Ynl0ZXMgPSBjcHVfdG9fbGU2NChlLT5ieXRlcyk7Ci0JCQlpZiAoZS0+Yml0bWFwKSB7Ci0JCQkJZW50cnktPnR5cGUgPSBCVFJGU19GUkVFX1NQQUNFX0JJVE1BUDsKLQkJCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYml0bWFwX2xpc3QpOwotCQkJCWJpdG1hcHMrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJZW50cnktPnR5cGUgPSBCVFJGU19GUkVFX1NQQUNFX0VYVEVOVDsKLQkJCX0KLQkJCW5vZGUgPSByYl9uZXh0KG5vZGUpOwotCQkJaWYgKCFub2RlICYmIGNsdXN0ZXIpIHsKLQkJCQlub2RlID0gcmJfZmlyc3QoJmNsdXN0ZXItPnJvb3QpOwotCQkJCWNsdXN0ZXIgPSBOVUxMOwotCQkJfQotCQkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSk7Ci0JCQlpZiAob2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2VudHJ5KSA+PQotCQkJICAgIFBBR0VfQ0FDSEVfU0laRSkKLQkJCQluZXh0X3BhZ2UgPSB0cnVlOwotCQkJZW50cnkrKzsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIHdhbnQgdG8gYWRkIGFueSBwaW5uZWQgZXh0ZW50cyB0byBvdXIgZnJlZSBzcGFjZSBjYWNoZQotCQkgKiBzbyB3ZSBkb24ndCBsZWFrIHRoZSBzcGFjZQotCQkgKi8KLQkJd2hpbGUgKGJsb2NrX2dyb3VwICYmICFuZXh0X3BhZ2UgJiYKLQkJICAgICAgIChzdGFydCA8IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKwotCQkJYmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQpKSB7Ci0JCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQodW5waW4sIHN0YXJ0LCAmc3RhcnQsICZlbmQsCi0JCQkJCQkgICAgRVhURU5UX0RJUlRZKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlyZXQgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBUaGlzIHBpbm5lZCBleHRlbnQgaXMgb3V0IG9mIG91ciByYW5nZSAqLwotCQkJaWYgKHN0YXJ0ID49IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKwotCQkJICAgIGJsb2NrX2dyb3VwLT5rZXkub2Zmc2V0KQotCQkJCWJyZWFrOwotCi0JCQlsZW4gPSBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkICsKLQkJCQlibG9ja19ncm91cC0+a2V5Lm9mZnNldCAtIHN0YXJ0OwotCQkJbGVuID0gbWluKGxlbiwgZW5kICsgMSAtIHN0YXJ0KTsKLQotCQkJZW50cmllcysrOwotCQkJZW50cnktPm9mZnNldCA9IGNwdV90b19sZTY0KHN0YXJ0KTsKLQkJCWVudHJ5LT5ieXRlcyA9IGNwdV90b19sZTY0KGxlbik7Ci0JCQllbnRyeS0+dHlwZSA9IEJUUkZTX0ZSRUVfU1BBQ0VfRVhURU5UOwotCi0JCQlzdGFydCA9IGVuZCArIDE7Ci0JCQlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2VudHJ5KTsKLQkJCWlmIChvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpID49Ci0JCQkgICAgUEFHRV9DQUNIRV9TSVpFKQotCQkJCW5leHRfcGFnZSA9IHRydWU7Ci0JCQllbnRyeSsrOwotCQl9Ci0KLQkJLyogR2VuZXJhdGUgYm9ndXMgY3JjIHZhbHVlICovCi0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQl1MzIgKnRtcDsKLQkJCWNyYyA9IGJ0cmZzX2NzdW1fZGF0YShyb290LCBvcmlnICsgc2l6ZW9mKHU2NCksIGNyYywKLQkJCQkJICAgICAgUEFHRV9DQUNIRV9TSVpFIC0gc2l6ZW9mKHU2NCkpOwotCQkJYnRyZnNfY3N1bV9maW5hbChjcmMsIChjaGFyICopJmNyYyk7Ci0JCQljcmMrKzsKLQkJCXRtcCA9IG9yaWc7Ci0JCQkqdG1wID0gY3JjOwotCQl9Ci0KLQkJa3VubWFwKHBhZ2UpOwotCi0JCWJ5dGVzICs9IFBBR0VfQ0FDSEVfU0laRTsKLQotCQlpbmRleCsrOwotCX0gd2hpbGUgKG5vZGUgfHwgbmV4dF9wYWdlKTsKKwkJc3RhcnQgPSBlbmQgKyAxOworCX0KIAogCS8qIFdyaXRlIG91dCB0aGUgYml0bWFwcyAqLwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZiaXRtYXBfbGlzdCkgewotCQl2b2lkICphZGRyOwogCQlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZW50cnkgPQogCQkJbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBsaXN0KTsKIAotCQlpZiAoaW5kZXggPj0gbnVtX3BhZ2VzKSB7Ci0JCQlvdXRfb2Zfc3BhY2UgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQkJcGFnZSA9IHBhZ2VzW2luZGV4XTsKLQotCQlhZGRyID0ga21hcChwYWdlKTsKLQkJbWVtY3B5KGFkZHIsIGVudHJ5LT5iaXRtYXAsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JCWt1bm1hcChwYWdlKTsKLQkJYnl0ZXMgKz0gUEFHRV9DQUNIRV9TSVpFOwotCisJCXJldCA9IGlvX2N0bF9hZGRfYml0bWFwKCZpb19jdGwsIGVudHJ5LT5iaXRtYXApOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfbm9zcGM7CiAJCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKLQkJaW5kZXgrKzsKLQl9Ci0KLQlpZiAob3V0X29mX3NwYWNlKSB7Ci0JCWJ0cmZzX2Ryb3BfcGFnZXMocGFnZXMsIG51bV9wYWdlcyk7Ci0JCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgMCwKLQkJCQkgICAgIGlfc2l6ZV9yZWFkKGlub2RlKSAtIDEsICZjYWNoZWRfc3RhdGUsCi0JCQkJICAgICBHRlBfTk9GUyk7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0OwogCX0KIAogCS8qIFplcm8gb3V0IHRoZSByZXN0IG9mIHRoZSBwYWdlcyBqdXN0IHRvIG1ha2Ugc3VyZSAqLwotCXdoaWxlIChpbmRleCA8IG51bV9wYWdlcykgewotCQl2b2lkICphZGRyOworCWlvX2N0bF96ZXJvX3JlbWFpbmluZ19wYWdlcygmaW9fY3RsKTsKIAotCQlwYWdlID0gcGFnZXNbaW5kZXhdOwotCQlhZGRyID0ga21hcChwYWdlKTsKLQkJbWVtc2V0KGFkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JCWt1bm1hcChwYWdlKTsKLQkJYnl0ZXMgKz0gUEFHRV9DQUNIRV9TSVpFOwotCQlpbmRleCsrOwotCX0KLQotCXJldCA9IGJ0cmZzX2RpcnR5X3BhZ2VzKHJvb3QsIGlub2RlLCBwYWdlcywgbnVtX3BhZ2VzLCAwLAotCQkJCQkgICAgYnl0ZXMsICZjYWNoZWRfc3RhdGUpOwotCWJ0cmZzX2Ryb3BfcGFnZXMocGFnZXMsIG51bV9wYWdlcyk7CisJcmV0ID0gYnRyZnNfZGlydHlfcGFnZXMocm9vdCwgaW5vZGUsIGlvX2N0bC5wYWdlcywgaW9fY3RsLm51bV9wYWdlcywKKwkJCQkwLCBpX3NpemVfcmVhZChpbm9kZSksICZjYWNoZWRfc3RhdGUpOworCWlvX2N0bF9kcm9wX3BhZ2VzKCZpb19jdGwpOwogCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgMCwKIAkJCSAgICAgaV9zaXplX3JlYWQoaW5vZGUpIC0gMSwgJmNhY2hlZF9zdGF0ZSwgR0ZQX05PRlMpOwogCi0JaWYgKHJldCkgewotCQlyZXQgPSAwOworCWlmIChyZXQpCiAJCWdvdG8gb3V0OwotCX0KIAotCUJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uID0gdHJhbnMtPnRyYW5zaWQ7CiAKLQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOworCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAlrZXkub2JqZWN0aWQgPSBCVFJGU19GUkVFX1NQQUNFX09CSkVDVElEOwogCWtleS5vZmZzZXQgPSBvZmZzZXQ7CiAJa2V5LnR5cGUgPSAwOwogCi0JcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIDEsIDEpOworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAwLCAxKTsKIAlpZiAocmV0IDwgMCkgewotCQlyZXQgPSAtMTsKLQkJY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsIGJ5dGVzIC0gMSwKLQkJCQkgRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DIHwKLQkJCQkgRVhURU5UX0RPX0FDQ09VTlRJTkcsIDAsIDAsIE5VTEwsIEdGUF9OT0ZTKTsKKwkJY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsIGlub2RlLT5pX3NpemUgLSAxLAorCQkJCSBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MsIDAsIDAsIE5VTEwsCisJCQkJIEdGUF9OT0ZTKTsKIAkJZ290byBvdXQ7CiAJfQogCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKQEAgLTgxNiwxNSArOTg2LDE2IEBACiAJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CiAJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfRlJFRV9TUEFDRV9PQkpFQ1RJRCB8fAogCQkgICAgZm91bmRfa2V5Lm9mZnNldCAhPSBvZmZzZXQpIHsKLQkJCXJldCA9IC0xOwotCQkJY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsIGJ5dGVzIC0gMSwKLQkJCQkJIEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQyB8Ci0JCQkJCSBFWFRFTlRfRE9fQUNDT1VOVElORywgMCwgMCwgTlVMTCwKLQkJCQkJIEdGUF9OT0ZTKTsKKwkJCWNsZWFyX2V4dGVudF9iaXQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCAwLAorCQkJCQkgaW5vZGUtPmlfc2l6ZSAtIDEsCisJCQkJCSBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MsIDAsIDAsCisJCQkJCSBOVUxMLCBHRlBfTk9GUyk7CiAJCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KKworCUJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uID0gdHJhbnMtPnRyYW5zaWQ7CiAJaGVhZGVyID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCiAJCQkJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfaGVhZGVyKTsKIAlidHJmc19zZXRfZnJlZV9zcGFjZV9lbnRyaWVzKGxlYWYsIGhlYWRlciwgZW50cmllcyk7CkBAIC04MzMsMTYgKzEwMDQsMjYgQEAKIAlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKIAlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAKLQlyZXQgPSAxOwotCisJZXJyID0gMDsKIG91dDoKLQlrZnJlZShwYWdlcyk7Ci0JaWYgKHJldCAhPSAxKSB7Ci0JCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIDAsIGluZGV4KTsKKwlpb19jdGxfZnJlZSgmaW9fY3RsKTsKKwlpZiAoZXJyKSB7CisJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyKGlub2RlLT5pX21hcHBpbmcpOwogCQlCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiA9IDA7CiAJfQogCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIGVycjsKKworb3V0X25vc3BjOgorCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZiaXRtYXBfbGlzdCkgeworCQlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZW50cnkgPQorCQkJbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmZW50cnktPmxpc3QpOworCX0KKwlpb19jdGxfZHJvcF9wYWdlcygmaW9fY3RsKTsKKwl1bmxvY2tfZXh0ZW50X2NhY2hlZCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsCisJCQkgICAgIGlfc2l6ZV9yZWFkKGlub2RlKSAtIDEsICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKKwlnb3RvIG91dDsKIH0KIAogaW50IGJ0cmZzX3dyaXRlX291dF9jYWNoZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKQEAgLTg2OSwxNCArMTA1MCwxNSBAQAogCiAJcmV0ID0gX19idHJmc193cml0ZV9vdXRfY2FjaGUocm9vdCwgaW5vZGUsIGN0bCwgYmxvY2tfZ3JvdXAsIHRyYW5zLAogCQkJCSAgICAgIHBhdGgsIGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQpOwotCWlmIChyZXQgPCAwKSB7CisJaWYgKHJldCkgewogCQlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKIAkJYmxvY2tfZ3JvdXAtPmRpc2tfY2FjaGVfc3RhdGUgPSBCVFJGU19EQ19FUlJPUjsKIAkJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKIAkJcmV0ID0gMDsKLQorI2lmZGVmIERFQlVHCiAJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZhaWxlZCB0byB3cml0ZSBmcmVlIHNwYWNlIGNhY2UgIgogCQkgICAgICAgImZvciBibG9jayBncm91cCAlbGx1XG4iLCBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkKTsKKyNlbmRpZgogCX0KIAogCWlwdXQoaW5vZGUpOwpAQCAtMTcwMSw2ICsxODgzLDcgQEAKIAkJCWN0bC0+dG90YWxfYml0bWFwcy0tOwogCQl9CiAJCWttZW1fY2FjaGVfZnJlZShidHJmc19mcmVlX3NwYWNlX2NhY2hlcCwgaW5mbyk7CisJCXJldCA9IDA7CiAJCWdvdG8gb3V0X2xvY2s7CiAJfQogCkBAIC0xNzA4LDcgKzE4OTEsOCBAQAogCQl1bmxpbmtfZnJlZV9zcGFjZShjdGwsIGluZm8pOwogCQlpbmZvLT5vZmZzZXQgKz0gYnl0ZXM7CiAJCWluZm8tPmJ5dGVzIC09IGJ5dGVzOwotCQlsaW5rX2ZyZWVfc3BhY2UoY3RsLCBpbmZvKTsKKwkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgaW5mbyk7CisJCVdBUk5fT04ocmV0KTsKIAkJZ290byBvdXRfbG9jazsKIAl9CiAKQEAgLTI0NzIsOSArMjY1NiwxOSBAQAogCQlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOwogCiAJCWlmIChieXRlcyA+PSBtaW5sZW4pIHsKLQkJCWludCB1cGRhdGVfcmV0OwotCQkJdXBkYXRlX3JldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwKLQkJCQkJCQkJIGJ5dGVzLCAxLCAxKTsKKwkJCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvOworCQkJaW50IHVwZGF0ZSA9IDA7CisKKwkJCXNwYWNlX2luZm8gPSBibG9ja19ncm91cC0+c3BhY2VfaW5mbzsKKwkJCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJCQlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwkJCWlmICghYmxvY2tfZ3JvdXAtPnJvKSB7CisJCQkJYmxvY2tfZ3JvdXAtPnJlc2VydmVkICs9IGJ5dGVzOworCQkJCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICs9IGJ5dGVzOworCQkJCXVwZGF0ZSA9IDE7CisJCQl9CisJCQlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCQkJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOwogCiAJCQlyZXQgPSBidHJmc19lcnJvcl9kaXNjYXJkX2V4dGVudChmc19pbmZvLT5leHRlbnRfcm9vdCwKIAkJCQkJCQkgc3RhcnQsCkBAIC0yNDgyLDkgKzI2NzYsMTYgQEAKIAkJCQkJCQkgJmFjdHVhbGx5X3RyaW1tZWQpOwogCiAJCQlidHJmc19hZGRfZnJlZV9zcGFjZShibG9ja19ncm91cCwgc3RhcnQsIGJ5dGVzKTsKLQkJCWlmICghdXBkYXRlX3JldCkKLQkJCQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoYmxvY2tfZ3JvdXAsCi0JCQkJCQkJICAgIGJ5dGVzLCAwLCAxKTsKKwkJCWlmICh1cGRhdGUpIHsKKwkJCQlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOworCQkJCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCQkJCWlmIChibG9ja19ncm91cC0+cm8pCisJCQkJCXNwYWNlX2luZm8tPmJ5dGVzX3JlYWRvbmx5ICs9IGJ5dGVzOworCQkJCWJsb2NrX2dyb3VwLT5yZXNlcnZlZCAtPSBieXRlczsKKwkJCQlzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBieXRlczsKKwkJCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJCQkJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwkJCX0KIAogCQkJaWYgKHJldCkKIAkJCQlicmVhazsKQEAgLTI2NDMsOSArMjg0NCwxMyBAQAogCQlyZXR1cm4gMDsKIAogCXJldCA9IF9fYnRyZnNfd3JpdGVfb3V0X2NhY2hlKHJvb3QsIGlub2RlLCBjdGwsIE5VTEwsIHRyYW5zLCBwYXRoLCAwKTsKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0KSB7CisJCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2VfbWV0YWRhdGEoaW5vZGUsIGlub2RlLT5pX3NpemUpOworI2lmZGVmIERFQlVHCiAJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZhaWxlZCB0byB3cml0ZSBmcmVlIGlubyBjYWNoZSAiCiAJCSAgICAgICAiZm9yIHJvb3QgJWxsdVxuIiwgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQpOworI2VuZGlmCisJfQogCiAJaXB1dChpbm9kZSk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLW1hcC5jIGIvZnMvYnRyZnMvaW5vZGUtbWFwLmMKaW5kZXggYjQwODdlMC4uZjg5NjJhOSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW5vZGUtbWFwLmMKKysrIGIvZnMvYnRyZnMvaW5vZGUtbWFwLmMKQEAgLTM5OCw2ICszOTgsOCBAQAogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsID0gcm9vdC0+ZnJlZV9pbm9fY3RsOwogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2OworCXU2NCBudW1fYnl0ZXM7CiAJdTY0IGFsbG9jX2hpbnQgPSAwOwogCWludCByZXQ7CiAJaW50IHByZWFsbG9jOwpAQCAtNDIxLDExICs0MjMsMjYgQEAKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKKwl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdjsKKworCW51bV9ieXRlcyA9IHRyYW5zLT5ieXRlc19yZXNlcnZlZDsKKwkvKgorCSAqIDEgaXRlbSBmb3IgaW5vZGUgaXRlbSBpbnNlcnRpb24gaWYgbmVlZAorCSAqIDMgaXRlbXMgZm9yIGlub2RlIGl0ZW0gdXBkYXRlIChpbiB0aGUgd29yc3QgY2FzZSkKKwkgKiAxIGl0ZW0gZm9yIGZyZWUgc3BhY2Ugb2JqZWN0CisJICogMyBpdGVtcyBmb3IgcHJlLWFsbG9jYXRpb24KKwkgKi8KKwl0cmFucy0+Ynl0ZXNfcmVzZXJ2ZWQgPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgOCk7CisJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZF9ub2ZsdXNoKHJvb3QsIHRyYW5zLT5ibG9ja19yc3YsCisJCQkJCSAgdHJhbnMtPmJ5dGVzX3Jlc2VydmVkKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIGFnYWluOgogCWlub2RlID0gbG9va3VwX2ZyZWVfaW5vX2lub2RlKHJvb3QsIHBhdGgpOwogCWlmIChJU19FUlIoaW5vZGUpICYmIFBUUl9FUlIoaW5vZGUpICE9IC1FTk9FTlQpIHsKIAkJcmV0ID0gUFRSX0VSUihpbm9kZSk7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCWlmIChJU19FUlIoaW5vZGUpKSB7CkBAIC00MzQsNyArNDUxLDcgQEAKIAogCQlyZXQgPSBjcmVhdGVfZnJlZV9pbm9faW5vZGUocm9vdCwgdHJhbnMsIHBhdGgpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9yZWxlYXNlOwogCQlnb3RvIGFnYWluOwogCX0KIApAQCAtNDY1LDIxICs0ODIsMjYgQEAKIAkvKiBKdXN0IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSAqLwogCXByZWFsbG9jICs9IDggKiBQQUdFX0NBQ0hFX1NJWkU7CiAKLQlyZXQgPSBidHJmc19jaGVja19kYXRhX2ZyZWVfc3BhY2UoaW5vZGUsIHByZWFsbG9jKTsKKwlyZXQgPSBidHJmc19kZWxhbGxvY19yZXNlcnZlX3NwYWNlKGlub2RlLCBwcmVhbGxvYyk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfcHV0OwogCiAJcmV0ID0gYnRyZnNfcHJlYWxsb2NfZmlsZV9yYW5nZV90cmFucyhpbm9kZSwgdHJhbnMsIDAsIDAsIHByZWFsbG9jLAogCQkJCQkgICAgICBwcmVhbGxvYywgcHJlYWxsb2MsICZhbGxvY19oaW50KTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9zcGFjZShpbm9kZSwgcHJlYWxsb2MpOwogCQlnb3RvIG91dF9wdXQ7CisJfQogCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgcHJlYWxsb2MpOwogCisJcmV0ID0gYnRyZnNfd3JpdGVfb3V0X2lub19jYWNoZShyb290LCB0cmFucywgcGF0aCk7CiBvdXRfcHV0OgogCWlwdXQoaW5vZGUpOworb3V0X3JlbGVhc2U6CisJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgdHJhbnMtPmJsb2NrX3JzdiwgdHJhbnMtPmJ5dGVzX3Jlc2VydmVkKTsKIG91dDoKLQlpZiAocmV0ID09IDApCi0JCXJldCA9IGJ0cmZzX3dyaXRlX291dF9pbm9fY2FjaGUocm9vdCwgdHJhbnMsIHBhdGgpOworCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CisJdHJhbnMtPmJ5dGVzX3Jlc2VydmVkID0gbnVtX2J5dGVzOwogCiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS5jIGIvZnMvYnRyZnMvaW5vZGUuYwppbmRleCBiMmQwMDRhLi4xMTZhYjY3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLmMKQEAgLTQ1LDEwICs0NSwxMCBAQAogI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCiAjaW5jbHVkZSAiaW9jdGwuaCIKICNpbmNsdWRlICJwcmludC10cmVlLmgiCi0jaW5jbHVkZSAidm9sdW1lcy5oIgogI2luY2x1ZGUgIm9yZGVyZWQtZGF0YS5oIgogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAidHJlZS1sb2cuaCIKKyNpbmNsdWRlICJ2b2x1bWVzLmgiCiAjaW5jbHVkZSAiY29tcHJlc3Npb24uaCIKICNpbmNsdWRlICJsb2NraW5nLmgiCiAjaW5jbHVkZSAiZnJlZS1zcGFjZS1jYWNoZS5oIgpAQCAtOTMsNiArOTMsOCBAQAogCQkJCSAgIHN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSwKIAkJCQkgICB1NjQgc3RhcnQsIHU2NCBlbmQsIGludCAqcGFnZV9zdGFydGVkLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm5yX3dyaXR0ZW4sIGludCB1bmxvY2spOworc3RhdGljIG5vaW5saW5lIGludCBidHJmc191cGRhdGVfaW5vZGVfZmFsbGJhY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiBzdGF0aWMgaW50IGJ0cmZzX2luaXRfaW5vZGVfc2VjdXJpdHkoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCAgc3RydWN0IGlub2RlICpkaXIsCkBAIC0zOTMsNyArMzk1LDEwIEBACiAJICAgICAoQlRSRlNfSShpbm9kZSktPmZsYWdzICYgQlRSRlNfSU5PREVfQ09NUFJFU1MpKSkgewogCQlXQVJOX09OKHBhZ2VzKTsKIAkJcGFnZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG5yX3BhZ2VzLCBHRlBfTk9GUyk7Ci0JCUJVR19PTighcGFnZXMpOworCQlpZiAoIXBhZ2VzKSB7CisJCQkvKiBqdXN0IGJhaWwgb3V0IHRvIHRoZSB1bmNvbXByZXNzZWQgY29kZSAqLworCQkJZ290byBjb250OworCQl9CiAKIAkJaWYgKEJUUkZTX0koaW5vZGUpLT5mb3JjZV9jb21wcmVzcykKIAkJCWNvbXByZXNzX3R5cGUgPSBCVFJGU19JKGlub2RlKS0+Zm9yY2VfY29tcHJlc3M7CkBAIC00MjQsNiArNDI5LDcgQEAKIAkJCXdpbGxfY29tcHJlc3MgPSAxOwogCQl9CiAJfQorY29udDoKIAlpZiAoc3RhcnQgPT0gMCkgewogCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCUJVR19PTihJU19FUlIodHJhbnMpKTsKQEAgLTgyMCw3ICs4MjYsNyBAQAogCX0KIAogCUJVR19PTihkaXNrX251bV9ieXRlcyA+Ci0JICAgICAgIGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSk7CisJICAgICAgIGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpKTsKIAogCWFsbG9jX2hpbnQgPSBnZXRfZXh0ZW50X2FsbG9jYXRpb25faGludChpbm9kZSwgc3RhcnQsIG51bV9ieXRlcyk7CiAJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIHN0YXJ0LCBzdGFydCArIG51bV9ieXRlcyAtIDEsIDApOwpAQCAtMTczNyw3ICsxNzQzLDcgQEAKIAkJCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCQlCVUdfT04oSVNfRVJSKHRyYW5zKSk7CiAJCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKLQkJCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCQkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlX2ZhbGxiYWNrKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCQlCVUdfT04ocmV0KTsKIAkJfQogCQlnb3RvIG91dDsKQEAgLTE3ODcsMTcgKzE3OTMsMTcgQEAKIAogCXJldCA9IGJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShpbm9kZSwgMCwgb3JkZXJlZF9leHRlbnQpOwogCWlmICghcmV0IHx8ICF0ZXN0X2JpdChCVFJGU19PUkRFUkVEX1BSRUFMTE9DLCAmb3JkZXJlZF9leHRlbnQtPmZsYWdzKSkgewotCQlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlX2ZhbGxiYWNrKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCUJVR19PTihyZXQpOwogCX0KIAlyZXQgPSAwOwogb3V0OgotCWlmIChub2xvY2spIHsKLQkJaWYgKHRyYW5zKQotCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uX25vbG9jayh0cmFucywgcm9vdCk7Ci0JfSBlbHNlIHsKKwlpZiAocm9vdCAhPSByb290LT5mc19pbmZvLT50cmVlX3Jvb3QpCiAJCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2VfbWV0YWRhdGEoaW5vZGUsIG9yZGVyZWRfZXh0ZW50LT5sZW4pOwotCQlpZiAodHJhbnMpCisJaWYgKHRyYW5zKSB7CisJCWlmIChub2xvY2spCisJCQlidHJmc19lbmRfdHJhbnNhY3Rpb25fbm9sb2NrKHRyYW5zLCByb290KTsKKwkJZWxzZQogCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAl9CiAKQEAgLTE4MTksMTUzICsxODI1LDkgQEAKIH0KIAogLyoKLSAqIFdoZW4gSU8gZmFpbHMsIGVpdGhlciB3aXRoIEVJTyBvciBjc3VtIHZlcmlmaWNhdGlvbiBmYWlscywgd2UKLSAqIHRyeSBvdGhlciBtaXJyb3JzIHRoYXQgbWlnaHQgaGF2ZSBhIGdvb2QgY29weSBvZiB0aGUgZGF0YS4gIFRoaXMKLSAqIGlvX2ZhaWx1cmVfcmVjb3JkIGlzIHVzZWQgdG8gcmVjb3JkIHN0YXRlIGFzIHdlIGdvIHRocm91Z2ggYWxsIHRoZQotICogbWlycm9ycy4gIElmIGFub3RoZXIgbWlycm9yIGhhcyBnb29kIGRhdGEsIHRoZSBwYWdlIGlzIHNldCB1cCB0byBkYXRlCi0gKiBhbmQgdGhpbmdzIGNvbnRpbnVlLiAgSWYgYSBnb29kIG1pcnJvciBjYW4ndCBiZSBmb3VuZCwgdGhlIG9yaWdpbmFsCi0gKiBiaW8gZW5kX2lvIGNhbGxiYWNrIGlzIGNhbGxlZCB0byBpbmRpY2F0ZSB0aGluZ3MgaGF2ZSBmYWlsZWQuCi0gKi8KLXN0cnVjdCBpb19mYWlsdXJlX3JlY29yZCB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdTY0IHN0YXJ0OwotCXU2NCBsZW47Ci0JdTY0IGxvZ2ljYWw7Ci0JdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3M7Ci0JaW50IGxhc3RfbWlycm9yOwotfTsKLQotc3RhdGljIGludCBidHJmc19pb19mYWlsZWRfaG9vayhzdHJ1Y3QgYmlvICpmYWlsZWRfYmlvLAotCQkJIHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCi0JCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICpmYWlscmVjID0gTlVMTDsKLQl1NjQgcHJpdmF0ZTsKLQlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IGV4dGVudF9pb190cmVlICpmYWlsdXJlX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZTsKLQlzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICplbV90cmVlID0gJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfdHJlZTsKLQlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IG51bV9jb3BpZXM7Ci0JaW50IHJldDsKLQlpbnQgcnc7Ci0JdTY0IGxvZ2ljYWw7Ci0KLQlyZXQgPSBnZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHN0YXJ0LCAmcHJpdmF0ZSk7Ci0JaWYgKHJldCkgewotCQlmYWlscmVjID0ga21hbGxvYyhzaXplb2YoKmZhaWxyZWMpLCBHRlBfTk9GUyk7Ci0JCWlmICghZmFpbHJlYykKLQkJCXJldHVybiAtRU5PTUVNOwotCQlmYWlscmVjLT5zdGFydCA9IHN0YXJ0OwotCQlmYWlscmVjLT5sZW4gPSBlbmQgLSBzdGFydCArIDE7Ci0JCWZhaWxyZWMtPmxhc3RfbWlycm9yID0gMDsKLQkJZmFpbHJlYy0+YmlvX2ZsYWdzID0gMDsKLQotCQlyZWFkX2xvY2soJmVtX3RyZWUtPmxvY2spOwotCQllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBzdGFydCwgZmFpbHJlYy0+bGVuKTsKLQkJaWYgKGVtLT5zdGFydCA+IHN0YXJ0IHx8IGVtLT5zdGFydCArIGVtLT5sZW4gPCBzdGFydCkgewotCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKLQkJCWVtID0gTlVMTDsKLQkJfQotCQlyZWFkX3VubG9jaygmZW1fdHJlZS0+bG9jayk7Ci0KLQkJaWYgKElTX0VSUl9PUl9OVUxMKGVtKSkgewotCQkJa2ZyZWUoZmFpbHJlYyk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCQlsb2dpY2FsID0gc3RhcnQgLSBlbS0+c3RhcnQ7Ci0JCWxvZ2ljYWwgPSBlbS0+YmxvY2tfc3RhcnQgKyBsb2dpY2FsOwotCQlpZiAodGVzdF9iaXQoRVhURU5UX0ZMQUdfQ09NUFJFU1NFRCwgJmVtLT5mbGFncykpIHsKLQkJCWxvZ2ljYWwgPSBlbS0+YmxvY2tfc3RhcnQ7Ci0JCQlmYWlscmVjLT5iaW9fZmxhZ3MgPSBFWFRFTlRfQklPX0NPTVBSRVNTRUQ7Ci0JCQlleHRlbnRfc2V0X2NvbXByZXNzX3R5cGUoJmZhaWxyZWMtPmJpb19mbGFncywKLQkJCQkJCSBlbS0+Y29tcHJlc3NfdHlwZSk7Ci0JCX0KLQkJZmFpbHJlYy0+bG9naWNhbCA9IGxvZ2ljYWw7Ci0JCWZyZWVfZXh0ZW50X21hcChlbSk7Ci0JCXNldF9leHRlbnRfYml0cyhmYWlsdXJlX3RyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQgfAotCQkJCUVYVEVOVF9ESVJUWSwgR0ZQX05PRlMpOwotCQlzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHN0YXJ0LAotCQkJCSAodTY0KSh1bnNpZ25lZCBsb25nKWZhaWxyZWMpOwotCX0gZWxzZSB7Ci0JCWZhaWxyZWMgPSAoc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICopKHVuc2lnbmVkIGxvbmcpcHJpdmF0ZTsKLQl9Ci0JbnVtX2NvcGllcyA9IGJ0cmZzX251bV9jb3BpZXMoCi0JCQkgICAgICAmQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZSwKLQkJCSAgICAgIGZhaWxyZWMtPmxvZ2ljYWwsIGZhaWxyZWMtPmxlbik7Ci0JZmFpbHJlYy0+bGFzdF9taXJyb3IrKzsKLQlpZiAoIXN0YXRlKSB7Ci0JCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUubG9jayk7Ci0JCXN0YXRlID0gZmluZF9maXJzdF9leHRlbnRfYml0X3N0YXRlKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKLQkJCQkJCSAgICBmYWlscmVjLT5zdGFydCwKLQkJCQkJCSAgICBFWFRFTlRfTE9DS0VEKTsKLQkJaWYgKHN0YXRlICYmIHN0YXRlLT5zdGFydCAhPSBmYWlscmVjLT5zdGFydCkKLQkJCXN0YXRlID0gTlVMTDsKLQkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLmxvY2spOwotCX0KLQlpZiAoIXN0YXRlIHx8IGZhaWxyZWMtPmxhc3RfbWlycm9yID4gbnVtX2NvcGllcykgewotCQlzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIGZhaWxyZWMtPnN0YXJ0LCAwKTsKLQkJY2xlYXJfZXh0ZW50X2JpdHMoZmFpbHVyZV90cmVlLCBmYWlscmVjLT5zdGFydCwKLQkJCQkgIGZhaWxyZWMtPnN0YXJ0ICsgZmFpbHJlYy0+bGVuIC0gMSwKLQkJCQkgIEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfRElSVFksIEdGUF9OT0ZTKTsKLQkJa2ZyZWUoZmFpbHJlYyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIDEpOwotCWJpby0+YmlfcHJpdmF0ZSA9IHN0YXRlOwotCWJpby0+YmlfZW5kX2lvID0gZmFpbGVkX2Jpby0+YmlfZW5kX2lvOwotCWJpby0+Ymlfc2VjdG9yID0gZmFpbHJlYy0+bG9naWNhbCA+PiA5OwotCWJpby0+YmlfYmRldiA9IGZhaWxlZF9iaW8tPmJpX2JkZXY7Ci0JYmlvLT5iaV9zaXplID0gMDsKLQotCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIGZhaWxyZWMtPmxlbiwgc3RhcnQgLSBwYWdlX29mZnNldChwYWdlKSk7Ci0JaWYgKGZhaWxlZF9iaW8tPmJpX3J3ICYgUkVRX1dSSVRFKQotCQlydyA9IFdSSVRFOwotCWVsc2UKLQkJcncgPSBSRUFEOwotCi0JcmV0ID0gQlRSRlNfSShpbm9kZSktPmlvX3RyZWUub3BzLT5zdWJtaXRfYmlvX2hvb2soaW5vZGUsIHJ3LCBiaW8sCi0JCQkJCQkgICAgICBmYWlscmVjLT5sYXN0X21pcnJvciwKLQkJCQkJCSAgICAgIGZhaWxyZWMtPmJpb19mbGFncywgMCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGVhY2ggdGltZSBhbiBJTyBmaW5pc2hlcywgd2UgZG8gYSBmYXN0IGNoZWNrIGluIHRoZSBJTyBmYWlsdXJlIHRyZWUKLSAqIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHByb2Nlc3Mgb3IgY2xlYW4gdXAgYW4gaW9fZmFpbHVyZV9yZWNvcmQKLSAqLwotc3RhdGljIGludCBidHJmc19jbGVhbl9pb19mYWlsdXJlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQpCi17Ci0JdTY0IHByaXZhdGU7Ci0JdTY0IHByaXZhdGVfZmFpbHVyZTsKLQlzdHJ1Y3QgaW9fZmFpbHVyZV9yZWNvcmQgKmZhaWx1cmU7Ci0JaW50IHJldDsKLQotCXByaXZhdGUgPSAwOwotCWlmIChjb3VudF9yYW5nZV9iaXRzKCZCVFJGU19JKGlub2RlKS0+aW9fZmFpbHVyZV90cmVlLCAmcHJpdmF0ZSwKLQkJCSAgICAgKHU2NCktMSwgMSwgRVhURU5UX0RJUlRZLCAwKSkgewotCQlyZXQgPSBnZXRfc3RhdGVfcHJpdmF0ZSgmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZSwKLQkJCQkJc3RhcnQsICZwcml2YXRlX2ZhaWx1cmUpOwotCQlpZiAocmV0ID09IDApIHsKLQkJCWZhaWx1cmUgPSAoc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICopKHVuc2lnbmVkIGxvbmcpCi0JCQkJICAgcHJpdmF0ZV9mYWlsdXJlOwotCQkJc2V0X3N0YXRlX3ByaXZhdGUoJkJUUkZTX0koaW5vZGUpLT5pb19mYWlsdXJlX3RyZWUsCi0JCQkJCSAgZmFpbHVyZS0+c3RhcnQsIDApOwotCQkJY2xlYXJfZXh0ZW50X2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb19mYWlsdXJlX3RyZWUsCi0JCQkJCSAgZmFpbHVyZS0+c3RhcnQsCi0JCQkJCSAgZmFpbHVyZS0+c3RhcnQgKyBmYWlsdXJlLT5sZW4gLSAxLAotCQkJCQkgIEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9MT0NLRUQsCi0JCQkJCSAgR0ZQX05PRlMpOwotCQkJa2ZyZWUoZmFpbHVyZSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCiAgKiB3aGVuIHJlYWRzIGFyZSBkb25lLCB3ZSBuZWVkIHRvIGNoZWNrIGNzdW1zIHRvIHZlcmlmeSB0aGUgZGF0YSBpcyBjb3JyZWN0Ci0gKiBpZiB0aGVyZSdzIGEgbWF0Y2gsIHdlIGFsbG93IHRoZSBiaW8gdG8gZmluaXNoLiAgSWYgbm90LCB3ZSBnbyB0aHJvdWdoCi0gKiB0aGUgaW9fZmFpbHVyZV9yZWNvcmQgcm91dGluZXMgdG8gZmluZCBnb29kIGNvcGllcworICogaWYgdGhlcmUncyBhIG1hdGNoLCB3ZSBhbGxvdyB0aGUgYmlvIHRvIGZpbmlzaC4gIElmIG5vdCwgdGhlIGNvZGUgaW4KKyAqIGV4dGVudF9pby5jIHdpbGwgdHJ5IHRvIGZpbmQgZ29vZCBjb3BpZXMgZm9yIHVzLgogICovCiBzdGF0aWMgaW50IGJ0cmZzX3JlYWRwYWdlX2VuZF9pb19ob29rKHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCQkgICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCkBAIC0yMDExLDEwICsxODczLDYgQEAKIAogCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIGdvb2Q6Ci0JLyogaWYgdGhlIGlvIGZhaWx1cmUgdHJlZSBmb3IgdGhpcyBpbm9kZSBpcyBub24tZW1wdHksCi0JICogY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIHJlY292ZXJlZCBmcm9tIGEgZmFpbGVkIElPCi0JICovCi0JYnRyZnNfY2xlYW5faW9fZmFpbHVyZXMoaW5vZGUsIHN0YXJ0KTsKIAlyZXR1cm4gMDsKIAogemVyb2l0OgpAQCAtMjA3OSw4OSArMTkzNyw2IEBACiAJdXBfcmVhZCgmcm9vdC0+ZnNfaW5mby0+Y2xlYW51cF93b3JrX3NlbSk7CiB9CiAKLS8qCi0gKiBjYWxjdWxhdGUgZXh0cmEgbWV0YWRhdGEgcmVzZXJ2YXRpb24gd2hlbiBzbmFwc2hvdHRpbmcgYSBzdWJ2b2x1bWUKLSAqIGNvbnRhaW5zIG9ycGhhbiBmaWxlcy4KLSAqLwotdm9pZCBidHJmc19vcnBoYW5fcHJlX3NuYXBzaG90KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCXN0cnVjdCBidHJmc19wZW5kaW5nX3NuYXBzaG90ICpwZW5kaW5nLAotCQkJCXU2NCAqYnl0ZXNfdG9fcmVzZXJ2ZSkKLXsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKLQlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3Y7Ci0JdTY0IG51bV9ieXRlczsKLQlpbnQgaW5kZXg7Ci0KLQlyb290ID0gcGVuZGluZy0+cm9vdDsKLQlpZiAoIXJvb3QtPm9ycGhhbl9ibG9ja19yc3YgfHwgbGlzdF9lbXB0eSgmcm9vdC0+b3JwaGFuX2xpc3QpKQotCQlyZXR1cm47Ci0KLQlibG9ja19yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OwotCi0JLyogb3JwaGFuIGJsb2NrIHJlc2VydmF0aW9uIGZvciB0aGUgc25hcHNob3QgKi8KLQludW1fYnl0ZXMgPSBibG9ja19yc3YtPnNpemU7Ci0KLQkvKgotCSAqIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBjcmVhdGVkLCBDT1dpbmcgdHJlZSBibG9ja3MgbWF5IHVzZSBtb3JlCi0JICogc3BhY2UgdGhhbiBpdCBmcmVlcy4gU28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2gKLQkgKiByZXNlcnZlZCBzcGFjZS4KLQkgKi8KLQlpbmRleCA9IHRyYW5zLT50cmFuc2lkICYgMHgxOwotCWlmIChibG9ja19yc3YtPnJlc2VydmVkICsgYmxvY2tfcnN2LT5mcmVlZFtpbmRleF0gPCBibG9ja19yc3YtPnNpemUpIHsKLQkJbnVtX2J5dGVzICs9IGJsb2NrX3Jzdi0+c2l6ZSAtCi0JCQkgICAgIChibG9ja19yc3YtPnJlc2VydmVkICsgYmxvY2tfcnN2LT5mcmVlZFtpbmRleF0pOwotCX0KLQotCSpieXRlc190b19yZXNlcnZlICs9IG51bV9ieXRlczsKLX0KLQotdm9pZCBidHJmc19vcnBoYW5fcG9zdF9zbmFwc2hvdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQlzdHJ1Y3QgYnRyZnNfcGVuZGluZ19zbmFwc2hvdCAqcGVuZGluZykKLXsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IHBlbmRpbmctPnJvb3Q7Ci0Jc3RydWN0IGJ0cmZzX3Jvb3QgKnNuYXAgPSBwZW5kaW5nLT5zbmFwOwotCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdjsKLQl1NjQgbnVtX2J5dGVzOwotCWludCBpbmRleDsKLQlpbnQgcmV0OwotCi0JaWYgKCFyb290LT5vcnBoYW5fYmxvY2tfcnN2IHx8IGxpc3RfZW1wdHkoJnJvb3QtPm9ycGhhbl9saXN0KSkKLQkJcmV0dXJuOwotCi0JLyogcmVmaWxsIHNvdXJjZSBzdWJ2b2x1bWUncyBvcnBoYW4gYmxvY2sgcmVzZXJ2YXRpb24gKi8KLQlibG9ja19yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OwotCWluZGV4ID0gdHJhbnMtPnRyYW5zaWQgJiAweDE7Ci0JaWYgKGJsb2NrX3Jzdi0+cmVzZXJ2ZWQgKyBibG9ja19yc3YtPmZyZWVkW2luZGV4XSA8IGJsb2NrX3Jzdi0+c2l6ZSkgewotCQludW1fYnl0ZXMgPSBibG9ja19yc3YtPnNpemUgLQotCQkJICAgIChibG9ja19yc3YtPnJlc2VydmVkICsgYmxvY2tfcnN2LT5mcmVlZFtpbmRleF0pOwotCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZSgmcGVuZGluZy0+YmxvY2tfcnN2LAotCQkJCQkgICAgICByb290LT5vcnBoYW5fYmxvY2tfcnN2LAotCQkJCQkgICAgICBudW1fYnl0ZXMpOwotCQlCVUdfT04ocmV0KTsKLQl9Ci0KLQkvKiBzZXR1cCBvcnBoYW4gYmxvY2sgcmVzZXJ2YXRpb24gZm9yIHRoZSBzbmFwc2hvdCAqLwotCWJsb2NrX3JzdiA9IGJ0cmZzX2FsbG9jX2Jsb2NrX3JzdihzbmFwKTsKLQlCVUdfT04oIWJsb2NrX3Jzdik7Ci0KLQlidHJmc19hZGRfZHVyYWJsZV9ibG9ja19yc3Yocm9vdC0+ZnNfaW5mbywgYmxvY2tfcnN2KTsKLQlzbmFwLT5vcnBoYW5fYmxvY2tfcnN2ID0gYmxvY2tfcnN2OwotCi0JbnVtX2J5dGVzID0gcm9vdC0+b3JwaGFuX2Jsb2NrX3Jzdi0+c2l6ZTsKLQlyZXQgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZSgmcGVuZGluZy0+YmxvY2tfcnN2LAotCQkJCSAgICAgIGJsb2NrX3JzdiwgbnVtX2J5dGVzKTsKLQlCVUdfT04ocmV0KTsKLQotI2lmIDAKLQkvKiBpbnNlcnQgb3JwaGFuIGl0ZW0gZm9yIHRoZSBzbmFwc2hvdCAqLwotCVdBUk5fT04oIXJvb3QtPm9ycGhhbl9pdGVtX2luc2VydGVkKTsKLQlyZXQgPSBidHJmc19pbnNlcnRfb3JwaGFuX2l0ZW0odHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKLQkJCQkgICAgICAgc25hcC0+cm9vdF9rZXkub2JqZWN0aWQpOwotCUJVR19PTihyZXQpOwotCXNuYXAtPm9ycGhhbl9pdGVtX2luc2VydGVkID0gMTsKLSNlbmRpZgotfQotCiBlbnVtIGJ0cmZzX29ycGhhbl9jbGVhbnVwX3N0YXRlIHsKIAlPUlBIQU5fQ0xFQU5VUF9TVEFSVEVECT0gMSwKIAlPUlBIQU5fQ0xFQU5VUF9ET05FCT0gMiwKQEAgLTIyNDcsOSArMjAyMiw2IEBACiAJfQogCXNwaW5fdW5sb2NrKCZyb290LT5vcnBoYW5fbG9jayk7CiAKLQlpZiAoYmxvY2tfcnN2KQotCQlidHJmc19hZGRfZHVyYWJsZV9ibG9ja19yc3Yocm9vdC0+ZnNfaW5mbywgYmxvY2tfcnN2KTsKLQogCS8qIGdyYWIgbWV0YWRhdGEgcmVzZXJ2YXRpb24gZnJvbSB0cmFuc2FjdGlvbiBoYW5kbGUgKi8KIAlpZiAocmVzZXJ2ZSkgewogCQlyZXQgPSBidHJmc19vcnBoYW5fcmVzZXJ2ZV9tZXRhZGF0YSh0cmFucywgaW5vZGUpOwpAQCAtMjMxNiw2ICsyMDg4LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleSwgZm91bmRfa2V5OwogCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdTY0IGxhc3Rfb2JqZWN0aWQgPSAwOwogCWludCByZXQgPSAwLCBucl91bmxpbmsgPSAwLCBucl90cnVuY2F0ZSA9IDA7CiAKIAlpZiAoY21weGNoZygmcm9vdC0+b3JwaGFuX2NsZWFudXBfc3RhdGUsIDAsIE9SUEhBTl9DTEVBTlVQX1NUQVJURUQpKQpAQCAtMjM2NywxMyArMjE0MCwzOSBAQAogCQkgKiBjcm9zc2luZyByb290IHRoaW5nLiAgd2Ugc3RvcmUgdGhlIGlub2RlIG51bWJlciBpbiB0aGUKIAkJICogb2Zmc2V0IG9mIHRoZSBvcnBoYW4gaXRlbS4KIAkJICovCisKKwkJaWYgKGZvdW5kX2tleS5vZmZzZXQgPT0gbGFzdF9vYmplY3RpZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogRXJyb3IgcmVtb3Zpbmcgb3JwaGFuIGVudHJ5LCAiCisJCQkgICAgICAgInN0b3BwaW5nIG9ycGhhbiBjbGVhbnVwXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWxhc3Rfb2JqZWN0aWQgPSBmb3VuZF9rZXkub2Zmc2V0OworCiAJCWZvdW5kX2tleS5vYmplY3RpZCA9IGZvdW5kX2tleS5vZmZzZXQ7CiAJCWZvdW5kX2tleS50eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CiAJCWZvdW5kX2tleS5vZmZzZXQgPSAwOwogCQlpbm9kZSA9IGJ0cmZzX2lnZXQocm9vdC0+ZnNfaW5mby0+c2IsICZmb3VuZF9rZXksIHJvb3QsIE5VTEwpOwotCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJcmV0ID0gUFRSX0VSUihpbm9kZSk7CisJCXJldCA9IFBUUl9SRVQoaW5vZGUpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRVNUQUxFKQogCQkJZ290byBvdXQ7CisKKwkJLyoKKwkJICogSW5vZGUgaXMgYWxyZWFkeSBnb25lIGJ1dCB0aGUgb3JwaGFuIGl0ZW0gaXMgc3RpbGwgdGhlcmUsCisJCSAqIGtpbGwgdGhlIG9ycGhhbiBpdGVtLgorCQkgKi8KKwkJaWYgKHJldCA9PSAtRVNUQUxFKSB7CisJCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQkJaWYgKElTX0VSUih0cmFucykpIHsKKwkJCQlyZXQgPSBQVFJfRVJSKHRyYW5zKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJldCA9IGJ0cmZzX2RlbF9vcnBoYW5faXRlbSh0cmFucywgcm9vdCwKKwkJCQkJCSAgICBmb3VuZF9rZXkub2JqZWN0aWQpOworCQkJQlVHX09OKHJldCk7CisJCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCQkJY29udGludWU7CiAJCX0KIAogCQkvKgpAQCAtMjM4NCwyNCArMjE4Myw2IEBACiAJCWxpc3RfYWRkKCZCVFJGU19JKGlub2RlKS0+aV9vcnBoYW4sICZyb290LT5vcnBoYW5fbGlzdCk7CiAJCXNwaW5fdW5sb2NrKCZyb290LT5vcnBoYW5fbG9jayk7CiAKLQkJLyoKLQkJICogaWYgdGhpcyBpcyBhIGJhZCBpbm9kZSwgbWVhbnMgd2UgYWN0dWFsbHkgc3VjY2VlZGVkIGluCi0JCSAqIHJlbW92aW5nIHRoZSBpbm9kZSwgYnV0IG5vdCB0aGUgb3JwaGFuIHJlY29yZCwgd2hpY2ggbWVhbnMKLQkJICogd2UgbmVlZCB0byBtYW51YWxseSBkZWxldGUgdGhlIG9ycGhhbiBzaW5jZSBpcHV0IHdpbGwganVzdAotCQkgKiBkbyBhIGRlc3Ryb3lfaW5vZGUKLQkJICovCi0JCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7Ci0JCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOwotCQkJaWYgKElTX0VSUih0cmFucykpIHsKLQkJCQlyZXQgPSBQVFJfRVJSKHRyYW5zKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWJ0cmZzX29ycGhhbl9kZWwodHJhbnMsIGlub2RlKTsKLQkJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci0JCQlpcHV0KGlub2RlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KIAkJLyogaWYgd2UgaGF2ZSBsaW5rcywgdGhpcyB3YXMgYSB0cnVuY2F0ZSwgbGV0cyBkbyB0aGF0ICovCiAJCWlmIChpbm9kZS0+aV9ubGluaykgewogCQkJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CkBAIC0yNDIwLDYgKzIyMDEsOSBAQAogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQorCS8qIHJlbGVhc2UgdGhlIHBhdGggc2luY2Ugd2UncmUgZG9uZSB3aXRoIGl0ICovCisJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCiAJcm9vdC0+b3JwaGFuX2NsZWFudXBfc3RhdGUgPSBPUlBIQU5fQ0xFQU5VUF9ET05FOwogCiAJaWYgKHJvb3QtPm9ycGhhbl9ibG9ja19yc3YpCkBAIC0yNTM0LDcgKzIzMTgsNyBAQAogCWlub2RlX2l0ZW0gPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKIAkJCQkgICAgc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOwogCWlub2RlLT5pX21vZGUgPSBidHJmc19pbm9kZV9tb2RlKGxlYWYsIGlub2RlX2l0ZW0pOwotCWlub2RlLT5pX25saW5rID0gYnRyZnNfaW5vZGVfbmxpbmsobGVhZiwgaW5vZGVfaXRlbSk7CisJc2V0X25saW5rKGlub2RlLCBidHJmc19pbm9kZV9ubGluayhsZWFmLCBpbm9kZV9pdGVtKSk7CiAJaW5vZGUtPmlfdWlkID0gYnRyZnNfaW5vZGVfdWlkKGxlYWYsIGlub2RlX2l0ZW0pOwogCWlub2RlLT5pX2dpZCA9IGJ0cmZzX2lub2RlX2dpZChsZWFmLCBpbm9kZV9pdGVtKTsKIAlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIGJ0cmZzX2lub2RlX3NpemUobGVhZiwgaW5vZGVfaXRlbSkpOwpAQCAtMjY0Nyw3ICsyNDMxLDcgQEAKIC8qCiAgKiBjb3B5IGV2ZXJ5dGhpbmcgaW4gdGhlIGluLW1lbW9yeSBpbm9kZSBpbnRvIHRoZSBidHJlZS4KICAqLwotbm9pbmxpbmUgaW50IGJ0cmZzX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKK3N0YXRpYyBub2lubGluZSBpbnQgYnRyZnNfdXBkYXRlX2lub2RlX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CkBAIC0yNjU1LDIxICsyNDM5LDYgQEAKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBJZiB0aGUgaW5vZGUgaXMgYSBmcmVlIHNwYWNlIGlub2RlLCB3ZSBjYW4gZGVhZGxvY2sgZHVyaW5nIGNvbW1pdAotCSAqIGlmIHdlIHB1dCBpdCBpbnRvIHRoZSBkZWxheWVkIGNvZGUuCi0JICoKLQkgKiBUaGUgZGF0YSByZWxvY2F0aW9uIGlub2RlIHNob3VsZCBhbHNvIGJlIGRpcmVjdGx5IHVwZGF0ZWQKLQkgKiB3aXRob3V0IGRlbGF5Ci0JICovCi0JaWYgKCFidHJmc19pc19mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGlub2RlKQotCSAgICAmJiByb290LT5yb290X2tleS5vYmplY3RpZCAhPSBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQpIHsKLQkJcmV0ID0gYnRyZnNfZGVsYXllZF91cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKLQkJaWYgKCFyZXQpCi0JCQlidHJmc19zZXRfaW5vZGVfbGFzdF90cmFucyh0cmFucywgaW5vZGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI2OTgsNiArMjQ2Nyw0MyBAQAogfQogCiAvKgorICogY29weSBldmVyeXRoaW5nIGluIHRoZSBpbi1tZW1vcnkgaW5vZGUgaW50byB0aGUgYnRyZWUuCisgKi8KK25vaW5saW5lIGludCBidHJmc191cGRhdGVfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IHJldDsKKworCS8qCisJICogSWYgdGhlIGlub2RlIGlzIGEgZnJlZSBzcGFjZSBpbm9kZSwgd2UgY2FuIGRlYWRsb2NrIGR1cmluZyBjb21taXQKKwkgKiBpZiB3ZSBwdXQgaXQgaW50byB0aGUgZGVsYXllZCBjb2RlLgorCSAqCisJICogVGhlIGRhdGEgcmVsb2NhdGlvbiBpbm9kZSBzaG91bGQgYWxzbyBiZSBkaXJlY3RseSB1cGRhdGVkCisJICogd2l0aG91dCBkZWxheQorCSAqLworCWlmICghYnRyZnNfaXNfZnJlZV9zcGFjZV9pbm9kZShyb290LCBpbm9kZSkKKwkgICAgJiYgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfREFUQV9SRUxPQ19UUkVFX09CSkVDVElEKSB7CisJCXJldCA9IGJ0cmZzX2RlbGF5ZWRfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJCWlmICghcmV0KQorCQkJYnRyZnNfc2V0X2lub2RlX2xhc3RfdHJhbnModHJhbnMsIGlub2RlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gYnRyZnNfdXBkYXRlX2lub2RlX2l0ZW0odHJhbnMsIHJvb3QsIGlub2RlKTsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBidHJmc191cGRhdGVfaW5vZGVfZmFsbGJhY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IHJldDsKKworCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCWlmIChyZXQgPT0gLUVOT1NQQykKKwkJcmV0dXJuIGJ0cmZzX3VwZGF0ZV9pbm9kZV9pdGVtKHRyYW5zLCByb290LCBpbm9kZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIHVubGluayBoZWxwZXIgdGhhdCBnZXRzIHVzZWQgaGVyZSBpbiBpbm9kZS5jIGFuZCBpbiB0aGUgdHJlZSBsb2dnaW5nCiAgKiByZWNvdmVyeSBjb2RlLiAgSXQgcmVtb3ZlIGEgbGluayBpbiBhIGRpcmVjdG9yeSB3aXRoIGEgZ2l2ZW4gbmFtZSwgYW5kCiAgKiBhbHNvIGRyb3BzIHRoZSBiYWNrIHJlZnMgaW4gdGhlIGlub2RlIHRvIHRoZSBkaXJlY3RvcnkKQEAgLTI4MzUsNyArMjY0MSwxNiBAQAogCXU2NCBpbm8gPSBidHJmc19pbm8oaW5vZGUpOwogCXU2NCBkaXJfaW5vID0gYnRyZnNfaW5vKGRpcik7CiAKLQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEwKTsKKwkvKgorCSAqIDEgZm9yIHRoZSBwb3NzaWJsZSBvcnBoYW4gaXRlbQorCSAqIDEgZm9yIHRoZSBkaXIgaXRlbQorCSAqIDEgZm9yIHRoZSBkaXIgaW5kZXgKKwkgKiAxIGZvciB0aGUgaW5vZGUgcmVmCisJICogMSBmb3IgdGhlIGlub2RlIHJlZiBpbiB0aGUgdHJlZSBsb2cKKwkgKiAyIGZvciB0aGUgZGlyIGVudHJpZXMgaW4gdGhlIGxvZworCSAqIDEgZm9yIHRoZSBpbm9kZQorCSAqLworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgOCk7CiAJaWYgKCFJU19FUlIodHJhbnMpIHx8IFBUUl9FUlIodHJhbnMpICE9IC1FTk9TUEMpCiAJCXJldHVybiB0cmFuczsKIApAQCAtMjg1OCw3ICsyNjczLDggQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCi0JdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAwKTsKKwkvKiAxIGZvciB0aGUgb3JwaGFuIGl0ZW0gKi8KKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOwogCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKIAkJcm9vdC0+ZnNfaW5mby0+ZW5vc3BjX3VubGluayA9IDA7CkBAIC0yOTYzLDYgKzI3NzksMTIgQEAKIAllcnIgPSAwOwogb3V0OgogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwkvKiBNaWdyYXRlIHRoZSBvcnBoYW4gcmVzZXJ2YXRpb24gb3ZlciAqLworCWlmICghZXJyKQorCQllcnIgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZSh0cmFucy0+YmxvY2tfcnN2LAorCQkJCSZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LAorCQkJCXRyYW5zLT5ieXRlc19yZXNlcnZlZCk7CisKIAlpZiAoZXJyKSB7CiAJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJCXJvb3QtPmZzX2luZm8tPmVub3NwY191bmxpbmsgPSAwOwpAQCAtMjk3Nyw2ICsyNzk5LDkgQEAKIAkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlpZiAodHJhbnMtPmJsb2NrX3JzdiA9PSAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdikgeworCQlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCB0cmFucy0+YmxvY2tfcnN2LAorCQkJCQl0cmFucy0+Ynl0ZXNfcmVzZXJ2ZWQpOworCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdjsKIAkJQlVHX09OKCFyb290LT5mc19pbmZvLT5lbm9zcGNfdW5saW5rKTsKIAkJcm9vdC0+ZnNfaW5mby0+ZW5vc3BjX3VubGluayA9IDA7CiAJfQpAQCAtMzM2OCw2ICszMTkzLDcgQEAKIAlwZ29mZl90IGluZGV4ID0gZnJvbSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXVuc2lnbmVkIG9mZnNldCA9IGZyb20gJiAoUEFHRV9DQUNIRV9TSVpFLTEpOwogCXN0cnVjdCBwYWdlICpwYWdlOworCWdmcF90IG1hc2sgPSBidHJmc19hbGxvY193cml0ZV9tYXNrKG1hcHBpbmcpOwogCWludCByZXQgPSAwOwogCXU2NCBwYWdlX3N0YXJ0OwogCXU2NCBwYWdlX2VuZDsKQEAgLTMzODAsNyArMzIwNiw3IEBACiAKIAlyZXQgPSAtRU5PTUVNOwogYWdhaW46Ci0JcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKKwlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCBpbmRleCwgbWFzayk7CiAJaWYgKCFwYWdlKSB7CiAJCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2Vfc3BhY2UoaW5vZGUsIFBBR0VfQ0FDSEVfU0laRSk7CiAJCWdvdG8gb3V0OwpAQCAtMzYxMyw2ICszNDM5LDggQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdiwgKmdsb2JhbF9yc3Y7CisJdTY0IG1pbl9zaXplID0gYnRyZnNfY2FsY190cnVuY19tZXRhZGF0YV9zaXplKHJvb3QsIDEpOwogCXVuc2lnbmVkIGxvbmcgbnI7CiAJaW50IHJldDsKIApAQCAtMzY0MCwyMiArMzQ2OCw1NSBAQAogCQlnb3RvIG5vX2RlbGV0ZTsKIAl9CiAKKwlyc3YgPSBidHJmc19hbGxvY19ibG9ja19yc3Yocm9vdCk7CisJaWYgKCFyc3YpIHsKKwkJYnRyZnNfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7CisJCWdvdG8gbm9fZGVsZXRlOworCX0KKwlyc3YtPnNpemUgPSBtaW5fc2l6ZTsKKwlnbG9iYWxfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisKIAlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIDApOwogCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IHNpbXBsZXIgdGhhbiBidHJmc190cnVuY2F0ZSBzaW5jZQorCSAqCisJICogMSkgV2UndmUgYWxyZWFkeSByZXNlcnZlZCBvdXIgc3BhY2UgZm9yIG91ciBvcnBoYW4gaXRlbSBpbiB0aGUKKwkgKiAgICB1bmxpbmsuCisJICogMikgV2UncmUgZ29pbmcgdG8gZGVsZXRlIHRoZSBpbm9kZSBpdGVtLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZQorCSAqICAgIGl0IGF0IGFsbC4KKwkgKgorCSAqIFNvIHdlIGp1c3QgbmVlZCB0byByZXNlcnZlIHNvbWUgc2xhY2sgc3BhY2UgaW4gY2FzZSB3ZSBhZGQgYnl0ZXMgd2hlbgorCSAqIGRvaW5nIHRoZSB0cnVuY2F0ZS4KKwkgKi8KIAl3aGlsZSAoMSkgewotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7Ci0JCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQkJdHJhbnMtPmJsb2NrX3JzdiA9IHJvb3QtPm9ycGhhbl9ibG9ja19yc3Y7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9yZWZpbGwocm9vdCwgcnN2LCBtaW5fc2l6ZSk7CiAKLQkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2NoZWNrKHRyYW5zLCByb290LAotCQkJCQkgICAgcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdiwgMCwgNSk7CisJCS8qCisJCSAqIFRyeSBhbmQgc3RlYWwgZnJvbSB0aGUgZ2xvYmFsIHJlc2VydmUgc2luY2Ugd2Ugd2lsbAorCQkgKiBsaWtlbHkgbm90IHVzZSB0aGlzIHNwYWNlIGFueXdheSwgd2Ugd2FudCB0byB0cnkgYXMKKwkJICogaGFyZCBhcyBwb3NzaWJsZSB0byBnZXQgdGhpcyB0byB3b3JrLgorCQkgKi8KKwkJaWYgKHJldCkKKwkJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKGdsb2JhbF9yc3YsIHJzdiwgbWluX3NpemUpOworCiAJCWlmIChyZXQpIHsKLQkJCUJVR19PTihyZXQgIT0gLUVBR0FJTik7Ci0JCQlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwotCQkJQlVHX09OKHJldCk7Ci0JCQljb250aW51ZTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkIG5vdCBnZXQgc3BhY2UgZm9yIGEgIgorCQkJICAgICAgICJkZWxldGUsIHdpbGwgdHJ1bmNhdGUgb24gbW91bnQgJWRcbiIsIHJldCk7CisJCQlidHJmc19vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKwkJCWJ0cmZzX2ZyZWVfYmxvY2tfcnN2KHJvb3QsIHJzdik7CisJCQlnb3RvIG5vX2RlbGV0ZTsKIAkJfQogCisJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMCk7CisJCWlmIChJU19FUlIodHJhbnMpKSB7CisJCQlidHJmc19vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKwkJCWJ0cmZzX2ZyZWVfYmxvY2tfcnN2KHJvb3QsIHJzdik7CisJCQlnb3RvIG5vX2RlbGV0ZTsKKwkJfQorCisJCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CisKIAkJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfaW5vZGVfaXRlbXModHJhbnMsIHJvb3QsIGlub2RlLCAwLCAwKTsKIAkJaWYgKHJldCAhPSAtRUFHQUlOKQogCQkJYnJlYWs7CkBAIC0zNjY0LDE0ICszNTI1LDE3IEBACiAJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJCXRyYW5zID0gTlVMTDsKIAkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7Ci0KIAl9CiAKKwlidHJmc19mcmVlX2Jsb2NrX3Jzdihyb290LCByc3YpOworCiAJaWYgKHJldCA9PSAwKSB7CisJCXRyYW5zLT5ibG9ja19yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OwogCQlyZXQgPSBidHJmc19vcnBoYW5fZGVsKHRyYW5zLCBpbm9kZSk7CiAJCUJVR19PTihyZXQpOwogCX0KIAorCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2OwogCWlmICghKHJvb3QgPT0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290IHx8CiAJICAgICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgPT0gQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRCkpCiAJCWJ0cmZzX3JldHVybl9pbm8ocm9vdCwgYnRyZnNfaW5vKGlub2RlKSk7CkBAIC01Nzk1LDggKzU2NTksNyBAQAogCWlmICh0ZXN0X2JpdChCVFJGU19PUkRFUkVEX05PQ09XLCAmb3JkZXJlZC0+ZmxhZ3MpKSB7CiAJCXJldCA9IGJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShpbm9kZSwgMCwgb3JkZXJlZCk7CiAJCWlmICghcmV0KQotCQkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7Ci0JCWVyciA9IHJldDsKKwkJCWVyciA9IGJ0cmZzX3VwZGF0ZV9pbm9kZV9mYWxsYmFjayh0cmFucywgcm9vdCwgaW5vZGUpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTU4MzQsNyArNTY5Nyw3IEBACiAJYWRkX3BlbmRpbmdfY3N1bXModHJhbnMsIGlub2RlLCBvcmRlcmVkLT5maWxlX29mZnNldCwgJm9yZGVyZWQtPmxpc3QpOwogCXJldCA9IGJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShpbm9kZSwgMCwgb3JkZXJlZCk7CiAJaWYgKCFyZXQgfHwgIXRlc3RfYml0KEJUUkZTX09SREVSRURfUFJFQUxMT0MsICZvcmRlcmVkLT5mbGFncykpCi0JCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCQlidHJmc191cGRhdGVfaW5vZGVfZmFsbGJhY2sodHJhbnMsIHJvb3QsIGlub2RlKTsKIAlyZXQgPSAwOwogb3V0X3VubG9jazoKIAl1bmxvY2tfZXh0ZW50X2NhY2hlZCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIG9yZGVyZWQtPmZpbGVfb2Zmc2V0LApAQCAtNjI4OSw3ICs2MTUyLDcgQEAKIHsKIAlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWU7CiAJdHJlZSA9ICZCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5pb190cmVlOwotCXJldHVybiBleHRlbnRfcmVhZF9mdWxsX3BhZ2UodHJlZSwgcGFnZSwgYnRyZnNfZ2V0X2V4dGVudCk7CisJcmV0dXJuIGV4dGVudF9yZWFkX2Z1bGxfcGFnZSh0cmVlLCBwYWdlLCBidHJmc19nZXRfZXh0ZW50LCAwKTsKIH0KIAogc3RhdGljIGludCBidHJmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQpAQCAtNjU0MSw2ICs2NDA0LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKIAl1bnNpZ25lZCBsb25nIG5yOwogCXU2NCBtYXNrID0gcm9vdC0+c2VjdG9yc2l6ZSAtIDE7CisJdTY0IG1pbl9zaXplID0gYnRyZnNfY2FsY190cnVuY19tZXRhZGF0YV9zaXplKHJvb3QsIDEpOwogCiAJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplKTsKIAlpZiAocmV0KQpAQCAtNjU4OCwxOSArNjQ1MiwyMyBAQAogCXJzdiA9IGJ0cmZzX2FsbG9jX2Jsb2NrX3Jzdihyb290KTsKIAlpZiAoIXJzdikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JYnRyZnNfYWRkX2R1cmFibGVfYmxvY2tfcnN2KHJvb3QtPmZzX2luZm8sIHJzdik7CisJcnN2LT5zaXplID0gbWluX3NpemU7CiAKKwkvKgorCSAqIDEgZm9yIHRoZSB0cnVuY2F0ZSBzbGFjayBzcGFjZQorCSAqIDEgZm9yIHRoZSBvcnBoYW4gaXRlbSB3ZSdyZSBnb2luZyB0byBhZGQKKwkgKiAxIGZvciB0aGUgb3JwaGFuIGl0ZW0gZGVsZXRpb24KKwkgKiAxIGZvciB1cGRhdGluZyB0aGUgaW5vZGUuCisJICovCiAJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCA0KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkgewogCQllcnIgPSBQVFJfRVJSKHRyYW5zKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JLyoKLQkgKiBSZXNlcnZlIHNwYWNlIGZvciB0aGUgdHJ1bmNhdGUgcHJvY2Vzcy4gIFRydW5jYXRlIHNob3VsZCBiZSBhZGRpbmcKLQkgKiBzcGFjZSwgYnV0IGlmIHRoZXJlIGFyZSBzbmFwc2hvdHMgaXQgbWF5IGVuZCB1cCB1c2luZyBzcGFjZS4KLQkgKi8KLQlyZXQgPSBidHJmc190cnVuY2F0ZV9yZXNlcnZlX21ldGFkYXRhKHRyYW5zLCByb290LCByc3YpOworCS8qIE1pZ3JhdGUgdGhlIHNsYWNrIHNwYWNlIGZvciB0aGUgdHJ1bmNhdGUgdG8gb3VyIHJlc2VydmUgKi8KKwlyZXQgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZSgmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2LCByc3YsCisJCQkJICAgICAgbWluX3NpemUpOwogCUJVR19PTihyZXQpOwogCiAJcmV0ID0gYnRyZnNfb3JwaGFuX2FkZCh0cmFucywgaW5vZGUpOwpAQCAtNjYwOSwyMSArNjQ3Nyw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwotCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci0JYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7Ci0KLQkvKgotCSAqIE9rIHNvIHdlJ3ZlIGFscmVhZHkgbWlncmF0ZWQgb3VyIGJ5dGVzIG92ZXIgZm9yIHRoZSB0cnVuY2F0ZSwgc28gaGVyZQotCSAqIGp1c3QgcmVzZXJ2ZSB0aGUgb25lIHNsb3Qgd2UgbmVlZCBmb3IgdXBkYXRpbmcgdGhlIGlub2RlLgotCSAqLwotCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7Ci0JaWYgKElTX0VSUih0cmFucykpIHsKLQkJZXJyID0gUFRSX0VSUih0cmFucyk7Ci0JCWdvdG8gb3V0OwotCX0KLQl0cmFucy0+YmxvY2tfcnN2ID0gcnN2OwotCiAJLyoKIAkgKiBzZXRhdHRyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHRoZSBvcmRlcmVkX2RhdGFfY2xvc2UgZmxhZywKIAkgKiBidXQgdGhhdCBpcyBvbmx5IHRlc3RlZCBkdXJpbmcgdGhlIGxhc3QgZmlsZSByZWxlYXNlLiAgVGhhdApAQCAtNjY0NSwyMCArNjQ5OCwzMCBAQAogCQlidHJmc19hZGRfb3JkZXJlZF9vcGVyYXRpb24odHJhbnMsIHJvb3QsIGlub2RlKTsKIAogCXdoaWxlICgxKSB7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9yZWZpbGwocm9vdCwgcnN2LCBtaW5fc2l6ZSk7CisJCWlmIChyZXQpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aXRoIHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiB3ZQorCQkJICogc3RhcnRlZCBhYm92ZSwgZXZlcnkgb3RoZXIgdGltZSB3ZSBzaG91bGRuJ3QgaGF2ZSBhCisJCQkgKiB0cmFuc2FjdGlvbiBzdGFydGVkIHlldC4KKwkJCSAqLworCQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJCWdvdG8gZW5kX3RyYW5zOworCQkJZXJyID0gcmV0OworCQkJYnJlYWs7CisJCX0KKwogCQlpZiAoIXRyYW5zKSB7Ci0JCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDMpOworCQkJLyogSnVzdCBuZWVkIHRoZSAxIGZvciB1cGRhdGluZyB0aGUgaW5vZGUgKi8KKwkJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CiAJCQlpZiAoSVNfRVJSKHRyYW5zKSkgewogCQkJCWVyciA9IFBUUl9FUlIodHJhbnMpOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCi0JCQlyZXQgPSBidHJmc190cnVuY2F0ZV9yZXNlcnZlX21ldGFkYXRhKHRyYW5zLCByb290LAotCQkJCQkJCSAgICAgIHJzdik7Ci0JCQlCVUdfT04ocmV0KTsKLQotCQkJdHJhbnMtPmJsb2NrX3JzdiA9IHJzdjsKIAkJfQogCisJCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CisKIAkJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfaW5vZGVfaXRlbXModHJhbnMsIHJvb3QsIGlub2RlLAogCQkJCQkJIGlub2RlLT5pX3NpemUsCiAJCQkJCQkgQlRSRlNfRVhURU5UX0RBVEFfS0VZKTsKQEAgLTY2NzMsNyArNjUzNiw3IEBACiAJCQllcnIgPSByZXQ7CiAJCQlicmVhazsKIAkJfQotCitlbmRfdHJhbnM6CiAJCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCQl0cmFucyA9IE5VTEw7CkBAIC02NjkzLDE0ICs2NTU2LDE2IEBACiAJCXJldCA9IGJ0cmZzX29ycGhhbl9kZWwoTlVMTCwgaW5vZGUpOwogCX0KIAotCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2OwotCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwotCWlmIChyZXQgJiYgIWVycikKLQkJZXJyID0gcmV0OworCWlmICh0cmFucykgeworCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdjsKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJCWlmIChyZXQgJiYgIWVycikKKwkJCWVyciA9IHJldDsKIAotCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwotCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7Ci0JYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CisJCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOworCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb25fdGhyb3R0bGUodHJhbnMsIHJvb3QpOworCQlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKKwl9CiAKIG91dDoKIAlidHJmc19mcmVlX2Jsb2NrX3Jzdihyb290LCByc3YpOwpAQCAtNjcyOCw3ICs2NTkzLDcgQEAKIAlpbm9kZS0+aV9vcCA9ICZidHJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmYnRyZnNfZGlyX2ZpbGVfb3BlcmF0aW9uczsKIAotCWlub2RlLT5pX25saW5rID0gMTsKKwlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCWJ0cmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgMCk7CiAKIAllcnIgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIG5ld19yb290LCBpbm9kZSk7CkBAIC02NzU1LDkgKzY2MjAsOSBAQAogCWVpLT5sYXN0X3N1Yl90cmFucyA9IDA7CiAJZWktPmxvZ2dlZF90cmFucyA9IDA7CiAJZWktPmRlbGFsbG9jX2J5dGVzID0gMDsKLQllaS0+cmVzZXJ2ZWRfYnl0ZXMgPSAwOwogCWVpLT5kaXNrX2lfc2l6ZSA9IDA7CiAJZWktPmZsYWdzID0gMDsKKwllaS0+Y3N1bV9ieXRlcyA9IDA7CiAJZWktPmluZGV4X2NudCA9ICh1NjQpLTE7CiAJZWktPmxhc3RfdW5saW5rX3RyYW5zID0gMDsKIApAQCAtNjc2OSw2ICs2NjM0LDcgQEAKIAllaS0+b3JwaGFuX21ldGFfcmVzZXJ2ZWQgPSAwOwogCWVpLT5kdW1teV9pbm9kZSA9IDA7CiAJZWktPmluX2RlZnJhZyA9IDA7CisJZWktPmRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQgPSAwOwogCWVpLT5mb3JjZV9jb21wcmVzcyA9IEJUUkZTX0NPTVBSRVNTX05PTkU7CiAKIAllaS0+ZGVsYXllZF9ub2RlID0gTlVMTDsKQEAgLTY4MDMsNiArNjY2OSw4IEBACiAJV0FSTl9PTihpbm9kZS0+aV9kYXRhLm5ycGFnZXMpOwogCVdBUk5fT04oQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMpOwogCVdBUk5fT04oQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2V4dGVudHMpOworCVdBUk5fT04oQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2J5dGVzKTsKKwlXQVJOX09OKEJUUkZTX0koaW5vZGUpLT5jc3VtX2J5dGVzKTsKIAogCS8qCiAJICogVGhpcyBjYW4gaGFwcGVuIHdoZXJlIHdlIGNyZWF0ZSBhbiBpbm9kZSwgYnV0IHNvbWVib2R5IGVsc2UgYWxzbwpAQCAtNzQyMCw3ICs3Mjg4LDYgQEAKIAkucmVhZHBhZ2VfZW5kX2lvX2hvb2sgPSBidHJmc19yZWFkcGFnZV9lbmRfaW9faG9vaywKIAkud3JpdGVwYWdlX2VuZF9pb19ob29rID0gYnRyZnNfd3JpdGVwYWdlX2VuZF9pb19ob29rLAogCS53cml0ZXBhZ2Vfc3RhcnRfaG9vayA9IGJ0cmZzX3dyaXRlcGFnZV9zdGFydF9ob29rLAotCS5yZWFkcGFnZV9pb19mYWlsZWRfaG9vayA9IGJ0cmZzX2lvX2ZhaWxlZF9ob29rLAogCS5zZXRfYml0X2hvb2sgPSBidHJmc19zZXRfYml0X2hvb2ssCiAJLmNsZWFyX2JpdF9ob29rID0gYnRyZnNfY2xlYXJfYml0X2hvb2ssCiAJLm1lcmdlX2V4dGVudF9ob29rID0gYnRyZnNfbWVyZ2VfZXh0ZW50X2hvb2ssCmRpZmYgLS1naXQgYS9mcy9idHJmcy9pb2N0bC5jIGIvZnMvYnRyZnMvaW9jdGwuYwppbmRleCBkYWU1ZGZlLi40YTM0YzQ3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9pb2N0bC5jCisrKyBiL2ZzL2J0cmZzL2lvY3RsLmMKQEAgLTUxLDYgKzUxLDcgQEAKICNpbmNsdWRlICJ2b2x1bWVzLmgiCiAjaW5jbHVkZSAibG9ja2luZy5oIgogI2luY2x1ZGUgImlub2RlLW1hcC5oIgorI2luY2x1ZGUgImJhY2tyZWYuaCIKIAogLyogTWFzayBvdXQgZmxhZ3MgdGhhdCBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIHR5cGUgb2YgaW5vZGUuICovCiBzdGF0aWMgaW5saW5lIF9fdTMyIGJ0cmZzX21hc2tfZmxhZ3ModW1vZGVfdCBtb2RlLCBfX3UzMiBmbGFncykKQEAgLTExNyw3ICsxMTgsNyBAQAogLyoKICAqIEluaGVyaXQgZmxhZ3MgZnJvbSB0aGUgcGFyZW50IGlub2RlLgogICoKLSAqIFVubGlrZSBleHROIHdlIGRvbid0IGhhdmUgYW55IGZsYWdzIHdlIGRvbid0IHdhbnQgdG8gaW5oZXJpdCBjdXJyZW50bHkuCisgKiBDdXJyZW50bHkgb25seSB0aGUgY29tcHJlc3Npb24gZmxhZ3MgYW5kIHRoZSBjb3cgZmxhZ3MgYXJlIGluaGVyaXRlZC4KICAqLwogdm9pZCBidHJmc19pbmhlcml0X2lmbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKIHsKQEAgLTEyOCwxMiArMTI5LDE3IEBACiAKIAlmbGFncyA9IEJUUkZTX0koZGlyKS0+ZmxhZ3M7CiAKLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKLQkJZmxhZ3MgJj0gfkJUUkZTX0lOT0RFX0RJUlNZTkM7Ci0JZWxzZSBpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCWZsYWdzICY9IChCVFJGU19JTk9ERV9OT0RVTVAgfCBCVFJGU19JTk9ERV9OT0FUSU1FKTsKKwlpZiAoZmxhZ3MgJiBCVFJGU19JTk9ERV9OT0NPTVBSRVNTKSB7CisJCUJUUkZTX0koaW5vZGUpLT5mbGFncyAmPSB+QlRSRlNfSU5PREVfQ09NUFJFU1M7CisJCUJUUkZTX0koaW5vZGUpLT5mbGFncyB8PSBCVFJGU19JTk9ERV9OT0NPTVBSRVNTOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBCVFJGU19JTk9ERV9DT01QUkVTUykgeworCQlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJj0gfkJUUkZTX0lOT0RFX05PQ09NUFJFU1M7CisJCUJUUkZTX0koaW5vZGUpLT5mbGFncyB8PSBCVFJGU19JTk9ERV9DT01QUkVTUzsKKwl9CiAKLQlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgPSBmbGFnczsKKwlpZiAoZmxhZ3MgJiBCVFJGU19JTk9ERV9OT0RBVEFDT1cpCisJCUJUUkZTX0koaW5vZGUpLT5mbGFncyB8PSBCVFJGU19JTk9ERV9OT0RBVEFDT1c7CisKIAlidHJmc191cGRhdGVfaWZsYWdzKGlub2RlKTsKIH0KIApAQCAtMjc3LDYgKzI4Myw3IEBACiAJc3RydWN0IGZzdHJpbV9yYW5nZSByYW5nZTsKIAl1NjQgbWlubGVuID0gVUxMT05HX01BWDsKIAl1NjQgbnVtX2RldmljZXMgPSAwOworCXU2NCB0b3RhbF9ieXRlcyA9IGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWludCByZXQ7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCkBAIC0yOTUsMTIgKzMwMiwxNSBAQAogCQl9CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOworCiAJaWYgKCFudW1fZGV2aWNlcykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyYW5nZSwgYXJnLCBzaXplb2YocmFuZ2UpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHJhbmdlLnN0YXJ0ID4gdG90YWxfYnl0ZXMpCisJCXJldHVybiAtRUlOVkFMOwogCisJcmFuZ2UubGVuID0gbWluKHJhbmdlLmxlbiwgdG90YWxfYnl0ZXMgLSByYW5nZS5zdGFydCk7CiAJcmFuZ2UubWlubGVuID0gbWF4KHJhbmdlLm1pbmxlbiwgbWlubGVuKTsKIAlyZXQgPSBidHJmc190cmltX2ZzKHJvb3QsICZyYW5nZSk7CiAJaWYgKHJldCA8IDApCkBAIC03NjAsNyArNzcwLDcgQEAKIAlpbnQgcmV0ID0gMTsKIAogCS8qCi0JICogbWFrZSBzdXJlIHRoYXQgb25jZSB3ZSBzdGFydCBkZWZyYWdnaW5nIGFuZCBleHRlbnQsIHdlIGtlZXAgb24KKwkgKiBtYWtlIHN1cmUgdGhhdCBvbmNlIHdlIHN0YXJ0IGRlZnJhZ2dpbmcgYW4gZXh0ZW50LCB3ZSBrZWVwIG9uCiAJICogZGVmcmFnZ2luZyBpdAogCSAqLwogCWlmIChzdGFydCA8ICpkZWZyYWdfZW5kKQpAQCAtODA1LDcgKzgxNSw2IEBACiAJICogZXh0ZW50IHdpbGwgZm9yY2UgYXQgbGVhc3QgcGFydCBvZiB0aGF0IGJpZyBleHRlbnQgdG8gYmUgZGVmcmFnZ2VkLgogCSAqLwogCWlmIChyZXQpIHsKLQkJKmxhc3RfbGVuICs9IGxlbjsKIAkJKmRlZnJhZ19lbmQgPSBleHRlbnRfbWFwX2VuZChlbSk7CiAJfSBlbHNlIHsKIAkJKmxhc3RfbGVuID0gMDsKQEAgLTg0Myw2ICs4NTIsNyBAQAogCWludCBpX2RvbmU7CiAJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICpvcmRlcmVkOwogCXN0cnVjdCBleHRlbnRfc3RhdGUgKmNhY2hlZF9zdGF0ZSA9IE5VTEw7CisJZ2ZwX3QgbWFzayA9IGJ0cmZzX2FsbG9jX3dyaXRlX21hc2soaW5vZGUtPmlfbWFwcGluZyk7CiAKIAlpZiAoaXNpemUgPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC04NjAsNyArODcwLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsCi0JCQkJCSAgICBzdGFydF9pbmRleCArIGksIEdGUF9OT0ZTKTsKKwkJCQkJICAgIHN0YXJ0X2luZGV4ICsgaSwgbWFzayk7CiAJCWlmICghcGFnZSkKIAkJCWJyZWFrOwogCkBAIC05NzIsMTggKzk4MiwyMCBAQAogCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqZGlza19zdXBlcjsKIAlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9pbmRleDsKKwl1NjQgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJdTY0IGZlYXR1cmVzOwogCXU2NCBsYXN0X2xlbiA9IDA7CiAJdTY0IHNraXAgPSAwOwogCXU2NCBkZWZyYWdfZW5kID0gMDsKIAl1NjQgbmV3ZXJfb2ZmID0gcmFuZ2UtPnN0YXJ0OwotCWludCBuZXdlcl9sZWZ0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyByYV9pbmRleCA9IDA7CiAJaW50IHJldDsKIAlpbnQgZGVmcmFnX2NvdW50ID0gMDsKIAlpbnQgY29tcHJlc3NfdHlwZSA9IEJUUkZTX0NPTVBSRVNTX1pMSUI7CiAJaW50IGV4dGVudF90aHJlc2ggPSByYW5nZS0+ZXh0ZW50X3RocmVzaDsKLQlpbnQgbmV3ZXJfY2x1c3RlciA9ICgyNTYgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWludCBtYXhfY2x1c3RlciA9ICgyNTYgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWludCBjbHVzdGVyID0gbWF4X2NsdXN0ZXI7CiAJdTY0IG5ld19hbGlnbiA9IH4oKHU2NCkxMjggKiAxMDI0IC0gMSk7CiAJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEw7CiAKQEAgLTk5Nyw3ICsxMDA5LDcgQEAKIAkJCWNvbXByZXNzX3R5cGUgPSByYW5nZS0+Y29tcHJlc3NfdHlwZTsKIAl9CiAKLQlpZiAoaW5vZGUtPmlfc2l6ZSA9PSAwKQorCWlmIChpc2l6ZSA9PSAwKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC0xMDEzLDcgKzEwMjUsNyBAQAogCQlyYSA9ICZmaWxlLT5mX3JhOwogCX0KIAotCXBhZ2VzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBuZXdlcl9jbHVzdGVyLAorCXBhZ2VzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBtYXhfY2x1c3RlciwKIAkJCUdGUF9OT0ZTKTsKIAlpZiAoIXBhZ2VzKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xMDIyLDEwICsxMDM0LDEwIEBACiAKIAkvKiBmaW5kIHRoZSBsYXN0IHBhZ2UgdG8gZGVmcmFnICovCiAJaWYgKHJhbmdlLT5zdGFydCArIHJhbmdlLT5sZW4gPiByYW5nZS0+c3RhcnQpIHsKLQkJbGFzdF9pbmRleCA9IG1pbl90KHU2NCwgaW5vZGUtPmlfc2l6ZSAtIDEsCisJCWxhc3RfaW5kZXggPSBtaW5fdCh1NjQsIGlzaXplIC0gMSwKIAkJCSByYW5nZS0+c3RhcnQgKyByYW5nZS0+bGVuIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAl9IGVsc2UgewotCQlsYXN0X2luZGV4ID0gKGlub2RlLT5pX3NpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlsYXN0X2luZGV4ID0gKGlzaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAl9CiAKIAlpZiAobmV3ZXJfdGhhbikgewpAQCAtMTAzOCwxNCArMTA1MCwxMyBAQAogCQkJICogdGhlIGV4dGVudHMgaW4gdGhlIGZpbGUgZXZlbmx5IHNwYWNlZAogCQkJICovCiAJCQlpID0gKG5ld2VyX29mZiAmIG5ld19hbGlnbikgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJCW5ld2VyX2xlZnQgPSBuZXdlcl9jbHVzdGVyOwogCQl9IGVsc2UKIAkJCWdvdG8gb3V0X3JhOwogCX0gZWxzZSB7CiAJCWkgPSByYW5nZS0+c3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAl9CiAJaWYgKCFtYXhfdG9fZGVmcmFnKQotCQltYXhfdG9fZGVmcmFnID0gbGFzdF9pbmRleCAtIDE7CisJCW1heF90b19kZWZyYWcgPSBsYXN0X2luZGV4OwogCiAJLyoKIAkgKiBtYWtlIHdyaXRlYmFjayBzdGFydHMgZnJvbSBpLCBzbyB0aGUgZGVmcmFnIHJhbmdlIGNhbiBiZQpAQCAtMTA3OSwxOCArMTA5MCwzMSBAQAogCQkJaSA9IG1heChpICsgMSwgbmV4dCk7CiAJCQljb250aW51ZTsKIAkJfQorCisJCWlmICghbmV3ZXJfdGhhbikgeworCQkJY2x1c3RlciA9IChQQUdFX0NBQ0hFX0FMSUdOKGRlZnJhZ19lbmQpID4+CisJCQkJICAgUEFHRV9DQUNIRV9TSElGVCkgLSBpOworCQkJY2x1c3RlciA9IG1pbihjbHVzdGVyLCBtYXhfY2x1c3Rlcik7CisJCX0gZWxzZSB7CisJCQljbHVzdGVyID0gbWF4X2NsdXN0ZXI7CisJCX0KKwogCQlpZiAocmFuZ2UtPmZsYWdzICYgQlRSRlNfREVGUkFHX1JBTkdFX0NPTVBSRVNTKQogCQkJQlRSRlNfSShpbm9kZSktPmZvcmNlX2NvbXByZXNzID0gY29tcHJlc3NfdHlwZTsKIAotCQlidHJmc19mb3JjZV9yYShpbm9kZS0+aV9tYXBwaW5nLCByYSwgZmlsZSwgaSwgbmV3ZXJfY2x1c3Rlcik7CisJCWlmIChpICsgY2x1c3RlciA+IHJhX2luZGV4KSB7CisJCQlyYV9pbmRleCA9IG1heChpLCByYV9pbmRleCk7CisJCQlidHJmc19mb3JjZV9yYShpbm9kZS0+aV9tYXBwaW5nLCByYSwgZmlsZSwgcmFfaW5kZXgsCisJCQkJICAgICAgIGNsdXN0ZXIpOworCQkJcmFfaW5kZXggKz0gbWF4X2NsdXN0ZXI7CisJCX0KIAotCQlyZXQgPSBjbHVzdGVyX3BhZ2VzX2Zvcl9kZWZyYWcoaW5vZGUsIHBhZ2VzLCBpLCBuZXdlcl9jbHVzdGVyKTsKKwkJcmV0ID0gY2x1c3Rlcl9wYWdlc19mb3JfZGVmcmFnKGlub2RlLCBwYWdlcywgaSwgY2x1c3Rlcik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXRfcmE7CiAKIAkJZGVmcmFnX2NvdW50ICs9IHJldDsKIAkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucihpbm9kZS0+aV9tYXBwaW5nLCByZXQpOwotCQlpICs9IHJldDsKIAogCQlpZiAobmV3ZXJfdGhhbikgewogCQkJaWYgKG5ld2VyX29mZiA9PSAodTY0KS0xKQpAQCAtMTEwNSwxMiArMTEyOSwxNyBAQAogCQkJaWYgKCFyZXQpIHsKIAkJCQlyYW5nZS0+c3RhcnQgPSBuZXdlcl9vZmY7CiAJCQkJaSA9IChuZXdlcl9vZmYgJiBuZXdfYWxpZ24pID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCQkJbmV3ZXJfbGVmdCA9IG5ld2VyX2NsdXN0ZXI7CiAJCQl9IGVsc2UgewogCQkJCWJyZWFrOwogCQkJfQogCQl9IGVsc2UgewotCQkJaSsrOworCQkJaWYgKHJldCA+IDApIHsKKwkJCQlpICs9IHJldDsKKwkJCQlsYXN0X2xlbiArPSByZXQgPDwgUEFHRV9DQUNIRV9TSElGVDsKKwkJCX0gZWxzZSB7CisJCQkJaSsrOworCQkJCWxhc3RfbGVuID0gMDsKKwkJCX0KIAkJfQogCX0KIApAQCAtMTEzNiwxNiArMTE2NSwxNCBAQAogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAl9CiAKLQlkaXNrX3N1cGVyID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJZGlza19zdXBlciA9IHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CiAJZmVhdHVyZXMgPSBidHJmc19zdXBlcl9pbmNvbXBhdF9mbGFncyhkaXNrX3N1cGVyKTsKIAlpZiAocmFuZ2UtPmNvbXByZXNzX3R5cGUgPT0gQlRSRlNfQ09NUFJFU1NfTFpPKSB7CiAJCWZlYXR1cmVzIHw9IEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfQ09NUFJFU1NfTFpPOwogCQlidHJmc19zZXRfc3VwZXJfaW5jb21wYXRfZmxhZ3MoZGlza19zdXBlciwgZmVhdHVyZXMpOwogCX0KIAotCWlmICghZmlsZSkKLQkJa2ZyZWUocmEpOwotCXJldHVybiBkZWZyYWdfY291bnQ7CisJcmV0ID0gZGVmcmFnX2NvdW50OwogCiBvdXRfcmE6CiAJaWYgKCFmaWxlKQpAQCAtMjU4Nyw3ICsyNjE0LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCX0KIAotCWRpcl9pZCA9IGJ0cmZzX3N1cGVyX3Jvb3RfZGlyKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlkaXJfaWQgPSBidHJmc19zdXBlcl9yb290X2Rpcihyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKIAlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaXRlbSh0cmFucywgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LCBwYXRoLAogCQkJCSAgIGRpcl9pZCwgImRlZmF1bHQiLCA3LCAxKTsKIAlpZiAoSVNfRVJSX09SX05VTEwoZGkpKSB7CkBAIC0yNjAzLDcgKzI2MzAsNyBAQAogCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHBhdGgtPm5vZGVzWzBdKTsKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAKLQlkaXNrX3N1cGVyID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJZGlza19zdXBlciA9IHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CiAJZmVhdHVyZXMgPSBidHJmc19zdXBlcl9pbmNvbXBhdF9mbGFncyhkaXNrX3N1cGVyKTsKIAlpZiAoIShmZWF0dXJlcyAmIEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfREVGQVVMVF9TVUJWT0wpKSB7CiAJCWZlYXR1cmVzIHw9IEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfREVGQVVMVF9TVUJWT0w7CkBAIC0yODY0LDYgKzI4OTEsMTQ0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGxvbmcgYnRyZnNfaW9jdGxfaW5vX3RvX3BhdGgoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisJdTY0IHJlbF9wdHI7CisJaW50IHNpemU7CisJc3RydWN0IGJ0cmZzX2lvY3RsX2lub19wYXRoX2FyZ3MgKmlwYSA9IE5VTEw7CisJc3RydWN0IGlub2RlX2ZzX3BhdGhzICppcGF0aCA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlpcGEgPSBtZW1kdXBfdXNlcihhcmcsIHNpemVvZigqaXBhKSk7CisJaWYgKElTX0VSUihpcGEpKSB7CisJCXJldCA9IFBUUl9FUlIoaXBhKTsKKwkJaXBhID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJc2l6ZSA9IG1pbl90KHUzMiwgaXBhLT5zaXplLCA0MDk2KTsKKwlpcGF0aCA9IGluaXRfaXBhdGgoc2l6ZSwgcm9vdCwgcGF0aCk7CisJaWYgKElTX0VSUihpcGF0aCkpIHsKKwkJcmV0ID0gUFRSX0VSUihpcGF0aCk7CisJCWlwYXRoID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcGF0aHNfZnJvbV9pbm9kZShpcGEtPmludW0sIGlwYXRoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXBhdGgtPmZzcGF0aC0+ZWxlbV9jbnQ7ICsraSkgeworCQlyZWxfcHRyID0gaXBhdGgtPmZzcGF0aC0+dmFsW2ldIC0gKHU2NClpcGF0aC0+ZnNwYXRoLT52YWw7CisJCWlwYXRoLT5mc3BhdGgtPnZhbFtpXSA9IHJlbF9wdHI7CisJfQorCisJcmV0ID0gY29weV90b191c2VyKCh2b2lkICopaXBhLT5mc3BhdGgsICh2b2lkICopaXBhdGgtPmZzcGF0aCwgc2l6ZSk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJZnJlZV9pcGF0aChpcGF0aCk7CisJa2ZyZWUoaXBhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfaW5vX2xpc3QodTY0IGludW0sIHU2NCBvZmZzZXQsIHU2NCByb290LCB2b2lkICpjdHgpCit7CisJc3RydWN0IGJ0cmZzX2RhdGFfY29udGFpbmVyICppbm9kZXMgPSBjdHg7CisJY29uc3Qgc2l6ZV90IGMgPSAzICogc2l6ZW9mKHU2NCk7CisKKwlpZiAoaW5vZGVzLT5ieXRlc19sZWZ0ID49IGMpIHsKKwkJaW5vZGVzLT5ieXRlc19sZWZ0IC09IGM7CisJCWlub2Rlcy0+dmFsW2lub2Rlcy0+ZWxlbV9jbnRdID0gaW51bTsKKwkJaW5vZGVzLT52YWxbaW5vZGVzLT5lbGVtX2NudCArIDFdID0gb2Zmc2V0OworCQlpbm9kZXMtPnZhbFtpbm9kZXMtPmVsZW1fY250ICsgMl0gPSByb290OworCQlpbm9kZXMtPmVsZW1fY250ICs9IDM7CisJfSBlbHNlIHsKKwkJaW5vZGVzLT5ieXRlc19taXNzaW5nICs9IGMgLSBpbm9kZXMtPmJ5dGVzX2xlZnQ7CisJCWlub2Rlcy0+Ynl0ZXNfbGVmdCA9IDA7CisJCWlub2Rlcy0+ZWxlbV9taXNzZWQgKz0gMzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgYnRyZnNfaW9jdGxfbG9naWNhbF90b19pbm8oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJldCA9IDA7CisJaW50IHNpemU7CisJdTY0IGV4dGVudF9vZmZzZXQ7CisJc3RydWN0IGJ0cmZzX2lvY3RsX2xvZ2ljYWxfaW5vX2FyZ3MgKmxvaTsKKwlzdHJ1Y3QgYnRyZnNfZGF0YV9jb250YWluZXIgKmlub2RlcyA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGggPSBOVUxMOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJbG9pID0gbWVtZHVwX3VzZXIoYXJnLCBzaXplb2YoKmxvaSkpOworCWlmIChJU19FUlIobG9pKSkgeworCQlyZXQgPSBQVFJfRVJSKGxvaSk7CisJCWxvaSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXNpemUgPSBtaW5fdCh1MzIsIGxvaS0+c2l6ZSwgNDA5Nik7CisJaW5vZGVzID0gaW5pdF9kYXRhX2NvbnRhaW5lcihzaXplKTsKKwlpZiAoSVNfRVJSKGlub2RlcykpIHsKKwkJcmV0ID0gUFRSX0VSUihpbm9kZXMpOworCQlpbm9kZXMgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBleHRlbnRfZnJvbV9sb2dpY2FsKHJvb3QtPmZzX2luZm8sIGxvaS0+bG9naWNhbCwgcGF0aCwgJmtleSk7CisKKwlpZiAocmV0ICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykKKwkJcmV0ID0gLUVOT0VOVDsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlleHRlbnRfb2Zmc2V0ID0gbG9pLT5sb2dpY2FsIC0ga2V5Lm9iamVjdGlkOworCXJldCA9IGl0ZXJhdGVfZXh0ZW50X2lub2Rlcyhyb290LT5mc19pbmZvLCBwYXRoLCBrZXkub2JqZWN0aWQsCisJCQkJCWV4dGVudF9vZmZzZXQsIGJ1aWxkX2lub19saXN0LCBpbm9kZXMpOworCisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gY29weV90b191c2VyKCh2b2lkICopbG9pLT5pbm9kZXMsICh2b2lkICopaW5vZGVzLCBzaXplKTsKKwlpZiAocmV0KQorCQlyZXQgPSAtRUZBVUxUOworCitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCWtmcmVlKGlub2Rlcyk7CisJa2ZyZWUobG9pKTsKKworCXJldHVybiByZXQ7Cit9CisKIGxvbmcgYnRyZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludAogCQljbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtMjkyMSw2ICszMDg2LDEwIEBACiAJCXJldHVybiBidHJmc19pb2N0bF90cmVlX3NlYXJjaChmaWxlLCBhcmdwKTsKIAljYXNlIEJUUkZTX0lPQ19JTk9fTE9PS1VQOgogCQlyZXR1cm4gYnRyZnNfaW9jdGxfaW5vX2xvb2t1cChmaWxlLCBhcmdwKTsKKwljYXNlIEJUUkZTX0lPQ19JTk9fUEFUSFM6CisJCXJldHVybiBidHJmc19pb2N0bF9pbm9fdG9fcGF0aChyb290LCBhcmdwKTsKKwljYXNlIEJUUkZTX0lPQ19MT0dJQ0FMX0lOTzoKKwkJcmV0dXJuIGJ0cmZzX2lvY3RsX2xvZ2ljYWxfdG9faW5vKHJvb3QsIGFyZ3ApOwogCWNhc2UgQlRSRlNfSU9DX1NQQUNFX0lORk86CiAJCXJldHVybiBidHJmc19pb2N0bF9zcGFjZV9pbmZvKHJvb3QsIGFyZ3ApOwogCWNhc2UgQlRSRlNfSU9DX1NZTkM6CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pb2N0bC5oIGIvZnMvYnRyZnMvaW9jdGwuaAppbmRleCBhZDFlYTc4Li4yNTJhZTk5IDEwMDY0NAotLS0gYS9mcy9idHJmcy9pb2N0bC5oCisrKyBiL2ZzL2J0cmZzL2lvY3RsLmgKQEAgLTE5Myw2ICsxOTMsMzAgQEAKIAlzdHJ1Y3QgYnRyZnNfaW9jdGxfc3BhY2VfaW5mbyBzcGFjZXNbMF07CiB9OwogCitzdHJ1Y3QgYnRyZnNfZGF0YV9jb250YWluZXIgeworCV9fdTMyCWJ5dGVzX2xlZnQ7CS8qIG91dCAtLSBieXRlcyBub3QgbmVlZGVkIHRvIGRlbGl2ZXIgb3V0cHV0ICovCisJX191MzIJYnl0ZXNfbWlzc2luZzsJLyogb3V0IC0tIGFkZGl0aW9uYWwgYnl0ZXMgbmVlZGVkIGZvciByZXN1bHQgKi8KKwlfX3UzMgllbGVtX2NudDsJLyogb3V0ICovCisJX191MzIJZWxlbV9taXNzZWQ7CS8qIG91dCAqLworCV9fdTY0CXZhbFswXTsJCS8qIG91dCAqLworfTsKKworc3RydWN0IGJ0cmZzX2lvY3RsX2lub19wYXRoX2FyZ3MgeworCV9fdTY0CQkJCWludW07CQkvKiBpbiAqLworCV9fdTMyCQkJCXNpemU7CQkvKiBpbiAqLworCV9fdTY0CQkJCXJlc2VydmVkWzRdOworCS8qIHN0cnVjdCBidHJmc19kYXRhX2NvbnRhaW5lcgkqZnNwYXRoOwkgICBvdXQgKi8KKwlfX3U2NAkJCQlmc3BhdGg7CQkvKiBvdXQgKi8KK307CisKK3N0cnVjdCBidHJmc19pb2N0bF9sb2dpY2FsX2lub19hcmdzIHsKKwlfX3U2NAkJCQlsb2dpY2FsOwkvKiBpbiAqLworCV9fdTMyCQkJCXNpemU7CQkvKiBpbiAqLworCV9fdTY0CQkJCXJlc2VydmVkWzRdOworCS8qIHN0cnVjdCBidHJmc19kYXRhX2NvbnRhaW5lcgkqaW5vZGVzOwlvdXQgICAqLworCV9fdTY0CQkJCWlub2RlczsKK307CisKICNkZWZpbmUgQlRSRlNfSU9DX1NOQVBfQ1JFQVRFIF9JT1coQlRSRlNfSU9DVExfTUFHSUMsIDEsIFwKIAkJCQkgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MpCiAjZGVmaW5lIEJUUkZTX0lPQ19ERUZSQUcgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgMiwgXApAQCAtMjQ4LDQgKzI3Miw5IEBACiAJCQkJIHN0cnVjdCBidHJmc19pb2N0bF9kZXZfaW5mb19hcmdzKQogI2RlZmluZSBCVFJGU19JT0NfRlNfSU5GTyBfSU9SKEJUUkZTX0lPQ1RMX01BR0lDLCAzMSwgXAogCQkJICAgICAgIHN0cnVjdCBidHJmc19pb2N0bF9mc19pbmZvX2FyZ3MpCisjZGVmaW5lIEJUUkZTX0lPQ19JTk9fUEFUSFMgX0lPV1IoQlRSRlNfSU9DVExfTUFHSUMsIDM1LCBcCisJCQkJCXN0cnVjdCBidHJmc19pb2N0bF9pbm9fcGF0aF9hcmdzKQorI2RlZmluZSBCVFJGU19JT0NfTE9HSUNBTF9JTk8gX0lPV1IoQlRSRlNfSU9DVExfTUFHSUMsIDM2LCBcCisJCQkJCXN0cnVjdCBidHJmc19pb2N0bF9pbm9fcGF0aF9hcmdzKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3ByaW50LXRyZWUuYyBiL2ZzL2J0cmZzL3ByaW50LXRyZWUuYwppbmRleCBmYjI2MDVkLi5mMzhlNDUyIDEwMDY0NAotLS0gYS9mcy9idHJmcy9wcmludC10cmVlLmMKKysrIGIvZnMvYnRyZnMvcHJpbnQtdHJlZS5jCkBAIC0xNTgsOCArMTU4LDcgQEAKIHZvaWQgYnRyZnNfcHJpbnRfbGVhZihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGV4dGVudF9idWZmZXIgKmwpCiB7CiAJaW50IGk7Ci0JdTMyIHR5cGU7Ci0JdTMyIG5yID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobCk7CisJdTMyIHR5cGUsIG5yOwogCXN0cnVjdCBidHJmc19pdGVtICppdGVtOwogCXN0cnVjdCBidHJmc19yb290X2l0ZW0gKnJpOwogCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGk7CkBAIC0xNzIsNiArMTcxLDExIEBACiAJc3RydWN0IGJ0cmZzX2tleSBrZXk7CiAJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CiAKKwlpZiAoIWwpCisJCXJldHVybjsKKworCW5yID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobCk7CisKIAlwcmludGsoS0VSTl9JTkZPICJsZWFmICVsbHUgdG90YWwgcHRycyAlZCBmcmVlIHNwYWNlICVkXG4iLAogCQkodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX2hlYWRlcl9ieXRlbnIobCksIG5yLAogCQlidHJmc19sZWFmX2ZyZWVfc3BhY2Uocm9vdCwgbCkpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcmVhZGEuYyBiL2ZzL2J0cmZzL3JlYWRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3M2IzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3JlYWRhLmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU1RSQVRPLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAidm9sdW1lcy5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorCisjdW5kZWYgREVCVUcKKworLyoKKyAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZ2VuZXJpYyByZWFkIGFoZWFkIGZyYW1ld29yay4KKyAqCisgKiBUbyB0cmlnZ2VyIGEgcmVhZGFoZWFkLCBidHJmc19yZWFkYV9hZGQgbXVzdCBiZSBjYWxsZWQuIEl0IHdpbGwgc3RhcnQKKyAqIGEgcmVhZCBhaGVhZCBmb3IgdGhlIGdpdmVuIHJhbmdlIFtzdGFydCwgZW5kKSBvbiB0cmVlIHJvb3QuIFRoZSByZXR1cm5lZAorICogaGFuZGxlIGNhbiBlaXRoZXIgYmUgdXNlZCB0byB3YWl0IG9uIHRoZSByZWFkYWhlYWQgdG8gZmluaXNoCisgKiAoYnRyZnNfcmVhZGFfd2FpdCksIG9yIHRvIHNlbmQgaXQgdG8gdGhlIGJhY2tncm91bmQgKGJ0cmZzX3JlYWRhX2RldGFjaCkuCisgKgorICogVGhlIHJlYWQgYWhlYWQgd29ya3MgYXMgZm9sbG93czoKKyAqIE9uIGJ0cmZzX3JlYWRhX2FkZCwgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaXMgaW5zZXJ0ZWQgaW50byBhIHJhZGl4X3RyZWUuCisgKiByZWFkYV9zdGFydF9tYWNoaW5lIHdpbGwgdGhlbiBzZWFyY2ggZm9yIGV4dGVudHMgdG8gcHJlZmV0Y2ggYW5kIHRyaWdnZXIKKyAqIHNvbWUgcmVhZHMuIFdoZW4gYSByZWFkIGZpbmlzaGVzIGZvciBhIG5vZGUsIGFsbCBjb250YWluZWQgbm9kZS9sZWFmCisgKiBwb2ludGVycyB0aGF0IGxpZSBpbiB0aGUgZ2l2ZW4gcmFuZ2Ugd2lsbCBhbHNvIGJlIGVucXVldWVkLiBUaGUgcmVhZHMgd2lsbAorICogYmUgdHJpZ2dlcmVkIGluIHNlcXVlbnRpYWwgb3JkZXIsIHRodXMgZ2l2aW5nIGEgYmlnIHdpbiBvdmVyIGEgbmFpdmUKKyAqIGVudW1lcmF0aW9uLiBJdCB3aWxsIGFsc28gbWFrZSB1c2Ugb2YgbXVsdGktZGV2aWNlIGxheW91dHMuIEVhY2ggZGlzaworICogd2lsbCBoYXZlIGl0cyBvbiByZWFkIHBvaW50ZXIgYW5kIGFsbCBkaXNrcyB3aWxsIGJ5IHV0aWxpemVkIGluIHBhcmFsbGVsLgorICogQWxzbyB3aWxsIG5vIHR3byBkaXNrcyByZWFkIGJvdGggc2lkZXMgb2YgYSBtaXJyb3Igc2ltdWx0YW5lb3VzbHksIGFzIHRoaXMKKyAqIHdvdWxkIHdhc3RlIHNlZWtpbmcgY2FwYWNpdHkuIEluc3RlYWQgYm90aCBkaXNrcyB3aWxsIHJlYWQgZGlmZmVyZW50IHBhcnRzCisgKiBvZiB0aGUgZmlsZXN5c3RlbS4KKyAqIEFueSBudW1iZXIgb2YgcmVhZGFoZWFkcyBjYW4gYmUgc3RhcnRlZCBpbiBwYXJhbGxlbC4gVGhlIHJlYWQgb3JkZXIgd2lsbCBiZQorICogZGV0ZXJtaW5lZCBnbG9iYWxseSwgaS5lLiAyIHBhcmFsbGVsIHJlYWRhaGVhZHMgd2lsbCBub3JtYWxseSBmaW5pc2ggZmFzdGVyCisgKiB0aGFuIHRoZSAyIHN0YXJ0ZWQgb25lIGFmdGVyIGFub3RoZXIuCisgKi8KKworI2RlZmluZSBNQVhfTUlSUk9SUyAyCisjZGVmaW5lIE1BWF9JTl9GTElHSFQgNgorCitzdHJ1Y3QgcmVhZGFfZXh0Y3RsIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IHJlYWRhX2NvbnRyb2wJKnJjOworCXU2NAkJCWdlbmVyYXRpb247Cit9OworCitzdHJ1Y3QgcmVhZGFfZXh0ZW50IHsKKwl1NjQJCQlsb2dpY2FsOworCXN0cnVjdCBidHJmc19rZXkJdG9wOworCXUzMgkJCWJsb2Nrc2l6ZTsKKwlpbnQJCQllcnI7CisJc3RydWN0IGxpc3RfaGVhZAlleHRjdGw7CisJc3RydWN0IGtyZWYJCXJlZmNudDsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCByZWFkYV96b25lCSp6b25lc1tNQVhfTUlSUk9SU107CisJaW50CQkJbnpvbmVzOworCXN0cnVjdCBidHJmc19kZXZpY2UJKnNjaGVkdWxlZF9mb3I7Cit9OworCitzdHJ1Y3QgcmVhZGFfem9uZSB7CisJdTY0CQkJc3RhcnQ7CisJdTY0CQkJZW5kOworCXU2NAkJCWVsZW1zOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzcGlubG9ja190CQlsb2NrOworCWludAkJCWxvY2tlZDsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlCSpkZXZpY2U7CisJc3RydWN0IGJ0cmZzX2RldmljZQkqZGV2c1tNQVhfTUlSUk9SU107IC8qIGZ1bGwgbGlzdCwgaW5jbCBzZWxmICovCisJaW50CQkJbmRldnM7CisJc3RydWN0IGtyZWYJCXJlZmNudDsKK307CisKK3N0cnVjdCByZWFkYV9tYWNoaW5lX3dvcmsgeworCXN0cnVjdCBidHJmc193b3JrCXdvcms7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8JKmZzX2luZm87Cit9OworCitzdGF0aWMgdm9pZCByZWFkYV9leHRlbnRfcHV0KHN0cnVjdCBidHJmc19mc19pbmZvICosIHN0cnVjdCByZWFkYV9leHRlbnQgKik7CitzdGF0aWMgdm9pZCByZWFkYV9jb250cm9sX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpOworc3RhdGljIHZvaWQgcmVhZGFfem9uZV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKTsKK3N0YXRpYyB2b2lkIHJlYWRhX3N0YXJ0X21hY2hpbmUoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pOworc3RhdGljIHZvaWQgX19yZWFkYV9zdGFydF9tYWNoaW5lKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKKworc3RhdGljIGludCByZWFkYV9hZGRfYmxvY2soc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjLCB1NjQgbG9naWNhbCwKKwkJCSAgIHN0cnVjdCBidHJmc19rZXkgKnRvcCwgaW50IGxldmVsLCB1NjQgZ2VuZXJhdGlvbik7CisKKy8qIHJlY3Vyc2VzICovCisvKiBpbiBjYXNlIG9mIGVyciwgZWIgbWlnaHQgYmUgTlVMTCAqLworc3RhdGljIGludCBfX3JlYWRhaGVhZF9ob29rKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkgICAgdTY0IHN0YXJ0LCBpbnQgZXJyKQoreworCWludCBsZXZlbCA9IDA7CisJaW50IG5yaXRlbXM7CisJaW50IGk7CisJdTY0IGJ5dGVucjsKKwl1NjQgZ2VuZXJhdGlvbjsKKwlzdHJ1Y3QgcmVhZGFfZXh0ZW50ICpyZTsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmZvcl9kZXY7CisKKwlpZiAoZWIpCisJCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGViKTsKKworCS8qIGZpbmQgZXh0ZW50ICovCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlyZSA9IHJhZGl4X3RyZWVfbG9va3VwKCZmc19pbmZvLT5yZWFkYV90cmVlLCBpbmRleCk7CisJaWYgKHJlKQorCQlrcmVmX2dldCgmcmUtPnJlZmNudCk7CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCisJaWYgKCFyZSkKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrKCZyZS0+bG9jayk7CisJLyoKKwkgKiBqdXN0IHRha2UgdGhlIGZ1bGwgbGlzdCBmcm9tIHRoZSBleHRlbnQuIGFmdGVyd2FyZHMgd2UKKwkgKiBkb24ndCBuZWVkIHRoZSBsb2NrIGFueW1vcmUKKwkgKi8KKwlsaXN0X3JlcGxhY2VfaW5pdCgmcmUtPmV4dGN0bCwgJmxpc3QpOworCWZvcl9kZXYgPSByZS0+c2NoZWR1bGVkX2ZvcjsKKwlyZS0+c2NoZWR1bGVkX2ZvciA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnJlLT5sb2NrKTsKKworCWlmIChlcnIgPT0gMCkgeworCQlucml0ZW1zID0gbGV2ZWwgPyBidHJmc19oZWFkZXJfbnJpdGVtcyhlYikgOiAwOworCQlnZW5lcmF0aW9uID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oZWIpOworCQkvKgorCQkgKiBGSVhNRTogY3VycmVudGx5IHdlIGp1c3Qgc2V0IG5yaXRlbXMgdG8gMCBpZiB0aGlzIGlzIGEgbGVhZiwKKwkJICogZWZmZWN0aXZlbHkgaWdub3JpbmcgdGhlIGNvbnRlbnQuIEluIGEgbmV4dCBzdGVwIHdlIGNvdWxkCisJCSAqIHRyaWdnZXIgbW9yZSByZWFkYWhlYWQgZGVwZW5kaW5nIGZyb20gdGhlIGNvbnRlbnQsIGUuZy4KKwkJICogZmV0Y2ggdGhlIGNoZWNrc3VtcyBmb3IgdGhlIGV4dGVudHMgaW4gdGhlIGxlYWYuCisJCSAqLworCX0gZWxzZSB7CisJCS8qCisJCSAqIHRoaXMgaXMgdGhlIGVycm9yIGNhc2UsIHRoZSBleHRlbnQgYnVmZmVyIGhhcyBub3QgYmVlbgorCQkgKiByZWFkIGNvcnJlY3RseS4gV2Ugd29uJ3QgYWNjZXNzIGFueXRoaW5nIGZyb20gaXQgYW5kCisJCSAqIGp1c3QgY2xlYW51cCBvdXIgZGF0YSBzdHJ1Y3R1cmVzLiBFZmZlY3RpdmVseSB0aGlzIHdpbGwKKwkJICogY3V0IHRoZSBicmFuY2ggYmVsb3cgdGhpcyBub2RlIGZyb20gcmVhZCBhaGVhZC4KKwkJICovCisJCW5yaXRlbXMgPSAwOworCQlnZW5lcmF0aW9uID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJpdGVtczsgaSsrKSB7CisJCXN0cnVjdCByZWFkYV9leHRjdGwgKnJlYzsKKwkJdTY0IG5fZ2VuOworCQlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwkJc3RydWN0IGJ0cmZzX2tleSBuZXh0X2tleTsKKworCQlidHJmc19ub2RlX2tleV90b19jcHUoZWIsICZrZXksIGkpOworCQlpZiAoaSArIDEgPCBucml0ZW1zKQorCQkJYnRyZnNfbm9kZV9rZXlfdG9fY3B1KGViLCAmbmV4dF9rZXksIGkgKyAxKTsKKwkJZWxzZQorCQkJbmV4dF9rZXkgPSByZS0+dG9wOworCQlieXRlbnIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKGViLCBpKTsKKwkJbl9nZW4gPSBidHJmc19ub2RlX3B0cl9nZW5lcmF0aW9uKGViLCBpKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYywgJmxpc3QsIGxpc3QpIHsKKwkJCXN0cnVjdCByZWFkYV9jb250cm9sICpyYyA9IHJlYy0+cmM7CisKKwkJCS8qCisJCQkgKiBpZiB0aGUgZ2VuZXJhdGlvbiBkb2Vzbid0IG1hdGNoLCBqdXN0IGlnbm9yZSB0aGlzCisJCQkgKiBleHRjdGwuIFRoaXMgd2lsbCBwcm9iYWJseSBjdXQgb2ZmIGEgYnJhbmNoIGZyb20KKwkJCSAqIHByZWZldGNoLiBBbHRlcm5hdGl2ZWx5IG9uZSBjb3VsZCBzdGFydCBhIG5ldyAoc3ViLSkKKwkJCSAqIHByZWZldGNoIGZvciB0aGlzIGJyYW5jaCwgc3RhcnRpbmcgYWdhaW4gZnJvbSByb290LgorCQkJICogRklYTUU6IG1vdmUgdGhlIGdlbmVyYXRpb24gY2hlY2sgb3V0IG9mIHRoaXMgbG9vcAorCQkJICovCisjaWZkZWYgREVCVUcKKwkJCWlmIChyZWMtPmdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJnZW5lcmF0aW9uIG1pc21hdGNoIGZvciAiCisJCQkJCQkiKCVsbHUsJWQsJWxsdSkgJWxsdSAhPSAlbGx1XG4iLAorCQkJCSAgICAgICBrZXkub2JqZWN0aWQsIGtleS50eXBlLCBrZXkub2Zmc2V0LAorCQkJCSAgICAgICByZWMtPmdlbmVyYXRpb24sIGdlbmVyYXRpb24pOworCQkJfQorI2VuZGlmCisJCQlpZiAocmVjLT5nZW5lcmF0aW9uID09IGdlbmVyYXRpb24gJiYKKwkJCSAgICBidHJmc19jb21wX2NwdV9rZXlzKCZrZXksICZyYy0+a2V5X2VuZCkgPCAwICYmCisJCQkgICAgYnRyZnNfY29tcF9jcHVfa2V5cygmbmV4dF9rZXksICZyYy0+a2V5X3N0YXJ0KSA+IDApCisJCQkJcmVhZGFfYWRkX2Jsb2NrKHJjLCBieXRlbnIsICZuZXh0X2tleSwKKwkJCQkJCWxldmVsIC0gMSwgbl9nZW4pOworCQl9CisJfQorCS8qCisJICogZnJlZSBleHRjdGwgcmVjb3JkcworCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmbGlzdCkpIHsKKwkJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjOworCQlzdHJ1Y3QgcmVhZGFfZXh0Y3RsICpyZWM7CisKKwkJcmVjID0gbGlzdF9maXJzdF9lbnRyeSgmbGlzdCwgc3RydWN0IHJlYWRhX2V4dGN0bCwgbGlzdCk7CisJCWxpc3RfZGVsKCZyZWMtPmxpc3QpOworCQlyYyA9IHJlYy0+cmM7CisJCWtmcmVlKHJlYyk7CisKKwkJa3JlZl9nZXQoJnJjLT5yZWZjbnQpOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmMtPmVsZW1zKSkgeworCQkJa3JlZl9wdXQoJnJjLT5yZWZjbnQsIHJlYWRhX2NvbnRyb2xfcmVsZWFzZSk7CisJCQl3YWtlX3VwKCZyYy0+d2FpdCk7CisJCX0KKwkJa3JlZl9wdXQoJnJjLT5yZWZjbnQsIHJlYWRhX2NvbnRyb2xfcmVsZWFzZSk7CisKKwkJcmVhZGFfZXh0ZW50X3B1dChmc19pbmZvLCByZSk7CS8qIG9uZSByZWYgZm9yIGVhY2ggZW50cnkgKi8KKwl9CisJcmVhZGFfZXh0ZW50X3B1dChmc19pbmZvLCByZSk7CS8qIG91ciByZWYgKi8KKwlpZiAoZm9yX2RldikKKwkJYXRvbWljX2RlYygmZm9yX2Rldi0+cmVhZGFfaW5fZmxpZ2h0KTsKKworCXJldHVybiAwOworfQorCisvKgorICogc3RhcnQgaXMgcGFzc2VkIHNlcGFyYXRlbHkgaW4gY2FzZSBlYiBpbiBOVUxMLCB3aGljaCBtYXkgYmUgdGhlIGNhc2Ugd2l0aAorICogZmFpbGVkIEkvTworICovCitpbnQgYnRyZWVfcmVhZGFoZWFkX2hvb2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCSB1NjQgc3RhcnQsIGludCBlcnIpCit7CisJaW50IHJldDsKKworCXJldCA9IF9fcmVhZGFoZWFkX2hvb2socm9vdCwgZWIsIHN0YXJ0LCBlcnIpOworCisJcmVhZGFfc3RhcnRfbWFjaGluZShyb290LT5mc19pbmZvKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVhZGFfem9uZSAqcmVhZGFfZmluZF96b25lKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCQkgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldiwgdTY0IGxvZ2ljYWwsCisJCQkJCSAgc3RydWN0IGJ0cmZzX2JpbyAqYmJpbykKK3sKKwlpbnQgcmV0OworCWludCBsb29wZWQgPSAwOworCXN0cnVjdCByZWFkYV96b25lICp6b25lOworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUgPSBOVUxMOworCXU2NCBzdGFydDsKKwl1NjQgZW5kOworCWludCBpOworCithZ2FpbjoKKwl6b25lID0gTlVMTDsKKwlzcGluX2xvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCXJldCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJmRldi0+cmVhZGFfem9uZXMsICh2b2lkICoqKSZ6b25lLAorCQkJCSAgICAgbG9naWNhbCA+PiBQQUdFX0NBQ0hFX1NISUZULCAxKTsKKwlpZiAocmV0ID09IDEpCisJCWtyZWZfZ2V0KCZ6b25lLT5yZWZjbnQpOworCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKworCWlmIChyZXQgPT0gMSkgeworCQlpZiAobG9naWNhbCA+PSB6b25lLT5zdGFydCAmJiBsb2dpY2FsIDwgem9uZS0+ZW5kKQorCQkJcmV0dXJuIHpvbmU7CisJCXNwaW5fbG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisJCWtyZWZfcHV0KCZ6b25lLT5yZWZjbnQsIHJlYWRhX3pvbmVfcmVsZWFzZSk7CisJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwl9CisKKwlpZiAobG9vcGVkKQorCQlyZXR1cm4gTlVMTDsKKworCWNhY2hlID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKGZzX2luZm8sIGxvZ2ljYWwpOworCWlmICghY2FjaGUpCisJCXJldHVybiBOVUxMOworCisJc3RhcnQgPSBjYWNoZS0+a2V5Lm9iamVjdGlkOworCWVuZCA9IHN0YXJ0ICsgY2FjaGUtPmtleS5vZmZzZXQgLSAxOworCWJ0cmZzX3B1dF9ibG9ja19ncm91cChjYWNoZSk7CisKKwl6b25lID0ga3phbGxvYyhzaXplb2YoKnpvbmUpLCBHRlBfTk9GUyk7CisJaWYgKCF6b25lKQorCQlyZXR1cm4gTlVMTDsKKworCXpvbmUtPnN0YXJ0ID0gc3RhcnQ7CisJem9uZS0+ZW5kID0gZW5kOworCUlOSVRfTElTVF9IRUFEKCZ6b25lLT5saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmem9uZS0+bG9jayk7CisJem9uZS0+bG9ja2VkID0gMDsKKwlrcmVmX2luaXQoJnpvbmUtPnJlZmNudCk7CisJem9uZS0+ZWxlbXMgPSAwOworCXpvbmUtPmRldmljZSA9IGRldjsgLyogb3VyIGRldmljZSBhbHdheXMgc2l0cyBhdCBpbmRleCAwICovCisJZm9yIChpID0gMDsgaSA8IGJiaW8tPm51bV9zdHJpcGVzOyArK2kpIHsKKwkJLyogYm91bmRzIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQgKi8KKwkJem9uZS0+ZGV2c1tpXSA9IGJiaW8tPnN0cmlwZXNbaV0uZGV2OworCX0KKwl6b25lLT5uZGV2cyA9IGJiaW8tPm51bV9zdHJpcGVzOworCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlyZXQgPSByYWRpeF90cmVlX2luc2VydCgmZGV2LT5yZWFkYV96b25lcywKKwkJCQkodW5zaWduZWQgbG9uZyl6b25lLT5lbmQgPj4gUEFHRV9DQUNIRV9TSElGVCwKKwkJCQl6b25lKTsKKwlzcGluX3VubG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisKKwlpZiAocmV0KSB7CisJCWtmcmVlKHpvbmUpOworCQlsb29wZWQgPSAxOworCQlnb3RvIGFnYWluOworCX0KKworCXJldHVybiB6b25lOworfQorCitzdGF0aWMgc3RydWN0IHJlYWRhX2V4dGVudCAqcmVhZGFfZmluZF9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgICAgIHU2NCBsb2dpY2FsLAorCQkJCQkgICAgICBzdHJ1Y3QgYnRyZnNfa2V5ICp0b3AsIGludCBsZXZlbCkKK3sKKwlpbnQgcmV0OworCWludCBsb29wZWQgPSAwOworCXN0cnVjdCByZWFkYV9leHRlbnQgKnJlID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUgPSAmZnNfaW5mby0+bWFwcGluZ190cmVlOworCXN0cnVjdCBidHJmc19iaW8gKmJiaW8gPSBOVUxMOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldjsKKwl1MzIgYmxvY2tzaXplOworCXU2NCBsZW5ndGg7CisJaW50IG56b25lcyA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IGxvZ2ljYWwgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworYWdhaW46CisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlyZSA9IHJhZGl4X3RyZWVfbG9va3VwKCZmc19pbmZvLT5yZWFkYV90cmVlLCBpbmRleCk7CisJaWYgKHJlKQorCQlrcmVmX2dldCgmcmUtPnJlZmNudCk7CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCisJaWYgKHJlIHx8IGxvb3BlZCkKKwkJcmV0dXJuIHJlOworCisJcmUgPSBremFsbG9jKHNpemVvZigqcmUpLCBHRlBfTk9GUyk7CisJaWYgKCFyZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9ja3NpemUgPSBidHJmc19sZXZlbF9zaXplKHJvb3QsIGxldmVsKTsKKwlyZS0+bG9naWNhbCA9IGxvZ2ljYWw7CisJcmUtPmJsb2Nrc2l6ZSA9IGJsb2Nrc2l6ZTsKKwlyZS0+dG9wID0gKnRvcDsKKwlJTklUX0xJU1RfSEVBRCgmcmUtPmV4dGN0bCk7CisJc3Bpbl9sb2NrX2luaXQoJnJlLT5sb2NrKTsKKwlrcmVmX2luaXQoJnJlLT5yZWZjbnQpOworCisJLyoKKwkgKiBtYXAgYmxvY2sKKwkgKi8KKwlsZW5ndGggPSBibG9ja3NpemU7CisJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBSRVFfV1JJVEUsIGxvZ2ljYWwsICZsZW5ndGgsICZiYmlvLCAwKTsKKwlpZiAocmV0IHx8ICFiYmlvIHx8IGxlbmd0aCA8IGJsb2Nrc2l6ZSkKKwkJZ290byBlcnJvcjsKKworCWlmIChiYmlvLT5udW1fc3RyaXBlcyA+IE1BWF9NSVJST1JTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnMgcmVhZGFoZWFkOiBtb3JlIHRoYW4gJWQgY29waWVzIG5vdCAiCisJCQkJInN1cHBvcnRlZCIsIE1BWF9NSVJST1JTKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKG56b25lcyA9IDA7IG56b25lcyA8IGJiaW8tPm51bV9zdHJpcGVzOyArK256b25lcykgeworCQlzdHJ1Y3QgcmVhZGFfem9uZSAqem9uZTsKKworCQlkZXYgPSBiYmlvLT5zdHJpcGVzW256b25lc10uZGV2OworCQl6b25lID0gcmVhZGFfZmluZF96b25lKGZzX2luZm8sIGRldiwgbG9naWNhbCwgYmJpbyk7CisJCWlmICghem9uZSkKKwkJCWJyZWFrOworCisJCXJlLT56b25lc1tuem9uZXNdID0gem9uZTsKKwkJc3Bpbl9sb2NrKCZ6b25lLT5sb2NrKTsKKwkJaWYgKCF6b25lLT5lbGVtcykKKwkJCWtyZWZfZ2V0KCZ6b25lLT5yZWZjbnQpOworCQkrK3pvbmUtPmVsZW1zOworCQlzcGluX3VubG9jaygmem9uZS0+bG9jayk7CisJCXNwaW5fbG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisJCWtyZWZfcHV0KCZ6b25lLT5yZWZjbnQsIHJlYWRhX3pvbmVfcmVsZWFzZSk7CisJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwl9CisJcmUtPm56b25lcyA9IG56b25lczsKKwlpZiAobnpvbmVzID09IDApIHsKKwkJLyogbm90IGEgc2luZ2xlIHpvbmUgZm91bmQsIGVycm9yIGFuZCBvdXQgKi8KKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBpbnNlcnQgZXh0ZW50IGluIHJlYWRhX3RyZWUgKyBhbGwgcGVyLWRldmljZSB0cmVlcywgYWxsIG9yIG5vdGhpbmcgKi8KKwlzcGluX2xvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCXJldCA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZmc19pbmZvLT5yZWFkYV90cmVlLCBpbmRleCwgcmUpOworCWlmIChyZXQpIHsKKwkJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCQlpZiAocmV0ICE9IC1FTk9NRU0pIHsKKwkJCS8qIHNvbWVvbmUgaW5zZXJ0ZWQgdGhlIGV4dGVudCBpbiB0aGUgbWVhbnRpbWUgKi8KKwkJCWxvb3BlZCA9IDE7CisJCX0KKwkJZ290byBlcnJvcjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG56b25lczsgKytpKSB7CisJCWRldiA9IGJiaW8tPnN0cmlwZXNbaV0uZGV2OworCQlyZXQgPSByYWRpeF90cmVlX2luc2VydCgmZGV2LT5yZWFkYV9leHRlbnRzLCBpbmRleCwgcmUpOworCQlpZiAocmV0KSB7CisJCQl3aGlsZSAoLS1pID49IDApIHsKKwkJCQlkZXYgPSBiYmlvLT5zdHJpcGVzW2ldLmRldjsKKwkJCQlCVUdfT04oZGV2ID09IE5VTEwpOworCQkJCXJhZGl4X3RyZWVfZGVsZXRlKCZkZXYtPnJlYWRhX2V4dGVudHMsIGluZGV4KTsKKwkJCX0KKwkJCUJVR19PTihmc19pbmZvID09IE5VTEwpOworCQkJcmFkaXhfdHJlZV9kZWxldGUoJmZzX2luZm8tPnJlYWRhX3RyZWUsIGluZGV4KTsKKwkJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCisJa2ZyZWUoYmJpbyk7CisJcmV0dXJuIHJlOworCitlcnJvcjoKKwl3aGlsZSAobnpvbmVzKSB7CisJCXN0cnVjdCByZWFkYV96b25lICp6b25lOworCisJCS0tbnpvbmVzOworCQl6b25lID0gcmUtPnpvbmVzW256b25lc107CisJCWtyZWZfZ2V0KCZ6b25lLT5yZWZjbnQpOworCQlzcGluX2xvY2soJnpvbmUtPmxvY2spOworCQktLXpvbmUtPmVsZW1zOworCQlpZiAoem9uZS0+ZWxlbXMgPT0gMCkgeworCQkJLyoKKwkJCSAqIG5vIGZzX2luZm8tPnJlYWRhX2xvY2sgbmVlZGVkLCBhcyB0aGlzIGNhbid0IGJlCisJCQkgKiB0aGUgbGFzdCByZWYKKwkJCSAqLworCQkJa3JlZl9wdXQoJnpvbmUtPnJlZmNudCwgcmVhZGFfem9uZV9yZWxlYXNlKTsKKwkJfQorCQlzcGluX3VubG9jaygmem9uZS0+bG9jayk7CisKKwkJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwkJa3JlZl9wdXQoJnpvbmUtPnJlZmNudCwgcmVhZGFfem9uZV9yZWxlYXNlKTsKKwkJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCX0KKwlrZnJlZShiYmlvKTsKKwlrZnJlZShyZSk7CisJaWYgKGxvb3BlZCkKKwkJZ290byBhZ2FpbjsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVhZGFfa3JlZl9kdW1teShzdHJ1Y3Qga3JlZiAqa3IpCit7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRhX2V4dGVudF9wdXQoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkgICAgIHN0cnVjdCByZWFkYV9leHRlbnQgKnJlKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSByZS0+bG9naWNhbCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlpZiAoIWtyZWZfcHV0KCZyZS0+cmVmY250LCByZWFkYV9rcmVmX2R1bW15KSkgeworCQlzcGluX3VubG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlyYWRpeF90cmVlX2RlbGV0ZSgmZnNfaW5mby0+cmVhZGFfdHJlZSwgaW5kZXgpOworCWZvciAoaSA9IDA7IGkgPCByZS0+bnpvbmVzOyArK2kpIHsKKwkJc3RydWN0IHJlYWRhX3pvbmUgKnpvbmUgPSByZS0+em9uZXNbaV07CisKKwkJcmFkaXhfdHJlZV9kZWxldGUoJnpvbmUtPmRldmljZS0+cmVhZGFfZXh0ZW50cywgaW5kZXgpOworCX0KKworCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCByZS0+bnpvbmVzOyArK2kpIHsKKwkJc3RydWN0IHJlYWRhX3pvbmUgKnpvbmUgPSByZS0+em9uZXNbaV07CisKKwkJa3JlZl9nZXQoJnpvbmUtPnJlZmNudCk7CisJCXNwaW5fbG9jaygmem9uZS0+bG9jayk7CisJCS0tem9uZS0+ZWxlbXM7CisJCWlmICh6b25lLT5lbGVtcyA9PSAwKSB7CisJCQkvKiBubyBmc19pbmZvLT5yZWFkYV9sb2NrIG5lZWRlZCwgYXMgdGhpcyBjYW4ndCBiZQorCQkJICogdGhlIGxhc3QgcmVmICovCisJCQlrcmVmX3B1dCgmem9uZS0+cmVmY250LCByZWFkYV96b25lX3JlbGVhc2UpOworCQl9CisJCXNwaW5fdW5sb2NrKCZ6b25lLT5sb2NrKTsKKworCQlzcGluX2xvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCQlrcmVmX3B1dCgmem9uZS0+cmVmY250LCByZWFkYV96b25lX3JlbGVhc2UpOworCQlzcGluX3VubG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisJfQorCWlmIChyZS0+c2NoZWR1bGVkX2ZvcikKKwkJYXRvbWljX2RlYygmcmUtPnNjaGVkdWxlZF9mb3ItPnJlYWRhX2luX2ZsaWdodCk7CisKKwlrZnJlZShyZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRhX3pvbmVfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgcmVhZGFfem9uZSAqem9uZSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcmVhZGFfem9uZSwgcmVmY250KTsKKworCXJhZGl4X3RyZWVfZGVsZXRlKCZ6b25lLT5kZXZpY2UtPnJlYWRhX3pvbmVzLAorCQkJICB6b25lLT5lbmQgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisKKwlrZnJlZSh6b25lKTsKK30KKworc3RhdGljIHZvaWQgcmVhZGFfY29udHJvbF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCByZWFkYV9jb250cm9sICpyYyA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcmVhZGFfY29udHJvbCwKKwkJCQkJCXJlZmNudCk7CisKKwlrZnJlZShyYyk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZGFfYWRkX2Jsb2NrKHN0cnVjdCByZWFkYV9jb250cm9sICpyYywgdTY0IGxvZ2ljYWwsCisJCQkgICBzdHJ1Y3QgYnRyZnNfa2V5ICp0b3AsIGludCBsZXZlbCwgdTY0IGdlbmVyYXRpb24pCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSByYy0+cm9vdDsKKwlzdHJ1Y3QgcmVhZGFfZXh0ZW50ICpyZTsKKwlzdHJ1Y3QgcmVhZGFfZXh0Y3RsICpyZWM7CisKKwlyZSA9IHJlYWRhX2ZpbmRfZXh0ZW50KHJvb3QsIGxvZ2ljYWwsIHRvcCwgbGV2ZWwpOyAvKiB0YWtlcyBvbmUgcmVmICovCisJaWYgKCFyZSkKKwkJcmV0dXJuIC0xOworCisJcmVjID0ga3phbGxvYyhzaXplb2YoKnJlYyksIEdGUF9OT0ZTKTsKKwlpZiAoIXJlYykgeworCQlyZWFkYV9leHRlbnRfcHV0KHJvb3QtPmZzX2luZm8sIHJlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlYy0+cmMgPSByYzsKKwlyZWMtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworCWF0b21pY19pbmMoJnJjLT5lbGVtcyk7CisKKwlzcGluX2xvY2soJnJlLT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZyZWMtPmxpc3QsICZyZS0+ZXh0Y3RsKTsKKwlzcGluX3VubG9jaygmcmUtPmxvY2spOworCisJLyogbGVhdmUgdGhlIHJlZiBvbiB0aGUgZXh0ZW50ICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNhbGxlZCB3aXRoIGZzX2luZm8tPnJlYWRhX2xvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCByZWFkYV9wZWVyX3pvbmVzX3NldF9sb2NrKHN0cnVjdCByZWFkYV96b25lICp6b25lLCBpbnQgbG9jaykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gem9uZS0+ZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgem9uZS0+bmRldnM7ICsraSkgeworCQlzdHJ1Y3QgcmVhZGFfem9uZSAqcGVlcjsKKwkJcGVlciA9IHJhZGl4X3RyZWVfbG9va3VwKCZ6b25lLT5kZXZzW2ldLT5yZWFkYV96b25lcywgaW5kZXgpOworCQlpZiAocGVlciAmJiBwZWVyLT5kZXZpY2UgIT0gem9uZS0+ZGV2aWNlKQorCQkJcGVlci0+bG9ja2VkID0gbG9jazsKKwl9Cit9CisKKy8qCisgKiBjYWxsZWQgd2l0aCBmc19pbmZvLT5yZWFkYV9sb2NrIGhlbGQKKyAqLworc3RhdGljIGludCByZWFkYV9waWNrX3pvbmUoc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCByZWFkYV96b25lICp0b3Bfem9uZSA9IE5VTEw7CisJc3RydWN0IHJlYWRhX3pvbmUgKnRvcF9sb2NrZWRfem9uZSA9IE5VTEw7CisJdTY0IHRvcF9lbGVtcyA9IDA7CisJdTY0IHRvcF9sb2NrZWRfZWxlbXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSAwOworCWludCByZXQ7CisKKwlpZiAoZGV2LT5yZWFkYV9jdXJyX3pvbmUpIHsKKwkJcmVhZGFfcGVlcl96b25lc19zZXRfbG9jayhkZXYtPnJlYWRhX2N1cnJfem9uZSwgMCk7CisJCWtyZWZfcHV0KCZkZXYtPnJlYWRhX2N1cnJfem9uZS0+cmVmY250LCByZWFkYV96b25lX3JlbGVhc2UpOworCQlkZXYtPnJlYWRhX2N1cnJfem9uZSA9IE5VTEw7CisJfQorCS8qIHBpY2sgdGhlIHpvbmUgd2l0aCB0aGUgbW9zdCBlbGVtZW50cyAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCByZWFkYV96b25lICp6b25lOworCisJCXJldCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJmRldi0+cmVhZGFfem9uZXMsCisJCQkJCSAgICAgKHZvaWQgKiopJnpvbmUsIGluZGV4LCAxKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJYnJlYWs7CisJCWluZGV4ID0gKHpvbmUtPmVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUKSArIDE7CisJCWlmICh6b25lLT5sb2NrZWQpIHsKKwkJCWlmICh6b25lLT5lbGVtcyA+IHRvcF9sb2NrZWRfZWxlbXMpIHsKKwkJCQl0b3BfbG9ja2VkX2VsZW1zID0gem9uZS0+ZWxlbXM7CisJCQkJdG9wX2xvY2tlZF96b25lID0gem9uZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh6b25lLT5lbGVtcyA+IHRvcF9lbGVtcykgeworCQkJCXRvcF9lbGVtcyA9IHpvbmUtPmVsZW1zOworCQkJCXRvcF96b25lID0gem9uZTsKKwkJCX0KKwkJfQorCX0KKwlpZiAodG9wX3pvbmUpCisJCWRldi0+cmVhZGFfY3Vycl96b25lID0gdG9wX3pvbmU7CisJZWxzZSBpZiAodG9wX2xvY2tlZF96b25lKQorCQlkZXYtPnJlYWRhX2N1cnJfem9uZSA9IHRvcF9sb2NrZWRfem9uZTsKKwllbHNlCisJCXJldHVybiAwOworCisJZGV2LT5yZWFkYV9uZXh0ID0gZGV2LT5yZWFkYV9jdXJyX3pvbmUtPnN0YXJ0OworCWtyZWZfZ2V0KCZkZXYtPnJlYWRhX2N1cnJfem9uZS0+cmVmY250KTsKKwlyZWFkYV9wZWVyX3pvbmVzX3NldF9sb2NrKGRldi0+cmVhZGFfY3Vycl96b25lLCAxKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlYWRhX3N0YXJ0X21hY2hpbmVfZGV2KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCSAgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmVhZGFfZXh0ZW50ICpyZSA9IE5VTEw7CisJaW50IG1pcnJvcl9udW0gPSAwOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYiA9IE5VTEw7CisJdTY0IGxvZ2ljYWw7CisJdTMyIGJsb2Nrc2l6ZTsKKwlpbnQgcmV0OworCWludCBpOworCWludCBuZWVkX2tpY2sgPSAwOworCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlpZiAoZGV2LT5yZWFkYV9jdXJyX3pvbmUgPT0gTlVMTCkgeworCQlyZXQgPSByZWFkYV9waWNrX3pvbmUoZGV2KTsKKwkJaWYgKCFyZXQpIHsKKwkJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qCisJICogRklYTUUgY3VycmVudGx5IHdlIGlzc3VlIHRoZSByZWFkcyBvbmUgZXh0ZW50IGF0IGEgdGltZS4gSWYgd2UgaGF2ZQorCSAqIGEgY29udGlndW91cyBibG9jayBvZiBleHRlbnRzLCB3ZSBjb3VsZCBhbHNvIGNvYWd1bGF0ZSB0aGVtIG9yIHVzZQorCSAqIHBsdWdnaW5nIHRvIHNwZWVkIHRoaW5ncyB1cAorCSAqLworCXJldCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJmRldi0+cmVhZGFfZXh0ZW50cywgKHZvaWQgKiopJnJlLAorCQkJCSAgICAgZGV2LT5yZWFkYV9uZXh0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsIDEpOworCWlmIChyZXQgPT0gMCB8fCByZS0+bG9naWNhbCA+PSBkZXYtPnJlYWRhX2N1cnJfem9uZS0+ZW5kKSB7CisJCXJldCA9IHJlYWRhX3BpY2tfem9uZShkZXYpOworCQlpZiAoIXJldCkgeworCQkJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmUgPSBOVUxMOworCQlyZXQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZkZXYtPnJlYWRhX2V4dGVudHMsICh2b2lkICoqKSZyZSwKKwkJCQkJZGV2LT5yZWFkYV9uZXh0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsIDEpOworCX0KKwlpZiAocmV0ID09IDApIHsKKwkJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJZGV2LT5yZWFkYV9uZXh0ID0gcmUtPmxvZ2ljYWwgKyByZS0+YmxvY2tzaXplOworCWtyZWZfZ2V0KCZyZS0+cmVmY250KTsKKworCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKworCS8qCisJICogZmluZCBtaXJyb3IgbnVtCisJICovCisJZm9yIChpID0gMDsgaSA8IHJlLT5uem9uZXM7ICsraSkgeworCQlpZiAocmUtPnpvbmVzW2ldLT5kZXZpY2UgPT0gZGV2KSB7CisJCQltaXJyb3JfbnVtID0gaSArIDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlsb2dpY2FsID0gcmUtPmxvZ2ljYWw7CisJYmxvY2tzaXplID0gcmUtPmJsb2Nrc2l6ZTsKKworCXNwaW5fbG9jaygmcmUtPmxvY2spOworCWlmIChyZS0+c2NoZWR1bGVkX2ZvciA9PSBOVUxMKSB7CisJCXJlLT5zY2hlZHVsZWRfZm9yID0gZGV2OworCQluZWVkX2tpY2sgPSAxOworCX0KKwlzcGluX3VubG9jaygmcmUtPmxvY2spOworCisJcmVhZGFfZXh0ZW50X3B1dChmc19pbmZvLCByZSk7CisKKwlpZiAoIW5lZWRfa2ljaykKKwkJcmV0dXJuIDA7CisKKwlhdG9taWNfaW5jKCZkZXYtPnJlYWRhX2luX2ZsaWdodCk7CisJcmV0ID0gcmVhZGFfdHJlZV9ibG9ja19mbGFnZ2VkKGZzX2luZm8tPmV4dGVudF9yb290LCBsb2dpY2FsLCBibG9ja3NpemUsCisJCQkgbWlycm9yX251bSwgJmViKTsKKwlpZiAocmV0KQorCQlfX3JlYWRhaGVhZF9ob29rKGZzX2luZm8tPmV4dGVudF9yb290LCBOVUxMLCBsb2dpY2FsLCByZXQpOworCWVsc2UgaWYgKGViKQorCQlfX3JlYWRhaGVhZF9ob29rKGZzX2luZm8tPmV4dGVudF9yb290LCBlYiwgZWItPnN0YXJ0LCByZXQpOworCisJaWYgKGViKQorCQlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworCisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIHZvaWQgcmVhZGFfc3RhcnRfbWFjaGluZV93b3JrZXIoc3RydWN0IGJ0cmZzX3dvcmsgKndvcmspCit7CisJc3RydWN0IHJlYWRhX21hY2hpbmVfd29yayAqcm13OworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvOworCisJcm13ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByZWFkYV9tYWNoaW5lX3dvcmssIHdvcmspOworCWZzX2luZm8gPSBybXctPmZzX2luZm87CisKKwlrZnJlZShybXcpOworCisJX19yZWFkYV9zdGFydF9tYWNoaW5lKGZzX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBfX3JlYWRhX3N0YXJ0X21hY2hpbmUoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gZnNfaW5mby0+ZnNfZGV2aWNlczsKKwl1NjQgZW5xdWV1ZWQ7CisJdTY0IHRvdGFsID0gMDsKKwlpbnQgaTsKKworCWRvIHsKKwkJZW5xdWV1ZWQgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmZzX2RldmljZXMtPmRldmljZXMsIGRldl9saXN0KSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmRldmljZS0+cmVhZGFfaW5fZmxpZ2h0KSA8CisJCQkgICAgTUFYX0lOX0ZMSUdIVCkKKwkJCQllbnF1ZXVlZCArPSByZWFkYV9zdGFydF9tYWNoaW5lX2Rldihmc19pbmZvLAorCQkJCQkJCQkgICAgZGV2aWNlKTsKKwkJfQorCQl0b3RhbCArPSBlbnF1ZXVlZDsKKwl9IHdoaWxlIChlbnF1ZXVlZCAmJiB0b3RhbCA8IDEwMDAwKTsKKworCWlmIChlbnF1ZXVlZCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBpbiB0aGUgY2FjaGUsIHRoaXMgaXMgZWZmZWN0aXZlbHkgc2luZ2xlCisJICogdGhyZWFkZWQuIFRvIGEpIG5vdCBob2xkIHRoZSBjYWxsZXIgZm9yIHRvbyBsb25nIGFuZCBiKSB0byB1dGlsaXplCisJICogbW9yZSBjb3Jlcywgd2UgYnJva2UgdGhlIGxvb3AgYWJvdmUgYWZ0ZXIgMTAwMDAgaXRlcmF0aW9ucyBhbmQgbm93CisJICogZW5xdWV1ZSB0byB3b3JrZXJzIHRvIGZpbmlzaCBpdC4gVGhpcyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGxvYWQgdG8KKwkgKiB0aGUgY29yZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDI7ICsraSkKKwkJcmVhZGFfc3RhcnRfbWFjaGluZShmc19pbmZvKTsKK30KKworc3RhdGljIHZvaWQgcmVhZGFfc3RhcnRfbWFjaGluZShzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbykKK3sKKwlzdHJ1Y3QgcmVhZGFfbWFjaGluZV93b3JrICpybXc7CisKKwlybXcgPSBremFsbG9jKHNpemVvZigqcm13KSwgR0ZQX05PRlMpOworCWlmICghcm13KSB7CisJCS8qIEZJWE1FIHdlIGNhbm5vdCBoYW5kbGUgdGhpcyBwcm9wZXJseSByaWdodCBub3cgKi8KKwkJQlVHKCk7CisJfQorCXJtdy0+d29yay5mdW5jID0gcmVhZGFfc3RhcnRfbWFjaGluZV93b3JrZXI7CisJcm13LT5mc19pbmZvID0gZnNfaW5mbzsKKworCWJ0cmZzX3F1ZXVlX3dvcmtlcigmZnNfaW5mby0+cmVhZGFoZWFkX3dvcmtlcnMsICZybXctPndvcmspOworfQorCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIGR1bXBfZGV2cyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywgaW50IGFsbCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMgPSBmc19pbmZvLT5mc19kZXZpY2VzOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJaW50IHJldDsKKwlpbnQgaTsKKwlpbnQgajsKKwlpbnQgY250OworCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmZzX2RldmljZXMtPmRldmljZXMsIGRldl9saXN0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJkZXYgJWxsZCBoYXMgJWQgaW4gZmxpZ2h0XG4iLCBkZXZpY2UtPmRldmlkLAorCQkJYXRvbWljX3JlYWQoJmRldmljZS0+cmVhZGFfaW5fZmxpZ2h0KSk7CisJCWluZGV4ID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCXN0cnVjdCByZWFkYV96b25lICp6b25lOworCQkJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmZGV2aWNlLT5yZWFkYV96b25lcywKKwkJCQkJCSAgICAgKHZvaWQgKiopJnpvbmUsIGluZGV4LCAxKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlicmVhazsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIHpvbmUgJWxsdS0lbGx1IGVsZW1zICVsbHUgbG9ja2VkICIKKwkJCQkiJWQgZGV2cyIsIHpvbmUtPnN0YXJ0LCB6b25lLT5lbmQsIHpvbmUtPmVsZW1zLAorCQkJCXpvbmUtPmxvY2tlZCk7CisJCQlmb3IgKGogPSAwOyBqIDwgem9uZS0+bmRldnM7ICsraikgeworCQkJCXByaW50ayhLRVJOX0NPTlQgIiAlbGxkIiwKKwkJCQkJem9uZS0+ZGV2c1tqXS0+ZGV2aWQpOworCQkJfQorCQkJaWYgKGRldmljZS0+cmVhZGFfY3Vycl96b25lID09IHpvbmUpCisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiIGN1cnIgb2ZmICVsbHUiLAorCQkJCQlkZXZpY2UtPnJlYWRhX25leHQgLSB6b25lLT5zdGFydCk7CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQkJaW5kZXggPSAoem9uZS0+ZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgMTsKKwkJfQorCQljbnQgPSAwOworCQlpbmRleCA9IDA7CisJCXdoaWxlIChhbGwpIHsKKwkJCXN0cnVjdCByZWFkYV9leHRlbnQgKnJlID0gTlVMTDsKKworCQkJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmZGV2aWNlLT5yZWFkYV9leHRlbnRzLAorCQkJCQkJICAgICAodm9pZCAqKikmcmUsIGluZGV4LCAxKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlicmVhazsKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIiAgcmU6IGxvZ2ljYWwgJWxsdSBzaXplICV1IGVtcHR5ICVkIGZvciAlbGxkIiwKKwkJCQlyZS0+bG9naWNhbCwgcmUtPmJsb2Nrc2l6ZSwKKwkJCQlsaXN0X2VtcHR5KCZyZS0+ZXh0Y3RsKSwgcmUtPnNjaGVkdWxlZF9mb3IgPworCQkJCXJlLT5zY2hlZHVsZWRfZm9yLT5kZXZpZCA6IC0xKTsKKworCQkJZm9yIChpID0gMDsgaSA8IHJlLT5uem9uZXM7ICsraSkgeworCQkJCXByaW50ayhLRVJOX0NPTlQgIiB6b25lICVsbHUtJWxsdSBkZXZzIiwKKwkJCQkJcmUtPnpvbmVzW2ldLT5zdGFydCwKKwkJCQkJcmUtPnpvbmVzW2ldLT5lbmQpOworCQkJCWZvciAoaiA9IDA7IGogPCByZS0+em9uZXNbaV0tPm5kZXZzOyArK2opIHsKKwkJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICVsbGQiLAorCQkJCQkJcmUtPnpvbmVzW2ldLT5kZXZzW2pdLT5kZXZpZCk7CisJCQkJfQorCQkJfQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJCWluZGV4ID0gKHJlLT5sb2dpY2FsID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgMTsKKwkJCWlmICgrK2NudCA+IDE1KQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaW5kZXggPSAwOworCWNudCA9IDA7CisJd2hpbGUgKGFsbCkgeworCQlzdHJ1Y3QgcmVhZGFfZXh0ZW50ICpyZSA9IE5VTEw7CisKKwkJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmZnNfaW5mby0+cmVhZGFfdHJlZSwgKHZvaWQgKiopJnJlLAorCQkJCQkgICAgIGluZGV4LCAxKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJYnJlYWs7CisJCWlmICghcmUtPnNjaGVkdWxlZF9mb3IpIHsKKwkJCWluZGV4ID0gKHJlLT5sb2dpY2FsID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50ayhLRVJOX0RFQlVHCisJCQkicmU6IGxvZ2ljYWwgJWxsdSBzaXplICV1IGxpc3QgZW1wdHkgJWQgZm9yICVsbGQiLAorCQkJcmUtPmxvZ2ljYWwsIHJlLT5ibG9ja3NpemUsIGxpc3RfZW1wdHkoJnJlLT5leHRjdGwpLAorCQkJcmUtPnNjaGVkdWxlZF9mb3IgPyByZS0+c2NoZWR1bGVkX2Zvci0+ZGV2aWQgOiAtMSk7CisJCWZvciAoaSA9IDA7IGkgPCByZS0+bnpvbmVzOyArK2kpIHsKKwkJCXByaW50ayhLRVJOX0NPTlQgIiB6b25lICVsbHUtJWxsdSBkZXZzIiwKKwkJCQlyZS0+em9uZXNbaV0tPnN0YXJ0LAorCQkJCXJlLT56b25lc1tpXS0+ZW5kKTsKKwkJCWZvciAoaSA9IDA7IGkgPCByZS0+bnpvbmVzOyArK2kpIHsKKwkJCQlwcmludGsoS0VSTl9DT05UICIgem9uZSAlbGx1LSVsbHUgZGV2cyIsCisJCQkJCXJlLT56b25lc1tpXS0+c3RhcnQsCisJCQkJCXJlLT56b25lc1tpXS0+ZW5kKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgcmUtPnpvbmVzW2ldLT5uZGV2czsgKytqKSB7CisJCQkJCXByaW50ayhLRVJOX0NPTlQgIiAlbGxkIiwKKwkJCQkJCXJlLT56b25lc1tpXS0+ZGV2c1tqXS0+ZGV2aWQpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQlpbmRleCA9IChyZS0+bG9naWNhbCA+PiBQQUdFX0NBQ0hFX1NISUZUKSArIDE7CisJfQorCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKK30KKyNlbmRpZgorCisvKgorICogaW50ZXJmYWNlCisgKi8KK3N0cnVjdCByZWFkYV9jb250cm9sICpidHJmc19yZWFkYV9hZGQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQlzdHJ1Y3QgYnRyZnNfa2V5ICprZXlfc3RhcnQsIHN0cnVjdCBidHJmc19rZXkgKmtleV9lbmQpCit7CisJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjOworCXU2NCBzdGFydDsKKwl1NjQgZ2VuZXJhdGlvbjsKKwlpbnQgbGV2ZWw7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGU7CisJc3RhdGljIHN0cnVjdCBidHJmc19rZXkgbWF4X2tleSA9IHsKKwkJLm9iamVjdGlkID0gKHU2NCktMSwKKwkJLnR5cGUgPSAodTgpLTEsCisJCS5vZmZzZXQgPSAodTY0KS0xCisJfTsKKworCXJjID0ga3phbGxvYyhzaXplb2YoKnJjKSwgR0ZQX05PRlMpOworCWlmICghcmMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmMtPnJvb3QgPSByb290OworCXJjLT5rZXlfc3RhcnQgPSAqa2V5X3N0YXJ0OworCXJjLT5rZXlfZW5kID0gKmtleV9lbmQ7CisJYXRvbWljX3NldCgmcmMtPmVsZW1zLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyYy0+d2FpdCk7CisJa3JlZl9pbml0KCZyYy0+cmVmY250KTsKKwlrcmVmX2dldCgmcmMtPnJlZmNudCk7IC8qIG9uZSByZWYgZm9yIGhhdmluZyBlbGVtZW50cyAqLworCisJbm9kZSA9IGJ0cmZzX3Jvb3Rfbm9kZShyb290KTsKKwlzdGFydCA9IG5vZGUtPnN0YXJ0OworCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKG5vZGUpOworCWdlbmVyYXRpb24gPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihub2RlKTsKKwlmcmVlX2V4dGVudF9idWZmZXIobm9kZSk7CisKKwlyZWFkYV9hZGRfYmxvY2socmMsIHN0YXJ0LCAmbWF4X2tleSwgbGV2ZWwsIGdlbmVyYXRpb24pOworCisJcmVhZGFfc3RhcnRfbWFjaGluZShyb290LT5mc19pbmZvKTsKKworCXJldHVybiByYzsKK30KKworI2lmZGVmIERFQlVHCitpbnQgYnRyZnNfcmVhZGFfd2FpdCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjID0gaGFuZGxlOworCisJd2hpbGUgKGF0b21pY19yZWFkKCZyYy0+ZWxlbXMpKSB7CisJCXdhaXRfZXZlbnRfdGltZW91dChyYy0+d2FpdCwgYXRvbWljX3JlYWQoJnJjLT5lbGVtcykgPT0gMCwKKwkJCQkgICA1ICogSFopOworCQlkdW1wX2RldnMocmMtPnJvb3QtPmZzX2luZm8sIHJjLT5lbGVtcyA8IDEwID8gMSA6IDApOworCX0KKworCWR1bXBfZGV2cyhyYy0+cm9vdC0+ZnNfaW5mbywgcmMtPmVsZW1zIDwgMTAgPyAxIDogMCk7CisKKwlrcmVmX3B1dCgmcmMtPnJlZmNudCwgcmVhZGFfY29udHJvbF9yZWxlYXNlKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKK2ludCBidHJmc19yZWFkYV93YWl0KHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcmVhZGFfY29udHJvbCAqcmMgPSBoYW5kbGU7CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJnJjLT5lbGVtcykpIHsKKwkJd2FpdF9ldmVudChyYy0+d2FpdCwgYXRvbWljX3JlYWQoJnJjLT5lbGVtcykgPT0gMCk7CisJfQorCisJa3JlZl9wdXQoJnJjLT5yZWZjbnQsIHJlYWRhX2NvbnRyb2xfcmVsZWFzZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCit2b2lkIGJ0cmZzX3JlYWRhX2RldGFjaCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjID0gaGFuZGxlOworCisJa3JlZl9wdXQoJnJjLT5yZWZjbnQsIHJlYWRhX2NvbnRyb2xfcmVsZWFzZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9yZWxvY2F0aW9uLmMgYi9mcy9idHJmcy9yZWxvY2F0aW9uLmMKaW5kZXggNTliYjE3Ni4uZGZmMjlkNSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCisrKyBiL2ZzL2J0cmZzL3JlbG9jYXRpb24uYwpAQCAtMTE3NCw2ICsxMTc0LDggQEAKIAkJCWxpc3RfYWRkX3RhaWwoJm5ld19lZGdlLT5saXN0W1VQUEVSXSwKIAkJCQkgICAgICAmbmV3X25vZGUtPmxvd2VyKTsKIAkJfQorCX0gZWxzZSB7CisJCWxpc3RfYWRkX3RhaWwoJm5ld19ub2RlLT5sb3dlciwgJmNhY2hlLT5sZWF2ZXMpOwogCX0KIAogCXJiX25vZGUgPSB0cmVlX2luc2VydCgmY2FjaGUtPnJiX3Jvb3QsIG5ld19ub2RlLT5ieXRlbnIsCkBAIC0yMDQxLDggKzIwNDMsNyBAQAogCQlCVUdfT04oSVNfRVJSKHRyYW5zKSk7CiAJCXRyYW5zLT5ibG9ja19yc3YgPSByYy0+YmxvY2tfcnN2OwogCi0JCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9jaGVjayh0cmFucywgcm9vdCwgcmMtPmJsb2NrX3JzdiwKLQkJCQkJICAgIG1pbl9yZXNlcnZlZCwgMCk7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9yZWZpbGwocm9vdCwgcmMtPmJsb2NrX3JzdiwgbWluX3Jlc2VydmVkKTsKIAkJaWYgKHJldCkgewogCQkJQlVHX09OKHJldCAhPSAtRUFHQUlOKTsKIAkJCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CkBAIC0yMTUyLDggKzIxNTMsNyBAQAogYWdhaW46CiAJaWYgKCFlcnIpIHsKIAkJbnVtX2J5dGVzID0gcmMtPm1lcmdpbmdfcnN2X3NpemU7Ci0JCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQoTlVMTCwgcm9vdCwgcmMtPmJsb2NrX3JzdiwKLQkJCQkJICBudW1fYnl0ZXMpOworCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfYWRkKHJvb3QsIHJjLT5ibG9ja19yc3YsIG51bV9ieXRlcyk7CiAJCWlmIChyZXQpCiAJCQllcnIgPSByZXQ7CiAJfQpAQCAtMjQyNyw3ICsyNDI3LDcgQEAKIAludW1fYnl0ZXMgPSBjYWxjdV9tZXRhZGF0YV9zaXplKHJjLCBub2RlLCAxKSAqIDI7CiAKIAl0cmFucy0+YmxvY2tfcnN2ID0gcmMtPmJsb2NrX3JzdjsKLQlyZXQgPSBidHJmc19ibG9ja19yc3ZfYWRkKHRyYW5zLCByb290LCByYy0+YmxvY2tfcnN2LCBudW1fYnl0ZXMpOworCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQocm9vdCwgcmMtPmJsb2NrX3JzdiwgbnVtX2J5dGVzKTsKIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJCXJjLT5jb21taXRfdHJhbnNhY3Rpb24gPSAxOwpAQCAtMjkyMiw2ICsyOTIyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IGZpbGVfcmFfc3RhdGUgKnJhOworCWdmcF90IG1hc2sgPSBidHJmc19hbGxvY193cml0ZV9tYXNrKGlub2RlLT5pX21hcHBpbmcpOwogCWludCBuciA9IDA7CiAJaW50IHJldCA9IDA7CiAKQEAgLTI5NTYsNyArMjk1Nyw3IEBACiAJCQkJCQkgIHJhLCBOVUxMLCBpbmRleCwKIAkJCQkJCSAgbGFzdF9pbmRleCArIDEgLSBpbmRleCk7CiAJCQlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCwKLQkJCQkJCSAgIEdGUF9OT0ZTKTsKKwkJCQkJCSAgIG1hc2spOwogCQkJaWYgKCFwYWdlKSB7CiAJCQkJYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9tZXRhZGF0YShpbm9kZSwKIAkJCQkJCQlQQUdFX0NBQ0hFX1NJWkUpOwpAQCAtMzMyMyw4ICszMzI0LDExIEBACiAJfQogCiAJa2V5Lm9iamVjdGlkID0gcmVmX29iamVjdGlkOwotCWtleS5vZmZzZXQgPSByZWZfb2Zmc2V0OwogCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0RBVEFfS0VZOworCWlmIChyZWZfb2Zmc2V0ID4gKCh1NjQpLTEgPDwgMzIpKQorCQlrZXkub2Zmc2V0ID0gMDsKKwllbHNlCisJCWtleS5vZmZzZXQgPSByZWZfb2Zmc2V0OwogCiAJcGF0aC0+c2VhcmNoX2NvbW1pdF9yb290ID0gMTsKIAlwYXRoLT5za2lwX2xvY2tpbmcgPSAxOwpAQCAtMzY0NSwxNCArMzY0OSwxMSBAQAogCSAqIGJ0cmZzX2luaXRfcmVsb2Nfcm9vdCB3aWxsIHVzZSB0aGVtIHdoZW4gdGhlcmUKIAkgKiBpcyBubyByZXNlcnZhdGlvbiBpbiB0cmFuc2FjdGlvbiBoYW5kbGUuCiAJICovCi0JcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZChOVUxMLCByYy0+ZXh0ZW50X3Jvb3QsIHJjLT5ibG9ja19yc3YsCisJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZChyYy0+ZXh0ZW50X3Jvb3QsIHJjLT5ibG9ja19yc3YsCiAJCQkJICByYy0+ZXh0ZW50X3Jvb3QtPm5vZGVzaXplICogMjU2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmMtPmJsb2NrX3Jzdi0+cmVmaWxsX3VzZWQgPSAxOwotCWJ0cmZzX2FkZF9kdXJhYmxlX2Jsb2NrX3JzdihyYy0+ZXh0ZW50X3Jvb3QtPmZzX2luZm8sIHJjLT5ibG9ja19yc3YpOwotCiAJbWVtc2V0KCZyYy0+Y2x1c3RlciwgMCwgc2l6ZW9mKHJjLT5jbHVzdGVyKSk7CiAJcmMtPnNlYXJjaF9zdGFydCA9IHJjLT5ibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkOwogCXJjLT5leHRlbnRzX2ZvdW5kID0gMDsKQEAgLTM3NzcsOCArMzc3OCw3IEBACiAJCQl9CiAJCX0KIAotCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfY2hlY2sodHJhbnMsIHJjLT5leHRlbnRfcm9vdCwKLQkJCQkJICAgIHJjLT5ibG9ja19yc3YsIDAsIDUpOworCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfY2hlY2socmMtPmV4dGVudF9yb290LCByYy0+YmxvY2tfcnN2LCA1KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgIT0gLUVBR0FJTikgewogCQkJCWVyciA9IHJldDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3NjcnViLmMgYi9mcy9idHJmcy9zY3J1Yi5jCmluZGV4IGE4ZDAzZDUuLmY0MTkwZjIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3NjcnViLmMKKysrIGIvZnMvYnRyZnMvc2NydWIuYwpAQCAtMTcsMTAgKzE3LDE0IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgImN0cmVlLmgiCiAjaW5jbHVkZSAidm9sdW1lcy5oIgogI2luY2x1ZGUgImRpc2staW8uaCIKICNpbmNsdWRlICJvcmRlcmVkLWRhdGEuaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgImJhY2tyZWYuaCIKKyNpbmNsdWRlICJleHRlbnRfaW8uaCIKIAogLyoKICAqIFRoaXMgaXMgb25seSB0aGUgZmlyc3Qgc3RlcCB0b3dhcmRzIGEgZnVsbC1mZWF0dXJlcyBzY3J1Yi4gSXQgcmVhZHMgYWxsCkBAIC0yOSwxNSArMzMsMTIgQEAKICAqIGFueSBjYW4gYmUgZm91bmQuCiAgKgogICogRnV0dXJlIGVuaGFuY2VtZW50czoKLSAqICAtIFRvIGVuaGFuY2UgdGhlIHBlcmZvcm1hbmNlLCBiZXR0ZXIgcmVhZC1haGVhZCBzdHJhdGVnaWVzIGZvciB0aGUKLSAqICAgIGV4dGVudC10cmVlIGNhbiBiZSBlbXBsb3llZC4KICAqICAtIEluIGNhc2UgYW4gdW5yZXBhaXJhYmxlIGV4dGVudCBpcyBlbmNvdW50ZXJlZCwgdHJhY2sgd2hpY2ggZmlsZXMgYXJlCiAgKiAgICBhZmZlY3RlZCBhbmQgcmVwb3J0IHRoZW0KICAqICAtIEluIGNhc2Ugb2YgYSByZWFkIGVycm9yIG9uIGZpbGVzIHdpdGggbm9kYXRhc3VtLCBtYXAgdGhlIGZpbGUgYW5kIHJlYWQKICAqICAgIHRoZSBleHRlbnQgdG8gdHJpZ2dlciBhIHdyaXRlYmFjayBvZiB0aGUgZ29vZCBjb3B5CiAgKiAgLSB0cmFjayBhbmQgcmVjb3JkIG1lZGlhIGVycm9ycywgdGhyb3cgb3V0IGJhZCBkZXZpY2VzCiAgKiAgLSBhZGQgYSBtb2RlIHRvIGFsc28gcmVhZCB1bmFsbG9jYXRlZCBzcGFjZQotICogIC0gbWFrZSB0aGUgcHJlZmV0Y2ggY2FuY2VsbGFibGUKICAqLwogCiBzdHJ1Y3Qgc2NydWJfYmlvOwpAQCAtNjMsNyArNjQsNyBAQAogc3RydWN0IHNjcnViX3BhZ2UgewogCXU2NAkJCWZsYWdzOyAgLyogZXh0ZW50IGZsYWdzICovCiAJdTY0CQkJZ2VuZXJhdGlvbjsKLQl1NjQJCQltaXJyb3JfbnVtOworCWludAkJCW1pcnJvcl9udW07CiAJaW50CQkJaGF2ZV9jc3VtOwogCXU4CQkJY3N1bVtCVFJGU19DU1VNX1NJWkVdOwogfTsKQEAgLTg3LDYgKzg4LDcgQEAKIAlpbnQJCQlmaXJzdF9mcmVlOwogCWludAkJCWN1cnI7CiAJYXRvbWljX3QJCWluX2ZsaWdodDsKKwlhdG9taWNfdAkJZml4dXBfY250OwogCXNwaW5sb2NrX3QJCWxpc3RfbG9jazsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlsaXN0X3dhaXQ7CiAJdTE2CQkJY3N1bV9zaXplOwpAQCAtMTAwLDYgKzEwMiwyNyBAQAogCXNwaW5sb2NrX3QJCXN0YXRfbG9jazsKIH07CiAKK3N0cnVjdCBzY3J1Yl9maXh1cF9ub2RhdGFzdW0geworCXN0cnVjdCBzY3J1Yl9kZXYJKnNkZXY7CisJdTY0CQkJbG9naWNhbDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdAkqcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfd29yawl3b3JrOworCWludAkJCW1pcnJvcl9udW07Cit9OworCitzdHJ1Y3Qgc2NydWJfd2FybmluZyB7CisJc3RydWN0IGJ0cmZzX3BhdGgJKnBhdGg7CisJdTY0CQkJZXh0ZW50X2l0ZW1fc2l6ZTsKKwljaGFyCQkJKnNjcmF0Y2hfYnVmOworCWNoYXIJCQkqbXNnX2J1ZjsKKwljb25zdCBjaGFyCQkqZXJyc3RyOworCXNlY3Rvcl90CQlzZWN0b3I7CisJdTY0CQkJbG9naWNhbDsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlCSpkZXY7CisJaW50CQkJbXNnX2J1ZnNpemU7CisJaW50CQkJc2NyYXRjaF9idWZzaXplOworfTsKKwogc3RhdGljIHZvaWQgc2NydWJfZnJlZV9jc3VtcyhzdHJ1Y3Qgc2NydWJfZGV2ICpzZGV2KQogewogCXdoaWxlICghbGlzdF9lbXB0eSgmc2Rldi0+Y3N1bV9saXN0KSkgewpAQCAtMTc1LDE0ICsxOTgsMTUgQEAKIAogCQlpZiAoaSAhPSBTQ1JVQl9CSU9TX1BFUl9ERVYtMSkKIAkJCXNkZXYtPmJpb3NbaV0tPm5leHRfZnJlZSA9IGkgKyAxOwotCQkgZWxzZQorCQllbHNlCiAJCQlzZGV2LT5iaW9zW2ldLT5uZXh0X2ZyZWUgPSAtMTsKIAl9CiAJc2Rldi0+Zmlyc3RfZnJlZSA9IDA7CiAJc2Rldi0+Y3VyciA9IC0xOwogCWF0b21pY19zZXQoJnNkZXYtPmluX2ZsaWdodCwgMCk7CisJYXRvbWljX3NldCgmc2Rldi0+Zml4dXBfY250LCAwKTsKIAlhdG9taWNfc2V0KCZzZGV2LT5jYW5jZWxfcmVxLCAwKTsKLQlzZGV2LT5jc3VtX3NpemUgPSBidHJmc19zdXBlcl9jc3VtX3NpemUoJmZzX2luZm8tPnN1cGVyX2NvcHkpOworCXNkZXYtPmNzdW1fc2l6ZSA9IGJ0cmZzX3N1cGVyX2NzdW1fc2l6ZShmc19pbmZvLT5zdXBlcl9jb3B5KTsKIAlJTklUX0xJU1RfSEVBRCgmc2Rldi0+Y3N1bV9saXN0KTsKIAogCXNwaW5fbG9ja19pbml0KCZzZGV2LT5saXN0X2xvY2spOwpAQCAtMTk1LDI0ICsyMTksMzYxIEBACiAJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9CiAKK3N0YXRpYyBpbnQgc2NydWJfcHJpbnRfd2FybmluZ19pbm9kZSh1NjQgaW51bSwgdTY0IG9mZnNldCwgdTY0IHJvb3QsIHZvaWQgKmN0eCkKK3sKKwl1NjQgaXNpemU7CisJdTMyIG5saW5rOworCWludCByZXQ7CisJaW50IGk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtOworCXN0cnVjdCBzY3J1Yl93YXJuaW5nICpzd2FybiA9IGN0eDsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHN3YXJuLT5kZXYtPmRldl9yb290LT5mc19pbmZvOworCXN0cnVjdCBpbm9kZV9mc19wYXRocyAqaXBhdGggPSBOVUxMOworCXN0cnVjdCBidHJmc19yb290ICpsb2NhbF9yb290OworCXN0cnVjdCBidHJmc19rZXkgcm9vdF9rZXk7CisKKwlyb290X2tleS5vYmplY3RpZCA9IHJvb3Q7CisJcm9vdF9rZXkudHlwZSA9IEJUUkZTX1JPT1RfSVRFTV9LRVk7CisJcm9vdF9rZXkub2Zmc2V0ID0gKHU2NCktMTsKKwlsb2NhbF9yb290ID0gYnRyZnNfcmVhZF9mc19yb290X25vX25hbWUoZnNfaW5mbywgJnJvb3Rfa2V5KTsKKwlpZiAoSVNfRVJSKGxvY2FsX3Jvb3QpKSB7CisJCXJldCA9IFBUUl9FUlIobG9jYWxfcm9vdCk7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGlub2RlX2l0ZW1faW5mbyhpbnVtLCAwLCBsb2NhbF9yb290LCBzd2Fybi0+cGF0aCk7CisJaWYgKHJldCkgeworCQlidHJmc19yZWxlYXNlX3BhdGgoc3dhcm4tPnBhdGgpOworCQlnb3RvIGVycjsKKwl9CisKKwllYiA9IHN3YXJuLT5wYXRoLT5ub2Rlc1swXTsKKwlpbm9kZV9pdGVtID0gYnRyZnNfaXRlbV9wdHIoZWIsIHN3YXJuLT5wYXRoLT5zbG90c1swXSwKKwkJCQkJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOworCWlzaXplID0gYnRyZnNfaW5vZGVfc2l6ZShlYiwgaW5vZGVfaXRlbSk7CisJbmxpbmsgPSBidHJmc19pbm9kZV9ubGluayhlYiwgaW5vZGVfaXRlbSk7CisJYnRyZnNfcmVsZWFzZV9wYXRoKHN3YXJuLT5wYXRoKTsKKworCWlwYXRoID0gaW5pdF9pcGF0aCg0MDk2LCBsb2NhbF9yb290LCBzd2Fybi0+cGF0aCk7CisJcmV0ID0gcGF0aHNfZnJvbV9pbm9kZShpbnVtLCBpcGF0aCk7CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwkvKgorCSAqIHdlIGRlbGliZXJhdGVseSBpZ25vcmUgdGhlIGJpdCBpcGF0aCBtaWdodCBoYXZlIGJlZW4gdG9vIHNtYWxsIHRvCisJICogaG9sZCBhbGwgb2YgdGhlIHBhdGhzIGhlcmUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXBhdGgtPmZzcGF0aC0+ZWxlbV9jbnQ7ICsraSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6ICVzIGF0IGxvZ2ljYWwgJWxsdSBvbiBkZXYgIgorCQkJIiVzLCBzZWN0b3IgJWxsdSwgcm9vdCAlbGx1LCBpbm9kZSAlbGx1LCBvZmZzZXQgJWxsdSwgIgorCQkJImxlbmd0aCAlbGx1LCBsaW5rcyAldSAocGF0aDogJXMpXG4iLCBzd2Fybi0+ZXJyc3RyLAorCQkJc3dhcm4tPmxvZ2ljYWwsIHN3YXJuLT5kZXYtPm5hbWUsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXN3YXJuLT5zZWN0b3IsIHJvb3QsIGludW0sIG9mZnNldCwKKwkJCW1pbihpc2l6ZSAtIG9mZnNldCwgKHU2NClQQUdFX1NJWkUpLCBubGluaywKKwkJCShjaGFyICopaXBhdGgtPmZzcGF0aC0+dmFsW2ldKTsKKworCWZyZWVfaXBhdGgoaXBhdGgpOworCXJldHVybiAwOworCitlcnI6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6ICVzIGF0IGxvZ2ljYWwgJWxsdSBvbiBkZXYgIgorCQkiJXMsIHNlY3RvciAlbGx1LCByb290ICVsbHUsIGlub2RlICVsbHUsIG9mZnNldCAlbGx1OiBwYXRoICIKKwkJInJlc29sdmluZyBmYWlsZWQgd2l0aCByZXQ9JWRcbiIsIHN3YXJuLT5lcnJzdHIsCisJCXN3YXJuLT5sb2dpY2FsLCBzd2Fybi0+ZGV2LT5uYW1lLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXN3YXJuLT5zZWN0b3IsIHJvb3QsIGludW0sIG9mZnNldCwgcmV0KTsKKworCWZyZWVfaXBhdGgoaXBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY3J1Yl9wcmludF93YXJuaW5nKGNvbnN0IGNoYXIgKmVycnN0ciwgc3RydWN0IHNjcnViX2JpbyAqc2JpbywKKwkJCQlpbnQgaXgpCit7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2ID0gc2Jpby0+c2Rldi0+ZGV2OworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gZGV2LT5kZXZfcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtICplaTsKKwlzdHJ1Y3Qgc2NydWJfd2FybmluZyBzd2FybjsKKwl1MzIgaXRlbV9zaXplOworCWludCByZXQ7CisJdTY0IHJlZl9yb290OworCXU4IHJlZl9sZXZlbDsKKwl1bnNpZ25lZCBsb25nIHB0ciA9IDA7CisJY29uc3QgaW50IGJ1ZnNpemUgPSA0MDk2OworCXU2NCBleHRlbnRfb2Zmc2V0OworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKworCXN3YXJuLnNjcmF0Y2hfYnVmID0ga21hbGxvYyhidWZzaXplLCBHRlBfTk9GUyk7CisJc3dhcm4ubXNnX2J1ZiA9IGttYWxsb2MoYnVmc2l6ZSwgR0ZQX05PRlMpOworCXN3YXJuLnNlY3RvciA9IChzYmlvLT5waHlzaWNhbCArIGl4ICogUEFHRV9TSVpFKSA+PiA5OworCXN3YXJuLmxvZ2ljYWwgPSBzYmlvLT5sb2dpY2FsICsgaXggKiBQQUdFX1NJWkU7CisJc3dhcm4uZXJyc3RyID0gZXJyc3RyOworCXN3YXJuLmRldiA9IGRldjsKKwlzd2Fybi5tc2dfYnVmc2l6ZSA9IGJ1ZnNpemU7CisJc3dhcm4uc2NyYXRjaF9idWZzaXplID0gYnVmc2l6ZTsKKworCWlmICghcGF0aCB8fCAhc3dhcm4uc2NyYXRjaF9idWYgfHwgIXN3YXJuLm1zZ19idWYpCisJCWdvdG8gb3V0OworCisJcmV0ID0gZXh0ZW50X2Zyb21fbG9naWNhbChmc19pbmZvLCBzd2Fybi5sb2dpY2FsLCBwYXRoLCAmZm91bmRfa2V5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlleHRlbnRfb2Zmc2V0ID0gc3dhcm4ubG9naWNhbCAtIGZvdW5kX2tleS5vYmplY3RpZDsKKwlzd2Fybi5leHRlbnRfaXRlbV9zaXplID0gZm91bmRfa2V5Lm9mZnNldDsKKworCWViID0gcGF0aC0+bm9kZXNbMF07CisJZWkgPSBidHJmc19pdGVtX3B0cihlYiwgcGF0aC0+c2xvdHNbMF0sIHN0cnVjdCBidHJmc19leHRlbnRfaXRlbSk7CisJaXRlbV9zaXplID0gYnRyZnNfaXRlbV9zaXplX25yKGViLCBwYXRoLT5zbG90c1swXSk7CisKKwlpZiAocmV0ICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykgeworCQlkbyB7CisJCQlyZXQgPSB0cmVlX2JhY2tyZWZfZm9yX2V4dGVudCgmcHRyLCBlYiwgZWksIGl0ZW1fc2l6ZSwKKwkJCQkJCQkmcmVmX3Jvb3QsICZyZWZfbGV2ZWwpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgYXQgbG9naWNhbCAlbGx1IG9uIGRldiAlcywgIgorCQkJCSJzZWN0b3IgJWxsdTogbWV0YWRhdGEgJXMgKGxldmVsICVkKSBpbiB0cmVlICIKKwkJCQkiJWxsdVxuIiwgZXJyc3RyLCBzd2Fybi5sb2dpY2FsLCBkZXYtPm5hbWUsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzd2Fybi5zZWN0b3IsCisJCQkJcmVmX2xldmVsID8gIm5vZGUiIDogImxlYWYiLAorCQkJCXJldCA8IDAgPyAtMSA6IHJlZl9sZXZlbCwKKwkJCQlyZXQgPCAwID8gLTEgOiByZWZfcm9vdCk7CisJCX0gd2hpbGUgKHJldCAhPSAxKTsKKwl9IGVsc2UgeworCQlzd2Fybi5wYXRoID0gcGF0aDsKKwkJaXRlcmF0ZV9leHRlbnRfaW5vZGVzKGZzX2luZm8sIHBhdGgsIGZvdW5kX2tleS5vYmplY3RpZCwKKwkJCQkJZXh0ZW50X29mZnNldCwKKwkJCQkJc2NydWJfcHJpbnRfd2FybmluZ19pbm9kZSwgJnN3YXJuKTsKKwl9CisKK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJa2ZyZWUoc3dhcm4uc2NyYXRjaF9idWYpOworCWtmcmVlKHN3YXJuLm1zZ19idWYpOworfQorCitzdGF0aWMgaW50IHNjcnViX2ZpeHVwX3JlYWRwYWdlKHU2NCBpbnVtLCB1NjQgb2Zmc2V0LCB1NjQgcm9vdCwgdm9pZCAqY3R4KQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXN0cnVjdCBzY3J1Yl9maXh1cF9ub2RhdGFzdW0gKmZpeHVwID0gY3R4OworCWludCByZXQ7CisJaW50IGNvcnJlY3RlZCA9IDA7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJdTY0IGVuZCA9IG9mZnNldCArIFBBR0VfU0laRSAtIDE7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvY2FsX3Jvb3Q7CisKKwlrZXkub2JqZWN0aWQgPSByb290OworCWtleS50eXBlID0gQlRSRlNfUk9PVF9JVEVNX0tFWTsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKwlsb2NhbF9yb290ID0gYnRyZnNfcmVhZF9mc19yb290X25vX25hbWUoZml4dXAtPnJvb3QtPmZzX2luZm8sICZrZXkpOworCWlmIChJU19FUlIobG9jYWxfcm9vdCkpCisJCXJldHVybiBQVFJfRVJSKGxvY2FsX3Jvb3QpOworCisJa2V5LnR5cGUgPSBCVFJGU19JTk9ERV9JVEVNX0tFWTsKKwlrZXkub2JqZWN0aWQgPSBpbnVtOworCWtleS5vZmZzZXQgPSAwOworCWlub2RlID0gYnRyZnNfaWdldChmaXh1cC0+cm9vdC0+ZnNfaW5mby0+c2IsICZrZXksIGxvY2FsX3Jvb3QsIE5VTEwpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CisKKwlpbmRleCA9IG9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKKwlpZiAoIXBhZ2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZTsKKwkJaWYgKFBhZ2VEaXJ0eShwYWdlKSkgeworCQkJLyoKKwkJCSAqIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGRlZmVjdCBzZWN0b3IuIHRoZQorCQkJICogZGF0YSB0aGF0IHdhcyBpbiB0aGF0IHNlY3RvciBpcyBub3QgaW4gbWVtb3J5LAorCQkJICogYmVjYXVzZSB0aGUgcGFnZSB3YXMgbW9kaWZpZWQuIHdlIG11c3Qgbm90IHdyaXRlIHRoZQorCQkJICogbW9kaWZpZWQgcGFnZSB0byB0aGF0IHNlY3Rvci4KKwkJCSAqCisJCQkgKiBUT0RPOiB3aGF0IGNvdWxkIGJlIGRvbmUgaGVyZTogd2FpdCBmb3IgdGhlIGRlbGFsbG9jCisJCQkgKiAgICAgICBydW5uZXIgdG8gd3JpdGUgb3V0IHRoYXQgcGFnZSAobWlnaHQgaW52b2x2ZQorCQkJICogICAgICAgQ09XKSBhbmQgc2VlIHdoZXRoZXIgdGhlIHNlY3RvciBpcyBzdGlsbAorCQkJICogICAgICAgcmVmZXJlbmNlZCBhZnRlcndhcmRzLgorCQkJICoKKwkJCSAqIEZvciB0aGUgbWVhbnRpbWUsIHdlJ2xsIHRyZWF0IHRoaXMgZXJyb3IKKwkJCSAqIGluY29ycmVjdGFibGUsIGFsdGhvdWdoIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgYQorCQkJICogbGF0ZXIgc2NydWIgd2lsbCBmaW5kIHRoZSBiYWQgc2VjdG9yIGFnYWluIGFuZCB0aGF0CisJCQkgKiB0aGVyZSdzIG5vIGRpcnR5IHBhZ2UgaW4gbWVtb3J5LCB0aGVuLgorCQkJICovCisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJbWFwX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZTsKKwkJcmV0ID0gcmVwYWlyX2lvX2ZhaWx1cmUobWFwX3RyZWUsIG9mZnNldCwgUEFHRV9TSVpFLAorCQkJCQlmaXh1cC0+bG9naWNhbCwgcGFnZSwKKwkJCQkJZml4dXAtPm1pcnJvcl9udW0pOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJY29ycmVjdGVkID0gIXJldDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSBuZWVkIHRvIGdldCBnb29kIGRhdGEgZmlyc3QuIHRoZSBnZW5lcmFsIHJlYWRwYWdlIHBhdGgKKwkJICogd2lsbCBjYWxsIHJlcGFpcl9pb19mYWlsdXJlIGZvciB1cywgd2UganVzdCBoYXZlIHRvIG1ha2UKKwkJICogc3VyZSB3ZSByZWFkIHRoZSBiYWQgbWlycm9yLgorCQkgKi8KKwkJcmV0ID0gc2V0X2V4dGVudF9iaXRzKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgb2Zmc2V0LCBlbmQsCisJCQkJCUVYVEVOVF9EQU1BR0VELCBHRlBfTk9GUyk7CisJCWlmIChyZXQpIHsKKwkJCS8qIHNldF9leHRlbnRfYml0cyBzaG91bGQgZ2l2ZSBwcm9wZXIgZXJyb3IgKi8KKwkJCVdBUk5fT04ocmV0ID4gMCk7CisJCQlpZiAocmV0ID4gMCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBleHRlbnRfcmVhZF9mdWxsX3BhZ2UoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBwYWdlLAorCQkJCQkJYnRyZnNfZ2V0X2V4dGVudCwKKwkJCQkJCWZpeHVwLT5taXJyb3JfbnVtKTsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKworCQljb3JyZWN0ZWQgPSAhdGVzdF9yYW5nZV9iaXQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBvZmZzZXQsCisJCQkJCQllbmQsIEVYVEVOVF9EQU1BR0VELCAwLCBOVUxMKTsKKwkJaWYgKCFjb3JyZWN0ZWQpCisJCQljbGVhcl9leHRlbnRfYml0cygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIG9mZnNldCwgZW5kLAorCQkJCQkJRVhURU5UX0RBTUFHRUQsIEdGUF9OT0ZTKTsKKwl9CisKK291dDoKKwlpZiAocGFnZSkKKwkJcHV0X3BhZ2UocGFnZSk7CisJaWYgKGlub2RlKQorCQlpcHV0KGlub2RlKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHJldCA9PSAwICYmIGNvcnJlY3RlZCkgeworCQkvKgorCQkgKiB3ZSBvbmx5IG5lZWQgdG8gY2FsbCByZWFkcGFnZSBmb3Igb25lIG9mIHRoZSBpbm9kZXMgYmVsb25naW5nCisJCSAqIHRvIHRoaXMgZXh0ZW50LiBzbyBtYWtlIGl0ZXJhdGVfZXh0ZW50X2lub2RlcyBzdG9wCisJCSAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHZvaWQgc2NydWJfZml4dXBfbm9kYXRhc3VtKHN0cnVjdCBidHJmc193b3JrICp3b3JrKQoreworCWludCByZXQ7CisJc3RydWN0IHNjcnViX2ZpeHVwX25vZGF0YXN1bSAqZml4dXA7CisJc3RydWN0IHNjcnViX2RldiAqc2RldjsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucyA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm87CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJaW50IHVuY29ycmVjdGFibGUgPSAwOworCisJZml4dXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNjcnViX2ZpeHVwX25vZGF0YXN1bSwgd29yayk7CisJc2RldiA9IGZpeHVwLT5zZGV2OworCWZzX2luZm8gPSBmaXh1cC0+cm9vdC0+ZnNfaW5mbzsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKSB7CisJCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwkJKytzZGV2LT5zdGF0Lm1hbGxvY19lcnJvcnM7CisJCXNwaW5fdW5sb2NrKCZzZGV2LT5zdGF0X2xvY2spOworCQl1bmNvcnJlY3RhYmxlID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKGZpeHVwLT5yb290KTsKKwlpZiAoSVNfRVJSKHRyYW5zKSkgeworCQl1bmNvcnJlY3RhYmxlID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiB0aGUgaWRlYSBpcyB0byB0cmlnZ2VyIGEgcmVndWxhciByZWFkIHRocm91Z2ggdGhlIHN0YW5kYXJkIHBhdGguIHdlCisJICogcmVhZCBhIHBhZ2UgZnJvbSB0aGUgKGZhaWxlZCkgbG9naWNhbCBhZGRyZXNzIGJ5IHNwZWNpZnlpbmcgdGhlCisJICogY29ycmVzcG9uZGluZyBjb3B5bnVtIG9mIHRoZSBmYWlsZWQgc2VjdG9yLiB0aHVzLCB0aGF0IHJlYWRwYWdlIGlzCisJICogZXhwZWN0ZWQgdG8gZmFpbC4KKwkgKiB0aGF0IGlzIHRoZSBwb2ludCB3aGVyZSBvbi10aGUtZmx5IGVycm9yIGNvcnJlY3Rpb24gd2lsbCBraWNrIGluCisJICogKG9uY2UgaXQncyBmaW5pc2hlZCkgYW5kIHJld3JpdGUgdGhlIGZhaWxlZCBzZWN0b3IgaWYgYSBnb29kIGNvcHkKKwkgKiBjYW4gYmUgZm91bmQuCisJICovCisJcmV0ID0gaXRlcmF0ZV9pbm9kZXNfZnJvbV9sb2dpY2FsKGZpeHVwLT5sb2dpY2FsLCBmaXh1cC0+cm9vdC0+ZnNfaW5mbywKKwkJCQkJCXBhdGgsIHNjcnViX2ZpeHVwX3JlYWRwYWdlLAorCQkJCQkJZml4dXApOworCWlmIChyZXQgPCAwKSB7CisJCXVuY29ycmVjdGFibGUgPSAxOworCQlnb3RvIG91dDsKKwl9CisJV0FSTl9PTihyZXQgIT0gMSk7CisKKwlzcGluX2xvY2soJnNkZXYtPnN0YXRfbG9jayk7CisJKytzZGV2LT5zdGF0LmNvcnJlY3RlZF9lcnJvcnM7CisJc3Bpbl91bmxvY2soJnNkZXYtPnN0YXRfbG9jayk7CisKK291dDoKKwlpZiAodHJhbnMgJiYgIUlTX0VSUih0cmFucykpCisJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgZml4dXAtPnJvb3QpOworCWlmICh1bmNvcnJlY3RhYmxlKSB7CisJCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwkJKytzZGV2LT5zdGF0LnVuY29ycmVjdGFibGVfZXJyb3JzOworCQlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJidHJmczogdW5hYmxlIHRvIGZpeHVwICIKKwkJCQkJIihub2RhdGFzdW0pIGVycm9yIGF0IGxvZ2ljYWwgJWxsdVxuIiwKKwkJCQkJZml4dXAtPmxvZ2ljYWwpOworCX0KKworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlrZnJlZShmaXh1cCk7CisKKwkvKiBzZWUgY2FsbGVyIHdoeSB3ZSdyZSBwcmV0ZW5kaW5nIHRvIGJlIHBhdXNlZCBpbiB0aGUgc2NydWIgY291bnRlcnMgKi8KKwltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKKwlhdG9taWNfZGVjKCZmc19pbmZvLT5zY3J1YnNfcnVubmluZyk7CisJYXRvbWljX2RlYygmZnNfaW5mby0+c2NydWJzX3BhdXNlZCk7CisJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKKwlhdG9taWNfZGVjKCZzZGV2LT5maXh1cF9jbnQpOworCXdha2VfdXAoJmZzX2luZm8tPnNjcnViX3BhdXNlX3dhaXQpOworCXdha2VfdXAoJnNkZXYtPmxpc3Rfd2FpdCk7Cit9CisKIC8qCiAgKiBzY3J1Yl9yZWNoZWNrX2Vycm9yIGdldHMgY2FsbGVkIHdoZW4gZWl0aGVyIHZlcmlmaWNhdGlvbiBvZiB0aGUgcGFnZQogICogZmFpbGVkIG9yIHRoZSBiaW8gZmFpbGVkIHRvIHJlYWQsIGUuZy4gd2l0aCBFSU8uIEluIHRoZSBsYXR0ZXIgY2FzZSwKICAqIHJlY2hlY2tfZXJyb3IgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IHBhZ2UgaW4gdGhlIGJpbywgZXZlbiB0aG91Z2ggb25seQogICogb25lIG1heSBiZSBiYWQKICAqLwotc3RhdGljIHZvaWQgc2NydWJfcmVjaGVja19lcnJvcihzdHJ1Y3Qgc2NydWJfYmlvICpzYmlvLCBpbnQgaXgpCitzdGF0aWMgaW50IHNjcnViX3JlY2hlY2tfZXJyb3Ioc3RydWN0IHNjcnViX2JpbyAqc2JpbywgaW50IGl4KQogeworCXN0cnVjdCBzY3J1Yl9kZXYgKnNkZXYgPSBzYmlvLT5zZGV2OworCXU2NCBzZWN0b3IgPSAoc2Jpby0+cGh5c2ljYWwgKyBpeCAqIFBBR0VfU0laRSkgPj4gOTsKKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShfcnMsIERFRkFVTFRfUkFURUxJTUlUX0lOVEVSVkFMLAorCQkJCQlERUZBVUxUX1JBVEVMSU1JVF9CVVJTVCk7CisKIAlpZiAoc2Jpby0+ZXJyKSB7Ci0JCWlmIChzY3J1Yl9maXh1cF9pbyhSRUFELCBzYmlvLT5zZGV2LT5kZXYtPmJkZXYsCi0JCQkJICAgKHNiaW8tPnBoeXNpY2FsICsgaXggKiBQQUdFX1NJWkUpID4+IDksCisJCWlmIChzY3J1Yl9maXh1cF9pbyhSRUFELCBzYmlvLT5zZGV2LT5kZXYtPmJkZXYsIHNlY3RvciwKIAkJCQkgICBzYmlvLT5iaW8tPmJpX2lvX3ZlY1tpeF0uYnZfcGFnZSkgPT0gMCkgewogCQkJaWYgKHNjcnViX2ZpeHVwX2NoZWNrKHNiaW8sIGl4KSA9PSAwKQotCQkJCXJldHVybjsKKwkJCQlyZXR1cm4gMDsKIAkJfQorCQlpZiAoX19yYXRlbGltaXQoJl9ycykpCisJCQlzY3J1Yl9wcmludF93YXJuaW5nKCJpL28gZXJyb3IiLCBzYmlvLCBpeCk7CisJfSBlbHNlIHsKKwkJaWYgKF9fcmF0ZWxpbWl0KCZfcnMpKQorCQkJc2NydWJfcHJpbnRfd2FybmluZygiY2hlY2tzdW0gZXJyb3IiLCBzYmlvLCBpeCk7CiAJfQogCisJc3Bpbl9sb2NrKCZzZGV2LT5zdGF0X2xvY2spOworCSsrc2Rldi0+c3RhdC5yZWFkX2Vycm9yczsKKwlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwogCXNjcnViX2ZpeHVwKHNiaW8sIGl4KTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBzY3J1Yl9maXh1cF9jaGVjayhzdHJ1Y3Qgc2NydWJfYmlvICpzYmlvLCBpbnQgaXgpCkBAIC0yNTAsNyArNjExLDggQEAKIAlzdHJ1Y3Qgc2NydWJfZGV2ICpzZGV2ID0gc2Jpby0+c2RldjsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHNkZXYtPmRldi0+ZGV2X3Jvb3QtPmZzX2luZm87CiAJc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUgPSAmZnNfaW5mby0+bWFwcGluZ190cmVlOwotCXN0cnVjdCBidHJmc19tdWx0aV9iaW8gKm11bHRpID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfYmlvICpiYmlvID0gTlVMTDsKKwlzdHJ1Y3Qgc2NydWJfZml4dXBfbm9kYXRhc3VtICpmaXh1cDsKIAl1NjQgbG9naWNhbCA9IHNiaW8tPmxvZ2ljYWwgKyBpeCAqIFBBR0VfU0laRTsKIAl1NjQgbGVuZ3RoOwogCWludCBpOwpAQCAtMjU5LDM4ICs2MjEsNTcgQEAKIAogCWlmICgoc2Jpby0+c3BhZ1tpeF0uZmxhZ3MgJiBCVFJGU19FWFRFTlRfRkxBR19EQVRBKSAmJgogCSAgICAoc2Jpby0+c3BhZ1tpeF0uaGF2ZV9jc3VtID09IDApKSB7CisJCWZpeHVwID0ga3phbGxvYyhzaXplb2YoKmZpeHVwKSwgR0ZQX05PRlMpOworCQlpZiAoIWZpeHVwKQorCQkJZ290byB1bmNvcnJlY3RhYmxlOworCQlmaXh1cC0+c2RldiA9IHNkZXY7CisJCWZpeHVwLT5sb2dpY2FsID0gbG9naWNhbDsKKwkJZml4dXAtPnJvb3QgPSBmc19pbmZvLT5leHRlbnRfcm9vdDsKKwkJZml4dXAtPm1pcnJvcl9udW0gPSBzYmlvLT5zcGFnW2l4XS5taXJyb3JfbnVtOwogCQkvKgotCQkgKiBub2RhdGFzdW0sIGRvbid0IHRyeSB0byBmaXggYW55dGhpbmcKLQkJICogRklYTUU6IHdlIGNhbiBkbyBiZXR0ZXIsIG9wZW4gdGhlIGlub2RlIGFuZCB0cmlnZ2VyIGEKLQkJICogd3JpdGViYWNrCisJCSAqIGluY3JlbWVudCBzY3J1YnNfcnVubmluZyB0byBwcmV2ZW50IGNhbmNlbCByZXF1ZXN0cyBmcm9tCisJCSAqIGNvbXBsZXRpbmcgYXMgbG9uZyBhcyBhIGZpeHVwIHdvcmtlciBpcyBydW5uaW5nLiB3ZSBtdXN0IGFsc28KKwkJICogaW5jcmVtZW50IHNjcnVic19wYXVzZWQgdG8gcHJldmVudCBkZWFkbG9ja2luZyBvbiBwYXVzZQorCQkgKiByZXF1ZXN0cyB1c2VkIGZvciB0cmFuc2FjdGlvbnMgY29tbWl0cyAoYXMgdGhlIHdvcmtlciB1c2VzIGEKKwkJICogdHJhbnNhY3Rpb24gY29udGV4dCkuIGl0IGlzIHNhZmUgdG8gcmVnYXJkIHRoZSBmaXh1cCB3b3JrZXIKKwkJICogYXMgcGF1c2VkIGZvciBhbGwgbWF0dGVycyBwcmFjdGljYWwuIGVmZmVjdGl2ZWx5LCB3ZSBvbmx5CisJCSAqIGF2b2lkIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBmcm9tIGNvbXBsZXRpbmcuCiAJCSAqLwotCQlnb3RvIHVuY29ycmVjdGFibGU7CisJCW11dGV4X2xvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOworCQlhdG9taWNfaW5jKCZmc19pbmZvLT5zY3J1YnNfcnVubmluZyk7CisJCWF0b21pY19pbmMoJmZzX2luZm8tPnNjcnVic19wYXVzZWQpOworCQltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOworCQlhdG9taWNfaW5jKCZzZGV2LT5maXh1cF9jbnQpOworCQlmaXh1cC0+d29yay5mdW5jID0gc2NydWJfZml4dXBfbm9kYXRhc3VtOworCQlidHJmc19xdWV1ZV93b3JrZXIoJmZzX2luZm8tPnNjcnViX3dvcmtlcnMsICZmaXh1cC0+d29yayk7CisJCXJldHVybjsKIAl9CiAKIAlsZW5ndGggPSBQQUdFX1NJWkU7CiAJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBSRVFfV1JJVEUsIGxvZ2ljYWwsICZsZW5ndGgsCi0JCQkgICAgICAmbXVsdGksIDApOwotCWlmIChyZXQgfHwgIW11bHRpIHx8IGxlbmd0aCA8IFBBR0VfU0laRSkgeworCQkJICAgICAgJmJiaW8sIDApOworCWlmIChyZXQgfHwgIWJiaW8gfHwgbGVuZ3RoIDwgUEFHRV9TSVpFKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkgICAgICAgInNjcnViX2ZpeHVwOiBidHJmc19tYXBfYmxvY2sgZmFpbGVkIHVzIGZvciAlbGx1XG4iLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsb2dpY2FsKTsKIAkJV0FSTl9PTigxKTsKKwkJa2ZyZWUoYmJpbyk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAobXVsdGktPm51bV9zdHJpcGVzID09IDEpCisJaWYgKGJiaW8tPm51bV9zdHJpcGVzID09IDEpCiAJCS8qIHRoZXJlIGFyZW4ndCBhbnkgcmVwbGljYXMgKi8KIAkJZ290byB1bmNvcnJlY3RhYmxlOwogCiAJLyoKIAkgKiBmaXJzdCBmaW5kIGEgZ29vZCBjb3B5CiAJICovCi0JZm9yIChpID0gMDsgaSA8IG11bHRpLT5udW1fc3RyaXBlczsgKytpKSB7Ci0JCWlmIChpID09IHNiaW8tPnNwYWdbaXhdLm1pcnJvcl9udW0pCisJZm9yIChpID0gMDsgaSA8IGJiaW8tPm51bV9zdHJpcGVzOyArK2kpIHsKKwkJaWYgKGkgKyAxID09IHNiaW8tPnNwYWdbaXhdLm1pcnJvcl9udW0pCiAJCQljb250aW51ZTsKIAotCQlpZiAoc2NydWJfZml4dXBfaW8oUkVBRCwgbXVsdGktPnN0cmlwZXNbaV0uZGV2LT5iZGV2LAotCQkJCSAgIG11bHRpLT5zdHJpcGVzW2ldLnBoeXNpY2FsID4+IDksCisJCWlmIChzY3J1Yl9maXh1cF9pbyhSRUFELCBiYmlvLT5zdHJpcGVzW2ldLmRldi0+YmRldiwKKwkJCQkgICBiYmlvLT5zdHJpcGVzW2ldLnBoeXNpY2FsID4+IDksCiAJCQkJICAgc2Jpby0+YmlvLT5iaV9pb192ZWNbaXhdLmJ2X3BhZ2UpKSB7CiAJCQkvKiBJL08tZXJyb3IsIHRoaXMgaXMgbm90IGEgZ29vZCBjb3B5ICovCiAJCQljb250aW51ZTsKQEAgLTI5OSw3ICs2ODAsNyBAQAogCQlpZiAoc2NydWJfZml4dXBfY2hlY2soc2JpbywgaXgpID09IDApCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gbXVsdGktPm51bV9zdHJpcGVzKQorCWlmIChpID09IGJiaW8tPm51bV9zdHJpcGVzKQogCQlnb3RvIHVuY29ycmVjdGFibGU7CiAKIAlpZiAoIXNkZXYtPnJlYWRvbmx5KSB7CkBAIC0zMTQsMjUgKzY5NSwyMyBAQAogCQl9CiAJfQogCi0Ja2ZyZWUobXVsdGkpOworCWtmcmVlKGJiaW8pOwogCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKIAkrK3NkZXYtPnN0YXQuY29ycmVjdGVkX2Vycm9yczsKIAlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKIAotCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZpeGVkIHVwIGF0ICVsbHVcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxvZ2ljYWwpOworCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiYnRyZnM6IGZpeGVkIHVwIGVycm9yIGF0IGxvZ2ljYWwgJWxsdVxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxvZ2ljYWwpOwogCXJldHVybjsKIAogdW5jb3JyZWN0YWJsZToKLQlrZnJlZShtdWx0aSk7CisJa2ZyZWUoYmJpbyk7CiAJc3Bpbl9sb2NrKCZzZGV2LT5zdGF0X2xvY2spOwogCSsrc2Rldi0+c3RhdC51bmNvcnJlY3RhYmxlX2Vycm9yczsKIAlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKIAotCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IHVuYWJsZSB0byBmaXh1cCBhdCAlbGx1XG4iLAotCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpbG9naWNhbCk7CisJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJidHJmczogdW5hYmxlIHRvIGZpeHVwIChyZWd1bGFyKSBlcnJvciBhdCAiCisJCQkJImxvZ2ljYWwgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsb2dpY2FsKTsKIH0KIAogc3RhdGljIGludCBzY3J1Yl9maXh1cF9pbyhpbnQgcncsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwKQEAgLTM4Miw4ICs3NjEsMTQgQEAKIAlpbnQgcmV0OwogCiAJaWYgKHNiaW8tPmVycikgeworCQlyZXQgPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgc2Jpby0+Y291bnQ7ICsraSkKLQkJCXNjcnViX3JlY2hlY2tfZXJyb3Ioc2JpbywgaSk7CisJCQlyZXQgfD0gc2NydWJfcmVjaGVja19lcnJvcihzYmlvLCBpKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwkJCSsrc2Rldi0+c3RhdC51bnZlcmlmaWVkX2Vycm9yczsKKwkJCXNwaW5fdW5sb2NrKCZzZGV2LT5zdGF0X2xvY2spOworCQl9CiAKIAkJc2Jpby0+YmlvLT5iaV9mbGFncyAmPSB+KEJJT19QT09MX01BU0sgLSAxKTsKIAkJc2Jpby0+YmlvLT5iaV9mbGFncyB8PSAxIDw8IEJJT19VUFRPREFURTsKQEAgLTM5NiwxMCArNzgxLDYgQEAKIAkJCWJpLT5idl9vZmZzZXQgPSAwOwogCQkJYmktPmJ2X2xlbiA9IFBBR0VfU0laRTsKIAkJfQotCi0JCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKLQkJKytzZGV2LT5zdGF0LnJlYWRfZXJyb3JzOwotCQlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKIAkJZ290byBvdXQ7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBzYmlvLT5jb3VudDsgKytpKSB7CkBAIC00MjAsOCArODAxLDE0IEBACiAJCQlXQVJOX09OKDEpOwogCQl9CiAJCWt1bm1hcF9hdG9taWMoYnVmZmVyLCBLTV9VU0VSMCk7Ci0JCWlmIChyZXQpCi0JCQlzY3J1Yl9yZWNoZWNrX2Vycm9yKHNiaW8sIGkpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSBzY3J1Yl9yZWNoZWNrX2Vycm9yKHNiaW8sIGkpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlzcGluX2xvY2soJnNkZXYtPnN0YXRfbG9jayk7CisJCQkJKytzZGV2LT5zdGF0LnVudmVyaWZpZWRfZXJyb3JzOworCQkJCXNwaW5fdW5sb2NrKCZzZGV2LT5zdGF0X2xvY2spOworCQkJfQorCQl9CiAJfQogCiBvdXQ6CkBAIC01NTcsNTcgKzk0NCwyNyBAQAogc3RhdGljIGludCBzY3J1Yl9zdWJtaXQoc3RydWN0IHNjcnViX2RldiAqc2RldikKIHsKIAlzdHJ1Y3Qgc2NydWJfYmlvICpzYmlvOwotCXN0cnVjdCBiaW8gKmJpbzsKLQlpbnQgaTsKIAogCWlmIChzZGV2LT5jdXJyID09IC0xKQogCQlyZXR1cm4gMDsKIAogCXNiaW8gPSBzZGV2LT5iaW9zW3NkZXYtPmN1cnJdOwotCi0JYmlvID0gYmlvX2FsbG9jKEdGUF9OT0ZTLCBzYmlvLT5jb3VudCk7Ci0JaWYgKCFiaW8pCi0JCWdvdG8gbm9tZW07Ci0KLQliaW8tPmJpX3ByaXZhdGUgPSBzYmlvOwotCWJpby0+YmlfZW5kX2lvID0gc2NydWJfYmlvX2VuZF9pbzsKLQliaW8tPmJpX2JkZXYgPSBzZGV2LT5kZXYtPmJkZXY7Ci0JYmlvLT5iaV9zZWN0b3IgPSBzYmlvLT5waHlzaWNhbCA+PiA5OwotCi0JZm9yIChpID0gMDsgaSA8IHNiaW8tPmNvdW50OyArK2kpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCWludCByZXQ7Ci0KLQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX05PRlMpOwotCQlpZiAoIXBhZ2UpCi0JCQlnb3RvIG5vbWVtOwotCi0JCXJldCA9IGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfU0laRSwgMCk7Ci0JCWlmICghcmV0KSB7Ci0JCQlfX2ZyZWVfcGFnZShwYWdlKTsKLQkJCWdvdG8gbm9tZW07Ci0JCX0KLQl9Ci0KIAlzYmlvLT5lcnIgPSAwOwogCXNkZXYtPmN1cnIgPSAtMTsKIAlhdG9taWNfaW5jKCZzZGV2LT5pbl9mbGlnaHQpOwogCi0Jc3VibWl0X2JpbyhSRUFELCBiaW8pOworCXN1Ym1pdF9iaW8oUkVBRCwgc2Jpby0+YmlvKTsKIAogCXJldHVybiAwOwotCi1ub21lbToKLQlzY3J1Yl9mcmVlX2JpbyhiaW8pOwotCi0JcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyBpbnQgc2NydWJfcGFnZShzdHJ1Y3Qgc2NydWJfZGV2ICpzZGV2LCB1NjQgbG9naWNhbCwgdTY0IGxlbiwKLQkJICAgICAgdTY0IHBoeXNpY2FsLCB1NjQgZmxhZ3MsIHU2NCBnZW4sIHU2NCBtaXJyb3JfbnVtLAorCQkgICAgICB1NjQgcGh5c2ljYWwsIHU2NCBmbGFncywgdTY0IGdlbiwgaW50IG1pcnJvcl9udW0sCiAJCSAgICAgIHU4ICpjc3VtLCBpbnQgZm9yY2UpCiB7CiAJc3RydWN0IHNjcnViX2JpbyAqc2JpbzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgcmV0OwogCiBhZ2FpbjoKIAkvKgpAQCAtNjI4LDEyICs5ODUsMjIgQEAKIAl9CiAJc2JpbyA9IHNkZXYtPmJpb3Nbc2Rldi0+Y3Vycl07CiAJaWYgKHNiaW8tPmNvdW50ID09IDApIHsKKwkJc3RydWN0IGJpbyAqYmlvOworCiAJCXNiaW8tPnBoeXNpY2FsID0gcGh5c2ljYWw7CiAJCXNiaW8tPmxvZ2ljYWwgPSBsb2dpY2FsOworCQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIFNDUlVCX1BBR0VTX1BFUl9CSU8pOworCQlpZiAoIWJpbykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWJpby0+YmlfcHJpdmF0ZSA9IHNiaW87CisJCWJpby0+YmlfZW5kX2lvID0gc2NydWJfYmlvX2VuZF9pbzsKKwkJYmlvLT5iaV9iZGV2ID0gc2Rldi0+ZGV2LT5iZGV2OworCQliaW8tPmJpX3NlY3RvciA9IHNiaW8tPnBoeXNpY2FsID4+IDk7CisJCXNiaW8tPmVyciA9IDA7CisJCXNiaW8tPmJpbyA9IGJpbzsKIAl9IGVsc2UgaWYgKHNiaW8tPnBoeXNpY2FsICsgc2Jpby0+Y291bnQgKiBQQUdFX1NJWkUgIT0gcGh5c2ljYWwgfHwKIAkJICAgc2Jpby0+bG9naWNhbCArIHNiaW8tPmNvdW50ICogUEFHRV9TSVpFICE9IGxvZ2ljYWwpIHsKLQkJaW50IHJldDsKLQogCQlyZXQgPSBzY3J1Yl9zdWJtaXQoc2Rldik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpAQCAtNjQzLDYgKzEwMTAsMjAgQEAKIAlzYmlvLT5zcGFnW3NiaW8tPmNvdW50XS5nZW5lcmF0aW9uID0gZ2VuOwogCXNiaW8tPnNwYWdbc2Jpby0+Y291bnRdLmhhdmVfY3N1bSA9IDA7CiAJc2Jpby0+c3BhZ1tzYmlvLT5jb3VudF0ubWlycm9yX251bSA9IG1pcnJvcl9udW07CisKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9GUyk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGJpb19hZGRfcGFnZShzYmlvLT5iaW8sIHBhZ2UsIFBBR0VfU0laRSwgMCk7CisJaWYgKCFyZXQpIHsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXJldCA9IHNjcnViX3N1Ym1pdChzZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWdvdG8gYWdhaW47CisJfQorCiAJaWYgKGNzdW0pIHsKIAkJc2Jpby0+c3BhZ1tzYmlvLT5jb3VudF0uaGF2ZV9jc3VtID0gMTsKIAkJbWVtY3B5KHNiaW8tPnNwYWdbc2Jpby0+Y291bnRdLmNzdW0sIGNzdW0sIHNkZXYtPmNzdW1fc2l6ZSk7CkBAIC03MDEsNyArMTA4Miw3IEBACiAKIC8qIHNjcnViIGV4dGVudCB0cmllcyB0byBjb2xsZWN0IHVwIHRvIDY0IGtCIGZvciBlYWNoIGJpbyAqLwogc3RhdGljIGludCBzY3J1Yl9leHRlbnQoc3RydWN0IHNjcnViX2RldiAqc2RldiwgdTY0IGxvZ2ljYWwsIHU2NCBsZW4sCi0JCQl1NjQgcGh5c2ljYWwsIHU2NCBmbGFncywgdTY0IGdlbiwgdTY0IG1pcnJvcl9udW0pCisJCQl1NjQgcGh5c2ljYWwsIHU2NCBmbGFncywgdTY0IGdlbiwgaW50IG1pcnJvcl9udW0pCiB7CiAJaW50IHJldDsKIAl1OCBjc3VtW0JUUkZTX0NTVU1fU0laRV07CkBAIC03NDEsMTMgKzExMjIsMTYgQEAKIAlpbnQgc2xvdDsKIAlpbnQgaTsKIAl1NjQgbnN0cmlwZXM7Ci0JaW50IHN0YXJ0X3N0cmlwZTsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbDsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKIAl1NjQgcGh5c2ljYWw7CiAJdTY0IGxvZ2ljYWw7CiAJdTY0IGdlbmVyYXRpb247Ci0JdTY0IG1pcnJvcl9udW07CisJaW50IG1pcnJvcl9udW07CisJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJlYWRhMTsKKwlzdHJ1Y3QgcmVhZGFfY29udHJvbCAqcmVhZGEyOworCXN0cnVjdCBidHJmc19rZXkga2V5X3N0YXJ0OworCXN0cnVjdCBidHJmc19rZXkga2V5X2VuZDsKIAogCXU2NCBpbmNyZW1lbnQgPSBtYXAtPnN0cmlwZV9sZW47CiAJdTY0IG9mZnNldDsKQEAgLTc1OCwxMDIgKzExNDIsODggQEAKIAlpZiAobWFwLT50eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDApIHsKIAkJb2Zmc2V0ID0gbWFwLT5zdHJpcGVfbGVuICogbnVtOwogCQlpbmNyZW1lbnQgPSBtYXAtPnN0cmlwZV9sZW4gKiBtYXAtPm51bV9zdHJpcGVzOwotCQltaXJyb3JfbnVtID0gMDsKKwkJbWlycm9yX251bSA9IDE7CiAJfSBlbHNlIGlmIChtYXAtPnR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMTApIHsKIAkJaW50IGZhY3RvciA9IG1hcC0+bnVtX3N0cmlwZXMgLyBtYXAtPnN1Yl9zdHJpcGVzOwogCQlvZmZzZXQgPSBtYXAtPnN0cmlwZV9sZW4gKiAobnVtIC8gbWFwLT5zdWJfc3RyaXBlcyk7CiAJCWluY3JlbWVudCA9IG1hcC0+c3RyaXBlX2xlbiAqIGZhY3RvcjsKLQkJbWlycm9yX251bSA9IG51bSAlIG1hcC0+c3ViX3N0cmlwZXM7CisJCW1pcnJvcl9udW0gPSBudW0gJSBtYXAtPnN1Yl9zdHJpcGVzICsgMTsKIAl9IGVsc2UgaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxKSB7CiAJCWluY3JlbWVudCA9IG1hcC0+c3RyaXBlX2xlbjsKLQkJbWlycm9yX251bSA9IG51bSAlIG1hcC0+bnVtX3N0cmlwZXM7CisJCW1pcnJvcl9udW0gPSBudW0gJSBtYXAtPm51bV9zdHJpcGVzICsgMTsKIAl9IGVsc2UgaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX0RVUCkgewogCQlpbmNyZW1lbnQgPSBtYXAtPnN0cmlwZV9sZW47Ci0JCW1pcnJvcl9udW0gPSBudW0gJSBtYXAtPm51bV9zdHJpcGVzOworCQltaXJyb3JfbnVtID0gbnVtICUgbWFwLT5udW1fc3RyaXBlcyArIDE7CiAJfSBlbHNlIHsKIAkJaW5jcmVtZW50ID0gbWFwLT5zdHJpcGVfbGVuOwotCQltaXJyb3JfbnVtID0gMDsKKwkJbWlycm9yX251bSA9IDE7CiAJfQogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcGF0aC0+cmVhZGEgPSAyOwogCXBhdGgtPnNlYXJjaF9jb21taXRfcm9vdCA9IDE7CiAJcGF0aC0+c2tpcF9sb2NraW5nID0gMTsKIAogCS8qCi0JICogZmluZCBhbGwgZXh0ZW50cyBmb3IgZWFjaCBzdHJpcGUgYW5kIGp1c3QgcmVhZCB0aGVtIHRvIGdldAotCSAqIHRoZW0gaW50byB0aGUgcGFnZSBjYWNoZQotCSAqIEZJWE1FOiB3ZSBjYW4gZG8gYmV0dGVyLiBidWlsZCBhIG1vcmUgaW50ZWxsaWdlbnQgcHJlZmV0Y2hpbmcKKwkgKiB0cmlnZ2VyIHRoZSByZWFkYWhlYWQgZm9yIGV4dGVudCB0cmVlIGNzdW0gdHJlZSBhbmQgd2FpdCBmb3IKKwkgKiBjb21wbGV0aW9uLiBEdXJpbmcgcmVhZGFoZWFkLCB0aGUgc2NydWIgaXMgb2ZmaWNpYWxseSBwYXVzZWQKKwkgKiB0byBub3QgaG9sZCBvZmYgdHJhbnNhY3Rpb24gY29tbWl0cwogCSAqLwogCWxvZ2ljYWwgPSBiYXNlICsgb2Zmc2V0OwotCXBoeXNpY2FsID0gbWFwLT5zdHJpcGVzW251bV0ucGh5c2ljYWw7Ci0JcmV0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbnN0cmlwZXM7ICsraSkgewotCQlrZXkub2JqZWN0aWQgPSBsb2dpY2FsOwotCQlrZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWTsKLQkJa2V5Lm9mZnNldCA9ICh1NjQpMDsKIAotCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9ub3BsdWc7CisJd2FpdF9ldmVudChzZGV2LT5saXN0X3dhaXQsCisJCSAgIGF0b21pY19yZWFkKCZzZGV2LT5pbl9mbGlnaHQpID09IDApOworCWF0b21pY19pbmMoJmZzX2luZm8tPnNjcnVic19wYXVzZWQpOworCXdha2VfdXAoJmZzX2luZm8tPnNjcnViX3BhdXNlX3dhaXQpOwogCi0JCS8qCi0JCSAqIHdlIG1pZ2h0IG1pc3MgaGFsZiBhbiBleHRlbnQgaGVyZSwgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIsCi0JCSAqIGFzIGl0J3Mgb25seSB0aGUgcHJlZmV0Y2gKLQkJICovCi0JCXdoaWxlICgxKSB7Ci0JCQlsID0gcGF0aC0+bm9kZXNbMF07Ci0JCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07Ci0JCQlpZiAoc2xvdCA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsKSkgewotCQkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKLQkJCQlpZiAocmV0ID09IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlnb3RvIG91dF9ub3BsdWc7CisJLyogRklYTUUgaXQgbWlnaHQgYmUgYmV0dGVyIHRvIHN0YXJ0IHJlYWRhaGVhZCBhdCBjb21taXQgcm9vdCAqLworCWtleV9zdGFydC5vYmplY3RpZCA9IGxvZ2ljYWw7CisJa2V5X3N0YXJ0LnR5cGUgPSBCVFJGU19FWFRFTlRfSVRFTV9LRVk7CisJa2V5X3N0YXJ0Lm9mZnNldCA9ICh1NjQpMDsKKwlrZXlfZW5kLm9iamVjdGlkID0gYmFzZSArIG9mZnNldCArIG5zdHJpcGVzICogaW5jcmVtZW50OworCWtleV9lbmQudHlwZSA9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWTsKKwlrZXlfZW5kLm9mZnNldCA9ICh1NjQpMDsKKwlyZWFkYTEgPSBidHJmc19yZWFkYV9hZGQocm9vdCwgJmtleV9zdGFydCwgJmtleV9lbmQpOwogCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlidHJmc19pdGVtX2tleV90b19jcHUobCwgJmtleSwgc2xvdCk7CisJa2V5X3N0YXJ0Lm9iamVjdGlkID0gQlRSRlNfRVhURU5UX0NTVU1fT0JKRUNUSUQ7CisJa2V5X3N0YXJ0LnR5cGUgPSBCVFJGU19FWFRFTlRfQ1NVTV9LRVk7CisJa2V5X3N0YXJ0Lm9mZnNldCA9IGxvZ2ljYWw7CisJa2V5X2VuZC5vYmplY3RpZCA9IEJUUkZTX0VYVEVOVF9DU1VNX09CSkVDVElEOworCWtleV9lbmQudHlwZSA9IEJUUkZTX0VYVEVOVF9DU1VNX0tFWTsKKwlrZXlfZW5kLm9mZnNldCA9IGJhc2UgKyBvZmZzZXQgKyBuc3RyaXBlcyAqIGluY3JlbWVudDsKKwlyZWFkYTIgPSBidHJmc19yZWFkYV9hZGQoY3N1bV9yb290LCAma2V5X3N0YXJ0LCAma2V5X2VuZCk7CiAKLQkJCWlmIChrZXkub2JqZWN0aWQgPj0gbG9naWNhbCArIG1hcC0+c3RyaXBlX2xlbikKLQkJCQlicmVhazsKKwlpZiAoIUlTX0VSUihyZWFkYTEpKQorCQlidHJmc19yZWFkYV93YWl0KHJlYWRhMSk7CisJaWYgKCFJU19FUlIocmVhZGEyKSkKKwkJYnRyZnNfcmVhZGFfd2FpdChyZWFkYTIpOwogCi0JCQlwYXRoLT5zbG90c1swXSsrOwotCQl9Ci0JCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKLQkJbG9naWNhbCArPSBpbmNyZW1lbnQ7Ci0JCXBoeXNpY2FsICs9IG1hcC0+c3RyaXBlX2xlbjsKLQkJY29uZF9yZXNjaGVkKCk7CisJbXV0ZXhfbG9jaygmZnNfaW5mby0+c2NydWJfbG9jayk7CisJd2hpbGUgKGF0b21pY19yZWFkKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV9yZXEpKSB7CisJCW11dGV4X3VubG9jaygmZnNfaW5mby0+c2NydWJfbG9jayk7CisJCXdhaXRfZXZlbnQoZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCwKKwkJICAgYXRvbWljX3JlYWQoJmZzX2luZm8tPnNjcnViX3BhdXNlX3JlcSkgPT0gMCk7CisJCW11dGV4X2xvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwogCX0KKwlhdG9taWNfZGVjKCZmc19pbmZvLT5zY3J1YnNfcGF1c2VkKTsKKwltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOworCXdha2VfdXAoJmZzX2luZm8tPnNjcnViX3BhdXNlX3dhaXQpOwogCiAJLyoKIAkgKiBjb2xsZWN0IGFsbCBkYXRhIGNzdW1zIGZvciB0aGUgc3RyaXBlIHRvIGF2b2lkIHNlZWtpbmcgZHVyaW5nCiAJICogdGhlIHNjcnViLiBUaGlzIG1pZ2h0IGN1cnJlbnRseSAoY3JjMzIpIGVuZCB1cCB0byBiZSBhYm91dCAxTUIKIAkgKi8KLQlzdGFydF9zdHJpcGUgPSAwOwogCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKLWFnYWluOgotCWxvZ2ljYWwgPSBiYXNlICsgb2Zmc2V0ICsgc3RhcnRfc3RyaXBlICogaW5jcmVtZW50OwotCWZvciAoaSA9IHN0YXJ0X3N0cmlwZTsgaSA8IG5zdHJpcGVzOyArK2kpIHsKLQkJcmV0ID0gYnRyZnNfbG9va3VwX2NzdW1zX3JhbmdlKGNzdW1fcm9vdCwgbG9naWNhbCwKLQkJCQkJICAgICAgIGxvZ2ljYWwgKyBtYXAtPnN0cmlwZV9sZW4gLSAxLAotCQkJCQkgICAgICAgJnNkZXYtPmNzdW1fbGlzdCwgMSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKIAotCQlsb2dpY2FsICs9IGluY3JlbWVudDsKLQkJY29uZF9yZXNjaGVkKCk7Ci0JfQogCS8qCiAJICogbm93IGZpbmQgYWxsIGV4dGVudHMgZm9yIGVhY2ggc3RyaXBlIGFuZCBzY3J1YiB0aGVtCiAJICovCi0JbG9naWNhbCA9IGJhc2UgKyBvZmZzZXQgKyBzdGFydF9zdHJpcGUgKiBpbmNyZW1lbnQ7Ci0JcGh5c2ljYWwgPSBtYXAtPnN0cmlwZXNbbnVtXS5waHlzaWNhbCArIHN0YXJ0X3N0cmlwZSAqIG1hcC0+c3RyaXBlX2xlbjsKKwlsb2dpY2FsID0gYmFzZSArIG9mZnNldDsKKwlwaHlzaWNhbCA9IG1hcC0+c3RyaXBlc1tudW1dLnBoeXNpY2FsOwogCXJldCA9IDA7Ci0JZm9yIChpID0gc3RhcnRfc3RyaXBlOyBpIDwgbnN0cmlwZXM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBuc3RyaXBlczsgKytpKSB7CiAJCS8qCiAJCSAqIGNhbmNlbGVkPwogCQkgKi8KQEAgLTg4MiwxMSArMTI1MiwxNCBAQAogCQkJYXRvbWljX2RlYygmZnNfaW5mby0+c2NydWJzX3BhdXNlZCk7CiAJCQltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwogCQkJd2FrZV91cCgmZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCk7Ci0JCQlzY3J1Yl9mcmVlX2NzdW1zKHNkZXYpOwotCQkJc3RhcnRfc3RyaXBlID0gaTsKLQkJCWdvdG8gYWdhaW47CiAJCX0KIAorCQlyZXQgPSBidHJmc19sb29rdXBfY3N1bXNfcmFuZ2UoY3N1bV9yb290LCBsb2dpY2FsLAorCQkJCQkgICAgICAgbG9naWNhbCArIG1hcC0+c3RyaXBlX2xlbiAtIDEsCisJCQkJCSAgICAgICAmc2Rldi0+Y3N1bV9saXN0LCAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCiAJCWtleS5vYmplY3RpZCA9IGxvZ2ljYWw7CiAJCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0lURU1fS0VZOwogCQlrZXkub2Zmc2V0ID0gKHU2NCkwOwpAQCAtOTgyLDcgKzEzNTUsNiBAQAogCiBvdXQ6CiAJYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKLW91dF9ub3BsdWc6CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0KQEAgLTEyNTMsMTAgKzE2MjUsMTEgQEAKIAkJcmV0ID0gc2NydWJfZW51bWVyYXRlX2NodW5rcyhzZGV2LCBzdGFydCwgZW5kKTsKIAogCXdhaXRfZXZlbnQoc2Rldi0+bGlzdF93YWl0LCBhdG9taWNfcmVhZCgmc2Rldi0+aW5fZmxpZ2h0KSA9PSAwKTsKLQogCWF0b21pY19kZWMoJmZzX2luZm8tPnNjcnVic19ydW5uaW5nKTsKIAl3YWtlX3VwKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV93YWl0KTsKIAorCXdhaXRfZXZlbnQoc2Rldi0+bGlzdF93YWl0LCBhdG9taWNfcmVhZCgmc2Rldi0+Zml4dXBfY250KSA9PSAwKTsKKwogCWlmIChwcm9ncmVzcykKIAkJbWVtY3B5KHByb2dyZXNzLCAmc2Rldi0+c3RhdCwgc2l6ZW9mKCpwcm9ncmVzcykpOwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy9zdXBlci5jIGIvZnMvYnRyZnMvc3VwZXIuYwppbmRleCAxNTYzNGQ0Li44YmQ5ZDZkIDEwMDY0NAotLS0gYS9mcy9idHJmcy9zdXBlci5jCisrKyBiL2ZzL2J0cmZzL3N1cGVyLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGVhbmNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgImNvbXBhdC5oIgogI2luY2x1ZGUgImRlbGF5ZWQtaW5vZGUuaCIKICNpbmNsdWRlICJjdHJlZS5oIgpAQCAtNTgsNiArNTksNyBAQAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9idHJmcy5oPgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYnRyZnNfc3VwZXJfb3BzOworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJ0cmZzX2ZzX3R5cGU7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpidHJmc19kZWNvZGVfZXJyb3Ioc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIGludCBlcnJubywKIAkJCQkgICAgICBjaGFyIG5idWZbMTZdKQpAQCAtMTYyLDcgKzE2NCw3IEBACiAJT3B0X25vdHJlZWxvZywgT3B0X3JhdGlvLCBPcHRfZmx1c2hvbmNvbW1pdCwgT3B0X2Rpc2NhcmQsCiAJT3B0X3NwYWNlX2NhY2hlLCBPcHRfY2xlYXJfY2FjaGUsIE9wdF91c2VyX3N1YnZvbF9ybV9hbGxvd2VkLAogCU9wdF9lbm9zcGNfZGVidWcsIE9wdF9zdWJ2b2xyb290aWQsIE9wdF9kZWZyYWcsCi0JT3B0X2lub2RlX2NhY2hlLCBPcHRfZXJyLAorCU9wdF9pbm9kZV9jYWNoZSwgT3B0X25vX3NwYWNlX2NhY2hlLCBPcHRfcmVjb3ZlcnksIE9wdF9lcnIsCiB9OwogCiBzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC0xOTUsNiArMTk3LDggQEAKIAl7T3B0X3N1YnZvbHJvb3RpZCwgInN1YnZvbHJvb3RpZD0lZCJ9LAogCXtPcHRfZGVmcmFnLCAiYXV0b2RlZnJhZyJ9LAogCXtPcHRfaW5vZGVfY2FjaGUsICJpbm9kZV9jYWNoZSJ9LAorCXtPcHRfbm9fc3BhY2VfY2FjaGUsICJub3NwYWNlX2NhY2hlIn0sCisJe09wdF9yZWNvdmVyeSwgInJlY292ZXJ5In0sCiAJe09wdF9lcnIsIE5VTEx9LAogfTsKIApAQCAtMjA2LDE0ICsyMTAsMTkgQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IHJvb3QtPmZzX2luZm87CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwotCWNoYXIgKnAsICpudW0sICpvcmlnOworCWNoYXIgKnAsICpudW0sICpvcmlnID0gTlVMTDsKKwl1NjQgY2FjaGVfZ2VuOwogCWludCBpbnRhcmc7CiAJaW50IHJldCA9IDA7CiAJY2hhciAqY29tcHJlc3NfdHlwZTsKIAlib29sIGNvbXByZXNzX2ZvcmNlID0gZmFsc2U7CiAKKwljYWNoZV9nZW4gPSBidHJmc19zdXBlcl9jYWNoZV9nZW5lcmF0aW9uKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWlmIChjYWNoZV9nZW4pCisJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBTUEFDRV9DQUNIRSk7CisKIAlpZiAoIW9wdGlvbnMpCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCS8qCiAJICogc3Ryc2VwIGNoYW5nZXMgdGhlIHN0cmluZywgZHVwbGljYXRlIGl0IGJlY2F1c2UgcGFyc2Vfb3B0aW9ucwpAQCAtMzYwLDkgKzM2OSwxMiBAQAogCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIERJU0NBUkQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3NwYWNlX2NhY2hlOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGRpc2sgc3BhY2UgY2FjaGluZ1xuIik7CiAJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgU1BBQ0VfQ0FDSEUpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vX3NwYWNlX2NhY2hlOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGRpc2FibGluZyBkaXNrIHNwYWNlIGNhY2hpbmdcbiIpOworCQkJYnRyZnNfY2xlYXJfb3B0KGluZm8tPm1vdW50X29wdCwgU1BBQ0VfQ0FDSEUpOworCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2lub2RlX2NhY2hlOgogCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGlub2RlIG1hcCBjYWNoaW5nXG4iKTsKIAkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBJTk9ERV9NQVBfQ0FDSEUpOwpAQCAtMzgxLDYgKzM5MywxMCBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGF1dG8gZGVmcmFnIik7CiAJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgQVVUT19ERUZSQUcpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X3JlY292ZXJ5OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGF1dG8gcmVjb3ZlcnkiKTsKKwkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBSRUNPVkVSWSk7CisJCQlicmVhazsKIAkJY2FzZSBPcHRfZXJyOgogCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHVucmVjb2duaXplZCBtb3VudCBvcHRpb24gIgogCQkJICAgICAgICInJXMnXG4iLCBwKTsKQEAgLTM5MSw2ICs0MDcsOCBAQAogCQl9CiAJfQogb3V0OgorCWlmICghcmV0ICYmIGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIFNQQUNFX0NBQ0hFKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGRpc2sgc3BhY2UgY2FjaGluZyBpcyBlbmFibGVkXG4iKTsKIAlrZnJlZShvcmlnKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDA2LDEyICs0MjQsMTIgQEAKIAkJdTY0ICpzdWJ2b2xfcm9vdGlkLCBzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqKmZzX2RldmljZXMpCiB7CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwotCWNoYXIgKm9wdHMsICpvcmlnLCAqcDsKKwljaGFyICpkZXZpY2VfbmFtZSwgKm9wdHMsICpvcmlnLCAqcDsKIAlpbnQgZXJyb3IgPSAwOwogCWludCBpbnRhcmc7CiAKIAlpZiAoIW9wdGlvbnMpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAogCS8qCiAJICogc3Ryc2VwIGNoYW5nZXMgdGhlIHN0cmluZywgZHVwbGljYXRlIGl0IGJlY2F1c2UgcGFyc2Vfb3B0aW9ucwpAQCAtNDMwLDYgKzQ0OCw3IEBACiAJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKIAkJc3dpdGNoICh0b2tlbikgewogCQljYXNlIE9wdF9zdWJ2b2w6CisJCQlrZnJlZSgqc3Vidm9sX25hbWUpOwogCQkJKnN1YnZvbF9uYW1lID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9zdWJ2b2xpZDoKQEAgLTQ1NywyOSArNDc2LDI0IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGV2aWNlOgotCQkJZXJyb3IgPSBidHJmc19zY2FuX29uZV9kZXZpY2UobWF0Y2hfc3RyZHVwKCZhcmdzWzBdKSwKKwkJCWRldmljZV9uYW1lID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKKwkJCWlmICghZGV2aWNlX25hbWUpIHsKKwkJCQllcnJvciA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQllcnJvciA9IGJ0cmZzX3NjYW5fb25lX2RldmljZShkZXZpY2VfbmFtZSwKIAkJCQkJZmxhZ3MsIGhvbGRlciwgZnNfZGV2aWNlcyk7CisJCQlrZnJlZShkZXZpY2VfbmFtZSk7CiAJCQlpZiAoZXJyb3IpCi0JCQkJZ290byBvdXRfZnJlZV9vcHRzOworCQkJCWdvdG8gb3V0OwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQogCX0KIAotIG91dF9mcmVlX29wdHM6CitvdXQ6CiAJa2ZyZWUob3JpZyk7Ci0gb3V0OgotCS8qCi0JICogSWYgbm8gc3Vidm9sdW1lIG5hbWUgaXMgc3BlY2lmaWVkIHdlIHVzZSB0aGUgZGVmYXVsdCBvbmUuICBBbGxvY2F0ZQotCSAqIGEgY29weSBvZiB0aGUgc3RyaW5nICIuIiBoZXJlIHNvIHRoYXQgY29kZSBsYXRlciBpbiB0aGUKLQkgKiBtb3VudCBwYXRoIGRvZXNuJ3QgY2FyZSBpZiBpdCdzIHRoZSBkZWZhdWx0IHZvbHVtZSBvciBhbm90aGVyIG9uZS4KLQkgKi8KLQlpZiAoISpzdWJ2b2xfbmFtZSkgewotCQkqc3Vidm9sX25hbWUgPSBrc3RyZHVwKCIuIiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghKnN1YnZvbF9uYW1lKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNDkyLDcgKzUwNiw2IEBACiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CiAJc3RydWN0IGJ0cmZzX2tleSBsb2NhdGlvbjsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAl1NjQgZGlyX2lkOwogCWludCBuZXcgPSAwOwogCkBAIC01MTcsNyArNTMwLDcgQEAKIAkgKiB3aWxsIG1vdW50IGJ5IGRlZmF1bHQgaWYgd2UgaGF2ZW4ndCBiZWVuIGdpdmVuIGEgc3BlY2lmaWMgc3Vidm9sdW1lCiAJICogdG8gbW91bnQuCiAJICovCi0JZGlyX2lkID0gYnRyZnNfc3VwZXJfcm9vdF9kaXIoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWRpcl9pZCA9IGJ0cmZzX3N1cGVyX3Jvb3RfZGlyKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWRpID0gYnRyZnNfbG9va3VwX2Rpcl9pdGVtKE5VTEwsIHJvb3QsIHBhdGgsIGRpcl9pZCwgImRlZmF1bHQiLCA3LCAwKTsKIAlpZiAoSVNfRVJSKGRpKSkgewogCQlidHJmc19mcmVlX3BhdGgocGF0aCk7CkBAIC01NjYsMjkgKzU3OSw3IEBACiAJCXJldHVybiBkZ2V0KHNiLT5zX3Jvb3QpOwogCX0KIAotCWlmIChuZXcpIHsKLQkJY29uc3Qgc3RydWN0IHFzdHIgbmFtZSA9IHsgLm5hbWUgPSAiLyIsIC5sZW4gPSAxIH07Ci0KLQkJLyoKLQkJICogTmV3IGlub2RlLCB3ZSBuZWVkIHRvIG1ha2UgdGhlIGRlbnRyeSBhIHNpYmxpbmcgb2Ygc19yb290IHNvCi0JCSAqIGV2ZXJ5dGhpbmcgZ2V0cyBjbGVhbmVkIHVwIHByb3Blcmx5IG9uIHVubW91bnQuCi0JCSAqLwotCQlkZW50cnkgPSBkX2FsbG9jKHNiLT5zX3Jvb3QsICZuYW1lKTsKLQkJaWYgKCFkZW50cnkpIHsKLQkJCWlwdXQoaW5vZGUpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JCX0KLQkJZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogV2UgZm91bmQgdGhlIGlub2RlIGluIGNhY2hlLCBqdXN0IGZpbmQgYSBkZW50cnkgZm9yIGl0IGFuZAotCQkgKiBwdXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgd2UganVzdCBnb3QuCi0JCSAqLwotCQlkZW50cnkgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOwotCQlpcHV0KGlub2RlKTsKLQl9Ci0KLQlyZXR1cm4gZGVudHJ5OworCXJldHVybiBkX29idGFpbl9hbGlhcyhpbm9kZSk7CiB9CiAKIHN0YXRpYyBpbnQgYnRyZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtNzE5LDYgKzcxMCw4IEBACiAJCXNlcV9wdXRzKHNlcSwgIixub2FjbCIpOwogCWlmIChidHJmc190ZXN0X29wdChyb290LCBTUEFDRV9DQUNIRSkpCiAJCXNlcV9wdXRzKHNlcSwgIixzcGFjZV9jYWNoZSIpOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiLG5vc3BhY2VfY2FjaGUiKTsKIAlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgQ0xFQVJfQ0FDSEUpKQogCQlzZXFfcHV0cyhzZXEsICIsY2xlYXJfY2FjaGUiKTsKIAlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgVVNFUl9TVUJWT0xfUk1fQUxMT1dFRCkpCkBAIC03NTMsNiArNzQ2LDEzNyBAQAogCXJldHVybiBzZXRfYW5vbl9zdXBlcihzLCBkYXRhKTsKIH0KIAorLyoKKyAqIHN1YnZvbHVtZXMgYXJlIGlkZW50aWZpZWQgYnkgaW5vIDI1NgorICovCitzdGF0aWMgaW5saW5lIGludCBpc19zdWJ2b2x1bWVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoaW5vZGUgJiYgaW5vZGUtPmlfaW5vID09IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyB3aWxsIHN0cmlwIG91dCB0aGUgc3Vidm9sPSVzIGFyZ3VtZW50IGZvciBhbiBhcmd1bWVudCBzdHJpbmcgYW5kIGFkZAorICogc3Vidm9saWQ9MCB0byBtYWtlIHN1cmUgd2UgZ2V0IHRoZSBhY3R1YWwgdHJlZSByb290IGZvciBwYXRoIHdhbGtpbmcgdG8gdGhlCisgKiBzdWJ2b2wgd2Ugd2FudC4KKyAqLworc3RhdGljIGNoYXIgKnNldHVwX3Jvb3RfYXJncyhjaGFyICphcmdzKQoreworCXVuc2lnbmVkIGNvcGllZCA9IDA7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKGFyZ3MpICsgMjsKKwljaGFyICpwb3M7CisJY2hhciAqcmV0OworCisJLyoKKwkgKiBXZSBuZWVkIHRoZSBzYW1lIGFyZ3MgYXMgYmVmb3JlLCBidXQgbWludXMKKwkgKgorCSAqIHN1YnZvbD1hCisJICoKKwkgKiBhbmQgYWRkCisJICoKKwkgKiBzdWJ2b2xpZD0wCisJICoKKwkgKiB3aGljaCBpcyBhIGRpZmZlcmVuY2Ugb2YgMiBjaGFyYWN0ZXJzLCBzbyB3ZSBhbGxvY2F0ZSBzdHJsZW4oYXJncykgKworCSAqIDIgY2hhcmFjdGVycy4KKwkgKi8KKwlyZXQgPSBremFsbG9jKGxlbiAqIHNpemVvZihjaGFyKSwgR0ZQX05PRlMpOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKwlwb3MgPSBzdHJzdHIoYXJncywgInN1YnZvbD0iKTsKKworCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZS4uICovCisJaWYgKCFwb3MpIHsKKwkJa2ZyZWUocmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBUaGUgc3Vidm9sPTw+IGFyZyBpcyBub3QgYXQgdGhlIGZyb250IG9mIHRoZSBzdHJpbmcsIGNvcHkgZXZlcnlib2R5CisJICogdXAgdG8gdGhhdCBpbnRvIHJldC4KKwkgKi8KKwlpZiAocG9zICE9IGFyZ3MpIHsKKwkJKnBvcyA9ICdcMCc7CisJCXN0cmNweShyZXQsIGFyZ3MpOworCQljb3BpZWQgKz0gc3RybGVuKGFyZ3MpOworCQlwb3MrKzsKKwl9CisKKwlzdHJuY3B5KHJldCArIGNvcGllZCwgInN1YnZvbGlkPTAiLCBsZW4gLSBjb3BpZWQpOworCisJLyogTGVuZ3RoIG9mIHN1YnZvbGlkPTAgKi8KKwljb3BpZWQgKz0gMTA7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vICwgYWZ0ZXIgdGhlIHN1YnZvbD0gb3B0aW9uIHRoZW4gd2Uga25vdyB0aGVyZSdzIG5vCisJICogb3RoZXIgb3B0aW9ucyBhbmQgd2UgY2FuIGp1c3QgcmV0dXJuLgorCSAqLworCXBvcyA9IHN0cmNocihwb3MsICcsJyk7CisJaWYgKCFwb3MpCisJCXJldHVybiByZXQ7CisKKwkvKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgaW50byBvdXIgYnVmZmVyICovCisJc3RybmNweShyZXQgKyBjb3BpZWQsIHBvcywgbGVuIC0gY29waWVkKTsKKwljb3BpZWQgKz0gc3RybGVuKHBvcyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbW91bnRfc3Vidm9sKGNvbnN0IGNoYXIgKnN1YnZvbF9uYW1lLCBpbnQgZmxhZ3MsCisJCQkJICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zX3ByaXZhdGU7CisJY2hhciAqbmV3YXJnczsKKwlzdHJ1Y3QgcGF0aCBwYXRoOworCWludCBlcnJvcjsKKworCW5ld2FyZ3MgPSBzZXR1cF9yb290X2FyZ3MoZGF0YSk7CisJaWYgKCFuZXdhcmdzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwltbnQgPSB2ZnNfa2Vybl9tb3VudCgmYnRyZnNfZnNfdHlwZSwgZmxhZ3MsIGRldmljZV9uYW1lLAorCQkJICAgICBuZXdhcmdzKTsKKwlrZnJlZShuZXdhcmdzKTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCXJldHVybiBFUlJfQ0FTVChtbnQpOworCisJbnNfcHJpdmF0ZSA9IGNyZWF0ZV9tbnRfbnMobW50KTsKKwlpZiAoSVNfRVJSKG5zX3ByaXZhdGUpKSB7CisJCW1udHB1dChtbnQpOworCQlyZXR1cm4gRVJSX0NBU1QobnNfcHJpdmF0ZSk7CisJfQorCisJLyoKKwkgKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgYXV0b21vdW50IG9mIHRoZSBzdWJ2b2wgc28gd2UgY2FuIGp1c3QKKwkgKiBkcm9wIHRoZSBtbnQgd2UgaGF2ZSBoZXJlIGFuZCByZXR1cm4gdGhlIGRlbnRyeSB0aGF0IHdlCisJICogZm91bmQuCisJICovCisJZXJyb3IgPSB2ZnNfcGF0aF9sb29rdXAobW50LT5tbnRfcm9vdCwgbW50LCBzdWJ2b2xfbmFtZSwKKwkJCQlMT09LVVBfRk9MTE9XLCAmcGF0aCk7CisJcHV0X21udF9ucyhuc19wcml2YXRlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKworCWlmICghaXNfc3Vidm9sdW1lX2lub2RlKHBhdGguZGVudHJ5LT5kX2lub2RlKSkgeworCQlwYXRoX3B1dCgmcGF0aCk7CisJCW1udHB1dChtbnQpOworCQllcnJvciA9IC1FSU5WQUw7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6ICclcycgaXMgbm90IGEgdmFsaWQgc3Vidm9sdW1lXG4iLAorCQkJCXN1YnZvbF9uYW1lKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJLyogR2V0IGEgcmVmIHRvIHRoZSBzYiBhbmQgdGhlIGRlbnRyeSB3ZSBmb3VuZCBhbmQgcmV0dXJuIGl0ICovCisJcyA9IHBhdGgubW50LT5tbnRfc2I7CisJYXRvbWljX2luYygmcy0+c19hY3RpdmUpOworCXJvb3QgPSBkZ2V0KHBhdGguZGVudHJ5KTsKKwlwYXRoX3B1dCgmcGF0aCk7CisJZG93bl93cml0ZSgmcy0+c191bW91bnQpOworCisJcmV0dXJuIHJvb3Q7Cit9CiAKIC8qCiAgKiBGaW5kIGEgc3VwZXJibG9jayBmb3IgdGhlIGdpdmVuIGRldmljZSAvIG1vdW50IHBvaW50LgpAQCAtNzY3LDcgKzg5MSw2IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzOwogCXN0cnVjdCBkZW50cnkgKnJvb3Q7CiAJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMgPSBOVUxMOwotCXN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QgPSBOVUxMOwogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gTlVMTDsKIAlmbW9kZV90IG1vZGUgPSBGTU9ERV9SRUFEOwogCWNoYXIgKnN1YnZvbF9uYW1lID0gTlVMTDsKQEAgLTc4MSwyMSArOTA0LDIwIEBACiAJZXJyb3IgPSBidHJmc19wYXJzZV9lYXJseV9vcHRpb25zKGRhdGEsIG1vZGUsIGZzX3R5cGUsCiAJCQkJCSAgJnN1YnZvbF9uYW1lLCAmc3Vidm9sX29iamVjdGlkLAogCQkJCQkgICZzdWJ2b2xfcm9vdGlkLCAmZnNfZGV2aWNlcyk7Ci0JaWYgKGVycm9yKQorCWlmIChlcnJvcikgeworCQlrZnJlZShzdWJ2b2xfbmFtZSk7CiAJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwl9CisKKwlpZiAoc3Vidm9sX25hbWUpIHsKKwkJcm9vdCA9IG1vdW50X3N1YnZvbChzdWJ2b2xfbmFtZSwgZmxhZ3MsIGRldmljZV9uYW1lLCBkYXRhKTsKKwkJa2ZyZWUoc3Vidm9sX25hbWUpOworCQlyZXR1cm4gcm9vdDsKKwl9CiAKIAllcnJvciA9IGJ0cmZzX3NjYW5fb25lX2RldmljZShkZXZpY2VfbmFtZSwgbW9kZSwgZnNfdHlwZSwgJmZzX2RldmljZXMpOwogCWlmIChlcnJvcikKLQkJZ290byBlcnJvcl9mcmVlX3N1YnZvbF9uYW1lOwotCi0JZXJyb3IgPSBidHJmc19vcGVuX2RldmljZXMoZnNfZGV2aWNlcywgbW9kZSwgZnNfdHlwZSk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGVycm9yX2ZyZWVfc3Vidm9sX25hbWU7Ci0KLQlpZiAoIShmbGFncyAmIE1TX1JET05MWSkgJiYgZnNfZGV2aWNlcy0+cndfZGV2aWNlcyA9PSAwKSB7Ci0JCWVycm9yID0gLUVBQ0NFUzsKLQkJZ290byBlcnJvcl9jbG9zZV9kZXZpY2VzOwotCX0KKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogCiAJLyoKIAkgKiBTZXR1cCBhIGR1bW15IHJvb3QgYW5kIGZzX2luZm8gZm9yIHRlc3Qvc2V0IHN1cGVyLiAgVGhpcyBpcyBiZWNhdXNlCkBAIC04MDQsMTkgKzkyNiw0MCBAQAogCSAqIHRoZW4gb3Blbl9jdHJlZSB3aWxsIHByb3Blcmx5IGluaXRpYWxpemUgZXZlcnl0aGluZyBsYXRlci4KIAkgKi8KIAlmc19pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX2ZzX2luZm8pLCBHRlBfTk9GUyk7Ci0JdHJlZV9yb290ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX3Jvb3QpLCBHRlBfTk9GUyk7Ci0JaWYgKCFmc19pbmZvIHx8ICF0cmVlX3Jvb3QpIHsKKwlpZiAoIWZzX2luZm8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZnNfaW5mby0+dHJlZV9yb290ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX3Jvb3QpLCBHRlBfTk9GUyk7CisJaWYgKCFmc19pbmZvLT50cmVlX3Jvb3QpIHsKIAkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZzX2luZm87CisJfQorCWZzX2luZm8tPnRyZWVfcm9vdC0+ZnNfaW5mbyA9IGZzX2luZm87CisJZnNfaW5mby0+ZnNfZGV2aWNlcyA9IGZzX2RldmljZXM7CisKKwlmc19pbmZvLT5zdXBlcl9jb3B5ID0ga3phbGxvYyhCVFJGU19TVVBFUl9JTkZPX1NJWkUsIEdGUF9OT0ZTKTsKKwlmc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0ID0ga3phbGxvYyhCVFJGU19TVVBFUl9JTkZPX1NJWkUsIEdGUF9OT0ZTKTsKKwlpZiAoIWZzX2luZm8tPnN1cGVyX2NvcHkgfHwgIWZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZzX2luZm87CisJfQorCisJZXJyb3IgPSBidHJmc19vcGVuX2RldmljZXMoZnNfZGV2aWNlcywgbW9kZSwgZnNfdHlwZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yX2ZzX2luZm87CisKKwlpZiAoIShmbGFncyAmIE1TX1JET05MWSkgJiYgZnNfZGV2aWNlcy0+cndfZGV2aWNlcyA9PSAwKSB7CisJCWVycm9yID0gLUVBQ0NFUzsKIAkJZ290byBlcnJvcl9jbG9zZV9kZXZpY2VzOwogCX0KLQlmc19pbmZvLT50cmVlX3Jvb3QgPSB0cmVlX3Jvb3Q7Ci0JZnNfaW5mby0+ZnNfZGV2aWNlcyA9IGZzX2RldmljZXM7Ci0JdHJlZV9yb290LT5mc19pbmZvID0gZnNfaW5mbzsKIAogCWJkZXYgPSBmc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKLQlzID0gc2dldChmc190eXBlLCBidHJmc190ZXN0X3N1cGVyLCBidHJmc19zZXRfc3VwZXIsIHRyZWVfcm9vdCk7Ci0JaWYgKElTX0VSUihzKSkKLQkJZ290byBlcnJvcl9zOworCXMgPSBzZ2V0KGZzX3R5cGUsIGJ0cmZzX3Rlc3Rfc3VwZXIsIGJ0cmZzX3NldF9zdXBlciwKKwkJIGZzX2luZm8tPnRyZWVfcm9vdCk7CisJaWYgKElTX0VSUihzKSkgeworCQllcnJvciA9IFBUUl9FUlIocyk7CisJCWdvdG8gZXJyb3JfY2xvc2VfZGV2aWNlczsKKwl9CiAKIAlpZiAocy0+c19yb290KSB7CiAJCWlmICgoZmxhZ3MgXiBzLT5zX2ZsYWdzKSAmIE1TX1JET05MWSkgewpAQCAtODI2LDc1ICs5NjksMzUgQEAKIAkJfQogCiAJCWJ0cmZzX2Nsb3NlX2RldmljZXMoZnNfZGV2aWNlcyk7Ci0JCWtmcmVlKGZzX2luZm8pOwotCQlrZnJlZSh0cmVlX3Jvb3QpOworCQlmcmVlX2ZzX2luZm8oZnNfaW5mbyk7CiAJfSBlbHNlIHsKIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCiAJCXMtPnNfZmxhZ3MgPSBmbGFncyB8IE1TX05PU0VDOwogCQlzdHJsY3B5KHMtPnNfaWQsIGJkZXZuYW1lKGJkZXYsIGIpLCBzaXplb2Yocy0+c19pZCkpOworCQlidHJmc19zYihzKS0+ZnNfaW5mby0+YmRldl9ob2xkZXIgPSBmc190eXBlOwogCQllcnJvciA9IGJ0cmZzX2ZpbGxfc3VwZXIocywgZnNfZGV2aWNlcywgZGF0YSwKIAkJCQkJIGZsYWdzICYgTVNfU0lMRU5UID8gMSA6IDApOwogCQlpZiAoZXJyb3IpIHsKIAkJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwotCQkJZ290byBlcnJvcl9mcmVlX3N1YnZvbF9uYW1lOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogCQl9CiAKLQkJYnRyZnNfc2IocyktPmZzX2luZm8tPmJkZXZfaG9sZGVyID0gZnNfdHlwZTsKIAkJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CiAJfQogCi0JLyogaWYgdGhleSBnYXZlIHVzIGEgc3Vidm9sdW1lIG5hbWUgYmluZCBtb3VudCBpbnRvIHRoYXQgKi8KLQlpZiAoc3RyY21wKHN1YnZvbF9uYW1lLCAiLiIpKSB7Ci0JCXN0cnVjdCBkZW50cnkgKm5ld19yb290OwotCi0JCXJvb3QgPSBnZXRfZGVmYXVsdF9yb290KHMsIHN1YnZvbF9yb290aWQpOwotCQlpZiAoSVNfRVJSKHJvb3QpKSB7Ci0JCQllcnJvciA9IFBUUl9FUlIocm9vdCk7Ci0JCQlkZWFjdGl2YXRlX2xvY2tlZF9zdXBlcihzKTsKLQkJCWdvdG8gZXJyb3JfZnJlZV9zdWJ2b2xfbmFtZTsKLQkJfQotCi0JCW11dGV4X2xvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCQluZXdfcm9vdCA9IGxvb2t1cF9vbmVfbGVuKHN1YnZvbF9uYW1lLCByb290LAotCQkJCSAgICAgIHN0cmxlbihzdWJ2b2xfbmFtZSkpOwotCQltdXRleF91bmxvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCi0JCWlmIChJU19FUlIobmV3X3Jvb3QpKSB7Ci0JCQlkcHV0KHJvb3QpOwotCQkJZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIocyk7Ci0JCQllcnJvciA9IFBUUl9FUlIobmV3X3Jvb3QpOwotCQkJZ290byBlcnJvcl9mcmVlX3N1YnZvbF9uYW1lOwotCQl9Ci0JCWlmICghbmV3X3Jvb3QtPmRfaW5vZGUpIHsKLQkJCWRwdXQocm9vdCk7Ci0JCQlkcHV0KG5ld19yb290KTsKLQkJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwotCQkJZXJyb3IgPSAtRU5YSU87Ci0JCQlnb3RvIGVycm9yX2ZyZWVfc3Vidm9sX25hbWU7Ci0JCX0KLQkJZHB1dChyb290KTsKLQkJcm9vdCA9IG5ld19yb290OwotCX0gZWxzZSB7Ci0JCXJvb3QgPSBnZXRfZGVmYXVsdF9yb290KHMsIHN1YnZvbF9vYmplY3RpZCk7Ci0JCWlmIChJU19FUlIocm9vdCkpIHsKLQkJCWVycm9yID0gUFRSX0VSUihyb290KTsKLQkJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwotCQkJZ290byBlcnJvcl9mcmVlX3N1YnZvbF9uYW1lOwotCQl9CisJcm9vdCA9IGdldF9kZWZhdWx0X3Jvb3Qocywgc3Vidm9sX29iamVjdGlkKTsKKwlpZiAoSVNfRVJSKHJvb3QpKSB7CisJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOworCQlyZXR1cm4gcm9vdDsKIAl9CiAKLQlrZnJlZShzdWJ2b2xfbmFtZSk7CiAJcmV0dXJuIHJvb3Q7CiAKLWVycm9yX3M6Ci0JZXJyb3IgPSBQVFJfRVJSKHMpOwogZXJyb3JfY2xvc2VfZGV2aWNlczoKIAlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2RldmljZXMpOwotCWtmcmVlKGZzX2luZm8pOwotCWtmcmVlKHRyZWVfcm9vdCk7Ci1lcnJvcl9mcmVlX3N1YnZvbF9uYW1lOgotCWtmcmVlKHN1YnZvbF9uYW1lKTsKK2Vycm9yX2ZzX2luZm86CisJZnJlZV9mc19pbmZvKGZzX2luZm8pOwogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIH0KIApAQCAtOTE5LDcgKzEwMjIsNyBAQAogCQlpZiAocm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+cndfZGV2aWNlcyA9PSAwKQogCQkJcmV0dXJuIC1FQUNDRVM7CiAKLQkJaWYgKGJ0cmZzX3N1cGVyX2xvZ19yb290KCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAhPSAwKQorCQlpZiAoYnRyZnNfc3VwZXJfbG9nX3Jvb3Qocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkgIT0gMCkKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCXJldCA9IGJ0cmZzX2NsZWFudXBfZnNfcm9vdHMocm9vdC0+ZnNfaW5mbyk7CkBAIC0xMDg1LDcgKzExODgsNyBAQAogc3RhdGljIGludCBidHJmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gYnRyZnNfc2IoZGVudHJ5LT5kX3NiKTsKLQlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXIgPSAmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXIgPSByb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmcm9vdC0+ZnNfaW5mby0+c3BhY2VfaW5mbzsKIAlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqZm91bmQ7CiAJdTY0IHRvdGFsX3VzZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKaW5kZXggZTI0Yjc5Ni4uNmEwNTc0ZSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYworKysgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5jCkBAIC01NSw2ICs1NSw3IEBACiAJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICpjdXJfdHJhbnM7CiAKIAlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworbG9vcDoKIAlpZiAocm9vdC0+ZnNfaW5mby0+dHJhbnNfbm9fam9pbikgewogCQlpZiAoIW5vZmFpbCkgewogCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwpAQCAtNzUsMTYgKzc2LDE4IEBACiAJY3VyX3RyYW5zID0ga21lbV9jYWNoZV9hbGxvYyhidHJmc190cmFuc2FjdGlvbl9jYWNoZXAsIEdGUF9OT0ZTKTsKIAlpZiAoIWN1cl90cmFucykKIAkJcmV0dXJuIC1FTk9NRU07CisKIAlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCWlmIChyb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uKSB7CisJCS8qCisJCSAqIHNvbWVvbmUgc3RhcnRlZCBhIHRyYW5zYWN0aW9uIGFmdGVyIHdlIHVubG9ja2VkLiAgTWFrZSBzdXJlCisJCSAqIHRvIHJlZG8gdGhlIHRyYW5zX25vX2pvaW4gY2hlY2tzIGFib3ZlCisJCSAqLwogCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfdHJhbnNhY3Rpb25fY2FjaGVwLCBjdXJfdHJhbnMpOwogCQljdXJfdHJhbnMgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOwotCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7Ci0JCWF0b21pY19pbmMoJmN1cl90cmFucy0+bnVtX3dyaXRlcnMpOwotCQljdXJfdHJhbnMtPm51bV9qb2luZWQrKzsKLQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwotCQlyZXR1cm4gMDsKKwkJZ290byBsb29wOwogCX0KKwogCWF0b21pY19zZXQoJmN1cl90cmFucy0+bnVtX3dyaXRlcnMsIDEpOwogCWN1cl90cmFucy0+bnVtX2pvaW5lZCA9IDA7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY3VyX3RyYW5zLT53cml0ZXJfd2FpdCk7CkBAIC0yNzUsNyArMjc4LDcgQEAKIAkgKi8KIAlpZiAobnVtX2l0ZW1zID4gMCAmJiByb290ICE9IHJvb3QtPmZzX2luZm8tPmNodW5rX3Jvb3QpIHsKIAkJbnVtX2J5dGVzID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIG51bV9pdGVtcyk7Ci0JCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQoTlVMTCwgcm9vdCwKKwkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZChyb290LAogCQkJCQkgICZyb290LT5mc19pbmZvLT50cmFuc19ibG9ja19yc3YsCiAJCQkJCSAgbnVtX2J5dGVzKTsKIAkJaWYgKHJldCkKQEAgLTQxOCw4ICs0MjEsOCBAQAogCQkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7CiAJaW50IHJldDsKLQlyZXQgPSBidHJmc19ibG9ja19yc3ZfY2hlY2sodHJhbnMsIHJvb3QsCi0JCQkJICAgICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LCAwLCA1KTsKKworCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9jaGVjayhyb290LCAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdiwgNSk7CiAJcmV0dXJuIHJldCA/IDEgOiAwOwogfQogCkBAIC00MjcsMTcgKzQzMCwyNiBAQAogCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmN1cl90cmFucyA9IHRyYW5zLT50cmFuc2FjdGlvbjsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpyc3YgPSB0cmFucy0+YmxvY2tfcnN2OwogCWludCB1cGRhdGVzOwogCiAJc21wX21iKCk7CiAJaWYgKGN1cl90cmFucy0+YmxvY2tlZCB8fCBjdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5mbHVzaGluZykKIAkJcmV0dXJuIDE7CiAKKwkvKgorCSAqIFdlIG5lZWQgdG8gZG8gdGhpcyBpbiBjYXNlIHdlJ3JlIGRlbGV0aW5nIGNzdW1zIHNvIHRoZSBnbG9iYWwgYmxvY2sKKwkgKiByc3YgZ2V0J3MgdXNlZCBpbnN0ZWFkIG9mIHRoZSBjc3VtIGJsb2NrIHJzdi4KKwkgKi8KKwl0cmFucy0+YmxvY2tfcnN2ID0gTlVMTDsKKwogCXVwZGF0ZXMgPSB0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlczsKIAl0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlcyA9IDA7CiAJaWYgKHVwZGF0ZXMpCiAJCWJ0cmZzX3J1bl9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QsIHVwZGF0ZXMpOwogCisJdHJhbnMtPmJsb2NrX3JzdiA9IHJzdjsKKwogCXJldHVybiBzaG91bGRfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIH0KIApAQCAtNDUzLDYgKzQ2NSw4IEBACiAJCXJldHVybiAwOwogCX0KIAorCWJ0cmZzX3RyYW5zX3JlbGVhc2VfbWV0YWRhdGEodHJhbnMsIHJvb3QpOworCXRyYW5zLT5ibG9ja19yc3YgPSBOVUxMOwogCXdoaWxlIChjb3VudCA8IDQpIHsKIAkJdW5zaWduZWQgbG9uZyBjdXIgPSB0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlczsKIAkJdHJhbnMtPmRlbGF5ZWRfcmVmX3VwZGF0ZXMgPSAwOwpAQCAtNDczLDggKzQ4Nyw2IEBACiAJCWNvdW50Kys7CiAJfQogCi0JYnRyZnNfdHJhbnNfcmVsZWFzZV9tZXRhZGF0YSh0cmFucywgcm9vdCk7Ci0KIAlpZiAobG9jayAmJiAhYXRvbWljX3JlYWQoJnJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpICYmCiAJICAgIHNob3VsZF9lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpKSB7CiAJCXRyYW5zLT50cmFuc2FjdGlvbi0+YmxvY2tlZCA9IDE7CkBAIC01NjIsNTAgKzU3NCwyMSBAQAogaW50IGJ0cmZzX3dyaXRlX21hcmtlZF9leHRlbnRzKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICAgIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZGlydHlfcGFnZXMsIGludCBtYXJrKQogewotCWludCByZXQ7CiAJaW50IGVyciA9IDA7CiAJaW50IHdlcnIgPSAwOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHJvb3QtPmZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmc7CiAJdTY0IHN0YXJ0ID0gMDsKIAl1NjQgZW5kOwotCXVuc2lnbmVkIGxvbmcgaW5kZXg7CiAKLQl3aGlsZSAoMSkgewotCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoZGlydHlfcGFnZXMsIHN0YXJ0LCAmc3RhcnQsICZlbmQsCi0JCQkJCSAgICBtYXJrKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCQl3aGlsZSAoc3RhcnQgPD0gZW5kKSB7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQotCQkJaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQkJc3RhcnQgPSAodTY0KShpbmRleCArIDEpIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCQlwYWdlID0gZmluZF9nZXRfcGFnZShidHJlZV9pbm9kZS0+aV9tYXBwaW5nLCBpbmRleCk7Ci0JCQlpZiAoIXBhZ2UpCi0JCQkJY29udGludWU7Ci0KLQkJCWJ0cmVlX2xvY2tfcGFnZV9ob29rKHBhZ2UpOwotCQkJaWYgKCFwYWdlLT5tYXBwaW5nKSB7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgewotCQkJCWlmIChQYWdlRGlydHkocGFnZSkpCi0JCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWVyciA9IHdyaXRlX29uZV9wYWdlKHBhZ2UsIDApOwotCQkJaWYgKGVycikKLQkJCQl3ZXJyID0gZXJyOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQl9CisJd2hpbGUgKCFmaW5kX2ZpcnN0X2V4dGVudF9iaXQoZGlydHlfcGFnZXMsIHN0YXJ0LCAmc3RhcnQsICZlbmQsCisJCQkJICAgICAgbWFyaykpIHsKKwkJY29udmVydF9leHRlbnRfYml0KGRpcnR5X3BhZ2VzLCBzdGFydCwgZW5kLCBFWFRFTlRfTkVFRF9XQUlULCBtYXJrLAorCQkJCSAgIEdGUF9OT0ZTKTsKKwkJZXJyID0gZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQpOworCQlpZiAoZXJyKQorCQkJd2VyciA9IGVycjsKKwkJY29uZF9yZXNjaGVkKCk7CisJCXN0YXJ0ID0gZW5kICsgMTsKIAl9CiAJaWYgKGVycikKIAkJd2VyciA9IGVycjsKQEAgLTYyMSwzOSArNjA0LDIwIEBACiBpbnQgYnRyZnNfd2FpdF9tYXJrZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgICAgIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZGlydHlfcGFnZXMsIGludCBtYXJrKQogewotCWludCByZXQ7CiAJaW50IGVyciA9IDA7CiAJaW50IHdlcnIgPSAwOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHJvb3QtPmZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmc7CiAJdTY0IHN0YXJ0ID0gMDsKIAl1NjQgZW5kOwotCXVuc2lnbmVkIGxvbmcgaW5kZXg7CiAKLQl3aGlsZSAoMSkgewotCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoZGlydHlfcGFnZXMsIHN0YXJ0LCAmc3RhcnQsICZlbmQsCi0JCQkJCSAgICBtYXJrKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCi0JCWNsZWFyX2V4dGVudF9iaXRzKGRpcnR5X3BhZ2VzLCBzdGFydCwgZW5kLCBtYXJrLCBHRlBfTk9GUyk7Ci0JCXdoaWxlIChzdGFydCA8PSBlbmQpIHsKLQkJCWluZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJCXN0YXJ0ID0gKHU2NCkoaW5kZXggKyAxKSA8PCBQQUdFX0NBQ0hFX1NISUZUOwotCQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoYnRyZWVfaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOwotCQkJaWYgKCFwYWdlKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKFBhZ2VEaXJ0eShwYWdlKSkgewotCQkJCWJ0cmVlX2xvY2tfcGFnZV9ob29rKHBhZ2UpOwotCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JCQkJZXJyID0gd3JpdGVfb25lX3BhZ2UocGFnZSwgMCk7Ci0JCQkJaWYgKGVycikKLQkJCQkJd2VyciA9IGVycjsKLQkJCX0KLQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJfQorCXdoaWxlICghZmluZF9maXJzdF9leHRlbnRfYml0KGRpcnR5X3BhZ2VzLCBzdGFydCwgJnN0YXJ0LCAmZW5kLAorCQkJCSAgICAgIEVYVEVOVF9ORUVEX1dBSVQpKSB7CisJCWNsZWFyX2V4dGVudF9iaXRzKGRpcnR5X3BhZ2VzLCBzdGFydCwgZW5kLCBFWFRFTlRfTkVFRF9XQUlULCBHRlBfTk9GUyk7CisJCWVyciA9IGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQpOworCQlpZiAoZXJyKQorCQkJd2VyciA9IGVycjsKKwkJY29uZF9yZXNjaGVkKCk7CisJCXN0YXJ0ID0gZW5kICsgMTsKIAl9CiAJaWYgKGVycikKIAkJd2VyciA9IGVycjsKQEAgLTY3Myw3ICs2MzcsMTIgQEAKIAogCXJldCA9IGJ0cmZzX3dyaXRlX21hcmtlZF9leHRlbnRzKHJvb3QsIGRpcnR5X3BhZ2VzLCBtYXJrKTsKIAlyZXQyID0gYnRyZnNfd2FpdF9tYXJrZWRfZXh0ZW50cyhyb290LCBkaXJ0eV9wYWdlcywgbWFyayk7Ci0JcmV0dXJuIHJldCB8fCByZXQyOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0MikKKwkJcmV0dXJuIHJldDI7CisJcmV0dXJuIDA7CiB9CiAKIGludCBidHJmc193cml0ZV9hbmRfd2FpdF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKQEAgLTkxMSwxMSArODgwLDEwIEBACiAJfQogCiAJYnRyZnNfcmVsb2NfcHJlX3NuYXBzaG90KHRyYW5zLCBwZW5kaW5nLCAmdG9fcmVzZXJ2ZSk7Ci0JYnRyZnNfb3JwaGFuX3ByZV9zbmFwc2hvdCh0cmFucywgcGVuZGluZywgJnRvX3Jlc2VydmUpOwogCiAJaWYgKHRvX3Jlc2VydmUgPiAwKSB7Ci0JCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQodHJhbnMsIHJvb3QsICZwZW5kaW5nLT5ibG9ja19yc3YsCi0JCQkJCSAgdG9fcmVzZXJ2ZSk7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGRfbm9mbHVzaChyb290LCAmcGVuZGluZy0+YmxvY2tfcnN2LAorCQkJCQkJICB0b19yZXNlcnZlKTsKIAkJaWYgKHJldCkgewogCQkJcGVuZGluZy0+ZXJyb3IgPSByZXQ7CiAJCQlnb3RvIGZhaWw7CkBAIC0xMDAyLDcgKzk3MCw2IEBACiAJQlVHX09OKElTX0VSUihwZW5kaW5nLT5zbmFwKSk7CiAKIAlidHJmc19yZWxvY19wb3N0X3NuYXBzaG90KHRyYW5zLCBwZW5kaW5nKTsKLQlidHJmc19vcnBoYW5fcG9zdF9zbmFwc2hvdCh0cmFucywgcGVuZGluZyk7CiBmYWlsOgogCWtmcmVlKG5ld19yb290X2l0ZW0pOwogCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CkBAIC0xMDMyLDcgKzk5OSw3IEBACiAJc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqcm9vdF9pdGVtOwogCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXI7CiAKLQlzdXBlciA9ICZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OworCXN1cGVyID0gcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAogCXJvb3RfaXRlbSA9ICZyb290LT5mc19pbmZvLT5jaHVua19yb290LT5yb290X2l0ZW07CiAJc3VwZXItPmNodW5rX3Jvb3QgPSByb290X2l0ZW0tPmJ5dGVucjsKQEAgLTEwNDMsNyArMTAxMCw3IEBACiAJc3VwZXItPnJvb3QgPSByb290X2l0ZW0tPmJ5dGVucjsKIAlzdXBlci0+Z2VuZXJhdGlvbiA9IHJvb3RfaXRlbS0+Z2VuZXJhdGlvbjsKIAlzdXBlci0+cm9vdF9sZXZlbCA9IHJvb3RfaXRlbS0+bGV2ZWw7Ci0JaWYgKHN1cGVyLT5jYWNoZV9nZW5lcmF0aW9uICE9IDAgfHwgYnRyZnNfdGVzdF9vcHQocm9vdCwgU1BBQ0VfQ0FDSEUpKQorCWlmIChidHJmc190ZXN0X29wdChyb290LCBTUEFDRV9DQUNIRSkpCiAJCXN1cGVyLT5jYWNoZV9nZW5lcmF0aW9uID0gcm9vdF9pdGVtLT5nZW5lcmF0aW9uOwogfQogCkBAIC0xMTY4LDE0ICsxMTM1LDE1IEBACiAKIAlidHJmc19ydW5fb3JkZXJlZF9vcGVyYXRpb25zKHJvb3QsIDApOwogCisJYnRyZnNfdHJhbnNfcmVsZWFzZV9tZXRhZGF0YSh0cmFucywgcm9vdCk7CisJdHJhbnMtPmJsb2NrX3JzdiA9IE5VTEw7CisKIAkvKiBtYWtlIGEgcGFzcyB0aHJvdWdoIGFsbCB0aGUgZGVsYXllZCByZWZzIHdlIGhhdmUgc28gZmFyCiAJICogYW55IHJ1bm5pbmdzIHByb2NzIG1heSBhZGQgbW9yZSB3aGlsZSB3ZSBhcmUgaGVyZQogCSAqLwogCXJldCA9IGJ0cmZzX3J1bl9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QsIDApOwogCUJVR19PTihyZXQpOwogCi0JYnRyZnNfdHJhbnNfcmVsZWFzZV9tZXRhZGF0YSh0cmFucywgcm9vdCk7Ci0KIAljdXJfdHJhbnMgPSB0cmFucy0+dHJhbnNhY3Rpb247CiAJLyoKIAkgKiBzZXQgdGhlIGZsdXNoaW5nIGZsYWcgc28gcHJvY3MgaW4gdGhpcyB0cmFuc2FjdGlvbiBoYXZlIHRvCkBAIC0xMzQxLDEyICsxMzA5LDEyIEBACiAJdXBkYXRlX3N1cGVyX3Jvb3RzKHJvb3QpOwogCiAJaWYgKCFyb290LT5mc19pbmZvLT5sb2dfcm9vdF9yZWNvdmVyaW5nKSB7Ci0JCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwgMCk7Ci0JCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdF9sZXZlbCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwgMCk7CisJCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdChyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5LCAwKTsKKwkJYnRyZnNfc2V0X3N1cGVyX2xvZ19yb290X2xldmVsKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksIDApOwogCX0KIAotCW1lbWNweSgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwgJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCi0JICAgICAgIHNpemVvZihyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSk7CisJbWVtY3B5KHJvb3QtPmZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQsIHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCisJICAgICAgIHNpemVvZigqcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkpOwogCiAJdHJhbnMtPnRyYW5zYWN0aW9uLT5ibG9ja2VkID0gMDsKIAlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKaW5kZXggNzg2NjM5Zi4uMzU2ODM3NCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJlZS1sb2cuYworKysgYi9mcy9idHJmcy90cmVlLWxvZy5jCkBAIC0yNzYsOCArMjc2LDkgQEAKIAkJCSAgICAgIHN0cnVjdCB3YWxrX2NvbnRyb2wgKndjLCB1NjQgZ2VuKQogewogCWlmICh3Yy0+cGluKQotCQlidHJmc19waW5fZXh0ZW50KGxvZy0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsCi0JCQkJIGViLT5zdGFydCwgZWItPmxlbiwgMCk7CisJCWJ0cmZzX3Bpbl9leHRlbnRfZm9yX2xvZ19yZXBsYXkod2MtPnRyYW5zLAorCQkJCQkJbG9nLT5mc19pbmZvLT5leHRlbnRfcm9vdCwKKwkJCQkJCWViLT5zdGFydCwgZWItPmxlbik7CiAKIAlpZiAoYnRyZnNfYnVmZmVyX3VwdG9kYXRlKGViLCBnZW4pKSB7CiAJCWlmICh3Yy0+d3JpdGUpCkBAIC0xMDMwLDcgKzEwMzEsNyBAQAogCX0KIAlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAJaWYgKG5saW5rICE9IGlub2RlLT5pX25saW5rKSB7Ci0JCWlub2RlLT5pX25saW5rID0gbmxpbms7CisJCXNldF9ubGluayhpbm9kZSwgbmxpbmspOwogCQlidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKIAl9CiAJQlRSRlNfSShpbm9kZSktPmluZGV4X2NudCA9ICh1NjQpLTE7CkBAIC0xNzYwLDcgKzE3NjEsNyBAQAogCiAJCQkJV0FSTl9PTihyb290X293bmVyICE9CiAJCQkJCUJUUkZTX1RSRUVfTE9HX09CSkVDVElEKTsKLQkJCQlyZXQgPSBidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChyb290LAorCQkJCXJldCA9IGJ0cmZzX2ZyZWVfYW5kX3Bpbl9yZXNlcnZlZF9leHRlbnQocm9vdCwKIAkJCQkJCQkgYnl0ZW5yLCBibG9ja3NpemUpOwogCQkJCUJVR19PTihyZXQpOwogCQkJfQpAQCAtMTgyOCw3ICsxODI5LDcgQEAKIAkJCQlidHJmc190cmVlX3VubG9jayhuZXh0KTsKIAogCQkJCVdBUk5fT04ocm9vdF9vd25lciAhPSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCk7Ci0JCQkJcmV0ID0gYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQocm9vdCwKKwkJCQlyZXQgPSBidHJmc19mcmVlX2FuZF9waW5fcmVzZXJ2ZWRfZXh0ZW50KHJvb3QsCiAJCQkJCQlwYXRoLT5ub2Rlc1sqbGV2ZWxdLT5zdGFydCwKIAkJCQkJCXBhdGgtPm5vZGVzWypsZXZlbF0tPmxlbik7CiAJCQkJQlVHX09OKHJldCk7CkBAIC0xODk3LDcgKzE4OTgsNyBAQAogCiAJCQlXQVJOX09OKGxvZy0+cm9vdF9rZXkub2JqZWN0aWQgIT0KIAkJCQlCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCk7Ci0JCQlyZXQgPSBidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChsb2csIG5leHQtPnN0YXJ0LAorCQkJcmV0ID0gYnRyZnNfZnJlZV9hbmRfcGluX3Jlc2VydmVkX2V4dGVudChsb2csIG5leHQtPnN0YXJ0LAogCQkJCQkJCSBuZXh0LT5sZW4pOwogCQkJQlVHX09OKHJldCk7CiAJCX0KQEAgLTIwMTMsMTAgKzIwMTQsMTAgQEAKIAkvKiB3YWl0IGZvciBwcmV2aW91cyB0cmVlIGxvZyBzeW5jIHRvIGNvbXBsZXRlICovCiAJaWYgKGF0b21pY19yZWFkKCZyb290LT5sb2dfY29tbWl0WyhpbmRleDEgKyAxKSAlIDJdKSkKIAkJd2FpdF9sb2dfY29tbWl0KHRyYW5zLCByb290LCByb290LT5sb2dfdHJhbnNpZCAtIDEpOwotCiAJd2hpbGUgKDEpIHsKIAkJdW5zaWduZWQgbG9uZyBiYXRjaCA9IHJvb3QtPmxvZ19iYXRjaDsKLQkJaWYgKHJvb3QtPmxvZ19tdWx0aXBsZV9waWRzKSB7CisJCS8qIHdoZW4gd2UncmUgb24gYW4gc3NkLCBqdXN0IGtpY2sgdGhlIGxvZyBjb21taXQgb3V0ICovCisJCWlmICghYnRyZnNfdGVzdF9vcHQocm9vdCwgU1NEKSAmJiByb290LT5sb2dfbXVsdGlwbGVfcGlkcykgewogCQkJbXV0ZXhfdW5sb2NrKCZyb290LT5sb2dfbXV0ZXgpOwogCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJCQltdXRleF9sb2NrKCZyb290LT5sb2dfbXV0ZXgpOwpAQCAtMjExNyw5ICsyMTE4LDkgQEAKIAlCVUdfT04ocmV0KTsKIAlidHJmc193YWl0X21hcmtlZF9leHRlbnRzKGxvZywgJmxvZy0+ZGlydHlfbG9nX3BhZ2VzLCBtYXJrKTsKIAotCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwKKwlidHJmc19zZXRfc3VwZXJfbG9nX3Jvb3Qocm9vdC0+ZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwKIAkJCQlsb2dfcm9vdF90cmVlLT5ub2RlLT5zdGFydCk7Ci0JYnRyZnNfc2V0X3N1cGVyX2xvZ19yb290X2xldmVsKCZyb290LT5mc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0LAorCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdF9sZXZlbChyb290LT5mc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0LAogCQkJCWJ0cmZzX2hlYWRlcl9sZXZlbChsb2dfcm9vdF90cmVlLT5ub2RlKSk7CiAKIAlsb2dfcm9vdF90cmVlLT5sb2dfYmF0Y2ggPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5jIGIvZnMvYnRyZnMvdm9sdW1lcy5jCmluZGV4IGYyYTRjYzcuLmMzNzQzM2QgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3ZvbHVtZXMuYworKysgYi9mcy9idHJmcy92b2x1bWVzLmMKQEAgLTM2Niw2ICszNjYsMTQgQEAKIAkJfQogCQlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5kZXZfYWxsb2NfbGlzdCk7CiAKKwkJLyogaW5pdCByZWFkYWhlYWQgc3RhdGUgKi8KKwkJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+cmVhZGFfbG9jayk7CisJCWRldmljZS0+cmVhZGFfY3Vycl96b25lID0gTlVMTDsKKwkJYXRvbWljX3NldCgmZGV2aWNlLT5yZWFkYV9pbl9mbGlnaHQsIDApOworCQlkZXZpY2UtPnJlYWRhX25leHQgPSAwOworCQlJTklUX1JBRElYX1RSRUUoJmRldmljZS0+cmVhZGFfem9uZXMsIEdGUF9OT0ZTICYgfl9fR0ZQX1dBSVQpOworCQlJTklUX1JBRElYX1RSRUUoJmRldmljZS0+cmVhZGFfZXh0ZW50cywgR0ZQX05PRlMgJiB+X19HRlBfV0FJVCk7CisKIAkJbXV0ZXhfbG9jaygmZnNfZGV2aWNlcy0+ZGV2aWNlX2xpc3RfbXV0ZXgpOwogCQlsaXN0X2FkZF9yY3UoJmRldmljZS0+ZGV2X2xpc3QsICZmc19kZXZpY2VzLT5kZXZpY2VzKTsKIAkJbXV0ZXhfdW5sb2NrKCZmc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CkBAIC01OTcsMTAgKzYwNSw4IEBACiAJCXNldF9ibG9ja3NpemUoYmRldiwgNDA5Nik7CiAKIAkJYmggPSBidHJmc19yZWFkX2Rldl9zdXBlcihiZGV2KTsKLQkJaWYgKCFiaCkgewotCQkJcmV0ID0gLUVJTlZBTDsKKwkJaWYgKCFiaCkKIAkJCWdvdG8gZXJyb3JfY2xvc2U7Ci0JCX0KIAogCQlkaXNrX3N1cGVyID0gKHN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7CiAJCWRldmlkID0gYnRyZnNfc3RhY2tfZGV2aWNlX2lkKCZkaXNrX3N1cGVyLT5kZXZfaXRlbSk7CkBAIC02NTUsNyArNjYxLDcgQEAKIAkJY29udGludWU7CiAJfQogCWlmIChmc19kZXZpY2VzLT5vcGVuX2RldmljZXMgPT0gMCkgewotCQlyZXQgPSAtRUlPOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAJZnNfZGV2aWNlcy0+c2VlZGluZyA9IHNlZWRpbmc7CkBAIC05OTMsNyArOTk5LDcgQEAKIAlrZXkub2JqZWN0aWQgPSBkZXZpY2UtPmRldmlkOwogCWtleS5vZmZzZXQgPSBzdGFydDsKIAlrZXkudHlwZSA9IEJUUkZTX0RFVl9FWFRFTlRfS0VZOwotCithZ2FpbjoKIAlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgLTEsIDEpOwogCWlmIChyZXQgPiAwKSB7CiAJCXJldCA9IGJ0cmZzX3ByZXZpb3VzX2l0ZW0ocm9vdCwgcGF0aCwga2V5Lm9iamVjdGlkLApAQCAtMTAwNiw2ICsxMDEyLDkgQEAKIAkJCQkJc3RydWN0IGJ0cmZzX2Rldl9leHRlbnQpOwogCQlCVUdfT04oZm91bmRfa2V5Lm9mZnNldCA+IHN0YXJ0IHx8IGZvdW5kX2tleS5vZmZzZXQgKwogCQkgICAgICAgYnRyZnNfZGV2X2V4dGVudF9sZW5ndGgobGVhZiwgZXh0ZW50KSA8IHN0YXJ0KTsKKwkJa2V5ID0gZm91bmRfa2V5OworCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CisJCWdvdG8gYWdhaW47CiAJfSBlbHNlIGlmIChyZXQgPT0gMCkgewogCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CiAJCWV4dGVudCA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLApAQCAtMTAxMyw4ICsxMDIyLDEzIEBACiAJfQogCUJVR19PTihyZXQpOwogCi0JaWYgKGRldmljZS0+Ynl0ZXNfdXNlZCA+IDApCi0JCWRldmljZS0+Ynl0ZXNfdXNlZCAtPSBidHJmc19kZXZfZXh0ZW50X2xlbmd0aChsZWFmLCBleHRlbnQpOworCWlmIChkZXZpY2UtPmJ5dGVzX3VzZWQgPiAwKSB7CisJCXU2NCBsZW4gPSBidHJmc19kZXZfZXh0ZW50X2xlbmd0aChsZWFmLCBleHRlbnQpOworCQlkZXZpY2UtPmJ5dGVzX3VzZWQgLT0gbGVuOworCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisJCXJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfc3BhY2UgKz0gbGVuOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwl9CiAJcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgpOwogCiBvdXQ6CkBAIC0xMzU2LDYgKzEzNzAsMTEgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3VuZG87CiAKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisJcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19zcGFjZSA9IGRldmljZS0+dG90YWxfYnl0ZXMgLQorCQlkZXZpY2UtPmJ5dGVzX3VzZWQ7CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisKIAlkZXZpY2UtPmluX2ZzX21ldGFkYXRhID0gMDsKIAlidHJmc19zY3J1Yl9jYW5jZWxfZGV2KHJvb3QsIGRldmljZSk7CiAKQEAgLTEzODcsOCArMTQwNiw4IEBACiAJY2FsbF9yY3UoJmRldmljZS0+cmN1LCBmcmVlX2RldmljZSk7CiAJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CiAKLQludW1fZGV2aWNlcyA9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAtIDE7Ci0JYnRyZnNfc2V0X3N1cGVyX251bV9kZXZpY2VzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5LCBudW1fZGV2aWNlcyk7CisJbnVtX2RldmljZXMgPSBidHJmc19zdXBlcl9udW1fZGV2aWNlcyhyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAtIDE7CisJYnRyZnNfc2V0X3N1cGVyX251bV9kZXZpY2VzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksIG51bV9kZXZpY2VzKTsKIAogCWlmIChjdXJfZGV2aWNlcy0+b3Blbl9kZXZpY2VzID09IDApIHsKIAkJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXM7CkBAIC0xNDUwLDcgKzE0NjksNyBAQAogCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlczsKIAlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqb2xkX2RldmljZXM7CiAJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKnNlZWRfZGV2aWNlczsKLQlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXIgPSAmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXIgPSByb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OwogCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKIAl1NjQgc3VwZXJfZmxhZ3M7CiAKQEAgLTE2OTEsMTUgKzE3MTAsMTkgQEAKIAkJcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+bnVtX2Nhbl9kaXNjYXJkKys7CiAJcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+dG90YWxfcndfYnl0ZXMgKz0gZGV2aWNlLT50b3RhbF9ieXRlczsKIAorCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwlyb290LT5mc19pbmZvLT5mcmVlX2NodW5rX3NwYWNlICs9IGRldmljZS0+dG90YWxfYnl0ZXM7CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisKIAlpZiAoIWJsa19xdWV1ZV9ub25yb3QoYmRldl9nZXRfcXVldWUoYmRldikpKQogCQlyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5yb3RhdGluZyA9IDE7CiAKLQl0b3RhbF9ieXRlcyA9IGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKLQlidHJmc19zZXRfc3VwZXJfdG90YWxfYnl0ZXMoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCisJdG90YWxfYnl0ZXMgPSBidHJmc19zdXBlcl90b3RhbF9ieXRlcyhyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlidHJmc19zZXRfc3VwZXJfdG90YWxfYnl0ZXMocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwKIAkJCQkgICAgdG90YWxfYnl0ZXMgKyBkZXZpY2UtPnRvdGFsX2J5dGVzKTsKIAotCXRvdGFsX2J5dGVzID0gYnRyZnNfc3VwZXJfbnVtX2RldmljZXMoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwotCWJ0cmZzX3NldF9zdXBlcl9udW1fZGV2aWNlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwKKwl0b3RhbF9ieXRlcyA9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWJ0cmZzX3NldF9zdXBlcl9udW1fZGV2aWNlcyhyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5LAogCQkJCSAgICB0b3RhbF9ieXRlcyArIDEpOwogCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+ZGV2aWNlX2xpc3RfbXV0ZXgpOwogCkBAIC0xNzkwLDcgKzE4MTMsNyBAQAogCQkgICAgICBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UsIHU2NCBuZXdfc2l6ZSkKIHsKIAlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKnN1cGVyX2NvcHkgPQotCQkmZGV2aWNlLT5kZXZfcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKKwkJZGV2aWNlLT5kZXZfcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAl1NjQgb2xkX3RvdGFsID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoc3VwZXJfY29weSk7CiAJdTY0IGRpZmYgPSBuZXdfc2l6ZSAtIGRldmljZS0+dG90YWxfYnl0ZXM7CiAKQEAgLTE4NDksNyArMTg3Miw3IEBACiBzdGF0aWMgaW50IGJ0cmZzX2RlbF9zeXNfY2h1bmsoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBjaHVua19vYmplY3RpZCwgdTY0CiAJCQljaHVua19vZmZzZXQpCiB7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgKmRpc2tfa2V5OwogCXN0cnVjdCBidHJmc19jaHVuayAqY2h1bms7CiAJdTggKnB0cjsKQEAgLTIxNzUsNyArMjE5OCw3IEBACiAJYm9vbCByZXRyaWVkID0gZmFsc2U7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmw7CiAJc3RydWN0IGJ0cmZzX2tleSBrZXk7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAl1NjQgb2xkX3RvdGFsID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoc3VwZXJfY29weSk7CiAJdTY0IG9sZF9zaXplID0gZGV2aWNlLT50b3RhbF9ieXRlczsKIAl1NjQgZGlmZiA9IGRldmljZS0+dG90YWxfYnl0ZXMgLSBuZXdfc2l6ZTsKQEAgLTIxOTIsOCArMjIxNSwxMiBAQAogCWxvY2tfY2h1bmtzKHJvb3QpOwogCiAJZGV2aWNlLT50b3RhbF9ieXRlcyA9IG5ld19zaXplOwotCWlmIChkZXZpY2UtPndyaXRlYWJsZSkKKwlpZiAoZGV2aWNlLT53cml0ZWFibGUpIHsKIAkJZGV2aWNlLT5mc19kZXZpY2VzLT50b3RhbF9yd19ieXRlcyAtPSBkaWZmOworCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisJCXJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfc3BhY2UgLT0gZGlmZjsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisJfQogCXVubG9ja19jaHVua3Mocm9vdCk7CiAKIGFnYWluOgpAQCAtMjI1Nyw2ICsyMjg0LDkgQEAKIAkJZGV2aWNlLT50b3RhbF9ieXRlcyA9IG9sZF9zaXplOwogCQlpZiAoZGV2aWNlLT53cml0ZWFibGUpCiAJCQlkZXZpY2UtPmZzX2RldmljZXMtPnRvdGFsX3J3X2J5dGVzICs9IGRpZmY7CisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwkJcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19zcGFjZSArPSBkaWZmOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKIAkJdW5sb2NrX2NodW5rcyhyb290KTsKIAkJZ290byBkb25lOwogCX0KQEAgLTIyOTIsNyArMjMyMiw3IEBACiAJCQkgICBzdHJ1Y3QgYnRyZnNfa2V5ICprZXksCiAJCQkgICBzdHJ1Y3QgYnRyZnNfY2h1bmsgKmNodW5rLCBpbnQgaXRlbV9zaXplKQogewotCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXJfY29weSA9ICZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXJfY29weSA9IHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CiAJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGRpc2tfa2V5OwogCXUzMiBhcnJheV9zaXplOwogCXU4ICpwdHI7CkBAIC0yNjE1LDYgKzI2NDUsMTEgQEAKIAkJaW5kZXgrKzsKIAl9CiAKKwlzcGluX2xvY2soJmV4dGVudF9yb290LT5mc19pbmZvLT5mcmVlX2NodW5rX2xvY2spOworCWV4dGVudF9yb290LT5mc19pbmZvLT5mcmVlX2NodW5rX3NwYWNlIC09IChzdHJpcGVfc2l6ZSAqCisJCQkJCQkgICBtYXAtPm51bV9zdHJpcGVzKTsKKwlzcGluX3VubG9jaygmZXh0ZW50X3Jvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisKIAlpbmRleCA9IDA7CiAJc3RyaXBlID0gJmNodW5rLT5zdHJpcGU7CiAJd2hpbGUgKGluZGV4IDwgbWFwLT5udW1fc3RyaXBlcykgewpAQCAtMjg0OCw3ICsyODgzLDcgQEAKIAogc3RhdGljIGludCBfX2J0cmZzX21hcF9ibG9jayhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgaW50IHJ3LAogCQkJICAgICB1NjQgbG9naWNhbCwgdTY0ICpsZW5ndGgsCi0JCQkgICAgIHN0cnVjdCBidHJmc19tdWx0aV9iaW8gKiptdWx0aV9yZXQsCisJCQkgICAgIHN0cnVjdCBidHJmc19iaW8gKipiYmlvX3JldCwKIAkJCSAgICAgaW50IG1pcnJvcl9udW0pCiB7CiAJc3RydWN0IGV4dGVudF9tYXAgKmVtOwpAQCAtMjg2NiwxOCArMjkwMSwxOCBAQAogCWludCBpOwogCWludCBudW1fc3RyaXBlczsKIAlpbnQgbWF4X2Vycm9ycyA9IDA7Ci0Jc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqbXVsdGkgPSBOVUxMOworCXN0cnVjdCBidHJmc19iaW8gKmJiaW8gPSBOVUxMOwogCi0JaWYgKG11bHRpX3JldCAmJiAhKHJ3ICYgKFJFUV9XUklURSB8IFJFUV9ESVNDQVJEKSkpCisJaWYgKGJiaW9fcmV0ICYmICEocncgJiAoUkVRX1dSSVRFIHwgUkVRX0RJU0NBUkQpKSkKIAkJc3RyaXBlc19hbGxvY2F0ZWQgPSAxOwogYWdhaW46Ci0JaWYgKG11bHRpX3JldCkgewotCQltdWx0aSA9IGt6YWxsb2MoYnRyZnNfbXVsdGlfYmlvX3NpemUoc3RyaXBlc19hbGxvY2F0ZWQpLAorCWlmIChiYmlvX3JldCkgeworCQliYmlvID0ga3phbGxvYyhidHJmc19iaW9fc2l6ZShzdHJpcGVzX2FsbG9jYXRlZCksCiAJCQkJR0ZQX05PRlMpOwotCQlpZiAoIW11bHRpKQorCQlpZiAoIWJiaW8pCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlhdG9taWNfc2V0KCZtdWx0aS0+ZXJyb3IsIDApOworCQlhdG9taWNfc2V0KCZiYmlvLT5lcnJvciwgMCk7CiAJfQogCiAJcmVhZF9sb2NrKCZlbV90cmVlLT5sb2NrKTsKQEAgLTI4OTgsNyArMjkzMyw3IEBACiAJaWYgKG1pcnJvcl9udW0gPiBtYXAtPm51bV9zdHJpcGVzKQogCQltaXJyb3JfbnVtID0gMDsKIAotCS8qIGlmIG91ciBtdWx0aSBiaW8gc3RydWN0IGlzIHRvbyBzbWFsbCwgYmFjayBvZmYgYW5kIHRyeSBhZ2FpbiAqLworCS8qIGlmIG91ciBidHJmc19iaW8gc3RydWN0IGlzIHRvbyBzbWFsbCwgYmFjayBvZmYgYW5kIHRyeSBhZ2FpbiAqLwogCWlmIChydyAmIFJFUV9XUklURSkgewogCQlpZiAobWFwLT50eXBlICYgKEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxIHwKIAkJCQkgQlRSRlNfQkxPQ0tfR1JPVVBfRFVQKSkgewpAQCAtMjkxNywxMSArMjk1MiwxMSBAQAogCQkJc3RyaXBlc19yZXF1aXJlZCA9IG1hcC0+bnVtX3N0cmlwZXM7CiAJCX0KIAl9Ci0JaWYgKG11bHRpX3JldCAmJiAocncgJiAoUkVRX1dSSVRFIHwgUkVRX0RJU0NBUkQpKSAmJgorCWlmIChiYmlvX3JldCAmJiAocncgJiAoUkVRX1dSSVRFIHwgUkVRX0RJU0NBUkQpKSAmJgogCSAgICBzdHJpcGVzX2FsbG9jYXRlZCA8IHN0cmlwZXNfcmVxdWlyZWQpIHsKIAkJc3RyaXBlc19hbGxvY2F0ZWQgPSBtYXAtPm51bV9zdHJpcGVzOwogCQlmcmVlX2V4dGVudF9tYXAoZW0pOwotCQlrZnJlZShtdWx0aSk7CisJCWtmcmVlKGJiaW8pOwogCQlnb3RvIGFnYWluOwogCX0KIAlzdHJpcGVfbnIgPSBvZmZzZXQ7CkBAIC0yOTUwLDcgKzI5ODUsNyBAQAogCQkqbGVuZ3RoID0gZW0tPmxlbiAtIG9mZnNldDsKIAl9CiAKLQlpZiAoIW11bHRpX3JldCkKKwlpZiAoIWJiaW9fcmV0KQogCQlnb3RvIG91dDsKIAogCW51bV9zdHJpcGVzID0gMTsKQEAgLTI5NzUsMTMgKzMwMTAsMTcgQEAKIAkJCXN0cmlwZV9pbmRleCA9IGZpbmRfbGl2ZV9taXJyb3IobWFwLCAwLAogCQkJCQkgICAgbWFwLT5udW1fc3RyaXBlcywKIAkJCQkJICAgIGN1cnJlbnQtPnBpZCAlIG1hcC0+bnVtX3N0cmlwZXMpOworCQkJbWlycm9yX251bSA9IHN0cmlwZV9pbmRleCArIDE7CiAJCX0KIAogCX0gZWxzZSBpZiAobWFwLT50eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfRFVQKSB7Ci0JCWlmIChydyAmIChSRVFfV1JJVEUgfCBSRVFfRElTQ0FSRCkpCisJCWlmIChydyAmIChSRVFfV1JJVEUgfCBSRVFfRElTQ0FSRCkpIHsKIAkJCW51bV9zdHJpcGVzID0gbWFwLT5udW1fc3RyaXBlczsKLQkJZWxzZSBpZiAobWlycm9yX251bSkKKwkJfSBlbHNlIGlmIChtaXJyb3JfbnVtKSB7CiAJCQlzdHJpcGVfaW5kZXggPSBtaXJyb3JfbnVtIC0gMTsKKwkJfSBlbHNlIHsKKwkJCW1pcnJvcl9udW0gPSAxOworCQl9CiAKIAl9IGVsc2UgaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkgewogCQlpbnQgZmFjdG9yID0gbWFwLT5udW1fc3RyaXBlcyAvIG1hcC0+c3ViX3N0cmlwZXM7CkBAIC0zMDAxLDYgKzMwNDAsNyBAQAogCQkJc3RyaXBlX2luZGV4ID0gZmluZF9saXZlX21pcnJvcihtYXAsIHN0cmlwZV9pbmRleCwKIAkJCQkJICAgICAgbWFwLT5zdWJfc3RyaXBlcywgc3RyaXBlX2luZGV4ICsKIAkJCQkJICAgICAgY3VycmVudC0+cGlkICUgbWFwLT5zdWJfc3RyaXBlcyk7CisJCQltaXJyb3JfbnVtID0gc3RyaXBlX2luZGV4ICsgMTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qCkBAIC0zMDA5LDE1ICszMDQ5LDE2IEBACiAJCSAqIHN0cmlwZV9pbmRleCBpcyB0aGUgbnVtYmVyIG9mIG91ciBkZXZpY2UgaW4gdGhlIHN0cmlwZSBhcnJheQogCQkgKi8KIAkJc3RyaXBlX2luZGV4ID0gZG9fZGl2KHN0cmlwZV9uciwgbWFwLT5udW1fc3RyaXBlcyk7CisJCW1pcnJvcl9udW0gPSBzdHJpcGVfaW5kZXggKyAxOwogCX0KIAlCVUdfT04oc3RyaXBlX2luZGV4ID49IG1hcC0+bnVtX3N0cmlwZXMpOwogCiAJaWYgKHJ3ICYgUkVRX0RJU0NBUkQpIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9zdHJpcGVzOyBpKyspIHsKLQkJCW11bHRpLT5zdHJpcGVzW2ldLnBoeXNpY2FsID0KKwkJCWJiaW8tPnN0cmlwZXNbaV0ucGh5c2ljYWwgPQogCQkJCW1hcC0+c3RyaXBlc1tzdHJpcGVfaW5kZXhdLnBoeXNpY2FsICsKIAkJCQlzdHJpcGVfb2Zmc2V0ICsgc3RyaXBlX25yICogbWFwLT5zdHJpcGVfbGVuOwotCQkJbXVsdGktPnN0cmlwZXNbaV0uZGV2ID0gbWFwLT5zdHJpcGVzW3N0cmlwZV9pbmRleF0uZGV2OworCQkJYmJpby0+c3RyaXBlc1tpXS5kZXYgPSBtYXAtPnN0cmlwZXNbc3RyaXBlX2luZGV4XS5kZXY7CiAKIAkJCWlmIChtYXAtPnR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMCkgewogCQkJCXU2NCBzdHJpcGVzOwpAQCAtMzAzOCwxNiArMzA3OSwxNiBAQAogCQkJCX0KIAkJCQlzdHJpcGVzID0gc3RyaXBlX25yX2VuZCAtIDEgLSBqOwogCQkJCWRvX2RpdihzdHJpcGVzLCBtYXAtPm51bV9zdHJpcGVzKTsKLQkJCQltdWx0aS0+c3RyaXBlc1tpXS5sZW5ndGggPSBtYXAtPnN0cmlwZV9sZW4gKgorCQkJCWJiaW8tPnN0cmlwZXNbaV0ubGVuZ3RoID0gbWFwLT5zdHJpcGVfbGVuICoKIAkJCQkJKHN0cmlwZXMgLSBzdHJpcGVfbnIgKyAxKTsKIAogCQkJCWlmIChpID09IDApIHsKLQkJCQkJbXVsdGktPnN0cmlwZXNbaV0ubGVuZ3RoIC09CisJCQkJCWJiaW8tPnN0cmlwZXNbaV0ubGVuZ3RoIC09CiAJCQkJCQlzdHJpcGVfb2Zmc2V0OwogCQkJCQlzdHJpcGVfb2Zmc2V0ID0gMDsKIAkJCQl9CiAJCQkJaWYgKHN0cmlwZV9pbmRleCA9PSBsYXN0X3N0cmlwZSkKLQkJCQkJbXVsdGktPnN0cmlwZXNbaV0ubGVuZ3RoIC09CisJCQkJCWJiaW8tPnN0cmlwZXNbaV0ubGVuZ3RoIC09CiAJCQkJCQlzdHJpcGVfZW5kX29mZnNldDsKIAkJCX0gZWxzZSBpZiAobWFwLT50eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEwKSB7CiAJCQkJdTY0IHN0cmlwZXM7CkBAIC0zMDcyLDExICszMTEzLDExIEBACiAJCQkJfQogCQkJCXN0cmlwZXMgPSBzdHJpcGVfbnJfZW5kIC0gMSAtIGo7CiAJCQkJZG9fZGl2KHN0cmlwZXMsIGZhY3Rvcik7Ci0JCQkJbXVsdGktPnN0cmlwZXNbaV0ubGVuZ3RoID0gbWFwLT5zdHJpcGVfbGVuICoKKwkJCQliYmlvLT5zdHJpcGVzW2ldLmxlbmd0aCA9IG1hcC0+c3RyaXBlX2xlbiAqCiAJCQkJCShzdHJpcGVzIC0gc3RyaXBlX25yICsgMSk7CiAKIAkJCQlpZiAoaSA8IG1hcC0+c3ViX3N0cmlwZXMpIHsKLQkJCQkJbXVsdGktPnN0cmlwZXNbaV0ubGVuZ3RoIC09CisJCQkJCWJiaW8tPnN0cmlwZXNbaV0ubGVuZ3RoIC09CiAJCQkJCQlzdHJpcGVfb2Zmc2V0OwogCQkJCQlpZiAoaSA9PSBtYXAtPnN1Yl9zdHJpcGVzIC0gMSkKIAkJCQkJCXN0cmlwZV9vZmZzZXQgPSAwOwpAQCAtMzA4NCwxMSArMzEyNSwxMSBAQAogCQkJCWlmIChzdHJpcGVfaW5kZXggPj0gbGFzdF9zdHJpcGUgJiYKIAkJCQkgICAgc3RyaXBlX2luZGV4IDw9IChsYXN0X3N0cmlwZSArCiAJCQkJCQkgICAgIG1hcC0+c3ViX3N0cmlwZXMgLSAxKSkgewotCQkJCQltdWx0aS0+c3RyaXBlc1tpXS5sZW5ndGggLT0KKwkJCQkJYmJpby0+c3RyaXBlc1tpXS5sZW5ndGggLT0KIAkJCQkJCXN0cmlwZV9lbmRfb2Zmc2V0OwogCQkJCX0KIAkJCX0gZWxzZQotCQkJCW11bHRpLT5zdHJpcGVzW2ldLmxlbmd0aCA9ICpsZW5ndGg7CisJCQkJYmJpby0+c3RyaXBlc1tpXS5sZW5ndGggPSAqbGVuZ3RoOwogCiAJCQlzdHJpcGVfaW5kZXgrKzsKIAkJCWlmIChzdHJpcGVfaW5kZXggPT0gbWFwLT5udW1fc3RyaXBlcykgewpAQCAtMzA5OSwxOSArMzE0MCwyMCBAQAogCQl9CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9zdHJpcGVzOyBpKyspIHsKLQkJCW11bHRpLT5zdHJpcGVzW2ldLnBoeXNpY2FsID0KKwkJCWJiaW8tPnN0cmlwZXNbaV0ucGh5c2ljYWwgPQogCQkJCW1hcC0+c3RyaXBlc1tzdHJpcGVfaW5kZXhdLnBoeXNpY2FsICsKIAkJCQlzdHJpcGVfb2Zmc2V0ICsKIAkJCQlzdHJpcGVfbnIgKiBtYXAtPnN0cmlwZV9sZW47Ci0JCQltdWx0aS0+c3RyaXBlc1tpXS5kZXYgPQorCQkJYmJpby0+c3RyaXBlc1tpXS5kZXYgPQogCQkJCW1hcC0+c3RyaXBlc1tzdHJpcGVfaW5kZXhdLmRldjsKIAkJCXN0cmlwZV9pbmRleCsrOwogCQl9CiAJfQotCWlmIChtdWx0aV9yZXQpIHsKLQkJKm11bHRpX3JldCA9IG11bHRpOwotCQltdWx0aS0+bnVtX3N0cmlwZXMgPSBudW1fc3RyaXBlczsKLQkJbXVsdGktPm1heF9lcnJvcnMgPSBtYXhfZXJyb3JzOworCWlmIChiYmlvX3JldCkgeworCQkqYmJpb19yZXQgPSBiYmlvOworCQliYmlvLT5udW1fc3RyaXBlcyA9IG51bV9zdHJpcGVzOworCQliYmlvLT5tYXhfZXJyb3JzID0gbWF4X2Vycm9yczsKKwkJYmJpby0+bWlycm9yX251bSA9IG1pcnJvcl9udW07CiAJfQogb3V0OgogCWZyZWVfZXh0ZW50X21hcChlbSk7CkBAIC0zMTIwLDkgKzMxNjIsOSBAQAogCiBpbnQgYnRyZnNfbWFwX2Jsb2NrKHN0cnVjdCBidHJmc19tYXBwaW5nX3RyZWUgKm1hcF90cmVlLCBpbnQgcncsCiAJCSAgICAgIHU2NCBsb2dpY2FsLCB1NjQgKmxlbmd0aCwKLQkJICAgICAgc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqKm11bHRpX3JldCwgaW50IG1pcnJvcl9udW0pCisJCSAgICAgIHN0cnVjdCBidHJmc19iaW8gKipiYmlvX3JldCwgaW50IG1pcnJvcl9udW0pCiB7Ci0JcmV0dXJuIF9fYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBydywgbG9naWNhbCwgbGVuZ3RoLCBtdWx0aV9yZXQsCisJcmV0dXJuIF9fYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBydywgbG9naWNhbCwgbGVuZ3RoLCBiYmlvX3JldCwKIAkJCQkgbWlycm9yX251bSk7CiB9CiAKQEAgLTMxOTEsMjggKzMyMzMsMzAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZW5kX2Jpb19tdWx0aV9zdHJpcGUoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQorc3RhdGljIHZvaWQgYnRyZnNfZW5kX2JpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7Ci0Jc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqbXVsdGkgPSBiaW8tPmJpX3ByaXZhdGU7CisJc3RydWN0IGJ0cmZzX2JpbyAqYmJpbyA9IGJpby0+YmlfcHJpdmF0ZTsKIAlpbnQgaXNfb3JpZ19iaW8gPSAwOwogCiAJaWYgKGVycikKLQkJYXRvbWljX2luYygmbXVsdGktPmVycm9yKTsKKwkJYXRvbWljX2luYygmYmJpby0+ZXJyb3IpOwogCi0JaWYgKGJpbyA9PSBtdWx0aS0+b3JpZ19iaW8pCisJaWYgKGJpbyA9PSBiYmlvLT5vcmlnX2JpbykKIAkJaXNfb3JpZ19iaW8gPSAxOwogCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm11bHRpLT5zdHJpcGVzX3BlbmRpbmcpKSB7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJiaW8tPnN0cmlwZXNfcGVuZGluZykpIHsKIAkJaWYgKCFpc19vcmlnX2JpbykgewogCQkJYmlvX3B1dChiaW8pOwotCQkJYmlvID0gbXVsdGktPm9yaWdfYmlvOworCQkJYmlvID0gYmJpby0+b3JpZ19iaW87CiAJCX0KLQkJYmlvLT5iaV9wcml2YXRlID0gbXVsdGktPnByaXZhdGU7Ci0JCWJpby0+YmlfZW5kX2lvID0gbXVsdGktPmVuZF9pbzsKKwkJYmlvLT5iaV9wcml2YXRlID0gYmJpby0+cHJpdmF0ZTsKKwkJYmlvLT5iaV9lbmRfaW8gPSBiYmlvLT5lbmRfaW87CisJCWJpby0+YmlfYmRldiA9IChzdHJ1Y3QgYmxvY2tfZGV2aWNlICopCisJCQkJCSh1bnNpZ25lZCBsb25nKWJiaW8tPm1pcnJvcl9udW07CiAJCS8qIG9ubHkgc2VuZCBhbiBlcnJvciB0byB0aGUgaGlnaGVyIGxheWVycyBpZiBpdCBpcwogCQkgKiBiZXlvbmQgdGhlIHRvbGVyYW5jZSBvZiB0aGUgbXVsdGktYmlvCiAJCSAqLwotCQlpZiAoYXRvbWljX3JlYWQoJm11bHRpLT5lcnJvcikgPiBtdWx0aS0+bWF4X2Vycm9ycykgeworCQlpZiAoYXRvbWljX3JlYWQoJmJiaW8tPmVycm9yKSA+IGJiaW8tPm1heF9lcnJvcnMpIHsKIAkJCWVyciA9IC1FSU87CiAJCX0gZWxzZSBpZiAoZXJyKSB7CiAJCQkvKgpAQCAtMzIyMiw3ICszMjY2LDcgQEAKIAkJCXNldF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CiAJCQllcnIgPSAwOwogCQl9Ci0JCWtmcmVlKG11bHRpKTsKKwkJa2ZyZWUoYmJpbyk7CiAKIAkJYmlvX2VuZGlvKGJpbywgZXJyKTsKIAl9IGVsc2UgaWYgKCFpc19vcmlnX2JpbykgewpAQCAtMzMwMiwyMCArMzM0NiwyMCBAQAogCXU2NCBsb2dpY2FsID0gKHU2NCliaW8tPmJpX3NlY3RvciA8PCA5OwogCXU2NCBsZW5ndGggPSAwOwogCXU2NCBtYXBfbGVuZ3RoOwotCXN0cnVjdCBidHJmc19tdWx0aV9iaW8gKm11bHRpID0gTlVMTDsKIAlpbnQgcmV0OwogCWludCBkZXZfbnIgPSAwOwogCWludCB0b3RhbF9kZXZzID0gMTsKKwlzdHJ1Y3QgYnRyZnNfYmlvICpiYmlvID0gTlVMTDsKIAogCWxlbmd0aCA9IGJpby0+Ymlfc2l6ZTsKIAltYXBfdHJlZSA9ICZyb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWU7CiAJbWFwX2xlbmd0aCA9IGxlbmd0aDsKIAotCXJldCA9IGJ0cmZzX21hcF9ibG9jayhtYXBfdHJlZSwgcncsIGxvZ2ljYWwsICZtYXBfbGVuZ3RoLCAmbXVsdGksCisJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBydywgbG9naWNhbCwgJm1hcF9sZW5ndGgsICZiYmlvLAogCQkJICAgICAgbWlycm9yX251bSk7CiAJQlVHX09OKHJldCk7CiAKLQl0b3RhbF9kZXZzID0gbXVsdGktPm51bV9zdHJpcGVzOworCXRvdGFsX2RldnMgPSBiYmlvLT5udW1fc3RyaXBlczsKIAlpZiAobWFwX2xlbmd0aCA8IGxlbmd0aCkgewogCQlwcmludGsoS0VSTl9DUklUICJtYXBwaW5nIGZhaWxlZCBsb2dpY2FsICVsbHUgYmlvIGxlbiAlbGx1ICIKIAkJICAgICAgICJsZW4gJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsb2dpY2FsLApAQCAtMzMyMywyNSArMzM2NywyOCBAQAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltYXBfbGVuZ3RoKTsKIAkJQlVHKCk7CiAJfQotCW11bHRpLT5lbmRfaW8gPSBmaXJzdF9iaW8tPmJpX2VuZF9pbzsKLQltdWx0aS0+cHJpdmF0ZSA9IGZpcnN0X2Jpby0+YmlfcHJpdmF0ZTsKLQltdWx0aS0+b3JpZ19iaW8gPSBmaXJzdF9iaW87Ci0JYXRvbWljX3NldCgmbXVsdGktPnN0cmlwZXNfcGVuZGluZywgbXVsdGktPm51bV9zdHJpcGVzKTsKKworCWJiaW8tPm9yaWdfYmlvID0gZmlyc3RfYmlvOworCWJiaW8tPnByaXZhdGUgPSBmaXJzdF9iaW8tPmJpX3ByaXZhdGU7CisJYmJpby0+ZW5kX2lvID0gZmlyc3RfYmlvLT5iaV9lbmRfaW87CisJYXRvbWljX3NldCgmYmJpby0+c3RyaXBlc19wZW5kaW5nLCBiYmlvLT5udW1fc3RyaXBlcyk7CiAKIAl3aGlsZSAoZGV2X25yIDwgdG90YWxfZGV2cykgewotCQlpZiAodG90YWxfZGV2cyA+IDEpIHsKLQkJCWlmIChkZXZfbnIgPCB0b3RhbF9kZXZzIC0gMSkgewotCQkJCWJpbyA9IGJpb19jbG9uZShmaXJzdF9iaW8sIEdGUF9OT0ZTKTsKLQkJCQlCVUdfT04oIWJpbyk7Ci0JCQl9IGVsc2UgewotCQkJCWJpbyA9IGZpcnN0X2JpbzsKLQkJCX0KLQkJCWJpby0+YmlfcHJpdmF0ZSA9IG11bHRpOwotCQkJYmlvLT5iaV9lbmRfaW8gPSBlbmRfYmlvX211bHRpX3N0cmlwZTsKKwkJaWYgKGRldl9uciA8IHRvdGFsX2RldnMgLSAxKSB7CisJCQliaW8gPSBiaW9fY2xvbmUoZmlyc3RfYmlvLCBHRlBfTk9GUyk7CisJCQlCVUdfT04oIWJpbyk7CisJCX0gZWxzZSB7CisJCQliaW8gPSBmaXJzdF9iaW87CiAJCX0KLQkJYmlvLT5iaV9zZWN0b3IgPSBtdWx0aS0+c3RyaXBlc1tkZXZfbnJdLnBoeXNpY2FsID4+IDk7Ci0JCWRldiA9IG11bHRpLT5zdHJpcGVzW2Rldl9ucl0uZGV2OworCQliaW8tPmJpX3ByaXZhdGUgPSBiYmlvOworCQliaW8tPmJpX2VuZF9pbyA9IGJ0cmZzX2VuZF9iaW87CisJCWJpby0+Ymlfc2VjdG9yID0gYmJpby0+c3RyaXBlc1tkZXZfbnJdLnBoeXNpY2FsID4+IDk7CisJCWRldiA9IGJiaW8tPnN0cmlwZXNbZGV2X25yXS5kZXY7CiAJCWlmIChkZXYgJiYgZGV2LT5iZGV2ICYmIChydyAhPSBXUklURSB8fCBkZXYtPndyaXRlYWJsZSkpIHsKKwkJCXByX2RlYnVnKCJidHJmc19tYXBfYmlvOiBydyAlZCwgc2Vjb3I9JWxsdSwgZGV2PSVsdSAiCisJCQkJICIoJXMgaWQgJWxsdSksIHNpemU9JXVcbiIsIHJ3LAorCQkJCSAodTY0KWJpby0+Ymlfc2VjdG9yLCAodV9sb25nKWRldi0+YmRldi0+YmRfZGV2LAorCQkJCSBkZXYtPm5hbWUsIGRldi0+ZGV2aWQsIGJpby0+Ymlfc2l6ZSk7CiAJCQliaW8tPmJpX2JkZXYgPSBkZXYtPmJkZXY7CiAJCQlpZiAoYXN5bmNfc3VibWl0KQogCQkJCXNjaGVkdWxlX2Jpbyhyb290LCBkZXYsIHJ3LCBiaW8pOwpAQCAtMzM1NCw4ICszNDAxLDYgQEAKIAkJfQogCQlkZXZfbnIrKzsKIAl9Ci0JaWYgKHRvdGFsX2RldnMgPT0gMSkKLQkJa2ZyZWUobXVsdGkpOwogCXJldHVybiAwOwogfQogCkBAIC0zNjE2LDE1ICszNjYxLDIwIEBACiAJZmlsbF9kZXZpY2VfZnJvbV9pdGVtKGxlYWYsIGRldl9pdGVtLCBkZXZpY2UpOwogCWRldmljZS0+ZGV2X3Jvb3QgPSByb290LT5mc19pbmZvLT5kZXZfcm9vdDsKIAlkZXZpY2UtPmluX2ZzX21ldGFkYXRhID0gMTsKLQlpZiAoZGV2aWNlLT53cml0ZWFibGUpCisJaWYgKGRldmljZS0+d3JpdGVhYmxlKSB7CiAJCWRldmljZS0+ZnNfZGV2aWNlcy0+dG90YWxfcndfYnl0ZXMgKz0gZGV2aWNlLT50b3RhbF9ieXRlczsKKwkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5mcmVlX2NodW5rX2xvY2spOworCQlyb290LT5mc19pbmZvLT5mcmVlX2NodW5rX3NwYWNlICs9IGRldmljZS0+dG90YWxfYnl0ZXMgLQorCQkJZGV2aWNlLT5ieXRlc191c2VkOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwl9CiAJcmV0ID0gMDsKIAlyZXR1cm4gcmV0OwogfQogCiBpbnQgYnRyZnNfcmVhZF9zeXNfYXJyYXkoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqc2I7CiAJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICpkaXNrX2tleTsKIAlzdHJ1Y3QgYnRyZnNfY2h1bmsgKmNodW5rOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5oIGIvZnMvYnRyZnMvdm9sdW1lcy5oCmluZGV4IDZkODY2ZGIuLmFiNWIxYzQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3ZvbHVtZXMuaAorKysgYi9mcy9idHJmcy92b2x1bWVzLmgKQEAgLTkyLDYgKzkyLDE0IEBACiAJc3RydWN0IGJ0cmZzX3dvcmsgd29yazsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogCXN0cnVjdCB3b3JrX3N0cnVjdCByY3Vfd29yazsKKworCS8qIHJlYWRhaGVhZCBzdGF0ZSAqLworCXNwaW5sb2NrX3QgcmVhZGFfbG9jazsKKwlhdG9taWNfdCByZWFkYV9pbl9mbGlnaHQ7CisJdTY0IHJlYWRhX25leHQ7CisJc3RydWN0IHJlYWRhX3pvbmUgKnJlYWRhX2N1cnJfem9uZTsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IHJlYWRhX3pvbmVzOworCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgcmVhZGFfZXh0ZW50czsKIH07CiAKIHN0cnVjdCBidHJmc19mc19kZXZpY2VzIHsKQEAgLTEzNiw3ICsxNDQsMTAgQEAKIAl1NjQgbGVuZ3RoOyAvKiBvbmx5IHVzZWQgZm9yIGRpc2NhcmQgbWFwcGluZ3MgKi8KIH07CiAKLXN0cnVjdCBidHJmc19tdWx0aV9iaW8geworc3RydWN0IGJ0cmZzX2JpbzsKK3R5cGVkZWYgdm9pZCAoYnRyZnNfYmlvX2VuZF9pb190KSAoc3RydWN0IGJ0cmZzX2JpbyAqYmlvLCBpbnQgZXJyKTsKKworc3RydWN0IGJ0cmZzX2JpbyB7CiAJYXRvbWljX3Qgc3RyaXBlc19wZW5kaW5nOwogCWJpb19lbmRfaW9fdCAqZW5kX2lvOwogCXN0cnVjdCBiaW8gKm9yaWdfYmlvOwpAQCAtMTQ0LDYgKzE1NSw3IEBACiAJYXRvbWljX3QgZXJyb3I7CiAJaW50IG1heF9lcnJvcnM7CiAJaW50IG51bV9zdHJpcGVzOworCWludCBtaXJyb3JfbnVtOwogCXN0cnVjdCBidHJmc19iaW9fc3RyaXBlIHN0cmlwZXNbXTsKIH07CiAKQEAgLTE3MSw3ICsxODMsNyBAQAogaW50IGJ0cmZzX2FjY291bnRfZGV2X2V4dGVudHNfc2l6ZShzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UsIHU2NCBzdGFydCwKIAkJCQkgICB1NjQgZW5kLCB1NjQgKmxlbmd0aCk7CiAKLSNkZWZpbmUgYnRyZnNfbXVsdGlfYmlvX3NpemUobikgKHNpemVvZihzdHJ1Y3QgYnRyZnNfbXVsdGlfYmlvKSArIFwKKyNkZWZpbmUgYnRyZnNfYmlvX3NpemUobikgKHNpemVvZihzdHJ1Y3QgYnRyZnNfYmlvKSArIFwKIAkJCSAgICAoc2l6ZW9mKHN0cnVjdCBidHJmc19iaW9fc3RyaXBlKSAqIChuKSkpCiAKIGludCBidHJmc19hbGxvY19kZXZfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLApAQCAtMTgwLDcgKzE5Miw3IEBACiAJCQkgICB1NjQgY2h1bmtfb2Zmc2V0LCB1NjQgc3RhcnQsIHU2NCBudW1fYnl0ZXMpOwogaW50IGJ0cmZzX21hcF9ibG9jayhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgaW50IHJ3LAogCQkgICAgdTY0IGxvZ2ljYWwsIHU2NCAqbGVuZ3RoLAotCQkgICAgc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqKm11bHRpX3JldCwgaW50IG1pcnJvcl9udW0pOworCQkgICAgc3RydWN0IGJ0cmZzX2JpbyAqKmJiaW9fcmV0LCBpbnQgbWlycm9yX251bSk7CiBpbnQgYnRyZnNfcm1hcF9ibG9jayhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwKIAkJICAgICB1NjQgY2h1bmtfc3RhcnQsIHU2NCBwaHlzaWNhbCwgdTY0IGRldmlkLAogCQkgICAgIHU2NCAqKmxvZ2ljYWwsIGludCAqbmFkZHJzLCBpbnQgKnN0cmlwZV9sZW4pOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMveGF0dHIuYyBiL2ZzL2J0cmZzL3hhdHRyLmMKaW5kZXggNDI2YWE0Ni4uMzg0OGIwNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMveGF0dHIuYworKysgYi9mcy9idHJmcy94YXR0ci5jCkBAIC0xMjcsNiArMTI3LDE3IEBACiBhZ2FpbjoKIAlyZXQgPSBidHJmc19pbnNlcnRfeGF0dHJfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgYnRyZnNfaW5vKGlub2RlKSwKIAkJCQkgICAgICBuYW1lLCBuYW1lX2xlbiwgdmFsdWUsIHNpemUpOworCS8qCisJICogSWYgd2UncmUgc2V0dGluZyBhbiB4YXR0ciB0byBhIG5ldyB2YWx1ZSBidXQgdGhlIG5ldyB2YWx1ZSBpcyBzYXkKKwkgKiBleGFjdGx5IEJUUkZTX01BWF9YQVRUUl9TSVpFLCB3ZSBjb3VsZCBlbmQgdXAgd2l0aCBFT1ZFUkZMT1cgZ2V0dGluZworCSAqIGJhY2sgZnJvbSBzcGxpdF9sZWFmLiAgVGhpcyBpcyBiZWNhdXNlIGl0IHRoaW5rcyB3ZSdsbCBiZSBleHRlbmRpbmcKKwkgKiB0aGUgZXhpc3RpbmcgaXRlbSBzaXplLCBidXQgd2UncmUgYXNraW5nIGZvciBlbm91Z2ggc3BhY2UgdG8gYWRkIHRoZQorCSAqIGl0ZW0gaXRzZWxmLiAgU28gaWYgd2UgZ2V0IEVPVkVSRkxPVyBqdXN0IHNldCByZXQgdG8gRUVYSVNUIGFuZCBsZXQKKwkgKiB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gZmlndXJlIGl0IG91dC4KKwkgKi8KKwlpZiAocmV0ID09IC1FT1ZFUkZMT1cpCisJCXJldCA9IC1FRVhJU1Q7CisKIAlpZiAocmV0ID09IC1FRVhJU1QpIHsKIAkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKQogCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IDFhODBiMDQuLjE5ZDhlYjcgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0yMTMsMTMgKzIxMywxNiBAQAogCSAqIGVsc2V3aGVyZSwgZG9uJ3QgYnVmZmVyX2Vycm9yIGlmIHdlIGhhZCBzb21lIHVubWFwcGVkIGJ1ZmZlcnMKIAkgKi8KIAlpZiAoYWxsX21hcHBlZCkgeworCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKIAkJcHJpbnRrKCJfX2ZpbmRfZ2V0X2Jsb2NrX3Nsb3coKSBmYWlsZWQuICIKIAkJCSJibG9jaz0lbGx1LCBiX2Jsb2NrbnI9JWxsdVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2ssCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOwogCQlwcmludGsoImJfc3RhdGU9MHglMDhseCwgYl9zaXplPSV6dVxuIiwKIAkJCWJoLT5iX3N0YXRlLCBiaC0+Yl9zaXplKTsKLQkJcHJpbnRrKCJkZXZpY2UgYmxvY2tzaXplOiAlZFxuIiwgMSA8PCBiZF9pbm9kZS0+aV9ibGtiaXRzKTsKKwkJcHJpbnRrKCJkZXZpY2UgJXMgYmxvY2tzaXplOiAlZFxuIiwgYmRldm5hbWUoYmRldiwgYiksCisJCQkxIDw8IGJkX2lub2RlLT5pX2Jsa2JpdHMpOwogCX0KIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJmJkX21hcHBpbmctPnByaXZhdGVfbG9jayk7CkBAIC0yODUsNyArMjg4LDcgQEAKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAlpbnQgbmlkOwogCi0Jd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcygxMDI0KTsKKwl3YWtldXBfZmx1c2hlcl90aHJlYWRzKDEwMjQsIFdCX1JFQVNPTl9GUkVFX01PUkVfTUVNKTsKIAl5aWVsZCgpOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CkBAIC0xNDcwLDEzICsxNDczLDEzIEBACiB9CiAKIC8qKgotICogYmxvY2tfaW52YWxpZGF0ZXBhZ2UgLSBpbnZhbGlkYXRlIHBhcnQgb2YgYWxsIG9mIGEgYnVmZmVyLWJhY2tlZCBwYWdlCisgKiBibG9ja19pbnZhbGlkYXRlcGFnZSAtIGludmFsaWRhdGUgcGFydCBvciBhbGwgb2YgYSBidWZmZXItYmFja2VkIHBhZ2UKICAqCiAgKiBAcGFnZTogdGhlIHBhZ2Ugd2hpY2ggaXMgYWZmZWN0ZWQKICAqIEBvZmZzZXQ6IHRoZSBpbmRleCBvZiB0aGUgdHJ1bmNhdGlvbiBwb2ludAogICoKICAqIGJsb2NrX2ludmFsaWRhdGVwYWdlKCkgaXMgY2FsbGVkIHdoZW4gYWxsIG9yIHBhcnQgb2YgdGhlIHBhZ2UgaGFzIGJlY29tZQotICogaW52YWxpZGF0ZWRieSBhIHRydW5jYXRlIG9wZXJhdGlvbi4KKyAqIGludmFsaWRhdGVkIGJ5IGEgdHJ1bmNhdGUgb3BlcmF0aW9uLgogICoKICAqIGJsb2NrX2ludmFsaWRhdGVwYWdlKCkgZG9lcyBub3QgaGF2ZSB0byByZWxlYXNlIGFsbCBidWZmZXJzLCBidXQgaXQgbXVzdAogICogZW5zdXJlIHRoYXQgbm8gZGlydHkgYnVmZmVyIGlzIGxlZnQgb3V0c2lkZSBAb2Zmc2V0IGFuZCB0aGF0IG5vIEkvTwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9hZGRyLmMgYi9mcy9jZXBoL2FkZHIuYwppbmRleCA1YTM5NTNkLi40MTQ0Y2FmIDEwMDY0NAotLS0gYS9mcy9jZXBoL2FkZHIuYworKysgYi9mcy9jZXBoL2FkZHIuYwpAQCAtMjI4LDM2ICsyMjgsMTI5IEBACiB9CiAKIC8qCi0gKiBCdWlsZCBhIHZlY3RvciBvZiBjb250aWd1b3VzIHBhZ2VzIGZyb20gdGhlIHByb3ZpZGVkIHBhZ2UgbGlzdC4KKyAqIEZpbmlzaCBhbiBhc3luYyByZWFkKGFoZWFkKSBvcC4KICAqLwotc3RhdGljIHN0cnVjdCBwYWdlICoqcGFnZV92ZWN0b3JfZnJvbV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VfbGlzdCwKLQkJCQkJICAgdW5zaWduZWQgKm5yX3BhZ2VzKQorc3RhdGljIHZvaWQgZmluaXNoX3JlYWQoc3RydWN0IGNlcGhfb3NkX3JlcXVlc3QgKnJlcSwgc3RydWN0IGNlcGhfbXNnICptc2cpCiB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHJlcS0+cl9pbm9kZTsKKwlzdHJ1Y3QgY2VwaF9vc2RfcmVwbHlfaGVhZCAqcmVwbHloZWFkOworCWludCByYywgYnl0ZXM7CisJaW50IGk7CisKKwkvKiBwYXJzZSByZXBseSAqLworCXJlcGx5aGVhZCA9IG1zZy0+ZnJvbnQuaW92X2Jhc2U7CisJV0FSTl9PTihsZTMyX3RvX2NwdShyZXBseWhlYWQtPm51bV9vcHMpID09IDApOworCXJjID0gbGUzMl90b19jcHUocmVwbHloZWFkLT5yZXN1bHQpOworCWJ5dGVzID0gbGUzMl90b19jcHUobXNnLT5oZHIuZGF0YV9sZW4pOworCisJZG91dCgiZmluaXNoX3JlYWQgJXAgcmVxICVwIHJjICVkIGJ5dGVzICVkXG4iLCBpbm9kZSwgcmVxLCByYywgYnl0ZXMpOworCisJLyogdW5sb2NrIGFsbCBwYWdlcywgemVyb2luZyBhbnkgZGF0YSB3ZSBkaWRuJ3QgcmVhZCAqLworCWZvciAoaSA9IDA7IGkgPCByZXEtPnJfbnVtX3BhZ2VzOyBpKyssIGJ5dGVzIC09IFBBR0VfQ0FDSEVfU0laRSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlcS0+cl9wYWdlc1tpXTsKKworCQlpZiAoYnl0ZXMgPCAoaW50KVBBR0VfQ0FDSEVfU0laRSkgeworCQkJLyogemVybyAocmVtYWluZGVyIG9mKSBwYWdlICovCisJCQlpbnQgcyA9IGJ5dGVzIDwgMCA/IDAgOiBieXRlczsKKwkJCXplcm9fdXNlcl9zZWdtZW50KHBhZ2UsIHMsIFBBR0VfQ0FDSEVfU0laRSk7CisJCX0KKyAJCWRvdXQoImZpbmlzaF9yZWFkICVwIHVwdG9kYXRlICVwIGlkeCAlbHVcbiIsIGlub2RlLCBwYWdlLAorCQkgICAgIHBhZ2UtPmluZGV4KTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJa2ZyZWUocmVxLT5yX3BhZ2VzKTsKK30KKworLyoKKyAqIHN0YXJ0IGFuIGFzeW5jIHJlYWQoYWhlYWQpIG9wZXJhdGlvbi4gIHJldHVybiBucl9wYWdlcyB3ZSBzdWJtaXR0ZWQKKyAqIGEgcmVhZCBmb3Igb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBzdGFydF9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VfbGlzdCwgaW50IG1heCkKK3sKKwlzdHJ1Y3QgY2VwaF9vc2RfY2xpZW50ICpvc2RjID0KKwkJJmNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKS0+Y2xpZW50LT5vc2RjOworCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7CisJc3RydWN0IGNlcGhfb3NkX3JlcXVlc3QgKnJlcTsKKwl1NjQgb2ZmOworCXU2NCBsZW47CisJaW50IGk7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgbmV4dF9pbmRleCwgY29udGlnX3BhZ2VzID0gMDsKKwlwZ29mZl90IG5leHRfaW5kZXg7CisJaW50IG5yX3BhZ2VzID0gMDsKKwlpbnQgcmV0OworCisJb2ZmID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIGNvdW50IHBhZ2VzICovCisJbmV4dF9pbmRleCA9IHBhZ2UtPmluZGV4OworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShwYWdlLCBwYWdlX2xpc3QsIGxydSkgeworCQlpZiAocGFnZS0+aW5kZXggIT0gbmV4dF9pbmRleCkKKwkJCWJyZWFrOworCQlucl9wYWdlcysrOworCQluZXh0X2luZGV4Kys7CisJCWlmIChtYXggJiYgbnJfcGFnZXMgPT0gbWF4KQorCQkJYnJlYWs7CisJfQorCWxlbiA9IG5yX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJZG91dCgic3RhcnRfcmVhZCAlcCBucl9wYWdlcyAlZCBpcyAlbGxkfiVsbGRcbiIsIGlub2RlLCBucl9wYWdlcywKKwkgICAgIG9mZiwgbGVuKTsKKworCXJlcSA9IGNlcGhfb3NkY19uZXdfcmVxdWVzdChvc2RjLCAmY2ktPmlfbGF5b3V0LCBjZXBoX3Zpbm8oaW5vZGUpLAorCQkJCSAgICBvZmYsICZsZW4sCisJCQkJICAgIENFUEhfT1NEX09QX1JFQUQsIENFUEhfT1NEX0ZMQUdfUkVBRCwKKwkJCQkgICAgTlVMTCwgMCwKKwkJCQkgICAgY2ktPmlfdHJ1bmNhdGVfc2VxLCBjaS0+aV90cnVuY2F0ZV9zaXplLAorCQkJCSAgICBOVUxMLCBmYWxzZSwgMSwgMCk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRU5PTUVNOwogCiAJLyogYnVpbGQgcGFnZSB2ZWN0b3IgKi8KLQlwYWdlcyA9IGttYWxsb2Moc2l6ZW9mKCpwYWdlcykgKiAqbnJfcGFnZXMsIEdGUF9OT0ZTKTsKKwlucl9wYWdlcyA9IGxlbiA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXBhZ2VzID0ga21hbGxvYyhzaXplb2YoKnBhZ2VzKSAqIG5yX3BhZ2VzLCBHRlBfTk9GUyk7CisJcmV0ID0gLUVOT01FTTsKIAlpZiAoIXBhZ2VzKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCUJVR19PTihsaXN0X2VtcHR5KHBhZ2VfbGlzdCkpOwotCW5leHRfaW5kZXggPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSktPmluZGV4OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShwYWdlLCBwYWdlX2xpc3QsIGxydSkgewotCQlpZiAocGFnZS0+aW5kZXggPT0gbmV4dF9pbmRleCkgewotCQkJZG91dCgicmVhZHBhZ2VzIHBhZ2UgJWQgJXBcbiIsIGNvbnRpZ19wYWdlcywgcGFnZSk7Ci0JCQlwYWdlc1tjb250aWdfcGFnZXNdID0gcGFnZTsKLQkJCWNvbnRpZ19wYWdlcysrOwotCQkJbmV4dF9pbmRleCsrOwotCQl9IGVsc2UgewotCQkJYnJlYWs7CisJCWdvdG8gb3V0OworCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgKytpKSB7CisJCXBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7CisJCUJVR19PTihQYWdlTG9ja2VkKHBhZ2UpKTsKKwkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCQorIAkJZG91dCgic3RhcnRfcmVhZCAlcCBhZGRpbmcgJXAgaWR4ICVsdVxuIiwgaW5vZGUsIHBhZ2UsCisJCSAgICAgcGFnZS0+aW5kZXgpOworCQlpZiAoYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsICZpbm9kZS0+aV9kYXRhLCBwYWdlLT5pbmRleCwKKwkJCQkJICBHRlBfTk9GUykpIHsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCWRvdXQoInN0YXJ0X3JlYWQgJXAgYWRkX3RvX3BhZ2VfY2FjaGUgZmFpbGVkICVwXG4iLAorCQkJICAgICBpbm9kZSwgcGFnZSk7CisJCQlucl9wYWdlcyA9IGk7CisJCQlnb3RvIG91dF9wYWdlczsKIAkJfQorCQlwYWdlc1tpXSA9IHBhZ2U7CiAJfQotCSpucl9wYWdlcyA9IGNvbnRpZ19wYWdlczsKLQlyZXR1cm4gcGFnZXM7CisJcmVxLT5yX3BhZ2VzID0gcGFnZXM7CisJcmVxLT5yX251bV9wYWdlcyA9IG5yX3BhZ2VzOworCXJlcS0+cl9jYWxsYmFjayA9IGZpbmlzaF9yZWFkOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCisJZG91dCgic3RhcnRfcmVhZCAlcCBzdGFydGluZyAlcCAlbGxkfiVsbGRcbiIsIGlub2RlLCByZXEsIG9mZiwgbGVuKTsKKwlyZXQgPSBjZXBoX29zZGNfc3RhcnRfcmVxdWVzdChvc2RjLCByZXEsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfcGFnZXM7CisJY2VwaF9vc2RjX3B1dF9yZXF1ZXN0KHJlcSk7CisJcmV0dXJuIG5yX3BhZ2VzOworCitvdXRfcGFnZXM6CisJY2VwaF9yZWxlYXNlX3BhZ2VfdmVjdG9yKHBhZ2VzLCBucl9wYWdlcyk7CitvdXQ6CisJY2VwaF9vc2RjX3B1dF9yZXF1ZXN0KHJlcSk7CisJcmV0dXJuIHJldDsKIH0KIAorCiAvKgogICogUmVhZCBtdWx0aXBsZSBwYWdlcy4gIExlYXZlIHBhZ2VzIHdlIGRvbid0IHJlYWQgKyB1bmxvY2sgaW4gcGFnZV9saXN0OwogICogdGhlIGNhbGxlciAoVk0pIGNsZWFucyB0aGVtIHVwLgpAQCAtMjY2LDY0ICszNTksMjQgQEAKIAkJCSAgc3RydWN0IGxpc3RfaGVhZCAqcGFnZV9saXN0LCB1bnNpZ25lZCBucl9wYWdlcykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKLQlzdHJ1Y3QgY2VwaF9vc2RfY2xpZW50ICpvc2RjID0KLQkJJmNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKS0+Y2xpZW50LT5vc2RjOworCXN0cnVjdCBjZXBoX2ZzX2NsaWVudCAqZnNjID0gY2VwaF9pbm9kZV90b19jbGllbnQoaW5vZGUpOwogCWludCByYyA9IDA7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlczsKLQlsb2ZmX3Qgb2Zmc2V0OwotCXU2NCBsZW47CisJaW50IG1heCA9IDA7CiAKLQlkb3V0KCJyZWFkcGFnZXMgJXAgZmlsZSAlcCBucl9wYWdlcyAlZFxuIiwKLQkgICAgIGlub2RlLCBmaWxlLCBucl9wYWdlcyk7CisJaWYgKGZzYy0+bW91bnRfb3B0aW9ucy0+cnNpemUgPj0gUEFHRV9DQUNIRV9TSVpFKQorCQltYXggPSAoZnNjLT5tb3VudF9vcHRpb25zLT5yc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpCisJCQk+PiBQQUdFX1NISUZUOwogCi0JcGFnZXMgPSBwYWdlX3ZlY3Rvcl9mcm9tX2xpc3QocGFnZV9saXN0LCAmbnJfcGFnZXMpOwotCWlmIChJU19FUlIocGFnZXMpKQotCQlyZXR1cm4gUFRSX0VSUihwYWdlcyk7Ci0KLQkvKiBndWVzcyByZWFkIGV4dGVudCAqLwotCW9mZnNldCA9IHBhZ2VzWzBdLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOwotCWxlbiA9IG5yX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JcmMgPSBjZXBoX29zZGNfcmVhZHBhZ2VzKG9zZGMsIGNlcGhfdmlubyhpbm9kZSksICZjaS0+aV9sYXlvdXQsCi0JCQkJIG9mZnNldCwgJmxlbiwKLQkJCQkgY2ktPmlfdHJ1bmNhdGVfc2VxLCBjaS0+aV90cnVuY2F0ZV9zaXplLAotCQkJCSBwYWdlcywgbnJfcGFnZXMsIDApOwotCWlmIChyYyA9PSAtRU5PRU5UKQotCQlyYyA9IDA7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlmb3IgKDsgIWxpc3RfZW1wdHkocGFnZV9saXN0KSAmJiBsZW4gPiAwOwotCSAgICAgcmMgLT0gUEFHRV9DQUNIRV9TSVpFLCBsZW4gLT0gUEFHRV9DQUNIRV9TSVpFKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0KLQkJCWxpc3RfZW50cnkocGFnZV9saXN0LT5wcmV2LCBzdHJ1Y3QgcGFnZSwgbHJ1KTsKLQotCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKLQotCQlpZiAocmMgPCAoaW50KVBBR0VfQ0FDSEVfU0laRSkgewotCQkJLyogemVybyAocmVtYWluZGVyIG9mKSBwYWdlICovCi0JCQlpbnQgcyA9IHJjIDwgMCA/IDAgOiByYzsKLQkJCXplcm9fdXNlcl9zZWdtZW50KHBhZ2UsIHMsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JCX0KLQotCQlpZiAoYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsIG1hcHBpbmcsIHBhZ2UtPmluZGV4LAotCQkJCQkgIEdGUF9OT0ZTKSkgewotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJZG91dCgicmVhZHBhZ2VzICVwIGFkZF90b19wYWdlX2NhY2hlIGZhaWxlZCAlcFxuIiwKLQkJCSAgICAgaW5vZGUsIHBhZ2UpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZG91dCgicmVhZHBhZ2VzICVwIGFkZGluZyAlcCBpZHggJWx1XG4iLCBpbm9kZSwgcGFnZSwKLQkJICAgICBwYWdlLT5pbmRleCk7Ci0JCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCXVubG9ja19wYWdlKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJZG91dCgicmVhZHBhZ2VzICVwIGZpbGUgJXAgbnJfcGFnZXMgJWQgbWF4ICVkXG4iLCBpbm9kZSwgZmlsZSwgbnJfcGFnZXMsCisJICAgICBtYXgpOworCXdoaWxlICghbGlzdF9lbXB0eShwYWdlX2xpc3QpKSB7CisJCXJjID0gc3RhcnRfcmVhZChpbm9kZSwgcGFnZV9saXN0LCBtYXgpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCUJVR19PTihyYyA9PSAwKTsKIAl9Ci0JcmMgPSAwOwotCiBvdXQ6Ci0Ja2ZyZWUocGFnZXMpOworCWRvdXQoInJlYWRwYWdlcyAlcCBmaWxlICVwIHJldCAlZFxuIiwgaW5vZGUsIGZpbGUsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvY2Fwcy5jIGIvZnMvY2VwaC9jYXBzLmMKaW5kZXggOGQ3NGFkNy4uMGYzMjdjNiAxMDA2NDQKLS0tIGEvZnMvY2VwaC9jYXBzLmMKKysrIGIvZnMvY2VwaC9jYXBzLmMKQEAgLTQ4NywxNyArNDg3LDE1IEBACiAJCWNpLT5pX3JkY2FjaGVfZ2VuKys7CiAKIAkvKgotCSAqIGlmIHdlIGFyZSBuZXdseSBpc3N1ZWQgRklMRV9TSEFSRUQsIGNsZWFyIElfQ09NUExFVEU7IHdlCisJICogaWYgd2UgYXJlIG5ld2x5IGlzc3VlZCBGSUxFX1NIQVJFRCwgY2xlYXIgRF9DT01QTEVURTsgd2UKIAkgKiBkb24ndCBrbm93IHdoYXQgaGFwcGVuZWQgdG8gdGhpcyBkaXJlY3Rvcnkgd2hpbGUgd2UgZGlkbid0CiAJICogaGF2ZSB0aGUgY2FwLgogCSAqLwogCWlmICgoaXNzdWVkICYgQ0VQSF9DQVBfRklMRV9TSEFSRUQpICYmCiAJICAgIChoYWQgJiBDRVBIX0NBUF9GSUxFX1NIQVJFRCkgPT0gMCkgewogCQljaS0+aV9zaGFyZWRfZ2VuKys7Ci0JCWlmIChTX0lTRElSKGNpLT52ZnNfaW5vZGUuaV9tb2RlKSkgewotCQkJZG91dCgiIG1hcmtpbmcgJXAgTk9UIGNvbXBsZXRlXG4iLCAmY2ktPnZmc19pbm9kZSk7Ci0JCQljaS0+aV9jZXBoX2ZsYWdzICY9IH5DRVBIX0lfQ09NUExFVEU7Ci0JCX0KKwkJaWYgKFNfSVNESVIoY2ktPnZmc19pbm9kZS5pX21vZGUpKQorCQkJY2VwaF9kaXJfY2xlYXJfY29tcGxldGUoJmNpLT52ZnNfaW5vZGUpOwogCX0KIH0KIApAQCAtOTQ1LDcgKzk0Myw3IEBACiAJICAgICBzZXEsIGlzc3VlX3NlcSwgbXNlcSwgZm9sbG93cywgc2l6ZSwgbWF4X3NpemUsCiAJICAgICB4YXR0cl92ZXJzaW9uLCB4YXR0cnNfYnVmID8gKGludCl4YXR0cnNfYnVmLT52ZWMuaW92X2xlbiA6IDApOwogCi0JbXNnID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX0NMSUVOVF9DQVBTLCBzaXplb2YoKmZjKSwgR0ZQX05PRlMpOworCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfQ0FQUywgc2l6ZW9mKCpmYyksIEdGUF9OT0ZTLCBmYWxzZSk7CiAJaWYgKCFtc2cpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMzYzLDcgKzIzNjEsNyBAQAogCX0KIAogCWlmICgoaXNzdWVkICYgQ0VQSF9DQVBfTElOS19FWENMKSA9PSAwKQotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KGdyYW50LT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoZ3JhbnQtPm5saW5rKSk7CiAKIAlpZiAoKGlzc3VlZCAmIENFUEhfQ0FQX1hBVFRSX0VYQ0wpID09IDAgJiYgZ3JhbnQtPnhhdHRyX2xlbikgewogCQlpbnQgbGVuID0gbGUzMl90b19jcHUoZ3JhbnQtPnhhdHRyX2xlbik7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2Rpci5jIGIvZnMvY2VwaC9kaXIuYwppbmRleCAzODJhYmM5Li4yYWJkMGRmIDEwMDY0NAotLS0gYS9mcy9jZXBoL2Rpci5jCisrKyBiL2ZzL2NlcGgvZGlyLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogICogZmFsbGluZyBiYWNrIHRvIGEgIm5vcm1hbCIgc3luYyByZWFkZGlyIGlmIGFueSBkZW50cmllcyBpbiB0aGUgZGlyCiAgKiBhcmUgZHJvcHBlZC4KICAqCi0gKiBJX0NPTVBMRVRFIHRlbGxzIGluZGljYXRlcyB3ZSBoYXZlIGFsbCBkZW50cmllcyBpbiB0aGUgZGlyLiAgSXQgaXMKKyAqIERfQ09NUExFVEUgdGVsbHMgaW5kaWNhdGVzIHdlIGhhdmUgYWxsIGRlbnRyaWVzIGluIHRoZSBkaXIuICBJdCBpcwogICogZGVmaW5lZCBJRkYgd2UgaG9sZCBDRVBIX0NBUF9GSUxFX1NIQVJFRCAod2hpY2ggd2lsbCBiZSByZXZva2VkIGJ5CiAgKiB0aGUgTURTIGlmL3doZW4gdGhlIGRpcmVjdG9yeSBpcyBtb2RpZmllZCkuCiAgKi8KQEAgLTE5OSw4ICsxOTksOCBAQAogCWZpbHAtPmZfcG9zKys7CiAKIAkvKiBtYWtlIHN1cmUgYSBkZW50cnkgd2Fzbid0IGRyb3BwZWQgd2hpbGUgd2UgZGlkbid0IGhhdmUgcGFyZW50IGxvY2sgKi8KLQlpZiAoIWNlcGhfaV90ZXN0KGRpciwgQ0VQSF9JX0NPTVBMRVRFKSkgewotCQlkb3V0KCIgbG9zdCBJX0NPTVBMRVRFIG9uICVwOyBmYWxsaW5nIGJhY2sgdG8gbWRzXG4iLCBkaXIpOworCWlmICghY2VwaF9kaXJfdGVzdF9jb21wbGV0ZShkaXIpKSB7CisJCWRvdXQoIiBsb3N0IERfQ09NUExFVEUgb24gJXA7IGZhbGxpbmcgYmFjayB0byBtZHNcbiIsIGRpcik7CiAJCWVyciA9IC1FQUdBSU47CiAJCWdvdG8gb3V0OwogCX0KQEAgLTI4NSw3ICsyODUsNyBAQAogCWlmICgoZmlscC0+Zl9wb3MgPT0gMiB8fCBmaS0+ZGVudHJ5KSAmJgogCSAgICAhY2VwaF90ZXN0X21vdW50X29wdChmc2MsIE5PQVNZTkNSRUFERElSKSAmJgogCSAgICBjZXBoX3NuYXAoaW5vZGUpICE9IENFUEhfU05BUERJUiAmJgotCSAgICAoY2ktPmlfY2VwaF9mbGFncyAmIENFUEhfSV9DT01QTEVURSkgJiYKKwkgICAgY2VwaF9kaXJfdGVzdF9jb21wbGV0ZShpbm9kZSkgJiYKIAkgICAgX19jZXBoX2NhcHNfaXNzdWVkX21hc2soY2ksIENFUEhfQ0FQX0ZJTEVfU0hBUkVELCAxKSkgewogCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWVyciA9IF9fZGNhY2hlX3JlYWRkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyKTsKQEAgLTM1MSw3ICszNTEsNyBAQAogCiAJCWlmICghcmVxLT5yX2RpZF9wcmVwb3B1bGF0ZSkgewogCQkJZG91dCgicmVhZGRpciAhZGlkX3ByZXBvcHVsYXRlIik7Ci0JCQlmaS0+ZGlyX3JlbGVhc2VfY291bnQtLTsgICAgLyogcHJlY2x1ZGUgSV9DT01QTEVURSAqLworCQkJZmktPmRpcl9yZWxlYXNlX2NvdW50LS07ICAgIC8qIHByZWNsdWRlIERfQ09NUExFVEUgKi8KIAkJfQogCiAJCS8qIG5vdGUgbmV4dCBvZmZzZXQgYW5kIGxhc3QgZGVudHJ5IG5hbWUgKi8KQEAgLTQzMCw4ICs0MzAsNyBAQAogCSAqLwogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJaWYgKGNpLT5pX3JlbGVhc2VfY291bnQgPT0gZmktPmRpcl9yZWxlYXNlX2NvdW50KSB7Ci0JCWRvdXQoIiBtYXJraW5nICVwIGNvbXBsZXRlXG4iLCBpbm9kZSk7Ci0JCS8qIGNpLT5pX2NlcGhfZmxhZ3MgfD0gQ0VQSF9JX0NPTVBMRVRFOyAqLworCQljZXBoX2Rpcl9zZXRfY29tcGxldGUoaW5vZGUpOwogCQljaS0+aV9tYXhfb2Zmc2V0ID0gZmlscC0+Zl9wb3M7CiAJfQogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKQEAgLTYxNCw3ICs2MTMsNyBAQAogCQkJICAgIGZzYy0+bW91bnRfb3B0aW9ucy0+c25hcGRpcl9uYW1lLAogCQkJICAgIGRlbnRyeS0+ZF9uYW1lLmxlbikgJiYKIAkJICAgICFpc19yb290X2NlcGhfZGVudHJ5KGRpciwgZGVudHJ5KSAmJgotCQkgICAgKGNpLT5pX2NlcGhfZmxhZ3MgJiBDRVBIX0lfQ09NUExFVEUpICYmCisJCSAgICBjZXBoX2Rpcl90ZXN0X2NvbXBsZXRlKGRpcikgJiYKIAkJICAgIChfX2NlcGhfY2Fwc19pc3N1ZWRfbWFzayhjaSwgQ0VQSF9DQVBfRklMRV9TSEFSRUQsIDEpKSkgewogCQkJc3Bpbl91bmxvY2soJmRpci0+aV9sb2NrKTsKIAkJCWRvdXQoIiBkaXIgJXAgY29tcGxldGUsIC1FTk9FTlRcbiIsIGRpcik7CkBAIC05MzQsNyArOTMzLDcgQEAKIAkJICovCiAKIAkJLyogZF9tb3ZlIHNjcmV3cyB1cCBkX3N1YmRpcnMgb3JkZXIgKi8KLQkJY2VwaF9pX2NsZWFyKG5ld19kaXIsIENFUEhfSV9DT01QTEVURSk7CisJCWNlcGhfZGlyX2NsZWFyX2NvbXBsZXRlKG5ld19kaXIpOwogCiAJCWRfbW92ZShvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKIApAQCAtMTA5Miw3ICsxMDkxLDc1IEBACiAJcmV0dXJuIDE7CiB9CiAKKy8qCisgKiBTZXQvY2xlYXIvdGVzdCBkaXIgY29tcGxldGUgZmxhZyBvbiB0aGUgZGlyJ3MgZGVudHJ5LgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqIF9fZF9maW5kX2FueV9hbGlhcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmFsaWFzOwogCisJaWYgKGxpc3RfZW1wdHkoJmlub2RlLT5pX2RlbnRyeSkpCisJCXJldHVybiBOVUxMOworCWFsaWFzID0gbGlzdF9maXJzdF9lbnRyeSgmaW5vZGUtPmlfZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwlyZXR1cm4gYWxpYXM7Cit9CisKK3ZvaWQgY2VwaF9kaXJfc2V0X2NvbXBsZXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gX19kX2ZpbmRfYW55X2FsaWFzKGlub2RlKTsKKwkKKwlpZiAoZGVudHJ5ICYmIGNlcGhfZGVudHJ5KGRlbnRyeSkpIHsKKwkJZG91dCgiIG1hcmtpbmcgJXAgKCVwKSBjb21wbGV0ZVxuIiwgaW5vZGUsIGRlbnRyeSk7CisJCXNldF9iaXQoQ0VQSF9EX0NPTVBMRVRFLCAmY2VwaF9kZW50cnkoZGVudHJ5KS0+ZmxhZ3MpOworCX0KK30KKwordm9pZCBjZXBoX2Rpcl9jbGVhcl9jb21wbGV0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IF9fZF9maW5kX2FueV9hbGlhcyhpbm9kZSk7CisKKwlpZiAoZGVudHJ5ICYmIGNlcGhfZGVudHJ5KGRlbnRyeSkpIHsKKwkJZG91dCgiIG1hcmtpbmcgJXAgKCVwKSBOT1QgY29tcGxldGVcbiIsIGlub2RlLCBkZW50cnkpOworCQljbGVhcl9iaXQoQ0VQSF9EX0NPTVBMRVRFLCAmY2VwaF9kZW50cnkoZGVudHJ5KS0+ZmxhZ3MpOworCX0KK30KKworYm9vbCBjZXBoX2Rpcl90ZXN0X2NvbXBsZXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gX19kX2ZpbmRfYW55X2FsaWFzKGlub2RlKTsKKworCWlmIChkZW50cnkgJiYgY2VwaF9kZW50cnkoZGVudHJ5KSkKKwkJcmV0dXJuIHRlc3RfYml0KENFUEhfRF9DT01QTEVURSwgJmNlcGhfZGVudHJ5KGRlbnRyeSktPmZsYWdzKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBXaGVuIHRoZSBWRlMgcHJ1bmVzIGEgZGVudHJ5IGZyb20gdGhlIGNhY2hlLCB3ZSBuZWVkIHRvIGNsZWFyIHRoZQorICogY29tcGxldGUgZmxhZyBvbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKyAqCisgKiBDYWxsZWQgdW5kZXIgZGVudHJ5LT5kX2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIGNlcGhfZF9wcnVuZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGNlcGhfZGVudHJ5X2luZm8gKmRpOworCisJZG91dCgiZF9yZWxlYXNlICVwXG4iLCBkZW50cnkpOworCisJLyogZG8gd2UgaGF2ZSBhIHZhbGlkIHBhcmVudD8gKi8KKwlpZiAoIWRlbnRyeS0+ZF9wYXJlbnQgfHwgSVNfUk9PVChkZW50cnkpKQorCQlyZXR1cm47CisKKwkvKiBpZiB3ZSBhcmUgbm90IGhhc2hlZCwgd2UgZG9uJ3QgYWZmZWN0IERfQ09NUExFVEUgKi8KKwlpZiAoZF91bmhhc2hlZChkZW50cnkpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIHdlIGhvbGQgZF9sb2NrLCBzbyBkX3BhcmVudCBpcyBzdGFibGUsIGFuZCBkX2ZzZGF0YSBpcyBuZXZlcgorCSAqIGNsZWFyZWQgdW50aWwgZF9yZWxlYXNlCisJICovCisJZGkgPSBjZXBoX2RlbnRyeShkZW50cnktPmRfcGFyZW50KTsKKwljbGVhcl9iaXQoQ0VQSF9EX0NPTVBMRVRFLCAmZGktPmZsYWdzKTsKK30KIAogLyoKICAqIHJlYWQoKSBvbiBhIGRpci4gIFRoaXMgd2VpcmQgaW50ZXJmYWNlIGhhY2sgb25seSB3b3JrcyBpZiBtb3VudGVkCkBAIC0xMzA2LDYgKzEzNzMsNyBAQAogY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNlcGhfZGVudHJ5X29wcyA9IHsKIAkuZF9yZXZhbGlkYXRlID0gY2VwaF9kX3JldmFsaWRhdGUsCiAJLmRfcmVsZWFzZSA9IGNlcGhfZF9yZWxlYXNlLAorCS5kX3BydW5lID0gY2VwaF9kX3BydW5lLAogfTsKIAogY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNlcGhfc25hcGRpcl9kZW50cnlfb3BzID0gewpAQCAtMTMxNSw0ICsxMzgzLDUgQEAKIAogY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNlcGhfc25hcF9kZW50cnlfb3BzID0gewogCS5kX3JlbGVhc2UgPSBjZXBoX2RfcmVsZWFzZSwKKwkuZF9wcnVuZSA9IGNlcGhfZF9wcnVuZSwKIH07CmRpZmYgLS1naXQgYS9mcy9jZXBoL2lub2RlLmMgYi9mcy9jZXBoL2lub2RlLmMKaW5kZXggMDk1Nzk5Yi4uZTM5MmJmYyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9pbm9kZS5jCisrKyBiL2ZzL2NlcGgvaW5vZGUuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAKICNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgIm1kc19jbGllbnQuaCIKQEAgLTYxOSw3ICs2MTgsNyBAQAogCX0KIAogCWlmICgoaXNzdWVkICYgQ0VQSF9DQVBfTElOS19FWENMKSA9PSAwKQotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KGluZm8tPm5saW5rKTsKKwkJc2V0X25saW5rKGlub2RlLCBsZTMyX3RvX2NwdShpbmZvLT5ubGluaykpOwogCiAJLyogYmUgY2FyZWZ1bCB3aXRoIG10aW1lLCBhdGltZSwgc2l6ZSAqLwogCWNlcGhfZGVjb2RlX3RpbWVzcGVjKCZhdGltZSwgJmluZm8tPmF0aW1lKTsKQEAgLTc3Miw5ICs3NzEsOSBAQAogCSAgICBjZXBoX3NuYXAoaW5vZGUpID09IENFUEhfTk9TTkFQICYmCiAJICAgIChsZTMyX3RvX2NwdShpbmZvLT5jYXAuY2FwcykgJiBDRVBIX0NBUF9GSUxFX1NIQVJFRCkgJiYKIAkgICAgKGlzc3VlZCAmIENFUEhfQ0FQX0ZJTEVfRVhDTCkgPT0gMCAmJgotCSAgICAoY2ktPmlfY2VwaF9mbGFncyAmIENFUEhfSV9DT01QTEVURSkgPT0gMCkgeworCSAgICAhY2VwaF9kaXJfdGVzdF9jb21wbGV0ZShpbm9kZSkpIHsKIAkJZG91dCgiIG1hcmtpbmcgJXAgY29tcGxldGUgKGVtcHR5KVxuIiwgaW5vZGUpOwotCQkvKiBjaS0+aV9jZXBoX2ZsYWdzIHw9IENFUEhfSV9DT01QTEVURTsgKi8KKwkJY2VwaF9kaXJfc2V0X2NvbXBsZXRlKGlub2RlKTsKIAkJY2ktPmlfbWF4X29mZnNldCA9IDI7CiAJfQogCkBAIC04NTcsNyArODU2LDcgQEAKIAlkaSA9IGNlcGhfZGVudHJ5KGRuKTsKIAogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JaWYgKChjZXBoX2lub2RlKGlub2RlKS0+aV9jZXBoX2ZsYWdzICYgQ0VQSF9JX0NPTVBMRVRFKSA9PSAwKSB7CisJaWYgKCFjZXBoX2Rpcl90ZXN0X2NvbXBsZXRlKGlub2RlKSkgewogCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCXJldHVybjsKIAl9CkBAIC0xMDU3LDcgKzEwNTYsNyBAQAogCQkJICogZF9tb3ZlKCkgcHV0cyB0aGUgcmVuYW1lZCBkZW50cnkgYXQgdGhlIGVuZCBvZgogCQkJICogZF9zdWJkaXJzLiAgV2UgbmVlZCB0byBhc3NpZ24gaXQgYW4gYXBwcm9wcmlhdGUKIAkJCSAqIGRpcmVjdG9yeSBvZmZzZXQgc28gd2UgY2FuIGJlaGF2ZSB3aGVuIGhvbGRpbmcKLQkJCSAqIElfQ09NUExFVEUuCisJCQkgKiBEX0NPTVBMRVRFLgogCQkJICovCiAJCQljZXBoX3NldF9kZW50cnlfb2Zmc2V0KHJlcS0+cl9vbGRfZGVudHJ5KTsKIAkJCWRvdXQoImRuICVwIGdldHMgbmV3IG9mZnNldCAlbGxkXG4iLCByZXEtPnJfb2xkX2RlbnRyeSwgCkBAIC0xMzY0LDQ5ICsxMzYzLDYgQEAKIH0KIAogLyoKLSAqIGludmFsaWRhdGUgYW55IHBhZ2VzIHRoYXQgYXJlIG5vdCBkaXJ0eSBvciB1bmRlciB3cml0ZWJhY2suICB0aGlzCi0gKiBpbmNsdWRlcyBwYWdlcyB0aGF0IGFyZSBjbGVhbiBhbmQgbWFwcGVkLgotICovCi1zdGF0aWMgdm9pZCBjZXBoX2ludmFsaWRhdGVfbm9uZGlydHlfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCi17Ci0Jc3RydWN0IHBhZ2V2ZWMgcHZlYzsKLQlwZ29mZl90IG5leHQgPSAwOwotCWludCBpOwotCi0JcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKLQl3aGlsZSAocGFnZXZlY19sb29rdXAoJnB2ZWMsIG1hcHBpbmcsIG5leHQsIFBBR0VWRUNfU0laRSkpIHsKLQkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyBpKyspIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKLQkJCXBnb2ZmX3QgaW5kZXg7Ci0JCQlpbnQgc2tpcF9wYWdlID0KLQkJCQkoUGFnZURpcnR5KHBhZ2UpIHx8IFBhZ2VXcml0ZWJhY2socGFnZSkpOwotCi0JCQlpZiAoIXNraXBfcGFnZSkKLQkJCQlza2lwX3BhZ2UgPSAhdHJ5bG9ja19wYWdlKHBhZ2UpOwotCi0JCQkvKgotCQkJICogV2UgcmVhbGx5IHNob3VsZG4ndCBiZSBsb29raW5nIGF0IHRoZSAtPmluZGV4IG9mIGFuCi0JCQkgKiB1bmxvY2tlZCBwYWdlLiAgQnV0IHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGxvY2sgdGhlc2UKLQkJCSAqIHBhZ2VzLiAgU28gd2UgcmVseSB1cG9uIG5vYm9keSBhbHRlcmluZyB0aGUgLT5pbmRleAotCQkJICogb2YgdGhpcyAocGlubmVkLWJ5LXVzKSBwYWdlLgotCQkJICovCi0JCQlpbmRleCA9IHBhZ2UtPmluZGV4OwotCQkJaWYgKGluZGV4ID4gbmV4dCkKLQkJCQluZXh0ID0gaW5kZXg7Ci0JCQluZXh0Kys7Ci0KLQkJCWlmIChza2lwX3BhZ2UpCi0JCQkJY29udGludWU7Ci0KLQkJCWdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UobWFwcGluZywgcGFnZSk7Ci0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJfQotCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci19Ci0KLS8qCiAgKiBJbnZhbGlkYXRlIGlub2RlIHBhZ2VzIGluIGEgd29ya2VyIHRocmVhZC4gIChUaGlzIGNhbid0IGJlIGRvbmUKICAqIGluIHRoZSBtZXNzYWdlIGhhbmRsZXIgY29udGV4dC4pCiAgKi8KQEAgLTE0MjksNyArMTM4NSw3IEBACiAJb3JpZ19nZW4gPSBjaS0+aV9yZGNhY2hlX2dlbjsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAKLQljZXBoX2ludmFsaWRhdGVfbm9uZGlydHlfcGFnZXMoaW5vZGUtPmlfbWFwcGluZyk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlpZiAob3JpZ19nZW4gPT0gY2ktPmlfcmRjYWNoZV9nZW4gJiYKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvaW9jdGwuYyBiL2ZzL2NlcGgvaW9jdGwuYwppbmRleCAzYjI1NmI1Li41YTE0YzI5IDEwMDY0NAotLS0gYS9mcy9jZXBoL2lvY3RsLmMKKysrIGIvZnMvY2VwaC9pb2N0bC5jCkBAIC00MiwxNyArNDIsMzkgQEAKIAlzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjID0gY2VwaF9zYl90b19jbGllbnQoaW5vZGUtPmlfc2IpLT5tZHNjOwogCXN0cnVjdCBjZXBoX21kc19yZXF1ZXN0ICpyZXE7CiAJc3RydWN0IGNlcGhfaW9jdGxfbGF5b3V0IGw7CisJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY2VwaF9pb2N0bF9sYXlvdXQgbmw7CiAJaW50IGVyciwgaTsKIAotCS8qIGNvcHkgYW5kIHZhbGlkYXRlICovCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZsLCBhcmcsIHNpemVvZihsKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKChsLm9iamVjdF9zaXplICYgflBBR0VfTUFTSykgfHwKLQkgICAgKGwuc3RyaXBlX3VuaXQgJiB+UEFHRV9NQVNLKSB8fAotCSAgICAhbC5zdHJpcGVfdW5pdCB8fAotCSAgICAobC5vYmplY3Rfc2l6ZSAmJgotCSAgICAgKHVuc2lnbmVkKWwub2JqZWN0X3NpemUgJSAodW5zaWduZWQpbC5zdHJpcGVfdW5pdCkpCisJLyogdmFsaWRhdGUgY2hhbmdlZCBwYXJhbXMgYWdhaW5zdCBjdXJyZW50IGxheW91dCAqLworCWVyciA9IGNlcGhfZG9fZ2V0YXR0cihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgQ0VQSF9TVEFUX0NBUF9MQVlPVVQpOworCWlmICghZXJyKSB7CisJCW5sLnN0cmlwZV91bml0ID0gY2VwaF9maWxlX2xheW91dF9zdShjaS0+aV9sYXlvdXQpOworCQlubC5zdHJpcGVfY291bnQgPSBjZXBoX2ZpbGVfbGF5b3V0X3N0cmlwZV9jb3VudChjaS0+aV9sYXlvdXQpOworCQlubC5vYmplY3Rfc2l6ZSA9IGNlcGhfZmlsZV9sYXlvdXRfb2JqZWN0X3NpemUoY2ktPmlfbGF5b3V0KTsKKwkJbmwuZGF0YV9wb29sID0gbGUzMl90b19jcHUoY2ktPmlfbGF5b3V0LmZsX3BnX3Bvb2wpOworCQlubC5wcmVmZXJyZWRfb3NkID0KKwkJCQkoczMyKWxlMzJfdG9fY3B1KGNpLT5pX2xheW91dC5mbF9wZ19wcmVmZXJyZWQpOworCX0gZWxzZQorCQlyZXR1cm4gZXJyOworCisJaWYgKGwuc3RyaXBlX2NvdW50KQorCQlubC5zdHJpcGVfY291bnQgPSBsLnN0cmlwZV9jb3VudDsKKwlpZiAobC5zdHJpcGVfdW5pdCkKKwkJbmwuc3RyaXBlX3VuaXQgPSBsLnN0cmlwZV91bml0OworCWlmIChsLm9iamVjdF9zaXplKQorCQlubC5vYmplY3Rfc2l6ZSA9IGwub2JqZWN0X3NpemU7CisJaWYgKGwuZGF0YV9wb29sKQorCQlubC5kYXRhX3Bvb2wgPSBsLmRhdGFfcG9vbDsKKwlpZiAobC5wcmVmZXJyZWRfb3NkKQorCQlubC5wcmVmZXJyZWRfb3NkID0gbC5wcmVmZXJyZWRfb3NkOworCisJaWYgKChubC5vYmplY3Rfc2l6ZSAmIH5QQUdFX01BU0spIHx8CisJICAgIChubC5zdHJpcGVfdW5pdCAmIH5QQUdFX01BU0spIHx8CisJICAgICgodW5zaWduZWQpbmwub2JqZWN0X3NpemUgJSAodW5zaWduZWQpbmwuc3RyaXBlX3VuaXQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIG1ha2Ugc3VyZSBpdCdzIGEgdmFsaWQgZGF0YSBwb29sICovCmRpZmYgLS1naXQgYS9mcy9jZXBoL2lvY3RsLmggYi9mcy9jZXBoL2lvY3RsLmgKaW5kZXggMGM1MTY3ZS4uYmU0YTYwNCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9pb2N0bC5oCisrKyBiL2ZzL2NlcGgvaW9jdGwuaApAQCAtNiw3ICs2LDMxIEBACiAKICNkZWZpbmUgQ0VQSF9JT0NUTF9NQUdJQyAweDk3CiAKLS8qIGp1c3QgdXNlIHU2NCB0byBhbGlnbiBzYW5lbHkgb24gYWxsIGFyY2hzICovCisvKgorICogQ0VQSF9JT0NfR0VUX0xBWU9VVCAtIGdldCBmaWxlIGxheW91dCBvciBkaXIgbGF5b3V0IHBvbGljeQorICogQ0VQSF9JT0NfU0VUX0xBWU9VVCAtIHNldCBmaWxlIGxheW91dAorICogQ0VQSF9JT0NfU0VUX0xBWU9VVF9QT0xJQ1kgLSBzZXQgZGlyIGxheW91dCBwb2xpY3kKKyAqCisgKiBUaGUgZmlsZSBsYXlvdXQgc3BlY2lmaWVzIGhvdyBmaWxlIGRhdGEgaXMgc3RyaXBlZCBvdmVyIG9iamVjdHMgaW4KKyAqIHRoZSBkaXN0cmlidXRlZCBvYmplY3Qgc3RvcmUsIHdoaWNoIG9iamVjdCBwb29sIHRoZXkgYmVsb25nIHRvIChpZgorICogaXQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0KSwgYW5kIGFuIG9wdGlvbmFsICdwcmVmZXJyZWQgb3NkJyB0bworICogc3RvcmUgdGhlbSBvbi4KKyAqCisgKiBGaWxlcyBnZXQgYSBuZXcgbGF5b3V0IGJhc2VkIG9uIHRoZSBwb2xpY3kgc2V0IG9uIHRoZSBjb250YWluaW5nCisgKiBkaXJlY3Rvcnkgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMuICBUaGUgR0VUX0xBWU9VVCBpb2N0bCB3aWxsIGxldAorICogeW91IGV4YW1pbmUgdGhlIGxheW91dCBmb3IgYSBmaWxlIG9yIHRoZSBwb2xpY3kgb24gYSBkaXJlY3RvcnkuCisgKgorICogU0VUX0xBWU9VVCB3aWxsIGxldCB5b3Ugc2V0IGEgbGF5b3V0IG9uIGEgbmV3bHkgY3JlYXRlZCBmaWxlLiAgVGhpcworICogb25seSB3b3JrcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlsZSBpcyBjcmVhdGVkIGFuZCBiZWZvcmUgYW55CisgKiBkYXRhIGlzIHdyaXR0ZW4gdG8gaXQuCisgKgorICogU0VUX0xBWU9VVF9QT0xJQ1kgd2lsbCBsZXQgeW91IHNldCBhIGxheW91dCBwb2xpY3kgKGRlZmF1bHQgbGF5b3V0KQorICogb24gYSBkaXJlY3RvcnkgdGhhdCB3aWxsIGFwcGx5IHRvIGFueSBuZXcgZmlsZXMgY3JlYXRlZCBpbiB0aGF0CisgKiBkaXJlY3RvcnkgKG9yIGFueSBjaGlsZCBkaXJlY3RvcnkgdGhhdCBkb2Vzbid0IHNwZWNpZnkgYSBsYXlvdXQgb2YKKyAqIGl0cyBvd24pLgorICovCisKKy8qIHVzZSB1NjQgdG8gYWxpZ24gc2FuZWx5IG9uIGFsbCBhcmNocyAqLwogc3RydWN0IGNlcGhfaW9jdGxfbGF5b3V0IHsKIAlfX3U2NCBzdHJpcGVfdW5pdCwgc3RyaXBlX2NvdW50LCBvYmplY3Rfc2l6ZTsKIAlfX3U2NCBkYXRhX3Bvb2w7CkBAIC0yMSw2ICs0NSw4IEBACiAJCQkJICAgc3RydWN0IGNlcGhfaW9jdGxfbGF5b3V0KQogCiAvKgorICogQ0VQSF9JT0NfR0VUX0RBVEFMT0MgLSBnZXQgbG9jYXRpb24gb2YgZmlsZSBkYXRhIGluIHRoZSBjbHVzdGVyCisgKgogICogRXh0cmFjdCBpZGVudGl0eSwgYWRkcmVzcyBvZiB0aGUgT1NEIGFuZCBvYmplY3Qgc3RvcmluZyBhIGdpdmVuCiAgKiBmaWxlIG9mZnNldC4KICAqLwpAQCAtMzksNyArNjUsMzQgQEAKICNkZWZpbmUgQ0VQSF9JT0NfR0VUX0RBVEFMT0MgX0lPV1IoQ0VQSF9JT0NUTF9NQUdJQywgMywJXAogCQkJCSAgIHN0cnVjdCBjZXBoX2lvY3RsX2RhdGFsb2MpCiAKKy8qCisgKiBDRVBIX0lPQ19MQVpZSU8gLSByZWxheCBjb25zaXN0ZW5jeQorICoKKyAqIE5vcm1hbGx5IENlcGggc3dpdGNoZXMgdG8gc3luY2hyb25vdXMgSU8gd2hlbiBtdWx0aXBsZSBjbGllbnRzIGhhdmUKKyAqIHRoZSBmaWxlIG9wZW4gKGFuZCBvciBtb3JlIGZvciB3cml0ZSkuICBSZWFkcyBhbmQgd3JpdGVzIGJ5cGFzcyB0aGUKKyAqIHBhZ2UgY2FjaGUgYW5kIGdvIGRpcmVjdGx5IHRvIHRoZSBPU0QuICBTZXR0aW5nIHRoaXMgZmxhZyBvbiBhIGZpbGUKKyAqIGRlc2NyaXB0b3Igd2lsbCBhbGxvdyBidWZmZXJlZCBJTyBmb3IgdGhpcyBmaWxlIGluIGNhc2VzIHdoZXJlIHRoZQorICogYXBwbGljYXRpb24ga25vd3MgaXQgd29uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgbm9kZXMgKG9yIGRvZXNuJ3QKKyAqIGNhcmUpLgorICovCiAjZGVmaW5lIENFUEhfSU9DX0xBWllJTyBfSU8oQ0VQSF9JT0NUTF9NQUdJQywgNCkKKworLyoKKyAqIENFUEhfSU9DX1NZTkNJTyAtIGZvcmNlIHN5bmNocm9ub3VzIElPCisgKgorICogVGhpcyBpb2N0bCBzZXRzIGEgZmlsZSBmbGFnIHRoYXQgZm9yY2VzIHRoZSBzeW5jaHJvbm91cyBJTyB0aGF0CisgKiBieXBhc3NlcyB0aGUgcGFnZSBjYWNoZSwgZXZlbiBpZiBpdCBpcyBub3QgbmVjZXNzYXJ5LiAgVGhpcyBpcworICogZXNzZW50aWFsbHkgdGhlIG9wcG9zaXRlIGJlaGF2aW9yIG9mIElPQ19MQVpZSU8uICBUaGlzIGZvcmNlcyB0aGUKKyAqIHNhbWUgcmVhZC93cml0ZSBwYXRoIGFzIGEgZmlsZSBvcGVuZWQgYnkgbXVsdGlwbGUgY2xpZW50cyB3aGVuIG9uZQorICogb3IgbW9yZSBvZiB0aG9zZSBjbGllbnRzIGlzIG9wZW5lZCBmb3Igd3JpdGUuCisgKgorICogTm90ZSB0aGF0IHRoaXMgdHlwZSBvZiBzeW5jIElPIHRha2VzIGEgZGlmZmVyZW50IHBhdGggdGhhbiBhIGZpbGUKKyAqIG9wZW5lZCB3aXRoIE9fU1lOQy9EX1NZTkMgKHdyaXRlcyBoaXQgdGhlIHBhZ2UgY2FjaGUgYW5kIGFyZQorICogaW1tZWRpYXRlbHkgZmx1c2hlZCBvbiBwYWdlIGJvdW5kYXJpZXMpLiAgSXQgaXMgdmVyeSBzaW1pbGFyIHRvCisgKiBPX0RJUkVDVCAod3JpdGVzIGJ5cGFzcyB0aGUgcGFnZSBjYWNoZSkgZXhjZXAgdGhhdCBPX0RJUkVDVCB3cml0ZXMKKyAqIGFyZSBub3QgY29waWVkICh1c2VyIHBhZ2UgbXVzdCByZW1haW4gc3RhYmxlKSBhbmQgT19ESVJFQ1Qgd3JpdGVzCisgKiBoYXZlIGFsaWdubWVudCByZXN0cmljdGlvbnMgKG9uIHRoZSBidWZmZXIgYW5kIGZpbGUgb2Zmc2V0KS4KKyAqLwogI2RlZmluZSBDRVBIX0lPQ19TWU5DSU8gX0lPKENFUEhfSU9DVExfTUFHSUMsIDUpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9tZHNfY2xpZW50LmMgYi9mcy9jZXBoL21kc19jbGllbnQuYwppbmRleCA4NmM1OWUxLi4yNjRhYjcwIDEwMDY0NAotLS0gYS9mcy9jZXBoL21kc19jbGllbnQuYworKysgYi9mcy9jZXBoL21kc19jbGllbnQuYwpAQCAtNjE5LDcgKzYxOSw3IEBACiAgKgogICogQ2FsbGVkIHVuZGVyIG1kc2MtPm11dGV4LgogICovCi1zdHJ1Y3QgZGVudHJ5ICpnZXRfbm9uc25hcF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQorc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF9ub25zbmFwX3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJLyoKIAkgKiB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHByb3RlY3RpbmcgdGhlIGRfcGFyZW50IGFjY2VzcwpAQCAtNzY0LDcgKzc2NCw4IEBACiAJc3RydWN0IGNlcGhfbXNnICptc2c7CiAJc3RydWN0IGNlcGhfbWRzX3Nlc3Npb25faGVhZCAqaDsKIAotCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfU0VTU0lPTiwgc2l6ZW9mKCpoKSwgR0ZQX05PRlMpOworCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfU0VTU0lPTiwgc2l6ZW9mKCpoKSwgR0ZQX05PRlMsCisJCQkgICBmYWxzZSk7CiAJaWYgKCFtc2cpIHsKIAkJcHJfZXJyKCJjcmVhdGVfc2Vzc2lvbl9tc2cgRU5PTUVNIGNyZWF0aW5nIG1zZ1xuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtMTI0MCw3ICsxMjQxLDcgQEAKIAl3aGlsZSAoc2Vzc2lvbi0+c19udW1fY2FwX3JlbGVhc2VzIDwgc2Vzc2lvbi0+c19ucl9jYXBzICsgZXh0cmEpIHsKIAkJc3Bpbl91bmxvY2soJnNlc3Npb24tPnNfY2FwX2xvY2spOwogCQltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQ0xJRU5UX0NBUFJFTEVBU0UsIFBBR0VfQ0FDSEVfU0laRSwKLQkJCQkgICBHRlBfTk9GUyk7CisJCQkJICAgR0ZQX05PRlMsIGZhbHNlKTsKIAkJaWYgKCFtc2cpCiAJCQlnb3RvIG91dF91bmxvY2tlZDsKIAkJZG91dCgiYWRkX2NhcF9yZWxlYXNlcyAlcCBtc2cgJXAgbm93ICVkXG4iLCBzZXNzaW9uLCBtc2csCkBAIC0xNjUyLDcgKzE2NTMsNyBAQAogCWlmIChyZXEtPnJfb2xkX2RlbnRyeV9kcm9wKQogCQlsZW4gKz0gcmVxLT5yX29sZF9kZW50cnktPmRfbmFtZS5sZW47CiAKLQltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQ0xJRU5UX1JFUVVFU1QsIGxlbiwgR0ZQX05PRlMpOworCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfUkVRVUVTVCwgbGVuLCBHRlBfTk9GUywgZmFsc2UpOwogCWlmICghbXNnKSB7CiAJCW1zZyA9IEVSUl9QVFIoLUVOT01FTSk7CiAJCWdvdG8gb3V0X2ZyZWUyOwpAQCAtMjAwMSw3ICsyMDAyLDcgQEAKIH0KIAogLyoKLSAqIEludmFsaWRhdGUgZGlyIElfQ09NUExFVEUsIGRlbnRyeSBsZWFzZSBzdGF0ZSBvbiBhbiBhYm9ydGVkIE1EUworICogSW52YWxpZGF0ZSBkaXIgRF9DT01QTEVURSwgZGVudHJ5IGxlYXNlIHN0YXRlIG9uIGFuIGFib3J0ZWQgTURTCiAgKiBuYW1lc3BhY2UgcmVxdWVzdC4KICAqLwogdm9pZCBjZXBoX2ludmFsaWRhdGVfZGlyX3JlcXVlc3Qoc3RydWN0IGNlcGhfbWRzX3JlcXVlc3QgKnJlcSkKQEAgLTIwMDksOSArMjAxMCw5IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IHJlcS0+cl9sb2NrZWRfZGlyOwogCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CiAKLQlkb3V0KCJpbnZhbGlkYXRlX2Rpcl9yZXF1ZXN0ICVwIChJX0NPTVBMRVRFLCBsZWFzZShzKSlcbiIsIGlub2RlKTsKKwlkb3V0KCJpbnZhbGlkYXRlX2Rpcl9yZXF1ZXN0ICVwIChEX0NPTVBMRVRFLCBsZWFzZShzKSlcbiIsIGlub2RlKTsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCWNpLT5pX2NlcGhfZmxhZ3MgJj0gfkNFUEhfSV9DT01QTEVURTsKKwljZXBoX2Rpcl9jbGVhcl9jb21wbGV0ZShpbm9kZSk7CiAJY2ktPmlfcmVsZWFzZV9jb3VudCsrOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIApAQCAtMjUxOCw3ICsyNTE5LDcgQEAKIAkJZ290byBmYWlsX25vcGFnZWxpc3Q7CiAJY2VwaF9wYWdlbGlzdF9pbml0KHBhZ2VsaXN0KTsKIAotCXJlcGx5ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX0NMSUVOVF9SRUNPTk5FQ1QsIDAsIEdGUF9OT0ZTKTsKKwlyZXBseSA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfUkVDT05ORUNULCAwLCBHRlBfTk9GUywgZmFsc2UpOwogCWlmICghcmVwbHkpCiAJCWdvdG8gZmFpbF9ub21zZzsKIApAQCAtMjgzMSw3ICsyODMyLDcgQEAKIAlkbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKIAlsZW4gKz0gZG5hbWVsZW47CiAKLQltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQ0xJRU5UX0xFQVNFLCBsZW4sIEdGUF9OT0ZTKTsKKwltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQ0xJRU5UX0xFQVNFLCBsZW4sIEdGUF9OT0ZTLCBmYWxzZSk7CiAJaWYgKCFtc2cpCiAJCXJldHVybjsKIAlsZWFzZSA9IG1zZy0+ZnJvbnQuaW92X2Jhc2U7CkBAIC0zMTUzLDcgKzMxNTQsNyBAQAogLyoKICAqIHRydWUgaWYgYWxsIHNlc3Npb25zIGFyZSBjbG9zZWQsIG9yIHdlIGZvcmNlIHVubW91bnQKICAqLwotYm9vbCBkb25lX2Nsb3Npbmdfc2Vzc2lvbnMoc3RydWN0IGNlcGhfbWRzX2NsaWVudCAqbWRzYykKK3N0YXRpYyBib29sIGRvbmVfY2xvc2luZ19zZXNzaW9ucyhzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjKQogewogCWludCBpLCBuID0gMDsKIApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9zdXBlci5jIGIvZnMvY2VwaC9zdXBlci5jCmluZGV4IDg4YmFjYWYuLmE5MDg0NmYgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvc3VwZXIuYworKysgYi9mcy9jZXBoL3N1cGVyLmMKQEAgLTExNCw2ICsxMTQsNyBAQAogZW51bSB7CiAJT3B0X3dzaXplLAogCU9wdF9yc2l6ZSwKKwlPcHRfcmFzaXplLAogCU9wdF9jYXBzX3dhbnRlZF9kZWxheV9taW4sCiAJT3B0X2NhcHNfd2FudGVkX2RlbGF5X21heCwKIAlPcHRfY2FwX3JlbGVhc2Vfc2FmZXR5LApAQCAtMTM2LDYgKzEzNyw3IEBACiBzdGF0aWMgbWF0Y2hfdGFibGVfdCBmc29wdF90b2tlbnMgPSB7CiAJe09wdF93c2l6ZSwgIndzaXplPSVkIn0sCiAJe09wdF9yc2l6ZSwgInJzaXplPSVkIn0sCisJe09wdF9yYXNpemUsICJyYXNpemU9JWQifSwKIAl7T3B0X2NhcHNfd2FudGVkX2RlbGF5X21pbiwgImNhcHNfd2FudGVkX2RlbGF5X21pbj0lZCJ9LAogCXtPcHRfY2Fwc193YW50ZWRfZGVsYXlfbWF4LCAiY2Fwc193YW50ZWRfZGVsYXlfbWF4PSVkIn0sCiAJe09wdF9jYXBfcmVsZWFzZV9zYWZldHksICJjYXBfcmVsZWFzZV9zYWZldHk9JWQifSwKQEAgLTE5Niw2ICsxOTgsOSBAQAogCWNhc2UgT3B0X3JzaXplOgogCQlmc29wdC0+cnNpemUgPSBpbnR2YWw7CiAJCWJyZWFrOworCWNhc2UgT3B0X3Jhc2l6ZToKKwkJZnNvcHQtPnJhc2l6ZSA9IGludHZhbDsKKwkJYnJlYWs7CiAJY2FzZSBPcHRfY2Fwc193YW50ZWRfZGVsYXlfbWluOgogCQlmc29wdC0+Y2Fwc193YW50ZWRfZGVsYXlfbWluID0gaW50dmFsOwogCQlicmVhazsKQEAgLTI4OSwyOCArMjk0LDI5IEBACiAKIAlkb3V0KCJwYXJzZV9tb3VudF9vcHRpb25zICVwLCBkZXZfbmFtZSAnJXMnXG4iLCBmc29wdCwgZGV2X25hbWUpOwogCi0gICAgICAgIGZzb3B0LT5zYl9mbGFncyA9IGZsYWdzOwotICAgICAgICBmc29wdC0+ZmxhZ3MgPSBDRVBIX01PVU5UX09QVF9ERUZBVUxUOworCWZzb3B0LT5zYl9mbGFncyA9IGZsYWdzOworCWZzb3B0LT5mbGFncyA9IENFUEhfTU9VTlRfT1BUX0RFRkFVTFQ7CiAKLSAgICAgICAgZnNvcHQtPnJzaXplID0gQ0VQSF9SU0laRV9ERUZBVUxUOwotICAgICAgICBmc29wdC0+c25hcGRpcl9uYW1lID0ga3N0cmR1cChDRVBIX1NOQVBESVJOQU1FX0RFRkFVTFQsIEdGUF9LRVJORUwpOworCWZzb3B0LT5yc2l6ZSA9IENFUEhfUlNJWkVfREVGQVVMVDsKKwlmc29wdC0+cmFzaXplID0gQ0VQSF9SQVNJWkVfREVGQVVMVDsKKwlmc29wdC0+c25hcGRpcl9uYW1lID0ga3N0cmR1cChDRVBIX1NOQVBESVJOQU1FX0RFRkFVTFQsIEdGUF9LRVJORUwpOwogCWZzb3B0LT5jYXBzX3dhbnRlZF9kZWxheV9taW4gPSBDRVBIX0NBUFNfV0FOVEVEX0RFTEFZX01JTl9ERUZBVUxUOwogCWZzb3B0LT5jYXBzX3dhbnRlZF9kZWxheV9tYXggPSBDRVBIX0NBUFNfV0FOVEVEX0RFTEFZX01BWF9ERUZBVUxUOwotICAgICAgICBmc29wdC0+Y2FwX3JlbGVhc2Vfc2FmZXR5ID0gQ0VQSF9DQVBfUkVMRUFTRV9TQUZFVFlfREVGQVVMVDsKLSAgICAgICAgZnNvcHQtPm1heF9yZWFkZGlyID0gQ0VQSF9NQVhfUkVBRERJUl9ERUZBVUxUOwotICAgICAgICBmc29wdC0+bWF4X3JlYWRkaXJfYnl0ZXMgPSBDRVBIX01BWF9SRUFERElSX0JZVEVTX0RFRkFVTFQ7Ci0gICAgICAgIGZzb3B0LT5jb25nZXN0aW9uX2tiID0gZGVmYXVsdF9jb25nZXN0aW9uX2tiKCk7Ci0JCi0gICAgICAgIC8qIGlwMVs6cG9ydDFdWyxpcDJbOnBvcnQyXS4uLl06L3N1YmRpci9pbi9mcyAqLwotICAgICAgICBlcnIgPSAtRUlOVkFMOwotICAgICAgICBpZiAoIWRldl9uYW1lKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICAqcGF0aCA9IHN0cnN0cihkZXZfbmFtZSwgIjovIik7Ci0gICAgICAgIGlmICgqcGF0aCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJfZXJyKCJkZXZpY2UgbmFtZSBpcyBtaXNzaW5nIHBhdGggKG5vIDovIGluICVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZGV2X25hbWUpOwotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICB9CisJZnNvcHQtPmNhcF9yZWxlYXNlX3NhZmV0eSA9IENFUEhfQ0FQX1JFTEVBU0VfU0FGRVRZX0RFRkFVTFQ7CisJZnNvcHQtPm1heF9yZWFkZGlyID0gQ0VQSF9NQVhfUkVBRERJUl9ERUZBVUxUOworCWZzb3B0LT5tYXhfcmVhZGRpcl9ieXRlcyA9IENFUEhfTUFYX1JFQURESVJfQllURVNfREVGQVVMVDsKKwlmc29wdC0+Y29uZ2VzdGlvbl9rYiA9IGRlZmF1bHRfY29uZ2VzdGlvbl9rYigpOworCisJLyogaXAxWzpwb3J0MV1bLGlwMls6cG9ydDJdLi4uXTovc3ViZGlyL2luL2ZzICovCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWRldl9uYW1lKQorCQlnb3RvIG91dDsKKwkqcGF0aCA9IHN0cnN0cihkZXZfbmFtZSwgIjovIik7CisJaWYgKCpwYXRoID09IE5VTEwpIHsKKwkJcHJfZXJyKCJkZXZpY2UgbmFtZSBpcyBtaXNzaW5nIHBhdGggKG5vIDovIGluICVzKVxuIiwKKwkJCQlkZXZfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KIAlkZXZfbmFtZV9lbmQgPSAqcGF0aDsKIAlkb3V0KCJkZXZpY2UgbmFtZSAnJS4qcydcbiIsIChpbnQpKGRldl9uYW1lX2VuZCAtIGRldl9uYW1lKSwgZGV2X25hbWUpOwogCkBAIC0zNzYsNiArMzgyLDggQEAKIAkJc2VxX3ByaW50ZihtLCAiLHdzaXplPSVkIiwgZnNvcHQtPndzaXplKTsKIAlpZiAoZnNvcHQtPnJzaXplICE9IENFUEhfUlNJWkVfREVGQVVMVCkKIAkJc2VxX3ByaW50ZihtLCAiLHJzaXplPSVkIiwgZnNvcHQtPnJzaXplKTsKKwlpZiAoZnNvcHQtPnJhc2l6ZSAhPSBDRVBIX1JBU0laRV9ERUZBVUxUKQorCQlzZXFfcHJpbnRmKG0sICIscmFzaXplPSVkIiwgZnNvcHQtPnJzaXplKTsKIAlpZiAoZnNvcHQtPmNvbmdlc3Rpb25fa2IgIT0gZGVmYXVsdF9jb25nZXN0aW9uX2tiKCkpCiAJCXNlcV9wcmludGYobSwgIix3cml0ZV9jb25nZXN0aW9uX2tiPSVkIiwgZnNvcHQtPmNvbmdlc3Rpb25fa2IpOwogCWlmIChmc29wdC0+Y2Fwc193YW50ZWRfZGVsYXlfbWluICE9IENFUEhfQ0FQU19XQU5URURfREVMQVlfTUlOX0RFRkFVTFQpCkBAIC00MTgsMjQgKzQyNiwyNyBAQAogLyoKICAqIGNyZWF0ZSBhIG5ldyBmcyBjbGllbnQKICAqLwotc3RydWN0IGNlcGhfZnNfY2xpZW50ICpjcmVhdGVfZnNfY2xpZW50KHN0cnVjdCBjZXBoX21vdW50X29wdGlvbnMgKmZzb3B0LAorc3RhdGljIHN0cnVjdCBjZXBoX2ZzX2NsaWVudCAqY3JlYXRlX2ZzX2NsaWVudChzdHJ1Y3QgY2VwaF9tb3VudF9vcHRpb25zICpmc29wdCwKIAkJCQkJc3RydWN0IGNlcGhfb3B0aW9ucyAqb3B0KQogewogCXN0cnVjdCBjZXBoX2ZzX2NsaWVudCAqZnNjOworCWNvbnN0IHVuc2lnbmVkIHN1cHBvcnRlZF9mZWF0dXJlcyA9CisJCUNFUEhfRkVBVFVSRV9GTE9DSyB8CisJCUNFUEhfRkVBVFVSRV9ESVJMQVlPVVRIQVNIOworCWNvbnN0IHVuc2lnbmVkIHJlcXVpcmVkX2ZlYXR1cmVzID0gMDsKIAlpbnQgZXJyID0gLUVOT01FTTsKIAogCWZzYyA9IGt6YWxsb2Moc2l6ZW9mKCpmc2MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZzYykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlmc2MtPmNsaWVudCA9IGNlcGhfY3JlYXRlX2NsaWVudChvcHQsIGZzYyk7CisJZnNjLT5jbGllbnQgPSBjZXBoX2NyZWF0ZV9jbGllbnQob3B0LCBmc2MsIHN1cHBvcnRlZF9mZWF0dXJlcywKKwkJCQkJIHJlcXVpcmVkX2ZlYXR1cmVzKTsKIAlpZiAoSVNfRVJSKGZzYy0+Y2xpZW50KSkgewogCQllcnIgPSBQVFJfRVJSKGZzYy0+Y2xpZW50KTsKIAkJZ290byBmYWlsOwogCX0KIAlmc2MtPmNsaWVudC0+ZXh0cmFfbW9uX2Rpc3BhdGNoID0gZXh0cmFfbW9uX2Rpc3BhdGNoOwotCWZzYy0+Y2xpZW50LT5zdXBwb3J0ZWRfZmVhdHVyZXMgfD0gQ0VQSF9GRUFUVVJFX0ZMT0NLIHwKLQkJQ0VQSF9GRUFUVVJFX0RJUkxBWU9VVEhBU0g7CiAJZnNjLT5jbGllbnQtPm1vbmMud2FudF9tZHNtYXAgPSAxOwogCiAJZnNjLT5tb3VudF9vcHRpb25zID0gZnNvcHQ7CkBAIC00OTEsNyArNTAyLDcgQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCi12b2lkIGRlc3Ryb3lfZnNfY2xpZW50KHN0cnVjdCBjZXBoX2ZzX2NsaWVudCAqZnNjKQorc3RhdGljIHZvaWQgZGVzdHJveV9mc19jbGllbnQoc3RydWN0IGNlcGhfZnNfY2xpZW50ICpmc2MpCiB7CiAJZG91dCgiZGVzdHJveV9mc19jbGllbnQgJXBcbiIsIGZzYyk7CiAKQEAgLTc3NCwxMCArNzg1LDEwIEBACiB7CiAJaW50IGVycjsKIAotCS8qIHNldCByYV9wYWdlcyBiYXNlZCBvbiByc2l6ZSBtb3VudCBvcHRpb24/ICovCi0JaWYgKGZzYy0+bW91bnRfb3B0aW9ucy0+cnNpemUgPj0gUEFHRV9DQUNIRV9TSVpFKQorCS8qIHNldCByYV9wYWdlcyBiYXNlZCBvbiByYXNpemUgbW91bnQgb3B0aW9uPyAqLworCWlmIChmc2MtPm1vdW50X29wdGlvbnMtPnJhc2l6ZSA+PSBQQUdFX0NBQ0hFX1NJWkUpCiAJCWZzYy0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9Ci0JCQkoZnNjLT5tb3VudF9vcHRpb25zLT5yc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpCisJCQkoZnNjLT5tb3VudF9vcHRpb25zLT5yYXNpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKQogCQkJPj4gUEFHRV9TSElGVDsKIAllbHNlCiAJCWZzYy0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9CmRpZmYgLS1naXQgYS9mcy9jZXBoL3N1cGVyLmggYi9mcy9jZXBoL3N1cGVyLmgKaW5kZXggYTIzZWVkNS4uMDFiZjE4OSAxMDA2NDQKLS0tIGEvZnMvY2VwaC9zdXBlci5oCisrKyBiL2ZzL2NlcGgvc3VwZXIuaApAQCAtMzYsNyArMzYsOCBAQAogI2RlZmluZSBjZXBoX3Rlc3RfbW91bnRfb3B0KGZzYywgb3B0KSBcCiAJKCEhKChmc2MpLT5tb3VudF9vcHRpb25zLT5mbGFncyAmIENFUEhfTU9VTlRfT1BUXyMjb3B0KSkKIAotI2RlZmluZSBDRVBIX1JTSVpFX0RFRkFVTFQgICAgICAgICAgICAgKDUxMioxMDI0KSAvKiByZWFkYWhlYWQgKi8KKyNkZWZpbmUgQ0VQSF9SU0laRV9ERUZBVUxUICAgICAgICAgICAgIDAgICAgICAgICAgIC8qIG1heCByZWFkIHNpemUgKi8KKyNkZWZpbmUgQ0VQSF9SQVNJWkVfREVGQVVMVCAgICAgICAgICAgICg4MTkyKjEwMjQpIC8qIHJlYWRhaGVhZCAqLwogI2RlZmluZSBDRVBIX01BWF9SRUFERElSX0RFRkFVTFQgICAgICAgIDEwMjQKICNkZWZpbmUgQ0VQSF9NQVhfUkVBRERJUl9CWVRFU19ERUZBVUxUICAoNTEyKjEwMjQpCiAjZGVmaW5lIENFUEhfU05BUERJUk5BTUVfREVGQVVMVCAgICAgICAgIi5zbmFwIgpAQCAtNDUsOCArNDYsOSBAQAogCWludCBmbGFnczsKIAlpbnQgc2JfZmxhZ3M7CiAKLQlpbnQgd3NpemU7Ci0JaW50IHJzaXplOyAgICAgICAgICAgIC8qIG1heCByZWFkYWhlYWQgKi8KKwlpbnQgd3NpemU7ICAgICAgICAgICAgLyogbWF4IHdyaXRlIHNpemUgKi8KKwlpbnQgcnNpemU7ICAgICAgICAgICAgLyogbWF4IHJlYWQgc2l6ZSAqLworCWludCByYXNpemU7ICAgICAgICAgICAvKiBtYXggcmVhZGFoZWFkICovCiAJaW50IGNvbmdlc3Rpb25fa2I7ICAgIC8qIG1heCB3cml0ZWJhY2sgaW4gZmxpZ2h0ICovCiAJaW50IGNhcHNfd2FudGVkX2RlbGF5X21pbiwgY2Fwc193YW50ZWRfZGVsYXlfbWF4OwogCWludCBjYXBfcmVsZWFzZV9zYWZldHk7CkBAIC0yMDEsNiArMjAzLDcgQEAKICAqIENlcGggZGVudHJ5IHN0YXRlCiAgKi8KIHN0cnVjdCBjZXBoX2RlbnRyeV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBjZXBoX21kc19zZXNzaW9uICpsZWFzZV9zZXNzaW9uOwogCXUzMiBsZWFzZV9nZW4sIGxlYXNlX3NoYXJlZF9nZW47CiAJdTMyIGxlYXNlX3NlcTsKQEAgLTIxMSw2ICsyMTQsMTggQEAKIAl1NjQgb2Zmc2V0OwogfTsKIAorLyoKKyAqIGRlbnRyeSBmbGFncworICoKKyAqIFRoZSBsb2NraW5nIGZvciBEX0NPTVBMRVRFIGlzIGEgYml0IG9kZDoKKyAqICAtIHdlIGNhbiBjbGVhciBpdCBhdCBhbG1vc3QgYW55IHRpbWUgKHNlZSBjZXBoX2RfcHJ1bmUpCisgKiAgLSBpdCBpcyBvbmx5IG1lYW5pbmdmdWwgaWY6CisgKiAgICAtIHdlIGhvbGQgZGlyIGlub2RlIGlfbG9jaworICogICAgLSB3ZSBob2xkIGRpciBGSUxFX1NIQVJFRCBjYXBzCisgKiAgICAtIHRoZSBkZW50cnkgRF9DT01QTEVURSBpcyBzZXQKKyAqLworI2RlZmluZSBDRVBIX0RfQ09NUExFVEUgMSAgLyogaWYgc2V0LCBkX3UuZF9zdWJkaXJzIGlzIGNvbXBsZXRlIGRpcmVjdG9yeSAqLworCiBzdHJ1Y3QgY2VwaF9pbm9kZV94YXR0cnNfaW5mbyB7CiAJLyoKIAkgKiAoc3RpbGwgZW5jb2RlZCkgeGF0dHIgYmxvYi4gd2UgYXZvaWQgdGhlIG92ZXJoZWFkIG9mIHBhcnNpbmcKQEAgLTI0OSw3ICsyNjQsNyBAQAogCXN0cnVjdCB0aW1lc3BlYyBpX3JjdGltZTsKIAl1NjQgaV9yYnl0ZXMsIGlfcmZpbGVzLCBpX3JzdWJkaXJzOwogCXU2NCBpX2ZpbGVzLCBpX3N1YmRpcnM7Ci0JdTY0IGlfbWF4X29mZnNldDsgIC8qIGxhcmdlc3QgcmVhZGRpciBvZmZzZXQsIHNldCB3aXRoIElfQ09NUExFVEUgKi8KKwl1NjQgaV9tYXhfb2Zmc2V0OyAgLyogbGFyZ2VzdCByZWFkZGlyIG9mZnNldCwgc2V0IHdpdGggRF9DT01QTEVURSAqLwogCiAJc3RydWN0IHJiX3Jvb3QgaV9mcmFndHJlZTsKIAlzdHJ1Y3QgbXV0ZXggaV9mcmFndHJlZV9tdXRleDsKQEAgLTM0NCw5ICszNTksMTAgQEAKICAqIHg4Nl82NCtpbm8zMiAgNjQgICAgICAgICAgICAgICAgICAgICAzMgogICogeDg2XzY0ICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgIDY0CiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGNlcGhfaW5vX3RvX2lubzMyKGlub190IGlubykKK3N0YXRpYyBpbmxpbmUgdTMyIGNlcGhfaW5vX3RvX2lubzMyKF9fdTY0IHZpbm8pCiB7Ci0JaW5vIF49IGlubyA+PiAoc2l6ZW9mKGlubykgKiA4IC0gMzIpOworCXUzMiBpbm8gPSB2aW5vICYgMHhmZmZmZmZmZjsKKwlpbm8gXj0gdmlubyA+PiAzMjsKIAlpZiAoIWlubykKIAkJaW5vID0gMTsKIAlyZXR1cm4gaW5vOwpAQCAtMzU3LDExICszNzMsMTEgQEAKICAqLwogc3RhdGljIGlubGluZSBpbm9fdCBjZXBoX3Zpbm9fdG9faW5vKHN0cnVjdCBjZXBoX3Zpbm8gdmlubykKIHsKLQlpbm9fdCBpbm8gPSAoaW5vX3Qpdmluby5pbm87ICAvKiBeICh2aW5vLnNuYXAgPDwgMjApOyAqLwogI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKLQlpbm8gPSBjZXBoX2lub190b19pbm8zMihpbm8pOworCXJldHVybiBjZXBoX2lub190b19pbm8zMih2aW5vLmlubyk7CisjZWxzZQorCXJldHVybiAoaW5vX3Qpdmluby5pbm87CiAjZW5kaWYKLQlyZXR1cm4gaW5vOwogfQogCiAvKgpAQCAtNDEzLDcgKzQyOSw2IEBACiAvKgogICogQ2VwaCBpbm9kZS4KICAqLwotI2RlZmluZSBDRVBIX0lfQ09NUExFVEUgIDEgIC8qIHdlIGhhdmUgY29tcGxldGUgZGlyZWN0b3J5IGNhY2hlZCAqLwogI2RlZmluZSBDRVBIX0lfTk9ERUxBWSAgIDQgIC8qIGRvIG5vdCBkZWxheSBjYXAgcmVsZWFzZSAqLwogI2RlZmluZSBDRVBIX0lfRkxVU0ggICAgIDggIC8qIGRvIG5vdCBkZWxheSBmbHVzaCBvZiBkaXJ0eSBtZXRhZGF0YSAqLwogI2RlZmluZSBDRVBIX0lfTk9GTFVTSCAgMTYgIC8qIGRvIG5vdCBmbHVzaCBkaXJ0eSBjYXBzICovCkBAIC00NzEsNiArNDg2LDEzIEBACiB9CiAKIC8qCisgKiBzZXQvY2xlYXIgZGlyZWN0b3J5IERfQ09NUExFVEUgZmxhZworICovCit2b2lkIGNlcGhfZGlyX3NldF9jb21wbGV0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgY2VwaF9kaXJfY2xlYXJfY29tcGxldGUoc3RydWN0IGlub2RlICppbm9kZSk7Citib29sIGNlcGhfZGlyX3Rlc3RfY29tcGxldGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKKy8qCiAgKiBjYXBzIGhlbHBlcnMKICAqLwogc3RhdGljIGlubGluZSBib29sIF9fY2VwaF9pc19hbnlfcmVhbF9jYXBzKHN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpKQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9SRUFETUUgYi9mcy9jaWZzL1JFQURNRQppbmRleCBjNWMyYzVlLi44OTVkYTFkIDEwMDY0NAotLS0gYS9mcy9jaWZzL1JFQURNRQorKysgYi9mcy9jaWZzL1JFQURNRQpAQCAtNzQ1LDQgKzc0NSwxOCBAQAogY3JlYXRlIGNpZnMuc3BuZWdvICogKiAvdXNyL2xvY2FsL3NiaW4vY2lmcy51cGNhbGwgJWsKIGNyZWF0ZSBkbnNfcmVzb2x2ZXIgKiAqIC91c3IvbG9jYWwvc2Jpbi9jaWZzLnVwY2FsbCAlawogCitDSUZTIGtlcm5lbCBtb2R1bGUgcGFyYW1ldGVycworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZXNlIG1vZHVsZSBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgb3IgbW9kaWZpZWQgZWl0aGVyIGR1cmluZyB0aGUgdGltZSBvZgorbW9kdWxlIGxvYWRpbmcgb3IgZHVyaW5nIHRoZSBydW50aW1lIGJ5IHVzaW5nIHRoZSBpbnRlcmZhY2UKKwkvcHJvYy9tb2R1bGUvY2lmcy9wYXJhbWV0ZXJzLzxwYXJhbT4KKworaS5lLiBlY2hvICJ2YWx1ZSIgPiAvc3lzL21vZHVsZS9jaWZzL3BhcmFtZXRlcnMvPHBhcmFtPgorCisxLiBlY2hvX3JldHJpZXMgLSBUaGUgbnVtYmVyIG9mIGVjaG8gYXR0ZW1wdHMgYmVmb3JlIGdpdmluZyB1cCBhbmQKKwkJICByZWNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci4gVGhlIGRlZmF1bHQgaXMgNS4gVGhlIHZhbHVlIDAKKwkJICBtZWFucyBuZXZlciByZWNvbm5lY3QuCisKKzIuIGVuYWJsZV9vcGxvY2tzIC0gRW5hYmxlIG9yIGRpc2FibGUgb3Bsb2Nrcy4gT3Bsb2NrcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorCQkgICAgW1kveS8xXS4gVG8gZGlzYWJsZSB1c2UgYW55IG9mIFtOL24vMF0uCiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKaW5kZXggNmQ0MDY1Ni4uODRlOGMwNyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzX2RlYnVnLmMKKysrIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKQEAgLTUxMSw3ICs1MTEsNyBAQAogCiBzdGF0aWMgaW50IGNpZnNfb3Bsb2NrX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0Jc2VxX3ByaW50ZihtLCAiJWRcbiIsIG9wbG9ja0VuYWJsZWQpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCBlbmFibGVfb3Bsb2Nrcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyNiwxMyArNTI2LDE2IEBACiAJY2hhciBjOwogCWludCByYzsKIAorCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IFRoZSAvcHJvYy9mcy9jaWZzL09wbG9ja0VuYWJsZWQgaW50ZXJmYWNlICIKKwkgICAgICAgIndpbGwgYmUgcmVtb3ZlZCBpbiBrZXJuZWwgdmVyc2lvbiAzLjQuIFBsZWFzZSBtaWdyYXRlIHRvICIKKwkgICAgICAgInVzaW5nIHRoZSAnZW5hYmxlX29wbG9ja3MnIG1vZHVsZSBwYXJhbWV0ZXIgaW4gY2lmcy5rby5cbiIpOwogCXJjID0gZ2V0X3VzZXIoYywgYnVmZmVyKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlpZiAoYyA9PSAnMCcgfHwgYyA9PSAnbicgfHwgYyA9PSAnTicpCi0JCW9wbG9ja0VuYWJsZWQgPSAwOworCQllbmFibGVfb3Bsb2NrcyA9IGZhbHNlOwogCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQotCQlvcGxvY2tFbmFibGVkID0gMTsKKwkJZW5hYmxlX29wbG9ja3MgPSB0cnVlOwogCiAJcmV0dXJuIGNvdW50OwogfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX2ZzX3NiLmggYi9mcy9jaWZzL2NpZnNfZnNfc2IuaAppbmRleCA3MjYwZTExLi41MDBkNjU4IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNfZnNfc2IuaAorKysgYi9mcy9jaWZzL2NpZnNfZnNfc2IuaApAQCAtNDMsNiArNDMsOCBAQAogI2RlZmluZSBDSUZTX01PVU5UX1NUUklDVF9JTwkweDQwMDAwIC8qIHN0cmljdCBjYWNoZSBtb2RlICovCiAjZGVmaW5lIENJRlNfTU9VTlRfUldQSURGT1JXQVJECTB4ODAwMDAgLyogdXNlIHBpZCBmb3J3YXJkaW5nIGZvciBydyAqLwogI2RlZmluZSBDSUZTX01PVU5UX1BPU0lYQUNMCTB4MTAwMDAwIC8qIG1pcnJvciBvZiBNU19QT1NJWEFDTCBpbiBtbnRfY2lmc19mbGFncyAqLworI2RlZmluZSBDSUZTX01PVU5UX0NJRlNfQkFDS1VQVUlEIDB4MjAwMDAwIC8qIGJhY2t1cCBpbnRlbnQgYml0IGZvciBhIHVzZXIgKi8KKyNkZWZpbmUgQ0lGU19NT1VOVF9DSUZTX0JBQ0tVUEdJRCAweDQwMDAwMCAvKiBiYWNrdXAgaW50ZW50IGJpdCBmb3IgYSBncm91cCAqLwogCiBzdHJ1Y3QgY2lmc19zYl9pbmZvIHsKIAlzdHJ1Y3QgcmJfcm9vdCB0bGlua190cmVlOwpAQCAtNTUsNiArNTcsOCBAQAogCWF0b21pY190IGFjdGl2ZTsKIAl1aWRfdAltbnRfdWlkOwogCWdpZF90CW1udF9naWQ7CisJdWlkX3QJbW50X2JhY2t1cHVpZDsKKwlnaWRfdAltbnRfYmFja3VwZ2lkOwogCW1vZGVfdAltbnRfZmlsZV9tb2RlOwogCW1vZGVfdAltbnRfZGlyX21vZGU7CiAJdW5zaWduZWQgaW50IG1udF9jaWZzX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzYWNsLmMgYi9mcy9jaWZzL2NpZnNhY2wuYwppbmRleCBkMGY1OWZhLi43MmRkZjIzIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNhY2wuYworKysgYi9mcy9jaWZzL2NpZnNhY2wuYwpAQCAtOTEsOSArOTEsNzYgQEAKIAlzaHJpbmtfaWRtYXBfdHJlZShyb290LCBucl90b19zY2FuLCAmbnJfcmVtLCAmbnJfZGVsKTsKIAlzcGluX3VubG9jaygmc2lkZ2lkbG9jayk7CiAKKwlyb290ID0gJnNpZHVpZHRyZWU7CisJc3Bpbl9sb2NrKCZ1aWRzaWRsb2NrKTsKKwlzaHJpbmtfaWRtYXBfdHJlZShyb290LCBucl90b19zY2FuLCAmbnJfcmVtLCAmbnJfZGVsKTsKKwlzcGluX3VubG9jaygmdWlkc2lkbG9jayk7CisKKwlyb290ID0gJnNpZGdpZHRyZWU7CisJc3Bpbl9sb2NrKCZnaWRzaWRsb2NrKTsKKwlzaHJpbmtfaWRtYXBfdHJlZShyb290LCBucl90b19zY2FuLCAmbnJfcmVtLCAmbnJfZGVsKTsKKwlzcGluX3VubG9jaygmZ2lkc2lkbG9jayk7CisKIAlyZXR1cm4gbnJfcmVtOwogfQogCitzdGF0aWMgdm9pZAorc2lkX3JiX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBjaWQsCisJCXN0cnVjdCBjaWZzX3NpZF9pZCAqKnBzaWRpZCwgY2hhciAqdHlwZXN0cikKK3sKKwljaGFyICpzdHJwdHI7CisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByb290LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICoqbGlua3RvID0gJihyb290LT5yYl9ub2RlKTsKKwlzdHJ1Y3QgY2lmc19zaWRfaWQgKmxzaWRpZDsKKworCXdoaWxlIChub2RlKSB7CisJCWxzaWRpZCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBjaWZzX3NpZF9pZCwgcmJub2RlKTsKKwkJcGFyZW50ID0gbm9kZTsKKwkJaWYgKGNpZCA+IGxzaWRpZC0+aWQpIHsKKwkJCWxpbmt0byA9ICYobm9kZS0+cmJfbGVmdCk7CisJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJfQorCQlpZiAoY2lkIDwgbHNpZGlkLT5pZCkgeworCQkJbGlua3RvID0gJihub2RlLT5yYl9yaWdodCk7CisJCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7CisJCX0KKwl9CisKKwkoKnBzaWRpZCktPmlkID0gY2lkOworCSgqcHNpZGlkKS0+dGltZSA9IGppZmZpZXMgLSAoU0lEX01BUF9SRVRSWSArIDEpOworCSgqcHNpZGlkKS0+cmVmY291bnQgPSAwOworCisJc3ByaW50ZigoKnBzaWRpZCktPnNpZHN0ciwgIiVzIiwgdHlwZXN0cik7CisJc3RycHRyID0gKCpwc2lkaWQpLT5zaWRzdHIgKyBzdHJsZW4oKCpwc2lkaWQpLT5zaWRzdHIpOworCXNwcmludGYoc3RycHRyLCAiJWxkIiwgY2lkKTsKKworCWNsZWFyX2JpdChTSURfSURfUEVORElORywgJigqcHNpZGlkKS0+c3RhdGUpOworCWNsZWFyX2JpdChTSURfSURfTUFQUEVELCAmKCpwc2lkaWQpLT5zdGF0ZSk7CisKKwlyYl9saW5rX25vZGUoJigqcHNpZGlkKS0+cmJub2RlLCBwYXJlbnQsIGxpbmt0byk7CisJcmJfaW5zZXJ0X2NvbG9yKCYoKnBzaWRpZCktPnJibm9kZSwgcm9vdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2lmc19zaWRfaWQgKgorc2lkX3JiX3NlYXJjaChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBjaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByb290LT5yYl9ub2RlOworCXN0cnVjdCBjaWZzX3NpZF9pZCAqbHNpZGlkOworCisJd2hpbGUgKG5vZGUpIHsKKwkJbHNpZGlkID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGNpZnNfc2lkX2lkLCByYm5vZGUpOworCQlpZiAoY2lkID4gbHNpZGlkLT5pZCkKKwkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQllbHNlIGlmIChjaWQgPCBsc2lkaWQtPmlkKQorCQkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCQllbHNlIC8qIG5vZGUgZm91bmQgKi8KKwkJCXJldHVybiBsc2lkaWQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgY2lmc19zaHJpbmtlciA9IHsKIAkuc2hyaW5rID0gY2lmc19pZG1hcF9zaHJpbmtlciwKIAkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLApAQCAtMTEwLDYgKzE3Nyw3IEBACiAKIAltZW1jcHkocGF5bG9hZCwgZGF0YSwgZGF0YWxlbik7CiAJa2V5LT5wYXlsb2FkLmRhdGEgPSBwYXlsb2FkOworCWtleS0+ZGF0YWxlbiA9IGRhdGFsZW47CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyNCw2ICsyOTIsMTIwIEBACiB9CiAKIHN0YXRpYyBpbnQKK2lkX3RvX3NpZCh1bnNpZ25lZCBsb25nIGNpZCwgdWludCBzaWR0eXBlLCBzdHJ1Y3QgY2lmc19zaWQgKnNzaWQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qga2V5ICpzaWRrZXk7CisJY29uc3Qgc3RydWN0IGNyZWQgKnNhdmVkX2NyZWQ7CisJc3RydWN0IGNpZnNfc2lkICpsc2lkOworCXN0cnVjdCBjaWZzX3NpZF9pZCAqcHNpZGlkLCAqbnBzaWRpZDsKKwlzdHJ1Y3QgcmJfcm9vdCAqY2lkdHJlZTsKKwlzcGlubG9ja190ICpjaWRsb2NrOworCisJaWYgKHNpZHR5cGUgPT0gU0lET1dORVIpIHsKKwkJY2lkbG9jayA9ICZzaWR1aWRsb2NrOworCQljaWR0cmVlID0gJnVpZHRyZWU7CisJfSBlbHNlIGlmIChzaWR0eXBlID09IFNJREdST1VQKSB7CisJCWNpZGxvY2sgPSAmc2lkZ2lkbG9jazsKKwkJY2lkdHJlZSA9ICZnaWR0cmVlOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jayhjaWRsb2NrKTsKKwlwc2lkaWQgPSBzaWRfcmJfc2VhcmNoKGNpZHRyZWUsIGNpZCk7CisKKwlpZiAoIXBzaWRpZCkgeyAvKiBub2RlIGRvZXMgbm90IGV4aXN0LCBhbGxvY2F0ZSBvbmUgJiBhdHRlbXB0IGFkZGluZyAqLworCQlzcGluX3VubG9jayhjaWRsb2NrKTsKKwkJbnBzaWRpZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaWZzX3NpZF9pZCksIEdGUF9LRVJORUwpOworCQlpZiAoIW5wc2lkaWQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlucHNpZGlkLT5zaWRzdHIgPSBrbWFsbG9jKFNJRExFTiwgR0ZQX0tFUk5FTCk7CisJCWlmICghbnBzaWRpZC0+c2lkc3RyKSB7CisJCQlrZnJlZShucHNpZGlkKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJc3Bpbl9sb2NrKGNpZGxvY2spOworCQlwc2lkaWQgPSBzaWRfcmJfc2VhcmNoKGNpZHRyZWUsIGNpZCk7CisJCWlmIChwc2lkaWQpIHsgLyogbm9kZSBoYXBwZW5lZCB0byBnZXQgaW5zZXJ0ZWQgbWVhbndoaWxlICovCisJCQkrK3BzaWRpZC0+cmVmY291bnQ7CisJCQlzcGluX3VubG9jayhjaWRsb2NrKTsKKwkJCWtmcmVlKG5wc2lkaWQtPnNpZHN0cik7CisJCQlrZnJlZShucHNpZGlkKTsKKwkJfSBlbHNlIHsKKwkJCXBzaWRpZCA9IG5wc2lkaWQ7CisJCQlzaWRfcmJfaW5zZXJ0KGNpZHRyZWUsIGNpZCwgJnBzaWRpZCwKKwkJCQkJc2lkdHlwZSA9PSBTSURPV05FUiA/ICJvaToiIDogImdpOiIpOworCQkJKytwc2lkaWQtPnJlZmNvdW50OworCQkJc3Bpbl91bmxvY2soY2lkbG9jayk7CisJCX0KKwl9IGVsc2UgeworCQkrK3BzaWRpZC0+cmVmY291bnQ7CisJCXNwaW5fdW5sb2NrKGNpZGxvY2spOworCX0KKworCS8qCisJICogSWYgd2UgYXJlIGhlcmUsIGl0IGlzIHNhZmUgdG8gYWNjZXNzIHBzaWRpZCBhbmQgaXRzIGZpZWxkcworCSAqIHNpbmNlIGEgcmVmZXJlbmNlIHdhcyB0YWtlbiBlYXJsaWVyIHdoaWxlIGhvbGRpbmcgdGhlIHNwaW5sb2NrLgorCSAqIEEgcmVmZXJlbmNlIG9uIHRoZSBub2RlIGlzIHB1dCB3aXRob3V0IGhvbGRpbmcgdGhlIHNwaW5sb2NrCisJICogYW5kIGl0IGlzIE9LIHRvIGRvIHNvIGluIHRoaXMgY2FzZSwgc2hyaW5rZXIgd2lsbCBub3QgZXJhc2UKKwkgKiB0aGlzIG5vZGUgdW50aWwgYWxsIHJlZmVyZW5jZXMgYXJlIHB1dCBhbmQgd2UgZG8gbm90IGFjY2VzcworCSAqIGFueSBmaWVsZHMgb2YgdGhlIG5vZGUgYWZ0ZXIgYSByZWZlcmVuY2UgaXMgcHV0IC4KKwkgKi8KKwlpZiAodGVzdF9iaXQoU0lEX0lEX01BUFBFRCwgJnBzaWRpZC0+c3RhdGUpKSB7CisJCW1lbWNweShzc2lkLCAmcHNpZGlkLT5zaWQsIHNpemVvZihzdHJ1Y3QgY2lmc19zaWQpKTsKKwkJcHNpZGlkLT50aW1lID0gamlmZmllczsgLyogdXBkYXRlIHRzIGZvciBhY2Nlc3NpbmcgKi8KKwkJZ290byBpZF9zaWRfb3V0OworCX0KKworCWlmICh0aW1lX2FmdGVyKHBzaWRpZC0+dGltZSArIFNJRF9NQVBfUkVUUlksIGppZmZpZXMpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBpZF9zaWRfb3V0OworCX0KKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChTSURfSURfUEVORElORywgJnBzaWRpZC0+c3RhdGUpKSB7CisJCXNhdmVkX2NyZWQgPSBvdmVycmlkZV9jcmVkcyhyb290X2NyZWQpOworCQlzaWRrZXkgPSByZXF1ZXN0X2tleSgmY2lmc19pZG1hcF9rZXlfdHlwZSwgcHNpZGlkLT5zaWRzdHIsICIiKTsKKwkJaWYgKElTX0VSUihzaWRrZXkpKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQljRllJKDEsICIlczogQ2FuJ3QgbWFwIGFuZCBpZCB0byBhIFNJRCIsIF9fZnVuY19fKTsKKwkJfSBlbHNlIHsKKwkJCWxzaWQgPSAoc3RydWN0IGNpZnNfc2lkICopc2lka2V5LT5wYXlsb2FkLmRhdGE7CisJCQltZW1jcHkoJnBzaWRpZC0+c2lkLCBsc2lkLAorCQkJCXNpZGtleS0+ZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgY2lmc19zaWQpID8KKwkJCQlzaWRrZXktPmRhdGFsZW4gOiBzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSk7CisJCQltZW1jcHkoc3NpZCwgJnBzaWRpZC0+c2lkLAorCQkJCXNpZGtleS0+ZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgY2lmc19zaWQpID8KKwkJCQlzaWRrZXktPmRhdGFsZW4gOiBzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSk7CisJCQlzZXRfYml0KFNJRF9JRF9NQVBQRUQsICZwc2lkaWQtPnN0YXRlKTsKKwkJCWtleV9wdXQoc2lka2V5KTsKKwkJCWtmcmVlKHBzaWRpZC0+c2lkc3RyKTsKKwkJfQorCQlwc2lkaWQtPnRpbWUgPSBqaWZmaWVzOyAvKiB1cGRhdGUgdHMgZm9yIGFjY2Vzc2luZyAqLworCQlyZXZlcnRfY3JlZHMoc2F2ZWRfY3JlZCk7CisJCWNsZWFyX2JpdChTSURfSURfUEVORElORywgJnBzaWRpZC0+c3RhdGUpOworCQl3YWtlX3VwX2JpdCgmcHNpZGlkLT5zdGF0ZSwgU0lEX0lEX1BFTkRJTkcpOworCX0gZWxzZSB7CisJCXJjID0gd2FpdF9vbl9iaXQoJnBzaWRpZC0+c3RhdGUsIFNJRF9JRF9QRU5ESU5HLAorCQkJCXNpZGlkX3BlbmRpbmdfd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHJjKSB7CisJCQljRllJKDEsICIlczogc2lkaWRfcGVuZGluZ193YWl0IGludGVycnVwdGVkICVkIiwKKwkJCQkJX19mdW5jX18sIHJjKTsKKwkJCS0tcHNpZGlkLT5yZWZjb3VudDsKKwkJCXJldHVybiByYzsKKwkJfQorCQlpZiAodGVzdF9iaXQoU0lEX0lEX01BUFBFRCwgJnBzaWRpZC0+c3RhdGUpKQorCQkJbWVtY3B5KHNzaWQsICZwc2lkaWQtPnNpZCwgc2l6ZW9mKHN0cnVjdCBjaWZzX3NpZCkpOworCQllbHNlCisJCQlyYyA9IC1FSU5WQUw7CisJfQoraWRfc2lkX291dDoKKwktLXBzaWRpZC0+cmVmY291bnQ7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CiBzaWRfdG9faWQoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgc3RydWN0IGNpZnNfc2lkICpwc2lkLAogCQlzdHJ1Y3QgY2lmc19mYXR0ciAqZmF0dHIsIHVpbnQgc2lkdHlwZSkKIHsKQEAgLTM4Myw2ICs1NjUsMTAgQEAKIAlzcGluX2xvY2tfaW5pdCgmc2lkZ2lkbG9jayk7CiAJZ2lkdHJlZSA9IFJCX1JPT1Q7CiAKKwlzcGluX2xvY2tfaW5pdCgmdWlkc2lkbG9jayk7CisJc2lkdWlkdHJlZSA9IFJCX1JPT1Q7CisJc3Bpbl9sb2NrX2luaXQoJmdpZHNpZGxvY2spOworCXNpZGdpZHRyZWUgPSBSQl9ST09UOwogCXJlZ2lzdGVyX3Nocmlua2VyKCZjaWZzX3Nocmlua2VyKTsKIAogCWNGWUkoMSwgImNpZnMgaWRtYXAga2V5cmluZzogJWRcbiIsIGtleV9zZXJpYWwoa2V5cmluZykpOwpAQCAtNDIyLDYgKzYwOCwxOCBAQAogCXdoaWxlICgobm9kZSA9IHJiX2ZpcnN0KHJvb3QpKSkKIAkJcmJfZXJhc2Uobm9kZSwgcm9vdCk7CiAJc3Bpbl91bmxvY2soJnNpZGdpZGxvY2spOworCisJcm9vdCA9ICZzaWR1aWR0cmVlOworCXNwaW5fbG9jaygmdWlkc2lkbG9jayk7CisJd2hpbGUgKChub2RlID0gcmJfZmlyc3Qocm9vdCkpKQorCQlyYl9lcmFzZShub2RlLCByb290KTsKKwlzcGluX3VubG9jaygmdWlkc2lkbG9jayk7CisKKwlyb290ID0gJnNpZGdpZHRyZWU7CisJc3Bpbl9sb2NrKCZnaWRzaWRsb2NrKTsKKwl3aGlsZSAoKG5vZGUgPSByYl9maXJzdChyb290KSkpCisJCXJiX2VyYXNlKG5vZGUsIHJvb3QpOworCXNwaW5fdW5sb2NrKCZnaWRzaWRsb2NrKTsKIH0KIAogLyogaWYgdGhlIHR3byBTSURzIChyb3VnaGx5IGVxdWl2YWxlbnQgdG8gYSBVVUlEIGZvciBhIHVzZXIgb3IgZ3JvdXApIGFyZQpAQCAtNzA2LDcgKzkwNCw3IEBACiAJYWNsX3NpemUgPSBzaXplb2Yoc3RydWN0IGNpZnNfYWNsKTsKIAogCW51bV9hY2VzID0gbGUzMl90b19jcHUocGRhY2wtPm51bV9hY2VzKTsKLQlpZiAobnVtX2FjZXMgID4gMCkgeworCWlmIChudW1fYWNlcyA+IDApIHsKIAkJdW1vZGVfdCB1c2VyX21hc2sgPSBTX0lSV1hVOwogCQl1bW9kZV90IGdyb3VwX21hc2sgPSBTX0lSV1hHOwogCQl1bW9kZV90IG90aGVyX21hc2sgPSBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE87CkBAIC04NjgsNTIgKzEwNjYsODIgQEAKIAllbHNlCiAJCWNGWUkoMSwgIm5vIEFDTCIpOyAvKiBCQiBncmFudCBhbGwgb3IgZGVmYXVsdCBwZXJtcz8gKi8KIAotLyoJY2lmc2NyZWQtPnVpZCA9IG93bmVyX3NpZF9wdHItPnJpZDsKLQljaWZzY3JlZC0+Z2lkID0gZ3JvdXBfc2lkX3B0ci0+cmlkOwotCW1lbWNweSgodm9pZCAqKSgmKGNpZnNjcmVkLT5vc2lkKSksICh2b2lkICopb3duZXJfc2lkX3B0ciwKLQkJCXNpemVvZihzdHJ1Y3QgY2lmc19zaWQpKTsKLQltZW1jcHkoKHZvaWQgKikoJihjaWZzY3JlZC0+Z3NpZCkpLCAodm9pZCAqKWdyb3VwX3NpZF9wdHIsCi0JCQlzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSk7ICovCi0KIAlyZXR1cm4gcmM7CiB9CiAKLQogLyogQ29udmVydCBwZXJtaXNzaW9uIGJpdHMgZnJvbSBtb2RlIHRvIGVxdWl2YWxlbnQgQ0lGUyBBQ0wgKi8KIHN0YXRpYyBpbnQgYnVpbGRfc2VjX2Rlc2Moc3RydWN0IGNpZnNfbnRzZCAqcG50c2QsIHN0cnVjdCBjaWZzX250c2QgKnBubnRzZCwKLQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3U2NCBubW9kZSkKKwlfX3UzMiBzZWNkZXNjbGVuLCBfX3U2NCBubW9kZSwgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIGludCAqYWNsZmxhZykKIHsKIAlpbnQgcmMgPSAwOwogCV9fdTMyIGRhY2xvZmZzZXQ7CiAJX191MzIgbmRhY2xvZmZzZXQ7CiAJX191MzIgc2lkc29mZnNldDsKIAlzdHJ1Y3QgY2lmc19zaWQgKm93bmVyX3NpZF9wdHIsICpncm91cF9zaWRfcHRyOworCXN0cnVjdCBjaWZzX3NpZCAqbm93bmVyX3NpZF9wdHIsICpuZ3JvdXBfc2lkX3B0cjsKIAlzdHJ1Y3QgY2lmc19hY2wgKmRhY2xfcHRyID0gTlVMTDsgIC8qIG5vIG5lZWQgZm9yIFNBQ0wgcHRyICovCiAJc3RydWN0IGNpZnNfYWNsICpuZGFjbF9wdHIgPSBOVUxMOyAvKiBubyBuZWVkIGZvciBTQUNMIHB0ciAqLwogCi0JaWYgKChpbm9kZSA9PSBOVUxMKSB8fCAocG50c2QgPT0gTlVMTCkgfHwgKHBubnRzZCA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlvd25lcl9zaWRfcHRyID0gKHN0cnVjdCBjaWZzX3NpZCAqKSgoY2hhciAqKXBudHNkICsKKwlpZiAobm1vZGUgIT0gTk9fQ0hBTkdFXzY0KSB7IC8qIGNobW9kICovCisJCW93bmVyX3NpZF9wdHIgPSAoc3RydWN0IGNpZnNfc2lkICopKChjaGFyICopcG50c2QgKwogCQkJCWxlMzJfdG9fY3B1KHBudHNkLT5vc2lkb2Zmc2V0KSk7Ci0JZ3JvdXBfc2lkX3B0ciA9IChzdHJ1Y3QgY2lmc19zaWQgKikoKGNoYXIgKilwbnRzZCArCisJCWdyb3VwX3NpZF9wdHIgPSAoc3RydWN0IGNpZnNfc2lkICopKChjaGFyICopcG50c2QgKwogCQkJCWxlMzJfdG9fY3B1KHBudHNkLT5nc2lkb2Zmc2V0KSk7CisJCWRhY2xvZmZzZXQgPSBsZTMyX3RvX2NwdShwbnRzZC0+ZGFjbG9mZnNldCk7CisJCWRhY2xfcHRyID0gKHN0cnVjdCBjaWZzX2FjbCAqKSgoY2hhciAqKXBudHNkICsgZGFjbG9mZnNldCk7CisJCW5kYWNsb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBjaWZzX250c2QpOworCQluZGFjbF9wdHIgPSAoc3RydWN0IGNpZnNfYWNsICopKChjaGFyICopcG5udHNkICsgbmRhY2xvZmZzZXQpOworCQluZGFjbF9wdHItPnJldmlzaW9uID0gZGFjbF9wdHItPnJldmlzaW9uOworCQluZGFjbF9wdHItPnNpemUgPSAwOworCQluZGFjbF9wdHItPm51bV9hY2VzID0gMDsKIAotCWRhY2xvZmZzZXQgPSBsZTMyX3RvX2NwdShwbnRzZC0+ZGFjbG9mZnNldCk7Ci0JZGFjbF9wdHIgPSAoc3RydWN0IGNpZnNfYWNsICopKChjaGFyICopcG50c2QgKyBkYWNsb2Zmc2V0KTsKLQotCW5kYWNsb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBjaWZzX250c2QpOwotCW5kYWNsX3B0ciA9IChzdHJ1Y3QgY2lmc19hY2wgKikoKGNoYXIgKilwbm50c2QgKyBuZGFjbG9mZnNldCk7Ci0JbmRhY2xfcHRyLT5yZXZpc2lvbiA9IGRhY2xfcHRyLT5yZXZpc2lvbjsKLQluZGFjbF9wdHItPnNpemUgPSAwOwotCW5kYWNsX3B0ci0+bnVtX2FjZXMgPSAwOwotCi0JcmMgPSBzZXRfY2htb2RfZGFjbChuZGFjbF9wdHIsIG93bmVyX3NpZF9wdHIsIGdyb3VwX3NpZF9wdHIsIG5tb2RlKTsKLQotCXNpZHNvZmZzZXQgPSBuZGFjbG9mZnNldCArIGxlMTZfdG9fY3B1KG5kYWNsX3B0ci0+c2l6ZSk7Ci0KLQkvKiBjb3B5IHNlY3VyaXR5IGRlc2NyaXB0b3IgY29udHJvbCBwb3J0aW9uIGFuZCBvd25lciBhbmQgZ3JvdXAgc2lkICovCi0JY29weV9zZWNfZGVzYyhwbnRzZCwgcG5udHNkLCBzaWRzb2Zmc2V0KTsKKwkJcmMgPSBzZXRfY2htb2RfZGFjbChuZGFjbF9wdHIsIG93bmVyX3NpZF9wdHIsIGdyb3VwX3NpZF9wdHIsCisJCQkJCW5tb2RlKTsKKwkJc2lkc29mZnNldCA9IG5kYWNsb2Zmc2V0ICsgbGUxNl90b19jcHUobmRhY2xfcHRyLT5zaXplKTsKKwkJLyogY29weSBzZWMgZGVzYyBjb250cm9sIHBvcnRpb24gJiBvd25lciBhbmQgZ3JvdXAgc2lkcyAqLworCQljb3B5X3NlY19kZXNjKHBudHNkLCBwbm50c2QsIHNpZHNvZmZzZXQpOworCQkqYWNsZmxhZyA9IENJRlNfQUNMX0RBQ0w7CisJfSBlbHNlIHsKKwkJbWVtY3B5KHBubnRzZCwgcG50c2QsIHNlY2Rlc2NsZW4pOworCQlpZiAodWlkICE9IE5PX0NIQU5HRV8zMikgeyAvKiBjaG93biAqLworCQkJb3duZXJfc2lkX3B0ciA9IChzdHJ1Y3QgY2lmc19zaWQgKikoKGNoYXIgKilwbm50c2QgKworCQkJCQlsZTMyX3RvX2NwdShwbm50c2QtPm9zaWRvZmZzZXQpKTsKKwkJCW5vd25lcl9zaWRfcHRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIW5vd25lcl9zaWRfcHRyKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJcmMgPSBpZF90b19zaWQodWlkLCBTSURPV05FUiwgbm93bmVyX3NpZF9wdHIpOworCQkJaWYgKHJjKSB7CisJCQkJY0ZZSSgxLCAiJXM6IE1hcHBpbmcgZXJyb3IgJWQgZm9yIG93bmVyIGlkICVkIiwKKwkJCQkJCV9fZnVuY19fLCByYywgdWlkKTsKKwkJCQlrZnJlZShub3duZXJfc2lkX3B0cik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJbWVtY3B5KG93bmVyX3NpZF9wdHIsIG5vd25lcl9zaWRfcHRyLAorCQkJCQlzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSk7CisJCQlrZnJlZShub3duZXJfc2lkX3B0cik7CisJCQkqYWNsZmxhZyA9IENJRlNfQUNMX09XTkVSOworCQl9CisJCWlmIChnaWQgIT0gTk9fQ0hBTkdFXzMyKSB7IC8qIGNoZ3JwICovCisJCQlncm91cF9zaWRfcHRyID0gKHN0cnVjdCBjaWZzX3NpZCAqKSgoY2hhciAqKXBubnRzZCArCisJCQkJCWxlMzJfdG9fY3B1KHBubnRzZC0+Z3NpZG9mZnNldCkpOworCQkJbmdyb3VwX3NpZF9wdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2lmc19zaWQpLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghbmdyb3VwX3NpZF9wdHIpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyYyA9IGlkX3RvX3NpZChnaWQsIFNJREdST1VQLCBuZ3JvdXBfc2lkX3B0cik7CisJCQlpZiAocmMpIHsKKwkJCQljRllJKDEsICIlczogTWFwcGluZyBlcnJvciAlZCBmb3IgZ3JvdXAgaWQgJWQiLAorCQkJCQkJX19mdW5jX18sIHJjLCBnaWQpOworCQkJCWtmcmVlKG5ncm91cF9zaWRfcHRyKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCQltZW1jcHkoZ3JvdXBfc2lkX3B0ciwgbmdyb3VwX3NpZF9wdHIsCisJCQkJCXNpemVvZihzdHJ1Y3QgY2lmc19zaWQpKTsKKwkJCWtmcmVlKG5ncm91cF9zaWRfcHRyKTsKKwkJCSphY2xmbGFnID0gQ0lGU19BQ0xfR1JPVVA7CisJCX0KKwl9CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC05NDUsNyArMTE3Myw3IEBACiB7CiAJc3RydWN0IGNpZnNfbnRzZCAqcG50c2QgPSBOVUxMOwogCWludCBvcGxvY2sgPSAwOwotCWludCB4aWQsIHJjOworCWludCB4aWQsIHJjLCBjcmVhdGVfb3B0aW9ucyA9IDA7CiAJX191MTYgZmlkOwogCXN0cnVjdCBjaWZzX3Rjb24gKnRjb247CiAJc3RydWN0IHRjb25fbGluayAqdGxpbmsgPSBjaWZzX3NiX3RsaW5rKGNpZnNfc2IpOwpAQCAtOTU2LDkgKzExODQsMTIgQEAKIAl0Y29uID0gdGxpbmtfdGNvbih0bGluayk7CiAJeGlkID0gR2V0WGlkKCk7CiAKLQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgcGF0aCwgRklMRV9PUEVOLCBSRUFEX0NPTlRST0wsIDAsCi0JCQkgJmZpZCwgJm9wbG9jaywgTlVMTCwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCWlmIChiYWNrdXBfY3JlZChjaWZzX3NiKSkKKwkJY3JlYXRlX29wdGlvbnMgfD0gQ1JFQVRFX09QRU5fQkFDS1VQX0lOVEVOVDsKKworCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCB0Y29uLCBwYXRoLCBGSUxFX09QRU4sIFJFQURfQ09OVFJPTCwKKwkJCWNyZWF0ZV9vcHRpb25zLCAmZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCisJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAlpZiAoIXJjKSB7CiAJCXJjID0gQ0lGU1NNQkdldENJRlNBQ0woeGlkLCB0Y29uLCBmaWQsICZwbnRzZCwgcGFjbGxlbik7CiAJCUNJRlNTTUJDbG9zZSh4aWQsIHRjb24sIGZpZCk7CkBAIC05OTEsMTMgKzEyMjIsMTUgQEAKIAlyZXR1cm4gcG50c2Q7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X2NpZnNfYWNsX2J5X3BhdGgoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgY29uc3QgY2hhciAqcGF0aCwKLQkJc3RydWN0IGNpZnNfbnRzZCAqcG5udHNkLCB1MzIgYWNsbGVuKQorIC8qIFNldCBhbiBBQ0wgb24gdGhlIHNlcnZlciAqLworaW50IHNldF9jaWZzX2FjbChzdHJ1Y3QgY2lmc19udHNkICpwbm50c2QsIF9fdTMyIGFjbGxlbiwKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBhY2xmbGFnKQogewogCWludCBvcGxvY2sgPSAwOwotCWludCB4aWQsIHJjOworCWludCB4aWQsIHJjLCBhY2Nlc3NfZmxhZ3MsIGNyZWF0ZV9vcHRpb25zID0gMDsKIAlfX3UxNiBmaWQ7CiAJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IHRjb25fbGluayAqdGxpbmsgPSBjaWZzX3NiX3RsaW5rKGNpZnNfc2IpOwogCiAJaWYgKElTX0VSUih0bGluaykpCkBAIC0xMDA2LDE1ICsxMjM5LDIzIEBACiAJdGNvbiA9IHRsaW5rX3Rjb24odGxpbmspOwogCXhpZCA9IEdldFhpZCgpOwogCi0JcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIHBhdGgsIEZJTEVfT1BFTiwgV1JJVEVfREFDLCAwLAotCQkJICZmaWQsICZvcGxvY2ssIE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scywKLQkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwlpZiAoYmFja3VwX2NyZWQoY2lmc19zYikpCisJCWNyZWF0ZV9vcHRpb25zIHw9IENSRUFURV9PUEVOX0JBQ0tVUF9JTlRFTlQ7CisKKwlpZiAoYWNsZmxhZyA9PSBDSUZTX0FDTF9PV05FUiB8fCBhY2xmbGFnID09IENJRlNfQUNMX0dST1VQKQorCQlhY2Nlc3NfZmxhZ3MgPSBXUklURV9PV05FUjsKKwllbHNlCisJCWFjY2Vzc19mbGFncyA9IFdSSVRFX0RBQzsKKworCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCB0Y29uLCBwYXRoLCBGSUxFX09QRU4sIGFjY2Vzc19mbGFncywKKwkJCWNyZWF0ZV9vcHRpb25zLCAmZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCisJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAlpZiAocmMpIHsKIAkJY0VSUk9SKDEsICJVbmFibGUgdG8gb3BlbiBmaWxlIHRvIHNldCBBQ0wiKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmMgPSBDSUZTU01CU2V0Q0lGU0FDTCh4aWQsIHRjb24sIGZpZCwgcG5udHNkLCBhY2xsZW4pOworCXJjID0gQ0lGU1NNQlNldENJRlNBQ0woeGlkLCB0Y29uLCBmaWQsIHBubnRzZCwgYWNsbGVuLCBhY2xmbGFnKTsKIAljRllJKERCRzIsICJTZXRDSUZTQUNMIHJjID0gJWQiLCByYyk7CiAKIAlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBmaWQpOwpAQCAtMTAyNCwxNyArMTI2NSw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0vKiBTZXQgYW4gQUNMIG9uIHRoZSBzZXJ2ZXIgKi8KLWludCBzZXRfY2lmc19hY2woc3RydWN0IGNpZnNfbnRzZCAqcG5udHNkLCBfX3UzMiBhY2xsZW4sCi0JCQkJc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqcGF0aCkKLXsKLQlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7Ci0KLQljRllJKERCRzIsICJzZXQgQUNMIGZvciAlcyBmcm9tIG1vZGUgMHgleCIsIHBhdGgsIGlub2RlLT5pX21vZGUpOwotCi0JcmV0dXJuIHNldF9jaWZzX2FjbF9ieV9wYXRoKGNpZnNfc2IsIHBhdGgsIHBubnRzZCwgYWNsbGVuKTsKLX0KLQogLyogVHJhbnNsYXRlIHRoZSBDSUZTIEFDTCAoc2ltbGFyIHRvIE5URlMgQUNMKSBmb3IgYSBmaWxlIGludG8gbW9kZSBiaXRzICovCiBpbnQKIGNpZnNfYWNsX3RvX2ZhdHRyKHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsIHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0ciwKQEAgLTEwNjYsOSArMTI5NiwxMiBAQAogfQogCiAvKiBDb252ZXJ0IG1vZGUgYml0cyB0byBhbiBBQ0wgc28gd2UgY2FuIHVwZGF0ZSB0aGUgQUNMIG9uIHRoZSBzZXJ2ZXIgKi8KLWludCBtb2RlX3RvX2NpZnNfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgsIF9fdTY0IG5tb2RlKQoraW50CitpZF9tb2RlX3RvX2NpZnNfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgsIF9fdTY0IG5tb2RlLAorCQkJdWlkX3QgdWlkLCBnaWRfdCBnaWQpCiB7CiAJaW50IHJjID0gMDsKKwlpbnQgYWNsZmxhZyA9IENJRlNfQUNMX0RBQ0w7IC8qIGRlZmF1bHQgZmxhZyB0byBzZXQgKi8KIAlfX3UzMiBzZWNkZXNjbGVuID0gMDsKIAlzdHJ1Y3QgY2lmc19udHNkICpwbnRzZCA9IE5VTEw7IC8qIGFjbCBvYnRhaW5lZCBmcm9tIHNlcnZlciAqLwogCXN0cnVjdCBjaWZzX250c2QgKnBubnRzZCA9IE5VTEw7IC8qIG1vZGlmaWVkIGFjbCB0byBiZSBzZW50IHRvIHNlcnZlciAqLwpAQCAtMTA5OCwxMyArMTMzMSwxNSBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAotCQlyYyA9IGJ1aWxkX3NlY19kZXNjKHBudHNkLCBwbm50c2QsIGlub2RlLCBubW9kZSk7CisJCXJjID0gYnVpbGRfc2VjX2Rlc2MocG50c2QsIHBubnRzZCwgc2VjZGVzY2xlbiwgbm1vZGUsIHVpZCwgZ2lkLAorCQkJCQkmYWNsZmxhZyk7CiAKIAkJY0ZZSShEQkcyLCAiYnVpbGRfc2VjX2Rlc2MgcmM6ICVkIiwgcmMpOwogCiAJCWlmICghcmMpIHsKIAkJCS8qIFNldCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvciAqLwotCQkJcmMgPSBzZXRfY2lmc19hY2wocG5udHNkLCBzZWNkZXNjbGVuLCBpbm9kZSwgcGF0aCk7CisJCQlyYyA9IHNldF9jaWZzX2FjbChwbm50c2QsIHNlY2Rlc2NsZW4sIGlub2RlLAorCQkJCQkJcGF0aCwgYWNsZmxhZyk7CiAJCQljRllJKERCRzIsICJzZXRfY2lmc19hY2wgcmM6ICVkIiwgcmMpOwogCQl9CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwppbmRleCAzMGFjZDIyLi41ZDliOWFjIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC0zNyw4MyArMzcsOCBAQAogICogdGhlIHNlcXVlbmNlIG51bWJlciBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuIEFsc28sIHRoaXMgZnVuY3Rpb24KICAqIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgc2VydmVyLT5zcnZfbXV0ZXggaGVsZC4KICAqLwotc3RhdGljIGludCBjaWZzX2NhbGN1bGF0ZV9zaWduYXR1cmUoY29uc3Qgc3RydWN0IHNtYl9oZHIgKmNpZnNfcGR1LAotCQkJCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgY2hhciAqc2lnbmF0dXJlKQotewotCWludCByYzsKLQotCWlmIChjaWZzX3BkdSA9PSBOVUxMIHx8IHNpZ25hdHVyZSA9PSBOVUxMIHx8IHNlcnZlciA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghc2VydmVyLT5zZWNtZWNoLnNkZXNjbWQ1KSB7Ci0JCWNFUlJPUigxLCAiJXM6IENhbid0IGdlbmVyYXRlIHNpZ25hdHVyZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmMgPSBjcnlwdG9fc2hhc2hfaW5pdCgmc2VydmVyLT5zZWNtZWNoLnNkZXNjbWQ1LT5zaGFzaCk7Ci0JaWYgKHJjKSB7Ci0JCWNFUlJPUigxLCAiJXM6IENvdWxkIG5vdCBpbml0IG1kNVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZXJ2ZXItPnNlY21lY2guc2Rlc2NtZDUtPnNoYXNoLAotCQlzZXJ2ZXItPnNlc3Npb25fa2V5LnJlc3BvbnNlLCBzZXJ2ZXItPnNlc3Npb25fa2V5Lmxlbik7Ci0JaWYgKHJjKSB7Ci0JCWNFUlJPUigxLCAiJXM6IENvdWxkIG5vdCB1cGRhdGUgd2l0aCByZXNwb25zZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZXJ2ZXItPnNlY21lY2guc2Rlc2NtZDUtPnNoYXNoLAotCQljaWZzX3BkdS0+UHJvdG9jb2wsIGJlMzJfdG9fY3B1KGNpZnNfcGR1LT5zbWJfYnVmX2xlbmd0aCkpOwotCWlmIChyYykgewotCQljRVJST1IoMSwgIiVzOiBDb3VsZCBub3QgdXBkYXRlIHdpdGggcGF5bG9hZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBjcnlwdG9fc2hhc2hfZmluYWwoJnNlcnZlci0+c2VjbWVjaC5zZGVzY21kNS0+c2hhc2gsIHNpZ25hdHVyZSk7Ci0JaWYgKHJjKQotCQljRVJST1IoMSwgIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgbWQ1IGhhc2hcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByYzsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBzZXJ2ZXItPnNydl9tdXRleCBoZWxkICovCi1pbnQgY2lmc19zaWduX3NtYihzdHJ1Y3Qgc21iX2hkciAqY2lmc19wZHUsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKLQkJICBfX3UzMiAqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlcikKLXsKLQlpbnQgcmMgPSAwOwotCWNoYXIgc21iX3NpZ25hdHVyZVsyMF07Ci0KLQlpZiAoKGNpZnNfcGR1ID09IE5VTEwpIHx8IChzZXJ2ZXIgPT0gTlVMTCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCEoY2lmc19wZHUtPkZsYWdzMiAmIFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFKSB8fAotCSAgICBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZE5lZ290aWF0ZSkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKCFzZXJ2ZXItPnNlc3Npb25fZXN0YWIpIHsKLQkJc3RybmNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAiQlNSU1BZTCIsIDgpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5TZXF1ZW5jZU51bWJlciA9Ci0JCQljcHVfdG9fbGUzMihzZXJ2ZXItPnNlcXVlbmNlX251bWJlcik7Ci0JY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5SZXNlcnZlZCA9IDA7Ci0KLQkqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlciA9IHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKys7Ci0Jc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIrKzsKLQotCXJjID0gY2lmc19jYWxjdWxhdGVfc2lnbmF0dXJlKGNpZnNfcGR1LCBzZXJ2ZXIsIHNtYl9zaWduYXR1cmUpOwotCWlmIChyYykKLQkJbWVtc2V0KGNpZnNfcGR1LT5TaWduYXR1cmUuU2VjdXJpdHlTaWduYXR1cmUsIDAsIDgpOwotCWVsc2UKLQkJbWVtY3B5KGNpZnNfcGR1LT5TaWduYXR1cmUuU2VjdXJpdHlTaWduYXR1cmUsIHNtYl9zaWduYXR1cmUsIDgpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGNpZnNfY2FsY19zaWduYXR1cmUyKGNvbnN0IHN0cnVjdCBrdmVjICppb3YsIGludCBuX3ZlYywKLQkJCQlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGNoYXIgKnNpZ25hdHVyZSkKK3N0YXRpYyBpbnQgY2lmc19jYWxjX3NpZ25hdHVyZShjb25zdCBzdHJ1Y3Qga3ZlYyAqaW92LCBpbnQgbl92ZWMsCisJCQlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGNoYXIgKnNpZ25hdHVyZSkKIHsKIAlpbnQgaTsKIAlpbnQgcmM7CkBAIC0xNzksNyArMTA0LDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCWNoYXIgc21iX3NpZ25hdHVyZVsyMF07Ci0Jc3RydWN0IHNtYl9oZHIgKmNpZnNfcGR1ID0gaW92WzBdLmlvdl9iYXNlOworCXN0cnVjdCBzbWJfaGRyICpjaWZzX3BkdSA9IChzdHJ1Y3Qgc21iX2hkciAqKWlvdlswXS5pb3ZfYmFzZTsKIAogCWlmICgoY2lmc19wZHUgPT0gTlVMTCkgfHwgKHNlcnZlciA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODksNyArMTE0LDcgQEAKIAkJcmV0dXJuIHJjOwogCiAJaWYgKCFzZXJ2ZXItPnNlc3Npb25fZXN0YWIpIHsKLQkJc3RybmNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAiQlNSU1BZTCIsIDgpOworCQltZW1jcHkoY2lmc19wZHUtPlNpZ25hdHVyZS5TZWN1cml0eVNpZ25hdHVyZSwgIkJTUlNQWUwiLCA4KTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtMjAwLDcgKzEyNSw3IEBACiAJKnBleHBlY3RlZF9yZXNwb25zZV9zZXF1ZW5jZV9udW1iZXIgPSBzZXJ2ZXItPnNlcXVlbmNlX251bWJlcisrOwogCXNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKys7CiAKLQlyYyA9IGNpZnNfY2FsY19zaWduYXR1cmUyKGlvdiwgbl92ZWMsIHNlcnZlciwgc21iX3NpZ25hdHVyZSk7CisJcmMgPSBjaWZzX2NhbGNfc2lnbmF0dXJlKGlvdiwgbl92ZWMsIHNlcnZlciwgc21iX3NpZ25hdHVyZSk7CiAJaWYgKHJjKQogCQltZW1zZXQoY2lmc19wZHUtPlNpZ25hdHVyZS5TZWN1cml0eVNpZ25hdHVyZSwgMCwgOCk7CiAJZWxzZQpAQCAtMjA5LDEzICsxMzQsMjcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBjaWZzX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IHNtYl9oZHIgKmNpZnNfcGR1LAorLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBzZXJ2ZXItPnNydl9tdXRleCBoZWxkICovCitpbnQgY2lmc19zaWduX3NtYihzdHJ1Y3Qgc21iX2hkciAqY2lmc19wZHUsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKKwkJICBfX3UzMiAqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlcikKK3sKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisKKwlpb3YuaW92X2Jhc2UgPSBjaWZzX3BkdTsKKwlpb3YuaW92X2xlbiA9IGJlMzJfdG9fY3B1KGNpZnNfcGR1LT5zbWJfYnVmX2xlbmd0aCkgKyA0OworCisJcmV0dXJuIGNpZnNfc2lnbl9zbWIyKCZpb3YsIDEsIHNlcnZlciwKKwkJCSAgICAgIHBleHBlY3RlZF9yZXNwb25zZV9zZXF1ZW5jZV9udW1iZXIpOworfQorCitpbnQgY2lmc192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBrdmVjICppb3YsIHVuc2lnbmVkIGludCBucl9pb3YsCiAJCQkgIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKIAkJCSAgX191MzIgZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKQogewogCXVuc2lnbmVkIGludCByYzsKIAljaGFyIHNlcnZlcl9yZXNwb25zZV9zaWdbOF07CiAJY2hhciB3aGF0X3dlX3RoaW5rX3NpZ19zaG91bGRfYmVbMjBdOworCXN0cnVjdCBzbWJfaGRyICpjaWZzX3BkdSA9IChzdHJ1Y3Qgc21iX2hkciAqKWlvdlswXS5pb3ZfYmFzZTsKIAogCWlmIChjaWZzX3BkdSA9PSBOVUxMIHx8IHNlcnZlciA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0Nyw4ICsxODYsOCBAQAogCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuUmVzZXJ2ZWQgPSAwOwogCiAJbXV0ZXhfbG9jaygmc2VydmVyLT5zcnZfbXV0ZXgpOwotCXJjID0gY2lmc19jYWxjdWxhdGVfc2lnbmF0dXJlKGNpZnNfcGR1LCBzZXJ2ZXIsCi0JCXdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZSk7CisJcmMgPSBjaWZzX2NhbGNfc2lnbmF0dXJlKGlvdiwgbnJfaW92LCBzZXJ2ZXIsCisJCQkJIHdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZSk7CiAJbXV0ZXhfdW5sb2NrKCZzZXJ2ZXItPnNydl9tdXRleCk7CiAKIAlpZiAocmMpCkBAIC0yNjUsNyArMjA0LDcgQEAKIH0KIAogLyogZmlyc3QgY2FsY3VsYXRlIDI0IGJ5dGVzIG50bG0gcmVzcG9uc2UgYW5kIHRoZW4gMTYgYnl0ZSBzZXNzaW9uIGtleSAqLwotaW50IHNldHVwX250bG1fcmVzcG9uc2Uoc3RydWN0IGNpZnNfc2VzICpzZXMpCitpbnQgc2V0dXBfbnRsbV9yZXNwb25zZShzdHJ1Y3QgY2lmc19zZXMgKnNlcywgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NwKQogewogCWludCByYyA9IDA7CiAJdW5zaWduZWQgaW50IHRlbXBfbGVuID0gQ0lGU19TRVNTX0tFWV9TSVpFICsgQ0lGU19BVVRIX1JFU1BfU0laRTsKQEAgLTI4MiwxNCArMjIxLDE0IEBACiAJc2VzLT5hdXRoX2tleS5sZW4gPSB0ZW1wX2xlbjsKIAogCXJjID0gU01CTlRlbmNyeXB0KHNlcy0+cGFzc3dvcmQsIHNlcy0+c2VydmVyLT5jcnlwdGtleSwKLQkJCXNlcy0+YXV0aF9rZXkucmVzcG9uc2UgKyBDSUZTX1NFU1NfS0VZX1NJWkUpOworCQkJc2VzLT5hdXRoX2tleS5yZXNwb25zZSArIENJRlNfU0VTU19LRVlfU0laRSwgbmxzX2NwKTsKIAlpZiAocmMpIHsKIAkJY0ZZSSgxLCAiJXMgQ2FuJ3QgZ2VuZXJhdGUgTlRMTSByZXNwb25zZSwgZXJyb3I6ICVkIiwKIAkJCV9fZnVuY19fLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKLQlyYyA9IEVfbWQ0aGFzaChzZXMtPnBhc3N3b3JkLCB0ZW1wX2tleSk7CisJcmMgPSBFX21kNGhhc2goc2VzLT5wYXNzd29yZCwgdGVtcF9rZXksIG5sc19jcCk7CiAJaWYgKHJjKSB7CiAJCWNGWUkoMSwgIiVzIENhbid0IGdlbmVyYXRlIE5UIGhhc2gsIGVycm9yOiAlZCIsIF9fZnVuY19fLCByYyk7CiAJCXJldHVybiByYzsKQEAgLTQ2NSw3ICs0MDQsNyBAQAogCX0KIAogCS8qIGNhbGN1bGF0ZSBtZDQgaGFzaCBvZiBwYXNzd29yZCAqLwotCUVfbWQ0aGFzaChzZXMtPnBhc3N3b3JkLCBudF9oYXNoKTsKKwlFX21kNGhhc2goc2VzLT5wYXNzd29yZCwgbnRfaGFzaCwgbmxzX2NwKTsKIAogCXJjID0gY3J5cHRvX3NoYXNoX3NldGtleShzZXMtPnNlcnZlci0+c2VjbWVjaC5obWFjbWQ1LCBudF9oYXNoLAogCQkJCUNJRlNfTlRIQVNIX1NJWkUpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggNTRiOGYxZS4uOGYxZmUzMiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC01Myw3ICs1Myw3IEBACiBpbnQgY2lmc0ZZSSA9IDA7CiBpbnQgY2lmc0VSUk9SID0gMTsKIGludCB0cmFjZVNNQiA9IDA7Ci11bnNpZ25lZCBpbnQgb3Bsb2NrRW5hYmxlZCA9IDE7Citib29sIGVuYWJsZV9vcGxvY2tzID0gdHJ1ZTsKIHVuc2lnbmVkIGludCBsaW51eEV4dEVuYWJsZWQgPSAxOwogdW5zaWduZWQgaW50IGxvb2t1cENhY2hlRW5hYmxlZCA9IDE7CiB1bnNpZ25lZCBpbnQgbXVsdGl1c2VyX21vdW50ID0gMDsKQEAgLTc0LDcgKzc0LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoY2lmc19taW5fc21hbGwsICJTbWFsbCBuZXR3b3JrIGJ1ZmZlcnMgaW4gcG9vbC4gRGVmYXVsdDogMzAgIgogCQkJCSAiUmFuZ2U6IDIgdG8gMjU2Iik7CiB1bnNpZ25lZCBpbnQgY2lmc19tYXhfcGVuZGluZyA9IENJRlNfTUFYX1JFUTsKLW1vZHVsZV9wYXJhbShjaWZzX21heF9wZW5kaW5nLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNpZnNfbWF4X3BlbmRpbmcsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNpZnNfbWF4X3BlbmRpbmcsICJTaW11bHRhbmVvdXMgcmVxdWVzdHMgdG8gc2VydmVyLiAiCiAJCQkJICAgIkRlZmF1bHQ6IDUwIFJhbmdlOiAyIHRvIDI1NiIpOwogdW5zaWduZWQgc2hvcnQgZWNob19yZXRyaWVzID0gNTsKQEAgLTgyLDYgKzgyLDEwIEBACiBNT0RVTEVfUEFSTV9ERVNDKGVjaG9fcmV0cmllcywgIk51bWJlciBvZiBlY2hvIGF0dGVtcHRzIGJlZm9yZSBnaXZpbmcgdXAgYW5kICIKIAkJCSAgICAgICAicmVjb25uZWN0aW5nIHNlcnZlci4gRGVmYXVsdDogNS4gMCBtZWFucyAiCiAJCQkgICAgICAgIm5ldmVyIHJlY29ubmVjdC4iKTsKK21vZHVsZV9wYXJhbShlbmFibGVfb3Bsb2NrcywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9vcGxvY2tzLCAiRW5hYmxlIG9yIGRpc2FibGUgb3Bsb2NrcyAoYm9vbCkuIERlZmF1bHQ6IgorCQkJCSAieS9ZLzEiKTsKKwogZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19zbV9yZXFfcG9vbHA7CiBleHRlcm4gbWVtcG9vbF90ICpjaWZzX3JlcV9wb29scDsKIGV4dGVybiBtZW1wb29sX3QgKmNpZnNfbWlkX3Bvb2xwOwpAQCAtMTMyLDEyICsxMzYsMTIgQEAKIAllbHNlCiAJCXNiLT5zX2Rfb3AgPSAmY2lmc19kZW50cnlfb3BzOwogCi0jaWZkZWYgQ0lGU19ORlNEX0VYUE9SVAorI2lmZGVmIENPTkZJR19DSUZTX05GU0RfRVhQT1JUCiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9TRVJWRVJfSU5VTSkgewogCQljRllJKDEsICJleHBvcnQgb3BzIHN1cHBvcnRlZCIpOwogCQlzYi0+c19leHBvcnRfb3AgPSAmY2lmc19leHBvcnRfb3BzOwogCX0KLSNlbmRpZiAvKiBDSUZTX05GU0RfRVhQT1JUICovCisjZW5kaWYgLyogQ09ORklHX0NJRlNfTkZTRF9FWFBPUlQgKi8KIAogCXJldHVybiAwOwogCkBAIC00MzIsNiArNDM2LDEyIEBACiAJCXNlcV9wcmludGYocywgIixtZnN5bWxpbmtzIik7CiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9GU0NBQ0hFKQogCQlzZXFfcHJpbnRmKHMsICIsZnNjIik7CisJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT1NTWU5DKQorCQlzZXFfcHJpbnRmKHMsICIsbm9zdHJpY3RzeW5jIik7CisJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19QRVJNKQorCQlzZXFfcHJpbnRmKHMsICIsbm9wZXJtIik7CisJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9TVFJJQ1RfSU8pCisJCXNlcV9wcmludGYocywgIixzdHJpY3RjYWNoZSIpOwogCiAJc2VxX3ByaW50ZihzLCAiLHJzaXplPSVkIiwgY2lmc19zYi0+cnNpemUpOwogCXNlcV9wcmludGYocywgIix3c2l6ZT0lZCIsIGNpZnNfc2ItPndzaXplKTsKQEAgLTUzMCw3ICs1NDAsNiBAQAogCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEw7CiAJY2hhciAqcywgKnA7CiAJY2hhciBzZXA7Ci0JaW50IHhpZDsKIAogCWZ1bGxfcGF0aCA9IGNpZnNfYnVpbGRfcGF0aF90b19yb290KHZvbCwgY2lmc19zYiwKIAkJCQkJICAgIGNpZnNfc2JfbWFzdGVyX3Rjb24oY2lmc19zYikpOwpAQCAtNTM5LDcgKzU0OCw2IEBACiAKIAljRllJKDEsICJHZXQgcm9vdCBkZW50cnkgZm9yICVzIiwgZnVsbF9wYXRoKTsKIAotCXhpZCA9IEdldFhpZCgpOwogCXNlcCA9IENJRlNfRElSX1NFUChjaWZzX3NiKTsKIAlkZW50cnkgPSBkZ2V0KHNiLT5zX3Jvb3QpOwogCXAgPSBzID0gZnVsbF9wYXRoOwpAQCAtNTcwLDcgKzU3OCw2IEBACiAJCWRwdXQoZGVudHJ5KTsKIAkJZGVudHJ5ID0gY2hpbGQ7CiAJfSB3aGlsZSAoIUlTX0VSUihkZW50cnkpKTsKLQlfRnJlZVhpZCh4aWQpOwogCWtmcmVlKGZ1bGxfcGF0aCk7CiAJcmV0dXJuIGRlbnRyeTsKIH0KQEAgLTcyMyw3ICs3MzAsNyBAQAogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIChsb2ZmX3QpcmM7CiAJfQotCXJldHVybiBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX2xsc2VlayhmaWxlLCBvZmZzZXQsIG9yaWdpbik7CiB9CiAKIHN0YXRpYyBpbnQgY2lmc19zZXRsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9uZyBhcmcsIHN0cnVjdCBmaWxlX2xvY2sgKipsZWFzZSkKQEAgLTk0Miw3ICs5NDksOCBAQAogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IGlub2RlOwogCiAJaW5vZGVfaW5pdF9vbmNlKCZjaWZzaS0+dmZzX2lub2RlKTsKLQlJTklUX0xJU1RfSEVBRCgmY2lmc2ktPmxvY2tMaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmY2lmc2ktPmxsaXN0KTsKKwltdXRleF9pbml0KCZjaWZzaS0+bG9ja19tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmggYi9mcy9jaWZzL2NpZnNmcy5oCmluZGV4IDk1ZGE4MDIuLjMwZmY1NjAgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmgKKysrIGIvZnMvY2lmcy9jaWZzZnMuaApAQCAtMTIxLDkgKzEyMSw5IEBACiBleHRlcm4gc3NpemVfdAljaWZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKIGV4dGVybiBsb25nIGNpZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKLSNpZmRlZiBDSUZTX05GU0RfRVhQT1JUCisjaWZkZWYgQ09ORklHX0NJRlNfTkZTRF9FWFBPUlQKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgY2lmc19leHBvcnRfb3BzOwotI2VuZGlmIC8qIENJRlNfTkZTRF9FWFBPUlQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19ORlNEX0VYUE9SVCAqLwogCi0jZGVmaW5lIENJRlNfVkVSU0lPTiAgICIxLjc1IgorI2RlZmluZSBDSUZTX1ZFUlNJT04gICAiMS43NiIKICNlbmRpZgkJCQkvKiBfQ0lGU0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2dsb2IuaCBiL2ZzL2NpZnMvY2lmc2dsb2IuaAppbmRleCA5NWRhZDlkLi44MjM4YWExIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNnbG9iLmgKKysrIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCkBAIC0xNjcsNiArMTY3LDggQEAKIAl1aWRfdCBjcmVkX3VpZDsKIAl1aWRfdCBsaW51eF91aWQ7CiAJZ2lkX3QgbGludXhfZ2lkOworCXVpZF90IGJhY2t1cHVpZDsKKwlnaWRfdCBiYWNrdXBnaWQ7CiAJbW9kZV90IGZpbGVfbW9kZTsKIAltb2RlX3QgZGlyX21vZGU7CiAJdW5zaWduZWQgc2VjRmxnOwpAQCAtMTc5LDYgKzE4MSw4IEBACiAJYm9vbCBub3Blcm06MTsKIAlib29sIG5vX3BzeF9hY2w6MTsgLyogc2V0IGlmIHBvc2l4IGFjbCBzdXBwb3J0IHNob3VsZCBiZSBkaXNhYmxlZCAqLwogCWJvb2wgY2lmc19hY2w6MTsKKwlib29sIGJhY2t1cHVpZF9zcGVjaWZpZWQ7IC8qIG1vdW50IG9wdGlvbiAgYmFja3VwdWlkICBpcyBzcGVjaWZpZWQgKi8KKwlib29sIGJhY2t1cGdpZF9zcGVjaWZpZWQ7IC8qIG1vdW50IG9wdGlvbiAgYmFja3VwZ2lkICBpcyBzcGVjaWZpZWQgKi8KIAlib29sIG5vX3hhdHRyOjE7ICAgLyogc2V0IGlmIHhhdHRyIChFQSkgc3VwcG9ydCBzaG91bGQgYmUgZGlzYWJsZWQqLwogCWJvb2wgc2VydmVyX2lubzoxOyAvKiB1c2UgaW5vZGUgbnVtYmVycyBmcm9tIHNlcnZlciBpZSBVbmlxdWVJZCAqLwogCWJvb2wgZGlyZWN0X2lvOjE7CkBAIC0yMTksNyArMjIzLDggQEAKIAkJCSBDSUZTX01PVU5UX09WRVJSX0dJRCB8IENJRlNfTU9VTlRfRFlOUEVSTSB8IFwKIAkJCSBDSUZTX01PVU5UX05PUE9TSVhCUkwgfCBDSUZTX01PVU5UX05PU1NZTkMgfCBcCiAJCQkgQ0lGU19NT1VOVF9GU0NBQ0hFIHwgQ0lGU19NT1VOVF9NRl9TWU1MSU5LUyB8IFwKLQkJCSBDSUZTX01PVU5UX01VTFRJVVNFUiB8IENJRlNfTU9VTlRfU1RSSUNUX0lPKQorCQkJIENJRlNfTU9VTlRfTVVMVElVU0VSIHwgQ0lGU19NT1VOVF9TVFJJQ1RfSU8gfCBcCisJCQkgQ0lGU19NT1VOVF9DSUZTX0JBQ0tVUFVJRCB8IENJRlNfTU9VTlRfQ0lGU19CQUNLVVBHSUQpCiAKICNkZWZpbmUgQ0lGU19NU19NQVNLIChNU19SRE9OTFkgfCBNU19NQU5ETE9DSyB8IE1TX05PRVhFQyB8IE1TX05PU1VJRCB8IFwKIAkJICAgICAgTVNfTk9ERVYgfCBNU19TWU5DSFJPTk9VUykKQEAgLTI4Niw3ICsyOTEsMTMgQEAKIAlib29sCXNlY19rZXJiZXJvc3UydTsJLyogc3VwcG9ydHMgVTJVIEtlcmJlcm9zICovCiAJYm9vbAlzZWNfa2VyYmVyb3M7CQkvKiBzdXBwb3J0cyBwbGFpbiBLZXJiZXJvcyAqLwogCWJvb2wJc2VjX21za2VyYmVyb3M7CQkvKiBzdXBwb3J0cyBsZWdhY3kgTVMgS2VyYmVyb3MgKi8KKwlib29sCWxhcmdlX2J1ZjsJCS8qIGlzIGN1cnJlbnQgYnVmZmVyIGxhcmdlPyAqLwogCXN0cnVjdCBkZWxheWVkX3dvcmsJZWNobzsgLyogZWNobyBwaW5nIHdvcmtxdWV1ZSBqb2IgKi8KKwlzdHJ1Y3Qga3ZlYyAqaW92OwkvKiByZXVzYWJsZSBrdmVjIGFycmF5IGZvciByZWNlaXZlcyAqLworCXVuc2lnbmVkIGludCBucl9pb3Y7CS8qIG51bWJlciBvZiBrdmVjcyBpbiBhcnJheSAqLworCWNoYXIJKnNtYWxsYnVmOwkvKiBwb2ludGVyIHRvIGN1cnJlbnQgInNtYWxsIiBidWZmZXIgKi8KKwljaGFyCSpiaWdidWY7CS8qIHBvaW50ZXIgdG8gY3VycmVudCAiYmlnIiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgdG90YWxfcmVhZDsgLyogdG90YWwgYW1vdW50IG9mIGRhdGEgcmVhZCBpbiB0aGlzIHBhc3MgKi8KICNpZmRlZiBDT05GSUdfQ0lGU19GU0NBQ0hFCiAJc3RydWN0IGZzY2FjaGVfY29va2llICAgKmZzY2FjaGU7IC8qIGNsaWVudCBpbmRleCBjYWNoZSBjb29raWUgKi8KICNlbmRpZgpAQCAtNDg1LDkgKzQ5NiwxMyBAQAogICovCiBzdHJ1Y3QgY2lmc0xvY2tJbmZvIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxsaXN0OwkvKiBwb2ludGVyIHRvIG5leHQgY2lmc0xvY2tJbmZvICovCisJc3RydWN0IGxpc3RfaGVhZCBibGlzdDsgLyogcG9pbnRlciB0byBsb2NrcyBibG9ja2VkIG9uIHRoaXMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBibG9ja19xOwogCV9fdTY0IG9mZnNldDsKIAlfX3U2NCBsZW5ndGg7CisJX191MzIgcGlkOwogCV9fdTggdHlwZTsKKwlfX3UxNiBuZXRmaWQ7CiB9OwogCiAvKgpAQCAtNTIwLDggKzUzNSw2IEBACiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXVuc2lnbmVkIGludCBmX2ZsYWdzOwogCXN0cnVjdCB0Y29uX2xpbmsgKnRsaW5rOwotCXN0cnVjdCBtdXRleCBsb2NrX211dGV4OwotCXN0cnVjdCBsaXN0X2hlYWQgbGxpc3Q7IC8qIGxpc3Qgb2YgYnl0ZSByYW5nZSBsb2NrcyB3ZSBoYXZlLiAqLwogCWJvb2wgaW52YWxpZEhhbmRsZToxOwkvKiBmaWxlIGNsb3NlZCB2aWEgc2Vzc2lvbiBhYmVuZCAqLwogCWJvb2wgb3Bsb2NrX2JyZWFrX2NhbmNlbGxlZDoxOwogCWludCBjb3VudDsJCS8qIHJlZmNvdW50IHByb3RlY3RlZCBieSBjaWZzX2ZpbGVfbGlzdF9sb2NrICovCkBAIC01NTQsNyArNTY3LDkgQEAKICAqLwogCiBzdHJ1Y3QgY2lmc0lub2RlSW5mbyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsb2NrTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxsaXN0OwkJLyogYnJsb2NrcyBmb3IgdGhpcyBpbm9kZSAqLworCWJvb2wgY2FuX2NhY2hlX2JybGNrczsKKwlzdHJ1Y3QgbXV0ZXggbG9ja19tdXRleDsJLyogcHJvdGVjdCB0d28gZmllbGRzIGFib3ZlICovCiAJLyogQkIgYWRkIGluIGxpc3RzIGZvciBkaXJ0eSBwYWdlcyBpLmUuIHdyaXRlIGNhY2hpbmcgaW5mbyBmb3Igb3Bsb2NrICovCiAJc3RydWN0IGxpc3RfaGVhZCBvcGVuRmlsZUxpc3Q7CiAJX191MzIgY2lmc0F0dHJzOyAvKiBlLmcuIERPUyBhcmNoaXZlIGJpdCwgc3BhcnNlLCBjb21wcmVzc2VkLCBzeXN0ZW0gKi8KQEAgLTY0Myw4ICs2NTgsMjQgQEAKIHN0cnVjdCBtaWRfcV9lbnRyeTsKIAogLyoKLSAqIFRoaXMgaXMgdGhlIHByb3RvdHlwZSBmb3IgdGhlIG1pZCBjYWxsYmFjayBmdW5jdGlvbi4gV2hlbiBjcmVhdGluZyBvbmUsCi0gKiB0YWtlIHNwZWNpYWwgY2FyZSB0byBhdm9pZCBkZWFkbG9ja3MuIFRoaW5ncyB0byBiZWFyIGluIG1pbmQ6CisgKiBUaGlzIGlzIHRoZSBwcm90b3R5cGUgZm9yIHRoZSBtaWQgcmVjZWl2ZSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBmb3IKKyAqIHJlY2VpdmluZyB0aGUgcmVzdCBvZiB0aGUgU01CIGZyYW1lLCBzdGFydGluZyB3aXRoIHRoZSBXb3JkQ291bnQgKHdoaWNoIGlzCisgKiBqdXN0IGFmdGVyIHRoZSBNSUQgaW4gc3RydWN0IHNtYl9oZHIpLiBOb3RlOgorICoKKyAqIC0gVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBjaWZzZCwgd2l0aCBubyBsb2NrcyBoZWxkLgorICogLSBUaGUgbWlkIHdpbGwgc3RpbGwgYmUgb24gdGhlIHBlbmRpbmdfbWlkX3EuCisgKiAtIG1pZC0+cmVzcF9idWYgd2lsbCBwb2ludCB0byB0aGUgY3VycmVudCBidWZmZXIuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIGEgc3VjY2Vzc2Z1bCByZWNlaXZlLCBvciBhbiBlcnJvci4gVGhlIHJlY2VpdmUgc3RhdGUgaW4KKyAqIHRoZSBUQ1BfU2VydmVyX0luZm8gd2lsbCBhbHNvIGJlIHVwZGF0ZWQuCisgKi8KK3R5cGVkZWYgaW50IChtaWRfcmVjZWl2ZV90KShzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsCisJCQkgICAgc3RydWN0IG1pZF9xX2VudHJ5ICptaWQpOworCisvKgorICogVGhpcyBpcyB0aGUgcHJvdG90eXBlIGZvciB0aGUgbWlkIGNhbGxiYWNrIGZ1bmN0aW9uLiBUaGlzIGlzIGNhbGxlZCBvbmNlIHRoZQorICogbWlkIGhhcyBiZWVuIHJlY2VpdmVkIG9mZiBvZiB0aGUgc29ja2V0LiBXaGVuIGNyZWF0aW5nIG9uZSwgdGFrZSBzcGVjaWFsCisgKiBjYXJlIHRvIGF2b2lkIGRlYWRsb2Nrcy4gVGhpbmdzIHRvIGJlYXIgaW4gbWluZDoKICAqCiAgKiAtIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IGNpZnNkLCB3aXRoIG5vIGxvY2tzIGhlbGQKICAqIC0gdGhlIG1pZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBhbnkgbGlzdHMKQEAgLTY2Miw5ICs2OTMsMTAgQEAKIAl1bnNpZ25lZCBsb25nIHdoZW5fc2VudDsgLyogdGltZSB3aGVuIHNtYiBzZW5kIGZpbmlzaGVkICovCiAJdW5zaWduZWQgbG9uZyB3aGVuX3JlY2VpdmVkOyAvKiB3aGVuIGRlbXV4IGNvbXBsZXRlICh0YWtlbiBvZmYgd2lyZSkgKi8KICNlbmRpZgorCW1pZF9yZWNlaXZlX3QgKnJlY2VpdmU7IC8qIGNhbGwgcmVjZWl2ZSBjYWxsYmFjayAqLwogCW1pZF9jYWxsYmFja190ICpjYWxsYmFjazsgLyogY2FsbCBjb21wbGV0aW9uIGNhbGxiYWNrICovCiAJdm9pZCAqY2FsbGJhY2tfZGF0YTsJICAvKiBnZW5lcmFsIHB1cnBvc2UgcG9pbnRlciBmb3IgY2FsbGJhY2sgKi8KLQlzdHJ1Y3Qgc21iX2hkciAqcmVzcF9idWY7CS8qIHJlc3BvbnNlIGJ1ZmZlciAqLworCXN0cnVjdCBzbWJfaGRyICpyZXNwX2J1ZjsJLyogcG9pbnRlciB0byByZWNlaXZlZCBTTUIgaGVhZGVyICovCiAJaW50IG1pZFN0YXRlOwkvKiB3aXNoIHRoaXMgd2VyZSBlbnVtIGJ1dCBjYW4gbm90IHBhc3MgdG8gd2FpdF9ldmVudCAqLwogCV9fdTggY29tbWFuZDsJLyogc21iIGNvbW1hbmQgY29kZSAqLwogCWJvb2wgbGFyZ2VCdWY6MTsJLyogaWYgdmFsaWQgcmVzcG9uc2UsIGlzIHBvaW50ZXIgdG8gbGFyZ2UgYnVmICovCkBAIC05NjQsNyArOTk2LDggQEAKIAkJCQl0byBiZSBlc3RhYmxpc2hlZCBvbiBleGlzdGluZyBtb3VudCBpZiB3ZQogCQkJCWhhdmUgdGhlIHVpZC9wYXNzd29yZCBvciBLZXJiZXJvcyBjcmVkZW50aWFsCiAJCQkJb3IgZXF1aXZhbGVudCBmb3IgY3VycmVudCB1c2VyICovCi1HTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBvcGxvY2tFbmFibGVkOworLyogZW5hYmxlIG9yIGRpc2FibGUgb3Bsb2NrcyAqLworR0xPQkFMX0VYVEVSTiBib29sIGVuYWJsZV9vcGxvY2tzOwogR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgbG9va3VwQ2FjaGVFbmFibGVkOwogR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgZ2xvYmFsX3NlY2ZsYWdzOwkvKiBpZiBvbiwgc2Vzc2lvbiBzZXR1cCBzZW50CiAJCQkJd2l0aCBtb3JlIHNlY3VyZSBudGxtc3NwMiBjaGFsbGVuZ2UvcmVzcCAqLwpAQCAtOTc4LDEwICsxMDExLDE2IEBACiAvKiByZWNvbm5lY3QgYWZ0ZXIgdGhpcyBtYW55IGZhaWxlZCBlY2hvIGF0dGVtcHRzICovCiBHTE9CQUxfRVhURVJOIHVuc2lnbmVkIHNob3J0IGVjaG9fcmV0cmllczsKIAorI2lmZGVmIENPTkZJR19DSUZTX0FDTAogR0xPQkFMX0VYVEVSTiBzdHJ1Y3QgcmJfcm9vdCB1aWR0cmVlOwogR0xPQkFMX0VYVEVSTiBzdHJ1Y3QgcmJfcm9vdCBnaWR0cmVlOwogR0xPQkFMX0VYVEVSTiBzcGlubG9ja190IHNpZHVpZGxvY2s7CiBHTE9CQUxfRVhURVJOIHNwaW5sb2NrX3Qgc2lkZ2lkbG9jazsKK0dMT0JBTF9FWFRFUk4gc3RydWN0IHJiX3Jvb3Qgc2lkdWlkdHJlZTsKK0dMT0JBTF9FWFRFUk4gc3RydWN0IHJiX3Jvb3Qgc2lkZ2lkdHJlZTsKK0dMT0JBTF9FWFRFUk4gc3BpbmxvY2tfdCB1aWRzaWRsb2NrOworR0xPQkFMX0VYVEVSTiBzcGlubG9ja190IGdpZHNpZGxvY2s7CisjZW5kaWYgLyogQ09ORklHX0NJRlNfQUNMICovCiAKIHZvaWQgY2lmc19vcGxvY2tfYnJlYWsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcGR1LmggYi9mcy9jaWZzL2NpZnNwZHUuaAppbmRleCBkZTNhYTI4Li4zZmIwM2UyIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNwZHUuaAorKysgYi9mcy9jaWZzL2NpZnNwZHUuaApAQCAtMTA4OSw5ICsxMDg5LDcgQEAKIAlfX2xlMTYgRGF0YUxlbmd0aEhpZ2g7CiAJX191NjQgUmVzZXJ2ZWQyOwogCV9fdTE2IEJ5dGVDb3VudDsKLQlfX3U4IFBhZDsJCS8qIEJCIGNoZWNrIGZvciB3aGV0aGVyIHBhZGRlZCB0byBEV09SRAotCQkJCSAgIGJvdW5kYXJ5IGFuZCBvcHRpbXVtIHBlcmZvcm1hbmNlIGhlcmUgKi8KLQljaGFyIERhdGFbMV07CisJLyogcmVhZCByZXNwb25zZSBkYXRhIGltbWVkaWF0ZWx5IGZvbGxvd3MgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgUkVBRF9SU1A7CiAKIHR5cGVkZWYgc3RydWN0IGxvY2tpbmdfYW5keF9yYW5nZSB7CkBAIC0xOTEzLDYgKzE5MTEsMTAgQEAKIAogLyogU0VURlNJbmZvIExldmVscyAqLwogI2RlZmluZSBTTUJfU0VUX0NJRlNfVU5JWF9JTkZPICAgIDB4MjAwCisvKiBsZXZlbCAweDIwMyBpcyBkZWZpbmVkIGFib3ZlIGluIGxpc3Qgb2YgUUZTIGluZm8gbGV2ZWxzICovCisvKiAjZGVmaW5lIFNNQl9SRVFVRVNUX1RSQU5TUE9SVF9FTkNSWVBUSU9OIDB4MjAzICovCisKKy8qIExldmVsIDB4MjAwIHJlcXVlc3Qgc3RydWN0dXJlIGZvbGxvd3MgKi8KIHR5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NldGZzaV9yZXEgewogCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTUgKi8KIAlfX2xlMTYgVG90YWxQYXJhbWV0ZXJDb3VudDsKQEAgLTE5NDAsMTMgKzE5NDIsMzkgQEAKIAlfX2xlNjQgQ2xpZW50VW5peENhcDsgICAvKiBEYXRhIGVuZCAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBUUkFOU0FDVElPTjJfU0VURlNJX1JFUTsKIAorLyogbGV2ZWwgMHgyMDMgcmVxdWVzdCBzdHJ1Y3R1cmUgZm9sbG93cyAqLwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2V0ZnNfZW5jX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxNSAqLworCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMTYgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IE1heERhdGFDb3VudDsKKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDsKKwlfX2xlMTYgRmxhZ3M7CisJX19sZTMyIFRpbWVvdXQ7CisJX191MTYgUmVzZXJ2ZWQyOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsJLyogNCAqLworCV9fbGUxNiBQYXJhbWV0ZXJPZmZzZXQ7CisJX19sZTE2IERhdGFDb3VudDsJLyogMTIgKi8KKwlfX2xlMTYgRGF0YU9mZnNldDsKKwlfX3U4IFNldHVwQ291bnQ7CS8qIG9uZSAqLworCV9fdTggUmVzZXJ2ZWQzOworCV9fbGUxNiBTdWJDb21tYW5kOwkvKiBUUkFOUzJfU0VUX0ZTX0lORk9STUFUSU9OICovCisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IFBhZDsKKwlfX3UxNiAgUmVzZXJ2ZWQ0OwkvKiBQYXJhbWV0ZXJzIHN0YXJ0LiAqLworCV9fbGUxNiBJbmZvcm1hdGlvbkxldmVsOy8qIFBhcmFtZXRlcnMgZW5kLiAqLworCS8qIE5UTE1TU1AgQmxvYiwgRGF0YSBzdGFydC4gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgVFJBTlNBQ1RJT04yX1NFVEZTSV9FTkNfUkVROworCisvKiByZXNwb25zZSBmb3Igc2V0ZnNpbmZvIGxldmVscyAweDIwMCBhbmQgMHgyMDMgKi8KIHR5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NldGZzaV9yc3AgewogCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTAgKi8KIAlzdHJ1Y3QgdHJhbnMyX3Jlc3AgdDI7CiAJX191MTYgQnl0ZUNvdW50OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBUUkFOU0FDVElPTjJfU0VURlNJX1JTUDsKIAotCiB0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9nZXRfZGZzX3JlZmVyX3JlcSB7CiAJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxNSAqLwogCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OwpAQCAtMjA5OCwxMyArMjEyNiwxMyBAQAogI2RlZmluZSBDSUZTX1VOSVhfUFJPWFlfQ0FQICAgICAgICAgICAgIDB4MDAwMDA0MDAgLyogUHJveHkgY2FwOiAweEFDRSBpb2N0bCBhbmQKIAkJCQkJCSAgICAgIFFGUyBQUk9YWSBjYWxsICovCiAjaWZkZWYgQ09ORklHX0NJRlNfUE9TSVgKLS8qIENhbiBub3Qgc2V0IHBhdGhuYW1lcyBjYXAgeWV0IHVudGlsIHdlIHNlbmQgbmV3IHBvc2l4IGNyZWF0ZSBTTUIgc2luY2UKLSAgIG90aGVyd2lzZSBzZXJ2ZXIgY2FuIHRyZWF0IHN1Y2ggaGFuZGxlcyBvcGVuZWQgd2l0aCBvbGRlciBudGNyZWF0ZXgKLSAgIChieSBhIG5ldyBjbGllbnQgd2hpY2gga25vd3MgaG93IHRvIHNlbmQgcG9zaXggcGF0aCBvcHMpCi0gICBhcyBub24tcG9zaXggaGFuZGxlcyAoY2FuIGFmZmVjdCB3cml0ZSBiZWhhdmlvciB3aXRoIGJ5dGUgcmFuZ2UgbG9ja3MuCi0gICBXZSBjYW4gYWRkIGJhY2sgaW4gUE9TSVhfUEFUSF9PUFMgY2FwIHdoZW4gUG9zaXggQ3JlYXRlL01rZGlyIGZpbmlzaGVkICovCisvKiBwcmVzdW1hYmx5IGRvbid0IG5lZWQgdGhlIDB4MjAgUE9TSVhfUEFUSF9PUFNfQ0FQIHNpbmNlIHdlIG5ldmVyIHNlbmQKKyAgIExvY2tpbmdYIGluc3RlYWQgb2YgcG9zaXggbG9ja2luZyBjYWxsIG9uIHVuaXggc2VzcyAoYW5kIHdlIGRvIG5vdCBleHBlY3QKKyAgIExvY2tpbmdYIHRvIHVzZSBkaWZmZXJlbnQgKGllIFdpbmRvd3MpIHNlbWFudGljcyB0aGFuIHBvc2l4IGxvY2tpbmcgb24KKyAgIHRoZSBzYW1lIHNlc3Npb24gKGlmIFdJTkUgbmVlZHMgdG8gZG8gdGhpcyBsYXRlciwgd2UgY2FuIGFkZCB0aGlzIGNhcAorICAgYmFjayBpbiBsYXRlciAqLwogLyogI2RlZmluZSBDSUZTX1VOSVhfQ0FQX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwZmIgKi8KLSNkZWZpbmUgQ0lGU19VTklYX0NBUF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMGRiCisjZGVmaW5lIENJRlNfVU5JWF9DQVBfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDNkYgogI2Vsc2UKICNkZWZpbmUgQ0lGU19VTklYX0NBUF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDEzCiAjZW5kaWYgLyogQ09ORklHX0NJRlNfUE9TSVggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3Byb3RvLmggYi9mcy9jaWZzL2NpZnNwcm90by5oCmluZGV4IDhkZjI4ZTkuLjZmNGUyNDMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3Byb3RvLmgKKysrIGIvZnMvY2lmcy9jaWZzcHJvdG8uaApAQCAtNjksOCArNjksOSBAQAogCQkJCQlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwogZXh0ZXJuIHZvaWQgRGVsZXRlTWlkUUVudHJ5KHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkRW50cnkpOwogZXh0ZXJuIGludCBjaWZzX2NhbGxfYXN5bmMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3Qga3ZlYyAqaW92LAotCQkJICAgdW5zaWduZWQgaW50IG52ZWMsIG1pZF9jYWxsYmFja190ICpjYWxsYmFjaywKLQkJCSAgIHZvaWQgKmNiZGF0YSwgYm9vbCBpZ25vcmVfcGVuZCk7CisJCQkgICB1bnNpZ25lZCBpbnQgbnZlYywgbWlkX3JlY2VpdmVfdCAqcmVjZWl2ZSwKKwkJCSAgIG1pZF9jYWxsYmFja190ICpjYWxsYmFjaywgdm9pZCAqY2JkYXRhLAorCQkJICAgYm9vbCBpZ25vcmVfcGVuZCk7CiBleHRlcm4gaW50IFNlbmRSZWNlaXZlKGNvbnN0IHVuc2lnbmVkIGludCAvKiB4aWQgKi8gLCBzdHJ1Y3QgY2lmc19zZXMgKiwKIAkJCXN0cnVjdCBzbWJfaGRyICogLyogaW5wdXQgKi8gLAogCQkJc3RydWN0IHNtYl9oZHIgKiAvKiBvdXQgKi8gLApAQCAtOTAsNiArOTEsNyBAQAogZXh0ZXJuIGludCBjaGVja1NNQihzdHJ1Y3Qgc21iX2hkciAqc21iLCBfX3UxNiBtaWQsIHVuc2lnbmVkIGludCBsZW5ndGgpOwogZXh0ZXJuIGJvb2wgaXNfdmFsaWRfb3Bsb2NrX2JyZWFrKHN0cnVjdCBzbWJfaGRyICpzbWIsCiAJCQkJICBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICopOworZXh0ZXJuIGJvb2wgYmFja3VwX2NyZWQoc3RydWN0IGNpZnNfc2JfaW5mbyAqKTsKIGV4dGVybiBib29sIGlzX3NpemVfc2FmZV90b19jaGFuZ2Uoc3RydWN0IGNpZnNJbm9kZUluZm8gKiwgX191NjQgZW9mKTsKIGV4dGVybiB2b2lkIGNpZnNfdXBkYXRlX2VvZihzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2ksIGxvZmZfdCBvZmZzZXQsCiAJCQkgICAgdW5zaWduZWQgaW50IGJ5dGVzX3dyaXR0ZW4pOwpAQCAtMTQ1LDEyICsxNDcsMTkgQEAKIGV4dGVybiBpbnQgY2lmc19hY2xfdG9fZmF0dHIoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwKIAkJCSAgICAgIHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0ciwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IF9fdTE2ICpwZmlkKTsKLWV4dGVybiBpbnQgbW9kZV90b19jaWZzX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpwYXRoLCBfX3U2NCk7CitleHRlcm4gaW50IGlkX21vZGVfdG9fY2lmc19hY2woc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqcGF0aCwgX191NjQsCisJCQkJCXVpZF90LCBnaWRfdCk7CiBleHRlcm4gc3RydWN0IGNpZnNfbnRzZCAqZ2V0X2NpZnNfYWNsKHN0cnVjdCBjaWZzX3NiX2luZm8gKiwgc3RydWN0IGlub2RlICosCiAJCQkJCWNvbnN0IGNoYXIgKiwgdTMyICopOwogZXh0ZXJuIGludCBzZXRfY2lmc19hY2woc3RydWN0IGNpZnNfbnRzZCAqLCBfX3UzMiwgc3RydWN0IGlub2RlICosCi0JCQkJY29uc3QgY2hhciAqKTsKKwkJCQljb25zdCBjaGFyICosIGludCk7CiAKK2V4dGVybiB2b2lkIGRlcXVldWVfbWlkKHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkLCBib29sIG1hbGZvcm1lZCk7CitleHRlcm4gaW50IGNpZnNfcmVhZF9mcm9tX3NvY2tldChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGNoYXIgKmJ1ZiwKKwkJICAgICB1bnNpZ25lZCBpbnQgdG9fcmVhZCk7CitleHRlcm4gaW50IGNpZnNfcmVhZHZfZnJvbV9zb2NrZXQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAorCQlzdHJ1Y3Qga3ZlYyAqaW92X29yaWcsIHVuc2lnbmVkIGludCBucl9zZWdzLAorCQl1bnNpZ25lZCBpbnQgdG9fcmVhZCk7CiBleHRlcm4gdm9pZCBjaWZzX3NldHVwX2NpZnNfc2Ioc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbywKIAkJCSAgICAgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKTsKIGV4dGVybiBpbnQgY2lmc19tYXRjaF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqKTsKQEAgLTM1OSwxNCArMzY4LDE3IEBACiAJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UsCiAJCQlpbnQgcmVtYXBfc3BlY2lhbF9jaGFycyk7CiAKK2V4dGVybiBpbnQgY2lmc19sb2Nrdihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLCBjb25zdCBfX3UxNiBuZXRmaWQsCisJCSAgICAgIGNvbnN0IF9fdTggbG9ja190eXBlLCBjb25zdCBfX3UzMiBudW1fdW5sb2NrLAorCQkgICAgICBjb25zdCBfX3UzMiBudW1fbG9jaywgTE9DS0lOR19BTkRYX1JBTkdFICpidWYpOwogZXh0ZXJuIGludCBDSUZTU01CTG9jayhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAotCQkJY29uc3QgX191MTYgbmV0ZmlkLCBjb25zdCBfX3U2NCBsZW4sCisJCQljb25zdCBfX3UxNiBuZXRmaWQsIGNvbnN0IF9fdTMyIG5ldHBpZCwgY29uc3QgX191NjQgbGVuLAogCQkJY29uc3QgX191NjQgb2Zmc2V0LCBjb25zdCBfX3UzMiBudW1VbmxvY2ssCiAJCQljb25zdCBfX3UzMiBudW1Mb2NrLCBjb25zdCBfX3U4IGxvY2tUeXBlLAogCQkJY29uc3QgYm9vbCB3YWl0RmxhZywgY29uc3QgX191OCBvcGxvY2tfbGV2ZWwpOwogZXh0ZXJuIGludCBDSUZTU01CUG9zaXhMb2NrKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JCQljb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgaW50IGdldF9mbGFnLAotCQkJY29uc3QgX191NjQgbGVuLCBzdHJ1Y3QgZmlsZV9sb2NrICosCisJCQljb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgX191MzIgbmV0cGlkLAorCQkJY29uc3QgaW50IGdldF9mbGFnLCBjb25zdCBfX3U2NCBsZW4sIHN0cnVjdCBmaWxlX2xvY2sgKiwKIAkJCWNvbnN0IF9fdTE2IGxvY2tfdHlwZSwgY29uc3QgYm9vbCB3YWl0RmxhZyk7CiBleHRlcm4gaW50IENJRlNTTUJURGlzKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24pOwogZXh0ZXJuIGludCBDSUZTU01CRWNobyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwpAQCAtMzgwLDExICszOTIsMTIgQEAKIGV4dGVybiBpbnQgY2lmc19zaWduX3NtYihzdHJ1Y3Qgc21iX2hkciAqLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICosIF9fdTMyICopOwogZXh0ZXJuIGludCBjaWZzX3NpZ25fc21iMihzdHJ1Y3Qga3ZlYyAqaW92LCBpbnQgbl92ZWMsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKiwKIAkJCSAgX191MzIgKik7Ci1leHRlcm4gaW50IGNpZnNfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3Qgc21iX2hkciAqLAorZXh0ZXJuIGludCBjaWZzX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGt2ZWMgKmlvdiwgdW5zaWduZWQgaW50IG5yX2lvdiwKIAkJCQkgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAogCQkJCV9fdTMyIGV4cGVjdGVkX3NlcXVlbmNlX251bWJlcik7Ci1leHRlcm4gaW50IFNNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKTsKLWV4dGVybiBpbnQgc2V0dXBfbnRsbV9yZXNwb25zZShzdHJ1Y3QgY2lmc19zZXMgKik7CitleHRlcm4gaW50IFNNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKK2V4dGVybiBpbnQgc2V0dXBfbnRsbV9yZXNwb25zZShzdHJ1Y3QgY2lmc19zZXMgKiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKIGV4dGVybiBpbnQgc2V0dXBfbnRsbXYyX3JzcChzdHJ1Y3QgY2lmc19zZXMgKiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKIGV4dGVybiBpbnQgY2lmc19jcnlwdG9fc2hhc2hfYWxsb2NhdGUoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqKTsKIGV4dGVybiB2b2lkIGNpZnNfY3J5cHRvX3NoYXNoX3JlbGVhc2Uoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqKTsKQEAgLTQxOSw3ICs0MzIsNyBAQAogZXh0ZXJuIGludCBDSUZTU01CR2V0Q0lGU0FDTChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAogCQkJX191MTYgZmlkLCBzdHJ1Y3QgY2lmc19udHNkICoqYWNsX2luZiwgX191MzIgKmJ1Zmxlbik7CiBleHRlcm4gaW50IENJRlNTTUJTZXRDSUZTQUNMKGNvbnN0IGludCwgc3RydWN0IGNpZnNfdGNvbiAqLCBfX3UxNiwKLQkJCXN0cnVjdCBjaWZzX250c2QgKiwgX191MzIpOworCQkJc3RydWN0IGNpZnNfbnRzZCAqLCBfX3UzMiwgaW50KTsKIGV4dGVybiBpbnQgQ0lGU1NNQkdldFBvc2l4QUNMKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCiAJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCiAJCWNoYXIgKmFjbF9pbmYsIGNvbnN0IGludCBidWZsZW4sIGNvbnN0IGludCBhY2xfdHlwZSwKQEAgLTQzNiwxMCArNDQ5LDI5IEBACiAJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdGgsCiAJCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsIGludCB4aWQpOwogZXh0ZXJuIGludCBtZGZvdXIodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50IEVfbWQ0aGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKnAxNik7CitleHRlcm4gaW50IEVfbWQ0aGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKnAxNiwKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKmNvZGVwYWdlKTsKIGV4dGVybiBpbnQgU01CZW5jcnlwdCh1bnNpZ25lZCBjaGFyICpwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmM4LAogCQkJdW5zaWduZWQgY2hhciAqcDI0KTsKIAorLyogYXN5bmNocm9ub3VzIHJlYWQgc3VwcG9ydCAqLworc3RydWN0IGNpZnNfcmVhZGRhdGEgeworCXN0cnVjdCBjaWZzRmlsZUluZm8JCSpjZmlsZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkJKm1hcHBpbmc7CisJX191NjQJCQkJb2Zmc2V0OworCXVuc2lnbmVkIGludAkJCWJ5dGVzOworCXBpZF90CQkJCXBpZDsKKwlpbnQJCQkJcmVzdWx0OworCXN0cnVjdCBsaXN0X2hlYWQJCXBhZ2VzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29yazsKKwl1bnNpZ25lZCBpbnQJCQlucl9pb3Y7CisJc3RydWN0IGt2ZWMJCQlpb3ZbMV07Cit9OworCitzdHJ1Y3QgY2lmc19yZWFkZGF0YSAqY2lmc19yZWFkZGF0YV9hbGxvYyh1bnNpZ25lZCBpbnQgbnJfcGFnZXMpOwordm9pZCBjaWZzX3JlYWRkYXRhX2ZyZWUoc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhKTsKK2ludCBjaWZzX2FzeW5jX3JlYWR2KHN0cnVjdCBjaWZzX3JlYWRkYXRhICpyZGF0YSk7CisKIC8qIGFzeW5jaHJvbm91cyB3cml0ZSBzdXBwb3J0ICovCiBzdHJ1Y3QgY2lmc193cml0ZWRhdGEgewogCXN0cnVjdCBrcmVmCQkJcmVmY291bnQ7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNzbWIuYyBiL2ZzL2NpZnMvY2lmc3NtYi5jCmluZGV4IGE4MGY3YmQuLjY2MDBhYTIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3NtYi5jCisrKyBiL2ZzL2NpZnMvY2lmc3NtYi5jCkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiY2lmc3BkdS5oIgogI2luY2x1ZGUgImNpZnNnbG9iLmgiCkBAIC00MCw2ICs0Miw3IEBACiAjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCiAjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCiAjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgImZzY2FjaGUuaCIKIAogI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCiBzdGF0aWMgc3RydWN0IHsKQEAgLTgzLDYgKzg2LDkgQEAKICNlbmRpZiAvKiBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0ggKi8KICNlbmRpZiAvKiBDSUZTX1BPU0lYICovCiAKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCBjaWZzX3JlYWR2X2NvbXBsZXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKIC8qIE1hcmsgYXMgaW52YWxpZCwgYWxsIG9wZW4gZmlsZXMgb24gdHJlZSBjb25uZWN0aW9ucyBzaW5jZSB0aGV5CiAgICB3ZXJlIGNsb3NlZCB3aGVuIHNlc3Npb24gdG8gc2VydmVyIHdhcyBsb3N0ICovCiBzdGF0aWMgdm9pZCBtYXJrX29wZW5fZmlsZXNfaW52YWxpZChzdHJ1Y3QgY2lmc190Y29uICpwVGNvbikKQEAgLTQ1Myw4ICs0NTksNyBAQAogCQl9CiAJCXNlcnZlci0+c2VjX21vZGUgPSAoX191OClsZTE2X3RvX2NwdShyc3AtPlNlY3VyaXR5TW9kZSk7CiAJCXNlcnZlci0+bWF4UmVxID0gbGUxNl90b19jcHUocnNwLT5NYXhNcHhDb3VudCk7Ci0JCXNlcnZlci0+bWF4QnVmID0gbWluKChfX3UzMilsZTE2X3RvX2NwdShyc3AtPk1heEJ1ZlNpemUpLAotCQkJCShfX3UzMilDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFKTsKKwkJc2VydmVyLT5tYXhCdWYgPSBsZTE2X3RvX2NwdShyc3AtPk1heEJ1ZlNpemUpOwogCQlzZXJ2ZXItPm1heF92Y3MgPSBsZTE2X3RvX2NwdShyc3AtPk1heE51bWJlclZjcyk7CiAJCS8qIGV2ZW4gdGhvdWdoIHdlIGRvIG5vdCB1c2UgcmF3IHdlIG1pZ2h0IGFzIHdlbGwgc2V0IHRoaXMKIAkJYWNjdXJhdGVseSwgaW4gY2FzZSB3ZSBldmVyIGZpbmQgYSBuZWVkIGZvciBpdCAqLwpAQCAtNTYxLDggKzU2Niw3IEBACiAJICAgbGl0dGxlIGVuZGlhbiAqLwogCXNlcnZlci0+bWF4UmVxID0gbGUxNl90b19jcHUocFNNQnItPk1heE1weENvdW50KTsKIAkvKiBwcm9iYWJseSBubyBuZWVkIHRvIHN0b3JlIGFuZCBjaGVjayBtYXh2Y3MgKi8KLQlzZXJ2ZXItPm1heEJ1ZiA9IG1pbihsZTMyX3RvX2NwdShwU01Cci0+TWF4QnVmZmVyU2l6ZSksCi0JCQkoX191MzIpIENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUpOworCXNlcnZlci0+bWF4QnVmID0gbGUzMl90b19jcHUocFNNQnItPk1heEJ1ZmZlclNpemUpOwogCXNlcnZlci0+bWF4X3J3ID0gbGUzMl90b19jcHUocFNNQnItPk1heFJhd1NpemUpOwogCWNGWUkoREJHMiwgIk1heCBidWYgPSAlZCIsIHNlcy0+c2VydmVyLT5tYXhCdWYpOwogCXNlcnZlci0+Y2FwYWJpbGl0aWVzID0gbGUzMl90b19jcHUocFNNQnItPkNhcGFiaWxpdGllcyk7CkBAIC03MzksNyArNzQzLDggQEAKIAlpb3YuaW92X2Jhc2UgPSBzbWI7CiAJaW92Lmlvdl9sZW4gPSBiZTMyX3RvX2NwdShzbWItPmhkci5zbWJfYnVmX2xlbmd0aCkgKyA0OwogCi0JcmMgPSBjaWZzX2NhbGxfYXN5bmMoc2VydmVyLCAmaW92LCAxLCBjaWZzX2VjaG9fY2FsbGJhY2ssIHNlcnZlciwgdHJ1ZSk7CisJcmMgPSBjaWZzX2NhbGxfYXN5bmMoc2VydmVyLCAmaW92LCAxLCBOVUxMLCBjaWZzX2VjaG9fY2FsbGJhY2ssCisJCQkgICAgIHNlcnZlciwgdHJ1ZSk7CiAJaWYgKHJjKQogCQljRllJKDEsICJFY2hvIHJlcXVlc3QgZmFpbGVkOiAlZCIsIHJjKTsKIApAQCAtMTM3Niw2ICsxMzgxLDM1OSBAQAogCXJldHVybiByYzsKIH0KIAorc3RydWN0IGNpZnNfcmVhZGRhdGEgKgorY2lmc19yZWFkZGF0YV9hbGxvYyh1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCit7CisJc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhOworCisJLyogcmVhZGRhdGEgKyAxIGt2ZWMgZm9yIGVhY2ggcGFnZSAqLworCXJkYXRhID0ga3phbGxvYyhzaXplb2YoKnJkYXRhKSArCisJCQlzaXplb2Yoc3RydWN0IGt2ZWMpICogbnJfcGFnZXMsIEdGUF9LRVJORUwpOworCWlmIChyZGF0YSAhPSBOVUxMKSB7CisJCUlOSVRfV09SSygmcmRhdGEtPndvcmssIGNpZnNfcmVhZHZfY29tcGxldGUpOworCQlJTklUX0xJU1RfSEVBRCgmcmRhdGEtPnBhZ2VzKTsKKwl9CisJcmV0dXJuIHJkYXRhOworfQorCit2b2lkCitjaWZzX3JlYWRkYXRhX2ZyZWUoc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhKQoreworCWNpZnNGaWxlSW5mb19wdXQocmRhdGEtPmNmaWxlKTsKKwlrZnJlZShyZGF0YSk7Cit9CisKKy8qCisgKiBEaXNjYXJkIGFueSByZW1haW5pbmcgZGF0YSBpbiB0aGUgY3VycmVudCBTTUIuIFRvIGRvIHRoaXMsIHdlIGJvcnJvdyB0aGUKKyAqIGN1cnJlbnQgYmlnYnVmLgorICovCitzdGF0aWMgaW50CitjaWZzX3JlYWR2X2Rpc2NhcmQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZCkKK3sKKwlSRUFEX1JTUCAqcnNwID0gKFJFQURfUlNQICopc2VydmVyLT5zbWFsbGJ1ZjsKKwl1bnNpZ25lZCBpbnQgcmZjbGVuID0gYmUzMl90b19jcHUocnNwLT5oZHIuc21iX2J1Zl9sZW5ndGgpOworCWludCByZW1haW5pbmcgPSByZmNsZW4gKyA0IC0gc2VydmVyLT50b3RhbF9yZWFkOworCXN0cnVjdCBjaWZzX3JlYWRkYXRhICpyZGF0YSA9IG1pZC0+Y2FsbGJhY2tfZGF0YTsKKworCXdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisJCWludCBsZW5ndGg7CisKKwkJbGVuZ3RoID0gY2lmc19yZWFkX2Zyb21fc29ja2V0KHNlcnZlciwgc2VydmVyLT5iaWdidWYsCisJCQkJbWluX3QodW5zaWduZWQgaW50LCByZW1haW5pbmcsCisJCQkJCUNJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUpKTsKKwkJaWYgKGxlbmd0aCA8IDApCisJCQlyZXR1cm4gbGVuZ3RoOworCQlzZXJ2ZXItPnRvdGFsX3JlYWQgKz0gbGVuZ3RoOworCQlyZW1haW5pbmcgLT0gbGVuZ3RoOworCX0KKworCWRlcXVldWVfbWlkKG1pZCwgcmRhdGEtPnJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfcmVhZHZfcmVjZWl2ZShzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkKQoreworCWludCBsZW5ndGgsIGxlbjsKKwl1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQsIHJlbWFpbmluZywgZGF0YV9sZW47CisJc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhID0gbWlkLT5jYWxsYmFja19kYXRhOworCVJFQURfUlNQICpyc3AgPSAoUkVBRF9SU1AgKilzZXJ2ZXItPnNtYWxsYnVmOworCXVuc2lnbmVkIGludCByZmNsZW4gPSBiZTMyX3RvX2NwdShyc3AtPmhkci5zbWJfYnVmX2xlbmd0aCkgKyA0OworCXU2NCBlb2Y7CisJcGdvZmZfdCBlb2ZfaW5kZXg7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICp0cGFnZTsKKworCWNGWUkoMSwgIiVzOiBtaWQ9JXUgb2Zmc2V0PSVsbHUgYnl0ZXM9JXUiLCBfX2Z1bmNfXywKKwkJbWlkLT5taWQsIHJkYXRhLT5vZmZzZXQsIHJkYXRhLT5ieXRlcyk7CisKKwkvKgorCSAqIHJlYWQgdGhlIHJlc3Qgb2YgUkVBRF9SU1AgaGVhZGVyIChzYW5zIERhdGEgYXJyYXkpLCBvciB3aGF0ZXZlciB3ZQorCSAqIGNhbiBpZiB0aGVyZSdzIG5vdCBlbm91Z2ggZGF0YS4gQXQgdGhpcyBwb2ludCwgd2UndmUgcmVhZCBkb3duIHRvCisJICogdGhlIE1pZC4KKwkgKi8KKwlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHJmY2xlbiwgc2l6ZW9mKCpyc3ApKSAtCisJCQlzaXplb2Yoc3RydWN0IHNtYl9oZHIpICsgMTsKKworCXJkYXRhLT5pb3ZbMF0uaW92X2Jhc2UgPSBzZXJ2ZXItPnNtYWxsYnVmICsgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDE7CisJcmRhdGEtPmlvdlswXS5pb3ZfbGVuID0gbGVuOworCisJbGVuZ3RoID0gY2lmc19yZWFkdl9mcm9tX3NvY2tldChzZXJ2ZXIsIHJkYXRhLT5pb3YsIDEsIGxlbik7CisJaWYgKGxlbmd0aCA8IDApCisJCXJldHVybiBsZW5ndGg7CisJc2VydmVyLT50b3RhbF9yZWFkICs9IGxlbmd0aDsKKworCS8qIFdhcyB0aGUgU01CIHJlYWQgc3VjY2Vzc2Z1bD8gKi8KKwlyZGF0YS0+cmVzdWx0ID0gbWFwX3NtYl90b19saW51eF9lcnJvcigmcnNwLT5oZHIsIGZhbHNlKTsKKwlpZiAocmRhdGEtPnJlc3VsdCAhPSAwKSB7CisJCWNGWUkoMSwgIiVzOiBzZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBfX2Z1bmNfXywKKwkJCXJkYXRhLT5yZXN1bHQpOworCQlyZXR1cm4gY2lmc19yZWFkdl9kaXNjYXJkKHNlcnZlciwgbWlkKTsKKwl9CisKKwkvKiBJcyB0aGVyZSBlbm91Z2ggdG8gZ2V0IHRvIHRoZSByZXN0IG9mIHRoZSBSRUFEX1JTUCBoZWFkZXI/ICovCisJaWYgKHNlcnZlci0+dG90YWxfcmVhZCA8IHNpemVvZihSRUFEX1JTUCkpIHsKKwkJY0ZZSSgxLCAiJXM6IHNlcnZlciByZXR1cm5lZCBzaG9ydCBoZWFkZXIuIGdvdD0ldSBleHBlY3RlZD0lenUiLAorCQkJX19mdW5jX18sIHNlcnZlci0+dG90YWxfcmVhZCwgc2l6ZW9mKFJFQURfUlNQKSk7CisJCXJkYXRhLT5yZXN1bHQgPSAtRUlPOworCQlyZXR1cm4gY2lmc19yZWFkdl9kaXNjYXJkKHNlcnZlciwgbWlkKTsKKwl9CisKKwlkYXRhX29mZnNldCA9IGxlMTZfdG9fY3B1KHJzcC0+RGF0YU9mZnNldCkgKyA0OworCWlmIChkYXRhX29mZnNldCA8IHNlcnZlci0+dG90YWxfcmVhZCkgeworCQkvKgorCQkgKiB3aW4yazggc29tZXRpbWVzIHNlbmRzIGFuIG9mZnNldCBvZiAwIHdoZW4gdGhlIHJlYWQKKwkJICogaXMgYmV5b25kIHRoZSBFT0YuIFRyZWF0IGl0IGFzIGlmIHRoZSBkYXRhIHN0YXJ0cyBqdXN0IGFmdGVyCisJCSAqIHRoZSBoZWFkZXIuCisJCSAqLworCQljRllJKDEsICIlczogZGF0YSBvZmZzZXQgKCV1KSBpbnNpZGUgcmVhZCByZXNwb25zZSBoZWFkZXIiLAorCQkJX19mdW5jX18sIGRhdGFfb2Zmc2V0KTsKKwkJZGF0YV9vZmZzZXQgPSBzZXJ2ZXItPnRvdGFsX3JlYWQ7CisJfSBlbHNlIGlmIChkYXRhX29mZnNldCA+IE1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFKSB7CisJCS8qIGRhdGFfb2Zmc2V0IGlzIGJleW9uZCB0aGUgZW5kIG9mIHNtYWxsYnVmICovCisJCWNGWUkoMSwgIiVzOiBkYXRhIG9mZnNldCAoJXUpIGJleW9uZCBlbmQgb2Ygc21hbGxidWYiLAorCQkJX19mdW5jX18sIGRhdGFfb2Zmc2V0KTsKKwkJcmRhdGEtPnJlc3VsdCA9IC1FSU87CisJCXJldHVybiBjaWZzX3JlYWR2X2Rpc2NhcmQoc2VydmVyLCBtaWQpOworCX0KKworCWNGWUkoMSwgIiVzOiB0b3RhbF9yZWFkPSV1IGRhdGFfb2Zmc2V0PSV1IiwgX19mdW5jX18sCisJCXNlcnZlci0+dG90YWxfcmVhZCwgZGF0YV9vZmZzZXQpOworCisJbGVuID0gZGF0YV9vZmZzZXQgLSBzZXJ2ZXItPnRvdGFsX3JlYWQ7CisJaWYgKGxlbiA+IDApIHsKKwkJLyogcmVhZCBhbnkganVuayBiZWZvcmUgZGF0YSBpbnRvIHRoZSByZXN0IG9mIHNtYWxsYnVmICovCisJCXJkYXRhLT5pb3ZbMF0uaW92X2Jhc2UgPSBzZXJ2ZXItPnNtYWxsYnVmICsgc2VydmVyLT50b3RhbF9yZWFkOworCQlyZGF0YS0+aW92WzBdLmlvdl9sZW4gPSBsZW47CisJCWxlbmd0aCA9IGNpZnNfcmVhZHZfZnJvbV9zb2NrZXQoc2VydmVyLCByZGF0YS0+aW92LCAxLCBsZW4pOworCQlpZiAobGVuZ3RoIDwgMCkKKwkJCXJldHVybiBsZW5ndGg7CisJCXNlcnZlci0+dG90YWxfcmVhZCArPSBsZW5ndGg7CisJfQorCisJLyogc2V0IHVwIGZpcnN0IGlvdiBmb3Igc2lnbmF0dXJlIGNoZWNrICovCisJcmRhdGEtPmlvdlswXS5pb3ZfYmFzZSA9IHNlcnZlci0+c21hbGxidWY7CisJcmRhdGEtPmlvdlswXS5pb3ZfbGVuID0gc2VydmVyLT50b3RhbF9yZWFkOworCWNGWUkoMSwgIjA6IGlvdl9iYXNlPSVwIGlvdl9sZW49JXp1IiwKKwkJcmRhdGEtPmlvdlswXS5pb3ZfYmFzZSwgcmRhdGEtPmlvdlswXS5pb3ZfbGVuKTsKKworCS8qIGhvdyBtdWNoIGRhdGEgaXMgaW4gdGhlIHJlc3BvbnNlPyAqLworCWRhdGFfbGVuID0gbGUxNl90b19jcHUocnNwLT5EYXRhTGVuZ3RoSGlnaCkgPDwgMTY7CisJZGF0YV9sZW4gKz0gbGUxNl90b19jcHUocnNwLT5EYXRhTGVuZ3RoKTsKKwlpZiAoZGF0YV9vZmZzZXQgKyBkYXRhX2xlbiA+IHJmY2xlbikgeworCQkvKiBkYXRhX2xlbiBpcyBjb3JydXB0IC0tIGRpc2NhcmQgZnJhbWUgKi8KKwkJcmRhdGEtPnJlc3VsdCA9IC1FSU87CisJCXJldHVybiBjaWZzX3JlYWR2X2Rpc2NhcmQoc2VydmVyLCBtaWQpOworCX0KKworCS8qIG1hcnNoYWwgdXAgdGhlIHBhZ2UgYXJyYXkgKi8KKwlsZW4gPSAwOworCXJlbWFpbmluZyA9IGRhdGFfbGVuOworCXJkYXRhLT5ucl9pb3YgPSAxOworCisJLyogZGV0ZXJtaW5lIHRoZSBlb2YgdGhhdCB0aGUgc2VydmVyIChwcm9iYWJseSkgaGFzICovCisJZW9mID0gQ0lGU19JKHJkYXRhLT5tYXBwaW5nLT5ob3N0KS0+c2VydmVyX2VvZjsKKwllb2ZfaW5kZXggPSBlb2YgPyAoZW9mIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVCA6IDA7CisJY0ZZSSgxLCAiZW9mPSVsbHUgZW9mX2luZGV4PSVsdSIsIGVvZiwgZW9mX2luZGV4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCB0cGFnZSwgJnJkYXRhLT5wYWdlcywgbHJ1KSB7CisJCWlmIChyZW1haW5pbmcgPj0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQkvKiBlbm91Z2ggZGF0YSB0byBmaWxsIHRoZSBwYWdlICovCisJCQlyZGF0YS0+aW92W3JkYXRhLT5ucl9pb3ZdLmlvdl9iYXNlID0ga21hcChwYWdlKTsKKwkJCXJkYXRhLT5pb3ZbcmRhdGEtPm5yX2lvdl0uaW92X2xlbiA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJCWNGWUkoMSwgIiV1OiBpZHg9JWx1IGlvdl9iYXNlPSVwIGlvdl9sZW49JXp1IiwKKwkJCQlyZGF0YS0+bnJfaW92LCBwYWdlLT5pbmRleCwKKwkJCQlyZGF0YS0+aW92W3JkYXRhLT5ucl9pb3ZdLmlvdl9iYXNlLAorCQkJCXJkYXRhLT5pb3ZbcmRhdGEtPm5yX2lvdl0uaW92X2xlbik7CisJCQkrK3JkYXRhLT5ucl9pb3Y7CisJCQlsZW4gKz0gUEFHRV9DQUNIRV9TSVpFOworCQkJcmVtYWluaW5nIC09IFBBR0VfQ0FDSEVfU0laRTsKKwkJfSBlbHNlIGlmIChyZW1haW5pbmcgPiAwKSB7CisJCQkvKiBlbm91Z2ggZm9yIHBhcnRpYWwgcGFnZSwgZmlsbCBhbmQgemVybyB0aGUgcmVzdCAqLworCQkJcmRhdGEtPmlvdltyZGF0YS0+bnJfaW92XS5pb3ZfYmFzZSA9IGttYXAocGFnZSk7CisJCQlyZGF0YS0+aW92W3JkYXRhLT5ucl9pb3ZdLmlvdl9sZW4gPSByZW1haW5pbmc7CisJCQljRllJKDEsICIldTogaWR4PSVsdSBpb3ZfYmFzZT0lcCBpb3ZfbGVuPSV6dSIsCisJCQkJcmRhdGEtPm5yX2lvdiwgcGFnZS0+aW5kZXgsCisJCQkJcmRhdGEtPmlvdltyZGF0YS0+bnJfaW92XS5pb3ZfYmFzZSwKKwkJCQlyZGF0YS0+aW92W3JkYXRhLT5ucl9pb3ZdLmlvdl9sZW4pOworCQkJbWVtc2V0KHJkYXRhLT5pb3ZbcmRhdGEtPm5yX2lvdl0uaW92X2Jhc2UgKyByZW1haW5pbmcsCisJCQkJJ1wwJywgUEFHRV9DQUNIRV9TSVpFIC0gcmVtYWluaW5nKTsKKwkJCSsrcmRhdGEtPm5yX2lvdjsKKwkJCWxlbiArPSByZW1haW5pbmc7CisJCQlyZW1haW5pbmcgPSAwOworCQl9IGVsc2UgaWYgKHBhZ2UtPmluZGV4ID4gZW9mX2luZGV4KSB7CisJCQkvKgorCQkJICogVGhlIFZGUyB3aWxsIG5vdCB0cnkgdG8gZG8gcmVhZGFoZWFkIHBhc3QgdGhlCisJCQkgKiBpX3NpemUsIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBvdXRzdGFuZGluZworCQkJICogd3JpdGVzIHdpdGggZ2FwcyBpbiB0aGUgbWlkZGxlIGFuZCB0aGUgaV9zaXplIGhhc24ndAorCQkJICogY2F1Z2h0IHVwIHlldC4gUG9wdWxhdGUgdGhvc2Ugd2l0aCB6ZXJvZWQgb3V0IHBhZ2VzCisJCQkgKiB0byBwcmV2ZW50IHRoZSBWRlMgZnJvbSByZXBlYXRlZGx5IGF0dGVtcHRpbmcgdG8KKwkJCSAqIGZpbGwgdGhlbSB1bnRpbCB0aGUgd3JpdGVzIGFyZSBmbHVzaGVkLgorCQkJICovCisJCQl6ZXJvX3VzZXIocGFnZSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCQkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG5vIG5lZWQgdG8gaG9sZCBwYWdlIGhvc3RhZ2UgKi8KKwkJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCQkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0KKwl9CisKKwkvKiBpc3N1ZSB0aGUgcmVhZCBpZiB3ZSBoYXZlIGFueSBpb3ZlY3MgbGVmdCB0byBmaWxsICovCisJaWYgKHJkYXRhLT5ucl9pb3YgPiAxKSB7CisJCWxlbmd0aCA9IGNpZnNfcmVhZHZfZnJvbV9zb2NrZXQoc2VydmVyLCAmcmRhdGEtPmlvdlsxXSwKKwkJCQkJCXJkYXRhLT5ucl9pb3YgLSAxLCBsZW4pOworCQlpZiAobGVuZ3RoIDwgMCkKKwkJCXJldHVybiBsZW5ndGg7CisJCXNlcnZlci0+dG90YWxfcmVhZCArPSBsZW5ndGg7CisJfSBlbHNlIHsKKwkJbGVuZ3RoID0gMDsKKwl9CisKKwlyZGF0YS0+Ynl0ZXMgPSBsZW5ndGg7CisKKwljRllJKDEsICJ0b3RhbF9yZWFkPSV1IHJmY2xlbj0ldSByZW1haW5pbmc9JXUiLCBzZXJ2ZXItPnRvdGFsX3JlYWQsCisJCXJmY2xlbiwgcmVtYWluaW5nKTsKKworCS8qIGRpc2NhcmQgYW55dGhpbmcgbGVmdCBvdmVyICovCisJaWYgKHNlcnZlci0+dG90YWxfcmVhZCA8IHJmY2xlbikKKwkJcmV0dXJuIGNpZnNfcmVhZHZfZGlzY2FyZChzZXJ2ZXIsIG1pZCk7CisKKwlkZXF1ZXVlX21pZChtaWQsIGZhbHNlKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZAorY2lmc19yZWFkdl9jb21wbGV0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCQlzdHJ1Y3QgY2lmc19yZWFkZGF0YSwgd29yayk7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICp0cGFnZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCB0cGFnZSwgJnJkYXRhLT5wYWdlcywgbHJ1KSB7CisJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCQlscnVfY2FjaGVfYWRkX2ZpbGUocGFnZSk7CisKKwkJaWYgKHJkYXRhLT5yZXN1bHQgPT0gMCkgeworCQkJa3VubWFwKHBhZ2UpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCX0KKworCQl1bmxvY2tfcGFnZShwYWdlKTsKKworCQlpZiAocmRhdGEtPnJlc3VsdCA9PSAwKQorCQkJY2lmc19yZWFkcGFnZV90b19mc2NhY2hlKHJkYXRhLT5tYXBwaW5nLT5ob3N0LCBwYWdlKTsKKworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCWNpZnNfcmVhZGRhdGFfZnJlZShyZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaWZzX3JlYWR2X2NhbGxiYWNrKHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkKQoreworCXN0cnVjdCBjaWZzX3JlYWRkYXRhICpyZGF0YSA9IG1pZC0+Y2FsbGJhY2tfZGF0YTsKKwlzdHJ1Y3QgY2lmc190Y29uICp0Y29uID0gdGxpbmtfdGNvbihyZGF0YS0+Y2ZpbGUtPnRsaW5rKTsKKwlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSB0Y29uLT5zZXMtPnNlcnZlcjsKKworCWNGWUkoMSwgIiVzOiBtaWQ9JXUgc3RhdGU9JWQgcmVzdWx0PSVkIGJ5dGVzPSV1IiwgX19mdW5jX18sCisJCW1pZC0+bWlkLCBtaWQtPm1pZFN0YXRlLCByZGF0YS0+cmVzdWx0LCByZGF0YS0+Ynl0ZXMpOworCisJc3dpdGNoIChtaWQtPm1pZFN0YXRlKSB7CisJY2FzZSBNSURfUkVTUE9OU0VfUkVDRUlWRUQ6CisJCS8qIHJlc3VsdCBhbHJlYWR5IHNldCwgY2hlY2sgc2lnbmF0dXJlICovCisJCWlmIChzZXJ2ZXItPnNlY19tb2RlICYKKwkJICAgIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpIHsKKwkJCWlmIChjaWZzX3ZlcmlmeV9zaWduYXR1cmUocmRhdGEtPmlvdiwgcmRhdGEtPm5yX2lvdiwKKwkJCQkJICBzZXJ2ZXIsIG1pZC0+c2VxdWVuY2VfbnVtYmVyICsgMSkpCisJCQkJY0VSUk9SKDEsICJVbmV4cGVjdGVkIFNNQiBzaWduYXR1cmUiKTsKKwkJfQorCQkvKiBGSVhNRTogc2hvdWxkIHRoaXMgYmUgY291bnRlZCB0b3dhcmQgdGhlIGluaXRpYXRpbmcgdGFzaz8gKi8KKwkJdGFza19pb19hY2NvdW50X3JlYWQocmRhdGEtPmJ5dGVzKTsKKwkJY2lmc19zdGF0c19ieXRlc19yZWFkKHRjb24sIHJkYXRhLT5ieXRlcyk7CisJCWJyZWFrOworCWNhc2UgTUlEX1JFUVVFU1RfU1VCTUlUVEVEOgorCWNhc2UgTUlEX1JFVFJZX05FRURFRDoKKwkJcmRhdGEtPnJlc3VsdCA9IC1FQUdBSU47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJkYXRhLT5yZXN1bHQgPSAtRUlPOworCX0KKworCXF1ZXVlX3dvcmsoc3lzdGVtX25ydF93cSwgJnJkYXRhLT53b3JrKTsKKwlEZWxldGVNaWRRRW50cnkobWlkKTsKKwlhdG9taWNfZGVjKCZzZXJ2ZXItPmluRmxpZ2h0KTsKKwl3YWtlX3VwKCZzZXJ2ZXItPnJlcXVlc3RfcSk7Cit9CisKKy8qIGNpZnNfYXN5bmNfcmVhZHYgLSBzZW5kIGFuIGFzeW5jIHdyaXRlLCBhbmQgc2V0IHVwIG1pZCB0byBoYW5kbGUgcmVzdWx0ICovCitpbnQKK2NpZnNfYXN5bmNfcmVhZHYoc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhKQoreworCWludCByYzsKKwlSRUFEX1JFUSAqc21iID0gTlVMTDsKKwlpbnQgd2N0OworCXN0cnVjdCBjaWZzX3Rjb24gKnRjb24gPSB0bGlua190Y29uKHJkYXRhLT5jZmlsZS0+dGxpbmspOworCisJY0ZZSSgxLCAiJXM6IG9mZnNldD0lbGx1IGJ5dGVzPSV1IiwgX19mdW5jX18sCisJCXJkYXRhLT5vZmZzZXQsIHJkYXRhLT5ieXRlcyk7CisKKwlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfRklMRVMpCisJCXdjdCA9IDEyOworCWVsc2UgeworCQl3Y3QgPSAxMDsgLyogb2xkIHN0eWxlIHJlYWQgKi8KKwkJaWYgKChyZGF0YS0+b2Zmc2V0ID4+IDMyKSA+IDApICB7CisJCQkvKiBjYW4gbm90IGhhbmRsZSB0aGlzIGJpZyBvZmZzZXQgZm9yIG9sZCAqLworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlyYyA9IHNtYWxsX3NtYl9pbml0KFNNQl9DT01fUkVBRF9BTkRYLCB3Y3QsIHRjb24sICh2b2lkICoqKSZzbWIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc21iLT5oZHIuUGlkID0gY3B1X3RvX2xlMTYoKF9fdTE2KXJkYXRhLT5waWQpOworCXNtYi0+aGRyLlBpZEhpZ2ggPSBjcHVfdG9fbGUxNigoX191MTYpKHJkYXRhLT5waWQgPj4gMTYpKTsKKworCXNtYi0+QW5kWENvbW1hbmQgPSAweEZGOwkvKiBub25lICovCisJc21iLT5GaWQgPSByZGF0YS0+Y2ZpbGUtPm5ldGZpZDsKKwlzbWItPk9mZnNldExvdyA9IGNwdV90b19sZTMyKHJkYXRhLT5vZmZzZXQgJiAweEZGRkZGRkZGKTsKKwlpZiAod2N0ID09IDEyKQorCQlzbWItPk9mZnNldEhpZ2ggPSBjcHVfdG9fbGUzMihyZGF0YS0+b2Zmc2V0ID4+IDMyKTsKKwlzbWItPlJlbWFpbmluZyA9IDA7CisJc21iLT5NYXhDb3VudCA9IGNwdV90b19sZTE2KHJkYXRhLT5ieXRlcyAmIDB4RkZGRik7CisJc21iLT5NYXhDb3VudEhpZ2ggPSBjcHVfdG9fbGUzMihyZGF0YS0+Ynl0ZXMgPj4gMTYpOworCWlmICh3Y3QgPT0gMTIpCisJCXNtYi0+Qnl0ZUNvdW50ID0gMDsKKwllbHNlIHsKKwkJLyogb2xkIHN0eWxlIHJlYWQgKi8KKwkJc3RydWN0IHNtYl9jb21fcmVhZHhfcmVxICpzbWJyID0KKwkJCShzdHJ1Y3Qgc21iX2NvbV9yZWFkeF9yZXEgKilzbWI7CisJCXNtYnItPkJ5dGVDb3VudCA9IDA7CisJfQorCisJLyogNCBmb3IgUkZDMTAwMSBsZW5ndGggKyAxIGZvciBCQ0MgKi8KKwlyZGF0YS0+aW92WzBdLmlvdl9iYXNlID0gc21iOworCXJkYXRhLT5pb3ZbMF0uaW92X2xlbiA9IGJlMzJfdG9fY3B1KHNtYi0+aGRyLnNtYl9idWZfbGVuZ3RoKSArIDQ7CisKKwlyYyA9IGNpZnNfY2FsbF9hc3luYyh0Y29uLT5zZXMtPnNlcnZlciwgcmRhdGEtPmlvdiwgMSwKKwkJCSAgICAgY2lmc19yZWFkdl9yZWNlaXZlLCBjaWZzX3JlYWR2X2NhbGxiYWNrLAorCQkJICAgICByZGF0YSwgZmFsc2UpOworCisJaWYgKHJjID09IDApCisJCWNpZnNfc3RhdHNfaW5jKCZ0Y29uLT5udW1fcmVhZHMpOworCisJY2lmc19zbWFsbF9idWZfcmVsZWFzZShzbWIpOworCXJldHVybiByYzsKK30KKwogaW50CiBDSUZTU01CUmVhZChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc19pb19wYXJtcyAqaW9fcGFybXMsIHVuc2lnbmVkIGludCAqbmJ5dGVzLAogCSAgICBjaGFyICoqYnVmLCBpbnQgKnBidWZfdHlwZSkKQEAgLTE4MzYsNyArMjE5NCw3IEBACiAKIAlrcmVmX2dldCgmd2RhdGEtPnJlZmNvdW50KTsKIAlyYyA9IGNpZnNfY2FsbF9hc3luYyh0Y29uLT5zZXMtPnNlcnZlciwgaW92LCB3ZGF0YS0+bnJfcGFnZXMgKyAxLAotCQkJICAgICBjaWZzX3dyaXRldl9jYWxsYmFjaywgd2RhdGEsIGZhbHNlKTsKKwkJCSAgICAgTlVMTCwgY2lmc193cml0ZXZfY2FsbGJhY2ssIHdkYXRhLCBmYWxzZSk7CiAKIAlpZiAocmMgPT0gMCkKIAkJY2lmc19zdGF0c19pbmMoJnRjb24tPm51bV93cml0ZXMpOwpAQCAtMTk2MiwxMCArMjMyMCw1MCBAQAogCXJldHVybiByYzsKIH0KIAoraW50IGNpZnNfbG9ja3YoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwgY29uc3QgX191MTYgbmV0ZmlkLAorCSAgICAgICBjb25zdCBfX3U4IGxvY2tfdHlwZSwgY29uc3QgX191MzIgbnVtX3VubG9jaywKKwkgICAgICAgY29uc3QgX191MzIgbnVtX2xvY2ssIExPQ0tJTkdfQU5EWF9SQU5HRSAqYnVmKQoreworCWludCByYyA9IDA7CisJTE9DS19SRVEgKnBTTUIgPSBOVUxMOworCXN0cnVjdCBrdmVjIGlvdlsyXTsKKwlpbnQgcmVzcF9idWZfdHlwZTsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgImNpZnNfbG9ja3YgbnVtIGxvY2sgJWQgbnVtIHVubG9jayAlZCIsIG51bV9sb2NrLCBudW1fdW5sb2NrKTsKKworCXJjID0gc21hbGxfc21iX2luaXQoU01CX0NPTV9MT0NLSU5HX0FORFgsIDgsIHRjb24sICh2b2lkICoqKSAmcFNNQik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5OdW1iZXJPZkxvY2tzID0gY3B1X3RvX2xlMTYobnVtX2xvY2spOworCXBTTUItPk51bWJlck9mVW5sb2NrcyA9IGNwdV90b19sZTE2KG51bV91bmxvY2spOworCXBTTUItPkxvY2tUeXBlID0gbG9ja190eXBlOworCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsgLyogbm9uZSAqLworCXBTTUItPkZpZCA9IG5ldGZpZDsgLyogbmV0ZmlkIHN0YXlzIGxlICovCisKKwljb3VudCA9IChudW1fdW5sb2NrICsgbnVtX2xvY2spICogc2l6ZW9mKExPQ0tJTkdfQU5EWF9SQU5HRSk7CisJaW5jX3JmYzEwMDFfbGVuKHBTTUIsIGNvdW50KTsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlpb3ZbMF0uaW92X2Jhc2UgPSAoY2hhciAqKXBTTUI7CisJaW92WzBdLmlvdl9sZW4gPSBiZTMyX3RvX2NwdShwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGgpICsgNCAtCisJCQkgKG51bV91bmxvY2sgKyBudW1fbG9jaykgKiBzaXplb2YoTE9DS0lOR19BTkRYX1JBTkdFKTsKKwlpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciAqKWJ1ZjsKKwlpb3ZbMV0uaW92X2xlbiA9IChudW1fdW5sb2NrICsgbnVtX2xvY2spICogc2l6ZW9mKExPQ0tJTkdfQU5EWF9SQU5HRSk7CisKKwljaWZzX3N0YXRzX2luYygmdGNvbi0+bnVtX2xvY2tzKTsKKwlyYyA9IFNlbmRSZWNlaXZlMih4aWQsIHRjb24tPnNlcywgaW92LCAyLCAmcmVzcF9idWZfdHlwZSwgQ0lGU19OT19SRVNQKTsKKwlpZiAocmMpCisJCWNGWUkoMSwgIlNlbmQgZXJyb3IgaW4gY2lmc19sb2NrdiA9ICVkIiwgcmMpOworCisJcmV0dXJuIHJjOworfQogCiBpbnQKIENJRlNTTUJMb2NrKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JICAgIGNvbnN0IF9fdTE2IHNtYl9maWxlX2lkLCBjb25zdCBfX3U2NCBsZW4sCisJICAgIGNvbnN0IF9fdTE2IHNtYl9maWxlX2lkLCBjb25zdCBfX3UzMiBuZXRwaWQsIGNvbnN0IF9fdTY0IGxlbiwKIAkgICAgY29uc3QgX191NjQgb2Zmc2V0LCBjb25zdCBfX3UzMiBudW1VbmxvY2ssCiAJICAgIGNvbnN0IF9fdTMyIG51bUxvY2ssIGNvbnN0IF9fdTggbG9ja1R5cGUsCiAJICAgIGNvbnN0IGJvb2wgd2FpdEZsYWcsIGNvbnN0IF9fdTggb3Bsb2NrX2xldmVsKQpAQCAtMjAwMSw3ICsyMzk5LDcgQEAKIAlwU01CLT5GaWQgPSBzbWJfZmlsZV9pZDsgLyogbmV0ZmlkIHN0YXlzIGxlICovCiAKIAlpZiAoKG51bUxvY2sgIT0gMCkgfHwgKG51bVVubG9jayAhPSAwKSkgewotCQlwU01CLT5Mb2Nrc1swXS5QaWQgPSBjcHVfdG9fbGUxNihjdXJyZW50LT50Z2lkKTsKKwkJcFNNQi0+TG9ja3NbMF0uUGlkID0gY3B1X3RvX2xlMTYobmV0cGlkKTsKIAkJLyogQkIgd2hlcmUgdG8gc3RvcmUgcGlkIGhpZ2g/ICovCiAJCXBTTUItPkxvY2tzWzBdLkxlbmd0aExvdyA9IGNwdV90b19sZTMyKCh1MzIpbGVuKTsKIAkJcFNNQi0+TG9ja3NbMF0uTGVuZ3RoSGlnaCA9IGNwdV90b19sZTMyKCh1MzIpKGxlbj4+MzIpKTsKQEAgLTIwMzUsOSArMjQzMyw5IEBACiAKIGludAogQ0lGU1NNQlBvc2l4TG9jayhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAotCQljb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgaW50IGdldF9mbGFnLCBjb25zdCBfX3U2NCBsZW4sCi0JCXN0cnVjdCBmaWxlX2xvY2sgKnBMb2NrRGF0YSwgY29uc3QgX191MTYgbG9ja190eXBlLAotCQljb25zdCBib29sIHdhaXRGbGFnKQorCQljb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgX191MzIgbmV0cGlkLCBjb25zdCBpbnQgZ2V0X2ZsYWcsCisJCWNvbnN0IF9fdTY0IGxlbiwgc3RydWN0IGZpbGVfbG9jayAqcExvY2tEYXRhLAorCQljb25zdCBfX3UxNiBsb2NrX3R5cGUsIGNvbnN0IGJvb2wgd2FpdEZsYWcpCiB7CiAJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yZXEgKnBTTUIgID0gTlVMTDsKIAlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JzcCAqcFNNQnIgPSBOVUxMOwpAQCAtMjA5NSw3ICsyNDkzLDcgQEAKIAl9IGVsc2UKIAkJcFNNQi0+VGltZW91dCA9IDA7CiAKLQlwYXJtX2RhdGEtPnBpZCA9IGNwdV90b19sZTMyKGN1cnJlbnQtPnRnaWQpOworCXBhcm1fZGF0YS0+cGlkID0gY3B1X3RvX2xlMzIobmV0cGlkKTsKIAlwYXJtX2RhdGEtPnN0YXJ0ID0gY3B1X3RvX2xlNjQocExvY2tEYXRhLT5mbF9zdGFydCk7CiAJcGFybV9kYXRhLT5sZW5ndGggPSBjcHVfdG9fbGU2NChsZW4pOyAgLyogbm9ybWFsaXplIG5lZ2F0aXZlIG51bWJlcnMgKi8KIApAQCAtMjgxMiw4ICszMjEwLDcgQEAKIAlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CiAJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUzMigyKTsKIAkvKiBCQiBmaW5kIGV4YWN0IGRhdGEgY291bnQgbWF4IGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KLQlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUzMigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtCi0JCQkJCSAgTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMzIoQ0lGU01heEJ1ZlNpemUgJiAweEZGRkZGRjAwKTsKIAlwU01CLT5NYXhTZXR1cENvdW50ID0gNDsKIAlwU01CLT5SZXNlcnZlZCA9IDA7CiAJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gMDsKQEAgLTMzMDYsOCArMzcwMyw3IEBACiAJcFNNQi0+UmVzZXJ2ZWQgPSAwOwogCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUzMihwYXJtX2xlbik7CiAJcFNNQi0+VG90YWxEYXRhQ291bnQgID0gMDsKLQlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUzMigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtCi0JCQkJCSAgTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMzIoQ0lGU01heEJ1ZlNpemUgJiAweEZGRkZGRjAwKTsKIAlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CiAJcFNNQi0+RGF0YUNvdW50ICA9IHBTTUItPlRvdGFsRGF0YUNvdW50OwogCXRlbXBfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fbnRyYW5zYWN0X3JlcSwgUGFybXMpICsKQEAgLTM0NjcsNyArMzg2Myw3IEBACiAKIGludAogQ0lGU1NNQlNldENJRlNBQ0woY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwgX191MTYgZmlkLAotCQkJc3RydWN0IGNpZnNfbnRzZCAqcG50c2QsIF9fdTMyIGFjbGxlbikKKwkJCXN0cnVjdCBjaWZzX250c2QgKnBudHNkLCBfX3UzMiBhY2xsZW4sIGludCBhY2xmbGFnKQogewogCV9fdTE2IGJ5dGVfY291bnQsIHBhcmFtX2NvdW50LCBkYXRhX2NvdW50LCBwYXJhbV9vZmZzZXQsIGRhdGFfb2Zmc2V0OwogCWludCByYyA9IDA7CkBAIC0zNTA0LDcgKzM5MDAsNyBAQAogCiAJcFNNQi0+RmlkID0gZmlkOyAvKiBmaWxlIGhhbmRsZSBhbHdheXMgbGUgKi8KIAlwU01CLT5SZXNlcnZlZDIgPSAwOwotCXBTTUItPkFjbEZsYWdzID0gY3B1X3RvX2xlMzIoQ0lGU19BQ0xfREFDTCk7CisJcFNNQi0+QWNsRmxhZ3MgPSBjcHVfdG9fbGUzMihhY2xmbGFnKTsKIAogCWlmIChwbnRzZCAmJiBhY2xsZW4pIHsKIAkJbWVtY3B5KChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sICsgZGF0YV9vZmZzZXQsCkBAIC0zOTc3LDggKzQzNzMsNyBAQAogCXBhcmFtcyA9IDEyICsgbmFtZV9sZW4gLyogaW5jbHVkZXMgbnVsbCAqLyA7CiAJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOwkvKiBubyBFQXMgKi8KIAlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDEwKTsKLQlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtCi0JCQkJCSAgTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoQ0lGU01heEJ1ZlNpemUgJiAweEZGRkZGRjAwKTsKIAlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKIAlwU01CLT5SZXNlcnZlZCA9IDA7CiAJcFNNQi0+RmxhZ3MgPSAwOwpAQCAtNDA1Miw4ICs0NDQ3LDcgQEAKIAkJCXBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSA9IDIgLyogc2tpcCAuIGFuZCAuLiAqLyArCiAJCQkJcHNyY2hfaW5mLT5lbnRyaWVzX2luX2J1ZmZlcjsKIAkJCWxub2ZmID0gbGUxNl90b19jcHUocGFybXMtPkxhc3ROYW1lT2Zmc2V0KTsKLQkJCWlmICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUgPAotCQkJICAgICAgbG5vZmYpIHsKKwkJCWlmIChDSUZTTWF4QnVmU2l6ZSA8IGxub2ZmKSB7CiAJCQkJY0VSUk9SKDEsICJpZ25vcmluZyBjb3JydXB0IHJlc3VtZSBuYW1lIik7CiAJCQkJcHNyY2hfaW5mLT5sYXN0X2VudHJ5ID0gTlVMTDsKIAkJCQlyZXR1cm4gcmM7CkBAIC00MDk3LDkgKzQ0OTEsNyBAQAogCWJ5dGVfY291bnQgPSAwOwogCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsgICAgICAgLyogbm8gRUFzICovCiAJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNig4KTsKLQlwU01CLT5NYXhEYXRhQ291bnQgPQotCQljcHVfdG9fbGUxNigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtIE1BWF9DSUZTX0hEUl9TSVpFKSAmCi0JCQkJMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoQ0lGU01heEJ1ZlNpemUgJiAweEZGRkZGRjAwKTsKIAlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKIAlwU01CLT5SZXNlcnZlZCA9IDA7CiAJcFNNQi0+RmxhZ3MgPSAwOwpAQCAtNDE4MSw4ICs0NTczLDcgQEAKIAkJCXBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSArPQogCQkJCXBzcmNoX2luZi0+ZW50cmllc19pbl9idWZmZXI7CiAJCQlsbm9mZiA9IGxlMTZfdG9fY3B1KHBhcm1zLT5MYXN0TmFtZU9mZnNldCk7Ci0JCQlpZiAodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtIE1BWF9DSUZTX0hEUl9TSVpFIDwKLQkJCSAgICAgIGxub2ZmKSB7CisJCQlpZiAoQ0lGU01heEJ1ZlNpemUgPCBsbm9mZikgewogCQkJCWNFUlJPUigxLCAiaWdub3JpbmcgY29ycnVwdCByZXN1bWUgbmFtZSIpOwogCQkJCXBzcmNoX2luZi0+bGFzdF9lbnRyeSA9IE5VTEw7CiAJCQkJcmV0dXJuIHJjOwpAQCAtNTg0MCw3ICs2MjMxLDcgQEAKIAogCQlpZiAoZWFfbmFtZSkgewogCQkJaWYgKGVhX25hbWVfbGVuID09IG5hbWVfbGVuICYmCi0JCQkgICAgc3RybmNtcChlYV9uYW1lLCB0ZW1wX3B0ciwgbmFtZV9sZW4pID09IDApIHsKKwkJCSAgICBtZW1jbXAoZWFfbmFtZSwgdGVtcF9wdHIsIG5hbWVfbGVuKSA9PSAwKSB7CiAJCQkJdGVtcF9wdHIgKz0gbmFtZV9sZW4gKyAxOwogCQkJCXJjID0gdmFsdWVfbGVuOwogCQkJCWlmIChidWZfc2l6ZSA9PSAwKQpAQCAtNjAzNSwxMiArNjQyNiw3IEBACiAJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IDAgOwogCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKIAlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTMyKDIpOwotCS8qIEJCIGZpbmQgZXhhY3QgZGF0YSBjb3VudCBtYXggZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLwotCXBTTUItPk1heERhdGFDb3VudCA9IDA7IC8qIHNhbWUgaW4gbGl0dGxlIGVuZGlhbiBvciBiZSAqLwotLyogQkIgVkVSSUZZIHZlcmlmeSB3aGljaCBpcyBjb3JyZWN0IGZvciBhYm92ZSBCQiAqLwotCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTMyKCh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0KLQkJCQkJICAgICBNQVhfQ0lGU19IRFJfU0laRSkgJiAweEZGRkZGRjAwKTsKLQorCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTMyKENJRlNNYXhCdWZTaXplICYgMHhGRkZGRkYwMCk7CiAJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDQ7CiAJcFNNQi0+UmVzZXJ2ZWQgPSAwOwogCXBTTUItPlBhcmFtZXRlck9mZnNldCA9IDA7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IDYyYWJmOWYuLmQ2YTk3MmQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSAiY2lmc3BkdS5oIgogI2luY2x1ZGUgImNpZnNnbG9iLmgiCkBAIC0xODEsNyArMTgyLDcgQEAKIAkJLUVJTlZBTCA9IGludmFsaWQgdHJhbnNhY3QyCiAKICAqLwotc3RhdGljIGludCBjaGVjazJuZFQyKHN0cnVjdCBzbWJfaGRyICpwU01CLCB1bnNpZ25lZCBpbnQgbWF4QnVmU2l6ZSkKK3N0YXRpYyBpbnQgY2hlY2sybmRUMihzdHJ1Y3Qgc21iX2hkciAqcFNNQikKIHsKIAlzdHJ1Y3Qgc21iX3QyX3JzcCAqcFNNQnQ7CiAJaW50IHJlbWFpbmluZzsKQEAgLTIxNCw5ICsyMTUsOSBAQAogCiAJY0ZZSSgxLCAibWlzc2luZyAlZCBieXRlcyBmcm9tIHRyYW5zYWN0MiwgY2hlY2sgbmV4dCByZXNwb25zZSIsCiAJCXJlbWFpbmluZyk7Ci0JaWYgKHRvdGFsX2RhdGFfc2l6ZSA+IG1heEJ1ZlNpemUpIHsKKwlpZiAodG90YWxfZGF0YV9zaXplID4gQ0lGU01heEJ1ZlNpemUpIHsKIAkJY0VSUk9SKDEsICJUb3RhbERhdGFTaXplICVkIGlzIG92ZXIgbWF4aW11bSBidWZmZXIgJWQiLAotCQkJdG90YWxfZGF0YV9zaXplLCBtYXhCdWZTaXplKTsKKwkJCXRvdGFsX2RhdGFfc2l6ZSwgQ0lGU01heEJ1ZlNpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIHJlbWFpbmluZzsKQEAgLTMyMCwyNyArMzIxLDI0IEBACiB9CiAKIHN0YXRpYyBib29sCi1hbGxvY2F0ZV9idWZmZXJzKGNoYXIgKipiaWdidWYsIGNoYXIgKipzbWFsbGJ1ZiwgdW5zaWduZWQgaW50IHNpemUsCi0JCSBib29sIGlzX2xhcmdlX2J1ZikKK2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQogewotCWNoYXIgKmJidWYgPSAqYmlnYnVmLCAqc2J1ZiA9ICpzbWFsbGJ1ZjsKLQotCWlmIChiYnVmID09IE5VTEwpIHsKLQkJYmJ1ZiA9IChjaGFyICopY2lmc19idWZfZ2V0KCk7Ci0JCWlmICghYmJ1ZikgeworCWlmICghc2VydmVyLT5iaWdidWYpIHsKKwkJc2VydmVyLT5iaWdidWYgPSAoY2hhciAqKWNpZnNfYnVmX2dldCgpOworCQlpZiAoIXNlcnZlci0+YmlnYnVmKSB7CiAJCQljRVJST1IoMSwgIk5vIG1lbW9yeSBmb3IgbGFyZ2UgU01CIHJlc3BvbnNlIik7CiAJCQltc2xlZXAoMzAwMCk7CiAJCQkvKiByZXRyeSB3aWxsIGNoZWNrIGlmIGV4aXRpbmcgKi8KIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCX0gZWxzZSBpZiAoaXNfbGFyZ2VfYnVmKSB7CisJfSBlbHNlIGlmIChzZXJ2ZXItPmxhcmdlX2J1ZikgewogCQkvKiB3ZSBhcmUgcmV1c2luZyBhIGRpcnR5IGxhcmdlIGJ1ZiwgY2xlYXIgaXRzIHN0YXJ0ICovCi0JCW1lbXNldChiYnVmLCAwLCBzaXplKTsKKwkJbWVtc2V0KHNlcnZlci0+YmlnYnVmLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpKTsKIAl9CiAKLQlpZiAoc2J1ZiA9PSBOVUxMKSB7Ci0JCXNidWYgPSAoY2hhciAqKWNpZnNfc21hbGxfYnVmX2dldCgpOwotCQlpZiAoIXNidWYpIHsKKwlpZiAoIXNlcnZlci0+c21hbGxidWYpIHsKKwkJc2VydmVyLT5zbWFsbGJ1ZiA9IChjaGFyICopY2lmc19zbWFsbF9idWZfZ2V0KCk7CisJCWlmICghc2VydmVyLT5zbWFsbGJ1ZikgewogCQkJY0VSUk9SKDEsICJObyBtZW1vcnkgZm9yIFNNQiByZXNwb25zZSIpOwogCQkJbXNsZWVwKDEwMDApOwogCQkJLyogcmV0cnkgd2lsbCBjaGVjayBpZiBleGl0aW5nICovCkBAIC0zNDksMzYgKzM0NywxMTYgQEAKIAkJLyogYmVnaW5uaW5nIG9mIHNtYiBidWZmZXIgaXMgY2xlYXJlZCBpbiBvdXIgYnVmX2dldCAqLwogCX0gZWxzZSB7CiAJCS8qIGlmIGV4aXN0aW5nIHNtYWxsIGJ1ZiBjbGVhciBiZWdpbm5pbmcgKi8KLQkJbWVtc2V0KHNidWYsIDAsIHNpemUpOworCQltZW1zZXQoc2VydmVyLT5zbWFsbGJ1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSk7CiAJfQogCi0JKmJpZ2J1ZiA9IGJidWY7Ci0JKnNtYWxsYnVmID0gc2J1ZjsKLQogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50Ci1yZWFkX2Zyb21fc29ja2V0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKLQkJIHN0cnVjdCBrdmVjICppb3YsIHVuc2lnbmVkIGludCB0b19yZWFkLAotCQkgdW5zaWduZWQgaW50ICpwdG90YWxfcmVhZCwgYm9vbCBpc19oZWFkZXJfcmVhZCkKK3N0YXRpYyBib29sCitzZXJ2ZXJfdW5yZXNwb25zaXZlKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcikKIHsKLQlpbnQgbGVuZ3RoLCByYyA9IDA7Ci0JdW5zaWduZWQgaW50IHRvdGFsX3JlYWQ7Ci0JY2hhciAqYnVmID0gaW92LT5pb3ZfYmFzZTsKKwlpZiAoZWNob19yZXRyaWVzID4gMCAmJiBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzR29vZCAmJgorCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHNlcnZlci0+bHN0cnAgKworCQkJCShlY2hvX3JldHJpZXMgKiBTTUJfRUNIT19JTlRFUlZBTCkpKSB7CisJCWNFUlJPUigxLCAiU2VydmVyICVzIGhhcyBub3QgcmVzcG9uZGVkIGluICVkIHNlY29uZHMuICIKKwkJCSAgIlJlY29ubmVjdGluZy4uLiIsIHNlcnZlci0+aG9zdG5hbWUsCisJCQkgIChlY2hvX3JldHJpZXMgKiBTTUJfRUNIT19JTlRFUlZBTCAvIEhaKSk7CisJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7CisJCXJldHVybiB0cnVlOworCX0KIAotCWZvciAodG90YWxfcmVhZCA9IDA7IHRvdGFsX3JlYWQgPCB0b19yZWFkOyB0b3RhbF9yZWFkICs9IGxlbmd0aCkgewotCQlsZW5ndGggPSBrZXJuZWxfcmVjdm1zZyhzZXJ2ZXItPnNzb2NrZXQsIHNtYl9tc2csIGlvdiwgMSwKLQkJCQkJdG9fcmVhZCAtIHRvdGFsX3JlYWQsIDApOworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIGt2ZWNfYXJyYXlfaW5pdCAtIGNsb25lIGEga3ZlYyBhcnJheSwgYW5kIGFkdmFuY2UgaW50byBpdAorICogQG5ldzoJcG9pbnRlciB0byBtZW1vcnkgZm9yIGNsb25lZCBhcnJheQorICogQGlvdjoJcG9pbnRlciB0byBvcmlnaW5hbCBhcnJheQorICogQG5yX3NlZ3M6CW51bWJlciBvZiBtZW1iZXJzIGluIG9yaWdpbmFsIGFycmF5CisgKiBAYnl0ZXM6CW51bWJlciBvZiBieXRlcyB0byBhZHZhbmNlIGludG8gdGhlIGNsb25lZCBhcnJheQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjb3B5IHRoZSBhcnJheSBwcm92aWRlZCBpbiBpb3YgdG8gYSBzZWN0aW9uIG9mIG1lbW9yeQorICogYW5kIGFkdmFuY2UgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgaW50byB0aGUgbmV3IGFycmF5LiBJdCByZXR1cm5zCisgKiB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoZSBuZXcgYXJyYXkuICJuZXciIG11c3QgYmUgYXQgbGVhc3QgYXMgYmlnIGFzCisgKiB0aGUgb3JpZ2luYWwgaW92IGFycmF5LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitrdmVjX2FycmF5X2luaXQoc3RydWN0IGt2ZWMgKm5ldywgc3RydWN0IGt2ZWMgKmlvdiwgdW5zaWduZWQgaW50IG5yX3NlZ3MsCisJCXNpemVfdCBieXRlcykKK3sKKwlzaXplX3QgYmFzZSA9IDA7CisKKwl3aGlsZSAoYnl0ZXMgfHwgIWlvdi0+aW92X2xlbikgeworCQlpbnQgY29weSA9IG1pbihieXRlcywgaW92LT5pb3ZfbGVuKTsKKworCQlieXRlcyAtPSBjb3B5OworCQliYXNlICs9IGNvcHk7CisJCWlmIChpb3YtPmlvdl9sZW4gPT0gYmFzZSkgeworCQkJaW92Kys7CisJCQlucl9zZWdzLS07CisJCQliYXNlID0gMDsKKwkJfQorCX0KKwltZW1jcHkobmV3LCBpb3YsIHNpemVvZigqaW92KSAqIG5yX3NlZ3MpOworCW5ldy0+aW92X2Jhc2UgKz0gYmFzZTsKKwluZXctPmlvdl9sZW4gLT0gYmFzZTsKKwlyZXR1cm4gbnJfc2VnczsKK30KKworc3RhdGljIHN0cnVjdCBrdmVjICoKK2dldF9zZXJ2ZXJfaW92ZWMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCB1bnNpZ25lZCBpbnQgbnJfc2VncykKK3sKKwlzdHJ1Y3Qga3ZlYyAqbmV3X2lvdjsKKworCWlmIChzZXJ2ZXItPmlvdiAmJiBucl9zZWdzIDw9IHNlcnZlci0+bnJfaW92KQorCQlyZXR1cm4gc2VydmVyLT5pb3Y7CisKKwkvKiBub3QgYmlnIGVub3VnaCAtLSBhbGxvY2F0ZSBhIG5ldyBvbmUgYW5kIHJlbGVhc2UgdGhlIG9sZCAqLworCW5ld19pb3YgPSBrbWFsbG9jKHNpemVvZigqbmV3X2lvdikgKiBucl9zZWdzLCBHRlBfTk9GUyk7CisJaWYgKG5ld19pb3YpIHsKKwkJa2ZyZWUoc2VydmVyLT5pb3YpOworCQlzZXJ2ZXItPmlvdiA9IG5ld19pb3Y7CisJCXNlcnZlci0+bnJfaW92ID0gbnJfc2VnczsKKwl9CisJcmV0dXJuIG5ld19pb3Y7Cit9CisKK2ludAorY2lmc19yZWFkdl9mcm9tX3NvY2tldChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBrdmVjICppb3Zfb3JpZywKKwkJICAgICAgIHVuc2lnbmVkIGludCBucl9zZWdzLCB1bnNpZ25lZCBpbnQgdG9fcmVhZCkKK3sKKwlpbnQgbGVuZ3RoID0gMDsKKwlpbnQgdG90YWxfcmVhZDsKKwl1bnNpZ25lZCBpbnQgc2VnczsKKwlzdHJ1Y3QgbXNnaGRyIHNtYl9tc2c7CisJc3RydWN0IGt2ZWMgKmlvdjsKKworCWlvdiA9IGdldF9zZXJ2ZXJfaW92ZWMoc2VydmVyLCBucl9zZWdzKTsKKwlpZiAoIWlvdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzbWJfbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwlzbWJfbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKworCWZvciAodG90YWxfcmVhZCA9IDA7IHRvX3JlYWQ7IHRvdGFsX3JlYWQgKz0gbGVuZ3RoLCB0b19yZWFkIC09IGxlbmd0aCkgeworCQlpZiAoc2VydmVyX3VucmVzcG9uc2l2ZShzZXJ2ZXIpKSB7CisJCQl0b3RhbF9yZWFkID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJc2VncyA9IGt2ZWNfYXJyYXlfaW5pdChpb3YsIGlvdl9vcmlnLCBucl9zZWdzLCB0b3RhbF9yZWFkKTsKKworCQlsZW5ndGggPSBrZXJuZWxfcmVjdm1zZyhzZXJ2ZXItPnNzb2NrZXQsICZzbWJfbXNnLAorCQkJCQlpb3YsIHNlZ3MsIHRvX3JlYWQsIDApOworCiAJCWlmIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzRXhpdGluZykgewotCQkJLyogdGhlbiB3aWxsIGV4aXQgKi8KLQkJCXJjID0gMjsKKwkJCXRvdGFsX3JlYWQgPSAtRVNIVVRET1dOOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKIAkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQkvKiBSZWNvbm5lY3Qgd2FrZXMgdXAgcnNwbnMgcSAqLwotCQkJLyogTm93IHdlIHdpbGwgcmVyZWFkIHNvY2sgKi8KLQkJCXJjID0gMTsKKwkJCXRvdGFsX3JlYWQgPSAtRUFHQUlOOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAobGVuZ3RoID09IC1FUkVTVEFSVFNZUyB8fAogCQkJICAgbGVuZ3RoID09IC1FQUdBSU4gfHwKQEAgLTM5MCw1NiArNDY4LDU0IEBACiAJCQkgKi8KIAkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAkJCWxlbmd0aCA9IDA7Ci0JCQlpZiAoIWlzX2hlYWRlcl9yZWFkKQotCQkJCWNvbnRpbnVlOwotCQkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaGVhZGVyIHJlYWQgKi8KLQkJCWlmICh0b3RhbF9yZWFkKSB7Ci0JCQkJaW92LT5pb3ZfYmFzZSA9ICh0b19yZWFkIC0gdG90YWxfcmVhZCkgKwotCQkJCQkJYnVmOwotCQkJCWlvdi0+aW92X2xlbiA9IHRvX3JlYWQgLSB0b3RhbF9yZWFkOwotCQkJCXNtYl9tc2ctPm1zZ19jb250cm9sID0gTlVMTDsKLQkJCQlzbWJfbXNnLT5tc2dfY29udHJvbGxlbiA9IDA7Ci0JCQkJcmMgPSAzOwotCQkJfSBlbHNlCi0JCQkJcmMgPSAxOwotCQkJYnJlYWs7CisJCQljb250aW51ZTsKIAkJfSBlbHNlIGlmIChsZW5ndGggPD0gMCkgewotCQkJY0VSUk9SKDEsICJSZWNlaXZlZCBubyBkYXRhLCBleHBlY3RpbmcgJWQiLAotCQkJICAgICAgIHRvX3JlYWQgLSB0b3RhbF9yZWFkKTsKKwkJCWNGWUkoMSwgIlJlY2VpdmVkIG5vIGRhdGEgb3IgZXJyb3I6IGV4cGVjdGluZyAlZCAiCisJCQkJImdvdCAlZCIsIHRvX3JlYWQsIGxlbmd0aCk7CiAJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOwotCQkJcmMgPSAxOworCQkJdG90YWxfcmVhZCA9IC1FQUdBSU47CiAJCQlicmVhazsKIAkJfQogCX0KKwlyZXR1cm4gdG90YWxfcmVhZDsKK30KIAotCSpwdG90YWxfcmVhZCA9IHRvdGFsX3JlYWQ7Ci0JcmV0dXJuIHJjOworaW50CitjaWZzX3JlYWRfZnJvbV9zb2NrZXQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBjaGFyICpidWYsCisJCSAgICAgIHVuc2lnbmVkIGludCB0b19yZWFkKQoreworCXN0cnVjdCBrdmVjIGlvdjsKKworCWlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKwlpb3YuaW92X2xlbiA9IHRvX3JlYWQ7CisKKwlyZXR1cm4gY2lmc19yZWFkdl9mcm9tX3NvY2tldChzZXJ2ZXIsICZpb3YsIDEsIHRvX3JlYWQpOwogfQogCiBzdGF0aWMgYm9vbAotY2hlY2tfcmZjMTAwMl9oZWFkZXIoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBjaGFyICpidWYpCitpc19zbWJfcmVzcG9uc2Uoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCB1bnNpZ25lZCBjaGFyIHR5cGUpCiB7Ci0JY2hhciB0ZW1wID0gKmJ1ZjsKLQl1bnNpZ25lZCBpbnQgcGR1X2xlbmd0aCA9IGJlMzJfdG9fY3B1KAotCQkJCSgoc3RydWN0IHNtYl9oZHIgKilidWYpLT5zbWJfYnVmX2xlbmd0aCk7Ci0KIAkvKgogCSAqIFRoZSBmaXJzdCBieXRlIGJpZyBlbmRpYW4gb2YgdGhlIGxlbmd0aCBmaWVsZCwKIAkgKiBpcyBhY3R1YWxseSBub3QgcGFydCBvZiB0aGUgbGVuZ3RoIGJ1dCB0aGUgdHlwZQogCSAqIHdpdGggdGhlIG1vc3QgY29tbW9uLCB6ZXJvLCBhcyByZWd1bGFyIGRhdGEuCiAJICovCi0JaWYgKHRlbXAgPT0gKGNoYXIpIFJGQzEwMDJfU0VTU0lPTl9LRUVQX0FMSVZFKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKHRlbXAgPT0gKGNoYXIpUkZDMTAwMl9QT1NJVElWRV9TRVNTSU9OX1JFU1BPTlNFKSB7Ci0JCWNGWUkoMSwgIkdvb2QgUkZDIDEwMDIgc2Vzc2lvbiByc3AiKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSBpZiAodGVtcCA9PSAoY2hhcilSRkMxMDAyX05FR0FUSVZFX1NFU1NJT05fUkVTUE9OU0UpIHsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJGQzEwMDJfU0VTU0lPTl9NRVNTQUdFOgorCQkvKiBSZWd1bGFyIFNNQiByZXNwb25zZSAqLworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFJGQzEwMDJfU0VTU0lPTl9LRUVQX0FMSVZFOgorCQljRllJKDEsICJSRkMgMTAwMiBzZXNzaW9uIGtlZXAgYWxpdmUiKTsKKwkJYnJlYWs7CisJY2FzZSBSRkMxMDAyX1BPU0lUSVZFX1NFU1NJT05fUkVTUE9OU0U6CisJCWNGWUkoMSwgIlJGQyAxMDAyIHBvc2l0aXZlIHNlc3Npb24gcmVzcG9uc2UiKTsKKwkJYnJlYWs7CisJY2FzZSBSRkMxMDAyX05FR0FUSVZFX1NFU1NJT05fUkVTUE9OU0U6CiAJCS8qCiAJCSAqIFdlIGdldCB0aGlzIGZyb20gV2luZG93cyA5OCBpbnN0ZWFkIG9mIGFuIGVycm9yIG9uCiAJCSAqIFNNQiBuZWdwcm90IHJlc3BvbnNlLgogCQkgKi8KLQkJY0ZZSSgxLCAiTmVnYXRpdmUgUkZDMTAwMiBTZXNzaW9uIFJlc3BvbnNlIEVycm9yIDB4JXgpIiwKLQkJCXBkdV9sZW5ndGgpOworCQljRllJKDEsICJSRkMgMTAwMiBuZWdhdGl2ZSBzZXNzaW9uIHJlc3BvbnNlIik7CiAJCS8qIGdpdmUgc2VydmVyIGEgc2Vjb25kIHRvIGNsZWFuIHVwICovCiAJCW1zbGVlcCgxMDAwKTsKIAkJLyoKQEAgLTQ0OCw4NyArNTI0LDg5IEBACiAJCSAqIGlzIHNpbmNlIHdlIGRvIG5vdCBiZWdpbiB3aXRoIFJGQzEwMDEgc2Vzc2lvbgogCQkgKiBpbml0aWFsaXplIGZyYW1lKS4KIAkJICovCi0JCWNpZnNfc2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKQotCQkJCSZzZXJ2ZXItPmRzdGFkZHIsIENJRlNfUE9SVCk7CisJCWNpZnNfc2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKSZzZXJ2ZXItPmRzdGFkZHIsIENJRlNfUE9SVCk7CiAJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CiAJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKHRlbXAgIT0gKGNoYXIpIDApIHsKLQkJY0VSUk9SKDEsICJVbmtub3duIFJGQyAxMDAyIGZyYW1lIik7Ci0JCWNpZnNfZHVtcF9tZW0oIiBSZWNlaXZlZCBEYXRhOiAiLCBidWYsIDQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljRVJST1IoMSwgIlJGQyAxMDAyIHVua25vd24gcmVzcG9uc2UgdHlwZSAweCV4IiwgdHlwZSk7CiAJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCXJldHVybiBmYWxzZTsKIAl9CiAKLQkvKiBlbHNlIHdlIGhhdmUgYW4gU01CIHJlc3BvbnNlICovCi0JaWYgKChwZHVfbGVuZ3RoID4gQ0lGU01heEJ1ZlNpemUgKyBNQVhfQ0lGU19IRFJfU0laRSAtIDQpIHx8Ci0JICAgIChwZHVfbGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDEgLSA0KSkgewotCQljRVJST1IoMSwgIkludmFsaWQgc2l6ZSBTTUIgbGVuZ3RoICVkIHBkdV9sZW5ndGggJWQiLAotCQkgICAgICAgNCwgcGR1X2xlbmd0aCs0KTsKLQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIHN0cnVjdCBtaWRfcV9lbnRyeSAqCi1maW5kX2NpZnNfbWlkKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9oZHIgKmJ1ZiwKLQkgICAgICBpbnQgKmxlbmd0aCwgYm9vbCBpc19sYXJnZV9idWYsIGJvb2wgKmlzX211bHRpX3JzcCwgY2hhciAqKmJpZ2J1ZikKK2ZpbmRfbWlkKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9oZHIgKmJ1ZikKIHsKLQlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZCA9IE5VTEwsICp0bXBfbWlkLCAqcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZDsKIAogCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtaWQsIHRtcF9taWQsICZzZXJ2ZXItPnBlbmRpbmdfbWlkX3EsIHFoZWFkKSB7Ci0JCWlmIChtaWQtPm1pZCAhPSBidWYtPk1pZCB8fAotCQkgICAgbWlkLT5taWRTdGF0ZSAhPSBNSURfUkVRVUVTVF9TVUJNSVRURUQgfHwKLQkJICAgIG1pZC0+Y29tbWFuZCAhPSBidWYtPkNvbW1hbmQpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKmxlbmd0aCA9PSAwICYmIGNoZWNrMm5kVDIoYnVmLCBzZXJ2ZXItPm1heEJ1ZikgPiAwKSB7Ci0JCQkvKiBXZSBoYXZlIGEgbXVsdGlwYXJ0IHRyYW5zYWN0MiByZXNwICovCi0JCQkqaXNfbXVsdGlfcnNwID0gdHJ1ZTsKLQkJCWlmIChtaWQtPnJlc3BfYnVmKSB7Ci0JCQkJLyogbWVyZ2UgcmVzcG9uc2UgLSBmaXggdXAgMXN0Ki8KLQkJCQkqbGVuZ3RoID0gY29hbGVzY2VfdDIoYnVmLCBtaWQtPnJlc3BfYnVmKTsKLQkJCQlpZiAoKmxlbmd0aCA+IDApIHsKLQkJCQkJKmxlbmd0aCA9IDA7Ci0JCQkJCW1pZC0+bXVsdGlSc3AgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogQWxsIHBhcnRzIHJlY2VpdmVkIG9yIHBhY2tldCBpcyBtYWxmb3JtZWQuICovCi0JCQkJbWlkLT5tdWx0aUVuZCA9IHRydWU7Ci0JCQkJZ290byBtdWx0aV90Ml9mbmQ7Ci0JCQl9Ci0JCQlpZiAoIWlzX2xhcmdlX2J1ZikgewotCQkJCS8qRklYTUU6IHN3aXRjaCB0byBhbHJlYWR5IGFsbG9jYXRlZCBsYXJnZWJ1Zj8qLwotCQkJCWNFUlJPUigxLCAiMXN0IHRyYW5zMiByZXNwIG5lZWRzIGJpZ2J1ZiIpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBIYXZlIGZpcnN0IGJ1ZmZlciAqLwotCQkJCW1pZC0+cmVzcF9idWYgPSBidWY7Ci0JCQkJbWlkLT5sYXJnZUJ1ZiA9IHRydWU7Ci0JCQkJKmJpZ2J1ZiA9IE5VTEw7Ci0JCQl9Ci0JCQlicmVhazsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1pZCwgJnNlcnZlci0+cGVuZGluZ19taWRfcSwgcWhlYWQpIHsKKwkJaWYgKG1pZC0+bWlkID09IGJ1Zi0+TWlkICYmCisJCSAgICBtaWQtPm1pZFN0YXRlID09IE1JRF9SRVFVRVNUX1NVQk1JVFRFRCAmJgorCQkgICAgbWlkLT5jb21tYW5kID09IGJ1Zi0+Q29tbWFuZCkgeworCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCXJldHVybiBtaWQ7CiAJCX0KLQkJbWlkLT5yZXNwX2J1ZiA9IGJ1ZjsKLQkJbWlkLT5sYXJnZUJ1ZiA9IGlzX2xhcmdlX2J1ZjsKLW11bHRpX3QyX2ZuZDoKLQkJaWYgKCpsZW5ndGggPT0gMCkKLQkJCW1pZC0+bWlkU3RhdGUgPSBNSURfUkVTUE9OU0VfUkVDRUlWRUQ7Ci0JCWVsc2UKLQkJCW1pZC0+bWlkU3RhdGUgPSBNSURfUkVTUE9OU0VfTUFMRk9STUVEOwotI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTMgotCQltaWQtPndoZW5fcmVjZWl2ZWQgPSBqaWZmaWVzOwotI2VuZGlmCi0JCWxpc3RfZGVsX2luaXQoJm1pZC0+cWhlYWQpOwotCQlyZXQgPSBtaWQ7Ci0JCWJyZWFrOwogCX0KIAlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCXJldHVybiBOVUxMOworfQogCi0JcmV0dXJuIHJldDsKK3ZvaWQKK2RlcXVldWVfbWlkKHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkLCBib29sIG1hbGZvcm1lZCkKK3sKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUzIKKwltaWQtPndoZW5fcmVjZWl2ZWQgPSBqaWZmaWVzOworI2VuZGlmCisJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJaWYgKCFtYWxmb3JtZWQpCisJCW1pZC0+bWlkU3RhdGUgPSBNSURfUkVTUE9OU0VfUkVDRUlWRUQ7CisJZWxzZQorCQltaWQtPm1pZFN0YXRlID0gTUlEX1JFU1BPTlNFX01BTEZPUk1FRDsKKwlsaXN0X2RlbF9pbml0KCZtaWQtPnFoZWFkKTsKKwlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX21pZChzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZCwgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAorCSAgIHN0cnVjdCBzbWJfaGRyICpidWYsIGludCBtYWxmb3JtZWQpCit7CisJaWYgKG1hbGZvcm1lZCA9PSAwICYmIGNoZWNrMm5kVDIoYnVmKSA+IDApIHsKKwkJbWlkLT5tdWx0aVJzcCA9IHRydWU7CisJCWlmIChtaWQtPnJlc3BfYnVmKSB7CisJCQkvKiBtZXJnZSByZXNwb25zZSAtIGZpeCB1cCAxc3QqLworCQkJbWFsZm9ybWVkID0gY29hbGVzY2VfdDIoYnVmLCBtaWQtPnJlc3BfYnVmKTsKKwkJCWlmIChtYWxmb3JtZWQgPiAwKQorCQkJCXJldHVybjsKKworCQkJLyogQWxsIHBhcnRzIHJlY2VpdmVkIG9yIHBhY2tldCBpcyBtYWxmb3JtZWQuICovCisJCQltaWQtPm11bHRpRW5kID0gdHJ1ZTsKKwkJCXJldHVybiBkZXF1ZXVlX21pZChtaWQsIG1hbGZvcm1lZCk7CisJCX0KKwkJaWYgKCFzZXJ2ZXItPmxhcmdlX2J1ZikgeworCQkJLypGSVhNRTogc3dpdGNoIHRvIGFscmVhZHkgYWxsb2NhdGVkIGxhcmdlYnVmPyovCisJCQljRVJST1IoMSwgIjFzdCB0cmFuczIgcmVzcCBuZWVkcyBiaWdidWYiKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEhhdmUgZmlyc3QgYnVmZmVyICovCisJCQltaWQtPnJlc3BfYnVmID0gYnVmOworCQkJbWlkLT5sYXJnZUJ1ZiA9IHRydWU7CisJCQlzZXJ2ZXItPmJpZ2J1ZiA9IE5VTEw7CisJCX0KKwkJcmV0dXJuOworCX0KKwltaWQtPnJlc3BfYnVmID0gYnVmOworCW1pZC0+bGFyZ2VCdWYgPSBzZXJ2ZXItPmxhcmdlX2J1ZjsKKwkvKiBXYXMgcHJldmlvdXMgYnVmIHB1dCBpbiBtcHggc3RydWN0IGZvciBtdWx0aS1yc3A/ICovCisJaWYgKCFtaWQtPm11bHRpUnNwKSB7CisJCS8qIHNtYiBidWZmZXIgd2lsbCBiZSBmcmVlZCBieSB1c2VyIHRocmVhZCAqLworCQlpZiAoc2VydmVyLT5sYXJnZV9idWYpCisJCQlzZXJ2ZXItPmJpZ2J1ZiA9IE5VTEw7CisJCWVsc2UKKwkJCXNlcnZlci0+c21hbGxidWYgPSBOVUxMOworCX0KKwlkZXF1ZXVlX21pZChtaWQsIG1hbGZvcm1lZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFuX2RlbXVsdGlwbGV4X2luZm8oc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQpAQCAtNjE4LDYgKzY5Niw3IEBACiAJfQogCiAJa2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7CisJa2ZyZWUoc2VydmVyLT5pb3YpOwogCWtmcmVlKHNlcnZlcik7CiAKIAlsZW5ndGggPSBhdG9taWNfZGVjX3JldHVybigmdGNwU2VzQWxsb2NDb3VudCk7CkBAIC02MjcsMjAgKzcwNiw3MCBAQAogfQogCiBzdGF0aWMgaW50CitzdGFuZGFyZF9yZWNlaXZlMyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkKQoreworCWludCBsZW5ndGg7CisJY2hhciAqYnVmID0gc2VydmVyLT5zbWFsbGJ1ZjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlciA9IChzdHJ1Y3Qgc21iX2hkciAqKWJ1ZjsKKwl1bnNpZ25lZCBpbnQgcGR1X2xlbmd0aCA9IGJlMzJfdG9fY3B1KHNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoKTsKKworCS8qIG1ha2Ugc3VyZSB0aGlzIHdpbGwgZml0IGluIGEgbGFyZ2UgYnVmZmVyICovCisJaWYgKHBkdV9sZW5ndGggPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkgeworCQljRVJST1IoMSwgIlNNQiByZXNwb25zZSB0b28gbG9uZyAoJXUgYnl0ZXMpIiwKKwkJCXBkdV9sZW5ndGgpOworCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBzd2l0Y2ggdG8gbGFyZ2UgYnVmZmVyIGlmIHRvbyBiaWcgZm9yIGEgc21hbGwgb25lICovCisJaWYgKHBkdV9sZW5ndGggPiBNQVhfQ0lGU19TTUFMTF9CVUZGRVJfU0laRSAtIDQpIHsKKwkJc2VydmVyLT5sYXJnZV9idWYgPSB0cnVlOworCQltZW1jcHkoc2VydmVyLT5iaWdidWYsIHNlcnZlci0+c21hbGxidWYsIHNlcnZlci0+dG90YWxfcmVhZCk7CisJCWJ1ZiA9IHNlcnZlci0+YmlnYnVmOworCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopYnVmOworCX0KKworCS8qIG5vdyByZWFkIHRoZSByZXN0ICovCisJbGVuZ3RoID0gY2lmc19yZWFkX2Zyb21fc29ja2V0KHNlcnZlciwKKwkJCSAgYnVmICsgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDEsCisJCQkgIHBkdV9sZW5ndGggLSBzaXplb2Yoc3RydWN0IHNtYl9oZHIpICsgMSArIDQpOworCWlmIChsZW5ndGggPCAwKQorCQlyZXR1cm4gbGVuZ3RoOworCXNlcnZlci0+dG90YWxfcmVhZCArPSBsZW5ndGg7CisKKwlkdW1wX3NtYihzbWJfYnVmZmVyLCBzZXJ2ZXItPnRvdGFsX3JlYWQpOworCisJLyoKKwkgKiBXZSBrbm93IHRoYXQgd2UgcmVjZWl2ZWQgZW5vdWdoIHRvIGdldCB0byB0aGUgTUlEIGFzIHdlCisJICogY2hlY2tlZCB0aGUgcGR1X2xlbmd0aCBlYXJsaWVyLiBOb3cgY2hlY2sgdG8gc2VlCisJICogaWYgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciBpcyBPSy4gV2UgYm9ycm93IHRoZSBsZW5ndGgKKwkgKiB2YXIgZm9yIHRoZSByZXN0IG9mIHRoZSBsb29wIHRvIGF2b2lkIGEgbmV3IHN0YWNrIHZhci4KKwkgKgorCSAqIDQ4IGJ5dGVzIGlzIGVub3VnaCB0byBkaXNwbGF5IHRoZSBoZWFkZXIgYW5kIGEgbGl0dGxlIGJpdAorCSAqIGludG8gdGhlIHBheWxvYWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKwkgKi8KKwlsZW5ndGggPSBjaGVja1NNQihzbWJfYnVmZmVyLCBzbWJfYnVmZmVyLT5NaWQsIHNlcnZlci0+dG90YWxfcmVhZCk7CisJaWYgKGxlbmd0aCAhPSAwKQorCQljaWZzX2R1bXBfbWVtKCJCYWQgU01COiAiLCBidWYsCisJCQltaW5fdCh1bnNpZ25lZCBpbnQsIHNlcnZlci0+dG90YWxfcmVhZCwgNDgpKTsKKworCWlmIChtaWQpCisJCWhhbmRsZV9taWQobWlkLCBzZXJ2ZXIsIHNtYl9idWZmZXIsIGxlbmd0aCk7CisKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgaW50CiBjaWZzX2RlbXVsdGlwbGV4X3RocmVhZCh2b2lkICpwKQogewogCWludCBsZW5ndGg7CiAJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyID0gcDsKLQl1bnNpZ25lZCBpbnQgcGR1X2xlbmd0aCwgdG90YWxfcmVhZDsKLQljaGFyICpidWYgPSBOVUxMLCAqYmlnYnVmID0gTlVMTCwgKnNtYWxsYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgcGR1X2xlbmd0aDsKKwljaGFyICpidWYgPSBOVUxMOwogCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyID0gTlVMTDsKLQlzdHJ1Y3QgbXNnaGRyIHNtYl9tc2c7Ci0Jc3RydWN0IGt2ZWMgaW92OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFza190b193YWtlID0gTlVMTDsKIAlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZF9lbnRyeTsKLQlib29sIGlzTGFyZ2VCdWYgPSBmYWxzZTsKLQlib29sIGlzTXVsdGlSc3AgPSBmYWxzZTsKLQlpbnQgcmM7CiAKIAljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQzsKIAljRllJKDEsICJEZW11bHRpcGxleCBQSUQ6ICVkIiwgdGFza19waWRfbnIoY3VycmVudCkpOwpAQCAtNjU1LDExMSArNzg0LDY1IEBACiAJCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCQljb250aW51ZTsKIAotCQlpZiAoIWFsbG9jYXRlX2J1ZmZlcnMoJmJpZ2J1ZiwgJnNtYWxsYnVmLAotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc21iX2hkciksIGlzTGFyZ2VCdWYpKQorCQlpZiAoIWFsbG9jYXRlX2J1ZmZlcnMoc2VydmVyKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlzTGFyZ2VCdWYgPSBmYWxzZTsKLQkJaXNNdWx0aVJzcCA9IGZhbHNlOwotCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopc21hbGxidWY7Ci0JCWJ1ZiA9IHNtYWxsYnVmOwotCQlpb3YuaW92X2Jhc2UgPSBidWY7Ci0JCWlvdi5pb3ZfbGVuID0gNDsKLQkJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7Ci0JCXNtYl9tc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCQlzZXJ2ZXItPmxhcmdlX2J1ZiA9IGZhbHNlOworCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopc2VydmVyLT5zbWFsbGJ1ZjsKKwkJYnVmID0gc2VydmVyLT5zbWFsbGJ1ZjsKIAkJcGR1X2xlbmd0aCA9IDQ7IC8qIGVub3VnaCB0byBnZXQgUkZDMTAwMSBoZWFkZXIgKi8KIAotaW5jb21wbGV0ZV9yY3Y6Ci0JCWlmIChlY2hvX3JldHJpZXMgPiAwICYmIHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNHb29kICYmCi0JCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHNlcnZlci0+bHN0cnAgKwotCQkJCQkoZWNob19yZXRyaWVzICogU01CX0VDSE9fSU5URVJWQUwpKSkgewotCQkJY0VSUk9SKDEsICJTZXJ2ZXIgJXMgaGFzIG5vdCByZXNwb25kZWQgaW4gJWQgc2Vjb25kcy4gIgotCQkJCSAgIlJlY29ubmVjdGluZy4uLiIsIHNlcnZlci0+aG9zdG5hbWUsCi0JCQkJICAoZWNob19yZXRyaWVzICogU01CX0VDSE9fSU5URVJWQUwgLyBIWikpOwotCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7CisJCWxlbmd0aCA9IGNpZnNfcmVhZF9mcm9tX3NvY2tldChzZXJ2ZXIsIGJ1ZiwgcGR1X2xlbmd0aCk7CisJCWlmIChsZW5ndGggPCAwKQogCQkJY29udGludWU7Ci0JCX0KLQotCQlyYyA9IHJlYWRfZnJvbV9zb2NrZXQoc2VydmVyLCAmc21iX21zZywgJmlvdiwgcGR1X2xlbmd0aCwKLQkJCQkgICAgICAmdG90YWxfcmVhZCwgdHJ1ZSAvKiBoZWFkZXIgcmVhZCAqLyk7Ci0JCWlmIChyYyA9PSAzKQotCQkJZ290byBpbmNvbXBsZXRlX3JjdjsKLQkJZWxzZSBpZiAocmMgPT0gMikKLQkJCWJyZWFrOwotCQllbHNlIGlmIChyYyA9PSAxKQotCQkJY29udGludWU7CisJCXNlcnZlci0+dG90YWxfcmVhZCA9IGxlbmd0aDsKIAogCQkvKgogCQkgKiBUaGUgcmlnaHQgYW1vdW50IHdhcyByZWFkIGZyb20gc29ja2V0IC0gNCBieXRlcywKIAkJICogc28gd2UgY2FuIG5vdyBpbnRlcnByZXQgdGhlIGxlbmd0aCBmaWVsZC4KIAkJICovCi0KLQkJLyoKLQkJICogTm90ZSB0aGF0IFJGQyAxMDAxIGxlbmd0aCBpcyBiaWcgZW5kaWFuIG9uIHRoZSB3aXJlLAotCQkgKiBidXQgd2UgY29udmVydCBpdCBoZXJlIHNvIGl0IGlzIGFsd2F5cyBtYW5pcHVsYXRlZAotCQkgKiBhcyBob3N0IGJ5dGUgb3JkZXIuCi0JCSAqLwogCQlwZHVfbGVuZ3RoID0gYmUzMl90b19jcHUoc21iX2J1ZmZlci0+c21iX2J1Zl9sZW5ndGgpOwogCi0JCWNGWUkoMSwgInJmYzEwMDIgbGVuZ3RoIDB4JXgiLCBwZHVfbGVuZ3RoKzQpOwotCQlpZiAoIWNoZWNrX3JmYzEwMDJfaGVhZGVyKHNlcnZlciwgYnVmKSkKKwkJY0ZZSSgxLCAiUkZDMTAwMiBoZWFkZXIgMHgleCIsIHBkdV9sZW5ndGgpOworCQlpZiAoIWlzX3NtYl9yZXNwb25zZShzZXJ2ZXIsIGJ1ZlswXSkpCiAJCQljb250aW51ZTsKIAotCQkvKiBlbHNlIGxlbmd0aCBvayAqLwotCQlpZiAocGR1X2xlbmd0aCA+IE1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFIC0gNCkgewotCQkJaXNMYXJnZUJ1ZiA9IHRydWU7Ci0JCQltZW1jcHkoYmlnYnVmLCBzbWFsbGJ1ZiwgNCk7Ci0JCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopYmlnYnVmOwotCQkJYnVmID0gYmlnYnVmOworCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggdG8gZ2V0IHRvIHRoZSBNSUQgKi8KKwkJaWYgKHBkdV9sZW5ndGggPCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpIC0gMSAtIDQpIHsKKwkJCWNFUlJPUigxLCAiU01CIHJlc3BvbnNlIHRvbyBzaG9ydCAoJXUgYnl0ZXMpIiwKKwkJCQlwZHVfbGVuZ3RoKTsKKwkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQkJY29udGludWU7CiAJCX0KIAotCQlpb3YuaW92X2Jhc2UgPSA0ICsgYnVmOwotCQlpb3YuaW92X2xlbiA9IHBkdV9sZW5ndGg7Ci0JCXJjID0gcmVhZF9mcm9tX3NvY2tldChzZXJ2ZXIsICZzbWJfbXNnLCAmaW92LCBwZHVfbGVuZ3RoLAotCQkJCSAgICAgICZ0b3RhbF9yZWFkLCBmYWxzZSk7Ci0JCWlmIChyYyA9PSAyKQotCQkJYnJlYWs7Ci0JCWVsc2UgaWYgKHJjID09IDEpCisJCS8qIHJlYWQgZG93biB0byB0aGUgTUlEICovCisJCWxlbmd0aCA9IGNpZnNfcmVhZF9mcm9tX3NvY2tldChzZXJ2ZXIsIGJ1ZiArIDQsCisJCQkJCXNpemVvZihzdHJ1Y3Qgc21iX2hkcikgLSAxIC0gNCk7CisJCWlmIChsZW5ndGggPCAwKQorCQkJY29udGludWU7CisJCXNlcnZlci0+dG90YWxfcmVhZCArPSBsZW5ndGg7CisKKwkJbWlkX2VudHJ5ID0gZmluZF9taWQoc2VydmVyLCBzbWJfYnVmZmVyKTsKKworCQlpZiAoIW1pZF9lbnRyeSB8fCAhbWlkX2VudHJ5LT5yZWNlaXZlKQorCQkJbGVuZ3RoID0gc3RhbmRhcmRfcmVjZWl2ZTMoc2VydmVyLCBtaWRfZW50cnkpOworCQllbHNlCisJCQlsZW5ndGggPSBtaWRfZW50cnktPnJlY2VpdmUoc2VydmVyLCBtaWRfZW50cnkpOworCisJCWlmIChsZW5ndGggPCAwKQogCQkJY29udGludWU7CiAKLQkJdG90YWxfcmVhZCArPSA0OyAvKiBhY2NvdW50IGZvciByZmMxMDAyIGhkciAqLwotCi0JCWR1bXBfc21iKHNtYl9idWZmZXIsIHRvdGFsX3JlYWQpOwotCi0JCS8qCi0JCSAqIFdlIGtub3cgdGhhdCB3ZSByZWNlaXZlZCBlbm91Z2ggdG8gZ2V0IHRvIHRoZSBNSUQgYXMgd2UKLQkJICogY2hlY2tlZCB0aGUgcGR1X2xlbmd0aCBlYXJsaWVyLiBOb3cgY2hlY2sgdG8gc2VlCi0JCSAqIGlmIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgaXMgT0suIFdlIGJvcnJvdyB0aGUgbGVuZ3RoCi0JCSAqIHZhciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxvb3AgdG8gYXZvaWQgYSBuZXcgc3RhY2sgdmFyLgotCQkgKgotCQkgKiA0OCBieXRlcyBpcyBlbm91Z2ggdG8gZGlzcGxheSB0aGUgaGVhZGVyIGFuZCBhIGxpdHRsZSBiaXQKLQkJICogaW50byB0aGUgcGF5bG9hZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotCQkgKi8KLQkJbGVuZ3RoID0gY2hlY2tTTUIoc21iX2J1ZmZlciwgc21iX2J1ZmZlci0+TWlkLCB0b3RhbF9yZWFkKTsKLQkJaWYgKGxlbmd0aCAhPSAwKQotCQkJY2lmc19kdW1wX21lbSgiQmFkIFNNQjogIiwgYnVmLAotCQkJCSAgICAgIG1pbl90KHVuc2lnbmVkIGludCwgdG90YWxfcmVhZCwgNDgpKTsKKwkJaWYgKHNlcnZlci0+bGFyZ2VfYnVmKSB7CisJCQlidWYgPSBzZXJ2ZXItPmJpZ2J1ZjsKKwkJCXNtYl9idWZmZXIgPSAoc3RydWN0IHNtYl9oZHIgKilidWY7CisJCX0KIAogCQlzZXJ2ZXItPmxzdHJwID0gamlmZmllczsKLQotCQltaWRfZW50cnkgPSBmaW5kX2NpZnNfbWlkKHNlcnZlciwgc21iX2J1ZmZlciwgJmxlbmd0aCwKLQkJCQkJICBpc0xhcmdlQnVmLCAmaXNNdWx0aVJzcCwgJmJpZ2J1Zik7CiAJCWlmIChtaWRfZW50cnkgIT0gTlVMTCkgewotCQkJbWlkX2VudHJ5LT5jYWxsYmFjayhtaWRfZW50cnkpOwotCQkJLyogV2FzIHByZXZpb3VzIGJ1ZiBwdXQgaW4gbXB4IHN0cnVjdCBmb3IgbXVsdGktcnNwPyAqLwotCQkJaWYgKCFpc011bHRpUnNwKSB7Ci0JCQkJLyogc21iIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGJ5IHVzZXIgdGhyZWFkICovCi0JCQkJaWYgKGlzTGFyZ2VCdWYpCi0JCQkJCWJpZ2J1ZiA9IE5VTEw7Ci0JCQkJZWxzZQotCQkJCQlzbWFsbGJ1ZiA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobGVuZ3RoICE9IDApIHsKLQkJCS8qIHJlc3BvbnNlIHNhbml0eSBjaGVja3MgZmFpbGVkICovCi0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICghaXNfdmFsaWRfb3Bsb2NrX2JyZWFrKHNtYl9idWZmZXIsIHNlcnZlcikgJiYKLQkJCSAgICFpc011bHRpUnNwKSB7CisJCQlpZiAoIW1pZF9lbnRyeS0+bXVsdGlSc3AgfHwgbWlkX2VudHJ5LT5tdWx0aUVuZCkKKwkJCQltaWRfZW50cnktPmNhbGxiYWNrKG1pZF9lbnRyeSk7CisJCX0gZWxzZSBpZiAoIWlzX3ZhbGlkX29wbG9ja19icmVhayhzbWJfYnVmZmVyLCBzZXJ2ZXIpKSB7CiAJCQljRVJST1IoMSwgIk5vIHRhc2sgdG8gd2FrZSwgdW5rbm93biBmcmFtZSByZWNlaXZlZCEgIgogCQkJCSAgICJOdW1NaWRzICVkIiwgYXRvbWljX3JlYWQoJm1pZENvdW50KSk7CiAJCQljaWZzX2R1bXBfbWVtKCJSZWNlaXZlZCBEYXRhIGlzOiAiLCBidWYsCkBAIC03NzMsOSArODU2LDkgQEAKIAl9IC8qIGVuZCB3aGlsZSAhRVhJVElORyAqLwogCiAJLyogYnVmZmVyIHVzdWFsbHkgZnJlZWQgaW4gZnJlZV9taWQgLSBuZWVkIHRvIGZyZWUgaXQgaGVyZSBvbiBleGl0ICovCi0JY2lmc19idWZfcmVsZWFzZShiaWdidWYpOwotCWlmIChzbWFsbGJ1ZikgLyogbm8gc2Vuc2UgbG9nZ2luZyBhIGRlYnVnIG1lc3NhZ2UgaWYgTlVMTCAqLwotCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYWxsYnVmKTsKKwljaWZzX2J1Zl9yZWxlYXNlKHNlcnZlci0+YmlnYnVmKTsKKwlpZiAoc2VydmVyLT5zbWFsbGJ1ZikgLyogbm8gc2Vuc2UgbG9nZ2luZyBhIGRlYnVnIG1lc3NhZ2UgaWYgTlVMTCAqLworCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNlcnZlci0+c21hbGxidWYpOwogCiAJdGFza190b193YWtlID0geGNoZygmc2VydmVyLT50c2ssIE5VTEwpOwogCWNsZWFuX2RlbXVsdGlwbGV4X2luZm8oc2VydmVyKTsKQEAgLTgyNyw2ICs5MTAsNyBAQAogewogCWNoYXIgKnZhbHVlLCAqZGF0YSwgKmVuZDsKIAljaGFyICptb3VudGRhdGFfY29weSA9IE5VTEwsICpvcHRpb25zOworCWludCBlcnI7CiAJdW5zaWduZWQgaW50ICB0ZW1wX2xlbiwgaSwgajsKIAljaGFyIHNlcGFyYXRvclsyXTsKIAlzaG9ydCBpbnQgb3ZlcnJpZGVfdWlkID0gLTE7CkBAIC04ODMsNiArOTY3LDggQEAKIAkJCWNGWUkoMSwgIk51bGwgc2VwYXJhdG9yIG5vdCBhbGxvd2VkIik7CiAJCX0KIAl9CisJdm9sLT5iYWNrdXB1aWRfc3BlY2lmaWVkID0gZmFsc2U7IC8qIG5vIGJhY2t1cCBpbnRlbnQgZm9yIGEgdXNlciAqLworCXZvbC0+YmFja3VwZ2lkX3NwZWNpZmllZCA9IGZhbHNlOyAvKiBubyBiYWNrdXAgaW50ZW50IGZvciBhIGdyb3VwICovCiAKIAl3aGlsZSAoKGRhdGEgPSBzdHJzZXAoJm9wdGlvbnMsIHNlcGFyYXRvcikpICE9IE5VTEwpIHsKIAkJaWYgKCEqZGF0YSkKQEAgLTE0NDIsNiArMTUyOCwyMiBAQAogCQkJdm9sLT5tZnN5bWxpbmtzID0gdHJ1ZTsKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibXVsdGl1c2VyIiwgOCkgPT0gMCkgewogCQkJdm9sLT5tdWx0aXVzZXIgPSB0cnVlOworCQl9IGVsc2UgaWYgKCFzdHJuaWNtcChkYXRhLCAiYmFja3VwdWlkIiwgOSkgJiYgdmFsdWUgJiYgKnZhbHVlKSB7CisJCQllcnIgPSBrc3RydG91aW50KHZhbHVlLCAwLCAmdm9sLT5iYWNrdXB1aWQpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQljRVJST1IoMSwgIiVzOiBJbnZhbGlkIGJhY2t1cHVpZCB2YWx1ZSIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlnb3RvIGNpZnNfcGFyc2VfbW91bnRfZXJyOworCQkJfQorCQkJdm9sLT5iYWNrdXB1aWRfc3BlY2lmaWVkID0gdHJ1ZTsKKwkJfSBlbHNlIGlmICghc3RybmljbXAoZGF0YSwgImJhY2t1cGdpZCIsIDkpICYmIHZhbHVlICYmICp2YWx1ZSkgeworCQkJZXJyID0ga3N0cnRvdWludCh2YWx1ZSwgMCwgJnZvbC0+YmFja3VwZ2lkKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJY0VSUk9SKDEsICIlczogSW52YWxpZCBiYWNrdXBnaWQgdmFsdWUiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJZ290byBjaWZzX3BhcnNlX21vdW50X2VycjsKKwkJCX0KKwkJCXZvbC0+YmFja3VwZ2lkX3NwZWNpZmllZCA9IHRydWU7CiAJCX0gZWxzZQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogVW5rbm93biBtb3VudCBvcHRpb24gJXNcbiIsCiAJCQkJCQlkYXRhKTsKQEAgLTIyMDksMTYgKzIzMTEsMTYgQEAKIAkgICAgKG5ldy0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01BU0spKQogCQlyZXR1cm4gMDsKIAotCWlmIChvbGQtPnJzaXplICE9IG5ldy0+cnNpemUpCi0JCXJldHVybiAwOwotCiAJLyoKLQkgKiBXZSB3YW50IHRvIHNoYXJlIHNiIG9ubHkgaWYgd2UgZG9uJ3Qgc3BlY2lmeSB3c2l6ZSBvciBzcGVjaWZpZWQgd3NpemUKLQkgKiBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gZXhpc3Rpbmcgb25lLgorCSAqIFdlIHdhbnQgdG8gc2hhcmUgc2Igb25seSBpZiB3ZSBkb24ndCBzcGVjaWZ5IGFuIHIvd3NpemUgb3IKKwkgKiBzcGVjaWZpZWQgci93c2l6ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZXhpc3Rpbmcgb25lLgogCSAqLwogCWlmIChuZXctPndzaXplICYmIG5ldy0+d3NpemUgPCBvbGQtPndzaXplKQogCQlyZXR1cm4gMDsKIAorCWlmIChuZXctPnJzaXplICYmIG5ldy0+cnNpemUgPCBvbGQtPnJzaXplKQorCQlyZXR1cm4gMDsKKwogCWlmIChvbGQtPm1udF91aWQgIT0gbmV3LT5tbnRfdWlkIHx8IG9sZC0+bW50X2dpZCAhPSBuZXctPm1udF9naWQpCiAJCXJldHVybiAwOwogCkBAIC0yNjU2LDE0ICsyNzU4LDYgQEAKIAkJCQkJQ0lGU19NT1VOVF9QT1NJWF9QQVRIUzsKIAkJfQogCi0JCWlmIChjaWZzX3NiICYmIChjaWZzX3NiLT5yc2l6ZSA+IDEyNyAqIDEwMjQpKSB7Ci0JCQlpZiAoKGNhcCAmIENJRlNfVU5JWF9MQVJHRV9SRUFEX0NBUCkgPT0gMCkgewotCQkJCWNpZnNfc2ItPnJzaXplID0gMTI3ICogMTAyNDsKLQkJCQljRllJKERCRzIsICJsYXJnZXIgcmVhZHMgbm90IHN1cHBvcnRlZCBieSBzcnYiKTsKLQkJCX0KLQkJfQotCi0KIAkJY0ZZSSgxLCAiTmVnb3RpYXRlIGNhcHMgMHgleCIsIChpbnQpY2FwKTsKICNpZmRlZiBDT05GSUdfQ0lGU19ERUJVRzIKIAkJaWYgKGNhcCAmIENJRlNfVU5JWF9GQ05UTF9DQVApCkBAIC0yNzA4LDMxICsyODAyLDE5IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNpZnNfc2ItPnRsaW5rX3RyZWVfbG9jayk7CiAJY2lmc19zYi0+dGxpbmtfdHJlZSA9IFJCX1JPT1Q7CiAKLQlpZiAocHZvbHVtZV9pbmZvLT5yc2l6ZSA+IENJRlNNYXhCdWZTaXplKSB7Ci0JCWNFUlJPUigxLCAicnNpemUgJWQgdG9vIGxhcmdlLCB1c2luZyBNYXhCdWZTaXplIiwKLQkJCXB2b2x1bWVfaW5mby0+cnNpemUpOwotCQljaWZzX3NiLT5yc2l6ZSA9IENJRlNNYXhCdWZTaXplOwotCX0gZWxzZSBpZiAoKHB2b2x1bWVfaW5mby0+cnNpemUpICYmCi0JCQkocHZvbHVtZV9pbmZvLT5yc2l6ZSA8PSBDSUZTTWF4QnVmU2l6ZSkpCi0JCWNpZnNfc2ItPnJzaXplID0gcHZvbHVtZV9pbmZvLT5yc2l6ZTsKLQllbHNlIC8qIGRlZmF1bHQgKi8KLQkJY2lmc19zYi0+cnNpemUgPSBDSUZTTWF4QnVmU2l6ZTsKLQotCWlmIChjaWZzX3NiLT5yc2l6ZSA8IDIwNDgpIHsKLQkJY2lmc19zYi0+cnNpemUgPSAyMDQ4OwotCQkvKiBXaW5kb3dzIE1FIG1heSBwcmVmZXIgdGhpcyAqLwotCQljRllJKDEsICJyZWFkc2l6ZSBzZXQgdG8gbWluaW11bTogMjA0OCIpOwotCX0KLQogCS8qCi0JICogVGVtcG9yYXJpbHkgc2V0IHdzaXplIGZvciBtYXRjaGluZyBzdXBlcmJsb2NrLiBJZiB3ZSBlbmQgdXAgdXNpbmcKLQkgKiBuZXcgc2IgdGhlbiBjaWZzX25lZ290aWF0ZV93c2l6ZSB3aWxsIGxhdGVyIG5lZ290aWF0ZSBpdCBkb3dud2FyZAotCSAqIGlmIG5lZWRlZC4KKwkgKiBUZW1wb3JhcmlseSBzZXQgci93c2l6ZSBmb3IgbWF0Y2hpbmcgc3VwZXJibG9jay4gSWYgd2UgZW5kIHVwIHVzaW5nCisJICogbmV3IHNiIHRoZW4gY2xpZW50IHdpbGwgbGF0ZXIgbmVnb3RpYXRlIGl0IGRvd253YXJkIGlmIG5lZWRlZC4KIAkgKi8KKwljaWZzX3NiLT5yc2l6ZSA9IHB2b2x1bWVfaW5mby0+cnNpemU7CiAJY2lmc19zYi0+d3NpemUgPSBwdm9sdW1lX2luZm8tPndzaXplOwogCiAJY2lmc19zYi0+bW50X3VpZCA9IHB2b2x1bWVfaW5mby0+bGludXhfdWlkOwogCWNpZnNfc2ItPm1udF9naWQgPSBwdm9sdW1lX2luZm8tPmxpbnV4X2dpZDsKKwlpZiAocHZvbHVtZV9pbmZvLT5iYWNrdXB1aWRfc3BlY2lmaWVkKQorCQljaWZzX3NiLT5tbnRfYmFja3VwdWlkID0gcHZvbHVtZV9pbmZvLT5iYWNrdXB1aWQ7CisJaWYgKHB2b2x1bWVfaW5mby0+YmFja3VwZ2lkX3NwZWNpZmllZCkKKwkJY2lmc19zYi0+bW50X2JhY2t1cGdpZCA9IHB2b2x1bWVfaW5mby0+YmFja3VwZ2lkOwogCWNpZnNfc2ItPm1udF9maWxlX21vZGUgPSBwdm9sdW1lX2luZm8tPmZpbGVfbW9kZTsKIAljaWZzX3NiLT5tbnRfZGlyX21vZGUgPSBwdm9sdW1lX2luZm8tPmRpcl9tb2RlOwogCWNGWUkoMSwgImZpbGUgbW9kZTogMHgleCAgZGlyIG1vZGU6IDB4JXgiLApAQCAtMjc2Myw2ICsyODQ1LDEwIEBACiAJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfUldQSURGT1JXQVJEOwogCWlmIChwdm9sdW1lX2luZm8tPmNpZnNfYWNsKQogCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyB8PSBDSUZTX01PVU5UX0NJRlNfQUNMOworCWlmIChwdm9sdW1lX2luZm8tPmJhY2t1cHVpZF9zcGVjaWZpZWQpCisJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfQ0lGU19CQUNLVVBVSUQ7CisJaWYgKHB2b2x1bWVfaW5mby0+YmFja3VwZ2lkX3NwZWNpZmllZCkKKwkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0gQ0lGU19NT1VOVF9DSUZTX0JBQ0tVUEdJRDsKIAlpZiAocHZvbHVtZV9pbmZvLT5vdmVycmlkZV91aWQpCiAJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfT1ZFUlJfVUlEOwogCWlmIChwdm9sdW1lX2luZm8tPm92ZXJyaWRlX2dpZCkKQEAgLTI3OTUsMjkgKzI4ODEsNDEgQEAKIH0KIAogLyoKLSAqIFdoZW4gdGhlIHNlcnZlciBzdXBwb3J0cyB2ZXJ5IGxhcmdlIHdyaXRlcyB2aWEgUE9TSVggZXh0ZW5zaW9ucywgd2UgY2FuCi0gKiBhbGxvdyB1cCB0byAyXjI0LTEsIG1pbnVzIHRoZSBzaXplIG9mIGEgV1JJVEVfQU5EX1ggaGVhZGVyLCBub3QgaW5jbHVkaW5nCi0gKiB0aGUgUkZDMTAwMSBsZW5ndGguCisgKiBXaGVuIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdmVyeSBsYXJnZSByZWFkcyBhbmQgd3JpdGVzIHZpYSBQT1NJWCBleHRlbnNpb25zLAorICogd2UgY2FuIGFsbG93IHVwIHRvIDJeMjQtMSwgbWludXMgdGhlIHNpemUgb2YgYSBSRUFEL1dSSVRFX0FORF9YIGhlYWRlciwgbm90CisgKiBpbmNsdWRpbmcgdGhlIFJGQzEwMDEgbGVuZ3RoLgogICoKICAqIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IG1ha2UgZm9yICJpbnRlcmVzdGluZyIgYWxsb2NhdGlvbiBwcm9ibGVtcyBkdXJpbmcKICAqIHdyaXRlYmFjayBob3dldmVyIGFzIHdlIGhhdmUgdG8gYWxsb2NhdGUgYW4gYXJyYXkgb2YgcG9pbnRlcnMgZm9yIHRoZQogICogcGFnZXMuIEEgMTZNIHdyaXRlIG1lYW5zIH4zMmtiIHBhZ2UgYXJyYXkgd2l0aCBQQUdFX0NBQ0hFX1NJWkUgPT0gNDA5Ni4KKyAqCisgKiBGb3IgcmVhZHMsIHRoZXJlIGlzIGEgc2ltaWxhciBwcm9ibGVtIGFzIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gYXJyYXkKKyAqIG9mIGt2ZWNzIHRvIGhhbmRsZSB0aGUgcmVjZWl2ZSwgdGhvdWdoIHRoYXQgc2hvdWxkIG9ubHkgbmVlZCB0byBiZSBkb25lCisgKiBvbmNlLgogICovCiAjZGVmaW5lIENJRlNfTUFYX1dTSVpFICgoMTw8MjQpIC0gMSAtIHNpemVvZihXUklURV9SRVEpICsgNCkKKyNkZWZpbmUgQ0lGU19NQVhfUlNJWkUgKCgxPDwyNCkgLSBzaXplb2YoUkVBRF9SU1ApICsgNCkKIAogLyoKLSAqIFdoZW4gdGhlIHNlcnZlciBkb2Vzbid0IGFsbG93IGxhcmdlIHBvc2l4IHdyaXRlcywgb25seSBhbGxvdyBhIHdzaXplIG9mCi0gKiAxMjhrIG1pbnVzIHRoZSBzaXplIG9mIHRoZSBXUklURV9BTkRfWCBoZWFkZXIuIFRoYXQgYWxsb3dzIGZvciBhIHdyaXRlIHVwCi0gKiB0byB0aGUgbWF4aW11bSBzaXplIGRlc2NyaWJlZCBieSBSRkMxMDAyLgorICogV2hlbiB0aGUgc2VydmVyIGRvZXNuJ3QgYWxsb3cgbGFyZ2UgcG9zaXggd3JpdGVzLCBvbmx5IGFsbG93IGEgcnNpemUvd3NpemUKKyAqIG9mIDJeMTctMSBtaW51cyB0aGUgc2l6ZSBvZiB0aGUgY2FsbCBoZWFkZXIuIFRoYXQgYWxsb3dzIGZvciBhIHJlYWQgb3IKKyAqIHdyaXRlIHVwIHRvIHRoZSBtYXhpbXVtIHNpemUgZGVzY3JpYmVkIGJ5IFJGQzEwMDIuCiAgKi8KLSNkZWZpbmUgQ0lGU19NQVhfUkZDMTAwMl9XU0laRSAoMTI4ICogMTAyNCAtIHNpemVvZihXUklURV9SRVEpICsgNCkKKyNkZWZpbmUgQ0lGU19NQVhfUkZDMTAwMl9XU0laRSAoKDE8PDE3KSAtIDEgLSBzaXplb2YoV1JJVEVfUkVRKSArIDQpCisjZGVmaW5lIENJRlNfTUFYX1JGQzEwMDJfUlNJWkUgKCgxPDwxNykgLSAxIC0gc2l6ZW9mKFJFQURfUlNQKSArIDQpCiAKIC8qCiAgKiBUaGUgZGVmYXVsdCB3c2l6ZSBpcyAxTS4gZmluZF9nZXRfcGFnZXMgc2VlbXMgdG8gcmV0dXJuIGEgbWF4aW11bSBvZiAyNTYKICAqIHBhZ2VzIGluIGEgc2luZ2xlIGNhbGwuIFdpdGggUEFHRV9DQUNIRV9TSVpFID09IDRrLCB0aGlzIG1lYW5zIHdlIGNhbiBmaWxsCiAgKiBhIHNpbmdsZSB3c2l6ZSByZXF1ZXN0IHdpdGggYSBzaW5nbGUgY2FsbC4KICAqLwotI2RlZmluZSBDSUZTX0RFRkFVTFRfV1NJWkUgKDEwMjQgKiAxMDI0KQorI2RlZmluZSBDSUZTX0RFRkFVTFRfSU9TSVpFICgxMDI0ICogMTAyNCkKKworLyoKKyAqIFdpbmRvd3Mgb25seSBzdXBwb3J0cyBhIG1heCBvZiA2MGsgcmVhZHMuIERlZmF1bHQgdG8gdGhhdCB3aGVuIHBvc2l4CisgKiBleHRlbnNpb25zIGFyZW4ndCBpbiBmb3JjZS4KKyAqLworI2RlZmluZSBDSUZTX0RFRkFVTFRfTk9OX1BPU0lYX1JTSVpFICg2MCAqIDEwMjQpCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGNpZnNfbmVnb3RpYXRlX3dzaXplKHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sIHN0cnVjdCBzbWJfdm9sICpwdm9sdW1lX2luZm8pCkBAIC0yODI1LDcgKzI5MjMsNyBAQAogCV9fdTY0IHVuaXhfY2FwID0gbGU2NF90b19jcHUodGNvbi0+ZnNVbml4SW5mby5DYXBhYmlsaXR5KTsKIAlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSB0Y29uLT5zZXMtPnNlcnZlcjsKIAl1bnNpZ25lZCBpbnQgd3NpemUgPSBwdm9sdW1lX2luZm8tPndzaXplID8gcHZvbHVtZV9pbmZvLT53c2l6ZSA6Ci0JCQkJQ0lGU19ERUZBVUxUX1dTSVpFOworCQkJCUNJRlNfREVGQVVMVF9JT1NJWkU7CiAKIAkvKiBjYW4gc2VydmVyIHN1cHBvcnQgMjQtYml0IHdyaXRlIHNpemVzPyAodmlhIFVOSVggZXh0ZW5zaW9ucykgKi8KIAlpZiAoIXRjb24tPnVuaXhfZXh0IHx8ICEodW5peF9jYXAgJiBDSUZTX1VOSVhfTEFSR0VfV1JJVEVfQ0FQKSkKQEAgLTI4NDgsNiArMjk0Niw1MCBAQAogCXJldHVybiB3c2l6ZTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludAorY2lmc19uZWdvdGlhdGVfcnNpemUoc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwgc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbykKK3sKKwlfX3U2NCB1bml4X2NhcCA9IGxlNjRfdG9fY3B1KHRjb24tPmZzVW5peEluZm8uQ2FwYWJpbGl0eSk7CisJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyID0gdGNvbi0+c2VzLT5zZXJ2ZXI7CisJdW5zaWduZWQgaW50IHJzaXplLCBkZWZzaXplOworCisJLyoKKwkgKiBTZXQgZGVmYXVsdCB2YWx1ZS4uLgorCSAqCisJICogSEFDSyBhbGVydCEgQW5jaWVudCBzZXJ2ZXJzIGhhdmUgdmVyeSBzbWFsbCBidWZmZXJzLiBFdmVuIHRob3VnaAorCSAqIE1TLUNJRlMgaW5kaWNhdGVzIHRoYXQgc2VydmVycyBhcmUgb25seSBsaW1pdGVkIGJ5IHRoZSBjbGllbnQncworCSAqIGJ1ZnNpemUgZm9yIHJlYWRzLCB0ZXN0aW5nIGFnYWluc3Qgd2luOThzZSBzaG93cyB0aGF0IGl0IHRocm93cworCSAqIElOVkFMSURfUEFSQU1FVEVSIGVycm9ycyBpZiB5b3UgdHJ5IHRvIHJlcXVlc3QgdG9vIGxhcmdlIGEgcmVhZC4KKwkgKgorCSAqIElmIHRoZSBzZXJ2ZXIgYWR2ZXJ0aXNlcyBhIE1heEJ1ZmZlclNpemUgb2YgbGVzcyB0aGFuIG9uZSBwYWdlLAorCSAqIGFzc3VtZSB0aGF0IGl0IGFsc28gY2FuJ3Qgc2F0aXNmeSByZWFkcyBsYXJnZXIgdGhhbiB0aGF0IGVpdGhlci4KKwkgKgorCSAqIEZJWE1FOiBJcyB0aGVyZSBhIGJldHRlciBoZXVyaXN0aWMgZm9yIHRoaXM/CisJICovCisJaWYgKHRjb24tPnVuaXhfZXh0ICYmICh1bml4X2NhcCAmIENJRlNfVU5JWF9MQVJHRV9SRUFEX0NBUCkpCisJCWRlZnNpemUgPSBDSUZTX0RFRkFVTFRfSU9TSVpFOworCWVsc2UgaWYgKHNlcnZlci0+Y2FwYWJpbGl0aWVzICYgQ0FQX0xBUkdFX1JFQURfWCkKKwkJZGVmc2l6ZSA9IENJRlNfREVGQVVMVF9OT05fUE9TSVhfUlNJWkU7CisJZWxzZSBpZiAoc2VydmVyLT5tYXhCdWYgPj0gUEFHRV9DQUNIRV9TSVpFKQorCQlkZWZzaXplID0gQ0lGU01heEJ1ZlNpemU7CisJZWxzZQorCQlkZWZzaXplID0gc2VydmVyLT5tYXhCdWYgLSBzaXplb2YoUkVBRF9SU1ApOworCisJcnNpemUgPSBwdm9sdW1lX2luZm8tPnJzaXplID8gcHZvbHVtZV9pbmZvLT5yc2l6ZSA6IGRlZnNpemU7CisKKwkvKgorCSAqIG5vIENBUF9MQVJHRV9SRUFEX1g/IFRoZW4gTVMtQ0lGUyBzdGF0ZXMgdGhhdCB3ZSBtdXN0IGxpbWl0IHRoaXMgdG8KKwkgKiB0aGUgY2xpZW50J3MgTWF4QnVmZmVyU2l6ZS4KKwkgKi8KKwlpZiAoIShzZXJ2ZXItPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9SRUFEX1gpKQorCQlyc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgQ0lGU01heEJ1ZlNpemUsIHJzaXplKTsKKworCS8qIGhhcmQgbGltaXQgb2YgQ0lGU19NQVhfUlNJWkUgKi8KKwlyc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgcnNpemUsIENJRlNfTUFYX1JTSVpFKTsKKworCXJldHVybiByc2l6ZTsKK30KKwogc3RhdGljIGludAogaXNfcGF0aF9hY2Nlc3NpYmxlKGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCiAJCSAgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsIGNvbnN0IGNoYXIgKmZ1bGxfcGF0aCkKQEAgLTMwNDEsNiArMzE4MywyMiBAQAogCXJldHVybiB2b2x1bWVfaW5mbzsKIH0KIAorLyogbWFrZSBzdXJlIHJhX3BhZ2VzIGlzIGEgbXVsdGlwbGUgb2YgcnNpemUgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitjaWZzX3JhX3BhZ2VzKHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCit7CisJdW5zaWduZWQgaW50IHJlYWRzOworCXVuc2lnbmVkIGludCByc2l6ZV9wYWdlcyA9IGNpZnNfc2ItPnJzaXplIC8gUEFHRV9DQUNIRV9TSVpFOworCisJaWYgKHJzaXplX3BhZ2VzID49IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlcykKKwkJcmV0dXJuIGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlczsKKwllbHNlIGlmIChyc2l6ZV9wYWdlcyA9PSAwKQorCQlyZXR1cm4gcnNpemVfcGFnZXM7CisKKwlyZWFkcyA9IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyAvIHJzaXplX3BhZ2VzOworCXJldHVybiByZWFkcyAqIHJzaXplX3BhZ2VzOworfQorCiBpbnQKIGNpZnNfbW91bnQoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvKQogewpAQCAtMzA1OSw4ICszMjE3LDYgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCWNpZnNfc2ItPmJkaS5yYV9wYWdlcyA9IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlczsKLQogI2lmZGVmIENPTkZJR19DSUZTX0RGU19VUENBTEwKIHRyeV9tb3VudF9hZ2FpbjoKIAkvKiBjbGVhbnVwIGFjdGl2aXRpZXMgaWYgd2UncmUgY2hhc2luZyBhIHJlZmVycmFsICovCkBAIC0zMTI1LDE1ICszMjgxLDExIEBACiAJCUNJRlNTTUJRRlNBdHRyaWJ1dGVJbmZvKHhpZCwgdGNvbik7CiAJfQogCi0JaWYgKCh0Y29uLT51bml4X2V4dCA9PSAwKSAmJiAoY2lmc19zYi0+cnNpemUgPiAoMTAyNCAqIDEyNykpKSB7Ci0JCWNpZnNfc2ItPnJzaXplID0gMTAyNCAqIDEyNzsKLQkJY0ZZSShEQkcyLCAibm8gdmVyeSBsYXJnZSByZWFkIHN1cHBvcnQsIHJzaXplIG5vdyAxMjdLIik7Ci0JfQotCWlmICghKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0xBUkdFX1JFQURfWCkpCi0JCWNpZnNfc2ItPnJzaXplID0gbWluKGNpZnNfc2ItPnJzaXplLAotCQkJICAgICAgICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpKTsKLQogCWNpZnNfc2ItPndzaXplID0gY2lmc19uZWdvdGlhdGVfd3NpemUodGNvbiwgdm9sdW1lX2luZm8pOworCWNpZnNfc2ItPnJzaXplID0gY2lmc19uZWdvdGlhdGVfcnNpemUodGNvbiwgdm9sdW1lX2luZm8pOworCisJLyogdHVuZSByZWFkYWhlYWQgYWNjb3JkaW5nIHRvIHJzaXplICovCisJY2lmc19zYi0+YmRpLnJhX3BhZ2VzID0gY2lmc19yYV9wYWdlcyhjaWZzX3NiKTsKIAogcmVtb3RlX3BhdGhfY2hlY2s6CiAjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTApAQCAtMzMwMSw3ICszNDUzLDcgQEAKIAkJZWxzZQogI2VuZGlmIC8qIENJRlNfV0VBS19QV19IQVNIICovCiAJCXJjID0gU01CTlRlbmNyeXB0KHRjb24tPnBhc3N3b3JkLCBzZXMtPnNlcnZlci0+Y3J5cHRrZXksCi0JCQkJCWJjY19wdHIpOworCQkJCQliY2NfcHRyLCBubHNfY29kZXBhZ2UpOwogCiAJCWJjY19wdHIgKz0gQ0lGU19BVVRIX1JFU1BfU0laRTsKIAkJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZGlyLmMgYi9mcy9jaWZzL2Rpci5jCmluZGV4IDcyZDQ0OGIuLmQ3ZWViOWQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZGlyLmMKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJfQogCXRjb24gPSB0bGlua190Y29uKHRsaW5rKTsKIAotCWlmIChvcGxvY2tFbmFibGVkKQorCWlmIChlbmFibGVfb3Bsb2NrcykKIAkJb3Bsb2NrID0gUkVRX09QTE9DSzsKIAogCWlmIChuZCkKQEAgLTI0NCw2ICsyNDQsOSBAQAogCWlmICghdGNvbi0+dW5peF9leHQgJiYgKG1vZGUgJiBTX0lXVUdPKSA9PSAwKQogCQljcmVhdGVfb3B0aW9ucyB8PSBDUkVBVEVfT1BUSU9OX1JFQURPTkxZOwogCisJaWYgKGJhY2t1cF9jcmVkKGNpZnNfc2IpKQorCQljcmVhdGVfb3B0aW9ucyB8PSBDUkVBVEVfT1BFTl9CQUNLVVBfSU5URU5UOworCiAJaWYgKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX05UX1NNQlMpCiAJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCB0Y29uLCBmdWxsX3BhdGgsIGRpc3Bvc2l0aW9uLAogCQkJIGRlc2lyZWRBY2Nlc3MsIGNyZWF0ZV9vcHRpb25zLApAQCAtMzU3LDYgKzM2MCw3IEBACiB7CiAJaW50IHJjID0gLUVQRVJNOwogCWludCB4aWQ7CisJaW50IGNyZWF0ZV9vcHRpb25zID0gQ1JFQVRFX05PVF9ESVIgfCBDUkVBVEVfT1BUSU9OX1NQRUNJQUw7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKIAlzdHJ1Y3QgdGNvbl9saW5rICp0bGluazsKIAlzdHJ1Y3QgY2lmc190Y29uICpwVGNvbjsKQEAgLTQzMSw5ICs0MzUsMTEgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCS8qIEZJWE1FOiB3b3VsZCBXUklURV9PV05FUiB8IFdSSVRFX0RBQyBiZSBiZXR0ZXI/ICovCisJaWYgKGJhY2t1cF9jcmVkKGNpZnNfc2IpKQorCQljcmVhdGVfb3B0aW9ucyB8PSBDUkVBVEVfT1BFTl9CQUNLVVBfSU5URU5UOworCiAJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIEZJTEVfQ1JFQVRFLAotCQkJIEdFTkVSSUNfV1JJVEUsIENSRUFURV9OT1RfRElSIHwgQ1JFQVRFX09QVElPTl9TUEVDSUFMLAorCQkJIEdFTkVSSUNfV1JJVEUsIGNyZWF0ZV9vcHRpb25zLAogCQkJICZmaWxlSGFuZGxlLCAmb3Bsb2NrLCBidWYsIGNpZnNfc2ItPmxvY2FsX25scywKIAkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAlpZiAocmMpCkBAIC02NDIsOCArNjQ4LDE2IEBACiAJaWYgKGRpcmVudHJ5LT5kX2lub2RlKSB7CiAJCWlmIChjaWZzX3JldmFsaWRhdGVfZGVudHJ5KGRpcmVudHJ5KSkKIAkJCXJldHVybiAwOwotCQllbHNlCisJCWVsc2UgeworCQkJLyoKKwkJCSAqIEZvcmNpYmx5IGludmFsaWRhdGUgYXV0b21vdW50aW5nIGRpcmVjdG9yeSBpbm9kZXMKKwkJCSAqIChyZW1vdGUgREZTIGRpcmVjdG9yaWVzKSBzbyB0byBoYXZlIHRoZW0KKwkJCSAqIGluc3RhbnRpYXRlZCBhZ2FpbiBmb3IgYXV0b21vdW50CisJCQkgKi8KKwkJCWlmIChJU19BVVRPTU9VTlQoZGlyZW50cnktPmRfaW5vZGUpKQorCQkJCXJldHVybiAwOwogCQkJcmV0dXJuIDE7CisJCX0KIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9leHBvcnQuYyBiL2ZzL2NpZnMvZXhwb3J0LmMKaW5kZXggNTVkODdhYy4uOWM3ZWNkYyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9leHBvcnQuYworKysgYi9mcy9jaWZzL2V4cG9ydC5jCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgogI2luY2x1ZGUgImNpZnNmcy5oIgogCi0jaWZkZWYgQ0lGU19ORlNEX0VYUE9SVAorI2lmZGVmIENPTkZJR19DSUZTX05GU0RfRVhQT1JUCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqY2lmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAkvKiBCQiBuZWVkIHRvIGFkZCBjb2RlIGhlcmUgZXZlbnR1YWxseSB0byBlbmFibGUgZXhwb3J0IHZpYSBORlNEICovCkBAIC02Myw1ICs2Myw1IEBACiAJLmVuY29kZV9mcyA9ICAqLwogfTsKIAotI2VuZGlmIC8qIENJRlNfTkZTRF9FWFBPUlQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19ORlNEX0VYUE9SVCAqLwogCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IDlmNDFhMTAuLmNmMGIxNTMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSAiY2lmc2ZzLmgiCiAjaW5jbHVkZSAiY2lmc3BkdS5oIgpAQCAtMTc0LDYgKzE3NSw3IEBACiAJaW50IHJjOwogCWludCBkZXNpcmVkQWNjZXNzOwogCWludCBkaXNwb3NpdGlvbjsKKwlpbnQgY3JlYXRlX29wdGlvbnMgPSBDUkVBVEVfTk9UX0RJUjsKIAlGSUxFX0FMTF9JTkZPICpidWY7CiAKIAlkZXNpcmVkQWNjZXNzID0gY2lmc19jb252ZXJ0X2ZsYWdzKGZfZmxhZ3MpOwpAQCAtMjEwLDkgKzIxMiwxMiBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWlmIChiYWNrdXBfY3JlZChjaWZzX3NiKSkKKwkJY3JlYXRlX29wdGlvbnMgfD0gQ1JFQVRFX09QRU5fQkFDS1VQX0lOVEVOVDsKKwogCWlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9OVF9TTUJTKQogCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBkaXNwb3NpdGlvbiwKLQkJCSBkZXNpcmVkQWNjZXNzLCBDUkVBVEVfTk9UX0RJUiwgcG5ldGZpZCwgcG9wbG9jaywgYnVmLAorCQkJIGRlc2lyZWRBY2Nlc3MsIGNyZWF0ZV9vcHRpb25zLCBwbmV0ZmlkLCBwb3Bsb2NrLCBidWYsCiAJCQkgY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncwogCQkJCSAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAllbHNlCkBAIC0yNTgsOCArMjYzLDYgQEAKIAlwQ2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPSBmYWxzZTsKIAlwQ2lmc0ZpbGUtPnRsaW5rID0gY2lmc19nZXRfdGxpbmsodGxpbmspOwogCW11dGV4X2luaXQoJnBDaWZzRmlsZS0+ZmhfbXV0ZXgpOwotCW11dGV4X2luaXQoJnBDaWZzRmlsZS0+bG9ja19tdXRleCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBDaWZzRmlsZS0+bGxpc3QpOwogCUlOSVRfV09SSygmcENpZnNGaWxlLT5vcGxvY2tfYnJlYWssIGNpZnNfb3Bsb2NrX2JyZWFrKTsKIAogCXNwaW5fbG9jaygmY2lmc19maWxlX2xpc3RfbG9jayk7CkBAIC0yNzIsMTEgKzI3NSwxNCBAQAogCXNwaW5fdW5sb2NrKCZjaWZzX2ZpbGVfbGlzdF9sb2NrKTsKIAogCWNpZnNfc2V0X29wbG9ja19sZXZlbChwQ2lmc0lub2RlLCBvcGxvY2spOworCXBDaWZzSW5vZGUtPmNhbl9jYWNoZV9icmxja3MgPSBwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbDsKIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBDaWZzRmlsZTsKIAlyZXR1cm4gcENpZnNGaWxlOwogfQogCitzdGF0aWMgdm9pZCBjaWZzX2RlbF9sb2NrX3dhaXRlcnMoc3RydWN0IGNpZnNMb2NrSW5mbyAqbG9jayk7CisKIC8qCiAgKiBSZWxlYXNlIGEgcmVmZXJlbmNlIG9uIHRoZSBmaWxlIHByaXZhdGUgZGF0YS4gVGhpcyBtYXkgaW52b2x2ZSBjbG9zaW5nCiAgKiB0aGUgZmlsZWhhbmRsZSBvdXQgb24gdGhlIHNlcnZlci4gTXVzdCBiZSBjYWxsZWQgd2l0aG91dCBob2xkaW5nCkBAIC0zMjcsMTIgKzMzMywxNSBAQAogCS8qIERlbGV0ZSBhbnkgb3V0c3RhbmRpbmcgbG9jayByZWNvcmRzLiBXZSdsbCBsb3NlIHRoZW0gd2hlbiB0aGUgZmlsZQogCSAqIGlzIGNsb3NlZCBhbnl3YXkuCiAJICovCi0JbXV0ZXhfbG9jaygmY2lmc19maWxlLT5sb2NrX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmNpZnNfZmlsZS0+bGxpc3QsIGxsaXN0KSB7CisJbXV0ZXhfbG9jaygmY2lmc2ktPmxvY2tfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaSwgdG1wLCAmY2lmc2ktPmxsaXN0LCBsbGlzdCkgeworCQlpZiAobGktPm5ldGZpZCAhPSBjaWZzX2ZpbGUtPm5ldGZpZCkKKwkJCWNvbnRpbnVlOwogCQlsaXN0X2RlbCgmbGktPmxsaXN0KTsKKwkJY2lmc19kZWxfbG9ja193YWl0ZXJzKGxpKTsKIAkJa2ZyZWUobGkpOwogCX0KLQltdXRleF91bmxvY2soJmNpZnNfZmlsZS0+bG9ja19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjaWZzaS0+bG9ja19tdXRleCk7CiAKIAljaWZzX3B1dF90bGluayhjaWZzX2ZpbGUtPnRsaW5rKTsKIAlkcHV0KGNpZnNfZmlsZS0+ZGVudHJ5KTsKQEAgLTM3MSw3ICszODAsNyBAQAogCWNGWUkoMSwgImlub2RlID0gMHglcCBmaWxlIGZsYWdzIGFyZSAweCV4IGZvciAlcyIsCiAJCSBpbm9kZSwgZmlsZS0+Zl9mbGFncywgZnVsbF9wYXRoKTsKIAotCWlmIChvcGxvY2tFbmFibGVkKQorCWlmIChlbmFibGVfb3Bsb2NrcykKIAkJb3Bsb2NrID0gUkVRX09QTE9DSzsKIAllbHNlCiAJCW9wbG9jayA9IDA7CkBAIC00NjUsNiArNDc0LDcgQEAKIAljaGFyICpmdWxsX3BhdGggPSBOVUxMOwogCWludCBkZXNpcmVkQWNjZXNzOwogCWludCBkaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKKwlpbnQgY3JlYXRlX29wdGlvbnMgPSBDUkVBVEVfTk9UX0RJUjsKIAlfX3UxNiBuZXRmaWQ7CiAKIAl4aWQgPSBHZXRYaWQoKTsKQEAgLTQ5NSw3ICs1MDUsNyBAQAogCWNGWUkoMSwgImlub2RlID0gMHglcCBmaWxlIGZsYWdzIDB4JXggZm9yICVzIiwKIAkJIGlub2RlLCBwQ2lmc0ZpbGUtPmZfZmxhZ3MsIGZ1bGxfcGF0aCk7CiAKLQlpZiAob3Bsb2NrRW5hYmxlZCkKKwlpZiAoZW5hYmxlX29wbG9ja3MpCiAJCW9wbG9jayA9IFJFUV9PUExPQ0s7CiAJZWxzZQogCQlvcGxvY2sgPSAwOwpAQCAtNTI0LDYgKzUzNCw5IEBACiAKIAlkZXNpcmVkQWNjZXNzID0gY2lmc19jb252ZXJ0X2ZsYWdzKHBDaWZzRmlsZS0+Zl9mbGFncyk7CiAKKwlpZiAoYmFja3VwX2NyZWQoY2lmc19zYikpCisJCWNyZWF0ZV9vcHRpb25zIHw9IENSRUFURV9PUEVOX0JBQ0tVUF9JTlRFTlQ7CisKIAkvKiBDYW4gbm90IHJlZnJlc2ggaW5vZGUgYnkgcGFzc2luZyBpbiBmaWxlX2luZm8gYnVmIHRvIGJlIHJldHVybmVkCiAJICAgYnkgU01CT3BlbiBhbmQgdGhlbiBjYWxsaW5nIGdldF9pbm9kZV9pbmZvIHdpdGggcmV0dXJuZWQgYnVmCiAJICAgc2luY2UgZmlsZSBtaWdodCBoYXZlIHdyaXRlIGJlaGluZCBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZmx1c2hlZApAQCAtNTMxLDcgKzU0NCw3IEBACiAJICAgdGhhdCBpbm9kZSB3YXMgbm90IGRpcnR5IGxvY2FsbHkgd2UgY291bGQgZG8gdGhpcyAqLwogCiAJcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIGZ1bGxfcGF0aCwgZGlzcG9zaXRpb24sIGRlc2lyZWRBY2Nlc3MsCi0JCQkgQ1JFQVRFX05PVF9ESVIsICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsCisJCQkgY3JlYXRlX29wdGlvbnMsICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsCiAJCQkgY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwogCWlmIChyYykgewpAQCAtNjMxLDIxOSArNjQ0LDY4NyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBzdG9yZV9maWxlX2xvY2soc3RydWN0IGNpZnNGaWxlSW5mbyAqZmlkLCBfX3U2NCBsZW4sCi0JCQkJX191NjQgb2Zmc2V0LCBfX3U4IGxvY2tUeXBlKQorc3RhdGljIHN0cnVjdCBjaWZzTG9ja0luZm8gKgorY2lmc19sb2NrX2luaXQoX191NjQgb2Zmc2V0LCBfX3U2NCBsZW5ndGgsIF9fdTggdHlwZSwgX191MTYgbmV0ZmlkKQogewotCXN0cnVjdCBjaWZzTG9ja0luZm8gKmxpID0KKwlzdHJ1Y3QgY2lmc0xvY2tJbmZvICpsb2NrID0KIAkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGNpZnNMb2NrSW5mbyksIEdGUF9LRVJORUwpOwotCWlmIChsaSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlsaS0+b2Zmc2V0ID0gb2Zmc2V0OwotCWxpLT5sZW5ndGggPSBsZW47Ci0JbGktPnR5cGUgPSBsb2NrVHlwZTsKLQltdXRleF9sb2NrKCZmaWQtPmxvY2tfbXV0ZXgpOwotCWxpc3RfYWRkKCZsaS0+bGxpc3QsICZmaWQtPmxsaXN0KTsKLQltdXRleF91bmxvY2soJmZpZC0+bG9ja19tdXRleCk7Ci0JcmV0dXJuIDA7CisJaWYgKCFsb2NrKQorCQlyZXR1cm4gbG9jazsKKwlsb2NrLT5vZmZzZXQgPSBvZmZzZXQ7CisJbG9jay0+bGVuZ3RoID0gbGVuZ3RoOworCWxvY2stPnR5cGUgPSB0eXBlOworCWxvY2stPm5ldGZpZCA9IG5ldGZpZDsKKwlsb2NrLT5waWQgPSBjdXJyZW50LT50Z2lkOworCUlOSVRfTElTVF9IRUFEKCZsb2NrLT5ibGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbG9jay0+YmxvY2tfcSk7CisJcmV0dXJuIGxvY2s7CiB9CiAKLWludCBjaWZzX2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKnBmTG9jaykKK3N0YXRpYyB2b2lkCitjaWZzX2RlbF9sb2NrX3dhaXRlcnMoc3RydWN0IGNpZnNMb2NrSW5mbyAqbG9jaykKIHsKLQlpbnQgcmMsIHhpZDsKLQlfX3UzMiBudW1Mb2NrID0gMDsKLQlfX3UzMiBudW1VbmxvY2sgPSAwOwotCV9fdTY0IGxlbmd0aDsKLQlib29sIHdhaXRfZmxhZyA9IGZhbHNlOwotCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7Ci0Jc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKLQlfX3UxNiBuZXRmaWQ7Ci0JX191OCBsb2NrVHlwZSA9IExPQ0tJTkdfQU5EWF9MQVJHRV9GSUxFUzsKLQlib29sIHBvc2l4X2xvY2tpbmcgPSAwOwotCi0JbGVuZ3RoID0gMSArIHBmTG9jay0+ZmxfZW5kIC0gcGZMb2NrLT5mbF9zdGFydDsKLQlyYyA9IC1FQUNDRVM7Ci0JeGlkID0gR2V0WGlkKCk7Ci0KLQljRllJKDEsICJMb2NrIHBhcm06IDB4JXggZmxvY2tmbGFnczogIgotCQkgIjB4JXggZmxvY2t0eXBlOiAweCV4IHN0YXJ0OiAlbGxkIGVuZDogJWxsZCIsCi0JCWNtZCwgcGZMb2NrLT5mbF9mbGFncywgcGZMb2NrLT5mbF90eXBlLCBwZkxvY2stPmZsX3N0YXJ0LAotCQlwZkxvY2stPmZsX2VuZCk7Ci0KLQlpZiAocGZMb2NrLT5mbF9mbGFncyAmIEZMX1BPU0lYKQotCQljRllJKDEsICJQb3NpeCIpOwotCWlmIChwZkxvY2stPmZsX2ZsYWdzICYgRkxfRkxPQ0spCi0JCWNGWUkoMSwgIkZsb2NrIik7Ci0JaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9TTEVFUCkgewotCQljRllJKDEsICJCbG9ja2luZyBsb2NrIik7Ci0JCXdhaXRfZmxhZyA9IHRydWU7CisJc3RydWN0IGNpZnNMb2NrSW5mbyAqbGksICp0bXA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxpLCB0bXAsICZsb2NrLT5ibGlzdCwgYmxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmbGktPmJsaXN0KTsKKwkJd2FrZV91cCgmbGktPmJsb2NrX3EpOwogCX0KLQlpZiAocGZMb2NrLT5mbF9mbGFncyAmIEZMX0FDQ0VTUykKLQkJY0ZZSSgxLCAiUHJvY2VzcyBzdXNwZW5kZWQgYnkgbWFuZGF0b3J5IGxvY2tpbmcgLSAiCi0JCQkgIm5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKLQlpZiAocGZMb2NrLT5mbF9mbGFncyAmIEZMX0xFQVNFKQotCQljRllJKDEsICJMZWFzZSBvbiBmaWxlIC0gbm90IGltcGxlbWVudGVkIHlldCIpOwotCWlmIChwZkxvY2stPmZsX2ZsYWdzICYKLQkgICAgKH4oRkxfUE9TSVggfCBGTF9GTE9DSyB8IEZMX1NMRUVQIHwgRkxfQUNDRVNTIHwgRkxfTEVBU0UpKSkKLQkJY0ZZSSgxLCAiVW5rbm93biBsb2NrIGZsYWdzIDB4JXgiLCBwZkxvY2stPmZsX2ZsYWdzKTsKK30KIAotCWlmIChwZkxvY2stPmZsX3R5cGUgPT0gRl9XUkxDSykgewotCQljRllJKDEsICJGX1dSTENLICIpOwotCQludW1Mb2NrID0gMTsKLQl9IGVsc2UgaWYgKHBmTG9jay0+ZmxfdHlwZSA9PSBGX1VOTENLKSB7Ci0JCWNGWUkoMSwgIkZfVU5MQ0siKTsKLQkJbnVtVW5sb2NrID0gMTsKLQkJLyogQ2hlY2sgaWYgdW5sb2NrIGluY2x1ZGVzIG1vcmUgdGhhbgotCQlvbmUgbG9jayByYW5nZSAqLwotCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfUkRMQ0spIHsKLQkJY0ZZSSgxLCAiRl9SRExDSyIpOwotCQlsb2NrVHlwZSB8PSBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0s7Ci0JCW51bUxvY2sgPSAxOwotCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfRVhMQ0spIHsKLQkJY0ZZSSgxLCAiRl9FWExDSyIpOwotCQludW1Mb2NrID0gMTsKLQl9IGVsc2UgaWYgKHBmTG9jay0+ZmxfdHlwZSA9PSBGX1NITENLKSB7Ci0JCWNGWUkoMSwgIkZfU0hMQ0siKTsKLQkJbG9ja1R5cGUgfD0gTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLOwotCQludW1Mb2NrID0gMTsKLQl9IGVsc2UKLQkJY0ZZSSgxLCAiVW5rbm93biB0eXBlIG9mIGxvY2siKTsKK3N0YXRpYyBib29sCitfX2NpZnNfZmluZF9sb2NrX2NvbmZsaWN0KHN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUsIF9fdTY0IG9mZnNldCwKKwkJCV9fdTY0IGxlbmd0aCwgX191OCB0eXBlLCBfX3UxNiBuZXRmaWQsCisJCQlzdHJ1Y3QgY2lmc0xvY2tJbmZvICoqY29uZl9sb2NrKQoreworCXN0cnVjdCBjaWZzTG9ja0luZm8gKmxpLCAqdG1wOwogCi0JY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7Ci0JdGNvbiA9IHRsaW5rX3Rjb24oKChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhKS0+dGxpbmspOwotCW5ldGZpZCA9ICgoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YSktPm5ldGZpZDsKLQotCWlmICgodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgJiYKLQkgICAgKENJRlNfVU5JWF9GQ05UTF9DQVAgJiBsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpKSAmJgotCSAgICAoKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT1BPU0lYQlJMKSA9PSAwKSkKLQkJcG9zaXhfbG9ja2luZyA9IDE7Ci0JLyogQkIgYWRkIGNvZGUgaGVyZSB0byBub3JtYWxpemUgb2Zmc2V0IGFuZCBsZW5ndGggdG8KLQlhY2NvdW50IGZvciBuZWdhdGl2ZSBsZW5ndGggd2hpY2ggd2UgY2FuIG5vdCBhY2NlcHQgb3ZlciB0aGUKLQl3aXJlICovCi0JaWYgKElTX0dFVExLKGNtZCkpIHsKLQkJaWYgKHBvc2l4X2xvY2tpbmcpIHsKLQkJCWludCBwb3NpeF9sb2NrX3R5cGU7Ci0JCQlpZiAobG9ja1R5cGUgJiBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0spCi0JCQkJcG9zaXhfbG9ja190eXBlID0gQ0lGU19SRExDSzsKLQkJCWVsc2UKLQkJCQlwb3NpeF9sb2NrX3R5cGUgPSBDSUZTX1dSTENLOwotCQkJcmMgPSBDSUZTU01CUG9zaXhMb2NrKHhpZCwgdGNvbiwgbmV0ZmlkLCAxIC8qIGdldCAqLywKLQkJCQkJbGVuZ3RoLCBwZkxvY2ssIHBvc2l4X2xvY2tfdHlwZSwKLQkJCQkJd2FpdF9mbGFnKTsKLQkJCUZyZWVYaWQoeGlkKTsKLQkJCXJldHVybiByYzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmNpbm9kZS0+bGxpc3QsIGxsaXN0KSB7CisJCWlmIChvZmZzZXQgKyBsZW5ndGggPD0gbGktPm9mZnNldCB8fAorCQkgICAgb2Zmc2V0ID49IGxpLT5vZmZzZXQgKyBsaS0+bGVuZ3RoKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKCh0eXBlICYgTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLKSAmJgorCQkJICgobmV0ZmlkID09IGxpLT5uZXRmaWQgJiYgY3VycmVudC0+dGdpZCA9PSBsaS0+cGlkKSB8fAorCQkJICB0eXBlID09IGxpLT50eXBlKSkKKwkJCWNvbnRpbnVlOworCQllbHNlIHsKKwkJCSpjb25mX2xvY2sgPSBsaTsKKwkJCXJldHVybiB0cnVlOwogCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KIAotCQkvKiBCQiB3ZSBjb3VsZCBjaGFpbiB0aGVzZSBpbnRvIG9uZSBsb2NrIHJlcXVlc3QgQkIgKi8KLQkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgbGVuZ3RoLCBwZkxvY2stPmZsX3N0YXJ0LAotCQkJCSAwLCAxLCBsb2NrVHlwZSwgMCAvKiB3YWl0IGZsYWcgKi8sIDApOwotCQlpZiAocmMgPT0gMCkgewotCQkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgbGVuZ3RoLAotCQkJCQkgcGZMb2NrLT5mbF9zdGFydCwgMSAvKiBudW1VbmxvY2sgKi8gLAotCQkJCQkgMCAvKiBudW1Mb2NrICovICwgbG9ja1R5cGUsCi0JCQkJCSAwIC8qIHdhaXQgZmxhZyAqLywgMCk7Ci0JCQlwZkxvY2stPmZsX3R5cGUgPSBGX1VOTENLOwotCQkJaWYgKHJjICE9IDApCi0JCQkJY0VSUk9SKDEsICJFcnJvciB1bmxvY2tpbmcgcHJldmlvdXNseSBsb2NrZWQgIgotCQkJCQkgICAicmFuZ2UgJWQgZHVyaW5nIHRlc3Qgb2YgbG9jayIsIHJjKTsKLQkJCXJjID0gMDsKK3N0YXRpYyBib29sCitjaWZzX2ZpbmRfbG9ja19jb25mbGljdChzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlLCBzdHJ1Y3QgY2lmc0xvY2tJbmZvICpsb2NrLAorCQkJc3RydWN0IGNpZnNMb2NrSW5mbyAqKmNvbmZfbG9jaykKK3sKKwlyZXR1cm4gX19jaWZzX2ZpbmRfbG9ja19jb25mbGljdChjaW5vZGUsIGxvY2stPm9mZnNldCwgbG9jay0+bGVuZ3RoLAorCQkJCQkgbG9jay0+dHlwZSwgbG9jay0+bmV0ZmlkLCBjb25mX2xvY2spOworfQogCi0JCX0gZWxzZSB7Ci0JCQkvKiBpZiByYyA9PSBFUlJfU0hBUklOR19WSU9MQVRJT04gPyAqLwotCQkJcmMgPSAwOworc3RhdGljIGludAorY2lmc19sb2NrX3Rlc3Qoc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpbm9kZSwgX191NjQgb2Zmc2V0LCBfX3U2NCBsZW5ndGgsCisJICAgICAgIF9fdTggdHlwZSwgX191MTYgbmV0ZmlkLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzTG9ja0luZm8gKmNvbmZfbG9jazsKKwlib29sIGV4aXN0OwogCi0JCQlpZiAobG9ja1R5cGUgJiBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0spIHsKLQkJCQlwZkxvY2stPmZsX3R5cGUgPSBGX1dSTENLOwotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IENJRlNTTUJMb2NrKHhpZCwgdGNvbiwgbmV0ZmlkLCBsZW5ndGgsCi0JCQkJCXBmTG9jay0+Zmxfc3RhcnQsIDAsIDEsCi0JCQkJCWxvY2tUeXBlIHwgTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLLAotCQkJCQkwIC8qIHdhaXQgZmxhZyAqLywgMCk7Ci0JCQkJaWYgKHJjID09IDApIHsKLQkJCQkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwKLQkJCQkJCWxlbmd0aCwgcGZMb2NrLT5mbF9zdGFydCwgMSwgMCwKLQkJCQkJCWxvY2tUeXBlIHwKLQkJCQkJCUxPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSywKLQkJCQkJCTAgLyogd2FpdCBmbGFnICovLCAwKTsKLQkJCQkJcGZMb2NrLT5mbF90eXBlID0gRl9SRExDSzsKLQkJCQkJaWYgKHJjICE9IDApCi0JCQkJCQljRVJST1IoMSwgIkVycm9yIHVubG9ja2luZyAiCi0JCQkJCQkicHJldmlvdXNseSBsb2NrZWQgcmFuZ2UgJWQgIgotCQkJCQkJImR1cmluZyB0ZXN0IG9mIGxvY2siLCByYyk7Ci0JCQkJCXJjID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlwZkxvY2stPmZsX3R5cGUgPSBGX1dSTENLOwotCQkJCQlyYyA9IDA7Ci0JCQkJfQotCQkJfQotCQl9CisJbXV0ZXhfbG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKIAorCWV4aXN0ID0gX19jaWZzX2ZpbmRfbG9ja19jb25mbGljdChjaW5vZGUsIG9mZnNldCwgbGVuZ3RoLCB0eXBlLCBuZXRmaWQsCisJCQkJCSAgJmNvbmZfbG9jayk7CisJaWYgKGV4aXN0KSB7CisJCWZsb2NrLT5mbF9zdGFydCA9IGNvbmZfbG9jay0+b2Zmc2V0OworCQlmbG9jay0+ZmxfZW5kID0gY29uZl9sb2NrLT5vZmZzZXQgKyBjb25mX2xvY2stPmxlbmd0aCAtIDE7CisJCWZsb2NrLT5mbF9waWQgPSBjb25mX2xvY2stPnBpZDsKKwkJaWYgKGNvbmZfbG9jay0+dHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykKKwkJCWZsb2NrLT5mbF90eXBlID0gRl9SRExDSzsKKwkJZWxzZQorCQkJZmxvY2stPmZsX3R5cGUgPSBGX1dSTENLOworCX0gZWxzZSBpZiAoIWNpbm9kZS0+Y2FuX2NhY2hlX2JybGNrcykKKwkJcmMgPSAxOworCWVsc2UKKwkJZmxvY2stPmZsX3R5cGUgPSBGX1VOTENLOworCisJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2NpZnNfbG9ja19hZGQoc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpbm9kZSwgc3RydWN0IGNpZnNMb2NrSW5mbyAqbG9jaykKK3sKKwltdXRleF9sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJmxvY2stPmxsaXN0LCAmY2lub2RlLT5sbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworfQorCitzdGF0aWMgaW50CitjaWZzX2xvY2tfYWRkX2lmKHN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUsIHN0cnVjdCBjaWZzTG9ja0luZm8gKmxvY2ssCisJCSBib29sIHdhaXQpCit7CisJc3RydWN0IGNpZnNMb2NrSW5mbyAqY29uZl9sb2NrOworCWJvb2wgZXhpc3Q7CisJaW50IHJjID0gMDsKKwordHJ5X2FnYWluOgorCWV4aXN0ID0gZmFsc2U7CisJbXV0ZXhfbG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKKworCWV4aXN0ID0gY2lmc19maW5kX2xvY2tfY29uZmxpY3QoY2lub2RlLCBsb2NrLCAmY29uZl9sb2NrKTsKKwlpZiAoIWV4aXN0ICYmIGNpbm9kZS0+Y2FuX2NhY2hlX2JybGNrcykgeworCQlsaXN0X2FkZF90YWlsKCZsb2NrLT5sbGlzdCwgJmNpbm9kZS0+bGxpc3QpOworCQltdXRleF91bmxvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoIWV4aXN0KQorCQlyYyA9IDE7CisJZWxzZSBpZiAoIXdhaXQpCisJCXJjID0gLUVBQ0NFUzsKKwllbHNlIHsKKwkJbGlzdF9hZGRfdGFpbCgmbG9jay0+Ymxpc3QsICZjb25mX2xvY2stPmJsaXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShsb2NrLT5ibG9ja19xLAorCQkJCQkobG9jay0+Ymxpc3QucHJldiA9PSAmbG9jay0+Ymxpc3QpICYmCisJCQkJCShsb2NrLT5ibGlzdC5uZXh0ID09ICZsb2NrLT5ibGlzdCkpOworCQlpZiAoIXJjKQorCQkJZ290byB0cnlfYWdhaW47CisJCW11dGV4X2xvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJCWxpc3RfZGVsX2luaXQoJmxvY2stPmJsaXN0KTsKKwl9CisKKwltdXRleF91bmxvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitjaWZzX3Bvc2l4X2xvY2tfdGVzdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmxvY2spCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGNoYXIgc2F2ZWRfdHlwZSA9IGZsb2NrLT5mbF90eXBlOworCisJaWYgKChmbG9jay0+ZmxfZmxhZ3MgJiBGTF9QT1NJWCkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwltdXRleF9sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCXBvc2l4X3Rlc3RfbG9jayhmaWxlLCBmbG9jayk7CisKKwlpZiAoZmxvY2stPmZsX3R5cGUgPT0gRl9VTkxDSyAmJiAhY2lub2RlLT5jYW5fY2FjaGVfYnJsY2tzKSB7CisJCWZsb2NrLT5mbF90eXBlID0gc2F2ZWRfdHlwZTsKKwkJcmMgPSAxOworCX0KKworCW11dGV4X3VubG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfcG9zaXhfbG9ja19zZXQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsb2NrKQoreworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUgPSBDSUZTX0koZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHJjID0gMTsKKworCWlmICgoZmxvY2stPmZsX2ZsYWdzICYgRkxfUE9TSVgpID09IDApCisJCXJldHVybiByYzsKKworCW11dGV4X2xvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJaWYgKCFjaW5vZGUtPmNhbl9jYWNoZV9icmxja3MpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCQlyZXR1cm4gcmM7CisJfQorCXJjID0gcG9zaXhfbG9ja19maWxlX3dhaXQoZmlsZSwgZmxvY2spOworCW11dGV4X3VubG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfcHVzaF9tYW5kYXRvcnlfbG9ja3Moc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUpCit7CisJaW50IHhpZCwgcmMgPSAwLCBzdG9yZWRfcmM7CisJc3RydWN0IGNpZnNMb2NrSW5mbyAqbGksICp0bXA7CisJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGNmaWxlLT5kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGludCBudW0sIG1heF9udW07CisJTE9DS0lOR19BTkRYX1JBTkdFICpidWYsICpjdXI7CisJaW50IHR5cGVzW10gPSB7TE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTLAorCQkgICAgICAgTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLIHwgTE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTfTsKKwlpbnQgaTsKKworCXhpZCA9IEdldFhpZCgpOworCXRjb24gPSB0bGlua190Y29uKGNmaWxlLT50bGluayk7CisKKwltdXRleF9sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCWlmICghY2lub2RlLT5jYW5fY2FjaGVfYnJsY2tzKSB7CisJCW11dGV4X3VubG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKIAkJRnJlZVhpZCh4aWQpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0JaWYgKCFudW1Mb2NrICYmICFudW1VbmxvY2spIHsKLQkJLyogaWYgbm8gbG9jayBvciB1bmxvY2sgdGhlbiBub3RoaW5nCi0JCXRvIGRvIHNpbmNlIHdlIGRvIG5vdCBrbm93IHdoYXQgaXQgaXMgKi8KKwltYXhfbnVtID0gKHRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgLSBzaXplb2Yoc3RydWN0IHNtYl9oZHIpKSAvCisJCSAgc2l6ZW9mKExPQ0tJTkdfQU5EWF9SQU5HRSk7CisJYnVmID0ga3phbGxvYyhtYXhfbnVtICogc2l6ZW9mKExPQ0tJTkdfQU5EWF9SQU5HRSksIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCW11dGV4X3VubG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKIAkJRnJlZVhpZCh4aWQpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCXJldHVybiByYzsKIAl9CiAKLQlpZiAocG9zaXhfbG9ja2luZykgeworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJY3VyID0gYnVmOworCQludW0gPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmNpbm9kZS0+bGxpc3QsIGxsaXN0KSB7CisJCQlpZiAobGktPnR5cGUgIT0gdHlwZXNbaV0pCisJCQkJY29udGludWU7CisJCQljdXItPlBpZCA9IGNwdV90b19sZTE2KGxpLT5waWQpOworCQkJY3VyLT5MZW5ndGhMb3cgPSBjcHVfdG9fbGUzMigodTMyKWxpLT5sZW5ndGgpOworCQkJY3VyLT5MZW5ndGhIaWdoID0gY3B1X3RvX2xlMzIoKHUzMikobGktPmxlbmd0aD4+MzIpKTsKKwkJCWN1ci0+T2Zmc2V0TG93ID0gY3B1X3RvX2xlMzIoKHUzMilsaS0+b2Zmc2V0KTsKKwkJCWN1ci0+T2Zmc2V0SGlnaCA9IGNwdV90b19sZTMyKCh1MzIpKGxpLT5vZmZzZXQ+PjMyKSk7CisJCQlpZiAoKytudW0gPT0gbWF4X251bSkgeworCQkJCXN0b3JlZF9yYyA9IGNpZnNfbG9ja3YoeGlkLCB0Y29uLCBjZmlsZS0+bmV0ZmlkLAorCQkJCQkJICAgICAgIGxpLT50eXBlLCAwLCBudW0sIGJ1Zik7CisJCQkJaWYgKHN0b3JlZF9yYykKKwkJCQkJcmMgPSBzdG9yZWRfcmM7CisJCQkJY3VyID0gYnVmOworCQkJCW51bSA9IDA7CisJCQl9IGVsc2UKKwkJCQljdXIrKzsKKwkJfQorCisJCWlmIChudW0pIHsKKwkJCXN0b3JlZF9yYyA9IGNpZnNfbG9ja3YoeGlkLCB0Y29uLCBjZmlsZS0+bmV0ZmlkLAorCQkJCQkgICAgICAgdHlwZXNbaV0sIDAsIG51bSwgYnVmKTsKKwkJCWlmIChzdG9yZWRfcmMpCisJCQkJcmMgPSBzdG9yZWRfcmM7CisJCX0KKwl9CisKKwljaW5vZGUtPmNhbl9jYWNoZV9icmxja3MgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisKKwlrZnJlZShidWYpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGNvcGllZCBmcm9tIGZzL2xvY2tzLmMgd2l0aCBhIG5hbWUgY2hhbmdlICovCisjZGVmaW5lIGNpZnNfZm9yX2VhY2hfbG9jayhpbm9kZSwgbG9ja3ApIFwKKwlmb3IgKGxvY2twID0gJmlub2RlLT5pX2Zsb2NrOyAqbG9ja3AgIT0gTlVMTDsgXAorCSAgICAgbG9ja3AgPSAmKCpsb2NrcCktPmZsX25leHQpCisKK3N0YXRpYyBpbnQKK2NpZnNfcHVzaF9wb3NpeF9sb2NrcyhzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjZmlsZSkKK3sKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGNmaWxlLT5kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjaWZzX3Rjb24gKnRjb24gPSB0bGlua190Y29uKGNmaWxlLT50bGluayk7CisJc3RydWN0IGZpbGVfbG9jayAqZmxvY2ssICoqYmVmb3JlOworCXN0cnVjdCBjaWZzTG9ja0luZm8gKmxjaywgKnRtcDsKKwlpbnQgcmMgPSAwLCB4aWQsIHR5cGU7CisJX191NjQgbGVuZ3RoOworCXN0cnVjdCBsaXN0X2hlYWQgbG9ja3NfdG9fc2VuZDsKKworCXhpZCA9IEdldFhpZCgpOworCisJbXV0ZXhfbG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKKwlpZiAoIWNpbm9kZS0+Y2FuX2NhY2hlX2JybGNrcykgeworCQltdXRleF91bmxvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIHJjOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZsb2Nrc190b19zZW5kKTsKKworCWxvY2tfZmxvY2tzKCk7CisJY2lmc19mb3JfZWFjaF9sb2NrKGNmaWxlLT5kZW50cnktPmRfaW5vZGUsIGJlZm9yZSkgeworCQlmbG9jayA9ICpiZWZvcmU7CisJCWxlbmd0aCA9IDEgKyBmbG9jay0+ZmxfZW5kIC0gZmxvY2stPmZsX3N0YXJ0OworCQlpZiAoZmxvY2stPmZsX3R5cGUgPT0gRl9SRExDSyB8fCBmbG9jay0+ZmxfdHlwZSA9PSBGX1NITENLKQorCQkJdHlwZSA9IENJRlNfUkRMQ0s7CisJCWVsc2UKKwkJCXR5cGUgPSBDSUZTX1dSTENLOworCisJCWxjayA9IGNpZnNfbG9ja19pbml0KGZsb2NrLT5mbF9zdGFydCwgbGVuZ3RoLCB0eXBlLAorCQkJCSAgICAgY2ZpbGUtPm5ldGZpZCk7CisJCWlmICghbGNrKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIHNlbmRfbG9ja3M7CisJCX0KKwkJbGNrLT5waWQgPSBmbG9jay0+ZmxfcGlkOworCisJCWxpc3RfYWRkX3RhaWwoJmxjay0+bGxpc3QsICZsb2Nrc190b19zZW5kKTsKKwl9CisKK3NlbmRfbG9ja3M6CisJdW5sb2NrX2Zsb2NrcygpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxjaywgdG1wLCAmbG9ja3NfdG9fc2VuZCwgbGxpc3QpIHsKKwkJc3RydWN0IGZpbGVfbG9jayB0bXBfbG9jazsKKwkJaW50IHN0b3JlZF9yYzsKKworCQl0bXBfbG9jay5mbF9zdGFydCA9IGxjay0+b2Zmc2V0OworCQlzdG9yZWRfcmMgPSBDSUZTU01CUG9zaXhMb2NrKHhpZCwgdGNvbiwgbGNrLT5uZXRmaWQsIGxjay0+cGlkLAorCQkJCQkgICAgIDAsIGxjay0+bGVuZ3RoLCAmdG1wX2xvY2ssCisJCQkJCSAgICAgbGNrLT50eXBlLCAwKTsKKwkJaWYgKHN0b3JlZF9yYykKKwkJCXJjID0gc3RvcmVkX3JjOworCQlsaXN0X2RlbCgmbGNrLT5sbGlzdCk7CisJCWtmcmVlKGxjayk7CisJfQorCisJY2lub2RlLT5jYW5fY2FjaGVfYnJsY2tzID0gZmFsc2U7CisJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorY2lmc19wdXNoX2xvY2tzKHN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlKQoreworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKGNmaWxlLT5kZW50cnktPmRfc2IpOworCXN0cnVjdCBjaWZzX3Rjb24gKnRjb24gPSB0bGlua190Y29uKGNmaWxlLT50bGluayk7CisKKwlpZiAoKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpICYmCisJICAgIChDSUZTX1VOSVhfRkNOVExfQ0FQICYgbGU2NF90b19jcHUodGNvbi0+ZnNVbml4SW5mby5DYXBhYmlsaXR5KSkgJiYKKwkgICAgKChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTk9QT1NJWEJSTCkgPT0gMCkpCisJCXJldHVybiBjaWZzX3B1c2hfcG9zaXhfbG9ja3MoY2ZpbGUpOworCisJcmV0dXJuIGNpZnNfcHVzaF9tYW5kYXRvcnlfbG9ja3MoY2ZpbGUpOworfQorCitzdGF0aWMgdm9pZAorY2lmc19yZWFkX2Zsb2NrKHN0cnVjdCBmaWxlX2xvY2sgKmZsb2NrLCBfX3U4ICp0eXBlLCBpbnQgKmxvY2ssIGludCAqdW5sb2NrLAorCQlib29sICp3YWl0X2ZsYWcpCit7CisJaWYgKGZsb2NrLT5mbF9mbGFncyAmIEZMX1BPU0lYKQorCQljRllJKDEsICJQb3NpeCIpOworCWlmIChmbG9jay0+ZmxfZmxhZ3MgJiBGTF9GTE9DSykKKwkJY0ZZSSgxLCAiRmxvY2siKTsKKwlpZiAoZmxvY2stPmZsX2ZsYWdzICYgRkxfU0xFRVApIHsKKwkJY0ZZSSgxLCAiQmxvY2tpbmcgbG9jayIpOworCQkqd2FpdF9mbGFnID0gdHJ1ZTsKKwl9CisJaWYgKGZsb2NrLT5mbF9mbGFncyAmIEZMX0FDQ0VTUykKKwkJY0ZZSSgxLCAiUHJvY2VzcyBzdXNwZW5kZWQgYnkgbWFuZGF0b3J5IGxvY2tpbmcgLSAiCisJCQkibm90IGltcGxlbWVudGVkIHlldCIpOworCWlmIChmbG9jay0+ZmxfZmxhZ3MgJiBGTF9MRUFTRSkKKwkJY0ZZSSgxLCAiTGVhc2Ugb24gZmlsZSAtIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKKwlpZiAoZmxvY2stPmZsX2ZsYWdzICYKKwkgICAgKH4oRkxfUE9TSVggfCBGTF9GTE9DSyB8IEZMX1NMRUVQIHwgRkxfQUNDRVNTIHwgRkxfTEVBU0UpKSkKKwkJY0ZZSSgxLCAiVW5rbm93biBsb2NrIGZsYWdzIDB4JXgiLCBmbG9jay0+ZmxfZmxhZ3MpOworCisJKnR5cGUgPSBMT0NLSU5HX0FORFhfTEFSR0VfRklMRVM7CisJaWYgKGZsb2NrLT5mbF90eXBlID09IEZfV1JMQ0spIHsKKwkJY0ZZSSgxLCAiRl9XUkxDSyAiKTsKKwkJKmxvY2sgPSAxOworCX0gZWxzZSBpZiAoZmxvY2stPmZsX3R5cGUgPT0gRl9VTkxDSykgeworCQljRllJKDEsICJGX1VOTENLIik7CisJCSp1bmxvY2sgPSAxOworCQkvKiBDaGVjayBpZiB1bmxvY2sgaW5jbHVkZXMgbW9yZSB0aGFuIG9uZSBsb2NrIHJhbmdlICovCisJfSBlbHNlIGlmIChmbG9jay0+ZmxfdHlwZSA9PSBGX1JETENLKSB7CisJCWNGWUkoMSwgIkZfUkRMQ0siKTsKKwkJKnR5cGUgfD0gTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLOworCQkqbG9jayA9IDE7CisJfSBlbHNlIGlmIChmbG9jay0+ZmxfdHlwZSA9PSBGX0VYTENLKSB7CisJCWNGWUkoMSwgIkZfRVhMQ0siKTsKKwkJKmxvY2sgPSAxOworCX0gZWxzZSBpZiAoZmxvY2stPmZsX3R5cGUgPT0gRl9TSExDSykgeworCQljRllJKDEsICJGX1NITENLIik7CisJCSp0eXBlIHw9IExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSzsKKwkJKmxvY2sgPSAxOworCX0gZWxzZQorCQljRllJKDEsICJVbmtub3duIHR5cGUgb2YgbG9jayIpOworfQorCitzdGF0aWMgaW50CitjaWZzX2dldGxrKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaywgX191OCB0eXBlLAorCSAgIGJvb2wgd2FpdF9mbGFnLCBib29sIHBvc2l4X2xjaywgaW50IHhpZCkKK3sKKwlpbnQgcmMgPSAwOworCV9fdTY0IGxlbmd0aCA9IDEgKyBmbG9jay0+ZmxfZW5kIC0gZmxvY2stPmZsX3N0YXJ0OworCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlID0gKHN0cnVjdCBjaWZzRmlsZUluZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNpZnNfdGNvbiAqdGNvbiA9IHRsaW5rX3Rjb24oY2ZpbGUtPnRsaW5rKTsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGNmaWxlLT5kZW50cnktPmRfaW5vZGUpOworCV9fdTE2IG5ldGZpZCA9IGNmaWxlLT5uZXRmaWQ7CisKKwlpZiAocG9zaXhfbGNrKSB7CiAJCWludCBwb3NpeF9sb2NrX3R5cGU7Ci0JCWlmIChsb2NrVHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykKKworCQlyYyA9IGNpZnNfcG9zaXhfbG9ja190ZXN0KGZpbGUsIGZsb2NrKTsKKwkJaWYgKCFyYykKKwkJCXJldHVybiByYzsKKworCQlpZiAodHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykKKwkJCXBvc2l4X2xvY2tfdHlwZSA9IENJRlNfUkRMQ0s7CisJCWVsc2UKKwkJCXBvc2l4X2xvY2tfdHlwZSA9IENJRlNfV1JMQ0s7CisJCXJjID0gQ0lGU1NNQlBvc2l4TG9jayh4aWQsIHRjb24sIG5ldGZpZCwgY3VycmVudC0+dGdpZCwKKwkJCQkgICAgICAxIC8qIGdldCAqLywgbGVuZ3RoLCBmbG9jaywKKwkJCQkgICAgICBwb3NpeF9sb2NrX3R5cGUsIHdhaXRfZmxhZyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGNpZnNfbG9ja190ZXN0KGNpbm9kZSwgZmxvY2stPmZsX3N0YXJ0LCBsZW5ndGgsIHR5cGUsIG5ldGZpZCwKKwkJCSAgICBmbG9jayk7CisJaWYgKCFyYykKKwkJcmV0dXJuIHJjOworCisJLyogQkIgd2UgY291bGQgY2hhaW4gdGhlc2UgaW50byBvbmUgbG9jayByZXF1ZXN0IEJCICovCisJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgY3VycmVudC0+dGdpZCwgbGVuZ3RoLAorCQkJIGZsb2NrLT5mbF9zdGFydCwgMCwgMSwgdHlwZSwgMCwgMCk7CisJaWYgKHJjID09IDApIHsKKwkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgY3VycmVudC0+dGdpZCwKKwkJCQkgbGVuZ3RoLCBmbG9jay0+Zmxfc3RhcnQsIDEsIDAsCisJCQkJIHR5cGUsIDAsIDApOworCQlmbG9jay0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisJCWlmIChyYyAhPSAwKQorCQkJY0VSUk9SKDEsICJFcnJvciB1bmxvY2tpbmcgcHJldmlvdXNseSBsb2NrZWQgIgorCQkJCSAgICJyYW5nZSAlZCBkdXJpbmcgdGVzdCBvZiBsb2NrIiwgcmMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykgeworCQlmbG9jay0+ZmxfdHlwZSA9IEZfV1JMQ0s7CisJCXJldHVybiAwOworCX0KKworCXJjID0gQ0lGU1NNQkxvY2soeGlkLCB0Y29uLCBuZXRmaWQsIGN1cnJlbnQtPnRnaWQsIGxlbmd0aCwKKwkJCSBmbG9jay0+Zmxfc3RhcnQsIDAsIDEsCisJCQkgdHlwZSB8IExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSywgMCwgMCk7CisJaWYgKHJjID09IDApIHsKKwkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgY3VycmVudC0+dGdpZCwKKwkJCQkgbGVuZ3RoLCBmbG9jay0+Zmxfc3RhcnQsIDEsIDAsCisJCQkJIHR5cGUgfCBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0ssCisJCQkJIDAsIDApOworCQlmbG9jay0+ZmxfdHlwZSA9IEZfUkRMQ0s7CisJCWlmIChyYyAhPSAwKQorCQkJY0VSUk9SKDEsICJFcnJvciB1bmxvY2tpbmcgcHJldmlvdXNseSBsb2NrZWQgIgorCQkJCSAgInJhbmdlICVkIGR1cmluZyB0ZXN0IG9mIGxvY2siLCByYyk7CisJfSBlbHNlCisJCWZsb2NrLT5mbF90eXBlID0gRl9XUkxDSzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorY2lmc19tb3ZlX2xsaXN0KHN0cnVjdCBsaXN0X2hlYWQgKnNvdXJjZSwgc3RydWN0IGxpc3RfaGVhZCAqZGVzdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaSwgKnRtcDsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGksIHRtcCwgc291cmNlKQorCQlsaXN0X21vdmUobGksIGRlc3QpOworfQorCitzdGF0aWMgdm9pZAorY2lmc19mcmVlX2xsaXN0KHN0cnVjdCBsaXN0X2hlYWQgKmxsaXN0KQoreworCXN0cnVjdCBjaWZzTG9ja0luZm8gKmxpLCAqdG1wOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaSwgdG1wLCBsbGlzdCwgbGxpc3QpIHsKKwkJY2lmc19kZWxfbG9ja193YWl0ZXJzKGxpKTsKKwkJbGlzdF9kZWwoJmxpLT5sbGlzdCk7CisJCWtmcmVlKGxpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfdW5sb2NrX3JhbmdlKHN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaywgaW50IHhpZCkKK3sKKwlpbnQgcmMgPSAwLCBzdG9yZWRfcmM7CisJaW50IHR5cGVzW10gPSB7TE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTLAorCQkgICAgICAgTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLIHwgTE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTfTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbWF4X251bSwgbnVtOworCUxPQ0tJTkdfQU5EWF9SQU5HRSAqYnVmLCAqY3VyOworCXN0cnVjdCBjaWZzX3Rjb24gKnRjb24gPSB0bGlua190Y29uKGNmaWxlLT50bGluayk7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpbm9kZSA9IENJRlNfSShjZmlsZS0+ZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY2lmc0xvY2tJbmZvICpsaSwgKnRtcDsKKwlfX3U2NCBsZW5ndGggPSAxICsgZmxvY2stPmZsX2VuZCAtIGZsb2NrLT5mbF9zdGFydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcF9sbGlzdDsKKworCUlOSVRfTElTVF9IRUFEKCZ0bXBfbGxpc3QpOworCisJbWF4X251bSA9ICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSkgLworCQkgIHNpemVvZihMT0NLSU5HX0FORFhfUkFOR0UpOworCWJ1ZiA9IGt6YWxsb2MobWF4X251bSAqIHNpemVvZihMT0NLSU5HX0FORFhfUkFOR0UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJY3VyID0gYnVmOworCQludW0gPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmNpbm9kZS0+bGxpc3QsIGxsaXN0KSB7CisJCQlpZiAoZmxvY2stPmZsX3N0YXJ0ID4gbGktPm9mZnNldCB8fAorCQkJICAgIChmbG9jay0+Zmxfc3RhcnQgKyBsZW5ndGgpIDwKKwkJCSAgICAobGktPm9mZnNldCArIGxpLT5sZW5ndGgpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGN1cnJlbnQtPnRnaWQgIT0gbGktPnBpZCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjZmlsZS0+bmV0ZmlkICE9IGxpLT5uZXRmaWQpCisJCQkJY29udGludWU7CisJCQlpZiAodHlwZXNbaV0gIT0gbGktPnR5cGUpCisJCQkJY29udGludWU7CisJCQlpZiAoIWNpbm9kZS0+Y2FuX2NhY2hlX2JybGNrcykgeworCQkJCWN1ci0+UGlkID0gY3B1X3RvX2xlMTYobGktPnBpZCk7CisJCQkJY3VyLT5MZW5ndGhMb3cgPSBjcHVfdG9fbGUzMigodTMyKWxpLT5sZW5ndGgpOworCQkJCWN1ci0+TGVuZ3RoSGlnaCA9CisJCQkJCWNwdV90b19sZTMyKCh1MzIpKGxpLT5sZW5ndGg+PjMyKSk7CisJCQkJY3VyLT5PZmZzZXRMb3cgPSBjcHVfdG9fbGUzMigodTMyKWxpLT5vZmZzZXQpOworCQkJCWN1ci0+T2Zmc2V0SGlnaCA9CisJCQkJCWNwdV90b19sZTMyKCh1MzIpKGxpLT5vZmZzZXQ+PjMyKSk7CisJCQkJLyoKKwkJCQkgKiBXZSBuZWVkIHRvIHNhdmUgYSBsb2NrIGhlcmUgdG8gbGV0IHVzIGFkZAorCQkJCSAqIGl0IGFnYWluIHRvIHRoZSBpbm9kZSBsaXN0IGlmIHRoZSB1bmxvY2sKKwkJCQkgKiByYW5nZSByZXF1ZXN0IGZhaWxzIG9uIHRoZSBzZXJ2ZXIuCisJCQkJICovCisJCQkJbGlzdF9tb3ZlKCZsaS0+bGxpc3QsICZ0bXBfbGxpc3QpOworCQkJCWlmICgrK251bSA9PSBtYXhfbnVtKSB7CisJCQkJCXN0b3JlZF9yYyA9IGNpZnNfbG9ja3YoeGlkLCB0Y29uLAorCQkJCQkJCSAgICAgICBjZmlsZS0+bmV0ZmlkLAorCQkJCQkJCSAgICAgICBsaS0+dHlwZSwgbnVtLAorCQkJCQkJCSAgICAgICAwLCBidWYpOworCQkJCQlpZiAoc3RvcmVkX3JjKSB7CisJCQkJCQkvKgorCQkJCQkJICogV2UgZmFpbGVkIG9uIHRoZSB1bmxvY2sgcmFuZ2UKKwkJCQkJCSAqIHJlcXVlc3QgLSBhZGQgYWxsIGxvY2tzIGZyb20KKwkJCQkJCSAqIHRoZSB0bXAgbGlzdCB0byB0aGUgaGVhZCBvZgorCQkJCQkJICogdGhlIGlub2RlIGxpc3QuCisJCQkJCQkgKi8KKwkJCQkJCWNpZnNfbW92ZV9sbGlzdCgmdG1wX2xsaXN0LAorCQkJCQkJCQkmY2lub2RlLT5sbGlzdCk7CisJCQkJCQlyYyA9IHN0b3JlZF9yYzsKKwkJCQkJfSBlbHNlCisJCQkJCQkvKgorCQkJCQkJICogVGhlIHVubG9jayByYW5nZSByZXF1ZXN0CisJCQkJCQkgKiBzdWNjZWVkIC0gZnJlZSB0aGUgdG1wIGxpc3QuCisJCQkJCQkgKi8KKwkJCQkJCWNpZnNfZnJlZV9sbGlzdCgmdG1wX2xsaXN0KTsKKwkJCQkJY3VyID0gYnVmOworCQkJCQludW0gPSAwOworCQkJCX0gZWxzZQorCQkJCQljdXIrKzsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW4gY2FjaGUgYnJsb2NrIHJlcXVlc3RzIC0gc2ltcGx5IHJlbW92ZQorCQkJCSAqIGEgbG9jayBmcm9tIHRoZSBpbm9kZSBsaXN0LgorCQkJCSAqLworCQkJCWxpc3RfZGVsKCZsaS0+bGxpc3QpOworCQkJCWNpZnNfZGVsX2xvY2tfd2FpdGVycyhsaSk7CisJCQkJa2ZyZWUobGkpOworCQkJfQorCQl9CisJCWlmIChudW0pIHsKKwkJCXN0b3JlZF9yYyA9IGNpZnNfbG9ja3YoeGlkLCB0Y29uLCBjZmlsZS0+bmV0ZmlkLAorCQkJCQkgICAgICAgdHlwZXNbaV0sIG51bSwgMCwgYnVmKTsKKwkJCWlmIChzdG9yZWRfcmMpIHsKKwkJCQljaWZzX21vdmVfbGxpc3QoJnRtcF9sbGlzdCwgJmNpbm9kZS0+bGxpc3QpOworCQkJCXJjID0gc3RvcmVkX3JjOworCQkJfSBlbHNlCisJCQkJY2lmc19mcmVlX2xsaXN0KCZ0bXBfbGxpc3QpOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitjaWZzX3NldGxrKHN0cnVjdCBmaWxlICpmaWxlLCAgc3RydWN0IGZpbGVfbG9jayAqZmxvY2ssIF9fdTggdHlwZSwKKwkgICBib29sIHdhaXRfZmxhZywgYm9vbCBwb3NpeF9sY2ssIGludCBsb2NrLCBpbnQgdW5sb2NrLCBpbnQgeGlkKQoreworCWludCByYyA9IDA7CisJX191NjQgbGVuZ3RoID0gMSArIGZsb2NrLT5mbF9lbmQgLSBmbG9jay0+Zmxfc3RhcnQ7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY2lmc190Y29uICp0Y29uID0gdGxpbmtfdGNvbihjZmlsZS0+dGxpbmspOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUgPSBDSUZTX0koZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJX191MTYgbmV0ZmlkID0gY2ZpbGUtPm5ldGZpZDsKKworCWlmIChwb3NpeF9sY2spIHsKKwkJaW50IHBvc2l4X2xvY2tfdHlwZTsKKworCQlyYyA9IGNpZnNfcG9zaXhfbG9ja19zZXQoZmlsZSwgZmxvY2spOworCQlpZiAoIXJjIHx8IHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlpZiAodHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykKIAkJCXBvc2l4X2xvY2tfdHlwZSA9IENJRlNfUkRMQ0s7CiAJCWVsc2UKIAkJCXBvc2l4X2xvY2tfdHlwZSA9IENJRlNfV1JMQ0s7CiAKLQkJaWYgKG51bVVubG9jayA9PSAxKQorCQlpZiAodW5sb2NrID09IDEpCiAJCQlwb3NpeF9sb2NrX3R5cGUgPSBDSUZTX1VOTENLOwogCi0JCXJjID0gQ0lGU1NNQlBvc2l4TG9jayh4aWQsIHRjb24sIG5ldGZpZCwgMCAvKiBzZXQgKi8sCi0JCQkJICAgICAgbGVuZ3RoLCBwZkxvY2ssIHBvc2l4X2xvY2tfdHlwZSwKLQkJCQkgICAgICB3YWl0X2ZsYWcpOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBjaWZzRmlsZUluZm8gKmZpZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCQlpZiAobnVtTG9jaykgewotCQkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgbGVuZ3RoLAotCQkJCQkgcGZMb2NrLT5mbF9zdGFydCwgMCwgbnVtTG9jaywgbG9ja1R5cGUsCi0JCQkJCSB3YWl0X2ZsYWcsIDApOwotCi0JCQlpZiAocmMgPT0gMCkgewotCQkJCS8qIEZvciBXaW5kb3dzIGxvY2tzIHdlIG11c3Qgc3RvcmUgdGhlbS4gKi8KLQkJCQlyYyA9IHN0b3JlX2ZpbGVfbG9jayhmaWQsIGxlbmd0aCwKLQkJCQkJCXBmTG9jay0+Zmxfc3RhcnQsIGxvY2tUeXBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChudW1VbmxvY2spIHsKLQkJCS8qIEZvciBlYWNoIHN0b3JlZCBsb2NrIHRoYXQgdGhpcyB1bmxvY2sgb3ZlcmxhcHMKLQkJCSAgIGNvbXBsZXRlbHksIHVubG9jayBpdC4gKi8KLQkJCWludCBzdG9yZWRfcmMgPSAwOwotCQkJc3RydWN0IGNpZnNMb2NrSW5mbyAqbGksICp0bXA7Ci0KLQkJCXJjID0gMDsKLQkJCW11dGV4X2xvY2soJmZpZC0+bG9ja19tdXRleCk7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmZpZC0+bGxpc3QsIGxsaXN0KSB7Ci0JCQkJaWYgKHBmTG9jay0+Zmxfc3RhcnQgPD0gbGktPm9mZnNldCAmJgotCQkJCQkJKHBmTG9jay0+Zmxfc3RhcnQgKyBsZW5ndGgpID49Ci0JCQkJCQkobGktPm9mZnNldCArIGxpLT5sZW5ndGgpKSB7Ci0JCQkJCXN0b3JlZF9yYyA9IENJRlNTTUJMb2NrKHhpZCwgdGNvbiwKLQkJCQkJCQluZXRmaWQsIGxpLT5sZW5ndGgsCi0JCQkJCQkJbGktPm9mZnNldCwgMSwgMCwKLQkJCQkJCQlsaS0+dHlwZSwgZmFsc2UsIDApOwotCQkJCQlpZiAoc3RvcmVkX3JjKQotCQkJCQkJcmMgPSBzdG9yZWRfcmM7Ci0JCQkJCWVsc2UgewotCQkJCQkJbGlzdF9kZWwoJmxpLT5sbGlzdCk7Ci0JCQkJCQlrZnJlZShsaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQltdXRleF91bmxvY2soJmZpZC0+bG9ja19tdXRleCk7Ci0JCX0KKwkJcmMgPSBDSUZTU01CUG9zaXhMb2NrKHhpZCwgdGNvbiwgbmV0ZmlkLCBjdXJyZW50LT50Z2lkLAorCQkJCSAgICAgIDAgLyogc2V0ICovLCBsZW5ndGgsIGZsb2NrLAorCQkJCSAgICAgIHBvc2l4X2xvY2tfdHlwZSwgd2FpdF9mbGFnKTsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9QT1NJWCkKLQkJcG9zaXhfbG9ja19maWxlX3dhaXQoZmlsZSwgcGZMb2NrKTsKKwlpZiAobG9jaykgeworCQlzdHJ1Y3QgY2lmc0xvY2tJbmZvICpsb2NrOworCisJCWxvY2sgPSBjaWZzX2xvY2tfaW5pdChmbG9jay0+Zmxfc3RhcnQsIGxlbmd0aCwgdHlwZSwgbmV0ZmlkKTsKKwkJaWYgKCFsb2NrKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmMgPSBjaWZzX2xvY2tfYWRkX2lmKGNpbm9kZSwgbG9jaywgd2FpdF9mbGFnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWtmcmVlKGxvY2spOworCQlpZiAocmMgPD0gMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gQ0lGU1NNQkxvY2soeGlkLCB0Y29uLCBuZXRmaWQsIGN1cnJlbnQtPnRnaWQsIGxlbmd0aCwKKwkJCQkgZmxvY2stPmZsX3N0YXJ0LCAwLCAxLCB0eXBlLCB3YWl0X2ZsYWcsIDApOworCQlpZiAocmMpIHsKKwkJCWtmcmVlKGxvY2spOworCQkJZ290byBvdXQ7CisJCX0KKworCQljaWZzX2xvY2tfYWRkKGNpbm9kZSwgbG9jayk7CisJfSBlbHNlIGlmICh1bmxvY2spCisJCXJjID0gY2lmc191bmxvY2tfcmFuZ2UoY2ZpbGUsIGZsb2NrLCB4aWQpOworCitvdXQ6CisJaWYgKGZsb2NrLT5mbF9mbGFncyAmIEZMX1BPU0lYKQorCQlwb3NpeF9sb2NrX2ZpbGVfd2FpdChmaWxlLCBmbG9jayk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaykKK3sKKwlpbnQgcmMsIHhpZDsKKwlpbnQgbG9jayA9IDAsIHVubG9jayA9IDA7CisJYm9vbCB3YWl0X2ZsYWcgPSBmYWxzZTsKKwlib29sIHBvc2l4X2xjayA9IGZhbHNlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlOworCV9fdTE2IG5ldGZpZDsKKwlfX3U4IHR5cGU7CisKKwlyYyA9IC1FQUNDRVM7CisJeGlkID0gR2V0WGlkKCk7CisKKwljRllJKDEsICJMb2NrIHBhcm06IDB4JXggZmxvY2tmbGFnczogMHgleCBmbG9ja3R5cGU6IDB4JXggc3RhcnQ6ICVsbGQgIgorCQkiZW5kOiAlbGxkIiwgY21kLCBmbG9jay0+ZmxfZmxhZ3MsIGZsb2NrLT5mbF90eXBlLAorCQlmbG9jay0+Zmxfc3RhcnQsIGZsb2NrLT5mbF9lbmQpOworCisJY2lmc19yZWFkX2Zsb2NrKGZsb2NrLCAmdHlwZSwgJmxvY2ssICZ1bmxvY2ssICZ3YWl0X2ZsYWcpOworCisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CisJY2ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl0Y29uID0gdGxpbmtfdGNvbihjZmlsZS0+dGxpbmspOworCW5ldGZpZCA9IGNmaWxlLT5uZXRmaWQ7CisJY2lub2RlID0gQ0lGU19JKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCisJaWYgKCh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSAmJgorCSAgICAoQ0lGU19VTklYX0ZDTlRMX0NBUCAmIGxlNjRfdG9fY3B1KHRjb24tPmZzVW5peEluZm8uQ2FwYWJpbGl0eSkpICYmCisJICAgICgoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PUE9TSVhCUkwpID09IDApKQorCQlwb3NpeF9sY2sgPSB0cnVlOworCS8qCisJICogQkIgYWRkIGNvZGUgaGVyZSB0byBub3JtYWxpemUgb2Zmc2V0IGFuZCBsZW5ndGggdG8gYWNjb3VudCBmb3IKKwkgKiBuZWdhdGl2ZSBsZW5ndGggd2hpY2ggd2UgY2FuIG5vdCBhY2NlcHQgb3ZlciB0aGUgd2lyZS4KKwkgKi8KKwlpZiAoSVNfR0VUTEsoY21kKSkgeworCQlyYyA9IGNpZnNfZ2V0bGsoZmlsZSwgZmxvY2ssIHR5cGUsIHdhaXRfZmxhZywgcG9zaXhfbGNrLCB4aWQpOworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoIWxvY2sgJiYgIXVubG9jaykgeworCQkvKgorCQkgKiBpZiBubyBsb2NrIG9yIHVubG9jayB0aGVuIG5vdGhpbmcgdG8gZG8gc2luY2Ugd2UgZG8gbm90CisJCSAqIGtub3cgd2hhdCBpdCBpcworCQkgKi8KKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmMgPSBjaWZzX3NldGxrKGZpbGUsIGZsb2NrLCB0eXBlLCB3YWl0X2ZsYWcsIHBvc2l4X2xjaywgbG9jaywgdW5sb2NrLAorCQkJeGlkKTsKIAlGcmVlWGlkKHhpZCk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMTcxNCw2ICsyMTk1LDcgQEAKIAlzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JzcCAqcFNNQnI7CiAJc3RydWN0IGNpZnNfaW9fcGFybXMgaW9fcGFybXM7CiAJY2hhciAqcmVhZF9kYXRhOworCXVuc2lnbmVkIGludCByc2l6ZTsKIAlfX3UzMiBwaWQ7CiAKIAlpZiAoIW5yX3NlZ3MpCkBAIC0xNzI2LDYgKzIyMDgsOSBAQAogCXhpZCA9IEdldFhpZCgpOwogCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCisJLyogRklYTUU6IHNldCB1cCBoYW5kbGVycyBmb3IgbGFyZ2VyIHJlYWRzIGFuZC9vciBjb252ZXJ0IHRvIGFzeW5jICovCisJcnNpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNpZnNfc2ItPnJzaXplLCBDSUZTTWF4QnVmU2l6ZSk7CisKIAlvcGVuX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJcFRjb24gPSB0bGlua190Y29uKG9wZW5fZmlsZS0+dGxpbmspOwogCkBAIC0xNzM4LDcgKzIyMjMsNyBAQAogCQljRllJKDEsICJhdHRlbXB0aW5nIHJlYWQgb24gd3JpdGUgb25seSBmaWxlIGluc3RhbmNlIik7CiAKIAlmb3IgKHRvdGFsX3JlYWQgPSAwOyB0b3RhbF9yZWFkIDwgbGVuOyB0b3RhbF9yZWFkICs9IGJ5dGVzX3JlYWQpIHsKLQkJY3VyX2xlbiA9IG1pbl90KGNvbnN0IHNpemVfdCwgbGVuIC0gdG90YWxfcmVhZCwgY2lmc19zYi0+cnNpemUpOworCQljdXJfbGVuID0gbWluX3QoY29uc3Qgc2l6ZV90LCBsZW4gLSB0b3RhbF9yZWFkLCByc2l6ZSk7CiAJCXJjID0gLUVBR0FJTjsKIAkJcmVhZF9kYXRhID0gTlVMTDsKIApAQCAtMTgzMCw2ICsyMzE1LDcgQEAKIAl1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZCA9IDA7CiAJdW5zaWduZWQgaW50IHRvdGFsX3JlYWQ7CiAJdW5zaWduZWQgaW50IGN1cnJlbnRfcmVhZF9zaXplOworCXVuc2lnbmVkIGludCByc2l6ZTsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwogCXN0cnVjdCBjaWZzX3Rjb24gKnBUY29uOwogCWludCB4aWQ7CkBAIC0xODQyLDYgKzIzMjgsOSBAQAogCXhpZCA9IEdldFhpZCgpOwogCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCisJLyogRklYTUU6IHNldCB1cCBoYW5kbGVycyBmb3IgbGFyZ2VyIHJlYWRzIGFuZC9vciBjb252ZXJ0IHRvIGFzeW5jICovCisJcnNpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNpZnNfc2ItPnJzaXplLCBDSUZTTWF4QnVmU2l6ZSk7CisKIAlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKIAkJcmMgPSAtRUJBREY7CiAJCUZyZWVYaWQoeGlkKTsKQEAgLTE4NjEsMTQgKzIzNTAsMTQgQEAKIAlmb3IgKHRvdGFsX3JlYWQgPSAwLCBjdXJyZW50X29mZnNldCA9IHJlYWRfZGF0YTsKIAkgICAgIHJlYWRfc2l6ZSA+IHRvdGFsX3JlYWQ7CiAJICAgICB0b3RhbF9yZWFkICs9IGJ5dGVzX3JlYWQsIGN1cnJlbnRfb2Zmc2V0ICs9IGJ5dGVzX3JlYWQpIHsKLQkJY3VycmVudF9yZWFkX3NpemUgPSBtaW5fdChjb25zdCBpbnQsIHJlYWRfc2l6ZSAtIHRvdGFsX3JlYWQsCi0JCQkJCSAgY2lmc19zYi0+cnNpemUpOworCQljdXJyZW50X3JlYWRfc2l6ZSA9IG1pbl90KHVpbnQsIHJlYWRfc2l6ZSAtIHRvdGFsX3JlYWQsIHJzaXplKTsKKwogCQkvKiBGb3Igd2luZG93cyBtZSBhbmQgOXggd2UgZG8gbm90IHdhbnQgdG8gcmVxdWVzdCBtb3JlCiAJCXRoYW4gaXQgbmVnb3RpYXRlZCBzaW5jZSBpdCB3aWxsIHJlZnVzZSB0aGUgcmVhZCB0aGVuICovCiAJCWlmICgocFRjb24tPnNlcykgJiYKIAkJCSEocFRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0xBUkdFX0ZJTEVTKSkgewotCQkJY3VycmVudF9yZWFkX3NpemUgPSBtaW5fdChjb25zdCBpbnQsIGN1cnJlbnRfcmVhZF9zaXplLAotCQkJCQlwVGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtIDEyOCk7CisJCQljdXJyZW50X3JlYWRfc2l6ZSA9IG1pbl90KHVpbnQsIGN1cnJlbnRfcmVhZF9zaXplLAorCQkJCQlDSUZTTWF4QnVmU2l6ZSk7CiAJCX0KIAkJcmMgPSAtRUFHQUlOOwogCQl3aGlsZSAocmMgPT0gLUVBR0FJTikgewpAQCAtMTk1Nyw4MiArMjQ0NiwyNCBAQAogCXJldHVybiByYzsKIH0KIAotCi1zdGF0aWMgdm9pZCBjaWZzX2NvcHlfY2FjaGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0Jc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsIGludCBieXRlc19yZWFkLCBjaGFyICpkYXRhKQotewotCXN0cnVjdCBwYWdlICpwYWdlOwotCWNoYXIgKnRhcmdldDsKLQotCXdoaWxlIChieXRlc19yZWFkID4gMCkgewotCQlpZiAobGlzdF9lbXB0eShwYWdlcykpCi0JCQlicmVhazsKLQotCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlcy0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7Ci0JCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCi0JCWlmIChhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgcGFnZS0+aW5kZXgsCi0JCQkJICAgICAgR0ZQX0tFUk5FTCkpIHsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWNGWUkoMSwgIkFkZCBwYWdlIGNhY2hlIGZhaWxlZCIpOwotCQkJZGF0YSArPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCQlieXRlc19yZWFkIC09IFBBR0VfQ0FDSEVfU0laRTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQotCQl0YXJnZXQgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0KLQkJaWYgKFBBR0VfQ0FDSEVfU0laRSA+IGJ5dGVzX3JlYWQpIHsKLQkJCW1lbWNweSh0YXJnZXQsIGRhdGEsIGJ5dGVzX3JlYWQpOwotCQkJLyogemVybyB0aGUgdGFpbCBlbmQgb2YgdGhpcyBwYXJ0aWFsIHBhZ2UgKi8KLQkJCW1lbXNldCh0YXJnZXQgKyBieXRlc19yZWFkLCAwLAotCQkJICAgICAgIFBBR0VfQ0FDSEVfU0laRSAtIGJ5dGVzX3JlYWQpOwotCQkJYnl0ZXNfcmVhZCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQltZW1jcHkodGFyZ2V0LCBkYXRhLCBQQUdFX0NBQ0hFX1NJWkUpOwotCQkJYnl0ZXNfcmVhZCAtPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCX0KLQkJa3VubWFwX2F0b21pYyh0YXJnZXQsIEtNX1VTRVIwKTsKLQotCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJZGF0YSArPSBQQUdFX0NBQ0hFX1NJWkU7Ci0KLQkJLyogYWRkIHBhZ2UgdG8gRlMtQ2FjaGUgKi8KLQkJY2lmc19yZWFkcGFnZV90b19mc2NhY2hlKG1hcHBpbmctPmhvc3QsIHBhZ2UpOwotCX0KLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgY2lmc19yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VfbGlzdCwgdW5zaWduZWQgbnVtX3BhZ2VzKQogewotCWludCByYyA9IC1FQUNDRVM7Ci0JaW50IHhpZDsKLQlsb2ZmX3Qgb2Zmc2V0OwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7Ci0Jc3RydWN0IGNpZnNfdGNvbiAqcFRjb247Ci0JdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQgPSAwOwotCXVuc2lnbmVkIGludCByZWFkX3NpemUsIGk7Ci0JY2hhciAqc21iX3JlYWRfZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IHNtYl9jb21fcmVhZF9yc3AgKnBTTUJyOwotCXN0cnVjdCBjaWZzRmlsZUluZm8gKm9wZW5fZmlsZTsKLQlzdHJ1Y3QgY2lmc19pb19wYXJtcyBpb19wYXJtczsKLQlpbnQgYnVmX3R5cGUgPSBDSUZTX05PX0JVRkZFUjsKLQlfX3UzMiBwaWQ7CisJaW50IHJjOworCXN0cnVjdCBsaXN0X2hlYWQgdG1wbGlzdDsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CisJdW5zaWduZWQgaW50IHJzaXplID0gY2lmc19zYi0+cnNpemU7CisJcGlkX3QgcGlkOwogCi0JeGlkID0gR2V0WGlkKCk7Ci0JaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKSB7Ci0JCXJjID0gLUVCQURGOwotCQlGcmVlWGlkKHhpZCk7Ci0JCXJldHVybiByYzsKLQl9Ci0Jb3Blbl9maWxlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwotCXBUY29uID0gdGxpbmtfdGNvbihvcGVuX2ZpbGUtPnRsaW5rKTsKKwkvKgorCSAqIEdpdmUgdXAgaW1tZWRpYXRlbHkgaWYgcnNpemUgaXMgdG9vIHNtYWxsIHRvIHJlYWQgYW4gZW50aXJlIHBhZ2UuCisJICogVGhlIFZGUyB3aWxsIGZhbGwgYmFjayB0byByZWFkcGFnZS4gV2Ugc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMKKwkgKiBwb2ludCBob3dldmVyIHNpbmNlIHdlIHNldCByYV9wYWdlcyB0byAwIHdoZW4gdGhlIHJzaXplIGlzIHNtYWxsZXIKKwkgKiB0aGFuIGEgY2FjaGUgcGFnZS4KKwkgKi8KKwlpZiAodW5saWtlbHkocnNpemUgPCBQQUdFX0NBQ0hFX1NJWkUpKQorCQlyZXR1cm4gMDsKIAogCS8qCiAJICogUmVhZHMgYXMgbWFueSBwYWdlcyBhcyBwb3NzaWJsZSBmcm9tIGZzY2FjaGUuIFJldHVybnMgLUVOT0JVRlMKQEAgLTIwNDEsMTI1ICsyNDcyLDEyNyBAQAogCXJjID0gY2lmc19yZWFkcGFnZXNfZnJvbV9mc2NhY2hlKG1hcHBpbmctPmhvc3QsIG1hcHBpbmcsIHBhZ2VfbGlzdCwKIAkJCQkJICZudW1fcGFnZXMpOwogCWlmIChyYyA9PSAwKQotCQlnb3RvIHJlYWRfY29tcGxldGU7CisJCXJldHVybiByYzsKIAotCWNGWUkoREJHMiwgInJwYWdlczogbnVtIHBhZ2VzICVkIiwgbnVtX3BhZ2VzKTsKIAlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1JXUElERk9SV0FSRCkKIAkJcGlkID0gb3Blbl9maWxlLT5waWQ7CiAJZWxzZQogCQlwaWQgPSBjdXJyZW50LT50Z2lkOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgKSB7Ci0JCXVuc2lnbmVkIGNvbnRpZ19wYWdlczsKLQkJc3RydWN0IHBhZ2UgKnRtcF9wYWdlOwotCQl1bnNpZ25lZCBsb25nIGV4cGVjdGVkX2luZGV4OworCXJjID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmdG1wbGlzdCk7CiAKLQkJaWYgKGxpc3RfZW1wdHkocGFnZV9saXN0KSkKLQkJCWJyZWFrOworCWNGWUkoMSwgIiVzOiBmaWxlPSVwIG1hcHBpbmc9JXAgbnVtX3BhZ2VzPSV1IiwgX19mdW5jX18sIGZpbGUsCisJCW1hcHBpbmcsIG51bV9wYWdlcyk7CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggdGhlIHBhZ2UgYXQgZW5kIG9mIGxpc3QgYW5kIG1vdmUgaXQgdG8gcHJpdmF0ZQorCSAqIGxpc3QuIERvIHRoZSBzYW1lIHdpdGggYW55IGZvbGxvd2luZyBwYWdlcyB1bnRpbCB3ZSBoaXQKKwkgKiB0aGUgcnNpemUgbGltaXQsIGhpdCBhbiBpbmRleCBkaXNjb250aW51aXR5LCBvciBydW4gb3V0IG9mCisJICogcGFnZXMuIElzc3VlIHRoZSBhc3luYyByZWFkIGFuZCB0aGVuIHN0YXJ0IHRoZSBsb29wIGFnYWluCisJICogdW50aWwgdGhlIGxpc3QgaXMgZW1wdHkuCisJICoKKwkgKiBOb3RlIHRoYXQgbGlzdCBvcmRlciBpcyBpbXBvcnRhbnQuIFRoZSBwYWdlX2xpc3QgaXMgaW4KKwkgKiB0aGUgb3JkZXIgb2YgZGVjbGluaW5nIGluZGV4ZXMuIFdoZW4gd2UgcHV0IHRoZSBwYWdlcyBpbgorCSAqIHRoZSByZGF0YS0+cGFnZXMsIHRoZW4gd2Ugd2FudCB0aGVtIGluIGluY3JlYXNpbmcgb3JkZXIuCisJICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KHBhZ2VfbGlzdCkpIHsKKwkJdW5zaWduZWQgaW50IGJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFOworCQl1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfaW5kZXg7CisJCXVuc2lnbmVkIGludCBucl9wYWdlcyA9IDE7CisJCWxvZmZfdCBvZmZzZXQ7CisJCXN0cnVjdCBwYWdlICpwYWdlLCAqdHBhZ2U7CisJCXN0cnVjdCBjaWZzX3JlYWRkYXRhICpyZGF0YTsKIAogCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlX2xpc3QtPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpOwotCQlvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKLQkJLyogY291bnQgYWRqYWNlbnQgcGFnZXMgdGhhdCB3ZSB3aWxsIHJlYWQgaW50byAqLwotCQljb250aWdfcGFnZXMgPSAwOwotCQlleHBlY3RlZF9pbmRleCA9Ci0JCQlsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSktPmluZGV4OwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UodG1wX3BhZ2UsIHBhZ2VfbGlzdCwgbHJ1KSB7Ci0JCQlpZiAodG1wX3BhZ2UtPmluZGV4ID09IGV4cGVjdGVkX2luZGV4KSB7Ci0JCQkJY29udGlnX3BhZ2VzKys7Ci0JCQkJZXhwZWN0ZWRfaW5kZXgrKzsKLQkJCX0gZWxzZQotCQkJCWJyZWFrOworCQkvKgorCQkgKiBMb2NrIHRoZSBwYWdlIGFuZCBwdXQgaXQgaW4gdGhlIGNhY2hlLiBTaW5jZSBubyBvbmUgZWxzZQorCQkgKiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gdGhpcyBwYWdlLCB3ZSdyZSBzYWZlIHRvIHNpbXBseSBzZXQKKwkJICogUEdfbG9ja2VkIHdpdGhvdXQgY2hlY2tpbmcgaXQgZmlyc3QuCisJCSAqLworCQlfX3NldF9wYWdlX2xvY2tlZChwYWdlKTsKKwkJcmMgPSBhZGRfdG9fcGFnZV9jYWNoZV9sb2NrZWQocGFnZSwgbWFwcGluZywKKwkJCQkJICAgICAgcGFnZS0+aW5kZXgsIEdGUF9LRVJORUwpOworCisJCS8qIGdpdmUgdXAgaWYgd2UgY2FuJ3Qgc3RpY2sgaXQgaW4gdGhlIGNhY2hlICovCisJCWlmIChyYykgeworCQkJX19jbGVhcl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmIChjb250aWdfcGFnZXMgKyBpID4gIG51bV9wYWdlcykKLQkJCWNvbnRpZ19wYWdlcyA9IG51bV9wYWdlcyAtIGk7CiAKLQkJLyogZm9yIHJlYWRzIG92ZXIgYSBjZXJ0YWluIHNpemUgY291bGQgaW5pdGlhdGUgYXN5bmMKLQkJICAgcmVhZCBhaGVhZCAqLworCQkvKiBtb3ZlIGZpcnN0IHBhZ2UgdG8gdGhlIHRtcGxpc3QgKi8KKwkJb2Zmc2V0ID0gKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCQlsaXN0X21vdmVfdGFpbCgmcGFnZS0+bHJ1LCAmdG1wbGlzdCk7CiAKLQkJcmVhZF9zaXplID0gY29udGlnX3BhZ2VzICogUEFHRV9DQUNIRV9TSVpFOwotCQkvKiBSZWFkIHNpemUgbmVlZHMgdG8gYmUgaW4gbXVsdGlwbGVzIG9mIG9uZSBwYWdlICovCi0JCXJlYWRfc2l6ZSA9IG1pbl90KGNvbnN0IHVuc2lnbmVkIGludCwgcmVhZF9zaXplLAotCQkJCSAgY2lmc19zYi0+cnNpemUgJiBQQUdFX0NBQ0hFX01BU0spOwotCQljRllJKERCRzIsICJycGFnZXM6IHJlYWQgc2l6ZSAweCV4ICBjb250aWd1b3VzIHBhZ2VzICVkIiwKLQkJCQlyZWFkX3NpemUsIGNvbnRpZ19wYWdlcyk7Ci0JCXJjID0gLUVBR0FJTjsKLQkJd2hpbGUgKHJjID09IC1FQUdBSU4pIHsKKwkJLyogbm93IHRyeSBhbmQgYWRkIG1vcmUgcGFnZXMgb250byB0aGUgcmVxdWVzdCAqLworCQlleHBlY3RlZF9pbmRleCA9IHBhZ2UtPmluZGV4ICsgMTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocGFnZSwgdHBhZ2UsIHBhZ2VfbGlzdCwgbHJ1KSB7CisJCQkvKiBkaXNjb250aW51aXR5ID8gKi8KKwkJCWlmIChwYWdlLT5pbmRleCAhPSBleHBlY3RlZF9pbmRleCkKKwkJCQlicmVhazsKKworCQkJLyogd291bGQgdGhpcyBwYWdlIHB1c2ggdGhlIHJlYWQgb3ZlciB0aGUgcnNpemU/ICovCisJCQlpZiAoYnl0ZXMgKyBQQUdFX0NBQ0hFX1NJWkUgPiByc2l6ZSkKKwkJCQlicmVhazsKKworCQkJX19zZXRfcGFnZV9sb2NrZWQocGFnZSk7CisJCQlpZiAoYWRkX3RvX3BhZ2VfY2FjaGVfbG9ja2VkKHBhZ2UsIG1hcHBpbmcsCisJCQkJCQlwYWdlLT5pbmRleCwgR0ZQX0tFUk5FTCkpIHsKKwkJCQlfX2NsZWFyX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGlzdF9tb3ZlX3RhaWwoJnBhZ2UtPmxydSwgJnRtcGxpc3QpOworCQkJYnl0ZXMgKz0gUEFHRV9DQUNIRV9TSVpFOworCQkJZXhwZWN0ZWRfaW5kZXgrKzsKKwkJCW5yX3BhZ2VzKys7CisJCX0KKworCQlyZGF0YSA9IGNpZnNfcmVhZGRhdGFfYWxsb2MobnJfcGFnZXMpOworCQlpZiAoIXJkYXRhKSB7CisJCQkvKiBiZXN0IHRvIGdpdmUgdXAgaWYgd2UncmUgb3V0IG9mIG1lbSAqLworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhZ2UsIHRwYWdlLCAmdG1wbGlzdCwgbHJ1KSB7CisJCQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCQkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCX0KKwkJCXJjID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrKCZjaWZzX2ZpbGVfbGlzdF9sb2NrKTsKKwkJY2lmc0ZpbGVJbmZvX2dldChvcGVuX2ZpbGUpOworCQlzcGluX3VubG9jaygmY2lmc19maWxlX2xpc3RfbG9jayk7CisJCXJkYXRhLT5jZmlsZSA9IG9wZW5fZmlsZTsKKwkJcmRhdGEtPm1hcHBpbmcgPSBtYXBwaW5nOworCQlyZGF0YS0+b2Zmc2V0ID0gb2Zmc2V0OworCQlyZGF0YS0+Ynl0ZXMgPSBieXRlczsKKwkJcmRhdGEtPnBpZCA9IHBpZDsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmdG1wbGlzdCwgJnJkYXRhLT5wYWdlcyk7CisKKwkJZG8gewogCQkJaWYgKG9wZW5fZmlsZS0+aW52YWxpZEhhbmRsZSkgewogCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShvcGVuX2ZpbGUsIHRydWUpOwogCQkJCWlmIChyYyAhPSAwKQotCQkJCQlicmVhazsKKwkJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpb19wYXJtcy5uZXRmaWQgPSBvcGVuX2ZpbGUtPm5ldGZpZDsKLQkJCWlvX3Bhcm1zLnBpZCA9IHBpZDsKLQkJCWlvX3Bhcm1zLnRjb24gPSBwVGNvbjsKLQkJCWlvX3Bhcm1zLm9mZnNldCA9IG9mZnNldDsKLQkJCWlvX3Bhcm1zLmxlbmd0aCA9IHJlYWRfc2l6ZTsKLQkJCXJjID0gQ0lGU1NNQlJlYWQoeGlkLCAmaW9fcGFybXMsICZieXRlc19yZWFkLAotCQkJCQkgJnNtYl9yZWFkX2RhdGEsICZidWZfdHlwZSk7Ci0JCQkvKiBCQiBtb3JlIFJDIGNoZWNrcyA/ICovCi0JCQlpZiAocmMgPT0gLUVBR0FJTikgewotCQkJCWlmIChzbWJfcmVhZF9kYXRhKSB7Ci0JCQkJCWlmIChidWZfdHlwZSA9PSBDSUZTX1NNQUxMX0JVRkZFUikKLQkJCQkJCWNpZnNfc21hbGxfYnVmX3JlbGVhc2Uoc21iX3JlYWRfZGF0YSk7Ci0JCQkJCWVsc2UgaWYgKGJ1Zl90eXBlID09IENJRlNfTEFSR0VfQlVGRkVSKQotCQkJCQkJY2lmc19idWZfcmVsZWFzZShzbWJfcmVhZF9kYXRhKTsKLQkJCQkJc21iX3JlYWRfZGF0YSA9IE5VTEw7Ci0JCQkJfQorCQkJcmMgPSBjaWZzX2FzeW5jX3JlYWR2KHJkYXRhKTsKKwkJfSB3aGlsZSAocmMgPT0gLUVBR0FJTik7CisKKwkJaWYgKHJjICE9IDApIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCB0cGFnZSwgJnJkYXRhLT5wYWdlcywKKwkJCQkJCSBscnUpIHsKKwkJCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKKwkJCQlscnVfY2FjaGVfYWRkX2ZpbGUocGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJfQotCQl9Ci0JCWlmICgocmMgPCAwKSB8fCAoc21iX3JlYWRfZGF0YSA9PSBOVUxMKSkgewotCQkJY0ZZSSgxLCAiUmVhZCBlcnJvciBpbiByZWFkcGFnZXM6ICVkIiwgcmMpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA+IDApIHsKLQkJCXRhc2tfaW9fYWNjb3VudF9yZWFkKGJ5dGVzX3JlYWQpOwotCQkJcFNNQnIgPSAoc3RydWN0IHNtYl9jb21fcmVhZF9yc3AgKilzbWJfcmVhZF9kYXRhOwotCQkJY2lmc19jb3B5X2NhY2hlX3BhZ2VzKG1hcHBpbmcsIHBhZ2VfbGlzdCwgYnl0ZXNfcmVhZCwKLQkJCQlzbWJfcmVhZF9kYXRhICsgNCAvKiBSRkMxMDAxIGhkciAqLyArCi0JCQkJbGUxNl90b19jcHUocFNNQnItPkRhdGFPZmZzZXQpKTsKLQotCQkJaSArPSAgYnl0ZXNfcmVhZCA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQkJY2lmc19zdGF0c19ieXRlc19yZWFkKHBUY29uLCBieXRlc19yZWFkKTsKLQkJCWlmICgoYnl0ZXNfcmVhZCAmIFBBR0VfQ0FDSEVfTUFTSykgIT0gYnl0ZXNfcmVhZCkgewotCQkJCWkrKzsgLyogYWNjb3VudCBmb3IgcGFydGlhbCBwYWdlICovCi0KLQkJCQkvKiBzZXJ2ZXIgY29weSBvZiBmaWxlIGNhbiBoYXZlIHNtYWxsZXIgc2l6ZQotCQkJCSAgIHRoYW4gY2xpZW50ICovCi0JCQkJLyogQkIgZG8gd2UgbmVlZCB0byB2ZXJpZnkgdGhpcyBjb21tb24gY2FzZSA/Ci0JCQkJICAgdGhpcyBjYXNlIGlzIG9rIC0gaWYgd2UgYXJlIGF0IHNlcnZlciBFT0YKLQkJCQkgICB3ZSB3aWxsIGhpdCBpdCBvbiBuZXh0IHJlYWQgKi8KLQotCQkJCS8qIGJyZWFrOyAqLwotCQkJfQotCQl9IGVsc2UgewotCQkJY0ZZSSgxLCAiTm8gYnl0ZXMgcmVhZCAoJWQpIGF0IG9mZnNldCAlbGxkIC4gIgotCQkJCSJDbGVhbmluZyByZW1haW5pbmcgcGFnZXMgZnJvbSByZWFkYWhlYWQgbGlzdCIsCi0JCQkJYnl0ZXNfcmVhZCwgb2Zmc2V0KTsKLQkJCS8qIEJCIHR1cm4gb2ZmIGNhY2hpbmcgYW5kIGRvIG5ldyBsb29rdXAgb24KLQkJCSAgIGZpbGUgc2l6ZSBhdCBzZXJ2ZXI/ICovCisJCQljaWZzX3JlYWRkYXRhX2ZyZWUocmRhdGEpOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKHNtYl9yZWFkX2RhdGEpIHsKLQkJCWlmIChidWZfdHlwZSA9PSBDSUZTX1NNQUxMX0JVRkZFUikKLQkJCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOwotCQkJZWxzZSBpZiAoYnVmX3R5cGUgPT0gQ0lGU19MQVJHRV9CVUZGRVIpCi0JCQkJY2lmc19idWZfcmVsZWFzZShzbWJfcmVhZF9kYXRhKTsKLQkJCXNtYl9yZWFkX2RhdGEgPSBOVUxMOwotCQl9Ci0JCWJ5dGVzX3JlYWQgPSAwOwogCX0KIAotLyogbmVlZCB0byBmcmVlIHNtYl9yZWFkX2RhdGEgYnVmIGJlZm9yZSBleGl0ICovCi0JaWYgKHNtYl9yZWFkX2RhdGEpIHsKLQkJaWYgKGJ1Zl90eXBlID09IENJRlNfU01BTExfQlVGRkVSKQotCQkJY2lmc19zbWFsbF9idWZfcmVsZWFzZShzbWJfcmVhZF9kYXRhKTsKLQkJZWxzZSBpZiAoYnVmX3R5cGUgPT0gQ0lGU19MQVJHRV9CVUZGRVIpCi0JCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOwotCQlzbWJfcmVhZF9kYXRhID0gTlVMTDsKLQl9Ci0KLXJlYWRfY29tcGxldGU6Ci0JRnJlZVhpZCh4aWQpOwogCXJldHVybiByYzsKIH0KIApAQCAtMjQwOCw2ICsyODQxLDEwIEBACiAJCWNGWUkoMSwgIk9wbG9jayBmbHVzaCBpbm9kZSAlcCByYyAlZCIsIGlub2RlLCByYyk7CiAJfQogCisJcmMgPSBjaWZzX3B1c2hfbG9ja3MoY2ZpbGUpOworCWlmIChyYykKKwkJY0VSUk9SKDEsICJQdXNoIGxvY2tzIHJjID0gJWQiLCByYyk7CisKIAkvKgogCSAqIHJlbGVhc2luZyBzdGFsZSBvcGxvY2sgYWZ0ZXIgcmVjZW50IHJlY29ubmVjdCBvZiBzbWIgc2Vzc2lvbiB1c2luZwogCSAqIGEgbm93IGluY29ycmVjdCBmaWxlIGhhbmRsZSBpcyBub3QgYSBkYXRhIGludGVncml0eSBpc3N1ZSBidXQgZG8KQEAgLTI0MTUsOCArMjg1Miw5IEBACiAJICogZGlzY29ubmVjdGVkIHNpbmNlIG9wbG9jayBhbHJlYWR5IHJlbGVhc2VkIGJ5IHRoZSBzZXJ2ZXIKIAkgKi8KIAlpZiAoIWNmaWxlLT5vcGxvY2tfYnJlYWtfY2FuY2VsbGVkKSB7Ci0JCXJjID0gQ0lGU1NNQkxvY2soMCwgdGxpbmtfdGNvbihjZmlsZS0+dGxpbmspLCBjZmlsZS0+bmV0ZmlkLCAwLAotCQkJCSAwLCAwLCAwLCBMT0NLSU5HX0FORFhfT1BMT0NLX1JFTEVBU0UsIGZhbHNlLAorCQlyYyA9IENJRlNTTUJMb2NrKDAsIHRsaW5rX3Rjb24oY2ZpbGUtPnRsaW5rKSwgY2ZpbGUtPm5ldGZpZCwKKwkJCQkgY3VycmVudC0+dGdpZCwgMCwgMCwgMCwgMCwKKwkJCQkgTE9DS0lOR19BTkRYX09QTE9DS19SRUxFQVNFLCBmYWxzZSwKIAkJCQkgY2lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPyAxIDogMCk7CiAJCWNGWUkoMSwgIk9wbG9jayByZWxlYXNlIHJjID0gJWQiLCByYyk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9pbm9kZS5jIGIvZnMvY2lmcy9pbm9kZS5jCmluZGV4IGE3YjJkY2QuLmU4NTFkNWIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvaW5vZGUuYworKysgYi9mcy9jaWZzL2lub2RlLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCWlub2RlLT5pX210aW1lID0gZmF0dHItPmNmX210aW1lOwogCWlub2RlLT5pX2N0aW1lID0gZmF0dHItPmNmX2N0aW1lOwogCWlub2RlLT5pX3JkZXYgPSBmYXR0ci0+Y2ZfcmRldjsKLQlpbm9kZS0+aV9ubGluayA9IGZhdHRyLT5jZl9ubGluazsKKwlzZXRfbmxpbmsoaW5vZGUsIGZhdHRyLT5jZl9ubGluayk7CiAJaW5vZGUtPmlfdWlkID0gZmF0dHItPmNmX3VpZDsKIAlpbm9kZS0+aV9naWQgPSBmYXR0ci0+Y2ZfZ2lkOwogCkBAIC01NjIsNyArNTYyLDE2IEBACiAKIAl4aWQgPSBHZXRYaWQoKTsKIAlyYyA9IENJRlNTTUJRRmlsZUluZm8oeGlkLCB0Y29uLCBjZmlsZS0+bmV0ZmlkLCAmZmluZF9kYXRhKTsKLQlpZiAocmMgPT0gLUVPUE5PVFNVUFAgfHwgcmMgPT0gLUVJTlZBTCkgeworCXN3aXRjaCAocmMpIHsKKwljYXNlIDA6CisJCWNpZnNfYWxsX2luZm9fdG9fZmF0dHIoJmZhdHRyLCAmZmluZF9kYXRhLCBjaWZzX3NiLCBmYWxzZSk7CisJCWJyZWFrOworCWNhc2UgLUVSRU1PVEU6CisJCWNpZnNfY3JlYXRlX2Rmc19mYXR0cigmZmF0dHIsIGlub2RlLT5pX3NiKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwljYXNlIC1FT1BOT1RTVVBQOgorCWNhc2UgLUVJTlZBTDoKIAkJLyoKIAkJICogRklYTUU6IGxlZ2FjeSBzZXJ2ZXIgLS0gZmFsbCBiYWNrIHRvIHBhdGgtYmFzZWQgY2FsbD8KIAkJICogZm9yIG5vdywganVzdCBza2lwIHJldmFsaWRhdGluZyBhbmQgbWFyayBpbm9kZSBmb3IKQEAgLTU3MCwxOCArNTc5LDE0IEBACiAJCSAqLwogCQlyYyA9IDA7CiAJCUNJRlNfSShpbm9kZSktPnRpbWUgPSAwOworCWRlZmF1bHQ6CiAJCWdvdG8gY2dmaV9leGl0OwotCX0gZWxzZSBpZiAocmMgPT0gLUVSRU1PVEUpIHsKLQkJY2lmc19jcmVhdGVfZGZzX2ZhdHRyKCZmYXR0ciwgaW5vZGUtPmlfc2IpOwotCQlyYyA9IDA7Ci0JfSBlbHNlIGlmIChyYykKLQkJZ290byBjZ2ZpX2V4aXQ7CisJfQogCiAJLyoKIAkgKiBkb24ndCBib3RoZXIgd2l0aCBTRlUganVuayBoZXJlIC0tIGp1c3QgbWFyayBpbm9kZSBhcyBuZWVkaW5nCiAJICogcmV2YWxpZGF0aW9uLgogCSAqLwotCWNpZnNfYWxsX2luZm9fdG9fZmF0dHIoJmZhdHRyLCAmZmluZF9kYXRhLCBjaWZzX3NiLCBmYWxzZSk7CiAJZmF0dHIuY2ZfdW5pcXVlaWQgPSBDSUZTX0koaW5vZGUpLT51bmlxdWVpZDsKIAlmYXR0ci5jZl9mbGFncyB8PSBDSUZTX0ZBVFRSX05FRURfUkVWQUw7CiAJY2lmc19mYXR0cl90b19pbm9kZShpbm9kZSwgJmZhdHRyKTsKQEAgLTkwMCw3ICs5MDUsNyBAQAogCWlmIChyYyAmJiB0Y29uLT5pcGMpIHsKIAkJY0ZZSSgxLCAiaXBjIGNvbm5lY3Rpb24gLSBmYWtlIHJlYWQgaW5vZGUiKTsKIAkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOwotCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCXNldF9ubGluayhpbm9kZSwgMik7CiAJCWlub2RlLT5pX29wID0gJmNpZnNfaXBjX2lub2RlX29wczsKIAkJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAkJaW5vZGUtPmlfdWlkID0gY2lmc19zYi0+bW50X3VpZDsKQEAgLTEzNjIsNyArMTM2Nyw3IEBACiAJCSAvKiBzZXR0aW5nIG5saW5rIG5vdCBuZWNlc3NhcnkgZXhjZXB0IGluIGNhc2VzIHdoZXJlIHdlCiAJCSAgKiBmYWlsZWQgdG8gZ2V0IGl0IGZyb20gdGhlIHNlcnZlciBvciB3YXMgc2V0IGJvZ3VzICovCiAJCWlmICgoZGlyZW50cnktPmRfaW5vZGUpICYmIChkaXJlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA8IDIpKQotCQkJCWRpcmVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gMjsKKwkJCXNldF9ubGluayhkaXJlbnRyeS0+ZF9pbm9kZSwgMik7CiAKIAkJbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCQkvKiBtdXN0IHR1cm4gb24gc2V0Z2lkIGJpdCBpZiBwYXJlbnQgZGlyIGhhcyBpdCAqLwpAQCAtMjA5Niw2ICsyMTAxLDggQEAKIGNpZnNfc2V0YXR0cl9ub3VuaXgoc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cnMpCiB7CiAJaW50IHhpZDsKKwl1aWRfdCB1aWQgPSBOT19DSEFOR0VfMzI7CisJZ2lkX3QgZ2lkID0gTk9fQ0hBTkdFXzMyOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkaXJlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZSA9IENJRlNfSShpbm9kZSk7CkBAIC0yMTQ2LDEzICsyMTUzLDI1IEBACiAJCQlnb3RvIGNpZnNfc2V0YXR0cl9leGl0OwogCX0KIAotCS8qCi0JICogV2l0aG91dCB1bml4IGV4dGVuc2lvbnMgd2UgY2FuJ3Qgc2VuZCBvd25lcnNoaXAgY2hhbmdlcyB0byB0aGUKLQkgKiBzZXJ2ZXIsIHNvIHNpbGVudGx5IGlnbm9yZSB0aGVtLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cKLQkgKiBsb2NhbCBET1MvV2luZG93cyBmaWxlc3lzdGVtcyBiZWhhdmUgKFZGQVQsIE5URlMsIGV0YykuIFdpdGgKLQkgKiBDSUZTQUNMIHN1cHBvcnQgKyBwcm9wZXIgV2luZG93cyB0byBVbml4IGlkbWFwcGluZywgd2UgbWF5IGJlCi0JICogYWJsZSB0byBzdXBwb3J0IHRoaXMgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9VSUQpCisJCXVpZCA9IGF0dHJzLT5pYV91aWQ7CisKKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9HSUQpCisJCWdpZCA9IGF0dHJzLT5pYV9naWQ7CisKKyNpZmRlZiBDT05GSUdfQ0lGU19BQ0wKKwlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0NJRlNfQUNMKSB7CisJCWlmICh1aWQgIT0gTk9fQ0hBTkdFXzMyIHx8IGdpZCAhPSBOT19DSEFOR0VfMzIpIHsKKwkJCXJjID0gaWRfbW9kZV90b19jaWZzX2FjbChpbm9kZSwgZnVsbF9wYXRoLCBOT19DSEFOR0VfNjQsCisJCQkJCQkJdWlkLCBnaWQpOworCQkJaWYgKHJjKSB7CisJCQkJY0ZZSSgxLCAiJXM6IFNldHRpbmcgaWQgZmFpbGVkIHdpdGggZXJyb3I6ICVkIiwKKwkJCQkJX19mdW5jX18sIHJjKTsKKwkJCQlnb3RvIGNpZnNfc2V0YXR0cl9leGl0OworCQkJfQorCQl9CisJfSBlbHNlCisjZW5kaWYgLyogQ09ORklHX0NJRlNfQUNMICovCiAJaWYgKCEoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFVF9VSUQpKQogCQlhdHRycy0+aWFfdmFsaWQgJj0gfihBVFRSX1VJRCB8IEFUVFJfR0lEKTsKIApAQCAtMjE2MSwxNSArMjE4MCwxMiBAQAogCQlhdHRycy0+aWFfdmFsaWQgJj0gfkFUVFJfTU9ERTsKIAogCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKLQkJY0ZZSSgxLCAiTW9kZSBjaGFuZ2VkIHRvIDAlbyIsIGF0dHJzLT5pYV9tb2RlKTsKIAkJbW9kZSA9IGF0dHJzLT5pYV9tb2RlOwotCX0KLQotCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKIAkJcmMgPSAwOwogI2lmZGVmIENPTkZJR19DSUZTX0FDTAogCQlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0NJRlNfQUNMKSB7Ci0JCQlyYyA9IG1vZGVfdG9fY2lmc19hY2woaW5vZGUsIGZ1bGxfcGF0aCwgbW9kZSk7CisJCQlyYyA9IGlkX21vZGVfdG9fY2lmc19hY2woaW5vZGUsIGZ1bGxfcGF0aCwgbW9kZSwKKwkJCQkJCU5PX0NIQU5HRV8zMiwgTk9fQ0hBTkdFXzMyKTsKIAkJCWlmIChyYykgewogCQkJCWNGWUkoMSwgIiVzOiBTZXR0aW5nIEFDTCBmYWlsZWQgd2l0aCBlcnJvcjogJWQiLAogCQkJCQlfX2Z1bmNfXywgcmMpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9saW5rLmMgYi9mcy9jaWZzL2xpbmsuYwppbmRleCBkYjNmMThjLi42YjBlMDY0IDEwMDY0NAotLS0gYS9mcy9jaWZzL2xpbmsuYworKysgYi9mcy9jaWZzL2xpbmsuYwpAQCAtMTgzLDE0ICsxODMsMjAgQEAKIHN0YXRpYyBpbnQKIENJRlNDcmVhdGVNRlN5bUxpbmsoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKIAkJICAgIGNvbnN0IGNoYXIgKmZyb21OYW1lLCBjb25zdCBjaGFyICp0b05hbWUsCi0JCSAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UsIGludCByZW1hcCkKKwkJICAgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCiB7CiAJaW50IHJjOwogCWludCBvcGxvY2sgPSAwOworCWludCByZW1hcDsKKwlpbnQgY3JlYXRlX29wdGlvbnMgPSBDUkVBVEVfTk9UX0RJUjsKIAlfX3UxNiBuZXRmaWQgPSAwOwogCXU4ICpidWY7CiAJdW5zaWduZWQgaW50IGJ5dGVzX3dyaXR0ZW4gPSAwOwogCXN0cnVjdCBjaWZzX2lvX3Bhcm1zIGlvX3Bhcm1zOworCXN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZTsKKworCW5sc19jb2RlcGFnZSA9IGNpZnNfc2ItPmxvY2FsX25sczsKKwlyZW1hcCA9IGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFI7CiAKIAlidWYgPSBrbWFsbG9jKENJRlNfTUZfU1lNTElOS19GSUxFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQpAQCAtMjAyLDggKzIwOCwxMSBAQAogCQlyZXR1cm4gcmM7CiAJfQogCisJaWYgKGJhY2t1cF9jcmVkKGNpZnNfc2IpKQorCQljcmVhdGVfb3B0aW9ucyB8PSBDUkVBVEVfT1BFTl9CQUNLVVBfSU5URU5UOworCiAJcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIGZyb21OYW1lLCBGSUxFX0NSRUFURSwgR0VORVJJQ19XUklURSwKLQkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKKwkJCSBjcmVhdGVfb3B0aW9ucywgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKIAkJCSBubHNfY29kZXBhZ2UsIHJlbWFwKTsKIAlpZiAocmMgIT0gMCkgewogCQlrZnJlZShidWYpOwpAQCAtNDI0LDcgKzQzMyw3IEBACiAJaWYgKG9sZF9maWxlLT5kX2lub2RlKSB7CiAJCWNpZnNJbm9kZSA9IENJRlNfSShvbGRfZmlsZS0+ZF9pbm9kZSk7CiAJCWlmIChyYyA9PSAwKSB7Ci0JCQlvbGRfZmlsZS0+ZF9pbm9kZS0+aV9ubGluaysrOworCQkJaW5jX25saW5rKG9sZF9maWxlLT5kX2lub2RlKTsKIC8qIEJCIHNob3VsZCB3ZSBtYWtlIHRoaXMgY29udGluZ2VudCBvbiBzdXBlcmJsb2NrIGZsYWcgTk9BVElNRT8gKi8KIC8qCQkJb2xkX2ZpbGUtPmRfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ki8KIAkJCS8qIHBhcmVudCBkaXIgdGltZXN0YW1wcyB3aWxsIHVwZGF0ZSBmcm9tIHNydgpAQCAtNTU5LDkgKzU2OCw3IEBACiAJLyogQkIgd2hhdCBpZiBERlMgYW5kIHRoaXMgdm9sdW1lIGlzIG9uIGRpZmZlcmVudCBzaGFyZT8gQkIgKi8KIAlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01GX1NZTUxJTktTKQogCQlyYyA9IENJRlNDcmVhdGVNRlN5bUxpbmsoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBzeW1uYW1lLAotCQkJCQkgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJCQkgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCQkJCQljaWZzX3NiKTsKIAllbHNlIGlmIChwVGNvbi0+dW5peF9leHQpCiAJCXJjID0gQ0lGU1VuaXhDcmVhdGVTeW1MaW5rKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgc3ltbmFtZSwKIAkJCQkJICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbWlzYy5jIGIvZnMvY2lmcy9taXNjLmMKaW5kZXggN2MxNjkzMy4uNzAzZWY1YyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9taXNjLmMKKysrIGIvZnMvY2lmcy9taXNjLmMKQEAgLTQyMCwxOSArNDIwLDIyIEBACiB9CiAKIGludAotY2hlY2tTTUIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQorY2hlY2tTTUIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkLCB1bnNpZ25lZCBpbnQgdG90YWxfcmVhZCkKIHsKLQlfX3UzMiBsZW4gPSBiZTMyX3RvX2NwdShzbWItPnNtYl9idWZfbGVuZ3RoKTsKKwlfX3UzMiByZmNsZW4gPSBiZTMyX3RvX2NwdShzbWItPnNtYl9idWZfbGVuZ3RoKTsKIAlfX3UzMiBjbGNfbGVuOyAgLyogY2FsY3VsYXRlZCBsZW5ndGggKi8KLQljRllJKDAsICJjaGVja1NNQiBMZW5ndGg6IDB4JXgsIHNtYl9idWZfbGVuZ3RoOiAweCV4IiwgbGVuZ3RoLCBsZW4pOworCWNGWUkoMCwgImNoZWNrU01CIExlbmd0aDogMHgleCwgc21iX2J1Zl9sZW5ndGg6IDB4JXgiLAorCQl0b3RhbF9yZWFkLCByZmNsZW4pOwogCi0JaWYgKGxlbmd0aCA8IDIgKyBzaXplb2Yoc3RydWN0IHNtYl9oZHIpKSB7Ci0JCWlmICgobGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgc21iX2hkcikgLSAxKQorCS8qIGlzIHRoaXMgZnJhbWUgdG9vIHNtYWxsIHRvIGV2ZW4gZ2V0IHRvIGEgQkNDPyAqLworCWlmICh0b3RhbF9yZWFkIDwgMiArIHNpemVvZihzdHJ1Y3Qgc21iX2hkcikpIHsKKwkJaWYgKCh0b3RhbF9yZWFkID49IHNpemVvZihzdHJ1Y3Qgc21iX2hkcikgLSAxKQogCQkJICAgICYmIChzbWItPlN0YXR1cy5DaWZzRXJyb3IgIT0gMCkpIHsKKwkJCS8qIGl0J3MgYW4gZXJyb3IgcmV0dXJuICovCiAJCQlzbWItPldvcmRDb3VudCA9IDA7CiAJCQkvKiBzb21lIGVycm9yIGNhc2VzIGRvIG5vdCByZXR1cm4gd2N0IGFuZCBiY2MgKi8KIAkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKChsZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArIDEpICYmCisJCX0gZWxzZSBpZiAoKHRvdGFsX3JlYWQgPT0gc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArIDEpICYmCiAJCQkJKHNtYi0+V29yZENvdW50ID09IDApKSB7CiAJCQljaGFyICp0bXAgPSAoY2hhciAqKXNtYjsKIAkJCS8qIE5lZWQgdG8gd29yayBhcm91bmQgYSBidWcgaW4gdHdvIHNlcnZlcnMgaGVyZSAqLwpAQCAtNDUyLDM5ICs0NTUsMzUgQEAKIAkJfSBlbHNlIHsKIAkJCWNFUlJPUigxLCAiTGVuZ3RoIGxlc3MgdGhhbiBzbWIgaGVhZGVyIHNpemUiKTsKIAkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGxlbiA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0KSB7Ci0JCWNFUlJPUigxLCAic21iIGxlbmd0aCBncmVhdGVyIHRoYW4gTWF4QnVmU2l6ZSwgbWlkPSVkIiwKLQkJCQkgICBzbWItPk1pZCk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKKwkvKiBvdGhlcndpc2UsIHRoZXJlIGlzIGVub3VnaCB0byBnZXQgdG8gdGhlIEJDQyAqLwogCWlmIChjaGVja19zbWJfaGRyKHNtYiwgbWlkKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiAtRUlPOwogCWNsY19sZW4gPSBzbWJDYWxjU2l6ZShzbWIpOwogCi0JaWYgKDQgKyBsZW4gIT0gbGVuZ3RoKSB7CisJaWYgKDQgKyByZmNsZW4gIT0gdG90YWxfcmVhZCkgewogCQljRVJST1IoMSwgIkxlbmd0aCByZWFkIGRvZXMgbm90IG1hdGNoIFJGQzEwMDEgbGVuZ3RoICVkIiwKLQkJCSAgIGxlbik7Ci0JCXJldHVybiAxOworCQkJCXJmY2xlbik7CisJCXJldHVybiAtRUlPOwogCX0KIAotCWlmICg0ICsgbGVuICE9IGNsY19sZW4pIHsKKwlpZiAoNCArIHJmY2xlbiAhPSBjbGNfbGVuKSB7CiAJCS8qIGNoZWNrIGlmIGJjYyB3cmFwcGVkIGFyb3VuZCBmb3IgbGFyZ2UgcmVhZCByZXNwb25zZXMgKi8KLQkJaWYgKChsZW4gPiA2NCAqIDEwMjQpICYmIChsZW4gPiBjbGNfbGVuKSkgeworCQlpZiAoKHJmY2xlbiA+IDY0ICogMTAyNCkgJiYgKHJmY2xlbiA+IGNsY19sZW4pKSB7CiAJCQkvKiBjaGVjayBpZiBsZW5ndGhzIG1hdGNoIG1vZCA2NEsgKi8KLQkJCWlmICgoKDQgKyBsZW4pICYgMHhGRkZGKSA9PSAoY2xjX2xlbiAmIDB4RkZGRikpCisJCQlpZiAoKCg0ICsgcmZjbGVuKSAmIDB4RkZGRikgPT0gKGNsY19sZW4gJiAweEZGRkYpKQogCQkJCXJldHVybiAwOyAvKiBiY2Mgd3JhcHBlZCAqLwogCQl9CiAJCWNGWUkoMSwgIkNhbGN1bGF0ZWQgc2l6ZSAldSB2cyBsZW5ndGggJXUgbWlzbWF0Y2ggZm9yIG1pZD0ldSIsCi0JCQkJY2xjX2xlbiwgNCArIGxlbiwgc21iLT5NaWQpOworCQkJCWNsY19sZW4sIDQgKyByZmNsZW4sIHNtYi0+TWlkKTsKIAotCQlpZiAoNCArIGxlbiA8IGNsY19sZW4pIHsKKwkJaWYgKDQgKyByZmNsZW4gPCBjbGNfbGVuKSB7CiAJCQljRVJST1IoMSwgIlJGQzEwMDEgc2l6ZSAldSBzbWFsbGVyIHRoYW4gU01CIGZvciBtaWQ9JXUiLAotCQkJCQlsZW4sIHNtYi0+TWlkKTsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYgKGxlbiA+IGNsY19sZW4gKyA1MTIpIHsKKwkJCQkJcmZjbGVuLCBzbWItPk1pZCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIGlmIChyZmNsZW4gPiBjbGNfbGVuICsgNTEyKSB7CiAJCQkvKgogCQkJICogU29tZSBzZXJ2ZXJzIChXaW5kb3dzIFhQIGluIHBhcnRpY3VsYXIpIHNlbmQgbW9yZQogCQkJICogZGF0YSB0aGFuIHRoZSBsZW5ndGhzIGluIHRoZSBTTUIgcGFja2V0IHdvdWxkCkBAIC00OTUsOCArNDk0LDggQEAKIAkJCSAqIGRhdGEgdG8gNTEyIGJ5dGVzLgogCQkJICovCiAJCQljRVJST1IoMSwgIlJGQzEwMDEgc2l6ZSAldSBtb3JlIHRoYW4gNTEyIGJ5dGVzIGxhcmdlciAiCi0JCQkJICAidGhhbiBTTUIgZm9yIG1pZD0ldSIsIGxlbiwgc21iLT5NaWQpOwotCQkJcmV0dXJuIDE7CisJCQkJICAidGhhbiBTTUIgZm9yIG1pZD0ldSIsIHJmY2xlbiwgc21iLT5NaWQpOworCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC02NzYsMyArNjc1LDE4IEBACiAJCWNpbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gZmFsc2U7CiAJfQogfQorCitib29sCitiYWNrdXBfY3JlZChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQoreworCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfQ0lGU19CQUNLVVBVSUQpIHsKKwkJaWYgKGNpZnNfc2ItPm1udF9iYWNrdXB1aWQgPT0gY3VycmVudF9mc3VpZCgpKQorCQkJcmV0dXJuIHRydWU7CisJfQorCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfQ0lGU19CQUNLVVBHSUQpIHsKKwkJaWYgKGluX2dyb3VwX3AoY2lmc19zYi0+bW50X2JhY2t1cGdpZCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9mcy9jaWZzL3Nlc3MuYyBiL2ZzL2NpZnMvc2Vzcy5jCmluZGV4IGQzZTYxOTYuLjRlYzNlZTkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvc2Vzcy5jCisrKyBiL2ZzL2NpZnMvc2Vzcy5jCkBAIC0xMjQsNyArMTI0LDkgQEAKIAkvKgl0aGF0IHdlIHVzZSBpbiBuZXh0IGZldyBsaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCS8qIE5vdGUgdGhhdCBoZWFkZXIgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyBpbiBoZWFkZXJfYXNzZW1ibGUgKi8KIAlwU01CLT5yZXEuQW5kWENvbW1hbmQgPSAweEZGOwotCXBTTUItPnJlcS5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heEJ1Zik7CisJcFNNQi0+cmVxLk1heEJ1ZmZlclNpemUgPSBjcHVfdG9fbGUxNihtaW5fdCh1MzIsCisJCQkJCUNJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0LAorCQkJCQlVU0hSVF9NQVgpKTsKIAlwU01CLT5yZXEuTWF4TXB4Q291bnQgPSBjcHVfdG9fbGUxNihzZXMtPnNlcnZlci0+bWF4UmVxKTsKIAlwU01CLT5yZXEuVmNOdW1iZXIgPSBnZXRfbmV4dF92Y251bShzZXMpOwogCkBAIC02ODEsNyArNjgzLDcgQEAKIAkJCWNwdV90b19sZTE2KENJRlNfQVVUSF9SRVNQX1NJWkUpOwogCiAJCS8qIGNhbGN1bGF0ZSBudGxtIHJlc3BvbnNlIGFuZCBzZXNzaW9uIGtleSAqLwotCQlyYyA9IHNldHVwX250bG1fcmVzcG9uc2Uoc2VzKTsKKwkJcmMgPSBzZXR1cF9udGxtX3Jlc3BvbnNlKHNlcywgbmxzX2NwKTsKIAkJaWYgKHJjKSB7CiAJCQljRVJST1IoMSwgIkVycm9yICVkIGR1cmluZyBOVExNIGF1dGhlbnRpY2F0aW9uIiwgcmMpOwogCQkJZ290byBzc2V0dXBfZXhpdDsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvc21iZW5jcnlwdC5jIGIvZnMvY2lmcy9zbWJlbmNyeXB0LmMKaW5kZXggNDJiOWZmZi4uN2NhY2JhMSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9zbWJlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9zbWJlbmNyeXB0LmMKQEAgLTE5OSwxNjAgKzE5OSwzNiBAQAogCXJldHVybiByYzsKIH0KIAotLyogUm91dGluZXMgZm9yIFdpbmRvd3MgTlQgTUQ0IEhhc2ggZnVuY3Rpb25zLiAqLwotc3RhdGljIGludAotX215X3djc2xlbihfX3UxNiAqc3RyKQotewotCWludCBsZW4gPSAwOwotCXdoaWxlICgqc3RyKysgIT0gMCkKLQkJbGVuKys7Ci0JcmV0dXJuIGxlbjsKLX0KLQotLyoKLSAqIENvbnZlcnQgYSBzdHJpbmcgaW50byBhbiBOVCBVTklDT0RFIHN0cmluZy4KLSAqIE5vdGUgdGhhdCByZWdhcmRsZXNzIG9mIHByb2Nlc3NvciB0eXBlCi0gKiB0aGlzIG11c3QgYmUgaW4gaW50ZWwgKGxpdHRsZS1lbmRpYW4pCi0gKiBmb3JtYXQuCi0gKi8KLQotc3RhdGljIGludAotX215X21ic3Rvd2NzKF9fdTE2ICpkc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKLXsJLyogQkIgbm90IGEgdmVyeSBnb29kIGNvbnZlcnNpb24gcm91dGluZSAtIGNoYW5nZS9maXggKi8KLQlpbnQgaTsKLQlfX3UxNiB2YWw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJdmFsID0gKnNyYzsKLQkJU1NWQUwoZHN0LCAwLCB2YWwpOwotCQlkc3QrKzsKLQkJc3JjKys7Ci0JCWlmICh2YWwgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gaTsKLX0KLQogLyoKICAqIENyZWF0ZXMgdGhlIE1ENCBIYXNoIG9mIHRoZSB1c2VycyBwYXNzd29yZCBpbiBOVCBVTklDT0RFLgogICovCiAKIGludAotRV9tZDRoYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqcDE2KQorRV9tZDRoYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqcDE2LAorCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKmNvZGVwYWdlKQogewogCWludCByYzsKIAlpbnQgbGVuOwogCV9fdTE2IHdwd2RbMTI5XTsKIAogCS8qIFBhc3N3b3JkIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAxMjggY2hhcmFjdGVycyAqLwotCWlmIChwYXNzd2QpIHsKLQkJbGVuID0gc3RybGVuKChjaGFyICopIHBhc3N3ZCk7Ci0JCWlmIChsZW4gPiAxMjgpCi0JCQlsZW4gPSAxMjg7Ci0KLQkJLyogUGFzc3dvcmQgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gTlQgdW5pY29kZSAqLwotCQlfbXlfbWJzdG93Y3Mod3B3ZCwgcGFzc3dkLCBsZW4pOwotCX0gZWxzZQorCWlmIChwYXNzd2QpIC8qIFBhc3N3b3JkIG11c3QgYmUgY29udmVydGVkIHRvIE5UIHVuaWNvZGUgKi8KKwkJbGVuID0gY2lmc19zdHJ0b1VDUyh3cHdkLCBwYXNzd2QsIDEyOCwgY29kZXBhZ2UpOworCWVsc2UgewogCQlsZW4gPSAwOworCQkqd3B3ZCA9IDA7IC8qIEVuc3VyZSBzdHJpbmcgaXMgbnVsbCB0ZXJtaW5hdGVkICovCisJfQogCi0Jd3B3ZFtsZW5dID0gMDsJLyogRW5zdXJlIHN0cmluZyBpcyBudWxsIHRlcm1pbmF0ZWQgKi8KLQkvKiBDYWxjdWxhdGUgbGVuZ3RoIGluIGJ5dGVzICovCi0JbGVuID0gX215X3djc2xlbih3cHdkKSAqIHNpemVvZihfX3UxNik7Ci0KLQlyYyA9IG1kZm91cihwMTYsICh1bnNpZ25lZCBjaGFyICopIHdwd2QsIGxlbik7Ci0JbWVtc2V0KHdwd2QsIDAsIDEyOSAqIDIpOworCXJjID0gbWRmb3VyKHAxNiwgKHVuc2lnbmVkIGNoYXIgKikgd3B3ZCwgbGVuICogc2l6ZW9mKF9fdTE2KSk7CisJbWVtc2V0KHdwd2QsIDAsIDEyOSAqIHNpemVvZihfX3UxNikpOwogCiAJcmV0dXJuIHJjOwogfQogCi0jaWYgMCAvKiBjdXJyZW50bHkgdW51c2VkICovCi0vKiBEb2VzIGJvdGggdGhlIE5UIGFuZCBMTSBvd2ZzIG9mIGEgdXNlcidzIHBhc3N3b3JkICovCi1zdGF0aWMgdm9pZAotbnRfbG1fb3dmX2dlbihjaGFyICpwd2QsIHVuc2lnbmVkIGNoYXIgbnRfcDE2WzE2XSwgdW5zaWduZWQgY2hhciBwMTZbMTZdKQotewotCWNoYXIgcGFzc3dkWzUxNF07Ci0KLQltZW1zZXQocGFzc3dkLCAnXDAnLCA1MTQpOwotCWlmIChzdHJsZW4ocHdkKSA8IDUxMykKLQkJc3RyY3B5KHBhc3N3ZCwgcHdkKTsKLQllbHNlCi0JCW1lbWNweShwYXNzd2QsIHB3ZCwgNTEyKTsKLQkvKiBDYWxjdWxhdGUgdGhlIE1ENCBoYXNoIChOVCBjb21wYXRpYmxlKSBvZiB0aGUgcGFzc3dvcmQgKi8KLQltZW1zZXQobnRfcDE2LCAnXDAnLCAxNik7Ci0JRV9tZDRoYXNoKHBhc3N3ZCwgbnRfcDE2KTsKLQotCS8qIE1hbmdsZSB0aGUgcGFzc3dvcmRzIGludG8gTGFubWFuIGZvcm1hdCAqLwotCXBhc3N3ZFsxNF0gPSAnXDAnOwotLyoJc3RydXBwZXIocGFzc3dkKTsgKi8KLQotCS8qIENhbGN1bGF0ZSB0aGUgU01CIChsYW5tYW4pIGhhc2ggZnVuY3Rpb25zIG9mIHRoZSBwYXNzd29yZCAqLwotCi0JbWVtc2V0KHAxNiwgJ1wwJywgMTYpOwotCUVfUDE2KCh1bnNpZ25lZCBjaGFyICopIHBhc3N3ZCwgKHVuc2lnbmVkIGNoYXIgKikgcDE2KTsKLQotCS8qIGNsZWFyIG91dCBsb2NhbCBjb3B5IG9mIHVzZXIncyBwYXNzd29yZCAoanVzdCBiZWluZyBwYXJhbm9pZCkuICovCi0JbWVtc2V0KHBhc3N3ZCwgJ1wwJywgc2l6ZW9mKHBhc3N3ZCkpOwotfQotI2VuZGlmCi0KLS8qIERvZXMgdGhlIE5UTE12MiBvd2ZzIG9mIGEgdXNlcidzIHBhc3N3b3JkICovCi0jaWYgMCAgLyogZnVuY3Rpb24gbm90IG5lZWRlZCB5ZXQgLSBidXQgd2lsbCBiZSBzb29uICovCi1zdGF0aWMgdm9pZAotbnR2Ml9vd2ZfZ2VuKGNvbnN0IHVuc2lnbmVkIGNoYXIgb3dmWzE2XSwgY29uc3QgY2hhciAqdXNlcl9uLAotCQljb25zdCBjaGFyICpkb21haW5fbiwgdW5zaWduZWQgY2hhciBrcl9idWZbMTZdLAotCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCi17Ci0Jd2NoYXJfdCAqdXNlcl91OwotCXdjaGFyX3QgKmRvbV91OwotCWludCB1c2VyX2wsIGRvbWFpbl9sOwotCXN0cnVjdCBITUFDTUQ1Q29udGV4dCBjdHg7Ci0KLQkvKiBtaWdodCBhcyB3ZWxsIGRvIG9uZSBhbGxvYyB0byBob2xkIGJvdGggKHVzZXJfdSBhbmQgZG9tX3UpICovCi0JdXNlcl91ID0ga21hbGxvYygyMDQ4ICogc2l6ZW9mKHdjaGFyX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAodXNlcl91ID09IE5VTEwpCi0JCXJldHVybjsKLQlkb21fdSA9IHVzZXJfdSArIDEwMjQ7Ci0KLQkvKiBwdXNoX3VjczIoTlVMTCwgdXNlcl91LCB1c2VyX24sICh1c2VyX2wrMSkqMiwKLQkJCVNUUl9VTklDT0RFfFNUUl9OT0FMSUdOfFNUUl9URVJNSU5BVEV8U1RSX1VQUEVSKTsKLQkgICBwdXNoX3VjczIoTlVMTCwgZG9tX3UsIGRvbWFpbl9uLCAoZG9tYWluX2wrMSkqMiwKLQkJCVNUUl9VTklDT0RFfFNUUl9OT0FMSUdOfFNUUl9URVJNSU5BVEV8U1RSX1VQUEVSKTsgKi8KLQotCS8qIEJCIHVzZXIgYW5kIGRvbWFpbiBtYXkgbmVlZCB0byBiZSB1cHBlcmNhc2VkICovCi0JdXNlcl9sID0gY2lmc19zdHJ0b1VDUyh1c2VyX3UsIHVzZXJfbiwgNTExLCBubHNfY29kZXBhZ2UpOwotCWRvbWFpbl9sID0gY2lmc19zdHJ0b1VDUyhkb21fdSwgZG9tYWluX24sIDUxMSwgbmxzX2NvZGVwYWdlKTsKLQotCXVzZXJfbCsrOwkJLyogdHJhaWxpbmcgbnVsbCAqLwotCWRvbWFpbl9sKys7Ci0KLQlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQob3dmLCAxNiwgJmN0eCk7Ci0JaG1hY19tZDVfdXBkYXRlKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHVzZXJfdSwgdXNlcl9sICogMiwgJmN0eCk7Ci0JaG1hY19tZDVfdXBkYXRlKChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRvbV91LCBkb21haW5fbCAqIDIsICZjdHgpOwotCWhtYWNfbWQ1X2ZpbmFsKGtyX2J1ZiwgJmN0eCk7Ci0KLQlrZnJlZSh1c2VyX3UpOwotfQotI2VuZGlmCi0KLS8qIERvZXMgdGhlIGRlcyBlbmNyeXB0aW9uIGZyb20gdGhlIEZJUlNUIDggQllURVMgb2YgdGhlIE5UIG9yIExNIE1ENCBoYXNoLiAqLwotI2lmIDAgLyogY3VycmVudGx5IHVudXNlZCAqLwotc3RhdGljIHZvaWQKLU5UTE1TU1BPV0ZlbmNyeXB0KHVuc2lnbmVkIGNoYXIgcGFzc3dkWzhdLAotCQkgIHVuc2lnbmVkIGNoYXIgKm50bG1jaGFscmVzcCwgdW5zaWduZWQgY2hhciBwMjRbMjRdKQotewotCXVuc2lnbmVkIGNoYXIgcDIxWzIxXTsKLQotCW1lbXNldChwMjEsICdcMCcsIDIxKTsKLQltZW1jcHkocDIxLCBwYXNzd2QsIDgpOwotCW1lbXNldChwMjEgKyA4LCAweGJkLCA4KTsKLQotCUVfUDI0KHAyMSwgbnRsbWNoYWxyZXNwLCBwMjQpOwotfQotI2VuZGlmCi0KIC8qIERvZXMgdGhlIE5UIE1ENCBoYXNoIHRoZW4gZGVzIGVuY3J5cHRpb24uICovCiBpbnQKLVNNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKmM4LCB1bnNpZ25lZCBjaGFyICpwMjQpCitTTUJOVGVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwgdW5zaWduZWQgY2hhciAqcDI0LAorCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpjb2RlcGFnZSkKIHsKIAlpbnQgcmM7CiAJdW5zaWduZWQgY2hhciBwMTZbMTZdLCBwMjFbMjFdOwpAQCAtMzYwLDcgKzIzNiw3IEBACiAJbWVtc2V0KHAxNiwgJ1wwJywgMTYpOwogCW1lbXNldChwMjEsICdcMCcsIDIxKTsKIAotCXJjID0gRV9tZDRoYXNoKHBhc3N3ZCwgcDE2KTsKKwlyYyA9IEVfbWQ0aGFzaChwYXNzd2QsIHAxNiwgY29kZXBhZ2UpOwogCWlmIChyYykgewogCQljRllJKDEsICIlcyBDYW4ndCBnZW5lcmF0ZSBOVCBoYXNoLCBlcnJvcjogJWQiLCBfX2Z1bmNfXywgcmMpOwogCQlyZXR1cm4gcmM7CkBAIC0zNjksMzkgKzI0NSwzIEBACiAJcmMgPSBFX1AyNChwMjEsIGM4LCBwMjQpOwogCXJldHVybiByYzsKIH0KLQotCi0vKiBEb2VzIHRoZSBtZDUgZW5jcnlwdGlvbiBmcm9tIHRoZSBOVCBoYXNoIGZvciBOVExNdjIuICovCi0vKiBUaGVzZSByb3V0aW5lcyB3aWxsIGJlIG5lZWRlZCBsYXRlciAqLwotI2lmIDAKLXN0YXRpYyB2b2lkCi1TTUJPV0ZlbmNyeXB0X250djIoY29uc3QgdW5zaWduZWQgY2hhciBrclsxNl0sCi0JCSAgIGNvbnN0IHN0cnVjdCBkYXRhX2Jsb2IgKnNydl9jaGFsLAotCQkgICBjb25zdCBzdHJ1Y3QgZGF0YV9ibG9iICpjbGlfY2hhbCwgdW5zaWduZWQgY2hhciByZXNwX2J1ZlsxNl0pCi17Ci0Jc3RydWN0IEhNQUNNRDVDb250ZXh0IGN0eDsKLQotCWhtYWNfbWQ1X2luaXRfbGltS190b182NChrciwgMTYsICZjdHgpOwotCWhtYWNfbWQ1X3VwZGF0ZShzcnZfY2hhbC0+ZGF0YSwgc3J2X2NoYWwtPmxlbmd0aCwgJmN0eCk7Ci0JaG1hY19tZDVfdXBkYXRlKGNsaV9jaGFsLT5kYXRhLCBjbGlfY2hhbC0+bGVuZ3RoLCAmY3R4KTsKLQlobWFjX21kNV9maW5hbChyZXNwX2J1ZiwgJmN0eCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1TTUJzZXNza2V5Z2VuX250djIoY29uc3QgdW5zaWduZWQgY2hhciBrclsxNl0sCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm50X3Jlc3AsIF9fdTggc2Vzc19rZXlbMTZdKQotewotCXN0cnVjdCBITUFDTUQ1Q29udGV4dCBjdHg7Ci0KLQlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQoa3IsIDE2LCAmY3R4KTsKLQlobWFjX21kNV91cGRhdGUobnRfcmVzcCwgMTYsICZjdHgpOwotCWhtYWNfbWQ1X2ZpbmFsKCh1bnNpZ25lZCBjaGFyICopIHNlc3Nfa2V5LCAmY3R4KTsKLX0KLQotc3RhdGljIHZvaWQKLVNNQnNlc3NrZXlnZW5fbnR2MShjb25zdCB1bnNpZ25lZCBjaGFyIGtyWzE2XSwKLQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqbnRfcmVzcCwgX191OCBzZXNzX2tleVsxNl0pCi17Ci0JbWRmb3VyKCh1bnNpZ25lZCBjaGFyICopIHNlc3Nfa2V5LCAodW5zaWduZWQgY2hhciAqKSBrciwgMTYpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9jaWZzL3RyYW5zcG9ydC5jIGIvZnMvY2lmcy90cmFuc3BvcnQuYwppbmRleCAxMGNhNmIyLi4wY2M5NTg0IDEwMDY0NAotLS0gYS9mcy9jaWZzL3RyYW5zcG9ydC5jCisrKyBiL2ZzL2NpZnMvdHJhbnNwb3J0LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgpAQCAtMzI0LDcgKzMyNSw3IEBACiB7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSB3YWl0X2V2ZW50X2tpbGxhYmxlKHNlcnZlci0+cmVzcG9uc2VfcSwKKwllcnJvciA9IHdhaXRfZXZlbnRfZnJlZXpla2lsbGFibGUoc2VydmVyLT5yZXNwb25zZV9xLAogCQkJCSAgICBtaWRRLT5taWRTdGF0ZSAhPSBNSURfUkVRVUVTVF9TVUJNSVRURUQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC0zMzksOCArMzQwLDggQEAKICAqLwogaW50CiBjaWZzX2NhbGxfYXN5bmMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3Qga3ZlYyAqaW92LAotCQl1bnNpZ25lZCBpbnQgbnZlYywgbWlkX2NhbGxiYWNrX3QgKmNhbGxiYWNrLCB2b2lkICpjYmRhdGEsCi0JCWJvb2wgaWdub3JlX3BlbmQpCisJCXVuc2lnbmVkIGludCBudmVjLCBtaWRfcmVjZWl2ZV90ICpyZWNlaXZlLAorCQltaWRfY2FsbGJhY2tfdCAqY2FsbGJhY2ssIHZvaWQgKmNiZGF0YSwgYm9vbCBpZ25vcmVfcGVuZCkKIHsKIAlpbnQgcmM7CiAJc3RydWN0IG1pZF9xX2VudHJ5ICptaWQ7CkBAIC0zNzQsNiArMzc1LDcgQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAorCW1pZC0+cmVjZWl2ZSA9IHJlY2VpdmU7CiAJbWlkLT5jYWxsYmFjayA9IGNhbGxiYWNrOwogCW1pZC0+Y2FsbGJhY2tfZGF0YSA9IGNiZGF0YTsKIAltaWQtPm1pZFN0YXRlID0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEOwpAQCAtNDk2LDEzICs0OTgsMTggQEAKIGNpZnNfY2hlY2tfcmVjZWl2ZShzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZCwgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAogCQkgICBib29sIGxvZ19lcnJvcikKIHsKLQlkdW1wX3NtYihtaWQtPnJlc3BfYnVmLAotCQkgbWluX3QodTMyLCA5MiwgYmUzMl90b19jcHUobWlkLT5yZXNwX2J1Zi0+c21iX2J1Zl9sZW5ndGgpKSk7CisJdW5zaWduZWQgaW50IGxlbiA9IGJlMzJfdG9fY3B1KG1pZC0+cmVzcF9idWYtPnNtYl9idWZfbGVuZ3RoKSArIDQ7CisKKwlkdW1wX3NtYihtaWQtPnJlc3BfYnVmLCBtaW5fdCh1MzIsIDkyLCBsZW4pKTsKIAogCS8qIGNvbnZlcnQgdGhlIGxlbmd0aCBpbnRvIGEgbW9yZSB1c2FibGUgZm9ybSAqLwogCWlmIChzZXJ2ZXItPnNlY19tb2RlICYgKFNFQ01PREVfU0lHTl9SRVFVSVJFRCB8IFNFQ01PREVfU0lHTl9FTkFCTEVEKSkgeworCQlzdHJ1Y3Qga3ZlYyBpb3Y7CisKKwkJaW92Lmlvdl9iYXNlID0gbWlkLT5yZXNwX2J1ZjsKKwkJaW92Lmlvdl9sZW4gPSBsZW47CiAJCS8qIEZJWE1FOiBhZGQgY29kZSB0byBraWxsIHNlc3Npb24gKi8KLQkJaWYgKGNpZnNfdmVyaWZ5X3NpZ25hdHVyZShtaWQtPnJlc3BfYnVmLCBzZXJ2ZXIsCisJCWlmIChjaWZzX3ZlcmlmeV9zaWduYXR1cmUoJmlvdiwgMSwgc2VydmVyLAogCQkJCQkgIG1pZC0+c2VxdWVuY2VfbnVtYmVyICsgMSkgIT0gMCkKIAkJCWNFUlJPUigxLCAiVW5leHBlY3RlZCBTTUIgc2lnbmF0dXJlIik7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy94YXR0ci5jIGIvZnMvY2lmcy94YXR0ci5jCmluZGV4IGMzMjMwODguLjQ1ZjA3YzQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMveGF0dHIuYworKysgYi9mcy9jaWZzL3hhdHRyLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogI2lmZGVmIENPTkZJR19DSUZTX0FDTAogCQkJbWVtY3B5KHBhY2wsIGVhX3ZhbHVlLCB2YWx1ZV9zaXplKTsKIAkJCXJjID0gc2V0X2NpZnNfYWNsKHBhY2wsIHZhbHVlX3NpemUsCi0JCQkJZGlyZW50cnktPmRfaW5vZGUsIGZ1bGxfcGF0aCk7CisJCQkJZGlyZW50cnktPmRfaW5vZGUsIGZ1bGxfcGF0aCwgQ0lGU19BQ0xfREFDTCk7CiAJCQlpZiAocmMgPT0gMCkgLyogZm9yY2UgcmV2YWxpZGF0ZSBvZiB0aGUgaW5vZGUgKi8KIAkJCQlDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpLT50aW1lID0gMDsKIAkJCWtmcmVlKHBhY2wpOwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9jb2RhX2xpbnV4LmMgYi9mcy9jb2RhL2NvZGFfbGludXguYwppbmRleCAyYmRiY2MxLi44NTRhY2U3IDEwMDY0NAotLS0gYS9mcy9jb2RhL2NvZGFfbGludXguYworKysgYi9mcy9jb2RhL2NvZGFfbGludXguYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgIGlmIChhdHRyLT52YV9naWQgIT0gLTEpCiAJICAgICAgICBpbm9kZS0+aV9naWQgPSAoZ2lkX3QpIGF0dHItPnZhX2dpZDsKIAlpZiAoYXR0ci0+dmFfbmxpbmsgIT0gLTEpCi0JICAgICAgICBpbm9kZS0+aV9ubGluayA9IGF0dHItPnZhX25saW5rOworCQlzZXRfbmxpbmsoaW5vZGUsIGF0dHItPnZhX25saW5rKTsKIAlpZiAoYXR0ci0+dmFfc2l6ZSAhPSAtMSkKIAkgICAgICAgIGlub2RlLT5pX3NpemUgPSBhdHRyLT52YV9zaXplOwogCWlmIChhdHRyLT52YV9zaXplICE9IC0xKQpkaWZmIC0tZ2l0IGEvZnMvY29kYS9kaXIuYyBiL2ZzL2NvZGEvZGlyLmMKaW5kZXggMDIzOTQzMy4uMjhlN2UxMyAxMDA2NDQKLS0tIGEvZnMvY29kYS9kaXIuYworKysgYi9mcy9jb2RhL2Rpci5jCkBAIC0zNDAsNyArMzQwLDcgQEAKIAlpZiAoIWVycm9yKSB7CiAJCS8qIFZGUyBtYXkgZGVsZXRlIHRoZSBjaGlsZCAqLwogCQlpZiAoZGUtPmRfaW5vZGUpCi0JCSAgICBkZS0+ZF9pbm9kZS0+aV9ubGluayA9IDA7CisJCQljbGVhcl9ubGluayhkZS0+ZF9pbm9kZSk7CiAKIAkJLyogZml4IHRoZSBsaW5rIGNvdW50IG9mIHRoZSBwYXJlbnQgKi8KIAkJY29kYV9kaXJfZHJvcF9ubGluayhkaXIpOwpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0LmMgYi9mcy9jb21wYXQuYwppbmRleCAwNWUzZjNkLi5jOTg3ODc1IDEwMDY0NAotLS0gYS9mcy9jb21wYXQuYworKysgYi9mcy9jb21wYXQuYwpAQCAtMjQ2LDExICsyNDYsOCBAQAogCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnNpZC52YWxbMF0sICZ1YnVmLT5mX2ZzaWQudmFsWzBdKSB8fAogCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnNpZC52YWxbMV0sICZ1YnVmLT5mX2ZzaWQudmFsWzFdKSB8fAogCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnJzaXplLCAmdWJ1Zi0+Zl9mcnNpemUpIHx8Ci0JICAgIF9fcHV0X3VzZXIoMCwgJnVidWYtPmZfc3BhcmVbMF0pIHx8IAotCSAgICBfX3B1dF91c2VyKDAsICZ1YnVmLT5mX3NwYXJlWzFdKSB8fCAKLQkgICAgX19wdXRfdXNlcigwLCAmdWJ1Zi0+Zl9zcGFyZVsyXSkgfHwgCi0JICAgIF9fcHV0X3VzZXIoMCwgJnVidWYtPmZfc3BhcmVbM10pIHx8IAotCSAgICBfX3B1dF91c2VyKDAsICZ1YnVmLT5mX3NwYXJlWzRdKSkKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2ZsYWdzLCAmdWJ1Zi0+Zl9mbGFncykgfHwKKwkgICAgX19jbGVhcl91c2VyKHVidWYtPmZfc3BhcmUsIHNpemVvZih1YnVmLT5mX3NwYXJlKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtNTQ5LDcgKzU0Niw3IEBACiBzc2l6ZV90IGNvbXBhdF9yd19jb3B5X2NoZWNrX3V2ZWN0b3IoaW50IHR5cGUsCiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp1dmVjdG9yLCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCiAJCXVuc2lnbmVkIGxvbmcgZmFzdF9zZWdzLCBzdHJ1Y3QgaW92ZWMgKmZhc3RfcG9pbnRlciwKLQkJc3RydWN0IGlvdmVjICoqcmV0X3BvaW50ZXIpCisJCXN0cnVjdCBpb3ZlYyAqKnJldF9wb2ludGVyLCBpbnQgY2hlY2tfYWNjZXNzKQogewogCWNvbXBhdF9zc2l6ZV90IHRvdF9sZW47CiAJc3RydWN0IGlvdmVjICppb3YgPSAqcmV0X3BvaW50ZXIgPSBmYXN0X3BvaW50ZXI7CkBAIC01OTYsNyArNTkzLDggQEAKIAkJfQogCQlpZiAobGVuIDwgMCkJLyogc2l6ZV90IG5vdCBmaXR0aW5nIGluIGNvbXBhdF9zc2l6ZV90IC4uICovCiAJCQlnb3RvIG91dDsKLQkJaWYgKCFhY2Nlc3Nfb2sodnJmeV9kaXIodHlwZSksIGNvbXBhdF9wdHIoYnVmKSwgbGVuKSkgeworCQlpZiAoY2hlY2tfYWNjZXNzICYmCisJCSAgICAhYWNjZXNzX29rKHZyZnlfZGlyKHR5cGUpLCBjb21wYXRfcHRyKGJ1ZiksIGxlbikpIHsKIAkJCXJldCA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTExMCw3ICsxMTA4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAl0b3RfbGVuID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3Rvcih0eXBlLCB1dmVjdG9yLCBucl9zZWdzLAotCQkJCQkgICAgICAgVUlPX0ZBU1RJT1YsIGlvdnN0YWNrLCAmaW92KTsKKwkJCQkJICAgICAgIFVJT19GQVNUSU9WLCBpb3ZzdGFjaywgJmlvdiwgMSk7CiAJaWYgKHRvdF9sZW4gPT0gMCkgewogCQlyZXQgPSAwOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggYTg4OTQ4Yi4uYTkwMWM2OSAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTIyNSw3ICsyMjUsNyBAQAogfQogCiAvKgotICogZGVudHJ5X2xydV8oYWRkfGRlbHxtb3ZlX3RhaWwpIG11c3QgYmUgY2FsbGVkIHdpdGggZF9sb2NrIGhlbGQuCisgKiBkZW50cnlfbHJ1XyhhZGR8ZGVsfHBydW5lfG1vdmVfdGFpbCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBkX2xvY2sgaGVsZC4KICAqLwogc3RhdGljIHZvaWQgZGVudHJ5X2xydV9hZGQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpAQCAtMjQ1LDYgKzI0NSw5IEBACiAJZGVudHJ5X3N0YXQubnJfdW51c2VkLS07CiB9CiAKKy8qCisgKiBSZW1vdmUgYSBkZW50cnkgd2l0aCByZWZlcmVuY2VzIGZyb20gdGhlIExSVS4KKyAqLwogc3RhdGljIHZvaWQgZGVudHJ5X2xydV9kZWwoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX2xydSkpIHsKQEAgLTI1NCw2ICsyNTcsMjMgQEAKIAl9CiB9CiAKKy8qCisgKiBSZW1vdmUgYSBkZW50cnkgdGhhdCBpcyB1bnJlZmVyZW5jZWQgYW5kIGFib3V0IHRvIGJlIHBydW5lZAorICogKHVuaGFzaGVkIGFuZCBkZXN0cm95ZWQpIGZyb20gdGhlIExSVSwgYW5kIGluZm9ybSB0aGUgZmlsZSBzeXN0ZW0uCisgKiBUaGlzIHdyYXBwZXIgc2hvdWxkIGJlIGNhbGxlZCBfcHJpb3JfIHRvIHVuaGFzaGluZyBhIHZpY3RpbSBkZW50cnkuCisgKi8KK3N0YXRpYyB2b2lkIGRlbnRyeV9scnVfcHJ1bmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX2xydSkpIHsKKwkJaWYgKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9PUF9QUlVORSkKKwkJCWRlbnRyeS0+ZF9vcC0+ZF9wcnVuZShkZW50cnkpOworCisJCXNwaW5fbG9jaygmZGNhY2hlX2xydV9sb2NrKTsKKwkJX19kZW50cnlfbHJ1X2RlbChkZW50cnkpOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xydV9sb2NrKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGRlbnRyeV9scnVfbW92ZV90YWlsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzcGluX2xvY2soJmRjYWNoZV9scnVfbG9jayk7CkBAIC00MDMsOCArNDIzLDEyIEBACiAKIAlpZiAocmVmKQogCQlkZW50cnktPmRfY291bnQtLTsKLQkvKiBpZiBkZW50cnkgd2FzIG9uIHRoZSBkX2xydSBsaXN0IGRlbGV0ZSBpdCBmcm9tIHRoZXJlICovCi0JZGVudHJ5X2xydV9kZWwoZGVudHJ5KTsKKwkvKgorCSAqIGlmIGRlbnRyeSB3YXMgb24gdGhlIGRfbHJ1IGxpc3QgZGVsZXRlIGl0IGZyb20gdGhlcmUuCisJICogaW5mb3JtIHRoZSBmcyB2aWEgZF9wcnVuZSB0aGF0IHRoaXMgZGVudHJ5IGlzIGFib3V0IHRvIGJlCisJICogdW5oYXNoZWQgYW5kIGRlc3Ryb3llZC4KKwkgKi8KKwlkZW50cnlfbHJ1X3BydW5lKGRlbnRyeSk7CiAJLyogaWYgaXQgd2FzIG9uIHRoZSBoYXNoIHRoZW4gcmVtb3ZlIGl0ICovCiAJX19kX2Ryb3AoZGVudHJ5KTsKIAlyZXR1cm4gZF9raWxsKGRlbnRyeSwgcGFyZW50KTsKQEAgLTUyMiw5ICs1NDYsMTEgQEAKIAkgKiB3b3VsZCBtYWtlIGl0IHVucmVhY2hhYmxlIGZyb20gdGhlIHJvb3QsCiAJICogd2UgbWlnaHQgc3RpbGwgcG9wdWxhdGUgaXQgaWYgaXQgd2FzIGEKIAkgKiB3b3JraW5nIGRpcmVjdG9yeSBvciBzaW1pbGFyKS4KKwkgKiBXZSBhbHNvIG5lZWQgdG8gbGVhdmUgbW91bnRwb2ludHMgYWxvbmUsCisJICogZGlyZWN0b3J5IG9yIG5vdC4KIAkgKi8KLQlpZiAoZGVudHJ5LT5kX2NvdW50ID4gMSkgewotCQlpZiAoZGVudHJ5LT5kX2lub2RlICYmIFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CisJaWYgKGRlbnRyeS0+ZF9jb3VudCA+IDEgJiYgZGVudHJ5LT5kX2lub2RlKSB7CisJCWlmIChTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSB8fCBkX21vdW50cG9pbnQoZGVudHJ5KSkgewogCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KQEAgLTg1NCw4ICs4ODAsMTIgQEAKIAkJZG8gewogCQkJc3RydWN0IGlub2RlICppbm9kZTsKIAotCQkJLyogZGV0YWNoIGZyb20gdGhlIHN5c3RlbSAqLwotCQkJZGVudHJ5X2xydV9kZWwoZGVudHJ5KTsKKwkJCS8qCisJCQkgKiByZW1vdmUgdGhlIGRlbnRyeSBmcm9tIHRoZSBscnUsIGFuZCBpbmZvcm0KKwkJCSAqIHRoZSBmcyB0aGF0IHRoaXMgZGVudHJ5IGlzIGFib3V0IHRvIGJlCisJCQkgKiB1bmhhc2hlZCBhbmQgZGVzdHJveWVkLgorCQkJICovCisJCQlkZW50cnlfbHJ1X3BydW5lKGRlbnRyeSk7CiAJCQlfX2Rfc2hyaW5rKGRlbnRyeSk7CiAKIAkJCWlmIChkZW50cnktPmRfY291bnQgIT0gMCkgewpAQCAtMTI4Myw2ICsxMzEzLDggQEAKIAkJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9PUF9SRVZBTElEQVRFOwogCWlmIChvcC0+ZF9kZWxldGUpCiAJCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfT1BfREVMRVRFOworCWlmIChvcC0+ZF9wcnVuZSkKKwkJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9PUF9QUlVORTsKIAogfQogRVhQT1JUX1NZTUJPTChkX3NldF9kX29wKTsKZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy9pbm9kZS5jIGIvZnMvZGV2cHRzL2lub2RlLmMKaW5kZXggMmYyN2U1Ny4uZDVkNTI5NyAxMDA2NDQKLS0tIGEvZnMvZGV2cHRzL2lub2RlLmMKKysrIGIvZnMvZGV2cHRzL2lub2RlLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08gfCBTX0lXVVNSOwogCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCiAJcy0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKIAlpZiAocy0+c19yb290KQpAQCAtNTQ5LDcgKzU0OSw3IEBACiAKIAlkZW50cnkgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOwogCi0JaW5vZGUtPmlfbmxpbmstLTsKKwlkcm9wX25saW5rKGlub2RlKTsKIAlkX2RlbGV0ZShkZW50cnkpOwogCWRwdXQoZGVudHJ5KTsJLyogZF9hbGxvY19uYW1lKCkgaW4gZGV2cHRzX3B0eV9uZXcoKSAqLwogCWRwdXQoZGVudHJ5KTsJCS8qIGRfZmluZF9hbGlhcyBhYm92ZSAqLwpkaWZmIC0tZ2l0IGEvZnMvZGlyZWN0LWlvLmMgYi9mcy9kaXJlY3QtaW8uYwppbmRleCA0NGEzNjBjLi5kNzQwYWI2IDEwMDY0NAotLS0gYS9mcy9kaXJlY3QtaW8uYworKysgYi9mcy9kaXJlY3QtaW8uYwpAQCAtMzksNyArMzksNyBAQAogCiAvKgogICogSG93IG1hbnkgdXNlciBwYWdlcyB0byBtYXAgaW4gb25lIGNhbGwgdG8gZ2V0X3VzZXJfcGFnZXMoKS4gIFRoaXMgZGV0ZXJtaW5lcwotICogdGhlIHNpemUgb2YgYSBzdHJ1Y3R1cmUgb24gdGhlIHN0YWNrLgorICogdGhlIHNpemUgb2YgYSBzdHJ1Y3R1cmUgaW4gdGhlIHNsYWIgY2FjaGUKICAqLwogI2RlZmluZSBESU9fUEFHRVMJNjQKIApAQCAtNTUsMTMgKzU1LDEwIEBACiAgKiBibG9ja3NpemUuCiAgKi8KIAotc3RydWN0IGRpbyB7Ci0JLyogQklPIHN1Ym1pc3Npb24gc3RhdGUgKi8KKy8qIGRpb19zdGF0ZSBvbmx5IHVzZWQgaW4gdGhlIHN1Ym1pc3Npb24gcGF0aCAqLworCitzdHJ1Y3QgZGlvX3N1Ym1pdCB7CiAJc3RydWN0IGJpbyAqYmlvOwkJLyogYmlvIHVuZGVyIGFzc2VtYmx5ICovCi0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlpbnQgcnc7Ci0JbG9mZl90IGlfc2l6ZTsJCQkvKiBpX3NpemUgd2hlbiBzdWJtaXR0ZWQgKi8KLQlpbnQgZmxhZ3M7CQkJLyogZG9lc24ndCBjaGFuZ2UgKi8KIAl1bnNpZ25lZCBibGtiaXRzOwkJLyogZG9lc24ndCBjaGFuZ2UgKi8KIAl1bnNpZ25lZCBibGtmYWN0b3I7CQkvKiBXaGVuIHdlJ3JlIHVzaW5nIGFuIGFsaWdubWVudCB3aGljaAogCQkJCQkgICBpcyBmaW5lciB0aGFuIHRoZSBmaWxlc3lzdGVtJ3Mgc29mdApAQCAtNzYsMTggKzczLDE3IEBACiAJc2VjdG9yX3QgYmxvY2tfaW5fZmlsZTsJCS8qIEN1cnJlbnQgb2Zmc2V0IGludG8gdGhlIHVuZGVybHlpbmcKIAkJCQkJICAgZmlsZSBpbiBkaW9fYmxvY2sgdW5pdHMuICovCiAJdW5zaWduZWQgYmxvY2tzX2F2YWlsYWJsZTsJLyogQXQgYmxvY2tfaW5fZmlsZS4gIGNoYW5nZXMgKi8KKwlpbnQgcmVhcF9jb3VudGVyOwkJLyogcmF0ZSBsaW1pdCByZWFwaW5nICovCiAJc2VjdG9yX3QgZmluYWxfYmxvY2tfaW5fcmVxdWVzdDsvKiBkb2Vzbid0IGNoYW5nZSAqLwogCXVuc2lnbmVkIGZpcnN0X2Jsb2NrX2luX3BhZ2U7CS8qIGRvZXNuJ3QgY2hhbmdlLCBVc2VkIG9ubHkgb25jZSAqLwogCWludCBib3VuZGFyeTsJCQkvKiBwcmV2IGJsb2NrIGlzIGF0IGEgYm91bmRhcnkgKi8KLQlpbnQgcmVhcF9jb3VudGVyOwkJLyogcmF0ZSBsaW1pdCByZWFwaW5nICovCiAJZ2V0X2Jsb2NrX3QgKmdldF9ibG9jazsJCS8qIGJsb2NrIG1hcHBpbmcgZnVuY3Rpb24gKi8KLQlkaW9faW9kb25lX3QgKmVuZF9pbzsJCS8qIElPIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KIAlkaW9fc3VibWl0X3QgKnN1Ym1pdF9pbzsJLyogSU8gc3VibWl0aW9uIGZ1bmN0aW9uICovCisKIAlsb2ZmX3QgbG9naWNhbF9vZmZzZXRfaW5fYmlvOwkvKiBjdXJyZW50IGZpcnN0IGxvZ2ljYWwgYmxvY2sgaW4gYmlvICovCiAJc2VjdG9yX3QgZmluYWxfYmxvY2tfaW5fYmlvOwkvKiBjdXJyZW50IGZpbmFsIGJsb2NrIGluIGJpbyArIDEgKi8KIAlzZWN0b3JfdCBuZXh0X2Jsb2NrX2Zvcl9pbzsJLyogbmV4dCBibG9jayB0byBiZSBwdXQgdW5kZXIgSU8sCiAJCQkJCSAgIGluIGRpb19ibG9ja3MgdW5pdHMgKi8KLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgbWFwX2JoOwkvKiBsYXN0IGdldF9ibG9jaygpIHJlc3VsdCAqLwogCiAJLyoKIAkgKiBEZWZlcnJlZCBhZGRpdGlvbiBvZiBhIHBhZ2UgdG8gdGhlIGRpby4gIFRoZXNlIHZhcmlhYmxlcyBhcmUKQEAgLTEwMCwxOCArOTYsNiBAQAogCXNlY3Rvcl90IGN1cl9wYWdlX2Jsb2NrOwkvKiBXaGVyZSBpdCBzdGFydHMgKi8KIAlsb2ZmX3QgY3VyX3BhZ2VfZnNfb2Zmc2V0OwkvKiBPZmZzZXQgaW4gZmlsZSAqLwogCi0JLyogQklPIGNvbXBsZXRpb24gc3RhdGUgKi8KLQlzcGlubG9ja190IGJpb19sb2NrOwkJLyogcHJvdGVjdHMgQklPIGZpZWxkcyBiZWxvdyAqLwotCXVuc2lnbmVkIGxvbmcgcmVmY291bnQ7CQkvKiBkaXJlY3RfaW9fd29ya2VyKCkgYW5kIGJpb3MgKi8KLQlzdHJ1Y3QgYmlvICpiaW9fbGlzdDsJCS8qIHNpbmdseSBsaW5rZWQgdmlhIGJpX3ByaXZhdGUgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKndhaXRlcjsJLyogd2FpdGluZyB0YXNrIChOVUxMIGlmIG5vbmUpICovCi0KLQkvKiBBSU8gcmVsYXRlZCBzdHVmZiAqLwotCXN0cnVjdCBraW9jYiAqaW9jYjsJCS8qIGtpb2NiICovCi0JaW50IGlzX2FzeW5jOwkJCS8qIGlzIElPIGFzeW5jID8gKi8KLQlpbnQgaW9fZXJyb3I7CQkJLyogSU8gZXJyb3IgaW4gY29tcGxldGlvbiBwYXRoICovCi0Jc3NpemVfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAvKiBJTyByZXN1bHQgKi8KLQogCS8qCiAJICogUGFnZSBmZXRjaGluZyBzdGF0ZS4gVGhlc2UgdmFyaWFibGVzIGJlbG9uZyB0byBkaW9fcmVmaWxsX3BhZ2VzKCkuCiAJICovCkBAIC0xMjUsNyArMTA5LDMwIEBACiAJICovCiAJdW5zaWduZWQgaGVhZDsJCQkvKiBuZXh0IHBhZ2UgdG8gcHJvY2VzcyAqLwogCXVuc2lnbmVkIHRhaWw7CQkJLyogbGFzdCB2YWxpZCBwYWdlICsgMSAqLworfTsKKworLyogZGlvX3N0YXRlIGNvbW11bmljYXRlZCBiZXR3ZWVuIHN1Ym1pc3Npb24gcGF0aCBhbmQgZW5kX2lvICovCitzdHJ1Y3QgZGlvIHsKKwlpbnQgZmxhZ3M7CQkJLyogZG9lc24ndCBjaGFuZ2UgKi8KKwlpbnQgcnc7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlsb2ZmX3QgaV9zaXplOwkJCS8qIGlfc2l6ZSB3aGVuIHN1Ym1pdHRlZCAqLworCWRpb19pb2RvbmVfdCAqZW5kX2lvOwkJLyogSU8gY29tcGxldGlvbiBmdW5jdGlvbiAqLworCisJdm9pZCAqcHJpdmF0ZTsJCQkvKiBjb3B5IGZyb20gbWFwX2JoLmJfcHJpdmF0ZSAqLworCisJLyogQklPIGNvbXBsZXRpb24gc3RhdGUgKi8KKwlzcGlubG9ja190IGJpb19sb2NrOwkJLyogcHJvdGVjdHMgQklPIGZpZWxkcyBiZWxvdyAqLwogCWludCBwYWdlX2Vycm9yczsJCS8qIGVycm5vIGZyb20gZ2V0X3VzZXJfcGFnZXMoKSAqLworCWludCBpc19hc3luYzsJCQkvKiBpcyBJTyBhc3luYyA/ICovCisJaW50IGlvX2Vycm9yOwkJCS8qIElPIGVycm9yIGluIGNvbXBsZXRpb24gcGF0aCAqLworCXVuc2lnbmVkIGxvbmcgcmVmY291bnQ7CQkvKiBkaXJlY3RfaW9fd29ya2VyKCkgYW5kIGJpb3MgKi8KKwlzdHJ1Y3QgYmlvICpiaW9fbGlzdDsJCS8qIHNpbmdseSBsaW5rZWQgdmlhIGJpX3ByaXZhdGUgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKndhaXRlcjsJLyogd2FpdGluZyB0YXNrIChOVUxMIGlmIG5vbmUpICovCisKKwkvKiBBSU8gcmVsYXRlZCBzdHVmZiAqLworCXN0cnVjdCBraW9jYiAqaW9jYjsJCS8qIGtpb2NiICovCisJc3NpemVfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAvKiBJTyByZXN1bHQgKi8KIAogCS8qCiAJICogcGFnZXNbXSAoYW5kIGFueSBmaWVsZHMgcGxhY2VkIGFmdGVyIGl0KSBhcmUgbm90IHplcm9lZCBvdXQgYXQKQEAgLTEzMyw3ICsxNDAsOSBAQAogCSAqIHdpc2ggdGhhdCB0aGV5IG5vdCBiZSB6ZXJvZWQuCiAJICovCiAJc3RydWN0IHBhZ2UgKnBhZ2VzW0RJT19QQUdFU107CS8qIHBhZ2UgYnVmZmVyICovCi19OworfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmRpb19jYWNoZSBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgdm9pZCBfX2lub2RlX2Rpb193YWl0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CkBAIC0xODIsMjcgKzE5MSwyNyBAQAogLyoKICAqIEhvdyBtYW55IHBhZ2VzIGFyZSBpbiB0aGUgcXVldWU/CiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZGlvX3BhZ2VzX3ByZXNlbnQoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBkaW9fcGFnZXNfcHJlc2VudChzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKIHsKLQlyZXR1cm4gZGlvLT50YWlsIC0gZGlvLT5oZWFkOworCXJldHVybiBzZGlvLT50YWlsIC0gc2Rpby0+aGVhZDsKIH0KIAogLyoKICAqIEdvIGdyYWIgYW5kIHBpbiBzb21lIHVzZXJzcGFjZSBwYWdlcy4gICBUeXBpY2FsbHkgd2UnbGwgZ2V0IDY0IGF0IGEgdGltZS4KICAqLwotc3RhdGljIGludCBkaW9fcmVmaWxsX3BhZ2VzKHN0cnVjdCBkaW8gKmRpbykKK3N0YXRpYyBpbmxpbmUgaW50IGRpb19yZWZpbGxfcGFnZXMoc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKIHsKIAlpbnQgcmV0OwogCWludCBucl9wYWdlczsKIAotCW5yX3BhZ2VzID0gbWluKGRpby0+dG90YWxfcGFnZXMgLSBkaW8tPmN1cnJfcGFnZSwgRElPX1BBR0VTKTsKKwlucl9wYWdlcyA9IG1pbihzZGlvLT50b3RhbF9wYWdlcyAtIHNkaW8tPmN1cnJfcGFnZSwgRElPX1BBR0VTKTsKIAlyZXQgPSBnZXRfdXNlcl9wYWdlc19mYXN0KAotCQlkaW8tPmN1cnJfdXNlcl9hZGRyZXNzLAkJLyogV2hlcmUgZnJvbT8gKi8KKwkJc2Rpby0+Y3Vycl91c2VyX2FkZHJlc3MsCQkvKiBXaGVyZSBmcm9tPyAqLwogCQlucl9wYWdlcywJCQkvKiBIb3cgbWFueSBwYWdlcz8gKi8KIAkJZGlvLT5ydyA9PSBSRUFELAkJLyogV3JpdGUgdG8gbWVtb3J5PyAqLwogCQkmZGlvLT5wYWdlc1swXSk7CQkvKiBQdXQgcmVzdWx0cyBoZXJlICovCiAKLQlpZiAocmV0IDwgMCAmJiBkaW8tPmJsb2Nrc19hdmFpbGFibGUgJiYgKGRpby0+cncgJiBXUklURSkpIHsKKwlpZiAocmV0IDwgMCAmJiBzZGlvLT5ibG9ja3NfYXZhaWxhYmxlICYmIChkaW8tPnJ3ICYgV1JJVEUpKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gWkVST19QQUdFKDApOwogCQkvKgogCQkgKiBBIG1lbW9yeSBmYXVsdCwgYnV0IHRoZSBmaWxlc3lzdGVtIGhhcyBzb21lIG91dHN0YW5kaW5nCkBAIC0yMTMsMTcgKzIyMiwxNyBAQAogCQkJZGlvLT5wYWdlX2Vycm9ycyA9IHJldDsKIAkJcGFnZV9jYWNoZV9nZXQocGFnZSk7CiAJCWRpby0+cGFnZXNbMF0gPSBwYWdlOwotCQlkaW8tPmhlYWQgPSAwOwotCQlkaW8tPnRhaWwgPSAxOworCQlzZGlvLT5oZWFkID0gMDsKKwkJc2Rpby0+dGFpbCA9IDE7CiAJCXJldCA9IDA7CiAJCWdvdG8gb3V0OwogCX0KIAogCWlmIChyZXQgPj0gMCkgewotCQlkaW8tPmN1cnJfdXNlcl9hZGRyZXNzICs9IHJldCAqIFBBR0VfU0laRTsKLQkJZGlvLT5jdXJyX3BhZ2UgKz0gcmV0OwotCQlkaW8tPmhlYWQgPSAwOwotCQlkaW8tPnRhaWwgPSByZXQ7CisJCXNkaW8tPmN1cnJfdXNlcl9hZGRyZXNzICs9IHJldCAqIFBBR0VfU0laRTsKKwkJc2Rpby0+Y3Vycl9wYWdlICs9IHJldDsKKwkJc2Rpby0+aGVhZCA9IDA7CisJCXNkaW8tPnRhaWwgPSByZXQ7CiAJCXJldCA9IDA7CiAJfQogb3V0OgpAQCAtMjM2LDE3ICsyNDUsMTggQEAKICAqIGRlY2VudCBudW1iZXIgb2YgcGFnZXMsIGxlc3MgZnJlcXVlbnRseS4gIFRvIHByb3ZpZGUgbmljZXIgdXNlIG9mIHRoZQogICogTDEgY2FjaGUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZGlvX2dldF9wYWdlKHN0cnVjdCBkaW8gKmRpbykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKmRpb19nZXRfcGFnZShzdHJ1Y3QgZGlvICpkaW8sCisJCXN0cnVjdCBkaW9fc3VibWl0ICpzZGlvKQogewotCWlmIChkaW9fcGFnZXNfcHJlc2VudChkaW8pID09IDApIHsKKwlpZiAoZGlvX3BhZ2VzX3ByZXNlbnQoc2RpbykgPT0gMCkgewogCQlpbnQgcmV0OwogCi0JCXJldCA9IGRpb19yZWZpbGxfcGFnZXMoZGlvKTsKKwkJcmV0ID0gZGlvX3JlZmlsbF9wYWdlcyhkaW8sIHNkaW8pOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQkJQlVHX09OKGRpb19wYWdlc19wcmVzZW50KGRpbykgPT0gMCk7CisJCUJVR19PTihkaW9fcGFnZXNfcHJlc2VudChzZGlvKSA9PSAwKTsKIAl9Ci0JcmV0dXJuIGRpby0+cGFnZXNbZGlvLT5oZWFkKytdOworCXJldHVybiBkaW8tPnBhZ2VzW3NkaW8tPmhlYWQrK107CiB9CiAKIC8qKgpAQCAtMjkyLDcgKzMwMiw3IEBACiAKIAlpZiAoZGlvLT5lbmRfaW8gJiYgZGlvLT5yZXN1bHQpIHsKIAkJZGlvLT5lbmRfaW8oZGlvLT5pb2NiLCBvZmZzZXQsIHRyYW5zZmVycmVkLAotCQkJICAgIGRpby0+bWFwX2JoLmJfcHJpdmF0ZSwgcmV0LCBpc19hc3luYyk7CisJCQkgICAgZGlvLT5wcml2YXRlLCByZXQsIGlzX2FzeW5jKTsKIAl9IGVsc2UgewogCQlpZiAoaXNfYXN5bmMpCiAJCQlhaW9fY29tcGxldGUoZGlvLT5pb2NiLCByZXQsIDApOwpAQCAtMzIzLDcgKzMzMyw3IEBACiAKIAlpZiAocmVtYWluaW5nID09IDApIHsKIAkJZGlvX2NvbXBsZXRlKGRpbywgZGlvLT5pb2NiLT5raV9wb3MsIDAsIHRydWUpOwotCQlrZnJlZShkaW8pOworCQlrbWVtX2NhY2hlX2ZyZWUoZGlvX2NhY2hlLCBkaW8pOwogCX0KIH0KIApAQCAtMzY3LDkgKzM3NywxMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGlvX2VuZF9pbyk7CiAKLXN0YXRpYyB2b2lkCi1kaW9fYmlvX2FsbG9jKHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKLQkJc2VjdG9yX3QgZmlyc3Rfc2VjdG9yLCBpbnQgbnJfdmVjcykKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGlvX2Jpb19hbGxvYyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvLAorCSAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJICAgICAgc2VjdG9yX3QgZmlyc3Rfc2VjdG9yLCBpbnQgbnJfdmVjcykKIHsKIAlzdHJ1Y3QgYmlvICpiaW87CiAKQEAgLTM4Niw4ICszOTcsOCBAQAogCWVsc2UKIAkJYmlvLT5iaV9lbmRfaW8gPSBkaW9fYmlvX2VuZF9pbzsKIAotCWRpby0+YmlvID0gYmlvOwotCWRpby0+bG9naWNhbF9vZmZzZXRfaW5fYmlvID0gZGlvLT5jdXJfcGFnZV9mc19vZmZzZXQ7CisJc2Rpby0+YmlvID0gYmlvOworCXNkaW8tPmxvZ2ljYWxfb2Zmc2V0X2luX2JpbyA9IHNkaW8tPmN1cl9wYWdlX2ZzX29mZnNldDsKIH0KIAogLyoKQEAgLTM5Nyw5ICs0MDgsOSBAQAogICoKICAqIGJpb3MgaG9sZCBhIGRpbyByZWZlcmVuY2UgYmV0d2VlbiBzdWJtaXRfYmlvIGFuZCAtPmVuZF9pby4KICAqLwotc3RhdGljIHZvaWQgZGlvX2Jpb19zdWJtaXQoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGlubGluZSB2b2lkIGRpb19iaW9fc3VibWl0KHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGRpb19zdWJtaXQgKnNkaW8pCiB7Ci0Jc3RydWN0IGJpbyAqYmlvID0gZGlvLT5iaW87CisJc3RydWN0IGJpbyAqYmlvID0gc2Rpby0+YmlvOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAliaW8tPmJpX3ByaXZhdGUgPSBkaW87CkBAIC00MTEsMjQgKzQyMiwyNCBAQAogCWlmIChkaW8tPmlzX2FzeW5jICYmIGRpby0+cncgPT0gUkVBRCkKIAkJYmlvX3NldF9wYWdlc19kaXJ0eShiaW8pOwogCi0JaWYgKGRpby0+c3VibWl0X2lvKQotCQlkaW8tPnN1Ym1pdF9pbyhkaW8tPnJ3LCBiaW8sIGRpby0+aW5vZGUsCi0JCQkgICAgICAgZGlvLT5sb2dpY2FsX29mZnNldF9pbl9iaW8pOworCWlmIChzZGlvLT5zdWJtaXRfaW8pCisJCXNkaW8tPnN1Ym1pdF9pbyhkaW8tPnJ3LCBiaW8sIGRpby0+aW5vZGUsCisJCQkgICAgICAgc2Rpby0+bG9naWNhbF9vZmZzZXRfaW5fYmlvKTsKIAllbHNlCiAJCXN1Ym1pdF9iaW8oZGlvLT5ydywgYmlvKTsKIAotCWRpby0+YmlvID0gTlVMTDsKLQlkaW8tPmJvdW5kYXJ5ID0gMDsKLQlkaW8tPmxvZ2ljYWxfb2Zmc2V0X2luX2JpbyA9IDA7CisJc2Rpby0+YmlvID0gTlVMTDsKKwlzZGlvLT5ib3VuZGFyeSA9IDA7CisJc2Rpby0+bG9naWNhbF9vZmZzZXRfaW5fYmlvID0gMDsKIH0KIAogLyoKICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyBpbiBjYXNlIG9mIGEgZmFpbHVyZQogICovCi1zdGF0aWMgdm9pZCBkaW9fY2xlYW51cChzdHJ1Y3QgZGlvICpkaW8pCitzdGF0aWMgaW5saW5lIHZvaWQgZGlvX2NsZWFudXAoc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKIHsKLQl3aGlsZSAoZGlvX3BhZ2VzX3ByZXNlbnQoZGlvKSkKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpb19nZXRfcGFnZShkaW8pKTsKKwl3aGlsZSAoZGlvX3BhZ2VzX3ByZXNlbnQoc2RpbykpCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaW9fZ2V0X3BhZ2UoZGlvLCBzZGlvKSk7CiB9CiAKIC8qCkBAIC01MTgsMTEgKzUyOSwxMSBAQAogICoKICAqIFRoaXMgYWxzbyBoZWxwcyB0byBsaW1pdCB0aGUgcGVhayBhbW91bnQgb2YgcGlubmVkIHVzZXJzcGFjZSBtZW1vcnkuCiAgKi8KLXN0YXRpYyBpbnQgZGlvX2Jpb19yZWFwKHN0cnVjdCBkaW8gKmRpbykKK3N0YXRpYyBpbmxpbmUgaW50IGRpb19iaW9fcmVhcChzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvKQogewogCWludCByZXQgPSAwOwogCi0JaWYgKGRpby0+cmVhcF9jb3VudGVyKysgPj0gNjQpIHsKKwlpZiAoc2Rpby0+cmVhcF9jb3VudGVyKysgPj0gNjQpIHsKIAkJd2hpbGUgKGRpby0+YmlvX2xpc3QpIHsKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCQlzdHJ1Y3QgYmlvICpiaW87CkBAIC01MzYsMTQgKzU0NywxNCBAQAogCQkJaWYgKHJldCA9PSAwKQogCQkJCXJldCA9IHJldDI7CiAJCX0KLQkJZGlvLT5yZWFwX2NvdW50ZXIgPSAwOworCQlzZGlvLT5yZWFwX2NvdW50ZXIgPSAwOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCiAvKgogICogQ2FsbCBpbnRvIHRoZSBmcyB0byBtYXAgc29tZSBtb3JlIGRpc2sgYmxvY2tzLiAgV2UgcmVjb3JkIHRoZSBjdXJyZW50IG51bWJlcgotICogb2YgYXZhaWxhYmxlIGJsb2NrcyBhdCBkaW8tPmJsb2Nrc19hdmFpbGFibGUuICBUaGVzZSBhcmUgaW4gdW5pdHMgb2YgdGhlCisgKiBvZiBhdmFpbGFibGUgYmxvY2tzIGF0IHNkaW8tPmJsb2Nrc19hdmFpbGFibGUuICBUaGVzZSBhcmUgaW4gdW5pdHMgb2YgdGhlCiAgKiBmcyBibG9ja3NpemUsICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpLgogICoKICAqIFRoZSBmcyBpcyBhbGxvd2VkIHRvIG1hcCBsb3RzIG9mIGJsb2NrcyBhdCBvbmNlLiAgSWYgaXQgd2FudHMgdG8gZG8gdGhhdCwKQEAgLTU2NCwxMCArNTc1LDEwIEBACiAgKiBidWZmZXJfbWFwcGVkKCkuICBIb3dldmVyIHRoZSBkaXJlY3QtaW8gY29kZSB3aWxsIG9ubHkgcHJvY2VzcyBob2xlcyBvbmUKICAqIGJsb2NrIGF0IGEgdGltZSAtIGl0IHdpbGwgcmVwZWF0ZWRseSBjYWxsIGdldF9ibG9jaygpIGFzIGl0IHdhbGtzIHRoZSBob2xlLgogICovCi1zdGF0aWMgaW50IGdldF9tb3JlX2Jsb2NrcyhzdHJ1Y3QgZGlvICpkaW8pCitzdGF0aWMgaW50IGdldF9tb3JlX2Jsb2NrcyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICptYXBfYmgpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcF9iaCA9ICZkaW8tPm1hcF9iaDsKIAlzZWN0b3JfdCBmc19zdGFydGJsazsJLyogSW50byBmaWxlLCBpbiBmaWxlc3lzdGVtLXNpemVkIGJsb2NrcyAqLwogCXVuc2lnbmVkIGxvbmcgZnNfY291bnQ7CS8qIE51bWJlciBvZiBmaWxlc3lzdGVtLXNpemVkIGJsb2NrcyAqLwogCXVuc2lnbmVkIGxvbmcgZGlvX2NvdW50Oy8qIE51bWJlciBvZiBkaW9fYmxvY2stc2l6ZWQgYmxvY2tzICovCkBAIC01ODAsMTEgKzU5MSwxMSBAQAogCSAqLwogCXJldCA9IGRpby0+cGFnZV9lcnJvcnM7CiAJaWYgKHJldCA9PSAwKSB7Ci0JCUJVR19PTihkaW8tPmJsb2NrX2luX2ZpbGUgPj0gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KTsKLQkJZnNfc3RhcnRibGsgPSBkaW8tPmJsb2NrX2luX2ZpbGUgPj4gZGlvLT5ibGtmYWN0b3I7Ci0JCWRpb19jb3VudCA9IGRpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCAtIGRpby0+YmxvY2tfaW5fZmlsZTsKLQkJZnNfY291bnQgPSBkaW9fY291bnQgPj4gZGlvLT5ibGtmYWN0b3I7Ci0JCWJsa21hc2sgPSAoMSA8PCBkaW8tPmJsa2ZhY3RvcikgLSAxOworCQlCVUdfT04oc2Rpby0+YmxvY2tfaW5fZmlsZSA+PSBzZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KTsKKwkJZnNfc3RhcnRibGsgPSBzZGlvLT5ibG9ja19pbl9maWxlID4+IHNkaW8tPmJsa2ZhY3RvcjsKKwkJZGlvX2NvdW50ID0gc2Rpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCAtIHNkaW8tPmJsb2NrX2luX2ZpbGU7CisJCWZzX2NvdW50ID0gZGlvX2NvdW50ID4+IHNkaW8tPmJsa2ZhY3RvcjsKKwkJYmxrbWFzayA9ICgxIDw8IHNkaW8tPmJsa2ZhY3RvcikgLSAxOwogCQlpZiAoZGlvX2NvdW50ICYgYmxrbWFzaykJCiAJCQlmc19jb3VudCsrOwogCkBAIC02MDQsMTMgKzYxNSwxNiBAQAogCQkgKi8KIAkJY3JlYXRlID0gZGlvLT5ydyAmIFdSSVRFOwogCQlpZiAoZGlvLT5mbGFncyAmIERJT19TS0lQX0hPTEVTKSB7Ci0JCQlpZiAoZGlvLT5ibG9ja19pbl9maWxlIDwgKGlfc2l6ZV9yZWFkKGRpby0+aW5vZGUpID4+Ci0JCQkJCQkJZGlvLT5ibGtiaXRzKSkKKwkJCWlmIChzZGlvLT5ibG9ja19pbl9maWxlIDwgKGlfc2l6ZV9yZWFkKGRpby0+aW5vZGUpID4+CisJCQkJCQkJc2Rpby0+YmxrYml0cykpCiAJCQkJY3JlYXRlID0gMDsKIAkJfQogCi0JCXJldCA9ICgqZGlvLT5nZXRfYmxvY2spKGRpby0+aW5vZGUsIGZzX3N0YXJ0YmxrLAorCQlyZXQgPSAoKnNkaW8tPmdldF9ibG9jaykoZGlvLT5pbm9kZSwgZnNfc3RhcnRibGssCiAJCQkJCQltYXBfYmgsIGNyZWF0ZSk7CisKKwkJLyogU3RvcmUgZm9yIGNvbXBsZXRpb24gKi8KKwkJZGlvLT5wcml2YXRlID0gbWFwX2JoLT5iX3ByaXZhdGU7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC02MTgsMjAgKzYzMiwyMSBAQAogLyoKICAqIFRoZXJlIGlzIG5vIGJpby4gIE1ha2Ugb25lIG5vdy4KICAqLwotc3RhdGljIGludCBkaW9fbmV3X2JpbyhzdHJ1Y3QgZGlvICpkaW8sIHNlY3Rvcl90IHN0YXJ0X3NlY3RvcikKK3N0YXRpYyBpbmxpbmUgaW50IGRpb19uZXdfYmlvKHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGRpb19zdWJtaXQgKnNkaW8sCisJCXNlY3Rvcl90IHN0YXJ0X3NlY3Rvciwgc3RydWN0IGJ1ZmZlcl9oZWFkICptYXBfYmgpCiB7CiAJc2VjdG9yX3Qgc2VjdG9yOwogCWludCByZXQsIG5yX3BhZ2VzOwogCi0JcmV0ID0gZGlvX2Jpb19yZWFwKGRpbyk7CisJcmV0ID0gZGlvX2Jpb19yZWFwKGRpbywgc2Rpbyk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7Ci0Jc2VjdG9yID0gc3RhcnRfc2VjdG9yIDw8IChkaW8tPmJsa2JpdHMgLSA5KTsKLQlucl9wYWdlcyA9IG1pbihkaW8tPnBhZ2VzX2luX2lvLCBiaW9fZ2V0X25yX3ZlY3MoZGlvLT5tYXBfYmguYl9iZGV2KSk7CisJc2VjdG9yID0gc3RhcnRfc2VjdG9yIDw8IChzZGlvLT5ibGtiaXRzIC0gOSk7CisJbnJfcGFnZXMgPSBtaW4oc2Rpby0+cGFnZXNfaW5faW8sIGJpb19nZXRfbnJfdmVjcyhtYXBfYmgtPmJfYmRldikpOwogCW5yX3BhZ2VzID0gbWluKG5yX3BhZ2VzLCBCSU9fTUFYX1BBR0VTKTsKIAlCVUdfT04obnJfcGFnZXMgPD0gMCk7Ci0JZGlvX2Jpb19hbGxvYyhkaW8sIGRpby0+bWFwX2JoLmJfYmRldiwgc2VjdG9yLCBucl9wYWdlcyk7Ci0JZGlvLT5ib3VuZGFyeSA9IDA7CisJZGlvX2Jpb19hbGxvYyhkaW8sIHNkaW8sIG1hcF9iaC0+Yl9iZGV2LCBzZWN0b3IsIG5yX3BhZ2VzKTsKKwlzZGlvLT5ib3VuZGFyeSA9IDA7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTY0MywyMSArNjU4LDIxIEBACiAgKgogICogUmV0dXJuIHplcm8gb24gc3VjY2Vzcy4gIE5vbi16ZXJvIG1lYW5zIHRoZSBjYWxsZXIgbmVlZHMgdG8gc3RhcnQgYSBuZXcgQklPLgogICovCi1zdGF0aWMgaW50IGRpb19iaW9fYWRkX3BhZ2Uoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGlubGluZSBpbnQgZGlvX2Jpb19hZGRfcGFnZShzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gYmlvX2FkZF9wYWdlKGRpby0+YmlvLCBkaW8tPmN1cl9wYWdlLAotCQkJZGlvLT5jdXJfcGFnZV9sZW4sIGRpby0+Y3VyX3BhZ2Vfb2Zmc2V0KTsKLQlpZiAocmV0ID09IGRpby0+Y3VyX3BhZ2VfbGVuKSB7CisJcmV0ID0gYmlvX2FkZF9wYWdlKHNkaW8tPmJpbywgc2Rpby0+Y3VyX3BhZ2UsCisJCQlzZGlvLT5jdXJfcGFnZV9sZW4sIHNkaW8tPmN1cl9wYWdlX29mZnNldCk7CisJaWYgKHJldCA9PSBzZGlvLT5jdXJfcGFnZV9sZW4pIHsKIAkJLyoKIAkJICogRGVjcmVtZW50IGNvdW50IG9ubHksIGlmIHdlIGFyZSBkb25lIHdpdGggdGhpcyBwYWdlCiAJCSAqLwotCQlpZiAoKGRpby0+Y3VyX3BhZ2VfbGVuICsgZGlvLT5jdXJfcGFnZV9vZmZzZXQpID09IFBBR0VfU0laRSkKLQkJCWRpby0+cGFnZXNfaW5faW8tLTsKLQkJcGFnZV9jYWNoZV9nZXQoZGlvLT5jdXJfcGFnZSk7Ci0JCWRpby0+ZmluYWxfYmxvY2tfaW5fYmlvID0gZGlvLT5jdXJfcGFnZV9ibG9jayArCi0JCQkoZGlvLT5jdXJfcGFnZV9sZW4gPj4gZGlvLT5ibGtiaXRzKTsKKwkJaWYgKChzZGlvLT5jdXJfcGFnZV9sZW4gKyBzZGlvLT5jdXJfcGFnZV9vZmZzZXQpID09IFBBR0VfU0laRSkKKwkJCXNkaW8tPnBhZ2VzX2luX2lvLS07CisJCXBhZ2VfY2FjaGVfZ2V0KHNkaW8tPmN1cl9wYWdlKTsKKwkJc2Rpby0+ZmluYWxfYmxvY2tfaW5fYmlvID0gc2Rpby0+Y3VyX3BhZ2VfYmxvY2sgKworCQkJKHNkaW8tPmN1cl9wYWdlX2xlbiA+PiBzZGlvLT5ibGtiaXRzKTsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgewogCQlyZXQgPSAxOwpAQCAtNjc1LDE0ICs2OTAsMTUgQEAKICAqIFRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgY3VyX3BhZ2UgZnJvbSB0aGUKICAqIGRpbywgYW5kIGZvciBkcm9wcGluZyB0aGUgcmVmY291bnQgd2hpY2ggY2FtZSBmcm9tIHRoYXQgcHJlc2VuY2UuCiAgKi8KLXN0YXRpYyBpbnQgZGlvX3NlbmRfY3VyX3BhZ2Uoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGlubGluZSBpbnQgZGlvX3NlbmRfY3VyX3BhZ2Uoc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbywKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICptYXBfYmgpCiB7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoZGlvLT5iaW8pIHsKLQkJbG9mZl90IGN1cl9vZmZzZXQgPSBkaW8tPmN1cl9wYWdlX2ZzX29mZnNldDsKLQkJbG9mZl90IGJpb19uZXh0X29mZnNldCA9IGRpby0+bG9naWNhbF9vZmZzZXRfaW5fYmlvICsKLQkJCWRpby0+YmlvLT5iaV9zaXplOworCWlmIChzZGlvLT5iaW8pIHsKKwkJbG9mZl90IGN1cl9vZmZzZXQgPSBzZGlvLT5jdXJfcGFnZV9mc19vZmZzZXQ7CisJCWxvZmZfdCBiaW9fbmV4dF9vZmZzZXQgPSBzZGlvLT5sb2dpY2FsX29mZnNldF9pbl9iaW8gKworCQkJc2Rpby0+YmlvLT5iaV9zaXplOwogCiAJCS8qCiAJCSAqIFNlZSB3aGV0aGVyIHRoaXMgbmV3IHJlcXVlc3QgaXMgY29udGlndW91cyB3aXRoIHRoZSBvbGQuCkBAIC02OTgsMjggKzcxNCwyOCBAQAogCQkgKiBiZSB0aGUgbmV4dCBsb2dpY2FsIG9mZnNldCBpbiB0aGUgYmlvLCBzdWJtaXQgdGhlIGJpbyB3ZQogCQkgKiBoYXZlLgogCQkgKi8KLQkJaWYgKGRpby0+ZmluYWxfYmxvY2tfaW5fYmlvICE9IGRpby0+Y3VyX3BhZ2VfYmxvY2sgfHwKKwkJaWYgKHNkaW8tPmZpbmFsX2Jsb2NrX2luX2JpbyAhPSBzZGlvLT5jdXJfcGFnZV9ibG9jayB8fAogCQkgICAgY3VyX29mZnNldCAhPSBiaW9fbmV4dF9vZmZzZXQpCi0JCQlkaW9fYmlvX3N1Ym1pdChkaW8pOworCQkJZGlvX2Jpb19zdWJtaXQoZGlvLCBzZGlvKTsKIAkJLyoKIAkJICogU3VibWl0IG5vdyBpZiB0aGUgdW5kZXJseWluZyBmcyBpcyBhYm91dCB0byBwZXJmb3JtIGEKIAkJICogbWV0YWRhdGEgcmVhZAogCQkgKi8KLQkJZWxzZSBpZiAoZGlvLT5ib3VuZGFyeSkKLQkJCWRpb19iaW9fc3VibWl0KGRpbyk7CisJCWVsc2UgaWYgKHNkaW8tPmJvdW5kYXJ5KQorCQkJZGlvX2Jpb19zdWJtaXQoZGlvLCBzZGlvKTsKIAl9CiAKLQlpZiAoZGlvLT5iaW8gPT0gTlVMTCkgewotCQlyZXQgPSBkaW9fbmV3X2JpbyhkaW8sIGRpby0+Y3VyX3BhZ2VfYmxvY2spOworCWlmIChzZGlvLT5iaW8gPT0gTlVMTCkgeworCQlyZXQgPSBkaW9fbmV3X2JpbyhkaW8sIHNkaW8sIHNkaW8tPmN1cl9wYWdlX2Jsb2NrLCBtYXBfYmgpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGRpb19iaW9fYWRkX3BhZ2UoZGlvKSAhPSAwKSB7Ci0JCWRpb19iaW9fc3VibWl0KGRpbyk7Ci0JCXJldCA9IGRpb19uZXdfYmlvKGRpbywgZGlvLT5jdXJfcGFnZV9ibG9jayk7CisJaWYgKGRpb19iaW9fYWRkX3BhZ2Uoc2RpbykgIT0gMCkgeworCQlkaW9fYmlvX3N1Ym1pdChkaW8sIHNkaW8pOworCQlyZXQgPSBkaW9fbmV3X2JpbyhkaW8sIHNkaW8sIHNkaW8tPmN1cl9wYWdlX2Jsb2NrLCBtYXBfYmgpOwogCQlpZiAocmV0ID09IDApIHsKLQkJCXJldCA9IGRpb19iaW9fYWRkX3BhZ2UoZGlvKTsKKwkJCXJldCA9IGRpb19iaW9fYWRkX3BhZ2Uoc2Rpbyk7CiAJCQlCVUdfT04ocmV0ICE9IDApOwogCQl9CiAJfQpAQCAtNzQ0LDkgKzc2MCwxMCBAQAogICogSWYgdGhhdCBkb2Vzbid0IHdvcmsgb3V0IHRoZW4gd2UgcHV0IHRoZSBvbGQgcGFnZSBpbnRvIHRoZSBiaW8gYW5kIGFkZCB0aGlzCiAgKiBwYWdlIHRvIHRoZSBkaW8gaW5zdGVhZC4KICAqLwotc3RhdGljIGludAotc3VibWl0X3BhZ2Vfc2VjdGlvbihzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBwYWdlICpwYWdlLAotCQl1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbiwgc2VjdG9yX3QgYmxvY2tucikKK3N0YXRpYyBpbmxpbmUgaW50CitzdWJtaXRfcGFnZV9zZWN0aW9uKHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGRpb19zdWJtaXQgKnNkaW8sIHN0cnVjdCBwYWdlICpwYWdlLAorCQkgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW4sIHNlY3Rvcl90IGJsb2NrbnIsCisJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcF9iaCkKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtNzYwLDIwICs3NzcsMjAgQEAKIAkvKgogCSAqIENhbiB3ZSBqdXN0IGdyb3cgdGhlIGN1cnJlbnQgcGFnZSdzIHByZXNlbmNlIGluIHRoZSBkaW8/CiAJICovCi0JaWYgKAkoZGlvLT5jdXJfcGFnZSA9PSBwYWdlKSAmJgotCQkoZGlvLT5jdXJfcGFnZV9vZmZzZXQgKyBkaW8tPmN1cl9wYWdlX2xlbiA9PSBvZmZzZXQpICYmCi0JCShkaW8tPmN1cl9wYWdlX2Jsb2NrICsKLQkJCShkaW8tPmN1cl9wYWdlX2xlbiA+PiBkaW8tPmJsa2JpdHMpID09IGJsb2NrbnIpKSB7Ci0JCWRpby0+Y3VyX3BhZ2VfbGVuICs9IGxlbjsKKwlpZiAoc2Rpby0+Y3VyX3BhZ2UgPT0gcGFnZSAmJgorCSAgICBzZGlvLT5jdXJfcGFnZV9vZmZzZXQgKyBzZGlvLT5jdXJfcGFnZV9sZW4gPT0gb2Zmc2V0ICYmCisJICAgIHNkaW8tPmN1cl9wYWdlX2Jsb2NrICsKKwkgICAgKHNkaW8tPmN1cl9wYWdlX2xlbiA+PiBzZGlvLT5ibGtiaXRzKSA9PSBibG9ja25yKSB7CisJCXNkaW8tPmN1cl9wYWdlX2xlbiArPSBsZW47CiAKIAkJLyoKLQkJICogSWYgZGlvLT5ib3VuZGFyeSB0aGVuIHdlIHdhbnQgdG8gc2NoZWR1bGUgdGhlIElPIG5vdyB0bworCQkgKiBJZiBzZGlvLT5ib3VuZGFyeSB0aGVuIHdlIHdhbnQgdG8gc2NoZWR1bGUgdGhlIElPIG5vdyB0bwogCQkgKiBhdm9pZCBtZXRhZGF0YSBzZWVrcy4KIAkJICovCi0JCWlmIChkaW8tPmJvdW5kYXJ5KSB7Ci0JCQlyZXQgPSBkaW9fc2VuZF9jdXJfcGFnZShkaW8pOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpby0+Y3VyX3BhZ2UpOwotCQkJZGlvLT5jdXJfcGFnZSA9IE5VTEw7CisJCWlmIChzZGlvLT5ib3VuZGFyeSkgeworCQkJcmV0ID0gZGlvX3NlbmRfY3VyX3BhZ2UoZGlvLCBzZGlvLCBtYXBfYmgpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHNkaW8tPmN1cl9wYWdlKTsKKwkJCXNkaW8tPmN1cl9wYWdlID0gTlVMTDsKIAkJfQogCQlnb3RvIG91dDsKIAl9CkBAIC03ODEsMjAgKzc5OCwyMCBAQAogCS8qCiAJICogSWYgdGhlcmUncyBhIGRlZmVycmVkIHBhZ2UgYWxyZWFkeSB0aGVyZSB0aGVuIHNlbmQgaXQuCiAJICovCi0JaWYgKGRpby0+Y3VyX3BhZ2UpIHsKLQkJcmV0ID0gZGlvX3NlbmRfY3VyX3BhZ2UoZGlvKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpby0+Y3VyX3BhZ2UpOwotCQlkaW8tPmN1cl9wYWdlID0gTlVMTDsKKwlpZiAoc2Rpby0+Y3VyX3BhZ2UpIHsKKwkJcmV0ID0gZGlvX3NlbmRfY3VyX3BhZ2UoZGlvLCBzZGlvLCBtYXBfYmgpOworCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc2Rpby0+Y3VyX3BhZ2UpOworCQlzZGlvLT5jdXJfcGFnZSA9IE5VTEw7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAl9CiAKIAlwYWdlX2NhY2hlX2dldChwYWdlKTsJCS8qIEl0IGlzIGluIGRpbyAqLwotCWRpby0+Y3VyX3BhZ2UgPSBwYWdlOwotCWRpby0+Y3VyX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0OwotCWRpby0+Y3VyX3BhZ2VfbGVuID0gbGVuOwotCWRpby0+Y3VyX3BhZ2VfYmxvY2sgPSBibG9ja25yOwotCWRpby0+Y3VyX3BhZ2VfZnNfb2Zmc2V0ID0gZGlvLT5ibG9ja19pbl9maWxlIDw8IGRpby0+YmxrYml0czsKKwlzZGlvLT5jdXJfcGFnZSA9IHBhZ2U7CisJc2Rpby0+Y3VyX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0OworCXNkaW8tPmN1cl9wYWdlX2xlbiA9IGxlbjsKKwlzZGlvLT5jdXJfcGFnZV9ibG9jayA9IGJsb2NrbnI7CisJc2Rpby0+Y3VyX3BhZ2VfZnNfb2Zmc2V0ID0gc2Rpby0+YmxvY2tfaW5fZmlsZSA8PCBzZGlvLT5ibGtiaXRzOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC04MDQsMTYgKzgyMSwxNiBAQAogICogZmlsZSBibG9ja3MuICBPbmx5IGNhbGxlZCBmb3IgU19JU1JFRyBmaWxlcyAtIGJsb2NrZGV2cyBkbyBub3Qgc2V0CiAgKiBidWZmZXJfbmV3CiAgKi8KLXN0YXRpYyB2b2lkIGNsZWFuX2Jsb2NrZGV2X2FsaWFzZXMoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIHZvaWQgY2xlYW5fYmxvY2tkZXZfYWxpYXNlcyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBidWZmZXJfaGVhZCAqbWFwX2JoKQogewogCXVuc2lnbmVkIGk7CiAJdW5zaWduZWQgbmJsb2NrczsKIAotCW5ibG9ja3MgPSBkaW8tPm1hcF9iaC5iX3NpemUgPj4gZGlvLT5pbm9kZS0+aV9ibGtiaXRzOworCW5ibG9ja3MgPSBtYXBfYmgtPmJfc2l6ZSA+PiBkaW8tPmlub2RlLT5pX2Jsa2JpdHM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrKSB7Ci0JCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoZGlvLT5tYXBfYmguYl9iZGV2LAotCQkJCQlkaW8tPm1hcF9iaC5iX2Jsb2NrbnIgKyBpKTsKKwkJdW5tYXBfdW5kZXJseWluZ19tZXRhZGF0YShtYXBfYmgtPmJfYmRldiwKKwkJCQkJICBtYXBfYmgtPmJfYmxvY2tuciArIGkpOwogCX0KIH0KIApAQCAtODI2LDE5ICs4NDMsMjAgQEAKICAqIGBlbmQnIGlzIHplcm8gaWYgd2UncmUgZG9pbmcgdGhlIHN0YXJ0IG9mIHRoZSBJTywgMSBhdCB0aGUgZW5kIG9mIHRoZQogICogSU8uCiAgKi8KLXN0YXRpYyB2b2lkIGRpb196ZXJvX2Jsb2NrKHN0cnVjdCBkaW8gKmRpbywgaW50IGVuZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaW9femVyb19ibG9jayhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvLAorCQlpbnQgZW5kLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcF9iaCkKIHsKIAl1bnNpZ25lZCBkaW9fYmxvY2tzX3Blcl9mc19ibG9jazsKIAl1bnNpZ25lZCB0aGlzX2NodW5rX2Jsb2NrczsJLyogSW4gZGlvX2Jsb2NrcyAqLwogCXVuc2lnbmVkIHRoaXNfY2h1bmtfYnl0ZXM7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQlkaW8tPnN0YXJ0X3plcm9fZG9uZSA9IDE7Ci0JaWYgKCFkaW8tPmJsa2ZhY3RvciB8fCAhYnVmZmVyX25ldygmZGlvLT5tYXBfYmgpKQorCXNkaW8tPnN0YXJ0X3plcm9fZG9uZSA9IDE7CisJaWYgKCFzZGlvLT5ibGtmYWN0b3IgfHwgIWJ1ZmZlcl9uZXcobWFwX2JoKSkKIAkJcmV0dXJuOwogCi0JZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgPSAxIDw8IGRpby0+YmxrZmFjdG9yOwotCXRoaXNfY2h1bmtfYmxvY2tzID0gZGlvLT5ibG9ja19pbl9maWxlICYgKGRpb19ibG9ja3NfcGVyX2ZzX2Jsb2NrIC0gMSk7CisJZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgPSAxIDw8IHNkaW8tPmJsa2ZhY3RvcjsKKwl0aGlzX2NodW5rX2Jsb2NrcyA9IHNkaW8tPmJsb2NrX2luX2ZpbGUgJiAoZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgLSAxKTsKIAogCWlmICghdGhpc19jaHVua19ibG9ja3MpCiAJCXJldHVybjsKQEAgLTg1MCwxNCArODY4LDE0IEBACiAJaWYgKGVuZCkgCiAJCXRoaXNfY2h1bmtfYmxvY2tzID0gZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgLSB0aGlzX2NodW5rX2Jsb2NrczsKIAotCXRoaXNfY2h1bmtfYnl0ZXMgPSB0aGlzX2NodW5rX2Jsb2NrcyA8PCBkaW8tPmJsa2JpdHM7CisJdGhpc19jaHVua19ieXRlcyA9IHRoaXNfY2h1bmtfYmxvY2tzIDw8IHNkaW8tPmJsa2JpdHM7CiAKIAlwYWdlID0gWkVST19QQUdFKDApOwotCWlmIChzdWJtaXRfcGFnZV9zZWN0aW9uKGRpbywgcGFnZSwgMCwgdGhpc19jaHVua19ieXRlcywgCi0JCQkJZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbykpCisJaWYgKHN1Ym1pdF9wYWdlX3NlY3Rpb24oZGlvLCBzZGlvLCBwYWdlLCAwLCB0aGlzX2NodW5rX2J5dGVzLAorCQkJCXNkaW8tPm5leHRfYmxvY2tfZm9yX2lvLCBtYXBfYmgpKQogCQlyZXR1cm47CiAKLQlkaW8tPm5leHRfYmxvY2tfZm9yX2lvICs9IHRoaXNfY2h1bmtfYmxvY2tzOworCXNkaW8tPm5leHRfYmxvY2tfZm9yX2lvICs9IHRoaXNfY2h1bmtfYmxvY2tzOwogfQogCiAvKgpAQCAtODc2LDIwICs4OTQsMjAgQEAKICAqIGl0IHNob3VsZCBzZXQgYl9zaXplIHRvIFBBR0VfU0laRSBvciBtb3JlIGluc2lkZSBnZXRfYmxvY2soKS4gIFRoaXMgZ2l2ZXMKICAqIGZpbmUgYWxpZ25tZW50IGJ1dCBzdGlsbCBhbGxvd3MgdGhpcyBmdW5jdGlvbiB0byB3b3JrIGluIFBBR0VfU0laRSB1bml0cy4KICAqLwotc3RhdGljIGludCBkb19kaXJlY3RfSU8oc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGludCBkb19kaXJlY3RfSU8oc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbywKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqbWFwX2JoKQogewotCWNvbnN0IHVuc2lnbmVkIGJsa2JpdHMgPSBkaW8tPmJsa2JpdHM7CisJY29uc3QgdW5zaWduZWQgYmxrYml0cyA9IHNkaW8tPmJsa2JpdHM7CiAJY29uc3QgdW5zaWduZWQgYmxvY2tzX3Blcl9wYWdlID0gUEFHRV9TSVpFID4+IGJsa2JpdHM7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgYmxvY2tfaW5fcGFnZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcF9iaCA9ICZkaW8tPm1hcF9iaDsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIFRoZSBJL08gY2FuIHN0YXJ0IGF0IGFueSBibG9jayBvZmZzZXQgd2l0aGluIHRoZSBmaXJzdCBwYWdlICovCi0JYmxvY2tfaW5fcGFnZSA9IGRpby0+Zmlyc3RfYmxvY2tfaW5fcGFnZTsKKwlibG9ja19pbl9wYWdlID0gc2Rpby0+Zmlyc3RfYmxvY2tfaW5fcGFnZTsKIAotCXdoaWxlIChkaW8tPmJsb2NrX2luX2ZpbGUgPCBkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QpIHsKLQkJcGFnZSA9IGRpb19nZXRfcGFnZShkaW8pOworCXdoaWxlIChzZGlvLT5ibG9ja19pbl9maWxlIDwgc2Rpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCkgeworCQlwYWdlID0gZGlvX2dldF9wYWdlKGRpbywgc2Rpbyk7CiAJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCXJldCA9IFBUUl9FUlIocGFnZSk7CiAJCQlnb3RvIG91dDsKQEAgLTkwMSwxNCArOTE5LDE0IEBACiAJCQl1bnNpZ25lZCB0aGlzX2NodW5rX2Jsb2NrczsJLyogIyBvZiBibG9ja3MgKi8KIAkJCXVuc2lnbmVkIHU7CiAKLQkJCWlmIChkaW8tPmJsb2Nrc19hdmFpbGFibGUgPT0gMCkgeworCQkJaWYgKHNkaW8tPmJsb2Nrc19hdmFpbGFibGUgPT0gMCkgewogCQkJCS8qCiAJCQkJICogTmVlZCB0byBnbyBhbmQgbWFwIHNvbWUgbW9yZSBkaXNrCiAJCQkJICovCiAJCQkJdW5zaWduZWQgbG9uZyBibGttYXNrOwogCQkJCXVuc2lnbmVkIGxvbmcgZGlvX3JlbWFpbmRlcjsKIAotCQkJCXJldCA9IGdldF9tb3JlX2Jsb2NrcyhkaW8pOworCQkJCXJldCA9IGdldF9tb3JlX2Jsb2NrcyhkaW8sIHNkaW8sIG1hcF9iaCk7CiAJCQkJaWYgKHJldCkgewogCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQkJCWdvdG8gb3V0OwpAQCAtOTE2LDE4ICs5MzQsMTggQEAKIAkJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQobWFwX2JoKSkKIAkJCQkJZ290byBkb19ob2xlczsKIAotCQkJCWRpby0+YmxvY2tzX2F2YWlsYWJsZSA9Ci0JCQkJCQltYXBfYmgtPmJfc2l6ZSA+PiBkaW8tPmJsa2JpdHM7Ci0JCQkJZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyA9Ci0JCQkJCW1hcF9iaC0+Yl9ibG9ja25yIDw8IGRpby0+YmxrZmFjdG9yOworCQkJCXNkaW8tPmJsb2Nrc19hdmFpbGFibGUgPQorCQkJCQkJbWFwX2JoLT5iX3NpemUgPj4gc2Rpby0+YmxrYml0czsKKwkJCQlzZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyA9CisJCQkJCW1hcF9iaC0+Yl9ibG9ja25yIDw8IHNkaW8tPmJsa2ZhY3RvcjsKIAkJCQlpZiAoYnVmZmVyX25ldyhtYXBfYmgpKQotCQkJCQljbGVhbl9ibG9ja2Rldl9hbGlhc2VzKGRpbyk7CisJCQkJCWNsZWFuX2Jsb2NrZGV2X2FsaWFzZXMoZGlvLCBtYXBfYmgpOwogCi0JCQkJaWYgKCFkaW8tPmJsa2ZhY3RvcikKKwkJCQlpZiAoIXNkaW8tPmJsa2ZhY3RvcikKIAkJCQkJZ290byBkb19ob2xlczsKIAotCQkJCWJsa21hc2sgPSAoMSA8PCBkaW8tPmJsa2ZhY3RvcikgLSAxOwotCQkJCWRpb19yZW1haW5kZXIgPSAoZGlvLT5ibG9ja19pbl9maWxlICYgYmxrbWFzayk7CisJCQkJYmxrbWFzayA9ICgxIDw8IHNkaW8tPmJsa2ZhY3RvcikgLSAxOworCQkJCWRpb19yZW1haW5kZXIgPSAoc2Rpby0+YmxvY2tfaW5fZmlsZSAmIGJsa21hc2spOwogCiAJCQkJLyoKIAkJCQkgKiBJZiB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIElPIGFuZCB0aGF0IElPCkBAIC05NDEsOCArOTU5LDggQEAKIAkJCQkgKiBvbi1kaXNrCiAJCQkJICovCiAJCQkJaWYgKCFidWZmZXJfbmV3KG1hcF9iaCkpCi0JCQkJCWRpby0+bmV4dF9ibG9ja19mb3JfaW8gKz0gZGlvX3JlbWFpbmRlcjsKLQkJCQlkaW8tPmJsb2Nrc19hdmFpbGFibGUgLT0gZGlvX3JlbWFpbmRlcjsKKwkJCQkJc2Rpby0+bmV4dF9ibG9ja19mb3JfaW8gKz0gZGlvX3JlbWFpbmRlcjsKKwkJCQlzZGlvLT5ibG9ja3NfYXZhaWxhYmxlIC09IGRpb19yZW1haW5kZXI7CiAJCQl9CiBkb19ob2xlczoKIAkJCS8qIEhhbmRsZSBob2xlcyAqLwpAQCAtOTYxLDcgKzk3OSw3IEBACiAJCQkJICovCiAJCQkJaV9zaXplX2FsaWduZWQgPSBBTElHTihpX3NpemVfcmVhZChkaW8tPmlub2RlKSwKIAkJCQkJCQkxIDw8IGJsa2JpdHMpOwotCQkJCWlmIChkaW8tPmJsb2NrX2luX2ZpbGUgPj0KKwkJCQlpZiAoc2Rpby0+YmxvY2tfaW5fZmlsZSA+PQogCQkJCQkJaV9zaXplX2FsaWduZWQgPj4gYmxrYml0cykgewogCQkJCQkvKiBXZSBoaXQgZW9mICovCiAJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKQEAgLTk2OSw3ICs5ODcsNyBAQAogCQkJCX0KIAkJCQl6ZXJvX3VzZXIocGFnZSwgYmxvY2tfaW5fcGFnZSA8PCBibGtiaXRzLAogCQkJCQkJMSA8PCBibGtiaXRzKTsKLQkJCQlkaW8tPmJsb2NrX2luX2ZpbGUrKzsKKwkJCQlzZGlvLT5ibG9ja19pbl9maWxlKys7CiAJCQkJYmxvY2tfaW5fcGFnZSsrOwogCQkJCWdvdG8gbmV4dF9ibG9jazsKIAkJCX0KQEAgLTk3OSwzOCArOTk3LDQxIEBACiAJCQkgKiBpcyBmaW5lciB0aGFuIHRoZSB1bmRlcmx5aW5nIGZzLCBnbyBjaGVjayB0byBzZWUgaWYKIAkJCSAqIHdlIG11c3QgemVybyBvdXQgdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2suCiAJCQkgKi8KLQkJCWlmICh1bmxpa2VseShkaW8tPmJsa2ZhY3RvciAmJiAhZGlvLT5zdGFydF96ZXJvX2RvbmUpKQotCQkJCWRpb196ZXJvX2Jsb2NrKGRpbywgMCk7CisJCQlpZiAodW5saWtlbHkoc2Rpby0+YmxrZmFjdG9yICYmICFzZGlvLT5zdGFydF96ZXJvX2RvbmUpKQorCQkJCWRpb196ZXJvX2Jsb2NrKGRpbywgc2RpbywgMCwgbWFwX2JoKTsKIAogCQkJLyoKIAkJCSAqIFdvcmsgb3V0LCBpbiB0aGlzX2NodW5rX2Jsb2NrcywgaG93IG11Y2ggZGlzayB3ZQogCQkJICogY2FuIGFkZCB0byB0aGlzIHBhZ2UKIAkJCSAqLwotCQkJdGhpc19jaHVua19ibG9ja3MgPSBkaW8tPmJsb2Nrc19hdmFpbGFibGU7CisJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHNkaW8tPmJsb2Nrc19hdmFpbGFibGU7CiAJCQl1ID0gKFBBR0VfU0laRSAtIG9mZnNldF9pbl9wYWdlKSA+PiBibGtiaXRzOwogCQkJaWYgKHRoaXNfY2h1bmtfYmxvY2tzID4gdSkKIAkJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHU7Ci0JCQl1ID0gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0IC0gZGlvLT5ibG9ja19pbl9maWxlOworCQkJdSA9IHNkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgLSBzZGlvLT5ibG9ja19pbl9maWxlOwogCQkJaWYgKHRoaXNfY2h1bmtfYmxvY2tzID4gdSkKIAkJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHU7CiAJCQl0aGlzX2NodW5rX2J5dGVzID0gdGhpc19jaHVua19ibG9ja3MgPDwgYmxrYml0czsKIAkJCUJVR19PTih0aGlzX2NodW5rX2J5dGVzID09IDApOwogCi0JCQlkaW8tPmJvdW5kYXJ5ID0gYnVmZmVyX2JvdW5kYXJ5KG1hcF9iaCk7Ci0JCQlyZXQgPSBzdWJtaXRfcGFnZV9zZWN0aW9uKGRpbywgcGFnZSwgb2Zmc2V0X2luX3BhZ2UsCi0JCQkJdGhpc19jaHVua19ieXRlcywgZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyk7CisJCQlzZGlvLT5ib3VuZGFyeSA9IGJ1ZmZlcl9ib3VuZGFyeShtYXBfYmgpOworCQkJcmV0ID0gc3VibWl0X3BhZ2Vfc2VjdGlvbihkaW8sIHNkaW8sIHBhZ2UsCisJCQkJCQkgIG9mZnNldF9pbl9wYWdlLAorCQkJCQkJICB0aGlzX2NodW5rX2J5dGVzLAorCQkJCQkJICBzZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbywKKwkJCQkJCSAgbWFwX2JoKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlkaW8tPm5leHRfYmxvY2tfZm9yX2lvICs9IHRoaXNfY2h1bmtfYmxvY2tzOworCQkJc2Rpby0+bmV4dF9ibG9ja19mb3JfaW8gKz0gdGhpc19jaHVua19ibG9ja3M7CiAKLQkJCWRpby0+YmxvY2tfaW5fZmlsZSArPSB0aGlzX2NodW5rX2Jsb2NrczsKKwkJCXNkaW8tPmJsb2NrX2luX2ZpbGUgKz0gdGhpc19jaHVua19ibG9ja3M7CiAJCQlibG9ja19pbl9wYWdlICs9IHRoaXNfY2h1bmtfYmxvY2tzOwotCQkJZGlvLT5ibG9ja3NfYXZhaWxhYmxlIC09IHRoaXNfY2h1bmtfYmxvY2tzOworCQkJc2Rpby0+YmxvY2tzX2F2YWlsYWJsZSAtPSB0aGlzX2NodW5rX2Jsb2NrczsKIG5leHRfYmxvY2s6Ci0JCQlCVUdfT04oZGlvLT5ibG9ja19pbl9maWxlID4gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KTsKLQkJCWlmIChkaW8tPmJsb2NrX2luX2ZpbGUgPT0gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KQorCQkJQlVHX09OKHNkaW8tPmJsb2NrX2luX2ZpbGUgPiBzZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KTsKKwkJCWlmIChzZGlvLT5ibG9ja19pbl9maWxlID09IHNkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QpCiAJCQkJYnJlYWs7CiAJCX0KIApAQCAtMTAyMiwxMzUgKzEwNDMsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdAotZGlyZWN0X2lvX3dvcmtlcihpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlub2RlICppbm9kZSwgCi0JY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgCi0JdW5zaWduZWQgYmxrYml0cywgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrLCBkaW9faW9kb25lX3QgZW5kX2lvLAotCWRpb19zdWJtaXRfdCBzdWJtaXRfaW8sIHN0cnVjdCBkaW8gKmRpbykKK3N0YXRpYyBpbmxpbmUgaW50IGRyb3BfcmVmY291bnQoc3RydWN0IGRpbyAqZGlvKQogewotCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyOyAKKwlpbnQgcmV0MjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBzZWc7Ci0Jc3NpemVfdCByZXQgPSAwOwotCXNzaXplX3QgcmV0MjsKLQlzaXplX3QgYnl0ZXM7Ci0KLQlkaW8tPmlub2RlID0gaW5vZGU7Ci0JZGlvLT5ydyA9IHJ3OwotCWRpby0+YmxrYml0cyA9IGJsa2JpdHM7Ci0JZGlvLT5ibGtmYWN0b3IgPSBpbm9kZS0+aV9ibGtiaXRzIC0gYmxrYml0czsKLQlkaW8tPmJsb2NrX2luX2ZpbGUgPSBvZmZzZXQgPj4gYmxrYml0czsKLQotCWRpby0+Z2V0X2Jsb2NrID0gZ2V0X2Jsb2NrOwotCWRpby0+ZW5kX2lvID0gZW5kX2lvOwotCWRpby0+c3VibWl0X2lvID0gc3VibWl0X2lvOwotCWRpby0+ZmluYWxfYmxvY2tfaW5fYmlvID0gLTE7Ci0JZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyA9IC0xOwotCi0JZGlvLT5pb2NiID0gaW9jYjsKLQlkaW8tPmlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQotCXNwaW5fbG9ja19pbml0KCZkaW8tPmJpb19sb2NrKTsKLQlkaW8tPnJlZmNvdW50ID0gMTsKLQotCS8qCi0JICogSW4gY2FzZSBvZiBub24tYWxpZ25lZCBidWZmZXJzLCB3ZSBtYXkgbmVlZCAyIG1vcmUKLQkgKiBwYWdlcyBzaW5jZSB3ZSBuZWVkIHRvIHplcm8gb3V0IGZpcnN0IGFuZCBsYXN0IGJsb2NrLgotCSAqLwotCWlmICh1bmxpa2VseShkaW8tPmJsa2ZhY3RvcikpCi0JCWRpby0+cGFnZXNfaW5faW8gPSAyOwotCi0JZm9yIChzZWcgPSAwOyBzZWcgPCBucl9zZWdzOyBzZWcrKykgewotCQl1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3Zbc2VnXS5pb3ZfYmFzZTsKLQkJZGlvLT5wYWdlc19pbl9pbyArPQotCQkJKCh1c2VyX2FkZHIraW92W3NlZ10uaW92X2xlbiArUEFHRV9TSVpFLTEpL1BBR0VfU0laRQotCQkJCS0gdXNlcl9hZGRyL1BBR0VfU0laRSk7Ci0JfQotCi0JZm9yIChzZWcgPSAwOyBzZWcgPCBucl9zZWdzOyBzZWcrKykgewotCQl1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3Zbc2VnXS5pb3ZfYmFzZTsKLQkJZGlvLT5zaXplICs9IGJ5dGVzID0gaW92W3NlZ10uaW92X2xlbjsKLQotCQkvKiBJbmRleCBpbnRvIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBmaXJzdCBibG9jayAqLwotCQlkaW8tPmZpcnN0X2Jsb2NrX2luX3BhZ2UgPSAodXNlcl9hZGRyICYgflBBR0VfTUFTSykgPj4gYmxrYml0czsKLQkJZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0ID0gZGlvLT5ibG9ja19pbl9maWxlICsKLQkJCQkJCShieXRlcyA+PiBibGtiaXRzKTsKLQkJLyogUGFnZSBmZXRjaGluZyBzdGF0ZSAqLwotCQlkaW8tPmhlYWQgPSAwOwotCQlkaW8tPnRhaWwgPSAwOwotCQlkaW8tPmN1cnJfcGFnZSA9IDA7Ci0KLQkJZGlvLT50b3RhbF9wYWdlcyA9IDA7Ci0JCWlmICh1c2VyX2FkZHIgJiAoUEFHRV9TSVpFLTEpKSB7Ci0JCQlkaW8tPnRvdGFsX3BhZ2VzKys7Ci0JCQlieXRlcyAtPSBQQUdFX1NJWkUgLSAodXNlcl9hZGRyICYgKFBBR0VfU0laRSAtIDEpKTsKLQkJfQotCQlkaW8tPnRvdGFsX3BhZ2VzICs9IChieXRlcyArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOwotCQlkaW8tPmN1cnJfdXNlcl9hZGRyZXNzID0gdXNlcl9hZGRyOwotCQotCQlyZXQgPSBkb19kaXJlY3RfSU8oZGlvKTsKLQotCQlkaW8tPnJlc3VsdCArPSBpb3Zbc2VnXS5pb3ZfbGVuIC0KLQkJCSgoZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0IC0gZGlvLT5ibG9ja19pbl9maWxlKSA8PAotCQkJCQlibGtiaXRzKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlkaW9fY2xlYW51cChkaW8pOwotCQkJYnJlYWs7Ci0JCX0KLQl9IC8qIGVuZCBpb3ZlYyBsb29wICovCi0KLQlpZiAocmV0ID09IC1FTk9UQkxLKSB7Ci0JCS8qCi0JCSAqIFRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgcmVxdWVzdCB3aWxsIGJlCi0JCSAqIGJlIGhhbmRsZWQgYnkgYnVmZmVyZWQgSS9PIHdoZW4gd2UgcmV0dXJuCi0JCSAqLwotCQlyZXQgPSAwOwotCX0KLQkvKgotCSAqIFRoZXJlIG1heSBiZSBzb21lIHVud3JpdHRlbiBkaXNrIGF0IHRoZSBlbmQgb2YgYSBwYXJ0LXdyaXR0ZW4KLQkgKiBmcy1ibG9jay1zaXplZCBibG9jay4gIEdvIHplcm8gdGhhdCBub3cuCi0JICovCi0JZGlvX3plcm9fYmxvY2soZGlvLCAxKTsKLQotCWlmIChkaW8tPmN1cl9wYWdlKSB7Ci0JCXJldDIgPSBkaW9fc2VuZF9jdXJfcGFnZShkaW8pOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSByZXQyOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UoZGlvLT5jdXJfcGFnZSk7Ci0JCWRpby0+Y3VyX3BhZ2UgPSBOVUxMOwotCX0KLQlpZiAoZGlvLT5iaW8pCi0JCWRpb19iaW9fc3VibWl0KGRpbyk7Ci0KLQkvKgotCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQsIHdlIHJldHVybiBzaG9ydCBJTyBkdWUgdG8gZW5kIG9mIGZpbGUuCi0JICogSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHJlbGVhc2UgYWxsIHRoZSBwYWdlcyB3ZSBnb3QgaG9sZCBvbi4KLQkgKi8KLQlkaW9fY2xlYW51cChkaW8pOwotCi0JLyoKLQkgKiBBbGwgYmxvY2sgbG9va3VwcyBoYXZlIGJlZW4gcGVyZm9ybWVkLiBGb3IgUkVBRCByZXF1ZXN0cwotCSAqIHdlIGNhbiBsZXQgaV9tdXRleCBnbyBub3cgdGhhdCBpdHMgYWNoaWV2ZWQgaXRzIHB1cnBvc2UKLQkgKiBvZiBwcm90ZWN0aW5nIHVzIGZyb20gbG9va2luZyB1cCB1bmluaXRpYWxpemVkIGJsb2Nrcy4KLQkgKi8KLQlpZiAocncgPT0gUkVBRCAmJiAoZGlvLT5mbGFncyAmIERJT19MT0NLSU5HKSkKLQkJbXV0ZXhfdW5sb2NrKCZkaW8tPmlub2RlLT5pX211dGV4KTsKLQotCS8qCi0JICogVGhlIG9ubHkgdGltZSB3ZSB3YW50IHRvIGxlYXZlIGJpb3MgaW4gZmxpZ2h0IGlzIHdoZW4gYSBzdWNjZXNzZnVsCi0JICogcGFydGlhbCBhaW8gcmVhZCBvciBmdWxsIGFpbyB3cml0ZSBoYXZlIGJlZW4gc2V0dXAuICBJbiB0aGF0IGNhc2UKLQkgKiBiaW8gY29tcGxldGlvbiB3aWxsIGNhbGwgYWlvX2NvbXBsZXRlLiAgVGhlIG9ubHkgdGltZSBpdCdzIHNhZmUgdG8KLQkgKiBjYWxsIGFpb19jb21wbGV0ZSBpcyB3aGVuIHdlIHJldHVybiAtRUlPQ0JRVUVVRUQsIHNvIHdlIGtleSBvbiB0aGF0LgotCSAqIFRoaXMgaGFkICpiZXR0ZXIqIGJlIHRoZSBvbmx5IHBsYWNlIHRoYXQgcmFpc2VzIC1FSU9DQlFVRVVFRC4KLQkgKi8KLQlCVUdfT04ocmV0ID09IC1FSU9DQlFVRVVFRCk7Ci0JaWYgKGRpby0+aXNfYXN5bmMgJiYgcmV0ID09IDAgJiYgZGlvLT5yZXN1bHQgJiYKLQkgICAgKChydyAmIFJFQUQpIHx8IChkaW8tPnJlc3VsdCA9PSBkaW8tPnNpemUpKSkKLQkJcmV0ID0gLUVJT0NCUVVFVUVEOwotCi0JaWYgKHJldCAhPSAtRUlPQ0JRVUVVRUQpCi0JCWRpb19hd2FpdF9jb21wbGV0aW9uKGRpbyk7CiAKIAkvKgogCSAqIFN5bmMgd2lsbCBhbHdheXMgYmUgZHJvcHBpbmcgdGhlIGZpbmFsIHJlZiBhbmQgY29tcGxldGluZyB0aGUKQEAgLTExNjYsMTQgKzEwNjIsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CiAJcmV0MiA9IC0tZGlvLT5yZWZjb3VudDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7Ci0KLQlpZiAocmV0MiA9PSAwKSB7Ci0JCXJldCA9IGRpb19jb21wbGV0ZShkaW8sIG9mZnNldCwgcmV0LCBmYWxzZSk7Ci0JCWtmcmVlKGRpbyk7Ci0JfSBlbHNlCi0JCUJVR19PTihyZXQgIT0gLUVJT0NCUVVFVUVEKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHJldDI7CiB9CiAKIC8qCkBAIC0xMTk1LDYgKzEwODQsMTEgQEAKICAqIGV4cGVjdGVkIHRoYXQgZmlsZXN5c3RlbSBwcm92aWRlIGV4Y2x1c2lvbiBiZXR3ZWVuIG5ldyBkaXJlY3QgSS9PCiAgKiBhbmQgdHJ1bmNhdGVzLiAgRm9yIERJT19MT0NLSU5HIGZpbGVzeXN0ZW1zIHRoaXMgaXMgZG9uZSBieSBpX211dGV4LAogICogYnV0IG90aGVyIGZpbGVzeXN0ZW1zIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHRoaXMgb24gdGhlaXIgb3duLgorICoKKyAqIE5PVEU6IGlmIHlvdSBwYXNzICJzZGlvIiB0byBhbnl0aGluZyBieSBwb2ludGVyIG1ha2Ugc3VyZSB0aGF0IGZ1bmN0aW9uCisgKiBpcyBhbHdheXMgaW5saW5lZC4gT3RoZXJ3aXNlIGdjYyBpcyB1bmFibGUgdG8gc3BsaXQgdGhlIHN0cnVjdHVyZSBpbnRvCisgKiBpbmRpdmlkdWFsIGZpZWxkcyBhbmQgd2lsbCBnZW5lcmF0ZSBtdWNoIHdvcnNlIGNvZGUuIFRoaXMgaXMgaW1wb3J0YW50CisgKiBmb3IgdGhlIHdob2xlIGZpbGUuCiAgKi8KIHNzaXplX3QKIF9fYmxvY2tkZXZfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLApAQCAtMTIxMSw2ICsxMTA1LDEwIEBACiAJc3NpemVfdCByZXR2YWwgPSAtRUlOVkFMOwogCWxvZmZfdCBlbmQgPSBvZmZzZXQ7CiAJc3RydWN0IGRpbyAqZGlvOworCXN0cnVjdCBkaW9fc3VibWl0IHNkaW8gPSB7IDAsIH07CisJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHI7CisJc2l6ZV90IGJ5dGVzOworCXN0cnVjdCBidWZmZXJfaGVhZCBtYXBfYmggPSB7IDAsIH07CiAKIAlpZiAocncgJiBXUklURSkKIAkJcncgPSBXUklURV9PRElSRUNUOwpAQCAtMTI0NCw3ICsxMTQyLDcgQEAKIAlpZiAocncgPT0gUkVBRCAmJiBlbmQgPT0gb2Zmc2V0KQogCQlyZXR1cm4gMDsKIAotCWRpbyA9IGttYWxsb2Moc2l6ZW9mKCpkaW8pLCBHRlBfS0VSTkVMKTsKKwlkaW8gPSBrbWVtX2NhY2hlX2FsbG9jKGRpb19jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJcmV0dmFsID0gLUVOT01FTTsKIAlpZiAoIWRpbykKIAkJZ290byBvdXQ7CkBAIC0xMjY4LDcgKzExNjYsNyBAQAogCQkJCQkJCSAgICAgIGVuZCAtIDEpOwogCQkJaWYgKHJldHZhbCkgewogCQkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQkJCWtmcmVlKGRpbyk7CisJCQkJa21lbV9jYWNoZV9mcmVlKGRpb19jYWNoZSwgZGlvKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfQpAQCAtMTI4OCwxMSArMTE4NiwxNDEgQEAKIAlkaW8tPmlzX2FzeW5jID0gIWlzX3N5bmNfa2lvY2IoaW9jYikgJiYgISgocncgJiBXUklURSkgJiYKIAkJKGVuZCA+IGlfc2l6ZV9yZWFkKGlub2RlKSkpOwogCi0JcmV0dmFsID0gZGlyZWN0X2lvX3dvcmtlcihydywgaW9jYiwgaW5vZGUsIGlvdiwgb2Zmc2V0LAotCQkJCW5yX3NlZ3MsIGJsa2JpdHMsIGdldF9ibG9jaywgZW5kX2lvLAotCQkJCXN1Ym1pdF9pbywgZGlvKTsKKwlyZXR2YWwgPSAwOworCisJZGlvLT5pbm9kZSA9IGlub2RlOworCWRpby0+cncgPSBydzsKKwlzZGlvLmJsa2JpdHMgPSBibGtiaXRzOworCXNkaW8uYmxrZmFjdG9yID0gaW5vZGUtPmlfYmxrYml0cyAtIGJsa2JpdHM7CisJc2Rpby5ibG9ja19pbl9maWxlID0gb2Zmc2V0ID4+IGJsa2JpdHM7CisKKwlzZGlvLmdldF9ibG9jayA9IGdldF9ibG9jazsKKwlkaW8tPmVuZF9pbyA9IGVuZF9pbzsKKwlzZGlvLnN1Ym1pdF9pbyA9IHN1Ym1pdF9pbzsKKwlzZGlvLmZpbmFsX2Jsb2NrX2luX2JpbyA9IC0xOworCXNkaW8ubmV4dF9ibG9ja19mb3JfaW8gPSAtMTsKKworCWRpby0+aW9jYiA9IGlvY2I7CisJZGlvLT5pX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwlzcGluX2xvY2tfaW5pdCgmZGlvLT5iaW9fbG9jayk7CisJZGlvLT5yZWZjb3VudCA9IDE7CisKKwkvKgorCSAqIEluIGNhc2Ugb2Ygbm9uLWFsaWduZWQgYnVmZmVycywgd2UgbWF5IG5lZWQgMiBtb3JlCisJICogcGFnZXMgc2luY2Ugd2UgbmVlZCB0byB6ZXJvIG91dCBmaXJzdCBhbmQgbGFzdCBibG9jay4KKwkgKi8KKwlpZiAodW5saWtlbHkoc2Rpby5ibGtmYWN0b3IpKQorCQlzZGlvLnBhZ2VzX2luX2lvID0gMjsKKworCWZvciAoc2VnID0gMDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspIHsKKwkJdXNlcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW92W3NlZ10uaW92X2Jhc2U7CisJCXNkaW8ucGFnZXNfaW5faW8gKz0KKwkJCSgodXNlcl9hZGRyICsgaW92W3NlZ10uaW92X2xlbiArIFBBR0VfU0laRS0xKSAvCisJCQkJUEFHRV9TSVpFIC0gdXNlcl9hZGRyIC8gUEFHRV9TSVpFKTsKKwl9CisKKwlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7CisJCXVzZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdltzZWddLmlvdl9iYXNlOworCQlzZGlvLnNpemUgKz0gYnl0ZXMgPSBpb3Zbc2VnXS5pb3ZfbGVuOworCisJCS8qIEluZGV4IGludG8gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGZpcnN0IGJsb2NrICovCisJCXNkaW8uZmlyc3RfYmxvY2tfaW5fcGFnZSA9ICh1c2VyX2FkZHIgJiB+UEFHRV9NQVNLKSA+PiBibGtiaXRzOworCQlzZGlvLmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgPSBzZGlvLmJsb2NrX2luX2ZpbGUgKworCQkJCQkJKGJ5dGVzID4+IGJsa2JpdHMpOworCQkvKiBQYWdlIGZldGNoaW5nIHN0YXRlICovCisJCXNkaW8uaGVhZCA9IDA7CisJCXNkaW8udGFpbCA9IDA7CisJCXNkaW8uY3Vycl9wYWdlID0gMDsKKworCQlzZGlvLnRvdGFsX3BhZ2VzID0gMDsKKwkJaWYgKHVzZXJfYWRkciAmIChQQUdFX1NJWkUtMSkpIHsKKwkJCXNkaW8udG90YWxfcGFnZXMrKzsKKwkJCWJ5dGVzIC09IFBBR0VfU0laRSAtICh1c2VyX2FkZHIgJiAoUEFHRV9TSVpFIC0gMSkpOworCQl9CisJCXNkaW8udG90YWxfcGFnZXMgKz0gKGJ5dGVzICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJCXNkaW8uY3Vycl91c2VyX2FkZHJlc3MgPSB1c2VyX2FkZHI7CisKKwkJcmV0dmFsID0gZG9fZGlyZWN0X0lPKGRpbywgJnNkaW8sICZtYXBfYmgpOworCisJCWRpby0+cmVzdWx0ICs9IGlvdltzZWddLmlvdl9sZW4gLQorCQkJKChzZGlvLmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgLSBzZGlvLmJsb2NrX2luX2ZpbGUpIDw8CisJCQkJCWJsa2JpdHMpOworCisJCWlmIChyZXR2YWwpIHsKKwkJCWRpb19jbGVhbnVwKGRpbywgJnNkaW8pOworCQkJYnJlYWs7CisJCX0KKwl9IC8qIGVuZCBpb3ZlYyBsb29wICovCisKKwlpZiAocmV0dmFsID09IC1FTk9UQkxLKSB7CisJCS8qCisJCSAqIFRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgcmVxdWVzdCB3aWxsIGJlCisJCSAqIGJlIGhhbmRsZWQgYnkgYnVmZmVyZWQgSS9PIHdoZW4gd2UgcmV0dXJuCisJCSAqLworCQlyZXR2YWwgPSAwOworCX0KKwkvKgorCSAqIFRoZXJlIG1heSBiZSBzb21lIHVud3JpdHRlbiBkaXNrIGF0IHRoZSBlbmQgb2YgYSBwYXJ0LXdyaXR0ZW4KKwkgKiBmcy1ibG9jay1zaXplZCBibG9jay4gIEdvIHplcm8gdGhhdCBub3cuCisJICovCisJZGlvX3plcm9fYmxvY2soZGlvLCAmc2RpbywgMSwgJm1hcF9iaCk7CisKKwlpZiAoc2Rpby5jdXJfcGFnZSkgeworCQlzc2l6ZV90IHJldDI7CisKKwkJcmV0MiA9IGRpb19zZW5kX2N1cl9wYWdlKGRpbywgJnNkaW8sICZtYXBfYmgpOworCQlpZiAocmV0dmFsID09IDApCisJCQlyZXR2YWwgPSByZXQyOworCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc2Rpby5jdXJfcGFnZSk7CisJCXNkaW8uY3VyX3BhZ2UgPSBOVUxMOworCX0KKwlpZiAoc2Rpby5iaW8pCisJCWRpb19iaW9fc3VibWl0KGRpbywgJnNkaW8pOworCisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0LCB3ZSByZXR1cm4gc2hvcnQgSU8gZHVlIHRvIGVuZCBvZiBmaWxlLgorCSAqIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byByZWxlYXNlIGFsbCB0aGUgcGFnZXMgd2UgZ290IGhvbGQgb24uCisJICovCisJZGlvX2NsZWFudXAoZGlvLCAmc2Rpbyk7CisKKwkvKgorCSAqIEFsbCBibG9jayBsb29rdXBzIGhhdmUgYmVlbiBwZXJmb3JtZWQuIEZvciBSRUFEIHJlcXVlc3RzCisJICogd2UgY2FuIGxldCBpX211dGV4IGdvIG5vdyB0aGF0IGl0cyBhY2hpZXZlZCBpdHMgcHVycG9zZQorCSAqIG9mIHByb3RlY3RpbmcgdXMgZnJvbSBsb29raW5nIHVwIHVuaW5pdGlhbGl6ZWQgYmxvY2tzLgorCSAqLworCWlmIChydyA9PSBSRUFEICYmIChkaW8tPmZsYWdzICYgRElPX0xPQ0tJTkcpKQorCQltdXRleF91bmxvY2soJmRpby0+aW5vZGUtPmlfbXV0ZXgpOworCisJLyoKKwkgKiBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gbGVhdmUgYmlvcyBpbiBmbGlnaHQgaXMgd2hlbiBhIHN1Y2Nlc3NmdWwKKwkgKiBwYXJ0aWFsIGFpbyByZWFkIG9yIGZ1bGwgYWlvIHdyaXRlIGhhdmUgYmVlbiBzZXR1cC4gIEluIHRoYXQgY2FzZQorCSAqIGJpbyBjb21wbGV0aW9uIHdpbGwgY2FsbCBhaW9fY29tcGxldGUuICBUaGUgb25seSB0aW1lIGl0J3Mgc2FmZSB0bworCSAqIGNhbGwgYWlvX2NvbXBsZXRlIGlzIHdoZW4gd2UgcmV0dXJuIC1FSU9DQlFVRVVFRCwgc28gd2Uga2V5IG9uIHRoYXQuCisJICogVGhpcyBoYWQgKmJldHRlciogYmUgdGhlIG9ubHkgcGxhY2UgdGhhdCByYWlzZXMgLUVJT0NCUVVFVUVELgorCSAqLworCUJVR19PTihyZXR2YWwgPT0gLUVJT0NCUVVFVUVEKTsKKwlpZiAoZGlvLT5pc19hc3luYyAmJiByZXR2YWwgPT0gMCAmJiBkaW8tPnJlc3VsdCAmJgorCSAgICAoKHJ3ICYgUkVBRCkgfHwgKGRpby0+cmVzdWx0ID09IHNkaW8uc2l6ZSkpKQorCQlyZXR2YWwgPSAtRUlPQ0JRVUVVRUQ7CisKKwlpZiAocmV0dmFsICE9IC1FSU9DQlFVRVVFRCkKKwkJZGlvX2F3YWl0X2NvbXBsZXRpb24oZGlvKTsKKworCWlmIChkcm9wX3JlZmNvdW50KGRpbykgPT0gMCkgeworCQlyZXR2YWwgPSBkaW9fY29tcGxldGUoZGlvLCBvZmZzZXQsIHJldHZhbCwgZmFsc2UpOworCQlrbWVtX2NhY2hlX2ZyZWUoZGlvX2NhY2hlLCBkaW8pOworCX0gZWxzZQorCQlCVUdfT04ocmV0dmFsICE9IC1FSU9DQlFVRVVFRCk7CiAKIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQogRVhQT1JUX1NZTUJPTChfX2Jsb2NrZGV2X2RpcmVjdF9JTyk7CisKK3N0YXRpYyBfX2luaXQgaW50IGRpb19pbml0KHZvaWQpCit7CisJZGlvX2NhY2hlID0gS01FTV9DQUNIRShkaW8sIFNMQUJfUEFOSUMpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoZGlvX2luaXQpCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaCBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCmluZGV4IGIzNmM1NTcuLjU0NDgxYTMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCisrKyBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCkBAIC01MTQsNyArNTE0LDcgQEAKIAogI2RlZmluZSBlY3J5cHRmc19wcmludGsodHlwZSwgZm10LCBhcmcuLi4pIFwKICAgICAgICAgX19lY3J5cHRmc19wcmludGsodHlwZSAiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyMgYXJnKTsKLV9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpCitfX3ByaW50ZigxLCAyKQogdm9pZCBfX2VjcnlwdGZzX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVjcnlwdGZzX21haW5fZm9wczsKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2lub2RlLmMgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCmluZGV4IDExZjg1ODIuLmEzNmQzMjcgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2lub2RlLmMKKysrIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwpAQCAtNDc0LDggKzQ3NCw4IEBACiAJCWdvdG8gb3V0X2xvY2s7CiAJZnNzdGFja19jb3B5X2F0dHJfdGltZXMoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKIAlmc3N0YWNrX2NvcHlfaW5vZGVfc2l6ZShkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOwotCW9sZF9kZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPQotCQllY3J5cHRmc19pbm9kZV90b19sb3dlcihvbGRfZGVudHJ5LT5kX2lub2RlKS0+aV9ubGluazsKKwlzZXRfbmxpbmsob2xkX2RlbnRyeS0+ZF9pbm9kZSwKKwkJICBlY3J5cHRmc19pbm9kZV90b19sb3dlcihvbGRfZGVudHJ5LT5kX2lub2RlKS0+aV9ubGluayk7CiAJaV9zaXplX3dyaXRlKG5ld19kZW50cnktPmRfaW5vZGUsIGZpbGVfc2l6ZV9zYXZlKTsKIG91dF9sb2NrOgogCXVubG9ja19kaXIobG93ZXJfZGlyX2RlbnRyeSk7CkBAIC00OTksOCArNDk5LDggQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAlmc3N0YWNrX2NvcHlfYXR0cl90aW1lcyhkaXIsIGxvd2VyX2Rpcl9pbm9kZSk7Ci0JZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID0KLQkJZWNyeXB0ZnNfaW5vZGVfdG9fbG93ZXIoZGVudHJ5LT5kX2lub2RlKS0+aV9ubGluazsKKwlzZXRfbmxpbmsoZGVudHJ5LT5kX2lub2RlLAorCQkgIGVjcnlwdGZzX2lub2RlX3RvX2xvd2VyKGRlbnRyeS0+ZF9pbm9kZSktPmlfbmxpbmspOwogCWRlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZTsKIAlkX2Ryb3AoZGVudHJ5KTsKIG91dF91bmxvY2s6CkBAIC01NjUsNyArNTY1LDcgQEAKIAkJZ290byBvdXQ7CiAJZnNzdGFja19jb3B5X2F0dHJfdGltZXMoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKIAlmc3N0YWNrX2NvcHlfaW5vZGVfc2l6ZShkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOwotCWRpci0+aV9ubGluayA9IGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUtPmlfbmxpbms7CisJc2V0X25saW5rKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayk7CiBvdXQ6CiAJdW5sb2NrX2Rpcihsb3dlcl9kaXJfZGVudHJ5KTsKIAlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKQEAgLTU4OCw3ICs1ODgsNyBAQAogCWlmICghcmMgJiYgZGVudHJ5LT5kX2lub2RlKQogCQljbGVhcl9ubGluayhkZW50cnktPmRfaW5vZGUpOwogCWZzc3RhY2tfY29weV9hdHRyX3RpbWVzKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7Ci0JZGlyLT5pX25saW5rID0gbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluazsKKwlzZXRfbmxpbmsoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlLT5pX25saW5rKTsKIAl1bmxvY2tfZGlyKGxvd2VyX2Rpcl9kZW50cnkpOwogCWlmICghcmMpCiAJCWRfZHJvcChkZW50cnkpOwpkaWZmIC0tZ2l0IGEvZnMvZWZzL2lub2RlLmMgYi9mcy9lZnMvaW5vZGUuYwppbmRleCA5YzEzNDEyLi5iYzg0ZjM2IDEwMDY0NAotLS0gYS9mcy9lZnMvaW5vZGUuYworKysgYi9mcy9lZnMvaW5vZGUuYwpAQCAtOTYsNyArOTYsNyBAQAogCWVmc19pbm9kZSA9IChzdHJ1Y3QgZWZzX2Rpbm9kZSAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CiAgICAgCiAJaW5vZGUtPmlfbW9kZSAgPSBiZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX21vZGUpOwotCWlub2RlLT5pX25saW5rID0gYmUxNl90b19jcHUoZWZzX2lub2RlLT5kaV9ubGluayk7CisJc2V0X25saW5rKGlub2RlLCBiZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX25saW5rKSk7CiAJaW5vZGUtPmlfdWlkICAgPSAodWlkX3QpYmUxNl90b19jcHUoZWZzX2lub2RlLT5kaV91aWQpOwogCWlub2RlLT5pX2dpZCAgID0gKGdpZF90KWJlMTZfdG9fY3B1KGVmc19pbm9kZS0+ZGlfZ2lkKTsKIAlpbm9kZS0+aV9zaXplICA9IGJlMzJfdG9fY3B1KGVmc19pbm9kZS0+ZGlfc2l6ZSk7CmRpZmYgLS1naXQgYS9mcy9ldmVudHBvbGwuYyBiL2ZzL2V2ZW50cG9sbC5jCmluZGV4IDkwMjZmYzkuLjgyOGU3NTAgMTAwNjQ0Ci0tLSBhL2ZzL2V2ZW50cG9sbC5jCisrKyBiL2ZzL2V2ZW50cG9sbC5jCkBAIC03MCw2ICs3MCwxNSBAQAogICogc2ltdWx0YW5lb3VzIGluc2VydHMgKEEgaW50byBCIGFuZCBCIGludG8gQSkgZnJvbSByYWNpbmcgYW5kCiAgKiBjb25zdHJ1Y3RpbmcgYSBjeWNsZSB3aXRob3V0IGVpdGhlciBpbnNlcnQgb2JzZXJ2aW5nIHRoYXQgaXQgaXMKICAqIGdvaW5nIHRvLgorICogSXQgaXMgbmVjZXNzYXJ5IHRvIGFjcXVpcmUgbXVsdGlwbGUgImVwLT5tdHgiZXMgYXQgb25jZSBpbiB0aGUKKyAqIGNhc2Ugd2hlbiBvbmUgZXBvbGwgZmQgaXMgYWRkZWQgdG8gYW5vdGhlci4gSW4gdGhpcyBjYXNlLCB3ZQorICogYWx3YXlzIGFjcXVpcmUgdGhlIGxvY2tzIGluIHRoZSBvcmRlciBvZiBuZXN0aW5nIChpLmUuIGFmdGVyCisgKiBlcG9sbF9jdGwoZTEsIEVQT0xMX0NUTF9BREQsIGUyKSwgZTEtPm10eCB3aWxsIGFsd2F5cyBiZSBhY3F1aXJlZAorICogYmVmb3JlIGUyLT5tdHgpLiBTaW5jZSB3ZSBkaXNhbGxvdyBjeWNsZXMgb2YgZXBvbGwgZmlsZQorICogZGVzY3JpcHRvcnMsIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtdXRleGVzIGFyZSB3ZWxsLW9yZGVyZWQuIEluCisgKiBvcmRlciB0byBjb21tdW5pY2F0ZSB0aGlzIG5lc3RpbmcgdG8gbG9ja2RlcCwgd2hlbiB3YWxraW5nIGEgdHJlZQorICogb2YgZXBvbGwgZmlsZSBkZXNjcmlwdG9ycywgd2UgdXNlIHRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aCBhcworICogdGhlIGxvY2tkZXAgc3Via2V5LgogICogSXQgaXMgcG9zc2libGUgdG8gZHJvcCB0aGUgImVwLT5tdHgiIGFuZCB0byB1c2UgdGhlIGdsb2JhbAogICogbXV0ZXggImVwbXV0ZXgiICh0b2dldGhlciB3aXRoICJlcC0+bG9jayIpIHRvIGhhdmUgaXQgd29ya2luZywKICAqIGJ1dCBoYXZpbmcgImVwLT5tdHgiIHdpbGwgbWFrZSB0aGUgaW50ZXJmYWNlIG1vcmUgc2NhbGFibGUuCkBAIC00NjQsMTMgKzQ3MywxNSBAQAogICogQGVwOiBQb2ludGVyIHRvIHRoZSBlcG9sbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlLgogICogQHNwcm9jOiBQb2ludGVyIHRvIHRoZSBzY2FuIGNhbGxiYWNrLgogICogQHByaXY6IFByaXZhdGUgb3BhcXVlIGRhdGEgcGFzc2VkIHRvIHRoZSBAc3Byb2MgY2FsbGJhY2suCisgKiBAZGVwdGg6IFRoZSBjdXJyZW50IGRlcHRoIG9mIHJlY3Vyc2l2ZSBmX29wLT5wb2xsIGNhbGxzLgogICoKICAqIFJldHVybnM6IFRoZSBzYW1lIGludGVnZXIgZXJyb3IgY29kZSByZXR1cm5lZCBieSB0aGUgQHNwcm9jIGNhbGxiYWNrLgogICovCiBzdGF0aWMgaW50IGVwX3NjYW5fcmVhZHlfbGlzdChzdHJ1Y3QgZXZlbnRwb2xsICplcCwKIAkJCSAgICAgIGludCAoKnNwcm9jKShzdHJ1Y3QgZXZlbnRwb2xsICosCiAJCQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKiwgdm9pZCAqKSwKLQkJCSAgICAgIHZvaWQgKnByaXYpCisJCQkgICAgICB2b2lkICpwcml2LAorCQkJICAgICAgaW50IGRlcHRoKQogewogCWludCBlcnJvciwgcHdha2UgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00ODEsNyArNDkyLDcgQEAKIAkgKiBXZSBuZWVkIHRvIGxvY2sgdGhpcyBiZWNhdXNlIHdlIGNvdWxkIGJlIGhpdCBieQogCSAqIGV2ZW50cG9sbF9yZWxlYXNlX2ZpbGUoKSBhbmQgZXBvbGxfY3RsKCkuCiAJICovCi0JbXV0ZXhfbG9jaygmZXAtPm10eCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmVwLT5tdHgsIGRlcHRoKTsKIAogCS8qCiAJICogU3RlYWwgdGhlIHJlYWR5IGxpc3QsIGFuZCByZS1pbml0IHRoZSBvcmlnaW5hbCBvbmUgdG8gdGhlCkBAIC02NzAsNyArNjgxLDcgQEAKIAogc3RhdGljIGludCBlcF9wb2xsX3JlYWR5ZXZlbnRzX3Byb2Modm9pZCAqcHJpdiwgdm9pZCAqY29va2llLCBpbnQgY2FsbF9uZXN0cykKIHsKLQlyZXR1cm4gZXBfc2Nhbl9yZWFkeV9saXN0KHByaXYsIGVwX3JlYWRfZXZlbnRzX3Byb2MsIE5VTEwpOworCXJldHVybiBlcF9zY2FuX3JlYWR5X2xpc3QocHJpdiwgZXBfcmVhZF9ldmVudHNfcHJvYywgTlVMTCwgY2FsbF9uZXN0cyArIDEpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGVwX2V2ZW50cG9sbF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQpAQCAtNzM3LDcgKzc0OCw3IEBACiAKIAkJZXAgPSBlcGktPmVwOwogCQlsaXN0X2RlbF9pbml0KCZlcGktPmZsbGluayk7Ci0JCW11dGV4X2xvY2soJmVwLT5tdHgpOworCQltdXRleF9sb2NrX25lc3RlZCgmZXAtPm10eCwgMCk7CiAJCWVwX3JlbW92ZShlcCwgZXBpKTsKIAkJbXV0ZXhfdW5sb2NrKCZlcC0+bXR4KTsKIAl9CkBAIC0xMTM0LDcgKzExNDUsNyBAQAogCWVzZWQubWF4ZXZlbnRzID0gbWF4ZXZlbnRzOwogCWVzZWQuZXZlbnRzID0gZXZlbnRzOwogCi0JcmV0dXJuIGVwX3NjYW5fcmVhZHlfbGlzdChlcCwgZXBfc2VuZF9ldmVudHNfcHJvYywgJmVzZWQpOworCXJldHVybiBlcF9zY2FuX3JlYWR5X2xpc3QoZXAsIGVwX3NlbmRfZXZlbnRzX3Byb2MsICZlc2VkLCAwKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGltZXNwZWMgZXBfc2V0X21zdGltZW91dChsb25nIG1zKQpAQCAtMTI2Nyw3ICsxMjc4LDcgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqcmJwOwogCXN0cnVjdCBlcGl0ZW0gKmVwaTsKIAotCW11dGV4X2xvY2soJmVwLT5tdHgpOworCW11dGV4X2xvY2tfbmVzdGVkKCZlcC0+bXR4LCBjYWxsX25lc3RzICsgMSk7CiAJZm9yIChyYnAgPSByYl9maXJzdCgmZXAtPnJicik7IHJicDsgcmJwID0gcmJfbmV4dChyYnApKSB7CiAJCWVwaSA9IHJiX2VudHJ5KHJicCwgc3RydWN0IGVwaXRlbSwgcmJuKTsKIAkJaWYgKHVubGlrZWx5KGlzX2ZpbGVfZXBvbGwoZXBpLT5mZmQuZmlsZSkpKSB7CkBAIC0xNDA5LDcgKzE0MjAsNyBAQAogCX0KIAogCi0JbXV0ZXhfbG9jaygmZXAtPm10eCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmVwLT5tdHgsIDApOwogCiAJLyoKIAkgKiBUcnkgdG8gbG9va3VwIHRoZSBmaWxlIGluc2lkZSBvdXIgUkIgdHJlZSwgU2luY2Ugd2UgZ3JhYmJlZCAibXR4IgpkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IDI1ZGNiZTUuLjM2MjU0NjQgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTg0MSwxMCArODQxLDYgQEAKIAl0c2stPm1tID0gbW07CiAJdHNrLT5hY3RpdmVfbW0gPSBtbTsKIAlhY3RpdmF0ZV9tbShhY3RpdmVfbW0sIG1tKTsKLQlpZiAob2xkX21tICYmIHRzay0+c2lnbmFsLT5vb21fc2NvcmVfYWRqID09IE9PTV9TQ09SRV9BREpfTUlOKSB7Ci0JCWF0b21pY19kZWMoJm9sZF9tbS0+b29tX2Rpc2FibGVfY291bnQpOwotCQlhdG9taWNfaW5jKCZ0c2stPm1tLT5vb21fZGlzYWJsZV9jb3VudCk7Ci0JfQogCXRhc2tfdW5sb2NrKHRzayk7CiAJYXJjaF9waWNrX21tYXBfbGF5b3V0KG1tKTsKIAlpZiAob2xkX21tKSB7CmRpZmYgLS1naXQgYS9mcy9leG9mcy9LY29uZmlnIGIvZnMvZXhvZnMvS2NvbmZpZwppbmRleCBmYTlhMjg2Li5kYTQyZjMyIDEwMDY0NAotLS0gYS9mcy9leG9mcy9LY29uZmlnCisrKyBiL2ZzL2V4b2ZzL0tjb25maWcKQEAgLTUsNyArNSw3IEBACiAjIHNlbGVjdGVkIGJ5IGFueSBvZiB0aGUgdXNlcnMuCiBjb25maWcgT1JFCiAJdHJpc3RhdGUKLQlkZXBlbmRzIG9uIEVYT0ZTX0ZTCisJZGVwZW5kcyBvbiBFWE9GU19GUyB8fCBQTkZTX09CSkxBWU9VVAogCXNlbGVjdCBBU1lOQ19YT1IKIAlkZWZhdWx0IFNDU0lfT1NEX1VMRAogCmRpZmYgLS1naXQgYS9mcy9leG9mcy9pbm9kZS5jIGIvZnMvZXhvZnMvaW5vZGUuYwppbmRleCAzZTVmM2E2Li5mNmRiZjc3IDEwMDY0NAotLS0gYS9mcy9leG9mcy9pbm9kZS5jCisrKyBiL2ZzL2V4b2ZzL2lub2RlLmMKQEAgLTExNjUsNyArMTE2NSw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IGxlMTZfdG9fY3B1KGZjYi5pX21vZGUpOwogCWlub2RlLT5pX3VpZCA9IGxlMzJfdG9fY3B1KGZjYi5pX3VpZCk7CiAJaW5vZGUtPmlfZ2lkID0gbGUzMl90b19jcHUoZmNiLmlfZ2lkKTsKLQlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KGZjYi5pX2xpbmtzX2NvdW50KTsKKwlzZXRfbmxpbmsoaW5vZGUsIGxlMTZfdG9fY3B1KGZjYi5pX2xpbmtzX2NvdW50KSk7CiAJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gKHNpZ25lZClsZTMyX3RvX2NwdShmY2IuaV9jdGltZSk7CiAJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gKHNpZ25lZClsZTMyX3RvX2NwdShmY2IuaV9hdGltZSk7CiAJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gKHNpZ25lZClsZTMyX3RvX2NwdShmY2IuaV9tdGltZSk7CmRpZmYgLS1naXQgYS9mcy9leG9mcy9vcmUuYyBiL2ZzL2V4b2ZzL29yZS5jCmluZGV4IGZjZmE4NmEuLmQyNzFhZDggMTAwNjQ0Ci0tLSBhL2ZzL2V4b2ZzL29yZS5jCisrKyBiL2ZzL2V4b2ZzL29yZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxsaW51eC9sY20uaD4KIApkaWZmIC0tZ2l0IGEvZnMvZXhvZnMvc3VwZXIuYyBiL2ZzL2V4b2ZzL3N1cGVyLmMKaW5kZXggMDU3YjIzNy4uZTYwODVlYyAxMDA2NDQKLS0tIGEvZnMvZXhvZnMvc3VwZXIuYworKysgYi9mcy9leG9mcy9zdXBlci5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvYmFsbG9jLmMgYi9mcy9leHQyL2JhbGxvYy5jCmluZGV4IDhmNDRjZWYuLmE4Y2JlMWIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvYmFsbG9jLmMKKysrIGIvZnMvZXh0Mi9iYWxsb2MuYwpAQCAtNDIxLDcgKzQyMSw3IEBACiB2b2lkIGV4dDJfaW5pdF9ibG9ja19hbGxvY19pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koaW5vZGUpOwotCXN0cnVjdCBleHQyX2Jsb2NrX2FsbG9jX2luZm8gKmJsb2NrX2kgPSBlaS0+aV9ibG9ja19hbGxvY19pbmZvOworCXN0cnVjdCBleHQyX2Jsb2NrX2FsbG9jX2luZm8gKmJsb2NrX2k7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCiAJYmxvY2tfaSA9IGttYWxsb2Moc2l6ZW9mKCpibG9ja19pKSwgR0ZQX05PRlMpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9leHQyLmggYi9mcy9leHQyL2V4dDIuaAppbmRleCBhZjlmYzg5Li45YTRlNWUyMCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9leHQyLmgKKysrIGIvZnMvZXh0Mi9leHQyLmgKQEAgLTEzNSwxMCArMTM1LDEwIEBACiBzdHJ1Y3QgZGVudHJ5ICpleHQyX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpOwogCiAvKiBzdXBlci5jICovCi1leHRlcm4gdm9pZCBleHQyX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gdm9pZCBleHQyX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0Ml9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0Ml9tc2coc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogZXh0ZXJuIHZvaWQgZXh0Ml91cGRhdGVfZHluYW1pY19yZXYgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogZXh0ZXJuIHZvaWQgZXh0Ml93cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogCmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwppbmRleCBlZTllZDMxLi5jNGU4MWRmYiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pYWxsb2MuYworKysgYi9mcy9leHQyL2lhbGxvYy5jCkBAIC02MDEsNyArNjAxLDcgQEAKIGZhaWxfZHJvcDoKIAlkcXVvdF9kcm9wKGlub2RlKTsKIAlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKGlub2RlKTsKIAl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAlpcHV0KGlub2RlKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9pbm9kZS5jIGIvZnMvZXh0Mi9pbm9kZS5jCmluZGV4IGE4YTU4ZjYuLjkxYTY5NDUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvaW5vZGUuYworKysgYi9mcy9leHQyL2lub2RlLmMKQEAgLTEzMjEsNyArMTMyMSw3IEBACiAJCWlub2RlLT5pX3VpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2hpZ2gpIDw8IDE2OwogCQlpbm9kZS0+aV9naWQgfD0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2dpZF9oaWdoKSA8PCAxNjsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbGlua3NfY291bnQpOworCXNldF9ubGluayhpbm9kZSwgbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2xpbmtzX2NvdW50KSk7CiAJaW5vZGUtPmlfc2l6ZSA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9zaXplKTsKIAlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSAoc2lnbmVkKWxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9hdGltZSk7CiAJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gKHNpZ25lZClsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfY3RpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IDFkZDYyZWQuLmJkOGFjMTYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTMyNywxMCArMzI3LDEwIEBACiAJaWYgKGlubyA+IGxlMzJfdG9fY3B1KEVYVDJfU0Ioc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCiAJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwogCi0JLyogaWdldCBpc24ndCByZWFsbHkgcmlnaHQgaWYgdGhlIGlub2RlIGlzIGN1cnJlbnRseSB1bmFsbG9jYXRlZCEhCi0JICogZXh0Ml9yZWFkX2lub2RlIGN1cnJlbnRseSBkb2VzIGFwcHJvcHJpYXRlIGNoZWNrcywgYnV0Ci0JICogaXQgbWlnaHQgYmUgIm5lYXRlciIgdG8gY2FsbCBleHQyX2dldF9pbm9kZSBmaXJzdCBhbmQgY2hlY2sKLQkgKiBpZiB0aGUgaW5vZGUgaXMgdmFsaWQuLi4uLgorCS8qCisJICogZXh0Ml9pZ2V0IGlzbid0IHF1aXRlIHJpZ2h0IGlmIHRoZSBpbm9kZSBpcyBjdXJyZW50bHkgdW5hbGxvY2F0ZWQhCisJICogSG93ZXZlciBleHQyX2lnZXQgY3VycmVudGx5IGRvZXMgYXBwcm9wcmlhdGUgY2hlY2tzIHRvIGhhbmRsZSBzdGFsZQorCSAqIGlub2RlcyBzbyBldmVyeXRoaW5nIGlzIE9LLgogCSAqLwogCWlub2RlID0gZXh0Ml9pZ2V0KHNiLCBpbm8pOwogCWlmIChJU19FUlIoaW5vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9iYWxsb2MuYyBiL2ZzL2V4dDMvYmFsbG9jLmMKaW5kZXggNjM4NmQ3Ni4uYTIwMzg5MiAxMDA2NDQKLS0tIGEvZnMvZXh0My9iYWxsb2MuYworKysgYi9mcy9leHQzL2JhbGxvYy5jCkBAIC00MjcsNyArNDI3LDcgQEAKIHZvaWQgZXh0M19pbml0X2Jsb2NrX2FsbG9jX2luZm8oc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7Ci0Jc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaSA9IGVpLT5pX2Jsb2NrX2FsbG9jX2luZm87CisJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAKIAlibG9ja19pID0ga21hbGxvYyhzaXplb2YoKmJsb2NrX2kpLCBHRlBfTk9GUyk7CkBAIC0xNDQwLDE0ICsxNDQwLDE0IEBACiAgKgogICogQ2hlY2sgaWYgZmlsZXN5c3RlbSBoYXMgYXQgbGVhc3QgMSBmcmVlIGJsb2NrIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KICAqLwotc3RhdGljIGludCBleHQzX2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkpCitzdGF0aWMgaW50IGV4dDNfaGFzX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSwgaW50IHVzZV9yZXNlcnZhdGlvbikKIHsKIAlleHQzX2ZzYmxrX3QgZnJlZV9ibG9ja3MsIHJvb3RfYmxvY2tzOwogCiAJZnJlZV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKIAlyb290X2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yX2Jsb2Nrc19jb3VudCk7CiAJaWYgKGZyZWVfYmxvY2tzIDwgcm9vdF9ibG9ja3MgKyAxICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCi0JCXNiaS0+c19yZXN1aWQgIT0gY3VycmVudF9mc3VpZCgpICYmCisJCSF1c2VfcmVzZXJ2YXRpb24gJiYgc2JpLT5zX3Jlc3VpZCAhPSBjdXJyZW50X2ZzdWlkKCkgJiYKIAkJKHNiaS0+c19yZXNnaWQgPT0gMCB8fCAhaW5fZ3JvdXBfcCAoc2JpLT5zX3Jlc2dpZCkpKSB7CiAJCXJldHVybiAwOwogCX0KQEAgLTE0NjgsNyArMTQ2OCw3IEBACiAgKi8KIGludCBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKnJldHJpZXMpCiB7Ci0JaWYgKCFleHQzX2hhc19mcmVlX2Jsb2NrcyhFWFQzX1NCKHNiKSkgfHwgKCpyZXRyaWVzKSsrID4gMykKKwlpZiAoIWV4dDNfaGFzX2ZyZWVfYmxvY2tzKEVYVDNfU0Ioc2IpLCAwKSB8fCAoKnJldHJpZXMpKysgPiAzKQogCQlyZXR1cm4gMDsKIAogCWpiZF9kZWJ1ZygxLCAiJXM6IHJldHJ5aW5nIG9wZXJhdGlvbiBhZnRlciBFTk9TUENcbiIsIHNiLT5zX2lkKTsKQEAgLTE1NDYsNyArMTU0Niw3IEBACiAJaWYgKGJsb2NrX2kgJiYgKCh3aW5kb3dzeiA9IGJsb2NrX2ktPnJzdl93aW5kb3dfbm9kZS5yc3ZfZ29hbF9zaXplKSA+IDApKQogCQlteV9yc3YgPSAmYmxvY2tfaS0+cnN2X3dpbmRvd19ub2RlOwogCi0JaWYgKCFleHQzX2hhc19mcmVlX2Jsb2NrcyhzYmkpKSB7CisJaWYgKCFleHQzX2hhc19mcmVlX2Jsb2NrcyhzYmksIElTX05PUVVPVEEoaW5vZGUpKSkgewogCQkqZXJycCA9IC1FTk9TUEM7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE5MjQsOSArMTkyNCwxMCBAQAogICogcmVhY2hlcyBhbnkgdXNlZCBibG9jay4gVGhlbiBpc3N1ZSBhIFRSSU0gY29tbWFuZCBvbiB0aGlzIGV4dGVudCBhbmQgZnJlZQogICogdGhlIGV4dGVudCBpbiB0aGUgYmxvY2sgYml0bWFwLiBUaGlzIGlzIGRvbmUgdW50aWwgd2hvbGUgZ3JvdXAgaXMgc2Nhbm5lZC4KICAqLwotZXh0M19ncnBibGtfdCBleHQzX3RyaW1fYWxsX2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGdyb3VwLAotCQkJCWV4dDNfZ3JwYmxrX3Qgc3RhcnQsIGV4dDNfZ3JwYmxrX3QgbWF4LAotCQkJCWV4dDNfZ3JwYmxrX3QgbWluYmxvY2tzKQorc3RhdGljIGV4dDNfZ3JwYmxrX3QgZXh0M190cmltX2FsbF9mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCXVuc2lnbmVkIGludCBncm91cCwKKwkJCQkJZXh0M19ncnBibGtfdCBzdGFydCwgZXh0M19ncnBibGtfdCBtYXgsCisJCQkJCWV4dDNfZ3JwYmxrX3QgbWluYmxvY2tzKQogewogCWhhbmRsZV90ICpoYW5kbGU7CiAJZXh0M19ncnBibGtfdCBuZXh0LCBmcmVlX2Jsb2NrcywgYml0LCBmcmVlZCwgY291bnQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9mc3luYy5jIGIvZnMvZXh0My9mc3luYy5jCmluZGV4IGQ0OTRjNTUuLjE4NjBlZDMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvZnN5bmMuYworKysgYi9mcy9leHQzL2ZzeW5jLmMKQEAgLTYxLDEzICs2MSw2IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQkvKgotCSAqIFRha2luZyB0aGUgbXV0ZXggaGVyZSBqdXN0IHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIGhvdyBmc3luYyB3YXMKLQkgKiBjYWxsZWQgcHJldmlvdXNseSwgaG93ZXZlciBpdCBsb29rcyBsaWtlIHdlIGRvbid0IG5lZWQgdG8gdGFrZQotCSAqIGlfbXV0ZXggYXQgYWxsLgotCSAqLwotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQogCUpfQVNTRVJUKGV4dDNfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpID09IE5VTEwpOwogCiAJLyoKQEAgLTg1LDcgKzc4LDYgQEAKIAkgKiAgc2FmZSBpbi1qb3VybmFsLCB3aGljaCBpcyBhbGwgZnN5bmMoKSBuZWVkcyB0byBlbnN1cmUuCiAJICovCiAJaWYgKGV4dDNfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCXJldCA9IGV4dDNfZm9yY2VfY29tbWl0KGlub2RlLT5pX3NiKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTA4LDggKzEwMCw2IEBACiAJICovCiAJaWYgKG5lZWRzX2JhcnJpZXIpCiAJCWJsa2Rldl9pc3N1ZV9mbHVzaChpbm9kZS0+aV9zYi0+c19iZGV2LCBHRlBfS0VSTkVMLCBOVUxMKTsKLQotCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogb3V0OgogCXRyYWNlX2V4dDNfc3luY19maWxlX2V4aXQoaW5vZGUsIHJldCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaWFsbG9jLmMgYi9mcy9leHQzL2lhbGxvYy5jCmluZGV4IGJmMDljYmYuLjVjODY2ZTAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaWFsbG9jLmMKKysrIGIvZnMvZXh0My9pYWxsb2MuYwpAQCAtMTc4LDQyICsxNzgsNiBAQAogfQogCiAvKgotICogVGhlcmUgYXJlIHR3byBwb2xpY2llcyBmb3IgYWxsb2NhdGluZyBhbiBpbm9kZS4gIElmIHRoZSBuZXcgaW5vZGUgaXMKLSAqIGEgZGlyZWN0b3J5LCB0aGVuIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBibG9jayBncm91cCB3aXRoIGJvdGgKLSAqIGZyZWUgc3BhY2UgYW5kIGEgbG93IGRpcmVjdG9yeS10by1pbm9kZSByYXRpbzsgaWYgdGhhdCBmYWlscywgdGhlbiBvZgotICogdGhlIGdyb3VwcyB3aXRoIGFib3ZlLWF2ZXJhZ2UgZnJlZSBzcGFjZSwgdGhhdCBncm91cCB3aXRoIHRoZSBmZXdlc3QKLSAqIGRpcmVjdG9yaWVzIGFscmVhZHkgaXMgY2hvc2VuLgotICoKLSAqIEZvciBvdGhlciBpbm9kZXMsIHNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnlcJ3MgYmxvY2sKLSAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgotICovCi1zdGF0aWMgaW50IGZpbmRfZ3JvdXBfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQotewotCWludCBuZ3JvdXBzID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OwotCXVuc2lnbmVkIGludCBmcmVlaSwgYXZlZnJlZWk7Ci0Jc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYywgKmJlc3RfZGVzYyA9IE5VTEw7Ci0JaW50IGdyb3VwLCBiZXN0X2dyb3VwID0gLTE7Ci0KLQlmcmVlaSA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJkVYVDNfU0Ioc2IpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7Ci0JYXZlZnJlZWkgPSBmcmVlaSAvIG5ncm91cHM7Ci0KLQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuZ3JvdXBzOyBncm91cCsrKSB7Ci0JCWRlc2MgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsIE5VTEwpOwotCQlpZiAoIWRlc2MgfHwgIWRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KQotCQkJY29udGludWU7Ci0JCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBhdmVmcmVlaSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIWJlc3RfZGVzYyB8fAotCQkgICAgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA+Ci0JCSAgICAgbGUxNl90b19jcHUoYmVzdF9kZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpKSB7Ci0JCQliZXN0X2dyb3VwID0gZ3JvdXA7Ci0JCQliZXN0X2Rlc2MgPSBkZXNjOwotCQl9Ci0JfQotCXJldHVybiBiZXN0X2dyb3VwOwotfQotCi0vKgogICogT3Jsb3YncyBhbGxvY2F0b3IgZm9yIGRpcmVjdG9yaWVzLgogICoKICAqIFdlIGFsd2F5cyB0cnkgdG8gc3ByZWFkIGZpcnN0LWxldmVsIGRpcmVjdG9yaWVzLgpAQCAtNDM2LDEyICs0MDAsOSBAQAogCiAJc2JpID0gRVhUM19TQihzYik7CiAJZXMgPSBzYmktPnNfZXM7Ci0JaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJaWYgKHRlc3Rfb3B0IChzYiwgT0xEQUxMT0MpKQotCQkJZ3JvdXAgPSBmaW5kX2dyb3VwX2RpcihzYiwgZGlyKTsKLQkJZWxzZQotCQkJZ3JvdXAgPSBmaW5kX2dyb3VwX29ybG92KHNiLCBkaXIpOwotCX0gZWxzZQorCWlmIChTX0lTRElSKG1vZGUpKQorCQlncm91cCA9IGZpbmRfZ3JvdXBfb3Jsb3Yoc2IsIGRpcik7CisJZWxzZQogCQlncm91cCA9IGZpbmRfZ3JvdXBfb3RoZXIoc2IsIGRpcik7CiAKIAllcnIgPSAtRU5PU1BDOwpAQCAtNjIxLDcgKzU4Miw3IEBACiBmYWlsX2Ryb3A6CiAJZHF1b3RfZHJvcChpbm9kZSk7CiAJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT1FVT1RBOwotCWlub2RlLT5pX25saW5rID0gMDsKKwljbGVhcl9ubGluayhpbm9kZSk7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJaXB1dChpbm9kZSk7CiAJYnJlbHNlKGJpdG1hcF9iaCk7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggMTI2NjFlMS4uODVmZTY1NSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMjg5OSw3ICsyODk5LDcgQEAKIAkJaW5vZGUtPmlfdWlkIHw9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV91aWRfaGlnaCkgPDwgMTY7CiAJCWlub2RlLT5pX2dpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfZ2lkX2hpZ2gpIDw8IDE2OwogCX0KLQlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9saW5rc19jb3VudCk7CisJc2V0X25saW5rKGlub2RlLCBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbGlua3NfY291bnQpKTsKIAlpbm9kZS0+aV9zaXplID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX3NpemUpOwogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IChzaWduZWQpbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2F0aW1lKTsKIAlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSAoc2lnbmVkKWxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9jdGltZSk7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lvY3RsLmMgYi9mcy9leHQzL2lvY3RsLmMKaW5kZXggYzdmNDM5NC4uYmExYjU0ZSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pb2N0bC5jCisrKyBiL2ZzL2V4dDMvaW9jdGwuYwpAQCAtMTUwLDMwICsxNTAsNiBAQAogCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0jaWZkZWYgQ09ORklHX0pCRF9ERUJVRwotCWNhc2UgRVhUM19JT0NfV0FJVF9GT1JfUkVBRE9OTFk6Ci0JCS8qCi0JCSAqIFRoaXMgaXMgcmFjeSAtIGJ5IHRoZSB0aW1lIHdlJ3JlIHdva2VuIHVwIGFuZCBydW5uaW5nLAotCQkgKiB0aGUgc3VwZXJibG9jayBjb3VsZCBiZSByZWxlYXNlZC4gIEFuZCB0aGUgbW9kdWxlIGNvdWxkCi0JCSAqIGhhdmUgYmVlbiB1bmxvYWRlZC4gIFNvIHN1ZSBtZS4KLQkJICoKLQkJICogUmV0dXJucyAxIGlmIGl0IHNsZXB0LCBlbHNlIHplcm8uCi0JCSAqLwotCQl7Ci0JCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7Ci0JCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQkJCWludCByZXQgPSAwOwotCi0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJYWRkX3dhaXRfcXVldWUoJkVYVDNfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQlpZiAodGltZXJfcGVuZGluZygmRVhUM19TQihzYiktPnR1cm5fcm9fdGltZXIpKSB7Ci0JCQkJc2NoZWR1bGUoKTsKLQkJCQlyZXQgPSAxOwotCQkJfQotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJkVYVDNfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0jZW5kaWYKIAljYXNlIEVYVDNfSU9DX0dFVFJTVlNaOgogCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIFJFU0VSVkFUSU9OKQogCQkJJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCmluZGV4IDA2MjllMDkuLjY0MmRjNmQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvbmFtZWkuYworKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTE4MjEsNyArMTgyMSw3IEBACiAJZGUtPm5hbWVfbGVuID0gMjsKIAlzdHJjcHkgKGRlLT5uYW1lLCAiLi4iKTsKIAlleHQzX3NldF9kZV90eXBlKGRpci0+aV9zYiwgZGUsIFNfSUZESVIpOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCUJVRkZFUl9UUkFDRShkaXJfYmxvY2ssICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwogCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9ibG9jayk7CiAJaWYgKGVycikKQEAgLTE4MzMsNyArMTgzMyw3IEBACiAKIAlpZiAoZXJyKSB7CiBvdXRfY2xlYXJfaW5vZGU6Ci0JCWlub2RlLT5pX25saW5rID0gMDsKKwkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogCQlpcHV0IChpbm9kZSk7CkBAIC0yMTcwLDcgKzIxNzAsNyBAQAogCQlleHQzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0M191bmxpbmsiLAogCQkJICAgICAgIkRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkIiwKIAkJCSAgICAgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbmxpbmspOwotCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCXNldF9ubGluayhpbm9kZSwgMSk7CiAJfQogCXJldHZhbCA9IGV4dDNfZGVsZXRlX2VudHJ5KGhhbmRsZSwgZGlyLCBkZSwgYmgpOwogCWlmIChyZXR2YWwpCmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggN2JlYjY5YS4uOTIyZDI4OSAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtNjUyLDggKzY1Miw2IEBACiAJCXNlcV9wdXRzKHNlcSwgIixub3VpZDMyIik7CiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCiAJCXNlcV9wdXRzKHNlcSwgIixkZWJ1ZyIpOwotCWlmICh0ZXN0X29wdChzYiwgT0xEQUxMT0MpKQotCQlzZXFfcHV0cyhzZXEsICIsb2xkYWxsb2MiKTsKICNpZmRlZiBDT05GSUdfRVhUM19GU19YQVRUUgogCWlmICh0ZXN0X29wdChzYiwgWEFUVFJfVVNFUikpCiAJCXNlcV9wdXRzKHNlcSwgIix1c2VyX3hhdHRyIik7CkBAIC0xMDQ5LDEwICsxMDQ3LDEyIEBACiAJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBERUJVRyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfb2xkYWxsb2M6Ci0JCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJCSJJZ25vcmluZyBkZXByZWNhdGVkIG9sZGFsbG9jIG9wdGlvbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X29ybG92OgotCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJCSJJZ25vcmluZyBkZXByZWNhdGVkIG9ybG92IG9wdGlvbiIpOwogCQkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKIAkJY2FzZSBPcHRfdXNlcl94YXR0cjoKQEAgLTI2NjksMTMgKzI2NjksMTMgQEAKIAkJCS8qCiAJCQkgKiBJZiB3ZSBoYXZlIGFuIHVucHJvY2Vzc2VkIG9ycGhhbiBsaXN0IGhhbmdpbmcKIAkJCSAqIGFyb3VuZCBmcm9tIGEgcHJldmlvdXNseSByZWFkb25seSBiZGV2IG1vdW50LAotCQkJICogcmVxdWlyZSBhIGZ1bGwgdW1vdW50L3JlbW91bnQgZm9yIG5vdy4KKwkJCSAqIHJlcXVpcmUgYSBmdWxsIHVtb3VudCAmIG1vdW50IGZvciBub3cuCiAJCQkgKi8KIAkJCWlmIChlcy0+c19sYXN0X29ycGhhbikgewogCQkJCWV4dDNfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJ3YXJuaW5nOiBjb3VsZG4ndCAiCiAJCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnByb2Nlc3NlZCAiCiAJCQkJICAgICAgICJvcnBoYW4gaW5vZGUgbGlzdC4gIFBsZWFzZSAiCi0JCQkJICAgICAgICJ1bW91bnQvcmVtb3VudCBpbnN0ZWFkLiIpOworCQkJCSAgICAgICAidW1vdW50ICYgbW91bnQgaW5zdGVhZC4iKTsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWdvdG8gcmVzdG9yZV9vcHRzOwogCQkJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9iYWxsb2MuYyBiL2ZzL2V4dDQvYmFsbG9jLmMKaW5kZXggZjgyMjRhZC4uZjZkYmE0NSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9iYWxsb2MuYworKysgYi9mcy9leHQ0L2JhbGxvYy5jCkBAIC0yOCw3ICsyOCw4IEBACiAgKi8KIAogLyoKLSAqIENhbGN1bGF0ZSB0aGUgYmxvY2sgZ3JvdXAgbnVtYmVyIGFuZCBvZmZzZXQsIGdpdmVuIGEgYmxvY2sgbnVtYmVyCisgKiBDYWxjdWxhdGUgdGhlIGJsb2NrIGdyb3VwIG51bWJlciBhbmQgb2Zmc2V0IGludG8gdGhlIGJsb2NrL2NsdXN0ZXIKKyAqIGFsbG9jYXRpb24gYml0bWFwLCBnaXZlbiBhIGJsb2NrIG51bWJlcgogICovCiB2b2lkIGV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9mc2Jsa190IGJsb2NrbnIsCiAJCWV4dDRfZ3JvdXBfdCAqYmxvY2tncnBwLCBleHQ0X2dycGJsa190ICpvZmZzZXRwKQpAQCAtMzcsNyArMzgsOCBAQAogCWV4dDRfZ3JwYmxrX3Qgb2Zmc2V0OwogCiAJYmxvY2tuciA9IGJsb2NrbnIgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKLQlvZmZzZXQgPSBkb19kaXYoYmxvY2tuciwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSk7CisJb2Zmc2V0ID0gZG9fZGl2KGJsb2NrbnIsIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpID4+CisJCUVYVDRfU0Ioc2IpLT5zX2NsdXN0ZXJfYml0czsKIAlpZiAob2Zmc2V0cCkKIAkJKm9mZnNldHAgPSBvZmZzZXQ7CiAJaWYgKGJsb2NrZ3JwcCkKQEAgLTU1LDEzMSArNTcsMTcwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9ncm91cF91c2VkX21ldGFfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjbHVzdGVycyB1c2VkIGZvciBmaWxlIHN5c3RlbSBtZXRhZGF0YTsgdGhpcworICogcmVwcmVzZW50cyB0aGUgb3ZlcmhlYWQgbmVlZGVkIGJ5IHRoZSBmaWxlIHN5c3RlbS4KKyAqLwordW5zaWduZWQgZXh0NF9udW1fb3ZlcmhlYWRfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLAorCQkJCSAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHApCit7CisJdW5zaWduZWQgbnVtX2NsdXN0ZXJzOworCWludCBibG9ja19jbHVzdGVyID0gLTEsIGlub2RlX2NsdXN0ZXIgPSAtMSwgaXRibF9jbHVzdGVyID0gLTEsIGksIGM7CisJZXh0NF9mc2Jsa190IHN0YXJ0ID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgYmxvY2tfZ3JvdXApOworCWV4dDRfZnNibGtfdCBpdGJsX2JsazsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKworCS8qIFRoaXMgaXMgdGhlIG51bWJlciBvZiBjbHVzdGVycyB1c2VkIGJ5IHRoZSBzdXBlcmJsb2NrLAorCSAqIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzLCBhbmQgcmVzZXJ2ZWQgYmxvY2sgZ3JvdXAKKwkgKiBkZXNjcmlwdG9yIGJsb2NrcyAqLworCW51bV9jbHVzdGVycyA9IGV4dDRfbnVtX2Jhc2VfbWV0YV9jbHVzdGVycyhzYiwgYmxvY2tfZ3JvdXApOworCisJLyoKKwkgKiBGb3IgdGhlIGFsbG9jYXRpb24gYml0bWFwcyBhbmQgaW5vZGUgdGFibGUsIHdlIGZpcnN0IG5lZWQKKwkgKiB0byBjaGVjayB0byBzZWUgaWYgdGhlIGJsb2NrIGlzIGluIHRoZSBibG9jayBncm91cC4gIElmIGl0CisJICogaXMsIHRoZW4gY2hlY2sgdG8gc2VlIGlmIHRoZSBjbHVzdGVyIGlzIGFscmVhZHkgYWNjb3VudGVkCisJICogZm9yIGluIHRoZSBjbHVzdGVycyB1c2VkIGZvciB0aGUgYmFzZSBtZXRhZGF0YSBjbHVzdGVyLCBvcgorCSAqIGlmIHdlIGNhbiBpbmNyZW1lbnQgdGhlIGJhc2UgbWV0YWRhdGEgY2x1c3RlciB0byBpbmNsdWRlCisJICogdGhhdCBibG9jay4gIE90aGVyd2lzZSwgd2Ugd2lsbCBoYXZlIHRvIHRyYWNrIHRoZSBjbHVzdGVyCisJICogdXNlZCBmb3IgdGhlIGFsbG9jYXRpb24gYml0bWFwIG9yIGlub2RlIHRhYmxlIGV4cGxpY2l0bHkuCisJICogTm9ybWFsbHkgYWxsIG9mIHRoZXNlIGJsb2NrcyBhcmUgY29udGlndW91cywgc28gdGhlIHNwZWNpYWwKKwkgKiBjYXNlIGhhbmRsaW5nIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgZXhjZXB0IGZvciAqdmVyeSoKKwkgKiB1bnVzdWFsIGZpbGUgc3lzdGVtIGxheW91dHMuCisJICovCisJaWYgKGV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApLCBibG9ja19ncm91cCkpIHsKKwkJYmxvY2tfY2x1c3RlciA9IEVYVDRfQjJDKHNiaSwgKHN0YXJ0IC0KKwkJCQkJICAgICAgIGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApKSk7CisJCWlmIChibG9ja19jbHVzdGVyIDwgbnVtX2NsdXN0ZXJzKQorCQkJYmxvY2tfY2x1c3RlciA9IC0xOworCQllbHNlIGlmIChibG9ja19jbHVzdGVyID09IG51bV9jbHVzdGVycykgeworCQkJbnVtX2NsdXN0ZXJzKys7CisJCQlibG9ja19jbHVzdGVyID0gLTE7CisJCX0KKwl9CisKKwlpZiAoZXh0NF9ibG9ja19pbl9ncm91cChzYiwgZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGdkcCksIGJsb2NrX2dyb3VwKSkgeworCQlpbm9kZV9jbHVzdGVyID0gRVhUNF9CMkMoc2JpLAorCQkJCQkgc3RhcnQgLSBleHQ0X2lub2RlX2JpdG1hcChzYiwgZ2RwKSk7CisJCWlmIChpbm9kZV9jbHVzdGVyIDwgbnVtX2NsdXN0ZXJzKQorCQkJaW5vZGVfY2x1c3RlciA9IC0xOworCQllbHNlIGlmIChpbm9kZV9jbHVzdGVyID09IG51bV9jbHVzdGVycykgeworCQkJbnVtX2NsdXN0ZXJzKys7CisJCQlpbm9kZV9jbHVzdGVyID0gLTE7CisJCX0KKwl9CisKKwlpdGJsX2JsayA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCk7CisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19pdGJfcGVyX2dyb3VwOyBpKyspIHsKKwkJaWYgKGV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIGl0YmxfYmxrICsgaSwgYmxvY2tfZ3JvdXApKSB7CisJCQljID0gRVhUNF9CMkMoc2JpLCBzdGFydCAtIGl0YmxfYmxrICsgaSk7CisJCQlpZiAoKGMgPCBudW1fY2x1c3RlcnMpIHx8IChjID09IGlub2RlX2NsdXN0ZXIpIHx8CisJCQkgICAgKGMgPT0gYmxvY2tfY2x1c3RlcikgfHwgKGMgPT0gaXRibF9jbHVzdGVyKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjID09IG51bV9jbHVzdGVycykgeworCQkJCW51bV9jbHVzdGVycysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbnVtX2NsdXN0ZXJzKys7CisJCQlpdGJsX2NsdXN0ZXIgPSBjOworCQl9CisJfQorCisJaWYgKGJsb2NrX2NsdXN0ZXIgIT0gLTEpCisJCW51bV9jbHVzdGVycysrOworCWlmIChpbm9kZV9jbHVzdGVyICE9IC0xKQorCQludW1fY2x1c3RlcnMrKzsKKworCXJldHVybiBudW1fY2x1c3RlcnM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzX2luX2dyb3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwKQoreworCXVuc2lnbmVkIGludCBibG9ja3M7CisKKwlpZiAoYmxvY2tfZ3JvdXAgPT0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKSAtIDEpIHsKKwkJLyoKKwkJICogRXZlbiB0aG91Z2ggbWtlMmZzIGFsd2F5cyBpbml0aWFsaXplcyB0aGUgZmlyc3QgYW5kCisJCSAqIGxhc3QgZ3JvdXAsIGp1c3QgaW4gY2FzZSBzb21lIG90aGVyIHRvb2wgd2FzIHVzZWQsCisJCSAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGNhbGN1bGF0ZSB0aGUgcmlnaHQgZnJlZQorCQkgKiBibG9ja3MuCisJCSAqLworCQlibG9ja3MgPSBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKHNiKS0+c19lcykgLQorCQkJZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgYmxvY2tfZ3JvdXApOworCX0gZWxzZQorCQlibG9ja3MgPSBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpOworCXJldHVybiBFWFQ0X05VTV9CMkMoRVhUNF9TQihzYiksIGJsb2Nrcyk7Cit9CisKKy8qIEluaXRpYWxpemVzIGFuIHVuaW5pdGlhbGl6ZWQgYmxvY2sgYml0bWFwICovCit2b2lkIGV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXAsCisJCQkgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwKQoreworCXVuc2lnbmVkIGludCBiaXQsIGJpdF9tYXg7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJZXh0NF9mc2Jsa190IHN0YXJ0LCB0bXA7CisJaW50IGZsZXhfYmcgPSAwOworCisJSl9BU1NFUlRfQkgoYmgsIGJ1ZmZlcl9sb2NrZWQoYmgpKTsKKworCS8qIElmIGNoZWNrc3VtIGlzIGJhZCBtYXJrIGFsbCBibG9ja3MgdXNlZCB0byBwcmV2ZW50IGFsbG9jYXRpb24KKwkgKiBlc3NlbnRpYWxseSBpbXBsZW1lbnRpbmcgYSBwZXItZ3JvdXAgcmVhZC1vbmx5IGZsYWcuICovCisJaWYgKCFleHQ0X2dyb3VwX2Rlc2NfY3N1bV92ZXJpZnkoc2JpLCBibG9ja19ncm91cCwgZ2RwKSkgeworCQlleHQ0X2Vycm9yKHNiLCAiQ2hlY2tzdW0gYmFkIGZvciBncm91cCAldSIsIGJsb2NrX2dyb3VwKTsKKwkJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLCAwKTsKKwkJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgMCk7CisJCWV4dDRfaXRhYmxlX3VudXNlZF9zZXQoc2IsIGdkcCwgMCk7CisJCW1lbXNldChiaC0+Yl9kYXRhLCAweGZmLCBzYi0+c19ibG9ja3NpemUpOworCQlyZXR1cm47CisJfQorCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOworCisJYml0X21heCA9IGV4dDRfbnVtX2Jhc2VfbWV0YV9jbHVzdGVycyhzYiwgYmxvY2tfZ3JvdXApOworCWZvciAoYml0ID0gMDsgYml0IDwgYml0X21heDsgYml0KyspCisJCWV4dDRfc2V0X2JpdChiaXQsIGJoLT5iX2RhdGEpOworCisJc3RhcnQgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBibG9ja19ncm91cCk7CisKKwlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZMRVhfQkcpKQorCQlmbGV4X2JnID0gMTsKKworCS8qIFNldCBiaXRzIGZvciBibG9jayBhbmQgaW5vZGUgYml0bWFwcywgYW5kIGlub2RlIHRhYmxlICovCisJdG1wID0gZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCk7CisJaWYgKCFmbGV4X2JnIHx8IGV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIHRtcCwgYmxvY2tfZ3JvdXApKQorCQlleHQ0X3NldF9iaXQoRVhUNF9CMkMoc2JpLCB0bXAgLSBzdGFydCksIGJoLT5iX2RhdGEpOworCisJdG1wID0gZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGdkcCk7CisJaWYgKCFmbGV4X2JnIHx8IGV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIHRtcCwgYmxvY2tfZ3JvdXApKQorCQlleHQ0X3NldF9iaXQoRVhUNF9CMkMoc2JpLCB0bXAgLSBzdGFydCksIGJoLT5iX2RhdGEpOworCisJdG1wID0gZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKTsKKwlmb3IgKDsgdG1wIDwgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSArCisJCSAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXA7IHRtcCsrKSB7CisJCWlmICghZmxleF9iZyB8fCBleHQ0X2Jsb2NrX2luX2dyb3VwKHNiLCB0bXAsIGJsb2NrX2dyb3VwKSkKKwkJCWV4dDRfc2V0X2JpdChFWFQ0X0IyQyhzYmksIHRtcCAtIHN0YXJ0KSwgYmgtPmJfZGF0YSk7CisJfQorCisJLyoKKwkgKiBBbHNvIGlmIHRoZSBudW1iZXIgb2YgYmxvY2tzIHdpdGhpbiB0aGUgZ3JvdXAgaXMgbGVzcyB0aGFuCisJICogdGhlIGJsb2Nrc2l6ZSAqIDggKCB3aGljaCBpcyB0aGUgc2l6ZSBvZiBiaXRtYXAgKSwgc2V0IHJlc3QKKwkgKiBvZiB0aGUgYmxvY2sgYml0bWFwIHRvIDEKKwkgKi8KKwlleHQ0X21hcmtfYml0bWFwX2VuZChudW1fY2x1c3RlcnNfaW5fZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKSwKKwkJCSAgICAgc2ItPnNfYmxvY2tzaXplICogOCwgYmgtPmJfZGF0YSk7Cit9CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGluIGEgYmxvY2sgZ3JvdXAuICBJdCBpcyB1c2VkIHdoZW4KKyAqIHRoZSBibG9jayBiaXRtYXAgaXMgdW5pbml0aWFsaXplZCwgc28gd2UgY2FuJ3QganVzdCBjb3VudCB0aGUgYml0cworICogaW4gdGhlIGJpdG1hcC4gKi8KK3Vuc2lnbmVkIGV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICAgICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwKIAkJCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwKQogewotCWV4dDRfZnNibGtfdCB0bXA7Ci0Jc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7Ci0JLyogYmxvY2sgYml0bWFwLCBpbm9kZSBiaXRtYXAsIGFuZCBpbm9kZSB0YWJsZSBibG9ja3MgKi8KLQlpbnQgdXNlZF9ibG9ja3MgPSBzYmktPnNfaXRiX3Blcl9ncm91cCArIDI7Ci0KLQlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZMRVhfQkcpKSB7Ci0JCWlmICghZXh0NF9ibG9ja19pbl9ncm91cChzYiwgZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCksCi0JCQkJCWJsb2NrX2dyb3VwKSkKLQkJCXVzZWRfYmxvY2tzLS07Ci0KLQkJaWYgKCFleHQ0X2Jsb2NrX2luX2dyb3VwKHNiLCBleHQ0X2lub2RlX2JpdG1hcChzYiwgZ2RwKSwKLQkJCQkJYmxvY2tfZ3JvdXApKQotCQkJdXNlZF9ibG9ja3MtLTsKLQotCQl0bXAgPSBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApOwotCQlmb3IgKDsgdG1wIDwgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSArCi0JCQkJc2JpLT5zX2l0Yl9wZXJfZ3JvdXA7IHRtcCsrKSB7Ci0JCQlpZiAoIWV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIHRtcCwgYmxvY2tfZ3JvdXApKQotCQkJCXVzZWRfYmxvY2tzIC09IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIHVzZWRfYmxvY2tzOworCXJldHVybiBudW1fY2x1c3RlcnNfaW5fZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKSAtIAorCQlleHQ0X251bV9vdmVyaGVhZF9jbHVzdGVycyhzYiwgYmxvY2tfZ3JvdXAsIGdkcCk7CiB9CiAKLS8qIEluaXRpYWxpemVzIGFuIHVuaW5pdGlhbGl6ZWQgYmxvY2sgYml0bWFwIGlmIGdpdmVuLCBhbmQgcmV0dXJucyB0aGUKLSAqIG51bWJlciBvZiBibG9ja3MgZnJlZSBpbiB0aGUgZ3JvdXAuICovCi11bnNpZ25lZCBleHQ0X2luaXRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCSBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXAsIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCkKLXsKLQlpbnQgYml0LCBiaXRfbWF4OwotCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKLQl1bnNpZ25lZCBmcmVlX2Jsb2NrcywgZ3JvdXBfYmxvY2tzOwotCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwotCi0JaWYgKGJoKSB7Ci0JCUpfQVNTRVJUX0JIKGJoLCBidWZmZXJfbG9ja2VkKGJoKSk7Ci0KLQkJLyogSWYgY2hlY2tzdW0gaXMgYmFkIG1hcmsgYWxsIGJsb2NrcyB1c2VkIHRvIHByZXZlbnQgYWxsb2NhdGlvbgotCQkgKiBlc3NlbnRpYWxseSBpbXBsZW1lbnRpbmcgYSBwZXItZ3JvdXAgcmVhZC1vbmx5IGZsYWcuICovCi0JCWlmICghZXh0NF9ncm91cF9kZXNjX2NzdW1fdmVyaWZ5KHNiaSwgYmxvY2tfZ3JvdXAsIGdkcCkpIHsKLQkJCWV4dDRfZXJyb3Ioc2IsICJDaGVja3N1bSBiYWQgZm9yIGdyb3VwICV1IiwKLQkJCQkJYmxvY2tfZ3JvdXApOwotCQkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIDApOwotCQkJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgMCk7Ci0JCQlleHQ0X2l0YWJsZV91bnVzZWRfc2V0KHNiLCBnZHAsIDApOwotCQkJbWVtc2V0KGJoLT5iX2RhdGEsIDB4ZmYsIHNiLT5zX2Jsb2Nrc2l6ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKLQl9Ci0KLQkvKiBDaGVjayBmb3Igc3VwZXJibG9jayBhbmQgZ2R0IGJhY2t1cHMgaW4gdGhpcyBncm91cCAqLwotCWJpdF9tYXggPSBleHQ0X2JnX2hhc19zdXBlcihzYiwgYmxvY2tfZ3JvdXApOwotCi0JaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykgfHwKLQkgICAgYmxvY2tfZ3JvdXAgPCBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfbWV0YV9iZykgKgotCQkJICBzYmktPnNfZGVzY19wZXJfYmxvY2spIHsKLQkJaWYgKGJpdF9tYXgpIHsKLQkJCWJpdF9tYXggKz0gZXh0NF9iZ19udW1fZ2RiKHNiLCBibG9ja19ncm91cCk7Ci0JCQliaXRfbWF4ICs9Ci0JCQkJbGUxNl90b19jcHUoc2JpLT5zX2VzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpOwotCQl9Ci0JfSBlbHNlIHsgLyogRm9yIE1FVEFfQkdfQkxPQ0tfR1JPVVBTICovCi0JCWJpdF9tYXggKz0gZXh0NF9iZ19udW1fZ2RiKHNiLCBibG9ja19ncm91cCk7Ci0JfQotCi0JaWYgKGJsb2NrX2dyb3VwID09IG5ncm91cHMgLSAxKSB7Ci0JCS8qCi0JCSAqIEV2ZW4gdGhvdWdoIG1rZTJmcyBhbHdheXMgaW5pdGlhbGl6ZSBmaXJzdCBhbmQgbGFzdCBncm91cAotCQkgKiBpZiBzb21lIG90aGVyIHRvb2wgZW5hYmxlZCB0aGUgRVhUNF9CR19CTE9DS19VTklOSVQgd2UgbmVlZAotCQkgKiB0byBtYWtlIHN1cmUgd2UgY2FsY3VsYXRlIHRoZSByaWdodCBmcmVlIGJsb2NrcwotCQkgKi8KLQkJZ3JvdXBfYmxvY2tzID0gZXh0NF9ibG9ja3NfY291bnQoc2JpLT5zX2VzKSAtCi0JCQlleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBuZ3JvdXBzIC0gMSk7Ci0JfSBlbHNlIHsKLQkJZ3JvdXBfYmxvY2tzID0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKLQl9Ci0KLQlmcmVlX2Jsb2NrcyA9IGdyb3VwX2Jsb2NrcyAtIGJpdF9tYXg7Ci0KLQlpZiAoYmgpIHsKLQkJZXh0NF9mc2Jsa190IHN0YXJ0LCB0bXA7Ci0JCWludCBmbGV4X2JnID0gMDsKLQotCQlmb3IgKGJpdCA9IDA7IGJpdCA8IGJpdF9tYXg7IGJpdCsrKQotCQkJZXh0NF9zZXRfYml0KGJpdCwgYmgtPmJfZGF0YSk7Ci0KLQkJc3RhcnQgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBibG9ja19ncm91cCk7Ci0KLQkJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsCi0JCQkJCSAgICAgIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9GTEVYX0JHKSkKLQkJCWZsZXhfYmcgPSAxOwotCi0JCS8qIFNldCBiaXRzIGZvciBibG9jayBhbmQgaW5vZGUgYml0bWFwcywgYW5kIGlub2RlIHRhYmxlICovCi0JCXRtcCA9IGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApOwotCQlpZiAoIWZsZXhfYmcgfHwgZXh0NF9ibG9ja19pbl9ncm91cChzYiwgdG1wLCBibG9ja19ncm91cCkpCi0JCQlleHQ0X3NldF9iaXQodG1wIC0gc3RhcnQsIGJoLT5iX2RhdGEpOwotCi0JCXRtcCA9IGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApOwotCQlpZiAoIWZsZXhfYmcgfHwgZXh0NF9ibG9ja19pbl9ncm91cChzYiwgdG1wLCBibG9ja19ncm91cCkpCi0JCQlleHQ0X3NldF9iaXQodG1wIC0gc3RhcnQsIGJoLT5iX2RhdGEpOwotCi0JCXRtcCA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCk7Ci0JCWZvciAoOyB0bXAgPCBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApICsKLQkJCQlzYmktPnNfaXRiX3Blcl9ncm91cDsgdG1wKyspIHsKLQkJCWlmICghZmxleF9iZyB8fAotCQkJCWV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIHRtcCwgYmxvY2tfZ3JvdXApKQotCQkJCWV4dDRfc2V0X2JpdCh0bXAgLSBzdGFydCwgYmgtPmJfZGF0YSk7Ci0JCX0KLQkJLyoKLQkJICogQWxzbyBpZiB0aGUgbnVtYmVyIG9mIGJsb2NrcyB3aXRoaW4gdGhlIGdyb3VwIGlzCi0JCSAqIGxlc3MgdGhhbiB0aGUgYmxvY2tzaXplICogOCAoIHdoaWNoIGlzIHRoZSBzaXplCi0JCSAqIG9mIGJpdG1hcCApLCBzZXQgcmVzdCBvZiB0aGUgYmxvY2sgYml0bWFwIHRvIDEKLQkJICovCi0JCWV4dDRfbWFya19iaXRtYXBfZW5kKGdyb3VwX2Jsb2Nrcywgc2ItPnNfYmxvY2tzaXplICogOCwKLQkJCQkgICAgIGJoLT5iX2RhdGEpOwotCX0KLQlyZXR1cm4gZnJlZV9ibG9ja3MgLSBleHQ0X2dyb3VwX3VzZWRfbWV0YV9ibG9ja3Moc2IsIGJsb2NrX2dyb3VwLCBnZHApOwotfQotCi0KIC8qCiAgKiBUaGUgZnJlZSBibG9ja3MgYXJlIG1hbmFnZWQgYnkgYml0bWFwcy4gIEEgZmlsZSBzeXN0ZW0gY29udGFpbnMgc2V2ZXJhbAogICogYmxvY2tzIGdyb3Vwcy4gIEVhY2ggZ3JvdXAgY29udGFpbnMgMSBiaXRtYXAgYmxvY2sgZm9yIGJsb2NrcywgMSBiaXRtYXAKQEAgLTM2Miw1MyArNDAzLDU0IEBACiB9CiAKIC8qKgotICogZXh0NF9oYXNfZnJlZV9ibG9ja3MoKQorICogZXh0NF9oYXNfZnJlZV9jbHVzdGVycygpCiAgKiBAc2JpOglpbi1jb3JlIHN1cGVyIGJsb2NrIHN0cnVjdHVyZS4KLSAqIEBuYmxvY2tzOgludW1iZXIgb2YgbmVlZGVkIGJsb2NrcworICogQG5jbHVzdGVyczoJbnVtYmVyIG9mIG5lZWRlZCBibG9ja3MKKyAqIEBmbGFnczoJZmxhZ3MgZnJvbSBleHQ0X21iX25ld19ibG9ja3MoKQogICoKLSAqIENoZWNrIGlmIGZpbGVzeXN0ZW0gaGFzIG5ibG9ja3MgZnJlZSAmIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KKyAqIENoZWNrIGlmIGZpbGVzeXN0ZW0gaGFzIG5jbHVzdGVycyBmcmVlICYgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgogICogT24gc3VjY2VzcyByZXR1cm4gMSwgcmV0dXJuIDAgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBleHQ0X2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksCi0JCQkJczY0IG5ibG9ja3MsIHVuc2lnbmVkIGludCBmbGFncykKK3N0YXRpYyBpbnQgZXh0NF9oYXNfZnJlZV9jbHVzdGVycyhzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksCisJCQkJICBzNjQgbmNsdXN0ZXJzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JczY0IGZyZWVfYmxvY2tzLCBkaXJ0eV9ibG9ja3MsIHJvb3RfYmxvY2tzOwotCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjID0gJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXI7Ci0Jc3RydWN0IHBlcmNwdV9jb3VudGVyICpkYmMgPSAmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXI7CisJczY0IGZyZWVfY2x1c3RlcnMsIGRpcnR5X2NsdXN0ZXJzLCByb290X2NsdXN0ZXJzOworCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZmNjID0gJnNiaS0+c19mcmVlY2x1c3RlcnNfY291bnRlcjsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmRjYyA9ICZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyOwogCi0JZnJlZV9ibG9ja3MgID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZShmYmMpOwotCWRpcnR5X2Jsb2NrcyA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoZGJjKTsKLQlyb290X2Jsb2NrcyA9IGV4dDRfcl9ibG9ja3NfY291bnQoc2JpLT5zX2VzKTsKKwlmcmVlX2NsdXN0ZXJzICA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoZmNjKTsKKwlkaXJ0eV9jbHVzdGVycyA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoZGNjKTsKKwlyb290X2NsdXN0ZXJzID0gRVhUNF9CMkMoc2JpLCBleHQ0X3JfYmxvY2tzX2NvdW50KHNiaS0+c19lcykpOwogCi0JaWYgKGZyZWVfYmxvY2tzIC0gKG5ibG9ja3MgKyByb290X2Jsb2NrcyArIGRpcnR5X2Jsb2NrcykgPAotCQkJCQkJRVhUNF9GUkVFQkxPQ0tTX1dBVEVSTUFSSykgewotCQlmcmVlX2Jsb2NrcyAgPSBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoZmJjKTsKLQkJZGlydHlfYmxvY2tzID0gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKGRiYyk7CisJaWYgKGZyZWVfY2x1c3RlcnMgLSAobmNsdXN0ZXJzICsgcm9vdF9jbHVzdGVycyArIGRpcnR5X2NsdXN0ZXJzKSA8CisJCQkJCUVYVDRfRlJFRUNMVVNURVJTX1dBVEVSTUFSSykgeworCQlmcmVlX2NsdXN0ZXJzICA9IEVYVDRfQzJCKHNiaSwgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKGZjYykpOworCQlkaXJ0eV9jbHVzdGVycyA9IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZShkY2MpOwogCX0KLQkvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgc3BhY2UgYWZ0ZXIKLQkgKiBhY2NvdW50aW5nIGZvciBjdXJyZW50IGRpcnR5IGJsb2NrcyAmIHJvb3QgcmVzZXJ2ZWQgYmxvY2tzLgorCS8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBzcGFjZSBhZnRlciBhY2NvdW50aW5nIGZvciBjdXJyZW50CisJICogZGlydHkgY2x1c3RlcnMgJiByb290IHJlc2VydmVkIGNsdXN0ZXJzLgogCSAqLwotCWlmIChmcmVlX2Jsb2NrcyA+PSAoKHJvb3RfYmxvY2tzICsgbmJsb2NrcykgKyBkaXJ0eV9ibG9ja3MpKQorCWlmIChmcmVlX2NsdXN0ZXJzID49ICgocm9vdF9jbHVzdGVycyArIG5jbHVzdGVycykgKyBkaXJ0eV9jbHVzdGVycykpCiAJCXJldHVybiAxOwogCi0JLyogSG0sIG5vcGUuICBBcmUgKGVub3VnaCkgcm9vdCByZXNlcnZlZCBibG9ja3MgYXZhaWxhYmxlPyAqLworCS8qIEhtLCBub3BlLiAgQXJlIChlbm91Z2gpIHJvb3QgcmVzZXJ2ZWQgY2x1c3RlcnMgYXZhaWxhYmxlPyAqLwogCWlmIChzYmktPnNfcmVzdWlkID09IGN1cnJlbnRfZnN1aWQoKSB8fAogCSAgICAoKHNiaS0+c19yZXNnaWQgIT0gMCkgJiYgaW5fZ3JvdXBfcChzYmktPnNfcmVzZ2lkKSkgfHwKIAkgICAgY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSB8fAogCQkoZmxhZ3MgJiBFWFQ0X01CX1VTRV9ST09UX0JMT0NLUykpIHsKIAotCQlpZiAoZnJlZV9ibG9ja3MgPj0gKG5ibG9ja3MgKyBkaXJ0eV9ibG9ja3MpKQorCQlpZiAoZnJlZV9jbHVzdGVycyA+PSAobmNsdXN0ZXJzICsgZGlydHlfY2x1c3RlcnMpKQogCQkJcmV0dXJuIDE7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKLQkJCSAgIHM2NCBuYmxvY2tzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgZXh0NF9jbGFpbV9mcmVlX2NsdXN0ZXJzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKKwkJCSAgICAgczY0IG5jbHVzdGVycywgdW5zaWduZWQgaW50IGZsYWdzKQogewotCWlmIChleHQ0X2hhc19mcmVlX2Jsb2NrcyhzYmksIG5ibG9ja3MsIGZsYWdzKSkgewotCQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLCBuYmxvY2tzKTsKKwlpZiAoZXh0NF9oYXNfZnJlZV9jbHVzdGVycyhzYmksIG5jbHVzdGVycywgZmxhZ3MpKSB7CisJCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlciwgbmNsdXN0ZXJzKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlCiAJCXJldHVybiAtRU5PU1BDOwpAQCAtNDI4LDcgKzQ3MCw3IEBACiAgKi8KIGludCBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKnJldHJpZXMpCiB7Ci0JaWYgKCFleHQ0X2hhc19mcmVlX2Jsb2NrcyhFWFQ0X1NCKHNiKSwgMSwgMCkgfHwKKwlpZiAoIWV4dDRfaGFzX2ZyZWVfY2x1c3RlcnMoRVhUNF9TQihzYiksIDEsIDApIHx8CiAJICAgICgqcmV0cmllcykrKyA+IDMgfHwKIAkgICAgIUVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpCiAJCXJldHVybiAwOwpAQCAtNDQ0LDcgKzQ4Niw3IEBACiAgKiBAaGFuZGxlOiAgICAgICAgICAgICBoYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgogICogQGlub2RlOiAgICAgICAgICAgICAgZmlsZSBpbm9kZQogICogQGdvYWw6ICAgICAgICAgICAgICAgZ2l2ZW4gdGFyZ2V0IGJsb2NrKGZpbGVzeXN0ZW0gd2lkZSkKLSAqIEBjb3VudDoJCXBvaW50ZXIgdG8gdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBuZWVkZWQKKyAqIEBjb3VudDoJCXBvaW50ZXIgdG8gdG90YWwgbnVtYmVyIG9mIGNsdXN0ZXJzIG5lZWRlZAogICogQGVycnA6ICAgICAgICAgICAgICAgZXJyb3IgY29kZQogICoKICAqIFJldHVybiAxc3QgYWxsb2NhdGVkIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCAqY291bnQgc3RvcmVzIHRvdGFsIGFjY291bnQKQEAgLTQ3NiwxOCArNTE4LDE5IEBACiAJCXNwaW5fbG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKIAkJRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgKz0gYXIubGVuOwogCQlzcGluX3VubG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKLQkJZHF1b3RfYWxsb2NfYmxvY2tfbm9mYWlsKGlub2RlLCBhci5sZW4pOworCQlkcXVvdF9hbGxvY19ibG9ja19ub2ZhaWwoaW5vZGUsCisJCQkJRVhUNF9DMkIoRVhUNF9TQihpbm9kZS0+aV9zYiksIGFyLmxlbikpOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCiAvKioKLSAqIGV4dDRfY291bnRfZnJlZV9ibG9ja3MoKSAtLSBjb3VudCBmaWxlc3lzdGVtIGZyZWUgYmxvY2tzCisgKiBleHQ0X2NvdW50X2ZyZWVfY2x1c3RlcnMoKSAtLSBjb3VudCBmaWxlc3lzdGVtIGZyZWUgY2x1c3RlcnMKICAqIEBzYjoJCXN1cGVyYmxvY2sKICAqCi0gKiBBZGRzIHVwIHRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgZnJvbSBlYWNoIGJsb2NrIGdyb3VwLgorICogQWRkcyB1cCB0aGUgbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgZnJvbSBlYWNoIGJsb2NrIGdyb3VwLgogICovCi1leHQ0X2ZzYmxrX3QgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorZXh0NF9mc2Jsa190IGV4dDRfY291bnRfZnJlZV9jbHVzdGVycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWV4dDRfZnNibGtfdCBkZXNjX2NvdW50OwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKQEAgLTUwOCw3ICs1NTEsNyBAQAogCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAkJaWYgKCFnZHApCiAJCQljb250aW51ZTsKLQkJZGVzY19jb3VudCArPSBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKTsKKwkJZGVzY19jb3VudCArPSBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGdkcCk7CiAJCWJyZWxzZShiaXRtYXBfYmgpOwogCQliaXRtYXBfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBpKTsKIAkJaWYgKGJpdG1hcF9iaCA9PSBOVUxMKQpAQCAtNTE2LDEyICs1NTksMTMgQEAKIAogCQl4ID0gZXh0NF9jb3VudF9mcmVlKGJpdG1hcF9iaCwgc2ItPnNfYmxvY2tzaXplKTsKIAkJcHJpbnRrKEtFUk5fREVCVUcgImdyb3VwICV1OiBzdG9yZWQgPSAlZCwgY291bnRlZCA9ICV1XG4iLAotCQkJaSwgZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCksIHgpOworCQkJaSwgZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzKHNiLCBnZHApLCB4KTsKIAkJYml0bWFwX2NvdW50ICs9IHg7CiAJfQogCWJyZWxzZShiaXRtYXBfYmgpOwotCXByaW50ayhLRVJOX0RFQlVHICJleHQ0X2NvdW50X2ZyZWVfYmxvY2tzOiBzdG9yZWQgPSAlbGx1IgotCQkiLCBjb21wdXRlZCA9ICVsbHUsICVsbHVcbiIsIGV4dDRfZnJlZV9ibG9ja3NfY291bnQoZXMpLAorCXByaW50ayhLRVJOX0RFQlVHICJleHQ0X2NvdW50X2ZyZWVfY2x1c3RlcnM6IHN0b3JlZCA9ICVsbHUiCisJICAgICAgICIsIGNvbXB1dGVkID0gJWxsdSwgJWxsdVxuIiwKKwkgICAgICAgRVhUNF9CMkMoc2JpLCBleHQ0X2ZyZWVfYmxvY2tzX2NvdW50KGVzKSksCiAJICAgICAgIGRlc2NfY291bnQsIGJpdG1hcF9jb3VudCk7CiAJcmV0dXJuIGJpdG1hcF9jb3VudDsKICNlbHNlCkBAIC01MzAsNyArNTc0LDcgQEAKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQogCQkJY29udGludWU7Ci0JCWRlc2NfY291bnQgKz0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCk7CisJCWRlc2NfY291bnQgKz0gZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzKHNiLCBnZHApOwogCX0KIAogCXJldHVybiBkZXNjX2NvdW50OwpAQCAtNjIwLDYgKzY2NCwzMSBAQAogCiB9CiAKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlIHN5c3RlbSBtZXRhZGF0YSBjbHVzdGVycyBhdAorICogdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrIGdyb3VwLCBpbmNsdWRpbmcgdGhlIHJlc2VydmVkIGdkdCBibG9ja3MuCisgKi8KK3Vuc2lnbmVkIGV4dDRfbnVtX2Jhc2VfbWV0YV9jbHVzdGVycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwKQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCXVuc2lnbmVkIG51bTsKKworCS8qIENoZWNrIGZvciBzdXBlcmJsb2NrIGFuZCBnZHQgYmFja3VwcyBpbiB0aGlzIGdyb3VwICovCisJbnVtID0gZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGJsb2NrX2dyb3VwKTsKKworCWlmICghRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CisJICAgIGJsb2NrX2dyb3VwIDwgbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X21ldGFfYmcpICoKKwkJCSAgc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrKSB7CisJCWlmIChudW0pIHsKKwkJCW51bSArPSBleHQ0X2JnX251bV9nZGIoc2IsIGJsb2NrX2dyb3VwKTsKKwkJCW51bSArPSBsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2Nrcyk7CisJCX0KKwl9IGVsc2UgeyAvKiBGb3IgTUVUQV9CR19CTE9DS19HUk9VUFMgKi8KKwkJbnVtICs9IGV4dDRfYmdfbnVtX2dkYihzYiwgYmxvY2tfZ3JvdXApOworCX0KKwlyZXR1cm4gRVhUNF9OVU1fQjJDKHNiaSwgbnVtKTsKK30KIC8qKgogICoJZXh0NF9pbm9kZV90b19nb2FsX2Jsb2NrIC0gcmV0dXJuIGEgaGludCBmb3IgYmxvY2sgYWxsb2NhdGlvbgogICoJQGlub2RlOiBpbm9kZSBmb3IgYmxvY2sgYWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaAppbmRleCBiN2Q3YmQwLi41YjBlMjZhIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDQuaAorKysgYi9mcy9leHQ0L2V4dDQuaApAQCAtMTQ0LDkgKzE0NCwxNyBAQAogI2RlZmluZSBFWFQ0X01BUF9VTldSSVRURU4JKDEgPDwgQkhfVW53cml0dGVuKQogI2RlZmluZSBFWFQ0X01BUF9CT1VOREFSWQkoMSA8PCBCSF9Cb3VuZGFyeSkKICNkZWZpbmUgRVhUNF9NQVBfVU5JTklUCQkoMSA8PCBCSF9VbmluaXQpCisvKiBTb21ldGltZXMgKGluIHRoZSBiaWdhbGxvYyBjYXNlLCBmcm9tIGV4dDRfZGFfZ2V0X2Jsb2NrX3ByZXApIHRoZSBjYWxsZXIgb2YKKyAqIGV4dDRfbWFwX2Jsb2NrcyB3YW50cyB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSB1bmRlcmx5aW5nIGNsdXN0ZXIgaGFzCisgKiBhbHJlYWR5IGJlZW4gYWNjb3VudGVkIGZvci4gRVhUNF9NQVBfRlJPTV9DTFVTVEVSIGNvbnZleXMgdG8gdGhlIGNhbGxlciB0aGF0CisgKiB0aGUgcmVxdWVzdGVkIG1hcHBpbmcgd2FzIGZyb20gcHJldmlvdXNseSBtYXBwZWQgKG9yIGRlbGF5ZWQgYWxsb2NhdGVkKQorICogY2x1c3Rlci4gV2UgdXNlIEJIX0FsbG9jRnJvbUNsdXN0ZXIgb25seSBmb3IgdGhpcyBmbGFnLiBCSF9BbGxvY0Zyb21DbHVzdGVyCisgKiBzaG91bGQgbmV2ZXIgYXBwZWFyIG9uIGJ1ZmZlcl9oZWFkJ3Mgc3RhdGUgZmxhZ3MuCisgKi8KKyNkZWZpbmUgRVhUNF9NQVBfRlJPTV9DTFVTVEVSCSgxIDw8IEJIX0FsbG9jRnJvbUNsdXN0ZXIpCiAjZGVmaW5lIEVYVDRfTUFQX0ZMQUdTCQkoRVhUNF9NQVBfTkVXIHwgRVhUNF9NQVBfTUFQUEVEIHxcCiAJCQkJIEVYVDRfTUFQX1VOV1JJVFRFTiB8IEVYVDRfTUFQX0JPVU5EQVJZIHxcCi0JCQkJIEVYVDRfTUFQX1VOSU5JVCkKKwkJCQkgRVhUNF9NQVBfVU5JTklUIHwgRVhUNF9NQVBfRlJPTV9DTFVTVEVSKQogCiBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIHsKIAlleHQ0X2ZzYmxrX3QgbV9wYmxrOwpAQCAtMjM5LDggKzI0NywxMSBAQAogIyBkZWZpbmUgRVhUNF9CTE9DS19TSVpFKHMpCQkoRVhUNF9NSU5fQkxPQ0tfU0laRSA8PCAocyktPnNfbG9nX2Jsb2NrX3NpemUpCiAjZW5kaWYKICNkZWZpbmUJRVhUNF9BRERSX1BFUl9CTE9DSyhzKQkJKEVYVDRfQkxPQ0tfU0laRShzKSAvIHNpemVvZihfX3UzMikpCisjZGVmaW5lIEVYVDRfQ0xVU1RFUl9TSVpFKHMpCQkoRVhUNF9CTE9DS19TSVpFKHMpIDw8IFwKKwkJCQkJIEVYVDRfU0IocyktPnNfY2x1c3Rlcl9iaXRzKQogI2lmZGVmIF9fS0VSTkVMX18KICMgZGVmaW5lIEVYVDRfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfYmxvY2tzaXplX2JpdHMpCisjIGRlZmluZSBFWFQ0X0NMVVNURVJfQklUUyhzKQkJKEVYVDRfU0IocyktPnNfY2x1c3Rlcl9iaXRzKQogI2Vsc2UKICMgZGVmaW5lIEVYVDRfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfbG9nX2Jsb2NrX3NpemUgKyAxMCkKICNlbmRpZgpAQCAtMjU4LDYgKzI2OSwxNCBAQAogI2VuZGlmCiAjZGVmaW5lIEVYVDRfQkxPQ0tfQUxJR04oc2l6ZSwgYmxrYml0cykJCUFMSUdOKChzaXplKSwgKDEgPDwgKGJsa2JpdHMpKSkKIAorLyogVHJhbnNsYXRlIGEgYmxvY2sgbnVtYmVyIHRvIGEgY2x1c3RlciBudW1iZXIgKi8KKyNkZWZpbmUgRVhUNF9CMkMoc2JpLCBibGspCSgoYmxrKSA+PiAoc2JpKS0+c19jbHVzdGVyX2JpdHMpCisvKiBUcmFuc2xhdGUgYSBjbHVzdGVyIG51bWJlciB0byBhIGJsb2NrIG51bWJlciAqLworI2RlZmluZSBFWFQ0X0MyQihzYmksIGNsdXN0ZXIpCSgoY2x1c3RlcikgPDwgKHNiaSktPnNfY2x1c3Rlcl9iaXRzKQorLyogVHJhbnNsYXRlICMgb2YgYmxrcyB0byAjIG9mIGNsdXN0ZXJzICovCisjZGVmaW5lIEVYVDRfTlVNX0IyQyhzYmksIGJsa3MpCSgoKGJsa3MpICsgKHNiaSktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpID4+IFwKKwkJCQkgKHNiaSktPnNfY2x1c3Rlcl9iaXRzKQorCiAvKgogICogU3RydWN0dXJlIG9mIGEgYmxvY2tzIGdyb3VwIGRlc2NyaXB0b3IKICAqLwpAQCAtMjg5LDcgKzMwOCw3IEBACiAKIHN0cnVjdCBmbGV4X2dyb3VwcyB7CiAJYXRvbWljX3QgZnJlZV9pbm9kZXM7Ci0JYXRvbWljX3QgZnJlZV9ibG9ja3M7CisJYXRvbWljX3QgZnJlZV9jbHVzdGVyczsKIAlhdG9taWNfdCB1c2VkX2RpcnM7CiB9OwogCkBAIC0zMDYsNiArMzI1LDcgQEAKICNkZWZpbmUgRVhUNF9ERVNDX1NJWkUocykJCShFWFQ0X1NCKHMpLT5zX2Rlc2Nfc2l6ZSkKICNpZmRlZiBfX0tFUk5FTF9fCiAjIGRlZmluZSBFWFQ0X0JMT0NLU19QRVJfR1JPVVAocykJKEVYVDRfU0IocyktPnNfYmxvY2tzX3Blcl9ncm91cCkKKyMgZGVmaW5lIEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHMpCShFWFQ0X1NCKHMpLT5zX2NsdXN0ZXJzX3Blcl9ncm91cCkKICMgZGVmaW5lIEVYVDRfREVTQ19QRVJfQkxPQ0socykJCShFWFQ0X1NCKHMpLT5zX2Rlc2NfcGVyX2Jsb2NrKQogIyBkZWZpbmUgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHMpCShFWFQ0X1NCKHMpLT5zX2lub2Rlc19wZXJfZ3JvdXApCiAjIGRlZmluZSBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMocykJKEVYVDRfU0IocyktPnNfZGVzY19wZXJfYmxvY2tfYml0cykKQEAgLTM1OCw4ICszNzgsNyBAQAogCiAvKiBGbGFncyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQgYnkgbmV3IGlub2RlcyBmcm9tIHRoZWlyIHBhcmVudC4gKi8KICNkZWZpbmUgRVhUNF9GTF9JTkhFUklURUQgKEVYVDRfU0VDUk1fRkwgfCBFWFQ0X1VOUk1fRkwgfCBFWFQ0X0NPTVBSX0ZMIHxcCi0JCQkgICBFWFQ0X1NZTkNfRkwgfCBFWFQ0X0lNTVVUQUJMRV9GTCB8IEVYVDRfQVBQRU5EX0ZMIHxcCi0JCQkgICBFWFQ0X05PRFVNUF9GTCB8IEVYVDRfTk9BVElNRV9GTCB8XAorCQkJICAgRVhUNF9TWU5DX0ZMIHwgRVhUNF9OT0RVTVBfRkwgfCBFWFQ0X05PQVRJTUVfRkwgfFwKIAkJCSAgIEVYVDRfTk9DT01QUl9GTCB8IEVYVDRfSk9VUk5BTF9EQVRBX0ZMIHxcCiAJCQkgICBFWFQ0X05PVEFJTF9GTCB8IEVYVDRfRElSU1lOQ19GTCkKIApAQCAtNTIwLDYgKzUzOSw4IEBACiAjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19QVU5DSF9PVVRfRVhUCQkweDAwMjAKIAkvKiBEb24ndCBub3JtYWxpemUgYWxsb2NhdGlvbiBzaXplICh1c2VkIGZvciBmYWxsb2NhdGUpICovCiAjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19OT19OT1JNQUxJWkUJCTB4MDA0MAorCS8qIFJlcXVlc3Qgd2lsbCBub3QgcmVzdWx0IGluIGlub2RlIHNpemUgdXBkYXRlICh1c2VyIGZvciBmYWxsb2NhdGUpICovCisjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19LRUVQX1NJWkUJCTB4MDA4MAogCiAvKgogICogRmxhZ3MgdXNlZCBieSBleHQ0X2ZyZWVfYmxvY2tzCkBAIC01MjgsNiArNTQ5LDEzIEBACiAjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUCQkweDAwMDIKICNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19WQUxJREFURUQJMHgwMDA0CiAjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfTk9fUVVPVF9VUERBVEUJMHgwMDA4CisjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfTk9GUkVFX0ZJUlNUX0NMVVNURVIJMHgwMDEwCisjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfTk9GUkVFX0xBU1RfQ0xVU1RFUgkweDAwMjAKKworLyoKKyAqIEZsYWdzIHVzZWQgYnkgZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzCisgKi8KKyNkZWZpbmUgRVhUNF9ESVNDQVJEX1BBUlRJQUxfUEdfWkVST19VTk1BUFBFRAkweDAwMDEKIAogLyoKICAqIGlvY3RsIGNvbW1hbmRzCkBAIC01MzgsOSArNTY2LDYgQEAKICNkZWZpbmUJRVhUNF9JT0NfU0VUVkVSU0lPTgkJX0lPVygnZicsIDQsIGxvbmcpCiAjZGVmaW5lCUVYVDRfSU9DX0dFVFZFUlNJT05fT0xECQlGU19JT0NfR0VUVkVSU0lPTgogI2RlZmluZQlFWFQ0X0lPQ19TRVRWRVJTSU9OX09MRAkJRlNfSU9DX1NFVFZFUlNJT04KLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotI2RlZmluZSBFWFQ0X0lPQ19XQUlUX0ZPUl9SRUFET05MWQlfSU9SKCdmJywgOTksIGxvbmcpCi0jZW5kaWYKICNkZWZpbmUgRVhUNF9JT0NfR0VUUlNWU1oJCV9JT1IoJ2YnLCA1LCBsb25nKQogI2RlZmluZSBFWFQ0X0lPQ19TRVRSU1ZTWgkJX0lPVygnZicsIDYsIGxvbmcpCiAjZGVmaW5lIEVYVDRfSU9DX0dST1VQX0VYVEVORAkJX0lPVygnZicsIDcsIHVuc2lnbmVkIGxvbmcpCkBAIC01NjMsOSArNTg4LDYgQEAKICNkZWZpbmUgRVhUNF9JT0MzMl9TRVRSU1ZTWgkJX0lPVygnZicsIDYsIGludCkKICNkZWZpbmUgRVhUNF9JT0MzMl9HUk9VUF9FWFRFTkQJCV9JT1coJ2YnLCA3LCB1bnNpZ25lZCBpbnQpCiAjZGVmaW5lIEVYVDRfSU9DMzJfR1JPVVBfQURECQlfSU9XKCdmJywgOCwgc3RydWN0IGNvbXBhdF9leHQ0X25ld19ncm91cF9pbnB1dCkKLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotI2RlZmluZSBFWFQ0X0lPQzMyX1dBSVRfRk9SX1JFQURPTkxZCV9JT1IoJ2YnLCA5OSwgaW50KQotI2VuZGlmCiAjZGVmaW5lIEVYVDRfSU9DMzJfR0VUVkVSU0lPTl9PTEQJRlNfSU9DMzJfR0VUVkVSU0lPTgogI2RlZmluZSBFWFQ0X0lPQzMyX1NFVFZFUlNJT05fT0xECUZTX0lPQzMyX1NFVFZFUlNJT04KICNlbmRpZgpAQCAtODM3LDYgKzg1OSw3IEBACiAJZXh0NF9ncm91cF90CWlfbGFzdF9hbGxvY19ncm91cDsKIAogCS8qIGFsbG9jYXRpb24gcmVzZXJ2YXRpb24gaW5mbyBmb3IgZGVsYWxsb2MgKi8KKwkvKiBJbiBjYXNlIG9mIGJpZ2FsbG9jLCB0aGVzZSByZWZlciB0byBjbHVzdGVycyByYXRoZXIgdGhhbiBibG9ja3MgKi8KIAl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9kYXRhX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgaV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7CkBAIC04ODYsNyArOTA5LDYgQEAKIC8qCiAgKiBNb3VudCBmbGFncwogICovCi0jZGVmaW5lIEVYVDRfTU9VTlRfT0xEQUxMT0MJCTB4MDAwMDIgIC8qIERvbid0IHVzZSB0aGUgbmV3IE9ybG92IGFsbG9jYXRvciAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0dSUElECQkweDAwMDA0CS8qIENyZWF0ZSBmaWxlcyB3aXRoIGRpcmVjdG9yeSdzIGdyb3VwICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfREVCVUcJCTB4MDAwMDgJLyogU29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KICNkZWZpbmUgRVhUNF9NT1VOVF9FUlJPUlNfQ09OVAkJMHgwMDAxMAkvKiBDb250aW51ZSBvbiBlcnJvcnMgKi8KQEAgLTkxOCw2ICs5NDAsOSBAQAogI2RlZmluZSBFWFQ0X01PVU5UX0RJU0NBUkQJCTB4NDAwMDAwMDAgLyogSXNzdWUgRElTQ0FSRCByZXF1ZXN0cyAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0lOSVRfSU5PREVfVEFCTEUJMHg4MDAwMDAwMCAvKiBJbml0aWFsaXplIHVuaW5pdGlhbGl6ZWQgaXRhYmxlcyAqLwogCisjZGVmaW5lIEVYVDRfTU9VTlQyX0VYUExJQ0lUX0RFTEFMTE9DCTB4MDAwMDAwMDEgLyogVXNlciBleHBsaWNpdGx5CisJCQkJCQkgICAgICBzcGVjaWZpZWQgZGVsYWxsb2MgKi8KKwogI2RlZmluZSBjbGVhcl9vcHQoc2IsIG9wdCkJCUVYVDRfU0Ioc2IpLT5zX21vdW50X29wdCAmPSBcCiAJCQkJCQl+RVhUNF9NT1VOVF8jI29wdAogI2RlZmluZSBzZXRfb3B0KHNiLCBvcHQpCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9vcHQgfD0gXApAQCAtOTY4LDkgKzk5Myw5IEBACiAvKjEwKi8JX19sZTMyCXNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCiAJX19sZTMyCXNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLwogCV9fbGUzMglzX2xvZ19ibG9ja19zaXplOwkvKiBCbG9jayBzaXplICovCi0JX19sZTMyCXNfb2Jzb19sb2dfZnJhZ19zaXplOwkvKiBPYnNvbGV0ZWQgZnJhZ21lbnQgc2l6ZSAqLworCV9fbGUzMglzX2xvZ19jbHVzdGVyX3NpemU7CS8qIEFsbG9jYXRpb24gY2x1c3RlciBzaXplICovCiAvKjIwKi8JX19sZTMyCXNfYmxvY2tzX3Blcl9ncm91cDsJLyogIyBCbG9ja3MgcGVyIGdyb3VwICovCi0JX19sZTMyCXNfb2Jzb19mcmFnc19wZXJfZ3JvdXA7CS8qIE9ic29sZXRlZCBmcmFnbWVudHMgcGVyIGdyb3VwICovCisJX19sZTMyCXNfY2x1c3RlcnNfcGVyX2dyb3VwOwkvKiAjIENsdXN0ZXJzIHBlciBncm91cCAqLwogCV9fbGUzMglzX2lub2Rlc19wZXJfZ3JvdXA7CS8qICMgSW5vZGVzIHBlciBncm91cCAqLwogCV9fbGUzMglzX210aW1lOwkJLyogTW91bnQgdGltZSAqLwogLyozMCovCV9fbGUzMglzX3d0aW1lOwkJLyogV3JpdGUgdGltZSAqLwpAQCAtMTA2Niw3ICsxMDkxLDEwIEBACiAJX191OAlzX2xhc3RfZXJyb3JfZnVuY1szMl07CS8qIGZ1bmN0aW9uIHdoZXJlIHRoZSBlcnJvciBoYXBwZW5lZCAqLwogI2RlZmluZSBFWFQ0X1NfRVJSX0VORCBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jaywgc19tb3VudF9vcHRzKQogCV9fdTgJc19tb3VudF9vcHRzWzY0XTsKLQlfX2xlMzIJc19yZXNlcnZlZFsxMTJdOyAgICAgICAgLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworCV9fbGUzMglzX3Vzcl9xdW90YV9pbnVtOwkvKiBpbm9kZSBmb3IgdHJhY2tpbmcgdXNlciBxdW90YSAqLworCV9fbGUzMglzX2dycF9xdW90YV9pbnVtOwkvKiBpbm9kZSBmb3IgdHJhY2tpbmcgZ3JvdXAgcXVvdGEgKi8KKwlfX2xlMzIJc19vdmVyaGVhZF9jbHVzdGVyczsJLyogb3ZlcmhlYWQgYmxvY2tzL2NsdXN0ZXJzIGluIGZzICovCisJX19sZTMyICBzX3Jlc2VydmVkWzEwOV07ICAgICAgICAvKiBQYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCiB9OwogCiAjZGVmaW5lIEVYVDRfU19FUlJfTEVOIChFWFQ0X1NfRVJSX0VORCAtIEVYVDRfU19FUlJfU1RBUlQpCkBAIC0xMDg2LDYgKzExMTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgc19kZXNjX3NpemU7CS8qIFNpemUgb2YgYSBncm91cCBkZXNjcmlwdG9yIGluIGJ5dGVzICovCiAJdW5zaWduZWQgbG9uZyBzX2lub2Rlc19wZXJfYmxvY2s7LyogTnVtYmVyIG9mIGlub2RlcyBwZXIgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX3Blcl9ncm91cDsvKiBOdW1iZXIgb2YgYmxvY2tzIGluIGEgZ3JvdXAgKi8KKwl1bnNpZ25lZCBsb25nIHNfY2x1c3RlcnNfcGVyX2dyb3VwOyAvKiBOdW1iZXIgb2YgY2x1c3RlcnMgaW4gYSBncm91cCAqLwogCXVuc2lnbmVkIGxvbmcgc19pbm9kZXNfcGVyX2dyb3VwOy8qIE51bWJlciBvZiBpbm9kZXMgaW4gYSBncm91cCAqLwogCXVuc2lnbmVkIGxvbmcgc19pdGJfcGVyX2dyb3VwOwkvKiBOdW1iZXIgb2YgaW5vZGUgdGFibGUgYmxvY2tzIHBlciBncm91cCAqLwogCXVuc2lnbmVkIGxvbmcgc19nZGJfY291bnQ7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9yIGJsb2NrcyAqLwpAQCAtMTA5NCw2ICsxMTIzLDggQEAKIAlleHQ0X2dyb3VwX3Qgc19ibG9ja2ZpbGVfZ3JvdXBzOy8qIEdyb3VwcyBhY2NlcHRhYmxlIGZvciBub24tZXh0ZW50IGZpbGVzICovCiAJdW5zaWduZWQgbG9uZyBzX292ZXJoZWFkX2xhc3Q7ICAvKiBMYXN0IGNhbGN1bGF0ZWQgb3ZlcmhlYWQgKi8KIAl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX2xhc3Q7ICAgIC8qIExhc3Qgc2VlbiBibG9jayBjb3VudCAqLworCXVuc2lnbmVkIGludCBzX2NsdXN0ZXJfcmF0aW87CS8qIE51bWJlciBvZiBibG9ja3MgcGVyIGNsdXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgc19jbHVzdGVyX2JpdHM7CS8qIGxvZzIgb2Ygc19jbHVzdGVyX3JhdGlvICovCiAJbG9mZl90IHNfYml0bWFwX21heGJ5dGVzOwkvKiBtYXggYnl0ZXMgZm9yIGJpdG1hcCBmaWxlcyAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqIHNfc2JoOwkvKiBCdWZmZXIgY29udGFpbmluZyB0aGUgc3VwZXIgYmxvY2sgKi8KIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwpAQCAtMTExNywxMCArMTE0OCwxMCBAQAogCXUzMiBzX2hhc2hfc2VlZFs0XTsKIAlpbnQgc19kZWZfaGFzaF92ZXJzaW9uOwogCWludCBzX2hhc2hfdW5zaWduZWQ7CS8qIDMgaWYgaGFzaCBzaG91bGQgYmUgc2lnbmVkLCAwIGlmIG5vdCAqLwotCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2ZyZWVibG9ja3NfY291bnRlcjsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlY2x1c3RlcnNfY291bnRlcjsKIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlaW5vZGVzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZGlyc19jb3VudGVyOwotCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnR5YmxvY2tzX2NvdW50ZXI7CisJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZGlydHljbHVzdGVyc19jb3VudGVyOwogCXN0cnVjdCBibG9ja2dyb3VwX2xvY2sgKnNfYmxvY2tncm91cF9sb2NrOwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc19wcm9jOwogCXN0cnVjdCBrb2JqZWN0IHNfa29iajsKQEAgLTExMzYsMTAgKzExNjcsNiBAQAogCXUzMiBzX21heF9iYXRjaF90aW1lOwogCXUzMiBzX21pbl9iYXRjaF90aW1lOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmpvdXJuYWxfYmRldjsKLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotCXN0cnVjdCB0aW1lcl9saXN0IHR1cm5fcm9fdGltZXI7CS8qIEZvciB0dXJuaW5nIHJlYWQtb25seSAoY3Jhc2ggc2ltdWxhdGlvbikgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCByb193YWl0X3F1ZXVlOwkvKiBGb3IgcGVvcGxlIHdhaXRpbmcgZm9yIHRoZSBmcyB0byBnbyByZWFkLW9ubHkgKi8KLSNlbmRpZgogI2lmZGVmIENPTkZJR19RVU9UQQogCWNoYXIgKnNfcWZfbmFtZXNbTUFYUVVPVEFTXTsJCS8qIE5hbWVzIG9mIHF1b3RhIGZpbGVzIHdpdGggam91cm5hbGxlZCBxdW90YSAqLwogCWludCBzX2pxdW90YV9mbXQ7CQkJLyogRm9ybWF0IG9mIHF1b3RhIHRvIHVzZSAqLwpAQCAtMTI0OCw2ICsxMjc1LDE1IEBACiAJCSBpbm8gPD0gbGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3NldF9pb191bndyaXR0ZW5fZmxhZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgICBzdHJ1Y3QgZXh0NF9pb19lbmQgKmlvX2VuZCkKK3sKKwlpZiAoIShpb19lbmQtPmZsYWcgJiBFWFQ0X0lPX0VORF9VTldSSVRURU4pKSB7CisJCWlvX2VuZC0+ZmxhZyB8PSBFWFQ0X0lPX0VORF9VTldSSVRURU47CisJCWF0b21pY19pbmMoJkVYVDRfSShpbm9kZSktPmlfYWlvZGlvX3Vud3JpdHRlbik7CisJfQorfQorCiAvKgogICogSW5vZGUgZHluYW1pYyBzdGF0ZSBmbGFncwogICovCkBAIC0xMzYwLDYgKzEzOTYsNyBAQAogI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0RJUl9OTElOSwkweDAwMjAKICNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9FWFRSQV9JU0laRQkweDAwNDAKICNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9RVU9UQQkJMHgwMTAwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfQklHQUxMT0MJCTB4MDIwMAogCiAjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU0lPTgkweDAwMDEKICNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFCQkweDAwMDIKQEAgLTE0MDIsNyArMTQzOSw4IEBACiAJCQkJCSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0RJUl9OTElOSyB8IFwKIAkJCQkJIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfRVhUUkFfSVNJWkUgfCBcCiAJCQkJCSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JUUkVFX0RJUiB8XAotCQkJCQkgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9IVUdFX0ZJTEUpCisJCQkJCSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0hVR0VfRklMRSB8XAorCQkJCQkgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9CSUdBTExPQykKIAogLyoKICAqIERlZmF1bHQgdmFsdWVzIGZvciB1c2VyIGFuZC9vciBncm91cCB1c2luZyByZXNlcnZlZCBibG9ja3MKQEAgLTE3MzUsOSArMTc3Myw5IEBACiAJCQkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJCSB1bnNpZ25lZCBsb25nICpjb3VudCwKIAkJCQkJIGludCAqZXJycCk7Ci1leHRlcm4gaW50IGV4dDRfY2xhaW1fZnJlZV9ibG9ja3Moc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLAotCQkJCSAgczY0IG5ibG9ja3MsIHVuc2lnbmVkIGludCBmbGFncyk7Ci1leHRlcm4gZXh0NF9mc2Jsa190IGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIGludCBleHQ0X2NsYWltX2ZyZWVfY2x1c3RlcnMoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLAorCQkJCSAgICBzNjQgbmNsdXN0ZXJzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X2NvdW50X2ZyZWVfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgZXh0NF9jaGVja19ibG9ja3NfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICogZXh0NF9nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKIAkJCQkJCSAgICBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXAsCkBAIC0xNzQ1LDEyICsxNzgzLDE4IEBACiBleHRlcm4gaW50IGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqcmV0cmllcyk7CiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDRfcmVhZF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgICAgICBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXApOwotZXh0ZXJuIHVuc2lnbmVkIGV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCQkgICAgICAgZXh0NF9ncm91cF90IGdyb3VwLAotCQkJCSAgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjKTsKLSNkZWZpbmUgZXh0NF9mcmVlX2Jsb2Nrc19hZnRlcl9pbml0KHNiLCBncm91cCwgZGVzYykJCQlcCi0JCWV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc2IsIE5VTEwsIGdyb3VwLCBkZXNjKQorZXh0ZXJuIHZvaWQgZXh0NF9pbml0X2Jsb2NrX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJICAgZXh0NF9ncm91cF90IGdyb3VwLAorCQkJCSAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MpOworZXh0ZXJuIHVuc2lnbmVkIGV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwKKwkJCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwKTsKK2V4dGVybiB1bnNpZ25lZCBleHQ0X251bV9iYXNlX21ldGFfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCk7CitleHRlcm4gdW5zaWduZWQgZXh0NF9udW1fb3ZlcmhlYWRfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLAorCQkJCQkgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHApOwogZXh0NF9mc2Jsa190IGV4dDRfaW5vZGVfdG9fZ29hbF9ibG9jayhzdHJ1Y3QgaW5vZGUgKik7CiAKIC8qIGRpci5jICovCkBAIC0xNzc2LDcgKzE4MjAsOCBAQAogCiAvKiBpYWxsb2MuYyAqLwogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqZXh0NF9uZXdfaW5vZGUoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosIGludCwKLQkJCQkgICAgY29uc3Qgc3RydWN0IHFzdHIgKnFzdHIsIF9fdTMyIGdvYWwpOworCQkJCSAgICBjb25zdCBzdHJ1Y3QgcXN0ciAqcXN0ciwgX191MzIgZ29hbCwKKwkJCQkgICAgdWlkX3QgKm93bmVyKTsKIGV4dGVybiB2b2lkIGV4dDRfZnJlZV9pbm9kZShoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gc3RydWN0IGlub2RlICogZXh0NF9vcnBoYW5fZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZV9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwpAQCAtMTgzOSw2ICsxODg0LDEyIEBACiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3QgZnJvbSk7CiBleHRlcm4gaW50IGV4dDRfYmxvY2tfemVyb19wYWdlX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsCiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3QgZnJvbSwgbG9mZl90IGxlbmd0aCk7CitleHRlcm4gaW50IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVycyhoYW5kbGVfdCAqaGFuZGxlLAorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20sCisJCWxvZmZfdCBsZW5ndGgsIGludCBmbGFncyk7CitleHRlcm4gaW50IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrKGhhbmRsZV90ICpoYW5kbGUsCisJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLCBsb2ZmX3QgZnJvbSwKKwkJbG9mZl90IGxlbmd0aCwgaW50IGZsYWdzKTsKIGV4dGVybiBpbnQgZXh0NF9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKTsKIGV4dGVybiBxc2l6ZV90ICpleHQ0X2dldF9yZXNlcnZlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGV4dGVybiB2b2lkIGV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTE4NzgsNDAgKzE5MjksNDAgQEAKIGV4dGVybiB2b2lkICpleHQ0X2t2bWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CiBleHRlcm4gdm9pZCAqZXh0NF9rdnphbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgZXh0NF9rdmZyZWUodm9pZCAqcHRyKTsKLWV4dGVybiB2b2lkIF9fZXh0NF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworZXh0ZXJuIF9fcHJpbnRmKDQsIDUpCit2b2lkIF9fZXh0NF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJCSAgY29uc3QgY2hhciAqLCAuLi4pOwogI2RlZmluZSBleHQ0X2Vycm9yKHNiLCBtZXNzYWdlLi4uKQlfX2V4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAlcCiAJCQkJCQkgICAgIF9fTElORV9fLCAjIyBtZXNzYWdlKQotZXh0ZXJuIHZvaWQgZXh0NF9lcnJvcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgICAgIGV4dDRfZnNibGtfdCwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOwotZXh0ZXJuIHZvaWQgZXh0NF9lcnJvcl9maWxlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJICAgIGV4dDRfZnNibGtfdCwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOworZXh0ZXJuIF9fcHJpbnRmKDUsIDYpCit2b2lkIGV4dDRfZXJyb3JfaW5vZGUoc3RydWN0IGlub2RlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBleHQ0X2ZzYmxrX3QsCisJCSAgICAgIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiBfX3ByaW50Zig1LCA2KQordm9pZCBleHQ0X2Vycm9yX2ZpbGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGV4dDRfZnNibGtfdCwKKwkJICAgICBjb25zdCBjaGFyICosIC4uLik7CiBleHRlcm4gdm9pZCBfX2V4dDRfc3RkX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosCiAJCQkgICAgIHVuc2lnbmVkIGludCwgaW50KTsKLWV4dGVybiB2b2lkIF9fZXh0NF9hYm9ydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCSAgICAgICBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDQsIDUpKSk7CitleHRlcm4gX19wcmludGYoNCwgNSkKK3ZvaWQgX19leHQ0X2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKKwkJICBjb25zdCBjaGFyICosIC4uLik7CiAjZGVmaW5lIGV4dDRfYWJvcnQoc2IsIG1lc3NhZ2UuLi4pCV9fZXh0NF9hYm9ydChzYiwgX19mdW5jX18sIFwKIAkJCQkJCSAgICAgICBfX0xJTkVfXywgIyMgbWVzc2FnZSkKLWV4dGVybiB2b2lkIF9fZXh0NF93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCSAgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworZXh0ZXJuIF9fcHJpbnRmKDQsIDUpCit2b2lkIF9fZXh0NF93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKKwkJICAgIGNvbnN0IGNoYXIgKiwgLi4uKTsKICNkZWZpbmUgZXh0NF93YXJuaW5nKHNiLCBtZXNzYWdlLi4uKQlfX2V4dDRfd2FybmluZyhzYiwgX19mdW5jX18sIFwKIAkJCQkJCSAgICAgICBfX0xJTkVfXywgIyMgbWVzc2FnZSkKLWV4dGVybiB2b2lkIGV4dDRfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KQordm9pZCBleHQ0X21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CiBleHRlcm4gdm9pZCBfX2R1bXBfbW1wX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IG1tcF9zdHJ1Y3QgKm1tcCwKIAkJCSAgIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopOwogI2RlZmluZSBkdW1wX21tcF9tc2coc2IsIG1tcCwgbXNnKQlfX2R1bXBfbW1wX21zZyhzYiwgbW1wLCBfX2Z1bmNfXywgXAogCQkJCQkJICAgICAgIF9fTElORV9fLCBtc2cpCi1leHRlcm4gdm9pZCBfX2V4dDRfZ3JwX2xvY2tlZF9lcnJvcihjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgXAotCQkJCSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZXh0NF9ncm91cF90LCBcCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcsIGV4dDRfZnNibGtfdCwgXAotCQkJCSAgICBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDcsIDgpKSk7CitleHRlcm4gX19wcmludGYoNywgOCkKK3ZvaWQgX19leHQ0X2dycF9sb2NrZWRfZXJyb3IoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJCQkgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqLCBleHQ0X2dyb3VwX3QsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcsIGV4dDRfZnNibGtfdCwKKwkJCSAgICAgY29uc3QgY2hhciAqLCAuLi4pOwogI2RlZmluZSBleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGdycCwgbWVzc2FnZS4uLikgXAogCV9fZXh0NF9ncnBfbG9ja2VkX2Vycm9yKF9fZnVuY19fLCBfX0xJTkVfXywgKHNiKSwgKGdycCksICMjIG1lc3NhZ2UpCiBleHRlcm4gdm9pZCBleHQ0X3VwZGF0ZV9keW5hbWljX3JldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKQEAgLTE5MjcsOCArMTk3OCw4IEBACiAJCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X2lub2RlX3RhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7Ci1leHRlcm4gX191MzIgZXh0NF9mcmVlX2Jsa3NfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIF9fdTMyIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIF9fdTMyIGV4dDRfdXNlZF9kaXJzX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC0xOTQxLDggKzE5OTIsOSBAQAogCQkJCSAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIGV4dDRfZnNibGtfdCBibGspOwogZXh0ZXJuIHZvaWQgZXh0NF9pbm9kZV90YWJsZV9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIGV4dDRfZnNibGtfdCBibGspOwotZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2Jsa3Nfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIF9fdTMyIGNvdW50KTsKK2V4dGVybiB2b2lkIGV4dDRfZnJlZV9ncm91cF9jbHVzdGVyc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLAorCQkJCQkgX191MzIgY291bnQpOwogZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2lub2Rlc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpOwogZXh0ZXJuIHZvaWQgZXh0NF91c2VkX2RpcnNfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC0yMDUxLDEzICsyMTAzLDEzIEBACiB9IHdoaWxlICgwKQogCiAjaWZkZWYgQ09ORklHX1NNUAotLyogRWFjaCBDUFUgY2FuIGFjY3VtdWxhdGUgcGVyY3B1X2NvdW50ZXJfYmF0Y2ggYmxvY2tzIGluIHRoZWlyIGxvY2FsCi0gKiBjb3VudGVycy4gU28gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBmcmVlIGJsb2NrcyBtb3JlCisvKiBFYWNoIENQVSBjYW4gYWNjdW11bGF0ZSBwZXJjcHVfY291bnRlcl9iYXRjaCBjbHVzdGVycyBpbiB0aGVpciBsb2NhbAorICogY291bnRlcnMuIFNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZnJlZSBjbHVzdGVycyBtb3JlCiAgKiB0aGFuIHBlcmNwdV9jb3VudGVyX2JhdGNoICAqIG5yX2NwdV9pZHMuIEFsc28gYWRkIGEgd2luZG93IG9mIDQgdGltZXMuCiAgKi8KLSNkZWZpbmUgRVhUNF9GUkVFQkxPQ0tTX1dBVEVSTUFSSyAoNCAqIChwZXJjcHVfY291bnRlcl9iYXRjaCAqIG5yX2NwdV9pZHMpKQorI2RlZmluZSBFWFQ0X0ZSRUVDTFVTVEVSU19XQVRFUk1BUksgKDQgKiAocGVyY3B1X2NvdW50ZXJfYmF0Y2ggKiBucl9jcHVfaWRzKSkKICNlbHNlCi0jZGVmaW5lIEVYVDRfRlJFRUJMT0NLU19XQVRFUk1BUksgMAorI2RlZmluZSBFWFQ0X0ZSRUVDTFVTVEVSU19XQVRFUk1BUksgMAogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBuZXdzaXplKQpAQCAtMjI0MywxMCArMjI5NSwxOSBAQAogZW51bSBleHQ0X3N0YXRlX2JpdHMgewogCUJIX1VuaW5pdAkvKiBibG9ja3MgYXJlIGFsbG9jYXRlZCBidXQgdW5pbml0aWFsaXplZCBvbiBkaXNrICovCiAJICA9IEJIX0pCRFByaXZhdGVTdGFydCwKKwlCSF9BbGxvY0Zyb21DbHVzdGVyLAkvKiBhbGxvY2F0ZWQgYmxvY2tzIHdlcmUgcGFydCBvZiBhbHJlYWR5CisJCQkJICogYWxsb2NhdGVkIGNsdXN0ZXIuIE5vdGUgdGhhdCB0aGlzIGZsYWcgd2lsbAorCQkJCSAqIG5ldmVyLCBldmVyIGFwcGVhciBpbiBhIGJ1ZmZlcl9oZWFkJ3Mgc3RhdGUKKwkJCQkgKiBmbGFnLiBTZWUgRVhUNF9NQVBfRlJPTV9DTFVTVEVSIHRvIHNlZSB3aGVyZQorCQkJCSAqIHRoaXMgaXMgdXNlZC4gKi8KKwlCSF9EYV9NYXBwZWQsCS8qIERlbGF5ZWQgYWxsb2NhdGVkIGJsb2NrIHRoYXQgbm93IGhhcyBhIG1hcHBpbmcuIFRoaXMKKwkJCSAqIGZsYWcgaXMgc2V0IHdoZW4gZXh0NF9tYXBfYmxvY2tzIGlzIGNhbGxlZCBvbiBhCisJCQkgKiBkZWxheWVkIGFsbG9jYXRlZCBibG9jayB0byBnZXQgaXRzIHJlYWwgbWFwcGluZy4gKi8KIH07CiAKIEJVRkZFUl9GTlMoVW5pbml0LCB1bmluaXQpCiBUQVNfQlVGRkVSX0ZOUyhVbmluaXQsIHVuaW5pdCkKK0JVRkZFUl9GTlMoRGFfTWFwcGVkLCBkYV9tYXBwZWQpCiAKIC8qCiAgKiBBZGQgbmV3IG1ldGhvZCB0byB0ZXN0IHdldGhlciBibG9jayBhbmQgaW5vZGUgYml0bWFwcyBhcmUgcHJvcGVybHkKQEAgLTIyODIsNCArMjM0Myw2IEBACiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKKyNpbmNsdWRlICJleHQ0X2V4dGVudHMuaCIKKwogI2VuZGlmCS8qIF9FWFQ0X0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmggYi9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCmluZGV4IDA5NWMzNmYuLmE1MmRiM2EgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKKysrIGIvZnMvZXh0NC9leHQ0X2V4dGVudHMuaApAQCAtMjkwLDUgKzI5MCw3IEBACiAJCQkJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKik7CiBleHRlcm4gdm9pZCBleHQ0X2V4dF9kcm9wX3JlZnMoc3RydWN0IGV4dDRfZXh0X3BhdGggKik7CiBleHRlcm4gaW50IGV4dDRfZXh0X2NoZWNrX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIGludCBleHQ0X2ZpbmRfZGVsYWxsb2NfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLAorCQkJCSAgICAgIGludCBzZWFyY2hfaGludF9yZXZlcnNlKTsKICNlbmRpZiAvKiBfRVhUNF9FWFRFTlRTICovCiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9qYmQyLmMgYi9mcy9leHQ0L2V4dDRfamJkMi5jCmluZGV4IGY1MjQwYWEuLmFjYTE3OTAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9qYmQyLmMKKysrIGIvZnMvZXh0NC9leHQ0X2piZDIuYwpAQCAtMTA5LDkgKzEwOSwxMSBAQAogCiAJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpIHsKIAkJZXJyID0gamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOwotCQlpZiAoZXJyKQotCQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgbGluZSwgX19mdW5jX18sCi0JCQkJCQkgIGJoLCBoYW5kbGUsIGVycik7CisJCWlmIChlcnIpIHsKKwkJCS8qIEVycm9ycyBjYW4gb25seSBoYXBwZW4gaWYgdGhlcmUgaXMgYSBidWcgKi8KKwkJCWhhbmRsZS0+aF9lcnIgPSBlcnI7CisJCQlfX2V4dDRfam91cm5hbF9zdG9wKHdoZXJlLCBsaW5lLCBoYW5kbGUpOworCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGlub2RlKQogCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmMKaW5kZXggNTdjZjU2OC4uNjFmYTllMSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHRlbnRzLmMKKysrIGIvZnMvZXh0NC9leHRlbnRzLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgotI2luY2x1ZGUgImV4dDRfZXh0ZW50cy5oIgogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2V4dDQuaD4KIApAQCAtOTYsMTMgKzk1LDE3IEBACiAgKiAgLSBFTk9NRU0KICAqICAtIEVJTwogICovCi1zdGF0aWMgaW50IGV4dDRfZXh0X2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCisjZGVmaW5lIGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGgpIFwKKwkJX19leHQ0X2V4dF9kaXJ0eShfX2Z1bmNfXywgX19MSU5FX18sIChoYW5kbGUpLCAoaW5vZGUpLCAocGF0aCkpCitzdGF0aWMgaW50IF9fZXh0NF9leHRfZGlydHkoY29uc3QgY2hhciAqd2hlcmUsIHVuc2lnbmVkIGludCBsaW5lLAorCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCiB7CiAJaW50IGVycjsKIAlpZiAocGF0aC0+cF9iaCkgewogCQkvKiBwYXRoIHBvaW50cyB0byBibG9jayAqLwotCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBwYXRoLT5wX2JoKTsKKwkJZXJyID0gX19leHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSh3aGVyZSwgbGluZSwgaGFuZGxlLAorCQkJCQkJICAgaW5vZGUsIHBhdGgtPnBfYmgpOwogCX0gZWxzZSB7CiAJCS8qIHBhdGggcG9pbnRzIHRvIGxlYWYvaW5kZXggaW4gaW5vZGUgYm9keSAqLwogCQllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CkBAIC0xMTQsMTEgKzExNyw5IEBACiAJCQkgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKIAkJCSAgICAgIGV4dDRfbGJsa190IGJsb2NrKQogewotCWludCBkZXB0aDsKLQogCWlmIChwYXRoKSB7CisJCWludCBkZXB0aCA9IHBhdGgtPnBfZGVwdGg7CiAJCXN0cnVjdCBleHQ0X2V4dGVudCAqZXg7Ci0JCWRlcHRoID0gcGF0aC0+cF9kZXB0aDsKIAogCQkvKgogCQkgKiBUcnkgdG8gcHJlZGljdCBibG9jayBwbGFjZW1lbnQgYXNzdW1pbmcgdGhhdCB3ZSBhcmUKQEAgLTE4MCwxMiArMTgxLDEwIEBACiAKIAlzaXplID0gKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyKSkKIAkJCS8gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudCk7Ci0JaWYgKCFjaGVjaykgewogI2lmZGVmIEFHR1JFU1NJVkVfVEVTVAotCQlpZiAoc2l6ZSA+IDYpCi0JCQlzaXplID0gNjsKKwlpZiAoIWNoZWNrICYmIHNpemUgPiA2KQorCQlzaXplID0gNjsKICNlbmRpZgotCX0KIAlyZXR1cm4gc2l6ZTsKIH0KIApAQCAtMTk1LDEyICsxOTQsMTAgQEAKIAogCXNpemUgPSAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIpKQogCQkJLyBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2lkeCk7Ci0JaWYgKCFjaGVjaykgewogI2lmZGVmIEFHR1JFU1NJVkVfVEVTVAotCQlpZiAoc2l6ZSA+IDUpCi0JCQlzaXplID0gNTsKKwlpZiAoIWNoZWNrICYmIHNpemUgPiA1KQorCQlzaXplID0gNTsKICNlbmRpZgotCX0KIAlyZXR1cm4gc2l6ZTsKIH0KIApAQCAtMjExLDEyICsyMDgsMTAgQEAKIAlzaXplID0gc2l6ZW9mKEVYVDRfSShpbm9kZSktPmlfZGF0YSk7CiAJc2l6ZSAtPSBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlcik7CiAJc2l6ZSAvPSBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50KTsKLQlpZiAoIWNoZWNrKSB7CiAjaWZkZWYgQUdHUkVTU0lWRV9URVNUCi0JCWlmIChzaXplID4gMykKLQkJCXNpemUgPSAzOworCWlmICghY2hlY2sgJiYgc2l6ZSA+IDMpCisJCXNpemUgPSAzOwogI2VuZGlmCi0JfQogCXJldHVybiBzaXplOwogfQogCkBAIC0yMjcsMTIgKzIyMiwxMCBAQAogCXNpemUgPSBzaXplb2YoRVhUNF9JKGlub2RlKS0+aV9kYXRhKTsKIAlzaXplIC09IHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyKTsKIAlzaXplIC89IHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KTsKLQlpZiAoIWNoZWNrKSB7CiAjaWZkZWYgQUdHUkVTU0lWRV9URVNUCi0JCWlmIChzaXplID4gNCkKLQkJCXNpemUgPSA0OworCWlmICghY2hlY2sgJiYgc2l6ZSA+IDQpCisJCXNpemUgPSA0OwogI2VuZGlmCi0JfQogCXJldHVybiBzaXplOwogfQogCkBAIC0yNDQsNyArMjM3LDcgQEAKIGludCBleHQ0X2V4dF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxvY2spCiB7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwotCWludCBpZHhzLCBudW0gPSAwOworCWludCBpZHhzOwogCiAJaWR4cyA9ICgoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIpKQogCQkvIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KSk7CkBAIC0yNTksNiArMjUyLDggQEAKIAkgKi8KIAlpZiAoZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4gJiYKIAkgICAgZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sYXN0X2xibG9jaysxID09IGxibG9jaykgeworCQlpbnQgbnVtID0gMDsKKwogCQlpZiAoKGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuICUgaWR4cykgPT0gMCkKIAkJCW51bSsrOwogCQlpZiAoKGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuICUgKGlkeHMqaWR4cykpID09IDApCkBAIC0zMjEsOCArMzE2LDYgQEAKIAkJCQlzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICplaCwKIAkJCQlpbnQgZGVwdGgpCiB7Ci0Jc3RydWN0IGV4dDRfZXh0ZW50ICpleHQ7Ci0Jc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqZXh0X2lkeDsKIAl1bnNpZ25lZCBzaG9ydCBlbnRyaWVzOwogCWlmIChlaC0+ZWhfZW50cmllcyA9PSAwKQogCQlyZXR1cm4gMTsKQEAgLTMzMSw3ICszMjQsNyBAQAogCiAJaWYgKGRlcHRoID09IDApIHsKIAkJLyogbGVhZiBlbnRyaWVzICovCi0JCWV4dCA9IEVYVF9GSVJTVF9FWFRFTlQoZWgpOworCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4dCA9IEVYVF9GSVJTVF9FWFRFTlQoZWgpOwogCQl3aGlsZSAoZW50cmllcykgewogCQkJaWYgKCFleHQ0X3ZhbGlkX2V4dGVudChpbm9kZSwgZXh0KSkKIAkJCQlyZXR1cm4gMDsKQEAgLTMzOSw3ICszMzIsNyBAQAogCQkJZW50cmllcy0tOwogCQl9CiAJfSBlbHNlIHsKLQkJZXh0X2lkeCA9IEVYVF9GSVJTVF9JTkRFWChlaCk7CisJCXN0cnVjdCBleHQ0X2V4dGVudF9pZHggKmV4dF9pZHggPSBFWFRfRklSU1RfSU5ERVgoZWgpOwogCQl3aGlsZSAoZW50cmllcykgewogCQkJaWYgKCFleHQ0X3ZhbGlkX2V4dGVudF9pZHgoaW5vZGUsIGV4dF9pZHgpKQogCQkJCXJldHVybiAwOwpAQCAtNzUxLDMxICs3NDQsMzAgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JbGVuID0gRVhUX01BWF9JTkRFWChjdXJwLT5wX2hkcikgLSBjdXJwLT5wX2lkeDsKIAlpZiAobG9naWNhbCA+IGxlMzJfdG9fY3B1KGN1cnAtPnBfaWR4LT5laV9ibG9jaykpIHsKIAkJLyogaW5zZXJ0IGFmdGVyICovCi0JCWlmIChjdXJwLT5wX2lkeCAhPSBFWFRfTEFTVF9JTkRFWChjdXJwLT5wX2hkcikpIHsKLQkJCWxlbiA9IChsZW4gLSAxKSAqIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KTsKLQkJCWxlbiA9IGxlbiA8IDAgPyAwIDogbGVuOwotCQkJZXh0X2RlYnVnKCJpbnNlcnQgbmV3IGluZGV4ICVkIGFmdGVyOiAlbGx1LiAiCi0JCQkJCSJtb3ZlICVkIGZyb20gMHglcCB0byAweCVwXG4iLAotCQkJCQlsb2dpY2FsLCBwdHIsIGxlbiwKLQkJCQkJKGN1cnAtPnBfaWR4ICsgMSksIChjdXJwLT5wX2lkeCArIDIpKTsKLQkJCW1lbW1vdmUoY3VycC0+cF9pZHggKyAyLCBjdXJwLT5wX2lkeCArIDEsIGxlbik7Ci0JCX0KKwkJZXh0X2RlYnVnKCJpbnNlcnQgbmV3IGluZGV4ICVkIGFmdGVyOiAlbGx1XG4iLCBsb2dpY2FsLCBwdHIpOwogCQlpeCA9IGN1cnAtPnBfaWR4ICsgMTsKIAl9IGVsc2UgewogCQkvKiBpbnNlcnQgYmVmb3JlICovCi0JCWxlbiA9IGxlbiAqIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KTsKLQkJbGVuID0gbGVuIDwgMCA/IDAgOiBsZW47Ci0JCWV4dF9kZWJ1ZygiaW5zZXJ0IG5ldyBpbmRleCAlZCBiZWZvcmU6ICVsbHUuICIKLQkJCQkibW92ZSAlZCBmcm9tIDB4JXAgdG8gMHglcFxuIiwKLQkJCQlsb2dpY2FsLCBwdHIsIGxlbiwKLQkJCQljdXJwLT5wX2lkeCwgKGN1cnAtPnBfaWR4ICsgMSkpOwotCQltZW1tb3ZlKGN1cnAtPnBfaWR4ICsgMSwgY3VycC0+cF9pZHgsIGxlbik7CisJCWV4dF9kZWJ1ZygiaW5zZXJ0IG5ldyBpbmRleCAlZCBiZWZvcmU6ICVsbHVcbiIsIGxvZ2ljYWwsIHB0cik7CiAJCWl4ID0gY3VycC0+cF9pZHg7CiAJfQogCisJbGVuID0gRVhUX0xBU1RfSU5ERVgoY3VycC0+cF9oZHIpIC0gaXggKyAxOworCUJVR19PTihsZW4gPCAwKTsKKwlpZiAobGVuID4gMCkgeworCQlleHRfZGVidWcoImluc2VydCBuZXcgaW5kZXggJWQ6ICIKKwkJCQkibW92ZSAlZCBpbmRpY2VzIGZyb20gMHglcCB0byAweCVwXG4iLAorCQkJCWxvZ2ljYWwsIGxlbiwgaXgsIGl4ICsgMSk7CisJCW1lbW1vdmUoaXggKyAxLCBpeCwgbGVuICogc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9pZHgpKTsKKwl9CisKKwlpZiAodW5saWtlbHkoaXggPiBFWFRfTUFYX0lOREVYKGN1cnAtPnBfaGRyKSkpIHsKKwkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgIml4ID4gRVhUX01BWF9JTkRFWCEiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCiAJaXgtPmVpX2Jsb2NrID0gY3B1X3RvX2xlMzIobG9naWNhbCk7CiAJZXh0NF9pZHhfc3RvcmVfcGJsb2NrKGl4LCBwdHIpOwogCWxlMTZfYWRkX2NwdSgmY3VycC0+cF9oZHItPmVoX2VudHJpZXMsIDEpOwpAQCAtMTA0MiwxNiArMTAzNCwxNCBAQAogICovCiBzdGF0aWMgaW50IGV4dDRfZXh0X2dyb3dfaW5kZXB0aChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAogCQkJCSBzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCkKIHsKLQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqY3VycCA9IHBhdGg7CiAJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqbmVoOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJZXh0NF9mc2Jsa190IG5ld2Jsb2NrOwogCWludCBlcnIgPSAwOwogCi0JbmV3YmxvY2sgPSBleHQ0X2V4dF9uZXdfbWV0YV9ibG9jayhoYW5kbGUsIGlub2RlLCBwYXRoLAorCW5ld2Jsb2NrID0gZXh0NF9leHRfbmV3X21ldGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgTlVMTCwKIAkJbmV3ZXh0LCAmZXJyLCBmbGFncyk7CiAJaWYgKG5ld2Jsb2NrID09IDApCiAJCXJldHVybiBlcnI7CkBAIC0xMDcxLDcgKzEwNjEsOCBAQAogCX0KIAogCS8qIG1vdmUgdG9wLWxldmVsIGluZGV4L2xlYWYgaW50byBuZXcgYmxvY2sgKi8KLQltZW1tb3ZlKGJoLT5iX2RhdGEsIGN1cnAtPnBfaGRyLCBzaXplb2YoRVhUNF9JKGlub2RlKS0+aV9kYXRhKSk7CisJbWVtbW92ZShiaC0+Yl9kYXRhLCBFWFQ0X0koaW5vZGUpLT5pX2RhdGEsCisJCXNpemVvZihFWFQ0X0koaW5vZGUpLT5pX2RhdGEpKTsKIAogCS8qIHNldCBzaXplIG9mIG5ldyBibG9jayAqLwogCW5laCA9IGV4dF9ibG9ja19oZHIoYmgpOwpAQCAtMTA4OSwzMiArMTA4MCwyMyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JLyogY3JlYXRlIGluZGV4IGluIG5ldyB0b3AtbGV2ZWwgaW5kZXg6IG51bSxtYXgscG9pbnRlciAqLwotCWVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgY3VycCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQljdXJwLT5wX2hkci0+ZWhfbWFnaWMgPSBFWFQ0X0VYVF9NQUdJQzsKLQljdXJwLT5wX2hkci0+ZWhfbWF4ID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHgoaW5vZGUsIDApKTsKLQljdXJwLT5wX2hkci0+ZWhfZW50cmllcyA9IGNwdV90b19sZTE2KDEpOwotCWN1cnAtPnBfaWR4ID0gRVhUX0ZJUlNUX0lOREVYKGN1cnAtPnBfaGRyKTsKLQotCWlmIChwYXRoWzBdLnBfaGRyLT5laF9kZXB0aCkKLQkJY3VycC0+cF9pZHgtPmVpX2Jsb2NrID0KLQkJCUVYVF9GSVJTVF9JTkRFWChwYXRoWzBdLnBfaGRyKS0+ZWlfYmxvY2s7Ci0JZWxzZQotCQljdXJwLT5wX2lkeC0+ZWlfYmxvY2sgPQotCQkJRVhUX0ZJUlNUX0VYVEVOVChwYXRoWzBdLnBfaGRyKS0+ZWVfYmxvY2s7Ci0JZXh0NF9pZHhfc3RvcmVfcGJsb2NrKGN1cnAtPnBfaWR4LCBuZXdibG9jayk7Ci0KKwkvKiBVcGRhdGUgdG9wLWxldmVsIGluZGV4OiBudW0sbWF4LHBvaW50ZXIgKi8KIAluZWggPSBleHRfaW5vZGVfaGRyKGlub2RlKTsKKwluZWgtPmVoX2VudHJpZXMgPSBjcHVfdG9fbGUxNigxKTsKKwlleHQ0X2lkeF9zdG9yZV9wYmxvY2soRVhUX0ZJUlNUX0lOREVYKG5laCksIG5ld2Jsb2NrKTsKKwlpZiAobmVoLT5laF9kZXB0aCA9PSAwKSB7CisJCS8qIFJvb3QgZXh0ZW50IGJsb2NrIGJlY29tZXMgaW5kZXggYmxvY2sgKi8KKwkJbmVoLT5laF9tYXggPSBjcHVfdG9fbGUxNihleHQ0X2V4dF9zcGFjZV9yb290X2lkeChpbm9kZSwgMCkpOworCQlFWFRfRklSU1RfSU5ERVgobmVoKS0+ZWlfYmxvY2sgPQorCQkJRVhUX0ZJUlNUX0VYVEVOVChuZWgpLT5lZV9ibG9jazsKKwl9CiAJZXh0X2RlYnVnKCJuZXcgcm9vdDogbnVtICVkKCVkKSwgbGJsb2NrICVkLCBwdHIgJWxsdVxuIiwKIAkJICBsZTE2X3RvX2NwdShuZWgtPmVoX2VudHJpZXMpLCBsZTE2X3RvX2NwdShuZWgtPmVoX21heCksCiAJCSAgbGUzMl90b19jcHUoRVhUX0ZJUlNUX0lOREVYKG5laCktPmVpX2Jsb2NrKSwKIAkJICBleHQ0X2lkeF9wYmxvY2soRVhUX0ZJUlNUX0lOREVYKG5laCkpKTsKIAotCW5laC0+ZWhfZGVwdGggPSBjcHVfdG9fbGUxNihwYXRoLT5wX2RlcHRoICsgMSk7Ci0JZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgY3VycCk7CisJbmVoLT5laF9kZXB0aCA9IGNwdV90b19sZTE2KG5laC0+ZWhfZGVwdGggKyAxKTsKKwlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiBvdXQ6CiAJYnJlbHNlKGJoKTsKIApAQCAtMTE2Miw4ICsxMTQ0LDcgQEAKIAkJCWVyciA9IFBUUl9FUlIocGF0aCk7CiAJfSBlbHNlIHsKIAkJLyogdHJlZSBpcyBmdWxsLCB0aW1lIHRvIGdyb3cgaW4gZGVwdGggKi8KLQkJZXJyID0gZXh0NF9leHRfZ3Jvd19pbmRlcHRoKGhhbmRsZSwgaW5vZGUsIGZsYWdzLAotCQkJCQkgICAgcGF0aCwgbmV3ZXh0KTsKKwkJZXJyID0gZXh0NF9leHRfZ3Jvd19pbmRlcHRoKGhhbmRsZSwgaW5vZGUsIGZsYWdzLCBuZXdleHQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKQEAgLTEyMzUsOSArMTIxNiw5IEBACiAJCQlpZiAodW5saWtlbHkoaXggIT0gRVhUX0ZJUlNUX0lOREVYKHBhdGhbZGVwdGhdLnBfaGRyKSkpIHsKIAkJCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAogCQkJCSAgIml4ICglZCkgIT0gRVhUX0ZJUlNUX0lOREVYICglZCkgKGRlcHRoICVkKSEiLAotCQkJCSAgaXggIT0gTlVMTCA/IGl4LT5laV9ibG9jayA6IDAsCisJCQkJICBpeCAhPSBOVUxMID8gbGUzMl90b19jcHUoaXgtPmVpX2Jsb2NrKSA6IDAsCiAJCQkJICBFWFRfRklSU1RfSU5ERVgocGF0aFtkZXB0aF0ucF9oZHIpICE9IE5VTEwgPwotCQkJCSAgICBFWFRfRklSU1RfSU5ERVgocGF0aFtkZXB0aF0ucF9oZHIpLT5laV9ibG9jayA6IDAsCisJCWxlMzJfdG9fY3B1KEVYVF9GSVJTVF9JTkRFWChwYXRoW2RlcHRoXS5wX2hkciktPmVpX2Jsb2NrKSA6IDAsCiAJCQkJICBkZXB0aCk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CkBAIC0xMjYwLDEzICsxMjQxLDE0IEBACiAvKgogICogc2VhcmNoIHRoZSBjbG9zZXN0IGFsbG9jYXRlZCBibG9jayB0byB0aGUgcmlnaHQgZm9yICpsb2dpY2FsCiAgKiBhbmQgcmV0dXJucyBpdCBhdCBAbG9naWNhbCArIGl0J3MgcGh5c2ljYWwgYWRkcmVzcyBhdCBAcGh5cwotICogaWYgKmxvZ2ljYWwgaXMgdGhlIHNtYWxsZXN0IGFsbG9jYXRlZCBibG9jaywgdGhlIGZ1bmN0aW9uCisgKiBpZiAqbG9naWNhbCBpcyB0aGUgbGFyZ2VzdCBhbGxvY2F0ZWQgYmxvY2ssIHRoZSBmdW5jdGlvbgogICogcmV0dXJucyAwIGF0IEBwaHlzCiAgKiByZXR1cm4gdmFsdWUgY29udGFpbnMgMCAoc3VjY2Vzcykgb3IgZXJyb3IgY29kZQogICovCiBzdGF0aWMgaW50IGV4dDRfZXh0X3NlYXJjaF9yaWdodChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKLQkJCQkgZXh0NF9sYmxrX3QgKmxvZ2ljYWwsIGV4dDRfZnNibGtfdCAqcGh5cykKKwkJCQkgZXh0NF9sYmxrX3QgKmxvZ2ljYWwsIGV4dDRfZnNibGtfdCAqcGh5cywKKwkJCQkgc3RydWN0IGV4dDRfZXh0ZW50ICoqcmV0X2V4KQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOwpAQCAtMTMwOCw5ICsxMjkwLDcgQEAKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJfQotCQkqbG9naWNhbCA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7Ci0JCSpwaHlzID0gZXh0NF9leHRfcGJsb2NrKGV4KTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gZm91bmRfZXh0ZW50OwogCX0KIAogCWlmICh1bmxpa2VseSgqbG9naWNhbCA8IChsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spICsgZWVfbGVuKSkpIHsKQEAgLTEzMjMsOSArMTMwMyw3IEBACiAJaWYgKGV4ICE9IEVYVF9MQVNUX0VYVEVOVChwYXRoW2RlcHRoXS5wX2hkcikpIHsKIAkJLyogbmV4dCBhbGxvY2F0ZWQgYmxvY2sgaW4gdGhpcyBsZWFmICovCiAJCWV4Kys7Ci0JCSpsb2dpY2FsID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKLQkJKnBoeXMgPSBleHQ0X2V4dF9wYmxvY2soZXgpOwotCQlyZXR1cm4gMDsKKwkJZ290byBmb3VuZF9leHRlbnQ7CiAJfQogCiAJLyogZ28gdXAgYW5kIHNlYXJjaCBmb3IgaW5kZXggdG8gdGhlIHJpZ2h0ICovCkBAIC0xMzY4LDkgKzEzNDYsMTIgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCWV4ID0gRVhUX0ZJUlNUX0VYVEVOVChlaCk7Citmb3VuZF9leHRlbnQ6CiAJKmxvZ2ljYWwgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOwogCSpwaHlzID0gZXh0NF9leHRfcGJsb2NrKGV4KTsKLQlwdXRfYmgoYmgpOworCSpyZXRfZXggPSBleDsKKwlpZiAoYmgpCisJCXB1dF9iaChiaCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzOTUsNyArMTM3Niw4IEBACiAJd2hpbGUgKGRlcHRoID49IDApIHsKIAkJaWYgKGRlcHRoID09IHBhdGgtPnBfZGVwdGgpIHsKIAkJCS8qIGxlYWYgKi8KLQkJCWlmIChwYXRoW2RlcHRoXS5wX2V4dCAhPQorCQkJaWYgKHBhdGhbZGVwdGhdLnBfZXh0ICYmCisJCQkJcGF0aFtkZXB0aF0ucF9leHQgIT0KIAkJCQkJRVhUX0xBU1RfRVhURU5UKHBhdGhbZGVwdGhdLnBfaGRyKSkKIAkJCSAgcmV0dXJuIGxlMzJfdG9fY3B1KHBhdGhbZGVwdGhdLnBfZXh0WzFdLmVlX2Jsb2NrKTsKIAkJfSBlbHNlIHsKQEAgLTE2MjMsNyArMTYwNSw4IEBACiAgKiBzdWNoIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBvdmVybGFwLCBhbmQgdGhlbiByZXR1cm5zIDEuCiAgKiBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGZvdW5kLCBpdCByZXR1cm5zIDAuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorc3RhdGljIHVuc2lnbmVkIGludCBleHQ0X2V4dF9jaGVja19vdmVybGFwKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKKwkJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgc3RydWN0IGV4dDRfZXh0ZW50ICpuZXdleHQsCiAJCQkJCSAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQogewpAQCAtMTYzNyw2ICsxNjIwLDcgQEAKIAlpZiAoIXBhdGhbZGVwdGhdLnBfZXh0KQogCQlnb3RvIG91dDsKIAliMiA9IGxlMzJfdG9fY3B1KHBhdGhbZGVwdGhdLnBfZXh0LT5lZV9ibG9jayk7CisJYjIgJj0gfihzYmktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpOwogCiAJLyoKIAkgKiBnZXQgdGhlIG5leHQgYWxsb2NhdGVkIGJsb2NrIGlmIHRoZSBleHRlbnQgaW4gdGhlIHBhdGgKQEAgLTE2NDYsNiArMTYzMCw3IEBACiAJCWIyID0gZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2socGF0aCk7CiAJCWlmIChiMiA9PSBFWFRfTUFYX0JMT0NLUykKIAkJCWdvdG8gb3V0OworCQliMiAmPSB+KHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CiAJfQogCiAJLyogY2hlY2sgZm9yIHdyYXAgdGhyb3VnaCB6ZXJvIG9uIGV4dGVudCBsb2dpY2FsIHN0YXJ0IGJsb2NrKi8KQEAgLTE2OTcsNyArMTY4Miw3IEBACiAJLyogdHJ5IHRvIGluc2VydCBibG9jayBpbnRvIGZvdW5kIGV4dGVudCBhbmQgcmV0dXJuICovCiAJaWYgKGV4ICYmICEoZmxhZyAmIEVYVDRfR0VUX0JMT0NLU19QUkVfSU8pCiAJCSYmIGV4dDRfY2FuX2V4dGVudHNfYmVfbWVyZ2VkKGlub2RlLCBleCwgbmV3ZXh0KSkgewotCQlleHRfZGVidWcoImFwcGVuZCBbJWRdJWQgYmxvY2sgdG8gJWQ6WyVkXSVkIChmcm9tICVsbHUpXG4iLAorCQlleHRfZGVidWcoImFwcGVuZCBbJWRdJWQgYmxvY2sgdG8gJXU6WyVkXSVkIChmcm9tICVsbHUpXG4iLAogCQkJICBleHQ0X2V4dF9pc191bmluaXRpYWxpemVkKG5ld2V4dCksCiAJCQkgIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKG5ld2V4dCksCiAJCQkgIGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayksCkBAIC0xNzM1LDcgKzE3MjAsNyBAQAogCWlmIChsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSA+IGxlMzJfdG9fY3B1KGZleC0+ZWVfYmxvY2spKQogCQluZXh0ID0gZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHBhdGgpOwogCWlmIChuZXh0ICE9IEVYVF9NQVhfQkxPQ0tTKSB7Ci0JCWV4dF9kZWJ1ZygibmV4dCBsZWFmIGJsb2NrIC0gJWRcbiIsIG5leHQpOworCQlleHRfZGVidWcoIm5leHQgbGVhZiBibG9jayAtICV1XG4iLCBuZXh0KTsKIAkJQlVHX09OKG5wYXRoICE9IE5VTEwpOwogCQlucGF0aCA9IGV4dDRfZXh0X2ZpbmRfZXh0ZW50KGlub2RlLCBuZXh0LCBOVUxMKTsKIAkJaWYgKElTX0VSUihucGF0aCkpCkBAIC0xNzczLDQ2ICsxNzU4LDUxIEBACiAKIAlpZiAoIW5lYXJleCkgewogCQkvKiB0aGVyZSBpcyBubyBleHRlbnQgaW4gdGhpcyBsZWFmLCBjcmVhdGUgZmlyc3Qgb25lICovCi0JCWV4dF9kZWJ1ZygiZmlyc3QgZXh0ZW50IGluIHRoZSBsZWFmOiAlZDolbGx1OlslZF0lZFxuIiwKKwkJZXh0X2RlYnVnKCJmaXJzdCBleHRlbnQgaW4gdGhlIGxlYWY6ICV1OiVsbHU6WyVkXSVkXG4iLAogCQkJCWxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spLAogCQkJCWV4dDRfZXh0X3BibG9jayhuZXdleHQpLAogCQkJCWV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQobmV3ZXh0KSwKIAkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpKTsKLQkJcGF0aFtkZXB0aF0ucF9leHQgPSBFWFRfRklSU1RfRVhURU5UKGVoKTsKLQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spCisJCW5lYXJleCA9IEVYVF9GSVJTVF9FWFRFTlQoZWgpOworCX0gZWxzZSB7CisJCWlmIChsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKQogCQkJICAgPiBsZTMyX3RvX2NwdShuZWFyZXgtPmVlX2Jsb2NrKSkgewotLyoJCUJVR19PTihuZXdleHQtPmVlX2Jsb2NrID09IG5lYXJleC0+ZWVfYmxvY2spOyAqLwotCQlpZiAobmVhcmV4ICE9IEVYVF9MQVNUX0VYVEVOVChlaCkpIHsKLQkJCWxlbiA9IEVYVF9NQVhfRVhURU5UKGVoKSAtIG5lYXJleDsKLQkJCWxlbiA9IChsZW4gLSAxKSAqIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnQpOwotCQkJbGVuID0gbGVuIDwgMCA/IDAgOiBsZW47Ci0JCQlleHRfZGVidWcoImluc2VydCAlZDolbGx1OlslZF0lZCBhZnRlcjogbmVhcmVzdCAweCVwLCAiCi0JCQkJCSJtb3ZlICVkIGZyb20gMHglcCB0byAweCVwXG4iLAorCQkJLyogSW5zZXJ0IGFmdGVyICovCisJCQlleHRfZGVidWcoImluc2VydCAldTolbGx1OlslZF0lZCBiZWZvcmU6ICIKKwkJCQkJIm5lYXJlc3QgJXBcbiIsCiAJCQkJCWxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spLAogCQkJCQlleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSwKIAkJCQkJZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChuZXdleHQpLAogCQkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpLAotCQkJCQluZWFyZXgsIGxlbiwgbmVhcmV4ICsgMSwgbmVhcmV4ICsgMik7Ci0JCQltZW1tb3ZlKG5lYXJleCArIDIsIG5lYXJleCArIDEsIGxlbik7CisJCQkJCW5lYXJleCk7CisJCQluZWFyZXgrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIEluc2VydCBiZWZvcmUgKi8KKwkJCUJVR19PTihuZXdleHQtPmVlX2Jsb2NrID09IG5lYXJleC0+ZWVfYmxvY2spOworCQkJZXh0X2RlYnVnKCJpbnNlcnQgJXU6JWxsdTpbJWRdJWQgYWZ0ZXI6ICIKKwkJCQkJIm5lYXJlc3QgJXBcbiIsCisJCQkJCWxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spLAorCQkJCQlleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSwKKwkJCQkJZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChuZXdleHQpLAorCQkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpLAorCQkJCQluZWFyZXgpOwogCQl9Ci0JCXBhdGhbZGVwdGhdLnBfZXh0ID0gbmVhcmV4ICsgMTsKLQl9IGVsc2UgewotCQlCVUdfT04obmV3ZXh0LT5lZV9ibG9jayA9PSBuZWFyZXgtPmVlX2Jsb2NrKTsKLQkJbGVuID0gKEVYVF9NQVhfRVhURU5UKGVoKSAtIG5lYXJleCkgKiBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50KTsKLQkJbGVuID0gbGVuIDwgMCA/IDAgOiBsZW47Ci0JCWV4dF9kZWJ1ZygiaW5zZXJ0ICVkOiVsbHU6WyVkXSVkIGJlZm9yZTogbmVhcmVzdCAweCVwLCAiCi0JCQkJIm1vdmUgJWQgZnJvbSAweCVwIHRvIDB4JXBcbiIsCi0JCQkJbGUzMl90b19jcHUobmV3ZXh0LT5lZV9ibG9jayksCi0JCQkJZXh0NF9leHRfcGJsb2NrKG5ld2V4dCksCi0JCQkJZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChuZXdleHQpLAotCQkJCWV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKG5ld2V4dCksCi0JCQkJbmVhcmV4LCBsZW4sIG5lYXJleCwgbmVhcmV4ICsgMSk7Ci0JCW1lbW1vdmUobmVhcmV4ICsgMSwgbmVhcmV4LCBsZW4pOwotCQlwYXRoW2RlcHRoXS5wX2V4dCA9IG5lYXJleDsKKwkJbGVuID0gRVhUX0xBU1RfRVhURU5UKGVoKSAtIG5lYXJleCArIDE7CisJCWlmIChsZW4gPiAwKSB7CisJCQlleHRfZGVidWcoImluc2VydCAldTolbGx1OlslZF0lZDogIgorCQkJCQkibW92ZSAlZCBleHRlbnRzIGZyb20gMHglcCB0byAweCVwXG4iLAorCQkJCQlsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSwKKwkJCQkJZXh0NF9leHRfcGJsb2NrKG5ld2V4dCksCisJCQkJCWV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQobmV3ZXh0KSwKKwkJCQkJZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4obmV3ZXh0KSwKKwkJCQkJbGVuLCBuZWFyZXgsIG5lYXJleCArIDEpOworCQkJbWVtbW92ZShuZWFyZXggKyAxLCBuZWFyZXgsCisJCQkJbGVuICogc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudCkpOworCQl9CiAJfQogCiAJbGUxNl9hZGRfY3B1KCZlaC0+ZWhfZW50cmllcywgMSk7Ci0JbmVhcmV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7CisJcGF0aFtkZXB0aF0ucF9leHQgPSBuZWFyZXg7CiAJbmVhcmV4LT5lZV9ibG9jayA9IG5ld2V4dC0+ZWVfYmxvY2s7CiAJZXh0NF9leHRfc3RvcmVfcGJsb2NrKG5lYXJleCwgZXh0NF9leHRfcGJsb2NrKG5ld2V4dCkpOwogCW5lYXJleC0+ZWVfbGVuID0gbmV3ZXh0LT5lZV9sZW47CkBAIC0xOTYyLDYgKzE5NTIsNyBAQAogCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSAqY2V4OwogCUJVR19PTihsZW4gPT0gMCk7CiAJc3Bpbl9sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOworCXRyYWNlX2V4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgYmxvY2ssIGxlbiwgc3RhcnQpOwogCWNleCA9ICZFWFQ0X0koaW5vZGUpLT5pX2NhY2hlZF9leHRlbnQ7CiAJY2V4LT5lY19ibG9jayA9IGJsb2NrOwogCWNleC0+ZWNfbGVuID0gbGVuOwpAQCAtMjA2Myw2ICsyMDU0LDcgQEAKIAkJc2JpLT5leHRlbnRfY2FjaGVfbWlzc2VzKys7CiAJZWxzZQogCQlzYmktPmV4dGVudF9jYWNoZV9oaXRzKys7CisJdHJhY2VfZXh0NF9leHRfaW5fY2FjaGUoaW5vZGUsIGJsb2NrLCByZXQpOwogCXNwaW5fdW5sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwogCXJldHVybiByZXQ7CiB9CkBAIC0yMTMwLDYgKzIxMjIsOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJZXh0X2RlYnVnKCJpbmRleCBpcyBlbXB0eSwgcmVtb3ZlIGl0LCBmcmVlIGJsb2NrICVsbHVcbiIsIGxlYWYpOworCXRyYWNlX2V4dDRfZXh0X3JtX2lkeChpbm9kZSwgbGVhZik7CisKIAlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGxlYWYsIDEsCiAJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSB8IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKIAlyZXR1cm4gZXJyOwpAQCAtMjE1OCw3ICsyMTUyLDcgQEAKIAkJCSAqICBuZWVkIHRvIGFjY291bnQgZm9yIGxlYWYgYmxvY2sgY3JlZGl0CiAJCQkgKgogCQkJICogIGJpdG1hcHMgYW5kIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2tzCi0JCQkgKiAgYW5kIG90aGVyIG1ldGFkYXQgYmxvY2tzIHN0aWxsIG5lZWQgdG8gYmUKKwkJCSAqICBhbmQgb3RoZXIgbWV0YWRhdGEgYmxvY2tzIHN0aWxsIG5lZWQgdG8gYmUKIAkJCSAqICBhY2NvdW50ZWQuCiAJCQkgKi8KIAkJCS8qIDEgYml0bWFwLCAxIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3IgKi8KQEAgLTIxOTUsMTQgKzIxODksNDAgQEAKIH0KIAogc3RhdGljIGludCBleHQ0X3JlbW92ZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LAotCQkJCWV4dDRfbGJsa190IGZyb20sIGV4dDRfbGJsa190IHRvKQorCQkJICAgICAgc3RydWN0IGV4dDRfZXh0ZW50ICpleCwKKwkJCSAgICAgIGV4dDRfZnNibGtfdCAqcGFydGlhbF9jbHVzdGVyLAorCQkJICAgICAgZXh0NF9sYmxrX3QgZnJvbSwgZXh0NF9sYmxrX3QgdG8pCiB7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CiAJdW5zaWduZWQgc2hvcnQgZWVfbGVuID0gIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKKwlleHQ0X2ZzYmxrX3QgcGJsazsKIAlpbnQgZmxhZ3MgPSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDsKIAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEE7CisJLyoKKwkgKiBGb3IgYmlnYWxsb2MgZmlsZSBzeXN0ZW1zLCB3ZSBuZXZlciBmcmVlIGEgcGFydGlhbCBjbHVzdGVyCisJICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXh0ZW50LiAgSW5zdGVhZCwgd2UgbWFrZSBhIG5vdGUKKwkgKiB0aGF0IHdlIHRyaWVkIGZyZWVpbmcgdGhlIGNsdXN0ZXIsIGFuZCBjaGVjayB0byBzZWUgaWYgd2UKKwkgKiBuZWVkIHRvIGZyZWUgaXQgb24gYSBzdWJzZXF1ZW50IGNhbGwgdG8gZXh0NF9yZW1vdmVfYmxvY2tzLAorCSAqIG9yIGF0IHRoZSBlbmQgb2YgdGhlIGV4dDRfdHJ1bmNhdGUoKSBvcGVyYXRpb24uCisJICovCisJZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19OT0ZSRUVfRklSU1RfQ0xVU1RFUjsKKworCXRyYWNlX2V4dDRfcmVtb3ZlX2Jsb2Nrcyhpbm9kZSwgZXgsIGZyb20sIHRvLCAqcGFydGlhbF9jbHVzdGVyKTsKKwkvKgorCSAqIElmIHdlIGhhdmUgYSBwYXJ0aWFsIGNsdXN0ZXIsIGFuZCBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZQorCSAqIGNsdXN0ZXIgb2YgdGhlIGxhc3QgYmxvY2ssIHdlIG5lZWQgdG8gZXhwbGljaXRseSBmcmVlIHRoZQorCSAqIHBhcnRpYWwgY2x1c3RlciBoZXJlLgorCSAqLworCXBibGsgPSBleHQ0X2V4dF9wYmxvY2soZXgpICsgZWVfbGVuIC0gMTsKKwlpZiAoKnBhcnRpYWxfY2x1c3RlciAmJiAoRVhUNF9CMkMoc2JpLCBwYmxrKSAhPSAqcGFydGlhbF9jbHVzdGVyKSkgeworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsCisJCQkJIEVYVDRfQzJCKHNiaSwgKnBhcnRpYWxfY2x1c3RlciksCisJCQkJIHNiaS0+c19jbHVzdGVyX3JhdGlvLCBmbGFncyk7CisJCSpwYXJ0aWFsX2NsdXN0ZXIgPSAwOworCX0KKwogI2lmZGVmIEVYVEVOVFNfU1RBVFMKIAl7CiAJCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOwpAQCAtMjIyMiwxMiArMjI0MiwyNCBAQAogCSAgICAmJiB0byA9PSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spICsgZWVfbGVuIC0gMSkgewogCQkvKiB0YWlsIHJlbW92YWwgKi8KIAkJZXh0NF9sYmxrX3QgbnVtOwotCQlleHQ0X2ZzYmxrX3Qgc3RhcnQ7CiAKIAkJbnVtID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSArIGVlX2xlbiAtIGZyb207Ci0JCXN0YXJ0ID0gZXh0NF9leHRfcGJsb2NrKGV4KSArIGVlX2xlbiAtIG51bTsKLQkJZXh0X2RlYnVnKCJmcmVlIGxhc3QgJXUgYmxvY2tzIHN0YXJ0aW5nICVsbHVcbiIsIG51bSwgc3RhcnQpOwotCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIHN0YXJ0LCBudW0sIGZsYWdzKTsKKwkJcGJsayA9IGV4dDRfZXh0X3BibG9jayhleCkgKyBlZV9sZW4gLSBudW07CisJCWV4dF9kZWJ1ZygiZnJlZSBsYXN0ICV1IGJsb2NrcyBzdGFydGluZyAlbGx1XG4iLCBudW0sIHBibGspOworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIHBibGssIG51bSwgZmxhZ3MpOworCQkvKgorCQkgKiBJZiB0aGUgYmxvY2sgcmFuZ2UgdG8gYmUgZnJlZWQgZGlkbid0IHN0YXJ0IGF0IHRoZQorCQkgKiBiZWdpbm5pbmcgb2YgYSBjbHVzdGVyLCBhbmQgd2UgcmVtb3ZlZCB0aGUgZW50aXJlCisJCSAqIGV4dGVudCwgc2F2ZSB0aGUgcGFydGlhbCBjbHVzdGVyIGhlcmUsIHNpbmNlIHdlCisJCSAqIG1pZ2h0IG5lZWQgdG8gZGVsZXRlIGlmIHdlIGRldGVybWluZSB0aGF0IHRoZQorCQkgKiB0cnVuY2F0ZSBvcGVyYXRpb24gaGFzIHJlbW92ZWQgYWxsIG9mIHRoZSBibG9ja3MgaW4KKwkJICogdGhlIGNsdXN0ZXIuCisJCSAqLworCQlpZiAocGJsayAmIChzYmktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpICYmCisJCSAgICAoZWVfbGVuID09IG51bSkpCisJCQkqcGFydGlhbF9jbHVzdGVyID0gRVhUNF9CMkMoc2JpLCBwYmxrKTsKKwkJZWxzZQorCQkJKnBhcnRpYWxfY2x1c3RlciA9IDA7CiAJfSBlbHNlIGlmIChmcm9tID09IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykKIAkJICAgJiYgdG8gPD0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSArIGVlX2xlbiAtIDEpIHsKIAkJLyogaGVhZCByZW1vdmFsICovCkBAIC0yMjM4LDcgKzIyNzAsNyBAQAogCQlzdGFydCA9IGV4dDRfZXh0X3BibG9jayhleCk7CiAKIAkJZXh0X2RlYnVnKCJmcmVlIGZpcnN0ICV1IGJsb2NrcyBzdGFydGluZyAlbGx1XG4iLCBudW0sIHN0YXJ0KTsKLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAwLCBzdGFydCwgbnVtLCBmbGFncyk7CisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgc3RhcnQsIG51bSwgZmxhZ3MpOwogCiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAic3RyYW5nZSByZXF1ZXN0OiByZW1vdmFsKDIpICIKQEAgLTIyNjIsMTkgKzIyOTQsMTkgQEAKICAqLwogc3RhdGljIGludAogZXh0NF9leHRfcm1fbGVhZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwgZXh0NF9sYmxrX3Qgc3RhcnQsCi0JCWV4dDRfbGJsa190IGVuZCkKKwkJIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBleHQ0X2ZzYmxrX3QgKnBhcnRpYWxfY2x1c3RlciwKKwkJIGV4dDRfbGJsa190IHN0YXJ0LCBleHQ0X2xibGtfdCBlbmQpCiB7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CiAJaW50IGVyciA9IDAsIGNvcnJlY3RfaW5kZXggPSAwOwogCWludCBkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSksIGNyZWRpdHM7CiAJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7Ci0JZXh0NF9sYmxrX3QgYSwgYiwgYmxvY2s7CisJZXh0NF9sYmxrX3QgYSwgYjsKIAl1bnNpZ25lZCBudW07CiAJZXh0NF9sYmxrX3QgZXhfZWVfYmxvY2s7CiAJdW5zaWduZWQgc2hvcnQgZXhfZWVfbGVuOwogCXVuc2lnbmVkIHVuaW5pdGlhbGl6ZWQgPSAwOwogCXN0cnVjdCBleHQ0X2V4dGVudCAqZXg7Ci0Jc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7CiAKIAkvKiB0aGUgaGVhZGVyIG11c3QgYmUgY2hlY2tlZCBhbHJlYWR5IGluIGV4dDRfZXh0X3JlbW92ZV9zcGFjZSgpICovCiAJZXh0X2RlYnVnKCJ0cnVuY2F0ZSBzaW5jZSAldSBpbiBsZWFmXG4iLCBzdGFydCk7CkBAIC0yMjkxLDYgKzIzMjMsOCBAQAogCWV4X2VlX2Jsb2NrID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKIAlleF9lZV9sZW4gPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7CiAKKwl0cmFjZV9leHQ0X2V4dF9ybV9sZWFmKGlub2RlLCBzdGFydCwgZXgsICpwYXJ0aWFsX2NsdXN0ZXIpOworCiAJd2hpbGUgKGV4ID49IEVYVF9GSVJTVF9FWFRFTlQoZWgpICYmCiAJCQlleF9lZV9ibG9jayArIGV4X2VlX2xlbiA+IHN0YXJ0KSB7CiAKQEAgLTIzMTUsODYgKzIzNDksMTggQEAKIAkJCWV4X2VlX2Jsb2NrID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKIAkJCWV4X2VlX2xlbiA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKIAkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGEgIT0gZXhfZWVfYmxvY2sgJiYKLQkJCWIgIT0gZXhfZWVfYmxvY2sgKyBleF9lZV9sZW4gLSAxKSB7Ci0JCQkvKgotCQkJICogSWYgdGhpcyBpcyBhIHRydW5jYXRlLCB0aGVuIHRoaXMgY29uZGl0aW9uIHNob3VsZAotCQkJICogbmV2ZXIgaGFwcGVuIGJlY2F1c2UgYXQgbGVhc3Qgb25lIG9mIHRoZSBlbmQgcG9pbnRzCi0JCQkgKiBuZWVkcyB0byBiZSBvbiB0aGUgZWRnZSBvZiB0aGUgZXh0ZW50LgotCQkJICovCi0JCQlpZiAoZW5kID09IEVYVF9NQVhfQkxPQ0tTIC0gMSkgewotCQkJCWV4dF9kZWJ1ZygiICBiYWQgdHJ1bmNhdGUgJXU6JXVcbiIsCi0JCQkJCQlzdGFydCwgZW5kKTsKLQkJCQlibG9jayA9IDA7Ci0JCQkJbnVtID0gMDsKLQkJCQllcnIgPSAtRUlPOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJLyoKLQkJCSAqIGVsc2UgdGhpcyBpcyBhIGhvbGUgcHVuY2gsIHNvIHRoZSBleHRlbnQgbmVlZHMgdG8KLQkJCSAqIGJlIHNwbGl0IHNpbmNlIG5laXRoZXIgZWRnZSBvZiB0aGUgaG9sZSBpcyBvbiB0aGUKLQkJCSAqIGV4dGVudCBlZGdlCi0JCQkgKi8KLQkJCWVsc2V7Ci0JCQkJbWFwLm1fcGJsayA9IGV4dDRfZXh0X3BibG9jayhleCk7Ci0JCQkJbWFwLm1fbGJsayA9IGV4X2VlX2Jsb2NrOwotCQkJCW1hcC5tX2xlbiA9IGIgLSBleF9lZV9ibG9jazsKLQotCQkJCWVyciA9IGV4dDRfc3BsaXRfZXh0ZW50KGhhbmRsZSwKLQkJCQkJaW5vZGUsIHBhdGgsICZtYXAsIDAsCi0JCQkJCUVYVDRfR0VUX0JMT0NLU19QVU5DSF9PVVRfRVhUIHwKLQkJCQkJRVhUNF9HRVRfQkxPQ0tTX1BSRV9JTyk7Ci0KLQkJCQlpZiAoZXJyIDwgMCkKLQkJCQkJZ290byBvdXQ7Ci0KLQkJCQlleF9lZV9sZW4gPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7Ci0KLQkJCQliID0gZXhfZWVfYmxvY2srZXhfZWVfbGVuIC0gMSA8IGVuZCA/Ci0JCQkJCWV4X2VlX2Jsb2NrK2V4X2VlX2xlbiAtIDEgOiBlbmQ7Ci0KLQkJCQkvKiBUaGVuIHJlbW92ZSB0YWlsIG9mIHRoaXMgZXh0ZW50ICovCi0JCQkJYmxvY2sgPSBleF9lZV9ibG9jazsKLQkJCQludW0gPSBhIC0gYmxvY2s7Ci0JCQl9CisJCX0gZWxzZSBpZiAoYiAhPSBleF9lZV9ibG9jayArIGV4X2VlX2xlbiAtIDEpIHsKKwkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsIiAgYmFkIHRydW5jYXRlICV1OiV1XG4iLAorCQkJCQkgc3RhcnQsIGVuZCk7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CiAJCX0gZWxzZSBpZiAoYSAhPSBleF9lZV9ibG9jaykgewogCQkJLyogcmVtb3ZlIHRhaWwgb2YgdGhlIGV4dGVudCAqLwotCQkJYmxvY2sgPSBleF9lZV9ibG9jazsKLQkJCW51bSA9IGEgLSBibG9jazsKLQkJfSBlbHNlIGlmIChiICE9IGV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuIC0gMSkgewotCQkJLyogcmVtb3ZlIGhlYWQgb2YgdGhlIGV4dGVudCAqLwotCQkJYmxvY2sgPSBiOwotCQkJbnVtID0gIGV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuIC0gYjsKLQotCQkJLyoKLQkJCSAqIElmIHRoaXMgaXMgYSB0cnVuY2F0ZSwgdGhpcyBjb25kaXRpb24KLQkJCSAqIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCSAqLwotCQkJaWYgKGVuZCA9PSBFWFRfTUFYX0JMT0NLUyAtIDEpIHsKLQkJCQlleHRfZGVidWcoIiAgYmFkIHRydW5jYXRlICV1OiV1XG4iLAotCQkJCQlzdGFydCwgZW5kKTsKLQkJCQllcnIgPSAtRUlPOwotCQkJCWdvdG8gb3V0OwotCQkJfQorCQkJbnVtID0gYSAtIGV4X2VlX2Jsb2NrOwogCQl9IGVsc2UgewogCQkJLyogcmVtb3ZlIHdob2xlIGV4dGVudDogZXhjZWxsZW50ISAqLwotCQkJYmxvY2sgPSBleF9lZV9ibG9jazsKIAkJCW51bSA9IDA7Ci0JCQlpZiAoYSAhPSBleF9lZV9ibG9jaykgewotCQkJCWV4dF9kZWJ1ZygiICBiYWQgdHJ1bmNhdGUgJXU6JXVcbiIsCi0JCQkJCXN0YXJ0LCBlbmQpOwotCQkJCWVyciA9IC1FSU87Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0KLQkJCWlmIChiICE9IGV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuIC0gMSkgewotCQkJCWV4dF9kZWJ1ZygiICBiYWQgdHJ1bmNhdGUgJXU6JXVcbiIsCi0JCQkJCXN0YXJ0LCBlbmQpOwotCQkJCWVyciA9IC1FSU87Ci0JCQkJZ290byBvdXQ7Ci0JCQl9CiAJCX0KLQogCQkvKgogCQkgKiAzIGZvciBsZWFmLCBzYiwgYW5kIGlub2RlIHBsdXMgMiAoYm1hcCBhbmQgZ3JvdXAKIAkJICogZGVzY3JpcHRvcikgZm9yIGVhY2ggYmxvY2sgZ3JvdXA7IGFzc3VtZSB0d28gYmxvY2sKQEAgLTI0MTYsMjMgKzIzODIsMTUgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCi0JCWVyciA9IGV4dDRfcmVtb3ZlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBleCwgYSwgYik7CisJCWVyciA9IGV4dDRfcmVtb3ZlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBleCwgcGFydGlhbF9jbHVzdGVyLAorCQkJCQkgYSwgYik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAobnVtID09IDApIHsKKwkJaWYgKG51bSA9PSAwKQogCQkJLyogdGhpcyBleHRlbnQgaXMgcmVtb3ZlZDsgbWFyayBzbG90IGVudGlyZWx5IHVudXNlZCAqLwogCQkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCAwKTsKLQkJfSBlbHNlIGlmIChibG9jayAhPSBleF9lZV9ibG9jaykgewotCQkJLyoKLQkJCSAqIElmIHRoaXMgd2FzIGEgaGVhZCByZW1vdmFsLCB0aGVuIHdlIG5lZWQgdG8gdXBkYXRlCi0JCQkgKiB0aGUgcGh5c2ljYWwgYmxvY2sgc2luY2UgaXQgaXMgbm93IGF0IGEgZGlmZmVyZW50Ci0JCQkgKiBsb2NhdGlvbgotCQkJICovCi0JCQlleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIGV4dDRfZXh0X3BibG9jayhleCkgKyAoYi1hKSk7Ci0JCX0KIAotCQlleC0+ZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihibG9jayk7CiAJCWV4LT5lZV9sZW4gPSBjcHVfdG9fbGUxNihudW0pOwogCQkvKgogCQkgKiBEbyBub3QgbWFyayB1bmluaXRpYWxpemVkIGlmIGFsbCB0aGUgYmxvY2tzIGluIHRoZQpAQCAtMjQ0MCwxMSArMjM5OCw2IEBACiAJCSAqLwogCQlpZiAodW5pbml0aWFsaXplZCAmJiBudW0pCiAJCQlleHQ0X2V4dF9tYXJrX3VuaW5pdGlhbGl6ZWQoZXgpOwotCi0JCWVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQogCQkvKgogCQkgKiBJZiB0aGUgZXh0ZW50IHdhcyBjb21wbGV0ZWx5IHJlbGVhc2VkLAogCQkgKiB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsZWFmCkBAIC0yNDY0LDkgKzI0MTcsMTQgQEAKIAkJCQkJc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudCkpOwogCQkJfQogCQkJbGUxNl9hZGRfY3B1KCZlaC0+ZWhfZW50cmllcywgLTEpOwotCQl9CisJCX0gZWxzZQorCQkJKnBhcnRpYWxfY2x1c3RlciA9IDA7CiAKLQkJZXh0X2RlYnVnKCJuZXcgZXh0ZW50OiAldToldTolbGx1XG4iLCBibG9jaywgbnVtLAorCQllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJZXh0X2RlYnVnKCJuZXcgZXh0ZW50OiAldToldTolbGx1XG4iLCBleF9lZV9ibG9jaywgbnVtLAogCQkJCWV4dDRfZXh0X3BibG9jayhleCkpOwogCQlleC0tOwogCQlleF9lZV9ibG9jayA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7CkBAIC0yNDc2LDYgKzI0MzQsMjUgQEAKIAlpZiAoY29ycmVjdF9pbmRleCAmJiBlaC0+ZWhfZW50cmllcykKIAkJZXJyID0gZXh0NF9leHRfY29ycmVjdF9pbmRleGVzKGhhbmRsZSwgaW5vZGUsIHBhdGgpOwogCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBzdGlsbCBhIGVudHJ5IGluIHRoZSBsZWFmIG5vZGUsIGNoZWNrIHRvIHNlZSBpZgorCSAqIGl0IHJlZmVyZW5jZXMgdGhlIHBhcnRpYWwgY2x1c3Rlci4gIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UKKwkgKiB3aGVyZSBpdCBjb3VsZDsgaWYgaXQgZG9lc24ndCwgd2UgY2FuIGZyZWUgdGhlIGNsdXN0ZXIuCisJICovCisJaWYgKCpwYXJ0aWFsX2NsdXN0ZXIgJiYgZXggPj0gRVhUX0ZJUlNUX0VYVEVOVChlaCkgJiYKKwkgICAgKEVYVDRfQjJDKHNiaSwgZXh0NF9leHRfcGJsb2NrKGV4KSArIGV4X2VlX2xlbiAtIDEpICE9CisJICAgICAqcGFydGlhbF9jbHVzdGVyKSkgeworCQlpbnQgZmxhZ3MgPSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDsKKworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQkJZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQTsKKworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsCisJCQkJIEVYVDRfQzJCKHNiaSwgKnBhcnRpYWxfY2x1c3RlciksCisJCQkJIHNiaS0+c19jbHVzdGVyX3JhdGlvLCBmbGFncyk7CisJCSpwYXJ0aWFsX2NsdXN0ZXIgPSAwOworCX0KKwogCS8qIGlmIHRoaXMgbGVhZiBpcyBmcmVlLCB0aGVuIHdlIHNob3VsZAogCSAqIHJlbW92ZSBpdCBmcm9tIGluZGV4IGJsb2NrIGFib3ZlICovCiAJaWYgKGVyciA9PSAwICYmIGVoLT5laF9lbnRyaWVzID09IDAgJiYgcGF0aFtkZXB0aF0ucF9iaCAhPSBOVUxMKQpAQCAtMjUxMSw2ICsyNDg4LDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJaW50IGRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKIAlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDsKKwlleHQ0X2ZzYmxrX3QgcGFydGlhbF9jbHVzdGVyID0gMDsKIAloYW5kbGVfdCAqaGFuZGxlOwogCWludCBpLCBlcnI7CiAKQEAgLTI1MjQsNiArMjUwMiw4IEBACiBhZ2FpbjoKIAlleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKGlub2RlKTsKIAorCXRyYWNlX2V4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgc3RhcnQsIGRlcHRoKTsKKwogCS8qCiAJICogV2Ugc3RhcnQgc2Nhbm5pbmcgZnJvbSByaWdodCBzaWRlLCBmcmVlaW5nIGFsbCB0aGUgYmxvY2tzCiAJICogYWZ0ZXIgaV9zaXplIGFuZCB3YWxraW5nIGludG8gdGhlIHRyZWUgZGVwdGgtd2lzZS4KQEAgLTI1NDYsNyArMjUyNiw4IEBACiAJCWlmIChpID09IGRlcHRoKSB7CiAJCQkvKiB0aGlzIGlzIGxlYWYgYmxvY2sgKi8KIAkJCWVyciA9IGV4dDRfZXh0X3JtX2xlYWYoaGFuZGxlLCBpbm9kZSwgcGF0aCwKLQkJCQkJc3RhcnQsIEVYVF9NQVhfQkxPQ0tTIC0gMSk7CisJCQkJCSAgICAgICAmcGFydGlhbF9jbHVzdGVyLCBzdGFydCwKKwkJCQkJICAgICAgIEVYVF9NQVhfQkxPQ0tTIC0gMSk7CiAJCQkvKiByb290IGxldmVsIGhhcyBwX2JoID09IE5VTEwsIGJyZWxzZSgpIGVhdHMgdGhpcyAqLwogCQkJYnJlbHNlKHBhdGhbaV0ucF9iaCk7CiAJCQlwYXRoW2ldLnBfYmggPSBOVUxMOwpAQCAtMjYxOCw2ICsyNTk5LDI0IEBACiAJCX0KIAl9CiAKKwl0cmFjZV9leHQ0X2V4dF9yZW1vdmVfc3BhY2VfZG9uZShpbm9kZSwgc3RhcnQsIGRlcHRoLCBwYXJ0aWFsX2NsdXN0ZXIsCisJCQlwYXRoLT5wX2hkci0+ZWhfZW50cmllcyk7CisKKwkvKiBJZiB3ZSBzdGlsbCBoYXZlIHNvbWV0aGluZyBpbiB0aGUgcGFydGlhbCBjbHVzdGVyIGFuZCB3ZSBoYXZlIHJlbW92ZWQKKwkgKiBldmVuIHRoZSBmaXJzdCBleHRlbnQsIHRoZW4gd2Ugc2hvdWxkIGZyZWUgdGhlIGJsb2NrcyBpbiB0aGUgcGFydGlhbAorCSAqIGNsdXN0ZXIgYXMgd2VsbC4gKi8KKwlpZiAocGFydGlhbF9jbHVzdGVyICYmIHBhdGgtPnBfaGRyLT5laF9lbnRyaWVzID09IDApIHsKKwkJaW50IGZsYWdzID0gRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQ7CisKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEE7CisKKwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLAorCQkJCSBFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgcGFydGlhbF9jbHVzdGVyKSwKKwkJCQkgRVhUNF9TQihzYiktPnNfY2x1c3Rlcl9yYXRpbywgZmxhZ3MpOworCQlwYXJ0aWFsX2NsdXN0ZXIgPSAwOworCX0KKwogCS8qIFRPRE86IGZsZXhpYmxlIHRyZWUgcmVkdWN0aW9uIHNob3VsZCBiZSBoZXJlICovCiAJaWYgKHBhdGgtPnBfaGRyLT5laF9lbnRyaWVzID09IDApIHsKIAkJLyoKQEAgLTI5MDksMTcgKzI5MDgsMjkgQEAKICAqICAgYT4gVGhlcmUgaXMgbm8gc3BsaXQgcmVxdWlyZWQ6IEVudGlyZSBleHRlbnQgc2hvdWxkIGJlIGluaXRpYWxpemVkCiAgKiAgIGI+IFNwbGl0cyBpbiB0d28gZXh0ZW50czogV3JpdGUgaXMgaGFwcGVuaW5nIGF0IGVpdGhlciBlbmQgb2YgdGhlIGV4dGVudAogICogICBjPiBTcGxpdHMgaW4gdGhyZWUgZXh0ZW50czogU29tb25lIGlzIHdyaXRpbmcgaW4gbWlkZGxlIG9mIHRoZSBleHRlbnQKKyAqCisgKiBQcmUtY29uZGl0aW9uczoKKyAqICAtIFRoZSBleHRlbnQgcG9pbnRlZCB0byBieSAncGF0aCcgaXMgdW5pbml0aWFsaXplZC4KKyAqICAtIFRoZSBleHRlbnQgcG9pbnRlZCB0byBieSAncGF0aCcgY29udGFpbnMgYSBzdXBlcnNldAorICogICAgb2YgdGhlIGxvZ2ljYWwgc3BhbiBbbWFwLT5tX2xibGssIG1hcC0+bV9sYmxrICsgbWFwLT5tX2xlbikuCisgKgorICogUG9zdC1jb25kaXRpb25zIG9uIHN1Y2Nlc3M6CisgKiAgLSB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBibG9ja3MgYmV5b25kIG1hcC0+bF9sYmxrCisgKiAgICB0aGF0IGFyZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLgorICogICAgSXQgaXMgZ3VhcmFudGVlZCB0byBiZSA+PSBtYXAtPm1fbGVuLgogICovCiBzdGF0aWMgaW50IGV4dDRfZXh0X2NvbnZlcnRfdG9faW5pdGlhbGl6ZWQoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAogCQkJCQkgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKIHsKKwlzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICplaDsKIAlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIHNwbGl0X21hcDsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgemVyb19leDsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4OwogCWV4dDRfbGJsa190IGVlX2Jsb2NrLCBlb2ZfYmxvY2s7Ci0JdW5zaWduZWQgaW50IGFsbG9jYXRlZCwgZWVfbGVuLCBkZXB0aDsKKwl1bnNpZ25lZCBpbnQgZWVfbGVuLCBkZXB0aDsKKwlpbnQgYWxsb2NhdGVkOwogCWludCBlcnIgPSAwOwogCWludCBzcGxpdF9mbGFnID0gMDsKIApAQCAtMjkzMywxMSArMjk0NCw5MyBAQAogCQllb2ZfYmxvY2sgPSBtYXAtPm1fbGJsayArIG1hcC0+bV9sZW47CiAKIAlkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CisJZWggPSBwYXRoW2RlcHRoXS5wX2hkcjsKIAlleCA9IHBhdGhbZGVwdGhdLnBfZXh0OwogCWVlX2Jsb2NrID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKIAllZV9sZW4gPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7CiAJYWxsb2NhdGVkID0gZWVfbGVuIC0gKG1hcC0+bV9sYmxrIC0gZWVfYmxvY2spOwogCisJdHJhY2VfZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZF9lbnRlcihpbm9kZSwgbWFwLCBleCk7CisKKwkvKiBQcmUtY29uZGl0aW9ucyAqLworCUJVR19PTighZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChleCkpOworCUJVR19PTighaW5fcmFuZ2UobWFwLT5tX2xibGssIGVlX2Jsb2NrLCBlZV9sZW4pKTsKKwlCVUdfT04obWFwLT5tX2xibGsgKyBtYXAtPm1fbGVuID4gZWVfYmxvY2sgKyBlZV9sZW4pOworCisJLyoKKwkgKiBBdHRlbXB0IHRvIHRyYW5zZmVyIG5ld2x5IGluaXRpYWxpemVkIGJsb2NrcyBmcm9tIHRoZSBjdXJyZW50bHkKKwkgKiB1bmluaXRpYWxpemVkIGV4dGVudCB0byBpdHMgbGVmdCBuZWlnaGJvci4gVGhpcyBpcyBtdWNoIGNoZWFwZXIKKwkgKiB0aGFuIGFuIGluc2VydGlvbiBmb2xsb3dlZCBieSBhIG1lcmdlIGFzIHRob3NlIGludm9sdmUgY29zdGx5CisJICogbWVtbW92ZSgpIGNhbGxzLiBUaGlzIGlzIHRoZSBjb21tb24gY2FzZSBpbiBzdGVhZHkgc3RhdGUgZm9yCisJICogd29ya2xvYWRzIGRvaW5nIGZhbGxvY2F0ZShGQUxMT0NfRkxfS0VFUF9TSVpFKSBmb2xsb3dlZCBieSBhcHBlbmQKKwkgKiB3cml0ZXMuCisJICoKKwkgKiBMaW1pdGF0aW9ucyBvZiB0aGUgY3VycmVudCBsb2dpYzoKKwkgKiAgLSBMMTogd2Ugb25seSBkZWFsIHdpdGggd3JpdGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgZXh0ZW50LgorCSAqICAgIFRoZSBhcHByb2FjaCBjb3VsZCBiZSBleHRlbmRlZCB0byB3cml0ZXMgYXQgdGhlIGVuZAorCSAqICAgIG9mIHRoZSBleHRlbnQgYnV0IHRoaXMgc2NlbmFyaW8gd2FzIGRlZW1lZCBsZXNzIGNvbW1vbi4KKwkgKiAgLSBMMjogd2UgZG8gbm90IGRlYWwgd2l0aCB3cml0ZXMgY292ZXJpbmcgdGhlIHdob2xlIGV4dGVudC4KKwkgKiAgICBUaGlzIHdvdWxkIHJlcXVpcmUgcmVtb3ZpbmcgdGhlIGV4dGVudCBpZiB0aGUgdHJhbnNmZXIKKwkgKiAgICBpcyBwb3NzaWJsZS4KKwkgKiAgLSBMMzogd2Ugb25seSBhdHRlbXB0IHRvIG1lcmdlIHdpdGggYW4gZXh0ZW50IHN0b3JlZCBpbiB0aGUKKwkgKiAgICBzYW1lIGV4dGVudCB0cmVlIG5vZGUuCisJICovCisJaWYgKChtYXAtPm1fbGJsayA9PSBlZV9ibG9jaykgJiYJLypMMSovCisJCShtYXAtPm1fbGVuIDwgZWVfbGVuKSAmJgkvKkwyKi8KKwkJKGV4ID4gRVhUX0ZJUlNUX0VYVEVOVChlaCkpKSB7CS8qTDMqLworCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKnByZXZfZXg7CisJCWV4dDRfbGJsa190IHByZXZfbGJsazsKKwkJZXh0NF9mc2Jsa190IHByZXZfcGJsaywgZWVfcGJsazsKKwkJdW5zaWduZWQgaW50IHByZXZfbGVuLCB3cml0ZV9sZW47CisKKwkJcHJldl9leCA9IGV4IC0gMTsKKwkJcHJldl9sYmxrID0gbGUzMl90b19jcHUocHJldl9leC0+ZWVfYmxvY2spOworCQlwcmV2X2xlbiA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKHByZXZfZXgpOworCQlwcmV2X3BibGsgPSBleHQ0X2V4dF9wYmxvY2socHJldl9leCk7CisJCWVlX3BibGsgPSBleHQ0X2V4dF9wYmxvY2soZXgpOworCQl3cml0ZV9sZW4gPSBtYXAtPm1fbGVuOworCisJCS8qCisJCSAqIEEgdHJhbnNmZXIgb2YgYmxvY2tzIGZyb20gJ2V4JyB0byAncHJldl9leCcgaXMgYWxsb3dlZAorCQkgKiB1cG9uIHRob3NlIGNvbmRpdGlvbnM6CisJCSAqIC0gQzE6IHByZXZfZXggaXMgaW5pdGlhbGl6ZWQsCisJCSAqIC0gQzI6IHByZXZfZXggaXMgbG9naWNhbGx5IGFidXR0aW5nIGV4LAorCQkgKiAtIEMzOiBwcmV2X2V4IGlzIHBoeXNpY2FsbHkgYWJ1dHRpbmcgZXgsCisJCSAqIC0gQzQ6IHByZXZfZXggY2FuIHJlY2VpdmUgdGhlIGFkZGl0aW9uYWwgYmxvY2tzIHdpdGhvdXQKKwkJICogICBvdmVyZmxvd2luZyB0aGUgKGluaXRpYWxpemVkKSBsZW5ndGggbGltaXQuCisJCSAqLworCQlpZiAoKCFleHQ0X2V4dF9pc191bmluaXRpYWxpemVkKHByZXZfZXgpKSAmJgkJLypDMSovCisJCQkoKHByZXZfbGJsayArIHByZXZfbGVuKSA9PSBlZV9ibG9jaykgJiYJCS8qQzIqLworCQkJKChwcmV2X3BibGsgKyBwcmV2X2xlbikgPT0gZWVfcGJsaykgJiYJCS8qQzMqLworCQkJKHByZXZfbGVuIDwgKEVYVF9JTklUX01BWF9MRU4gLSB3cml0ZV9sZW4pKSkgewkvKkM0Ki8KKwkJCWVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGRlcHRoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisKKwkJCXRyYWNlX2V4dDRfZXh0X2NvbnZlcnRfdG9faW5pdGlhbGl6ZWRfZmFzdHBhdGgoaW5vZGUsCisJCQkJbWFwLCBleCwgcHJldl9leCk7CisKKwkJCS8qIFNoaWZ0IHRoZSBzdGFydCBvZiBleCBieSAnd3JpdGVfbGVuJyBibG9ja3MgKi8KKwkJCWV4LT5lZV9ibG9jayA9IGNwdV90b19sZTMyKGVlX2Jsb2NrICsgd3JpdGVfbGVuKTsKKwkJCWV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgZWVfcGJsayArIHdyaXRlX2xlbik7CisJCQlleC0+ZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gd3JpdGVfbGVuKTsKKwkJCWV4dDRfZXh0X21hcmtfdW5pbml0aWFsaXplZChleCk7IC8qIFJlc3RvcmUgdGhlIGZsYWcgKi8KKworCQkJLyogRXh0ZW5kIHByZXZfZXggYnkgJ3dyaXRlX2xlbicgYmxvY2tzICovCisJCQlwcmV2X2V4LT5lZV9sZW4gPSBjcHVfdG9fbGUxNihwcmV2X2xlbiArIHdyaXRlX2xlbik7CisKKwkJCS8qIE1hcmsgdGhlIGJsb2NrIGNvbnRhaW5pbmcgYm90aCBleHRlbnRzIGFzIGRpcnR5ICovCisJCQlleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworCisJCQkvKiBVcGRhdGUgcGF0aCB0byBwb2ludCB0byB0aGUgcmlnaHQgZXh0ZW50ICovCisJCQlwYXRoW2RlcHRoXS5wX2V4dCA9IHByZXZfZXg7CisKKwkJCS8qIFJlc3VsdDogbnVtYmVyIG9mIGluaXRpYWxpemVkIGJsb2NrcyBwYXN0IG1fbGJsayAqLworCQkJYWxsb2NhdGVkID0gd3JpdGVfbGVuOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKIAlXQVJOX09OKG1hcC0+bV9sYmxrIDwgZWVfYmxvY2spOwogCS8qCiAJICogSXQgaXMgc2FmZSB0byBjb252ZXJ0IGV4dGVudCB0byBpbml0aWFsaXplZCB2aWEgZXhwbGljaXQKQEAgLTMxNjUsNiArMzI1OCwxOTIgQEAKIAlyZXR1cm4gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogfQogCisvKioKKyAqIGV4dDRfZmluZF9kZWxhbGxvY19yYW5nZTogZmluZCBkZWxheWVkIGFsbG9jYXRlZCBibG9jayBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgKgorICogR29lcyB0aHJvdWdoIHRoZSBidWZmZXIgaGVhZHMgaW4gdGhlIHJhbmdlIFtsYmxrX3N0YXJ0LCBsYmxrX2VuZF0gYW5kIHJldHVybnMKKyAqIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBidWZmZXJzIG1hcmtlZCBmb3IgZGVsYXllZCBhbGxvY2F0aW9uLiBJdCByZXR1cm5zICcxJworICogb24gdGhlIGZpcnN0IGRlbGFsbG9jJ2VkIGJ1ZmZlciBoZWFkIGZvdW5kLiBJZiBubyBidWZmZXIgaGVhZCBpbiB0aGUgZ2l2ZW4KKyAqIHJhbmdlIGlzIG1hcmtlZCBmb3IgZGVsYWxsb2MsIGl0IHJldHVybnMgMC4KKyAqIGxibGtfc3RhcnQgc2hvdWxkIGFsd2F5cyBiZSA8PSBsYmxrX2VuZC4KKyAqIHNlYXJjaF9oaW50X3JldmVyc2UgaXMgdG8gaW5kaWNhdGUgdGhhdCBzZWFyY2hpbmcgaW4gcmV2ZXJzZSBmcm9tIGxibGtfZW5kIHRvCisgKiBsYmxrX3N0YXJ0IG1pZ2h0IGJlIG1vcmUgZWZmaWNpZW50IChpLmUuLCB3ZSB3aWxsIGxpa2VseSBoaXQgdGhlIGRlbGFsbG9jJ2VkCisgKiBibG9jayBzb29uZXIpLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJsb2NrcyBhcmUgdHJ1bmNhdGVkIHNlcXVlbnRpYWxseSBmcm9tCisgKiBsYmxrX3N0YXJ0IHRvd2FyZHMgbGJsa19lbmQuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9maW5kX2RlbGFsbG9jX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIGV4dDRfbGJsa190IGxibGtfc3RhcnQsCisJCQkJICAgIGV4dDRfbGJsa190IGxibGtfZW5kLAorCQkJCSAgICBpbnQgc2VhcmNoX2hpbnRfcmV2ZXJzZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmggPSBOVUxMOworCXN0cnVjdCBwYWdlICpwYWdlOworCWV4dDRfbGJsa190IGksIHBnX2xibGs7CisJcGdvZmZfdCBpbmRleDsKKworCS8qIHJldmVyc2Ugc2VhcmNoIHdvbnQgd29yayBpZiBmcyBibG9jayBzaXplIGlzIGxlc3MgdGhhbiBwYWdlIHNpemUgKi8KKwlpZiAoaW5vZGUtPmlfYmxrYml0cyA8IFBBR0VfQ0FDSEVfU0hJRlQpCisJCXNlYXJjaF9oaW50X3JldmVyc2UgPSAwOworCisJaWYgKHNlYXJjaF9oaW50X3JldmVyc2UpCisJCWkgPSBsYmxrX2VuZDsKKwllbHNlCisJCWkgPSBsYmxrX3N0YXJ0OworCisJaW5kZXggPSBpID4+IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisKKwl3aGlsZSAoKGkgPj0gbGJsa19zdGFydCkgJiYgKGkgPD0gbGJsa19lbmQpKSB7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwkJaWYgKCFwYWdlKQorCQkJZ290byBuZXh0cGFnZTsKKworCQlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCQlnb3RvIG5leHRwYWdlOworCisJCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCWlmICghaGVhZCkKKwkJCWdvdG8gbmV4dHBhZ2U7CisKKwkJYmggPSBoZWFkOworCQlwZ19sYmxrID0gaW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLQorCQkJCQkJaW5vZGUtPmlfYmxrYml0cyk7CisJCWRvIHsKKwkJCWlmICh1bmxpa2VseShwZ19sYmxrIDwgbGJsa19zdGFydCkpIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMgcG9zc2libGUgd2hlbiBmcyBibG9jayBzaXplIGlzIGxlc3MKKwkJCQkgKiB0aGFuIHBhZ2Ugc2l6ZSBhbmQgb3VyIGNsdXN0ZXIgc3RhcnRzL2VuZHMgaW4KKwkJCQkgKiBtaWRkbGUgb2YgdGhlIHBhZ2UuIFNvIHdlIG5lZWQgdG8gc2tpcCB0aGUKKwkJCQkgKiBpbml0aWFsIGZldyBibG9ja3MgdGlsbCB3ZSByZWFjaCB0aGUgJ2xibGsnCisJCQkJICovCisJCQkJcGdfbGJsaysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGlzIGRlbGF5ZWQgYWxsb2NhdGVkIGFuZCB0aGF0IGl0CisJCQkgKiBpcyBub3QgeWV0IG1hcHBlZC4gKHdoZW4gZGEtYnVmZmVycyBhcmUgbWFwcGVkIGR1cmluZworCQkJICogdGhlaXIgd3JpdGVvdXQsIHRoZWlyIGRhX21hcHBlZCBiaXQgaXMgc2V0LikKKwkJCSAqLworCQkJaWYgKGJ1ZmZlcl9kZWxheShiaCkgJiYgIWJ1ZmZlcl9kYV9tYXBwZWQoYmgpKSB7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCXRyYWNlX2V4dDRfZmluZF9kZWxhbGxvY19yYW5nZShpbm9kZSwKKwkJCQkJCWxibGtfc3RhcnQsIGxibGtfZW5kLAorCQkJCQkJc2VhcmNoX2hpbnRfcmV2ZXJzZSwKKwkJCQkJCTEsIGkpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJaWYgKHNlYXJjaF9oaW50X3JldmVyc2UpCisJCQkJaS0tOworCQkJZWxzZQorCQkJCWkrKzsKKwkJfSB3aGlsZSAoKGkgPj0gbGJsa19zdGFydCkgJiYgKGkgPD0gbGJsa19lbmQpICYmCisJCQkJKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCkpOworbmV4dHBhZ2U6CisJCWlmIChwYWdlKQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkvKgorCQkgKiBNb3ZlIHRvIG5leHQgcGFnZS4gJ2knIHdpbGwgYmUgdGhlIGZpcnN0IGxibGsgaW4gdGhlIG5leHQKKwkJICogcGFnZS4KKwkJICovCisJCWlmIChzZWFyY2hfaGludF9yZXZlcnNlKQorCQkJaW5kZXgtLTsKKwkJZWxzZQorCQkJaW5kZXgrKzsKKwkJaSA9IGluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJfQorCisJdHJhY2VfZXh0NF9maW5kX2RlbGFsbG9jX3JhbmdlKGlub2RlLCBsYmxrX3N0YXJ0LCBsYmxrX2VuZCwKKwkJCQkJc2VhcmNoX2hpbnRfcmV2ZXJzZSwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBleHQ0X2ZpbmRfZGVsYWxsb2NfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLAorCQkJICAgICAgIGludCBzZWFyY2hfaGludF9yZXZlcnNlKQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOworCWV4dDRfbGJsa190IGxibGtfc3RhcnQsIGxibGtfZW5kOworCWxibGtfc3RhcnQgPSBsYmxrICYgKH4oc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSAxKSk7CisJbGJsa19lbmQgPSBsYmxrX3N0YXJ0ICsgc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSAxOworCisJcmV0dXJuIGV4dDRfZmluZF9kZWxhbGxvY19yYW5nZShpbm9kZSwgbGJsa19zdGFydCwgbGJsa19lbmQsCisJCQkJCXNlYXJjaF9oaW50X3JldmVyc2UpOworfQorCisvKioKKyAqIERldGVybWluZXMgaG93IG1hbnkgY29tcGxldGUgY2x1c3RlcnMgKG91dCBvZiB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlICdtYXAnKQorICogYXJlIHVuZGVyIGRlbGFsbG9jIGFuZCB3ZXJlIHJlc2VydmVkIHF1b3RhIGZvci4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgYXJlIHdyaXRpbmcgb3V0IHRoZSBibG9ja3MgdGhhdCB3ZXJlCisgKiBvcmlnaW5hbGx5IHdyaXR0ZW4gd2l0aCB0aGVpciBhbGxvY2F0aW9uIGRlbGF5ZWQsIGJ1dCB0aGVuIHRoZSBzcGFjZSB3YXMKKyAqIGFsbG9jYXRlZCB1c2luZyBmYWxsb2NhdGUoKSBiZWZvcmUgdGhlIGRlbGF5ZWQgYWxsb2NhdGlvbiBjb3VsZCBiZSByZXNvbHZlZC4KKyAqIFRoZSBjYXNlcyB0byBsb29rIGZvciBhcmU6CisgKiAoJz0nIGluZGljYXRlZCBkZWxheWVkIGFsbG9jYXRlZCBibG9ja3MKKyAqICAnLScgaW5kaWNhdGVzIG5vbi1kZWxheWVkIGFsbG9jYXRlZCBibG9ja3MpCisgKiAoYSkgcGFydGlhbCBjbHVzdGVycyB0b3dhcmRzIGJlZ2lubmluZyBhbmQvb3IgZW5kIG91dHNpZGUgb2YgYWxsb2NhdGVkIHJhbmdlCisgKiAgICAgYXJlIG5vdCBkZWxhbGxvYydlZC4KKyAqCUV4OgorICoJfC0tLS1jLS0tPXw9PT09Yz09PT18PT09PWM9PT09fD09PS1jLS0tLXwKKyAqCSAgICAgICAgIHwrKysrKysgYWxsb2NhdGVkICsrKysrK3wKKyAqCT09PiA0IGNvbXBsZXRlIGNsdXN0ZXJzIGluIGFib3ZlIGV4YW1wbGUKKyAqCisgKiAoYikgcGFydGlhbCBjbHVzdGVyIChvdXRzaWRlIG9mIGFsbG9jYXRlZCByYW5nZSkgdG93YXJkcyBlaXRoZXIgZW5kIGlzCisgKiAgICAgbWFya2VkIGZvciBkZWxheWVkIGFsbG9jYXRpb24uIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCBleGNsdWRlIHRoYXQKKyAqICAgICBjbHVzdGVyLgorICoJRXg6CisgKgl8LS0tLT09PT1jPT09PT09PT18PT09PT09PT1jPT09PT09PT18CisgKgkgICAgIHwrKysrKysgYWxsb2NhdGVkICsrKysrK3wKKyAqCT09PiAxIGNvbXBsZXRlIGNsdXN0ZXJzIGluIGFib3ZlIGV4YW1wbGUKKyAqCisgKglFeDoKKyAqCXw9PT09PT09PT09PT09PT09Yz09PT09PT09PT09PT09PT18CisgKiAgICAgICAgICAgIHwrKysrKysgYWxsb2NhdGVkICsrKysrK3wKKyAqCT09PiAwIGNvbXBsZXRlIGNsdXN0ZXJzIGluIGFib3ZlIGV4YW1wbGUKKyAqCisgKiBUaGUgZXh0NF9kYV91cGRhdGVfcmVzZXJ2ZV9zcGFjZSB3aWxsIGJlIGNhbGxlZCBvbmx5IGlmIHdlCisgKiBkZXRlcm1pbmUgaGVyZSB0aGF0IHRoZXJlIHdlcmUgc29tZSAiZW50aXJlIiBjbHVzdGVycyB0aGF0IHNwYW4KKyAqIHRoaXMgJ2FsbG9jYXRlZCcgcmFuZ2UuCisgKiBJbiB0aGUgbm9uLWJpZ2FsbG9jIGNhc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCBqdXN0IGVuZCB1cCByZXR1cm5pbmcgbnVtX2Jsa3MKKyAqIHdpdGhvdXQgZXZlciBjYWxsaW5nIGV4dDRfZmluZF9kZWxhbGxvY19yYW5nZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZ2V0X3Jlc2VydmVkX2NsdXN0ZXJfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsa19zdGFydCwKKwkJCSAgIHVuc2lnbmVkIGludCBudW1fYmxrcykKK3sKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKTsKKwlleHQ0X2xibGtfdCBhbGxvY19jbHVzdGVyX3N0YXJ0LCBhbGxvY19jbHVzdGVyX2VuZDsKKwlleHQ0X2xibGtfdCBsYmxrX2Zyb20sIGxibGtfdG8sIGNfb2Zmc2V0OworCXVuc2lnbmVkIGludCBhbGxvY2F0ZWRfY2x1c3RlcnMgPSAwOworCisJYWxsb2NfY2x1c3Rlcl9zdGFydCA9IEVYVDRfQjJDKHNiaSwgbGJsa19zdGFydCk7CisJYWxsb2NfY2x1c3Rlcl9lbmQgPSBFWFQ0X0IyQyhzYmksIGxibGtfc3RhcnQgKyBudW1fYmxrcyAtIDEpOworCisJLyogbWF4IHBvc3NpYmxlIGNsdXN0ZXJzIGZvciB0aGlzIGFsbG9jYXRpb24gKi8KKwlhbGxvY2F0ZWRfY2x1c3RlcnMgPSBhbGxvY19jbHVzdGVyX2VuZCAtIGFsbG9jX2NsdXN0ZXJfc3RhcnQgKyAxOworCisJdHJhY2VfZXh0NF9nZXRfcmVzZXJ2ZWRfY2x1c3Rlcl9hbGxvYyhpbm9kZSwgbGJsa19zdGFydCwgbnVtX2Jsa3MpOworCisJLyogQ2hlY2sgdG93YXJkcyBsZWZ0IHNpZGUgKi8KKwljX29mZnNldCA9IGxibGtfc3RhcnQgJiAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSAxKTsKKwlpZiAoY19vZmZzZXQpIHsKKwkJbGJsa19mcm9tID0gbGJsa19zdGFydCAmICh+KHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSkpOworCQlsYmxrX3RvID0gbGJsa19mcm9tICsgY19vZmZzZXQgLSAxOworCisJCWlmIChleHQ0X2ZpbmRfZGVsYWxsb2NfcmFuZ2UoaW5vZGUsIGxibGtfZnJvbSwgbGJsa190bywgMCkpCisJCQlhbGxvY2F0ZWRfY2x1c3RlcnMtLTsKKwl9CisKKwkvKiBOb3cgY2hlY2sgdG93YXJkcyByaWdodC4gKi8KKwljX29mZnNldCA9IChsYmxrX3N0YXJ0ICsgbnVtX2Jsa3MpICYgKHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CisJaWYgKGFsbG9jYXRlZF9jbHVzdGVycyAmJiBjX29mZnNldCkgeworCQlsYmxrX2Zyb20gPSBsYmxrX3N0YXJ0ICsgbnVtX2Jsa3M7CisJCWxibGtfdG8gPSBsYmxrX2Zyb20gKyAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSBjX29mZnNldCkgLSAxOworCisJCWlmIChleHQ0X2ZpbmRfZGVsYWxsb2NfcmFuZ2UoaW5vZGUsIGxibGtfZnJvbSwgbGJsa190bywgMCkpCisJCQlhbGxvY2F0ZWRfY2x1c3RlcnMtLTsKKwl9CisKKwlyZXR1cm4gYWxsb2NhdGVkX2NsdXN0ZXJzOworfQorCiBzdGF0aWMgaW50CiBleHQ0X2V4dF9oYW5kbGVfdW5pbml0aWFsaXplZF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsCkBAIC0zMTgxLDYgKzM0NjAsOSBAQAogCQkgIGZsYWdzLCBhbGxvY2F0ZWQpOwogCWV4dDRfZXh0X3Nob3dfbGVhZihpbm9kZSwgcGF0aCk7CiAKKwl0cmFjZV9leHQ0X2V4dF9oYW5kbGVfdW5pbml0aWFsaXplZF9leHRlbnRzKGlub2RlLCBtYXAsIGFsbG9jYXRlZCwKKwkJCQkJCSAgICBuZXdibG9jayk7CisKIAkvKiBnZXRfYmxvY2soKSBiZWZvcmUgc3VibWl0IHRoZSBJTywgc3BsaXQgdGhlIGV4dGVudCAqLwogCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfUFJFX0lPKSkgewogCQlyZXQgPSBleHQ0X3NwbGl0X3Vud3JpdHRlbl9leHRlbnRzKGhhbmRsZSwgaW5vZGUsIG1hcCwKQEAgLTMxOTAsMTAgKzM0NzIsOSBAQAogCQkgKiB0aGF0IHRoaXMgSU8gbmVlZHMgdG8gY29udmVyc2lvbiB0byB3cml0dGVuIHdoZW4gSU8gaXMKIAkJICogY29tcGxldGVkCiAJCSAqLwotCQlpZiAoaW8gJiYgIShpby0+ZmxhZyAmIEVYVDRfSU9fRU5EX1VOV1JJVFRFTikpIHsKLQkJCWlvLT5mbGFnID0gRVhUNF9JT19FTkRfVU5XUklUVEVOOwotCQkJYXRvbWljX2luYygmRVhUNF9JKGlub2RlKS0+aV9haW9kaW9fdW53cml0dGVuKTsKLQkJfSBlbHNlCisJCWlmIChpbykKKwkJCWV4dDRfc2V0X2lvX3Vud3JpdHRlbl9mbGFnKGlub2RlLCBpbyk7CisJCWVsc2UKIAkJCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0RJT19VTldSSVRURU4pOwogCQlpZiAoZXh0NF9zaG91bGRfZGlvcmVhZF9ub2xvY2soaW5vZGUpKQogCQkJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX1VOSU5JVDsKQEAgLTMyMzQsMTQgKzM1MTUsOCBAQAogCiAJLyogYnVmZmVyZWQgd3JpdGUsIHdyaXRlcGFnZSB0aW1lLCBjb252ZXJ0Ki8KIAlyZXQgPSBleHQ0X2V4dF9jb252ZXJ0X3RvX2luaXRpYWxpemVkKGhhbmRsZSwgaW5vZGUsIG1hcCwgcGF0aCk7Ci0JaWYgKHJldCA+PSAwKSB7CisJaWYgKHJldCA+PSAwKQogCQlleHQ0X3VwZGF0ZV9pbm9kZV9mc3luY190cmFucyhoYW5kbGUsIGlub2RlLCAxKTsKLQkJZXJyID0gY2hlY2tfZW9mYmxvY2tzX2ZsKGhhbmRsZSwgaW5vZGUsIG1hcC0+bV9sYmxrLCBwYXRoLAotCQkJCQkgbWFwLT5tX2xlbik7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBvdXQyOwotCX0KLQogb3V0OgogCWlmIChyZXQgPD0gMCkgewogCQllcnIgPSByZXQ7CkBAIC0zMjcwLDExICszNTQ1LDI0IEBACiAJICogQnV0IGZhbGxvY2F0ZSB3b3VsZCBoYXZlIGFscmVhZHkgdXBkYXRlZCBxdW90YSBhbmQgYmxvY2sKIAkgKiBjb3VudCBmb3IgdGhpcyBvZmZzZXQuIFNvIGNhbmNlbCB0aGVzZSByZXNlcnZhdGlvbgogCSAqLwotCWlmIChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFKQotCQlleHQ0X2RhX3VwZGF0ZV9yZXNlcnZlX3NwYWNlKGlub2RlLCBhbGxvY2F0ZWQsIDApOworCWlmIChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFKSB7CisJCXVuc2lnbmVkIGludCByZXNlcnZlZF9jbHVzdGVyczsKKwkJcmVzZXJ2ZWRfY2x1c3RlcnMgPSBnZXRfcmVzZXJ2ZWRfY2x1c3Rlcl9hbGxvYyhpbm9kZSwKKwkJCQltYXAtPm1fbGJsaywgbWFwLT5tX2xlbik7CisJCWlmIChyZXNlcnZlZF9jbHVzdGVycykKKwkJCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsCisJCQkJCQkgICAgIHJlc2VydmVkX2NsdXN0ZXJzLAorCQkJCQkJICAgICAwKTsKKwl9CiAKIG1hcF9vdXQ6CiAJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX01BUFBFRDsKKwlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0tFRVBfU0laRSkgPT0gMCkgeworCQllcnIgPSBjaGVja19lb2ZibG9ja3NfZmwoaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssIHBhdGgsCisJCQkJCSBtYXAtPm1fbGVuKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDI7CisJfQogb3V0MToKIAlpZiAoYWxsb2NhdGVkID4gbWFwLT5tX2xlbikKIAkJYWxsb2NhdGVkID0gbWFwLT5tX2xlbjsKQEAgLTMyOTAsNiArMzU3OCwxMTEgQEAKIH0KIAogLyoKKyAqIGdldF9pbXBsaWVkX2NsdXN0ZXJfYWxsb2MgLSBjaGVjayB0byBzZWUgaWYgdGhlIHJlcXVlc3RlZAorICogYWxsb2NhdGlvbiAoaW4gdGhlIG1hcCBzdHJ1Y3R1cmUpIG92ZXJsYXBzIHdpdGggYSBjbHVzdGVyIGFscmVhZHkKKyAqIGFsbG9jYXRlZCBpbiBhbiBleHRlbnQuCisgKglAc2IJVGhlIGZpbGVzeXN0ZW0gc3VwZXJibG9jayBzdHJ1Y3R1cmUKKyAqCUBtYXAJVGhlIHJlcXVlc3RlZCBsYmxrLT5wYmxrIG1hcHBpbmcKKyAqCUBleAlUaGUgZXh0ZW50IHN0cnVjdHVyZSB3aGljaCBtaWdodCBjb250YWluIGFuIGltcGxpZWQKKyAqCQkJY2x1c3RlciBhbGxvY2F0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZXh0NF9leHRfbWFwX2Jsb2NrcygpIGFmdGVyIHdlIGZhaWxlZCB0bworICogZmluZCBibG9ja3MgdGhhdCB3ZXJlIGFscmVhZHkgaW4gdGhlIGlub2RlJ3MgZXh0ZW50IHRyZWUuICBIZW5jZSwKKyAqIHdlIGtub3cgdGhhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGNhbm5vdCBvdmVybGFwCisgKiB0aGUgZXh0ZW50IGZyb20gdGhlIGlub2RlJ3MgZXh0ZW50IHRyZWUuICBUaGVyZSBhcmUgdGhyZWUgY2FzZXMgd2UKKyAqIHdhbnQgdG8gY2F0Y2guICBUaGUgZmlyc3QgaXMgdGhpcyBjYXNlOgorICoKKyAqCQkgfC0tLSBjbHVzdGVyICMgTi0tfAorICogICAgfC0tLSBleHRlbnQgLS0tfAl8LS0tLSByZXF1ZXN0ZWQgcmVnaW9uIC0tLXwKKyAqCQkJfD09PT09PT09PT18CisgKgorICogVGhlIHNlY29uZCBjYXNlIHRoYXQgd2UgbmVlZCB0byB0ZXN0IGZvciBpcyB0aGlzIG9uZToKKyAqCisgKiAgIHwtLS0tLS0tLS0gY2x1c3RlciAjIE4gLS0tLS0tLS0tLS0tLS0tLXwKKyAqCSAgIHwtLS0gcmVxdWVzdGVkIHJlZ2lvbiAtLXwgICB8LS0tLS0tLSBleHRlbnQgLS0tLXwKKyAqCSAgIHw9PT09PT09PT09PT09PT09PT09PT09PXwKKyAqCisgKiBUaGUgdGhpcmQgY2FzZSBpcyB3aGVuIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGxpZXMgYmV0d2VlbiB0d28gZXh0ZW50cworICogd2l0aGluIHRoZSBzYW1lIGNsdXN0ZXI6CisgKiAgICAgICAgICB8LS0tLS0tLS0tLS0tLSBjbHVzdGVyICMgTi0tLS0tLS0tLS0tLS18CisgKiB8LS0tLS0gZXggLS0tLS18ICAgICAgICAgICAgICAgICAgfC0tLS0gZXhfcmlnaHQgLS0tLXwKKyAqICAgICAgICAgICAgICAgICAgfC0tLS0tLSByZXF1ZXN0ZWQgcmVnaW9uIC0tLS0tLXwKKyAqICAgICAgICAgICAgICAgICAgfD09PT09PT09PT09PT09PT18CisgKgorICogSW4gZWFjaCBvZiB0aGUgYWJvdmUgY2FzZXMsIHdlIG5lZWQgdG8gc2V0IHRoZSBtYXAtPm1fcGJsayBhbmQKKyAqIG1hcC0+bV9sZW4gc28gaXQgY29ycmVzcG9uZHMgdG8gdGhlIHJldHVybiB0aGUgZXh0ZW50IGxhYmVsbGVkIGFzCisgKiAifD09PT18IiBmcm9tIGNsdXN0ZXIgI04sIHNpbmNlIGl0IGlzIGFscmVhZHkgaW4gdXNlIGZvciBkYXRhIGluCisgKiBjbHVzdGVyIEVYVDRfQjJDKHNiaSwgbWFwLT5tX2xibGspLglXZSB3aWxsIHRoZW4gcmV0dXJuIDEgdG8KKyAqIHNpZ25hbCB0byBleHQ0X2V4dF9tYXBfYmxvY2tzKCkgdGhhdCBtYXAtPm1fcGJsayBzaG91bGQgYmUgdHJlYXRlZAorICogYXMgYSBuZXcgImFsbG9jYXRlZCIgYmxvY2sgcmVnaW9uLiAgT3RoZXJ3aXNlLCB3ZSB3aWxsIHJldHVybiAwIGFuZAorICogZXh0NF9leHRfbWFwX2Jsb2NrcygpIHdpbGwgdGhlbiBhbGxvY2F0ZSBvbmUgb3IgbW9yZSBuZXcgY2x1c3RlcnMKKyAqIGJ5IGNhbGxpbmcgZXh0NF9tYl9uZXdfYmxvY2tzKCkuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2ltcGxpZWRfY2x1c3Rlcl9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAorCQkJCSAgICAgc3RydWN0IGV4dDRfZXh0ZW50ICpleCwKKwkJCQkgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCWV4dDRfbGJsa190IGNfb2Zmc2V0ID0gbWFwLT5tX2xibGsgJiAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8tMSk7CisJZXh0NF9sYmxrX3QgZXhfY2x1c3Rlcl9zdGFydCwgZXhfY2x1c3Rlcl9lbmQ7CisJZXh0NF9sYmxrX3QgcnJfY2x1c3Rlcl9zdGFydCwgcnJfY2x1c3Rlcl9lbmQ7CisJZXh0NF9sYmxrX3QgZWVfYmxvY2sgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOworCWV4dDRfZnNibGtfdCBlZV9zdGFydCA9IGV4dDRfZXh0X3BibG9jayhleCk7CisJdW5zaWduZWQgc2hvcnQgZWVfbGVuID0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpOworCisJLyogVGhlIGV4dGVudCBwYXNzZWQgaW4gdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIG1hdGNoICovCisJZXhfY2x1c3Rlcl9zdGFydCA9IEVYVDRfQjJDKHNiaSwgZWVfYmxvY2spOworCWV4X2NsdXN0ZXJfZW5kID0gRVhUNF9CMkMoc2JpLCBlZV9ibG9jayArIGVlX2xlbiAtIDEpOworCisJLyogVGhlIHJlcXVlc3RlZCByZWdpb24gcGFzc2VkIGludG8gZXh0NF9tYXBfYmxvY2tzKCkgKi8KKwlycl9jbHVzdGVyX3N0YXJ0ID0gRVhUNF9CMkMoc2JpLCBtYXAtPm1fbGJsayk7CisJcnJfY2x1c3Rlcl9lbmQgPSBFWFQ0X0IyQyhzYmksIG1hcC0+bV9sYmxrICsgbWFwLT5tX2xlbiAtIDEpOworCisJaWYgKChycl9jbHVzdGVyX3N0YXJ0ID09IGV4X2NsdXN0ZXJfZW5kKSB8fAorCSAgICAocnJfY2x1c3Rlcl9zdGFydCA9PSBleF9jbHVzdGVyX3N0YXJ0KSkgeworCQlpZiAocnJfY2x1c3Rlcl9zdGFydCA9PSBleF9jbHVzdGVyX2VuZCkKKwkJCWVlX3N0YXJ0ICs9IGVlX2xlbiAtIDE7CisJCW1hcC0+bV9wYmxrID0gKGVlX3N0YXJ0ICYgfihzYmktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpKSArCisJCQljX29mZnNldDsKKwkJbWFwLT5tX2xlbiA9IG1pbihtYXAtPm1fbGVuLAorCQkJCSAodW5zaWduZWQpIHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gY19vZmZzZXQpOworCQkvKgorCQkgKiBDaGVjayBmb3IgYW5kIGhhbmRsZSB0aGlzIGNhc2U6CisJCSAqCisJCSAqICAgfC0tLS0tLS0tLSBjbHVzdGVyICMgTi0tLS0tLS0tLS0tLS18CisJCSAqCQkgICAgICAgfC0tLS0tLS0gZXh0ZW50IC0tLS18CisJCSAqCSAgIHwtLS0gcmVxdWVzdGVkIHJlZ2lvbiAtLS18CisJCSAqCSAgIHw9PT09PT09PT09PXwKKwkJICovCisKKwkJaWYgKG1hcC0+bV9sYmxrIDwgZWVfYmxvY2spCisJCQltYXAtPm1fbGVuID0gbWluKG1hcC0+bV9sZW4sIGVlX2Jsb2NrIC0gbWFwLT5tX2xibGspOworCisJCS8qCisJCSAqIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgYWxsb2NhdGVkCisJCSAqIGJsb2NrIHRvIHRoZSByaWdodCBvZiAnZXgnIGJ1dCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgY2x1c3Rlci4KKwkJICoKKwkJICogICAgICAgICAgfC0tLS0tLS0tLS0tLS0gY2x1c3RlciAjIE4tLS0tLS0tLS0tLS0tfAorCQkgKiB8LS0tLS0gZXggLS0tLS18ICAgICAgICAgICAgICAgICAgfC0tLS0gZXhfcmlnaHQgLS0tLXwKKwkJICogICAgICAgICAgICAgICAgICB8LS0tLS0tIHJlcXVlc3RlZCByZWdpb24gLS0tLS0tfAorCQkgKiAgICAgICAgICAgICAgICAgIHw9PT09PT09PT09PT09PT09fAorCQkgKi8KKwkJaWYgKG1hcC0+bV9sYmxrID4gZWVfYmxvY2spIHsKKwkJCWV4dDRfbGJsa190IG5leHQgPSBleHQ0X2V4dF9uZXh0X2FsbG9jYXRlZF9ibG9jayhwYXRoKTsKKwkJCW1hcC0+bV9sZW4gPSBtaW4obWFwLT5tX2xlbiwgbmV4dCAtIG1hcC0+bV9sYmxrKTsKKwkJfQorCisJCXRyYWNlX2V4dDRfZ2V0X2ltcGxpZWRfY2x1c3Rlcl9hbGxvY19leGl0KHNiLCBtYXAsIDEpOworCQlyZXR1cm4gMTsKKwl9CisKKwl0cmFjZV9leHQ0X2dldF9pbXBsaWVkX2NsdXN0ZXJfYWxsb2NfZXhpdChzYiwgbWFwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgogICogQmxvY2sgYWxsb2NhdGlvbi9tYXAvcHJlYWxsb2NhdGlvbiByb3V0aW5lIGZvciBleHRlbnRzIGJhc2VkIGZpbGVzCiAgKgogICoKQEAgLTMzMTEsMTUgKzM3MDQsMTcgQEAKIAkJCXN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCwgaW50IGZsYWdzKQogewogCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXgsICpleDsKKwlzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXgsICpleCwgKmV4MjsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKTsKIAlleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwOwotCWludCBlcnIgPSAwLCBkZXB0aCwgcmV0OwotCXVuc2lnbmVkIGludCBhbGxvY2F0ZWQgPSAwOworCWludCBmcmVlX29uX2VyciA9IDAsIGVyciA9IDAsIGRlcHRoLCByZXQ7CisJdW5zaWduZWQgaW50IGFsbG9jYXRlZCA9IDAsIG9mZnNldCA9IDA7CisJdW5zaWduZWQgaW50IGFsbG9jYXRlZF9jbHVzdGVycyA9IDA7CiAJdW5zaWduZWQgaW50IHB1bmNoZWRfb3V0ID0gMDsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7CiAJZXh0NF9pb19lbmRfdCAqaW8gPSBFWFQ0X0koaW5vZGUpLT5jdXJfYWlvX2RpbzsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIHB1bmNoX21hcDsKKwlleHQ0X2xibGtfdCBjbHVzdGVyX29mZnNldDsKIAogCWV4dF9kZWJ1ZygiYmxvY2tzICV1LyV1IHJlcXVlc3RlZCBmb3IgaW5vZGUgJWx1XG4iLAogCQkgIG1hcC0+bV9sYmxrLCBtYXAtPm1fbGVuLCBpbm9kZS0+aV9pbm8pOwpAQCAtMzMyOSw2ICszNzI0LDEwIEBACiAJaWYgKCEoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfUFVOQ0hfT1VUX0VYVCkgJiYKIAkJZXh0NF9leHRfaW5fY2FjaGUoaW5vZGUsIG1hcC0+bV9sYmxrLCAmbmV3ZXgpKSB7CiAJCWlmICghbmV3ZXguZWVfc3RhcnRfbG8gJiYgIW5ld2V4LmVlX3N0YXJ0X2hpKSB7CisJCQlpZiAoKHNiaS0+c19jbHVzdGVyX3JhdGlvID4gMSkgJiYKKwkJCSAgICBleHQ0X2ZpbmRfZGVsYWxsb2NfY2x1c3Rlcihpbm9kZSwgbWFwLT5tX2xibGssIDApKQorCQkJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9GUk9NX0NMVVNURVI7CisKIAkJCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwKSB7CiAJCQkJLyoKIAkJCQkgKiBibG9jayBpc24ndCBhbGxvY2F0ZWQgeWV0IGFuZApAQCAtMzMzOSw2ICszNzM4LDggQEAKIAkJCS8qIHdlIHNob3VsZCBhbGxvY2F0ZSByZXF1ZXN0ZWQgYmxvY2sgKi8KIAkJfSBlbHNlIHsKIAkJCS8qIGJsb2NrIGlzIGFscmVhZHkgYWxsb2NhdGVkICovCisJCQlpZiAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8gPiAxKQorCQkJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9GUk9NX0NMVVNURVI7CiAJCQluZXdibG9jayA9IG1hcC0+bV9sYmxrCiAJCQkJICAgLSBsZTMyX3RvX2NwdShuZXdleC5lZV9ibG9jaykKIAkJCQkgICArIGV4dDRfZXh0X3BibG9jaygmbmV3ZXgpOwpAQCAtMzM4NCw4ICszNzg1LDE0IEBACiAJCSAqIHdlIHNwbGl0IG91dCBpbml0aWFsaXplZCBwb3J0aW9ucyBkdXJpbmcgYSB3cml0ZS4KIAkJICovCiAJCWVlX2xlbiA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKKworCQl0cmFjZV9leHQ0X2V4dF9zaG93X2V4dGVudChpbm9kZSwgZWVfYmxvY2ssIGVlX3N0YXJ0LCBlZV9sZW4pOworCiAJCS8qIGlmIGZvdW5kIGV4dGVudCBjb3ZlcnMgYmxvY2ssIHNpbXBseSByZXR1cm4gaXQgKi8KIAkJaWYgKGluX3JhbmdlKG1hcC0+bV9sYmxrLCBlZV9ibG9jaywgZWVfbGVuKSkgeworCQkJc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBwdW5jaF9tYXA7CisJCQlleHQ0X2ZzYmxrX3QgcGFydGlhbF9jbHVzdGVyID0gMDsKKwogCQkJbmV3YmxvY2sgPSBtYXAtPm1fbGJsayAtIGVlX2Jsb2NrICsgZWVfc3RhcnQ7CiAJCQkvKiBudW1iZXIgb2YgcmVtYWluaW5nIGJsb2NrcyBpbiB0aGUgZXh0ZW50ICovCiAJCQlhbGxvY2F0ZWQgPSBlZV9sZW4gLSAobWFwLT5tX2xibGsgLSBlZV9ibG9jayk7CkBAIC0zNDY5LDcgKzM4NzYsOCBAQAogCQkJZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShpbm9kZSk7CiAKIAkJCWVyciA9IGV4dDRfZXh0X3JtX2xlYWYoaGFuZGxlLCBpbm9kZSwgcGF0aCwKLQkJCQltYXAtPm1fbGJsaywgbWFwLT5tX2xibGsgKyBwdW5jaGVkX291dCk7CisJCQkJCSAgICAgICAmcGFydGlhbF9jbHVzdGVyLCBtYXAtPm1fbGJsaywKKwkJCQkJICAgICAgIG1hcC0+bV9sYmxrICsgcHVuY2hlZF9vdXQpOwogCiAJCQlpZiAoIWVyciAmJiBwYXRoLT5wX2hkci0+ZWhfZW50cmllcyA9PSAwKSB7CiAJCQkJLyoKQEAgLTM0OTIsNiArMzkwMCwxMCBAQAogCQl9CiAJfQogCisJaWYgKChzYmktPnNfY2x1c3Rlcl9yYXRpbyA+IDEpICYmCisJICAgIGV4dDRfZmluZF9kZWxhbGxvY19jbHVzdGVyKGlub2RlLCBtYXAtPm1fbGJsaywgMCkpCisJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9GUk9NX0NMVVNURVI7CisKIAkvKgogCSAqIHJlcXVlc3RlZCBibG9jayBpc24ndCBhbGxvY2F0ZWQgeWV0OwogCSAqIHdlIGNvdWxkbid0IHRyeSB0byBjcmVhdGUgYmxvY2sgaWYgY3JlYXRlIGZsYWcgaXMgemVybwpAQCAtMzUwNCw5ICszOTE2LDI1IEBACiAJCWV4dDRfZXh0X3B1dF9nYXBfaW5fY2FjaGUoaW5vZGUsIHBhdGgsIG1hcC0+bV9sYmxrKTsKIAkJZ290byBvdXQyOwogCX0KKwogCS8qCiAJICogT2theSwgd2UgbmVlZCB0byBkbyBibG9jayBhbGxvY2F0aW9uLgogCSAqLworCW1hcC0+bV9mbGFncyAmPSB+RVhUNF9NQVBfRlJPTV9DTFVTVEVSOworCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobWFwLT5tX2xibGspOworCWNsdXN0ZXJfb2Zmc2V0ID0gbWFwLT5tX2xibGsgJiAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8tMSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBiaWdhbGxvYywgY2hlY2sgdG8gc2VlIGlmIHRoZSBleHRlbnQgcmV0dXJuZWQKKwkgKiBieSBleHQ0X2V4dF9maW5kX2V4dGVudCgpIGltcGxpZXMgYSBjbHVzdGVyIHdlIGNhbiB1c2UuCisJICovCisJaWYgKGNsdXN0ZXJfb2Zmc2V0ICYmIGV4ICYmCisJICAgIGdldF9pbXBsaWVkX2NsdXN0ZXJfYWxsb2MoaW5vZGUtPmlfc2IsIG1hcCwgZXgsIHBhdGgpKSB7CisJCWFyLmxlbiA9IGFsbG9jYXRlZCA9IG1hcC0+bV9sZW47CisJCW5ld2Jsb2NrID0gbWFwLT5tX3BibGs7CisJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9GUk9NX0NMVVNURVI7CisJCWdvdG8gZ290X2FsbG9jYXRlZF9ibG9ja3M7CisJfQogCiAJLyogZmluZCBuZWlnaGJvdXIgYWxsb2NhdGVkIGJsb2NrcyAqLwogCWFyLmxsZWZ0ID0gbWFwLT5tX2xibGs7CkBAIC0zNTE0LDEwICszOTQyLDIxIEBACiAJaWYgKGVycikKIAkJZ290byBvdXQyOwogCWFyLmxyaWdodCA9IG1hcC0+bV9sYmxrOwotCWVyciA9IGV4dDRfZXh0X3NlYXJjaF9yaWdodChpbm9kZSwgcGF0aCwgJmFyLmxyaWdodCwgJmFyLnByaWdodCk7CisJZXgyID0gTlVMTDsKKwllcnIgPSBleHQ0X2V4dF9zZWFyY2hfcmlnaHQoaW5vZGUsIHBhdGgsICZhci5scmlnaHQsICZhci5wcmlnaHQsICZleDIpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0MjsKIAorCS8qIENoZWNrIGlmIHRoZSBleHRlbnQgYWZ0ZXIgc2VhcmNoaW5nIHRvIHRoZSByaWdodCBpbXBsaWVzIGEKKwkgKiBjbHVzdGVyIHdlIGNhbiB1c2UuICovCisJaWYgKChzYmktPnNfY2x1c3Rlcl9yYXRpbyA+IDEpICYmIGV4MiAmJgorCSAgICBnZXRfaW1wbGllZF9jbHVzdGVyX2FsbG9jKGlub2RlLT5pX3NiLCBtYXAsIGV4MiwgcGF0aCkpIHsKKwkJYXIubGVuID0gYWxsb2NhdGVkID0gbWFwLT5tX2xlbjsKKwkJbmV3YmxvY2sgPSBtYXAtPm1fcGJsazsKKwkJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX0ZST01fQ0xVU1RFUjsKKwkJZ290byBnb3RfYWxsb2NhdGVkX2Jsb2NrczsKKwl9CisKIAkvKgogCSAqIFNlZSBpZiByZXF1ZXN0IGlzIGJleW9uZCBtYXhpbXVtIG51bWJlciBvZiBibG9ja3Mgd2UgY2FuIGhhdmUgaW4KIAkgKiBhIHNpbmdsZSBleHRlbnQuIEZvciBhbiBpbml0aWFsaXplZCBleHRlbnQgdGhpcyBsaW1pdCBpcwpAQCAtMzUzMiw5ICszOTcxLDggQEAKIAkJbWFwLT5tX2xlbiA9IEVYVF9VTklOSVRfTUFYX0xFTjsKIAogCS8qIENoZWNrIGlmIHdlIGNhbiByZWFsbHkgaW5zZXJ0IChtX2xibGspOjoobV9sYmxrICsgbV9sZW4pIGV4dGVudCAqLwotCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobWFwLT5tX2xibGspOwogCW5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KG1hcC0+bV9sZW4pOwotCWVyciA9IGV4dDRfZXh0X2NoZWNrX292ZXJsYXAoaW5vZGUsICZuZXdleCwgcGF0aCk7CisJZXJyID0gZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzYmksIGlub2RlLCAmbmV3ZXgsIHBhdGgpOwogCWlmIChlcnIpCiAJCWFsbG9jYXRlZCA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKCZuZXdleCk7CiAJZWxzZQpAQCAtMzU0NCw3ICszOTgyLDE4IEBACiAJYXIuaW5vZGUgPSBpbm9kZTsKIAlhci5nb2FsID0gZXh0NF9leHRfZmluZF9nb2FsKGlub2RlLCBwYXRoLCBtYXAtPm1fbGJsayk7CiAJYXIubG9naWNhbCA9IG1hcC0+bV9sYmxrOwotCWFyLmxlbiA9IGFsbG9jYXRlZDsKKwkvKgorCSAqIFdlIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2x1c3RlcgorCSAqIGZvciB0aGUgbG9naWNhbCBibG9jayBudW1iZXIsIHNpbmNlIHdoZW4gd2UgYWxsb2NhdGUgYQorCSAqIHBoeXNpY2FsIGNsdXN0ZXIsIHRoZSBwaHlzaWNhbCBibG9jayBzaG91bGQgc3RhcnQgYXQgdGhlCisJICogc2FtZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbHVzdGVyLiAgVGhpcyBpcworCSAqIG5lZWRlZCBzbyB0aGF0IGZ1dHVyZSBjYWxscyB0byBnZXRfaW1wbGllZF9jbHVzdGVyX2FsbG9jKCkKKwkgKiB3b3JrIGNvcnJlY3RseS4KKwkgKi8KKwlvZmZzZXQgPSBtYXAtPm1fbGJsayAmIChzYmktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpOworCWFyLmxlbiA9IEVYVDRfTlVNX0IyQyhzYmksIG9mZnNldCthbGxvY2F0ZWQpOworCWFyLmdvYWwgLT0gb2Zmc2V0OworCWFyLmxvZ2ljYWwgLT0gb2Zmc2V0OwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBOwogCWVsc2UKQEAgLTM1NTcsOSArNDAwNiwxNSBAQAogCQlnb3RvIG91dDI7CiAJZXh0X2RlYnVnKCJhbGxvY2F0ZSBuZXcgYmxvY2s6IGdvYWwgJWxsdSwgZm91bmQgJWxsdS8ldVxuIiwKIAkJICBhci5nb2FsLCBuZXdibG9jaywgYWxsb2NhdGVkKTsKKwlmcmVlX29uX2VyciA9IDE7CisJYWxsb2NhdGVkX2NsdXN0ZXJzID0gYXIubGVuOworCWFyLmxlbiA9IEVYVDRfQzJCKHNiaSwgYXIubGVuKSAtIG9mZnNldDsKKwlpZiAoYXIubGVuID4gYWxsb2NhdGVkKQorCQlhci5sZW4gPSBhbGxvY2F0ZWQ7CiAKK2dvdF9hbGxvY2F0ZWRfYmxvY2tzOgogCS8qIHRyeSB0byBpbnNlcnQgbmV3IGV4dGVudCBpbnRvIGZvdW5kIGxlYWYgYW5kIHJldHVybiAqLwotCWV4dDRfZXh0X3N0b3JlX3BibG9jaygmbmV3ZXgsIG5ld2Jsb2NrKTsKKwlleHQ0X2V4dF9zdG9yZV9wYmxvY2soJm5ld2V4LCBuZXdibG9jayArIG9mZnNldCk7CiAJbmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYoYXIubGVuKTsKIAkvKiBNYXJrIHVuaW5pdGlhbGl6ZWQgKi8KIAlpZiAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfVU5JTklUX0VYVCl7CkBAIC0zNTcyLDEwICs0MDI3LDkgQEAKIAkJICogdGhhdCB3ZSBuZWVkIHRvIHBlcmZvcm0gY29udmVyc2lvbiB3aGVuIElPIGlzIGRvbmUuCiAJCSAqLwogCQlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX1BSRV9JTykpIHsKLQkJCWlmIChpbyAmJiAhKGlvLT5mbGFnICYgRVhUNF9JT19FTkRfVU5XUklUVEVOKSkgewotCQkJCWlvLT5mbGFnID0gRVhUNF9JT19FTkRfVU5XUklUVEVOOwotCQkJCWF0b21pY19pbmMoJkVYVDRfSShpbm9kZSktPmlfYWlvZGlvX3Vud3JpdHRlbik7Ci0JCQl9IGVsc2UKKwkJCWlmIChpbykKKwkJCQlleHQ0X3NldF9pb191bndyaXR0ZW5fZmxhZyhpbm9kZSwgaW8pOworCQkJZWxzZQogCQkJCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLAogCQkJCQkJICAgICBFWFQ0X1NUQVRFX0RJT19VTldSSVRURU4pOwogCQl9CkBAIC0zNTgzLDExICs0MDM3LDE0IEBACiAJCQltYXAtPm1fZmxhZ3MgfD0gRVhUNF9NQVBfVU5JTklUOwogCX0KIAotCWVyciA9IGNoZWNrX2VvZmJsb2Nrc19mbChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywgcGF0aCwgYXIubGVuKTsKKwllcnIgPSAwOworCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfS0VFUF9TSVpFKSA9PSAwKQorCQllcnIgPSBjaGVja19lb2ZibG9ja3NfZmwoaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssCisJCQkJCSBwYXRoLCBhci5sZW4pOwogCWlmICghZXJyKQogCQllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsCiAJCQkJCSAgICAgJm5ld2V4LCBmbGFncyk7Ci0JaWYgKGVycikgeworCWlmIChlcnIgJiYgZnJlZV9vbl9lcnIpIHsKIAkJaW50IGZiX2ZsYWdzID0gZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSA/CiAJCQlFWFQ0X0ZSRUVfQkxPQ0tTX05PX1FVT1RfVVBEQVRFIDogMDsKIAkJLyogZnJlZSBkYXRhIGJsb2NrcyB3ZSBqdXN0IGFsbG9jYXRlZCAqLwpAQCAtMzYxMCw4ICs0MDY3LDgyIEBACiAJICogVXBkYXRlIHJlc2VydmVkIGJsb2Nrcy9tZXRhZGF0YSBibG9ja3MgYWZ0ZXIgc3VjY2Vzc2Z1bAogCSAqIGJsb2NrIGFsbG9jYXRpb24gd2hpY2ggaGFkIGJlZW4gZGVmZXJyZWQgdGlsbCBub3cuCiAJICovCi0JaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpCi0JCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIGFsbG9jYXRlZCwgMSk7CisJaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpIHsKKwkJdW5zaWduZWQgaW50IHJlc2VydmVkX2NsdXN0ZXJzOworCQkvKgorCQkgKiBDaGVjayBob3cgbWFueSBjbHVzdGVycyB3ZSBoYWQgcmVzZXJ2ZWQgdGhpcyBhbGxvY2F0ZWQgcmFuZ2UKKwkJICovCisJCXJlc2VydmVkX2NsdXN0ZXJzID0gZ2V0X3Jlc2VydmVkX2NsdXN0ZXJfYWxsb2MoaW5vZGUsCisJCQkJCQltYXAtPm1fbGJsaywgYWxsb2NhdGVkKTsKKwkJaWYgKG1hcC0+bV9mbGFncyAmIEVYVDRfTUFQX0ZST01fQ0xVU1RFUikgeworCQkJaWYgKHJlc2VydmVkX2NsdXN0ZXJzKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBoYXZlIGNsdXN0ZXJzIHJlc2VydmVkIGZvciB0aGlzIHJhbmdlLgorCQkJCSAqIEJ1dCBzaW5jZSB3ZSBhcmUgbm90IGRvaW5nIGFjdHVhbCBhbGxvY2F0aW9uCisJCQkJICogYW5kIGFyZSBzaW1wbHkgdXNpbmcgYmxvY2tzIGZyb20gcHJldmlvdXNseQorCQkJCSAqIGFsbG9jYXRlZCBjbHVzdGVyLCB3ZSBzaG91bGQgcmVsZWFzZSB0aGUKKwkJCQkgKiByZXNlcnZhdGlvbiBhbmQgbm90IGNsYWltIHF1b3RhLgorCQkJCSAqLworCQkJCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsCisJCQkJCQlyZXNlcnZlZF9jbHVzdGVycywgMCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlCVUdfT04oYWxsb2NhdGVkX2NsdXN0ZXJzIDwgcmVzZXJ2ZWRfY2x1c3RlcnMpOworCQkJLyogV2Ugd2lsbCBjbGFpbSBxdW90YSBmb3IgYWxsIG5ld2x5IGFsbG9jYXRlZCBibG9ja3MuKi8KKwkJCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIGFsbG9jYXRlZF9jbHVzdGVycywKKwkJCQkJCQkxKTsKKwkJCWlmIChyZXNlcnZlZF9jbHVzdGVycyA8IGFsbG9jYXRlZF9jbHVzdGVycykgeworCQkJCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwkJCQlpbnQgcmVzZXJ2YXRpb24gPSBhbGxvY2F0ZWRfY2x1c3RlcnMgLQorCQkJCQkJICByZXNlcnZlZF9jbHVzdGVyczsKKwkJCQkvKgorCQkJCSAqIEl0IHNlZW1zIHdlIGNsYWltZWQgZmV3IGNsdXN0ZXJzIG91dHNpZGUgb2YKKwkJCQkgKiB0aGUgcmFuZ2Ugb2YgdGhpcyBhbGxvY2F0aW9uLiBXZSBzaG91bGQgZ2l2ZQorCQkJCSAqIGl0IGJhY2sgdG8gdGhlIHJlc2VydmF0aW9uIHBvb2wuIFRoaXMgY2FuCisJCQkJICogaGFwcGVuIGluIHRoZSBmb2xsb3dpbmcgY2FzZToKKwkJCQkgKgorCQkJCSAqICogU3VwcG9zZSBzX2NsdXN0ZXJfcmF0aW8gaXMgNCAoaS5lLiwgZWFjaAorCQkJCSAqICAgY2x1c3RlciBoYXMgNCBibG9ja3MuIFRodXMsIHRoZSBjbHVzdGVycworCQkJCSAqICAgYXJlIFswLTNdLFs0LTddLFs4LTExXS4uLgorCQkJCSAqICogRmlyc3QgY29tZXMgZGVsYXllZCBhbGxvY2F0aW9uIHdyaXRlIGZvcgorCQkJCSAqICAgbG9naWNhbCBibG9ja3MgMTAgJiAxMS4gU2luY2UgdGhlcmUgd2VyZSBubworCQkJCSAqICAgcHJldmlvdXMgZGVsYXllZCBhbGxvY2F0ZWQgYmxvY2tzIGluIHRoZQorCQkJCSAqICAgcmFuZ2UgWzgtMTFdLCB3ZSB3b3VsZCByZXNlcnZlIDEgY2x1c3RlcgorCQkJCSAqICAgZm9yIHRoaXMgd3JpdGUuCisJCQkJICogKiBOZXh0IGNvbWVzIHdyaXRlIGZvciBsb2dpY2FsIGJsb2NrcyAzIHRvIDguCisJCQkJICogICBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgcmVzZXJ2ZSAyIGNsdXN0ZXJzCisJCQkJICogICAoZm9yIFswLTNdIGFuZCBbNC03XTsgYW5kIG5vdCBmb3IgWzgtMTFdIGFzCisJCQkJICogICB0aGF0IHJhbmdlIGhhcyBhIGRlbGF5ZWQgYWxsb2NhdGVkIGJsb2Nrcy4KKwkJCQkgKiAgIFRodXMgdG90YWwgcmVzZXJ2ZWQgY2x1c3RlcnMgbm93IGJlY29tZXMgMy4KKwkJCQkgKiAqIE5vdywgZHVyaW5nIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gd3JpdGVvdXQKKwkJCQkgKiAgIHRpbWUsIHdlIHdpbGwgZmlyc3Qgd3JpdGUgYmxvY2tzIFszLThdIGFuZAorCQkJCSAqICAgYWxsb2NhdGUgMyBjbHVzdGVycyBmb3Igd3JpdGluZyB0aGVzZQorCQkJCSAqICAgYmxvY2tzLiBBbHNvLCB3ZSB3b3VsZCBjbGFpbSBhbGwgdGhlc2UKKwkJCQkgKiAgIHRocmVlIGNsdXN0ZXJzIGFib3ZlLgorCQkJCSAqICogTm93IHdoZW4gd2UgY29tZSBoZXJlIHRvIHdyaXRlb3V0IHRoZQorCQkJCSAqICAgYmxvY2tzIFsxMC0xMV0sIHdlIHdvdWxkIGV4cGVjdCB0byBjbGFpbQorCQkJCSAqICAgdGhlIHJlc2VydmF0aW9uIG9mIDEgY2x1c3RlciB3ZSBoYWQgbWFkZQorCQkJCSAqICAgKGFuZCB3ZSB3b3VsZCBjbGFpbSBpdCBzaW5jZSB0aGVyZSBhcmUgbm8KKwkJCQkgKiAgIG1vcmUgZGVsYXllZCBhbGxvY2F0ZWQgYmxvY2tzIGluIHRoZSByYW5nZQorCQkJCSAqICAgWzgtMTFdLiBCdXQgb3VyIHJlc2VydmVkIGNsdXN0ZXIgY291bnQgaGFkCisJCQkJICogICBhbHJlYWR5IGdvbmUgdG8gMC4KKwkJCQkgKgorCQkJCSAqICAgVGh1cywgYXQgdGhlIHN0ZXAgNCBhYm92ZSB3aGVuIHdlIGRldGVybWluZQorCQkJCSAqICAgdGhhdCB0aGVyZSBhcmUgc3RpbGwgc29tZSB1bndyaXR0ZW4gZGVsYXllZAorCQkJCSAqICAgYWxsb2NhdGVkIGJsb2NrcyBvdXRzaWRlIG9mIG91ciBjdXJyZW50CisJCQkJICogICBibG9jayByYW5nZSwgd2Ugc2hvdWxkIGluY3JlbWVudCB0aGUKKwkJCQkgKiAgIHJlc2VydmVkIGNsdXN0ZXJzIGNvdW50IHNvIHRoYXQgd2hlbiB0aGUKKwkJCQkgKiAgIHJlbWFpbmluZyBibG9ja3MgZmluYWxseSBnZXRzIHdyaXR0ZW4sIHdlCisJCQkJICogICBjb3VsZCBjbGFpbSB0aGVtLgorCQkJCSAqLworCQkJCWRxdW90X3Jlc2VydmVfYmxvY2soaW5vZGUsCisJCQkJCQlFWFQ0X0MyQihzYmksIHJlc2VydmF0aW9uKSk7CisJCQkJc3Bpbl9sb2NrKCZlaS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKKwkJCQllaS0+aV9yZXNlcnZlZF9kYXRhX2Jsb2NrcyArPSByZXNlcnZhdGlvbjsKKwkJCQlzcGluX3VubG9jaygmZWktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CisJCQl9CisJCX0KKwl9CiAKIAkvKgogCSAqIENhY2hlIHRoZSBleHRlbnQgYW5kIHVwZGF0ZSB0cmFuc2FjdGlvbiB0byBjb21taXQgb24gZmRhdGFzeW5jIG9ubHkKQEAgLTM2MzQsMTIgKzQxNjUsMTIgQEAKIAkJZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpOwogCQlrZnJlZShwYXRoKTsKIAl9Ci0JdHJhY2VfZXh0NF9leHRfbWFwX2Jsb2Nrc19leGl0KGlub2RlLCBtYXAtPm1fbGJsaywKLQkJbmV3YmxvY2ssIG1hcC0+bV9sZW4sIGVyciA/IGVyciA6IGFsbG9jYXRlZCk7Ci0KIAlyZXN1bHQgPSAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfUFVOQ0hfT1VUX0VYVCkgPwogCQkJcHVuY2hlZF9vdXQgOiBhbGxvY2F0ZWQ7CiAKKwl0cmFjZV9leHQ0X2V4dF9tYXBfYmxvY2tzX2V4aXQoaW5vZGUsIG1hcC0+bV9sYmxrLAorCQluZXdibG9jaywgbWFwLT5tX2xlbiwgZXJyID8gZXJyIDogcmVzdWx0KTsKKwogCXJldHVybiBlcnIgPyBlcnIgOiByZXN1bHQ7CiB9CiAKQEAgLTM2NDksNiArNDE4MCw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCWV4dDRfbGJsa190IGxhc3RfYmxvY2s7CiAJaGFuZGxlX3QgKmhhbmRsZTsKKwlsb2ZmX3QgcGFnZV9sZW47CiAJaW50IGVyciA9IDA7CiAKIAkvKgpAQCAtMzY2NSw4ICs0MTk3LDE2IEBACiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm47CiAKLQlpZiAoaW5vZGUtPmlfc2l6ZSAmIChzYi0+c19ibG9ja3NpemUgLSAxKSkKLQkJZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZSwgbWFwcGluZywgaW5vZGUtPmlfc2l6ZSk7CisJaWYgKGlub2RlLT5pX3NpemUgJSBQQUdFX0NBQ0hFX1NJWkUgIT0gMCkgeworCQlwYWdlX2xlbiA9IFBBR0VfQ0FDSEVfU0laRSAtCisJCQkoaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisKKwkJZXJyID0gZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzKGhhbmRsZSwKKwkJCW1hcHBpbmcsIGlub2RlLT5pX3NpemUsIHBhZ2VfbGVuLCAwKTsKKworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfc3RvcDsKKwl9CiAKIAlpZiAoZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpKQogCQlnb3RvIG91dF9zdG9wOwpAQCAtMzc2MCw2ICs0MzAwLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAlpbnQgcmV0MiA9IDA7CiAJaW50IHJldHJpZXMgPSAwOworCWludCBmbGFnczsKIAlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAl1bnNpZ25lZCBpbnQgY3JlZGl0cywgYmxrYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7CiAKQEAgLTM3OTYsNiArNDMzNywxNiBAQAogCQl0cmFjZV9leHQ0X2ZhbGxvY2F0ZV9leGl0KGlub2RlLCBvZmZzZXQsIG1heF9ibG9ja3MsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQorCWZsYWdzID0gRVhUNF9HRVRfQkxPQ0tTX0NSRUFURV9VTklOSVRfRVhUOworCWlmIChtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkKKwkJZmxhZ3MgfD0gRVhUNF9HRVRfQkxPQ0tTX0tFRVBfU0laRTsKKwkvKgorCSAqIERvbid0IG5vcm1hbGl6ZSB0aGUgcmVxdWVzdCBpZiBpdCBjYW4gZml0IGluIG9uZSBleHRlbnQgc28KKwkgKiB0aGF0IGl0IGRvZXNuJ3QgZ2V0IHVubmVjZXNzYXJpbHkgc3BsaXQgaW50byBtdWx0aXBsZQorCSAqIGV4dGVudHMuCisJICovCisJaWYgKGxlbiA8PSBFWFRfVU5JTklUX01BWF9MRU4gPDwgYmxrYml0cykKKwkJZmxhZ3MgfD0gRVhUNF9HRVRfQkxPQ0tTX05PX05PUk1BTElaRTsKIHJldHJ5OgogCXdoaWxlIChyZXQgPj0gMCAmJiByZXQgPCBtYXhfYmxvY2tzKSB7CiAJCW1hcC5tX2xibGsgPSBtYXAubV9sYmxrICsgcmV0OwpAQCAtMzgwNSw5ICs0MzU2LDcgQEAKIAkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXJldCA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAmbWFwLAotCQkJCSAgICAgIEVYVDRfR0VUX0JMT0NLU19DUkVBVEVfVU5JTklUX0VYVCB8Ci0JCQkJICAgICAgRVhUNF9HRVRfQkxPQ0tTX05PX05PUk1BTElaRSk7CisJCXJldCA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAmbWFwLCBmbGFncyk7CiAJCWlmIChyZXQgPD0gMCkgewogI2lmZGVmIEVYVDRGU19ERUJVRwogCQkJV0FSTl9PTihyZXQgPD0gMCk7CkBAIC00MTAyLDcgKzQ2NTEsNiBAQAogCQlyZXR1cm4gRVhUX0JSRUFLOwogCXJldHVybiBFWFRfQ09OVElOVUU7CiB9Ci0KIC8qIGZpZW1hcCBmbGFncyB3ZSBjYW4gaGFuZGxlIHNwZWNpZmllZCBoZXJlICovCiAjZGVmaW5lIEVYVDRfRklFTUFQX0ZMQUdTCShGSUVNQVBfRkxBR19TWU5DfEZJRU1BUF9GTEFHX1hBVFRSKQogCkBAIC00MTYyLDE3ICs0NzEwLDI4IEBACiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwogCXN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwOwogCWhhbmRsZV90ICpoYW5kbGU7Ci0JbG9mZl90IGZpcnN0X2Jsb2NrX29mZnNldCwgbGFzdF9ibG9ja19vZmZzZXQsIGJsb2NrX2xlbjsKLQlsb2ZmX3QgZmlyc3RfcGFnZSwgbGFzdF9wYWdlLCBmaXJzdF9wYWdlX29mZnNldCwgbGFzdF9wYWdlX29mZnNldDsKKwlsb2ZmX3QgZmlyc3RfcGFnZSwgbGFzdF9wYWdlLCBwYWdlX2xlbjsKKwlsb2ZmX3QgZmlyc3RfcGFnZV9vZmZzZXQsIGxhc3RfcGFnZV9vZmZzZXQ7CiAJaW50IHJldCwgY3JlZGl0cywgYmxvY2tzX3JlbGVhc2VkLCBlcnIgPSAwOwogCisJLyogTm8gbmVlZCB0byBwdW5jaCBob2xlIGJleW9uZCBpX3NpemUgKi8KKwlpZiAob2Zmc2V0ID49IGlub2RlLT5pX3NpemUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgaG9sZSBleHRlbmRzIGJleW9uZCBpX3NpemUsIHNldCB0aGUgaG9sZQorCSAqIHRvIGVuZCBhZnRlciB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIGlfc2l6ZQorCSAqLworCWlmIChvZmZzZXQgKyBsZW5ndGggPiBpbm9kZS0+aV9zaXplKSB7CisJCWxlbmd0aCA9IGlub2RlLT5pX3NpemUgKworCQkgICBQQUdFX0NBQ0hFX1NJWkUgLSAoaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgLQorCQkgICBvZmZzZXQ7CisJfQorCiAJZmlyc3RfYmxvY2sgPSAob2Zmc2V0ICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4KIAkJRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpOwogCWxhc3RfYmxvY2sgPSAob2Zmc2V0ICsgbGVuZ3RoKSA+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7CiAKLQlmaXJzdF9ibG9ja19vZmZzZXQgPSBmaXJzdF9ibG9jayA8PCBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7Ci0JbGFzdF9ibG9ja19vZmZzZXQgPSBsYXN0X2Jsb2NrIDw8IEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKTsKLQogCWZpcnN0X3BhZ2UgPSAob2Zmc2V0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlsYXN0X3BhZ2UgPSAob2Zmc2V0ICsgbGVuZ3RoKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCkBAIC00MTg1LDExICs0NzQ0LDEwIEBACiAJICovCiAJaWYgKG1hcHBpbmctPm5ycGFnZXMgJiYgbWFwcGluZ190YWdnZWQobWFwcGluZywgUEFHRUNBQ0hFX1RBR19ESVJUWSkpIHsKIAkJZXJyID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShtYXBwaW5nLAotCQkJZmlyc3RfcGFnZV9vZmZzZXQgPT0gMCA/IDAgOiBmaXJzdF9wYWdlX29mZnNldC0xLAotCQkJbGFzdF9wYWdlX29mZnNldCk7CisJCQlvZmZzZXQsIG9mZnNldCArIGxlbmd0aCAtIDEpOwogCi0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCS8qIE5vdyByZWxlYXNlIHRoZSBwYWdlcyAqLwpAQCAtNDIxMSwyNCArNDc2OSw2NCBAQAogCQlnb3RvIG91dDsKIAogCS8qCi0JICogTm93IHdlIG5lZWQgdG8gemVybyBvdXQgdGhlIHVuIGJsb2NrIGFsaWduZWQgZGF0YS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBzbWFsbGVyIHRoYW4gYSBibG9jaywganVzdAotCSAqIHplcm8gb3V0IHRoZSBtaWRkbGUKKwkgKiBOb3cgd2UgbmVlZCB0byB6ZXJvIG91dCB0aGUgbm9uLXBhZ2UtYWxpZ25lZCBkYXRhIGluIHRoZQorCSAqIHBhZ2VzIGF0IHRoZSBzdGFydCBhbmQgdGFpbCBvZiB0aGUgaG9sZSwgYW5kIHVubWFwIHRoZSBidWZmZXIKKwkgKiBoZWFkcyBmb3IgdGhlIGJsb2NrIGFsaWduZWQgcmVnaW9ucyBvZiB0aGUgcGFnZSB0aGF0IHdlcmUKKwkgKiBjb21wbGV0ZWx5IHplcm9lZC4KIAkgKi8KLQlpZiAoZmlyc3RfYmxvY2sgPiBsYXN0X2Jsb2NrKQotCQlleHQ0X2Jsb2NrX3plcm9fcGFnZV9yYW5nZShoYW5kbGUsIG1hcHBpbmcsIG9mZnNldCwgbGVuZ3RoKTsKLQllbHNlIHsKLQkJLyogemVybyBvdXQgdGhlIGhlYWQgb2YgdGhlIGhvbGUgYmVmb3JlIHRoZSBmaXJzdCBibG9jayAqLwotCQlibG9ja19sZW4gID0gZmlyc3RfYmxvY2tfb2Zmc2V0IC0gb2Zmc2V0OwotCQlpZiAoYmxvY2tfbGVuID4gMCkKLQkJCWV4dDRfYmxvY2tfemVyb19wYWdlX3JhbmdlKGhhbmRsZSwgbWFwcGluZywKLQkJCQkJCSAgIG9mZnNldCwgYmxvY2tfbGVuKTsKKwlpZiAoZmlyc3RfcGFnZSA+IGxhc3RfcGFnZSkgeworCQkvKgorCQkgKiBJZiB0aGUgZmlsZSBzcGFjZSBiZWluZyB0cnVuY2F0ZWQgaXMgY29udGFpbmVkIHdpdGhpbiBhIHBhZ2UKKwkJICoganVzdCB6ZXJvIG91dCBhbmQgdW5tYXAgdGhlIG1pZGRsZSBvZiB0aGF0IHBhZ2UKKwkJICovCisJCWVyciA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVycyhoYW5kbGUsCisJCQltYXBwaW5nLCBvZmZzZXQsIGxlbmd0aCwgMCk7CiAKLQkJLyogemVybyBvdXQgdGhlIHRhaWwgb2YgdGhlIGhvbGUgYWZ0ZXIgdGhlIGxhc3QgYmxvY2sgKi8KLQkJYmxvY2tfbGVuID0gb2Zmc2V0ICsgbGVuZ3RoIC0gbGFzdF9ibG9ja19vZmZzZXQ7Ci0JCWlmIChibG9ja19sZW4gPiAwKSB7Ci0JCQlleHQ0X2Jsb2NrX3plcm9fcGFnZV9yYW5nZShoYW5kbGUsIG1hcHBpbmcsCi0JCQkJCWxhc3RfYmxvY2tfb2Zmc2V0LCBibG9ja19sZW4pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogemVybyBvdXQgYW5kIHVubWFwIHRoZSBwYXJ0aWFsIHBhZ2UgdGhhdCBjb250YWlucworCQkgKiB0aGUgc3RhcnQgb2YgdGhlIGhvbGUKKwkJICovCisJCXBhZ2VfbGVuICA9IGZpcnN0X3BhZ2Vfb2Zmc2V0IC0gb2Zmc2V0OworCQlpZiAocGFnZV9sZW4gPiAwKSB7CisJCQllcnIgPSBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnMoaGFuZGxlLCBtYXBwaW5nLAorCQkJCQkJICAgb2Zmc2V0LCBwYWdlX2xlbiwgMCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogemVybyBvdXQgYW5kIHVubWFwIHRoZSBwYXJ0aWFsIHBhZ2UgdGhhdCBjb250YWlucworCQkgKiB0aGUgZW5kIG9mIHRoZSBob2xlCisJCSAqLworCQlwYWdlX2xlbiA9IG9mZnNldCArIGxlbmd0aCAtIGxhc3RfcGFnZV9vZmZzZXQ7CisJCWlmIChwYWdlX2xlbiA+IDApIHsKKwkJCWVyciA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVycyhoYW5kbGUsIG1hcHBpbmcsCisJCQkJCWxhc3RfcGFnZV9vZmZzZXQsIHBhZ2VfbGVuLCAwKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKworCS8qCisJICogSWYgaV9zaXplIGlzIGNvbnRhaW5lZCBpbiB0aGUgbGFzdCBwYWdlLCB3ZSBuZWVkIHRvCisJICogdW5tYXAgYW5kIHplcm8gdGhlIHBhcnRpYWwgcGFnZSBhZnRlciBpX3NpemUKKwkgKi8KKwlpZiAoaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUID09IGxhc3RfcGFnZSAmJgorCSAgIGlub2RlLT5pX3NpemUgJSBQQUdFX0NBQ0hFX1NJWkUgIT0gMCkgeworCisJCXBhZ2VfbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0KKwkJCShpbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKworCQlpZiAocGFnZV9sZW4gPiAwKSB7CisJCQllcnIgPSBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnMoaGFuZGxlLAorCQkJICBtYXBwaW5nLCBpbm9kZS0+aV9zaXplLCBwYWdlX2xlbiwgMCk7CisKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmlsZS5jIGIvZnMvZXh0NC9maWxlLmMKaW5kZXggZTQwOTVlOS4uY2I3MGYxOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9maWxlLmMKKysrIGIvZnMvZXh0NC9maWxlLmMKQEAgLTE4MSw4ICsxODEsOCBAQAogCQlwYXRoLmRlbnRyeSA9IG1udC0+bW50X3Jvb3Q7CiAJCWNwID0gZF9wYXRoKCZwYXRoLCBidWYsIHNpemVvZihidWYpKTsKIAkJaWYgKCFJU19FUlIoY3ApKSB7Ci0JCQltZW1jcHkoc2JpLT5zX2VzLT5zX2xhc3RfbW91bnRlZCwgY3AsCi0JCQkgICAgICAgc2l6ZW9mKHNiaS0+c19lcy0+c19sYXN0X21vdW50ZWQpKTsKKwkJCXN0cmxjcHkoc2JpLT5zX2VzLT5zX2xhc3RfbW91bnRlZCwgY3AsCisJCQkJc2l6ZW9mKHNiaS0+c19lcy0+c19sYXN0X21vdW50ZWQpKTsKIAkJCWV4dDRfbWFya19zdXBlcl9kaXJ0eShzYik7CiAJCX0KIAl9CkBAIC0yMjQsNTMgKzIyNCw4IEBACiAJCW1heGJ5dGVzID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfYml0bWFwX21heGJ5dGVzOwogCWVsc2UKIAkJbWF4Ynl0ZXMgPSBpbm9kZS0+aV9zYi0+c19tYXhieXRlczsKLQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0Jc3dpdGNoIChvcmlnaW4pIHsKLQljYXNlIFNFRUtfRU5EOgotCQlvZmZzZXQgKz0gaW5vZGUtPmlfc2l6ZTsKLQkJYnJlYWs7Ci0JY2FzZSBTRUVLX0NVUjoKLQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQkJCXJldHVybiBmaWxlLT5mX3BvczsKLQkJfQotCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7Ci0JCWJyZWFrOwotCWNhc2UgU0VFS19EQVRBOgotCQkvKgotCQkgKiBJbiB0aGUgZ2VuZXJpYyBjYXNlIHRoZSBlbnRpcmUgZmlsZSBpcyBkYXRhLCBzbyBhcyBsb25nIGFzCi0JCSAqIG9mZnNldCBpc24ndCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRoZW4gdGhlIG9mZnNldCBpcyBkYXRhLgotCQkgKi8KLQkJaWYgKG9mZnNldCA+PSBpbm9kZS0+aV9zaXplKSB7Ci0JCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQkJCXJldHVybiAtRU5YSU87Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTRUVLX0hPTEU6Ci0JCS8qCi0JCSAqIFRoZXJlIGlzIGEgdmlydHVhbCBob2xlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHNvIGFzIGxvbmcgYXMKLQkJICogb2Zmc2V0IGlzbid0IGlfc2l6ZSBvciBsYXJnZXIsIHJldHVybiBpX3NpemUuCi0JCSAqLwotCQlpZiAob2Zmc2V0ID49IGlub2RlLT5pX3NpemUpIHsKLQkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCQlvZmZzZXQgPSBpbm9kZS0+aV9zaXplOwotCQlicmVhazsKLQl9CiAKLQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBtYXhieXRlcykgewotCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgewotCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKLQkJZmlsZS0+Zl92ZXJzaW9uID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0KLQlyZXR1cm4gb2Zmc2V0OworCXJldHVybiBnZW5lcmljX2ZpbGVfbGxzZWVrX3NpemUoZmlsZSwgb2Zmc2V0LCBvcmlnaW4sIG1heGJ5dGVzKTsKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQ0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZnN5bmMuYyBiL2ZzL2V4dDQvZnN5bmMuYwppbmRleCAwMzZmNzhmLi4wMGEyY2I3IDEwMDY0NAotLS0gYS9mcy9leHQ0L2ZzeW5jLmMKKysrIGIvZnMvZXh0NC9mc3luYy5jCkBAIC03NSw3ICs3NSw3IEBACiAgKiB0byB3cml0dGVuLgogICogVGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgSU9zIG9uIHN1Y2Nlc3MuCiAgKi8KLWV4dGVybiBpbnQgZXh0NF9mbHVzaF9jb21wbGV0ZWRfSU8oc3RydWN0IGlub2RlICppbm9kZSkKK2ludCBleHQ0X2ZsdXNoX2NvbXBsZXRlZF9JTyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWV4dDRfaW9fZW5kX3QgKmlvOwogCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKQEAgLTgzLDE0ICs4MywxMiBAQAogCWludCByZXQgPSAwOwogCWludCByZXQyID0gMDsKIAotCWlmIChsaXN0X2VtcHR5KCZlaS0+aV9jb21wbGV0ZWRfaW9fbGlzdCkpCi0JCXJldHVybiByZXQ7Ci0KIAlkdW1wX2NvbXBsZXRlZF9JTyhpbm9kZSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZlaS0+aV9jb21wbGV0ZWRfaW9fbGlzdCkpewogCQlpbyA9IGxpc3RfZW50cnkoZWktPmlfY29tcGxldGVkX2lvX2xpc3QubmV4dCwKIAkJCQlleHQ0X2lvX2VuZF90LCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmaW8tPmxpc3QpOwogCQkvKgogCQkgKiBDYWxsaW5nIGV4dDRfZW5kX2lvX25vbG9jaygpIHRvIGNvbnZlcnQgY29tcGxldGVkCiAJCSAqIElPIHRvIHdyaXR0ZW4uCkBAIC0xMDcsMTEgKzEwNSw5IEBACiAJCSAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaS0+aV9jb21wbGV0ZWRfaW9fbG9jaywgZmxhZ3MpOwogCQlyZXQgPSBleHQ0X2VuZF9pb19ub2xvY2soaW8pOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWktPmlfY29tcGxldGVkX2lvX2xvY2ssIGZsYWdzKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXQyID0gcmV0OwotCQllbHNlCi0JCQlsaXN0X2RlbF9pbml0KCZpby0+bGlzdCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlaS0+aV9jb21wbGV0ZWRfaW9fbG9jaywgZmxhZ3MpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaS0+aV9jb21wbGV0ZWRfaW9fbG9jaywgZmxhZ3MpOwogCXJldHVybiAocmV0MiA8IDApID8gcmV0MiA6IDA7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lhbGxvYy5jIGIvZnMvZXh0NC9pYWxsb2MuYwppbmRleCA5YzYzZjI3Li4wMGJlYjRmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lhbGxvYy5jCisrKyBiL2ZzL2V4dDQvaWFsbG9jLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAkgKiBhbGxvY2F0aW9uLCBlc3NlbnRpYWxseSBpbXBsZW1lbnRpbmcgYSBwZXItZ3JvdXAgcmVhZC1vbmx5IGZsYWcuICovCiAJaWYgKCFleHQ0X2dyb3VwX2Rlc2NfY3N1bV92ZXJpZnkoc2JpLCBibG9ja19ncm91cCwgZ2RwKSkgewogCQlleHQ0X2Vycm9yKHNiLCAiQ2hlY2tzdW0gYmFkIGZvciBncm91cCAldSIsIGJsb2NrX2dyb3VwKTsKLQkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIDApOworCQlleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnNfc2V0KHNiLCBnZHAsIDApOwogCQlleHQ0X2ZyZWVfaW5vZGVzX3NldChzYiwgZ2RwLCAwKTsKIAkJZXh0NF9pdGFibGVfdW51c2VkX3NldChzYiwgZ2RwLCAwKTsKIAkJbWVtc2V0KGJoLT5iX2RhdGEsIDB4ZmYsIHNiLT5zX2Jsb2Nrc2l6ZSk7CkBAIC0yOTMsMTIxICsyOTMsOSBAQAogCWV4dDRfc3RkX2Vycm9yKHNiLCBmYXRhbCk7CiB9CiAKLS8qCi0gKiBUaGVyZSBhcmUgdHdvIHBvbGljaWVzIGZvciBhbGxvY2F0aW5nIGFuIGlub2RlLiAgSWYgdGhlIG5ldyBpbm9kZSBpcwotICogYSBkaXJlY3RvcnksIHRoZW4gYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGJsb2NrIGdyb3VwIHdpdGggYm90aAotICogZnJlZSBzcGFjZSBhbmQgYSBsb3cgZGlyZWN0b3J5LXRvLWlub2RlIHJhdGlvOyBpZiB0aGF0IGZhaWxzLCB0aGVuIG9mCi0gKiB0aGUgZ3JvdXBzIHdpdGggYWJvdmUtYXZlcmFnZSBmcmVlIHNwYWNlLCB0aGF0IGdyb3VwIHdpdGggdGhlIGZld2VzdAotICogZGlyZWN0b3JpZXMgYWxyZWFkeSBpcyBjaG9zZW4uCi0gKgotICogRm9yIG90aGVyIGlub2Rlcywgc2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgcGFyZW50IGRpcmVjdG9yeVwncyBibG9jawotICogZ3JvdXAgdG8gZmluZCBhIGZyZWUgaW5vZGUuCi0gKi8KLXN0YXRpYyBpbnQgZmluZF9ncm91cF9kaXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICpwYXJlbnQsCi0JCQkJZXh0NF9ncm91cF90ICpiZXN0X2dyb3VwKQotewotCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKLQl1bnNpZ25lZCBpbnQgZnJlZWksIGF2ZWZyZWVpOwotCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MsICpiZXN0X2Rlc2MgPSBOVUxMOwotCWV4dDRfZ3JvdXBfdCBncm91cDsKLQlpbnQgcmV0ID0gLTE7Ci0KLQlmcmVlaSA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJkVYVDRfU0Ioc2IpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7Ci0JYXZlZnJlZWkgPSBmcmVlaSAvIG5ncm91cHM7Ci0KLQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuZ3JvdXBzOyBncm91cCsrKSB7Ci0JCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgTlVMTCk7Ci0JCWlmICghZGVzYyB8fCAhZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpCi0JCQljb250aW51ZTsKLQkJaWYgKGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpIDwgYXZlZnJlZWkpCi0JCQljb250aW51ZTsKLQkJaWYgKCFiZXN0X2Rlc2MgfHwKLQkJICAgIChleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykgPgotCQkgICAgIGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBiZXN0X2Rlc2MpKSkgewotCQkJKmJlc3RfZ3JvdXAgPSBncm91cDsKLQkJCWJlc3RfZGVzYyA9IGRlc2M7Ci0JCQlyZXQgPSAwOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgZnJlZV9ibG9ja19yYXRpbyAxMAotCi1zdGF0aWMgaW50IGZpbmRfZ3JvdXBfZmxleChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCwKLQkJCSAgIGV4dDRfZ3JvdXBfdCAqYmVzdF9ncm91cCkKLXsKLQlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjOwotCXN0cnVjdCBmbGV4X2dyb3VwcyAqZmxleF9ncm91cCA9IHNiaS0+c19mbGV4X2dyb3VwczsKLQlleHQ0X2dyb3VwX3QgcGFyZW50X2dyb3VwID0gRVhUNF9JKHBhcmVudCktPmlfYmxvY2tfZ3JvdXA7Ci0JZXh0NF9ncm91cF90IHBhcmVudF9mYmdfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBwYXJlbnRfZ3JvdXApOwotCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKLQlpbnQgZmxleF9zaXplID0gZXh0NF9mbGV4X2JnX3NpemUoc2JpKTsKLQlleHQ0X2dyb3VwX3QgYmVzdF9mbGV4ID0gcGFyZW50X2ZiZ19ncm91cDsKLQlpbnQgYmxvY2tzX3Blcl9mbGV4ID0gc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgKiBmbGV4X3NpemU7Ci0JaW50IGZsZXhiZ19mcmVlX2Jsb2NrczsKLQlpbnQgZmxleF9mcmVlYl9yYXRpbzsKLQlleHQ0X2dyb3VwX3Qgbl9mYmdfZ3JvdXBzOwotCWV4dDRfZ3JvdXBfdCBpOwotCi0Jbl9mYmdfZ3JvdXBzID0gKG5ncm91cHMgKyBmbGV4X3NpemUgLSAxKSA+PgotCQlzYmktPnNfbG9nX2dyb3Vwc19wZXJfZmxleDsKLQotZmluZF9jbG9zZV90b19wYXJlbnQ6Ci0JZmxleGJnX2ZyZWVfYmxvY2tzID0gYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2Jsb2Nrcyk7Ci0JZmxleF9mcmVlYl9yYXRpbyA9IGZsZXhiZ19mcmVlX2Jsb2NrcyAqIDEwMCAvIGJsb2Nrc19wZXJfZmxleDsKLQlpZiAoYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2lub2RlcykgJiYKLQkgICAgZmxleF9mcmVlYl9yYXRpbyA+IGZyZWVfYmxvY2tfcmF0aW8pCi0JCWdvdG8gZm91bmRfZmxleGJnOwotCi0JaWYgKGJlc3RfZmxleCAmJiBiZXN0X2ZsZXggPT0gcGFyZW50X2ZiZ19ncm91cCkgewotCQliZXN0X2ZsZXgtLTsKLQkJZ290byBmaW5kX2Nsb3NlX3RvX3BhcmVudDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbl9mYmdfZ3JvdXBzOyBpKyspIHsKLQkJaWYgKGkgPT0gcGFyZW50X2ZiZ19ncm91cCB8fCBpID09IHBhcmVudF9mYmdfZ3JvdXAgLSAxKQotCQkJY29udGludWU7Ci0KLQkJZmxleGJnX2ZyZWVfYmxvY2tzID0gYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbaV0uZnJlZV9ibG9ja3MpOwotCQlmbGV4X2ZyZWViX3JhdGlvID0gZmxleGJnX2ZyZWVfYmxvY2tzICogMTAwIC8gYmxvY2tzX3Blcl9mbGV4OwotCi0JCWlmIChmbGV4X2ZyZWViX3JhdGlvID4gZnJlZV9ibG9ja19yYXRpbyAmJgotCQkgICAgKGF0b21pY19yZWFkKCZmbGV4X2dyb3VwW2ldLmZyZWVfaW5vZGVzKSkpIHsKLQkJCWJlc3RfZmxleCA9IGk7Ci0JCQlnb3RvIGZvdW5kX2ZsZXhiZzsKLQkJfQotCi0JCWlmICgoYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2lub2RlcykgPT0gMCkgfHwKLQkJICAgICgoYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbaV0uZnJlZV9ibG9ja3MpID4KLQkJICAgICAgYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2Jsb2NrcykpICYmCi0JCSAgICAgYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbaV0uZnJlZV9pbm9kZXMpKSkKLQkJCWJlc3RfZmxleCA9IGk7Ci0JfQotCi0JaWYgKCFhdG9taWNfcmVhZCgmZmxleF9ncm91cFtiZXN0X2ZsZXhdLmZyZWVfaW5vZGVzKSB8fAotCSAgICAhYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2Jsb2NrcykpCi0JCXJldHVybiAtMTsKLQotZm91bmRfZmxleGJnOgotCWZvciAoaSA9IGJlc3RfZmxleCAqIGZsZXhfc2l6ZTsgaSA8IG5ncm91cHMgJiYKLQkJICAgICBpIDwgKGJlc3RfZmxleCArIDEpICogZmxleF9zaXplOyBpKyspIHsKLQkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwotCQlpZiAoZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpIHsKLQkJCSpiZXN0X2dyb3VwID0gaTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JcmV0dXJuIC0xOwotb3V0OgotCXJldHVybiAwOwotfQotCiBzdHJ1Y3Qgb3Jsb3Zfc3RhdHMgewogCV9fdTMyIGZyZWVfaW5vZGVzOwotCV9fdTMyIGZyZWVfYmxvY2tzOworCV9fdTMyIGZyZWVfY2x1c3RlcnM7CiAJX191MzIgdXNlZF9kaXJzOwogfTsKIApAQCAtNDI0LDcgKzMxMiw3IEBACiAKIAlpZiAoZmxleF9zaXplID4gMSkgewogCQlzdGF0cy0+ZnJlZV9pbm9kZXMgPSBhdG9taWNfcmVhZCgmZmxleF9ncm91cFtnXS5mcmVlX2lub2Rlcyk7Ci0JCXN0YXRzLT5mcmVlX2Jsb2NrcyA9IGF0b21pY19yZWFkKCZmbGV4X2dyb3VwW2ddLmZyZWVfYmxvY2tzKTsKKwkJc3RhdHMtPmZyZWVfY2x1c3RlcnMgPSBhdG9taWNfcmVhZCgmZmxleF9ncm91cFtnXS5mcmVlX2NsdXN0ZXJzKTsKIAkJc3RhdHMtPnVzZWRfZGlycyA9IGF0b21pY19yZWFkKCZmbGV4X2dyb3VwW2ddLnVzZWRfZGlycyk7CiAJCXJldHVybjsKIAl9CkBAIC00MzIsMTEgKzMyMCwxMSBAQAogCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBnLCBOVUxMKTsKIAlpZiAoZGVzYykgewogCQlzdGF0cy0+ZnJlZV9pbm9kZXMgPSBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKTsKLQkJc3RhdHMtPmZyZWVfYmxvY2tzID0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGRlc2MpOworCQlzdGF0cy0+ZnJlZV9jbHVzdGVycyA9IGV4dDRfZnJlZV9ncm91cF9jbHVzdGVycyhzYiwgZGVzYyk7CiAJCXN0YXRzLT51c2VkX2RpcnMgPSBleHQ0X3VzZWRfZGlyc19jb3VudChzYiwgZGVzYyk7CiAJfSBlbHNlIHsKIAkJc3RhdHMtPmZyZWVfaW5vZGVzID0gMDsKLQkJc3RhdHMtPmZyZWVfYmxvY2tzID0gMDsKKwkJc3RhdHMtPmZyZWVfY2x1c3RlcnMgPSAwOwogCQlzdGF0cy0+dXNlZF9kaXJzID0gMDsKIAl9CiB9CkBAIC00NzEsMTAgKzM1OSwxMCBAQAogCWV4dDRfZ3JvdXBfdCByZWFsX25ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCWludCBpbm9kZXNfcGVyX2dyb3VwID0gRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKTsKIAl1bnNpZ25lZCBpbnQgZnJlZWksIGF2ZWZyZWVpOwotCWV4dDRfZnNibGtfdCBmcmVlYiwgYXZlZnJlZWI7CisJZXh0NF9mc2Jsa190IGZyZWViLCBhdmVmcmVlYzsKIAl1bnNpZ25lZCBpbnQgbmRpcnM7CiAJaW50IG1heF9kaXJzLCBtaW5faW5vZGVzOwotCWV4dDRfZ3JwYmxrX3QgbWluX2Jsb2NrczsKKwlleHQ0X2dycGJsa190IG1pbl9jbHVzdGVyczsKIAlleHQ0X2dyb3VwX3QgaSwgZ3JwLCBnLCBuZ3JvdXBzOwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7CiAJc3RydWN0IG9ybG92X3N0YXRzIHN0YXRzOwpAQCAtNDkwLDkgKzM3OCwxMCBAQAogCiAJZnJlZWkgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlhdmVmcmVlaSA9IGZyZWVpIC8gbmdyb3VwczsKLQlmcmVlYiA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwotCWF2ZWZyZWViID0gZnJlZWI7Ci0JZG9fZGl2KGF2ZWZyZWViLCBuZ3JvdXBzKTsKKwlmcmVlYiA9IEVYVDRfQzJCKHNiaSwKKwkJcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyKSk7CisJYXZlZnJlZWMgPSBmcmVlYjsKKwlkb19kaXYoYXZlZnJlZWMsIG5ncm91cHMpOwogCW5kaXJzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2RpcnNfY291bnRlcik7CiAKIAlpZiAoU19JU0RJUihtb2RlKSAmJgpAQCAtNTE4LDcgKzQwNyw3IEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoc3RhdHMuZnJlZV9pbm9kZXMgPCBhdmVmcmVlaSkKIAkJCQljb250aW51ZTsKLQkJCWlmIChzdGF0cy5mcmVlX2Jsb2NrcyA8IGF2ZWZyZWViKQorCQkJaWYgKHN0YXRzLmZyZWVfY2x1c3RlcnMgPCBhdmVmcmVlYykKIAkJCQljb250aW51ZTsKIAkJCWdycCA9IGc7CiAJCQlyZXQgPSAwOwpAQCAtNTU2LDcgKzQ0NSw3IEBACiAJbWluX2lub2RlcyA9IGF2ZWZyZWVpIC0gaW5vZGVzX3Blcl9ncm91cCpmbGV4X3NpemUgLyA0OwogCWlmIChtaW5faW5vZGVzIDwgMSkKIAkJbWluX2lub2RlcyA9IDE7Ci0JbWluX2Jsb2NrcyA9IGF2ZWZyZWViIC0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSpmbGV4X3NpemUgLyA0OworCW1pbl9jbHVzdGVycyA9IGF2ZWZyZWVjIC0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpKmZsZXhfc2l6ZSAvIDQ7CiAKIAkvKgogCSAqIFN0YXJ0IGxvb2tpbmcgaW4gdGhlIGZsZXggZ3JvdXAgd2hlcmUgd2UgbGFzdCBhbGxvY2F0ZWQgYW4KQEAgLTU3NSw3ICs0NjQsNyBAQAogCQkJY29udGludWU7CiAJCWlmIChzdGF0cy5mcmVlX2lub2RlcyA8IG1pbl9pbm9kZXMpCiAJCQljb250aW51ZTsKLQkJaWYgKHN0YXRzLmZyZWVfYmxvY2tzIDwgbWluX2Jsb2NrcykKKwkJaWYgKHN0YXRzLmZyZWVfY2x1c3RlcnMgPCBtaW5fY2x1c3RlcnMpCiAJCQljb250aW51ZTsKIAkJZ290byBmb3VuZF9mbGV4X2JnOwogCX0KQEAgLTY1OSw3ICs1NDgsNyBAQAogCSpncm91cCA9IHBhcmVudF9ncm91cDsKIAlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgKmdyb3VwLCBOVUxMKTsKIAlpZiAoZGVzYyAmJiBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSAmJgotCQkJZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGRlc2MpKQorCSAgICBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGRlc2MpKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC02ODMsNyArNTcyLDcgQEAKIAkJCSpncm91cCAtPSBuZ3JvdXBzOwogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgKmdyb3VwLCBOVUxMKTsKIAkJaWYgKGRlc2MgJiYgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykgJiYKLQkJCQlleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykpCisJCSAgICBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGRlc2MpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC04MDIsNyArNjkxLDcgQEAKICAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgogICovCiBzdHJ1Y3QgaW5vZGUgKmV4dDRfbmV3X2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHFzdHIgKnFzdHIsIF9fdTMyIGdvYWwpCisJCQkgICAgIGNvbnN0IHN0cnVjdCBxc3RyICpxc3RyLCBfX3UzMiBnb2FsLCB1aWRfdCAqb3duZXIpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2JpdG1hcF9iaCA9IE5VTEw7CkBAIC04MTYsOCArNzA1LDYgQEAKIAlpbnQgcmV0MiwgZXJyID0gMDsKIAlzdHJ1Y3QgaW5vZGUgKnJldDsKIAlleHQ0X2dyb3VwX3QgaTsKLQlpbnQgZnJlZSA9IDA7Ci0Jc3RhdGljIGludCBvbmNlID0gMTsKIAlleHQ0X2dyb3VwX3QgZmxleF9ncm91cDsKIAogCS8qIENhbm5vdCBjcmVhdGUgZmlsZXMgaW4gYSBkZWxldGVkIGRpcmVjdG9yeSAqLwpAQCAtODQzLDI2ICs3MzAsOSBAQAogCQlnb3RvIGdvdF9ncm91cDsKIAl9CiAKLQlpZiAoc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXggJiYgdGVzdF9vcHQoc2IsIE9MREFMTE9DKSkgewotCQlyZXQyID0gZmluZF9ncm91cF9mbGV4KHNiLCBkaXIsICZncm91cCk7Ci0JCWlmIChyZXQyID09IC0xKSB7Ci0JCQlyZXQyID0gZmluZF9ncm91cF9vdGhlcihzYiwgZGlyLCAmZ3JvdXAsIG1vZGUpOwotCQkJaWYgKHJldDIgPT0gMCAmJiBvbmNlKSB7Ci0JCQkJb25jZSA9IDA7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJleHQ0OiBmaW5kX2dyb3VwX2ZsZXggIgotCQkJCSAgICAgICAiZmFpbGVkLCBmYWxsYmFjayBzdWNjZWVkZWQgZGlyICVsdVxuIiwKLQkJCQkgICAgICAgZGlyLT5pX2lubyk7Ci0JCQl9Ci0JCX0KLQkJZ290byBnb3RfZ3JvdXA7Ci0JfQotCi0JaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJaWYgKHRlc3Rfb3B0KHNiLCBPTERBTExPQykpCi0JCQlyZXQyID0gZmluZF9ncm91cF9kaXIoc2IsIGRpciwgJmdyb3VwKTsKLQkJZWxzZQotCQkJcmV0MiA9IGZpbmRfZ3JvdXBfb3Jsb3Yoc2IsIGRpciwgJmdyb3VwLCBtb2RlLCBxc3RyKTsKLQl9IGVsc2UKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0MiA9IGZpbmRfZ3JvdXBfb3Jsb3Yoc2IsIGRpciwgJmdyb3VwLCBtb2RlLCBxc3RyKTsKKwllbHNlCiAJCXJldDIgPSBmaW5kX2dyb3VwX290aGVyKHNiLCBkaXIsICZncm91cCwgbW9kZSk7CiAKIGdvdF9ncm91cDoKQEAgLTk1MCwyNiArODIwLDIxIEBACiAJCQlnb3RvIGZhaWw7CiAJCX0KIAotCQlmcmVlID0gMDsKLQkJZXh0NF9sb2NrX2dyb3VwKHNiLCBncm91cCk7CisJCUJVRkZFUl9UUkFDRShibG9ja19iaXRtYXBfYmgsICJkaXJ0eSBibG9jayBiaXRtYXAiKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBibG9ja19iaXRtYXBfYmgpOworCQlicmVsc2UoYmxvY2tfYml0bWFwX2JoKTsKKwogCQkvKiByZWNoZWNrIGFuZCBjbGVhciBmbGFnIHVuZGVyIGxvY2sgaWYgd2Ugc3RpbGwgbmVlZCB0byAqLworCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAkJaWYgKGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKLQkJCWZyZWUgPSBleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsIGdyb3VwLCBnZHApOwogCQkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19CTE9DS19VTklOSVQpOwotCQkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGZyZWUpOworCQkJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLAorCQkJCWV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHNiLCBncm91cCwgZ2RwKSk7CiAJCQlnZHAtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBncm91cCwKIAkJCQkJCQkJZ2RwKTsKIAkJfQogCQlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwogCi0JCS8qIERvbid0IG5lZWQgdG8gZGlydHkgYml0bWFwIGJsb2NrIGlmIHdlIGRpZG4ndCBjaGFuZ2UgaXQgKi8KLQkJaWYgKGZyZWUpIHsKLQkJCUJVRkZFUl9UUkFDRShibG9ja19iaXRtYXBfYmgsICJkaXJ0eSBibG9jayBiaXRtYXAiKTsKLQkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKLQkJCQkJCQlOVUxMLCBibG9ja19iaXRtYXBfYmgpOwotCQl9Ci0KLQkJYnJlbHNlKGJsb2NrX2JpdG1hcF9iaCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZhaWw7CiAJfQpAQCAtOTg3LDggKzg1MiwxMSBAQAogCQlmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgZ3JvdXApOwogCQlhdG9taWNfZGVjKCZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9pbm9kZXMpOwogCX0KLQotCWlmICh0ZXN0X29wdChzYiwgR1JQSUQpKSB7CisJaWYgKG93bmVyKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQlpbm9kZS0+aV91aWQgPSBvd25lclswXTsKKwkJaW5vZGUtPmlfZ2lkID0gb3duZXJbMV07CisJfSBlbHNlIGlmICh0ZXN0X29wdChzYiwgR1JQSUQpKSB7CiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpbm9kZS0+aV91aWQgPSBjdXJyZW50X2ZzdWlkKCk7CiAJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CkBAIC0xMDA1LDExICs4NzMsNyBAQAogCWVpLT5pX2Rpcl9zdGFydF9sb29rdXAgPSAwOwogCWVpLT5pX2Rpc2tzaXplID0gMDsKIAotCS8qCi0JICogRG9uJ3QgaW5oZXJpdCBleHRlbnQgZmxhZyBmcm9tIGRpcmVjdG9yeSwgYW1vbmdzdCBvdGhlcnMuIFdlIHNldAotCSAqIGV4dGVudCBmbGFnIG9uIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5IGFuZCBmaWxlIG9ubHkgaWYgLW8gZXh0ZW50Ci0JICogbW91bnQgb3B0aW9uIGlzIHNwZWNpZmllZAotCSAqLworCS8qIERvbid0IGluaGVyaXQgZXh0ZW50IGZsYWcgZnJvbSBkaXJlY3RvcnksIGFtb25nc3Qgb3RoZXJzLiAqLwogCWVpLT5pX2ZsYWdzID0KIAkJZXh0NF9tYXNrX2ZsYWdzKG1vZGUsIEVYVDRfSShkaXIpLT5pX2ZsYWdzICYgRVhUNF9GTF9JTkhFUklURUQpOwogCWVpLT5pX2ZpbGVfYWNsID0gMDsKQEAgLTEwODQsNyArOTQ4LDcgQEAKIGZhaWxfZHJvcDoKIAlkcXVvdF9kcm9wKGlub2RlKTsKIAlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKGlub2RlKTsKIAl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAlpcHV0KGlub2RlKTsKIAlicmVsc2UoaW5vZGVfYml0bWFwX2JoKTsKQEAgLTEyMzUsNyArMTA5OSw3IEBACiAgKiBpbm9kZSBhbGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgZ3JvdXAsIHNvIHdlIHRha2UgYWxsb2Nfc2VtIGxvY2ssIHRvCiAgKiBibG9jayBleHQ0X2NsYWltX2lub2RlIHVudGlsIHdlIGFyZSBmaW5pc2hlZC4KICAqLwotZXh0ZXJuIGludCBleHQ0X2luaXRfaW5vZGVfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwLAoraW50IGV4dDRfaW5pdF9pbm9kZV90YWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXAsCiAJCQkJIGludCBiYXJyaWVyKQogewogCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5kaXJlY3QuYyBiL2ZzL2V4dDQvaW5kaXJlY3QuYwppbmRleCAwOTYyNjQyLi4zY2ZjNzNmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2luZGlyZWN0LmMKKysrIGIvZnMvZXh0NC9pbmRpcmVjdC5jCkBAIC02OTksNiArNjk5LDEzIEBACiAJLyoKIAkgKiBPa2F5LCB3ZSBuZWVkIHRvIGRvIGJsb2NrIGFsbG9jYXRpb24uCiAJKi8KKwlpZiAoRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoaW5vZGUtPmlfc2IsCisJCQkJICAgICAgIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfQklHQUxMT0MpKSB7CisJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsICJDYW4ndCBhbGxvY2F0ZSBibG9ja3MgZm9yICIKKwkJCQkgIm5vbi1leHRlbnQgbWFwcGVkIGlub2RlcyB3aXRoIGJpZ2FsbG9jIik7CisJCXJldHVybiAtRU5PU1BDOworCX0KKwogCWdvYWwgPSBleHQ0X2ZpbmRfZ29hbChpbm9kZSwgbWFwLT5tX2xibGssIHBhcnRpYWwpOwogCiAJLyogdGhlIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZSBmb3IgW2QsdF1pbmRpcmVjdCBibG9ja3MgKi8KQEAgLTEzNDMsNyArMTM1MCw5IEBACiAJX19sZTMyIG5yID0gMDsKIAlpbnQgbiA9IDA7CiAJZXh0NF9sYmxrX3QgbGFzdF9ibG9jaywgbWF4X2Jsb2NrOworCWxvZmZfdCBwYWdlX2xlbjsKIAl1bnNpZ25lZCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJaW50IGVycjsKIAogCWhhbmRsZSA9IHN0YXJ0X3RyYW5zYWN0aW9uKGlub2RlKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCkBAIC0xMzU0LDkgKzEzNjMsMTYgQEAKIAltYXhfYmxvY2sgPSAoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfYml0bWFwX21heGJ5dGVzICsgYmxvY2tzaXplLTEpCiAJCQkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKTsKIAotCWlmIChpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpKQotCQlpZiAoZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZSwgbWFwcGluZywgaW5vZGUtPmlfc2l6ZSkpCisJaWYgKGlub2RlLT5pX3NpemUgJSBQQUdFX0NBQ0hFX1NJWkUgIT0gMCkgeworCQlwYWdlX2xlbiA9IFBBR0VfQ0FDSEVfU0laRSAtCisJCQkoaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisKKwkJZXJyID0gZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzKGhhbmRsZSwKKwkJCW1hcHBpbmcsIGlub2RlLT5pX3NpemUsIHBhZ2VfbGVuLCAwKTsKKworCQlpZiAoZXJyKQogCQkJZ290byBvdXRfc3RvcDsKKwl9CiAKIAlpZiAobGFzdF9ibG9jayAhPSBtYXhfYmxvY2spIHsKIAkJbiA9IGV4dDRfYmxvY2tfdG9fcGF0aChpbm9kZSwgbGFzdF9ibG9jaywgb2Zmc2V0cywgTlVMTCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggOTg2ZTIzOC4uMjQwZjZlMiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCi0jaW5jbHVkZSAiZXh0NF9leHRlbnRzLmgiCiAjaW5jbHVkZSAidHJ1bmNhdGUuaCIKIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9leHQ0Lmg+CkBAIC0yNjgsNyArMjY3LDcgQEAKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CiAKIAlzcGluX2xvY2soJmVpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwotCXRyYWNlX2V4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIHVzZWQpOworCXRyYWNlX2V4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIHVzZWQsIHF1b3RhX2NsYWltKTsKIAlpZiAodW5saWtlbHkodXNlZCA+IGVpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzKSkgewogCQlleHQ0X21zZyhpbm9kZS0+aV9zYiwgS0VSTl9OT1RJQ0UsICIlczogaW5vICVsdSwgdXNlZCAlZCAiCiAJCQkgIndpdGggb25seSAlZCByZXNlcnZlZCBkYXRhIGJsb2Nrc1xuIiwKQEAgLTI4MSw3ICsyODAsNyBAQAogCS8qIFVwZGF0ZSBwZXItaW5vZGUgcmVzZXJ2YXRpb25zICovCiAJZWktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MgLT0gdXNlZDsKIAllaS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrcyAtPSBlaS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7Ci0JcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwKKwlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsCiAJCQkgICB1c2VkICsgZWktPmlfYWxsb2NhdGVkX21ldGFfYmxvY2tzKTsKIAllaS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgPSAwOwogCkBAIC0yOTEsNyArMjkwLDcgQEAKIAkJICogb25seSB3aGVuIHdlIGhhdmUgd3JpdHRlbiBhbGwgb2YgdGhlIGRlbGF5ZWQKIAkJICogYWxsb2NhdGlvbiBibG9ja3MuCiAJCSAqLwotCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLAorCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsCiAJCQkJICAgZWktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MpOwogCQllaS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrcyA9IDA7CiAJCWVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuID0gMDsKQEAgLTMwMCwxNCArMjk5LDE0IEBACiAKIAkvKiBVcGRhdGUgcXVvdGEgc3Vic3lzdGVtIGZvciBkYXRhIGJsb2NrcyAqLwogCWlmIChxdW90YV9jbGFpbSkKLQkJZHF1b3RfY2xhaW1fYmxvY2soaW5vZGUsIHVzZWQpOworCQlkcXVvdF9jbGFpbV9ibG9jayhpbm9kZSwgRVhUNF9DMkIoc2JpLCB1c2VkKSk7CiAJZWxzZSB7CiAJCS8qCiAJCSAqIFdlIGRpZCBmYWxsb2NhdGUgd2l0aCBhbiBvZmZzZXQgdGhhdCBpcyBhbHJlYWR5IGRlbGF5ZWQKIAkJICogYWxsb2NhdGVkLiBTbyBvbiBkZWxheWVkIGFsbG9jYXRlZCB3cml0ZWJhY2sgd2Ugc2hvdWxkCiAJCSAqIG5vdCByZS1jbGFpbSB0aGUgcXVvdGEgZm9yIGZhbGxvY2F0ZWQgYmxvY2tzLgogCQkgKi8KLQkJZHF1b3RfcmVsZWFzZV9yZXNlcnZhdGlvbl9ibG9jayhpbm9kZSwgdXNlZCk7CisJCWRxdW90X3JlbGVhc2VfcmVzZXJ2YXRpb25fYmxvY2soaW5vZGUsIEVYVDRfQzJCKHNiaSwgdXNlZCkpOwogCX0KIAogCS8qCkBAIC0zOTksNiArMzk4LDQ5IEBACiB9CiAKIC8qCisgKiBTZXRzIHRoZSBCSF9EYV9NYXBwZWQgYml0IG9uIHRoZSBidWZmZXIgaGVhZHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbWFwLgorICovCitzdGF0aWMgdm9pZCBzZXRfYnVmZmVyc19kYV9tYXBwZWQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXApCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdldmVjIHB2ZWM7CisJaW50IGksIG5yX3BhZ2VzOworCXBnb2ZmX3QgaW5kZXgsIGVuZDsKKworCWluZGV4ID0gbWFwLT5tX2xibGsgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwllbmQgPSAobWFwLT5tX2xibGsgKyBtYXAtPm1fbGVuIC0gMSkgPj4KKwkJKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKworCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CisJd2hpbGUgKGluZGV4IDw9IGVuZCkgeworCQlucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBpbmRleCwKKwkJCQkJICBtaW4oZW5kIC0gaW5kZXggKyAxLAorCQkJCQkgICAgICAocGdvZmZfdClQQUdFVkVDX1NJWkUpKTsKKwkJaWYgKG5yX3BhZ2VzID09IDApCisJCQlicmVhazsKKwkJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCisJCQlpZiAodW5saWtlbHkocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSB8fAorCQkJICAgICFQYWdlRGlydHkocGFnZSkpCisJCQkJYnJlYWs7CisKKwkJCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCQkJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQkJCWRvIHsKKwkJCQkJc2V0X2J1ZmZlcl9kYV9tYXBwZWQoYmgpOworCQkJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJCQl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwkJCX0KKwkJCWluZGV4Kys7CisJCX0KKwkJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKKwl9Cit9CisKKy8qCiAgKiBUaGUgZXh0NF9tYXBfYmxvY2tzKCkgZnVuY3Rpb24gdHJpZXMgdG8gbG9vayB1cCB0aGUgcmVxdWVzdGVkIGJsb2NrcywKICAqIGFuZCByZXR1cm5zIGlmIHRoZSBibG9ja3MgYXJlIGFscmVhZHkgbWFwcGVkLgogICoKQEAgLTQxNiw3ICs0NTgsNyBAQAogICogdGhlIGJ1ZmZlciBoZWFkIGlzIG1hcHBlZC4KICAqCiAgKiBJdCByZXR1cm5zIDAgaWYgcGxhaW4gbG9vayB1cCBmYWlsZWQgKGJsb2NrcyBoYXZlIG5vdCBiZWVuIGFsbG9jYXRlZCksIGluCi0gKiB0aGF0IGNhc2VtLCBidWZmZXIgaGVhZCBpcyB1bm1hcHBlZAorICogdGhhdCBjYXNlLCBidWZmZXIgaGVhZCBpcyB1bm1hcHBlZAogICoKICAqIEl0IHJldHVybnMgdGhlIGVycm9yIGluIGNhc2Ugb2YgYWxsb2NhdGlvbiBmYWlsdXJlLgogICovCkBAIC00MzUsOSArNDc3LDExIEBACiAJICovCiAJZG93bl9yZWFkKCgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSkpOwogCWlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSkgewotCQlyZXR2YWwgPSBleHQ0X2V4dF9tYXBfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIG1hcCwgMCk7CisJCXJldHZhbCA9IGV4dDRfZXh0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgbWFwLCBmbGFncyAmCisJCQkJCSAgICAgRVhUNF9HRVRfQkxPQ0tTX0tFRVBfU0laRSk7CiAJfSBlbHNlIHsKLQkJcmV0dmFsID0gZXh0NF9pbmRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBtYXAsIDApOworCQlyZXR2YWwgPSBleHQ0X2luZF9tYXBfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIG1hcCwgZmxhZ3MgJgorCQkJCQkgICAgIEVYVDRfR0VUX0JMT0NLU19LRUVQX1NJWkUpOwogCX0KIAl1cF9yZWFkKCgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSkpOwogCkBAIC00NTUsNyArNDk5LDcgQEAKIAkgKiBSZXR1cm5zIGlmIHRoZSBibG9ja3MgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZAogCSAqCiAJICogTm90ZSB0aGF0IGlmIGJsb2NrcyBoYXZlIGJlZW4gcHJlYWxsb2NhdGVkCi0JICogZXh0NF9leHRfZ2V0X2Jsb2NrKCkgcmV0dXJucyB0aCBjcmVhdGUgPSAwCisJICogZXh0NF9leHRfZ2V0X2Jsb2NrKCkgcmV0dXJucyB0aGUgY3JlYXRlID0gMAogCSAqIHdpdGggYnVmZmVyIGhlYWQgdW5tYXBwZWQuCiAJICovCiAJaWYgKHJldHZhbCA+IDAgJiYgbWFwLT5tX2ZsYWdzICYgRVhUNF9NQVBfTUFQUEVEKQpAQCAtNTE3LDkgKzU2MSwxNyBAQAogCQkJKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpKQogCQkJZXh0NF9kYV91cGRhdGVfcmVzZXJ2ZV9zcGFjZShpbm9kZSwgcmV0dmFsLCAxKTsKIAl9Ci0JaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpCisJaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpIHsKIAkJZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9ERUxBTExPQ19SRVNFUlZFRCk7CiAKKwkJLyogSWYgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgbWFwcGVkIHRoZSBkZWxheWVkIGFsbG9jYXRlZCBibG9ja3MsCisJCSAqIHNldCB0aGUgQkhfRGFfTWFwcGVkIGJpdCBvbiB0aGVtLiBJdHMgaW1wb3J0YW50IHRvIGRvIHRoaXMKKwkJICogdW5kZXIgdGhlIHByb3RlY3Rpb24gb2YgaV9kYXRhX3NlbS4KKwkJICovCisJCWlmIChyZXR2YWwgPiAwICYmIG1hcC0+bV9mbGFncyAmIEVYVDRfTUFQX01BUFBFRCkKKwkJCXNldF9idWZmZXJzX2RhX21hcHBlZChpbm9kZSwgbWFwKTsKKwl9CisKIAl1cF93cml0ZSgoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pKTsKIAlpZiAocmV0dmFsID4gMCAmJiBtYXAtPm1fZmxhZ3MgJiBFWFQ0X01BUF9NQVBQRUQpIHsKIAkJaW50IHJldCA9IGNoZWNrX2Jsb2NrX3ZhbGlkaXR5KGlub2RlLCBtYXApOwpAQCAtOTA5LDcgKzk2MSwxMSBAQAogCQkJZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpOwogCQlpZiAocmV0MiA8IDApCiAJCQlyZXQgPSByZXQyOworCX0gZWxzZSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJfQorCiAJcmV0MiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHJldDI7CkBAIC0xMDM3LDE0ICsxMDkzLDE0IEBACiB9CiAKIC8qCi0gKiBSZXNlcnZlIGEgc2luZ2xlIGJsb2NrIGxvY2F0ZWQgYXQgbGJsb2NrCisgKiBSZXNlcnZlIGEgc2luZ2xlIGNsdXN0ZXIgbG9jYXRlZCBhdCBsYmxvY2sKICAqLwogc3RhdGljIGludCBleHQ0X2RhX3Jlc2VydmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsb2NrKQogewogCWludCByZXRyaWVzID0gMDsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7Ci0JdW5zaWduZWQgbG9uZyBtZF9uZWVkZWQ7CisJdW5zaWduZWQgaW50IG1kX25lZWRlZDsKIAlpbnQgcmV0OwogCiAJLyoKQEAgLTEwNTQsNyArMTExMCw4IEBACiAJICovCiByZXBlYXQ6CiAJc3Bpbl9sb2NrKCZlaS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKLQltZF9uZWVkZWQgPSBleHQ0X2NhbGNfbWV0YWRhdGFfYW1vdW50KGlub2RlLCBsYmxvY2spOworCW1kX25lZWRlZCA9IEVYVDRfTlVNX0IyQyhzYmksCisJCQkJIGV4dDRfY2FsY19tZXRhZGF0YV9hbW91bnQoaW5vZGUsIGxibG9jaykpOwogCXRyYWNlX2V4dDRfZGFfcmVzZXJ2ZV9zcGFjZShpbm9kZSwgbWRfbmVlZGVkKTsKIAlzcGluX3VubG9jaygmZWktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CiAKQEAgLTEwNjMsMTUgKzExMjAsMTUgQEAKIAkgKiB1cyBmcm9tIG1ldGFkYXRhIG92ZXItZXN0aW1hdGlvbiwgdGhvdWdoIHdlIG1heSBnbyBvdmVyIGJ5CiAJICogYSBzbWFsbCBhbW91bnQgaW4gdGhlIGVuZC4gIEhlcmUgd2UganVzdCByZXNlcnZlIGZvciBkYXRhLgogCSAqLwotCXJldCA9IGRxdW90X3Jlc2VydmVfYmxvY2soaW5vZGUsIDEpOworCXJldCA9IGRxdW90X3Jlc2VydmVfYmxvY2soaW5vZGUsIEVYVDRfQzJCKHNiaSwgMSkpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJLyoKIAkgKiBXZSBkbyBzdGlsbCBjaGFyZ2UgZXN0aW1hdGVkIG1ldGFkYXRhIHRvIHRoZSBzYiB0aG91Z2g7CiAJICogd2UgY2Fubm90IGFmZm9yZCB0byBydW4gb3V0IG9mIGZyZWUgYmxvY2tzLgogCSAqLwotCWlmIChleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHNiaSwgbWRfbmVlZGVkICsgMSwgMCkpIHsKLQkJZHF1b3RfcmVsZWFzZV9yZXNlcnZhdGlvbl9ibG9jayhpbm9kZSwgMSk7CisJaWYgKGV4dDRfY2xhaW1fZnJlZV9jbHVzdGVycyhzYmksIG1kX25lZWRlZCArIDEsIDApKSB7CisJCWRxdW90X3JlbGVhc2VfcmVzZXJ2YXRpb25fYmxvY2soaW5vZGUsIEVYVDRfQzJCKHNiaSwgMSkpOwogCQlpZiAoZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkgewogCQkJeWllbGQoKTsKIAkJCWdvdG8gcmVwZWF0OwpAQCAtMTExOCwxOSArMTE3NSwyMSBAQAogCQkgKiBXZSBjYW4gcmVsZWFzZSBhbGwgb2YgdGhlIHJlc2VydmVkIG1ldGFkYXRhIGJsb2NrcwogCQkgKiBvbmx5IHdoZW4gd2UgaGF2ZSB3cml0dGVuIGFsbCBvZiB0aGUgZGVsYXllZAogCQkgKiBhbGxvY2F0aW9uIGJsb2Nrcy4KKwkJICogTm90ZSB0aGF0IGluIGNhc2Ugb2YgYmlnYWxsb2MsIGlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MsCisJCSAqIGlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MsIGV0Yy4gcmVmZXIgdG8gbnVtYmVyIG9mIGNsdXN0ZXJzLgogCQkgKi8KLQkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwKKwkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyLAogCQkJCSAgIGVpLT5pX3Jlc2VydmVkX21ldGFfYmxvY2tzKTsKIAkJZWktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgPSAwOwogCQllaS0+aV9kYV9tZXRhZGF0YV9jYWxjX2xlbiA9IDA7CiAJfQogCiAJLyogdXBkYXRlIGZzIGRpcnR5IGRhdGEgYmxvY2tzIGNvdW50ZXIgKi8KLQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLCB0b19mcmVlKTsKKwlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsIHRvX2ZyZWUpOwogCiAJc3Bpbl91bmxvY2soJkVYVDRfSShpbm9kZSktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CiAKLQlkcXVvdF9yZWxlYXNlX3Jlc2VydmF0aW9uX2Jsb2NrKGlub2RlLCB0b19mcmVlKTsKKwlkcXVvdF9yZWxlYXNlX3Jlc2VydmF0aW9uX2Jsb2NrKGlub2RlLCBFWFQ0X0MyQihzYmksIHRvX2ZyZWUpKTsKIH0KIAogc3RhdGljIHZvaWQgZXh0NF9kYV9wYWdlX3JlbGVhc2VfcmVzZXJ2YXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsCkBAIC0xMTM5LDYgKzExOTgsOSBAQAogCWludCB0b19yZWxlYXNlID0gMDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaDsKIAl1bnNpZ25lZCBpbnQgY3Vycl9vZmYgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOworCWludCBudW1fY2x1c3RlcnM7CiAKIAloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCWJoID0gaGVhZDsKQEAgLTExNDgsMTAgKzEyMTAsMjQgQEAKIAkJaWYgKChvZmZzZXQgPD0gY3Vycl9vZmYpICYmIChidWZmZXJfZGVsYXkoYmgpKSkgewogCQkJdG9fcmVsZWFzZSsrOwogCQkJY2xlYXJfYnVmZmVyX2RlbGF5KGJoKTsKKwkJCWNsZWFyX2J1ZmZlcl9kYV9tYXBwZWQoYmgpOwogCQl9CiAJCWN1cnJfb2ZmID0gbmV4dF9vZmY7CiAJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKLQlleHQ0X2RhX3JlbGVhc2Vfc3BhY2UocGFnZS0+bWFwcGluZy0+aG9zdCwgdG9fcmVsZWFzZSk7CisKKwkvKiBJZiB3ZSBoYXZlIHJlbGVhc2VkIGFsbCB0aGUgYmxvY2tzIGJlbG9uZ2luZyB0byBhIGNsdXN0ZXIsIHRoZW4gd2UKKwkgKiBuZWVkIHRvIHJlbGVhc2UgdGhlIHJlc2VydmVkIHNwYWNlIGZvciB0aGF0IGNsdXN0ZXIuICovCisJbnVtX2NsdXN0ZXJzID0gRVhUNF9OVU1fQjJDKHNiaSwgdG9fcmVsZWFzZSk7CisJd2hpbGUgKG51bV9jbHVzdGVycyA+IDApIHsKKwkJZXh0NF9mc2Jsa190IGxibGs7CisJCWxibGsgPSAocGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKSkgKworCQkJKChudW1fY2x1c3RlcnMgLSAxKSA8PCBzYmktPnNfY2x1c3Rlcl9iaXRzKTsKKwkJaWYgKHNiaS0+c19jbHVzdGVyX3JhdGlvID09IDEgfHwKKwkJICAgICFleHQ0X2ZpbmRfZGVsYWxsb2NfY2x1c3Rlcihpbm9kZSwgbGJsaywgMSkpCisJCQlleHQ0X2RhX3JlbGVhc2Vfc3BhY2UoaW5vZGUsIDEpOworCisJCW51bV9jbHVzdGVycy0tOworCX0KIH0KIAogLyoKQEAgLTEyNTMsNiArMTMyOSw4IEBACiAJCQkJCQljbGVhcl9idWZmZXJfZGVsYXkoYmgpOwogCQkJCQkJYmgtPmJfYmxvY2tuciA9IHBibG9jazsKIAkJCQkJfQorCQkJCQlpZiAoYnVmZmVyX2RhX21hcHBlZChiaCkpCisJCQkJCQljbGVhcl9idWZmZXJfZGFfbWFwcGVkKGJoKTsKIAkJCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8CiAJCQkJCSAgICBidWZmZXJfbWFwcGVkKGJoKSkKIAkJCQkJCUJVR19PTihiaC0+Yl9ibG9ja25yICE9IHBibG9jayk7CkBAIC0xMzQ2LDEyICsxNDI0LDE1IEBACiB7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CiAJcHJpbnRrKEtFUk5fQ1JJVCAiVG90YWwgZnJlZSBibG9ja3MgY291bnQgJWxsZFxuIiwKLQkgICAgICAgZXh0NF9jb3VudF9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYikpOworCSAgICAgICBFWFQ0X0MyQihFWFQ0X1NCKGlub2RlLT5pX3NiKSwKKwkJCWV4dDRfY291bnRfZnJlZV9jbHVzdGVycyhpbm9kZS0+aV9zYikpKTsKIAlwcmludGsoS0VSTl9DUklUICJGcmVlL0RpcnR5IGJsb2NrIGRldGFpbHNcbiIpOwogCXByaW50ayhLRVJOX0NSSVQgImZyZWVfYmxvY2tzPSVsbGRcbiIsCi0JICAgICAgIChsb25nIGxvbmcpIHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcikpOworCSAgICAgICAobG9uZyBsb25nKSBFWFQ0X0MyQihFWFQ0X1NCKGlub2RlLT5pX3NiKSwKKwkJcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIpKSk7CiAJcHJpbnRrKEtFUk5fQ1JJVCAiZGlydHlfYmxvY2tzPSVsbGRcbiIsCi0JICAgICAgIChsb25nIGxvbmcpIHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIpKTsKKwkgICAgICAgKGxvbmcgbG9uZykgRVhUNF9DMkIoRVhUNF9TQihpbm9kZS0+aV9zYiksCisJCXBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlcikpKTsKIAlwcmludGsoS0VSTl9DUklUICJCbG9jayByZXNlcnZhdGlvbiBkZXRhaWxzXG4iKTsKIAlwcmludGsoS0VSTl9DUklUICJpX3Jlc2VydmVkX2RhdGFfYmxvY2tzPSV1XG4iLAogCSAgICAgICBFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzKTsKQEAgLTE0MzAsOCArMTUxMSw3IEBACiAJCWlmIChlcnIgPT0gLUVBR0FJTikKIAkJCWdvdG8gc3VibWl0X2lvOwogCi0JCWlmIChlcnIgPT0gLUVOT1NQQyAmJgotCQkgICAgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzYikpIHsKKwkJaWYgKGVyciA9PSAtRU5PU1BDICYmIGV4dDRfY291bnRfZnJlZV9jbHVzdGVycyhzYikpIHsKIAkJCW1wZC0+cmV0dmFsID0gZXJyOwogCQkJZ290byBzdWJtaXRfaW87CiAJCX0KQEAgLTE0NzEsMTMgKzE1NTEsMTUgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgbWFwLm1fbGVuOyBpKyspCiAJCQl1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJkZXYsIG1hcC5tX3BibGsgKyBpKTsKLQl9CiAKLQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShtcGQtPmlub2RlKSkgewotCQllcnIgPSBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIG1wZC0+aW5vZGUpOwotCQlpZiAoZXJyKQotCQkJLyogVGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIGpvdXJuYWwgaXMgYWJvcnRlZCAqLwotCQkJcmV0dXJuOworCQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShtcGQtPmlub2RlKSkgeworCQkJZXJyID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBtcGQtPmlub2RlKTsKKwkJCWlmIChlcnIpIHsKKwkJCQkvKiBPbmx5IGlmIHRoZSBqb3VybmFsIGlzIGFib3J0ZWQgKi8KKwkJCQltcGQtPnJldHZhbCA9IGVycjsKKwkJCQlnb3RvIHN1Ym1pdF9pbzsKKwkJCX0KKwkJfQogCX0KIAogCS8qCkBAIC0xNTg0LDYgKzE2NjYsNjYgQEAKIH0KIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZ3JhYnMgY29kZSBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZgorICogZXh0NF9tYXBfYmxvY2tzLCBidXQgYXNzdW1lcyB0aGF0IHRoZSBjYWxsZXIgaXMgZnJvbSBkZWxheWVkIHdyaXRlCisgKiB0aW1lLiBUaGlzIGZ1bmN0aW9uIGxvb2tzIHVwIHRoZSByZXF1ZXN0ZWQgYmxvY2tzIGFuZCBzZXRzIHRoZQorICogYnVmZmVyIGRlbGF5IGJpdCB1bmRlciB0aGUgcHJvdGVjdGlvbiBvZiBpX2RhdGFfc2VtLgorICovCitzdGF0aWMgaW50IGV4dDRfZGFfbWFwX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCisJCQkgICAgICBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsCisJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCByZXR2YWw7CisJc2VjdG9yX3QgaW52YWxpZF9ibG9jayA9IH4oKHNlY3Rvcl90KSAweGZmZmYpOworCisJaWYgKGludmFsaWRfYmxvY2sgPCBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcykpCisJCWludmFsaWRfYmxvY2sgPSB+MDsKKworCW1hcC0+bV9mbGFncyA9IDA7CisJZXh0X2RlYnVnKCJleHQ0X2RhX21hcF9ibG9ja3MoKTogaW5vZGUgJWx1LCBtYXhfYmxvY2tzICV1LCIKKwkJICAibG9naWNhbCBibG9jayAlbHVcbiIsIGlub2RlLT5pX2lubywgbWFwLT5tX2xlbiwKKwkJICAodW5zaWduZWQgbG9uZykgbWFwLT5tX2xibGspOworCS8qCisJICogVHJ5IHRvIHNlZSBpZiB3ZSBjYW4gZ2V0IHRoZSBibG9jayB3aXRob3V0IHJlcXVlc3RpbmcgYSBuZXcKKwkgKiBmaWxlIHN5c3RlbSBibG9jay4KKwkgKi8KKwlkb3duX3JlYWQoKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSk7CisJaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKQorCQlyZXR2YWwgPSBleHQ0X2V4dF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBtYXAsIDApOworCWVsc2UKKwkJcmV0dmFsID0gZXh0NF9pbmRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgbWFwLCAwKTsKKworCWlmIChyZXR2YWwgPT0gMCkgeworCQkvKgorCQkgKiBYWFg6IF9fYmxvY2tfcHJlcGFyZV93cml0ZSgpIHVubWFwcyBwYXNzZWQgYmxvY2ssCisJCSAqIGlzIGl0IE9LPworCQkgKi8KKwkJLyogSWYgdGhlIGJsb2NrIHdhcyBhbGxvY2F0ZWQgZnJvbSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjbHVzdGVyLAorCQkgKiB0aGVuIHdlIGRvbnQgbmVlZCB0byByZXNlcnZlIGl0IGFnYWluLiAqLworCQlpZiAoIShtYXAtPm1fZmxhZ3MgJiBFWFQ0X01BUF9GUk9NX0NMVVNURVIpKSB7CisJCQlyZXR2YWwgPSBleHQ0X2RhX3Jlc2VydmVfc3BhY2UoaW5vZGUsIGlibG9jayk7CisJCQlpZiAocmV0dmFsKQorCQkJCS8qIG5vdCBlbm91Z2ggc3BhY2UgdG8gcmVzZXJ2ZSAqLworCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCS8qIENsZWFyIEVYVDRfTUFQX0ZST01fQ0xVU1RFUiBmbGFnIHNpbmNlIGl0cyBwdXJwb3NlIGlzIHNlcnZlZAorCQkgKiBhbmQgaXQgc2hvdWxkIG5vdCBhcHBlYXIgb24gdGhlIGJoLT5iX3N0YXRlLgorCQkgKi8KKwkJbWFwLT5tX2ZsYWdzICY9IH5FWFQ0X01BUF9GUk9NX0NMVVNURVI7CisKKwkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgaW52YWxpZF9ibG9jayk7CisJCXNldF9idWZmZXJfbmV3KGJoKTsKKwkJc2V0X2J1ZmZlcl9kZWxheShiaCk7CisJfQorCitvdXRfdW5sb2NrOgorCXVwX3JlYWQoKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgogICogVGhpcyBpcyBhIHNwZWNpYWwgZ2V0X2Jsb2Nrc190IGNhbGxiYWNrIHdoaWNoIGlzIHVzZWQgYnkKICAqIGV4dDRfZGFfd3JpdGVfYmVnaW4oKS4gIEl0IHdpbGwgZWl0aGVyIHJldHVybiBtYXBwZWQgYmxvY2sgb3IKICAqIHJlc2VydmUgc3BhY2UgZm9yIGEgc2luZ2xlIGJsb2NrLgpAQCAtMTYwMCwxMCArMTc0Miw2IEBACiB7CiAJc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7CiAJaW50IHJldCA9IDA7Ci0Jc2VjdG9yX3QgaW52YWxpZF9ibG9jayA9IH4oKHNlY3Rvcl90KSAweGZmZmYpOwotCi0JaWYgKGludmFsaWRfYmxvY2sgPCBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcykpCi0JCWludmFsaWRfYmxvY2sgPSB+MDsKIAogCUJVR19PTihjcmVhdGUgPT0gMCk7CiAJQlVHX09OKGJoLT5iX3NpemUgIT0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKQEAgLTE2MTYsMjUgKzE3NTQsOSBAQAogCSAqIHByZWFsbG9jYXRlZCBibG9ja3MgYXJlIHVubWFwcGVkIGJ1dCBzaG91bGQgdHJlYXRlZAogCSAqIHRoZSBzYW1lIGFzIGFsbG9jYXRlZCBibG9ja3MuCiAJICovCi0JcmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCAmbWFwLCAwKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBleHQ0X2RhX21hcF9ibG9ja3MoaW5vZGUsIGlibG9jaywgJm1hcCwgYmgpOworCWlmIChyZXQgPD0gMCkKIAkJcmV0dXJuIHJldDsKLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKGJ1ZmZlcl9kZWxheShiaCkpCi0JCQlyZXR1cm4gMDsgLyogTm90IHN1cmUgdGhpcyBjb3VsZCBvciBzaG91bGQgaGFwcGVuICovCi0JCS8qCi0JCSAqIFhYWDogX19ibG9ja193cml0ZV9iZWdpbigpIHVubWFwcyBwYXNzZWQgYmxvY2ssIGlzIGl0IE9LPwotCQkgKi8KLQkJcmV0ID0gZXh0NF9kYV9yZXNlcnZlX3NwYWNlKGlub2RlLCBpYmxvY2spOwotCQlpZiAocmV0KQotCQkJLyogbm90IGVub3VnaCBzcGFjZSB0byByZXNlcnZlICovCi0JCQlyZXR1cm4gcmV0OwotCi0JCW1hcF9iaChiaCwgaW5vZGUtPmlfc2IsIGludmFsaWRfYmxvY2spOwotCQlzZXRfYnVmZmVyX25ldyhiaCk7Ci0JCXNldF9idWZmZXJfZGVsYXkoYmgpOwotCQlyZXR1cm4gMDsKLQl9CiAKIAltYXBfYmgoYmgsIGlub2RlLT5pX3NiLCBtYXAubV9wYmxrKTsKIAliaC0+Yl9zdGF0ZSA9IChiaC0+Yl9zdGF0ZSAmIH5FWFQ0X01BUF9GTEFHUykgfCBtYXAubV9mbGFnczsKQEAgLTE4MTEsOCArMTkzMywxMiBAQAogCQkgKiBXZSBkb24ndCB3YW50IHRvIGRvIGJsb2NrIGFsbG9jYXRpb24sIHNvIHJlZGlydHkKIAkJICogdGhlIHBhZ2UgYW5kIHJldHVybi4gIFdlIG1heSByZWFjaCBoZXJlIHdoZW4gd2UgZG8KIAkJICogYSBqb3VybmFsIGNvbW1pdCB2aWEgam91cm5hbF9zdWJtaXRfaW5vZGVfZGF0YV9idWZmZXJzLgotCQkgKiBXZSBjYW4gYWxzbyByZWFjaCBoZXJlIHZpYSBzaHJpbmtfcGFnZV9saXN0CisJCSAqIFdlIGNhbiBhbHNvIHJlYWNoIGhlcmUgdmlhIHNocmlua19wYWdlX2xpc3QgYnV0IGl0CisJCSAqIHNob3VsZCBuZXZlciBiZSBmb3IgZGlyZWN0IHJlY2xhaW0gc28gd2FybiBpZiB0aGF0CisJCSAqIGhhcHBlbnMKIAkJICovCisJCVdBUk5fT05fT05DRSgoY3VycmVudC0+ZmxhZ3MgJiAoUEZfTUVNQUxMT0N8UEZfS1NXQVBEKSkgPT0KKwkJCQkJCQkJUEZfTUVNQUxMT0MpOwogCQlnb3RvIHJlZGlydHlfcGFnZTsKIAl9CiAJaWYgKGNvbW1pdF93cml0ZSkKQEAgLTIwNDYsNiArMjE3Miw3IEBACiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihtYXBwaW5nLT5ob3N0LT5pX3NiKTsKIAlwZ29mZl90IGRvbmVfaW5kZXggPSAwOwogCXBnb2ZmX3QgZW5kOworCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCiAJdHJhY2VfZXh0NF9kYV93cml0ZXBhZ2VzKGlub2RlLCB3YmMpOwogCkBAIC0yMTI0LDYgKzIyNTEsNyBAQAogCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCB8fCB3YmMtPnRhZ2dlZF93cml0ZXBhZ2VzKQogCQl0YWdfcGFnZXNfZm9yX3dyaXRlYmFjayhtYXBwaW5nLCBpbmRleCwgZW5kKTsKIAorCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKIAl3aGlsZSAoIXJldCAmJiB3YmMtPm5yX3RvX3dyaXRlID4gMCkgewogCiAJCS8qCkBAIC0yMTc0LDExICsyMzAyLDEyIEBACiAJCQlyZXQgPSAwOwogCQl9IGVsc2UgaWYgKHJldCA9PSBNUEFHRV9EQV9FWFRFTlRfVEFJTCkgewogCQkJLyoKLQkJCSAqIGdvdCBvbmUgZXh0ZW50IG5vdyB0cnkgd2l0aAotCQkJICogcmVzdCBvZiB0aGUgcGFnZXMKKwkJCSAqIEdvdCBvbmUgZXh0ZW50IG5vdyB0cnkgd2l0aCByZXN0IG9mIHRoZSBwYWdlcy4KKwkJCSAqIElmIG1wZC5yZXR2YWwgaXMgc2V0IC1FSU8sIGpvdXJuYWwgaXMgYWJvcnRlZC4KKwkJCSAqIFNvIHdlIGRvbid0IG5lZWQgdG8gd3JpdGUgYW55IG1vcmUuCiAJCQkgKi8KIAkJCXBhZ2VzX3dyaXR0ZW4gKz0gbXBkLnBhZ2VzX3dyaXR0ZW47Ci0JCQlyZXQgPSAwOworCQkJcmV0ID0gbXBkLnJldHZhbDsKIAkJCWlvX2RvbmUgPSAxOwogCQl9IGVsc2UgaWYgKHdiYy0+bnJfdG9fd3JpdGUpCiAJCQkvKgpAQCAtMjE4OCw2ICsyMzE3LDcgQEAKIAkJCSAqLwogCQkJYnJlYWs7CiAJfQorCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAJaWYgKCFpb19kb25lICYmICFjeWNsZWQpIHsKIAkJY3ljbGVkID0gMTsKIAkJaW5kZXggPSAwOwpAQCAtMjIyNiwxMCArMjM1NiwxMSBAQAogCSAqIERlbGFsbG9jIG5lZWQgYW4gYWNjdXJhdGUgZnJlZSBibG9jayBhY2NvdW50aW5nLiBTbyBzd2l0Y2gKIAkgKiB0byBub24gZGVsYWxsb2Mgd2hlbiB3ZSBhcmUgbmVhciB0byBlcnJvciByYW5nZS4KIAkgKi8KLQlmcmVlX2Jsb2NrcyAgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKLQlkaXJ0eV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcik7CisJZnJlZV9ibG9ja3MgID0gRVhUNF9DMkIoc2JpLAorCQlwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIpKTsKKwlkaXJ0eV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyKTsKIAlpZiAoMiAqIGZyZWVfYmxvY2tzIDwgMyAqIGRpcnR5X2Jsb2NrcyB8fAotCQlmcmVlX2Jsb2NrcyA8IChkaXJ0eV9ibG9ja3MgKyBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLKSkgeworCQlmcmVlX2Jsb2NrcyA8IChkaXJ0eV9ibG9ja3MgKyBFWFQ0X0ZSRUVDTFVTVEVSU19XQVRFUk1BUkspKSB7CiAJCS8qCiAJCSAqIGZyZWUgYmxvY2sgY291bnQgaXMgbGVzcyB0aGFuIDE1MCUgb2YgZGlydHkgYmxvY2tzCiAJCSAqIG9yIGZyZWUgYmxvY2tzIGlzIGxlc3MgdGhhbiB3YXRlcm1hcmsKQEAgLTIyNDEsNyArMjM3Miw3IEBACiAJICogc3RhcnQgcHVzaGluZyBkZWxhbGxvYyB3aGVuIDEvMiBvZiBmcmVlIGJsb2NrcyBhcmUgZGlydHkuCiAJICovCiAJaWYgKGZyZWVfYmxvY2tzIDwgMiAqIGRpcnR5X2Jsb2NrcykKLQkJd3JpdGViYWNrX2lub2Rlc19zYl9pZl9pZGxlKHNiKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYl9pZl9pZGxlKHNiLCBXQl9SRUFTT05fRlNfRlJFRV9TUEFDRSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIyNTUsNiArMjM4Niw3IEBACiAJcGdvZmZfdCBpbmRleDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAloYW5kbGVfdCAqaGFuZGxlOworCWxvZmZfdCBwYWdlX2xlbjsKIAogCWluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKQEAgLTIzMDEsNiArMjQzMywxMyBAQAogCQkgKi8KIAkJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCiAJCQlleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7CisJfSBlbHNlIHsKKwkJcGFnZV9sZW4gPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCWlmIChwYWdlX2xlbiA+IDApIHsKKwkJCXJldCA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrKGhhbmRsZSwKKwkJCQlpbm9kZSwgcGFnZSwgcG9zIC0gcGFnZV9sZW4sIHBhZ2VfbGVuLAorCQkJCUVYVDRfRElTQ0FSRF9QQVJUSUFMX1BHX1pFUk9fVU5NQVBQRUQpOworCQl9CiAJfQogCiAJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCkBAIC0yMzQzLDYgKzI0ODIsNyBAQAogCWxvZmZfdCBuZXdfaV9zaXplOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKIAlpbnQgd3JpdGVfbW9kZSA9IChpbnQpKHVuc2lnbmVkIGxvbmcpZnNkYXRhOworCWxvZmZfdCBwYWdlX2xlbjsKIAogCWlmICh3cml0ZV9tb2RlID09IEZBTExfQkFDS19UT19OT05ERUxBTExPQykgewogCQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKQEAgLTIzOTEsNiArMjUzMSwxNiBAQAogCX0KIAlyZXQyID0gZ2VuZXJpY193cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCBsZW4sIGNvcGllZCwKIAkJCQkJCQlwYWdlLCBmc2RhdGEpOworCisJcGFnZV9sZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLQorCQkJKChwb3MgKyBjb3BpZWQgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisKKwlpZiAocGFnZV9sZW4gPiAwKSB7CisJCXJldCA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrKGhhbmRsZSwKKwkJCWlub2RlLCBwYWdlLCBwb3MgKyBjb3BpZWQgLSAxLCBwYWdlX2xlbiwKKwkJCUVYVDRfRElTQ0FSRF9QQVJUSUFMX1BHX1pFUk9fVU5NQVBQRUQpOworCX0KKwogCWNvcGllZCA9IHJldDI7CiAJaWYgKHJldDIgPCAwKQogCQlyZXQgPSByZXQyOwpAQCAtMjY4NSwxMCArMjgzNSw3IEBACiAJICogYnV0IGJlaW5nIG1vcmUgY2FyZWZ1bCBpcyBhbHdheXMgc2FmZSBmb3IgdGhlIGZ1dHVyZSBjaGFuZ2UuCiAJICovCiAJaW5vZGUgPSBpb19lbmQtPmlub2RlOwotCWlmICghKGlvX2VuZC0+ZmxhZyAmIEVYVDRfSU9fRU5EX1VOV1JJVFRFTikpIHsKLQkJaW9fZW5kLT5mbGFnIHw9IEVYVDRfSU9fRU5EX1VOV1JJVFRFTjsKLQkJYXRvbWljX2luYygmRVhUNF9JKGlub2RlKS0+aV9haW9kaW9fdW53cml0dGVuKTsKLQl9CisJZXh0NF9zZXRfaW9fdW53cml0dGVuX2ZsYWcoaW5vZGUsIGlvX2VuZCk7CiAKIAkvKiBBZGQgdGhlIGlvX2VuZCB0byBwZXItaW5vZGUgY29tcGxldGVkIGlvIGxpc3QqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZFWFQ0X0koaW5vZGUpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7CkBAIC0yODU0LDYgKzMwMDEsMTIgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCXNzaXplX3QgcmV0OwogCisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgZGF0YSBqb3VybmFsbGluZyB3ZSBkb24ndCBzdXBwb3J0IE9fRElSRUNUCisJICovCisJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpCisJCXJldHVybiAwOworCiAJdHJhY2VfZXh0NF9kaXJlY3RfSU9fZW50ZXIoaW5vZGUsIG9mZnNldCwgaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpLCBydyk7CiAJaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKQogCQlyZXQgPSBleHQ0X2V4dF9kaXJlY3RfSU8ocncsIGlvY2IsIGlvdiwgb2Zmc2V0LCBucl9zZWdzKTsKQEAgLTI5MjMsNiArMzA3Niw3IEBACiAJLmJtYXAJCQk9IGV4dDRfYm1hcCwKIAkuaW52YWxpZGF0ZXBhZ2UJCT0gZXh0NF9pbnZhbGlkYXRlcGFnZSwKIAkucmVsZWFzZXBhZ2UJCT0gZXh0NF9yZWxlYXNlcGFnZSwKKwkuZGlyZWN0X0lPCQk9IGV4dDRfZGlyZWN0X0lPLAogCS5pc19wYXJ0aWFsbHlfdXB0b2RhdGUgID0gYmxvY2tfaXNfcGFydGlhbGx5X3VwdG9kYXRlLAogCS5lcnJvcl9yZW1vdmVfcGFnZQk9IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UsCiB9OwpAQCAtMjk1OSw2ICszMTEzLDIyNyBAQAogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQ0X2pvdXJuYWxsZWRfYW9wczsKIH0KIAorCisvKgorICogZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzKCkKKyAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrLgorICogVGhpcyBmdW5jdGlvbiBmaW5kcyBhbmQgbG9ja3MgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgb2Zmc2V0CisgKiAiZnJvbSIgYW5kIHBhc3NlcyBpdCB0byBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnNfbm9fbG9jay4KKyAqIENhbGxpbmcgZnVuY3Rpb25zIHRoYXQgYWxyZWFkeSBoYXZlIHRoZSBwYWdlIGxvY2tlZCBzaG91bGQgY2FsbAorICogZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzX25vX2xvY2sgZGlyZWN0bHkuCisgKi8KK2ludCBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnMoaGFuZGxlX3QgKmhhbmRsZSwKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBmcm9tLAorCQlsb2ZmX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGVyciA9IDA7CisKKwlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCBmcm9tID4+IFBBR0VfQ0FDSEVfU0hJRlQsCisJCQkJICAgbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmIH5fX0dGUF9GUyk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrKGhhbmRsZSwgaW5vZGUsIHBhZ2UsCisJCWZyb20sIGxlbmd0aCwgZmxhZ3MpOworCisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnNfbm9fbG9jaygpCisgKiBaZXJvcyBhIHBhZ2UgcmFuZ2Ugb2YgbGVuZ3RoICdsZW5ndGgnIHN0YXJ0aW5nIGZyb20gb2Zmc2V0ICdmcm9tJy4KKyAqIEJ1ZmZlciBoZWFkcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGJsb2NrIGFsaWduZWQgcmVnaW9ucyBvZiB0aGUKKyAqIHplcm9lZCByYW5nZSB3aWxsIGJlIHVubWFwcGVkLiAgVW5ibG9jayBhbGlnbmVkIHJlZ2lvbnMKKyAqIHdpbGwgaGF2ZSB0aGUgY29ycmVzcG9uZGluZyBidWZmZXIgaGVhZCBtYXBwZWQgaWYgbmVlZGVkIHNvIHRoYXQKKyAqIHRoYXQgcmVnaW9uIG9mIHRoZSBwYWdlIGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIHBhcnRpYWwgemVybyBvdXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHBhZ2UgaGFzIGFscmVhZHkgYmVlbiAgbG9ja2VkLiAgVGhlCisgKiBUaGUgcmFuZ2UgdG8gYmUgZGlzY2FyZGVkIG11c3QgYmUgY29udGFpbmVkIHdpdGggaW4gdGhlIGdpdmVuIHBhZ2UuCisgKiBJZiB0aGUgc3BlY2lmaWVkIHJhbmdlIGV4Y2VlZHMgdGhlIGVuZCBvZiB0aGUgcGFnZSBpdCB3aWxsIGJlIHNob3J0ZW5lZAorICogdG8gdGhlIGVuZCBvZiB0aGUgcGFnZSB0aGF0IGNvcnJlc3BvbmRzIHRvICdmcm9tJy4gIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGFwcHJvcHJpYXRlIGZvciB1cGRhdGluZyBhIHBhZ2UgYW5kIGl0IGJ1ZmZlciBoZWFkcyB0byBiZSB1bm1hcHBlZCBhbmQKKyAqIHplcm9lZCBmb3IgYmxvY2tzIHRoYXQgaGF2ZSBiZWVuIGVpdGhlciByZWxlYXNlZCwgb3IgYXJlIGdvaW5nIHRvIGJlCisgKiByZWxlYXNlZC4KKyAqCisgKiBoYW5kbGU6IFRoZSBqb3VybmFsIGhhbmRsZQorICogaW5vZGU6ICBUaGUgZmlsZXMgaW5vZGUKKyAqIHBhZ2U6ICAgQSBsb2NrZWQgcGFnZSB0aGF0IGNvbnRhaW5zIHRoZSBvZmZzZXQgImZyb20iCisgKiBmcm9tOiAgIFRoZSBzdGFydGluZyBieXRlIG9mZnNldCAoZnJvbSB0aGUgYmVnaW5pbmcgb2YgdGhlIGZpbGUpCisgKiAgICAgICAgIHRvIGJlZ2luIGRpc2NhcmRpbmcKKyAqIGxlbjogICAgVGhlIGxlbmd0aCBvZiBieXRlcyB0byBkaXNjYXJkCisgKiBmbGFnczogIE9wdGlvbmFsIGZsYWdzIHRoYXQgbWF5IGJlIHVzZWQ6CisgKgorICogICAgICAgICBFWFQ0X0RJU0NBUkRfUEFSVElBTF9QR19aRVJPX1VOTUFQUEVECisgKiAgICAgICAgIE9ubHkgemVybyB0aGUgcmVnaW9ucyBvZiB0aGUgcGFnZSB3aG9zZSBidWZmZXIgaGVhZHMKKyAqICAgICAgICAgaGF2ZSBhbHJlYWR5IGJlZW4gdW5tYXBwZWQuICBUaGlzIGZsYWcgaXMgYXBwcm9wcmlhdGUKKyAqICAgICAgICAgZm9yIHVwZGF0ZWluZyB0aGUgY29udGVudHMgb2YgYSBwYWdlIHdob3NlIGJsb2NrcyBtYXkKKyAqICAgICAgICAgaGF2ZSBhbHJlYWR5IGJlZW4gcmVsZWFzZWQsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gemVybworICogICAgICAgICBvdXQgdGhlIHJlZ2lvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRob3NlIHJlbGVhc2VkIGJsb2Nrcy4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjZXNzIG9yIG5lZ2F0aXZlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnNfbm9fbG9jayhoYW5kbGVfdCAqaGFuZGxlLAorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9mZl90IGZyb20sCisJCWxvZmZfdCBsZW5ndGgsIGludCBmbGFncykKK3sKKwlleHQ0X2ZzYmxrX3QgaW5kZXggPSBmcm9tID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGZyb20gJiAoUEFHRV9DQUNIRV9TSVpFLTEpOworCXVuc2lnbmVkIGludCBibG9ja3NpemUsIG1heCwgcG9zOworCWV4dDRfbGJsa190IGlibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBlcnIgPSAwOworCisJYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCW1heCA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKKworCWlmIChpbmRleCAhPSBwYWdlLT5pbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIGNvcnJlY3QgbGVuZ3RoIGlmIGl0IGRvZXMgbm90IGZhbGwgYmV0d2VlbgorCSAqICdmcm9tJyBhbmQgdGhlIGVuZCBvZiB0aGUgcGFnZQorCSAqLworCWlmIChsZW5ndGggPiBtYXggfHwgbGVuZ3RoIDwgMCkKKwkJbGVuZ3RoID0gbWF4OworCisJaWJsb2NrID0gaW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJLyoKKwkJICogSWYgdGhlIHJhbmdlIHRvIGJlIGRpc2NhcmRlZCBjb3ZlcnMgYSBwYXJ0aWFsIGJsb2NrCisJCSAqIHdlIG5lZWQgdG8gZ2V0IHRoZSBwYWdlIGJ1ZmZlcnMuICBUaGlzIGlzIGJlY2F1c2UKKwkJICogcGFydGlhbCBibG9ja3MgY2Fubm90IGJlIHJlbGVhc2VkIGFuZCB0aGUgcGFnZSBuZWVkcworCQkgKiB0byBiZSB1cGRhdGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9jayBiZWZvcmUKKwkJICogd2Ugd3JpdGUgdGhlIHplcm9zIG9uIHRvcCBvZiBpdC4KKwkJICovCisJCWlmICgoZnJvbSAmIChibG9ja3NpemUgLSAxKSkgfHwKKwkJICAgICgoZnJvbSArIGxlbmd0aCkgJiAoYmxvY2tzaXplIC0gMSkpKSB7CisJCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDApOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBubyBwYXJ0aWFsIGJsb2NrcywKKwkJCSAqIHRoZXJlIGlzIG5vdGhpbmcgdG8gdXBkYXRlLAorCQkJICogc28gd2UgY2FuIHJldHVybiBub3cKKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBGaW5kIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyAib2Zmc2V0IiAqLworCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCXBvcyA9IGJsb2Nrc2l6ZTsKKwl3aGlsZSAob2Zmc2V0ID49IHBvcykgeworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJaWJsb2NrKys7CisJCXBvcyArPSBibG9ja3NpemU7CisJfQorCisJcG9zID0gb2Zmc2V0OworCXdoaWxlIChwb3MgPCBvZmZzZXQgKyBsZW5ndGgpIHsKKwkJdW5zaWduZWQgaW50IGVuZF9vZl9ibG9jaywgcmFuZ2VfdG9fZGlzY2FyZDsKKworCQllcnIgPSAwOworCisJCS8qIFRoZSBsZW5ndGggb2Ygc3BhY2UgbGVmdCB0byB6ZXJvIGFuZCB1bm1hcCAqLworCQlyYW5nZV90b19kaXNjYXJkID0gb2Zmc2V0ICsgbGVuZ3RoIC0gcG9zOworCisJCS8qIFRoZSBsZW5ndGggb2Ygc3BhY2UgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KKwkJZW5kX29mX2Jsb2NrID0gYmxvY2tzaXplIC0gKHBvcyAmIChibG9ja3NpemUtMSkpOworCisJCS8qCisJCSAqIERvIG5vdCB1bm1hcCBvciB6ZXJvIHBhc3QgZW5kIG9mIGJsb2NrCisJCSAqIGZvciB0aGlzIGJ1ZmZlciBoZWFkCisJCSAqLworCQlpZiAocmFuZ2VfdG9fZGlzY2FyZCA+IGVuZF9vZl9ibG9jaykKKwkJCXJhbmdlX3RvX2Rpc2NhcmQgPSBlbmRfb2ZfYmxvY2s7CisKKworCQkvKgorCQkgKiBTa2lwIHRoaXMgYnVmZmVyIGhlYWQgaWYgd2UgYXJlIG9ubHkgemVyb2luZyB1bmFtcHBlZAorCQkgKiByZWdpb25zIG9mIHRoZSBwYWdlCisJCSAqLworCQlpZiAoZmxhZ3MgJiBFWFQ0X0RJU0NBUkRfUEFSVElBTF9QR19aRVJPX1VOTUFQUEVEICYmCisJCQlidWZmZXJfbWFwcGVkKGJoKSkKKwkJCQlnb3RvIG5leHQ7CisKKwkJLyogSWYgdGhlIHJhbmdlIGlzIGJsb2NrIGFsaWduZWQsIHVubWFwICovCisJCWlmIChyYW5nZV90b19kaXNjYXJkID09IGJsb2Nrc2l6ZSkgeworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCWJoLT5iX2JkZXYgPSBOVUxMOworCQkJY2xlYXJfYnVmZmVyX21hcHBlZChiaCk7CisJCQljbGVhcl9idWZmZXJfcmVxKGJoKTsKKwkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQkJY2xlYXJfYnVmZmVyX2RlbGF5KGJoKTsKKwkJCWNsZWFyX2J1ZmZlcl91bndyaXR0ZW4oYmgpOworCQkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCXplcm9fdXNlcihwYWdlLCBwb3MsIHJhbmdlX3RvX2Rpc2NhcmQpOworCQkJQlVGRkVSX1RSQUNFKGJoLCAiQnVmZmVyIGRpc2NhcmRlZCIpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJLyoKKwkJICogSWYgdGhpcyBibG9jayBpcyBub3QgY29tcGxldGVseSBjb250YWluZWQgaW4gdGhlIHJhbmdlCisJCSAqIHRvIGJlIGRpc2NhcmRlZCwgdGhlbiBpdCBpcyBub3QgZ29pbmcgdG8gYmUgcmVsZWFzZWQuIEJlY2F1c2UKKwkJICogd2UgbmVlZCB0byBrZWVwIHRoaXMgYmxvY2ssIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgcGFydAorCQkgKiBvZiB0aGUgcGFnZSBpcyB1cHRvZGF0ZSBiZWZvcmUgd2UgbW9kaWZ5IGl0IGJ5IHdyaXRlaW5nCisJCSAqIHBhcnRpYWwgemVyb3Mgb24gaXQuCisJCSAqLworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCQkvKgorCQkJICogQnVmZmVyIGhlYWQgbXVzdCBiZSBtYXBwZWQgYmVmb3JlIHdlIGNhbiByZWFkCisJCQkgKiBmcm9tIHRoZSBibG9jaworCQkJICovCisJCQlCVUZGRVJfVFJBQ0UoYmgsICJ1bm1hcHBlZCIpOworCQkJZXh0NF9nZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmgsIDApOworCQkJLyogdW5tYXBwZWQ/IEl0J3MgYSBob2xlIC0gbm90aGluZyB0byBkbyAqLworCQkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQkJCUJVRkZFUl9UUkFDRShiaCwgInN0aWxsIHVubWFwcGVkIik7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisKKwkJLyogT2ssIGl0J3MgbWFwcGVkLiBNYWtlIHN1cmUgaXQncyB1cC10by1kYXRlICovCisJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCWVyciA9IC1FSU87CisJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJLyogVWhodWguIFJlYWQgZXJyb3IuIENvbXBsYWluIGFuZCBwdW50LiovCisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJZ290byBuZXh0OworCQl9CisKKwkJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImdldCB3cml0ZSBhY2Nlc3MiKTsKKwkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG5leHQ7CisJCX0KKworCQl6ZXJvX3VzZXIocGFnZSwgcG9zLCByYW5nZV90b19kaXNjYXJkKTsKKworCQllcnIgPSAwOworCQlpZiAoZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgeworCQkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOworCQl9IGVsc2UKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKworCQlCVUZGRVJfVFJBQ0UoYmgsICJQYXJ0aWFsIGJ1ZmZlciB6ZXJvZWQiKTsKK25leHQ6CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQlpYmxvY2srKzsKKwkJcG9zICs9IHJhbmdlX3RvX2Rpc2NhcmQ7CisJfQorCisJcmV0dXJuIGVycjsKK30KKwogLyoKICAqIGV4dDRfYmxvY2tfdHJ1bmNhdGVfcGFnZSgpIHplcm9lcyBvdXQgYSBtYXBwaW5nIGZyb20gZmlsZSBvZmZzZXQgYGZyb20nCiAgKiB1cCB0byB0aGUgZW5kIG9mIHRoZSBibG9jayB3aGljaCBjb3JyZXNwb25kcyB0byBgZnJvbScuCkBAIC0zMDAxLDcgKzMzNzYsNyBAQAogCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKG1hcHBpbmcsIGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVCwKIAkJCQkgICBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICYgfl9fR0ZQX0ZTKTsKIAlpZiAoIXBhZ2UpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVOT01FTTsKIAogCWJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAltYXggPSBibG9ja3NpemUgLSAob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKTsKQEAgLTMwNzAsMTEgKzM0NDUsOCBAQAogCWVyciA9IDA7CiAJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKIAkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwotCX0gZWxzZSB7Ci0JCWlmIChleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSAmJiBFWFQ0X0koaW5vZGUpLT5qaW5vZGUpCi0JCQllcnIgPSBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKKwl9IGVsc2UKIAkJbWFya19idWZmZXJfZGlydHkoYmgpOwotCX0KIAogdW5sb2NrOgogCXVubG9ja19wYWdlKHBhZ2UpOwpAQCAtMzExNSw2ICszNDg3LDExIEBACiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCisJaWYgKEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2NsdXN0ZXJfcmF0aW8gPiAxKSB7CisJCS8qIFRPRE86IEFkZCBzdXBwb3J0IGZvciBiaWdhbGxvYyBmaWxlIHN5c3RlbXMgKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKIAlyZXR1cm4gZXh0NF9leHRfcHVuY2hfaG9sZShmaWxlLCBvZmZzZXQsIGxlbmd0aCk7CiB9CiAKQEAgLTM0MTQsNyArMzc5MSw3IEBACiAJCWlub2RlLT5pX3VpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2hpZ2gpIDw8IDE2OwogCQlpbm9kZS0+aV9naWQgfD0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2dpZF9oaWdoKSA8PCAxNjsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbGlua3NfY291bnQpOworCXNldF9ubGluayhpbm9kZSwgbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2xpbmtzX2NvdW50KSk7CiAKIAlleHQ0X2NsZWFyX3N0YXRlX2ZsYWdzKGVpKTsJLyogT25seSByZWxldmFudCBvbiAzMi1iaXQgYXJjaHMgKi8KIAllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKQEAgLTQ0MTYsNiArNDc5Myw3IEBACiAJCQkgIFBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgZG9fam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKSkgewogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCQlyZXQgPSBWTV9GQVVMVF9TSUdCVVM7CisJCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfSkRBVEEpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pb2N0bC5jIGIvZnMvZXh0NC9pb2N0bC5jCmluZGV4IGYxOGJmZTMuLmE1Njc5NjggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW9jdGwuYworKysgYi9mcy9leHQ0L2lvY3RsLmMKQEAgLTIxLDYgKzIxLDcgQEAKIGxvbmcgZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CiAJdW5zaWduZWQgaW50IGZsYWdzOwogCkBAIC0xNzMsMzMgKzE3NCw4IEBACiAJCW1udF9kcm9wX3dyaXRlKGZpbHAtPmZfcGF0aC5tbnQpOwogCQlyZXR1cm4gZXJyOwogCX0KLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotCWNhc2UgRVhUNF9JT0NfV0FJVF9GT1JfUkVBRE9OTFk6Ci0JCS8qCi0JCSAqIFRoaXMgaXMgcmFjeSAtIGJ5IHRoZSB0aW1lIHdlJ3JlIHdva2VuIHVwIGFuZCBydW5uaW5nLAotCQkgKiB0aGUgc3VwZXJibG9jayBjb3VsZCBiZSByZWxlYXNlZC4gIEFuZCB0aGUgbW9kdWxlIGNvdWxkCi0JCSAqIGhhdmUgYmVlbiB1bmxvYWRlZC4gIFNvIHN1ZSBtZS4KLQkJICoKLQkJICogUmV0dXJucyAxIGlmIGl0IHNsZXB0LCBlbHNlIHplcm8uCi0JCSAqLwotCQl7Ci0JCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7Ci0JCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQkJCWludCByZXQgPSAwOwotCi0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJYWRkX3dhaXRfcXVldWUoJkVYVDRfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQlpZiAodGltZXJfcGVuZGluZygmRVhUNF9TQihzYiktPnR1cm5fcm9fdGltZXIpKSB7Ci0JCQkJc2NoZWR1bGUoKTsKLQkJCQlyZXQgPSAxOwotCQkJfQotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJkVYVDRfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0jZW5kaWYKIAljYXNlIEVYVDRfSU9DX0dST1VQX0VYVEVORDogewogCQlleHQ0X2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQ7Ci0JCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAkJaW50IGVyciwgZXJyMj0wOwogCiAJCWVyciA9IGV4dDRfcmVzaXplX2JlZ2luKHNiKTsKQEAgLTIwOSw2ICsxODUsMTMgQEAKIAkJaWYgKGdldF91c2VyKG5fYmxvY2tzX2NvdW50LCAoX191MzIgX191c2VyICopYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCisJCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JJR0FMTE9DKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiT25saW5lIHJlc2l6aW5nIG5vdCBzdXBwb3J0ZWQgd2l0aCBiaWdhbGxvYyIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisKIAkJZXJyID0gbW50X3dhbnRfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMjUwLDYgKzIzMywxMyBAQAogCQkJZ290byBtZXh0X291dDsKIAkJfQogCisJCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JJR0FMTE9DKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiT25saW5lIGRlZnJhZyBub3Qgc3VwcG9ydGVkIHdpdGggYmlnYWxsb2MiKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCiAJCWVyciA9IG1udF93YW50X3dyaXRlKGZpbHAtPmZfcGF0aC5tbnQpOwogCQlpZiAoZXJyKQogCQkJZ290byBtZXh0X291dDsKQEAgLTI3MCw3ICsyNjAsNiBAQAogCiAJY2FzZSBFWFQ0X0lPQ19HUk9VUF9BREQ6IHsKIAkJc3RydWN0IGV4dDRfbmV3X2dyb3VwX2RhdGEgaW5wdXQ7Ci0JCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAkJaW50IGVyciwgZXJyMj0wOwogCiAJCWVyciA9IGV4dDRfcmVzaXplX2JlZ2luKHNiKTsKQEAgLTI4MSw2ICsyNzAsMTMgQEAKIAkJCQlzaXplb2YoaW5wdXQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCisJCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JJR0FMTE9DKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiT25saW5lIHJlc2l6aW5nIG5vdCBzdXBwb3J0ZWQgd2l0aCBiaWdhbGxvYyIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisKIAkJZXJyID0gbW50X3dhbnRfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMzM3LDcgKzMzMyw2IEBACiAKIAljYXNlIEZJVFJJTToKIAl7Ci0JCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShzYi0+c19iZGV2KTsKIAkJc3RydWN0IGZzdHJpbV9yYW5nZSByYW5nZTsKIAkJaW50IHJldCA9IDA7CkBAIC0zNDgsNyArMzQzLDE0IEBACiAJCWlmICghYmxrX3F1ZXVlX2Rpc2NhcmQocSkpCiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyYW5nZSwgKHN0cnVjdCBmc3RyaW1fcmFuZ2UgKilhcmcsCisJCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JJR0FMTE9DKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiRklUUklNIG5vdCBzdXBwb3J0ZWQgd2l0aCBiaWdhbGxvYyIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyYW5nZSwgKHN0cnVjdCBmc3RyaW1fcmFuZ2UgX191c2VyICopYXJnLAogCQkgICAgc2l6ZW9mKHJhbmdlKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMzU4LDcgKzM2MCw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgZnN0cmltX3JhbmdlICopYXJnLCAmcmFuZ2UsCisJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBmc3RyaW1fcmFuZ2UgX191c2VyICopYXJnLCAmcmFuZ2UsCiAJCSAgICBzaXplb2YocmFuZ2UpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCkBAIC0zOTYsMTEgKzM5OCw2IEBACiAJY2FzZSBFWFQ0X0lPQzMyX1NFVFZFUlNJT05fT0xEOgogCQljbWQgPSBFWFQ0X0lPQ19TRVRWRVJTSU9OX09MRDsKIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0pCRDJfREVCVUcKLQljYXNlIEVYVDRfSU9DMzJfV0FJVF9GT1JfUkVBRE9OTFk6Ci0JCWNtZCA9IEVYVDRfSU9DX1dBSVRfRk9SX1JFQURPTkxZOwotCQlicmVhazsKLSNlbmRpZgogCWNhc2UgRVhUNF9JT0MzMl9HRVRSU1ZTWjoKIAkJY21kID0gRVhUNF9JT0NfR0VUUlNWU1o7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmMgYi9mcy9leHQ0L21iYWxsb2MuYwppbmRleCAxN2E1YTU3Li5lMmQ4YmU4IDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuYworKysgYi9mcy9leHQ0L21iYWxsb2MuYwpAQCAtNzAsOCArNzAsOCBAQAogICoKICAqIHBhX2xzdGFydCAtPiB0aGUgbG9naWNhbCBzdGFydCBibG9jayBmb3IgdGhpcyBwcmVhbGxvYyBzcGFjZQogICogcGFfcHN0YXJ0IC0+IHRoZSBwaHlzaWNhbCBzdGFydCBibG9jayBmb3IgdGhpcyBwcmVhbGxvYyBzcGFjZQotICogcGFfbGVuICAgIC0+IGxlbmd0aCBmb3IgdGhpcyBwcmVhbGxvYyBzcGFjZQotICogcGFfZnJlZSAgIC0+ICBmcmVlIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGlzIHByZWFsbG9jIHNwYWNlCisgKiBwYV9sZW4gICAgLT4gbGVuZ3RoIGZvciB0aGlzIHByZWFsbG9jIHNwYWNlIChpbiBjbHVzdGVycykKKyAqIHBhX2ZyZWUgICAtPiAgZnJlZSBzcGFjZSBhdmFpbGFibGUgaW4gdGhpcyBwcmVhbGxvYyBzcGFjZSAoaW4gY2x1c3RlcnMpCiAgKgogICogVGhlIGlub2RlIHByZWFsbG9jYXRpb24gc3BhY2UgaXMgdXNlZCBsb29raW5nIGF0IHRoZSBfbG9naWNhbF8gc3RhcnQKICAqIGJsb2NrLiBJZiBvbmx5IHRoZSBsb2dpY2FsIGZpbGUgYmxvY2sgZmFsbHMgd2l0aGluIHRoZSByYW5nZSBvZiBwcmVhbGxvYwpAQCAtMTI2LDcgKzEyNiw4IEBACiAgKiBsaXN0LiBJbiBjYXNlIG9mIGlub2RlIHByZWFsbG9jYXRpb24gd2UgZm9sbG93IGEgbGlzdCBvZiBoZXVyaXN0aWNzCiAgKiBiYXNlZCBvbiBmaWxlIHNpemUuIFRoaXMgY2FuIGJlIGZvdW5kIGluIGV4dDRfbWJfbm9ybWFsaXplX3JlcXVlc3QuIElmCiAgKiB3ZSBhcmUgZG9pbmcgYSBncm91cCBwcmVhbGxvYyB3ZSB0cnkgdG8gbm9ybWFsaXplIHRoZSByZXF1ZXN0IHRvCi0gKiBzYmktPnNfbWJfZ3JvdXBfcHJlYWxsb2MuIERlZmF1bHQgdmFsdWUgb2Ygc19tYl9ncm91cF9wcmVhbGxvYyBpcworICogc2JpLT5zX21iX2dyb3VwX3ByZWFsbG9jLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2Ygc19tYl9ncm91cF9wcmVhbGxvYyBpcworICogZGVwZW5kZW50IG9uIHRoZSBjbHVzdGVyIHNpemU7IGZvciBub24tYmlnYWxsb2MgZmlsZSBzeXN0ZW1zLCBpdCBpcwogICogNTEyIGJsb2Nrcy4gVGhpcyBjYW4gYmUgdHVuZWQgdmlhCiAgKiAvc3lzL2ZzL2V4dDQvPHBhcnRpdGlvbj4vbWJfZ3JvdXBfcHJlYWxsb2MuIFRoZSB2YWx1ZSBpcyByZXByZXNlbnRlZCBpbgogICogdGVybXMgb2YgbnVtYmVyIG9mIGJsb2Nrcy4gSWYgd2UgaGF2ZSBtb3VudGVkIHRoZSBmaWxlIHN5c3RlbSB3aXRoIC1PCkBAIC00NTksNyArNDYwLDcgQEAKIAkJCWV4dDRfZnNibGtfdCBibG9ja25yOwogCiAJCQlibG9ja25yID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZTRiLT5iZF9ncm91cCk7Ci0JCQlibG9ja25yICs9IGZpcnN0ICsgaTsKKwkJCWJsb2NrbnIgKz0gRVhUNF9DMkIoRVhUNF9TQihzYiksIGZpcnN0ICsgaSk7CiAJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsCiAJCQkJCSAgICAgIGlub2RlID8gaW5vZGUtPmlfaW5vIDogMCwKIAkJCQkJICAgICAgYmxvY2tuciwKQEAgLTU4MCw3ICs1ODEsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQkvKiBib3RoIGJpdHMgaW4gYnVkZHkyIG11c3QgYmUgMCAqLworCQkJLyogYm90aCBiaXRzIGluIGJ1ZGR5MiBtdXN0IGJlIDEgKi8KIAkJCU1CX0NIRUNLX0FTU0VSVChtYl90ZXN0X2JpdChpIDw8IDEsIGJ1ZGR5MikpOwogCQkJTUJfQ0hFQ0tfQVNTRVJUKG1iX3Rlc3RfYml0KChpIDw8IDEpICsgMSwgYnVkZHkyKSk7CiAKQEAgLTY1Myw3ICs2NTQsNyBAQAogCWV4dDRfZ3JwYmxrX3QgY2h1bms7CiAJdW5zaWduZWQgc2hvcnQgYm9yZGVyOwogCi0JQlVHX09OKGxlbiA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpOworCUJVR19PTihsZW4gPiBFWFQ0X0NMVVNURVJTX1BFUl9HUk9VUChzYikpOwogCiAJYm9yZGVyID0gMiA8PCBzYi0+c19ibG9ja3NpemVfYml0czsKIApAQCAtNzA1LDcgKzcwNiw3IEBACiAJCQkJdm9pZCAqYnVkZHksIHZvaWQgKmJpdG1hcCwgZXh0NF9ncm91cF90IGdyb3VwKQogewogCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKLQlleHQ0X2dycGJsa190IG1heCA9IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJZXh0NF9ncnBibGtfdCBtYXggPSBFWFQ0X0NMVVNURVJTX1BFUl9HUk9VUChzYik7CiAJZXh0NF9ncnBibGtfdCBpID0gMDsKIAlleHQ0X2dycGJsa190IGZpcnN0OwogCWV4dDRfZ3JwYmxrX3QgbGVuOwpAQCAtNzM0LDcgKzczNSw3IEBACiAKIAlpZiAoZnJlZSAhPSBncnAtPmJiX2ZyZWUpIHsKIAkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBncm91cCwgMCwgMCwKLQkJCQkgICAgICAiJXUgYmxvY2tzIGluIGJpdG1hcCwgJXUgaW4gZ2QiLAorCQkJCSAgICAgICIldSBjbHVzdGVycyBpbiBiaXRtYXAsICV1IGluIGdkIiwKIAkJCQkgICAgICBmcmVlLCBncnAtPmJiX2ZyZWUpOwogCQkvKgogCQkgKiBJZiB3ZSBpbnRlbnQgdG8gY29udGludWUsIHdlIGNvbnNpZGVyIGdyb3VwIGRlc2NyaXRvcgpAQCAtMTMzOSw3ICsxMzQwLDcgQEAKIAkJCWV4dDRfZnNibGtfdCBibG9ja25yOwogCiAJCQlibG9ja25yID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZTRiLT5iZF9ncm91cCk7Ci0JCQlibG9ja25yICs9IGJsb2NrOworCQkJYmxvY2tuciArPSBFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgYmxvY2spOwogCQkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBlNGItPmJkX2dyb3VwLAogCQkJCQkgICAgICBpbm9kZSA/IGlub2RlLT5pX2lubyA6IDAsCiAJCQkJCSAgICAgIGJsb2NrbnIsCkBAIC0xMzkwLDcgKzEzOTEsNiBAQAogewogCWludCBuZXh0ID0gYmxvY2s7CiAJaW50IG1heDsKLQlpbnQgb3JkOwogCXZvaWQgKmJ1ZGR5OwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKGV4dDRfZ3JvdXBfbG9ja19wdHIoZTRiLT5iZF9zYiwgZTRiLT5iZF9ncm91cCkpOwpAQCAtMTQzMiw5ICsxNDMyLDggQEAKIAkJaWYgKG1iX3Rlc3RfYml0KG5leHQsIEVYVDRfTUJfQklUTUFQKGU0YikpKQogCQkJYnJlYWs7CiAKLQkJb3JkID0gbWJfZmluZF9vcmRlcl9mb3JfYmxvY2soZTRiLCBuZXh0KTsKKwkJb3JkZXIgPSBtYl9maW5kX29yZGVyX2Zvcl9ibG9jayhlNGIsIG5leHQpOwogCi0JCW9yZGVyID0gb3JkOwogCQlibG9jayA9IG5leHQgPj4gb3JkZXI7CiAJCWV4LT5mZV9sZW4gKz0gMSA8PCBvcmRlcjsKIAl9CkBAIC0xNjI0LDggKzE2MjMsOCBAQAogCXN0cnVjdCBleHQ0X2ZyZWVfZXh0ZW50ICpnZXggPSAmYWMtPmFjX2dfZXg7CiAKIAlCVUdfT04oZXgtPmZlX2xlbiA8PSAwKTsKLQlCVUdfT04oZXgtPmZlX2xlbiA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChhYy0+YWNfc2IpKTsKLQlCVUdfT04oZXgtPmZlX3N0YXJ0ID49IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChhYy0+YWNfc2IpKTsKKwlCVUdfT04oZXgtPmZlX2xlbiA+IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKGFjLT5hY19zYikpOworCUJVR19PTihleC0+ZmVfc3RhcnQgPj0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoYWMtPmFjX3NiKSk7CiAJQlVHX09OKGFjLT5hY19zdGF0dXMgIT0gQUNfU1RBVFVTX0NPTlRJTlVFKTsKIAogCWFjLT5hY19mb3VuZCsrOwpAQCAtMTgyMywxNSArMTgyMiwxNSBAQAogCiAJd2hpbGUgKGZyZWUgJiYgYWMtPmFjX3N0YXR1cyA9PSBBQ19TVEFUVVNfQ09OVElOVUUpIHsKIAkJaSA9IG1iX2ZpbmRfbmV4dF96ZXJvX2JpdChiaXRtYXAsCi0JCQkJCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpLCBpKTsKLQkJaWYgKGkgPj0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkgeworCQkJCQkJRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpLCBpKTsKKwkJaWYgKGkgPj0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpKSB7CiAJCQkvKgogCQkJICogSUYgd2UgaGF2ZSBjb3JydXB0IGJpdG1hcCwgd2Ugd29uJ3QgZmluZCBhbnkKIAkJCSAqIGZyZWUgYmxvY2tzIGV2ZW4gdGhvdWdoIGdyb3VwIGluZm8gc2F5cyB3ZQogCQkJICogd2UgaGF2ZSBmcmVlIGJsb2NrcwogCQkJICovCiAJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsIDAsIDAsCi0JCQkJCSIlZCBmcmVlIGJsb2NrcyBhcyBwZXIgIgorCQkJCQkiJWQgZnJlZSBjbHVzdGVycyBhcyBwZXIgIgogCQkJCQkiZ3JvdXAgaW5mby4gQnV0IGJpdG1hcCBzYXlzIDAiLAogCQkJCQlmcmVlKTsKIAkJCWJyZWFrOwpAQCAtMTg0MSw3ICsxODQwLDcgQEAKIAkJQlVHX09OKGV4LmZlX2xlbiA8PSAwKTsKIAkJaWYgKGZyZWUgPCBleC5mZV9sZW4pIHsKIAkJCWV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzYiwgZTRiLT5iZF9ncm91cCwgMCwgMCwKLQkJCQkJIiVkIGZyZWUgYmxvY2tzIGFzIHBlciAiCisJCQkJCSIlZCBmcmVlIGNsdXN0ZXJzIGFzIHBlciAiCiAJCQkJCSJncm91cCBpbmZvLiBCdXQgZ290ICVkIGJsb2NrcyIsCiAJCQkJCWZyZWUsIGV4LmZlX2xlbik7CiAJCQkvKgpAQCAtMTg4Nyw3ICsxODg2LDcgQEAKIAlkb19kaXYoYSwgc2JpLT5zX3N0cmlwZSk7CiAJaSA9IChhICogc2JpLT5zX3N0cmlwZSkgLSBmaXJzdF9ncm91cF9ibG9jazsKIAotCXdoaWxlIChpIDwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkgeworCXdoaWxlIChpIDwgRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpKSB7CiAJCWlmICghbWJfdGVzdF9iaXQoaSwgYml0bWFwKSkgewogCQkJbWF4ID0gbWJfZmluZF9leHRlbnQoZTRiLCAwLCBpLCBzYmktPnNfc3RyaXBlLCAmZXgpOwogCQkJaWYgKG1heCA+PSBzYmktPnNfc3RyaXBlKSB7CkBAIC0yMjUyLDEwICsyMjUxLDEwIEBACiAJICovCiAJaWYgKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7CiAJCW1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfZnJlZSA9Ci0JCQlleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsIGdyb3VwLCBkZXNjKTsKKwkJCWV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHNiLCBncm91cCwgZGVzYyk7CiAJfSBlbHNlIHsKIAkJbWV0YV9ncm91cF9pbmZvW2ldLT5iYl9mcmVlID0KLQkJCWV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKTsKKwkJCWV4dDRfZnJlZV9ncm91cF9jbHVzdGVycyhzYiwgZGVzYyk7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJm1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfcHJlYWxsb2NfbGlzdCk7CkBAIC0yNDczLDcgKzI0NzIsMjAgQEAKIAlzYmktPnNfbWJfc3RhdHMgPSBNQl9ERUZBVUxUX1NUQVRTOwogCXNiaS0+c19tYl9zdHJlYW1fcmVxdWVzdCA9IE1CX0RFRkFVTFRfU1RSRUFNX1RIUkVTSE9MRDsKIAlzYmktPnNfbWJfb3JkZXIyX3JlcXMgPSBNQl9ERUZBVUxUX09SREVSMl9SRVFTOwotCXNiaS0+c19tYl9ncm91cF9wcmVhbGxvYyA9IE1CX0RFRkFVTFRfR1JPVVBfUFJFQUxMT0M7CisJLyoKKwkgKiBUaGUgZGVmYXVsdCBncm91cCBwcmVhbGxvY2F0aW9uIGlzIDUxMiwgd2hpY2ggZm9yIDRrIGJsb2NrCisJICogc2l6ZXMgdHJhbnNsYXRlcyB0byAyIG1lZ2FieXRlcy4gIEhvd2V2ZXIgZm9yIGJpZ2FsbG9jIGZpbGUKKwkgKiBzeXN0ZW1zLCB0aGlzIGlzIHByb2JhYmx5IHRvbyBiaWcgKGkuZSwgaWYgdGhlIGNsdXN0ZXIgc2l6ZQorCSAqIGlzIDEgbWVnYWJ5dGUsIHRoZW4gZ3JvdXAgcHJlYWxsb2NhdGlvbiBzaXplIGJlY29tZXMgaGFsZiBhCisJICogZ2lnYWJ5dGUhKS4gIEFzIGEgZGVmYXVsdCwgd2Ugd2lsbCBrZWVwIGEgdHdvIG1lZ2FieXRlCisJICogZ3JvdXAgcHJhbGxvYyBzaXplIGZvciBjbHVzdGVyIHNpemVzIHVwIHRvIDY0aywgYW5kIGFmdGVyCisJICogdGhhdCwgd2Ugd2lsbCBmb3JjZSBhIG1pbmltdW0gZ3JvdXAgcHJlYWxsb2NhdGlvbiBzaXplIG9mCisJICogMzIgY2x1c3RlcnMuICBUaGlzIHRyYW5zbGF0ZXMgdG8gOCBtZWdzIHdoZW4gdGhlIGNsdXN0ZXIKKwkgKiBzaXplIGlzIDI1NmssIGFuZCAzMiBtZWdzIHdoZW4gdGhlIGNsdXN0ZXIgc2l6ZSBpcyAxIG1lZywKKwkgKiB3aGljaCBzZWVtcyByZWFzb25hYmxlIGFzIGEgZGVmYXVsdC4KKwkgKi8KKwlzYmktPnNfbWJfZ3JvdXBfcHJlYWxsb2MgPSBtYXgoTUJfREVGQVVMVF9HUk9VUF9QUkVBTExPQyA+PgorCQkJCSAgICAgICBzYmktPnNfY2x1c3Rlcl9iaXRzLCAzMik7CiAJLyoKIAkgKiBJZiB0aGVyZSBpcyBhIHNfc3RyaXBlID4gMSwgdGhlbiB3ZSBzZXQgdGhlIHNfbWJfZ3JvdXBfcHJlYWxsb2MKIAkgKiB0byB0aGUgbG93ZXN0IG11bHRpcGxlIG9mIHNfc3RyaXBlIHdoaWNoIGlzIGJpZ2dlciB0aGFuCkBAIC0yNDkwLDcgKzI1MDIsNyBAQAogCXNiaS0+c19sb2NhbGl0eV9ncm91cHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGV4dDRfbG9jYWxpdHlfZ3JvdXApOwogCWlmIChzYmktPnNfbG9jYWxpdHlfZ3JvdXBzID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2ZyZWVfZ3JvdXBpbmZvX3NsYWI7CiAJfQogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXN0cnVjdCBleHQ0X2xvY2FsaXR5X2dyb3VwICpsZzsKQEAgLTI1MDMsOSArMjUxNSw4IEBACiAKIAkvKiBpbml0IGZpbGUgZm9yIGJ1ZGR5IGRhdGEgKi8KIAlyZXQgPSBleHQ0X21iX2luaXRfYmFja2VuZChzYik7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0X2ZyZWVfbG9jYWxpdHlfZ3JvdXBzOwogCiAJaWYgKHNiaS0+c19wcm9jKQogCQlwcm9jX2NyZWF0ZV9kYXRhKCJtYl9ncm91cHMiLCBTX0lSVUdPLCBzYmktPnNfcHJvYywKQEAgLTI1MTMsMTEgKzI1MjQsMTkgQEAKIAogCWlmIChzYmktPnNfam91cm5hbCkKIAkJc2JpLT5zX2pvdXJuYWwtPmpfY29tbWl0X2NhbGxiYWNrID0gcmVsZWFzZV9ibG9ja3Nfb25fY29tbWl0OworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX2xvY2FsaXR5X2dyb3VwczoKKwlmcmVlX3BlcmNwdShzYmktPnNfbG9jYWxpdHlfZ3JvdXBzKTsKKwlzYmktPnNfbG9jYWxpdHlfZ3JvdXBzID0gTlVMTDsKK291dF9mcmVlX2dyb3VwaW5mb19zbGFiOgorCWV4dDRfZ3JvdXBpbmZvX2Rlc3Ryb3lfc2xhYnMoKTsKIG91dDoKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKHNiaS0+c19tYl9vZmZzZXRzKTsKLQkJa2ZyZWUoc2JpLT5zX21iX21heHMpOwotCX0KKwlrZnJlZShzYmktPnNfbWJfb2Zmc2V0cyk7CisJc2JpLT5zX21iX29mZnNldHMgPSBOVUxMOworCWtmcmVlKHNiaS0+c19tYl9tYXhzKTsKKwlzYmktPnNfbWJfbWF4cyA9IE5VTEw7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjYwMiwxMSArMjYyMSwxMyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X2lzc3VlX2Rpc2NhcmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLCBleHQ0X2dycGJsa190IGJsb2NrLCBpbnQgY291bnQpCisJCWV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwgZXh0NF9ncnBibGtfdCBjbHVzdGVyLCBpbnQgY291bnQpCiB7CiAJZXh0NF9mc2Jsa190IGRpc2NhcmRfYmxvY2s7CiAKLQlkaXNjYXJkX2Jsb2NrID0gYmxvY2sgKyBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBibG9ja19ncm91cCk7CisJZGlzY2FyZF9ibG9jayA9IChFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgY2x1c3RlcikgKworCQkJIGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGJsb2NrX2dyb3VwKSk7CisJY291bnQgPSBFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgY291bnQpOwogCXRyYWNlX2V4dDRfZGlzY2FyZF9ibG9ja3Moc2IsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKSBkaXNjYXJkX2Jsb2NrLCBjb3VudCk7CiAJcmV0dXJuIHNiX2lzc3VlX2Rpc2NhcmQoc2IsIGRpc2NhcmRfYmxvY2ssIGNvdW50LCBHRlBfTk9GUywgMCk7CkBAIC0yNjMzLDcgKzI2NTQsNyBAQAogCiAJCWlmICh0ZXN0X29wdChzYiwgRElTQ0FSRCkpCiAJCQlleHQ0X2lzc3VlX2Rpc2NhcmQoc2IsIGVudHJ5LT5ncm91cCwKLQkJCQkJICAgZW50cnktPnN0YXJ0X2JsaywgZW50cnktPmNvdW50KTsKKwkJCQkJICAgZW50cnktPnN0YXJ0X2NsdXN0ZXIsIGVudHJ5LT5jb3VudCk7CiAKIAkJZXJyID0gZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBlbnRyeS0+Z3JvdXAsICZlNGIpOwogCQkvKiB3ZSBleHBlY3QgdG8gZmluZCBleGlzdGluZyBidWRkeSBiZWNhdXNlIGl0J3MgcGlubmVkICovCkBAIC0yNjQ2LDcgKzI2NjcsNyBAQAogCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGVudHJ5LT5ncm91cCk7CiAJCS8qIFRha2UgaXQgb3V0IG9mIHBlciBncm91cCByYiB0cmVlICovCiAJCXJiX2VyYXNlKCZlbnRyeS0+bm9kZSwgJihkYi0+YmJfZnJlZV9yb290KSk7Ci0JCW1iX2ZyZWVfYmxvY2tzKE5VTEwsICZlNGIsIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5jb3VudCk7CisJCW1iX2ZyZWVfYmxvY2tzKE5VTEwsICZlNGIsIGVudHJ5LT5zdGFydF9jbHVzdGVyLCBlbnRyeS0+Y291bnQpOwogCiAJCS8qCiAJCSAqIENsZWFyIHRoZSB0cmltbWVkIGZsYWcgZm9yIHRoZSBncm91cCBzbyB0aGF0IHRoZSBuZXh0CkBAIC0yNzUyLDcgKzI3NzMsNyBAQAogICovCiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludAogZXh0NF9tYl9tYXJrX2Rpc2tzcGFjZV91c2VkKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMsCi0JCQkJaGFuZGxlX3QgKmhhbmRsZSwgdW5zaWduZWQgaW50IHJlc2Vydl9ibGtzKQorCQkJCWhhbmRsZV90ICpoYW5kbGUsIHVuc2lnbmVkIGludCByZXNlcnZfY2xzdHJzKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHA7CkBAIC0yNzgzLDcgKzI4MDQsNyBAQAogCQlnb3RvIG91dF9lcnI7CiAKIAlleHQ0X2RlYnVnKCJ1c2luZyBibG9jayBncm91cCAldSglZClcbiIsIGFjLT5hY19iX2V4LmZlX2dyb3VwLAotCQkJZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCkpOworCQkJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzKHNiLCBnZHApKTsKIAogCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RwX2JoKTsKIAlpZiAoZXJyKQpAQCAtMjc5MSw3ICsyODEyLDcgQEAKIAogCWJsb2NrID0gZXh0NF9ncnBfb2Zmc190b19ibG9jayhzYiwgJmFjLT5hY19iX2V4KTsKIAotCWxlbiA9IGFjLT5hY19iX2V4LmZlX2xlbjsKKwlsZW4gPSBFWFQ0X0MyQihzYmksIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJaWYgKCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoc2JpLCBibG9jaywgbGVuKSkgewogCQlleHQ0X2Vycm9yKHNiLCAiQWxsb2NhdGluZyBibG9ja3MgJWxsdS0lbGx1IHdoaWNoIG92ZXJsYXAgIgogCQkJICAgImZzIG1ldGFkYXRhXG4iLCBibG9jaywgYmxvY2srbGVuKTsKQEAgLTI4MjMsMjggKzI4NDQsMjkgQEAKIAkJICAgICAgYWMtPmFjX2JfZXguZmVfbGVuKTsKIAlpZiAoZ2RwLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfQkxPQ0tfVU5JTklUKSkgewogCQlnZHAtPmJnX2ZsYWdzICY9IGNwdV90b19sZTE2KH5FWFQ0X0JHX0JMT0NLX1VOSU5JVCk7Ci0JCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZ2RwLAotCQkJCQlleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsCi0JCQkJCWFjLT5hY19iX2V4LmZlX2dyb3VwLCBnZHApKTsKKwkJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLAorCQkJCQkgICAgIGV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHNiLAorCQkJCQkJYWMtPmFjX2JfZXguZmVfZ3JvdXAsIGdkcCkpOwogCX0KLQlsZW4gPSBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKSAtIGFjLT5hY19iX2V4LmZlX2xlbjsKLQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwgbGVuKTsKKwlsZW4gPSBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGdkcCkgLSBhYy0+YWNfYl9leC5mZV9sZW47CisJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLCBsZW4pOwogCWdkcC0+YmdfY2hlY2tzdW0gPSBleHQ0X2dyb3VwX2Rlc2NfY3N1bShzYmksIGFjLT5hY19iX2V4LmZlX2dyb3VwLCBnZHApOwogCiAJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGFjLT5hY19iX2V4LmZlX2dyb3VwKTsKLQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGFjLT5hY19iX2V4LmZlX2xlbik7CisJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIsIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJLyoKIAkgKiBOb3cgcmVkdWNlIHRoZSBkaXJ0eSBibG9jayBjb3VudCBhbHNvLiBTaG91bGQgbm90IGdvIG5lZ2F0aXZlCiAJICovCiAJaWYgKCEoYWMtPmFjX2ZsYWdzICYgRVhUNF9NQl9ERUxBTExPQ19SRVNFUlZFRCkpCiAJCS8qIHJlbGVhc2UgYWxsIHRoZSByZXNlcnZlZCBibG9ja3MgaWYgbm9uIGRlbGFsbG9jICovCi0JCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIsIHJlc2Vydl9ibGtzKTsKKwkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyLAorCQkJCSAgIHJlc2Vydl9jbHN0cnMpOwogCiAJaWYgKHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CiAJCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwKIAkJCQkJCQkgIGFjLT5hY19iX2V4LmZlX2dyb3VwKTsKIAkJYXRvbWljX3N1YihhYy0+YWNfYl9leC5mZV9sZW4sCi0JCQkgICAmc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfYmxvY2tzKTsKKwkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9jbHVzdGVycyk7CiAJfQogCiAJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaXRtYXBfYmgpOwpAQCAtMjg4Niw2ICsyOTA4LDcgQEAKIGV4dDRfbWJfbm9ybWFsaXplX3JlcXVlc3Qoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYywKIAkJCQlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgKmFyKQogeworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoYWMtPmFjX3NiKTsKIAlpbnQgYnNiaXRzLCBtYXg7CiAJZXh0NF9sYmxrX3QgZW5kOwogCWxvZmZfdCBzaXplLCBvcmlnX3NpemUsIHN0YXJ0X29mZjsKQEAgLTI5MTYsNyArMjkzOSw3IEBACiAKIAkvKiBmaXJzdCwgbGV0J3MgbGVhcm4gYWN0dWFsIGZpbGUgc2l6ZQogCSAqIGdpdmVuIGN1cnJlbnQgcmVxdWVzdCBpcyBhbGxvY2F0ZWQgKi8KLQlzaXplID0gYWMtPmFjX29fZXguZmVfbG9naWNhbCArIGFjLT5hY19vX2V4LmZlX2xlbjsKKwlzaXplID0gYWMtPmFjX29fZXguZmVfbG9naWNhbCArIEVYVDRfQzJCKHNiaSwgYWMtPmFjX29fZXguZmVfbGVuKTsKIAlzaXplID0gc2l6ZSA8PCBic2JpdHM7CiAJaWYgKHNpemUgPCBpX3NpemVfcmVhZChhYy0+YWNfaW5vZGUpKQogCQlzaXplID0gaV9zaXplX3JlYWQoYWMtPmFjX2lub2RlKTsKQEAgLTI5ODgsNyArMzAxMSw4IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCXBhX2VuZCA9IHBhLT5wYV9sc3RhcnQgKyBwYS0+cGFfbGVuOworCQlwYV9lbmQgPSBwYS0+cGFfbHN0YXJ0ICsgRVhUNF9DMkIoRVhUNF9TQihhYy0+YWNfc2IpLAorCQkJCQkJICBwYS0+cGFfbGVuKTsKIAogCQkvKiBQQSBtdXN0IG5vdCBvdmVybGFwIG9yaWdpbmFsIHJlcXVlc3QgKi8KIAkJQlVHX09OKCEoYWMtPmFjX29fZXguZmVfbG9naWNhbCA+PSBwYV9lbmQgfHwKQEAgLTMwMTgsOSArMzA0MiwxMSBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwYSwgJmVpLT5pX3ByZWFsbG9jX2xpc3QsIHBhX2lub2RlX2xpc3QpIHsKIAkJZXh0NF9sYmxrX3QgcGFfZW5kOworCiAJCXNwaW5fbG9jaygmcGEtPnBhX2xvY2spOwogCQlpZiAocGEtPnBhX2RlbGV0ZWQgPT0gMCkgewotCQkJcGFfZW5kID0gcGEtPnBhX2xzdGFydCArIHBhLT5wYV9sZW47CisJCQlwYV9lbmQgPSBwYS0+cGFfbHN0YXJ0ICsgRVhUNF9DMkIoRVhUNF9TQihhYy0+YWNfc2IpLAorCQkJCQkJCSAgcGEtPnBhX2xlbik7CiAJCQlCVUdfT04oIShzdGFydCA+PSBwYV9lbmQgfHwgZW5kIDw9IHBhLT5wYV9sc3RhcnQpKTsKIAkJfQogCQlzcGluX3VubG9jaygmcGEtPnBhX2xvY2spOwpAQCAtMzAzNiwxNCArMzA2MiwxNCBAQAogCX0KIAlCVUdfT04oc3RhcnQgKyBzaXplIDw9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgJiYKIAkJCXN0YXJ0ID4gYWMtPmFjX29fZXguZmVfbG9naWNhbCk7Ci0JQlVHX09OKHNpemUgPD0gMCB8fCBzaXplID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKGFjLT5hY19zYikpOworCUJVR19PTihzaXplIDw9IDAgfHwgc2l6ZSA+IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKGFjLT5hY19zYikpOwogCiAJLyogbm93IHByZXBhcmUgZ29hbCByZXF1ZXN0ICovCiAKIAkvKiBYWFg6IGlzIGl0IGJldHRlciB0byBhbGlnbiBibG9ja3MgV1JUIHRvIGxvZ2ljYWwKIAkgKiBwbGFjZW1lbnQgb3Igc2F0aXNmeSBiaWcgcmVxdWVzdCBhcyBpcyAqLwogCWFjLT5hY19nX2V4LmZlX2xvZ2ljYWwgPSBzdGFydDsKLQlhYy0+YWNfZ19leC5mZV9sZW4gPSBzaXplOworCWFjLT5hY19nX2V4LmZlX2xlbiA9IEVYVDRfTlVNX0IyQyhzYmksIHNpemUpOwogCiAJLyogZGVmaW5lIGdvYWwgc3RhcnQgaW4gb3JkZXIgdG8gbWVyZ2UgKi8KIAlpZiAoYXItPnByaWdodCAmJiAoYXItPmxyaWdodCA9PSAoc3RhcnQgKyBzaXplKSkpIHsKQEAgLTMxMTIsMTQgKzMxMzgsMTYgQEAKIHN0YXRpYyB2b2lkIGV4dDRfbWJfdXNlX2lub2RlX3BhKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMsCiAJCQkJc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhKQogeworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoYWMtPmFjX3NiKTsKIAlleHQ0X2ZzYmxrX3Qgc3RhcnQ7CiAJZXh0NF9mc2Jsa190IGVuZDsKIAlpbnQgbGVuOwogCiAJLyogZm91bmQgcHJlYWxsb2NhdGVkIGJsb2NrcywgdXNlIHRoZW0gKi8KIAlzdGFydCA9IHBhLT5wYV9wc3RhcnQgKyAoYWMtPmFjX29fZXguZmVfbG9naWNhbCAtIHBhLT5wYV9sc3RhcnQpOwotCWVuZCA9IG1pbihwYS0+cGFfcHN0YXJ0ICsgcGEtPnBhX2xlbiwgc3RhcnQgKyBhYy0+YWNfb19leC5mZV9sZW4pOwotCWxlbiA9IGVuZCAtIHN0YXJ0OworCWVuZCA9IG1pbihwYS0+cGFfcHN0YXJ0ICsgRVhUNF9DMkIoc2JpLCBwYS0+cGFfbGVuKSwKKwkJICBzdGFydCArIEVYVDRfQzJCKHNiaSwgYWMtPmFjX29fZXguZmVfbGVuKSk7CisJbGVuID0gRVhUNF9OVU1fQjJDKHNiaSwgZW5kIC0gc3RhcnQpOwogCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoYWMtPmFjX3NiLCBzdGFydCwgJmFjLT5hY19iX2V4LmZlX2dyb3VwLAogCQkJCQkmYWMtPmFjX2JfZXguZmVfc3RhcnQpOwogCWFjLT5hY19iX2V4LmZlX2xlbiA9IGxlbjsKQEAgLTMxMjcsNyArMzE1NSw3IEBACiAJYWMtPmFjX3BhID0gcGE7CiAKIAlCVUdfT04oc3RhcnQgPCBwYS0+cGFfcHN0YXJ0KTsKLQlCVUdfT04oc3RhcnQgKyBsZW4gPiBwYS0+cGFfcHN0YXJ0ICsgcGEtPnBhX2xlbik7CisJQlVHX09OKGVuZCA+IHBhLT5wYV9wc3RhcnQgKyBFWFQ0X0MyQihzYmksIHBhLT5wYV9sZW4pKTsKIAlCVUdfT04ocGEtPnBhX2ZyZWUgPCBsZW4pOwogCXBhLT5wYV9mcmVlIC09IGxlbjsKIApAQCAtMzE5Myw2ICszMjIxLDcgQEAKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50CiBleHQ0X21iX3VzZV9wcmVhbGxvY2F0ZWQoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKIHsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGFjLT5hY19zYik7CiAJaW50IG9yZGVyLCBpOwogCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGFjLT5hY19pbm9kZSk7CiAJc3RydWN0IGV4dDRfbG9jYWxpdHlfZ3JvdXAgKmxnOwpAQCAtMzIxMCwxMiArMzIzOSwxNCBAQAogCQkvKiBhbGwgZmllbGRzIGluIHRoaXMgY29uZGl0aW9uIGRvbid0IGNoYW5nZSwKIAkJICogc28gd2UgY2FuIHNraXAgbG9ja2luZyBmb3IgdGhlbSAqLwogCQlpZiAoYWMtPmFjX29fZXguZmVfbG9naWNhbCA8IHBhLT5wYV9sc3RhcnQgfHwKLQkJCWFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgPj0gcGEtPnBhX2xzdGFydCArIHBhLT5wYV9sZW4pCisJCSAgICBhYy0+YWNfb19leC5mZV9sb2dpY2FsID49IChwYS0+cGFfbHN0YXJ0ICsKKwkJCQkJICAgICAgIEVYVDRfQzJCKHNiaSwgcGEtPnBhX2xlbikpKQogCQkJY29udGludWU7CiAKIAkJLyogbm9uLWV4dGVudCBmaWxlcyBjYW4ndCBoYXZlIHBoeXNpY2FsIGJsb2NrcyBwYXN0IDJeMzIgKi8KIAkJaWYgKCEoZXh0NF90ZXN0X2lub2RlX2ZsYWcoYWMtPmFjX2lub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKSAmJgotCQkJcGEtPnBhX3BzdGFydCArIHBhLT5wYV9sZW4gPiBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpCisJCSAgICAocGEtPnBhX3BzdGFydCArIEVYVDRfQzJCKHNiaSwgcGEtPnBhX2xlbikgPgorCQkgICAgIEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUykpCiAJCQljb250aW51ZTsKIAogCQkvKiBmb3VuZCBwcmVhbGxvY2F0ZWQgYmxvY2tzLCB1c2UgdGhlbSAqLwpAQCAtMzI5MSw3ICszMzIyLDcgQEAKIAogCXdoaWxlIChuKSB7CiAJCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dDRfZnJlZV9kYXRhLCBub2RlKTsKLQkJZXh0NF9zZXRfYml0cyhiaXRtYXAsIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5jb3VudCk7CisJCWV4dDRfc2V0X2JpdHMoYml0bWFwLCBlbnRyeS0+c3RhcnRfY2x1c3RlciwgZW50cnktPmNvdW50KTsKIAkJbiA9IHJiX25leHQobik7CiAJfQogCXJldHVybjsKQEAgLTMzMTIsNyArMzM0Myw2IEBACiAJZXh0NF9ncm91cF90IGdyb3VwbnI7CiAJZXh0NF9ncnBibGtfdCBzdGFydDsKIAlpbnQgcHJlYWxsb2NhdGVkID0gMDsKLQlpbnQgY291bnQgPSAwOwogCWludCBsZW47CiAKIAkvKiBhbGwgZm9ybSBvZiBwcmVhbGxvY2F0aW9uIGRpc2NhcmRzIGZpcnN0IGxvYWQgZ3JvdXAsCkBAIC0zMzM1LDcgKzMzNjUsNiBAQAogCQlCVUdfT04oZ3JvdXBuciAhPSBncm91cCk7CiAJCWV4dDRfc2V0X2JpdHMoYml0bWFwLCBzdGFydCwgbGVuKTsKIAkJcHJlYWxsb2NhdGVkICs9IGxlbjsKLQkJY291bnQrKzsKIAl9CiAJbWJfZGVidWcoMSwgInByZWxsb2NhdGVkICV1IGZvciBncm91cCAldVxuIiwgcHJlYWxsb2NhdGVkLCBncm91cCk7CiB9CkBAIC0zNDEyLDYgKzM0NDEsNyBAQAogZXh0NF9tYl9uZXdfaW5vZGVfcGEoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gYWMtPmFjX3NiOworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCXN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYTsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWk7CkBAIC0zNDQzLDE2ICszNDczLDE4IEBACiAJCXdpbmwgPSBhYy0+YWNfb19leC5mZV9sb2dpY2FsIC0gYWMtPmFjX2dfZXguZmVfbG9naWNhbDsKIAogCQkvKiBhbHNvLCB3ZSBzaG91bGQgY292ZXIgd2hvbGUgb3JpZ2luYWwgcmVxdWVzdCAqLwotCQl3aW5zID0gYWMtPmFjX2JfZXguZmVfbGVuIC0gYWMtPmFjX29fZXguZmVfbGVuOworCQl3aW5zID0gRVhUNF9DMkIoc2JpLCBhYy0+YWNfYl9leC5mZV9sZW4gLSBhYy0+YWNfb19leC5mZV9sZW4pOwogCiAJCS8qIHRoZSBzbWFsbGVzdCBvbmUgZGVmaW5lcyByZWFsIHdpbmRvdyAqLwogCQl3aW4gPSBtaW4od2lubCwgd2lucyk7CiAKLQkJb2ZmcyA9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgJSBhYy0+YWNfYl9leC5mZV9sZW47CisJCW9mZnMgPSBhYy0+YWNfb19leC5mZV9sb2dpY2FsICUKKwkJCUVYVDRfQzJCKHNiaSwgYWMtPmFjX2JfZXguZmVfbGVuKTsKIAkJaWYgKG9mZnMgJiYgb2ZmcyA8IHdpbikKIAkJCXdpbiA9IG9mZnM7CiAKLQkJYWMtPmFjX2JfZXguZmVfbG9naWNhbCA9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgLSB3aW47CisJCWFjLT5hY19iX2V4LmZlX2xvZ2ljYWwgPSBhYy0+YWNfb19leC5mZV9sb2dpY2FsIC0KKwkJCUVYVDRfQjJDKHNiaSwgd2luKTsKIAkJQlVHX09OKGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgPCBhYy0+YWNfYl9leC5mZV9sb2dpY2FsKTsKIAkJQlVHX09OKGFjLT5hY19vX2V4LmZlX2xlbiA+IGFjLT5hY19iX2V4LmZlX2xlbik7CiAJfQpAQCAtMzQ3Nyw3ICszNTA5LDcgQEAKIAl0cmFjZV9leHQ0X21iX25ld19pbm9kZV9wYShhYywgcGEpOwogCiAJZXh0NF9tYl91c2VfaW5vZGVfcGEoYWMsIHBhKTsKLQlhdG9taWNfYWRkKHBhLT5wYV9mcmVlLCAmRVhUNF9TQihzYiktPnNfbWJfcHJlYWxsb2NhdGVkKTsKKwlhdG9taWNfYWRkKHBhLT5wYV9mcmVlLCAmc2JpLT5zX21iX3ByZWFsbG9jYXRlZCk7CiAKIAllaSA9IEVYVDRfSShhYy0+YWNfaW5vZGUpOwogCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGFjLT5hY19iX2V4LmZlX2dyb3VwKTsKQEAgLTM1OTIsNyArMzYyNCw3IEBACiAKIAlCVUdfT04ocGEtPnBhX2RlbGV0ZWQgPT0gMCk7CiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgcGEtPnBhX3BzdGFydCwgJmdyb3VwLCAmYml0KTsKLQlncnBfYmxrX3N0YXJ0ID0gcGEtPnBhX3BzdGFydCAtIGJpdDsKKwlncnBfYmxrX3N0YXJ0ID0gcGEtPnBhX3BzdGFydCAtIEVYVDRfQzJCKHNiaSwgYml0KTsKIAlCVUdfT04oZ3JvdXAgIT0gZTRiLT5iZF9ncm91cCAmJiBwYS0+cGFfbGVuICE9IDApOwogCWVuZCA9IGJpdCArIHBhLT5wYV9sZW47CiAKQEAgLTM2MDcsNyArMzYzOSw4IEBACiAJCWZyZWUgKz0gbmV4dCAtIGJpdDsKIAogCQl0cmFjZV9leHQ0X21iYWxsb2NfZGlzY2FyZChzYiwgTlVMTCwgZ3JvdXAsIGJpdCwgbmV4dCAtIGJpdCk7Ci0JCXRyYWNlX2V4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYShwYSwgZ3JwX2Jsa19zdGFydCArIGJpdCwKKwkJdHJhY2VfZXh0NF9tYl9yZWxlYXNlX2lub2RlX3BhKHBhLCAoZ3JwX2Jsa19zdGFydCArCisJCQkJCQkgICAgRVhUNF9DMkIoc2JpLCBiaXQpKSwKIAkJCQkJICAgICAgIG5leHQgLSBiaXQpOwogCQltYl9mcmVlX2Jsb2NrcyhwYS0+cGFfaW5vZGUsIGU0YiwgYml0LCBuZXh0IC0gYml0KTsKIAkJYml0ID0gbmV4dCArIDE7CkBAIC0zNjkwLDcgKzM3MjMsNyBAQAogCX0KIAogCWlmIChuZWVkZWQgPT0gMCkKLQkJbmVlZGVkID0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSArIDE7CisJCW5lZWRlZCA9IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHNiKSArIDE7CiAKIAlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiByZXBlYXQ6CkBAIC0zOTU4LDcgKzM5OTEsNyBAQAogCWlmICh1bmxpa2VseShhYy0+YWNfZmxhZ3MgJiBFWFQ0X01CX0hJTlRfR09BTF9PTkxZKSkKIAkJcmV0dXJuOwogCi0Jc2l6ZSA9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgKyBhYy0+YWNfb19leC5mZV9sZW47CisJc2l6ZSA9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgKyBFWFQ0X0MyQihzYmksIGFjLT5hY19vX2V4LmZlX2xlbik7CiAJaXNpemUgPSAoaV9zaXplX3JlYWQoYWMtPmFjX2lub2RlKSArIGFjLT5hY19zYi0+c19ibG9ja3NpemUgLSAxKQogCQk+PiBic2JpdHM7CiAKQEAgLTM5NjksNiArNDAwMiwxMSBAQAogCQlyZXR1cm47CiAJfQogCisJaWYgKHNiaS0+c19tYl9ncm91cF9wcmVhbGxvYyA8PSAwKSB7CisJCWFjLT5hY19mbGFncyB8PSBFWFQ0X01CX1NUUkVBTV9BTExPQzsKKwkJcmV0dXJuOworCX0KKwogCS8qIGRvbid0IHVzZSBncm91cCBhbGxvY2F0aW9uIGZvciBsYXJnZSBmaWxlcyAqLwogCXNpemUgPSBtYXgoc2l6ZSwgaXNpemUpOwogCWlmIChzaXplID4gc2JpLT5zX21iX3N0cmVhbV9yZXF1ZXN0KSB7CkBAIC00MDA3LDggKzQwNDUsOCBAQAogCWxlbiA9IGFyLT5sZW47CiAKIAkvKiBqdXN0IGEgZGlydHkgaGFjayB0byBmaWx0ZXIgdG9vIGJpZyByZXF1ZXN0cyAgKi8KLQlpZiAobGVuID49IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgLSAxMCkKLQkJbGVuID0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEwOworCWlmIChsZW4gPj0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpIC0gMTApCisJCWxlbiA9IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHNiKSAtIDEwOwogCiAJLyogc3RhcnQgc2VhcmNoaW5nIGZyb20gdGhlIGdvYWwgKi8KIAlnb2FsID0gYXItPmdvYWw7CkBAIC00MDE5LDE4ICs0MDU3LDE1IEBACiAKIAkvKiBzZXQgdXAgYWxsb2NhdGlvbiBnb2FscyAqLwogCW1lbXNldChhYywgMCwgc2l6ZW9mKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCkpOwotCWFjLT5hY19iX2V4LmZlX2xvZ2ljYWwgPSBhci0+bG9naWNhbDsKKwlhYy0+YWNfYl9leC5mZV9sb2dpY2FsID0gYXItPmxvZ2ljYWwgJiB+KHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CiAJYWMtPmFjX3N0YXR1cyA9IEFDX1NUQVRVU19DT05USU5VRTsKIAlhYy0+YWNfc2IgPSBzYjsKIAlhYy0+YWNfaW5vZGUgPSBhci0+aW5vZGU7Ci0JYWMtPmFjX29fZXguZmVfbG9naWNhbCA9IGFyLT5sb2dpY2FsOworCWFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgPSBhYy0+YWNfYl9leC5mZV9sb2dpY2FsOwogCWFjLT5hY19vX2V4LmZlX2dyb3VwID0gZ3JvdXA7CiAJYWMtPmFjX29fZXguZmVfc3RhcnQgPSBibG9jazsKIAlhYy0+YWNfb19leC5mZV9sZW4gPSBsZW47Ci0JYWMtPmFjX2dfZXguZmVfbG9naWNhbCA9IGFyLT5sb2dpY2FsOwotCWFjLT5hY19nX2V4LmZlX2dyb3VwID0gZ3JvdXA7Ci0JYWMtPmFjX2dfZXguZmVfc3RhcnQgPSBibG9jazsKLQlhYy0+YWNfZ19leC5mZV9sZW4gPSBsZW47CisJYWMtPmFjX2dfZXggPSBhYy0+YWNfb19leDsKIAlhYy0+YWNfZmxhZ3MgPSBhci0+ZmxhZ3M7CiAKIAkvKiB3ZSBoYXZlIHRvIGRlZmluZSBjb250ZXh0OiB3ZSdsbCB3ZSB3b3JrIHdpdGggYSBmaWxlIG9yCkBAIC00MTgyLDEzICs0MjE3LDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgZXh0NF9tYl9yZWxlYXNlX2NvbnRleHQoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKIHsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGFjLT5hY19zYik7CiAJc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhID0gYWMtPmFjX3BhOwogCWlmIChwYSkgewogCQlpZiAocGEtPnBhX3R5cGUgPT0gTUJfR1JPVVBfUEEpIHsKIAkJCS8qIHNlZSBjb21tZW50IGluIGV4dDRfbWJfdXNlX2dyb3VwX3BhKCkgKi8KIAkJCXNwaW5fbG9jaygmcGEtPnBhX2xvY2spOwotCQkJcGEtPnBhX3BzdGFydCArPSBhYy0+YWNfYl9leC5mZV9sZW47Ci0JCQlwYS0+cGFfbHN0YXJ0ICs9IGFjLT5hY19iX2V4LmZlX2xlbjsKKwkJCXBhLT5wYV9wc3RhcnQgKz0gRVhUNF9DMkIoc2JpLCBhYy0+YWNfYl9leC5mZV9sZW4pOworCQkJcGEtPnBhX2xzdGFydCArPSBFWFQ0X0MyQihzYmksIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJCQlwYS0+cGFfZnJlZSAtPSBhYy0+YWNfYl9leC5mZV9sZW47CiAJCQlwYS0+cGFfbGVuIC09IGFjLT5hY19iX2V4LmZlX2xlbjsKIAkJCXNwaW5fdW5sb2NrKCZwYS0+cGFfbG9jayk7CkBAIC00MjQ5LDEzICs0Mjg1LDE3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlleHQ0X2ZzYmxrX3QgYmxvY2sgPSAwOwogCXVuc2lnbmVkIGludCBpbnF1b3RhID0gMDsKLQl1bnNpZ25lZCBpbnQgcmVzZXJ2X2Jsa3MgPSAwOworCXVuc2lnbmVkIGludCByZXNlcnZfY2xzdHJzID0gMDsKIAogCXNiID0gYXItPmlub2RlLT5pX3NiOwogCXNiaSA9IEVYVDRfU0Ioc2IpOwogCiAJdHJhY2VfZXh0NF9yZXF1ZXN0X2Jsb2Nrcyhhcik7CiAKKwkvKiBBbGxvdyB0byB1c2Ugc3VwZXJ1c2VyIHJlc2VydmF0aW9uIGZvciBxdW90YSBmaWxlICovCisJaWYgKElTX05PUVVPVEEoYXItPmlub2RlKSkKKwkJYXItPmZsYWdzIHw9IEVYVDRfTUJfVVNFX1JPT1RfQkxPQ0tTOworCiAJLyoKIAkgKiBGb3IgZGVsYXllZCBhbGxvY2F0aW9uLCB3ZSBjb3VsZCBza2lwIHRoZSBFTk9TUEMgYW5kCiAJICogRURRVU9UIGNoZWNrLCBhcyBibG9ja3MgYW5kIHF1b3RhcyBoYXZlIGJlZW4gYWxyZWFkeQpAQCAtNDI2OSw3ICs0MzA5LDcgQEAKIAkJICogYW5kIHZlcmlmeSBhbGxvY2F0aW9uIGRvZXNuJ3QgZXhjZWVkIHRoZSBxdW90YSBsaW1pdHMuCiAJCSAqLwogCQl3aGlsZSAoYXItPmxlbiAmJgotCQkJZXh0NF9jbGFpbV9mcmVlX2Jsb2NrcyhzYmksIGFyLT5sZW4sIGFyLT5mbGFncykpIHsKKwkJCWV4dDRfY2xhaW1fZnJlZV9jbHVzdGVycyhzYmksIGFyLT5sZW4sIGFyLT5mbGFncykpIHsKIAogCQkJLyogbGV0IG90aGVycyB0byBmcmVlIHRoZSBzcGFjZSAqLwogCQkJeWllbGQoKTsKQEAgLTQyNzksMTIgKzQzMTksMTQgQEAKIAkJCSplcnJwID0gLUVOT1NQQzsKIAkJCXJldHVybiAwOwogCQl9Ci0JCXJlc2Vydl9ibGtzID0gYXItPmxlbjsKKwkJcmVzZXJ2X2Nsc3RycyA9IGFyLT5sZW47CiAJCWlmIChhci0+ZmxhZ3MgJiBFWFQ0X01CX1VTRV9ST09UX0JMT0NLUykgewotCQkJZHF1b3RfYWxsb2NfYmxvY2tfbm9mYWlsKGFyLT5pbm9kZSwgYXItPmxlbik7CisJCQlkcXVvdF9hbGxvY19ibG9ja19ub2ZhaWwoYXItPmlub2RlLAorCQkJCQkJIEVYVDRfQzJCKHNiaSwgYXItPmxlbikpOwogCQl9IGVsc2UgewogCQkJd2hpbGUgKGFyLT5sZW4gJiYKLQkJCQlkcXVvdF9hbGxvY19ibG9jayhhci0+aW5vZGUsIGFyLT5sZW4pKSB7CisJCQkJZHF1b3RfYWxsb2NfYmxvY2soYXItPmlub2RlLAorCQkJCQkJICBFWFQ0X0MyQihzYmksIGFyLT5sZW4pKSkgewogCiAJCQkJYXItPmZsYWdzIHw9IEVYVDRfTUJfSElOVF9OT1BSRUFMTE9DOwogCQkJCWFyLT5sZW4tLTsKQEAgLTQzMjgsNyArNDM3MCw3IEBACiAJCQlleHQ0X21iX25ld19wcmVhbGxvY2F0aW9uKGFjKTsKIAl9CiAJaWYgKGxpa2VseShhYy0+YWNfc3RhdHVzID09IEFDX1NUQVRVU19GT1VORCkpIHsKLQkJKmVycnAgPSBleHQ0X21iX21hcmtfZGlza3NwYWNlX3VzZWQoYWMsIGhhbmRsZSwgcmVzZXJ2X2Jsa3MpOworCQkqZXJycCA9IGV4dDRfbWJfbWFya19kaXNrc3BhY2VfdXNlZChhYywgaGFuZGxlLCByZXNlcnZfY2xzdHJzKTsKIAkJaWYgKCplcnJwID09IC1FQUdBSU4pIHsKIAkJCS8qCiAJCQkgKiBkcm9wIHRoZSByZWZlcmVuY2UgdGhhdCB3ZSB0b29rCkBAIC00MzY0LDEzICs0NDA2LDEzIEBACiAJaWYgKGFjKQogCQlrbWVtX2NhY2hlX2ZyZWUoZXh0NF9hY19jYWNoZXAsIGFjKTsKIAlpZiAoaW5xdW90YSAmJiBhci0+bGVuIDwgaW5xdW90YSkKLQkJZHF1b3RfZnJlZV9ibG9jayhhci0+aW5vZGUsIGlucXVvdGEgLSBhci0+bGVuKTsKKwkJZHF1b3RfZnJlZV9ibG9jayhhci0+aW5vZGUsIEVYVDRfQzJCKHNiaSwgaW5xdW90YSAtIGFyLT5sZW4pKTsKIAlpZiAoIWFyLT5sZW4pIHsKIAkJaWYgKCFleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoYXItPmlub2RlLAogCQkJCQkgICBFWFQ0X1NUQVRFX0RFTEFMTE9DX1JFU0VSVkVEKSkKIAkJCS8qIHJlbGVhc2UgYWxsIHRoZSByZXNlcnZlZCBibG9ja3MgaWYgbm9uIGRlbGFsbG9jICovCi0JCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLAotCQkJCQkJcmVzZXJ2X2Jsa3MpOworCQkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyLAorCQkJCQkJcmVzZXJ2X2Nsc3Rycyk7CiAJfQogCiAJdHJhY2VfZXh0NF9hbGxvY2F0ZV9ibG9ja3MoYXIsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2spOwpAQCAtNDM4OCw3ICs0NDMwLDcgQEAKIHsKIAlpZiAoKGVudHJ5MS0+dF90aWQgPT0gZW50cnkyLT50X3RpZCkgJiYKIAkgICAgKGVudHJ5MS0+Z3JvdXAgPT0gZW50cnkyLT5ncm91cCkgJiYKLQkgICAgKChlbnRyeTEtPnN0YXJ0X2JsayArIGVudHJ5MS0+Y291bnQpID09IGVudHJ5Mi0+c3RhcnRfYmxrKSkKKwkgICAgKChlbnRyeTEtPnN0YXJ0X2NsdXN0ZXIgKyBlbnRyeTEtPmNvdW50KSA9PSBlbnRyeTItPnN0YXJ0X2NsdXN0ZXIpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQzOTgsNyArNDQ0MCw3IEBACiAJCSAgICAgIHN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqbmV3X2VudHJ5KQogewogCWV4dDRfZ3JvdXBfdCBncm91cCA9IGU0Yi0+YmRfZ3JvdXA7Ci0JZXh0NF9ncnBibGtfdCBibG9jazsKKwlleHQ0X2dycGJsa190IGNsdXN0ZXI7CiAJc3RydWN0IGV4dDRfZnJlZV9kYXRhICplbnRyeTsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpkYiA9IGU0Yi0+YmRfaW5mbzsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZTRiLT5iZF9zYjsKQEAgLTQ0MTEsNyArNDQ1Myw3IEBACiAJQlVHX09OKGU0Yi0+YmRfYnVkZHlfcGFnZSA9PSBOVUxMKTsKIAogCW5ld19ub2RlID0gJm5ld19lbnRyeS0+bm9kZTsKLQlibG9jayA9IG5ld19lbnRyeS0+c3RhcnRfYmxrOworCWNsdXN0ZXIgPSBuZXdfZW50cnktPnN0YXJ0X2NsdXN0ZXI7CiAKIAlpZiAoISpuKSB7CiAJCS8qIGZpcnN0IGZyZWUgYmxvY2sgZXhlbnQuIFdlIG5lZWQgdG8KQEAgLTQ0MjUsMTMgKzQ0NjcsMTQgQEAKIAl3aGlsZSAoKm4pIHsKIAkJcGFyZW50ID0gKm47CiAJCWVudHJ5ID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEsIG5vZGUpOwotCQlpZiAoYmxvY2sgPCBlbnRyeS0+c3RhcnRfYmxrKQorCQlpZiAoY2x1c3RlciA8IGVudHJ5LT5zdGFydF9jbHVzdGVyKQogCQkJbiA9ICYoKm4pLT5yYl9sZWZ0OwotCQllbHNlIGlmIChibG9jayA+PSAoZW50cnktPnN0YXJ0X2JsayArIGVudHJ5LT5jb3VudCkpCisJCWVsc2UgaWYgKGNsdXN0ZXIgPj0gKGVudHJ5LT5zdGFydF9jbHVzdGVyICsgZW50cnktPmNvdW50KSkKIAkJCW4gPSAmKCpuKS0+cmJfcmlnaHQ7CiAJCWVsc2UgewogCQkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBncm91cCwgMCwKLQkJCQlleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCkgKyBibG9jaywKKwkJCQlleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCkgKworCQkJCUVYVDRfQzJCKHNiaSwgY2x1c3RlciksCiAJCQkJIkJsb2NrIGFscmVhZHkgb24gdG8tYmUtZnJlZWQgbGlzdCIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTQ0NDUsNyArNDQ4OCw3IEBACiAJaWYgKG5vZGUpIHsKIAkJZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEsIG5vZGUpOwogCQlpZiAoY2FuX21lcmdlKGVudHJ5LCBuZXdfZW50cnkpKSB7Ci0JCQluZXdfZW50cnktPnN0YXJ0X2JsayA9IGVudHJ5LT5zdGFydF9ibGs7CisJCQluZXdfZW50cnktPnN0YXJ0X2NsdXN0ZXIgPSBlbnRyeS0+c3RhcnRfY2x1c3RlcjsKIAkJCW5ld19lbnRyeS0+Y291bnQgKz0gZW50cnktPmNvdW50OwogCQkJcmJfZXJhc2Uobm9kZSwgJihkYi0+YmJfZnJlZV9yb290KSk7CiAJCQlzcGluX2xvY2soJnNiaS0+c19tZF9sb2NrKTsKQEAgLTQ0OTYsNiArNDUzOSw3IEBACiAJZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaTsKIAlzdHJ1Y3QgZXh0NF9idWRkeSBlNGI7CisJdW5zaWduZWQgaW50IGNvdW50X2NsdXN0ZXJzOwogCWludCBlcnIgPSAwOwogCWludCByZXQ7CiAKQEAgLTQ1NDQsNiArNDU4OCwzOCBAQAogCWlmICghZXh0NF9zaG91bGRfd3JpdGViYWNrX2RhdGEoaW5vZGUpKQogCQlmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBOwogCisJLyoKKwkgKiBJZiB0aGUgZXh0ZW50IHRvIGJlIGZyZWVkIGRvZXMgbm90IGJlZ2luIG9uIGEgY2x1c3RlcgorCSAqIGJvdW5kYXJ5LCB3ZSBuZWVkIHRvIGRlYWwgd2l0aCBwYXJ0aWFsIGNsdXN0ZXJzIGF0IHRoZQorCSAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBleHRlbnQuICBOb3JtYWxseSB3ZSB3aWxsIGZyZWUKKwkgKiBibG9ja3MgYXQgdGhlIGJlZ2lubmluZyBvciB0aGUgZW5kIHVubGVzcyB3ZSBhcmUgZXhwbGljaXRseQorCSAqIHJlcXVlc3RlZCB0byBhdm9pZCBkb2luZyBzby4KKwkgKi8KKwlvdmVyZmxvdyA9IGJsb2NrICYgKHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CisJaWYgKG92ZXJmbG93KSB7CisJCWlmIChmbGFncyAmIEVYVDRfRlJFRV9CTE9DS1NfTk9GUkVFX0ZJUlNUX0NMVVNURVIpIHsKKwkJCW92ZXJmbG93ID0gc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSBvdmVyZmxvdzsKKwkJCWJsb2NrICs9IG92ZXJmbG93OworCQkJaWYgKGNvdW50ID4gb3ZlcmZsb3cpCisJCQkJY291bnQgLT0gb3ZlcmZsb3c7CisJCQllbHNlCisJCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJYmxvY2sgLT0gb3ZlcmZsb3c7CisJCQljb3VudCArPSBvdmVyZmxvdzsKKwkJfQorCX0KKwlvdmVyZmxvdyA9IGNvdW50ICYgKHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CisJaWYgKG92ZXJmbG93KSB7CisJCWlmIChmbGFncyAmIEVYVDRfRlJFRV9CTE9DS1NfTk9GUkVFX0xBU1RfQ0xVU1RFUikgeworCQkJaWYgKGNvdW50ID4gb3ZlcmZsb3cpCisJCQkJY291bnQgLT0gb3ZlcmZsb3c7CisJCQllbHNlCisJCQkJcmV0dXJuOworCQl9IGVsc2UKKwkJCWNvdW50ICs9IHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gb3ZlcmZsb3c7CisJfQorCiBkb19tb3JlOgogCW92ZXJmbG93ID0gMDsKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBibG9jaywgJmJsb2NrX2dyb3VwLCAmYml0KTsKQEAgLTQ1NTIsMTAgKzQ2MjgsMTIgQEAKIAkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGZyZWVpbmcgYmxvY2tzIGFjcm9zcyBhIGdyb3VwCiAJICogYm91bmRhcnkuCiAJICovCi0JaWYgKGJpdCArIGNvdW50ID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkgewotCQlvdmVyZmxvdyA9IGJpdCArIGNvdW50IC0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlpZiAoRVhUNF9DMkIoc2JpLCBiaXQpICsgY291bnQgPiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKSB7CisJCW92ZXJmbG93ID0gRVhUNF9DMkIoc2JpLCBiaXQpICsgY291bnQgLQorCQkJRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKIAkJY291bnQgLT0gb3ZlcmZsb3c7CiAJfQorCWNvdW50X2NsdXN0ZXJzID0gRVhUNF9CMkMoc2JpLCBjb3VudCk7CiAJYml0bWFwX2JoID0gZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOwogCWlmICghYml0bWFwX2JoKSB7CiAJCWVyciA9IC1FSU87CkBAIC00NTcwLDkgKzQ2NDgsOSBAQAogCWlmIChpbl9yYW5nZShleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKSwgYmxvY2ssIGNvdW50KSB8fAogCSAgICBpbl9yYW5nZShleHQ0X2lub2RlX2JpdG1hcChzYiwgZ2RwKSwgYmxvY2ssIGNvdW50KSB8fAogCSAgICBpbl9yYW5nZShibG9jaywgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSwKLQkJICAgICAgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkgfHwKKwkJICAgICBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSB8fAogCSAgICBpbl9yYW5nZShibG9jayArIGNvdW50IC0gMSwgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSwKLQkJICAgICAgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkpIHsKKwkJICAgICBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSkgewogCiAJCWV4dDRfZXJyb3Ioc2IsICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZSAtICIKIAkJCSAgICJCbG9jayA9ICVsbHUsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKQEAgLTQ1OTcsMTEgKzQ2NzUsMTEgQEAKICNpZmRlZiBBR0dSRVNTSVZFX0NIRUNLCiAJewogCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudF9jbHVzdGVyczsgaSsrKQogCQkJQlVHX09OKCFtYl90ZXN0X2JpdChiaXQgKyBpLCBiaXRtYXBfYmgtPmJfZGF0YSkpOwogCX0KICNlbmRpZgotCXRyYWNlX2V4dDRfbWJhbGxvY19mcmVlKHNiLCBpbm9kZSwgYmxvY2tfZ3JvdXAsIGJpdCwgY291bnQpOworCXRyYWNlX2V4dDRfbWJhbGxvY19mcmVlKHNiLCBpbm9kZSwgYmxvY2tfZ3JvdXAsIGJpdCwgY291bnRfY2x1c3RlcnMpOwogCiAJZXJyID0gZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBibG9ja19ncm91cCwgJmU0Yik7CiAJaWYgKGVycikKQEAgLTQ2MTgsMTMgKzQ2OTYsMTMgQEAKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGVycm9yX3JldHVybjsKIAkJfQotCQluZXdfZW50cnktPnN0YXJ0X2JsayA9IGJpdDsKKwkJbmV3X2VudHJ5LT5zdGFydF9jbHVzdGVyID0gYml0OwogCQluZXdfZW50cnktPmdyb3VwICA9IGJsb2NrX2dyb3VwOwotCQluZXdfZW50cnktPmNvdW50ID0gY291bnQ7CisJCW5ld19lbnRyeS0+Y291bnQgPSBjb3VudF9jbHVzdGVyczsKIAkJbmV3X2VudHJ5LT50X3RpZCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF90aWQ7CiAKIAkJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7Ci0JCW1iX2NsZWFyX2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGJpdCwgY291bnQpOworCQltYl9jbGVhcl9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBiaXQsIGNvdW50X2NsdXN0ZXJzKTsKIAkJZXh0NF9tYl9mcmVlX21ldGFkYXRhKGhhbmRsZSwgJmU0YiwgbmV3X2VudHJ5KTsKIAl9IGVsc2UgewogCQkvKiBuZWVkIHRvIHVwZGF0ZSBncm91cF9pbmZvLT5iYl9mcmVlIGFuZCBiaXRtYXAKQEAgLTQ2MzIsMjUgKzQ3MTAsMjkgQEAKIAkJICogdGhlbSB3aXRoIGdyb3VwIGxvY2tfaGVsZAogCQkgKi8KIAkJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7Ci0JCW1iX2NsZWFyX2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGJpdCwgY291bnQpOwotCQltYl9mcmVlX2Jsb2Nrcyhpbm9kZSwgJmU0YiwgYml0LCBjb3VudCk7CisJCW1iX2NsZWFyX2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGJpdCwgY291bnRfY2x1c3RlcnMpOworCQltYl9mcmVlX2Jsb2Nrcyhpbm9kZSwgJmU0YiwgYml0LCBjb3VudF9jbHVzdGVycyk7CiAJfQogCi0JcmV0ID0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCkgKyBjb3VudDsKLQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwgcmV0KTsKKwlyZXQgPSBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGdkcCkgKyBjb3VudF9jbHVzdGVyczsKKwlleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnNfc2V0KHNiLCBnZHAsIHJldCk7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgYmxvY2tfZ3JvdXAsIGdkcCk7CiAJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKLQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGNvdW50KTsKKwlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlY2x1c3RlcnNfY291bnRlciwgY291bnRfY2x1c3RlcnMpOwogCiAJaWYgKHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CiAJCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgYmxvY2tfZ3JvdXApOwotCQlhdG9taWNfYWRkKGNvdW50LCAmc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfYmxvY2tzKTsKKwkJYXRvbWljX2FkZChjb3VudF9jbHVzdGVycywKKwkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9jbHVzdGVycyk7CiAJfQogCiAJZXh0NF9tYl91bmxvYWRfYnVkZHkoJmU0Yik7CiAKIAlmcmVlZCArPSBjb3VudDsKIAorCWlmICghKGZsYWdzICYgRVhUNF9GUkVFX0JMT0NLU19OT19RVU9UX1VQREFURSkpCisJCWRxdW90X2ZyZWVfYmxvY2soaW5vZGUsIEVYVDRfQzJCKHNiaSwgY291bnRfY2x1c3RlcnMpKTsKKwogCS8qIFdlIGRpcnRpZWQgdGhlIGJpdG1hcCBibG9jayAqLwogCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJkaXJ0aWVkIGJpdG1hcCBibG9jayIpOwogCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKQEAgLTQ2NjksOCArNDc1MSw2IEBACiAJfQogCWV4dDRfbWFya19zdXBlcl9kaXJ0eShzYik7CiBlcnJvcl9yZXR1cm46Ci0JaWYgKGZyZWVkICYmICEoZmxhZ3MgJiBFWFQ0X0ZSRUVfQkxPQ0tTX05PX1FVT1RfVVBEQVRFKSkKLQkJZHF1b3RfZnJlZV9ibG9jayhpbm9kZSwgZnJlZWQpOwogCWJyZWxzZShiaXRtYXBfYmgpOwogCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOwogCXJldHVybjsKQEAgLTQ3NzgsMTYgKzQ4NTgsMTcgQEAKIAlleHQ0X2xvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKIAltYl9jbGVhcl9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBiaXQsIGNvdW50KTsKIAltYl9mcmVlX2Jsb2NrcyhOVUxMLCAmZTRiLCBiaXQsIGNvdW50KTsKLQlibGtfZnJlZV9jb3VudCA9IGJsb2Nrc19mcmVlZCArIGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKTsKLQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGRlc2MsIGJsa19mcmVlX2NvdW50KTsKKwlibGtfZnJlZV9jb3VudCA9IGJsb2Nrc19mcmVlZCArIGV4dDRfZnJlZV9ncm91cF9jbHVzdGVycyhzYiwgZGVzYyk7CisJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZGVzYywgYmxrX2ZyZWVfY291bnQpOwogCWRlc2MtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBibG9ja19ncm91cCwgZGVzYyk7CiAJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKLQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGJsb2Nrc19mcmVlZCk7CisJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIsCisJCQkgICBFWFQ0X0IyQyhzYmksIGJsb2Nrc19mcmVlZCkpOwogCiAJaWYgKHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CiAJCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgYmxvY2tfZ3JvdXApOwotCQlhdG9taWNfYWRkKGJsb2Nrc19mcmVlZCwKLQkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MpOworCQlhdG9taWNfYWRkKEVYVDRfQjJDKHNiaSwgYmxvY2tzX2ZyZWVkKSwKKwkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9jbHVzdGVycyk7CiAJfQogCiAJZXh0NF9tYl91bmxvYWRfYnVkZHkoJmU0Yik7CkBAIC00OTQ4LDcgKzUwMjksNyBAQAogCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycDsKIAlleHQ0X2dyb3VwX3QgZmlyc3RfZ3JvdXAsIGxhc3RfZ3JvdXA7CiAJZXh0NF9ncm91cF90IGdyb3VwLCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKLQlleHQ0X2dycGJsa190IGNudCA9IDAsIGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrOworCWV4dDRfZ3JwYmxrX3QgY250ID0gMCwgZmlyc3RfY2x1c3RlciwgbGFzdF9jbHVzdGVyOwogCXVpbnQ2NF90IHN0YXJ0LCBsZW4sIG1pbmxlbiwgdHJpbW1lZCA9IDA7CiAJZXh0NF9mc2Jsa190IGZpcnN0X2RhdGFfYmxrID0KIAkJCWxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOwpAQCAtNDk1OCw3ICs1MDM5LDcgQEAKIAlsZW4gPSByYW5nZS0+bGVuID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCW1pbmxlbiA9IHJhbmdlLT5taW5sZW4gPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAKLQlpZiAodW5saWtlbHkobWlubGVuID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkpCisJaWYgKHVubGlrZWx5KG1pbmxlbiA+IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHNiKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChzdGFydCArIGxlbiA8PSBmaXJzdF9kYXRhX2JsaykKIAkJZ290byBvdXQ7CkBAIC00OTY5LDExICs1MDUwLDExIEBACiAKIAkvKiBEZXRlcm1pbmUgZmlyc3QgYW5kIGxhc3QgZ3JvdXAgdG8gZXhhbWluZSBiYXNlZCBvbiBzdGFydCBhbmQgbGVuICovCiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgKGV4dDRfZnNibGtfdCkgc3RhcnQsCi0JCQkJICAgICAmZmlyc3RfZ3JvdXAsICZmaXJzdF9ibG9jayk7CisJCQkJICAgICAmZmlyc3RfZ3JvdXAsICZmaXJzdF9jbHVzdGVyKTsKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCAoZXh0NF9mc2Jsa190KSAoc3RhcnQgKyBsZW4pLAotCQkJCSAgICAgJmxhc3RfZ3JvdXAsICZsYXN0X2Jsb2NrKTsKKwkJCQkgICAgICZsYXN0X2dyb3VwLCAmbGFzdF9jbHVzdGVyKTsKIAlsYXN0X2dyb3VwID0gKGxhc3RfZ3JvdXAgPiBuZ3JvdXBzIC0gMSkgPyBuZ3JvdXBzIC0gMSA6IGxhc3RfZ3JvdXA7Ci0JbGFzdF9ibG9jayA9IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJbGFzdF9jbHVzdGVyID0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpOwogCiAJaWYgKGZpcnN0X2dyb3VwID4gbGFzdF9ncm91cCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00OTkzLDIwICs1MDc0LDIwIEBACiAJCSAqIGNoYW5nZSBpdCBmb3IgdGhlIGxhc3QgZ3JvdXAgaW4gd2hpY2ggY2FzZSBzdGFydCArCiAJCSAqIGxlbiA8IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikuCiAJCSAqLwotCQlpZiAoZmlyc3RfYmxvY2sgKyBsZW4gPCBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKQotCQkJbGFzdF9ibG9jayA9IGZpcnN0X2Jsb2NrICsgbGVuOwotCQlsZW4gLT0gbGFzdF9ibG9jayAtIGZpcnN0X2Jsb2NrOworCQlpZiAoZmlyc3RfY2x1c3RlciArIGxlbiA8IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHNiKSkKKwkJCWxhc3RfY2x1c3RlciA9IGZpcnN0X2NsdXN0ZXIgKyBsZW47CisJCWxlbiAtPSBsYXN0X2NsdXN0ZXIgLSBmaXJzdF9jbHVzdGVyOwogCiAJCWlmIChncnAtPmJiX2ZyZWUgPj0gbWlubGVuKSB7Ci0JCQljbnQgPSBleHQ0X3RyaW1fYWxsX2ZyZWUoc2IsIGdyb3VwLCBmaXJzdF9ibG9jaywKLQkJCQkJCWxhc3RfYmxvY2ssIG1pbmxlbik7CisJCQljbnQgPSBleHQ0X3RyaW1fYWxsX2ZyZWUoc2IsIGdyb3VwLCBmaXJzdF9jbHVzdGVyLAorCQkJCQkJbGFzdF9jbHVzdGVyLCBtaW5sZW4pOwogCQkJaWYgKGNudCA8IDApIHsKIAkJCQlyZXQgPSBjbnQ7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJdHJpbW1lZCArPSBjbnQ7Ci0JCWZpcnN0X2Jsb2NrID0gMDsKKwkJZmlyc3RfY2x1c3RlciA9IDA7CiAJfQogCXJhbmdlLT5sZW4gPSB0cmltbWVkICogc2ItPnNfYmxvY2tzaXplOwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuaCBiL2ZzL2V4dDQvbWJhbGxvYy5oCmluZGV4IDlkNGE2MzYuLjQ3NzA1ZjMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5oCisrKyBiL2ZzL2V4dDQvbWJhbGxvYy5oCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlleHQ0X2dyb3VwX3QgZ3JvdXA7CiAKIAkvKiBmcmVlIGJsb2NrIGV4dGVudCAqLwotCWV4dDRfZ3JwYmxrX3Qgc3RhcnRfYmxrOworCWV4dDRfZ3JwYmxrX3Qgc3RhcnRfY2x1c3RlcjsKIAlleHQ0X2dycGJsa190IGNvdW50OwogCiAJLyogdHJhbnNhY3Rpb24gd2hpY2ggZnJlZWQgdGhpcyBleHRlbnQgKi8KQEAgLTEzOSw5ICsxMzksOSBAQAogCiBzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCB7CiAJZXh0NF9sYmxrX3QgZmVfbG9naWNhbDsKLQlleHQ0X2dycGJsa190IGZlX3N0YXJ0OworCWV4dDRfZ3JwYmxrX3QgZmVfc3RhcnQ7CS8qIEluIGNsdXN0ZXIgdW5pdHMgKi8KIAlleHQ0X2dyb3VwX3QgZmVfZ3JvdXA7Ci0JZXh0NF9ncnBibGtfdCBmZV9sZW47CisJZXh0NF9ncnBibGtfdCBmZV9sZW47CS8qIEluIGNsdXN0ZXIgdW5pdHMgKi8KIH07CiAKIC8qCkBAIC0xNzUsNyArMTc1LDcgQEAKIAkvKiB0aGUgYmVzdCBmb3VuZCBleHRlbnQgKi8KIAlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCBhY19iX2V4OwogCi0JLyogY29weSBvZiB0aGUgYmV4dCBmb3VuZCBleHRlbnQgdGFrZW4gYmVmb3JlIHByZWFsbG9jYXRpb24gZWZmb3J0cyAqLworCS8qIGNvcHkgb2YgdGhlIGJlc3QgZm91bmQgZXh0ZW50IHRha2VuIGJlZm9yZSBwcmVhbGxvY2F0aW9uIGVmZm9ydHMgKi8KIAlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCBhY19mX2V4OwogCiAJLyogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZG9uZS4gd2UgaGF2ZSB0byB0cmFjayB0byBsaW1pdCBzZWFyY2hpbmcgKi8KQEAgLTIxNiw2ICsyMTYsNyBAQAogc3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9ncnBfb2Zmc190b19ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCQlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCAqZmV4KQogewotCXJldHVybiBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBmZXgtPmZlX2dyb3VwKSArIGZleC0+ZmVfc3RhcnQ7CisJcmV0dXJuIGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGZleC0+ZmVfZ3JvdXApICsKKwkJKGZleC0+ZmVfc3RhcnQgPDwgRVhUNF9TQihzYiktPnNfY2x1c3Rlcl9iaXRzKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuYwppbmRleCBiNTdiOThmLi4xNmFjMjI4IDEwMDY0NAotLS0gYS9mcy9leHQ0L21pZ3JhdGUuYworKysgYi9mcy9leHQ0L21pZ3JhdGUuYwpAQCAtMTUsMTkgKzE1LDE4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgotI2luY2x1ZGUgImV4dDRfZXh0ZW50cy5oIgogCiAvKgogICogVGhlIGNvbnRpZ3VvdXMgYmxvY2tzIGRldGFpbHMgd2hpY2ggY2FuIGJlCiAgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnQKICAqLwotc3RydWN0IGxpc3RfYmxvY2tzX3N0cnVjdCB7Ci0JZXh0NF9sYmxrX3QgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2s7CitzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgeworCWV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrOwogCWV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrOwogfTsKIAogc3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlzdHJ1Y3QgbGlzdF9ibG9ja3Nfc3RydWN0ICpsYikKKwkJCQlzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKQogCiB7CiAJaW50IHJldHZhbCA9IDAsIG5lZWRlZDsKQEAgLTg3LDggKzg2LDcgQEAKIH0KIAogc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJZXh0NF9mc2Jsa190IHBibG9jaywgZXh0NF9sYmxrX3QgYmxrX251bSwKLQkJCQlzdHJ1Y3QgbGlzdF9ibG9ja3Nfc3RydWN0ICpsYikKKwkJCSAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKQogewogCWludCByZXR2YWw7CiAJLyoKQEAgLTk2LDkgKzk0LDEwIEBACiAJICovCiAJaWYgKGxiLT5maXJzdF9wYmxvY2sgJiYKIAkJKGxiLT5sYXN0X3BibG9jaysxID09IHBibG9jaykgJiYKLQkJKGxiLT5sYXN0X2Jsb2NrKzEgPT0gYmxrX251bSkpIHsKKwkJKGxiLT5sYXN0X2Jsb2NrKzEgPT0gbGItPmN1cnJfYmxvY2spKSB7CiAJCWxiLT5sYXN0X3BibG9jayA9IHBibG9jazsKLQkJbGItPmxhc3RfYmxvY2sgPSBibGtfbnVtOworCQlsYi0+bGFzdF9ibG9jayA9IGxiLT5jdXJyX2Jsb2NrOworCQlsYi0+Y3Vycl9ibG9jaysrOwogCQlyZXR1cm4gMDsKIAl9CiAJLyoKQEAgLTEwNiw2NCArMTA1LDQ5IEBACiAJICovCiAJcmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgaW5vZGUsIGxiKTsKIAlsYi0+Zmlyc3RfcGJsb2NrID0gbGItPmxhc3RfcGJsb2NrID0gcGJsb2NrOwotCWxiLT5maXJzdF9ibG9jayA9IGxiLT5sYXN0X2Jsb2NrID0gYmxrX251bTsKLQorCWxiLT5maXJzdF9ibG9jayA9IGxiLT5sYXN0X2Jsb2NrID0gbGItPmN1cnJfYmxvY2s7CisJbGItPmN1cnJfYmxvY2srKzsKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgZXh0NF9mc2Jsa190IHBibG9jaywgZXh0NF9sYmxrX3QgKmJsa19udW1wLAotCQkJCSAgIHN0cnVjdCBsaXN0X2Jsb2Nrc19zdHJ1Y3QgKmxiKQorCQkJCSAgIGV4dDRfZnNibGtfdCBwYmxvY2ssCisJCQkJICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYikKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCV9fbGUzMiAqaV9kYXRhOwogCWludCBpLCByZXR2YWwgPSAwOwotCWV4dDRfbGJsa190IGJsa19jb3VudCA9ICpibGtfbnVtcDsKIAl1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDI7CiAKLQlpZiAoIXBibG9jaykgewotCQkvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi8KLQkJKmJsa19udW1wICs9IG1heF9lbnRyaWVzOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBwYmxvY2spOwogCWlmICghYmgpCiAJCXJldHVybiAtRUlPOwogCiAJaV9kYXRhID0gKF9fbGUzMiAqKWJoLT5iX2RhdGE7Ci0JZm9yIChpID0gMDsgaSA8IG1heF9lbnRyaWVzOyBpKyssIGJsa19jb3VudCsrKSB7CisJZm9yIChpID0gMDsgaSA8IG1heF9lbnRyaWVzOyBpKyspIHsKIAkJaWYgKGlfZGF0YVtpXSkgewogCQkJcmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLAotCQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW2ldKSwKLQkJCQkJCWJsa19jb3VudCwgbGIpOworCQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpOwogCQkJaWYgKHJldHZhbCkKIAkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWxiLT5jdXJyX2Jsb2NrKys7CiAJCX0KIAl9Ci0KLQkvKiBVcGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovCi0JKmJsa19udW1wID0gYmxrX2NvdW50OwogCXB1dF9iaChiaCk7CiAJcmV0dXJuIHJldHZhbDsKIAogfQogCiBzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBleHQ0X2xibGtfdCAqYmxrX251bXAsCi0JCQkJICAgIHN0cnVjdCBsaXN0X2Jsb2Nrc19zdHJ1Y3QgKmxiKQorCQkJCSAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLAorCQkJCSAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJX19sZTMyICppX2RhdGE7CiAJaW50IGksIHJldHZhbCA9IDA7Ci0JZXh0NF9sYmxrX3QgYmxrX2NvdW50ID0gKmJsa19udW1wOwogCXVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPj4gMjsKIAotCWlmICghcGJsb2NrKSB7Ci0JCS8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqLwotCQkqYmxrX251bXAgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllczsKLQkJcmV0dXJuIDA7Ci0JfQogCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIHBibG9jayk7CiAJaWYgKCFiaCkKIAkJcmV0dXJuIC1FSU87CkBAIC0xNzIsMzggKzE1NiwyOCBAQAogCWZvciAoaSA9IDA7IGkgPCBtYXhfZW50cmllczsgaSsrKSB7CiAJCWlmIChpX2RhdGFbaV0pIHsKIAkJCXJldHZhbCA9IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQlsZTMyX3RvX2NwdShpX2RhdGFbaV0pLAotCQkJCQkJJmJsa19jb3VudCwgbGIpOworCQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpOwogCQkJaWYgKHJldHZhbCkKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCS8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqLwotCQkJYmxrX2NvdW50ICs9IG1heF9lbnRyaWVzOworCQkJbGItPmN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXM7CiAJCX0KIAl9Ci0KLQkvKiBVcGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovCi0JKmJsa19udW1wID0gYmxrX2NvdW50OwogCXB1dF9iaChiaCk7CiAJcmV0dXJuIHJldHZhbDsKIAogfQogCiBzdGF0aWMgaW50IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgZXh0NF9sYmxrX3QgKmJsa19udW1wLAotCQkJCSAgICAgc3RydWN0IGxpc3RfYmxvY2tzX3N0cnVjdCAqbGIpCisJCQkJICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssCisJCQkJICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlfX2xlMzIgKmlfZGF0YTsKIAlpbnQgaSwgcmV0dmFsID0gMDsKLQlleHQ0X2xibGtfdCBibGtfY291bnQgPSAqYmxrX251bXA7CiAJdW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA+PiAyOwogCi0JaWYgKCFwYmxvY2spIHsKLQkJLyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovCi0JCSpibGtfbnVtcCArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzICogbWF4X2VudHJpZXM7Ci0JCXJldHVybiAwOwotCX0KIAliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBwYmxvY2spOwogCWlmICghYmgpCiAJCXJldHVybiAtRUlPOwpAQCAtMjEyLDE2ICsxODYsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbWF4X2VudHJpZXM7IGkrKykgewogCQlpZiAoaV9kYXRhW2ldKSB7CiAJCQlyZXR2YWwgPSB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSwKLQkJCQkJCWxlMzJfdG9fY3B1KGlfZGF0YVtpXSksCi0JCQkJCQkmYmxrX2NvdW50LCBsYik7CisJCQkJCQlsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7CiAJCQlpZiAocmV0dmFsKQogCQkJCWJyZWFrOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCS8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqLwotCQkJYmxrX2NvdW50ICs9IG1heF9lbnRyaWVzICogbWF4X2VudHJpZXM7CisJCQlsYi0+Y3Vycl9ibG9jayArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzOworCQl9CiAJfQotCS8qIFVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi8KLQkqYmxrX251bXAgPSBibGtfY291bnQ7CiAJcHV0X2JoKGJoKTsKIAlyZXR1cm4gcmV0dmFsOwogCkBAIC00NjIsMTIgKzQzNCwxMiBAQAogCWhhbmRsZV90ICpoYW5kbGU7CiAJaW50IHJldHZhbCA9IDAsIGk7CiAJX19sZTMyICppX2RhdGE7Ci0JZXh0NF9sYmxrX3QgYmxrX2NvdW50ID0gMDsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTsKIAlzdHJ1Y3QgaW5vZGUgKnRtcF9pbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfYmxvY2tzX3N0cnVjdCBsYjsKKwlzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGI7CiAJdW5zaWduZWQgbG9uZyBtYXhfZW50cmllczsKIAlfX3UzMiBnb2FsOworCXVpZF90IG93bmVyWzJdOwogCiAJLyoKIAkgKiBJZiB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVudHMsIG9yIHRoZSBpbm9kZQpAQCAtNDk1LDEwICs0NjcsMTIgQEAKIAl9CiAJZ29hbCA9ICgoKGlub2RlLT5pX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLT5pX3NiKSkgKgogCQlFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKSArIDE7CisJb3duZXJbMF0gPSBpbm9kZS0+aV91aWQ7CisJb3duZXJbMV0gPSBpbm9kZS0+aV9naWQ7CiAJdG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBpbm9kZS0+aV9zYi0+c19yb290LT5kX2lub2RlLAotCQkJCSAgIFNfSUZSRUcsIE5VTEwsIGdvYWwpOworCQkJCSAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyKTsKIAlpZiAoSVNfRVJSKHRtcF9pbm9kZSkpIHsKLQkJcmV0dmFsID0gLUVOT01FTTsKKwkJcmV0dmFsID0gUFRSX0VSUihpbm9kZSk7CiAJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJCXJldHVybiByZXR2YWw7CiAJfQpAQCAtNTA3LDcgKzQ4MSw3IEBACiAJICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyCiAJICogd2hlbiB3ZSBkcm9wIGlub2RlIHJlZmVyZW5jZS4KIAkgKi8KLQl0bXBfaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKHRtcF9pbm9kZSk7CiAKIAlleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCB0bXBfaW5vZGUpOwogCWV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIHRtcF9pbm9kZSk7CkBAIC01NTEsMzUgKzUyNSwzMiBAQAogCiAJLyogMzIgYml0IGJsb2NrIGFkZHJlc3MgNCBieXRlcyAqLwogCW1heF9lbnRyaWVzID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDI7Ci0JZm9yIChpID0gMDsgaSA8IEVYVDRfTkRJUl9CTE9DS1M7IGkrKywgYmxrX2NvdW50KyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgRVhUNF9ORElSX0JMT0NLUzsgaSsrKSB7CiAJCWlmIChpX2RhdGFbaV0pIHsKIAkJCXJldHZhbCA9IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlLCB0bXBfaW5vZGUsCi0JCQkJCQlsZTMyX3RvX2NwdShpX2RhdGFbaV0pLAotCQkJCQkJYmxrX2NvdW50LCAmbGIpOworCQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW2ldKSwgJmxiKTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBlcnJfb3V0OwotCQl9CisJCX0gZWxzZQorCQkJbGIuY3Vycl9ibG9jaysrOwogCX0KIAlpZiAoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSkgewogCQlyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSwKLQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSksCi0JCQkJCSZibGtfY291bnQsICZsYik7CisJCQkJbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSksICZsYik7CiAJCQlpZiAocmV0dmFsKQogCQkJCWdvdG8gZXJyX291dDsKIAl9IGVsc2UKLQkJYmxrX2NvdW50ICs9ICBtYXhfZW50cmllczsKKwkJbGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllczsKIAlpZiAoaV9kYXRhW0VYVDRfRElORF9CTE9DS10pIHsKIAkJcmV0dmFsID0gdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLAotCQkJCQlsZTMyX3RvX2NwdShpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXSksCi0JCQkJCSZibGtfY291bnQsICZsYik7CisJCQkJbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfRElORF9CTE9DS10pLCAmbGIpOwogCQkJaWYgKHJldHZhbCkKIAkJCQlnb3RvIGVycl9vdXQ7CiAJfSBlbHNlCi0JCWJsa19jb3VudCArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzOworCQlsYi5jdXJyX2Jsb2NrICs9IG1heF9lbnRyaWVzICogbWF4X2VudHJpZXM7CiAJaWYgKGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSB7CiAJCXJldHZhbCA9IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSwKLQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pLAotCQkJCQkmYmxrX2NvdW50LCAmbGIpOworCQkJCWxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSwgJmxiKTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBlcnJfb3V0OwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbW1wLmMgYi9mcy9leHQ0L21tcC5jCmluZGV4IDliZGVmM2YuLjdlYTRiYTQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbW1wLmMKKysrIGIvZnMvZXh0NC9tbXAuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJbW1wLT5tbXBfY2hlY2tfaW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihtbXBfY2hlY2tfaW50ZXJ2YWwpOwogCWJkZXZuYW1lKGJoLT5iX2JkZXYsIG1tcC0+bW1wX2JkZXZuYW1lKTsKIAotCW1lbWNweShtbXAtPm1tcF9ub2RlbmFtZSwgaW5pdF91dHNuYW1lKCktPnN5c25hbWUsCisJbWVtY3B5KG1tcC0+bW1wX25vZGVuYW1lLCBpbml0X3V0c25hbWUoKS0+bm9kZW5hbWUsCiAJICAgICAgIHNpemVvZihtbXAtPm1tcF9ub2RlbmFtZSkpOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKQEAgLTEyNSw4ICsxMjUsOSBAQAogCQkgKiBEb24ndCBzcGV3IHRvbyBtYW55IGVycm9yIG1lc3NhZ2VzLiBQcmludCBvbmUgZXZlcnkKIAkJICogKHNfbW1wX3VwZGF0ZV9pbnRlcnZhbCAqIDYwKSBzZWNvbmRzLgogCQkgKi8KLQkJaWYgKHJldHZhbCAmJiAoZmFpbGVkX3dyaXRlcyAlIDYwKSA9PSAwKSB7Ci0JCQlleHQ0X2Vycm9yKHNiLCAiRXJyb3Igd3JpdGluZyB0byBNTVAgYmxvY2siKTsKKwkJaWYgKHJldHZhbCkgeworCQkJaWYgKChmYWlsZWRfd3JpdGVzICUgNjApID09IDApCisJCQkJZXh0NF9lcnJvcihzYiwgIkVycm9yIHdyaXRpbmcgdG8gTU1QIGJsb2NrIik7CiAJCQlmYWlsZWRfd3JpdGVzKys7CiAJCX0KIApAQCAtMjk1LDcgKzI5Niw4IEBACiAJLyoKIAkgKiB3cml0ZSBhIG5ldyByYW5kb20gc2VxdWVuY2UgbnVtYmVyLgogCSAqLwotCW1tcC0+bW1wX3NlcSA9IHNlcSA9IGNwdV90b19sZTMyKG1tcF9uZXdfc2VxKCkpOworCXNlcSA9IG1tcF9uZXdfc2VxKCk7CisJbW1wLT5tbXBfc2VxID0gY3B1X3RvX2xlMzIoc2VxKTsKIAogCXJldHZhbCA9IHdyaXRlX21tcF9ibG9jayhiaCk7CiAJaWYgKHJldHZhbCkKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbW92ZV9leHRlbnQuYyBiL2ZzL2V4dDQvbW92ZV9leHRlbnQuYwppbmRleCBmNTc0NTVhLi5jNTgyNmM2IDEwMDY0NAotLS0gYS9mcy9leHQ0L21vdmVfZXh0ZW50LmMKKysrIGIvZnMvZXh0NC9tb3ZlX2V4dGVudC5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiZXh0NF9qYmQyLmgiCi0jaW5jbHVkZSAiZXh0NF9leHRlbnRzLmgiCiAjaW5jbHVkZSAiZXh0NC5oIgogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuYwppbmRleCAxYzkyNGZhLi5hYTRjNzgyIDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKKysrIGIvZnMvZXh0NC9uYW1laS5jCkBAIC0xNTg2LDcgKzE1ODYsNyBAQAogCQkJZHh0cmFjZShkeF9zaG93X2luZGV4KCJub2RlIiwgZnJhbWVzWzFdLmVudHJpZXMpKTsKIAkJCWR4dHJhY2UoZHhfc2hvd19pbmRleCgibm9kZSIsCiAJCQkgICAgICAgKChzdHJ1Y3QgZHhfbm9kZSAqKSBiaDItPmJfZGF0YSktPmVudHJpZXMpKTsKLQkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoMik7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgYmgyKTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBqb3VybmFsX2Vycm9yOwogCQkJYnJlbHNlIChiaDIpOwpAQCAtMTYxMiw3ICsxNjEyLDcgQEAKIAkJCWlmIChlcnIpCiAJCQkJZ290byBqb3VybmFsX2Vycm9yOwogCQl9Ci0JCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGZyYW1lc1swXS5iaCk7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBmcmFtZXNbMF0uYmgpOwogCQlpZiAoZXJyKSB7CiAJCQlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTE2OTQsNyArMTY5NCw3IEBACiAJaWYgKGlzX2R4KGlub2RlKSAmJiBpbm9kZS0+aV9ubGluayA+IDEpIHsKIAkJLyogbGltaXQgaXMgMTYtYml0IGlfbGlua3NfY291bnQgKi8KIAkJaWYgKGlub2RlLT5pX25saW5rID49IEVYVDRfTElOS19NQVggfHwgaW5vZGUtPmlfbmxpbmsgPT0gMikgewotCQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQkJc2V0X25saW5rKGlub2RlLCAxKTsKIAkJCUVYVDRfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKGlub2RlLT5pX3NiLAogCQkJCQkgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0RJUl9OTElOSyk7CiAJCX0KQEAgLTE3MDcsOSArMTcwNyw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGV4dDRfZGVjX2NvdW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JZHJvcF9ubGluayhpbm9kZSk7Ci0JaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgaW5vZGUtPmlfbmxpbmsgPT0gMCkKLQkJaW5jX25saW5rKGlub2RlKTsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbmxpbmsgPiAyKQorCQlkcm9wX25saW5rKGlub2RlKTsKIH0KIAogCkBAIC0xNzU2LDcgKzE3NTUsNyBAQAogCWlmIChJU19ESVJTWU5DKGRpcikpCiAJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAotCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIG1vZGUsICZkZW50cnktPmRfbmFtZSwgMCk7CisJaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRpciwgbW9kZSwgJmRlbnRyeS0+ZF9uYW1lLCAwLCBOVUxMKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJaW5vZGUtPmlfb3AgPSAmZXh0NF9maWxlX2lub2RlX29wZXJhdGlvbnM7CkBAIC0xNzkyLDcgKzE3OTEsNyBAQAogCWlmIChJU19ESVJTWU5DKGRpcikpCiAJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAotCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIG1vZGUsICZkZW50cnktPmRfbmFtZSwgMCk7CisJaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRpciwgbW9kZSwgJmRlbnRyeS0+ZF9uYW1lLCAwLCBOVUxMKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKQEAgLTE4MzIsNyArMTgzMSw3IEBACiAJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIFNfSUZESVIgfCBtb2RlLAotCQkJICAgICAgICZkZW50cnktPmRfbmFtZSwgMCk7CisJCQkgICAgICAgJmRlbnRyeS0+ZF9uYW1lLCAwLCBOVUxMKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkKIAkJZ290byBvdXRfc3RvcDsKQEAgLTE4NjEsOSArMTg2MCw5IEBACiAJZGUtPm5hbWVfbGVuID0gMjsKIAlzdHJjcHkoZGUtPm5hbWUsICIuLiIpOwogCWV4dDRfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgU19JRkRJUik7Ci0JaW5vZGUtPmlfbmxpbmsgPSAyOworCXNldF9ubGluayhpbm9kZSwgMik7CiAJQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKLQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgZGlyX2Jsb2NrKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBkaXJfYmxvY2spOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2NsZWFyX2lub2RlOwogCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKQEAgLTIyMTQsNyArMjIxMyw3IEBACiAJCWV4dDRfd2FybmluZyhpbm9kZS0+aV9zYiwKIAkJCSAgICAgIkRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkIiwKIAkJCSAgICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAl9CiAJcmV0dmFsID0gZXh0NF9kZWxldGVfZW50cnkoaGFuZGxlLCBkaXIsIGRlLCBiaCk7CiAJaWYgKHJldHZhbCkKQEAgLTIyNzksNyArMjI3OCw3IEBACiAJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIFNfSUZMTkt8U19JUldYVUdPLAotCQkJICAgICAgICZkZW50cnktPmRfbmFtZSwgMCk7CisJCQkgICAgICAgJmRlbnRyeS0+ZF9uYW1lLCAwLCBOVUxMKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkKIAkJZ290byBvdXRfc3RvcDsKQEAgLTI1MzAsNyArMjUyOSw3IEBACiAJCVBBUkVOVF9JTk8oZGlyX2JoLT5iX2RhdGEsIG5ld19kaXItPmlfc2ItPnNfYmxvY2tzaXplKSA9CiAJCQkJCQljcHVfdG9fbGUzMihuZXdfZGlyLT5pX2lubyk7CiAJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCXJldHZhbCA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgb2xkX2RpciwgZGlyX2JoKTsKKwkJcmV0dmFsID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBvbGRfaW5vZGUsIGRpcl9iaCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWV4dDRfc3RkX2Vycm9yKG9sZF9kaXItPmlfc2IsIHJldHZhbCk7CiAJCQlnb3RvIGVuZF9yZW5hbWU7CkBAIC0yNTM5LDcgKzI1MzgsNyBAQAogCQlpZiAobmV3X2lub2RlKSB7CiAJCQkvKiBjaGVja2VkIGVtcHR5X2RpciBhYm92ZSwgY2FuJ3QgaGF2ZSBhbm90aGVyIHBhcmVudCwKIAkJCSAqIGV4dDRfZGVjX2NvdW50KCkgd29uJ3Qgd29yayBmb3IgbWFueS1saW5rZWQgZGlycyAqLwotCQkJbmV3X2lub2RlLT5pX25saW5rID0gMDsKKwkJCWNsZWFyX25saW5rKG5ld19pbm9kZSk7CiAJCX0gZWxzZSB7CiAJCQlleHQ0X2luY19jb3VudChoYW5kbGUsIG5ld19kaXIpOwogCQkJZXh0NF91cGRhdGVfZHhfZmxhZyhuZXdfZGlyKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcGFnZS1pby5jIGIvZnMvZXh0NC9wYWdlLWlvLmMKaW5kZXggOTJmMzhlZS4uN2NlMWQwYiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9wYWdlLWlvLmMKKysrIGIvZnMvZXh0NC9wYWdlLWlvLmMKQEAgLTcwLDcgKzcwLDYgQEAKIHZvaWQgZXh0NF9mcmVlX2lvX2VuZChleHQ0X2lvX2VuZF90ICppbykKIHsKIAlpbnQgaTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7CiAKIAlCVUdfT04oIWlvKTsKIAlpZiAoaW8tPnBhZ2UpCkBAIC03OCw1NiArNzcsNDMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaW8tPm51bV9pb19wYWdlczsgaSsrKQogCQlwdXRfaW9fcGFnZShpby0+cGFnZXNbaV0pOwogCWlvLT5udW1faW9fcGFnZXMgPSAwOwotCXdxID0gZXh0NF9pb2VuZF93cShpby0+aW5vZGUpOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZFWFQ0X0koaW8tPmlub2RlKS0+aV9pb2VuZF9jb3VudCkgJiYKLQkgICAgd2FpdHF1ZXVlX2FjdGl2ZSh3cSkpCi0JCXdha2VfdXBfYWxsKHdxKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmRVhUNF9JKGlvLT5pbm9kZSktPmlfaW9lbmRfY291bnQpKQorCQl3YWtlX3VwX2FsbChleHQ0X2lvZW5kX3dxKGlvLT5pbm9kZSkpOwogCWttZW1fY2FjaGVfZnJlZShpb19lbmRfY2FjaGVwLCBpbyk7CiB9CiAKIC8qCiAgKiBjaGVjayBhIHJhbmdlIG9mIHNwYWNlIGFuZCBjb252ZXJ0IHVud3JpdHRlbiBleHRlbnRzIHRvIHdyaXR0ZW4uCisgKgorICogQ2FsbGVkIHdpdGggaW5vZGUtPmlfbXV0ZXg7IHdlIGRlcGVuZCBvbiB0aGlzIHdoZW4gd2UgbWFuaXB1bGF0ZQorICogaW8tPmZsYWcsIHNpbmNlIHdlIGNvdWxkIG90aGVyd2lzZSByYWNlIHdpdGggZXh0NF9mbHVzaF9jb21wbGV0ZWRfSU8oKQogICovCiBpbnQgZXh0NF9lbmRfaW9fbm9sb2NrKGV4dDRfaW9fZW5kX3QgKmlvKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpby0+aW5vZGU7CiAJbG9mZl90IG9mZnNldCA9IGlvLT5vZmZzZXQ7CiAJc3NpemVfdCBzaXplID0gaW8tPnNpemU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKndxOwogCWludCByZXQgPSAwOwogCiAJZXh0NF9kZWJ1ZygiZXh0NF9lbmRfaW9fbm9sb2NrOiBpbyAweCVwIGZyb20gaW5vZGUgJWx1LGxpc3QtPm5leHQgMHglcCwiCiAJCSAgICJsaXN0LT5wcmV2IDB4JXBcbiIsCiAJCSAgIGlvLCBpbm9kZS0+aV9pbm8sIGlvLT5saXN0Lm5leHQsIGlvLT5saXN0LnByZXYpOwogCi0JaWYgKGxpc3RfZW1wdHkoJmlvLT5saXN0KSkKLQkJcmV0dXJuIHJldDsKLQotCWlmICghKGlvLT5mbGFnICYgRVhUNF9JT19FTkRfVU5XUklUVEVOKSkKLQkJcmV0dXJuIHJldDsKLQogCXJldCA9IGV4dDRfY29udmVydF91bndyaXR0ZW5fZXh0ZW50cyhpbm9kZSwgb2Zmc2V0LCBzaXplKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHVud3JpdHRlbiAiCi0JCQkiZXh0ZW50cyB0byB3cml0dGVuIGV4dGVudHMsIGVycm9yIGlzICVkICIKLQkJCSJpbyBpcyBzdGlsbCBvbiBpbm9kZSAlbHUgYWlvIGRpbyBsaXN0XG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCwgaW5vZGUtPmlfaW5vKTsKLQkJcmV0dXJuIHJldDsKKwkJZXh0NF9tc2coaW5vZGUtPmlfc2IsIEtFUk5fRU1FUkcsCisJCQkgImZhaWxlZCB0byBjb252ZXJ0IHVud3JpdHRlbiBleHRlbnRzIHRvIHdyaXR0ZW4gIgorCQkJICJleHRlbnRzIC0tIHBvdGVudGlhbCBkYXRhIGxvc3MhICAiCisJCQkgIihpbm9kZSAlbHUsIG9mZnNldCAlbGx1LCBzaXplICV6ZCwgZXJyb3IgJWQpIiwKKwkJCSBpbm9kZS0+aV9pbm8sIG9mZnNldCwgc2l6ZSwgcmV0KTsKIAl9CiAKIAlpZiAoaW8tPmlvY2IpCiAJCWFpb19jb21wbGV0ZShpby0+aW9jYiwgaW8tPnJlc3VsdCwgMCk7Ci0JLyogY2xlYXIgdGhlIERJTyBBSU8gdW53cml0dGVuIGZsYWcgKi8KLQlpZiAoaW8tPmZsYWcgJiBFWFQ0X0lPX0VORF9VTldSSVRURU4pIHsKLQkJaW8tPmZsYWcgJj0gfkVYVDRfSU9fRU5EX1VOV1JJVFRFTjsKLQkJLyogV2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gKi8KLQkJd3EgPSBleHQ0X2lvZW5kX3dxKGlvLT5pbm9kZSk7Ci0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZFWFQ0X0koaW5vZGUpLT5pX2Fpb2Rpb191bndyaXR0ZW4pICYmCi0JCSAgICB3YWl0cXVldWVfYWN0aXZlKHdxKSkgewotCQkJd2FrZV91cF9hbGwod3EpOwotCQl9Ci0JfQogCisJLyogV2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gKi8KKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmRVhUNF9JKGlub2RlKS0+aV9haW9kaW9fdW53cml0dGVuKSkKKwkJd2FrZV91cF9hbGwoZXh0NF9pb2VuZF93cShpby0+aW5vZGUpKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDAsOSArMTI2LDE1IEBACiAJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBpby0+aW5vZGU7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbwkqZWkgPSBFWFQ0X0koaW5vZGUpOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCWludAkJCXJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaS0+aV9jb21wbGV0ZWRfaW9fbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZpby0+bGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWktPmlfY29tcGxldGVkX2lvX2xvY2ssIGZsYWdzKTsKKwkJZ290byBmcmVlOworCX0KIAogCWlmICghbXV0ZXhfdHJ5bG9jaygmaW5vZGUtPmlfbXV0ZXgpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7CiAJCS8qCiAJCSAqIFJlcXVldWUgdGhlIHdvcmsgaW5zdGVhZCBvZiB3YWl0aW5nIHNvIHRoYXQgdGhlIHdvcmsKIAkJICogaXRlbXMgcXVldWVkIGFmdGVyIHRoaXMgY2FuIGJlIHByb2Nlc3NlZC4KQEAgLTE1OSwxNyArMTUxLDExIEBACiAJCWlvLT5mbGFnIHw9IEVYVDRfSU9fRU5EX1FVRVVFRDsKIAkJcmV0dXJuOwogCX0KLQlyZXQgPSBleHQ0X2VuZF9pb19ub2xvY2soaW8pOwotCWlmIChyZXQgPCAwKSB7Ci0JCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZpby0+bGlzdCkpCi0JCWxpc3RfZGVsX2luaXQoJmlvLT5saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZpby0+bGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWktPmlfY29tcGxldGVkX2lvX2xvY2ssIGZsYWdzKTsKKwkodm9pZCkgZXh0NF9lbmRfaW9fbm9sb2NrKGlvKTsKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKK2ZyZWU6CiAJZXh0NF9mcmVlX2lvX2VuZChpbyk7CiB9CiAKQEAgLTM1MCwxMCArMzM2LDggQEAKIAlpZiAoKGlvX2VuZC0+bnVtX2lvX3BhZ2VzID49IE1BWF9JT19QQUdFUykgJiYKIAkgICAgKGlvX2VuZC0+cGFnZXNbaW9fZW5kLT5udW1faW9fcGFnZXMtMV0gIT0gaW9fcGFnZSkpCiAJCWdvdG8gc3VibWl0X2FuZF9yZXRyeTsKLQlpZiAoYnVmZmVyX3VuaW5pdChiaCkgJiYgIShpb19lbmQtPmZsYWcgJiBFWFQ0X0lPX0VORF9VTldSSVRURU4pKSB7Ci0JCWlvX2VuZC0+ZmxhZyB8PSBFWFQ0X0lPX0VORF9VTldSSVRURU47Ci0JCWF0b21pY19pbmMoJkVYVDRfSShpbm9kZSktPmlfYWlvZGlvX3Vud3JpdHRlbik7Ci0JfQorCWlmIChidWZmZXJfdW5pbml0KGJoKSkKKwkJZXh0NF9zZXRfaW9fdW53cml0dGVuX2ZsYWcoaW5vZGUsIGlvX2VuZCk7CiAJaW8tPmlvX2VuZC0+c2l6ZSArPSBiaC0+Yl9zaXplOwogCWlvLT5pb19uZXh0X2Jsb2NrKys7CiAJcmV0ID0gYmlvX2FkZF9wYWdlKGlvLT5pb19iaW8sIGJoLT5iX3BhZ2UsIGJoLT5iX3NpemUsIGJoX29mZnNldChiaCkpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9yZXNpemUuYyBiL2ZzL2V4dDQvcmVzaXplLmMKaW5kZXggNzA3ZDNmMS4uOTk2NzgwYSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9yZXNpemUuYworKysgYi9mcy9leHQ0L3Jlc2l6ZS5jCkBAIC04NzUsNyArODc1LDcgQEAKIAlleHQ0X2Jsb2NrX2JpdG1hcF9zZXQoc2IsIGdkcCwgaW5wdXQtPmJsb2NrX2JpdG1hcCk7IC8qIExWIEZJWE1FICovCiAJZXh0NF9pbm9kZV9iaXRtYXBfc2V0KHNiLCBnZHAsIGlucHV0LT5pbm9kZV9iaXRtYXApOyAvKiBMViBGSVhNRSAqLwogCWV4dDRfaW5vZGVfdGFibGVfc2V0KHNiLCBnZHAsIGlucHV0LT5pbm9kZV90YWJsZSk7IC8qIExWIEZJWE1FICovCi0JZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCk7CisJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLCBpbnB1dC0+ZnJlZV9ibG9ja3NfY291bnQpOwogCWV4dDRfZnJlZV9pbm9kZXNfc2V0KHNiLCBnZHAsIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpOwogCWdkcC0+YmdfZmxhZ3MgPSBjcHVfdG9fbGUxNihFWFQ0X0JHX0lOT0RFX1pFUk9FRCk7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgaW5wdXQtPmdyb3VwLCBnZHApOwpAQCAtOTM3LDggKzkzNyw4IEBACiAJCWlucHV0LT5yZXNlcnZlZF9ibG9ja3MpOwogCiAJLyogVXBkYXRlIHRoZSBmcmVlIHNwYWNlIGNvdW50cyAqLwotCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKLQkJCSAgIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCk7CisJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIsCisJCQkgICBFWFQ0X0IyQyhzYmksIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCkpOwogCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKIAkJCSAgIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpOwogCkBAIC05NDYsOCArOTQ2LDggQEAKIAkgICAgc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXgpIHsKIAkJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXA7CiAJCWZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBpbnB1dC0+Z3JvdXApOwotCQlhdG9taWNfYWRkKGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCwKLQkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MpOworCQlhdG9taWNfYWRkKEVYVDRfQjJDKHNiaSwgaW5wdXQtPmZyZWVfYmxvY2tzX2NvdW50KSwKKwkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9jbHVzdGVycyk7CiAJCWF0b21pY19hZGQoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwKIAkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9pbm9kZXMpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCA0NGQwYzhkLi45OTUzZDgwIDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSAiZXh0NC5oIgorI2luY2x1ZGUgImV4dDRfZXh0ZW50cy5oIgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCkBAIC0xNjMsOCArMTY0LDggQEAKIAkJIChleHQ0X2ZzYmxrX3QpbGUzMl90b19jcHUoYmctPmJnX2lub2RlX3RhYmxlX2hpKSA8PCAzMiA6IDApOwogfQogCi1fX3UzMiBleHQ0X2ZyZWVfYmxrc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpCitfX3UzMiBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZykKIHsKIAlyZXR1cm4gbGUxNl90b19jcHUoYmctPmJnX2ZyZWVfYmxvY2tzX2NvdW50X2xvKSB8CiAJCShFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUID8KQEAgLTIxOSw4ICsyMjAsOCBAQAogCQliZy0+YmdfaW5vZGVfdGFibGVfaGkgPSBjcHVfdG9fbGUzMihibGsgPj4gMzIpOwogfQogCi12b2lkIGV4dDRfZnJlZV9ibGtzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpCit2b2lkIGV4dDRfZnJlZV9ncm91cF9jbHVzdGVyc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCkKIHsKIAliZy0+YmdfZnJlZV9ibG9ja3NfY291bnRfbG8gPSBjcHVfdG9fbGUxNigoX191MTYpY291bnQpOwogCWlmIChFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUKQpAQCAtNDE0LDYgKzQxNSwyMiBAQAogCWV4dDRfY29tbWl0X3N1cGVyKHNiLCAxKTsKIH0KIAorLyoKKyAqIFRoZSBkZWxfZ2VuZGlzaygpIGZ1bmN0aW9uIHVuaW5pdGlhbGl6ZXMgdGhlIGRpc2stc3BlY2lmaWMgZGF0YQorICogc3RydWN0dXJlcywgaW5jbHVkaW5nIHRoZSBiZGkgc3RydWN0dXJlLCB3aXRob3V0IHRlbGxpbmcgYW55b25lCisgKiBlbHNlLiAgT25jZSB0aGlzIGhhcHBlbnMsIGFueSBhdHRlbXB0IHRvIGNhbGwgbWFya19idWZmZXJfZGlydHkoKQorICogKGZvciBleGFtcGxlLCBieSBleHQ0X2NvbW1pdF9zdXBlciksIHdpbGwgY2F1c2UgYSBrZXJuZWwgT09QUy4KKyAqIFRoaXMgaXMgYSBrbHVkZ2UgdG8gcHJldmVudCB0aGVzZSBvb3BzIHVudGlsIHdlIGNhbiBwdXQgaW4gYSBwcm9wZXIKKyAqIGhvb2sgaW4gZGVsX2dlbmRpc2soKSB0byBpbmZvcm0gdGhlIFZGUyBhbmQgZmlsZSBzeXN0ZW0gbGF5ZXJzLgorICovCitzdGF0aWMgaW50IGJsb2NrX2RldmljZV9lamVjdGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlub2RlICpiZF9pbm9kZSA9IHNiLT5zX2JkZXYtPmJkX2lub2RlOworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBiZF9pbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCisJcmV0dXJuIGJkaS0+ZGV2ID09IE5VTEw7Cit9CisKIAogLyogRGVhbCB3aXRoIHRoZSByZXBvcnRpbmcgb2YgZmFpbHVyZSBjb25kaXRpb25zIG9uIGEgZmlsZXN5c3RlbSBzdWNoIGFzCiAgKiBpbmNvbnNpc3RlbmNpZXMgZGV0ZWN0ZWQgb3IgcmVhZCBJTyBmYWlsdXJlcy4KQEAgLTgyMSwxMCArODM4LDEwIEBACiAJCWJyZWxzZShzYmktPnNfZ3JvdXBfZGVzY1tpXSk7CiAJZXh0NF9rdmZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOwogCWV4dDRfa3ZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7Ci0JcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKLQlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlcik7CiAJYnJlbHNlKHNiaS0+c19zYmgpOwogI2lmZGVmIENPTkZJR19RVU9UQQogCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKQEAgLTEwNTcsOCArMTA3NCw2IEBACiAJCXNlcV9wdXRzKHNlcSwgIixub3VpZDMyIik7CiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykgJiYgIShkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9ERUJVRykpCiAJCXNlcV9wdXRzKHNlcSwgIixkZWJ1ZyIpOwotCWlmICh0ZXN0X29wdChzYiwgT0xEQUxMT0MpKQotCQlzZXFfcHV0cyhzZXEsICIsb2xkYWxsb2MiKTsKICNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCWlmICh0ZXN0X29wdChzYiwgWEFUVFJfVVNFUikpCiAJCXNlcV9wdXRzKHNlcSwgIix1c2VyX3hhdHRyIik7CkBAIC0xNTY3LDEwICsxNTgyLDEyIEBACiAJCQlzZXRfb3B0KHNiLCBERUJVRyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfb2xkYWxsb2M6Ci0JCQlzZXRfb3B0KHNiLCBPTERBTExPQyk7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJCSAiSWdub3JpbmcgZGVwcmVjYXRlZCBvbGRhbGxvYyBvcHRpb24iKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9vcmxvdjoKLQkJCWNsZWFyX29wdChzYiwgT0xEQUxMT0MpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCQkgIklnbm9yaW5nIGRlcHJlY2F0ZWQgb3Jsb3Ygb3B0aW9uIik7CiAJCQlicmVhazsKICNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCQljYXNlIE9wdF91c2VyX3hhdHRyOgpAQCAtMTgwMSw2ICsxODE4LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2RlbGFsbG9jOgogCQkJY2xlYXJfb3B0KHNiLCBERUxBTExPQyk7CisJCQljbGVhcl9vcHQyKHNiLCBFWFBMSUNJVF9ERUxBTExPQyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbWJsa19pb19zdWJtaXQ6CiAJCQlzZXRfb3B0KHNiLCBNQkxLX0lPX1NVQk1JVCk7CkBAIC0xODE3LDYgKzE4MzUsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2RlbGFsbG9jOgogCQkJc2V0X29wdChzYiwgREVMQUxMT0MpOworCQkJc2V0X29wdDIoc2IsIEVYUExJQ0lUX0RFTEFMTE9DKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ibG9ja192YWxpZGl0eToKIAkJCXNldF9vcHQoc2IsIEJMT0NLX1ZBTElESVRZKTsKQEAgLTE5MzUsNyArMTk1NCw3IEBACiAJCXJlcyA9IE1TX1JET05MWTsKIAl9CiAJaWYgKHJlYWRfb25seSkKLQkJcmV0dXJuIHJlczsKKwkJZ290byBkb25lOwogCWlmICghKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDRfVkFMSURfRlMpKQogCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCAid2FybmluZzogbW91bnRpbmcgdW5jaGVja2VkIGZzLCAiCiAJCQkgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIik7CkBAIC0xOTY2LDYgKzE5ODUsNyBAQAogCQlFWFQ0X1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CiAKIAlleHQ0X2NvbW1pdF9zdXBlcihzYiwgMSk7Citkb25lOgogCWlmICh0ZXN0X29wdChzYiwgREVCVUcpKQogCQlwcmludGsoS0VSTl9JTkZPICJbRVhUNCBGUyBicz0lbHUsIGdjPSV1LCAiCiAJCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNHgsIG1vMj0lMDR4XVxuIiwKQEAgLTIwMTUsOCArMjAzNSw4IEBACiAJCWZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBpKTsKIAkJYXRvbWljX2FkZChleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApLAogCQkJICAgJnNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS5mcmVlX2lub2Rlcyk7Ci0JCWF0b21pY19hZGQoZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCksCi0JCQkgICAmc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfYmxvY2tzKTsKKwkJYXRvbWljX2FkZChleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGdkcCksCisJCQkgICAmc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfY2x1c3RlcnMpOwogCQlhdG9taWNfYWRkKGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBnZHApLAogCQkJICAgJnNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS51c2VkX2RpcnMpOwogCX0KQEAgLTIxMzQsNyArMjE1NCw4IEBACiAJaWYgKE5VTEwgIT0gZmlyc3Rfbm90X3plcm9lZCkKIAkJKmZpcnN0X25vdF96ZXJvZWQgPSBncnA7CiAKLQlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChzYmktPnNfZXMsIGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChzYmktPnNfZXMsCisJCQkJICAgRVhUNF9DMkIoc2JpLCBleHQ0X2NvdW50X2ZyZWVfY2x1c3RlcnMoc2IpKSk7CiAJc2JpLT5zX2VzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID1jcHVfdG9fbGUzMihleHQ0X2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CiAJcmV0dXJuIDE7CiB9CkBAIC0yNDU0LDcgKzI0NzUsOCBAQAogCQkJCQkgICAgICBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJCShzNjQpIHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIpKTsKKwkJKHM2NCkgRVhUNF9DMkIoc2JpLAorCQkJcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyKSkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzZXNzaW9uX3dyaXRlX2tieXRlc19zaG93KHN0cnVjdCBleHQ0X2F0dHIgKmEsCkBAIC0yNjgyLDYgKzI3MDQsMTMgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJfQorCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9CSUdBTExPQykgJiYKKwkgICAgIUVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkgeworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkgIkNhbid0IHN1cHBvcnQgYmlnYWxsb2MgZmVhdHVyZSB3aXRob3V0ICIKKwkJCSAiZXh0ZW50cyBmZWF0dXJlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQogCXJldHVybiAxOwogfQogCkBAIC0zMDg3LDEwICszMTE2LDEwIEBACiAJY2hhciAqY3A7CiAJY29uc3QgY2hhciAqZGVzY3I7CiAJaW50IHJldCA9IC1FTk9NRU07Ci0JaW50IGJsb2Nrc2l6ZTsKKwlpbnQgYmxvY2tzaXplLCBjbHVzdGVyc2l6ZTsKIAl1bnNpZ25lZCBpbnQgZGJfY291bnQ7CiAJdW5zaWduZWQgaW50IGk7Ci0JaW50IG5lZWRzX3JlY292ZXJ5LCBoYXNfaHVnZV9maWxlczsKKwlpbnQgbmVlZHNfcmVjb3ZlcnksIGhhc19odWdlX2ZpbGVzLCBoYXNfYmlnYWxsb2M7CiAJX191NjQgYmxvY2tzX2NvdW50OwogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IGpvdXJuYWxfaW9wcmlvID0gREVGQVVMVF9KT1VSTkFMX0lPUFJJTzsKQEAgLTMyMjQsNiArMzI1MywzMyBAQAogCQkJICAgJmpvdXJuYWxfaW9wcmlvLCBOVUxMLCAwKSkKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAKKwlpZiAodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBKSB7CisJCXByaW50a19vbmNlKEtFUk5fV0FSTklORyAiRVhUNC1mczogV2FybmluZzogbW91bnRpbmcgIgorCQkJICAgICJ3aXRoIGRhdGE9am91cm5hbCBkaXNhYmxlcyBkZWxheWVkICIKKwkJCSAgICAiYWxsb2NhdGlvbiBhbmQgT19ESVJFQ1Qgc3VwcG9ydCFcbiIpOworCQlpZiAodGVzdF9vcHQyKHNiLCBFWFBMSUNJVF9ERUxBTExPQykpIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImNhbid0IG1vdW50IHdpdGggIgorCQkJCSAiYm90aCBkYXRhPWpvdXJuYWwgYW5kIGRlbGFsbG9jIik7CisJCQlnb3RvIGZhaWxlZF9tb3VudDsKKwkJfQorCQlpZiAodGVzdF9vcHQoc2IsIERJT1JFQURfTk9MT0NLKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiY2FuJ3QgbW91bnQgd2l0aCAiCisJCQkJICJib3RoIGRhdGE9am91cm5hbCBhbmQgZGVsYWxsb2MiKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJCWlmICh0ZXN0X29wdChzYiwgREVMQUxMT0MpKQorCQkJY2xlYXJfb3B0KHNiLCBERUxBTExPQyk7CisJfQorCisJYmxvY2tzaXplID0gQkxPQ0tfU0laRSA8PCBsZTMyX3RvX2NwdShlcy0+c19sb2dfYmxvY2tfc2l6ZSk7CisJaWYgKHRlc3Rfb3B0KHNiLCBESU9SRUFEX05PTE9DSykpIHsKKwkJaWYgKGJsb2Nrc2l6ZSA8IFBBR0VfU0laRSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiY2FuJ3QgbW91bnQgd2l0aCAiCisJCQkJICJkaW9yZWFkX25vbG9jayBpZiBibG9jayBzaXplICE9IFBBR0VfU0laRSIpOworCQkJZ290byBmYWlsZWRfbW91bnQ7CisJCX0KKwl9CisKIAlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAogCQkodGVzdF9vcHQoc2IsIFBPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOwogCkBAIC0zMjY1LDggKzMzMjEsNiBAQAogCWlmICghZXh0NF9mZWF0dXJlX3NldF9vayhzYiwgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkpCiAJCWdvdG8gZmFpbGVkX21vdW50OwogCi0JYmxvY2tzaXplID0gQkxPQ0tfU0laRSA8PCBsZTMyX3RvX2NwdShlcy0+c19sb2dfYmxvY2tfc2l6ZSk7Ci0KIAlpZiAoYmxvY2tzaXplIDwgRVhUNF9NSU5fQkxPQ0tfU0laRSB8fAogCSAgICBibG9ja3NpemUgPiBFWFQ0X01BWF9CTE9DS19TSVpFKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKQEAgLTMzNjksMTIgKzM0MjMsNTMgQEAKIAkJc2ItPnNfZGlydCA9IDE7CiAJfQogCi0JaWYgKHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgewotCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCi0JCSAgICAgICAiI2Jsb2NrcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKLQkJICAgICAgIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwKTsKLQkJZ290byBmYWlsZWRfbW91bnQ7CisJLyogSGFuZGxlIGNsdXN0ZXJzaXplICovCisJY2x1c3RlcnNpemUgPSBCTE9DS19TSVpFIDw8IGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19jbHVzdGVyX3NpemUpOworCWhhc19iaWdhbGxvYyA9IEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCUVYVDRfRkVBVFVSRV9ST19DT01QQVRfQklHQUxMT0MpOworCWlmIChoYXNfYmlnYWxsb2MpIHsKKwkJaWYgKGNsdXN0ZXJzaXplIDwgYmxvY2tzaXplKSB7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkJICJjbHVzdGVyIHNpemUgKCVkKSBzbWFsbGVyIHRoYW4gIgorCQkJCSAiYmxvY2sgc2l6ZSAoJWQpIiwgY2x1c3RlcnNpemUsIGJsb2Nrc2l6ZSk7CisJCQlnb3RvIGZhaWxlZF9tb3VudDsKKwkJfQorCQlzYmktPnNfY2x1c3Rlcl9iaXRzID0gbGUzMl90b19jcHUoZXMtPnNfbG9nX2NsdXN0ZXJfc2l6ZSkgLQorCQkJbGUzMl90b19jcHUoZXMtPnNfbG9nX2Jsb2NrX3NpemUpOworCQlzYmktPnNfY2x1c3RlcnNfcGVyX2dyb3VwID0KKwkJCWxlMzJfdG9fY3B1KGVzLT5zX2NsdXN0ZXJzX3Blcl9ncm91cCk7CisJCWlmIChzYmktPnNfY2x1c3RlcnNfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiI2NsdXN0ZXJzIHBlciBncm91cCB0b28gYmlnOiAlbHUiLAorCQkJCSBzYmktPnNfY2x1c3RlcnNfcGVyX2dyb3VwKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJCWlmIChzYmktPnNfYmxvY2tzX3Blcl9ncm91cCAhPQorCQkgICAgKHNiaS0+c19jbHVzdGVyc19wZXJfZ3JvdXAgKiAoY2x1c3RlcnNpemUgLyBibG9ja3NpemUpKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiYmxvY2tzIHBlciBncm91cCAoJWx1KSBhbmQgIgorCQkJCSAiY2x1c3RlcnMgcGVyIGdyb3VwICglbHUpIGluY29uc2lzdGVudCIsCisJCQkJIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwLAorCQkJCSBzYmktPnNfY2x1c3RlcnNfcGVyX2dyb3VwKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNsdXN0ZXJzaXplICE9IGJsb2Nrc2l6ZSkgeworCQkJZXh0NF93YXJuaW5nKHNiLCAiZnJhZ21lbnQvY2x1c3RlciBzaXplICglZCkgIT0gIgorCQkJCSAgICAgImJsb2NrIHNpemUgKCVkKSIsIGNsdXN0ZXJzaXplLAorCQkJCSAgICAgYmxvY2tzaXplKTsKKwkJCWNsdXN0ZXJzaXplID0gYmxvY2tzaXplOworCQl9CisJCWlmIChzYmktPnNfYmxvY2tzX3Blcl9ncm91cCA+IGJsb2Nrc2l6ZSAqIDgpIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkgIiNibG9ja3MgcGVyIGdyb3VwIHRvbyBiaWc6ICVsdSIsCisJCQkJIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJCXNiaS0+c19jbHVzdGVyc19wZXJfZ3JvdXAgPSBzYmktPnNfYmxvY2tzX3Blcl9ncm91cDsKKwkJc2JpLT5zX2NsdXN0ZXJfYml0cyA9IDA7CiAJfQorCXNiaS0+c19jbHVzdGVyX3JhdGlvID0gY2x1c3RlcnNpemUgLyBibG9ja3NpemU7CisKIAlpZiAoc2JpLT5zX2lub2Rlc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKIAkJICAgICAgICIjaW5vZGVzIHBlciBncm91cCB0b28gYmlnOiAlbHUiLApAQCAtMzQ0NiwxMCArMzU0MSw4IEBACiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJaWYgKGV4dDRfcHJvY19yb290KQogCQlzYmktPnNfcHJvYyA9IHByb2NfbWtkaXIoc2ItPnNfaWQsIGV4dDRfcHJvY19yb290KTsKLSNlbmRpZgogCiAJYmdsX2xvY2tfaW5pdChzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIApAQCAtMzQ4Myw4ICszNTc2LDggQEAKIAlzYmktPnNfZXJyX3JlcG9ydC5mdW5jdGlvbiA9IHByaW50X2RhaWx5X2Vycm9yX2luZm87CiAJc2JpLT5zX2Vycl9yZXBvcnQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzYjsKIAotCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsCi0JCQlleHQ0X2NvdW50X2ZyZWVfYmxvY2tzKHNiKSk7CisJZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyLAorCQkJZXh0NF9jb3VudF9mcmVlX2NsdXN0ZXJzKHNiKSk7CiAJaWYgKCFlcnIpIHsKIAkJZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKIAkJCQlleHQ0X2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CkBAIC0zNDk0LDcgKzM1ODcsNyBAQAogCQkJCWV4dDRfY291bnRfZGlycyhzYikpOwogCX0KIAlpZiAoIWVycikgewotCQllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwgMCk7CisJCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsIDApOwogCX0KIAlpZiAoZXJyKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImluc3VmZmljaWVudCBtZW1vcnkiKTsKQEAgLTM2MDksMTMgKzM3MDIsMTMgQEAKIAkgKiBUaGUgam91cm5hbCBtYXkgaGF2ZSB1cGRhdGVkIHRoZSBiZyBzdW1tYXJ5IGNvdW50cywgc28gd2UKIAkgKiBuZWVkIHRvIHVwZGF0ZSB0aGUgZ2xvYmFsIGNvdW50ZXJzLgogCSAqLwotCXBlcmNwdV9jb3VudGVyX3NldCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKLQkJCSAgIGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwlwZXJjcHVfY291bnRlcl9zZXQoJnNiaS0+c19mcmVlY2x1c3RlcnNfY291bnRlciwKKwkJCSAgIGV4dDRfY291bnRfZnJlZV9jbHVzdGVycyhzYikpOwogCXBlcmNwdV9jb3VudGVyX3NldCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKIAkJCSAgIGV4dDRfY291bnRfZnJlZV9pbm9kZXMoc2IpKTsKIAlwZXJjcHVfY291bnRlcl9zZXQoJnNiaS0+c19kaXJzX2NvdW50ZXIsCiAJCQkgICBleHQ0X2NvdW50X2RpcnMoc2IpKTsKLQlwZXJjcHVfY291bnRlcl9zZXQoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLCAwKTsKKwlwZXJjcHVfY291bnRlcl9zZXQoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsIDApOwogCiBub19qb3VybmFsOgogCS8qCkBAIC0zNjc5LDI1ICszNzcyLDYgQEAKIAkJCSAiYXZhaWxhYmxlIik7CiAJfQogCi0JaWYgKHRlc3Rfb3B0KHNiLCBERUxBTExPQykgJiYKLQkgICAgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSkpIHsKLQkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgIklnbm9yaW5nIGRlbGFsbG9jIG9wdGlvbiAtICIKLQkJCSAicmVxdWVzdGVkIGRhdGEgam91cm5hbGluZyBtb2RlIik7Ci0JCWNsZWFyX29wdChzYiwgREVMQUxMT0MpOwotCX0KLQlpZiAodGVzdF9vcHQoc2IsIERJT1JFQURfTk9MT0NLKSkgewotCQlpZiAodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBKSB7Ci0JCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCAiSWdub3JpbmcgZGlvcmVhZF9ub2xvY2sgIgotCQkJCSJvcHRpb24gLSByZXF1ZXN0ZWQgZGF0YSBqb3VybmFsaW5nIG1vZGUiKTsKLQkJCWNsZWFyX29wdChzYiwgRElPUkVBRF9OT0xPQ0spOwotCQl9Ci0JCWlmIChzYi0+c19ibG9ja3NpemUgPCBQQUdFX1NJWkUpIHsKLQkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJJZ25vcmluZyBkaW9yZWFkX25vbG9jayAiCi0JCQkJIm9wdGlvbiAtIGJsb2NrIHNpemUgaXMgdG9vIHNtYWxsIik7Ci0JCQljbGVhcl9vcHQoc2IsIERJT1JFQURfTk9MT0NLKTsKLQkJfQotCX0KLQogCWVyciA9IGV4dDRfc2V0dXBfc3lzdGVtX3pvbmUoc2IpOwogCWlmIChlcnIpIHsKIAkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIGluaXRpYWxpemUgc3lzdGVtICIKQEAgLTM3MTAsMjIgKzM3ODQsMTkgQEAKIAlpZiAoZXJyKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImZhaWxlZCB0byBpbml0aWFsaXplIG1iYWxsb2MgKCVkKSIsCiAJCQkgZXJyKTsKLQkJZ290byBmYWlsZWRfbW91bnQ0OworCQlnb3RvIGZhaWxlZF9tb3VudDU7CiAJfQogCiAJZXJyID0gZXh0NF9yZWdpc3Rlcl9saV9yZXF1ZXN0KHNiLCBmaXJzdF9ub3RfemVyb2VkKTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWxlZF9tb3VudDQ7CisJCWdvdG8gZmFpbGVkX21vdW50NjsKIAogCXNiaS0+c19rb2JqLmtzZXQgPSBleHQ0X2tzZXQ7CiAJaW5pdF9jb21wbGV0aW9uKCZzYmktPnNfa29ial91bnJlZ2lzdGVyKTsKIAllcnIgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmc2JpLT5zX2tvYmosICZleHQ0X2t0eXBlLCBOVUxMLAogCQkJCSAgICIlcyIsIHNiLT5zX2lkKTsKLQlpZiAoZXJyKSB7Ci0JCWV4dDRfbWJfcmVsZWFzZShzYik7Ci0JCWV4dDRfZXh0X3JlbGVhc2Uoc2IpOwotCQlnb3RvIGZhaWxlZF9tb3VudDQ7Ci0JfTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxlZF9tb3VudDc7CiAKIAlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X09SUEhBTl9GUzsKIAlleHQ0X29ycGhhbl9jbGVhbnVwKHNiLCBlcyk7CkBAIC0zNzU5LDEzICszODMwLDE5IEBACiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIlZGUzogQ2FuJ3QgZmluZCBleHQ0IGZpbGVzeXN0ZW0iKTsKIAlnb3RvIGZhaWxlZF9tb3VudDsKIAorZmFpbGVkX21vdW50NzoKKwlleHQ0X3VucmVnaXN0ZXJfbGlfcmVxdWVzdChzYik7CitmYWlsZWRfbW91bnQ2OgorCWV4dDRfZXh0X3JlbGVhc2Uoc2IpOworZmFpbGVkX21vdW50NToKKwlleHQ0X21iX3JlbGVhc2Uoc2IpOworCWV4dDRfcmVsZWFzZV9zeXN0ZW1fem9uZShzYik7CiBmYWlsZWRfbW91bnQ0OgogCWlwdXQocm9vdCk7CiAJc2ItPnNfcm9vdCA9IE5VTEw7CiAJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAibW91bnQgZmFpbGVkIik7CiAJZGVzdHJveV93b3JrcXVldWUoRVhUNF9TQihzYiktPmRpb191bndyaXR0ZW5fd3EpOwogZmFpbGVkX21vdW50X3dxOgotCWV4dDRfcmVsZWFzZV9zeXN0ZW1fem9uZShzYik7CiAJaWYgKHNiaS0+c19qb3VybmFsKSB7CiAJCWpiZDJfam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKIAkJc2JpLT5zX2pvdXJuYWwgPSBOVUxMOwpAQCAtMzc3NCwxMCArMzg1MSwxMCBAQAogCWRlbF90aW1lcigmc2JpLT5zX2Vycl9yZXBvcnQpOwogCWlmIChzYmktPnNfZmxleF9ncm91cHMpCiAJCWV4dDRfa3ZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7Ci0JcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKLQlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlcik7CiAJaWYgKHNiaS0+c19tbXBfdHNrKQogCQlrdGhyZWFkX3N0b3Aoc2JpLT5zX21tcF90c2spOwogZmFpbGVkX21vdW50MjoKQEAgLTQwNjQsNyArNDE0MSw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpzYmggPSBFWFQ0X1NCKHNiKS0+c19zYmg7CiAJaW50IGVycm9yID0gMDsKIAotCWlmICghc2JoKQorCWlmICghc2JoIHx8IGJsb2NrX2RldmljZV9lamVjdGVkKHNiKSkKIAkJcmV0dXJuIGVycm9yOwogCWlmIChidWZmZXJfd3JpdGVfaW9fZXJyb3Ioc2JoKSkgewogCQkvKgpAQCAtNDEwMCw4ICs0MTc3LDkgQEAKIAllbHNlCiAJCWVzLT5zX2tieXRlc193cml0dGVuID0KIAkJCWNwdV90b19sZTY0KEVYVDRfU0Ioc2IpLT5zX2tieXRlc193cml0dGVuKTsKLQlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChlcywgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKAotCQkJCQkgICAmRVhUNF9TQihzYiktPnNfZnJlZWJsb2Nrc19jb3VudGVyKSk7CisJZXh0NF9mcmVlX2Jsb2Nrc19jb3VudF9zZXQoZXMsCisJCQlFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKAorCQkJCSZFWFQ0X1NCKHNiKS0+c19mcmVlY2x1c3RlcnNfY291bnRlcikpKTsKIAllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9CiAJCWNwdV90b19sZTMyKHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgKIAkJCQkmRVhUNF9TQihzYiktPnNfZnJlZWlub2Rlc19jb3VudGVyKSk7CkBAIC00NTA2LDE2ICs0NTg0LDM0IEBACiAJcmV0dXJuIGVycjsKIH0KIAorLyoKKyAqIE5vdGU6IGNhbGN1bGF0aW5nIHRoZSBvdmVyaGVhZCBzbyB3ZSBjYW4gYmUgY29tcGF0aWJsZSB3aXRoCisgKiBoaXN0b3JpY2FsIEJTRCBwcmFjdGljZSBpcyBxdWl0ZSBkaWZmaWN1bHQgaW4gdGhlIGZhY2Ugb2YKKyAqIGNsdXN0ZXJzL2JpZ2FsbG9jLiAgVGhpcyBpcyBiZWNhdXNlIG11bHRpcGxlIG1ldGFkYXRhIGJsb2NrcyBmcm9tCisgKiBkaWZmZXJlbnQgYmxvY2sgZ3JvdXAgY2FuIGVuZCB1cCBpbiB0aGUgc2FtZSBhbGxvY2F0aW9uIGNsdXN0ZXIuCisgKiBDYWxjdWxhdGluZyB0aGUgZXhhY3Qgb3ZlcmhlYWQgaW4gdGhlIGZhY2Ugb2YgY2x1c3RlcmVkIGFsbG9jYXRpb24KKyAqIHJlcXVpcmVzIGVpdGhlciBPKGFsbCBibG9jayBiaXRtYXBzKSBpbiBtZW1vcnkgb3IgTyhudW1iZXIgb2YgYmxvY2sKKyAqIGdyb3VwcyoqMikgaW4gdGltZS4gIFdlIHdpbGwgc3RpbGwgY2FsY3VsYXRlIHRoZSBzdXBlcmJsb2NrIGZvcgorICogb2xkZXIgZmlsZSBzeXN0ZW1zIC0tLSBhbmQgaWYgd2UgY29tZSBhY3Jvc3Mgd2l0aCBhIGJpZ2FsbG9jIGZpbGUKKyAqIHN5c3RlbSB3aXRoIHplcm8gaW4gc19vdmVyaGVhZF9jbHVzdGVycyB0aGUgZXN0aW1hdGUgd2lsbCBiZSBjbG9zZSB0bworICogY29ycmVjdCBlc3BlY2lhbGx5IGZvciB2ZXJ5IGxhcmdlIGNsdXN0ZXIgc2l6ZXMgLS0tIGJ1dCBmb3IgbmV3ZXIKKyAqIGZpbGUgc3lzdGVtcywgaXQncyBiZXR0ZXIgdG8gY2FsY3VsYXRlIHRoaXMgZmlndXJlIG9uY2UgYXQgbWtmcworICogdGltZSwgYW5kIHN0b3JlIGl0IGluIHRoZSBzdXBlcmJsb2NrLiAgSWYgdGhlIHN1cGVyYmxvY2sgdmFsdWUgaXMKKyAqIHByZXNlbnQgKGV2ZW4gZm9yIG5vbi1iaWdhbGxvYyBmaWxlIHN5c3RlbXMpLCB3ZSB3aWxsIHVzZSBpdC4KKyAqLwogc3RhdGljIGludCBleHQ0X3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwOwogCXU2NCBmc2lkOwogCXM2NCBiZnJlZTsKIAogCWlmICh0ZXN0X29wdChzYiwgTUlOSVhfREYpKSB7CiAJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gMDsKKwl9IGVsc2UgaWYgKGVzLT5zX292ZXJoZWFkX2NsdXN0ZXJzKSB7CisJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gbGUzMl90b19jcHUoZXMtPnNfb3ZlcmhlYWRfY2x1c3RlcnMpOwogCX0gZWxzZSBpZiAoc2JpLT5zX2Jsb2Nrc19sYXN0ICE9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgewogCQlleHQ0X2dyb3VwX3QgaSwgbmdyb3VwcyA9IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzYik7CiAJCWV4dDRfZnNibGtfdCBvdmVyaGVhZCA9IDA7CkBAIC00NTMwLDI0ICs0NjI2LDE2IEBACiAJCSAqIEFsbCBvZiB0aGUgYmxvY2tzIGJlZm9yZSBmaXJzdF9kYXRhX2Jsb2NrIGFyZQogCQkgKiBvdmVyaGVhZAogCQkgKi8KLQkJb3ZlcmhlYWQgPSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwkJb3ZlcmhlYWQgPSBFWFQ0X0IyQyhzYmksIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKTsKIAogCQkvKgotCQkgKiBBZGQgdGhlIG92ZXJoZWFkIGF0dHJpYnV0ZWQgdG8gdGhlIHN1cGVyYmxvY2sgYW5kCi0JCSAqIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzLiAgSWYgdGhlIHNwYXJzZSBzdXBlcmJsb2NrcwotCQkgKiBmZWF0dXJlIGlzIHR1cm5lZCBvbiwgdGhlbiBub3QgYWxsIGdyb3VwcyBoYXZlIHRoaXMuCisJCSAqIEFkZCB0aGUgb3ZlcmhlYWQgZm91bmQgaW4gZWFjaCBibG9jayBncm91cAogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgewotCQkJb3ZlcmhlYWQgKz0gZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGkpICsKLQkJCQlleHQ0X2JnX251bV9nZGIoc2IsIGkpOworCQkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCQlvdmVyaGVhZCArPSBleHQ0X251bV9vdmVyaGVhZF9jbHVzdGVycyhzYiwgaSwgZ2RwKTsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCQl9Ci0KLQkJLyoKLQkJICogRXZlcnkgYmxvY2sgZ3JvdXAgaGFzIGFuIGlub2RlIGJpdG1hcCwgYSBibG9jawotCQkgKiBiaXRtYXAsIGFuZCBhbiBpbm9kZSB0YWJsZS4KLQkJICovCi0JCW92ZXJoZWFkICs9IG5ncm91cHMgKiAoMiArIHNiaS0+c19pdGJfcGVyX2dyb3VwKTsKIAkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSBvdmVyaGVhZDsKIAkJc21wX3dtYigpOwogCQlzYmktPnNfYmxvY2tzX2xhc3QgPSBleHQ0X2Jsb2Nrc19jb3VudChlcyk7CkBAIC00NTU1LDExICs0NjQzLDEyIEBACiAKIAlidWYtPmZfdHlwZSA9IEVYVDRfU1VQRVJfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCWJ1Zi0+Zl9ibG9ja3MgPSBleHQ0X2Jsb2Nrc19jb3VudChlcykgLSBzYmktPnNfb3ZlcmhlYWRfbGFzdDsKLQliZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcikgLQotCQkgICAgICAgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcik7CisJYnVmLT5mX2Jsb2NrcyA9IChleHQ0X2Jsb2Nrc19jb3VudChlcykgLQorCQkJIEVYVDRfQzJCKHNiaSwgc2JpLT5zX292ZXJoZWFkX2xhc3QpKTsKKwliZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyKSAtCisJCXBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlcik7CiAJLyogcHJldmVudCB1bmRlcmZsb3cgaW4gY2FzZSB0aGF0IGZldyBmcmVlIHNwYWNlIGlzIGF2YWlsYWJsZSAqLwotCWJ1Zi0+Zl9iZnJlZSA9IG1heF90KHM2NCwgYmZyZWUsIDApOworCWJ1Zi0+Zl9iZnJlZSA9IEVYVDRfQzJCKHNiaSwgbWF4X3QoczY0LCBiZnJlZSwgMCkpOwogCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWUgLSBleHQ0X3JfYmxvY2tzX2NvdW50KGVzKTsKIAlpZiAoYnVmLT5mX2JmcmVlIDwgZXh0NF9yX2Jsb2Nrc19jb3VudChlcykpCiAJCWJ1Zi0+Zl9iYXZhaWwgPSAwOwpAQCAtNDk4MCwxMyArNTA2OSwxMSBAQAogCQlyZXR1cm4gZXJyOwogCWVyciA9IGV4dDRfaW5pdF9zeXN0ZW1fem9uZSgpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0NzsKKwkJZ290byBvdXQ2OwogCWV4dDRfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImV4dDQiLCBOVUxMLCBmc19rb2JqKTsKIAlpZiAoIWV4dDRfa3NldCkKLQkJZ290byBvdXQ2OwotCWV4dDRfcHJvY19yb290ID0gcHJvY19ta2RpcigiZnMvZXh0NCIsIE5VTEwpOwotCWlmICghZXh0NF9wcm9jX3Jvb3QpCiAJCWdvdG8gb3V0NTsKKwlleHQ0X3Byb2Nfcm9vdCA9IHByb2NfbWtkaXIoImZzL2V4dDQiLCBOVUxMKTsKIAogCWVyciA9IGV4dDRfaW5pdF9mZWF0X2FkdmVydHMoKTsKIAlpZiAoZXJyKQpAQCAtNTAyMiwxMiArNTEwOSwxMiBAQAogb3V0MzoKIAlleHQ0X2V4aXRfZmVhdF9hZHZlcnRzKCk7CiBvdXQ0OgotCXJlbW92ZV9wcm9jX2VudHJ5KCJmcy9leHQ0IiwgTlVMTCk7Ci1vdXQ1OgorCWlmIChleHQ0X3Byb2Nfcm9vdCkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImZzL2V4dDQiLCBOVUxMKTsKIAlrc2V0X3VucmVnaXN0ZXIoZXh0NF9rc2V0KTsKLW91dDY6CitvdXQ1OgogCWV4dDRfZXhpdF9zeXN0ZW1fem9uZSgpOwotb3V0NzoKK291dDY6CiAJZXh0NF9leGl0X3BhZ2VpbygpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQ0L3hhdHRyLmMgYi9mcy9leHQ0L3hhdHRyLmMKaW5kZXggYzc1N2FkYy4uOTNhMDBkOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC94YXR0ci5jCisrKyBiL2ZzL2V4dDQveGF0dHIuYwpAQCAtODIwLDggKzgyMCwxNCBAQAogCQkJaWYgKCEoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpKQogCQkJCWdvYWwgPSBnb2FsICYgRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTOwogCisJCQkvKgorCQkJICogdGFrZSBpX2RhdGFfc2VtIGJlY2F1c2Ugd2Ugd2lsbCB0ZXN0CisJCQkgKiBpX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcgaW4gZXh0NF9tYl9uZXdfYmxvY2tzCisJCQkgKi8KKwkJCWRvd25fcmVhZCgoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pKTsKIAkJCWJsb2NrID0gZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZ29hbCwgMCwKIAkJCQkJCSAgICAgTlVMTCwgJmVycm9yKTsKKwkJCXVwX3JlYWQoKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCkBAIC05ODUsMTEgKzk5MSw3IEBACiAJbm9fZXhwYW5kID0gZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05PX0VYUEFORCk7CiAJZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTk9fRVhQQU5EKTsKIAotCWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmaXMuaWxvYyk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGNsZWFudXA7Ci0KLQllcnJvciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaXMuaWxvYy5iaCk7CisJZXJyb3IgPSBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlzLmlsb2MpOwogCWlmIChlcnJvcikKIAkJZ290byBjbGVhbnVwOwogCmRpZmYgLS1naXQgYS9mcy9mYXQvZGlyLmMgYi9mcy9mYXQvZGlyLmMKaW5kZXggNWVmYmQ1ZC4uYWNhMTkxYiAxMDA2NDQKLS0tIGEvZnMvZmF0L2Rpci5jCisrKyBiL2ZzL2ZhdC9kaXIuYwpAQCAtMTU2LDggKzE1Niw4IEBACiAJCX0gZWxzZSB7CiAJCQlpZiAodW5pX3hsYXRlID09IDEpIHsKIAkJCQkqb3ArKyA9ICc6JzsKLQkJCQlvcCA9IHBhY2tfaGV4X2J5dGUob3AsIGVjID4+IDgpOwotCQkJCW9wID0gcGFja19oZXhfYnl0ZShvcCwgZWMpOworCQkJCW9wID0gaGV4X2J5dGVfcGFjayhvcCwgZWMgPj4gOCk7CisJCQkJb3AgPSBoZXhfYnl0ZV9wYWNrKG9wLCBlYyk7CiAJCQkJbGVuIC09IDU7CiAJCQl9IGVsc2UgewogCQkJCSpvcCsrID0gJz8nOwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZhdC5oIGIvZnMvZmF0L2ZhdC5oCmluZGV4IGE1ZDM4NTMuLjE1MTBhNGQgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9mYXQuaAorKysgYi9mcy9mYXQvZmF0LmgKQEAgLTMyNiwxNSArMzI2LDE0IEBACiBleHRlcm4gaW50IGZhdF9mbHVzaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICppMSwKIAkJICAgICAgICAgICAgc3RydWN0IGlub2RlICppMik7CiAvKiBmYXQvbWlzYy5jICovCi1leHRlcm4gdm9pZAotX19mYXRfZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHJlcG9ydCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpIF9fY29sZDsKK2V4dGVybiBfX3ByaW50ZigzLCA0KSBfX2NvbGQKK3ZvaWQgX19mYXRfZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHJlcG9ydCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2RlZmluZSBmYXRfZnNfZXJyb3Ioc2IsIGZtdCwgYXJncy4uLikJCVwKIAlfX2ZhdF9mc19lcnJvcihzYiwgMSwgZm10ICwgIyMgYXJncykKICNkZWZpbmUgZmF0X2ZzX2Vycm9yX3JhdGVsaW1pdChzYiwgZm10LCBhcmdzLi4uKSBcCiAJX19mYXRfZnNfZXJyb3Ioc2IsIF9fcmF0ZWxpbWl0KCZNU0RPU19TQihzYiktPnJhdGVsaW1pdCksIGZtdCAsICMjIGFyZ3MpCi12b2lkIGZhdF9tc2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKSBfX2NvbGQ7CitfX3ByaW50ZigzLCA0KSBfX2NvbGQKK3ZvaWQgZmF0X21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogZXh0ZXJuIGludCBmYXRfY2x1c3RlcnNfZmx1c2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBleHRlcm4gaW50IGZhdF9jaGFpbl9hZGQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5ld19kY2x1cywgaW50IG5yX2NsdXN0ZXIpOwogZXh0ZXJuIHZvaWQgZmF0X3RpbWVfZmF0MnVuaXgoc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSwgc3RydWN0IHRpbWVzcGVjICp0cywKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9pbm9kZS5jIGIvZnMvZmF0L2lub2RlLmMKaW5kZXggMTcyNmQ3My4uODA4Y2FjNyAxMDA2NDQKLS0tIGEvZnMvZmF0L2lub2RlLmMKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTM3OSw3ICszNzksNyBAQAogCQkJcmV0dXJuIGVycm9yOwogCQlNU0RPU19JKGlub2RlKS0+bW11X3ByaXZhdGUgPSBpbm9kZS0+aV9zaXplOwogCi0JCWlub2RlLT5pX25saW5rID0gZmF0X3N1YmRpcnMoaW5vZGUpOworCQlzZXRfbmxpbmsoaW5vZGUsIGZhdF9zdWJkaXJzKGlub2RlKSk7CiAJfSBlbHNlIHsgLyogbm90IGEgZGlyZWN0b3J5ICovCiAJCWlub2RlLT5pX2dlbmVyYXRpb24gfD0gMTsKIAkJaW5vZGUtPmlfbW9kZSA9IGZhdF9tYWtlX21vZGUoc2JpLCBkZS0+YXR0ciwKQEAgLTEyMzMsNyArMTIzMyw3IEBACiAJZmF0X3NhdmVfYXR0cnMoaW5vZGUsIEFUVFJfRElSKTsKIAlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9zZWMgPSAwOwogCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfbmxpbmsgPSBmYXRfc3ViZGlycyhpbm9kZSkrMjsKKwlzZXRfbmxpbmsoaW5vZGUsIGZhdF9zdWJkaXJzKGlub2RlKSsyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvZmF0L25hbWVpX21zZG9zLmMgYi9mcy9mYXQvbmFtZWlfbXNkb3MuYwppbmRleCA2NmU4M2I4Li4yMTZiNDE5IDEwMDY0NAotLS0gYS9mcy9mYXQvbmFtZWlfbXNkb3MuYworKysgYi9mcy9mYXQvbmFtZWlfbXNkb3MuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJCS8qIHRoZSBkaXJlY3Rvcnkgd2FzIGNvbXBsZXRlZCwganVzdCByZXR1cm4gYSBlcnJvciAqLwogCQlnb3RvIG91dDsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSAyOworCXNldF9ubGluayhpbm9kZSwgMik7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gdHM7CiAJLyogdGltZXN0YW1wIGlzIGFscmVhZHkgd3JpdHRlbiwgc28gbWFya19pbm9kZV9kaXJ0eSgpIGlzIHVubmVlZGVkLiAqLwogCmRpZmYgLS1naXQgYS9mcy9mYXQvbmFtZWlfdmZhdC5jIGIvZnMvZmF0L25hbWVpX3ZmYXQuYwppbmRleCBiYjNmMjljLi5hODdhNjU2IDEwMDY0NAotLS0gYS9mcy9mYXQvbmFtZWlfdmZhdC5jCisrKyBiL2ZzL2ZhdC9uYW1laV92ZmF0LmMKQEAgLTkwMCw3ICs5MDAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAJaW5vZGUtPmlfdmVyc2lvbisrOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IHRzOwogCS8qIHRpbWVzdGFtcCBpcyBhbHJlYWR5IHdyaXR0ZW4sIHNvIG1hcmtfaW5vZGVfZGlydHkoKSBpcyB1bm5lZWRlZC4gKi8KIApkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jCmluZGV4IDFhNDMxMTQuLjdiMmFmNWEgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYworKysgYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCWlwLT5pX3VpZCA9ICh1aWRfdCl2aXAtPnZpaV91aWQ7CiAJaXAtPmlfZ2lkID0gKGdpZF90KXZpcC0+dmlpX2dpZDsKIAotCWlwLT5pX25saW5rID0gdmlwLT52aWlfbmxpbms7CisJc2V0X25saW5rKGlwLCB2aXAtPnZpaV9ubGluayk7CiAJaXAtPmlfc2l6ZSA9IHZpcC0+dmlpX3NpemU7CiAKIAlpcC0+aV9hdGltZS50dl9zZWMgPSB2aXAtPnZpaV9hdGltZTsKZGlmZiAtLWdpdCBhL2ZzL2ZzLXdyaXRlYmFjay5jIGIvZnMvZnMtd3JpdGViYWNrLmMKaW5kZXggMDRjZjNiOS4uNzNjMzk5MiAxMDA2NDQKLS0tIGEvZnMvZnMtd3JpdGViYWNrLmMKKysrIGIvZnMvZnMtd3JpdGViYWNrLmMKQEAgLTQxLDExICs0MSwyMyBAQAogCXVuc2lnbmVkIGludCBmb3Jfa3VwZGF0ZToxOwogCXVuc2lnbmVkIGludCByYW5nZV9jeWNsaWM6MTsKIAl1bnNpZ25lZCBpbnQgZm9yX2JhY2tncm91bmQ6MTsKKwllbnVtIHdiX3JlYXNvbiByZWFzb247CQkvKiB3aHkgd2FzIHdyaXRlYmFjayBpbml0aWF0ZWQ/ICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBwZW5kaW5nIHdvcmsgbGlzdCAqLwogCXN0cnVjdCBjb21wbGV0aW9uICpkb25lOwkvKiBzZXQgaWYgdGhlIGNhbGxlciB3YWl0cyAqLwogfTsKIAorY29uc3QgY2hhciAqd2JfcmVhc29uX25hbWVbXSA9IHsKKwlbV0JfUkVBU09OX0JBQ0tHUk9VTkRdCQk9ICJiYWNrZ3JvdW5kIiwKKwlbV0JfUkVBU09OX1RSWV9UT19GUkVFX1BBR0VTXQk9ICJ0cnlfdG9fZnJlZV9wYWdlcyIsCisJW1dCX1JFQVNPTl9TWU5DXQkJPSAic3luYyIsCisJW1dCX1JFQVNPTl9QRVJJT0RJQ10JCT0gInBlcmlvZGljIiwKKwlbV0JfUkVBU09OX0xBUFRPUF9USU1FUl0JPSAibGFwdG9wX3RpbWVyIiwKKwlbV0JfUkVBU09OX0ZSRUVfTU9SRV9NRU1dCT0gImZyZWVfbW9yZV9tZW1vcnkiLAorCVtXQl9SRUFTT05fRlNfRlJFRV9TUEFDRV0JPSAiZnNfZnJlZV9zcGFjZSIsCisJW1dCX1JFQVNPTl9GT1JLRVJfVEhSRUFEXQk9ICJmb3JrZXJfdGhyZWFkIgorfTsKKwogLyoKICAqIEluY2x1ZGUgdGhlIGNyZWF0aW9uIG9mIHRoZSB0cmFjZSBwb2ludHMgYWZ0ZXIgZGVmaW5pbmcgdGhlCiAgKiB3Yl93cml0ZWJhY2tfd29yayBzdHJ1Y3R1cmUgc28gdGhhdCB0aGUgZGVmaW5pdGlvbiByZW1haW5zIGxvY2FsIHRvIHRoaXMKQEAgLTExNSw3ICsxMjcsNyBAQAogCiBzdGF0aWMgdm9pZAogX19iZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGxvbmcgbnJfcGFnZXMsCi0JCSAgICAgIGJvb2wgcmFuZ2VfY3ljbGljKQorCQkgICAgICBib29sIHJhbmdlX2N5Y2xpYywgZW51bSB3Yl9yZWFzb24gcmVhc29uKQogewogCXN0cnVjdCB3Yl93cml0ZWJhY2tfd29yayAqd29yazsKIApAQCAtMTM1LDYgKzE0Nyw3IEBACiAJd29yay0+c3luY19tb2RlCT0gV0JfU1lOQ19OT05FOwogCXdvcmstPm5yX3BhZ2VzCT0gbnJfcGFnZXM7CiAJd29yay0+cmFuZ2VfY3ljbGljID0gcmFuZ2VfY3ljbGljOworCXdvcmstPnJlYXNvbgk9IHJlYXNvbjsKIAogCWJkaV9xdWV1ZV93b3JrKGJkaSwgd29yayk7CiB9CkBAIC0xNTAsOSArMTYzLDEwIEBACiAgKiAgIGNvbXBsZXRpb24uIENhbGxlciBuZWVkIG5vdCBob2xkIHNiIHNfdW1vdW50IHNlbWFwaG9yZS4KICAqCiAgKi8KLXZvaWQgYmRpX3N0YXJ0X3dyaXRlYmFjayhzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBsb25nIG5yX3BhZ2VzKQordm9pZCBiZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGxvbmcgbnJfcGFnZXMsCisJCQllbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7Ci0JX19iZGlfc3RhcnRfd3JpdGViYWNrKGJkaSwgbnJfcGFnZXMsIHRydWUpOworCV9fYmRpX3N0YXJ0X3dyaXRlYmFjayhiZGksIG5yX3BhZ2VzLCB0cnVlLCByZWFzb24pOwogfQogCiAvKioKQEAgLTI1MSw3ICsyNjUsNyBAQAogICovCiBzdGF0aWMgaW50IG1vdmVfZXhwaXJlZF9pbm9kZXMoc3RydWN0IGxpc3RfaGVhZCAqZGVsYXlpbmdfcXVldWUsCiAJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZGlzcGF0Y2hfcXVldWUsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb2xkZXJfdGhhbl90aGlzKQorCQkJICAgICAgIHN0cnVjdCB3Yl93cml0ZWJhY2tfd29yayAqd29yaykKIHsKIAlMSVNUX0hFQUQodG1wKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpub2RlOwpAQCAtMjYyLDggKzI3Niw4IEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoZGVsYXlpbmdfcXVldWUpKSB7CiAJCWlub2RlID0gd2JfaW5vZGUoZGVsYXlpbmdfcXVldWUtPnByZXYpOwotCQlpZiAob2xkZXJfdGhhbl90aGlzICYmCi0JCSAgICBpbm9kZV9kaXJ0aWVkX2FmdGVyKGlub2RlLCAqb2xkZXJfdGhhbl90aGlzKSkKKwkJaWYgKHdvcmstPm9sZGVyX3RoYW5fdGhpcyAmJgorCQkgICAgaW5vZGVfZGlydGllZF9hZnRlcihpbm9kZSwgKndvcmstPm9sZGVyX3RoYW5fdGhpcykpCiAJCQlicmVhazsKIAkJaWYgKHNiICYmIHNiICE9IGlub2RlLT5pX3NiKQogCQkJZG9fc2Jfc29ydCA9IDE7CkBAIC0zMDIsMTMgKzMxNiwxMyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tPiBkZXF1ZXVlIGZvciBJTwogICovCi1zdGF0aWMgdm9pZCBxdWV1ZV9pbyhzdHJ1Y3QgYmRpX3dyaXRlYmFjayAqd2IsIHVuc2lnbmVkIGxvbmcgKm9sZGVyX3RoYW5fdGhpcykKK3N0YXRpYyB2b2lkIHF1ZXVlX2lvKHN0cnVjdCBiZGlfd3JpdGViYWNrICp3Yiwgc3RydWN0IHdiX3dyaXRlYmFja193b3JrICp3b3JrKQogewogCWludCBtb3ZlZDsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJndiLT5saXN0X2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJndiLT5iX21vcmVfaW8sICZ3Yi0+Yl9pbyk7Ci0JbW92ZWQgPSBtb3ZlX2V4cGlyZWRfaW5vZGVzKCZ3Yi0+Yl9kaXJ0eSwgJndiLT5iX2lvLCBvbGRlcl90aGFuX3RoaXMpOwotCXRyYWNlX3dyaXRlYmFja19xdWV1ZV9pbyh3Yiwgb2xkZXJfdGhhbl90aGlzLCBtb3ZlZCk7CisJbW92ZWQgPSBtb3ZlX2V4cGlyZWRfaW5vZGVzKCZ3Yi0+Yl9kaXJ0eSwgJndiLT5iX2lvLCB3b3JrKTsKKwl0cmFjZV93cml0ZWJhY2tfcXVldWVfaW8od2IsIHdvcmssIG1vdmVkKTsKIH0KIAogc3RhdGljIGludCB3cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKQEAgLTY0MSwzMSArNjU1LDQwIEBACiAJcmV0dXJuIHdyb3RlOwogfQogCi1sb25nIHdyaXRlYmFja19pbm9kZXNfd2Ioc3RydWN0IGJkaV93cml0ZWJhY2sgKndiLCBsb25nIG5yX3BhZ2VzKQorbG9uZyB3cml0ZWJhY2tfaW5vZGVzX3diKHN0cnVjdCBiZGlfd3JpdGViYWNrICp3YiwgbG9uZyBucl9wYWdlcywKKwkJCQllbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7CiAJc3RydWN0IHdiX3dyaXRlYmFja193b3JrIHdvcmsgPSB7CiAJCS5ucl9wYWdlcwk9IG5yX3BhZ2VzLAogCQkuc3luY19tb2RlCT0gV0JfU1lOQ19OT05FLAogCQkucmFuZ2VfY3ljbGljCT0gMSwKKwkJLnJlYXNvbgkJPSByZWFzb24sCiAJfTsKIAogCXNwaW5fbG9jaygmd2ItPmxpc3RfbG9jayk7CiAJaWYgKGxpc3RfZW1wdHkoJndiLT5iX2lvKSkKLQkJcXVldWVfaW8od2IsIE5VTEwpOworCQlxdWV1ZV9pbyh3YiwgJndvcmspOwogCV9fd3JpdGViYWNrX2lub2Rlc193Yih3YiwgJndvcmspOwogCXNwaW5fdW5sb2NrKCZ3Yi0+bGlzdF9sb2NrKTsKIAogCXJldHVybiBucl9wYWdlcyAtIHdvcmsubnJfcGFnZXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBvdmVyX2Jncm91bmRfdGhyZXNoKHZvaWQpCitzdGF0aWMgYm9vbCBvdmVyX2Jncm91bmRfdGhyZXNoKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpCiB7CiAJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3RocmVzaCwgZGlydHlfdGhyZXNoOwogCiAJZ2xvYmFsX2RpcnR5X2xpbWl0cygmYmFja2dyb3VuZF90aHJlc2gsICZkaXJ0eV90aHJlc2gpOwogCi0JcmV0dXJuIChnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKSArCi0JCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1VOU1RBQkxFX05GUykgPiBiYWNrZ3JvdW5kX3RocmVzaCk7CisJaWYgKGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfRElSVFkpICsKKwkgICAgZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKSA+IGJhY2tncm91bmRfdGhyZXNoKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChiZGlfc3RhdChiZGksIEJESV9SRUNMQUlNQUJMRSkgPgorCQkJCWJkaV9kaXJ0eV9saW1pdChiZGksIGJhY2tncm91bmRfdGhyZXNoKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC02NzUsNyArNjk4LDcgQEAKIHN0YXRpYyB2b2lkIHdiX3VwZGF0ZV9iYW5kd2lkdGgoc3RydWN0IGJkaV93cml0ZWJhY2sgKndiLAogCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSkKIHsKLQlfX2JkaV91cGRhdGVfYmFuZHdpZHRoKHdiLT5iZGksIDAsIDAsIDAsIDAsIHN0YXJ0X3RpbWUpOworCV9fYmRpX3VwZGF0ZV9iYW5kd2lkdGgod2ItPmJkaSwgMCwgMCwgMCwgMCwgMCwgc3RhcnRfdGltZSk7CiB9CiAKIC8qCkBAIC03MjcsNyArNzUwLDcgQEAKIAkJICogRm9yIGJhY2tncm91bmQgd3JpdGVvdXQsIHN0b3Agd2hlbiB3ZSBhcmUgYmVsb3cgdGhlCiAJCSAqIGJhY2tncm91bmQgZGlydHkgdGhyZXNob2xkCiAJCSAqLwotCQlpZiAod29yay0+Zm9yX2JhY2tncm91bmQgJiYgIW92ZXJfYmdyb3VuZF90aHJlc2goKSkKKwkJaWYgKHdvcmstPmZvcl9iYWNrZ3JvdW5kICYmICFvdmVyX2Jncm91bmRfdGhyZXNoKHdiLT5iZGkpKQogCQkJYnJlYWs7CiAKIAkJaWYgKHdvcmstPmZvcl9rdXBkYXRlKSB7CkBAIC03MzgsNyArNzYxLDcgQEAKIAogCQl0cmFjZV93cml0ZWJhY2tfc3RhcnQod2ItPmJkaSwgd29yayk7CiAJCWlmIChsaXN0X2VtcHR5KCZ3Yi0+Yl9pbykpCi0JCQlxdWV1ZV9pbyh3Yiwgd29yay0+b2xkZXJfdGhhbl90aGlzKTsKKwkJCXF1ZXVlX2lvKHdiLCB3b3JrKTsKIAkJaWYgKHdvcmstPnNiKQogCQkJcHJvZ3Jlc3MgPSB3cml0ZWJhY2tfc2JfaW5vZGVzKHdvcmstPnNiLCB3Yiwgd29yayk7CiAJCWVsc2UKQEAgLTgxMSwxMyArODM0LDE0IEBACiAKIHN0YXRpYyBsb25nIHdiX2NoZWNrX2JhY2tncm91bmRfZmx1c2goc3RydWN0IGJkaV93cml0ZWJhY2sgKndiKQogewotCWlmIChvdmVyX2Jncm91bmRfdGhyZXNoKCkpIHsKKwlpZiAob3Zlcl9iZ3JvdW5kX3RocmVzaCh3Yi0+YmRpKSkgewogCiAJCXN0cnVjdCB3Yl93cml0ZWJhY2tfd29yayB3b3JrID0gewogCQkJLm5yX3BhZ2VzCT0gTE9OR19NQVgsCiAJCQkuc3luY19tb2RlCT0gV0JfU1lOQ19OT05FLAogCQkJLmZvcl9iYWNrZ3JvdW5kCT0gMSwKIAkJCS5yYW5nZV9jeWNsaWMJPSAxLAorCQkJLnJlYXNvbgkJPSBXQl9SRUFTT05fQkFDS0dST1VORCwKIAkJfTsKIAogCQlyZXR1cm4gd2Jfd3JpdGViYWNrKHdiLCAmd29yayk7CkBAIC04NTEsNiArODc1LDcgQEAKIAkJCS5zeW5jX21vZGUJPSBXQl9TWU5DX05PTkUsCiAJCQkuZm9yX2t1cGRhdGUJPSAxLAogCQkJLnJhbmdlX2N5Y2xpYwk9IDEsCisJCQkucmVhc29uCQk9IFdCX1JFQVNPTl9QRVJJT0RJQywKIAkJfTsKIAogCQlyZXR1cm4gd2Jfd3JpdGViYWNrKHdiLCAmd29yayk7CkBAIC05NjksNyArOTk0LDcgQEAKICAqIFN0YXJ0IHdyaXRlYmFjayBvZiBgbnJfcGFnZXMnIHBhZ2VzLiAgSWYgYG5yX3BhZ2VzJyBpcyB6ZXJvLCB3cml0ZSBiYWNrCiAgKiB0aGUgd2hvbGUgd29ybGQuCiAgKi8KLXZvaWQgd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcyhsb25nIG5yX3BhZ2VzKQordm9pZCB3YWtldXBfZmx1c2hlcl90aHJlYWRzKGxvbmcgbnJfcGFnZXMsIGVudW0gd2JfcmVhc29uIHJlYXNvbikKIHsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOwogCkBAIC05ODIsNyArMTAwNyw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmRpLCAmYmRpX2xpc3QsIGJkaV9saXN0KSB7CiAJCWlmICghYmRpX2hhc19kaXJ0eV9pbyhiZGkpKQogCQkJY29udGludWU7Ci0JCV9fYmRpX3N0YXJ0X3dyaXRlYmFjayhiZGksIG5yX3BhZ2VzLCBmYWxzZSk7CisJCV9fYmRpX3N0YXJ0X3dyaXRlYmFjayhiZGksIG5yX3BhZ2VzLCBmYWxzZSwgcmVhc29uKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CkBAIC0xMjAzLDcgKzEyMjgsOSBAQAogICogb24gaG93IG1hbnkgKGlmIGFueSkgd2lsbCBiZSB3cml0dGVuLCBhbmQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3YWl0CiAgKiBmb3IgSU8gY29tcGxldGlvbiBvZiBzdWJtaXR0ZWQgSU8uCiAgKi8KLXZvaWQgd3JpdGViYWNrX2lub2Rlc19zYl9ucihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIG5yKQordm9pZCB3cml0ZWJhY2tfaW5vZGVzX3NiX25yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgdW5zaWduZWQgbG9uZyBuciwKKwkJCSAgICBlbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7CiAJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soZG9uZSk7CiAJc3RydWN0IHdiX3dyaXRlYmFja193b3JrIHdvcmsgPSB7CkBAIC0xMjEyLDYgKzEyMzksNyBAQAogCQkudGFnZ2VkX3dyaXRlcGFnZXMJPSAxLAogCQkuZG9uZQkJCT0gJmRvbmUsCiAJCS5ucl9wYWdlcwkJPSBuciwKKwkJLnJlYXNvbgkJCT0gcmVhc29uLAogCX07CiAKIAlXQVJOX09OKCFyd3NlbV9pc19sb2NrZWQoJnNiLT5zX3Vtb3VudCkpOwpAQCAtMTIyOCw5ICsxMjU2LDkgQEAKICAqIG9uIGhvdyBtYW55IChpZiBhbnkpIHdpbGwgYmUgd3JpdHRlbiwgYW5kIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgd2FpdAogICogZm9yIElPIGNvbXBsZXRpb24gb2Ygc3VibWl0dGVkIElPLgogICovCi12b2lkIHdyaXRlYmFja19pbm9kZXNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3ZvaWQgd3JpdGViYWNrX2lub2Rlc19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBlbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7Ci0JcmV0dXJuIHdyaXRlYmFja19pbm9kZXNfc2JfbnIoc2IsIGdldF9ucl9kaXJ0eV9wYWdlcygpKTsKKwlyZXR1cm4gd3JpdGViYWNrX2lub2Rlc19zYl9ucihzYiwgZ2V0X25yX2RpcnR5X3BhZ2VzKCksIHJlYXNvbik7CiB9CiBFWFBPUlRfU1lNQk9MKHdyaXRlYmFja19pbm9kZXNfc2IpOwogCkBAIC0xMjQxLDExICsxMjY5LDExIEBACiAgKiBJbnZva2Ugd3JpdGViYWNrX2lub2Rlc19zYiBpZiBubyB3cml0ZWJhY2sgaXMgY3VycmVudGx5IHVuZGVyd2F5LgogICogUmV0dXJucyAxIGlmIHdyaXRlYmFjayB3YXMgc3RhcnRlZCwgMCBpZiBub3QuCiAgKi8KLWludCB3cml0ZWJhY2tfaW5vZGVzX3NiX2lmX2lkbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK2ludCB3cml0ZWJhY2tfaW5vZGVzX3NiX2lmX2lkbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZW51bSB3Yl9yZWFzb24gcmVhc29uKQogewogCWlmICghd3JpdGViYWNrX2luX3Byb2dyZXNzKHNiLT5zX2JkaSkpIHsKIAkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOwotCQl3cml0ZWJhY2tfaW5vZGVzX3NiKHNiKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYihzYiwgcmVhc29uKTsKIAkJdXBfcmVhZCgmc2ItPnNfdW1vdW50KTsKIAkJcmV0dXJuIDE7CiAJfSBlbHNlCkBAIC0xMjYyLDExICsxMjkwLDEyIEBACiAgKiBSZXR1cm5zIDEgaWYgd3JpdGViYWNrIHdhcyBzdGFydGVkLCAwIGlmIG5vdC4KICAqLwogaW50IHdyaXRlYmFja19pbm9kZXNfc2JfbnJfaWZfaWRsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgbnIpCisJCQkJICAgdW5zaWduZWQgbG9uZyBuciwKKwkJCQkgICBlbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7CiAJaWYgKCF3cml0ZWJhY2tfaW5fcHJvZ3Jlc3Moc2ItPnNfYmRpKSkgewogCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7Ci0JCXdyaXRlYmFja19pbm9kZXNfc2JfbnIoc2IsIG5yKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYl9ucihzYiwgbnIsIHJlYXNvbik7CiAJCXVwX3JlYWQoJnNiLT5zX3Vtb3VudCk7CiAJCXJldHVybiAxOwogCX0gZWxzZQpAQCAtMTI5MCw2ICsxMzE5LDcgQEAKIAkJLm5yX3BhZ2VzCT0gTE9OR19NQVgsCiAJCS5yYW5nZV9jeWNsaWMJPSAwLAogCQkuZG9uZQkJPSAmZG9uZSwKKwkJLnJlYXNvbgkJPSBXQl9SRUFTT05fU1lOQywKIAl9OwogCiAJV0FSTl9PTighcndzZW1faXNfbG9ja2VkKCZzYi0+c191bW91bnQpKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvY29udHJvbC5jIGIvZnMvZnVzZS9jb250cm9sLmMKaW5kZXggODU1NDJhNy4uNDI1OTNjNSAxMDA2NDQKLS0tIGEvZnMvZnVzZS9jb250cm9sLmMKKysrIGIvZnMvZnVzZS9jb250cm9sLmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCWlmIChpb3ApCiAJCWlub2RlLT5pX29wID0gaW9wOwogCWlub2RlLT5pX2ZvcCA9IGZvcDsKLQlpbm9kZS0+aV9ubGluayA9IG5saW5rOworCXNldF9ubGluayhpbm9kZSwgbmxpbmspOwogCWlub2RlLT5pX3ByaXZhdGUgPSBmYzsKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIAlyZXR1cm4gZGVudHJ5OwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9jdXNlLmMgYi9mcy9mdXNlL2N1c2UuYwppbmRleCBiNmNjYTQ3Li4zNDI2NTIxIDEwMDY0NAotLS0gYS9mcy9mdXNlL2N1c2UuYworKysgYi9mcy9mdXNlL2N1c2UuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImZ1c2VfaS5oIgogCmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggYWRkOTZmNi4uM2U2ZDcyNyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAKIAlpbm9kZS0+aV9pbm8gICAgID0gYXR0ci0+aW5vOwogCWlub2RlLT5pX21vZGUgICAgPSAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgfCAoYXR0ci0+bW9kZSAmIDA3Nzc3KTsKLQlpbm9kZS0+aV9ubGluayAgID0gYXR0ci0+bmxpbms7CisJc2V0X25saW5rKGlub2RlLCBhdHRyLT5ubGluayk7CiAJaW5vZGUtPmlfdWlkICAgICA9IGF0dHItPnVpZDsKIAlpbm9kZS0+aV9naWQgICAgID0gYXR0ci0+Z2lkOwogCWlub2RlLT5pX2Jsb2NrcyAgPSBhdHRyLT5ibG9ja3M7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2FjbC5jIGIvZnMvZ2ZzMi9hY2wuYwppbmRleCAzNDUwMWI2Li42NTk3OGQ3IDEwMDY0NAotLS0gYS9mcy9nZnMyL2FjbC5jCisrKyBiL2ZzL2dmczIvYWNsLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJaWF0dHIuaWFfdmFsaWQgPSBBVFRSX01PREU7CiAJCWlhdHRyLmlhX21vZGUgPSBtb2RlOwogCi0JCWVycm9yID0gZ2ZzMl9zZXRhdHRyX3NpbXBsZShHRlMyX0koaW5vZGUpLCAmaWF0dHIpOworCQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaW5vZGUsICZpYXR0cik7CiAJfQogCiAJcmV0dXJuIGVycm9yOwpAQCAtMTYwLDYgKzE2MCw3IEBACiAKIGludCBnZnMyX2FjbF9jaG1vZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBpYXR0ciAqYXR0cikKIHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmlwLT5pX2lub2RlOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKIAljaGFyICpkYXRhOwogCXVuc2lnbmVkIGludCBsZW47CkBAIC0xNjksNyArMTcwLDcgQEAKIAlpZiAoSVNfRVJSKGFjbCkpCiAJCXJldHVybiBQVFJfRVJSKGFjbCk7CiAJaWYgKCFhY2wpCi0JCXJldHVybiBnZnMyX3NldGF0dHJfc2ltcGxlKGlwLCBhdHRyKTsKKwkJcmV0dXJuIGdmczJfc2V0YXR0cl9zaW1wbGUoaW5vZGUsIGF0dHIpOwogCiAJZXJyb3IgPSBwb3NpeF9hY2xfY2htb2QoJmFjbCwgR0ZQX05PRlMsIGF0dHItPmlhX21vZGUpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYW9wcy5jIGIvZnMvZ2ZzMi9hb3BzLmMKaW5kZXggZjlmYmJlOS4uNDg1OGUxZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hb3BzLmMKKysrIGIvZnMvZ2ZzMi9hb3BzLmMKQEAgLTY2Myw3ICs2NjMsNyBAQAogCWlmICgmaXAtPmlfaW5vZGUgPT0gc2RwLT5zZF9yaW5kZXgpCiAJCXJibG9ja3MgKz0gMiAqIFJFU19TVEFURlM7CiAJaWYgKGFsbG9jX3JlcXVpcmVkKQotCQlyYmxvY2tzICs9IGdmczJfcmdfYmxvY2tzKGFsKTsKKwkJcmJsb2NrcyArPSBnZnMyX3JnX2Jsb2NrcyhpcCk7CiAKIAllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCByYmxvY2tzLAogCQkJCSBQQUdFX0NBQ0hFX1NJWkUvc2RwLT5zZF9zYi5zYl9ic2l6ZSk7CkBAIC03ODcsNyArNzg3LDYgQEAKIAl1NjQgdG8gPSBwb3MgKyBjb3BpZWQ7CiAJdm9pZCAqa2FkZHI7CiAJdW5zaWduZWQgY2hhciAqYnVmID0gZGliaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSk7Ci0Jc3RydWN0IGdmczJfZGlub2RlICpkaSA9IChzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKilkaWJoLT5iX2RhdGE7CiAKIAlCVUdfT04oKHBvcyArIGxlbikgPiAoZGliaC0+Yl9zaXplIC0gc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpKTsKIAlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKQEAgLTgwNCw3ICs4MDMsNiBAQAogCWlmIChjb3BpZWQpIHsKIAkJaWYgKGlub2RlLT5pX3NpemUgPCB0bykKIAkJCWlfc2l6ZV93cml0ZShpbm9kZSwgdG8pOwotCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpKTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJfQogCkBAIC04NzMsMTAgKzg3MSw2IEBACiAJCWdmczJfcGFnZV9hZGRfZGF0YWJ1ZnMoaXAsIHBhZ2UsIGZyb20sIHRvKTsKIAogCXJldCA9IGdlbmVyaWNfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsIHBhZ2UsIGZzZGF0YSk7Ci0JaWYgKHJldCA+IDApIHsKLQkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwotCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQl9CiAKIAlpZiAoaW5vZGUgPT0gc2RwLT5zZF9yaW5kZXgpIHsKIAkJYWRqdXN0X2ZzX3NwYWNlKGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYm1hcC5jIGIvZnMvZ2ZzMi9ibWFwLmMKaW5kZXggNzg3OGM0Ny4uNDFkNDk0ZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9ibWFwLmMKKysrIGIvZnMvZ2ZzMi9ibWFwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KIApAQCAtMzYsMTEgKzM3LDYgQEAKIAlfX3UxNiBtcF9saXN0W0dGUzJfTUFYX01FVEFfSEVJR0hUXTsKIH07CiAKLXR5cGVkZWYgaW50ICgqYmxvY2tfY2FsbF90KSAoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpYmgsCi0JCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fYmU2NCAqdG9wLAotCQkJICAgICBfX2JlNjQgKmJvdHRvbSwgdW5zaWduZWQgaW50IGhlaWdodCwKLQkJCSAgICAgdm9pZCAqZGF0YSk7Ci0KIHN0cnVjdCBzdHJpcF9taW5lIHsKIAlpbnQgc21fZmlyc3Q7CiAJdW5zaWduZWQgaW50IHNtX2hlaWdodDsKQEAgLTI3Myw2ICsyNjksMzAgQEAKIAlyZXR1cm4gKChfX2JlNjQgKikoYmgtPmJfZGF0YSArIGhlYWRfc2l6ZSkpICsgbXAtPm1wX2xpc3RbaGVpZ2h0XTsKIH0KIAorc3RhdGljIHZvaWQgZ2ZzMl9tZXRhcGF0aF9yYShzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGNvbnN0IF9fYmU2NCAqcG9zKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmFiaDsKKwljb25zdCBfX2JlNjQgKmVuZHAgPSAoY29uc3QgX19iZTY0ICopKGJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplKTsKKwljb25zdCBfX2JlNjQgKnQ7CisKKwlmb3IgKHQgPSBwb3M7IHQgPCBlbmRwOyB0KyspIHsKKwkJaWYgKCEqdCkKKwkJCWNvbnRpbnVlOworCisJCXJhYmggPSBnZnMyX2dldGJ1ZihnbCwgYmU2NF90b19jcHUoKnQpLCBDUkVBVEUpOworCQlpZiAodHJ5bG9ja19idWZmZXIocmFiaCkpIHsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKHJhYmgpKSB7CisJCQkJcmFiaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKKwkJCQlzdWJtaXRfYmgoUkVBREEgfCBSRVFfTUVUQSwgcmFiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQl1bmxvY2tfYnVmZmVyKHJhYmgpOworCQl9CisJCWJyZWxzZShyYWJoKTsKKwl9Cit9CisKIC8qKgogICogbG9va3VwX21ldGFwYXRoIC0gV2FsayB0aGUgbWV0YWRhdGEgdHJlZSB0byBhIHNwZWNpZmljIHBvaW50CiAgKiBAaXA6IFRoZSBpbm9kZQpAQCAtNDMyLDEyICs0NTIsMTQgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQihpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNkcC0+c2RfdmZzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGliaCA9IG1wLT5tcF9iaFswXTsKIAl1NjQgYm4sIGRibG9jayA9IDA7CiAJdW5zaWduZWQgbiwgaSwgYmxrcywgYWxsb2NlZCA9IDAsIGlibGtzID0gMCwgYnJhbmNoX3N0YXJ0ID0gMDsKIAl1bnNpZ25lZCBkYmxrcyA9IDA7CiAJdW5zaWduZWQgcHRyc19wZXJfYmxrOwogCWNvbnN0IHVuc2lnbmVkIGVuZF9vZl9tZXRhZGF0YSA9IGhlaWdodCAtIDE7CisJaW50IHJldDsKIAlpbnQgZW9iID0gMDsKIAllbnVtIGFsbG9jX3N0YXRlIHN0YXRlOwogCV9fYmU2NCAqcHRyOwpAQCAtNTQwLDYgKzU2MiwxNSBAQAogCQkJZGJsb2NrID0gYm47CiAJCQl3aGlsZSAobi0tID4gMCkKIAkJCQkqcHRyKysgPSBjcHVfdG9fYmU2NChibisrKTsKKwkJCWlmIChidWZmZXJfemVyb25ldyhiaF9tYXApKSB7CisJCQkJcmV0ID0gc2JfaXNzdWVfemVyb291dChzYiwgZGJsb2NrLCBkYmxrcywKKwkJCQkJCSAgICAgICBHRlBfTk9GUyk7CisJCQkJaWYgKHJldCkgeworCQkJCQlmc19lcnIoc2RwLAorCQkJCQkgICAgICAgIkZhaWxlZCB0byB6ZXJvIGRhdGEgYnVmZmVyc1xuIik7CisJCQkJCWNsZWFyX2J1ZmZlcl96ZXJvbmV3KGJoX21hcCk7CisJCQkJfQorCQkJfQogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlICgoc3RhdGUgIT0gQUxMT0NfREFUQSkgfHwgIWRibG9jayk7CkBAIC02NjgsNzYgKzY5OSw2IEBACiB9CiAKIC8qKgotICogcmVjdXJzaXZlX3NjYW4gLSByZWN1cnNpdmVseSBzY2FuIHRocm91Z2ggdGhlIGVuZCBvZiBhIGZpbGUKLSAqIEBpcDogdGhlIGlub2RlCi0gKiBAZGliaDogdGhlIGRpbm9kZSBidWZmZXIKLSAqIEBtcDogdGhlIHBhdGggdGhyb3VnaCB0aGUgbWV0YWRhdGEgdG8gdGhlIHBvaW50IHRvIHN0YXJ0Ci0gKiBAaGVpZ2h0OiB0aGUgaGVpZ2h0IHRoZSByZWN1cnNpb24gaXMgYXQKLSAqIEBibG9jazogdGhlIGluZGlyZWN0IGJsb2NrIHRvIGxvb2sgYXQKLSAqIEBmaXJzdDogMSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBibG9jawotICogQGJjOiB0aGUgY2FsbCB0byBtYWtlIGZvciBlYWNoIHBpZWNlIG9mIG1ldGFkYXRhCi0gKiBAZGF0YTogZGF0YSBvcGFxdWUgdG8gdGhpcyBmdW5jdGlvbiB0byBwYXNzIHRvIEBiYwotICoKLSAqIFdoZW4gdGhpcyBpcyBmaXJzdCBjYWxsZWQgQGhlaWdodCBhbmQgQGJsb2NrIHNob3VsZCBiZSB6ZXJvIGFuZAotICogQGZpcnN0IHNob3VsZCBiZSAxLgotICoKLSAqIFJldHVybnM6IGVycm5vCi0gKi8KLQotc3RhdGljIGludCByZWN1cnNpdmVfc2NhbihzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGliaCwKLQkJCSAgc3RydWN0IG1ldGFwYXRoICptcCwgdW5zaWduZWQgaW50IGhlaWdodCwKLQkJCSAgdTY0IGJsb2NrLCBpbnQgZmlyc3QsIGJsb2NrX2NhbGxfdCBiYywKLQkJCSAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlfX2JlNjQgKnRvcCwgKmJvdHRvbTsKLQl1NjQgYm47Ci0JaW50IGVycm9yOwotCWludCBtaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBnZnMyX21ldGFfaGVhZGVyKTsKLQotCWlmICghaGVpZ2h0KSB7Ci0JCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmJoKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCQlkaWJoID0gYmg7Ci0KLQkJdG9wID0gKF9fYmU2NCAqKShiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpICsgbXAtPm1wX2xpc3RbMF07Ci0JCWJvdHRvbSA9IChfX2JlNjQgKikoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKSArIHNkcC0+c2RfZGlwdHJzOwotCX0gZWxzZSB7Ci0JCWVycm9yID0gZ2ZzMl9tZXRhX2luZGlyZWN0X2J1ZmZlcihpcCwgaGVpZ2h0LCBibG9jaywgMCwgJmJoKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCi0JCXRvcCA9IChfX2JlNjQgKikoYmgtPmJfZGF0YSArIG1oX3NpemUpICsKLQkJCQkgIChmaXJzdCA/IG1wLT5tcF9saXN0W2hlaWdodF0gOiAwKTsKLQotCQlib3R0b20gPSAoX19iZTY0ICopKGJoLT5iX2RhdGEgKyBtaF9zaXplKSArIHNkcC0+c2RfaW5wdHJzOwotCX0KLQotCWVycm9yID0gYmMoaXAsIGRpYmgsIGJoLCB0b3AsIGJvdHRvbSwgaGVpZ2h0LCBkYXRhKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGhlaWdodCA8IGlwLT5pX2hlaWdodCAtIDEpCi0JCWZvciAoOyB0b3AgPCBib3R0b207IHRvcCsrLCBmaXJzdCA9IDApIHsKLQkJCWlmICghKnRvcCkKLQkJCQljb250aW51ZTsKLQotCQkJYm4gPSBiZTY0X3RvX2NwdSgqdG9wKTsKLQotCQkJZXJyb3IgPSByZWN1cnNpdmVfc2NhbihpcCwgZGliaCwgbXAsIGhlaWdodCArIDEsIGJuLAotCQkJCQkgICAgICAgZmlyc3QsIGJjLCBkYXRhKTsKLQkJCWlmIChlcnJvcikKLQkJCQlicmVhazsKLQkJfQotCi1vdXQ6Ci0JYnJlbHNlKGJoKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgogICogZG9fc3RyaXAgLSBMb29rIGZvciBhIGxheWVyIGEgcGFydGljdWxhciBsYXllciBvZiB0aGUgZmlsZSBhbmQgc3RyaXAgaXQgb2ZmCiAgKiBAaXA6IHRoZSBpbm9kZQogICogQGRpYmg6IHRoZSBkaW5vZGUgYnVmZmVyCkBAIC03NTIsOSArNzEzLDggQEAKIAogc3RhdGljIGludCBkb19zdHJpcChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGliaCwKIAkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fYmU2NCAqdG9wLCBfX2JlNjQgKmJvdHRvbSwKLQkJICAgIHVuc2lnbmVkIGludCBoZWlnaHQsIHZvaWQgKmRhdGEpCisJCSAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzdHJ1Y3Qgc3RyaXBfbWluZSAqc20pCiB7Ci0Jc3RydWN0IHN0cmlwX21pbmUgKnNtID0gZGF0YTsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3Qgcmxpc3Q7CiAJdTY0IGJuLCBic3RhcnQ7CkBAIC03ODMsMTEgKzc0Myw2IEBACiAJZWxzZSBpZiAoaXAtPmlfZGVwdGgpCiAJCXJldm9rZXMgPSBzZHAtPnNkX2lucHRyczsKIAotCWlmIChpcCAhPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpKQotCQllcnJvciA9IGdmczJfcmluZGV4X2hvbGQoc2RwLCAmaXAtPmlfYWxsb2MtPmFsX3JpX2doKTsKLQllbHNlIGlmICghc2RwLT5zZF9yZ3JwcykKLQkJZXJyb3IgPSBnZnMyX3JpX3VwZGF0ZShpcCk7Ci0KIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIApAQCAtODA1LDcgKzc2MCw3IEBACiAJCQlibGVuKys7CiAJCWVsc2UgewogCQkJaWYgKGJzdGFydCkKLQkJCQlnZnMyX3JsaXN0X2FkZChzZHAsICZybGlzdCwgYnN0YXJ0KTsKKwkJCQlnZnMyX3JsaXN0X2FkZChpcCwgJnJsaXN0LCBic3RhcnQpOwogCiAJCQlic3RhcnQgPSBibjsKIAkJCWJsZW4gPSAxOwpAQCAtODEzLDcgKzc2OCw3IEBACiAJfQogCiAJaWYgKGJzdGFydCkKLQkJZ2ZzMl9ybGlzdF9hZGQoc2RwLCAmcmxpc3QsIGJzdGFydCk7CisJCWdmczJfcmxpc3RfYWRkKGlwLCAmcmxpc3QsIGJzdGFydCk7CiAJZWxzZQogCQlnb3RvIG91dDsgLyogTm90aGluZyB0byBkbyAqLwogCkBAIC04ODcsMTIgKzg0Miw4MiBAQAogb3V0X3JsaXN0OgogCWdmczJfcmxpc3RfZnJlZSgmcmxpc3QpOwogb3V0OgotCWlmIChpcCAhPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpKQotCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmaXAtPmlfYWxsb2MtPmFsX3JpX2doKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgorICogcmVjdXJzaXZlX3NjYW4gLSByZWN1cnNpdmVseSBzY2FuIHRocm91Z2ggdGhlIGVuZCBvZiBhIGZpbGUKKyAqIEBpcDogdGhlIGlub2RlCisgKiBAZGliaDogdGhlIGRpbm9kZSBidWZmZXIKKyAqIEBtcDogdGhlIHBhdGggdGhyb3VnaCB0aGUgbWV0YWRhdGEgdG8gdGhlIHBvaW50IHRvIHN0YXJ0CisgKiBAaGVpZ2h0OiB0aGUgaGVpZ2h0IHRoZSByZWN1cnNpb24gaXMgYXQKKyAqIEBibG9jazogdGhlIGluZGlyZWN0IGJsb2NrIHRvIGxvb2sgYXQKKyAqIEBmaXJzdDogMSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBibG9jaworICogQHNtOiBkYXRhIG9wYXF1ZSB0byB0aGlzIGZ1bmN0aW9uIHRvIHBhc3MgdG8gQGJjCisgKgorICogV2hlbiB0aGlzIGlzIGZpcnN0IGNhbGxlZCBAaGVpZ2h0IGFuZCBAYmxvY2sgc2hvdWxkIGJlIHplcm8gYW5kCisgKiBAZmlyc3Qgc2hvdWxkIGJlIDEuCisgKgorICogUmV0dXJuczogZXJybm8KKyAqLworCitzdGF0aWMgaW50IHJlY3Vyc2l2ZV9zY2FuKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoLAorCQkJICBzdHJ1Y3QgbWV0YXBhdGggKm1wLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJICB1NjQgYmxvY2ssIGludCBmaXJzdCwgc3RydWN0IHN0cmlwX21pbmUgKnNtKQoreworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCV9fYmU2NCAqdG9wLCAqYm90dG9tOworCXU2NCBibjsKKwlpbnQgZXJyb3I7CisJaW50IG1oX3NpemUgPSBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpOworCisJaWYgKCFoZWlnaHQpIHsKKwkJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmYmgpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCWRpYmggPSBiaDsKKworCQl0b3AgPSAoX19iZTY0ICopKGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSkgKyBtcC0+bXBfbGlzdFswXTsKKwkJYm90dG9tID0gKF9fYmU2NCAqKShiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpICsgc2RwLT5zZF9kaXB0cnM7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBnZnMyX21ldGFfaW5kaXJlY3RfYnVmZmVyKGlwLCBoZWlnaHQsIGJsb2NrLCAwLCAmYmgpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJdG9wID0gKF9fYmU2NCAqKShiaC0+Yl9kYXRhICsgbWhfc2l6ZSkgKworCQkJCSAgKGZpcnN0ID8gbXAtPm1wX2xpc3RbaGVpZ2h0XSA6IDApOworCisJCWJvdHRvbSA9IChfX2JlNjQgKikoYmgtPmJfZGF0YSArIG1oX3NpemUpICsgc2RwLT5zZF9pbnB0cnM7CisJfQorCisJZXJyb3IgPSBkb19zdHJpcChpcCwgZGliaCwgYmgsIHRvcCwgYm90dG9tLCBoZWlnaHQsIHNtKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKGhlaWdodCA8IGlwLT5pX2hlaWdodCAtIDEpIHsKKworCQlnZnMyX21ldGFwYXRoX3JhKGlwLT5pX2dsLCBiaCwgdG9wKTsKKworCQlmb3IgKDsgdG9wIDwgYm90dG9tOyB0b3ArKywgZmlyc3QgPSAwKSB7CisJCQlpZiAoISp0b3ApCisJCQkJY29udGludWU7CisKKwkJCWJuID0gYmU2NF90b19jcHUoKnRvcCk7CisKKwkJCWVycm9yID0gcmVjdXJzaXZlX3NjYW4oaXAsIGRpYmgsIG1wLCBoZWlnaHQgKyAxLCBibiwKKwkJCQkJICAgICAgIGZpcnN0LCBzbSk7CisJCQlpZiAoZXJyb3IpCisJCQkJYnJlYWs7CisJCX0KKwl9CitvdXQ6CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoqCiAgKiBnZnMyX2Jsb2NrX3RydW5jYXRlX3BhZ2UgLSBEZWFsIHdpdGggemVyb2luZyBvdXQgZGF0YSBmb3IgdHJ1bmNhdGUKICAqCiAgKiBUaGlzIGlzIHBhcnRseSBib3Jyb3dlZCBmcm9tIGV4dDMuCkBAIC0xMDMxLDcgKzEwNTYsNyBAQAogCQlzbS5zbV9maXJzdCA9ICEhc2l6ZTsKIAkJc20uc21faGVpZ2h0ID0gaGVpZ2h0OwogCi0JCWVycm9yID0gcmVjdXJzaXZlX3NjYW4oaXAsIE5VTEwsICZtcCwgMCwgMCwgMSwgZG9fc3RyaXAsICZzbSk7CisJCWVycm9yID0gcmVjdXJzaXZlX3NjYW4oaXAsIE5VTEwsICZtcCwgMCwgMCwgMSwgJnNtKTsKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kaXIuYyBiL2ZzL2dmczIvZGlyLmMKaW5kZXggMWNjMmY4ZS4uOGNjYWQyNCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9kaXIuYworKysgYi9mcy9nZnMyL2Rpci5jCkBAIC0yNDAsMTYgKzI0MCwxNSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBnZnMyX2Rpcl9yZWFkX3N0dWZmZWQoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBjaGFyICpidWYsCi0JCQkJIHU2NCBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplKQorc3RhdGljIGludCBnZnMyX2Rpcl9yZWFkX3N0dWZmZWQoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBfX2JlNjQgKmJ1ZiwKKwkJCQkgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOwogCWludCBlcnJvcjsKIAogCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwogCWlmICghZXJyb3IpIHsKLQkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpOwotCQltZW1jcHkoYnVmLCBkaWJoLT5iX2RhdGEgKyBvZmZzZXQsIHNpemUpOworCQltZW1jcHkoYnVmLCBkaWJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSwgc2l6ZSk7CiAJCWJyZWxzZShkaWJoKTsKIAl9CiAKQEAgLTI2MSwxMyArMjYwLDEyIEBACiAgKiBnZnMyX2Rpcl9yZWFkX2RhdGEgLSBSZWFkIGEgZGF0YSBmcm9tIGEgZGlyZWN0b3J5IGlub2RlCiAgKiBAaXA6IFRoZSBHRlMyIElub2RlCiAgKiBAYnVmOiBUaGUgYnVmZmVyIHRvIHBsYWNlIHJlc3VsdCBpbnRvCi0gKiBAb2Zmc2V0OiBGaWxlIG9mZnNldCB0byBiZWdpbiBqZGF0YV9yZWFkbmcgZnJvbQogICogQHNpemU6IEFtb3VudCBvZiBkYXRhIHRvIHRyYW5zZmVyCiAgKgogICogUmV0dXJuczogVGhlIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IGNvcGllZCBvciB0aGUgZXJyb3IKICAqLwotc3RhdGljIGludCBnZnMyX2Rpcl9yZWFkX2RhdGEoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBjaGFyICpidWYsIHU2NCBvZmZzZXQsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgcmEpCitzdGF0aWMgaW50IGdmczJfZGlyX3JlYWRfZGF0YShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIF9fYmU2NCAqYnVmLAorCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CiAJdTY0IGxibG9jaywgZGJsb2NrOwpAQCAtMjc1LDI0ICsyNzMsMTQgQEAKIAl1bnNpZ25lZCBpbnQgbzsKIAlpbnQgY29waWVkID0gMDsKIAlpbnQgZXJyb3IgPSAwOwotCXU2NCBkaXNrc2l6ZSA9IGlfc2l6ZV9yZWFkKCZpcC0+aV9pbm9kZSk7Ci0KLQlpZiAob2Zmc2V0ID49IGRpc2tzaXplKQotCQlyZXR1cm4gMDsKLQotCWlmIChvZmZzZXQgKyBzaXplID4gZGlza3NpemUpCi0JCXNpemUgPSBkaXNrc2l6ZSAtIG9mZnNldDsKLQotCWlmICghc2l6ZSkKLQkJcmV0dXJuIDA7CiAKIAlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkKLQkJcmV0dXJuIGdmczJfZGlyX3JlYWRfc3R1ZmZlZChpcCwgYnVmLCBvZmZzZXQsIHNpemUpOworCQlyZXR1cm4gZ2ZzMl9kaXJfcmVhZF9zdHVmZmVkKGlwLCBidWYsIHNpemUpOwogCiAJaWYgKGdmczJfYXNzZXJ0X3dhcm4oc2RwLCBnZnMyX2lzX2pkYXRhKGlwKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbGJsb2NrID0gb2Zmc2V0OworCWxibG9jayA9IDA7CiAJbyA9IGRvX2RpdihsYmxvY2ssIHNkcC0+c2RfamJzaXplKSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlcik7CiAKIAl3aGlsZSAoY29waWVkIDwgc2l6ZSkgewpAQCAtMzExLDggKzI5OSw2IEBACiAJCQlpZiAoZXJyb3IgfHwgIWRibG9jaykKIAkJCQlnb3RvIGZhaWw7CiAJCQlCVUdfT04oZXh0bGVuIDwgMSk7Ci0JCQlpZiAoIXJhKQotCQkJCWV4dGxlbiA9IDE7CiAJCQliaCA9IGdmczJfbWV0YV9yYShpcC0+aV9nbCwgZGJsb2NrLCBleHRsZW4pOwogCQl9IGVsc2UgewogCQkJZXJyb3IgPSBnZnMyX21ldGFfcmVhZChpcC0+aV9nbCwgZGJsb2NrLCBESU9fV0FJVCwgJmJoKTsKQEAgLTMyOCw3ICszMTQsNyBAQAogCQlleHRsZW4tLTsKIAkJbWVtY3B5KGJ1ZiwgYmgtPmJfZGF0YSArIG8sIGFtb3VudCk7CiAJCWJyZWxzZShiaCk7Ci0JCWJ1ZiArPSBhbW91bnQ7CisJCWJ1ZiArPSAoYW1vdW50L3NpemVvZihfX2JlNjQpKTsKIAkJY29waWVkICs9IGFtb3VudDsKIAkJbGJsb2NrKys7CiAJCW8gPSBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpOwpAQCAtMzcxLDcgKzM1Nyw3IEBACiAJaWYgKGhjID09IE5VTEwpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JcmV0ID0gZ2ZzMl9kaXJfcmVhZF9kYXRhKGlwLCAoY2hhciAqKWhjLCAwLCBoc2l6ZSwgMSk7CisJcmV0ID0gZ2ZzMl9kaXJfcmVhZF9kYXRhKGlwLCBoYywgaHNpemUpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKGhjKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKQEAgLTE2OTUsNyArMTY4MSw2IEBACiAJY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUgPSAmZGVudHJ5LT5kX25hbWU7CiAJc3RydWN0IGdmczJfZGlyZW50ICpkZW50LCAqcHJldiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlpbnQgZXJyb3I7CiAKIAkvKiBSZXR1cm5zIF9laXRoZXJfIHRoZSBlbnRyeSAoaWYgaXRzIGZpcnN0IGluIGJsb2NrKSBvciB0aGUKIAkgICBwcmV2aW91cyBlbnRyeSBvdGhlcndpc2UgKi8KQEAgLTE3MjQsMjIgKzE3MDksMTUgQEAKIAl9CiAJYnJlbHNlKGJoKTsKIAotCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihkaXAsICZiaCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KIAlpZiAoIWRpcC0+aV9lbnRyaWVzKQogCQlnZnMyX2NvbnNpc3RfaW5vZGUoZGlwKTsKLQlnZnMyX3RyYW5zX2FkZF9iaChkaXAtPmlfZ2wsIGJoLCAxKTsKIAlkaXAtPmlfZW50cmllcy0tOwogCWRpcC0+aV9pbm9kZS5pX210aW1lID0gZGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJaWYgKFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQogCQlkcm9wX25saW5rKCZkaXAtPmlfaW5vZGUpOwotCWdmczJfZGlub2RlX291dChkaXAsIGJoLT5iX2RhdGEpOwotCWJyZWxzZShiaCk7CiAJbWFya19pbm9kZV9kaXJ0eSgmZGlwLT5pX2lub2RlKTsKIAotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xODI5LDEwICsxODA3LDYgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3B1dDsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChzZHAsICZkaXAtPmlfYWxsb2MtPmFsX3JpX2doKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X3FzOwotCiAJLyogIENvdW50IHRoZSBudW1iZXIgb2YgbGVhdmVzICAqLwogCWJoID0gbGVhZl9iaDsKIApAQCAtMTg0Nyw3ICsxODIxLDcgQEAKIAkJaWYgKGJsayAhPSBsZWFmX25vKQogCQkJYnJlbHNlKGJoKTsKIAotCQlnZnMyX3JsaXN0X2FkZChzZHAsICZybGlzdCwgYmxrKTsKKwkJZ2ZzMl9ybGlzdF9hZGQoZGlwLCAmcmxpc3QsIGJsayk7CiAJCWxfYmxvY2tzKys7CiAJfQogCkBAIC0xOTExLDggKzE4ODUsNiBAQAogCWdmczJfZ2xvY2tfZHFfbShybGlzdC5ybF9yZ3Jwcywgcmxpc3QucmxfZ2hzKTsKIG91dF9ybGlzdDoKIAlnZnMyX3JsaXN0X2ZyZWUoJnJsaXN0KTsKLQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZGlwLT5pX2FsbG9jLT5hbF9yaV9naCk7Ci1vdXRfcXM6CiAJZ2ZzMl9xdW90YV91bmhvbGQoZGlwKTsKIG91dF9wdXQ6CiAJZ2ZzMl9hbGxvY19wdXQoZGlwKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZmlsZS5jIGIvZnMvZ2ZzMi9maWxlLmMKaW5kZXggZWRlYjllOC4uY2UzNmE1NiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9maWxlLmMKKysrIGIvZnMvZ2ZzMi9maWxlLmMKQEAgLTU5LDE1ICs1OSwyNCBAQAogCXN0cnVjdCBnZnMyX2hvbGRlciBpX2doOwogCWxvZmZfdCBlcnJvcjsKIAotCWlmIChvcmlnaW4gPT0gMikgeworCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSBTRUVLX0VORDogLyogVGhlc2UgcmVmZXJlbmNlIGlub2RlLT5pX3NpemUgKi8KKwljYXNlIFNFRUtfREFUQToKKwljYXNlIFNFRUtfSE9MRToKIAkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgTE1fRkxBR19BTlksCiAJCQkJCSAgICZpX2doKTsKIAkJaWYgKCFlcnJvcikgewotCQkJZXJyb3IgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwkJCWVycm9yID0gZ2VuZXJpY19maWxlX2xsc2VlayhmaWxlLCBvZmZzZXQsIG9yaWdpbik7CiAJCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmaV9naCk7CiAJCX0KLQl9IGVsc2UKLQkJZXJyb3IgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0NVUjoKKwljYXNlIFNFRUtfU0VUOgorCQllcnJvciA9IGdlbmVyaWNfZmlsZV9sbHNlZWsoZmlsZSwgb2Zmc2V0LCBvcmlnaW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvciA9IC1FSU5WQUw7CisJfQogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMzU3LDggKzM2NiwxNSBAQAogCXVuc2lnbmVkIGludCBkYXRhX2Jsb2NrcywgaW5kX2Jsb2NrcywgcmJsb2NrczsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CiAJc3RydWN0IGdmczJfYWxsb2MgKmFsOworCWxvZmZfdCBzaXplOwogCWludCByZXQ7CiAKKwkvKiBXYWl0IGlmIGZzIGlzIGZyb3plbi4gVGhpcyBpcyByYWN5IHNvIHdlIGNoZWNrIGFnYWluIGxhdGVyIG9uCisJICogYW5kIHJldHJ5IGlmIHRoZSBmcyBoYXMgYmVlbiBmcm96ZW4gYWZ0ZXIgdGhlIHBhZ2UgbG9jayBoYXMKKwkgKiBiZWVuIGFjcXVpcmVkCisJICovCisJdmZzX2NoZWNrX2Zyb3plbihpbm9kZS0+aV9zYiwgU0JfRlJFRVpFX1dSSVRFKTsKKwogCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmdoKTsKIAlyZXQgPSBnZnMyX2dsb2NrX25xKCZnaCk7CiAJaWYgKHJldCkKQEAgLTM2Nyw4ICszODMsMTUgQEAKIAlzZXRfYml0KEdMRl9ESVJUWSwgJmlwLT5pX2dsLT5nbF9mbGFncyk7CiAJc2V0X2JpdChHSUZfU1dfUEFHRUQsICZpcC0+aV9mbGFncyk7CiAKLQlpZiAoIWdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIHBvcywgUEFHRV9DQUNIRV9TSVpFKSkKKwlpZiAoIWdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIHBvcywgUEFHRV9DQUNIRV9TSVpFKSkgeworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IHBhZ2UtPm1hcHBpbmcgIT0gaW5vZGUtPmlfbWFwcGluZykgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQl9CiAJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKIAlyZXQgPSAtRU5PTUVNOwogCWFsID0gZ2ZzMl9hbGxvY19nZXQoaXApOwogCWlmIChhbCA9PSBOVUxMKQpAQCAtMzg4LDcgKzQxMSw3IEBACiAJCXJibG9ja3MgKz0gZGF0YV9ibG9ja3MgPyBkYXRhX2Jsb2NrcyA6IDE7CiAJaWYgKGluZF9ibG9ja3MgfHwgZGF0YV9ibG9ja3MpIHsKIAkJcmJsb2NrcyArPSBSRVNfU1RBVEZTICsgUkVTX1FVT1RBOwotCQlyYmxvY2tzICs9IGdmczJfcmdfYmxvY2tzKGFsKTsKKwkJcmJsb2NrcyArPSBnZnMyX3JnX2Jsb2NrcyhpcCk7CiAJfQogCXJldCA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCByYmxvY2tzLCAwKTsKIAlpZiAocmV0KQpAQCAtMzk2LDIxICs0MTksMjkgQEAKIAogCWxvY2tfcGFnZShwYWdlKTsKIAlyZXQgPSAtRUlOVkFMOwotCWxhc3RfaW5kZXggPSBpcC0+aV9pbm9kZS5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlpZiAocGFnZS0+aW5kZXggPiBsYXN0X2luZGV4KQotCQlnb3RvIG91dF91bmxvY2tfcGFnZTsKLQlyZXQgPSAwOwotCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IHBhZ2UtPm1hcHBpbmcgIT0gaXAtPmlfaW5vZGUuaV9tYXBwaW5nKQotCQlnb3RvIG91dF91bmxvY2tfcGFnZTsKLQlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkgewotCQlyZXQgPSBnZnMyX3Vuc3R1ZmZfZGlub2RlKGlwLCBwYWdlKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3VubG9ja19wYWdlOwotCX0KLQlyZXQgPSBnZnMyX2FsbG9jYXRlX3BhZ2VfYmFja2luZyhwYWdlKTsKKwlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCWxhc3RfaW5kZXggPSAoc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJLyogQ2hlY2sgcGFnZSBpbmRleCBhZ2FpbnN0IGlub2RlIHNpemUgKi8KKwlpZiAoc2l6ZSA9PSAwIHx8IChwYWdlLT5pbmRleCA+IGxhc3RfaW5kZXgpKQorCQlnb3RvIG91dF90cmFuc19lbmQ7CiAKLW91dF91bmxvY2tfcGFnZToKLQl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXQgPSAtRUFHQUlOOworCS8qIElmIHRydW5jYXRlZCwgd2UgbXVzdCByZXRyeSB0aGUgb3BlcmF0aW9uLCB3ZSBtYXkgaGF2ZSByYWNlZAorCSAqIHdpdGggdGhlIGdsb2NrIGRlbW90aW9uIGNvZGUuCisJICovCisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgfHwgcGFnZS0+bWFwcGluZyAhPSBpbm9kZS0+aV9tYXBwaW5nKQorCQlnb3RvIG91dF90cmFuc19lbmQ7CisKKwkvKiBVbnN0dWZmLCBpZiByZXF1aXJlZCwgYW5kIGFsbG9jYXRlIGJhY2tpbmcgYmxvY2tzIGZvciBwYWdlICovCisJcmV0ID0gMDsKKwlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkKKwkJcmV0ID0gZ2ZzMl91bnN0dWZmX2Rpbm9kZShpcCwgcGFnZSk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBnZnMyX2FsbG9jYXRlX3BhZ2VfYmFja2luZyhwYWdlKTsKKworb3V0X3RyYW5zX2VuZDoKKwlpZiAocmV0KQorCQl1bmxvY2tfcGFnZShwYWdlKTsKIAlnZnMyX3RyYW5zX2VuZChzZHApOwogb3V0X3RyYW5zX2ZhaWw6CiAJZ2ZzMl9pbnBsYWNlX3JlbGVhc2UoaXApOwpAQCAtNDIyLDExICs0NTMsMTcgQEAKIAlnZnMyX2dsb2NrX2RxKCZnaCk7CiBvdXQ6CiAJZ2ZzMl9ob2xkZXJfdW5pbml0KCZnaCk7Ci0JaWYgKHJldCA9PSAtRU5PTUVNKQotCQlyZXQgPSBWTV9GQVVMVF9PT007Ci0JZWxzZSBpZiAocmV0KQotCQlyZXQgPSBWTV9GQVVMVF9TSUdCVVM7Ci0JcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IDApIHsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCS8qIFRoaXMgY2hlY2sgbXVzdCBiZSBwb3N0IGRyb3BwaW5nIG9mIHRyYW5zYWN0aW9uIGxvY2sgKi8KKwkJaWYgKGlub2RlLT5pX3NiLT5zX2Zyb3plbiA9PSBTQl9VTkZST1pFTikgeworCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJfQorCX0KKwlyZXR1cm4gYmxvY2tfcGFnZV9ta3dyaXRlX3JldHVybihyZXQpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGdmczJfdm1fb3BzID0gewpAQCAtNTUxLDggKzU4OCwxNiBAQAogICogQGVuZDogdGhlIGVuZCBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byBzeW5jCiAgKiBAZGF0YXN5bmM6IHNldCBpZiB3ZSBjYW4gaWdub3JlIHRpbWVzdGFtcCBjaGFuZ2VzCiAgKgotICogVGhlIFZGUyB3aWxsIGZsdXNoIGRhdGEgZm9yIHVzLiBXZSBvbmx5IG5lZWQgdG8gd29ycnkKLSAqIGFib3V0IG1ldGFkYXRhIGhlcmUuCisgKiBXZSBzcGxpdCB0aGUgZGF0YSBmbHVzaGluZyBoZXJlIHNvIHRoYXQgd2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIGRhdGEKKyAqIHVudGlsIGFmdGVyIHdlJ3ZlIGFsc28gc2VudCB0aGUgbWV0YWRhdGEgdG8gZGlzay4gTm90ZSB0aGF0IGZvcgorICogZGF0YT1vcmRlcmVkLCB3ZSB3aWxsIHdyaXRlICYgd2FpdCBmb3IgdGhlIGRhdGEgYXQgdGhlIGxvZyBmbHVzaAorICogc3RhZ2UgYW55d2F5LCBzbyB0aGlzIGlzIHVubGlrZWx5IHRvIG1ha2UgbXVjaCBvZiBhIGRpZmZlcmVuY2UKKyAqIGV4Y2VwdCBpbiB0aGUgZGF0YT13cml0ZWJhY2sgY2FzZS4KKyAqCisgKiBJZiB0aGUgZmRhdGF3cml0ZSBmYWlscyBkdWUgdG8gYW55IHJlYXNvbiBleGNlcHQgLUVJTywgd2Ugd2lsbAorICogY29udGludWUgdGhlIHJlbWFpbmRlciBvZiB0aGUgZnN5bmMsIGFsdGhvdWdoIHdlJ2xsIHN0aWxsIHJlcG9ydAorICogdGhlIGVycm9yIGF0IHRoZSBlbmQuIFRoaXMgaXMgdG8gbWF0Y2ggZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZSgpCisgKiBiZWhhdmlvdXIuCiAgKgogICogUmV0dXJuczogZXJybm8KICAqLwpAQCAtNTYwLDMwICs2MDUsMzQgQEAKIHN0YXRpYyBpbnQgZ2ZzMl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAogCQkgICAgICBpbnQgZGF0YXN5bmMpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlpbnQgc3luY19zdGF0ZSA9IGlub2RlLT5pX3N0YXRlICYgKElfRElSVFlfU1lOQ3xJX0RJUlRZX0RBVEFTWU5DKTsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwotCWludCByZXQ7CisJaW50IHJldCwgcmV0MSA9IDA7CiAKLQlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCWlmIChtYXBwaW5nLT5ucnBhZ2VzKSB7CisJCXJldDEgPSBmaWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCk7CisJCWlmIChyZXQxID09IC1FSU8pCisJCQlyZXR1cm4gcmV0MTsKKwl9CiAKIAlpZiAoZGF0YXN5bmMpCiAJCXN5bmNfc3RhdGUgJj0gfklfRElSVFlfU1lOQzsKIAogCWlmIChzeW5jX3N0YXRlKSB7CiAJCXJldCA9IHN5bmNfaW5vZGVfbWV0YWRhdGEoaW5vZGUsIDEpOwotCQlpZiAocmV0KSB7Ci0JCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7Ci0JCX0KLQkJZ2ZzMl9haWxfZmx1c2goaXAtPmlfZ2wpOworCQlpZiAoZ2ZzMl9pc19qZGF0YShpcCkpCisJCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KG1hcHBpbmcpOworCQlnZnMyX2FpbF9mbHVzaChpcC0+aV9nbCwgMSk7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JcmV0dXJuIDA7CisJaWYgKG1hcHBpbmctPm5ycGFnZXMpCisJCXJldCA9IGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQpOworCisJcmV0dXJuIHJldCA/IHJldCA6IHJldDE7CiB9CiAKIC8qKgpAQCAtNjIwLDEzNSArNjY5LDE4IEBACiAJcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOwogfQogCi1zdGF0aWMgaW50IGVtcHR5X3dyaXRlX2VuZChzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwKLQkJCSAgIHVuc2lnbmVkIHRvLCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0JdW5zaWduZWQgb2Zmc2V0LCBibGtzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOwotCXBnb2ZmX3QgZW5kX2luZGV4ID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0KLQl6ZXJvX3VzZXIocGFnZSwgZnJvbSwgdG8tZnJvbSk7Ci0JbWFya19wYWdlX2FjY2Vzc2VkKHBhZ2UpOwotCi0JaWYgKHBhZ2UtPmluZGV4IDwgZW5kX2luZGV4IHx8ICEobW9kZSAmIEZBTExPQ19GTF9LRUVQX1NJWkUpKSB7Ci0JCWlmICghZ2ZzMl9pc193cml0ZWJhY2soaXApKQotCQkJZ2ZzMl9wYWdlX2FkZF9kYXRhYnVmcyhpcCwgcGFnZSwgZnJvbSwgdG8pOwotCi0JCWJsb2NrX2NvbW1pdF93cml0ZShwYWdlLCBmcm9tLCB0byk7Ci0JCXJldHVybiAwOwotCX0KLQotCW9mZnNldCA9IDA7Ci0JYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7Ci0Jd2hpbGUgKG9mZnNldCA8IHRvKSB7Ci0JCWlmIChvZmZzZXQgPj0gZnJvbSkgewotCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKLQkJCXdyaXRlX2RpcnR5X2J1ZmZlcihiaCwgV1JJVEUpOwotCQl9Ci0JCW9mZnNldCArPSBibGtzaXplOwotCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKLQl9Ci0KLQlvZmZzZXQgPSAwOwotCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOwotCXdoaWxlIChvZmZzZXQgPCB0bykgewotCQlpZiAob2Zmc2V0ID49IGZyb20pIHsKLQkJCXdhaXRfb25fYnVmZmVyKGJoKTsKLQkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfQotCQlvZmZzZXQgKz0gYmxrc2l6ZTsKLQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG5lZWRzX2VtcHR5X3dyaXRlKHNlY3Rvcl90IGJsb2NrLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmhfbWFwID0geyAuYl9zdGF0ZSA9IDAsIC5iX2Jsb2NrbnIgPSAwIH07Ci0KLQliaF9tYXAuYl9zaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOwotCWVycm9yID0gZ2ZzMl9ibG9ja19tYXAoaW5vZGUsIGJsb2NrLCAmYmhfbWFwLCAwKTsKLQlpZiAodW5saWtlbHkoZXJyb3IpKQotCQlyZXR1cm4gZXJyb3I7Ci0JcmV0dXJuICFidWZmZXJfbWFwcGVkKCZiaF9tYXApOwotfQotCi1zdGF0aWMgaW50IHdyaXRlX2VtcHR5X2Jsb2NrcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sCi0JCQkgICAgICBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQl1bnNpZ25lZCBzdGFydCwgZW5kLCBuZXh0LCBibGtzaXplOwotCXNlY3Rvcl90IGJsb2NrID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKLQlpbnQgcmV0OwotCi0JYmxrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKLQluZXh0ID0gZW5kID0gMDsKLQl3aGlsZSAobmV4dCA8IGZyb20pIHsKLQkJbmV4dCArPSBibGtzaXplOwotCQlibG9jaysrOwotCX0KLQlzdGFydCA9IG5leHQ7Ci0JZG8gewotCQluZXh0ICs9IGJsa3NpemU7Ci0JCXJldCA9IG5lZWRzX2VtcHR5X3dyaXRlKGJsb2NrLCBpbm9kZSk7Ci0JCWlmICh1bmxpa2VseShyZXQgPCAwKSkKLQkJCXJldHVybiByZXQ7Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJaWYgKGVuZCkgewotCQkJCXJldCA9IF9fYmxvY2tfd3JpdGVfYmVnaW4ocGFnZSwgc3RhcnQsIGVuZCAtIHN0YXJ0LAotCQkJCQkJCSAgZ2ZzMl9ibG9ja19tYXApOwotCQkJCWlmICh1bmxpa2VseShyZXQpKQotCQkJCQlyZXR1cm4gcmV0OwotCQkJCXJldCA9IGVtcHR5X3dyaXRlX2VuZChwYWdlLCBzdGFydCwgZW5kLCBtb2RlKTsKLQkJCQlpZiAodW5saWtlbHkocmV0KSkKLQkJCQkJcmV0dXJuIHJldDsKLQkJCQllbmQgPSAwOwotCQkJfQotCQkJc3RhcnQgPSBuZXh0OwotCQl9Ci0JCWVsc2UKLQkJCWVuZCA9IG5leHQ7Ci0JCWJsb2NrKys7Ci0JfSB3aGlsZSAobmV4dCA8IHRvKTsKLQotCWlmIChlbmQpIHsKLQkJcmV0ID0gX19ibG9ja193cml0ZV9iZWdpbihwYWdlLCBzdGFydCwgZW5kIC0gc3RhcnQsIGdmczJfYmxvY2tfbWFwKTsKLQkJaWYgKHVubGlrZWx5KHJldCkpCi0JCQlyZXR1cm4gcmV0OwotCQlyZXQgPSBlbXB0eV93cml0ZV9lbmQocGFnZSwgc3RhcnQsIGVuZCwgbW9kZSk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBmYWxsb2NhdGVfY2h1bmsoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbiwKIAkJCSAgIGludCBtb2RlKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOwogCWludCBlcnJvcjsKLQl1NjQgc3RhcnQgPSBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQl1bnNpZ25lZCBpbnQgc3RhcnRfb2Zmc2V0ID0gb2Zmc2V0ICYgflBBR0VfQ0FDSEVfTUFTSzsKLQl1NjQgZW5kID0gKG9mZnNldCArIGxlbiAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JcGdvZmZfdCBjdXJyOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGludCBlbmRfb2Zmc2V0ID0gKG9mZnNldCArIGxlbikgJiB+UEFHRV9DQUNIRV9NQVNLOwotCXVuc2lnbmVkIGludCBmcm9tLCB0bzsKLQotCWlmICghZW5kX29mZnNldCkKLQkJZW5kX29mZnNldCA9IFBBR0VfQ0FDSEVfU0laRTsKKwl1bnNpZ25lZCBpbnQgbnJfYmxrczsKKwlzZWN0b3JfdCBsYmxvY2sgPSBvZmZzZXQgPj4gaW5vZGUtPmlfYmxrYml0czsKIAogCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwogCWlmICh1bmxpa2VseShlcnJvcikpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyb3I7CiAKIAlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7CiAKQEAgLTc1OCw0MCArNjkwLDMxIEBACiAJCQlnb3RvIG91dDsKIAl9CiAKLQljdXJyID0gc3RhcnQ7Ci0Jb2Zmc2V0ID0gc3RhcnQgPDwgUEFHRV9DQUNIRV9TSElGVDsKLQlmcm9tID0gc3RhcnRfb2Zmc2V0OwotCXRvID0gUEFHRV9DQUNIRV9TSVpFOwotCXdoaWxlIChjdXJyIDw9IGVuZCkgewotCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlX3dyaXRlX2JlZ2luKGlub2RlLT5pX21hcHBpbmcsIGN1cnIsCi0JCQkJCQkgICBBT1BfRkxBR19OT0ZTKTsKLQkJaWYgKHVubGlrZWx5KCFwYWdlKSkgewotCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KKwl3aGlsZSAobGVuKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCBiaF9tYXAgPSB7IC5iX3N0YXRlID0gMCwgLmJfYmxvY2tuciA9IDAgfTsKKwkJYmhfbWFwLmJfc2l6ZSA9IGxlbjsKKwkJc2V0X2J1ZmZlcl96ZXJvbmV3KCZiaF9tYXApOwogCi0JCWlmIChjdXJyID09IGVuZCkKLQkJCXRvID0gZW5kX29mZnNldDsKLQkJZXJyb3IgPSB3cml0ZV9lbXB0eV9ibG9ja3MocGFnZSwgZnJvbSwgdG8sIG1vZGUpOwotCQlpZiAoIWVycm9yICYmIG9mZnNldCArIHRvID4gaW5vZGUtPmlfc2l6ZSAmJgotCQkgICAgIShtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkpIHsKLQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2Zmc2V0ICsgdG8pOwotCQl9Ci0JCXVubG9ja19wYWdlKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCWlmIChlcnJvcikKKwkJZXJyb3IgPSBnZnMyX2Jsb2NrX21hcChpbm9kZSwgbGJsb2NrLCAmYmhfbWFwLCAxKTsKKwkJaWYgKHVubGlrZWx5KGVycm9yKSkKIAkJCWdvdG8gb3V0OwotCQljdXJyKys7Ci0JCW9mZnNldCArPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCWZyb20gPSAwOworCQlsZW4gLT0gYmhfbWFwLmJfc2l6ZTsKKwkJbnJfYmxrcyA9IGJoX21hcC5iX3NpemUgPj4gaW5vZGUtPmlfYmxrYml0czsKKwkJbGJsb2NrICs9IG5yX2Jsa3M7CisJCWlmICghYnVmZmVyX25ldygmYmhfbWFwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl96ZXJvbmV3KCZiaF9tYXApKSkgeworCQkJZXJyb3IgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KIAl9CisJaWYgKG9mZnNldCArIGxlbiA+IGlub2RlLT5pX3NpemUgJiYgIShtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkpCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2Zmc2V0ICsgbGVuKTsKIAotCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAotCWJyZWxzZShkaWJoKTsKLQogb3V0OgorCWJyZWxzZShkaWJoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTc5OSw3ICs3MjIsNyBAQAogCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YV9ibG9ja3MsIHVuc2lnbmVkIGludCAqaW5kX2Jsb2NrcykKIHsKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKLQl1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcyA9IGlwLT5pX2FsbG9jLT5hbF9yZ2QtPnJkX2ZyZWVfY2xvbmU7CisJdW5zaWduZWQgaW50IG1heF9ibG9ja3MgPSBpcC0+aV9yZ2QtPnJkX2ZyZWVfY2xvbmU7CiAJdW5zaWduZWQgaW50IHRtcCwgbWF4X2RhdGEgPSBtYXhfYmxvY2tzIC0gMyAqIChzZHAtPnNkX21heF9oZWlnaHQgLSAxKTsKIAogCWZvciAodG1wID0gbWF4X2RhdGE7IHRtcCA+IHNkcC0+c2RfZGlwdHJzOykgewpAQCAtODMxLDYgKzc1NCw3IEBACiAJaW50IGVycm9yOwogCWxvZmZfdCBic2l6ZV9tYXNrID0gfigobG9mZl90KXNkcC0+c2Rfc2Iuc2JfYnNpemUgLSAxKTsKIAlsb2ZmX3QgbmV4dCA9IChvZmZzZXQgKyBsZW4gLSAxKSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OworCWxvZmZfdCBtYXhfY2h1bmtfc2l6ZSA9IFVJTlRfTUFYICYgYnNpemVfbWFzazsKIAluZXh0ID0gKG5leHQgKyAxKSA8PCBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwogCiAJLyogV2Ugb25seSBzdXBwb3J0IHRoZSBGQUxMT0NfRkxfS0VFUF9TSVpFIG1vZGUgKi8KQEAgLTg4NCwxMSArODA4LDEyIEBACiAJCQlnb3RvIG91dF9xdW5sb2NrOwogCQl9CiAJCW1heF9ieXRlcyA9IGJ5dGVzOwotCQljYWxjX21heF9yZXNlcnYoaXAsIGxlbiwgJm1heF9ieXRlcywgJmRhdGFfYmxvY2tzLCAmaW5kX2Jsb2Nrcyk7CisJCWNhbGNfbWF4X3Jlc2VydihpcCwgKGxlbiA+IG1heF9jaHVua19zaXplKT8gbWF4X2NodW5rX3NpemU6IGxlbiwKKwkJCQkmbWF4X2J5dGVzLCAmZGF0YV9ibG9ja3MsICZpbmRfYmxvY2tzKTsKIAkJYWwtPmFsX3JlcXVlc3RlZCA9IGRhdGFfYmxvY2tzICsgaW5kX2Jsb2NrczsKIAogCQlyYmxvY2tzID0gUkVTX0RJTk9ERSArIGluZF9ibG9ja3MgKyBSRVNfU1RBVEZTICsgUkVTX1FVT1RBICsKLQkJCSAgUkVTX1JHX0hEUiArIGdmczJfcmdfYmxvY2tzKGFsKTsKKwkJCSAgUkVTX1JHX0hEUiArIGdmczJfcmdfYmxvY2tzKGlwKTsKIAkJaWYgKGdmczJfaXNfamRhdGEoaXApKQogCQkJcmJsb2NrcyArPSBkYXRhX2Jsb2NrcyA/IGRhdGFfYmxvY2tzIDogMTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9nbG9jay5oIGIvZnMvZ2ZzMi9nbG9jay5oCmluZGV4IDY2NzA3MTEuLjI1NTNiODUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZ2xvY2suaAorKysgYi9mcy9nZnMyL2dsb2NrLmgKQEAgLTIwMSw3ICsyMDEsNyBAQAogdm9pZCBnZnMyX2dsb2NrX2RxX20odW5zaWduZWQgaW50IG51bV9naCwgc3RydWN0IGdmczJfaG9sZGVyICpnaHMpOwogdm9pZCBnZnMyX2dsb2NrX2RxX3VuaW5pdF9tKHVuc2lnbmVkIGludCBudW1fZ2gsIHN0cnVjdCBnZnMyX2hvbGRlciAqZ2hzKTsKIAotX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK19fcHJpbnRmKDIsIDMpCiB2b2lkIGdmczJfcHJpbnRfZGJnKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9nbG9wcy5jIGIvZnMvZ2ZzMi9nbG9wcy5jCmluZGV4IGRhMjFlY2EuLjE2NTZkZjdhIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb3BzLmMKKysrIGIvZnMvZ2ZzMi9nbG9wcy5jCkBAIC0yOCw0MCArMjgsNTUgQEAKICNpbmNsdWRlICJ0cmFucy5oIgogI2luY2x1ZGUgImRpci5oIgogCitzdGF0aWMgdm9pZCBnZnMyX2FpbF9lcnJvcihzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJZnNfZXJyKGdsLT5nbF9zYmQsICJBSUwgYnVmZmVyICVwOiBibG9ja25yICVsbHUgc3RhdGUgMHglMDhseCBtYXBwaW5nICVwIHBhZ2Ugc3RhdGUgMHglbHhcbiIsCisJICAgICAgIGJoLCAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIGJoLT5iX3N0YXRlLAorCSAgICAgICBiaC0+Yl9wYWdlLT5tYXBwaW5nLCBiaC0+Yl9wYWdlLT5mbGFncyk7CisJZnNfZXJyKGdsLT5nbF9zYmQsICJBSUwgZ2xvY2sgJXU6JWxsdSBtYXBwaW5nICVwXG4iLAorCSAgICAgICBnbC0+Z2xfbmFtZS5sbl90eXBlLCBnbC0+Z2xfbmFtZS5sbl9udW1iZXIsCisJICAgICAgIGdmczJfZ2xvY2syYXNwYWNlKGdsKSk7CisJZ2ZzMl9sbV93aXRoZHJhdyhnbC0+Z2xfc2JkLCAiQUlMIGVycm9yXG4iKTsKK30KKwogLyoqCiAgKiBfX2dmczJfYWlsX2ZsdXNoIC0gcmVtb3ZlIGFsbCBidWZmZXJzIGZvciBhIGdpdmVuIGxvY2sgZnJvbSB0aGUgQUlMCiAgKiBAZ2w6IHRoZSBnbG9jaworICogQGZzeW5jOiBzZXQgd2hlbiBjYWxsZWQgZnJvbSBmc3luYyAobm90IGFsbCBidWZmZXJzIHdpbGwgYmUgY2xlYW4pCiAgKgogICogTm9uZSBvZiB0aGUgYnVmZmVycyBzaG91bGQgYmUgZGlydHksIGxvY2tlZCwgb3IgcGlubmVkLgogICovCiAKLXN0YXRpYyB2b2lkIF9fZ2ZzMl9haWxfZmx1c2goc3RydWN0IGdmczJfZ2xvY2sgKmdsKQorc3RhdGljIHZvaWQgX19nZnMyX2FpbF9mbHVzaChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGJvb2wgZnN5bmMpCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBnbC0+Z2xfc2JkOwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZ2wtPmdsX2FpbF9saXN0OwotCXN0cnVjdCBnZnMyX2J1ZmRhdGEgKmJkOworCXN0cnVjdCBnZnMyX2J1ZmRhdGEgKmJkLCAqdG1wOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY29uc3QgdW5zaWduZWQgbG9uZyBiX3N0YXRlID0gKDFVTCA8PCBCSF9EaXJ0eSl8KDFVTCA8PCBCSF9QaW5uZWQpfCgxVUwgPDwgQkhfTG9jayk7CisJc2VjdG9yX3QgYmxvY2tucjsKIAorCWdmczJfbG9nX2xvY2soc2RwKTsKIAlzcGluX2xvY2soJnNkcC0+c2RfYWlsX2xvY2spOwotCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgewotCQliZCA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwgc3RydWN0IGdmczJfYnVmZGF0YSwKLQkJCQliZF9haWxfZ2xfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJkLCB0bXAsIGhlYWQsIGJkX2FpbF9nbF9saXN0KSB7CiAJCWJoID0gYmQtPmJkX2JoOwotCQlnZnMyX3JlbW92ZV9mcm9tX2FpbChiZCk7Ci0JCWJkLT5iZF9iaCA9IE5VTEw7CisJCWlmIChiaC0+Yl9zdGF0ZSAmIGJfc3RhdGUpIHsKKwkJCWlmIChmc3luYykKKwkJCQljb250aW51ZTsKKwkJCWdmczJfYWlsX2Vycm9yKGdsLCBiaCk7CisJCX0KKwkJYmxvY2tuciA9IGJoLT5iX2Jsb2NrbnI7CiAJCWJoLT5iX3ByaXZhdGUgPSBOVUxMOwotCQlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CisJCWdmczJfcmVtb3ZlX2Zyb21fYWlsKGJkKTsgLyogZHJvcHMgcmVmIG9uIGJoICovCiAKLQkJYmQtPmJkX2Jsa25vID0gYmgtPmJfYmxvY2tucjsKLQkJZ2ZzMl9sb2dfbG9jayhzZHApOwotCQlnZnMyX2Fzc2VydF93aXRoZHJhdyhzZHAsICFidWZmZXJfYnVzeShiaCkpOworCQliZC0+YmRfYmggPSBOVUxMOworCQliZC0+YmRfYmxrbm8gPSBibG9ja25yOworCiAJCWdmczJfdHJhbnNfYWRkX3Jldm9rZShzZHAsIGJkKTsKLQkJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7Ci0KLQkJc3Bpbl9sb2NrKCZzZHAtPnNkX2FpbF9sb2NrKTsKIAl9Ci0JZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCAhYXRvbWljX3JlYWQoJmdsLT5nbF9haWxfY291bnQpKTsKKwlCVUdfT04oIWZzeW5jICYmIGF0b21pY19yZWFkKCZnbC0+Z2xfYWlsX2NvdW50KSk7CiAJc3Bpbl91bmxvY2soJnNkcC0+c2RfYWlsX2xvY2spOworCWdmczJfbG9nX3VubG9jayhzZHApOwogfQogCiAKQEAgLTg0LDEzICs5OSwxMyBAQAogCUJVR19PTihjdXJyZW50LT5qb3VybmFsX2luZm8pOwogCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9ICZ0cjsKIAotCV9fZ2ZzMl9haWxfZmx1c2goZ2wpOworCV9fZ2ZzMl9haWxfZmx1c2goZ2wsIDApOwogCiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAlnZnMyX2xvZ19mbHVzaChzZHAsIE5VTEwpOwogfQogCi12b2lkIGdmczJfYWlsX2ZsdXNoKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK3ZvaWQgZ2ZzMl9haWxfZmx1c2goc3RydWN0IGdmczJfZ2xvY2sgKmdsLCBib29sIGZzeW5jKQogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKIAl1bnNpZ25lZCBpbnQgcmV2b2tlcyA9IGF0b21pY19yZWFkKCZnbC0+Z2xfYWlsX2NvdW50KTsKQEAgLTEwMiw3ICsxMTcsNyBAQAogCXJldCA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCAwLCByZXZva2VzKTsKIAlpZiAocmV0KQogCQlyZXR1cm47Ci0JX19nZnMyX2FpbF9mbHVzaChnbCk7CisJX19nZnMyX2FpbF9mbHVzaChnbCwgZnN5bmMpOwogCWdmczJfdHJhbnNfZW5kKHNkcCk7CiAJZ2ZzMl9sb2dfZmx1c2goc2RwLCBOVUxMKTsKIH0KQEAgLTExOSw2ICsxMzQsNyBAQAogc3RhdGljIHZvaWQgcmdycF9nb19zeW5jKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWV0YW1hcHBpbmcgPSBnZnMyX2dsb2NrMmFzcGFjZShnbCk7CisJc3RydWN0IGdmczJfcmdycGQgKnJnZDsKIAlpbnQgZXJyb3I7CiAKIAlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChHTEZfRElSVFksICZnbC0+Z2xfZmxhZ3MpKQpAQCAtMTMwLDYgKzE0NiwxMiBAQAogCWVycm9yID0gZmlsZW1hcF9mZGF0YXdhaXQobWV0YW1hcHBpbmcpOwogICAgICAgICBtYXBwaW5nX3NldF9lcnJvcihtZXRhbWFwcGluZywgZXJyb3IpOwogCWdmczJfYWlsX2VtcHR5X2dsKGdsKTsKKworCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOworCXJnZCA9IGdsLT5nbF9vYmplY3Q7CisJaWYgKHJnZCkKKwkJZ2ZzMl9mcmVlX2Nsb25lcyhyZ2QpOworCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7CiB9CiAKIC8qKgpAQCAtMjc3LDcgKzI5OSw3IEBACiAJCWlmIChubGluayA9PSAwKQogCQkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQllbHNlCi0JCQlpbm9kZS0+aV9ubGluayA9IG5saW5rOworCQkJc2V0X25saW5rKGlub2RlLCBubGluayk7CiAJfQogfQogCkBAIC00MzAsMzMgKzQ1Miw2IEBACiB9CiAKIC8qKgotICogcmdycF9nb19sb2NrIC0gb3BlcmF0aW9uIGRvbmUgYWZ0ZXIgYW4gcmdycCBsb2NrIGlzIGxvY2tlZCBieQotICogICAgYSBmaXJzdCBob2xkZXIgb24gdGhpcyBub2RlLgotICogQGdsOiB0aGUgZ2xvY2sKLSAqIEBmbGFnczoKLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLXN0YXRpYyBpbnQgcmdycF9nb19sb2NrKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpCi17Ci0JcmV0dXJuIGdmczJfcmdycF9iaF9nZXQoZ2gtPmdoX2dsLT5nbF9vYmplY3QpOwotfQotCi0vKioKLSAqIHJncnBfZ29fdW5sb2NrIC0gb3BlcmF0aW9uIGRvbmUgYmVmb3JlIGFuIHJncnAgbG9jayBpcyB1bmxvY2tlZCBieQotICogICAgYSBsYXN0IGhvbGRlciBvbiB0aGlzIG5vZGUuCi0gKiBAZ2w6IHRoZSBnbG9jawotICogQGZsYWdzOgotICoKLSAqLwotCi1zdGF0aWMgdm9pZCByZ3JwX2dvX3VubG9jayhzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoKQotewotCWdmczJfcmdycF9iaF9wdXQoZ2gtPmdoX2dsLT5nbF9vYmplY3QpOwotfQotCi0vKioKICAqIHRyYW5zX2dvX3N5bmMgLSBwcm9tb3RlL2RlbW90ZSB0aGUgdHJhbnNhY3Rpb24gZ2xvY2sKICAqIEBnbDogdGhlIGdsb2NrCiAgKiBAc3RhdGU6IHRoZSByZXF1ZXN0ZWQgc3RhdGUKQEAgLTU1OCw4ICs1NTMsOCBAQAogY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyBnZnMyX3JncnBfZ2xvcHMgPSB7CiAJLmdvX3htb3RlX3RoID0gcmdycF9nb19zeW5jLAogCS5nb19pbnZhbCA9IHJncnBfZ29faW52YWwsCi0JLmdvX2xvY2sgPSByZ3JwX2dvX2xvY2ssCi0JLmdvX3VubG9jayA9IHJncnBfZ29fdW5sb2NrLAorCS5nb19sb2NrID0gZ2ZzMl9yZ3JwX2dvX2xvY2ssCisJLmdvX3VubG9jayA9IGdmczJfcmdycF9nb191bmxvY2ssCiAJLmdvX2R1bXAgPSBnZnMyX3JncnBfZHVtcCwKIAkuZ29fdHlwZSA9IExNX1RZUEVfUkdSUCwKIAkuZ29fZmxhZ3MgPSBHTE9GX0FTUEFDRSwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvcHMuaCBiL2ZzL2dmczIvZ2xvcHMuaAppbmRleCA2ZmNlNDA5Li5iZjk1YTJkIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb3BzLmgKKysrIGIvZnMvZ2ZzMi9nbG9wcy5oCkBAIC0yMyw2ICsyMyw2IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyBnZnMyX2pvdXJuYWxfZ2xvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyAqZ2ZzMl9nbG9wc19saXN0W107CiAKLWV4dGVybiB2b2lkIGdmczJfYWlsX2ZsdXNoKHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CitleHRlcm4gdm9pZCBnZnMyX2FpbF9mbHVzaChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGJvb2wgZnN5bmMpOwogCiAjZW5kaWYgLyogX19HTE9QU19ET1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy9nZnMyL2luY29yZS5oIGIvZnMvZ2ZzMi9pbmNvcmUuaAppbmRleCA4OTJhYzM3Li43Mzg5ZGZkIDEwMDY0NAotLS0gYS9mcy9nZnMyL2luY29yZS5oCisrKyBiL2ZzL2dmczIvaW5jb3JlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3RfYmwuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAKICNkZWZpbmUgRElPX1dBSVQJMHgwMDAwMDAxMAogI2RlZmluZSBESU9fTUVUQURBVEEJMHgwMDAwMDAyMApAQCAtNzgsOCArNzksNyBAQAogfTsKIAogc3RydWN0IGdmczJfcmdycGQgewotCXN0cnVjdCBsaXN0X2hlYWQgcmRfbGlzdDsJLyogTGluayB3aXRoIHN1cGVyYmxvY2sgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHJkX2xpc3RfbXJ1OworCXN0cnVjdCByYl9ub2RlIHJkX25vZGU7CQkvKiBMaW5rIHdpdGggc3VwZXJibG9jayAqLwogCXN0cnVjdCBnZnMyX2dsb2NrICpyZF9nbDsJLyogR2xvY2sgZm9yIHRoaXMgcmdycCAqLwogCXU2NCByZF9hZGRyOwkJCS8qIGdycCBibG9jayBkaXNrIGFkZHJlc3MgKi8KIAl1NjQgcmRfZGF0YTA7CQkJLyogZmlyc3QgZGF0YSBsb2NhdGlvbiAqLwpAQCAtOTEsMTAgKzkxLDcgQEAKIAl1MzIgcmRfZGlub2RlczsKIAl1NjQgcmRfaWdlbmVyYXRpb247CiAJc3RydWN0IGdmczJfYml0bWFwICpyZF9iaXRzOwotCXN0cnVjdCBtdXRleCByZF9tdXRleDsKLQlzdHJ1Y3QgZ2ZzMl9sb2dfZWxlbWVudCByZF9sZTsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnJkX3NiZDsKLQl1bnNpZ25lZCBpbnQgcmRfYmhfY291bnQ7CiAJdTMyIHJkX2xhc3RfYWxsb2M7CiAJdTMyIHJkX2ZsYWdzOwogI2RlZmluZSBHRlMyX1JERl9DSEVDSwkJMHgxMDAwMDAwMCAvKiBjaGVjayBmb3IgdW5saW5rZWQgaW5vZGVzICovCkBAIC0xMDYsMTIgKzEwMywxNSBAQAogZW51bSBnZnMyX3N0YXRlX2JpdHMgewogCUJIX1Bpbm5lZCA9IEJIX1ByaXZhdGVTdGFydCwKIAlCSF9Fc2NhcGVkID0gQkhfUHJpdmF0ZVN0YXJ0ICsgMSwKKwlCSF9aZXJvbmV3ID0gQkhfUHJpdmF0ZVN0YXJ0ICsgMiwKIH07CiAKIEJVRkZFUl9GTlMoUGlubmVkLCBwaW5uZWQpCiBUQVNfQlVGRkVSX0ZOUyhQaW5uZWQsIHBpbm5lZCkKIEJVRkZFUl9GTlMoRXNjYXBlZCwgZXNjYXBlZCkKIFRBU19CVUZGRVJfRk5TKEVzY2FwZWQsIGVzY2FwZWQpCitCVUZGRVJfRk5TKFplcm9uZXcsIHplcm9uZXcpCitUQVNfQlVGRkVSX0ZOUyhaZXJvbmV3LCB6ZXJvbmV3KQogCiBzdHJ1Y3QgZ2ZzMl9idWZkYXRhIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJkX2JoOwpAQCAtMjQ2LDcgKzI0Niw2IEBACiAKIHN0cnVjdCBnZnMyX2FsbG9jIHsKIAkvKiBRdW90YSBzdHVmZiAqLwotCiAJc3RydWN0IGdmczJfcXVvdGFfZGF0YSAqYWxfcWRbMipNQVhRVU9UQVNdOwogCXN0cnVjdCBnZnMyX2hvbGRlciBhbF9xZF9naHNbMipNQVhRVU9UQVNdOwogCXVuc2lnbmVkIGludCBhbF9xZF9udW07CkBAIC0yNTUsMTggKzI1NCwxMyBAQAogCXUzMiBhbF9hbGxvY2VkOyAvKiBGaWxsZWQgaW4gYnkgZ2ZzMl9hbGxvY18qKCkgKi8KIAogCS8qIEZpbGxlZCBpbiBieSBnZnMyX2lucGxhY2VfcmVzZXJ2ZSgpICovCi0KLQl1bnNpZ25lZCBpbnQgYWxfbGluZTsKLQljaGFyICphbF9maWxlOwotCXN0cnVjdCBnZnMyX2hvbGRlciBhbF9yaV9naDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgYWxfcmdkX2doOwotCXN0cnVjdCBnZnMyX3JncnBkICphbF9yZ2Q7Ci0KIH07CiAKIGVudW0gewogCUdJRl9JTlZBTElECQk9IDAsCiAJR0lGX1FEX0xPQ0tFRAkJPSAxLAorCUdJRl9BTExPQ19GQUlMRUQJPSAyLAogCUdJRl9TV19QQUdFRAkJPSAzLAogfTsKIApAQCAtMjgyLDYgKzI3Niw3IEBACiAJc3RydWN0IGdmczJfaG9sZGVyIGlfaW9wZW5fZ2g7CiAJc3RydWN0IGdmczJfaG9sZGVyIGlfZ2g7IC8qIGZvciBwcmVwYXJlL2NvbW1pdF93cml0ZSBvbmx5ICovCiAJc3RydWN0IGdmczJfYWxsb2MgKmlfYWxsb2M7CisJc3RydWN0IGdmczJfcmdycGQgKmlfcmdkOwogCXU2NCBpX2dvYWw7CS8qIGdvYWwgYmxvY2sgZm9yIGFsbG9jYXRpb25zICovCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBpX3J3X211dGV4OwogCXN0cnVjdCBsaXN0X2hlYWQgaV90cnVuY19saXN0OwpAQCAtNTc0LDkgKzU2OSw3IEBACiAJaW50IHNkX3JpbmRleF91cHRvZGF0ZTsKIAlzcGlubG9ja190IHNkX3JpbmRleF9zcGluOwogCXN0cnVjdCBtdXRleCBzZF9yaW5kZXhfbXV0ZXg7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzZF9yaW5kZXhfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHNkX3JpbmRleF9tcnVfbGlzdDsKLQlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqc2RfcmluZGV4X2ZvcndhcmQ7CisJc3RydWN0IHJiX3Jvb3Qgc2RfcmluZGV4X3RyZWU7CiAJdW5zaWduZWQgaW50IHNkX3JncnBzOwogCXVuc2lnbmVkIGludCBzZF9tYXhfcmdfZGF0YTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbm9kZS5jIGIvZnMvZ2ZzMi9pbm9kZS5jCmluZGV4IDY1MjViODAuLmNmZDQ5NTkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5vZGUuYworKysgYi9mcy9nZnMyL2lub2RlLmMKQEAgLTU4Myw3ICs1ODMsNyBAQAogCQkJZ290byBmYWlsX3F1b3RhX2xvY2tzOwogCiAJCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIHNkcC0+c2RfbWF4X2RpcnJlcyArCi0JCQkJCSBhbC0+YWxfcmdkLT5yZF9sZW5ndGggKworCQkJCQkgZGlwLT5pX3JnZC0+cmRfbGVuZ3RoICsKIAkJCQkJIDIgKiBSRVNfRElOT0RFICsKIAkJCQkJIFJFU19TVEFURlMgKyBSRVNfUVVPVEEsIDApOwogCQlpZiAoZXJyb3IpCkBAIC02MTMsOCArNjEzLDcgQEAKIAlnZnMyX3RyYW5zX2VuZChzZHApOwogCiBmYWlsX2lwcmVzZXJ2OgotCWlmIChkaXAtPmlfYWxsb2MtPmFsX3JnZCkKLQkJZ2ZzMl9pbnBsYWNlX3JlbGVhc2UoZGlwKTsKKwlnZnMyX2lucGxhY2VfcmVsZWFzZShkaXApOwogCiBmYWlsX3F1b3RhX2xvY2tzOgogCWdmczJfcXVvdGFfdW5sb2NrKGRpcCk7CkBAIC02NjEsNyArNjYwLDcgQEAKIAogc3RhdGljIGludCBnZnMyX2NyZWF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJICAgICB1bnNpZ25lZCBpbnQgbW9kZSwgZGV2X3QgZGV2LCBjb25zdCBjaGFyICpzeW1uYW1lLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKKwkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsIGludCBleGNsKQogewogCWNvbnN0IHN0cnVjdCBxc3RyICpuYW1lID0gJmRlbnRyeS0+ZF9uYW1lOwogCXN0cnVjdCBnZnMyX2hvbGRlciBnaHNbMl07CkBAIC02ODEsNiArNjgwLDEyIEBACiAJCWdvdG8gZmFpbDsKIAogCWVycm9yID0gY3JlYXRlX29rKGRpcCwgbmFtZSwgbW9kZSk7CisJaWYgKChlcnJvciA9PSAtRUVYSVNUKSAmJiBTX0lTUkVHKG1vZGUpICYmICFleGNsKSB7CisJCWlub2RlID0gZ2ZzMl9sb29rdXBpKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAwKTsKKwkJZ2ZzMl9nbG9ja19kcV91bmluaXQoZ2hzKTsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwkJcmV0dXJuIElTX0VSUihpbm9kZSkgPyBQVFJfRVJSKGlub2RlKSA6IDA7CisJfQogCWlmIChlcnJvcikKIAkJZ290byBmYWlsX2d1bmxvY2s7CiAKQEAgLTcyMywyMSArNzI4LDIyIEBACiAJCWJyZWxzZShiaCk7CiAKIAlnZnMyX3RyYW5zX2VuZChzZHApOwotCWlmIChkaXAtPmlfYWxsb2MtPmFsX3JnZCkKLQkJZ2ZzMl9pbnBsYWNlX3JlbGVhc2UoZGlwKTsKKwlnZnMyX2lucGxhY2VfcmVsZWFzZShkaXApOwogCWdmczJfcXVvdGFfdW5sb2NrKGRpcCk7CiAJZ2ZzMl9hbGxvY19wdXQoZGlwKTsKLQlnZnMyX2dsb2NrX2RxX3VuaW5pdF9tKDIsIGdocyk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJZ2ZzMl9nbG9ja19kcV91bmluaXRfbSgyLCBnaHMpOwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIDA7CiAKIGZhaWxfZ3VubG9jazI6CiAJZ2ZzMl9nbG9ja19kcV91bmluaXQoZ2hzICsgMSk7Ci0JaWYgKGlub2RlICYmICFJU19FUlIoaW5vZGUpKQotCQlpcHV0KGlub2RlKTsKIGZhaWxfZ3VubG9jazoKIAlnZnMyX2dsb2NrX2RxX3VuaW5pdChnaHMpOworCWlmIChpbm9kZSAmJiAhSVNfRVJSKGlub2RlKSkgeworCQlzZXRfYml0KEdJRl9BTExPQ19GQUlMRUQsICZHRlMyX0koaW5vZGUpLT5pX2ZsYWdzKTsKKwkJaXB1dChpbm9kZSk7CisJfQogZmFpbDoKIAlpZiAoYmgpCiAJCWJyZWxzZShiaCk7CkBAIC03NTYsMjQgKzc2MiwxMCBAQAogc3RhdGljIGludCBnZnMyX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkgICAgICAgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0JaW50IHJldDsKLQotCWZvciAoOzspIHsKLQkJcmV0ID0gZ2ZzMl9jcmVhdGVfaW5vZGUoZGlyLCBkZW50cnksIFNfSUZSRUcgfCBtb2RlLCAwLCBOVUxMLCAwKTsKLQkJaWYgKHJldCAhPSAtRUVYSVNUIHx8IChuZCAmJiAobmQtPmZsYWdzICYgTE9PS1VQX0VYQ0wpKSkKLQkJCXJldHVybiByZXQ7Ci0KLQkJaW5vZGUgPSBnZnMyX2xvb2t1cGkoZGlyLCAmZGVudHJ5LT5kX25hbWUsIDApOwotCQlpZiAoaW5vZGUpIHsKLQkJCWlmICghSVNfRVJSKGlub2RlKSkKLQkJCQlicmVhazsKLQkJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKLQkJfQotCX0KLQotCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JcmV0dXJuIDA7CisJaW50IGV4Y2wgPSAwOworCWlmIChuZCAmJiAobmQtPmZsYWdzICYgTE9PS1VQX0VYQ0wpKQorCQlleGNsID0gMTsKKwlyZXR1cm4gZ2ZzMl9jcmVhdGVfaW5vZGUoZGlyLCBkZW50cnksIFNfSUZSRUcgfCBtb2RlLCAwLCBOVUxMLCAwLCBleGNsKTsKIH0KIAogLyoqCkBAIC05MDAsNyArODkyLDcgQEAKIAkJCWdvdG8gb3V0X2d1bmxvY2tfcTsKIAogCQllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCBzZHAtPnNkX21heF9kaXJyZXMgKwotCQkJCQkgZ2ZzMl9yZ19ibG9ja3MoYWwpICsKKwkJCQkJIGdmczJfcmdfYmxvY2tzKGRpcCkgKwogCQkJCQkgMiAqIFJFU19ESU5PREUgKyBSRVNfU1RBVEZTICsKIAkJCQkJIFJFU19RVU9UQSwgMCk7CiAJCWlmIChlcnJvcikKQEAgLTkyMiw4ICs5MTQsOSBAQAogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKIAlpbmNfbmxpbmsoJmlwLT5pX2lub2RlKTsKIAlpcC0+aV9pbm9kZS5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKLQltYXJrX2lub2RlX2RpcnR5KCZpcC0+aV9pbm9kZSk7CisJaWhvbGQoaW5vZGUpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAKIG91dF9icmVsc2U6CiAJYnJlbHNlKGRpYmgpOwpAQCAtOTQ1LDExICs5MzgsNiBAQAogb3V0X3BhcmVudDoKIAlnZnMyX2hvbGRlcl91bmluaXQoZ2hzKTsKIAlnZnMyX2hvbGRlcl91bmluaXQoZ2hzICsgMSk7Ci0JaWYgKCFlcnJvcikgewotCQlpaG9sZChpbm9kZSk7Ci0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTEwMjIsOCArMTAxMCw2IEBACiAJCWNsZWFyX25saW5rKGlub2RlKTsKIAllbHNlCiAJCWRyb3BfbmxpbmsoaW5vZGUpOwotCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBiaCwgMSk7Ci0JZ2ZzMl9kaW5vZGVfb3V0KGlwLCBiaC0+Yl9kYXRhKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkKIAkJZ2ZzMl91bmxpbmtfZGkoaW5vZGUpOwpAQCAtMTA1MSwxMyArMTAzNyw4IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2hzWzNdOwogCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0Jc3RydWN0IGdmczJfaG9sZGVyIHJpX2doOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChzZHAsICZyaV9naCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KIAlnZnMyX2hvbGRlcl9pbml0KGRpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCBnaHMpOwogCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsICBMTV9TVF9FWENMVVNJVkUsIDAsIGdocyArIDEpOwogCkBAIC0xMTE0LDcgKzEwOTUsNiBAQAogCWdmczJfZ2xvY2tfZHEoZ2hzKTsKIG91dF9wYXJlbnQ6CiAJZ2ZzMl9ob2xkZXJfdW5pbml0KGdocyk7Ci0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTExMzcsNyArMTExNyw3IEBACiAJaWYgKHNpemUgPiBzZHAtPnNkX3NiLnNiX2JzaXplIC0gc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkgLSAxKQogCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKIAotCXJldHVybiBnZnMyX2NyZWF0ZV9pbm9kZShkaXIsIGRlbnRyeSwgU19JRkxOSyB8IFNfSVJXWFVHTywgMCwgc3ltbmFtZSwgc2l6ZSk7CisJcmV0dXJuIGdmczJfY3JlYXRlX2lub2RlKGRpciwgZGVudHJ5LCBTX0lGTE5LIHwgU19JUldYVUdPLCAwLCBzeW1uYW1lLCBzaXplLCAwKTsKIH0KIAogLyoqCkBAIC0xMTUxLDcgKzExMzEsNyBAQAogCiBzdGF0aWMgaW50IGdmczJfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCiB7Ci0JcmV0dXJuIGdmczJfY3JlYXRlX2lub2RlKGRpciwgZGVudHJ5LCBTX0lGRElSIHwgbW9kZSwgMCwgTlVMTCwgMCk7CisJcmV0dXJuIGdmczJfY3JlYXRlX2lub2RlKGRpciwgZGVudHJ5LCBTX0lGRElSIHwgbW9kZSwgMCwgTlVMTCwgMCwgMCk7CiB9CiAKIC8qKgpAQCAtMTE2Niw3ICsxMTQ2LDcgQEAKIHN0YXRpYyBpbnQgZ2ZzMl9ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKIAkJICAgICAgZGV2X3QgZGV2KQogewotCXJldHVybiBnZnMyX2NyZWF0ZV9pbm9kZShkaXIsIGRlbnRyeSwgbW9kZSwgZGV2LCBOVUxMLCAwKTsKKwlyZXR1cm4gZ2ZzMl9jcmVhdGVfaW5vZGUoZGlyLCBkZW50cnksIG1vZGUsIGRldiwgTlVMTCwgMCwgMCk7CiB9CiAKIC8qCkBAIC0xMjMyLDcgKzEyMTIsNyBAQAogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShvZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqbmlwID0gTlVMTDsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0Iob2Rpcik7Ci0Jc3RydWN0IGdmczJfaG9sZGVyIGdoc1s1XSwgcl9naCA9IHsgLmdoX2dsID0gTlVMTCwgfSwgcmlfZ2g7CisJc3RydWN0IGdmczJfaG9sZGVyIGdoc1s1XSwgcl9naCA9IHsgLmdoX2dsID0gTlVMTCwgfTsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqbnJnZDsKIAl1bnNpZ25lZCBpbnQgbnVtX2doOwogCWludCBkaXJfcmVuYW1lID0gMDsKQEAgLTEyNDYsMTAgKzEyMjYsNiBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJnJpX2doKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQogCWlmIChvZGlwICE9IG5kaXApIHsKIAkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF9yZW5hbWVfZ2wsIExNX1NUX0VYQ0xVU0lWRSwKIAkJCQkJICAgMCwgJnJfZ2gpOwpAQCAtMTM4NiwxMiArMTM2MiwxMiBAQAogCiAJCWFsLT5hbF9yZXF1ZXN0ZWQgPSBzZHAtPnNkX21heF9kaXJyZXM7CiAKLQkJZXJyb3IgPSBnZnMyX2lucGxhY2VfcmVzZXJ2ZV9yaShuZGlwKTsKKwkJZXJyb3IgPSBnZnMyX2lucGxhY2VfcmVzZXJ2ZShuZGlwKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfZ3VubG9ja19xOwogCiAJCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIHNkcC0+c2RfbWF4X2RpcnJlcyArCi0JCQkJCSBnZnMyX3JnX2Jsb2NrcyhhbCkgKworCQkJCQkgZ2ZzMl9yZ19ibG9ja3MobmRpcCkgKwogCQkJCQkgNCAqIFJFU19ESU5PREUgKyA0ICogUkVTX0xFQUYgKwogCQkJCQkgUkVTX1NUQVRGUyArIFJFU19RVU9UQSArIDQsIDApOwogCQlpZiAoZXJyb3IpCkBAIC0xNDU3LDcgKzE0MzMsNiBAQAogCWlmIChyX2doLmdoX2dsKQogCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmcl9naCk7CiBvdXQ6Ci0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE1NjEsMjEgKzE1MzYsMTAgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgX19nZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGlhdHRyICphdHRyKQorc3RhdGljIGludCBfX2dmczJfc2V0YXR0cl9zaW1wbGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRyKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmaXAtPmlfaW5vZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOwotCWludCBlcnJvcjsKLQotCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCiAJc2V0YXR0cl9jb3B5KGlub2RlLCBhdHRyKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7Ci0JZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwotCWJyZWxzZShkaWJoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4NywxOSArMTU1MSwxOSBAQAogICogUmV0dXJuczogZXJybm8KICAqLwogCi1pbnQgZ2ZzMl9zZXRhdHRyX3NpbXBsZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBpYXR0ciAqYXR0cikKK2ludCBnZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cikKIHsKIAlpbnQgZXJyb3I7CiAKIAlpZiAoY3VycmVudC0+am91cm5hbF9pbmZvKQotCQlyZXR1cm4gX19nZnMyX3NldGF0dHJfc2ltcGxlKGlwLCBhdHRyKTsKKwkJcmV0dXJuIF9fZ2ZzMl9zZXRhdHRyX3NpbXBsZShpbm9kZSwgYXR0cik7CiAKLQllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oR0ZTMl9TQigmaXAtPmlfaW5vZGUpLCBSRVNfRElOT0RFLCAwKTsKKwllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oR0ZTMl9TQihpbm9kZSksIFJFU19ESU5PREUsIDApOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JZXJyb3IgPSBfX2dmczJfc2V0YXR0cl9zaW1wbGUoaXAsIGF0dHIpOwotCWdmczJfdHJhbnNfZW5kKEdGUzJfU0IoJmlwLT5pX2lub2RlKSk7CisJZXJyb3IgPSBfX2dmczJfc2V0YXR0cl9zaW1wbGUoaW5vZGUsIGF0dHIpOworCWdmczJfdHJhbnNfZW5kKEdGUzJfU0IoaW5vZGUpKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE2MzcsNyArMTYwMSw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9ndW5sb2NrX3E7CiAKLQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaXAsIGF0dHIpOworCWVycm9yID0gZ2ZzMl9zZXRhdHRyX3NpbXBsZShpbm9kZSwgYXR0cik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9lbmRfdHJhbnM7CiAKQEAgLTE2OTMsMTIgKzE2NTcsMTIgQEAKIAllbHNlIGlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpICYmIElTX1BPU0lYQUNMKGlub2RlKSkKIAkJZXJyb3IgPSBnZnMyX2FjbF9jaG1vZChpcCwgYXR0cik7CiAJZWxzZQotCQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaXAsIGF0dHIpOworCQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaW5vZGUsIGF0dHIpOwogCiBvdXQ6Ci0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJmlfZ2gpOwogCWlmICghZXJyb3IpCiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZpX2doKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5vZGUuaCBiL2ZzL2dmczIvaW5vZGUuaAppbmRleCA4ZDkwZTBjLi4yNzZlN2I1IDEwMDY0NAotLS0gYS9mcy9nZnMyL2lub2RlLmgKKysrIGIvZnMvZ2ZzMi9pbm9kZS5oCkBAIC0xMDksNyArMTA5LDcgQEAKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKmdmczJfbG9va3VwaShzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCiAJCQkJICBpbnQgaXNfcm9vdCk7CiBleHRlcm4gaW50IGdmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7Ci1leHRlcm4gaW50IGdmczJfc2V0YXR0cl9zaW1wbGUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOworZXh0ZXJuIGludCBnZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cik7CiBleHRlcm4gc3RydWN0IGlub2RlICpnZnMyX2xvb2t1cF9zaW1wbGUoc3RydWN0IGlub2RlICpkaXAsIGNvbnN0IGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQgZ2ZzMl9kaW5vZGVfb3V0KGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCwgdm9pZCAqYnVmKTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9sb3BzLmMgYi9mcy9nZnMyL2xvcHMuYwppbmRleCAwNWJiYjEyLi4wMzAxYmU2IDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvcHMuYworKysgYi9mcy9nZnMyL2xvcHMuYwpAQCAtNjAsNiArNjAsMjkgQEAKIAl0cmFjZV9nZnMyX3BpbihiZCwgMSk7CiB9CiAKK3N0YXRpYyBib29sIGJ1ZmZlcl9pc19yZ3JwKGNvbnN0IHN0cnVjdCBnZnMyX2J1ZmRhdGEgKmJkKQoreworCXJldHVybiBiZC0+YmRfZ2wtPmdsX25hbWUubG5fdHlwZSA9PSBMTV9UWVBFX1JHUlA7Cit9CisKK3N0YXRpYyB2b2lkIG1heWJlX3JlbGVhc2Vfc3BhY2Uoc3RydWN0IGdmczJfYnVmZGF0YSAqYmQpCit7CisJc3RydWN0IGdmczJfZ2xvY2sgKmdsID0gYmQtPmJkX2dsOworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKKwlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkID0gZ2wtPmdsX29iamVjdDsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSBiZC0+YmRfYmgtPmJfYmxvY2tuciAtIGdsLT5nbF9uYW1lLmxuX251bWJlcjsKKwlzdHJ1Y3QgZ2ZzMl9iaXRtYXAgKmJpID0gcmdkLT5yZF9iaXRzICsgaW5kZXg7CisKKwlpZiAoYmktPmJpX2Nsb25lID09IDApCisJCXJldHVybjsKKwlpZiAoc2RwLT5zZF9hcmdzLmFyX2Rpc2NhcmQpCisJCWdmczJfcmdycF9zZW5kX2Rpc2NhcmRzKHNkcCwgcmdkLT5yZF9kYXRhMCwgYmQtPmJkX2JoLCBiaSk7CisJbWVtY3B5KGJpLT5iaV9jbG9uZSArIGJpLT5iaV9vZmZzZXQsCisJICAgICAgIGJkLT5iZF9iaC0+Yl9kYXRhICsgYmktPmJpX29mZnNldCwgYmktPmJpX2xlbik7CisJY2xlYXJfYml0KEdCRl9GVUxMLCAmYmktPmJpX2ZsYWdzKTsKKwlyZ2QtPnJkX2ZyZWVfY2xvbmUgPSByZ2QtPnJkX2ZyZWU7Cit9CisKIC8qKgogICogZ2ZzMl91bnBpbiAtIFVucGluIGEgYnVmZmVyCiAgKiBAc2RwOiB0aGUgZmlsZXN5c3RlbSB0aGUgYnVmZmVyIGJlbG9uZ3MgdG8KQEAgLTgxLDYgKzEwNCw5IEBACiAJbWFya19idWZmZXJfZGlydHkoYmgpOwogCWNsZWFyX2J1ZmZlcl9waW5uZWQoYmgpOwogCisJaWYgKGJ1ZmZlcl9pc19yZ3JwKGJkKSkKKwkJbWF5YmVfcmVsZWFzZV9zcGFjZShiZCk7CisKIAlzcGluX2xvY2soJnNkcC0+c2RfYWlsX2xvY2spOwogCWlmIChiZC0+YmRfYWlsKSB7CiAJCWxpc3RfZGVsKCZiZC0+YmRfYWlsX3N0X2xpc3QpOwpAQCAtNDY5LDQyICs0OTUsNiBAQAogCWdmczJfcmV2b2tlX2NsZWFuKHNkcCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJnX2xvX2FkZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfbG9nX2VsZW1lbnQgKmxlKQotewotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0Jc3RydWN0IGdmczJfdHJhbnMgKnRyID0gY3VycmVudC0+am91cm5hbF9pbmZvOwotCi0JdHItPnRyX3RvdWNoZWQgPSAxOwotCi0JcmdkID0gY29udGFpbmVyX29mKGxlLCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbGUpOwotCi0JZ2ZzMl9sb2dfbG9jayhzZHApOwotCWlmICghbGlzdF9lbXB0eSgmbGUtPmxlX2xpc3QpKXsKLQkJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7Ci0JCXJldHVybjsKLQl9Ci0JZ2ZzMl9yZ3JwX2JoX2hvbGQocmdkKTsKLQlzZHAtPnNkX2xvZ19udW1fcmcrKzsKLQlsaXN0X2FkZCgmbGUtPmxlX2xpc3QsICZzZHAtPnNkX2xvZ19sZV9yZyk7Ci0JZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJnX2xvX2FmdGVyX2NvbW1pdChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfYWlsICphaSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJnNkcC0+c2RfbG9nX2xlX3JnOwotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJcmdkID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbGUubGVfbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJnZC0+cmRfbGUubGVfbGlzdCk7Ci0JCXNkcC0+c2RfbG9nX251bV9yZy0tOwotCi0JCWdmczJfcmdycF9yZXBvbGlzaF9jbG9uZXMocmdkKTsKLQkJZ2ZzMl9yZ3JwX2JoX3B1dChyZ2QpOwotCX0KLQlnZnMyX2Fzc2VydF93YXJuKHNkcCwgIXNkcC0+c2RfbG9nX251bV9yZyk7Ci19Ci0KIC8qKgogICogZGF0YWJ1Zl9sb19hZGQgLSBBZGQgYSBkYXRhYnVmIHRvIHRoZSB0cmFuc2FjdGlvbi4KICAqCkBAIC03MDUsOCArNjk1LDYgQEAKIAogCQlicmVsc2UoYmhfbG9nKTsKIAkJYnJlbHNlKGJoX2lwKTsKLQkJaWYgKGVycm9yKQotCQkJYnJlYWs7CiAKIAkJc2RwLT5zZF9yZXBsYXllZF9ibG9ja3MrKzsKIAl9CkBAIC03NzEsOCArNzU5LDYgQEAKIH07CiAKIGNvbnN0IHN0cnVjdCBnZnMyX2xvZ19vcGVyYXRpb25zIGdmczJfcmdfbG9wcyA9IHsKLQkubG9fYWRkID0gcmdfbG9fYWRkLAotCS5sb19hZnRlcl9jb21taXQgPSByZ19sb19hZnRlcl9jb21taXQsCiAJLmxvX25hbWUgPSAicmciLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuYwppbmRleCAwNzk1ODdlLi5jYjIzYzJiIDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19mc3R5cGUuYworKysgYi9mcy9nZnMyL29wc19mc3R5cGUuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgpAQCAtNzcsOCArNzgsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2RfcmluZGV4X3NwaW4pOwogCW11dGV4X2luaXQoJnNkcC0+c2RfcmluZGV4X211dGV4KTsKLQlJTklUX0xJU1RfSEVBRCgmc2RwLT5zZF9yaW5kZXhfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNkcC0+c2RfcmluZGV4X21ydV9saXN0KTsKKwlzZHAtPnNkX3JpbmRleF90cmVlLnJiX25vZGUgPSBOVUxMOwogCiAJSU5JVF9MSVNUX0hFQUQoJnNkcC0+c2RfamluZGV4X2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZzZHAtPnNkX2ppbmRleF9zcGluKTsKQEAgLTY1Miw3ICs2NTIsNiBAQAogCQlmc19lcnIoc2RwLCAiY2FuJ3QgbG9va3VwIGpvdXJuYWwgaW5kZXg6ICVkXG4iLCBlcnJvcik7CiAJCXJldHVybiBQVFJfRVJSKHNkcC0+c2RfamluZGV4KTsKIAl9Ci0JaXAgPSBHRlMyX0koc2RwLT5zZF9qaW5kZXgpOwogCiAJLyogTG9hZCBpbiB0aGUgam91cm5hbCBpbmRleCBzcGVjaWFsIGZpbGUgKi8KIApAQCAtNzY0LDcgKzc2Myw2IEBACiBzdGF0aWMgaW50IGluaXRfaW5vZGVzKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgdW5kbykKIHsKIAlpbnQgZXJyb3IgPSAwOwotCXN0cnVjdCBnZnMyX2lub2RlICppcDsKIAlzdHJ1Y3QgaW5vZGUgKm1hc3RlciA9IHNkcC0+c2RfbWFzdGVyX2Rpci0+ZF9pbm9kZTsKIAogCWlmICh1bmRvKQpAQCAtNzg5LDcgKzc4Nyw2IEBACiAJCWZzX2VycihzZHAsICJjYW4ndCBnZXQgcmVzb3VyY2UgaW5kZXggaW5vZGU6ICVkXG4iLCBlcnJvcik7CiAJCWdvdG8gZmFpbF9zdGF0ZnM7CiAJfQotCWlwID0gR0ZTMl9JKHNkcC0+c2RfcmluZGV4KTsKIAlzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSA9IDA7CiAKIAkvKiBSZWFkIGluIHRoZSBxdW90YSBpbm9kZSAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9xdW90YS5jIGIvZnMvZ2ZzMi9xdW90YS5jCmluZGV4IDBlOGJiMTMuLjdlNTI4ZGMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcXVvdGEuYworKysgYi9mcy9nZnMyL3F1b3RhLmMKQEAgLTYzOCwxNSArNjM4LDE4IEBACiAJdW5zaWduZWQgbG9uZyBpbmRleCA9IGxvYyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXVuc2lnbmVkIG9mZnNldCA9IGxvYyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKIAl1bnNpZ25lZCBibG9ja3NpemUsIGlibG9jaywgcG9zOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpkaWJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdm9pZCAqa2FkZHIsICpwdHI7CiAJc3RydWN0IGdmczJfcXVvdGEgcSwgKnFwOwogCWludCBlcnIsIG5ieXRlczsKIAl1NjQgc2l6ZTsKIAotCWlmIChnZnMyX2lzX3N0dWZmZWQoaXApKQotCQlnZnMyX3Vuc3R1ZmZfZGlub2RlKGlwLCBOVUxMKTsKKwlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkgeworCQllcnIgPSBnZnMyX3Vuc3R1ZmZfZGlub2RlKGlwLCBOVUxMKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQogCiAJbWVtc2V0KCZxLCAwLCBzaXplb2Yoc3RydWN0IGdmczJfcXVvdGEpKTsKIAllcnIgPSBnZnMyX2ludGVybmFsX3JlYWQoaXAsIE5VTEwsIChjaGFyICopJnEsICZsb2MsIHNpemVvZihxKSk7CkBAIC03MzYsMjIgKzczOSwxMyBAQAogCQlnb3RvIGdldF9hX3BhZ2U7CiAJfQogCi0JLyogVXBkYXRlIHRoZSBkaXNrIGlub2RlIHRpbWVzdGFtcCBhbmQgc2l6ZSAoaWYgZXh0ZW5kZWQpICovCi0JZXJyID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCiAJc2l6ZSA9IGxvYyArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9xdW90YSk7CiAJaWYgKHNpemUgPiBpbm9kZS0+aV9zaXplKQogCQlpX3NpemVfd3JpdGUoaW5vZGUsIHNpemUpOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwotCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKLQlicmVsc2UoZGliaCk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0KLW91dDoKIAlyZXR1cm4gZXJyOworCiB1bmxvY2tfb3V0OgogCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKQEAgLTgyMiw3ICs4MTYsNyBAQAogCQlnb3RvIG91dF9hbGxvYzsKIAogCWlmIChuYWxsb2MpCi0JCWJsb2NrcyArPSBnZnMyX3JnX2Jsb2NrcyhhbCkgKyBuYWxsb2MgKiBpbmRfYmxvY2tzICsgUkVTX1NUQVRGUzsKKwkJYmxvY2tzICs9IGdmczJfcmdfYmxvY2tzKGlwKSArIG5hbGxvYyAqIGluZF9ibG9ja3MgKyBSRVNfU1RBVEZTOwogCiAJZXJyb3IgPSBnZnMyX3RyYW5zX2JlZ2luKHNkcCwgYmxvY2tzLCAwKTsKIAlpZiAoZXJyb3IpCkBAIC05MzYsNyArOTMwLDkgQEAKIAl1bnNpZ25lZCBpbnQgeDsKIAlpbnQgZXJyb3IgPSAwOwogCi0JZ2ZzMl9xdW90YV9ob2xkKGlwLCB1aWQsIGdpZCk7CisJZXJyb3IgPSBnZnMyX3F1b3RhX2hvbGQoaXAsIHVpZCwgZ2lkKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAogCWlmIChjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpIHx8CiAJICAgIHNkcC0+c2RfYXJncy5hcl9xdW90YSAhPSBHRlMyX1FVT1RBX09OKQpAQCAtMTYwNyw3ICsxNjAzLDcgQEAKIAkJZXJyb3IgPSBnZnMyX2lucGxhY2VfcmVzZXJ2ZShpcCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2FsbG9jOwotCQlibG9ja3MgKz0gZ2ZzMl9yZ19ibG9ja3MoYWwpOworCQlibG9ja3MgKz0gZ2ZzMl9yZ19ibG9ja3MoaXApOwogCX0KIAogCS8qIFNvbWUgcXVvdGFzIHNwYW4gYmxvY2sgYm91bmRhcmllcyBhbmQgY2FuIHVwZGF0ZSB0d28gYmxvY2tzLApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9yZ3JwLmMgYi9mcy9nZnMyL3JncnAuYwppbmRleCA3ZjhhZjFlLi45NmJkNmQ3NSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9yZ3JwLmMKKysrIGIvZnMvZ2ZzMi9yZ3JwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAKICNpbmNsdWRlICJnZnMyLmgiCiAjaW5jbHVkZSAiaW5jb3JlLmgiCkBAIC0zMjgsMTggKzMyOSwyMiBAQAogCiBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqZ2ZzMl9ibGsycmdycGQoc3RydWN0IGdmczJfc2JkICpzZHAsIHU2NCBibGspCiB7Ci0Jc3RydWN0IGdmczJfcmdycGQgKnJnZDsKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ld247CisJc3RydWN0IGdmczJfcmdycGQgKmN1cjsKIAogCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJnZCwgJnNkcC0+c2RfcmluZGV4X21ydV9saXN0LCByZF9saXN0X21ydSkgewotCQlpZiAocmdycF9jb250YWluc19ibG9jayhyZ2QsIGJsaykpIHsKLQkJCWxpc3RfbW92ZSgmcmdkLT5yZF9saXN0X21ydSwgJnNkcC0+c2RfcmluZGV4X21ydV9saXN0KTsKKwluZXduID0gJnNkcC0+c2RfcmluZGV4X3RyZWUucmJfbm9kZTsKKwl3aGlsZSAoKm5ld24pIHsKKwkJY3VyID0gcmJfZW50cnkoKm5ld24sIHN0cnVjdCBnZnMyX3JncnBkLCByZF9ub2RlKTsKKwkJaWYgKGJsayA8IGN1ci0+cmRfYWRkcikKKwkJCW5ld24gPSAmKCgqbmV3biktPnJiX2xlZnQpOworCQllbHNlIGlmIChibGsgPj0gY3VyLT5yZF9kYXRhMCArIGN1ci0+cmRfZGF0YSkKKwkJCW5ld24gPSAmKCgqbmV3biktPnJiX3JpZ2h0KTsKKwkJZWxzZSB7CiAJCQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0JCQlyZXR1cm4gcmdkOworCQkJcmV0dXJuIGN1cjsKIAkJfQogCX0KLQogCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKIAogCXJldHVybiBOVUxMOwpAQCAtMzU0LDggKzM1OSwxNSBAQAogCiBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqZ2ZzMl9yZ3JwZF9nZXRfZmlyc3Qoc3RydWN0IGdmczJfc2JkICpzZHApCiB7Ci0JZ2ZzMl9hc3NlcnQoc2RwLCAhbGlzdF9lbXB0eSgmc2RwLT5zZF9yaW5kZXhfbGlzdCkpOwotCXJldHVybiBsaXN0X2VudHJ5KHNkcC0+c2RfcmluZGV4X2xpc3QubmV4dCwgc3RydWN0IGdmczJfcmdycGQsIHJkX2xpc3QpOworCWNvbnN0IHN0cnVjdCByYl9ub2RlICpuOworCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7CisKKwlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOworCW4gPSByYl9maXJzdCgmc2RwLT5zZF9yaW5kZXhfdHJlZSk7CisJcmdkID0gcmJfZW50cnkobiwgc3RydWN0IGdmczJfcmdycGQsIHJkX25vZGUpOworCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKKworCXJldHVybiByZ2Q7CiB9CiAKIC8qKgpAQCAtMzY3LDQ1ICszNzksNTggQEAKIAogc3RydWN0IGdmczJfcmdycGQgKmdmczJfcmdycGRfZ2V0X25leHQoc3RydWN0IGdmczJfcmdycGQgKnJnZCkKIHsKLQlpZiAocmdkLT5yZF9saXN0Lm5leHQgPT0gJnJnZC0+cmRfc2JkLT5zZF9yaW5kZXhfbGlzdCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGxpc3RfZW50cnkocmdkLT5yZF9saXN0Lm5leHQsIHN0cnVjdCBnZnMyX3JncnBkLCByZF9saXN0KTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYXJfcmdycGRpKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IGdmczJfcmdycGQgKnJnZDsKLQlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2w7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSByZ2QtPnJkX3NiZDsKKwljb25zdCBzdHJ1Y3QgcmJfbm9kZSAqbjsKIAogCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0Jc2RwLT5zZF9yaW5kZXhfZm9yd2FyZCA9IE5VTEw7CisJbiA9IHJiX25leHQoJnJnZC0+cmRfbm9kZSk7CisJaWYgKG4gPT0gTlVMTCkKKwkJbiA9IHJiX2ZpcnN0KCZzZHAtPnNkX3JpbmRleF90cmVlKTsKKworCWlmICh1bmxpa2VseSgmcmdkLT5yZF9ub2RlID09IG4pKSB7CisJCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJnZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBnZnMyX3JncnBkLCByZF9ub2RlKTsKIAlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CisJcmV0dXJuIHJnZDsKK30KIAotCWhlYWQgPSAmc2RwLT5zZF9yaW5kZXhfbGlzdDsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJcmdkID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbGlzdCk7Ci0JCWdsID0gcmdkLT5yZF9nbDsKK3ZvaWQgZ2ZzMl9mcmVlX2Nsb25lcyhzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKQoreworCWludCB4OwogCi0JCWxpc3RfZGVsKCZyZ2QtPnJkX2xpc3QpOwotCQlsaXN0X2RlbCgmcmdkLT5yZF9saXN0X21ydSk7Ci0KLQkJaWYgKGdsKSB7Ci0JCQlnbC0+Z2xfb2JqZWN0ID0gTlVMTDsKLQkJCWdmczJfZ2xvY2tfYWRkX3RvX2xydShnbCk7Ci0JCQlnZnMyX2dsb2NrX3B1dChnbCk7Ci0JCX0KLQotCQlrZnJlZShyZ2QtPnJkX2JpdHMpOwotCQlrbWVtX2NhY2hlX2ZyZWUoZ2ZzMl9yZ3JwZF9jYWNoZXAsIHJnZCk7CisJZm9yICh4ID0gMDsgeCA8IHJnZC0+cmRfbGVuZ3RoOyB4KyspIHsKKwkJc3RydWN0IGdmczJfYml0bWFwICpiaSA9IHJnZC0+cmRfYml0cyArIHg7CisJCWtmcmVlKGJpLT5iaV9jbG9uZSk7CisJCWJpLT5iaV9jbG9uZSA9IE5VTEw7CiAJfQogfQogCiB2b2lkIGdmczJfY2xlYXJfcmdycGQoc3RydWN0IGdmczJfc2JkICpzZHApCiB7Ci0JbXV0ZXhfbG9jaygmc2RwLT5zZF9yaW5kZXhfbXV0ZXgpOwotCWNsZWFyX3JncnBkaShzZHApOwotCW11dGV4X3VubG9jaygmc2RwLT5zZF9yaW5kZXhfbXV0ZXgpOworCXN0cnVjdCByYl9ub2RlICpuOworCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7CisJc3RydWN0IGdmczJfZ2xvY2sgKmdsOworCisJd2hpbGUgKChuID0gcmJfZmlyc3QoJnNkcC0+c2RfcmluZGV4X3RyZWUpKSkgeworCQlyZ2QgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbm9kZSk7CisJCWdsID0gcmdkLT5yZF9nbDsKKworCQlyYl9lcmFzZShuLCAmc2RwLT5zZF9yaW5kZXhfdHJlZSk7CisKKwkJaWYgKGdsKSB7CisJCQlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKKwkJCWdsLT5nbF9vYmplY3QgPSBOVUxMOworCQkJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKKwkJCWdmczJfZ2xvY2tfYWRkX3RvX2xydShnbCk7CisJCQlnZnMyX2dsb2NrX3B1dChnbCk7CisJCX0KKworCQlnZnMyX2ZyZWVfY2xvbmVzKHJnZCk7CisJCWtmcmVlKHJnZC0+cmRfYml0cyk7CisJCWttZW1fY2FjaGVfZnJlZShnZnMyX3JncnBkX2NhY2hlcCwgcmdkKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfcmluZGV4X3ByaW50KGNvbnN0IHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCkBAIC01MjQsMjIgKzU0OSwzNCBAQAogCXJldHVybiB0b3RhbF9kYXRhOwogfQogCi1zdGF0aWMgdm9pZCBnZnMyX3JpbmRleF9pbihzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkLCBjb25zdCB2b2lkICpidWYpCitzdGF0aWMgdm9pZCByZ2RfaW5zZXJ0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCiB7Ci0JY29uc3Qgc3RydWN0IGdmczJfcmluZGV4ICpzdHIgPSBidWY7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSByZ2QtPnJkX3NiZDsKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ld24gPSAmc2RwLT5zZF9yaW5kZXhfdHJlZS5yYl9ub2RlLCAqcGFyZW50ID0gTlVMTDsKIAotCXJnZC0+cmRfYWRkciA9IGJlNjRfdG9fY3B1KHN0ci0+cmlfYWRkcik7Ci0JcmdkLT5yZF9sZW5ndGggPSBiZTMyX3RvX2NwdShzdHItPnJpX2xlbmd0aCk7Ci0JcmdkLT5yZF9kYXRhMCA9IGJlNjRfdG9fY3B1KHN0ci0+cmlfZGF0YTApOwotCXJnZC0+cmRfZGF0YSA9IGJlMzJfdG9fY3B1KHN0ci0+cmlfZGF0YSk7Ci0JcmdkLT5yZF9iaXRieXRlcyA9IGJlMzJfdG9fY3B1KHN0ci0+cmlfYml0Ynl0ZXMpOworCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IG5ldyBub2RlICovCisJd2hpbGUgKCpuZXduKSB7CisJCXN0cnVjdCBnZnMyX3JncnBkICpjdXIgPSByYl9lbnRyeSgqbmV3biwgc3RydWN0IGdmczJfcmdycGQsCisJCQkJCQkgIHJkX25vZGUpOworCisJCXBhcmVudCA9ICpuZXduOworCQlpZiAocmdkLT5yZF9hZGRyIDwgY3VyLT5yZF9hZGRyKQorCQkJbmV3biA9ICYoKCpuZXduKS0+cmJfbGVmdCk7CisJCWVsc2UgaWYgKHJnZC0+cmRfYWRkciA+IGN1ci0+cmRfYWRkcikKKwkJCW5ld24gPSAmKCgqbmV3biktPnJiX3JpZ2h0KTsKKwkJZWxzZQorCQkJcmV0dXJuOworCX0KKworCXJiX2xpbmtfbm9kZSgmcmdkLT5yZF9ub2RlLCBwYXJlbnQsIG5ld24pOworCXJiX2luc2VydF9jb2xvcigmcmdkLT5yZF9ub2RlLCAmc2RwLT5zZF9yaW5kZXhfdHJlZSk7CiB9CiAKIC8qKgogICogcmVhZF9yaW5kZXhfZW50cnkgLSBQdWxsIGluIGEgbmV3IHJlc291cmNlIGluZGV4IGVudHJ5IGZyb20gdGhlIGRpc2sKICAqIEBnbDogVGhlIGdsb2NrIGNvdmVyaW5nIHRoZSByaW5kZXggaW5vZGUKICAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsID4gMCBvbiBFT0YsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAgKi8KIAogc3RhdGljIGludCByZWFkX3JpbmRleF9lbnRyeShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsCkBAIC01NDcsNDQgKzU4NCw1MyBAQAogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCWxvZmZfdCBwb3MgPSBzZHAtPnNkX3JncnBzICogc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCk7Ci0JY2hhciBidWZbc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCldOworCXN0cnVjdCBnZnMyX3JpbmRleCBidWY7CiAJaW50IGVycm9yOwogCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7CiAKLQllcnJvciA9IGdmczJfaW50ZXJuYWxfcmVhZChpcCwgcmFfc3RhdGUsIGJ1ZiwgJnBvcywKKwlpZiAocG9zID49IGlfc2l6ZV9yZWFkKCZpcC0+aV9pbm9kZSkpCisJCXJldHVybiAxOworCisJZXJyb3IgPSBnZnMyX2ludGVybmFsX3JlYWQoaXAsIHJhX3N0YXRlLCAoY2hhciAqKSZidWYsICZwb3MsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCkpOwotCWlmICghZXJyb3IpCi0JCXJldHVybiAwOwotCWlmIChlcnJvciAhPSBzaXplb2Yoc3RydWN0IGdmczJfcmluZGV4KSkgewotCQlpZiAoZXJyb3IgPiAwKQotCQkJZXJyb3IgPSAtRUlPOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQorCisJaWYgKGVycm9yICE9IHNpemVvZihzdHJ1Y3QgZ2ZzMl9yaW5kZXgpKQorCQlyZXR1cm4gKGVycm9yID09IDApID8gMSA6IGVycm9yOwogCiAJcmdkID0ga21lbV9jYWNoZV96YWxsb2MoZ2ZzMl9yZ3JwZF9jYWNoZXAsIEdGUF9OT0ZTKTsKIAllcnJvciA9IC1FTk9NRU07CiAJaWYgKCFyZ2QpCiAJCXJldHVybiBlcnJvcjsKIAotCW11dGV4X2luaXQoJnJnZC0+cmRfbXV0ZXgpOwotCWxvcHNfaW5pdF9sZSgmcmdkLT5yZF9sZSwgJmdmczJfcmdfbG9wcyk7CiAJcmdkLT5yZF9zYmQgPSBzZHA7CisJcmdkLT5yZF9hZGRyID0gYmU2NF90b19jcHUoYnVmLnJpX2FkZHIpOworCXJnZC0+cmRfbGVuZ3RoID0gYmUzMl90b19jcHUoYnVmLnJpX2xlbmd0aCk7CisJcmdkLT5yZF9kYXRhMCA9IGJlNjRfdG9fY3B1KGJ1Zi5yaV9kYXRhMCk7CisJcmdkLT5yZF9kYXRhID0gYmUzMl90b19jcHUoYnVmLnJpX2RhdGEpOworCXJnZC0+cmRfYml0Ynl0ZXMgPSBiZTMyX3RvX2NwdShidWYucmlfYml0Ynl0ZXMpOwogCi0JbGlzdF9hZGRfdGFpbCgmcmdkLT5yZF9saXN0LCAmc2RwLT5zZF9yaW5kZXhfbGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmcmdkLT5yZF9saXN0X21ydSwgJnNkcC0+c2RfcmluZGV4X21ydV9saXN0KTsKLQotCWdmczJfcmluZGV4X2luKHJnZCwgYnVmKTsKIAllcnJvciA9IGNvbXB1dGVfYml0c3RydWN0cyhyZ2QpOwogCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOworCQlnb3RvIGZhaWw7CiAKIAllcnJvciA9IGdmczJfZ2xvY2tfZ2V0KHNkcCwgcmdkLT5yZF9hZGRyLAogCQkJICAgICAgICZnZnMyX3JncnBfZ2xvcHMsIENSRUFURSwgJnJnZC0+cmRfZ2wpOwogCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOworCQlnb3RvIGZhaWw7CiAKIAlyZ2QtPnJkX2dsLT5nbF9vYmplY3QgPSByZ2Q7CiAJcmdkLT5yZF9mbGFncyAmPSB+R0ZTMl9SREZfVVBUT0RBVEU7CisJaWYgKHJnZC0+cmRfZGF0YSA+IHNkcC0+c2RfbWF4X3JnX2RhdGEpCisJCXNkcC0+c2RfbWF4X3JnX2RhdGEgPSByZ2QtPnJkX2RhdGE7CisJc3Bpbl9sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKKwlyZ2RfaW5zZXJ0KHJnZCk7CisJc2RwLT5zZF9yZ3JwcysrOworCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKKwlyZXR1cm4gZXJyb3I7CisKK2ZhaWw6CisJa2ZyZWUocmdkLT5yZF9iaXRzKTsKKwlrbWVtX2NhY2hlX2ZyZWUoZ2ZzMl9yZ3JwZF9jYWNoZXAsIHJnZCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC01OTUsNDAgKzY0MSwyOCBAQAogICogUmV0dXJuczogMCBvbiBzdWNjZXNzZnVsIHVwZGF0ZSwgZXJyb3IgY29kZSBvdGhlcndpc2UKICAqLwogCi1pbnQgZ2ZzMl9yaV91cGRhdGUoc3RydWN0IGdmczJfaW5vZGUgKmlwKQorc3RhdGljIGludCBnZnMyX3JpX3VwZGF0ZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9ICZpcC0+aV9pbm9kZTsKIAlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSByYV9zdGF0ZTsKLQl1NjQgcmdycF9jb3VudCA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkOwotCXVuc2lnbmVkIGludCBtYXhfZGF0YSA9IDA7CiAJaW50IGVycm9yOwogCi0JZG9fZGl2KHJncnBfY291bnQsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9yaW5kZXgpKTsKLQljbGVhcl9yZ3JwZGkoc2RwKTsKLQogCWZpbGVfcmFfc3RhdGVfaW5pdCgmcmFfc3RhdGUsIGlub2RlLT5pX21hcHBpbmcpOwotCWZvciAoc2RwLT5zZF9yZ3JwcyA9IDA7IHNkcC0+c2RfcmdycHMgPCByZ3JwX2NvdW50OyBzZHAtPnNkX3JncnBzKyspIHsKKwlkbyB7CiAJCWVycm9yID0gcmVhZF9yaW5kZXhfZW50cnkoaXAsICZyYV9zdGF0ZSk7Ci0JCWlmIChlcnJvcikgewotCQkJY2xlYXJfcmdycGRpKHNkcCk7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQl9CisJfSB3aGlsZSAoZXJyb3IgPT0gMCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJnZCwgJnNkcC0+c2RfcmluZGV4X2xpc3QsIHJkX2xpc3QpCi0JCWlmIChyZ2QtPnJkX2RhdGEgPiBtYXhfZGF0YSkKLQkJCW1heF9kYXRhID0gcmdkLT5yZF9kYXRhOwotCXNkcC0+c2RfbWF4X3JnX2RhdGEgPSBtYXhfZGF0YTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKIAlzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogZ2ZzMl9yaW5kZXhfaG9sZCAtIEdyYWIgYSBsb2NrIG9uIHRoZSByaW5kZXgKKyAqIGdmczJfcmluZGV4X3VwZGF0ZSAtIFVwZGF0ZSB0aGUgcmluZGV4IGlmIHJlcXVpcmVkCiAgKiBAc2RwOiBUaGUgR0ZTMiBzdXBlcmJsb2NrCi0gKiBAcmlfZ2g6IHRoZSBnbG9jayBob2xkZXIKICAqCiAgKiBXZSBncmFiIGEgbG9jayBvbiB0aGUgcmluZGV4IGlub2RlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGRvZXNuJ3QKICAqIGNoYW5nZSB3aGlsc3Qgd2UgYXJlIHBlcmZvcm1pbmcgYW4gb3BlcmF0aW9uLiBXZSBrZWVwIHRoaXMgbG9jawpAQCAtNjQwLDMwICs2NzQsMjkgQEAKICAqIHNwZWNpYWwgZmlsZSwgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQgaWYgc29tZW9uZSBleHBhbmRlZCB0aGUKICAqIGZpbGVzeXN0ZW0gKHZpYSBnZnMyX2dyb3cgdXRpbGl0eSksIHdoaWNoIGFkZHMgbmV3IHJlc291cmNlIGdyb3Vwcy4KICAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2NlZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZQogICovCiAKLWludCBnZnMyX3JpbmRleF9ob2xkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKnJpX2doKQoraW50IGdmczJfcmluZGV4X3VwZGF0ZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpOwogCXN0cnVjdCBnZnMyX2dsb2NrICpnbCA9IGlwLT5pX2dsOwotCWludCBlcnJvcjsKLQotCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGdsLCBMTV9TVF9TSEFSRUQsIDAsIHJpX2doKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKKwlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgcmlfZ2g7CisJaW50IGVycm9yID0gMDsKIAogCS8qIFJlYWQgbmV3IGNvcHkgZnJvbSBkaXNrIGlmIHdlIGRvbid0IGhhdmUgdGhlIGxhdGVzdCAqLwogCWlmICghc2RwLT5zZF9yaW5kZXhfdXB0b2RhdGUpIHsKIAkJbXV0ZXhfbG9jaygmc2RwLT5zZF9yaW5kZXhfbXV0ZXgpOwotCQlpZiAoIXNkcC0+c2RfcmluZGV4X3VwdG9kYXRlKSB7CisJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGdsLCBMTV9TVF9TSEFSRUQsIDAsICZyaV9naCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJaWYgKCFzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSkKIAkJCWVycm9yID0gZ2ZzMl9yaV91cGRhdGUoaXApOwotCQkJaWYgKGVycm9yKQotCQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KHJpX2doKTsKLQkJfQorCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmcmlfZ2gpOwogCQltdXRleF91bmxvY2soJnNkcC0+c2RfcmluZGV4X211dGV4KTsKIAl9CiAKKwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNjk0LDcgKzcyNyw3IEBACiB9CiAKIC8qKgotICogZ2ZzMl9yZ3JwX2JoX2dldCAtIFJlYWQgaW4gYSBSRydzIGhlYWRlciBhbmQgYml0bWFwcworICogZ2ZzMl9yZ3JwX2dvX2xvY2sgLSBSZWFkIGluIGEgUkcncyBoZWFkZXIgYW5kIGJpdG1hcHMKICAqIEByZ2Q6IHRoZSBzdHJ1Y3QgZ2ZzMl9yZ3JwZCBkZXNjcmliaW5nIHRoZSBSRyB0byByZWFkIGluCiAgKgogICogUmVhZCBpbiBhbGwgb2YgYSBSZXNvdXJjZSBHcm91cCdzIGhlYWRlciBhbmQgYml0bWFwIGJsb2Nrcy4KQEAgLTcwMyw4ICs3MzYsOSBAQAogICogUmV0dXJuczogZXJybm8KICAqLwogCi1pbnQgZ2ZzMl9yZ3JwX2JoX2dldChzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKQoraW50IGdmczJfcmdycF9nb19sb2NrKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpCiB7CisJc3RydWN0IGdmczJfcmdycGQgKnJnZCA9IGdoLT5naF9nbC0+Z2xfb2JqZWN0OwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gcmdkLT5yZF9zYmQ7CiAJc3RydWN0IGdmczJfZ2xvY2sgKmdsID0gcmdkLT5yZF9nbDsKIAl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gcmdkLT5yZF9sZW5ndGg7CkBAIC03MTIsMTcgKzc0Niw2IEBACiAJdW5zaWduZWQgaW50IHgsIHk7CiAJaW50IGVycm9yOwogCi0JbXV0ZXhfbG9jaygmcmdkLT5yZF9tdXRleCk7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCWlmIChyZ2QtPnJkX2JoX2NvdW50KSB7Ci0JCXJnZC0+cmRfYmhfY291bnQrKzsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCQltdXRleF91bmxvY2soJnJnZC0+cmRfbXV0ZXgpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCiAJZm9yICh4ID0gMDsgeCA8IGxlbmd0aDsgeCsrKSB7CiAJCWJpID0gcmdkLT5yZF9iaXRzICsgeDsKIAkJZXJyb3IgPSBnZnMyX21ldGFfcmVhZChnbCwgcmdkLT5yZF9hZGRyICsgeCwgMCwgJmJpLT5iaV9iaCk7CkBAIC03NDcsMTUgKzc3MCw5IEBACiAJCQljbGVhcl9iaXQoR0JGX0ZVTEwsICZyZ2QtPnJkX2JpdHNbeF0uYmlfZmxhZ3MpOwogCQlnZnMyX3JncnBfaW4ocmdkLCAocmdkLT5yZF9iaXRzWzBdLmJpX2JoKS0+Yl9kYXRhKTsKIAkJcmdkLT5yZF9mbGFncyB8PSAoR0ZTMl9SREZfVVBUT0RBVEUgfCBHRlMyX1JERl9DSEVDSyk7CisJCXJnZC0+cmRfZnJlZV9jbG9uZSA9IHJnZC0+cmRfZnJlZTsKIAl9CiAKLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCXJnZC0+cmRfZnJlZV9jbG9uZSA9IHJnZC0+cmRfZnJlZTsKLQlyZ2QtPnJkX2JoX2NvdW50Kys7Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCi0JbXV0ZXhfdW5sb2NrKCZyZ2QtPnJkX211dGV4KTsKLQogCXJldHVybiAwOwogCiBmYWlsOgpAQCAtNzY1LDUyICs3ODIsMzIgQEAKIAkJYmktPmJpX2JoID0gTlVMTDsKIAkJZ2ZzMl9hc3NlcnRfd2FybihzZHAsICFiaS0+YmlfY2xvbmUpOwogCX0KLQltdXRleF91bmxvY2soJnJnZC0+cmRfbXV0ZXgpOwogCiAJcmV0dXJuIGVycm9yOwogfQogCi12b2lkIGdmczJfcmdycF9iaF9ob2xkKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSByZ2QtPnJkX3NiZDsKLQotCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0JZ2ZzMl9hc3NlcnRfd2FybihyZ2QtPnJkX3NiZCwgcmdkLT5yZF9iaF9jb3VudCk7Ci0JcmdkLT5yZF9iaF9jb3VudCsrOwotCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKLX0KLQogLyoqCi0gKiBnZnMyX3JncnBfYmhfcHV0IC0gUmVsZWFzZSBSRyBiaXRtYXBzIHJlYWQgaW4gd2l0aCBnZnMyX3JncnBfYmhfZ2V0KCkKKyAqIGdmczJfcmdycF9nb191bmxvY2sgLSBSZWxlYXNlIFJHIGJpdG1hcHMgcmVhZCBpbiB3aXRoIGdmczJfcmdycF9iaF9nZXQoKQogICogQHJnZDogdGhlIHN0cnVjdCBnZnMyX3JncnBkIGRlc2NyaWJpbmcgdGhlIFJHIHRvIHJlYWQgaW4KICAqCiAgKi8KIAotdm9pZCBnZnMyX3JncnBfYmhfcHV0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCit2b2lkIGdmczJfcmdycF9nb191bmxvY2soc3RydWN0IGdmczJfaG9sZGVyICpnaCkKIHsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHJnZC0+cmRfc2JkOworCXN0cnVjdCBnZnMyX3JncnBkICpyZ2QgPSBnaC0+Z2hfZ2wtPmdsX29iamVjdDsKIAlpbnQgeCwgbGVuZ3RoID0gcmdkLT5yZF9sZW5ndGg7CiAKLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCWdmczJfYXNzZXJ0X3dhcm4ocmdkLT5yZF9zYmQsIHJnZC0+cmRfYmhfY291bnQpOwotCWlmICgtLXJnZC0+cmRfYmhfY291bnQpIHsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCQlyZXR1cm47Ci0JfQotCiAJZm9yICh4ID0gMDsgeCA8IGxlbmd0aDsgeCsrKSB7CiAJCXN0cnVjdCBnZnMyX2JpdG1hcCAqYmkgPSByZ2QtPnJkX2JpdHMgKyB4OwotCQlrZnJlZShiaS0+YmlfY2xvbmUpOwotCQliaS0+YmlfY2xvbmUgPSBOVUxMOwogCQlicmVsc2UoYmktPmJpX2JoKTsKIAkJYmktPmJpX2JoID0gTlVMTDsKIAl9CiAKLQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CiB9CiAKLXN0YXRpYyB2b2lkIGdmczJfcmdycF9zZW5kX2Rpc2NhcmRzKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgb2Zmc2V0LAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgZ2ZzMl9iaXRtYXAgKmJpKQordm9pZCBnZnMyX3JncnBfc2VuZF9kaXNjYXJkcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IG9mZnNldCwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGdmczJfYml0bWFwICpiaSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gc2RwLT5zZF92ZnM7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHNiLT5zX2JkZXY7CkBAIC04MjMsNyArODIwLDcgQEAKIAl1bnNpZ25lZCBpbnQgeDsKIAogCWZvciAoeCA9IDA7IHggPCBiaS0+YmlfbGVuOyB4KyspIHsKLQkJY29uc3QgdTggKm9yaWcgPSBiaS0+YmlfYmgtPmJfZGF0YSArIGJpLT5iaV9vZmZzZXQgKyB4OworCQljb25zdCB1OCAqb3JpZyA9IGJoLT5iX2RhdGEgKyBiaS0+Ymlfb2Zmc2V0ICsgeDsKIAkJY29uc3QgdTggKmNsb25lID0gYmktPmJpX2Nsb25lICsgYmktPmJpX29mZnNldCArIHg7CiAJCXU4IGRpZmYgPSB+KCpvcmlnIHwgKCpvcmlnID4+IDEpKSAmICgqY2xvbmUgfCAoKmNsb25lID4+IDEpKTsKIAkJZGlmZiAmPSAweDU1OwpAQCAtODYyLDI4ICs4NTksNiBAQAogCXNkcC0+c2RfYXJncy5hcl9kaXNjYXJkID0gMDsKIH0KIAotdm9pZCBnZnMyX3JncnBfcmVwb2xpc2hfY2xvbmVzKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSByZ2QtPnJkX3NiZDsKLQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gcmdkLT5yZF9sZW5ndGg7Ci0JdW5zaWduZWQgaW50IHg7Ci0KLQlmb3IgKHggPSAwOyB4IDwgbGVuZ3RoOyB4KyspIHsKLQkJc3RydWN0IGdmczJfYml0bWFwICpiaSA9IHJnZC0+cmRfYml0cyArIHg7Ci0JCWlmICghYmktPmJpX2Nsb25lKQotCQkJY29udGludWU7Ci0JCWlmIChzZHAtPnNkX2FyZ3MuYXJfZGlzY2FyZCkKLQkJCWdmczJfcmdycF9zZW5kX2Rpc2NhcmRzKHNkcCwgcmdkLT5yZF9kYXRhMCwgYmkpOwotCQljbGVhcl9iaXQoR0JGX0ZVTEwsICZiaS0+YmlfZmxhZ3MpOwotCQltZW1jcHkoYmktPmJpX2Nsb25lICsgYmktPmJpX29mZnNldCwKLQkJICAgICAgIGJpLT5iaV9iaC0+Yl9kYXRhICsgYmktPmJpX29mZnNldCwgYmktPmJpX2xlbik7Ci0JfQotCi0Jc3Bpbl9sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKLQlyZ2QtPnJkX2ZyZWVfY2xvbmUgPSByZ2QtPnJkX2ZyZWU7Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotfQotCiAvKioKICAqIGdmczJfYWxsb2NfZ2V0IC0gZ2V0IHRoZSBzdHJ1Y3QgZ2ZzMl9hbGxvYyBzdHJ1Y3R1cmUgZm9yIGFuIGlub2RlCiAgKiBAaXA6IHRoZSBpbmNvcmUgR0ZTMiBpbm9kZSBzdHJ1Y3R1cmUKQEAgLTg5MywzOCArODY4LDM1IEBACiAKIHN0cnVjdCBnZnMyX2FsbG9jICpnZnMyX2FsbG9jX2dldChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CisJaW50IGVycm9yOwogCUJVR19PTihpcC0+aV9hbGxvYyAhPSBOVUxMKTsKIAlpcC0+aV9hbGxvYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnZnMyX2FsbG9jKSwgR0ZQX05PRlMpOworCWVycm9yID0gZ2ZzMl9yaW5kZXhfdXBkYXRlKHNkcCk7CisJaWYgKGVycm9yKQorCQlmc193YXJuKHNkcCwgInJpbmRleCB1cGRhdGUgcmV0dXJucyAlZFxuIiwgZXJyb3IpOwogCXJldHVybiBpcC0+aV9hbGxvYzsKIH0KIAogLyoqCiAgKiB0cnlfcmdycF9maXQgLSBTZWUgaWYgYSBnaXZlbiByZXNlcnZhdGlvbiB3aWxsIGZpdCBpbiBhIGdpdmVuIFJHCiAgKiBAcmdkOiB0aGUgUkcgZGF0YQotICogQGFsOiB0aGUgc3RydWN0IGdmczJfYWxsb2Mgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIHJlc2VydmF0aW9uCisgKiBAaXA6IHRoZSBpbm9kZQogICoKICAqIElmIHRoZXJlJ3Mgcm9vbSBmb3IgdGhlIHJlcXVlc3RlZCBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGZyb20gdGhlIFJHOgotICogICBTZXRzIHRoZSAkYWxfcmdkIGZpZWxkIGluIEBhbC4KICAqCiAgKiBSZXR1cm5zOiAxIG9uIHN1Y2Nlc3MgKGl0IGZpdHMpLCAwIG9uIGZhaWx1cmUgKGl0IGRvZXNuJ3QgZml0KQogICovCiAKLXN0YXRpYyBpbnQgdHJ5X3JncnBfZml0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsIHN0cnVjdCBnZnMyX2FsbG9jICphbCkKK3N0YXRpYyBpbnQgdHJ5X3JncnBfZml0KGNvbnN0IHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsIGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCkKIHsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHJnZC0+cmRfc2JkOwotCWludCByZXQgPSAwOworCWNvbnN0IHN0cnVjdCBnZnMyX2FsbG9jICphbCA9IGlwLT5pX2FsbG9jOwogCiAJaWYgKHJnZC0+cmRfZmxhZ3MgJiAoR0ZTMl9SR0ZfTk9BTExPQyB8IEdGUzJfUkRGX0VSUk9SKSkKIAkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCWlmIChyZ2QtPnJkX2ZyZWVfY2xvbmUgPj0gYWwtPmFsX3JlcXVlc3RlZCkgewotCQlhbC0+YWxfcmdkID0gcmdkOwotCQlyZXQgPSAxOwotCX0KLQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0KLQlyZXR1cm4gcmV0OworCWlmIChyZ2QtPnJkX2ZyZWVfY2xvbmUgPj0gYWwtPmFsX3JlcXVlc3RlZCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtOTkyLDc2ICs5NjQsNiBAQAogfQogCiAvKioKLSAqIHJlY2VudF9yZ3JwX25leHQgLSBnZXQgbmV4dCBSRyBmcm9tICJyZWNlbnQiIGxpc3QKLSAqIEBjdXJfcmdkOiBjdXJyZW50IHJncnAKLSAqCi0gKiBSZXR1cm5zOiBUaGUgbmV4dCByZ3JwIGluIHRoZSByZWNlbnQgbGlzdAotICovCi0KLXN0YXRpYyBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmVjZW50X3JncnBfbmV4dChzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqY3VyX3JnZCkKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGN1cl9yZ2QtPnJkX3NiZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCWhlYWQgPSAmc2RwLT5zZF9yaW5kZXhfbXJ1X2xpc3Q7Ci0JaWYgKHVubGlrZWx5KGN1cl9yZ2QtPnJkX2xpc3RfbXJ1Lm5leHQgPT0gaGVhZCkpIHsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmdkID0gbGlzdF9lbnRyeShjdXJfcmdkLT5yZF9saXN0X21ydS5uZXh0LCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbGlzdF9tcnUpOwotCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKLQlyZXR1cm4gcmdkOwotfQotCi0vKioKLSAqIGZvcndhcmRfcmdycF9nZXQgLSBnZXQgYW4gcmdycCB0byB0cnkgbmV4dCBmcm9tIGZ1bGwgbGlzdAotICogQHNkcDogVGhlIEdGUzIgc3VwZXJibG9jawotICoKLSAqIFJldHVybnM6IFRoZSByZ3JwIHRvIHRyeSBuZXh0Ci0gKi8KLQotc3RhdGljIHN0cnVjdCBnZnMyX3JncnBkICpmb3J3YXJkX3JncnBfZ2V0KHN0cnVjdCBnZnMyX3NiZCAqc2RwKQotewotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0JdW5zaWduZWQgaW50IGpvdXJuYWxzID0gZ2ZzMl9qaW5kZXhfc2l6ZShzZHApOwotCXVuc2lnbmVkIGludCByZyA9IDAsIHg7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCi0JcmdkID0gc2RwLT5zZF9yaW5kZXhfZm9yd2FyZDsKLQlpZiAoIXJnZCkgewotCQlpZiAoc2RwLT5zZF9yZ3JwcyA+PSBqb3VybmFscykKLQkJCXJnID0gc2RwLT5zZF9yZ3JwcyAqIHNkcC0+c2RfamRlc2MtPmpkX2ppZCAvIGpvdXJuYWxzOwotCi0JCWZvciAoeCA9IDAsIHJnZCA9IGdmczJfcmdycGRfZ2V0X2ZpcnN0KHNkcCk7IHggPCByZzsKLQkJICAgICB4KyssIHJnZCA9IGdmczJfcmdycGRfZ2V0X25leHQocmdkKSkKLQkJCS8qIERvIE5vdGhpbmcgKi87Ci0KLQkJc2RwLT5zZF9yaW5kZXhfZm9yd2FyZCA9IHJnZDsKLQl9Ci0KLQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0KLQlyZXR1cm4gcmdkOwotfQotCi0vKioKLSAqIGZvcndhcmRfcmdycF9zZXQgLSBzZXQgdGhlIGZvcndhcmQgcmdycCBwb2ludGVyCi0gKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQotICogQHJnZDogVGhlIG5ldyBmb3J3YXJkIHJncnAKLSAqCi0gKi8KLQotc3RhdGljIHZvaWQgZm9yd2FyZF9yZ3JwX3NldChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfcmdycGQgKnJnZCkKLXsKLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCXNkcC0+c2RfcmluZGV4X2ZvcndhcmQgPSByZ2Q7Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotfQotCi0vKioKICAqIGdldF9sb2NhbF9yZ3JwIC0gQ2hvb3NlIGFuZCBsb2NrIGEgcmdycCBmb3IgYWxsb2NhdGlvbgogICogQGlwOiB0aGUgaW5vZGUgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IKICAqIEByZ3A6IHRoZSBjaG9zZW4gYW5kIGxvY2tlZCByZ3JwCkBAIC0xMDc2LDE0ICs5NzgsMTggQEAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkLCAqYmVnaW4gPSBOVUxMOwogCXN0cnVjdCBnZnMyX2FsbG9jICphbCA9IGlwLT5pX2FsbG9jOwotCWludCBmbGFncyA9IExNX0ZMQUdfVFJZOwotCWludCBza2lwcGVkID0gMDsKLQlpbnQgbG9vcHMgPSAwOwogCWludCBlcnJvciwgcmdfbG9ja2VkOworCWludCBsb29wcyA9IDA7CiAKLQlyZ2QgPSBnZnMyX2JsazJyZ3JwZChzZHAsIGlwLT5pX2dvYWwpOworCWlmIChpcC0+aV9yZ2QgJiYgcmdycF9jb250YWluc19ibG9jayhpcC0+aV9yZ2QsIGlwLT5pX2dvYWwpKQorCQlyZ2QgPSBiZWdpbiA9IGlwLT5pX3JnZDsKKwllbHNlCisJCXJnZCA9IGJlZ2luID0gZ2ZzMl9ibGsycmdycGQoc2RwLCBpcC0+aV9nb2FsKTsKIAotCXdoaWxlIChyZ2QpIHsKKwlpZiAocmdkID09IE5VTEwpCisJCXJldHVybiAtRUJBRFNMVDsKKworCXdoaWxlIChsb29wcyA8IDMpIHsKIAkJcmdfbG9ja2VkID0gMDsKIAogCQlpZiAoZ2ZzMl9nbG9ja19pc19sb2NrZWRfYnlfbWUocmdkLT5yZF9nbCkpIHsKQEAgLTEwOTUsOTIgKzEwMDEsMzYgQEAKIAkJfQogCQlzd2l0Y2ggKGVycm9yKSB7CiAJCWNhc2UgMDoKLQkJCWlmICh0cnlfcmdycF9maXQocmdkLCBhbCkpCi0JCQkJZ290byBvdXQ7CisJCQlpZiAodHJ5X3JncnBfZml0KHJnZCwgaXApKSB7CisJCQkJaXAtPmlfcmdkID0gcmdkOworCQkJCXJldHVybiAwOworCQkJfQogCQkJaWYgKHJnZC0+cmRfZmxhZ3MgJiBHRlMyX1JERl9DSEVDSykKIAkJCQl0cnlfcmdycF91bmxpbmsocmdkLCBsYXN0X3VubGlua2VkLCBpcC0+aV9ub19hZGRyKTsKIAkJCWlmICghcmdfbG9ja2VkKQogCQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmdkX2doKTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIEdMUl9UUllGQUlMRUQ6Ci0JCQlyZ2QgPSByZWNlbnRfcmdycF9uZXh0KHJnZCk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JfQotCi0JLyogR28gdGhyb3VnaCBmdWxsIGxpc3Qgb2YgcmdycHMgKi8KLQotCWJlZ2luID0gcmdkID0gZm9yd2FyZF9yZ3JwX2dldChzZHApOwotCi0JZm9yICg7OykgewotCQlyZ19sb2NrZWQgPSAwOwotCi0JCWlmIChnZnMyX2dsb2NrX2lzX2xvY2tlZF9ieV9tZShyZ2QtPnJkX2dsKSkgewotCQkJcmdfbG9ja2VkID0gMTsKLQkJCWVycm9yID0gMDsKLQkJfSBlbHNlIHsKLQkJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KHJnZC0+cmRfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgZmxhZ3MsCi0JCQkJCQkgICAmYWwtPmFsX3JnZF9naCk7Ci0JCX0KLQkJc3dpdGNoIChlcnJvcikgewotCQljYXNlIDA6Ci0JCQlpZiAodHJ5X3JncnBfZml0KHJnZCwgYWwpKQotCQkJCWdvdG8gb3V0OwotCQkJaWYgKHJnZC0+cmRfZmxhZ3MgJiBHRlMyX1JERl9DSEVDSykKLQkJCQl0cnlfcmdycF91bmxpbmsocmdkLCBsYXN0X3VubGlua2VkLCBpcC0+aV9ub19hZGRyKTsKLQkJCWlmICghcmdfbG9ja2VkKQotCQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmdkX2doKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgR0xSX1RSWUZBSUxFRDoKLQkJCXNraXBwZWQrKzsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQotCQlyZ2QgPSBnZnMyX3JncnBkX2dldF9uZXh0KHJnZCk7Ci0JCWlmICghcmdkKQotCQkJcmdkID0gZ2ZzMl9yZ3JwZF9nZXRfZmlyc3Qoc2RwKTsKLQotCQlpZiAocmdkID09IGJlZ2luKSB7Ci0JCQlpZiAoKytsb29wcyA+PSAzKQotCQkJCXJldHVybiAtRU5PU1BDOwotCQkJaWYgKCFza2lwcGVkKQorCQkJcmdkID0gZ2ZzMl9yZ3JwZF9nZXRfbmV4dChyZ2QpOworCQkJaWYgKHJnZCA9PSBiZWdpbikKIAkJCQlsb29wcysrOwotCQkJZmxhZ3MgPSAwOwotCQkJaWYgKGxvb3BzID09IDIpCi0JCQkJZ2ZzMl9sb2dfZmx1c2goc2RwLCBOVUxMKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGVycm9yOwogCQl9CiAJfQogCi1vdXQ6Ci0JaWYgKGJlZ2luKSB7Ci0JCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0JCWxpc3RfbW92ZSgmcmdkLT5yZF9saXN0X21ydSwgJnNkcC0+c2RfcmluZGV4X21ydV9saXN0KTsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCQlyZ2QgPSBnZnMyX3JncnBkX2dldF9uZXh0KHJnZCk7Ci0JCWlmICghcmdkKQotCQkJcmdkID0gZ2ZzMl9yZ3JwZF9nZXRfZmlyc3Qoc2RwKTsKLQkJZm9yd2FyZF9yZ3JwX3NldChzZHAsIHJnZCk7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIC1FTk9TUEM7CiB9CiAKIC8qKgotICogZ2ZzMl9pbnBsYWNlX3Jlc2VydmVfaSAtIFJlc2VydmUgc3BhY2UgaW4gdGhlIGZpbGVzeXN0ZW0KKyAqIGdmczJfaW5wbGFjZV9yZXNlcnZlIC0gUmVzZXJ2ZSBzcGFjZSBpbiB0aGUgZmlsZXN5c3RlbQogICogQGlwOiB0aGUgaW5vZGUgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IKICAqCiAgKiBSZXR1cm5zOiBlcnJubwogICovCiAKLWludCBnZnMyX2lucGxhY2VfcmVzZXJ2ZV9pKHN0cnVjdCBnZnMyX2lub2RlICppcCwgaW50IGhvbGRfcmluZGV4LAotCQkJICAgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUpCitpbnQgZ2ZzMl9pbnBsYWNlX3Jlc2VydmUoc3RydWN0IGdmczJfaW5vZGUgKmlwKQogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBnZnMyX2FsbG9jICphbCA9IGlwLT5pX2FsbG9jOwpAQCAtMTE5MSw0NSArMTA0MSwyMiBAQAogCWlmIChnZnMyX2Fzc2VydF93YXJuKHNkcCwgYWwtPmFsX3JlcXVlc3RlZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGhvbGRfcmluZGV4KSB7Ci0JCS8qIFdlIG5lZWQgdG8gaG9sZCB0aGUgcmluZGV4IHVubGVzcyB0aGUgaW5vZGUgd2UncmUgdXNpbmcgaXMKLQkJICAgdGhlIHJpbmRleCBpdHNlbGYsIGluIHdoaWNoIGNhc2UgaXQncyBhbHJlYWR5IGhlbGQuICovCi0JCWlmIChpcCAhPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpKQotCQkJZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJmFsLT5hbF9yaV9naCk7Ci0JCWVsc2UgaWYgKCFzZHAtPnNkX3JncnBzKSAvKiBXZSBtYXkgbm90IGhhdmUgdGhlIHJpbmRleCByZWFkCi0JCQkJCSAgICBpbiwgc286ICovCi0JCQllcnJvciA9IGdmczJfcmlfdXBkYXRlKGlwKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQotdHJ5X2FnYWluOgogCWRvIHsKIAkJZXJyb3IgPSBnZXRfbG9jYWxfcmdycChpcCwgJmxhc3RfdW5saW5rZWQpOwotCQkvKiBJZiB0aGVyZSBpcyBubyBzcGFjZSwgZmx1c2hpbmcgdGhlIGxvZyBtYXkgcmVsZWFzZSBzb21lICovCi0JCWlmIChlcnJvcikgewotCQkJaWYgKGlwID09IEdGUzJfSShzZHAtPnNkX3JpbmRleCkgJiYKLQkJCSAgICAhc2RwLT5zZF9yaW5kZXhfdXB0b2RhdGUpIHsKLQkJCQllcnJvciA9IGdmczJfcmlfdXBkYXRlKGlwKTsKLQkJCQlpZiAoZXJyb3IpCi0JCQkJCXJldHVybiBlcnJvcjsKLQkJCQlnb3RvIHRyeV9hZ2FpbjsKLQkJCX0KLQkJCWdmczJfbG9nX2ZsdXNoKHNkcCwgTlVMTCk7CisJCWlmIChlcnJvciAhPSAtRU5PU1BDKQorCQkJYnJlYWs7CisJCS8qIENoZWNrIHRoYXQgZnMgaGFzbid0IGdyb3duIGlmIHdyaXRpbmcgdG8gcmluZGV4ICovCisJCWlmIChpcCA9PSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpICYmICFzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSkgeworCQkJZXJyb3IgPSBnZnMyX3JpX3VwZGF0ZShpcCk7CisJCQlpZiAoZXJyb3IpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKIAkJfQotCX0gd2hpbGUgKGVycm9yICYmIHRyaWVzKysgPCAzKTsKKwkJLyogRmx1c2hpbmcgdGhlIGxvZyBtYXkgcmVsZWFzZSBzcGFjZSAqLworCQlnZnMyX2xvZ19mbHVzaChzZHAsIE5VTEwpOworCX0gd2hpbGUgKHRyaWVzKysgPCAzKTsKIAotCWlmIChlcnJvcikgewotCQlpZiAoaG9sZF9yaW5kZXggJiYgaXAgIT0gR0ZTMl9JKHNkcC0+c2RfcmluZGV4KSkKLQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmlfZ2gpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JLyogbm8gZXJyb3IsIHNvIHdlIGhhdmUgdGhlIHJncnAgc2V0IGluIHRoZSBpbm9kZSdzIGFsbG9jYXRpb24uICovCi0JYWwtPmFsX2ZpbGUgPSBmaWxlOwotCWFsLT5hbF9saW5lID0gbGluZTsKLQotCXJldHVybiAwOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoqCkBAIC0xMjQxLDIwICsxMDY4LDEwIEBACiAKIHZvaWQgZ2ZzMl9pbnBsYWNlX3JlbGVhc2Uoc3RydWN0IGdmczJfaW5vZGUgKmlwKQogewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBnZnMyX2FsbG9jICphbCA9IGlwLT5pX2FsbG9jOwogCi0JaWYgKGdmczJfYXNzZXJ0X3dhcm4oc2RwLCBhbC0+YWxfYWxsb2NlZCA8PSBhbC0+YWxfcmVxdWVzdGVkKSA9PSAtMSkKLQkJZnNfd2FybihzZHAsICJhbF9hbGxvY2VkID0gJXUsIGFsX3JlcXVlc3RlZCA9ICV1ICIKLQkJCSAgICAgImFsX2ZpbGUgPSAlcywgYWxfbGluZSA9ICV1XG4iLAotCQkgICAgICAgICAgICAgYWwtPmFsX2FsbG9jZWQsIGFsLT5hbF9yZXF1ZXN0ZWQsIGFsLT5hbF9maWxlLAotCQkJICAgICBhbC0+YWxfbGluZSk7Ci0KLQlhbC0+YWxfcmdkID0gTlVMTDsKIAlpZiAoYWwtPmFsX3JnZF9naC5naF9nbCkKIAkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmFsLT5hbF9yZ2RfZ2gpOwotCWlmIChpcCAhPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpICYmIGFsLT5hbF9yaV9naC5naF9nbCkKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmFsLT5hbF9yaV9naCk7CiB9CiAKIC8qKgpAQCAtMTM1Miw2ICsxMTY5LDcgQEAKIAkJLyogVGhlIEdGUzJfQkxLU1RfVU5MSU5LRUQgc3RhdGUgZG9lc24ndCBhcHBseSB0byB0aGUgY2xvbmUKIAkJICAgYml0bWFwcywgc28gd2UgbXVzdCBzZWFyY2ggdGhlIG9yaWdpbmFscyBmb3IgdGhhdC4gKi8KIAkJYnVmZmVyID0gYmktPmJpX2JoLT5iX2RhdGEgKyBiaS0+Ymlfb2Zmc2V0OworCQlXQVJOX09OKCFidWZmZXJfdXB0b2RhdGUoYmktPmJpX2JoKSk7CiAJCWlmIChvbGRfc3RhdGUgIT0gR0ZTMl9CTEtTVF9VTkxJTktFRCAmJiBiaS0+YmlfY2xvbmUpCiAJCQlidWZmZXIgPSBiaS0+YmlfY2xvbmUgKyBiaS0+Ymlfb2Zmc2V0OwogCkBAIC0xMzcxLDYgKzExODksNyBAQAogCiAJaWYgKGJsayA9PSBCRklUTk9FTlQpCiAJCXJldHVybiBibGs7CisKIAkqbiA9IDE7CiAJaWYgKG9sZF9zdGF0ZSA9PSBuZXdfc3RhdGUpCiAJCWdvdG8gb3V0OwpAQCAtMTUwMyw3ICsxMzIyLDcgQEAKIAlpZiAoYWwgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CiAKLQlyZ2QgPSBhbC0+YWxfcmdkOworCXJnZCA9IGlwLT5pX3JnZDsKIAogCWlmIChyZ3JwX2NvbnRhaW5zX2Jsb2NrKHJnZCwgaXAtPmlfZ29hbCkpCiAJCWdvYWwgPSBpcC0+aV9nb2FsIC0gcmdkLT5yZF9kYXRhMDsKQEAgLTE1MTgsNyArMTMzNyw3IEBACiAKIAlyZ2QtPnJkX2xhc3RfYWxsb2MgPSBibGs7CiAJYmxvY2sgPSByZ2QtPnJkX2RhdGEwICsgYmxrOwotCWlwLT5pX2dvYWwgPSBibG9jazsKKwlpcC0+aV9nb2FsID0gYmxvY2sgKyAqbiAtIDE7CiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAJaWYgKGVycm9yID09IDApIHsKIAkJc3RydWN0IGdmczJfZGlub2RlICpkaSA9IChzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKilkaWJoLT5iX2RhdGE7CkBAIC0xNTM5LDkgKzEzNTgsNyBAQAogCWdmczJfc3RhdGZzX2NoYW5nZShzZHAsIDAsIC0oczY0KSpuLCAwKTsKIAlnZnMyX3F1b3RhX2NoYW5nZShpcCwgKm4sIGlwLT5pX2lub2RlLmlfdWlkLCBpcC0+aV9pbm9kZS5pX2dpZCk7CiAKLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwogCXJnZC0+cmRfZnJlZV9jbG9uZSAtPSAqbjsKLQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CiAJdHJhY2VfZ2ZzMl9ibG9ja19hbGxvYyhpcCwgYmxvY2ssICpuLCBHRlMyX0JMS1NUX1VTRUQpOwogCSpibiA9IGJsb2NrOwogCXJldHVybiAwOwpAQCAtMTU2NCw3ICsxMzgxLDcgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmRpcC0+aV9pbm9kZSk7CiAJc3RydWN0IGdmczJfYWxsb2MgKmFsID0gZGlwLT5pX2FsbG9jOwotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2QgPSBhbC0+YWxfcmdkOworCXN0cnVjdCBnZnMyX3JncnBkICpyZ2QgPSBkaXAtPmlfcmdkOwogCXUzMiBibGs7CiAJdTY0IGJsb2NrOwogCXVuc2lnbmVkIGludCBuID0gMTsKQEAgLTE1OTQsOSArMTQxMSw3IEBACiAJZ2ZzMl9zdGF0ZnNfY2hhbmdlKHNkcCwgMCwgLTEsICsxKTsKIAlnZnMyX3RyYW5zX2FkZF91bnJldm9rZShzZHAsIGJsb2NrLCAxKTsKIAotCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CiAJcmdkLT5yZF9mcmVlX2Nsb25lLS07Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwogCXRyYWNlX2dmczJfYmxvY2tfYWxsb2MoZGlwLCBibG9jaywgMSwgR0ZTMl9CTEtTVF9ESU5PREUpOwogCSpibiA9IGJsb2NrOwogCXJldHVybiAwOwpAQCAtMTYyOSw4ICsxNDQ0LDYgQEAKIAlnZnMyX3RyYW5zX2FkZF9iaChyZ2QtPnJkX2dsLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgsIDEpOwogCWdmczJfcmdycF9vdXQocmdkLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgtPmJfZGF0YSk7CiAKLQlnZnMyX3RyYW5zX2FkZF9yZyhyZ2QpOwotCiAJLyogRGlyZWN0b3JpZXMga2VlcCB0aGVpciBkYXRhIGluIHRoZSBtZXRhZGF0YSBhZGRyZXNzIHNwYWNlICovCiAJaWYgKG1ldGEgfHwgaXAtPmlfZGVwdGgpCiAJCWdmczJfbWV0YV93aXBlKGlwLCBic3RhcnQsIGJsZW4pOwpAQCAtMTY2Niw3ICsxNDc5LDYgQEAKIAl0cmFjZV9nZnMyX2Jsb2NrX2FsbG9jKGlwLCBibGtubywgMSwgR0ZTMl9CTEtTVF9VTkxJTktFRCk7CiAJZ2ZzMl90cmFuc19hZGRfYmgocmdkLT5yZF9nbCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLCAxKTsKIAlnZnMyX3JncnBfb3V0KHJnZCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLT5iX2RhdGEpOwotCWdmczJfdHJhbnNfYWRkX3JnKHJnZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfZnJlZV91bmluaXRfZGkoc3RydWN0IGdmczJfcmdycGQgKnJnZCwgdTY0IGJsa25vKQpAQCAtMTY4OCw3ICsxNTAwLDYgQEAKIAlnZnMyX3JncnBfb3V0KHJnZCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLT5iX2RhdGEpOwogCiAJZ2ZzMl9zdGF0ZnNfY2hhbmdlKHNkcCwgMCwgKzEsIC0xKTsKLQlnZnMyX3RyYW5zX2FkZF9yZyhyZ2QpOwogfQogCiAKQEAgLTE3MTQsNDEgKzE1MjUsMzMgQEAKIGludCBnZnMyX2NoZWNrX2Jsa190eXBlKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgbm9fYWRkciwgdW5zaWduZWQgaW50IHR5cGUpCiB7CiAJc3RydWN0IGdmczJfcmdycGQgKnJnZDsKLQlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgcmlfZ2gsIHJnZF9naDsKLQlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpOwotCWludCByaV9sb2NrZWQgPSAwOworCXN0cnVjdCBnZnMyX2hvbGRlciByZ2RfZ2g7CiAJaW50IGVycm9yOwogCi0JaWYgKCFnZnMyX2dsb2NrX2lzX2xvY2tlZF9ieV9tZShpcC0+aV9nbCkpIHsKLQkJZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJnJpX2doKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBmYWlsOwotCQlyaV9sb2NrZWQgPSAxOwotCX0KKwllcnJvciA9IGdmczJfcmluZGV4X3VwZGF0ZShzZHApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCiAJZXJyb3IgPSAtRUlOVkFMOwogCXJnZCA9IGdmczJfYmxrMnJncnBkKHNkcCwgbm9fYWRkcik7CiAJaWYgKCFyZ2QpCi0JCWdvdG8gZmFpbF9yaW5kZXg7CisJCWdvdG8gZmFpbDsKIAogCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KHJnZC0+cmRfZ2wsIExNX1NUX1NIQVJFRCwgMCwgJnJnZF9naCk7CiAJaWYgKGVycm9yKQotCQlnb3RvIGZhaWxfcmluZGV4OworCQlnb3RvIGZhaWw7CiAKIAlpZiAoZ2ZzMl9nZXRfYmxvY2tfdHlwZShyZ2QsIG5vX2FkZHIpICE9IHR5cGUpCiAJCWVycm9yID0gLUVTVEFMRTsKIAogCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZyZ2RfZ2gpOwotZmFpbF9yaW5kZXg6Ci0JaWYgKHJpX2xvY2tlZCkKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKIGZhaWw6CiAJcmV0dXJuIGVycm9yOwogfQogCiAvKioKICAqIGdmczJfcmxpc3RfYWRkIC0gYWRkIGEgUkcgdG8gYSBsaXN0IG9mIFJHcwotICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KKyAqIEBpcDogdGhlIGlub2RlCiAgKiBAcmxpc3Q6IHRoZSBsaXN0IG9mIHJlc291cmNlIGdyb3VwcwogICogQGJsb2NrOiB0aGUgYmxvY2sKICAqCkBAIC0xNzU4LDkgKzE1NjEsMTAgQEAKICAqCiAgKi8KIAotdm9pZCBnZnMyX3JsaXN0X2FkZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfcmdycF9saXN0ICpybGlzdCwKK3ZvaWQgZ2ZzMl9ybGlzdF9hZGQoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3QgKnJsaXN0LAogCQkgICAgdTY0IGJsb2NrKQogeworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7CiAJc3RydWN0IGdmczJfcmdycGQgKip0bXA7CiAJdW5zaWduZWQgaW50IG5ld19zcGFjZTsKQEAgLTE3NjksMTIgKzE1NzMsMTUgQEAKIAlpZiAoZ2ZzMl9hc3NlcnRfd2FybihzZHAsICFybGlzdC0+cmxfZ2hzKSkKIAkJcmV0dXJuOwogCi0JcmdkID0gZ2ZzMl9ibGsycmdycGQoc2RwLCBibG9jayk7CisJaWYgKGlwLT5pX3JnZCAmJiByZ3JwX2NvbnRhaW5zX2Jsb2NrKGlwLT5pX3JnZCwgYmxvY2spKQorCQlyZ2QgPSBpcC0+aV9yZ2Q7CisJZWxzZQorCQlyZ2QgPSBnZnMyX2JsazJyZ3JwZChzZHAsIGJsb2NrKTsKIAlpZiAoIXJnZCkgewotCQlpZiAoZ2ZzMl9jb25zaXN0KHNkcCkpCi0JCQlmc19lcnIoc2RwLCAiYmxvY2sgPSAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrKTsKKwkJZnNfZXJyKHNkcCwgInJsaXN0X2FkZDogbm8gcmdycCBmb3IgYmxvY2sgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jayk7CiAJCXJldHVybjsKIAl9CisJaXAtPmlfcmdkID0gcmdkOwogCiAJZm9yICh4ID0gMDsgeCA8IHJsaXN0LT5ybF9yZ3JwczsgeCsrKQogCQlpZiAocmxpc3QtPnJsX3JnZFt4XSA9PSByZ2QpCmRpZmYgLS1naXQgYS9mcy9nZnMyL3JncnAuaCBiL2ZzL2dmczIvcmdycC5oCmluZGV4IGQyNTNmOWEuLmNmNWM1MDEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmdycC5oCisrKyBiL2ZzL2dmczIvcmdycC5oCkBAIC0xOCwxOCArMTgsMTUgQEAKIAogZXh0ZXJuIHZvaWQgZ2ZzMl9yZ3JwX3ZlcmlmeShzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKIAotc3RydWN0IGdmczJfcmdycGQgKmdmczJfYmxrMnJncnBkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgYmxrKTsKLXN0cnVjdCBnZnMyX3JncnBkICpnZnMyX3JncnBkX2dldF9maXJzdChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7Ci1zdHJ1Y3QgZ2ZzMl9yZ3JwZCAqZ2ZzMl9yZ3JwZF9nZXRfbmV4dChzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKK2V4dGVybiBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqZ2ZzMl9ibGsycmdycGQoc3RydWN0IGdmczJfc2JkICpzZHAsIHU2NCBibGspOworZXh0ZXJuIHN0cnVjdCBnZnMyX3JncnBkICpnZnMyX3JncnBkX2dldF9maXJzdChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CitleHRlcm4gc3RydWN0IGdmczJfcmdycGQgKmdmczJfcmdycGRfZ2V0X25leHQoc3RydWN0IGdmczJfcmdycGQgKnJnZCk7CiAKIGV4dGVybiB2b2lkIGdmczJfY2xlYXJfcmdycGQoc3RydWN0IGdmczJfc2JkICpzZHApOwotZXh0ZXJuIGludCBnZnMyX3JpbmRleF9ob2xkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKnJpX2doKTsKLQotZXh0ZXJuIGludCBnZnMyX3JncnBfYmhfZ2V0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOwotZXh0ZXJuIHZvaWQgZ2ZzMl9yZ3JwX2JoX2hvbGQoc3RydWN0IGdmczJfcmdycGQgKnJnZCk7Ci1leHRlcm4gdm9pZCBnZnMyX3JncnBfYmhfcHV0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOwotCi1leHRlcm4gdm9pZCBnZnMyX3JncnBfcmVwb2xpc2hfY2xvbmVzKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOworZXh0ZXJuIGludCBnZnMyX3JpbmRleF91cGRhdGUoc3RydWN0IGdmczJfc2JkICpzZHApOworZXh0ZXJuIHZvaWQgZ2ZzMl9mcmVlX2Nsb25lcyhzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKK2V4dGVybiBpbnQgZ2ZzMl9yZ3JwX2dvX2xvY2soc3RydWN0IGdmczJfaG9sZGVyICpnaCk7CitleHRlcm4gdm9pZCBnZnMyX3JncnBfZ29fdW5sb2NrKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpOwogCiBleHRlcm4gc3RydWN0IGdmczJfYWxsb2MgKmdmczJfYWxsb2NfZ2V0KHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiBzdGF0aWMgaW5saW5lIHZvaWQgZ2ZzMl9hbGxvY19wdXQoc3RydWN0IGdmczJfaW5vZGUgKmlwKQpAQCAtMzksMTYgKzM2LDkgQEAKIAlpcC0+aV9hbGxvYyA9IE5VTEw7CiB9CiAKLWV4dGVybiBpbnQgZ2ZzMl9pbnBsYWNlX3Jlc2VydmVfaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGludCBob2xkX3JpbmRleCwKLQkJCQkgIGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKTsKLSNkZWZpbmUgZ2ZzMl9pbnBsYWNlX3Jlc2VydmUoaXApIFwKLQlnZnMyX2lucGxhY2VfcmVzZXJ2ZV9pKChpcCksIDEsIF9fRklMRV9fLCBfX0xJTkVfXykKLSNkZWZpbmUgZ2ZzMl9pbnBsYWNlX3Jlc2VydmVfcmkoaXApIFwKLQlnZnMyX2lucGxhY2VfcmVzZXJ2ZV9pKChpcCksIDAsIF9fRklMRV9fLCBfX0xJTkVfXykKLQorZXh0ZXJuIGludCBnZnMyX2lucGxhY2VfcmVzZXJ2ZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogZXh0ZXJuIHZvaWQgZ2ZzMl9pbnBsYWNlX3JlbGVhc2Uoc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIAotZXh0ZXJuIGludCBnZnMyX3JpX3VwZGF0ZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogZXh0ZXJuIGludCBnZnMyX2FsbG9jX2Jsb2NrKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0ICpibiwgdW5zaWduZWQgaW50ICpuKTsKIGV4dGVybiBpbnQgZ2ZzMl9hbGxvY19kaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCAqYm4sIHU2NCAqZ2VuZXJhdGlvbik7CiAKQEAgLTY2LDExICs1NiwxNCBAQAogCXN0cnVjdCBnZnMyX2hvbGRlciAqcmxfZ2hzOwogfTsKIAotZXh0ZXJuIHZvaWQgZ2ZzMl9ybGlzdF9hZGQoc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3JncnBfbGlzdCAqcmxpc3QsCitleHRlcm4gdm9pZCBnZnMyX3JsaXN0X2FkZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBnZnMyX3JncnBfbGlzdCAqcmxpc3QsCiAJCQkgICB1NjQgYmxvY2spOwogZXh0ZXJuIHZvaWQgZ2ZzMl9ybGlzdF9hbGxvYyhzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3QgKnJsaXN0LCB1bnNpZ25lZCBpbnQgc3RhdGUpOwogZXh0ZXJuIHZvaWQgZ2ZzMl9ybGlzdF9mcmVlKHN0cnVjdCBnZnMyX3JncnBfbGlzdCAqcmxpc3QpOwogZXh0ZXJuIHU2NCBnZnMyX3JpX3RvdGFsKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIGV4dGVybiBpbnQgZ2ZzMl9yZ3JwX2R1bXAoc3RydWN0IHNlcV9maWxlICpzZXEsIGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CitleHRlcm4gdm9pZCBnZnMyX3JncnBfc2VuZF9kaXNjYXJkcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IG9mZnNldCwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGdmczJfYml0bWFwICpiaSk7CiAKICNlbmRpZiAvKiBfX1JHUlBfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zdXBlci5jIGIvZnMvZ2ZzMi9zdXBlci5jCmluZGV4IGI3YmVhZGQuLjcxZTQyMDkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvc3VwZXIuYworKysgYi9mcy9nZnMyL3N1cGVyLmMKQEAgLTc1Miw0NyArNzUyLDE1IEBACiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWV0YW1hcHBpbmcgPSBnZnMyX2dsb2NrMmFzcGFjZShpcC0+aV9nbCk7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG1ldGFtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwotCXN0cnVjdCBnZnMyX2hvbGRlciBnaDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCXN0cnVjdCB0aW1lc3BlYyBhdGltZTsKLQlzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKmRpOwotCWludCByZXQgPSAtRUFHQUlOOwotCWludCB1bmxvY2tfcmVxdWlyZWQgPSAwOworCWludCByZXQgPSAwOwogCi0JLyogU2tpcCB0aW1lc3RhbXAgdXBkYXRlLCBpZiB0aGlzIGlzIGZyb20gYSBtZW1hbGxvYyAqLwotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKQotCQlnb3RvIGRvX2ZsdXNoOwotCWlmICghZ2ZzMl9nbG9ja19pc19sb2NrZWRfYnlfbWUoaXAtPmlfZ2wpKSB7Ci0JCXJldCA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCAmZ2gpOwotCQlpZiAocmV0KQotCQkJZ290byBkb19mbHVzaDsKLQkJdW5sb2NrX3JlcXVpcmVkID0gMTsKLQl9Ci0JcmV0ID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIFJFU19ESU5PREUsIDApOwotCWlmIChyZXQpCi0JCWdvdG8gZG9fdW5sb2NrOwotCXJldCA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIoaXAsICZiaCk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCWRpID0gKHN0cnVjdCBnZnMyX2Rpbm9kZSAqKWJoLT5iX2RhdGE7Ci0JCWF0aW1lLnR2X3NlYyA9IGJlNjRfdG9fY3B1KGRpLT5kaV9hdGltZSk7Ci0JCWF0aW1lLnR2X25zZWMgPSBiZTMyX3RvX2NwdShkaS0+ZGlfYXRpbWVfbnNlYyk7Ci0JCWlmICh0aW1lc3BlY19jb21wYXJlKCZpbm9kZS0+aV9hdGltZSwgJmF0aW1lKSA+IDApIHsKLQkJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBiaCwgMSk7Ci0JCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGJoLT5iX2RhdGEpOwotCQl9Ci0JCWJyZWxzZShiaCk7Ci0JfQotCWdmczJfdHJhbnNfZW5kKHNkcCk7Ci1kb191bmxvY2s6Ci0JaWYgKHVubG9ja19yZXF1aXJlZCkKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmdoKTsKLWRvX2ZsdXNoOgogCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkKIAkJZ2ZzMl9sb2dfZmx1c2goR0ZTMl9TQihpbm9kZSksIGlwLT5pX2dsKTsKLQlmaWxlbWFwX2ZkYXRhd3JpdGUobWV0YW1hcHBpbmcpOwogCWlmIChiZGktPmRpcnR5X2V4Y2VlZGVkKQogCQlnZnMyX2FpbDFfZmx1c2goc2RwLCB3YmMpOwotCWlmICghcmV0ICYmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkpCisJZWxzZQorCQlmaWxlbWFwX2ZkYXRhd3JpdGUobWV0YW1hcHBpbmcpOworCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkKIAkJcmV0ID0gZmlsZW1hcF9mZGF0YXdhaXQobWV0YW1hcHBpbmcpOwogCWlmIChyZXQpCiAJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CkBAIC04MDAsNiArNzY4LDY0IEBACiB9CiAKIC8qKgorICogZ2ZzMl9kaXJ0eV9pbm9kZSAtIGNoZWNrIGZvciBhdGltZSB1cGRhdGVzCisgKiBAaW5vZGU6IFRoZSBpbm9kZSBpbiBxdWVzdGlvbgorICogQGZsYWdzOiBUaGUgdHlwZSBvZiBkaXJ0eQorICoKKyAqIFVuZm9ydHVuYXRlbHkgaXQgY2FuIGJlIGNhbGxlZCB1bmRlciBhbnkgY29tYmluYXRpb24gb2YgaW5vZGUKKyAqIGdsb2NrIGFuZCB0cmFuc2FjdGlvbiBsb2NrLCBzbyB3ZSBoYXZlIHRvIGNoZWNrIGNhcmVmdWxseS4KKyAqCisgKiBBdCB0aGUgbW9tZW50IHRoaXMgZGVhbHMgb25seSB3aXRoIGF0aW1lIC0gaXQgc2hvdWxkIGJlIHBvc3NpYmxlCisgKiB0byBleHBhbmQgdGhhdCByb2xlIGluIGZ1dHVyZSwgb25jZSBhIHJldmlldyBvZiB0aGUgbG9ja2luZyBoYXMKKyAqIGJlZW4gY2FycmllZCBvdXQuCisgKi8KKworc3RhdGljIHZvaWQgZ2ZzMl9kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGdmczJfaG9sZGVyIGdoOworCWludCBuZWVkX3VubG9jayA9IDA7CisJaW50IG5lZWRfZW5kdHJhbnMgPSAwOworCWludCByZXQ7CisKKwlpZiAoIShmbGFncyAmIChJX0RJUlRZX0RBVEFTWU5DfElfRElSVFlfU1lOQykpKQorCQlyZXR1cm47CisKKwlpZiAoIWdmczJfZ2xvY2tfaXNfbG9ja2VkX2J5X21lKGlwLT5pX2dsKSkgeworCQlyZXQgPSBnZnMyX2dsb2NrX25xX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmdoKTsKKwkJaWYgKHJldCkgeworCQkJZnNfZXJyKHNkcCwgImRpcnR5X2lub2RlOiBnbG9jayAlZFxuIiwgcmV0KTsKKwkJCXJldHVybjsKKwkJfQorCQluZWVkX3VubG9jayA9IDE7CisJfQorCisJaWYgKGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9PSBOVUxMKSB7CisJCXJldCA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCBSRVNfRElOT0RFLCAwKTsKKwkJaWYgKHJldCkgeworCQkJZnNfZXJyKHNkcCwgImRpcnR5X2lub2RlOiBnZnMyX3RyYW5zX2JlZ2luICVkXG4iLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJbmVlZF9lbmR0cmFucyA9IDE7CisJfQorCisJcmV0ID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmJoKTsKKwlpZiAocmV0ID09IDApIHsKKwkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGJoLCAxKTsKKwkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBiaC0+Yl9kYXRhKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisKKwlpZiAobmVlZF9lbmR0cmFucykKKwkJZ2ZzMl90cmFuc19lbmQoc2RwKTsKK291dDoKKwlpZiAobmVlZF91bmxvY2spCisJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZnaCk7Cit9CisKKy8qKgogICogZ2ZzMl9tYWtlX2ZzX3JvIC0gVHVybiBhIFJlYWQtV3JpdGUgRlMgaW50byBhIFJlYWQtT25seSBvbmUKICAqIEBzZHA6IHRoZSBmaWxlc3lzdGVtCiAgKgpAQCAtMTAxMSw3ICsxMDM3LDYgQEAKIAogc3RhdGljIGludCBnZnMyX3N0YXRmc19zbG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQogewotCXN0cnVjdCBnZnMyX2hvbGRlciByaV9naDsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkX25leHQ7CiAJc3RydWN0IGdmczJfaG9sZGVyICpnaGEsICpnaDsKIAl1bnNpZ25lZCBpbnQgc2xvdHMgPSA2NDsKQEAgLTEwMjQsMTAgKzEwNDksNiBAQAogCWlmICghZ2hhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChzZHAsICZyaV9naCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dDsKLQogCXJnZF9uZXh0ID0gZ2ZzMl9yZ3JwZF9nZXRfZmlyc3Qoc2RwKTsKIAogCWZvciAoOzspIHsKQEAgLTEwNzAsOSArMTA5MSw2IEBACiAJCXlpZWxkKCk7CiAJfQogCi0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKLQotb3V0OgogCWtmcmVlKGdoYSk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMTEyNCw2ICsxMTQyLDEwIEBACiAJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0IHNjOwogCWludCBlcnJvcjsKIAorCWVycm9yID0gZ2ZzMl9yaW5kZXhfdXBkYXRlKHNkcCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKIAlpZiAoZ2ZzMl90dW5lX2dldChzZHAsIGd0X3N0YXRmc19zbG93KSkKIAkJZXJyb3IgPSBnZnMyX3N0YXRmc19zbG93KHNkcCwgJnNjKTsKIAllbHNlCkBAIC0xMzk0LDIxICsxNDE2LDE3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChzZHAsICZhbC0+YWxfcmlfZ2gpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfcXM7Ci0KIAlyZ2QgPSBnZnMyX2JsazJyZ3JwZChzZHAsIGlwLT5pX25vX2FkZHIpOwogCWlmICghcmdkKSB7CiAJCWdmczJfY29uc2lzdF9pbm9kZShpcCk7CiAJCWVycm9yID0gLUVJTzsKLQkJZ290byBvdXRfcmluZGV4X3JlbHNlOworCQlnb3RvIG91dF9xczsKIAl9CiAKIAllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChyZ2QtPnJkX2dsLCBMTV9TVF9FWENMVVNJVkUsIDAsCiAJCQkJICAgJmFsLT5hbF9yZ2RfZ2gpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXRfcmluZGV4X3JlbHNlOworCQlnb3RvIG91dF9xczsKIAogCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIFJFU19SR19CSVQgKyBSRVNfU1RBVEZTICsgUkVTX1FVT1RBLAogCQkJCSBzZHAtPnNkX2pkZXNjLT5qZF9ibG9ja3MpOwpAQCAtMTQyMyw4ICsxNDQxLDYgQEAKIAogb3V0X3JnX2d1bmxvY2s6CiAJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmFsLT5hbF9yZ2RfZ2gpOwotb3V0X3JpbmRleF9yZWxzZToKLQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmYWwtPmFsX3JpX2doKTsKIG91dF9xczoKIAlnZnMyX3F1b3RhX3VuaG9sZChpcCk7CiBvdXQ6CkBAIC0xNDcxLDkgKzE0ODcsMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZXJyb3IgPSBnZnMyX2NoZWNrX2Jsa190eXBlKHNkcCwgaXAtPmlfbm9fYWRkciwgR0ZTMl9CTEtTVF9VTkxJTktFRCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF90cnVuY2F0ZTsKKwlpZiAoIXRlc3RfYml0KEdJRl9BTExPQ19GQUlMRUQsICZpcC0+aV9mbGFncykpIHsKKwkJZXJyb3IgPSBnZnMyX2NoZWNrX2Jsa190eXBlKHNkcCwgaXAtPmlfbm9fYWRkciwgR0ZTMl9CTEtTVF9VTkxJTktFRCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X3RydW5jYXRlOworCX0KIAogCWlmICh0ZXN0X2JpdChHSUZfSU5WQUxJRCwgJmlwLT5pX2ZsYWdzKSkgewogCQllcnJvciA9IGdmczJfaW5vZGVfcmVmcmVzaChpcCk7CkBAIC0xNTEzLDYgKzE1MzEsMTAgQEAKIAlnb3RvIG91dF91bmxvY2s7CiAKIG91dF90cnVuY2F0ZToKKwlnZnMyX2xvZ19mbHVzaChzZHAsIGlwLT5pX2dsKTsKKwl3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDEpOworCWdmczJfYWlsX2ZsdXNoKGlwLT5pX2dsLCAwKTsKKwogCS8qIENhc2UgMiBzdGFydHMgaGVyZSAqLwogCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIDAsIHNkcC0+c2RfamRlc2MtPmpkX2Jsb2Nrcyk7CiAJaWYgKGVycm9yKQpAQCAtMTU1Miw2ICsxNTc0LDcgQEAKIAlpZiAoaXApIHsKIAkJaXAtPmlfZmxhZ3MgPSAwOwogCQlpcC0+aV9nbCA9IE5VTEw7CisJCWlwLT5pX3JnZCA9IE5VTEw7CiAJfQogCXJldHVybiAmaXAtPmlfaW5vZGU7CiB9CkBAIC0xNTcyLDYgKzE1OTUsNyBAQAogCS5hbGxvY19pbm9kZQkJPSBnZnMyX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlCQk9IGdmczJfZGVzdHJveV9pbm9kZSwKIAkud3JpdGVfaW5vZGUJCT0gZ2ZzMl93cml0ZV9pbm9kZSwKKwkuZGlydHlfaW5vZGUJCT0gZ2ZzMl9kaXJ0eV9pbm9kZSwKIAkuZXZpY3RfaW5vZGUJCT0gZ2ZzMl9ldmljdF9pbm9kZSwKIAkucHV0X3N1cGVyCQk9IGdmczJfcHV0X3N1cGVyLAogCS5zeW5jX2ZzCQk9IGdmczJfc3luY19mcywKZGlmZiAtLWdpdCBhL2ZzL2dmczIvdHJhbnMuYyBiL2ZzL2dmczIvdHJhbnMuYwppbmRleCA5ZWM3M2E4Li44NmFjNzVkIDEwMDY0NAotLS0gYS9mcy9nZnMyL3RyYW5zLmMKKysrIGIvZnMvZ2ZzMi90cmFucy5jCkBAIC0xODUsOCArMTg1LDMgQEAKIAlnZnMyX2xvZ191bmxvY2soc2RwKTsKIH0KIAotdm9pZCBnZnMyX3RyYW5zX2FkZF9yZyhzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKQotewotCWxvcHNfYWRkKHJnZC0+cmRfc2JkLCAmcmdkLT5yZF9sZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvdHJhbnMuaCBiL2ZzL2dmczIvdHJhbnMuaAppbmRleCBmYjU2Yjc4Li5mOGYxMDFlIDEwMDY0NAotLS0gYS9mcy9nZnMyL3RyYW5zLmgKKysrIGIvZnMvZ2ZzMi90cmFucy5oCkBAIC0yOCwyMCArMjgsMjAgQEAKIAogLyogcmVzZXJ2ZSBlaXRoZXIgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIHBsdXMgdGhlIHJnIGhlYWRlcgogICogYmxvY2ssIG9yIGFsbCBvZiB0aGUgYmxvY2tzIGluIHRoZSByZywgd2hpY2hldmVyIGlzIHNtYWxsZXIgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdmczJfcmdfYmxvY2tzKGNvbnN0IHN0cnVjdCBnZnMyX2FsbG9jICphbCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdmczJfcmdfYmxvY2tzKGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCkKIHsKLQlyZXR1cm4gKGFsLT5hbF9yZXF1ZXN0ZWQgPCBhbC0+YWxfcmdkLT5yZF9sZW5ndGgpPwotCSAgICAgICBhbC0+YWxfcmVxdWVzdGVkICsgMSA6IGFsLT5hbF9yZ2QtPnJkX2xlbmd0aDsKKwljb25zdCBzdHJ1Y3QgZ2ZzMl9hbGxvYyAqYWwgPSBpcC0+aV9hbGxvYzsKKwlpZiAoYWwtPmFsX3JlcXVlc3RlZCA8IGlwLT5pX3JnZC0+cmRfbGVuZ3RoKQorCQlyZXR1cm4gYWwtPmFsX3JlcXVlc3RlZCArIDE7CisJcmV0dXJuIGlwLT5pX3JnZC0+cmRfbGVuZ3RoOwogfQogCi1pbnQgZ2ZzMl90cmFuc19iZWdpbihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdW5zaWduZWQgaW50IGJsb2NrcywKLQkJICAgICB1bnNpZ25lZCBpbnQgcmV2b2tlcyk7CitleHRlcm4gaW50IGdmczJfdHJhbnNfYmVnaW4oc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBibG9ja3MsCisJCQkgICAgdW5zaWduZWQgaW50IHJldm9rZXMpOwogCi12b2lkIGdmczJfdHJhbnNfZW5kKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKLQotdm9pZCBnZnMyX3RyYW5zX2FkZF9iaChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBtZXRhKTsKLXZvaWQgZ2ZzMl90cmFuc19hZGRfcmV2b2tlKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9idWZkYXRhICpiZCk7Ci12b2lkIGdmczJfdHJhbnNfYWRkX3VucmV2b2tlKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgYmxrbm8sIHVuc2lnbmVkIGludCBsZW4pOwotdm9pZCBnZnMyX3RyYW5zX2FkZF9yZyhzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKK2V4dGVybiB2b2lkIGdmczJfdHJhbnNfZW5kKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK2V4dGVybiB2b2lkIGdmczJfdHJhbnNfYWRkX2JoKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IG1ldGEpOworZXh0ZXJuIHZvaWQgZ2ZzMl90cmFuc19hZGRfcmV2b2tlKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9idWZkYXRhICpiZCk7CitleHRlcm4gdm9pZCBnZnMyX3RyYW5zX2FkZF91bnJldm9rZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IGJsa25vLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAogI2VuZGlmIC8qIF9fVFJBTlNfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi94YXR0ci5jIGIvZnMvZ2ZzMi94YXR0ci5jCmluZGV4IDQzOWI2MWMwLi43MWQ3YmY4IDEwMDY0NAotLS0gYS9mcy9nZnMyL3hhdHRyLmMKKysrIGIvZnMvZ2ZzMi94YXR0ci5jCkBAIC0zMzIsMTUgKzMzMiw4IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9hbGxvYzsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChHRlMyX1NCKCZpcC0+aV9pbm9kZSksICZhbC0+YWxfcmlfZ2gpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfcXVvdGE7Ci0KIAllcnJvciA9IGVhX2RlYWxsb2NfdW5zdHVmZmVkKGlwLCBiaCwgZWEsIHByZXYsIChsZWF2ZSkgPyAmZXJyb3IgOiBOVUxMKTsKIAotCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmlfZ2gpOwotCi1vdXRfcXVvdGE6CiAJZ2ZzMl9xdW90YV91bmhvbGQoaXApOwogb3V0X2FsbG9jOgogCWdmczJfYWxsb2NfcHV0KGlwKTsKQEAgLTczNCw3ICs3MjcsNyBAQAogCQlnb3RvIG91dF9ndW5sb2NrX3E7CiAKIAllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oR0ZTMl9TQigmaXAtPmlfaW5vZGUpLAotCQkJCSBibGtzICsgZ2ZzMl9yZ19ibG9ja3MoYWwpICsKKwkJCQkgYmxrcyArIGdmczJfcmdfYmxvY2tzKGlwKSArCiAJCQkJIFJFU19ESU5PREUgKyBSRVNfU1RBVEZTICsgUkVTX1FVT1RBLCAwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2lwcmVzOwpAQCAtMTI5Niw3ICsxMjg5LDggQEAKIAogaW50IGdmczJfeGF0dHJfYWNsX2NobW9kKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGlhdHRyICphdHRyLCBjaGFyICpkYXRhKQogewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmaXAtPmlfaW5vZGU7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9lYV9sb2NhdGlvbiBlbDsKIAlpbnQgZXJyb3I7CiAKQEAgLTEzMTksNyArMTMxMyw3IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaXAsIGF0dHIpOworCWVycm9yID0gZ2ZzMl9zZXRhdHRyX3NpbXBsZShpbm9kZSwgYXR0cik7CiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xMzYyLDE0ICsxMzU2LDE0IEBACiAJCQlibGVuKys7CiAJCWVsc2UgewogCQkJaWYgKGJzdGFydCkKLQkJCQlnZnMyX3JsaXN0X2FkZChzZHAsICZybGlzdCwgYnN0YXJ0KTsKKwkJCQlnZnMyX3JsaXN0X2FkZChpcCwgJnJsaXN0LCBic3RhcnQpOwogCQkJYnN0YXJ0ID0gYm47CiAJCQlibGVuID0gMTsKIAkJfQogCQlibGtzKys7CiAJfQogCWlmIChic3RhcnQpCi0JCWdmczJfcmxpc3RfYWRkKHNkcCwgJnJsaXN0LCBic3RhcnQpOworCQlnZnMyX3JsaXN0X2FkZChpcCwgJnJsaXN0LCBic3RhcnQpOwogCWVsc2UKIAkJZ290byBvdXQ7CiAKQEAgLTE1MDEsMjQgKzE0OTUsMTggQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2FsbG9jOwogCi0JZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKEdGUzJfU0IoJmlwLT5pX2lub2RlKSwgJmFsLT5hbF9yaV9naCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9xdW90YTsKLQogCWVycm9yID0gZWFfZm9yZWFjaChpcCwgZWFfZGVhbGxvY191bnN0dWZmZWQsIE5VTEwpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXRfcmluZGV4OworCQlnb3RvIG91dF9xdW90YTsKIAogCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FQV9JTkRJUkVDVCkgewogCQllcnJvciA9IGVhX2RlYWxsb2NfaW5kaXJlY3QoaXApOwogCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dF9yaW5kZXg7CisJCQlnb3RvIG91dF9xdW90YTsKIAl9CiAKIAllcnJvciA9IGVhX2RlYWxsb2NfYmxvY2soaXApOwogCi1vdXRfcmluZGV4OgotCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmlfZ2gpOwogb3V0X3F1b3RhOgogCWdmczJfcXVvdGFfdW5ob2xkKGlwKTsKIG91dF9hbGxvYzoKZGlmZiAtLWdpdCBhL2ZzL2hmcy9idHJlZS5jIGIvZnMvaGZzL2J0cmVlLmMKaW5kZXggM2ViYzQzNy4uMWNiZGVlYSAxMDA2NDQKLS0tIGEvZnMvaGZzL2J0cmVlLmMKKysrIGIvZnMvaGZzL2J0cmVlLmMKQEAgLTQ2LDExICs0NiwyNiBAQAogCWNhc2UgSEZTX0VYVF9DTklEOgogCQloZnNfaW5vZGVfcmVhZF9mb3JrKHRyZWUtPmlub2RlLCBtZGItPmRyWFRFeHRSZWMsIG1kYi0+ZHJYVEZsU2l6ZSwKIAkJCQkgICAgbWRiLT5kclhURmxTaXplLCBiZTMyX3RvX2NwdShtZGItPmRyWFRDbHBTaXopKTsKKwkJaWYgKEhGU19JKHRyZWUtPmlub2RlKS0+YWxsb2NfYmxvY2tzID4KKwkJCQkJSEZTX0kodHJlZS0+aW5vZGUpLT5maXJzdF9ibG9ja3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBpbnZhbGlkIGJ0cmVlIGV4dGVudCByZWNvcmRzXG4iKTsKKwkJCXVubG9ja19uZXdfaW5vZGUodHJlZS0+aW5vZGUpOworCQkJZ290byBmcmVlX2lub2RlOworCQl9CisKIAkJdHJlZS0+aW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaGZzX2J0cmVlX2FvcHM7CiAJCWJyZWFrOwogCWNhc2UgSEZTX0NBVF9DTklEOgogCQloZnNfaW5vZGVfcmVhZF9mb3JrKHRyZWUtPmlub2RlLCBtZGItPmRyQ1RFeHRSZWMsIG1kYi0+ZHJDVEZsU2l6ZSwKIAkJCQkgICAgbWRiLT5kckNURmxTaXplLCBiZTMyX3RvX2NwdShtZGItPmRyQ1RDbHBTaXopKTsKKworCQlpZiAoIUhGU19JKHRyZWUtPmlub2RlKS0+Zmlyc3RfYmxvY2tzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImhmczogaW52YWxpZCBidHJlZSBleHRlbnQgcmVjb3JkcyAiCisJCQkJCQkJCSIoMCBzaXplKS5cbiIpOworCQkJdW5sb2NrX25ld19pbm9kZSh0cmVlLT5pbm9kZSk7CisJCQlnb3RvIGZyZWVfaW5vZGU7CisJCX0KKwogCQl0cmVlLT5pbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNfYnRyZWVfYW9wczsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTU5LDExICs3NCw2IEBACiAJfQogCXVubG9ja19uZXdfaW5vZGUodHJlZS0+aW5vZGUpOwogCi0JaWYgKCFIRlNfSSh0cmVlLT5pbm9kZSktPmZpcnN0X2Jsb2NrcykgewotCQlwcmludGsoS0VSTl9FUlIgImhmczogaW52YWxpZCBidHJlZSBleHRlbnQgcmVjb3JkcyAoMCBzaXplKS5cbiIpOwotCQlnb3RvIGZyZWVfaW5vZGU7Ci0JfQotCiAJbWFwcGluZyA9IHRyZWUtPmlub2RlLT5pX21hcHBpbmc7CiAJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIDAsIE5VTEwpOwogCWlmIChJU19FUlIocGFnZSkpCmRpZmYgLS1naXQgYS9mcy9oZnMvZGlyLmMgYi9mcy9oZnMvZGlyLmMKaW5kZXggYjRkNzBiMS4uYmNlNGVlZiAxMDA2NDQKLS0tIGEvZnMvaGZzL2Rpci5jCisrKyBiL2ZzL2hmcy9kaXIuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKIAlyZXMgPSBoZnNfY2F0X2NyZWF0ZShpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CiAJaWYgKHJlcykgewotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJaGZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gcmVzOwpAQCAtMjI3LDcgKzIyNyw3IEBACiAKIAlyZXMgPSBoZnNfY2F0X2NyZWF0ZShpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CiAJaWYgKHJlcykgewotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJaGZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvZnMvaGZzL2lub2RlLmMgYi9mcy9oZnMvaW5vZGUuYwppbmRleCA5NmExYjYyLi5hMWE5ZmRjIDEwMDY0NAotLS0gYS9mcy9oZnMvaW5vZGUuYworKysgYi9mcy9oZnMvaW5vZGUuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCWlub2RlLT5pX2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCUhGU19JKGlub2RlKS0+ZmxhZ3MgPSAwOwogCUhGU19JKGlub2RlKS0+cnNyY19pbm9kZSA9IE5VTEw7CkBAIC0zMTMsNyArMzEzLDcgQEAKIAkvKiBJbml0aWFsaXplIHRoZSBpbm9kZSAqLwogCWlub2RlLT5pX3VpZCA9IGhzYi0+c191aWQ7CiAJaW5vZGUtPmlfZ2lkID0gaHNiLT5zX2dpZDsKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAogCWlmIChpZGF0YS0+a2V5KQogCQlIRlNfSShpbm9kZSktPmNhdF9rZXkgPSAqaWRhdGEtPmtleTsKZGlmZiAtLWdpdCBhL2ZzL2hmcy90cmFucy5jIGIvZnMvaGZzL3RyYW5zLmMKaW5kZXggZTY3M2E4OC4uYjFjZTRjNyAxMDA2NDQKLS0tIGEvZnMvaGZzL3RyYW5zLmMKKysrIGIvZnMvaGZzL3RyYW5zLmMKQEAgLTQwLDYgKzQwLDggQEAKIAogCXNyYyA9IGluLT5uYW1lOwogCXNyY2xlbiA9IGluLT5sZW47CisJaWYgKHNyY2xlbiA+IEhGU19OQU1FTEVOKQorCQlzcmNsZW4gPSBIRlNfTkFNRUxFTjsKIAlkc3QgPSBvdXQ7CiAJZHN0bGVuID0gSEZTX01BWF9OQU1FTEVOOwogCWlmIChubHNfaW8pIHsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvZGlyLmMgYi9mcy9oZnNwbHVzL2Rpci5jCmluZGV4IDI1YjI0NDMuLjQ1MzZjZDMgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvZGlyLmMKKysrIGIvZnMvaGZzcGx1cy9kaXIuYwpAQCAtNDE1LDcgKzQxNSw3IEBACiAJZ290byBvdXQ7CiAKIG91dF9lcnI6Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKGlub2RlKTsKIAloZnNwbHVzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CiAJaXB1dChpbm9kZSk7CiBvdXQ6CkBAIC00NDAsNyArNDQwLDcgQEAKIAogCXJlcyA9IGhmc3BsdXNfY3JlYXRlX2NhdChpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CiAJaWYgKHJlcykgewotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2lub2RlLmMgYi9mcy9oZnNwbHVzL2lub2RlLmMKaW5kZXggNGNjMWUzYS4uNDBlMTQxMyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9pbm9kZS5jCisrKyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwpAQCAtMzkxLDcgKzM5MSw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCWlub2RlLT5pX2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCiAJaGlwID0gSEZTUExVU19JKGlub2RlKTsKQEAgLTUxMiw3ICs1MTIsNyBAQAogCQloZnNfYm5vZGVfcmVhZChmZC0+Ym5vZGUsICZlbnRyeSwgZmQtPmVudHJ5b2Zmc2V0LAogCQkJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZvbGRlcikpOwogCQloZnNwbHVzX2dldF9wZXJtcyhpbm9kZSwgJmZvbGRlci0+cGVybWlzc2lvbnMsIDEpOwotCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCXNldF9ubGluayhpbm9kZSwgMSk7CiAJCWlub2RlLT5pX3NpemUgPSAyICsgYmUzMl90b19jcHUoZm9sZGVyLT52YWxlbmNlKTsKIAkJaW5vZGUtPmlfYXRpbWUgPSBoZnNwX210MnV0KGZvbGRlci0+YWNjZXNzX2RhdGUpOwogCQlpbm9kZS0+aV9tdGltZSA9IGhmc3BfbXQydXQoZm9sZGVyLT5jb250ZW50X21vZF9kYXRlKTsKQEAgLTUzMiwxMSArNTMyLDExIEBACiAJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCBIRlNQTFVTX0lTX1JTUkMoaW5vZGUpID8KIAkJCQkJJmZpbGUtPnJzcmNfZm9yayA6ICZmaWxlLT5kYXRhX2ZvcmspOwogCQloZnNwbHVzX2dldF9wZXJtcyhpbm9kZSwgJmZpbGUtPnBlcm1pc3Npb25zLCAwKTsKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkJaWYgKGZpbGUtPnBlcm1pc3Npb25zLmRldikKLQkJCQlpbm9kZS0+aV9ubGluayA9Ci0JCQkJCWJlMzJfdG9fY3B1KGZpbGUtPnBlcm1pc3Npb25zLmRldik7CisJCQkJc2V0X25saW5rKGlub2RlLAorCQkJCQkgIGJlMzJfdG9fY3B1KGZpbGUtPnBlcm1pc3Npb25zLmRldikpOwogCQkJaW5vZGUtPmlfb3AgPSAmaGZzcGx1c19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCQlpbm9kZS0+aV9mb3AgPSAmaGZzcGx1c19maWxlX29wZXJhdGlvbnM7CiAJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNwbHVzX2FvcHM7CmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCmluZGV4IDBkMjJhZmQuLjJmNzJkYTUgMTAwNjQ0Ci0tLSBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCisrKyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCkBAIC01NDEsNyArNTQxLDcgQEAKIAogCWluby0+aV9pbm8gPSBzdC5pbm87CiAJaW5vLT5pX21vZGUgPSBzdC5tb2RlOwotCWluby0+aV9ubGluayA9IHN0Lm5saW5rOworCXNldF9ubGluayhpbm8sIHN0Lm5saW5rKTsKIAlpbm8tPmlfdWlkID0gc3QudWlkOwogCWluby0+aV9naWQgPSBzdC5naWQ7CiAJaW5vLT5pX2F0aW1lID0gc3QuYXRpbWU7CmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfdXNlci5jCmluZGV4IGQ1MWE5ODM4Li5kZDdiYzM4IDEwMDY0NAotLS0gYS9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYworKysgYi9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPHN5cy92ZnMuaD4KICNpbmNsdWRlICJob3N0ZnMuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlIDx1dGltZS5oPgogCiBzdGF0aWMgdm9pZCBzdGF0NjRfdG9faG9zdGZzKGNvbnN0IHN0cnVjdCBzdGF0NjQgKmJ1Ziwgc3RydWN0IGhvc3Rmc19zdGF0ICpwKQpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9kaXIuYyBiL2ZzL2hwZnMvZGlyLmMKaW5kZXggOTZhOGVkOS4uMmZhMDA4OSAxMDA2NDQKLS0tIGEvZnMvaHBmcy9kaXIuYworKysgYi9mcy9ocGZzL2Rpci5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJCXJlc3VsdC0+aV9tb2RlICY9IH4wMTExOwogCQkJcmVzdWx0LT5pX29wID0gJmhwZnNfZmlsZV9pb3BzOwogCQkJcmVzdWx0LT5pX2ZvcCA9ICZocGZzX2ZpbGVfb3BzOwotCQkJcmVzdWx0LT5pX25saW5rID0gMTsKKwkJCXNldF9ubGluayhyZXN1bHQsIDEpOwogCQl9CiAJCXVubG9ja19uZXdfaW5vZGUocmVzdWx0KTsKIAl9CmRpZmYgLS1naXQgYS9mcy9ocGZzL2hwZnNfZm4uaCBiL2ZzL2hwZnMvaHBmc19mbi5oCmluZGV4IDMzMWI1ZTIuLmRlOTQ2MTcgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvaHBmc19mbi5oCisrKyBiL2ZzL2hwZnMvaHBmc19mbi5oCkBAIC0zMTEsOCArMzExLDggQEAKIAogLyogc3VwZXIuYyAqLwogCi12b2lkIGhwZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgLi4uKQotCV9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworX19wcmludGYoMiwgMykKK3ZvaWQgaHBmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogaW50IGhwZnNfc3RvcF9jeWNsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50ICosIGludCAqLCBjaGFyICopOwogdW5zaWduZWQgaHBmc19jb3VudF9vbmVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubyk7CiAKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvaW5vZGUuYyBiL2ZzL2hwZnMvaW5vZGUuYwppbmRleCAzMzhjZDgzLi4zYjJjZWMyIDEwMDY0NAotLS0gYS9mcy9ocGZzL2lub2RlLmMKKysrIGIvZnMvaHBmcy9pbm9kZS5jCkBAIC01Myw3ICs1Myw3IEBACiAJCWktPmlfbW9kZSAmPSB+MDExMTsKIAkJaS0+aV9vcCA9ICZocGZzX2ZpbGVfaW9wczsKIAkJaS0+aV9mb3AgPSAmaHBmc19maWxlX29wczsKLQkJaS0+aV9ubGluayA9IDA7Ki8KKwkJY2xlYXJfbmxpbmsoaSk7Ki8KIAkJbWFrZV9iYWRfaW5vZGUoaSk7CiAJCXJldHVybjsKIAl9CkBAIC03Nyw3ICs3Nyw3IEBACiAJCQlpLT5pX21vZGUgPSBTX0lGTE5LIHwgMDc3NzsKIAkJCWktPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CiAJCQlpLT5pX2RhdGEuYV9vcHMgPSAmaHBmc19zeW1saW5rX2FvcHM7Ci0JCQlpLT5pX25saW5rID0gMTsKKwkJCXNldF9ubGluayhpLCAxKTsKIAkJCWktPmlfc2l6ZSA9IGVhX3NpemU7CiAJCQlpLT5pX2Jsb2NrcyA9IDE7CiAJCQlicmVsc2UoYmgpOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCQl9CiAJCQlpZiAoU19JU0JMSyhtb2RlKSB8fCBTX0lTQ0hSKG1vZGUpIHx8IFNfSVNGSUZPKG1vZGUpIHx8IFNfSVNTT0NLKG1vZGUpKSB7CiAJCQkJYnJlbHNlKGJoKTsKLQkJCQlpLT5pX25saW5rID0gMTsKKwkJCQlzZXRfbmxpbmsoaSwgMSk7CiAJCQkJaS0+aV9zaXplID0gMDsKIAkJCQlpLT5pX2Jsb2NrcyA9IDE7CiAJCQkJaW5pdF9zcGVjaWFsX2lub2RlKGksIG1vZGUsCkBAIC0xMjUsMTMgKzEyNSwxMyBAQAogCQlocGZzX2NvdW50X2Rub2RlcyhpLT5pX3NiLCBocGZzX2lub2RlLT5pX2RubywgJm5fZG5vZGVzLCAmbl9zdWJkaXJzLCBOVUxMKTsKIAkJaS0+aV9ibG9ja3MgPSA0ICogbl9kbm9kZXM7CiAJCWktPmlfc2l6ZSA9IDIwNDggKiBuX2Rub2RlczsKLQkJaS0+aV9ubGluayA9IDIgKyBuX3N1YmRpcnM7CisJCXNldF9ubGluayhpLCAyICsgbl9zdWJkaXJzKTsKIAl9IGVsc2UgewogCQlpLT5pX21vZGUgfD0gU19JRlJFRzsKIAkJaWYgKCFocGZzX2lub2RlLT5pX2VhX21vZGUpIGktPmlfbW9kZSAmPSB+MDExMTsKIAkJaS0+aV9vcCA9ICZocGZzX2ZpbGVfaW9wczsKIAkJaS0+aV9mb3AgPSAmaHBmc19maWxlX29wczsKLQkJaS0+aV9ubGluayA9IDE7CisJCXNldF9ubGluayhpLCAxKTsKIAkJaS0+aV9zaXplID0gbGUzMl90b19jcHUoZm5vZGUtPmZpbGVfc2l6ZSk7CiAJCWktPmlfYmxvY2tzID0gKChpLT5pX3NpemUgKyA1MTEpID4+IDkpICsgMTsKIAkJaS0+aV9kYXRhLmFfb3BzID0gJmhwZnNfYW9wczsKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvbmFtZWkuYyBiL2ZzL2hwZnMvbmFtZWkuYwppbmRleCAyZGY2OWUyLi5lYTkxZmNiIDEwMDY0NAotLS0gYS9mcy9ocGZzL25hbWVpLmMKKysrIGIvZnMvaHBmcy9uYW1laS5jCkBAIC01Niw3ICs1Niw3IEBACiAJcmVzdWx0LT5pX2ZvcCA9ICZocGZzX2Rpcl9vcHM7CiAJcmVzdWx0LT5pX2Jsb2NrcyA9IDQ7CiAJcmVzdWx0LT5pX3NpemUgPSAyMDQ4OwotCXJlc3VsdC0+aV9ubGluayA9IDI7CisJc2V0X25saW5rKHJlc3VsdCwgMik7CiAJaWYgKGRlZS5yZWFkX29ubHkpCiAJCXJlc3VsdC0+aV9tb2RlICY9IH4wMjIyOwogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAlyZXN1bHQtPmlfbW9kZSAmPSB+MDExMTsKIAlyZXN1bHQtPmlfb3AgPSAmaHBmc19maWxlX2lvcHM7CiAJcmVzdWx0LT5pX2ZvcCA9ICZocGZzX2ZpbGVfb3BzOwotCXJlc3VsdC0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKHJlc3VsdCwgMSk7CiAJaHBmc19pKHJlc3VsdCktPmlfcGFyZW50X2RpciA9IGRpci0+aV9pbm87CiAJcmVzdWx0LT5pX2N0aW1lLnR2X3NlYyA9IHJlc3VsdC0+aV9tdGltZS50dl9zZWMgPSByZXN1bHQtPmlfYXRpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KGRpci0+aV9zYiwgbGUzMl90b19jcHUoZGVlLmNyZWF0aW9uX2RhdGUpKTsKIAlyZXN1bHQtPmlfY3RpbWUudHZfbnNlYyA9IDA7CkBAIC0yNDIsNyArMjQyLDcgQEAKIAlocGZzX2kocmVzdWx0KS0+aV9lYV9zaXplID0gMDsKIAlyZXN1bHQtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCXJlc3VsdC0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7Ci0JcmVzdWx0LT5pX25saW5rID0gMTsKKwlzZXRfbmxpbmsocmVzdWx0LCAxKTsKIAlyZXN1bHQtPmlfc2l6ZSA9IDA7CiAJcmVzdWx0LT5pX2Jsb2NrcyA9IDE7CiAJaW5pdF9zcGVjaWFsX2lub2RlKHJlc3VsdCwgbW9kZSwgcmRldik7CkBAIC0zMTgsNyArMzE4LDcgQEAKIAlyZXN1bHQtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCXJlc3VsdC0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7CiAJcmVzdWx0LT5pX2Jsb2NrcyA9IDE7Ci0JcmVzdWx0LT5pX25saW5rID0gMTsKKwlzZXRfbmxpbmsocmVzdWx0LCAxKTsKIAlyZXN1bHQtPmlfc2l6ZSA9IHN0cmxlbihzeW1saW5rKTsKIAlyZXN1bHQtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CiAJcmVzdWx0LT5pX2RhdGEuYV9vcHMgPSAmaHBmc19zeW1saW5rX2FvcHM7CmRpZmYgLS1naXQgYS9mcy9ocHBmcy9ocHBmcy5jIGIvZnMvaHBwZnMvaHBwZnMuYwppbmRleCA5NzBlYTk4Li5mNTkwYjExIDEwMDY0NAotLS0gYS9mcy9ocHBmcy9ocHBmcy5jCisrKyBiL2ZzL2hwcGZzL2hwcGZzLmMKQEAgLTcwMiw3ICs3MDIsNyBAQAogCWlub2RlLT5pX2N0aW1lID0gcHJvY19pbm8tPmlfY3RpbWU7CiAJaW5vZGUtPmlfaW5vID0gcHJvY19pbm8tPmlfaW5vOwogCWlub2RlLT5pX21vZGUgPSBwcm9jX2luby0+aV9tb2RlOwotCWlub2RlLT5pX25saW5rID0gcHJvY19pbm8tPmlfbmxpbms7CisJc2V0X25saW5rKGlub2RlLCBwcm9jX2luby0+aV9ubGluayk7CiAJaW5vZGUtPmlfc2l6ZSA9IHByb2NfaW5vLT5pX3NpemU7CiAJaW5vZGUtPmlfYmxvY2tzID0gcHJvY19pbm8tPmlfYmxvY2tzOwogCmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCmluZGV4IGVjODg5NTMuLjBiZTVhNzggMTAwNjQ0Ci0tLSBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCisrKyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCkBAIC05NzAsNyArOTcwLDcgQEAKIAogCWRfaW5zdGFudGlhdGUocGF0aC5kZW50cnksIGlub2RlKTsKIAlpbm9kZS0+aV9zaXplID0gc2l6ZTsKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJY2xlYXJfbmxpbmsoaW5vZGUpOwogCiAJZXJyb3IgPSAtRU5GSUxFOwogCWZpbGUgPSBhbGxvY19maWxlKCZwYXRoLCBGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQsCmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCBlYzc5MjQ2Li5lZTRlNjZiIDEwMDY0NAotLS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCWF0b21pY19zZXQoJmlub2RlLT5pX2NvdW50LCAxKTsKIAlpbm9kZS0+aV9vcCA9ICZlbXB0eV9pb3BzOwogCWlub2RlLT5pX2ZvcCA9ICZlbXB0eV9mb3BzOwotCWlub2RlLT5pX25saW5rID0gMTsKKwlpbm9kZS0+X19pX25saW5rID0gMTsKIAlpbm9kZS0+aV9vcGZsYWdzID0gMDsKIAlpbm9kZS0+aV91aWQgPSAwOwogCWlub2RlLT5pX2dpZCA9IDA7CkBAIC02MzQsNyArNjM0LDcgQEAKIAkJICogaW5vZGUgdG8gdGhlIGJhY2sgb2YgdGhlIGxpc3Qgc28gd2UgZG9uJ3Qgc3BpbiBvbiBpdC4KIAkJICovCiAJCWlmICghc3Bpbl90cnlsb2NrKCZpbm9kZS0+aV9sb2NrKSkgewotCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9scnUsICZzYi0+c19pbm9kZV9scnUpOworCQkJbGlzdF9tb3ZlX3RhaWwoJmlub2RlLT5pX2xydSwgJnNiLT5zX2lub2RlX2xydSk7CiAJCQljb250aW51ZTsKIAkJfQogCmRpZmYgLS1naXQgYS9mcy9pb3ByaW8uYyBiL2ZzL2lvcHJpby5jCmluZGV4IDdkYTJhMDYuLmY3OWRhYjggMTAwNjQ0Ci0tLSBhL2ZzL2lvcHJpby5jCisrKyBiL2ZzL2lvcHJpby5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3ByaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CmRpZmYgLS1naXQgYS9mcy9pc29mcy9pbm9kZS5jIGIvZnMvaXNvZnMvaW5vZGUuYwppbmRleCBhNWQwMzY3Li5mOTUwMDU5IDEwMDY0NAotLS0gYS9mcy9pc29mcy9pbm9kZS5jCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CiAKICNpbmNsdWRlICJpc29mcy5oIgogI2luY2x1ZGUgInppc29mcy5oIgpAQCAtMTE0OCw3ICsxMTQ5LDEzIEBACiAKIHN0YXRpYyBpbnQgaXNvZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLGlzb2ZzX2dldF9ibG9jayk7CisJcmV0dXJuIG1wYWdlX3JlYWRwYWdlKHBhZ2UsIGlzb2ZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaXNvZnNfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKK3sKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgaXNvZnNfZ2V0X2Jsb2NrKTsKIH0KIAogc3RhdGljIHNlY3Rvcl90IF9pc29mc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKQEAgLTExNTgsNiArMTE2NSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGlzb2ZzX2FvcHMgPSB7CiAJLnJlYWRwYWdlID0gaXNvZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcyA9IGlzb2ZzX3JlYWRwYWdlcywKIAkuYm1hcCA9IF9pc29mc19ibWFwCiB9OwogCkBAIC0xMzE5LDcgKzEzMjcsNyBAQAogCQkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBzYmktPnNfZG1vZGU7CiAJCWVsc2UKIAkJCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR087Ci0JCWlub2RlLT5pX25saW5rID0gMTsJLyoKKwkJc2V0X25saW5rKGlub2RlLCAxKTsJLyoKIAkJCQkJICogU2V0IHRvIDEuICBXZSBrbm93IHRoZXJlIGFyZSAyLCBidXQKIAkJCQkJICogdGhlIGZpbmQgdXRpbGl0eSB0cmllcyB0byBvcHRpbWl6ZQogCQkJCQkgKiBpZiBpdCBpcyAyLCBhbmQgaXQgc2NyZXdzIHVwLiAgSXQgaXMKQEAgLTEzMzcsNyArMTM0NSw3IEBACiAJCQkgKi8KIAkJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVhVR087CiAJCX0KLQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCX0KIAlpbm9kZS0+aV91aWQgPSBzYmktPnNfdWlkOwogCWlub2RlLT5pX2dpZCA9IHNiaS0+c19naWQ7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9yb2NrLmMgYi9mcy9pc29mcy9yb2NrLmMKaW5kZXggMWZiYzdkZS4uNzBlNzlkMCAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvcm9jay5jCisrKyBiL2ZzL2lzb2ZzL3JvY2suYwpAQCAtMzYzLDcgKzM2Myw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBTSUcoJ1AnLCAnWCcpOgogCQkJaW5vZGUtPmlfbW9kZSA9IGlzb251bV83MzMocnItPnUuUFgubW9kZSk7Ci0JCQlpbm9kZS0+aV9ubGluayA9IGlzb251bV83MzMocnItPnUuUFgubl9saW5rcyk7CisJCQlzZXRfbmxpbmsoaW5vZGUsIGlzb251bV83MzMocnItPnUuUFgubl9saW5rcykpOwogCQkJaW5vZGUtPmlfdWlkID0gaXNvbnVtXzczMyhyci0+dS5QWC51aWQpOwogCQkJaW5vZGUtPmlfZ2lkID0gaXNvbnVtXzczMyhyci0+dS5QWC5naWQpOwogCQkJYnJlYWs7CkBAIC00OTYsNyArNDk2LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWlub2RlLT5pX21vZGUgPSByZWxvYy0+aV9tb2RlOwotCQkJaW5vZGUtPmlfbmxpbmsgPSByZWxvYy0+aV9ubGluazsKKwkJCXNldF9ubGluayhpbm9kZSwgcmVsb2MtPmlfbmxpbmspOwogCQkJaW5vZGUtPmlfdWlkID0gcmVsb2MtPmlfdWlkOwogCQkJaW5vZGUtPmlfZ2lkID0gcmVsb2MtPmlfZ2lkOwogCQkJaW5vZGUtPmlfcmRldiA9IHJlbG9jLT5pX3JkZXY7CmRpZmYgLS1naXQgYS9mcy9qYmQvam91cm5hbC5jIGIvZnMvamJkL2pvdXJuYWwuYwppbmRleCA5ZmUwNjFmLi5mZWE4ZGQ2IDEwMDY0NAotLS0gYS9mcy9qYmQvam91cm5hbC5jCisrKyBiL2ZzL2piZC9qb3VybmFsLmMKQEAgLTExMzUsNiArMTEzNSwxNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAoYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpID09IDAgfHwKKwkgICAgYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpID49IGpvdXJuYWwtPmpfbWF4bGVuKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJKQkQ6IEludmFsaWQgc3RhcnQgYmxvY2sgb2Ygam91cm5hbDogJXVcbiIsCisJCQliZTMyX3RvX2NwdShzYi0+c19maXJzdCkpOworCQlnb3RvIG91dDsKKwl9CisKIAlyZXR1cm4gMDsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKaW5kZXggZWVmNjk3OS4uNjhkNzA0ZCAxMDA2NDQKLS0tIGEvZnMvamJkMi9jb21taXQuYworKysgYi9mcy9qYmQyL2NvbW1pdC5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKIAogCXRyYWNlX2piZDJfc3RhcnRfY29tbWl0KGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7Ci0JamJkX2RlYnVnKDEsICJKQkQ6IHN0YXJ0aW5nIGNvbW1pdCBvZiB0cmFuc2FjdGlvbiAlZFxuIiwKKwlqYmRfZGVidWcoMSwgIkpCRDI6IHN0YXJ0aW5nIGNvbW1pdCBvZiB0cmFuc2FjdGlvbiAlZFxuIiwKIAkJCWNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQpOwogCiAJd3JpdGVfbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKQEAgLTQyNyw3ICs0MjcsNyBAQAogCV9famJkMl9qb3VybmFsX2NsZWFuX2NoZWNrcG9pbnRfbGlzdChqb3VybmFsKTsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCi0JamJkX2RlYnVnICgzLCAiSkJEOiBjb21taXQgcGhhc2UgMVxuIik7CisJamJkX2RlYnVnKDMsICJKQkQyOiBjb21taXQgcGhhc2UgMVxuIik7CiAKIAkvKgogCSAqIFN3aXRjaCB0byBhIG5ldyByZXZva2UgdGFibGUuCkBAIC00NDcsNyArNDQ3LDcgQEAKIAl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKIAl3cml0ZV91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAKLQlqYmRfZGVidWcgKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSAyXG4iKTsKKwlqYmRfZGVidWcoMywgIkpCRDI6IGNvbW1pdCBwaGFzZSAyXG4iKTsKIAogCS8qCiAJICogTm93IHN0YXJ0IGZsdXNoaW5nIHRoaW5ncyB0byBkaXNrLCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCQkJCQkgIFdSSVRFX1NZTkMpOwogCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAKLQlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDJcbiIpOworCWpiZF9kZWJ1ZygzLCAiSkJEMjogY29tbWl0IHBoYXNlIDJcbiIpOwogCiAJLyoKIAkgKiBXYXkgdG8gZ286IHdlIGhhdmUgbm93IHdyaXR0ZW4gb3V0IGFsbCBvZiB0aGUgZGF0YSBmb3IgYQpAQCAtNTIyLDcgKzUyMiw3IEBACiAKIAkJCUpfQVNTRVJUIChidWZzID09IDApOwogCi0JCQlqYmRfZGVidWcoNCwgIkpCRDogZ2V0IGRlc2NyaXB0b3JcbiIpOworCQkJamJkX2RlYnVnKDQsICJKQkQyOiBnZXQgZGVzY3JpcHRvclxuIik7CiAKIAkJCWRlc2NyaXB0b3IgPSBqYmQyX2pvdXJuYWxfZ2V0X2Rlc2NyaXB0b3JfYnVmZmVyKGpvdXJuYWwpOwogCQkJaWYgKCFkZXNjcmlwdG9yKSB7CkBAIC01MzEsNyArNTMxLDcgQEAKIAkJCX0KIAogCQkJYmggPSBqaDJiaChkZXNjcmlwdG9yKTsKLQkJCWpiZF9kZWJ1Zyg0LCAiSkJEOiBnb3QgYnVmZmVyICVsbHUgKCVwKVxuIiwKKwkJCWpiZF9kZWJ1Zyg0LCAiSkJEMjogZ290IGJ1ZmZlciAlbGx1ICglcClcbiIsCiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBiaC0+Yl9kYXRhKTsKIAkJCWhlYWRlciA9IChqb3VybmFsX2hlYWRlcl90ICopJmJoLT5iX2RhdGFbMF07CiAJCQloZWFkZXItPmhfbWFnaWMgICAgID0gY3B1X3RvX2JlMzIoSkJEMl9NQUdJQ19OVU1CRVIpOwpAQCAtNjI1LDcgKzYyNSw3IEBACiAJCSAgICBjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVycyA9PSBOVUxMIHx8CiAJCSAgICBzcGFjZV9sZWZ0IDwgdGFnX2J5dGVzICsgMTYpIHsKIAotCQkJamJkX2RlYnVnKDQsICJKQkQ6IFN1Ym1pdCAlZCBJT3NcbiIsIGJ1ZnMpOworCQkJamJkX2RlYnVnKDQsICJKQkQyOiBTdWJtaXQgJWQgSU9zXG4iLCBidWZzKTsKIAogCQkJLyogV3JpdGUgYW4gZW5kLW9mLWRlc2NyaXB0b3IgbWFya2VyIGJlZm9yZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0dGluZyB0aGUgSU9zLiAgInRhZyIgc3RpbGwgcG9pbnRzIHRvCkBAIC03MDcsNyArNzA3LDcgQEAKIAkgICBzbyB3ZSBpbmN1ciBsZXNzIHNjaGVkdWxpbmcgbG9hZC4KIAkqLwogCi0JamJkX2RlYnVnKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSAzXG4iKTsKKwlqYmRfZGVidWcoMywgIkpCRDI6IGNvbW1pdCBwaGFzZSAzXG4iKTsKIAogCS8qCiAJICogYWtwbTogdGhlc2UgYXJlIEJKX0lPLCBhbmQgal9saXN0X2xvY2sgaXMgbm90IG5lZWRlZC4KQEAgLTc3MSw3ICs3NzEsNyBAQAogCiAJSl9BU1NFUlQgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zaGFkb3dfbGlzdCA9PSBOVUxMKTsKIAotCWpiZF9kZWJ1ZygzLCAiSkJEOiBjb21taXQgcGhhc2UgNFxuIik7CisJamJkX2RlYnVnKDMsICJKQkQyOiBjb21taXQgcGhhc2UgNFxuIik7CiAKIAkvKiBIZXJlIHdlIHdhaXQgZm9yIHRoZSByZXZva2UgcmVjb3JkIGFuZCBkZXNjcmlwdG9yIHJlY29yZCBidWZmZXJzICovCiAgd2FpdF9mb3JfY3RsYnVmOgpAQCAtODAxLDcgKzgwMSw3IEBACiAJaWYgKGVycikKIAkJamJkMl9qb3VybmFsX2Fib3J0KGpvdXJuYWwsIGVycik7CiAKLQlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDVcbiIpOworCWpiZF9kZWJ1ZygzLCAiSkJEMjogY29tbWl0IHBoYXNlIDVcbiIpOwogCXdyaXRlX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfQ09NTUlUX0RGTFVTSCk7CiAJY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID0gVF9DT01NSVRfSkZMVVNIOwpAQCAtODMwLDcgKzgzMCw3IEBACiAgICAgICAgICAgIHRyYW5zYWN0aW9uIGNhbiBiZSByZW1vdmVkIGZyb20gYW55IGNoZWNrcG9pbnQgbGlzdCBpdCB3YXMgb24KICAgICAgICAgICAgYmVmb3JlLiAqLwogCi0JamJkX2RlYnVnKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSA2XG4iKTsKKwlqYmRfZGVidWcoMywgIkpCRDI6IGNvbW1pdCBwaGFzZSA2XG4iKTsKIAogCUpfQVNTRVJUKGxpc3RfZW1wdHkoJmNvbW1pdF90cmFuc2FjdGlvbi0+dF9pbm9kZV9saXN0KSk7CiAJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X2J1ZmZlcnMgPT0gTlVMTCk7CkBAIC05NjQsNyArOTY0LDcgQEAKIAogCS8qIERvbmUgd2l0aCB0aGlzIHRyYW5zYWN0aW9uISAqLwogCi0JamJkX2RlYnVnKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSA3XG4iKTsKKwlqYmRfZGVidWcoMywgIkpCRDI6IGNvbW1pdCBwaGFzZSA3XG4iKTsKIAogCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9PSBUX0NPTU1JVF9KRkxVU0gpOwogCkBAIC0xMDM5LDcgKzEwMzksNyBAQAogCQlqb3VybmFsLT5qX2NvbW1pdF9jYWxsYmFjayhqb3VybmFsLCBjb21taXRfdHJhbnNhY3Rpb24pOwogCiAJdHJhY2VfamJkMl9lbmRfY29tbWl0KGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7Ci0JamJkX2RlYnVnKDEsICJKQkQ6IGNvbW1pdCAlZCBjb21wbGV0ZSwgaGVhZCAlZFxuIiwKKwlqYmRfZGVidWcoMSwgIkpCRDI6IGNvbW1pdCAlZCBjb21wbGV0ZSwgaGVhZCAlZFxuIiwKIAkJICBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKIAlpZiAodG9fZnJlZSkKIAkJa2ZyZWUoY29tbWl0X3RyYW5zYWN0aW9uKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvam91cm5hbC5jIGIvZnMvamJkMi9qb3VybmFsLmMKaW5kZXggZjI0ZGYxMy4uMGZhMDEyMyAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCQkgKi8KIAogCQlqb3VybmFsLT5qX2NvbW1pdF9yZXF1ZXN0ID0gdGFyZ2V0OwotCQlqYmRfZGVidWcoMSwgIkpCRDogcmVxdWVzdGluZyBjb21taXQgJWQvJWRcbiIsCisJCWpiZF9kZWJ1ZygxLCAiSkJEMjogcmVxdWVzdGluZyBjb21taXQgJWQvJWRcbiIsCiAJCQkgIGpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QsCiAJCQkgIGpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlKTsKIAkJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2NvbW1pdCk7CkBAIC01MDAsNyArNTAwLDcgQEAKIAkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgaWYgaXQgZG9lcywgcHJlc2VydmUKIAkJICAgdGhlIGV2aWRlbmNlIGJlZm9yZSBram91cm5hbGQgZ29lcyBpbnRvIGEgbG9vcCBhbmQKIAkJICAgaW5jcmVtZW50cyBqX2NvbW1pdF9zZXF1ZW5jZSBiZXlvbmQgYWxsIHJlY29nbml0aW9uLiAqLwotCQlXQVJOX09OQ0UoMSwgImpiZDogYmFkIGxvZ19zdGFydF9jb21taXQ6ICV1ICV1ICV1ICV1XG4iLAorCQlXQVJOX09OQ0UoMSwgIkpCRDI6IGJhZCBsb2dfc3RhcnRfY29tbWl0OiAldSAldSAldSAldVxuIiwKIAkJCSAgam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwKIAkJCSAgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UsCiAJCQkgIHRhcmdldCwgam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uID8gCkBAIC02NDUsNyArNjQ1LDcgQEAKIAl9CiAjZW5kaWYKIAl3aGlsZSAodGlkX2d0KHRpZCwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpKSB7Ci0JCWpiZF9kZWJ1ZygxLCAiSkJEOiB3YW50ICVkLCBqX2NvbW1pdF9zZXF1ZW5jZT0lZFxuIiwKKwkJamJkX2RlYnVnKDEsICJKQkQyOiB3YW50ICVkLCBqX2NvbW1pdF9zZXF1ZW5jZT0lZFxuIiwKIAkJCQkgIHRpZCwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpOwogCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfY29tbWl0KTsKIAkJcmVhZF91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CkBAIC0xMDkzLDcgKzEwOTMsNyBAQAogCWZpcnN0ID0gYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpOwogCWxhc3QgPSBiZTMyX3RvX2NwdShzYi0+c19tYXhsZW4pOwogCWlmIChmaXJzdCArIEpCRDJfTUlOX0pPVVJOQUxfQkxPQ0tTID4gbGFzdCArIDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJKQkQ6IEpvdXJuYWwgdG9vIHNob3J0IChibG9ja3MgJWxsdS0lbGx1KS5cbiIsCisJCXByaW50ayhLRVJOX0VSUiAiSkJEMjogSm91cm5hbCB0b28gc2hvcnQgKGJsb2NrcyAlbGx1LSVsbHUpLlxuIiwKIAkJICAgICAgIGZpcnN0LCBsYXN0KTsKIAkJam91cm5hbF9mYWlsX3N1cGVyYmxvY2soam91cm5hbCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTEzOSw3ICsxMTM5LDcgQEAKIAkgKi8KIAlpZiAoc2ItPnNfc3RhcnQgPT0gMCAmJiBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UgPT0KIAkJCQlqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlKSB7Ci0JCWpiZF9kZWJ1ZygxLCJKQkQ6IFNraXBwaW5nIHN1cGVyYmxvY2sgdXBkYXRlIG9uIHJlY292ZXJlZCBzYiAiCisJCWpiZF9kZWJ1ZygxLCAiSkJEMjogU2tpcHBpbmcgc3VwZXJibG9jayB1cGRhdGUgb24gcmVjb3ZlcmVkIHNiICIKIAkJCSIoc3RhcnQgJWxkLCBzZXEgJWQsIGVycm5vICVkKVxuIiwKIAkJCWpvdXJuYWwtPmpfdGFpbCwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlLAogCQkJam91cm5hbC0+al9lcnJubyk7CkBAIC0xMTYzLDcgKzExNjMsNyBAQAogCX0KIAogCXJlYWRfbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKLQlqYmRfZGVidWcoMSwiSkJEOiB1cGRhdGluZyBzdXBlcmJsb2NrIChzdGFydCAlbGQsIHNlcSAlZCwgZXJybm8gJWQpXG4iLAorCWpiZF9kZWJ1ZygxLCAiSkJEMjogdXBkYXRpbmcgc3VwZXJibG9jayAoc3RhcnQgJWxkLCBzZXEgJWQsIGVycm5vICVkKVxuIiwKIAkJICBqb3VybmFsLT5qX3RhaWwsIGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSwgam91cm5hbC0+al9lcnJubyk7CiAKIAlzYi0+c19zZXF1ZW5jZSA9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSk7CkBAIC0xMjE2LDggKzEyMTYsOCBAQAogCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOwogCQl3YWl0X29uX2J1ZmZlcihiaCk7CiAJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCQkJcHJpbnRrIChLRVJOX0VSUgotCQkJCSJKQkQ6IElPIGVycm9yIHJlYWRpbmcgam91cm5hbCBzdXBlcmJsb2NrXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJKQkQyOiBJTyBlcnJvciByZWFkaW5nIGpvdXJuYWwgc3VwZXJibG9ja1xuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTEyMjgsNyArMTIyOCw3IEBACiAKIAlpZiAoc2ItPnNfaGVhZGVyLmhfbWFnaWMgIT0gY3B1X3RvX2JlMzIoSkJEMl9NQUdJQ19OVU1CRVIpIHx8CiAJICAgIHNiLT5zX2Jsb2Nrc2l6ZSAhPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX2Jsb2Nrc2l6ZSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEOiBubyB2YWxpZCBqb3VybmFsIHN1cGVyYmxvY2sgZm91bmRcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJKQkQyOiBubyB2YWxpZCBqb3VybmFsIHN1cGVyYmxvY2sgZm91bmRcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTEyNDAsMTQgKzEyNDAsMjIgQEAKIAkJam91cm5hbC0+al9mb3JtYXRfdmVyc2lvbiA9IDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkpCRDogdW5yZWNvZ25pc2VkIHN1cGVyYmxvY2sgZm9ybWF0IElEXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEMjogdW5yZWNvZ25pc2VkIHN1cGVyYmxvY2sgZm9ybWF0IElEXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJaWYgKGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbikgPCBqb3VybmFsLT5qX21heGxlbikKIAkJam91cm5hbC0+al9tYXhsZW4gPSBiZTMyX3RvX2NwdShzYi0+c19tYXhsZW4pOwogCWVsc2UgaWYgKGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbikgPiBqb3VybmFsLT5qX21heGxlbikgewotCQlwcmludGsgKEtFUk5fV0FSTklORyAiSkJEOiBqb3VybmFsIGZpbGUgdG9vIHNob3J0XG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEMjogam91cm5hbCBmaWxlIHRvbyBzaG9ydFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChiZTMyX3RvX2NwdShzYi0+c19maXJzdCkgPT0gMCB8fAorCSAgICBiZTMyX3RvX2NwdShzYi0+c19maXJzdCkgPj0gam91cm5hbC0+al9tYXhsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIkpCRDI6IEludmFsaWQgc3RhcnQgYmxvY2sgb2Ygam91cm5hbDogJXVcbiIsCisJCQliZTMyX3RvX2NwdShzYi0+c19maXJzdCkpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTEzMTAsOCArMTMxOCw4IEBACiAJCSAgICAgfmNwdV90b19iZTMyKEpCRDJfS05PV05fUk9DT01QQVRfRkVBVFVSRVMpKSB8fAogCQkgICAgKHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgogCQkgICAgIH5jcHVfdG9fYmUzMihKQkQyX0tOT1dOX0lOQ09NUEFUX0ZFQVRVUkVTKSkpIHsKLQkJCXByaW50ayAoS0VSTl9XQVJOSU5HCi0JCQkJIkpCRDogVW5yZWNvZ25pc2VkIGZlYXR1cmVzIG9uIGpvdXJuYWxcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJKQkQyOiBVbnJlY29nbmlzZWQgZmVhdHVyZXMgb24gam91cm5hbFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTEzNDYsNyArMTM1NCw3IEBACiAJcmV0dXJuIDA7CiAKIHJlY292ZXJ5X2Vycm9yOgotCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6IHJlY292ZXJ5IGZhaWxlZFxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEMjogcmVjb3ZlcnkgZmFpbGVkXG4iKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMTU3Nyw3ICsxNTg1LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCiAJcHJpbnRrKEtFUk5fV0FSTklORwotCQkiSkJEOiBDb252ZXJ0aW5nIHN1cGVyYmxvY2sgZnJvbSB2ZXJzaW9uIDEgdG8gMi5cbiIpOworCQkiSkJEMjogQ29udmVydGluZyBzdXBlcmJsb2NrIGZyb20gdmVyc2lvbiAxIHRvIDIuXG4iKTsKIAogCS8qIFByZS1pbml0aWFsaXNlIG5ldyBmaWVsZHMgdG8gemVybyAqLwogCW9mZnNldCA9ICgoY2hhciAqKSAmKHNiLT5zX2ZlYXR1cmVfY29tcGF0KSkgLSAoKGNoYXIgKikgc2IpOwpAQCAtMTY5NCw3ICsxNzAyLDcgQEAKIAlpZiAoIWpvdXJuYWwtPmpfdGFpbCkKIAkJZ290byBub19yZWNvdmVyeTsKIAotCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6ICVzIHJlY292ZXJ5IGluZm9ybWF0aW9uIG9uIGpvdXJuYWxcbiIsCisJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEMjogJXMgcmVjb3ZlcnkgaW5mb3JtYXRpb24gb24gam91cm5hbFxuIiwKIAkJd3JpdGUgPyAiQ2xlYXJpbmciIDogIklnbm9yaW5nIik7CiAKIAllcnIgPSBqYmQyX2pvdXJuYWxfc2tpcF9yZWNvdmVyeShqb3VybmFsKTsKQEAgLTIwMjAsNyArMjAyOCw3IEBACiAJcmV0dmFsID0gMDsKIAlpZiAoIWpiZDJfam91cm5hbF9oZWFkX2NhY2hlKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IG5vIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkIGNhY2hlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkpCRDI6IG5vIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkIGNhY2hlXG4iKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTIzODMsNyArMjM5MSw3IEBACiAjaWZkZWYgQ09ORklHX0pCRDJfREVCVUcKIAlpbnQgbiA9IGF0b21pY19yZWFkKCZucl9qb3VybmFsX2hlYWRzKTsKIAlpZiAobikKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkpCRDogbGVha2VkICVkIGpvdXJuYWxfaGVhZHMhXG4iLCBuKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkpCRDI6IGxlYWtlZCAlZCBqb3VybmFsX2hlYWRzIVxuIiwgbik7CiAjZW5kaWYKIAlqYmQyX3JlbW92ZV9kZWJ1Z2ZzX2VudHJ5KCk7CiAJamJkMl9yZW1vdmVfamJkX3N0YXRzX3Byb2NfZW50cnkoKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvcmVjb3ZlcnkuYyBiL2ZzL2piZDIvcmVjb3ZlcnkuYwppbmRleCAxY2FkODY5Li5kYTZkN2JhIDEwMDY0NAotLS0gYS9mcy9qYmQyL3JlY292ZXJ5LmMKKysrIGIvZnMvamJkMi9yZWNvdmVyeS5jCkBAIC04OSw3ICs4OSw3IEBACiAJCWVyciA9IGpiZDJfam91cm5hbF9ibWFwKGpvdXJuYWwsIG5leHQsICZibG9ja25yKTsKIAogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsgKEtFUk5fRVJSICJKQkQ6IGJhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IGJhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsCiAJCQkJbmV4dCk7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQpAQCAtMTM4LDE0ICsxMzgsMTQgQEAKIAkqYmhwID0gTlVMTDsKIAogCWlmIChvZmZzZXQgPj0gam91cm5hbC0+al9tYXhsZW4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJKQkQ6IGNvcnJ1cHRlZCBqb3VybmFsIHN1cGVyYmxvY2tcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IGNvcnJ1cHRlZCBqb3VybmFsIHN1cGVyYmxvY2tcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAllcnIgPSBqYmQyX2pvdXJuYWxfYm1hcChqb3VybmFsLCBvZmZzZXQsICZibG9ja25yKTsKIAogCWlmIChlcnIpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiSkJEOiBiYWQgYmxvY2sgYXQgb2Zmc2V0ICV1XG4iLAorCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IGJhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsCiAJCQlvZmZzZXQpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTE2Myw3ICsxNjMsNyBAQAogCX0KIAogCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCQlwcmludGsgKEtFUk5fRVJSICJKQkQ6IEZhaWxlZCB0byByZWFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICJKQkQyOiBGYWlsZWQgdG8gcmVhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsCiAJCQlvZmZzZXQpOwogCQlicmVsc2UoYmgpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTI1MSwxMCArMjUxLDEwIEBACiAJaWYgKCFlcnIpCiAJCWVyciA9IGRvX29uZV9wYXNzKGpvdXJuYWwsICZpbmZvLCBQQVNTX1JFUExBWSk7CiAKLQlqYmRfZGVidWcoMSwgIkpCRDogcmVjb3ZlcnksIGV4aXQgc3RhdHVzICVkLCAiCisJamJkX2RlYnVnKDEsICJKQkQyOiByZWNvdmVyeSwgZXhpdCBzdGF0dXMgJWQsICIKIAkJICAicmVjb3ZlcmVkIHRyYW5zYWN0aW9ucyAldSB0byAldVxuIiwKIAkJICBlcnIsIGluZm8uc3RhcnRfdHJhbnNhY3Rpb24sIGluZm8uZW5kX3RyYW5zYWN0aW9uKTsKLQlqYmRfZGVidWcoMSwgIkpCRDogUmVwbGF5ZWQgJWQgYW5kIHJldm9rZWQgJWQvJWQgYmxvY2tzXG4iLAorCWpiZF9kZWJ1ZygxLCAiSkJEMjogUmVwbGF5ZWQgJWQgYW5kIHJldm9rZWQgJWQvJWQgYmxvY2tzXG4iLAogCQkgIGluZm8ubnJfcmVwbGF5cywgaW5mby5ucl9yZXZva2VfaGl0cywgaW5mby5ucl9yZXZva2VzKTsKIAogCS8qIFJlc3RhcnQgdGhlIGxvZyBhdCB0aGUgbmV4dCB0cmFuc2FjdGlvbiBJRCwgdGh1cyBpbnZhbGlkYXRpbmcKQEAgLTI5MywxNCArMjkzLDE0IEBACiAJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfU0NBTik7CiAKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSkJEOiBlcnJvciAlZCBzY2FubmluZyBqb3VybmFsXG4iLCBlcnIpOworCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IGVycm9yICVkIHNjYW5uaW5nIGpvdXJuYWxcbiIsIGVycik7CiAJCSsram91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZTsKIAl9IGVsc2UgewogI2lmZGVmIENPTkZJR19KQkQyX0RFQlVHCiAJCWludCBkcm9wcGVkID0gaW5mby5lbmRfdHJhbnNhY3Rpb24gLSAKIAkJCWJlMzJfdG9fY3B1KGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19zZXF1ZW5jZSk7CiAJCWpiZF9kZWJ1ZygxLAotCQkJICAiSkJEOiBpZ25vcmluZyAlZCB0cmFuc2FjdGlvbiVzIGZyb20gdGhlIGpvdXJuYWwuXG4iLAorCQkJICAiSkJEMjogaWdub3JpbmcgJWQgdHJhbnNhY3Rpb24lcyBmcm9tIHRoZSBqb3VybmFsLlxuIiwKIAkJCSAgZHJvcHBlZCwgKGRyb3BwZWQgPT0gMSkgPyAiIiA6ICJzIik7CiAjZW5kaWYKIAkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJd3JhcChqb3VybmFsLCAqbmV4dF9sb2dfYmxvY2spOwogCQllcnIgPSBqcmVhZCgmb2JoLCBqb3VybmFsLCBpb19ibG9jayk7CiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiSkJEOiBJTyBlcnJvciAlZCByZWNvdmVyaW5nIGJsb2NrICIKKwkJCXByaW50ayhLRVJOX0VSUiAiSkJEMjogSU8gZXJyb3IgJWQgcmVjb3ZlcmluZyBibG9jayAiCiAJCQkJIiVsdSBpbiBsb2dcbiIsIGVyciwgaW9fYmxvY2spOwogCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7CkBAIC00MTEsNyArNDExLDcgQEAKIAkJICogZWl0aGVyIHRoZSBuZXh0IGRlc2NyaXB0b3IgYmxvY2sgb3IgdGhlIGZpbmFsIGNvbW1pdAogCQkgKiByZWNvcmQuICovCiAKLQkJamJkX2RlYnVnKDMsICJKQkQ6IGNoZWNraW5nIGJsb2NrICVsZFxuIiwgbmV4dF9sb2dfYmxvY2spOworCQlqYmRfZGVidWcoMywgIkpCRDI6IGNoZWNraW5nIGJsb2NrICVsZFxuIiwgbmV4dF9sb2dfYmxvY2spOwogCQllcnIgPSBqcmVhZCgmYmgsIGpvdXJuYWwsIG5leHRfbG9nX2Jsb2NrKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZmFpbGVkOwpAQCAtNDkxLDggKzQ5MSw4IEBACiAJCQkJCS8qIFJlY292ZXIgd2hhdCB3ZSBjYW4sIGJ1dAogCQkJCQkgKiByZXBvcnQgZmFpbHVyZSBhdCB0aGUgZW5kLiAqLwogCQkJCQlzdWNjZXNzID0gZXJyOwotCQkJCQlwcmludGsgKEtFUk5fRVJSCi0JCQkJCQkiSkJEOiBJTyBlcnJvciAlZCByZWNvdmVyaW5nICIKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCQkiSkJEMjogSU8gZXJyb3IgJWQgcmVjb3ZlcmluZyAiCiAJCQkJCQkiYmxvY2sgJWxkIGluIGxvZ1xuIiwKIAkJCQkJCWVyciwgaW9fYmxvY2spOwogCQkJCX0gZWxzZSB7CkBAIC01MjAsNyArNTIwLDcgQEAKIAkJCQkJCQlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CiAJCQkJCWlmIChuYmggPT0gTlVMTCkgewogCQkJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCQkgICAgICAgIkpCRDogT3V0IG9mIG1lbW9yeSAiCisJCQkJCQkgICAgICAgIkpCRDI6IE91dCBvZiBtZW1vcnkgIgogCQkJCQkJICAgICAgICJkdXJpbmcgcmVjb3ZlcnkuXG4iKTsKIAkJCQkJCWVyciA9IC1FTk9NRU07CiAJCQkJCQlicmVsc2UoYmgpOwpAQCAtNjg5LDcgKzY4OSw3IEBACiAJCS8qIEl0J3MgcmVhbGx5IGJhZCBuZXdzIGlmIGRpZmZlcmVudCBwYXNzZXMgZW5kIHVwIGF0CiAJCSAqIGRpZmZlcmVudCBwbGFjZXMgKGJ1dCBwb3NzaWJsZSBkdWUgdG8gSU8gZXJyb3JzKS4gKi8KIAkJaWYgKGluZm8tPmVuZF90cmFuc2FjdGlvbiAhPSBuZXh0X2NvbW1pdF9JRCkgewotCQkJcHJpbnRrIChLRVJOX0VSUiAiSkJEOiByZWNvdmVyeSBwYXNzICVkIGVuZGVkIGF0ICIKKwkJCXByaW50ayhLRVJOX0VSUiAiSkJEMjogcmVjb3ZlcnkgcGFzcyAlZCBlbmRlZCBhdCAiCiAJCQkJInRyYW5zYWN0aW9uICV1LCBleHBlY3RlZCAldVxuIiwKIAkJCQlwYXNzLCBuZXh0X2NvbW1pdF9JRCwgaW5mby0+ZW5kX3RyYW5zYWN0aW9uKTsKIAkJCWlmICghc3VjY2VzcykKZGlmZiAtLWdpdCBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYyBiL2ZzL2piZDIvdHJhbnNhY3Rpb24uYwppbmRleCAyZDcxMDk0Li5hMGU0MWE0IDEwMDY0NAotLS0gYS9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgdm9pZCBfX2piZDJfam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpOwpAQCAtMTE1LDcgKzExNiw3IEBACiAgKi8KIAogc3RhdGljIGludCBzdGFydF90aGlzX2hhbmRsZShqb3VybmFsX3QgKmpvdXJuYWwsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICAgIGludCBnZnBfbWFzaykKKwkJCSAgICAgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJdHJhbnNhY3Rpb25fdAkqdHJhbnNhY3Rpb24sICpuZXdfdHJhbnNhY3Rpb24gPSBOVUxMOwogCXRpZF90CQl0aWQ7CkBAIC0xMjQsNyArMTI1LDcgQEAKIAl1bnNpZ25lZCBsb25nIHRzID0gamlmZmllczsKIAogCWlmIChuYmxvY2tzID4gam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycykgewotCQlwcmludGsoS0VSTl9FUlIgIkpCRDogJXMgd2FudHMgdG9vIG1hbnkgY3JlZGl0cyAoJWQgPiAlZClcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiSkJEMjogJXMgd2FudHMgdG9vIG1hbnkgY3JlZGl0cyAoJWQgPiAlZClcbiIsCiAJCSAgICAgICBjdXJyZW50LT5jb21tLCBuYmxvY2tzLAogCQkgICAgICAgam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycyk7CiAJCXJldHVybiAtRU5PU1BDOwpAQCAtMzIwLDcgKzMyMSw3IEBACiAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGhhbmRsZSwgb3IgYW4gRVJSX1BUUigpIHZhbHVlCiAgKiBvbiBmYWlsdXJlLgogICovCi1oYW5kbGVfdCAqamJkMl9fam91cm5hbF9zdGFydChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBuYmxvY2tzLCBpbnQgZ2ZwX21hc2spCitoYW5kbGVfdCAqamJkMl9fam91cm5hbF9zdGFydChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBuYmxvY2tzLCBnZnBfdCBnZnBfbWFzaykKIHsKIAloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOwogCWludCBlcnI7CkBAIC00NDMsNyArNDQ0LDcgQEAKICAqIHRyYW5zYWN0aW9uIGNhcGFiYWJsZSBvZiBndWFyYW50ZWVpbmcgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YKICAqIGNyZWRpdHMuCiAgKi8KLWludCBqYmQyX19qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MsIGludCBnZnBfbWFzaykKK2ludCBqYmQyX19qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MsIGdmcF90IGdmcF9tYXNrKQogewogCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOwogCWpvdXJuYWxfdCAqam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7CkBAIC01NjMsNyArNTY0LDcgQEAKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKIAlwcmludGsoS0VSTl9XQVJOSU5HCi0JICAgICAgICJKQkQ6IFNwb3R0ZWQgZGlydHkgbWV0YWRhdGEgYnVmZmVyIChkZXYgPSAlcywgYmxvY2tuciA9ICVsbHUpLiAiCisJICAgICAgICJKQkQyOiBTcG90dGVkIGRpcnR5IG1ldGFkYXRhIGJ1ZmZlciAoZGV2ID0gJXMsIGJsb2NrbnIgPSAlbGx1KS4gIgogCSAgICAgICAiVGhlcmUncyBhIHJpc2sgb2YgZmlsZXN5c3RlbSBjb3JydXB0aW9uIGluIGNhc2Ugb2Ygc3lzdGVtICIKIAkgICAgICAgImNyYXNoLlxuIiwKIAkgICAgICAgYmRldm5hbWUoYmgtPmJfYmRldiwgYiksICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CkBAIC0xMDQ5LDYgKzEwNTAsMTAgQEAKICAqIG1hcmsgZGlydHkgbWV0YWRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgam91cm5hbGVkIGFzIHBhcnQgb2YgdGhlIGN1cnJlbnQKICAqIHRyYW5zYWN0aW9uLgogICoKKyAqIFRoZSBidWZmZXIgbXVzdCBoYXZlIHByZXZpb3VzbHkgaGFkIGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKCkKKyAqIGNhbGxlZCBzbyB0aGF0IGl0IGhhcyBhIHZhbGlkIGpvdXJuYWxfaGVhZCBhdHRhY2hlZCB0byB0aGUgYnVmZmVyCisgKiBoZWFkLgorICoKICAqIFRoZSBidWZmZXIgaXMgcGxhY2VkIG9uIHRoZSB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3QgYW5kIGlzIG1hcmtlZAogICogYXMgYmVsb25naW5nIHRvIHRoZSB0cmFuc2FjdGlvbi4KICAqCkBAIC0xMDY1LDExICsxMDcwLDE2IEBACiAJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CiAJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKIAlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKKwlpbnQgcmV0ID0gMDsKIAogCWpiZF9kZWJ1Zyg1LCAiam91cm5hbF9oZWFkICVwXG4iLCBqaCk7CiAJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CiAJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCiAJCWdvdG8gb3V0OworCWlmICghYnVmZmVyX2piZChiaCkpIHsKKwkJcmV0ID0gLUVVQ0xFQU47CisJCWdvdG8gb3V0OworCX0KIAogCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIApAQCAtMTA5Myw4ICsxMTAzLDIwIEBACiAJICovCiAJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uICYmIGpoLT5iX2psaXN0ID09IEJKX01ldGFkYXRhKSB7CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJmYXN0cGF0aCIpOwotCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24gPT0KLQkJCQkJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJaWYgKHVubGlrZWx5KGpoLT5iX3RyYW5zYWN0aW9uICE9CisJCQkgICAgIGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbikpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6ICVzOiAiCisJCQkgICAgICAgImpoLT5iX3RyYW5zYWN0aW9uICglbGx1LCAlcCwgJXUpICE9ICIKKwkJCSAgICAgICAiam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uICglcCwgJXUpIiwKKwkJCSAgICAgICBqb3VybmFsLT5qX2Rldm5hbWUsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmgtPmJfYmxvY2tuciwKKwkJCSAgICAgICBqaC0+Yl90cmFuc2FjdGlvbiwKKwkJCSAgICAgICBqaC0+Yl90cmFuc2FjdGlvbiA/IGpoLT5iX3RyYW5zYWN0aW9uLT50X3RpZCA6IDAsCisJCQkgICAgICAgam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uLAorCQkJICAgICAgIGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA/CisJCQkgICAgICAgam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uLT50X3RpZCA6IDApOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQogCQlnb3RvIG91dF91bmxvY2tfYmg7CiAJfQogCkBAIC0xMTA4LDkgKzExMzAsMzIgQEAKIAkgKi8KIAlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gdHJhbnNhY3Rpb24pIHsKIAkJSkJVRkZFUl9UUkFDRShqaCwgImFscmVhZHkgb24gb3RoZXIgdHJhbnNhY3Rpb24iKTsKLQkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09Ci0JCQkJCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7Ci0JCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKTsKKwkJaWYgKHVubGlrZWx5KGpoLT5iX3RyYW5zYWN0aW9uICE9CisJCQkgICAgIGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6ICVzOiAiCisJCQkgICAgICAgImpoLT5iX3RyYW5zYWN0aW9uICglbGx1LCAlcCwgJXUpICE9ICIKKwkJCSAgICAgICAiam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uICglcCwgJXUpIiwKKwkJCSAgICAgICBqb3VybmFsLT5qX2Rldm5hbWUsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmgtPmJfYmxvY2tuciwKKwkJCSAgICAgICBqaC0+Yl90cmFuc2FjdGlvbiwKKwkJCSAgICAgICBqaC0+Yl90cmFuc2FjdGlvbiA/IGpoLT5iX3RyYW5zYWN0aW9uLT50X3RpZCA6IDAsCisJCQkgICAgICAgam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uLAorCQkJICAgICAgIGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA/CisJCQkgICAgICAgam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uLT50X3RpZCA6IDApOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlpZiAodW5saWtlbHkoamgtPmJfbmV4dF90cmFuc2FjdGlvbiAhPSB0cmFuc2FjdGlvbikpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6ICVzOiAiCisJCQkgICAgICAgImpoLT5iX25leHRfdHJhbnNhY3Rpb24gKCVsbHUsICVwLCAldSkgIT0gIgorCQkJICAgICAgICJ0cmFuc2FjdGlvbiAoJXAsICV1KSIsCisJCQkgICAgICAgam91cm5hbC0+al9kZXZuYW1lLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJoLT5iX2Jsb2NrbnIsCisJCQkgICAgICAgamgtPmJfbmV4dF90cmFuc2FjdGlvbiwKKwkJCSAgICAgICBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID8KKwkJCSAgICAgICBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uLT50X3RpZCA6IDAsCisJCQkgICAgICAgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uLT50X3RpZCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CiAJCS8qIEFuZCB0aGlzIGNhc2UgaXMgaWxsZWdhbDogd2UgY2FuJ3QgcmV1c2UgYW5vdGhlcgogCQkgKiB0cmFuc2FjdGlvbidzIGRhdGEgYnVmZmVyLCBldmVyLiAqLwogCQlnb3RvIG91dF91bmxvY2tfYmg7CkBAIC0xMTI3LDcgKzExNzIsOCBAQAogCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogb3V0OgogCUpCVUZGRVJfVFJBQ0UoamgsICJleGl0Iik7Ci0JcmV0dXJuIDA7CisJV0FSTl9PTihyZXQpOwkvKiBBbGwgZXJyb3JzIGFyZSBidWdzLCBzbyBkdW1wIHRoZSBzdGFjayAqLworCXJldHVybiByZXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wci5jIGIvZnMvamZmczIvY29tcHIuYwppbmRleCBkZTQyNDcwLi41YjZjOWQxIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wci5jCisrKyBiL2ZzL2pmZnMyL2NvbXByLmMKQEAgLTUzLDYgKzUzLDc4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBqZmZzMl9zZWxlY3RlZF9jb21wcmVzczoKKyAqIEBjb21wcjogRXhwbGljaXQgY29tcHJlc3Npb24gdHlwZSB0byB1c2UgKGllLCBKRkZTMl9DT01QUl9aTElCKS4KKyAqCUlmIDAsIGp1c3QgdGFrZSB0aGUgZmlyc3QgYXZhaWxhYmxlIGNvbXByZXNzaW9uIG1vZGUuCisgKiBAZGF0YV9pbjogUG9pbnRlciB0byB1bmNvbXByZXNzZWQgZGF0YQorICogQGNwYWdlX291dDogUG9pbnRlciB0byByZXR1cm5lZCBwb2ludGVyIHRvIGJ1ZmZlciBmb3IgY29tcHJlc3NlZCBkYXRhCisgKiBAZGF0YWxlbjogT24gZW50cnksIGhvbGRzIHRoZSBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUgZm9yIGNvbXByZXNzaW9uLgorICoJT24gZXhpdCwgZXhwZWN0ZWQgdG8gaG9sZCB0aGUgYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgY29tcHJlc3NlZC4KKyAqIEBjZGF0YWxlbjogT24gZW50cnksIGhvbGRzIHRoZSBhbW91bnQgb2Ygc3BhY2UgYXZhaWxhYmxlIGZvciBjb21wcmVzc2VkCisgKglkYXRhLiBPbiBleGl0LCBleHBlY3RlZCB0byBob2xkIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZAorICoJZGF0YS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgY29tcHJlc3Npb24gdHlwZSB1c2VkLiAgWmVybyBpcyB1c2VkIHRvIHNob3cgdGhhdCB0aGUgZGF0YQorICogY291bGQgbm90IGJlIGNvbXByZXNzZWQ7IHByb2JhYmx5IGJlY2F1c2Ugd2UgY291bGRuJ3QgZmluZCB0aGUgcmVxdWVzdGVkCisgKiBjb21wcmVzc2lvbiBtb2RlLgorICovCitzdGF0aWMgaW50IGpmZnMyX3NlbGVjdGVkX2NvbXByZXNzKHU4IGNvbXByLCB1bnNpZ25lZCBjaGFyICpkYXRhX2luLAorCQl1bnNpZ25lZCBjaGFyICoqY3BhZ2Vfb3V0LCB1MzIgKmRhdGFsZW4sIHUzMiAqY2RhdGFsZW4pCit7CisJc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXM7CisJaW50IGVyciwgcmV0ID0gSkZGUzJfQ09NUFJfTk9ORTsKKwl1aW50MzJfdCBvcmlnX3NsZW4sIG9yaWdfZGxlbjsKKwljaGFyICpvdXRwdXRfYnVmOworCisJb3V0cHV0X2J1ZiA9IGttYWxsb2MoKmNkYXRhbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW91dHB1dF9idWYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzI6IE5vIG1lbW9yeSBmb3IgY29tcHJlc3NvciBhbGxvY2F0aW9uLiBDb21wcmVzc2lvbiBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJb3JpZ19zbGVuID0gKmRhdGFsZW47CisJb3JpZ19kbGVuID0gKmNkYXRhbGVuOworCXNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgeworCQkvKiBTa2lwIGRlY29tcHJlc3Mtb25seSBhbmQgZGlzYWJsZWQgbW9kdWxlcyAqLworCQlpZiAoIXRoaXMtPmNvbXByZXNzIHx8IHRoaXMtPmRpc2FibGVkKQorCQkJY29udGludWU7CisKKwkJLyogU2tpcCBpZiBub3QgdGhlIGRlc2lyZWQgY29tcHJlc3Npb24gdHlwZSAqLworCQlpZiAoY29tcHIgJiYgKGNvbXByICE9IHRoaXMtPmNvbXByKSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEVpdGhlciBjb21wcmVzc2lvbiB0eXBlIHdhcyB1bnNwZWNpZmllZCwgb3Igd2UgZm91bmQgb3VyCisJCSAqIGNvbXByZXNzb3I7IGVpdGhlciB3YXksIHdlJ3JlIGdvb2QgdG8gZ28uCisJCSAqLworCQl0aGlzLT51c2Vjb3VudCsrOworCQlzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworCisJCSpkYXRhbGVuICA9IG9yaWdfc2xlbjsKKwkJKmNkYXRhbGVuID0gb3JpZ19kbGVuOworCQllcnIgPSB0aGlzLT5jb21wcmVzcyhkYXRhX2luLCBvdXRwdXRfYnVmLCBkYXRhbGVuLCBjZGF0YWxlbik7CisKKwkJc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisJCXRoaXMtPnVzZWNvdW50LS07CisJCWlmICghZXJyKSB7CisJCQkvKiBTdWNjZXNzICovCisJCQlyZXQgPSB0aGlzLT5jb21wcjsKKwkJCXRoaXMtPnN0YXRfY29tcHJfYmxvY2tzKys7CisJCQl0aGlzLT5zdGF0X2NvbXByX29yaWdfc2l6ZSArPSAqZGF0YWxlbjsKKwkJCXRoaXMtPnN0YXRfY29tcHJfbmV3X3NpemUgKz0gKmNkYXRhbGVuOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKwlpZiAocmV0ID09IEpGRlMyX0NPTVBSX05PTkUpCisJCWtmcmVlKG91dHB1dF9idWYpOworCWVsc2UKKwkJKmNwYWdlX291dCA9IG91dHB1dF9idWY7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKiBqZmZzMl9jb21wcmVzczoKICAqIEBkYXRhX2luOiBQb2ludGVyIHRvIHVuY29tcHJlc3NlZCBkYXRhCiAgKiBAY3BhZ2Vfb3V0OiBQb2ludGVyIHRvIHJldHVybmVkIHBvaW50ZXIgdG8gYnVmZmVyIGZvciBjb21wcmVzc2VkIGRhdGEKQEAgLTc2LDQ3ICsxNDgsMjMgQEAKIAkJCXVpbnQzMl90ICpkYXRhbGVuLCB1aW50MzJfdCAqY2RhdGFsZW4pCiB7CiAJaW50IHJldCA9IEpGRlMyX0NPTVBSX05PTkU7Ci0JaW50IGNvbXByX3JldDsKKwlpbnQgbW9kZSwgY29tcHJfcmV0OwogCXN0cnVjdCBqZmZzMl9jb21wcmVzc29yICp0aGlzLCAqYmVzdD1OVUxMOwogCXVuc2lnbmVkIGNoYXIgKm91dHB1dF9idWYgPSBOVUxMLCAqdG1wX2J1ZjsKIAl1aW50MzJfdCBvcmlnX3NsZW4sIG9yaWdfZGxlbjsKIAl1aW50MzJfdCBiZXN0X3NsZW49MCwgYmVzdF9kbGVuPTA7CiAKLQlzd2l0Y2ggKGpmZnMyX2NvbXByZXNzaW9uX21vZGUpIHsKKwlpZiAoYy0+bW91bnRfb3B0cy5vdmVycmlkZV9jb21wcikKKwkJbW9kZSA9IGMtPm1vdW50X29wdHMuY29tcHI7CisJZWxzZQorCQltb2RlID0gamZmczJfY29tcHJlc3Npb25fbW9kZTsKKworCXN3aXRjaCAobW9kZSkgewogCWNhc2UgSkZGUzJfQ09NUFJfTU9ERV9OT05FOgogCQlicmVhazsKIAljYXNlIEpGRlMyX0NPTVBSX01PREVfUFJJT1JJVFk6Ci0JCW91dHB1dF9idWYgPSBrbWFsbG9jKCpjZGF0YWxlbixHRlBfS0VSTkVMKTsKLQkJaWYgKCFvdXRwdXRfYnVmKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMjogTm8gbWVtb3J5IGZvciBjb21wcmVzc29yIGFsbG9jYXRpb24uIENvbXByZXNzaW9uIGZhaWxlZC5cbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJb3JpZ19zbGVuID0gKmRhdGFsZW47Ci0JCW9yaWdfZGxlbiA9ICpjZGF0YWxlbjsKLQkJc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgewotCQkJLyogU2tpcCBkZWNvbXByZXNzLW9ubHkgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgYW5kIGRpc2FibGVkIG1vZHVsZXMgKi8KLQkJCWlmICgoIXRoaXMtPmNvbXByZXNzKXx8KHRoaXMtPmRpc2FibGVkKSkKLQkJCQljb250aW51ZTsKLQotCQkJdGhpcy0+dXNlY291bnQrKzsKLQkJCXNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0JCQkqZGF0YWxlbiAgPSBvcmlnX3NsZW47Ci0JCQkqY2RhdGFsZW4gPSBvcmlnX2RsZW47Ci0JCQljb21wcl9yZXQgPSB0aGlzLT5jb21wcmVzcyhkYXRhX2luLCBvdXRwdXRfYnVmLCBkYXRhbGVuLCBjZGF0YWxlbik7Ci0JCQlzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKLQkJCXRoaXMtPnVzZWNvdW50LS07Ci0JCQlpZiAoIWNvbXByX3JldCkgewotCQkJCXJldCA9IHRoaXMtPmNvbXByOwotCQkJCXRoaXMtPnN0YXRfY29tcHJfYmxvY2tzKys7Ci0JCQkJdGhpcy0+c3RhdF9jb21wcl9vcmlnX3NpemUgKz0gKmRhdGFsZW47Ci0JCQkJdGhpcy0+c3RhdF9jb21wcl9uZXdfc2l6ZSAgKz0gKmNkYXRhbGVuOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0JCWlmIChyZXQgPT0gSkZGUzJfQ09NUFJfTk9ORSkKLQkJCWtmcmVlKG91dHB1dF9idWYpOworCQlyZXQgPSBqZmZzMl9zZWxlY3RlZF9jb21wcmVzcygwLCBkYXRhX2luLCBjcGFnZV9vdXQsIGRhdGFsZW4sCisJCQkJY2RhdGFsZW4pOwogCQlicmVhazsKIAljYXNlIEpGRlMyX0NPTVBSX01PREVfU0laRToKIAljYXNlIEpGRlMyX0NPTVBSX01PREVfRkFWT1VSTFpPOgpAQCAtMTc0LDIyICsyMjIsMjggQEAKIAkJCWJlc3QtPnN0YXRfY29tcHJfb3JpZ19zaXplICs9IGJlc3Rfc2xlbjsKIAkJCWJlc3QtPnN0YXRfY29tcHJfbmV3X3NpemUgICs9IGJlc3RfZGxlbjsKIAkJCXJldCA9IGJlc3QtPmNvbXByOworCQkJKmNwYWdlX291dCA9IG91dHB1dF9idWY7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKIAkJYnJlYWs7CisJY2FzZSBKRkZTMl9DT01QUl9NT0RFX0ZPUkNFTFpPOgorCQlyZXQgPSBqZmZzMl9zZWxlY3RlZF9jb21wcmVzcyhKRkZTMl9DT01QUl9MWk8sIGRhdGFfaW4sCisJCQkJY3BhZ2Vfb3V0LCBkYXRhbGVuLCBjZGF0YWxlbik7CisJCWJyZWFrOworCWNhc2UgSkZGUzJfQ09NUFJfTU9ERV9GT1JDRVpMSUI6CisJCXJldCA9IGpmZnMyX3NlbGVjdGVkX2NvbXByZXNzKEpGRlMyX0NPTVBSX1pMSUIsIGRhdGFfaW4sCisJCQkJY3BhZ2Vfb3V0LCBkYXRhbGVuLCBjZGF0YWxlbik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiAiSkZGUzI6IHVua25vd24gY29tcHJlc3Npb24gbW9kZS5cbiIpOwogCX0KLSBvdXQ6CisKIAlpZiAocmV0ID09IEpGRlMyX0NPTVBSX05PTkUpIHsKIAkJKmNwYWdlX291dCA9IGRhdGFfaW47CiAJCSpkYXRhbGVuID0gKmNkYXRhbGVuOwogCQlub25lX3N0YXRfY29tcHJfYmxvY2tzKys7CiAJCW5vbmVfc3RhdF9jb21wcl9zaXplICs9ICpkYXRhbGVuOwogCX0KLQllbHNlIHsKLQkJKmNwYWdlX291dCA9IG91dHB1dF9idWY7Ci0JfQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByLmggYi9mcy9qZmZzMi9jb21wci5oCmluZGV4IDEzYmI3NTkuLjVlOTFkNTcgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByLmgKKysrIGIvZnMvamZmczIvY29tcHIuaApAQCAtNDAsNiArNDAsOCBAQAogI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX1BSSU9SSVRZICAgMQogI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX1NJWkUgICAgICAgMgogI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX0ZBVk9VUkxaTyAgMworI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX0ZPUkNFTFpPICAgNAorI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX0ZPUkNFWkxJQiAgNQogCiAjZGVmaW5lIEZBVk9VUl9MWk9fUEVSQ0VOVCA4MAogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9kaXIuYyBiL2ZzL2pmZnMyL2Rpci5jCmluZGV4IDk2NTliN2MuLmJlNjE2OWIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2Rpci5jCisrKyBiL2ZzL2pmZnMyL2Rpci5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAlyZXQgPSBqZmZzMl9kb191bmxpbmsoYywgZGlyX2YsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGRlYWRfZiwgbm93KTsKIAlpZiAoZGVhZF9mLT5pbm9jYWNoZSkKLQkJZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gZGVhZF9mLT5pbm9jYWNoZS0+cGlub19ubGluazsKKwkJc2V0X25saW5rKGRlbnRyeS0+ZF9pbm9kZSwgZGVhZF9mLT5pbm9jYWNoZS0+cGlub19ubGluayk7CiAJaWYgKCFyZXQpCiAJCWRpcl9pLT5pX210aW1lID0gZGlyX2ktPmlfY3RpbWUgPSBJVElNRShub3cpOwogCXJldHVybiByZXQ7CkBAIC0yNzgsNyArMjc4LDcgQEAKIAogCWlmICghcmV0KSB7CiAJCW11dGV4X2xvY2soJmYtPnNlbSk7Ci0JCW9sZF9kZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPSArK2YtPmlub2NhY2hlLT5waW5vX25saW5rOworCQlzZXRfbmxpbmsob2xkX2RlbnRyeS0+ZF9pbm9kZSwgKytmLT5pbm9jYWNoZS0+cGlub19ubGluayk7CiAJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJZF9pbnN0YW50aWF0ZShkZW50cnksIG9sZF9kZW50cnktPmRfaW5vZGUpOwogCQlkaXJfaS0+aV9tdGltZSA9IGRpcl9pLT5pX2N0aW1lID0gSVRJTUUobm93KTsKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCWYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKIAogCS8qIERpcmVjdG9yaWVzIGdldCBubGluayAyIGF0IHN0YXJ0ICovCi0JaW5vZGUtPmlfbmxpbmsgPSAyOworCXNldF9ubGluayhpbm9kZSwgMik7CiAJLyogYnV0IGljLT5waW5vX25saW5rIGlzIHRoZSBwYXJlbnQgaW5vIyAqLwogCWYtPmlub2NhY2hlLT5waW5vX25saW5rID0gZGlyX2ktPmlfaW5vOwogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9mcy5jIGIvZnMvamZmczIvZnMuYwppbmRleCBiYmNiOTc1Li40YjhhZmUzIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9mcy5jCisrKyBiL2ZzL2pmZnMyL2ZzLmMKQEAgLTI3OCw3ICsyNzgsNyBAQAogCWlub2RlLT5pX210aW1lID0gSVRJTUUoamUzMl90b19jcHUobGF0ZXN0X25vZGUubXRpbWUpKTsKIAlpbm9kZS0+aV9jdGltZSA9IElUSU1FKGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLmN0aW1lKSk7CiAKLQlpbm9kZS0+aV9ubGluayA9IGYtPmlub2NhY2hlLT5waW5vX25saW5rOworCXNldF9ubGluayhpbm9kZSwgZi0+aW5vY2FjaGUtPnBpbm9fbmxpbmspOwogCiAJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CiAKQEAgLTI5MSw3ICsyOTEsNyBAQAogCWNhc2UgU19JRkRJUjoKIAl7CiAJCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7Ci0JCWlub2RlLT5pX25saW5rID0gMjsgLyogcGFyZW50IGFuZCAnLicgKi8KKwkJc2V0X25saW5rKGlub2RlLCAyKTsgLyogcGFyZW50IGFuZCAnLicgKi8KIAogCQlmb3IgKGZkPWYtPmRlbnRzOyBmZDsgZmQgPSBmZC0+bmV4dCkgewogCQkJaWYgKGZkLT50eXBlID09IERUX0RJUiAmJiBmZC0+aW5vKQpAQCAtMzc5LDcgKzM3OSw3IEBACiAJamZmczJfZG9fc2V0YXR0cihpbm9kZSwgJmlhdHRyKTsKIH0KIAotaW50IGpmZnMyX3JlbW91bnRfZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCitpbnQgamZmczJfZG9fcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQogewogCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CiAKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSAxOworCXNldF9ubGluayhpbm9kZSwgMSk7CiAJaW5vZGUtPmlfaW5vID0gamUzMl90b19jcHUocmktPmlubyk7CiAJaW5vZGUtPmlfbW9kZSA9IGplbW9kZV90b19jcHUocmktPm1vZGUpOwogCWlub2RlLT5pX2dpZCA9IGplMTZfdG9fY3B1KHJpLT5naWQpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvamZmczJfZnNfc2IuaCBiL2ZzL2pmZnMyL2pmZnMyX2ZzX3NiLmgKaW5kZXggMGJjNmE2Yy4uNTVhMGMxZCAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfZnNfc2IuaAorKysgYi9mcy9qZmZzMi9qZmZzMl9mc19zYi5oCkBAIC0yOSw2ICsyOSwxMSBAQAogCiBzdHJ1Y3QgamZmczJfaW5vZGlydHk7CiAKK3N0cnVjdCBqZmZzMl9tb3VudF9vcHRzIHsKKwlib29sIG92ZXJyaWRlX2NvbXByOworCXVuc2lnbmVkIGludCBjb21wcjsKK307CisKIC8qIEEgc3RydWN0IGZvciB0aGUgb3ZlcmFsbCBmaWxlIHN5c3RlbSBjb250cm9sLiAgUG9pbnRlcnMgdG8KICAgIGpmZnMyX3NiX2luZm8gc3RydWN0cyBhcmUgbmFtZWQgYGMnIGluIHRoZSBzb3VyY2UgY29kZS4KICAgIE5lZSBqZmZzX2NvbnRyb2wKQEAgLTEyNiw2ICsxMzEsNyBAQAogI2VuZGlmCiAKIAlzdHJ1Y3QgamZmczJfc3VtbWFyeSAqc3VtbWFyeTsJCS8qIFN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgamZmczJfbW91bnRfb3B0cyBtb3VudF9vcHRzOwogCiAjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1hBVFRSCiAjZGVmaW5lIFhBVFRSSU5ERVhfSEFTSFNJWkUJKDU3KQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvb3MtbGludXguaCBiL2ZzL2pmZnMyL29zLWxpbnV4LmgKaW5kZXggNmMxNzU1Yy4uYWI2NWVlMyAxMDA2NDQKLS0tIGEvZnMvamZmczIvb3MtbGludXguaAorKysgYi9mcy9qZmZzMi9vcy1saW51eC5oCkBAIC0xNzYsNyArMTc2LDcgQEAKIHN0cnVjdCBpbm9kZSAqamZmczJfbmV3X2lub2RlIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCB1bW9kZV90IG1vZGUsCiAJCQkgICAgICAgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmkpOwogaW50IGpmZnMyX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKLWludCBqZmZzMl9yZW1vdW50X2ZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CitpbnQgamZmczJfZG9fcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CiBpbnQgamZmczJfZG9fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KTsKIHZvaWQgamZmczJfZ2NfcmVsZWFzZV9pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKIAkJCSAgICBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZik7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9zY2FuLmMgYi9mcy9qZmZzMi9zY2FuLmMKaW5kZXggOGQ4Y2QzNC4uMjgxMDdjYSAxMDA2NDQKLS0tIGEvZnMvamZmczIvc2Nhbi5jCisrKyBiL2ZzL2pmZnMyL3NjYW4uYwpAQCAtMjc1LDkgKzI3NSw3IEBACiAJZWxzZQogCQljLT5tdGQtPnVucG9pbnQoYy0+bXRkLCAwLCBjLT5tdGQtPnNpemUpOwogI2VuZGlmCi0JaWYgKHMpCi0JCWtmcmVlKHMpOwotCisJa2ZyZWUocyk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKaW5kZXggODUzYjhlMy4uZTdlOTc0NCAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VwZXIuYworKysgYi9mcy9qZmZzMi9zdXBlci5jCkBAIC0xNywxMSArMTcsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvamZmczIuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3N1cGVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlICJjb21wci5oIgogI2luY2x1ZGUgIm5vZGVsaXN0LmgiCkBAIC03NSw2ICs3NywzNyBAQAogCXVubG9ja19zdXBlcihzYik7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpqZmZzMl9jb21wcl9uYW1lKHVuc2lnbmVkIGludCBjb21wcikKK3sKKwlzd2l0Y2ggKGNvbXByKSB7CisJY2FzZSBKRkZTMl9DT01QUl9NT0RFX05PTkU6CisJCXJldHVybiAibm9uZSI7CisjaWZkZWYgQ09ORklHX0pGRlMyX0xaTworCWNhc2UgSkZGUzJfQ09NUFJfTU9ERV9GT1JDRUxaTzoKKwkJcmV0dXJuICJsem8iOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX1pMSUIKKwljYXNlIEpGRlMyX0NPTVBSX01PREVfRk9SQ0VaTElCOgorCQlyZXR1cm4gInpsaWIiOworI2VuZGlmCisJZGVmYXVsdDoKKwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbjsgcHJvZ3JhbW1lciBlcnJvciAqLworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gIiI7CisJfQorfQorCitzdGF0aWMgaW50IGpmZnMyX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhtbnQtPm1udF9zYik7CisJc3RydWN0IGpmZnMyX21vdW50X29wdHMgKm9wdHMgPSAmYy0+bW91bnRfb3B0czsKKworCWlmIChvcHRzLT5vdmVycmlkZV9jb21wcikKKwkJc2VxX3ByaW50ZihzLCAiLGNvbXByPSVzIiwgamZmczJfY29tcHJfbmFtZShvcHRzLT5jb21wcikpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgamZmczJfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCkKIHsKIAlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOwpAQCAtMTMzLDYgKzE2Niw4NSBAQAogCS5maF90b19wYXJlbnQgPSBqZmZzMl9maF90b19wYXJlbnQsCiB9OwogCisvKgorICogSkZGUzIgbW91bnQgb3B0aW9ucy4KKyAqCisgKiBPcHRfb3ZlcnJpZGVfY29tcHI6IG92ZXJyaWRlIGRlZmF1bHQgY29tcHJlc3NvcgorICogT3B0X2VycjoganVzdCBlbmQgb2YgYXJyYXkgbWFya2VyCisgKi8KK2VudW0geworCU9wdF9vdmVycmlkZV9jb21wciwKKwlPcHRfZXJyLAorfTsKKworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfb3ZlcnJpZGVfY29tcHIsICJjb21wcj0lcyJ9LAorCXtPcHRfZXJyLCBOVUxMfSwKK307CisKK3N0YXRpYyBpbnQgamZmczJfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgY2hhciAqZGF0YSkKK3sKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJY2hhciAqcCwgKm5hbWU7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAwOworCisJd2hpbGUgKChwID0gc3Ryc2VwKCZkYXRhLCAiLCIpKSkgeworCQlpbnQgdG9rZW47CisKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9vdmVycmlkZV9jb21wcjoKKwkJCW5hbWUgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCisJCQlpZiAoIW5hbWUpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlpZiAoIXN0cmNtcChuYW1lLCAibm9uZSIpKQorCQkJCWMtPm1vdW50X29wdHMuY29tcHIgPSBKRkZTMl9DT01QUl9NT0RFX05PTkU7CisjaWZkZWYgQ09ORklHX0pGRlMyX0xaTworCQkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAibHpvIikpCisJCQkJYy0+bW91bnRfb3B0cy5jb21wciA9IEpGRlMyX0NPTVBSX01PREVfRk9SQ0VMWk87CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfWkxJQgorCQkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiemxpYiIpKQorCQkJCWMtPm1vdW50X29wdHMuY29tcHIgPQorCQkJCQkJSkZGUzJfQ09NUFJfTU9ERV9GT1JDRVpMSUI7CisjZW5kaWYKKwkJCWVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzIgRXJyb3I6IHVua25vd24gY29tcHJlc3NvciBcIiVzXCIiLAorCQkJCQkJbmFtZSk7CisJCQkJa2ZyZWUobmFtZSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlrZnJlZShuYW1lKTsKKwkJCWMtPm1vdW50X29wdHMub3ZlcnJpZGVfY29tcHIgPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIkpGRlMyIEVycm9yOiB1bnJlY29nbml6ZWQgbW91bnQgb3B0aW9uICclcycgb3IgbWlzc2luZyB2YWx1ZVxuIiwKKwkJCQkJcCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmZnMyX3JlbW91bnRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOworCWludCBlcnI7CisKKwllcnIgPSBqZmZzMl9wYXJzZV9vcHRpb25zKGMsIGRhdGEpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGpmZnMyX2RvX3JlbW91bnRfZnMoc2IsIGZsYWdzLCBkYXRhKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmZnMyX3N1cGVyX29wZXJhdGlvbnMgPQogewogCS5hbGxvY19pbm9kZSA9CWpmZnMyX2FsbG9jX2lub2RlLApAQCAtMTQzLDYgKzI1NSw3IEBACiAJLnJlbW91bnRfZnMgPQlqZmZzMl9yZW1vdW50X2ZzLAogCS5ldmljdF9pbm9kZSA9CWpmZnMyX2V2aWN0X2lub2RlLAogCS5kaXJ0eV9pbm9kZSA9CWpmZnMyX2RpcnR5X2lub2RlLAorCS5zaG93X29wdGlvbnMgPQlqZmZzMl9zaG93X29wdGlvbnMsCiAJLnN5bmNfZnMgPQlqZmZzMl9zeW5jX2ZzLAogfTsKIApAQCAtMTY2LDYgKzI3OSwxMiBAQAogCWMtPm9zX3ByaXYgPSBzYjsKIAlzYi0+c19mc19pbmZvID0gYzsKIAorCXJldCA9IGpmZnMyX3BhcnNlX29wdGlvbnMoYywgZGF0YSk7CisJaWYgKHJldCkgeworCQlrZnJlZShjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogSW5pdGlhbGl6ZSBKRkZTMiBzdXBlcmJsb2NrIGxvY2tzLCB0aGUgZnVydGhlciBpbml0aWFsaXphdGlvbiB3aWxsCiAJICogYmUgZG9uZSBsYXRlciAqLwogCW11dGV4X2luaXQoJmMtPmFsbG9jX3NlbSk7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi93YnVmLmMgYi9mcy9qZmZzMi93YnVmLmMKaW5kZXggNDUxNWJlYS4uYjA5ZTUxZCAxMDA2NDQKLS0tIGEvZnMvamZmczIvd2J1Zi5jCisrKyBiL2ZzL2pmZnMyL3didWYuYwpAQCAtNTc4LDggKzU3OCw3IEBACiAJaWYgKCFqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpKQogCQlyZXR1cm4gMDsKIAotCWlmIChtdXRleF90cnlsb2NrKCZjLT5hbGxvY19zZW0pKSB7Ci0JCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKKwlpZiAoIW11dGV4X2lzX2xvY2tlZCgmYy0+YWxsb2Nfc2VtKSkgewogCQlwcmludGsoS0VSTl9DUklUICJqZmZzMl9mbHVzaF93YnVmKCkgY2FsbGVkIHdpdGggYWxsb2Nfc2VtIG5vdCBsb2NrZWQhXG4iKTsKIAkJQlVHKCk7CiAJfQpAQCAtMTAyNiw3ICsxMDI1LDcgQEAKIAlpbnQgY21sZW4gPSBtaW5fdChpbnQsIGMtPm9vYmF2YWlsLCBPT0JfQ01fU0laRSk7CiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAotCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlID0gTVREX09QU19BVVRPX09PQjsKIAlvcHMub29ibGVuID0gTlJfT09CX1NDQU5fUEFHRVMgKiBjLT5vb2JhdmFpbDsKIAlvcHMub29iYnVmID0gYy0+b29iYnVmOwogCW9wcy5sZW4gPSBvcHMub29ib2ZmcyA9IG9wcy5yZXRsZW4gPSBvcHMub29icmV0bGVuID0gMDsKQEAgLTEwNjksNyArMTA2OCw3IEBACiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmV0LCBjbWxlbiA9IG1pbl90KGludCwgYy0+b29iYXZhaWwsIE9PQl9DTV9TSVpFKTsKIAotCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlID0gTVREX09QU19BVVRPX09PQjsKIAlvcHMub29ibGVuID0gY21sZW47CiAJb3BzLm9vYmJ1ZiA9IGMtPm9vYmJ1ZjsKIAlvcHMubGVuID0gb3BzLm9vYm9mZnMgPSBvcHMucmV0bGVuID0gb3BzLm9vYnJldGxlbiA9IDA7CkBAIC0xMDk1LDcgKzEwOTQsNyBAQAogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IGNtbGVuID0gbWluX3QoaW50LCBjLT5vb2JhdmFpbCwgT09CX0NNX1NJWkUpOwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX0FVVE87CisJb3BzLm1vZGUgPSBNVERfT1BTX0FVVE9fT09COwogCW9wcy5vb2JsZW4gPSBjbWxlbjsKIAlvcHMub29iYnVmID0gKHVpbnQ4X3QgKikmb29iX2NsZWFubWFya2VyOwogCW9wcy5sZW4gPSBvcHMub29ib2ZmcyA9IG9wcy5yZXRsZW4gPSBvcHMub29icmV0bGVuID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfaW1hcC5jIGIvZnMvamZzL2pmc19pbWFwLmMKaW5kZXggYjc4YjJmOS4uMWI2ZjE1ZiAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19pbWFwLmMKKysrIGIvZnMvamZzL2pmc19pbWFwLmMKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCS8qIHJlYWQgdGhlIHBhZ2Ugb2YgZml4ZWQgZGlzayBpbm9kZSAoQUlUKSBpbiByYXcgbW9kZSAqLwogCW1wID0gcmVhZF9tZXRhcGFnZShpcCwgYWRkcmVzcyA8PCBzYmktPmwybmJwZXJwYWdlLCBQU0laRSwgMSk7CiAJaWYgKG1wID09IE5VTEwpIHsKLQkJaXAtPmlfbmxpbmsgPSAxOwkvKiBEb24ndCB3YW50IGlwdXQoKSBkZWxldGluZyBpdCAqLworCQlzZXRfbmxpbmsoaXAsIDEpOwkvKiBEb24ndCB3YW50IGlwdXQoKSBkZWxldGluZyBpdCAqLwogCQlpcHV0KGlwKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CkBAIC00NjksNyArNDY5LDcgQEAKIAkvKiBjb3B5IG9uLWRpc2sgaW5vZGUgdG8gaW4tbWVtb3J5IGlub2RlICovCiAJaWYgKChjb3B5X2Zyb21fZGlub2RlKGRwLCBpcCkpICE9IDApIHsKIAkJLyogaGFuZGxlIGJhZCByZXR1cm4gYnkgcmV0dXJuaW5nIE5VTEwgZm9yIGlwICovCi0JCWlwLT5pX25saW5rID0gMTsJLyogRG9uJ3Qgd2FudCBpcHV0KCkgZGVsZXRpbmcgaXQgKi8KKwkJc2V0X25saW5rKGlwLCAxKTsJLyogRG9uJ3Qgd2FudCBpcHV0KCkgZGVsZXRpbmcgaXQgKi8KIAkJaXB1dChpcCk7CiAJCS8qIHJlbGVhc2UgdGhlIHBhZ2UgKi8KIAkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CkBAIC0zMDc2LDcgKzMwNzYsNyBAQAogCQkJCWlwLT5pX21vZGUgfD0gMDAwMTsKIAkJfQogCX0KLQlpcC0+aV9ubGluayA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfbmxpbmspOworCXNldF9ubGluayhpcCwgbGUzMl90b19jcHUoZGlwLT5kaV9ubGluaykpOwogCiAJamZzX2lwLT5zYXZlZF91aWQgPSBsZTMyX3RvX2NwdShkaXAtPmRpX3VpZCk7CiAJaWYgKHNiaS0+dWlkID09IC0xKQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbm9kZS5jIGIvZnMvamZzL2pmc19pbm9kZS5jCmluZGV4IDI2ODY1MzEuLmMxYTNlNjAgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfaW5vZGUuYworKysgYi9mcy9qZnMvamZzX2lub2RlLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCWRxdW90X2Ryb3AoaW5vZGUpOwogCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKIGZhaWxfdW5sb2NrOgotCWlub2RlLT5pX25saW5rID0gMDsKKwljbGVhcl9ubGluayhpbm9kZSk7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiBmYWlsX3B1dDoKIAlpcHV0KGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMgYi9mcy9qZnMvamZzX2xvZ21nci5jCmluZGV4IDU4MzYzNmYuLmNjNWY4MTEgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMKKysrIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpAQCAtNjcsNiArNjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3Igc3luY19ibG9ja2RldigpICovCiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpkaWZmIC0tZ2l0IGEvZnMvamZzL25hbWVpLmMgYi9mcy9qZnMvbmFtZWkuYwppbmRleCBlMTc1NDVlLi5hMTEyYWQ5IDEwMDY0NAotLS0gYS9mcy9qZnMvbmFtZWkuYworKysgYi9mcy9qZnMvbmFtZWkuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJbXV0ZXhfdW5sb2NrKCZKRlNfSVAoZGlwKS0+Y29tbWl0X211dGV4KTsKIAlpZiAocmMpIHsKIAkJZnJlZV9lYV93bWFwKGlwKTsKLQkJaXAtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpcCk7CiAJCXVubG9ja19uZXdfaW5vZGUoaXApOwogCQlpcHV0KGlwKTsKIAl9IGVsc2UgewpAQCAtMjkyLDcgKzI5Miw3IEBACiAJCWdvdG8gb3V0MzsKIAl9CiAKLQlpcC0+aV9ubGluayA9IDI7CS8qIGZvciAnLicgKi8KKwlzZXRfbmxpbmsoaXAsIDIpOwkvKiBmb3IgJy4nICovCiAJaXAtPmlfb3AgPSAmamZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlwLT5pX2ZvcCA9ICZqZnNfZGlyX29wZXJhdGlvbnM7CiAKQEAgLTMxMSw3ICszMTEsNyBAQAogCW11dGV4X3VubG9jaygmSkZTX0lQKGRpcCktPmNvbW1pdF9tdXRleCk7CiAJaWYgKHJjKSB7CiAJCWZyZWVfZWFfd21hcChpcCk7Ci0JCWlwLT5pX25saW5rID0gMDsKKwkJY2xlYXJfbmxpbmsoaXApOwogCQl1bmxvY2tfbmV3X2lub2RlKGlwKTsKIAkJaXB1dChpcCk7CiAJfSBlbHNlIHsKQEAgLTg0NCw3ICs4NDQsNyBAQAogCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCAwKTsKIAogCWlmIChyYykgewotCQlpcC0+aV9ubGluay0tOyAvKiBuZXZlciBpbnN0YW50aWF0ZWQgKi8KKwkJZHJvcF9ubGluayhpcCk7IC8qIG5ldmVyIGluc3RhbnRpYXRlZCAqLwogCQlpcHV0KGlwKTsKIAl9IGVsc2UKIAkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlwKTsKQEAgLTEwNDgsNyArMTA0OCw3IEBACiAJbXV0ZXhfdW5sb2NrKCZKRlNfSVAoZGlwKS0+Y29tbWl0X211dGV4KTsKIAlpZiAocmMpIHsKIAkJZnJlZV9lYV93bWFwKGlwKTsKLQkJaXAtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpcCk7CiAJCXVubG9ja19uZXdfaW5vZGUoaXApOwogCQlpcHV0KGlwKTsKIAl9IGVsc2UgewpAQCAtMTQzMyw3ICsxNDMzLDcgQEAKIAltdXRleF91bmxvY2soJkpGU19JUChkaXIpLT5jb21taXRfbXV0ZXgpOwogCWlmIChyYykgewogCQlmcmVlX2VhX3dtYXAoaXApOwotCQlpcC0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlwKTsKIAkJdW5sb2NrX25ld19pbm9kZShpcCk7CiAJCWlwdXQoaXApOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDA2YzhhNjcuLmE0NGVmZjA3NiAxMDA2NDQKLS0tIGEvZnMvamZzL3N1cGVyLmMKKysrIGIvZnMvamZzL3N1cGVyLmMKQEAgLTQ4NSw3ICs0ODUsNiBAQAogCQlnb3RvIG91dF91bmxvYWQ7CiAJfQogCWlub2RlLT5pX2lubyA9IDA7Ci0JaW5vZGUtPmlfbmxpbmsgPSAxOwogCWlub2RlLT5pX3NpemUgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplOwogCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmpmc19tZXRhcGFnZV9hb3BzOwogCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2xpYmZzLmMgYi9mcy9saWJmcy5jCmluZGV4IGMxOGU5YTEuLmY2ZDQxMWUgMTAwNjQ0Ci0tLSBhL2ZzL2xpYmZzLmMKKysrIGIvZnMvbGliZnMuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCXJvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwogCWlmICghcm9vdCkgewogCQlpcHV0KGlub2RlKTsKQEAgLTUxMCw4ICs1MTAsMTAgQEAKIAkJaWYgKCFkZW50cnkpCiAJCQlnb3RvIG91dDsKIAkJaW5vZGUgPSBuZXdfaW5vZGUocyk7Ci0JCWlmICghaW5vZGUpCisJCWlmICghaW5vZGUpIHsKKwkJCWRwdXQoZGVudHJ5KTsKIAkJCWdvdG8gb3V0OworCQl9CiAJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgZmlsZXMtPm1vZGU7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJaW5vZGUtPmlfZm9wID0gZmlsZXMtPm9wczsKZGlmZiAtLWdpdCBhL2ZzL2xvZ2ZzL2Rpci5jIGIvZnMvbG9nZnMvZGlyLmMKaW5kZXggYjNmZjNkOC4uYjdkN2Y2NyAxMDA2NDQKLS0tIGEvZnMvbG9nZnMvZGlyLmMKKysrIGIvZnMvbG9nZnMvZGlyLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogewogCWludCByZXQ7CiAKLQlpbm9kZS0+aV9ubGluay0tOworCWRyb3BfbmxpbmsoaW5vZGUpOwogCXJldCA9IHdyaXRlX2lub2RlKGlub2RlKTsKIAlMT0dGU19CVUdfT04ocmV0LCBpbm9kZS0+aV9zYik7CiAJcmV0dXJuIHJldDsKQEAgLTQzMyw3ICs0MzMsNyBAQAogCiAJdGEgPSBremFsbG9jKHNpemVvZigqdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRhKSB7Ci0JCWlub2RlLT5pX25saW5rLS07CisJCWRyb3BfbmxpbmsoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJCWFib3J0X3RyYW5zYWN0aW9uKGlub2RlLCB0YSk7CiAJCWxpLT5saV9mbGFncyB8PSBMT0dGU19JRl9TVElMTEJPUk47CiAJCS8qIEZJWE1FOiB0cnVuY2F0ZSBzeW1saW5rICovCi0JCWlub2RlLT5pX25saW5rLS07CisJCWRyb3BfbmxpbmsoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNTYzLDcgKzU2Myw3IEBACiAKIAlpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAlpaG9sZChpbm9kZSk7Ci0JaW5vZGUtPmlfbmxpbmsrKzsKKwlpbmNfbmxpbmsoaW5vZGUpOwogCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiAKIAlyZXR1cm4gX19sb2dmc19jcmVhdGUoZGlyLCBkZW50cnksIGlub2RlLCBOVUxMLCAwKTsKZGlmZiAtLWdpdCBhL2ZzL2xvZ2ZzL2lub2RlLmMgYi9mcy9sb2dmcy9pbm9kZS5jCmluZGV4IGVkZmVhN2EuLjdlNDQxYWQgMTAwNjQ0Ci0tLSBhL2ZzL2xvZ2ZzL2lub2RlLmMKKysrIGIvZnMvbG9nZnMvaW5vZGUuYwpAQCAtOTMsNyArOTMsNyBAQAogCQkvKiBpbm9kZS0+aV9ubGluayA9PSAwIGNhbiBiZSB0cnVlIHdoZW4gY2FsbGVkIGZyb20KIAkJICogYmxvY2sgdmFsaWRhdG9yICovCiAJCS8qIHNldCBpX25saW5rIHRvIDAgdG8gcHJldmVudCBjYWNoaW5nICovCi0JCWlub2RlLT5pX25saW5rID0gMDsKKwkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQlsb2dmc19pbm9kZShpbm9kZSktPmxpX2ZsYWdzIHw9IExPR0ZTX0lGX1pPTUJJRTsKIAkJaWdldF9mYWlsZWQoaW5vZGUpOwogCQlpZiAoIWVycikKQEAgLTE5OSw3ICsxOTksNiBAQAogCWlub2RlLT5pX2Jsb2Nrcwk9IDA7CiAJaW5vZGUtPmlfY3RpbWUJPSBDVVJSRU5UX1RJTUU7CiAJaW5vZGUtPmlfbXRpbWUJPSBDVVJSRU5UX1RJTUU7Ci0JaW5vZGUtPmlfbmxpbmsJPSAxOwogCWxpLT5saV9yZWZjb3VudCA9IDE7CiAJSU5JVF9MSVNUX0hFQUQoJmxpLT5saV9mcmVlaW5nX2xpc3QpOwogCmRpZmYgLS1naXQgYS9mcy9sb2dmcy9sb2dmcy5oIGIvZnMvbG9nZnMvbG9nZnMuaAppbmRleCBmMjJkMTA4Li4zOThlY2ZmNiAxMDA2NDQKLS0tIGEvZnMvbG9nZnMvbG9nZnMuaAorKysgYi9mcy9sb2dmcy9sb2dmcy5oCkBAIC02MTgsNyArNjE4LDYgQEAKIHN0cnVjdCBwYWdlICplbWVyZ2VuY3lfcmVhZF9iZWdpbihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCBpbmRleCk7CiB2b2lkIGVtZXJnZW5jeV9yZWFkX2VuZChzdHJ1Y3QgcGFnZSAqcGFnZSk7CiB2b2lkIGxvZ2ZzX2NyYXNoX2R1bXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Ci12b2lkICptZW1jaHJfaW52KGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CiBpbnQgbG9nZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKnN0YXRzKTsKIGludCBsb2dmc19jaGVja19kcyhzdHJ1Y3QgbG9nZnNfZGlza19zdXBlciAqZHMpOwogaW50IGxvZ2ZzX3dyaXRlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpkaWZmIC0tZ2l0IGEvZnMvbG9nZnMvcmVhZHdyaXRlLmMgYi9mcy9sb2dmcy9yZWFkd3JpdGUuYwppbmRleCBkOGQwOTM4Li4yYWM0MjE3IDEwMDY0NAotLS0gYS9mcy9sb2dmcy9yZWFkd3JpdGUuYworKysgYi9mcy9sb2dmcy9yZWFkd3JpdGUuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAJaW5vZGUtPmlfYXRpbWUJPSBiZTY0X3RvX3RpbWVzcGVjKGRpLT5kaV9hdGltZSk7CiAJaW5vZGUtPmlfY3RpbWUJPSBiZTY0X3RvX3RpbWVzcGVjKGRpLT5kaV9jdGltZSk7CiAJaW5vZGUtPmlfbXRpbWUJPSBiZTY0X3RvX3RpbWVzcGVjKGRpLT5kaV9tdGltZSk7Ci0JaW5vZGUtPmlfbmxpbmsJPSBiZTMyX3RvX2NwdShkaS0+ZGlfcmVmY291bnQpOworCXNldF9ubGluayhpbm9kZSwgYmUzMl90b19jcHUoZGktPmRpX3JlZmNvdW50KSk7CiAJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGJlMzJfdG9fY3B1KGRpLT5kaV9nZW5lcmF0aW9uKTsKIAogCXN3aXRjaCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgewpkaWZmIC0tZ2l0IGEvZnMvbG9nZnMvc3VwZXIuYyBiL2ZzL2xvZ2ZzL3N1cGVyLmMKaW5kZXggY2UwM2ExOC4uZTc5NWMyMzQgMTAwNjQ0Ci0tLSBhL2ZzL2xvZ2ZzL3N1cGVyLmMKKysrIGIvZnMvbG9nZnMvc3VwZXIuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KQEAgLTkxLDI4ICs5Miw2IEBACiB9CiAKIC8qCi0gKiBUT0RPOiBtb3ZlIHRvIGxpYi9zdHJpbmcuYwotICovCi0vKioKLSAqIG1lbWNocl9pbnYgLSBGaW5kIGEgY2hhcmFjdGVyIGluIGFuIGFyZWEgb2YgbWVtb3J5LgotICogQHM6IFRoZSBtZW1vcnkgYXJlYQotICogQGM6IFRoZSBieXRlIHRvIHNlYXJjaCBmb3IKLSAqIEBuOiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KLSAqCi0gKiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBAYywgb3IgJU5VTEwKLSAqIGlmIHRoZSB3aG9sZSBidWZmZXIgY29udGFpbnMganVzdCBAYy4KLSAqLwotdm9pZCAqbWVtY2hyX2ludihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCi17Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHM7Ci0Jd2hpbGUgKG4tLSAhPSAwKQotCQlpZiAoKHVuc2lnbmVkIGNoYXIpYyAhPSAqcCsrKQotCQkJcmV0dXJuICh2b2lkICopKHAgLSAxKTsKLQotCXJldHVybiBOVUxMOwotfQotCi0vKgogICogRklYTUU6IFRoZXJlIHNob3VsZCBiZSBhIHJlc2VydmUgZm9yIHJvb3QsIHNpbWlsYXIgdG8gZXh0Mi4KICAqLwogaW50IGxvZ2ZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpzdGF0cykKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2lub2RlLmMgYi9mcy9taW5peC9pbm9kZS5jCmluZGV4IGU3ZDIzZTIuLjY0Y2RjZDYgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L2lub2RlLmMKKysrIGIvZnMvbWluaXgvaW5vZGUuYwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IHJhd19pbm9kZS0+aV9tb2RlOwogCWlub2RlLT5pX3VpZCA9ICh1aWRfdClyYXdfaW5vZGUtPmlfdWlkOwogCWlub2RlLT5pX2dpZCA9IChnaWRfdClyYXdfaW5vZGUtPmlfZ2lkOwotCWlub2RlLT5pX25saW5rID0gcmF3X2lub2RlLT5pX25saW5rczsKKwlzZXRfbmxpbmsoaW5vZGUsIHJhd19pbm9kZS0+aV9ubGlua3MpOwogCWlub2RlLT5pX3NpemUgPSByYXdfaW5vZGUtPmlfc2l6ZTsKIAlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9zZWMgPSByYXdfaW5vZGUtPmlfdGltZTsKIAlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKQEAgLTQ3OSw3ICs0NzksNyBAQAogCWlub2RlLT5pX21vZGUgPSByYXdfaW5vZGUtPmlfbW9kZTsKIAlpbm9kZS0+aV91aWQgPSAodWlkX3QpcmF3X2lub2RlLT5pX3VpZDsKIAlpbm9kZS0+aV9naWQgPSAoZ2lkX3QpcmF3X2lub2RlLT5pX2dpZDsKLQlpbm9kZS0+aV9ubGluayA9IHJhd19pbm9kZS0+aV9ubGlua3M7CisJc2V0X25saW5rKGlub2RlLCByYXdfaW5vZGUtPmlfbmxpbmtzKTsKIAlpbm9kZS0+aV9zaXplID0gcmF3X2lub2RlLT5pX3NpemU7CiAJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gcmF3X2lub2RlLT5pX210aW1lOwogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHJhd19pbm9kZS0+aV9hdGltZTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDBiMzEzOGQuLjUwMDhmMDEgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGNoYXIgKmdldG5hbWVfZmxhZ3MoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgaW50IGZsYWdzKQorc3RhdGljIGNoYXIgKmdldG5hbWVfZmxhZ3MoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCAqZW1wdHkpCiB7CiAJY2hhciAqdG1wLCAqcmVzdWx0OwogCkBAIC0xNDgsNiArMTQ4LDggQEAKIAogCQlyZXN1bHQgPSB0bXA7CiAJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlpZiAocmV0dmFsID09IC1FTk9FTlQgJiYgZW1wdHkpCisJCQkJKmVtcHR5ID0gMTsKIAkJCWlmIChyZXR2YWwgIT0gLUVOT0VOVCB8fCAhKGZsYWdzICYgTE9PS1VQX0VNUFRZKSkgewogCQkJCV9fcHV0bmFtZSh0bXApOwogCQkJCXJlc3VsdCA9IEVSUl9QVFIocmV0dmFsKTsKQEAgLTE2MCw3ICsxNjIsNyBAQAogCiBjaGFyICpnZXRuYW1lKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUpCiB7Ci0JcmV0dXJuIGdldG5hbWVfZmxhZ3MoZmlsZW5hbWUsIDApOworCXJldHVybiBnZXRuYW1lX2ZsYWdzKGZpbGVuYW1lLCAwLCAwKTsKIH0KIAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKQEAgLTIyMSwxNCArMjIzLDEyIEBACiB9CiAKIC8qCi0gKiBUaGlzIGRvZXMgYmFzaWMgUE9TSVggQUNMIHBlcm1pc3Npb24gY2hlY2tpbmcKKyAqIFRoaXMgZG9lcyB0aGUgYmFzaWMgcGVybWlzc2lvbiBjaGVja2luZwogICovCiBzdGF0aWMgaW50IGFjbF9wZXJtaXNzaW9uX2NoZWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCXVuc2lnbmVkIGludCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAotCW1hc2sgJj0gTUFZX1JFQUQgfCBNQVlfV1JJVEUgfCBNQVlfRVhFQyB8IE1BWV9OT1RfQkxPQ0s7Ci0KIAlpZiAoY3VycmVudF91c2VyX25zKCkgIT0gaW5vZGVfdXNlcm5zKGlub2RlKSkKIAkJZ290byBvdGhlcl9wZXJtczsKIApAQCAtMjU3LDcgKzI1Nyw3IEBACiAvKioKICAqIGdlbmVyaWNfcGVybWlzc2lvbiAtICBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cyBvbiBhIFBvc2l4LWxpa2UgZmlsZXN5c3RlbQogICogQGlub2RlOglpbm9kZSB0byBjaGVjayBhY2Nlc3MgcmlnaHRzIGZvcgotICogQG1hc2s6CXJpZ2h0IHRvIGNoZWNrIGZvciAoJU1BWV9SRUFELCAlTUFZX1dSSVRFLCAlTUFZX0VYRUMpCisgKiBAbWFzazoJcmlnaHQgdG8gY2hlY2sgZm9yICglTUFZX1JFQUQsICVNQVlfV1JJVEUsICVNQVlfRVhFQywgLi4uKQogICoKICAqIFVzZWQgdG8gY2hlY2sgZm9yIHJlYWQvd3JpdGUvZXhlY3V0ZSBwZXJtaXNzaW9ucyBvbiBhIGZpbGUuCiAgKiBXZSB1c2UgImZzdWlkIiBmb3IgdGhpcywgbGV0dGluZyB1cyBzZXQgYXJiaXRyYXJ5IHBlcm1pc3Npb25zCkBAIC0yNzMsNyArMjczLDcgQEAKIAlpbnQgcmV0OwogCiAJLyoKLQkgKiBEbyB0aGUgYmFzaWMgUE9TSVggQUNMIHBlcm1pc3Npb24gY2hlY2tzLgorCSAqIERvIHRoZSBiYXNpYyBwZXJtaXNzaW9uIGNoZWNrcy4KIAkgKi8KIAlyZXQgPSBhY2xfcGVybWlzc2lvbl9jaGVjayhpbm9kZSwgbWFzayk7CiAJaWYgKHJldCAhPSAtRUFDQ0VTKQpAQCAtMzMxLDEyICszMzEsMTQgQEAKIC8qKgogICogaW5vZGVfcGVybWlzc2lvbiAgLSAgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMgdG8gYSBnaXZlbiBpbm9kZQogICogQGlub2RlOglpbm9kZSB0byBjaGVjayBwZXJtaXNzaW9uIG9uCi0gKiBAbWFzazoJcmlnaHQgdG8gY2hlY2sgZm9yICglTUFZX1JFQUQsICVNQVlfV1JJVEUsICVNQVlfRVhFQykKKyAqIEBtYXNrOglyaWdodCB0byBjaGVjayBmb3IgKCVNQVlfUkVBRCwgJU1BWV9XUklURSwgJU1BWV9FWEVDLCAuLi4pCiAgKgogICogVXNlZCB0byBjaGVjayBmb3IgcmVhZC93cml0ZS9leGVjdXRlIHBlcm1pc3Npb25zIG9uIGFuIGlub2RlLgogICogV2UgdXNlICJmc3VpZCIgZm9yIHRoaXMsIGxldHRpbmcgdXMgc2V0IGFyYml0cmFyeSBwZXJtaXNzaW9ucwogICogZm9yIGZpbGVzeXN0ZW0gYWNjZXNzIHdpdGhvdXQgY2hhbmdpbmcgdGhlICJub3JtYWwiIHVpZHMgd2hpY2gKICAqIGFyZSB1c2VkIGZvciBvdGhlciB0aGluZ3MuCisgKgorICogV2hlbiBjaGVja2luZyBmb3IgTUFZX0FQUEVORCwgTUFZX1dSSVRFIG11c3QgYWxzbyBiZSBzZXQgaW4gQG1hc2suCiAgKi8KIGludCBpbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewpAQCAtODUwLDcgKzg1Miw3IEBACiAJCW1udHB1dChwYXRoLT5tbnQpOwogCWlmIChyZXQgPT0gLUVJU0RJUikKIAkJcmV0ID0gMDsKLQlyZXR1cm4gcmV0OworCXJldHVybiByZXQgPCAwID8gcmV0IDogbmVlZF9tbnRwdXQ7CiB9CiAKIGludCBmb2xsb3dfZG93bl9vbmUoc3RydWN0IHBhdGggKnBhdGgpCkBAIC04OTgsNiArOTAwLDcgQEAKIAkJCWJyZWFrOwogCQlwYXRoLT5tbnQgPSBtb3VudGVkOwogCQlwYXRoLT5kZW50cnkgPSBtb3VudGVkLT5tbnRfcm9vdDsKKwkJbmQtPmZsYWdzIHw9IExPT0tVUF9KVU1QRUQ7CiAJCW5kLT5zZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZwYXRoLT5kZW50cnktPmRfc2VxKTsKIAkJLyoKIAkJICogVXBkYXRlIHRoZSBpbm9kZSB0b28uIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgdGhlCkBAIC0xMjExLDYgKzEyMTQsOCBAQAogCQlwYXRoX3B1dF9jb25kaXRpb25hbChwYXRoLCBuZCk7CiAJCXJldHVybiBlcnI7CiAJfQorCWlmIChlcnIpCisJCW5kLT5mbGFncyB8PSBMT09LVVBfSlVNUEVEOwogCSppbm9kZSA9IHBhdGgtPmRlbnRyeS0+ZF9pbm9kZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE3OTgsMTEgKzE4MDMsMTEgQEAKIAlyZXR1cm4gX19sb29rdXBfaGFzaCgmdGhpcywgYmFzZSwgTlVMTCk7CiB9CiAKLWludCB1c2VyX3BhdGhfYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsIHVuc2lnbmVkIGZsYWdzLAotCQkgc3RydWN0IHBhdGggKnBhdGgpCitpbnQgdXNlcl9wYXRoX2F0X2VtcHR5KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpuYW1lLCB1bnNpZ25lZCBmbGFncywKKwkJIHN0cnVjdCBwYXRoICpwYXRoLCBpbnQgKmVtcHR5KQogewogCXN0cnVjdCBuYW1laWRhdGEgbmQ7Ci0JY2hhciAqdG1wID0gZ2V0bmFtZV9mbGFncyhuYW1lLCBmbGFncyk7CisJY2hhciAqdG1wID0gZ2V0bmFtZV9mbGFncyhuYW1lLCBmbGFncywgZW1wdHkpOwogCWludCBlcnIgPSBQVFJfRVJSKHRtcCk7CiAJaWYgKCFJU19FUlIodG1wKSkgewogCkBAIC0xODE2LDYgKzE4MjEsMTIgQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgdXNlcl9wYXRoX2F0KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpuYW1lLCB1bnNpZ25lZCBmbGFncywKKwkJIHN0cnVjdCBwYXRoICpwYXRoKQoreworCXJldHVybiB1c2VyX3BhdGhfYXRfZW1wdHkoZGZkLCBuYW1lLCBmbGFncywgcGF0aCwgMCk7Cit9CisKIHN0YXRpYyBpbnQgdXNlcl9wYXRoX3BhcmVudChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwKIAkJCXN0cnVjdCBuYW1laWRhdGEgKm5kLCBjaGFyICoqbmFtZSkKIHsKQEAgLTIwMzUsMTAgKzIwNDYsNyBAQAogCWlmIChmbGFnICYgT19OT0FUSU1FICYmICFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlub2RlKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCS8qCi0JICogRW5zdXJlIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyBsZWFzZXMgb24gdGhlIGZpbGUuCi0JICovCi0JcmV0dXJuIGJyZWFrX2xlYXNlKGlub2RlLCBmbGFnKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBoYW5kbGVfdHJ1bmNhdGUoc3RydWN0IGZpbGUgKmZpbHApCkBAIC0yMTQxLDYgKzIxNDksMTAgQEAKIAl9CiAKIAkvKiBjcmVhdGUgc2lkZSBvZiB0aGluZ3MgKi8KKwkvKgorCSAqIFRoaXMgd2lsbCAqb25seSogZGVhbCB3aXRoIGxlYXZpbmcgUkNVIG1vZGUgLSBMT09LVVBfSlVNUEVEIGhhcyBiZWVuCisJICogY2xlYXJlZCB3aGVuIHdlIGdvdCB0byB0aGUgbGFzdCBjb21wb25lbnQgd2UgYXJlIGFib3V0IHRvIGxvb2sgdXAKKwkgKi8KIAllcnJvciA9IGNvbXBsZXRlX3dhbGsobmQpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwpAQCAtMjIwOSw2ICsyMjIxLDkgQEAKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIGV4aXRfZHB1dDsKIAorCWlmIChlcnJvcikKKwkJbmQtPmZsYWdzIHw9IExPT0tVUF9KVU1QRUQ7CisKIAllcnJvciA9IC1FTk9FTlQ7CiAJaWYgKCFwYXRoLT5kZW50cnktPmRfaW5vZGUpCiAJCWdvdG8gZXhpdF9kcHV0OwpAQCAtMjIxOCw2ICsyMjMzLDEwIEBACiAKIAlwYXRoX3RvX25hbWVpZGF0YShwYXRoLCBuZCk7CiAJbmQtPmlub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOworCS8qIFdoeSB0aGlzLCB5b3UgYXNrPyAgX05vd18gd2UgbWlnaHQgaGF2ZSBncm93biBMT09LVVBfSlVNUEVELi4uICovCisJZXJyb3IgPSBjb21wbGV0ZV93YWxrKG5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXhpdDsKIAllcnJvciA9IC1FSVNESVI7CiAJaWYgKFNfSVNESVIobmQtPmlub2RlLT5pX21vZGUpKQogCQlnb3RvIGV4aXQ7CmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IGI0ZmViYjIuLmU1ZTFjN2QgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0xMTA5LDYgKzExMDksNyBAQAogCiAJLyogZGV2aWNlICovCiAJaWYgKG1udC0+bW50X3NiLT5zX29wLT5zaG93X2Rldm5hbWUpIHsKKwkJc2VxX3B1dHMobSwgImRldmljZSAiKTsKIAkJZXJyID0gbW50LT5tbnRfc2ItPnNfb3AtPnNob3dfZGV2bmFtZShtLCBtbnQpOwogCX0gZWxzZSB7CiAJCWlmIChtbnQtPm1udF9kZXZuYW1lKSB7CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9pbm9kZS5jIGIvZnMvbmNwZnMvaW5vZGUuYwppbmRleCAyMDJmMzcwLi41YjVmYTMzIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9pbm9kZS5jCisrKyBiL2ZzL25jcGZzL2lub2RlLmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogCiAJRERQUklOVEsoIm5jcF9yZWFkX2lub2RlOiBpbm9kZS0+aV9tb2RlID0gJXVcbiIsIGlub2RlLT5pX21vZGUpOwogCi0JaW5vZGUtPmlfbmxpbmsgPSAxOworCXNldF9ubGluayhpbm9kZSwgMSk7CiAJaW5vZGUtPmlfdWlkID0gc2VydmVyLT5tLnVpZDsKIAlpbm9kZS0+aV9naWQgPSBzZXJ2ZXItPm0uZ2lkOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2tfeGRyLmMgYi9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKaW5kZXggOTE4YWQ2NC4uNzI2ZTU5YSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrX3hkci5jCisrKyBiL2ZzL25mcy9jYWxsYmFja194ZHIuYwpAQCAtNDg4LDE3ICs0ODgsMTggQEAKIAkJCQkgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkJCSAgICAgIHN0cnVjdCBjYl9yZWNhbGxhbnlhcmdzICphcmdzKQogewotCV9fYmUzMiAqcDsKKwl1aW50MzJfdCBiaXRtYXBbMl07CisJX19iZTMyICpwLCBzdGF0dXM7CiAKIAlhcmdzLT5jcmFhX2FkZHIgPSBzdmNfYWRkcihycXN0cCk7CiAJcCA9IHJlYWRfYnVmKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCXJldHVybiBodG9ubChORlM0RVJSX0JBRFhEUik7CiAJYXJncy0+Y3JhYV9vYmpzX3RvX2tlZXAgPSBudG9obCgqcCsrKTsKLQlwID0gcmVhZF9idWYoeGRyLCA0KTsKLQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKLQkJcmV0dXJuIGh0b25sKE5GUzRFUlJfQkFEWERSKTsKLQlhcmdzLT5jcmFhX3R5cGVfbWFzayA9IG50b2hsKCpwKTsKKwlzdGF0dXMgPSBkZWNvZGVfYml0bWFwKHhkciwgYml0bWFwKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlhcmdzLT5jcmFhX3R5cGVfbWFzayA9IGJpdG1hcFswXTsKIAogCXJldHVybiAwOwogfQpAQCAtOTg2LDQgKzk4Nyw1IEBACiAJLnZzX3Byb2MgPSBuZnM0X2NhbGxiYWNrX3Byb2NlZHVyZXMxLAogCS52c194ZHJzaXplID0gTkZTNF9DQUxMQkFDS19YRFJTSVpFLAogCS52c19kaXNwYXRjaCA9IE5VTEwsCisJLnZzX2hpZGRlbiA9IDEsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZpbGUuYyBiL2ZzL25mcy9maWxlLmMKaW5kZXggMjhiOGMzZi4uMGExZjgzMSAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZpbGUuYworKysgYi9mcy9uZnMvZmlsZS5jCkBAIC0xMzcsMTEgKzEzNyw5IEBACiBzdGF0aWMgaW50CiBuZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7Ci0KIAlkcHJpbnRrKCJORlM6IHJlbGVhc2UoJXMvJXMpXG4iLAotCQkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsCi0JCQlkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKKwkJCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCW5mc19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19WRlNSRUxFQVNFKTsKIAlyZXR1cm4gbmZzX3JlbGVhc2UoaW5vZGUsIGZpbHApOwpAQCAtMTgwLDggKzE3OCw2IEBACiAKIHN0YXRpYyBsb2ZmX3QgbmZzX2ZpbGVfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQogewotCWxvZmZfdCBsb2ZmOwotCiAJZHByaW50aygiTkZTOiBsbHNlZWsgZmlsZSglcy8lcywgJWxsZCwgJWQpXG4iLAogCQkJZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAogCQkJZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUsCkBAIC0xOTcsMTMgKzE5Myw5IEBACiAJCWludCByZXR2YWwgPSBuZnNfcmV2YWxpZGF0ZV9maWxlX3NpemUoaW5vZGUsIGZpbHApOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCXJldHVybiAobG9mZl90KXJldHZhbDsKKwl9CiAKLQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkJbG9mZiA9IGdlbmVyaWNfZmlsZV9sbHNlZWtfdW5sb2NrZWQoZmlscCwgb2Zmc2V0LCBvcmlnaW4pOwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JfSBlbHNlCi0JCWxvZmYgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbHAsIG9mZnNldCwgb3JpZ2luKTsKLQlyZXR1cm4gbG9mZjsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX2xsc2VlayhmaWxwLCBvZmZzZXQsIG9yaWdpbik7CiB9CiAKIC8qCkBAIC0yMzQsMTQgKzIyNiwxMyBAQAogCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBpb2NiLT5raV9maWxwLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXNzaXplX3QgcmVzdWx0OwotCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKIAogCWlmIChpb2NiLT5raV9maWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpCiAJCXJldHVybiBuZnNfZmlsZV9kaXJlY3RfcmVhZChpb2NiLCBpb3YsIG5yX3NlZ3MsIHBvcyk7CiAKIAlkcHJpbnRrKCJORlM6IHJlYWQoJXMvJXMsICVsdUAlbHUpXG4iLAogCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJKHVuc2lnbmVkIGxvbmcpIGNvdW50LCAodW5zaWduZWQgbG9uZykgcG9zKTsKKwkJKHVuc2lnbmVkIGxvbmcpIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSwgKHVuc2lnbmVkIGxvbmcpIHBvcyk7CiAKIAlyZXN1bHQgPSBuZnNfcmV2YWxpZGF0ZV9tYXBwaW5nKGlub2RlLCBpb2NiLT5raV9maWxwLT5mX21hcHBpbmcpOwogCWlmICghcmVzdWx0KSB7CmRpZmYgLS1naXQgYS9mcy9uZnMvaW5vZGUuYyBiL2ZzL25mcy9pbm9kZS5jCmluZGV4IDRkYzZkMDcuLmMwN2E1NWEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbm9kZS5jCisrKyBiL2ZzL25mcy9pbm9kZS5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAkJbWVtc2V0KCZpbm9kZS0+aV9jdGltZSwgMCwgc2l6ZW9mKGlub2RlLT5pX2N0aW1lKSk7CiAJCWlub2RlLT5pX3ZlcnNpb24gPSAwOwogCQlpbm9kZS0+aV9zaXplID0gMDsKLQkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpbm9kZSk7CiAJCWlub2RlLT5pX3VpZCA9IC0yOwogCQlpbm9kZS0+aV9naWQgPSAtMjsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKQEAgLTM1NSw3ICszNTUsNyBAQAogCQkJCXwgTkZTX0lOT19JTlZBTElEX0RBVEEKIAkJCQl8IE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFOwogCQlpZiAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfTkxJTkspCi0JCQlpbm9kZS0+aV9ubGluayA9IGZhdHRyLT5ubGluazsKKwkJCXNldF9ubGluayhpbm9kZSwgZmF0dHItPm5saW5rKTsKIAkJZWxzZSBpZiAobmZzX3NlcnZlcl9jYXBhYmxlKGlub2RlLCBORlNfQ0FQX05MSU5LKSkKIAkJCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOwogCQlpZiAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfT1dORVIpCkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogCQkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQVRUUjsKIAkJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQkJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0RBVEE7Ci0JCQlpbm9kZS0+aV9ubGluayA9IGZhdHRyLT5ubGluazsKKwkJCXNldF9ubGluayhpbm9kZSwgZmF0dHItPm5saW5rKTsKIAkJfQogCX0gZWxzZSBpZiAoc2VydmVyLT5jYXBzICYgTkZTX0NBUF9OTElOSykKIAkJaW52YWxpZCB8PSBzYXZlX2NhY2hlX3ZhbGlkaXR5ICYgKE5GU19JTk9fSU5WQUxJRF9BVFRSCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCmluZGV4IDA5MTE5NDEuLmE2MmQzNmIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCisrKyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJuZnM0ZmlsZWxheW91dC5oIgpAQCAtNDQ5LDkgKzQ1MCw4IEBACiAKIAlmbC0+ZHNhZGRyID0gZHNhZGRyOwogCi0JaWYgKGZsLT5maXJzdF9zdHJpcGVfaW5kZXggPCAwIHx8Ci0JICAgIGZsLT5maXJzdF9zdHJpcGVfaW5kZXggPj0gZHNhZGRyLT5zdHJpcGVfY291bnQpIHsKLQkJZHByaW50aygiJXMgQmFkIGZpcnN0X3N0cmlwZV9pbmRleCAlZFxuIiwKKwlpZiAoZmwtPmZpcnN0X3N0cmlwZV9pbmRleCA+PSBkc2FkZHItPnN0cmlwZV9jb3VudCkgeworCQlkcHJpbnRrKCIlcyBCYWQgZmlyc3Rfc3RyaXBlX2luZGV4ICV1XG4iLAogCQkJCV9fZnVuY19fLCBmbC0+Zmlyc3Rfc3RyaXBlX2luZGV4KTsKIAkJZ290byBvdXRfcHV0OwogCX0KQEAgLTU1Miw3ICs1NTIsNyBAQAogCiAJLyogTm90ZSB0aGF0IGEgemVybyB2YWx1ZSBmb3IgbnVtX2ZoIGlzIGxlZ2FsIGZvciBTVFJJUEVfU1BBUlNFLgogCSAqIEZ1dGhlciBjaGVja2luZyBpcyBkb25lIGluIGZpbGVsYXlvdXRfY2hlY2tfbGF5b3V0ICovCi0JaWYgKGZsLT5udW1fZmggPCAwIHx8IGZsLT5udW1fZmggPgorCWlmIChmbC0+bnVtX2ZoID4KIAkgICAgbWF4KE5GUzRfUE5GU19NQVhfU1RSSVBFX0NOVCwgTkZTNF9QTkZTX01BWF9NVUxUSV9DTlQpKQogCQlnb3RvIG91dF9lcnI7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggZDJhZTQxMy4uYjYwZmRkZiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTU5NTAsNiArNTk1MCw3IEBACiB7CiAJc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2RhdGEgKmRhdGEgPSBjYWxsZGF0YTsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZywgKnRtcDsKKwl1bnNpZ25lZCBsb25nICpiaXRsb2NrID0gJk5GU19JKGRhdGEtPmFyZ3MuaW5vZGUpLT5mbGFnczsKIAogCXBuZnNfY2xlYW51cF9sYXlvdXRjb21taXQoZGF0YSk7CiAJLyogTWF0Y2hlZCBieSByZWZlcmVuY2VzIGluIHBuZnNfc2V0X2xheW91dGNvbW1pdCAqLwpAQCAtNTk1OSw2ICs1OTYwLDExIEBACiAJCQkJICAgICAgICZsc2VnLT5wbHNfZmxhZ3MpKQogCQkJcHV0X2xzZWcobHNlZyk7CiAJfQorCisJY2xlYXJfYml0X3VubG9jayhORlNfSU5PX0xBWU9VVENPTU1JVFRJTkcsIGJpdGxvY2spOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisJd2FrZV91cF9iaXQoYml0bG9jaywgTkZTX0lOT19MQVlPVVRDT01NSVRUSU5HKTsKKwogCXB1dF9ycGNjcmVkKGRhdGEtPmNyZWQpOwogCWtmcmVlKGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczR4ZHIuYyBiL2ZzL25mcy9uZnM0eGRyLmMKaW5kZXggMWRjZTEyZi4uZTYxNjFiMiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczR4ZHIuYworKysgYi9mcy9uZnMvbmZzNHhkci5jCkBAIC02NjAyLDggKzY2MDIsNiBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwogCXN0YXR1cyA9IGRlY29kZV9zZWNpbmZvKHhkciwgcmVzKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIG91dDsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL29iamxheW91dC9vYmppb19vc2QuYyBiL2ZzL25mcy9vYmpsYXlvdXQvb2JqaW9fb3NkLmMKaW5kZXggZDBjZGExMi4uYzgwN2FiOSAxMDA2NDQKLS0tIGEvZnMvbmZzL29iamxheW91dC9vYmppb19vc2QuYworKysgYi9mcy9uZnMvb2JqbGF5b3V0L29iamlvX29zZC5jCkBAIC0zOCwyMSArMzgsMTUgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8c2NzaS9vc2RfaW5pdGlhdG9yLmg+CisjaW5jbHVkZSA8c2NzaS9vc2Rfb3JlLmg+CiAKICNpbmNsdWRlICJvYmpsYXlvdXQuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkgICAgICAgICBORlNEQkdfUE5GU19MRAogCi0jZGVmaW5lIF9MTFUoeCkgKCh1bnNpZ25lZCBsb25nIGxvbmcpeCkKLQotZW51bSB7IEJJT19NQVhfUEFHRVNfS01BTExPQyA9Ci0JCShQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGJpbykpIC8gc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSwKLX07Ci0KIHN0cnVjdCBvYmppb19kZXZfZW50IHsKIAlzdHJ1Y3QgbmZzNF9kZXZpY2VpZF9ub2RlIGlkX25vZGU7Ci0Jc3RydWN0IG9zZF9kZXYgKm9kOworCXN0cnVjdCBvcmVfZGV2IG9kOwogfTsKIAogc3RhdGljIHZvaWQKQEAgLTYwLDggKzU0LDggQEAKIHsKIAlzdHJ1Y3Qgb2JqaW9fZGV2X2VudCAqZGUgPSBjb250YWluZXJfb2YoZCwgc3RydWN0IG9iamlvX2Rldl9lbnQsIGlkX25vZGUpOwogCi0JZHByaW50aygiJXM6IGZyZWUgb2Q9JXBcbiIsIF9fZnVuY19fLCBkZS0+b2QpOwotCW9zZHVsZF9wdXRfZGV2aWNlKGRlLT5vZCk7CisJZHByaW50aygiJXM6IGZyZWUgb2Q9JXBcbiIsIF9fZnVuY19fLCBkZS0+b2Qub2QpOworCW9zZHVsZF9wdXRfZGV2aWNlKGRlLT5vZC5vZCk7CiAJa2ZyZWUoZGUpOwogfQogCkBAIC05OCwxMiArOTIsMTIgQEAKIAkJCQluZnNzLT5wbmZzX2N1cnJfbGQsCiAJCQkJbmZzcy0+bmZzX2NsaWVudCwKIAkJCQlkX2lkKTsKLQlkZS0+b2QgPSBvZDsKKwlkZS0+b2Qub2QgPSBvZDsKIAogCWQgPSBuZnM0X2luc2VydF9kZXZpY2VpZF9ub2RlKCZkZS0+aWRfbm9kZSk7CiAJbiA9IGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgb2JqaW9fZGV2X2VudCwgaWRfbm9kZSk7CiAJaWYgKG4gIT0gZGUpIHsKLQkJZHByaW50aygiJXM6IFJhY2Ugd2l0aCBvdGhlciBuLT5vZD0lcFxuIiwgX19mdW5jX18sIG4tPm9kKTsKKwkJZHByaW50aygiJXM6IFJhY2Ugd2l0aCBvdGhlciBuLT5vZD0lcFxuIiwgX19mdW5jX18sIG4tPm9kLm9kKTsKIAkJb2JqaW9fZnJlZV9kZXZpY2VpZF9ub2RlKCZkZS0+aWRfbm9kZSk7CiAJCWRlID0gbjsKIAl9CkBAIC0xMTEsMjggKzEwNSwxMSBAQAogCXJldHVybiBkZTsKIH0KIAotc3RydWN0IGNhcHNfYnVmZmVycyB7Ci0JdTggY2Fwc19rZXlbT1NEX0NSWVBUT19LRVlJRF9TSVpFXTsKLQl1OCBjcmVkc1tPU0RfQ0FQX0xFTl07Ci19OwotCiBzdHJ1Y3Qgb2JqaW9fc2VnbWVudCB7CiAJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgbHNlZzsKIAotCXN0cnVjdCBwbmZzX29zZF9vYmplY3RfY3JlZCAqY29tcHM7Ci0KLQl1bnNpZ25lZCBtaXJyb3JzX3AxOwotCXVuc2lnbmVkIHN0cmlwZV91bml0OwotCXVuc2lnbmVkIGdyb3VwX3dpZHRoOwkvKiBEYXRhIHN0cmlwZV91bml0cyB3aXRob3V0IGludGVncml0eSBjb21wcyAqLwotCXU2NCBncm91cF9kZXB0aDsKLQl1bnNpZ25lZCBncm91cF9jb3VudDsKLQotCXVuc2lnbmVkIG1heF9pb19zaXplOwotCi0JdW5zaWduZWQgY29tcHNfaW5kZXg7Ci0JdW5zaWduZWQgbnVtX2NvbXBzOwotCS8qIHZhcmlhYmxlIGxlbmd0aCAqLwotCXN0cnVjdCBvYmppb19kZXZfZW50ICpvZHNbXTsKKwlzdHJ1Y3Qgb3JlX2xheW91dCBsYXlvdXQ7CisJc3RydWN0IG9yZV9jb21wb25lbnRzIG9jOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqCkBAIC0xNDEsNTkgKzExOCw0NCBAQAogCXJldHVybiBjb250YWluZXJfb2YobHNlZywgc3RydWN0IG9iamlvX3NlZ21lbnQsIGxzZWcpOwogfQogCi1zdHJ1Y3Qgb2JqaW9fc3RhdGU7Ci10eXBlZGVmIHNzaXplX3QgKCpvYmppb19kb25lX2ZuKShzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcyk7Ci0KIHN0cnVjdCBvYmppb19zdGF0ZSB7CiAJLyogR2VuZXJpYyBsYXllciAqLwotCXN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgb2xfc3RhdGU7CisJc3RydWN0IG9iamxheW91dF9pb19yZXMgb2lyOwogCi0Jc3RydWN0IG9iamlvX3NlZ21lbnQgKmxheW91dDsKLQotCXN0cnVjdCBrcmVmIGtyZWY7Ci0Jb2JqaW9fZG9uZV9mbiBkb25lOwotCXZvaWQgKnByaXZhdGU7Ci0KLQl1bnNpZ25lZCBsb25nIGxlbmd0aDsKLQl1bnNpZ25lZCBudW1kZXZzOyAvKiBBY3R1YWxseSB1c2VkIGRldnMgaW4gdGhpcyBJTyAqLwotCS8qIEEgcGVyLWRldmljZSB2YXJpYWJsZSBhcnJheSBvZiBzaXplIG51bWRldnMgKi8KLQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wIHsKLQkJc3RydWN0IGJpbyAqYmlvOwotCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yOwotCQl1bnNpZ25lZCBsb25nIGxlbmd0aDsKLQkJdTY0IG9mZnNldDsKLQkJdW5zaWduZWQgZGV2OwotCX0gcGVyX2RldltdOworCWJvb2wgc3luYzsKKwkvKkZJWE1FOiBTdXBwb3J0IGZvciBleHRyYV9ieXRlcyBhdCBvcmVfZ2V0X3J3X3N0YXRlKCkgKi8KKwlzdHJ1Y3Qgb3JlX2lvX3N0YXRlICppb3M7CiB9OwogCiAvKiBTZW5kIGFuZCB3YWl0IGZvciBhIGdldF9kZXZpY2VfaW5mbyBvZiBkZXZpY2VzIGluIHRoZSBsYXlvdXQsCiAgICB0aGVuIGxvb2sgdGhlbSB1cCB3aXRoIHRoZSBvc2RfaW5pdGlhdG9yIGxpYnJhcnkgKi8KLXN0YXRpYyBzdHJ1Y3Qgb2JqaW9fZGV2X2VudCAqX2RldmljZV9sb29rdXAoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqcG5mc2xheSwKLQkJCQlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnLCB1bnNpZ25lZCBjb21wLAotCQkJCWdmcF90IGdmcF9mbGFncykKK3N0YXRpYyBpbnQgb2JqaW9fZGV2aWNlc19sb29rdXAoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqcG5mc2xheSwKKwlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnLCB1bnNpZ25lZCBjLCBzdHJ1Y3QgbmZzNF9kZXZpY2VpZCAqZF9pZCwKKwlnZnBfdCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHBuZnNfb3NkX2RldmljZWFkZHIgKmRldmljZWFkZHI7Ci0Jc3RydWN0IG5mczRfZGV2aWNlaWQgKmRfaWQ7CiAJc3RydWN0IG9iamlvX2Rldl9lbnQgKm9kZTsKIAlzdHJ1Y3Qgb3NkX2RldiAqb2Q7CiAJc3RydWN0IG9zZF9kZXZfaW5mbyBvZGk7CiAJaW50IGVycjsKIAotCWRfaWQgPSAmb2JqaW9fc2VnLT5jb21wc1tjb21wXS5vY19vYmplY3RfaWQub2lkX2RldmljZV9pZDsKLQogCW9kZSA9IF9kZXZfbGlzdF9maW5kKE5GU19TRVJWRVIocG5mc2xheS0+cGxoX2lub2RlKSwgZF9pZCk7Ci0JaWYgKG9kZSkKLQkJcmV0dXJuIG9kZTsKKwlpZiAob2RlKSB7CisJCW9iamlvX3NlZy0+b2Mub2RzW2NdID0gJm9kZS0+b2Q7IC8qIG11c3QgdXNlIGNvbnRhaW5lcl9vZiAqLworCQlyZXR1cm4gMDsKKwl9CiAKIAllcnIgPSBvYmpsYXlvdXRfZ2V0X2RldmljZWluZm8ocG5mc2xheSwgZF9pZCwgJmRldmljZWFkZHIsIGdmcF9mbGFncyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJZHByaW50aygiJXM6IG9iamxheW91dF9nZXRfZGV2aWNlaW5mbyBkZXYoJWxseDolbGx4KSA9PiVkXG4iLAogCQkJX19mdW5jX18sIF9ERVZJRF9MTyhkX2lkKSwgX0RFVklEX0hJKGRfaWQpLCBlcnIpOwotCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCQlyZXR1cm4gZXJyOwogCX0KIAogCW9kaS5zeXN0ZW1pZF9sZW4gPSBkZXZpY2VhZGRyLT5vZGFfc3lzdGVtaWQubGVuOwogCWlmIChvZGkuc3lzdGVtaWRfbGVuID4gc2l6ZW9mKG9kaS5zeXN0ZW1pZCkpIHsKKwkJZHByaW50aygiJXM6IG9kaS5zeXN0ZW1pZF9sZW4gPiBzaXplb2Yoc3lzdGVtaWQ9JXpkKVxuIiwKKwkJCV9fZnVuY19fLCBzaXplb2Yob2RpLnN5c3RlbWlkKSk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAob2RpLnN5c3RlbWlkX2xlbikKQEAgLTIxOCw5NCArMTgwLDUxIEBACiAKIAlvZGUgPSBfZGV2X2xpc3RfYWRkKE5GU19TRVJWRVIocG5mc2xheS0+cGxoX2lub2RlKSwgZF9pZCwgb2QsCiAJCQkgICAgZ2ZwX2ZsYWdzKTsKLQorCW9iamlvX3NlZy0+b2Mub2RzW2NdID0gJm9kZS0+b2Q7IC8qIG11c3QgdXNlIGNvbnRhaW5lcl9vZiAqLworCWRwcmludGsoIkFkZGluZyBuZXcgZGV2X2lkKCVsbHg6JWxseClcbiIsCisJCV9ERVZJRF9MTyhkX2lkKSwgX0RFVklEX0hJKGRfaWQpKTsKIG91dDoKLQlkcHJpbnRrKCIlczogcmV0dXJuPSVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKIAlvYmpsYXlvdXRfcHV0X2RldmljZWluZm8oZGV2aWNlYWRkcik7Ci0JcmV0dXJuIGVyciA/IEVSUl9QVFIoZXJyKSA6IG9kZTsKLX0KLQotc3RhdGljIGludCBvYmppb19kZXZpY2VzX2xvb2t1cChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpwbmZzbGF5LAotCXN0cnVjdCBvYmppb19zZWdtZW50ICpvYmppb19zZWcsCi0JZ2ZwX3QgZ2ZwX2ZsYWdzKQotewotCXVuc2lnbmVkIGk7Ci0JaW50IGVycjsKLQotCS8qIGxvb2t1cCBhbGwgZGV2aWNlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBvYmppb19zZWctPm51bV9jb21wczsgaSsrKSB7Ci0JCXN0cnVjdCBvYmppb19kZXZfZW50ICpvZGU7Ci0KLQkJb2RlID0gX2RldmljZV9sb29rdXAocG5mc2xheSwgb2JqaW9fc2VnLCBpLCBnZnBfZmxhZ3MpOwotCQlpZiAodW5saWtlbHkoSVNfRVJSKG9kZSkpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKG9kZSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlvYmppb19zZWctPm9kc1tpXSA9IG9kZTsKLQl9Ci0JZXJyID0gMDsKLQotb3V0OgotCWRwcmludGsoIiVzOiByZXR1cm49JWRcbiIsIF9fZnVuY19fLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX3ZlcmlmeV9kYXRhX21hcChzdHJ1Y3QgcG5mc19vc2RfbGF5b3V0ICpsYXlvdXQpCitzdGF0aWMgdm9pZCBjb3B5X3NpbmdsZV9jb21wKHN0cnVjdCBvcmVfY29tcG9uZW50cyAqb2MsIHVuc2lnbmVkIGMsCisJCQkgICAgIHN0cnVjdCBwbmZzX29zZF9vYmplY3RfY3JlZCAqc3JjX2NvbXApCiB7Ci0Jc3RydWN0IHBuZnNfb3NkX2RhdGFfbWFwICpkYXRhX21hcCA9ICZsYXlvdXQtPm9sb19tYXA7Ci0JdTY0IHN0cmlwZV9sZW5ndGg7Ci0JdTMyIGdyb3VwX3dpZHRoOworCXN0cnVjdCBvcmVfY29tcCAqb2NvbXAgPSAmb2MtPmNvbXBzW2NdOwogCi0vKiBGSVhNRTogT25seSByYWlkMCBmb3Igbm93LiBpZiBub3QgZ28gdGhyb3VnaCBNRFMgKi8KLQlpZiAoZGF0YV9tYXAtPm9kbV9yYWlkX2FsZ29yaXRobSAhPSBQTkZTX09TRF9SQUlEXzApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJPbmx5IFJBSURfMCBmb3Igbm93XG4iKTsKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQl9Ci0JaWYgKDAgIT0gKGRhdGFfbWFwLT5vZG1fbnVtX2NvbXBzICUgKGRhdGFfbWFwLT5vZG1fbWlycm9yX2NudCArIDEpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkRhdGEgTWFwIHdyb25nLCBudW1fY29tcHM9JXUgbWlycm9ycz0ldVxuIiwKLQkJCSAgZGF0YV9tYXAtPm9kbV9udW1fY29tcHMsIGRhdGFfbWFwLT5vZG1fbWlycm9yX2NudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlXQVJOX09OKHNyY19jb21wLT5vY19jYXBfa2V5LmNyZWRfbGVuID4gMCk7IC8qIGxpYm9zZCBpcyBOT19TRUMgb25seSAqLworCVdBUk5fT04oc3JjX2NvbXAtPm9jX2NhcC5jcmVkX2xlbiA+IHNpemVvZihvY29tcC0+Y3JlZCkpOwogCi0JaWYgKGRhdGFfbWFwLT5vZG1fZ3JvdXBfd2lkdGgpCi0JCWdyb3VwX3dpZHRoID0gZGF0YV9tYXAtPm9kbV9ncm91cF93aWR0aDsKLQllbHNlCi0JCWdyb3VwX3dpZHRoID0gZGF0YV9tYXAtPm9kbV9udW1fY29tcHMgLwotCQkJCQkJKGRhdGFfbWFwLT5vZG1fbWlycm9yX2NudCArIDEpOworCW9jb21wLT5vYmoucGFydGl0aW9uID0gc3JjX2NvbXAtPm9jX29iamVjdF9pZC5vaWRfcGFydGl0aW9uX2lkOworCW9jb21wLT5vYmouaWQgPSBzcmNfY29tcC0+b2Nfb2JqZWN0X2lkLm9pZF9vYmplY3RfaWQ7CiAKLQlzdHJpcGVfbGVuZ3RoID0gKHU2NClkYXRhX21hcC0+b2RtX3N0cmlwZV91bml0ICogZ3JvdXBfd2lkdGg7Ci0JaWYgKHN0cmlwZV9sZW5ndGggPj0gKDFVTEwgPDwgMzIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVG90YWwgU3RyaXBlIGxlbmd0aCgweCVsbHgpIgotCQkJICAiID49IDMyYml0IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9MTFUoc3RyaXBlX2xlbmd0aCkpOwotCQlyZXR1cm4gLUVOT1RTVVBQOwotCX0KLQotCWlmICgwICE9IChkYXRhX21hcC0+b2RtX3N0cmlwZV91bml0ICYgflBBR0VfTUFTSykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdHJpcGUgVW5pdCgweCVsbHgpIgotCQkJICAiIG11c3QgYmUgTXVsdHBsZXMgb2YgUEFHRV9TSVpFKDB4JWx4KVxuIiwKLQkJCSAgX0xMVShkYXRhX21hcC0+b2RtX3N0cmlwZV91bml0KSwgUEFHRV9TSVpFKTsKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQl9Ci0KLQlyZXR1cm4gMDsKKwltZW1jcHkob2NvbXAtPmNyZWQsIHNyY19jb21wLT5vY19jYXAuY3JlZCwgc2l6ZW9mKG9jb21wLT5jcmVkKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlfc2luZ2xlX2NvbXAoc3RydWN0IHBuZnNfb3NkX29iamVjdF9jcmVkICpjdXJfY29tcCwKLQkJCSAgICAgc3RydWN0IHBuZnNfb3NkX29iamVjdF9jcmVkICpzcmNfY29tcCwKLQkJCSAgICAgc3RydWN0IGNhcHNfYnVmZmVycyAqY2Fwc19wKQoraW50IF9fYWxsb2Nfb2JqaW9fc2VnKHVuc2lnbmVkIG51bWRldnMsIGdmcF90IGdmcF9mbGFncywKKwkJICAgICAgIHN0cnVjdCBvYmppb19zZWdtZW50ICoqcHNlZykKIHsKLQlXQVJOX09OKHNyY19jb21wLT5vY19jYXBfa2V5LmNyZWRfbGVuID4gc2l6ZW9mKGNhcHNfcC0+Y2Fwc19rZXkpKTsKLQlXQVJOX09OKHNyY19jb21wLT5vY19jYXAuY3JlZF9sZW4gPiBzaXplb2YoY2Fwc19wLT5jcmVkcykpOworCXN0cnVjdCBfX2FsbG9jX29iamlvX3NlZ21lbnQgeworCQlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCBvbHNlZzsKKwkJc3RydWN0IG9yZV9kZXYgKm9kc1tudW1kZXZzXTsKKwkJc3RydWN0IG9yZV9jb21wCWNvbXBzW251bWRldnNdOworCX0gKmFvbHNlZzsKIAotCSpjdXJfY29tcCA9ICpzcmNfY29tcDsKKwlhb2xzZWcgPSBremFsbG9jKHNpemVvZigqYW9sc2VnKSwgZ2ZwX2ZsYWdzKTsKKwlpZiAodW5saWtlbHkoIWFvbHNlZykpIHsKKwkJZHByaW50aygiJXM6IEZhaWxkIGFsbG9jYXRpb24gbnVtZGV2cz0lZCBzaXplPSV6ZFxuIiwgX19mdW5jX18sCisJCQludW1kZXZzLCBzaXplb2YoKmFvbHNlZykpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKLQltZW1jcHkoY2Fwc19wLT5jYXBzX2tleSwgc3JjX2NvbXAtPm9jX2NhcF9rZXkuY3JlZCwKLQkgICAgICAgc2l6ZW9mKGNhcHNfcC0+Y2Fwc19rZXkpKTsKLQljdXJfY29tcC0+b2NfY2FwX2tleS5jcmVkID0gY2Fwc19wLT5jYXBzX2tleTsKKwlhb2xzZWctPm9sc2VnLm9jLm51bWRldnMgPSBudW1kZXZzOworCWFvbHNlZy0+b2xzZWcub2Muc2luZ2xlX2NvbXAgPSBFQ19NVUxUUExFX0NPTVBTOworCWFvbHNlZy0+b2xzZWcub2MuY29tcHMgPSBhb2xzZWctPmNvbXBzOworCWFvbHNlZy0+b2xzZWcub2Mub2RzID0gYW9sc2VnLT5vZHM7CiAKLQltZW1jcHkoY2Fwc19wLT5jcmVkcywgc3JjX2NvbXAtPm9jX2NhcC5jcmVkLAotCSAgICAgICBzaXplb2YoY2Fwc19wLT5jcmVkcykpOwotCWN1cl9jb21wLT5vY19jYXAuY3JlZCA9IGNhcHNfcC0+Y3JlZHM7CisJKnBzZWcgPSAmYW9sc2VnLT5vbHNlZzsKKwlyZXR1cm4gMDsKIH0KIAogaW50IG9iamlvX2FsbG9jX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKipvdXRwLApAQCAtMzE3LDU5ICsyMzYsNDMgQEAKIAlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnOwogCXN0cnVjdCBwbmZzX29zZF94ZHJfZGVjb2RlX2xheW91dF9pdGVyIGl0ZXI7CiAJc3RydWN0IHBuZnNfb3NkX2xheW91dCBsYXlvdXQ7Ci0Jc3RydWN0IHBuZnNfb3NkX29iamVjdF9jcmVkICpjdXJfY29tcCwgc3JjX2NvbXA7Ci0Jc3RydWN0IGNhcHNfYnVmZmVycyAqY2Fwc19wOworCXN0cnVjdCBwbmZzX29zZF9vYmplY3RfY3JlZCBzcmNfY29tcDsKKwl1bnNpZ25lZCBjdXJfY29tcDsKIAlpbnQgZXJyOwogCiAJZXJyID0gcG5mc19vc2RfeGRyX2RlY29kZV9sYXlvdXRfbWFwKCZsYXlvdXQsICZpdGVyLCB4ZHIpOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gX3ZlcmlmeV9kYXRhX21hcCgmbGF5b3V0KTsKKwllcnIgPSBfX2FsbG9jX29iamlvX3NlZyhsYXlvdXQub2xvX251bV9jb21wcywgZ2ZwX2ZsYWdzLCAmb2JqaW9fc2VnKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJcmV0dXJuIGVycjsKIAotCW9iamlvX3NlZyA9IGt6YWxsb2Moc2l6ZW9mKCpvYmppb19zZWcpICsKLQkJCSAgICBzaXplb2Yob2JqaW9fc2VnLT5vZHNbMF0pICogbGF5b3V0Lm9sb19udW1fY29tcHMgKwotCQkJICAgIHNpemVvZigqb2JqaW9fc2VnLT5jb21wcykgKiBsYXlvdXQub2xvX251bV9jb21wcyArCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBjYXBzX2J1ZmZlcnMpICogbGF5b3V0Lm9sb19udW1fY29tcHMsCi0JCQkgICAgZ2ZwX2ZsYWdzKTsKLQlpZiAoIW9iamlvX3NlZykKLQkJcmV0dXJuIC1FTk9NRU07CisJb2JqaW9fc2VnLT5sYXlvdXQuc3RyaXBlX3VuaXQgPSBsYXlvdXQub2xvX21hcC5vZG1fc3RyaXBlX3VuaXQ7CisJb2JqaW9fc2VnLT5sYXlvdXQuZ3JvdXBfd2lkdGggPSBsYXlvdXQub2xvX21hcC5vZG1fZ3JvdXBfd2lkdGg7CisJb2JqaW9fc2VnLT5sYXlvdXQuZ3JvdXBfZGVwdGggPSBsYXlvdXQub2xvX21hcC5vZG1fZ3JvdXBfZGVwdGg7CisJb2JqaW9fc2VnLT5sYXlvdXQubWlycm9yc19wMSA9IGxheW91dC5vbG9fbWFwLm9kbV9taXJyb3JfY250ICsgMTsKKwlvYmppb19zZWctPmxheW91dC5yYWlkX2FsZ29yaXRobSA9IGxheW91dC5vbG9fbWFwLm9kbV9yYWlkX2FsZ29yaXRobTsKIAotCW9iamlvX3NlZy0+Y29tcHMgPSAodm9pZCAqKShvYmppb19zZWctPm9kcyArIGxheW91dC5vbG9fbnVtX2NvbXBzKTsKLQljdXJfY29tcCA9IG9iamlvX3NlZy0+Y29tcHM7Ci0JY2Fwc19wID0gKHZvaWQgKikoY3VyX2NvbXAgKyBsYXlvdXQub2xvX251bV9jb21wcyk7Ci0Jd2hpbGUgKHBuZnNfb3NkX3hkcl9kZWNvZGVfbGF5b3V0X2NvbXAoJnNyY19jb21wLCAmaXRlciwgeGRyLCAmZXJyKSkKLQkJY29weV9zaW5nbGVfY29tcChjdXJfY29tcCsrLCAmc3JjX2NvbXAsIGNhcHNfcCsrKTsKKwllcnIgPSBvcmVfdmVyaWZ5X2xheW91dChsYXlvdXQub2xvX21hcC5vZG1fbnVtX2NvbXBzLAorCQkJCQkgICZvYmppb19zZWctPmxheW91dCk7CiAJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gZXJyOwogCi0Jb2JqaW9fc2VnLT5udW1fY29tcHMgPSBsYXlvdXQub2xvX251bV9jb21wczsKLQlvYmppb19zZWctPmNvbXBzX2luZGV4ID0gbGF5b3V0Lm9sb19jb21wc19pbmRleDsKLQllcnIgPSBvYmppb19kZXZpY2VzX2xvb2t1cChwbmZzbGF5LCBvYmppb19zZWcsIGdmcF9mbGFncyk7Ci0JaWYgKGVycikKLQkJZ290byBlcnI7Ci0KLQlvYmppb19zZWctPm1pcnJvcnNfcDEgPSBsYXlvdXQub2xvX21hcC5vZG1fbWlycm9yX2NudCArIDE7Ci0Jb2JqaW9fc2VnLT5zdHJpcGVfdW5pdCA9IGxheW91dC5vbG9fbWFwLm9kbV9zdHJpcGVfdW5pdDsKLQlpZiAobGF5b3V0Lm9sb19tYXAub2RtX2dyb3VwX3dpZHRoKSB7Ci0JCW9iamlvX3NlZy0+Z3JvdXBfd2lkdGggPSBsYXlvdXQub2xvX21hcC5vZG1fZ3JvdXBfd2lkdGg7Ci0JCW9iamlvX3NlZy0+Z3JvdXBfZGVwdGggPSBsYXlvdXQub2xvX21hcC5vZG1fZ3JvdXBfZGVwdGg7Ci0JCW9iamlvX3NlZy0+Z3JvdXBfY291bnQgPSBsYXlvdXQub2xvX21hcC5vZG1fbnVtX2NvbXBzIC8KLQkJCQkJCW9iamlvX3NlZy0+bWlycm9yc19wMSAvCi0JCQkJCQlvYmppb19zZWctPmdyb3VwX3dpZHRoOwotCX0gZWxzZSB7Ci0JCW9iamlvX3NlZy0+Z3JvdXBfd2lkdGggPSBsYXlvdXQub2xvX21hcC5vZG1fbnVtX2NvbXBzIC8KLQkJCQkJCW9iamlvX3NlZy0+bWlycm9yc19wMTsKLQkJb2JqaW9fc2VnLT5ncm91cF9kZXB0aCA9IC0xOwotCQlvYmppb19zZWctPmdyb3VwX2NvdW50ID0gMTsKKwlvYmppb19zZWctPm9jLmZpcnN0X2RldiA9IGxheW91dC5vbG9fY29tcHNfaW5kZXg7CisJY3VyX2NvbXAgPSAwOworCXdoaWxlIChwbmZzX29zZF94ZHJfZGVjb2RlX2xheW91dF9jb21wKCZzcmNfY29tcCwgJml0ZXIsIHhkciwgJmVycikpIHsKKwkJY29weV9zaW5nbGVfY29tcCgmb2JqaW9fc2VnLT5vYywgY3VyX2NvbXAsICZzcmNfY29tcCk7CisJCWVyciA9IG9iamlvX2RldmljZXNfbG9va3VwKHBuZnNsYXksIG9iamlvX3NlZywgY3VyX2NvbXAsCisJCQkJCSAgICZzcmNfY29tcC5vY19vYmplY3RfaWQub2lkX2RldmljZV9pZCwKKwkJCQkJICAgZ2ZwX2ZsYWdzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyOworCQkrK2N1cl9jb21wOwogCX0KLQotCS8qIENhY2hlIHRoaXMgY2FsY3VsYXRpb24gaXQgd2lsbCBoaXQgZm9yIGV2ZXJ5IHBhZ2UgKi8KLQlvYmppb19zZWctPm1heF9pb19zaXplID0gKEJJT19NQVhfUEFHRVNfS01BTExPQyAqIFBBR0VfU0laRSAtCi0JCQkJICBvYmppb19zZWctPnN0cmlwZV91bml0KSAqCi0JCQkJIG9iamlvX3NlZy0+Z3JvdXBfd2lkdGg7CisJLyogcG5mc19vc2RfeGRyX2RlY29kZV9sYXlvdXRfY29tcCByZXR1cm5zIGZhbHNlIG9uIGVycm9yICovCisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gZXJyOwogCiAJKm91dHAgPSAmb2JqaW9fc2VnLT5sc2VnOwogCXJldHVybiAwOwpAQCAtMzg2LDQzICsyODksNjMgQEAKIAlpbnQgaTsKIAlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnID0gT0JKSU9fTFNFRyhsc2VnKTsKIAotCWZvciAoaSA9IDA7IGkgPCBvYmppb19zZWctPm51bV9jb21wczsgaSsrKSB7Ci0JCWlmICghb2JqaW9fc2VnLT5vZHNbaV0pCisJZm9yIChpID0gMDsgaSA8IG9iamlvX3NlZy0+b2MubnVtZGV2czsgaSsrKSB7CisJCXN0cnVjdCBvcmVfZGV2ICpvZCA9IG9iamlvX3NlZy0+b2Mub2RzW2ldOworCQlzdHJ1Y3Qgb2JqaW9fZGV2X2VudCAqb2RlOworCisJCWlmICghb2QpCiAJCQlicmVhazsKLQkJbmZzNF9wdXRfZGV2aWNlaWRfbm9kZSgmb2JqaW9fc2VnLT5vZHNbaV0tPmlkX25vZGUpOworCQlvZGUgPSBjb250YWluZXJfb2Yob2QsIHR5cGVvZigqb2RlKSwgb2QpOworCQluZnM0X3B1dF9kZXZpY2VpZF9ub2RlKCZvZGUtPmlkX25vZGUpOwogCX0KIAlrZnJlZShvYmppb19zZWcpOwogfQogCi1pbnQgb2JqaW9fYWxsb2NfaW9fc3RhdGUoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsCi0JCQkgc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqKm91dHAsCi0JCQkgZ2ZwX3QgZ2ZwX2ZsYWdzKQorc3RhdGljIGludAorb2JqaW9fYWxsb2NfaW9fc3RhdGUoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqcG5mc19sYXlvdXRfdHlwZSwgYm9vbCBpc19yZWFkaW5nLAorCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwZ2Jhc2UsCisJbG9mZl90IG9mZnNldCwgc2l6ZV90IGNvdW50LCB2b2lkICpycGNkYXRhLCBnZnBfdCBnZnBfZmxhZ3MsCisJc3RydWN0IG9iamlvX3N0YXRlICoqb3V0cCkKIHsKIAlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnID0gT0JKSU9fTFNFRyhsc2VnKTsKLQlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvczsKLQljb25zdCB1bnNpZ25lZCBmaXJzdF9zaXplID0gc2l6ZW9mKCppb3MpICsKLQkJCQlvYmppb19zZWctPm51bV9jb21wcyAqIHNpemVvZihpb3MtPnBlcl9kZXZbMF0pOwotCWNvbnN0IHVuc2lnbmVkIHNlY19zaXplID0gb2JqaW9fc2VnLT5udW1fY29tcHMgKgotCQkJCQkJc2l6ZW9mKGlvcy0+b2xfc3RhdGUuaW9lcnJzWzBdKTsKKwlzdHJ1Y3Qgb3JlX2lvX3N0YXRlICppb3M7CisJaW50IHJldDsKKwlzdHJ1Y3QgX19hbGxvY19vYmppb19zdGF0ZSB7CisJCXN0cnVjdCBvYmppb19zdGF0ZSBvYmppb3M7CisJCXN0cnVjdCBwbmZzX29zZF9pb2VyciBpb2VycnNbb2JqaW9fc2VnLT5vYy5udW1kZXZzXTsKKwl9ICphb3M7CiAKLQlpb3MgPSBremFsbG9jKGZpcnN0X3NpemUgKyBzZWNfc2l6ZSwgZ2ZwX2ZsYWdzKTsKLQlpZiAodW5saWtlbHkoIWlvcykpCisJYW9zID0ga3phbGxvYyhzaXplb2YoKmFvcyksIGdmcF9mbGFncyk7CisJaWYgKHVubGlrZWx5KCFhb3MpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlvcy0+bGF5b3V0ID0gb2JqaW9fc2VnOwotCWlvcy0+b2xfc3RhdGUuaW9lcnJzID0gKCh2b2lkICopaW9zKSArIGZpcnN0X3NpemU7Ci0JaW9zLT5vbF9zdGF0ZS5udW1fY29tcHMgPSBvYmppb19zZWctPm51bV9jb21wczsKKwlvYmpsYXlvdXRfaW5pdF9pb2VycnMoJmFvcy0+b2JqaW9zLm9pciwgb2JqaW9fc2VnLT5vYy5udW1kZXZzLAorCQkJYW9zLT5pb2VycnMsIHJwY2RhdGEsIHBuZnNfbGF5b3V0X3R5cGUpOwogCi0JKm91dHAgPSAmaW9zLT5vbF9zdGF0ZTsKKwlyZXQgPSBvcmVfZ2V0X3J3X3N0YXRlKCZvYmppb19zZWctPmxheW91dCwgJm9iamlvX3NlZy0+b2MsIGlzX3JlYWRpbmcsCisJCQkgICAgICAgb2Zmc2V0LCBjb3VudCwgJmlvcyk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJa2ZyZWUoYW9zKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpb3MtPnBhZ2VzID0gcGFnZXM7CisJaW9zLT5wZ2Jhc2UgPSBwZ2Jhc2U7CisJaW9zLT5wcml2YXRlID0gYW9zOworCUJVR19PTihpb3MtPm5yX3BhZ2VzID4gKHBnYmFzZSArIGNvdW50ICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVCk7CisKKwlhb3MtPm9iamlvcy5zeW5jID0gMDsKKwlhb3MtPm9iamlvcy5pb3MgPSBpb3M7CisJKm91dHAgPSAmYW9zLT5vYmppb3M7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgb2JqaW9fZnJlZV9pb19zdGF0ZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpvbF9zdGF0ZSkKK3ZvaWQgb2JqaW9fZnJlZV9yZXN1bHQoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pcikKIHsKLQlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcyA9IGNvbnRhaW5lcl9vZihvbF9zdGF0ZSwgc3RydWN0IG9iamlvX3N0YXRlLAotCQkJCQkgICAgICAgb2xfc3RhdGUpOworCXN0cnVjdCBvYmppb19zdGF0ZSAqb2JqaW9zID0gY29udGFpbmVyX29mKG9pciwgc3RydWN0IG9iamlvX3N0YXRlLCBvaXIpOwogCi0Ja2ZyZWUoaW9zKTsKKwlvcmVfcHV0X2lvX3N0YXRlKG9iamlvcy0+aW9zKTsKKwlrZnJlZShvYmppb3MpOwogfQogCiBlbnVtIHBuZnNfb3NkX2Vycm5vIG9zZF9wcmlfMl9wbmZzX2VycihlbnVtIG9zZF9lcnJfcHJpb3JpdHkgb2VwKQpAQCAtNDU1LDUzOSArMzc4LDE1MiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX2NsZWFyX2JpbyhzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBfX29uX2Rldl9lcnJvcihzdHJ1Y3Qgb3JlX2lvX3N0YXRlICppb3MsCisJc3RydWN0IG9yZV9kZXYgKm9kLCB1bnNpZ25lZCBkZXZfaW5kZXgsIGVudW0gb3NkX2Vycl9wcmlvcml0eSBvZXAsCisJdTY0IGRldl9vZmZzZXQsIHU2NCAgZGV2X2xlbikKIHsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0JdW5zaWduZWQgaTsKKwlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKm9iamlvcyA9IGlvcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcG5mc19vc2Rfb2JqaWQgcG9vaWQ7CisJc3RydWN0IG9iamlvX2Rldl9lbnQgKm9kZSA9IGNvbnRhaW5lcl9vZihvZCwgdHlwZW9mKCpvZGUpLCBvZCk7CisJLyogRklYTUU6IHdoYXQgdG8gZG8gd2l0aCBtb3JlLXRoZW4tb25lLWdyb3VwIGxheW91dHMuIFdlIG5lZWQgdG8KKwkgKiB0cmFuc2xhdGUgZnJvbSBvcmVfaW9fc3RhdGUgaW5kZXggdG8gb2MtPmNvbXBzIGluZGV4CisJICovCisJdW5zaWduZWQgY29tcCA9IGRldl9pbmRleDsKIAotCV9fYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaSwgMCkgewotCQl1bnNpZ25lZCB0aGlzX2NvdW50ID0gYnYtPmJ2X2xlbjsKKwlwb29pZC5vaWRfZGV2aWNlX2lkID0gb2RlLT5pZF9ub2RlLmRldmljZWlkOworCXBvb2lkLm9pZF9wYXJ0aXRpb25faWQgPSBpb3MtPm9jLT5jb21wc1tjb21wXS5vYmoucGFydGl0aW9uOworCXBvb2lkLm9pZF9vYmplY3RfaWQgPSBpb3MtPm9jLT5jb21wc1tjb21wXS5vYmouaWQ7CiAKLQkJaWYgKGxpa2VseShQQUdFX1NJWkUgPT0gdGhpc19jb3VudCkpCi0JCQljbGVhcl9oaWdocGFnZShidi0+YnZfcGFnZSk7Ci0JCWVsc2UKLQkJCXplcm9fdXNlcihidi0+YnZfcGFnZSwgYnYtPmJ2X29mZnNldCwgdGhpc19jb3VudCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9pb19jaGVjayhzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcywgYm9vbCBpc193cml0ZSkKLXsKLQllbnVtIG9zZF9lcnJfcHJpb3JpdHkgb2VwID0gT1NEX0VSUl9QUklfTk9fRVJST1I7Ci0JaW50IGxpbl9yZXQgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8ICBpb3MtPm51bWRldnM7IGkrKykgewotCQlzdHJ1Y3Qgb3NkX3NlbnNlX2luZm8gb3NpOwotCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yID0gaW9zLT5wZXJfZGV2W2ldLm9yOwotCQlpbnQgcmV0OwotCi0JCWlmICghb3IpCi0JCQljb250aW51ZTsKLQotCQlyZXQgPSBvc2RfcmVxX2RlY29kZV9zZW5zZShvciwgJm9zaSk7Ci0JCWlmIChsaWtlbHkoIXJldCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoT1NEX0VSUl9QUklfQ0xFQVJfUEFHRVMgPT0gb3NpLm9zZF9lcnJfcHJpKSB7Ci0JCQkvKiBzdGFydCByZWFkIG9mZnNldCBwYXNzZWQgZW5kb2YgZmlsZSAqLwotCQkJQlVHX09OKGlzX3dyaXRlKTsKLQkJCV9jbGVhcl9iaW8oaW9zLT5wZXJfZGV2W2ldLmJpbyk7Ci0JCQlkcHJpbnRrKCIlczogc3RhcnQgcmVhZCBvZmZzZXQgcGFzc2VkIGVuZCBvZiBmaWxlICIKLQkJCQkib2Zmc2V0PTB4JWxseCwgbGVuZ3RoPTB4JWx4XG4iLCBfX2Z1bmNfXywKLQkJCQlfTExVKGlvcy0+cGVyX2RldltpXS5vZmZzZXQpLAotCQkJCWlvcy0+cGVyX2RldltpXS5sZW5ndGgpOwotCi0JCQljb250aW51ZTsgLyogd2UgcmVjb3ZlcmVkICovCi0JCX0KLQkJb2JqbGF5b3V0X2lvX3NldF9yZXN1bHQoJmlvcy0+b2xfc3RhdGUsIGksCi0JCQkJCSZpb3MtPmxheW91dC0+Y29tcHNbaV0ub2Nfb2JqZWN0X2lkLAotCQkJCQlvc2RfcHJpXzJfcG5mc19lcnIob3NpLm9zZF9lcnJfcHJpKSwKLQkJCQkJaW9zLT5wZXJfZGV2W2ldLm9mZnNldCwKLQkJCQkJaW9zLT5wZXJfZGV2W2ldLmxlbmd0aCwKLQkJCQkJaXNfd3JpdGUpOwotCi0JCWlmIChvc2kub3NkX2Vycl9wcmkgPj0gb2VwKSB7Ci0JCQlvZXAgPSBvc2kub3NkX2Vycl9wcmk7Ci0JCQlsaW5fcmV0ID0gcmV0OwotCQl9Ci0JfQotCi0JcmV0dXJuIGxpbl9yZXQ7Ci19Ci0KLS8qCi0gKiBDb21tb24gSU8gc3RhdGUgaGVscGVycy4KLSAqLwotc3RhdGljIHZvaWQgX2lvX2ZyZWUoc3RydWN0IG9iamlvX3N0YXRlICppb3MpCi17Ci0JdW5zaWduZWQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBpb3MtPm51bWRldnM7IGkrKykgewotCQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wICpwZXJfZGV2ID0gJmlvcy0+cGVyX2RldltpXTsKLQotCQlpZiAocGVyX2Rldi0+b3IpIHsKLQkJCW9zZF9lbmRfcmVxdWVzdChwZXJfZGV2LT5vcik7Ci0JCQlwZXJfZGV2LT5vciA9IE5VTEw7Ci0JCX0KLQotCQlpZiAocGVyX2Rldi0+YmlvKSB7Ci0JCQliaW9fcHV0KHBlcl9kZXYtPmJpbyk7Ci0JCQlwZXJfZGV2LT5iaW8gPSBOVUxMOwotCQl9Ci0JfQotfQotCi1zdHJ1Y3Qgb3NkX2RldiAqX2lvX29kKHN0cnVjdCBvYmppb19zdGF0ZSAqaW9zLCB1bnNpZ25lZCBkZXYpCi17Ci0JdW5zaWduZWQgbWluX2RldiA9IGlvcy0+bGF5b3V0LT5jb21wc19pbmRleDsKLQl1bnNpZ25lZCBtYXhfZGV2ID0gbWluX2RldiArIGlvcy0+bGF5b3V0LT5udW1fY29tcHM7Ci0KLQlCVUdfT04oZGV2IDwgbWluX2RldiB8fCBtYXhfZGV2IDw9IGRldik7Ci0JcmV0dXJuIGlvcy0+bGF5b3V0LT5vZHNbZGV2IC0gbWluX2Rldl0tPm9kOwotfQotCi1zdHJ1Y3QgX3N0cmlwaW5nX2luZm8gewotCXU2NCBvYmpfb2Zmc2V0OwotCXU2NCBncm91cF9sZW5ndGg7Ci0JdW5zaWduZWQgZGV2OwotCXVuc2lnbmVkIHVuaXRfb2ZmOwotfTsKLQotc3RhdGljIHZvaWQgX2NhbGNfc3RyaXBlX2luZm8oc3RydWN0IG9iamlvX3N0YXRlICppb3MsIHU2NCBmaWxlX29mZnNldCwKLQkJCSAgICAgIHN0cnVjdCBfc3RyaXBpbmdfaW5mbyAqc2kpCi17Ci0JdTMyCXN0cmlwZV91bml0ID0gaW9zLT5sYXlvdXQtPnN0cmlwZV91bml0OwotCXUzMglncm91cF93aWR0aCA9IGlvcy0+bGF5b3V0LT5ncm91cF93aWR0aDsKLQl1NjQJZ3JvdXBfZGVwdGggPSBpb3MtPmxheW91dC0+Z3JvdXBfZGVwdGg7Ci0JdTMyCVUgPSBzdHJpcGVfdW5pdCAqIGdyb3VwX3dpZHRoOwotCi0JdTY0CVQgPSBVICogZ3JvdXBfZGVwdGg7Ci0JdTY0CVMgPSBUICogaW9zLT5sYXlvdXQtPmdyb3VwX2NvdW50OwotCXU2NAlNID0gZGl2NjRfdTY0KGZpbGVfb2Zmc2V0LCBTKTsKLQotCS8qCi0JRyA9IChMIC0gKE0gKiBTKSkgLyBUCi0JSCA9IChMIC0gKE0gKiBTKSkgJSBUCi0JKi8KLQl1NjQJTG1vZFUgPSBmaWxlX29mZnNldCAtIE0gKiBTOwotCXUzMglHID0gZGl2NjRfdTY0KExtb2RVLCBUKTsKLQl1NjQJSCA9IExtb2RVIC0gRyAqIFQ7Ci0KLQl1MzIJTiA9IGRpdl91NjQoSCwgVSk7Ci0KLQlkaXZfdTY0X3JlbShmaWxlX29mZnNldCwgc3RyaXBlX3VuaXQsICZzaS0+dW5pdF9vZmYpOwotCXNpLT5vYmpfb2Zmc2V0ID0gc2ktPnVuaXRfb2ZmICsgKE4gKiBzdHJpcGVfdW5pdCkgKwotCQkJCSAgKE0gKiBncm91cF9kZXB0aCAqIHN0cmlwZV91bml0KTsKLQotCS8qICJIIC0gKE4gKiBVKSIgaXMganVzdCAiSCAlIFUiIHNvIGl0J3MgYm91bmQgdG8gdTMyICovCi0Jc2ktPmRldiA9ICh1MzIpKEggLSAoTiAqIFUpKSAvIHN0cmlwZV91bml0ICsgRyAqIGdyb3VwX3dpZHRoOwotCXNpLT5kZXYgKj0gaW9zLT5sYXlvdXQtPm1pcnJvcnNfcDE7Ci0KLQlzaS0+Z3JvdXBfbGVuZ3RoID0gVCAtIEg7Ci19Ci0KLXN0YXRpYyBpbnQgX2FkZF9zdHJpcGVfdW5pdChzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcywgIHVuc2lnbmVkICpjdXJfcGcsCi0JCXVuc2lnbmVkIHBnYmFzZSwgc3RydWN0IF9vYmppb19wZXJfY29tcCAqcGVyX2RldiwgaW50IGxlbiwKLQkJZ2ZwX3QgZ2ZwX2ZsYWdzKQotewotCXVuc2lnbmVkIHBnID0gKmN1cl9wZzsKLQlpbnQgY3VyX2xlbiA9IGxlbjsKLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9Ci0JCQlvc2RfcmVxdWVzdF9xdWV1ZShfaW9fb2QoaW9zLCBwZXJfZGV2LT5kZXYpKTsKLQotCWlmIChwZXJfZGV2LT5iaW8gPT0gTlVMTCkgewotCQl1bnNpZ25lZCBwYWdlc19pbl9zdHJpcGUgPSBpb3MtPmxheW91dC0+Z3JvdXBfd2lkdGggKgotCQkJCSAgICAgIChpb3MtPmxheW91dC0+c3RyaXBlX3VuaXQgLyBQQUdFX1NJWkUpOwotCQl1bnNpZ25lZCBiaW9fc2l6ZSA9IChpb3MtPm9sX3N0YXRlLm5yX3BhZ2VzICsgcGFnZXNfaW5fc3RyaXBlKSAvCi0JCQkJICAgIGlvcy0+bGF5b3V0LT5ncm91cF93aWR0aDsKLQotCQlpZiAoQklPX01BWF9QQUdFU19LTUFMTE9DIDwgYmlvX3NpemUpCi0JCQliaW9fc2l6ZSA9IEJJT19NQVhfUEFHRVNfS01BTExPQzsKLQotCQlwZXJfZGV2LT5iaW8gPSBiaW9fa21hbGxvYyhnZnBfZmxhZ3MsIGJpb19zaXplKTsKLQkJaWYgKHVubGlrZWx5KCFwZXJfZGV2LT5iaW8pKSB7Ci0JCQlkcHJpbnRrKCJGYWlsZCB0byBhbGxvY2F0ZSBCSU8gc2l6ZT0ldVxuIiwgYmlvX3NpemUpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQl3aGlsZSAoY3VyX2xlbiA+IDApIHsKLQkJdW5zaWduZWQgcGdsZW4gPSBtaW5fdCh1bnNpZ25lZCwgUEFHRV9TSVpFIC0gcGdiYXNlLCBjdXJfbGVuKTsKLQkJdW5zaWduZWQgYWRkZWRfbGVuOwotCi0JCUJVR19PTihpb3MtPm9sX3N0YXRlLm5yX3BhZ2VzIDw9IHBnKTsKLQkJY3VyX2xlbiAtPSBwZ2xlbjsKLQotCQlhZGRlZF9sZW4gPSBiaW9fYWRkX3BjX3BhZ2UocSwgcGVyX2Rldi0+YmlvLAotCQkJCQlpb3MtPm9sX3N0YXRlLnBhZ2VzW3BnXSwgcGdsZW4sIHBnYmFzZSk7Ci0JCWlmICh1bmxpa2VseShwZ2xlbiAhPSBhZGRlZF9sZW4pKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXBnYmFzZSA9IDA7Ci0JCSsrcGc7Ci0JfQotCUJVR19PTihjdXJfbGVuKTsKLQotCXBlcl9kZXYtPmxlbmd0aCArPSBsZW47Ci0JKmN1cl9wZyA9IHBnOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9wcmVwYXJlX29uZV9ncm91cChzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcywgdTY0IGxlbmd0aCwKLQkJCSAgICAgIHN0cnVjdCBfc3RyaXBpbmdfaW5mbyAqc2ksIHVuc2lnbmVkICpsYXN0X3BnLAotCQkJICAgICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQotewotCXVuc2lnbmVkIHN0cmlwZV91bml0ID0gaW9zLT5sYXlvdXQtPnN0cmlwZV91bml0OwotCXVuc2lnbmVkIG1pcnJvcnNfcDEgPSBpb3MtPmxheW91dC0+bWlycm9yc19wMTsKLQl1bnNpZ25lZCBkZXZzX2luX2dyb3VwID0gaW9zLT5sYXlvdXQtPmdyb3VwX3dpZHRoICogbWlycm9yc19wMTsKLQl1bnNpZ25lZCBkZXYgPSBzaS0+ZGV2OwotCXVuc2lnbmVkIGZpcnN0X2RldiA9IGRldiAtIChkZXYgJSBkZXZzX2luX2dyb3VwKTsKLQl1bnNpZ25lZCBtYXhfY29tcCA9IGlvcy0+bnVtZGV2cyA/IGlvcy0+bnVtZGV2cyAtIG1pcnJvcnNfcDEgOiAwOwotCXVuc2lnbmVkIGN1cl9wZyA9ICpsYXN0X3BnOwotCWludCByZXQgPSAwOwotCi0Jd2hpbGUgKGxlbmd0aCkgewotCQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wICpwZXJfZGV2ID0gJmlvcy0+cGVyX2RldltkZXYgLSBmaXJzdF9kZXZdOwotCQl1bnNpZ25lZCBjdXJfbGVuLCBwYWdlX29mZiA9IDA7Ci0KLQkJaWYgKCFwZXJfZGV2LT5sZW5ndGgpIHsKLQkJCXBlcl9kZXYtPmRldiA9IGRldjsKLQkJCWlmIChkZXYgPCBzaS0+ZGV2KSB7Ci0JCQkJcGVyX2Rldi0+b2Zmc2V0ID0gc2ktPm9ial9vZmZzZXQgKyBzdHJpcGVfdW5pdCAtCi0JCQkJCQkJCSAgIHNpLT51bml0X29mZjsKLQkJCQljdXJfbGVuID0gc3RyaXBlX3VuaXQ7Ci0JCQl9IGVsc2UgaWYgKGRldiA9PSBzaS0+ZGV2KSB7Ci0JCQkJcGVyX2Rldi0+b2Zmc2V0ID0gc2ktPm9ial9vZmZzZXQ7Ci0JCQkJY3VyX2xlbiA9IHN0cmlwZV91bml0IC0gc2ktPnVuaXRfb2ZmOwotCQkJCXBhZ2Vfb2ZmID0gc2ktPnVuaXRfb2ZmICYgflBBR0VfTUFTSzsKLQkJCQlCVUdfT04ocGFnZV9vZmYgJiYKLQkJCQkgICAgICAocGFnZV9vZmYgIT0gaW9zLT5vbF9zdGF0ZS5wZ2Jhc2UpKTsKLQkJCX0gZWxzZSB7IC8qIGRldiA+IHNpLT5kZXYgKi8KLQkJCQlwZXJfZGV2LT5vZmZzZXQgPSBzaS0+b2JqX29mZnNldCAtIHNpLT51bml0X29mZjsKLQkJCQljdXJfbGVuID0gc3RyaXBlX3VuaXQ7Ci0JCQl9Ci0KLQkJCWlmIChtYXhfY29tcCA8IGRldiAtIGZpcnN0X2RldikKLQkJCQltYXhfY29tcCA9IGRldiAtIGZpcnN0X2RldjsKLQkJfSBlbHNlIHsKLQkJCWN1cl9sZW4gPSBzdHJpcGVfdW5pdDsKLQkJfQotCQlpZiAoY3VyX2xlbiA+PSBsZW5ndGgpCi0JCQljdXJfbGVuID0gbGVuZ3RoOwotCi0JCXJldCA9IF9hZGRfc3RyaXBlX3VuaXQoaW9zLCAmY3VyX3BnLCBwYWdlX29mZiAsIHBlcl9kZXYsCi0JCQkJICAgICAgIGN1cl9sZW4sIGdmcF9mbGFncyk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQotCQkJZ290byBvdXQ7Ci0KLQkJZGV2ICs9IG1pcnJvcnNfcDE7Ci0JCWRldiA9IChkZXYgJSBkZXZzX2luX2dyb3VwKSArIGZpcnN0X2RldjsKLQotCQlsZW5ndGggLT0gY3VyX2xlbjsKLQkJaW9zLT5sZW5ndGggKz0gY3VyX2xlbjsKLQl9Ci1vdXQ6Ci0JaW9zLT5udW1kZXZzID0gbWF4X2NvbXAgKyBtaXJyb3JzX3AxOwotCSpsYXN0X3BnID0gY3VyX3BnOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX2lvX3J3X3BhZ2VsaXN0KHN0cnVjdCBvYmppb19zdGF0ZSAqaW9zLCBnZnBfdCBnZnBfZmxhZ3MpCi17Ci0JdTY0IGxlbmd0aCA9IGlvcy0+b2xfc3RhdGUuY291bnQ7Ci0JdTY0IG9mZnNldCA9IGlvcy0+b2xfc3RhdGUub2Zmc2V0OwotCXN0cnVjdCBfc3RyaXBpbmdfaW5mbyBzaTsKLQl1bnNpZ25lZCBsYXN0X3BnID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCXdoaWxlIChsZW5ndGgpIHsKLQkJX2NhbGNfc3RyaXBlX2luZm8oaW9zLCBvZmZzZXQsICZzaSk7Ci0KLQkJaWYgKGxlbmd0aCA8IHNpLmdyb3VwX2xlbmd0aCkKLQkJCXNpLmdyb3VwX2xlbmd0aCA9IGxlbmd0aDsKLQotCQlyZXQgPSBfcHJlcGFyZV9vbmVfZ3JvdXAoaW9zLCBzaS5ncm91cF9sZW5ndGgsICZzaSwgJmxhc3RfcGcsIGdmcF9mbGFncyk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQotCQkJZ290byBvdXQ7Ci0KLQkJb2Zmc2V0ICs9IHNpLmdyb3VwX2xlbmd0aDsKLQkJbGVuZ3RoIC09IHNpLmdyb3VwX2xlbmd0aDsKLQl9Ci0KLW91dDoKLQlpZiAoIWlvcy0+bGVuZ3RoKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IF9zeW5jX2RvbmUoc3RydWN0IG9iamlvX3N0YXRlICppb3MpCi17Ci0Jc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmcgPSBpb3MtPnByaXZhdGU7Ci0KLQljb21wbGV0ZSh3YWl0aW5nKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX2xhc3RfaW8oc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0Jc3RydWN0IG9iamlvX3N0YXRlICppb3MgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IG9iamlvX3N0YXRlLCBrcmVmKTsKLQotCWlvcy0+ZG9uZShpb3MpOwotfQotCi1zdGF0aWMgdm9pZCBfZG9uZV9pbyhzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yLCB2b2lkICpwKQotewotCXN0cnVjdCBvYmppb19zdGF0ZSAqaW9zID0gcDsKLQotCWtyZWZfcHV0KCZpb3MtPmtyZWYsIF9sYXN0X2lvKTsKLX0KLQotc3RhdGljIHNzaXplX3QgX2lvX2V4ZWMoc3RydWN0IG9iamlvX3N0YXRlICppb3MpCi17Ci0JREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sod2FpdCk7Ci0Jc3NpemVfdCBzdGF0dXMgPSAwOyAvKiBzeW5jIHN0YXR1cyAqLwotCXVuc2lnbmVkIGk7Ci0Jb2JqaW9fZG9uZV9mbiBzYXZlZF9kb25lX2ZuID0gaW9zLT5kb25lOwotCWJvb2wgc3luYyA9IGlvcy0+b2xfc3RhdGUuc3luYzsKLQotCWlmIChzeW5jKSB7Ci0JCWlvcy0+ZG9uZSA9IF9zeW5jX2RvbmU7Ci0JCWlvcy0+cHJpdmF0ZSA9ICZ3YWl0OwotCX0KLQotCWtyZWZfaW5pdCgmaW9zLT5rcmVmKTsKLQotCWZvciAoaSA9IDA7IGkgPCBpb3MtPm51bWRldnM7IGkrKykgewotCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yID0gaW9zLT5wZXJfZGV2W2ldLm9yOwotCi0JCWlmICghb3IpCi0JCQljb250aW51ZTsKLQotCQlrcmVmX2dldCgmaW9zLT5rcmVmKTsKLQkJb3NkX2V4ZWN1dGVfcmVxdWVzdF9hc3luYyhvciwgX2RvbmVfaW8sIGlvcyk7Ci0JfQotCi0Ja3JlZl9wdXQoJmlvcy0+a3JlZiwgX2xhc3RfaW8pOwotCi0JaWYgKHN5bmMpIHsKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7Ci0JCXN0YXR1cyA9IHNhdmVkX2RvbmVfZm4oaW9zKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOworCW9iamxheW91dF9pb19zZXRfcmVzdWx0KCZvYmppb3MtPm9pciwgY29tcCwKKwkJCQkmcG9vaWQsIG9zZF9wcmlfMl9wbmZzX2VycihvZXApLAorCQkJCWRldl9vZmZzZXQsIGRldl9sZW4sICFpb3MtPnJlYWRpbmcpOwogfQogCiAvKgogICogcmVhZAogICovCi1zdGF0aWMgc3NpemVfdCBfcmVhZF9kb25lKHN0cnVjdCBvYmppb19zdGF0ZSAqaW9zKQorc3RhdGljIHZvaWQgX3JlYWRfZG9uZShzdHJ1Y3Qgb3JlX2lvX3N0YXRlICppb3MsIHZvaWQgKnByaXZhdGUpCiB7CisJc3RydWN0IG9iamlvX3N0YXRlICpvYmppb3MgPSBwcml2YXRlOwogCXNzaXplX3Qgc3RhdHVzOwotCWludCByZXQgPSBfaW9fY2hlY2soaW9zLCBmYWxzZSk7CisJaW50IHJldCA9IG9yZV9jaGVja19pbyhpb3MsICZfX29uX2Rldl9lcnJvcik7CiAKLQlfaW9fZnJlZShpb3MpOworCS8qIEZJWE1FOiBfaW9fZnJlZShpb3MpIGNhbiB3ZSBkZWFsb2NhdGUgdGhlIGxpYm9zZCByZXNvdXJjZXM7ICovCiAKIAlpZiAobGlrZWx5KCFyZXQpKQogCQlzdGF0dXMgPSBpb3MtPmxlbmd0aDsKIAllbHNlCiAJCXN0YXR1cyA9IHJldDsKIAotCW9iamxheW91dF9yZWFkX2RvbmUoJmlvcy0+b2xfc3RhdGUsIHN0YXR1cywgaW9zLT5vbF9zdGF0ZS5zeW5jKTsKLQlyZXR1cm4gc3RhdHVzOworCW9iamxheW91dF9yZWFkX2RvbmUoJm9iamlvcy0+b2lyLCBzdGF0dXMsIG9iamlvcy0+c3luYyk7CiB9CiAKLXN0YXRpYyBpbnQgX3JlYWRfbWlycm9ycyhzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcywgdW5zaWduZWQgY3VyX2NvbXApCitpbnQgb2JqaW9fcmVhZF9wYWdlbGlzdChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEpCiB7Ci0Jc3RydWN0IG9zZF9yZXF1ZXN0ICpvciA9IE5VTEw7Ci0Jc3RydWN0IF9vYmppb19wZXJfY29tcCAqcGVyX2RldiA9ICZpb3MtPnBlcl9kZXZbY3VyX2NvbXBdOwotCXVuc2lnbmVkIGRldiA9IHBlcl9kZXYtPmRldjsKLQlzdHJ1Y3QgcG5mc19vc2Rfb2JqZWN0X2NyZWQgKmNyZWQgPQotCQkJJmlvcy0+bGF5b3V0LT5jb21wc1tjdXJfY29tcF07Ci0Jc3RydWN0IG9zZF9vYmpfaWQgb2JqID0gewotCQkucGFydGl0aW9uID0gY3JlZC0+b2Nfb2JqZWN0X2lkLm9pZF9wYXJ0aXRpb25faWQsCi0JCS5pZCA9IGNyZWQtPm9jX29iamVjdF9pZC5vaWRfb2JqZWN0X2lkLAotCX07CisJc3RydWN0IG9iamlvX3N0YXRlICpvYmppb3M7CiAJaW50IHJldDsKIAotCW9yID0gb3NkX3N0YXJ0X3JlcXVlc3QoX2lvX29kKGlvcywgZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFvcikpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCXBlcl9kZXYtPm9yID0gb3I7Ci0KLQlvc2RfcmVxX3JlYWQob3IsICZvYmosIHBlcl9kZXYtPm9mZnNldCwgcGVyX2Rldi0+YmlvLCBwZXJfZGV2LT5sZW5ndGgpOwotCi0JcmV0ID0gb3NkX2ZpbmFsaXplX3JlcXVlc3Qob3IsIDAsIGNyZWQtPm9jX2NhcC5jcmVkLCBOVUxMKTsKLQlpZiAocmV0KSB7Ci0JCWRwcmludGsoIiVzOiBGYWlsZCB0byBvc2RfZmluYWxpemVfcmVxdWVzdCgpID0+ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWRwcmludGsoIiVzOlslZF0gZGV2PSVkIG9iaj0weCVsbHggc3RhcnQ9MHglbGx4IGxlbmd0aD0weCVseFxuIiwKLQkJX19mdW5jX18sIGN1cl9jb21wLCBkZXYsIG9iai5pZCwgX0xMVShwZXJfZGV2LT5vZmZzZXQpLAotCQlwZXJfZGV2LT5sZW5ndGgpOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgX3JlYWRfZXhlYyhzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcykKLXsKLQl1bnNpZ25lZCBpOwotCWludCByZXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW9zLT5udW1kZXZzOyBpICs9IGlvcy0+bGF5b3V0LT5taXJyb3JzX3AxKSB7Ci0JCWlmICghaW9zLT5wZXJfZGV2W2ldLmxlbmd0aCkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSBfcmVhZF9taXJyb3JzKGlvcywgaSk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQotCQkJZ290byBlcnI7Ci0JfQotCi0JaW9zLT5kb25lID0gX3JlYWRfZG9uZTsKLQlyZXR1cm4gX2lvX2V4ZWMoaW9zKTsgLyogSW4gc3luYyBtb2RlIGV4ZWMgcmV0dXJucyB0aGUgaW8gc3RhdHVzICovCi0KLWVycjoKLQlfaW9fZnJlZShpb3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3Qgb2JqaW9fcmVhZF9wYWdlbGlzdChzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpvbF9zdGF0ZSkKLXsKLQlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcyA9IGNvbnRhaW5lcl9vZihvbF9zdGF0ZSwgc3RydWN0IG9iamlvX3N0YXRlLAotCQkJCQkgICAgICAgb2xfc3RhdGUpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBfaW9fcndfcGFnZWxpc3QoaW9zLCBHRlBfS0VSTkVMKTsKKwlyZXQgPSBvYmppb19hbGxvY19pb19zdGF0ZShORlNfSShyZGF0YS0+aW5vZGUpLT5sYXlvdXQsIHRydWUsCisJCQlyZGF0YS0+bHNlZywgcmRhdGEtPmFyZ3MucGFnZXMsIHJkYXRhLT5hcmdzLnBnYmFzZSwKKwkJCXJkYXRhLT5hcmdzLm9mZnNldCwgcmRhdGEtPmFyZ3MuY291bnQsIHJkYXRhLAorCQkJR0ZQX0tFUk5FTCwgJm9iamlvcyk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gX3JlYWRfZXhlYyhpb3MpOworCW9iamlvcy0+aW9zLT5kb25lID0gX3JlYWRfZG9uZTsKKwlkcHJpbnRrKCIlczogb2Zmc2V0PTB4JWxseCBsZW5ndGg9MHgleFxuIiwgX19mdW5jX18sCisJCXJkYXRhLT5hcmdzLm9mZnNldCwgcmRhdGEtPmFyZ3MuY291bnQpOworCXJldHVybiBvcmVfcmVhZChvYmppb3MtPmlvcyk7CiB9CiAKIC8qCiAgKiB3cml0ZQogICovCi1zdGF0aWMgc3NpemVfdCBfd3JpdGVfZG9uZShzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcykKK3N0YXRpYyB2b2lkIF93cml0ZV9kb25lKHN0cnVjdCBvcmVfaW9fc3RhdGUgKmlvcywgdm9pZCAqcHJpdmF0ZSkKIHsKKwlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKm9iamlvcyA9IHByaXZhdGU7CiAJc3NpemVfdCBzdGF0dXM7Ci0JaW50IHJldCA9IF9pb19jaGVjayhpb3MsIHRydWUpOworCWludCByZXQgPSBvcmVfY2hlY2tfaW8oaW9zLCAmX19vbl9kZXZfZXJyb3IpOwogCi0JX2lvX2ZyZWUoaW9zKTsKKwkvKiBGSVhNRTogX2lvX2ZyZWUoaW9zKSBjYW4gd2UgZGVhbG9jYXRlIHRoZSBsaWJvc2QgcmVzb3VyY2VzOyAqLwogCiAJaWYgKGxpa2VseSghcmV0KSkgewogCQkvKiBGSVhNRTogc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBPU0QncyBwZXJzaXN0ZW5jZSBtb2RlbAogCQkgKiBTZWUgT1NEMnIwNSBTZWN0aW9uIDQuMTMgRGF0YSBwZXJzaXN0ZW5jZSBtb2RlbCAqLwotCQlpb3MtPm9sX3N0YXRlLmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7CisJCW9iamlvcy0+b2lyLmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7CiAJCXN0YXR1cyA9IGlvcy0+bGVuZ3RoOwogCX0gZWxzZSB7CiAJCXN0YXR1cyA9IHJldDsKIAl9CiAKLQlvYmpsYXlvdXRfd3JpdGVfZG9uZSgmaW9zLT5vbF9zdGF0ZSwgc3RhdHVzLCBpb3MtPm9sX3N0YXRlLnN5bmMpOwotCXJldHVybiBzdGF0dXM7CisJb2JqbGF5b3V0X3dyaXRlX2RvbmUoJm9iamlvcy0+b2lyLCBzdGF0dXMsIG9iamlvcy0+c3luYyk7CiB9CiAKLXN0YXRpYyBpbnQgX3dyaXRlX21pcnJvcnMoc3RydWN0IG9iamlvX3N0YXRlICppb3MsIHVuc2lnbmVkIGN1cl9jb21wKQorc3RhdGljIHN0cnVjdCBwYWdlICpfX3I0d19nZXRfcGFnZSh2b2lkICpwcml2LCB1NjQgb2Zmc2V0LCBib29sICp1cHRvZGF0ZSkKIHsKLQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wICptYXN0ZXJfZGV2ID0gJmlvcy0+cGVyX2RldltjdXJfY29tcF07Ci0JdW5zaWduZWQgZGV2ID0gaW9zLT5wZXJfZGV2W2N1cl9jb21wXS5kZXY7Ci0JdW5zaWduZWQgbGFzdF9jb21wID0gY3VyX2NvbXAgKyBpb3MtPmxheW91dC0+bWlycm9yc19wMTsKLQlpbnQgcmV0OworCXN0cnVjdCBvYmppb19zdGF0ZSAqb2JqaW9zID0gcHJpdjsKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhID0gb2JqaW9zLT5vaXIucnBjZGF0YTsKKwlwZ29mZl90IGluZGV4ID0gb2Zmc2V0IC8gUEFHRV9TSVpFOworCXN0cnVjdCBwYWdlICpwYWdlID0gZmluZF9nZXRfcGFnZSh3ZGF0YS0+aW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOwogCi0JZm9yICg7IGN1cl9jb21wIDwgbGFzdF9jb21wOyArK2N1cl9jb21wLCArK2RldikgewotCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yID0gTlVMTDsKLQkJc3RydWN0IHBuZnNfb3NkX29iamVjdF9jcmVkICpjcmVkID0KLQkJCQkJJmlvcy0+bGF5b3V0LT5jb21wc1tjdXJfY29tcF07Ci0JCXN0cnVjdCBvc2Rfb2JqX2lkIG9iaiA9IHsKLQkJCS5wYXJ0aXRpb24gPSBjcmVkLT5vY19vYmplY3RfaWQub2lkX3BhcnRpdGlvbl9pZCwKLQkJCS5pZCA9IGNyZWQtPm9jX29iamVjdF9pZC5vaWRfb2JqZWN0X2lkLAotCQl9OwotCQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wICpwZXJfZGV2ID0gJmlvcy0+cGVyX2RldltjdXJfY29tcF07Ci0JCXN0cnVjdCBiaW8gKmJpbzsKLQotCQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KF9pb19vZChpb3MsIGRldiksIEdGUF9OT0ZTKTsKLQkJaWYgKHVubGlrZWx5KCFvcikpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKKwlpZiAoIXBhZ2UpIHsKKwkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2Uod2RhdGEtPmlub2RlLT5pX21hcHBpbmcsCisJCQkJCQlpbmRleCwgR0ZQX05PRlMpOworCQlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CisJCQlkcHJpbnRrKCIlczogZ3JhYl9jYWNoZV9wYWdlIEZhaWxlZCBpbmRleD0weCVseFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJcGVyX2Rldi0+b3IgPSBvcjsKLQotCQlpZiAocGVyX2RldiAhPSBtYXN0ZXJfZGV2KSB7Ci0JCQliaW8gPSBiaW9fa21hbGxvYyhHRlBfTk9GUywKLQkJCQkJICBtYXN0ZXJfZGV2LT5iaW8tPmJpX21heF92ZWNzKTsKLQkJCWlmICh1bmxpa2VseSghYmlvKSkgewotCQkJCWRwcmludGsoIkZhaWxkIHRvIGFsbG9jYXRlIEJJTyBzaXplPSV1XG4iLAotCQkJCQltYXN0ZXJfZGV2LT5iaW8tPmJpX21heF92ZWNzKTsKLQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCi0JCQlfX2Jpb19jbG9uZShiaW8sIG1hc3Rlcl9kZXYtPmJpbyk7Ci0JCQliaW8tPmJpX2JkZXYgPSBOVUxMOwotCQkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKLQkJCXBlcl9kZXYtPmJpbyA9IGJpbzsKLQkJCXBlcl9kZXYtPmRldiA9IGRldjsKLQkJCXBlcl9kZXYtPmxlbmd0aCA9IG1hc3Rlcl9kZXYtPmxlbmd0aDsKLQkJCXBlcl9kZXYtPm9mZnNldCA9ICBtYXN0ZXJfZGV2LT5vZmZzZXQ7Ci0JCX0gZWxzZSB7Ci0JCQliaW8gPSBtYXN0ZXJfZGV2LT5iaW87Ci0JCQliaW8tPmJpX3J3IHw9IFJFUV9XUklURTsKLQkJfQotCi0JCW9zZF9yZXFfd3JpdGUob3IsICZvYmosIHBlcl9kZXYtPm9mZnNldCwgYmlvLCBwZXJfZGV2LT5sZW5ndGgpOwotCi0JCXJldCA9IG9zZF9maW5hbGl6ZV9yZXF1ZXN0KG9yLCAwLCBjcmVkLT5vY19jYXAuY3JlZCwgTlVMTCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRwcmludGsoIiVzOiBGYWlsZCB0byBvc2RfZmluYWxpemVfcmVxdWVzdCgpID0+ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlkcHJpbnRrKCIlczpbJWRdIGRldj0lZCBvYmo9MHglbGx4IHN0YXJ0PTB4JWxseCBsZW5ndGg9MHglbHhcbiIsCi0JCQlfX2Z1bmNfXywgY3VyX2NvbXAsIGRldiwgb2JqLmlkLCBfTExVKHBlcl9kZXYtPm9mZnNldCksCi0JCQlwZXJfZGV2LT5sZW5ndGgpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKIAl9Ci0KLWVycjoKLQlyZXR1cm4gcmV0OworCWlmIChQYWdlRGlydHkocGFnZSkgfHwgUGFnZVdyaXRlYmFjayhwYWdlKSkKKwkJKnVwdG9kYXRlID0gdHJ1ZTsKKwllbHNlCisJCSp1cHRvZGF0ZSA9IFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlkcHJpbnRrKCIlczogaW5kZXg9MHglbHggdXB0b2RhdGU9JWRcbiIsIF9fZnVuY19fLCBpbmRleCwgKnVwdG9kYXRlKTsKKwlyZXR1cm4gcGFnZTsKIH0KIAotc3RhdGljIHNzaXplX3QgX3dyaXRlX2V4ZWMoc3RydWN0IG9iamlvX3N0YXRlICppb3MpCitzdGF0aWMgdm9pZCBfX3I0d19wdXRfcGFnZSh2b2lkICpwcml2LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQl1bnNpZ25lZCBpOwotCWludCByZXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW9zLT5udW1kZXZzOyBpICs9IGlvcy0+bGF5b3V0LT5taXJyb3JzX3AxKSB7Ci0JCWlmICghaW9zLT5wZXJfZGV2W2ldLmxlbmd0aCkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSBfd3JpdGVfbWlycm9ycyhpb3MsIGkpOwotCQlpZiAodW5saWtlbHkocmV0KSkKLQkJCWdvdG8gZXJyOwotCX0KLQotCWlvcy0+ZG9uZSA9IF93cml0ZV9kb25lOwotCXJldHVybiBfaW9fZXhlYyhpb3MpOyAvKiBJbiBzeW5jIG1vZGUgZXhlYyByZXR1cm5zIHRoZSBpby0+c3RhdHVzICovCi0KLWVycjoKLQlfaW9fZnJlZShpb3MpOwotCXJldHVybiByZXQ7CisJZHByaW50aygiJXM6IGluZGV4PTB4JWx4XG4iLCBfX2Z1bmNfXywgcGFnZS0+aW5kZXgpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm47CiB9CiAKLXNzaXplX3Qgb2JqaW9fd3JpdGVfcGFnZWxpc3Qoc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqb2xfc3RhdGUsIGJvb2wgc3RhYmxlKQorc3RhdGljIGNvbnN0IHN0cnVjdCBfb3JlX3I0d19vcCBfcjR3X29wID0geworCS5nZXRfcGFnZSA9ICZfX3I0d19nZXRfcGFnZSwKKwkucHV0X3BhZ2UgPSAmX19yNHdfcHV0X3BhZ2UsCit9OworCitpbnQgb2JqaW9fd3JpdGVfcGFnZWxpc3Qoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSwgaW50IGhvdykKIHsKLQlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcyA9IGNvbnRhaW5lcl9vZihvbF9zdGF0ZSwgc3RydWN0IG9iamlvX3N0YXRlLAotCQkJCQkgICAgICAgb2xfc3RhdGUpOworCXN0cnVjdCBvYmppb19zdGF0ZSAqb2JqaW9zOwogCWludCByZXQ7CiAKLQkvKiBUT0RPOiBpb3MtPnN0YWJsZSA9IHN0YWJsZTsgKi8KLQlyZXQgPSBfaW9fcndfcGFnZWxpc3QoaW9zLCBHRlBfTk9GUyk7CisJcmV0ID0gb2JqaW9fYWxsb2NfaW9fc3RhdGUoTkZTX0kod2RhdGEtPmlub2RlKS0+bGF5b3V0LCBmYWxzZSwKKwkJCXdkYXRhLT5sc2VnLCB3ZGF0YS0+YXJncy5wYWdlcywgd2RhdGEtPmFyZ3MucGdiYXNlLAorCQkJd2RhdGEtPmFyZ3Mub2Zmc2V0LCB3ZGF0YS0+YXJncy5jb3VudCwgd2RhdGEsIEdGUF9OT0ZTLAorCQkJJm9iamlvcyk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gX3dyaXRlX2V4ZWMoaW9zKTsKKwlvYmppb3MtPnN5bmMgPSAwICE9IChob3cgJiBGTFVTSF9TWU5DKTsKKwlvYmppb3MtPmlvcy0+cjR3ID0gJl9yNHdfb3A7CisKKwlpZiAoIW9iamlvcy0+c3luYykKKwkJb2JqaW9zLT5pb3MtPmRvbmUgPSBfd3JpdGVfZG9uZTsKKworCWRwcmludGsoIiVzOiBvZmZzZXQ9MHglbGx4IGxlbmd0aD0weCV4XG4iLCBfX2Z1bmNfXywKKwkJd2RhdGEtPmFyZ3Mub2Zmc2V0LCB3ZGF0YS0+YXJncy5jb3VudCk7CisJcmV0ID0gb3JlX3dyaXRlKG9iamlvcy0+aW9zKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChvYmppb3MtPnN5bmMpCisJCV93cml0ZV9kb25lKG9iamlvcy0+aW9zLCBvYmppb3MpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBib29sIG9iamlvX3BnX3Rlc3Qoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqcGdpbywKQEAgLTk5Nyw3ICs1MzMsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gcGdpby0+cGdfY291bnQgKyByZXEtPndiX2J5dGVzIDw9Ci0JCQlPQkpJT19MU0VHKHBnaW8tPnBnX2xzZWcpLT5tYXhfaW9fc2l6ZTsKKwkJCU9CSklPX0xTRUcocGdpby0+cGdfbHNlZyktPmxheW91dC5tYXhfaW9fbGVuZ3RoOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5mc19wYWdlaW9fb3BzIG9iamlvX3BnX3JlYWRfb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvbmZzL29iamxheW91dC9vYmpsYXlvdXQuYyBiL2ZzL25mcy9vYmpsYXlvdXQvb2JqbGF5b3V0LmMKaW5kZXggMWQwNmY4ZS4uNzIwNzRlMyAxMDA2NDQKLS0tIGEvZnMvbmZzL29iamxheW91dC9vYmpsYXlvdXQuYworKysgYi9mcy9uZnMvb2JqbGF5b3V0L29iamxheW91dC5jCkBAIC0xNTYsNzcgKzE1NiwzOSBAQAogCXJldHVybiBlbmQgPiBzdGFydCA/IGVuZCAtIDEgOiBORlM0X01BWF9VSU5UNjQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICoKLW9iamxheW91dF9hbGxvY19pb19zdGF0ZShzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpwbmZzX2xheW91dF90eXBlLAotCQkJc3RydWN0IHBhZ2UgKipwYWdlcywKLQkJCXVuc2lnbmVkIHBnYmFzZSwKLQkJCWxvZmZfdCBvZmZzZXQsCi0JCQlzaXplX3QgY291bnQsCi0JCQlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZywKLQkJCXZvaWQgKnJwY2RhdGEsCi0JCQlnZnBfdCBnZnBfZmxhZ3MpCit2b2lkIF9maXhfdmVyaWZ5X2lvX3BhcmFtcyhzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZywKKwkJCSAgIHN0cnVjdCBwYWdlICoqKnBfcGFnZXMsIHVuc2lnbmVkICpwX3BnYmFzZSwKKwkJCSAgIHU2NCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0Jc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqc3RhdGU7CiAJdTY0IGxzZWdfZW5kX29mZnNldDsKIAotCWRwcmludGsoIiVzOiBhbGxvY2F0aW5nIGlvX3N0YXRlXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKG9iamlvX2FsbG9jX2lvX3N0YXRlKGxzZWcsICZzdGF0ZSwgZ2ZwX2ZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0KIAlCVUdfT04ob2Zmc2V0IDwgbHNlZy0+cGxzX3JhbmdlLm9mZnNldCk7CiAJbHNlZ19lbmRfb2Zmc2V0ID0gZW5kX29mZnNldChsc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0LAogCQkJCSAgICAgbHNlZy0+cGxzX3JhbmdlLmxlbmd0aCk7CiAJQlVHX09OKG9mZnNldCA+PSBsc2VnX2VuZF9vZmZzZXQpOwotCWlmIChvZmZzZXQgKyBjb3VudCA+IGxzZWdfZW5kX29mZnNldCkgewotCQljb3VudCA9IGxzZWctPnBsc19yYW5nZS5sZW5ndGggLQotCQkJCShvZmZzZXQgLSBsc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0KTsKLQkJZHByaW50aygiJXM6IHRydW5jYXRlZCBjb3VudCAlWmRcbiIsIF9fZnVuY19fLCBjb3VudCk7CisJV0FSTl9PTihvZmZzZXQgKyBjb3VudCA+IGxzZWdfZW5kX29mZnNldCk7CisKKwlpZiAoKnBfcGdiYXNlID4gUEFHRV9TSVpFKSB7CisJCWRwcmludGsoIiVzOiBwZ2Jhc2UoMHgleCkgPiBQQUdFX1NJWkVcbiIsIF9fZnVuY19fLCAqcF9wZ2Jhc2UpOworCQkqcF9wYWdlcyArPSAqcF9wZ2Jhc2UgPj4gUEFHRV9TSElGVDsKKwkJKnBfcGdiYXNlICY9IH5QQUdFX01BU0s7CiAJfQotCi0JaWYgKHBnYmFzZSA+IFBBR0VfU0laRSkgewotCQlwYWdlcyArPSBwZ2Jhc2UgPj4gUEFHRV9TSElGVDsKLQkJcGdiYXNlICY9IH5QQUdFX01BU0s7Ci0JfQotCi0JSU5JVF9MSVNUX0hFQUQoJnN0YXRlLT5lcnJfbGlzdCk7Ci0Jc3RhdGUtPmxzZWcgPSBsc2VnOwotCXN0YXRlLT5ycGNkYXRhID0gcnBjZGF0YTsKLQlzdGF0ZS0+cGFnZXMgPSBwYWdlczsKLQlzdGF0ZS0+cGdiYXNlID0gcGdiYXNlOwotCXN0YXRlLT5ucl9wYWdlcyA9IChwZ2Jhc2UgKyBjb3VudCArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0Jc3RhdGUtPm9mZnNldCA9IG9mZnNldDsKLQlzdGF0ZS0+Y291bnQgPSBjb3VudDsKLQlzdGF0ZS0+c3luYyA9IDA7Ci0KLQlyZXR1cm4gc3RhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpsYXlvdXRfZnJlZV9pb19zdGF0ZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZSkKLXsKLQlkcHJpbnRrKCIlczogZnJlZWluZyBpb19zdGF0ZVxuIiwgX19mdW5jX18pOwotCWlmICh1bmxpa2VseSghc3RhdGUpKQotCQlyZXR1cm47Ci0KLQlvYmppb19mcmVlX2lvX3N0YXRlKHN0YXRlKTsKIH0KIAogLyoKICAqIEkvTyBkb25lIGNvbW1vbiBjb2RlCiAgKi8KIHN0YXRpYyB2b2lkCi1vYmpsYXlvdXRfaW9kb25lKHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlKQorb2JqbGF5b3V0X2lvZG9uZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyAqb2lyKQogewotCWRwcmludGsoIiVzOiBzdGF0ZSAlcCBzdGF0dXNcbiIsIF9fZnVuY19fLCBzdGF0ZSk7Ci0KLQlpZiAobGlrZWx5KHN0YXRlLT5zdGF0dXMgPj0gMCkpIHsKLQkJb2JqbGF5b3V0X2ZyZWVfaW9fc3RhdGUoc3RhdGUpOworCWlmIChsaWtlbHkob2lyLT5zdGF0dXMgPj0gMCkpIHsKKwkJb2JqaW9fZnJlZV9yZXN1bHQob2lyKTsKIAl9IGVsc2UgewotCQlzdHJ1Y3Qgb2JqbGF5b3V0ICpvYmpsYXkgPSBPQkpMQVlPVVQoc3RhdGUtPmxzZWctPnBsc19sYXlvdXQpOworCQlzdHJ1Y3Qgb2JqbGF5b3V0ICpvYmpsYXkgPSBvaXItPm9iamxheTsKIAogCQlzcGluX2xvY2soJm9iamxheS0+bG9jayk7CiAJCW9iamxheS0+ZGVsdGFfc3BhY2VfdmFsaWQgPSBPQkpfRFNVX0lOVkFMSUQ7Ci0JCWxpc3RfYWRkKCZvYmpsYXktPmVycl9saXN0LCAmc3RhdGUtPmVycl9saXN0KTsKKwkJbGlzdF9hZGQoJm9iamxheS0+ZXJyX2xpc3QsICZvaXItPmVycl9saXN0KTsKIAkJc3Bpbl91bmxvY2soJm9iamxheS0+bG9jayk7CiAJfQogfQpAQCAtMjM4LDEzICsyMDAsMTMgQEAKICAqIHRoZSBlcnJvciBmb3IgbGF0ZXIgcmVwb3J0aW5nIGF0IGxheW91dC1yZXR1cm4uCiAgKi8KIHZvaWQKLW9iamxheW91dF9pb19zZXRfcmVzdWx0KHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbmRleCwKK29iamxheW91dF9pb19zZXRfcmVzdWx0KHN0cnVjdCBvYmpsYXlvdXRfaW9fcmVzICpvaXIsIHVuc2lnbmVkIGluZGV4LAogCQkJc3RydWN0IHBuZnNfb3NkX29iamlkICpwb29pZCwgaW50IG9zZF9lcnJvciwKIAkJCXU2NCBvZmZzZXQsIHU2NCBsZW5ndGgsIGJvb2wgaXNfd3JpdGUpCiB7Ci0Jc3RydWN0IHBuZnNfb3NkX2lvZXJyICppb2VyciA9ICZzdGF0ZS0+aW9lcnJzW2luZGV4XTsKKwlzdHJ1Y3QgcG5mc19vc2RfaW9lcnIgKmlvZXJyID0gJm9pci0+aW9lcnJzW2luZGV4XTsKIAotCUJVR19PTihpbmRleCA+PSBzdGF0ZS0+bnVtX2NvbXBzKTsKKwlCVUdfT04oaW5kZXggPj0gb2lyLT5udW1fY29tcHMpOwogCWlmIChvc2RfZXJyb3IpIHsKIAkJaW9lcnItPm9lcl9jb21wb25lbnQgPSAqcG9vaWQ7CiAJCWlvZXJyLT5vZXJfY29tcF9vZmZzZXQgPSBvZmZzZXQ7CkBAIC0yODUsMjEgKzI0NywxOCBAQAogfQogCiB2b2lkCi1vYmpsYXlvdXRfcmVhZF9kb25lKHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlLCBzc2l6ZV90IHN0YXR1cywgYm9vbCBzeW5jKQorb2JqbGF5b3V0X3JlYWRfZG9uZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyAqb2lyLCBzc2l6ZV90IHN0YXR1cywgYm9vbCBzeW5jKQogewotCWludCBlb2YgPSBzdGF0ZS0+ZW9mOwotCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YTsKKwlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEgPSBvaXItPnJwY2RhdGE7CiAKLQlzdGF0ZS0+c3RhdHVzID0gc3RhdHVzOwotCWRwcmludGsoIiVzOiBCZWdpbiBzdGF0dXM9JXpkIGVvZj0lZFxuIiwgX19mdW5jX18sIHN0YXR1cywgZW9mKTsKLQlyZGF0YSA9IHN0YXRlLT5ycGNkYXRhOwotCXJkYXRhLT50YXNrLnRrX3N0YXR1cyA9IHN0YXR1czsKLQlpZiAoc3RhdHVzID49IDApIHsKKwlvaXItPnN0YXR1cyA9IHJkYXRhLT50YXNrLnRrX3N0YXR1cyA9IHN0YXR1czsKKwlpZiAoc3RhdHVzID49IDApCiAJCXJkYXRhLT5yZXMuY291bnQgPSBzdGF0dXM7Ci0JCXJkYXRhLT5yZXMuZW9mID0gZW9mOwotCX0KLQlvYmpsYXlvdXRfaW9kb25lKHN0YXRlKTsKLQkvKiBtdXN0IG5vdCB1c2Ugc3RhdGUgYWZ0ZXIgdGhpcyBwb2ludCAqLworCW9iamxheW91dF9pb2RvbmUob2lyKTsKKwkvKiBtdXN0IG5vdCB1c2Ugb2lyIGFmdGVyIHRoaXMgcG9pbnQgKi8KKworCWRwcmludGsoIiVzOiBSZXR1cm4gc3RhdHVzPSV6ZCBlb2Y9JWQgc3luYz0lZFxuIiwgX19mdW5jX18sCisJCXN0YXR1cywgcmRhdGEtPnJlcy5lb2YsIHN5bmMpOwogCiAJaWYgKHN5bmMpCiAJCXBuZnNfbGRfcmVhZF9kb25lKHJkYXRhKTsKQEAgLTMxNyw0MCArMjc2LDM2IEBACiB7CiAJbG9mZl90IG9mZnNldCA9IHJkYXRhLT5hcmdzLm9mZnNldDsKIAlzaXplX3QgY291bnQgPSByZGF0YS0+YXJncy5jb3VudDsKLQlzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZTsKLQlzc2l6ZV90IHN0YXR1cyA9IDA7CisJaW50IGVycjsKIAlsb2ZmX3QgZW9mOwogCi0JZHByaW50aygiJXM6IEJlZ2luIGlub2RlICVwIG9mZnNldCAlbGx1IGNvdW50ICVkXG4iLAotCQlfX2Z1bmNfXywgcmRhdGEtPmlub2RlLCBvZmZzZXQsIChpbnQpY291bnQpOwotCiAJZW9mID0gaV9zaXplX3JlYWQocmRhdGEtPmlub2RlKTsKIAlpZiAodW5saWtlbHkob2Zmc2V0ICsgY291bnQgPiBlb2YpKSB7CiAJCWlmIChvZmZzZXQgPj0gZW9mKSB7Ci0JCQlzdGF0dXMgPSAwOworCQkJZXJyID0gMDsKIAkJCXJkYXRhLT5yZXMuY291bnQgPSAwOwogCQkJcmRhdGEtPnJlcy5lb2YgPSAxOworCQkJLypGSVhNRTogZG8gd2UgbmVlZCB0byBjYWxsIHBuZnNfbGRfcmVhZF9kb25lKCkgKi8KIAkJCWdvdG8gb3V0OwogCQl9CiAJCWNvdW50ID0gZW9mIC0gb2Zmc2V0OwogCX0KIAotCXN0YXRlID0gb2JqbGF5b3V0X2FsbG9jX2lvX3N0YXRlKE5GU19JKHJkYXRhLT5pbm9kZSktPmxheW91dCwKLQkJCQkJIHJkYXRhLT5hcmdzLnBhZ2VzLCByZGF0YS0+YXJncy5wZ2Jhc2UsCi0JCQkJCSBvZmZzZXQsIGNvdW50LAotCQkJCQkgcmRhdGEtPmxzZWcsIHJkYXRhLAotCQkJCQkgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFzdGF0ZSkpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCXJkYXRhLT5yZXMuZW9mID0gKG9mZnNldCArIGNvdW50KSA+PSBlb2Y7CisJX2ZpeF92ZXJpZnlfaW9fcGFyYW1zKHJkYXRhLT5sc2VnLCAmcmRhdGEtPmFyZ3MucGFnZXMsCisJCQkgICAgICAmcmRhdGEtPmFyZ3MucGdiYXNlLAorCQkJICAgICAgcmRhdGEtPmFyZ3Mub2Zmc2V0LCByZGF0YS0+YXJncy5jb3VudCk7CiAKLQlzdGF0ZS0+ZW9mID0gc3RhdGUtPm9mZnNldCArIHN0YXRlLT5jb3VudCA+PSBlb2Y7CisJZHByaW50aygiJXM6IGlub2RlKCVseCkgb2Zmc2V0IDB4JWxseCBjb3VudCAweCVaeCBlb2Y9JWRcbiIsCisJCV9fZnVuY19fLCByZGF0YS0+aW5vZGUtPmlfaW5vLCBvZmZzZXQsIGNvdW50LCByZGF0YS0+cmVzLmVvZik7CiAKLQlzdGF0dXMgPSBvYmppb19yZWFkX3BhZ2VsaXN0KHN0YXRlKTsKKwllcnIgPSBvYmppb19yZWFkX3BhZ2VsaXN0KHJkYXRhKTsKICBvdXQ6Ci0JZHByaW50aygiJXM6IFJldHVybiBzdGF0dXMgJVpkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQlyZGF0YS0+cG5mc19lcnJvciA9IHN0YXR1czsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlyZGF0YS0+cG5mc19lcnJvciA9IGVycjsKKwkJZHByaW50aygiJXM6IFJldHVybmVkIEVycm9yICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKKwkJcmV0dXJuIFBORlNfTk9UX0FUVEVNUFRFRDsKKwl9CiAJcmV0dXJuIFBORlNfQVRURU1QVEVEOwogfQogCkBAIC0zNzEsMjYgKzMyNiwyMCBAQAogfQogCiB2b2lkCi1vYmpsYXlvdXRfd3JpdGVfZG9uZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZSwgc3NpemVfdCBzdGF0dXMsCi0JCSAgICAgYm9vbCBzeW5jKQorb2JqbGF5b3V0X3dyaXRlX2RvbmUoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pciwgc3NpemVfdCBzdGF0dXMsIGJvb2wgc3luYykKIHsKLQlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhOworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEgPSBvaXItPnJwY2RhdGE7CiAKLQlkcHJpbnRrKCIlczogQmVnaW5cbiIsIF9fZnVuY19fKTsKLQl3ZGF0YSA9IHN0YXRlLT5ycGNkYXRhOwotCXN0YXRlLT5zdGF0dXMgPSBzdGF0dXM7Ci0Jd2RhdGEtPnRhc2sudGtfc3RhdHVzID0gc3RhdHVzOworCW9pci0+c3RhdHVzID0gd2RhdGEtPnRhc2sudGtfc3RhdHVzID0gc3RhdHVzOwogCWlmIChzdGF0dXMgPj0gMCkgewogCQl3ZGF0YS0+cmVzLmNvdW50ID0gc3RhdHVzOwotCQl3ZGF0YS0+dmVyZi5jb21taXR0ZWQgPSBzdGF0ZS0+Y29tbWl0dGVkOwotCQlkcHJpbnRrKCIlczogUmV0dXJuIHN0YXR1cyAlZCBjb21taXR0ZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgd2RhdGEtPnRhc2sudGtfc3RhdHVzLAotCQkJd2RhdGEtPnZlcmYuY29tbWl0dGVkKTsKLQl9IGVsc2UKLQkJZHByaW50aygiJXM6IFJldHVybiBzdGF0dXMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgd2RhdGEtPnRhc2sudGtfc3RhdHVzKTsKLQlvYmpsYXlvdXRfaW9kb25lKHN0YXRlKTsKLQkvKiBtdXN0IG5vdCB1c2Ugc3RhdGUgYWZ0ZXIgdGhpcyBwb2ludCAqLworCQl3ZGF0YS0+dmVyZi5jb21taXR0ZWQgPSBvaXItPmNvbW1pdHRlZDsKKwl9CisJb2JqbGF5b3V0X2lvZG9uZShvaXIpOworCS8qIG11c3Qgbm90IHVzZSBvaXIgYWZ0ZXIgdGhpcyBwb2ludCAqLworCisJZHByaW50aygiJXM6IFJldHVybiBzdGF0dXMgJXpkIGNvbW1pdHRlZCAlZCBzeW5jPSVkXG4iLCBfX2Z1bmNfXywKKwkJc3RhdHVzLCB3ZGF0YS0+dmVyZi5jb21taXR0ZWQsIHN5bmMpOwogCiAJaWYgKHN5bmMpCiAJCXBuZnNfbGRfd3JpdGVfZG9uZSh3ZGF0YSk7CkBAIC00MDcsMzAgKzM1NiwxOCBAQAogb2JqbGF5b3V0X3dyaXRlX3BhZ2VsaXN0KHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEsCiAJCQkgaW50IGhvdykKIHsKLQlzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZTsKLQlzc2l6ZV90IHN0YXR1czsKKwlpbnQgZXJyOwogCi0JZHByaW50aygiJXM6IEJlZ2luIGlub2RlICVwIG9mZnNldCAlbGx1IGNvdW50ICV1XG4iLAotCQlfX2Z1bmNfXywgd2RhdGEtPmlub2RlLCB3ZGF0YS0+YXJncy5vZmZzZXQsIHdkYXRhLT5hcmdzLmNvdW50KTsKKwlfZml4X3ZlcmlmeV9pb19wYXJhbXMod2RhdGEtPmxzZWcsICZ3ZGF0YS0+YXJncy5wYWdlcywKKwkJCSAgICAgICZ3ZGF0YS0+YXJncy5wZ2Jhc2UsCisJCQkgICAgICB3ZGF0YS0+YXJncy5vZmZzZXQsIHdkYXRhLT5hcmdzLmNvdW50KTsKIAotCXN0YXRlID0gb2JqbGF5b3V0X2FsbG9jX2lvX3N0YXRlKE5GU19JKHdkYXRhLT5pbm9kZSktPmxheW91dCwKLQkJCQkJIHdkYXRhLT5hcmdzLnBhZ2VzLAotCQkJCQkgd2RhdGEtPmFyZ3MucGdiYXNlLAotCQkJCQkgd2RhdGEtPmFyZ3Mub2Zmc2V0LAotCQkJCQkgd2RhdGEtPmFyZ3MuY291bnQsCi0JCQkJCSB3ZGF0YS0+bHNlZywgd2RhdGEsCi0JCQkJCSBHRlBfTk9GUyk7Ci0JaWYgKHVubGlrZWx5KCFzdGF0ZSkpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJZXJyID0gb2JqaW9fd3JpdGVfcGFnZWxpc3Qod2RhdGEsIGhvdyk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJd2RhdGEtPnBuZnNfZXJyb3IgPSBlcnI7CisJCWRwcmludGsoIiVzOiBSZXR1cm5lZCBFcnJvciAlZFxuIiwgX19mdW5jX18sIGVycik7CisJCXJldHVybiBQTkZTX05PVF9BVFRFTVBURUQ7CiAJfQotCi0Jc3RhdGUtPnN5bmMgPSBob3cgJiBGTFVTSF9TWU5DOwotCi0Jc3RhdHVzID0gb2JqaW9fd3JpdGVfcGFnZWxpc3Qoc3RhdGUsIGhvdyAmIEZMVVNIX1NUQUJMRSk7Ci0gb3V0OgotCWRwcmludGsoIiVzOiBSZXR1cm4gc3RhdHVzICVaZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0Jd2RhdGEtPnBuZnNfZXJyb3IgPSBzdGF0dXM7CiAJcmV0dXJuIFBORlNfQVRURU1QVEVEOwogfQogCkBAIC01MzcsMTQgKzQ3NCwxNCBAQAogc3RhdGljIHZvaWQKIGVuY29kZV9hY2N1bXVsYXRlZF9lcnJvcihzdHJ1Y3Qgb2JqbGF5b3V0ICpvYmpsYXksIF9fYmUzMiAqcCkKIHsKLQlzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZSwgKnRtcDsKKwlzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyAqb2lyLCAqdG1wOwogCXN0cnVjdCBwbmZzX29zZF9pb2VyciBhY2N1bXVsYXRlZF9lcnIgPSB7Lm9lcl9lcnJubyA9IDB9OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN0YXRlLCB0bXAsICZvYmpsYXktPmVycl9saXN0LCBlcnJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvaXIsIHRtcCwgJm9iamxheS0+ZXJyX2xpc3QsIGVycl9saXN0KSB7CiAJCXVuc2lnbmVkIGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5udW1fY29tcHM7IGkrKykgewotCQkJc3RydWN0IHBuZnNfb3NkX2lvZXJyICppb2VyciA9ICZzdGF0ZS0+aW9lcnJzW2ldOworCQlmb3IgKGkgPSAwOyBpIDwgb2lyLT5udW1fY29tcHM7IGkrKykgeworCQkJc3RydWN0IHBuZnNfb3NkX2lvZXJyICppb2VyciA9ICZvaXItPmlvZXJyc1tpXTsKIAogCQkJaWYgKCFpb2Vyci0+b2VyX2Vycm5vKQogCQkJCWNvbnRpbnVlOwpAQCAtNTYzLDggKzUwMCw4IEBACiAKIAkJCW1lcmdlX2lvZXJyKCZhY2N1bXVsYXRlZF9lcnIsIGlvZXJyKTsKIAkJfQotCQlsaXN0X2RlbCgmc3RhdGUtPmVycl9saXN0KTsKLQkJb2JqbGF5b3V0X2ZyZWVfaW9fc3RhdGUoc3RhdGUpOworCQlsaXN0X2RlbCgmb2lyLT5lcnJfbGlzdCk7CisJCW9iamlvX2ZyZWVfcmVzdWx0KG9pcik7CiAJfQogCiAJcG5mc19vc2RfeGRyX2VuY29kZV9pb2VycihwLCAmYWNjdW11bGF0ZWRfZXJyKTsKQEAgLTU3Niw3ICs1MTMsNyBAQAogCQkJICAgICAgY29uc3Qgc3RydWN0IG5mczRfbGF5b3V0cmV0dXJuX2FyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IG9iamxheW91dCAqb2JqbGF5ID0gT0JKTEFZT1VUKHBuZnNsYXkpOwotCXN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlLCAqdG1wOworCXN0cnVjdCBvYmpsYXlvdXRfaW9fcmVzICpvaXIsICp0bXA7CiAJX19iZTMyICpzdGFydDsKIAogCWRwcmludGsoIiVzOiBCZWdpblxuIiwgX19mdW5jX18pOwpAQCAtNTg1LDEzICs1MjIsMTMgQEAKIAogCXNwaW5fbG9jaygmb2JqbGF5LT5sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdGF0ZSwgdG1wLCAmb2JqbGF5LT5lcnJfbGlzdCwgZXJyX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2lyLCB0bXAsICZvYmpsYXktPmVycl9saXN0LCBlcnJfbGlzdCkgewogCQlfX2JlMzIgKmxhc3RfeGRyID0gTlVMTCwgKnA7CiAJCXVuc2lnbmVkIGk7CiAJCWludCByZXMgPSAwOwogCi0JCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+bnVtX2NvbXBzOyBpKyspIHsKLQkJCXN0cnVjdCBwbmZzX29zZF9pb2VyciAqaW9lcnIgPSAmc3RhdGUtPmlvZXJyc1tpXTsKKwkJZm9yIChpID0gMDsgaSA8IG9pci0+bnVtX2NvbXBzOyBpKyspIHsKKwkJCXN0cnVjdCBwbmZzX29zZF9pb2VyciAqaW9lcnIgPSAmb2lyLT5pb2VycnNbaV07CiAKIAkJCWlmICghaW9lcnItPm9lcl9lcnJubykKIAkJCQljb250aW51ZTsKQEAgLTYxNSw3ICs1NTIsNyBAQAogCQkJfQogCiAJCQlsYXN0X3hkciA9IHA7Ci0JCQlwbmZzX29zZF94ZHJfZW5jb2RlX2lvZXJyKHAsICZzdGF0ZS0+aW9lcnJzW2ldKTsKKwkJCXBuZnNfb3NkX3hkcl9lbmNvZGVfaW9lcnIocCwgJm9pci0+aW9lcnJzW2ldKTsKIAkJfQogCiAJCS8qIFRPRE86IHVzZSB4ZHJfd3JpdGVfcGFnZXMgKi8KQEAgLTYzMSw4ICs1NjgsOCBAQAogCQkJZW5jb2RlX2FjY3VtdWxhdGVkX2Vycm9yKG9iamxheSwgbGFzdF94ZHIpOwogCQkJZ290byBsb29wX2RvbmU7CiAJCX0KLQkJbGlzdF9kZWwoJnN0YXRlLT5lcnJfbGlzdCk7Ci0JCW9iamxheW91dF9mcmVlX2lvX3N0YXRlKHN0YXRlKTsKKwkJbGlzdF9kZWwoJm9pci0+ZXJyX2xpc3QpOworCQlvYmppb19mcmVlX3Jlc3VsdChvaXIpOwogCX0KIGxvb3BfZG9uZToKIAlzcGluX3VubG9jaygmb2JqbGF5LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9vYmpsYXlvdXQvb2JqbGF5b3V0LmggYi9mcy9uZnMvb2JqbGF5b3V0L29iamxheW91dC5oCmluZGV4IGE4MjQ0YzguLjhlYzM0NzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9vYmpsYXlvdXQvb2JqbGF5b3V0LmgKKysrIGIvZnMvbmZzL29iamxheW91dC9vYmpsYXlvdXQuaApAQCAtNzQsMTkgKzc0LDExIEBACiAgKiBwZXItSS9PIG9wZXJhdGlvbiBzdGF0ZQogICogZW1iZWRkZWQgaW4gb2JqZWN0cyBwcm92aWRlciBpb19zdGF0ZSBkYXRhIHN0cnVjdHVyZQogICovCi1zdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlIHsKLQlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZzsKLQotCXN0cnVjdCBwYWdlICoqcGFnZXM7Ci0JdW5zaWduZWQgcGdiYXNlOwotCXVuc2lnbmVkIG5yX3BhZ2VzOwotCXVuc2lnbmVkIGxvbmcgY291bnQ7Ci0JbG9mZl90IG9mZnNldDsKLQlib29sIHN5bmM7CitzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyB7CisJc3RydWN0IG9iamxheW91dCAqb2JqbGF5OwogCiAJdm9pZCAqcnBjZGF0YTsKIAlpbnQgc3RhdHVzOyAgICAgICAgICAgICAvKiByZXMgKi8KLQlpbnQgZW9mOyAgICAgICAgICAgICAgICAvKiByZXMgKi8KIAlpbnQgY29tbWl0dGVkOyAgICAgICAgICAvKiByZXMgKi8KIAogCS8qIEVycm9yIHJlcG9ydGluZyAobGF5b3V0X3JldHVybikgKi8KQEAgLTEwMCw2ICs5MiwxOCBAQAogCXN0cnVjdCBwbmZzX29zZF9pb2VyciAqaW9lcnJzOwogfTsKIAorc3RhdGljIGlubGluZQordm9pZCBvYmpsYXlvdXRfaW5pdF9pb2VycnMoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pciwgdW5zaWduZWQgbnVtX2NvbXBzLAorCQkJc3RydWN0IHBuZnNfb3NkX2lvZXJyICppb2VycnMsIHZvaWQgKnJwY2RhdGEsCisJCQlzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpwbmZzX2xheW91dF90eXBlKQoreworCW9pci0+b2JqbGF5ID0gT0JKTEFZT1VUKHBuZnNfbGF5b3V0X3R5cGUpOworCW9pci0+cnBjZGF0YSA9IHJwY2RhdGE7CisJSU5JVF9MSVNUX0hFQUQoJm9pci0+ZXJyX2xpc3QpOworCW9pci0+bnVtX2NvbXBzID0gbnVtX2NvbXBzOworCW9pci0+aW9lcnJzID0gaW9lcnJzOworfQorCiAvKgogICogUmFpZCBlbmdpbmUgSS9PIEFQSQogICovCkBAIC0xMTAsMjggKzExNCwyNCBAQAogCWdmcF90IGdmcF9mbGFncyk7CiBleHRlcm4gdm9pZCBvYmppb19mcmVlX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpOwogCi1leHRlcm4gaW50IG9iamlvX2FsbG9jX2lvX3N0YXRlKAotCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLAotCXN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKipvdXRwLAotCWdmcF90IGdmcF9mbGFncyk7Ci1leHRlcm4gdm9pZCBvYmppb19mcmVlX2lvX3N0YXRlKHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlKTsKKy8qIG9iamlvX2ZyZWVfcmVzdWx0IHdpbGwgZnJlZSB0aGVzZSBAb2lyIHN0cnVjdHMgcmVjaWV2ZWQgZnJvbQorICogb2JqbGF5b3V0X3tyZWFkLHdyaXRlfV9kb25lCisgKi8KK2V4dGVybiB2b2lkIG9iamlvX2ZyZWVfcmVzdWx0KHN0cnVjdCBvYmpsYXlvdXRfaW9fcmVzICpvaXIpOwogCi1leHRlcm4gc3NpemVfdCBvYmppb19yZWFkX3BhZ2VsaXN0KHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKm9sX3N0YXRlKTsKLWV4dGVybiBzc2l6ZV90IG9iamlvX3dyaXRlX3BhZ2VsaXN0KHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKm9sX3N0YXRlLAotCQkJCSAgICBib29sIHN0YWJsZSk7CitleHRlcm4gaW50IG9iamlvX3JlYWRfcGFnZWxpc3Qoc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhKTsKK2V4dGVybiBpbnQgb2JqaW9fd3JpdGVfcGFnZWxpc3Qoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSwgaW50IGhvdyk7CiAKIC8qCiAgKiBjYWxsYmFjayBBUEkKICAqLwotZXh0ZXJuIHZvaWQgb2JqbGF5b3V0X2lvX3NldF9yZXN1bHQoc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqc3RhdGUsCitleHRlcm4gdm9pZCBvYmpsYXlvdXRfaW9fc2V0X3Jlc3VsdChzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyAqb2lyLAogCQkJdW5zaWduZWQgaW5kZXgsIHN0cnVjdCBwbmZzX29zZF9vYmppZCAqcG9vaWQsCiAJCQlpbnQgb3NkX2Vycm9yLCB1NjQgb2Zmc2V0LCB1NjQgbGVuZ3RoLCBib29sIGlzX3dyaXRlKTsKIAogc3RhdGljIGlubGluZSB2b2lkCi1vYmpsYXlvdXRfYWRkX2RlbHRhX3NwYWNlX3VzZWQoc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqc3RhdGUsIHM2NCBzcGFjZV91c2VkKQorb2JqbGF5b3V0X2FkZF9kZWx0YV9zcGFjZV91c2VkKHN0cnVjdCBvYmpsYXlvdXQgKm9iamxheSwgczY0IHNwYWNlX3VzZWQpCiB7Ci0Jc3RydWN0IG9iamxheW91dCAqb2JqbGF5ID0gT0JKTEFZT1VUKHN0YXRlLT5sc2VnLT5wbHNfbGF5b3V0KTsKLQogCS8qIElmIG9uZSBvZiB0aGUgSS9PcyBlcnJvcmVkIG91dCBhbmQgdGhlIGRlbHRhX3NwYWNlX3VzZWQgd2FzCiAJICogaW52YWxpZCB3ZSByZW5kZXIgdGhlIGNvbXBsZXRlIHJlcG9ydCBhcyBpbnZhbGlkLiBQcm90b2NvbCBtYW5kYXRlCiAJICogdGhlIERTVSBiZSBhY2N1cmF0ZSBvciBub3QgcmVwb3J0ZWQuCkBAIC0xNDQsOSArMTQ0LDkgQEAKIAlzcGluX3VubG9jaygmb2JqbGF5LT5sb2NrKTsKIH0KIAotZXh0ZXJuIHZvaWQgb2JqbGF5b3V0X3JlYWRfZG9uZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZSwKK2V4dGVybiB2b2lkIG9iamxheW91dF9yZWFkX2RvbmUoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pciwKIAkJCQlzc2l6ZV90IHN0YXR1cywgYm9vbCBzeW5jKTsKLWV4dGVybiB2b2lkIG9iamxheW91dF93cml0ZV9kb25lKHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlLAorZXh0ZXJuIHZvaWQgb2JqbGF5b3V0X3dyaXRlX2RvbmUoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pciwKIAkJCQkgc3NpemVfdCBzdGF0dXMsIGJvb2wgc3luYyk7CiAKIGV4dGVybiBpbnQgb2JqbGF5b3V0X2dldF9kZXZpY2VpbmZvKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKnBuZnNsYXksCmRpZmYgLS1naXQgYS9mcy9uZnMvcGFnZWxpc3QuYyBiL2ZzL25mcy9wYWdlbGlzdC5jCmluZGV4IGI2MDk3MGMuLjU2NjhmN2MgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wYWdlbGlzdC5jCisrKyBiL2ZzL25mcy9wYWdlbGlzdC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAicG5mcy5oIgpAQCAtNDEsNyArNDIsNyBAQAogCiAvKioKICAqIG5mc19jcmVhdGVfcmVxdWVzdCAtIENyZWF0ZSBhbiBORlMgcmVhZC93cml0ZSByZXF1ZXN0LgotICogQGZpbGU6IGZpbGUgZGVzY3JpcHRvciB0byB1c2UKKyAqIEBjdHg6IG9wZW4gY29udGV4dCB0byB1c2UKICAqIEBpbm9kZTogaW5vZGUgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXMgYXR0YWNoZWQKICAqIEBwYWdlOiBwYWdlIHRvIHdyaXRlCiAgKiBAb2Zmc2V0OiBzdGFydGluZyBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIGZvciB0aGUgd3JpdGUKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzLmMgYi9mcy9uZnMvcG5mcy5jCmluZGV4IGVlNzNkOWEuLmJhZjczNTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzLmMKKysrIGIvZnMvbmZzL3BuZnMuYwpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInBuZnMuaCIKICNpbmNsdWRlICJpb3N0YXQuaCIKQEAgLTE0NDMsMTcgKzE0NDQsMzEgQEAKIAkvKiBOb3RlIGt6YWxsb2MgZW5zdXJlcyBkYXRhLT5yZXMuc2VxX3Jlcy5zcl9zbG90ID09IE5VTEwgKi8KIAlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfTk9GUyk7CiAJaWYgKCFkYXRhKSB7Ci0JCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAorCWlmICghdGVzdF9iaXQoTkZTX0lOT19MQVlPVVRDT01NSVQsICZuZnNpLT5mbGFncykpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChORlNfSU5PX0xBWU9VVENPTU1JVFRJTkcsICZuZnNpLT5mbGFncykpIHsKKwkJaWYgKCFzeW5jKSB7CisJCQlzdGF0dXMgPSAtRUFHQUlOOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlzdGF0dXMgPSB3YWl0X29uX2JpdF9sb2NrKCZuZnNpLT5mbGFncywgTkZTX0lOT19MQVlPVVRDT01NSVRUSU5HLAorCQkJCQluZnNfd2FpdF9iaXRfa2lsbGFibGUsIFRBU0tfS0lMTEFCTEUpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKIAlJTklUX0xJU1RfSEVBRCgmZGF0YS0+bHNlZ19saXN0KTsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GU19JTk9fTEFZT1VUQ09NTUlULCAmbmZzaS0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdChORlNfSU5PX0xBWU9VVENPTU1JVFRJTkcsICZuZnNpLT5mbGFncyk7CiAJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkJa2ZyZWUoZGF0YSk7Ci0JCWdvdG8gb3V0OworCQl3YWtlX3VwX2JpdCgmbmZzaS0+ZmxhZ3MsIE5GU19JTk9fTEFZT1VUQ09NTUlUVElORyk7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJcG5mc19saXN0X3dyaXRlX2xzZWcoaW5vZGUsICZkYXRhLT5sc2VnX2xpc3QpOwpAQCAtMTQ3NSw2ICsxNDkwLDExIEBACiAKIAlzdGF0dXMgPSBuZnM0X3Byb2NfbGF5b3V0Y29tbWl0KGRhdGEsIHN5bmMpOwogb3V0OgorCWlmIChzdGF0dXMpCisJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiAJZHByaW50aygiPC0tICVzIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKK291dF9mcmVlOgorCWtmcmVlKGRhdGEpOworCWdvdG8gb3V0OwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL3BuZnNfZGV2LmMgYi9mcy9uZnMvcG5mc19kZXYuYwppbmRleCA2ZmRhNTIyLi40ZjM1OWQyIDEwMDY0NAotLS0gYS9mcy9uZnMvcG5mc19kZXYuYworKysgYi9mcy9uZnMvcG5mc19kZXYuYwpAQCAtMjgsNiArMjgsNyBAQAogICogIHN1Y2ggZGFtYWdlcy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAicG5mcy5oIgogCiAjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1BORlMKZGlmZiAtLWdpdCBhL2ZzL25mcy93cml0ZS5jIGIvZnMvbmZzL3dyaXRlLmMKaW5kZXggMjIxOWM4OC4uMWRkYTc4ZCAxMDA2NDQKLS0tIGEvZnMvbmZzL3dyaXRlLmMKKysrIGIvZnMvbmZzL3dyaXRlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0xMjQzLDcgKzEyNDQsNiBAQAogewogCXN0cnVjdCBuZnNfd3JpdGVhcmdzCSphcmdwID0gJmRhdGEtPmFyZ3M7CiAJc3RydWN0IG5mc193cml0ZXJlcwkqcmVzcCA9ICZkYXRhLT5yZXM7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIJKnNlcnZlciA9IE5GU19TRVJWRVIoZGF0YS0+aW5vZGUpOwogCWludCBzdGF0dXM7CiAKIAlkcHJpbnRrKCJORlM6ICU1dSBuZnNfd3JpdGViYWNrX2RvbmUgKHN0YXR1cyAlZClcbiIsCkBAIC0xMjc3LDcgKzEyNzcsNyBAQAogCQlpZiAodGltZV9iZWZvcmUoY29tcGxhaW4sIGppZmZpZXMpKSB7CiAJCQlkcHJpbnRrKCJORlM6ICAgICAgIGZhdWx0eSBORlMgc2VydmVyICVzOiIKIAkJCQkiIChjb21taXR0ZWQgPSAlZCkgIT0gKHN0YWJsZSA9ICVkKVxuIiwKLQkJCQlzZXJ2ZXItPm5mc19jbGllbnQtPmNsX2hvc3RuYW1lLAorCQkJCU5GU19TRVJWRVIoZGF0YS0+aW5vZGUpLT5uZnNfY2xpZW50LT5jbF9ob3N0bmFtZSwKIAkJCQlyZXNwLT52ZXJmLT5jb21taXR0ZWQsIGFyZ3AtPnN0YWJsZSk7CiAJCQljb21wbGFpbiA9IGppZmZpZXMgKyAzMDAgKiBIWjsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0YWNsLmMgYi9mcy9uZnNkL25mczRhY2wuYwppbmRleCBhZDg4ZjFjLi45YzUxYWZmIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRhY2wuYworKysgYi9mcy9uZnNkL25mczRhY2wuYwpAQCAtMzYsNiArMzYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImFjbC5oIgogCiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggNjZkMDk1ZC4uYjZmYTc5MiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTY1NSw3ICs2NTUsNyBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiBuZnNlcnJfYmFkX3hkcjsKIAl9Ci0JdyAmPSAhTkZTNF9TSEFSRV9BQ0NFU1NfTUFTSzsKKwl3ICY9IH5ORlM0X1NIQVJFX0FDQ0VTU19NQVNLOwogCWlmICghdykKIAkJcmV0dXJuIG5mc19vazsKIAlpZiAoIWFyZ3AtPm1pbm9ydmVyc2lvbikKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IGRiMzRhNTguLmM0NWEyZWEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19hcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2tyYjVfZW5jdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImlkbWFwLmgiCiAjaW5jbHVkZSAibmZzZC5oIgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNzdmMuYyBiL2ZzL25mc2QvbmZzc3ZjLmMKaW5kZXggZGM1YTFiZi4uZWRhN2Q3ZSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNzdmMuYworKysgYi9mcy9uZnNkL25mc3N2Yy5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnNfc3RydWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogCkBAIC0yNTYsNiArMjU3LDggQEAKIAluZnNkX3NlcnYgPSBOVUxMOwogCW5mc2Rfc2h1dGRvd24oKTsKIAorCXN2Y19ycGNiX2NsZWFudXAoc2Vydik7CisKIAlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiBsYXN0IHNlcnZlciBoYXMgZXhpdGVkLCBmbHVzaGluZyBleHBvcnQgIgogCQkJICAgICJjYWNoZVxuIik7CiAJbmZzZF9leHBvcnRfZmx1c2goKTsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pbm9kZS5jIGIvZnMvbmlsZnMyL2lub2RlLmMKaW5kZXggNjY2NjI4Yi4uYjUwZmZiNyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lub2RlLmMKKysrIGIvZnMvbmlsZnMyL2lub2RlLmMKQEAgLTM1NCw3ICszNTQsNyBAQAogCiAgZmFpbGVkX2FjbDoKICBmYWlsZWRfYm1hcDoKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJY2xlYXJfbmxpbmsoaW5vZGUpOwogCWlwdXQoaW5vZGUpOyAgLyogcmF3X2lub2RlIHdpbGwgYmUgZGVsZXRlZCB0aHJvdWdoCiAJCQkgZ2VuZXJpY19kZWxldGVfaW5vZGUoKSAqLwogCWdvdG8gZmFpbGVkOwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9tb2RlKTsKIAlpbm9kZS0+aV91aWQgPSAodWlkX3QpbGUzMl90b19jcHUocmF3X2lub2RlLT5pX3VpZCk7CiAJaW5vZGUtPmlfZ2lkID0gKGdpZF90KWxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9naWQpOwotCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2xpbmtzX2NvdW50KTsKKwlzZXRfbmxpbmsoaW5vZGUsIGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9saW5rc19jb3VudCkpOwogCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShyYXdfaW5vZGUtPmlfc2l6ZSk7CiAJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gbGU2NF90b19jcHUocmF3X2lub2RlLT5pX210aW1lKTsKIAlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBsZTY0X3RvX2NwdShyYXdfaW5vZGUtPmlfY3RpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL25hbWVpLmMgYi9mcy9uaWxmczIvbmFtZWkuYwppbmRleCBhMzE0MTk5Li43Njg5ODJkIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbmFtZWkuYworKysgYi9mcy9uaWxmczIvbmFtZWkuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJCW5pbGZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsIF9fZnVuY19fLAogCQkJICAgICAgImRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkXG4iLAogCQkJICAgICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAl9CiAJZXJyID0gbmlsZnNfZGVsZXRlX2VudHJ5KGRlLCBwYWdlKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL25pbGZzLmggYi9mcy9uaWxmczIvbmlsZnMuaAppbmRleCAyNTVkNWUxLi4zNzc3ZDEzIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbmlsZnMuaAorKysgYi9mcy9uaWxmczIvbmlsZnMuaApAQCAtMjc2LDEwICsyNzYsMTAgQEAKIC8qIHN1cGVyLmMgKi8KIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKm5pbGZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiB2b2lkIG5pbGZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICopOwotZXh0ZXJuIHZvaWQgbmlsZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIHZvaWQgbmlsZnNfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgbmlsZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDMsIDQpCit2b2lkIG5pbGZzX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogZXh0ZXJuIHN0cnVjdCBuaWxmc19zdXBlcl9ibG9jayAqCiBuaWxmc19yZWFkX3N1cGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1NjQsIGludCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKIGV4dGVybiBpbnQgbmlsZnNfc3RvcmVfbWFnaWNfYW5kX29wdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKZGlmZiAtLWdpdCBhL2ZzL250ZnMvZGVidWcuaCBiL2ZzL250ZnMvZGVidWcuaAppbmRleCAyMTQyYjFjLi41M2MyN2VhIDEwMDY0NAotLS0gYS9mcy9udGZzL2RlYnVnLmgKKysrIGIvZnMvbnRmcy9kZWJ1Zy5oCkBAIC0zMCw4ICszMCw5IEBACiAKIGV4dGVybiBpbnQgZGVidWdfbXNnczsKIAotZXh0ZXJuIHZvaWQgX19udGZzX2RlYnVnKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKLQljb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworZXh0ZXJuIF9fcHJpbnRmKDQsIDUpCit2b2lkIF9fbnRmc19kZWJ1Zyhjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCSAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwogLyoqCiAgKiBudGZzX2RlYnVnIC0gd3JpdGUgYSBkZWJ1ZyBsZXZlbCBtZXNzYWdlIHRvIHN5c2xvZwogICogQGY6CQlhIHByaW50ZiBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKQEAgLTUyLDEyICs1MywxNCBAQAogCiAjZW5kaWYJLyogIURFQlVHICovCiAKLWV4dGVybiB2b2lkIF9fbnRmc193YXJuaW5nKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQljb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworZXh0ZXJuICBfX3ByaW50ZigzLCA0KQordm9pZCBfX250ZnNfd2FybmluZyhjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKICNkZWZpbmUgbnRmc193YXJuaW5nKHNiLCBmLCBhLi4uKQlfX250ZnNfd2FybmluZyhfX2Z1bmNfXywgc2IsIGYsICMjYSkKIAotZXh0ZXJuIHZvaWQgX19udGZzX2Vycm9yKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQljb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworZXh0ZXJuICBfX3ByaW50ZigzLCA0KQordm9pZCBfX250ZnNfZXJyb3IoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2RlZmluZSBudGZzX2Vycm9yKHNiLCBmLCBhLi4uKQkJX19udGZzX2Vycm9yKF9fZnVuY19fLCBzYiwgZiwgIyNhKQogCiAjZW5kaWYgLyogX0xJTlVYX05URlNfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbm9kZS5jIGIvZnMvbnRmcy9pbm9kZS5jCmluZGV4IDEzNzE0ODcuLjk3ZTJkYWMgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvaW5vZGUuYworKysgYi9mcy9udGZzL2lub2RlLmMKQEAgLTYxMiw3ICs2MTIsNyBAQAogCSAqIG1pZ2h0IGJlIHRyaWNreSBkdWUgdG8gdmZzIGludGVyYWN0aW9ucy4gTmVlZCB0byB0aGluayBhYm91dCB0aGlzCiAJICogc29tZSBtb3JlIHdoZW4gaW1wbGVtZW50aW5nIHRoZSB1bmxpbmsgY29tbWFuZC4KIAkgKi8KLQl2aS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KG0tPmxpbmtfY291bnQpOworCXNldF9ubGluayh2aSwgbGUxNl90b19jcHUobS0+bGlua19jb3VudCkpOwogCS8qCiAJICogRklYTUU6IFJlcGFyc2UgcG9pbnRzIGNhbiBoYXZlIHRoZSBkaXJlY3RvcnkgYml0IHNldCBldmVuIHRob3VnaAogCSAqIHRoZXkgd291bGQgYmUgU19JRkxOSy4gTmVlZCB0byBkZWFsIHdpdGggdGhpcyBmdXJ0aGVyIGJlbG93IHdoZW4gd2UKQEAgLTYzNCw3ICs2MzQsNyBAQAogCQl2aS0+aV9tb2RlICY9IH52b2wtPmRtYXNrOwogCQkvKiBUaGluZ3MgYnJlYWsgd2l0aG91dCB0aGlzIGtsdWRnZSEgKi8KIAkJaWYgKHZpLT5pX25saW5rID4gMSkKLQkJCXZpLT5pX25saW5rID0gMTsKKwkJCXNldF9ubGluayh2aSwgMSk7CiAJfSBlbHNlIHsKIAkJdmktPmlfbW9kZSB8PSBTX0lGUkVHOwogCQkvKiBBcHBseSB0aGUgZmlsZSBwZXJtaXNzaW9ucyBtYXNrIHNldCBpbiB0aGUgbW91bnQgb3B0aW9ucy4gKi8KQEAgLTEyNDIsNyArMTI0Miw3IEBACiAJdmktPmlfdmVyc2lvbgk9IGJhc2VfdmktPmlfdmVyc2lvbjsKIAl2aS0+aV91aWQJPSBiYXNlX3ZpLT5pX3VpZDsKIAl2aS0+aV9naWQJPSBiYXNlX3ZpLT5pX2dpZDsKLQl2aS0+aV9ubGluawk9IGJhc2VfdmktPmlfbmxpbms7CisJc2V0X25saW5rKHZpLCBiYXNlX3ZpLT5pX25saW5rKTsKIAl2aS0+aV9tdGltZQk9IGJhc2VfdmktPmlfbXRpbWU7CiAJdmktPmlfY3RpbWUJPSBiYXNlX3ZpLT5pX2N0aW1lOwogCXZpLT5pX2F0aW1lCT0gYmFzZV92aS0+aV9hdGltZTsKQEAgLTE1MDgsNyArMTUwOCw3IEBACiAJdmktPmlfdmVyc2lvbgk9IGJhc2VfdmktPmlfdmVyc2lvbjsKIAl2aS0+aV91aWQJPSBiYXNlX3ZpLT5pX3VpZDsKIAl2aS0+aV9naWQJPSBiYXNlX3ZpLT5pX2dpZDsKLQl2aS0+aV9ubGluawk9IGJhc2VfdmktPmlfbmxpbms7CisJc2V0X25saW5rKHZpLCBiYXNlX3ZpLT5pX25saW5rKTsKIAl2aS0+aV9tdGltZQk9IGJhc2VfdmktPmlfbXRpbWU7CiAJdmktPmlfY3RpbWUJPSBiYXNlX3ZpLT5pX2N0aW1lOwogCXZpLT5pX2F0aW1lCT0gYmFzZV92aS0+aV9hdGltZTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCmluZGV4IGRiNWVlNGIuLmFkN2QwYzEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci90Y3AuYwpAQCAtNTksNiArNTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGlyLmMgYi9mcy9vY2ZzMi9kaXIuYwppbmRleCA4NTgyZTNmLi5lMjg3OGI1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuYworKysgYi9mcy9vY2ZzMi9kaXIuYwpAQCAtMjI5Miw3ICsyMjkyLDcgQEAKIAlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOwogCiAJaV9zaXplX3dyaXRlKGlub2RlLCBzaXplKTsKLQlpbm9kZS0+aV9ubGluayA9IDI7CisJc2V0X25saW5rKGlub2RlLCAyKTsKIAlpbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9pbm9kZV9zZWN0b3JfY291bnQoaW5vZGUpOwogCiAJcmV0ID0gb2NmczJfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlLCBkaV9iaCk7CkBAIC0yMzU0LDcgKzIzNTQsNyBAQAogCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBuZXdfYmgpOwogCiAJaV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCWlub2RlLT5pX2Jsb2NrcyA9IG9jZnMyX2lub2RlX3NlY3Rvcl9jb3VudChpbm9kZSk7CiAJc3RhdHVzID0gb2NmczJfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlLCBmZV9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKaW5kZXggNTZmODJjYi4uMGUyOGUyNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImNsdXN0ZXIvaGVhcnRiZWF0LmgiCiAjaW5jbHVkZSAiY2x1c3Rlci9ub2RlbWFuYWdlci5oIgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IDc2NDJkN2MuLmUxZWQ1ZTUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTIwOTIsNyArMjA5Miw3IEBACiAJaW5vZGUtPmlfdWlkICAgICA9IGJlMzJfdG9fY3B1KGx2Yi0+bHZiX2l1aWQpOwogCWlub2RlLT5pX2dpZCAgICAgPSBiZTMyX3RvX2NwdShsdmItPmx2Yl9pZ2lkKTsKIAlpbm9kZS0+aV9tb2RlICAgID0gYmUxNl90b19jcHUobHZiLT5sdmJfaW1vZGUpOwotCWlub2RlLT5pX25saW5rICAgPSBiZTE2X3RvX2NwdShsdmItPmx2Yl9pbmxpbmspOworCXNldF9ubGluayhpbm9kZSwgYmUxNl90b19jcHUobHZiLT5sdmJfaW5saW5rKSk7CiAJb2NmczJfdW5wYWNrX3RpbWVzcGVjKCZpbm9kZS0+aV9hdGltZSwKIAkJCSAgICAgIGJlNjRfdG9fY3B1KGx2Yi0+bHZiX2lhdGltZV9wYWNrZWQpKTsKIAlvY2ZzMl91bnBhY2tfdGltZXNwZWMoJmlub2RlLT5pX210aW1lLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuYyBiL2ZzL29jZnMyL2lub2RlLmMKaW5kZXggYjRjOGJiNi4uYTIyZDJjMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuYworKysgYi9mcy9vY2ZzMi9pbm9kZS5jCkBAIC0yOTEsNyArMjkxLDcgQEAKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX2Jsa25vKSk7CiAKLQlpbm9kZS0+aV9ubGluayA9IG9jZnMyX3JlYWRfbGlua3NfY291bnQoZmUpOworCXNldF9ubGluayhpbm9kZSwgb2NmczJfcmVhZF9saW5rc19jb3VudChmZSkpOwogCiAJdHJhY2Vfb2NmczJfcG9wdWxhdGVfaW5vZGUoT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCQkJCSAgIGxlMzJfdG9fY3B1KGZlLT5pX2ZsYWdzKSk7CkBAIC0xMjkwLDcgKzEyOTAsNyBAQAogCU9DRlMyX0koaW5vZGUpLT5pcF9keW5fZmVhdHVyZXMgPSBsZTE2X3RvX2NwdShmZS0+aV9keW5fZmVhdHVyZXMpOwogCW9jZnMyX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CiAJaV9zaXplX3dyaXRlKGlub2RlLCBsZTY0X3RvX2NwdShmZS0+aV9zaXplKSk7Ci0JaW5vZGUtPmlfbmxpbmsgPSBvY2ZzMl9yZWFkX2xpbmtzX2NvdW50KGZlKTsKKwlzZXRfbmxpbmsoaW5vZGUsIG9jZnMyX3JlYWRfbGlua3NfY291bnQoZmUpKTsKIAlpbm9kZS0+aV91aWQgPSBsZTMyX3RvX2NwdShmZS0+aV91aWQpOwogCWlub2RlLT5pX2dpZCA9IGxlMzJfdG9fY3B1KGZlLT5pX2dpZCk7CiAJaW5vZGUtPmlfbW9kZSA9IGxlMTZfdG9fY3B1KGZlLT5pX21vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuYyBiL2ZzL29jZnMyL25hbWVpLmMKaW5kZXggNTNhYTQxZS4uYThiMmJmZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuYworKysgYi9mcy9vY2ZzMi9uYW1laS5jCkBAIC0xOTksOSArMTk5LDcgQEAKIAkgKiB0aGVzZSBhcmUgdXNlZCBieSB0aGUgc3VwcG9ydCBmdW5jdGlvbnMgaGVyZSBhbmQgaW4KIAkgKiBjYWxsZXJzLiAqLwogCWlmIChTX0lTRElSKG1vZGUpKQotCQlpbm9kZS0+aV9ubGluayA9IDI7Ci0JZWxzZQotCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCXNldF9ubGluayhpbm9kZSwgMik7CiAJaW5vZGVfaW5pdF9vd25lcihpbm9kZSwgZGlyLCBtb2RlKTsKIAlkcXVvdF9pbml0aWFsaXplKGlub2RlKTsKIAlyZXR1cm4gaW5vZGU7CkBAIC0xMzc5LDcgKzEzNzcsNyBAQAogCX0KIAogCWlmIChuZXdfaW5vZGUpIHsKLQkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCWRyb3BfbmxpbmsobmV3X2lub2RlKTsKIAkJbmV3X2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCX0KIAlvbGRfZGlyLT5pX2N0aW1lID0gb2xkX2Rpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKQEAgLTEzODcsOSArMTM4NSw5IEBACiAJaWYgKHVwZGF0ZV9kb3RfZG90KSB7CiAJCXN0YXR1cyA9IG9jZnMyX3VwZGF0ZV9lbnRyeShvbGRfaW5vZGUsIGhhbmRsZSwKIAkJCQkJICAgICZvbGRfaW5vZGVfZG90X2RvdF9yZXMsIG5ld19kaXIpOwotCQlvbGRfZGlyLT5pX25saW5rLS07CisJCWRyb3Bfbmxpbmsob2xkX2Rpcik7CiAJCWlmIChuZXdfaW5vZGUpIHsKLQkJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQkJZHJvcF9ubGluayhuZXdfaW5vZGUpOwogCQl9IGVsc2UgewogCQkJaW5jX25saW5rKG5ld19kaXIpOwogCQkJbWFya19pbm9kZV9kaXJ0eShuZXdfZGlyKTsKQEAgLTIwMTgsNyArMjAxNiw3IEBACiAJb3JwaGFuX2ZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgb3JwaGFuX2Rpcl9iaC0+Yl9kYXRhOwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlvY2ZzMl9hZGRfbGlua3NfY291bnQob3JwaGFuX2ZlLCAxKTsKLQlvcnBoYW5fZGlyX2lub2RlLT5pX25saW5rID0gb2NmczJfcmVhZF9saW5rc19jb3VudChvcnBoYW5fZmUpOworCXNldF9ubGluayhvcnBoYW5fZGlyX2lub2RlLCBvY2ZzMl9yZWFkX2xpbmtzX2NvdW50KG9ycGhhbl9mZSkpOwogCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBvcnBoYW5fZGlyX2JoKTsKIAogCXN0YXR1cyA9IF9fb2NmczJfYWRkX2VudHJ5KGhhbmRsZSwgb3JwaGFuX2Rpcl9pbm9kZSwgbmFtZSwKQEAgLTIxMTYsNyArMjExNCw3IEBACiAJb3JwaGFuX2ZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgb3JwaGFuX2Rpcl9iaC0+Yl9kYXRhOwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlvY2ZzMl9hZGRfbGlua3NfY291bnQob3JwaGFuX2ZlLCAtMSk7Ci0Jb3JwaGFuX2Rpcl9pbm9kZS0+aV9ubGluayA9IG9jZnMyX3JlYWRfbGlua3NfY291bnQob3JwaGFuX2ZlKTsKKwlzZXRfbmxpbmsob3JwaGFuX2Rpcl9pbm9kZSwgb2NmczJfcmVhZF9saW5rc19jb3VudChvcnBoYW5fZmUpKTsKIAlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgb3JwaGFuX2Rpcl9iaCk7CiAKIGxlYXZlOgpAQCAtMjI4Miw3ICsyMjgwLDcgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJY2xlYXJfbmxpbmsoaW5vZGUpOwogCS8qIGRvIHRoZSByZWFsIHdvcmsgbm93LiAqLwogCXN0YXR1cyA9IF9fb2NmczJfbWtub2RfbG9ja2VkKGRpciwgaW5vZGUsCiAJCQkJICAgICAgMCwgJm5ld19kaV9iaCwgcGFyZW50X2RpX2JoLCBoYW5kbGUsCkBAIC0yNDM3LDcgKzI0MzUsNyBAQAogCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOwogCWxlMzJfYWRkX2NwdSgmZGktPmlfZmxhZ3MsIC1PQ0ZTMl9PUlBIQU5FRF9GTCk7CiAJZGktPmlfb3JwaGFuZWRfc2xvdCA9IDA7Ci0JaW5vZGUtPmlfbmxpbmsgPSAxOworCXNldF9ubGluayhpbm9kZSwgMSk7CiAJb2NmczJfc2V0X2xpbmtzX2NvdW50KGRpLCBpbm9kZS0+aV9ubGluayk7CiAJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuaCBiL2ZzL29jZnMyL3N1cGVyLmgKaW5kZXggNDBjN2RlMC4uNzRmZjc0YyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuaAorKysgYi9mcy9vY2ZzMi9zdXBlci5oCkBAIC0zMSwxNyArMzEsMTUgQEAKIGludCBvY2ZzMl9wdWJsaXNoX2dldF9tb3VudF9zdGF0ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkgIGludCBub2RlX251bSk7CiAKLXZvaWQgX19vY2ZzMl9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkgICBjb25zdCBjaGFyICpmdW5jdGlvbiwKLQkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworX19wcmludGYoMywgNCkKK3ZvaWQgX19vY2ZzMl9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAjZGVmaW5lIG9jZnMyX2Vycm9yKHNiLCBmbXQsIGFyZ3MuLi4pIF9fb2NmczJfZXJyb3Ioc2IsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIGZtdCwgIyNhcmdzKQogCi12b2lkIF9fb2NmczJfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJICAgY29uc3QgY2hhciAqZnVuY3Rpb24sCi0JCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK19fcHJpbnRmKDMsIDQpCit2b2lkIF9fb2NmczJfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogI2RlZmluZSBvY2ZzMl9hYm9ydChzYiwgZm10LCBhcmdzLi4uKSBfX29jZnMyX2Fib3J0KHNiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBmbXQsICMjYXJncykKIApkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IGY3MTE5MjEuLjIyYzQxYjUgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTY4NSw2ICs2ODUsMTAgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gY2xlYW51cF9hbGw7CiAKKwllcnJvciA9IGJyZWFrX2xlYXNlKGlub2RlLCBmLT5mX2ZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cF9hbGw7CisKIAlpZiAoIW9wZW4gJiYgZi0+Zl9vcCkKIAkJb3BlbiA9IGYtPmZfb3AtPm9wZW47CiAJaWYgKG9wZW4pIHsKZGlmZiAtLWdpdCBhL2ZzL29wZW5wcm9tZnMvaW5vZGUuYyBiL2ZzL29wZW5wcm9tZnMvaW5vZGUuYwppbmRleCBhMmE1YmZmLi5lNGUwZmY3IDEwMDY0NAotLS0gYS9mcy9vcGVucHJvbWZzL2lub2RlLmMKKysrIGIvZnMvb3BlbnByb21mcy9pbm9kZS5jCkBAIC0yNDIsNyArMjQyLDcgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTzsKIAkJaW5vZGUtPmlfb3AgPSAmb3BlbnByb21faW5vZGVfb3BlcmF0aW9uczsKIAkJaW5vZGUtPmlfZm9wID0gJm9wZW5wcm9tX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX25saW5rID0gMjsKKwkJc2V0X25saW5rKGlub2RlLCAyKTsKIAkJYnJlYWs7CiAJY2FzZSBvcF9pbm9kZV9wcm9wOgogCQlpZiAoIXN0cmNtcChkcC0+bmFtZSwgIm9wdGlvbnMiKSAmJiAobGVuID09IDE3KSAmJgpAQCAtMjUxLDcgKzI1MSw3IEBACiAJCWVsc2UKIAkJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgU19JUlVHTzsKIAkJaW5vZGUtPmlfZm9wID0gJm9wZW5wcm9tZnNfcHJvcF9vcHM7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAkJaW5vZGUtPmlfc2l6ZSA9IGVudF9vaS0+dS5wcm9wLT5sZW5ndGg7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMgYi9mcy9wYXJ0aXRpb25zL2xkbS5jCmluZGV4IGFmOWZkZjAuLmJkOGFlNzggMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMKKysrIGIvZnMvcGFydGl0aW9ucy9sZG0uYwpAQCAtNDksMTggKzQ5LDIwIEBACiAjZGVmaW5lIGxkbV9lcnJvcihmLCBhLi4uKSBfbGRtX3ByaW50ayAoS0VSTl9FUlIsICAgX19mdW5jX18sIGYsICMjYSkKICNkZWZpbmUgbGRtX2luZm8oZiwgYS4uLikgIF9sZG1fcHJpbnRrIChLRVJOX0lORk8sICBfX2Z1bmNfXywgZiwgIyNhKQogCi1fX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKLXN0YXRpYyB2b2lkIF9sZG1fcHJpbnRrIChjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZnVuY3Rpb24sCi0JCQkgY29uc3QgY2hhciAqZm10LCAuLi4pCitzdGF0aWMgX19wcmludGYoMywgNCkKK3ZvaWQgX2xkbV9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLQlzdGF0aWMgY2hhciBidWZbMTI4XTsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydCAoYXJncywgZm10KTsKLQl2c25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCBmbXQsIGFyZ3MpOwotCXZhX2VuZCAoYXJncyk7CiAKLQlwcmludGsgKCIlcyVzKCk6ICVzXG4iLCBsZXZlbCwgZnVuY3Rpb24sIGJ1Zik7CisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXByaW50aygiJXMlcygpOiAlcFZcbiIsIGxldmVsLCBmdW5jdGlvbiwgJnZhZik7CisKKwl2YV9lbmQoYXJncyk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZnMvcGlwZS5jIGIvZnMvcGlwZS5jCmluZGV4IDBlMGJlMWQuLjQwNjVmMDcgMTAwNjQ0Ci0tLSBhL2ZzL3BpcGUuYworKysgYi9mcy9waXBlLmMKQEAgLTEyNTQsNiArMTI1NCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBwaXBlZnNfb3BzID0gewogCS5kZXN0cm95X2lub2RlID0gZnJlZV9pbm9kZV9ub25yY3UsCisJLnN0YXRmcyA9IHNpbXBsZV9zdGF0ZnMsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvcG9zaXhfYWNsLmMgYi9mcy9wb3NpeF9hY2wuYwppbmRleCAxMDAyN2I0Li5jZWE0NjIzIDEwMDY0NAotLS0gYS9mcy9wb3NpeF9hY2wuYworKysgYi9mcy9wb3NpeF9hY2wuYwpAQCAtMjE4LDYgKzIxOCw4IEBACiAJY29uc3Qgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZSwgKm1hc2tfb2JqOwogCWludCBmb3VuZCA9IDA7CiAKKwl3YW50ICY9IE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUMgfCBNQVlfTk9UX0JMT0NLOworCiAJRk9SRUFDSF9BQ0xfRU5UUlkocGEsIGFjbCwgcGUpIHsKICAgICAgICAgICAgICAgICBzd2l0Y2gocGEtPmVfdGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDTF9VU0VSX09CSjoKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggNWViMDIwNi4uODUxYmEzZCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTExMDcsMTMgKzExMDcsNiBAQAogCQlnb3RvIGVycl9zaWdoYW5kOwogCX0KIAotCWlmIChvb21fYWRqdXN0ICE9IHRhc2stPnNpZ25hbC0+b29tX2FkaikgewotCQlpZiAob29tX2FkanVzdCA9PSBPT01fRElTQUJMRSkKLQkJCWF0b21pY19pbmMoJnRhc2stPm1tLT5vb21fZGlzYWJsZV9jb3VudCk7Ci0JCWlmICh0YXNrLT5zaWduYWwtPm9vbV9hZGogPT0gT09NX0RJU0FCTEUpCi0JCQlhdG9taWNfZGVjKCZ0YXNrLT5tbS0+b29tX2Rpc2FibGVfY291bnQpOwotCX0KLQogCS8qCiAJICogV2FybiB0aGF0IC9wcm9jL3BpZC9vb21fYWRqIGlzIGRlcHJlY2F0ZWQsIHNlZQogCSAqIERvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dC4KQEAgLTEyMTUsMTIgKzEyMDgsNiBAQAogCQlnb3RvIGVycl9zaWdoYW5kOwogCX0KIAotCWlmIChvb21fc2NvcmVfYWRqICE9IHRhc2stPnNpZ25hbC0+b29tX3Njb3JlX2FkaikgewotCQlpZiAob29tX3Njb3JlX2FkaiA9PSBPT01fU0NPUkVfQURKX01JTikKLQkJCWF0b21pY19pbmMoJnRhc2stPm1tLT5vb21fZGlzYWJsZV9jb3VudCk7Ci0JCWlmICh0YXNrLT5zaWduYWwtPm9vbV9zY29yZV9hZGogPT0gT09NX1NDT1JFX0FESl9NSU4pCi0JCQlhdG9taWNfZGVjKCZ0YXNrLT5tbS0+b29tX2Rpc2FibGVfY291bnQpOwotCX0KIAl0YXNrLT5zaWduYWwtPm9vbV9zY29yZV9hZGogPSBvb21fc2NvcmVfYWRqOwogCWlmIChoYXNfY2FwYWJpbGl0eV9ub2F1ZGl0KGN1cnJlbnQsIENBUF9TWVNfUkVTT1VSQ0UpKQogCQl0YXNrLT5zaWduYWwtPm9vbV9zY29yZV9hZGpfbWluID0gb29tX3Njb3JlX2FkajsKQEAgLTIyNjEsNyArMjI0OCw3IEBACiAJZWkgPSBQUk9DX0koaW5vZGUpOwogCWlub2RlLT5pX21vZGUgPSBwLT5tb2RlOwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQotCQlpbm9kZS0+aV9ubGluayA9IDI7CS8qIFVzZSBnZXRhdHRyIHRvIGZpeCBpZiBuZWNlc3NhcnkgKi8KKwkJc2V0X25saW5rKGlub2RlLCAyKTsJLyogVXNlIGdldGF0dHIgdG8gZml4IGlmIG5lY2Vzc2FyeSAqLwogCWlmIChwLT5pb3ApCiAJCWlub2RlLT5pX29wID0gcC0+aW9wOwogCWlmIChwLT5mb3ApCkBAIC0yNjU1LDcgKzI2NDIsNyBAQAogCiAJaW5vZGUtPmlfbW9kZSA9IHAtPm1vZGU7CiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCWlub2RlLT5pX25saW5rID0gMjsKKwkJc2V0X25saW5rKGlub2RlLCAyKTsKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKIAkJaW5vZGUtPmlfc2l6ZSA9IDY0OwogCWlmIChwLT5pb3ApCkBAIC0yOTk0LDggKzI5ODEsOCBAQAogCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3RnaWRfYmFzZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZsYWdzfD1TX0lNTVVUQUJMRTsKIAotCWlub2RlLT5pX25saW5rID0gMiArIHBpZF9lbnRyeV9jb3VudF9kaXJzKHRnaWRfYmFzZV9zdHVmZiwKLQkJQVJSQVlfU0laRSh0Z2lkX2Jhc2Vfc3R1ZmYpKTsKKwlzZXRfbmxpbmsoaW5vZGUsIDIgKyBwaWRfZW50cnlfY291bnRfZGlycyh0Z2lkX2Jhc2Vfc3R1ZmYsCisJCQkJCQkgIEFSUkFZX1NJWkUodGdpZF9iYXNlX3N0dWZmKSkpOwogCiAJZF9zZXRfZF9vcChkZW50cnksICZwaWRfZGVudHJ5X29wZXJhdGlvbnMpOwogCkBAIC0zMjQ2LDggKzMyMzMsOCBAQAogCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3RpZF9iYXNlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZmxhZ3N8PVNfSU1NVVRBQkxFOwogCi0JaW5vZGUtPmlfbmxpbmsgPSAyICsgcGlkX2VudHJ5X2NvdW50X2RpcnModGlkX2Jhc2Vfc3R1ZmYsCi0JCUFSUkFZX1NJWkUodGlkX2Jhc2Vfc3R1ZmYpKTsKKwlzZXRfbmxpbmsoaW5vZGUsIDIgKyBwaWRfZW50cnlfY291bnRfZGlycyh0aWRfYmFzZV9zdHVmZiwKKwkJCQkJCSAgQVJSQVlfU0laRSh0aWRfYmFzZV9zdHVmZikpKTsKIAogCWRfc2V0X2Rfb3AoZGVudHJ5LCAmcGlkX2RlbnRyeV9vcGVyYXRpb25zKTsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9nZW5lcmljLmMgYi9mcy9wcm9jL2dlbmVyaWMuYwppbmRleCA5ZDk5MTMxLi4xMDA5MGQ5IDEwMDY0NAotLS0gYS9mcy9wcm9jL2dlbmVyaWMuYworKysgYi9mcy9wcm9jL2dlbmVyaWMuYwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gUFJPQ19JKGlub2RlKS0+cGRlOwogCWlmIChkZSAmJiBkZS0+bmxpbmspCi0JCWlub2RlLT5pX25saW5rID0gZGUtPm5saW5rOworCQlzZXRfbmxpbmsoaW5vZGUsIGRlLT5ubGluayk7CiAKIAlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW5vZGUuYyBiL2ZzL3Byb2MvaW5vZGUuYwppbmRleCA3ZWQ3MmQ2Li43NzM3YzU0IDEwMDY0NAotLS0gYS9mcy9wcm9jL2lub2RlLmMKKysrIGIvZnMvcHJvYy9pbm9kZS5jCkBAIC00NDUsNyArNDQ1LDcgQEAKIAkJaWYgKGRlLT5zaXplKQogCQkJaW5vZGUtPmlfc2l6ZSA9IGRlLT5zaXplOwogCQlpZiAoZGUtPm5saW5rKQotCQkJaW5vZGUtPmlfbmxpbmsgPSBkZS0+bmxpbms7CisJCQlzZXRfbmxpbmsoaW5vZGUsIGRlLT5ubGluayk7CiAJCWlmIChkZS0+cHJvY19pb3BzKQogCQkJaW5vZGUtPmlfb3AgPSBkZS0+cHJvY19pb3BzOwogCQlpZiAoZGUtPnByb2NfZm9wcykgewpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3N5c2N0bC5jIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCmluZGV4IDFhNzdkYmUuLmE2YjYyMTcgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYworKysgYi9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKQEAgLTMsNiArMyw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CkBAIC0xNCw2ICsxNSwxNSBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zeXNfZGlyX2ZpbGVfb3BlcmF0aW9uczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3N5c19kaXJfb3BlcmF0aW9uczsKIAordm9pZCBwcm9jX3N5c19wb2xsX25vdGlmeShzdHJ1Y3QgY3RsX3RhYmxlX3BvbGwgKnBvbGwpCit7CisJaWYgKCFwb2xsKQorCQlyZXR1cm47CisKKwlhdG9taWNfaW5jKCZwb2xsLT5ldmVudCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb2xsLT53YWl0KTsKK30KKwogc3RhdGljIHN0cnVjdCBpbm9kZSAqcHJvY19zeXNfbWFrZV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZCwgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpCiB7CkBAIC0zOSw3ICs0OSw3IEBACiAJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3N5c19maWxlX29wZXJhdGlvbnM7CiAJfSBlbHNlIHsKIAkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOwotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJaW5vZGUtPmlfb3AgPSAmcHJvY19zeXNfZGlyX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3N5c19kaXJfZmlsZV9vcGVyYXRpb25zOwogCX0KQEAgLTE3Niw2ICsxODYsMzkgQEAKIAlyZXR1cm4gcHJvY19zeXNfY2FsbF9oYW5kbGVyKGZpbHAsICh2b2lkIF9fdXNlciAqKWJ1ZiwgY291bnQsIHBwb3MsIDEpOwogfQogCitzdGF0aWMgaW50IHByb2Nfc3lzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGN0bF90YWJsZSAqdGFibGUgPSBQUk9DX0koaW5vZGUpLT5zeXNjdGxfZW50cnk7CisKKwlpZiAodGFibGUtPnBvbGwpCisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHByb2Nfc3lzX3BvbGxfZXZlbnQodGFibGUtPnBvbGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJvY19zeXNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSA9IFBST0NfSShpbm9kZSktPnN5c2N0bF9lbnRyeTsKKwl1bnNpZ25lZCBsb25nIGV2ZW50ID0gKHVuc2lnbmVkIGxvbmcpZmlscC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCByZXQgPSBERUZBVUxUX1BPTExNQVNLOworCisJaWYgKCF0YWJsZS0+cHJvY19oYW5kbGVyKQorCQlnb3RvIG91dDsKKworCWlmICghdGFibGUtPnBvbGwpCisJCWdvdG8gb3V0OworCisJcG9sbF93YWl0KGZpbHAsICZ0YWJsZS0+cG9sbC0+d2FpdCwgd2FpdCk7CisKKwlpZiAoZXZlbnQgIT0gYXRvbWljX3JlYWQoJnRhYmxlLT5wb2xsLT5ldmVudCkpIHsKKwkJZmlscC0+cHJpdmF0ZV9kYXRhID0gcHJvY19zeXNfcG9sbF9ldmVudCh0YWJsZS0+cG9sbCk7CisJCXJldCA9IFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMRVJSIHwgUE9MTFBSSTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQogCiBzdGF0aWMgaW50IHByb2Nfc3lzX2ZpbGxfY2FjaGUoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwKIAkJCQlmaWxsZGlyX3QgZmlsbGRpciwKQEAgLTM2NCwxMiArNDA3LDE1IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3lzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBwcm9jX3N5c19vcGVuLAorCS5wb2xsCQk9IHByb2Nfc3lzX3BvbGwsCiAJLnJlYWQJCT0gcHJvY19zeXNfcmVhZCwKIAkud3JpdGUJCT0gcHJvY19zeXNfd3JpdGUsCiAJLmxsc2VlawkJPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3lzX2Rpcl9maWxlX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKIAkucmVhZGRpcgk9IHByb2Nfc3lzX3JlYWRkaXIsCiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19tbXUuYyBiL2ZzL3Byb2MvdGFza19tbXUuYwppbmRleCA1YWZhYTU4Li5lNDE4YzVhIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Rhc2tfbW11LmMKKysrIGIvZnMvcHJvYy90YXNrX21tdS5jCkBAIC00NCw2ICs0NCw3IEBACiAJCSJWbVBlYWs6XHQlOGx1IGtCXG4iCiAJCSJWbVNpemU6XHQlOGx1IGtCXG4iCiAJCSJWbUxjazpcdCU4bHUga0JcbiIKKwkJIlZtUGluOlx0JThsdSBrQlxuIgogCQkiVm1IV006XHQlOGx1IGtCXG4iCiAJCSJWbVJTUzpcdCU4bHUga0JcbiIKIAkJIlZtRGF0YTpcdCU4bHUga0JcbiIKQEAgLTU1LDYgKzU2LDcgQEAKIAkJaGl3YXRlcl92bSA8PCAoUEFHRV9TSElGVC0xMCksCiAJCSh0b3RhbF92bSAtIG1tLT5yZXNlcnZlZF92bSkgPDwgKFBBR0VfU0hJRlQtMTApLAogCQltbS0+bG9ja2VkX3ZtIDw8IChQQUdFX1NISUZULTEwKSwKKwkJbW0tPnBpbm5lZF92bSA8PCAoUEFHRV9TSElGVC0xMCksCiAJCWhpd2F0ZXJfcnNzIDw8IChQQUdFX1NISUZULTEwKSwKIAkJdG90YWxfcnNzIDw8IChQQUdFX1NISUZULTEwKSwKIAkJZGF0YSA8PCAoUEFHRV9TSElGVC0xMCksCkBAIC0xMDM5LDYgKzEwNDEsOSBAQAogCQlzZXFfcHJpbnRmKG0sICIgc3RhY2siKTsKIAl9CiAKKwlpZiAoaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpCisJCXNlcV9wcmludGYobSwgIiBodWdlIik7CisKIAl3YWxrX3BhZ2VfcmFuZ2Uodm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsICZ3YWxrKTsKIAogCWlmICghbWQtPnBhZ2VzKQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy92bWNvcmUuYyBiL2ZzL3Byb2Mvdm1jb3JlLmMKaW5kZXggY2Q5OWJmNS4uYjBmNDUwYSAxMDA2NDQKLS0tIGEvZnMvcHJvYy92bWNvcmUuYworKysgYi9mcy9wcm9jL3ZtY29yZS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KZGlmZiAtLWdpdCBhL2ZzL3BzdG9yZS9pbm9kZS5jIGIvZnMvcHN0b3JlL2lub2RlLmMKaW5kZXggODkzYjk2MS4uMzc5YTAyZCAxMDA2NDQKLS0tIGEvZnMvcHN0b3JlL2lub2RlLmMKKysrIGIvZnMvcHN0b3JlL2lub2RlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9yYW1mcy5oPgpAQCAtMzIsMTMgKzMzLDE4IEBACiAjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KICNpbmNsdWRlIDxsaW51eC9wc3RvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjZGVmaW5lCVBTVE9SRV9OQU1FTEVOCTY0CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWxscHN0b3JlX2xvY2spOworc3RhdGljIExJU1RfSEVBRChhbGxwc3RvcmUpOworCiBzdHJ1Y3QgcHN0b3JlX3ByaXZhdGUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaTsKIAllbnVtIHBzdG9yZV90eXBlX2lkIHR5cGU7CiAJdTY0CWlkOwpAQCAtODEsOCArODcsMTYgQEAKIAogc3RhdGljIHZvaWQgcHN0b3JlX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJc3RydWN0IHBzdG9yZV9wcml2YXRlCSpwID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwogCWVuZF93cml0ZWJhY2soaW5vZGUpOwotCWtmcmVlKGlub2RlLT5pX3ByaXZhdGUpOworCWlmIChwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhbGxwc3RvcmVfbG9jaywgZmxhZ3MpOworCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFsbHBzdG9yZV9sb2NrLCBmbGFncyk7CisJCWtmcmVlKHApOworCX0KIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHBzdG9yZV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKQEAgLTE4Miw5ICsxOTYsMjMgQEAKIAlzdHJ1Y3QgZGVudHJ5CQkqcm9vdCA9IHBzdG9yZV9zYi0+c19yb290OwogCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CiAJc3RydWN0IGlub2RlCQkqaW5vZGU7Ci0JaW50CQkJcmM7CisJaW50CQkJcmMgPSAwOwogCWNoYXIJCQluYW1lW1BTVE9SRV9OQU1FTEVOXTsKLQlzdHJ1Y3QgcHN0b3JlX3ByaXZhdGUJKnByaXZhdGU7CisJc3RydWN0IHBzdG9yZV9wcml2YXRlCSpwcml2YXRlLCAqcG9zOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFsbHBzdG9yZV9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZhbGxwc3RvcmUsIGxpc3QpIHsKKwkJaWYgKHBvcy0+dHlwZSA9PSB0eXBlICYmCisJCSAgICBwb3MtPmlkID09IGlkICYmCisJCSAgICBwb3MtPnBzaSA9PSBwc2kpIHsKKwkJCXJjID0gLUVFWElTVDsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFsbHBzdG9yZV9sb2NrLCBmbGFncyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlyYyA9IC1FTk9NRU07CiAJaW5vZGUgPSBwc3RvcmVfZ2V0X2lub2RlKHBzdG9yZV9zYiwgcm9vdC0+ZF9pbm9kZSwgU19JRlJFRyB8IDA0NDQsIDApOwpAQCAtMjI5LDYgKzI1NywxMCBAQAogCiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWxscHN0b3JlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmcHJpdmF0ZS0+bGlzdCwgJmFsbHBzdG9yZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWxscHN0b3JlX2xvY2ssIGZsYWdzKTsKKwogCW11dGV4X3VubG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTI3Nyw3ICszMDksNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JcHN0b3JlX2dldF9yZWNvcmRzKCk7CisJcHN0b3JlX2dldF9yZWNvcmRzKDApOwogCiAJcmV0dXJuIDA7CiBmYWlsOgpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL2ludGVybmFsLmggYi9mcy9wc3RvcmUvaW50ZXJuYWwuaAppbmRleCA2MTFjMWIzLi4zYmRlNDYxIDEwMDY0NAotLS0gYS9mcy9wc3RvcmUvaW50ZXJuYWwuaAorKysgYi9mcy9wc3RvcmUvaW50ZXJuYWwuaApAQCAtMSw1ICsxLDUgQEAKIGV4dGVybiB2b2lkCXBzdG9yZV9zZXRfa21zZ19ieXRlcyhpbnQpOwotZXh0ZXJuIHZvaWQJcHN0b3JlX2dldF9yZWNvcmRzKHZvaWQpOworZXh0ZXJuIHZvaWQJcHN0b3JlX2dldF9yZWNvcmRzKGludCk7CiBleHRlcm4gaW50CXBzdG9yZV9ta2ZpbGUoZW51bSBwc3RvcmVfdHlwZV9pZCwgY2hhciAqcHNuYW1lLCB1NjQgaWQsCiAJCQkgICAgICBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwKIAkJCSAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CmRpZmYgLS1naXQgYS9mcy9wc3RvcmUvcGxhdGZvcm0uYyBiL2ZzL3BzdG9yZS9wbGF0Zm9ybS5jCmluZGV4IGM1MzAwZWMuLjJiZDYyMGYgMTAwNjQ0Ci0tLSBhL2ZzL3BzdG9yZS9wbGF0Zm9ybS5jCisrKyBiL2ZzL3BzdG9yZS9wbGF0Zm9ybS5jCkBAIC0yNSwxMiArMjUsMzAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wc3RvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyoKKyAqIFdlIGRlZmVyIG1ha2luZyAib29wcyIgZW50cmllcyBhcHBlYXIgaW4gcHN0b3JlIC0gc2VlCisgKiB3aGV0aGVyIHRoZSBzeXN0ZW0gaXMgYWN0dWFsbHkgc3RpbGwgcnVubmluZyB3ZWxsIGVub3VnaAorICogdG8gbGV0IHNvbWVvbmUgc2VlIHRoZSBlbnRyeQorICovCisjZGVmaW5lCVBTVE9SRV9JTlRFUlZBTAkoNjAgKiBIWikKKworc3RhdGljIGludCBwc3RvcmVfbmV3X2VudHJ5OworCitzdGF0aWMgdm9pZCBwc3RvcmVfdGltZWZ1bmModW5zaWduZWQgbG9uZyk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHBzdG9yZV90aW1lciwgcHN0b3JlX3RpbWVmdW5jLCAwLCAwKTsKKworc3RhdGljIHZvaWQgcHN0b3JlX2Rvd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgREVDTEFSRV9XT1JLKHBzdG9yZV93b3JrLCBwc3RvcmVfZG93b3JrKTsKKworLyoKICAqIHBzdG9yZV9sb2NrIGp1c3QgcHJvdGVjdHMgInBzaW5mbyIgZHVyaW5nCiAgKiBjYWxscyB0byBwc3RvcmVfcmVnaXN0ZXIoKQogICovCkBAIC02OSwxNSArODcsMjIgQEAKIAl1bnNpZ25lZCBsb25nCXNpemUsIHRvdGFsID0gMDsKIAljaGFyCQkqZHN0LCAqd2h5OwogCXU2NAkJaWQ7Ci0JaW50CQloc2l6ZTsKKwlpbnQJCWhzaXplLCByZXQ7CiAJdW5zaWduZWQgaW50CXBhcnQgPSAxOworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCWludAkJaXNfbG9ja2VkID0gMDsKIAogCWlmIChyZWFzb24gPCBBUlJBWV9TSVpFKHJlYXNvbl9zdHIpKQogCQl3aHkgPSByZWFzb25fc3RyW3JlYXNvbl07CiAJZWxzZQogCQl3aHkgPSAiVW5rbm93biI7CiAKLQltdXRleF9sb2NrKCZwc2luZm8tPmJ1Zl9tdXRleCk7CisJaWYgKGluX25taSgpKSB7CisJCWlzX2xvY2tlZCA9IHNwaW5fdHJ5bG9jaygmcHNpbmZvLT5idWZfbG9jayk7CisJCWlmICghaXNfbG9ja2VkKQorCQkJcHJfZXJyKCJwc3RvcmUgZHVtcCByb3V0aW5lIGJsb2NrZWQgaW4gTk1JLCBtYXkgY29ycnVwdCBlcnJvciByZWNvcmRcbiIpOworCX0gZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHNpbmZvLT5idWZfbG9jaywgZmxhZ3MpOwogCW9vcHNjb3VudCsrOwogCXdoaWxlICh0b3RhbCA8IGttc2dfYnl0ZXMpIHsKIAkJZHN0ID0gcHNpbmZvLT5idWY7CkBAIC05NywxOCArMTIyLDIwIEBACiAJCW1lbWNweShkc3QsIHMxICsgczFfc3RhcnQsIGwxX2NweSk7CiAJCW1lbWNweShkc3QgKyBsMV9jcHksIHMyICsgczJfc3RhcnQsIGwyX2NweSk7CiAKLQkJaWQgPSBwc2luZm8tPndyaXRlKFBTVE9SRV9UWVBFX0RNRVNHLCBwYXJ0LAorCQlyZXQgPSBwc2luZm8tPndyaXRlKFBTVE9SRV9UWVBFX0RNRVNHLCAmaWQsIHBhcnQsCiAJCQkJICAgaHNpemUgKyBsMV9jcHkgKyBsMl9jcHksIHBzaW5mbyk7Ci0JCWlmIChyZWFzb24gPT0gS01TR19EVU1QX09PUFMgJiYgcHN0b3JlX2lzX21vdW50ZWQoKSkKLQkJCXBzdG9yZV9ta2ZpbGUoUFNUT1JFX1RZUEVfRE1FU0csIHBzaW5mby0+bmFtZSwgaWQsCi0JCQkJICAgICAgcHNpbmZvLT5idWYsIGhzaXplICsgbDFfY3B5ICsgbDJfY3B5LAotCQkJCSAgICAgIENVUlJFTlRfVElNRSwgcHNpbmZvKTsKKwkJaWYgKHJldCA9PSAwICYmIHJlYXNvbiA9PSBLTVNHX0RVTVBfT09QUyAmJiBwc3RvcmVfaXNfbW91bnRlZCgpKQorCQkJcHN0b3JlX25ld19lbnRyeSA9IDE7CiAJCWwxIC09IGwxX2NweTsKIAkJbDIgLT0gbDJfY3B5OwogCQl0b3RhbCArPSBsMV9jcHkgKyBsMl9jcHk7CiAJCXBhcnQrKzsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZwc2luZm8tPmJ1Zl9tdXRleCk7CisJaWYgKGluX25taSgpKSB7CisJCWlmIChpc19sb2NrZWQpCisJCQlzcGluX3VubG9jaygmcHNpbmZvLT5idWZfbG9jayk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBrbXNnX2R1bXBlciBwc3RvcmVfZHVtcGVyID0gewpAQCAtMTQ4LDE5ICsxNzUsMjQgQEAKIAl9CiAKIAlpZiAocHN0b3JlX2lzX21vdW50ZWQoKSkKLQkJcHN0b3JlX2dldF9yZWNvcmRzKCk7CisJCXBzdG9yZV9nZXRfcmVjb3JkcygwKTsKIAogCWttc2dfZHVtcF9yZWdpc3RlcigmcHN0b3JlX2R1bXBlcik7CiAKKwlwc3RvcmVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQU1RPUkVfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZwc3RvcmVfdGltZXIpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwc3RvcmVfcmVnaXN0ZXIpOwogCiAvKgotICogUmVhZCBhbGwgdGhlIHJlY29yZHMgZnJvbSB0aGUgcGVyc2lzdGVudCBzdG9yZS4gQ3JlYXRlIGFuZAotICogZmlsZSBmaWxlcyBpbiBvdXIgZmlsZXN5c3RlbS4KKyAqIFJlYWQgYWxsIHRoZSByZWNvcmRzIGZyb20gdGhlIHBlcnNpc3RlbnQgc3RvcmUuIENyZWF0ZQorICogZmlsZXMgaW4gb3VyIGZpbGVzeXN0ZW0uICBEb24ndCB3YXJuIGFib3V0IC1FRVhJU1QgZXJyb3JzCisgKiB3aGVuIHdlIGFyZSByZS1zY2FubmluZyB0aGUgYmFja2luZyBzdG9yZSBsb29raW5nIHRvIGFkZCBuZXcKKyAqIGVycm9yIHJlY29yZHMuCiAgKi8KLXZvaWQgcHN0b3JlX2dldF9yZWNvcmRzKHZvaWQpCit2b2lkIHBzdG9yZV9nZXRfcmVjb3JkcyhpbnQgcXVpZXQpCiB7CiAJc3RydWN0IHBzdG9yZV9pbmZvICpwc2kgPSBwc2luZm87CiAJc3NpemVfdAkJCXNpemU7CkBAIC0xNjgsMzYgKzIwMCw1NSBAQAogCWVudW0gcHN0b3JlX3R5cGVfaWQJdHlwZTsKIAlzdHJ1Y3QgdGltZXNwZWMJCXRpbWU7CiAJaW50CQkJZmFpbGVkID0gMCwgcmM7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAlpZiAoIXBzaSkKIAkJcmV0dXJuOwogCi0JbXV0ZXhfbG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwc2luZm8tPmJ1Zl9sb2NrLCBmbGFncyk7CiAJcmMgPSBwc2ktPm9wZW4ocHNpKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwogCiAJd2hpbGUgKChzaXplID0gcHNpLT5yZWFkKCZpZCwgJnR5cGUsICZ0aW1lLCBwc2kpKSA+IDApIHsKLQkJaWYgKHBzdG9yZV9ta2ZpbGUodHlwZSwgcHNpLT5uYW1lLCBpZCwgcHNpLT5idWYsIChzaXplX3Qpc2l6ZSwKLQkJCQkgIHRpbWUsIHBzaSkpCisJCXJjID0gcHN0b3JlX21rZmlsZSh0eXBlLCBwc2ktPm5hbWUsIGlkLCBwc2ktPmJ1ZiwgKHNpemVfdClzaXplLAorCQkJCSAgdGltZSwgcHNpKTsKKwkJaWYgKHJjICYmIChyYyAhPSAtRUVYSVNUIHx8ICFxdWlldCkpCiAJCQlmYWlsZWQrKzsKIAl9CiAJcHNpLT5jbG9zZShwc2kpOwogb3V0OgotCW11dGV4X3VubG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKIAogCWlmIChmYWlsZWQpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzdG9yZTogZmFpbGVkIHRvIGxvYWQgJWQgcmVjb3JkKHMpIGZyb20gJyVzJ1xuIiwKIAkJICAgICAgIGZhaWxlZCwgcHNpLT5uYW1lKTsKIH0KIAorc3RhdGljIHZvaWQgcHN0b3JlX2Rvd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJcHN0b3JlX2dldF9yZWNvcmRzKDEpOworfQorCitzdGF0aWMgdm9pZCBwc3RvcmVfdGltZWZ1bmModW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlpZiAocHN0b3JlX25ld19lbnRyeSkgeworCQlwc3RvcmVfbmV3X2VudHJ5ID0gMDsKKwkJc2NoZWR1bGVfd29yaygmcHN0b3JlX3dvcmspOworCX0KKworCW1vZF90aW1lcigmcHN0b3JlX3RpbWVyLCBqaWZmaWVzICsgUFNUT1JFX0lOVEVSVkFMKTsKK30KKwogLyoKICAqIENhbGwgcGxhdGZvcm0gZHJpdmVyIHRvIHdyaXRlIGEgcmVjb3JkIHRvIHRoZQogICogcGVyc2lzdGVudCBzdG9yZS4KICAqLwogaW50IHBzdG9yZV93cml0ZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JdTY0CWlkOworCXU2NAkJaWQ7CisJaW50CQlyZXQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKIAogCWlmICghcHNpbmZvKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTIwNSwxMyArMjU2LDEzIEBACiAJaWYgKHNpemUgPiBwc2luZm8tPmJ1ZnNpemUpCiAJCXJldHVybiAtRUZCSUc7CiAKLQltdXRleF9sb2NrKCZwc2luZm8tPmJ1Zl9tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKIAltZW1jcHkocHNpbmZvLT5idWYsIGJ1Ziwgc2l6ZSk7Ci0JaWQgPSBwc2luZm8tPndyaXRlKHR5cGUsIDAsIHNpemUsIHBzaW5mbyk7Ci0JaWYgKHBzdG9yZV9pc19tb3VudGVkKCkpCisJcmV0ID0gcHNpbmZvLT53cml0ZSh0eXBlLCAmaWQsIDAsIHNpemUsIHBzaW5mbyk7CisJaWYgKHJldCA9PSAwICYmIHBzdG9yZV9pc19tb3VudGVkKCkpCiAJCXBzdG9yZV9ta2ZpbGUoUFNUT1JFX1RZUEVfRE1FU0csIHBzaW5mby0+bmFtZSwgaWQsIHBzaW5mby0+YnVmLAogCQkJICAgICAgc2l6ZSwgQ1VSUkVOVF9USU1FLCBwc2luZm8pOwotCW11dGV4X3VubG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvcW54NC9pbm9kZS5jIGIvZnMvcW54NC9pbm9kZS5jCmluZGV4IDJiMDY0NjYuLjNiZGQyMTQgMTAwNjQ0Ci0tLSBhL2ZzL3FueDQvaW5vZGUuYworKysgYi9mcy9xbng0L2lub2RlLmMKQEAgLTM3OSw3ICszNzksNyBAQAogCWlub2RlLT5pX21vZGUgICAgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmRpX21vZGUpOwogCWlub2RlLT5pX3VpZCAgICAgPSAodWlkX3QpbGUxNl90b19jcHUocmF3X2lub2RlLT5kaV91aWQpOwogCWlub2RlLT5pX2dpZCAgICAgPSAoZ2lkX3QpbGUxNl90b19jcHUocmF3X2lub2RlLT5kaV9naWQpOwotCWlub2RlLT5pX25saW5rICAgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmRpX25saW5rKTsKKwlzZXRfbmxpbmsoaW5vZGUsIGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+ZGlfbmxpbmspKTsKIAlpbm9kZS0+aV9zaXplICAgID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5kaV9zaXplKTsKIAlpbm9kZS0+aV9tdGltZS50dl9zZWMgICA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+ZGlfbXRpbWUpOwogCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvcXVvdGEuYyBiL2ZzL3F1b3RhL3F1b3RhLmMKaW5kZXggMTBiNmJlMy4uMzVmNGIwZSAxMDA2NDQKLS0tIGEvZnMvcXVvdGEvcXVvdGEuYworKysgYi9mcy9xdW90YS9xdW90YS5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAkJLyogY2FsbGVyIGFscmVhZHkgaG9sZHMgc191bW91bnQgKi8KIAkJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQogCQkJcmV0dXJuIC1FUk9GUzsKLQkJd3JpdGViYWNrX2lub2Rlc19zYihzYik7CisJCXdyaXRlYmFja19pbm9kZXNfc2Ioc2IsIFdCX1JFQVNPTl9TWU5DKTsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNjMsMTIgKzM2MywxNSBAQAogCX0KIAogCXNiID0gcXVvdGFjdGxfYmxvY2soc3BlY2lhbCk7Ci0JaWYgKElTX0VSUihzYikpCi0JCXJldHVybiBQVFJfRVJSKHNiKTsKKwlpZiAoSVNfRVJSKHNiKSkgeworCQlyZXQgPSBQVFJfRVJSKHNiKTsKKwkJZ290byBvdXQ7CisJfQogCiAJcmV0ID0gZG9fcXVvdGFjdGwoc2IsIHR5cGUsIGNtZHMsIGlkLCBhZGRyLCBwYXRocCk7CiAKIAlkcm9wX3N1cGVyKHNiKTsKK291dDoKIAlpZiAocGF0aHAgJiYgIUlTX0VSUihwYXRocCkpCiAJCXBhdGhfcHV0KHBhdGhwKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvaW5vZGUuYyBiL2ZzL3JhbWZzL2lub2RlLmMKaW5kZXggZWFjYjE2Ni4uNDYyY2ViMyAxMDA2NDQKLS0tIGEvZnMvcmFtZnMvaW5vZGUuYworKysgYi9mcy9yYW1mcy9pbm9kZS5jCkBAIC0yMyw3ICsyMyw2IEBACiAgKiBjYWNoZXMgaXMgc3VmZmljaWVudC4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgpAQCAtMjg4LDE0ICsyODcsNyBAQAogewogCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZyYW1mc19mc190eXBlKTsKIH0KLQotc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmFtZnNfZnModm9pZCkKLXsKLQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJhbWZzX2ZzX3R5cGUpOwotfQotCiBtb2R1bGVfaW5pdChpbml0X3JhbWZzX2ZzKQotbW9kdWxlX2V4aXQoZXhpdF9yYW1mc19mcykKIAogaW50IF9faW5pdCBpbml0X3Jvb3Rmcyh2b2lkKQogewpAQCAtMzExLDUgKzMwMywzIEBACiAKIAlyZXR1cm4gZXJyOwogfQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9yZWFkX3dyaXRlLmMgYi9mcy9yZWFkX3dyaXRlLmMKaW5kZXggMTc5ZjFjMy4uNWFkNDI0OCAxMDA2NDQKLS0tIGEvZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL3JlYWRfd3JpdGUuYwpAQCAtMzUsMjMgKzM1LDQ1IEBACiAJcmV0dXJuIGZpbGUtPmZfbW9kZSAmIEZNT0RFX1VOU0lHTkVEX09GRlNFVDsKIH0KIAorc3RhdGljIGxvZmZfdCBsc2Vla19leGVjdXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQlsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbWF4c2l6ZSkKK3sKKwlpZiAob2Zmc2V0IDwgMCAmJiAhdW5zaWduZWRfb2Zmc2V0cyhmaWxlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG9mZnNldCA+IG1heHNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgeworCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJZmlsZS0+Zl92ZXJzaW9uID0gMDsKKwl9CisJcmV0dXJuIG9mZnNldDsKK30KKwogLyoqCi0gKiBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkIC0gbG9ja2xlc3MgZ2VuZXJpYyBsbHNlZWsgaW1wbGVtZW50YXRpb24KKyAqIGdlbmVyaWNfZmlsZV9sbHNlZWtfc2l6ZSAtIGdlbmVyaWMgbGxzZWVrIGltcGxlbWVudGF0aW9uIGZvciByZWd1bGFyIGZpbGVzCiAgKiBAZmlsZToJZmlsZSBzdHJ1Y3R1cmUgdG8gc2VlayBvbgogICogQG9mZnNldDoJZmlsZSBvZmZzZXQgdG8gc2VlayB0bwogICogQG9yaWdpbjoJdHlwZSBvZiBzZWVrCisgKiBAc2l6ZToJbWF4IHNpemUgb2YgZmlsZSBzeXN0ZW0KICAqCi0gKiBVcGRhdGVzIHRoZSBmaWxlIG9mZnNldCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IEBvZmZzZXQgYW5kIEBvcmlnaW4uCi0gKiBMb2NraW5nIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KKyAqIFRoaXMgaXMgYSB2YXJpYW50IG9mIGdlbmVyaWNfZmlsZV9sbHNlZWsgdGhhdCBhbGxvd3MgcGFzc2luZyBpbiBhIGN1c3RvbQorICogZmlsZSBzaXplLgorICoKKyAqIFN5bmNocm9uaXphdGlvbjoKKyAqIFNFRUtfU0VUIGFuZCBTRUVLX0VORCBhcmUgdW5zeW5jaHJvbml6ZWQgKGJ1dCBhdG9taWMgb24gNjRiaXQgcGxhdGZvcm1zKQorICogU0VFS19DVVIgaXMgc3luY2hyb25pemVkIGFnYWluc3Qgb3RoZXIgU0VFS19DVVJzLCBidXQgbm90IHJlYWQvd3JpdGVzLgorICogcmVhZC93cml0ZXMgYmVoYXZlIGxpa2UgU0VFS19TRVQgYWdhaW5zdCBzZWVrcy4KICAqLwogbG9mZl90Ci1nZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQorZ2VuZXJpY19maWxlX2xsc2Vla19zaXplKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luLAorCQlsb2ZmX3QgbWF4c2l6ZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCiAJc3dpdGNoIChvcmlnaW4pIHsKIAljYXNlIFNFRUtfRU5EOgotCQlvZmZzZXQgKz0gaW5vZGUtPmlfc2l6ZTsKKwkJb2Zmc2V0ICs9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJYnJlYWs7CiAJY2FzZSBTRUVLX0NVUjoKIAkJLyoKQEAgLTYyLDE0ICs4NCwyMiBAQAogCQkgKi8KIAkJaWYgKG9mZnNldCA9PSAwKQogCQkJcmV0dXJuIGZpbGUtPmZfcG9zOwotCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7Ci0JCWJyZWFrOworCQkvKgorCQkgKiBmX2xvY2sgcHJvdGVjdHMgYWdhaW5zdCByZWFkL21vZGlmeS93cml0ZSByYWNlIHdpdGggb3RoZXIKKwkJICogU0VFS19DVVJzLiBOb3RlIHRoYXQgcGFyYWxsZWwgd3JpdGVzIGFuZCByZWFkcyBiZWhhdmUKKwkJICogbGlrZSBTRUVLX1NFVC4KKwkJICovCisJCXNwaW5fbG9jaygmZmlsZS0+Zl9sb2NrKTsKKwkJb2Zmc2V0ID0gbHNlZWtfZXhlY3V0ZShmaWxlLCBpbm9kZSwgZmlsZS0+Zl9wb3MgKyBvZmZzZXQsCisJCQkJICAgICAgIG1heHNpemUpOworCQlzcGluX3VubG9jaygmZmlsZS0+Zl9sb2NrKTsKKwkJcmV0dXJuIG9mZnNldDsKIAljYXNlIFNFRUtfREFUQToKIAkJLyoKIAkJICogSW4gdGhlIGdlbmVyaWMgY2FzZSB0aGUgZW50aXJlIGZpbGUgaXMgZGF0YSwgc28gYXMgbG9uZyBhcwogCQkgKiBvZmZzZXQgaXNuJ3QgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0aGVuIHRoZSBvZmZzZXQgaXMgZGF0YS4KIAkJICovCi0JCWlmIChvZmZzZXQgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJaWYgKG9mZnNldCA+PSBpX3NpemVfcmVhZChpbm9kZSkpCiAJCQlyZXR1cm4gLUVOWElPOwogCQlicmVhazsKIAljYXNlIFNFRUtfSE9MRToKQEAgLTc3LDI2ICsxMDcsMTUgQEAKIAkJICogVGhlcmUgaXMgYSB2aXJ0dWFsIGhvbGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgc28gYXMgbG9uZyBhcwogCQkgKiBvZmZzZXQgaXNuJ3QgaV9zaXplIG9yIGxhcmdlciwgcmV0dXJuIGlfc2l6ZS4KIAkJICovCi0JCWlmIChvZmZzZXQgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJaWYgKG9mZnNldCA+PSBpX3NpemVfcmVhZChpbm9kZSkpCiAJCQlyZXR1cm4gLUVOWElPOwotCQlvZmZzZXQgPSBpbm9kZS0+aV9zaXplOworCQlvZmZzZXQgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJCWJyZWFrOwogCX0KIAotCWlmIChvZmZzZXQgPCAwICYmICF1bnNpZ25lZF9vZmZzZXRzKGZpbGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAob2Zmc2V0ID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogU3BlY2lhbCBsb2NrIG5lZWRlZCBoZXJlPyAqLwotCWlmIChvZmZzZXQgIT0gZmlsZS0+Zl9wb3MpIHsKLQkJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7Ci0JCWZpbGUtPmZfdmVyc2lvbiA9IDA7Ci0JfQotCi0JcmV0dXJuIG9mZnNldDsKKwlyZXR1cm4gbHNlZWtfZXhlY3V0ZShmaWxlLCBpbm9kZSwgb2Zmc2V0LCBtYXhzaXplKTsKIH0KLUVYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX2xsc2Vla191bmxvY2tlZCk7CitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmlsZV9sbHNlZWtfc2l6ZSk7CiAKIC8qKgogICogZ2VuZXJpY19maWxlX2xsc2VlayAtIGdlbmVyaWMgbGxzZWVrIGltcGxlbWVudGF0aW9uIGZvciByZWd1bGFyIGZpbGVzCkBAIC0xMTAsMTMgKzEyOSwxMCBAQAogICovCiBsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKIHsKLQlsb2ZmX3QgcnZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCi0JbXV0ZXhfbG9jaygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwotCXJ2YWwgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKLQltdXRleF91bmxvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKLQotCXJldHVybiBydmFsOworCXJldHVybiBnZW5lcmljX2ZpbGVfbGxzZWVrX3NpemUoZmlsZSwgb2Zmc2V0LCBvcmlnaW4sCisJCQkJCWlub2RlLT5pX3NiLT5zX21heGJ5dGVzKTsKIH0KIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX2xsc2Vlayk7CiAKQEAgLTYxNyw3ICs2MzMsOCBAQAogc3NpemVfdCByd19jb3B5X2NoZWNrX3V2ZWN0b3IoaW50IHR5cGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKiB1dmVjdG9yLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCB1bnNpZ25lZCBsb25nIGZhc3Rfc2VncywKIAkJCSAgICAgIHN0cnVjdCBpb3ZlYyAqZmFzdF9wb2ludGVyLAotCQkJICAgICAgc3RydWN0IGlvdmVjICoqcmV0X3BvaW50ZXIpCisJCQkgICAgICBzdHJ1Y3QgaW92ZWMgKipyZXRfcG9pbnRlciwKKwkJCSAgICAgIGludCBjaGVja19hY2Nlc3MpCiB7CiAJdW5zaWduZWQgbG9uZyBzZWc7CiAJc3NpemVfdCByZXQ7CkBAIC02NzMsNyArNjkwLDggQEAKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAodW5saWtlbHkoIWFjY2Vzc19vayh2cmZ5X2Rpcih0eXBlKSwgYnVmLCBsZW4pKSkgeworCQlpZiAoY2hlY2tfYWNjZXNzCisJCSAgICAmJiB1bmxpa2VseSghYWNjZXNzX29rKHZyZnlfZGlyKHR5cGUpLCBidWYsIGxlbikpKSB7CiAJCQlyZXQgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTcwNSw3ICs3MjMsNyBAQAogCX0KIAogCXJldCA9IHJ3X2NvcHlfY2hlY2tfdXZlY3Rvcih0eXBlLCB1dmVjdG9yLCBucl9zZWdzLAotCQkJQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92KTsKKwkJCQkgICAgQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92LCAxKTsKIAlpZiAocmV0IDw9IDApCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCA5YjBkNGI3Li45NTBmMTNhIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTExNTQsNyArMTE1NCw3IEBACiAJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7CiAJCXNldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlLCBTVEFUX0RBVEFfVjEpOwogCQlpbm9kZS0+aV9tb2RlID0gc2RfdjFfbW9kZShzZCk7Ci0JCWlub2RlLT5pX25saW5rID0gc2RfdjFfbmxpbmsoc2QpOworCQlzZXRfbmxpbmsoaW5vZGUsIHNkX3YxX25saW5rKHNkKSk7CiAJCWlub2RlLT5pX3VpZCA9IHNkX3YxX3VpZChzZCk7CiAJCWlub2RlLT5pX2dpZCA9IHNkX3YxX2dpZChzZCk7CiAJCWlub2RlLT5pX3NpemUgPSBzZF92MV9zaXplKHNkKTsKQEAgLTExOTksNyArMTE5OSw3IEBACiAJCXN0cnVjdCBzdGF0X2RhdGEgKnNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilCX0lfUElURU0oYmgsIGloKTsKIAogCQlpbm9kZS0+aV9tb2RlID0gc2RfdjJfbW9kZShzZCk7Ci0JCWlub2RlLT5pX25saW5rID0gc2RfdjJfbmxpbmsoc2QpOworCQlzZXRfbmxpbmsoaW5vZGUsIHNkX3YyX25saW5rKHNkKSk7CiAJCWlub2RlLT5pX3VpZCA9IHNkX3YyX3VpZChzZCk7CiAJCWlub2RlLT5pX3NpemUgPSBzZF92Ml9zaXplKHNkKTsKIAkJaW5vZGUtPmlfZ2lkID0gc2RfdjJfZ2lkKHNkKTsKQEAgLTE0NDQsNyArMTQ0NCw3IEBACiAJCS8qIGEgc3RhbGUgTkZTIGhhbmRsZSBjYW4gdHJpZ2dlciB0aGlzIHdpdGhvdXQgaXQgYmVpbmcgYW4gZXJyb3IgKi8KIAkJcGF0aHJlbHNlKCZwYXRoX3RvX3NkKTsKIAkJcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTgzMiw3ICsxODMyLDcgQEAKICNlbmRpZgogCiAJLyogZmlsbCBzdGF0IGRhdGEgKi8KLQlpbm9kZS0+aV9ubGluayA9IChTX0lTRElSKG1vZGUpID8gMiA6IDEpOworCXNldF9ubGluayhpbm9kZSwgKFNfSVNESVIobW9kZSkgPyAyIDogMSkpOwogCiAJLyogdWlkIGFuZCBnaWQgbXVzdCBhbHJlYWR5IGJlIHNldCBieSB0aGUgY2FsbGVyIGZvciBxdW90YSBpbml0ICovCiAKQEAgLTE5ODcsNyArMTk4Nyw3IEBACiAJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCiAgICAgICBvdXRfaW5zZXJ0ZWRfc2Q6Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKGlub2RlKTsKIAl0aC0+dF90cmFuc19pZCA9IDA7CS8qIHNvIHRoZSBjYWxsZXIgY2FuJ3QgdXNlIHRoaXMgaGFuZGxlIGxhdGVyICovCiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7IC8qIE9LIHRvIGRvIGV2ZW4gaWYgd2UgaGFkbid0IGxvY2tlZCBpdCAqLwogCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbmFtZWkuYyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKaW5kZXggZWYzOTIzMi4uODAwNThlOCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvbmFtZWkuYworKysgYi9mcy9yZWlzZXJmcy9uYW1laS5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCi0jZGVmaW5lIElOQ19ESVJfSU5PREVfTkxJTksoaSkgaWYgKGktPmlfbmxpbmsgIT0gMSkgeyBpbmNfbmxpbmsoaSk7IGlmIChpLT5pX25saW5rID49IFJFSVNFUkZTX0xJTktfTUFYKSBpLT5pX25saW5rPTE7IH0KKyNkZWZpbmUgSU5DX0RJUl9JTk9ERV9OTElOSyhpKSBpZiAoaS0+aV9ubGluayAhPSAxKSB7IGluY19ubGluayhpKTsgaWYgKGktPmlfbmxpbmsgPj0gUkVJU0VSRlNfTElOS19NQVgpIHNldF9ubGluayhpLCAxKTsgfQogI2RlZmluZSBERUNfRElSX0lOT0RFX05MSU5LKGkpIGlmIChpLT5pX25saW5rICE9IDEpIGRyb3BfbmxpbmsoaSk7CiAKIC8vIGRpcmVjdG9yeSBpdGVtIGNvbnRhaW5zIGFycmF5IG9mIGVudHJ5IGhlYWRlcnMuIFRoaXMgcGVyZm9ybXMKQEAgLTYyMiw3ICs2MjIsNyBAQAogCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluay0tOworCQlkcm9wX25saW5rKGlub2RlKTsKIAkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOwogCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKIAkJaWYgKGVycikKQEAgLTcwMiw3ICs3MDIsNyBAQAogCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluay0tOworCQlkcm9wX25saW5rKGlub2RlKTsKIAkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOwogCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKIAkJaWYgKGVycikKQEAgLTc4Nyw3ICs3ODcsNyBAQAogCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJREVDX0RJUl9JTk9ERV9OTElOSyhkaXIpOwogCQlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CiAJCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwpAQCAtOTY0LDcgKzk2NCw3IEBACiAJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJyZWlzZXJmcy03MDQyIiwKIAkJCQkgImRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkIiwKIAkJCQkgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAl9CiAKIAlkcm9wX25saW5rKGlub2RlKTsKQEAgLTEwODYsNyArMTA4Niw3IEBACiAJCQkJICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluay0tOworCQlkcm9wX25saW5rKGlub2RlKTsKIAkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOwogCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CiAJCWlmIChlcnIpCkBAIC0xMTI5LDcgKzExMjksNyBAQAogCiAJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKIAlpZiAocmV0dmFsKSB7Ci0JCWlub2RlLT5pX25saW5rLS07CisJCWRyb3BfbmxpbmsoaW5vZGUpOwogCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CkBAIC0xMTQ0LDcgKzExNDQsNyBAQAogCiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluay0tOworCQlkcm9wX25saW5rKGlub2RlKTsKIAkJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CiAJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwogCQlyZXR1cm4gZXJyID8gZXJyIDogcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZnMvcm9tZnMvc3VwZXIuYyBiL2ZzL3JvbWZzL3N1cGVyLmMKaW5kZXggMjMwNWUzMS4uOGI0MDg5ZiAxMDA2NDQKLS0tIGEvZnMvcm9tZnMvc3VwZXIuYworKysgYi9mcy9yb21mcy9zdXBlci5jCkBAIC0zMzcsNyArMzM3LDcgQEAKIAlpbm9kZS0+aV9tZXRhc2l6ZSA9IChST01GSF9TSVpFICsgbmxlbiArIDEgKyBST01GSF9QQUQpICYgUk9NRkhfTUFTSzsKIAlpbm9kZS0+aV9kYXRhb2Zmc2V0ID0gcG9zICsgaW5vZGUtPmlfbWV0YXNpemU7CiAKLQlpLT5pX25saW5rID0gMTsJCS8qIEhhcmQgdG8gZGVjaWRlLi4gKi8KKwlzZXRfbmxpbmsoaSwgMSk7CQkvKiBIYXJkIHRvIGRlY2lkZS4uICovCiAJaS0+aV9zaXplID0gYmUzMl90b19jcHUocmkuc2l6ZSk7CiAJaS0+aV9tdGltZS50dl9zZWMgPSBpLT5pX2F0aW1lLnR2X3NlYyA9IGktPmlfY3RpbWUudHZfc2VjID0gMDsKIAlpLT5pX210aW1lLnR2X25zZWMgPSBpLT5pX2F0aW1lLnR2X25zZWMgPSBpLT5pX2N0aW1lLnR2X25zZWMgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvS2NvbmZpZyBiL2ZzL3NxdWFzaGZzL0tjb25maWcKaW5kZXggMDQ4YjU5ZC4uYzcwMTExZSAxMDA2NDQKLS0tIGEvZnMvc3F1YXNoZnMvS2NvbmZpZworKysgYi9mcy9zcXVhc2hmcy9LY29uZmlnCkBAIC03OCw2ICs3OCwyOCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgU1FVQVNIRlNfNEtfREVWQkxLX1NJWkUKKwlib29sICJVc2UgNEsgZGV2aWNlIGJsb2NrIHNpemU/IgorCWRlcGVuZHMgb24gU1FVQVNIRlMKKwloZWxwCisJICBCeSBkZWZhdWx0IFNxdWFzaGZzIHNldHMgdGhlIGRldiBibG9jayBzaXplIChzYl9taW5fYmxvY2tzaXplKQorCSAgdG8gMUsgb3IgdGhlIHNtYWxsZXN0IGJsb2NrIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBibG9jayBkZXZpY2UKKwkgIChpZiBsYXJnZXIpLiAgVGhpcywgYmVjYXVzZSBibG9ja3MgYXJlIHBhY2tlZCB0b2dldGhlciBhbmQKKwkgIHVuYWxpZ25lZCBpbiBTcXVhc2hmcywgc2hvdWxkIHJlZHVjZSBsYXRlbmN5LgorCisJICBUaGlzLCBob3dldmVyLCBnaXZlcyBwb29yIHBlcmZvcm1hbmNlIG9uIE1URCBOQU5EIGRldmljZXMgd2hlcmUKKwkgIHRoZSBvcHRpbWFsIEkvTyBzaXplIGlzIDRLIChldmVuIHRob3VnaCB0aGUgZGV2aWNlcyBjYW4gc3VwcG9ydAorCSAgc21hbGxlciBibG9jayBzaXplcykuCisKKwkgIFVzaW5nIGEgNEsgZGV2aWNlIGJsb2NrIHNpemUgbWF5IGFsc28gaW1wcm92ZSBvdmVyYWxsIEkvTworCSAgcGVyZm9ybWFuY2UgZm9yIHNvbWUgZmlsZSBhY2Nlc3MgcGF0dGVybnMgKGUuZy4gc2VxdWVudGlhbAorCSAgYWNjZXNzZXMgb2YgZmlsZXMgaW4gZmlsZXN5c3RlbSBvcmRlcikgb24gYWxsIG1lZGlhLgorCisJICBTZXR0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZm9yY2UgU3F1YXNoZnMgdG8gdXNlIGEgNEsgZGV2aWNlIGJsb2NrCisJICBzaXplIGJ5IGRlZmF1bHQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBTUVVBU0hGU19FTUJFRERFRAogCWJvb2wgIkFkZGl0aW9uYWwgb3B0aW9uIGZvciBtZW1vcnktY29uc3RyYWluZWQgc3lzdGVtcyIKIAlkZXBlbmRzIG9uIFNRVUFTSEZTCmRpZmYgLS1naXQgYS9mcy9zcXVhc2hmcy9pbm9kZS5jIGIvZnMvc3F1YXNoZnMvaW5vZGUuYwppbmRleCAwNGJlYmNhLi5mZDdiM2IzIDEwMDY0NAotLS0gYS9mcy9zcXVhc2hmcy9pbm9kZS5jCisrKyBiL2ZzL3NxdWFzaGZzL2lub2RlLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCQkJZnJhZ19vZmZzZXQgPSAwOwogCQl9CiAKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCQlpbm9kZS0+aV9zaXplID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPmZpbGVfc2l6ZSk7CiAJCWlub2RlLT5pX2ZvcCA9ICZnZW5lcmljX3JvX2ZvcHM7CiAJCWlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQl9CiAKIAkJeGF0dHJfaWQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+eGF0dHIpOwotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShzcXNoX2luby0+ZmlsZV9zaXplKTsKIAkJaW5vZGUtPmlfb3AgPSAmc3F1YXNoZnNfaW5vZGVfb3BzOwogCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBmYWlsZWRfcmVhZDsKIAotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCWlub2RlLT5pX3NpemUgPSBsZTE2X3RvX2NwdShzcXNoX2luby0+ZmlsZV9zaXplKTsKIAkJaW5vZGUtPmlfb3AgPSAmc3F1YXNoZnNfZGlyX2lub2RlX29wczsKIAkJaW5vZGUtPmlfZm9wID0gJnNxdWFzaGZzX2Rpcl9vcHM7CkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJCWdvdG8gZmFpbGVkX3JlYWQ7CiAKIAkJeGF0dHJfaWQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+eGF0dHIpOwotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCWlub2RlLT5pX3NpemUgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+ZmlsZV9zaXplKTsKIAkJaW5vZGUtPmlfb3AgPSAmc3F1YXNoZnNfZGlyX2lub2RlX29wczsKIAkJaW5vZGUtPmlfZm9wID0gJnNxdWFzaGZzX2Rpcl9vcHM7CkBAIC0yODQsNyArMjg0LDcgQEAKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGZhaWxlZF9yZWFkOwogCi0JCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKTsKKwkJc2V0X25saW5rKGlub2RlLCBsZTMyX3RvX2NwdShzcXNoX2luby0+bmxpbmspKTsKIAkJaW5vZGUtPmlfc2l6ZSA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5zeW1saW5rX3NpemUpOwogCQlpbm9kZS0+aV9vcCA9ICZzcXVhc2hmc19zeW1saW5rX2lub2RlX29wczsKIAkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZzcXVhc2hmc19zeW1saW5rX2FvcHM7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJCWlub2RlLT5pX21vZGUgfD0gU19JRkNIUjsKIAkJZWxzZQogCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGQkxLOwotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCXJkZXYgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+cmRldik7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgbmV3X2RlY29kZV9kZXYocmRldikpOwogCkBAIC0zNDksNyArMzQ5LDcgQEAKIAkJCWlub2RlLT5pX21vZGUgfD0gU19JRkJMSzsKIAkJeGF0dHJfaWQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+eGF0dHIpOwogCQlpbm9kZS0+aV9vcCA9ICZzcXVhc2hmc19pbm9kZV9vcHM7Ci0JCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKTsKKwkJc2V0X25saW5rKGlub2RlLCBsZTMyX3RvX2NwdShzcXNoX2luby0+bmxpbmspKTsKIAkJcmRldiA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5yZGV2KTsKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBuZXdfZGVjb2RlX2RldihyZGV2KSk7CiAKQEAgLTM3MCw3ICszNzAsNyBAQAogCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGSUZPOwogCQllbHNlCiAJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZTT0NLOwotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgMCk7CiAJCWJyZWFrOwogCX0KQEAgLTM4OSw3ICszODksNyBAQAogCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGU09DSzsKIAkJeGF0dHJfaWQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+eGF0dHIpOwogCQlpbm9kZS0+aV9vcCA9ICZzcXVhc2hmc19pbm9kZV9vcHM7Ci0JCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKTsKKwkJc2V0X25saW5rKGlub2RlLCBsZTMyX3RvX2NwdShzcXNoX2luby0+bmxpbmspKTsKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCAwKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvc3F1YXNoZnNfZnMuaCBiL2ZzL3NxdWFzaGZzL3NxdWFzaGZzX2ZzLmgKaW5kZXggYjRhNGU1My4uZThlMTQ2NCAxMDA2NDQKLS0tIGEvZnMvc3F1YXNoZnMvc3F1YXNoZnNfZnMuaAorKysgYi9mcy9zcXVhc2hmcy9zcXVhc2hmc19mcy5oCkBAIC0zNiw2ICszNiwxMyBAQAogI2RlZmluZSBTUVVBU0hGU19GSUxFX1NJWkUJCTEzMTA3MgogI2RlZmluZSBTUVVBU0hGU19GSUxFX0xPRwkJMTcKIAorLyogZGVmYXVsdCBzaXplIG9mIGJsb2NrIGRldmljZSBJL08gKi8KKyNpZmRlZiBDT05GSUdfU1FVQVNIRlNfNEtfREVWQkxLX1NJWkUKKyNkZWZpbmUgU1FVQVNIRlNfREVWQkxLX1NJWkUgNDA5NgorI2Vsc2UKKyNkZWZpbmUgU1FVQVNIRlNfREVWQkxLX1NJWkUgMTAyNAorI2VuZGlmCisKICNkZWZpbmUgU1FVQVNIRlNfRklMRV9NQVhfU0laRQkJMTA0ODU3NgogI2RlZmluZSBTUVVBU0hGU19GSUxFX01BWF9MT0cJCTIwCiAKZGlmZiAtLWdpdCBhL2ZzL3NxdWFzaGZzL3N1cGVyLmMgYi9mcy9zcXVhc2hmcy9zdXBlci5jCmluZGV4IDc0Mzg4NTAuLjJkYTE3MTUgMTAwNjQ0Ci0tLSBhL2ZzL3NxdWFzaGZzL3N1cGVyLmMKKysrIGIvZnMvc3F1YXNoZnMvc3VwZXIuYwpAQCAtOTUsNyArOTUsNyBAQAogCX0KIAltc2JsayA9IHNiLT5zX2ZzX2luZm87CiAKLQltc2Jsay0+ZGV2Ymxrc2l6ZSA9IHNiX21pbl9ibG9ja3NpemUoc2IsIEJMT0NLX1NJWkUpOworCW1zYmxrLT5kZXZibGtzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgU1FVQVNIRlNfREVWQkxLX1NJWkUpOwogCW1zYmxrLT5kZXZibGtzaXplX2xvZzIgPSBmZnoofm1zYmxrLT5kZXZibGtzaXplKTsKIAogCW11dGV4X2luaXQoJm1zYmxrLT5yZWFkX2RhdGFfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZnMvc3RhY2suYyBiL2ZzL3N0YWNrLmMKaW5kZXggYjRmMmFiNDguLjljMTE1MTkgMTAwNjQ0Ci0tLSBhL2ZzL3N0YWNrLmMKKysrIGIvZnMvc3RhY2suYwpAQCAtNzEsNiArNzEsNiBAQAogCWRlc3QtPmlfY3RpbWUgPSBzcmMtPmlfY3RpbWU7CiAJZGVzdC0+aV9ibGtiaXRzID0gc3JjLT5pX2Jsa2JpdHM7CiAJZGVzdC0+aV9mbGFncyA9IHNyYy0+aV9mbGFnczsKLQlkZXN0LT5pX25saW5rID0gc3JjLT5pX25saW5rOworCXNldF9ubGluayhkZXN0LCBzcmMtPmlfbmxpbmspOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZnNzdGFja19jb3B5X2F0dHJfYWxsKTsKZGlmZiAtLWdpdCBhL2ZzL3N0YXQuYyBiL2ZzL3N0YXQuYwppbmRleCA3OGEzYWE4Li44ODA2Yjg5IDEwMDY0NAotLS0gYS9mcy9zdGF0LmMKKysrIGIvZnMvc3RhdC5jCkBAIC0yOTQsMTUgKzI5NCwxNiBAQAogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yOworCWludCBlbXB0eSA9IDA7CiAKIAlpZiAoYnVmc2l6IDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyb3IgPSB1c2VyX3BhdGhfYXQoZGZkLCBwYXRobmFtZSwgTE9PS1VQX0VNUFRZLCAmcGF0aCk7CisJZXJyb3IgPSB1c2VyX3BhdGhfYXRfZW1wdHkoZGZkLCBwYXRobmFtZSwgTE9PS1VQX0VNUFRZLCAmcGF0aCwgJmVtcHR5KTsKIAlpZiAoIWVycm9yKSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAotCQllcnJvciA9IC1FSU5WQUw7CisJCWVycm9yID0gZW1wdHkgPyAtRU5PRU5UIDogLUVJTlZBTDsKIAkJaWYgKGlub2RlLT5pX29wLT5yZWFkbGluaykgewogCQkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9yZWFkbGluayhwYXRoLmRlbnRyeSk7CiAJCQlpZiAoIWVycm9yKSB7CmRpZmYgLS1naXQgYS9mcy9zdGF0ZnMuYyBiL2ZzL3N0YXRmcy5jCmluZGV4IDgyNDQ5MjQuLjljZjA0YTEgMTAwNjQ0Ci0tLSBhL2ZzL3N0YXRmcy5jCisrKyBiL2ZzL3N0YXRmcy5jCkBAIC03Niw3ICs3Niw3IEBACiBpbnQgdXNlcl9zdGF0ZnMoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBzdHJ1Y3Qga3N0YXRmcyAqc3QpCiB7CiAJc3RydWN0IHBhdGggcGF0aDsKLQlpbnQgZXJyb3IgPSB1c2VyX3BhdGgocGF0aG5hbWUsICZwYXRoKTsKKwlpbnQgZXJyb3IgPSB1c2VyX3BhdGhfYXQoQVRfRkRDV0QsIHBhdGhuYW1lLCBMT09LVVBfRk9MTE9XfExPT0tVUF9BVVRPTU9VTlQsICZwYXRoKTsKIAlpZiAoIWVycm9yKSB7CiAJCWVycm9yID0gdmZzX3N0YXRmcygmcGF0aCwgc3QpOwogCQlwYXRoX3B1dCgmcGF0aCk7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCAzZjU2YTI2Li5hZmQwZjFhIDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCisrKyBiL2ZzL3N1cGVyLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKCFncmFiX3N1cGVyX3Bhc3NpdmUoc2IpKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAhc2MtPm5yX3RvX3NjYW4gPyAwIDogLTE7CiAKIAlpZiAoc2ItPnNfb3AgJiYgc2ItPnNfb3AtPm5yX2NhY2hlZF9vYmplY3RzKQogCQlmc19vYmplY3RzID0gc2ItPnNfb3AtPm5yX2NhY2hlZF9vYmplY3RzKHNiKTsKQEAgLTcyNyw4ICs3MjcsMTMgQEAKIAogCWlmIChzYi0+c19vcC0+cmVtb3VudF9mcykgewogCQlyZXR2YWwgPSBzYi0+c19vcC0+cmVtb3VudF9mcyhzYiwgJmZsYWdzLCBkYXRhKTsKLQkJaWYgKHJldHZhbCkKLQkJCXJldHVybiByZXR2YWw7CisJCWlmIChyZXR2YWwpIHsKKwkJCWlmICghZm9yY2UpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCS8qIElmIGZvcmNlZCByZW1vdW50LCBnbyBhaGVhZCBkZXNwaXRlIGFueSBlcnJvcnMgKi8KKwkJCVdBUk4oMSwgImZvcmNlZCByZW1vdW50IG9mIGEgJXMgZnMgcmV0dXJuZWQgJWlcbiIsCisJCQkgICAgIHNiLT5zX3R5cGUtPm5hbWUsIHJldHZhbCk7CisJCX0KIAl9CiAJc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUk1UX01BU0spIHwgKGZsYWdzICYgTVNfUk1UX01BU0spOwogCmRpZmYgLS1naXQgYS9mcy9zeW5jLmMgYi9mcy9zeW5jLmMKaW5kZXggYzk4YTc0Ny4uMTAxYjhlZiAxMDA2NDQKLS0tIGEvZnMvc3luYy5jCisrKyBiL2ZzL3N5bmMuYwpAQCAtNDMsNyArNDMsNyBAQAogCWlmICh3YWl0KQogCQlzeW5jX2lub2Rlc19zYihzYik7CiAJZWxzZQotCQl3cml0ZWJhY2tfaW5vZGVzX3NiKHNiKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYihzYiwgV0JfUkVBU09OX1NZTkMpOwogCiAJaWYgKHNiLT5zX29wLT5zeW5jX2ZzKQogCQlzYi0+c19vcC0+c3luY19mcyhzYiwgd2FpdCk7CkBAIC05OCw3ICs5OCw3IEBACiAgKi8KIFNZU0NBTExfREVGSU5FMChzeW5jKQogewotCXdha2V1cF9mbHVzaGVyX3RocmVhZHMoMCk7CisJd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcygwLCBXQl9SRUFTT05fU1lOQyk7CiAJc3luY19maWxlc3lzdGVtcygwKTsKIAlzeW5jX2ZpbGVzeXN0ZW1zKDEpOwogCWlmICh1bmxpa2VseShsYXB0b3BfbW9kZSkpCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9kaXIuYyBiL2ZzL3N5c2ZzL2Rpci5jCmluZGV4IDQ4ZmZiZGYwLi43ZmRmNmE3IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9kaXIuYworKysgYi9mcy9zeXNmcy9kaXIuYwpAQCAtODY1LDE1ICs4NjUsMTMgQEAKIAkJc2QtPnNfbmFtZSA9IG5ld19uYW1lOwogCX0KIAotCS8qIFJlbW92ZSBmcm9tIG9sZCBwYXJlbnQncyBsaXN0IGFuZCBpbnNlcnQgaW50byBuZXcgcGFyZW50J3MgbGlzdC4gKi8KLQlpZiAoc2QtPnNfcGFyZW50ICE9IG5ld19wYXJlbnRfc2QpIHsKLQkJc3lzZnNfdW5saW5rX3NpYmxpbmcoc2QpOwotCQlzeXNmc19nZXQobmV3X3BhcmVudF9zZCk7Ci0JCXN5c2ZzX3B1dChzZC0+c19wYXJlbnQpOwotCQlzZC0+c19wYXJlbnQgPSBuZXdfcGFyZW50X3NkOwotCQlzeXNmc19saW5rX3NpYmxpbmcoc2QpOwotCX0KKwkvKiBNb3ZlIHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgcmJ0cmVlLiAqLworCXN5c2ZzX3VubGlua19zaWJsaW5nKHNkKTsKKwlzeXNmc19nZXQobmV3X3BhcmVudF9zZCk7CisJc3lzZnNfcHV0KHNkLT5zX3BhcmVudCk7CiAJc2QtPnNfbnMgPSBuZXdfbnM7CisJc2QtPnNfcGFyZW50ID0gbmV3X3BhcmVudF9zZDsKKwlzeXNmc19saW5rX3NpYmxpbmcoc2QpOwogCiAJZXJyb3IgPSAwOwogIG91dDoKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2lub2RlLmMgYi9mcy9zeXNmcy9pbm9kZS5jCmluZGV4IGUyM2YyODguLmM4MWIyMmYzIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9pbm9kZS5jCisrKyBiL2ZzL3N5c2ZzL2lub2RlLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCX0KIAogCWlmIChzeXNmc190eXBlKHNkKSA9PSBTWVNGU19ESVIpCi0JCWlub2RlLT5pX25saW5rID0gc2QtPnNfZGlyLnN1YmRpcnMgKyAyOworCQlzZXRfbmxpbmsoaW5vZGUsIHNkLT5zX2Rpci5zdWJkaXJzICsgMik7CiB9CiAKIGludCBzeXNmc19nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCkKZGlmZiAtLWdpdCBhL2ZzL3N5c3YvaW5vZGUuYyBiL2ZzL3N5c3YvaW5vZGUuYwppbmRleCAwNjMwZWI5Ni4uMjVmZmIzZSAxMDA2NDQKLS0tIGEvZnMvc3lzdi9pbm9kZS5jCisrKyBiL2ZzL3N5c3YvaW5vZGUuYwpAQCAtMjE5LDcgKzIxOSw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IGZzMTZfdG9fY3B1KHNiaSwgcmF3X2lub2RlLT5pX21vZGUpOwogCWlub2RlLT5pX3VpZCA9ICh1aWRfdClmczE2X3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV91aWQpOwogCWlub2RlLT5pX2dpZCA9IChnaWRfdClmczE2X3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV9naWQpOwotCWlub2RlLT5pX25saW5rID0gZnMxNl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfbmxpbmspOworCXNldF9ubGluayhpbm9kZSwgZnMxNl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfbmxpbmspKTsKIAlpbm9kZS0+aV9zaXplID0gZnMzMl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfc2l6ZSk7CiAJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gZnMzMl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfYXRpbWUpOwogCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGZzMzJfdG9fY3B1KHNiaSwgcmF3X2lub2RlLT5pX210aW1lKTsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2J1ZGdldC5jIGIvZnMvdWJpZnMvYnVkZ2V0LmMKaW5kZXggMzE1ZGU2Ni4uYmM0Zjk0YiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvYnVkZ2V0LmMKKysrIGIvZnMvdWJpZnMvYnVkZ2V0LmMKQEAgLTYzLDcgKzYzLDcgQEAKIHN0YXRpYyB2b2lkIHNocmlua19saWFiaWxpdHkoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBucl90b193cml0ZSkKIHsKIAlkb3duX3JlYWQoJmMtPnZmc19zYi0+c191bW91bnQpOwotCXdyaXRlYmFja19pbm9kZXNfc2IoYy0+dmZzX3NiKTsKKwl3cml0ZWJhY2tfaW5vZGVzX3NiKGMtPnZmc19zYiwgV0JfUkVBU09OX0ZTX0ZSRUVfU1BBQ0UpOwogCXVwX3JlYWQoJmMtPnZmc19zYi0+c191bW91bnQpOwogfQogCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9kZWJ1Zy5jIGIvZnMvdWJpZnMvZGVidWcuYwppbmRleCBlZWYxMDlhLi5iMDliYTJkIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9kZWJ1Zy5jCisrKyBiL2ZzL3ViaWZzL2RlYnVnLmMKQEAgLTg3MCw2ICs4NzAsMjIgQEAKIAlzcGluX3VubG9jaygmZGJnX2xvY2spOwogfQogCit2b2lkIGRiZ19kdW1wX3NsZWIoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsCisJCSAgIGNvbnN0IHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqc2xlYiwgaW50IG9mZnMpCit7CisJc3RydWN0IHViaWZzX3NjYW5fbm9kZSAqc25vZDsKKworCXByaW50ayhLRVJOX0RFQlVHICIocGlkICVkKSBzdGFydCBkdW1waW5nIHNjYW5uZWQgZGF0YSBmcm9tIExFQiAlZDolZFxuIiwKKwkgICAgICAgY3VycmVudC0+cGlkLCBzbGViLT5sbnVtLCBvZmZzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc25vZCwgJnNsZWItPm5vZGVzLCBsaXN0KSB7CisJCWNvbmRfcmVzY2hlZCgpOworCQlwcmludGsoS0VSTl9ERUJVRyAiRHVtcGluZyBub2RlIGF0IExFQiAlZDolZCBsZW4gJWRcbiIsIHNsZWItPmxudW0sCisJCSAgICAgICBzbm9kLT5vZmZzLCBzbm9kLT5sZW4pOworCQlkYmdfZHVtcF9ub2RlKGMsIHNub2QtPm5vZGUpOworCX0KK30KKwogdm9pZCBkYmdfZHVtcF9sZWIoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtKQogewogCXN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqc2xlYjsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2RlYnVnLmggYi9mcy91Ymlmcy9kZWJ1Zy5oCmluZGV4IGZlYjM2MWUuLjhkOWM0NjggMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2RlYnVnLmgKKysrIGIvZnMvdWJpZnMvZGVidWcuaApAQCAtMjY5LDYgKzI2OSw4IEBACiB2b2lkIGRiZ19kdW1wX2xwcm9wcyhzdHJ1Y3QgdWJpZnNfaW5mbyAqYyk7CiB2b2lkIGRiZ19kdW1wX2xwdF9pbmZvKHN0cnVjdCB1Ymlmc19pbmZvICpjKTsKIHZvaWQgZGJnX2R1bXBfbGViKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSk7Cit2b2lkIGRiZ19kdW1wX3NsZWIoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsCisJCSAgIGNvbnN0IHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqc2xlYiwgaW50IG9mZnMpOwogdm9pZCBkYmdfZHVtcF96bm9kZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkJICAgIGNvbnN0IHN0cnVjdCB1Ymlmc196bm9kZSAqem5vZGUpOwogdm9pZCBkYmdfZHVtcF9oZWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBzdHJ1Y3QgdWJpZnNfbHB0X2hlYXAgKmhlYXAsIGludCBjYXQpOwpAQCAtMzg3LDYgKzM4OSw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZGJnX2R1bXBfbGViKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLAogCQkJCWludCBsbnVtKSAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybjsgfQogc3RhdGljIGlubGluZSB2b2lkCitkYmdfZHVtcF9zbGViKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLAorCSAgICAgIGNvbnN0IHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqc2xlYiwgaW50IG9mZnMpICAgICAgICB7IHJldHVybjsgfQorc3RhdGljIGlubGluZSB2b2lkCiBkYmdfZHVtcF96bm9kZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkgICAgICAgY29uc3Qgc3RydWN0IHViaWZzX3pub2RlICp6bm9kZSkgICAgICAgICAgICAgICAgICAgeyByZXR1cm47IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkYmdfZHVtcF9oZWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvcmVjb3ZlcnkuYyBiL2ZzL3ViaWZzL3JlY292ZXJ5LmMKaW5kZXggYWYwMjc5MC4uZWU0ZjQzZiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvcmVjb3ZlcnkuYworKysgYi9mcy91Ymlmcy9yZWNvdmVyeS5jCkBAIC05ODMsNyArOTgzLDcgQEAKIH0KIAogLyoqCi0gKiAgY2xlYW5fYW5fdW5jbGVhbl9sZWIgLSByZWFkIGFuZCB3cml0ZSBhIExFQiB0byByZW1vdmUgY29ycnVwdGlvbi4KKyAqIGNsZWFuX2FuX3VuY2xlYW5fbGViIC0gcmVhZCBhbmQgd3JpdGUgYSBMRUIgdG8gcmVtb3ZlIGNvcnJ1cHRpb24uCiAgKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0CiAgKiBAdWNsZWI6IHVuY2xlYW4gTEVCIGluZm9ybWF0aW9uCiAgKiBAc2J1ZjogTEVCLXNpemVkIGJ1ZmZlciB0byB1c2UKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3NiLmMgYi9mcy91Ymlmcy9zYi5jCmluZGV4IDkzZDkzOGEuLjYwOTRjNWEgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3NiLmMKKysrIGIvZnMvdWJpZnMvc2IuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJbXN0LT50b3RhbF9kaXJ0eSA9IGNwdV90b19sZTY0KHRtcDY0KTsKIAogCS8qICBUaGUgaW5kZXhpbmcgTEVCIGRvZXMgbm90IGNvbnRyaWJ1dGUgdG8gZGFyayBzcGFjZSAqLwotCXRtcDY0ID0gKGMtPm1haW5fbGVicyAtIDEpICogYy0+ZGFya193bTsKKwl0bXA2NCA9ICgobG9uZyBsb25nKShjLT5tYWluX2xlYnMgLSAxKSAqIGMtPmRhcmtfd20pOwogCW1zdC0+dG90YWxfZGFyayA9IGNwdV90b19sZTY0KHRtcDY0KTsKIAogCW1zdC0+dG90YWxfdXNlZCA9IGNwdV90b19sZTY0KFVCSUZTX0lOT19OT0RFX1NaKTsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3N1cGVyLmMgYi9mcy91Ymlmcy9zdXBlci5jCmluZGV4IGIyODEyMTIuLjIwNDAzZGMgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3N1cGVyLmMKKysrIGIvZnMvdWJpZnMvc3VwZXIuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCWdvdG8gb3V0X2lubzsKIAogCWlub2RlLT5pX2ZsYWdzIHw9IChTX05PQ01USU1FIHwgU19OT0FUSU1FKTsKLQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KGluby0+bmxpbmspOworCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoaW5vLT5ubGluaykpOwogCWlub2RlLT5pX3VpZCAgID0gbGUzMl90b19jcHUoaW5vLT51aWQpOwogCWlub2RlLT5pX2dpZCAgID0gbGUzMl90b19jcHUoaW5vLT5naWQpOwogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyAgPSAoaW50NjRfdClsZTY0X3RvX2NwdShpbm8tPmF0aW1lX3NlYyk7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy94YXR0ci5jIGIvZnMvdWJpZnMveGF0dHIuYwppbmRleCAxNmYxOWY1Li5iZjE4ZjdhIDEwMDY0NAotLS0gYS9mcy91Ymlmcy94YXR0ci5jCisrKyBiL2ZzL3ViaWZzL3hhdHRyLmMKQEAgLTU1OCwxMCArNTU4LDEwIEBACiAJfQogCiAJdWJpZnNfYXNzZXJ0KGlub2RlLT5pX25saW5rID09IDEpOwotCWlub2RlLT5pX25saW5rID0gMDsKKwljbGVhcl9ubGluayhpbm9kZSk7CiAJZXJyID0gcmVtb3ZlX3hhdHRyKGMsIGhvc3QsIGlub2RlLCAmbm0pOwogCWlmIChlcnIpCi0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAogCS8qIElmIEBpX25saW5rIGlzIDAsICdpcHV0KCknIHdpbGwgZGVsZXRlIHRoZSBpbm9kZSAqLwogCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2JhbGxvYy5jIGIvZnMvdWRmL2JhbGxvYy5jCmluZGV4IDk1NTE4YTkuLjk4NzU4NWIgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9iYWxsb2MuYworKysgYi9mcy91ZGYvYmFsbG9jLmMKQEAgLTU5LDggKzU5LDggQEAKIAlpbnQgbnJfZ3JvdXBzID0gYml0bWFwLT5zX25yX2dyb3VwczsKIAogCWlmIChibG9ja19ncm91cCA+PSBucl9ncm91cHMpIHsKLQkJdWRmX2RlYnVnKCJibG9ja19ncm91cCAoJWQpID4gbnJfZ3JvdXBzICglZClcbiIsIGJsb2NrX2dyb3VwLAotCQkJICBucl9ncm91cHMpOworCQl1ZGZfZGVidWcoImJsb2NrX2dyb3VwICglZCkgPiBucl9ncm91cHMgKCVkKVxuIiwKKwkJCSAgYmxvY2tfZ3JvdXAsIG5yX2dyb3Vwcyk7CiAJfQogCiAJaWYgKGJpdG1hcC0+c19ibG9ja19iaXRtYXBbYmxvY2tfZ3JvdXBdKSB7CkBAIC0xMjYsOCArMTI2LDkgQEAKIAlpZiAoYmxvYy0+bG9naWNhbEJsb2NrTnVtICsgY291bnQgPCBjb3VudCB8fAogCSAgICAoYmxvYy0+bG9naWNhbEJsb2NrTnVtICsgY291bnQpID4gcGFydG1hcC0+c19wYXJ0aXRpb25fbGVuKSB7CiAJCXVkZl9kZWJ1ZygiJWQgPCAlZCB8fCAlZCArICVkID4gJWRcbiIsCi0JCQkgIGJsb2MtPmxvZ2ljYWxCbG9ja051bSwgMCwgYmxvYy0+bG9naWNhbEJsb2NrTnVtLAotCQkJICBjb3VudCwgcGFydG1hcC0+c19wYXJ0aXRpb25fbGVuKTsKKwkJCSAgYmxvYy0+bG9naWNhbEJsb2NrTnVtLCAwLAorCQkJICBibG9jLT5sb2dpY2FsQmxvY2tOdW0sIGNvdW50LAorCQkJICBwYXJ0bWFwLT5zX3BhcnRpdGlvbl9sZW4pOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CiAKQEAgLTE1NSw3ICsxNTYsNyBAQAogCQkJaWYgKHVkZl9zZXRfYml0KGJpdCArIGksIGJoLT5iX2RhdGEpKSB7CiAJCQkJdWRmX2RlYnVnKCJiaXQgJWxkIGFscmVhZHkgc2V0XG4iLCBiaXQgKyBpKTsKIAkJCQl1ZGZfZGVidWcoImJ5dGU9JTJ4XG4iLAotCQkJCQkoKGNoYXIgKiliaC0+Yl9kYXRhKVsoYml0ICsgaSkgPj4gM10pOworCQkJCQkgICgoY2hhciAqKWJoLT5iX2RhdGEpWyhiaXQgKyBpKSA+PiAzXSk7CiAJCQl9CiAJCX0KIAkJdWRmX2FkZF9mcmVlX3NwYWNlKHNiLCBzYmktPnNfcGFydGl0aW9uLCBjb3VudCk7CkBAIC0zNjksNyArMzcwLDggQEAKIAlpZiAoYmxvYy0+bG9naWNhbEJsb2NrTnVtICsgY291bnQgPCBjb3VudCB8fAogCSAgICAoYmxvYy0+bG9naWNhbEJsb2NrTnVtICsgY291bnQpID4gcGFydG1hcC0+c19wYXJ0aXRpb25fbGVuKSB7CiAJCXVkZl9kZWJ1ZygiJWQgPCAlZCB8fCAlZCArICVkID4gJWRcbiIsCi0JCQkgIGJsb2MtPmxvZ2ljYWxCbG9ja051bSwgMCwgYmxvYy0+bG9naWNhbEJsb2NrTnVtLCBjb3VudCwKKwkJCSAgYmxvYy0+bG9naWNhbEJsb2NrTnVtLCAwLAorCQkJICBibG9jLT5sb2dpY2FsQmxvY2tOdW0sIGNvdW50LAogCQkJICBwYXJ0bWFwLT5zX3BhcnRpdGlvbl9sZW4pOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CmRpZmYgLS1naXQgYS9mcy91ZGYvZGlyZWN0b3J5LmMgYi9mcy91ZGYvZGlyZWN0b3J5LmMKaW5kZXggMmZmZGI2Ny4uM2U0NGY1NyAxMDA2NDQKLS0tIGEvZnMvdWRmL2RpcmVjdG9yeS5jCisrKyBiL2ZzL3VkZi9kaXJlY3RvcnkuYwpAQCAtMTYyLDggKzE2Miw4IEBACiAJaW50IHBhZGxlbjsKIAogCWlmICgoIWJ1ZmZlcikgfHwgKCFvZmZzZXQpKSB7Ci0JCXVkZl9kZWJ1ZygiaW52YWxpZHBhcm1zXG4sIGJ1ZmZlcj0lcCwgb2Zmc2V0PSVwXG4iLCBidWZmZXIsCi0JCQkgIG9mZnNldCk7CisJCXVkZl9kZWJ1ZygiaW52YWxpZHBhcm1zLCBidWZmZXI9JXAsIG9mZnNldD0lcFxuIiwKKwkJCSAgYnVmZmVyLCBvZmZzZXQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogCXN0cnVjdCBzaG9ydF9hZCAqc2E7CiAKIAlpZiAoKCFwdHIpIHx8ICghb2Zmc2V0KSkgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX2dldF9maWxlc2hvcnRhZCgpIGludmFsaWRwYXJtc1xuIik7CisJCXByX2VycigiJXM6IGludmFsaWRwYXJtc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogCXN0cnVjdCBsb25nX2FkICpsYTsKIAogCWlmICgoIXB0cikgfHwgKCFvZmZzZXQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfZ2V0X2ZpbGVsb25nYWQoKSBpbnZhbGlkcGFybXNcbiIpOworCQlwcl9lcnIoIiVzOiBpbnZhbGlkcGFybXNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9mcy91ZGYvaW5vZGUuYyBiL2ZzL3VkZi9pbm9kZS5jCmluZGV4IDFkMTM1OGUuLjRmZDFkODAgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pbm9kZS5jCisrKyBiL2ZzL3VkZi9pbm9kZS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYy1pdHUtdC5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CiAKICNpbmNsdWRlICJ1ZGZfaS5oIgogI2luY2x1ZGUgInVkZl9zYi5oIgpAQCAtODMsMTIgKzg0LDEwIEBACiAJZW5kX3dyaXRlYmFjayhpbm9kZSk7CiAJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgIT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCICYmCiAJICAgIGlub2RlLT5pX3NpemUgIT0gaWluZm8tPmlfbGVuRXh0ZW50cykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnMgKCVzKTogSW5vZGUgJWx1IChtb2RlICVvKSBoYXMgIgotCQkJImlub2RlIHNpemUgJWxsdSBkaWZmZXJlbnQgZnJvbSBleHRlbnQgbGVuZ3RoICVsbHUuICIKLQkJCSJGaWxlc3lzdGVtIG5lZWQgbm90IGJlIHN0YW5kYXJkcyBjb21wbGlhbnQuXG4iLAotCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbW9kZSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5vZGUtPmlfc2l6ZSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaWluZm8tPmlfbGVuRXh0ZW50cyk7CisJCXVkZl93YXJuKGlub2RlLT5pX3NiLCAiSW5vZGUgJWx1IChtb2RlICVvKSBoYXMgaW5vZGUgc2l6ZSAlbGx1IGRpZmZlcmVudCBmcm9tIGV4dGVudCBsZW5ndGggJWxsdS4gRmlsZXN5c3RlbSBuZWVkIG5vdCBiZSBzdGFuZGFyZHMgY29tcGxpYW50LlxuIiwKKwkJCSBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX21vZGUsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylpbm9kZS0+aV9zaXplLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpaWluZm8tPmlfbGVuRXh0ZW50cyk7CiAJfQogCWtmcmVlKGlpbmZvLT5pX2V4dC5pX2RhdGEpOwogCWlpbmZvLT5pX2V4dC5pX2RhdGEgPSBOVUxMOwpAQCAtMTA0LDcgKzEwMywxMyBAQAogCiBzdGF0aWMgaW50IHVkZl9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIHVkZl9nZXRfYmxvY2spOworCXJldHVybiBtcGFnZV9yZWFkcGFnZShwYWdlLCB1ZGZfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCB1ZGZfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKK3sKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgdWRmX2dldF9ibG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgdWRmX3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKQEAgLTEzOSw2ICsxNDQsNyBAQAogCiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHVkZl9hb3BzID0gewogCS5yZWFkcGFnZQk9IHVkZl9yZWFkcGFnZSwKKwkucmVhZHBhZ2VzCT0gdWRmX3JlYWRwYWdlcywKIAkud3JpdGVwYWdlCT0gdWRmX3dyaXRlcGFnZSwKIAkud3JpdGVfYmVnaW4JCT0gdWRmX3dyaXRlX2JlZ2luLAogCS53cml0ZV9lbmQJCT0gZ2VuZXJpY193cml0ZV9lbmQsCkBAIC0xMTY5LDE2ICsxMTc1LDE1IEBACiAJICovCiAJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCAmaWluZm8tPmlfbG9jYXRpb24sIDAsICZpZGVudCk7CiAJaWYgKCFiaCkgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX3JlYWRfaW5vZGUoaW5vICVsZCkgZmFpbGVkICFiaFxuIiwKLQkJICAgICAgIGlub2RlLT5pX2lubyk7CisJCXVkZl9lcnIoaW5vZGUtPmlfc2IsICIoaW5vICVsZCkgZmFpbGVkICFiaFxuIiwgaW5vZGUtPmlfaW5vKTsKIAkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGlkZW50ICE9IFRBR19JREVOVF9GRSAmJiBpZGVudCAhPSBUQUdfSURFTlRfRUZFICYmCiAJICAgIGlkZW50ICE9IFRBR19JREVOVF9VU0UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVkZl9yZWFkX2lub2RlKGlubyAlbGQpICIKLQkJCQkiZmFpbGVkIGlkZW50PSVkXG4iLCBpbm9kZS0+aV9pbm8sIGlkZW50KTsKKwkJdWRmX2Vycihpbm9kZS0+aV9zYiwgIihpbm8gJWxkKSBmYWlsZWQgaWRlbnQ9JWRcbiIsCisJCQlpbm9kZS0+aV9pbm8sIGlkZW50KTsKIAkJYnJlbHNlKGJoKTsKIAkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCQlyZXR1cm47CkBAIC0xMjE4LDggKzEyMjMsOCBAQAogCQl9CiAJCWJyZWxzZShpYmgpOwogCX0gZWxzZSBpZiAoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUgIT0gY3B1X3RvX2xlMTYoNCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVuc3VwcG9ydGVkIHN0cmF0ZWd5IHR5cGU6ICVkXG4iLAotCQkgICAgICAgbGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpKTsKKwkJdWRmX2Vycihpbm9kZS0+aV9zYiwgInVuc3VwcG9ydGVkIHN0cmF0ZWd5IHR5cGU6ICVkXG4iLAorCQkJbGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpKTsKIAkJYnJlbHNlKGJoKTsKIAkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCQlyZXR1cm47CkBAIC0xMjM2LDYgKzEyNDEsNyBAQAogCWludCBvZmZzZXQ7CiAJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CisJdW5zaWduZWQgaW50IGxpbmtfY291bnQ7CiAKIAlmZSA9IChzdHJ1Y3QgZmlsZUVudHJ5ICopYmgtPmJfZGF0YTsKIAllZmUgPSAoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5ICopYmgtPmJfZGF0YTsKQEAgLTEzMTgsOSArMTMyNCwxMCBAQAogCWlub2RlLT5pX21vZGUgJj0gfnNiaS0+c191bWFzazsKIAlyZWFkX3VubG9jaygmc2JpLT5zX2NyZWRfbG9jayk7CiAKLQlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KGZlLT5maWxlTGlua0NvdW50KTsKLQlpZiAoIWlub2RlLT5pX25saW5rKQotCQlpbm9kZS0+aV9ubGluayA9IDE7CisJbGlua19jb3VudCA9IGxlMTZfdG9fY3B1KGZlLT5maWxlTGlua0NvdW50KTsKKwlpZiAoIWxpbmtfY291bnQpCisJCWxpbmtfY291bnQgPSAxOworCXNldF9ubGluayhpbm9kZSwgbGlua19jb3VudCk7CiAKIAlpbm9kZS0+aV9zaXplID0gbGU2NF90b19jcHUoZmUtPmluZm9ybWF0aW9uTGVuZ3RoKTsKIAlpaW5mby0+aV9sZW5FeHRlbnRzID0gaW5vZGUtPmlfc2l6ZTsKQEAgLTE0MTMsOSArMTQyMCw4IEBACiAJCXVkZl9kZWJ1ZygiTUVUQURBVEEgQklUTUFQIEZJTEUtLS0tLVxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfZmlsbF9pbm9kZShpbm8gJWxkKSBmYWlsZWQgdW5rbm93biAiCi0JCQkJImZpbGUgdHlwZT0lZFxuIiwgaW5vZGUtPmlfaW5vLAotCQkJCWZlLT5pY2JUYWcuZmlsZVR5cGUpOworCQl1ZGZfZXJyKGlub2RlLT5pX3NiLCAiKGlubyAlbGQpIGZhaWxlZCB1bmtub3duIGZpbGUgdHlwZT0lZFxuIiwKKwkJCWlub2RlLT5pX2lubywgZmUtPmljYlRhZy5maWxlVHlwZSk7CiAJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE0MzgsOCArMTQ0NCw4IEBACiAJaWluZm8tPmlfZXh0LmlfZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWlpbmZvLT5pX2V4dC5pX2RhdGEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6dWRmX2FsbG9jX2lfZGF0YSAoaW5vICVsZCkgIgotCQkJCSJubyBmcmVlIG1lbW9yeVxuIiwgaW5vZGUtPmlfaW5vKTsKKwkJdWRmX2Vycihpbm9kZS0+aV9zYiwgIihpbm8gJWxkKSBubyBmcmVlIG1lbW9yeVxuIiwKKwkJCWlub2RlLT5pX2lubyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTY4OSw5ICsxNjk1LDggQEAKIAlpZiAoZG9fc3luYykgewogCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CiAJCWlmIChidWZmZXJfd3JpdGVfaW9fZXJyb3IoYmgpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJJTyBlcnJvciBzeW5jaW5nIHVkZiBpbm9kZSAiCi0JCQkJIlslczolMDhseF1cbiIsIGlub2RlLT5pX3NiLT5zX2lkLAotCQkJCWlub2RlLT5pX2lubyk7CisJCQl1ZGZfd2Fybihpbm9kZS0+aV9zYiwgIklPIGVycm9yIHN5bmNpbmcgdWRmIGlub2RlIFslMDhseF1cbiIsCisJCQkJIGlub2RlLT5pX2lubyk7CiAJCQllcnIgPSAtRUlPOwogCQl9CiAJfQpAQCAtMTk4Miw4ICsxOTg3LDcgQEAKIAkJKmVsZW4gPSBsZTMyX3RvX2NwdShsYWQtPmV4dExlbmd0aCkgJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQl1ZGZfZGVidWcoImFsbG9jX3R5cGUgPSAlZCB1bnN1cHBvcnRlZFxuIiwKLQkJCQlpaW5mby0+aV9hbGxvY190eXBlKTsKKwkJdWRmX2RlYnVnKCJhbGxvY190eXBlID0gJWQgdW5zdXBwb3J0ZWRcbiIsIGlpbmZvLT5pX2FsbG9jX3R5cGUpOwogCQlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9mcy91ZGYvbG93bGV2ZWwuYyBiL2ZzL3VkZi9sb3dsZXZlbC5jCmluZGV4IDQzZTI0YTMuLjY1ODNmZTkgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9sb3dsZXZlbC5jCisrKyBiL2ZzL3VkZi9sb3dsZXZlbC5jCkBAIC0zOCw3ICszOCw3IEBACiAKIAlpZiAoaSA9PSAwKSB7CiAJCXVkZl9kZWJ1ZygiWEEgZGlzazogJXMsIHZvbF9kZXNjX3N0YXJ0PSVkXG4iLAotCQkJICAobXNfaW5mby54YV9mbGFnID8gInllcyIgOiAibm8iKSwgbXNfaW5mby5hZGRyLmxiYSk7CisJCQkgIG1zX2luZm8ueGFfZmxhZyA/ICJ5ZXMiIDogIm5vIiwgbXNfaW5mby5hZGRyLmxiYSk7CiAJCWlmIChtc19pbmZvLnhhX2ZsYWcpIC8qIG5lY2Vzc2FyeSBmb3IgYSB2YWxpZCBtc19pbmZvLmFkZHIgKi8KIAkJCXZvbF9kZXNjX3N0YXJ0ID0gbXNfaW5mby5hZGRyLmxiYTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZnMvdWRmL21pc2MuYyBiL2ZzL3VkZi9taXNjLmMKaW5kZXggOTIxNTcwMC4uYzE3NWI0ZCAxMDA2NDQKLS0tIGEvZnMvdWRmL21pc2MuYworKysgYi9mcy91ZGYvbWlzYy5jCkBAIC0yMDQsNiArMjA0LDcgQEAKIHsKIAlzdHJ1Y3QgdGFnICp0YWdfcDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwl1OCBjaGVja3N1bTsKIAogCS8qIFJlYWQgdGhlIGJsb2NrICovCiAJaWYgKGJsb2NrID09IDB4RkZGRkZGRkYpCkBAIC0yMTEsOCArMjEyLDggQEAKIAogCWJoID0gdWRmX3RyZWFkKHNiLCBibG9jayk7CiAJaWYgKCFiaCkgewotCQl1ZGZfZGVidWcoImJsb2NrPSVkLCBsb2NhdGlvbj0lZDogcmVhZCBmYWlsZWRcbiIsCi0JCQkgIGJsb2NrLCBsb2NhdGlvbik7CisJCXVkZl9lcnIoc2IsICJyZWFkIGZhaWxlZCwgYmxvY2s9JXUsIGxvY2F0aW9uPSVkXG4iLAorCQkJYmxvY2ssIGxvY2F0aW9uKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yMjcsMTYgKzIyOCwxOCBAQAogCX0KIAogCS8qIFZlcmlmeSB0aGUgdGFnIGNoZWNrc3VtICovCi0JaWYgKHVkZl90YWdfY2hlY2tzdW0odGFnX3ApICE9IHRhZ19wLT50YWdDaGVja3N1bSkgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdGFnIGNoZWNrc3VtIGZhaWxlZCBibG9jayAlZFxuIiwgYmxvY2spOworCWNoZWNrc3VtID0gdWRmX3RhZ19jaGVja3N1bSh0YWdfcCk7CisJaWYgKGNoZWNrc3VtICE9IHRhZ19wLT50YWdDaGVja3N1bSkgeworCQl1ZGZfZXJyKHNiLCAidGFnIGNoZWNrc3VtIGZhaWxlZCwgYmxvY2sgJXU6IDB4JTAyeCAhPSAweCUwMnhcbiIsCisJCQlibG9jaywgY2hlY2tzdW0sIHRhZ19wLT50YWdDaGVja3N1bSk7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAogCS8qIFZlcmlmeSB0aGUgdGFnIHZlcnNpb24gKi8KIAlpZiAodGFnX3AtPmRlc2NWZXJzaW9uICE9IGNwdV90b19sZTE2KDB4MDAwMlUpICYmCiAJICAgIHRhZ19wLT5kZXNjVmVyc2lvbiAhPSBjcHVfdG9fbGUxNigweDAwMDNVKSkgewotCQl1ZGZfZGVidWcoInRhZyB2ZXJzaW9uIDB4JTA0eCAhPSAweDAwMDIgfHwgMHgwMDAzIGJsb2NrICVkXG4iLAotCQkJICBsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY1ZlcnNpb24pLCBibG9jayk7CisJCXVkZl9lcnIoc2IsICJ0YWcgdmVyc2lvbiAweCUwNHggIT0gMHgwMDAyIHx8IDB4MDAwMywgYmxvY2sgJXVcbiIsCisJCQlsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY1ZlcnNpb24pLCBibG9jayk7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIApAQCAtMjQ4LDggKzI1MSw4IEBACiAJCXJldHVybiBiaDsKIAogCXVkZl9kZWJ1ZygiQ3JjIGZhaWx1cmUgYmxvY2sgJWQ6IGNyYyA9ICVkLCBjcmNsZW4gPSAlZFxuIiwgYmxvY2ssCi0JICAgIGxlMTZfdG9fY3B1KHRhZ19wLT5kZXNjQ1JDKSwgbGUxNl90b19jcHUodGFnX3AtPmRlc2NDUkNMZW5ndGgpKTsKLQorCQkgIGxlMTZfdG9fY3B1KHRhZ19wLT5kZXNjQ1JDKSwKKwkJICBsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQ0xlbmd0aCkpOwogZXJyb3Jfb3V0OgogCWJyZWxzZShiaCk7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9mcy91ZGYvbmFtZWkuYyBiL2ZzL3VkZi9uYW1laS5jCmluZGV4IGYxZGNlODQuLjQ2MzllMTMgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9uYW1laS5jCisrKyBiL2ZzL3VkZi9uYW1laS5jCkBAIC01NzcsOCArNTc3LDcgQEAKIAogCWZpID0gdWRmX2FkZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmksICZlcnIpOwogCWlmICghZmkpIHsKLQkJaW5vZGUtPmlfbmxpbmstLTsKLQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWlub2RlX2RlY19saW5rX2NvdW50KGlub2RlKTsKIAkJaXB1dChpbm9kZSk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtNjE4LDggKzYxNyw3IEBACiAJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCByZGV2KTsKIAlmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKTsKIAlpZiAoIWZpKSB7Ci0JCWlub2RlLT5pX25saW5rLS07Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTY2NSwxMiArNjYzLDExIEBACiAJaW5vZGUtPmlfZm9wID0gJnVkZl9kaXJfb3BlcmF0aW9uczsKIAlmaSA9IHVkZl9hZGRfZW50cnkoaW5vZGUsIE5VTEwsICZmaWJoLCAmY2ZpLCAmZXJyKTsKIAlpZiAoIWZpKSB7Ci0JCWlub2RlLT5pX25saW5rLS07Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlnb3RvIG91dDsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSAyOworCXNldF9ubGluayhpbm9kZSwgMik7CiAJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwogCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihkaW5mby0+aV9sb2NhdGlvbik7CiAJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9CkBAIC02ODMsNyArNjgwLDcgQEAKIAogCWZpID0gdWRmX2FkZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmksICZlcnIpOwogCWlmICghZmkpIHsKLQkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpbm9kZSk7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJZ290byBvdXQ7CkBAIC03OTksOSArNzk2LDggQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVuZF9ybWRpcjsKIAlpZiAoaW5vZGUtPmlfbmxpbmsgIT0gMikKLQkJdWRmX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJ1ZGZfcm1kaXIiLAotCQkJICAgICJlbXB0eSBkaXJlY3RvcnkgaGFzIG5saW5rICE9IDIgKCVkKSIsCi0JCQkgICAgaW5vZGUtPmlfbmxpbmspOworCQl1ZGZfd2Fybihpbm9kZS0+aV9zYiwgImVtcHR5IGRpcmVjdG9yeSBoYXMgbmxpbmsgIT0gMiAoJWQpXG4iLAorCQkJIGlub2RlLT5pX25saW5rKTsKIAljbGVhcl9ubGluayhpbm9kZSk7CiAJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJaW5vZGVfZGVjX2xpbmtfY291bnQoZGlyKTsKQEAgLTg0MCw3ICs4MzYsNyBAQAogCWlmICghaW5vZGUtPmlfbmxpbmspIHsKIAkJdWRmX2RlYnVnKCJEZWxldGluZyBub25leGlzdGVudCBmaWxlICglbHUpLCAlZFxuIiwKIAkJCSAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAl9CiAJcmV0dmFsID0gdWRmX2RlbGV0ZV9lbnRyeShkaXIsIGZpLCAmZmliaCwgJmNmaSk7CiAJaWYgKHJldHZhbCkKZGlmZiAtLWdpdCBhL2ZzL3VkZi9wYXJ0aXRpb24uYyBiL2ZzL3VkZi9wYXJ0aXRpb24uYwppbmRleCBhNzEwOTBlLi5kNmNhZjAxIDEwMDY0NAotLS0gYS9mcy91ZGYvcGFydGl0aW9uLmMKKysrIGIvZnMvdWRmL3BhcnRpdGlvbi5jCkBAIC0zMyw4ICszMyw4IEBACiAJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOwogCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcDsKIAlpZiAocGFydGl0aW9uID49IHNiaS0+c19wYXJ0aXRpb25zKSB7Ci0JCXVkZl9kZWJ1ZygiYmxvY2s9JWQsIHBhcnRpdGlvbj0lZCwgb2Zmc2V0PSVkOiAiCi0JCQkgICJpbnZhbGlkIHBhcnRpdGlvblxuIiwgYmxvY2ssIHBhcnRpdGlvbiwgb2Zmc2V0KTsKKwkJdWRmX2RlYnVnKCJibG9jaz0lZCwgcGFydGl0aW9uPSVkLCBvZmZzZXQ9JWQ6IGludmFsaWQgcGFydGl0aW9uXG4iLAorCQkJICBibG9jaywgcGFydGl0aW9uLCBvZmZzZXQpOwogCQlyZXR1cm4gMHhGRkZGRkZGRjsKIAl9CiAJbWFwID0gJnNiaS0+c19wYXJ0bWFwc1twYXJ0aXRpb25dOwpAQCAtNjAsOCArNjAsOCBAQAogCXZkYXRhID0gJm1hcC0+c190eXBlX3NwZWNpZmljLnNfdmlydHVhbDsKIAogCWlmIChibG9jayA+IHZkYXRhLT5zX251bV9lbnRyaWVzKSB7Ci0JCXVkZl9kZWJ1ZygiVHJ5aW5nIHRvIGFjY2VzcyBibG9jayBiZXlvbmQgZW5kIG9mIFZBVCAiCi0JCQkgICIoJWQgbWF4ICVkKVxuIiwgYmxvY2ssIHZkYXRhLT5zX251bV9lbnRyaWVzKTsKKwkJdWRmX2RlYnVnKCJUcnlpbmcgdG8gYWNjZXNzIGJsb2NrIGJleW9uZCBlbmQgb2YgVkFUICglZCBtYXggJWQpXG4iLAorCQkJICBibG9jaywgdmRhdGEtPnNfbnVtX2VudHJpZXMpOwogCQlyZXR1cm4gMHhGRkZGRkZGRjsKIAl9CiAKQEAgLTMyMSw5ICszMjEsMTQgQEAKIAkvKiBXZSBzaG91bGRuJ3QgbW91bnQgc3VjaCBtZWRpYS4uLiAqLwogCUJVR19PTighaW5vZGUpOwogCXJldGJsayA9IHVkZl90cnlfcmVhZF9tZXRhKGlub2RlLCBibG9jaywgcGFydGl0aW9uLCBvZmZzZXQpOwotCWlmIChyZXRibGsgPT0gMHhGRkZGRkZGRikgewotCQl1ZGZfd2FybmluZyhzYiwgX19mdW5jX18sICJlcnJvciByZWFkaW5nIGZyb20gTUVUQURBVEEsICIKLQkJCSJ0cnlpbmcgdG8gcmVhZCBmcm9tIE1JUlJPUiIpOworCWlmIChyZXRibGsgPT0gMHhGRkZGRkZGRiAmJiBtZGF0YS0+c19tZXRhZGF0YV9mZSkgeworCQl1ZGZfd2FybihzYiwgImVycm9yIHJlYWRpbmcgZnJvbSBNRVRBREFUQSwgdHJ5aW5nIHRvIHJlYWQgZnJvbSBNSVJST1JcbiIpOworCQlpZiAoIShtZGF0YS0+c19mbGFncyAmIE1GX01JUlJPUl9GRV9MT0FERUQpKSB7CisJCQltZGF0YS0+c19taXJyb3JfZmUgPSB1ZGZfZmluZF9tZXRhZGF0YV9pbm9kZV9lZmUoc2IsCisJCQkJbWRhdGEtPnNfbWlycm9yX2ZpbGVfbG9jLCBtYXAtPnNfcGFydGl0aW9uX251bSk7CisJCQltZGF0YS0+c19mbGFncyB8PSBNRl9NSVJST1JfRkVfTE9BREVEOworCQl9CisKIAkJaW5vZGUgPSBtZGF0YS0+c19taXJyb3JfZmU7CiAJCWlmICghaW5vZGUpCiAJCQlyZXR1cm4gMHhGRkZGRkZGRjsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9zdXBlci5jIGIvZnMvdWRmL3N1cGVyLmMKaW5kZXggN2IyN2IwNi4uZTE4NTI1MyAxMDA2NDQKLS0tIGEvZnMvdWRmL3N1cGVyLmMKKysrIGIvZnMvdWRmL3N1cGVyLmMKQEAgLTc1LDggKzc1LDYgQEAKIAogI2RlZmluZSBVREZfREVGQVVMVF9CTE9DS1NJWkUgMjA0OAogCi1zdGF0aWMgY2hhciBlcnJvcl9idWZbMTAyNF07Ci0KIC8qIFRoZXNlIGFyZSB0aGUgIm1lYXQiIC0gZXZlcnl0aGluZyBlbHNlIGlzIHN0dWZmaW5nICovCiBzdGF0aWMgaW50IHVkZl9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIGludCk7CiBzdGF0aWMgdm9pZCB1ZGZfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKQEAgLTkyLDggKzkwLDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdWRmX2NvdW50X2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogc3RhdGljIGludCB1ZGZfc3RhdGZzKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiBzdGF0aWMgaW50IHVkZl9zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKLXN0YXRpYyB2b2lkIHVkZl9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKLQkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2NJbXBVc2UgKnVkZl9zYl9sdmlkaXUoc3RydWN0IHVkZl9zYl9pbmZvICpzYmkpCiB7CkBAIC0yNDQsOSArMjQwLDggQEAKIAlzYmktPnNfcGFydG1hcHMgPSBrY2FsbG9jKGNvdW50LCBzaXplb2Yoc3RydWN0IHVkZl9wYXJ0X21hcCksCiAJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaS0+c19wYXJ0bWFwcykgewotCQl1ZGZfZXJyb3Ioc2IsIF9fZnVuY19fLAotCQkJICAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciAlZCBwYXJ0aXRpb24gbWFwcyIsCi0JCQkgIGNvdW50KTsKKwkJdWRmX2VycihzYiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgJWQgcGFydGl0aW9uIG1hcHNcbiIsCisJCQljb3VudCk7CiAJCXNiaS0+c19wYXJ0aXRpb25zID0gMDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNTUwLDggKzU0NSw3IEBACiAJCQl1b3B0LT5kbW9kZSA9IG9wdGlvbiAmIDA3Nzc7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAidWRmOiBiYWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCi0JCQkgICAgICAgIm9yIG1pc3NpbmcgdmFsdWVcbiIsIHApOworCQkJcHJfZXJyKCJiYWQgbW91bnQgb3B0aW9uIFwiJXNcIiBvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNjQ1LDIwICs2MzksMTYgQEAKIAkJCQl1ZGZfZGVidWcoIklTTzk2NjAgQm9vdCBSZWNvcmQgZm91bmRcbiIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAxOgotCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBQcmltYXJ5IFZvbHVtZSBEZXNjcmlwdG9yICIKLQkJCQkJICAiZm91bmRcbiIpOworCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBQcmltYXJ5IFZvbHVtZSBEZXNjcmlwdG9yIGZvdW5kXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMjoKLQkJCQl1ZGZfZGVidWcoIklTTzk2NjAgU3VwcGxlbWVudGFyeSBWb2x1bWUgIgotCQkJCQkgICJEZXNjcmlwdG9yIGZvdW5kXG4iKTsKKwkJCQl1ZGZfZGVidWcoIklTTzk2NjAgU3VwcGxlbWVudGFyeSBWb2x1bWUgRGVzY3JpcHRvciBmb3VuZFxuIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDM6Ci0JCQkJdWRmX2RlYnVnKCJJU085NjYwIFZvbHVtZSBQYXJ0aXRpb24gRGVzY3JpcHRvciAiCi0JCQkJCSAgImZvdW5kXG4iKTsKKwkJCQl1ZGZfZGVidWcoIklTTzk2NjAgVm9sdW1lIFBhcnRpdGlvbiBEZXNjcmlwdG9yIGZvdW5kXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMjU1OgotCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBWb2x1bWUgRGVzY3JpcHRvciBTZXQgIgotCQkJCQkgICJUZXJtaW5hdG9yIGZvdW5kXG4iKTsKKwkJCQl1ZGZfZGVidWcoIklTTzk2NjAgVm9sdW1lIERlc2NyaXB0b3IgU2V0IFRlcm1pbmF0b3IgZm91bmRcbiIpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQl1ZGZfZGVidWcoIklTTzk2NjAgVlJTICgldSkgZm91bmRcbiIsCkBAIC04MDksOCArNzk5LDcgQEAKIAkJCSAgICAgIHB2b2xkZXNjLT5yZWNvcmRpbmdEYXRlQW5kVGltZSkpIHsKICNpZmRlZiBVREZGU19ERUJVRwogCQlzdHJ1Y3QgdGltZXN0YW1wICp0cyA9ICZwdm9sZGVzYy0+cmVjb3JkaW5nRGF0ZUFuZFRpbWU7Ci0JCXVkZl9kZWJ1ZygicmVjb3JkaW5nIHRpbWUgJTA0dS8lMDJ1LyUwMnUiCi0JCQkgICIgJTAydTolMDJ1ICgleClcbiIsCisJCXVkZl9kZWJ1ZygicmVjb3JkaW5nIHRpbWUgJTA0dS8lMDJ1LyUwMnUgJTAydTolMDJ1ICgleClcbiIsCiAJCQkgIGxlMTZfdG9fY3B1KHRzLT55ZWFyKSwgdHMtPm1vbnRoLCB0cy0+ZGF5LCB0cy0+aG91ciwKIAkJCSAgdHMtPm1pbnV0ZSwgbGUxNl90b19jcHUodHMtPnR5cGVBbmRUaW1lem9uZSkpOwogI2VuZGlmCkBAIC04MjEsNyArODEwLDcgQEAKIAkJCXN0cm5jcHkoVURGX1NCKHNiKS0+c192b2x1bWVfaWRlbnQsIG91dHN0ci0+dV9uYW1lLAogCQkJCW91dHN0ci0+dV9sZW4gPiAzMSA/IDMxIDogb3V0c3RyLT51X2xlbik7CiAJCQl1ZGZfZGVidWcoInZvbElkZW50W10gPSAnJXMnXG4iLAotCQkJCQlVREZfU0Ioc2IpLT5zX3ZvbHVtZV9pZGVudCk7CisJCQkJICBVREZfU0Ioc2IpLT5zX3ZvbHVtZV9pZGVudCk7CiAJCX0KIAogCWlmICghdWRmX2J1aWxkX3VzdHIoaW5zdHIsIHB2b2xkZXNjLT52b2xTZXRJZGVudCwgMTI4KSkKQEAgLTgzNyw2NCArODI2LDU3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RydWN0IGlub2RlICp1ZGZfZmluZF9tZXRhZGF0YV9pbm9kZV9lZmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJdTMyIG1ldGFfZmlsZV9sb2MsIHUzMiBwYXJ0aXRpb25fbnVtKQoreworCXN0cnVjdCBrZXJuZWxfbGJfYWRkciBhZGRyOworCXN0cnVjdCBpbm9kZSAqbWV0YWRhdGFfZmU7CisKKwlhZGRyLmxvZ2ljYWxCbG9ja051bSA9IG1ldGFfZmlsZV9sb2M7CisJYWRkci5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBwYXJ0aXRpb25fbnVtOworCisJbWV0YWRhdGFfZmUgPSB1ZGZfaWdldChzYiwgJmFkZHIpOworCisJaWYgKG1ldGFkYXRhX2ZlID09IE5VTEwpCisJCXVkZl93YXJuKHNiLCAibWV0YWRhdGEgaW5vZGUgZWZlIG5vdCBmb3VuZFxuIik7CisJZWxzZSBpZiAoVURGX0kobWV0YWRhdGFfZmUpLT5pX2FsbG9jX3R5cGUgIT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpIHsKKwkJdWRmX3dhcm4oc2IsICJtZXRhZGF0YSBpbm9kZSBlZmUgZG9lcyBub3QgaGF2ZSBzaG9ydCBhbGxvY2F0aW9uIGRlc2NyaXB0b3JzIVxuIik7CisJCWlwdXQobWV0YWRhdGFfZmUpOworCQltZXRhZGF0YV9mZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIG1ldGFkYXRhX2ZlOworfQorCiBzdGF0aWMgaW50IHVkZl9sb2FkX21ldGFkYXRhX2ZpbGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBwYXJ0aXRpb24pCiB7CiAJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOwogCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcDsKIAlzdHJ1Y3QgdWRmX21ldGFfZGF0YSAqbWRhdGE7CiAJc3RydWN0IGtlcm5lbF9sYl9hZGRyIGFkZHI7Ci0JaW50IGZlX2Vycm9yID0gMDsKIAogCW1hcCA9ICZzYmktPnNfcGFydG1hcHNbcGFydGl0aW9uXTsKIAltZGF0YSA9ICZtYXAtPnNfdHlwZV9zcGVjaWZpYy5zX21ldGFkYXRhOwogCiAJLyogbWV0YWRhdGEgYWRkcmVzcyAqLwotCWFkZHIubG9naWNhbEJsb2NrTnVtID0gIG1kYXRhLT5zX21ldGFfZmlsZV9sb2M7Ci0JYWRkci5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBtYXAtPnNfcGFydGl0aW9uX251bTsKLQogCXVkZl9kZWJ1ZygiTWV0YWRhdGEgZmlsZSBsb2NhdGlvbjogYmxvY2sgPSAlZCBwYXJ0ID0gJWRcbiIsCi0JCQkgIGFkZHIubG9naWNhbEJsb2NrTnVtLCBhZGRyLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJCSAgbWRhdGEtPnNfbWV0YV9maWxlX2xvYywgbWFwLT5zX3BhcnRpdGlvbl9udW0pOwogCi0JbWRhdGEtPnNfbWV0YWRhdGFfZmUgPSB1ZGZfaWdldChzYiwgJmFkZHIpOworCW1kYXRhLT5zX21ldGFkYXRhX2ZlID0gdWRmX2ZpbmRfbWV0YWRhdGFfaW5vZGVfZWZlKHNiLAorCQltZGF0YS0+c19tZXRhX2ZpbGVfbG9jLCBtYXAtPnNfcGFydGl0aW9uX251bSk7CiAKIAlpZiAobWRhdGEtPnNfbWV0YWRhdGFfZmUgPT0gTlVMTCkgewotCQl1ZGZfd2FybmluZyhzYiwgX19mdW5jX18sICJtZXRhZGF0YSBpbm9kZSBlZmUgbm90IGZvdW5kLCAiCi0JCQkJIndpbGwgdHJ5IG1pcnJvciBpbm9kZS4iKTsKLQkJZmVfZXJyb3IgPSAxOwotCX0gZWxzZSBpZiAoVURGX0kobWRhdGEtPnNfbWV0YWRhdGFfZmUpLT5pX2FsbG9jX3R5cGUgIT0KLQkJIElDQlRBR19GTEFHX0FEX1NIT1JUKSB7Ci0JCXVkZl93YXJuaW5nKHNiLCBfX2Z1bmNfXywgIm1ldGFkYXRhIGlub2RlIGVmZSBkb2VzIG5vdCBoYXZlICIKLQkJCSJzaG9ydCBhbGxvY2F0aW9uIGRlc2NyaXB0b3JzISIpOwotCQlmZV9lcnJvciA9IDE7Ci0JCWlwdXQobWRhdGEtPnNfbWV0YWRhdGFfZmUpOwotCQltZGF0YS0+c19tZXRhZGF0YV9mZSA9IE5VTEw7Ci0JfQorCQkvKiBtaXJyb3IgZmlsZSBlbnRyeSAqLworCQl1ZGZfZGVidWcoIk1pcnJvciBtZXRhZGF0YSBmaWxlIGxvY2F0aW9uOiBibG9jayA9ICVkIHBhcnQgPSAlZFxuIiwKKwkJCSAgbWRhdGEtPnNfbWlycm9yX2ZpbGVfbG9jLCBtYXAtPnNfcGFydGl0aW9uX251bSk7CiAKLQkvKiBtaXJyb3IgZmlsZSBlbnRyeSAqLwotCWFkZHIubG9naWNhbEJsb2NrTnVtID0gbWRhdGEtPnNfbWlycm9yX2ZpbGVfbG9jOwotCWFkZHIucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gbWFwLT5zX3BhcnRpdGlvbl9udW07CisJCW1kYXRhLT5zX21pcnJvcl9mZSA9IHVkZl9maW5kX21ldGFkYXRhX2lub2RlX2VmZShzYiwKKwkJCW1kYXRhLT5zX21pcnJvcl9maWxlX2xvYywgbWFwLT5zX3BhcnRpdGlvbl9udW0pOwogCi0JdWRmX2RlYnVnKCJNaXJyb3IgbWV0YWRhdGEgZmlsZSBsb2NhdGlvbjogYmxvY2sgPSAlZCBwYXJ0ID0gJWRcbiIsCi0JCQkgIGFkZHIubG9naWNhbEJsb2NrTnVtLCBhZGRyLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7Ci0KLQltZGF0YS0+c19taXJyb3JfZmUgPSB1ZGZfaWdldChzYiwgJmFkZHIpOwotCi0JaWYgKG1kYXRhLT5zX21pcnJvcl9mZSA9PSBOVUxMKSB7Ci0JCWlmIChmZV9lcnJvcikgewotCQkJdWRmX2Vycm9yKHNiLCBfX2Z1bmNfXywgIm1pcnJvciBpbm9kZSBlZmUgbm90IGZvdW5kICIKLQkJCSJhbmQgbWV0YWRhdGEgaW5vZGUgaXMgbWlzc2luZyB0b28sIGV4aXRpbmcuLi4iKTsKKwkJaWYgKG1kYXRhLT5zX21pcnJvcl9mZSA9PSBOVUxMKSB7CisJCQl1ZGZfZXJyKHNiLCAiQm90aCBtZXRhZGF0YSBhbmQgbWlycm9yIG1ldGFkYXRhIGlub2RlIGVmZSBjYW4gbm90IGZvdW5kXG4iKTsKIAkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJfSBlbHNlCi0JCQl1ZGZfd2FybmluZyhzYiwgX19mdW5jX18sICJtaXJyb3IgaW5vZGUgZWZlIG5vdCBmb3VuZCwiCi0JCQkJCSIgYnV0IG1ldGFkYXRhIGlub2RlIGlzIE9LIik7Ci0JfSBlbHNlIGlmIChVREZfSShtZGF0YS0+c19taXJyb3JfZmUpLT5pX2FsbG9jX3R5cGUgIT0KLQkJIElDQlRBR19GTEFHX0FEX1NIT1JUKSB7Ci0JCXVkZl93YXJuaW5nKHNiLCBfX2Z1bmNfXywgIm1pcnJvciBpbm9kZSBlZmUgZG9lcyBub3QgaGF2ZSAiCi0JCQkic2hvcnQgYWxsb2NhdGlvbiBkZXNjcmlwdG9ycyEiKTsKLQkJaXB1dChtZGF0YS0+c19taXJyb3JfZmUpOwotCQltZGF0YS0+c19taXJyb3JfZmUgPSBOVUxMOwotCQlpZiAoZmVfZXJyb3IpCi0JCQlnb3RvIGVycm9yX2V4aXQ7CisJCX0KIAl9CiAKIAkvKgpAQCAtOTA3LDE4ICs4ODksMTUgQEAKIAkJYWRkci5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBtYXAtPnNfcGFydGl0aW9uX251bTsKIAogCQl1ZGZfZGVidWcoIkJpdG1hcCBmaWxlIGxvY2F0aW9uOiBibG9jayA9ICVkIHBhcnQgPSAlZFxuIiwKLQkJCWFkZHIubG9naWNhbEJsb2NrTnVtLCBhZGRyLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJCQkgIGFkZHIubG9naWNhbEJsb2NrTnVtLCBhZGRyLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CiAKIAkJbWRhdGEtPnNfYml0bWFwX2ZlID0gdWRmX2lnZXQoc2IsICZhZGRyKTsKIAogCQlpZiAobWRhdGEtPnNfYml0bWFwX2ZlID09IE5VTEwpIHsKIAkJCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKLQkJCQl1ZGZfd2FybmluZyhzYiwgX19mdW5jX18sICJiaXRtYXAgaW5vZGUgZWZlICIKLQkJCQkJIm5vdCBmb3VuZCBidXQgaXQncyBvayBzaW5jZSB0aGUgZGlzYyIKLQkJCQkJIiBpcyBtb3VudGVkIHJlYWQtb25seSIpOworCQkJCXVkZl93YXJuKHNiLCAiYml0bWFwIGlub2RlIGVmZSBub3QgZm91bmQgYnV0IGl0J3Mgb2sgc2luY2UgdGhlIGRpc2MgaXMgbW91bnRlZCByZWFkLW9ubHlcbiIpOwogCQkJZWxzZSB7Ci0JCQkJdWRmX2Vycm9yKHNiLCBfX2Z1bmNfXywgImJpdG1hcCBpbm9kZSBlZmUgbm90ICIKLQkJCQkJImZvdW5kIGFuZCBhdHRlbXB0ZWQgcmVhZC13cml0ZSBtb3VudCIpOworCQkJCXVkZl9lcnIoc2IsICJiaXRtYXAgaW5vZGUgZWZlIG5vdCBmb3VuZCBhbmQgYXR0ZW1wdGVkIHJlYWQtd3JpdGUgbW91bnRcbiIpOwogCQkJCWdvdG8gZXJyb3JfZXhpdDsKIAkJCX0KIAkJfQpAQCAtOTcxLDkgKzk1MCw4IEBACiAJCWJpdG1hcCA9IHZ6YWxsb2Moc2l6ZSk7IC8qIFRPRE86IGdldCByaWQgb2YgdnphbGxvYyAqLwogCiAJaWYgKGJpdG1hcCA9PSBOVUxMKSB7Ci0JCXVkZl9lcnJvcihzYiwgX19mdW5jX18sCi0JCQkgICJVbmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGJpdG1hcCAiCi0JCQkgICJhbmQgJWQgYnVmZmVyX2hlYWQgcG9pbnRlcnMiLCBucl9ncm91cHMpOworCQl1ZGZfZXJyKHNiLCAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBiaXRtYXAgYW5kICVkIGJ1ZmZlcl9oZWFkIHBvaW50ZXJzXG4iLAorCQkJbnJfZ3JvdXBzKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMDAzLDEwICs5ODEsOSBAQAogCWlmIChwLT5hY2Nlc3NUeXBlID09IGNwdV90b19sZTMyKFBEX0FDQ0VTU19UWVBFX09WRVJXUklUQUJMRSkpCiAJCW1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgfD0gVURGX1BBUlRfRkxBR19PVkVSV1JJVEFCTEU7CiAKLQl1ZGZfZGVidWcoIlBhcnRpdGlvbiAoJWQgdHlwZSAleCkgc3RhcnRzIGF0IHBoeXNpY2FsICVkLCAiCi0JCSAgImJsb2NrIGxlbmd0aCAlZFxuIiwgcF9pbmRleCwKLQkJICBtYXAtPnNfcGFydGl0aW9uX3R5cGUsIG1hcC0+c19wYXJ0aXRpb25fcm9vdCwKLQkJICBtYXAtPnNfcGFydGl0aW9uX2xlbik7CisJdWRmX2RlYnVnKCJQYXJ0aXRpb24gKCVkIHR5cGUgJXgpIHN0YXJ0cyBhdCBwaHlzaWNhbCAlZCwgYmxvY2sgbGVuZ3RoICVkXG4iLAorCQkgIHBfaW5kZXgsIG1hcC0+c19wYXJ0aXRpb25fdHlwZSwKKwkJICBtYXAtPnNfcGFydGl0aW9uX3Jvb3QsIG1hcC0+c19wYXJ0aXRpb25fbGVuKTsKIAogCWlmIChzdHJjbXAocC0+cGFydGl0aW9uQ29udGVudHMuaWRlbnQsIFBEX1BBUlRJVElPTl9DT05URU5UU19OU1IwMikgJiYKIAkgICAgc3RyY21wKHAtPnBhcnRpdGlvbkNvbnRlbnRzLmlkZW50LCBQRF9QQVJUSVRJT05fQ09OVEVOVFNfTlNSMDMpKQpAQCAtMTAyMywxMiArMTAwMCwxMiBAQAogCQltYXAtPnNfdXNwYWNlLnNfdGFibGUgPSB1ZGZfaWdldChzYiwgJmxvYyk7CiAJCWlmICghbWFwLT5zX3VzcGFjZS5zX3RhYmxlKSB7CiAJCQl1ZGZfZGVidWcoImNhbm5vdCBsb2FkIHVuYWxsb2NTcGFjZVRhYmxlIChwYXJ0ICVkKVxuIiwKLQkJCQkJcF9pbmRleCk7CisJCQkJICBwX2luZGV4KTsKIAkJCXJldHVybiAxOwogCQl9CiAJCW1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgfD0gVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFOwogCQl1ZGZfZGVidWcoInVuYWxsb2NTcGFjZVRhYmxlIChwYXJ0ICVkKSBAICVsZFxuIiwKLQkJCQlwX2luZGV4LCBtYXAtPnNfdXNwYWNlLnNfdGFibGUtPmlfaW5vKTsKKwkJCSAgcF9pbmRleCwgbWFwLT5zX3VzcGFjZS5zX3RhYmxlLT5pX2lubyk7CiAJfQogCiAJaWYgKHBoZC0+dW5hbGxvY1NwYWNlQml0bWFwLmV4dExlbmd0aCkgewpAQCAtMTA0MSw4ICsxMDE4LDggQEAKIAkJYml0bWFwLT5zX2V4dFBvc2l0aW9uID0gbGUzMl90b19jcHUoCiAJCQkJcGhkLT51bmFsbG9jU3BhY2VCaXRtYXAuZXh0UG9zaXRpb24pOwogCQltYXAtPnNfcGFydGl0aW9uX2ZsYWdzIHw9IFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVA7Ci0JCXVkZl9kZWJ1ZygidW5hbGxvY1NwYWNlQml0bWFwIChwYXJ0ICVkKSBAICVkXG4iLCBwX2luZGV4LAotCQkJCQkJYml0bWFwLT5zX2V4dFBvc2l0aW9uKTsKKwkJdWRmX2RlYnVnKCJ1bmFsbG9jU3BhY2VCaXRtYXAgKHBhcnQgJWQpIEAgJWRcbiIsCisJCQkgIHBfaW5kZXgsIGJpdG1hcC0+c19leHRQb3NpdGlvbik7CiAJfQogCiAJaWYgKHBoZC0+cGFydGl0aW9uSW50ZWdyaXR5VGFibGUuZXh0TGVuZ3RoKQpAQCAtMTA1OCwxMyArMTAzNSwxMyBAQAogCQltYXAtPnNfZnNwYWNlLnNfdGFibGUgPSB1ZGZfaWdldChzYiwgJmxvYyk7CiAJCWlmICghbWFwLT5zX2ZzcGFjZS5zX3RhYmxlKSB7CiAJCQl1ZGZfZGVidWcoImNhbm5vdCBsb2FkIGZyZWVkU3BhY2VUYWJsZSAocGFydCAlZClcbiIsCi0JCQkJcF9pbmRleCk7CisJCQkJICBwX2luZGV4KTsKIAkJCXJldHVybiAxOwogCQl9CiAKIAkJbWFwLT5zX3BhcnRpdGlvbl9mbGFncyB8PSBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFOwogCQl1ZGZfZGVidWcoImZyZWVkU3BhY2VUYWJsZSAocGFydCAlZCkgQCAlbGRcbiIsCi0JCQkJcF9pbmRleCwgbWFwLT5zX2ZzcGFjZS5zX3RhYmxlLT5pX2lubyk7CisJCQkgIHBfaW5kZXgsIG1hcC0+c19mc3BhY2Uuc190YWJsZS0+aV9pbm8pOwogCX0KIAogCWlmIChwaGQtPmZyZWVkU3BhY2VCaXRtYXAuZXh0TGVuZ3RoKSB7CkBAIC0xMDc3LDggKzEwNTQsOCBAQAogCQliaXRtYXAtPnNfZXh0UG9zaXRpb24gPSBsZTMyX3RvX2NwdSgKIAkJCQlwaGQtPmZyZWVkU3BhY2VCaXRtYXAuZXh0UG9zaXRpb24pOwogCQltYXAtPnNfcGFydGl0aW9uX2ZsYWdzIHw9IFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQOwotCQl1ZGZfZGVidWcoImZyZWVkU3BhY2VCaXRtYXAgKHBhcnQgJWQpIEAgJWRcbiIsIHBfaW5kZXgsCi0JCQkJCWJpdG1hcC0+c19leHRQb3NpdGlvbik7CisJCXVkZl9kZWJ1ZygiZnJlZWRTcGFjZUJpdG1hcCAocGFydCAlZCkgQCAlZFxuIiwKKwkJCSAgcF9pbmRleCwgYml0bWFwLT5zX2V4dFBvc2l0aW9uKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMTE4LDExICsxMDk1LDkgQEAKIAl1ZGZfZmluZF92YXRfYmxvY2soc2IsIHBfaW5kZXgsIHR5cGUxX2luZGV4LCBzYmktPnNfbGFzdF9ibG9jayk7CiAJaWYgKCFzYmktPnNfdmF0X2lub2RlICYmCiAJICAgIHNiaS0+c19sYXN0X2Jsb2NrICE9IGJsb2NrcyAtIDEpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJVREYtZnM6IEZhaWxlZCB0byByZWFkIFZBVCBpbm9kZSBmcm9tIHRoZSIKLQkJICAgICAgICIgbGFzdCByZWNvcmRlZCBibG9jayAoJWx1KSwgcmV0cnlpbmcgd2l0aCB0aGUgbGFzdCAiCi0JCSAgICAgICAiYmxvY2sgb2YgdGhlIGRldmljZSAoJWx1KS5cbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZylzYmktPnNfbGFzdF9ibG9jaywKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKWJsb2NrcyAtIDEpOworCQlwcl9ub3RpY2UoIkZhaWxlZCB0byByZWFkIFZBVCBpbm9kZSBmcm9tIHRoZSBsYXN0IHJlY29yZGVkIGJsb2NrICglbHUpLCByZXRyeWluZyB3aXRoIHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBkZXZpY2UgKCVsdSkuXG4iLAorCQkJICAodW5zaWduZWQgbG9uZylzYmktPnNfbGFzdF9ibG9jaywKKwkJCSAgKHVuc2lnbmVkIGxvbmcpYmxvY2tzIC0gMSk7CiAJCXVkZl9maW5kX3ZhdF9ibG9jayhzYiwgcF9pbmRleCwgdHlwZTFfaW5kZXgsIGJsb2NrcyAtIDEpOwogCX0KIAlpZiAoIXNiaS0+c192YXRfaW5vZGUpCkBAIC0xMjIwLDggKzExOTUsOCBAQAogCWlmIChtYXAtPnNfcGFydGl0aW9uX3R5cGUgPT0gVURGX01FVEFEQVRBX01BUDI1KSB7CiAJCXJldCA9IHVkZl9sb2FkX21ldGFkYXRhX2ZpbGVzKHNiLCBpKTsKIAkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVREYtZnM6IGVycm9yIGxvYWRpbmcgTWV0YURhdGEgIgotCQkJInBhcnRpdGlvbiBtYXAgJWRcbiIsIGkpOworCQkJdWRmX2VycihzYiwgImVycm9yIGxvYWRpbmcgTWV0YURhdGEgcGFydGl0aW9uIG1hcCAlZFxuIiwKKwkJCQlpKTsKIAkJCWdvdG8gb3V0X2JoOwogCQl9CiAJfSBlbHNlIHsKQEAgLTEyMzQsOSArMTIwOSw3IEBACiAJCSAqIG92ZXJ3cml0ZSBibG9ja3MgaW5zdGVhZCBvZiByZWxvY2F0aW5nIHRoZW0pLgogCQkgKi8KIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVERi1mczogRmlsZXN5c3RlbSBtYXJrZWQgcmVhZC1vbmx5ICIKLQkJCSJiZWNhdXNlIHdyaXRpbmcgdG8gcHNldWRvb3ZlcndyaXRlIHBhcnRpdGlvbiBpcyAiCi0JCQkibm90IGltcGxlbWVudGVkLlxuIik7CisJCXByX25vdGljZSgiRmlsZXN5c3RlbSBtYXJrZWQgcmVhZC1vbmx5IGJlY2F1c2Ugd3JpdGluZyB0byBwc2V1ZG9vdmVyd3JpdGUgcGFydGl0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJfQogb3V0X2JoOgogCS8qIEluIGNhc2UgbG9hZGluZyBmYWlsZWQsIHdlIGhhbmRsZSBjbGVhbnVwIGluIHVkZl9maWxsX3N1cGVyICovCkBAIC0xMzQ0LDkgKzEzMTcsOCBAQAogCQkJCXN0cnVjdCBtZXRhZGF0YVBhcnRpdGlvbk1hcCAqbWRtID0KIAkJCQkJCShzdHJ1Y3QgbWV0YWRhdGFQYXJ0aXRpb25NYXAgKikKIAkJCQkJCSYobHZkLT5wYXJ0aXRpb25NYXBzW29mZnNldF0pOwotCQkJCXVkZl9kZWJ1ZygiUGFyc2luZyBMb2dpY2FsIHZvbCBwYXJ0ICVkICIKLQkJCQkJInR5cGUgJWQgIGlkPSVzXG4iLCBpLCB0eXBlLAotCQkJCQlVREZfSURfTUVUQURBVEEpOworCQkJCXVkZl9kZWJ1ZygiUGFyc2luZyBMb2dpY2FsIHZvbCBwYXJ0ICVkIHR5cGUgJWQgIGlkPSVzXG4iLAorCQkJCQkgIGksIHR5cGUsIFVERl9JRF9NRVRBREFUQSk7CiAKIAkJCQltYXAtPnNfcGFydGl0aW9uX3R5cGUgPSBVREZfTUVUQURBVEFfTUFQMjU7CiAJCQkJbWFwLT5zX3BhcnRpdGlvbl9mdW5jID0gdWRmX2dldF9wYmxvY2tfbWV0YTI1OwpAQCAtMTM2MSwyNSArMTMzMywyNCBAQAogCQkJCQlsZTMyX3RvX2NwdShtZG0tPmFsbG9jVW5pdFNpemUpOwogCQkJCW1kYXRhLT5zX2FsaWduX3VuaXRfc2l6ZSA9CiAJCQkJCWxlMTZfdG9fY3B1KG1kbS0+YWxpZ25Vbml0U2l6ZSk7Ci0JCQkJbWRhdGEtPnNfZHVwX21kX2ZsYWcgCSA9Ci0JCQkJCW1kbS0+ZmxhZ3MgJiAweDAxOworCQkJCWlmIChtZG0tPmZsYWdzICYgMHgwMSkKKwkJCQkJbWRhdGEtPnNfZmxhZ3MgfD0gTUZfRFVQTElDQVRFX01EOwogCiAJCQkJdWRmX2RlYnVnKCJNZXRhZGF0YSBJZGVudCBzdWZmaXg9MHgleFxuIiwKLQkJCQkJKGxlMTZfdG9fY3B1KAotCQkJCQkgKChfX2xlMTYgKikKLQkJCQkJICAgICAgbWRtLT5wYXJ0SWRlbnQuaWRlbnRTdWZmaXgpWzBdKSkpOworCQkJCQkgIGxlMTZfdG9fY3B1KCooX19sZTE2ICopCisJCQkJCQkgICAgICBtZG0tPnBhcnRJZGVudC5pZGVudFN1ZmZpeCkpOwogCQkJCXVkZl9kZWJ1ZygiTWV0YWRhdGEgcGFydCBudW09JWRcbiIsCi0JCQkJCWxlMTZfdG9fY3B1KG1kbS0+cGFydGl0aW9uTnVtKSk7CisJCQkJCSAgbGUxNl90b19jcHUobWRtLT5wYXJ0aXRpb25OdW0pKTsKIAkJCQl1ZGZfZGVidWcoIk1ldGFkYXRhIHBhcnQgYWxsb2MgdW5pdCBzaXplPSVkXG4iLAotCQkJCQlsZTMyX3RvX2NwdShtZG0tPmFsbG9jVW5pdFNpemUpKTsKKwkJCQkJICBsZTMyX3RvX2NwdShtZG0tPmFsbG9jVW5pdFNpemUpKTsKIAkJCQl1ZGZfZGVidWcoIk1ldGFkYXRhIGZpbGUgbG9jPSVkXG4iLAotCQkJCQlsZTMyX3RvX2NwdShtZG0tPm1ldGFkYXRhRmlsZUxvYykpOworCQkJCQkgIGxlMzJfdG9fY3B1KG1kbS0+bWV0YWRhdGFGaWxlTG9jKSk7CiAJCQkJdWRmX2RlYnVnKCJNaXJyb3IgZmlsZSBsb2M9JWRcbiIsCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG1kbS0+bWV0YWRhdGFNaXJyb3JGaWxlTG9jKSk7CisJCQkJCSAgbGUzMl90b19jcHUobWRtLT5tZXRhZGF0YU1pcnJvckZpbGVMb2MpKTsKIAkJCQl1ZGZfZGVidWcoIkJpdG1hcCBmaWxlIGxvYz0lZFxuIiwKLQkJCQkgICAgICAgbGUzMl90b19jcHUobWRtLT5tZXRhZGF0YUJpdG1hcEZpbGVMb2MpKTsKLQkJCQl1ZGZfZGVidWcoIkR1cGxpY2F0ZSBGbGFnOiAlZCAlZFxuIiwKLQkJCQkJbWRhdGEtPnNfZHVwX21kX2ZsYWcsIG1kbS0+ZmxhZ3MpOworCQkJCQkgIGxlMzJfdG9fY3B1KG1kbS0+bWV0YWRhdGFCaXRtYXBGaWxlTG9jKSk7CisJCQkJdWRmX2RlYnVnKCJGbGFnczogJWQgJWRcbiIsCisJCQkJCSAgbWRhdGEtPnNfZmxhZ3MsIG1kbS0+ZmxhZ3MpOwogCQkJfSBlbHNlIHsKIAkJCQl1ZGZfZGVidWcoIlVua25vd24gaWRlbnQ6ICVzXG4iLAogCQkJCQkgIHVwbTItPnBhcnRJZGVudC5pZGVudCk7CkBAIC0xMzg5LDE2ICsxMzYwLDE1IEBACiAJCQltYXAtPnNfcGFydGl0aW9uX251bSA9IGxlMTZfdG9fY3B1KHVwbTItPnBhcnRpdGlvbk51bSk7CiAJCX0KIAkJdWRmX2RlYnVnKCJQYXJ0aXRpb24gKCVkOiVkKSB0eXBlICVkIG9uIHZvbHVtZSAlZFxuIiwKLQkJCSAgaSwgbWFwLT5zX3BhcnRpdGlvbl9udW0sIHR5cGUsCi0JCQkgIG1hcC0+c192b2x1bWVzZXFudW0pOworCQkJICBpLCBtYXAtPnNfcGFydGl0aW9uX251bSwgdHlwZSwgbWFwLT5zX3ZvbHVtZXNlcW51bSk7CiAJfQogCiAJaWYgKGZpbGVzZXQpIHsKIAkJc3RydWN0IGxvbmdfYWQgKmxhID0gKHN0cnVjdCBsb25nX2FkICopJihsdmQtPmxvZ2ljYWxWb2xDb250ZW50c1VzZVswXSk7CiAKIAkJKmZpbGVzZXQgPSBsZWxiX3RvX2NwdShsYS0+ZXh0TG9jYXRpb24pOwotCQl1ZGZfZGVidWcoIkZpbGVTZXQgZm91bmQgaW4gTG9naWNhbFZvbERlc2MgYXQgYmxvY2s9JWQsICIKLQkJCSAgInBhcnRpdGlvbj0lZFxuIiwgZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtLAorCQl1ZGZfZGVidWcoIkZpbGVTZXQgZm91bmQgaW4gTG9naWNhbFZvbERlc2MgYXQgYmxvY2s9JWQsIHBhcnRpdGlvbj0lZFxuIiwKKwkJCSAgZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtLAogCQkJICBmaWxlc2V0LT5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOwogCX0KIAlpZiAobHZkLT5pbnRlZ3JpdHlTZXFFeHQuZXh0TGVuZ3RoKQpAQCAtMTQ3OCw5ICsxNDQ4LDkgQEAKIAogCQliaCA9IHVkZl9yZWFkX3RhZ2dlZChzYiwgYmxvY2ssIGJsb2NrLCAmaWRlbnQpOwogCQlpZiAoIWJoKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInVkZjogQmxvY2sgJUx1IG9mIHZvbHVtZSBkZXNjcmlwdG9yICIKLQkJCSAgICAgICAic2VxdWVuY2UgaXMgY29ycnVwdGVkIG9yIHdlIGNvdWxkIG5vdCByZWFkICIKLQkJCSAgICAgICAiaXQuXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrKTsKKwkJCXVkZl9lcnIoc2IsCisJCQkJIkJsb2NrICVsbHUgb2Ygdm9sdW1lIGRlc2NyaXB0b3Igc2VxdWVuY2UgaXMgY29ycnVwdGVkIG9yIHdlIGNvdWxkIG5vdCByZWFkIGl0XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2spOwogCQkJcmV0dXJuIDE7CiAJCX0KIApAQCAtMTU1Myw3ICsxNTIzLDcgQEAKIAkgKiBpbiBhIHN1aXRhYmxlIG9yZGVyCiAJICovCiAJaWYgKCF2ZHNbVkRTX1BPU19QUklNQVJZX1ZPTF9ERVNDXS5ibG9jaykgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogUHJpbWFyeSBWb2x1bWUgRGVzY3JpcHRvciBub3QgZm91bmQhXG4iKTsKKwkJdWRmX2VycihzYiwgIlByaW1hcnkgVm9sdW1lIERlc2NyaXB0b3Igbm90IGZvdW5kIVxuIik7CiAJCXJldHVybiAxOwogCX0KIAlpZiAodWRmX2xvYWRfcHZvbGRlc2Moc2IsIHZkc1tWRFNfUE9TX1BSSU1BUllfVk9MX0RFU0NdLmJsb2NrKSkKQEAgLTE3NDAsNyArMTcxMCw3IEBACiAKIAlpZiAoIXNiX3NldF9ibG9ja3NpemUoc2IsIHVvcHQtPmJsb2Nrc2l6ZSkpIHsKIAkJaWYgKCFzaWxlbnQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnM6IEJhZCBibG9jayBzaXplXG4iKTsKKwkJCXVkZl93YXJuKHNiLCAiQmFkIGJsb2NrIHNpemVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJc2JpLT5zX2xhc3RfYmxvY2sgPSB1b3B0LT5sYXN0YmxvY2s7CkBAIC0xNzQ5LDEyICsxNzE5LDExIEBACiAJCW5zcl9vZmYgPSB1ZGZfY2hlY2tfdnNkKHNiKTsKIAkJaWYgKCFuc3Jfb2ZmKSB7CiAJCQlpZiAoIXNpbGVudCkKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnM6IE5vIFZSUyBmb3VuZFxuIik7CisJCQkJdWRmX3dhcm4oc2IsICJObyBWUlMgZm91bmRcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKG5zcl9vZmYgPT0gLTEpCi0JCQl1ZGZfZGVidWcoIkZhaWxlZCB0byByZWFkIGJ5dGUgMzI3NjguIEFzc3VtaW5nIG9wZW4gIgotCQkJCSAgImRpc2MuIFNraXBwaW5nIHZhbGlkaXR5IGNoZWNrXG4iKTsKKwkJCXVkZl9kZWJ1ZygiRmFpbGVkIHRvIHJlYWQgYnl0ZSAzMjc2OC4gQXNzdW1pbmcgb3BlbiBkaXNjLiBTa2lwcGluZyB2YWxpZGl0eSBjaGVja1xuIik7CiAJCWlmICghc2JpLT5zX2xhc3RfYmxvY2spCiAJCQlzYmktPnNfbGFzdF9ibG9jayA9IHVkZl9nZXRfbGFzdF9ibG9jayhzYik7CiAJfSBlbHNlIHsKQEAgLTE3NjUsNyArMTczNCw3IEBACiAJc2JpLT5zX2FuY2hvciA9IHVvcHQtPmFuY2hvcjsKIAlpZiAoIXVkZl9maW5kX2FuY2hvcihzYiwgZmlsZXNldCkpIHsKIAkJaWYgKCFzaWxlbnQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnM6IE5vIGFuY2hvciBmb3VuZFxuIik7CisJCQl1ZGZfd2FybihzYiwgIk5vIGFuY2hvciBmb3VuZFxuIik7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKQEAgLTE5MzcsOCArMTkwNiw3IEBACiAKIAlpZiAodW9wdC5mbGFncyAmICgxIDw8IFVERl9GTEFHX1VURjgpICYmCiAJICAgIHVvcHQuZmxhZ3MgJiAoMSA8PCBVREZfRkxBR19OTFNfTUFQKSkgewotCQl1ZGZfZXJyb3Ioc2IsICJ1ZGZfcmVhZF9zdXBlciIsCi0JCQkgICJ1dGY4IGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGlvY2hhcnNldFxuIik7CisJCXVkZl9lcnIoc2IsICJ1dGY4IGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGlvY2hhcnNldFxuIik7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KICNpZmRlZiBDT05GSUdfVURGX05MUwpAQCAtMTk4NywxNSArMTk1NSwxNCBAQAogCQlyZXQgPSB1ZGZfbG9hZF92cnMoc2IsICZ1b3B0LCBzaWxlbnQsICZmaWxlc2V0KTsKIAkJaWYgKCFyZXQgJiYgdW9wdC5ibG9ja3NpemUgIT0gVURGX0RFRkFVTFRfQkxPQ0tTSVpFKSB7CiAJCQlpZiAoIXNpbGVudCkKLQkJCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJCQkgICAgICAgIlVERi1mczogUmVzY2FubmluZyB3aXRoIGJsb2Nrc2l6ZSAiCi0JCQkJICAgICAgICIlZFxuIiwgVURGX0RFRkFVTFRfQkxPQ0tTSVpFKTsKKwkJCQlwcl9ub3RpY2UoIlJlc2Nhbm5pbmcgd2l0aCBibG9ja3NpemUgJWRcbiIsCisJCQkJCSAgVURGX0RFRkFVTFRfQkxPQ0tTSVpFKTsKIAkJCXVvcHQuYmxvY2tzaXplID0gVURGX0RFRkFVTFRfQkxPQ0tTSVpFOwogCQkJcmV0ID0gdWRmX2xvYWRfdnJzKHNiLCAmdW9wdCwgc2lsZW50LCAmZmlsZXNldCk7CiAJCX0KIAl9CiAJaWYgKCFyZXQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVURGLWZzOiBObyBwYXJ0aXRpb24gZm91bmQgKDEpXG4iKTsKKwkJdWRmX3dhcm4oc2IsICJObyBwYXJ0aXRpb24gZm91bmQgKDEpXG4iKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCkBAIC0yMDEwLDEwICsxOTc3LDkgQEAKIAkJCQlsZTE2X3RvX2NwdShsdmlkaXUtPm1heFVERldyaXRlUmV2KTsgKi8KIAogCQlpZiAobWluVURGUmVhZFJldiA+IFVERl9NQVhfUkVBRF9WRVJTSU9OKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVERi1mczogbWluVURGUmVhZFJldj0leCAiCi0JCQkJCSIobWF4IGlzICV4KVxuIiwKLQkJCSAgICAgICBsZTE2X3RvX2NwdShsdmlkaXUtPm1pblVERlJlYWRSZXYpLAotCQkJICAgICAgIFVERl9NQVhfUkVBRF9WRVJTSU9OKTsKKwkJCXVkZl9lcnIoc2IsICJtaW5VREZSZWFkUmV2PSV4IChtYXggaXMgJXgpXG4iLAorCQkJCWxlMTZfdG9fY3B1KGx2aWRpdS0+bWluVURGUmVhZFJldiksCisJCQkJVURGX01BWF9SRUFEX1ZFUlNJT04pOwogCQkJZ290byBlcnJvcl9vdXQ7CiAJCX0gZWxzZSBpZiAobWluVURGV3JpdGVSZXYgPiBVREZfTUFYX1dSSVRFX1ZFUlNJT04pCiAJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CkBAIC0yMDI3LDI4ICsxOTkzLDI3IEBACiAJfQogCiAJaWYgKCFzYmktPnNfcGFydGl0aW9ucykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnM6IE5vIHBhcnRpdGlvbiBmb3VuZCAoMilcbiIpOworCQl1ZGZfd2FybihzYiwgIk5vIHBhcnRpdGlvbiBmb3VuZCAoMilcbiIpOwogCQlnb3RvIGVycm9yX291dDsKIAl9CiAKIAlpZiAoc2JpLT5zX3BhcnRtYXBzW3NiaS0+c19wYXJ0aXRpb25dLnNfcGFydGl0aW9uX2ZsYWdzICYKIAkJCVVERl9QQVJUX0ZMQUdfUkVBRF9PTkxZKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiVURGLWZzOiBQYXJ0aXRpb24gbWFya2VkIHJlYWRvbmx5OyAiCi0JCQkJICAgImZvcmNpbmcgcmVhZG9ubHkgbW91bnRcbiIpOworCQlwcl9ub3RpY2UoIlBhcnRpdGlvbiBtYXJrZWQgcmVhZG9ubHk7IGZvcmNpbmcgcmVhZG9ubHkgbW91bnRcbiIpOwogCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJfQogCiAJaWYgKHVkZl9maW5kX2ZpbGVzZXQoc2IsICZmaWxlc2V0LCAmcm9vdGRpcikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVURGLWZzOiBObyBmaWxlc2V0IGZvdW5kXG4iKTsKKwkJdWRmX3dhcm4oc2IsICJObyBmaWxlc2V0IGZvdW5kXG4iKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCiAJaWYgKCFzaWxlbnQpIHsKIAkJc3RydWN0IHRpbWVzdGFtcCB0czsKIAkJdWRmX3RpbWVfdG9fZGlza19zdGFtcCgmdHMsIHNiaS0+c19yZWNvcmRfdGltZSk7Ci0JCXVkZl9pbmZvKCJVREY6IE1vdW50aW5nIHZvbHVtZSAnJXMnLCAiCi0JCQkgInRpbWVzdGFtcCAlMDR1LyUwMnUvJTAydSAlMDJ1OiUwMnUgKCV4KVxuIiwKLQkJCSBzYmktPnNfdm9sdW1lX2lkZW50LCBsZTE2X3RvX2NwdSh0cy55ZWFyKSwgdHMubW9udGgsIHRzLmRheSwKKwkJdWRmX2luZm8oIk1vdW50aW5nIHZvbHVtZSAnJXMnLCB0aW1lc3RhbXAgJTA0dS8lMDJ1LyUwMnUgJTAydTolMDJ1ICgleClcbiIsCisJCQkgc2JpLT5zX3ZvbHVtZV9pZGVudCwKKwkJCSBsZTE2X3RvX2NwdSh0cy55ZWFyKSwgdHMubW9udGgsIHRzLmRheSwKIAkJCSB0cy5ob3VyLCB0cy5taW51dGUsIGxlMTZfdG9fY3B1KHRzLnR5cGVBbmRUaW1lem9uZSkpOwogCX0KIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCkBAIC0yMDU5LDggKzIwMjQsNyBAQAogCS8qIHBlcmhhcHMgaXQncyBub3QgZXh0ZW5zaWJsZSBlbm91Z2gsIGJ1dCBmb3Igbm93IC4uLiAqLwogCWlub2RlID0gdWRmX2lnZXQoc2IsICZyb290ZGlyKTsKIAlpZiAoIWlub2RlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVURGLWZzOiBFcnJvciBpbiB1ZGZfaWdldCwgYmxvY2s9JWQsICIKLQkJCQkicGFydGl0aW9uPSVkXG4iLAorCQl1ZGZfZXJyKHNiLCAiRXJyb3IgaW4gdWRmX2lnZXQsIGJsb2NrPSVkLCBwYXJ0aXRpb249JWRcbiIsCiAJCSAgICAgICByb290ZGlyLmxvZ2ljYWxCbG9ja051bSwgcm9vdGRpci5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOwogCQlnb3RvIGVycm9yX291dDsKIAl9CkBAIC0yMDY4LDcgKzIwMzIsNyBAQAogCS8qIEFsbG9jYXRlIGEgZGVudHJ5IGZvciB0aGUgcm9vdCBpbm9kZSAqLwogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwogCWlmICghc2ItPnNfcm9vdCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVERi1mczogQ291bGRuJ3QgYWxsb2NhdGUgcm9vdCBkZW50cnlcbiIpOworCQl1ZGZfZXJyKHNiLCAiQ291bGRuJ3QgYWxsb2NhdGUgcm9vdCBkZW50cnlcbiIpOwogCQlpcHV0KGlub2RlKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQpAQCAtMjA5NiwzMiArMjA2MCw0MCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgdm9pZCB1ZGZfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQordm9pZCBfdWRmX2VycihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKLQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKLQkJLyogbWFyayBzYiBlcnJvciAqLworCS8qIG1hcmsgc2IgZXJyb3IgKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCiAJCXNiLT5zX2RpcnQgPSAxOwotCX0KKwogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNucHJpbnRmKGVycm9yX2J1Ziwgc2l6ZW9mKGVycm9yX2J1ZiksIGZtdCwgYXJncyk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJfZXJyKCJlcnJvciAoZGV2aWNlICVzKTogJXM6ICVwViIsIHNiLT5zX2lkLCBmdW5jdGlvbiwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiVURGLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczogJXNcbiIsCi0JCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyb3JfYnVmKTsKIH0KIAotdm9pZCB1ZGZfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKLQkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQordm9pZCBfdWRmX3dhcm4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogeworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNucHJpbnRmKGVycm9yX2J1Ziwgc2l6ZW9mKGVycm9yX2J1ZiksIGZtdCwgYXJncyk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJfd2Fybigid2FybmluZyAoZGV2aWNlICVzKTogJXM6ICVwViIsIHNiLT5zX2lkLCBmdW5jdGlvbiwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiVURGLWZzIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAlc1xuIiwKLQkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOwogfQogCiBzdGF0aWMgdm9pZCB1ZGZfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC0yMjEzLDExICsyMTg1LDExIEBACiAJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKHNiLCAmbG9jLCAwLCAmaWRlbnQpOwogCiAJaWYgKCFiaCkgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX2NvdW50X2ZyZWUgZmFpbGVkXG4iKTsKKwkJdWRmX2VycihzYiwgInVkZl9jb3VudF9mcmVlIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAoaWRlbnQgIT0gVEFHX0lERU5UX1NCRCkgewogCQlicmVsc2UoYmgpOwotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX2NvdW50X2ZyZWUgZmFpbGVkXG4iKTsKKwkJdWRmX2VycihzYiwgInVkZl9jb3VudF9mcmVlIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvdWRmL3RydW5jYXRlLmMgYi9mcy91ZGYvdHJ1bmNhdGUuYwppbmRleCA4NDI0MzA4Li40Yjk4ZmVlIDEwMDY0NAotLS0gYS9mcy91ZGYvdHJ1bmNhdGUuYworKysgYi9mcy91ZGYvdHJ1bmNhdGUuYwpAQCAtOTUsMjMgKzk1LDIxIEBACiAJCWxiY291bnQgKz0gZWxlbjsKIAkJaWYgKGxiY291bnQgPiBpbm9kZS0+aV9zaXplKSB7CiAJCQlpZiAobGJjb3VudCAtIGlub2RlLT5pX3NpemUgPj0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkgICAgICAgInVkZl90cnVuY2F0ZV90YWlsX2V4dGVudCgpOiBUb28gbG9uZyAiCi0JCQkJICAgICAgICJleHRlbnQgYWZ0ZXIgRU9GIGluIGlub2RlICV1OiBpX3NpemU6ICIKLQkJCQkgICAgICAgIiVMZCBsYmNvdW50OiAlTGQgZXh0ZW50ICV1KyV1XG4iLAotCQkJCSAgICAgICAodW5zaWduZWQpaW5vZGUtPmlfaW5vLAotCQkJCSAgICAgICAobG9uZyBsb25nKWlub2RlLT5pX3NpemUsCi0JCQkJICAgICAgIChsb25nIGxvbmcpbGJjb3VudCwKLQkJCQkgICAgICAgKHVuc2lnbmVkKWVsb2MubG9naWNhbEJsb2NrTnVtLAotCQkJCSAgICAgICAodW5zaWduZWQpZWxlbik7CisJCQkJdWRmX3dhcm4oaW5vZGUtPmlfc2IsCisJCQkJCSAiVG9vIGxvbmcgZXh0ZW50IGFmdGVyIEVPRiBpbiBpbm9kZSAldTogaV9zaXplOiAlbGxkIGxiY291bnQ6ICVsbGQgZXh0ZW50ICV1KyV1XG4iLAorCQkJCQkgKHVuc2lnbmVkKWlub2RlLT5pX2lubywKKwkJCQkJIChsb25nIGxvbmcpaW5vZGUtPmlfc2l6ZSwKKwkJCQkJIChsb25nIGxvbmcpbGJjb3VudCwKKwkJCQkJICh1bnNpZ25lZCllbG9jLmxvZ2ljYWxCbG9ja051bSwKKwkJCQkJICh1bnNpZ25lZCllbGVuKTsKIAkJCW5lbGVuID0gZWxlbiAtIChsYmNvdW50IC0gaW5vZGUtPmlfc2l6ZSk7CiAJCQllcG9zLm9mZnNldCAtPSBhZHNpemU7CiAJCQlleHRlbnRfdHJ1bmMoaW5vZGUsICZlcG9zLCAmZWxvYywgZXR5cGUsIGVsZW4sIG5lbGVuKTsKIAkJCWVwb3Mub2Zmc2V0ICs9IGFkc2l6ZTsKIAkJCWlmICh1ZGZfbmV4dF9hZXh0KGlub2RlLCAmZXBvcywgJmVsb2MsICZlbGVuLCAxKSAhPSAtMSkKLQkJCQlwcmludGsoS0VSTl9FUlIgInVkZl90cnVuY2F0ZV90YWlsX2V4dGVudCgpOiAiCi0JCQkJICAgICAgICJFeHRlbnQgYWZ0ZXIgRU9GIGluIGlub2RlICV1LlxuIiwKLQkJCQkgICAgICAgKHVuc2lnbmVkKWlub2RlLT5pX2lubyk7CisJCQkJdWRmX2Vycihpbm9kZS0+aV9zYiwKKwkJCQkJIkV4dGVudCBhZnRlciBFT0YgaW4gaW5vZGUgJXVcbiIsCisJCQkJCSh1bnNpZ25lZClpbm9kZS0+aV9pbm8pOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy91ZGYvdWRmX3NiLmggYi9mcy91ZGYvdWRmX3NiLmgKaW5kZXggNDg1OGMxOS4uNTE0MmE4MiAxMDA2NDQKLS0tIGEvZnMvdWRmL3VkZl9zYi5oCisrKyBiL2ZzL3VkZi91ZGZfc2IuaApAQCAtNTQsMTMgKzU0LDE2IEBACiAKICNwcmFnbWEgcGFjaygxKSAvKiBYWFgoaGNoKTogV2h5PyAgVGhpcyBmaWxlIGp1c3QgZGVmaW5lcyBpbi1jb3JlIHN0cnVjdHVyZXMgKi8KIAorI2RlZmluZSBNRl9EVVBMSUNBVEVfTUQJCTB4MDEKKyNkZWZpbmUgTUZfTUlSUk9SX0ZFX0xPQURFRAkweDAyCisKIHN0cnVjdCB1ZGZfbWV0YV9kYXRhIHsKIAlfX3UzMglzX21ldGFfZmlsZV9sb2M7CiAJX191MzIJc19taXJyb3JfZmlsZV9sb2M7CiAJX191MzIJc19iaXRtYXBfZmlsZV9sb2M7CiAJX191MzIJc19hbGxvY191bml0X3NpemU7CiAJX191MTYJc19hbGlnbl91bml0X3NpemU7Ci0JX191OCAJc19kdXBfbWRfZmxhZzsKKwlpbnQJc19mbGFnczsKIAlzdHJ1Y3QgaW5vZGUgKnNfbWV0YWRhdGFfZmU7CiAJc3RydWN0IGlub2RlICpzX21pcnJvcl9mZTsKIAlzdHJ1Y3QgaW5vZGUgKnNfYml0bWFwX2ZlOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3VkZmRlY2wuaCBiL2ZzL3VkZi91ZGZkZWNsLmgKaW5kZXggZGJkNTJkNGIuLmYzNGU2ZmMgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi91ZGZkZWNsLmgKKysrIGIvZnMvdWRmL3VkZmRlY2wuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX19VREZfREVDTF9ICiAjZGVmaW5lIF9fVURGX0RFQ0xfSAogCisjZGVmaW5lIHByX2ZtdChmbXQpICJVREYtZnM6ICIgZm10CisKICNpbmNsdWRlICJlY21hXzE2Ny5oIgogI2luY2x1ZGUgIm9zdGFfdWRmLmgiCiAKQEAgLTE2LDIzICsxOCwzMCBAQAogI2RlZmluZSBVREZfUFJFQUxMT0NBVEUKICNkZWZpbmUgVURGX0RFRkFVTFRfUFJFQUxMT0NfQkxPQ0tTCTgKIAorZXh0ZXJuIF9fcHJpbnRmKDMsIDQpIHZvaWQgX3VkZl9lcnIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyNkZWZpbmUgdWRmX2VycihzYiwgZm10LCAuLi4pCQkJCQlcCisJX3VkZl9lcnIoc2IsIF9fZnVuY19fLCBmbXQsICMjX19WQV9BUkdTX18pCisKK2V4dGVybiBfX3ByaW50ZigzLCA0KSB2b2lkIF91ZGZfd2FybihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQljb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworI2RlZmluZSB1ZGZfd2FybihzYiwgZm10LCAuLi4pCQkJCQlcCisJX3VkZl93YXJuKHNiLCBfX2Z1bmNfXywgZm10LCAjI19fVkFfQVJHU19fKQorCisjZGVmaW5lIHVkZl9pbmZvKGZtdCwgLi4uKQkJCQkJXAorCXByX2luZm8oIklORk8gIiBmbXQsICMjX19WQV9BUkdTX18pCisKICN1bmRlZiBVREZGU19ERUJVRwogCiAjaWZkZWYgVURGRlNfREVCVUcKLSNkZWZpbmUgdWRmX2RlYnVnKGYsIGEuLi4pIFwKLWRvIHsgXAotCXByaW50ayhLRVJOX0RFQlVHICJVREYtZnMgREVCVUcgJXM6JWQ6JXM6ICIsIFwKLQkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7IFwKLQlwcmludGsoZiwgIyNhKTsgXAotfSB3aGlsZSAoMCkKKyNkZWZpbmUgdWRmX2RlYnVnKGZtdCwgLi4uKQkJCQkJXAorCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdCgiJXM6JWQ6JXM6ICIgZm10KSwJCVwKKwkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXykKICNlbHNlCi0jZGVmaW5lIHVkZl9kZWJ1ZyhmLCBhLi4uKSAvKiovCisjZGVmaW5lIHVkZl9kZWJ1ZyhmbXQsIC4uLikJCQkJCVwKKwlub19wcmludGsoZm10LCAjI19fVkFfQVJHU19fKQogI2VuZGlmCiAKLSNkZWZpbmUgdWRmX2luZm8oZiwgYS4uLikgXAotCXByaW50ayhLRVJOX0lORk8gIlVERi1mcyBJTkZPICIgZiwgIyNhKTsKLQotCiAjZGVmaW5lIHVkZl9maXhlZF90b192YXJpYWJsZSh4KSAoICggKCAoeCkgPj4gNSApICogMzkgKSArICggKHgpICYgMHgwMDAwMDAxRiApICkKICNkZWZpbmUgdWRmX3ZhcmlhYmxlX3RvX2ZpeGVkKHgpICggKCAoICh4KSAvIDM5ICkgPDwgNSApICsgKCAoeCkgJSAzOSApICkKIApAQCAtMTEyLDggKzEyMSw2IEBACiAKIC8qIHN1cGVyLmMgKi8KIAotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKQotZXh0ZXJuIHZvaWQgdWRmX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogc3RhdGljIGlubGluZSB2b2lkIHVkZl91cGRhdGVkX2x2aWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gVURGX1NCKHNiKS0+c19sdmlkX2JoOwpAQCAtMTI2LDYgKzEzMyw4IEBACiAJVURGX1NCKHNiKS0+c19sdmlkX2RpcnR5ID0gMTsKIH0KIGV4dGVybiB1NjQgbHZpZF9nZXRfdW5pcXVlX2lkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RydWN0IGlub2RlICp1ZGZfZmluZF9tZXRhZGF0YV9pbm9kZV9lZmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJdTMyIG1ldGFfZmlsZV9sb2MsIHUzMiBwYXJ0aXRpb25fbnVtKTsKIAogLyogbmFtZWkuYyAqLwogZXh0ZXJuIGludCB1ZGZfd3JpdGVfZmkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGVJZGVudERlc2MgKiwKZGlmZiAtLWdpdCBhL2ZzL3VkZi91ZGZ0aW1lLmMgYi9mcy91ZGYvdWRmdGltZS5jCmluZGV4IGI4YzgyOGMuLjFmMTE0ODMgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi91ZGZ0aW1lLmMKKysrIGIvZnMvdWRmL3VkZnRpbWUuYwpAQCAtMzQsOSArMzQsMTAgQEAKICAqIGh0dHA6Ly93d3cuYm91bGRlci5uaXN0Lmdvdi90aW1lZnJlcS9wdWJzL2J1bGxldGluL2xlYXBzZWNvbmQuaHRtCiAgKi8KIAorI2luY2x1ZGUgInVkZmRlY2wuaCIKKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSAidWRmZGVjbC5oIgogCiAjZGVmaW5lIEVQT0NIX1lFQVIgMTk3MAogCmRpZmYgLS1naXQgYS9mcy91ZGYvdW5pY29kZS5jIGIvZnMvdWRmL3VuaWNvZGUuYwppbmRleCBkMDNhOTBiLi40NGI4MTVlIDEwMDY0NAotLS0gYS9mcy91ZGYvdW5pY29kZS5jCisrKyBiL2ZzL3VkZi91bmljb2RlLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCWNtcF9pZCA9IG9jdV9pLT51X2NtcElEOwogCWlmIChjbXBfaWQgIT0gOCAmJiBjbXBfaWQgIT0gMTYpIHsKIAkJbWVtc2V0KHV0Zl9vLCAwLCBzaXplb2Yoc3RydWN0IHVzdHIpKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVua25vd24gY29tcHJlc3Npb24gY29kZSAoJWQpIHN0cmk9JXNcbiIsCisJCXByX2VycigidW5rbm93biBjb21wcmVzc2lvbiBjb2RlICglZCkgc3RyaT0lc1xuIiwKIAkJICAgICAgIGNtcF9pZCwgb2N1X2ktPnVfbmFtZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI0Miw3ICsyNDIsNyBAQAogCWlmICh1dGZfY250KSB7CiBlcnJvcl9vdXQ6CiAJCW9jdVsrK3VfbGVuXSA9ICc/JzsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInVkZjogYmFkIFVURi04IGNoYXJhY3RlclxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdCgiYmFkIFVURi04IGNoYXJhY3RlclxuIikpOwogCX0KIAogCW9jdVtsZW5ndGggLSAxXSA9ICh1aW50OF90KXVfbGVuICsgMTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCWNtcF9pZCA9IG9jdV9pLT51X2NtcElEOwogCWlmIChjbXBfaWQgIT0gOCAmJiBjbXBfaWQgIT0gMTYpIHsKIAkJbWVtc2V0KHV0Zl9vLCAwLCBzaXplb2Yoc3RydWN0IHVzdHIpKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVua25vd24gY29tcHJlc3Npb24gY29kZSAoJWQpIHN0cmk9JXNcbiIsCisJCXByX2VycigidW5rbm93biBjb21wcmVzc2lvbiBjb2RlICglZCkgc3RyaT0lc1xuIiwKIAkJICAgICAgIGNtcF9pZCwgb2N1X2ktPnVfbmFtZSk7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3Vmcy9pYWxsb2MuYyBiL2ZzL3Vmcy9pYWxsb2MuYwppbmRleCAyZWFiZjA0Li43OGE0YzcwIDEwMDY0NAotLS0gYS9mcy91ZnMvaWFsbG9jLmMKKysrIGIvZnMvdWZzL2lhbGxvYy5jCkBAIC0zNDEsNyArMzQxLDcgQEAKIAogZmFpbF9yZW1vdmVfaW5vZGU6CiAJdW5sb2NrX3N1cGVyKHNiKTsKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJY2xlYXJfbmxpbmsoaW5vZGUpOwogCWlwdXQoaW5vZGUpOwogCVVGU0QoIkVYSVQgKEZBSUxFRCk6IGVyciAlZFxuIiwgZXJyKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL2lub2RlLmMgYi9mcy91ZnMvaW5vZGUuYwppbmRleCBiNGQ3OTFhLi44NzliMTM0IDEwMDY0NAotLS0gYS9mcy91ZnMvaW5vZGUuYworKysgYi9mcy91ZnMvaW5vZGUuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJICogQ29weSBkYXRhIHRvIHRoZSBpbi1jb3JlIGlub2RlLgogCSAqLwogCWlub2RlLT5pX21vZGUgPSBtb2RlID0gZnMxNl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfbW9kZSk7Ci0JaW5vZGUtPmlfbmxpbmsgPSBmczE2X3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9ubGluayk7CisJc2V0X25saW5rKGlub2RlLCBmczE2X3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9ubGluaykpOwogCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7CiAJCXVmc19lcnJvciAoc2IsICJ1ZnNfcmVhZF9pbm9kZSIsICJpbm9kZSAlbHUgaGFzIHplcm8gbmxpbmtcbiIsIGlub2RlLT5pX2lubyk7CiAJCXJldHVybiAtMTsKQEAgLTYzNyw3ICs2MzcsNyBAQAogCSAqIENvcHkgZGF0YSB0byB0aGUgaW4tY29yZSBpbm9kZS4KIAkgKi8KIAlpbm9kZS0+aV9tb2RlID0gbW9kZSA9IGZzMTZfdG9fY3B1KHNiLCB1ZnMyX2lub2RlLT51aV9tb2RlKTsKLQlpbm9kZS0+aV9ubGluayA9IGZzMTZfdG9fY3B1KHNiLCB1ZnMyX2lub2RlLT51aV9ubGluayk7CisJc2V0X25saW5rKGlub2RlLCBmczE2X3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfbmxpbmspKTsKIAlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgewogCQl1ZnNfZXJyb3IgKHNiLCAidWZzX3JlYWRfaW5vZGUiLCAiaW5vZGUgJWx1IGhhcyB6ZXJvIG5saW5rXG4iLCBpbm9kZS0+aV9pbm8pOwogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9mcy91ZnMvdWZzLmggYi9mcy91ZnMvdWZzLmgKaW5kZXggNWJlMjc1NS4uYzI2ZjJiY2UgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy91ZnMuaAorKysgYi9mcy91ZnMvdWZzLmgKQEAgLTExNyw5ICsxMTcsMTIgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVmc19kaXJfb3BlcmF0aW9uczsKIAogLyogc3VwZXIuYyAqLwotZXh0ZXJuIHZvaWQgdWZzX3dhcm5pbmcgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gdm9pZCB1ZnNfZXJyb3IgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gdm9pZCB1ZnNfcGFuaWMgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgdWZzX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDMsIDQpCit2b2lkIHVmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgdWZzX3BhbmljKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKIAogLyogc3ltbGluay5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWZzX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hbGxvYy5jIGIvZnMveGZzL3hmc19hbGxvYy5jCmluZGV4IGJkZDljYjUuLmNlODRmZmQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWxsb2MuYworKysgYi9mcy94ZnMveGZzX2FsbG9jLmMKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCUFTU0VSVCgheGZzX2J1Zl9nZXRlcnJvcihicCkpOwotCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19BR0ZMLCBYRlNfQUdGTF9SRUYpOworCXhmc19idWZfc2V0X3JlZihicCwgWEZTX0FHRkxfUkVGKTsKIAkqYnBwID0gYnA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTM5LDcgKzIxMzksNyBAQAogCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCAqYnBwKTsKIAkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogCX0KLQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoKmJwcCwgQl9GU19BR0YsIFhGU19BR0ZfUkVGKTsKKwl4ZnNfYnVmX3NldF9yZWYoKmJwcCwgWEZTX0FHRl9SRUYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FvcHMuYyBiL2ZzL3hmcy94ZnNfYW9wcy5jCmluZGV4IDhjMzdkZGUuLjU3NGQ0ZWUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfYW9wcy5jCkBAIC0zOCw0MCArMzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KIAotCi0vKgotICogUHJpbWUgbnVtYmVyIG9mIGhhc2ggYnVja2V0cyBzaW5jZSBhZGRyZXNzIGlzIHVzZWQgYXMgdGhlIGtleS4KLSAqLwotI2RlZmluZSBOVlNZTkMJCTM3Ci0jZGVmaW5lIHRvX2lvZW5kX3dxKHYpCSgmeGZzX2lvZW5kX3dxWygodW5zaWduZWQgbG9uZyl2KSAlIE5WU1lOQ10pCi1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgeGZzX2lvZW5kX3dxW05WU1lOQ107Ci0KLXZvaWQgX19pbml0Ci14ZnNfaW9lbmRfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE5WU1lOQzsgaSsrKQotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ4ZnNfaW9lbmRfd3FbaV0pOwotfQotCi12b2lkCi14ZnNfaW9lbmRfd2FpdCgKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKndxID0gdG9faW9lbmRfd3EoaXApOwotCi0Jd2FpdF9ldmVudCgqd3EsIChhdG9taWNfcmVhZCgmaXAtPmlfaW9jb3VudCkgPT0gMCkpOwotfQotCi1TVEFUSUMgdm9pZAoteGZzX2lvZW5kX3dha2UoCi0JeGZzX2lub2RlX3QJKmlwKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpcC0+aV9pb2NvdW50KSkKLQkJd2FrZV91cCh0b19pb2VuZF93cShpcCkpOwotfQotCiB2b2lkCiB4ZnNfY291bnRfcGFnZV9zdGF0ZSgKIAlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCkBAIC0xMTUsMjUgKzgxLDIwIEBACiAJeGZzX2lvZW5kX3QJCSppb2VuZCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqbmV4dDsKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlvZW5kLT5pb19pbm9kZSk7CiAKIAlmb3IgKGJoID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOyBiaDsgYmggPSBuZXh0KSB7CiAJCW5leHQgPSBiaC0+Yl9wcml2YXRlOwogCQliaC0+Yl9lbmRfaW8oYmgsICFpb2VuZC0+aW9fZXJyb3IpOwogCX0KIAotCS8qCi0JICogVm9sdW1lIG1hbmFnZXJzIHN1cHBvcnRpbmcgbXVsdGlwbGUgcGF0aHMgY2FuIHNlbmQgYmFjayBFTk9ERVYKLQkgKiB3aGVuIHRoZSBmaW5hbCBwYXRoIGRpc2FwcGVhcnMuICBJbiB0aGlzIGNhc2UgY29udGludWluZyB0byBmaWxsCi0JICogdGhlIHBhZ2UgY2FjaGUgd2l0aCBkaXJ0eSBkYXRhIHdoaWNoIGNhbm5vdCBiZSB3cml0dGVuIG91dCBpcwotCSAqIGV2aWwsIHNvIHByZXZlbnQgdGhhdC4KLQkgKi8KLQlpZiAodW5saWtlbHkoaW9lbmQtPmlvX2Vycm9yID09IC1FTk9ERVYpKSB7Ci0JCXhmc19kb19mb3JjZV9zaHV0ZG93bihpcC0+aV9tb3VudCwgU0hVVERPV05fREVWSUNFX1JFUSwKLQkJCQkgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOworCWlmIChpb2VuZC0+aW9faW9jYikgeworCQlpZiAoaW9lbmQtPmlvX2lzYXN5bmMpIHsKKwkJCWFpb19jb21wbGV0ZShpb2VuZC0+aW9faW9jYiwgaW9lbmQtPmlvX2Vycm9yID8KKwkJCQkJaW9lbmQtPmlvX2Vycm9yIDogaW9lbmQtPmlvX3Jlc3VsdCwgMCk7CisJCX0KKwkJaW5vZGVfZGlvX2RvbmUoaW9lbmQtPmlvX2lub2RlKTsKIAl9CiAKLQl4ZnNfaW9lbmRfd2FrZShpcCk7CiAJbWVtcG9vbF9mcmVlKGlvZW5kLCB4ZnNfaW9lbmRfcG9vbCk7CiB9CiAKQEAgLTE1Niw2ICsxMTcsMTUgQEAKIH0KIAogLyoKKyAqIEZhc3QgYW5kIGxvb3NlIGNoZWNrIGlmIHRoaXMgd3JpdGUgY291bGQgdXBkYXRlIHRoZSBvbi1kaXNrIGlub2RlIHNpemUuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCB4ZnNfaW9lbmRfaXNfYXBwZW5kKHN0cnVjdCB4ZnNfaW9lbmQgKmlvZW5kKQoreworCXJldHVybiBpb2VuZC0+aW9fb2Zmc2V0ICsgaW9lbmQtPmlvX3NpemUgPgorCQlYRlNfSShpb2VuZC0+aW9faW5vZGUpLT5pX2QuZGlfc2l6ZTsKK30KKworLyoKICAqIFVwZGF0ZSBvbi1kaXNrIGZpbGUgc2l6ZSBub3cgdGhhdCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdG8gZGlzay4gIFRoZQogICogY3VycmVudCBpbi1tZW1vcnkgZmlsZSBzaXplIGlzIGlfc2l6ZS4gIElmIGEgd3JpdGUgaXMgYmV5b25kIGVvZiBpX25ld19zaXplCiAgKiB3aWxsIGJlIHRoZSBpbnRlbmRlZCBmaWxlIHNpemUgdW50aWwgaV9zaXplIGlzIHVwZGF0ZWQuICBJZiB0aGlzIHdyaXRlIGRvZXMKQEAgLTE3Myw5ICsxNDMsNiBAQAogCXhmc19pbm9kZV90CQkqaXAgPSBYRlNfSShpb2VuZC0+aW9faW5vZGUpOwogCXhmc19mc2l6ZV90CQlpc2l6ZTsKIAotCWlmICh1bmxpa2VseShpb2VuZC0+aW9fZXJyb3IpKQotCQlyZXR1cm4gMDsKLQogCWlmICgheGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX0VYQ0wpKQogCQlyZXR1cm4gRUFHQUlOOwogCkBAIC0xOTIsNiArMTU5LDkgQEAKIAogLyoKICAqIFNjaGVkdWxlIElPIGNvbXBsZXRpb24gaGFuZGxpbmcgb24gdGhlIGZpbmFsIHB1dCBvZiBhbiBpb2VuZC4KKyAqCisgKiBJZiB0aGVyZSBpcyBubyB3b3JrIHRvIGRvIHdlIG1pZ2h0IGFzIHdlbGwgY2FsbCBpdCBhIGRheSBhbmQgZnJlZSB0aGUKKyAqIGlvZW5kIHJpZ2h0IG5vdy4KICAqLwogU1RBVElDIHZvaWQKIHhmc19maW5pc2hfaW9lbmQoCkBAIC0yMDAsOCArMTcwLDEwIEBACiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlvZW5kLT5pb19yZW1haW5pbmcpKSB7CiAJCWlmIChpb2VuZC0+aW9fdHlwZSA9PSBJT19VTldSSVRURU4pCiAJCQlxdWV1ZV93b3JrKHhmc2NvbnZlcnRkX3dvcmtxdWV1ZSwgJmlvZW5kLT5pb193b3JrKTsKLQkJZWxzZQorCQllbHNlIGlmICh4ZnNfaW9lbmRfaXNfYXBwZW5kKGlvZW5kKSkKIAkJCXF1ZXVlX3dvcmsoeGZzZGF0YWRfd29ya3F1ZXVlLCAmaW9lbmQtPmlvX3dvcmspOworCQllbHNlCisJCQl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7CiAJfQogfQogCkBAIC0yMTYsMTcgKzE4OCwyNCBAQAogCXN0cnVjdCB4ZnNfaW5vZGUgKmlwID0gWEZTX0koaW9lbmQtPmlvX2lub2RlKTsKIAlpbnQJCWVycm9yID0gMDsKIAorCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkgeworCQlpb2VuZC0+aW9fZXJyb3IgPSAtRUlPOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChpb2VuZC0+aW9fZXJyb3IpCisJCWdvdG8gZG9uZTsKKwogCS8qCiAJICogRm9yIHVud3JpdHRlbiBleHRlbnRzIHdlIG5lZWQgdG8gaXNzdWUgdHJhbnNhY3Rpb25zIHRvIGNvbnZlcnQgYQogCSAqIHJhbmdlIHRvIG5vcm1hbCB3cml0dGVuIGV4dGVucyBhZnRlciB0aGUgZGF0YSBJL08gaGFzIGZpbmlzaGVkLgogCSAqLwotCWlmIChpb2VuZC0+aW9fdHlwZSA9PSBJT19VTldSSVRURU4gJiYKLQkgICAgbGlrZWx5KCFpb2VuZC0+aW9fZXJyb3IgJiYgIVhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKSkgewotCisJaWYgKGlvZW5kLT5pb190eXBlID09IElPX1VOV1JJVFRFTikgewogCQllcnJvciA9IHhmc19pb21hcF93cml0ZV91bndyaXR0ZW4oaXAsIGlvZW5kLT5pb19vZmZzZXQsCiAJCQkJCQkgaW9lbmQtPmlvX3NpemUpOwotCQlpZiAoZXJyb3IpCi0JCQlpb2VuZC0+aW9fZXJyb3IgPSBlcnJvcjsKKwkJaWYgKGVycm9yKSB7CisJCQlpb2VuZC0+aW9fZXJyb3IgPSAtZXJyb3I7CisJCQlnb3RvIGRvbmU7CisJCX0KIAl9CiAKIAkvKgpAQCAtMjM2LDYgKzIxNSw3IEBACiAJZXJyb3IgPSB4ZnNfc2V0ZmlsZXNpemUoaW9lbmQpOwogCUFTU0VSVCghZXJyb3IgfHwgZXJyb3IgPT0gRUFHQUlOKTsKIAorZG9uZToKIAkvKgogCSAqIElmIHdlIGRpZG4ndCBjb21wbGV0ZSBwcm9jZXNzaW5nIG9mIHRoZSBpb2VuZCwgcmVxdWV1ZSBpdCB0byB0aGUKIAkgKiB0YWlsIG9mIHRoZSB3b3JrcXVldWUgZm9yIGFub3RoZXIgYXR0ZW1wdCBsYXRlci4gT3RoZXJ3aXNlIGRlc3Ryb3kKQEAgLTI0Nyw4ICsyMjcsNiBAQAogCQkvKiBlbnN1cmUgd2UgZG9uJ3Qgc3BpbiBvbiBibG9ja2VkIGlvZW5kcyAqLwogCQlkZWxheSgxKTsKIAl9IGVsc2UgewotCQlpZiAoaW9lbmQtPmlvX2lvY2IpCi0JCQlhaW9fY29tcGxldGUoaW9lbmQtPmlvX2lvY2IsIGlvZW5kLT5pb19yZXN1bHQsIDApOwogCQl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7CiAJfQogfQpAQCAtMjg1LDEzICsyNjMsMTMgQEAKIAkgKiBhbGwgdGhlIEkvTyBmcm9tIGNhbGxpbmcgdGhlIGNvbXBsZXRpb24gcm91dGluZSB0b28gZWFybHkuCiAJICovCiAJYXRvbWljX3NldCgmaW9lbmQtPmlvX3JlbWFpbmluZywgMSk7CisJaW9lbmQtPmlvX2lzYXN5bmMgPSAwOwogCWlvZW5kLT5pb19lcnJvciA9IDA7CiAJaW9lbmQtPmlvX2xpc3QgPSBOVUxMOwogCWlvZW5kLT5pb190eXBlID0gdHlwZTsKIAlpb2VuZC0+aW9faW5vZGUgPSBpbm9kZTsKIAlpb2VuZC0+aW9fYnVmZmVyX2hlYWQgPSBOVUxMOwogCWlvZW5kLT5pb19idWZmZXJfdGFpbCA9IE5VTEw7Ci0JYXRvbWljX2luYygmWEZTX0koaW9lbmQtPmlvX2lub2RlKS0+aV9pb2NvdW50KTsKIAlpb2VuZC0+aW9fb2Zmc2V0ID0gMDsKIAlpb2VuZC0+aW9fc2l6ZSA9IDA7CiAJaW9lbmQtPmlvX2lvY2IgPSBOVUxMOwpAQCAtMzM3LDggKzMxNSw4IEBACiAJCWNvdW50ID0gbXAtPm1fbWF4aW9mZnNldCAtIG9mZnNldDsKIAllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIGNvdW50KTsKIAlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKLQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwgZW5kX2ZzYiAtIG9mZnNldF9mc2IsCi0JCQkgIGJtYXBpX2ZsYWdzLCAgTlVMTCwgMCwgaW1hcCwgJm5pbWFwcywgTlVMTCk7CisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgb2Zmc2V0X2ZzYiwgZW5kX2ZzYiAtIG9mZnNldF9mc2IsCisJCQkJaW1hcCwgJm5pbWFwcywgYm1hcGlfZmxhZ3MpOwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAogCWlmIChlcnJvcikKQEAgLTU1MSw3ICs1MjksNiBAQAogCQkJdW5sb2NrX2J1ZmZlcihiaCk7CiAJCX0gd2hpbGUgKChiaCA9IG5leHRfYmgpICE9IE5VTEwpOwogCi0JCXhmc19pb2VuZF93YWtlKFhGU19JKGlvZW5kLT5pb19pbm9kZSkpOwogCQltZW1wb29sX2ZyZWUoaW9lbmQsIHhmc19pb2VuZF9wb29sKTsKIAl9IHdoaWxlICgoaW9lbmQgPSBuZXh0KSAhPSBOVUxMKTsKIH0KQEAgLTkyNSwxMSArOTAyLDExIEBACiAJICogcmFuZG9tIGNhbGxlcnMgZm9yIGRpcmVjdCByZWNsYWltIG9yIG1lbWNnIHJlY2xhaW0uICBXZSBleHBsaWNpdGx5CiAJICogYWxsb3cgcmVjbGFpbSBmcm9tIGtzd2FwZCBhcyB0aGUgc3RhY2sgdXNhZ2UgdGhlcmUgaXMgcmVsYXRpdmVseSBsb3cuCiAJICoKLQkgKiBUaGlzIHNob3VsZCByZWFsbHkgYmUgZG9uZSBieSB0aGUgY29yZSBWTSwgYnV0IHVudGlsIHRoYXQgaGFwcGVucwotCSAqIGZpbGVzeXN0ZW1zIGxpa2UgWEZTLCBidHJmcyBhbmQgZXh0NCBoYXZlIHRvIHRha2UgY2FyZSBvZiB0aGlzCi0JICogYnkgdGhlbXNlbHZlcy4KKwkgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gZXhjZXB0IGluIHRoZSBjYXNlIG9mIGEgVk0gcmVncmVzc2lvbiBzbworCSAqIHdhcm4gYWJvdXQgaXQuCiAJICovCi0JaWYgKChjdXJyZW50LT5mbGFncyAmIChQRl9NRU1BTExPQ3xQRl9LU1dBUEQpKSA9PSBQRl9NRU1BTExPQykKKwlpZiAoV0FSTl9PTl9PTkNFKChjdXJyZW50LT5mbGFncyAmIChQRl9NRU1BTExPQ3xQRl9LU1dBUEQpKSA9PQorCQkJUEZfTUVNQUxMT0MpKQogCQlnb3RvIHJlZGlydHk7CiAKIAkvKgpAQCAtMTE2MSw4ICsxMTM4LDggQEAKIAllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIHNpemUpOwogCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwogCi0JZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsIGVuZF9mc2IgLSBvZmZzZXRfZnNiLAotCQkJICBYRlNfQk1BUElfRU5USVJFLCAgTlVMTCwgMCwgJmltYXAsICZuaW1hcHMsIE5VTEwpOworCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIG9mZnNldF9mc2IsIGVuZF9mc2IgLSBvZmZzZXRfZnNiLAorCQkJCSZpbWFwLCAmbmltYXBzLCBYRlNfQk1BUElfRU5USVJFKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VubG9jazsKIApAQCAtMTMwMCw3ICsxMjc3LDYgQEAKIAlib29sCQkJaXNfYXN5bmMpCiB7CiAJc3RydWN0IHhmc19pb2VuZAkqaW9lbmQgPSBpb2NiLT5wcml2YXRlOwotCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gaW9lbmQtPmlvX2lub2RlOwogCiAJLyoKIAkgKiBibG9ja2Rldl9kaXJlY3RfSU8gY2FuIHJldHVybiBhbiBlcnJvciBldmVuIGFmdGVyIHRoZSBJL08KQEAgLTEzMTEsMjggKzEyODcsMTcgQEAKIAogCWlvZW5kLT5pb19vZmZzZXQgPSBvZmZzZXQ7CiAJaW9lbmQtPmlvX3NpemUgPSBzaXplOworCWlvZW5kLT5pb19pb2NiID0gaW9jYjsKKwlpb2VuZC0+aW9fcmVzdWx0ID0gcmV0OwogCWlmIChwcml2YXRlICYmIHNpemUgPiAwKQogCQlpb2VuZC0+aW9fdHlwZSA9IElPX1VOV1JJVFRFTjsKIAogCWlmIChpc19hc3luYykgewotCQkvKgotCQkgKiBJZiB3ZSBhcmUgY29udmVydGluZyBhbiB1bndyaXR0ZW4gZXh0ZW50IHdlIG5lZWQgdG8gZGVsYXkKLQkJICogdGhlIEFJTyBjb21wbGV0aW9uIHVudGlsIGFmdGVyIHRoZSB1bndyaXR0ZW50IGV4dGVudAotCQkgKiBjb252ZXJzaW9uIGhhcyBjb21wbGV0ZWQsIG90aGVyd2lzZSBkbyBpdCBBU0FQLgotCQkgKi8KLQkJaWYgKGlvZW5kLT5pb190eXBlID09IElPX1VOV1JJVFRFTikgewotCQkJaW9lbmQtPmlvX2lvY2IgPSBpb2NiOwotCQkJaW9lbmQtPmlvX3Jlc3VsdCA9IHJldDsKLQkJfSBlbHNlIHsKLQkJCWFpb19jb21wbGV0ZShpb2NiLCByZXQsIDApOwotCQl9CisJCWlvZW5kLT5pb19pc2FzeW5jID0gMTsKIAkJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCk7CiAJfSBlbHNlIHsKIAkJeGZzX2ZpbmlzaF9pb2VuZF9zeW5jKGlvZW5kKTsKIAl9Ci0KLQkvKiBYWFg6IHByb2JhYmx5IHNob3VsZCBtb3ZlIGludG8gdGhlIHJlYWwgSS9PIGNvbXBsZXRpb24gaGFuZGxlciAqLwotCWlub2RlX2Rpb19kb25lKGlub2RlKTsKIH0KIAogU1RBVElDIHNzaXplX3QKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYW9wcy5oIGIvZnMveGZzL3hmc19hb3BzLmgKaW5kZXggNzFmNzIxZS4uMTE2ZGQ1YyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hb3BzLmgKKysrIGIvZnMveGZzL3hmc19hb3BzLmgKQEAgLTQ3LDYgKzQ3LDcgQEAKIAl1bnNpZ25lZCBpbnQJCWlvX3R5cGU7CS8qIGRlbGFsbG9jIC8gdW53cml0dGVuICovCiAJaW50CQkJaW9fZXJyb3I7CS8qIEkvTyBlcnJvciBjb2RlICovCiAJYXRvbWljX3QJCWlvX3JlbWFpbmluZzsJLyogaG9sZCBjb3VudCAqLworCXVuc2lnbmVkIGludAkJaW9faXNhc3luYyA6IDE7CS8qIG5lZWRzIGFpb19jb21wbGV0ZSAqLwogCXN0cnVjdCBpbm9kZQkJKmlvX2lub2RlOwkvKiBmaWxlIGJlaW5nIHdyaXR0ZW4gdG8gKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmlvX2J1ZmZlcl9oZWFkOy8qIGJ1ZmZlciBsaW5rZWQgbGlzdCBoZWFkICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSppb19idWZmZXJfdGFpbDsvKiBidWZmZXIgbGlua2VkIGxpc3QgdGFpbCAqLwpAQCAtNjAsOSArNjEsNiBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgeGZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uczsKIGV4dGVybiBpbnQgeGZzX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKIAotZXh0ZXJuIHZvaWQgeGZzX2lvZW5kX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCB4ZnNfaW9lbmRfd2FpdChzdHJ1Y3QgeGZzX2lub2RlICopOwotCiBleHRlcm4gdm9pZCB4ZnNfY291bnRfcGFnZV9zdGF0ZShzdHJ1Y3QgcGFnZSAqLCBpbnQgKiwgaW50ICopOwogCiAjZW5kaWYgLyogX19YRlNfQU9QU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0ci5jIGIvZnMveGZzL3hmc19hdHRyLmMKaW5kZXggMTYwYmNkYy4uMWU1ZDk3ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyLmMKKysrIGIvZnMveGZzL3hmc19hdHRyLmMKQEAgLTMxOSw3ICszMTksNyBAQAogCQlyZXR1cm4gKGVycm9yKTsKIAl9CiAKLQl4ZnNfdHJhbnNfaWpvaW4oYXJncy50cmFucywgZHApOworCXhmc190cmFuc19pam9pbihhcmdzLnRyYW5zLCBkcCwgMCk7CiAKIAkvKgogCSAqIElmIHRoZSBhdHRyaWJ1dGUgbGlzdCBpcyBub24tZXhpc3RlbnQgb3IgYSBzaG9ydGZvcm0gbGlzdCwKQEAgLTM4OSw3ICszODksNyBAQAogCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkgKi8KIAkJaWYgKGNvbW1pdHRlZCkKLQkJCXhmc190cmFuc19pam9pbihhcmdzLnRyYW5zLCBkcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy50cmFucywgZHAsIDApOwogCiAJCS8qCiAJCSAqIENvbW1pdCB0aGUgbGVhZiB0cmFuc2Zvcm1hdGlvbi4gIFdlJ2xsIG5lZWQgYW5vdGhlciAobGlua2VkKQpAQCAtNTM3LDcgKzUzNyw3IEBACiAJICogTm8gbmVlZCB0byBtYWtlIHF1b3RhIHJlc2VydmF0aW9ucyBoZXJlLiBXZSBleHBlY3QgdG8gcmVsZWFzZSBzb21lCiAJICogYmxvY2tzIG5vdCBhbGxvY2F0ZSBpbiB0aGUgY29tbW9uIGNhc2UuCiAJICovCi0JeGZzX3RyYW5zX2lqb2luKGFyZ3MudHJhbnMsIGRwKTsKKwl4ZnNfdHJhbnNfaWpvaW4oYXJncy50cmFucywgZHAsIDApOwogCiAJLyoKIAkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCkBAIC04MDksNyArODA5LDcgQEAKIAkgKiBObyBuZWVkIHRvIG1ha2UgcXVvdGEgcmVzZXJ2YXRpb25zIGhlcmUuIFdlIGV4cGVjdCB0byByZWxlYXNlIHNvbWUKIAkgKiBibG9ja3MsIG5vdCBhbGxvY2F0ZSwgaW4gdGhlIGNvbW1vbiBjYXNlLgogCSAqLwotCXhmc190cmFuc19pam9pbih0cmFucywgZHApOworCXhmc190cmFuc19pam9pbih0cmFucywgZHAsIDApOwogCiAJLyoKIAkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCkBAIC04MjMsMTggKzgyMyw2IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAotCS8qCi0JICogU2lnbmFsIHN5bmNocm9ub3VzIGluYWN0aXZlIHRyYW5zYWN0aW9ucyB1bmxlc3MgdGhpcyBpcyBhCi0JICogc3luY2hyb25vdXMgbW91bnQgZmlsZXN5c3RlbSBpbiB3aGljaCBjYXNlIHdlIGtub3cgdGhhdCB3ZSdyZSBoZXJlCi0JICogYmVjYXVzZSB3ZSd2ZSBiZWVuIGNhbGxlZCBvdXQgb2YgeGZzX2luYWN0aXZlIHdoaWNoIG1lYW5zIHRoYXQgdGhlCi0JICogbGFzdCByZWZlcmVuY2UgaXMgZ29uZSBhbmQgdGhlIHVubGluayB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeSBoaXQKLQkgKiB0aGUgZGlzayBzbyBhc3luYyBpbmFjdGl2ZSB0cmFuc2FjdGlvbnMgYXJlIHNhZmUuCi0JICovCi0JaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpKSB7Ci0JCWlmIChkcC0+aV9kLmRpX2FuZXh0ZW50cyA+IDApCi0JCQl4ZnNfdHJhbnNfc2V0X3N5bmModHJhbnMpOwotCX0KLQogCWVycm9yID0geGZzX2l0cnVuY2F0ZV9leHRlbnRzKCZ0cmFucywgZHAsIFhGU19BVFRSX0ZPUkssIDApOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CkBAIC05NzMsNyArOTYxLDcgQEAKIAkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJICovCiAJCWlmIChjb21taXR0ZWQpCi0JCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwKTsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIDApOwogCiAJCS8qCiAJCSAqIENvbW1pdCB0aGUgY3VycmVudCB0cmFucyAoaW5jbHVkaW5nIHRoZSBpbm9kZSkgYW5kIHN0YXJ0CkBAIC0xMDc1LDcgKzEwNjMsNyBAQAogCQkJICogaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJCSAqLwogCQkJaWYgKGNvbW1pdHRlZCkKLQkJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwKTsKKwkJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCAwKTsKIAkJfSBlbHNlCiAJCQl4ZnNfZGFfYnVmX2RvbmUoYnApOwogCkBAIC0xMTQ5LDcgKzExMzcsNyBAQAogCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkgKi8KIAkJaWYgKGNvbW1pdHRlZCkKLQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHApOworCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgMCk7CiAJfSBlbHNlCiAJCXhmc19kYV9idWZfZG9uZShicCk7CiAJcmV0dXJuKDApOwpAQCAtMTMwMyw3ICsxMjkxLDcgQEAKIAkJCSAqIGluIGFsbCB0cmFuc2FjdGlvbnMuCiAJCQkgKi8KIAkJCWlmIChjb21taXR0ZWQpCi0JCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CisJCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgMCk7CiAKIAkJCS8qCiAJCQkgKiBDb21taXQgdGhlIG5vZGUgY29udmVyc2lvbiBhbmQgc3RhcnQgdGhlIG5leHQKQEAgLTEzNDAsNyArMTMyOCw3IEBACiAJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCiAJCSAqLwogCQlpZiAoY29tbWl0dGVkKQotCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCAwKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBBZGRpdGlvbiBzdWNjZWVkZWQsIHVwZGF0ZSBCdHJlZSBoYXNodmFscy4KQEAgLTE0NTIsNyArMTQ0MCw3IEBACiAJCQkgKiBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkJICovCiAJCQlpZiAoY29tbWl0dGVkKQotCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHApOworCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIDApOwogCQl9CiAKIAkJLyoKQEAgLTE1ODQsNyArMTU3Miw3IEBACiAJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCiAJCSAqLwogCQlpZiAoY29tbWl0dGVkKQotCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCAwKTsKIAogCQkvKgogCQkgKiBDb21taXQgdGhlIEJ0cmVlIGpvaW4gb3BlcmF0aW9uIGFuZCBzdGFydCBhIG5ldyB0cmFucy4KQEAgLTE2MzUsNyArMTYyMyw3IEBACiAJCQkgKiBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkJICovCiAJCQlpZiAoY29tbWl0dGVkKQotCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHApOworCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIDApOwogCQl9IGVsc2UKIAkJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIGJwKTsKIAl9CkBAIC0xOTc1LDEwICsxOTYzLDkgQEAKIAlsYmxrbm8gPSBhcmdzLT5ybXRibGtubzsKIAl3aGlsZSAodmFsdWVsZW4gPiAwKSB7CiAJCW5tYXAgPSBBVFRSX1JNVFZBTFVFX01BUFNJWkU7Ci0JCWVycm9yID0geGZzX2JtYXBpKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgKHhmc19maWxlb2ZmX3QpbGJsa25vLAotCQkJCSAgYXJncy0+cm10YmxrY250LAotCQkJCSAgWEZTX0JNQVBJX0FUVFJGT1JLIHwgWEZTX0JNQVBJX01FVEFEQVRBLAotCQkJCSAgTlVMTCwgMCwgbWFwLCAmbm1hcCwgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoYXJncy0+ZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKKwkJCQkgICAgICAgYXJncy0+cm10YmxrY250LCBtYXAsICZubWFwLAorCQkJCSAgICAgICBYRlNfQk1BUElfQVRUUkZPUkspOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4oZXJyb3IpOwogCQlBU1NFUlQobm1hcCA+PSAxKTsKQEAgLTIwNTIsMTAgKzIwMzksOSBAQAogCQkgKi8KIAkJeGZzX2JtYXBfaW5pdChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CiAJCW5tYXAgPSAxOwotCQllcnJvciA9IHhmc19ibWFwaShhcmdzLT50cmFucywgZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKKwkJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUoYXJncy0+dHJhbnMsIGRwLCAoeGZzX2ZpbGVvZmZfdClsYmxrbm8sCiAJCQkJICBibGtjbnQsCi0JCQkJICBYRlNfQk1BUElfQVRUUkZPUksgfCBYRlNfQk1BUElfTUVUQURBVEEgfAotCQkJCQkJCVhGU19CTUFQSV9XUklURSwKKwkJCQkgIFhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKIAkJCQkgIGFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPnRvdGFsLCAmbWFwLCAmbm1hcCwKIAkJCQkgIGFyZ3MtPmZsaXN0KTsKIAkJaWYgKCFlcnJvcikgewpAQCAtMjA3NCw3ICsyMDYwLDcgQEAKIAkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJICovCiAJCWlmIChjb21taXR0ZWQpCi0JCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwKTsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIDApOwogCiAJCUFTU0VSVChubWFwID09IDEpOwogCQlBU1NFUlQoKG1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykgJiYKQEAgLTIxMDQsMTQgKzIwOTAsMTEgQEAKIAkJICovCiAJCXhmc19ibWFwX2luaXQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOwogCQlubWFwID0gMTsKLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKLQkJCQkgIGFyZ3MtPnJtdGJsa2NudCwKLQkJCQkgIFhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKLQkJCQkgIGFyZ3MtPmZpcnN0YmxvY2ssIDAsICZtYXAsICZubWFwLAotCQkJCSAgTlVMTCk7Ci0JCWlmIChlcnJvcikgeworCQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGRwLCAoeGZzX2ZpbGVvZmZfdClsYmxrbm8sCisJCQkJICAgICAgIGFyZ3MtPnJtdGJsa2NudCwgJm1hcCwgJm5tYXAsCisJCQkJICAgICAgIFhGU19CTUFQSV9BVFRSRk9SSyk7CisJCWlmIChlcnJvcikKIAkJCXJldHVybihlcnJvcik7Ci0JCX0KIAkJQVNTRVJUKG5tYXAgPT0gMSk7CiAJCUFTU0VSVCgobWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSAmJgogCQkgICAgICAgKG1hcC5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSk7CkBAIC0yMTIxLDE2ICsyMTA0LDE3IEBACiAKIAkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLCBkYmxrbm8sIGJsa2NudCwKIAkJCQkgWEJGX0xPQ0sgfCBYQkZfRE9OVF9CTE9DSyk7Ci0JCUFTU0VSVCgheGZzX2J1Zl9nZXRlcnJvcihicCkpOwotCisJCWlmICghYnApCisJCQlyZXR1cm4gRU5PTUVNOwogCQl0bXAgPSAodmFsdWVsZW4gPCBYRlNfQlVGX1NJWkUoYnApKSA/IHZhbHVlbGVuIDoKIAkJCQkJCQlYRlNfQlVGX1NJWkUoYnApOwogCQl4ZnNfYnVmX2lvbW92ZShicCwgMCwgdG1wLCBzcmMsIFhCUldfV1JJVEUpOwogCQlpZiAodG1wIDwgWEZTX0JVRl9TSVpFKGJwKSkKIAkJCXhmc19idWZfemVybyhicCwgdG1wLCBYRlNfQlVGX1NJWkUoYnApIC0gdG1wKTsKLQkJaWYgKChlcnJvciA9IHhmc19id3JpdGUobXAsIGJwKSkpIHsvKiBHUk9UOiBOT1RFOiBzeW5jaHJvbm91cyB3cml0ZSAqLwotCQkJcmV0dXJuIChlcnJvcik7Ci0JCX0KKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsJLyogR1JPVDogTk9URTogc3luY2hyb25vdXMgd3JpdGUgKi8KKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKIAkJc3JjICs9IHRtcDsKIAkJdmFsdWVsZW4gLT0gdG1wOwogCkBAIC0yMTY2LDE2ICsyMTUwLDEyIEBACiAJCS8qCiAJCSAqIFRyeSB0byByZW1lbWJlciB3aGVyZSB3ZSBkZWNpZGVkIHRvIHB1dCB0aGUgdmFsdWUuCiAJCSAqLwotCQl4ZnNfYm1hcF9pbml0KGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKIAkJbm1hcCA9IDE7Ci0JCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGFyZ3MtPmRwLCAoeGZzX2ZpbGVvZmZfdClsYmxrbm8sCi0JCQkJCWFyZ3MtPnJtdGJsa2NudCwKLQkJCQkJWEZTX0JNQVBJX0FUVFJGT1JLIHwgWEZTX0JNQVBJX01FVEFEQVRBLAotCQkJCQlhcmdzLT5maXJzdGJsb2NrLCAwLCAmbWFwLCAmbm1hcCwKLQkJCQkJYXJncy0+Zmxpc3QpOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChhcmdzLT5kcCwgKHhmc19maWxlb2ZmX3QpbGJsa25vLAorCQkJCSAgICAgICBhcmdzLT5ybXRibGtjbnQsICZtYXAsICZubWFwLAorCQkJCSAgICAgICBYRlNfQk1BUElfQVRUUkZPUkspOworCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4oZXJyb3IpOwotCQl9CiAJCUFTU0VSVChubWFwID09IDEpOwogCQlBU1NFUlQoKG1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykgJiYKIAkJICAgICAgIChtYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykpOwpAQCAtMjE4OCw4ICsyMTY4LDcgQEAKIAkJICovCiAJCWJwID0geGZzX2luY29yZShtcC0+bV9kZGV2X3RhcmdwLCBkYmxrbm8sIGJsa2NudCwgWEJGX1RSWUxPQ0spOwogCQlpZiAoYnApIHsKLQkJCVhGU19CVUZfU1RBTEUoYnApOwotCQkJWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApOworCQkJeGZzX2J1Zl9zdGFsZShicCk7CiAJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJCWJwID0gTlVMTDsKIAkJfQpAQCAtMjIyNyw3ICsyMjA2LDcgQEAKIAkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJICovCiAJCWlmIChjb21taXR0ZWQpCi0JCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGFyZ3MtPmRwKTsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgYXJncy0+ZHAsIDApOwogCiAJCS8qCiAJCSAqIENsb3NlIG91dCB0cmFucyBhbmQgc3RhcnQgdGhlIG5leHQgb25lIGluIHRoZSBjaGFpbi4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCmluZGV4IDhmYWQ5NjAuLmQ0OTA2ZTcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuYwpAQCAtMjkyNiw5ICsyOTI2LDggQEAKIAkJICogVHJ5IHRvIHJlbWVtYmVyIHdoZXJlIHdlIGRlY2lkZWQgdG8gcHV0IHRoZSB2YWx1ZS4KIAkJICovCiAJCW5tYXAgPSAxOwotCQllcnJvciA9IHhmc19ibWFwaSgqdHJhbnMsIGRwLCAoeGZzX2ZpbGVvZmZfdCl0Ymxrbm8sIHRibGtjbnQsCi0JCQkJCVhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKLQkJCQkJTlVMTCwgMCwgJm1hcCwgJm5tYXAsIE5VTEwpOworCQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGRwLCAoeGZzX2ZpbGVvZmZfdCl0Ymxrbm8sIHRibGtjbnQsCisJCQkJICAgICAgICZtYXAsICZubWFwLCBYRlNfQk1BUElfQVRUUkZPUkspOwogCQlpZiAoZXJyb3IpIHsKIAkJCXJldHVybihlcnJvcik7CiAJCX0KQEAgLTI5NDgsNiArMjk0Nyw4IEBACiAJCQlicCA9IHhmc190cmFuc19nZXRfYnVmKCp0cmFucywKIAkJCQkJZHAtPmlfbW91bnQtPm1fZGRldl90YXJncCwKIAkJCQkJZGJsa25vLCBkYmxrY250LCBYQkZfTE9DSyk7CisJCQlpZiAoIWJwKQorCQkJCXJldHVybiBFTk9NRU07CiAJCQl4ZnNfdHJhbnNfYmludmFsKCp0cmFucywgYnApOwogCQkJLyoKIAkJCSAqIFJvbGwgdG8gbmV4dCB0cmFuc2FjdGlvbi4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5jIGIvZnMveGZzL3hmc19ibWFwLmMKaW5kZXggNDUyYTI5MS4uYzY4YmFlYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwLmMKKysrIGIvZnMveGZzL3hmc19ibWFwLmMKQEAgLTUwLDE3ICs1MCwyMiBAQAogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCiAKLSNpZmRlZiBERUJVRwotU1RBVElDIHZvaWQKLXhmc19ibWFwX2NoZWNrX2xlYWZfZXh0ZW50cyh4ZnNfYnRyZWVfY3VyX3QgKmN1ciwgeGZzX2lub2RlX3QgKmlwLCBpbnQgd2hpY2hmb3JrKTsKLSNlbmRpZgotCiBrbWVtX3pvbmVfdAkJKnhmc19ibWFwX2ZyZWVfaXRlbV96b25lOwogCiAvKgogICogUHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgYm1hcCByb3V0aW5lcy4KICAqLwogCisjaWZkZWYgREVCVUcKK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF9jaGVja19sZWFmX2V4dGVudHMoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwlpbnQJCQl3aGljaGZvcmspOworI2Vsc2UKKyNkZWZpbmUgeGZzX2JtYXBfY2hlY2tfbGVhZl9leHRlbnRzKGN1ciwgaXAsIHdoaWNoZm9yaykJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCiAKIC8qCiAgKiBDYWxsZWQgZnJvbSB4ZnNfYm1hcF9hZGRfYXR0cmZvcmsgdG8gaGFuZGxlIGV4dGVudHMgZm9ybWF0IGZpbGVzLgpAQCAtODUsNTggKzkwLDYgQEAKIAlpbnQJCQkqZmxhZ3MpOwkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGRlbGF5ZWQKLSAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24uCi0gKi8KLVNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2FkZF9leHRlbnRfZGVsYXlfcmVhbCgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CQkqaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogaWYgKmN1cnAgaXMgbnVsbCwgbm90IGEgYnRyZWUgKi8KLQl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIGFkZCB0byBmaWxlIGV4dGVudHMgKi8KLQl4ZnNfZmlsYmxrc190CQkqZG5ldywJLyogbmV3IGRlbGF5ZWQtYWxsb2MgaW5kaXJlY3QgYmxvY2tzICovCi0JeGZzX2ZzYmxvY2tfdAkJKmZpcnN0LAkvKiBwb2ludGVyIHRvIGZpcnN0YmxvY2sgdmFyaWFibGUgKi8KLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCi0JaW50CQkJKmxvZ2ZsYWdzcCk7IC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQotLyoKLSAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGEgaG9sZQotICogdG8gYSBkZWxheWVkIGFsbG9jYXRpb24uCi0gKi8KLVNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9kZWxheSgKLQl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCk7IC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQotLyoKLSAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGEgaG9sZQotICogdG8gYSByZWFsIGFsbG9jYXRpb24uCi0gKi8KLVNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKAotCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CQkqaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGlmIG51bGwsIG5vdCBhIGJ0cmVlICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCWludAkJCXdoaWNoZm9yayk7IC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0KLS8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhbiB1bndyaXR0ZW4KLSAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24gb3IgdmljZSB2ZXJzYS4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbCgKLQl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCi0JeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCk7IC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQotLyoKICAqIHhmc19ibWFwX2FsbG9jIGlzIGNhbGxlZCBieSB4ZnNfYm1hcGkgdG8gYWxsb2NhdGUgYW4gZXh0ZW50IGZvciBhIGZpbGUuCiAgKiBJdCBmaWd1cmVzIG91dCB3aGVyZSB0byBhc2sgdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yIHRvIHB1dCB0aGUgbmV3IGV4dGVudC4KICAqLwpAQCAtMjE1LDE5ICsxNjgsNiBAQAogCXhmc19ibWJ0X2lyZWNfdAkqcHJldnApOwkvKiBvdXQ6IHByZXZpb3VzIGV4dGVudCBlbnRyeSBmb3VuZCAqLwogCiAvKgotICogQ2hlY2sgdGhlIGxhc3QgaW5vZGUgZXh0ZW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgYWxsb2NhdGlvbiB3aWxsIHJlc3VsdAotICogaW4gYmxvY2tzIGJlaW5nIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBXaGVuIHdlIGFsbG9jYXRlIG5ldyBkYXRhCi0gKiBibG9ja3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB3aGljaCBkbyBub3Qgc3RhcnQgYXQgdGhlIHByZXZpb3VzIGRhdGEgYmxvY2ssCi0gKiB3ZSB3aWxsIHRyeSB0byBhbGlnbiB0aGUgbmV3IGJsb2NrcyBhdCBzdHJpcGUgdW5pdCBib3VuZGFyaWVzLgotICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfYm1hcF9pc2Flb2YoCi0JeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KLQl4ZnNfZmlsZW9mZl90ICAgb2ZmLAkJLyogZmlsZSBvZmZzZXQgaW4gZnNibG9ja3MgKi8KLQlpbnQgICAgICAgICAgICAgd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHJpYnV0ZSBmb3JrICovCi0JY2hhcgkJKmFlb2YpOwkJLyogcmV0dXJuIHZhbHVlICovCi0KLS8qCiAgKiBDb21wdXRlIHRoZSB3b3JzdC1jYXNlIG51bWJlciBvZiBpbmRpcmVjdCBibG9ja3MgdGhhdCB3aWxsIGJlIHVzZWQKICAqIGZvciBpcCdzIGRlbGF5ZWQgZXh0ZW50IG9mIGxlbmd0aCAibGVuIi4KICAqLwpAQCAtNDMxLDE4OCArMzcxLDEzIEBACiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBpIHRvIHVwZGF0ZSBmaWxlIGV4dGVudCByZWNvcmRzIGFuZCB0aGUgYnRyZWUKLSAqIGFmdGVyIGFsbG9jYXRpbmcgc3BhY2UgKG9yIGRvaW5nIGEgZGVsYXllZCBhbGxvY2F0aW9uKS4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBfYWRkX2V4dGVudCgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CQkqaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogaWYgKmN1cnAgaXMgbnVsbCwgbm90IGEgYnRyZWUgKi8KLQl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIGFkZCB0byBmaWxlIGV4dGVudHMgKi8KLQl4ZnNfZnNibG9ja190CQkqZmlyc3QsCS8qIHBvaW50ZXIgdG8gZmlyc3RibG9jayB2YXJpYWJsZSAqLwotCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkvKiBsaXN0IG9mIGV4dGVudHMgdG8gYmUgZnJlZWQgKi8KLQlpbnQJCQkqbG9nZmxhZ3NwLCAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCi0JaW50CQkJd2hpY2hmb3JrKSAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwotewotCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJLyogYnRyZWUgY3Vyc29yIG9yIG51bGwgKi8KLQl4ZnNfZmlsYmxrc190CQlkYV9uZXc7IC8qIG5ldyBjb3VudCBkZWwgYWxsb2MgYmxvY2tzIHVzZWQgKi8KLQl4ZnNfZmlsYmxrc190CQlkYV9vbGQ7IC8qIG9sZCBjb3VudCBkZWwgYWxsb2MgYmxvY2tzIHVzZWQgKi8KLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JeGZzX2lmb3JrX3QJCSppZnA7CS8qIGlub2RlIGZvcmsgcHRyICovCi0JaW50CQkJbG9nZmxhZ3M7IC8qIHJldHVybmVkIHZhbHVlICovCi0JeGZzX2V4dG51bV90CQluZXh0ZW50czsgLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gZmlsZSBub3cgKi8KLQotCVhGU19TVEFUU19JTkMoeHNfYWRkX2V4bGlzdCk7Ci0KLQljdXIgPSAqY3VycDsKLQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwotCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7Ci0JZGFfb2xkID0gZGFfbmV3ID0gMDsKLQllcnJvciA9IDA7Ci0KLQlBU1NFUlQoKmlkeCA+PSAwKTsKLQlBU1NFUlQoKmlkeCA8PSBuZXh0ZW50cyk7Ci0KLQkvKgotCSAqIFRoaXMgaXMgdGhlIGZpcnN0IGV4dGVudCBhZGRlZCB0byBhIG5ldy9lbXB0eSBmaWxlLgotCSAqIFNwZWNpYWwgY2FzZSB0aGlzIG9uZSwgc28gb3RoZXIgcm91dGluZXMgZ2V0IHRvIGFzc3VtZSB0aGVyZSBhcmUKLQkgKiBhbHJlYWR5IGV4dGVudHMgaW4gdGhlIGxpc3QuCi0JICovCi0JaWYgKG5leHRlbnRzID09IDApIHsKLQkJeGZzX2lleHRfaW5zZXJ0KGlwLCAqaWR4LCAxLCBuZXcsCi0JCQkJd2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUksgPyBCTUFQX0FUVFJGT1JLIDogMCk7Ci0KLQkJQVNTRVJUKGN1ciA9PSBOVUxMKTsKLQotCQlpZiAoIWlzbnVsbHN0YXJ0YmxvY2sobmV3LT5icl9zdGFydGJsb2NrKSkgewotCQkJWEZTX0lGT1JLX05FWFRfU0VUKGlwLCB3aGljaGZvcmssIDEpOwotCQkJbG9nZmxhZ3MgPSBYRlNfSUxPR19DT1JFIHwgeGZzX2lsb2dfZmV4dCh3aGljaGZvcmspOwotCQl9IGVsc2UKLQkJCWxvZ2ZsYWdzID0gMDsKLQl9Ci0JLyoKLQkgKiBBbnkga2luZCBvZiBuZXcgZGVsYXllZCBhbGxvY2F0aW9uIGdvZXMgaGVyZS4KLQkgKi8KLQllbHNlIGlmIChpc251bGxzdGFydGJsb2NrKG5ldy0+YnJfc3RhcnRibG9jaykpIHsKLQkJaWYgKGN1cikKLQkJCUFTU0VSVCgoY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJgotCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCkgPT0gMCk7Ci0JCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX2RlbGF5KGlwLCBpZHgsIG5ldywKLQkJCQkJCSAgICAgICAmbG9nZmxhZ3MpOwotCX0KLQkvKgotCSAqIFJlYWwgYWxsb2NhdGlvbiBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLQkgKi8KLQllbHNlIGlmICgqaWR4ID09IG5leHRlbnRzKSB7Ci0JCWlmIChjdXIpCi0JCQlBU1NFUlQoKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYKLQkJCQlYRlNfQlRDVVJfQlBSVl9XQVNERUwpID09IDApOwotCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKGlwLCBpZHgsIGN1ciwgbmV3LAotCQkJCSZsb2dmbGFncywgd2hpY2hmb3JrKTsKLQl9IGVsc2UgewotCQl4ZnNfYm1idF9pcmVjX3QJcHJldjsJLyogb2xkIGV4dGVudCBhdCBvZmZzZXQgaWR4ICovCi0KLQkJLyoKLQkJICogR2V0IHRoZSByZWNvcmQgcmVmZXJyZWQgdG8gYnkgaWR4LgotCQkgKi8KLQkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCksICZwcmV2KTsKLQkJLyoKLQkJICogSWYgaXQncyBhIHJlYWwgYWxsb2NhdGlvbiByZWNvcmQsIGFuZCB0aGUgbmV3IGFsbG9jYXRpb24gZW5kcwotCQkgKiBhZnRlciB0aGUgc3RhcnQgb2YgdGhlIHJlZmVycmVkIHRvIHJlY29yZCwgdGhlbiB3ZSdyZSBmaWxsaW5nCi0JCSAqIGluIGEgZGVsYXllZCBvciB1bndyaXR0ZW4gYWxsb2NhdGlvbiB3aXRoIGEgcmVhbCBvbmUsIG9yCi0JCSAqIGNvbnZlcnRpbmcgcmVhbCBiYWNrIHRvIHVud3JpdHRlbi4KLQkJICovCi0JCWlmICghaXNudWxsc3RhcnRibG9jayhuZXctPmJyX3N0YXJ0YmxvY2spICYmCi0JCSAgICBuZXctPmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50ID4gcHJldi5icl9zdGFydG9mZikgewotCQkJaWYgKHByZXYuYnJfc3RhdGUgIT0gWEZTX0VYVF9VTldSSVRURU4gJiYKLQkJCSAgICBpc251bGxzdGFydGJsb2NrKHByZXYuYnJfc3RhcnRibG9jaykpIHsKLQkJCQlkYV9vbGQgPSBzdGFydGJsb2NrdmFsKHByZXYuYnJfc3RhcnRibG9jayk7Ci0JCQkJaWYgKGN1cikKLQkJCQkJQVNTRVJUKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYKLQkJCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCk7Ci0JCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwodHAsIGlwLAotCQkJCQkJaWR4LCAmY3VyLCBuZXcsICZkYV9uZXcsCi0JCQkJCQlmaXJzdCwgZmxpc3QsICZsb2dmbGFncyk7Ci0JCQl9IGVsc2UgewotCQkJCUFTU0VSVChuZXctPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSB8fAotCQkJCSAgICAgICBuZXctPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKTsKLQotCQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbChpcCwKLQkJCQkJCWlkeCwgJmN1ciwgbmV3LCAmbG9nZmxhZ3MpOwotCQkJCWlmIChlcnJvcikKLQkJCQkJZ290byBkb25lOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIE90aGVyd2lzZSB3ZSdyZSBmaWxsaW5nIGluIGEgaG9sZSB3aXRoIGFuIGFsbG9jYXRpb24uCi0JCSAqLwotCQllbHNlIHsKLQkJCWlmIChjdXIpCi0JCQkJQVNTRVJUKChjdXItPmJjX3ByaXZhdGUuYi5mbGFncyAmCi0JCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCkgPT0gMCk7Ci0JCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKGlwLCBpZHgsIGN1ciwKLQkJCQkJbmV3LCAmbG9nZmxhZ3MsIHdoaWNoZm9yayk7Ci0JCX0KLQl9Ci0KLQlpZiAoZXJyb3IpCi0JCWdvdG8gZG9uZTsKLQlBU1NFUlQoKmN1cnAgPT0gY3VyIHx8ICpjdXJwID09IE5VTEwpOwotCi0JLyoKLQkgKiBDb252ZXJ0IHRvIGEgYnRyZWUgaWYgbmVjZXNzYXJ5LgotCSAqLwotCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKLQkgICAgWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID4gaWZwLT5pZl9leHRfbWF4KSB7Ci0JCWludAl0bXBfbG9nZmxhZ3M7CS8qIHBhcnRpYWwgbG9nIGZsYWcgcmV0dXJuIHZhbCAqLwotCi0JCUFTU0VSVChjdXIgPT0gTlVMTCk7Ci0JCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZSh0cCwgaXAsIGZpcnN0LAotCQkJZmxpc3QsICZjdXIsIGRhX29sZCA+IDAsICZ0bXBfbG9nZmxhZ3MsIHdoaWNoZm9yayk7Ci0JCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKLQkJaWYgKGVycm9yKQotCQkJZ290byBkb25lOwotCX0KLQkvKgotCSAqIEFkanVzdCBmb3IgY2hhbmdlcyBpbiByZXNlcnZlZCBkZWxheWVkIGluZGlyZWN0IGJsb2Nrcy4KLQkgKiBOb3RoaW5nIHRvIGRvIGZvciBkaXNrIHF1b3RhcyBoZXJlLgotCSAqLwotCWlmIChkYV9vbGQgfHwgZGFfbmV3KSB7Ci0JCXhmc19maWxibGtzX3QJbmJsa3M7Ci0KLQkJbmJsa3MgPSBkYV9uZXc7Ci0JCWlmIChjdXIpCi0JCQluYmxrcyArPSBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQ7Ci0JCUFTU0VSVChuYmxrcyA8PSBkYV9vbGQpOwotCQlpZiAobmJsa3MgPCBkYV9vbGQpCi0JCQl4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMoaXAtPmlfbW91bnQsIFhGU19TQlNfRkRCTE9DS1MsCi0JCQkJKGludDY0X3QpKGRhX29sZCAtIG5ibGtzKSwgMCk7Ci0JfQotCS8qCi0JICogQ2xlYXIgb3V0IHRoZSBhbGxvY2F0ZWQgZmllbGQsIGRvbmUgd2l0aCBpdCBub3cgaW4gYW55IGNhc2UuCi0JICovCi0JaWYgKGN1cikgewotCQljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgPSAwOwotCQkqY3VycCA9IGN1cjsKLQl9Ci1kb25lOgotI2lmZGVmIERFQlVHCi0JaWYgKCFlcnJvcikKLQkJeGZzX2JtYXBfY2hlY2tfbGVhZl9leHRlbnRzKCpjdXJwLCBpcCwgd2hpY2hmb3JrKTsKLSNlbmRpZgotCSpsb2dmbGFnc3AgPSBsb2dmbGFnczsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGRlbGF5ZWQKLSAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24uCisgKiBDb252ZXJ0IGEgZGVsYXllZCBhbGxvY2F0aW9uIHRvIGEgcmVhbCBhbGxvY2F0aW9uLgogICovCiBTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCiB4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwoCi0Jc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCi0JeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JeGZzX2ZpbGJsa3NfdAkJKmRuZXcsCS8qIG5ldyBkZWxheWVkLWFsbG9jIGluZGlyZWN0IGJsb2NrcyAqLwotCXhmc19mc2Jsb2NrX3QJCSpmaXJzdCwJLyogcG9pbnRlciB0byBmaXJzdGJsb2NrIHZhcmlhYmxlICovCi0JeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCS8qIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlZCAqLwotCWludAkJCSpsb2dmbGFnc3ApIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEpCiB7Ci0JeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkvKiBidHJlZSBjdXJzb3IgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbmV3ID0gJmJtYS0+Z290OwogCWludAkJCWRpZmY7CS8qIHRlbXAgdmFsdWUgKi8KIAl4ZnNfYm1idF9yZWNfaG9zdF90CSplcDsJLyogZXh0ZW50IGVudHJ5IGZvciBpZHggKi8KIAlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCkBAIC02MjMsMTAgKzM4OCwyMiBAQAogCQkJCQkvKiBsZWZ0IGlzIDAsIHJpZ2h0IGlzIDEsIHByZXYgaXMgMiAqLwogCWludAkJCXJ2YWw9MDsJLyogcmV0dXJuIHZhbHVlIChsb2dnaW5nIGZsYWdzKSAqLwogCWludAkJCXN0YXRlID0gMDsvKiBzdGF0ZSBiaXRzLCBhY2Nlc3NlZCB0aHJ1IG1hY3JvcyAqLwotCXhmc19maWxibGtzX3QJCXRlbXA9MDsJLyogdmFsdWUgZm9yIGRuZXcgY2FsY3VsYXRpb25zICovCi0JeGZzX2ZpbGJsa3NfdAkJdGVtcDI9MDsvKiB2YWx1ZSBmb3IgZG5ldyBjYWxjdWxhdGlvbnMgKi8KKwl4ZnNfZmlsYmxrc190CQlkYV9uZXc7IC8qIG5ldyBjb3VudCBkZWwgYWxsb2MgYmxvY2tzIHVzZWQgKi8KKwl4ZnNfZmlsYmxrc190CQlkYV9vbGQ7IC8qIG9sZCBjb3VudCBkZWwgYWxsb2MgYmxvY2tzIHVzZWQgKi8KKwl4ZnNfZmlsYmxrc190CQl0ZW1wPTA7CS8qIHZhbHVlIGZvciBkYV9uZXcgY2FsY3VsYXRpb25zICovCisJeGZzX2ZpbGJsa3NfdAkJdGVtcDI9MDsvKiB2YWx1ZSBmb3IgZGFfbmV3IGNhbGN1bGF0aW9ucyAqLwogCWludAkJCXRtcF9ydmFsOwkvKiBwYXJ0aWFsIGxvZ2dpbmcgZmxhZ3MgKi8KIAorCWlmcCA9IFhGU19JRk9SS19QVFIoYm1hLT5pcCwgWEZTX0RBVEFfRk9SSyk7CisKKwlBU1NFUlQoYm1hLT5pZHggPj0gMCk7CisJQVNTRVJUKGJtYS0+aWR4IDw9IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2Yoc3RydWN0IHhmc19ibWJ0X3JlYykpOworCUFTU0VSVCghaXNudWxsc3RhcnRibG9jayhuZXctPmJyX3N0YXJ0YmxvY2spKTsKKwlBU1NFUlQoIWJtYS0+Y3VyIHx8CisJICAgICAgIChibWEtPmN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYgWEZTX0JUQ1VSX0JQUlZfV0FTREVMKSk7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2FkZF9leGxpc3QpOworCiAjZGVmaW5lCUxFRlQJCXJbMF0KICNkZWZpbmUJUklHSFQJCXJbMV0KICNkZWZpbmUJUFJFVgkJclsyXQpAQCAtNjM0LDE0ICs0MTEsMTUgQEAKIAkvKgogCSAqIFNldCB1cCBhIGJ1bmNoIG9mIHZhcmlhYmxlcyB0byBtYWtlIHRoZSB0ZXN0cyBzaW1wbGVyLgogCSAqLwotCWN1ciA9ICpjdXJwOwotCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIFhGU19EQVRBX0ZPUkspOwotCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpOworCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KTsKIAl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmUFJFVik7CiAJbmV3X2VuZG9mZiA9IG5ldy0+YnJfc3RhcnRvZmYgKyBuZXctPmJyX2Jsb2NrY291bnQ7CiAJQVNTRVJUKFBSRVYuYnJfc3RhcnRvZmYgPD0gbmV3LT5icl9zdGFydG9mZik7CiAJQVNTRVJUKFBSRVYuYnJfc3RhcnRvZmYgKyBQUkVWLmJyX2Jsb2NrY291bnQgPj0gbmV3X2VuZG9mZik7CiAKKwlkYV9vbGQgPSBzdGFydGJsb2NrdmFsKFBSRVYuYnJfc3RhcnRibG9jayk7CisJZGFfbmV3ID0gMDsKKwogCS8qCiAJICogU2V0IGZsYWdzIGRldGVybWluaW5nIHdoYXQgcGFydCBvZiB0aGUgcHJldmlvdXMgZGVsYXllZCBhbGxvY2F0aW9uCiAJICogZXh0ZW50IGlzIGJlaW5nIHJlcGxhY2VkIGJ5IGEgcmVhbCBhbGxvY2F0aW9uLgpAQCAtNjU1LDkgKzQzMyw5IEBACiAJICogQ2hlY2sgYW5kIHNldCBmbGFncyBpZiB0aGlzIHNlZ21lbnQgaGFzIGEgbGVmdCBuZWlnaGJvci4KIAkgKiBEb24ndCBzZXQgY29udGlndW91cyBpZiB0aGUgY29tYmluZWQgZXh0ZW50IHdvdWxkIGJlIHRvbyBsYXJnZS4KIAkgKi8KLQlpZiAoKmlkeCA+IDApIHsKKwlpZiAoYm1hLT5pZHggPiAwKSB7CiAJCXN0YXRlIHw9IEJNQVBfTEVGVF9WQUxJRDsKLQkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCAtIDEpLCAmTEVGVCk7CisJCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4IC0gMSksICZMRUZUKTsKIAogCQlpZiAoaXNudWxsc3RhcnRibG9jayhMRUZULmJyX3N0YXJ0YmxvY2spKQogCQkJc3RhdGUgfD0gQk1BUF9MRUZUX0RFTEFZOwpAQCAtNjc1LDkgKzQ1Myw5IEBACiAJICogRG9uJ3Qgc2V0IGNvbnRpZ3VvdXMgaWYgdGhlIGNvbWJpbmVkIGV4dGVudCB3b3VsZCBiZSB0b28gbGFyZ2UuCiAJICogQWxzbyBjaGVjayBmb3IgYWxsLXRocmVlLWNvbnRpZ3VvdXMgYmVpbmcgdG9vIGxhcmdlLgogCSAqLwotCWlmICgqaWR4IDwgaXAtPmlfZGYuaWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpIC0gMSkgeworCWlmIChibWEtPmlkeCA8IGJtYS0+aXAtPmlfZGYuaWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpIC0gMSkgewogCQlzdGF0ZSB8PSBCTUFQX1JJR0hUX1ZBTElEOwotCQl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCAqaWR4ICsgMSksICZSSUdIVCk7CisJCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4ICsgMSksICZSSUdIVCk7CiAKIAkJaWYgKGlzbnVsbHN0YXJ0YmxvY2soUklHSFQuYnJfc3RhcnRibG9jaykpCiAJCQlzdGF0ZSB8PSBCTUFQX1JJR0hUX0RFTEFZOwpAQCAtNzA4LDM4ICs0ODYsNDEgQEAKIAkJICogRmlsbGluZyBpbiBhbGwgb2YgYSBwcmV2aW91c2x5IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQuCiAJCSAqIFRoZSBsZWZ0IGFuZCByaWdodCBuZWlnaGJvcnMgYXJlIGJvdGggY29udGlndW91cyB3aXRoIG5ldy4KIAkJICovCi0JCS0tKmlkeDsKLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7Ci0JCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KHhmc19pZXh0X2dldF9leHQoaWZwLCAqaWR4KSwKKwkJYm1hLT5pZHgtLTsKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCksCiAJCQlMRUZULmJyX2Jsb2NrY291bnQgKyBQUkVWLmJyX2Jsb2NrY291bnQgKwogCQkJUklHSFQuYnJfYmxvY2tjb3VudCk7Ci0JCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCXhmc19pZXh0X3JlbW92ZShpcCwgKmlkeCArIDEsIDIsIHN0YXRlKTsKLQkJaXAtPmlfZC5kaV9uZXh0ZW50cy0tOwotCQlpZiAoY3VyID09IE5VTEwpCisJCXhmc19pZXh0X3JlbW92ZShibWEtPmlwLCBibWEtPmlkeCArIDEsIDIsIHN0YXRlKTsKKwkJYm1hLT5pcC0+aV9kLmRpX25leHRlbnRzLS07CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOwogCQllbHNlIHsKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAogCQkJCQlSSUdIVC5icl9zdGFydGJsb2NrLAotCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVsZXRlKGN1ciwgJmkpKSkKKwkJCWVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShibWEtPmN1ciwgJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQllcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoYm1hLT5jdXIsIDAsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIExFRlQuYnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShibWEtPmN1ciwgTEVGVC5icl9zdGFydG9mZiwKIAkJCQkJTEVGVC5icl9zdGFydGJsb2NrLAogCQkJCQlMRUZULmJyX2Jsb2NrY291bnQgKwogCQkJCQlQUkVWLmJyX2Jsb2NrY291bnQgKwotCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCBMRUZULmJyX3N0YXRlKSkpCisJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsIExFRlQuYnJfc3RhdGUpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJfQotCQkqZG5ldyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORyB8IEJNQVBfUklHSFRfRklMTElORyB8IEJNQVBfTEVGVF9DT05USUc6CkBAIC03NDcsMzAgKzUyOCwzMSBAQAogCQkgKiBGaWxsaW5nIGluIGFsbCBvZiBhIHByZXZpb3VzbHkgZGVsYXllZCBhbGxvY2F0aW9uIGV4dGVudC4KIAkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgY29udGlndW91cywgdGhlIHJpZ2h0IGlzIG5vdC4KIAkJICovCi0JCS0tKmlkeDsKKwkJYm1hLT5pZHgtLTsKIAotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpLAorCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KSwKIAkJCUxFRlQuYnJfYmxvY2tjb3VudCArIFBSRVYuYnJfYmxvY2tjb3VudCk7Ci0JCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCXhmc19pZXh0X3JlbW92ZShpcCwgKmlkeCArIDEsIDEsIHN0YXRlKTsKLQkJaWYgKGN1ciA9PSBOVUxMKQorCQl4ZnNfaWV4dF9yZW1vdmUoYm1hLT5pcCwgYm1hLT5pZHggKyAxLCAxLCBzdGF0ZSk7CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CiAJCWVsc2UgewogCQkJcnZhbCA9IDA7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCWVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGJtYS0+Y3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssIExFRlQuYnJfYmxvY2tjb3VudCwKLQkJCQkJJmkpKSkKKwkJCQkJJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCWVycm9yID0geGZzX2JtYnRfdXBkYXRlKGJtYS0+Y3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssCiAJCQkJCUxFRlQuYnJfYmxvY2tjb3VudCArCi0JCQkJCVBSRVYuYnJfYmxvY2tjb3VudCwgTEVGVC5icl9zdGF0ZSkpKQorCQkJCQlQUkVWLmJyX2Jsb2NrY291bnQsIExFRlQuYnJfc3RhdGUpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJfQotCQkqZG5ldyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORyB8IEJNQVBfUklHSFRfRklMTElORyB8IEJNQVBfUklHSFRfQ09OVElHOgpAQCAtNzc4LDMwICs1NjAsMzAgQEAKIAkJICogRmlsbGluZyBpbiBhbGwgb2YgYSBwcmV2aW91c2x5IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQuCiAJCSAqIFRoZSByaWdodCBuZWlnaGJvciBpcyBjb250aWd1b3VzLCB0aGUgbGVmdCBpcyBub3QuCiAJCSAqLwotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBuZXctPmJyX3N0YXJ0YmxvY2spOwogCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwKIAkJCVBSRVYuYnJfYmxvY2tjb3VudCArIFJJR0hULmJyX2Jsb2NrY291bnQpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAotCQl4ZnNfaWV4dF9yZW1vdmUoaXAsICppZHggKyAxLCAxLCBzdGF0ZSk7Ci0JCWlmIChjdXIgPT0gTlVMTCkKKwkJeGZzX2lleHRfcmVtb3ZlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMSwgMSwgc3RhdGUpOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkKIAkJCXJ2YWwgPSBYRlNfSUxPR19ERVhUOwogCQllbHNlIHsKIAkJCXJ2YWwgPSAwOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAogCQkJCQlSSUdIVC5icl9zdGFydGJsb2NrLAotCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBQUkVWLmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoYm1hLT5jdXIsIFBSRVYuYnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywKIAkJCQkJUFJFVi5icl9ibG9ja2NvdW50ICsKLQkJCQkJUklHSFQuYnJfYmxvY2tjb3VudCwgUFJFVi5icl9zdGF0ZSkpKQorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCBQUkVWLmJyX3N0YXRlKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KLQotCQkqZG5ldyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORyB8IEJNQVBfUklHSFRfRklMTElORzoKQEAgLTgxMCwyNyArNTkyLDI3IEBACiAJCSAqIE5laXRoZXIgdGhlIGxlZnQgbm9yIHJpZ2h0IG5laWdoYm9ycyBhcmUgY29udGlndW91cyB3aXRoCiAJCSAqIHRoZSBuZXcgb25lLgogCQkgKi8KLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbmV3LT5icl9zdGFydGJsb2NrKTsKLQkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAKLQkJaXAtPmlfZC5kaV9uZXh0ZW50cysrOwotCQlpZiAoY3VyID09IE5VTEwpCisJCWJtYS0+aXAtPmlfZC5kaV9uZXh0ZW50cysrOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKIAkJZWxzZSB7CiAJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIG5ldy0+YnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywgbmV3LT5icl9ibG9ja2NvdW50LAotCQkJCQkmaSkpKQorCQkJCQkmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAwLCBkb25lKTsKLQkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luc2VydChjdXIsICZpKSkpCisJCQlibWEtPmN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQllcnJvciA9IHhmc19idHJlZV9pbnNlcnQoYm1hLT5jdXIsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9Ci0KLQkJKmRuZXcgPSAwOwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkcgfCBCTUFQX0xFRlRfQ09OVElHOgpAQCAtODM4LDM5ICs2MjAsNDAgQEAKIAkJICogRmlsbGluZyBpbiB0aGUgZmlyc3QgcGFydCBvZiBhIHByZXZpb3VzIGRlbGF5ZWQgYWxsb2NhdGlvbi4KIAkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgY29udGlndW91cy4KIAkJICovCi0JCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoaXAsICppZHggLSAxLCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHggLSAxKSwKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCAtIDEsIHN0YXRlLCBfVEhJU19JUF8pOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgYm1hLT5pZHggLSAxKSwKIAkJCUxFRlQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCk7CiAJCXhmc19ibWJ0X3NldF9zdGFydG9mZihlcCwKIAkJCVBSRVYuYnJfc3RhcnRvZmYgKyBuZXctPmJyX2Jsb2NrY291bnQpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCAtIDEsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCAtIDEsIHN0YXRlLCBfVEhJU19JUF8pOwogCiAJCXRlbXAgPSBQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQ7Ci0JCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsIHRlbXApOwotCQlpZiAoY3VyID09IE5VTEwpCisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CiAJCWVsc2UgewogCQkJcnZhbCA9IDA7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCWVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGJtYS0+Y3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssIExFRlQuYnJfYmxvY2tjb3VudCwKLQkJCQkJJmkpKSkKKwkJCQkJJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCWVycm9yID0geGZzX2JtYnRfdXBkYXRlKGJtYS0+Y3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssCiAJCQkJCUxFRlQuYnJfYmxvY2tjb3VudCArCiAJCQkJCW5ldy0+YnJfYmxvY2tjb3VudCwKLQkJCQkJTEVGVC5icl9zdGF0ZSkpKQorCQkJCQlMRUZULmJyX3N0YXRlKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KLQkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQlkYV9uZXcgPSBYRlNfRklMQkxLU19NSU4oeGZzX2JtYXBfd29yc3RfaW5kbGVuKGJtYS0+aXAsIHRlbXApLAogCQkJc3RhcnRibG9ja3ZhbChQUkVWLmJyX3N0YXJ0YmxvY2spKTsKLQkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKChpbnQpdGVtcCkpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBudWxsc3RhcnRibG9jayhkYV9uZXcpKTsKKwkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCS0tKmlkeDsKLQkJKmRuZXcgPSB0ZW1wOworCQlibWEtPmlkeC0tOwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkc6CkBAIC04NzgsNDMgKzY2MSw0MyBAQAogCQkgKiBGaWxsaW5nIGluIHRoZSBmaXJzdCBwYXJ0IG9mIGEgcHJldmlvdXMgZGVsYXllZCBhbGxvY2F0aW9uLgogCQkgKiBUaGUgbGVmdCBuZWlnaGJvciBpcyBub3QgY29udGlndW91cy4KIAkJICovCi0JCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAkJeGZzX2JtYnRfc2V0X3N0YXJ0b2ZmKGVwLCBuZXdfZW5kb2ZmKTsKIAkJdGVtcCA9IFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudDsKIAkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsIHRlbXApOwotCQl4ZnNfaWV4dF9pbnNlcnQoaXAsICppZHgsIDEsIG5ldywgc3RhdGUpOwotCQlpcC0+aV9kLmRpX25leHRlbnRzKys7Ci0JCWlmIChjdXIgPT0gTlVMTCkKKwkJeGZzX2lleHRfaW5zZXJ0KGJtYS0+aXAsIGJtYS0+aWR4LCAxLCBuZXcsIHN0YXRlKTsKKwkJYm1hLT5pcC0+aV9kLmRpX25leHRlbnRzKys7CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOwogCQllbHNlIHsKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShibWEtPmN1ciwgbmV3LT5icl9zdGFydG9mZiwKIAkJCQkJbmV3LT5icl9zdGFydGJsb2NrLCBuZXctPmJyX2Jsb2NrY291bnQsCi0JCQkJCSZpKSkpCisJCQkJCSZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDAsIGRvbmUpOwotCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCWJtYS0+Y3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwkJCWVycm9yID0geGZzX2J0cmVlX2luc2VydChibWEtPmN1ciwgJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCX0KLQkJaWYgKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKLQkJICAgIGlwLT5pX2QuZGlfbmV4dGVudHMgPiBpcC0+aV9kZi5pZl9leHRfbWF4KSB7Ci0JCQllcnJvciA9IHhmc19ibWFwX2V4dGVudHNfdG9fYnRyZWUodHAsIGlwLAotCQkJCQlmaXJzdCwgZmxpc3QsICZjdXIsIDEsICZ0bXBfcnZhbCwKLQkJCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlmIChibWEtPmlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkJICAgIGJtYS0+aXAtPmlfZC5kaV9uZXh0ZW50cyA+IGJtYS0+aXAtPmlfZGYuaWZfZXh0X21heCkgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKGJtYS0+dHAsIGJtYS0+aXAsCisJCQkJCWJtYS0+Zmlyc3RibG9jaywgYm1hLT5mbGlzdCwKKwkJCQkJJmJtYS0+Y3VyLCAxLCAmdG1wX3J2YWwsIFhGU19EQVRBX0ZPUkspOwogCQkJcnZhbCB8PSB0bXBfcnZhbDsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KLQkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQlkYV9uZXcgPSBYRlNfRklMQkxLU19NSU4oeGZzX2JtYXBfd29yc3RfaW5kbGVuKGJtYS0+aXAsIHRlbXApLAogCQkJc3RhcnRibG9ja3ZhbChQUkVWLmJyX3N0YXJ0YmxvY2spIC0KLQkJCShjdXIgPyBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgOiAwKSk7Ci0JCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHggKyAxKTsKLQkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKChpbnQpdGVtcCkpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCArIDEsIHN0YXRlLCBfVEhJU19JUF8pOwotCi0JCSpkbmV3ID0gdGVtcDsKKwkJCShibWEtPmN1ciA/IGJtYS0+Y3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkIDogMCkpOworCQllcCA9IHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCArIDEpOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbnVsbHN0YXJ0YmxvY2soZGFfbmV3KSk7CisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMSwgc3RhdGUsIF9USElTX0lQXyk7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX1JJR0hUX0ZJTExJTkcgfCBCTUFQX1JJR0hUX0NPTlRJRzoKQEAgLTkyMywzOCArNzA2LDM5IEBACiAJCSAqIFRoZSByaWdodCBuZWlnaGJvciBpcyBjb250aWd1b3VzIHdpdGggdGhlIG5ldyBhbGxvY2F0aW9uLgogCQkgKi8KIAkJdGVtcCA9IFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudDsKLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCArIDEsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMSwgc3RhdGUsIF9USElTX0lQXyk7CiAJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsKLQkJeGZzX2JtYnRfc2V0X2FsbGYoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHggKyAxKSwKKwkJeGZzX2JtYnRfc2V0X2FsbGYoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4ICsgMSksCiAJCQluZXctPmJyX3N0YXJ0b2ZmLCBuZXctPmJyX3N0YXJ0YmxvY2ssCiAJCQluZXctPmJyX2Jsb2NrY291bnQgKyBSSUdIVC5icl9ibG9ja2NvdW50LAogCQkJUklHSFQuYnJfc3RhdGUpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCArIDEsIHN0YXRlLCBfVEhJU19JUF8pOwotCQlpZiAoY3VyID09IE5VTEwpCisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMSwgc3RhdGUsIF9USElTX0lQXyk7CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CiAJCWVsc2UgewogCQkJcnZhbCA9IDA7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgUklHSFQuYnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShibWEtPmN1ciwgUklHSFQuYnJfc3RhcnRvZmYsCiAJCQkJCVJJR0hULmJyX3N0YXJ0YmxvY2ssCi0JCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsICZpKSkpCisJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShibWEtPmN1ciwgbmV3LT5icl9zdGFydG9mZiwKIAkJCQkJbmV3LT5icl9zdGFydGJsb2NrLAogCQkJCQluZXctPmJyX2Jsb2NrY291bnQgKwogCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LAotCQkJCQlSSUdIVC5icl9zdGF0ZSkpKQorCQkJCQlSSUdIVC5icl9zdGF0ZSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQl9CiAKLQkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQlkYV9uZXcgPSBYRlNfRklMQkxLU19NSU4oeGZzX2JtYXBfd29yc3RfaW5kbGVuKGJtYS0+aXAsIHRlbXApLAogCQkJc3RhcnRibG9ja3ZhbChQUkVWLmJyX3N0YXJ0YmxvY2spKTsKLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7Ci0JCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBudWxsc3RhcnRibG9jaygoaW50KXRlbXApKTsKLQkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKGRhX25ldykpOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAKLQkJKysqaWR4OwotCQkqZG5ldyA9IHRlbXA7CisJCWJtYS0+aWR4Kys7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX1JJR0hUX0ZJTExJTkc6CkBAIC05NjMsNDIgKzc0Nyw0MyBAQAogCQkgKiBUaGUgcmlnaHQgbmVpZ2hib3IgaXMgbm90IGNvbnRpZ3VvdXMuCiAJCSAqLwogCQl0ZW1wID0gUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50OwotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsKLQkJeGZzX2lleHRfaW5zZXJ0KGlwLCAqaWR4ICsgMSwgMSwgbmV3LCBzdGF0ZSk7Ci0JCWlwLT5pX2QuZGlfbmV4dGVudHMrKzsKLQkJaWYgKGN1ciA9PSBOVUxMKQorCQl4ZnNfaWV4dF9pbnNlcnQoYm1hLT5pcCwgYm1hLT5pZHggKyAxLCAxLCBuZXcsIHN0YXRlKTsKKwkJYm1hLT5pcC0+aV9kLmRpX25leHRlbnRzKys7CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOwogCQllbHNlIHsKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShibWEtPmN1ciwgbmV3LT5icl9zdGFydG9mZiwKIAkJCQkJbmV3LT5icl9zdGFydGJsb2NrLCBuZXctPmJyX2Jsb2NrY291bnQsCi0JCQkJCSZpKSkpCisJCQkJCSZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDAsIGRvbmUpOwotCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCWJtYS0+Y3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwkJCWVycm9yID0geGZzX2J0cmVlX2luc2VydChibWEtPmN1ciwgJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCX0KLQkJaWYgKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKLQkJICAgIGlwLT5pX2QuZGlfbmV4dGVudHMgPiBpcC0+aV9kZi5pZl9leHRfbWF4KSB7Ci0JCQllcnJvciA9IHhmc19ibWFwX2V4dGVudHNfdG9fYnRyZWUodHAsIGlwLAotCQkJCWZpcnN0LCBmbGlzdCwgJmN1ciwgMSwgJnRtcF9ydmFsLAotCQkJCVhGU19EQVRBX0ZPUkspOworCQlpZiAoYm1hLT5pcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJCSAgICBibWEtPmlwLT5pX2QuZGlfbmV4dGVudHMgPiBibWEtPmlwLT5pX2RmLmlmX2V4dF9tYXgpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShibWEtPnRwLCBibWEtPmlwLAorCQkJCWJtYS0+Zmlyc3RibG9jaywgYm1hLT5mbGlzdCwgJmJtYS0+Y3VyLCAxLAorCQkJCSZ0bXBfcnZhbCwgWEZTX0RBVEFfRk9SSyk7CiAJCQlydmFsIHw9IHRtcF9ydmFsOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJfQotCQl0ZW1wID0gWEZTX0ZJTEJMS1NfTUlOKHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCksCisJCWRhX25ldyA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oYm1hLT5pcCwgdGVtcCksCiAJCQlzdGFydGJsb2NrdmFsKFBSRVYuYnJfc3RhcnRibG9jaykgLQotCQkJKGN1ciA/IGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA6IDApKTsKLQkJZXAgPSB4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCk7Ci0JCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBudWxsc3RhcnRibG9jaygoaW50KXRlbXApKTsKLQkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQkJKGJtYS0+Y3VyID8gYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgOiAwKSk7CisJCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKGRhX25ldykpOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAKLQkJKysqaWR4OwotCQkqZG5ldyA9IHRlbXA7CisJCWJtYS0+aWR4Kys7CiAJCWJyZWFrOwogCiAJY2FzZSAwOgpAQCAtMTAyNCw4MiArODA5LDY1IEBACiAJCSAqLwogCQl0ZW1wID0gbmV3LT5icl9zdGFydG9mZiAtIFBSRVYuYnJfc3RhcnRvZmY7CiAJCXRlbXAyID0gUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ld19lbmRvZmY7Ci0JCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoaXAsICppZHgsIDAsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIDAsIF9USElTX0lQXyk7CiAJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsJLyogdHJ1bmNhdGUgUFJFViAqLwogCQlMRUZUID0gKm5ldzsKIAkJUklHSFQuYnJfc3RhdGUgPSBQUkVWLmJyX3N0YXRlOwogCQlSSUdIVC5icl9zdGFydGJsb2NrID0gbnVsbHN0YXJ0YmxvY2soCi0JCQkJKGludCl4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXAyKSk7CisJCQkJKGludCl4ZnNfYm1hcF93b3JzdF9pbmRsZW4oYm1hLT5pcCwgdGVtcDIpKTsKIAkJUklHSFQuYnJfc3RhcnRvZmYgPSBuZXdfZW5kb2ZmOwogCQlSSUdIVC5icl9ibG9ja2NvdW50ID0gdGVtcDI7CiAJCS8qIGluc2VydCBMRUZUIChyWzBdKSBhbmQgUklHSFQgKHJbMV0pIGF0IHRoZSBzYW1lIHRpbWUgKi8KLQkJeGZzX2lleHRfaW5zZXJ0KGlwLCAqaWR4ICsgMSwgMiwgJkxFRlQsIHN0YXRlKTsKLQkJaXAtPmlfZC5kaV9uZXh0ZW50cysrOwotCQlpZiAoY3VyID09IE5VTEwpCisJCXhmc19pZXh0X2luc2VydChibWEtPmlwLCBibWEtPmlkeCArIDEsIDIsICZMRUZULCBzdGF0ZSk7CisJCWJtYS0+aXAtPmlfZC5kaV9uZXh0ZW50cysrOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKIAkJZWxzZSB7CiAJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIG5ldy0+YnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywgbmV3LT5icl9ibG9ja2NvdW50LAotCQkJCQkmaSkpKQorCQkJCQkmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAwLCBkb25lKTsKLQkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luc2VydChjdXIsICZpKSkpCisJCQlibWEtPmN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQllcnJvciA9IHhmc19idHJlZV9pbnNlcnQoYm1hLT5jdXIsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9Ci0JCWlmIChpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCi0JCSAgICBpcC0+aV9kLmRpX25leHRlbnRzID4gaXAtPmlfZGYuaWZfZXh0X21heCkgewotCQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKHRwLCBpcCwKLQkJCQkJZmlyc3QsIGZsaXN0LCAmY3VyLCAxLCAmdG1wX3J2YWwsCi0JCQkJCVhGU19EQVRBX0ZPUkspOworCQlpZiAoYm1hLT5pcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJCSAgICBibWEtPmlwLT5pX2QuZGlfbmV4dGVudHMgPiBibWEtPmlwLT5pX2RmLmlmX2V4dF9tYXgpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShibWEtPnRwLCBibWEtPmlwLAorCQkJCQlibWEtPmZpcnN0YmxvY2ssIGJtYS0+Zmxpc3QsICZibWEtPmN1ciwKKwkJCQkJMSwgJnRtcF9ydmFsLCBYRlNfREFUQV9GT1JLKTsKIAkJCXJ2YWwgfD0gdG1wX3J2YWw7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQl9Ci0JCXRlbXAgPSB4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApOwotCQl0ZW1wMiA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcDIpOworCQl0ZW1wID0geGZzX2JtYXBfd29yc3RfaW5kbGVuKGJtYS0+aXAsIHRlbXApOworCQl0ZW1wMiA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihibWEtPmlwLCB0ZW1wMik7CiAJCWRpZmYgPSAoaW50KSh0ZW1wICsgdGVtcDIgLSBzdGFydGJsb2NrdmFsKFBSRVYuYnJfc3RhcnRibG9jaykgLQotCQkJKGN1ciA/IGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA6IDApKTsKLQkJaWYgKGRpZmYgPiAwICYmCi0JCSAgICB4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMoaXAtPmlfbW91bnQsIFhGU19TQlNfRkRCTE9DS1MsCi0JCQkJCSAgICAgLSgoaW50NjRfdClkaWZmKSwgMCkpIHsKLQkJCS8qCi0JCQkgKiBJY2sgZ3Jvc3MgZ2FnIG1lIHdpdGggYSBzcG9vbi4KLQkJCSAqLwotCQkJQVNTRVJUKDApOwkvKiB3YW50IHRvIHNlZSBpZiB0aGlzIGV2ZXIgaGFwcGVucyEgKi8KLQkJCXdoaWxlIChkaWZmID4gMCkgewotCQkJCWlmICh0ZW1wKSB7Ci0JCQkJCXRlbXAtLTsKLQkJCQkJZGlmZi0tOwotCQkJCQlpZiAoIWRpZmYgfHwKLQkJCQkJICAgICF4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMoaXAtPmlfbW91bnQsCi0JCQkJCQkgICAgWEZTX1NCU19GREJMT0NLUywKLQkJCQkJCSAgICAtKChpbnQ2NF90KWRpZmYpLCAwKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodGVtcDIpIHsKLQkJCQkJdGVtcDItLTsKLQkJCQkJZGlmZi0tOwotCQkJCQlpZiAoIWRpZmYgfHwKLQkJCQkJICAgICF4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMoaXAtPmlfbW91bnQsCi0JCQkJCQkgICAgWEZTX1NCU19GREJMT0NLUywKLQkJCQkJCSAgICAtKChpbnQ2NF90KWRpZmYpLCAwKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KKwkJCShibWEtPmN1ciA/IGJtYS0+Y3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkIDogMCkpOworCQlpZiAoZGlmZiA+IDApIHsKKwkJCWVycm9yID0geGZzX2ljc2JfbW9kaWZ5X2NvdW50ZXJzKGJtYS0+aXAtPmlfbW91bnQsCisJCQkJCVhGU19TQlNfRkRCTE9DS1MsCisJCQkJCS0oKGludDY0X3QpZGlmZiksIDApOworCQkJQVNTRVJUKCFlcnJvcik7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBkb25lOwogCQl9Ci0JCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpOwotCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbnVsbHN0YXJ0YmxvY2soKGludCl0ZW1wKSk7Ci0JCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCArIDIsIHN0YXRlLCBfVEhJU19JUF8pOwotCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCArIDIpLAotCQkJbnVsbHN0YXJ0YmxvY2soKGludCl0ZW1wMikpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCArIDIsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCSsrKmlkeDsKLQkJKmRuZXcgPSB0ZW1wICsgdGVtcDI7CisJCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKChpbnQpdGVtcCkpOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHggKyAyLCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4ICsgMiksCisJCQludWxsc3RhcnRibG9jaygoaW50KXRlbXAyKSk7CisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMiwgc3RhdGUsIF9USElTX0lQXyk7CisKKwkJYm1hLT5pZHgrKzsKKwkJZGFfbmV3ID0gdGVtcCArIHRlbXAyOwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkcgfCBCTUFQX0xFRlRfQ09OVElHIHwgQk1BUF9SSUdIVF9DT05USUc6CkBAIC0xMTE0LDkgKzg4Miw0MCBAQAogCQkgKi8KIAkJQVNTRVJUKDApOwogCX0KLQkqY3VycCA9IGN1cjsKKworCS8qIGNvbnZlcnQgdG8gYSBidHJlZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChibWEtPmlwLCBYRlNfREFUQV9GT1JLKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgIFhGU19JRk9SS19ORVhURU5UUyhibWEtPmlwLCBYRlNfREFUQV9GT1JLKSA+IGlmcC0+aWZfZXh0X21heCkgeworCQlpbnQJdG1wX2xvZ2ZsYWdzOwkvKiBwYXJ0aWFsIGxvZyBmbGFnIHJldHVybiB2YWwgKi8KKworCQlBU1NFUlQoYm1hLT5jdXIgPT0gTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShibWEtPnRwLCBibWEtPmlwLAorCQkJCWJtYS0+Zmlyc3RibG9jaywgYm1hLT5mbGlzdCwgJmJtYS0+Y3VyLAorCQkJCWRhX29sZCA+IDAsICZ0bXBfbG9nZmxhZ3MsIFhGU19EQVRBX0ZPUkspOworCQlibWEtPmxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGVycm9yKQorCQkJZ290byBkb25lOworCX0KKworCS8qIGFkanVzdCBmb3IgY2hhbmdlcyBpbiByZXNlcnZlZCBkZWxheWVkIGluZGlyZWN0IGJsb2NrcyAqLworCWlmIChkYV9vbGQgfHwgZGFfbmV3KSB7CisJCXRlbXAgPSBkYV9uZXc7CisJCWlmIChibWEtPmN1cikKKwkJCXRlbXAgKz0gYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQ7CisJCUFTU0VSVCh0ZW1wIDw9IGRhX29sZCk7CisJCWlmICh0ZW1wIDwgZGFfb2xkKQorCQkJeGZzX2ljc2JfbW9kaWZ5X2NvdW50ZXJzKGJtYS0+aXAtPmlfbW91bnQsCisJCQkJCVhGU19TQlNfRkRCTE9DS1MsCisJCQkJCShpbnQ2NF90KShkYV9vbGQgLSB0ZW1wKSwgMCk7CisJfQorCisJLyogY2xlYXIgb3V0IHRoZSBhbGxvY2F0ZWQgZmllbGQsIGRvbmUgd2l0aCBpdCBub3cgaW4gYW55IGNhc2UuICovCisJaWYgKGJtYS0+Y3VyKQorCQlibWEtPmN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA9IDA7CisKKwl4ZnNfYm1hcF9jaGVja19sZWFmX2V4dGVudHMoYm1hLT5jdXIsIGJtYS0+aXAsIFhGU19EQVRBX0ZPUkspOwogZG9uZToKLQkqbG9nZmxhZ3NwID0gcnZhbDsKKwlibWEtPmxvZ2ZsYWdzIHw9IHJ2YWw7CiAJcmV0dXJuIGVycm9yOwogI3VuZGVmCUxFRlQKICN1bmRlZglSSUdIVApAQCAtMTEyNCwxNSArOTIzLDE3IEBACiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhbiB1bndyaXR0ZW4KLSAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24gb3IgdmljZSB2ZXJzYS4KKyAqIENvbnZlcnQgYW4gdW53cml0dGVuIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24gb3IgdmljZSB2ZXJzYS4KICAqLwogU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwogeGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbCgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwKIAl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwogCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCiAJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCiAJeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0LAkvKiBwb2ludGVyIHRvIGZpcnN0YmxvY2sgdmFyaWFibGUgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCiAJaW50CQkJKmxvZ2ZsYWdzcCkgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwogewogCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJLyogYnRyZWUgY3Vyc29yICovCkBAIC0xMTQ4LDE1ICs5NDksMjUgQEAKIAlpbnQJCQlydmFsPTA7CS8qIHJldHVybiB2YWx1ZSAobG9nZ2luZyBmbGFncykgKi8KIAlpbnQJCQlzdGF0ZSA9IDA7Lyogc3RhdGUgYml0cywgYWNjZXNzZWQgdGhydSBtYWNyb3MgKi8KIAorCSpsb2dmbGFnc3AgPSAwOworCisJY3VyID0gKmN1cnA7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7CisKKwlBU1NFUlQoKmlkeCA+PSAwKTsKKwlBU1NFUlQoKmlkeCA8PSBpZnAtPmlmX2J5dGVzIC8gc2l6ZW9mKHN0cnVjdCB4ZnNfYm1idF9yZWMpKTsKKwlBU1NFUlQoIWlzbnVsbHN0YXJ0YmxvY2sobmV3LT5icl9zdGFydGJsb2NrKSk7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2FkZF9leGxpc3QpOworCiAjZGVmaW5lCUxFRlQJCXJbMF0KICNkZWZpbmUJUklHSFQJCXJbMV0KICNkZWZpbmUJUFJFVgkJclsyXQorCiAJLyoKIAkgKiBTZXQgdXAgYSBidW5jaCBvZiB2YXJpYWJsZXMgdG8gbWFrZSB0aGUgdGVzdHMgc2ltcGxlci4KIAkgKi8KIAllcnJvciA9IDA7Ci0JY3VyID0gKmN1cnA7Ci0JaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7CiAJZXAgPSB4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCk7CiAJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJlBSRVYpOwogCW5ld2V4dCA9IG5ldy0+YnJfc3RhdGU7CkBAIC0xNDA2LDEwICsxMjE3LDExIEBACiAJCQkJZ290byBkb25lOwogCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKLQkJCWlmICh4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCUxFRlQuYnJfc3RhcnRibG9jaywKIAkJCQlMRUZULmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQsCi0JCQkJTEVGVC5icl9zdGF0ZSkpCisJCQkJTEVGVC5icl9zdGF0ZSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQl9CiAJCWJyZWFrOwpAQCAtMTYwNyw5ICsxNDE5LDI5IEBACiAJCSAqLwogCQlBU1NFUlQoMCk7CiAJfQotCSpjdXJwID0gY3VyOworCisJLyogY29udmVydCB0byBhIGJ0cmVlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCBYRlNfREFUQV9GT1JLKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgIFhGU19JRk9SS19ORVhURU5UUyhpcCwgWEZTX0RBVEFfRk9SSykgPiBpZnAtPmlmX2V4dF9tYXgpIHsKKwkJaW50CXRtcF9sb2dmbGFnczsJLyogcGFydGlhbCBsb2cgZmxhZyByZXR1cm4gdmFsICovCisKKwkJQVNTRVJUKGN1ciA9PSBOVUxMKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKHRwLCBpcCwgZmlyc3QsIGZsaXN0LCAmY3VyLAorCQkJCTAsICZ0bXBfbG9nZmxhZ3MsIFhGU19EQVRBX0ZPUkspOworCQkqbG9nZmxhZ3NwIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGVycm9yKQorCQkJZ290byBkb25lOworCX0KKworCS8qIGNsZWFyIG91dCB0aGUgYWxsb2NhdGVkIGZpZWxkLCBkb25lIHdpdGggaXQgbm93IGluIGFueSBjYXNlLiAqLworCWlmIChjdXIpIHsKKwkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkID0gMDsKKwkJKmN1cnAgPSBjdXI7CisJfQorCisJeGZzX2JtYXBfY2hlY2tfbGVhZl9leHRlbnRzKCpjdXJwLCBpcCwgWEZTX0RBVEFfRk9SSyk7CiBkb25lOgotCSpsb2dmbGFnc3AgPSBydmFsOworCSpsb2dmbGFnc3AgfD0gcnZhbDsKIAlyZXR1cm4gZXJyb3I7CiAjdW5kZWYJTEVGVAogI3VuZGVmCVJJR0hUCkBAIC0xNjE3LDE2ICsxNDQ5LDEzIEBACiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGhvbGUKLSAqIHRvIGEgZGVsYXllZCBhbGxvY2F0aW9uLgorICogQ29udmVydCBhIGhvbGUgdG8gYSBkZWxheWVkIGFsbG9jYXRpb24uCiAgKi8KLS8qQVJHU1VTRUQqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworU1RBVElDIHZvaWQKIHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9kZWxheSgKIAl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwogCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCkgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldykJLyogbmV3IGRhdGEgdG8gYWRkIHRvIGZpbGUgZXh0ZW50cyAqLwogewogCXhmc19pZm9ya190CQkqaWZwOwkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KIAl4ZnNfYm1idF9pcmVjX3QJCWxlZnQ7CS8qIGxlZnQgbmVpZ2hib3IgZXh0ZW50IGVudHJ5ICovCkBAIC0xNzYxLDIzICsxNTkwLDE3IEBACiAJCSAqIE5vdGhpbmcgdG8gZG8gZm9yIGRpc2sgcXVvdGEgYWNjb3VudGluZyBoZXJlLgogCQkgKi8KIAl9Ci0JKmxvZ2ZsYWdzcCA9IDA7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGhvbGUKLSAqIHRvIGEgcmVhbCBhbGxvY2F0aW9uLgorICogQ29udmVydCBhIGhvbGUgdG8gYSByZWFsIGFsbG9jYXRpb24uCiAgKi8KIFNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KIHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKAotCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CQkqaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGlmIG51bGwsIG5vdCBhIGJ0cmVlICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCWludAkJCXdoaWNoZm9yaykgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEsCisJaW50CQkJd2hpY2hmb3JrKQogeworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpuZXcgPSAmYm1hLT5nb3Q7CiAJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwogCWludAkJCWk7CS8qIHRlbXAgc3RhdGUgKi8KIAl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogaW5vZGUgZm9yayBwb2ludGVyICovCkBAIC0xNzg2LDE5ICsxNjA5LDI2IEBACiAJaW50CQkJcnZhbD0wOwkvKiByZXR1cm4gdmFsdWUgKGxvZ2dpbmcgZmxhZ3MpICovCiAJaW50CQkJc3RhdGU7CS8qIHN0YXRlIGJpdHMsIGFjY2Vzc2VkIHRocnUgbWFjcm9zICovCiAKLQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwotCUFTU0VSVCgqaWR4IDw9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKLQlzdGF0ZSA9IDA7CisJaWZwID0gWEZTX0lGT1JLX1BUUihibWEtPmlwLCB3aGljaGZvcmspOwogCisJQVNTRVJUKGJtYS0+aWR4ID49IDApOworCUFTU0VSVChibWEtPmlkeCA8PSBpZnAtPmlmX2J5dGVzIC8gc2l6ZW9mKHN0cnVjdCB4ZnNfYm1idF9yZWMpKTsKKwlBU1NFUlQoIWlzbnVsbHN0YXJ0YmxvY2sobmV3LT5icl9zdGFydGJsb2NrKSk7CisJQVNTRVJUKCFibWEtPmN1ciB8fAorCSAgICAgICAhKGJtYS0+Y3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJiBYRlNfQlRDVVJfQlBSVl9XQVNERUwpKTsKKworCVhGU19TVEFUU19JTkMoeHNfYWRkX2V4bGlzdCk7CisKKwlzdGF0ZSA9IDA7CiAJaWYgKHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLKQogCQlzdGF0ZSB8PSBCTUFQX0FUVFJGT1JLOwogCiAJLyoKIAkgKiBDaGVjayBhbmQgc2V0IGZsYWdzIGlmIHRoaXMgc2VnbWVudCBoYXMgYSBsZWZ0IG5laWdoYm9yLgogCSAqLwotCWlmICgqaWR4ID4gMCkgeworCWlmIChibWEtPmlkeCA+IDApIHsKIAkJc3RhdGUgfD0gQk1BUF9MRUZUX1ZBTElEOwotCQl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCAqaWR4IC0gMSksICZsZWZ0KTsKKwkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgYm1hLT5pZHggLSAxKSwgJmxlZnQpOwogCQlpZiAoaXNudWxsc3RhcnRibG9jayhsZWZ0LmJyX3N0YXJ0YmxvY2spKQogCQkJc3RhdGUgfD0gQk1BUF9MRUZUX0RFTEFZOwogCX0KQEAgLTE4MDcsOSArMTYzNyw5IEBACiAJICogQ2hlY2sgYW5kIHNldCBmbGFncyBpZiB0aGlzIHNlZ21lbnQgaGFzIGEgY3VycmVudCB2YWx1ZS4KIAkgKiBOb3QgdHJ1ZSBpZiB3ZSdyZSBpbnNlcnRpbmcgaW50byB0aGUgImhvbGUiIGF0IGVvZi4KIAkgKi8KLQlpZiAoKmlkeCA8IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKSB7CisJaWYgKGJtYS0+aWR4IDwgaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpIHsKIAkJc3RhdGUgfD0gQk1BUF9SSUdIVF9WQUxJRDsKLQkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCksICZyaWdodCk7CisJCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KSwgJnJpZ2h0KTsKIAkJaWYgKGlzbnVsbHN0YXJ0YmxvY2socmlnaHQuYnJfc3RhcnRibG9jaykpCiAJCQlzdGF0ZSB8PSBCTUFQX1JJR0hUX0RFTEFZOwogCX0KQEAgLTE4NDYsMzkgKzE2NzYsNDIgQEAKIAkJICogbGVmdCBhbmQgb24gdGhlIHJpZ2h0LgogCQkgKiBNZXJnZSBhbGwgdGhyZWUgaW50byBhIHNpbmdsZSBleHRlbnQgcmVjb3JkLgogCQkgKi8KLQkJLS0qaWR4OwotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpLAorCQktLWJtYS0+aWR4OworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KSwKIAkJCWxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCArCiAJCQlyaWdodC5icl9ibG9ja2NvdW50KTsKLQkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAKLQkJeGZzX2lleHRfcmVtb3ZlKGlwLCAqaWR4ICsgMSwgMSwgc3RhdGUpOworCQl4ZnNfaWV4dF9yZW1vdmUoYm1hLT5pcCwgYm1hLT5pZHggKyAxLCAxLCBzdGF0ZSk7CiAKLQkJWEZTX0lGT1JLX05FWFRfU0VUKGlwLCB3aGljaGZvcmssCi0JCQlYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgLSAxKTsKLQkJaWYgKGN1ciA9PSBOVUxMKSB7CisJCVhGU19JRk9SS19ORVhUX1NFVChibWEtPmlwLCB3aGljaGZvcmssCisJCQlYRlNfSUZPUktfTkVYVEVOVFMoYm1hLT5pcCwgd2hpY2hmb3JrKSAtIDEpOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkgewogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCB4ZnNfaWxvZ19mZXh0KHdoaWNoZm9yayk7CiAJCX0gZWxzZSB7CiAJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLAotCQkJCQlyaWdodC5icl9zdGFydG9mZiwKLQkJCQkJcmlnaHQuYnJfc3RhcnRibG9jaywKLQkJCQkJcmlnaHQuYnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCWVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGJtYS0+Y3VyLCByaWdodC5icl9zdGFydG9mZiwKKwkJCQkJcmlnaHQuYnJfc3RhcnRibG9jaywgcmlnaHQuYnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShjdXIsICZpKSkpCisJCQllcnJvciA9IHhmc19idHJlZV9kZWxldGUoYm1hLT5jdXIsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KGJtYS0+Y3VyLCAwLCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBsZWZ0LmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoYm1hLT5jdXIsIGxlZnQuYnJfc3RhcnRvZmYsCiAJCQkJCWxlZnQuYnJfc3RhcnRibG9jaywKIAkJCQkJbGVmdC5icl9ibG9ja2NvdW50ICsKIAkJCQkJCW5ldy0+YnJfYmxvY2tjb3VudCArCiAJCQkJCQlyaWdodC5icl9ibG9ja2NvdW50LAotCQkJCQlsZWZ0LmJyX3N0YXRlKSkpCisJCQkJCWxlZnQuYnJfc3RhdGUpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJfQogCQlicmVhazsKQEAgLTE4ODksMjcgKzE3MjIsMjggQEAKIAkJICogb24gdGhlIGxlZnQuCiAJCSAqIE1lcmdlIHRoZSBuZXcgYWxsb2NhdGlvbiB3aXRoIHRoZSBsZWZ0IG5laWdoYm9yLgogCQkgKi8KLQkJLS0qaWR4OwotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpLAorCQktLWJtYS0+aWR4OworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KSwKIAkJCWxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCk7Ci0JCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCWlmIChjdXIgPT0gTlVMTCkgeworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkgewogCQkJcnZhbCA9IHhmc19pbG9nX2ZleHQod2hpY2hmb3JrKTsKIAkJfSBlbHNlIHsKIAkJCXJ2YWwgPSAwOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsCi0JCQkJCWxlZnQuYnJfc3RhcnRvZmYsCi0JCQkJCWxlZnQuYnJfc3RhcnRibG9jaywKLQkJCQkJbGVmdC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIGxlZnQuYnJfc3RhcnRvZmYsCisJCQkJCWxlZnQuYnJfc3RhcnRibG9jaywgbGVmdC5icl9ibG9ja2NvdW50LAorCQkJCQkmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBsZWZ0LmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoYm1hLT5jdXIsIGxlZnQuYnJfc3RhcnRvZmYsCiAJCQkJCWxlZnQuYnJfc3RhcnRibG9jaywKIAkJCQkJbGVmdC5icl9ibG9ja2NvdW50ICsKIAkJCQkJCW5ldy0+YnJfYmxvY2tjb3VudCwKLQkJCQkJbGVmdC5icl9zdGF0ZSkpKQorCQkJCQlsZWZ0LmJyX3N0YXRlKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAkJYnJlYWs7CkBAIC0xOTIwLDI4ICsxNzU0LDMwIEBACiAJCSAqIG9uIHRoZSByaWdodC4KIAkJICogTWVyZ2UgdGhlIG5ldyBhbGxvY2F0aW9uIHdpdGggdGhlIHJpZ2h0IG5laWdoYm9yLgogCQkgKi8KLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7Ci0JCXhmc19ibWJ0X3NldF9hbGxmKHhmc19pZXh0X2dldF9leHQoaWZwLCAqaWR4KSwKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXhmc19ibWJ0X3NldF9hbGxmKHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCksCiAJCQluZXctPmJyX3N0YXJ0b2ZmLCBuZXctPmJyX3N0YXJ0YmxvY2ssCiAJCQluZXctPmJyX2Jsb2NrY291bnQgKyByaWdodC5icl9ibG9ja2NvdW50LAogCQkJcmlnaHQuYnJfc3RhdGUpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAotCQlpZiAoY3VyID09IE5VTEwpIHsKKwkJaWYgKGJtYS0+Y3VyID09IE5VTEwpIHsKIAkJCXJ2YWwgPSB4ZnNfaWxvZ19mZXh0KHdoaWNoZm9yayk7CiAJCX0gZWxzZSB7CiAJCQlydmFsID0gMDsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsCiAJCQkJCXJpZ2h0LmJyX3N0YXJ0b2ZmLAogCQkJCQlyaWdodC5icl9zdGFydGJsb2NrLAotCQkJCQlyaWdodC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCQlyaWdodC5icl9ibG9ja2NvdW50LCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoYm1hLT5jdXIsIG5ldy0+YnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywKIAkJCQkJbmV3LT5icl9ibG9ja2NvdW50ICsKIAkJCQkJCXJpZ2h0LmJyX2Jsb2NrY291bnQsCi0JCQkJCXJpZ2h0LmJyX3N0YXRlKSkpCisJCQkJCXJpZ2h0LmJyX3N0YXRlKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAkJYnJlYWs7CkBAIC0xOTUyLDI4ICsxNzg4LDUwIEBACiAJCSAqIHJlYWwgYWxsb2NhdGlvbi4KIAkJICogSW5zZXJ0IGEgbmV3IGVudHJ5LgogCQkgKi8KLQkJeGZzX2lleHRfaW5zZXJ0KGlwLCAqaWR4LCAxLCBuZXcsIHN0YXRlKTsKLQkJWEZTX0lGT1JLX05FWFRfU0VUKGlwLCB3aGljaGZvcmssCi0JCQlYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgKyAxKTsKLQkJaWYgKGN1ciA9PSBOVUxMKSB7CisJCXhmc19pZXh0X2luc2VydChibWEtPmlwLCBibWEtPmlkeCwgMSwgbmV3LCBzdGF0ZSk7CisJCVhGU19JRk9SS19ORVhUX1NFVChibWEtPmlwLCB3aGljaGZvcmssCisJCQlYRlNfSUZPUktfTkVYVEVOVFMoYm1hLT5pcCwgd2hpY2hmb3JrKSArIDEpOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkgewogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCB4ZnNfaWxvZ19mZXh0KHdoaWNoZm9yayk7CiAJCX0gZWxzZSB7CiAJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsCiAJCQkJCW5ldy0+YnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywKLQkJCQkJbmV3LT5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCQluZXctPmJyX2Jsb2NrY291bnQsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDAsIGRvbmUpOwotCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IG5ldy0+YnJfc3RhdGU7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luc2VydChjdXIsICZpKSkpCisJCQlibWEtPmN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBuZXctPmJyX3N0YXRlOworCQkJZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGJtYS0+Y3VyLCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKIAkJfQogCQlicmVhazsKIAl9CisKKwkvKiBjb252ZXJ0IHRvIGEgYnRyZWUgaWYgbmVjZXNzYXJ5ICovCisJaWYgKFhGU19JRk9SS19GT1JNQVQoYm1hLT5pcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgIFhGU19JRk9SS19ORVhURU5UUyhibWEtPmlwLCB3aGljaGZvcmspID4gaWZwLT5pZl9leHRfbWF4KSB7CisJCWludAl0bXBfbG9nZmxhZ3M7CS8qIHBhcnRpYWwgbG9nIGZsYWcgcmV0dXJuIHZhbCAqLworCisJCUFTU0VSVChibWEtPmN1ciA9PSBOVUxMKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKGJtYS0+dHAsIGJtYS0+aXAsCisJCQkJYm1hLT5maXJzdGJsb2NrLCBibWEtPmZsaXN0LCAmYm1hLT5jdXIsCisJCQkJMCwgJnRtcF9sb2dmbGFncywgd2hpY2hmb3JrKTsKKwkJYm1hLT5sb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBjbGVhciBvdXQgdGhlIGFsbG9jYXRlZCBmaWVsZCwgZG9uZSB3aXRoIGl0IG5vdyBpbiBhbnkgY2FzZS4gKi8KKwlpZiAoYm1hLT5jdXIpCisJCWJtYS0+Y3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkID0gMDsKKworCXhmc19ibWFwX2NoZWNrX2xlYWZfZXh0ZW50cyhibWEtPmN1ciwgYm1hLT5pcCwgd2hpY2hmb3JrKTsKIGRvbmU6Ci0JKmxvZ2ZsYWdzcCA9IHJ2YWw7CisJYm1hLT5sb2dmbGFncyB8PSBydmFsOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjE2MCwyNiArMjAxOCwyNiBAQAogCQlYRlNfRlNCX1RPX0FHQk5PKG1wLCB4KSA8IG1wLT5tX3NiLnNiX2FnYmxvY2tzKQogCiAJbXAgPSBhcC0+aXAtPmlfbW91bnQ7Ci0JbnVsbGZiID0gYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0s7CisJbnVsbGZiID0gKmFwLT5maXJzdGJsb2NrID09IE5VTExGU0JMT0NLOwogCXJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGFwLT5pcCkgJiYgYXAtPnVzZXJkYXRhOwotCWZiX2Fnbm8gPSBudWxsZmIgPyBOVUxMQUdOVU1CRVIgOiBYRlNfRlNCX1RPX0FHTk8obXAsIGFwLT5maXJzdGJsb2NrKTsKKwlmYl9hZ25vID0gbnVsbGZiID8gTlVMTEFHTlVNQkVSIDogWEZTX0ZTQl9UT19BR05PKG1wLCAqYXAtPmZpcnN0YmxvY2spOwogCS8qCiAJICogSWYgYWxsb2NhdGluZyBhdCBlb2YsIGFuZCB0aGVyZSdzIGEgcHJldmlvdXMgcmVhbCBibG9jaywKIAkgKiB0cnkgdG8gdXNlIGl0cyBsYXN0IGJsb2NrIGFzIG91ciBzdGFydGluZyBwb2ludC4KIAkgKi8KLQlpZiAoYXAtPmVvZiAmJiBhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGICYmCi0JICAgICFpc251bGxzdGFydGJsb2NrKGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykgJiYKLQkgICAgSVNWQUxJRChhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2sgKyBhcC0+cHJldnAtPmJyX2Jsb2NrY291bnQsCi0JCSAgICBhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2spKSB7Ci0JCWFwLT5ydmFsID0gYXAtPnByZXZwLT5icl9zdGFydGJsb2NrICsgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50OworCWlmIChhcC0+ZW9mICYmIGFwLT5wcmV2LmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGICYmCisJICAgICFpc251bGxzdGFydGJsb2NrKGFwLT5wcmV2LmJyX3N0YXJ0YmxvY2spICYmCisJICAgIElTVkFMSUQoYXAtPnByZXYuYnJfc3RhcnRibG9jayArIGFwLT5wcmV2LmJyX2Jsb2NrY291bnQsCisJCSAgICBhcC0+cHJldi5icl9zdGFydGJsb2NrKSkgeworCQlhcC0+Ymxrbm8gPSBhcC0+cHJldi5icl9zdGFydGJsb2NrICsgYXAtPnByZXYuYnJfYmxvY2tjb3VudDsKIAkJLyoKIAkJICogQWRqdXN0IGZvciB0aGUgZ2FwIGJldHdlZW4gcHJldnAgYW5kIHVzLgogCQkgKi8KLQkJYWRqdXN0ID0gYXAtPm9mZiAtCi0JCQkoYXAtPnByZXZwLT5icl9zdGFydG9mZiArIGFwLT5wcmV2cC0+YnJfYmxvY2tjb3VudCk7CisJCWFkanVzdCA9IGFwLT5vZmZzZXQgLQorCQkJKGFwLT5wcmV2LmJyX3N0YXJ0b2ZmICsgYXAtPnByZXYuYnJfYmxvY2tjb3VudCk7CiAJCWlmIChhZGp1c3QgJiYKLQkJICAgIElTVkFMSUQoYXAtPnJ2YWwgKyBhZGp1c3QsIGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykpCi0JCQlhcC0+cnZhbCArPSBhZGp1c3Q7CisJCSAgICBJU1ZBTElEKGFwLT5ibGtubyArIGFkanVzdCwgYXAtPnByZXYuYnJfc3RhcnRibG9jaykpCisJCQlhcC0+Ymxrbm8gKz0gYWRqdXN0OwogCX0KIAkvKgogCSAqIElmIG5vdCBhdCBlb2YsIHRoZW4gY29tcGFyZSB0aGUgdHdvIG5laWdoYm9yIGJsb2Nrcy4KQEAgLTIxOTYsMTcgKzIwNTQsMTcgQEAKIAkJICogSWYgdGhlcmUncyBhIHByZXZpb3VzIChsZWZ0KSBibG9jaywgc2VsZWN0IGEgcmVxdWVzdGVkCiAJCSAqIHN0YXJ0IGJsb2NrIGJhc2VkIG9uIGl0LgogCQkgKi8KLQkJaWYgKGFwLT5wcmV2cC0+YnJfc3RhcnRvZmYgIT0gTlVMTEZJTEVPRkYgJiYKLQkJICAgICFpc251bGxzdGFydGJsb2NrKGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykgJiYKLQkJICAgIChwcmV2Ym5vID0gYXAtPnByZXZwLT5icl9zdGFydGJsb2NrICsKLQkJCSAgICAgICBhcC0+cHJldnAtPmJyX2Jsb2NrY291bnQpICYmCi0JCSAgICBJU1ZBTElEKHByZXZibm8sIGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykpIHsKKwkJaWYgKGFwLT5wcmV2LmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGICYmCisJCSAgICAhaXNudWxsc3RhcnRibG9jayhhcC0+cHJldi5icl9zdGFydGJsb2NrKSAmJgorCQkgICAgKHByZXZibm8gPSBhcC0+cHJldi5icl9zdGFydGJsb2NrICsKKwkJCSAgICAgICBhcC0+cHJldi5icl9ibG9ja2NvdW50KSAmJgorCQkgICAgSVNWQUxJRChwcmV2Ym5vLCBhcC0+cHJldi5icl9zdGFydGJsb2NrKSkgewogCQkJLyoKIAkJCSAqIENhbGN1bGF0ZSBnYXAgdG8gZW5kIG9mIHByZXZpb3VzIGJsb2NrLgogCQkJICovCi0JCQlhZGp1c3QgPSBwcmV2ZGlmZiA9IGFwLT5vZmYgLQotCQkJCShhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICsKLQkJCQkgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50KTsKKwkJCWFkanVzdCA9IHByZXZkaWZmID0gYXAtPm9mZnNldCAtCisJCQkJKGFwLT5wcmV2LmJyX3N0YXJ0b2ZmICsKKwkJCQkgYXAtPnByZXYuYnJfYmxvY2tjb3VudCk7CiAJCQkvKgogCQkJICogRmlndXJlIHRoZSBzdGFydGJsb2NrIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBibG9jaydzCiAJCQkgKiBlbmQgYW5kIHRoZSBnYXAgc2l6ZS4KQEAgLTIyMTUsOSArMjA3Myw5IEBACiAJCQkgKiBhbGxvY2F0aW5nLCBvciB1c2luZyBpdCBnaXZlcyB1cyBhbiBpbnZhbGlkIGJsb2NrCiAJCQkgKiBudW1iZXIsIHRoZW4ganVzdCB1c2UgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgYmxvY2suCiAJCQkgKi8KLQkJCWlmIChwcmV2ZGlmZiA8PSBYRlNfQUxMT0NfR0FQX1VOSVRTICogYXAtPmFsZW4gJiYKKwkJCWlmIChwcmV2ZGlmZiA8PSBYRlNfQUxMT0NfR0FQX1VOSVRTICogYXAtPmxlbmd0aCAmJgogCQkJICAgIElTVkFMSUQocHJldmJubyArIHByZXZkaWZmLAotCQkJCSAgICBhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2spKQorCQkJCSAgICBhcC0+cHJldi5icl9zdGFydGJsb2NrKSkKIAkJCQlwcmV2Ym5vICs9IGFkanVzdDsKIAkJCWVsc2UKIAkJCQlwcmV2ZGlmZiArPSBhZGp1c3Q7CkBAIC0yMjM4LDE2ICsyMDk2LDE2IEBACiAJCSAqIElmIHRoZXJlJ3MgYSBmb2xsb3dpbmcgKHJpZ2h0KSBibG9jaywgc2VsZWN0IGEgcmVxdWVzdGVkCiAJCSAqIHN0YXJ0IGJsb2NrIGJhc2VkIG9uIGl0LgogCQkgKi8KLQkJaWYgKCFpc251bGxzdGFydGJsb2NrKGFwLT5nb3RwLT5icl9zdGFydGJsb2NrKSkgeworCQlpZiAoIWlzbnVsbHN0YXJ0YmxvY2soYXAtPmdvdC5icl9zdGFydGJsb2NrKSkgewogCQkJLyoKIAkJCSAqIENhbGN1bGF0ZSBnYXAgdG8gc3RhcnQgb2YgbmV4dCBibG9jay4KIAkJCSAqLwotCQkJYWRqdXN0ID0gZ290ZGlmZiA9IGFwLT5nb3RwLT5icl9zdGFydG9mZiAtIGFwLT5vZmY7CisJCQlhZGp1c3QgPSBnb3RkaWZmID0gYXAtPmdvdC5icl9zdGFydG9mZiAtIGFwLT5vZmZzZXQ7CiAJCQkvKgogCQkJICogRmlndXJlIHRoZSBzdGFydGJsb2NrIGJhc2VkIG9uIHRoZSBuZXh0IGJsb2NrJ3MKIAkJCSAqIHN0YXJ0IGFuZCB0aGUgZ2FwIHNpemUuCiAJCQkgKi8KLQkJCWdvdGJubyA9IGFwLT5nb3RwLT5icl9zdGFydGJsb2NrOworCQkJZ290Ym5vID0gYXAtPmdvdC5icl9zdGFydGJsb2NrOwogCQkJLyoKIAkJCSAqIEhldXJpc3RpYyEKIAkJCSAqIElmIHRoZSBnYXAgaXMgbGFyZ2UgcmVsYXRpdmUgdG8gdGhlIHBpZWNlIHdlJ3JlCkBAIC0yMjU1LDEyICsyMTEzLDEyIEBACiAJCQkgKiBudW1iZXIsIHRoZW4ganVzdCB1c2UgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGJsb2NrCiAJCQkgKiBvZmZzZXQgYnkgb3VyIGxlbmd0aC4KIAkJCSAqLwotCQkJaWYgKGdvdGRpZmYgPD0gWEZTX0FMTE9DX0dBUF9VTklUUyAqIGFwLT5hbGVuICYmCisJCQlpZiAoZ290ZGlmZiA8PSBYRlNfQUxMT0NfR0FQX1VOSVRTICogYXAtPmxlbmd0aCAmJgogCQkJICAgIElTVkFMSUQoZ290Ym5vIC0gZ290ZGlmZiwgZ290Ym5vKSkKIAkJCQlnb3Ribm8gLT0gYWRqdXN0OwotCQkJZWxzZSBpZiAoSVNWQUxJRChnb3Ribm8gLSBhcC0+YWxlbiwgZ290Ym5vKSkgewotCQkJCWdvdGJubyAtPSBhcC0+YWxlbjsKLQkJCQlnb3RkaWZmICs9IGFkanVzdCAtIGFwLT5hbGVuOworCQkJZWxzZSBpZiAoSVNWQUxJRChnb3Ribm8gLSBhcC0+bGVuZ3RoLCBnb3Ribm8pKSB7CisJCQkJZ290Ym5vIC09IGFwLT5sZW5ndGg7CisJCQkJZ290ZGlmZiArPSBhZGp1c3QgLSBhcC0+bGVuZ3RoOwogCQkJfSBlbHNlCiAJCQkJZ290ZGlmZiArPSBhZGp1c3Q7CiAJCQkvKgpAQCAtMjI3OCwxNCArMjEzNiwxNCBAQAogCQkJZ290Ym5vID0gTlVMTEZTQkxPQ0s7CiAJCS8qCiAJCSAqIElmIGJvdGggdmFsaWQsIHBpY2sgdGhlIGJldHRlciBvbmUsIGVsc2UgdGhlIG9ubHkgZ29vZAotCQkgKiBvbmUsIGVsc2UgYXAtPnJ2YWwgaXMgYWxyZWFkeSBzZXQgKHRvIDAgb3IgdGhlIGlub2RlIGJsb2NrKS4KKwkJICogb25lLCBlbHNlIGFwLT5ibGtubyBpcyBhbHJlYWR5IHNldCAodG8gMCBvciB0aGUgaW5vZGUgYmxvY2spLgogCQkgKi8KIAkJaWYgKHByZXZibm8gIT0gTlVMTEZTQkxPQ0sgJiYgZ290Ym5vICE9IE5VTExGU0JMT0NLKQotCQkJYXAtPnJ2YWwgPSBwcmV2ZGlmZiA8PSBnb3RkaWZmID8gcHJldmJubyA6IGdvdGJubzsKKwkJCWFwLT5ibGtubyA9IHByZXZkaWZmIDw9IGdvdGRpZmYgPyBwcmV2Ym5vIDogZ290Ym5vOwogCQllbHNlIGlmIChwcmV2Ym5vICE9IE5VTExGU0JMT0NLKQotCQkJYXAtPnJ2YWwgPSBwcmV2Ym5vOworCQkJYXAtPmJsa25vID0gcHJldmJubzsKIAkJZWxzZSBpZiAoZ290Ym5vICE9IE5VTExGU0JMT0NLKQotCQkJYXAtPnJ2YWwgPSBnb3Ribm87CisJCQlhcC0+Ymxrbm8gPSBnb3Ribm87CiAJfQogI3VuZGVmIElTVkFMSUQKIH0KQEAgLTIzMDUsMjQgKzIxNjMsMjQgQEAKIAltcCA9IGFwLT5pcC0+aV9tb3VudDsKIAlhbGlnbiA9IHhmc19nZXRfZXh0c3pfaGludChhcC0+aXApOwogCXByb2QgPSBhbGlnbiAvIG1wLT5tX3NiLnNiX3JleHRzaXplOwotCWVycm9yID0geGZzX2JtYXBfZXh0c2l6ZV9hbGlnbihtcCwgYXAtPmdvdHAsIGFwLT5wcmV2cCwKKwllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsICZhcC0+Z290LCAmYXAtPnByZXYsCiAJCQkJCWFsaWduLCAxLCBhcC0+ZW9mLCAwLAotCQkJCQlhcC0+Y29udiwgJmFwLT5vZmYsICZhcC0+YWxlbik7CisJCQkJCWFwLT5jb252LCAmYXAtPm9mZnNldCwgJmFwLT5sZW5ndGgpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCUFTU0VSVChhcC0+YWxlbik7Ci0JQVNTRVJUKGFwLT5hbGVuICUgbXAtPm1fc2Iuc2JfcmV4dHNpemUgPT0gMCk7CisJQVNTRVJUKGFwLT5sZW5ndGgpOworCUFTU0VSVChhcC0+bGVuZ3RoICUgbXAtPm1fc2Iuc2JfcmV4dHNpemUgPT0gMCk7CiAKIAkvKgogCSAqIElmIHRoZSBvZmZzZXQgJiBsZW5ndGggYXJlIG5vdCBwZXJmZWN0bHkgYWxpZ25lZAogCSAqIHRoZW4ga2lsbCBwcm9kLCBpdCB3aWxsIGp1c3QgZ2V0IHVzIGluIHRyb3VibGUuCiAJICovCi0JaWYgKGRvX21vZChhcC0+b2ZmLCBhbGlnbikgfHwgYXAtPmFsZW4gJSBhbGlnbikKKwlpZiAoZG9fbW9kKGFwLT5vZmZzZXQsIGFsaWduKSB8fCBhcC0+bGVuZ3RoICUgYWxpZ24pCiAJCXByb2QgPSAxOwogCS8qCiAJICogU2V0IHJhbGVuIHRvIGJlIHRoZSBhY3R1YWwgcmVxdWVzdGVkIGxlbmd0aCBpbiBydGV4dGVudHMuCiAJICovCi0JcmFsZW4gPSBhcC0+YWxlbiAvIG1wLT5tX3NiLnNiX3JleHRzaXplOworCXJhbGVuID0gYXAtPmxlbmd0aCAvIG1wLT5tX3NiLnNiX3JleHRzaXplOwogCS8qCiAJICogSWYgdGhlIG9sZCB2YWx1ZSB3YXMgY2xvc2UgZW5vdWdoIHRvIE1BWEVYVExFTiB0aGF0CiAJICogd2Ugcm91bmRlZCB1cCB0byBpdCwgY3V0IGl0IGJhY2sgc28gaXQncyB2YWxpZCBhZ2Fpbi4KQEAgLTIzMzcsMjEgKzIxOTUsMjEgQEAKIAkgKiBMb2NrIG91dCBvdGhlciBtb2RpZmljYXRpb25zIHRvIHRoZSBSVCBiaXRtYXAgaW5vZGUuCiAJICovCiAJeGZzX2lsb2NrKG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luX3JlZihhcC0+dHAsIG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKGFwLT50cCwgbXAtPm1fcmJtaXAsIFhGU19JTE9DS19FWENMKTsKIAogCS8qCiAJICogSWYgaXQncyBhbiBhbGxvY2F0aW9uIHRvIGFuIGVtcHR5IGZpbGUgYXQgb2Zmc2V0IDAsCiAJICogcGljayBhbiBleHRlbnQgdGhhdCB3aWxsIHNwYWNlIHRoaW5ncyBvdXQgaW4gdGhlIHJ0IGFyZWEuCiAJICovCi0JaWYgKGFwLT5lb2YgJiYgYXAtPm9mZiA9PSAwKSB7CisJaWYgKGFwLT5lb2YgJiYgYXAtPm9mZnNldCA9PSAwKSB7CiAJCXhmc19ydGJsb2NrX3QgdW5pbml0aWFsaXplZF92YXIocnR4KTsgLyogcmVhbHRpbWUgZXh0ZW50IG5vICovCiAKIAkJZXJyb3IgPSB4ZnNfcnRwaWNrX2V4dGVudChtcCwgYXAtPnRwLCByYWxlbiwgJnJ0eCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKLQkJYXAtPnJ2YWwgPSBydHggKiBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJYXAtPmJsa25vID0gcnR4ICogbXAtPm1fc2Iuc2JfcmV4dHNpemU7CiAJfSBlbHNlIHsKLQkJYXAtPnJ2YWwgPSAwOworCQlhcC0+Ymxrbm8gPSAwOwogCX0KIAogCXhmc19ibWFwX2FkamFjZW50KGFwKTsKQEAgLTIzNTksMjMgKzIyMTcsMjMgQEAKIAkvKgogCSAqIFJlYWx0aW1lIGFsbG9jYXRpb24sIGRvbmUgdGhyb3VnaCB4ZnNfcnRhbGxvY2F0ZV9leHRlbnQuCiAJICovCi0JYXR5cGUgPSBhcC0+cnZhbCA9PSAwID8gIFhGU19BTExPQ1RZUEVfQU5ZX0FHIDogWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKLQlkb19kaXYoYXAtPnJ2YWwsIG1wLT5tX3NiLnNiX3JleHRzaXplKTsKLQlydGIgPSBhcC0+cnZhbDsKLQlhcC0+YWxlbiA9IHJhbGVuOwotCWlmICgoZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9leHRlbnQoYXAtPnRwLCBhcC0+cnZhbCwgMSwgYXAtPmFsZW4sCisJYXR5cGUgPSBhcC0+Ymxrbm8gPT0gMCA/ICBYRlNfQUxMT0NUWVBFX0FOWV9BRyA6IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisJZG9fZGl2KGFwLT5ibGtubywgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOworCXJ0YiA9IGFwLT5ibGtubzsKKwlhcC0+bGVuZ3RoID0gcmFsZW47CisJaWYgKChlcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudChhcC0+dHAsIGFwLT5ibGtubywgMSwgYXAtPmxlbmd0aCwKIAkJCQkmcmFsZW4sIGF0eXBlLCBhcC0+d2FzZGVsLCBwcm9kLCAmcnRiKSkpCiAJCXJldHVybiBlcnJvcjsKIAlpZiAocnRiID09IE5VTExGU0JMT0NLICYmIHByb2QgPiAxICYmCi0JICAgIChlcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudChhcC0+dHAsIGFwLT5ydmFsLCAxLAotCQkJCQkgICBhcC0+YWxlbiwgJnJhbGVuLCBhdHlwZSwKKwkgICAgKGVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50KGFwLT50cCwgYXAtPmJsa25vLCAxLAorCQkJCQkgICBhcC0+bGVuZ3RoLCAmcmFsZW4sIGF0eXBlLAogCQkJCQkgICBhcC0+d2FzZGVsLCAxLCAmcnRiKSkpCiAJCXJldHVybiBlcnJvcjsKLQlhcC0+cnZhbCA9IHJ0YjsKLQlpZiAoYXAtPnJ2YWwgIT0gTlVMTEZTQkxPQ0spIHsKLQkJYXAtPnJ2YWwgKj0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJYXAtPmJsa25vID0gcnRiOworCWlmIChhcC0+Ymxrbm8gIT0gTlVMTEZTQkxPQ0spIHsKKwkJYXAtPmJsa25vICo9IG1wLT5tX3NiLnNiX3JleHRzaXplOwogCQlyYWxlbiAqPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJYXAtPmFsZW4gPSByYWxlbjsKKwkJYXAtPmxlbmd0aCA9IHJhbGVuOwogCQlhcC0+aXAtPmlfZC5kaV9uYmxvY2tzICs9IHJhbGVuOwogCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFwLT50cCwgYXAtPmlwLCBYRlNfSUxPR19DT1JFKTsKIAkJaWYgKGFwLT53YXNkZWwpCkBAIC0yMzg4LDcgKzIyNDYsNyBAQAogCQkJYXAtPndhc2RlbCA/IFhGU19UUkFOU19EUV9ERUxSVEJDT1VOVCA6CiAJCQkJCVhGU19UUkFOU19EUV9SVEJDT1VOVCwgKGxvbmcpIHJhbGVuKTsKIAl9IGVsc2UgewotCQlhcC0+YWxlbiA9IDA7CisJCWFwLT5sZW5ndGggPSAwOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI1MDMsNyArMjM2MSw3IEBACiAJICogQUcgYXMgdGhlIHN0cmVhbSBtYXkgaGF2ZSBtb3ZlZC4KIAkgKi8KIAlpZiAoeGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oYXAtPmlwKSkKLQkJYXAtPnJ2YWwgPSBhcmdzLT5mc2JubyA9IFhGU19BR0JfVE9fRlNCKG1wLCBhZywgMCk7CisJCWFwLT5ibGtubyA9IGFyZ3MtPmZzYm5vID0gWEZTX0FHQl9UT19GU0IobXAsIGFnLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjUyOCw1MiArMjM4Niw1MiBAQAogCW1wID0gYXAtPmlwLT5pX21vdW50OwogCWFsaWduID0gYXAtPnVzZXJkYXRhID8geGZzX2dldF9leHRzel9oaW50KGFwLT5pcCkgOiAwOwogCWlmICh1bmxpa2VseShhbGlnbikpIHsKLQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRzaXplX2FsaWduKG1wLCBhcC0+Z290cCwgYXAtPnByZXZwLAorCQllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsICZhcC0+Z290LCAmYXAtPnByZXYsCiAJCQkJCQlhbGlnbiwgMCwgYXAtPmVvZiwgMCwgYXAtPmNvbnYsCi0JCQkJCQkmYXAtPm9mZiwgJmFwLT5hbGVuKTsKKwkJCQkJCSZhcC0+b2Zmc2V0LCAmYXAtPmxlbmd0aCk7CiAJCUFTU0VSVCghZXJyb3IpOwotCQlBU1NFUlQoYXAtPmFsZW4pOworCQlBU1NFUlQoYXAtPmxlbmd0aCk7CiAJfQotCW51bGxmYiA9IGFwLT5maXJzdGJsb2NrID09IE5VTExGU0JMT0NLOwotCWZiX2Fnbm8gPSBudWxsZmIgPyBOVUxMQUdOVU1CRVIgOiBYRlNfRlNCX1RPX0FHTk8obXAsIGFwLT5maXJzdGJsb2NrKTsKKwludWxsZmIgPSAqYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0s7CisJZmJfYWdubyA9IG51bGxmYiA/IE5VTExBR05VTUJFUiA6IFhGU19GU0JfVE9fQUdOTyhtcCwgKmFwLT5maXJzdGJsb2NrKTsKIAlpZiAobnVsbGZiKSB7CiAJCWlmIChhcC0+dXNlcmRhdGEgJiYgeGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oYXAtPmlwKSkgewogCQkJYWcgPSB4ZnNfZmlsZXN0cmVhbV9sb29rdXBfYWcoYXAtPmlwKTsKIAkJCWFnID0gKGFnICE9IE5VTExBR05VTUJFUikgPyBhZyA6IDA7Ci0JCQlhcC0+cnZhbCA9IFhGU19BR0JfVE9fRlNCKG1wLCBhZywgMCk7CisJCQlhcC0+Ymxrbm8gPSBYRlNfQUdCX1RPX0ZTQihtcCwgYWcsIDApOwogCQl9IGVsc2UgewotCQkJYXAtPnJ2YWwgPSBYRlNfSU5PX1RPX0ZTQihtcCwgYXAtPmlwLT5pX2lubyk7CisJCQlhcC0+Ymxrbm8gPSBYRlNfSU5PX1RPX0ZTQihtcCwgYXAtPmlwLT5pX2lubyk7CiAJCX0KIAl9IGVsc2UKLQkJYXAtPnJ2YWwgPSBhcC0+Zmlyc3RibG9jazsKKwkJYXAtPmJsa25vID0gKmFwLT5maXJzdGJsb2NrOwogCiAJeGZzX2JtYXBfYWRqYWNlbnQoYXApOwogCiAJLyoKLQkgKiBJZiBhbGxvd2VkLCB1c2UgYXAtPnJ2YWw7IG90aGVyd2lzZSBtdXN0IHVzZSBmaXJzdGJsb2NrIHNpbmNlCisJICogSWYgYWxsb3dlZCwgdXNlIGFwLT5ibGtubzsgb3RoZXJ3aXNlIG11c3QgdXNlIGZpcnN0YmxvY2sgc2luY2UKIAkgKiBpdCdzIGluIHRoZSByaWdodCBhbGxvY2F0aW9uIGdyb3VwLgogCSAqLwotCWlmIChudWxsZmIgfHwgWEZTX0ZTQl9UT19BR05PKG1wLCBhcC0+cnZhbCkgPT0gZmJfYWdubykKKwlpZiAobnVsbGZiIHx8IFhGU19GU0JfVE9fQUdOTyhtcCwgYXAtPmJsa25vKSA9PSBmYl9hZ25vKQogCQk7CiAJZWxzZQotCQlhcC0+cnZhbCA9IGFwLT5maXJzdGJsb2NrOworCQlhcC0+Ymxrbm8gPSAqYXAtPmZpcnN0YmxvY2s7CiAJLyoKIAkgKiBOb3JtYWwgYWxsb2NhdGlvbiwgZG9uZSB0aHJvdWdoIHhmc19hbGxvY192ZXh0ZW50LgogCSAqLwogCXRyeWFnYWluID0gaXNhbGlnbmVkID0gMDsKIAlhcmdzLnRwID0gYXAtPnRwOwogCWFyZ3MubXAgPSBtcDsKLQlhcmdzLmZzYm5vID0gYXAtPnJ2YWw7CisJYXJncy5mc2JubyA9IGFwLT5ibGtubzsKIAogCS8qIFRyaW0gdGhlIGFsbG9jYXRpb24gYmFjayB0byB0aGUgbWF4aW11bSBhbiBBRyBjYW4gZml0LiAqLwotCWFyZ3MubWF4bGVuID0gTUlOKGFwLT5hbGVuLCBYRlNfQUxMT0NfQUdfTUFYX1VTQUJMRShtcCkpOwotCWFyZ3MuZmlyc3RibG9jayA9IGFwLT5maXJzdGJsb2NrOworCWFyZ3MubWF4bGVuID0gTUlOKGFwLT5sZW5ndGgsIFhGU19BTExPQ19BR19NQVhfVVNBQkxFKG1wKSk7CisJYXJncy5maXJzdGJsb2NrID0gKmFwLT5maXJzdGJsb2NrOwogCWJsZW4gPSAwOwogCWlmIChudWxsZmIpIHsKIAkJZXJyb3IgPSB4ZnNfYm1hcF9idGFsbG9jX251bGxmYihhcCwgJmFyZ3MsICZibGVuKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwotCX0gZWxzZSBpZiAoYXAtPmxvdykgeworCX0gZWxzZSBpZiAoYXAtPmZsaXN0LT54YmZfbG93KSB7CiAJCWlmICh4ZnNfaW5vZGVfaXNfZmlsZXN0cmVhbShhcC0+aXApKQogCQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9GSVJTVF9BRzsKIAkJZWxzZQpAQCAtMjU4NywxNCArMjQ0NSwxNCBAQAogCS8qIGFwcGx5IGV4dGVudCBzaXplIGhpbnRzIGlmIG9idGFpbmVkIGVhcmxpZXIgKi8KIAlpZiAodW5saWtlbHkoYWxpZ24pKSB7CiAJCWFyZ3MucHJvZCA9IGFsaWduOwotCQlpZiAoKGFyZ3MubW9kID0gKHhmc19leHRsZW5fdClkb19tb2QoYXAtPm9mZiwgYXJncy5wcm9kKSkpCisJCWlmICgoYXJncy5tb2QgPSAoeGZzX2V4dGxlbl90KWRvX21vZChhcC0+b2Zmc2V0LCBhcmdzLnByb2QpKSkKIAkJCWFyZ3MubW9kID0gKHhmc19leHRsZW5fdCkoYXJncy5wcm9kIC0gYXJncy5tb2QpOwogCX0gZWxzZSBpZiAobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IFBBR0VfQ0FDSEVfU0laRSkgewogCQlhcmdzLnByb2QgPSAxOwogCQlhcmdzLm1vZCA9IDA7CiAJfSBlbHNlIHsKIAkJYXJncy5wcm9kID0gUEFHRV9DQUNIRV9TSVpFID4+IG1wLT5tX3NiLnNiX2Jsb2NrbG9nOwotCQlpZiAoKGFyZ3MubW9kID0gKHhmc19leHRsZW5fdCkoZG9fbW9kKGFwLT5vZmYsIGFyZ3MucHJvZCkpKSkKKwkJaWYgKChhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpKGRvX21vZChhcC0+b2Zmc2V0LCBhcmdzLnByb2QpKSkpCiAJCQlhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpKGFyZ3MucHJvZCAtIGFyZ3MubW9kKTsKIAl9CiAJLyoKQEAgLTI2MDYsOCArMjQ2NCw4IEBACiAJICogaXMgPj0gdGhlIHN0cmlwZSB1bml0IGFuZCB0aGUgYWxsb2NhdGlvbiBvZmZzZXQgaXMKIAkgKiBhdCB0aGUgZW5kIG9mIGZpbGUuCiAJICovCi0JaWYgKCFhcC0+bG93ICYmIGFwLT5hZW9mKSB7Ci0JCWlmICghYXAtPm9mZikgeworCWlmICghYXAtPmZsaXN0LT54YmZfbG93ICYmIGFwLT5hZW9mKSB7CisJCWlmICghYXAtPm9mZnNldCkgewogCQkJYXJncy5hbGlnbm1lbnQgPSBtcC0+bV9kYWxpZ247CiAJCQlhdHlwZSA9IGFyZ3MudHlwZTsKIAkJCWlzYWxpZ25lZCA9IDE7CkBAIC0yNjYwLDcgKzI1MTgsNyBAQAogCQkgKiB0dXJuZWQgb24uCiAJCSAqLwogCQlhcmdzLnR5cGUgPSBhdHlwZTsKLQkJYXJncy5mc2JubyA9IGFwLT5ydmFsOworCQlhcmdzLmZzYm5vID0gYXAtPmJsa25vOwogCQlhcmdzLmFsaWdubWVudCA9IG1wLT5tX2RhbGlnbjsKIAkJYXJncy5taW5sZW4gPSBuZXh0bWlubGVuOwogCQlhcmdzLm1pbmFsaWduc2xvcCA9IDA7CkBAIC0yNjc0LDcgKzI1MzIsNyBAQAogCQkgKiB0cnkgYWdhaW4uCiAJCSAqLwogCQlhcmdzLnR5cGUgPSBhdHlwZTsKLQkJYXJncy5mc2JubyA9IGFwLT5ydmFsOworCQlhcmdzLmZzYm5vID0gYXAtPmJsa25vOwogCQlhcmdzLmFsaWdubWVudCA9IDA7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQogCQkJcmV0dXJuIGVycm9yOwpAQCAtMjY4Myw3ICsyNTQxLDcgQEAKIAkgICAgYXJncy5taW5sZW4gPiBhcC0+bWlubGVuKSB7CiAJCWFyZ3MubWlubGVuID0gYXAtPm1pbmxlbjsKIAkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk87Ci0JCWFyZ3MuZnNibm8gPSBhcC0+cnZhbDsKKwkJYXJncy5mc2JubyA9IGFwLT5ibGtubzsKIAkJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAJfQpAQCAtMjY5NCwxMyArMjU1MiwyNiBAQAogCQlhcmdzLm1pbmxlZnQgPSAwOwogCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkKIAkJCXJldHVybiBlcnJvcjsKLQkJYXAtPmxvdyA9IDE7CisJCWFwLT5mbGlzdC0+eGJmX2xvdyA9IDE7CiAJfQogCWlmIChhcmdzLmZzYm5vICE9IE5VTExGU0JMT0NLKSB7Ci0JCWFwLT5maXJzdGJsb2NrID0gYXAtPnJ2YWwgPSBhcmdzLmZzYm5vOworCQkvKgorCQkgKiBjaGVjayB0aGUgYWxsb2NhdGlvbiBoYXBwZW5lZCBhdCB0aGUgc2FtZSBvciBoaWdoZXIgQUcgdGhhbgorCQkgKiB0aGUgZmlyc3QgYmxvY2sgdGhhdCB3YXMgYWxsb2NhdGVkLgorCQkgKi8KKwkJQVNTRVJUKCphcC0+Zmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSyB8fAorCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLCAqYXAtPmZpcnN0YmxvY2spID09CisJCSAgICAgICBYRlNfRlNCX1RPX0FHTk8obXAsIGFyZ3MuZnNibm8pIHx8CisJCSAgICAgICAoYXAtPmZsaXN0LT54YmZfbG93ICYmCisJCQlYRlNfRlNCX1RPX0FHTk8obXAsICphcC0+Zmlyc3RibG9jaykgPAorCQkJWEZTX0ZTQl9UT19BR05PKG1wLCBhcmdzLmZzYm5vKSkpOworCisJCWFwLT5ibGtubyA9IGFyZ3MuZnNibm87CisJCWlmICgqYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0spCisJCQkqYXAtPmZpcnN0YmxvY2sgPSBhcmdzLmZzYm5vOwogCQlBU1NFUlQobnVsbGZiIHx8IGZiX2Fnbm8gPT0gYXJncy5hZ25vIHx8Ci0JCSAgICAgICAoYXAtPmxvdyAmJiBmYl9hZ25vIDwgYXJncy5hZ25vKSk7Ci0JCWFwLT5hbGVuID0gYXJncy5sZW47CisJCSAgICAgICAoYXAtPmZsaXN0LT54YmZfbG93ICYmIGZiX2Fnbm8gPCBhcmdzLmFnbm8pKTsKKwkJYXAtPmxlbmd0aCA9IGFyZ3MubGVuOwogCQlhcC0+aXAtPmlfZC5kaV9uYmxvY2tzICs9IGFyZ3MubGVuOwogCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFwLT50cCwgYXAtPmlwLCBYRlNfSUxPR19DT1JFKTsKIAkJaWYgKGFwLT53YXNkZWwpCkBAIC0yNzE0LDggKzI1ODUsOCBAQAogCQkJCQlYRlNfVFJBTlNfRFFfQkNPVU5ULAogCQkJKGxvbmcpIGFyZ3MubGVuKTsKIAl9IGVsc2UgewotCQlhcC0+cnZhbCA9IE5VTExGU0JMT0NLOwotCQlhcC0+YWxlbiA9IDA7CisJCWFwLT5ibGtubyA9IE5VTExGU0JMT0NLOworCQlhcC0+bGVuZ3RoID0gMDsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zNTg5LDcgKzM0NjAsNyBAQAogCX0KIAlBU1NFUlQoaXAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCk7CiAKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAKIAlzd2l0Y2ggKGlwLT5pX2QuZGlfZm9ybWF0KSB7CkBAIC0zNzgyLDE5ICszNjUzLDExIEBACiAgKiBSb3V0aW5lIHRvIGJlIGNhbGxlZCBhdCB0cmFuc2FjdGlvbidzIGVuZCBieSB4ZnNfYm1hcGksIHhmc19idW5tYXBpCiAgKiBjYWxsZXIuICBGcmVlcyBhbGwgdGhlIGV4dGVudHMgdGhhdCBuZWVkIGZyZWVpbmcsIHdoaWNoIG11c3QgYmUgZG9uZQogICogbGFzdCBkdWUgdG8gbG9ja2luZyBjb25zaWRlcmF0aW9ucy4gIFdlIG5ldmVyIGZyZWUgYW55IGV4dGVudHMgaW4KLSAqIHRoZSBmaXJzdCB0cmFuc2FjdGlvbi4gIFRoaXMgaXMgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBtYWtlIHRoZSBmaXJzdAotICogdHJhbnNhY3Rpb24gYSBzeW5jaHJvbm91cyBvbmUgc28gdGhhdCB0aGUgcG9pbnRlcnMgdG8gdGhlIGRhdGEgYmVpbmcKLSAqIGJyb2tlbiBpbiB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgYmUgcGVybWFuZW50IGJlZm9yZSB0aGUgZGF0YSBpcyBhY3R1YWxseQotICogZnJlZWQuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGJsb2NrcyBmcm9tIGJlaW5nIHJlYWxsb2NhdGVkCi0gKiBhbmQgd3JpdHRlbiB0byBiZWZvcmUgdGhlIGZyZWUgYW5kIHJlYWxsb2NhdGlvbiBhcmUgYWN0dWFsbHkgcGVybWFuZW50LgotICogV2UgZG8gbm90IGp1c3QgbWFrZSB0aGUgZmlyc3QgdHJhbnNhY3Rpb24gc3luY2hyb25vdXMgaGVyZSwgYmVjYXVzZQotICogdGhlcmUgYXJlIG1vcmUgZWZmaWNpZW50IHdheXMgdG8gZ2FpbiB0aGUgc2FtZSBwcm90ZWN0aW9uIGluIHNvbWUgY2FzZXMKLSAqIChzZWUgdGhlIGZpbGUgdHJ1bmNhdGlvbiBjb2RlKS4KKyAqIHRoZSBmaXJzdCB0cmFuc2FjdGlvbi4KICAqCiAgKiBSZXR1cm4gMSBpZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gd2FzIGNvbW1pdHRlZCBhbmQgYSBuZXcgb25lCiAgKiBzdGFydGVkLCBhbmQgMCBvdGhlcndpc2UgaW4gdGhlIGNvbW1pdHRlZCBwYXJhbWV0ZXIuCiAgKi8KLS8qQVJHU1VTRUQqLwogaW50CQkJCQkJLyogZXJyb3IgKi8KIHhmc19ibWFwX2ZpbmlzaCgKIAl4ZnNfdHJhbnNfdAkJKip0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgYWRkciAqLwpAQCAtMzk5NCw0MiArMzg1NywxMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorU1RBVElDIGludAoreGZzX2JtYXBfbGFzdF9leHRlbnQoCisJc3RydWN0IHhmc190cmFucwkqdHAsCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJaW50CQkJd2hpY2hmb3JrLAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpyZWMsCisJaW50CQkJKmlzX2VtcHR5KQoreworCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaW50CQkJZXJyb3I7CisJaW50CQkJbmV4dGVudHM7CisKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpIHsKKwkJZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWlmIChuZXh0ZW50cyA9PSAwKSB7CisJCSppc19lbXB0eSA9IDE7CisJCXJldHVybiAwOworCX0KKworCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIG5leHRlbnRzIC0gMSksIHJlYyk7CisJKmlzX2VtcHR5ID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIHRoZSBsYXN0IGlub2RlIGV4dGVudCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGFsbG9jYXRpb24gd2lsbCByZXN1bHQKKyAqIGluIGJsb2NrcyBiZWluZyBhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gV2hlbiB3ZSBhbGxvY2F0ZSBuZXcgZGF0YQorICogYmxvY2tzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgd2hpY2ggZG8gbm90IHN0YXJ0IGF0IHRoZSBwcmV2aW91cyBkYXRhIGJsb2NrLAorICogd2Ugd2lsbCB0cnkgdG8gYWxpZ24gdGhlIG5ldyBibG9ja3MgYXQgc3RyaXBlIHVuaXQgYm91bmRhcmllcy4KKyAqCisgKiBSZXR1cm5zIDAgaW4gYm1hLT5hZW9mIGlmIHRoZSBmaWxlIChmb3JrKSBpcyBlbXB0eSBhcyBhbnkgbmV3IHdyaXRlIHdpbGwgYmUKKyAqIGF0LCBvciBwYXN0IHRoZSBFT0YuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19ibWFwX2lzYWVvZigKKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEsCisJaW50CQkJd2hpY2hmb3JrKQoreworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXJlYzsKKwlpbnQJCQlpc19lbXB0eTsKKwlpbnQJCQllcnJvcjsKKworCWJtYS0+YWVvZiA9IDA7CisJZXJyb3IgPSB4ZnNfYm1hcF9sYXN0X2V4dGVudChOVUxMLCBibWEtPmlwLCB3aGljaGZvcmssICZyZWMsCisJCQkJICAgICAmaXNfZW1wdHkpOworCWlmIChlcnJvciB8fCBpc19lbXB0eSkKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBDaGVjayBpZiB3ZSBhcmUgYWxsb2NhdGlvbiBvciBwYXN0IHRoZSBsYXN0IGV4dGVudCwgb3IgYXQgbGVhc3QgaW50bworCSAqIHRoZSBsYXN0IGRlbGF5ZWQgYWxsb2NhdGVkIGV4dGVudC4KKwkgKi8KKwlibWEtPmFlb2YgPSBibWEtPm9mZnNldCA+PSByZWMuYnJfc3RhcnRvZmYgKyByZWMuYnJfYmxvY2tjb3VudCB8fAorCQkoYm1hLT5vZmZzZXQgPj0gcmVjLmJyX3N0YXJ0b2ZmICYmCisJCSBpc251bGxzdGFydGJsb2NrKHJlYy5icl9zdGFydGJsb2NrKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgZW5kb2ZmIGlzIG91dHNpZGUgdGhlIGxhc3QgZXh0ZW50LiBJZiBzbyB0aGUgY2FsbGVyIHdpbGwgZ3JvdworICogdGhlIGFsbG9jYXRpb24gdG8gYSBzdHJpcGUgdW5pdCBib3VuZGFyeS4gIEFsbCBvZmZzZXRzIGFyZSBjb25zaWRlcmVkIG91dHNpZGUKKyAqIHRoZSBlbmQgb2YgZmlsZSBmb3IgYW4gZW1wdHkgZm9yaywgc28gMSBpcyByZXR1cm5lZCBpbiAqZW9mIGluIHRoYXQgY2FzZS4KKyAqLworaW50Cit4ZnNfYm1hcF9lb2YoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJeGZzX2ZpbGVvZmZfdAkJZW5kb2ZmLAorCWludAkJCXdoaWNoZm9yaywKKwlpbnQJCQkqZW9mKQoreworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXJlYzsKKwlpbnQJCQllcnJvcjsKKworCWVycm9yID0geGZzX2JtYXBfbGFzdF9leHRlbnQoTlVMTCwgaXAsIHdoaWNoZm9yaywgJnJlYywgZW9mKTsKKwlpZiAoZXJyb3IgfHwgKmVvZikKKwkJcmV0dXJuIGVycm9yOworCisJKmVvZiA9IGVuZG9mZiA+PSByZWMuYnJfc3RhcnRvZmYgKyByZWMuYnJfYmxvY2tjb3VudDsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFJldHVybnMgdGhlIGZpbGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIG9mIHRoZSBmaXJzdCBibG9jayBwYXN0IGVvZiBpbgogICogdGhlIGZpbGUuICBUaGlzIGlzIG5vdCBiYXNlZCBvbiBpX3NpemUsIGl0IGlzIGJhc2VkIG9uIHRoZSBleHRlbnQgcmVjb3Jkcy4KICAqIFJldHVybnMgMCBmb3IgbG9jYWwgZmlsZXMsIGFzIHRoZXkgZG8gbm90IGhhdmUgZXh0ZW50IHJlY29yZHMuCiAgKi8KLWludAkJCQkJCS8qIGVycm9yICovCitpbnQKIHhmc19ibWFwX2xhc3Rfb2Zmc2V0KAotCXhmc190cmFuc190CSp0cCwJCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0JeGZzX2lub2RlX3QJKmlwLAkJCS8qIGluY29yZSBpbm9kZSAqLwotCXhmc19maWxlb2ZmX3QJKmxhc3RfYmxvY2ssCQkvKiBsYXN0IGJsb2NrICovCi0JaW50CQl3aGljaGZvcmspCQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19maWxlb2ZmX3QJCSpsYXN0X2Jsb2NrLAorCWludAkJCXdoaWNoZm9yaykKIHsKLQl4ZnNfYm1idF9yZWNfaG9zdF90ICplcDsJCS8qIHBvaW50ZXIgdG8gbGFzdCBleHRlbnQgKi8KLQlpbnQJCWVycm9yOwkJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotCXhmc19pZm9ya190CSppZnA7CQkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CW5leHRlbnRzOwkJLyogbnVtYmVyIG9mIGV4dGVudCBlbnRyaWVzICovCisJc3RydWN0IHhmc19ibWJ0X2lyZWMJcmVjOworCWludAkJCWlzX2VtcHR5OworCWludAkJCWVycm9yOworCisJKmxhc3RfYmxvY2sgPSAwOworCisJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJCXJldHVybiAwOwogCiAJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKLQkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCi0JICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykKIAkgICAgICAgcmV0dXJuIFhGU19FUlJPUihFSU8pOwotCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7Ci0JCSpsYXN0X2Jsb2NrID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7Ci0JaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCi0JICAgIChlcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKHRwLCBpcCwgd2hpY2hmb3JrKSkpCisKKwllcnJvciA9IHhmc19ibWFwX2xhc3RfZXh0ZW50KE5VTEwsIGlwLCB3aGljaGZvcmssICZyZWMsICZpc19lbXB0eSk7CisJaWYgKGVycm9yIHx8IGlzX2VtcHR5KQogCQlyZXR1cm4gZXJyb3I7Ci0JbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKLQlpZiAoIW5leHRlbnRzKSB7Ci0JCSpsYXN0X2Jsb2NrID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIG5leHRlbnRzIC0gMSk7Ci0JKmxhc3RfYmxvY2sgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYoZXApICsgeGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQoZXApOworCisJKmxhc3RfYmxvY2sgPSByZWMuYnJfc3RhcnRvZmYgKyByZWMuYnJfYmxvY2tjb3VudDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDE1OSw3ICs0MTAyLDYgQEAKIAkJeGZzX2V4dG51bV90CW51bV9yZWNzOwogCQl4ZnNfZXh0bnVtX3QJc3RhcnQ7CiAKLQogCQludW1fcmVjcyA9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhibG9jayk7CiAJCWlmICh1bmxpa2VseShpICsgbnVtX3JlY3MgPiByb29tKSkgewogCQkJQVNTRVJUKGkgKyBudW1fcmVjcyA8PSByb29tKTsKQEAgLTQyODIsOSArNDIyNCw4IEBACiAJCUFTU0VSVChpID09IDAgfHwKIAkJICAgICAgIG12YWxbaSAtIDFdLmJyX3N0YXJ0b2ZmICsgbXZhbFtpIC0gMV0uYnJfYmxvY2tjb3VudCA9PQogCQkgICAgICAgbXZhbFtpXS5icl9zdGFydG9mZik7Ci0JCWlmICgoZmxhZ3MgJiBYRlNfQk1BUElfV1JJVEUpICYmICEoZmxhZ3MgJiBYRlNfQk1BUElfREVMQVkpKQotCQkJQVNTRVJUKG12YWxbaV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0sgJiYKLQkJCSAgICAgICBtdmFsW2ldLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spOworCQlBU1NFUlQobXZhbFtpXS5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyAmJgorCQkgICAgICAgbXZhbFtpXS5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKTsKIAkJQVNTRVJUKG12YWxbaV0uYnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNIHx8CiAJCSAgICAgICBtdmFsW2ldLmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKTsKIAl9CkBAIC00MjkzLDM5OSArNDIzNCwxNjggQEAKIAogCiAvKgotICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLgotICogRmlsZSByYW5nZSBpcyBnaXZlbiBieSB0aGUgYm5vL2xlbiBwYWlyLgotICogQWRkcyBibG9ja3MgdG8gZmlsZSBpZiBhIHdyaXRlICgiZmxhZ3MgJiBYRlNfQk1BUElfV1JJVEUiIHNldCkKLSAqIGludG8gYSBob2xlIG9yIHBhc3QgZW9mLgotICogT25seSBhbGxvY2F0ZXMgYmxvY2tzIGZyb20gYSBzaW5nbGUgYWxsb2NhdGlvbiBncm91cCwKLSAqIHRvIGF2b2lkIGxvY2tpbmcgcHJvYmxlbXMuCi0gKiBUaGUgcmV0dXJuZWQgdmFsdWUgaW4gImZpcnN0YmxvY2siIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gYSB0cmFuc2FjdGlvbgotICogbXVzdCBiZSByZW1lbWJlcmVkIGFuZCBwcmVzZW50ZWQgdG8gc3Vic2VxdWVudCBjYWxscyBpbiAiZmlyc3RibG9jayIuCi0gKiBBbiB1cHBlciBib3VuZCBmb3IgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGlzIHN1cHBsaWVkIHRvCi0gKiB0aGUgZmlyc3QgY2FsbCBpbiAidG90YWwiOyBpZiBubyBhbGxvY2F0aW9uIGdyb3VwIGhhcyB0aGF0IG1hbnkgZnJlZQotICogYmxvY2tzIHRoZW4gdGhlIGNhbGwgd2lsbCBmYWlsIChyZXR1cm4gTlVMTEZTQkxPQ0sgaW4gImZpcnN0YmxvY2siKS4KKyAqIFRyaW0gdGhlIHJldHVybmVkIG1hcCB0byB0aGUgcmVxdWlyZWQgYm91bmRzCiAgKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwaSgKLQl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0JeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JeGZzX2ZpbGVvZmZfdAlibm8sCQkvKiBzdGFydGluZyBmaWxlIG9mZnMuIG1hcHBlZCAqLwotCXhmc19maWxibGtzX3QJbGVuLAkJLyogbGVuZ3RoIHRvIG1hcCBpbiBmaWxlICovCi0JaW50CQlmbGFncywJCS8qIFhGU19CTUFQSV8uLi4gKi8KLQl4ZnNfZnNibG9ja190CSpmaXJzdGJsb2NrLAkvKiBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sKLQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCi0JeGZzX2V4dGxlbl90CXRvdGFsLAkJLyogdG90YWwgYmxvY2tzIG5lZWRlZCAqLwotCXhmc19ibWJ0X2lyZWNfdAkqbXZhbCwJCS8qIG91dHB1dDogbWFwIHZhbHVlcyAqLwotCWludAkJKm5tYXAsCQkvKiBpL286IG12YWwgc2l6ZS9jb3VudCAqLwotCXhmc19ibWFwX2ZyZWVfdAkqZmxpc3QpCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBpX3RyaW1fbWFwKAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSptdmFsLAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpnb3QsCisJeGZzX2ZpbGVvZmZfdAkJKmJubywKKwl4ZnNfZmlsYmxrc190CQlsZW4sCisJeGZzX2ZpbGVvZmZfdAkJb2JubywKKwl4ZnNfZmlsZW9mZl90CQllbmQsCisJaW50CQkJbiwKKwlpbnQJCQlmbGFncykKIHsKLQl4ZnNfZnNibG9ja190CWFibm87CQkvKiBhbGxvY2F0ZWQgYmxvY2sgbnVtYmVyICovCi0JeGZzX2V4dGxlbl90CWFsZW47CQkvKiBhbGxvY2F0ZWQgZXh0ZW50IGxlbmd0aCAqLwotCXhmc19maWxlb2ZmX3QJYW9mZjsJCS8qIGFsbG9jYXRlZCBmaWxlIG9mZnNldCAqLwotCXhmc19ibWFsbG9jYV90CWJtYSA9IHsgMCB9OwkvKiBhcmdzIGZvciB4ZnNfYm1hcF9hbGxvYyAqLwotCXhmc19idHJlZV9jdXJfdAkqY3VyOwkJLyogYm1hcCBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfZmlsZW9mZl90CWVuZDsJCS8qIGVuZCBvZiBtYXBwZWQgZmlsZSByZWdpb24gKi8KLQlpbnQJCWVvZjsJCS8qIHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIGV4dGVudHMgKi8KLQl4ZnNfYm1idF9yZWNfaG9zdF90ICplcDsJLyogZXh0ZW50IHJlY29yZCBwb2ludGVyICovCi0JaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiAqLwotCXhmc19ibWJ0X2lyZWNfdAlnb3Q7CQkvKiBjdXJyZW50IGZpbGUgZXh0ZW50IHJlY29yZCAqLwotCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KLQl4ZnNfZXh0bGVuX3QJaW5kbGVuOwkJLyogaW5kaXJlY3QgYmxvY2tzIGxlbmd0aCAqLwotCXhmc19leHRudW1fdAlsYXN0eDsJCS8qIGxhc3QgdXNlZnVsIGV4dGVudCBudW1iZXIgKi8KLQlpbnQJCWxvZ2ZsYWdzOwkvKiBmbGFncyBmb3IgdHJhbnNhY3Rpb24gbG9nZ2luZyAqLwotCXhmc19leHRsZW5fdAltaW5sZWZ0OwkvKiBtaW4gYmxvY2tzIGxlZnQgYWZ0ZXIgYWxsb2NhdGlvbiAqLwotCXhmc19leHRsZW5fdAltaW5sZW47CQkvKiBtaW4gYWxsb2NhdGlvbiBzaXplICovCi0JeGZzX21vdW50X3QJKm1wOwkJLyogeGZzIG1vdW50IHN0cnVjdHVyZSAqLwotCWludAkJbjsJCS8qIGN1cnJlbnQgZXh0ZW50IGluZGV4ICovCi0JaW50CQluYWxsb2NzOwkvKiBudW1iZXIgb2YgZXh0ZW50cyBhbGxvYydkICovCi0JeGZzX2V4dG51bV90CW5leHRlbnRzOwkvKiBudW1iZXIgb2YgZXh0ZW50cyBpbiBmaWxlICovCi0JeGZzX2ZpbGVvZmZfdAlvYm5vOwkJLyogb2xkIGJsb2NrIG51bWJlciAob2Zmc2V0KSAqLwotCXhmc19ibWJ0X2lyZWNfdAlwcmV2OwkJLyogcHJldmlvdXMgZmlsZSBleHRlbnQgcmVjb3JkICovCi0JaW50CQl0bXBfbG9nZmxhZ3M7CS8qIHRlbXAgZmxhZ3MgaG9sZGVyICovCi0JaW50CQl3aGljaGZvcms7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0JY2hhcgkJaW5ob2xlOwkJLyogY3VycmVudCBsb2NhdGlvbiBpcyBob2xlIGluIGZpbGUgKi8KLQljaGFyCQl3YXNkZWxheTsJLyogb2xkIGV4dGVudCB3YXMgZGVsYXllZCAqLwotCWNoYXIJCXdyOwkJLyogdGhpcyBpcyBhIHdyaXRlIHJlcXVlc3QgKi8KLQljaGFyCQlydDsJCS8qIHRoaXMgaXMgYSByZWFsdGltZSBmaWxlICovCi0jaWZkZWYgREVCVUcKLQl4ZnNfZmlsZW9mZl90CW9yaWdfYm5vOwkvKiBvcmlnaW5hbCBibG9jayBudW1iZXIgdmFsdWUgKi8KLQlpbnQJCW9yaWdfZmxhZ3M7CS8qIG9yaWdpbmFsIGZsYWdzIGFyZyB2YWx1ZSAqLwotCXhmc19maWxibGtzX3QJb3JpZ19sZW47CS8qIG9yaWdpbmFsIHZhbHVlIG9mIGxlbiBhcmcgKi8KLQl4ZnNfYm1idF9pcmVjX3QJKm9yaWdfbXZhbDsJLyogb3JpZ2luYWwgdmFsdWUgb2YgbXZhbCAqLwotCWludAkJb3JpZ19ubWFwOwkvKiBvcmlnaW5hbCB2YWx1ZSBvZiAqbm1hcCAqLworCWlmICgoZmxhZ3MgJiBYRlNfQk1BUElfRU5USVJFKSB8fAorCSAgICBnb3QtPmJyX3N0YXJ0b2ZmICsgZ290LT5icl9ibG9ja2NvdW50IDw9IG9ibm8pIHsKKwkJKm12YWwgPSAqZ290OworCQlpZiAoaXNudWxsc3RhcnRibG9jayhnb3QtPmJyX3N0YXJ0YmxvY2spKQorCQkJbXZhbC0+YnJfc3RhcnRibG9jayA9IERFTEFZU1RBUlRCTE9DSzsKKwkJcmV0dXJuOworCX0KIAotCW9yaWdfYm5vID0gYm5vOwotCW9yaWdfbGVuID0gbGVuOwotCW9yaWdfZmxhZ3MgPSBmbGFnczsKLQlvcmlnX212YWwgPSBtdmFsOwotCW9yaWdfbm1hcCA9ICpubWFwOwotI2VuZGlmCisJaWYgKG9ibm8gPiAqYm5vKQorCQkqYm5vID0gb2JubzsKKwlBU1NFUlQoKCpibm8gPj0gb2JubykgfHwgKG4gPT0gMCkpOworCUFTU0VSVCgqYm5vIDwgZW5kKTsKKwltdmFsLT5icl9zdGFydG9mZiA9ICpibm87CisJaWYgKGlzbnVsbHN0YXJ0YmxvY2soZ290LT5icl9zdGFydGJsb2NrKSkKKwkJbXZhbC0+YnJfc3RhcnRibG9jayA9IERFTEFZU1RBUlRCTE9DSzsKKwllbHNlCisJCW12YWwtPmJyX3N0YXJ0YmxvY2sgPSBnb3QtPmJyX3N0YXJ0YmxvY2sgKworCQkJCQkoKmJubyAtIGdvdC0+YnJfc3RhcnRvZmYpOworCS8qCisJICogUmV0dXJuIHRoZSBtaW5pbXVtIG9mIHdoYXQgd2UgZ290IGFuZCB3aGF0IHdlIGFza2VkIGZvciBmb3IKKwkgKiB0aGUgbGVuZ3RoLiAgV2UgY2FuIHVzZSB0aGUgbGVuIHZhcmlhYmxlIGhlcmUgYmVjYXVzZSBpdCBpcworCSAqIG1vZGlmaWVkIGJlbG93IGFuZCB3ZSBjb3VsZCBoYXZlIGJlZW4gdGhlcmUgYmVmb3JlIGNvbWluZworCSAqIGhlcmUgaWYgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGFsbG9jYXRpb24gZGlkbid0IG92ZXJsYXAgd2hhdAorCSAqIHdhcyBhc2tlZCBmb3IuCisJICovCisJbXZhbC0+YnJfYmxvY2tjb3VudCA9IFhGU19GSUxCTEtTX01JTihlbmQgLSAqYm5vLAorCQkJZ290LT5icl9ibG9ja2NvdW50IC0gKCpibm8gLSBnb3QtPmJyX3N0YXJ0b2ZmKSk7CisJbXZhbC0+YnJfc3RhdGUgPSBnb3QtPmJyX3N0YXRlOworCUFTU0VSVChtdmFsLT5icl9ibG9ja2NvdW50IDw9IGxlbik7CisJcmV0dXJuOworfQorCisvKgorICogVXBkYXRlIGFuZCB2YWxpZGF0ZSB0aGUgZXh0ZW50IG1hcCB0byByZXR1cm4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwaV91cGRhdGVfbWFwKAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSoqbWFwLAorCXhmc19maWxlb2ZmX3QJCSpibm8sCisJeGZzX2ZpbGJsa3NfdAkJKmxlbiwKKwl4ZnNfZmlsZW9mZl90CQlvYm5vLAorCXhmc19maWxlb2ZmX3QJCWVuZCwKKwlpbnQJCQkqbiwKKwlpbnQJCQlmbGFncykKK3sKKwl4ZnNfYm1idF9pcmVjX3QJKm12YWwgPSAqbWFwOworCisJQVNTRVJUKChmbGFncyAmIFhGU19CTUFQSV9FTlRJUkUpIHx8CisJICAgICAgICgobXZhbC0+YnJfc3RhcnRvZmYgKyBtdmFsLT5icl9ibG9ja2NvdW50KSA8PSBlbmQpKTsKKwlBU1NFUlQoKGZsYWdzICYgWEZTX0JNQVBJX0VOVElSRSkgfHwgKG12YWwtPmJyX2Jsb2NrY291bnQgPD0gKmxlbikgfHwKKwkgICAgICAgKG12YWwtPmJyX3N0YXJ0b2ZmIDwgb2JubykpOworCisJKmJubyA9IG12YWwtPmJyX3N0YXJ0b2ZmICsgbXZhbC0+YnJfYmxvY2tjb3VudDsKKwkqbGVuID0gZW5kIC0gKmJubzsKKwlpZiAoKm4gPiAwICYmIG12YWwtPmJyX3N0YXJ0b2ZmID09IG12YWxbLTFdLmJyX3N0YXJ0b2ZmKSB7CisJCS8qIHVwZGF0ZSBwcmV2aW91cyBtYXAgd2l0aCBuZXcgaW5mb3JtYXRpb24gKi8KKwkJQVNTRVJUKG12YWwtPmJyX3N0YXJ0YmxvY2sgPT0gbXZhbFstMV0uYnJfc3RhcnRibG9jayk7CisJCUFTU0VSVChtdmFsLT5icl9ibG9ja2NvdW50ID4gbXZhbFstMV0uYnJfYmxvY2tjb3VudCk7CisJCUFTU0VSVChtdmFsLT5icl9zdGF0ZSA9PSBtdmFsWy0xXS5icl9zdGF0ZSk7CisJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgPSBtdmFsLT5icl9ibG9ja2NvdW50OworCQltdmFsWy0xXS5icl9zdGF0ZSA9IG12YWwtPmJyX3N0YXRlOworCX0gZWxzZSBpZiAoKm4gPiAwICYmIG12YWwtPmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLICYmCisJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLICYmCisJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0sgJiYKKwkJICAgbXZhbC0+YnJfc3RhcnRibG9jayA9PSBtdmFsWy0xXS5icl9zdGFydGJsb2NrICsKKwkJCQkJICBtdmFsWy0xXS5icl9ibG9ja2NvdW50ICYmCisJCSAgICgoZmxhZ3MgJiBYRlNfQk1BUElfSUdTVEFURSkgfHwKKwkJCW12YWxbLTFdLmJyX3N0YXRlID09IG12YWwtPmJyX3N0YXRlKSkgeworCQlBU1NFUlQobXZhbC0+YnJfc3RhcnRvZmYgPT0KKwkJICAgICAgIG12YWxbLTFdLmJyX3N0YXJ0b2ZmICsgbXZhbFstMV0uYnJfYmxvY2tjb3VudCk7CisJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgKz0gbXZhbC0+YnJfYmxvY2tjb3VudDsKKwl9IGVsc2UgaWYgKCpuID4gMCAmJgorCQkgICBtdmFsLT5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSyAmJgorCQkgICBtdmFsWy0xXS5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSyAmJgorCQkgICBtdmFsLT5icl9zdGFydG9mZiA9PQorCQkgICBtdmFsWy0xXS5icl9zdGFydG9mZiArIG12YWxbLTFdLmJyX2Jsb2NrY291bnQpIHsKKwkJbXZhbFstMV0uYnJfYmxvY2tjb3VudCArPSBtdmFsLT5icl9ibG9ja2NvdW50OworCQltdmFsWy0xXS5icl9zdGF0ZSA9IG12YWwtPmJyX3N0YXRlOworCX0gZWxzZSBpZiAoISgoKm4gPT0gMCkgJiYKKwkJICAgICAoKG12YWwtPmJyX3N0YXJ0b2ZmICsgbXZhbC0+YnJfYmxvY2tjb3VudCkgPD0KKwkJICAgICAgb2JubykpKSB7CisJCW12YWwrKzsKKwkJKCpuKSsrOworCX0KKwkqbWFwID0gbXZhbDsKK30KKworLyoKKyAqIE1hcCBmaWxlIGJsb2NrcyB0byBmaWxlc3lzdGVtIGJsb2NrcyB3aXRob3V0IGFsbG9jYXRpb24uCisgKi8KK2ludAoreGZzX2JtYXBpX3JlYWQoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJeGZzX2ZpbGVvZmZfdAkJYm5vLAorCXhmc19maWxibGtzX3QJCWxlbiwKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbXZhbCwKKwlpbnQJCQkqbm1hcCwKKwlpbnQJCQlmbGFncykKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcDsKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwlnb3Q7CisJc3RydWN0IHhmc19ibWJ0X2lyZWMJcHJldjsKKwl4ZnNfZmlsZW9mZl90CQlvYm5vOworCXhmc19maWxlb2ZmX3QJCWVuZDsKKwl4ZnNfZXh0bnVtX3QJCWxhc3R4OworCWludAkJCWVycm9yOworCWludAkJCWVvZjsKKwlpbnQJCQluID0gMDsKKwlpbnQJCQl3aGljaGZvcmsgPSAoZmxhZ3MgJiBYRlNfQk1BUElfQVRUUkZPUkspID8KKwkJCQkJCVhGU19BVFRSX0ZPUksgOiBYRlNfREFUQV9GT1JLOworCiAJQVNTRVJUKCpubWFwID49IDEpOwotCUFTU0VSVCgqbm1hcCA8PSBYRlNfQk1BUF9NQVhfTk1BUCB8fCAhKGZsYWdzICYgWEZTX0JNQVBJX1dSSVRFKSk7Ci0Jd2hpY2hmb3JrID0gKGZsYWdzICYgWEZTX0JNQVBJX0FUVFJGT1JLKSA/Ci0JCVhGU19BVFRSX0ZPUksgOiBYRlNfREFUQV9GT1JLOwotCW1wID0gaXAtPmlfbW91bnQ7CisJQVNTRVJUKCEoZmxhZ3MgJiB+KFhGU19CTUFQSV9BVFRSRk9SS3xYRlNfQk1BUElfRU5USVJFfAorCQkJICAgWEZTX0JNQVBJX0lHU1RBVEUpKSk7CisKIAlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoCiAJICAgIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKLQkgICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKLQkgICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpLAorCSAgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSksCiAJICAgICBtcCwgWEZTX0VSUlRBR19CTUFQSUZPUk1BVCwgWEZTX1JBTkRPTV9CTUFQSUZPUk1BVCkpKSB7Ci0JCVhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwaSIsIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBpX3JlYWQiLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CiAJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKIAl9CisKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKLQlydCA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgJiYgWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKTsKKworCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHIpOworCiAJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKIAlBU1NFUlQoaWZwLT5pZl9leHRfbWF4ID09CiAJICAgICAgIFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7Ci0JaWYgKCh3ciA9IChmbGFncyAmIFhGU19CTUFQSV9XUklURSkpICE9IDApCi0JCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHcpOwotCWVsc2UKLQkJWEZTX1NUQVRTX0lOQyh4c19ibGtfbWFwcik7Ci0JLyoKLQkgKiBJR1NUQVRFIGZsYWcgaXMgdXNlZCB0byBjb21iaW5lIGV4dGVudHMgd2hpY2gKLQkgKiBkaWZmZXIgb25seSBkdWUgdG8gdGhlIHN0YXRlIG9mIHRoZSBleHRlbnRzLgotCSAqIFRoaXMgdGVjaG5pcXVlIGlzIHVzZWQgZnJvbSB4ZnNfZ2V0Ym1hcCgpCi0JICogd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IHdpc2ggdG8gc2VlIHRoZQotCSAqIHNlcGFyYXRpb24gKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS4KLQkgKgotCSAqIFRoaXMgdGVjaG5pcXVlIGlzIGFsc28gdXNlZCB3aGVuIHdyaXRpbmcgYQotCSAqIGJ1ZmZlciB3aGljaCBoYXMgYmVlbiBwYXJ0aWFsbHkgd3JpdHRlbiwKLQkgKiAodXN1YWxseSBieSBiZWluZyBmbHVzaGVkIGR1cmluZyBhIGNodW5rcmVhZCksCi0JICogdG8gZW5zdXJlIG9uZSB3cml0ZSB0YWtlcyBwbGFjZS4gVGhpcyBhbHNvCi0JICogcHJldmVudHMgYSBjaGFuZ2UgaW4gdGhlIHhmcyBpbm9kZSBleHRlbnRzIGF0Ci0JICogdGhpcyB0aW1lLCBpbnRlbnRpb25hbGx5LiBUaGlzIGNoYW5nZSBvY2N1cnMKLQkgKiBvbiBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24sIGluCi0JICogeGZzX3N0cmF0X2NvbXAoKSwgd2hlcmUgdGhlIHhmc19ibWFwaSgpIGNhbGwKLQkgKiBpcyB0cmFuc2FjdGlvbmVkLCBhbmQgdGhlIGV4dGVudHMgY29tYmluZWQuCi0JICovCi0JaWYgKChmbGFncyAmIFhGU19CTUFQSV9JR1NUQVRFKSAmJiB3cikJLyogaWYgd3JpdGluZyB1bndyaXR0ZW4gc3BhY2UgKi8KLQkJd3IgPSAwOwkJCQkvKiBubyBhbGxvY2F0aW9ucyBhcmUgYWxsb3dlZCAqLwotCUFTU0VSVCh3ciB8fCAhKGZsYWdzICYgWEZTX0JNQVBJX0RFTEFZKSk7Ci0JbG9nZmxhZ3MgPSAwOwotCW5hbGxvY3MgPSAwOwotCWN1ciA9IE5VTEw7Ci0JaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKLQkJQVNTRVJUKHdyICYmIHRwKTsKLQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2xvY2FsX3RvX2V4dGVudHModHAsIGlwLAotCQkJCWZpcnN0YmxvY2ssIHRvdGFsLCAmbG9nZmxhZ3MsIHdoaWNoZm9yaykpKQotCQkJZ290byBlcnJvcjA7CisKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpIHsKKwkJZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgd2hpY2hmb3JrKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOwogCX0KLQlpZiAod3IgJiYgKmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0spIHsKLQkJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpCi0JCQltaW5sZWZ0ID0gYmUxNl90b19jcHUoaWZwLT5pZl9icm9vdC0+YmJfbGV2ZWwpICsgMTsKLQkJZWxzZQotCQkJbWlubGVmdCA9IDE7Ci0JfSBlbHNlCi0JCW1pbmxlZnQgPSAwOwotCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgotCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yaykpKQotCQlnb3RvIGVycm9yMDsKLQllcCA9IHhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LAotCQkmcHJldik7Ci0JbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKLQluID0gMDsKKworCXhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LCAmcHJldik7CiAJZW5kID0gYm5vICsgbGVuOwogCW9ibm8gPSBibm87Ci0JYm1hLmlwID0gTlVMTDsKIAogCXdoaWxlIChibm8gPCBlbmQgJiYgbiA8ICpubWFwKSB7Ci0JCS8qCi0JCSAqIFJlYWRpbmcgcGFzdCBlb2YsIGFjdCBhcyB0aG91Z2ggdGhlcmUncyBhIGhvbGUKLQkJICogdXAgdG8gZW5kLgotCQkgKi8KLQkJaWYgKGVvZiAmJiAhd3IpCisJCS8qIFJlYWRpbmcgcGFzdCBlb2YsIGFjdCBhcyB0aG91Z2ggdGhlcmUncyBhIGhvbGUgdXAgdG8gZW5kLiAqLworCQlpZiAoZW9mKQogCQkJZ290LmJyX3N0YXJ0b2ZmID0gZW5kOwotCQlpbmhvbGUgPSBlb2YgfHwgZ290LmJyX3N0YXJ0b2ZmID4gYm5vOwotCQl3YXNkZWxheSA9IHdyICYmICFpbmhvbGUgJiYgIShmbGFncyAmIFhGU19CTUFQSV9ERUxBWSkgJiYKLQkJCWlzbnVsbHN0YXJ0YmxvY2soZ290LmJyX3N0YXJ0YmxvY2spOwotCQkvKgotCQkgKiBGaXJzdCwgZGVhbCB3aXRoIHRoZSBob2xlIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHNwYWNlCi0JCSAqIHRoYXQgd2UgZm91bmQsIGlmIGFueS4KLQkJICovCi0JCWlmICh3ciAmJiAoaW5ob2xlIHx8IHdhc2RlbGF5KSkgewotCQkJLyoKLQkJCSAqIEZvciB0aGUgd2FzZGVsYXkgY2FzZSwgd2UgY291bGQgYWxzbyBqdXN0Ci0JCQkgKiBhbGxvY2F0ZSB0aGUgc3R1ZmYgYXNrZWQgZm9yIGluIHRoaXMgYm1hcCBjYWxsCi0JCQkgKiBidXQgdGhhdCB3b3VsZG4ndCBiZSBhcyBnb29kLgotCQkJICovCi0JCQlpZiAod2FzZGVsYXkpIHsKLQkJCQlhbGVuID0gKHhmc19leHRsZW5fdClnb3QuYnJfYmxvY2tjb3VudDsKLQkJCQlhb2ZmID0gZ290LmJyX3N0YXJ0b2ZmOwotCQkJCWlmIChsYXN0eCAhPSBOVUxMRVhUTlVNICYmIGxhc3R4KSB7Ci0JCQkJCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIGxhc3R4IC0gMSk7Ci0JCQkJCXhmc19ibWJ0X2dldF9hbGwoZXAsICZwcmV2KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWFsZW4gPSAoeGZzX2V4dGxlbl90KQotCQkJCQlYRlNfRklMQkxLU19NSU4obGVuLCBNQVhFWFRMRU4pOwotCQkJCWlmICghZW9mKQotCQkJCQlhbGVuID0gKHhmc19leHRsZW5fdCkKLQkJCQkJCVhGU19GSUxCTEtTX01JTihhbGVuLAotCQkJCQkJCWdvdC5icl9zdGFydG9mZiAtIGJubyk7Ci0JCQkJYW9mZiA9IGJubzsKLQkJCX0KLQkJCW1pbmxlbiA9IChmbGFncyAmIFhGU19CTUFQSV9DT05USUcpID8gYWxlbiA6IDE7Ci0JCQlpZiAoZmxhZ3MgJiBYRlNfQk1BUElfREVMQVkpIHsKLQkJCQl4ZnNfZXh0bGVuX3QJZXh0c3o7Ci0KLQkJCQkvKiBGaWd1cmUgb3V0IHRoZSBleHRlbnQgc2l6ZSwgYWRqdXN0IGFsZW4gKi8KLQkJCQlleHRzeiA9IHhmc19nZXRfZXh0c3pfaGludChpcCk7Ci0JCQkJaWYgKGV4dHN6KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIG1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgYSBzaW5nbGUKLQkJCQkJICogZXh0ZW50IGxlbmd0aCB3aGVuIHdlIGFsaWduIHRoZQotCQkJCQkgKiBleHRlbnQgYnkgcmVkdWNpbmcgbGVuZ3RoIHdlIGFyZQotCQkJCQkgKiBnb2luZyB0byBhbGxvY2F0ZSBieSB0aGUgbWF4aW11bQotCQkJCQkgKiBhbW91bnQgZXh0ZW50IHNpemUgYWxpZ21lbnQgbWF5Ci0JCQkJCSAqIHJlcXVpcmUuCi0JCQkJCSAqLwotCQkJCQlhbGVuID0gWEZTX0ZJTEJMS1NfTUlOKGxlbiwKLQkJCQkJCSAgIE1BWEVYVExFTiAtICgyICogZXh0c3ogLSAxKSk7Ci0JCQkJCWVycm9yID0geGZzX2JtYXBfZXh0c2l6ZV9hbGlnbihtcCwKLQkJCQkJCQkmZ290LCAmcHJldiwgZXh0c3osCi0JCQkJCQkJcnQsIGVvZiwKLQkJCQkJCQlmbGFncyZYRlNfQk1BUElfREVMQVksCi0JCQkJCQkJZmxhZ3MmWEZTX0JNQVBJX0NPTlZFUlQsCi0JCQkJCQkJJmFvZmYsICZhbGVuKTsKLQkJCQkJQVNTRVJUKCFlcnJvcik7Ci0JCQkJfQotCi0JCQkJaWYgKHJ0KQotCQkJCQlleHRzeiA9IGFsZW4gLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQotCQkJCS8qCi0JCQkJICogTWFrZSBhIHRyYW5zYWN0aW9uLWxlc3MgcXVvdGEgcmVzZXJ2YXRpb24gZm9yCi0JCQkJICogZGVsYXllZCBhbGxvY2F0aW9uIGJsb2Nrcy4gVGhpcyBudW1iZXIgZ2V0cwotCQkJCSAqIGFkanVzdGVkIGxhdGVyLiAgV2UgcmV0dXJuIGlmIHdlIGhhdmVuJ3QKLQkJCQkgKiBhbGxvY2F0ZWQgYmxvY2tzIGFscmVhZHkgaW5zaWRlIHRoaXMgbG9vcC4KLQkJCQkgKi8KLQkJCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlX3F1b3RhX25ibGtzKAotCQkJCQkJTlVMTCwgaXAsIChsb25nKWFsZW4sIDAsCi0JCQkJCQlydCA/IFhGU19RTU9QVF9SRVNfUlRCTEtTIDoKLQkJCQkJCSAgICAgWEZTX1FNT1BUX1JFU19SRUdCTEtTKTsKLQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJaWYgKG4gPT0gMCkgewotCQkJCQkJKm5tYXAgPSAwOwotCQkJCQkJQVNTRVJUKGN1ciA9PSBOVUxMKTsKLQkJCQkJCXJldHVybiBlcnJvcjsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIFNwbGl0IGNoYW5naW5nIHNiIGZvciBhbGVuIGFuZCBpbmRsZW4gc2luY2UKLQkJCQkgKiB0aGV5IGNvdWxkIGJlIGNvbWluZyBmcm9tIGRpZmZlcmVudCBwbGFjZXMuCi0JCQkJICovCi0JCQkJaW5kbGVuID0gKHhmc19leHRsZW5fdCkKLQkJCQkJeGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCBhbGVuKTsKLQkJCQlBU1NFUlQoaW5kbGVuID4gMCk7Ci0KLQkJCQlpZiAocnQpIHsKLQkJCQkJZXJyb3IgPSB4ZnNfbW9kX2luY29yZV9zYihtcCwKLQkJCQkJCQlYRlNfU0JTX0ZSRVhURU5UUywKLQkJCQkJCQktKChpbnQ2NF90KWV4dHN6KSwgMCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3IgPSB4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMobXAsCi0JCQkJCQkJWEZTX1NCU19GREJMT0NLUywKLQkJCQkJCQktKChpbnQ2NF90KWFsZW4pLCAwKTsKLQkJCQl9Ci0JCQkJaWYgKCFlcnJvcikgewotCQkJCQllcnJvciA9IHhmc19pY3NiX21vZGlmeV9jb3VudGVycyhtcCwKLQkJCQkJCQlYRlNfU0JTX0ZEQkxPQ0tTLAotCQkJCQkJCS0oKGludDY0X3QpaW5kbGVuKSwgMCk7Ci0JCQkJCWlmIChlcnJvciAmJiBydCkKLQkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKG1wLAotCQkJCQkJCVhGU19TQlNfRlJFWFRFTlRTLAotCQkJCQkJCShpbnQ2NF90KWV4dHN6LCAwKTsKLQkJCQkJZWxzZSBpZiAoZXJyb3IpCi0JCQkJCQl4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMobXAsCi0JCQkJCQkJWEZTX1NCU19GREJMT0NLUywKLQkJCQkJCQkoaW50NjRfdClhbGVuLCAwKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJaWYgKFhGU19JU19RVU9UQV9PTihtcCkpCi0JCQkJCQkvKiB1bnJlc2VydmUgdGhlIGJsb2NrcyBub3cgKi8KLQkJCQkJCSh2b2lkKQotCQkJCQkJeGZzX3RyYW5zX3VucmVzZXJ2ZV9xdW90YV9uYmxrcygKLQkJCQkJCQlOVUxMLCBpcCwKLQkJCQkJCQkobG9uZylhbGVuLCAwLCBydCA/Ci0JCQkJCQkJWEZTX1FNT1BUX1JFU19SVEJMS1MgOgotCQkJCQkJCVhGU19RTU9QVF9SRVNfUkVHQkxLUyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlwLT5pX2RlbGF5ZWRfYmxrcyArPSBhbGVuOwotCQkJCWFibm8gPSBudWxsc3RhcnRibG9jayhpbmRsZW4pOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIElmIGZpcnN0IHRpbWUsIGFsbG9jYXRlIGFuZCBmaWxsIGluCi0JCQkJICogb25jZS1vbmx5IGJtYSBmaWVsZHMuCi0JCQkJICovCi0JCQkJaWYgKGJtYS5pcCA9PSBOVUxMKSB7Ci0JCQkJCWJtYS50cCA9IHRwOwotCQkJCQlibWEuaXAgPSBpcDsKLQkJCQkJYm1hLnByZXZwID0gJnByZXY7Ci0JCQkJCWJtYS5nb3RwID0gJmdvdDsKLQkJCQkJYm1hLnRvdGFsID0gdG90YWw7Ci0JCQkJCWJtYS51c2VyZGF0YSA9IDA7Ci0JCQkJfQotCQkJCS8qIEluZGljYXRlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIgZGF0YQotCQkJCSAqIGluIHRoZSBmaWxlLCBvciBqdXN0IGFueSB1c2VyIGRhdGEuCi0JCQkJICovCi0JCQkJaWYgKCEoZmxhZ3MgJiBYRlNfQk1BUElfTUVUQURBVEEpKSB7Ci0JCQkJCWJtYS51c2VyZGF0YSA9IChhb2ZmID09IDApID8KLQkJCQkJCVhGU19BTExPQ19JTklUSUFMX1VTRVJfREFUQSA6Ci0JCQkJCQlYRlNfQUxMT0NfVVNFUkRBVEE7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogRmlsbCBpbiBjaGFuZ2VhYmxlIGJtYSBmaWVsZHMuCi0JCQkJICovCi0JCQkJYm1hLmVvZiA9IGVvZjsKLQkJCQlibWEuZmlyc3RibG9jayA9ICpmaXJzdGJsb2NrOwotCQkJCWJtYS5hbGVuID0gYWxlbjsKLQkJCQlibWEub2ZmID0gYW9mZjsKLQkJCQlibWEuY29udiA9ICEhKGZsYWdzICYgWEZTX0JNQVBJX0NPTlZFUlQpOwotCQkJCWJtYS53YXNkZWwgPSB3YXNkZWxheTsKLQkJCQlibWEubWlubGVuID0gbWlubGVuOwotCQkJCWJtYS5sb3cgPSBmbGlzdC0+eGJmX2xvdzsKLQkJCQlibWEubWlubGVmdCA9IG1pbmxlZnQ7Ci0JCQkJLyoKLQkJCQkgKiBPbmx5IHdhbnQgdG8gZG8gdGhlIGFsaWdubWVudCBhdCB0aGUKLQkJCQkgKiBlb2YgaWYgaXQgaXMgdXNlcmRhdGEgYW5kIGFsbG9jYXRpb24gbGVuZ3RoCi0JCQkJICogaXMgbGFyZ2VyIHRoYW4gYSBzdHJpcGUgdW5pdC4KLQkJCQkgKi8KLQkJCQlpZiAobXAtPm1fZGFsaWduICYmIGFsZW4gPj0gbXAtPm1fZGFsaWduICYmCi0JCQkJICAgICghKGZsYWdzICYgWEZTX0JNQVBJX01FVEFEQVRBKSkgJiYKLQkJCQkgICAgKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSkgewotCQkJCQlpZiAoKGVycm9yID0geGZzX2JtYXBfaXNhZW9mKGlwLCBhb2ZmLAotCQkJCQkJCXdoaWNoZm9yaywgJmJtYS5hZW9mKSkpCi0JCQkJCQlnb3RvIGVycm9yMDsKLQkJCQl9IGVsc2UKLQkJCQkJYm1hLmFlb2YgPSAwOwotCQkJCS8qCi0JCQkJICogQ2FsbCBhbGxvY2F0b3IuCi0JCQkJICovCi0JCQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FsbG9jKCZibWEpKSkKLQkJCQkJZ290byBlcnJvcjA7Ci0JCQkJLyoKLQkJCQkgKiBDb3B5IG91dCByZXN1bHQgZmllbGRzLgotCQkJCSAqLwotCQkJCWFibm8gPSBibWEucnZhbDsKLQkJCQlpZiAoKGZsaXN0LT54YmZfbG93ID0gYm1hLmxvdykpCi0JCQkJCW1pbmxlZnQgPSAwOwotCQkJCWFsZW4gPSBibWEuYWxlbjsKLQkJCQlhb2ZmID0gYm1hLm9mZjsKLQkJCQlBU1NFUlQoKmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0sgfHwKLQkJCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLCAqZmlyc3RibG9jaykgPT0KLQkJCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLCBibWEuZmlyc3RibG9jaykgfHwKLQkJCQkgICAgICAgKGZsaXN0LT54YmZfbG93ICYmCi0JCQkJCVhGU19GU0JfVE9fQUdOTyhtcCwgKmZpcnN0YmxvY2spIDwKLQkJCQkJWEZTX0ZTQl9UT19BR05PKG1wLCBibWEuZmlyc3RibG9jaykpKTsKLQkJCQkqZmlyc3RibG9jayA9IGJtYS5maXJzdGJsb2NrOwotCQkJCWlmIChjdXIpCi0JCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPQotCQkJCQkJKmZpcnN0YmxvY2s7Ci0JCQkJaWYgKGFibm8gPT0gTlVMTEZTQkxPQ0spCi0JCQkJCWJyZWFrOwotCQkJCWlmICgoaWZwLT5pZl9mbGFncyAmIFhGU19JRkJST09UKSAmJiAhY3VyKSB7Ci0JCQkJCWN1ciA9IHhmc19ibWJ0X2luaXRfY3Vyc29yKG1wLCB0cCwKLQkJCQkJCWlwLCB3aGljaGZvcmspOwotCQkJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0KLQkJCQkJCSpmaXJzdGJsb2NrOwotCQkJCQljdXItPmJjX3ByaXZhdGUuYi5mbGlzdCA9IGZsaXN0OwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIEJ1bXAgdGhlIG51bWJlciBvZiBleHRlbnRzIHdlJ3ZlIGFsbG9jYXRlZAotCQkJCSAqIGluIHRoaXMgY2FsbC4KLQkJCQkgKi8KLQkJCQluYWxsb2NzKys7Ci0JCQl9Ci0JCQlpZiAoY3VyKQotCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzID0KLQkJCQkJd2FzZGVsYXkgPyBYRlNfQlRDVVJfQlBSVl9XQVNERUwgOiAwOwotCQkJZ290LmJyX3N0YXJ0b2ZmID0gYW9mZjsKLQkJCWdvdC5icl9zdGFydGJsb2NrID0gYWJubzsKLQkJCWdvdC5icl9ibG9ja2NvdW50ID0gYWxlbjsKLQkJCWdvdC5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsJLyogYXNzdW1lIG5vcm1hbCAqLwotCQkJLyoKLQkJCSAqIERldGVybWluZSBzdGF0ZSBvZiBleHRlbnQsIGFuZCB0aGUgZmlsZXN5c3RlbS4KLQkJCSAqIEEgd2FzZGVsYXkgZXh0ZW50IGhhcyBiZWVuIGluaXRpYWxpemVkLCBzbwotCQkJICogc2hvdWxkbid0IGJlIGZsYWdnZWQgYXMgdW53cml0dGVuLgotCQkJICovCi0JCQlpZiAod3IgJiYgeGZzX3NiX3ZlcnNpb25faGFzZXh0ZmxnYml0KCZtcC0+bV9zYikpIHsKLQkJCQlpZiAoIXdhc2RlbGF5ICYmIChmbGFncyAmIFhGU19CTUFQSV9QUkVBTExPQykpCi0JCQkJCWdvdC5icl9zdGF0ZSA9IFhGU19FWFRfVU5XUklUVEVOOwotCQkJfQotCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50KHRwLCBpcCwgJmxhc3R4LCAmY3VyLCAmZ290LAotCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmdG1wX2xvZ2ZsYWdzLAotCQkJCXdoaWNoZm9yayk7Ci0JCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJZ290byBlcnJvcjA7Ci0JCQllcCA9IHhmc19pZXh0X2dldF9leHQoaWZwLCBsYXN0eCk7Ci0JCQluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwotCQkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJmdvdCk7Ci0JCQlBU1NFUlQoZ290LmJyX3N0YXJ0b2ZmIDw9IGFvZmYpOwotCQkJQVNTRVJUKGdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50ID49Ci0JCQkJYW9mZiArIGFsZW4pOwotI2lmZGVmIERFQlVHCi0JCQlpZiAoZmxhZ3MgJiBYRlNfQk1BUElfREVMQVkpIHsKLQkJCQlBU1NFUlQoaXNudWxsc3RhcnRibG9jayhnb3QuYnJfc3RhcnRibG9jaykpOwotCQkJCUFTU0VSVChzdGFydGJsb2NrdmFsKGdvdC5icl9zdGFydGJsb2NrKSA+IDApOwotCQkJfQotCQkJQVNTRVJUKGdvdC5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0gfHwKLQkJCSAgICAgICBnb3QuYnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pOwotI2VuZGlmCi0JCQkvKgotCQkJICogRmFsbCBkb3duIGludG8gdGhlIGZvdW5kIGFsbG9jYXRlZCBzcGFjZSBjYXNlLgotCQkJICovCi0JCX0gZWxzZSBpZiAoaW5ob2xlKSB7Ci0JCQkvKgotCQkJICogUmVhZGluZyBpbiBhIGhvbGUuCi0JCQkgKi8KKwkJaWYgKGdvdC5icl9zdGFydG9mZiA+IGJubykgeworCQkJLyogUmVhZGluZyBpbiBhIGhvbGUuICAqLwogCQkJbXZhbC0+YnJfc3RhcnRvZmYgPSBibm87CiAJCQltdmFsLT5icl9zdGFydGJsb2NrID0gSE9MRVNUQVJUQkxPQ0s7CiAJCQltdmFsLT5icl9ibG9ja2NvdW50ID0KQEAgLTQ2OTcsMTUxICs0NDA3LDU3MCBAQAogCQkJbisrOwogCQkJY29udGludWU7CiAJCX0KKworCQkvKiBzZXQgdXAgdGhlIGV4dGVudCBtYXAgdG8gcmV0dXJuLiAqLworCQl4ZnNfYm1hcGlfdHJpbV9tYXAobXZhbCwgJmdvdCwgJmJubywgbGVuLCBvYm5vLCBlbmQsIG4sIGZsYWdzKTsKKwkJeGZzX2JtYXBpX3VwZGF0ZV9tYXAoJm12YWwsICZibm8sICZsZW4sIG9ibm8sIGVuZCwgJm4sIGZsYWdzKTsKKworCQkvKiBJZiB3ZSdyZSBkb25lLCBzdG9wIG5vdy4gKi8KKwkJaWYgKGJubyA+PSBlbmQgfHwgbiA+PSAqbm1hcCkKKwkJCWJyZWFrOworCisJCS8qIEVsc2UgZ28gb24gdG8gdGhlIG5leHQgcmVjb3JkLiAqLworCQlpZiAoKytsYXN0eCA8IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpKQorCQkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgbGFzdHgpLCAmZ290KTsKKwkJZWxzZQorCQkJZW9mID0gMTsKKwl9CisJKm5tYXAgPSBuOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfYm1hcGlfcmVzZXJ2ZV9kZWxhbGxvYygKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwl4ZnNfZmlsZW9mZl90CQlhb2ZmLAorCXhmc19maWxibGtzX3QJCWxlbiwKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqZ290LAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpwcmV2LAorCXhmc19leHRudW1fdAkJKmxhc3R4LAorCWludAkJCWVvZikKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcCA9IFhGU19JRk9SS19QVFIoaXAsIFhGU19EQVRBX0ZPUkspOworCXhmc19leHRsZW5fdAkJYWxlbjsKKwl4ZnNfZXh0bGVuX3QJCWluZGxlbjsKKwljaGFyCQkJcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOworCXhmc19leHRsZW5fdAkJZXh0c3o7CisJaW50CQkJZXJyb3I7CisKKwlhbGVuID0gWEZTX0ZJTEJMS1NfTUlOKGxlbiwgTUFYRVhUTEVOKTsKKwlpZiAoIWVvZikKKwkJYWxlbiA9IFhGU19GSUxCTEtTX01JTihhbGVuLCBnb3QtPmJyX3N0YXJ0b2ZmIC0gYW9mZik7CisKKwkvKiBGaWd1cmUgb3V0IHRoZSBleHRlbnQgc2l6ZSwgYWRqdXN0IGFsZW4gKi8KKwlleHRzeiA9IHhmc19nZXRfZXh0c3pfaGludChpcCk7CisJaWYgKGV4dHN6KSB7CiAJCS8qCi0JCSAqIFRoZW4gZGVhbCB3aXRoIHRoZSBhbGxvY2F0ZWQgc3BhY2Ugd2UgZm91bmQuCisJCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgYSBzaW5nbGUgZXh0ZW50IGxlbmd0aCB3aGVuIHdlCisJCSAqIGFsaWduIHRoZSBleHRlbnQgYnkgcmVkdWNpbmcgbGVuZ3RoIHdlIGFyZSBnb2luZyB0bworCQkgKiBhbGxvY2F0ZSBieSB0aGUgbWF4aW11bSBhbW91bnQgZXh0ZW50IHNpemUgYWxpZ21lbnQgbWF5CisJCSAqIHJlcXVpcmUuCiAJCSAqLwotCQlBU1NFUlQoZXAgIT0gTlVMTCk7Ci0JCWlmICghKGZsYWdzICYgWEZTX0JNQVBJX0VOVElSRSkgJiYKLQkJICAgIChnb3QuYnJfc3RhcnRvZmYgKyBnb3QuYnJfYmxvY2tjb3VudCA+IG9ibm8pKSB7Ci0JCQlpZiAob2JubyA+IGJubykKLQkJCQlibm8gPSBvYm5vOwotCQkJQVNTRVJUKChibm8gPj0gb2JubykgfHwgKG4gPT0gMCkpOwotCQkJQVNTRVJUKGJubyA8IGVuZCk7Ci0JCQltdmFsLT5icl9zdGFydG9mZiA9IGJubzsKLQkJCWlmIChpc251bGxzdGFydGJsb2NrKGdvdC5icl9zdGFydGJsb2NrKSkgewotCQkJCUFTU0VSVCghd3IgfHwgKGZsYWdzICYgWEZTX0JNQVBJX0RFTEFZKSk7Ci0JCQkJbXZhbC0+YnJfc3RhcnRibG9jayA9IERFTEFZU1RBUlRCTE9DSzsKLQkJCX0gZWxzZQotCQkJCW12YWwtPmJyX3N0YXJ0YmxvY2sgPQotCQkJCQlnb3QuYnJfc3RhcnRibG9jayArCi0JCQkJCShibm8gLSBnb3QuYnJfc3RhcnRvZmYpOwotCQkJLyoKLQkJCSAqIFJldHVybiB0aGUgbWluaW11bSBvZiB3aGF0IHdlIGdvdCBhbmQgd2hhdCB3ZQotCQkJICogYXNrZWQgZm9yIGZvciB0aGUgbGVuZ3RoLiAgV2UgY2FuIHVzZSB0aGUgbGVuCi0JCQkgKiB2YXJpYWJsZSBoZXJlIGJlY2F1c2UgaXQgaXMgbW9kaWZpZWQgYmVsb3cKLQkJCSAqIGFuZCB3ZSBjb3VsZCBoYXZlIGJlZW4gdGhlcmUgYmVmb3JlIGNvbWluZwotCQkJICogaGVyZSBpZiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgYWxsb2NhdGlvbgotCQkJICogZGlkbid0IG92ZXJsYXAgd2hhdCB3YXMgYXNrZWQgZm9yLgotCQkJICovCi0JCQltdmFsLT5icl9ibG9ja2NvdW50ID0KLQkJCQlYRlNfRklMQkxLU19NSU4oZW5kIC0gYm5vLCBnb3QuYnJfYmxvY2tjb3VudCAtCi0JCQkJCShibm8gLSBnb3QuYnJfc3RhcnRvZmYpKTsKLQkJCW12YWwtPmJyX3N0YXRlID0gZ290LmJyX3N0YXRlOwotCQkJQVNTRVJUKG12YWwtPmJyX2Jsb2NrY291bnQgPD0gbGVuKTsKLQkJfSBlbHNlIHsKLQkJCSptdmFsID0gZ290OwotCQkJaWYgKGlzbnVsbHN0YXJ0YmxvY2sobXZhbC0+YnJfc3RhcnRibG9jaykpIHsKLQkJCQlBU1NFUlQoIXdyIHx8IChmbGFncyAmIFhGU19CTUFQSV9ERUxBWSkpOwotCQkJCW12YWwtPmJyX3N0YXJ0YmxvY2sgPSBERUxBWVNUQVJUQkxPQ0s7CisJCWFsZW4gPSBYRlNfRklMQkxLU19NSU4obGVuLCBNQVhFWFRMRU4gLSAoMiAqIGV4dHN6IC0gMSkpOworCQllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsIGdvdCwgcHJldiwgZXh0c3osIHJ0LCBlb2YsCisJCQkJCSAgICAgICAxLCAwLCAmYW9mZiwgJmFsZW4pOworCQlBU1NFUlQoIWVycm9yKTsKKwl9CisKKwlpZiAocnQpCisJCWV4dHN6ID0gYWxlbiAvIG1wLT5tX3NiLnNiX3JleHRzaXplOworCisJLyoKKwkgKiBNYWtlIGEgdHJhbnNhY3Rpb24tbGVzcyBxdW90YSByZXNlcnZhdGlvbiBmb3IgZGVsYXllZCBhbGxvY2F0aW9uCisJICogYmxvY2tzLiAgVGhpcyBudW1iZXIgZ2V0cyBhZGp1c3RlZCBsYXRlci4gIFdlIHJldHVybiBpZiB3ZSBoYXZlbid0CisJICogYWxsb2NhdGVkIGJsb2NrcyBhbHJlYWR5IGluc2lkZSB0aGlzIGxvb3AuCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZV9xdW90YV9uYmxrcyhOVUxMLCBpcCwgKGxvbmcpYWxlbiwgMCwKKwkJCXJ0ID8gWEZTX1FNT1BUX1JFU19SVEJMS1MgOiBYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBTcGxpdCBjaGFuZ2luZyBzYiBmb3IgYWxlbiBhbmQgaW5kbGVuIHNpbmNlIHRoZXkgY291bGQgYmUgY29taW5nCisJICogZnJvbSBkaWZmZXJlbnQgcGxhY2VzLgorCSAqLworCWluZGxlbiA9ICh4ZnNfZXh0bGVuX3QpeGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCBhbGVuKTsKKwlBU1NFUlQoaW5kbGVuID4gMCk7CisKKwlpZiAocnQpIHsKKwkJZXJyb3IgPSB4ZnNfbW9kX2luY29yZV9zYihtcCwgWEZTX1NCU19GUkVYVEVOVFMsCisJCQkJCSAgLSgoaW50NjRfdClleHRzeiksIDApOworCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2ljc2JfbW9kaWZ5X2NvdW50ZXJzKG1wLCBYRlNfU0JTX0ZEQkxPQ0tTLAorCQkJCQkJIC0oKGludDY0X3QpYWxlbiksIDApOworCX0KKworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdW5yZXNlcnZlX3F1b3RhOworCisJZXJyb3IgPSB4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMobXAsIFhGU19TQlNfRkRCTE9DS1MsCisJCQkJCSAtKChpbnQ2NF90KWluZGxlbiksIDApOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdW5yZXNlcnZlX2Jsb2NrczsKKworCisJaXAtPmlfZGVsYXllZF9ibGtzICs9IGFsZW47CisKKwlnb3QtPmJyX3N0YXJ0b2ZmID0gYW9mZjsKKwlnb3QtPmJyX3N0YXJ0YmxvY2sgPSBudWxsc3RhcnRibG9jayhpbmRsZW4pOworCWdvdC0+YnJfYmxvY2tjb3VudCA9IGFsZW47CisJZ290LT5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwl4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfZGVsYXkoaXAsIGxhc3R4LCBnb3QpOworCisJLyoKKwkgKiBVcGRhdGUgb3VyIGV4dGVudCBwb2ludGVyLCBnaXZlbiB0aGF0IHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9kZWxheQorCSAqIG1pZ2h0IGhhdmUgbWVyZ2VkIGl0IGludG8gb25lIG9mIHRoZSBuZWlnaGJvdXJpbmcgb25lcy4KKwkgKi8KKwl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCAqbGFzdHgpLCBnb3QpOworCisJQVNTRVJUKGdvdC0+YnJfc3RhcnRvZmYgPD0gYW9mZik7CisJQVNTRVJUKGdvdC0+YnJfc3RhcnRvZmYgKyBnb3QtPmJyX2Jsb2NrY291bnQgPj0gYW9mZiArIGFsZW4pOworCUFTU0VSVChpc251bGxzdGFydGJsb2NrKGdvdC0+YnJfc3RhcnRibG9jaykpOworCUFTU0VSVChnb3QtPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSk7CisJcmV0dXJuIDA7CisKK291dF91bnJlc2VydmVfYmxvY2tzOgorCWlmIChydCkKKwkJeGZzX21vZF9pbmNvcmVfc2IobXAsIFhGU19TQlNfRlJFWFRFTlRTLCBleHRzeiwgMCk7CisJZWxzZQorCQl4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMobXAsIFhGU19TQlNfRkRCTE9DS1MsIGFsZW4sIDApOworb3V0X3VucmVzZXJ2ZV9xdW90YToKKwlpZiAoWEZTX0lTX1FVT1RBX09OKG1wKSkKKwkJeGZzX3RyYW5zX3VucmVzZXJ2ZV9xdW90YV9uYmxrcyhOVUxMLCBpcCwgYWxlbiwgMCwgcnQgPworCQkJCVhGU19RTU9QVF9SRVNfUlRCTEtTIDogWEZTX1FNT1BUX1JFU19SRUdCTEtTKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBNYXAgZmlsZSBibG9ja3MgdG8gZmlsZXN5c3RlbSBibG9ja3MsIGFkZGluZyBkZWxheWVkIGFsbG9jYXRpb25zIGFzIG5lZWRlZC4KKyAqLworaW50Cit4ZnNfYm1hcGlfZGVsYXkoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19maWxlb2ZmX3QJCWJubywJLyogc3RhcnRpbmcgZmlsZSBvZmZzLiBtYXBwZWQgKi8KKwl4ZnNfZmlsYmxrc190CQlsZW4sCS8qIGxlbmd0aCB0byBtYXAgaW4gZmlsZSAqLworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSptdmFsLAkvKiBvdXRwdXQ6IG1hcCB2YWx1ZXMgKi8KKwlpbnQJCQkqbm1hcCwJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KKwlpbnQJCQlmbGFncykJLyogWEZTX0JNQVBJXy4uLiAqLworeworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJc3RydWN0IHhmc19pZm9yawkqaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7CisJc3RydWN0IHhmc19ibWJ0X2lyZWMJZ290OwkvKiBjdXJyZW50IGZpbGUgZXh0ZW50IHJlY29yZCAqLworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXByZXY7CS8qIHByZXZpb3VzIGZpbGUgZXh0ZW50IHJlY29yZCAqLworCXhmc19maWxlb2ZmX3QJCW9ibm87CS8qIG9sZCBibG9jayBudW1iZXIgKG9mZnNldCkgKi8KKwl4ZnNfZmlsZW9mZl90CQllbmQ7CS8qIGVuZCBvZiBtYXBwZWQgZmlsZSByZWdpb24gKi8KKwl4ZnNfZXh0bnVtX3QJCWxhc3R4OwkvKiBsYXN0IHVzZWZ1bCBleHRlbnQgbnVtYmVyICovCisJaW50CQkJZW9mOwkvKiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiBleHRlbnRzICovCisJaW50CQkJbiA9IDA7CS8qIGN1cnJlbnQgZXh0ZW50IGluZGV4ICovCisJaW50CQkJZXJyb3IgPSAwOworCisJQVNTRVJUKCpubWFwID49IDEpOworCUFTU0VSVCgqbm1hcCA8PSBYRlNfQk1BUF9NQVhfTk1BUCk7CisJQVNTRVJUKCEoZmxhZ3MgJiB+WEZTX0JNQVBJX0VOVElSRSkpOworCisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKAorCSAgICAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgWEZTX0RBVEFfRk9SSykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgWEZTX0RBVEFfRk9SSykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpLAorCSAgICAgbXAsIFhGU19FUlJUQUdfQk1BUElGT1JNQVQsIFhGU19SQU5ET01fQk1BUElGT1JNQVQpKSkgeworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYm1hcGlfZGVsYXkiLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHcpOworCisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSB7CisJCWVycm9yID0geGZzX2lyZWFkX2V4dGVudHMoTlVMTCwgaXAsIFhGU19EQVRBX0ZPUkspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoaXAsIGJubywgWEZTX0RBVEFfRk9SSywgJmVvZiwgJmxhc3R4LCAmZ290LCAmcHJldik7CisJZW5kID0gYm5vICsgbGVuOworCW9ibm8gPSBibm87CisKKwl3aGlsZSAoYm5vIDwgZW5kICYmIG4gPCAqbm1hcCkgeworCQlpZiAoZW9mIHx8IGdvdC5icl9zdGFydG9mZiA+IGJubykgeworCQkJZXJyb3IgPSB4ZnNfYm1hcGlfcmVzZXJ2ZV9kZWxhbGxvYyhpcCwgYm5vLCBsZW4sICZnb3QsCisJCQkJCQkJICAgJnByZXYsICZsYXN0eCwgZW9mKTsKKwkJCWlmIChlcnJvcikgeworCQkJCWlmIChuID09IDApIHsKKwkJCQkJKm5tYXAgPSAwOworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQorCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKKwkJLyogc2V0IHVwIHRoZSBleHRlbnQgbWFwIHRvIHJldHVybi4gKi8KKwkJeGZzX2JtYXBpX3RyaW1fbWFwKG12YWwsICZnb3QsICZibm8sIGxlbiwgb2JubywgZW5kLCBuLCBmbGFncyk7CisJCXhmc19ibWFwaV91cGRhdGVfbWFwKCZtdmFsLCAmYm5vLCAmbGVuLCBvYm5vLCBlbmQsICZuLCBmbGFncyk7CisKKwkJLyogSWYgd2UncmUgZG9uZSwgc3RvcCBub3cuICovCisJCWlmIChibm8gPj0gZW5kIHx8IG4gPj0gKm5tYXApCisJCQlicmVhazsKKworCQkvKiBFbHNlIGdvIG9uIHRvIHRoZSBuZXh0IHJlY29yZC4gKi8KKwkJcHJldiA9IGdvdDsKKwkJaWYgKCsrbGFzdHggPCBpZnAtPmlmX2J5dGVzIC8gc2l6ZW9mKHhmc19ibWJ0X3JlY190KSkKKwkJCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGxhc3R4KSwgJmdvdCk7CisJCWVsc2UKKwkJCWVvZiA9IDE7CisJfQorCisJKm5tYXAgPSBuOworCXJldHVybiAwOworfQorCisKK1NUQVRJQyBpbnQKK3hmc19ibWFwaV9hbGxvY2F0ZSgKKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEsCisJaW50CQkJZmxhZ3MpCit7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBibWEtPmlwLT5pX21vdW50OworCWludAkJCXdoaWNoZm9yayA9IChmbGFncyAmIFhGU19CTUFQSV9BVFRSRk9SSykgPworCQkJCQkJWEZTX0FUVFJfRk9SSyA6IFhGU19EQVRBX0ZPUks7CisJc3RydWN0IHhmc19pZm9yawkqaWZwID0gWEZTX0lGT1JLX1BUUihibWEtPmlwLCB3aGljaGZvcmspOworCWludAkJCXRtcF9sb2dmbGFncyA9IDA7CisJaW50CQkJZXJyb3I7CisJaW50CQkJcnQ7CisKKwlydCA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgJiYgWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGJtYS0+aXApOworCisJLyoKKwkgKiBGb3IgdGhlIHdhc2RlbGF5IGNhc2UsIHdlIGNvdWxkIGFsc28ganVzdCBhbGxvY2F0ZSB0aGUgc3R1ZmYgYXNrZWQKKwkgKiBmb3IgaW4gdGhpcyBibWFwIGNhbGwgYnV0IHRoYXQgd291bGRuJ3QgYmUgYXMgZ29vZC4KKwkgKi8KKwlpZiAoYm1hLT53YXNkZWwpIHsKKwkJYm1hLT5sZW5ndGggPSAoeGZzX2V4dGxlbl90KWJtYS0+Z290LmJyX2Jsb2NrY291bnQ7CisJCWJtYS0+b2Zmc2V0ID0gYm1hLT5nb3QuYnJfc3RhcnRvZmY7CisJCWlmIChibWEtPmlkeCAhPSBOVUxMRVhUTlVNICYmIGJtYS0+aWR4KSB7CisJCQl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCAtIDEpLAorCQkJCQkgJmJtYS0+cHJldik7CisJCX0KKwl9IGVsc2UgeworCQlibWEtPmxlbmd0aCA9IFhGU19GSUxCTEtTX01JTihibWEtPmxlbmd0aCwgTUFYRVhUTEVOKTsKKwkJaWYgKCFibWEtPmVvZikKKwkJCWJtYS0+bGVuZ3RoID0gWEZTX0ZJTEJMS1NfTUlOKGJtYS0+bGVuZ3RoLAorCQkJCQlibWEtPmdvdC5icl9zdGFydG9mZiAtIGJtYS0+b2Zmc2V0KTsKKwl9CisKKwkvKgorCSAqIEluZGljYXRlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIgZGF0YSBpbiB0aGUgZmlsZSwgb3IganVzdCBhbnkKKwkgKiB1c2VyIGRhdGEuCisJICovCisJaWYgKCEoZmxhZ3MgJiBYRlNfQk1BUElfTUVUQURBVEEpKSB7CisJCWJtYS0+dXNlcmRhdGEgPSAoYm1hLT5vZmZzZXQgPT0gMCkgPworCQkJWEZTX0FMTE9DX0lOSVRJQUxfVVNFUl9EQVRBIDogWEZTX0FMTE9DX1VTRVJEQVRBOworCX0KKworCWJtYS0+bWlubGVuID0gKGZsYWdzICYgWEZTX0JNQVBJX0NPTlRJRykgPyBibWEtPmxlbmd0aCA6IDE7CisKKwkvKgorCSAqIE9ubHkgd2FudCB0byBkbyB0aGUgYWxpZ25tZW50IGF0IHRoZSBlb2YgaWYgaXQgaXMgdXNlcmRhdGEgYW5kCisJICogYWxsb2NhdGlvbiBsZW5ndGggaXMgbGFyZ2VyIHRoYW4gYSBzdHJpcGUgdW5pdC4KKwkgKi8KKwlpZiAobXAtPm1fZGFsaWduICYmIGJtYS0+bGVuZ3RoID49IG1wLT5tX2RhbGlnbiAmJgorCSAgICAhKGZsYWdzICYgWEZTX0JNQVBJX01FVEFEQVRBKSAmJiB3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgeworCQllcnJvciA9IHhmc19ibWFwX2lzYWVvZihibWEsIHdoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IHhmc19ibWFwX2FsbG9jKGJtYSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoYm1hLT5mbGlzdC0+eGJmX2xvdykKKwkJYm1hLT5taW5sZWZ0ID0gMDsKKwlpZiAoYm1hLT5jdXIpCisJCWJtYS0+Y3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9ICpibWEtPmZpcnN0YmxvY2s7CisJaWYgKGJtYS0+Ymxrbm8gPT0gTlVMTEZTQkxPQ0spCisJCXJldHVybiAwOworCWlmICgoaWZwLT5pZl9mbGFncyAmIFhGU19JRkJST09UKSAmJiAhYm1hLT5jdXIpIHsKKwkJYm1hLT5jdXIgPSB4ZnNfYm1idF9pbml0X2N1cnNvcihtcCwgYm1hLT50cCwgYm1hLT5pcCwgd2hpY2hmb3JrKTsKKwkJYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gKmJtYS0+Zmlyc3RibG9jazsKKwkJYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5mbGlzdCA9IGJtYS0+Zmxpc3Q7CisJfQorCS8qCisJICogQnVtcCB0aGUgbnVtYmVyIG9mIGV4dGVudHMgd2UndmUgYWxsb2NhdGVkCisJICogaW4gdGhpcyBjYWxsLgorCSAqLworCWJtYS0+bmFsbG9jcysrOworCisJaWYgKGJtYS0+Y3VyKQorCQlibWEtPmN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzID0KKwkJCWJtYS0+d2FzZGVsID8gWEZTX0JUQ1VSX0JQUlZfV0FTREVMIDogMDsKKworCWJtYS0+Z290LmJyX3N0YXJ0b2ZmID0gYm1hLT5vZmZzZXQ7CisJYm1hLT5nb3QuYnJfc3RhcnRibG9jayA9IGJtYS0+Ymxrbm87CisJYm1hLT5nb3QuYnJfYmxvY2tjb3VudCA9IGJtYS0+bGVuZ3RoOworCWJtYS0+Z290LmJyX3N0YXRlID0gWEZTX0VYVF9OT1JNOworCisJLyoKKwkgKiBBIHdhc2RlbGF5IGV4dGVudCBoYXMgYmVlbiBpbml0aWFsaXplZCwgc28gc2hvdWxkbid0IGJlIGZsYWdnZWQKKwkgKiBhcyB1bndyaXR0ZW4uCisJICovCisJaWYgKCFibWEtPndhc2RlbCAmJiAoZmxhZ3MgJiBYRlNfQk1BUElfUFJFQUxMT0MpICYmCisJICAgIHhmc19zYl92ZXJzaW9uX2hhc2V4dGZsZ2JpdCgmbXAtPm1fc2IpKQorCQlibWEtPmdvdC5icl9zdGF0ZSA9IFhGU19FWFRfVU5XUklUVEVOOworCisJaWYgKGJtYS0+d2FzZGVsKQorCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfZGVsYXlfcmVhbChibWEpOworCWVsc2UKKwkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfcmVhbChibWEsIHdoaWNoZm9yayk7CisKKwlibWEtPmxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCS8qCisJICogVXBkYXRlIG91ciBleHRlbnQgcG9pbnRlciwgZ2l2ZW4gdGhhdCB4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwKKwkgKiBvciB4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfcmVhbCBtaWdodCBoYXZlIG1lcmdlZCBpdCBpbnRvIG9uZSBvZgorCSAqIHRoZSBuZWlnaGJvdXJpbmcgb25lcy4KKwkgKi8KKwl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCksICZibWEtPmdvdCk7CisKKwlBU1NFUlQoYm1hLT5nb3QuYnJfc3RhcnRvZmYgPD0gYm1hLT5vZmZzZXQpOworCUFTU0VSVChibWEtPmdvdC5icl9zdGFydG9mZiArIGJtYS0+Z290LmJyX2Jsb2NrY291bnQgPj0KKwkgICAgICAgYm1hLT5vZmZzZXQgKyBibWEtPmxlbmd0aCk7CisJQVNTRVJUKGJtYS0+Z290LmJyX3N0YXRlID09IFhGU19FWFRfTk9STSB8fAorCSAgICAgICBibWEtPmdvdC5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTik7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19ibWFwaV9jb252ZXJ0X3Vud3JpdHRlbigKKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEsCisJc3RydWN0IHhmc19ibWJ0X2lyZWMJKm12YWwsCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAorCWludAkJCWZsYWdzKQoreworCWludAkJCXdoaWNoZm9yayA9IChmbGFncyAmIFhGU19CTUFQSV9BVFRSRk9SSykgPworCQkJCQkJWEZTX0FUVFJfRk9SSyA6IFhGU19EQVRBX0ZPUks7CisJc3RydWN0IHhmc19pZm9yawkqaWZwID0gWEZTX0lGT1JLX1BUUihibWEtPmlwLCB3aGljaGZvcmspOworCWludAkJCXRtcF9sb2dmbGFncyA9IDA7CisJaW50CQkJZXJyb3I7CisKKwkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGRvIHVud3JpdHRlbi0+cmVhbCBjb252ZXJzaW9uICovCisJaWYgKG12YWwtPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOICYmCisJICAgIChmbGFncyAmIFhGU19CTUFQSV9QUkVBTExPQykpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgaWYgd2UgbmVlZCB0byBkbyByZWFsLT51bndyaXR0ZW4gY29udmVyc2lvbiAqLworCWlmIChtdmFsLT5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0gJiYKKwkgICAgKGZsYWdzICYgKFhGU19CTUFQSV9QUkVBTExPQyB8IFhGU19CTUFQSV9DT05WRVJUKSkgIT0KKwkJCShYRlNfQk1BUElfUFJFQUxMT0MgfCBYRlNfQk1BUElfQ09OVkVSVCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBNb2RpZnkgKGJ5IGFkZGluZykgdGhlIHN0YXRlIGZsYWcsIGlmIHdyaXRpbmcuCisJICovCisJQVNTRVJUKG12YWwtPmJyX2Jsb2NrY291bnQgPD0gbGVuKTsKKwlpZiAoKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZCUk9PVCkgJiYgIWJtYS0+Y3VyKSB7CisJCWJtYS0+Y3VyID0geGZzX2JtYnRfaW5pdF9jdXJzb3IoYm1hLT5pcC0+aV9tb3VudCwgYm1hLT50cCwKKwkJCQkJYm1hLT5pcCwgd2hpY2hmb3JrKTsKKwkJYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gKmJtYS0+Zmlyc3RibG9jazsKKwkJYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5mbGlzdCA9IGJtYS0+Zmxpc3Q7CisJfQorCW12YWwtPmJyX3N0YXRlID0gKG12YWwtPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKQorCQkJCT8gWEZTX0VYVF9OT1JNIDogWEZTX0VYVF9VTldSSVRURU47CisKKwllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfdW53cml0dGVuX3JlYWwoYm1hLT50cCwgYm1hLT5pcCwgJmJtYS0+aWR4LAorCQkJJmJtYS0+Y3VyLCBtdmFsLCBibWEtPmZpcnN0YmxvY2ssIGJtYS0+Zmxpc3QsCisJCQkmdG1wX2xvZ2ZsYWdzKTsKKwlibWEtPmxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCS8qCisJICogVXBkYXRlIG91ciBleHRlbnQgcG9pbnRlciwgZ2l2ZW4gdGhhdAorCSAqIHhmc19ibWFwX2FkZF9leHRlbnRfdW53cml0dGVuX3JlYWwgbWlnaHQgaGF2ZSBtZXJnZWQgaXQgaW50byBvbmUKKwkgKiBvZiB0aGUgbmVpZ2hib3VyaW5nIG9uZXMuCisJICovCisJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgYm1hLT5pZHgpLCAmYm1hLT5nb3QpOworCisJLyoKKwkgKiBXZSBtYXkgaGF2ZSBjb21iaW5lZCBwcmV2aW91c2x5IHVud3JpdHRlbiBzcGFjZSB3aXRoIHdyaXR0ZW4gc3BhY2UsCisJICogc28gZ2VuZXJhdGUgYW5vdGhlciByZXF1ZXN0LgorCSAqLworCWlmIChtdmFsLT5icl9ibG9ja2NvdW50IDwgbGVuKQorCQlyZXR1cm4gRUFHQUlOOworCXJldHVybiAwOworfQorCisvKgorICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLCBhbmQgYWxsb2NhdGUgYmxvY2tzIG9yIGNvbnZlcnQgdGhlCisgKiBleHRlbnQgc3RhdGUgaWYgbmVjZXNzYXJ5LiAgRGV0YWlscyBiZWhhdmlvdXIgaXMgY29udHJvbGxlZCBieSB0aGUgZmxhZ3MKKyAqIHBhcmFtZXRlci4gIE9ubHkgYWxsb2NhdGVzIGJsb2NrcyBmcm9tIGEgc2luZ2xlIGFsbG9jYXRpb24gZ3JvdXAsIHRvIGF2b2lkCisgKiBsb2NraW5nIHByb2JsZW1zLgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpbiAiZmlyc3RibG9jayIgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiBhIHRyYW5zYWN0aW9uCisgKiBtdXN0IGJlIHJlbWVtYmVyZWQgYW5kIHByZXNlbnRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIGluICJmaXJzdGJsb2NrIi4KKyAqIEFuIHVwcGVyIGJvdW5kIGZvciB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBhbGxvY2F0ZWQgaXMgc3VwcGxpZWQgdG8KKyAqIHRoZSBmaXJzdCBjYWxsIGluICJ0b3RhbCI7IGlmIG5vIGFsbG9jYXRpb24gZ3JvdXAgaGFzIHRoYXQgbWFueSBmcmVlCisgKiBibG9ja3MgdGhlbiB0aGUgY2FsbCB3aWxsIGZhaWwgKHJldHVybiBOVUxMRlNCTE9DSyBpbiAiZmlyc3RibG9jayIpLgorICovCitpbnQKK3hmc19ibWFwaV93cml0ZSgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19maWxlb2ZmX3QJCWJubywJCS8qIHN0YXJ0aW5nIGZpbGUgb2Zmcy4gbWFwcGVkICovCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAkJLyogbGVuZ3RoIHRvIG1hcCBpbiBmaWxlICovCisJaW50CQkJZmxhZ3MsCQkvKiBYRlNfQk1BUElfLi4uICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGFsbG9jYXRlZCBibG9jaworCQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCisJeGZzX2V4dGxlbl90CQl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbXZhbCwJCS8qIG91dHB1dDogbWFwIHZhbHVlcyAqLworCWludAkJCSpubWFwLAkJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KKwlzdHJ1Y3QgeGZzX2JtYXBfZnJlZQkqZmxpc3QpCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCit7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwlzdHJ1Y3QgeGZzX2lmb3JrCSppZnA7CisJc3RydWN0IHhmc19ibWFsbG9jYQlibWEgPSB7IDAgfTsJLyogYXJncyBmb3IgeGZzX2JtYXBfYWxsb2MgKi8KKwl4ZnNfZmlsZW9mZl90CQllbmQ7CQkvKiBlbmQgb2YgbWFwcGVkIGZpbGUgcmVnaW9uICovCisJaW50CQkJZW9mOwkJLyogYWZ0ZXIgdGhlIGVuZCBvZiBleHRlbnRzICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gKi8KKwlpbnQJCQluOwkJLyogY3VycmVudCBleHRlbnQgaW5kZXggKi8KKwl4ZnNfZmlsZW9mZl90CQlvYm5vOwkJLyogb2xkIGJsb2NrIG51bWJlciAob2Zmc2V0KSAqLworCWludAkJCXdoaWNoZm9yazsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwljaGFyCQkJaW5ob2xlOwkJLyogY3VycmVudCBsb2NhdGlvbiBpcyBob2xlIGluIGZpbGUgKi8KKwljaGFyCQkJd2FzZGVsYXk7CS8qIG9sZCBleHRlbnQgd2FzIGRlbGF5ZWQgKi8KKworI2lmZGVmIERFQlVHCisJeGZzX2ZpbGVvZmZfdAkJb3JpZ19ibm87CS8qIG9yaWdpbmFsIGJsb2NrIG51bWJlciB2YWx1ZSAqLworCWludAkJCW9yaWdfZmxhZ3M7CS8qIG9yaWdpbmFsIGZsYWdzIGFyZyB2YWx1ZSAqLworCXhmc19maWxibGtzX3QJCW9yaWdfbGVuOwkvKiBvcmlnaW5hbCB2YWx1ZSBvZiBsZW4gYXJnICovCisJc3RydWN0IHhmc19ibWJ0X2lyZWMJKm9yaWdfbXZhbDsJLyogb3JpZ2luYWwgdmFsdWUgb2YgbXZhbCAqLworCWludAkJCW9yaWdfbm1hcDsJLyogb3JpZ2luYWwgdmFsdWUgb2YgKm5tYXAgKi8KKworCW9yaWdfYm5vID0gYm5vOworCW9yaWdfbGVuID0gbGVuOworCW9yaWdfZmxhZ3MgPSBmbGFnczsKKwlvcmlnX212YWwgPSBtdmFsOworCW9yaWdfbm1hcCA9ICpubWFwOworI2VuZGlmCisKKwlBU1NFUlQoKm5tYXAgPj0gMSk7CisJQVNTRVJUKCpubWFwIDw9IFhGU19CTUFQX01BWF9OTUFQKTsKKwlBU1NFUlQoIShmbGFncyAmIFhGU19CTUFQSV9JR1NUQVRFKSk7CisJQVNTRVJUKHRwICE9IE5VTEwpOworCisJd2hpY2hmb3JrID0gKGZsYWdzICYgWEZTX0JNQVBJX0FUVFJGT1JLKSA/CisJCVhGU19BVFRSX0ZPUksgOiBYRlNfREFUQV9GT1JLOworCisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKAorCSAgICAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFICYmCisJICAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKSwKKwkgICAgIG1wLCBYRlNfRVJSVEFHX0JNQVBJRk9STUFULCBYRlNfUkFORE9NX0JNQVBJRk9STUFUKSkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBpX3dyaXRlIiwgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCUFTU0VSVChpZnAtPmlmX2V4dF9tYXggPT0KKwkgICAgICAgWEZTX0lGT1JLX1NJWkUoaXAsIHdoaWNoZm9yaykgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKKworCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHcpOworCisJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9sb2NhbF90b19leHRlbnRzKHRwLCBpcCwgZmlyc3RibG9jaywgdG90YWwsCisJCQkJCQkgICZibWEubG9nZmxhZ3MsIHdoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCX0KKworCWlmICgqZmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSykgeworCQlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkKKwkJCWJtYS5taW5sZWZ0ID0gYmUxNl90b19jcHUoaWZwLT5pZl9icm9vdC0+YmJfbGV2ZWwpICsgMTsKKwkJZWxzZQorCQkJYm1hLm1pbmxlZnQgPSAxOworCX0gZWxzZSB7CisJCWJtYS5taW5sZWZ0ID0gMDsKKwl9CisKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpIHsKKwkJZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCX0KKworCXhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmJtYS5pZHgsICZibWEuZ290LAorCQkJCSZibWEucHJldik7CisJbiA9IDA7CisJZW5kID0gYm5vICsgbGVuOworCW9ibm8gPSBibm87CisKKwlibWEudHAgPSB0cDsKKwlibWEuaXAgPSBpcDsKKwlibWEudG90YWwgPSB0b3RhbDsKKwlibWEudXNlcmRhdGEgPSAwOworCWJtYS5mbGlzdCA9IGZsaXN0OworCWJtYS5maXJzdGJsb2NrID0gZmlyc3RibG9jazsKKworCXdoaWxlIChibm8gPCBlbmQgJiYgbiA8ICpubWFwKSB7CisJCWluaG9sZSA9IGVvZiB8fCBibWEuZ290LmJyX3N0YXJ0b2ZmID4gYm5vOworCQl3YXNkZWxheSA9ICFpbmhvbGUgJiYgaXNudWxsc3RhcnRibG9jayhibWEuZ290LmJyX3N0YXJ0YmxvY2spOworCiAJCS8qCi0JCSAqIENoZWNrIGlmIHdyaXRpbmcgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnV0Ci0JCSAqIHVud3JpdHRlbiBleHRlbnRzLgorCQkgKiBGaXJzdCwgZGVhbCB3aXRoIHRoZSBob2xlIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHNwYWNlCisJCSAqIHRoYXQgd2UgZm91bmQsIGlmIGFueS4KIAkJICovCi0JCWlmICh3ciAmJgotCQkgICAgKChtdmFsLT5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTiAmJgotCQkgICAgICAoKGZsYWdzICYgKFhGU19CTUFQSV9QUkVBTExPQ3xYRlNfQk1BUElfREVMQVkpKSA9PSAwKSkgfHwKLQkJICAgICAobXZhbC0+YnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNICYmCi0JCSAgICAgICgoZmxhZ3MgJiAoWEZTX0JNQVBJX1BSRUFMTE9DfFhGU19CTUFQSV9DT05WRVJUKSkgPT0KLQkJCQkoWEZTX0JNQVBJX1BSRUFMTE9DfFhGU19CTUFQSV9DT05WRVJUKSkpKSkgewotCQkJLyoKLQkJCSAqIE1vZGlmeSAoYnkgYWRkaW5nKSB0aGUgc3RhdGUgZmxhZywgaWYgd3JpdGluZy4KLQkJCSAqLwotCQkJQVNTRVJUKG12YWwtPmJyX2Jsb2NrY291bnQgPD0gbGVuKTsKLQkJCWlmICgoaWZwLT5pZl9mbGFncyAmIFhGU19JRkJST09UKSAmJiAhY3VyKSB7Ci0JCQkJY3VyID0geGZzX2JtYnRfaW5pdF9jdXJzb3IobXAsCi0JCQkJCXRwLCBpcCwgd2hpY2hmb3JrKTsKLQkJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0KLQkJCQkJKmZpcnN0YmxvY2s7Ci0JCQkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKLQkJCX0KLQkJCW12YWwtPmJyX3N0YXRlID0gKG12YWwtPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKQotCQkJCQkJPyBYRlNfRVhUX05PUk0KLQkJCQkJCTogWEZTX0VYVF9VTldSSVRURU47Ci0JCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQodHAsIGlwLCAmbGFzdHgsICZjdXIsIG12YWwsCi0JCQkJZmlyc3RibG9jaywgZmxpc3QsICZ0bXBfbG9nZmxhZ3MsCi0JCQkJd2hpY2hmb3JrKTsKLQkJCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGluaG9sZSB8fCB3YXNkZWxheSkgeworCQkJYm1hLmVvZiA9IGVvZjsKKwkJCWJtYS5jb252ID0gISEoZmxhZ3MgJiBYRlNfQk1BUElfQ09OVkVSVCk7CisJCQlibWEud2FzZGVsID0gd2FzZGVsYXk7CisJCQlibWEubGVuZ3RoID0gbGVuOworCQkJYm1hLm9mZnNldCA9IGJubzsKKworCQkJZXJyb3IgPSB4ZnNfYm1hcGlfYWxsb2NhdGUoJmJtYSwgZmxhZ3MpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZXJyb3IwOwotCQkJZXAgPSB4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgbGFzdHgpOwotCQkJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKLQkJCXhmc19ibWJ0X2dldF9hbGwoZXAsICZnb3QpOwotCQkJLyoKLQkJCSAqIFdlIG1heSBoYXZlIGNvbWJpbmVkIHByZXZpb3VzbHkgdW53cml0dGVuCi0JCQkgKiBzcGFjZSB3aXRoIHdyaXR0ZW4gc3BhY2UsIHNvIGdlbmVyYXRlCi0JCQkgKiBhbm90aGVyIHJlcXVlc3QuCi0JCQkgKi8KLQkJCWlmIChtdmFsLT5icl9ibG9ja2NvdW50IDwgbGVuKQotCQkJCWNvbnRpbnVlOworCQkJaWYgKGJtYS5ibGtubyA9PSBOVUxMRlNCTE9DSykKKwkJCQlicmVhazsKIAkJfQogCi0JCUFTU0VSVCgoZmxhZ3MgJiBYRlNfQk1BUElfRU5USVJFKSB8fAotCQkgICAgICAgKChtdmFsLT5icl9zdGFydG9mZiArIG12YWwtPmJyX2Jsb2NrY291bnQpIDw9IGVuZCkpOwotCQlBU1NFUlQoKGZsYWdzICYgWEZTX0JNQVBJX0VOVElSRSkgfHwKLQkJICAgICAgIChtdmFsLT5icl9ibG9ja2NvdW50IDw9IGxlbikgfHwKLQkJICAgICAgIChtdmFsLT5icl9zdGFydG9mZiA8IG9ibm8pKTsKLQkJYm5vID0gbXZhbC0+YnJfc3RhcnRvZmYgKyBtdmFsLT5icl9ibG9ja2NvdW50OwotCQlsZW4gPSBlbmQgLSBibm87Ci0JCWlmIChuID4gMCAmJiBtdmFsLT5icl9zdGFydG9mZiA9PSBtdmFsWy0xXS5icl9zdGFydG9mZikgewotCQkJQVNTRVJUKG12YWwtPmJyX3N0YXJ0YmxvY2sgPT0gbXZhbFstMV0uYnJfc3RhcnRibG9jayk7Ci0JCQlBU1NFUlQobXZhbC0+YnJfYmxvY2tjb3VudCA+IG12YWxbLTFdLmJyX2Jsb2NrY291bnQpOwotCQkJQVNTRVJUKG12YWwtPmJyX3N0YXRlID09IG12YWxbLTFdLmJyX3N0YXRlKTsKLQkJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgPSBtdmFsLT5icl9ibG9ja2NvdW50OwotCQkJbXZhbFstMV0uYnJfc3RhdGUgPSBtdmFsLT5icl9zdGF0ZTsKLQkJfSBlbHNlIGlmIChuID4gMCAmJiBtdmFsLT5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyAmJgotCQkJICAgbXZhbFstMV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0sgJiYKLQkJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0sgJiYKLQkJCSAgIG12YWwtPmJyX3N0YXJ0YmxvY2sgPT0KLQkJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgKyBtdmFsWy0xXS5icl9ibG9ja2NvdW50ICYmCi0JCQkgICAoKGZsYWdzICYgWEZTX0JNQVBJX0lHU1RBVEUpIHx8Ci0JCQkJbXZhbFstMV0uYnJfc3RhdGUgPT0gbXZhbC0+YnJfc3RhdGUpKSB7Ci0JCQlBU1NFUlQobXZhbC0+YnJfc3RhcnRvZmYgPT0KLQkJCSAgICAgICBtdmFsWy0xXS5icl9zdGFydG9mZiArIG12YWxbLTFdLmJyX2Jsb2NrY291bnQpOwotCQkJbXZhbFstMV0uYnJfYmxvY2tjb3VudCArPSBtdmFsLT5icl9ibG9ja2NvdW50OwotCQl9IGVsc2UgaWYgKG4gPiAwICYmCi0JCQkgICBtdmFsLT5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSyAmJgotCQkJICAgbXZhbFstMV0uYnJfc3RhcnRibG9jayA9PSBERUxBWVNUQVJUQkxPQ0sgJiYKLQkJCSAgIG12YWwtPmJyX3N0YXJ0b2ZmID09Ci0JCQkgICBtdmFsWy0xXS5icl9zdGFydG9mZiArIG12YWxbLTFdLmJyX2Jsb2NrY291bnQpIHsKLQkJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgKz0gbXZhbC0+YnJfYmxvY2tjb3VudDsKLQkJCW12YWxbLTFdLmJyX3N0YXRlID0gbXZhbC0+YnJfc3RhdGU7Ci0JCX0gZWxzZSBpZiAoISgobiA9PSAwKSAmJgotCQkJICAgICAoKG12YWwtPmJyX3N0YXJ0b2ZmICsgbXZhbC0+YnJfYmxvY2tjb3VudCkgPD0KLQkJCSAgICAgIG9ibm8pKSkgewotCQkJbXZhbCsrOwotCQkJbisrOwotCQl9CisJCS8qIERlYWwgd2l0aCB0aGUgYWxsb2NhdGVkIHNwYWNlIHdlIGZvdW5kLiAgKi8KKwkJeGZzX2JtYXBpX3RyaW1fbWFwKG12YWwsICZibWEuZ290LCAmYm5vLCBsZW4sIG9ibm8sCisJCQkJCQkJZW5kLCBuLCBmbGFncyk7CisKKwkJLyogRXhlY3V0ZSB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5ICovCisJCWVycm9yID0geGZzX2JtYXBpX2NvbnZlcnRfdW53cml0dGVuKCZibWEsIG12YWwsIGxlbiwgZmxhZ3MpOworCQlpZiAoZXJyb3IgPT0gRUFHQUlOKQorCQkJY29udGludWU7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCisJCS8qIHVwZGF0ZSB0aGUgZXh0ZW50IG1hcCB0byByZXR1cm4gKi8KKwkJeGZzX2JtYXBpX3VwZGF0ZV9tYXAoJm12YWwsICZibm8sICZsZW4sIG9ibm8sIGVuZCwgJm4sIGZsYWdzKTsKKwogCQkvKgogCQkgKiBJZiB3ZSdyZSBkb25lLCBzdG9wIG5vdy4gIFN0b3Agd2hlbiB3ZSd2ZSBhbGxvY2F0ZWQKIAkJICogWEZTX0JNQVBfTUFYX05NQVAgZXh0ZW50cyBubyBtYXR0ZXIgd2hhdC4gIE90aGVyd2lzZQogCQkgKiB0aGUgdHJhbnNhY3Rpb24gbWF5IGdldCB0b28gYmlnLgogCQkgKi8KLQkJaWYgKGJubyA+PSBlbmQgfHwgbiA+PSAqbm1hcCB8fCBuYWxsb2NzID49ICpubWFwKQorCQlpZiAoYm5vID49IGVuZCB8fCBuID49ICpubWFwIHx8IGJtYS5uYWxsb2NzID49ICpubWFwKQogCQkJYnJlYWs7Ci0JCS8qCi0JCSAqIEVsc2UgZ28gb24gdG8gdGhlIG5leHQgcmVjb3JkLgotCQkgKi8KLQkJcHJldiA9IGdvdDsKLQkJaWYgKCsrbGFzdHggPCBuZXh0ZW50cykgewotCQkJZXAgPSB4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgbGFzdHgpOwotCQkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJmdvdCk7Ci0JCX0gZWxzZSB7CisKKwkJLyogRWxzZSBnbyBvbiB0byB0aGUgbmV4dCByZWNvcmQuICovCisJCWJtYS5wcmV2ID0gYm1hLmdvdDsKKwkJaWYgKCsrYm1hLmlkeCA8IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpKSB7CisJCQl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEuaWR4KSwKKwkJCQkJICZibWEuZ290KTsKKwkJfSBlbHNlCiAJCQllb2YgPSAxOwotCQl9CiAJfQogCSpubWFwID0gbjsKKwogCS8qCiAJICogVHJhbnNmb3JtIGZyb20gYnRyZWUgdG8gZXh0ZW50cywgZ2l2ZSBpdCBjdXIuCiAJICovCi0JaWYgKHRwICYmIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSAmJgogCSAgICBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPD0gaWZwLT5pZl9leHRfbWF4KSB7Ci0JCUFTU0VSVCh3ciAmJiBjdXIpOwotCQllcnJvciA9IHhmc19ibWFwX2J0cmVlX3RvX2V4dGVudHModHAsIGlwLCBjdXIsCisJCWludAkJdG1wX2xvZ2ZsYWdzID0gMDsKKworCQlBU1NFUlQoYm1hLmN1cik7CisJCWVycm9yID0geGZzX2JtYXBfYnRyZWVfdG9fZXh0ZW50cyh0cCwgaXAsIGJtYS5jdXIsCiAJCQkmdG1wX2xvZ2ZsYWdzLCB3aGljaGZvcmspOwotCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CisJCWJtYS5sb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwogCX0KQEAgLTQ4NTUsMzQgKzQ5ODQsMzMgQEAKIAkgKiBMb2cgZXZlcnl0aGluZy4gIERvIHRoaXMgYWZ0ZXIgY29udmVyc2lvbiwgdGhlcmUncyBubyBwb2ludCBpbgogCSAqIGxvZ2dpbmcgdGhlIGV4dGVudCByZWNvcmRzIGlmIHdlJ3ZlIGNvbnZlcnRlZCB0byBidHJlZSBmb3JtYXQuCiAJICovCi0JaWYgKChsb2dmbGFncyAmIHhmc19pbG9nX2ZleHQod2hpY2hmb3JrKSkgJiYKKwlpZiAoKGJtYS5sb2dmbGFncyAmIHhmc19pbG9nX2ZleHQod2hpY2hmb3JrKSkgJiYKIAkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKQotCQlsb2dmbGFncyAmPSB+eGZzX2lsb2dfZmV4dCh3aGljaGZvcmspOwotCWVsc2UgaWYgKChsb2dmbGFncyAmIHhmc19pbG9nX2Zicm9vdCh3aGljaGZvcmspKSAmJgorCQlibWEubG9nZmxhZ3MgJj0gfnhmc19pbG9nX2ZleHQod2hpY2hmb3JrKTsKKwllbHNlIGlmICgoYm1hLmxvZ2ZsYWdzICYgeGZzX2lsb2dfZmJyb290KHdoaWNoZm9yaykpICYmCiAJCSBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKQotCQlsb2dmbGFncyAmPSB+eGZzX2lsb2dfZmJyb290KHdoaWNoZm9yayk7CisJCWJtYS5sb2dmbGFncyAmPSB+eGZzX2lsb2dfZmJyb290KHdoaWNoZm9yayk7CiAJLyoKIAkgKiBMb2cgd2hhdGV2ZXIgdGhlIGZsYWdzIHNheSwgZXZlbiBpZiBlcnJvci4gIE90aGVyd2lzZSB3ZSBtaWdodCBtaXNzCiAJICogZGV0ZWN0aW5nIGEgY2FzZSB3aGVyZSB0aGUgZGF0YSBpcyBjaGFuZ2VkLCB0aGVyZSdzIGFuIGVycm9yLAogCSAqIGFuZCBpdCdzIG5vdCBsb2dnZWQgc28gd2UgZG9uJ3Qgc2h1dGRvd24gd2hlbiB3ZSBzaG91bGQuCiAJICovCi0JaWYgKGxvZ2ZsYWdzKSB7Ci0JCUFTU0VSVCh0cCAmJiB3cik7Ci0JCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBsb2dmbGFncyk7Ci0JfQotCWlmIChjdXIpIHsKKwlpZiAoYm1hLmxvZ2ZsYWdzKQorCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgYm1hLmxvZ2ZsYWdzKTsKKworCWlmIChibWEuY3VyKSB7CiAJCWlmICghZXJyb3IpIHsKIAkJCUFTU0VSVCgqZmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSyB8fAogCQkJICAgICAgIFhGU19GU0JfVE9fQUdOTyhtcCwgKmZpcnN0YmxvY2spID09CiAJCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLAotCQkJCSAgICAgICBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrKSB8fAorCQkJCSAgICAgICBibWEuY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jaykgfHwKIAkJCSAgICAgICAoZmxpc3QtPnhiZl9sb3cgJiYKIAkJCQlYRlNfRlNCX1RPX0FHTk8obXAsICpmaXJzdGJsb2NrKSA8CiAJCQkJWEZTX0ZTQl9UT19BR05PKG1wLAotCQkJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrKSkpOwotCQkJKmZpcnN0YmxvY2sgPSBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrOworCQkJCQlibWEuY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jaykpKTsKKwkJCSpmaXJzdGJsb2NrID0gYm1hLmN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CiAJCX0KLQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLAorCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibWEuY3VyLAogCQkJZXJyb3IgPyBYRlNfQlRSRUVfRVJST1IgOiBYRlNfQlRSRUVfTk9FUlJPUik7CiAJfQogCWlmICghZXJyb3IpCkBAIC00ODkyLDU4ICs1MDIwLDYgQEAKIH0KIAogLyoKLSAqIE1hcCBmaWxlIGJsb2NrcyB0byBmaWxlc3lzdGVtIGJsb2Nrcywgc2ltcGxlIHZlcnNpb24uCi0gKiBPbmUgYmxvY2sgKGV4dGVudCkgb25seSwgcmVhZC1vbmx5LgotICogRm9yIGZsYWdzLCBvbmx5IHRoZSBYRlNfQk1BUElfQVRUUkZPUksgZmxhZyBpcyBleGFtaW5lZC4KLSAqIEZvciB0aGUgb3RoZXIgZmxhZyB2YWx1ZXMsIHRoZSBlZmZlY3QgaXMgYXMgaWYgWEZTX0JNQVBJX01FVEFEQVRBCi0gKiB3YXMgc2V0IGFuZCBhbGwgdGhlIG90aGVycyB3ZXJlIGNsZWFyLgotICovCi1pbnQJCQkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBpX3NpbmdsZSgKLQl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0JeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JaW50CQl3aGljaGZvcmssCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0JeGZzX2ZzYmxvY2tfdAkqZnNiLAkJLyogb3V0cHV0OiBtYXBwZWQgYmxvY2sgKi8KLQl4ZnNfZmlsZW9mZl90CWJubykJCS8qIHN0YXJ0aW5nIGZpbGUgb2Zmcy4gbWFwcGVkICovCi17Ci0JaW50CQllb2Y7CQkvKiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiBleHRlbnRzICovCi0JaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiAqLwotCXhmc19ibWJ0X2lyZWNfdAlnb3Q7CQkvKiBjdXJyZW50IGZpbGUgZXh0ZW50IHJlY29yZCAqLwotCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KLQl4ZnNfZXh0bnVtX3QJbGFzdHg7CQkvKiBsYXN0IHVzZWZ1bCBleHRlbnQgbnVtYmVyICovCi0JeGZzX2JtYnRfaXJlY190CXByZXY7CQkvKiBwcmV2aW91cyBmaWxlIGV4dGVudCByZWNvcmQgKi8KLQotCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7Ci0JaWYgKHVubGlrZWx5KAotCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFICYmCi0JICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykpIHsKLQkgICAgICAgWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBpX3NpbmdsZSIsIFhGU19FUlJMRVZFTF9MT1csCi0JCQkJaXAtPmlfbW91bnQpOwotCSAgICAgICByZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7Ci0JfQotCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKLQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwotCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHIpOwotCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgotCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yaykpKQotCQlyZXR1cm4gZXJyb3I7Ci0JKHZvaWQpeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoaXAsIGJubywgd2hpY2hmb3JrLCAmZW9mLCAmbGFzdHgsICZnb3QsCi0JCSZwcmV2KTsKLQkvKgotCSAqIFJlYWRpbmcgcGFzdCBlb2YsIGFjdCBhcyB0aG91Z2ggdGhlcmUncyBhIGhvbGUKLQkgKiB1cCB0byBlbmQuCi0JICovCi0JaWYgKGVvZiB8fCBnb3QuYnJfc3RhcnRvZmYgPiBibm8pIHsKLQkJKmZzYiA9IE5VTExGU0JMT0NLOwotCQlyZXR1cm4gMDsKLQl9Ci0JQVNTRVJUKCFpc251bGxzdGFydGJsb2NrKGdvdC5icl9zdGFydGJsb2NrKSk7Ci0JQVNTRVJUKGJubyA8IGdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50KTsKLQkqZnNiID0gZ290LmJyX3N0YXJ0YmxvY2sgKyAoYm5vIC0gZ290LmJyX3N0YXJ0b2ZmKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIFVubWFwIChyZW1vdmUpIGJsb2NrcyBmcm9tIGEgZmlsZS4KICAqIElmIG5leHRzIGlzIG5vbnplcm8gdGhlbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgdG8gcmVtb3ZlIGlzIGxpbWl0ZWQgdG8KICAqIHRoYXQgdmFsdWUuICBJZiBub3QgYWxsIGV4dGVudHMgaW4gdGhlIGJsb2NrIHJhbmdlIGNhbiBiZSByZW1vdmVkIHRoZW4KQEAgLTUxMTQsOSArNTE5MCw5IEBACiAJCQkJZGVsLmJyX2Jsb2NrY291bnQgPSBtb2Q7CiAJCQl9CiAJCQlkZWwuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKLQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudCh0cCwgaXAsICZsYXN0eCwgJmN1ciwgJmRlbCwKLQkJCQlmaXJzdGJsb2NrLCBmbGlzdCwgJmxvZ2ZsYWdzLAotCQkJCVhGU19EQVRBX0ZPUkspOworCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsKHRwLCBpcCwKKwkJCQkJJmxhc3R4LCAmY3VyLCAmZGVsLCBmaXJzdGJsb2NrLCBmbGlzdCwKKwkJCQkJJmxvZ2ZsYWdzKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGVycm9yMDsKIAkJCWdvdG8gbm9kZWxldGU7CkBAIC01MTcyLDE4ICs1MjQ4LDE4IEBACiAJCQkJfQogCQkJCXByZXYuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKIAkJCQlsYXN0eC0tOwotCQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudCh0cCwgaXAsICZsYXN0eCwKLQkJCQkJCSZjdXIsICZwcmV2LCBmaXJzdGJsb2NrLCBmbGlzdCwKLQkJCQkJCSZsb2dmbGFncywgWEZTX0RBVEFfRk9SSyk7CisJCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsKHRwLAorCQkJCQkJaXAsICZsYXN0eCwgJmN1ciwgJnByZXYsCisJCQkJCQlmaXJzdGJsb2NrLCBmbGlzdCwgJmxvZ2ZsYWdzKTsKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gZXJyb3IwOwogCQkJCWdvdG8gbm9kZWxldGU7CiAJCQl9IGVsc2UgewogCQkJCUFTU0VSVChkZWwuYnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNKTsKIAkJCQlkZWwuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKLQkJCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQodHAsIGlwLCAmbGFzdHgsCi0JCQkJCQkmY3VyLCAmZGVsLCBmaXJzdGJsb2NrLCBmbGlzdCwKLQkJCQkJCSZsb2dmbGFncywgWEZTX0RBVEFfRk9SSyk7CisJCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsKHRwLAorCQkJCQkJaXAsICZsYXN0eCwgJmN1ciwgJmRlbCwKKwkJCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmbG9nZmxhZ3MpOwogCQkJCWlmIChlcnJvcikKIAkJCQkJZ290byBlcnJvcjA7CiAJCQkJZ290byBub2RlbGV0ZTsKQEAgLTU1MDUsMTAgKzU1ODEsOSBAQAogCiAJZG8gewogCQlubWFwID0gKG5leGxlZnQgPiBzdWJuZXgpID8gc3VibmV4IDogbmV4bGVmdDsKLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIFhGU19CQl9UT19GU0JUKG1wLCBibXYtPmJtdl9vZmZzZXQpLAotCQkJCSAgWEZTX0JCX1RPX0ZTQihtcCwgYm12LT5ibXZfbGVuZ3RoKSwKLQkJCQkgIGJtYXBpX2ZsYWdzLCBOVUxMLCAwLCBtYXAsICZubWFwLAotCQkJCSAgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIFhGU19CQl9UT19GU0JUKG1wLCBibXYtPmJtdl9vZmZzZXQpLAorCQkJCSAgICAgICBYRlNfQkJfVE9fRlNCKG1wLCBibXYtPmJtdl9sZW5ndGgpLAorCQkJCSAgICAgICBtYXAsICZubWFwLCBibWFwaV9mbGFncyk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2ZyZWVfbWFwOwogCQlBU1NFUlQobm1hcCA8PSBzdWJuZXgpOwpAQCAtNTU4Miw4OSArNTY1Nyw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKgotICogQ2hlY2sgdGhlIGxhc3QgaW5vZGUgZXh0ZW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgYWxsb2NhdGlvbiB3aWxsIHJlc3VsdAotICogaW4gYmxvY2tzIGJlaW5nIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBXaGVuIHdlIGFsbG9jYXRlIG5ldyBkYXRhCi0gKiBibG9ja3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB3aGljaCBkbyBub3Qgc3RhcnQgYXQgdGhlIHByZXZpb3VzIGRhdGEgYmxvY2ssCi0gKiB3ZSB3aWxsIHRyeSB0byBhbGlnbiB0aGUgbmV3IGJsb2NrcyBhdCBzdHJpcGUgdW5pdCBib3VuZGFyaWVzLgotICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfYm1hcF9pc2Flb2YoCi0JeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KLQl4ZnNfZmlsZW9mZl90ICAgb2ZmLAkJLyogZmlsZSBvZmZzZXQgaW4gZnNibG9ja3MgKi8KLQlpbnQgICAgICAgICAgICAgd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHJpYnV0ZSBmb3JrICovCi0JY2hhcgkJKmFlb2YpCQkvKiByZXR1cm4gdmFsdWUgKi8KLXsKLQlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLwotCXhmc19ibWJ0X3JlY19ob3N0X3QgKmxhc3RyZWM7CS8qIGV4dGVudCByZWNvcmQgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAluZXh0ZW50czsJLyogbnVtYmVyIG9mIGZpbGUgZXh0ZW50cyAqLwotCXhmc19ibWJ0X2lyZWNfdAlzOwkJLyogZXhwYW5kZWQgZXh0ZW50IHJlY29yZCAqLwotCi0JQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKLQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwotCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgotCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgd2hpY2hmb3JrKSkpCi0JCXJldHVybiBlcnJvcjsKLQluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwotCWlmIChuZXh0ZW50cyA9PSAwKSB7Ci0JCSphZW9mID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogR28gdG8gdGhlIGxhc3QgZXh0ZW50Ci0JICovCi0JbGFzdHJlYyA9IHhmc19pZXh0X2dldF9leHQoaWZwLCBuZXh0ZW50cyAtIDEpOwotCXhmc19ibWJ0X2dldF9hbGwobGFzdHJlYywgJnMpOwotCS8qCi0JICogQ2hlY2sgd2UgYXJlIGFsbG9jYXRpbmcgaW4gdGhlIGxhc3QgZXh0ZW50IChmb3IgZGVsYXllZCBhbGxvY2F0aW9ucykKLQkgKiBvciBwYXN0IHRoZSBsYXN0IGV4dGVudCBmb3Igbm9uLWRlbGF5ZWQgYWxsb2NhdGlvbnMuCi0JICovCi0JKmFlb2YgPSAob2ZmID49IHMuYnJfc3RhcnRvZmYgJiYKLQkJIG9mZiA8IHMuYnJfc3RhcnRvZmYgKyBzLmJyX2Jsb2NrY291bnQgJiYKLQkJIGlzbnVsbHN0YXJ0YmxvY2socy5icl9zdGFydGJsb2NrKSkgfHwKLQkJb2ZmID49IHMuYnJfc3RhcnRvZmYgKyBzLmJyX2Jsb2NrY291bnQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDaGVjayBpZiB0aGUgZW5kb2ZmIGlzIG91dHNpZGUgdGhlIGxhc3QgZXh0ZW50LiBJZiBzbyB0aGUgY2FsbGVyIHdpbGwgZ3JvdwotICogdGhlIGFsbG9jYXRpb24gdG8gYSBzdHJpcGUgdW5pdCBib3VuZGFyeS4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBfZW9mKAotCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2ZpbGVvZmZfdAllbmRvZmYsCQkvKiBmaWxlIG9mZnNldCBpbiBmc2Jsb2NrcyAqLwotCWludAkJd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHJpYnV0ZSBmb3JrICovCi0JaW50CQkqZW9mKQkJLyogcmVzdWx0IHZhbHVlICovCi17Ci0JeGZzX2ZzYmxvY2tfdAlibG9ja2NvdW50OwkvKiBleHRlbnQgYmxvY2sgY291bnQgKi8KLQlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLwotCXhmc19ibWJ0X3JlY19ob3N0X3QgKmxhc3RyZWM7CS8qIGV4dGVudCByZWNvcmQgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAluZXh0ZW50czsJLyogbnVtYmVyIG9mIGZpbGUgZXh0ZW50cyAqLwotCXhmc19maWxlb2ZmX3QJc3RhcnRvZmY7CS8qIGV4dGVudCBzdGFydGluZyBmaWxlIG9mZnNldCAqLwotCi0JQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKLQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwotCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgotCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgd2hpY2hmb3JrKSkpCi0JCXJldHVybiBlcnJvcjsKLQluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwotCWlmIChuZXh0ZW50cyA9PSAwKSB7Ci0JCSplb2YgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBHbyB0byB0aGUgbGFzdCBleHRlbnQKLQkgKi8KLQlsYXN0cmVjID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIG5leHRlbnRzIC0gMSk7Ci0Jc3RhcnRvZmYgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYobGFzdHJlYyk7Ci0JYmxvY2tjb3VudCA9IHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KGxhc3RyZWMpOwotCSplb2YgPSBlbmRvZmYgPj0gc3RhcnRvZmYgKyBibG9ja2NvdW50OwotCXJldHVybiAwOwotfQotCiAjaWZkZWYgREVCVUcKIFNUQVRJQyBzdHJ1Y3QgeGZzX2J1ZiAqCiB4ZnNfYm1hcF9nZXRfYnAoCkBAIC02MDk5LDkgKzYwOTEsOCBAQAogCQkgKiB0cnlpbmcgdG8gcmVtb3ZlIGEgcmVhbCBleHRlbnQgKHdoaWNoIHJlcXVpcmVzIGEKIAkJICogdHJhbnNhY3Rpb24pIG9yIGEgaG9sZSwgd2hpY2ggaXMgcHJvYmFibHkgYSBiYWQgaWRlYS4uLgogCQkgKi8KLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIHN0YXJ0X2ZzYiwgMSwKLQkJCQlYRlNfQk1BUElfRU5USVJFLCAgTlVMTCwgMCwgJmltYXAsCi0JCQkJJm5pbWFwcywgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIHN0YXJ0X2ZzYiwgMSwgJmltYXAsICZuaW1hcHMsCisJCQkJICAgICAgIFhGU19CTUFQSV9FTlRJUkUpOwogCiAJCWlmIChlcnJvcikgewogCQkJLyogc29tZXRoaW5nIHNjcmV3ZWQsIGp1c3QgYmFpbCAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmggYi9mcy94ZnMveGZzX2JtYXAuaAppbmRleCBjNjIyMzRiLi44OWVlNjcyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuaAorKysgYi9mcy94ZnMveGZzX2JtYXAuaApAQCAtNjIsMjcgKzYyLDIzIEBACiAjZGVmaW5lCVhGU19CTUFQX01BWF9OTUFQCTQKIAogLyoKLSAqIEZsYWdzIGZvciB4ZnNfYm1hcGkKKyAqIEZsYWdzIGZvciB4ZnNfYm1hcGlfKgogICovCi0jZGVmaW5lCVhGU19CTUFQSV9XUklURQkJMHgwMDEJLyogd3JpdGUgb3BlcmF0aW9uOiBhbGxvY2F0ZSBzcGFjZSAqLwotI2RlZmluZSBYRlNfQk1BUElfREVMQVkJCTB4MDAyCS8qIGRlbGF5ZWQgd3JpdGUgb3BlcmF0aW9uICovCi0jZGVmaW5lIFhGU19CTUFQSV9FTlRJUkUJMHgwMDQJLyogcmV0dXJuIGVudGlyZSBleHRlbnQsIG5vdCB0cmltbWVkICovCi0jZGVmaW5lIFhGU19CTUFQSV9NRVRBREFUQQkweDAwOAkvKiBtYXBwaW5nIG1ldGFkYXRhIG5vdCB1c2VyIGRhdGEgKi8KLSNkZWZpbmUgWEZTX0JNQVBJX0FUVFJGT1JLCTB4MDEwCS8qIHVzZSBhdHRyaWJ1dGUgZm9yayBub3QgZGF0YSAqLwotI2RlZmluZQlYRlNfQk1BUElfUFJFQUxMT0MJMHgwNDAJLyogcHJlYWxsb2NhdGlvbiBvcDogdW53cml0dGVuIHNwYWNlICovCi0jZGVmaW5lCVhGU19CTUFQSV9JR1NUQVRFCTB4MDgwCS8qIElnbm9yZSBzdGF0ZSAtICovCisjZGVmaW5lIFhGU19CTUFQSV9FTlRJUkUJMHgwMDEJLyogcmV0dXJuIGVudGlyZSBleHRlbnQsIG5vdCB0cmltbWVkICovCisjZGVmaW5lIFhGU19CTUFQSV9NRVRBREFUQQkweDAwMgkvKiBtYXBwaW5nIG1ldGFkYXRhIG5vdCB1c2VyIGRhdGEgKi8KKyNkZWZpbmUgWEZTX0JNQVBJX0FUVFJGT1JLCTB4MDA0CS8qIHVzZSBhdHRyaWJ1dGUgZm9yayBub3QgZGF0YSAqLworI2RlZmluZSBYRlNfQk1BUElfUFJFQUxMT0MJMHgwMDgJLyogcHJlYWxsb2NhdGlvbiBvcDogdW53cml0dGVuIHNwYWNlICovCisjZGVmaW5lIFhGU19CTUFQSV9JR1NUQVRFCTB4MDEwCS8qIElnbm9yZSBzdGF0ZSAtICovCiAJCQkJCS8qIGNvbWJpbmUgY29udGlnLiBzcGFjZSAqLwotI2RlZmluZQlYRlNfQk1BUElfQ09OVElHCTB4MTAwCS8qIG11c3QgYWxsb2NhdGUgb25seSBvbmUgZXh0ZW50ICovCisjZGVmaW5lIFhGU19CTUFQSV9DT05USUcJMHgwMjAJLyogbXVzdCBhbGxvY2F0ZSBvbmx5IG9uZSBleHRlbnQgKi8KIC8qCiAgKiB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gLSB0aGlzIG5lZWRzIHdyaXRlIGNhY2hlIGZsdXNoaW5nIGFuZCBubyBhZGRpdGlvbmFsCiAgKiBhbGxvY2F0aW9uIGFsaWdubWVudHMuIFdoZW4gc3BlY2lmaWVkIHdpdGggWEZTX0JNQVBJX1BSRUFMTE9DIGl0IGNvbnZlcnRzCiAgKiBmcm9tIHdyaXR0ZW4gdG8gdW53cml0dGVuLCBvdGhlcndpc2UgY29udmVydCBmcm9tIHVud3JpdHRlbiB0byB3cml0dGVuLgogICovCi0jZGVmaW5lIFhGU19CTUFQSV9DT05WRVJUCTB4MjAwCisjZGVmaW5lIFhGU19CTUFQSV9DT05WRVJUCTB4MDQwCiAKICNkZWZpbmUgWEZTX0JNQVBJX0ZMQUdTIFwKLQl7IFhGU19CTUFQSV9XUklURSwJIldSSVRFIiB9LCBcCi0JeyBYRlNfQk1BUElfREVMQVksCSJERUxBWSIgfSwgXAogCXsgWEZTX0JNQVBJX0VOVElSRSwJIkVOVElSRSIgfSwgXAogCXsgWEZTX0JNQVBJX01FVEFEQVRBLAkiTUVUQURBVEEiIH0sIFwKIAl7IFhGU19CTUFQSV9BVFRSRk9SSywJIkFUVFJGT1JLIiB9LCBcCkBAIC0xMTMsMjEgKzEwOSwyOCBAQAogICogQXJndW1lbnQgc3RydWN0dXJlIGZvciB4ZnNfYm1hcF9hbGxvYy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgeGZzX2JtYWxsb2NhIHsKLQl4ZnNfZnNibG9ja190CQlmaXJzdGJsb2NrOyAvKiBpL28gZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCi0JeGZzX2ZzYmxvY2tfdAkJcnZhbDsJLyogc3RhcnRpbmcgYmxvY2sgb2YgbmV3IGV4dGVudCAqLwotCXhmc19maWxlb2ZmX3QJCW9mZjsJLyogb2Zmc2V0IGluIGZpbGUgZmlsbGluZyBpbiAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdGJsb2NrOyAvKiBpL28gZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCisJc3RydWN0IHhmc19ibWFwX2ZyZWUJKmZsaXN0OwkvKiBibWFwIGZyZWVsaXN0ICovCiAJc3RydWN0IHhmc190cmFucwkqdHA7CS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KIAlzdHJ1Y3QgeGZzX2lub2RlCSppcDsJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqcHJldnA7CS8qIGV4dGVudCBiZWZvcmUgdGhlIG5ldyBvbmUgKi8KLQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqZ290cDsJLyogZXh0ZW50IGFmdGVyLCBvciBkZWxheWVkICovCi0JeGZzX2V4dGxlbl90CQlhbGVuOwkvKiBpL28gbGVuZ3RoIGFza2VkL2FsbG9jYXRlZCAqLworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXByZXY7CS8qIGV4dGVudCBiZWZvcmUgdGhlIG5ldyBvbmUgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwlnb3Q7CS8qIGV4dGVudCBhZnRlciwgb3IgZGVsYXllZCAqLworCisJeGZzX2ZpbGVvZmZfdAkJb2Zmc2V0OwkvKiBvZmZzZXQgaW4gZmlsZSBmaWxsaW5nIGluICovCisJeGZzX2V4dGxlbl90CQlsZW5ndGg7CS8qIGkvbyBsZW5ndGggYXNrZWQvYWxsb2NhdGVkICovCisJeGZzX2ZzYmxvY2tfdAkJYmxrbm87CS8qIHN0YXJ0aW5nIGJsb2NrIG9mIG5ldyBleHRlbnQgKi8KKworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXI7CS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19leHRudW1fdAkJaWR4OwkvKiBjdXJyZW50IGV4dGVudCBpbmRleCAqLworCWludAkJCW5hbGxvY3M7LyogbnVtYmVyIG9mIGV4dGVudHMgYWxsb2MnZCAqLworCWludAkJCWxvZ2ZsYWdzOy8qIGZsYWdzIGZvciB0cmFuc2FjdGlvbiBsb2dnaW5nICovCisKIAl4ZnNfZXh0bGVuX3QJCXRvdGFsOwkvKiB0b3RhbCBibG9ja3MgbmVlZGVkIGZvciB4YWN0aW9uICovCiAJeGZzX2V4dGxlbl90CQltaW5sZW47CS8qIG1pbmltdW0gYWxsb2NhdGlvbiBzaXplIChibG9ja3MpICovCiAJeGZzX2V4dGxlbl90CQltaW5sZWZ0OyAvKiBhbW91bnQgbXVzdCBiZSBsZWZ0IGFmdGVyIGFsbG9jICovCiAJY2hhcgkJCWVvZjsJLyogc2V0IGlmIGFsbG9jYXRpbmcgcGFzdCBsYXN0IGV4dGVudCAqLwogCWNoYXIJCQl3YXNkZWw7CS8qIHJlcGxhY2luZyBhIGRlbGF5ZWQgYWxsb2NhdGlvbiAqLwogCWNoYXIJCQl1c2VyZGF0YTsvKiBzZXQgaWYgaXMgdXNlciBkYXRhICovCi0JY2hhcgkJCWxvdzsJLyogbG93IG9uIHNwYWNlLCB1c2luZyBzZXEnbCBhZ3MgKi8KIAljaGFyCQkJYWVvZjsJLyogYWxsb2NhdGVkIHNwYWNlIGF0IGVvZiAqLwogCWNoYXIJCQljb252OwkvKiBvdmVyd3JpdGluZyB1bndyaXR0ZW4gZXh0ZW50cyAqLwogfSB4ZnNfYm1hbGxvY2FfdDsKQEAgLTE1MiwyNTEgKzE1NSw2MiBAQAogCXsgQk1BUF9SSUdIVF9GSUxMSU5HLAkiUkYiIH0sIFwKIAl7IEJNQVBfQVRUUkZPUkssCSJBVFRSIiB9CiAKLS8qCi0gKiBBZGQgYm1hcCB0cmFjZSBpbnNlcnQgZW50cmllcyBmb3IgYWxsIHRoZSBjb250ZW50cyBvZiB0aGUgZXh0ZW50IGxpc3QuCi0gKgotICogUXVpdGUgZXhjZXNzaXZlIHRyYWNpbmcuICBPbmx5IGRvIHRoaXMgZm9yIGRlYnVnIGJ1aWxkcy4KLSAqLwogI2lmIGRlZmluZWQoX19LRVJORUwpICYmIGRlZmluZWQoREVCVUcpCi12b2lkCi14ZnNfYm1hcF90cmFjZV9leGxpc3QoCi0Jc3RydWN0IHhmc19pbm9kZQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAkJY250LAkJLyogY291bnQgb2YgZW50cmllcyBpbiBsaXN0ICovCi0JaW50CQkJd2hpY2hmb3JrLAotCXVuc2lnbmVkIGxvbmcJCWNhbGxlcl9pcCk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit2b2lkCXhmc19ibWFwX3RyYWNlX2V4bGlzdChzdHJ1Y3QgeGZzX2lub2RlICppcCwgeGZzX2V4dG51bV90IGNudCwKKwkJaW50IHdoaWNoZm9yaywgdW5zaWduZWQgbG9uZyBjYWxsZXJfaXApOwogI2RlZmluZQlYRlNfQk1BUF9UUkFDRV9FWExJU1QoaXAsYyx3KQlcCiAJeGZzX2JtYXBfdHJhY2VfZXhsaXN0KGlwLGMsdywgX1RISVNfSVBfKQogI2Vsc2UKICNkZWZpbmUJWEZTX0JNQVBfVFJBQ0VfRVhMSVNUKGlwLGMsdykKICNlbmRpZgogCi0vKgotICogQ29udmVydCBpbm9kZSBmcm9tIG5vbi1hdHRyaWJ1dGVkIHRvIGF0dHJpYnV0ZWQuCi0gKiBNdXN0IG5vdCBiZSBpbiBhIHRyYW5zYWN0aW9uLCBpcCBtdXN0IG5vdCBiZSBsb2NrZWQuCi0gKi8KLWludAkJCQkJLyogZXJyb3IgY29kZSAqLwoteGZzX2JtYXBfYWRkX2F0dHJmb3JrKAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCWludAkJCXNpemUsCS8qIHNwYWNlIG5lZWRlZCBmb3IgbmV3IGF0dHJpYnV0ZSAqLwotCWludAkJCXJzdmQpOwkvKiBmbGFnIGZvciByZXNlcnZlZCBibG9jayBhbGxvY2F0aW9uICovCi0KLS8qCi0gKiBBZGQgdGhlIGV4dGVudCB0byB0aGUgbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWUgYXQgdHJhbnNhY3Rpb24gZW5kLgotICogVGhlIGxpc3QgaXMgbWFpbnRhaW5lZCBzb3J0ZWQgKGJ5IGJsb2NrIG51bWJlcikuCi0gKi8KLXZvaWQKLXhmc19ibWFwX2FkZF9mcmVlKAotCXhmc19mc2Jsb2NrX3QJCWJubywJCS8qIGZzIGJsb2NrIG51bWJlciBvZiBleHRlbnQgKi8KLQl4ZnNfZmlsYmxrc190CQlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCi0JeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBsaXN0IG9mIGV4dGVudHMgKi8KLQlzdHJ1Y3QgeGZzX21vdW50CSptcCk7CQkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KLQotLyoKLSAqIFJvdXRpbmUgdG8gY2xlYW4gdXAgdGhlIGZyZWUgbGlzdCBkYXRhIHN0cnVjdHVyZSB3aGVuCi0gKiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGEgdHJhbnNhY3Rpb24uCi0gKi8KLXZvaWQKLXhmc19ibWFwX2NhbmNlbCgKLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCk7CS8qIGZyZWUgbGlzdCB0byBjbGVhbiB1cCAqLwotCi0vKgotICogQ29tcHV0ZSBhbmQgZmlsbCBpbiB0aGUgdmFsdWUgb2YgdGhlIG1heGltdW0gZGVwdGggb2YgYSBibWFwIGJ0cmVlCi0gKiBpbiB0aGlzIGZpbGVzeXN0ZW0uICBEb25lIG9uY2UsIGR1cmluZyBtb3VudC4KLSAqLwotdm9pZAoteGZzX2JtYXBfY29tcHV0ZV9tYXhsZXZlbHMoCi0Jc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLwotCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0KLS8qCi0gKiBSZXR1cm5zIHRoZSBmaWxlLXJlbGF0aXZlIGJsb2NrIG51bWJlciBvZiB0aGUgZmlyc3QgdW51c2VkIGJsb2NrIGluIHRoZSBmaWxlLgotICogVGhpcyBpcyB0aGUgbG93ZXN0LWFkZHJlc3MgaG9sZSBpZiB0aGUgZmlsZSBoYXMgaG9sZXMsIGVsc2UgdGhlIGZpcnN0IGJsb2NrCi0gKiBwYXN0IHRoZSBlbmQgb2YgZmlsZS4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2ZpcnN0X3VudXNlZCgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLwotCXhmc19leHRsZW5fdAkJbGVuLAkJLyogc2l6ZSBvZiBob2xlIHRvIGZpbmQgKi8KLQl4ZnNfZmlsZW9mZl90CQkqdW51c2VkLAkvKiB1bnVzZWQgYmxvY2sgbnVtICovCi0JaW50CQkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KLQotLyoKLSAqIFJldHVybnMgdGhlIGZpbGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIG9mIHRoZSBsYXN0IGJsb2NrICsgMSBiZWZvcmUKLSAqIGxhc3RfYmxvY2sgKGlucHV0IHZhbHVlKSBpbiB0aGUgZmlsZS4KLSAqIFRoaXMgaXMgbm90IGJhc2VkIG9uIGlfc2l6ZSwgaXQgaXMgYmFzZWQgb24gdGhlIGV4dGVudCBsaXN0LgotICogUmV0dXJucyAwIGZvciBsb2NhbCBmaWxlcywgYXMgdGhleSBkbyBub3QgaGF2ZSBhbiBleHRlbnQgbGlzdC4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2xhc3RfYmVmb3JlKAotCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JeGZzX2ZpbGVvZmZfdAkJKmxhc3RfYmxvY2ssCS8qIGxhc3QgYmxvY2sgKi8KLQlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwotCi0vKgotICogUmV0dXJucyB0aGUgZmlsZS1yZWxhdGl2ZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIHBhc3QgZW9mIGluCi0gKiB0aGUgZmlsZS4gIFRoaXMgaXMgbm90IGJhc2VkIG9uIGlfc2l6ZSwgaXQgaXMgYmFzZWQgb24gdGhlIGV4dGVudCBsaXN0LgotICogUmV0dXJucyAwIGZvciBsb2NhbCBmaWxlcywgYXMgdGhleSBkbyBub3QgaGF2ZSBhbiBleHRlbnQgbGlzdC4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2xhc3Rfb2Zmc2V0KAotCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JeGZzX2ZpbGVvZmZfdAkJKnVudXNlZCwJLyogbGFzdCBibG9jayBudW0gKi8KLQlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwotCi0vKgotICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3RlZCBmb3JrIG9mIHRoZSBpbm9kZSBoYXMgZXhhY3RseSBvbmUKLSAqIGJsb2NrIG9yIG5vdC4gIEZvciB0aGUgZGF0YSBmb3JrIHdlIGNoZWNrIHRoaXMgbWF0Y2hlcyBkaV9zaXplLAotICogaW1wbHlpbmcgdGhlIGZpbGUncyByYW5nZSBpcyAwLi5ic2l6ZS0xLgotICovCi1pbnQKLXhmc19ibWFwX29uZV9ibG9jaygKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLwotCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0KLS8qCi0gKiBSZWFkIGluIHRoZSBleHRlbnRzIHRvIGl1X2V4dGVudHMuCi0gKiBBbGwgaW5vZGUgZmllbGRzIGFyZSBzZXQgdXAgYnkgY2FsbGVyLCB3ZSBqdXN0IHRyYXZlcnNlIHRoZSBidHJlZQotICogYW5kIGNvcHkgdGhlIHJlY29yZHMgaW4uCi0gKi8KLWludAkJCQkJCS8qIGVycm9yICovCi14ZnNfYm1hcF9yZWFkX2V4dGVudHMoCi0Jc3RydWN0IHhmc190cmFucwkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0Jc3RydWN0IHhmc19pbm9kZQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KLQlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwotCi0vKgotICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLgotICogRmlsZSByYW5nZSBpcyBnaXZlbiBieSB0aGUgYm5vL2xlbiBwYWlyLgotICogQWRkcyBibG9ja3MgdG8gZmlsZSBpZiBhIHdyaXRlICgiZmxhZ3MgJiBYRlNfQk1BUElfV1JJVEUiIHNldCkKLSAqIGludG8gYSBob2xlIG9yIHBhc3QgZW9mLgotICogT25seSBhbGxvY2F0ZXMgYmxvY2tzIGZyb20gYSBzaW5nbGUgYWxsb2NhdGlvbiBncm91cCwKLSAqIHRvIGF2b2lkIGxvY2tpbmcgcHJvYmxlbXMuCi0gKiBUaGUgcmV0dXJuZWQgdmFsdWUgaW4gImZpcnN0YmxvY2siIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gYSB0cmFuc2FjdGlvbgotICogbXVzdCBiZSByZW1lbWJlcmVkIGFuZCBwcmVzZW50ZWQgdG8gc3Vic2VxdWVudCBjYWxscyBpbiAiZmlyc3RibG9jayIuCi0gKiBBbiB1cHBlciBib3VuZCBmb3IgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGlzIHN1cHBsaWVkIHRvCi0gKiB0aGUgZmlyc3QgY2FsbCBpbiAidG90YWwiOyBpZiBubyBhbGxvY2F0aW9uIGdyb3VwIGhhcyB0aGF0IG1hbnkgZnJlZQotICogYmxvY2tzIHRoZW4gdGhlIGNhbGwgd2lsbCBmYWlsIChyZXR1cm4gTlVMTEZTQkxPQ0sgaW4gImZpcnN0YmxvY2siKS4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwaSgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLwotCXhmc19maWxlb2ZmX3QJCWJubywJCS8qIHN0YXJ0aW5nIGZpbGUgb2Zmcy4gbWFwcGVkICovCi0JeGZzX2ZpbGJsa3NfdAkJbGVuLAkJLyogbGVuZ3RoIHRvIG1hcCBpbiBmaWxlICovCi0JaW50CQkJZmxhZ3MsCQkvKiBYRlNfQk1BUElfLi4uICovCi0JeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGFsbG9jYXRlZCBibG9jawotCQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCi0JeGZzX2V4dGxlbl90CQl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgKi8KLQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbXZhbCwJCS8qIG91dHB1dDogbWFwIHZhbHVlcyAqLwotCWludAkJCSpubWFwLAkJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCk7CS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KLQotLyoKLSAqIE1hcCBmaWxlIGJsb2NrcyB0byBmaWxlc3lzdGVtIGJsb2Nrcywgc2ltcGxlIHZlcnNpb24uCi0gKiBPbmUgYmxvY2sgb25seSwgcmVhZC1vbmx5LgotICogRm9yIGZsYWdzLCBvbmx5IHRoZSBYRlNfQk1BUElfQVRUUkZPUksgZmxhZyBpcyBleGFtaW5lZC4KLSAqIEZvciB0aGUgb3RoZXIgZmxhZyB2YWx1ZXMsIHRoZSBlZmZlY3QgaXMgYXMgaWYgWEZTX0JNQVBJX01FVEFEQVRBCi0gKiB3YXMgc2V0IGFuZCBhbGwgdGhlIG90aGVycyB3ZXJlIGNsZWFyLgotICovCi1pbnQJCQkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBpX3NpbmdsZSgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLwotCWludAkJCXdoaWNoZm9yaywJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KLQl4ZnNfZnNibG9ja190CQkqZnNiLAkJLyogb3V0cHV0OiBtYXBwZWQgYmxvY2sgKi8KLQl4ZnNfZmlsZW9mZl90CQlibm8pOwkJLyogc3RhcnRpbmcgZmlsZSBvZmZzLiBtYXBwZWQgKi8KLQotLyoKLSAqIFVubWFwIChyZW1vdmUpIGJsb2NrcyBmcm9tIGEgZmlsZS4KLSAqIElmIG5leHRzIGlzIG5vbnplcm8gdGhlbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgdG8gcmVtb3ZlIGlzIGxpbWl0ZWQgdG8KLSAqIHRoYXQgdmFsdWUuICBJZiBub3QgYWxsIGV4dGVudHMgaW4gdGhlIGJsb2NrIHJhbmdlIGNhbiBiZSByZW1vdmVkIHRoZW4KLSAqICpkb25lIGlzIHNldC4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19idW5tYXBpKAotCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JeGZzX2ZpbGVvZmZfdAkJYm5vLAkJLyogc3RhcnRpbmcgb2Zmc2V0IHRvIHVubWFwICovCi0JeGZzX2ZpbGJsa3NfdAkJbGVuLAkJLyogbGVuZ3RoIHRvIHVubWFwIGluIGZpbGUgKi8KLQlpbnQJCQlmbGFncywJCS8qIFhGU19CTUFQSV8uLi4gKi8KLQl4ZnNfZXh0bnVtX3QJCW5leHRzLAkJLyogbnVtYmVyIG9mIGV4dGVudHMgbWF4ICovCi0JeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGFsbG9jYXRlZCBibG9jawotCQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCi0JeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCi0JaW50CQkJKmRvbmUpOwkJLyogc2V0IGlmIG5vdCBkb25lIHlldCAqLwotCi0vKgotICogQ2hlY2sgYW4gZXh0ZW50IGxpc3QsIHdoaWNoIGhhcyBqdXN0IGJlZW4gcmVhZCwgZm9yCi0gKiBhbnkgYml0IGluIHRoZSBleHRlbnQgZmxhZyBmaWVsZC4KLSAqLwotaW50Ci14ZnNfY2hlY2tfbm9zdGF0ZV9leHRlbnRzKAotCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcCwKLQl4ZnNfZXh0bnVtX3QJCWlkeCwKLQl4ZnNfZXh0bnVtX3QJCW51bSk7Ci0KLXVpbnQKLXhmc19kZWZhdWx0X2F0dHJvZmZzZXQoCi0Jc3RydWN0IHhmc19pbm9kZQkqaXApOworaW50CXhmc19ibWFwX2FkZF9hdHRyZm9yayhzdHJ1Y3QgeGZzX2lub2RlICppcCwgaW50IHNpemUsIGludCByc3ZkKTsKK3ZvaWQJeGZzX2JtYXBfYWRkX2ZyZWUoeGZzX2ZzYmxvY2tfdCBibm8sIHhmc19maWxibGtzX3QgbGVuLAorCQlzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKK3ZvaWQJeGZzX2JtYXBfY2FuY2VsKHN0cnVjdCB4ZnNfYm1hcF9mcmVlICpmbGlzdCk7Cit2b2lkCXhmc19ibWFwX2NvbXB1dGVfbWF4bGV2ZWxzKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgd2hpY2hmb3JrKTsKK2ludAl4ZnNfYm1hcF9maXJzdF91bnVzZWQoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmlwLAorCQl4ZnNfZXh0bGVuX3QgbGVuLCB4ZnNfZmlsZW9mZl90ICp1bnVzZWQsIGludCB3aGljaGZvcmspOworaW50CXhmc19ibWFwX2xhc3RfYmVmb3JlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICppcCwKKwkJeGZzX2ZpbGVvZmZfdCAqbGFzdF9ibG9jaywgaW50IHdoaWNoZm9yayk7CitpbnQJeGZzX2JtYXBfbGFzdF9vZmZzZXQoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmlwLAorCQl4ZnNfZmlsZW9mZl90ICp1bnVzZWQsIGludCB3aGljaGZvcmspOworaW50CXhmc19ibWFwX29uZV9ibG9jayhzdHJ1Y3QgeGZzX2lub2RlICppcCwgaW50IHdoaWNoZm9yayk7CitpbnQJeGZzX2JtYXBfcmVhZF9leHRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICppcCwKKwkJaW50IHdoaWNoZm9yayk7CitpbnQJeGZzX2JtYXBpX3JlYWQoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgYm5vLAorCQl4ZnNfZmlsYmxrc190IGxlbiwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKm12YWwsCisJCWludCAqbm1hcCwgaW50IGZsYWdzKTsKK2ludAl4ZnNfYm1hcGlfZGVsYXkoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgYm5vLAorCQl4ZnNfZmlsYmxrc190IGxlbiwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKm12YWwsCisJCWludCAqbm1hcCwgaW50IGZsYWdzKTsKK2ludAl4ZnNfYm1hcGlfd3JpdGUoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmlwLAorCQl4ZnNfZmlsZW9mZl90IGJubywgeGZzX2ZpbGJsa3NfdCBsZW4sIGludCBmbGFncywKKwkJeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywgeGZzX2V4dGxlbl90IHRvdGFsLAorCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqbXZhbCwgaW50ICpubWFwLAorCQlzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QpOworaW50CXhmc19idW5tYXBpKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICppcCwKKwkJeGZzX2ZpbGVvZmZfdCBibm8sIHhmc19maWxibGtzX3QgbGVuLCBpbnQgZmxhZ3MsCisJCXhmc19leHRudW1fdCBuZXh0cywgeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywKKwkJc3RydWN0IHhmc19ibWFwX2ZyZWUgKmZsaXN0LCBpbnQgKmRvbmUpOworaW50CXhmc19jaGVja19ub3N0YXRlX2V4dGVudHMoc3RydWN0IHhmc19pZm9yayAqaWZwLCB4ZnNfZXh0bnVtX3QgaWR4LAorCQl4ZnNfZXh0bnVtX3QgbnVtKTsKK3VpbnQJeGZzX2RlZmF1bHRfYXR0cm9mZnNldChzdHJ1Y3QgeGZzX2lub2RlICppcCk7CiAKICNpZmRlZiBfX0tFUk5FTF9fCi0KLS8qCi0gKiBSb3V0aW5lIHRvIGJlIGNhbGxlZCBhdCB0cmFuc2FjdGlvbidzIGVuZCBieSB4ZnNfYm1hcGksIHhmc19idW5tYXBpCi0gKiBjYWxsZXIuICBGcmVlcyBhbGwgdGhlIGV4dGVudHMgdGhhdCBuZWVkIGZyZWVpbmcsIHdoaWNoIG11c3QgYmUgZG9uZQotICogbGFzdCBkdWUgdG8gbG9ja2luZyBjb25zaWRlcmF0aW9ucy4KLSAqCi0gKiBSZXR1cm4gMSBpZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gd2FzIGNvbW1pdHRlZCBhbmQgYSBuZXcgb25lIGFsbG9jYXRlZCwKLSAqIGFuZCAwIG90aGVyd2lzZS4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2ZpbmlzaCgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSoqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyIGFkZHIgKi8KLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KLQlpbnQJCQkqY29tbWl0dGVkKTsJLyogeGFjdCBjb21taXR0ZWQgb3Igbm90ICovCi0KIC8qIGJtYXAgdG8gdXNlcnNwYWNlIGZvcm1hdHRlciAtIGNvcHkgdG8gdXNlciAmIGFkdmFuY2UgcG9pbnRlciAqLwogdHlwZWRlZiBpbnQgKCp4ZnNfYm1hcF9mb3JtYXRfdCkodm9pZCAqKiwgc3RydWN0IGdldGJtYXB4ICosIGludCAqKTsKIAotLyoKLSAqIEdldCBpbm9kZSdzIGV4dGVudHMgYXMgZGVzY3JpYmVkIGluIGJtdiwgYW5kIGZvcm1hdCBmb3Igb3V0cHV0LgotICovCi1pbnQJCQkJCQkvKiBlcnJvciBjb2RlICovCi14ZnNfZ2V0Ym1hcCgKLQl4ZnNfaW5vZGVfdAkJKmlwLAotCXN0cnVjdCBnZXRibWFweAkJKmJtdiwJCS8qIHVzZXIgYm1hcCBzdHJ1Y3R1cmUgKi8KLQl4ZnNfYm1hcF9mb3JtYXRfdAlmb3JtYXR0ZXIsCS8qIGZvcm1hdCB0byB1c2VyICovCi0Jdm9pZAkJCSphcmcpOwkJLyogZm9ybWF0dGVyIGFyZyAqLwotCi0vKgotICogQ2hlY2sgaWYgdGhlIGVuZG9mZiBpcyBvdXRzaWRlIHRoZSBsYXN0IGV4dGVudC4gSWYgc28gdGhlIGNhbGxlciB3aWxsIGdyb3cKLSAqIHRoZSBhbGxvY2F0aW9uIHRvIGEgc3RyaXBlIHVuaXQgYm91bmRhcnkKLSAqLwotaW50Ci14ZnNfYm1hcF9lb2YoCi0Jc3RydWN0IHhmc19pbm9kZSAgICAgICAgKmlwLAotCXhmc19maWxlb2ZmX3QgICAgICAgICAgIGVuZG9mZiwKLQlpbnQgICAgICAgICAgICAgICAgICAgICB3aGljaGZvcmssCi0JaW50ICAgICAgICAgICAgICAgICAgICAgKmVvZik7Ci0KLS8qCi0gKiBDb3VudCBmc2Jsb2NrcyBvZiB0aGUgZ2l2ZW4gZm9yay4KLSAqLwotaW50Ci14ZnNfYm1hcF9jb3VudF9ibG9ja3MoCi0JeGZzX3RyYW5zX3QJCSp0cCwKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKLQlpbnQJCQl3aGljaGZvcmssCi0JaW50CQkJKmNvdW50KTsKLQotaW50Ci14ZnNfYm1hcF9wdW5jaF9kZWxhbGxvY19yYW5nZSgKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKLQl4ZnNfZmlsZW9mZl90CQlzdGFydF9mc2IsCi0JeGZzX2ZpbGVvZmZfdAkJbGVuZ3RoKTsKK2ludAl4ZnNfYm1hcF9maW5pc2goc3RydWN0IHhmc190cmFucyAqKnRwLCBzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QsCisJCWludCAqY29tbWl0dGVkKTsKK2ludAl4ZnNfZ2V0Ym1hcChzdHJ1Y3QgeGZzX2lub2RlICppcCwgc3RydWN0IGdldGJtYXB4ICpibXYsCisJCXhmc19ibWFwX2Zvcm1hdF90IGZvcm1hdHRlciwgdm9pZCAqYXJnKTsKK2ludAl4ZnNfYm1hcF9lb2Yoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgZW5kb2ZmLAorCQlpbnQgd2hpY2hmb3JrLCBpbnQgKmVvZik7CitpbnQJeGZzX2JtYXBfY291bnRfYmxvY2tzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICppcCwKKwkJaW50IHdoaWNoZm9yaywgaW50ICpjb3VudCk7CitpbnQJeGZzX2JtYXBfcHVuY2hfZGVsYWxsb2NfcmFuZ2Uoc3RydWN0IHhmc19pbm9kZSAqaXAsCisJCXhmc19maWxlb2ZmX3Qgc3RhcnRfZnNiLCB4ZnNfZmlsZW9mZl90IGxlbmd0aCk7CiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJLyogX19YRlNfQk1BUF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfYnRyZWUuYwppbmRleCAyYjlmZDM4Li4xZjE5ZjAzIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19idHJlZS5jCkBAIC02MzEsNyArNjMxLDcgQEAKIAl9CiAJQVNTRVJUKCF4ZnNfYnVmX2dldGVycm9yKGJwKSk7CiAJaWYgKGJwKQotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCByZWZ2YWwpOworCQl4ZnNfYnVmX3NldF9yZWYoYnAsIHJlZnZhbCk7CiAJKmJwcCA9IGJwOwogCXJldHVybiAwOwogfQpAQCAtOTM5LDEzICs5MzksMTMgQEAKIAlzd2l0Y2ggKGN1ci0+YmNfYnRudW0pIHsKIAljYXNlIFhGU19CVE5VTV9CTk86CiAJY2FzZSBYRlNfQlROVU1fQ05UOgotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCBYRlNfQUxMT0NfQlRSRUVfUkVGKTsKKwkJeGZzX2J1Zl9zZXRfcmVmKGJwLCBYRlNfQUxMT0NfQlRSRUVfUkVGKTsKIAkJYnJlYWs7CiAJY2FzZSBYRlNfQlROVU1fSU5POgotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfSU5PTUFQLCBYRlNfSU5PX0JUUkVFX1JFRik7CisJCXhmc19idWZfc2V0X3JlZihicCwgWEZTX0lOT19CVFJFRV9SRUYpOwogCQlicmVhazsKIAljYXNlIFhGU19CVE5VTV9CTUFQOgotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCBYRlNfQk1BUF9CVFJFRV9SRUYpOworCQl4ZnNfYnVmX3NldF9yZWYoYnAsIFhGU19CTUFQX0JUUkVFX1JFRik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKQEAgLTk3MCw3ICs5NzAsOCBAQAogCSpicHAgPSB4ZnNfdHJhbnNfZ2V0X2J1ZihjdXItPmJjX3RwLCBtcC0+bV9kZGV2X3RhcmdwLCBkLAogCQkJCSBtcC0+bV9ic2l6ZSwgZmxhZ3MpOwogCi0JQVNTRVJUKCF4ZnNfYnVmX2dldGVycm9yKCpicHApKTsKKwlpZiAoISpicHApCisJCXJldHVybiBFTk9NRU07CiAKIAkqYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKCpicHApOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWYuYyBiL2ZzL3hmcy94ZnNfYnVmLmMKaW5kZXggYzU3ODM2ZC4uY2YwYWMwNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWYuYworKysgYi9mcy94ZnMveGZzX2J1Zi5jCkBAIC00Myw3ICs0Myw2IEBACiAKIHN0YXRpYyBrbWVtX3pvbmVfdCAqeGZzX2J1Zl96b25lOwogU1RBVElDIGludCB4ZnNidWZkKHZvaWQgKik7Ci1TVEFUSUMgdm9pZCB4ZnNfYnVmX2RlbHdyaV9xdWV1ZSh4ZnNfYnVmX3QgKiwgaW50KTsKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNsb2dkX3dvcmtxdWV1ZTsKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNkYXRhZF93b3JrcXVldWU7CkBAIC02NiwxMCArNjUsNiBAQAogI2RlZmluZSB4Yl90b19rbShmbGFncykgXAogCSAoKChmbGFncykgJiBYQkZfRE9OVF9CTE9DSykgPyBLTV9OT0ZTIDogS01fU0xFRVApCiAKLSNkZWZpbmUgeGZzX2J1Zl9hbGxvY2F0ZShmbGFncykgXAotCWttZW1fem9uZV9hbGxvYyh4ZnNfYnVmX3pvbmUsIHhiX3RvX2ttKGZsYWdzKSkKLSNkZWZpbmUgeGZzX2J1Zl9kZWFsbG9jYXRlKGJwKSBcCi0Ja21lbV96b25lX2ZyZWUoeGZzX2J1Zl96b25lLCAoYnApKTsKIAogc3RhdGljIGlubGluZSBpbnQKIHhmc19idWZfaXNfdm1hcHBlZCgKQEAgLTE1Miw2ICsxNDcsNyBAQAogCXN0cnVjdCB4ZnNfYnVmCSpicCkKIHsKIAlicC0+Yl9mbGFncyB8PSBYQkZfU1RBTEU7CisJeGZzX2J1Zl9kZWx3cmlfZGVxdWV1ZShicCk7CiAJYXRvbWljX3NldCgmKGJwKS0+Yl9scnVfcmVmLCAwKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmJwLT5iX2xydSkpIHsKIAkJc3RydWN0IHhmc19idWZ0YXJnICpidHAgPSBicC0+Yl90YXJnZXQ7CkBAIC0xNjcsMTQgKzE2MywxOSBAQAogCUFTU0VSVChhdG9taWNfcmVhZCgmYnAtPmJfaG9sZCkgPj0gMSk7CiB9CiAKLVNUQVRJQyB2b2lkCi1feGZzX2J1Zl9pbml0aWFsaXplKAotCXhmc19idWZfdAkJKmJwLAotCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCitzdHJ1Y3QgeGZzX2J1ZiAqCit4ZnNfYnVmX2FsbG9jKAorCXN0cnVjdCB4ZnNfYnVmdGFyZwkqdGFyZ2V0LAogCXhmc19vZmZfdAkJcmFuZ2VfYmFzZSwKIAlzaXplX3QJCQlyYW5nZV9sZW5ndGgsCiAJeGZzX2J1Zl9mbGFnc190CQlmbGFncykKIHsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOworCisJYnAgPSBrbWVtX3pvbmVfYWxsb2MoeGZzX2J1Zl96b25lLCB4Yl90b19rbShmbGFncykpOworCWlmICh1bmxpa2VseSghYnApKQorCQlyZXR1cm4gTlVMTDsKKwogCS8qCiAJICogV2UgZG9uJ3Qgd2FudCBjZXJ0YWluIGZsYWdzIHRvIGFwcGVhciBpbiBiX2ZsYWdzLgogCSAqLwpAQCAtMjAzLDggKzIwNCw5IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYnAtPmJfd2FpdGVycyk7CiAKIAlYRlNfU1RBVFNfSU5DKHhiX2NyZWF0ZSk7Ci0KIAl0cmFjZV94ZnNfYnVmX2luaXQoYnAsIF9SRVRfSVBfKTsKKworCXJldHVybiBicDsKIH0KIAogLyoKQEAgLTI3Nyw3ICsyNzksNyBAQAogCX0gZWxzZSBpZiAoYnAtPmJfZmxhZ3MgJiBfWEJGX0tNRU0pCiAJCWttZW1fZnJlZShicC0+Yl9hZGRyKTsKIAlfeGZzX2J1Zl9mcmVlX3BhZ2VzKGJwKTsKLQl4ZnNfYnVmX2RlYWxsb2NhdGUoYnApOworCWttZW1fem9uZV9mcmVlKHhmc19idWZfem9uZSwgYnApOwogfQogCiAvKgpAQCAtNDE2LDEwICs0MTgsNyBAQAogLyoKICAqCUxvb2sgdXAsIGFuZCBjcmVhdGVzIGlmIGFic2VudCwgYSBsb2NrYWJsZSBidWZmZXIgZm9yCiAgKglhIGdpdmVuIHJhbmdlIG9mIGFuIGlub2RlLiAgVGhlIGJ1ZmZlciBpcyByZXR1cm5lZAotICoJbG9ja2VkLgkgSWYgb3RoZXIgb3ZlcmxhcHBpbmcgYnVmZmVycyBleGlzdCwgdGhleSBhcmUKLSAqCXJlbGVhc2VkIGJlZm9yZSB0aGUgbmV3IGJ1ZmZlciBpcyBjcmVhdGVkIGFuZCBsb2NrZWQsCi0gKgl3aGljaCBtYXkgaW1wbHkgdGhhdCB0aGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aG9zZSBidWZmZXJzCi0gKglhcmUgdW5sb2NrZWQuICBObyBJL08gaXMgaW1wbGllZCBieSB0aGlzIGNhbGwuCisgKglsb2NrZWQuCU5vIEkvTyBpcyBpbXBsaWVkIGJ5IHRoaXMgY2FsbC4KICAqLwogeGZzX2J1Zl90ICoKIF94ZnNfYnVmX2ZpbmQoCkBAIC00ODEsOCArNDgwLDYgQEAKIAogCS8qIE5vIG1hdGNoIGZvdW5kICovCiAJaWYgKG5ld19icCkgewotCQlfeGZzX2J1Zl9pbml0aWFsaXplKG5ld19icCwgYnRwLCByYW5nZV9iYXNlLAotCQkJCXJhbmdlX2xlbmd0aCwgZmxhZ3MpOwogCQlyYl9saW5rX25vZGUoJm5ld19icC0+Yl9yYm5vZGUsIHBhcmVudCwgcmJwKTsKIAkJcmJfaW5zZXJ0X2NvbG9yKCZuZXdfYnAtPmJfcmJub2RlLCAmcGFnLT5wYWdfYnVmX3RyZWUpOwogCQkvKiB0aGUgYnVmZmVyIGtlZXBzIHRoZSBwZXJhZyByZWZlcmVuY2UgdW50aWwgaXQgaXMgZnJlZWQgKi8KQEAgLTUyNSwzNSArNTIyLDUxIEBACiB9CiAKIC8qCi0gKglBc3NlbWJsZXMgYSBidWZmZXIgY292ZXJpbmcgdGhlIHNwZWNpZmllZCByYW5nZS4KLSAqCVN0b3JhZ2UgaW4gbWVtb3J5IGZvciBhbGwgcG9ydGlvbnMgb2YgdGhlIGJ1ZmZlciB3aWxsIGJlIGFsbG9jYXRlZCwKLSAqCWFsdGhvdWdoIGJhY2tpbmcgc3RvcmFnZSBtYXkgbm90IGJlLgorICogQXNzZW1ibGVzIGEgYnVmZmVyIGNvdmVyaW5nIHRoZSBzcGVjaWZpZWQgcmFuZ2UuIFRoZSBjb2RlIGlzIG9wdGltaXNlZCBmb3IKKyAqIGNhY2hlIGhpdHMsIGFzIG1ldGFkYXRhIGludGVuc2l2ZSB3b3JrbG9hZHMgd2lsbCBzZWUgMyBvcmRlcnMgb2YgbWFnbml0dWRlCisgKiBtb3JlIGhpdHMgdGhhbiBtaXNzZXMuCiAgKi8KLXhmc19idWZfdCAqCitzdHJ1Y3QgeGZzX2J1ZiAqCiB4ZnNfYnVmX2dldCgKIAl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LC8qIHRhcmdldCBmb3IgYnVmZmVyCQkqLwogCXhmc19vZmZfdAkJaW9mZiwJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCiAJc2l6ZV90CQkJaXNpemUsCS8qIGxlbmd0aCBvZiByYW5nZQkJKi8KIAl4ZnNfYnVmX2ZsYWdzX3QJCWZsYWdzKQogewotCXhmc19idWZfdAkJKmJwLCAqbmV3X2JwOworCXN0cnVjdCB4ZnNfYnVmCQkqYnA7CisJc3RydWN0IHhmc19idWYJCSpuZXdfYnA7CiAJaW50CQkJZXJyb3IgPSAwOwogCi0JbmV3X2JwID0geGZzX2J1Zl9hbGxvY2F0ZShmbGFncyk7CisJYnAgPSBfeGZzX2J1Zl9maW5kKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzLCBOVUxMKTsKKwlpZiAobGlrZWx5KGJwKSkKKwkJZ290byBmb3VuZDsKKworCW5ld19icCA9IHhmc19idWZfYWxsb2ModGFyZ2V0LCBpb2ZmIDw8IEJCU0hJRlQsIGlzaXplIDw8IEJCU0hJRlQsCisJCQkgICAgICAgZmxhZ3MpOwogCWlmICh1bmxpa2VseSghbmV3X2JwKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlicCA9IF94ZnNfYnVmX2ZpbmQodGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MsIG5ld19icCk7CisJaWYgKCFicCkgeworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfYnVmX3pvbmUsIG5ld19icCk7CisJCXJldHVybiBOVUxMOworCX0KKwogCWlmIChicCA9PSBuZXdfYnApIHsKIAkJZXJyb3IgPSB4ZnNfYnVmX2FsbG9jYXRlX21lbW9yeShicCwgZmxhZ3MpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG5vX2J1ZmZlcjsKLQl9IGVsc2UgewotCQl4ZnNfYnVmX2RlYWxsb2NhdGUobmV3X2JwKTsKLQkJaWYgKHVubGlrZWx5KGJwID09IE5VTEwpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorCX0gZWxzZQorCQlrbWVtX3pvbmVfZnJlZSh4ZnNfYnVmX3pvbmUsIG5ld19icCk7CiAKKwkvKgorCSAqIE5vdyB3ZSBoYXZlIGEgd29ya2FibGUgYnVmZmVyLCBmaWxsIGluIHRoZSBibG9jayBudW1iZXIgc28KKwkgKiB0aGF0IHdlIGNhbiBkbyBJTyBvbiBpdC4KKwkgKi8KKwlicC0+Yl9ibiA9IGlvZmY7CisJYnAtPmJfY291bnRfZGVzaXJlZCA9IGJwLT5iX2J1ZmZlcl9sZW5ndGg7CisKK2ZvdW5kOgogCWlmICghKGJwLT5iX2ZsYWdzICYgWEJGX01BUFBFRCkpIHsKIAkJZXJyb3IgPSBfeGZzX2J1Zl9tYXBfcGFnZXMoYnAsIGZsYWdzKTsKIAkJaWYgKHVubGlrZWx5KGVycm9yKSkgewpAQCAtNTY0LDE4ICs1NzcsMTAgQEAKIAl9CiAKIAlYRlNfU1RBVFNfSU5DKHhiX2dldCk7Ci0KLQkvKgotCSAqIEFsd2F5cyBmaWxsIGluIHRoZSBibG9jayBudW1iZXIgbm93LCB0aGUgbWFwcGVkIGNhc2VzIGNhbiBkbwotCSAqIHRoZWlyIG93biBvdmVybGF5IG9mIHRoaXMgbGF0ZXIuCi0JICovCi0JYnAtPmJfYm4gPSBpb2ZmOwotCWJwLT5iX2NvdW50X2Rlc2lyZWQgPSBicC0+Yl9idWZmZXJfbGVuZ3RoOwotCiAJdHJhY2VfeGZzX2J1Zl9nZXQoYnAsIGZsYWdzLCBfUkVUX0lQXyk7CiAJcmV0dXJuIGJwOwogCi0gbm9fYnVmZmVyOgorbm9fYnVmZmVyOgogCWlmIChmbGFncyAmIChYQkZfTE9DSyB8IFhCRl9UUllMT0NLKSkKIAkJeGZzX2J1Zl91bmxvY2soYnApOwogCXhmc19idWZfcmVsZShicCk7CkBAIC02ODksMTkgKzY5NCw2IEBACiAJcmV0dXJuIGJwOwogfQogCi14ZnNfYnVmX3QgKgoteGZzX2J1Zl9nZXRfZW1wdHkoCi0Jc2l6ZV90CQkJbGVuLAotCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQpCi17Ci0JeGZzX2J1Zl90CQkqYnA7Ci0KLQlicCA9IHhmc19idWZfYWxsb2NhdGUoMCk7Ci0JaWYgKGJwKQotCQlfeGZzX2J1Zl9pbml0aWFsaXplKGJwLCB0YXJnZXQsIDAsIGxlbiwgMCk7Ci0JcmV0dXJuIGJwOwotfQotCiAvKgogICogUmV0dXJuIGEgYnVmZmVyIGFsbG9jYXRlZCBhcyBhbiBlbXB0eSBidWZmZXIgYW5kIGFzc29jaWF0ZWQgdG8gZXh0ZXJuYWwKICAqIG1lbW9yeSB2aWEgeGZzX2J1Zl9hc3NvY2lhdGVfbWVtb3J5KCkgYmFjayB0byBpdCdzIGVtcHR5IHN0YXRlLgpAQCAtNzg3LDEwICs3NzksOSBAQAogCWludAkJCWVycm9yLCBpOwogCXhmc19idWZfdAkJKmJwOwogCi0JYnAgPSB4ZnNfYnVmX2FsbG9jYXRlKDApOworCWJwID0geGZzX2J1Zl9hbGxvYyh0YXJnZXQsIDAsIGxlbiwgMCk7CiAJaWYgKHVubGlrZWx5KGJwID09IE5VTEwpKQogCQlnb3RvIGZhaWw7Ci0JX3hmc19idWZfaW5pdGlhbGl6ZShicCwgdGFyZ2V0LCAwLCBsZW4sIDApOwogCiAJZXJyb3IgPSBfeGZzX2J1Zl9nZXRfcGFnZXMoYnAsIHBhZ2VfY291bnQsIDApOwogCWlmIChlcnJvcikKQEAgLTgxOCw3ICs4MDksNyBAQAogCQlfX2ZyZWVfcGFnZShicC0+Yl9wYWdlc1tpXSk7CiAJX3hmc19idWZfZnJlZV9wYWdlcyhicCk7CiAgZmFpbF9mcmVlX2J1ZjoKLQl4ZnNfYnVmX2RlYWxsb2NhdGUoYnApOworCWttZW1fem9uZV9mcmVlKHhmc19idWZfem9uZSwgYnApOwogIGZhaWw6CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC05MzcsMTIgKzkyOCw2IEBACiB4ZnNfYnVmX3VubG9jaygKIAlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKQogewotCWlmICgoYnAtPmJfZmxhZ3MgJiAoWEJGX0RFTFdSSXxfWEJGX0RFTFdSSV9RKSkgPT0gWEJGX0RFTFdSSSkgewotCQlhdG9taWNfaW5jKCZicC0+Yl9ob2xkKTsKLQkJYnAtPmJfZmxhZ3MgfD0gWEJGX0FTWU5DOwotCQl4ZnNfYnVmX2RlbHdyaV9xdWV1ZShicCwgMCk7Ci0JfQotCiAJWEJfQ0xFQVJfT1dORVIoYnApOwogCXVwKCZicC0+Yl9zZW1hKTsKIApAQCAtMTAxOSw5ICsxMDA0LDE5IEBACiAJdHJhY2VfeGZzX2J1Zl9pb2Vycm9yKGJwLCBlcnJvciwgX1JFVF9JUF8pOwogfQogCit2b2lkCit4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoCisJc3RydWN0IHhmc19idWYJCSpicCwKKwljb25zdCBjaGFyCQkqZnVuYykKK3sKKwl4ZnNfYWxlcnQoYnAtPmJfdGFyZ2V0LT5idF9tb3VudCwKKyJtZXRhZGF0YSBJL08gZXJyb3I6IGJsb2NrIDB4JWxseCAoXCIlc1wiKSBlcnJvciAlZCBidWYgY291bnQgJXpkIiwKKwkJKF9fdWludDY0X3QpWEZTX0JVRl9BRERSKGJwKSwgZnVuYywKKwkJYnAtPmJfZXJyb3IsIFhGU19CVUZfQ09VTlQoYnApKTsKK30KKwogaW50CiB4ZnNfYndyaXRlKAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAogCXN0cnVjdCB4ZnNfYnVmCQkqYnApCiB7CiAJaW50CQkJZXJyb3I7CkBAIC0xMDMzLDI1ICsxMDI4LDEzIEBACiAJeGZzX2Jkc3RyYXRfY2IoYnApOwogCiAJZXJyb3IgPSB4ZnNfYnVmX2lvd2FpdChicCk7Ci0JaWYgKGVycm9yKQotCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFNIVVRET1dOX01FVEFfSU9fRVJST1IpOwotCXhmc19idWZfcmVsc2UoYnApOworCWlmIChlcnJvcikgeworCQl4ZnNfZm9yY2Vfc2h1dGRvd24oYnAtPmJfdGFyZ2V0LT5idF9tb3VudCwKKwkJCQkgICBTSFVURE9XTl9NRVRBX0lPX0VSUk9SKTsKKwl9CiAJcmV0dXJuIGVycm9yOwogfQogCi12b2lkCi14ZnNfYmR3cml0ZSgKLQl2b2lkCQkJKm1wLAotCXN0cnVjdCB4ZnNfYnVmCQkqYnApCi17Ci0JdHJhY2VfeGZzX2J1Zl9iZHdyaXRlKGJwLCBfUkVUX0lQXyk7Ci0KLQlicC0+Yl9mbGFncyAmPSB+WEJGX1JFQUQ7Ci0JYnAtPmJfZmxhZ3MgfD0gKFhCRl9ERUxXUkkgfCBYQkZfQVNZTkMpOwotCi0JeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnAsIDEpOwotfQotCiAvKgogICogQ2FsbGVkIHdoZW4gd2Ugd2FudCB0byBzdG9wIGEgYnVmZmVyIGZyb20gZ2V0dGluZyB3cml0dGVuIG9yIHJlYWQuCiAgKiBXZSBhdHRhY2ggdGhlIEVJTyBlcnJvciwgbXVjayB3aXRoIGl0cyBmbGFncywgYW5kIGNhbGwgeGZzX2J1Zl9pb2VuZApAQCAtMTA3NCw5ICsxMDU3LDggQEAKIAkgKiBXZSdyZSBjYWxsaW5nIHhmc19idWZfaW9lbmQsIHNvIGRlbGV0ZSBYQkZfRE9ORSBmbGFnLgogCSAqLwogCVhGU19CVUZfVU5SRUFEKGJwKTsKLQlYRlNfQlVGX1VOREVMQVlXUklURShicCk7CiAJWEZTX0JVRl9VTkRPTkUoYnApOwotCVhGU19CVUZfU1RBTEUoYnApOworCXhmc19idWZfc3RhbGUoYnApOwogCiAJeGZzX2J1Zl9pb2VuZChicCwgMCk7CiAKQEAgLTExMDMsOSArMTA4NSw4IEBACiAJICogY2hhbmdlIHRoYXQgaW50ZXJmYWNlLgogCSAqLwogCVhGU19CVUZfVU5SRUFEKGJwKTsKLQlYRlNfQlVGX1VOREVMQVlXUklURShicCk7CiAJWEZTX0JVRl9ET05FKGJwKTsKLQlYRlNfQlVGX1NUQUxFKGJwKTsKKwl4ZnNfYnVmX3N0YWxlKGJwKTsKIAlicC0+Yl9pb2RvbmUgPSBOVUxMOwogCWlmICghKGZsICYgWEJGX0FTWU5DKSkgewogCQkvKgpAQCAtMTExNSw3ICsxMDk2LDcgQEAKIAkJICogQVNZTkMgYnVmZmVycy4KIAkJICovCiAJCXhmc19idWZfaW9lcnJvcihicCwgRUlPKTsKLQkJWEZTX0JVRl9GSU5JU0hfSU9XQUlUKGJwKTsKKwkJY29tcGxldGUoJmJwLT5iX2lvd2FpdCk7CiAJfSBlbHNlIHsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJfQpAQCAtMTI3NSwxNSArMTI1NiwxMCBAQAogewogCXRyYWNlX3hmc19idWZfaW9yZXF1ZXN0KGJwLCBfUkVUX0lQXyk7CiAKLQlpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfREVMV1JJKSB7Ci0JCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwLCAxKTsKLQkJcmV0dXJuIDA7Ci0JfQorCUFTU0VSVCghKGJwLT5iX2ZsYWdzICYgWEJGX0RFTFdSSSkpOwogCi0JaWYgKGJwLT5iX2ZsYWdzICYgWEJGX1dSSVRFKSB7CisJaWYgKGJwLT5iX2ZsYWdzICYgWEJGX1dSSVRFKQogCQl4ZnNfYnVmX3dhaXRfdW5waW4oYnApOwotCX0KLQogCXhmc19idWZfaG9sZChicCk7CiAKIAkvKiBTZXQgdGhlIGNvdW50IHRvIDEgaW5pdGlhbGx5LCB0aGlzIHdpbGwgc3RvcCBhbiBJL08KQEAgLTE0ODEsOSArMTQ1NywxMyBAQAogCWJ0cC0+YnRfc21hc2sgPSBzZWN0b3JzaXplIC0gMTsKIAogCWlmIChzZXRfYmxvY2tzaXplKGJ0cC0+YnRfYmRldiwgc2VjdG9yc2l6ZSkpIHsKKwkJY2hhciBuYW1lW0JERVZOQU1FX1NJWkVdOworCisJCWJkZXZuYW1lKGJ0cC0+YnRfYmRldiwgbmFtZSk7CisKIAkJeGZzX3dhcm4oYnRwLT5idF9tb3VudCwKIAkJCSJDYW5ub3Qgc2V0X2Jsb2Nrc2l6ZSB0byAldSBvbiBkZXZpY2UgJXNcbiIsCi0JCQlzZWN0b3JzaXplLCB4ZnNfYnVmX3RhcmdldF9uYW1lKGJ0cCkpOworCQkJc2VjdG9yc2l6ZSwgbmFtZSk7CiAJCXJldHVybiBFSU5WQUw7CiAJfQogCkBAIC0xNTE0LDEyICsxNDk0LDEyIEBACiB9CiAKIFNUQVRJQyBpbnQKLXhmc19hbGxvY19kZWx3cml0ZV9xdWV1ZSgKK3hmc19hbGxvY19kZWx3cmlfcXVldWUoCiAJeGZzX2J1ZnRhcmdfdAkJKmJ0cCwKIAljb25zdCBjaGFyCQkqZnNuYW1lKQogewotCUlOSVRfTElTVF9IRUFEKCZidHAtPmJ0X2RlbHdyaXRlX3F1ZXVlKTsKLQlzcGluX2xvY2tfaW5pdCgmYnRwLT5idF9kZWx3cml0ZV9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYnRwLT5idF9kZWx3cmlfcXVldWUpOworCXNwaW5fbG9ja19pbml0KCZidHAtPmJ0X2RlbHdyaV9sb2NrKTsKIAlidHAtPmJ0X2ZsYWdzID0gMDsKIAlidHAtPmJ0X3Rhc2sgPSBrdGhyZWFkX3J1bih4ZnNidWZkLCBidHAsICJ4ZnNidWZkLyVzIiwgZnNuYW1lKTsKIAlpZiAoSVNfRVJSKGJ0cC0+YnRfdGFzaykpCkBAIC0xNTQ5LDcgKzE1MjksNyBAQAogCXNwaW5fbG9ja19pbml0KCZidHAtPmJ0X2xydV9sb2NrKTsKIAlpZiAoeGZzX3NldHNpemVfYnVmdGFyZ19lYXJseShidHAsIGJkZXYpKQogCQlnb3RvIGVycm9yOwotCWlmICh4ZnNfYWxsb2NfZGVsd3JpdGVfcXVldWUoYnRwLCBmc25hbWUpKQorCWlmICh4ZnNfYWxsb2NfZGVsd3JpX3F1ZXVlKGJ0cCwgZnNuYW1lKSkKIAkJZ290byBlcnJvcjsKIAlidHAtPmJ0X3Nocmlua2VyLnNocmluayA9IHhmc19idWZ0YXJnX3NocmluazsKIAlidHAtPmJ0X3Nocmlua2VyLnNlZWtzID0gREVGQVVMVF9TRUVLUzsKQEAgLTE1NjUsNTYgKzE1NDUsNDggQEAKIC8qCiAgKglEZWxheWVkIHdyaXRlIGJ1ZmZlciBoYW5kbGluZwogICovCi1TVEFUSUMgdm9pZAordm9pZAogeGZzX2J1Zl9kZWx3cmlfcXVldWUoCi0JeGZzX2J1Zl90CQkqYnAsCi0JaW50CQkJdW5sb2NrKQorCXhmc19idWZfdAkJKmJwKQogewotCXN0cnVjdCBsaXN0X2hlYWQJKmR3cSA9ICZicC0+Yl90YXJnZXQtPmJ0X2RlbHdyaXRlX3F1ZXVlOwotCXNwaW5sb2NrX3QJCSpkd2xrID0gJmJwLT5iX3RhcmdldC0+YnRfZGVsd3JpdGVfbG9jazsKKwlzdHJ1Y3QgeGZzX2J1ZnRhcmcJKmJ0cCA9IGJwLT5iX3RhcmdldDsKIAogCXRyYWNlX3hmc19idWZfZGVsd3JpX3F1ZXVlKGJwLCBfUkVUX0lQXyk7CiAKLQlBU1NFUlQoKGJwLT5iX2ZsYWdzJihYQkZfREVMV1JJfFhCRl9BU1lOQykpID09IChYQkZfREVMV1JJfFhCRl9BU1lOQykpOworCUFTU0VSVCghKGJwLT5iX2ZsYWdzICYgWEJGX1JFQUQpKTsKIAotCXNwaW5fbG9jayhkd2xrKTsKLQkvKiBJZiBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgZGVxdWV1ZSBhbmQgcGxhY2UgYXQgdGFpbCAqLworCXNwaW5fbG9jaygmYnRwLT5idF9kZWx3cmlfbG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZicC0+Yl9saXN0KSkgeworCQkvKiBpZiBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgbW92ZSBpdCB0byB0aGUgdGFpbCAqLwogCQlBU1NFUlQoYnAtPmJfZmxhZ3MgJiBfWEJGX0RFTFdSSV9RKTsKLQkJaWYgKHVubG9jaykKLQkJCWF0b21pY19kZWMoJmJwLT5iX2hvbGQpOwotCQlsaXN0X2RlbCgmYnAtPmJfbGlzdCk7Ci0JfQotCi0JaWYgKGxpc3RfZW1wdHkoZHdxKSkgeworCQlsaXN0X21vdmVfdGFpbCgmYnAtPmJfbGlzdCwgJmJ0cC0+YnRfZGVsd3JpX3F1ZXVlKTsKKwl9IGVsc2UgewogCQkvKiBzdGFydCB4ZnNidWZkIGFzIGl0IGlzIGFib3V0IHRvIGhhdmUgc29tZXRoaW5nIHRvIGRvICovCi0JCXdha2VfdXBfcHJvY2VzcyhicC0+Yl90YXJnZXQtPmJ0X3Rhc2spOworCQlpZiAobGlzdF9lbXB0eSgmYnRwLT5idF9kZWx3cmlfcXVldWUpKQorCQkJd2FrZV91cF9wcm9jZXNzKGJwLT5iX3RhcmdldC0+YnRfdGFzayk7CisKKwkJYXRvbWljX2luYygmYnAtPmJfaG9sZCk7CisJCWJwLT5iX2ZsYWdzIHw9IFhCRl9ERUxXUkkgfCBfWEJGX0RFTFdSSV9RIHwgWEJGX0FTWU5DOworCQlsaXN0X2FkZF90YWlsKCZicC0+Yl9saXN0LCAmYnRwLT5idF9kZWx3cmlfcXVldWUpOwogCX0KLQotCWJwLT5iX2ZsYWdzIHw9IF9YQkZfREVMV1JJX1E7Ci0JbGlzdF9hZGRfdGFpbCgmYnAtPmJfbGlzdCwgZHdxKTsKIAlicC0+Yl9xdWV1ZXRpbWUgPSBqaWZmaWVzOwotCXNwaW5fdW5sb2NrKGR3bGspOwotCi0JaWYgKHVubG9jaykKLQkJeGZzX2J1Zl91bmxvY2soYnApOworCXNwaW5fdW5sb2NrKCZidHAtPmJ0X2RlbHdyaV9sb2NrKTsKIH0KIAogdm9pZAogeGZzX2J1Zl9kZWx3cmlfZGVxdWV1ZSgKIAl4ZnNfYnVmX3QJCSpicCkKIHsKLQlzcGlubG9ja190CQkqZHdsayA9ICZicC0+Yl90YXJnZXQtPmJ0X2RlbHdyaXRlX2xvY2s7CiAJaW50CQkJZGVxdWV1ZWQgPSAwOwogCi0Jc3Bpbl9sb2NrKGR3bGspOworCXNwaW5fbG9jaygmYnAtPmJfdGFyZ2V0LT5idF9kZWx3cmlfbG9jayk7CiAJaWYgKChicC0+Yl9mbGFncyAmIFhCRl9ERUxXUkkpICYmICFsaXN0X2VtcHR5KCZicC0+Yl9saXN0KSkgewogCQlBU1NFUlQoYnAtPmJfZmxhZ3MgJiBfWEJGX0RFTFdSSV9RKTsKIAkJbGlzdF9kZWxfaW5pdCgmYnAtPmJfbGlzdCk7CiAJCWRlcXVldWVkID0gMTsKIAl9CiAJYnAtPmJfZmxhZ3MgJj0gfihYQkZfREVMV1JJfF9YQkZfREVMV1JJX1EpOwotCXNwaW5fdW5sb2NrKGR3bGspOworCXNwaW5fdW5sb2NrKCZicC0+Yl90YXJnZXQtPmJ0X2RlbHdyaV9sb2NrKTsKIAogCWlmIChkZXF1ZXVlZCkKIAkJeGZzX2J1Zl9yZWxlKGJwKTsKQEAgLTE2NDYsMTYgKzE2MTgsOSBAQAogCWlmIChicC0+Yl9xdWV1ZXRpbWUgPCBqaWZmaWVzIC0gYWdlKQogCQlyZXR1cm47CiAJYnAtPmJfcXVldWV0aW1lID0gamlmZmllcyAtIGFnZTsKLQlzcGluX2xvY2soJmJ0cC0+YnRfZGVsd3JpdGVfbG9jayk7Ci0JbGlzdF9tb3ZlKCZicC0+Yl9saXN0LCAmYnRwLT5idF9kZWx3cml0ZV9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2soJmJ0cC0+YnRfZGVsd3JpdGVfbG9jayk7Ci19Ci0KLVNUQVRJQyB2b2lkCi14ZnNfYnVmX3J1bmFsbF9xdWV1ZXMoCi0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKnF1ZXVlKQotewotCWZsdXNoX3dvcmtxdWV1ZShxdWV1ZSk7CisJc3Bpbl9sb2NrKCZidHAtPmJ0X2RlbHdyaV9sb2NrKTsKKwlsaXN0X21vdmUoJmJwLT5iX2xpc3QsICZidHAtPmJ0X2RlbHdyaV9xdWV1ZSk7CisJc3Bpbl91bmxvY2soJmJ0cC0+YnRfZGVsd3JpX2xvY2spOwogfQogCiAvKgpAQCAtMTY2OSwxNSArMTYzNCwxMyBAQAogCXVuc2lnbmVkIGxvbmcJYWdlKQogewogCXhmc19idWZfdAkqYnAsICpuOwotCXN0cnVjdCBsaXN0X2hlYWQgKmR3cSA9ICZ0YXJnZXQtPmJ0X2RlbHdyaXRlX3F1ZXVlOwotCXNwaW5sb2NrX3QJKmR3bGsgPSAmdGFyZ2V0LT5idF9kZWx3cml0ZV9sb2NrOwogCWludAkJc2tpcHBlZCA9IDA7CiAJaW50CQlmb3JjZTsKIAogCWZvcmNlID0gdGVzdF9hbmRfY2xlYXJfYml0KFhCVF9GT1JDRV9GTFVTSCwgJnRhcmdldC0+YnRfZmxhZ3MpOwogCUlOSVRfTElTVF9IRUFEKGxpc3QpOwotCXNwaW5fbG9jayhkd2xrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sIGR3cSwgYl9saXN0KSB7CisJc3Bpbl9sb2NrKCZ0YXJnZXQtPmJ0X2RlbHdyaV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sICZ0YXJnZXQtPmJ0X2RlbHdyaV9xdWV1ZSwgYl9saXN0KSB7CiAJCUFTU0VSVChicC0+Yl9mbGFncyAmIFhCRl9ERUxXUkkpOwogCiAJCWlmICgheGZzX2J1Zl9pc3Bpbm5lZChicCkgJiYgeGZzX2J1Zl90cnlsb2NrKGJwKSkgewpAQCAtMTY5NCwxMCArMTY1Nyw5IEBACiAJCX0gZWxzZQogCQkJc2tpcHBlZCsrOwogCX0KLQlzcGluX3VubG9jayhkd2xrKTsKIAorCXNwaW5fdW5sb2NrKCZ0YXJnZXQtPmJ0X2RlbHdyaV9sb2NrKTsKIAlyZXR1cm4gc2tpcHBlZDsKLQogfQogCiAvKgpAQCAtMTc0Nyw3ICsxNzA5LDcgQEAKIAkJfQogCiAJCS8qIHNsZWVwIGZvciBhIGxvbmcgdGltZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLwotCQlpZiAobGlzdF9lbXB0eSgmdGFyZ2V0LT5idF9kZWx3cml0ZV9xdWV1ZSkpCisJCWlmIChsaXN0X2VtcHR5KCZ0YXJnZXQtPmJ0X2RlbHdyaV9xdWV1ZSkpCiAJCQl0b3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0b3V0KTsKIApAQCAtMTc4Myw5ICsxNzQ1LDcgQEAKIAlMSVNUX0hFQUQod2FpdF9saXN0KTsKIAlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKIAotCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNjb252ZXJ0ZF93b3JrcXVldWUpOwotCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNkYXRhZF93b3JrcXVldWUpOwotCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNsb2dkX3dvcmtxdWV1ZSk7CisJZmx1c2hfd29ya3F1ZXVlKHhmc2xvZ2Rfd29ya3F1ZXVlKTsKIAogCXNldF9iaXQoWEJUX0ZPUkNFX0ZMVVNILCAmdGFyZ2V0LT5idF9mbGFncyk7CiAJcGluY291bnQgPSB4ZnNfYnVmX2RlbHdyaV9zcGxpdCh0YXJnZXQsICZ0bXBfbGlzdCwgMCk7CkBAIC0xODY2LDExICsxODI2LDMgQEAKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNsb2dkX3dvcmtxdWV1ZSk7CiAJa21lbV96b25lX2Rlc3Ryb3koeGZzX2J1Zl96b25lKTsKIH0KLQotI2lmZGVmIENPTkZJR19LREJfTU9EVUxFUwotc3RydWN0IGxpc3RfaGVhZCAqCi14ZnNfZ2V0X2J1ZnRhcmdfbGlzdCh2b2lkKQotewotCXJldHVybiAmeGZzX2J1ZnRhcmdfbGlzdDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWYuaCBiL2ZzL3hmcy94ZnNfYnVmLmgKaW5kZXggNjIwOTcyYi4uNWJhYjA0NiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWYuaAorKysgYi9mcy94ZnMveGZzX2J1Zi5oCkBAIC0xMDUsOCArMTA1LDggQEAKIAogCS8qIHBlciBkZXZpY2UgZGVsd3JpIHF1ZXVlICovCiAJc3RydWN0IHRhc2tfc3RydWN0CSpidF90YXNrOwotCXN0cnVjdCBsaXN0X2hlYWQJYnRfZGVsd3JpdGVfcXVldWU7Ci0Jc3BpbmxvY2tfdAkJYnRfZGVsd3JpdGVfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJ0X2RlbHdyaV9xdWV1ZTsKKwlzcGlubG9ja190CQlidF9kZWx3cmlfbG9jazsKIAl1bnNpZ25lZCBsb25nCQlidF9mbGFnczsKIAogCS8qIExSVSBjb250cm9sIHN0cnVjdHVyZXMgKi8KQEAgLTE3NSw3ICsxNzUsOCBAQAogZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9yZWFkKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCiAJCQkJeGZzX2J1Zl9mbGFnc190KTsKIAotZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9nZXRfZW1wdHkoc2l6ZV90LCB4ZnNfYnVmdGFyZ190ICopOworc3RydWN0IHhmc19idWYgKnhmc19idWZfYWxsb2Moc3RydWN0IHhmc19idWZ0YXJnICosIHhmc19vZmZfdCwgc2l6ZV90LAorCQkJICAgICAgeGZzX2J1Zl9mbGFnc190KTsKIGV4dGVybiB2b2lkIHhmc19idWZfc2V0X2VtcHR5KHN0cnVjdCB4ZnNfYnVmICpicCwgc2l6ZV90IGxlbik7CiBleHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX2dldF91bmNhY2hlZChzdHJ1Y3QgeGZzX2J1ZnRhcmcgKiwgc2l6ZV90LCBpbnQpOwogZXh0ZXJuIGludCB4ZnNfYnVmX2Fzc29jaWF0ZV9tZW1vcnkoeGZzX2J1Zl90ICosIHZvaWQgKiwgc2l6ZV90KTsKQEAgLTE5NywxNCArMTk4LDE0IEBACiAJKChicCktPmJfc2VtYS5jb3VudCA8PSAwKQogCiAvKiBCdWZmZXIgUmVhZCBhbmQgV3JpdGUgUm91dGluZXMgKi8KLWV4dGVybiBpbnQgeGZzX2J3cml0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgc3RydWN0IHhmc19idWYgKmJwKTsKLWV4dGVybiB2b2lkIHhmc19iZHdyaXRlKHZvaWQgKm1wLCB4ZnNfYnVmX3QgKmJwKTsKK2V4dGVybiBpbnQgeGZzX2J3cml0ZShzdHJ1Y3QgeGZzX2J1ZiAqYnApOwogCiBleHRlcm4gdm9pZCB4ZnNiZHN0cmF0KHN0cnVjdCB4ZnNfbW91bnQgKiwgc3RydWN0IHhmc19idWYgKik7CiBleHRlcm4gaW50IHhmc19iZHN0cmF0X2NiKHN0cnVjdCB4ZnNfYnVmICopOwogCiBleHRlcm4gdm9pZCB4ZnNfYnVmX2lvZW5kKHhmc19idWZfdCAqLAlpbnQpOwogZXh0ZXJuIHZvaWQgeGZzX2J1Zl9pb2Vycm9yKHhmc19idWZfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KHN0cnVjdCB4ZnNfYnVmICosIGNvbnN0IGNoYXIgKmZ1bmMpOwogZXh0ZXJuIGludCB4ZnNfYnVmX2lvcmVxdWVzdCh4ZnNfYnVmX3QgKik7CiBleHRlcm4gaW50IHhmc19idWZfaW93YWl0KHhmc19idWZfdCAqKTsKIGV4dGVybiB2b2lkIHhmc19idWZfaW9tb3ZlKHhmc19idWZfdCAqLCBzaXplX3QsIHNpemVfdCwgdm9pZCAqLApAQCAtMjIxLDM4ICsyMjIsMjIgQEAKIGV4dGVybiB4ZnNfY2FkZHJfdCB4ZnNfYnVmX29mZnNldCh4ZnNfYnVmX3QgKiwgc2l6ZV90KTsKIAogLyogRGVsYXllZCBXcml0ZSBCdWZmZXIgUm91dGluZXMgKi8KLWV4dGVybiB2b2lkIHhmc19idWZfZGVsd3JpX2RlcXVldWUoeGZzX2J1Zl90ICopOwotZXh0ZXJuIHZvaWQgeGZzX2J1Zl9kZWx3cmlfcHJvbW90ZSh4ZnNfYnVmX3QgKik7CitleHRlcm4gdm9pZCB4ZnNfYnVmX2RlbHdyaV9xdWV1ZShzdHJ1Y3QgeGZzX2J1ZiAqKTsKK2V4dGVybiB2b2lkIHhmc19idWZfZGVsd3JpX2RlcXVldWUoc3RydWN0IHhmc19idWYgKik7CitleHRlcm4gdm9pZCB4ZnNfYnVmX2RlbHdyaV9wcm9tb3RlKHN0cnVjdCB4ZnNfYnVmICopOwogCiAvKiBCdWZmZXIgRGFlbW9uIFNldHVwIFJvdXRpbmVzICovCiBleHRlcm4gaW50IHhmc19idWZfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHhmc19idWZfdGVybWluYXRlKHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgoteGZzX2J1Zl90YXJnZXRfbmFtZShzdHJ1Y3QgeGZzX2J1ZnRhcmcgKnRhcmdldCkKLXsKLQlzdGF0aWMgY2hhciBfX2JbQkRFVk5BTUVfU0laRV07Ci0KLQlyZXR1cm4gYmRldm5hbWUodGFyZ2V0LT5idF9iZGV2LCBfX2IpOwotfQotCi0KICNkZWZpbmUgWEZTX0JVRl9aRVJPRkxBR1MoYnApIFwKIAkoKGJwKS0+Yl9mbGFncyAmPSB+KFhCRl9SRUFEfFhCRl9XUklURXxYQkZfQVNZTkN8WEJGX0RFTFdSSXwgXAogCQkJICAgIFhCRl9TWU5DSU98WEJGX0ZVQXxYQkZfRkxVU0gpKQogCiB2b2lkIHhmc19idWZfc3RhbGUoc3RydWN0IHhmc19idWYgKmJwKTsKLSNkZWZpbmUgWEZTX0JVRl9TVEFMRShicCkJeGZzX2J1Zl9zdGFsZShicCk7CiAjZGVmaW5lIFhGU19CVUZfVU5TVEFMRShicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9TVEFMRSkKICNkZWZpbmUgWEZTX0JVRl9JU1NUQUxFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9TVEFMRSkKLSNkZWZpbmUgWEZTX0JVRl9TVVBFUl9TVEFMRShicCkJZG8gewkJCQlcCi0JCQkJCVhGU19CVUZfU1RBTEUoYnApOwlcCi0JCQkJCXhmc19idWZfZGVsd3JpX2RlcXVldWUoYnApOwlcCi0JCQkJCVhGU19CVUZfRE9ORShicCk7CVwKLQkJCQl9IHdoaWxlICgwKQogCi0jZGVmaW5lIFhGU19CVUZfREVMQVlXUklURShicCkJCSgoYnApLT5iX2ZsYWdzIHw9IFhCRl9ERUxXUkkpCi0jZGVmaW5lIFhGU19CVUZfVU5ERUxBWVdSSVRFKGJwKQl4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKGJwKQogI2RlZmluZSBYRlNfQlVGX0lTREVMQVlXUklURShicCkJKChicCktPmJfZmxhZ3MgJiBYQkZfREVMV1JJKQogCiAjZGVmaW5lIFhGU19CVUZfRE9ORShicCkJKChicCktPmJfZmxhZ3MgfD0gWEJGX0RPTkUpCkBAIC0yODAsMjMgKzI2NSwxNiBAQAogI2RlZmluZSBYRlNfQlVGX1NJWkUoYnApCQkoKGJwKS0+Yl9idWZmZXJfbGVuZ3RoKQogI2RlZmluZSBYRlNfQlVGX1NFVF9TSVpFKGJwLCBjbnQpCSgoYnApLT5iX2J1ZmZlcl9sZW5ndGggPSAoY250KSkKIAotc3RhdGljIGlubGluZSB2b2lkCi14ZnNfYnVmX3NldF9yZWYoCi0Jc3RydWN0IHhmc19idWYJKmJwLAotCWludAkJbHJ1X3JlZikKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfYnVmX3NldF9yZWYoc3RydWN0IHhmc19idWYgKmJwLCBpbnQgbHJ1X3JlZikKIHsKIAlhdG9taWNfc2V0KCZicC0+Yl9scnVfcmVmLCBscnVfcmVmKTsKIH0KLSNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCB0eXBlLCByZWYpCXhmc19idWZfc2V0X3JlZihicCwgcmVmKQotI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRShicCwgdHlwZSkJCWRvIHsgfSB3aGlsZSAoMCkKIAogc3RhdGljIGlubGluZSBpbnQgeGZzX2J1Zl9pc3Bpbm5lZChzdHJ1Y3QgeGZzX2J1ZiAqYnApCiB7CiAJcmV0dXJuIGF0b21pY19yZWFkKCZicC0+Yl9waW5fY291bnQpOwogfQogCi0jZGVmaW5lIFhGU19CVUZfRklOSVNIX0lPV0FJVChicCkJY29tcGxldGUoJmJwLT5iX2lvd2FpdCk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfYnVmX3JlbHNlKHhmc19idWZfdCAqYnApCiB7CiAJeGZzX2J1Zl91bmxvY2soYnApOwpAQCAtMzEzLDE0ICsyOTEsNyBAQAogZXh0ZXJuIGludCB4ZnNfc2V0c2l6ZV9idWZ0YXJnKHhmc19idWZ0YXJnX3QgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCB4ZnNfZmx1c2hfYnVmdGFyZyh4ZnNfYnVmdGFyZ190ICosIGludCk7CiAKLSNpZmRlZiBDT05GSUdfS0RCX01PRFVMRVMKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkICp4ZnNfZ2V0X2J1ZnRhcmdfbGlzdCh2b2lkKTsKLSNlbmRpZgotCiAjZGVmaW5lIHhmc19nZXRzaXplX2J1ZnRhcmcoYnVmdGFyZykJYmxvY2tfc2l6ZSgoYnVmdGFyZyktPmJ0X2JkZXYpCiAjZGVmaW5lIHhmc19yZWFkb25seV9idWZ0YXJnKGJ1ZnRhcmcpCWJkZXZfcmVhZF9vbmx5KChidWZ0YXJnKS0+YnRfYmRldikKIAotI2RlZmluZSB4ZnNfYmludmFsKGJ1ZnRhcmcpCQl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQotI2RlZmluZSBYRlNfYmZsdXNoKGJ1ZnRhcmcpCQl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQotCiAjZW5kaWYJLyogX19YRlNfQlVGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWZfaXRlbS5jIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCmluZGV4IGVmNDNmY2UuLmVhYzk3ZWYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKQEAgLTY1Niw3ICs2NTYsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIG9wcyB2ZWN0b3Igc2hhcmVkIGJ5IGFsbCBidWYgbG9nIGl0ZW1zLgogICovCi1zdGF0aWMgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfYnVmX2l0ZW1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2J1Zl9pdGVtX29wcyA9IHsKIAkuaW9wX3NpemUJPSB4ZnNfYnVmX2l0ZW1fc2l6ZSwKIAkuaW9wX2Zvcm1hdAk9IHhmc19idWZfaXRlbV9mb3JtYXQsCiAJLmlvcF9waW4JPSB4ZnNfYnVmX2l0ZW1fcGluLApAQCAtOTY3LDcgKzk2Nyw4IEBACiAJICogSS9PIGVycm9ycywgdGhlcmUncyBubyBwb2ludCBpbiBnaXZpbmcgdGhpcyBhIHJldHJ5LgogCSAqLwogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQlYRlNfQlVGX1NVUEVSX1NUQUxFKGJwKTsKKwkJeGZzX2J1Zl9zdGFsZShicCk7CisJCVhGU19CVUZfRE9ORShicCk7CiAJCXRyYWNlX3hmc19idWZfaXRlbV9pb2RvbmUoYnAsIF9SRVRfSVBfKTsKIAkJZ290byBkb19jYWxsYmFja3M7CiAJfQpAQCAtOTc1LDkgKzk3Niw3IEBACiAJaWYgKGJwLT5iX3RhcmdldCAhPSBsYXN0dGFyZyB8fAogCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIChsYXN0dGltZSArIDUqSFopKSkgewogCQlsYXN0dGltZSA9IGppZmZpZXM7Ci0JCXhmc19hbGVydChtcCwgIkRldmljZSAlczogbWV0YWRhdGEgd3JpdGUgZXJyb3IgYmxvY2sgMHglbGx4IiwKLQkJCXhmc19idWZfdGFyZ2V0X25hbWUoYnAtPmJfdGFyZ2V0KSwKLQkJICAgICAgKF9fdWludDY0X3QpWEZTX0JVRl9BRERSKGJwKSk7CisJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgX19mdW5jX18pOwogCX0KIAlsYXN0dGFyZyA9IGJwLT5iX3RhcmdldDsKIApAQCAtOTkzLDcgKzk5Miw3IEBACiAJCXhmc19idWZfaW9lcnJvcihicCwgMCk7IC8qIGVycm5vIG9mIDAgdW5zZXRzIHRoZSBmbGFnICovCiAKIAkJaWYgKCFYRlNfQlVGX0lTU1RBTEUoYnApKSB7Ci0JCQlYRlNfQlVGX0RFTEFZV1JJVEUoYnApOworCQkJeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnApOwogCQkJWEZTX0JVRl9ET05FKGJwKTsKIAkJfQogCQlBU1NFUlQoYnAtPmJfaW9kb25lICE9IE5VTEwpOwpAQCAtMTAwNiw5ICsxMDA1LDggQEAKIAkgKiBJZiB0aGUgd3JpdGUgb2YgdGhlIGJ1ZmZlciB3YXMgc3luY2hyb25vdXMsIHdlIHdhbnQgdG8gbWFrZQogCSAqIHN1cmUgdG8gcmV0dXJuIHRoZSBlcnJvciB0byB0aGUgY2FsbGVyIG9mIHhmc19id3JpdGUoKS4KIAkgKi8KLQlYRlNfQlVGX1NUQUxFKGJwKTsKKwl4ZnNfYnVmX3N0YWxlKGJwKTsKIAlYRlNfQlVGX0RPTkUoYnApOwotCVhGU19CVUZfVU5ERUxBWVdSSVRFKGJwKTsKIAogCXRyYWNlX3hmc19idWZfZXJyb3JfcmVsc2UoYnAsIF9SRVRfSVBfKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kYV9idHJlZS5jIGIvZnMveGZzL3hmc19kYV9idHJlZS5jCmluZGV4IGVlOWQ1NDIuLjc3Yzc0MjUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYworKysgYi9mcy94ZnMveGZzX2RhX2J0cmVlLmMKQEAgLTE1NzgsOSArMTU3OCw4IEBACiAJICovCiAJbm1hcCA9IDE7CiAJQVNTRVJUKGFyZ3MtPmZpcnN0YmxvY2sgIT0gTlVMTCk7Ci0JZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLCAqYm5vLCBjb3VudCwKLQkJCXhmc19ibWFwaV9hZmxhZyh3KXxYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX01FVEFEQVRBfAotCQkJWEZTX0JNQVBJX0NPTlRJRywKKwllcnJvciA9IHhmc19ibWFwaV93cml0ZSh0cCwgZHAsICpibm8sIGNvdW50LAorCQkJeGZzX2JtYXBpX2FmbGFnKHcpfFhGU19CTUFQSV9NRVRBREFUQXxYRlNfQk1BUElfQ09OVElHLAogCQkJYXJncy0+Zmlyc3RibG9jaywgYXJncy0+dG90YWwsICZtYXAsICZubWFwLAogCQkJYXJncy0+Zmxpc3QpOwogCWlmIChlcnJvcikKQEAgLTE2MDIsOSArMTYwMSw4IEBACiAJCWZvciAoYiA9ICpibm8sIG1hcGkgPSAwOyBiIDwgKmJubyArIGNvdW50OyApIHsKIAkJCW5tYXAgPSBNSU4oWEZTX0JNQVBfTUFYX05NQVAsIGNvdW50KTsKIAkJCWMgPSAoaW50KSgqYm5vICsgY291bnQgLSBiKTsKLQkJCWVycm9yID0geGZzX2JtYXBpKHRwLCBkcCwgYiwgYywKLQkJCQkJeGZzX2JtYXBpX2FmbGFnKHcpfFhGU19CTUFQSV9XUklURXwKLQkJCQkJWEZTX0JNQVBJX01FVEFEQVRBLAorCQkJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUodHAsIGRwLCBiLCBjLAorCQkJCQl4ZnNfYm1hcGlfYWZsYWcodyl8WEZTX0JNQVBJX01FVEFEQVRBLAogCQkJCQlhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT50b3RhbCwKIAkJCQkJJm1hcHBbbWFwaV0sICZubWFwLCBhcmdzLT5mbGlzdCk7CiAJCQlpZiAoZXJyb3IpCkBAIC0xOTc1LDMzICsxOTczLDE2IEBACiAJCS8qCiAJCSAqIE9wdGltaXplIHRoZSBvbmUtYmxvY2sgY2FzZS4KIAkJICovCi0JCWlmIChuZnNiID09IDEpIHsKLQkJCXhmc19mc2Jsb2NrX3QJZnNiOwotCi0JCQlpZiAoKGVycm9yID0KLQkJCSAgICB4ZnNfYm1hcGlfc2luZ2xlKHRyYW5zLCBkcCwgd2hpY2hmb3JrLCAmZnNiLAotCQkJCSAgICAoeGZzX2ZpbGVvZmZfdClibm8pKSkgewotCQkJCXJldHVybiBlcnJvcjsKLQkJCX0KKwkJaWYgKG5mc2IgPT0gMSkKIAkJCW1hcHAgPSAmbWFwOwotCQkJaWYgKGZzYiA9PSBOVUxMRlNCTE9DSykgewotCQkJCW5tYXAgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQltYXAuYnJfc3RhcnRibG9jayA9IGZzYjsKLQkJCQltYXAuYnJfc3RhcnRvZmYgPSAoeGZzX2ZpbGVvZmZfdClibm87Ci0JCQkJbWFwLmJyX2Jsb2NrY291bnQgPSAxOwotCQkJCW5tYXAgPSAxOwotCQkJfQotCQl9IGVsc2UgeworCQllbHNlCiAJCQltYXBwID0ga21lbV9hbGxvYyhzaXplb2YoKm1hcHApICogbmZzYiwgS01fU0xFRVApOwotCQkJbm1hcCA9IG5mc2I7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRyYW5zLCBkcCwgKHhmc19maWxlb2ZmX3QpYm5vLAotCQkJCQluZnNiLAotCQkJCQlYRlNfQk1BUElfTUVUQURBVEEgfAotCQkJCQkJeGZzX2JtYXBpX2FmbGFnKHdoaWNoZm9yayksCi0JCQkJCU5VTEwsIDAsIG1hcHAsICZubWFwLCBOVUxMKSkpCi0JCQkJZ290byBleGl0MDsKLQkJfQorCisJCW5tYXAgPSBuZnNiOworCQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGRwLCAoeGZzX2ZpbGVvZmZfdClibm8sIG5mc2IsIG1hcHAsCisJCQkJICAgICAgICZubWFwLCB4ZnNfYm1hcGlfYWZsYWcod2hpY2hmb3JrKSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXhpdDA7CiAJfSBlbHNlIHsKIAkJbWFwLmJyX3N0YXJ0YmxvY2sgPSBYRlNfREFERFJfVE9fRlNCKG1wLCBtYXBwZWRibm8pOwogCQltYXAuYnJfc3RhcnRvZmYgPSAoeGZzX2ZpbGVvZmZfdClibm87CkBAIC0yMDcyLDEzICsyMDUzLDEwIEBACiAJCWlmICghYnApCiAJCQljb250aW51ZTsKIAkJaWYgKGNhbGxlciA9PSAxKSB7Ci0JCQlpZiAod2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUkspIHsKLQkJCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfQVRUUl9CVFJFRSwKLQkJCQkJCVhGU19BVFRSX0JUUkVFX1JFRik7Ci0JCQl9IGVsc2UgewotCQkJCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19ESVJfQlRSRUUsCi0JCQkJCQlYRlNfRElSX0JUUkVFX1JFRik7Ci0JCQl9CisJCQlpZiAod2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUkspCisJCQkJeGZzX2J1Zl9zZXRfcmVmKGJwLCBYRlNfQVRUUl9CVFJFRV9SRUYpOworCQkJZWxzZQorCQkJCXhmc19idWZfc2V0X3JlZihicCwgWEZTX0RJUl9CVFJFRV9SRUYpOwogCQl9CiAJCWlmIChicGxpc3QpIHsKIAkJCWJwbGlzdFtuYnBsaXN0KytdID0gYnA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RmcmFnLmMgYi9mcy94ZnMveGZzX2RmcmFnLmMKaW5kZXggOWE4NGE4NS4uNjU0ZGM2ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kZnJhZy5jCisrKyBiL2ZzL3hmcy94ZnNfZGZyYWcuYwpAQCAtNDI1LDggKzQyNSw4IEBACiAJfQogCiAKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwotCXhmc190cmFuc19pam9pbl9yZWYodHAsIHRpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHRpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwogCiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsICBpbGZfZmllbGRzKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCB0aXAsIHRpbGZfZmllbGRzKTsKQEAgLTQzOCw3ICs0MzgsNyBAQAogCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykKIAkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKIAotCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1NXQVBFWFQpOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7CiAKIAl0cmFjZV94ZnNfc3dhcF9leHRlbnRfYWZ0ZXIoaXAsIDApOwogCXRyYWNlX3hmc19zd2FwX2V4dGVudF9hZnRlcih0aXAsIDEpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmMKaW5kZXggY2EyMzg2ZC4uNjZlMTA4ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX2xlYWYuYworKysgYi9mcy94ZnMveGZzX2RpcjJfbGVhZi5jCkBAIC04ODgsMTIgKzg4OCwxMCBAQAogCQkJCSAqIHdlIGFscmVhZHkgaGF2ZSBpbiB0aGUgdGFibGUuCiAJCQkJICovCiAJCQkJbm1hcCA9IG1hcF9zaXplIC0gbWFwX3ZhbGlkOwotCQkJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGRwLAotCQkJCQltYXBfb2ZmLAorCQkJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoZHAsIG1hcF9vZmYsCiAJCQkJCXhmc19kaXIyX2J5dGVfdG9fZGEobXAsCiAJCQkJCQlYRlNfRElSMl9MRUFGX09GRlNFVCkgLSBtYXBfb2ZmLAotCQkJCQlYRlNfQk1BUElfTUVUQURBVEEsIE5VTEwsIDAsCi0JCQkJCSZtYXBbbWFwX3ZhbGlkXSwgJm5tYXAsIE5VTEwpOworCQkJCQkmbWFwW21hcF92YWxpZF0sICZubWFwLCAwKTsKIAkJCQkvKgogCQkJCSAqIERvbid0IGtub3cgaWYgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIG9yCiAJCQkJICogdHJ5IHRvIHJldHVybiBhbiBlcnJvci4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlzY2FyZC5jIGIvZnMveGZzL3hmc19kaXNjYXJkLmMKaW5kZXggMjQ0ZTc5Ny4uOGEyNGYwYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXNjYXJkLmMKKysrIGIvZnMveGZzL3hmc19kaXNjYXJkLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAl4ZnNfYWdudW1iZXJfdAkJYWdubywKIAl4ZnNfZnNibG9ja190CQlzdGFydCwKLQl4ZnNfZnNibG9ja190CQlsZW4sCisJeGZzX2ZzYmxvY2tfdAkJZW5kLAogCXhmc19mc2Jsb2NrX3QJCW1pbmxlbiwKIAlfX3VpbnQ2NF90CQkqYmxvY2tzX3RyaW1tZWQpCiB7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJICogZG93biBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgcmFuZ2VzIGZvciBub3cuCiAJCSAqLwogCQlpZiAoWEZTX0FHQl9UT19GU0IobXAsIGFnbm8sIGZibm8pICsgZmxlbiA8IHN0YXJ0IHx8Ci0JCSAgICBYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywgZmJubykgPj0gc3RhcnQgKyBsZW4pIHsKKwkJICAgIFhGU19BR0JfVE9fRlNCKG1wLCBhZ25vLCBmYm5vKSA+IGVuZCkgewogCQkJdHJhY2VfeGZzX2Rpc2NhcmRfZXhjbHVkZShtcCwgYWdubywgZmJubywgZmxlbik7CiAJCQlnb3RvIG5leHRfZXh0ZW50OwogCQl9CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZQkqcSA9IG1wLT5tX2RkZXZfdGFyZ3AtPmJ0X2JkZXYtPmJkX2Rpc2stPnF1ZXVlOwogCXVuc2lnbmVkIGludAkJZ3JhbnVsYXJpdHkgPSBxLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eTsKIAlzdHJ1Y3QgZnN0cmltX3JhbmdlCXJhbmdlOwotCXhmc19mc2Jsb2NrX3QJCXN0YXJ0LCBsZW4sIG1pbmxlbjsKKwl4ZnNfZnNibG9ja190CQlzdGFydCwgZW5kLCBtaW5sZW47CiAJeGZzX2FnbnVtYmVyX3QJCXN0YXJ0X2Fnbm8sIGVuZF9hZ25vLCBhZ25vOwogCV9fdWludDY0X3QJCWJsb2Nrc190cmltbWVkID0gMDsKIAlpbnQJCQllcnJvciwgbGFzdF9lcnJvciA9IDA7CkBAIC0xNjUsMTkgKzE2NSwxOSBAQAogCSAqIG1hdHRlciBhcyB0cmltbWluZyBibG9ja3MgaXMgYW4gYWR2aXNvcnkgaW50ZXJmYWNlLgogCSAqLwogCXN0YXJ0ID0gWEZTX0JfVE9fRlNCVChtcCwgcmFuZ2Uuc3RhcnQpOwotCWxlbiA9IFhGU19CX1RPX0ZTQlQobXAsIHJhbmdlLmxlbik7CisJZW5kID0gc3RhcnQgKyBYRlNfQl9UT19GU0JUKG1wLCByYW5nZS5sZW4pIC0gMTsKIAltaW5sZW4gPSBYRlNfQl9UT19GU0IobXAsIG1heF90KHU2NCwgZ3JhbnVsYXJpdHksIHJhbmdlLm1pbmxlbikpOwogCi0Jc3RhcnRfYWdubyA9IFhGU19GU0JfVE9fQUdOTyhtcCwgc3RhcnQpOwotCWlmIChzdGFydF9hZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQpCisJaWYgKHN0YXJ0ID49IG1wLT5tX3NiLnNiX2RibG9ja3MpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisJaWYgKGVuZCA+IG1wLT5tX3NiLnNiX2RibG9ja3MgLSAxKQorCQllbmQgPSBtcC0+bV9zYi5zYl9kYmxvY2tzIC0gMTsKIAotCWVuZF9hZ25vID0gWEZTX0ZTQl9UT19BR05PKG1wLCBzdGFydCArIGxlbik7Ci0JaWYgKGVuZF9hZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQpCi0JCWVuZF9hZ25vID0gbXAtPm1fc2Iuc2JfYWdjb3VudCAtIDE7CisJc3RhcnRfYWdubyA9IFhGU19GU0JfVE9fQUdOTyhtcCwgc3RhcnQpOworCWVuZF9hZ25vID0gWEZTX0ZTQl9UT19BR05PKG1wLCBlbmQpOwogCiAJZm9yIChhZ25vID0gc3RhcnRfYWdubzsgYWdubyA8PSBlbmRfYWdubzsgYWdubysrKSB7Ci0JCWVycm9yID0gLXhmc190cmltX2V4dGVudHMobXAsIGFnbm8sIHN0YXJ0LCBsZW4sIG1pbmxlbiwKKwkJZXJyb3IgPSAteGZzX3RyaW1fZXh0ZW50cyhtcCwgYWdubywgc3RhcnQsIGVuZCwgbWlubGVuLAogCQkJCQkgICZibG9ja3NfdHJpbW1lZCk7CiAJCWlmIChlcnJvcikKIAkJCWxhc3RfZXJyb3IgPSBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZHF1b3QuYyBiL2ZzL3hmcy94ZnNfZHF1b3QuYwppbmRleCBkYjYyOTU5Li4yNWQ3MjgwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RxdW90LmMKKysrIGIvZnMveGZzL3hmc19kcXVvdC5jCkBAIC0zNzcsMTYgKzM3NywxNCBAQAogCQlyZXR1cm4gKEVTUkNIKTsKIAl9CiAKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBxdW90aXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHF1b3RpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCW5tYXBzID0gMTsKLQlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBxdW90aXAsCi0JCQkgICAgICBvZmZzZXRfZnNiLCBYRlNfRFFVT1RfQ0xVU1RFUl9TSVpFX0ZTQiwKLQkJCSAgICAgIFhGU19CTUFQSV9NRVRBREFUQSB8IFhGU19CTUFQSV9XUklURSwKLQkJCSAgICAgICZmaXJzdGJsb2NrLAotCQkJICAgICAgWEZTX1FNX0RRQUxMT0NfU1BBQ0VfUkVTKG1wKSwKLQkJCSAgICAgICZtYXAsICZubWFwcywgJmZsaXN0KSkpIHsKKwllcnJvciA9IHhmc19ibWFwaV93cml0ZSh0cCwgcXVvdGlwLCBvZmZzZXRfZnNiLAorCQkJCVhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCLCBYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJJmZpcnN0YmxvY2ssIFhGU19RTV9EUUFMTE9DX1NQQUNFX1JFUyhtcCksCisJCQkJJm1hcCwgJm5tYXBzLCAmZmxpc3QpOworCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjA7Ci0JfQogCUFTU0VSVChtYXAuYnJfYmxvY2tjb3VudCA9PSBYRlNfRFFVT1RfQ0xVU1RFUl9TSVpFX0ZTQik7CiAJQVNTRVJUKG5tYXBzID09IDEpOwogCUFTU0VSVCgobWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSAmJgpAQCAtNDAyLDggKzQwMCwxMSBAQAogCQkJICAgICAgIGRxcC0+cV9ibGtubywKIAkJCSAgICAgICBtcC0+bV9xdW90YWluZm8tPnFpX2RxY2h1bmtsZW4sCiAJCQkgICAgICAgMCk7Ci0JaWYgKCFicCB8fCAoZXJyb3IgPSB4ZnNfYnVmX2dldGVycm9yKGJwKSkpCisKKwllcnJvciA9IHhmc19idWZfZ2V0ZXJyb3IoYnApOworCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjE7CisKIAkvKgogCSAqIE1ha2UgYSBjaHVuayBvZiBkcXVvdHMgb3V0IG9mIHRoaXMgYnVmZmVyIGFuZCBsb2cKIAkgKiB0aGUgZW50aXJlIHRoaW5nLgpAQCAtNDg1LDkgKzQ4Niw4IEBACiAJLyoKIAkgKiBGaW5kIHRoZSBibG9jayBtYXA7IG5vIGFsbG9jYXRpb25zIHlldAogCSAqLwotCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIHF1b3RpcCwgZHFwLT5xX2ZpbGVvZmZzZXQsCi0JCQkgIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCLCBYRlNfQk1BUElfTUVUQURBVEEsCi0JCQkgIE5VTEwsIDAsICZtYXAsICZubWFwcywgTlVMTCk7CisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChxdW90aXAsIGRxcC0+cV9maWxlb2Zmc2V0LAorCQkJICAgICAgIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCLCAmbWFwLCAmbm1hcHMsIDApOwogCiAJeGZzX2l1bmxvY2socXVvdGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAlpZiAoZXJyb3IpCkBAIC02MDUsNyArNjA1LDcgQEAKIAlkcXAtPnFfcmVzX3J0YmNvdW50ID0gYmU2NF90b19jcHUoZGRxcC0+ZF9ydGJjb3VudCk7CiAKIAkvKiBNYXJrIHRoZSBidWYgc28gdGhhdCB0aGlzIHdpbGwgc3RheSBpbmNvcmUgYSBsaXR0bGUgbG9uZ2VyICovCi0JWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0RRVU9ULCBYRlNfRFFVT1RfUkVGKTsKKwl4ZnNfYnVmX3NldF9yZWYoYnAsIFhGU19EUVVPVF9SRUYpOwogCiAJLyoKIAkgKiBXZSBnb3QgdGhlIGJ1ZmZlciB3aXRoIGEgeGZzX3RyYW5zX3JlYWRfYnVmKCkgKGluIGRxdG9icCgpKQpAQCAtMTI0Miw5ICsxMjQyLDExIEBACiAJfQogCiAJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQotCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKIAllbHNlCi0JCXhmc19iZHdyaXRlKG1wLCBicCk7CisJCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKKworCXhmc19idWZfcmVsc2UoYnApOwogCiAJdHJhY2VfeGZzX2RxZmx1c2hfZG9uZShkcXApOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RxdW90X2l0ZW0uYyBiL2ZzL3hmcy94ZnNfZHF1b3RfaXRlbS5jCmluZGV4IGJiM2Y3MWQuLjBkZWUwYjcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZHF1b3RfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfZHF1b3RfaXRlbS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIC8qCiAgKiBUaGlzIGlzIHRoZSBvcHMgdmVjdG9yIGZvciBkcXVvdHMKICAqLwotc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2RxdW90X2l0ZW1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2RxdW90X2l0ZW1fb3BzID0gewogCS5pb3Bfc2l6ZQk9IHhmc19xbV9kcXVvdF9sb2dpdGVtX3NpemUsCiAJLmlvcF9mb3JtYXQJPSB4ZnNfcW1fZHF1b3RfbG9naXRlbV9mb3JtYXQsCiAJLmlvcF9waW4JPSB4ZnNfcW1fZHF1b3RfbG9naXRlbV9waW4sCkBAIC00ODMsNyArNDgzLDcgQEAKIHsKIH0KIAotc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX3FtX3FvZmZlbmRfbG9naXRlbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfcW1fcW9mZmVuZF9sb2dpdGVtX29wcyA9IHsKIAkuaW9wX3NpemUJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX3NpemUsCiAJLmlvcF9mb3JtYXQJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX2Zvcm1hdCwKIAkuaW9wX3Bpbgk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fcGluLApAQCAtNDk4LDcgKzQ5OCw3IEBACiAvKgogICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIHF1b3Rhb2ZmLXN0YXJ0IGxvZyBpdGVtcy4KICAqLwotc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX3FtX3FvZmZfbG9naXRlbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfcW1fcW9mZl9sb2dpdGVtX29wcyA9IHsKIAkuaW9wX3NpemUJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX3NpemUsCiAJLmlvcF9mb3JtYXQJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX2Zvcm1hdCwKIAkuaW9wX3Bpbgk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fcGluLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19leHBvcnQuYyBiL2ZzL3hmcy94ZnNfZXhwb3J0LmMKaW5kZXggNzVlNWQzMi4uZGExMDg5NyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19leHBvcnQuYworKysgYi9mcy94ZnMveGZzX2V4cG9ydC5jCkBAIC0yMjksMTYgKzIyOSwxNiBAQAogewogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOwogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7Ci0JaW50CQkJZXJyb3IgPSAwOworCXhmc19sc25fdAkJbHNuID0gMDsKIAogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0JaWYgKHhmc19pcGluY291bnQoaXApKSB7Ci0JCWVycm9yID0gX3hmc19sb2dfZm9yY2VfbHNuKG1wLCBpcC0+aV9pdGVtcC0+aWxpX2xhc3RfbHNuLAotCQkJCVhGU19MT0dfU1lOQywgTlVMTCk7Ci0JfQorCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkKKwkJbHNuID0gaXAtPmlfaXRlbXAtPmlsaV9sYXN0X2xzbjsKIAl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAKLQlyZXR1cm4gZXJyb3I7CisJaWYgKCFsc24pCisJCXJldHVybiAwOworCXJldHVybiBfeGZzX2xvZ19mb3JjZV9sc24obXAsIGxzbiwgWEZTX0xPR19TWU5DLCBOVUxMKTsKIH0KIAogY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIHhmc19leHBvcnRfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCmluZGV4IGQyMmU2MjYuLjM1YzJhZmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAvKgogICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIGVmaSBsb2cgaXRlbXMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19lZmlfaXRlbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfZWZpX2l0ZW1fb3BzID0gewogCS5pb3Bfc2l6ZQk9IHhmc19lZmlfaXRlbV9zaXplLAogCS5pb3BfZm9ybWF0CT0geGZzX2VmaV9pdGVtX2Zvcm1hdCwKIAkuaW9wX3Bpbgk9IHhmc19lZmlfaXRlbV9waW4sCkBAIC00NzcsNyArNDc3LDcgQEAKIC8qCiAgKiBUaGlzIGlzIHRoZSBvcHMgdmVjdG9yIHNoYXJlZCBieSBhbGwgZWZkIGxvZyBpdGVtcy4KICAqLwotc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2VmZF9pdGVtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19lZmRfaXRlbV9vcHMgPSB7CiAJLmlvcF9zaXplCT0geGZzX2VmZF9pdGVtX3NpemUsCiAJLmlvcF9mb3JtYXQJPSB4ZnNfZWZkX2l0ZW1fZm9ybWF0LAogCS5pb3BfcGluCT0geGZzX2VmZF9pdGVtX3BpbiwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZmlsZS5jIGIvZnMveGZzL3hmc19maWxlLmMKaW5kZXggN2Y3YjQyNC4uNzUzZWQ5YiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19maWxlLmMKKysrIGIvZnMveGZzL3hmc19maWxlLmMKQEAgLTEyNCw2ICsxMjQsMzUgQEAKIAlyZXR1cm4gKC1zdGF0dXMpOwogfQogCisvKgorICogRnN5bmMgb3BlcmF0aW9ucyBvbiBkaXJlY3RvcmllcyBhcmUgbXVjaCBzaW1wbGVyIHRoYW4gb24gcmVndWxhciBmaWxlcywKKyAqIGFzIHRoZXJlIGlzIG5vIGZpbGUgZGF0YSB0byBmbHVzaCwgYW5kIHRodXMgYWxzbyBubyBuZWVkIGZvciBleHBsaWNpdAorICogY2FjaGUgZmx1c2ggb3BlcmF0aW9ucywgYW5kIHRoZXJlIGFyZSBubyBub24tdHJhbnNhY3Rpb24gbWV0YWRhdGEgdXBkYXRlcworICogb24gZGlyZWN0b3JpZXMgZWl0aGVyLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGlyX2ZzeW5jKAorCXN0cnVjdCBmaWxlCQkqZmlsZSwKKwlsb2ZmX3QJCQlzdGFydCwKKwlsb2ZmX3QJCQllbmQsCisJaW50CQkJZGF0YXN5bmMpCit7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShmaWxlLT5mX21hcHBpbmctPmhvc3QpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJeGZzX2xzbl90CQlsc24gPSAwOworCisJdHJhY2VfeGZzX2Rpcl9mc3luYyhpcCk7CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkKKwkJbHNuID0gaXAtPmlfaXRlbXAtPmlsaV9sYXN0X2xzbjsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwlpZiAoIWxzbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIF94ZnNfbG9nX2ZvcmNlX2xzbihtcCwgbHNuLCBYRlNfTE9HX1NZTkMsIE5VTEwpOworfQorCiBTVEFUSUMgaW50CiB4ZnNfZmlsZV9mc3luYygKIAlzdHJ1Y3QgZmlsZQkJKmZpbGUsCkBAIC0xMzcsNiArMTY2LDcgQEAKIAlzdHJ1Y3QgeGZzX3RyYW5zCSp0cDsKIAlpbnQJCQllcnJvciA9IDA7CiAJaW50CQkJbG9nX2ZsdXNoZWQgPSAwOworCXhmc19sc25fdAkJbHNuID0gMDsKIAogCXRyYWNlX3hmc19maWxlX2ZzeW5jKGlwKTsKIApAQCAtMTQ5LDEwICsxNzksNiBAQAogCiAJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lUUlVOQ0FURUQpOwogCi0JeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7Ci0JeGZzX2lvZW5kX3dhaXQoaXApOwotCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7Ci0KIAlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikgewogCQkvKgogCQkgKiBJZiB3ZSBoYXZlIGFuIFJUIGFuZC9vciBsb2cgc3Vidm9sdW1lIHdlIG5lZWQgdG8gbWFrZSBzdXJlCkBAIC0yMTYsMTEgKzI0MiwxMSBAQAogCQkgKiB0cmFuc2FjdGlvbi4JIFNvIHdlIHBsYXkgaXQgc2FmZSBhbmQgZmlyZSBvZmYgdGhlCiAJCSAqIHRyYW5zYWN0aW9uIGFueXdheS4KIAkJICovCi0JCXhmc190cmFuc19pam9pbih0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwotCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOwotCQllcnJvciA9IF94ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCAmbG9nX2ZsdXNoZWQpOworCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDApOwogCisJCWxzbiA9IGlwLT5pX2l0ZW1wLT5pbGlfbGFzdF9sc247CiAJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJfSBlbHNlIHsKIAkJLyoKQEAgLTIzMSwxNCArMjU3LDE0IEBACiAJCSAqIGRpc2sgeWV0LCB0aGUgaW5vZGUgd2lsbCBiZSBzdGlsbCBiZSBwaW5uZWQuICBJZiBpdCBpcywKIAkJICogZm9yY2UgdGhlIGxvZy4KIAkJICovCi0JCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkgewotCQkJZXJyb3IgPSBfeGZzX2xvZ19mb3JjZV9sc24obXAsCi0JCQkJCWlwLT5pX2l0ZW1wLT5pbGlfbGFzdF9sc24sCi0JCQkJCVhGU19MT0dfU1lOQywgJmxvZ19mbHVzaGVkKTsKLQkJfQorCQlpZiAoeGZzX2lwaW5jb3VudChpcCkpCisJCQlsc24gPSBpcC0+aV9pdGVtcC0+aWxpX2xhc3RfbHNuOwogCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAJfQogCisJaWYgKCFlcnJvciAmJiBsc24pCisJCWVycm9yID0gX3hmc19sb2dfZm9yY2VfbHNuKG1wLCBsc24sIFhGU19MT0dfU1lOQywgJmxvZ19mbHVzaGVkKTsKKwogCS8qCiAJICogSWYgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGRldmljZSwgYW5kIHRoZSBsb2cgZm9yY2UgYWJvdXQgd2FzCiAJICogYSBuby1vcCB3ZSBtaWdodCBoYXZlIHRvIGZsdXNoIHRoZSBkYXRhIGRldmljZSBjYWNoZSBoZXJlLgpAQCAtMzE3LDcgKzM0MywxOSBAQAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAodW5saWtlbHkoaW9mbGFncyAmIElPX0lTRElSRUNUKSkgeworCS8qCisJICogTG9ja2luZyBpcyBhIGJpdCB0cmlja3kgaGVyZS4gSWYgd2UgdGFrZSBhbiBleGNsdXNpdmUgbG9jaworCSAqIGZvciBkaXJlY3QgSU8sIHdlIGVmZmVjdGl2ZWx5IHNlcmlhbGlzZSBhbGwgbmV3IGNvbmN1cnJlbnQKKwkgKiByZWFkIElPIHRvIHRoaXMgZmlsZSBhbmQgYmxvY2sgaXQgYmVoaW5kIElPIHRoYXQgaXMgY3VycmVudGx5IGluCisJICogcHJvZ3Jlc3MgYmVjYXVzZSBJTyBpbiBwcm9ncmVzcyBob2xkcyB0aGUgSU8gbG9jayBzaGFyZWQuIFdlIG9ubHkKKwkgKiBuZWVkIHRvIGhvbGQgdGhlIGxvY2sgZXhjbHVzaXZlIHRvIGJsb3cgYXdheSB0aGUgcGFnZSBjYWNoZSwgc28KKwkgKiBvbmx5IHRha2UgbG9jayBleGNsdXNpdmVseSBpZiB0aGUgcGFnZSBjYWNoZSBuZWVkcyBpbnZhbGlkYXRpb24uCisJICogVGhpcyBhbGxvd3MgdGhlIG5vcm1hbCBkaXJlY3QgSU8gY2FzZSBvZiBubyBwYWdlIGNhY2hlIHBhZ2VzIHRvCisJICogcHJvY2VlZWQgY29uY3VycmVudGx5IHdpdGhvdXQgc2VyaWFsaXNhdGlvbi4KKwkgKi8KKwl4ZnNfcndfaWxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKwlpZiAoKGlvZmxhZ3MgJiBJT19JU0RJUkVDVCkgJiYgaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcykgeworCQl4ZnNfcndfaXVubG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwogCQl4ZnNfcndfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CiAKIAkJaWYgKGlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMpIHsKQEAgLTMzMCw4ICszNjgsNyBAQAogCQkJfQogCQl9CiAJCXhmc19yd19pbG9ja19kZW1vdGUoaXAsIFhGU19JT0xPQ0tfRVhDTCk7Ci0JfSBlbHNlCi0JCXhmc19yd19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOworCX0KIAogCXRyYWNlX3hmc19maWxlX3JlYWQoaXAsIHNpemUsIGlvY2ItPmtpX3BvcywgaW9mbGFncyk7CiAKQEAgLTQwNywxMSArNDQ0LDEzIEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfYWlvX3dyaXRlX25ld3NpemVfdXBkYXRlKAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwKQorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19mc2l6ZV90CQluZXdfc2l6ZSkKIHsKLQlpZiAoaXAtPmlfbmV3X3NpemUpIHsKKwlpZiAobmV3X3NpemUgPT0gaXAtPmlfbmV3X3NpemUpIHsKIAkJeGZzX3J3X2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCWlwLT5pX25ld19zaXplID0gMDsKKwkJaWYgKG5ld19zaXplID09IGlwLT5pX25ld19zaXplKQorCQkJaXAtPmlfbmV3X3NpemUgPSAwOwogCQlpZiAoaXAtPmlfZC5kaV9zaXplID4gaXAtPmlfc2l6ZSkKIAkJCWlwLT5pX2QuZGlfc2l6ZSA9IGlwLT5pX3NpemU7CiAJCXhmc19yd19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CkBAIC00NjIsNyArNTAxLDcgQEAKIAlyZXQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlKHBpcGUsIG91dGZpbHAsIHBwb3MsIGNvdW50LCBmbGFncyk7CiAKIAl4ZnNfYWlvX3dyaXRlX2lzaXplX3VwZGF0ZShpbm9kZSwgcHBvcywgcmV0KTsKLQl4ZnNfYWlvX3dyaXRlX25ld3NpemVfdXBkYXRlKGlwKTsKKwl4ZnNfYWlvX3dyaXRlX25ld3NpemVfdXBkYXRlKGlwLCBuZXdfc2l6ZSk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTUwMCwxMSArNTM5LDkgQEAKIAogCWxhc3RfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgaXNpemUpOwogCW5pbWFwcyA9IDE7Ci0JZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIGxhc3RfZnNiLCAxLCAwLCBOVUxMLCAwLCAmaW1hcCwKLQkJCSAgJm5pbWFwcywgTlVMTCk7Ci0JaWYgKGVycm9yKSB7CisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgbGFzdF9mc2IsIDEsICZpbWFwLCAmbmltYXBzLCAwKTsKKwlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKLQl9CiAJQVNTRVJUKG5pbWFwcyA+IDApOwogCS8qCiAJICogSWYgdGhlIGJsb2NrIHVuZGVybHlpbmcgaXNpemUgaXMganVzdCBhIGhvbGUsIHRoZW4gdGhlcmUKQEAgLTU5NSw4ICs2MzIsOCBAQAogCXdoaWxlIChzdGFydF96ZXJvX2ZzYiA8PSBlbmRfemVyb19mc2IpIHsKIAkJbmltYXBzID0gMTsKIAkJemVyb19jb3VudF9mc2IgPSBlbmRfemVyb19mc2IgLSBzdGFydF96ZXJvX2ZzYiArIDE7Ci0JCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBzdGFydF96ZXJvX2ZzYiwgemVyb19jb3VudF9mc2IsCi0JCQkJICAwLCBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwcywgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIHN0YXJ0X3plcm9fZnNiLCB6ZXJvX2NvdW50X2ZzYiwKKwkJCQkJICAmaW1hcCwgJm5pbWFwcywgMCk7CiAJCWlmIChlcnJvcikgewogCQkJQVNTRVJUKHhmc19pc2lsb2NrZWQoaXAsIFhGU19JTE9DS19FWENMfFhGU19JT0xPQ0tfRVhDTCkpOwogCQkJcmV0dXJuIGVycm9yOwpAQCAtNjU5LDYgKzY5Niw3IEBACiAJc3RydWN0IGZpbGUJCSpmaWxlLAogCWxvZmZfdAkJCSpwb3MsCiAJc2l6ZV90CQkJKmNvdW50LAorCXhmc19mc2l6ZV90CQkqbmV3X3NpemVwLAogCWludAkJCSppb2xvY2spCiB7CiAJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CkBAIC02NjYsNiArNzA0LDkgQEAKIAl4ZnNfZnNpemVfdAkJbmV3X3NpemU7CiAJaW50CQkJZXJyb3IgPSAwOwogCisJeGZzX3J3X2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJKm5ld19zaXplcCA9IDA7CityZXN0YXJ0OgogCWVycm9yID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgcG9zLCBjb3VudCwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSk7CiAJaWYgKGVycm9yKSB7CiAJCXhmc19yd19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8ICppb2xvY2spOwpAQCAtNjczLDIwICs3MTQsNDEgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCW5ld19zaXplID0gKnBvcyArICpjb3VudDsKLQlpZiAobmV3X3NpemUgPiBpcC0+aV9zaXplKQotCQlpcC0+aV9uZXdfc2l6ZSA9IG5ld19zaXplOwotCiAJaWYgKGxpa2VseSghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX05PQ01USU1FKSkpCiAJCWZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CiAKIAkvKgogCSAqIElmIHRoZSBvZmZzZXQgaXMgYmV5b25kIHRoZSBzaXplIG9mIHRoZSBmaWxlLCB3ZSBuZWVkIHRvIHplcm8gYW55CiAJICogYmxvY2tzIHRoYXQgZmFsbCBiZXR3ZWVuIHRoZSBleGlzdGluZyBFT0YgYW5kIHRoZSBzdGFydCBvZiB0aGlzCi0JICogd3JpdGUuCisJICogd3JpdGUuIFRoZXJlIGlzIG5vIG5lZWQgdG8gaXNzdWUgemVyb2luZyBpZiBhbm90aGVyIGluLWZsZ2h0IElPIGVuZHMKKwkgKiBhdCBvciBiZWZvcmUgdGhpcyBvbmUgSWYgemVyb25pZyBpcyBuZWVkZWQgYW5kIHdlIGFyZSBjdXJyZW50bHkKKwkgKiBob2xkaW5nIHRoZSBpb2xvY2sgc2hhcmVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdCB0byBleGNsdXNpdmUgd2hpY2gKKwkgKiBpbnZvbHZlcyBkcm9wcGluZyBhbGwgbG9ja3MgYW5kIHJlbG9ja2luZyB0byBtYWludGFpbiBjb3JyZWN0IGxvY2tpbmcKKwkgKiBvcmRlci4gSWYgd2UgZG8gdGhpcywgcmVzdGFydCB0aGUgZnVuY3Rpb24gdG8gZW5zdXJlIGFsbCBjaGVja3MgYW5kCisJICogdmFsdWVzIGFyZSBzdGlsbCB2YWxpZC4KIAkgKi8KLQlpZiAoKnBvcyA+IGlwLT5pX3NpemUpCisJaWYgKChpcC0+aV9uZXdfc2l6ZSAmJiAqcG9zID4gaXAtPmlfbmV3X3NpemUpIHx8CisJICAgICghaXAtPmlfbmV3X3NpemUgJiYgKnBvcyA+IGlwLT5pX3NpemUpKSB7CisJCWlmICgqaW9sb2NrID09IFhGU19JT0xPQ0tfU0hBUkVEKSB7CisJCQl4ZnNfcndfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCAqaW9sb2NrKTsKKwkJCSppb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7CisJCQl4ZnNfcndfaWxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgKmlvbG9jayk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KIAkJZXJyb3IgPSAteGZzX3plcm9fZW9mKGlwLCAqcG9zLCBpcC0+aV9zaXplKTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgSU8gZXh0ZW5kcyBiZXlvbmQgRU9GLCB3ZSBtYXkgbmVlZCB0byB1cGRhdGUgaXAtPmlfbmV3X3NpemUuCisJICogV2UgaGF2ZSBhbHJlYWR5IHplcm9lZCBzcGFjZSBiZXlvbmQgRU9GIChpZiBuZWNlc3NhcnkpLiAgT25seSB1cGRhdGUKKwkgKiBpcC0+aV9uZXdfc2l6ZSBpZiB0aGlzIElPIGVuZHMgYmV5b25kIGFueSBvdGhlciBpbi1mbGlnaHQgd3JpdGVzLgorCSAqLworCW5ld19zaXplID0gKnBvcyArICpjb3VudDsKKwlpZiAobmV3X3NpemUgPiBpcC0+aV9zaXplKSB7CisJCWlmIChuZXdfc2l6ZSA+IGlwLT5pX25ld19zaXplKQorCQkJaXAtPmlfbmV3X3NpemUgPSBuZXdfc2l6ZTsKKwkJKm5ld19zaXplcCA9IG5ld19zaXplOworCX0KIAogCXhmc19yd19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJaWYgKGVycm9yKQpAQCAtNzIxLDcgKzc4Myw3IEBACiAgKiB0aGUgZGlvIGxheWVyLiAgVG8gYXZvaWQgdGhlIHByb2JsZW0gd2l0aCBhaW8sIHdlIGFsc28gbmVlZCB0byB3YWl0IGZvcgogICogb3V0c3RhbmRpbmcgSU9zIHRvIGNvbXBsZXRlIHNvIHRoYXQgdW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlZAogICogYmVmb3JlIHdlIHRyeSB0byBtYXAgdGhlIG92ZXJsYXBwaW5nIGJsb2NrLiBUaGlzIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBieQotICogaGl0dGluZyBpdCB3aXRoIGEgYmlnIGhhbW1lciAoaS5lLiB4ZnNfaW9lbmRfd2FpdCgpKS4KKyAqIGhpdHRpbmcgaXQgd2l0aCBhIGJpZyBoYW1tZXIgKGkuZS4gaW5vZGVfZGlvX3dhaXQoKSkuCiAgKgogICogUmV0dXJucyB3aXRoIGxvY2tzIGhlbGQgaW5kaWNhdGVkIGJ5IEBpb2xvY2sgYW5kIGVycm9ycyBpbmRpY2F0ZWQgYnkKICAqIG5lZ2F0aXZlIHJldHVybiB2YWx1ZXMuCkBAIC03MzMsNiArNzk1LDcgQEAKIAl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAogCWxvZmZfdAkJCXBvcywKIAlzaXplX3QJCQlvY291bnQsCisJeGZzX2ZzaXplX3QJCSpuZXdfc2l6ZSwKIAlpbnQJCQkqaW9sb2NrKQogewogCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CkBAIC03NTMsMTggKzgxNiwzNSBAQAogCWlmICgocG9zICYgbXAtPm1fYmxvY2ttYXNrKSB8fCAoKHBvcyArIGNvdW50KSAmIG1wLT5tX2Jsb2NrbWFzaykpCiAJCXVuYWxpZ25lZF9pbyA9IDE7CiAKLQlpZiAodW5hbGlnbmVkX2lvIHx8IG1hcHBpbmctPm5ycGFnZXMgfHwgcG9zID4gaXAtPmlfc2l6ZSkKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBhbiBleGNsdXNpdmUgbG9jayB1bmxlc3MgdGhlcmUgcGFnZSBjYWNoZSBuZWVkcworCSAqIHRvIGJlIGludmFsaWRhdGVkIG9yIHVuYWxpZ25lZCBJTyBpcyBiZWluZyBleGVjdXRlZC4gV2UgZG9uJ3QgbmVlZCB0bworCSAqIGNvbnNpZGVyIHRoZSBFT0YgZXh0ZW5zaW9uIGNhc2UgaGVyZSBiZWNhdXNlCisJICogeGZzX2ZpbGVfYWlvX3dyaXRlX2NoZWNrcygpIHdpbGwgcmVsb2NrIHRoZSBpbm9kZSBhcyBuZWNlc3NhcnkgZm9yCisJICogRU9GIHplcm9pbmcgY2FzZXMgYW5kIGZpbGwgb3V0IHRoZSBuZXcgaW5vZGUgc2l6ZSBhcyBhcHByb3ByaWF0ZS4KKwkgKi8KKwlpZiAodW5hbGlnbmVkX2lvIHx8IG1hcHBpbmctPm5ycGFnZXMpCiAJCSppb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7CiAJZWxzZQogCQkqaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7Ci0JeGZzX3J3X2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8ICppb2xvY2spOworCXhmc19yd19pbG9jayhpcCwgKmlvbG9jayk7CiAKLQlyZXQgPSB4ZnNfZmlsZV9haW9fd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgaW9sb2NrKTsKKwkvKgorCSAqIFJlY2hlY2sgaWYgdGhlcmUgYXJlIGNhY2hlZCBwYWdlcyB0aGF0IG5lZWQgaW52YWxpZGF0ZSBhZnRlciB3ZSBnb3QKKwkgKiB0aGUgaW9sb2NrIHRvIHByb3RlY3QgYWdhaW5zdCBvdGhlciB0aHJlYWRzIGFkZGluZyBuZXcgcGFnZXMgd2hpbGUKKwkgKiB3ZSB3ZXJlIHdhaXRpbmcgZm9yIHRoZSBpb2xvY2suCisJICovCisJaWYgKG1hcHBpbmctPm5ycGFnZXMgJiYgKmlvbG9jayA9PSBYRlNfSU9MT0NLX1NIQVJFRCkgeworCQl4ZnNfcndfaXVubG9jayhpcCwgKmlvbG9jayk7CisJCSppb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7CisJCXhmc19yd19pbG9jayhpcCwgKmlvbG9jayk7CisJfQorCisJcmV0ID0geGZzX2ZpbGVfYWlvX3dyaXRlX2NoZWNrcyhmaWxlLCAmcG9zLCAmY291bnQsIG5ld19zaXplLCBpb2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAobWFwcGluZy0+bnJwYWdlcykgewotCQlXQVJOX09OKCppb2xvY2sgIT0gWEZTX0lPTE9DS19FWENMKTsKIAkJcmV0ID0gLXhmc19mbHVzaGludmFsX3BhZ2VzKGlwLCAocG9zICYgUEFHRV9DQUNIRV9NQVNLKSwgLTEsCiAJCQkJCQkJRklfUkVNQVBGX0xPQ0tFRCk7CiAJCWlmIChyZXQpCkBAIC03NzYsNyArODU2LDcgQEAKIAkgKiBvdGhlcndpc2UgZGVtb3RlIHRoZSBsb2NrIGlmIHdlIGhhZCB0byBmbHVzaCBjYWNoZWQgcGFnZXMKIAkgKi8KIAlpZiAodW5hbGlnbmVkX2lvKQotCQl4ZnNfaW9lbmRfd2FpdChpcCk7CisJCWlub2RlX2Rpb193YWl0KGlub2RlKTsKIAllbHNlIGlmICgqaW9sb2NrID09IFhGU19JT0xPQ0tfRVhDTCkgewogCQl4ZnNfcndfaWxvY2tfZGVtb3RlKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwogCQkqaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7CkBAIC03OTgsNiArODc4LDcgQEAKIAl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAogCWxvZmZfdAkJCXBvcywKIAlzaXplX3QJCQlvY291bnQsCisJeGZzX2ZzaXplX3QJCSpuZXdfc2l6ZSwKIAlpbnQJCQkqaW9sb2NrKQogewogCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CkBAIC04MDksOSArODkwLDkgQEAKIAlzaXplX3QJCQljb3VudCA9IG9jb3VudDsKIAogCSppb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7Ci0JeGZzX3J3X2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8ICppb2xvY2spOworCXhmc19yd19pbG9jayhpcCwgKmlvbG9jayk7CiAKLQlyZXQgPSB4ZnNfZmlsZV9haW9fd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgaW9sb2NrKTsKKwlyZXQgPSB4ZnNfZmlsZV9haW9fd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgbmV3X3NpemUsIGlvbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtODUxLDYgKzkzMiw3IEBACiAJc3NpemVfdAkJCXJldDsKIAlpbnQJCQlpb2xvY2s7CiAJc2l6ZV90CQkJb2NvdW50ID0gMDsKKwl4ZnNfZnNpemVfdAkJbmV3X3NpemUgPSAwOwogCiAJWEZTX1NUQVRTX0lOQyh4c193cml0ZV9jYWxscyk7CiAKQEAgLTg3MCwxMCArOTUyLDEwIEBACiAKIAlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSkKIAkJcmV0ID0geGZzX2ZpbGVfZGlvX2Fpb193cml0ZShpb2NiLCBpb3ZwLCBucl9zZWdzLCBwb3MsCi0JCQkJCQlvY291bnQsICZpb2xvY2spOworCQkJCQkJb2NvdW50LCAmbmV3X3NpemUsICZpb2xvY2spOwogCWVsc2UKIAkJcmV0ID0geGZzX2ZpbGVfYnVmZmVyZWRfYWlvX3dyaXRlKGlvY2IsIGlvdnAsIG5yX3NlZ3MsIHBvcywKLQkJCQkJCW9jb3VudCwgJmlvbG9jayk7CisJCQkJCQlvY291bnQsICZuZXdfc2l6ZSwgJmlvbG9jayk7CiAKIAl4ZnNfYWlvX3dyaXRlX2lzaXplX3VwZGF0ZShpbm9kZSwgJmlvY2ItPmtpX3BvcywgcmV0KTsKIApAQCAtODk0LDcgKzk3Niw3IEBACiAJfQogCiBvdXRfdW5sb2NrOgotCXhmc19haW9fd3JpdGVfbmV3c2l6ZV91cGRhdGUoaXApOworCXhmc19haW9fd3JpdGVfbmV3c2l6ZV91cGRhdGUoaXAsIG5ld19zaXplKTsKIAl4ZnNfcndfaXVubG9jayhpcCwgaW9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA4Nyw3ICsxMTY5LDcgQEAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHhmc19maWxlX2NvbXBhdF9pb2N0bCwKICNlbmRpZgotCS5mc3luYwkJPSB4ZnNfZmlsZV9mc3luYywKKwkuZnN5bmMJCT0geGZzX2Rpcl9mc3luYywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgeGZzX2ZpbGVfdm1fb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19maWxlc3RyZWFtLmMgYi9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYwppbmRleCAzZmYzZDllLi41MTcwMzA2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYworKysgYi9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYwpAQCAtNjgyLDcgKzY4Miw3IEBACiAJaXAgPSBhcC0+aXA7CiAJbXAgPSBpcC0+aV9tb3VudDsKIAljYWNoZSA9IG1wLT5tX2ZpbGVzdHJlYW07Ci0JbWlubGVuID0gYXAtPmFsZW47CisJbWlubGVuID0gYXAtPmxlbmd0aDsKIAkqYWdwID0gTlVMTEFHTlVNQkVSOwogCiAJLyoKQEAgLTc2MSw3ICs3NjEsNyBAQAogCSAqLwogCWFnID0gKGFnID09IE5VTExBR05VTUJFUikgPyAwIDogKGFnICsgMSkgJSBtcC0+bV9zYi5zYl9hZ2NvdW50OwogCWZsYWdzID0gKGFwLT51c2VyZGF0YSA/IFhGU19QSUNLX1VTRVJEQVRBIDogMCkgfAotCSAgICAgICAgKGFwLT5sb3cgPyBYRlNfUElDS19MT1dTUEFDRSA6IDApOworCSAgICAgICAgKGFwLT5mbGlzdC0+eGJmX2xvdyA/IFhGU19QSUNLX0xPV1NQQUNFIDogMCk7CiAKIAllcnIgPSBfeGZzX2ZpbGVzdHJlYW1fcGlja19hZyhtcCwgYWcsIGFncCwgZmxhZ3MsIG1pbmxlbik7CiAJaWYgKGVyciB8fCAqYWdwID09IE5VTExBR05VTUJFUikKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnNvcHMuYyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwppbmRleCA5MTUzZDJjLi4xYzZmZGViIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Zzb3BzLmMKKysrIGIvZnMveGZzL3hmc19mc29wcy5jCkBAIC0xOTQsNiArMTk0LDEwIEBACiAJCWJwID0geGZzX2J1Zl9nZXQobXAtPm1fZGRldl90YXJncCwKIAkJCQkgWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGX0RBRERSKG1wKSksCiAJCQkJIFhGU19GU1NfVE9fQkIobXAsIDEpLCBYQkZfTE9DSyB8IFhCRl9NQVBQRUQpOworCQlpZiAoIWJwKSB7CisJCQllcnJvciA9IEVOT01FTTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CiAJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGJwKTsKIAkJbWVtc2V0KGFnZiwgMCwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpOwogCQlhZ2YtPmFnZl9tYWdpY251bSA9IGNwdV90b19iZTMyKFhGU19BR0ZfTUFHSUMpOwpAQCAtMjE2LDE2ICsyMjAsMjEgQEAKIAkJdG1wc2l6ZSA9IGFnc2l6ZSAtIFhGU19QUkVBTExPQ19CTE9DS1MobXApOwogCQlhZ2YtPmFnZl9mcmVlYmxrcyA9IGNwdV90b19iZTMyKHRtcHNpemUpOwogCQlhZ2YtPmFnZl9sb25nZXN0ID0gY3B1X3RvX2JlMzIodG1wc2l6ZSk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQl9CisKIAkJLyoKIAkJICogQUcgaW5vZGUgaGVhZGVyIGJsb2NrCiAJCSAqLwogCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCiAJCQkJIFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpLAogCQkJCSBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKKwkJaWYgKCFicCkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIGVycm9yMDsKKwkJfQogCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7CiAJCW1lbXNldChhZ2ksIDAsIG1wLT5tX3NiLnNiX3NlY3RzaXplKTsKIAkJYWdpLT5hZ2lfbWFnaWNudW0gPSBjcHVfdG9fYmUzMihYRlNfQUdJX01BR0lDKTsKQEAgLTI0MCwxMCArMjQ5LDExIEBACiAJCWFnaS0+YWdpX2RpcmlubyA9IGNwdV90b19iZTMyKE5VTExBR0lOTyk7CiAJCWZvciAoYnVja2V0ID0gMDsgYnVja2V0IDwgWEZTX0FHSV9VTkxJTktFRF9CVUNLRVRTOyBidWNrZXQrKykKIAkJCWFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF0gPSBjcHVfdG9fYmUzMihOVUxMQUdJTk8pOwotCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKLQkJaWYgKGVycm9yKSB7CisJCWVycm9yID0geGZzX2J3cml0ZShicCk7CisJCXhmc19idWZfcmVsc2UoYnApOworCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMDsKLQkJfQorCiAJCS8qCiAJCSAqIEJOTyBidHJlZSByb290IGJsb2NrCiAJCSAqLwpAQCAtMjUxLDYgKzI2MSwxMCBAQAogCQkJCSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfQk5PX0JMT0NLKG1wKSksCiAJCQkJIEJUT0JCKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSksCiAJCQkJIFhCRl9MT0NLIHwgWEJGX01BUFBFRCk7CisJCWlmICghYnApIHsKKwkJCWVycm9yID0gRU5PTUVNOworCQkJZ290byBlcnJvcjA7CisJCX0KIAkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAkJbWVtc2V0KGJsb2NrLCAwLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUpOwogCQlibG9jay0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfQUJUQl9NQUdJQyk7CkBAIC0yNjIsMTAgKzI3NiwxMSBAQAogCQlhcmVjLT5hcl9zdGFydGJsb2NrID0gY3B1X3RvX2JlMzIoWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCkpOwogCQlhcmVjLT5hcl9ibG9ja2NvdW50ID0gY3B1X3RvX2JlMzIoCiAJCQlhZ3NpemUgLSBiZTMyX3RvX2NwdShhcmVjLT5hcl9zdGFydGJsb2NrKSk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQl9CisKIAkJLyoKIAkJICogQ05UIGJ0cmVlIHJvb3QgYmxvY2sKIAkJICovCkBAIC0yNzMsNiArMjg4LDEwIEBACiAJCQkJIFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19DTlRfQkxPQ0sobXApKSwKIAkJCQkgQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwKIAkJCQkgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKKwkJaWYgKCFicCkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIGVycm9yMDsKKwkJfQogCQlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CiAJCWJsb2NrLT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKFhGU19BQlRDX01BR0lDKTsKQEAgLTI4NSwxMCArMzA0LDExIEBACiAJCWFyZWMtPmFyX2Jsb2NrY291bnQgPSBjcHVfdG9fYmUzMigKIAkJCWFnc2l6ZSAtIGJlMzJfdG9fY3B1KGFyZWMtPmFyX3N0YXJ0YmxvY2spKTsKIAkJbmZyZWUgKz0gYmUzMl90b19jcHUoYXJlYy0+YXJfYmxvY2tjb3VudCk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQl9CisKIAkJLyoKIAkJICogSU5PIGJ0cmVlIHJvb3QgYmxvY2sKIAkJICovCkBAIC0yOTYsNiArMzE2LDEwIEBACiAJCQkJIFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19JQlRfQkxPQ0sobXApKSwKIAkJCQkgQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwKIAkJCQkgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKKwkJaWYgKCFicCkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIGVycm9yMDsKKwkJfQogCQlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CiAJCWJsb2NrLT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKFhGU19JQlRfTUFHSUMpOwpAQCAtMzAzLDEwICszMjcsMTAgQEAKIAkJYmxvY2stPmJiX251bXJlY3MgPSAwOwogCQlibG9jay0+YmJfdS5zLmJiX2xlZnRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7CiAJCWJsb2NrLT5iYl91LnMuYmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQl9CiAJfQogCXhmc190cmFuc19hZ2Jsb2Nrc19kZWx0YSh0cCwgbmZyZWUpOwogCS8qCkBAIC0zOTYsOSArNDIwLDkgQEAKIAkJICoganVzdCBpc3N1ZSBhIHdhcm5pbmcgYW5kIGNvbnRpbnVlLiAgVGhlIHJlYWwgd29yayBpcwogCQkgKiBhbHJlYWR5IGRvbmUgYW5kIGNvbW1pdHRlZC4KIAkJICovCi0JCWlmICghKGVycm9yID0geGZzX2J3cml0ZShtcCwgYnApKSkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2J3cml0ZShicCk7CisJCXhmc19idWZfcmVsc2UoYnApOworCQlpZiAoZXJyb3IpIHsKIAkJCXhmc193YXJuKG1wLAogCQkid3JpdGUgZXJyb3IgJWQgdXBkYXRpbmcgc2Vjb25kYXJ5IHN1cGVyYmxvY2sgZm9yIGFnICVkIiwKIAkJCQllcnJvciwgYWdubyk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvYy5jIGIvZnMveGZzL3hmc19pYWxsb2MuYwppbmRleCA5ZjI0ZWMyLi4xNjkzODBlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogLyoKICAqIEluaXRpYWxpc2UgYSBuZXcgc2V0IG9mIGlub2Rlcy4KICAqLwotU1RBVElDIHZvaWQKK1NUQVRJQyBpbnQKIHhmc19pYWxsb2NfaW5vZGVfaW5pdCgKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwKQEAgLTIwMiw4ICsyMDIsOCBAQAogCQlmYnVmID0geGZzX3RyYW5zX2dldF9idWYodHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCiAJCQkJCSBtcC0+bV9ic2l6ZSAqIGJsa3NfcGVyX2NsdXN0ZXIsCiAJCQkJCSBYQkZfTE9DSyk7Ci0JCUFTU0VSVCgheGZzX2J1Zl9nZXRlcnJvcihmYnVmKSk7Ci0KKwkJaWYgKCFmYnVmKQorCQkJcmV0dXJuIEVOT01FTTsKIAkJLyoKIAkJICogSW5pdGlhbGl6ZSBhbGwgaW5vZGVzIGluIHRoaXMgYnVmZmVyIGFuZCB0aGVuIGxvZyB0aGVtLgogCQkgKgpAQCAtMjI1LDYgKzIyNSw3IEBACiAJCX0KIAkJeGZzX3RyYW5zX2lub2RlX2FsbG9jX2J1Zih0cCwgZmJ1Zik7CiAJfQorCXJldHVybiAwOwogfQogCiAvKgpAQCAtMzY5LDkgKzM3MCwxMSBAQAogCSAqIHJhdGhlciB0aGFuIGEgbGluZWFyIHByb2dyZXNzaW9uIHRvIHByZXZlbnQgdGhlIG5leHQgZ2VuZXJhdGlvbgogCSAqIG51bWJlciBmcm9tIGJlaW5nIGVhc2lseSBndWVzc2FibGUuCiAJICovCi0JeGZzX2lhbGxvY19pbm9kZV9pbml0KGFyZ3MubXAsIHRwLCBhZ25vLCBhcmdzLmFnYm5vLCBhcmdzLmxlbiwKLQkJCSAgICAgIHJhbmRvbTMyKCkpOworCWVycm9yID0geGZzX2lhbGxvY19pbm9kZV9pbml0KGFyZ3MubXAsIHRwLCBhZ25vLCBhcmdzLmFnYm5vLAorCQkJYXJncy5sZW4sIHJhbmRvbTMyKCkpOwogCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAJLyoKIAkgKiBDb252ZXJ0IHRoZSByZXN1bHRzLgogCSAqLwpAQCAtMTUwMiw3ICsxNTA1LDcgQEAKIAkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogCX0KIAotCVhGU19CVUZfU0VUX1ZUWVBFX1JFRigqYnBwLCBCX0ZTX0FHSSwgWEZTX0FHSV9SRUYpOworCXhmc19idWZfc2V0X3JlZigqYnBwLCBYRlNfQUdJX1JFRik7CiAKIAl4ZnNfY2hlY2tfYWdpX3VubGlua2VkKGFnaSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCmluZGV4IDc3NTk4MTIuLjBmYTk4YjEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWdldC5jCisrKyBiL2ZzL3hmcy94ZnNfaWdldC5jCkBAIC03NSw3ICs3NSw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCUFTU0VSVChhdG9taWNfcmVhZCgmaXAtPmlfaW9jb3VudCkgPT0gMCk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZpcC0+aV9waW5jb3VudCkgPT0gMCk7CiAJQVNTRVJUKCFzcGluX2lzX2xvY2tlZCgmaXAtPmlfZmxhZ3NfbG9jaykpOwogCUFTU0VSVChjb21wbGV0aW9uX2RvbmUoJmlwLT5pX2ZsdXNoKSk7CkBAIC0xNTAsNyArMTQ5LDYgQEAKIAl9CiAKIAkvKiBhc3NlcnRzIHRvIHZlcmlmeSBhbGwgc3RhdGUgaXMgY29ycmVjdCBoZXJlICovCi0JQVNTRVJUKGF0b21pY19yZWFkKCZpcC0+aV9pb2NvdW50KSA9PSAwKTsKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmlwLT5pX3BpbmNvdW50KSA9PSAwKTsKIAlBU1NFUlQoIXNwaW5faXNfbG9ja2VkKCZpcC0+aV9mbGFnc19sb2NrKSk7CiAJQVNTRVJUKGNvbXBsZXRpb25fZG9uZSgmaXAtPmlfZmx1c2gpKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuYyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwppbmRleCAwMjM5YTdjLi5jMDIzN2M2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZS5jCkBAIC0xOTAsMTIgKzE5MCw2IEBACiAJfQogCiAJeGZzX2lub2JwX2NoZWNrKG1wLCBicCk7Ci0KLQkvKgotCSAqIE1hcmsgdGhlIGJ1ZmZlciBhcyBhbiBpbm9kZSBidWZmZXIgbm93IHRoYXQgaXQgbG9va3MgZ29vZAotCSAqLwotCVhGU19CVUZfU0VUX1ZUWVBFKGJwLCBCX0ZTX0lOTyk7Ci0KIAkqYnBwID0gYnA7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMTUyLDcgKzExNDYsNyBAQAogCS8qCiAJICogTG9nIHRoZSBuZXcgdmFsdWVzIHN0dWZmZWQgaW50byB0aGUgaW5vZGUuCiAJICovCi0JeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIGZsYWdzKTsKIAogCS8qIG5vdyB0aGF0IHdlIGhhdmUgYW4gaV9tb2RlIHdlIGNhbiBzZXR1cCBpbm9kZSBvcHMgYW5kIHVubG9jayAqLwpAQCAtMTE4Nyw2ICsxMTgxLDcgQEAKIAl4ZnNfZmlsZW9mZl90CQltYXBfZmlyc3Q7CiAJaW50CQkJbmltYXBzOwogCXhmc19ibWJ0X2lyZWNfdAkJaW1hcHNbMl07CisJaW50CQkJZXJyb3I7CiAKIAlpZiAoIVNfSVNSRUcoaXAtPmlfZC5kaV9tb2RlKSkKIAkJcmV0dXJuOwpAQCAtMTIwMywxMyArMTE5OCwxMiBAQAogCSAqIFRoZSBmaWxlc3lzdGVtIGNvdWxkIGJlIHNodXR0aW5nIGRvd24sIHNvIGJtYXBpIG1heSByZXR1cm4KIAkgKiBhbiBlcnJvci4KIAkgKi8KLQlpZiAoeGZzX2JtYXBpKE5VTEwsIGlwLCBtYXBfZmlyc3QsCisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgbWFwX2ZpcnN0LAogCQkJIChYRlNfQl9UT19GU0IobXAsCi0JCQkJICAgICAgICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKSAtCi0JCQkgIG1hcF9maXJzdCksCi0JCQkgWEZTX0JNQVBJX0VOVElSRSwgTlVMTCwgMCwgaW1hcHMsICZuaW1hcHMsCi0JCQkgTlVMTCkpCi0JICAgIHJldHVybjsKKwkJCSAgICAgICAoeGZzX3Vmc2l6ZV90KVhGU19NQVhJT0ZGU0VUKG1wKSkgLSBtYXBfZmlyc3QpLAorCQkJIGltYXBzLCAmbmltYXBzLCBYRlNfQk1BUElfRU5USVJFKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybjsKIAlBU1NFUlQobmltYXBzID09IDEpOwogCUFTU0VSVChpbWFwc1swXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKTsKIH0KQEAgLTEyOTcsNyArMTI5MSw3IEBACiAJCSAqLwogCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsICZjb21taXR0ZWQpOwogCQlpZiAoY29tbWl0dGVkKQotCQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfYm1hcF9jYW5jZWw7CiAKQEAgLTEzMTMsNyArMTMwNyw3IEBACiAJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7CiAJCXRwID0gbnRwOwogCi0JCXhmc190cmFuc19pam9pbih0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKQEAgLTE2NDQsNyArMTYzOCw3IEBACiAgKiBpbm9kZXMgdGhhdCBhcmUgaW4gbWVtb3J5IC0gdGhleSBhbGwgbXVzdCBiZSBtYXJrZWQgc3RhbGUgYW5kIGF0dGFjaGVkIHRvCiAgKiB0aGUgY2x1c3RlciBidWZmZXIuCiAgKi8KLVNUQVRJQyB2b2lkCitTVEFUSUMgaW50CiB4ZnNfaWZyZWVfY2x1c3RlcigKIAl4ZnNfaW5vZGVfdAkqZnJlZV9pcCwKIAl4ZnNfdHJhbnNfdAkqdHAsCkBAIC0xNjkwLDYgKzE2ODQsOCBAQAogCQkJCQltcC0+bV9ic2l6ZSAqIGJsa3NfcGVyX2NsdXN0ZXIsCiAJCQkJCVhCRl9MT0NLKTsKIAorCQlpZiAoIWJwKQorCQkJcmV0dXJuIEVOT01FTTsKIAkJLyoKIAkJICogV2FsayB0aGUgaW5vZGVzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlciBhbmQgbWFyayB0aGVtCiAJCSAqIHN0YWxlLiBUaGVzZSB3aWxsIGFsbCBoYXZlIHRoZSBmbHVzaCBsb2NrcyBoZWxkLCBzbyBhbgpAQCAtMTc5OSw2ICsxNzk1LDcgQEAKIAl9CiAKIAl4ZnNfcGVyYWdfcHV0KHBhZyk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xODc4LDEwICsxODc1LDEwIEBACiAJZGlwLT5kaV9tb2RlID0gMDsKIAogCWlmIChkZWxldGUpIHsKLQkJeGZzX2lmcmVlX2NsdXN0ZXIoaXAsIHRwLCBmaXJzdF9pbm8pOworCQllcnJvciA9IHhmc19pZnJlZV9jbHVzdGVyKGlwLCB0cCwgZmlyc3RfaW5vKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC0yNDcyLDExICsyNDY5LDExIEBACiAJCSAqLwogCQlpZiAoYnAtPmJfaW9kb25lKSB7CiAJCQlYRlNfQlVGX1VORE9ORShicCk7Ci0JCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJCXhmc19idWZfc3RhbGUoYnApOwogCQkJeGZzX2J1Zl9pb2Vycm9yKGJwLCBFSU8pOwogCQkJeGZzX2J1Zl9pb2VuZChicCwgMCk7CiAJCX0gZWxzZSB7Ci0JCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJCXhmc19idWZfc3RhbGUoYnApOwogCQkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCX0KIAl9CkBAIC0yNTk3LDkgKzI1OTQsMTEgQEAKIAkJZ290byBjbHVzdGVyX2NvcnJ1cHRfb3V0OwogCiAJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQotCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKIAllbHNlCi0JCXhmc19iZHdyaXRlKG1wLCBicCk7CisJCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKKworCXhmc19idWZfcmVsc2UoYnApOwogCXJldHVybiBlcnJvcjsKIAogY29ycnVwdF9vdXQ6CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKaW5kZXggMjM4MGE0Yi4uNzYwMTQwZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtMjU3LDcgKzI1Nyw2IEBACiAKIAl4ZnNfZnNpemVfdAkJaV9zaXplOwkJLyogaW4tbWVtb3J5IHNpemUgKi8KIAl4ZnNfZnNpemVfdAkJaV9uZXdfc2l6ZTsJLyogc2l6ZSB3aGVuIHdyaXRlIGNvbXBsZXRlcyAqLwotCWF0b21pY190CQlpX2lvY291bnQ7CS8qIG91dHN0YW5kaW5nIEkvTyBjb3VudCAqLwogCiAJLyogVkZTIGlub2RlICovCiAJc3RydWN0IGlub2RlCQlpX3Zub2RlOwkvKiBlbWJlZGRlZCBWRlMgaW5vZGUgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKaW5kZXggODM2YWQ4MC4uYWJhYWZkYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKQEAgLTY1OCwxMCArNjU4LDggQEAKIAogCWxvY2tfZmxhZ3MgPSBpaXAtPmlsaV9sb2NrX2ZsYWdzOwogCWlpcC0+aWxpX2xvY2tfZmxhZ3MgPSAwOwotCWlmIChsb2NrX2ZsYWdzKSB7CisJaWYgKGxvY2tfZmxhZ3MpCiAJCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKLQkJSVJFTEUoaXApOwotCX0KIH0KIAogLyoKQEAgLTc5Nyw3ICs3OTUsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIG9wcyB2ZWN0b3Igc2hhcmVkIGJ5IGFsbCBidWYgbG9nIGl0ZW1zLgogICovCi1zdGF0aWMgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfaW5vZGVfaXRlbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfaW5vZGVfaXRlbV9vcHMgPSB7CiAJLmlvcF9zaXplCT0geGZzX2lub2RlX2l0ZW1fc2l6ZSwKIAkuaW9wX2Zvcm1hdAk9IHhmc19pbm9kZV9pdGVtX2Zvcm1hdCwKIAkuaW9wX3Bpbgk9IHhmc19pbm9kZV9pdGVtX3BpbiwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9jdGwuYyBiL2ZzL3hmcy94ZnNfaW9jdGwuYwppbmRleCBmN2NlN2RlLi5kOTlhOTA1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lvY3RsLmMKKysrIGIvZnMveGZzL3hmc19pb2N0bC5jCkBAIC0xMDY5LDcgKzEwNjksNyBAQAogCQl9CiAJfQogCi0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkvKgogCSAqIENoYW5nZSBmaWxlIG93bmVyc2hpcC4gIE11c3QgYmUgdGhlIG93bmVyIG9yIHByaXZpbGVnZWQuCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmMgYi9mcy94ZnMveGZzX2lvbWFwLmMKaW5kZXggMDkxZDgyYi4uOWFmYTI4MiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb21hcC5jCisrKyBiL2ZzL3hmcy94ZnNfaW9tYXAuYwpAQCAtMjA4LDIyICsyMDgsMjAgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IxOwogCi0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKLQlibWFwaV9mbGFnID0gWEZTX0JNQVBJX1dSSVRFOworCWJtYXBpX2ZsYWcgPSAwOwogCWlmIChvZmZzZXQgPCBpcC0+aV9zaXplIHx8IGV4dHN6KQogCQlibWFwaV9mbGFnIHw9IFhGU19CTUFQSV9QUkVBTExPQzsKIAogCS8qCi0JICogSXNzdWUgdGhlIHhmc19ibWFwaSgpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGJsb2Nrcy4KLQkgKgogCSAqIEZyb20gdGhpcyBwb2ludCBvbndhcmRzIHdlIG92ZXJ3cml0ZSB0aGUgaW1hcCBwb2ludGVyIHRoYXQgdGhlCiAJICogY2FsbGVyIGdhdmUgdG8gdXMuCiAJICovCiAJeGZzX2JtYXBfaW5pdCgmZnJlZV9saXN0LCAmZmlyc3Rmc2IpOwogCW5pbWFwcyA9IDE7Ci0JZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsIGJtYXBpX2ZsYWcsCi0JCSZmaXJzdGZzYiwgMCwgaW1hcCwgJm5pbWFwcywgJmZyZWVfbGlzdCk7CisJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUodHAsIGlwLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsIGJtYXBpX2ZsYWcsCisJCQkJJmZpcnN0ZnNiLCAwLCBpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IwOwogCkBAIC0zMDAsOCArMjk4LDggQEAKIAl3aGlsZSAoY291bnRfZnNiID4gMCkgewogCQlpbWFwcyA9IG5pbWFwczsKIAkJZmlyc3RibG9jayA9IE5VTExGU0JMT0NLOwotCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgc3RhcnRfZnNiLCBjb3VudF9mc2IsIDAsCi0JCQkJICAmZmlyc3RibG9jaywgMCwgaW1hcCwgJmltYXBzLCBOVUxMKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgc3RhcnRfZnNiLCBjb3VudF9mc2IsIGltYXAsICZpbWFwcywKKwkJCQkgICAgICAgMCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKIAkJZm9yIChuID0gMDsgbiA8IGltYXBzOyBuKyspIHsKQEAgLTM4MSw3ICszNzksNiBAQAogCXhmc19maWxlb2ZmX3QJbGFzdF9mc2I7CiAJeGZzX29mZl90CWFsaWduZWRfb2Zmc2V0OwogCXhmc19maWxlb2ZmX3QJaW9hbGlnbjsKLQl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CiAJeGZzX2V4dGxlbl90CWV4dHN6OwogCWludAkJbmltYXBzOwogCXhmc19ibWJ0X2lyZWNfdCBpbWFwW1hGU19XUklURV9JTUFQU107CkBAIC00MjUsMTIgKzQyMiw4IEBACiAJfQogCiAJbmltYXBzID0gWEZTX1dSSVRFX0lNQVBTOwotCWZpcnN0YmxvY2sgPSBOVUxMRlNCTE9DSzsKLQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwKLQkJCSAgKHhmc19maWxibGtzX3QpKGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYiksCi0JCQkgIFhGU19CTUFQSV9ERUxBWSB8IFhGU19CTUFQSV9XUklURSB8Ci0JCQkgIFhGU19CTUFQSV9FTlRJUkUsICZmaXJzdGJsb2NrLCAxLCBpbWFwLAotCQkJICAmbmltYXBzLCBOVUxMKTsKKwllcnJvciA9IHhmc19ibWFwaV9kZWxheShpcCwgb2Zmc2V0X2ZzYiwgbGFzdF9mc2IgLSBvZmZzZXRfZnNiLAorCQkJCWltYXAsICZuaW1hcHMsIFhGU19CTUFQSV9FTlRJUkUpOwogCXN3aXRjaCAoZXJyb3IpIHsKIAljYXNlIDA6CiAJY2FzZSBFTk9TUEM6CkBAIC01MzUsNyArNTI4LDcgQEAKIAkJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKIAkJCX0KIAkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAogCQkJeGZzX2JtYXBfaW5pdCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOwogCkBAIC01ODcsMTQgKzU4MCwxMiBAQAogCQkJfQogCiAJCQkvKgotCQkJICogR28gZ2V0IHRoZSBhY3R1YWwgYmxvY2tzLgotCSAJIAkgKgogCQkJICogRnJvbSB0aGlzIHBvaW50IG9ud2FyZHMgd2Ugb3ZlcndyaXRlIHRoZSBpbWFwCiAJCQkgKiBwb2ludGVyIHRoYXQgdGhlIGNhbGxlciBnYXZlIHRvIHVzLgogCQkJICovCi0JCQllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIG1hcF9zdGFydF9mc2IsIGNvdW50X2ZzYiwKLQkJCQkJWEZTX0JNQVBJX1dSSVRFLCAmZmlyc3RfYmxvY2ssIDEsCi0JCQkJCWltYXAsICZuaW1hcHMsICZmcmVlX2xpc3QpOworCQkJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUodHAsIGlwLCBtYXBfc3RhcnRfZnNiLAorCQkJCQkJY291bnRfZnNiLCAwLCAmZmlyc3RfYmxvY2ssIDEsCisJCQkJCQlpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIHRyYW5zX2NhbmNlbDsKIApAQCAtNzAxLDE1ICs2OTIsMTUgQEAKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkJLyoKIAkJICogTW9kaWZ5IHRoZSB1bndyaXR0ZW4gZXh0ZW50IHN0YXRlIG9mIHRoZSBidWZmZXIuCiAJCSAqLwogCQl4ZnNfYm1hcF9pbml0KCZmcmVlX2xpc3QsICZmaXJzdGZzYik7CiAJCW5pbWFwcyA9IDE7Ci0JCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgb2Zmc2V0X2ZzYiwgY291bnRfZnNiLAotCQkJCSAgWEZTX0JNQVBJX1dSSVRFfFhGU19CTUFQSV9DT05WRVJULCAmZmlyc3Rmc2IsCisJCWVycm9yID0geGZzX2JtYXBpX3dyaXRlKHRwLCBpcCwgb2Zmc2V0X2ZzYiwgY291bnRfZnNiLAorCQkJCSAgWEZTX0JNQVBJX0NPTlZFUlQsICZmaXJzdGZzYiwKIAkJCQkgIDEsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBlcnJvcl9vbl9ibWFwaV90cmFuc2FjdGlvbjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9wcy5jIGIvZnMveGZzL3hmc19pb3BzLmMKaW5kZXggMjg4NTZhYy4uMjNjZTkyNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb3BzLmMKKysrIGIvZnMveGZzL3hmc19pb3BzLmMKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCXRyYWNlX3hmc19nZXRhdHRyKGlwKTsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKLQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCQlyZXR1cm4gLVhGU19FUlJPUihFSU8pOwogCiAJc3RhdC0+c2l6ZSA9IFhGU19JU0laRShpcCk7CiAJc3RhdC0+ZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OwpAQCAtNjEyLDcgKzYxMiw3IEBACiAJCX0KIAl9CiAKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAogCS8qCiAJICogQ2hhbmdlIGZpbGUgb3duZXJzaGlwLiAgTXVzdCBiZSB0aGUgb3duZXIgb3IgcHJpdmlsZWdlZC4KQEAgLTgzNCwxNiArODM0LDE2IEBACiAJICogY2FyZSBhYm91dCBoZXJlLgogCSAqLwogCWlmIChpcC0+aV9zaXplICE9IGlwLT5pX2QuZGlfc2l6ZSAmJiBpYXR0ci0+aWFfc2l6ZSA+IGlwLT5pX2QuZGlfc2l6ZSkgewotCQllcnJvciA9IHhmc19mbHVzaF9wYWdlcyhpcCwgaXAtPmlfZC5kaV9zaXplLCBpYXR0ci0+aWFfc2l6ZSwKLQkJCQkJWEJGX0FTWU5DLCBGSV9OT05FKTsKKwkJZXJyb3IgPSB4ZnNfZmx1c2hfcGFnZXMoaXAsIGlwLT5pX2QuZGlfc2l6ZSwgaWF0dHItPmlhX3NpemUsIDAsCisJCQkJCUZJX05PTkUpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJLyoKLQkgKiBXYWl0IGZvciBhbGwgSS9PIHRvIGNvbXBsZXRlLgorCSAqIFdhaXQgZm9yIGFsbCBkaXJlY3QgSS9PIHRvIGNvbXBsZXRlLgogCSAqLwotCXhmc19pb2VuZF93YWl0KGlwKTsKKwlpbm9kZV9kaW9fd2FpdChpbm9kZSk7CiAKIAllcnJvciA9IC1ibG9ja190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlhdHRyLT5pYV9zaXplLAogCQkJCSAgICAgeGZzX2dldF9ibG9ja3MpOwpAQCAtODY0LDcgKzg2NCw3IEBACiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAotCXhmc190cmFuc19pam9pbih0cCwgaXApOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIDApOwogCiAJLyoKIAkgKiBPbmx5IGNoYW5nZSB0aGUgYy9tdGltZSBpZiB3ZSBhcmUgY2hhbmdpbmcgdGhlIHNpemUgb3Igd2UgYXJlCkBAIC0xMTUzLDcgKzExNTMsNyBAQAogCWhsaXN0X2FkZF9mYWtlKCZpbm9kZS0+aV9oYXNoKTsKIAogCWlub2RlLT5pX21vZGUJPSBpcC0+aV9kLmRpX21vZGU7Ci0JaW5vZGUtPmlfbmxpbmsJPSBpcC0+aV9kLmRpX25saW5rOworCXNldF9ubGluayhpbm9kZSwgaXAtPmlfZC5kaV9ubGluayk7CiAJaW5vZGUtPmlfdWlkCT0gaXAtPmlfZC5kaV91aWQ7CiAJaW5vZGUtPmlfZ2lkCT0gaXAtPmlfZC5kaV9naWQ7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmMgYi9mcy94ZnMveGZzX2xvZy5jCmluZGV4IDNhOGQ0ZjYuLmExNGNkODkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmMKKysrIGIvZnMveGZzL3hmc19sb2cuYwpAQCAtNjI2LDcgKzYyNiw3IEBACiAJc3RydWN0IHhmc19tb3VudAkqbXAsCiAJc3RydWN0IHhmc19sb2dfaXRlbQkqaXRlbSwKIAlpbnQJCQl0eXBlLAotCXN0cnVjdCB4ZnNfaXRlbV9vcHMJKm9wcykKKwljb25zdCBzdHJ1Y3QgeGZzX2l0ZW1fb3BzICpvcHMpCiB7CiAJaXRlbS0+bGlfbW91bnRwID0gbXA7CiAJaXRlbS0+bGlfYWlscCA9IG1wLT5tX2FpbDsKQEAgLTg4MCw4ICs4ODAsOCBAQAogCSAqLwogCWlmIChYRlNfVEVTVF9FUlJPUigoeGZzX2J1Zl9nZXRlcnJvcihicCkpLCBsLT5sX21wLAogCQkJWEZTX0VSUlRBR19JT0RPTkVfSU9FUlIsIFhGU19SQU5ET01fSU9ET05FX0lPRVJSKSkgewotCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19pb2RvbmUiLCBsLT5sX21wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7Ci0JCVhGU19CVUZfU1RBTEUoYnApOworCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKKwkJeGZzX2J1Zl9zdGFsZShicCk7CiAJCXhmc19mb3JjZV9zaHV0ZG93bihsLT5sX21wLCBTSFVURE9XTl9MT0dfSU9fRVJST1IpOwogCQkvKgogCQkgKiBUaGlzIGZsYWcgd2lsbCBiZSBwcm9wYWdhdGVkIHRvIHRoZSB0cmFucy1jb21taXR0ZWQKQEAgLTEwNDcsNyArMTA0Nyw3IEBACiAJeGxvZ19nZXRfaWNsb2dfYnVmZmVyX3NpemUobXAsIGxvZyk7CiAKIAllcnJvciA9IEVOT01FTTsKLQlicCA9IHhmc19idWZfZ2V0X2VtcHR5KGxvZy0+bF9pY2xvZ19zaXplLCBtcC0+bV9sb2dkZXZfdGFyZ3ApOworCWJwID0geGZzX2J1Zl9hbGxvYyhtcC0+bV9sb2dkZXZfdGFyZ3AsIDAsIGxvZy0+bF9pY2xvZ19zaXplLCAwKTsKIAlpZiAoIWJwKQogCQlnb3RvIG91dF9mcmVlX2xvZzsKIAlicC0+Yl9pb2RvbmUgPSB4bG9nX2lvZG9uZTsKQEAgLTEyNDcsNyArMTI0Nyw3IEBACiAKIAlpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7CiAJCXhmc19idWZfaW9lcnJvcihicCwgRUlPKTsKLQkJWEZTX0JVRl9TVEFMRShicCk7CisJCXhmc19idWZfc3RhbGUoYnApOwogCQl4ZnNfYnVmX2lvZW5kKGJwLCAwKTsKIAkJLyoKIAkJICogSXQgd291bGQgc2VlbSBsb2dpY2FsIHRvIHJldHVybiBFSU8gaGVyZSwgYnV0IHdlIHJlbHkgb24KQEAgLTEzODcsOSArMTM4Nyw5IEBACiAJICovCiAJWEZTX0JVRl9XUklURShicCk7CiAKLQlpZiAoKGVycm9yID0geGxvZ19iZHN0cmF0KGJwKSkpIHsKLQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfc3luYyIsIGxvZy0+bF9tcCwgYnAsCi0JCQkJICBYRlNfQlVGX0FERFIoYnApKTsKKwllcnJvciA9IHhsb2dfYmRzdHJhdChicCk7CisJaWYgKGVycm9yKSB7CisJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgInhsb2dfc3luYyIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCWlmIChzcGxpdCkgewpAQCAtMTQyMyw5ICsxNDIzLDkgQEAKIAkJLyogYWNjb3VudCBmb3IgaW50ZXJuYWwgbG9nIHdoaWNoIGRvZXNuJ3Qgc3RhcnQgYXQgYmxvY2sgIzAgKi8KIAkJWEZTX0JVRl9TRVRfQUREUihicCwgWEZTX0JVRl9BRERSKGJwKSArIGxvZy0+bF9sb2dCQnN0YXJ0KTsKIAkJWEZTX0JVRl9XUklURShicCk7Ci0JCWlmICgoZXJyb3IgPSB4bG9nX2Jkc3RyYXQoYnApKSkgewotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfc3luYyAoc3BsaXQpIiwgbG9nLT5sX21wLAotCQkJCQkgIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJZXJyb3IgPSB4bG9nX2Jkc3RyYXQoYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgInhsb2dfc3luYyAoc3BsaXQpIik7CiAJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5oIGIvZnMveGZzL3hmc19sb2cuaAppbmRleCA3OGM5MDM5Li4zZjdiZjQ1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5oCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmgKQEAgLTEzNyw3ICsxMzcsNyBAQAogdm9pZAl4ZnNfbG9nX2l0ZW1faW5pdChzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAkJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKml0ZW0sCiAJCQlpbnQJCQl0eXBlLAotCQkJc3RydWN0IHhmc19pdGVtX29wcwkqb3BzKTsKKwkJCWNvbnN0IHN0cnVjdCB4ZnNfaXRlbV9vcHMgKm9wcyk7CiAKIHhmc19sc25fdCB4ZnNfbG9nX2RvbmUoc3RydWN0IHhmc19tb3VudCAqbXAsCiAJCSAgICAgICBzdHJ1Y3QgeGxvZ190aWNrZXQgKnRpY2tldCwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwppbmRleCBhMTk5ZGJjLi41NDFhNTA4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKKysrIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCkBAIC0xODMsOCArMTgzLDcgQEAKIAl4ZnNiZHN0cmF0KGxvZy0+bF9tcCwgYnApOwogCWVycm9yID0geGZzX2J1Zl9pb3dhaXQoYnApOwogCWlmIChlcnJvcikKLQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfYnJlYWQiLCBsb2ctPmxfbXAsCi0JCQkJICBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgX19mdW5jX18pOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjY4LDkgKzI2NywxMCBAQAogCXhmc19idWZfbG9jayhicCk7CiAJWEZTX0JVRl9TRVRfQ09VTlQoYnAsIEJCVE9CKG5iYmxrcykpOwogCi0JaWYgKChlcnJvciA9IHhmc19id3JpdGUobG9nLT5sX21wLCBicCkpKQotCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19id3JpdGUiLCBsb2ctPmxfbXAsCi0JCQkJICBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwlpZiAoZXJyb3IpCisJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgX19mdW5jX18pOworCXhmc19idWZfcmVsc2UoYnApOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzYxLDkgKzM2MSw3IEBACiAJCSAqIFdlJ3JlIG5vdCBnb2luZyB0byBib3RoZXIgYWJvdXQgcmV0cnlpbmcKIAkJICogdGhpcyBkdXJpbmcgcmVjb3ZlcnkuIE9uZSBzdHJpa2UhCiAJCSAqLwotCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19yZWNvdmVyX2lvZG9uZSIsCi0JCQkJCWJwLT5iX3RhcmdldC0+YnRfbW91bnQsIGJwLAotCQkJCQlYRlNfQlVGX0FERFIoYnApKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCBfX2Z1bmNfXyk7CiAJCXhmc19mb3JjZV9zaHV0ZG93bihicC0+Yl90YXJnZXQtPmJ0X21vdW50LAogCQkJCQlTSFVURE9XTl9NRVRBX0lPX0VSUk9SKTsKIAl9CkBAIC0yMTM1LDggKzIxMzMsNyBAQAogCQlyZXR1cm4gWEZTX0VSUk9SKEVOT01FTSk7CiAJZXJyb3IgPSBicC0+Yl9lcnJvcjsKIAlpZiAoZXJyb3IpIHsKLQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9kby4uKHJlYWQjMSkiLCBtcCwKLQkJCQkgIGJwLCBidWZfZi0+YmxmX2Jsa25vKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCAieGxvZ19yZWNvdmVyX2RvLi4ocmVhZCMxKSIpOwogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTIxNzEsMTUgKzIxNjgsMTYgQEAKIAkgICAgYmUxNl90b19jcHUoKigoX19iZTE2ICopeGZzX2J1Zl9vZmZzZXQoYnAsIDApKSkgJiYKIAkgICAgKFhGU19CVUZfQ09VTlQoYnApICE9IE1BWChsb2ctPmxfbXAtPm1fc2Iuc2JfYmxvY2tzaXplLAogCQkJKF9fdWludDMyX3QpWEZTX0lOT0RFX0NMVVNURVJfU0laRShsb2ctPmxfbXApKSkpIHsKLQkJWEZTX0JVRl9TVEFMRShicCk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCQl4ZnNfYnVmX3N0YWxlKGJwKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKIAl9IGVsc2UgewogCQlBU1NFUlQoYnAtPmJfdGFyZ2V0LT5idF9tb3VudCA9PSBtcCk7CiAJCWJwLT5iX2lvZG9uZSA9IHhsb2dfcmVjb3Zlcl9pb2RvbmU7Ci0JCXhmc19iZHdyaXRlKG1wLCBicCk7CisJCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKIAl9CiAKLQlyZXR1cm4gKGVycm9yKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTIyMzAsOCArMjIyOCw3IEBACiAJfQogCWVycm9yID0gYnAtPmJfZXJyb3I7CiAJaWYgKGVycm9yKSB7Ci0JCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzIpIiwgbXAsCi0JCQkJICBicCwgaW5fZi0+aWxmX2Jsa25vKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCAieGxvZ19yZWNvdmVyX2RvLi4ocmVhZCMyKSIpOwogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0yNDM5LDcgKzI0MzYsOCBAQAogd3JpdGVfaW5vZGVfYnVmZmVyOgogCUFTU0VSVChicC0+Yl90YXJnZXQtPmJ0X21vdW50ID09IG1wKTsKIAlicC0+Yl9pb2RvbmUgPSB4bG9nX3JlY292ZXJfaW9kb25lOwotCXhmc19iZHdyaXRlKG1wLCBicCk7CisJeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnApOworCXhmc19idWZfcmVsc2UoYnApOwogZXJyb3I6CiAJaWYgKG5lZWRfZnJlZSkKIAkJa21lbV9mcmVlKGluX2YpOwpAQCAtMjUzNyw4ICsyNTM1LDcgQEAKIAkJCSAgICAgWEZTX0ZTQl9UT19CQihtcCwgZHFfZi0+cWxmX2xlbiksCiAJCQkgICAgIDAsICZicCk7CiAJaWYgKGVycm9yKSB7Ci0JCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzMpIiwgbXAsCi0JCQkJICBicCwgZHFfZi0+cWxmX2Jsa25vKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCAieGxvZ19yZWNvdmVyX2RvLi4ocmVhZCMzKSIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCUFTU0VSVChicCk7CkBAIC0yNTYxLDcgKzI1NTgsOCBAQAogCUFTU0VSVChkcV9mLT5xbGZfc2l6ZSA9PSAyKTsKIAlBU1NFUlQoYnAtPmJfdGFyZ2V0LT5idF9tb3VudCA9PSBtcCk7CiAJYnAtPmJfaW9kb25lID0geGxvZ19yZWNvdmVyX2lvZG9uZTsKLQl4ZnNfYmR3cml0ZShtcCwgYnApOworCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKIAogCXJldHVybiAoMCk7CiB9CkBAIC0zNjU2LDcgKzM2NTQsNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JWEZTX2JmbHVzaChsb2ctPmxfbXAtPm1fZGRldl90YXJncCk7CisJeGZzX2ZsdXNoX2J1ZnRhcmcobG9nLT5sX21wLT5tX2RkZXZfdGFyZ3AsIDEpOwogCiAJLyoKIAkgKiBJZiBJTyBlcnJvcnMgaGFwcGVuZWQgZHVyaW5nIHJlY292ZXJ5LCBiYWlsIG91dC4KQEAgLTM2ODksOCArMzY4Nyw3IEBACiAJeGZzYmRzdHJhdChsb2ctPmxfbXAsIGJwKTsKIAllcnJvciA9IHhmc19idWZfaW93YWl0KGJwKTsKIAlpZiAoZXJyb3IpIHsKLQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfZG9fcmVjb3ZlciIsCi0JCQkJICBsb2ctPmxfbXAsIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCBfX2Z1bmNfXyk7CiAJCUFTU0VSVCgwKTsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbWVzc2FnZS5oIGIvZnMveGZzL3hmc19tZXNzYWdlLmgKaW5kZXggN2ZiN2VhMC4uNTZkYzBjMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tZXNzYWdlLmgKKysrIGIvZnMveGZzL3hmc19tZXNzYWdlLmgKQEAgLTMsMzEgKzMsMjkgQEAKIAogc3RydWN0IHhmc19tb3VudDsKIAotZXh0ZXJuIHZvaWQgeGZzX2VtZXJnKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIHZvaWQgeGZzX2FsZXJ0KGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIHZvaWQgeGZzX2FsZXJ0X3RhZyhjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IHRhZywKLQkJCSBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIHZvaWQgeGZzX2NyaXQoY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotICAgICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gdm9pZCB4ZnNfZXJyKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIHZvaWQgeGZzX3dhcm4oY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotICAgICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gdm9pZCB4ZnNfbm90aWNlKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIHZvaWQgeGZzX2luZm8oY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotICAgICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gX19wcmludGYoMiwgMykKK3ZvaWQgeGZzX2VtZXJnKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK3ZvaWQgeGZzX2FsZXJ0KGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgeGZzX2FsZXJ0X3RhZyhjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IHRhZywgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIHhmc19jcml0KGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK3ZvaWQgeGZzX2Vycihjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIHhmc193YXJuKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK3ZvaWQgeGZzX25vdGljZShjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIHhmc19pbmZvKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKICNpZmRlZiBERUJVRwotZXh0ZXJuIHZvaWQgeGZzX2RlYnVnKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIHhmc19kZWJ1Zyhjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpCi14ZnNfZGVidWcoY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorc3RhdGljIGlubGluZSBfX3ByaW50ZigyLCAzKQordm9pZCB4ZnNfZGVidWcoY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmMgYi9mcy94ZnMveGZzX21vdW50LmMKaW5kZXggMDA4MTY1Ny4uZDA2YWZiYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5jCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuYwpAQCAtNDQsOSArNDQsNiBAQAogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCiAKLVNUQVRJQyB2b2lkCXhmc191bm1vdW50ZnNfd2FpdCh4ZnNfbW91bnRfdCAqKTsKLQotCiAjaWZkZWYgSEFWRV9QRVJDUFVfU0IKIFNUQVRJQyB2b2lkCXhmc19pY3NiX2JhbGFuY2VfY291bnRlcih4ZnNfbW91bnRfdCAqLCB4ZnNfc2JfZmllbGRfdCwKIAkJCQkJCWludCk7CkBAIC0xNDg0LDcgKzE0ODEsNyBAQAogCSAqIHN0YXRlIGFzIG11Y2ggYXMgcG9zc2libGUuCiAJICovCiAJeGZzX3JlY2xhaW1faW5vZGVzKG1wLCAwKTsKLQlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOworCXhmc19mbHVzaF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3AsIDEpOwogCXhmc19yZWNsYWltX2lub2RlcyhtcCwgU1lOQ19XQUlUKTsKIAogCXhmc19xbV91bm1vdW50KG1wKTsKQEAgLTE0OTYsMTEgKzE0OTMsNiBAQAogCSAqLwogCXhmc19sb2dfZm9yY2UobXAsIFhGU19MT0dfU1lOQyk7CiAKLQl4ZnNfYmludmFsKG1wLT5tX2RkZXZfdGFyZ3ApOwotCWlmIChtcC0+bV9ydGRldl90YXJncCkgewotCQl4ZnNfYmludmFsKG1wLT5tX3J0ZGV2X3RhcmdwKTsKLQl9Ci0KIAkvKgogCSAqIFVucmVzZXJ2ZSBhbnkgYmxvY2tzIHdlIGhhdmUgc28gdGhhdCB3aGVuIHdlIHVubW91bnQgd2UgZG9uJ3QgYWNjb3VudAogCSAqIHRoZSByZXNlcnZlZCBmcmVlIHNwYWNlIGFzIHVzZWQuIFRoaXMgaXMgcmVhbGx5IG9ubHkgbmVjZXNzYXJ5IGZvcgpAQCAtMTUyNiw3ICsxNTE4LDE2IEBACiAJCXhmc193YXJuKG1wLCAiVW5hYmxlIHRvIHVwZGF0ZSBzdXBlcmJsb2NrIGNvdW50ZXJzLiAiCiAJCQkJIkZyZWVzcGFjZSBtYXkgbm90IGJlIGNvcnJlY3Qgb24gbmV4dCBtb3VudC4iKTsKIAl4ZnNfdW5tb3VudGZzX3dyaXRlc2IobXApOwotCXhmc191bm1vdW50ZnNfd2FpdChtcCk7IAkJLyogd2FpdCBmb3IgYXN5bmMgYnVmcyAqLworCisJLyoKKwkgKiBNYWtlIHN1cmUgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIGZsdXNoZWQgYW5kIGNvbXBsZXRlZCBiZWZvcmUKKwkgKiB1bm1vdW50aW5nIHRoZSBsb2cuCisJICovCisJZXJyb3IgPSB4ZnNfZmx1c2hfYnVmdGFyZyhtcC0+bV9kZGV2X3RhcmdwLCAxKTsKKwlpZiAoZXJyb3IpCisJCXhmc193YXJuKG1wLCAiJWQgYnVzeSBidWZmZXJzIGR1cmluZyB1bm1vdW50LiIsIGVycm9yKTsKKwl4ZnNfd2FpdF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3ApOworCiAJeGZzX2xvZ191bm1vdW50X3dyaXRlKG1wKTsKIAl4ZnNfbG9nX3VubW91bnQobXApOwogCXhmc191dWlkX3VubW91bnQobXApOwpAQCAtMTUzNywxNiArMTUzOCw2IEBACiAJeGZzX2ZyZWVfcGVyYWcobXApOwogfQogCi1TVEFUSUMgdm9pZAoteGZzX3VubW91bnRmc193YWl0KHhmc19tb3VudF90ICptcCkKLXsKLQlpZiAobXAtPm1fbG9nZGV2X3RhcmdwICE9IG1wLT5tX2RkZXZfdGFyZ3ApCi0JCXhmc193YWl0X2J1ZnRhcmcobXAtPm1fbG9nZGV2X3RhcmdwKTsKLQlpZiAobXAtPm1fcnRkZXZfdGFyZ3ApCi0JCXhmc193YWl0X2J1ZnRhcmcobXAtPm1fcnRkZXZfdGFyZ3ApOwotCXhmc193YWl0X2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCk7Ci19Ci0KIGludAogeGZzX2ZzX3dyaXRhYmxlKHhmc19tb3VudF90ICptcCkKIHsKQEAgLTE2MTIsMTUgKzE2MDMsMTQgQEAKIAogCQlYRlNfQlVGX1VORE9ORShzYnApOwogCQlYRlNfQlVGX1VOUkVBRChzYnApOwotCQlYRlNfQlVGX1VOREVMQVlXUklURShzYnApOworCQl4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKHNicCk7CiAJCVhGU19CVUZfV1JJVEUoc2JwKTsKIAkJWEZTX0JVRl9VTkFTWU5DKHNicCk7CiAJCUFTU0VSVChzYnAtPmJfdGFyZ2V0ID09IG1wLT5tX2RkZXZfdGFyZ3ApOwogCQl4ZnNiZHN0cmF0KG1wLCBzYnApOwogCQllcnJvciA9IHhmc19idWZfaW93YWl0KHNicCk7CiAJCWlmIChlcnJvcikKLQkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfdW5tb3VudGZzX3dyaXRlc2IiLAotCQkJCQkgIG1wLCBzYnAsIFhGU19CVUZfQUREUihzYnApKTsKKwkJCXhmc19idWZfaW9lcnJvcl9hbGVydChzYnAsIF9fZnVuY19fKTsKIAkJeGZzX2J1Zl9yZWxzZShzYnApOwogCX0KIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3FtLmMgYi9mcy94ZnMveGZzX3FtLmMKaW5kZXggOWEwYWE3Ni4uNWNmZjQ0MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19xbS5jCisrKyBiL2ZzL3hmcy94ZnNfcW0uYwpAQCAtMTI5Niw3ICsxMjk2LDggQEAKIAkJCWJyZWFrOwogCiAJCXhmc19xbV9yZXNldF9kcWNvdW50cyhtcCwgYnAsIGZpcnN0aWQsIHR5cGUpOwotCQl4ZnNfYmR3cml0ZShtcCwgYnApOworCQl4ZnNfYnVmX2RlbHdyaV9xdWV1ZShicCk7CisJCXhmc19idWZfcmVsc2UoYnApOwogCQkvKgogCQkgKiBnb3RvIHRoZSBuZXh0IGJsb2NrLgogCQkgKi8KQEAgLTEzNDYsMTEgKzEzNDcsOCBAQAogCQkgKiB0aGUgaW5vZGUgaXMgbmV2ZXIgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLgogCQkgKi8KIAkJeGZzX2lsb2NrKHFpcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0JCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIHFpcCwgbGJsa25vLAotCQkJCSAgbWF4bGJsa2NudCAtIGxibGtubywKLQkJCQkgIFhGU19CTUFQSV9NRVRBREFUQSwKLQkJCQkgIE5VTEwsCi0JCQkJICAwLCBtYXAsICZubWFwcywgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQocWlwLCBsYmxrbm8sIG1heGxibGtjbnQgLSBsYmxrbm8sCisJCQkJICAgICAgIG1hcCwgJm5tYXBzLCAwKTsKIAkJeGZzX2l1bmxvY2socWlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CkBAIC0xNjgzLDcgKzE2ODEsNyBAQAogCSAqIHF1b3RhY2hlY2snZCBzdGFtcCBvbiB0aGUgc3VwZXJibG9jay4gU28sIGhlcmUgd2UgZG8gYSBzeW5jaHJvbm91cwogCSAqIGZsdXNoLgogCSAqLwotCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7CisJeGZzX2ZsdXNoX2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCwgMSk7CiAKIAkvKgogCSAqIElmIG9uZSB0eXBlIG9mIHF1b3RhcyBpcyBvZmYsIHRoZW4gaXQgd2lsbCBsb3NlIGl0cwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19xbV9zeXNjYWxscy5jIGIvZnMveGZzL3hmc19xbV9zeXNjYWxscy5jCmluZGV4IDYwOTI0NmYuLjVjYzNkZGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcW1fc3lzY2FsbHMuYworKysgYi9mcy94ZnMveGZzX3FtX3N5c2NhbGxzLmMKQEAgLTI2MSw3ICsyNjEsNyBAQAogCX0KIAogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19pam9pbih0cCwgaXApOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIDApOwogCiAJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2RhdGEoJnRwLCBpcCwgMCk7CiAJaWYgKGVycm9yKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3JlbmFtZS5jIGIvZnMveGZzL3hmc19yZW5hbWUuYwppbmRleCBkZjc4YzI5Li44NjZkZTI3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3JlbmFtZS5jCisrKyBiL2ZzL3hmcy94ZnNfcmVuYW1lLmMKQEAgLTE3MCwxMiArMTcwLDEyIEBACiAJICogd2UgY2FuIHJlbHkgb24gZWl0aGVyIHRyYW5zX2NvbW1pdCBvciB0cmFuc19jYW5jZWwgdG8gdW5sb2NrCiAJICogdGhlbS4KIAkgKi8KLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBzcmNfZHAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHNyY19kcCwgWEZTX0lMT0NLX0VYQ0wpOwogCWlmIChuZXdfcGFyZW50KQotCQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCB0YXJnZXRfZHAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBzcmNfaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCB0YXJnZXRfZHAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHNyY19pcCwgWEZTX0lMT0NLX0VYQ0wpOwogCWlmICh0YXJnZXRfaXApCi0JCXhmc190cmFuc19pam9pbl9yZWYodHAsIHRhcmdldF9pcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIHRhcmdldF9pcCwgWEZTX0lMT0NLX0VYQ0wpOwogCiAJLyoKIAkgKiBJZiB3ZSBhcmUgdXNpbmcgcHJvamVjdCBpbmhlcml0YW5jZSwgd2Ugb25seSBhbGxvdyByZW5hbWVzCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J0YWxsb2MuYyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCmluZGV4IDM1NTYxYTUuLjg3MzIzZjEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkJICogTG9jayB0aGUgaW5vZGUuCiAJCSAqLwogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCiAJCXhmc19ibWFwX2luaXQoJmZsaXN0LCAmZmlyc3RibG9jayk7CiAJCS8qCkBAIC0xMjAsOSArMTIwLDkgQEAKIAkJICovCiAJCW5tYXAgPSAxOwogCQljYW5jZWxmbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7Ci0JCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgb2Jsb2NrcywgbmJsb2NrcyAtIG9ibG9ja3MsCi0JCQlYRlNfQk1BUElfV1JJVEUgfCBYRlNfQk1BUElfTUVUQURBVEEsICZmaXJzdGJsb2NrLAotCQkJcmVzYmxrcywgJm1hcCwgJm5tYXAsICZmbGlzdCk7CisJCWVycm9yID0geGZzX2JtYXBpX3dyaXRlKHRwLCBpcCwgb2Jsb2NrcywgbmJsb2NrcyAtIG9ibG9ja3MsCisJCQkJCVhGU19CTUFQSV9NRVRBREFUQSwgJmZpcnN0YmxvY2ssCisJCQkJCXJlc2Jsa3MsICZtYXAsICZubWFwLCAmZmxpc3QpOwogCQlpZiAoIWVycm9yICYmIG5tYXAgPCAxKQogCQkJZXJyb3IgPSBYRlNfRVJST1IoRU5PU1BDKTsKIAkJaWYgKGVycm9yKQpAQCAtMTU1LDcgKzE1NSw3IEBACiAJCQkgKiBMb2NrIHRoZSBiaXRtYXAgaW5vZGUuCiAJCQkgKi8KIAkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAkJCS8qCiAJCQkgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBibG9jay4KIAkJCSAqLwpAQCAtODU2LDMzICs4NTYsMjMgQEAKIAl4ZnNfYnVmX3QJKipicHApCQkvKiBvdXRwdXQ6IGJ1ZmZlciBmb3IgdGhlIGJsb2NrICovCiB7CiAJeGZzX2J1Zl90CSpicDsJCS8qIGJsb2NrIGJ1ZmZlciwgcmVzdWx0ICovCi0JeGZzX2RhZGRyX3QJZDsJCS8qIGRpc2sgYWRkciBvZiBibG9jayAqLwotCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLwotCXhmc19mc2Jsb2NrX3QJZnNiOwkJLyogZnMgYmxvY2sgbnVtYmVyIGZvciBibG9jayAqLwogCXhmc19pbm9kZV90CSppcDsJCS8qIGJpdG1hcCBvciBzdW1tYXJ5IGlub2RlICovCisJeGZzX2JtYnRfaXJlY190CW1hcDsKKwlpbnQJCW5tYXA7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCiAKIAlpcCA9IGlzc3VtID8gbXAtPm1fcnN1bWlwIDogbXAtPm1fcmJtaXA7Ci0JLyoKLQkgKiBNYXAgZnJvbSB0aGUgZmlsZSBvZmZzZXQgKGJsb2NrKSBhbmQgaW5vZGUgbnVtYmVyIHRvIHRoZQotCSAqIGZpbGUgc3lzdGVtIGJsb2NrLgotCSAqLwotCWVycm9yID0geGZzX2JtYXBpX3NpbmdsZSh0cCwgaXAsIFhGU19EQVRBX0ZPUkssICZmc2IsIGJsb2NrKTsKLQlpZiAoZXJyb3IpIHsKKworCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIGJsb2NrLCAxLCAmbWFwLCAmbm1hcCwgWEZTX0RBVEFfRk9SSyk7CisJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7Ci0JfQotCUFTU0VSVChmc2IgIT0gTlVMTEZTQkxPQ0spOwotCS8qCi0JICogQ29udmVydCB0byBkaXNrIGFkZHJlc3MgZm9yIGJ1ZmZlciBjYWNoZS4KLQkgKi8KLQlkID0gWEZTX0ZTQl9UT19EQUREUihtcCwgZnNiKTsKLQkvKgotCSAqIFJlYWQgdGhlIGJ1ZmZlci4KLQkgKi8KLQllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCisKKwlBU1NFUlQobWFwLmJyX3N0YXJ0YmxvY2sgIT0gTlVMTEZTQkxPQ0spOworCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKG1wLCB0cCwgbXAtPm1fZGRldl90YXJncCwKKwkJCQkgICBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXAuYnJfc3RhcnRibG9jayksCiAJCQkJICAgbXAtPm1fYnNpemUsIDAsICZicCk7Ci0JaWYgKGVycm9yKSB7CisJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7Ci0JfQogCUFTU0VSVCgheGZzX2J1Zl9nZXRlcnJvcihicCkpOwogCSpicHAgPSBicDsKIAlyZXR1cm4gMDsKQEAgLTE5NzAsNyArMTk2MCw3IEBACiAJCSAqIExvY2sgb3V0IG90aGVyIGNhbGxlcnMgYnkgZ3JhYmJpbmcgdGhlIGJpdG1hcCBpbm9kZSBsb2NrLgogCQkgKi8KIAkJeGZzX2lsb2NrKG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCXhmc190cmFuc19pam9pbl9yZWYodHAsIG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19pam9pbih0cCwgbXAtPm1fcmJtaXAsIFhGU19JTE9DS19FWENMKTsKIAkJLyoKIAkJICogVXBkYXRlIHRoZSBiaXRtYXAgaW5vZGUncyBzaXplLgogCQkgKi8KQEAgLTE5ODIsNyArMTk3Miw3IEBACiAJCSAqIEdldCB0aGUgc3VtbWFyeSBpbm9kZSBpbnRvIHRoZSB0cmFuc2FjdGlvbi4KIAkJICovCiAJCXhmc19pbG9jayhtcC0+bV9yc3VtaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgbXAtPm1fcnN1bWlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19pam9pbih0cCwgbXAtPm1fcnN1bWlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJCS8qCiAJCSAqIFVwZGF0ZSB0aGUgc3VtbWFyeSBpbm9kZSdzIHNpemUuCiAJCSAqLwpAQCAtMjE1Myw3ICsyMTQzLDcgQEAKIAkgKiBTeW5jaHJvbml6ZSBieSBsb2NraW5nIHRoZSBiaXRtYXAgaW5vZGUuCiAJICovCiAJeGZzX2lsb2NrKG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgbXAtPm1fcmJtaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKICNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmIGRlZmluZWQoREVCVUcpCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcncuYyBiL2ZzL3hmcy94ZnNfcncuYwppbmRleCBjOTZhOGEwLi41OTdkMDQ0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3J3LmMKKysrIGIvZnMveGZzL3hmc19ydy5jCkBAIC05MiwyNCArOTIsNiBAQAogfQogCiAvKgotICogUHJpbnRzIG91dCBhbiBBTEVSVCBtZXNzYWdlIGFib3V0IEkvTyBlcnJvci4KLSAqLwotdm9pZAoteGZzX2lvZXJyb3JfYWxlcnQoCi0JY2hhcgkJCSpmdW5jLAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAotCXhmc19idWZfdAkJKmJwLAotCXhmc19kYWRkcl90CQlibGtubykKLXsKLQl4ZnNfYWxlcnQobXAsCi0JCSAiSS9PIGVycm9yIG9jY3VycmVkOiBtZXRhLWRhdGEgZGV2ICVzIGJsb2NrIDB4JWxseCIKLQkJICIgICAgICAgKFwiJXNcIikgZXJyb3IgJWQgYnVmIGNvdW50ICV6ZCIsCi0JCXhmc19idWZfdGFyZ2V0X25hbWUoYnAtPmJfdGFyZ2V0KSwKLQkJKF9fdWludDY0X3QpYmxrbm8sIGZ1bmMsCi0JCWJwLT5iX2Vycm9yLCBYRlNfQlVGX0NPVU5UKGJwKSk7Ci19Ci0KLS8qCiAgKiBUaGlzIGlzbid0IGFuIGFic29sdXRlIHJlcXVpcmVtZW50LCBidXQgaXQgaXMKICAqIGp1c3QgYSBnb29kIGlkZWEgdG8gY2FsbCB4ZnNfcmVhZF9idWYgaW5zdGVhZCBvZgogICogZGlyZWN0bHkgZG9pbmcgYSByZWFkX2J1ZiBjYWxsLiBGb3Igb25lLCB3ZSBzaG91bGRuJ3QKQEAgLTE0MywxNCArMTI1LDEzIEBACiAJfSBlbHNlIHsKIAkJKmJwcCA9IE5VTEw7CiAJCWlmIChlcnJvcikgewotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc19yZWFkX2J1ZiIsIG1wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7CiAJCX0KIAkJaWYgKGJwKSB7CiAJCQlYRlNfQlVGX1VORE9ORShicCk7Ci0JCQlYRlNfQlVGX1VOREVMQVlXUklURShicCk7Ci0JCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJCXhmc19idWZfc3RhbGUoYnApOwogCQkJLyoKIAkJCSAqIGJyZWxzZSBjbGVhcnMgQl9FUlJPUiBhbmQgYl9lcnJvcgogCQkJICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmggYi9mcy94ZnMveGZzX3J3LmgKaW5kZXggMTFjNDFlYy4uYmJkYjlhZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydy5oCisrKyBiL2ZzL3hmcy94ZnNfcncuaApAQCAtNDIsOCArNDIsNiBAQAogZXh0ZXJuIGludCB4ZnNfcmVhZF9idWYoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19idWZ0YXJnX3QgKmJ0cCwKIAkJCXhmc19kYWRkcl90IGJsa25vLCBpbnQgbGVuLCB1aW50IGZsYWdzLAogCQkJc3RydWN0IHhmc19idWYgKipicHApOwotZXh0ZXJuIHZvaWQgeGZzX2lvZXJyb3JfYWxlcnQoY2hhciAqZnVuYywgc3RydWN0IHhmc19tb3VudCAqbXAsCi0JCQkJeGZzX2J1Zl90ICpicCwgeGZzX2RhZGRyX3QgYmxrbm8pOwogZXh0ZXJuIHhmc19leHRsZW5fdCB4ZnNfZ2V0X2V4dHN6X2hpbnQoc3RydWN0IHhmc19pbm9kZSAqaXApOwogCiAjZW5kaWYgLyogX19YRlNfUldfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3N1cGVyLmMgYi9mcy94ZnMveGZzX3N1cGVyLmMKaW5kZXggNWNmMDZiOC4uM2VjYTU4ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy94ZnNfc3VwZXIuYwpAQCAtNzk2LDggKzc5Niw2IEBACiAJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCiAJCWdvdG8gb3V0X3JlY2xhaW07CiAKLQl4ZnNfaW9lbmRfd2FpdChpcCk7Ci0KIAlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkgfHwgaXAtPmlfZGVsYXllZF9ibGtzID09IDApOwogCiAJLyoKQEAgLTgzNyw3ICs4MzUsNiBAQAogCWlub2RlX2luaXRfb25jZShWRlNfSShpcCkpOwogCiAJLyogeGZzIGlub2RlICovCi0JYXRvbWljX3NldCgmaXAtPmlfaW9jb3VudCwgMCk7CiAJYXRvbWljX3NldCgmaXAtPmlfcGluY291bnQsIDApOwogCXNwaW5fbG9ja19pbml0KCZpcC0+aV9mbGFnc19sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpcC0+aV9pcGluX3dhaXQpOwpAQCAtODg3LDcgKzg4NCw3IEBACiAJfQogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwogCXJldHVybiB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKIH0KQEAgLTkxNCw5ICs5MTEsOCBAQAogCQkgKiBvZiBmb3JjaW5nIGl0IGFsbCB0aGUgd2F5IHRvIHN0YWJsZSBzdG9yYWdlIHVzaW5nIGEKIAkJICogc3luY2hyb25vdXMgdHJhbnNhY3Rpb24gd2UgbGV0IHRoZSBsb2cgZm9yY2UgaW5zaWRlIHRoZQogCQkgKiAtPnN5bmNfZnMgY2FsbCBkbyB0aGF0IGZvciB0aHVzLCB3aGljaCByZWR1Y2VzIHRoZSBudW1iZXIKLQkJICogb2Ygc3luY2hyb25vdXMgbG9nIGZvY2VzIGRyYW1hdGljYWxseS4KKwkJICogb2Ygc3luY2hyb25vdXMgbG9nIGZvcmNlcyBkcmFtYXRpY2FsbHkuCiAJCSAqLwotCQl4ZnNfaW9lbmRfd2FpdChpcCk7CiAJCWVycm9yID0geGZzX2xvZ19pbm9kZShpcCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwpAQCAtMTAxOSw3ICsxMDE1LDcgQEAKIAkgKi8KIAl4ZnNfZmlsZXN0cmVhbV91bm1vdW50KG1wKTsKIAotCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7CisJeGZzX2ZsdXNoX2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCwgMSk7CiAKIAl4ZnNfdW5tb3VudGZzKG1wKTsKIAl4ZnNfZnJlZXNiKG1wKTsKQEAgLTE0NDMsNyArMTQzOSw3IEBACiAJICovCiAJeGZzX2ZpbGVzdHJlYW1fdW5tb3VudChtcCk7CiAKLQlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOworCXhmc19mbHVzaF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3AsIDEpOwogCiAJeGZzX3VubW91bnRmcyhtcCk7CiAJZ290byBvdXRfZnJlZV9zYjsKQEAgLTE2NzAsNyArMTY2Niw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyBYRlNfVkVSU0lPTl9TVFJJTkcgIiB3aXRoICIKIAkJCSBYRlNfQlVJTERfT1BUSU9OUyAiIGVuYWJsZWRcbiIpOwogCi0JeGZzX2lvZW5kX2luaXQoKTsKIAl4ZnNfZGlyX3N0YXJ0dXAoKTsKIAogCWVycm9yID0geGZzX2luaXRfem9uZXMoKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfc3luYy5jIGIvZnMveGZzL3hmc19zeW5jLmMKaW5kZXggNDYwNGY5MC4uYWEzZGMxYSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19zeW5jLmMKKysrIGIvZnMveGZzL3hmc19zeW5jLmMKQEAgLTIyNywyMSArMjI3LDE3IEBACiAJaW50CQkJZXJyb3IgPSAwOwogCiAJaWYgKCFtYXBwaW5nX3RhZ2dlZChtYXBwaW5nLCBQQUdFQ0FDSEVfVEFHX0RJUlRZKSkKLQkJZ290byBvdXRfd2FpdDsKKwkJcmV0dXJuIDA7CiAKIAlpZiAoIXhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JT0xPQ0tfU0hBUkVEKSkgewogCQlpZiAoZmxhZ3MgJiBTWU5DX1RSWUxPQ0spCi0JCQlnb3RvIG91dF93YWl0OworCQkJcmV0dXJuIDA7CiAJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwogCX0KIAogCWVycm9yID0geGZzX2ZsdXNoX3BhZ2VzKGlwLCAwLCAtMSwgKGZsYWdzICYgU1lOQ19XQUlUKSA/CiAJCQkJMCA6IFhCRl9BU1lOQywgRklfTk9ORSk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKLQotIG91dF93YWl0OgotCWlmIChmbGFncyAmIFNZTkNfV0FJVCkKLQkJeGZzX2lvZW5kX3dhaXQoaXApOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzIyLDYgKzMxOCw3IEBACiAJc3RydWN0IHhmc19tb3VudAkqbXApCiB7CiAJc3RydWN0IHhmc19idWYJCSpicDsKKwlpbnQJCQllcnJvcjsKIAogCS8qCiAJICogSWYgdGhlIGJ1ZmZlciBpcyBwaW5uZWQgdGhlbiBwdXNoIG9uIHRoZSBsb2cgc28gd2Ugd29uJ3QgZ2V0IHN0dWNrCkBAIC0zMzQsOCArMzMxLDkgQEAKIAlicCA9IHhmc19nZXRzYihtcCwgMCk7CiAJaWYgKHhmc19idWZfaXNwaW5uZWQoYnApKQogCQl4ZnNfbG9nX2ZvcmNlKG1wLCAwKTsKLQotCXJldHVybiB4ZnNfYndyaXRlKG1wLCBicCk7CisJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC0zNzksNyArMzc3LDcgQEAKIAogCS8qIGZsdXNoIGRhdGEtb25seSBkZXZpY2VzICovCiAJaWYgKG1wLT5tX3J0ZGV2X3RhcmdwKQotCQlYRlNfYmZsdXNoKG1wLT5tX3J0ZGV2X3RhcmdwKTsKKwkJeGZzX2ZsdXNoX2J1ZnRhcmcobXAtPm1fcnRkZXZfdGFyZ3AsIDEpOwogCiAJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBlcnJvcjI7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYWNlLmggYi9mcy94ZnMveGZzX3RyYWNlLmgKaW5kZXggNjkwZmM3YS4uZjFkMjgwMiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFjZS5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhY2UuaApAQCAtMzAsNiArMzAsNyBAQAogc3RydWN0IHhmc19kYV9hcmdzOwogc3RydWN0IHhmc19kYV9ub2RlX2VudHJ5Owogc3RydWN0IHhmc19kcXVvdDsKK3N0cnVjdCB4ZnNfbG9nX2l0ZW07CiBzdHJ1Y3QgeGxvZ190aWNrZXQ7CiBzdHJ1Y3QgbG9nOwogc3RydWN0IHhsb2dfcmVjb3ZlcjsKQEAgLTMyMCw3ICszMjEsNiBAQAogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX2lvZG9uZSk7CiBERUZJTkVfQlVGX0VWRU5UKHhmc19idWZfaW9yZXF1ZXN0KTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9iYXdyaXRlKTsKLURFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9iZHdyaXRlKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9sb2NrKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9sb2NrX2RvbmUpOwogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX3RyeWxvY2spOwpAQCAtNTc3LDYgKzU3Nyw3IEBACiBERUZJTkVfSU5PREVfRVZFTlQoeGZzX2ZpbGVfaW9jdGwpOwogREVGSU5FX0lOT0RFX0VWRU5UKHhmc19maWxlX2NvbXBhdF9pb2N0bCk7CiBERUZJTkVfSU5PREVfRVZFTlQoeGZzX2lvY3RsX3NldGF0dHIpOworREVGSU5FX0lOT0RFX0VWRU5UKHhmc19kaXJfZnN5bmMpOwogREVGSU5FX0lOT0RFX0VWRU5UKHhmc19maWxlX2ZzeW5jKTsKIERFRklORV9JTk9ERV9FVkVOVCh4ZnNfZGVzdHJveV9pbm9kZSk7CiBERUZJTkVfSU5PREVfRVZFTlQoeGZzX3dyaXRlX2lub2RlKTsKQEAgLTg1Myw2ICs4NTQsNDIgQEAKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3VuZ3JhbnRfZXhpdCk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ191bmdyYW50X3N1Yik7CiAKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoeGZzX2xvZ19pdGVtX2NsYXNzLAorCVRQX1BST1RPKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCksCisJVFBfQVJHUyhsaXApLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoZGV2X3QsIGRldikKKwkJX19maWVsZCh2b2lkICosIGxpcCkKKwkJX19maWVsZCh1aW50LCB0eXBlKQorCQlfX2ZpZWxkKHVpbnQsIGZsYWdzKQorCQlfX2ZpZWxkKHhmc19sc25fdCwgbHNuKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldiA9IGxpcC0+bGlfbW91bnRwLT5tX3N1cGVyLT5zX2RldjsKKwkJX19lbnRyeS0+bGlwID0gbGlwOworCQlfX2VudHJ5LT50eXBlID0gbGlwLT5saV90eXBlOworCQlfX2VudHJ5LT5mbGFncyA9IGxpcC0+bGlfZmxhZ3M7CisJCV9fZW50cnktPmxzbiA9IGxpcC0+bGlfbHNuOworCSksCisJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgbGlwIDB4JXAgbHNuICVkLyVkIHR5cGUgJXMgZmxhZ3MgJXMiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+bGlwLAorCQkgIENZQ0xFX0xTTihfX2VudHJ5LT5sc24pLCBCTE9DS19MU04oX19lbnRyeS0+bHNuKSwKKwkJICBfX3ByaW50X3N5bWJvbGljKF9fZW50cnktPnR5cGUsIFhGU19MSV9UWVBFX0RFU0MpLAorCQkgIF9fcHJpbnRfZmxhZ3MoX19lbnRyeS0+ZmxhZ3MsICJ8IiwgWEZTX0xJX0ZMQUdTKSkKKykKKworI2RlZmluZSBERUZJTkVfTE9HX0lURU1fRVZFTlQobmFtZSkgXAorREVGSU5FX0VWRU5UKHhmc19sb2dfaXRlbV9jbGFzcywgbmFtZSwgXAorCVRQX1BST1RPKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCksIFwKKwlUUF9BUkdTKGxpcCkpCitERUZJTkVfTE9HX0lURU1fRVZFTlQoeGZzX2FpbF9wdXNoKTsKK0RFRklORV9MT0dfSVRFTV9FVkVOVCh4ZnNfYWlsX3B1c2hidWYpOworREVGSU5FX0xPR19JVEVNX0VWRU5UKHhmc19haWxfcHVzaGJ1Zl9waW5uZWQpOworREVGSU5FX0xPR19JVEVNX0VWRU5UKHhmc19haWxfcGlubmVkKTsKK0RFRklORV9MT0dfSVRFTV9FVkVOVCh4ZnNfYWlsX2xvY2tlZCk7CisKKwogREVDTEFSRV9FVkVOVF9DTEFTUyh4ZnNfZmlsZV9jbGFzcywKIAlUUF9QUk9UTyhzdHJ1Y3QgeGZzX2lub2RlICppcCwgc2l6ZV90IGNvdW50LCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgZmxhZ3MpLAogCVRQX0FSR1MoaXAsIGNvdW50LCBvZmZzZXQsIGZsYWdzKSwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuYyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwppbmRleCBlZmMxNDdmLi4xZjM1YjJmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmMKKysrIGIvZnMveGZzL3hmc190cmFucy5jCkBAIC0xNzkwLDkgKzE3OTAsNyBAQAogfQogCiAvKgotICogeGZzX3RyYW5zX2NvbW1pdAotICoKLSAqIENvbW1pdCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gdG8gdGhlIGxvZyBhL3N5bmNocm9ub3VzbHkuCisgKiBDb21taXQgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIHRvIHRoZSBsb2cuCiAgKgogICogWEZTIGRpc2sgZXJyb3IgaGFuZGxpbmcgbWVjaGFuaXNtIGlzIG5vdCBiYXNlZCBvbiBhIHR5cGljYWwKICAqIHRyYW5zYWN0aW9uIGFib3J0IG1lY2hhbmlzbS4gTG9naWNhbGx5IGFmdGVyIHRoZSBmaWxlc3lzdGVtCkBAIC0xODA0LDEwICsxODAyLDkgQEAKICAqIERvIG5vdCByZWZlcmVuY2UgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSBhZnRlciB0aGlzIGNhbGwuCiAgKi8KIGludAotX3hmc190cmFuc19jb21taXQoCit4ZnNfdHJhbnNfY29tbWl0KAogCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAotCXVpbnQJCQlmbGFncywKLQlpbnQJCQkqbG9nX2ZsdXNoZWQpCisJdWludAkJCWZsYWdzKQogewogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gdHAtPnRfbW91bnRwOwogCXhmc19sc25fdAkJY29tbWl0X2xzbiA9IC0xOwpAQCAtMTg2Niw3ICsxODYzLDcgQEAKIAlpZiAoc3luYykgewogCQlpZiAoIWVycm9yKSB7CiAJCQllcnJvciA9IF94ZnNfbG9nX2ZvcmNlX2xzbihtcCwgY29tbWl0X2xzbiwKLQkJCQkgICAgICBYRlNfTE9HX1NZTkMsIGxvZ19mbHVzaGVkKTsKKwkJCQkgICAgICBYRlNfTE9HX1NZTkMsIE5VTEwpOwogCQl9CiAJCVhGU19TVEFUU19JTkMoeHNfdHJhbnNfc3luYyk7CiAJfSBlbHNlIHsKQEAgLTIwMjEsNiArMjAxOCw2IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQl4ZnNfdHJhbnNfaWpvaW4odHJhbnMsIGRwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHJhbnMsIGRwLCAwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuaCBiL2ZzL3hmcy94ZnNfdHJhbnMuaAppbmRleCA1MzU5N2Y0Li4zYWU3MTNjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmgKKysrIGIvZnMveGZzL3hmc190cmFucy5oCkBAIC0zMjYsNyArMzI2LDcgQEAKIAkJCQkJCSBzdHJ1Y3QgeGZzX2xvZ19pdGVtICopOwogCQkJCQkJCS8qIGJ1ZmZlciBpdGVtIGlvZG9uZSAqLwogCQkJCQkJCS8qIGNhbGxiYWNrIGZ1bmMgKi8KLQlzdHJ1Y3QgeGZzX2l0ZW1fb3BzCQkqbGlfb3BzOwkvKiBmdW5jdGlvbiBsaXN0ICovCisJY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcwkqbGlfb3BzOwkvKiBmdW5jdGlvbiBsaXN0ICovCiAKIAkvKiBkZWxheWVkIGxvZ2dpbmcgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaV9jaWw7CQkvKiBDSUwgcG9pbnRlcnMgKi8KQEAgLTM0MSw3ICszNDEsNyBAQAogCXsgWEZTX0xJX0lOX0FJTCwJIklOX0FJTCIgfSwgXAogCXsgWEZTX0xJX0FCT1JURUQsCSJBQk9SVEVEIiB9CiAKLXR5cGVkZWYgc3RydWN0IHhmc19pdGVtX29wcyB7CitzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHsKIAl1aW50ICgqaW9wX3NpemUpKHhmc19sb2dfaXRlbV90ICopOwogCXZvaWQgKCppb3BfZm9ybWF0KSh4ZnNfbG9nX2l0ZW1fdCAqLCBzdHJ1Y3QgeGZzX2xvZ19pb3ZlYyAqKTsKIAl2b2lkICgqaW9wX3BpbikoeGZzX2xvZ19pdGVtX3QgKik7CkBAIC0zNTIsNyArMzUyLDcgQEAKIAl2b2lkICgqaW9wX3B1c2gpKHhmc19sb2dfaXRlbV90ICopOwogCWJvb2wgKCppb3BfcHVzaGJ1ZikoeGZzX2xvZ19pdGVtX3QgKik7CiAJdm9pZCAoKmlvcF9jb21taXR0aW5nKSh4ZnNfbG9nX2l0ZW1fdCAqLCB4ZnNfbHNuX3QpOwotfSB4ZnNfaXRlbV9vcHNfdDsKK307CiAKICNkZWZpbmUgSU9QX1NJWkUoaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3NpemUpKGlwKQogI2RlZmluZSBJT1BfRk9STUFUKGlwLHZwKQkoKihpcCktPmxpX29wcy0+aW9wX2Zvcm1hdCkoaXAsIHZwKQpAQCAtNDcwLDggKzQ3MCw3IEBACiB2b2lkCQl4ZnNfdHJhbnNfZHF1b3RfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICosIHVpbnQpOwogdm9pZAkJeGZzX3RyYW5zX2lub2RlX2FsbG9jX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKIHZvaWQJCXhmc190cmFuc19pY2hndGltZShzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwgaW50KTsKLXZvaWQJCXhmc190cmFuc19pam9pbl9yZWYoc3RydWN0IHhmc190cmFucyAqLCBzdHJ1Y3QgeGZzX2lub2RlICosIHVpbnQpOwotdm9pZAkJeGZzX3RyYW5zX2lqb2luKHN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19pbm9kZSAqKTsKK3ZvaWQJCXhmc190cmFuc19pam9pbihzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwgdWludCk7CiB2b2lkCQl4ZnNfdHJhbnNfbG9nX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqLCB1aW50LCB1aW50KTsKIHZvaWQJCXhmc190cmFuc19sb2dfaW5vZGUoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19pbm9kZSAqLCB1aW50KTsKIHN0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtCSp4ZnNfdHJhbnNfZ2V0X2VmaSh4ZnNfdHJhbnNfdCAqLCB1aW50KTsKQEAgLTQ4NywxMCArNDg2LDcgQEAKIAkJCQkJIHN0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtICosCiAJCQkJCSB4ZnNfZnNibG9ja190LAogCQkJCQkgeGZzX2V4dGxlbl90KTsKLWludAkJX3hmc190cmFuc19jb21taXQoeGZzX3RyYW5zX3QgKiwKLQkJCQkgIHVpbnQgZmxhZ3MsCi0JCQkJICBpbnQgKik7Ci0jZGVmaW5lIHhmc190cmFuc19jb21taXQodHAsIGZsYWdzKQlfeGZzX3RyYW5zX2NvbW1pdCh0cCwgZmxhZ3MsIE5VTEwpCitpbnQJCXhmc190cmFuc19jb21taXQoeGZzX3RyYW5zX3QgKiwgdWludCBmbGFncyk7CiB2b2lkCQl4ZnNfdHJhbnNfY2FuY2VsKHhmc190cmFuc190ICosIGludCk7CiBpbnQJCXhmc190cmFuc19haWxfaW5pdChzdHJ1Y3QgeGZzX21vdW50ICopOwogdm9pZAkJeGZzX3RyYW5zX2FpbF9kZXN0cm95KHN0cnVjdCB4ZnNfbW91bnQgKik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2FpbC5jIGIvZnMveGZzL3hmc190cmFuc19haWwuYwppbmRleCAzYTFlN2NhNS4uZWQ5MjUyYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19haWwuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKIAogI2lmZGVmIERFQlVHCkBAIC0zNjQsMTIgKzM2NSwyNCBAQAogCXhmc19sc25fdAkJbHNuOwogCXhmc19sc25fdAkJdGFyZ2V0OwogCWxvbmcJCQl0b3V0ID0gMTA7Ci0JaW50CQkJZmx1c2hfbG9nID0gMDsKIAlpbnQJCQlzdHVjayA9IDA7CiAJaW50CQkJY291bnQgPSAwOwogCWludAkJCXB1c2hfeGZzYnVmZCA9IDA7CiAKKwkvKgorCSAqIElmIGxhc3QgdGltZSB3ZSByYW4gd2UgZW5jb3VudGVyZWQgcGlubmVkIGl0ZW1zLCBmb3JjZSB0aGUgbG9nIGZpcnN0CisJICogYW5kIHdhaXQgZm9yIGl0IGJlZm9yZSBwdXNoaW5nIGFnYWluLgorCSAqLwogCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJaWYgKGFpbHAtPnhhX2xhc3RfcHVzaGVkX2xzbiA9PSAwICYmIGFpbHAtPnhhX2xvZ19mbHVzaCAmJgorCSAgICAhbGlzdF9lbXB0eSgmYWlscC0+eGFfYWlsKSkgeworCQlhaWxwLT54YV9sb2dfZmx1c2ggPSAwOworCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CisJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfZmx1c2gpOworCQl4ZnNfbG9nX2ZvcmNlKG1wLCBYRlNfTE9HX1NZTkMpOworCQlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCX0KKwogCXRhcmdldCA9IGFpbHAtPnhhX3RhcmdldDsKIAlsaXAgPSB4ZnNfdHJhbnNfYWlsX2N1cnNvcl9maXJzdChhaWxwLCAmY3VyLCBhaWxwLT54YV9sYXN0X3B1c2hlZF9sc24pOwogCWlmICghbGlwIHx8IFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CkBAIC00MTMsMTYgKzQyNiwyMCBAQAogCQlzd2l0Y2ggKGxvY2tfcmVzdWx0KSB7CiAJCWNhc2UgWEZTX0lURU1fU1VDQ0VTUzoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfc3VjY2Vzcyk7CisJCQl0cmFjZV94ZnNfYWlsX3B1c2gobGlwKTsKKwogCQkJSU9QX1BVU0gobGlwKTsKIAkJCWFpbHAtPnhhX2xhc3RfcHVzaGVkX2xzbiA9IGxzbjsKIAkJCWJyZWFrOwogCiAJCWNhc2UgWEZTX0lURU1fUFVTSEJVRjoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcHVzaGJ1Zik7CisJCQl0cmFjZV94ZnNfYWlsX3B1c2hidWYobGlwKTsKIAogCQkJaWYgKCFJT1BfUFVTSEJVRihsaXApKSB7CisJCQkJdHJhY2VfeGZzX2FpbF9wdXNoYnVmX3Bpbm5lZChsaXApOwogCQkJCXN0dWNrKys7Ci0JCQkJZmx1c2hfbG9nID0gMTsKKwkJCQlhaWxwLT54YV9sb2dfZmx1c2grKzsKIAkJCX0gZWxzZSB7CiAJCQkJYWlscC0+eGFfbGFzdF9wdXNoZWRfbHNuID0gbHNuOwogCQkJfQpAQCAtNDMxLDEyICs0NDgsMTUgQEAKIAogCQljYXNlIFhGU19JVEVNX1BJTk5FRDoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcGlubmVkKTsKKwkJCXRyYWNlX3hmc19haWxfcGlubmVkKGxpcCk7CisKIAkJCXN0dWNrKys7Ci0JCQlmbHVzaF9sb2cgPSAxOworCQkJYWlscC0+eGFfbG9nX2ZsdXNoKys7CiAJCQlicmVhazsKIAogCQljYXNlIFhGU19JVEVNX0xPQ0tFRDoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfbG9ja2VkKTsKKwkJCXRyYWNlX3hmc19haWxfbG9ja2VkKGxpcCk7CiAJCQlzdHVjaysrOwogCQkJYnJlYWs7CiAKQEAgLTQ3NiwxNiArNDk2LDYgQEAKIAl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9kb25lKGFpbHAsICZjdXIpOwogCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAotCWlmIChmbHVzaF9sb2cpIHsKLQkJLyoKLQkJICogSWYgc29tZXRoaW5nIHdlIG5lZWQgdG8gcHVzaCBvdXQgd2FzIHBpbm5lZCwgdGhlbgotCQkgKiBwdXNoIG91dCB0aGUgbG9nIHNvIGl0IHdpbGwgYmVjb21lIHVucGlubmVkIGFuZAotCQkgKiBtb3ZlIGZvcndhcmQgaW4gdGhlIEFJTC4KLQkJICovCi0JCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfZmx1c2gpOwotCQl4ZnNfbG9nX2ZvcmNlKG1wLCAwKTsKLQl9Ci0KIAlpZiAocHVzaF94ZnNidWZkKSB7CiAJCS8qIHdlJ3ZlIGdvdCBkZWxheWVkIHdyaXRlIGJ1ZmZlcnMgdG8gZmx1c2ggKi8KIAkJd2FrZV91cF9wcm9jZXNzKG1wLT5tX2RkZXZfdGFyZ3AtPmJ0X3Rhc2spOwpAQCAtNDk2LDYgKzUwNiw3IEBACiAJaWYgKCFjb3VudCkgewogCQkvKiBXZSdyZSBwYXN0IG91ciB0YXJnZXQgb3IgZW1wdHksIHNvIGlkbGUgKi8KIAkJYWlscC0+eGFfbGFzdF9wdXNoZWRfbHNuID0gMDsKKwkJYWlscC0+eGFfbG9nX2ZsdXNoID0gMDsKIAogCQl0b3V0ID0gNTA7CiAJfSBlbHNlIGlmIChYRlNfTFNOX0NNUChsc24sIHRhcmdldCkgPj0gMCkgewpAQCAtNTE0LDkgKzUyNSwxMyBAQAogCQkgKiB3ZXJlIHN0dWNrLgogCQkgKgogCQkgKiBCYWNrb2ZmIGEgYml0IG1vcmUgdG8gYWxsb3cgc29tZSBJL08gdG8gY29tcGxldGUgYmVmb3JlCi0JCSAqIGNvbnRpbnVpbmcgZnJvbSB3aGVyZSB3ZSB3ZXJlLgorCQkgKiByZXN0YXJ0aW5nIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBBSUwuIFRoaXMgcHJldmVudHMgdXMKKwkJICogZnJvbSBzcGlubmluZyBvbiB0aGUgc2FtZSBpdGVtcywgYW5kIGlmIHRoZXkgYXJlIHBpbm5lZCB3aWxsCisJCSAqIGFsbCB0aGUgcmVzdGFydCB0byBpc3N1ZSBhIGxvZyBmb3JjZSB0byB1bnBpbiB0aGUgc3R1Y2sKKwkJICogaXRlbXMuCiAJCSAqLwogCQl0b3V0ID0gMjA7CisJCWFpbHAtPnhhX2xhc3RfcHVzaGVkX2xzbiA9IDA7CiAJfQogCiAJcmV0dXJuIHRvdXQ7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jIGIvZnMveGZzL3hmc190cmFuc19idWYuYwppbmRleCAxMzdlMmI5Li40NzVhNGRlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKQEAgLTE2MCw4ICsxNjAsMTAgQEAKIAlicCA9IHhmc190cmFuc19idWZfaXRlbV9tYXRjaCh0cCwgdGFyZ2V0X2RldiwgYmxrbm8sIGxlbik7CiAJaWYgKGJwICE9IE5VTEwpIHsKIAkJQVNTRVJUKHhmc19idWZfaXNsb2NrZWQoYnApKTsKLQkJaWYgKFhGU19GT1JDRURfU0hVVERPV04odHAtPnRfbW91bnRwKSkKLQkJCVhGU19CVUZfU1VQRVJfU1RBTEUoYnApOworCQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTih0cC0+dF9tb3VudHApKSB7CisJCQl4ZnNfYnVmX3N0YWxlKGJwKTsKKwkJCVhGU19CVUZfRE9ORShicCk7CisJCX0KIAogCQkvKgogCQkgKiBJZiB0aGUgYnVmZmVyIGlzIHN0YWxlIHRoZW4gaXQgd2FzIGJpbnZhbCdlZApAQCAtMjk0LDggKzI5Niw3IEBACiAKIAkJaWYgKGJwLT5iX2Vycm9yKSB7CiAJCQllcnJvciA9IGJwLT5iX2Vycm9yOwotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc190cmFuc19yZWFkX2J1ZiIsIG1wLAotCQkJCQkgIGJwLCBibGtubyk7CisJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKIAkJCXhmc19idWZfcmVsc2UoYnApOwogCQkJcmV0dXJuIGVycm9yOwogCQl9CkBAIC0zMzcsOCArMzM4LDcgQEAKIAkJCXhmc2Jkc3RyYXQodHAtPnRfbW91bnRwLCBicCk7CiAJCQllcnJvciA9IHhmc19idWZfaW93YWl0KGJwKTsKIAkJCWlmIChlcnJvcikgewotCQkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfdHJhbnNfcmVhZF9idWYiLCBtcCwKLQkJCQkJCSAgYnAsIGJsa25vKTsKKwkJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKIAkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJCQkvKgogCQkJCSAqIFdlIGNhbiBncmFjZWZ1bGx5IHJlY292ZXIgZnJvbSBtb3N0IHJlYWQKQEAgLTM4Nyw5ICszODcsOSBAQAogCX0KIAlpZiAoYnAtPmJfZXJyb3IpIHsKIAkJZXJyb3IgPSBicC0+Yl9lcnJvcjsKLQkJWEZTX0JVRl9TVVBFUl9TVEFMRShicCk7Ci0JCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfdHJhbnNfcmVhZF9idWYiLCBtcCwKLQkJCQkgIGJwLCBibGtubyk7CisJCXhmc19idWZfc3RhbGUoYnApOworCQlYRlNfQlVGX0RPTkUoYnApOworCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKIAkJaWYgKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKQogCQkJeGZzX2ZvcmNlX3NodXRkb3duKHRwLT50X21vdW50cCwgU0hVVERPV05fTUVUQV9JT19FUlJPUik7CiAJCXhmc19idWZfcmVsc2UoYnApOwpAQCAtNjQzLDEzICs2NDMsMTQgQEAKIAkgKiBpbnNpZGUgdGhlIGJfYmRzdHJhdCBjYWxsYmFjayBzbyB0aGF0IHRoaXMgd29uJ3QgZ2V0IHdyaXR0ZW4gdG8KIAkgKiBkaXNrLgogCSAqLwotCVhGU19CVUZfREVMQVlXUklURShicCk7CiAJWEZTX0JVRl9ET05FKGJwKTsKIAogCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CiAJYnAtPmJfaW9kb25lID0geGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzOwogCWJpcC0+YmxpX2l0ZW0ubGlfY2IgPSB4ZnNfYnVmX2lvZG9uZTsKIAorCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKKwogCXRyYWNlX3hmc190cmFuc19sb2dfYnVmKGJpcCk7CiAKIAkvKgpAQCAtNzM4LDggKzczOSw3IEBACiAJICogV2Ugc2V0IHRoZSBzdGFsZSBiaXQgaW4gdGhlIGJ1ZmZlciBhcyB3ZWxsIHNpbmNlIHdlJ3JlIGdldHRpbmcKIAkgKiByaWQgb2YgaXQuCiAJICovCi0JWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApOwotCVhGU19CVUZfU1RBTEUoYnApOworCXhmc19idWZfc3RhbGUoYnApOwogCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfU1RBTEU7CiAJYmlwLT5ibGlfZmxhZ3MgJj0gfihYRlNfQkxJX0lOT0RFX0JVRiB8IFhGU19CTElfTE9HR0VEIHwgWEZTX0JMSV9ESVJUWSk7CiAJYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmPSB+WEZTX0JMRl9JTk9ERV9CVUY7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMgYi9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMKaW5kZXggYzhkZWEyZmQuLjMyZjAyODggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMKQEAgLTQ3LDExICs0NywxMyBAQAogICogQWRkIGEgbG9ja2VkIGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbi4KICAqCiAgKiBUaGUgaW5vZGUgbXVzdCBiZSBsb2NrZWQsIGFuZCBpdCBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSB0cmFuc2FjdGlvbi4KKyAqIElmIGxvY2tfZmxhZ3MgaXMgbm9uLXplcm8gdGhlIGlub2RlIHdpbGwgYmUgdW5sb2NrZWQgb24gdHJhbnNhY3Rpb24gY29tbWl0LgogICovCiB2b2lkCiB4ZnNfdHJhbnNfaWpvaW4oCiAJc3RydWN0IHhmc190cmFucwkqdHAsCi0Jc3RydWN0IHhmc19pbm9kZQkqaXApCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJdWludAkJCWxvY2tfZmxhZ3MpCiB7CiAJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKIApAQCAtNTksNyArNjEsOSBAQAogCWlmIChpcC0+aV9pdGVtcCA9PSBOVUxMKQogCQl4ZnNfaW5vZGVfaXRlbV9pbml0KGlwLCBpcC0+aV9tb3VudCk7CiAJaWlwID0gaXAtPmlfaXRlbXA7CisKIAlBU1NFUlQoaWlwLT5pbGlfbG9ja19mbGFncyA9PSAwKTsKKwlpaXAtPmlsaV9sb2NrX2ZsYWdzID0gbG9ja19mbGFnczsKIAogCS8qCiAJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCkBAIC03MCwyNSArNzQsNiBAQAogfQogCiAvKgotICogQWRkIGEgbG9ja2VkIGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbi4KLSAqCi0gKgotICogR3JhYnMgYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlIHdoaWNoIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHRoZSB0cmFuc2FjdGlvbgotICogaXMgY29tbWl0dGVkLiAgVGhlIGlub2RlIHdpbGwgYWxzbyBiZSB1bmxvY2tlZCBhdCB0aGF0IHBvaW50LiAgVGhlIGlub2RlCi0gKiBtdXN0IGJlIGxvY2tlZCwgYW5kIGl0IGNhbm5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IHRyYW5zYWN0aW9uLgotICovCi12b2lkCi14ZnNfdHJhbnNfaWpvaW5fcmVmKAotCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAotCXVpbnQJCQlsb2NrX2ZsYWdzKQotewotCXhmc190cmFuc19pam9pbih0cCwgaXApOwotCUlIT0xEKGlwKTsKLQlpcC0+aV9pdGVtcC0+aWxpX2xvY2tfZmxhZ3MgPSBsb2NrX2ZsYWdzOwotfQotCi0vKgogICogVHJhbnNhY3Rpb25hbCBpbm9kZSB0aW1lc3RhbXAgdXBkYXRlLiBSZXF1aXJlcyB0aGUgaW5vZGUgdG8gYmUgbG9ja2VkIGFuZAogICogam9pbmVkIHRvIHRoZSB0cmFuc2FjdGlvbiBzdXBwbGllZC4gUmVsaWVzIG9uIHRoZSB0cmFuc2FjdGlvbiBzdWJzeXN0ZW0gdG8KICAqIHRyYWNrIGRpcnR5IHN0YXRlIGFuZCB1cGRhdGUvd3JpdGViYWNrIHRoZSBpbm9kZSBhY2NvcmRpbmdseS4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKaW5kZXggMjI3NTBiNS4uNDQ4MjBiOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19wcml2LmgKKysrIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKQEAgLTcwLDYgKzcwLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXhhX2N1cnNvcnM7CiAJc3BpbmxvY2tfdAkJeGFfbG9jazsKIAl4ZnNfbHNuX3QJCXhhX2xhc3RfcHVzaGVkX2xzbjsKKwlpbnQJCQl4YV9sb2dfZmx1c2g7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192bm9kZW9wcy5jIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCmluZGV4IDUxZmM0MjkuLmNlOTI2OGEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYworKysgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKQEAgLTcyLDggKzcyLDggQEAKIAl4ZnNfYnVmX3QJKmJwOwogCWludAkJZXJyb3IgPSAwOwogCi0JZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIDAsIFhGU19CX1RPX0ZTQihtcCwgcGF0aGxlbiksIDAsIE5VTEwsIDAsCi0JCQltdmFsLCAmbm1hcHMsIE5VTEwpOworCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIDAsIFhGU19CX1RPX0ZTQihtcCwgcGF0aGxlbiksIG12YWwsICZubWFwcywKKwkJCSAgICAgICAwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCkBAIC04Nyw4ICs4Nyw3IEBACiAJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT01FTSk7CiAJCWVycm9yID0gYnAtPmJfZXJyb3I7CiAJCWlmIChlcnJvcikgewotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc19yZWFkbGluayIsCi0JCQkJICBpcC0+aV9tb3VudCwgYnAsIFhGU19CVUZfQUREUihicCkpOworCQkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCBfX2Z1bmNfXyk7CiAJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xMTMsNyArMTEyLDcgQEAKIAljaGFyCQkqbGluaykKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKLQlpbnQJCXBhdGhsZW47CisJeGZzX2ZzaXplX3QJcGF0aGxlbjsKIAlpbnQJCWVycm9yID0gMDsKIAogCXRyYWNlX3hmc19yZWFkbGluayhpcCk7CkBAIC0xMjMsMTMgKzEyMiwxOSBAQAogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAotCUFTU0VSVChTX0lTTE5LKGlwLT5pX2QuZGlfbW9kZSkpOwotCUFTU0VSVChpcC0+aV9kLmRpX3NpemUgPD0gTUFYUEFUSExFTik7Ci0KIAlwYXRobGVuID0gaXAtPmlfZC5kaV9zaXplOwogCWlmICghcGF0aGxlbikKIAkJZ290byBvdXQ7CiAKKwlpZiAocGF0aGxlbiA8IDAgfHwgcGF0aGxlbiA+IE1BWFBBVEhMRU4pIHsKKwkJeGZzX2FsZXJ0KG1wLCAiJXM6IGlub2RlICglbGx1KSBiYWQgc3ltbGluayBsZW5ndGggKCVsbGQpIiwKKwkJCSBfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcgbG9uZykgaXAtPmlfaW5vLAorCQkJIChsb25nIGxvbmcpIHBhdGhsZW4pOworCQlBU1NFUlQoMCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwogCWlmIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSkgewogCQltZW1jcHkobGluaywgaXAtPmlfZGYuaWZfdTEuaWZfZGF0YSwgcGF0aGxlbik7CiAJCWxpbmtbcGF0aGxlbl0gPSAnXDAnOwpAQCAtMTc4LDggKzE4Myw3IEBACiAKIAluaW1hcHMgPSAxOwogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0JZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIGVuZF9mc2IsIG1hcF9sZW4sIDAsCi0JCQkgIE5VTEwsIDAsICZpbWFwLCAmbmltYXBzLCBOVUxMKTsKKwllcnJvciA9IHhmc19ibWFwaV9yZWFkKGlwLCBlbmRfZnNiLCBtYXBfbGVuLCAmaW1hcCwgJm5pbWFwcywgMCk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCiAJaWYgKCFlcnJvciAmJiAobmltYXBzICE9IDApICYmCkBAIC0yMjAsNyArMjI0LDcgQEAKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2RhdGEoJnRwLCBpcCwgaXAtPmlfc2l6ZSk7CiAJCWlmIChlcnJvcikgewpAQCAtMjg5LDcgKzI5Myw3IEBACiAJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTCk7CiAJc2l6ZSA9IChpbnQpaXAtPmlfZC5kaV9zaXplOwogCWlwLT5pX2QuZGlfc2l6ZSA9IDA7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwogCS8qCiAJICogRmluZCB0aGUgYmxvY2socykgc28gd2UgY2FuIGludmFsIGFuZCB1bm1hcCB0aGVtLgpAQCAtMjk3LDkgKzMwMSw5IEBACiAJZG9uZSA9IDA7CiAJeGZzX2JtYXBfaW5pdCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOwogCW5tYXBzID0gQVJSQVlfU0laRShtdmFsKTsKLQlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgMCwgWEZTX0JfVE9fRlNCKG1wLCBzaXplKSwKLQkJCVhGU19CTUFQSV9NRVRBREFUQSwgJmZpcnN0X2Jsb2NrLCAwLCBtdmFsLCAmbm1hcHMsCi0JCQkmZnJlZV9saXN0KSkpCisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgMCwgWEZTX0JfVE9fRlNCKG1wLCBzaXplKSwKKwkJCQltdmFsLCAmbm1hcHMsIDApOworCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjA7CiAJLyoKIAkgKiBJbnZhbGlkYXRlIHRoZSBibG9jayhzKS4KQEAgLTMwOCw2ICszMTIsMTAgQEAKIAkJYnAgPSB4ZnNfdHJhbnNfZ2V0X2J1Zih0cCwgbXAtPm1fZGRldl90YXJncCwKIAkJCVhGU19GU0JfVE9fREFERFIobXAsIG12YWxbaV0uYnJfc3RhcnRibG9jayksCiAJCQlYRlNfRlNCX1RPX0JCKG1wLCBtdmFsW2ldLmJyX2Jsb2NrY291bnQpLCAwKTsKKwkJaWYgKCFicCkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIGVycm9yMTsKKwkJfQogCQl4ZnNfdHJhbnNfYmludmFsKHRwLCBicCk7CiAJfQogCS8qCkBAIC0zMzMsNyArMzQxLDcgQEAKIAkgKiBNYXJrIGl0IGRpcnR5IHNvIGl0IHdpbGwgYmUgbG9nZ2VkIGFuZCBtb3ZlZCBmb3J3YXJkIGluIHRoZSBsb2cgYXMKIAkgKiBwYXJ0IG9mIGV2ZXJ5IGNvbW1pdC4KIAkgKi8KLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJLyoKIAkgKiBHZXQgYSBuZXcsIGVtcHR5IHRyYW5zYWN0aW9uIHRvIHJldHVybiB0byBvdXIgY2FsbGVyLgpAQCAtNDY2LDcgKzQ3NCw3IEBACiAJCWdvdG8gZXJyb3JfY2FuY2VsOwogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAJeGZzX2lkZXN0cm95X2ZvcmsoaXAsIFhGU19BVFRSX0ZPUkspOwogCiAJQVNTRVJUKGlwLT5pX2QuZGlfYW5leHRlbnRzID09IDApOwpAQCAtNjQ3LDggKzY1NSw2IEBACiAJaWYgKHRydW5jYXRlKSB7CiAJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKIAotCQl4ZnNfaW9lbmRfd2FpdChpcCk7Ci0KIAkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKIAkJCQkJICBYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLAogCQkJCQkgIDAsIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCkBAIC02NjIsNyArNjY4LDcgQEAKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2RhdGEoJnRwLCBpcCwgMCk7CiAJCWlmIChlcnJvcikgewpAQCAtNjg2LDcgKzY5Miw3IEBACiAJCQlyZXR1cm4gVk5fSU5BQ1RJVkVfQ0FDSEU7CiAJCX0KIAotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAJfSBlbHNlIHsKIAkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKIAkJCQkJICBYRlNfSUZSRUVfTE9HX1JFUyhtcCksCkBAIC02OTksNyArNzA1LDcgQEAKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAJfQogCiAJLyoKQEAgLTkzOSw3ICs5NDUsNyBAQAogCSAqIHRoZSB0cmFuc2FjdGlvbiBjYW5jZWwgdW5sb2NraW5nIGRwIHNvIGRvbid0IGRvIGl0IGV4cGxpY2l0bHkgaW4gdGhlCiAJICogZXJyb3IgcGF0aC4KIAkgKi8KLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgZHAsIFhGU19JTE9DS19FWENMKTsKIAl1bmxvY2tfZHBfb25fZXJyb3IgPSBCX0ZBTFNFOwogCiAJZXJyb3IgPSB4ZnNfZGlyX2NyZWF0ZW5hbWUodHAsIGRwLCBuYW1lLCBpcC0+aV9pbm8sCkBAIC0xMjYwLDggKzEyNjYsOCBAQAogCiAJeGZzX2xvY2tfdHdvX2lub2RlcyhkcCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAotCXhmc190cmFuc19pam9pbl9yZWYodHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCiAJLyoKIAkgKiBJZiB3ZSdyZSByZW1vdmluZyBhIGRpcmVjdG9yeSBwZXJmb3JtIHNvbWUgYWRkaXRpb25hbCB2YWxpZGF0aW9uLgpAQCAtMTQwNiw4ICsxNDEyLDggQEAKIAogCXhmc19sb2NrX3R3b19pbm9kZXMoc2lwLCB0ZHAsIFhGU19JTE9DS19FWENMKTsKIAotCXhmc190cmFuc19pam9pbl9yZWYodHAsIHNpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19pam9pbl9yZWYodHAsIHRkcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgc2lwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCB0ZHAsIFhGU19JTE9DS19FWENMKTsKIAogCS8qCiAJICogSWYgdGhlIHNvdXJjZSBoYXMgdG9vIG1hbnkgbGlua3MsIHdlIGNhbid0IG1ha2UgYW55IG1vcmUgdG8gaXQuCkBAIC0xNjAxLDcgKzE2MDcsNyBAQAogCSAqIHRyYW5zYWN0aW9uIGNhbmNlbCB1bmxvY2tpbmcgZHAgc28gZG9uJ3QgZG8gaXQgZXhwbGljaXRseSBpbiB0aGUKIAkgKiBlcnJvciBwYXRoLgogCSAqLwotCXhmc190cmFuc19pam9pbl9yZWYodHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOwogCXVubG9ja19kcF9vbl9lcnJvciA9IEJfRkFMU0U7CiAKIAkvKgpAQCAtMTYzMiwxMCArMTYzOCw5IEBACiAJCWZpcnN0X2ZzYiA9IDA7CiAJCW5tYXBzID0gU1lNTElOS19NQVBTOwogCi0JCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgZmlyc3RfZnNiLCBmc19ibG9ja3MsCi0JCQkJICBYRlNfQk1BUElfV1JJVEUgfCBYRlNfQk1BUElfTUVUQURBVEEsCi0JCQkJICAmZmlyc3RfYmxvY2ssIHJlc2Jsa3MsIG12YWwsICZubWFwcywKLQkJCQkgICZmcmVlX2xpc3QpOworCQllcnJvciA9IHhmc19ibWFwaV93cml0ZSh0cCwgaXAsIGZpcnN0X2ZzYiwgZnNfYmxvY2tzLAorCQkJCSAgWEZTX0JNQVBJX01FVEFEQVRBLCAmZmlyc3RfYmxvY2ssIHJlc2Jsa3MsCisJCQkJICBtdmFsLCAmbm1hcHMsICZmcmVlX2xpc3QpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMjsKIApAQCAtMTY1MCw3ICsxNjU1LDEwIEBACiAJCQlieXRlX2NudCA9IFhGU19GU0JfVE9fQihtcCwgbXZhbFtuXS5icl9ibG9ja2NvdW50KTsKIAkJCWJwID0geGZzX3RyYW5zX2dldF9idWYodHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCiAJCQkJCSAgICAgICBCVE9CQihieXRlX2NudCksIDApOwotCQkJQVNTRVJUKCF4ZnNfYnVmX2dldGVycm9yKGJwKSk7CisJCQlpZiAoIWJwKSB7CisJCQkJZXJyb3IgPSBFTk9NRU07CisJCQkJZ290byBlcnJvcjI7CisJCQl9CiAJCQlpZiAocGF0aGxlbiA8IGJ5dGVfY250KSB7CiAJCQkJYnl0ZV9jbnQgPSBwYXRobGVuOwogCQkJfQpAQCAtMTczMiw3ICsxNzQwLDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAogCWlwLT5pX2QuZGlfZG1ldm1hc2sgPSBldm1hc2s7CiAJaXAtPmlfZC5kaV9kbXN0YXRlICA9IHN0YXRlOwpAQCAtMTc3OCw3ICsxNzg2LDYgQEAKIAl4ZnNfZmlsZW9mZl90CQlzdGFydG9mZnNldF9mc2I7CiAJeGZzX2ZzYmxvY2tfdAkJZmlyc3Rmc2I7CiAJaW50CQkJbmltYXBzOwotCWludAkJCWJtYXBpX2ZsYWc7CiAJaW50CQkJcXVvdGFfZmxhZzsKIAlpbnQJCQlydDsKIAl4ZnNfdHJhbnNfdAkJKnRwOwpAQCAtMTgwNiw3ICsxODEzLDYgQEAKIAljb3VudCA9IGxlbjsKIAlpbWFwcCA9ICZpbWFwc1swXTsKIAluaW1hcHMgPSAxOwotCWJtYXBpX2ZsYWcgPSBYRlNfQk1BUElfV1JJVEUgfCBhbGxvY190eXBlOwogCXN0YXJ0b2Zmc2V0X2ZzYgk9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CiAJYWxsb2NhdGVzaXplX2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgY291bnQpOwogCkBAIC0xODc3LDE2ICsxODgzLDEyIEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IxOwogCi0JCXhmc190cmFuc19pam9pbih0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAotCQkvKgotCQkgKiBJc3N1ZSB0aGUgeGZzX2JtYXBpKCkgY2FsbCB0byBhbGxvY2F0ZSB0aGUgYmxvY2tzCi0JCSAqLwogCQl4ZnNfYm1hcF9pbml0KCZmcmVlX2xpc3QsICZmaXJzdGZzYik7Ci0JCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgc3RhcnRvZmZzZXRfZnNiLAotCQkJCSAgYWxsb2NhdGVzaXplX2ZzYiwgYm1hcGlfZmxhZywKLQkJCQkgICZmaXJzdGZzYiwgMCwgaW1hcHAsICZuaW1hcHMsCi0JCQkJICAmZnJlZV9saXN0KTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUodHAsIGlwLCBzdGFydG9mZnNldF9mc2IsCisJCQkJCWFsbG9jYXRlc2l6ZV9mc2IsIGFsbG9jX3R5cGUsICZmaXJzdGZzYiwKKwkJCQkJMCwgaW1hcHAsICZuaW1hcHMsICZmcmVlX2xpc3QpOwogCQlpZiAoZXJyb3IpIHsKIAkJCWdvdG8gZXJyb3IwOwogCQl9CkBAIC0xOTc2LDggKzE5NzgsNyBAQAogCWZvciAob2Zmc2V0ID0gc3RhcnRvZmY7IG9mZnNldCA8PSBlbmRvZmY7IG9mZnNldCA9IGxhc3RvZmZzZXQgKyAxKSB7CiAJCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwogCQluaW1hcCA9IDE7Ci0JCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBvZmZzZXRfZnNiLCAxLCAwLAotCQkJTlVMTCwgMCwgJmltYXAsICZuaW1hcCwgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIG9mZnNldF9mc2IsIDEsICZpbWFwLCAmbmltYXAsIDApOwogCQlpZiAoZXJyb3IgfHwgbmltYXAgPCAxKQogCQkJYnJlYWs7CiAJCUFTU0VSVChpbWFwLmJyX2Jsb2NrY291bnQgPj0gMSk7CkBAIC0xOTk3LDggKzE5OTgsOCBAQAogCQl4ZnNiZHN0cmF0KG1wLCBicCk7CiAJCWVycm9yID0geGZzX2J1Zl9pb3dhaXQoYnApOwogCQlpZiAoZXJyb3IpIHsKLQkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMocmVhZCkiLAotCQkJCQkgIG1wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsCisJCQkJCSJ4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMocmVhZCkiKTsKIAkJCWJyZWFrOwogCQl9CiAJCW1lbXNldChicC0+Yl9hZGRyICsKQEAgLTIwMTAsOCArMjAxMSw4IEBACiAJCXhmc2Jkc3RyYXQobXAsIGJwKTsKIAkJZXJyb3IgPSB4ZnNfYnVmX2lvd2FpdChicCk7CiAJCWlmIChlcnJvcikgewotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc196ZXJvX3JlbWFpbmluZ19ieXRlcyh3cml0ZSkiLAotCQkJCQkgIG1wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsCisJCQkJCSJ4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMod3JpdGUpIik7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTIwNzYsNyArMjA3Nyw3IEBACiAJaWYgKG5lZWRfaW9sb2NrKSB7CiAJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKIAkJLyogd2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgYW55IHBlbmRpbmcgRElPcyAqLwotCQl4ZnNfaW9lbmRfd2FpdChpcCk7CisJCWlub2RlX2Rpb193YWl0KFZGU19JKGlwKSk7CiAJfQogCiAJcm91bmRpbmcgPSBtYXhfdCh1aW50LCAxIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nLCBQQUdFX0NBQ0hFX1NJWkUpOwpAQCAtMjA5Niw4ICsyMDk3LDggQEAKIAkgKi8KIAlpZiAocnQgJiYgIXhmc19zYl92ZXJzaW9uX2hhc2V4dGZsZ2JpdCgmbXAtPm1fc2IpKSB7CiAJCW5pbWFwID0gMTsKLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIHN0YXJ0b2Zmc2V0X2ZzYiwKLQkJCTEsIDAsIE5VTEwsIDAsICZpbWFwLCAmbmltYXAsIE5VTEwpOworCQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGlwLCBzdGFydG9mZnNldF9mc2IsIDEsCisJCQkJCSZpbWFwLCAmbmltYXAsIDApOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF91bmxvY2tfaW9sb2NrOwogCQlBU1NFUlQobmltYXAgPT0gMCB8fCBuaW1hcCA9PSAxKTsKQEAgLTIxMTEsOCArMjExMiw4IEBACiAJCQkJc3RhcnRvZmZzZXRfZnNiICs9IG1wLT5tX3NiLnNiX3JleHRzaXplIC0gbW9kOwogCQl9CiAJCW5pbWFwID0gMTsKLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIGVuZG9mZnNldF9mc2IgLSAxLAotCQkJMSwgMCwgTlVMTCwgMCwgJmltYXAsICZuaW1hcCwgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIGVuZG9mZnNldF9mc2IgLSAxLCAxLAorCQkJCQkmaW1hcCwgJm5pbWFwLCAwKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfdW5sb2NrX2lvbG9jazsKIAkJQVNTRVJUKG5pbWFwID09IDAgfHwgbmltYXAgPT0gMSk7CkBAIC0yMTgwLDcgKzIxODEsNyBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMTsKIAotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkJLyoKIAkJICogaXNzdWUgdGhlIGJ1bm1hcGkoKSBjYWxsIHRvIGZyZWUgdGhlIGJsb2NrcwpAQCAtMjM1Myw4ICsyMzU0LDcgQEAKIAl9CiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQotCXhmc190cmFuc19pam9pbih0cCwgaXApOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAogCWlmICgoYXR0cl9mbGFncyAmIFhGU19BVFRSX0RNSSkgPT0gMCkgewogCQlpcC0+aV9kLmRpX21vZGUgJj0gflNfSVNVSUQ7CkBAIC0yMzc5LDEwICsyMzc5LDUgQEAKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJaWYgKGF0dHJfZmxhZ3MgJiBYRlNfQVRUUl9TWU5DKQogCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOwotCi0JZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKLQotCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0KLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHhmc190cmFuc19jb21taXQodHAsIDApOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCmluZGV4IGU0OWMzNmQuLmJiMTQ1ZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKQEAgLTE0NCw3ICsxNDQsNyBAQAogewogfQogc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgKm9wcywKIAkJCQkJICAgICAgIHZvaWQgKmNvbnRleHQpCiB7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCmluZGV4IDQ1NDNiNmYuLjgzMDYyZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCkBAIC0xODksNiArMTg5LDggQEAKIC8qCiAgKiBUaHJlYWRzIGFuZCBTY2hlZHVsaW5nCiAgKi8KK2V4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2FjcGlfaG90cGx1Z193cTsKKwogYWNwaV90aHJlYWRfaWQgYWNwaV9vc19nZXRfdGhyZWFkX2lkKHZvaWQpOwogCiBhY3BpX3N0YXR1cwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKaW5kZXggYjY3MjMxYi4uZWQ3M2Y2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCkBAIC00NzAsNyArNDcwLDYgQEAKICAqLwogI2RlZmluZSBBQ1BJX0ZVTExfSU5JVElBTElaQVRJT04gICAgICAgIDB4MDAKICNkZWZpbmUgQUNQSV9OT19BRERSRVNTX1NQQUNFX0lOSVQgICAgICAweDAxCi0jZGVmaW5lIEFDUElfTk9fSEFSRFdBUkVfSU5JVCAgICAgICAgICAgMHgwMgogI2RlZmluZSBBQ1BJX05PX0VWRU5UX0lOSVQgICAgICAgICAgICAgIDB4MDQKICNkZWZpbmUgQUNQSV9OT19IQU5ETEVSX0lOSVQgICAgICAgICAgICAweDA4CiAjZGVmaW5lIEFDUElfTk9fQUNQSV9FTkFCTEUgICAgICAgICAgICAgMHgxMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKaW5kZXggZjcyNDAzYy4uZjRiMmVmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCkBAIC01NSw3ICs1NSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IDY3MDU1ZjEuLjYxMGY2ZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTMyOSw2ICszMjksNyBAQAogaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKIAkJCSAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIGludCBhY3BpX3Byb2Nlc3Nvcl9jc3RfaGFzX2NoYW5nZWQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7CitpbnQgYWNwaV9wcm9jZXNzb3JfaG90cGx1ZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKIGludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9leGl0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCiAJCQkgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBpbnQgYWNwaV9wcm9jZXNzb3Jfc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAppbmRleCBkZmIwZWM2Li44NDQ1OGIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKQEAgLTYxLDExICs2MSwxMiBAQAogICovCiAjaWZuZGVmIF9fV0FSTl9UQUlOVAogI2lmbmRlZiBfX0FTU0VNQkxZX18KLWV4dGVybiB2b2lkIHdhcm5fc2xvd3BhdGhfZm10KGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGludCBsaW5lLAotCQljb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKLWV4dGVybiB2b2lkIHdhcm5fc2xvd3BhdGhfZm10X3RhaW50KGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGludCBsaW5lLAotCQkJCSAgICB1bnNpZ25lZCB0YWludCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNCwgNSkpKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KQordm9pZCB3YXJuX3Nsb3dwYXRoX2ZtdChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50Zig0LCA1KQordm9pZCB3YXJuX3Nsb3dwYXRoX2ZtdF90YWludChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSwgdW5zaWduZWQgdGFpbnQsCisJCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIGV4dGVybiB2b2lkIHdhcm5fc2xvd3BhdGhfbnVsbChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSk7CiAjZGVmaW5lIFdBTlRfV0FSTl9PTl9TTE9XUEFUSAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2NoZWNrc3VtLmgKaW5kZXggNDY0N2M3Ni4uYzA4NDc2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvY2hlY2tzdW0uaApAQCAtMzMsOCArMzMsMTAgQEAKIGV4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKIAkJCQkJaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICpjc3VtX2Vycik7CiAKKyNpZm5kZWYgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjawogI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYywgZHN0LCBsZW4sIHN1bSkJXAogCWNzdW1fcGFydGlhbF9jb3B5KChzcmMpLCAoZHN0KSwgKGxlbiksIChzdW0pKQorI2VuZGlmCiAKIC8qCiAgKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCkBAIC02MywxMiArNjUsMTQgQEAKIAkJdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pOwogI2VuZGlmCiAKKyNpZm5kZWYgY3N1bV90Y3B1ZHBfbWFnaWMKIHN0YXRpYyBpbmxpbmUgX19zdW0xNgogY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkciwgZGFkZHIsIGxlbiwgcHJvdG8sIHN1bSkpOwogfQorI2VuZGlmCiAKIC8qCiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWNvbW1vbi5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1jb21tb24uaAppbmRleCAwYzgwYmIzLi45ZmEzZjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctY29tbW9uLmgKQEAgLTEyMyw3ICsxMjMsMTIgQEAKIAkJCQkJCSBzaXplX3Qgc2l6ZSwKIAkJCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBhZGRyICsgb2Zmc2V0LCBzaXplLCBkaXIpOworCWNvbnN0IHN0cnVjdCBkbWFfbWFwX29wcyAqb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKKwlpZiAob3BzLT5zeW5jX3NpbmdsZV9mb3JfY3B1KQorCQlvcHMtPnN5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBhZGRyICsgb2Zmc2V0LCBzaXplLCBkaXIpOworCWRlYnVnX2RtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KGRldiwgYWRkciwgb2Zmc2V0LCBzaXplLCBkaXIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTMyLDcgKzEzNywxMiBAQAogCQkJCQkJICAgIHNpemVfdCBzaXplLAogCQkJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGFkZHIgKyBvZmZzZXQsIHNpemUsIGRpcik7CisJY29uc3Qgc3RydWN0IGRtYV9tYXBfb3BzICpvcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcikpOworCWlmIChvcHMtPnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UpCisJCW9wcy0+c3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGFkZHIgKyBvZmZzZXQsIHNpemUsIGRpcik7CisJZGVidWdfZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UoZGV2LCBhZGRyLCBvZmZzZXQsIHNpemUsIGRpcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAppbmRleCBkNDk0MDAxLi44Yzg2MjEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaApAQCAtNDEsNiArNDEsNyBAQAogfQogCiBzdHJ1Y3QgZGV2aWNlOworc3RydWN0IGdwaW87CiBzdHJ1Y3Qgc2VxX2ZpbGU7CiBzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IGRldmljZV9ub2RlOwpAQCAtMTcwLDE4ICsxNzEsNiBAQAogCiBleHRlcm4gaW50IF9fZ3Bpb190b19pcnEodW5zaWduZWQgZ3Bpbyk7CiAKLS8qKgotICogc3RydWN0IGdwaW8gLSBhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgR1BJTyB3aXRoIGNvbmZpZ3VyYXRpb24KLSAqIEBncGlvOgl0aGUgR1BJTyBudW1iZXIKLSAqIEBmbGFnczoJR1BJTyBjb25maWd1cmF0aW9uIGFzIHNwZWNpZmllZCBieSBHUElPRl8qCi0gKiBAbGFiZWw6CWEgbGl0ZXJhbCBkZXNjcmlwdGlvbiBzdHJpbmcgb2YgdGhpcyBHUElPCi0gKi8KLXN0cnVjdCBncGlvIHsKLQl1bnNpZ25lZAlncGlvOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JY29uc3QgY2hhcgkqbGFiZWw7Ci19OwotCiBleHRlcm4gaW50IGdwaW9fcmVxdWVzdF9vbmUodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqbGFiZWwpOwogZXh0ZXJuIGludCBncGlvX3JlcXVlc3RfYXJyYXkoY29uc3Qgc3RydWN0IGdwaW8gKmFycmF5LCBzaXplX3QgbnVtKTsKIGV4dGVybiB2b2lkIGdwaW9fZnJlZV9hcnJheShjb25zdCBzdHJ1Y3QgZ3BpbyAqYXJyYXksIHNpemVfdCBudW0pOwpAQCAtMjIwLDEzICsyMDksMTMgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHVuc2lnbmVkIGdwaW8pCiB7CiAJbWlnaHRfc2xlZXAoKTsKLQlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7CisJcmV0dXJuIF9fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCiB7CiAJbWlnaHRfc2xlZXAoKTsKLQlncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7CisJX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7CiB9CiAKICNlbmRpZiAvKiAhQ09ORklHX0dQSU9MSUIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGFnZS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wYWdlLmgKaW5kZXggNzVmZWMxOC4uMzUxODg5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wYWdlLmgKQEAgLTc5LDggKzc5LDggQEAKICNkZWZpbmUgdmlydF90b19wZm4oa2FkZHIpCShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQogI2RlZmluZSBwZm5fdG9fdmlydChwZm4pCV9fdmEoKHBmbikgPDwgUEFHRV9TSElGVCkKIAotI2RlZmluZSB2aXJ0X3RvX3BhZ2UoYWRkcikJKG1lbV9tYXAgKyAoKCh1bnNpZ25lZCBsb25nKShhZGRyKS1QQUdFX09GRlNFVCkgPj4gUEFHRV9TSElGVCkpCi0jZGVmaW5lIHBhZ2VfdG9fdmlydChwYWdlKQkoKCgocGFnZSkgLSBtZW1fbWFwKSA8PCBQQUdFX1NISUZUKSArIFBBR0VfT0ZGU0VUKQorI2RlZmluZSB2aXJ0X3RvX3BhZ2UoYWRkcikJcGZuX3RvX3BhZ2UodmlydF90b19wZm4oYWRkcikpCisjZGVmaW5lIHBhZ2VfdG9fdmlydChwYWdlKQlwZm5fdG9fdmlydChwYWdlX3RvX3BmbihwYWdlKSkKIAogI2lmbmRlZiBwYWdlX3RvX3BoeXMKICNkZWZpbmUgcGFnZV90b19waHlzKHBhZ2UpICAgICAgKChkbWFfYWRkcl90KXBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3J3c2VtLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3J3c2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxZTJjZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcndzZW0uaApAQCAtMCwwICsxLDEzMiBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfUldTRU1fSAorI2RlZmluZSBfQVNNX1BPV0VSUENfUldTRU1fSAorCisjaWZuZGVmIF9MSU5VWF9SV1NFTV9ICisjZXJyb3IgIlBsZWFzZSBkb24ndCBpbmNsdWRlIDxhc20vcndzZW0uaD4gZGlyZWN0bHksIHVzZSA8bGludXgvcndzZW0uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoKKyAqIFIvVyBzZW1hcGhvcmVzIGZvciBQUEMgdXNpbmcgdGhlIHN0dWZmIGluIGxpYi9yd3NlbS5jLgorICogQWRhcHRlZCBsYXJnZWx5IGZyb20gaW5jbHVkZS9hc20taTM4Ni9yd3NlbS5oCisgKiBieSBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4uCisgKi8KKworLyoKKyAqIHRoZSBzZW1hcGhvcmUgZGVmaW5pdGlvbgorICovCisjaWZkZWYgQ09ORklHX1BQQzY0CisjIGRlZmluZSBSV1NFTV9BQ1RJVkVfTUFTSwkJMHhmZmZmZmZmZkwKKyNlbHNlCisjIGRlZmluZSBSV1NFTV9BQ1RJVkVfTUFTSwkJMHgwMDAwZmZmZkwKKyNlbmRpZgorCisjZGVmaW5lIFJXU0VNX1VOTE9DS0VEX1ZBTFVFCQkweDAwMDAwMDAwTAorI2RlZmluZSBSV1NFTV9BQ1RJVkVfQklBUwkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgUldTRU1fV0FJVElOR19CSUFTCQkoLVJXU0VNX0FDVElWRV9NQVNLLTEpCisjZGVmaW5lIFJXU0VNX0FDVElWRV9SRUFEX0JJQVMJCVJXU0VNX0FDVElWRV9CSUFTCisjZGVmaW5lIFJXU0VNX0FDVElWRV9XUklURV9CSUFTCQkoUldTRU1fV0FJVElOR19CSUFTICsgUldTRU1fQUNUSVZFX0JJQVMpCisKKy8qCisgKiBsb2NrIGZvciByZWFkaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Rvd25fcmVhZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19sb25nX2luY19yZXR1cm4oKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCkgPD0gMCkpCisJCXJ3c2VtX2Rvd25fcmVhZF9mYWlsZWQoc2VtKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19kb3duX3JlYWRfdHJ5bG9jayhzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJbG9uZyB0bXA7CisKKwl3aGlsZSAoKHRtcCA9IHNlbS0+Y291bnQpID49IDApIHsKKwkJaWYgKHRtcCA9PSBjbXB4Y2hnKCZzZW0tPmNvdW50LCB0bXAsCisJCQkJICAgdG1wICsgUldTRU1fQUNUSVZFX1JFQURfQklBUykpIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogbG9jayBmb3Igd3JpdGluZworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19kb3duX3dyaXRlX25lc3RlZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0sIGludCBzdWJjbGFzcykKK3sKKwlsb25nIHRtcDsKKworCXRtcCA9IGF0b21pY19sb25nX2FkZF9yZXR1cm4oUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMsCisJCQkJICAgICAoYXRvbWljX2xvbmdfdCAqKSZzZW0tPmNvdW50KTsKKwlpZiAodW5saWtlbHkodG1wICE9IFJXU0VNX0FDVElWRV9XUklURV9CSUFTKSkKKwkJcndzZW1fZG93bl93cml0ZV9mYWlsZWQoc2VtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZG93bl93cml0ZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJX19kb3duX3dyaXRlX25lc3RlZChzZW0sIDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2Rvd25fd3JpdGVfdHJ5bG9jayhzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJbG9uZyB0bXA7CisKKwl0bXAgPSBjbXB4Y2hnKCZzZW0tPmNvdW50LCBSV1NFTV9VTkxPQ0tFRF9WQUxVRSwKKwkJICAgICAgUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMpOworCXJldHVybiB0bXAgPT0gUldTRU1fVU5MT0NLRURfVkFMVUU7Cit9CisKKy8qCisgKiB1bmxvY2sgYWZ0ZXIgcmVhZGluZworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX191cF9yZWFkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlsb25nIHRtcDsKKworCXRtcCA9IGF0b21pY19sb25nX2RlY19yZXR1cm4oKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCk7CisJaWYgKHVubGlrZWx5KHRtcCA8IC0xICYmICh0bXAgJiBSV1NFTV9BQ1RJVkVfTUFTSykgPT0gMCkpCisJCXJ3c2VtX3dha2Uoc2VtKTsKK30KKworLyoKKyAqIHVubG9jayBhZnRlciB3cml0aW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3VwX3dyaXRlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX2xvbmdfc3ViX3JldHVybihSV1NFTV9BQ1RJVkVfV1JJVEVfQklBUywKKwkJCQkgKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCkgPCAwKSkKKwkJcndzZW1fd2FrZShzZW0pOworfQorCisvKgorICogaW1wbGVtZW50IGF0b21pYyBhZGQgZnVuY3Rpb25hbGl0eQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcndzZW1fYXRvbWljX2FkZChsb25nIGRlbHRhLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJYXRvbWljX2xvbmdfYWRkKGRlbHRhLCAoYXRvbWljX2xvbmdfdCAqKSZzZW0tPmNvdW50KTsKK30KKworLyoKKyAqIGRvd25ncmFkZSB3cml0ZSBsb2NrIHRvIHJlYWQgbG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19kb3duZ3JhZGVfd3JpdGUoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQoreworCWxvbmcgdG1wOworCisJdG1wID0gYXRvbWljX2xvbmdfYWRkX3JldHVybigtUldTRU1fV0FJVElOR19CSUFTLAorCQkJCSAgICAgKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCk7CisJaWYgKHRtcCA8IDApCisJCXJ3c2VtX2Rvd25ncmFkZV93YWtlKHNlbSk7Cit9CisKKy8qCisgKiBpbXBsZW1lbnQgZXhjaGFuZ2UgYW5kIGFkZCBmdW5jdGlvbmFsaXR5CisgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyByd3NlbV9hdG9taWNfdXBkYXRlKGxvbmcgZGVsdGEsIHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlyZXR1cm4gYXRvbWljX2xvbmdfYWRkX3JldHVybihkZWx0YSwgKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCk7Cit9CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1JXU0VNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3NvY2tldC5oCmluZGV4IDlhNjExNWUuLjQ5YzE3MDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9zb2NrZXQuaApAQCAtNjQsNCArNjQsNyBAQAogI2RlZmluZSBTT19ET01BSU4JCTM5CiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKKworI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCVNPX1dJRklfU1RBVFVTCiAjZW5kaWYgLyogX19BU01fR0VORVJJQ19TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmggYi9pbmNsdWRlL2NyeXB0by9hbGdhcGkuaAppbmRleCA1OWMzZTViLi5lY2M3MjFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NyeXB0by9hbGdhcGkuaAorKysgYi9pbmNsdWRlL2NyeXB0by9hbGdhcGkuaApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAogc3RydWN0IG1vZHVsZTsKIHN0cnVjdCBydGF0dHI7CkBAIC0yNiw2ICsyNyw3IEBACiAJaW50ICgqaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIHR5cGUsIHUzMiBtYXNrKTsKIAlpbnQgKCppbml0X3RmbSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CiAJdm9pZCAoKnNob3cpKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CisJaW50ICgqcmVwb3J0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqKCpsb29rdXApKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7CiAKIAl1bnNpZ25lZCBpbnQgdHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL2Jsb3dmaXNoLmggYi9pbmNsdWRlL2NyeXB0by9ibG93ZmlzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTBkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NyeXB0by9ibG93ZmlzaC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb21tb24gdmFsdWVzIGZvciBibG93ZmlzaCBhbGdvcml0aG1zCisgKi8KKworI2lmbmRlZiBfQ1JZUFRPX0JMT1dGSVNIX0gKKyNkZWZpbmUgX0NSWVBUT19CTE9XRklTSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCisjZGVmaW5lIEJGX0JMT0NLX1NJWkUgOAorI2RlZmluZSBCRl9NSU5fS0VZX1NJWkUgNAorI2RlZmluZSBCRl9NQVhfS0VZX1NJWkUgNTYKKworc3RydWN0IGJmX2N0eCB7CisJdTMyIHBbMThdOworCXUzMiBzWzEwMjRdOworfTsKKworaW50IGJsb3dmaXNoX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAorCQkgICAgdW5zaWduZWQgaW50IGtleV9sZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL3NoYS5oIGIvaW5jbHVkZS9jcnlwdG8vc2hhLmgKaW5kZXggMDY5ZTg1Yi4uYzZjOWMxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jcnlwdG8vc2hhLmgKKysrIGIvaW5jbHVkZS9jcnlwdG8vc2hhLmgKQEAgLTgyLDQgKzgyLDkgQEAKIAl1OCBidWZbU0hBNTEyX0JMT0NLX1NJWkVdOwogfTsKIAorc3RydWN0IHNoYXNoX2Rlc2M7CisKK2V4dGVybiBpbnQgY3J5cHRvX3NoYTFfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBsZW4pOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybVAuaCBiL2luY2x1ZGUvZHJtL2RybVAuaAppbmRleCA5YjdjMmJiLi4xZjllOTUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1QLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtUC5oCkBAIC00Miw3ICs0Miw2IEBACiAgKiBjYW4gYnVpbGQgdGhlIERSTSAocGFydCBvZiBQSSBEUkkpLiA0LzIxLzIwMDAgUyArIEIgKi8KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2VuZGlmCQkJCS8qIF9fYWxwaGFfXyAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtODAsNiArNzksOCBAQAogI2RlZmluZSBfX09TX0hBU19BR1AgKGRlZmluZWQoQ09ORklHX0FHUCkgfHwgKGRlZmluZWQoQ09ORklHX0FHUF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkpCiAjZGVmaW5lIF9fT1NfSEFTX01UUlIgKGRlZmluZWQoQ09ORklHX01UUlIpKQogCitzdHJ1Y3QgbW9kdWxlOworCiBzdHJ1Y3QgZHJtX2ZpbGU7CiBzdHJ1Y3QgZHJtX2RldmljZTsKIApAQCAtMTIyLDEyICsxMjMsMTIgQEAKICAqIHVzaW5nIHRoZSBEUk1fREVCVUdfS01TIGFuZCBEUk1fREVCVUcuCiAgKi8KIAotZXh0ZXJuIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpCitleHRlcm4gX19wcmludGYoNCwgNSkKIHZvaWQgZHJtX3V0X2RlYnVnX3ByaW50ayh1bnNpZ25lZCBpbnQgcmVxdWVzdF9sZXZlbCwKLQkJCQljb25zdCBjaGFyICpwcmVmaXgsCi0JCQkJY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJCQljb25zdCBjaGFyICpmb3JtYXQsIC4uLik7Ci1leHRlcm4gX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKKwkJCSBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJCSBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKIGludCBkcm1fZXJyKGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTg5LDcgKzk5MCw5IEBACiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3Jvb3Q7ICAvKio8IHByb2MgZGlyZWN0b3J5IGVudHJ5ICovCiAJc3RydWN0IGRybV9pbmZvX25vZGUgcHJvY19ub2RlczsKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3Jvb3Q7Ci0Jc3RydWN0IGRybV9pbmZvX25vZGUgZGVidWdmc19ub2RlczsKKworCXN0cnVjdCBsaXN0X2hlYWQgZGVidWdmc19saXN0OworCXN0cnVjdCBtdXRleCBkZWJ1Z2ZzX2xvY2s7IC8qIFByb3RlY3RzIGRlYnVnZnNfbGlzdC4gKi8KIAogCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXI7IC8qIGN1cnJlbnRseSBhY3RpdmUgbWFzdGVyIGZvciB0aGlzIG5vZGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG1hc3Rlcl9saXN0OwpAQCAtMTYyNCw2ICsxNjI3LDkgQEAKIAlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChvYmopOwogfQogCit2b2lkIGRybV9nZW1fZnJlZV9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CitpbnQgZHJtX2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOworCiBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmRybV9nZW1fb2JqZWN0X2xvb2t1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlscCwKIAkJCQkJICAgICB1MzIgaGFuZGxlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmggYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCmluZGV4IDQ0MzM1ZTUuLjgwMjA3OTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaApAQCAtNDY2LDYgKzQ2Niw4IEBACiAvKiBEQUNzIHNob3VsZCByYXJlbHkgZG8gdGhpcyB3aXRob3V0IGEgbG90IG9mIHRlc3RpbmcgKi8KICNkZWZpbmUgRFJNX0NPTk5FQ1RPUl9QT0xMX0RJU0NPTk5FQ1QgKDEgPDwgMikKIAorI2RlZmluZSBNQVhfRUxEX0JZVEVTCTEyOAorCiAvKioKICAqIGRybV9jb25uZWN0b3IgLSBjZW50cmFsIERSTSBjb25uZWN0b3IgY29udHJvbCBzdHJ1Y3R1cmUKICAqIEBjcnRjOiBDUlRDIHRoaXMgY29ubmVjdG9yIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8sIE5VTEwgaWYgbm9uZQpAQCAtNTIzLDYgKzUyNSwxMyBAQAogCXVpbnQzMl90IGZvcmNlX2VuY29kZXJfaWQ7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOyAvKiBjdXJyZW50bHkgYWN0aXZlIGVuY29kZXIgKi8KIAorCS8qIEVESUQgYml0cyAqLworCXVpbnQ4X3QgZWxkW01BWF9FTERfQllURVNdOworCWJvb2wgZHZpX2R1YWw7CisJaW50IG1heF90bWRzX2Nsb2NrOwkvKiBpbiBNSHogKi8KKwlib29sIGxhdGVuY3lfcHJlc2VudFsyXTsKKwlpbnQgdmlkZW9fbGF0ZW5jeVsyXTsJLyogWzBdOiBwcm9ncmVzc2l2ZSwgWzFdOiBpbnRlcmxhY2VkICovCisJaW50IGF1ZGlvX2xhdGVuY3lbMl07CiAJaW50IG51bGxfZWRpZF9jb3VudGVyOyAvKiBuZWVkZWQgdG8gd29ya2Fyb3VuZCBzb21lIEhXIGJ1Z3Mgd2hlcmUgd2UgZ2V0IGFsbCAwcyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oCmluZGV4IDkxNTY3YmIuLjkzZGYyZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZHBfaGVscGVyLmgKQEAgLTcyLDggKzcyLDIzIEBACiAKICNkZWZpbmUgRFBfTUFJTl9MSU5LX0NIQU5ORUxfQ09ESU5HICAgICAgICAgMHgwMDYKIAorI2RlZmluZSBEUF9FRFBfQ09ORklHVVJBVElPTl9DQVAgICAgICAgICAgICAweDAwZAogI2RlZmluZSBEUF9UUkFJTklOR19BVVhfUkRfSU5URVJWQUwgICAgICAgICAweDAwZQogCisjZGVmaW5lIERQX1BTUl9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgIDB4MDcwCisjIGRlZmluZSBEUF9QU1JfSVNfU1VQUE9SVEVEICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRFBfUFNSX0NBUFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzEKKyMgZGVmaW5lIERQX1BTUl9OT19UUkFJTl9PTl9FWElUICAgICAgICAgICAgMQorIyBkZWZpbmUgRFBfUFNSX1NFVFVQX1RJTUVfMzMwICAgICAgICAgICAgICAoMCA8PCAxKQorIyBkZWZpbmUgRFBfUFNSX1NFVFVQX1RJTUVfMjc1ICAgICAgICAgICAgICAoMSA8PCAxKQorIyBkZWZpbmUgRFBfUFNSX1NFVFVQX1RJTUVfMjIwICAgICAgICAgICAgICAoMiA8PCAxKQorIyBkZWZpbmUgRFBfUFNSX1NFVFVQX1RJTUVfMTY1ICAgICAgICAgICAgICAoMyA8PCAxKQorIyBkZWZpbmUgRFBfUFNSX1NFVFVQX1RJTUVfMTEwICAgICAgICAgICAgICAoNCA8PCAxKQorIyBkZWZpbmUgRFBfUFNSX1NFVFVQX1RJTUVfNTUgICAgICAgICAgICAgICAoNSA8PCAxKQorIyBkZWZpbmUgRFBfUFNSX1NFVFVQX1RJTUVfMCAgICAgICAgICAgICAgICAoNiA8PCAxKQorIyBkZWZpbmUgRFBfUFNSX1NFVFVQX1RJTUVfTUFTSyAgICAgICAgICAgICAoNyA8PCAxKQorIyBkZWZpbmUgRFBfUFNSX1NFVFVQX1RJTUVfU0hJRlQgICAgICAgICAgICAxCisKIC8qIGxpbmsgY29uZmlndXJhdGlvbiAqLwogI2RlZmluZQlEUF9MSU5LX0JXX1NFVAkJICAgICAgICAgICAgMHgxMDAKICMgZGVmaW5lIERQX0xJTktfQldfMV82MgkJICAgIDB4MDYKQEAgLTEzMyw2ICsxNDgsMjAgQEAKICNkZWZpbmUgRFBfTUFJTl9MSU5LX0NIQU5ORUxfQ09ESU5HX1NFVAkgICAgMHgxMDgKICMgZGVmaW5lIERQX1NFVF9BTlNJXzhCMTBCCQkgICAgKDEgPDwgMCkKIAorI2RlZmluZSBEUF9QU1JfRU5fQ0ZHCQkJICAgIDB4MTcwCisjIGRlZmluZSBEUF9QU1JfRU5BQkxFCQkJICAgICgxIDw8IDApCisjIGRlZmluZSBEUF9QU1JfTUFJTl9MSU5LX0FDVElWRQkgICAgKDEgPDwgMSkKKyMgZGVmaW5lIERQX1BTUl9DUkNfVkVSSUZJQ0FUSU9OCSAgICAoMSA8PCAyKQorIyBkZWZpbmUgRFBfUFNSX0ZSQU1FX0NBUFRVUkUJCSAgICAoMSA8PCAzKQorCisjZGVmaW5lIERQX0RFVklDRV9TRVJWSUNFX0lSUV9WRUNUT1IJICAgIDB4MjAxCisjIGRlZmluZSBEUF9SRU1PVEVfQ09OVFJPTF9DT01NQU5EX1BFTkRJTkcgICgxIDw8IDApCisjIGRlZmluZSBEUF9BVVRPTUFURURfVEVTVF9SRVFVRVNUCSAgICAoMSA8PCAxKQorIyBkZWZpbmUgRFBfQ1BfSVJRCQkJICAgICgxIDw8IDIpCisjIGRlZmluZSBEUF9TSU5LX1NQRUNJRklDX0lSUQkJICAgICgxIDw8IDYpCisKKyNkZWZpbmUgRFBfRURQX0NPTkZJR1VSQVRJT05fU0VUICAgICAgICAgICAgMHgxMGEKKwogI2RlZmluZSBEUF9MQU5FMF8xX1NUQVRVUwkJICAgIDB4MjAyCiAjZGVmaW5lIERQX0xBTkUyXzNfU1RBVFVTCQkgICAgMHgyMDMKICMgZGVmaW5lIERQX0xBTkVfQ1JfRE9ORQkJICAgICgxIDw8IDApCkBAIC0xNjUsMTAgKzE5NCw0NSBAQAogIyBkZWZpbmUgRFBfQURKVVNUX1BSRV9FTVBIQVNJU19MQU5FMV9NQVNLICAgMHhjMAogIyBkZWZpbmUgRFBfQURKVVNUX1BSRV9FTVBIQVNJU19MQU5FMV9TSElGVCAgNgogCisjZGVmaW5lIERQX1RFU1RfUkVRVUVTVAkJCSAgICAweDIxOAorIyBkZWZpbmUgRFBfVEVTVF9MSU5LX1RSQUlOSU5HCQkgICAgKDEgPDwgMCkKKyMgZGVmaW5lIERQX1RFU1RfTElOS19QQVRURVJOCQkgICAgKDEgPDwgMSkKKyMgZGVmaW5lIERQX1RFU1RfTElOS19FRElEX1JFQUQJCSAgICAoMSA8PCAyKQorIyBkZWZpbmUgRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BBVFRFUk4JICAgICgxIDw8IDMpIC8qIERQQ0QgPj0gMS4xICovCisKKyNkZWZpbmUgRFBfVEVTVF9MSU5LX1JBVEUJCSAgICAweDIxOQorIyBkZWZpbmUgRFBfTElOS19SQVRFXzE2MgkJICAgICgweDYpCisjIGRlZmluZSBEUF9MSU5LX1JBVEVfMjcJCSAgICAoMHhhKQorCisjZGVmaW5lIERQX1RFU1RfTEFORV9DT1VOVAkJICAgIDB4MjIwCisKKyNkZWZpbmUgRFBfVEVTVF9QQVRURVJOCQkJICAgIDB4MjIxCisKKyNkZWZpbmUgRFBfVEVTVF9SRVNQT05TRQkJICAgIDB4MjYwCisjIGRlZmluZSBEUF9URVNUX0FDSwkJCSAgICAoMSA8PCAwKQorIyBkZWZpbmUgRFBfVEVTVF9OQUsJCQkgICAgKDEgPDwgMSkKKyMgZGVmaW5lIERQX1RFU1RfRURJRF9DSEVDS1NVTV9XUklURQkgICAgKDEgPDwgMikKKwogI2RlZmluZSBEUF9TRVRfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAweDYwMAogIyBkZWZpbmUgRFBfU0VUX1BPV0VSX0QwICAgICAgICAgICAgICAgICAgICAweDEKICMgZGVmaW5lIERQX1NFVF9QT1dFUl9EMyAgICAgICAgICAgICAgICAgICAgMHgyCiAKKyNkZWZpbmUgRFBfUFNSX0VSUk9SX1NUQVRVUyAgICAgICAgICAgICAgICAgMHgyMDA2CisjIGRlZmluZSBEUF9QU1JfTElOS19DUkNfRVJST1IgICAgICAgICAgICAgICgxIDw8IDApCisjIGRlZmluZSBEUF9QU1JfUkZCX1NUT1JBR0VfRVJST1IgICAgICAgICAgICgxIDw8IDEpCisKKyNkZWZpbmUgRFBfUFNSX0VTSSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA3CisjIGRlZmluZSBEUF9QU1JfQ0FQU19DSEFOR0UgICAgICAgICAgICAgICAgICgxIDw8IDApCisKKyNkZWZpbmUgRFBfUFNSX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgMHgyMDA4CisjIGRlZmluZSBEUF9QU1JfU0lOS19JTkFDVElWRSAgICAgICAgICAgICAgIDAKKyMgZGVmaW5lIERQX1BTUl9TSU5LX0FDVElWRV9TUkNfU1lOQ0VEICAgICAgMQorIyBkZWZpbmUgRFBfUFNSX1NJTktfQUNUSVZFX1JGQiAgICAgICAgICAgICAyCisjIGRlZmluZSBEUF9QU1JfU0lOS19BQ1RJVkVfU0lOS19TWU5DRUQgICAgIDMKKyMgZGVmaW5lIERQX1BTUl9TSU5LX0FDVElWRV9SRVNZTkMgICAgICAgICAgNAorIyBkZWZpbmUgRFBfUFNSX1NJTktfSU5URVJOQUxfRVJST1IgICAgICAgICA3CisjIGRlZmluZSBEUF9QU1JfU0lOS19TVEFURV9NQVNLICAgICAgICAgICAgIDB4MDcKKwogI2RlZmluZSBNT0RFX0kyQ19TVEFSVAkxCiAjZGVmaW5lIE1PREVfSTJDX1dSSVRFCTIKICNkZWZpbmUgTU9ERV9JMkNfUkVBRAk0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZWRpZC5oIGIvaW5jbHVkZS9kcm0vZHJtX2VkaWQuaAppbmRleCBlYWNiNDE1Li43NGNlOTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fZWRpZC5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9lZGlkLmgKQEAgLTIzMCw0ICsyMzAsMTMgQEAKIAogI2RlZmluZSBFRElEX1BST0RVQ1RfSUQoZSkgKChlKS0+cHJvZF9jb2RlWzBdIHwgKChlKS0+cHJvZF9jb2RlWzFdIDw8IDgpKQogCitzdHJ1Y3QgZHJtX2VuY29kZXI7CitzdHJ1Y3QgZHJtX2Nvbm5lY3RvcjsKK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlOwordm9pZCBkcm1fZWRpZF90b19lbGQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGVkaWQgKmVkaWQpOworaW50IGRybV9hdl9zeW5jX2RlbGF5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK3N0cnVjdCBkcm1fY29ubmVjdG9yICpkcm1fc2VsZWN0X2VsZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7CisKICNlbmRpZiAvKiBfX0RSTV9FRElEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX21vZGUuaCBiL2luY2x1ZGUvZHJtL2RybV9tb2RlLmgKaW5kZXggYzQ5NjFlYS4uZDMwYmVkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX21vZGUuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCkBAIC0xMjAsMTEgKzEyMCwxMiBAQAogCXN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbyBtb2RlOwogfTsKIAotI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX05PTkUJMAotI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0RBQwkxCi0jZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfVE1EUwkyCi0jZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfTFZEUwkzCi0jZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfVFZEQUMJNAorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX05PTkUJIDAKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EQUMJIDEKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9UTURTCSAyCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfTFZEUwkgMworI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1RWREFDCSA0CisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfVklSVFVBTCA1CiAKIHN0cnVjdCBkcm1fbW9kZV9nZXRfZW5jb2RlciB7CiAJX191MzIgZW5jb2Rlcl9pZDsKQEAgLTE2Miw2ICsxNjMsNyBAQAogI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUIJMTIKICNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1RWCQkxMwogI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfZURQCQkxNAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfVklSVFVBTCAgICAgIDE1CiAKIHN0cnVjdCBkcm1fbW9kZV9nZXRfY29ubmVjdG9yIHsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZXh5bm9zX2RybS5oIGIvaW5jbHVkZS9kcm0vZXh5bm9zX2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTYxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9leHlub3NfZHJtLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIGV4eW5vc19kcm0uaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yczoKKyAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KKyAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRVhZTk9TX0RSTV9IXworI2RlZmluZSBfRVhZTk9TX0RSTV9IXworCisvKioKKyAqIFVzZXItZGVzaXJlZCBidWZmZXIgY3JlYXRpb24gaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICoKKyAqIEBzaXplOiByZXF1ZXN0ZWQgc2l6ZSBmb3IgdGhlIG9iamVjdC4KKyAqCS0gdGhpcyBzaXplIHZhbHVlIHdvdWxkIGJlIHBhZ2UtYWxpZ25lZCBpbnRlcm5hbGx5LgorICogQGZsYWdzOiB1c2VyIHJlcXVlc3QgZm9yIHNldHRpbmcgbWVtb3J5IHR5cGUgb3IgY2FjaGUgYXR0cmlidXRlcy4KKyAqIEBoYW5kbGU6IHJldHVybmVkIGhhbmRsZSBmb3IgdGhlIG9iamVjdC4KKyAqIEBwYWQ6IGp1c3QgcGFkZGluZyB0byBiZSA2NC1iaXQgYWxpZ25lZC4KKyAqLworc3RydWN0IGRybV9leHlub3NfZ2VtX2NyZWF0ZSB7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBoYW5kbGU7CisJdW5zaWduZWQgaW50IHBhZDsKK307CisKKy8qKgorICogQSBzdHJ1Y3R1cmUgZm9yIGdldHRpbmcgYnVmZmVyIG9mZnNldC4KKyAqCisgKiBAaGFuZGxlOiBhIHBvaW50ZXIgdG8gZ2VtIG9iamVjdCBjcmVhdGVkLgorICogQHBhZDoganVzdCBwYWRkaW5nIHRvIGJlIDY0LWJpdCBhbGlnbmVkLgorICogQG9mZnNldDogcmVsYXRpdmVkIG9mZnNldCB2YWx1ZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbiBhbGxvY2F0ZWQuCisgKgktIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldCBieSB1c2VyLgorICovCitzdHJ1Y3QgZHJtX2V4eW5vc19nZW1fbWFwX29mZiB7CisJdW5zaWduZWQgaW50IGhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgcGFkOworCXVpbnQ2NF90IG9mZnNldDsKK307CisKKy8qKgorICogQSBzdHJ1Y3R1cmUgZm9yIG1hcHBpbmcgYnVmZmVyLgorICoKKyAqIEBoYW5kbGU6IGEgaGFuZGxlIHRvIGdlbSBvYmplY3QgY3JlYXRlZC4KKyAqIEBzaXplOiBtZW1vcnkgc2l6ZSB0byBiZSBtYXBwZWQuCisgKiBAbWFwcGVkOiBoYXZpbmcgdXNlciB2aXJ0dWFsIGFkZHJlc3MgbW1hcGVkLgorICoJLSB0aGlzIHZhcmlhYmxlIHdvdWxkIGJlIGZpbGxlZCBieSBleHlub3MgZ2VtIG1vZHVsZQorICoJb2Yga2VybmVsIHNpZGUgd2l0aCB1c2VyIHZpcnR1YWwgYWRkcmVzcyB3aGljaCBpcyBhbGxvY2F0ZWQKKyAqCWJ5IGRvX21tYXAoKS4KKyAqLworc3RydWN0IGRybV9leHlub3NfZ2VtX21tYXAgeworCXVuc2lnbmVkIGludCBoYW5kbGU7CisJdW5zaWduZWQgaW50IHNpemU7CisJdWludDY0X3QgbWFwcGVkOworfTsKKworI2RlZmluZSBEUk1fRVhZTk9TX0dFTV9DUkVBVEUJCTB4MDAKKyNkZWZpbmUgRFJNX0VYWU5PU19HRU1fTUFQX09GRlNFVAkweDAxCisjZGVmaW5lIERSTV9FWFlOT1NfR0VNX01NQVAJCTB4MDIKKworI2RlZmluZSBEUk1fSU9DVExfRVhZTk9TX0dFTV9DUkVBVEUJCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBcCisJCURSTV9FWFlOT1NfR0VNX0NSRUFURSwgc3RydWN0IGRybV9leHlub3NfZ2VtX2NyZWF0ZSkKKworI2RlZmluZSBEUk1fSU9DVExfRVhZTk9TX0dFTV9NQVBfT0ZGU0VUCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBcCisJCURSTV9FWFlOT1NfR0VNX01BUF9PRkZTRVQsIHN0cnVjdCBkcm1fZXh5bm9zX2dlbV9tYXBfb2ZmKQorCisjZGVmaW5lIERSTV9JT0NUTF9FWFlOT1NfR0VNX01NQVAJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIFwKKwkJRFJNX0VYWU5PU19HRU1fTU1BUCwgc3RydWN0IGRybV9leHlub3NfZ2VtX21tYXApCisKKy8qKgorICogUGxhdGZvcm0gU3BlY2lmaWMgU3RydWN0dXJlIGZvciBEUk0gYmFzZWQgRklNRC4KKyAqCisgKiBAdGltaW5nOiBkZWZhdWx0IHZpZGVvIG1vZGUgZm9yIGluaXRpYWxpemluZworICogQGRlZmF1bHRfd2luOiBkZWZhdWx0IHdpbmRvdyBsYXllciBudW1iZXIgdG8gYmUgdXNlZCBmb3IgVUkuCisgKiBAYnBwOiBkZWZhdWx0IGJpdCBwZXIgcGl4ZWwuCisgKi8KK3N0cnVjdCBleHlub3NfZHJtX2ZpbWRfcGRhdGEgeworCXN0cnVjdCBmYl92aWRlb21vZGUJCXRpbWluZzsKKwl1MzIJCQkJdmlkY29uMDsKKwl1MzIJCQkJdmlkY29uMTsKKwl1bnNpZ25lZCBpbnQJCQlkZWZhdWx0X3dpbjsKKwl1bnNpZ25lZCBpbnQJCQlicHA7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2ludGVsLWd0dC5oIGIvaW5jbHVkZS9kcm0vaW50ZWwtZ3R0LmgKaW5kZXggOWUzNDNjMC4uYjE3NDYyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vaW50ZWwtZ3R0LmgKKysrIGIvaW5jbHVkZS9kcm0vaW50ZWwtZ3R0LmgKQEAgLTEzLDYgKzEzLDggQEAKIAl1bnNpZ25lZCBpbnQgZ3R0X21hcHBhYmxlX2VudHJpZXM7CiAJLyogV2hldGhlciBpOTE1IG5lZWRzIHRvIHVzZSB0aGUgZG1hciBhcGlzIG9yIG5vdC4gKi8KIAl1bnNpZ25lZCBpbnQgbmVlZHNfZG1hciA6IDE7CisJLyogV2hldGhlciB3ZSBpZGxlIHRoZSBncHUgYmVmb3JlIG1hcHBpbmcvdW5tYXBwaW5nICovCisJdW5zaWduZWQgaW50IGRvX2lkbGVfbWFwcyA6IDE7CiB9ICppbnRlbF9ndHRfZ2V0KHZvaWQpOwogCiB2b2lkIGludGVsX2d0dF9jaGlwc2V0X2ZsdXNoKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdm13Z2Z4X2RybS5oIGIvaW5jbHVkZS9kcm0vdm13Z2Z4X2RybS5oCmluZGV4IDVjMzY0MzJkLi5iY2IwOTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS92bXdnZnhfZHJtLmgKKysrIGIvaW5jbHVkZS9kcm0vdm13Z2Z4X2RybS5oCkBAIC0zMSw3ICszMSw2IEBACiAjZGVmaW5lIERSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVMgNgogI2RlZmluZSBEUk1fVk1XX01BWF9NSVBfTEVWRUxTIDI0CiAKLSNkZWZpbmUgRFJNX1ZNV19FWFRfTkFNRV9MRU4gMTI4CiAKICNkZWZpbmUgRFJNX1ZNV19HRVRfUEFSQU0gICAgICAgICAgICAwCiAjZGVmaW5lIERSTV9WTVdfQUxMT0NfRE1BQlVGICAgICAgICAgMQpAQCAtNDgsMTEgKzQ3LDE0IEBACiAjZGVmaW5lIERSTV9WTVdfVU5SRUZfU1VSRkFDRSAgICAgICAgMTAKICNkZWZpbmUgRFJNX1ZNV19SRUZfU1VSRkFDRSAgICAgICAgICAxMQogI2RlZmluZSBEUk1fVk1XX0VYRUNCVUYgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIERSTV9WTVdfRklGT19ERUJVRyAgICAgICAgICAgMTMKKyNkZWZpbmUgRFJNX1ZNV19HRVRfM0RfQ0FQICAgICAgICAgICAxMwogI2RlZmluZSBEUk1fVk1XX0ZFTkNFX1dBSVQgICAgICAgICAgIDE0Ci0vKiBndWFyZGVkIGJ5IG1pbm9yIHZlcnNpb24gPj0gMiAqLwotI2RlZmluZSBEUk1fVk1XX1VQREFURV9MQVlPVVQgICAgICAgIDE1Ci0KKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9TSUdOQUxFRCAgICAgICAxNQorI2RlZmluZSBEUk1fVk1XX0ZFTkNFX1VOUkVGICAgICAgICAgIDE2CisjZGVmaW5lIERSTV9WTVdfRkVOQ0VfRVZFTlQgICAgICAgICAgMTcKKyNkZWZpbmUgRFJNX1ZNV19QUkVTRU5UICAgICAgICAgICAgICAxOAorI2RlZmluZSBEUk1fVk1XX1BSRVNFTlRfUkVBREJBQ0sgICAgIDE5CisjZGVmaW5lIERSTV9WTVdfVVBEQVRFX0xBWU9VVCAgICAgICAgMjAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKQEAgLTY5LDEwICs3MSwxMCBAQAogI2RlZmluZSBEUk1fVk1XX1BBUkFNX05VTV9TVFJFQU1TICAgICAgMAogI2RlZmluZSBEUk1fVk1XX1BBUkFNX05VTV9GUkVFX1NUUkVBTVMgMQogI2RlZmluZSBEUk1fVk1XX1BBUkFNXzNEICAgICAgICAgICAgICAgMgotI2RlZmluZSBEUk1fVk1XX1BBUkFNX0ZJRk9fT0ZGU0VUICAgICAgMwotI2RlZmluZSBEUk1fVk1XX1BBUkFNX0hXX0NBUFMgICAgICAgICAgNAotI2RlZmluZSBEUk1fVk1XX1BBUkFNX0ZJRk9fQ0FQUyAgICAgICAgNQotI2RlZmluZSBEUk1fVk1XX1BBUkFNX01BWF9GQl9TSVpFICAgICAgNgorI2RlZmluZSBEUk1fVk1XX1BBUkFNX0hXX0NBUFMgICAgICAgICAgMworI2RlZmluZSBEUk1fVk1XX1BBUkFNX0ZJRk9fQ0FQUyAgICAgICAgNAorI2RlZmluZSBEUk1fVk1XX1BBUkFNX01BWF9GQl9TSVpFICAgICAgNQorI2RlZmluZSBEUk1fVk1XX1BBUkFNX0ZJRk9fSFdfVkVSU0lPTiAgNgogCiAvKioKICAqIHN0cnVjdCBkcm1fdm13X2dldHBhcmFtX2FyZwpAQCAtOTEsNDkgKzkzLDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKLSAqIERSTV9WTVdfRVhURU5TSU9OIC0gUXVlcnkgZGV2aWNlIGV4dGVuc2lvbnMuCi0gKi8KLQotLyoqCi0gKiBzdHJ1Y3QgZHJtX3Ztd19leHRlbnNpb25fcmVwCi0gKgotICogQGV4aXN0czogVGhlIHF1ZXJpZWQgZXh0ZW5zaW9uIGV4aXN0cy4KLSAqIEBkcml2ZXJfaW9jdGxfb2Zmc2V0OiBJb2N0bCBudW1iZXIgb2YgdGhlIGZpcnN0IGlvY3RsIGluIHRoZSBleHRlbnNpb24uCi0gKiBAZHJpdmVyX3NhcmVhX29mZnNldDogT2Zmc2V0IHRvIGFueSBzcGFjZSBpbiB0aGUgRFJJIFNBUkVBCi0gKiB1c2VkIGJ5IHRoZSBleHRlbnNpb24uCi0gKiBAbWFqb3I6IE1ham9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleHRlbnNpb24uCi0gKiBAbWlub3I6IE1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleHRlbnNpb24uCi0gKiBAcGw6IFBhdGNoIGxldmVsIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleHRlbnNpb24uCi0gKgotICogT3V0cHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0VYVEVOU0lPTiBJb2N0bC4KLSAqLwotCi1zdHJ1Y3QgZHJtX3Ztd19leHRlbnNpb25fcmVwIHsKLQlpbnQzMl90IGV4aXN0czsKLQl1aW50MzJfdCBkcml2ZXJfaW9jdGxfb2Zmc2V0OwotCXVpbnQzMl90IGRyaXZlcl9zYXJlYV9vZmZzZXQ7Ci0JdWludDMyX3QgbWFqb3I7Ci0JdWludDMyX3QgbWlub3I7Ci0JdWludDMyX3QgcGw7Ci0JdWludDMyX3QgcGFkNjQ7Ci19OwotCi0vKioKLSAqIHVuaW9uIGRybV92bXdfZXh0ZW5zaW9uX2FyZwotICoKLSAqIEBleHRlbnNpb24gLSBBc2NpaSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdG8gYmUgcXVlcmllZC4gLy9JbgotICogQHJlcCAtIFJlcGx5IGFzIGRlZmluZWQgYWJvdmUuIC8vT3V0Ci0gKgotICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRVhURU5TSU9OIElvY3RsLgotICovCi0KLXVuaW9uIGRybV92bXdfZXh0ZW5zaW9uX2FyZyB7Ci0JY2hhciBleHRlbnNpb25bRFJNX1ZNV19FWFRfTkFNRV9MRU5dOwotCXN0cnVjdCBkcm1fdm13X2V4dGVuc2lvbl9yZXAgcmVwOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKICAqIERSTV9WTVdfQ1JFQVRFX0NPTlRFWFQgLSBDcmVhdGUgYSBob3N0IGNvbnRleHQuCiAgKgogICogQWxsb2NhdGVzIGEgZGV2aWNlIHVuaXF1ZSBjb250ZXh0IGlkLCBhbmQgcXVldWVzIGEgY3JlYXRlIGNvbnRleHQgY29tbWFuZApAQCAtMjkyLDcgKzI1MSw3IEBACiAgKiBEUk1fVk1XX0VYRUNCVUYKICAqCiAgKiBTdWJtaXQgYSBjb21tYW5kIGJ1ZmZlciBmb3IgZXhlY3V0aW9uIG9uIHRoZSBob3N0LCBhbmQgcmV0dXJuIGEKLSAqIGZlbmNlIHNlcXVlbmNlIHRoYXQgd2hlbiBzaWduYWxlZCwgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgYnVmZmVyIGhhcworICogZmVuY2Ugc2Vxbm8gdGhhdCB3aGVuIHNpZ25hbGVkLCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBidWZmZXIgaGFzCiAgKiBleGVjdXRlZC4KICAqLwogCkBAIC0zMTQsMjEgKzI3MywzMCBAQAogICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRVhFQ0JVRiBJb2N0bC4KICAqLwogCi0jZGVmaW5lIERSTV9WTVdfRVhFQ0JVRl9WRVJTSU9OIDAKKyNkZWZpbmUgRFJNX1ZNV19FWEVDQlVGX1ZFUlNJT04gMQogCiBzdHJ1Y3QgZHJtX3Ztd19leGVjYnVmX2FyZyB7CiAJdWludDY0X3QgY29tbWFuZHM7CiAJdWludDMyX3QgY29tbWFuZF9zaXplOwogCXVpbnQzMl90IHRocm90dGxlX3VzOwogCXVpbnQ2NF90IGZlbmNlX3JlcDsKLQkgdWludDMyX3QgdmVyc2lvbjsKLQkgdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50MzJfdCBmbGFnczsKIH07CiAKIC8qKgogICogc3RydWN0IGRybV92bXdfZmVuY2VfcmVwCiAgKgotICogQGZlbmNlX3NlcTogRmVuY2Ugc2VxdWVuY2UgYXNzb2NpYXRlZCB3aXRoIGEgY29tbWFuZCBzdWJtaXNzaW9uLgorICogQGhhbmRsZTogRmVuY2Ugb2JqZWN0IGhhbmRsZSBmb3IgZmVuY2UgYXNzb2NpYXRlZCB3aXRoIGEgY29tbWFuZCBzdWJtaXNzaW9uLgorICogQG1hc2s6IEZlbmNlIGZsYWdzIHJlbGV2YW50IGZvciB0aGlzIGZlbmNlIG9iamVjdC4KKyAqIEBzZXFubzogRmVuY2Ugc2VxdWVuY2UgbnVtYmVyIGluIGZpZm8uIEEgZmVuY2Ugb2JqZWN0IHdpdGggYSBsb3dlcgorICogc2Vxbm8gd2lsbCBzaWduYWwgdGhlIEVYRUMgZmxhZyBiZWZvcmUgYSBmZW5jZSBvYmplY3Qgd2l0aCBhIGhpZ2hlcgorICogc2Vxbm8uIFRoaXMgY2FuIGJlIHVzZWQgYnkgdXNlci1zcGFjZSB0byBhdm9pZCBrZXJuZWwgY2FsbHMgdG8gZGV0ZXJtaW5lCisgKiB3aGV0aGVyIGEgZmVuY2UgaGFzIHNpZ25hbGVkIHRoZSBFWEVDIGZsYWcuIE5vdGUgdGhhdCBAc2Vxbm8gd2lsbAorICogd3JhcCBhdCAzMi1iaXQuCisgKiBAcGFzc2VkX3NlcW5vOiBUaGUgaGlnaGVzdCBzZXFubyBudW1iZXIgcHJvY2Vzc2VkIGJ5IHRoZSBoYXJkd2FyZQorICogc28gZmFyLiBUaGlzIGNhbiBiZSB1c2VkIHRvIG1hcmsgdXNlci1zcGFjZSBmZW5jZSBvYmplY3RzIGFzIHNpZ25hbGVkLCBhbmQKKyAqIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZmVuY2Ugc2Vxbm8gbWlnaHQgYmUgc3RhbGUuCiAgKiBAZXJyb3I6IFRoaXMgbWVtYmVyIHNob3VsZCd2ZSBiZWVuIHNldCB0byAtRUZBVUxUIG9uIHN1Ym1pc3Npb24uCiAgKiBUaGUgZm9sbG93aW5nIGFjdGlvbnMgc2hvdWxkIGJlIHRha2Ugb24gY29tcGxldGlvbjoKICAqIGVycm9yID09IC1FRkFVTFQ6IEZlbmNlIGNvbW11bmljYXRpb24gZmFpbGVkLiBUaGUgaG9zdCBpcyBzeW5jaHJvbml6ZWQuCkBAIC0zNDIsOSArMzEwLDEyIEBACiAgKi8KIAogc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIHsKLQl1aW50NjRfdCBmZW5jZV9zZXE7Ci0JaW50MzJfdCBlcnJvcjsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgbWFzazsKKwl1aW50MzJfdCBzZXFubzsKKwl1aW50MzJfdCBwYXNzZWRfc2Vxbm87CiAJdWludDMyX3QgcGFkNjQ7CisJaW50MzJfdCBlcnJvcjsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDM1LDM5ICs0MDYsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKgotICogRFJNX1ZNV19GSUZPX0RFQlVHIC0gR2V0IGxhc3QgRklGTyBzdWJtaXNzaW9uLgotICoKLSAqIFRoaXMgSU9DVEwgY29waWVzIHRoZSBsYXN0IEZJRk8gc3VibWlzc2lvbiBkaXJlY3RseSBvdXQgb2YgdGhlIEZJRk8gYnVmZmVyLgotICovCi0KLS8qKgotICogc3RydWN0IGRybV92bXdfZmlmb19kZWJ1Z19hcmcKLSAqCi0gKiBAZGVidWdfYnVmZmVyOiBVc2VyIHNwYWNlIGFkZHJlc3Mgb2YgYSBkZWJ1Z19idWZmZXIgY2FzdCB0byBhbiB1aW50NjRfdCAvL0luCi0gKiBAZGVidWdfYnVmZmVyX3NpemU6IFNpemUgaW4gYnl0ZXMgb2YgZGVidWcgYnVmZmVyIC8vSW4KLSAqIEB1c2VkX3NpemU6IE51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGJ1ZmZlciAvLyBPdXQKLSAqIEBkaWRfbm90X2ZpdDogQm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGZpZm8gY29udGVudHMgZGlkIG5vdCBmaXQuIC8vT3V0Ci0gKgotICogQXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRklGT19ERUJVRyBJb2N0bC4KLSAqLwotCi1zdHJ1Y3QgZHJtX3Ztd19maWZvX2RlYnVnX2FyZyB7Ci0JdWludDY0X3QgZGVidWdfYnVmZmVyOwotCXVpbnQzMl90IGRlYnVnX2J1ZmZlcl9zaXplOwotCXVpbnQzMl90IHVzZWRfc2l6ZTsKLQlpbnQzMl90IGRpZF9ub3RfZml0OwotCXVpbnQzMl90IHBhZDY0OwotfTsKLQotc3RydWN0IGRybV92bXdfZmVuY2Vfd2FpdF9hcmcgewotCXVpbnQ2NF90IHNlcXVlbmNlOwotCXVpbnQ2NF90IGtlcm5lbF9jb29raWU7Ci0JaW50MzJfdCBjb29raWVfdmFsaWQ7Ci0JaW50MzJfdCBwYWQ2NDsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCiAgKiBEUk1fVk1XX0NPTlRST0xfU1RSRUFNIC0gQ29udHJvbCBvdmVybGF5cywgYWthIHN0cmVhbXMuCiAgKgogICogVGhpcyBJT0NUTCBjb250cm9scyB0aGUgb3ZlcmxheSB1bml0cyBvZiB0aGUgc3ZnYSBkZXZpY2UuCkBAIC01OTAsMjIgKzUyOCwyNTkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKKyAqIERSTV9WTVdfR0VUXzNEX0NBUAorICoKKyAqIFJlYWQgM0QgY2FwYWJpbGl0aWVzIGZyb20gdGhlIEZJRk8KKyAqCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19nZXRfM2RfY2FwX2FyZworICoKKyAqIEBidWZmZXI6IFBvaW50ZXIgdG8gYSBidWZmZXIgZm9yIGNhcGFiaWxpdHkgZGF0YSwgY2FzdCB0byBhbiB1aW50NjRfdAorICogQHNpemU6IE1heCBzaXplIHRvIGNvcHkKKyAqCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19HRVRfM0RfQ0FQX0lPQ1RMCisgKiBpb2N0bHMuCisgKi8KKworc3RydWN0IGRybV92bXdfZ2V0XzNkX2NhcF9hcmcgeworCXVpbnQ2NF90IGJ1ZmZlcjsKKwl1aW50MzJfdCBtYXhfc2l6ZTsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0ZFTkNFX1dBSVQKKyAqCisgKiBXYWl0cyBmb3IgYSBmZW5jZSBvYmplY3QgdG8gc2lnbmFsLiBUaGUgd2FpdCBpcyBpbnRlcnJ1cHRpYmxlLCBzbyB0aGF0CisgKiBzaWduYWxzIG1heSBiZSBkZWxpdmVyZWQgZHVyaW5nIHRoZSBpbnRlcnJ1cHQuIFRoZSB3YWl0IG1heSB0aW1lb3V0LAorICogaW4gd2hpY2ggY2FzZSB0aGUgY2FsbHMgcmV0dXJucyAtRUJVU1kuIElmIHRoZSB3YWl0IGlzIHJlc3RhcnRlZCwKKyAqIHRoYXQgaXMgcmVzdGFydGluZyB3aXRob3V0IHJlc2V0dGluZyBAY29va2llX3ZhbGlkIHRvIHplcm8sCisgKiB0aGUgdGltZW91dCBpcyBjb21wdXRlZCBmcm9tIHRoZSBmaXJzdCBjYWxsLgorICoKKyAqIFRoZSBmbGFncyBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19GRU5DRV9XQUlUIGlvY3RsIGluZGljYXRlcyB3aGF0IHRvIHdhaXQKKyAqIG9uOgorICogRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUM6IEFsbCBjb21tYW5kcyBhaGVhZCBvZiB0aGUgZmVuY2UgaW4gdGhlIGNvbW1hbmQKKyAqIHN0cmVhbQorICogaGF2ZSBleGVjdXRlZC4KKyAqIERSTV9WTVdfRkVOQ0VfRkxBR19RVUVSWTogQWxsIHF1ZXJ5IHJlc3VsdHMgcmVzdWx0aW5nIGZyb20gcXVlcnkgZmluaXNoCisgKiBjb21tYW5kcworICogaW4gdGhlIGJ1ZmZlciBnaXZlbiB0byB0aGUgRVhFQ0JVRiBpb2N0bCByZXR1cm5pbmcgdGhlIGZlbmNlIG9iamVjdCBoYW5kbGUKKyAqIGFyZSBhdmFpbGFibGUgdG8gdXNlci1zcGFjZS4KKyAqCisgKiBEUk1fVk1XX1dBSVRfT1BUSU9OX1VOUkVGOiBJZiB0aGlzIHdhaXQgb3B0aW9uIGlzIGdpdmVuLCBhbmQgdGhlCisgKiBmZW5jIHdhaXQgaW9jdGwgcmV0dXJucyAwLCB0aGUgZmVuY2Ugb2JqZWN0IGhhcyBiZWVuIHVucmVmZXJlbmNlZCBhZnRlcgorICogdGhlIHdhaXQuCisgKi8KKworI2RlZmluZSBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQyAgICgxIDw8IDApCisjZGVmaW5lIERSTV9WTVdfRkVOQ0VfRkxBR19RVUVSWSAgKDEgPDwgMSkKKworI2RlZmluZSBEUk1fVk1XX1dBSVRfT1BUSU9OX1VOUkVGICgxIDw8IDApCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZmVuY2Vfd2FpdF9hcmcKKyAqCisgKiBAaGFuZGxlOiBGZW5jZSBvYmplY3QgaGFuZGxlIGFzIHJldHVybmVkIGJ5IHRoZSBEUk1fVk1XX0VYRUNCVUYgaW9jdGwuCisgKiBAY29va2llX3ZhbGlkOiBNdXN0IGJlIHJlc2V0IHRvIDAgb24gZmlyc3QgY2FsbC4gTGVmdCBhbG9uZSBvbiByZXN0YXJ0LgorICogQGtlcm5lbF9jb29raWU6IFNldCB0byAwIG9uIGZpcnN0IGNhbGwuIExlZnQgYWxvbmUgb24gcmVzdGFydC4KKyAqIEB0aW1lb3V0X3VzOiBXYWl0IHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzLiAwIGZvciBpbmRlZmluaXRlIHRpbWVvdXQuCisgKiBAbGF6eTogU2V0IHRvIDEgaWYgdGltaW5nIGlzIG5vdCBjcml0aWNhbC4gQWxsb3cgbW9yZSB0aGFuIGEga2VybmVsIHRpY2sKKyAqIGJlZm9yZSByZXR1cm5pbmcuCisgKiBAZmxhZ3M6IEZlbmNlIGZsYWdzIHRvIHdhaXQgb24uCisgKiBAd2FpdF9vcHRpb25zOiBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUgYmVoYXZpb3VyIG9mIHRoZSB3YWl0IGlvY3RsLgorICoKKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0ZFTkNFX1dBSVQgaW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfZmVuY2Vfd2FpdF9hcmcgeworCXVpbnQzMl90IGhhbmRsZTsKKwlpbnQzMl90ICBjb29raWVfdmFsaWQ7CisJdWludDY0X3Qga2VybmVsX2Nvb2tpZTsKKwl1aW50NjRfdCB0aW1lb3V0X3VzOworCWludDMyX3QgbGF6eTsKKwlpbnQzMl90IGZsYWdzOworCWludDMyX3Qgd2FpdF9vcHRpb25zOworCWludDMyX3QgcGFkNjQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19GRU5DRV9TSUdOQUxFRAorICoKKyAqIENoZWNrcyBpZiBhIGZlbmNlIG9iamVjdCBpcyBzaWduYWxlZC4uCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9zaWduYWxlZF9hcmcKKyAqCisgKiBAaGFuZGxlOiBGZW5jZSBvYmplY3QgaGFuZGxlIGFzIHJldHVybmVkIGJ5IHRoZSBEUk1fVk1XX0VYRUNCVUYgaW9jdGwuCisgKiBAZmxhZ3M6IEZlbmNlIG9iamVjdCBmbGFncyBpbnB1dCB0byBEUk1fVk1XX0ZFTkNFX1NJR05BTEVEIGlvY3RsCisgKiBAc2lnbmFsZWQ6IE91dDogRmxhZ3Mgc2lnbmFsZWQuCisgKiBAc2VxdWVuY2U6IE91dDogSGlnaGVzdCBzZXF1ZW5jZSBwYXNzZWQgc28gZmFyLiBDYW4gYmUgdXNlZCB0byBzaWduYWwgdGhlCisgKiBFWEVDIGZsYWcgb2YgdXNlci1zcGFjZSBmZW5jZSBvYmplY3RzLgorICoKKyAqIElucHV0L091dHB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19GRU5DRV9TSUdOQUxFRCBhbmQgRFJNX1ZNV19GRU5DRV9VTlJFRgorICogaW9jdGxzLgorICovCisKK3N0cnVjdCBkcm1fdm13X2ZlbmNlX3NpZ25hbGVkX2FyZyB7CisJIHVpbnQzMl90IGhhbmRsZTsKKwkgdWludDMyX3QgZmxhZ3M7CisJIGludDMyX3Qgc2lnbmFsZWQ7CisJIHVpbnQzMl90IHBhc3NlZF9zZXFubzsKKwkgdWludDMyX3Qgc2lnbmFsZWRfZmxhZ3M7CisJIHVpbnQzMl90IHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfRkVOQ0VfVU5SRUYKKyAqCisgKiBVbnJlZmVyZW5jZXMgYSBmZW5jZSBvYmplY3QsIGFuZCBjYXVzZXMgaXQgdG8gYmUgZGVzdHJveWVkIGlmIHRoZXJlIGFyZSBubworICogb3RoZXIgcmVmZXJlbmNlcyB0byBpdC4KKyAqCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9hcmcKKyAqCisgKiBAaGFuZGxlOiBGZW5jZSBvYmplY3QgaGFuZGxlIGFzIHJldHVybmVkIGJ5IHRoZSBEUk1fVk1XX0VYRUNCVUYgaW9jdGwuCisgKgorICogSW5wdXQvT3V0cHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0ZFTkNFX1VOUkVGIGlvY3RsLi4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9hcmcgeworCSB1aW50MzJfdCBoYW5kbGU7CisJIHVpbnQzMl90IHBhZDY0OworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19GRU5DRV9FVkVOVAorICoKKyAqIFF1ZXVlcyBhbiBldmVudCBvbiBhIGZlbmNlIHRvIGJlIGRlbGl2ZXJlZCBvbiB0aGUgZHJtIGNoYXJhY3RlciBkZXZpY2UKKyAqIHdoZW4gdGhlIGZlbmNlIGhhcyBzaWduYWxlZCB0aGUgRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUMgZmxhZy4KKyAqIE9wdGlvbmFsbHkgdGhlIGFwcHJveGltYXRlIHRpbWUgd2hlbiB0aGUgZmVuY2Ugc2lnbmFsZWQgaXMKKyAqIGdpdmVuIGJ5IHRoZSBldmVudC4KKyAqLworCisvKgorICogVGhlIGV2ZW50IHR5cGUKKyAqLworI2RlZmluZSBEUk1fVk1XX0VWRU5UX0ZFTkNFX1NJR05BTEVEIDB4ODAwMDAwMDAKKworc3RydWN0IGRybV92bXdfZXZlbnRfZmVuY2UgeworCXN0cnVjdCBkcm1fZXZlbnQgYmFzZTsKKwl1aW50NjRfdCB1c2VyX2RhdGE7CisJdWludDMyX3QgdHZfc2VjOworCXVpbnQzMl90IHR2X3VzZWM7Cit9OworCisvKgorICogRmxhZ3MgdGhhdCBtYXkgYmUgZ2l2ZW4gdG8gdGhlIGNvbW1hbmQuCisgKi8KKy8qIFJlcXVlc3QgZmVuY2Ugc2lnbmFsZWQgdGltZSBvbiB0aGUgZXZlbnQuICovCisjZGVmaW5lIERSTV9WTVdfRkVfRkxBR19SRVFfVElNRSAoMSA8PCAwKQorCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2ZlbmNlX2V2ZW50X2FyZworICoKKyAqIEBmZW5jZV9yZXA6IFBvaW50ZXIgdG8gZmVuY2VfcmVwIHN0cnVjdHVyZSBjYXN0IHRvIHVpbnQ2NF90IG9yIDAgaWYKKyAqIHRoZSBmZW5jZSBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgcmVmZXJlbmNlZCBieSB1c2VyLXNwYWNlLgorICogQHVzZXJfaW5mbzogSW5mbyB0byBiZSBkZWxpdmVyZWQgd2l0aCB0aGUgZXZlbnQuCisgKiBAaGFuZGxlOiBBdHRhY2ggdGhlIGV2ZW50IHRvIHRoaXMgZmVuY2Ugb25seS4KKyAqIEBmbGFnczogQSBzZXQgb2YgZmxhZ3MgYXMgZGVmaW5lZCBhYm92ZS4KKyAqLworc3RydWN0IGRybV92bXdfZmVuY2VfZXZlbnRfYXJnIHsKKwl1aW50NjRfdCBmZW5jZV9yZXA7CisJdWludDY0X3QgdXNlcl9kYXRhOworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBmbGFnczsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfUFJFU0VOVAorICoKKyAqIEV4ZWN1dGVzIGFuIFNWR0EgcHJlc2VudCBvbiBhIGdpdmVuIGZiIGZvciBhIGdpdmVuIHN1cmZhY2UuIFRoZSBzdXJmYWNlCisgKiBpcyBwbGFjZWQgb24gdGhlIGZyYW1lYnVmZmVyLiBDbGlwcmVjdHMgYXJlIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBnaXZlbgorICogcG9pbnQgKHRoZSBwb2ludCBkaXNpZ25hdGVkIGJ5IGRlc3Rfe3h8eX0pLgorICoKKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X3ByZXNlbnRfYXJnCisgKiBAZmJfaWQ6IGZyYW1lYnVmZmVyIGlkIHRvIHByZXNlbnQgLyByZWFkIGJhY2sgZnJvbS4KKyAqIEBzaWQ6IFN1cmZhY2UgaWQgdG8gcHJlc2VudCBmcm9tLgorICogQGRlc3RfeDogWCBwbGFjZW1lbnQgY29vcmRpbmF0ZSBmb3Igc3VyZmFjZS4KKyAqIEBkZXN0X3k6IFkgcGxhY2VtZW50IGNvb3JkaW5hdGUgZm9yIHN1cmZhY2UuCisgKiBAY2xpcHNfcHRyOiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGNsaXAgcmVjdHMgY2FzdCB0byBhbiB1aW50NjRfdC4KKyAqIEBudW1fY2xpcHM6IE51bWJlciBvZiBjbGlwcmVjdHMgZ2l2ZW4gcmVsYXRpdmUgdG8gdGhlIGZyYW1lYnVmZmVyIG9yaWdpbiwKKyAqIGluIHRoZSBzYW1lIGNvb3JkaW5hdGUgc3BhY2UgYXMgdGhlIGZyYW1lIGJ1ZmZlci4KKyAqIEBwYWQ2NDogVW51c2VkIDY0LWJpdCBwYWRkaW5nLgorICoKKyAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX1BSRVNFTlQgaW9jdGwuCisgKi8KKworc3RydWN0IGRybV92bXdfcHJlc2VudF9hcmcgeworCXVpbnQzMl90IGZiX2lkOworCXVpbnQzMl90IHNpZDsKKwlpbnQzMl90IGRlc3RfeDsKKwlpbnQzMl90IGRlc3RfeTsKKwl1aW50NjRfdCBjbGlwc19wdHI7CisJdWludDMyX3QgbnVtX2NsaXBzOworCXVpbnQzMl90IHBhZDY0OworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19QUkVTRU5UX1JFQURCQUNLCisgKgorICogRXhlY3V0ZXMgYW4gU1ZHQSBwcmVzZW50IHJlYWRiYWNrIGZyb20gYSBnaXZlbiBmYiB0byB0aGUgZG1hIGJ1ZmZlcgorICogY3VycmVudGx5IGJvdW5kIGFzIHRoZSBmYi4gSWYgdGhlcmUgaXMgbm8gZG1hIGJ1ZmZlciBib3VuZCB0byB0aGUgZmIsCisgKiBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqLworCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X3ByZXNlbnRfYXJnCisgKiBAZmJfaWQ6IGZiX2lkIHRvIHByZXNlbnQgLyByZWFkIGJhY2sgZnJvbS4KKyAqIEBudW1fY2xpcHM6IE51bWJlciBvZiBjbGlwcmVjdHMuCisgKiBAY2xpcHNfcHRyOiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGNsaXAgcmVjdHMgY2FzdCB0byBhbiB1aW50NjRfdC4KKyAqIEBmZW5jZV9yZXA6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAsIGNhc3QgdG8gYW4gdWludDY0X3QuCisgKiBJZiB0aGlzIG1lbWJlciBpcyBOVUxMLCB0aGVuIHRoZSBpb2N0bCBzaG91bGQgbm90IHJldHVybiBhIGZlbmNlLgorICovCisKK3N0cnVjdCBkcm1fdm13X3ByZXNlbnRfcmVhZGJhY2tfYXJnIHsKKwkgdWludDMyX3QgZmJfaWQ7CisJIHVpbnQzMl90IG51bV9jbGlwczsKKwkgdWludDY0X3QgY2xpcHNfcHRyOworCSB1aW50NjRfdCBmZW5jZV9yZXA7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgogICogRFJNX1ZNV19VUERBVEVfTEFZT1VUIC0gVXBkYXRlIGxheW91dAogICoKICAqIFVwZGF0ZXMgdGhlIHByZWZlcnJlZCBtb2RlcyBhbmQgY29ubmVjdGlvbiBzdGF0dXMgZm9yIGNvbm5lY3RvcnMuIFRoZQotICogY29tbWFuZCBjb25pc2l0cyBvZiBvbmUgZHJtX3Ztd191cGRhdGVfbGF5b3V0X2FyZyBwb2ludGluZyBvdXQgYSBhcnJheQorICogY29tbWFuZCBjb25zaXN0cyBvZiBvbmUgZHJtX3Ztd191cGRhdGVfbGF5b3V0X2FyZyBwb2ludGluZyB0byBhbiBhcnJheQogICogb2YgbnVtX291dHB1dHMgZHJtX3Ztd19yZWN0J3MuCiAgKi8KIAogLyoqCiAgKiBzdHJ1Y3QgZHJtX3Ztd191cGRhdGVfbGF5b3V0X2FyZwogICoKLSAqIEBudW1fb3V0cHV0czogbnVtYmVyIG9mIGFjdGl2ZQotICogQHJlY3RzOiBwb2ludGVyIHRvIGFycmF5IG9mIGRybV92bXdfcmVjdAorICogQG51bV9vdXRwdXRzOiBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3RvcnMKKyAqIEByZWN0czogcG9pbnRlciB0byBhcnJheSBvZiBkcm1fdm13X3JlY3QgY2FzdCB0byBhbiB1aW50NjRfdAogICoKICAqIElucHV0IGFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX1VQREFURV9MQVlPVVQgSW9jdGwuCiAgKi8KLQogc3RydWN0IGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcgewogCXVpbnQzMl90IG51bV9vdXRwdXRzOwogCXVpbnQzMl90IHBhZDY0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9haW8uaCBiL2luY2x1ZGUvbGludXgvYWlvLmgKaW5kZXggMmRjYjcyYi4uMjMxNGFkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9haW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Fpby5oCkBAIC0xMTcsNiArMTE3LDcgQEAKIAogCXN0cnVjdCBsaXN0X2hlYWQJa2lfbGlzdDsJLyogdGhlIGFpbyBjb3JlIHVzZXMgdGhpcwogCQkJCQkJICogZm9yIGNhbmNlbGxhdGlvbiAqLworCXN0cnVjdCBsaXN0X2hlYWQJa2lfYmF0Y2g7CS8qIGJhdGNoIGFsbG9jYXRpb24gKi8KIAogCS8qCiAJICogSWYgdGhlIGFpb19yZXNmZCBmaWVsZCBvZiB0aGUgdXNlcnNwYWNlIGlvY2IgaXMgbm90IHplcm8sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtYmEvcGwwNjEuaCBiL2luY2x1ZGUvbGludXgvYW1iYS9wbDA2MS5oCmluZGV4IDVkZGQ5YWQuLjI0MTJhZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYW1iYS9wbDA2MS5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9wbDA2MS5oCkBAIC03LDggKzcsNyBAQAogCXVuc2lnbmVkCWdwaW9fYmFzZTsKIAogCS8qIG51bWJlciBvZiB0aGUgZmlyc3QgSVJRLgotCSAqIElmIHRoZSBJUlEgZnVuY3Rpb25hbGl0eSBpbiBub3QgZGVzaXJlZCB0aGlzIG11c3QgYmUgc2V0IHRvCi0JICogKHVuc2lnbmVkKSAtMS4KKwkgKiBJZiB0aGUgSVJRIGZ1bmN0aW9uYWxpdHkgaW4gbm90IGRlc2lyZWQgdGhpcyBtdXN0IGJlIHNldCB0byBOT19JUlEuCiAJICovCiAJdW5zaWduZWQJaXJxX2Jhc2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW1iYS9wbDA4eC5oIGIvaW5jbHVkZS9saW51eC9hbWJhL3BsMDh4LmgKaW5kZXggZTZlMjhmMy4uOWVhYmZmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hbWJhL3BsMDh4LmgKKysrIGIvaW5jbHVkZS9saW51eC9hbWJhL3BsMDh4LmgKQEAgLTQ3LDYgKzQ3LDkgQEAKICAqIEBtdXh2YWw6IGEgbnVtYmVyIHVzdWFsbHkgdXNlZCB0byBwb2tlIGludG8gc29tZSBtdXggcmVnaXNlciB0bwogICogbXV4IGluIHRoZSBzaWduYWwgdG8gdGhpcyBjaGFubmVsCiAgKiBAY2N0bF9vcHQ6IGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIGNoYW5uZWwgY29udHJvbCByZWdpc3RlcgorICogQGRldmljZV9mYzogRmxvdyBDb250cm9sbGVyIFNldHRpbmdzIGZvciBjY2ZnIHJlZ2lzdGVyLiBPbmx5IHZhbGlkIGZvciBzbGF2ZQorICogY2hhbm5lbHMuIEZpbGwgd2l0aCAndHJ1ZScgaWYgcGVyaXBoZXJhbCBzaG91bGQgYmUgZmxvdyBjb250cm9sbGVyLiBEaXJlY3Rpb24KKyAqIHdpbGwgYmUgc2VsZWN0ZWQgYXQgUnVudGltZS4KICAqIEBhZGRyOiBzb3VyY2UvdGFyZ2V0IGFkZHJlc3MgaW4gcGh5c2ljYWwgbWVtb3J5IGZvciB0aGlzIERNQSBjaGFubmVsLAogICogY2FuIGJlIHRoZSBhZGRyZXNzIG9mIGEgRklGTyByZWdpc3RlciBmb3IgYnVyc3QgcmVxdWVzdHMgZm9yIGV4YW1wbGUuCiAgKiBUaGlzIGNhbiBiZSBsZWZ0IHVuZGVmaW5lZCBpZiB0aGUgUHJpbWVDZWxsIEFQSSBpcyB1c2VkIGZvciBjb25maWd1cmluZwpAQCAtNjUsNiArNjgsNyBAQAogCWludCBtYXhfc2lnbmFsOwogCXUzMiBtdXh2YWw7CiAJdTMyIGNjdGw7CisJYm9vbCBkZXZpY2VfZmM7CiAJZG1hX2FkZHJfdCBhZGRyOwogCWJvb2wgY2lyY3VsYXJfYnVmZmVyOwogCWJvb2wgc2luZ2xlOwpAQCAtNzcsMTMgKzgxLDExIEBACiAgKiBAYWRkcjogY3VycmVudCBhZGRyZXNzCiAgKiBAbWF4d2lkdGg6IHRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgdHJhbnNmZXIgb24gdGhpcyBidXMKICAqIEBidXN3aWR0aDogdGhlIHdpZHRoIG9mIHRoaXMgYnVzIGluIGJ5dGVzOiAxLCAyIG9yIDQKLSAqIEBmaWxsX2J5dGVzOiBieXRlcyByZXF1aXJlZCB0byBmaWxsIHRvIHRoZSBuZXh0IGJ1cyBtZW1vcnkgYm91bmRhcnkKICAqLwogc3RydWN0IHBsMDh4X2J1c19kYXRhIHsKIAlkbWFfYWRkcl90IGFkZHI7CiAJdTggbWF4d2lkdGg7CiAJdTggYnVzd2lkdGg7Ci0Jc2l6ZV90IGZpbGxfYnl0ZXM7CiB9OwogCiAvKioKQEAgLTEwNCwxNyArMTA2LDM1IEBACiB9OwogCiAvKioKKyAqIHN0cnVjdCBwbDA4eF9zZyAtIHN0cnVjdHVyZSBjb250YWluaW5nIGRhdGEgcGVyIHNnCisgKiBAc3JjX2FkZHI6IHNyYyBhZGRyZXNzIG9mIHNnCisgKiBAZHN0X2FkZHI6IGRzdCBhZGRyZXNzIG9mIHNnCisgKiBAbGVuOiB0cmFuc2ZlciBsZW4gaW4gYnl0ZXMKKyAqIEBub2RlOiBub2RlIGZvciB0eGQncyBkc2dfbGlzdAorICovCitzdHJ1Y3QgcGwwOHhfc2cgeworCWRtYV9hZGRyX3Qgc3JjX2FkZHI7CisJZG1hX2FkZHJfdCBkc3RfYWRkcjsKKwlzaXplX3QgbGVuOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKKy8qKgogICogc3RydWN0IHBsMDh4X3R4ZCAtIHdyYXBwZXIgZm9yIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgorICogQHR4OiBhc3luYyB0eCBkZXNjcmlwdG9yCisgKiBAbm9kZTogbm9kZSBmb3IgdHhkIGxpc3QgZm9yIGNoYW5uZWxzCisgKiBAZHNnX2xpc3Q6IGxpc3Qgb2YgY2hpbGRyZW4gc2cncworICogQGRpcmVjdGlvbjogZGlyZWN0aW9uIG9mIHRyYW5zZmVyCiAgKiBAbGxpc19idXM6IERNQSBtZW1vcnkgYWRkcmVzcyAocGh5c2ljYWwpIHN0YXJ0IGZvciB0aGUgTExJcwogICogQGxsaXNfdmE6IHZpcnR1YWwgbWVtb3J5IGFkZHJlc3Mgc3RhcnQgZm9yIHRoZSBMTElzCisgKiBAY2N0bDogY29udHJvbCByZWcgdmFsdWVzIGZvciBjdXJyZW50IHR4ZAorICogQGNjZmc6IGNvbmZpZyByZWcgdmFsdWVzIGZvciBjdXJyZW50IHR4ZAogICovCiBzdHJ1Y3QgcGwwOHhfdHhkIHsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgdHg7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgZHNnX2xpc3Q7CiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24JZGlyZWN0aW9uOwotCWRtYV9hZGRyX3Qgc3JjX2FkZHI7Ci0JZG1hX2FkZHJfdCBkc3RfYWRkcjsKLQlzaXplX3QgbGVuOwogCWRtYV9hZGRyX3QgbGxpc19idXM7CiAJc3RydWN0IHBsMDh4X2xsaSAqbGxpc192YTsKIAkvKiBEZWZhdWx0IGNjdGwgdmFsdWUgZm9yIExMSXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW1iYS9wbDMzMC5oIGIvaW5jbHVkZS9saW51eC9hbWJhL3BsMzMwLmgKaW5kZXggY2JlZTdkZS4uZDEyZjA3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hbWJhL3BsMzMwLmgKKysrIGIvaW5jbHVkZS9saW51eC9hbWJhL3BsMzMwLmgKQEAgLTE5LDEyICsxOSw4IEBACiAJICogUGVyaV9SZXEgaS9mIG9mIHRoZSBETUFDIHRoYXQgaXMKIAkgKiBwZXJpcGhlcmFsIGNvdWxkIGJlIHJlYWNoZWQgZnJvbS4KIAkgKi8KLQl1OCBwZXJpX2lkOyAvKiB7MCwgMzF9ICovCisJdTggcGVyaV9pZDsgLyogc3BlY2lmaWMgZG1hIGlkICovCiAJZW51bSBwbDMzMF9yZXF0eXBlIHJxdHlwZTsKLQotCS8qIEZvciBNLT5EIGFuZCBELT5NIENoYW5uZWxzICovCi0JaW50IGJ1cnN0X3N6OyAvKiBpbiBwb3dlciBvZiAyICovCi0JZG1hX2FkZHJfdCBmaWZvX2FkZHI7CiB9OwogCiBzdHJ1Y3QgZG1hX3BsMzMwX3BsYXRkYXRhIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRtZWwtbWNpLmggYi9pbmNsdWRlL2xpbnV4L2F0bWVsLW1jaS5oCmluZGV4IDNlMDliMzQuLjRjN2E0YjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRtZWwtbWNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdG1lbC1tY2kuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19MSU5VWF9BVE1FTF9NQ0lfSAogI2RlZmluZSBfX0xJTlVYX0FUTUVMX01DSV9ICiAKLSNkZWZpbmUgQVRNRUxfTUNJX01BWF9OUl9TTE9UUwkyCisjZGVmaW5lIEFUTUNJX01BWF9OUl9TTE9UUwkyCiAKIC8qKgogICogc3RydWN0IG1jaV9zbG90X3BkYXRhIC0gYm9hcmQtc3BlY2lmaWMgcGVyLXNsb3QgY29uZmlndXJhdGlvbgpAQCAtMzMsNyArMzMsNyBAQAogICovCiBzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgewogCXN0cnVjdCBtY2lfZG1hX2RhdGEJKmRtYV9zbGF2ZTsKLQlzdHJ1Y3QgbWNpX3Nsb3RfcGRhdGEJc2xvdFtBVE1FTF9NQ0lfTUFYX05SX1NMT1RTXTsKKwlzdHJ1Y3QgbWNpX3Nsb3RfcGRhdGEJc2xvdFtBVE1DSV9NQVhfTlJfU0xPVFNdOwogfTsKIAogI2VuZGlmIC8qIF9fTElOVVhfQVRNRUxfTUNJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRtZWxfcGRjLmggYi9pbmNsdWRlL2xpbnV4L2F0bWVsX3BkYy5oCmluZGV4IDUwNThhMzEuLjYzNDk5Y2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRtZWxfcGRjLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdG1lbF9wZGMuaApAQCAtMzMsNCArMzMsNiBAQAogCiAjZGVmaW5lIEFUTUVMX1BEQ19QVFNSCQkweDEyNAkvKiBUcmFuc2ZlciBTdGF0dXMgUmVnaXN0ZXIgKi8KIAorI2RlZmluZSBBVE1FTF9QRENfU0NORF9CVUZfT0ZGCTB4MTAJLyogT2Zmc2V0IGJldHdlZW4gZmlyc3QgYW5kIHNlY29uZCBidWZmZXIgcmVnaXN0ZXJzICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdWRpdC5oIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCmluZGV4IDBjODAwNjEuLjJmODFjNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXVkaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKQEAgLTU4NCwxNCArNTg0LDEzIEBACiAjaWZkZWYgQ09ORklHX0FVRElUCiAvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBhdWRpdC5jICovCiAJCQkJLyogUHVibGljIEFQSSAqLwotZXh0ZXJuIHZvaWQJCSAgICBhdWRpdF9sb2coc3RydWN0IGF1ZGl0X2NvbnRleHQgKmN0eCwgZ2ZwX3QgZ2ZwX21hc2ssCi0JCQkJICAgICAgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCQkJCSAgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsNCw1KSkpOworZXh0ZXJuIF9fcHJpbnRmKDQsIDUpCit2b2lkIGF1ZGl0X2xvZyhzdHJ1Y3QgYXVkaXRfY29udGV4dCAqY3R4LCBnZnBfdCBnZnBfbWFzaywgaW50IHR5cGUsCisJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogZXh0ZXJuIHN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2xvZ19zdGFydChzdHJ1Y3QgYXVkaXRfY29udGV4dCAqY3R4LCBnZnBfdCBnZnBfbWFzaywgaW50IHR5cGUpOwotZXh0ZXJuIHZvaWQJCSAgICBhdWRpdF9sb2dfZm9ybWF0KHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCQkJICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMiwzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIGF1ZGl0X2xvZ19mb3JtYXQoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIGV4dGVybiB2b2lkCQkgICAgYXVkaXRfbG9nX2VuZChzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYik7CiBleHRlcm4gaW50CQkgICAgYXVkaXRfc3RyaW5nX2NvbnRhaW5zX2NvbnRyb2woY29uc3QgY2hhciAqc3RyaW5nLAogCQkJCQkJCSAgc2l6ZV90IGxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmggYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKaW5kZXggM2IyZjljYi4uYjEwMzhiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaApAQCAtNDAsNiArNDAsNyBAQAogZW51bSBiZGlfc3RhdF9pdGVtIHsKIAlCRElfUkVDTEFJTUFCTEUsCiAJQkRJX1dSSVRFQkFDSywKKwlCRElfRElSVElFRCwKIAlCRElfV1JJVFRFTiwKIAlOUl9CRElfU1RBVF9JVEVNUwogfTsKQEAgLTc0LDEwICs3NSwyMCBAQAogCXN0cnVjdCBwZXJjcHVfY291bnRlciBiZGlfc3RhdFtOUl9CRElfU1RBVF9JVEVNU107CiAKIAl1bnNpZ25lZCBsb25nIGJ3X3RpbWVfc3RhbXA7CS8qIGxhc3QgdGltZSB3cml0ZSBidyBpcyB1cGRhdGVkICovCisJdW5zaWduZWQgbG9uZyBkaXJ0aWVkX3N0YW1wOwogCXVuc2lnbmVkIGxvbmcgd3JpdHRlbl9zdGFtcDsJLyogcGFnZXMgd3JpdHRlbiBhdCBid190aW1lX3N0YW1wICovCiAJdW5zaWduZWQgbG9uZyB3cml0ZV9iYW5kd2lkdGg7CS8qIHRoZSBlc3RpbWF0ZWQgd3JpdGUgYmFuZHdpZHRoICovCiAJdW5zaWduZWQgbG9uZyBhdmdfd3JpdGVfYmFuZHdpZHRoOyAvKiBmdXJ0aGVyIHNtb290aGVkIHdyaXRlIGJ3ICovCiAKKwkvKgorCSAqIFRoZSBiYXNlIGRpcnR5IHRocm90dGxlIHJhdGUsIHJlLWNhbGN1bGF0ZWQgb24gZXZlcnkgMjAwbXMuCisJICogQWxsIHRoZSBiZGkgdGFza3MnIGRpcnR5IHJhdGUgd2lsbCBiZSBjdXJiZWQgdW5kZXIgaXQuCisJICogQGRpcnR5X3JhdGVsaW1pdCB0cmFja3MgdGhlIGVzdGltYXRlZCBAYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0CisJICogaW4gc21hbGwgc3RlcHMgYW5kIGlzIG11Y2ggbW9yZSBzbW9vdGgvc3RhYmxlIHRoYW4gdGhlIGxhdHRlci4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGRpcnR5X3JhdGVsaW1pdDsKKwl1bnNpZ25lZCBsb25nIGJhbGFuY2VkX2RpcnR5X3JhdGVsaW1pdDsKKwogCXN0cnVjdCBwcm9wX2xvY2FsX3BlcmNwdSBjb21wbGV0aW9uczsKIAlpbnQgZGlydHlfZXhjZWVkZWQ7CiAKQEAgLTEwNyw3ICsxMTgsOCBAQAogaW50IGJkaV9yZWdpc3Rlcl9kZXYoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwgZGV2X3QgZGV2KTsKIHZvaWQgYmRpX3VucmVnaXN0ZXIoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSk7CiBpbnQgYmRpX3NldHVwX2FuZF9yZWdpc3RlcihzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqLCBjaGFyICosIHVuc2lnbmVkIGludCk7Ci12b2lkIGJkaV9zdGFydF93cml0ZWJhY2soc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwgbG9uZyBucl9wYWdlcyk7Cit2b2lkIGJkaV9zdGFydF93cml0ZWJhY2soc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwgbG9uZyBucl9wYWdlcywKKwkJCWVudW0gd2JfcmVhc29uIHJlYXNvbik7CiB2b2lkIGJkaV9zdGFydF9iYWNrZ3JvdW5kX3dyaXRlYmFjayhzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKIGludCBiZGlfd3JpdGViYWNrX3RocmVhZCh2b2lkICpkYXRhKTsKIGludCBiZGlfaGFzX2RpcnR5X2lvKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaCBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmgKaW5kZXggNWRiZDcwNS4uNGQ0YjU5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYS5oCkBAIC0xNzAsMTAgKzE3MCw5IEBACiB9OwogZXh0ZXJuCiBpbnQgX19iY21hX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgYmNtYV9kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIpOwotc3RhdGljIGlubGluZSBpbnQgYmNtYV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGJjbWFfZHJpdmVyICpkcnYpCi17Ci0JcmV0dXJuIF9fYmNtYV9kcml2ZXJfcmVnaXN0ZXIoZHJ2LCBUSElTX01PRFVMRSk7Ci19CisjZGVmaW5lIGJjbWFfZHJpdmVyX3JlZ2lzdGVyKGRydikgXAorCV9fYmNtYV9kcml2ZXJfcmVnaXN0ZXIoZHJ2LCBUSElTX01PRFVMRSkKKwogZXh0ZXJuIHZvaWQgYmNtYV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgYmNtYV9kcml2ZXIgKmRydik7CiAKIHN0cnVjdCBiY21hX2J1cyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jpby5oIGIvaW5jbHVkZS9saW51eC9iaW8uaAppbmRleCBjZTMzZTY4Li5hM2MwNzFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jpby5oCisrKyBiL2luY2x1ZGUvbGludXgvYmlvLmgKQEAgLTI2OSwxNCArMjY5LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgYnZlY19ucl92ZWNzKHVuc2lnbmVkIHNob3J0IGlkeCk7CiAKIC8qCi0gKiBBbGxvdyBxdWV1ZXIgdG8gc3BlY2lmeSBhIGNvbXBsZXRpb24gQ1BVIGZvciB0aGlzIGJpbwotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYmlvX3NldF9jb21wbGV0aW9uX2NwdShzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBjcHUpCi17Ci0JYmlvLT5iaV9jb21wX2NwdSA9IGNwdTsKLX0KLQotLyoKICAqIGJpb19zZXQgaXMgdXNlZCB0byBhbGxvdyBvdGhlciBwb3J0aW9ucyBvZiB0aGUgSU8gc3lzdGVtIHRvCiAgKiBhbGxvY2F0ZSB0aGVpciBvd24gcHJpdmF0ZSBtZW1vcnkgcG9vbHMgZm9yIGJpbyBhbmQgaW92ZWMgc3RydWN0dXJlcy4KICAqIFRoZXNlIG1lbW9yeSBwb29scyBpbiB0dXJuIGFsbCBhbGxvY2F0ZSBmcm9tIHRoZSBiaW9fc2xhYgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKaW5kZXggNzFmYzUzYi4uNDA1M2NiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oCkBAIC01OSw4ICs1OSw2IEBACiAKIAl1bnNpZ25lZCBpbnQJCWJpX21heF92ZWNzOwkvKiBtYXggYnZsX3ZlY3Mgd2UgY2FuIGhvbGQgKi8KIAotCXVuc2lnbmVkIGludAkJYmlfY29tcF9jcHU7CS8qIGNvbXBsZXRpb24gQ1BVICovCi0KIAlhdG9taWNfdAkJYmlfY250OwkJLyogcGluIGNvdW50ICovCiAKIAlzdHJ1Y3QgYmlvX3ZlYwkJKmJpX2lvX3ZlYzsJLyogdGhlIGFjdHVhbCB2ZWMgbGlzdCAqLwpAQCAtOTMsMTEgKzkxLDEwIEBACiAjZGVmaW5lIEJJT19CT1VOQ0VECTUJLyogYmlvIGlzIGEgYm91bmNlIGJpbyAqLwogI2RlZmluZSBCSU9fVVNFUl9NQVBQRUQgNgkvKiBjb250YWlucyB1c2VyIHBhZ2VzICovCiAjZGVmaW5lIEJJT19FT1BOT1RTVVBQCTcJLyogbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBCSU9fQ1BVX0FGRklORQk4CS8qIGNvbXBsZXRlIGJpbyBvbiBzYW1lIENQVSBhcyBzdWJtaXR0ZWQgKi8KLSNkZWZpbmUgQklPX05VTExfTUFQUEVEIDkJLyogY29udGFpbnMgaW52YWxpZCB1c2VyIHBhZ2VzICovCi0jZGVmaW5lIEJJT19GU19JTlRFR1JJVFkgMTAJLyogZnMgb3ducyBpbnRlZ3JpdHkgZGF0YSwgbm90IGJsb2NrIGxheWVyICovCi0jZGVmaW5lIEJJT19RVUlFVAkxMQkvKiBNYWtlIEJJTyBRdWlldCAqLwotI2RlZmluZSBCSU9fTUFQUEVEX0lOVEVHUklUWSAxMi8qIGludGVncml0eSBtZXRhZGF0YSBoYXMgYmVlbiByZW1hcHBlZCAqLworI2RlZmluZSBCSU9fTlVMTF9NQVBQRUQgOAkvKiBjb250YWlucyBpbnZhbGlkIHVzZXIgcGFnZXMgKi8KKyNkZWZpbmUgQklPX0ZTX0lOVEVHUklUWSA5CS8qIGZzIG93bnMgaW50ZWdyaXR5IGRhdGEsIG5vdCBibG9jayBsYXllciAqLworI2RlZmluZSBCSU9fUVVJRVQJMTAJLyogTWFrZSBCSU8gUXVpZXQgKi8KKyNkZWZpbmUgQklPX01BUFBFRF9JTlRFR1JJVFkgMTEvKiBpbnRlZ3JpdHkgbWV0YWRhdGEgaGFzIGJlZW4gcmVtYXBwZWQgKi8KICNkZWZpbmUgYmlvX2ZsYWdnZWQoYmlvLCBmbGFnKQkoKGJpbyktPmJpX2ZsYWdzICYgKDEgPDwgKGZsYWcpKSkKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IDdmYmFhOTEuLmM3YTZkM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvYnNnLmg+CkBAIC0yMiw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KIAorc3RydWN0IG1vZHVsZTsKIHN0cnVjdCBzY3NpX2lvY3RsX2NvbW1hbmQ7CiAKIHN0cnVjdCByZXF1ZXN0X3F1ZXVlOwpAQCAtMTk1LDcgKzE5NSw3IEBACiAjaW5jbHVkZSA8bGludXgvZWxldmF0b3IuaD4KIAogdHlwZWRlZiB2b2lkIChyZXF1ZXN0X2ZuX3Byb2MpIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7Ci10eXBlZGVmIGludCAobWFrZV9yZXF1ZXN0X2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7Cit0eXBlZGVmIHZvaWQgKG1ha2VfcmVxdWVzdF9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOwogdHlwZWRlZiBpbnQgKHByZXBfcnFfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIHR5cGVkZWYgdm9pZCAodW5wcmVwX3JxX2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAKQEAgLTY4MCw2ICs2ODAsOCBAQAogZXh0ZXJuIGludCBzZ19zY3NpX2lvY3RsKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBnZW5kaXNrICosIGZtb2RlX3QsCiAJCQkgc3RydWN0IHNjc2lfaW9jdGxfY29tbWFuZCBfX3VzZXIgKik7CiAKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7CisKIC8qCiAgKiBBIHF1ZXVlIGhhcyBqdXN0IGV4aXR0ZWQgY29uZ2VzdGlvbi4gIE5vdGUgdGhpcyBpbiB0aGUgZ2xvYmFsIGNvdW50ZXIgb2YKICAqIGNvbmdlc3RlZCBxdWV1ZXMsIGFuZCB3YWtlIHVwIGFueW9uZSB3aG8gd2FzIHdhaXRpbmcgZm9yIHJlcXVlc3RzIHRvIGJlCkBAIC04NjMsMTYgKzg2NSwyMiBAQAogZXh0ZXJuIHZvaWQgYmxrX3B1dF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIAogLyoKLSAqIE5vdGU6IENvZGUgaW4gYmV0d2VlbiBjaGFuZ2luZyB0aGUgYmxrX3BsdWcgbGlzdC9jYl9saXN0IG9yIGVsZW1lbnQgb2Ygc3VjaAotICogbGlzdHMgaXMgcHJlZW1wdGFibGUsIGJ1dCBzdWNoIGNvZGUgY2FuJ3QgZG8gc2xlZXAgKG9yIGJlIHZlcnkgY2FyZWZ1bCksCi0gKiBvdGhlcndpc2UgZGF0YSBpcyBjb3JydXB0ZWQuIEZvciBkZXRhaWxzLCBwbGVhc2UgY2hlY2sgc2NoZWR1bGUoKSB3aGVyZQotICogYmxrX3NjaGVkdWxlX2ZsdXNoX3BsdWcoKSBpcyBjYWxsZWQuCisgKiBibGtfcGx1ZyBwZXJtaXRzIGJ1aWxkaW5nIGEgcXVldWUgb2YgcmVsYXRlZCByZXF1ZXN0cyBieSBob2xkaW5nIHRoZSBJL08KKyAqIGZyYWdtZW50cyBmb3IgYSBzaG9ydCBwZXJpb2QuIFRoaXMgYWxsb3dzIG1lcmdpbmcgb2Ygc2VxdWVudGlhbCByZXF1ZXN0cworICogaW50byBzaW5nbGUgbGFyZ2VyIHJlcXVlc3QuIEFzIHRoZSByZXF1ZXN0cyBhcmUgbW92ZWQgZnJvbSBhIHBlci10YXNrIGxpc3QgdG8KKyAqIHRoZSBkZXZpY2UncyByZXF1ZXN0X3F1ZXVlIGluIGEgYmF0Y2gsIHRoaXMgcmVzdWx0cyBpbiBpbXByb3ZlZCBzY2FsYWJpbGl0eQorICogYXMgdGhlIGxvY2sgY29udGVudGlvbiBmb3IgcmVxdWVzdF9xdWV1ZSBsb2NrIGlzIHJlZHVjZWQuCisgKgorICogSXQgaXMgb2sgbm90IHRvIGRpc2FibGUgcHJlZW1wdGlvbiB3aGVuIGFkZGluZyB0aGUgcmVxdWVzdCB0byB0aGUgcGx1ZyBsaXN0CisgKiBvciB3aGVuIGF0dGVtcHRpbmcgYSBtZXJnZSwgYmVjYXVzZSBibGtfc2NoZWR1bGVfZmx1c2hfbGlzdCgpIHdpbGwgb25seSBmbHVzaAorICogdGhlIHBsdWcgbGlzdCB3aGVuIHRoZSB0YXNrIHNsZWVwcyBieSBpdHNlbGYuIEZvciBkZXRhaWxzLCBwbGVhc2Ugc2VlCisgKiBzY2hlZHVsZSgpIHdoZXJlIGJsa19zY2hlZHVsZV9mbHVzaF9wbHVnKCkgaXMgY2FsbGVkLgogICovCiBzdHJ1Y3QgYmxrX3BsdWcgewotCXVuc2lnbmVkIGxvbmcgbWFnaWM7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgY2JfbGlzdDsKLQl1bnNpZ25lZCBpbnQgc2hvdWxkX3NvcnQ7CisJdW5zaWduZWQgbG9uZyBtYWdpYzsgLyogZGV0ZWN0IHVuaW5pdGlhbGl6ZWQgdXNlLWNhc2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiByZXF1ZXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgY2JfbGlzdDsgLyogbWQgcmVxdWlyZXMgYW4gdW5wbHVnIGNhbGxiYWNrICovCisJdW5zaWduZWQgaW50IHNob3VsZF9zb3J0OyAvKiBsaXN0IHRvIGJlIHNvcnRlZCBiZWZvcmUgZmx1c2hpbmc/ICovCiB9OwogI2RlZmluZSBCTEtfTUFYX1JFUVVFU1RfQ09VTlQgMTYKIApAQCAtMTE4OSwyMCArMTE5Nyw2IEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcKLWV4dGVybiBpbnQgYmxrX3Rocm90bF9pbml0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKLWV4dGVybiB2b2lkIGJsa190aHJvdGxfZXhpdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7Ci1leHRlcm4gaW50IGJsa190aHJvdGxfYmlvKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICoqYmlvKTsKLSNlbHNlIC8qIENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGJsa190aHJvdGxfYmlvKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICoqYmlvKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBibGtfdGhyb3RsX2luaXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGJsa190aHJvdGxfZXhpdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkgeyByZXR1cm4gMDsgfQotI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcgKi8KLQogI2RlZmluZSBNT0RVTEVfQUxJQVNfQkxPQ0tERVYobWFqb3IsbWlub3IpIFwKIAlNT0RVTEVfQUxJQVMoImJsb2NrLW1ham9yLSIgX19zdHJpbmdpZnkobWFqb3IpICItIiBfX3N0cmluZ2lmeShtaW5vcikpCiAjZGVmaW5lIE1PRFVMRV9BTElBU19CTE9DS0RFVl9NQUpPUihtYWpvcikgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaCBiL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKaW5kZXggOGU5ZTRiYy4uNGQxYTA3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCkBAIC0xNzAsNyArMTcwLDcgQEAKIGV4dGVybiBpbnQgZG9fYmxrX3RyYWNlX3NldHVwKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpuYW1lLAogCQkJICAgICAgZGV2X3QgZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQkJICAgICAgc3RydWN0IGJsa191c2VyX3RyYWNlX3NldHVwICpidXRzKTsKLWV4dGVybiBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpCitleHRlcm4gX19wcmludGYoMiwgMykKIHZvaWQgX190cmFjZV9ub3RlX21lc3NhZ2Uoc3RydWN0IGJsa190cmFjZSAqLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibWExNTAuaCBiL2luY2x1ZGUvbGludXgvYm1hMTUwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxMWZkYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYm1hMTUwLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBCb3NjaCBTZW5zb3J0ZWMgR21iSAorICogQ29weXJpZ2h0IChjKSAyMDExIFVuaXhwaGVyZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX0JNQTE1MF9IXworI2RlZmluZSBfQk1BMTUwX0hfCisKKyNkZWZpbmUgQk1BMTUwX0RSSVZFUgkJImJtYTE1MCIKKworc3RydWN0IGJtYTE1MF9jZmcgeworCWJvb2wgYW55X21vdGlvbl9pbnQ7CQkvKiBTZXQgdG8gZW5hYmxlIGFueS1tb3Rpb24gaW50ZXJydXB0ICovCisJYm9vbCBoZ19pbnQ7CQkJLyogU2V0IHRvIGVuYWJsZSBoaWdoLUcgaW50ZXJydXB0ICovCisJYm9vbCBsZ19pbnQ7CQkJLyogU2V0IHRvIGVuYWJsZSBsb3ctRyBpbnRlcnJ1cHQgKi8KKwl1bnNpZ25lZCBjaGFyIGFueV9tb3Rpb25fZHVyOwkvKiBBbnktbW90aW9uIGR1cmF0aW9uICovCisJdW5zaWduZWQgY2hhciBhbnlfbW90aW9uX3RocmVzOwkvKiBBbnktbW90aW9uIHRocmVzaG9sZCAqLworCXVuc2lnbmVkIGNoYXIgaGdfaHlzdDsJCS8qIEhpZ2gtRyBoeXN0ZXJpc2lzICovCisJdW5zaWduZWQgY2hhciBoZ19kdXI7CQkvKiBIaWdoLUcgZHVyYXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGhnX3RocmVzOwkJLyogSGlnaC1HIHRocmVzaG9sZCAqLworCXVuc2lnbmVkIGNoYXIgbGdfaHlzdDsJCS8qIExvdy1HIGh5c3RlcmlzaXMgKi8KKwl1bnNpZ25lZCBjaGFyIGxnX2R1cjsJCS8qIExvdy1HIGR1cmF0aW9uICovCisJdW5zaWduZWQgY2hhciBsZ190aHJlczsJCS8qIExvdy1HIHRocmVzaG9sZCAqLworCXVuc2lnbmVkIGNoYXIgcmFuZ2U7CQkvKiBCTUEwMTUwX1JBTkdFX3h4eCAoaW4gRykgKi8KKwl1bnNpZ25lZCBjaGFyIGJhbmR3aWR0aDsJLyogQk1BMDE1MF9CV194eHggKGluIEh6KSAqLworfTsKKworc3RydWN0IGJtYTE1MF9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgYm1hMTUwX2NmZyBjZmc7CisJaW50ICgqaXJxX2dwaW9fY2ZnKSh2b2lkKTsKK307CisKKyNlbmRpZiAvKiBfQk1BMTUwX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NlcGgvbGliY2VwaC5oIGIvaW5jbHVkZS9saW51eC9jZXBoL2xpYmNlcGguaAppbmRleCA1NjM3NTUxLi45NWJkODUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NlcGgvbGliY2VwaC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2VwaC9saWJjZXBoLmgKQEAgLTIxNSw3ICsyMTUsOSBAQAogZXh0ZXJuIGludCBjZXBoX2NvbXBhcmVfb3B0aW9ucyhzdHJ1Y3QgY2VwaF9vcHRpb25zICpuZXdfb3B0LAogCQkJCXN0cnVjdCBjZXBoX2NsaWVudCAqY2xpZW50KTsKIGV4dGVybiBzdHJ1Y3QgY2VwaF9jbGllbnQgKmNlcGhfY3JlYXRlX2NsaWVudChzdHJ1Y3QgY2VwaF9vcHRpb25zICpvcHQsCi0JCQkJCSAgICAgIHZvaWQgKnByaXZhdGUpOworCQkJCQkgICAgICB2b2lkICpwcml2YXRlLAorCQkJCQkgICAgICB1bnNpZ25lZCBzdXBwb3J0ZWRfZmVhdHVyZXMsCisJCQkJCSAgICAgIHVuc2lnbmVkIHJlcXVpcmVkX2ZlYXR1cmVzKTsKIGV4dGVybiB1NjQgY2VwaF9jbGllbnRfaWQoc3RydWN0IGNlcGhfY2xpZW50ICpjbGllbnQpOwogZXh0ZXJuIHZvaWQgY2VwaF9kZXN0cm95X2NsaWVudChzdHJ1Y3QgY2VwaF9jbGllbnQgKmNsaWVudCk7CiBleHRlcm4gaW50IF9fY2VwaF9vcGVuX3Nlc3Npb24oc3RydWN0IGNlcGhfY2xpZW50ICpjbGllbnQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NlcGgvbWVzc2VuZ2VyLmggYi9pbmNsdWRlL2xpbnV4L2NlcGgvbWVzc2VuZ2VyLmgKaW5kZXggY2E3NjhhZS4uZmZiZWIyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZXBoL21lc3Nlbmdlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY2VwaC9tZXNzZW5nZXIuaApAQCAtMjM3LDcgKzIzNyw4IEBACiBleHRlcm4gc3RydWN0IGNlcGhfY29ubmVjdGlvbiAqY2VwaF9jb25fZ2V0KHN0cnVjdCBjZXBoX2Nvbm5lY3Rpb24gKmNvbik7CiBleHRlcm4gdm9pZCBjZXBoX2Nvbl9wdXQoc3RydWN0IGNlcGhfY29ubmVjdGlvbiAqY29uKTsKIAotZXh0ZXJuIHN0cnVjdCBjZXBoX21zZyAqY2VwaF9tc2dfbmV3KGludCB0eXBlLCBpbnQgZnJvbnRfbGVuLCBnZnBfdCBmbGFncyk7CitleHRlcm4gc3RydWN0IGNlcGhfbXNnICpjZXBoX21zZ19uZXcoaW50IHR5cGUsIGludCBmcm9udF9sZW4sIGdmcF90IGZsYWdzLAorCQkJCSAgICAgYm9vbCBjYW5fZmFpbCk7CiBleHRlcm4gdm9pZCBjZXBoX21zZ19rZnJlZShzdHJ1Y3QgY2VwaF9tc2cgKm0pOwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmggYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCmluZGV4IGRhN2U0YmMuLjFiN2Y5ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaApAQCAtNTE2LDcgKzUxNiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBzaWJsaW5nOwogCS8qIHVzZWQgd2hlbiB1c2VfaWQgPT0gdHJ1ZSAqLwogCXN0cnVjdCBpZHIgaWRyOwotCXNwaW5sb2NrX3QgaWRfbG9jazsKKwlyd2xvY2tfdCBpZF9sb2NrOwogCiAJLyogc2hvdWxkIGJlIGRlZmluZWQgb25seSBieSBtb2R1bGFyIHN1YnN5c3RlbXMgKi8KIAlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsay5oIGIvaW5jbHVkZS9saW51eC9jbGsuaAppbmRleCAxZDM3ZjQyLi43MjEzYjUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsay5oCisrKyBiL2luY2x1ZGUvbGludXgvY2xrLmgKQEAgLTExLDYgKzExLDggQEAKICNpZm5kZWYgX19MSU5VWF9DTEtfSAogI2RlZmluZSBfX0xJTlVYX0NMS19ICiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKwogc3RydWN0IGRldmljZTsKIAogLyoKQEAgLTQxLDExICs0MywzMSBAQAogc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKTsKIAogLyoqCisgKiBjbGtfcHJlcGFyZSAtIHByZXBhcmUgYSBjbG9jayBzb3VyY2UKKyAqIEBjbGs6IGNsb2NrIHNvdXJjZQorICoKKyAqIFRoaXMgcHJlcGFyZXMgdGhlIGNsb2NrIHNvdXJjZSBmb3IgdXNlLgorICoKKyAqIE11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhdG9taWMgY29udGV4dC4KKyAqLworI2lmZGVmIENPTkZJR19IQVZFX0NMS19QUkVQQVJFCitpbnQgY2xrX3ByZXBhcmUoc3RydWN0IGNsayAqY2xrKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjbGtfcHJlcGFyZShzdHJ1Y3QgY2xrICpjbGspCit7CisJbWlnaHRfc2xlZXAoKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKioKICAqIGNsa19lbmFibGUgLSBpbmZvcm0gdGhlIHN5c3RlbSB3aGVuIHRoZSBjbG9jayBzb3VyY2Ugc2hvdWxkIGJlIHJ1bm5pbmcuCiAgKiBAY2xrOiBjbG9jayBzb3VyY2UKICAqCiAgKiBJZiB0aGUgY2xvY2sgY2FuIG5vdCBiZSBlbmFibGVkL2Rpc2FibGVkLCB0aGlzIHNob3VsZCByZXR1cm4gc3VjY2Vzcy4KICAqCisgKiBNYXkgYmUgY2FsbGVkIGZyb20gYXRvbWljIGNvbnRleHRzLgorICoKICAqIFJldHVybnMgc3VjY2VzcyAoMCkgb3IgbmVnYXRpdmUgZXJybm8uCiAgKi8KIGludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsayk7CkBAIC01Nyw2ICs3OSw4IEBACiAgKiBJbmZvcm0gdGhlIHN5c3RlbSB0aGF0IGEgY2xvY2sgc291cmNlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBieQogICogYSBkcml2ZXIgYW5kIG1heSBiZSBzaHV0IGRvd24uCiAgKgorICogTWF5IGJlIGNhbGxlZCBmcm9tIGF0b21pYyBjb250ZXh0cy4KKyAqCiAgKiBJbXBsZW1lbnRhdGlvbiBkZXRhaWw6IGlmIHRoZSBjbG9jayBzb3VyY2UgaXMgc2hhcmVkIGJldHdlZW4KICAqIG11bHRpcGxlIGRyaXZlcnMsIGNsa19lbmFibGUoKSBjYWxscyBtdXN0IGJlIGJhbGFuY2VkIGJ5IHRoZQogICogc2FtZSBudW1iZXIgb2YgY2xrX2Rpc2FibGUoKSBjYWxscyBmb3IgdGhlIGNsb2NrIHNvdXJjZSB0byBiZQpAQCAtNjQsNiArODgsMjUgQEAKICAqLwogdm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspOwogCisKKy8qKgorICogY2xrX3VucHJlcGFyZSAtIHVuZG8gcHJlcGFyYXRpb24gb2YgYSBjbG9jayBzb3VyY2UKKyAqIEBjbGs6IGNsb2NrIHNvdXJjZQorICoKKyAqIFRoaXMgdW5kb2VzIGEgcHJldmlvdXNseSBwcmVwYXJlZCBjbG9jay4gIFRoZSBjYWxsZXIgbXVzdCBiYWxhbmNlCisgKiB0aGUgbnVtYmVyIG9mIHByZXBhcmUgYW5kIHVucHJlcGFyZSBjYWxscy4KKyAqCisgKiBNdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYXRvbWljIGNvbnRleHQuCisgKi8KKyNpZmRlZiBDT05GSUdfSEFWRV9DTEtfUFJFUEFSRQordm9pZCBjbGtfdW5wcmVwYXJlKHN0cnVjdCBjbGsgKmNsayk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNsa191bnByZXBhcmUoc3RydWN0IGNsayAqY2xrKQoreworCW1pZ2h0X3NsZWVwKCk7Cit9CisjZW5kaWYKKwogLyoqCiAgKiBjbGtfZ2V0X3JhdGUgLSBvYnRhaW4gdGhlIGN1cnJlbnQgY2xvY2sgcmF0ZSAoaW4gSHopIGZvciBhIGNsb2NrIHNvdXJjZS4KICAqCQkgIFRoaXMgaXMgb25seSB2YWxpZCBvbmNlIHRoZSBjbG9jayBzb3VyY2UgaGFzIGJlZW4gZW5hYmxlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2xrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Nsa2Rldi5oCmluZGV4IDQ1N2JjYjAuLmQ5YTRmZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2xrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9jbGtkZXYuaApAQCAtMjQsNiArMjQsMTMgQEAKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogfTsKIAorI2RlZmluZSBDTEtERVZfSU5JVChkLCBuLCBjKQlcCisJewkJCVwKKwkJLmRldl9pZCA9IGQsCVwKKwkJLmNvbl9pZCA9IG4sCVwKKwkJLmNsayA9IGMsCVwKKwl9CisKIHN0cnVjdCBjbGtfbG9va3VwICpjbGtkZXZfYWxsb2Moc3RydWN0IGNsayAqY2xrLCBjb25zdCBjaGFyICpjb25faWQsCiAJY29uc3QgY2hhciAqZGV2X2ZtdCwgLi4uKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbGtzcmMtZGJ4NTAwLXByY211LmggYi9pbmNsdWRlL2xpbnV4L2Nsa3NyYy1kYng1MDAtcHJjbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmI4MTE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jbGtzcmMtZGJ4NTAwLXByY211LmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gU0EgMjAxMQorICoKKyAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCisgKiBBdXRob3I6IE1hdHRpYXMgV2FsbGluIDxtYXR0aWFzLndhbGxpbkBzdGVyaWNzc29uLmNvbT4KKyAqCisgKi8KKyNpZm5kZWYgX19DTEtTUkNfREJYNTAwX1BSQ01VX0gKKyNkZWZpbmUgX19DTEtTUkNfREJYNTAwX1BSQ01VX0gKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaWZkZWYgQ09ORklHX0NMS1NSQ19EQlg1MDBfUFJDTVUKK3ZvaWQgX19pbml0IGNsa3NyY19kYng1MDBfcHJjbXVfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgY2xrc3JjX2RieDUwMF9wcmNtdV9pbml0KHZvaWQgX19pb21lbSAqYmFzZSkge30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGFjdGlvbi5oIGIvaW5jbHVkZS9saW51eC9jb21wYWN0aW9uLmgKaW5kZXggY2M5ZjdhNC4uYmIyYmJkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYWN0aW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYWN0aW9uLmgKQEAgLTI0LDggKzI0LDYgQEAKIAkJCWludCBvcmRlciwgZ2ZwX3QgZ2ZwX21hc2ssIG5vZGVtYXNrX3QgKm1hc2ssCiAJCQlib29sIHN5bmMpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29tcGFjdGlvbl9zdWl0YWJsZShzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG9yZGVyKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGNvbXBhY3Rfem9uZV9vcmRlcihzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG9yZGVyLAotCQkJCQlnZnBfdCBnZnBfbWFzaywgYm9vbCBzeW5jKTsKIAogLyogRG8gbm90IHNraXAgY29tcGFjdGlvbiBtb3JlIHRoYW4gNjQgdGltZXMgKi8KICNkZWZpbmUgQ09NUEFDVF9NQVhfREVGRVJfU0hJRlQgNgpAQCAtNjksMTIgKzY3LDYgQEAKIAlyZXR1cm4gQ09NUEFDVF9TS0lQUEVEOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29tcGFjdF96b25lX29yZGVyKHN0cnVjdCB6b25lICp6b25lLCBpbnQgb3JkZXIsCi0JCQkJCSAgICAgICBnZnBfdCBnZnBfbWFzaywgYm9vbCBzeW5jKQotewotCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZGVmZXJfY29tcGFjdGlvbihzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGF0LmggYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCmluZGV4IGM2ZTc1MjMuLjE1NGJmNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaApAQCAtNTQ3LDcgKzU0Nyw4IEBACiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp1dmVjdG9yLAogCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCiAJCXVuc2lnbmVkIGxvbmcgZmFzdF9zZWdzLCBzdHJ1Y3QgaW92ZWMgKmZhc3RfcG9pbnRlciwKLQkJc3RydWN0IGlvdmVjICoqcmV0X3BvaW50ZXIpOworCQlzdHJ1Y3QgaW92ZWMgKipyZXRfcG9pbnRlciwKKwkJaW50IGNoZWNrX2FjY2Vzcyk7CiAKIGV4dGVybiB2b2lkIF9fdXNlciAqY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UodW5zaWduZWQgbG9uZyBsZW4pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCBiMWE2MzVhLi42Y2I2MGZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1LmgKQEAgLTE5NiwxMyArMTk2LDkgQEAKICNlbmRpZgkJLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVBfU01QCi1leHRlcm4gaW50IHN1c3BlbmRfY3B1X2hvdHBsdWc7Ci0KIGV4dGVybiBpbnQgZGlzYWJsZV9ub25ib290X2NwdXModm9pZCk7CiBleHRlcm4gdm9pZCBlbmFibGVfbm9uYm9vdF9jcHVzKHZvaWQpOwogI2Vsc2UgLyogIUNPTkZJR19QTV9TTEVFUF9TTVAgKi8KLSNkZWZpbmUgc3VzcGVuZF9jcHVfaG90cGx1ZwkwCi0KIHN0YXRpYyBpbmxpbmUgaW50IGRpc2FibGVfbm9uYm9vdF9jcHVzKHZvaWQpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfbm9uYm9vdF9jcHVzKHZvaWQpIHt9CiAjZW5kaWYgLyogIUNPTkZJR19QTV9TTEVFUF9TTVAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1X3BtLmggYi9pbmNsdWRlL2xpbnV4L2NwdV9wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NWIyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdV9wbS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgorICoKKyAqIEF1dGhvcjoKKyAqCUNvbGluIENyb3NzIDxjY3Jvc3NAYW5kcm9pZC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfQ1BVX1BNX0gKKyNkZWZpbmUgX0xJTlVYX0NQVV9QTV9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCisvKgorICogV2hlbiBhIENQVSBnb2VzIHRvIGEgbG93IHBvd2VyIHN0YXRlIHRoYXQgdHVybnMgb2ZmIHBvd2VyIHRvIHRoZSBDUFUncworICogcG93ZXIgZG9tYWluLCB0aGUgY29udGVudHMgb2Ygc29tZSBibG9ja3MgKGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29ycywKKyAqIGludGVycnVwdCBjb250cm9sbGVycywgY2FjaGVzLCB0aW1lcnMpIGluIHRoZSBzYW1lIHBvd2VyIGRvbWFpbiBjYW4KKyAqIGJlIGxvc3QuICBUaGUgY3BtX3BtIG5vdGlmaWVycyBwcm92aWRlIGEgbWV0aG9kIGZvciBwbGF0Zm9ybSBpZGxlLCBzdXNwZW5kLAorICogYW5kIGhvdHBsdWcgaW1wbGVtZW50YXRpb25zIHRvIG5vdGlmeSB0aGUgZHJpdmVycyBmb3IgdGhlc2UgYmxvY2tzIHRoYXQKKyAqIHRoZXkgbWF5IGJlIHJlc2V0LgorICoKKyAqIEFsbCBjcHVfcG0gbm90aWZpY2F0aW9ucyBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKgorICogVGhlIG5vdGlmaWNhdGlvbnMgYXJlIHNwbGl0IGludG8gdHdvIGNsYXNzZXM6IENQVSBub3RpZmljYXRpb25zIGFuZCBDUFUKKyAqIGNsdXN0ZXIgbm90aWZpY2F0aW9ucy4KKyAqCisgKiBDUFUgbm90aWZpY2F0aW9ucyBhcHBseSB0byBhIHNpbmdsZSBDUFUgYW5kIG11c3QgYmUgY2FsbGVkIG9uIHRoZSBhZmZlY3RlZAorICogQ1BVLiAgVGhleSBhcmUgdXNlZCB0byBzYXZlIHBlci1jcHUgY29udGV4dCBmb3IgYWZmZWN0ZWQgYmxvY2tzLgorICoKKyAqIENQVSBjbHVzdGVyIG5vdGlmaWNhdGlvbnMgYXBwbHkgdG8gYWxsIENQVXMgaW4gYSBzaW5nbGUgcG93ZXIgZG9tYWluLiBUaGV5CisgKiBhcmUgdXNlZCB0byBzYXZlIGFueSBnbG9iYWwgY29udGV4dCBmb3IgYWZmZWN0ZWQgYmxvY2tzLCBhbmQgbXVzdCBiZSBjYWxsZWQKKyAqIGFmdGVyIGFsbCB0aGUgQ1BVcyBpbiB0aGUgcG93ZXIgZG9tYWluIGhhdmUgYmVlbiBub3RpZmllZCBvZiB0aGUgbG93IHBvd2VyCisgKiBzdGF0ZS4KKyAqLworCisvKgorICogRXZlbnQgY29kZXMgcGFzc2VkIGFzIHVuc2lnbmVkIGxvbmcgdmFsIHRvIG5vdGlmaWVyIGNhbGxzCisgKi8KK2VudW0gY3B1X3BtX2V2ZW50IHsKKwkvKiBBIHNpbmdsZSBjcHUgaXMgZW50ZXJpbmcgYSBsb3cgcG93ZXIgc3RhdGUgKi8KKwlDUFVfUE1fRU5URVIsCisKKwkvKiBBIHNpbmdsZSBjcHUgZmFpbGVkIHRvIGVudGVyIGEgbG93IHBvd2VyIHN0YXRlICovCisJQ1BVX1BNX0VOVEVSX0ZBSUxFRCwKKworCS8qIEEgc2luZ2xlIGNwdSBpcyBleGl0aW5nIGEgbG93IHBvd2VyIHN0YXRlICovCisJQ1BVX1BNX0VYSVQsCisKKwkvKiBBIGNwdSBwb3dlciBkb21haW4gaXMgZW50ZXJpbmcgYSBsb3cgcG93ZXIgc3RhdGUgKi8KKwlDUFVfQ0xVU1RFUl9QTV9FTlRFUiwKKworCS8qIEEgY3B1IHBvd2VyIGRvbWFpbiBmYWlsZWQgdG8gZW50ZXIgYSBsb3cgcG93ZXIgc3RhdGUgKi8KKwlDUFVfQ0xVU1RFUl9QTV9FTlRFUl9GQUlMRUQsCisKKwkvKiBBIGNwdSBwb3dlciBkb21haW4gaXMgZXhpdGluZyBhIGxvdyBwb3dlciBzdGF0ZSAqLworCUNQVV9DTFVTVEVSX1BNX0VYSVQsCit9OworCisjaWZkZWYgQ09ORklHX0NQVV9QTQoraW50IGNwdV9wbV9yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2ludCBjcHVfcG1fdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2ludCBjcHVfcG1fZW50ZXIodm9pZCk7CitpbnQgY3B1X3BtX2V4aXQodm9pZCk7CitpbnQgY3B1X2NsdXN0ZXJfcG1fZW50ZXIodm9pZCk7CitpbnQgY3B1X2NsdXN0ZXJfcG1fZXhpdCh2b2lkKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgY3B1X3BtX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9wbV91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9wbV9lbnRlcih2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcHVfcG1fZXhpdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcHVfY2x1c3Rlcl9wbV9lbnRlcih2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcHVfY2x1c3Rlcl9wbV9leGl0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVpZGxlLmggYi9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaAppbmRleCBiNTE2MjllLi43NDA4YWY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaApAQCAtMTMsNyArMTMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKQEAgLTIxLDU4ICsyMCw2NSBAQAogI2RlZmluZSBDUFVJRExFX05BTUVfTEVOCTE2CiAjZGVmaW5lIENQVUlETEVfREVTQ19MRU4JMzIKIAorc3RydWN0IG1vZHVsZTsKKwogc3RydWN0IGNwdWlkbGVfZGV2aWNlOworc3RydWN0IGNwdWlkbGVfZHJpdmVyOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBDUFVJRExFIERFVklDRSBJTlRFUkZBQ0UgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3N0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlIHsKKwl2b2lkCQkqZHJpdmVyX2RhdGE7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJdXNhZ2U7CisJdW5zaWduZWQgbG9uZyBsb25nCXRpbWU7IC8qIGluIFVTICovCit9OworCiBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSB7CiAJY2hhcgkJbmFtZVtDUFVJRExFX05BTUVfTEVOXTsKIAljaGFyCQlkZXNjW0NQVUlETEVfREVTQ19MRU5dOwotCXZvaWQJCSpkcml2ZXJfZGF0YTsKIAogCXVuc2lnbmVkIGludAlmbGFnczsKIAl1bnNpZ25lZCBpbnQJZXhpdF9sYXRlbmN5OyAvKiBpbiBVUyAqLwogCXVuc2lnbmVkIGludAlwb3dlcl91c2FnZTsgLyogaW4gbVcgKi8KIAl1bnNpZ25lZCBpbnQJdGFyZ2V0X3Jlc2lkZW5jeTsgLyogaW4gVVMgKi8KIAotCXVuc2lnbmVkIGxvbmcgbG9uZwl1c2FnZTsKLQl1bnNpZ25lZCBsb25nIGxvbmcJdGltZTsgLyogaW4gVVMgKi8KLQogCWludCAoKmVudGVyKQkoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKTsKKwkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJaW50IGluZGV4KTsKIH07CiAKIC8qIElkbGUgU3RhdGUgRmxhZ3MgKi8KICNkZWZpbmUgQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQJKDB4MDEpIC8qIGlzIHJlc2lkZW5jeSB0aW1lIG1lYXN1cmFibGU/ICovCi0jZGVmaW5lIENQVUlETEVfRkxBR19JR05PUkUJKDB4MTAwKSAvKiBpZ25vcmUgZHVyaW5nIHRoaXMgaWRsZSBwZXJpb2QgKi8KIAogI2RlZmluZSBDUFVJRExFX0RSSVZFUl9GTEFHU19NQVNLICgweEZGRkYwMDAwKQogCiAvKioKICAqIGNwdWlkbGVfZ2V0X3N0YXRlZGF0YSAtIHJldHJpZXZlcyBwcml2YXRlIGRyaXZlciBzdGF0ZSBkYXRhCi0gKiBAc3RhdGU6IHRoZSBzdGF0ZQorICogQHN0X3VzYWdlOiB0aGUgc3RhdGUgdXNhZ2Ugc3RhdGlzdGljcwogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKQorc3RhdGljIGlubGluZSB2b2lkICpjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKnN0X3VzYWdlKQogewotCXJldHVybiBzdGF0ZS0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIHN0X3VzYWdlLT5kcml2ZXJfZGF0YTsKIH0KIAogLyoqCiAgKiBjcHVpZGxlX3NldF9zdGF0ZWRhdGEgLSBzdG9yZXMgcHJpdmF0ZSBkcml2ZXIgc3RhdGUgZGF0YQotICogQHN0YXRlOiB0aGUgc3RhdGUKKyAqIEBzdF91c2FnZTogdGhlIHN0YXRlIHVzYWdlIHN0YXRpc3RpY3MKICAqIEBkYXRhOiB0aGUgcHJpdmF0ZSBkYXRhCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotY3B1aWRsZV9zZXRfc3RhdGVkYXRhKHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSwgdm9pZCAqZGF0YSkKK2NwdWlkbGVfc2V0X3N0YXRlZGF0YShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RfdXNhZ2UsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RhdGUtPmRyaXZlcl9kYXRhID0gZGF0YTsKKwlzdF91c2FnZS0+ZHJpdmVyX2RhdGEgPSBkYXRhOwogfQogCiBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV9rb2JqIHsKIAlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKnN0YXRlX3VzYWdlOwogCXN0cnVjdCBjb21wbGV0aW9uIGtvYmpfdW5yZWdpc3RlcjsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwogfTsKQEAgLTgwLDIyICs4NiwxNyBAQAogc3RydWN0IGNwdWlkbGVfZGV2aWNlIHsKIAl1bnNpZ25lZCBpbnQJCXJlZ2lzdGVyZWQ6MTsKIAl1bnNpZ25lZCBpbnQJCWVuYWJsZWQ6MTsKLQl1bnNpZ25lZCBpbnQJCXBvd2VyX3NwZWNpZmllZDoxOwogCXVuc2lnbmVkIGludAkJY3B1OwogCiAJaW50CQkJbGFzdF9yZXNpZGVuY3k7CiAJaW50CQkJc3RhdGVfY291bnQ7Ci0Jc3RydWN0IGNwdWlkbGVfc3RhdGUJc3RhdGVzW0NQVUlETEVfU1RBVEVfTUFYXTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZQlzdGF0ZXNfdXNhZ2VbQ1BVSURMRV9TVEFURV9NQVhdOwogCXN0cnVjdCBjcHVpZGxlX3N0YXRlX2tvYmogKmtvYmpzW0NQVUlETEVfU1RBVEVfTUFYXTsKLQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZQkqbGFzdF9zdGF0ZTsKIAogCXN0cnVjdCBsaXN0X2hlYWQgCWRldmljZV9saXN0OwogCXN0cnVjdCBrb2JqZWN0CQlrb2JqOwogCXN0cnVjdCBjb21wbGV0aW9uCWtvYmpfdW5yZWdpc3RlcjsKIAl2b2lkCQkJKmdvdmVybm9yX2RhdGE7Ci0Jc3RydWN0IGNwdWlkbGVfc3RhdGUJKnNhZmVfc3RhdGU7Ci0KLQlpbnQgKCpwcmVwYXJlKQkJKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KTsKIH07CiAKIERFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKiwgY3B1aWRsZV9kZXZpY2VzKTsKQEAgLTExOSw2ICsxMjAsMTEgQEAKIHN0cnVjdCBjcHVpZGxlX2RyaXZlciB7CiAJY2hhcgkJCW5hbWVbQ1BVSURMRV9OQU1FX0xFTl07CiAJc3RydWN0IG1vZHVsZSAJCSpvd25lcjsKKworCXVuc2lnbmVkIGludAkJcG93ZXJfc3BlY2lmaWVkOjE7CisJc3RydWN0IGNwdWlkbGVfc3RhdGUJc3RhdGVzW0NQVUlETEVfU1RBVEVfTUFYXTsKKwlpbnQJCQlzdGF0ZV9jb3VudDsKKwlpbnQJCQlzYWZlX3N0YXRlX2luZGV4OwogfTsKIAogI2lmZGVmIENPTkZJR19DUFVfSURMRQpAQCAtMTY1LDExICsxNzEsMTQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIAlnb3Zlcm5vcl9saXN0OwogCXVuc2lnbmVkIGludAkJcmF0aW5nOwogCi0JaW50ICAoKmVuYWJsZSkJCShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmRpc2FibGUpCQkoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpOworCWludCAgKCplbmFibGUpCQkoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkJCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KTsKKwl2b2lkICgqZGlzYWJsZSkJCShzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCQkJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpOwogCi0JaW50ICAoKnNlbGVjdCkJCShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKnJlZmxlY3QpCQkoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpOworCWludCAgKCpzZWxlY3QpCQkoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkJCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmVmbGVjdCkJCShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwgaW50IGluZGV4KTsKIAogCXN0cnVjdCBtb2R1bGUgCQkqb3duZXI7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcmFzaF9kdW1wLmggYi9pbmNsdWRlL2xpbnV4L2NyYXNoX2R1bXAuaAppbmRleCA3NDA1NDA3Li41YzRhYmNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NyYXNoX2R1bXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NyYXNoX2R1bXAuaApAQCAtMTAsNiArMTAsNyBAQAogI2RlZmluZSBFTEZDT1JFX0FERFJfRVJSCSgtMlVMTCkKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBlbGZjb3JlaGRyX2FkZHI7CitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGVsZmNvcmVoZHJfc2l6ZTsKIAogZXh0ZXJuIHNzaXplX3QgY29weV9vbGRtZW1fcGFnZSh1bnNpZ25lZCBsb25nLCBjaGFyICosIHNpemVfdCwKIAkJCQkJCXVuc2lnbmVkIGxvbmcsIGludCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyeXB0by5oIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaAppbmRleCBlNWU0NjhlLi44YTk0MjE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCisrKyBiL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNkZWZpbmUgX0xJTlVYX0NSWVBUT19ICiAKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNzIsNiArNzEsMTEgQEAKICNkZWZpbmUgQ1JZUFRPX0FMR19URVNURUQJCTB4MDAwMDA0MDAKIAogLyoKKyAqIFNldCBpZiB0aGUgYWxnb3JpdGhtIGlzIGFuIGluc3RhbmNlIHRoYXQgaXMgYnVpbGQgZnJvbSB0ZW1wbGF0ZXMuCisgKi8KKyNkZWZpbmUgQ1JZUFRPX0FMR19JTlNUQU5DRQkJMHgwMDAwMDgwMAorCisvKgogICogVHJhbnNmb3JtIG1hc2tzIGFuZCB2YWx1ZXMgKGZvciBjcnRfZmxhZ3MpLgogICovCiAjZGVmaW5lIENSWVBUT19URk1fUkVRX01BU0sJCTB4MDAwZmZmMDAKQEAgLTUwNSwxMSArNTA5LDYgQEAKIAlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9wcmlvcml0eTsKIH0KIAotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19tb2RuYW1lKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JcmV0dXJuIG1vZHVsZV9uYW1lKHRmbS0+X19jcnRfYWxnLT5jcmFfbW9kdWxlKTsKLX0KLQogc3RhdGljIGlubGluZSB1MzIgY3J5cHRvX3RmbV9hbGdfdHlwZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewogCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0s7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyeXB0b3VzZXIuaCBiL2luY2x1ZGUvbGludXgvY3J5cHRvdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMmZiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2NyeXB0b3VzZXIuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENyeXB0byB1c2VyIGNvbmZpZ3VyYXRpb24gQVBJLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBzZWN1bmV0IFNlY3VyaXR5IE5ldHdvcmtzIEFHCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU3RlZmZlbiBLbGFzc2VydCA8c3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKy8qIE5ldGxpbmsgY29uZmlndXJhdGlvbiBtZXNzYWdlcy4gICovCitlbnVtIHsKKwlDUllQVE9fTVNHX0JBU0UgPSAweDEwLAorCUNSWVBUT19NU0dfTkVXQUxHID0gMHgxMCwKKwlDUllQVE9fTVNHX0RFTEFMRywKKwlDUllQVE9fTVNHX1VQREFURUFMRywKKwlDUllQVE9fTVNHX0dFVEFMRywKKwlfX0NSWVBUT19NU0dfTUFYCit9OworI2RlZmluZSBDUllQVE9fTVNHX01BWCAoX19DUllQVE9fTVNHX01BWCAtIDEpCisjZGVmaW5lIENSWVBUT19OUl9NU0dUWVBFUyAoQ1JZUFRPX01TR19NQVggKyAxIC0gQ1JZUFRPX01TR19CQVNFKQorCisjZGVmaW5lIENSWVBUT19NQVhfTkFNRSBDUllQVE9fTUFYX0FMR19OQU1FCisKKy8qIE5ldGxpbmsgbWVzc2FnZSBhdHRyaWJ1dGVzLiAgKi8KK2VudW0gY3J5cHRvX2F0dHJfdHlwZV90IHsKKwlDUllQVE9DRkdBX1VOU1BFQywKKwlDUllQVE9DRkdBX1BSSU9SSVRZX1ZBTCwJLyogX191MzIgKi8KKwlDUllQVE9DRkdBX1JFUE9SVF9MQVJWQUwsCS8qIHN0cnVjdCBjcnlwdG9fcmVwb3J0X2xhcnZhbCAqLworCUNSWVBUT0NGR0FfUkVQT1JUX0hBU0gsCQkvKiBzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9oYXNoICovCisJQ1JZUFRPQ0ZHQV9SRVBPUlRfQkxLQ0lQSEVSLAkvKiBzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9ibGtjaXBoZXIgKi8KKwlDUllQVE9DRkdBX1JFUE9SVF9BRUFELAkJLyogc3RydWN0IGNyeXB0b19yZXBvcnRfYWVhZCAqLworCUNSWVBUT0NGR0FfUkVQT1JUX0NPTVBSRVNTLAkvKiBzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9jb21wICovCisJQ1JZUFRPQ0ZHQV9SRVBPUlRfUk5HLAkJLyogc3RydWN0IGNyeXB0b19yZXBvcnRfcm5nICovCisJQ1JZUFRPQ0ZHQV9SRVBPUlRfQ0lQSEVSLAkvKiBzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9jaXBoZXIgKi8KKwlfX0NSWVBUT0NGR0FfTUFYCisKKyNkZWZpbmUgQ1JZUFRPQ0ZHQV9NQVggKF9fQ1JZUFRPQ0ZHQV9NQVggLSAxKQorfTsKKworc3RydWN0IGNyeXB0b191c2VyX2FsZyB7CisJY2hhciBjcnVfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKKwljaGFyIGNydV9kcml2ZXJfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKKwljaGFyIGNydV9tb2R1bGVfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKKwlfX3UzMiBjcnVfdHlwZTsKKwlfX3UzMiBjcnVfbWFzazsKKwlfX3UzMiBjcnVfcmVmY250OworCV9fdTMyIGNydV9mbGFnczsKK307CisKK3N0cnVjdCBjcnlwdG9fcmVwb3J0X2xhcnZhbCB7CisJY2hhciB0eXBlW0NSWVBUT19NQVhfTkFNRV07Cit9OworCitzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9oYXNoIHsKKwljaGFyIHR5cGVbQ1JZUFRPX01BWF9OQU1FXTsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOworCXVuc2lnbmVkIGludCBkaWdlc3RzaXplOworfTsKKworc3RydWN0IGNyeXB0b19yZXBvcnRfY2lwaGVyIHsKKwljaGFyIHR5cGVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbWluX2tleXNpemU7CisJdW5zaWduZWQgaW50IG1heF9rZXlzaXplOworfTsKKworc3RydWN0IGNyeXB0b19yZXBvcnRfYmxrY2lwaGVyIHsKKwljaGFyIHR5cGVbQ1JZUFRPX01BWF9OQU1FXTsKKwljaGFyIGdlbml2W0NSWVBUT19NQVhfTkFNRV07CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbWluX2tleXNpemU7CisJdW5zaWduZWQgaW50IG1heF9rZXlzaXplOworCXVuc2lnbmVkIGludCBpdnNpemU7Cit9OworCitzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9hZWFkIHsKKwljaGFyIHR5cGVbQ1JZUFRPX01BWF9OQU1FXTsKKwljaGFyIGdlbml2W0NSWVBUT19NQVhfTkFNRV07CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbWF4YXV0aHNpemU7CisJdW5zaWduZWQgaW50IGl2c2l6ZTsKK307CisKK3N0cnVjdCBjcnlwdG9fcmVwb3J0X2NvbXAgeworCWNoYXIgdHlwZVtDUllQVE9fTUFYX05BTUVdOworfTsKKworc3RydWN0IGNyeXB0b19yZXBvcnRfcm5nIHsKKwljaGFyIHR5cGVbQ1JZUFRPX01BWF9OQU1FXTsKKwl1bnNpZ25lZCBpbnQgc2VlZHNpemU7Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKaW5kZXggNjIxNTdjMC4uNGRmOTI2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kY2FjaGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCkBAIC0xNjUsNiArMTY1LDcgQEAKIAkJCXVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcXN0ciAqKTsKIAlpbnQgKCpkX2RlbGV0ZSkoY29uc3Qgc3RydWN0IGRlbnRyeSAqKTsKIAl2b2lkICgqZF9yZWxlYXNlKShzdHJ1Y3QgZGVudHJ5ICopOworCXZvaWQgKCpkX3BydW5lKShzdHJ1Y3QgZGVudHJ5ICopOwogCXZvaWQgKCpkX2lwdXQpKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlub2RlICopOwogCWNoYXIgKigqZF9kbmFtZSkoc3RydWN0IGRlbnRyeSAqLCBjaGFyICosIGludCk7CiAJc3RydWN0IHZmc21vdW50ICooKmRfYXV0b21vdW50KShzdHJ1Y3QgcGF0aCAqKTsKQEAgLTE4NCw4ICsxODUsOSBAQAogI2RlZmluZSBEQ0FDSEVfT1BfQ09NUEFSRQkweDAwMDIKICNkZWZpbmUgRENBQ0hFX09QX1JFVkFMSURBVEUJMHgwMDA0CiAjZGVmaW5lIERDQUNIRV9PUF9ERUxFVEUJMHgwMDA4CisjZGVmaW5lIERDQUNIRV9PUF9QUlVORSAgICAgICAgIDB4MDAxMAogCi0jZGVmaW5lCURDQUNIRV9ESVNDT05ORUNURUQJMHgwMDEwCisjZGVmaW5lCURDQUNIRV9ESVNDT05ORUNURUQJMHgwMDIwCiAgICAgIC8qIFRoaXMgZGVudHJ5IGlzIHBvc3NpYmx5IG5vdCBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBkY2FjaGUgdHJlZSwgaW4KICAgICAgICogd2hpY2ggY2FzZSBpdHMgcGFyZW50IHdpbGwgZWl0aGVyIGJlIGl0c2VsZiwgb3Igd2lsbCBoYXZlIHRoaXMgZmxhZyBhcwogICAgICAgKiB3ZWxsLiAgbmZzZCB3aWxsIG5vdCB1c2UgYSBkZW50cnkgd2l0aCB0aGlzIGJpdCBzZXQsIGJ1dCB3aWxsIGZpcnN0CkBAIC0xOTYsOCArMTk4LDggQEAKICAgICAgICogZGVudHJ5IGludG8gcGxhY2UgYW5kIHJldHVybiB0aGF0IGRlbnRyeSByYXRoZXIgdGhhbiB0aGUgcGFzc2VkIG9uZSwKICAgICAgICogdHlwaWNhbGx5IHVzaW5nIGRfc3BsaWNlX2FsaWFzLiAqLwogCi0jZGVmaW5lIERDQUNIRV9SRUZFUkVOQ0VECTB4MDAyMCAgLyogUmVjZW50bHkgdXNlZCwgZG9uJ3QgZGlzY2FyZC4gKi8KLSNkZWZpbmUgRENBQ0hFX1JDVUFDQ0VTUwkweDAwNDAJLyogRW50cnkgaGFzIGV2ZXIgYmVlbiBSQ1UtdmlzaWJsZSAqLworI2RlZmluZSBEQ0FDSEVfUkVGRVJFTkNFRAkweDAwNDAgIC8qIFJlY2VudGx5IHVzZWQsIGRvbid0IGRpc2NhcmQuICovCisjZGVmaW5lIERDQUNIRV9SQ1VBQ0NFU1MJMHgwMDgwCS8qIEVudHJ5IGhhcyBldmVyIGJlZW4gUkNVLXZpc2libGUgKi8KIAogI2RlZmluZSBEQ0FDSEVfQ0FOVF9NT1VOVAkweDAxMDAKICNkZWZpbmUgRENBQ0hFX0dFTk9DSURFCQkweDAyMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9kZXZmcmVxLmgKaW5kZXggYWZiOTQ1OC4uOThjZTgxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZmcmVxLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZmcmVxLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAl1bnNpZ25lZCBsb25nIHRvdGFsX3RpbWU7CiAJdW5zaWduZWQgbG9uZyBidXN5X3RpbWU7CiAJdW5zaWduZWQgbG9uZyBjdXJyZW50X2ZyZXF1ZW5jeTsKLQl2b2lkICpwcml2YXRlX2RhdGU7CisJdm9pZCAqcHJpdmF0ZV9kYXRhOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCmluZGV4IDk5ZTNlNTAuLjk4ZjM0YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogc3RydWN0IGRtX2RldjsKIHN0cnVjdCBkbV90YXJnZXQ7CkBAIC0xMjcsMTAgKzEyOCw2IEBACiAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIHRhcmdldCB0eXBlCiAgKi8KIAotLyoKLSAqIFRhcmdldCBmZWF0dXJlcwotICovCi0KIHN0cnVjdCB0YXJnZXRfdHlwZSB7CiAJdWludDY0X3QgZmVhdHVyZXM7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTE1OSw2ICsxNTYsMzAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCisvKgorICogVGFyZ2V0IGZlYXR1cmVzCisgKi8KKworLyoKKyAqIEFueSB0YWJsZSB0aGF0IGNvbnRhaW5zIGFuIGluc3RhbmNlIG9mIHRoaXMgdGFyZ2V0IG11c3QgaGF2ZSBvbmx5IG9uZS4KKyAqLworI2RlZmluZSBETV9UQVJHRVRfU0lOR0xFVE9OCQkweDAwMDAwMDAxCisjZGVmaW5lIGRtX3RhcmdldF9uZWVkc19zaW5nbGV0b24odHlwZSkJKCh0eXBlKS0+ZmVhdHVyZXMgJiBETV9UQVJHRVRfU0lOR0xFVE9OKQorCisvKgorICogSW5kaWNhdGVzIHRoYXQgYSB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCByZWFkLW9ubHkgZGV2aWNlcy4KKyAqLworI2RlZmluZSBETV9UQVJHRVRfQUxXQVlTX1dSSVRFQUJMRQkweDAwMDAwMDAyCisjZGVmaW5lIGRtX3RhcmdldF9hbHdheXNfd3JpdGVhYmxlKHR5cGUpIFwKKwkJKCh0eXBlKS0+ZmVhdHVyZXMgJiBETV9UQVJHRVRfQUxXQVlTX1dSSVRFQUJMRSkKKworLyoKKyAqIEFueSBkZXZpY2UgdGhhdCBjb250YWlucyBhIHRhYmxlIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhpcyB0YXJnZXQgbWF5IG5ldmVyCisgKiBoYXZlIHRhYmxlcyBjb250YWluaW5nIGFueSBkaWZmZXJlbnQgdGFyZ2V0IHR5cGUuCisgKi8KKyNkZWZpbmUgRE1fVEFSR0VUX0lNTVVUQUJMRQkJMHgwMDAwMDAwNAorI2RlZmluZSBkbV90YXJnZXRfaXNfaW1tdXRhYmxlKHR5cGUpCSgodHlwZSktPmZlYXR1cmVzICYgRE1fVEFSR0VUX0lNTVVUQUJMRSkKKwogc3RydWN0IGRtX3RhcmdldCB7CiAJc3RydWN0IGRtX3RhYmxlICp0YWJsZTsKIAlzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnR5cGU7CkBAIC0zNzUsNiArMzk2LDE0IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIERNX05BTUUgImRldmljZS1tYXBwZXIiCiAKKyNpZmRlZiBDT05GSUdfUFJJTlRLCitleHRlcm4gc3RydWN0IHJhdGVsaW1pdF9zdGF0ZSBkbV9yYXRlbGltaXRfc3RhdGU7CisKKyNkZWZpbmUgZG1fcmF0ZWxpbWl0KCkJX19yYXRlbGltaXQoJmRtX3JhdGVsaW1pdF9zdGF0ZSkKKyNlbHNlCisjZGVmaW5lIGRtX3JhdGVsaW1pdCgpCTAKKyNlbmRpZgorCiAjZGVmaW5lIERNQ1JJVChmLCBhcmcuLi4pIFwKIAlwcmludGsoS0VSTl9DUklUIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiAiXG4iLCAjIyBhcmcpCiAKQEAgLTM4Miw3ICs0MTEsNyBAQAogCXByaW50ayhLRVJOX0VSUiBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIGYgIlxuIiwgIyMgYXJnKQogI2RlZmluZSBETUVSUl9MSU1JVChmLCBhcmcuLi4pIFwKIAlkbyB7IFwKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkJXAorCQlpZiAoZG1fcmF0ZWxpbWl0KCkpCVwKIAkJCXByaW50ayhLRVJOX0VSUiBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIFwKIAkJCSAgICAgICBmICJcbiIsICMjIGFyZyk7IFwKIAl9IHdoaWxlICgwKQpAQCAtMzkxLDcgKzQyMCw3IEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIGYgIlxuIiwgIyMgYXJnKQogI2RlZmluZSBETVdBUk5fTElNSVQoZiwgYXJnLi4uKSBcCiAJZG8geyBcCi0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCVwKKwkJaWYgKGRtX3JhdGVsaW1pdCgpKQlcCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgXAogCQkJICAgICAgIGYgIlxuIiwgIyMgYXJnKTsgXAogCX0gd2hpbGUgKDApCkBAIC00MDAsNyArNDI5LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiAiXG4iLCAjIyBhcmcpCiAjZGVmaW5lIERNSU5GT19MSU1JVChmLCBhcmcuLi4pIFwKIAlkbyB7IFwKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkJXAorCQlpZiAoZG1fcmF0ZWxpbWl0KCkpCVwKIAkJCXByaW50ayhLRVJOX0lORk8gRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmIFwKIAkJCSAgICAgICAiXG4iLCAjIyBhcmcpOyBcCiAJfSB3aGlsZSAoMCkKQEAgLTQxMCw3ICs0MzksNyBAQAogCXByaW50ayhLRVJOX0RFQlVHIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICIgREVCVUc6ICIgZiAiXG4iLCAjIyBhcmcpCiAjICBkZWZpbmUgRE1ERUJVR19MSU1JVChmLCBhcmcuLi4pIFwKIAlkbyB7IFwKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkJXAorCQlpZiAoZG1fcmF0ZWxpbWl0KCkpCVwKIAkJCXByaW50ayhLRVJOX0RFQlVHIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiBcCiAJCQkgICAgICAgIlxuIiwgIyMgYXJnKTsgXAogCX0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCBiZGNmMzYxLi5mZmJjZjk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vZGV2aWNlLmg+CkBAIC0yOSwxMCArMjksMTIgQEAKIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZTsKIHN0cnVjdCBkZXZpY2VfZHJpdmVyOwogc3RydWN0IGRyaXZlcl9wcml2YXRlOworc3RydWN0IG1vZHVsZTsKIHN0cnVjdCBjbGFzczsKIHN0cnVjdCBzdWJzeXNfcHJpdmF0ZTsKIHN0cnVjdCBidXNfdHlwZTsKIHN0cnVjdCBkZXZpY2Vfbm9kZTsKK3N0cnVjdCBpb21tdV9vcHM7CiAKIHN0cnVjdCBidXNfYXR0cmlidXRlIHsKIAlzdHJ1Y3QgYXR0cmlidXRlCWF0dHI7CkBAIC02Nyw2ICs2OSw5IEBACiAgKiBAcmVzdW1lOglDYWxsZWQgdG8gYnJpbmcgYSBkZXZpY2Ugb24gdGhpcyBidXMgb3V0IG9mIHNsZWVwIG1vZGUuCiAgKiBAcG06CQlQb3dlciBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgb2YgdGhpcyBidXMsIGNhbGxiYWNrIHRoZSBzcGVjaWZpYwogICoJCWRldmljZSBkcml2ZXIncyBwbS1vcHMuCisgKiBAaW9tbXVfb3BzICAgSU9NTVUgc3BlY2lmaWMgb3BlcmF0aW9ucyBmb3IgdGhpcyBidXMsIHVzZWQgdG8gYXR0YWNoIElPTU1VCisgKiAgICAgICAgICAgICAgZHJpdmVyIGltcGxlbWVudGF0aW9ucyB0byBhIGJ1cyBhbmQgYWxsb3cgdGhlIGRyaXZlciB0byBkbworICogICAgICAgICAgICAgIGJ1cy1zcGVjaWZpYyBzZXR1cAogICogQHA6CQlUaGUgcHJpdmF0ZSBkYXRhIG9mIHRoZSBkcml2ZXIgY29yZSwgb25seSB0aGUgZHJpdmVyIGNvcmUgY2FuCiAgKgkJdG91Y2ggdGhpcy4KICAqCkBAIC05Niw2ICsxMDEsOCBAQAogCiAJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtOwogCisJc3RydWN0IGlvbW11X29wcyAqaW9tbXVfb3BzOworCiAJc3RydWN0IHN1YnN5c19wcml2YXRlICpwOwogfTsKIApAQCAtNjE2LDggKzYyMyw4IEBACiAJcmV0dXJuIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKTsKIH0KIAotZXh0ZXJuIGludCBkZXZfc2V0X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLCAuLi4pCi0JCQlfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgZGV2X3NldF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwgLi4uKTsKIAogI2lmZGVmIENPTkZJR19OVU1BCiBzdGF0aWMgaW5saW5lIGludCBkZXZfdG9fbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC03MTcsMTAgKzcyNCwxNCBAQAogICovCiBleHRlcm4gc3RydWN0IGRldmljZSAqX19yb290X2RldmljZV9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lLAogCQkJCQkgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqcm9vdF9kZXZpY2VfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlyZXR1cm4gX19yb290X2RldmljZV9yZWdpc3RlcihuYW1lLCBUSElTX01PRFVMRSk7Ci19CisKKy8qCisgKiBUaGlzIGlzIGEgbWFjcm8gdG8gYXZvaWQgaW5jbHVkZSBwcm9ibGVtcyB3aXRoIFRISVNfTU9EVUxFLAorICoganVzdCBhcyBwZXIgd2hhdCBpcyBkb25lIGZvciBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soKSBhYm92ZS4KKyAqLworI2RlZmluZSByb290X2RldmljZV9yZWdpc3RlcihuYW1lKSBcCisJX19yb290X2RldmljZV9yZWdpc3RlcihuYW1lLCBUSElTX01PRFVMRSkKKwogZXh0ZXJuIHZvaWQgcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpyb290KTsKIAogc3RhdGljIGlubGluZSB2b2lkICpkZXZfZ2V0X3BsYXRkYXRhKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTc0NywxMCArNzU4LDEwIEBACiAJCQkJCSAgdm9pZCAqZHJ2ZGF0YSwKIAkJCQkJICBjb25zdCBjaGFyICpmbXQsCiAJCQkJCSAgdmFfbGlzdCB2YXJncyk7Ci1leHRlcm4gc3RydWN0IGRldmljZSAqZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgY2xhc3MgKmNscywgc3RydWN0IGRldmljZSAqcGFyZW50LAotCQkJCSAgICBkZXZfdCBkZXZ0LCB2b2lkICpkcnZkYXRhLAotCQkJCSAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJCQkgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNSwgNikpKTsKK2V4dGVybiBfX3ByaW50Zig1LCA2KQorc3RydWN0IGRldmljZSAqZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgY2xhc3MgKmNscywgc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJICAgICBkZXZfdCBkZXZ0LCB2b2lkICpkcnZkYXRhLAorCQkJICAgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CiBleHRlcm4gdm9pZCBkZXZpY2VfZGVzdHJveShzdHJ1Y3QgY2xhc3MgKmNscywgZGV2X3QgZGV2dCk7CiAKIC8qCkBAIC03OTQsNjQgKzgwNSw1NiBAQAogCiBleHRlcm4gaW50IF9fZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IHZhX2Zvcm1hdCAqdmFmKTsKLWV4dGVybiBpbnQgZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAotCQkgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gaW50IGRldl9lbWVyZyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLWV4dGVybiBpbnQgZGV2X2FsZXJ0KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBkZXZfY3JpdChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLWV4dGVybiBpbnQgZGV2X2Vycihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLWV4dGVybiBpbnQgZGV2X3dhcm4oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gaW50IGRldl9ub3RpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gaW50IF9kZXZfaW5mbyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KQoraW50IGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKKwkgICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCisJOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgZGV2X2VtZXJnKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgZGV2X2FsZXJ0KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgZGV2X2NyaXQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBkZXZfZXJyKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgZGV2X3dhcm4oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBkZXZfbm90aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgX2Rldl9pbmZvKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIGludCBfX2Rldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpCi0JIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotc3RhdGljIGlubGluZSBpbnQgZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAotCQkgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkgeyByZXR1cm4gMDsgfQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBfX3ByaW50ZigzLCA0KQoraW50IGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKKwkgICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7IHJldHVybiAwOyB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRldl9lbWVyZyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLXN0YXRpYyBpbmxpbmUgaW50IGRldl9lbWVyZyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCXsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGRldl9jcml0KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotc3RhdGljIGlubGluZSBpbnQgZGV2X2NyaXQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQl7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBkZXZfYWxlcnQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1zdGF0aWMgaW5saW5lIGludCBkZXZfYWxlcnQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQl7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBkZXZfZXJyKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotc3RhdGljIGlubGluZSBpbnQgZGV2X2Vycihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCXsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGRldl93YXJuKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotc3RhdGljIGlubGluZSBpbnQgZGV2X3dhcm4oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQl7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBkZXZfbm90aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotc3RhdGljIGlubGluZSBpbnQgZGV2X25vdGljZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCXsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IF9kZXZfaW5mbyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLXN0YXRpYyBpbmxpbmUgaW50IF9kZXZfaW5mbyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMiwgMykKK2ludCBkZXZfZW1lcmcoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMiwgMykKK2ludCBkZXZfY3JpdChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBfX3ByaW50ZigyLCAzKQoraW50IGRldl9hbGVydChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBfX3ByaW50ZigyLCAzKQoraW50IGRldl9lcnIoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMiwgMykKK2ludCBkZXZfd2Fybihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBfX3ByaW50ZigyLCAzKQoraW50IGRldl9ub3RpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMiwgMykKK2ludCBfZGV2X2luZm8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sgcmV0dXJuIDA7IH0KIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlX2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2VfY2dyb3VwLmgKaW5kZXggN2FhZDFmNC4uOGI2NDIyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2VfY2dyb3VwLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2VfY2dyb3VwLmgKQEAgLTEsNCArMSwzIEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIAogI2lmZGVmIENPTkZJR19DR1JPVVBfREVWSUNFCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmggYi9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKaW5kZXggMGNiOGVmZi4uNzVmZDU1NzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKQEAgLTI2Nyw5ICsyNjcsOSBAQAogI2RlZmluZSBETV9ERVZfU0VUX0dFT01FVFJZCV9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU0VUX0dFT01FVFJZX0NNRCwgc3RydWN0IGRtX2lvY3RsKQogCiAjZGVmaW5lIERNX1ZFUlNJT05fTUFKT1IJNAotI2RlZmluZSBETV9WRVJTSU9OX01JTk9SCTIxCisjZGVmaW5lIERNX1ZFUlNJT05fTUlOT1IJMjIKICNkZWZpbmUgRE1fVkVSU0lPTl9QQVRDSExFVkVMCTAKLSNkZWZpbmUgRE1fVkVSU0lPTl9FWFRSQQkiLWlvY3RsICgyMDExLTA3LTA2KSIKKyNkZWZpbmUgRE1fVkVSU0lPTl9FWFRSQQkiLWlvY3RsICgyMDExLTEwLTE5KSIKIAogLyogU3RhdHVzIGJpdHMgKi8KICNkZWZpbmUgRE1fUkVBRE9OTFlfRkxBRwkoMSA8PCAwKSAvKiBJbi9PdXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG0ta2NvcHlkLmggYi9pbmNsdWRlL2xpbnV4L2RtLWtjb3B5ZC5oCmluZGV4IDVlNTQ0NTguLjQ3ZDlkMzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG0ta2NvcHlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbS1rY29weWQuaApAQCAtNTcsNSArNTcsOSBAQAogCQkJCSBkbV9rY29weWRfbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KTsKIHZvaWQgZG1fa2NvcHlkX2RvX2NhbGxiYWNrKHZvaWQgKmpvYiwgaW50IHJlYWRfZXJyLCB1bnNpZ25lZCBsb25nIHdyaXRlX2Vycik7CiAKK2ludCBkbV9rY29weWRfemVybyhzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MsCisJCSAgIHVuc2lnbmVkIG51bV9kZXN0cywgc3RydWN0IGRtX2lvX3JlZ2lvbiAqZGVzdHMsCisJCSAgIHVuc2lnbmVkIGZsYWdzLCBkbV9rY29weWRfbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KTsKKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfTElOVVhfRE1fS0NPUFlEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG0tbG9nLXVzZXJzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9kbS1sb2ctdXNlcnNwYWNlLmgKaW5kZXggZWVhY2U3ZC4uMDY3OGMyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbS1sb2ctdXNlcnNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbS1sb2ctdXNlcnNwYWNlLmgKQEAgLTUyLDE1ICs1MiwyMCBAQAogICogUGF5bG9hZC10by11c2Vyc3BhY2U6CiAgKglBIHNpbmdsZSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIGFyZ3YgYXJndW1lbnRzIHNlcGFyYXRlZCBieSAnICdzCiAgKiBQYXlsb2FkLXRvLWtlcm5lbDoKLSAqCU5vbmUuICAoJ2RhdGFfc2l6ZScgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3Qgc2hvdWxkIGJlIDAuKQorICoJQSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdGhhdCBpcyB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIHRoYXQgaXMgdXNlZAorICoJYXMgdGhlIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBsb2cgZGF0YS4gICdkbV9nZXRfZGV2aWNlJyB3aWxsIGJlIGNhbGxlZAorICoJb24gdGhpcyBkZXZpY2UuICAoJ2RtX3B1dF9kZXZpY2UnIHdpbGwgYmUgY2FsbGVkIG9uIHRoaXMgZGV2aWNlCisgKglhdXRvbWF0aWNhbGx5IGFmdGVyIGNhbGxpbmcgRE1fVUxPR19EVFIuKSAgSWYgdGhlcmUgaXMgbm8gZGV2aWNlIG5lZWRlZAorICoJZm9yIGxvZyBkYXRhLCAnZGF0YV9zaXplJyBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdCBzaG91bGQgYmUgMC4KICAqCiAgKiBUaGUgVVVJRCBjb250YWluZWQgaW4gdGhlIGRtX3Vsb2dfcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgdGhlIHJlZmVyZW5jZSB0aGF0CiAgKiB3aWxsIGJlIHVzZWQgYnkgYWxsIHJlcXVlc3QgdHlwZXMgdG8gYSBzcGVjaWZpYyBsb2cuICBUaGUgY29uc3RydWN0b3IgbXVzdAotICogcmVjb3JkIHRoaXMgYXNzb3RpYXRpb24gd2l0aCBpbnN0YW5jZSBjcmVhdGVkLgorICogcmVjb3JkIHRoaXMgYXNzb2NpYXRpb24gd2l0aCB0aGUgaW5zdGFuY2UgY3JlYXRlZC4KICAqCiAgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgdXNlci1zcGFjZSBtdXN0IHJldHVybiB0aGUKLSAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCBhbmQKLSAqICdkYXRhX3NpemUnIGFwcHJvcHJpYXRlbHkuCisgKiBkbV91bG9nX3JlcXVlc3QgdG8gdGhlIGtlcm5lbCAtIHNldHRpbmcgdGhlICdlcnJvcicgZmllbGQsIGZpbGxpbmcgdGhlCisgKiBkYXRhIGZpZWxkIHdpdGggdGhlIGxvZyBkZXZpY2UgaWYgbmVjZXNzYXJ5LCBhbmQgc2V0dGluZyAnZGF0YV9zaXplJworICogYXBwcm9wcmlhdGVseS4KICAqLwogI2RlZmluZSBETV9VTE9HX0NUUiAgICAgICAgICAgICAgICAgICAgMQogCkBAIC0zNzcsOCArMzgyLDExIEBACiAgKiBkbV91bG9nX3JlcXVlc3Qgb3IgYSBjaGFuZ2UgaW4gdGhlIHdheSByZXF1ZXN0cyBhcmUKICAqIGlzc3VlZC9oYW5kbGVkLiAgQ2hhbmdlcyBhcmUgb3V0bGluZWQgaGVyZToKICAqCXZlcnNpb24gMTogIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCXZlcnNpb24gMjogIERNX1VMT0dfQ1RSIGFsbG93ZWQgdG8gcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYQorICoJICAgICAgICAgICAgZGV2aWNlIG5hbWUgdGhhdCBpcyB0byBiZSByZWdpc3RlcmVkIHdpdGggRE0gdmlhCisgKgkgICAgICAgICAgICAnZG1fZ2V0X2RldmljZScuCiAgKi8KLSNkZWZpbmUgRE1fVUxPR19SRVFVRVNUX1ZFUlNJT04gMQorI2RlZmluZSBETV9VTE9HX1JFUVVFU1RfVkVSU0lPTiAyCiAKIHN0cnVjdCBkbV91bG9nX3JlcXVlc3QgewogCS8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKaW5kZXggMzQ3ZmRjMy4uZTEzMTE3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX0xJTlVYX0RNQV9NQVBQSU5HX0gKICNkZWZpbmUgX0xJTlVYX0RNQV9NQVBQSU5HX0gKIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1hdHRycy5oPgpAQCAtNDEsNiArNDIsOSBAQAogCWludCAoKm1hcHBpbmdfZXJyb3IpKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcik7CiAJaW50ICgqZG1hX3N1cHBvcnRlZCkoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CiAJaW50ICgqc2V0X2RtYV9tYXNrKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKKyNpZmRlZiBBUkNIX0hBU19ETUFfR0VUX1JFUVVJUkVEX01BU0sKKwl1NjQgKCpnZXRfcmVxdWlyZWRfbWFzaykoc3RydWN0IGRldmljZSAqZGV2KTsKKyNlbmRpZgogCWludCBpc19waHlzOwogfTsKIApAQCAtMTE3LDYgKzEyMSwxNSBAQAogCQlyZXR1cm4gLUVJTzsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkICpkbWFfemFsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCit7CisJdm9pZCAqcmV0ID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgZG1hX2hhbmRsZSwgZmxhZyk7CisJaWYgKHJldCkKKwkJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKwogI2lmZGVmIENPTkZJR19IQVNfRE1BCiBzdGF0aWMgaW5saW5lIGludCBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaCBiL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmgKaW5kZXggOGZiZjQwZS4uNzVmNTNmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oCkBAIC0yNCw4ICsyNCw5IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRpcmVjdGlvbi5oPgotCi1zdHJ1Y3Qgc2NhdHRlcmxpc3Q7CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiAvKioKICAqIHR5cGVkZWYgZG1hX2Nvb2tpZV90IC0gYW4gb3BhcXVlIERNQSBjb29raWUKQEAgLTUxOSw2ICs1MjAsMTYgQEAKIAkJCSh1bnNpZ25lZCBsb25nKWNvbmZpZyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoCisJc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpidWYsIHNpemVfdCBsZW4sCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlzZ19pbml0X29uZSgmc2csIGJ1ZiwgbGVuKTsKKworCXJldHVybiBjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKGNoYW4sICZzZywgMSwgZGlyLCBmbGFncyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKIAlyZXR1cm4gZG1hZW5naW5lX2RldmljZV9jb250cm9sKGNoYW4sIERNQV9URVJNSU5BVEVfQUxMLCAwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hci5oIGIvaW5jbHVkZS9saW51eC9kbWFyLmgKaW5kZXggYThiMWE4NC4uNzMxYTYwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWFyLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWFyLmgKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KIAorc3RydWN0IGFjcGlfZG1hcl9oZWFkZXI7CisKIC8qIERNQVIgRmxhZ3MgKi8KICNkZWZpbmUgRE1BUl9JTlRSX1JFTUFQCQkweDEKICNkZWZpbmUgRE1BUl9YMkFQSUNfT1BUX09VVAkweDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmggYi9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oCmluZGV4IDM2YTNlZDYuLjFiMTA5NGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaApAQCAtMzQ5LDYgKzM0OSw3IEBACiAJU1lTX0NNTUIsCiAJU1lTX0RBQiwKIAlTWVNfRFZCVDIsCisJU1lTX1RVUkJPLAogfSBmZV9kZWxpdmVyeV9zeXN0ZW1fdDsKIAogc3RydWN0IGR0dl9jbWRzX2ggewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oIGIvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oCmluZGV4IDE0MjFjYzguLjY2NTk0YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHZiL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi92ZXJzaW9uLmgKQEAgLTI0LDYgKzI0LDYgQEAKICNkZWZpbmUgX0RWQlZFUlNJT05fSF8KIAogI2RlZmluZSBEVkJfQVBJX1ZFUlNJT04gNQotI2RlZmluZSBEVkJfQVBJX1ZFUlNJT05fTUlOT1IgMworI2RlZmluZSBEVkJfQVBJX1ZFUlNJT05fTUlOT1IgNAogCiAjZW5kaWYgLypfRFZCVkVSU0lPTl9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfZGVidWcuaCBiL2luY2x1ZGUvbGludXgvZHluYW1pY19kZWJ1Zy5oCmluZGV4IDEzYWFlODAuLjA1NjRlM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHluYW1pY19kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvZHluYW1pY19kZWJ1Zy5oCkBAIC0zNywyMiArMzcsMjEgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX0RZTkFNSUNfREVCVUcpCiBleHRlcm4gaW50IGRkZWJ1Z19yZW1vdmVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZF9uYW1lKTsKLWV4dGVybiBpbnQgX19keW5hbWljX3ByX2RlYnVnKHN0cnVjdCBfZGRlYnVnICpkZXNjcmlwdG9yLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBfX2R5bmFtaWNfcHJfZGVidWcoc3RydWN0IF9kZGVidWcgKmRlc2NyaXB0b3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogc3RydWN0IGRldmljZTsKIAotZXh0ZXJuIGludCBfX2R5bmFtaWNfZGV2X2RiZyhzdHJ1Y3QgX2RkZWJ1ZyAqZGVzY3JpcHRvciwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK2ludCBfX2R5bmFtaWNfZGV2X2RiZyhzdHJ1Y3QgX2RkZWJ1ZyAqZGVzY3JpcHRvciwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIHN0cnVjdCBuZXRfZGV2aWNlOwogCi1leHRlcm4gaW50IF9fZHluYW1pY19uZXRkZXZfZGJnKHN0cnVjdCBfZGRlYnVnICpkZXNjcmlwdG9yLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK2ludCBfX2R5bmFtaWNfbmV0ZGV2X2RiZyhzdHJ1Y3QgX2RkZWJ1ZyAqZGVzY3JpcHRvciwKKwkJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogI2RlZmluZSBERUZJTkVfRFlOQU1JQ19ERUJVR19NRVRBREFUQShuYW1lLCBmbXQpCQlcCiAJc3RhdGljIHN0cnVjdCBfZGRlYnVnIF9fdXNlZCBfX2FsaWduZWQoOCkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWRhYy5oIGIvaW5jbHVkZS9saW51eC9lZGFjLmgKaW5kZXggNGE3MzI1Ny4uMDU1YjI0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lZGFjLmgKKysrIGIvaW5jbHVkZS9saW51eC9lZGFjLmgKQEAgLTQyLDQgKzQyLDM1NCBAQAogCXJldHVybjsKIH0KIAorI2RlZmluZSBFREFDX01DX0xBQkVMX0xFTgkzMQorI2RlZmluZSBNQ19QUk9DX05BTUVfTUFYX0xFTgk3CisKKy8qIG1lbW9yeSBkZXZpY2VzICovCitlbnVtIGRldl90eXBlIHsKKwlERVZfVU5LTk9XTiA9IDAsCisJREVWX1gxLAorCURFVl9YMiwKKwlERVZfWDQsCisJREVWX1g4LAorCURFVl9YMTYsCisJREVWX1gzMiwJCS8qIERvIHRoZXNlIHBhcnRzIGV4aXN0PyAqLworCURFVl9YNjQJCQkvKiBEbyB0aGVzZSBwYXJ0cyBleGlzdD8gKi8KK307CisKKyNkZWZpbmUgREVWX0ZMQUdfVU5LTk9XTglCSVQoREVWX1VOS05PV04pCisjZGVmaW5lIERFVl9GTEFHX1gxCQlCSVQoREVWX1gxKQorI2RlZmluZSBERVZfRkxBR19YMgkJQklUKERFVl9YMikKKyNkZWZpbmUgREVWX0ZMQUdfWDQJCUJJVChERVZfWDQpCisjZGVmaW5lIERFVl9GTEFHX1g4CQlCSVQoREVWX1g4KQorI2RlZmluZSBERVZfRkxBR19YMTYJCUJJVChERVZfWDE2KQorI2RlZmluZSBERVZfRkxBR19YMzIJCUJJVChERVZfWDMyKQorI2RlZmluZSBERVZfRkxBR19YNjQJCUJJVChERVZfWDY0KQorCisvKiBtZW1vcnkgdHlwZXMgKi8KK2VudW0gbWVtX3R5cGUgeworCU1FTV9FTVBUWSA9IDAsCQkvKiBFbXB0eSBjc3JvdyAqLworCU1FTV9SRVNFUlZFRCwJCS8qIFJlc2VydmVkIGNzcm93IHR5cGUgKi8KKwlNRU1fVU5LTk9XTiwJCS8qIFVua25vd24gY3Nyb3cgdHlwZSAqLworCU1FTV9GUE0sCQkvKiBGYXN0IHBhZ2UgbW9kZSAqLworCU1FTV9FRE8sCQkvKiBFeHRlbmRlZCBkYXRhIG91dCAqLworCU1FTV9CRURPLAkJLyogQnVyc3QgRXh0ZW5kZWQgZGF0YSBvdXQgKi8KKwlNRU1fU0RSLAkJLyogU2luZ2xlIGRhdGEgcmF0ZSBTRFJBTSAqLworCU1FTV9SRFIsCQkvKiBSZWdpc3RlcmVkIHNpbmdsZSBkYXRhIHJhdGUgU0RSQU0gKi8KKwlNRU1fRERSLAkJLyogRG91YmxlIGRhdGEgcmF0ZSBTRFJBTSAqLworCU1FTV9SRERSLAkJLyogUmVnaXN0ZXJlZCBEb3VibGUgZGF0YSByYXRlIFNEUkFNICovCisJTUVNX1JNQlMsCQkvKiBSYW1idXMgRFJBTSAqLworCU1FTV9ERFIyLAkJLyogRERSMiBSQU0gKi8KKwlNRU1fRkJfRERSMiwJCS8qIGZ1bGx5IGJ1ZmZlcmVkIEREUjIgKi8KKwlNRU1fUkREUjIsCQkvKiBSZWdpc3RlcmVkIEREUjIgUkFNICovCisJTUVNX1hEUiwJCS8qIFJhbWJ1cyBYRFIgKi8KKwlNRU1fRERSMywJCS8qIEREUjMgUkFNICovCisJTUVNX1JERFIzLAkJLyogUmVnaXN0ZXJlZCBERFIzIFJBTSAqLworfTsKKworI2RlZmluZSBNRU1fRkxBR19FTVBUWQkJQklUKE1FTV9FTVBUWSkKKyNkZWZpbmUgTUVNX0ZMQUdfUkVTRVJWRUQJQklUKE1FTV9SRVNFUlZFRCkKKyNkZWZpbmUgTUVNX0ZMQUdfVU5LTk9XTglCSVQoTUVNX1VOS05PV04pCisjZGVmaW5lIE1FTV9GTEFHX0ZQTQkJQklUKE1FTV9GUE0pCisjZGVmaW5lIE1FTV9GTEFHX0VETwkJQklUKE1FTV9FRE8pCisjZGVmaW5lIE1FTV9GTEFHX0JFRE8JCUJJVChNRU1fQkVETykKKyNkZWZpbmUgTUVNX0ZMQUdfU0RSCQlCSVQoTUVNX1NEUikKKyNkZWZpbmUgTUVNX0ZMQUdfUkRSCQlCSVQoTUVNX1JEUikKKyNkZWZpbmUgTUVNX0ZMQUdfRERSCQlCSVQoTUVNX0REUikKKyNkZWZpbmUgTUVNX0ZMQUdfUkREUgkJQklUKE1FTV9SRERSKQorI2RlZmluZSBNRU1fRkxBR19STUJTCQlCSVQoTUVNX1JNQlMpCisjZGVmaW5lIE1FTV9GTEFHX0REUjIgICAgICAgICAgIEJJVChNRU1fRERSMikKKyNkZWZpbmUgTUVNX0ZMQUdfRkJfRERSMiAgICAgICAgQklUKE1FTV9GQl9ERFIyKQorI2RlZmluZSBNRU1fRkxBR19SRERSMiAgICAgICAgICBCSVQoTUVNX1JERFIyKQorI2RlZmluZSBNRU1fRkxBR19YRFIgICAgICAgICAgICBCSVQoTUVNX1hEUikKKyNkZWZpbmUgTUVNX0ZMQUdfRERSMwkJIEJJVChNRU1fRERSMykKKyNkZWZpbmUgTUVNX0ZMQUdfUkREUjMJCSBCSVQoTUVNX1JERFIzKQorCisvKiBjaGlwc2V0IEVycm9yIERldGVjdGlvbiBhbmQgQ29ycmVjdGlvbiBjYXBhYmlsaXRpZXMgYW5kIG1vZGUgKi8KK2VudW0gZWRhY190eXBlIHsKKwlFREFDX1VOS05PV04gPSAwLAkvKiBVbmtub3duIGlmIEVDQyBpcyBhdmFpbGFibGUgKi8KKwlFREFDX05PTkUsCQkvKiBEb2Vzbid0IHN1cHBvcnQgRUNDICovCisJRURBQ19SRVNFUlZFRCwJCS8qIFJlc2VydmVkIEVDQyB0eXBlICovCisJRURBQ19QQVJJVFksCQkvKiBEZXRlY3RzIHBhcml0eSBlcnJvcnMgKi8KKwlFREFDX0VDLAkJLyogRXJyb3IgQ2hlY2tpbmcgLSBubyBjb3JyZWN0aW9uICovCisJRURBQ19TRUNERUQsCQkvKiBTaW5nbGUgYml0IGVycm9yIGNvcnJlY3Rpb24sIERvdWJsZSBkZXRlY3Rpb24gKi8KKwlFREFDX1MyRUNEMkVELAkJLyogQ2hpcGtpbGwgeDIgZGV2aWNlcyAtIGRvIHRoZXNlIGV4aXN0PyAqLworCUVEQUNfUzRFQ0Q0RUQsCQkvKiBDaGlwa2lsbCB4NCBkZXZpY2VzICovCisJRURBQ19TOEVDRDhFRCwJCS8qIENoaXBraWxsIHg4IGRldmljZXMgKi8KKwlFREFDX1MxNkVDRDE2RUQsCS8qIENoaXBraWxsIHgxNiBkZXZpY2VzICovCit9OworCisjZGVmaW5lIEVEQUNfRkxBR19VTktOT1dOCUJJVChFREFDX1VOS05PV04pCisjZGVmaW5lIEVEQUNfRkxBR19OT05FCQlCSVQoRURBQ19OT05FKQorI2RlZmluZSBFREFDX0ZMQUdfUEFSSVRZCUJJVChFREFDX1BBUklUWSkKKyNkZWZpbmUgRURBQ19GTEFHX0VDCQlCSVQoRURBQ19FQykKKyNkZWZpbmUgRURBQ19GTEFHX1NFQ0RFRAlCSVQoRURBQ19TRUNERUQpCisjZGVmaW5lIEVEQUNfRkxBR19TMkVDRDJFRAlCSVQoRURBQ19TMkVDRDJFRCkKKyNkZWZpbmUgRURBQ19GTEFHX1M0RUNENEVECUJJVChFREFDX1M0RUNENEVEKQorI2RlZmluZSBFREFDX0ZMQUdfUzhFQ0Q4RUQJQklUKEVEQUNfUzhFQ0Q4RUQpCisjZGVmaW5lIEVEQUNfRkxBR19TMTZFQ0QxNkVECUJJVChFREFDX1MxNkVDRDE2RUQpCisKKy8qIHNjcnViYmluZyBjYXBhYmlsaXRpZXMgKi8KK2VudW0gc2NydWJfdHlwZSB7CisJU0NSVUJfVU5LTk9XTiA9IDAsCS8qIFVua25vd24gaWYgc2NydWJiZXIgaXMgYXZhaWxhYmxlICovCisJU0NSVUJfTk9ORSwJCS8qIE5vIHNjcnViYmVyICovCisJU0NSVUJfU1dfUFJPRywJCS8qIFNXIHByb2dyZXNzaXZlIChzZXF1ZW50aWFsKSBzY3J1YmJpbmcgKi8KKwlTQ1JVQl9TV19TUkMsCQkvKiBTb2Z0d2FyZSBzY3J1YiBvbmx5IGVycm9ycyAqLworCVNDUlVCX1NXX1BST0dfU1JDLAkvKiBQcm9ncmVzc2l2ZSBzb2Z0d2FyZSBzY3J1YiBmcm9tIGFuIGVycm9yICovCisJU0NSVUJfU1dfVFVOQUJMRSwJLyogU29mdHdhcmUgc2NydWIgZnJlcXVlbmN5IGlzIHR1bmFibGUgKi8KKwlTQ1JVQl9IV19QUk9HLAkJLyogSFcgcHJvZ3Jlc3NpdmUgKHNlcXVlbnRpYWwpIHNjcnViYmluZyAqLworCVNDUlVCX0hXX1NSQywJCS8qIEhhcmR3YXJlIHNjcnViIG9ubHkgZXJyb3JzICovCisJU0NSVUJfSFdfUFJPR19TUkMsCS8qIFByb2dyZXNzaXZlIGhhcmR3YXJlIHNjcnViIGZyb20gYW4gZXJyb3IgKi8KKwlTQ1JVQl9IV19UVU5BQkxFCS8qIEhhcmR3YXJlIHNjcnViIGZyZXF1ZW5jeSBpcyB0dW5hYmxlICovCit9OworCisjZGVmaW5lIFNDUlVCX0ZMQUdfU1dfUFJPRwlCSVQoU0NSVUJfU1dfUFJPRykKKyNkZWZpbmUgU0NSVUJfRkxBR19TV19TUkMJQklUKFNDUlVCX1NXX1NSQykKKyNkZWZpbmUgU0NSVUJfRkxBR19TV19QUk9HX1NSQwlCSVQoU0NSVUJfU1dfUFJPR19TUkMpCisjZGVmaW5lIFNDUlVCX0ZMQUdfU1dfVFVOCUJJVChTQ1JVQl9TV19TQ1JVQl9UVU5BQkxFKQorI2RlZmluZSBTQ1JVQl9GTEFHX0hXX1BST0cJQklUKFNDUlVCX0hXX1BST0cpCisjZGVmaW5lIFNDUlVCX0ZMQUdfSFdfU1JDCUJJVChTQ1JVQl9IV19TUkMpCisjZGVmaW5lIFNDUlVCX0ZMQUdfSFdfUFJPR19TUkMJQklUKFNDUlVCX0hXX1BST0dfU1JDKQorI2RlZmluZSBTQ1JVQl9GTEFHX0hXX1RVTglCSVQoU0NSVUJfSFdfVFVOQUJMRSkKKworLyogRklYTUUgLSBzaG91bGQgaGF2ZSBub3RpZnkgY2FwYWJpbGl0aWVzOiBOTUksIExPRywgUFJPQywgZXRjICovCisKKy8qIEVEQUMgaW50ZXJuYWwgb3BlcmF0aW9uIHN0YXRlcyAqLworI2RlZmluZQlPUF9BTExPQwkJMHgxMDAKKyNkZWZpbmUgT1BfUlVOTklOR19QT0xMCQkweDIwMQorI2RlZmluZSBPUF9SVU5OSU5HX0lOVEVSUlVQVAkweDIwMgorI2RlZmluZSBPUF9SVU5OSU5HX1BPTExfSU5UUgkweDIwMworI2RlZmluZSBPUF9PRkZMSU5FCQkweDMwMAorCisvKgorICogVGhlcmUgYXJlIHNldmVyYWwgdGhpbmdzIHRvIGJlIGF3YXJlIG9mIHRoYXQgYXJlbid0IGF0IGFsbCBvYnZpb3VzOgorICoKKyAqCisgKiBTT0NLRVRTLCBTT0NLRVQgU0VUUywgQkFOS1MsIFJPV1MsIENISVAtU0VMRUNUIFJPV1MsIENIQU5ORUxTLCBldGMuLgorICoKKyAqIFRoZXNlIGFyZSBzb21lIG9mIHRoZSBtYW55IHRlcm1zIHRoYXQgYXJlIHRocm93biBhYm91dCB0aGF0IGRvbid0IGFsd2F5cworICogbWVhbiB3aGF0IHBlb3BsZSB0aGluayB0aGV5IG1lYW4gKEluY29uY2VpdmFibGUhKS4gIEluIHRoZSBpbnRlcmVzdCBvZgorICogY3JlYXRpbmcgYSBjb21tb24gZ3JvdW5kIGZvciBkaXNjdXNzaW9uLCB0ZXJtcyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMKKyAqIHdpbGwgYmUgZXN0YWJsaXNoZWQuCisgKgorICogTWVtb3J5IGRldmljZXM6CVRoZSBpbmRpdmlkdWFsIGNoaXAgb24gYSBtZW1vcnkgc3RpY2suICBUaGVzZSBkZXZpY2VzCisgKgkJCWNvbW1vbmx5IG91dHB1dCA0IGFuZCA4IGJpdHMgZWFjaC4gIEdyb3VwaW5nIHNldmVyYWwKKyAqCQkJb2YgdGhlc2UgaW4gcGFyYWxsZWwgcHJvdmlkZXMgNjQgYml0cyB3aGljaCBpcyBjb21tb24KKyAqCQkJZm9yIGEgbWVtb3J5IHN0aWNrLgorICoKKyAqIE1lbW9yeSBTdGljazoJQSBwcmludGVkIGNpcmN1aXQgYm9hcmQgdGhhdCBhZ2dyZWdhdGVzIG11bHRpcGxlCisgKgkJCW1lbW9yeSBkZXZpY2VzIGluIHBhcmFsbGVsLiAgVGhpcyBpcyB0aGUgYXRvbWljCisgKgkJCW1lbW9yeSBjb21wb25lbnQgdGhhdCBpcyBwdXJjaGFzZWFibGUgYnkgSm9lIGNvbnN1bWVyCisgKgkJCWFuZCBsb2FkZWQgaW50byBhIG1lbW9yeSBzb2NrZXQuCisgKgorICogU29ja2V0OgkJQSBwaHlzaWNhbCBjb25uZWN0b3Igb24gdGhlIG1vdGhlcmJvYXJkIHRoYXQgYWNjZXB0cworICoJCQlhIHNpbmdsZSBtZW1vcnkgc3RpY2suCisgKgorICogQ2hhbm5lbDoJCVNldCBvZiBtZW1vcnkgZGV2aWNlcyBvbiBhIG1lbW9yeSBzdGljayB0aGF0IG11c3QgYmUKKyAqCQkJZ3JvdXBlZCBpbiBwYXJhbGxlbCB3aXRoIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwKKyAqCQkJY2hhbm5lbHMgZnJvbSBvdGhlciBtZW1vcnkgc3RpY2tzLiAgVGhpcyBwYXJhbGxlbAorICoJCQlncm91cGluZyBvZiB0aGUgb3V0cHV0IGZyb20gbXVsdGlwbGUgY2hhbm5lbHMgYXJlCisgKgkJCW5lY2Vzc2FyeSBmb3IgdGhlIHNtYWxsZXN0IGdyYW51bGFyaXR5IG9mIG1lbW9yeSBhY2Nlc3MuCisgKgkJCVNvbWUgbWVtb3J5IGNvbnRyb2xsZXJzIGFyZSBjYXBhYmxlIG9mIHNpbmdsZSBjaGFubmVsIC0KKyAqCQkJd2hpY2ggbWVhbnMgdGhhdCBtZW1vcnkgc3RpY2tzIGNhbiBiZSBsb2FkZWQKKyAqCQkJaW5kaXZpZHVhbGx5LiAgT3RoZXIgbWVtb3J5IGNvbnRyb2xsZXJzIGFyZSBvbmx5CisgKgkJCWNhcGFibGUgb2YgZHVhbCBjaGFubmVsIC0gd2hpY2ggbWVhbnMgdGhhdCBtZW1vcnkKKyAqCQkJc3RpY2tzIG11c3QgYmUgbG9hZGVkIGFzIHBhaXJzIChzZWUgInNvY2tldCBzZXQiKS4KKyAqCisgKiBDaGlwLXNlbGVjdCByb3c6CUFsbCBvZiB0aGUgbWVtb3J5IGRldmljZXMgdGhhdCBhcmUgc2VsZWN0ZWQgdG9nZXRoZXIuCisgKgkJCWZvciBhIHNpbmdsZSwgbWluaW11bSBncmFpbiBvZiBtZW1vcnkgYWNjZXNzLgorICoJCQlUaGlzIHNlbGVjdHMgYWxsIG9mIHRoZSBwYXJhbGxlbCBtZW1vcnkgZGV2aWNlcyBhY3Jvc3MKKyAqCQkJYWxsIG9mIHRoZSBwYXJhbGxlbCBjaGFubmVscy4gIENvbW1vbiBjaGlwLXNlbGVjdCByb3dzCisgKgkJCWZvciBzaW5nbGUgY2hhbm5lbCBhcmUgNjQgYml0cywgZm9yIGR1YWwgY2hhbm5lbCAxMjgKKyAqCQkJYml0cy4KKyAqCisgKiBTaW5nbGUtUmFua2VkIHN0aWNrOglBIFNpbmdsZS1yYW5rZWQgc3RpY2sgaGFzIDEgY2hpcC1zZWxlY3Qgcm93IG9mIG1lbW9yeS4KKyAqCQkJTW90aGVyYm9hcmRzIGNvbW1vbmx5IGRyaXZlIHR3byBjaGlwLXNlbGVjdCBwaW5zIHRvCisgKgkJCWEgbWVtb3J5IHN0aWNrLiBBIHNpbmdsZS1yYW5rZWQgc3RpY2ssIHdpbGwgb2NjdXB5CisgKgkJCW9ubHkgb25lIG9mIHRob3NlIHJvd3MuIFRoZSBvdGhlciB3aWxsIGJlIHVudXNlZC4KKyAqCisgKiBEb3VibGUtUmFua2VkIHN0aWNrOglBIGRvdWJsZS1yYW5rZWQgc3RpY2sgaGFzIHR3byBjaGlwLXNlbGVjdCByb3dzIHdoaWNoCisgKgkJCWFjY2VzcyBkaWZmZXJlbnQgc2V0cyBvZiBtZW1vcnkgZGV2aWNlcy4gIFRoZSB0d28KKyAqCQkJcm93cyBjYW5ub3QgYmUgYWNjZXNzZWQgY29uY3VycmVudGx5LgorICoKKyAqIERvdWJsZS1zaWRlZCBzdGljazoJREVQUkVDQVRFRCBURVJNLCBzZWUgRG91YmxlLVJhbmtlZCBzdGljay4KKyAqCQkJQSBkb3VibGUtc2lkZWQgc3RpY2sgaGFzIHR3byBjaGlwLXNlbGVjdCByb3dzIHdoaWNoCisgKgkJCWFjY2VzcyBkaWZmZXJlbnQgc2V0cyBvZiBtZW1vcnkgZGV2aWNlcy4gIFRoZSB0d28KKyAqCQkJcm93cyBjYW5ub3QgYmUgYWNjZXNzZWQgY29uY3VycmVudGx5LiAgIkRvdWJsZS1zaWRlZCIKKyAqCQkJaXMgaXJyZXNwZWN0aXZlIG9mIHRoZSBtZW1vcnkgZGV2aWNlcyBiZWluZyBtb3VudGVkCisgKgkJCW9uIGJvdGggc2lkZXMgb2YgdGhlIG1lbW9yeSBzdGljay4KKyAqCisgKiBTb2NrZXQgc2V0OgkJQWxsIG9mIHRoZSBtZW1vcnkgc3RpY2tzIHRoYXQgYXJlIHJlcXVpcmVkIGZvcgorICoJCQlhIHNpbmdsZSBtZW1vcnkgYWNjZXNzIG9yIGFsbCBvZiB0aGUgbWVtb3J5IHN0aWNrcworICoJCQlzcGFubmVkIGJ5IGEgY2hpcC1zZWxlY3Qgcm93LiAgQSBzaW5nbGUgc29ja2V0IHNldAorICoJCQloYXMgdHdvIGNoaXAtc2VsZWN0IHJvd3MgYW5kIGlmIGRvdWJsZS1zaWRlZCBzdGlja3MKKyAqCQkJYXJlIHVzZWQgdGhlc2Ugd2lsbCBvY2N1cHkgdGhvc2UgY2hpcC1zZWxlY3Qgcm93cy4KKyAqCisgKiBCYW5rOgkJVGhpcyB0ZXJtIGlzIGF2b2lkZWQgYmVjYXVzZSBpdCBpcyB1bmNsZWFyIHdoZW4KKyAqCQkJbmVlZGluZyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGNoaXAtc2VsZWN0IHJvd3MgYW5kCisgKgkJCXNvY2tldCBzZXRzLgorICoKKyAqIENvbnRyb2xsZXIgcGFnZXM6CisgKgorICogUGh5c2ljYWwgcGFnZXM6CisgKgorICogVmlydHVhbCBwYWdlczoKKyAqCisgKgorICogU1RSVUNUVVJFIE9SR0FOSVpBVElPTiBBTkQgQ0hPSUNFUworICoKKyAqCisgKgorICogUFMgLSBJIGVuam95ZWQgd3JpdGluZyBhbGwgdGhhdCBhYm91dCBhcyBtdWNoIGFzIHlvdSBlbmpveWVkIHJlYWRpbmcgaXQuCisgKi8KKworc3RydWN0IGNoYW5uZWxfaW5mbyB7CisJaW50IGNoYW5faWR4OwkJLyogY2hhbm5lbCBpbmRleCAqLworCXUzMiBjZV9jb3VudDsJCS8qIENvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBDSEFOTkVMICovCisJY2hhciBsYWJlbFtFREFDX01DX0xBQkVMX0xFTiArIDFdOwkvKiBESU1NIGxhYmVsIG9uIG1vdGhlcmJvYXJkICovCisJc3RydWN0IGNzcm93X2luZm8gKmNzcm93OwkvKiB0aGUgcGFyZW50ICovCit9OworCitzdHJ1Y3QgY3Nyb3dfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9wYWdlOwkvKiBmaXJzdCBwYWdlIG51bWJlciBpbiBkaW1tICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3BhZ2U7CS8qIGxhc3QgcGFnZSBudW1iZXIgaW4gZGltbSAqLworCXVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrOwkvKiB1c2VkIGZvciBpbnRlcmxlYXZpbmcgLQorCQkJCQkgKiAwVUwgZm9yIG5vbiBpbnRsdgorCQkJCQkgKi8KKwl1MzIgbnJfcGFnZXM7CQkvKiBudW1iZXIgb2YgcGFnZXMgaW4gY3Nyb3cgKi8KKwl1MzIgZ3JhaW47CQkvKiBncmFudWxhcml0eSBvZiByZXBvcnRlZCBlcnJvciBpbiBieXRlcyAqLworCWludCBjc3Jvd19pZHg7CQkvKiB0aGUgY2hpcC1zZWxlY3Qgcm93ICovCisJZW51bSBkZXZfdHlwZSBkdHlwZTsJLyogbWVtb3J5IGRldmljZSB0eXBlICovCisJdTMyIHVlX2NvdW50OwkJLyogVW5jb3JyZWN0YWJsZSBFcnJvcnMgZm9yIHRoaXMgY3Nyb3cgKi8KKwl1MzIgY2VfY291bnQ7CQkvKiBDb3JyZWN0YWJsZSBFcnJvcnMgZm9yIHRoaXMgY3Nyb3cgKi8KKwllbnVtIG1lbV90eXBlIG10eXBlOwkvKiBtZW1vcnkgY3Nyb3cgdHlwZSAqLworCWVudW0gZWRhY190eXBlIGVkYWNfbW9kZTsJLyogRURBQyBtb2RlIGZvciB0aGlzIGNzcm93ICovCisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOwkvKiB0aGUgcGFyZW50ICovCisKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOwkvKiBzeXNmcyBrb2JqZWN0IGZvciB0aGlzIGNzcm93ICovCisKKwkvKiBjaGFubmVsIGluZm9ybWF0aW9uIGZvciB0aGlzIGNzcm93ICovCisJdTMyIG5yX2NoYW5uZWxzOworCXN0cnVjdCBjaGFubmVsX2luZm8gKmNoYW5uZWxzOworfTsKKworc3RydWN0IG1jaWRldl9zeXNmc19ncm91cCB7CisJY29uc3QgY2hhciAqbmFtZTsJCQkJLyogZ3JvdXAgbmFtZSAqLworCWNvbnN0IHN0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlICptY2lkZXZfYXR0cjsgLyogZ3JvdXAgYXR0cmlidXRlcyAqLworfTsKKworc3RydWN0IG1jaWRldl9zeXNmc19ncm91cF9rb2JqIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBsaXN0IGZvciBhbGwgaW5zdGFuY2VzIHdpdGhpbiBhIG1jICovCisKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOwkJLyoga29iaiBmb3IgdGhlIGdyb3VwICovCisKKwljb25zdCBzdHJ1Y3QgbWNpZGV2X3N5c2ZzX2dyb3VwICpncnA7CS8qIGdyb3VwIGRlc2NyaXB0aW9uIHRhYmxlICovCisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOwkvKiB0aGUgcGFyZW50ICovCit9OworCisvKiBtY2lkZXZfc3lzZnNfYXR0cmlidXRlIHN0cnVjdHVyZQorICoJdXNlZCBmb3IgZHJpdmVyIHN5c2ZzIGF0dHJpYnV0ZXMgYW5kIGluIG1lbV9jdGxfaW5mbworICogCXN5c2ZzIHRvcCBsZXZlbCBlbnRyaWVzCisgKi8KK3N0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlIHsKKwkvKiBJdCBzaG91bGQgdXNlIGVpdGhlciBhdHRyIG9yIGdycCAqLworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwljb25zdCBzdHJ1Y3QgbWNpZGV2X3N5c2ZzX2dyb3VwICpncnA7CS8qIFBvaW50cyB0byBhIGdyb3VwIG9mIGF0dHJpYnV0ZXMgKi8KKworCS8qIE9wcyBmb3Igc2hvdy9zdG9yZSB2YWx1ZXMgYXQgdGhlIGF0dHJpYnV0ZSAtIG5vdCB1c2VkIG9uIGdyb3VwICovCisgICAgICAgIHNzaXplX3QgKCpzaG93KShzdHJ1Y3QgbWVtX2N0bF9pbmZvICosY2hhciAqKTsKKyAgICAgICAgc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgbWVtX2N0bF9pbmZvICosIGNvbnN0IGNoYXIgKixzaXplX3QpOworfTsKKworLyogTUVNT1JZIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKi8KK3N0cnVjdCBtZW1fY3RsX2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsJLyogZm9yIGdsb2JhbCBsaXN0IG9mIG1lbV9jdGxfaW5mbyBzdHJ1Y3RzICovCisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsJLyogTW9kdWxlIG93bmVyIG9mIHRoaXMgY29udHJvbCBzdHJ1Y3QgKi8KKworCXVuc2lnbmVkIGxvbmcgbXR5cGVfY2FwOwkvKiBtZW1vcnkgdHlwZXMgc3VwcG9ydGVkIGJ5IG1jICovCisJdW5zaWduZWQgbG9uZyBlZGFjX2N0bF9jYXA7CS8qIE1lbSBjb250cm9sbGVyIEVEQUMgY2FwYWJpbGl0aWVzICovCisJdW5zaWduZWQgbG9uZyBlZGFjX2NhcDsJLyogY29uZmlndXJhdGlvbiBjYXBhYmlsaXRpZXMgLSB0aGlzIGlzCisJCQkJICogY2xvc2VseSByZWxhdGVkIHRvIGVkYWNfY3RsX2NhcC4gIFRoZQorCQkJCSAqIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgY29udHJvbGxlciBtYXkgYmUKKwkJCQkgKiBjYXBhYmxlIG9mIHM0ZWNkNGVkIHdoaWNoIHdvdWxkIGJlIGxpc3RlZAorCQkJCSAqIGluIGVkYWNfY3RsX2NhcCwgYnV0IGlmIGNoYW5uZWxzIGFyZW4ndAorCQkJCSAqIGNhcGFibGUgb2YgczRlY2Q0ZWQgdGhlbiB0aGUgZWRhY19jYXAgd291bGQKKwkJCQkgKiBub3QgaGF2ZSB0aGF0IGNhcGFiaWxpdHkuCisJCQkJICovCisJdW5zaWduZWQgbG9uZyBzY3J1Yl9jYXA7CS8qIGNoaXBzZXQgc2NydWIgY2FwYWJpbGl0aWVzICovCisJZW51bSBzY3J1Yl90eXBlIHNjcnViX21vZGU7CS8qIGN1cnJlbnQgc2NydWIgbW9kZSAqLworCisJLyogVHJhbnNsYXRlcyBzZHJhbSBtZW1vcnkgc2NydWIgcmF0ZSBnaXZlbiBpbiBieXRlcy9zZWMgdG8gdGhlCisJICAgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gYW5kIGNvbmZpZ3VyZXMgd2hhdGV2ZXIgZWxzZSBuZWVkcworCSAgIHRvIGJlIGNvbmZpZ3VyZWQuCisJICovCisJaW50ICgqc2V0X3NkcmFtX3NjcnViX3JhdGUpIChzdHJ1Y3QgbWVtX2N0bF9pbmZvICogbWNpLCB1MzIgYncpOworCisJLyogR2V0IHRoZSBjdXJyZW50IHNkcmFtIG1lbW9yeSBzY3J1YiByYXRlIGZyb20gdGhlIGludGVybmFsCisJICAgcmVwcmVzZW50YXRpb24gYW5kIGNvbnZlcnRzIGl0IHRvIHRoZSBjbG9zZXN0IG1hdGNoaW5nCisJICAgYmFuZHdpZHRoIGluIGJ5dGVzL3NlYy4KKwkgKi8KKwlpbnQgKCpnZXRfc2RyYW1fc2NydWJfcmF0ZSkgKHN0cnVjdCBtZW1fY3RsX2luZm8gKiBtY2kpOworCisKKwkvKiBwb2ludGVyIHRvIGVkYWMgY2hlY2tpbmcgcm91dGluZSAqLworCXZvaWQgKCplZGFjX2NoZWNrKSAoc3RydWN0IG1lbV9jdGxfaW5mbyAqIG1jaSk7CisKKwkvKgorCSAqIFJlbWFwcyBtZW1vcnkgcGFnZXM6IGNvbnRyb2xsZXIgcGFnZXMgdG8gcGh5c2ljYWwgcGFnZXMuCisJICogRm9yIG1vc3QgTUMncywgdGhpcyB3aWxsIGJlIE5VTEwuCisJICovCisJLyogRklYTUUgLSB3aHkgbm90IHNlbmQgdGhlIHBoeXMgcGFnZSB0byBiZWdpbiB3aXRoPyAqLworCXVuc2lnbmVkIGxvbmcgKCpjdGxfcGFnZV90b19waHlzKSAoc3RydWN0IG1lbV9jdGxfaW5mbyAqIG1jaSwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBwYWdlKTsKKwlpbnQgbWNfaWR4OworCWludCBucl9jc3Jvd3M7CisJc3RydWN0IGNzcm93X2luZm8gKmNzcm93czsKKwkvKgorCSAqIEZJWE1FIC0gd2hhdCBhYm91dCBjb250cm9sbGVycyBvbiBvdGhlciBidXNzZXM/IC0gSURzIG11c3QgYmUKKwkgKiB1bmlxdWUuICBkZXYgcG9pbnRlciBzaG91bGQgYmUgc3VmZmljaWVudGx5IHVuaXF1ZSwgYnV0CisJICogQlVTOlNMT1QuRlVOQyBudW1iZXJzIG1heSBub3QgYmUgdW5pcXVlLgorCSAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwljb25zdCBjaGFyICptb2RfbmFtZTsKKwljb25zdCBjaGFyICptb2RfdmVyOworCWNvbnN0IGNoYXIgKmN0bF9uYW1lOworCWNvbnN0IGNoYXIgKmRldl9uYW1lOworCWNoYXIgcHJvY19uYW1lW01DX1BST0NfTkFNRV9NQVhfTEVOICsgMV07CisJdm9pZCAqcHZ0X2luZm87CisJdTMyIHVlX25vaW5mb19jb3VudDsJLyogVW5jb3JyZWN0YWJsZSBFcnJvcnMgdy9vIGluZm8gKi8KKwl1MzIgY2Vfbm9pbmZvX2NvdW50OwkvKiBDb3JyZWN0YWJsZSBFcnJvcnMgdy9vIGluZm8gKi8KKwl1MzIgdWVfY291bnQ7CQkvKiBUb3RhbCBVbmNvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBNQyAqLworCXUzMiBjZV9jb3VudDsJCS8qIFRvdGFsIENvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBNQyAqLworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsJLyogbWNpIGxvYWQgc3RhcnQgdGltZSAoaW4gamlmZmllcykgKi8KKworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRlOworCisJLyogZWRhYyBzeXNmcyBkZXZpY2UgY29udHJvbCAqLworCXN0cnVjdCBrb2JqZWN0IGVkYWNfbWNpX2tvYmo7CisKKwkvKiBsaXN0IGZvciBhbGwgZ3JwIGluc3RhbmNlcyB3aXRoaW4gYSBtYyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZ3JwX2tvYmpfbGlzdDsKKworCS8qIEFkZGl0aW9uYWwgdG9wIGNvbnRyb2xsZXIgbGV2ZWwgYXR0cmlidXRlcywgYnV0IHNwZWNpZmllZAorCSAqIGJ5IHRoZSBsb3cgbGV2ZWwgZHJpdmVyLgorCSAqCisJICogU2V0IGJ5IHRoZSBsb3cgbGV2ZWwgZHJpdmVyIHRvIHByb3ZpZGUgYXR0cmlidXRlcyBhdCB0aGUKKwkgKiBjb250cm9sbGVyIGxldmVsLCBzYW1lIGxldmVsIGFzICd1ZV9jb3VudCcgYW5kICdjZV9jb3VudCcgYWJvdmUuCisJICogQW4gYXJyYXkgb2Ygc3RydWN0dXJlcywgTlVMTCB0ZXJtaW5hdGVkCisJICoKKwkgKiBJZiBhdHRyaWJ1dGVzIGFyZSBkZXNpcmVkLCB0aGVuIHNldCB0byBhcnJheSBvZiBhdHRyaWJ1dGVzCisJICogSWYgbm8gYXR0cmlidXRlcyBhcmUgZGVzaXJlZCwgbGVhdmUgTlVMTAorCSAqLworCWNvbnN0IHN0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlICptY19kcml2ZXJfc3lzZnNfYXR0cmlidXRlczsKKworCS8qIHdvcmsgc3RydWN0IGZvciB0aGlzIE1DICovCisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOworCisJLyogdGhlIGludGVybmFsIHN0YXRlIG9mIHRoaXMgY29udHJvbGxlciBpbnN0YW5jZSAqLworCWludCBvcF9zdGF0ZTsKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lZGFjX21jZS5oIGIvaW5jbHVkZS9saW51eC9lZGFjX21jZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTc0ZmMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvZWRhY19tY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIFByb3ZpZGVzIGVkYWMgaW50ZXJmYWNlIHRvIG1jZWxvZyBldmVudHMKLSAqCi0gKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnk6Ci0gKgkgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Ci0gKgotICogUmVkIEhhdCBJbmMuIGh0dHA6Ly93d3cucmVkaGF0LmNvbQotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19FREFDX01DRSkgfHwgXAotCQkJKGRlZmluZWQoQ09ORklHX0VEQUNfTUNFX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotCi0jaW5jbHVkZSA8YXNtL21jZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLQotc3RydWN0IGVkYWNfbWNlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQl2b2lkICpwcml2OwotCWludCAoKmNoZWNrX2Vycm9yKSh2b2lkICpwcml2LCBzdHJ1Y3QgbWNlICptY2UpOwotfTsKLQotaW50IGVkYWNfbWNlX3JlZ2lzdGVyKHN0cnVjdCBlZGFjX21jZSAqZWRhY19tY2UpOwotdm9pZCBlZGFjX21jZV91bnJlZ2lzdGVyKHN0cnVjdCBlZGFjX21jZSAqZWRhY19tY2UpOwotaW50IGVkYWNfbWNlX3BhcnNlKHN0cnVjdCBtY2UgKm1jZSk7Ci0KLSNlbHNlCi0jZGVmaW5lIGVkYWNfbWNlX3BhcnNlKG1jZSkgKDApCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaCBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAppbmRleCBkODAwZDUxLi4xZDBmN2EyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCkBAIC0zOCw2ICszOCwxMiBAQAogCWVsZXZhdG9yX21lcmdlZF9mbiAqZWxldmF0b3JfbWVyZ2VkX2ZuOwogCWVsZXZhdG9yX21lcmdlX3JlcV9mbiAqZWxldmF0b3JfbWVyZ2VfcmVxX2ZuOwogCWVsZXZhdG9yX2FsbG93X21lcmdlX2ZuICplbGV2YXRvcl9hbGxvd19tZXJnZV9mbjsKKworCS8qCisJICogVXNlZCBmb3IgYm90aCBwbHVnZ2VkIGxpc3QgYW5kIGVsZXZhdG9yIG1lcmdpbmcgYW5kIGluIHRoZQorCSAqIGZvcm1lciBjYXNlIGNhbGxlZCB3aXRob3V0IHF1ZXVlX2xvY2suICBSZWFkIGNvbW1lbnQgb24gdG9wIG9mCisJICogYXR0ZW1wdF9wbHVnX21lcmdlKCkgZm9yIGRldGFpbHMuCisJICovCiAJZWxldmF0b3JfYmlvX21lcmdlZF9mbiAqZWxldmF0b3JfYmlvX21lcmdlZF9mbjsKIAogCWVsZXZhdG9yX2Rpc3BhdGNoX2ZuICplbGV2YXRvcl9kaXNwYXRjaF9mbjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxmLmggYi9pbmNsdWRlL2xpbnV4L2VsZi5oCmluZGV4IDExMDgyMWMuLjMxZjA1MDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWxmLmgKKysrIGIvaW5jbHVkZS9saW51eC9lbGYuaApAQCAtMzk1LDYgKzM5NSw3IEBACiAjZGVmaW5lIE5UX1MzOTBfQ1RSUwkweDMwNAkJLyogczM5MCBjb250cm9sIHJlZ2lzdGVycyAqLwogI2RlZmluZSBOVF9TMzkwX1BSRUZJWAkweDMwNQkJLyogczM5MCBwcmVmaXggcmVnaXN0ZXIgKi8KICNkZWZpbmUgTlRfUzM5MF9MQVNUX0JSRUFLCTB4MzA2CS8qIHMzOTAgYnJlYWtpbmcgZXZlbnQgYWRkcmVzcyAqLworI2RlZmluZSBOVF9TMzkwX1NZU1RFTV9DQUxMCTB4MzA3CS8qIHMzOTAgc3lzdGVtIGNhbGwgcmVzdGFydCBkYXRhICovCiAjZGVmaW5lIE5UX0FSTV9WRlAJMHg0MDAJCS8qIEFSTSBWRlAvTkVPTiByZWdpc3RlcnMgKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VycnF1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L2VycnF1ZXVlLmgKaW5kZXggMDM0MDcyYy4uYzlmNTIyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lcnJxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZXJycXVldWUuaApAQCAtMTcsNyArMTcsOCBAQAogI2RlZmluZSBTT19FRV9PUklHSU5fTE9DQUwJMQogI2RlZmluZSBTT19FRV9PUklHSU5fSUNNUAkyCiAjZGVmaW5lIFNPX0VFX09SSUdJTl9JQ01QNgkzCi0jZGVmaW5lIFNPX0VFX09SSUdJTl9USU1FU1RBTVBJTkcgNAorI2RlZmluZSBTT19FRV9PUklHSU5fVFhTVEFUVVMJNAorI2RlZmluZSBTT19FRV9PUklHSU5fVElNRVNUQU1QSU5HIFNPX0VFX09SSUdJTl9UWFNUQVRVUwogCiAjZGVmaW5lIFNPX0VFX09GRkVOREVSKGVlKQkoKHN0cnVjdCBzb2NrYWRkciopKChlZSkrMSkpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXRodG9vbC5oIGIvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKaW5kZXggNDVmMDBiNi4uZGUzM2RlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKKysrIGIvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKQEAgLTEwOTcsMTAgKzEwOTcsMTIgQEAKICNkZWZpbmUgU1BFRURfMTAwMAkJMTAwMAogI2RlZmluZSBTUEVFRF8yNTAwCQkyNTAwCiAjZGVmaW5lIFNQRUVEXzEwMDAwCQkxMDAwMAorI2RlZmluZSBTUEVFRF9VTktOT1dOCQktMQogCiAvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbC4gKi8KICNkZWZpbmUgRFVQTEVYX0hBTEYJCTB4MDAKICNkZWZpbmUgRFVQTEVYX0ZVTEwJCTB4MDEKKyNkZWZpbmUgRFVQTEVYX1VOS05PV04JCTB4ZmYKIAogLyogV2hpY2ggY29ubmVjdG9yIHBvcnQuICovCiAjZGVmaW5lIFBPUlRfVFAJCQkweDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4cG9ydC5oIGIvaW5jbHVkZS9saW51eC9leHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTZjMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9leHBvcnQuaApAQCAtMCwwICsxLDg5IEBACisjaWZuZGVmIF9MSU5VWF9FWFBPUlRfSAorI2RlZmluZSBfTElOVVhfRVhQT1JUX0gKKy8qCisgKiBFeHBvcnQgc3ltYm9scyBmcm9tIHRoZSBrZXJuZWwgdG8gbW9kdWxlcy4gIEZvcmtlZCBmcm9tIG1vZHVsZS5oCisgKiB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBwb2ludGxlc3MgY3J1ZnQgd2UgZmVlZCB0byBnY2Mgd2hlbiBvbmx5CisgKiBleHBvcnRpbmcgYSBzaW1wbGUgc3ltYm9sIG9yIHR3by4KKyAqCisgKiBJZiB5b3UgZmVlbCB0aGUgbmVlZCB0byBhZGQgI2luY2x1ZGUgPGxpbnV4L2Zvby5oPiB0byB0aGlzIGZpbGUKKyAqIHRoZW4geW91IGFyZSBkb2luZyBzb21ldGhpbmcgd3JvbmcgYW5kIHNob3VsZCBnbyBhd2F5IHNpbGVudGx5LgorICovCisKKy8qIFNvbWUgdG9vbGNoYWlucyB1c2UgYSBgXycgcHJlZml4IGZvciBhbGwgdXNlciBzeW1ib2xzLiAqLworI2lmZGVmIENPTkZJR19TWU1CT0xfUFJFRklYCisjZGVmaW5lIE1PRFVMRV9TWU1CT0xfUFJFRklYIENPTkZJR19TWU1CT0xfUFJFRklYCisjZWxzZQorI2RlZmluZSBNT0RVTEVfU1lNQk9MX1BSRUZJWCAiIgorI2VuZGlmCisKK3N0cnVjdCBrZXJuZWxfc3ltYm9sCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworI2lmZGVmIE1PRFVMRQorZXh0ZXJuIHN0cnVjdCBtb2R1bGUgX190aGlzX21vZHVsZTsKKyNkZWZpbmUgVEhJU19NT0RVTEUgKCZfX3RoaXNfbW9kdWxlKQorI2Vsc2UKKyNkZWZpbmUgVEhJU19NT0RVTEUgKChzdHJ1Y3QgbW9kdWxlICopMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKworI2lmbmRlZiBfX0dFTktTWU1TX18KKyNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKy8qIE1hcmsgdGhlIENSQyB3ZWFrIHNpbmNlIGdlbmtzeW1zIGFwcGFyZW50bHkgZGVjaWRlcyBub3QgdG8KKyAqIGdlbmVyYXRlIGEgY2hlY2tzdW1zIGZvciBzb21lIHN5bWJvbHMgKi8KKyNkZWZpbmUgX19DUkNfU1lNQk9MKHN5bSwgc2VjKQkJCQkJXAorCWV4dGVybiB2b2lkICpfX2NyY18jI3N5bSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CQlcCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgX19rY3JjdGFiXyMjc3ltCQlcCisJX191c2VkCQkJCQkJCVwKKwlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX19rY3JjdGFiIiBzZWMgIisiICNzeW0pLCB1bnVzZWQpKQlcCisJPSAodW5zaWduZWQgbG9uZykgJl9fY3JjXyMjc3ltOworI2Vsc2UKKyNkZWZpbmUgX19DUkNfU1lNQk9MKHN5bSwgc2VjKQorI2VuZGlmCisKKy8qIEZvciBldmVyeSBleHBvcnRlZCBzeW1ib2wsIHBsYWNlIGEgc3RydWN0IGluIHRoZSBfX2tzeW10YWIgc2VjdGlvbiAqLworI2RlZmluZSBfX0VYUE9SVF9TWU1CT0woc3ltLCBzZWMpCQkJCVwKKwlleHRlcm4gdHlwZW9mKHN5bSkgc3ltOwkJCQkJXAorCV9fQ1JDX1NZTUJPTChzeW0sIHNlYykJCQkJCVwKKwlzdGF0aWMgY29uc3QgY2hhciBfX2tzdHJ0YWJfIyNzeW1bXQkJCVwKKwlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX2tzeW10YWJfc3RyaW5ncyIpLCBhbGlnbmVkKDEpKSkgXAorCT0gTU9EVUxFX1NZTUJPTF9QUkVGSVggI3N5bTsJCQkJXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCBfX2tzeW10YWJfIyNzeW0JXAorCV9fdXNlZAkJCQkJCQlcCisJX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX19fa3N5bXRhYiIgc2VjICIrIiAjc3ltKSwgdW51c2VkKSkJXAorCT0geyAodW5zaWduZWQgbG9uZykmc3ltLCBfX2tzdHJ0YWJfIyNzeW0gfQorCisjZGVmaW5lIEVYUE9SVF9TWU1CT0woc3ltKQkJCQkJXAorCV9fRVhQT1JUX1NZTUJPTChzeW0sICIiKQorCisjZGVmaW5lIEVYUE9SVF9TWU1CT0xfR1BMKHN5bSkJCQkJCVwKKwlfX0VYUE9SVF9TWU1CT0woc3ltLCAiX2dwbCIpCisKKyNkZWZpbmUgRVhQT1JUX1NZTUJPTF9HUExfRlVUVVJFKHN5bSkJCQkJXAorCV9fRVhQT1JUX1NZTUJPTChzeW0sICJfZ3BsX2Z1dHVyZSIpCisKKyNpZmRlZiBDT05GSUdfVU5VU0VEX1NZTUJPTFMKKyNkZWZpbmUgRVhQT1JUX1VOVVNFRF9TWU1CT0woc3ltKSBfX0VYUE9SVF9TWU1CT0woc3ltLCAiX3VudXNlZCIpCisjZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MX0dQTChzeW0pIF9fRVhQT1JUX1NZTUJPTChzeW0sICJfdW51c2VkX2dwbCIpCisjZWxzZQorI2RlZmluZSBFWFBPUlRfVU5VU0VEX1NZTUJPTChzeW0pCisjZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MX0dQTChzeW0pCisjZW5kaWYKKworI2VuZGlmCS8qIF9fR0VOS1NZTVNfXyAqLworCisjZWxzZSAvKiAhQ09ORklHX01PRFVMRVMuLi4gKi8KKworI2RlZmluZSBFWFBPUlRfU1lNQk9MKHN5bSkKKyNkZWZpbmUgRVhQT1JUX1NZTUJPTF9HUEwoc3ltKQorI2RlZmluZSBFWFBPUlRfU1lNQk9MX0dQTF9GVVRVUkUoc3ltKQorI2RlZmluZSBFWFBPUlRfVU5VU0VEX1NZTUJPTChzeW0pCisjZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MX0dQTChzeW0pCisKKyNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLworCisjZW5kaWYgLyogX0xJTlVYX0VYUE9SVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCmluZGV4IDUzNzkyYmYuLmNlMWI3MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCkBAIC0xOTcsOCArMTk3LDggQEAKIAogLyogRmxhZ3MgdGhhdCBzaG91bGQgYmUgaW5oZXJpdGVkIGJ5IG5ldyBpbm9kZXMgZnJvbSB0aGVpciBwYXJlbnQuICovCiAjZGVmaW5lIEVYVDJfRkxfSU5IRVJJVEVEIChFWFQyX1NFQ1JNX0ZMIHwgRVhUMl9VTlJNX0ZMIHwgRVhUMl9DT01QUl9GTCB8XAotCQkJICAgRVhUMl9TWU5DX0ZMIHwgRVhUMl9JTU1VVEFCTEVfRkwgfCBFWFQyX0FQUEVORF9GTCB8XAotCQkJICAgRVhUMl9OT0RVTVBfRkwgfCBFWFQyX05PQVRJTUVfRkwgfCBFWFQyX0NPTVBSQkxLX0ZMfFwKKwkJCSAgIEVYVDJfU1lOQ19GTCB8IEVYVDJfTk9EVU1QX0ZMIHxcCisJCQkgICBFWFQyX05PQVRJTUVfRkwgfCBFWFQyX0NPTVBSQkxLX0ZMIHxcCiAJCQkgICBFWFQyX05PQ09NUF9GTCB8IEVYVDJfSk9VUk5BTF9EQVRBX0ZMIHxcCiAJCQkgICBFWFQyX05PVEFJTF9GTCB8IEVYVDJfRElSU1lOQ19GTCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAppbmRleCA2N2E4MDNhLi5kZWM5OTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaApAQCAtMTgwLDggKzE4MCw4IEBACiAKIC8qIEZsYWdzIHRoYXQgc2hvdWxkIGJlIGluaGVyaXRlZCBieSBuZXcgaW5vZGVzIGZyb20gdGhlaXIgcGFyZW50LiAqLwogI2RlZmluZSBFWFQzX0ZMX0lOSEVSSVRFRCAoRVhUM19TRUNSTV9GTCB8IEVYVDNfVU5STV9GTCB8IEVYVDNfQ09NUFJfRkwgfFwKLQkJCSAgIEVYVDNfU1lOQ19GTCB8IEVYVDNfSU1NVVRBQkxFX0ZMIHwgRVhUM19BUFBFTkRfRkwgfFwKLQkJCSAgIEVYVDNfTk9EVU1QX0ZMIHwgRVhUM19OT0FUSU1FX0ZMIHwgRVhUM19DT01QUkJMS19GTHxcCisJCQkgICBFWFQzX1NZTkNfRkwgfCBFWFQzX05PRFVNUF9GTCB8XAorCQkJICAgRVhUM19OT0FUSU1FX0ZMIHwgRVhUM19DT01QUkJMS19GTCB8XAogCQkJICAgRVhUM19OT0NPTVBSX0ZMIHwgRVhUM19KT1VSTkFMX0RBVEFfRkwgfFwKIAkJCSAgIEVYVDNfTk9UQUlMX0ZMIHwgRVhUM19ESVJTWU5DX0ZMKQogCkBAIC0zODEsNyArMzgxLDcgQEAKICAqIE1vdW50IGZsYWdzCiAgKi8KICNkZWZpbmUgRVhUM19NT1VOVF9DSEVDSwkJMHgwMDAwMQkvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLwotI2RlZmluZSBFWFQzX01PVU5UX09MREFMTE9DCQkweDAwMDAyICAvKiBEb24ndCB1c2UgdGhlIG5ldyBPcmxvdiBhbGxvY2F0b3IgKi8KKy8qIEVYVDNfTU9VTlRfT0xEQUxMT0Mgd2FzIHRoZXJlICovCiAjZGVmaW5lIEVYVDNfTU9VTlRfR1JQSUQJCTB4MDAwMDQJLyogQ3JlYXRlIGZpbGVzIHdpdGggZGlyZWN0b3J5J3MgZ3JvdXAgKi8KICNkZWZpbmUgRVhUM19NT1VOVF9ERUJVRwkJMHgwMDAwOAkvKiBTb21lIGRlYnVnZ2luZyBtZXNzYWdlcyAqLwogI2RlZmluZSBFWFQzX01PVU5UX0VSUk9SU19DT05UCQkweDAwMDEwCS8qIENvbnRpbnVlIG9uIGVycm9ycyAqLwpAQCAtOTM3LDE1ICs5MzcsMTUgQEAKIAkJCQlleHQzX2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQpOwogCiAvKiBzdXBlci5jICovCi1leHRlcm4gdm9pZCBleHQzX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0M19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CiBleHRlcm4gdm9pZCBfX2V4dDNfc3RkX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZXh0M19hYm9ydCAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIHZvaWQgZXh0M193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gdm9pZCBleHQzX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0M19hYm9ydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0M193YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KQordm9pZCBleHQzX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CiBleHRlcm4gdm9pZCBleHQzX3VwZGF0ZV9keW5hbWljX3JldiAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKICNkZWZpbmUgZXh0M19zdGRfZXJyb3Ioc2IsIGVycm5vKQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCmluZGV4IDI1ODA4OGEuLjY0MzY1MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCkBAIC03NiwxMCArNzYsNiBAQAogCXN0cnVjdCBtdXRleCBzX3Jlc2l6ZV9sb2NrOwogCXVuc2lnbmVkIGxvbmcgc19jb21taXRfaW50ZXJ2YWw7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqam91cm5hbF9iZGV2OwotI2lmZGVmIENPTkZJR19KQkRfREVCVUcKLQlzdHJ1Y3QgdGltZXJfbGlzdCB0dXJuX3JvX3RpbWVyOwkvKiBGb3IgdHVybmluZyByZWFkLW9ubHkgKGNyYXNoIHNpbXVsYXRpb24pICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgcm9fd2FpdF9xdWV1ZTsJLyogRm9yIHBlb3BsZSB3YWl0aW5nIGZvciB0aGUgZnMgdG8gZ28gcmVhZC1vbmx5ICovCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfUVVPVEEKIAljaGFyICpzX3FmX25hbWVzW01BWFFVT1RBU107CQkvKiBOYW1lcyBvZiBxdW90YSBmaWxlcyB3aXRoIGpvdXJuYWxsZWQgcXVvdGEgKi8KIAlpbnQgc19qcXVvdGFfZm10OwkJCS8qIEZvcm1hdCBvZiBxdW90YSB0byB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaCBiL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaAppbmRleCAyMWIzZTc1Li4xZTdjMDExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLmgKKysrIGIvaW5jbHVkZS9saW51eC9maXJtd2FyZS5oCkBAIC0xLDcgKzEsNiBAQAogI2lmbmRlZiBfTElOVVhfRklSTVdBUkVfSAogI2RlZmluZSBfTElOVVhfRklSTVdBUkVfSAogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpAQCAtMTUsNiArMTQsNyBAQAogCXN0cnVjdCBwYWdlICoqcGFnZXM7CiB9OwogCitzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IGRldmljZTsKIAogc3RydWN0IGJ1aWx0aW5fZncgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcmVlemVyLmggYi9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaAppbmRleCBhYTU2Y2YzLi5hNTM4NmUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaApAQCAtMTM1LDEwICsxMzUsMjAgQEAKIH0KIAogLyoKLSAqIEZyZWV6ZXItZnJpZW5kbHkgd3JhcHBlcnMgYXJvdW5kIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpIGFuZAotICogd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKSwgb3JpZ2luYWxseSBkZWZpbmVkIGluIDxsaW51eC93YWl0Lmg+CisgKiBGcmVlemVyLWZyaWVuZGx5IHdyYXBwZXJzIGFyb3VuZCB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSwKKyAqIHdhaXRfZXZlbnRfa2lsbGFibGUoKSBhbmQgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKSwgb3JpZ2luYWxseQorICogZGVmaW5lZCBpbiA8bGludXgvd2FpdC5oPgogICovCiAKKyNkZWZpbmUgd2FpdF9ldmVudF9mcmVlemVraWxsYWJsZSh3cSwgY29uZGl0aW9uKQkJCVwKKyh7CQkJCQkJCQkJXAorCWludCBfX3JldHZhbDsJCQkJCQkJXAorCWZyZWV6ZXJfZG9fbm90X2NvdW50KCk7CQkJCQkJXAorCV9fcmV0dmFsID0gd2FpdF9ldmVudF9raWxsYWJsZSh3cSwgKGNvbmRpdGlvbikpOwkJXAorCWZyZWV6ZXJfY291bnQoKTsJCQkJCQlcCisJX19yZXR2YWw7CQkJCQkJCVwKK30pCisKICNkZWZpbmUgd2FpdF9ldmVudF9mcmVlemFibGUod3EsIGNvbmRpdGlvbikJCQkJXAogKHsJCQkJCQkJCQlcCiAJaW50IF9fcmV0dmFsOwkJCQkJCQlcCkBAIC0xOTAsNiArMjAwLDkgQEAKICNkZWZpbmUgd2FpdF9ldmVudF9mcmVlemFibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KQkJXAogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KQogCisjZGVmaW5lIHdhaXRfZXZlbnRfZnJlZXpla2lsbGFibGUod3EsIGNvbmRpdGlvbikJCVwKKwkJd2FpdF9ldmVudF9raWxsYWJsZSh3cSwgY29uZGl0aW9uKQorCiAjZW5kaWYgLyogIUNPTkZJR19GUkVFWkVSICovCiAKICNlbmRpZgkvKiBGUkVFWkVSX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCBiYTk4NjY4Li4wYzRkZjI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC01OCwxNCArNTgsMTUgQEAKIAogI2RlZmluZSBOUl9GSUxFICA4MTkyCS8qIHRoaXMgY2FuIHdlbGwgYmUgbGFyZ2VyIG9uIGEgbGFyZ2VyIHN5c3RlbSAqLwogCi0jZGVmaW5lIE1BWV9FWEVDIDEKLSNkZWZpbmUgTUFZX1dSSVRFIDIKLSNkZWZpbmUgTUFZX1JFQUQgNAotI2RlZmluZSBNQVlfQVBQRU5EIDgKLSNkZWZpbmUgTUFZX0FDQ0VTUyAxNgotI2RlZmluZSBNQVlfT1BFTiAzMgotI2RlZmluZSBNQVlfQ0hESVIgNjQKLSNkZWZpbmUgTUFZX05PVF9CTE9DSyAxMjgJLyogY2FsbGVkIGZyb20gUkNVIG1vZGUsIGRvbid0IGJsb2NrICovCisjZGVmaW5lIE1BWV9FWEVDCQkweDAwMDAwMDAxCisjZGVmaW5lIE1BWV9XUklURQkJMHgwMDAwMDAwMgorI2RlZmluZSBNQVlfUkVBRAkJMHgwMDAwMDAwNAorI2RlZmluZSBNQVlfQVBQRU5ECQkweDAwMDAwMDA4CisjZGVmaW5lIE1BWV9BQ0NFU1MJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUFZX09QRU4JCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFZX0NIRElSCQkweDAwMDAwMDQwCisvKiBjYWxsZWQgZnJvbSBSQ1UgbW9kZSwgZG9uJ3QgYmxvY2sgKi8KKyNkZWZpbmUgTUFZX05PVF9CTE9DSwkJMHgwMDAwMDA4MAogCiAvKgogICogZmxhZ3MgaW4gZmlsZS5mX21vZGUuICBOb3RlIHRoYXQgRk1PREVfUkVBRCBhbmQgRk1PREVfV1JJVEUgbXVzdCBjb3JyZXNwb25kCkBAIC03NjcsMTQgKzc2OCwyNSBAQAogCiAJLyogU3RhdCBkYXRhLCBub3QgYWNjZXNzZWQgZnJvbSBwYXRoIHdhbGtpbmcgKi8KIAl1bnNpZ25lZCBsb25nCQlpX2lubzsKLQl1bnNpZ25lZCBpbnQJCWlfbmxpbms7CisJLyoKKwkgKiBGaWxlc3lzdGVtcyBtYXkgb25seSByZWFkIGlfbmxpbmsgZGlyZWN0bHkuICBUaGV5IHNoYWxsIHVzZSB0aGUKKwkgKiBmb2xsb3dpbmcgZnVuY3Rpb25zIGZvciBtb2RpZmljYXRpb246CisJICoKKwkgKiAgICAoc2V0fGNsZWFyfGluY3xkcm9wKV9ubGluaworCSAqICAgIGlub2RlXyhpbmN8ZGVjKV9saW5rX2NvdW50CisJICovCisJdW5pb24geworCQljb25zdCB1bnNpZ25lZCBpbnQgaV9ubGluazsKKwkJdW5zaWduZWQgaW50IF9faV9ubGluazsKKwl9OwogCWRldl90CQkJaV9yZGV2OwotCWxvZmZfdAkJCWlfc2l6ZTsKIAlzdHJ1Y3QgdGltZXNwZWMJCWlfYXRpbWU7CiAJc3RydWN0IHRpbWVzcGVjCQlpX210aW1lOwogCXN0cnVjdCB0aW1lc3BlYwkJaV9jdGltZTsKLQl1bnNpZ25lZCBpbnQJCWlfYmxrYml0czsKKwlzcGlubG9ja190CQlpX2xvY2s7CS8qIGlfYmxvY2tzLCBpX2J5dGVzLCBtYXliZSBpX3NpemUgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICBpX2J5dGVzOwogCWJsa2NudF90CQlpX2Jsb2NrczsKKwlsb2ZmX3QJCQlpX3NpemU7CiAKICNpZmRlZiBfX05FRURfSV9TSVpFX09SREVSRUQKIAlzZXFjb3VudF90CQlpX3NpemVfc2VxY291bnQ7CkBAIC03ODIsNyArNzk0LDYgQEAKIAogCS8qIE1pc2MgKi8KIAl1bnNpZ25lZCBsb25nCQlpX3N0YXRlOwotCXNwaW5sb2NrX3QJCWlfbG9jazsJLyogaV9ibG9ja3MsIGlfYnl0ZXMsIG1heWJlIGlfc2l6ZSAqLwogCXN0cnVjdCBtdXRleAkJaV9tdXRleDsKIAogCXVuc2lnbmVkIGxvbmcJCWRpcnRpZWRfd2hlbjsJLyogamlmZmllcyBvZiBmaXJzdCBkaXJ0eWluZyAqLwpAQCAtNzk2LDkgKzgwNywxMCBAQAogCQlzdHJ1Y3QgcmN1X2hlYWQJCWlfcmN1OwogCX07CiAJYXRvbWljX3QJCWlfY291bnQ7CisJdW5zaWduZWQgaW50CQlpX2Jsa2JpdHM7CiAJdTY0CQkJaV92ZXJzaW9uOwotCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGlfYnl0ZXM7CiAJYXRvbWljX3QJCWlfZGlvX2NvdW50OworCWF0b21pY190CQlpX3dyaXRlY291bnQ7CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkqaV9mb3A7CS8qIGZvcm1lciAtPmlfb3AtPmRlZmF1bHRfZmlsZV9vcHMgKi8KIAlzdHJ1Y3QgZmlsZV9sb2NrCSppX2Zsb2NrOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlCWlfZGF0YTsKQEAgLTgyMiw3ICs4MzQsNiBAQAogI2lmZGVmIENPTkZJR19JTUEKIAlhdG9taWNfdAkJaV9yZWFkY291bnQ7IC8qIHN0cnVjdCBmaWxlcyBvcGVuIFJPICovCiAjZW5kaWYKLQlhdG9taWNfdAkJaV93cml0ZWNvdW50OwogCXZvaWQJCQkqaV9wcml2YXRlOyAvKiBmcyBvciBkZXZpY2UgcHJpdmF0ZSBwb2ludGVyICovCiB9OwogCkBAIC05NjMsNyArOTc0LDEyIEBACiAjZGVmaW5lIGZfZGVudHJ5CWZfcGF0aC5kZW50cnkKICNkZWZpbmUgZl92ZnNtbnQJZl9wYXRoLm1udAogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMJKmZfb3A7Ci0Jc3BpbmxvY2tfdAkJZl9sb2NrOyAgLyogZl9lcF9saW5rcywgZl9mbGFncywgbm8gSVJRICovCisKKwkvKgorCSAqIFByb3RlY3RzIGZfZXBfbGlua3MsIGZfZmxhZ3MsIGZfcG9zIHZzIGlfc2l6ZSBpbiBsc2VlayBTRUVLX0NVUi4KKwkgKiBNdXN0IG5vdCBiZSB0YWtlbiBmcm9tIElSUSBjb250ZXh0LgorCSAqLworCXNwaW5sb2NrX3QJCWZfbG9jazsKICNpZmRlZiBDT05GSUdfU01QCiAJaW50CQkJZl9zYl9saXN0X2NwdTsKICNlbmRpZgpAQCAtMTYyNyw5ICsxNjQzLDEwIEBACiBzdHJ1Y3Qgc2VxX2ZpbGU7CiAKIHNzaXplX3QgcndfY29weV9jaGVja191dmVjdG9yKGludCB0eXBlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICogdXZlY3RvciwKLQkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHVuc2lnbmVkIGxvbmcgZmFzdF9zZWdzLAotCQkJCXN0cnVjdCBpb3ZlYyAqZmFzdF9wb2ludGVyLAotCQkJCXN0cnVjdCBpb3ZlYyAqKnJldF9wb2ludGVyKTsKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgdW5zaWduZWQgbG9uZyBmYXN0X3NlZ3MsCisJCQkgICAgICBzdHJ1Y3QgaW92ZWMgKmZhc3RfcG9pbnRlciwKKwkJCSAgICAgIHN0cnVjdCBpb3ZlYyAqKnJldF9wb2ludGVyLAorCQkJICAgICAgaW50IGNoZWNrX2FjY2Vzcyk7CiAKIGV4dGVybiBzc2l6ZV90IHZmc19yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogZXh0ZXJuIHNzaXplX3QgdmZzX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwpAQCAtMTc0OCw2ICsxNzY1LDE5IEBACiB9CiAKIC8qKgorICogc2V0X25saW5rIC0gZGlyZWN0bHkgc2V0IGFuIGlub2RlJ3MgbGluayBjb3VudAorICogQGlub2RlOiBpbm9kZQorICogQG5saW5rOiBuZXcgbmxpbmsgKHNob3VsZCBiZSBub24temVybykKKyAqCisgKiBUaGlzIGlzIGEgbG93LWxldmVsIGZpbGVzeXN0ZW0gaGVscGVyIHRvIHJlcGxhY2UgYW55CisgKiBkaXJlY3QgZmlsZXN5c3RlbSBtYW5pcHVsYXRpb24gb2YgaV9ubGluay4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9ubGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgbmxpbmspCit7CisJaW5vZGUtPl9faV9ubGluayA9IG5saW5rOworfQorCisvKioKICAqIGluY19ubGluayAtIGRpcmVjdGx5IGluY3JlbWVudCBhbiBpbm9kZSdzIGxpbmsgY291bnQKICAqIEBpbm9kZTogaW5vZGUKICAqCkBAIC0xNzU3LDcgKzE3ODcsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5jX25saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JaW5vZGUtPmlfbmxpbmsrKzsKKwlpbm9kZS0+X19pX25saW5rKys7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9pbmNfbGlua19jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMTc3OSw3ICsxODA5LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGRyb3Bfbmxpbmsoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpbm9kZS0+aV9ubGluay0tOworCWlub2RlLT5fX2lfbmxpbmstLTsKIH0KIAogLyoqCkBAIC0xNzkyLDcgKzE4MjIsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfbmxpbmsoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPl9faV9ubGluayA9IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9kZWNfbGlua19jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMjQwMSw4ICsyNDMxLDggQEAKIGV4dGVybiBsb2ZmX3Qgbm9vcF9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pOwogZXh0ZXJuIGxvZmZfdCBub19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pOwogZXh0ZXJuIGxvZmZfdCBnZW5lcmljX2ZpbGVfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKTsKLWV4dGVybiBsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2Vla191bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwKLQkJCWludCBvcmlnaW4pOworZXh0ZXJuIGxvZmZfdCBnZW5lcmljX2ZpbGVfbGxzZWVrX3NpemUoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsCisJCWludCBvcmlnaW4sIGxvZmZfdCBtYXhzaXplKTsKIGV4dGVybiBpbnQgZ2VuZXJpY19maWxlX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCk7CiBleHRlcm4gaW50IG5vbnNlZWthYmxlX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCk7CiAKQEAgLTI2MjgsOCArMjY1OCw4IEBACiAJLmxsc2VlawkgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQkJXAogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSkKLV9fc2ltcGxlX2F0dHJfY2hlY2tfZm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorc3RhdGljIGlubGluZSBfX3ByaW50ZigxLCAyKQordm9pZCBfX3NpbXBsZV9hdHRyX2NoZWNrX2Zvcm1hdChjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAkvKiBkb24ndCBkbyBhbnl0aGluZywganVzdCBsZXQgdGhlIGNvbXBpbGVyIGNoZWNrIHRoZSBhcmd1bWVudHM7ICovCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzY2FjaGUtY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvZnNjYWNoZS1jYWNoZS5oCmluZGV4IGFmMDk1YjUuLmNlMzE0MDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNjYWNoZS1jYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNjYWNoZS1jYWNoZS5oCkBAIC00OTIsMTAgKzQ5MiwxMCBAQAogLyoKICAqIG91dC1vZi1saW5lIGNhY2hlIGJhY2tlbmQgZnVuY3Rpb25zCiAgKi8KLWV4dGVybiB2b2lkIGZzY2FjaGVfaW5pdF9jYWNoZShzdHJ1Y3QgZnNjYWNoZV9jYWNoZSAqY2FjaGUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGZzY2FjaGVfY2FjaGVfb3BzICpvcHMsCi0JCQkgICAgICAgY29uc3QgY2hhciAqaWRmbXQsCi0JCQkgICAgICAgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZnNjYWNoZV9pbml0X2NhY2hlKHN0cnVjdCBmc2NhY2hlX2NhY2hlICpjYWNoZSwKKwkJCWNvbnN0IHN0cnVjdCBmc2NhY2hlX2NhY2hlX29wcyAqb3BzLAorCQkJY29uc3QgY2hhciAqaWRmbXQsIC4uLik7CiAKIGV4dGVybiBpbnQgZnNjYWNoZV9hZGRfY2FjaGUoc3RydWN0IGZzY2FjaGVfY2FjaGUgKmNhY2hlLAogCQkJICAgICBzdHJ1Y3QgZnNjYWNoZV9vYmplY3QgKmZzZGVmLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc2wtZGl1LWZiLmggYi9pbmNsdWRlL2xpbnV4L2ZzbC1kaXUtZmIuaAppbmRleCBkYWE5OTUyLi4xMWMxNmExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzbC1kaXUtZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzbC1kaXUtZmIuaApAQCAtMjAsMTggKzIwLDggQEAKICNpZm5kZWYgX19GU0xfRElVX0ZCX0hfXwogI2RlZmluZSBfX0ZTTF9ESVVfRkJfSF9fCiAKLS8qIEFyYml0cmFyeSB0aHJlc2hvbGQgdG8gZGV0ZXJtaW5lIHRoZSBhbGxvY2F0aW9uIG1ldGhvZAotICogU2VlIG1wYzg2MTBmYl9zZXRfcGFyKCksIG1hcF92aWRlb19tZW1vcnkoKSwgYW5kIHVubWFwX3ZpZGVvX21lbW9yeSgpCi0gKi8KLSNkZWZpbmUgTUVNX0FMTE9DX1RIUkVTSE9MRCAoMTAyNCo3NjgqNCszMikKLQogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLXN0cnVjdCBtZmJfYWxwaGEgewotCWludCBlbmFibGU7Ci0JaW50IGFscGhhOwotfTsKLQogc3RydWN0IG1mYl9jaHJvbWFfa2V5IHsKIAlpbnQgZW5hYmxlOwogCV9fdTggIHJlZF9tYXg7CkBAIC00MywyNSArMzMsMjkgQEAKIH07CiAKIHN0cnVjdCBhb2lfZGlzcGxheV9vZmZzZXQgewotCWludCB4X2FvaV9kOwotCWludCB5X2FvaV9kOworCV9fczMyIHhfYW9pX2Q7CisJX19zMzIgeV9hb2lfZDsKIH07CiAKICNkZWZpbmUgTUZCX1NFVF9DSFJPTUFfS0VZCV9JT1coJ00nLCAxLCBzdHJ1Y3QgbWZiX2Nocm9tYV9rZXkpCiAjZGVmaW5lIE1GQl9TRVRfQlJJR0hUTkVTUwlfSU9XKCdNJywgMywgX191OCkKKyNkZWZpbmUgTUZCX1NFVF9BTFBIQQkJX0lPVygnTScsIDAsIF9fdTgpCisjZGVmaW5lIE1GQl9HRVRfQUxQSEEJCV9JT1IoJ00nLCAwLCBfX3U4KQorI2RlZmluZSBNRkJfU0VUX0FPSUQJCV9JT1coJ00nLCA0LCBzdHJ1Y3QgYW9pX2Rpc3BsYXlfb2Zmc2V0KQorI2RlZmluZSBNRkJfR0VUX0FPSUQJCV9JT1IoJ00nLCA0LCBzdHJ1Y3QgYW9pX2Rpc3BsYXlfb2Zmc2V0KQorI2RlZmluZSBNRkJfU0VUX1BJWEZNVAkJX0lPVygnTScsIDgsIF9fdTMyKQorI2RlZmluZSBNRkJfR0VUX1BJWEZNVAkJX0lPUignTScsIDgsIF9fdTMyKQogCi0jZGVmaW5lIE1GQl9TRVRfQUxQSEEJCTB4ODAwMTRkMDAKLSNkZWZpbmUgTUZCX0dFVF9BTFBIQQkJMHg0MDAxNGQwMAotI2RlZmluZSBNRkJfU0VUX0FPSUQJCTB4ODAwODRkMDQKLSNkZWZpbmUgTUZCX0dFVF9BT0lECQkweDQwMDg0ZDA0Ci0jZGVmaW5lIE1GQl9TRVRfUElYRk1UCQkweDgwMDE0ZDA4Ci0jZGVmaW5lIE1GQl9HRVRfUElYRk1UCQkweDQwMDE0ZDA4Ci0KLSNkZWZpbmUgRkJJT0dFVF9HV0lORk8JCTB4NDZFMAotI2RlZmluZSBGQklPUFVUX0dXSU5GTwkJMHg0NkUxCisvKgorICogVGhlIG9yaWdpbmFsIGRlZmluaXRpb25zIG9mIE1GQl9TRVRfUElYRk1UIGFuZCBNRkJfR0VUX1BJWEZNVCB1c2VkIHRoZQorICogd3JvbmcgdmFsdWUgZm9yICdzaXplJyBmaWVsZCBvZiB0aGUgaW9jdGwuICBUaGUgY3VycmVudCBtYWNyb3MgYWJvdmUgdXNlIHRoZQorICogcmlnaHQgc2l6ZSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYXQgbGVhc3QKKyAqIGZvciBhIHdoaWxlLgorKi8KKyNkZWZpbmUgTUZCX1NFVF9QSVhGTVRfT0xECTB4ODAwMTRkMDgKKyNkZWZpbmUgTUZCX0dFVF9QSVhGTVRfT0xECTB4NDAwMTRkMDgKIAogI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAvKgogICogVGhlc2UgYXJlIHRoZSBmaWVsZHMgb2YgYXJlYSBkZXNjcmlwdG9yKGluIEREUiBtZW1vcnkpIGZvciBldmVyeSBwbGFuZQpAQCAtMTU5LDU4ICsxNTMsMTIgQEAKIAlfX2JlMzIgcGx1dDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgZGl1X2h3IHsKLQlzdHJ1Y3QgZGl1ICpkaXVfcmVnOwotCXNwaW5sb2NrX3QgcmVnX2xvY2s7Ci0KLQlfX3UzMiBtb2RlOwkJLyogRElVIG9wZXJhdGlvbiBtb2RlICovCi19OwotCi1zdHJ1Y3QgZGl1X2FkZHIgewotCV9fdTggX19pb21lbSAqdmFkZHI7CS8qIFZpcnR1YWwgYWRkcmVzcyAqLwotCWRtYV9hZGRyX3QgcGFkZHI7CS8qIFBoeXNpY2FsIGFkZHJlc3MgKi8KLQlfX3UzMiAJICAgb2Zmc2V0OwotfTsKLQotc3RydWN0IGRpdV9wb29sIHsKLQlzdHJ1Y3QgZGl1X2FkZHIgYWQ7Ci0Jc3RydWN0IGRpdV9hZGRyIGdhbW1hOwotCXN0cnVjdCBkaXVfYWRkciBwYWxsZXRlOwotCXN0cnVjdCBkaXVfYWRkciBjdXJzb3I7Ci19OwotCi0jZGVmaW5lIEZTTF9ESVVfQkFTRV9PRkZTRVQJMHgyQzAwMAkvKiBPZmZzZXQgb2YgRElVICovCi0jZGVmaW5lIElOVF9MQ0RDCQk2NAkvKiBESVUgaW50ZXJydXB0IG51bWJlciAqLwotCi0jZGVmaW5lIEZTTF9BT0lfTlVNCTYJLyogNSBBT0lzIGFuZCBvbmUgZHVtbXkgQU9JICovCi0JCQkJLyogMSBmb3IgcGxhbmUgMCwgMiBmb3IgcGxhbmUgMSYyIGVhY2ggKi8KLQotLyogTWluaW11bSBYIGFuZCBZIHJlc29sdXRpb25zICovCi0jZGVmaW5lIE1JTl9YUkVTCTY0Ci0jZGVmaW5lIE1JTl9ZUkVTCTY0Ci0KLS8qIEhXIGN1cnNvciBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIE1BWF9DVVJTCQkzMgotCi0vKiBNb2RlcyBvZiBvcGVyYXRpb24gb2YgRElVICovCisvKgorICogTW9kZXMgb2Ygb3BlcmF0aW9uIG9mIERJVS4gIFRoZSBESVUgc3VwcG9ydHMgZml2ZSBkaWZmZXJlbnQgbW9kZXMsIGJ1dAorICogdGhlIGRyaXZlciBvbmx5IHN1cHBvcnRzIG1vZGVzIDAgYW5kIDEuCisgKi8KICNkZWZpbmUgTUZCX01PREUwCTAJLyogRElVIG9mZiAqLwogI2RlZmluZSBNRkJfTU9ERTEJMQkvKiBBbGwgdGhyZWUgcGxhbmVzIG91dHB1dCB0byBkaXNwbGF5ICovCi0jZGVmaW5lIE1GQl9NT0RFMgkyCS8qIFBsYW5lIDEgdG8gZGlzcGxheSwgcGxhbmVzIDIrMyB3cml0dGVuIGJhY2sqLwotI2RlZmluZSBNRkJfTU9ERTMJMwkvKiBBbGwgdGhyZWUgcGxhbmVzIHdyaXR0ZW4gYmFjayB0byBtZW1vcnkgKi8KLSNkZWZpbmUgTUZCX01PREU0CTQJLyogQ29sb3IgYmFyIGdlbmVyYXRpb24gKi8KLQotLyogSU5UX1NUQVRVUy9JTlRfTUFTSyBmaWVsZCBkZXNjcmlwdGlvbnMgKi8KLSNkZWZpbmUgSU5UX1ZTWU5DCTB4MDEJLyogVnN5bmMgaW50ZXJydXB0ICAqLwotI2RlZmluZSBJTlRfVlNZTkNfV0IJMHgwMgkvKiBWc3luYyBpbnRlcnJ1cHQgZm9yIHdyaXRlIGJhY2sgb3BlcmF0aW9uICovCi0jZGVmaW5lIElOVF9VTkRSVU4JMHgwNAkvKiBVbmRlciBydW4gZXhjZXB0aW9uIGludGVycnVwdCAqLwotI2RlZmluZSBJTlRfUEFSRVJSCTB4MDgJLyogRGlzcGxheSBwYXJhbWV0ZXJzIGVycm9yIGludGVycnVwdCAqLwotI2RlZmluZSBJTlRfTFNfQkZfVlMJMHgxMAkvKiBMaW5lcyBiZWZvcmUgdnN5bmMuIGludGVycnVwdCAqLwotCi0vKiBQYW5lbHMnb3BlcmF0aW9uIG1vZGVzICovCi0jZGVmaW5lIE1GQl9UWVBFX09VVFBVVAkwCS8qIFBhbmVsIG91dHB1dCB0byBkaXNwbGF5ICovCi0jZGVmaW5lIE1GQl9UWVBFX09GRgkxCS8qIFBhbmVsIG9mZiAqLwotI2RlZmluZSBNRkJfVFlQRV9XQgkyCS8qIFBhbmVsIHdyaXR0ZW4gYmFjayB0byBtZW1vcnkgKi8KLSNkZWZpbmUgTUZCX1RZUEVfVEVTVAkzCS8qIFBhbmVsIGdlbmVyYXRlIGNvbG9yIGJhciAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fRlNMX0RJVV9GQl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCmluZGV4IGYwYzBlOGEuLjI2ZWFmY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdHJhY2UuaApAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTksNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2Z0cmFjZS5oPgogCitzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IGZ0cmFjZV9oYXNoOwogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oIGIvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oCmluZGV4IGI2NWE2ZjQuLmI0NTZiMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2FtZXBvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dhbWVwb3J0LmgKQEAgLTcxLDE1ICs3MSwxNCBAQAogI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCiAKIHZvaWQgX19nYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCi17Ci0JX19nYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdhbWVwb3J0LCBUSElTX01PRFVMRSk7Ci19CisvKiB1c2UgYSBkZWZpbmUgdG8gYXZvaWQgaW5jbHVkZSBjaGFpbmluZyB0byBnZXQgVEhJU19NT0RVTEUgKi8KKyNkZWZpbmUgZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChnYW1lcG9ydCkgXAorCV9fZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChnYW1lcG9ydCwgVEhJU19NT0RVTEUpCiAKIHZvaWQgZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpOwogCi12b2lkIGdhbWVwb3J0X3NldF9waHlzKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK19fcHJpbnRmKDIsIDMpCit2b2lkIGdhbWVwb3J0X3NldF9waHlzKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogI2Vsc2UKIApAQCAtOTMsOCArOTIsOCBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGdhbWVwb3J0X3NldF9waHlzKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsCi0JCQkJICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMiwgMykKK3ZvaWQgZ2FtZXBvcnRfc2V0X3BoeXMoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJcmV0dXJuOwogfQpAQCAtMTQ1LDEyICsxNDQsMTIgQEAKIAltdXRleF91bmxvY2soJmdhbWVwb3J0LT5kcnZfbXV0ZXgpOwogfQogCi1pbnQgX19nYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdhbWVwb3J0X2RyaXZlciAqZHJ2LAoraW50IF9fbXVzdF9jaGVjayBfX2dhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ2FtZXBvcnRfZHJpdmVyICpkcnYsCiAJCQkJc3RydWN0IG1vZHVsZSAqb3duZXIsIGNvbnN0IGNoYXIgKm1vZF9uYW1lKTsKLXN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBnYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdhbWVwb3J0X2RyaXZlciAqZHJ2KQotewotCXJldHVybiBfX2dhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcihkcnYsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSk7Ci19CisKKy8qIHVzZSBhIGRlZmluZSB0byBhdm9pZCBpbmNsdWRlIGNoYWluaW5nIHRvIGdldCBUSElTX01PRFVMRSAmIGZyaWVuZHMgKi8KKyNkZWZpbmUgZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKGRydikgXAorCV9fZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKGRydiwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQogCiB2b2lkIGdhbWVwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2VuaGQuaCBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaAppbmRleCAwMmZhNDY5Li45ZGUzMWJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZW5oZC5oCkBAIC0yMSw2ICsyMSw4IEBACiAjZGVmaW5lIGRldl90b19wYXJ0KGRldmljZSkJY29udGFpbmVyX29mKChkZXZpY2UpLCBzdHJ1Y3QgaGRfc3RydWN0LCBfX2RldikKICNkZWZpbmUgZGlza190b19kZXYoZGlzaykJKCYoZGlzayktPnBhcnQwLl9fZGV2KQogI2RlZmluZSBwYXJ0X3RvX2RldihwYXJ0KQkoJigocGFydCktPl9fZGV2KSkKKyNkZWZpbmUgYWxpYXNfbmFtZShkaXNrKQkoKGRpc2spLT5hbGlhcyA/IChkaXNrKS0+YWxpYXMgOiBcCisJCQkJCQkgKGRpc2spLT5kaXNrX25hbWUpCiAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX3R5cGUgcGFydF90eXBlOwogZXh0ZXJuIHN0cnVjdCBrb2JqZWN0ICpibG9ja19kZXByOwpAQCAtNTgsNiArNjAsNyBAQAogCiAjZGVmaW5lIERJU0tfTUFYX1BBUlRTCQkJMjU2CiAjZGVmaW5lIERJU0tfTkFNRV9MRU4JCQkzMgorI2RlZmluZSBBTElBU19MRU4JCQkyNTYKIAogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0xMjgsNiArMTMxLDcgQEAKICNkZWZpbmUgR0VOSERfRkxfRVhUX0RFVlQJCQk2NCAvKiBhbGxvdyBleHRlbmRlZCBkZXZ0ICovCiAjZGVmaW5lIEdFTkhEX0ZMX05BVElWRV9DQVBBQ0lUWQkJMTI4CiAjZGVmaW5lIEdFTkhEX0ZMX0JMT0NLX0VWRU5UU19PTl9FWENMX1dSSVRFCTI1NgorI2RlZmluZSBHRU5IRF9GTF9OT19QQVJUX1NDQU4JCQk1MTIKIAogZW51bSB7CiAJRElTS19FVkVOVF9NRURJQV9DSEFOR0UJCQk9IDEgPDwgMCwgLyogbWVkaWEgY2hhbmdlZCAqLwpAQCAtMTYyLDYgKzE2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGlza3MgdGhhdCBjYW4ndCBiZSBwYXJ0aXRpb25lZC4gKi8KIAogCWNoYXIgZGlza19uYW1lW0RJU0tfTkFNRV9MRU5dOwkvKiBuYW1lIG9mIG1ham9yIGRyaXZlciAqLworCWNoYXIgKmFsaWFzOwkJCS8qIGFsaWFzIG5hbWUgb2YgZGlzayAqLwogCWNoYXIgKigqZGV2bm9kZSkoc3RydWN0IGdlbmRpc2sgKmdkLCBtb2RlX3QgKm1vZGUpOwogCiAJdW5zaWduZWQgaW50IGV2ZW50czsJCS8qIHN1cHBvcnRlZCBldmVudHMgKi8KQEAgLTIzNCw5ICsyMzksMTAgQEAKIAlyZXR1cm4gZGlzay0+bWlub3JzOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgZGlza19wYXJ0aXRpb25hYmxlKHN0cnVjdCBnZW5kaXNrICpkaXNrKQorc3RhdGljIGlubGluZSBib29sIGRpc2tfcGFydF9zY2FuX2VuYWJsZWQoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0JcmV0dXJuIGRpc2tfbWF4X3BhcnRzKGRpc2spID4gMTsKKwlyZXR1cm4gZGlza19tYXhfcGFydHMoZGlzaykgPiAxICYmCisJCSEoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9OT19QQVJUX1NDQU4pOwogfQogCiBzdGF0aWMgaW5saW5lIGRldl90IGRpc2tfZGV2dChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKaW5kZXggMTdiNWEwZC4uMzhhYzQ4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKQEAgLTE0LDYgKzE0LDE4IEBACiAjZGVmaW5lIEdQSU9GX09VVF9JTklUX0xPVwkoR1BJT0ZfRElSX09VVCB8IEdQSU9GX0lOSVRfTE9XKQogI2RlZmluZSBHUElPRl9PVVRfSU5JVF9ISUdICShHUElPRl9ESVJfT1VUIHwgR1BJT0ZfSU5JVF9ISUdIKQogCisvKioKKyAqIHN0cnVjdCBncGlvIC0gYSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIEdQSU8gd2l0aCBjb25maWd1cmF0aW9uCisgKiBAZ3BpbzoJdGhlIEdQSU8gbnVtYmVyCisgKiBAZmxhZ3M6CUdQSU8gY29uZmlndXJhdGlvbiBhcyBzcGVjaWZpZWQgYnkgR1BJT0ZfKgorICogQGxhYmVsOglhIGxpdGVyYWwgZGVzY3JpcHRpb24gc3RyaW5nIG9mIHRoaXMgR1BJTworICovCitzdHJ1Y3QgZ3BpbyB7CisJdW5zaWduZWQJZ3BpbzsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWNvbnN0IGNoYXIJKmxhYmVsOworfTsKKwogI2lmZGVmIENPTkZJR19HRU5FUklDX0dQSU8KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCkBAIC0yNCwxOCArMzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKIHN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgZ3BpbzsKIHN0cnVjdCBncGlvX2NoaXA7CiAKLS8qCi0gKiBTb21lIHBsYXRmb3JtcyBkb24ndCBzdXBwb3J0IHRoZSBHUElPIHByb2dyYW1taW5nIGludGVyZmFjZS4KLSAqCi0gKiBJbiBjYXNlIHNvbWUgZHJpdmVyIHVzZXMgaXQgYW55d2F5IChpdCBzaG91bGQgbm9ybWFsbHkgaGF2ZQotICogZGVwZW5kZWQgb24gR0VORVJJQ19HUElPKSwgdGhlc2Ugcm91dGluZXMgaGVscCB0aGUgY29tcGlsZXIKLSAqIG9wdGltaXplIG91dCBtdWNoIEdQSU8tcmVsYXRlZCBjb2RlIC4uLiBvciB0cmlnZ2VyIGEgcnVudGltZQotICogd2FybmluZyB3aGVuIHNvbWV0aGluZyBpcyB3cm9uZ2x5IGNhbGxlZC4KLSAqLwotCiBzdGF0aWMgaW5saW5lIGJvb2wgZ3Bpb19pc192YWxpZChpbnQgbnVtYmVyKQogewogCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLmggYi9pbmNsdWRlL2xpbnV4L2hpZC5oCmluZGV4IGRlZWQ1ZjkuLmMyMzVlNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQuaApAQCAtNjk3LDEwICs2OTcsMTEgQEAKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgX19oaWRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBoaWRfZHJpdmVyICosCiAJCXN0cnVjdCBtb2R1bGUgKiwgY29uc3QgY2hhciAqbW9kX25hbWUpOwotc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIGhpZF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGhpZF9kcml2ZXIgKmRyaXZlcikKLXsKLQlyZXR1cm4gX19oaWRfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlciwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKTsKLX0KKworLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICYgZnJpZW5kcyAqLworI2RlZmluZSBoaWRfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlcikgXAorCV9faGlkX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSkKKwogZXh0ZXJuIHZvaWQgaGlkX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBoaWRfZHJpdmVyICopOwogCiBleHRlcm4gdm9pZCBoaWRpbnB1dF9oaWRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKiwgc3RydWN0IGhpZF9maWVsZCAqLCBzdHJ1Y3QgaGlkX3VzYWdlICosIF9fczMyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZV9tbS5oIGIvaW5jbHVkZS9saW51eC9odWdlX21tLmgKaW5kZXggNDhjMzJlYi4uYTlhY2U5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9odWdlX21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9odWdlX21tLmgKQEAgLTIyLDYgKzIyLDExIEBACiBleHRlcm4gaW50IG1pbmNvcmVfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsCiAJCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAogCQkJdW5zaWduZWQgY2hhciAqdmVjKTsKK2V4dGVybiBpbnQgbW92ZV9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKm5ld192bWEsCisJCQkgdW5zaWduZWQgbG9uZyBvbGRfYWRkciwKKwkJCSB1bnNpZ25lZCBsb25nIG5ld19hZGRyLCB1bnNpZ25lZCBsb25nIG9sZF9lbmQsCisJCQkgcG1kX3QgKm9sZF9wbWQsIHBtZF90ICpuZXdfcG1kKTsKIGV4dGVybiBpbnQgY2hhbmdlX2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAogCQkJdW5zaWduZWQgbG9uZyBhZGRyLCBwZ3Byb3RfdCBuZXdwcm90KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9od3NwaW5sb2NrLmggYi9pbmNsdWRlL2xpbnV4L2h3c3BpbmxvY2suaAppbmRleCA4MzkwZWZjLi5hYWQ2YmQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h3c3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2h3c3BpbmxvY2suaApAQCAtMjAsMTcgKzIwLDQ5IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAvKiBod3NwaW5sb2NrIG1vZGUgYXJndW1lbnQgKi8KICNkZWZpbmUgSFdMT0NLX0lSUVNUQVRFCTB4MDEJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCBzYXZlIHN0YXRlICovCiAjZGVmaW5lIEhXTE9DS19JUlEJMHgwMgkvKiBEaXNhYmxlIGludGVycnVwdHMsIGRvbid0IHNhdmUgc3RhdGUgKi8KIAogc3RydWN0IGh3c3BpbmxvY2s7CitzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2U7CitzdHJ1Y3QgaHdzcGlubG9ja19vcHM7CisKKy8qKgorICogc3RydWN0IGh3c3BpbmxvY2tfcGRhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciBod3NwaW5sb2NrIGRyaXZlcnMKKyAqIEBiYXNlX2lkOiBiYXNlIGlkIGZvciB0aGlzIGh3c3BpbmxvY2sgZGV2aWNlCisgKgorICogaHdzcGlubG9jayBkZXZpY2VzIHByb3ZpZGUgc3lzdGVtLXdpZGUgaGFyZHdhcmUgbG9ja3MgdGhhdCBhcmUgdXNlZAorICogYnkgcmVtb3RlIHByb2Nlc3NvcnMgdGhhdCBoYXZlIG5vIG90aGVyIHdheSB0byBhY2hpZXZlIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBUbyBhY2hpZXZlIHRoYXQsIGVhY2ggcGh5c2ljYWwgbG9jayBtdXN0IGhhdmUgYSBzeXN0ZW0td2lkZSBpZCBudW1iZXIKKyAqIHRoYXQgaXMgYWdyZWVkIHVwb24sIG90aGVyd2lzZSByZW1vdGUgcHJvY2Vzc29ycyBjYW4ndCBwb3NzaWJseSBhc3N1bWUKKyAqIHRoZXkncmUgdXNpbmcgdGhlIHNhbWUgaGFyZHdhcmUgbG9jay4KKyAqCisgKiBVc3VhbGx5IGJvYXJkcyBoYXZlIGEgc2luZ2xlIGh3c3BpbmxvY2sgZGV2aWNlLCB3aGljaCBwcm92aWRlcyBzZXZlcmFsCisgKiBod3NwaW5sb2NrcywgYW5kIGluIHRoaXMgY2FzZSwgdGhleSBjYW4gYmUgdHJpdmlhbGx5IG51bWJlcmVkIDAgdG8KKyAqIChudW0tb2YtbG9ja3MgLSAxKS4KKyAqCisgKiBJbiBjYXNlIGJvYXJkcyBoYXZlIHNldmVyYWwgaHdzcGlubG9ja3MgZGV2aWNlcywgYSBkaWZmZXJlbnQgYmFzZSBpZAorICogc2hvdWxkIGJlIHVzZWQgZm9yIGVhY2ggaHdzcGlubG9jayBkZXZpY2UgKHRoZXkgY2FuJ3QgYWxsIHVzZSAwIGFzCisgKiBhIHN0YXJ0aW5nIGlkISkuCisgKgorICogVGhpcyBwbGF0Zm9ybSBkYXRhIHN0cnVjdHVyZSBzaG91bGQgYmUgdXNlZCB0byBwcm92aWRlIHRoZSBiYXNlIGlkCisgKiBmb3IgZWFjaCBkZXZpY2UgKHdoaWNoIGlzIHRyaXZpYWxseSAwIHdoZW4gb25seSBhIHNpbmdsZSBod3NwaW5sb2NrCisgKiBkZXZpY2UgZXhpc3RzKS4gSXQgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBwbGF0Zm9ybXMsIGhlbmNlCisgKiBpdHMgbG9jYXRpb24uCisgKi8KK3N0cnVjdCBod3NwaW5sb2NrX3BkYXRhIHsKKwlpbnQgYmFzZV9pZDsKK307CiAKICNpZiBkZWZpbmVkKENPTkZJR19IV1NQSU5MT0NLKSB8fCBkZWZpbmVkKENPTkZJR19IV1NQSU5MT0NLX01PRFVMRSkKIAotaW50IGh3c3Bpbl9sb2NrX3JlZ2lzdGVyKHN0cnVjdCBod3NwaW5sb2NrICpsb2NrKTsKLXN0cnVjdCBod3NwaW5sb2NrICpod3NwaW5fbG9ja191bnJlZ2lzdGVyKHVuc2lnbmVkIGludCBpZCk7CitpbnQgaHdzcGluX2xvY2tfcmVnaXN0ZXIoc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCWNvbnN0IHN0cnVjdCBod3NwaW5sb2NrX29wcyAqb3BzLCBpbnQgYmFzZV9pZCwgaW50IG51bV9sb2Nrcyk7CitpbnQgaHdzcGluX2xvY2tfdW5yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbmspOwogc3RydWN0IGh3c3BpbmxvY2sgKmh3c3Bpbl9sb2NrX3JlcXVlc3Qodm9pZCk7CiBzdHJ1Y3QgaHdzcGlubG9jayAqaHdzcGluX2xvY2tfcmVxdWVzdF9zcGVjaWZpYyh1bnNpZ25lZCBpbnQgaWQpOwogaW50IGh3c3Bpbl9sb2NrX2ZyZWUoc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jayk7CkBAIC04Niw3ICsxMTgsNiBAQAogc3RhdGljIGlubGluZQogdm9pZCBfX2h3c3Bpbl91bmxvY2soc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jaywgaW50IG1vZGUsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBod3NwaW5fbG9ja19nZXRfaWQoc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jaykKQEAgLTk0LDE2ICsxMjUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBod3NwaW5fbG9ja19yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrKQotewotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBod3NwaW5sb2NrICpod3NwaW5fbG9ja191bnJlZ2lzdGVyKHVuc2lnbmVkIGludCBpZCkKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQogI2VuZGlmIC8qICFDT05GSUdfSFdTUElOTE9DSyAqLwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLW9tYXAuaCBiL2luY2x1ZGUvbGludXgvaTJjLW9tYXAuaAppbmRleCAwYWEwY2JkLi45MmEwZGM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1vbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtb21hcC5oCkBAIC0zMiwxMCArMzIsOSBAQAogCiBzdHJ1Y3Qgb21hcF9pMmNfYnVzX3BsYXRmb3JtX2RhdGEgewogCXUzMgkJY2xrcmF0ZTsKKwl1MzIJCXJldjsKKwl1MzIJCWZsYWdzOwogCXZvaWQJCSgqc2V0X21wdV93a3VwX2xhdCkoc3RydWN0IGRldmljZSAqZGV2LCBsb25nIHNldCk7Ci0JaW50CQkoKmRldmljZV9lbmFibGUpIChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLQlpbnQJCSgqZGV2aWNlX3NodXRkb3duKSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0JaW50CQkoKmRldmljZV9pZGxlKSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLmggYi9pbmNsdWRlL2xpbnV4L2kyYy5oCmluZGV4IGE2YzY1MmUuLmE4MWJmNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMuaApAQCAtMjgsMTIgKzI4LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4JLyogZm9yIHN0cnVjdCBkZXZpY2UgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3IgY29tcGxldGlvbiAqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4JCS8qIGZvciBzdHJ1Y3QgZGV2aWNlX25vZGUgKi8KKyNpbmNsdWRlIDxsaW51eC9zd2FiLmg+CQkvKiBmb3Igc3dhYjE2ICovCiAKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgaTJjX2J1c190eXBlOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2VfdHlwZSBpMmNfYWRhcHRlcl90eXBlOwpAQCAtNDgsNiArNDgsOCBAQAogdW5pb24gaTJjX3NtYnVzX2RhdGE7CiBzdHJ1Y3QgaTJjX2JvYXJkX2luZm87CiAKK3N0cnVjdCBtb2R1bGU7CisKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCiAvKgogICogVGhlIG1hc3RlciByb3V0aW5lcyBhcmUgdGhlIG9uZXMgbm9ybWFsbHkgdXNlZCB0byB0cmFuc21pdCBkYXRhIHRvIGRldmljZXMKQEAgLTg4LDYgKzkwLDIyIEBACiAJCQkJICAgIHU4IGNvbW1hbmQpOwogZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgICB1OCBjb21tYW5kLCB1MTYgdmFsdWUpOworCitzdGF0aWMgaW5saW5lIHMzMgoraTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQpCit7CisJczMyIHZhbHVlID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgY29tbWFuZCk7CisKKwlyZXR1cm4gKHZhbHVlIDwgMCkgPyB2YWx1ZSA6IHN3YWIxNih2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczMyCitpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIGNvbW1hbmQsIHN3YWIxNih2YWx1ZSkpOworfQorCiAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcyAqLwogZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgICB1OCBjb21tYW5kLCB1OCAqdmFsdWVzKTsKQEAgLTQzNCwxMCArNDUyLDkgQEAKIGV4dGVybiBpbnQgaTJjX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbW9kdWxlICosIHN0cnVjdCBpMmNfZHJpdmVyICopOwogZXh0ZXJuIHZvaWQgaTJjX2RlbF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKik7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGkyY19hZGRfZHJpdmVyKHN0cnVjdCBpMmNfZHJpdmVyICpkcml2ZXIpCi17Ci0JcmV0dXJuIGkyY19yZWdpc3Rlcl9kcml2ZXIoVEhJU19NT0RVTEUsIGRyaXZlcik7Ci19CisvKiB1c2UgYSBkZWZpbmUgdG8gYXZvaWQgaW5jbHVkZSBjaGFpbmluZyB0byBnZXQgVEhJU19NT0RVTEUgKi8KKyNkZWZpbmUgaTJjX2FkZF9kcml2ZXIoZHJpdmVyKSBcCisJaTJjX3JlZ2lzdGVyX2RyaXZlcihUSElTX01PRFVMRSwgZHJpdmVyKQogCiBleHRlcm4gc3RydWN0IGkyY19jbGllbnQgKmkyY191c2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogZXh0ZXJuIHZvaWQgaTJjX3JlbGVhc2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvdHNjMjAwNy5oIGIvaW5jbHVkZS9saW51eC9pMmMvdHNjMjAwNy5oCmluZGV4IDU5MTQyN2EuLjUwNmE5ZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjL3RzYzIwMDcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy90c2MyMDA3LmgKQEAgLTUsNyArNSw3IEBACiAKIHN0cnVjdCB0c2MyMDA3X3BsYXRmb3JtX2RhdGEgewogCXUxNgltb2RlbDsJCQkJLyogMjAwNy4gKi8KLQl1MTYJeF9wbGF0ZV9vaG1zOworCXUxNgl4X3BsYXRlX29obXM7CS8qIG11c3QgYmUgbm9uLXplcm8gdmFsdWUgKi8KIAl1MTYJbWF4X3J0OyAvKiBtYXguIHJlc2lzdGFuY2UgYWJvdmUgd2hpY2ggc2FtcGxlcyBhcmUgaWdub3JlZCAqLwogCXVuc2lnbmVkIGxvbmcgcG9sbF9kZWxheTsgLyogZGVsYXkgKGluIG1zKSBhZnRlciBwZW4tZG93biBldmVudAogCQkJCSAgICAgYmVmb3JlIHBvbGxpbmcgc3RhcnRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy90d2w0MDMwLW1hZGMuaCBiL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAtbWFkYy5oCmluZGV4IDY0MjdkMjkuLjUzMGUxMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAtbWFkYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAtbWFkYy5oCkBAIC0xMjksNiArMTI5LDEwIEBACiAjZGVmaW5lIFJFR19CQ0lDVEwyICAgICAgICAgICAgIDB4MDI0CiAjZGVmaW5lIFRXTDQwMzBfQkNJX0lUSFNFTlMJMHgwMDcKIAorLyogUmVnaXN0ZXIgYW5kIGJpdHMgZm9yIEdQQlIxIHJlZ2lzdGVyICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX0dQQlIxCQkweDBjCisjZGVmaW5lIFRXTDQwMzBfR1BCUjFfTUFEQ19IRkNMS19FTgkoMSA8PCA3KQorCiBzdHJ1Y3QgdHdsNDAzMF9tYWRjX3VzZXJfcGFybXMgewogCWludCBjaGFubmVsOwogCWludCBhdmVyYWdlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmgKaW5kZXggNDgzNjNjMy4uNjZjZWRmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oCkBAIC0xMjgsNiArMTI4LDcgQEAKICNkZWZpbmUgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT0FDSwkweDAwMjAKICNkZWZpbmUgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT19FWFBMCTB4MDA0MAogI2RlZmluZSBJRUVFODAyMTFfUU9TX0NUTF9BQ0tfUE9MSUNZX0JMT0NLQUNLCTB4MDA2MAorI2RlZmluZSBJRUVFODAyMTFfUU9TX0NUTF9BQ0tfUE9MSUNZX01BU0sJMHgwMDYwCiAvKiBBLU1TRFUgODAyLjExbiAqLwogI2RlZmluZSBJRUVFODAyMTFfUU9TX0NUTF9BX01TRFVfUFJFU0VOVAkweDAwODAKIC8qIE1lc2ggQ29udHJvbCA4MDIuMTFzICovCkBAIC03NzAsNiArNzcxLDkgQEAKIAl9IHU7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorLyogU3VwcG9ydGVkIFJhdGVzIHZhbHVlIGVuY29kaW5ncyBpbiA4MDIuMTFuLTIwMDkgNy4zLjIuMiAqLworI2RlZmluZSBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9IVF9QSFkJMTI3CisKIC8qIG1nbXQgaGVhZGVyICsgMSBieXRlIGNhdGVnb3J5IGNvZGUgKi8KICNkZWZpbmUgSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYWN0aW9uLnUpCiAKQEAgLTE1NTIsNiArMTU1Niw4IEBACiAjZGVmaW5lIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNAkweDAwMEZBQzA1CiAjZGVmaW5lIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDCTB4MDAwRkFDMDYKIAorI2RlZmluZSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0CQkweDAwMTQ3MjAxCisKIC8qIEFLTSBzdWl0ZSBzZWxlY3RvcnMgKi8KICNkZWZpbmUgV0xBTl9BS01fU1VJVEVfODAyMVgJCTB4MDAwRkFDMDEKICNkZWZpbmUgV0xBTl9BS01fU1VJVEVfUFNLCQkweDAwMEZBQzAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0LmggYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKaW5kZXggYTYzN2U3OC4uMzg2MmUzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQuaApAQCAtNTA1LDYgKzUwNSw3IEBACiAjZGVmaW5lIEJUTl9UT09MX0ZJTkdFUgkJMHgxNDUKICNkZWZpbmUgQlROX1RPT0xfTU9VU0UJCTB4MTQ2CiAjZGVmaW5lIEJUTl9UT09MX0xFTlMJCTB4MTQ3CisjZGVmaW5lIEJUTl9UT09MX1FVSU5UVEFQCTB4MTQ4CS8qIEZpdmUgZmluZ2VycyBvbiB0cmFja3BhZCAqLwogI2RlZmluZSBCVE5fVE9VQ0gJCTB4MTRhCiAjZGVmaW5lIEJUTl9TVFlMVVMJCTB4MTRiCiAjZGVmaW5lIEJUTl9TVFlMVVMyCQkweDE0YwpAQCAtODE0LDYgKzgxNSw3IEBACiAjZGVmaW5lIFNXX0tFWVBBRF9TTElERQkJMHgwYSAgLyogc2V0ID0ga2V5cGFkIHNsaWRlIG91dCAqLwogI2RlZmluZSBTV19GUk9OVF9QUk9YSU1JVFkJMHgwYiAgLyogc2V0ID0gZnJvbnQgcHJveGltaXR5IHNlbnNvciBhY3RpdmUgKi8KICNkZWZpbmUgU1dfUk9UQVRFX0xPQ0sJCTB4MGMgIC8qIHNldCA9IHJvdGF0ZSBsb2NrZWQvZGlzYWJsZWQgKi8KKyNkZWZpbmUgU1dfTElORUlOX0lOU0VSVAkweDBkICAvKiBzZXQgPSBpbnNlcnRlZCAqLwogI2RlZmluZSBTV19NQVgJCQkweDBmCiAjZGVmaW5lIFNXX0NOVAkJCShTV19NQVgrMSkKIApAQCAtMTYwOSw3ICsxNjExLDcgQEAKIAlzdHJ1Y3QgZmlsZSAqZWZmZWN0X293bmVyc1tdOwogfTsKIAotaW50IGlucHV0X2ZmX2NyZWF0ZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBtYXhfZWZmZWN0cyk7CitpbnQgaW5wdXRfZmZfY3JlYXRlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IG1heF9lZmZlY3RzKTsKIHZvaWQgaW5wdXRfZmZfZGVzdHJveShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpOwogCiBpbnQgaW5wdXRfZmZfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0L2FkcDU1ODkuaCBiL2luY2x1ZGUvbGludXgvaW5wdXQvYWRwNTU4OS5oCmluZGV4IGVmNzkyZWMuLjFhMDVlZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQvYWRwNTU4OS5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQvYWRwNTU4OS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEFuYWxvZyBEZXZpY2VzIEFEUDU1ODkgSS9PIEV4cGFuZGVyIGFuZCBRV0VSVFkgS2V5cGFkIENvbnRyb2xsZXIKKyAqIEFuYWxvZyBEZXZpY2VzIEFEUDU1ODkvQURQNTU4NSBJL08gRXhwYW5kZXIgYW5kIFFXRVJUWSBLZXlwYWQgQ29udHJvbGxlcgogICoKICAqIENvcHlyaWdodCAyMDEwLTIwMTEgQW5hbG9nIERldmljZXMgSW5jLgogICoKQEAgLTksODkgKzksOSBAQAogI2lmbmRlZiBfQURQNTU4OV9ICiAjZGVmaW5lIF9BRFA1NTg5X0gKIAotI2RlZmluZSBBRFA1NTg5X0lECQkJMHgwMAotI2RlZmluZSBBRFA1NTg5X0lOVF9TVEFUVVMJCTB4MDEKLSNkZWZpbmUgQURQNTU4OV9TVEFUVVMJCQkweDAyCi0jZGVmaW5lIEFEUDU1ODlfRklGT18xCQkJMHgwMwotI2RlZmluZSBBRFA1NTg5X0ZJRk9fMgkJCTB4MDQKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzMJCQkweDA1Ci0jZGVmaW5lIEFEUDU1ODlfRklGT180CQkJMHgwNgotI2RlZmluZSBBRFA1NTg5X0ZJRk9fNQkJCTB4MDcKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzYJCQkweDA4Ci0jZGVmaW5lIEFEUDU1ODlfRklGT183CQkJMHgwOQotI2RlZmluZSBBRFA1NTg5X0ZJRk9fOAkJCTB4MEEKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzkJCQkweDBCCi0jZGVmaW5lIEFEUDU1ODlfRklGT18xMAkJCTB4MEMKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzExCQkJMHgwRAotI2RlZmluZSBBRFA1NTg5X0ZJRk9fMTIJCQkweDBFCi0jZGVmaW5lIEFEUDU1ODlfRklGT18xMwkJCTB4MEYKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzE0CQkJMHgxMAotI2RlZmluZSBBRFA1NTg5X0ZJRk9fMTUJCQkweDExCi0jZGVmaW5lIEFEUDU1ODlfRklGT18xNgkJCTB4MTIKLSNkZWZpbmUgQURQNTU4OV9HUElfSU5UX1NUQVRfQQkJMHgxMwotI2RlZmluZSBBRFA1NTg5X0dQSV9JTlRfU1RBVF9CCQkweDE0Ci0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9TVEFUX0MJCTB4MTUKLSNkZWZpbmUgQURQNTU4OV9HUElfU1RBVFVTX0EJCTB4MTYKLSNkZWZpbmUgQURQNTU4OV9HUElfU1RBVFVTX0IJCTB4MTcKLSNkZWZpbmUgQURQNTU4OV9HUElfU1RBVFVTX0MJCTB4MTgKLSNkZWZpbmUgQURQNTU4OV9SUFVMTF9DT05GSUdfQQkJMHgxOQotI2RlZmluZSBBRFA1NTg5X1JQVUxMX0NPTkZJR19CCQkweDFBCi0jZGVmaW5lIEFEUDU1ODlfUlBVTExfQ09ORklHX0MJCTB4MUIKLSNkZWZpbmUgQURQNTU4OV9SUFVMTF9DT05GSUdfRAkJMHgxQwotI2RlZmluZSBBRFA1NTg5X1JQVUxMX0NPTkZJR19FCQkweDFECi0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9MRVZFTF9BCQkweDFFCi0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9MRVZFTF9CCQkweDFGCi0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9MRVZFTF9DCQkweDIwCi0jZGVmaW5lIEFEUDU1ODlfR1BJX0VWRU5UX0VOX0EJCTB4MjEKLSNkZWZpbmUgQURQNTU4OV9HUElfRVZFTlRfRU5fQgkJMHgyMgotI2RlZmluZSBBRFA1NTg5X0dQSV9FVkVOVF9FTl9DCQkweDIzCi0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVEVSUlVQVF9FTl9BCTB4MjQKLSNkZWZpbmUgQURQNTU4OV9HUElfSU5URVJSVVBUX0VOX0IJMHgyNQotI2RlZmluZSBBRFA1NTg5X0dQSV9JTlRFUlJVUFRfRU5fQwkweDI2Ci0jZGVmaW5lIEFEUDU1ODlfREVCT1VOQ0VfRElTX0EJCTB4MjcKLSNkZWZpbmUgQURQNTU4OV9ERUJPVU5DRV9ESVNfQgkJMHgyOAotI2RlZmluZSBBRFA1NTg5X0RFQk9VTkNFX0RJU19DCQkweDI5Ci0jZGVmaW5lIEFEUDU1ODlfR1BPX0RBVEFfT1VUX0EJCTB4MkEKLSNkZWZpbmUgQURQNTU4OV9HUE9fREFUQV9PVVRfQgkJMHgyQgotI2RlZmluZSBBRFA1NTg5X0dQT19EQVRBX09VVF9DCQkweDJDCi0jZGVmaW5lIEFEUDU1ODlfR1BPX09VVF9NT0RFX0EJCTB4MkQKLSNkZWZpbmUgQURQNTU4OV9HUE9fT1VUX01PREVfQgkJMHgyRQotI2RlZmluZSBBRFA1NTg5X0dQT19PVVRfTU9ERV9DCQkweDJGCi0jZGVmaW5lIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQQkweDMwCi0jZGVmaW5lIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQgkweDMxCi0jZGVmaW5lIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQwkweDMyCi0jZGVmaW5lIEFEUDU1ODlfVU5MT0NLMQkJCTB4MzMKLSNkZWZpbmUgQURQNTU4OV9VTkxPQ0syCQkJMHgzNAotI2RlZmluZSBBRFA1NTg5X0VYVF9MT0NLX0VWRU5UCQkweDM1Ci0jZGVmaW5lIEFEUDU1ODlfVU5MT0NLX1RJTUVSUwkJMHgzNgotI2RlZmluZSBBRFA1NTg5X0xPQ0tfQ0ZHCQkweDM3Ci0jZGVmaW5lIEFEUDU1ODlfUkVTRVQxX0VWRU5UX0EJCTB4MzgKLSNkZWZpbmUgQURQNTU4OV9SRVNFVDFfRVZFTlRfQgkJMHgzOQotI2RlZmluZSBBRFA1NTg5X1JFU0VUMV9FVkVOVF9DCQkweDNBCi0jZGVmaW5lIEFEUDU1ODlfUkVTRVQyX0VWRU5UX0EJCTB4M0IKLSNkZWZpbmUgQURQNTU4OV9SRVNFVDJfRVZFTlRfQgkJMHgzQwotI2RlZmluZSBBRFA1NTg5X1JFU0VUX0NGRwkJMHgzRAotI2RlZmluZSBBRFA1NTg5X1BXTV9PRkZUX0xPVwkJMHgzRQotI2RlZmluZSBBRFA1NTg5X1BXTV9PRkZUX0hJR0gJCTB4M0YKLSNkZWZpbmUgQURQNTU4OV9QV01fT05UX0xPVwkJMHg0MAotI2RlZmluZSBBRFA1NTg5X1BXTV9PTlRfSElHSAkJMHg0MQotI2RlZmluZSBBRFA1NTg5X1BXTV9DRkcJCQkweDQyCi0jZGVmaW5lIEFEUDU1ODlfQ0xPQ0tfRElWX0NGRwkJMHg0MwotI2RlZmluZSBBRFA1NTg5X0xPR0lDXzFfQ0ZHCQkweDQ0Ci0jZGVmaW5lIEFEUDU1ODlfTE9HSUNfMl9DRkcJCTB4NDUKLSNkZWZpbmUgQURQNTU4OV9MT0dJQ19GRl9DRkcJCTB4NDYKLSNkZWZpbmUgQURQNTU4OV9MT0dJQ19JTlRfRVZFTlRfRU4JMHg0NwotI2RlZmluZSBBRFA1NTg5X1BPTExfUFRJTUVfQ0ZHCQkweDQ4Ci0jZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19BCQkweDQ5Ci0jZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19CCQkweDRBCi0jZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19DCQkweDRCCi0jZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19ECQkweDRDCi0jZGVmaW5lIEFEUDU1ODlfR0VORVJBTF9DRkcJCTB4NEQKLSNkZWZpbmUgQURQNTU4OV9JTlRfRU4JCQkweDRFCi0KLSNkZWZpbmUgQURQNTU4OV9ERVZJQ0VfSURfTUFTSwkweEYKLQotLyogUHV0IG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGluIGkyY19ib2FyZF9pbmZvIHBsYXRmb3JtX2RhdGEgKi8KKy8qCisgKiBBRFA1NTg5IHNwZWNpZmljIEdQSSBhbmQgS2V5bWFwIGRlZmluZXMKKyAqLwogCiAjZGVmaW5lIEFEUDU1ODlfS0VZTUFQU0laRQk4OAogCkBAIC0xMjcsNiArNDcsMzUgQEAKIAogI2RlZmluZSBBRFA1NTg5X0dQSU1BUFNJWkVfTUFYIChBRFA1NTg5X0dQSV9QSU5fRU5EIC0gQURQNTU4OV9HUElfUElOX0JBU0UgKyAxKQogCisvKgorICogQURQNTU4NSBzcGVjaWZpYyBHUEkgYW5kIEtleW1hcCBkZWZpbmVzCisgKi8KKworI2RlZmluZSBBRFA1NTg1X0tFWU1BUFNJWkUJMzAKKworI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XMCAzNworI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XMSAzOAorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XMiAzOQorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XMyA0MAorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XNCA0MQorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XNSA0MgorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MMCA0MworI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MMSA0NAorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MMiA0NQorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MMyA0NgorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MNCA0NworI2RlZmluZSBHUElfTE9HSUMgNDgKKworI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XX0JBU0UgQURQNTU4NV9HUElfUElOX1JPVzAKKyNkZWZpbmUgQURQNTU4NV9HUElfUElOX1JPV19FTkQgQURQNTU4NV9HUElfUElOX1JPVzUKKyNkZWZpbmUgQURQNTU4NV9HUElfUElOX0NPTF9CQVNFIEFEUDU1ODVfR1BJX1BJTl9DT0wwCisjZGVmaW5lIEFEUDU1ODVfR1BJX1BJTl9DT0xfRU5EIEFEUDU1ODVfR1BJX1BJTl9DT0w0CisKKyNkZWZpbmUgQURQNTU4NV9HUElfUElOX0JBU0UgQURQNTU4NV9HUElfUElOX1JPV19CQVNFCisjZGVmaW5lIEFEUDU1ODVfR1BJX1BJTl9FTkQgQURQNTU4NV9HUElfUElOX0NPTF9FTkQKKworI2RlZmluZSBBRFA1NTg1X0dQSU1BUFNJWkVfTUFYIChBRFA1NTg1X0dQSV9QSU5fRU5EIC0gQURQNTU4NV9HUElfUElOX0JBU0UgKyAxKQorCiBzdHJ1Y3QgYWRwNTU4OV9ncGlfbWFwIHsKIAl1bnNpZ25lZCBzaG9ydCBwaW47CiAJdW5zaWduZWQgc2hvcnQgc3dfZXZ0OwpAQCAtMTU5LDcgKzEwOCw3IEBACiAjZGVmaW5lIFJFU0VUMl9QT0xfSElHSAkJCSgxIDw8IDcpCiAjZGVmaW5lIFJFU0VUMl9QT0xfTE9XCQkJKDAgPDwgNykKIAotLyogTWFzayBCaXRzOgorLyogQURQNTU4OSBNYXNrIEJpdHM6CiAgKiBDIEMgQyBDIEMgQyBDIEMgQyBDIEMgfCBSIFIgUiBSIFIgUiBSIFIKICAqIDEgOSA4IDcgNiA1IDQgMyAyIDEgMCB8IDcgNiA1IDQgMyAyIDEgMAogICogMApAQCAtMTY4LDE4ICsxMTcsNDQgQEAKICAqIDggNyA2IDUgNCAzIDIgMSAwIDkgOCB8IDcgNiA1IDQgMyAyIDEgMAogICovCiAKLSNkZWZpbmUgQURQX1JPVyh4KQkJCSgxIDw8ICh4KSkKLSNkZWZpbmUgQURQX0NPTCh4KQkJCSgxIDw8ICh4ICsgOCkpCisjZGVmaW5lIEFEUF9ST1coeCkJKDEgPDwgKHgpKQorI2RlZmluZSBBRFBfQ09MKHgpCSgxIDw8ICh4ICsgOCkpCisjZGVmaW5lIEFEUDU1ODlfUk9XX01BU0sJCTB4RkYKKyNkZWZpbmUgQURQNTU4OV9DT0xfTUFTSwkJMHhGRgorI2RlZmluZSBBRFA1NTg5X0NPTF9TSElGVAkJOAorI2RlZmluZSBBRFA1NTg5X01BWF9ST1dfTlVNCQk3CisjZGVmaW5lIEFEUDU1ODlfTUFYX0NPTF9OVU0JCTEwCisKKy8qIEFEUDU1ODUgTWFzayBCaXRzOgorICogQyBDIEMgQyBDIHwgUiBSIFIgUiBSIFIKKyAqIDQgMyAyIDEgMCB8IDUgNCAzIDIgMSAwCisgKgorICogLS0tLSBCSVQgLS0gLS0tLS0tLS0tLS0KKyAqIDEgMCAwIDAgMCB8IDAgMCAwIDAgMCAwCisgKiAwIDkgOCA3IDYgfCA1IDQgMyAyIDEgMAorICovCisKKyNkZWZpbmUgQURQNTU4NV9ST1dfTUFTSwkJMHgzRgorI2RlZmluZSBBRFA1NTg1X0NPTF9NQVNLCQkweDFGCisjZGVmaW5lIEFEUDU1ODVfUk9XX1NISUZUCQkwCisjZGVmaW5lIEFEUDU1ODVfQ09MX1NISUZUCQk2CisjZGVmaW5lIEFEUDU1ODVfTUFYX1JPV19OVU0JCTUKKyNkZWZpbmUgQURQNTU4NV9NQVhfQ09MX05VTQkJNAorCisjZGVmaW5lIEFEUDU1ODVfUk9XKHgpCSgxIDw8ICgoeCkgJiBBRFA1NTg1X1JPV19NQVNLKSkKKyNkZWZpbmUgQURQNTU4NV9DT0woeCkJKDEgPDwgKCgoeCkgJiBBRFA1NTg1X0NPTF9NQVNLKSArIEFEUDU1ODVfQ09MX1NISUZUKSkKKworLyogUHV0IG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGluIGkyY19ib2FyZF9pbmZvIHBsYXRmb3JtX2RhdGEgKi8KIAogc3RydWN0IGFkcDU1ODlfa3BhZF9wbGF0Zm9ybV9kYXRhIHsKIAl1bnNpZ25lZCBrZXlwYWRfZW5fbWFzazsJLyogS2V5cGFkIChSb3dzL0NvbHVtbnMpIGVuYWJsZSBtYXNrICovCiAJY29uc3QgdW5zaWduZWQgc2hvcnQgKmtleW1hcDsJLyogUG9pbnRlciB0byBrZXltYXAgKi8KIAl1bnNpZ25lZCBzaG9ydCBrZXltYXBzaXplOwkvKiBLZXltYXAgc2l6ZSAqLwogCWJvb2wgcmVwZWF0OwkJCS8qIEVuYWJsZSBrZXkgcmVwZWF0ICovCi0JYm9vbCBlbl9rZXlsb2NrOwkJLyogRW5hYmxlIGtleSBsb2NrIGZlYXR1cmUgKi8KLQl1bnNpZ25lZCBjaGFyIHVubG9ja19rZXkxOwkvKiBVbmxvY2sgS2V5IDEgKi8KLQl1bnNpZ25lZCBjaGFyIHVubG9ja19rZXkyOwkvKiBVbmxvY2sgS2V5IDIgKi8KLQl1bnNpZ25lZCBjaGFyIHVubG9ja190aW1lcjsJLyogVGltZSBpbiBzZWNvbmRzIFswLi43XSBiZXR3ZWVuIHRoZSB0d28gdW5sb2NrIGtleXMgMD1kaXNhYmxlICovCisJYm9vbCBlbl9rZXlsb2NrOwkJLyogRW5hYmxlIGtleSBsb2NrIGZlYXR1cmUgKEFEUDU1ODkgb25seSkqLworCXVuc2lnbmVkIGNoYXIgdW5sb2NrX2tleTE7CS8qIFVubG9jayBLZXkgMSAoQURQNTU4OSBvbmx5KSAqLworCXVuc2lnbmVkIGNoYXIgdW5sb2NrX2tleTI7CS8qIFVubG9jayBLZXkgMiAoQURQNTU4OSBvbmx5KSAqLworCXVuc2lnbmVkIGNoYXIgdW5sb2NrX3RpbWVyOwkvKiBUaW1lIGluIHNlY29uZHMgWzAuLjddIGJldHdlZW4gdGhlIHR3byB1bmxvY2sga2V5cyAwPWRpc2FibGUgKEFEUDU1ODkgb25seSkgKi8KIAl1bnNpZ25lZCBjaGFyIHNjYW5fY3ljbGVfdGltZTsJLyogVGltZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIHNjYW4gY3ljbGVzICovCiAJdW5zaWduZWQgY2hhciByZXNldF9jZmc7CS8qIFJlc2V0IGNvbmZpZyAqLwogCXVuc2lnbmVkIHNob3J0IHJlc2V0MV9rZXlfMTsJLyogUmVzZXQgS2V5IDEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQvYWR4bDM0eC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC9hZHhsMzR4LmgKaW5kZXggZGYwMGQ5OS4uNTdlMDFhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC9hZHhsMzR4LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnB1dC9hZHhsMzR4LmgKQEAgLTMwLDggKzMwLDkgQEAKIAkgKiBZLCBvciBaIHBhcnRpY2lwYXRpb24gaW4gVGFwIGRldGVjdGlvbi4gQSAnMCcgZXhjbHVkZXMgdGhlCiAJICogc2VsZWN0ZWQgYXhpcyBmcm9tIHBhcnRpY2lwYXRpb24gaW4gVGFwIGRldGVjdGlvbi4KIAkgKiBTZXR0aW5nIHRoZSBTVVBQUkVTUyBiaXQgc3VwcHJlc3NlcyBEb3VibGUgVGFwIGRldGVjdGlvbiBpZgotCSAqIGFjY2VsZXJhdGlvbiBncmVhdGVyIHRoYW4gdGFwX3RocmVzaG9sZCBpcyBwcmVzZW50IGJldHdlZW4KLQkgKiB0YXBzLgorCSAqIGFjY2VsZXJhdGlvbiBncmVhdGVyIHRoYW4gdGFwX3RocmVzaG9sZCBpcyBwcmVzZW50IGR1cmluZyB0aGUKKwkgKiB0YXBfbGF0ZW5jeSBwZXJpb2QsIGkuZS4gYWZ0ZXIgdGhlIGZpcnN0IHRhcCBidXQgYmVmb3JlIHRoZQorCSAqIG9wZW5pbmcgb2YgdGhlIHNlY29uZCB0YXAgd2luZG93LgogCSAqLwogCiAjZGVmaW5lIEFEWExfU1VQUFJFU1MJKDEgPDwgMykKQEAgLTIyNiwxMyArMjI3LDEzIEBACiAJICogZGV0ZWN0aW9uIHdpbGwgYmVnaW4gYW5kIHByZXZlbnQgdGhlIGRldGVjdGlvbiBvZiBhY3Rpdml0eS4gVGhpcwogCSAqIGJpdCBzZXJpYWxseSBsaW5rcyB0aGUgYWN0aXZpdHkgYW5kIGluYWN0aXZpdHkgZnVuY3Rpb25zLiBXaGVuICcwJwogCSAqIHRoZSBpbmFjdGl2aXR5IGFuZCBhY3Rpdml0eSBmdW5jdGlvbnMgYXJlIGNvbmN1cnJlbnQuIEFkZGl0aW9uYWwKLQkgKiBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIEFwcGxpY2F0aW9uIHNlY3Rpb24gdW5kZXIgTGluawotCSAqIE1vZGUuCisJICogaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBBRFhMMzR4IGRhdGFzaGVldCdzIEFwcGxpY2F0aW9uCisJICogc2VjdGlvbiB1bmRlciBMaW5rIE1vZGUuCiAJICogQVVUT19TTEVFUDogQSAnMScgc2V0cyB0aGUgQURYTDM0eCB0byBzd2l0Y2ggdG8gU2xlZXAgTW9kZQogCSAqIHdoZW4gaW5hY3Rpdml0eSAoYWNjZWxlcmF0aW9uIGhhcyBiZWVuIGJlbG93IGluYWN0aXZpdHlfdGhyZXNob2xkCiAJICogZm9yIGF0IGxlYXN0IGluYWN0aXZpdHlfdGltZSkgaXMgZGV0ZWN0ZWQgYW5kIHRoZSBMSU5LIGJpdCBpcyBzZXQuCi0JICogQSAnMCcgZGlzYWJsZXMgYXV0b21hdGljIHN3aXRjaGluZyB0byBTbGVlcCBNb2RlLiBTZWUgU0xFRVAKLQkgKiBmb3IgZnVydGhlciBkZXNjcmlwdGlvbi4KKwkgKiBBICcwJyBkaXNhYmxlcyBhdXRvbWF0aWMgc3dpdGNoaW5nIHRvIFNsZWVwIE1vZGUuIFNlZSB0aGUKKwkgKiBTbGVlcCBCaXQgc2VjdGlvbiBvZiB0aGUgQURYTDM0eCBkYXRhc2hlZXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAJICovCiAKICNkZWZpbmUgQURYTF9MSU5LCSgxIDw8IDUpCkBAIC0yNjYsNiArMjY3LDEyIEBACiAKIAl1OCB3YXRlcm1hcms7CiAKKwkvKgorCSAqIFdoZW4gYWNjZWxlcmF0aW9uIG1lYXN1cmVtZW50cyBhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgQURYTDM0eAorCSAqIGV2ZW50cyBhcmUgc2VudCB0byB0aGUgZXZlbnQgc3Vic3lzdGVtLiBUaGUgZm9sbG93aW5nIHNldHRpbmdzCisJICogc2VsZWN0IHRoZSBldmVudCB0eXBlIGFuZCBldmVudCBjb2RlIGZvciBuZXcgeCwgeSBhbmQgeiBheGlzIGRhdGEKKwkgKiByZXNwZWN0aXZlbHkuCisJICovCiAJdTMyIGV2X3R5cGU7CS8qIEVWX0FCUyBvciBFVl9SRUwgKi8KIAogCXUzMiBldl9jb2RlX3g7CS8qIEFCU19YLFksWiBvciBSRUxfWCxZLFogKi8KQEAgLTI4OSw3ICsyOTYsNyBAQAogCXUzMiBldl9jb2RlX2FjdF9pbmFjdGl2aXR5OwkvKiBFVl9LRVkgKi8KIAogCS8qCi0JICogVXNlIEFEWEwzNHggSU5UMiBpbnN0ZWFkIG9mIElOVDEKKwkgKiBVc2UgQURYTDM0eCBJTlQyIHBpbiBpbnN0ZWFkIG9mIElOVDEgcGluIGZvciBpbnRlcnJ1cHQgb3V0cHV0CiAJICovCiAJdTggdXNlX2ludDI7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW8tbWFwcGluZy5oIGIvaW5jbHVkZS9saW51eC9pby1tYXBwaW5nLmgKaW5kZXggYzgxZWQyYS4uZTQ0ZTg0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pby1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9pby1tYXBwaW5nLmgKQEAgLTExNyw2ICsxMTcsOCBAQAogCiAjZWxzZQogCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCiAvKiB0aGlzIHN0cnVjdCBpc24ndCBhY3R1YWxseSBkZWZpbmVkIGFueXdoZXJlICovCiBzdHJ1Y3QgaW9fbWFwcGluZzsKIApAQCAtMTM4LDEyICsxNDAsMTQgQEAKIGlvX21hcHBpbmdfbWFwX2F0b21pY193YyhzdHJ1Y3QgaW9fbWFwcGluZyAqbWFwcGluZywKIAkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCXJldHVybiAoKGNoYXIgX19mb3JjZSBfX2lvbWVtICopIG1hcHBpbmcpICsgb2Zmc2V0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGlvX21hcHBpbmdfdW5tYXBfYXRvbWljKHZvaWQgX19pb21lbSAqdmFkZHIpCiB7CisJcGFnZWZhdWx0X2VuYWJsZSgpOwogfQogCiAvKiBOb24tYXRvbWljIG1hcC91bm1hcCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb21tdS5oIGIvaW5jbHVkZS9saW51eC9pb21tdS5oCmluZGV4IDk5NDAzMTkuLjQzMmFjYzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9tbXUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvbW11LmgKQEAgLTI1LDE1ICsyNSwyOSBAQAogI2RlZmluZSBJT01NVV9XUklURQkoMikKICNkZWZpbmUgSU9NTVVfQ0FDSEUJKDQpIC8qIERNQSBjYWNoZSBjb2hlcmVuY3kgKi8KIAorc3RydWN0IGlvbW11X29wczsKK3N0cnVjdCBidXNfdHlwZTsKIHN0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgaW9tbXVfZG9tYWluOworCisvKiBpb21tdSBmYXVsdCBmbGFncyAqLworI2RlZmluZSBJT01NVV9GQVVMVF9SRUFECTB4MAorI2RlZmluZSBJT01NVV9GQVVMVF9XUklURQkweDEKKwordHlwZWRlZiBpbnQgKCppb21tdV9mYXVsdF9oYW5kbGVyX3QpKHN0cnVjdCBpb21tdV9kb21haW4gKiwKKwkJCQlzdHJ1Y3QgZGV2aWNlICosIHVuc2lnbmVkIGxvbmcsIGludCk7CiAKIHN0cnVjdCBpb21tdV9kb21haW4geworCXN0cnVjdCBpb21tdV9vcHMgKm9wczsKIAl2b2lkICpwcml2OworCWlvbW11X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVyOwogfTsKIAogI2RlZmluZSBJT01NVV9DQVBfQ0FDSEVfQ09IRVJFTkNZCTB4MQogI2RlZmluZSBJT01NVV9DQVBfSU5UUl9SRU1BUAkJMHgyCS8qIGlzb2xhdGVzIGRldmljZSBpbnRycyAqLwogCisjaWZkZWYgQ09ORklHX0lPTU1VX0FQSQorCiBzdHJ1Y3QgaW9tbXVfb3BzIHsKIAlpbnQgKCpkb21haW5faW5pdCkoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKTsKIAl2b2lkICgqZG9tYWluX2Rlc3Ryb3kpKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbik7CkBAIC00OSwxMSArNjMsOSBAQAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBjYXApOwogfTsKIAotI2lmZGVmIENPTkZJR19JT01NVV9BUEkKLQotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfaW9tbXUoc3RydWN0IGlvbW11X29wcyAqb3BzKTsKLWV4dGVybiBib29sIGlvbW11X2ZvdW5kKHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11X2RvbWFpbl9hbGxvYyh2b2lkKTsKK2V4dGVybiBpbnQgYnVzX3NldF9pb21tdShzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgc3RydWN0IGlvbW11X29wcyAqb3BzKTsKK2V4dGVybiBib29sIGlvbW11X3ByZXNlbnQoc3RydWN0IGJ1c190eXBlICpidXMpOworZXh0ZXJuIHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11X2RvbWFpbl9hbGxvYyhzdHJ1Y3QgYnVzX3R5cGUgKmJ1cyk7CiBleHRlcm4gdm9pZCBpb21tdV9kb21haW5fZnJlZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pOwogZXh0ZXJuIGludCBpb21tdV9hdHRhY2hfZGV2aWNlKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpOwpAQCAtNjcsMTkgKzc5LDU4IEBACiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpb3ZhKTsKIGV4dGVybiBpbnQgaW9tbXVfZG9tYWluX2hhc19jYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAogCQkJCXVuc2lnbmVkIGxvbmcgY2FwKTsKK2V4dGVybiB2b2lkIGlvbW11X3NldF9mYXVsdF9oYW5kbGVyKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKKwkJCQkJaW9tbXVfZmF1bHRfaGFuZGxlcl90IGhhbmRsZXIpOworCisvKioKKyAqIHJlcG9ydF9pb21tdV9mYXVsdCgpIC0gcmVwb3J0IGFib3V0IGFuIElPTU1VIGZhdWx0IHRvIHRoZSBJT01NVSBmcmFtZXdvcmsKKyAqIEBkb21haW46IHRoZSBpb21tdSBkb21haW4gd2hlcmUgdGhlIGZhdWx0IGhhcyBoYXBwZW5lZAorICogQGRldjogdGhlIGRldmljZSB3aGVyZSB0aGUgZmF1bHQgaGFzIGhhcHBlbmVkCisgKiBAaW92YTogdGhlIGZhdWx0aW5nIGFkZHJlc3MKKyAqIEBmbGFnczogbW11IGZhdWx0IGZsYWdzIChlLmcuIElPTU1VX0ZBVUxUX1JFQUQvSU9NTVVfRkFVTFRfV1JJVEUvLi4uKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgbG93LWxldmVsIElPTU1VIGltcGxlbWVudGF0aW9ucworICogd2hlbmV2ZXIgSU9NTVUgZmF1bHRzIGhhcHBlbiwgdG8gYWxsb3cgaGlnaC1sZXZlbCB1c2VycywgdGhhdCBhcmUKKyAqIGludGVyZXN0ZWQgaW4gc3VjaCBldmVudHMsIHRvIGtub3cgYWJvdXQgdGhlbS4KKyAqCisgKiBUaGlzIGV2ZW50IG1heSBiZSB1c2VmdWwgZm9yIHNldmVyYWwgcG9zc2libGUgdXNlIGNhc2VzOgorICogLSBtZXJlIGxvZ2dpbmcgb2YgdGhlIGV2ZW50CisgKiAtIGR5bmFtaWMgVExCL1BURSBsb2FkaW5nCisgKiAtIGlmIHJlc3RhcnRpbmcgb2YgdGhlIGZhdWx0aW5nIGRldmljZSBpcyByZXF1aXJlZAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG90aGVyd2lzZSAoaWYgZHluYW1pYworICogUFRFL1RMQiBsb2FkaW5nIHdpbGwgb25lIGRheSBiZSBzdXBwb3J0ZWQsIGltcGxlbWVudGF0aW9ucyB3aWxsIGJlIGFibGUKKyAqIHRvIHRlbGwgd2hldGhlciBpdCBzdWNjZWVkZWQgb3Igbm90IGFjY29yZGluZyB0byB0aGlzIHJldHVybiB2YWx1ZSkuCisgKgorICogU3BlY2lmaWNhbGx5LCAtRU5PU1lTIGlzIHJldHVybmVkIGlmIGEgZmF1bHQgaGFuZGxlciBpc24ndCBpbnN0YWxsZWQKKyAqICh0aG91Z2ggZmF1bHQgaGFuZGxlcnMgY2FuIGFsc28gcmV0dXJuIC1FTk9TWVMsIGluIGNhc2UgdGhleSB3YW50IHRvCisgKiBlbGljaXQgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIElPTU1VIGRyaXZlcnMpLgorICovCitzdGF0aWMgaW5saW5lIGludCByZXBvcnRfaW9tbXVfZmF1bHQoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgaW92YSwgaW50IGZsYWdzKQoreworCWludCByZXQgPSAtRU5PU1lTOworCisJLyoKKwkgKiBpZiB1cHBlciBsYXllcnMgc2hvd2VkIGludGVyZXN0IGFuZCBpbnN0YWxsZWQgYSBmYXVsdCBoYW5kbGVyLAorCSAqIGludm9rZSBpdC4KKwkgKi8KKwlpZiAoZG9tYWluLT5oYW5kbGVyKQorCQlyZXQgPSBkb21haW4tPmhhbmRsZXIoZG9tYWluLCBkZXYsIGlvdmEsIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CiAKICNlbHNlIC8qIENPTkZJR19JT01NVV9BUEkgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHJlZ2lzdGVyX2lvbW11KHN0cnVjdCBpb21tdV9vcHMgKm9wcykKLXsKLX0KK3N0cnVjdCBpb21tdV9vcHMge307CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpb21tdV9mb3VuZCh2b2lkKQorc3RhdGljIGlubGluZSBib29sIGlvbW11X3ByZXNlbnQoc3RydWN0IGJ1c190eXBlICpidXMpCiB7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11X2RvbWFpbl9hbGxvYyh2b2lkKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW5fYWxsb2Moc3RydWN0IGJ1c190eXBlICpidXMpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xMjMsNiArMTc0LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb21tdV9zZXRfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJCWlvbW11X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVyKQoreworfQorCiAjZW5kaWYgLyogQ09ORklHX0lPTU1VX0FQSSAqLwogCiAjZW5kaWYgLyogX19MSU5VWF9JT01NVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwbWkuaCBiL2luY2x1ZGUvbGludXgvaXBtaS5oCmluZGV4IGNhODVjZjguLmJiZDE1NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBtaS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXBtaS5oCkBAIC0yMjAsMTAgKzIyMCwxMSBAQAogICogVGhlIGluLWtlcm5lbCBpbnRlcmZhY2UuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCitzdHJ1Y3QgbW9kdWxlOworCiAvKiBPcGFxdWUgdHlwZSBmb3IgYSBJUE1JIG1lc3NhZ2UgdXNlci4gIE9uZSBvZiB0aGVzZSBpcyBuZWVkZWQgdG8KICAgIHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMuICovCiB0eXBlZGVmIHN0cnVjdCBpcG1pX3VzZXIgKmlwbWlfdXNlcl90OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcG1pX3NtaS5oIGIvaW5jbHVkZS9saW51eC9pcG1pX3NtaS5oCmluZGV4IDIwNGY5Y2QuLjNlZjBkOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBtaV9zbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwbWlfc21pLmgKQEAgLTM2LDcgKzM2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lwbWlfbXNnZGVmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pcG1pLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCA1OWU0OWM4Li5iZmYyOWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTIzLDEzICsyMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogCiBzdHJ1Y3Qgc2VxX2ZpbGU7CitzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IGlycV9kZXNjOwogc3RydWN0IGlycV9kYXRhOwogdHlwZWRlZgl2b2lkICgqaXJxX2Zsb3dfaGFuZGxlcl90KSh1bnNpZ25lZCBpbnQgaXJxLApAQCAtNTY3LDMwICs1NjcsMjIgQEAKIGludCBfX2lycV9hbGxvY19kZXNjcyhpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IGNudCwgaW50IG5vZGUsCiAJCXN0cnVjdCBtb2R1bGUgKm93bmVyKTsKIAotc3RhdGljIGlubGluZSBpbnQgaXJxX2FsbG9jX2Rlc2NzKGludCBpcnEsIHVuc2lnbmVkIGludCBmcm9tLCB1bnNpZ25lZCBpbnQgY250LAotCQlpbnQgbm9kZSkKLXsKLQlyZXR1cm4gX19pcnFfYWxsb2NfZGVzY3MoaXJxLCBmcm9tLCBjbnQsIG5vZGUsIFRISVNfTU9EVUxFKTsKLX0KKy8qIHVzZSBtYWNyb3MgdG8gYXZvaWQgbmVlZGluZyBleHBvcnQuaCBmb3IgVEhJU19NT0RVTEUgKi8KKyNkZWZpbmUgaXJxX2FsbG9jX2Rlc2NzKGlycSwgZnJvbSwgY250LCBub2RlKQlcCisJX19pcnFfYWxsb2NfZGVzY3MoaXJxLCBmcm9tLCBjbnQsIG5vZGUsIFRISVNfTU9EVUxFKQorCisjZGVmaW5lIGlycV9hbGxvY19kZXNjKG5vZGUpCQkJXAorCWlycV9hbGxvY19kZXNjcygtMSwgMCwgMSwgbm9kZSkKKworI2RlZmluZSBpcnFfYWxsb2NfZGVzY19hdChhdCwgbm9kZSkJCVwKKwlpcnFfYWxsb2NfZGVzY3MoYXQsIGF0LCAxLCBub2RlKQorCisjZGVmaW5lIGlycV9hbGxvY19kZXNjX2Zyb20oZnJvbSwgbm9kZSkJCVwKKwlpcnFfYWxsb2NfZGVzY3MoLTEsIGZyb20sIDEsIG5vZGUpCiAKIHZvaWQgaXJxX2ZyZWVfZGVzY3ModW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGNudCk7CiBpbnQgaXJxX3Jlc2VydmVfaXJxcyh1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IGNudCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlycV9hbGxvY19kZXNjKGludCBub2RlKQotewotCXJldHVybiBpcnFfYWxsb2NfZGVzY3MoLTEsIDAsIDEsIG5vZGUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpcnFfYWxsb2NfZGVzY19hdCh1bnNpZ25lZCBpbnQgYXQsIGludCBub2RlKQotewotCXJldHVybiBpcnFfYWxsb2NfZGVzY3MoYXQsIGF0LCAxLCBub2RlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXJxX2FsbG9jX2Rlc2NfZnJvbSh1bnNpZ25lZCBpbnQgZnJvbSwgaW50IG5vZGUpCi17Ci0JcmV0dXJuIGlycV9hbGxvY19kZXNjcygtMSwgZnJvbSwgMSwgbm9kZSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZnJlZV9kZXNjKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaXJxX2ZyZWVfZGVzY3MoaXJxLCAxKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oIGIvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKaW5kZXggNmI2OWMyYy4uZjFlMjUyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKQEAgLTExLDYgKzExLDcgQEAKIHN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5Owogc3RydWN0IHByb2NfZGlyX2VudHJ5Owogc3RydWN0IHRpbWVyX3JhbmRfc3RhdGU7CitzdHJ1Y3QgbW9kdWxlOwogLyoqCiAgKiBzdHJ1Y3QgaXJxX2Rlc2MgLSBpbnRlcnJ1cHQgZGVzY3JpcHRvcgogICogQGlycV9kYXRhOgkJcGVyIGlycSBhbmQgY2hpcCBkYXRhIHBhc3NlZCBkb3duIHRvIGNoaXAgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycWRvbWFpbi5oIGIvaW5jbHVkZS9saW51eC9pcnFkb21haW4uaAppbmRleCAzYWQ1NTNlLi45OTgzNGU1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFkb21haW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycWRvbWFpbi5oCkBAIC00Nyw2ICs0Nyw3IEBACiAgKiAgICAgICAgICAgIG9mIHRoZSBpcnFfZG9tYWluIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBhcnJheSBvZgogICogICAgICAgICAgICBpcnFfZGVzYyBzdHJ1Y3R1cmVzLgogICogQG5yX2lycTogTnVtYmVyIG9mIGlycXMgbWFuYWdlZCBieSB0aGUgaXJxIGRvbWFpbgorICogQGh3aXJxX2Jhc2U6IFN0YXJ0aW5nIG51bWJlciBmb3IgaHdpcnFzIG1hbmFnZWQgYnkgdGhlIGlycSBkb21haW4KICAqIEBvcHM6IHBvaW50ZXIgdG8gaXJxX2RvbWFpbiBtZXRob2RzCiAgKiBAcHJpdjogcHJpdmF0ZSBkYXRhIHBvaW50ZXIgZm9yIHVzZSBieSBvd25lci4gIE5vdCB0b3VjaGVkIGJ5IGlycV9kb21haW4KICAqICAgICAgICBjb3JlIGNvZGUuCkBAIC01Nyw2ICs1OCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKIAl1bnNpZ25lZCBpbnQgbnJfaXJxOworCXVuc2lnbmVkIGludCBod2lycV9iYXNlOwogCWNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyAqb3BzOwogCXZvaWQgKnByaXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOwpAQCAtNzIsOSArNzQsMjEgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlycV9kb21haW5fdG9faXJxKHN0cnVjdCBpcnFfZG9tYWluICpkLAogCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgaHdpcnEpCiB7Ci0JcmV0dXJuIGQtPm9wcy0+dG9faXJxID8gZC0+b3BzLT50b19pcnEoZCwgaHdpcnEpIDogZC0+aXJxX2Jhc2UgKyBod2lycTsKKwlpZiAoZC0+b3BzLT50b19pcnEpCisJCXJldHVybiBkLT5vcHMtPnRvX2lycShkLCBod2lycSk7CisJaWYgKFdBUk5fT04oaHdpcnEgPCBkLT5od2lycV9iYXNlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGQtPmlycV9iYXNlICsgaHdpcnEgLSBkLT5od2lycV9iYXNlOwogfQogCisjZGVmaW5lIGlycV9kb21haW5fZm9yX2VhY2hfaHdpcnEoZCwgaHcpIFwKKwlmb3IgKGh3ID0gZC0+aHdpcnFfYmFzZTsgaHcgPCBkLT5od2lycV9iYXNlICsgZC0+bnJfaXJxOyBodysrKQorCisjZGVmaW5lIGlycV9kb21haW5fZm9yX2VhY2hfaXJxKGQsIGh3LCBpcnEpIFwKKwlmb3IgKGh3ID0gZC0+aHdpcnFfYmFzZSwgaXJxID0gaXJxX2RvbWFpbl90b19pcnEoZCwgaHcpOyBcCisJICAgICBodyA8IGQtPmh3aXJxX2Jhc2UgKyBkLT5ucl9pcnE7IFwKKwkgICAgIGh3KyssIGlycSA9IGlycV9kb21haW5fdG9faXJxKGQsIGh3KSkKKwogZXh0ZXJuIHZvaWQgaXJxX2RvbWFpbl9hZGQoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbik7CiBleHRlcm4gdm9pZCBpcnFfZG9tYWluX2RlbChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluKTsKICNlbmRpZiAvKiBDT05GSUdfSVJRX0RPTUFJTiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmQuaCBiL2luY2x1ZGUvbGludXgvamJkLmgKaW5kZXggZTZhNWUzNC4uYzdhY2RkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2piZC5oCkBAIC0yNDQsNiArMjQ0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmRfY29tbW9uLmg+CiAKICNkZWZpbmUgSl9BU1NFUlQoYXNzZXJ0KQlCVUdfT04oIShhc3NlcnQpKQogCkBAIC0yNzAsNjkgKzI3MSw2IEBACiAjZGVmaW5lIEpfRVhQRUNUX0pIKGpoLCBleHByLCB3aHkuLi4pCV9fam91cm5hbF9leHBlY3QoZXhwciwgIyMgd2h5KQogI2VuZGlmCiAKLWVudW0gamJkX3N0YXRlX2JpdHMgewotCUJIX0pCRAkJCS8qIEhhcyBhbiBhdHRhY2hlZCBleHQzIGpvdXJuYWxfaGVhZCAqLwotCSAgPSBCSF9Qcml2YXRlU3RhcnQsCi0JQkhfSldyaXRlLAkJLyogQmVpbmcgd3JpdHRlbiB0byBsb2cgKEBAQCBERUJVR0dJTkcpICovCi0JQkhfRnJlZWQsCQkvKiBIYXMgYmVlbiBmcmVlZCAodHJ1bmNhdGVkKSAqLwotCUJIX1Jldm9rZWQsCQkvKiBIYXMgYmVlbiByZXZva2VkIGZyb20gdGhlIGxvZyAqLwotCUJIX1Jldm9rZVZhbGlkLAkJLyogUmV2b2tlZCBmbGFnIGlzIHZhbGlkICovCi0JQkhfSkJERGlydHksCQkvKiBJcyBkaXJ0eSBidXQgam91cm5hbGVkICovCi0JQkhfU3RhdGUsCQkvKiBQaW5zIG1vc3Qgam91cm5hbF9oZWFkIHN0YXRlICovCi0JQkhfSm91cm5hbEhlYWQsCQkvKiBQaW5zIGJoLT5iX3ByaXZhdGUgYW5kIGpoLT5iX2JoICovCi0JQkhfVW5zaGFkb3csCQkvKiBEdW1teSBiaXQsIGZvciBCSl9TaGFkb3cgd2FrZXVwIGZpbHRlcmluZyAqLwotfTsKLQotQlVGRkVSX0ZOUyhKQkQsIGpiZCkKLUJVRkZFUl9GTlMoSldyaXRlLCBqd3JpdGUpCi1CVUZGRVJfRk5TKEpCRERpcnR5LCBqYmRkaXJ0eSkKLVRBU19CVUZGRVJfRk5TKEpCRERpcnR5LCBqYmRkaXJ0eSkKLUJVRkZFUl9GTlMoUmV2b2tlZCwgcmV2b2tlZCkKLVRBU19CVUZGRVJfRk5TKFJldm9rZWQsIHJldm9rZWQpCi1CVUZGRVJfRk5TKFJldm9rZVZhbGlkLCByZXZva2V2YWxpZCkKLVRBU19CVUZGRVJfRk5TKFJldm9rZVZhbGlkLCByZXZva2V2YWxpZCkKLUJVRkZFUl9GTlMoRnJlZWQsIGZyZWVkKQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBidWZmZXJfaGVhZCAqamgyYmgoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCi17Ci0JcmV0dXJuIGpoLT5iX2JoOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBqb3VybmFsX2hlYWQgKmJoMmpoKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JcmV0dXJuIGJoLT5iX3ByaXZhdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqYmRfbG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWJpdF9zcGluX2xvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGpiZF90cnlsb2NrX2JoX3N0YXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JcmV0dXJuIGJpdF9zcGluX3RyeWxvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGpiZF9pc19sb2NrZWRfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlyZXR1cm4gYml0X3NwaW5faXNfbG9ja2VkKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgamJkX3VubG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWJpdF9zcGluX3VubG9jayhCSF9TdGF0ZSwgJmJoLT5iX3N0YXRlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWJpdF9zcGluX2xvY2soQkhfSm91cm5hbEhlYWQsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqYmRfdW5sb2NrX2JoX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWJpdF9zcGluX3VubG9jayhCSF9Kb3VybmFsSGVhZCwgJmJoLT5iX3N0YXRlKTsKLX0KLQogc3RydWN0IGpiZF9yZXZva2VfdGFibGVfczsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZDIuaCBiL2luY2x1ZGUvbGludXgvamJkMi5oCmluZGV4IDM4ZjMwN2IuLjIwOTJlYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamJkMi5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkMi5oCkBAIC0yNzUsNiArMjc1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmRfY29tbW9uLmg+CiAKICNkZWZpbmUgSl9BU1NFUlQoYXNzZXJ0KQlCVUdfT04oIShhc3NlcnQpKQogCkBAIC0zMDIsNzAgKzMwMyw2IEBACiAjZGVmaW5lIEpfRVhQRUNUX0pIKGpoLCBleHByLCB3aHkuLi4pCV9fam91cm5hbF9leHBlY3QoZXhwciwgIyMgd2h5KQogI2VuZGlmCiAKLWVudW0gamJkX3N0YXRlX2JpdHMgewotCUJIX0pCRAkJCS8qIEhhcyBhbiBhdHRhY2hlZCBleHQzIGpvdXJuYWxfaGVhZCAqLwotCSAgPSBCSF9Qcml2YXRlU3RhcnQsCi0JQkhfSldyaXRlLAkJLyogQmVpbmcgd3JpdHRlbiB0byBsb2cgKEBAQCBERUJVR0dJTkcpICovCi0JQkhfRnJlZWQsCQkvKiBIYXMgYmVlbiBmcmVlZCAodHJ1bmNhdGVkKSAqLwotCUJIX1Jldm9rZWQsCQkvKiBIYXMgYmVlbiByZXZva2VkIGZyb20gdGhlIGxvZyAqLwotCUJIX1Jldm9rZVZhbGlkLAkJLyogUmV2b2tlZCBmbGFnIGlzIHZhbGlkICovCi0JQkhfSkJERGlydHksCQkvKiBJcyBkaXJ0eSBidXQgam91cm5hbGVkICovCi0JQkhfU3RhdGUsCQkvKiBQaW5zIG1vc3Qgam91cm5hbF9oZWFkIHN0YXRlICovCi0JQkhfSm91cm5hbEhlYWQsCQkvKiBQaW5zIGJoLT5iX3ByaXZhdGUgYW5kIGpoLT5iX2JoICovCi0JQkhfVW5zaGFkb3csCQkvKiBEdW1teSBiaXQsIGZvciBCSl9TaGFkb3cgd2FrZXVwIGZpbHRlcmluZyAqLwotCUJIX0pCRFByaXZhdGVTdGFydCwJLyogRmlyc3QgYml0IGF2YWlsYWJsZSBmb3IgcHJpdmF0ZSB1c2UgYnkgRlMgKi8KLX07Ci0KLUJVRkZFUl9GTlMoSkJELCBqYmQpCi1CVUZGRVJfRk5TKEpXcml0ZSwgandyaXRlKQotQlVGRkVSX0ZOUyhKQkREaXJ0eSwgamJkZGlydHkpCi1UQVNfQlVGRkVSX0ZOUyhKQkREaXJ0eSwgamJkZGlydHkpCi1CVUZGRVJfRk5TKFJldm9rZWQsIHJldm9rZWQpCi1UQVNfQlVGRkVSX0ZOUyhSZXZva2VkLCByZXZva2VkKQotQlVGRkVSX0ZOUyhSZXZva2VWYWxpZCwgcmV2b2tldmFsaWQpCi1UQVNfQlVGRkVSX0ZOUyhSZXZva2VWYWxpZCwgcmV2b2tldmFsaWQpCi1CVUZGRVJfRk5TKEZyZWVkLCBmcmVlZCkKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmpoMmJoKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQotewotCXJldHVybiBqaC0+Yl9iaDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgam91cm5hbF9oZWFkICpiaDJqaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCXJldHVybiBiaC0+Yl9wcml2YXRlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgamJkX2xvY2tfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaXRfc3Bpbl9sb2NrKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBqYmRfdHJ5bG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCXJldHVybiBiaXRfc3Bpbl90cnlsb2NrKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JcmV0dXJuIGJpdF9zcGluX2lzX2xvY2tlZChCSF9TdGF0ZSwgJmJoLT5iX3N0YXRlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGpiZF91bmxvY2tfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaXRfc3Bpbl91bmxvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqYmRfbG9ja19iaF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaXRfc3Bpbl9sb2NrKEJIX0pvdXJuYWxIZWFkLCAmYmgtPmJfc3RhdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaXRfc3Bpbl91bmxvY2soQkhfSm91cm5hbEhlYWQsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KIC8qIEZsYWdzIGluIGpiZF9pbm9kZS0+aV9mbGFncyAqLwogI2RlZmluZSBfX0pJX0NPTU1JVF9SVU5OSU5HIDAKIC8qIENvbW1pdCBvZiB0aGUgaW5vZGUgZGF0YSBpbiBwcm9ncmVzcy4gV2UgdXNlIHRoaXMgZmxhZyB0byBwcm90ZWN0IHVzIGZyb20KQEAgLTExMDYsOSArMTA0Myw5IEBACiAgKi8KIAogZXh0ZXJuIGhhbmRsZV90ICpqYmQyX2pvdXJuYWxfc3RhcnQoam91cm5hbF90ICosIGludCBuYmxvY2tzKTsKLWV4dGVybiBoYW5kbGVfdCAqamJkMl9fam91cm5hbF9zdGFydChqb3VybmFsX3QgKiwgaW50IG5ibG9ja3MsIGludCBnZnBfbWFzayk7CitleHRlcm4gaGFuZGxlX3QgKmpiZDJfX2pvdXJuYWxfc3RhcnQoam91cm5hbF90ICosIGludCBuYmxvY2tzLCBnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gaW50CSBqYmQyX2pvdXJuYWxfcmVzdGFydChoYW5kbGVfdCAqLCBpbnQgbmJsb2Nrcyk7Ci1leHRlcm4gaW50CSBqYmQyX19qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKiwgaW50IG5ibG9ja3MsIGludCBnZnBfbWFzayk7CitleHRlcm4gaW50CSBqYmQyX19qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKiwgaW50IG5ibG9ja3MsIGdmcF90IGdmcF9tYXNrKTsKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9leHRlbmQgKGhhbmRsZV90ICosIGludCBuYmxvY2tzKTsKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZV90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyAoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmRfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L2piZF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMwZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9qYmRfY29tbW9uLmgKQEAgLTAsMCArMSw2OCBAQAorI2lmbmRlZiBfTElOVVhfSkJEX1NUQVRFX0gKKyNkZWZpbmUgX0xJTlVYX0pCRF9TVEFURV9ICisKK2VudW0gamJkX3N0YXRlX2JpdHMgeworCUJIX0pCRAkJCS8qIEhhcyBhbiBhdHRhY2hlZCBleHQzIGpvdXJuYWxfaGVhZCAqLworCSAgPSBCSF9Qcml2YXRlU3RhcnQsCisJQkhfSldyaXRlLAkJLyogQmVpbmcgd3JpdHRlbiB0byBsb2cgKEBAQCBERUJVR0dJTkcpICovCisJQkhfRnJlZWQsCQkvKiBIYXMgYmVlbiBmcmVlZCAodHJ1bmNhdGVkKSAqLworCUJIX1Jldm9rZWQsCQkvKiBIYXMgYmVlbiByZXZva2VkIGZyb20gdGhlIGxvZyAqLworCUJIX1Jldm9rZVZhbGlkLAkJLyogUmV2b2tlZCBmbGFnIGlzIHZhbGlkICovCisJQkhfSkJERGlydHksCQkvKiBJcyBkaXJ0eSBidXQgam91cm5hbGVkICovCisJQkhfU3RhdGUsCQkvKiBQaW5zIG1vc3Qgam91cm5hbF9oZWFkIHN0YXRlICovCisJQkhfSm91cm5hbEhlYWQsCQkvKiBQaW5zIGJoLT5iX3ByaXZhdGUgYW5kIGpoLT5iX2JoICovCisJQkhfVW5zaGFkb3csCQkvKiBEdW1teSBiaXQsIGZvciBCSl9TaGFkb3cgd2FrZXVwIGZpbHRlcmluZyAqLworCUJIX0pCRFByaXZhdGVTdGFydCwJLyogRmlyc3QgYml0IGF2YWlsYWJsZSBmb3IgcHJpdmF0ZSB1c2UgYnkgRlMgKi8KK307CisKK0JVRkZFUl9GTlMoSkJELCBqYmQpCitCVUZGRVJfRk5TKEpXcml0ZSwgandyaXRlKQorQlVGRkVSX0ZOUyhKQkREaXJ0eSwgamJkZGlydHkpCitUQVNfQlVGRkVSX0ZOUyhKQkREaXJ0eSwgamJkZGlydHkpCitCVUZGRVJfRk5TKFJldm9rZWQsIHJldm9rZWQpCitUQVNfQlVGRkVSX0ZOUyhSZXZva2VkLCByZXZva2VkKQorQlVGRkVSX0ZOUyhSZXZva2VWYWxpZCwgcmV2b2tldmFsaWQpCitUQVNfQlVGRkVSX0ZOUyhSZXZva2VWYWxpZCwgcmV2b2tldmFsaWQpCitCVUZGRVJfRk5TKEZyZWVkLCBmcmVlZCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmpoMmJoKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXJldHVybiBqaC0+Yl9iaDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgam91cm5hbF9oZWFkICpiaDJqaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiBiaC0+Yl9wcml2YXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgamJkX2xvY2tfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaXRfc3Bpbl9sb2NrKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBqYmRfdHJ5bG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiBiaXRfc3Bpbl90cnlsb2NrKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIGJpdF9zcGluX2lzX2xvY2tlZChCSF9TdGF0ZSwgJmJoLT5iX3N0YXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGpiZF91bmxvY2tfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaXRfc3Bpbl91bmxvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqYmRfbG9ja19iaF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaXRfc3Bpbl9sb2NrKEJIX0pvdXJuYWxIZWFkLCAmYmgtPmJfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaXRfc3Bpbl91bmxvY2soQkhfSm91cm5hbEhlYWQsICZiaC0+Yl9zdGF0ZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmggYi9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaAppbmRleCA2NmYyM2RjLi4zODhiMGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaApAQCAtMTYsNyArMTYsNyBAQAogCiAjIGluY2x1ZGUgPGFzbS9qdW1wX2xhYmVsLmg+CiAjIGRlZmluZSBIQVZFX0pVTVBfTEFCRUwKLSNlbmRpZgorI2VuZGlmCS8qIENDX0hBVkVfQVNNX0dPVE8gJiYgQ09ORklHX0pVTVBfTEFCRUwgKi8KIAogZW51bSBqdW1wX2xhYmVsX3R5cGUgewogCUpVTVBfTEFCRUxfRElTQUJMRSA9IDAsCkBAIC0yOCw5ICsyOCw5IEBACiAjaWZkZWYgSEFWRV9KVU1QX0xBQkVMCiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUwotI2RlZmluZSBKVU1QX0xBQkVMX0lOSVQge3sgMCB9LCBOVUxMLCBOVUxMfQorI2RlZmluZSBKVU1QX0xBQkVMX0lOSVQge0FUT01JQ19JTklUKDApLCBOVUxMLCBOVUxMfQogI2Vsc2UKLSNkZWZpbmUgSlVNUF9MQUJFTF9JTklUIHt7IDAgfSwgTlVMTH0KKyNkZWZpbmUgSlVNUF9MQUJFTF9JTklUIHtBVE9NSUNfSU5JVCgwKSwgTlVMTH0KICNlbmRpZgogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgc3RhdGljX2JyYW5jaChzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSkKQEAgLTQxLDE4ICs0MSwyMCBAQAogZXh0ZXJuIHN0cnVjdCBqdW1wX2VudHJ5IF9fc3RhcnRfX19qdW1wX3RhYmxlW107CiBleHRlcm4gc3RydWN0IGp1bXBfZW50cnkgX19zdG9wX19fanVtcF90YWJsZVtdOwogCitleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2xvY2sodm9pZCk7CiBleHRlcm4gdm9pZCBqdW1wX2xhYmVsX3VubG9jayh2b2lkKTsKIGV4dGVybiB2b2lkIGFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0oc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAotCQkJCSBlbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlKTsKLWV4dGVybiB2b2lkIGFyY2hfanVtcF9sYWJlbF90ZXh0X3Bva2VfZWFybHkoanVtcF9sYWJlbF90IGFkZHIpOworCQkJCSAgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpOworZXh0ZXJuIHZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAorCQkJCQkgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpOwogZXh0ZXJuIGludCBqdW1wX2xhYmVsX3RleHRfcmVzZXJ2ZWQodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCk7CiBleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2luYyhzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSk7CiBleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2RlYyhzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSk7CiBleHRlcm4gYm9vbCBqdW1wX2xhYmVsX2VuYWJsZWQoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpOwogZXh0ZXJuIHZvaWQganVtcF9sYWJlbF9hcHBseV9ub3BzKHN0cnVjdCBtb2R1bGUgKm1vZCk7CiAKLSNlbHNlCisjZWxzZSAgLyogIUhBVkVfSlVNUF9MQUJFTCAqLwogCiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKQEAgLTYyLDYgKzY0LDEwIEBACiAJYXRvbWljX3QgZW5hYmxlZDsKIH07CiAKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBqdW1wX2xhYmVsX2luaXQodm9pZCkKK3sKK30KKwogc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIHN0YXRpY19icmFuY2goc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpCiB7CiAJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZrZXktPmVuYWJsZWQpKSkKQEAgLTk2LDcgKzEwMiw2IEBACiB7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYJLyogSEFWRV9KVU1QX0xBQkVMICovCiAKLSNlbmRpZgotCi0jZW5kaWYKKyNlbmRpZgkvKiBfTElOVVhfSlVNUF9MQUJFTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmggYi9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgKaW5kZXggMGRmNTEzYi4uMzg3NTcxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oCisrKyBiL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaApAQCAtMTAxLDkgKzEwMSw4IEBACiAjZW5kaWYgLypDT05GSUdfS0FMTFNZTVMqLwogCiAvKiBUaGlzIG1hY3JvIGFsbG93cyB1cyB0byBrZWVwIHByaW50ayB0eXBlY2hlY2tpbmcgKi8KLXN0YXRpYyB2b2lkIF9fY2hlY2tfcHJpbnRzeW1fZm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwxLDIpKSk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgX19jaGVja19wcmludHN5bV9mb3JtYXQoY29uc3QgY2hhciAqZm10LCAuLi4pCitzdGF0aWMgX19wcmludGYoMSwgMikKK3ZvaWQgX19jaGVja19wcmludHN5bV9mb3JtYXQoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2RiLmggYi9pbmNsdWRlL2xpbnV4L2tkYi5oCmluZGV4IDUyOWQ5YTAuLjA2NDcyNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2RiLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZGIuaApAQCAtMTE0LDEyICsxMTQsOSBAQAogfSBrZGJfcmVhc29uX3Q7CiAKIGV4dGVybiBpbnQga2RiX3RyYXBfcHJpbnRrOwotZXh0ZXJuIGludCB2a2RiX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKLQkgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAwKSkpOwotZXh0ZXJuIGludCBrZGJfcHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKQotCSAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7Ci10eXBlZGVmIGludCAoKmtkYl9wcmludGZfdCkoY29uc3QgY2hhciAqLCAuLi4pCi0JICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitleHRlcm4gX19wcmludGYoMSwgMCkgaW50IHZrZGJfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKK2V4dGVybiBfX3ByaW50ZigxLCAyKSBpbnQga2RiX3ByaW50Zihjb25zdCBjaGFyICosIC4uLik7Cit0eXBlZGVmIF9fcHJpbnRmKDEsIDIpIGludCAoKmtkYl9wcmludGZfdCkoY29uc3QgY2hhciAqLCAuLi4pOwogCiBleHRlcm4gdm9pZCBrZGJfaW5pdChpbnQgbGV2ZWwpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCA4ZWVmY2Y3Li5lOGIxNTk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTI4Nyw2ICsyODcsOCBAQAogCXJldHVybiBrc3RydG9pbnRfZnJvbV91c2VyKHMsIGNvdW50LCBiYXNlLCByZXMpOwogfQogCisvKiBPYnNvbGV0ZSwgZG8gbm90IHVzZS4gIFVzZSBrc3RydG88Zm9vPiBpbnN0ZWFkICovCisKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNpbXBsZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKixjaGFyICoqLHVuc2lnbmVkIGludCk7CiBleHRlcm4gbG9uZyBzaW1wbGVfc3RydG9sKGNvbnN0IGNoYXIgKixjaGFyICoqLHVuc2lnbmVkIGludCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIHNpbXBsZV9zdHJ0b3VsbChjb25zdCBjaGFyICosY2hhciAqKix1bnNpZ25lZCBpbnQpOwpAQCAtMjk2LDIwICsyOTgsMjAgQEAKICNkZWZpbmUgc3RyaWN0X3N0cnRvdWxsCWtzdHJ0b3VsbAogI2RlZmluZSBzdHJpY3Rfc3RydG9sbAlrc3RydG9sbAogCi1leHRlcm4gaW50IHNwcmludGYoY2hhciAqIGJ1ZiwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLWV4dGVybiBpbnQgdnNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICosIHZhX2xpc3QpCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAwKSkpOwotZXh0ZXJuIGludCBzbnByaW50ZihjaGFyICogYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKLWV4dGVybiBpbnQgdnNucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgMCkpKTsKLWV4dGVybiBpbnQgc2NucHJpbnRmKGNoYXIgKiBidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICogZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIGludCB2c2NucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgMCkpKTsKLWV4dGVybiBjaGFyICprYXNwcmludGYoZ2ZwX3QgZ2ZwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisvKiBsaWIvcHJpbnRmIHV0aWxpdGllcyAqLworCitleHRlcm4gX19wcmludGYoMiwgMykgaW50IHNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICogZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDApIGludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitleHRlcm4gX19wcmludGYoMywgNCkKK2ludCBzbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMywgMCkKK2ludCB2c25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOworZXh0ZXJuIF9fcHJpbnRmKDMsIDQpCitpbnQgc2NucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigzLCAwKQoraW50IHZzY25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitjaGFyICprYXNwcmludGYoZ2ZwX3QgZ2ZwLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiBleHRlcm4gY2hhciAqa3Zhc3ByaW50ZihnZnBfdCBnZnAsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKIAogZXh0ZXJuIGludCBzc2NhbmYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKQEAgLTM2OSwxOCArMzcxLDI0IEBACiAjZGVmaW5lIFRBSU5UX1dBUk4JCQk5CiAjZGVmaW5lIFRBSU5UX0NSQVAJCQkxMAogI2RlZmluZSBUQUlOVF9GSVJNV0FSRV9XT1JLQVJPVU5ECTExCisjZGVmaW5lIFRBSU5UX09PVF9NT0RVTEUJCTEyCiAKIGV4dGVybiBjb25zdCBjaGFyIGhleF9hc2NbXTsKICNkZWZpbmUgaGV4X2FzY19sbyh4KQloZXhfYXNjWygoeCkgJiAweDBmKV0KICNkZWZpbmUgaGV4X2FzY19oaSh4KQloZXhfYXNjWygoeCkgJiAweGYwKSA+PiA0XQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKnBhY2tfaGV4X2J5dGUoY2hhciAqYnVmLCB1OCBieXRlKQorc3RhdGljIGlubGluZSBjaGFyICpoZXhfYnl0ZV9wYWNrKGNoYXIgKmJ1ZiwgdTggYnl0ZSkKIHsKIAkqYnVmKysgPSBoZXhfYXNjX2hpKGJ5dGUpOwogCSpidWYrKyA9IGhleF9hc2NfbG8oYnl0ZSk7CiAJcmV0dXJuIGJ1ZjsKIH0KIAorc3RhdGljIGlubGluZSBjaGFyICogX19kZXByZWNhdGVkIHBhY2tfaGV4X2J5dGUoY2hhciAqYnVmLCB1OCBieXRlKQoreworCXJldHVybiBoZXhfYnl0ZV9wYWNrKGJ1ZiwgYnl0ZSk7Cit9CisKIGV4dGVybiBpbnQgaGV4X3RvX2JpbihjaGFyIGNoKTsKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGhleDJiaW4odTggKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgY291bnQpOwogCkBAIC00MjcsOCArNDM1LDggQEAKIGV4dGVybiB2b2lkIHRyYWNpbmdfc3RvcCh2b2lkKTsKIGV4dGVybiB2b2lkIGZ0cmFjZV9vZmZfcGVybWFuZW50KHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpCi1fX19fdHJhY2VfcHJpbnRrX2NoZWNrX2Zvcm1hdChjb25zdCBjaGFyICpmbXQsIC4uLikKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMSwgMikKK3ZvaWQgX19fX3RyYWNlX3ByaW50a19jaGVja19mb3JtYXQoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiB9CiAjZGVmaW5lIF9fdHJhY2VfcHJpbnRrX2NoZWNrX2Zvcm1hdChmbXQsIGFyZ3MuLi4pCQkJXApAQCAtNDY3LDEzICs0NzUsMTEgQEAKIAkJX190cmFjZV9wcmludGsoX1RISVNfSVBfLCBmbXQsICMjYXJncyk7CQlcCiB9IHdoaWxlICgwKQogCi1leHRlcm4gaW50Ci1fX3RyYWNlX2JwcmludGsodW5zaWduZWQgbG9uZyBpcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgX190cmFjZV9icHJpbnRrKHVuc2lnbmVkIGxvbmcgaXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAotZXh0ZXJuIGludAotX190cmFjZV9wcmludGsodW5zaWduZWQgbG9uZyBpcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgX190cmFjZV9wcmludGsodW5zaWduZWQgbG9uZyBpcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBleHRlcm4gdm9pZCB0cmFjZV9kdW1wX3N0YWNrKHZvaWQpOwogCkBAIC01MDIsOCArNTA4LDggQEAKIAogZXh0ZXJuIHZvaWQgZnRyYWNlX2R1bXAoZW51bSBmdHJhY2VfZHVtcF9tb2RlIG9vcHNfZHVtcF9tb2RlKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludAotdHJhY2VfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDEsIDIpCitpbnQgdHJhY2VfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHRyYWNpbmdfc3RhcnQodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdHJhY2luZ19zdG9wKHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXhlYy5oIGIvaW5jbHVkZS9saW51eC9rZXhlYy5oCmluZGV4IGMyNDc4YTMuLjJmYTA5MDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V4ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tleGVjLmgKQEAgLTMzLDYgKzMzLDE0IEBACiAjZXJyb3IgS0VYRUNfQVJDSCBub3QgZGVmaW5lZAogI2VuZGlmCiAKKyNpZm5kZWYgS0VYRUNfQ1JBU0hfQ09OVFJPTF9NRU1PUllfTElNSVQKKyNkZWZpbmUgS0VYRUNfQ1JBU0hfQ09OVFJPTF9NRU1PUllfTElNSVQgS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQKKyNlbmRpZgorCisjaWZuZGVmIEtFWEVDX0NSQVNIX01FTV9BTElHTgorI2RlZmluZSBLRVhFQ19DUkFTSF9NRU1fQUxJR04gUEFHRV9TSVpFCisjZW5kaWYKKwogI2RlZmluZSBLRVhFQ19OT1RFX0hFQURfQllURVMgQUxJR04oc2l6ZW9mKHN0cnVjdCBlbGZfbm90ZSksIDQpCiAjZGVmaW5lIEtFWEVDX0NPUkVfTk9URV9OQU1FICJDT1JFIgogI2RlZmluZSBLRVhFQ19DT1JFX05PVEVfTkFNRV9CWVRFUyBBTElHTihzaXplb2YoS0VYRUNfQ09SRV9OT1RFX05BTUUpLCA0KQpAQCAtMTI5LDkgKzEzNywxMSBAQAogaW50IGtleGVjX3Nob3VsZF9jcmFzaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiB2b2lkIGNyYXNoX3NhdmVfY3B1KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KTsKIHZvaWQgY3Jhc2hfc2F2ZV92bWNvcmVpbmZvKHZvaWQpOwordm9pZCBjcmFzaF9tYXBfcmVzZXJ2ZWRfcGFnZXModm9pZCk7Cit2b2lkIGNyYXNoX3VubWFwX3Jlc2VydmVkX3BhZ2VzKHZvaWQpOwogdm9pZCBhcmNoX2NyYXNoX3NhdmVfdm1jb3JlaW5mbyh2b2lkKTsKLXZvaWQgdm1jb3JlaW5mb19hcHBlbmRfc3RyKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK19fcHJpbnRmKDEsIDIpCit2b2lkIHZtY29yZWluZm9fYXBwZW5kX3N0cihjb25zdCBjaGFyICpmbXQsIC4uLik7CiB1bnNpZ25lZCBsb25nIHBhZGRyX3ZtY29yZWluZm9fbm90ZSh2b2lkKTsKIAogI2RlZmluZSBWTUNPUkVJTkZPX09TUkVMRUFTRSh2YWx1ZSkgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rbW9kLmggYi9pbmNsdWRlL2xpbnV4L2ttb2QuaAppbmRleCAwZGEzOGNmLi5iMTZmNjUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ttb2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ttb2QuaApAQCAtMzIsOCArMzIsOCBAQAogZXh0ZXJuIGNoYXIgbW9kcHJvYmVfcGF0aFtdOyAvKiBmb3Igc3lzY3RsICovCiAvKiBtb2Rwcm9iZSBleGl0IHN0YXR1cyBvbiBzdWNjZXNzLCAtdmUgb24gZXJyb3IuICBSZXR1cm4gdmFsdWUKICAqIHVzdWFsbHkgdXNlbGVzcyB0aG91Z2guICovCi1leHRlcm4gaW50IF9fcmVxdWVzdF9tb2R1bGUoYm9vbCB3YWl0LCBjb25zdCBjaGFyICpuYW1lLCAuLi4pIFwKLQlfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgX19yZXF1ZXN0X21vZHVsZShib29sIHdhaXQsIGNvbnN0IGNoYXIgKm5hbWUsIC4uLik7CiAjZGVmaW5lIHJlcXVlc3RfbW9kdWxlKG1vZC4uLikgX19yZXF1ZXN0X21vZHVsZSh0cnVlLCBtb2QpCiAjZGVmaW5lIHJlcXVlc3RfbW9kdWxlX25vd2FpdChtb2QuLi4pIF9fcmVxdWVzdF9tb2R1bGUoZmFsc2UsIG1vZCkKICNkZWZpbmUgdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeCwgbW9kLi4uKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaCBiL2luY2x1ZGUvbGludXgva29iamVjdC5oCmluZGV4IDY2ODcyOWMuLmFkODFlMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva29iamVjdC5oCisrKyBiL2luY2x1ZGUvbGludXgva29iamVjdC5oCkBAIC03Miw4ICs3Miw4IEBACiAJdW5zaWduZWQgaW50IHVldmVudF9zdXBwcmVzczoxOwogfTsKIAotZXh0ZXJuIGludCBrb2JqZWN0X3NldF9uYW1lKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBjaGFyICpuYW1lLCAuLi4pCi0JCQkgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQoraW50IGtvYmplY3Rfc2V0X25hbWUoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKm5hbWUsIC4uLik7CiBleHRlcm4gaW50IGtvYmplY3Rfc2V0X25hbWVfdmFyZ3Moc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKmZtdCwKIAkJCQkgIHZhX2xpc3QgdmFyZ3MpOwogCkBAIC04MywxNSArODMsMTMgQEAKIH0KIAogZXh0ZXJuIHZvaWQga29iamVjdF9pbml0KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial90eXBlICprdHlwZSk7Ci1leHRlcm4gaW50IF9fbXVzdF9jaGVjayBrb2JqZWN0X2FkZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgc3RydWN0IGtvYmplY3QgKnBhcmVudCwKLQkJCQkgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKLWV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGtvYmplY3RfaW5pdF9hbmRfYWRkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQkgICAgIHN0cnVjdCBrb2JqX3R5cGUgKmt0eXBlLAotCQkJCQkgICAgIHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQsCi0JCQkJCSAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNCwgNSkpKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KSBfX211c3RfY2hlY2sKK2ludCBrb2JqZWN0X2FkZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmplY3QgKnBhcmVudCwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDQsIDUpIF9fbXVzdF9jaGVjaworaW50IGtvYmplY3RfaW5pdF9hbmRfYWRkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJIHN0cnVjdCBrb2JqX3R5cGUgKmt0eXBlLCBzdHJ1Y3Qga29iamVjdCAqcGFyZW50LAorCQkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogZXh0ZXJuIHZvaWQga29iamVjdF9kZWwoc3RydWN0IGtvYmplY3QgKmtvYmopOwogCkBAIC0yMTIsOCArMjEwLDggQEAKIGludCBrb2JqZWN0X3VldmVudF9lbnYoc3RydWN0IGtvYmplY3QgKmtvYmosIGVudW0ga29iamVjdF9hY3Rpb24gYWN0aW9uLAogCQkJY2hhciAqZW52cFtdKTsKIAotaW50IGFkZF91ZXZlbnRfdmFyKHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitfX3ByaW50ZigyLCAzKQoraW50IGFkZF91ZXZlbnRfdmFyKHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwogCiBpbnQga29iamVjdF9hY3Rpb25fdHlwZShjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKIAkJCWVudW0ga29iamVjdF9hY3Rpb24gKnR5cGUpOwpAQCAtMjI2LDcgKzIyNCw3IEBACiAJCQkJICAgICAgY2hhciAqZW52cFtdKQogeyByZXR1cm4gMDsgfQogCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMiwgMykKIGludCBhZGRfdWV2ZW50X3ZhcihzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogeyByZXR1cm4gMDsgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t0aHJlYWQuaCBiL2luY2x1ZGUvbGludXgva3RocmVhZC5oCmluZGV4IDFlOTIzZTUuLjVjYWMxOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3RocmVhZC5oCisrKyBiL2luY2x1ZGUvbGludXgva3RocmVhZC5oCkBAIC00LDExICs0LDExIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAorX19wcmludGYoNCwgNSkKIHN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZF9jcmVhdGVfb25fbm9kZShpbnQgKCp0aHJlYWRmbikodm9pZCAqZGF0YSksCiAJCQkJCSAgIHZvaWQgKmRhdGEsCiAJCQkJCSAgIGludCBub2RlLAotCQkJCQkgICBjb25zdCBjaGFyIG5hbWVmbXRbXSwgLi4uKQotCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDQsIDUpKSk7CisJCQkJCSAgIGNvbnN0IGNoYXIgbmFtZWZtdFtdLCAuLi4pOwogCiAjZGVmaW5lIGt0aHJlYWRfY3JlYXRlKHRocmVhZGZuLCBkYXRhLCBuYW1lZm10LCBhcmcuLi4pIFwKIAlrdGhyZWFkX2NyZWF0ZV9vbl9ub2RlKHRocmVhZGZuLCBkYXRhLCAtMSwgbmFtZWZtdCwgIyNhcmcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bS5oIGIvaW5jbHVkZS9saW51eC9rdm0uaAppbmRleCBhYWNlNmI4Li5mNDdmY2QzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bS5oCisrKyBiL2luY2x1ZGUvbGludXgva3ZtLmgKQEAgLTM3MSw2ICszNzEsNyBAQAogI2RlZmluZSBLVk1fUzM5MF9JTlRfVklSVElPCQkweGZmZmYyNjAzdQogI2RlZmluZSBLVk1fUzM5MF9JTlRfU0VSVklDRQkJMHhmZmZmMjQwMXUKICNkZWZpbmUgS1ZNX1MzOTBfSU5UX0VNRVJHRU5DWQkJMHhmZmZmMTIwMXUKKyNkZWZpbmUgS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEwJMHhmZmZmMTIwMnUKIAogc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdCB7CiAJX191MzIgdHlwZTsKQEAgLTQ2Myw3ICs0NjQsNyBAQAogI2RlZmluZSBLVk1fQ0FQX1ZBUElDIDYKICNkZWZpbmUgS1ZNX0NBUF9FWFRfQ1BVSUQgNwogI2RlZmluZSBLVk1fQ0FQX0NMT0NLU09VUkNFIDgKLSNkZWZpbmUgS1ZNX0NBUF9OUl9WQ1BVUyA5ICAgICAgIC8qIHJldHVybnMgbWF4IHZjcHVzIHBlciB2bSAqLworI2RlZmluZSBLVk1fQ0FQX05SX1ZDUFVTIDkgICAgICAgLyogcmV0dXJucyByZWNvbW1lbmRlZCBtYXggdmNwdXMgcGVyIHZtICovCiAjZGVmaW5lIEtWTV9DQVBfTlJfTUVNU0xPVFMgMTAgICAvKiByZXR1cm5zIG1heCBtZW1vcnkgc2xvdHMgcGVyIHZtICovCiAjZGVmaW5lIEtWTV9DQVBfUElUIDExCiAjZGVmaW5lIEtWTV9DQVBfTk9QX0lPX0RFTEFZIDEyCkBAIC01NTMsNiArNTU0LDkgQEAKICNkZWZpbmUgS1ZNX0NBUF9TUEFQUl9UQ0UgNjMKICNkZWZpbmUgS1ZNX0NBUF9QUENfU01UIDY0CiAjZGVmaW5lIEtWTV9DQVBfUFBDX1JNQQk2NQorI2RlZmluZSBLVk1fQ0FQX01BWF9WQ1BVUyA2NiAgICAgICAvKiByZXR1cm5zIG1heCB2Y3B1cyBwZXIgdm0gKi8KKyNkZWZpbmUgS1ZNX0NBUF9QUENfSElPUiA2NworI2RlZmluZSBLVk1fQ0FQX1BQQ19QQVBSIDY4CiAjZGVmaW5lIEtWTV9DQVBfUzM5MF9HTUFQIDcxCiAKICNpZmRlZiBLVk1fQ0FQX0lSUV9ST1VUSU5HCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKaW5kZXggZWFiYjIxYS4uZDUyNjIzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaApAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgpAQCAtNDgsNiArNDksNyBAQAogI2RlZmluZSBLVk1fUkVRX0VWRU5UICAgICAgICAgICAgIDExCiAjZGVmaW5lIEtWTV9SRVFfQVBGX0hBTFQgICAgICAgICAgMTIKICNkZWZpbmUgS1ZNX1JFUV9TVEVBTF9VUERBVEUgICAgICAxMworI2RlZmluZSBLVk1fUkVRX05NSSAgICAgICAgICAgICAgIDE0CiAKICNkZWZpbmUgS1ZNX1VTRVJTUEFDRV9JUlFfU09VUkNFX0lECTAKIApAQCAtNTUsMTYgKzU3LDE2IEBACiBzdHJ1Y3Qga3ZtX3ZjcHU7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmt2bV92Y3B1X2NhY2hlOwogCi0vKgotICogSXQgd291bGQgYmUgbmljZSB0byB1c2Ugc29tZXRoaW5nIHNtYXJ0ZXIgdGhhbiBhIGxpbmVhciBzZWFyY2gsIFRCRC4uLgotICogVGhhbmtmdWxseSB3ZSBkb250IGV4cGVjdCBtYW55IGRldmljZXMgdG8gcmVnaXN0ZXIgKGZhbW91cyBsYXN0IHdvcmRzIDopLAotICogc28gdW50aWwgdGhlbiBpdCB3aWxsIHN1ZmZpY2UuICBBdCBsZWFzdCBpdHMgYWJzdHJhY3RlZCBzbyB3ZSBjYW4gY2hhbmdlCi0gKiBpbiBvbmUgcGxhY2UuCi0gKi8KK3N0cnVjdCBrdm1faW9fcmFuZ2UgeworCWdwYV90IGFkZHI7CisJaW50IGxlbjsKKwlzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2OworfTsKKwogc3RydWN0IGt2bV9pb19idXMgewogCWludCAgICAgICAgICAgICAgICAgICBkZXZfY291bnQ7Ci0jZGVmaW5lIE5SX0lPQlVTX0RFVlMgMjAwCi0Jc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldnNbTlJfSU9CVVNfREVWU107CisjZGVmaW5lIE5SX0lPQlVTX0RFVlMgMzAwCisJc3RydWN0IGt2bV9pb19yYW5nZSByYW5nZVtOUl9JT0JVU19ERVZTXTsKIH07CiAKIGVudW0ga3ZtX2J1cyB7CkBAIC03Nyw4ICs3OSw4IEBACiAJCSAgICAgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsKTsKIGludCBrdm1faW9fYnVzX3JlYWQoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwgZ3BhX3QgYWRkciwgaW50IGxlbiwKIAkJICAgIHZvaWQgKnZhbCk7Ci1pbnQga3ZtX2lvX2J1c19yZWdpc3Rlcl9kZXYoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwKLQkJCSAgICBzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2KTsKK2ludCBrdm1faW9fYnVzX3JlZ2lzdGVyX2RldihzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAorCQkJICAgIGludCBsZW4sIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpOwogaW50IGt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwKIAkJCSAgICAgIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpOwogCkBAIC0yNTYsOCArMjU4LDkgQEAKIAlzdHJ1Y3Qga3ZtX2FyY2ggYXJjaDsKIAlhdG9taWNfdCB1c2Vyc19jb3VudDsKICNpZmRlZiBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQKLQlzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX2RldiAqY29hbGVzY2VkX21taW9fZGV2OwogCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fcmluZyAqY29hbGVzY2VkX21taW9fcmluZzsKKwlzcGlubG9ja190IHJpbmdfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvYWxlc2NlZF96b25lczsKICNlbmRpZgogCiAJc3RydWN0IG11dGV4IGlycV9sb2NrOwpAQCAtMjgxLDExICsyODQsOCBAQAogCiAvKiBUaGUgZ3Vlc3QgZGlkIHNvbWV0aGluZyB3ZSBkb24ndCBzdXBwb3J0LiAqLwogI2RlZmluZSBwcl91bmltcGwodmNwdSwgZm10LCAuLi4pCQkJCQlcCi0gZG8gewkJCQkJCQkJCVwKLQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQkJCQkJCVwKLQkJcHJpbnRrKEtFUk5fRVJSICJrdm06ICVpOiBjcHUlaSAiIGZtdCwJCQlcCi0JCSAgICAgICBjdXJyZW50LT50Z2lkLCAodmNwdSktPnZjcHVfaWQgLCAjIyBfX1ZBX0FSR1NfXyk7IFwKLSB9IHdoaWxlICgwKQorCXByX2Vycl9yYXRlbGltaXRlZCgia3ZtOiAlaTogY3B1JWkgIiBmbXQsCQkJXAorCQkJICAgY3VycmVudC0+dGdpZCwgKHZjcHUpLT52Y3B1X2lkICwgIyMgX19WQV9BUkdTX18pCiAKICNkZWZpbmUga3ZtX3ByaW50Zihrdm0sIGZtdCAuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZtdCkKICNkZWZpbmUgdmNwdV9wcmludGYodmNwdSwgZm10Li4uKSBrdm1fcHJpbnRmKHZjcHUtPmt2bSwgZm10KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJhdGEuaCBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKaW5kZXggZWZkNmY5OC4uY2FmYzA5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCkBAIC0xMDUyLDYgKzEwNTIsOCBAQAogZXh0ZXJuIHZvaWQgYXRhX3Njc2lfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogZXh0ZXJuIGludCBhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAogCQkJCSAgICAgICBpbnQgcXVldWVfZGVwdGgsIGludCByZWFzb24pOworZXh0ZXJuIGludCBfX2F0YV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJCSAgICBpbnQgcXVldWVfZGVwdGgsIGludCByZWFzb24pOwogZXh0ZXJuIHN0cnVjdCBhdGFfZGV2aWNlICphdGFfZGV2X3BhaXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwogZXh0ZXJuIGludCBhdGFfZG9fc2V0X21vZGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCBzdHJ1Y3QgYXRhX2RldmljZSAqKnJfZmFpbGVkX2Rldik7CiBleHRlcm4gdm9pZCBhdGFfc2NzaV9wb3J0X2Vycm9yX2hhbmRsZXIoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IGF0YV9wb3J0ICphcCk7CkBAIC0xMjU0LDEzICsxMjU2LDEzIEBACiAvKgogICogcHJpbnRrIGhlbHBlcnMKICAqLwotX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKK19fcHJpbnRmKDMsIDQpCiBpbnQgYXRhX3BvcnRfcHJpbnRrKGNvbnN0IHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IGNoYXIgKmxldmVsLAogCQkgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKK19fcHJpbnRmKDMsIDQpCiBpbnQgYXRhX2xpbmtfcHJpbnRrKGNvbnN0IHN0cnVjdCBhdGFfbGluayAqbGluaywgY29uc3QgY2hhciAqbGV2ZWwsCiAJCSAgICBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1fX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQorX19wcmludGYoMywgNCkKIGludCBhdGFfZGV2X3ByaW50ayhjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpsZXZlbCwKIAkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCkBAIC0xMzAyLDEwICsxMzA0LDEwIEBACiAvKgogICogYXRhX2VoX2luZm8gaGVscGVycwogICovCi1leHRlcm4gdm9pZCBfX2F0YV9laGlfcHVzaF9kZXNjKHN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gdm9pZCBhdGFfZWhpX3B1c2hfZGVzYyhzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIF9fYXRhX2VoaV9wdXNoX2Rlc2Moc3RydWN0IGF0YV9laF9pbmZvICplaGksIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQordm9pZCBhdGFfZWhpX3B1c2hfZGVzYyhzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogZXh0ZXJuIHZvaWQgYXRhX2VoaV9jbGVhcl9kZXNjKHN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGF0YV9laGlfaG90cGx1Z2dlZChzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSkKQEAgLTEzMTksOCArMTMyMSw4IEBACiAvKgogICogcG9ydCBkZXNjcmlwdGlvbiBoZWxwZXJzCiAgKi8KLWV4dGVybiB2b2lkIGF0YV9wb3J0X2Rlc2Moc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIGF0YV9wb3J0X2Rlc2Moc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2lmZGVmIENPTkZJR19QQ0kKIGV4dGVybiB2b2lkIGF0YV9wb3J0X3BiYXJfZGVzYyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgYmFyLCBzc2l6ZV90IG9mZnNldCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGlzM2x2MDJkLmggYi9pbmNsdWRlL2xpbnV4L2xpczNsdjAyZC5oCmluZGV4IGQ0MjkyYzguLmYxNjY0YzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlzM2x2MDJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9saXMzbHYwMmQuaApAQCAtMTEzLDcgKzExMyw2IEBACiAJczggYXhpc194OwogCXM4IGF4aXNfeTsKIAlzOCBheGlzX3o7Ci0jZGVmaW5lIExJUzNfVVNFX1JFR1VMQVRPUl9DVFJMIDB4MDEKICNkZWZpbmUgTElTM19VU0VfQkxPQ0tfUkVBRAkweDAyCiAJdTE2IGRyaXZlcl9mZWF0dXJlczsKIAlpbnQgZGVmYXVsdF9yYXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sbGlzdC5oIGIvaW5jbHVkZS9saW51eC9sbGlzdC5oCmluZGV4IDcyODc3MzQuLjgwMWI0NGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGxpc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xsaXN0LmgKQEAgLTE0OCw3ICsxNDgsNyBAQAogICogQG5ldzoJbmV3IGVudHJ5IHRvIGJlIGFkZGVkCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbG9jay1sZXNzIGxpc3QKICAqCi0gKiBSZXR1cm4gd2hldGhlciBsaXN0IGlzIGVtcHR5IGJlZm9yZSBhZGRpbmcuCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxpc3Qgd2FzIGVtcHR5IHByaW9yIHRvIGFkZGluZyB0aGlzIGVudHJ5LgogICovCiBzdGF0aWMgaW5saW5lIGJvb2wgbGxpc3RfYWRkKHN0cnVjdCBsbGlzdF9ub2RlICpuZXcsIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb29wLmggYi9pbmNsdWRlL2xpbnV4L2xvb3AuaAppbmRleCA2ODNkNjk4Li4xMWE0MWE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvb3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvb3AuaApAQCAtNzMsOCArNzMsOCBAQAogICovCiBlbnVtIHsKIAlMT19GTEFHU19SRUFEX09OTFkJPSAxLAotCUxPX0ZMQUdTX1VTRV9BT1BTCT0gMiwKIAlMT19GTEFHU19BVVRPQ0xFQVIJPSA0LAorCUxPX0ZMQUdTX1BBUlRTQ0FOCT0gOCwKIH07CiAKICNpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXMuaD4JLyogZm9yIF9fa2VybmVsX29sZF9kZXZfdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYWdpYy5oIGIvaW5jbHVkZS9saW51eC9tYWdpYy5oCmluZGV4IDFlNWRmMmFmLi4yZDRiZWFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKKysrIGIvaW5jbHVkZS9saW51eC9tYWdpYy5oCkBAIC0zMCwxMSArMzAsMTEgQEAKICNkZWZpbmUgQU5PTl9JTk9ERV9GU19NQUdJQwkweDA5MDQxOTM0CiAjZGVmaW5lIFBTVE9SRUZTX01BR0lDCQkweDYxNjU2NzZDCiAKLSNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMJMHgxMzdGCQkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwotI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQzIJMHgxMzhGCQkvKiBtaW5peCBmcywgMzAgY2hhciBuYW1lcyAqLwotI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMJMHgyNDY4CQkvKiBtaW5peCBWMiBmcyAqLwotI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMyCTB4MjQ3OAkJLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KLSNkZWZpbmUgTUlOSVgzX1NVUEVSX01BR0lDCTB4NGQ1YQkJLyogbWluaXggVjMgZnMgKi8KKyNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMJMHgxMzdGCQkvKiBtaW5peCB2MSBmcywgMTQgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQzIJMHgxMzhGCQkvKiBtaW5peCB2MSBmcywgMzAgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMJMHgyNDY4CQkvKiBtaW5peCB2MiBmcywgMTQgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMyCTB4MjQ3OAkJLyogbWluaXggdjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTUlOSVgzX1NVUEVSX01BR0lDCTB4NGQ1YQkJLyogbWluaXggdjMgZnMsIDYwIGNoYXIgbmFtZXMgKi8KIAogI2RlZmluZSBNU0RPU19TVVBFUl9NQUdJQwkweDRkNDQJCS8qIE1EICovCiAjZGVmaW5lIE5DUF9TVVBFUl9NQUdJQwkJMHg1NjRjCQkvKiBHdWVzcywgd2hhdCAweDU2NGMgaXMgOi0pICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21kaW8tYml0YmFuZy5oIGIvaW5jbHVkZS9saW51eC9tZGlvLWJpdGJhbmcuaAppbmRleCA4ZWE5YTQyLi4wZmUwMGNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21kaW8tYml0YmFuZy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWRpby1iaXRiYW5nLmgKQEAgLTIsNyArMiw4IEBACiAjZGVmaW5lIF9fTElOVVhfTURJT19CSVRCQU5HX0gKIAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitzdHJ1Y3QgbW9kdWxlOwogCiBzdHJ1Y3QgbWRpb2JiX2N0cmw7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaAppbmRleCA3NTI1ZTM4Li5lNmI4NDNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oCkBAIC04MCw2ICs4MCw3IEBACiAJCQkJCSAgIHBoeXNfYWRkcl90IGFsaWduLAogCQkJCQkgICBwaHlzX2FkZHJfdCBtYXhfYWRkcik7CiBleHRlcm4gcGh5c19hZGRyX3QgbWVtYmxvY2tfcGh5c19tZW1fc2l6ZSh2b2lkKTsKK2V4dGVybiBwaHlzX2FkZHJfdCBtZW1ibG9ja19zdGFydF9vZl9EUkFNKHZvaWQpOwogZXh0ZXJuIHBoeXNfYWRkcl90IG1lbWJsb2NrX2VuZF9vZl9EUkFNKHZvaWQpOwogZXh0ZXJuIHZvaWQgbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQocGh5c19hZGRyX3QgbWVtb3J5X2xpbWl0KTsKIGV4dGVybiBpbnQgbWVtYmxvY2tfaXNfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmggYi9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaAppbmRleCAzNDNiZDc2Li5iODcwNjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaApAQCAtMzUsNyArMzUsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKIAkJCQkJc3RydWN0IGxpc3RfaGVhZCAqZHN0LAogCQkJCQl1bnNpZ25lZCBsb25nICpzY2FubmVkLCBpbnQgb3JkZXIsCi0JCQkJCWludCBtb2RlLCBzdHJ1Y3Qgem9uZSAqeiwKKwkJCQkJaXNvbGF0ZV9tb2RlX3QgbW9kZSwKKwkJCQkJc3RydWN0IHpvbmUgKnosCiAJCQkJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1fY29udCwKIAkJCQkJaW50IGFjdGl2ZSwgaW50IGZpbGUpOwogCkBAIC03Nyw4ICs3OCw4IEBACiBleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIAotZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9vdXRfb2ZfbWVtb3J5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGdmcF90IGdmcF9tYXNrKTsKLWludCB0YXNrX2luX21lbV9jZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrKTsKK2ludCB0YXNrX2luX21lbV9jZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOwogCiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2Zyb21fdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwpAQCAtODcsMjYgKzg4LDI4IEBACiBzdGF0aWMgaW5saW5lCiBpbnQgbW1fbWF0Y2hfY2dyb3VwKGNvbnN0IHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqY2dyb3VwKQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwogCXJjdV9yZWFkX2xvY2soKTsKLQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UoKG1tKS0+b3duZXIpKTsKKwltZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV90YXNrKHJjdV9kZXJlZmVyZW5jZSgobW0pLT5vd25lcikpOwogCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiBjZ3JvdXAgPT0gbWVtOworCXJldHVybiBjZ3JvdXAgPT0gbWVtY2c7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqbWVtX2Nncm91cF9jc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CitleHRlcm4gc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKm1lbV9jZ3JvdXBfY3NzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CiAKIGV4dGVybiBpbnQKIG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsCiAJc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICoqcHRyLCBnZnBfdCBnZnBfbWFzayk7Ci1leHRlcm4gdm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJc3RydWN0IHBhZ2UgKm9sZHBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlLCBib29sIG1pZ3JhdGlvbl9vayk7CiAKIC8qCiAgKiBGb3IgbWVtb3J5IHJlY2xhaW0uCiAgKi8KLWludCBtZW1fY2dyb3VwX2luYWN0aXZlX2Fub25faXNfbG93KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7Ci1pbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOworaW50IG1lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCSAgICBzdHJ1Y3Qgem9uZSAqem9uZSk7CitpbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCQkJICAgIHN0cnVjdCB6b25lICp6b25lKTsKIGludCBtZW1fY2dyb3VwX3NlbGVjdF92aWN0aW1fbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOwogdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJaW50IG5pZCwgaW50IHppZCwgdW5zaWduZWQgaW50IGxydW1hc2spOwpAQCAtMTQ3LDcgKzE1MCw3IEBACiB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfc29mdF9saW1pdF9yZWNsYWltKHN0cnVjdCB6b25lICp6b25lLCBpbnQgb3JkZXIsCiAJCQkJCQlnZnBfdCBnZnBfbWFzaywKIAkJCQkJCXVuc2lnbmVkIGxvbmcgKnRvdGFsX3NjYW5uZWQpOwotdTY0IG1lbV9jZ3JvdXBfZ2V0X2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwordTY0IG1lbV9jZ3JvdXBfZ2V0X2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CiAKIHZvaWQgbWVtX2Nncm91cF9jb3VudF92bV9ldmVudChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZW51bSB2bV9ldmVudF9pdGVtIGlkeCk7CiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCkBAIC0yNDMsMTggKzI0NiwyMCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtbV9tYXRjaF9jZ3JvdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW5saW5lIGludCBtbV9tYXRjaF9jZ3JvdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgdGFza19pbl9tZW1fY2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKm1lbV9jZ3JvdXBfY3NzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlCisJCSptZW1fY2dyb3VwX2NzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0yNjYsMjIgKzI3MSwyMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJc3RydWN0IHBhZ2UgKm9sZHBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlLCBib29sIG1pZ3JhdGlvbl9vaykKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX25vdGVfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfbm90ZV9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJCWludCBwcmlvcml0eSkKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfcmVjb3JkX3JlY2xhaW1fcHJpb3JpdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX3JlY29yZF9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJCWludCBwcmlvcml0eSkKIHsKIH0KQEAgLTI5MiwxMyArMjk3LDEzIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1tZW1fY2dyb3VwX2luYWN0aXZlX2Fub25faXNfbG93KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKK21lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLW1lbV9jZ3JvdXBfaW5hY3RpdmVfZmlsZV9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQorbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCB6b25lICp6b25lKQogewogCXJldHVybiAxOwogfQpAQCAtMzQ3LDcgKzM1Miw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUKLXU2NCBtZW1fY2dyb3VwX2dldF9saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQordTY0IG1lbV9jZ3JvdXBfZ2V0X2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FiNTUwMC9hYjU1MDAuaCBiL2luY2x1ZGUvbGludXgvbWZkL2FiNTUwMC9hYjU1MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzIwMDUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvYWI1NTAwL2FiNTUwMC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiAyMDExCisgKgorICogTGljZW5zZSBUZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIKKyAqLworI2lmbmRlZiBNRkRfQUI1NTAwX0gKKyNkZWZpbmUgTUZEX0FCNTUwMF9ICisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworZW51bSBhYjU1MDBfZGV2aWQgeworCUFCNTUwMF9ERVZJRF9BREMsCisJQUI1NTAwX0RFVklEX0xFRFMsCisJQUI1NTAwX0RFVklEX1BPV0VSLAorCUFCNTUwMF9ERVZJRF9SRUdVTEFUT1JTLAorCUFCNTUwMF9ERVZJRF9TSU0sCisJQUI1NTAwX0RFVklEX1JUQywKKwlBQjU1MDBfREVWSURfQ0hBUkdFUiwKKwlBQjU1MDBfREVWSURfRlVFTEdBVUdFLAorCUFCNTUwMF9ERVZJRF9WSUJSQVRPUiwKKwlBQjU1MDBfREVWSURfQ09ERUMsCisJQUI1NTAwX0RFVklEX1VTQiwKKwlBQjU1MDBfREVWSURfT1RQLAorCUFCNTUwMF9ERVZJRF9WSURFTywKKwlBQjU1MDBfREVWSURfREJJRUNJLAorCUFCNTUwMF9ERVZJRF9PTlNXQSwKKwlBQjU1MDBfTlVNX0RFVklDRVMsCit9OworCitlbnVtIGFiNTUwMF9iYW5rcyB7CisJQUI1NTAwX0JBTktfVklUX0lPX0kyQ19DTEtfVFNUX09UUCA9IDAsCisJQUI1NTAwX0JBTktfVkRERElHX0lPX0kyQ19DTEtfVFNUID0gMSwKKwlBQjU1MDBfQkFOS19WREVOQyA9IDIsCisJQUI1NTAwX0JBTktfU0lNX1VTQlNJTSAgPSAzLAorCUFCNTUwMF9CQU5LX0xFRCA9IDQsCisJQUI1NTAwX0JBTktfQURDICA9IDUsCisJQUI1NTAwX0JBTktfUlRDICA9IDYsCisJQUI1NTAwX0JBTktfU1RBUlRVUCAgPSA3LAorCUFCNTUwMF9CQU5LX0RCSV9FQ0kgID0gOCwKKwlBQjU1MDBfQkFOS19DSEcgID0gOSwKKwlBQjU1MDBfQkFOS19GR19CQVRUQ09NX0FDQyA9IDEwLAorCUFCNTUwMF9CQU5LX1VTQiA9IDExLAorCUFCNTUwMF9CQU5LX0lUID0gMTIsCisJQUI1NTAwX0JBTktfVklCUkEgPSAxMywKKwlBQjU1MDBfQkFOS19BVURJT19IRUFEU0VUVVNCID0gMTQsCisJQUI1NTAwX05VTV9CQU5LUyA9IDE1LAorfTsKKworZW51bSBhYjU1MDBfYmFua3NfYWRkciB7CisJQUI1NTAwX0FERFJfVklUX0lPX0kyQ19DTEtfVFNUX09UUCA9IDB4NEEsCisJQUI1NTAwX0FERFJfVkRERElHX0lPX0kyQ19DTEtfVFNUID0gMHg0QiwKKwlBQjU1MDBfQUREUl9WREVOQyA9IDB4MDYsCisJQUI1NTAwX0FERFJfU0lNX1VTQlNJTSAgPSAweDA0LAorCUFCNTUwMF9BRERSX0xFRCA9IDB4MTAsCisJQUI1NTAwX0FERFJfQURDICA9IDB4MEEsCisJQUI1NTAwX0FERFJfUlRDICA9IDB4MEYsCisJQUI1NTAwX0FERFJfU1RBUlRVUCAgPSAweDAzLAorCUFCNTUwMF9BRERSX0RCSV9FQ0kgID0gMHgwNywKKwlBQjU1MDBfQUREUl9DSEcgID0gMHgwQiwKKwlBQjU1MDBfQUREUl9GR19CQVRUQ09NX0FDQyA9IDB4MEMsCisJQUI1NTAwX0FERFJfVVNCID0gMHgwNSwKKwlBQjU1MDBfQUREUl9JVCA9IDB4MEUsCisJQUI1NTAwX0FERFJfVklCUkEgPSAweDAyLAorCUFCNTUwMF9BRERSX0FVRElPX0hFQURTRVRVU0IgPSAweDBELAorfTsKKworLyoKKyAqIEludGVycnVwdCByZWdpc3RlciBvZmZzZXRzCisgKiBCYW5rIDogMHgwRQorICovCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UwX1JFRwkJMHgyMAorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMV9SRUcJCTB4MjEKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTJfUkVHCQkweDIyCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UzX1JFRwkJMHgyMworI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFNF9SRUcJCTB4MjQKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTVfUkVHCQkweDI1CisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0U2X1JFRwkJMHgyNgorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFN19SRUcJCTB4MjcKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRThfUkVHCQkweDI4CisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0U5X1JFRwkJMHgyOQorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMTBfUkVHCQkweDJBCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UxMV9SRUcJCTB4MkIKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTEyX1JFRwkJMHgyQworI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMTNfUkVHCQkweDJECisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UxNF9SRUcJCTB4MkUKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTE1X1JFRwkJMHgyRgorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMTZfUkVHCQkweDMwCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UxN19SRUcJCTB4MzEKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTE4X1JFRwkJMHgzMgorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMTlfUkVHCQkweDMzCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UyMF9SRUcJCTB4MzQKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTIxX1JFRwkJMHgzNQorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMjJfUkVHCQkweDM2CisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UyM19SRUcJCTB4MzcKKworI2RlZmluZSBBQjU1MDBfTlVNX0lSUV9SRUdTCQkyMworCisvKioKKyAqIHN0cnVjdCBhYjU1MDAKKyAqIEBhY2Nlc3NfbXV0ZXg6IGxvY2sgb3V0IGNvbmN1cnJlbnQgYWNjZXNzZXMgdG8gdGhlIEFCIHJlZ2lzdGVycworICogQGRldjogYSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0IGZvciB0aGlzIGNoaXAgZHJpdmVyCisgKiBAYWI1NTAwX2lycTogdGhlIGFuYWxvZyBiYXNlYmFuZCBpcnEKKyAqIEBpcnFfYmFzZTogdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gaXJxIGJhc2UgZm9yIHN1YmRldmljZXMKKyAqIEBjaGlwX25hbWU6IG5hbWUgb2YgdGhpcyBjaGlwIHZhcmlhbnQKKyAqIEBjaGlwX2lkOiA4IGJpdCBjaGlwIElEIGZvciB0aGlzIGNoaXAgdmFyaWFudAorICogQGlycV9sb2NrOiBhIGxvY2sgdG8gcHJvdGVjdCB0aGUgbWFzaworICogQGFiYl9ldmVudHM6IGEgbG9jYWwgYml0IG1hc2sgb2YgdGhlIHByY211IHdha2V1cCBldmVudHMKKyAqIEBldmVudF9tYXNrOiBhIGxvY2FsIGNvcHkgb2YgdGhlIG1hc2sgZXZlbnQgcmVnaXN0ZXJzCisgKiBAbGFzdF9ldmVudF9tYXNrOiBhIGNvcHkgb2YgdGhlIGxhc3QgZXZlbnRfbWFzayB3cml0dGVuIHRvIGhhcmR3YXJlCisgKiBAc3RhcnR1cF9ldmVudHM6IGEgY29weSBvZiB0aGUgZmlyc3QgcmVhZGluZyBvZiB0aGUgZXZlbnQgcmVnaXN0ZXJzCisgKiBAc3RhcnR1cF9ldmVudHNfcmVhZDogd2hldGhlciB0aGUgZmlyc3QgZXZlbnRzIGhhdmUgYmVlbiByZWFkCisgKi8KK3N0cnVjdCBhYjU1MDAgeworCXN0cnVjdCBtdXRleCBhY2Nlc3NfbXV0ZXg7CisJc3RydWN0IGRldmljZSAqZGV2OworCXVuc2lnbmVkIGludCBhYjU1MDBfaXJxOworCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKKwljaGFyIGNoaXBfbmFtZVszMl07CisJdTggY2hpcF9pZDsKKwlzdHJ1Y3QgbXV0ZXggaXJxX2xvY2s7CisJdTMyIGFiYl9ldmVudHM7CisJdTggbWFza1tBQjU1MDBfTlVNX0lSUV9SRUdTXTsKKwl1OCBvbGRtYXNrW0FCNTUwMF9OVU1fSVJRX1JFR1NdOworCXU4IHN0YXJ0dXBfZXZlbnRzW0FCNTUwMF9OVU1fSVJRX1JFR1NdOworCWJvb2wgc3RhcnR1cF9ldmVudHNfcmVhZDsKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwl1bnNpZ25lZCBpbnQgZGVidWdfYmFuazsKKwl1bnNpZ25lZCBpbnQgZGVidWdfYWRkcmVzczsKKyNlbmRpZgorfTsKKworc3RydWN0IGFiNTUwMF9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3Qge3Vuc2lnbmVkIGludCBiYXNlOyB1bnNpZ25lZCBpbnQgY291bnQ7IH0gaXJxOworCXZvaWQgKmRldl9kYXRhW0FCNTUwMF9OVU1fREVWSUNFU107CisJc3RydWN0IGFieDUwMF9pbml0X3NldHRpbmdzICppbml0X3NldHRpbmdzOworCXVuc2lnbmVkIGludCBpbml0X3NldHRpbmdzX3N6OworCWJvb2wgcG1fcG93ZXJfb2ZmOworfTsKKworI2VuZGlmIC8qIE1GRF9BQjU1MDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYWI4NTAwL2dwYWRjLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAvZ3BhZGMuaAppbmRleCA0NmI5NTQwLi4yNTI5NjY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAvZ3BhZGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAvZ3BhZGMuaApAQCAtMjcsNiArMjcsOSBAQAogc3RydWN0IGFiODUwMF9ncGFkYzsKIAogc3RydWN0IGFiODUwMF9ncGFkYyAqYWI4NTAwX2dwYWRjX2dldChjaGFyICpuYW1lKTsKLWludCBhYjg1MDBfZ3BhZGNfY29udmVydChzdHJ1Y3QgYWI4NTAwX2dwYWRjICpncGFkYywgdTggaW5wdXQpOworaW50IGFiODUwMF9ncGFkY19jb252ZXJ0KHN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjLCB1OCBjaGFubmVsKTsKK2ludCBhYjg1MDBfZ3BhZGNfcmVhZF9yYXcoc3RydWN0IGFiODUwMF9ncGFkYyAqZ3BhZGMsIHU4IGNoYW5uZWwpOworaW50IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKHN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjLAorICAgIHU4IGNoYW5uZWwsIGludCBhZF92YWx1ZSk7CiAKICNlbmRpZiAvKiBfQUI4NTAwX0dQQURDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FieDUwMC5oIGIvaW5jbHVkZS9saW51eC9tZmQvYWJ4NTAwLmgKaW5kZXggODk2YjVlNC4uOTk3MDMzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvYWJ4NTAwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvYWJ4NTAwLmgKQEAgLTYsNyArNiw3IEBACiAgKgogICogQUJYNTAwIGNvcmUgYWNjZXNzIGZ1bmN0aW9ucy4KICAqIFRoZSBhYng1MDAgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIHRoZSBBbmFsb2cgQmFzZWJhbmQgY2hpcAotICogYWIzMTAwLCBhYjM1NTAsIGFiNTUwMCwgYW5kIGFiODUwMC4KKyAqIGFiMzEwMCwgYWI1NTAwLCBhbmQgYWI4NTAwLgogICoKICAqIEF1dGhvcjogTWF0dGlhcyBXYWxsaW4gPG1hdHRpYXMud2FsbGluQHN0ZXJpY3Nzb24uY29tPgogICogQXV0aG9yOiBNYXR0aWFzIE5pbHNzb24gPG1hdHRpYXMuaS5uaWxzc29uQHN0ZXJpY3Nzb24uY29tPgpAQCAtMjksMTcgKzI5LDE2IEBACiAjZGVmaW5lIEFCMzEwMF9QMUcJMHhjNgogI2RlZmluZSBBQjMxMDBfUjJBCTB4YzcKICNkZWZpbmUgQUIzMTAwX1IyQgkweGM4Ci0jZGVmaW5lIEFCMzU1MF9QMUEJMHgxMAogI2RlZmluZSBBQjU1MDBfMV8wCTB4MjAKLSNkZWZpbmUgQUI1NTAwXzJfMAkweDIxCi0jZGVmaW5lIEFCNTUwMF8yXzEJMHgyMgorI2RlZmluZSBBQjU1MDBfMV8xCTB4MjEKKyNkZWZpbmUgQUI1NTAwXzJfMAkweDI0CiAKIC8qIEFCODUwMCBDSURzKi8KLSNkZWZpbmUgQUI4NTAwX0NVVEVBUkxZCTB4MDAKICNkZWZpbmUgQUI4NTAwX0NVVDFQMAkweDEwCiAjZGVmaW5lIEFCODUwMF9DVVQxUDEJMHgxMQogI2RlZmluZSBBQjg1MDBfQ1VUMlAwCTB4MjAKICNkZWZpbmUgQUI4NTAwX0NVVDNQMAkweDMwCisjZGVmaW5lIEFCODUwMF9DVVQzUDMJMHgzMwogCiAvKgogICogQUIzMTAwLCBFVkVOVEExLCBBMiBhbmQgQTMgZXZlbnQgcmVnaXN0ZXIgZmxhZ3MKQEAgLTE0MywzOSArMTQyLDYgQEAKIGludCBhYjMxMDBfZXZlbnRfdW5yZWdpc3RlcihzdHJ1Y3QgYWIzMTAwICphYjMxMDAsCiAJCQkgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiAKLS8qIEFCMzU1MCwgU1RSIHJlZ2lzdGVyIGZsYWdzICovCi0jZGVmaW5lIEFCMzU1MF9TVFJfT05TV0EJCQkJKDB4MDEpCi0jZGVmaW5lIEFCMzU1MF9TVFJfT05TV0IJCQkJKDB4MDIpCi0jZGVmaW5lIEFCMzU1MF9TVFJfT05TV0MJCQkJKDB4MDQpCi0jZGVmaW5lIEFCMzU1MF9TVFJfRENJTwkJCQkJKDB4MDgpCi0jZGVmaW5lIEFCMzU1MF9TVFJfQk9PVF9NT0RFCQkJCSgweDEwKQotI2RlZmluZSBBQjM1NTBfU1RSX1NJTV9PRkYJCQkJKDB4MjApCi0jZGVmaW5lIEFCMzU1MF9TVFJfQkFUVF9SRU1PVkFMCQkJCSgweDQwKQotI2RlZmluZSBBQjM1NTBfU1RSX1ZCVVMJCQkJCSgweDgwKQotCi0vKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlcnMgKi8KLSNkZWZpbmUgQUIzNTUwX0lNUjEgMHgyOQotI2RlZmluZSBBQjM1NTBfSU1SMiAweDJhCi0jZGVmaW5lIEFCMzU1MF9JTVIzIDB4MmIKLSNkZWZpbmUgQUIzNTUwX0lNUjQgMHgyYwotI2RlZmluZSBBQjM1NTBfSU1SNSAweDJkCi0KLWVudW0gYWIzNTUwX2RldmlkIHsKLQlBQjM1NTBfREVWSURfQURDLAotCUFCMzU1MF9ERVZJRF9EQUMsCi0JQUIzNTUwX0RFVklEX0xFRFMsCi0JQUIzNTUwX0RFVklEX1BPV0VSLAotCUFCMzU1MF9ERVZJRF9SRUdVTEFUT1JTLAotCUFCMzU1MF9ERVZJRF9TSU0sCi0JQUIzNTUwX0RFVklEX1VBUlQsCi0JQUIzNTUwX0RFVklEX1JUQywKLQlBQjM1NTBfREVWSURfQ0hBUkdFUiwKLQlBQjM1NTBfREVWSURfRlVFTEdBVUdFLAotCUFCMzU1MF9ERVZJRF9WSUJSQVRPUiwKLQlBQjM1NTBfREVWSURfQ09ERUMsCi0JQUIzNTUwX05VTV9ERVZJQ0VTLAotfTsKLQogLyoqCiAgKiBzdHJ1Y3QgYWJ4NTAwX2luaXRfc2V0dGluZwogICogSW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXJzIGZvciBkcml2ZXIgdG8gdXNlIGR1cmluZyBzZXR1cC4KQEAgLTE4NiwxOCArMTUyLDYgQEAKIAl1OCBzZXR0aW5nOwogfTsKIAotLyoqCi0gKiBzdHJ1Y3QgYWIzNTUwX3BsYXRmb3JtX2RhdGEKLSAqIERhdGEgc3VwcGxpZWQgdG8gaW5pdGlhbGl6ZSBib2FyZCBjb25uZWN0aW9ucyB0byB0aGUgQUIzNTUwCi0gKi8KLXN0cnVjdCBhYjM1NTBfcGxhdGZvcm1fZGF0YSB7Ci0Jc3RydWN0IHt1bnNpZ25lZCBpbnQgYmFzZTsgdW5zaWduZWQgaW50IGNvdW50OyB9IGlycTsKLQl2b2lkICpkZXZfZGF0YVtBQjM1NTBfTlVNX0RFVklDRVNdOwotCXNpemVfdCBkZXZfZGF0YV9zeltBQjM1NTBfTlVNX0RFVklDRVNdOwotCXN0cnVjdCBhYng1MDBfaW5pdF9zZXR0aW5ncyAqaW5pdF9zZXR0aW5nczsKLQl1bnNpZ25lZCBpbnQgaW5pdF9zZXR0aW5nc19zejsKLX07Ci0KIGludCBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCBiYW5rLCB1OCByZWcsCiAJdTggdmFsdWUpOwogaW50IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGJhbmssIHU4IHJlZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RiNTUwMC1wcmNtdS5oIGIvaW5jbHVkZS9saW51eC9tZmQvZGI1NTAwLXByY211LmgKaW5kZXggZjA5Nzc5OC4uOTg5MDY4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZGI1NTAwLXByY211LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZGI1NTAwLXByY211LmgKQEAgLTUsMjEgKzUsMzUgQEAKICAqCiAgKiBVNTUwMCBQUkNNVSBBUEkuCiAgKi8KLSNpZm5kZWYgX19NQUNIX1BSQ01VX1U1NTAwX0gKLSNkZWZpbmUgX19NQUNIX1BSQ01VX1U1NTAwX0gKKyNpZm5kZWYgX19NRkRfREI1NTAwX1BSQ01VX0gKKyNkZWZpbmUgX19NRkRfREI1NTAwX1BSQ01VX0gKIAotI2lmZGVmIENPTkZJR19VWDUwMF9TT0NfREI1NTAwCisjaWZkZWYgQ09ORklHX01GRF9EQjU1MDBfUFJDTVUKIAogdm9pZCBkYjU1MDBfcHJjbXVfZWFybHlfaW5pdCh2b2lkKTsKLQoraW50IGRiNTUwMF9wcmNtdV9zZXRfZXBvZCh1MTYgZXBvZF9pZCwgdTggZXBvZF9zdGF0ZSk7CitpbnQgZGI1NTAwX3ByY211X3NldF9kaXNwbGF5X2Nsb2Nrcyh2b2lkKTsKK2ludCBkYjU1MDBfcHJjbXVfZGlzYWJsZV9kc2lwbGwodm9pZCk7CitpbnQgZGI1NTAwX3ByY211X2VuYWJsZV9kc2lwbGwodm9pZCk7CiBpbnQgZGI1NTAwX3ByY211X2FiYl9yZWFkKHU4IHNsYXZlLCB1OCByZWcsIHU4ICp2YWx1ZSwgdTggc2l6ZSk7CiBpbnQgZGI1NTAwX3ByY211X2FiYl93cml0ZSh1OCBzbGF2ZSwgdTggcmVnLCB1OCAqdmFsdWUsIHU4IHNpemUpOwordm9pZCBkYjU1MDBfcHJjbXVfZW5hYmxlX3dha2V1cHModTMyIHdha2V1cHMpOworaW50IGRiNTUwMF9wcmNtdV9yZXF1ZXN0X2Nsb2NrKHU4IGNsb2NrLCBib29sIGVuYWJsZSk7Cit2b2lkIGRiNTUwMF9wcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpOwordm9pZCBkYjU1MDBfcHJjbXVfZ2V0X2FiYl9ldmVudF9idWZmZXIodm9pZCBfX2lvbWVtICoqYnVmKTsKK2ludCBwcmNtdV9yZXNldG91dCh1OCByZXNvdXRuLCB1OCBzdGF0ZSk7CitpbnQgZGI1NTAwX3ByY211X3NldF9wb3dlcl9zdGF0ZSh1OCBzdGF0ZSwgYm9vbCBrZWVwX3VscF9jbGssCisJYm9vbCBrZWVwX2FwX3BsbCk7CitpbnQgZGI1NTAwX3ByY211X2NvbmZpZ19lc3JhbTBfZGVlcF9zbGVlcCh1OCBzdGF0ZSk7Cit2b2lkIGRiNTUwMF9wcmNtdV9zeXN0ZW1fcmVzZXQodTE2IHJlc2V0X2NvZGUpOwordTE2IGRiNTUwMF9wcmNtdV9nZXRfcmVzZXRfY29kZSh2b2lkKTsKK2Jvb2wgZGI1NTAwX3ByY211X2lzX2FjX3dha2VfcmVxdWVzdGVkKHZvaWQpOworaW50IGRiNTUwMF9wcmNtdV9zZXRfYXJtX29wcCh1OCBvcHApOworaW50IGRiNTUwMF9wcmNtdV9nZXRfYXJtX29wcCh2b2lkKTsKIAogI2Vsc2UgLyogIUNPTkZJR19VWDUwMF9TT0NfREI1NTAwICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkYjU1MDBfcHJjbXVfZWFybHlfaW5pdCh2b2lkKQotewotfQorc3RhdGljIGlubGluZSB2b2lkIGRiNTUwMF9wcmNtdV9lYXJseV9pbml0KHZvaWQpIHt9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9hYmJfcmVhZCh1OCBzbGF2ZSwgdTggcmVnLCB1OCAqdmFsdWUsIHU4IHNpemUpCiB7CkBAIC0zMSwxNSArNDUsNzUgQEAKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19VWDUwMF9TT0NfREI1NTAwICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpCitzdGF0aWMgaW5saW5lIGludCBkYjU1MDBfcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCiB7Ci0jaWZkZWYgQ09ORklHX01BQ0hfVTU1MDBfU0lNVUxBVE9SCiAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZgogfQogCi0jZW5kaWYgLyogX19NQUNIX1BSQ01VX1U1NTAwX0ggKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9zZXRfZGlzcGxheV9jbG9ja3Modm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGI1NTAwX3ByY211X2Rpc2FibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9jb25maWdfZXNyYW0wX2RlZXBfc2xlZXAodTggc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYjU1MDBfcHJjbXVfZW5hYmxlX3dha2V1cHModTMyIHdha2V1cHMpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3Jlc2V0b3V0KHU4IHJlc291dG4sIHU4IHN0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkYjU1MDBfcHJjbXVfc2V0X2Vwb2QodTE2IGVwb2RfaWQsIHU4IGVwb2Rfc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYjU1MDBfcHJjbXVfZ2V0X2FiYl9ldmVudF9idWZmZXIodm9pZCBfX2lvbWVtICoqYnVmKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGRiNTUwMF9wcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9zZXRfcG93ZXJfc3RhdGUodTggc3RhdGUsIGJvb2wga2VlcF91bHBfY2xrLAorCWJvb2wga2VlcF9hcF9wbGwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYjU1MDBfcHJjbXVfc3lzdGVtX3Jlc2V0KHUxNiByZXNldF9jb2RlKSB7fQorCitzdGF0aWMgaW5saW5lIHUxNiBkYjU1MDBfcHJjbXVfZ2V0X3Jlc2V0X2NvZGUodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBib29sIGRiNTUwMF9wcmNtdV9pc19hY193YWtlX3JlcXVlc3RlZCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkYjU1MDBfcHJjbXVfc2V0X2FybV9vcHAodTggb3BwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkYjU1MDBfcHJjbXVfZ2V0X2FybV9vcHAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworCisjZW5kaWYgLyogQ09ORklHX01GRF9EQjU1MDBfUFJDTVUgKi8KKworI2VuZGlmIC8qIF9fTUZEX0RCNTUwMF9QUkNNVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9kYjg1MDAtcHJjbXUuaCBiL2luY2x1ZGUvbGludXgvbWZkL2RiODUwMC1wcmNtdS5oCmluZGV4IDkxN2RiY2FiLi42MGQyN2Y3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9kYjg1MDAtcHJjbXUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9kYjg1MDAtcHJjbXUuaApAQCAtMTEsNyArMTEsNiBAQAogI2RlZmluZSBfX01GRF9EQjg1MDBfUFJDTVVfSAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAogLyogVGhpcyBwb3J0aW9uIHByZXZpb3VzbHkga25vd24gYXMgPG1hY2gvcHJjbXUtZnctZGVmc192MS5oPiAqLwogCkBAIC0xMzMsNyArMTMyLDcgQEAKICAqIEBBUEVYRUNVVEVfVE9fQVBJRExFOiBQb3dlciBzdGF0ZSB0cmFuc2l0aW9uIGZyb20gQXBFeGVjdXRlIHRvIEFwSWRsZQogICovCiBlbnVtIGFwX3B3cnN0X3RyYW5zIHsKLQlOT19UUkFOU0lUSU9OCQkJPSAweDAwLAorCVBSQ01VX0FQX05PX0NIQU5HRQkJPSAweDAwLAogCUFQRVhFQ1VURV9UT19BUFNMRUVQCQk9IDB4MDEsCiAJQVBJRExFX1RPX0FQU0xFRVAJCT0gMHgwMiwgLyogVG8gYmUgcmVtb3ZlZCAqLwogCVBSQ01VX0FQX1NMRUVQCQkJPSAweDAxLApAQCAtMTQ2LDU0ICsxNDUsNiBAQAogfTsKIAogLyoqCi0gKiBlbnVtIGRkcl9wd3JzdCAtIEREUiBwb3dlciBzdGF0ZXMgZGVmaW5pdGlvbgotICogQEREUl9QV1JfU1RBVEVfVU5DSEFOR0VEOiBTRFJBTSBhbmQgRERSIGNvbnRyb2xsZXIgc3RhdGUgaXMgdW5jaGFuZ2VkCi0gKiBARERSX1BXUl9TVEFURV9PTjoKLSAqIEBERFJfUFdSX1NUQVRFX09GRkxPV0xBVDoKLSAqIEBERFJfUFdSX1NUQVRFX09GRkhJR0hMQVQ6Ci0gKi8KLWVudW0gZGRyX3B3cnN0IHsKLQlERFJfUFdSX1NUQVRFX1VOQ0hBTkdFRCAgICAgPSAweDAwLAotCUREUl9QV1JfU1RBVEVfT04gICAgICAgICAgICA9IDB4MDEsCi0JRERSX1BXUl9TVEFURV9PRkZMT1dMQVQgICAgID0gMHgwMiwKLQlERFJfUFdSX1NUQVRFX09GRkhJR0hMQVQgICAgPSAweDAzCi19OwotCi0vKioKLSAqIGVudW0gYXJtX29wcCAtIEFSTSBPUFAgc3RhdGVzIGRlZmluaXRpb24KLSAqIEBBUk1fT1BQX0lOSVQ6Ci0gKiBAQVJNX05PX0NIQU5HRTogVGhlIEFSTSBvcGVyYXRpbmcgcG9pbnQgaXMgdW5jaGFuZ2VkCi0gKiBAQVJNXzEwMF9PUFA6IFRoZSBuZXcgQVJNIG9wZXJhdGluZyBwb2ludCBpcyBhcm0xMDBvcHAKLSAqIEBBUk1fNTBfT1BQOiBUaGUgbmV3IEFSTSBvcGVyYXRpbmcgcG9pbnQgaXMgYXJtNTBvcHAKLSAqIEBBUk1fTUFYX09QUDogT3BlcmF0aW5nIHBvaW50IGlzICJtYXgiIChtb3JlIHRoYW4gMTAwKQotICogQEFSTV9NQVhfRlJFUTEwME9QUDogU2V0IG1heCBvcHAgaWYgYXZhaWxhYmxlLCBlbHNlIDEwMAotICogQEFSTV9FWFRDTEs6IFRoZSBuZXcgQVJNIG9wZXJhdGluZyBwb2ludCBpcyBhcm1FeHRDbGsKLSAqLwotZW51bSBhcm1fb3BwIHsKLQlBUk1fT1BQX0lOSVQgPSAweDAwLAotCUFSTV9OT19DSEFOR0UgPSAweDAxLAotCUFSTV8xMDBfT1BQID0gMHgwMiwKLQlBUk1fNTBfT1BQID0gMHgwMywKLQlBUk1fTUFYX09QUCA9IDB4MDQsCi0JQVJNX01BWF9GUkVRMTAwT1BQID0gMHgwNSwKLQlBUk1fRVhUQ0xLID0gMHgwNwotfTsKLQotLyoqCi0gKiBlbnVtIGFwZV9vcHAgLSBBUEUgT1BQIHN0YXRlcyBkZWZpbml0aW9uCi0gKiBAQVBFX09QUF9JTklUOgotICogQEFQRV9OT19DSEFOR0U6IFRoZSBBUEUgb3BlcmF0aW5nIHBvaW50IGlzIHVuY2hhbmdlZAotICogQEFQRV8xMDBfT1BQOiBUaGUgbmV3IEFQRSBvcGVyYXRpbmcgcG9pbnQgaXMgYXBlMTAwb3BwCi0gKiBAQVBFXzUwX09QUDogNTAlCi0gKi8KLWVudW0gYXBlX29wcCB7Ci0JQVBFX09QUF9JTklUID0gMHgwMCwKLQlBUEVfTk9fQ0hBTkdFID0gMHgwMSwKLQlBUEVfMTAwX09QUCA9IDB4MDIsCi0JQVBFXzUwX09QUCA9IDB4MDMKLX07Ci0KLS8qKgogICogZW51bSBod19hY2Nfc3RhdGUgLSBTdGF0ZSBkZWZpbml0aW9uIGZvciBoYXJkd2FyZSBhY2NlbGVyYXRvcgogICogQEhXX05PX0NIQU5HRTogVGhlIGhhcmR3YXJlIGFjY2VsZXJhdG9yIHN0YXRlIG11c3QgcmVtYWluIHVuY2hhbmdlZAogICogQEhXX09GRjogVGhlIGhhcmR3YXJlIGFjY2VsZXJhdG9yIG11c3QgYmUgc3dpdGNoZWQgb2ZmCkBAIC00NjksMjYgKzQyMCw2IEBACiAKIC8qIEVuZCBvZiBmaWxlIHByZXZpb3VzbHkga25vd24gYXMgcHJjbXUtZnctZGVmc192MS5oICovCiAKLS8qIFBSQ01VIFdha2V1cCBkZWZpbmVzICovCi1lbnVtIHByY211X3dha2V1cF9pbmRleCB7Ci0JUFJDTVVfV0FLRVVQX0lOREVYX1JUQywKLQlQUkNNVV9XQUtFVVBfSU5ERVhfUlRUMCwKLQlQUkNNVV9XQUtFVVBfSU5ERVhfUlRUMSwKLQlQUkNNVV9XQUtFVVBfSU5ERVhfSFNJMCwKLQlQUkNNVV9XQUtFVVBfSU5ERVhfSFNJMSwKLQlQUkNNVV9XQUtFVVBfSU5ERVhfVVNCLAotCVBSQ01VX1dBS0VVUF9JTkRFWF9BQkIsCi0JUFJDTVVfV0FLRVVQX0lOREVYX0FCQl9GSUZPLAotCVBSQ01VX1dBS0VVUF9JTkRFWF9BUk0sCi0JTlVNX1BSQ01VX1dBS0VVUF9JTkRJQ0VTCi19OwotI2RlZmluZSBQUkNNVV9XQUtFVVAoX25hbWUpIChCSVQoUFJDTVVfV0FLRVVQX0lOREVYXyMjX25hbWUpKQotCi0vKiBQUkNNVSBRb1MgQVBFIE9QUCBjbGFzcyAqLwotI2RlZmluZSBQUkNNVV9RT1NfQVBFX09QUCAxCi0jZGVmaW5lIFBSQ01VX1FPU19ERFJfT1BQIDIKLSNkZWZpbmUgUFJDTVVfUU9TX0RFRkFVTFRfVkFMVUUgLTEKLQogLyoqCiAgKiBlbnVtIGh3X2FjY19kZXYgLSBlbnVtIGZvciBodyBhY2NlbGVyYXRvcnMKICAqIEBIV19BQ0NfU1ZBTU1EU1A6IGZvciBTVkFNTURTUApAQCAtNTI3LDY0ICs0NTgsNiBAQAogfTsKIAogLyoKLSAqIElkcyBmb3IgYWxsIEVQT0RzIChwb3dlciBkb21haW5zKQotICogLSBFUE9EX0lEX1NWQU1NRFNQOiBwb3dlciBkb21haW4gZm9yIFNWQSBNTURTUAotICogLSBFUE9EX0lEX1NWQVBJUEU6IHBvd2VyIGRvbWFpbiBmb3IgU1ZBIHBpcGUKLSAqIC0gRVBPRF9JRF9TSUFNTURTUDogcG93ZXIgZG9tYWluIGZvciBTSUEgTU1EU1AKLSAqIC0gRVBPRF9JRF9TSUFQSVBFOiBwb3dlciBkb21haW4gZm9yIFNJQSBwaXBlCi0gKiAtIEVQT0RfSURfU0dBOiBwb3dlciBkb21haW4gZm9yIFNHQQotICogLSBFUE9EX0lEX0IyUjJfTUNERTogcG93ZXIgZG9tYWluIGZvciBCMlIyIGFuZCBNQ0RFCi0gKiAtIEVQT0RfSURfRVNSQU0xMjogcG93ZXIgZG9tYWluIGZvciBFU1JBTSAxIGFuZCAyCi0gKiAtIEVQT0RfSURfRVNSQU0zNDogcG93ZXIgZG9tYWluIGZvciBFU1JBTSAzIGFuZCA0Ci0gKiAtIE5VTV9FUE9EX0lEOiBudW1iZXIgb2YgcG93ZXIgZG9tYWlucwotICovCi0jZGVmaW5lIEVQT0RfSURfU1ZBTU1EU1AJMAotI2RlZmluZSBFUE9EX0lEX1NWQVBJUEUJCTEKLSNkZWZpbmUgRVBPRF9JRF9TSUFNTURTUAkyCi0jZGVmaW5lIEVQT0RfSURfU0lBUElQRQkJMwotI2RlZmluZSBFUE9EX0lEX1NHQQkJNAotI2RlZmluZSBFUE9EX0lEX0IyUjJfTUNERQk1Ci0jZGVmaW5lIEVQT0RfSURfRVNSQU0xMgkJNgotI2RlZmluZSBFUE9EX0lEX0VTUkFNMzQJCTcKLSNkZWZpbmUgTlVNX0VQT0RfSUQJCTgKLQotLyoKLSAqIHN0YXRlIGRlZmluaXRpb24gZm9yIEVQT0QgKHBvd2VyIGRvbWFpbikKLSAqIC0gRVBPRF9TVEFURV9OT19DSEFOR0U6IFRoZSBFUE9EIHNob3VsZCByZW1haW4gdW5jaGFuZ2VkCi0gKiAtIEVQT0RfU1RBVEVfT0ZGOiBUaGUgRVBPRCBpcyBzd2l0Y2hlZCBvZmYKLSAqIC0gRVBPRF9TVEFURV9SQU1SRVQ6IFRoZSBFUE9EIGlzIHN3aXRjaGVkIG9mZiB3aXRoIGl0cyBpbnRlcm5hbCBSQU0gaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHJldGVudGlvbgotICogLSBFUE9EX1NUQVRFX09OX0NMS19PRkY6IFRoZSBFUE9EIGlzIHN3aXRjaGVkIG9uLCBjbG9jayBpcyBzdGlsbCBvZmYKLSAqIC0gRVBPRF9TVEFURV9PTjogU2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggY2xvY2sgZW5hYmxlZAotICovCi0jZGVmaW5lIEVQT0RfU1RBVEVfTk9fQ0hBTkdFCTB4MDAKLSNkZWZpbmUgRVBPRF9TVEFURV9PRkYJCTB4MDEKLSNkZWZpbmUgRVBPRF9TVEFURV9SQU1SRVQJMHgwMgotI2RlZmluZSBFUE9EX1NUQVRFX09OX0NMS19PRkYJMHgwMwotI2RlZmluZSBFUE9EX1NUQVRFX09OCQkweDA0Ci0KLS8qCi0gKiBDTEtPVVQgc291cmNlcwotICovCi0jZGVmaW5lIFBSQ01VX0NMS1NSQ19DTEszOE0JCTB4MDAKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0FDTEsJCTB4MDEKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX1NZU0NMSwkJMHgwMgotI2RlZmluZSBQUkNNVV9DTEtTUkNfTENEQ0xLCQkweDAzCi0jZGVmaW5lIFBSQ01VX0NMS1NSQ19TRE1NQ0NMSwkJMHgwNAotI2RlZmluZSBQUkNNVV9DTEtTUkNfVFZDTEsJCTB4MDUKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX1RJTUNMSwkJMHgwNgotI2RlZmluZSBQUkNNVV9DTEtTUkNfQ0xLMDA5CQkweDA3Ci0vKiBUaGVzZSBhcmUgb25seSB2YWxpZCBmb3IgQ0xLT1VUMTogKi8KLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX1NJQU1NRFNQQ0xLCTB4NDAKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0kyQ0NMSwkJMHg0MQotI2RlZmluZSBQUkNNVV9DTEtTUkNfTVNQMDJDTEsJCTB4NDIKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0FSTVBMTF9PQlNDTEsJMHg0MwotI2RlZmluZSBQUkNNVV9DTEtTUkNfSFNJUlhDTEsJCTB4NDQKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0hTSVRYQ0xLCQkweDQ1Ci0jZGVmaW5lIFBSQ01VX0NMS1NSQ19BUk1DTEtGSVgJCTB4NDYKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0hETUlDTEsJCTB4NDcKLQotLyoKICAqIERlZmluaXRpb25zIGZvciBhdXRvbm9tb3VzIHBvd2VyIG1hbmFnZW1lbnQgY29uZmlndXJhdGlvbi4KICAqLwogCkBAIC02MjAsODggKzQ5MywxMiBAQAogCXU4IHN2YV9wb2xpY3k7CiB9OwogCi0vKioKLSAqIGVudW0gZGRyX29wcCAtIEREUiBPUFAgc3RhdGVzIGRlZmluaXRpb24KLSAqIEBERFJfMTAwX09QUDogVGhlIG5ldyBERFIgb3BlcmF0aW5nIHBvaW50IGlzIGRkcjEwMG9wcAotICogQEREUl81MF9PUFA6IFRoZSBuZXcgRERSIG9wZXJhdGluZyBwb2ludCBpcyBkZHI1MG9wcAotICogQEREUl8yNV9PUFA6IFRoZSBuZXcgRERSIG9wZXJhdGluZyBwb2ludCBpcyBkZHIyNW9wcAotICovCi1lbnVtIGRkcl9vcHAgewotCUREUl8xMDBfT1BQID0gMHgwMCwKLQlERFJfNTBfT1BQID0gMHgwMSwKLQlERFJfMjVfT1BQID0gMHgwMiwKLX07Ci0KLS8qCi0gKiBDbG9jayBpZGVudGlmaWVycy4KLSAqLwotZW51bSBwcmNtdV9jbG9jayB7Ci0JUFJDTVVfU0dBQ0xLLAotCVBSQ01VX1VBUlRDTEssCi0JUFJDTVVfTVNQMDJDTEssCi0JUFJDTVVfTVNQMUNMSywKLQlQUkNNVV9JMkNDTEssCi0JUFJDTVVfU0RNTUNDTEssCi0JUFJDTVVfU0xJTUNMSywKLQlQUkNNVV9QRVIxQ0xLLAotCVBSQ01VX1BFUjJDTEssCi0JUFJDTVVfUEVSM0NMSywKLQlQUkNNVV9QRVI1Q0xLLAotCVBSQ01VX1BFUjZDTEssCi0JUFJDTVVfUEVSN0NMSywKLQlQUkNNVV9MQ0RDTEssCi0JUFJDTVVfQk1MQ0xLLAotCVBSQ01VX0hTSVRYQ0xLLAotCVBSQ01VX0hTSVJYQ0xLLAotCVBSQ01VX0hETUlDTEssCi0JUFJDTVVfQVBFQVRDTEssCi0JUFJDTVVfQVBFVFJBQ0VDTEssCi0JUFJDTVVfTUNERUNMSywKLQlQUkNNVV9JUEkyQ0NMSywKLQlQUkNNVV9EU0lBTFRDTEssCi0JUFJDTVVfRE1BQ0xLLAotCVBSQ01VX0IyUjJDTEssCi0JUFJDTVVfVFZDTEssCi0JUFJDTVVfU1NQQ0xLLAotCVBSQ01VX1JOR0NMSywKLQlQUkNNVV9VSUNDQ0xLLAotCVBSQ01VX05VTV9SRUdfQ0xPQ0tTLAotCVBSQ01VX1NZU0NMSyA9IFBSQ01VX05VTV9SRUdfQ0xPQ0tTLAotCVBSQ01VX1RJTUNMSywKLX07Ci0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgY29udHJvbGxpbmcgRVNSQU0wIGluIGRlZXAgc2xlZXAuCi0gKi8KLSNkZWZpbmUgRVNSQU0wX0RFRVBfU0xFRVBfU1RBVEVfT0ZGIDEKLSNkZWZpbmUgRVNSQU0wX0RFRVBfU0xFRVBfU1RBVEVfUkVUIDIKLQotI2lmZGVmIENPTkZJR19NRkRfREI4NTAwX1BSQ01VCi12b2lkIF9faW5pdCBwcmNtdV9lYXJseV9pbml0KHZvaWQpOwotaW50IHByY211X3NldF9kaXNwbGF5X2Nsb2Nrcyh2b2lkKTsKLWludCBwcmNtdV9kaXNhYmxlX2RzaXBsbCh2b2lkKTsKLWludCBwcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcHJjbXVfZWFybHlfaW5pdCh2b2lkKSB7fQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTUZEX0RCODUwMF9QUkNNVQogCit2b2lkIGRiODUwMF9wcmNtdV9lYXJseV9pbml0KHZvaWQpOwogaW50IHByY211X3NldF9yY19hMnAoZW51bSByb21jb2RlX3dyaXRlKTsKIGVudW0gcm9tY29kZV9yZWFkIHByY211X2dldF9yY19wMmEodm9pZCk7CiBlbnVtIGFwX3B3cnN0IHByY211X2dldF94cDcwX2N1cnJlbnRfc3RhdGUodm9pZCk7Ci1pbnQgcHJjbXVfc2V0X3Bvd2VyX3N0YXRlKHU4IHN0YXRlLCBib29sIGtlZXBfdWxwX2NsaywgYm9vbCBrZWVwX2FwX3BsbCk7Ci0KLXZvaWQgcHJjbXVfZW5hYmxlX3dha2V1cHModTMyIHdha2V1cHMpOwotc3RhdGljIGlubGluZSB2b2lkIHByY211X2Rpc2FibGVfd2FrZXVwcyh2b2lkKQotewotCXByY211X2VuYWJsZV93YWtldXBzKDApOwotfQotCi12b2lkIHByY211X2NvbmZpZ19hYmJfZXZlbnRfcmVhZG91dCh1MzIgYWJiX2V2ZW50cyk7Ci12b2lkIHByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1Zik7Ci1pbnQgcHJjbXVfc2V0X2FybV9vcHAodTggb3BwKTsKLWludCBwcmNtdV9nZXRfYXJtX29wcCh2b2lkKTsKIGJvb2wgcHJjbXVfaGFzX2FybV9tYXhvcHAodm9pZCk7CiBib29sIHByY211X2lzX3U4NDAwKHZvaWQpOwogaW50IHByY211X3NldF9hcGVfb3BwKHU4IG9wcCk7CkBAIC03MTAsMTkgKzUwNywxNCBAQAogaW50IHByY211X3JlbGVhc2VfdXNiX3dha2V1cF9zdGF0ZSh2b2lkKTsKIGludCBwcmNtdV9zZXRfZGRyX29wcCh1OCBvcHApOwogaW50IHByY211X2dldF9kZHJfb3BwKHZvaWQpOwotdW5zaWduZWQgbG9uZyBwcmNtdV9xb3NfZ2V0X2NwdWZyZXFfb3BwX2RlbGF5KHZvaWQpOwotdm9pZCBwcmNtdV9xb3Nfc2V0X2NwdWZyZXFfb3BwX2RlbGF5KHVuc2lnbmVkIGxvbmcpOwogLyogTk9URSEgVXNlIHJlZ3VsYXRvciBmcmFtZXdvcmsgaW5zdGVhZCAqLwogaW50IHByY211X3NldF9od2FjYyh1MTYgaHdfYWNjX2RldiwgdTggc3RhdGUpOwotaW50IHByY211X3NldF9lcG9kKHUxNiBlcG9kX2lkLCB1OCBlcG9kX3N0YXRlKTsKIHZvaWQgcHJjbXVfY29uZmlndXJlX2F1dG9fcG0oc3RydWN0IHByY211X2F1dG9fcG1fY29uZmlnICpzbGVlcCwKIAlzdHJ1Y3QgcHJjbXVfYXV0b19wbV9jb25maWcgKmlkbGUpOwogYm9vbCBwcmNtdV9pc19hdXRvX3BtX2VuYWJsZWQodm9pZCk7CiAKIGludCBwcmNtdV9jb25maWdfY2xrb3V0KHU4IGNsa291dCwgdTggc291cmNlLCB1OCBkaXYpOwotaW50IHByY211X3JlcXVlc3RfY2xvY2sodTggY2xvY2ssIGJvb2wgZW5hYmxlKTsKIGludCBwcmNtdV9zZXRfY2xvY2tfZGl2aWRlcih1OCBjbG9jaywgdTggZGl2aWRlcik7Ci1pbnQgcHJjbXVfY29uZmlnX2VzcmFtMF9kZWVwX3NsZWVwKHU4IHN0YXRlKTsKIGludCBwcmNtdV9jb25maWdfaG90ZG9nKHU4IHRocmVzaG9sZCk7CiBpbnQgcHJjbXVfY29uZmlnX2hvdG1vbih1OCBsb3csIHU4IGhpZ2gpOwogaW50IHByY211X3N0YXJ0X3RlbXBfc2Vuc2UodTE2IGN5Y2xlczMyayk7CkBAIC03MzIsMTQgKzUyNCwzNiBAQAogCiB2b2lkIHByY211X2FjX3dha2VfcmVxKHZvaWQpOwogdm9pZCBwcmNtdV9hY19zbGVlcF9yZXEodm9pZCk7Ci12b2lkIHByY211X3N5c3RlbV9yZXNldCh1MTYgcmVzZXRfY29kZSk7CiB2b2lkIHByY211X21vZGVtX3Jlc2V0KHZvaWQpOwotYm9vbCBwcmNtdV9pc19hY193YWtlX3JlcXVlc3RlZCh2b2lkKTsKIHZvaWQgcHJjbXVfZW5hYmxlX3NwaTIodm9pZCk7CiB2b2lkIHByY211X2Rpc2FibGVfc3BpMih2b2lkKTsKIAoraW50IHByY211X2NvbmZpZ19hOXdkb2codTggbnVtLCBib29sIHNsZWVwX2F1dG9fb2ZmKTsKK2ludCBwcmNtdV9lbmFibGVfYTl3ZG9nKHU4IGlkKTsKK2ludCBwcmNtdV9kaXNhYmxlX2E5d2RvZyh1OCBpZCk7CitpbnQgcHJjbXVfa2lja19hOXdkb2codTggaWQpOworaW50IHByY211X2xvYWRfYTl3ZG9nKHU4IGlkLCB1MzIgdmFsKTsKKwordm9pZCBkYjg1MDBfcHJjbXVfc3lzdGVtX3Jlc2V0KHUxNiByZXNldF9jb2RlKTsKK2ludCBkYjg1MDBfcHJjbXVfc2V0X3Bvd2VyX3N0YXRlKHU4IHN0YXRlLCBib29sIGtlZXBfdWxwX2NsaywgYm9vbCBrZWVwX2FwX3BsbCk7Cit2b2lkIGRiODUwMF9wcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcyk7CitpbnQgZGI4NTAwX3ByY211X3NldF9lcG9kKHUxNiBlcG9kX2lkLCB1OCBlcG9kX3N0YXRlKTsKK2ludCBkYjg1MDBfcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpOworaW50IGRiODUwMF9wcmNtdV9zZXRfZGlzcGxheV9jbG9ja3Modm9pZCk7CitpbnQgZGI4NTAwX3ByY211X2Rpc2FibGVfZHNpcGxsKHZvaWQpOworaW50IGRiODUwMF9wcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpOwordm9pZCBkYjg1MDBfcHJjbXVfY29uZmlnX2FiYl9ldmVudF9yZWFkb3V0KHUzMiBhYmJfZXZlbnRzKTsKK3ZvaWQgZGI4NTAwX3ByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1Zik7CitpbnQgZGI4NTAwX3ByY211X2NvbmZpZ19lc3JhbTBfZGVlcF9zbGVlcCh1OCBzdGF0ZSk7Cit1MTYgZGI4NTAwX3ByY211X2dldF9yZXNldF9jb2RlKHZvaWQpOworYm9vbCBkYjg1MDBfcHJjbXVfaXNfYWNfd2FrZV9yZXF1ZXN0ZWQodm9pZCk7CitpbnQgZGI4NTAwX3ByY211X3NldF9hcm1fb3BwKHU4IG9wcCk7CitpbnQgZGI4NTAwX3ByY211X2dldF9hcm1fb3BwKHZvaWQpOworCiAjZWxzZSAvKiAhQ09ORklHX01GRF9EQjg1MDBfUFJDTVUgKi8KIAorc3RhdGljIGlubGluZSB2b2lkIGRiODUwMF9wcmNtdV9lYXJseV9pbml0KHZvaWQpIHt9CisKIHN0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9yY19hMnAoZW51bSByb21jb2RlX3dyaXRlIGNvZGUpCiB7CiAJcmV0dXJuIDA7CkBAIC03NTUsMzQgKzU2OSwxMiBAQAogCXJldHVybiBBUF9FWEVDVVRFOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9zZXRfcG93ZXJfc3RhdGUodTggc3RhdGUsIGJvb2wga2VlcF91bHBfY2xrLAotCWJvb2wga2VlcF9hcF9wbGwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcykge30KLQotc3RhdGljIGlubGluZSB2b2lkIHByY211X2Rpc2FibGVfd2FrZXVwcyh2b2lkKSB7fQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfY29uZmlnX2FiYl9ldmVudF9yZWFkb3V0KHUzMiBhYmJfZXZlbnRzKSB7fQotCi1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9zZXRfYXJtX29wcCh1OCBvcHApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHByY211X2dldF9hcm1fb3BwKHZvaWQpCi17Ci0JcmV0dXJuIEFSTV8xMDBfT1BQOwotfQotCi1zdGF0aWMgYm9vbCBwcmNtdV9oYXNfYXJtX21heG9wcCh2b2lkKQorc3RhdGljIGlubGluZSBib29sIHByY211X2hhc19hcm1fbWF4b3BwKHZvaWQpCiB7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBwcmNtdV9pc191ODQwMCh2b2lkKQorc3RhdGljIGlubGluZSBib29sIHByY211X2lzX3U4NDAwKHZvaWQpCiB7CiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtODE3LDEzICs2MDksNiBAQAogCXJldHVybiBERFJfMTAwX09QUDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHByY211X3Fvc19nZXRfY3B1ZnJlcV9vcHBfZGVsYXkodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHByY211X3Fvc19zZXRfY3B1ZnJlcV9vcHBfZGVsYXkodW5zaWduZWQgbG9uZyBuKSB7fQotCiBzdGF0aWMgaW5saW5lIGludCBwcmNtdV9zZXRfaHdhY2ModTE2IGh3X2FjY19kZXYsIHU4IHN0YXRlKQogewogCXJldHVybiAwOwpAQCAtODQ0LDIxICs2MjksMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9jbG9ja19kaXZpZGVyKHU4IGNsb2NrLCB1OCBkaXZpZGVyKQogewogCXJldHVybiAwOwogfQogCi1pbnQgcHJjbXVfY29uZmlnX2VzcmFtMF9kZWVwX3NsZWVwKHU4IHN0YXRlKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwcmNtdV9jb25maWdfaG90ZG9nKHU4IHRocmVzaG9sZCkKIHsKIAlyZXR1cm4gMDsKQEAgLTg5MywzMiArNjY4LDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHByY211X2FjX3NsZWVwX3JlcSh2b2lkKSB7fQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfc3lzdGVtX3Jlc2V0KHUxNiByZXNldF9jb2RlKSB7fQotCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfbW9kZW1fcmVzZXQodm9pZCkge30KIAotc3RhdGljIGlubGluZSBib29sIHByY211X2lzX2FjX3dha2VfcmVxdWVzdGVkKHZvaWQpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIENPTkZJR19VWDUwMF9TT0NfREI1NTAwCi1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9zZXRfZGlzcGxheV9jbG9ja3Modm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZGlzYWJsZV9kc2lwbGwodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZW5hYmxlX2RzaXBsbCh2b2lkKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgaW50IHByY211X2VuYWJsZV9zcGkyKHZvaWQpCiB7CiAJcmV0dXJuIDA7CkBAIC05MjksNTAgKzY4MCw5NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZGI4NTAwX3ByY211X3N5c3RlbV9yZXNldCh1MTYgcmVzZXRfY29kZSkge30KKworc3RhdGljIGlubGluZSBpbnQgZGI4NTAwX3ByY211X3NldF9wb3dlcl9zdGF0ZSh1OCBzdGF0ZSwgYm9vbCBrZWVwX3VscF9jbGssCisJYm9vbCBrZWVwX2FwX3BsbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRiODUwMF9wcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcykge30KKworc3RhdGljIGlubGluZSBpbnQgZGI4NTAwX3ByY211X3NldF9lcG9kKHUxNiBlcG9kX2lkLCB1OCBlcG9kX3N0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkYjg1MDBfcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9zZXRfZGlzcGxheV9jbG9ja3Modm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGI4NTAwX3ByY211X2Rpc2FibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9jb25maWdfZXNyYW0wX2RlZXBfc2xlZXAodTggc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYjg1MDBfcHJjbXVfY29uZmlnX2FiYl9ldmVudF9yZWFkb3V0KHUzMiBhYmJfZXZlbnRzKSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGI4NTAwX3ByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1Zikge30KKworc3RhdGljIGlubGluZSB1MTYgZGI4NTAwX3ByY211X2dldF9yZXNldF9jb2RlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2NvbmZpZ19hOXdkb2codTggbnVtLCBib29sIHNsZWVwX2F1dG9fb2ZmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9lbmFibGVfYTl3ZG9nKHU4IGlkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9kaXNhYmxlX2E5d2RvZyh1OCBpZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfa2lja19hOXdkb2codTggaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2xvYWRfYTl3ZG9nKHU4IGlkLCB1MzIgdmFsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZGI4NTAwX3ByY211X2lzX2FjX3dha2VfcmVxdWVzdGVkKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9zZXRfYXJtX29wcCh1OCBvcHApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9nZXRfYXJtX29wcCh2b2lkKQoreworCXJldHVybiAwOworfQorCiAjZW5kaWYgLyogIUNPTkZJR19NRkRfREI4NTAwX1BSQ01VICovCiAKLSNpZmRlZiBDT05GSUdfVVg1MDBfUFJDTVVfUU9TX1BPV0VSCi1pbnQgcHJjbXVfcW9zX3JlcXVpcmVtZW50KGludCBwbV9xb3NfY2xhc3MpOwotaW50IHByY211X3Fvc19hZGRfcmVxdWlyZW1lbnQoaW50IHBtX3Fvc19jbGFzcywgY2hhciAqbmFtZSwgczMyIHZhbHVlKTsKLWludCBwcmNtdV9xb3NfdXBkYXRlX3JlcXVpcmVtZW50KGludCBwbV9xb3NfY2xhc3MsIGNoYXIgKm5hbWUsIHMzMiBuZXdfdmFsdWUpOwotdm9pZCBwcmNtdV9xb3NfcmVtb3ZlX3JlcXVpcmVtZW50KGludCBwbV9xb3NfY2xhc3MsIGNoYXIgKm5hbWUpOwotaW50IHByY211X3Fvc19hZGRfbm90aWZpZXIoaW50IHByY211X3Fvc19jbGFzcywKLQkJCSAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOwotaW50IHByY211X3Fvc19yZW1vdmVfbm90aWZpZXIoaW50IHByY211X3Fvc19jbGFzcywKLQkJCSAgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc19yZXF1aXJlbWVudChpbnQgcHJjbXVfcW9zX2NsYXNzKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9xb3NfYWRkX3JlcXVpcmVtZW50KGludCBwcmNtdV9xb3NfY2xhc3MsCi0JCQkJCSAgICBjaGFyICpuYW1lLCBzMzIgdmFsdWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc191cGRhdGVfcmVxdWlyZW1lbnQoaW50IHByY211X3Fvc19jbGFzcywKLQkJCQkJICAgICAgIGNoYXIgKm5hbWUsIHMzMiBuZXdfdmFsdWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9xb3NfcmVtb3ZlX3JlcXVpcmVtZW50KGludCBwcmNtdV9xb3NfY2xhc3MsIGNoYXIgKm5hbWUpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc19hZGRfbm90aWZpZXIoaW50IHByY211X3Fvc19jbGFzcywKLQkJCQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9xb3NfcmVtb3ZlX25vdGlmaWVyKGludCBwcmNtdV9xb3NfY2xhc3MsCi0JCQkJCSAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fTUZEX0RCODUwMF9QUkNNVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9kYng1MDAtcHJjbXUuaCBiL2luY2x1ZGUvbGludXgvbWZkL2RieDUwMC1wcmNtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzk0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9kYng1MDAtcHJjbXUuaApAQCAtMCwwICsxLDU0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QgRXJpY3Nzb24gU0EgMjAxMQorICoKKyAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCisgKgorICogU1RFIFV4NTAwIFBSQ01VIEFQSQorICovCisjaWZuZGVmIF9fTUFDSF9QUkNNVV9ICisjZGVmaW5lIF9fTUFDSF9QUkNNVV9ICisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKy8qIFBSQ01VIFdha2V1cCBkZWZpbmVzICovCitlbnVtIHByY211X3dha2V1cF9pbmRleCB7CisJUFJDTVVfV0FLRVVQX0lOREVYX1JUQywKKwlQUkNNVV9XQUtFVVBfSU5ERVhfUlRUMCwKKwlQUkNNVV9XQUtFVVBfSU5ERVhfUlRUMSwKKwlQUkNNVV9XQUtFVVBfSU5ERVhfSFNJMCwKKwlQUkNNVV9XQUtFVVBfSU5ERVhfSFNJMSwKKwlQUkNNVV9XQUtFVVBfSU5ERVhfVVNCLAorCVBSQ01VX1dBS0VVUF9JTkRFWF9BQkIsCisJUFJDTVVfV0FLRVVQX0lOREVYX0FCQl9GSUZPLAorCVBSQ01VX1dBS0VVUF9JTkRFWF9BUk0sCisJUFJDTVVfV0FLRVVQX0lOREVYX0NEX0lSUSwKKwlOVU1fUFJDTVVfV0FLRVVQX0lORElDRVMKK307CisjZGVmaW5lIFBSQ01VX1dBS0VVUChfbmFtZSkgKEJJVChQUkNNVV9XQUtFVVBfSU5ERVhfIyNfbmFtZSkpCisKKy8qIEVQT0QgKHBvd2VyIGRvbWFpbikgSURzICovCisKKy8qCisgKiBEQjg1MDAgRVBPRHMKKyAqIC0gRVBPRF9JRF9TVkFNTURTUDogcG93ZXIgZG9tYWluIGZvciBTVkEgTU1EU1AKKyAqIC0gRVBPRF9JRF9TVkFQSVBFOiBwb3dlciBkb21haW4gZm9yIFNWQSBwaXBlCisgKiAtIEVQT0RfSURfU0lBTU1EU1A6IHBvd2VyIGRvbWFpbiBmb3IgU0lBIE1NRFNQCisgKiAtIEVQT0RfSURfU0lBUElQRTogcG93ZXIgZG9tYWluIGZvciBTSUEgcGlwZQorICogLSBFUE9EX0lEX1NHQTogcG93ZXIgZG9tYWluIGZvciBTR0EKKyAqIC0gRVBPRF9JRF9CMlIyX01DREU6IHBvd2VyIGRvbWFpbiBmb3IgQjJSMiBhbmQgTUNERQorICogLSBFUE9EX0lEX0VTUkFNMTI6IHBvd2VyIGRvbWFpbiBmb3IgRVNSQU0gMSBhbmQgMgorICogLSBFUE9EX0lEX0VTUkFNMzQ6IHBvd2VyIGRvbWFpbiBmb3IgRVNSQU0gMyBhbmQgNAorICogLSBOVU1fRVBPRF9JRDogbnVtYmVyIG9mIHBvd2VyIGRvbWFpbnMKKyAqCisgKiBUT0RPOiBUaGVzZSBzaG91bGQgYmUgcHJlZml4ZWQuCisgKi8KKyNkZWZpbmUgRVBPRF9JRF9TVkFNTURTUAkwCisjZGVmaW5lIEVQT0RfSURfU1ZBUElQRQkJMQorI2RlZmluZSBFUE9EX0lEX1NJQU1NRFNQCTIKKyNkZWZpbmUgRVBPRF9JRF9TSUFQSVBFCQkzCisjZGVmaW5lIEVQT0RfSURfU0dBCQk0CisjZGVmaW5lIEVQT0RfSURfQjJSMl9NQ0RFCTUKKyNkZWZpbmUgRVBPRF9JRF9FU1JBTTEyCQk2CisjZGVmaW5lIEVQT0RfSURfRVNSQU0zNAkJNworI2RlZmluZSBOVU1fRVBPRF9JRAkJOAorCisvKgorICogREI1NTAwIEVQT0RzCisgKi8KKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfQkFTRSAweDAxMDAKKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfU0dBIChEQjU1MDBfRVBPRF9JRF9CQVNFICsgMCkKKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfSFZBIChEQjU1MDBfRVBPRF9JRF9CQVNFICsgMSkKKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfU0lBIChEQjU1MDBfRVBPRF9JRF9CQVNFICsgMikKKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfRElTUCAoREI1NTAwX0VQT0RfSURfQkFTRSArIDMpCisjZGVmaW5lIERCNTUwMF9FUE9EX0lEX0VTUkFNMTIgKERCNTUwMF9FUE9EX0lEX0JBU0UgKyA2KQorI2RlZmluZSBEQjU1MDBfTlVNX0VQT0RfSUQgNworCisvKgorICogc3RhdGUgZGVmaW5pdGlvbiBmb3IgRVBPRCAocG93ZXIgZG9tYWluKQorICogLSBFUE9EX1NUQVRFX05PX0NIQU5HRTogVGhlIEVQT0Qgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQKKyAqIC0gRVBPRF9TVEFURV9PRkY6IFRoZSBFUE9EIGlzIHN3aXRjaGVkIG9mZgorICogLSBFUE9EX1NUQVRFX1JBTVJFVDogVGhlIEVQT0QgaXMgc3dpdGNoZWQgb2ZmIHdpdGggaXRzIGludGVybmFsIFJBTSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ZW50aW9uCisgKiAtIEVQT0RfU1RBVEVfT05fQ0xLX09GRjogVGhlIEVQT0QgaXMgc3dpdGNoZWQgb24sIGNsb2NrIGlzIHN0aWxsIG9mZgorICogLSBFUE9EX1NUQVRFX09OOiBTYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBjbG9jayBlbmFibGVkCisgKi8KKyNkZWZpbmUgRVBPRF9TVEFURV9OT19DSEFOR0UJMHgwMAorI2RlZmluZSBFUE9EX1NUQVRFX09GRgkJMHgwMQorI2RlZmluZSBFUE9EX1NUQVRFX1JBTVJFVAkweDAyCisjZGVmaW5lIEVQT0RfU1RBVEVfT05fQ0xLX09GRgkweDAzCisjZGVmaW5lIEVQT0RfU1RBVEVfT04JCTB4MDQKKworLyoKKyAqIENMS09VVCBzb3VyY2VzCisgKi8KKyNkZWZpbmUgUFJDTVVfQ0xLU1JDX0NMSzM4TQkJMHgwMAorI2RlZmluZSBQUkNNVV9DTEtTUkNfQUNMSwkJMHgwMQorI2RlZmluZSBQUkNNVV9DTEtTUkNfU1lTQ0xLCQkweDAyCisjZGVmaW5lIFBSQ01VX0NMS1NSQ19MQ0RDTEsJCTB4MDMKKyNkZWZpbmUgUFJDTVVfQ0xLU1JDX1NETU1DQ0xLCQkweDA0CisjZGVmaW5lIFBSQ01VX0NMS1NSQ19UVkNMSwkJMHgwNQorI2RlZmluZSBQUkNNVV9DTEtTUkNfVElNQ0xLCQkweDA2CisjZGVmaW5lIFBSQ01VX0NMS1NSQ19DTEswMDkJCTB4MDcKKy8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciBDTEtPVVQxOiAqLworI2RlZmluZSBQUkNNVV9DTEtTUkNfU0lBTU1EU1BDTEsJMHg0MAorI2RlZmluZSBQUkNNVV9DTEtTUkNfSTJDQ0xLCQkweDQxCisjZGVmaW5lIFBSQ01VX0NMS1NSQ19NU1AwMkNMSwkJMHg0MgorI2RlZmluZSBQUkNNVV9DTEtTUkNfQVJNUExMX09CU0NMSwkweDQzCisjZGVmaW5lIFBSQ01VX0NMS1NSQ19IU0lSWENMSwkJMHg0NAorI2RlZmluZSBQUkNNVV9DTEtTUkNfSFNJVFhDTEsJCTB4NDUKKyNkZWZpbmUgUFJDTVVfQ0xLU1JDX0FSTUNMS0ZJWAkJMHg0NgorI2RlZmluZSBQUkNNVV9DTEtTUkNfSERNSUNMSwkJMHg0NworCisvKgorICogQ2xvY2sgaWRlbnRpZmllcnMuCisgKi8KK2VudW0gcHJjbXVfY2xvY2sgeworCVBSQ01VX1NHQUNMSywKKwlQUkNNVV9VQVJUQ0xLLAorCVBSQ01VX01TUDAyQ0xLLAorCVBSQ01VX01TUDFDTEssCisJUFJDTVVfSTJDQ0xLLAorCVBSQ01VX1NETU1DQ0xLLAorCVBSQ01VX1NMSU1DTEssCisJUFJDTVVfUEVSMUNMSywKKwlQUkNNVV9QRVIyQ0xLLAorCVBSQ01VX1BFUjNDTEssCisJUFJDTVVfUEVSNUNMSywKKwlQUkNNVV9QRVI2Q0xLLAorCVBSQ01VX1BFUjdDTEssCisJUFJDTVVfTENEQ0xLLAorCVBSQ01VX0JNTENMSywKKwlQUkNNVV9IU0lUWENMSywKKwlQUkNNVV9IU0lSWENMSywKKwlQUkNNVV9IRE1JQ0xLLAorCVBSQ01VX0FQRUFUQ0xLLAorCVBSQ01VX0FQRVRSQUNFQ0xLLAorCVBSQ01VX01DREVDTEssCisJUFJDTVVfSVBJMkNDTEssCisJUFJDTVVfRFNJQUxUQ0xLLAorCVBSQ01VX0RNQUNMSywKKwlQUkNNVV9CMlIyQ0xLLAorCVBSQ01VX1RWQ0xLLAorCVBSQ01VX1NTUENMSywKKwlQUkNNVV9STkdDTEssCisJUFJDTVVfVUlDQ0NMSywKKwlQUkNNVV9QV01DTEssCisJUFJDTVVfSVJEQUNMSywKKwlQUkNNVV9JUlJDQ0xLLAorCVBSQ01VX1NJQUNMSywKKwlQUkNNVV9TVkFDTEssCisJUFJDTVVfTlVNX1JFR19DTE9DS1MsCisJUFJDTVVfU1lTQ0xLID0gUFJDTVVfTlVNX1JFR19DTE9DS1MsCisJUFJDTVVfVElNQ0xLLAorCVBSQ01VX1BMTFNPQzAsCisJUFJDTVVfUExMU09DMSwKKwlQUkNNVV9QTExERFIsCit9OworCisvKioKKyAqIGVudW0gYXBlX29wcCAtIEFQRSBPUFAgc3RhdGVzIGRlZmluaXRpb24KKyAqIEBBUEVfT1BQX0lOSVQ6CisgKiBAQVBFX05PX0NIQU5HRTogVGhlIEFQRSBvcGVyYXRpbmcgcG9pbnQgaXMgdW5jaGFuZ2VkCisgKiBAQVBFXzEwMF9PUFA6IFRoZSBuZXcgQVBFIG9wZXJhdGluZyBwb2ludCBpcyBhcGUxMDBvcHAKKyAqIEBBUEVfNTBfT1BQOiA1MCUKKyAqLworZW51bSBhcGVfb3BwIHsKKwlBUEVfT1BQX0lOSVQgPSAweDAwLAorCUFQRV9OT19DSEFOR0UgPSAweDAxLAorCUFQRV8xMDBfT1BQID0gMHgwMiwKKwlBUEVfNTBfT1BQID0gMHgwMworfTsKKworLyoqCisgKiBlbnVtIGFybV9vcHAgLSBBUk0gT1BQIHN0YXRlcyBkZWZpbml0aW9uCisgKiBAQVJNX09QUF9JTklUOgorICogQEFSTV9OT19DSEFOR0U6IFRoZSBBUk0gb3BlcmF0aW5nIHBvaW50IGlzIHVuY2hhbmdlZAorICogQEFSTV8xMDBfT1BQOiBUaGUgbmV3IEFSTSBvcGVyYXRpbmcgcG9pbnQgaXMgYXJtMTAwb3BwCisgKiBAQVJNXzUwX09QUDogVGhlIG5ldyBBUk0gb3BlcmF0aW5nIHBvaW50IGlzIGFybTUwb3BwCisgKiBAQVJNX01BWF9PUFA6IE9wZXJhdGluZyBwb2ludCBpcyAibWF4IiAobW9yZSB0aGFuIDEwMCkKKyAqIEBBUk1fTUFYX0ZSRVExMDBPUFA6IFNldCBtYXggb3BwIGlmIGF2YWlsYWJsZSwgZWxzZSAxMDAKKyAqIEBBUk1fRVhUQ0xLOiBUaGUgbmV3IEFSTSBvcGVyYXRpbmcgcG9pbnQgaXMgYXJtRXh0Q2xrCisgKi8KK2VudW0gYXJtX29wcCB7CisJQVJNX09QUF9JTklUID0gMHgwMCwKKwlBUk1fTk9fQ0hBTkdFID0gMHgwMSwKKwlBUk1fMTAwX09QUCA9IDB4MDIsCisJQVJNXzUwX09QUCA9IDB4MDMsCisJQVJNX01BWF9PUFAgPSAweDA0LAorCUFSTV9NQVhfRlJFUTEwME9QUCA9IDB4MDUsCisJQVJNX0VYVENMSyA9IDB4MDcKK307CisKKy8qKgorICogZW51bSBkZHJfb3BwIC0gRERSIE9QUCBzdGF0ZXMgZGVmaW5pdGlvbgorICogQEREUl8xMDBfT1BQOiBUaGUgbmV3IEREUiBvcGVyYXRpbmcgcG9pbnQgaXMgZGRyMTAwb3BwCisgKiBARERSXzUwX09QUDogVGhlIG5ldyBERFIgb3BlcmF0aW5nIHBvaW50IGlzIGRkcjUwb3BwCisgKiBARERSXzI1X09QUDogVGhlIG5ldyBERFIgb3BlcmF0aW5nIHBvaW50IGlzIGRkcjI1b3BwCisgKi8KK2VudW0gZGRyX29wcCB7CisJRERSXzEwMF9PUFAgPSAweDAwLAorCUREUl81MF9PUFAgPSAweDAxLAorCUREUl8yNV9PUFAgPSAweDAyLAorfTsKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBjb250cm9sbGluZyBFU1JBTTAgaW4gZGVlcCBzbGVlcC4KKyAqLworI2RlZmluZSBFU1JBTTBfREVFUF9TTEVFUF9TVEFURV9PRkYgMQorI2RlZmluZSBFU1JBTTBfREVFUF9TTEVFUF9TVEFURV9SRVQgMgorCisvKioKKyAqIGVudW0gZGRyX3B3cnN0IC0gRERSIHBvd2VyIHN0YXRlcyBkZWZpbml0aW9uCisgKiBARERSX1BXUl9TVEFURV9VTkNIQU5HRUQ6IFNEUkFNIGFuZCBERFIgY29udHJvbGxlciBzdGF0ZSBpcyB1bmNoYW5nZWQKKyAqIEBERFJfUFdSX1NUQVRFX09OOgorICogQEREUl9QV1JfU1RBVEVfT0ZGTE9XTEFUOgorICogQEREUl9QV1JfU1RBVEVfT0ZGSElHSExBVDoKKyAqLworZW51bSBkZHJfcHdyc3QgeworCUREUl9QV1JfU1RBVEVfVU5DSEFOR0VEICAgICA9IDB4MDAsCisJRERSX1BXUl9TVEFURV9PTiAgICAgICAgICAgID0gMHgwMSwKKwlERFJfUFdSX1NUQVRFX09GRkxPV0xBVCAgICAgPSAweDAyLAorCUREUl9QV1JfU1RBVEVfT0ZGSElHSExBVCAgICA9IDB4MDMKK307CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvZGI4NTAwLXByY211Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RiNTUwMC1wcmNtdS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVVg1MDBfU09DX0RCODUwMCkgfHwgZGVmaW5lZChDT05GSUdfVVg1MDBfU09DX0RCNTUwMCkKKworc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwcmNtdV9lYXJseV9pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIGRiNTUwMF9wcmNtdV9lYXJseV9pbml0KCk7CisJZWxzZQorCQlyZXR1cm4gZGI4NTAwX3ByY211X2Vhcmx5X2luaXQoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X3Bvd2VyX3N0YXRlKHU4IHN0YXRlLCBib29sIGtlZXBfdWxwX2NsaywKKwkJYm9vbCBrZWVwX2FwX3BsbCkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gZGI1NTAwX3ByY211X3NldF9wb3dlcl9zdGF0ZShzdGF0ZSwga2VlcF91bHBfY2xrLAorCQkJa2VlcF9hcF9wbGwpOworCWVsc2UKKwkJcmV0dXJuIGRiODUwMF9wcmNtdV9zZXRfcG93ZXJfc3RhdGUoc3RhdGUsIGtlZXBfdWxwX2NsaywKKwkJCWtlZXBfYXBfcGxsKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X2Vwb2QodTE2IGVwb2RfaWQsIHU4IGVwb2Rfc3RhdGUpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZQorCQlyZXR1cm4gZGI4NTAwX3ByY211X3NldF9lcG9kKGVwb2RfaWQsIGVwb2Rfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfZW5hYmxlX3dha2V1cHModTMyIHdha2V1cHMpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJZGI1NTAwX3ByY211X2VuYWJsZV93YWtldXBzKHdha2V1cHMpOworCWVsc2UKKwkJZGI4NTAwX3ByY211X2VuYWJsZV93YWtldXBzKHdha2V1cHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfZGlzYWJsZV93YWtldXBzKHZvaWQpCit7CisJcHJjbXVfZW5hYmxlX3dha2V1cHMoMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJZGI1NTAwX3ByY211X2NvbmZpZ19hYmJfZXZlbnRfcmVhZG91dChhYmJfZXZlbnRzKTsKKwllbHNlCisJCWRiODUwMF9wcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQoYWJiX2V2ZW50cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9nZXRfYWJiX2V2ZW50X2J1ZmZlcih2b2lkIF9faW9tZW0gKipidWYpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJZGI1NTAwX3ByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKGJ1Zik7CisJZWxzZQorCQlkYjg1MDBfcHJjbXVfZ2V0X2FiYl9ldmVudF9idWZmZXIoYnVmKTsKK30KKworaW50IHByY211X2FiYl9yZWFkKHU4IHNsYXZlLCB1OCByZWcsIHU4ICp2YWx1ZSwgdTggc2l6ZSk7CitpbnQgcHJjbXVfYWJiX3dyaXRlKHU4IHNsYXZlLCB1OCByZWcsIHU4ICp2YWx1ZSwgdTggc2l6ZSk7CisKK2ludCBwcmNtdV9jb25maWdfY2xrb3V0KHU4IGNsa291dCwgdTggc291cmNlLCB1OCBkaXYpOworCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9yZXF1ZXN0X2Nsb2NrKHU4IGNsb2NrLCBib29sIGVuYWJsZSkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gZGI1NTAwX3ByY211X3JlcXVlc3RfY2xvY2soY2xvY2ssIGVuYWJsZSk7CisJZWxzZQorCQlyZXR1cm4gZGI4NTAwX3ByY211X3JlcXVlc3RfY2xvY2soY2xvY2ssIGVuYWJsZSk7Cit9CisKK2ludCBwcmNtdV9zZXRfYXBlX29wcCh1OCBvcHApOworaW50IHByY211X2dldF9hcGVfb3BwKHZvaWQpOworaW50IHByY211X3NldF9kZHJfb3BwKHU4IG9wcCk7CitpbnQgcHJjbXVfZ2V0X2Rkcl9vcHAodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9hcm1fb3BwKHU4IG9wcCkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfc2V0X2FybV9vcHAob3BwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZ2V0X2FybV9vcHAodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfZ2V0X2FybV9vcHAoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X3N5c3RlbV9yZXNldCh1MTYgcmVzZXRfY29kZSkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gZGI1NTAwX3ByY211X3N5c3RlbV9yZXNldChyZXNldF9jb2RlKTsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfc3lzdGVtX3Jlc2V0KHJlc2V0X2NvZGUpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBwcmNtdV9nZXRfcmVzZXRfY29kZSh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX3U1NTAwKCkpCisJCXJldHVybiBkYjU1MDBfcHJjbXVfZ2V0X3Jlc2V0X2NvZGUoKTsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfZ2V0X3Jlc2V0X2NvZGUoKTsKK30KKwordm9pZCBwcmNtdV9hY193YWtlX3JlcSh2b2lkKTsKK3ZvaWQgcHJjbXVfYWNfc2xlZXBfcmVxKHZvaWQpOwordm9pZCBwcmNtdV9tb2RlbV9yZXNldCh2b2lkKTsKK3N0YXRpYyBpbmxpbmUgYm9vbCBwcmNtdV9pc19hY193YWtlX3JlcXVlc3RlZCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX3U1NTAwKCkpCisJCXJldHVybiBkYjU1MDBfcHJjbXVfaXNfYWNfd2FrZV9yZXF1ZXN0ZWQoKTsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfaXNfYWNfd2FrZV9yZXF1ZXN0ZWQoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X2Rpc3BsYXlfY2xvY2tzKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIGRiNTUwMF9wcmNtdV9zZXRfZGlzcGxheV9jbG9ja3MoKTsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfc2V0X2Rpc3BsYXlfY2xvY2tzKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2Rpc2FibGVfZHNpcGxsKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIGRiNTUwMF9wcmNtdV9kaXNhYmxlX2RzaXBsbCgpOworCWVsc2UKKwkJcmV0dXJuIGRiODUwMF9wcmNtdV9kaXNhYmxlX2RzaXBsbCgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIGRiNTUwMF9wcmNtdV9lbmFibGVfZHNpcGxsKCk7CisJZWxzZQorCQlyZXR1cm4gZGI4NTAwX3ByY211X2VuYWJsZV9kc2lwbGwoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfY29uZmlnX2VzcmFtMF9kZWVwX3NsZWVwKHU4IHN0YXRlKQoreworCWlmIChtYWNoaW5lX2lzX3U1NTAwKCkpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UKKwkJcmV0dXJuIGRiODUwMF9wcmNtdV9jb25maWdfZXNyYW0wX2RlZXBfc2xlZXAoc3RhdGUpOworfQorI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwcmNtdV9lYXJseV9pbml0KHZvaWQpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9wb3dlcl9zdGF0ZSh1OCBzdGF0ZSwgYm9vbCBrZWVwX3VscF9jbGssCisJYm9vbCBrZWVwX2FwX3BsbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X2Vwb2QodTE2IGVwb2RfaWQsIHU4IGVwb2Rfc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcykge30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X2Rpc2FibGVfd2FrZXVwcyh2b2lkKSB7fQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9hYmJfcmVhZCh1OCBzbGF2ZSwgdTggcmVnLCB1OCAqdmFsdWUsIHU4IHNpemUpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2FiYl93cml0ZSh1OCBzbGF2ZSwgdTggcmVnLCB1OCAqdmFsdWUsIHU4IHNpemUpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2NvbmZpZ19jbGtvdXQodTggY2xrb3V0LCB1OCBzb3VyY2UsIHU4IGRpdikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9hcGVfb3BwKHU4IG9wcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZ2V0X2FwZV9vcHAodm9pZCkKK3sKKwlyZXR1cm4gQVBFXzEwMF9PUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9hcm1fb3BwKHU4IG9wcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZ2V0X2FybV9vcHAodm9pZCkKK3sKKwlyZXR1cm4gQVJNXzEwMF9PUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9kZHJfb3BwKHU4IG9wcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZ2V0X2Rkcl9vcHAodm9pZCkKK3sKKwlyZXR1cm4gRERSXzEwMF9PUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9zeXN0ZW1fcmVzZXQodTE2IHJlc2V0X2NvZGUpIHt9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHByY211X2dldF9yZXNldF9jb2RlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9hY193YWtlX3JlcSh2b2lkKSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfYWNfc2xlZXBfcmVxKHZvaWQpIHt9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9tb2RlbV9yZXNldCh2b2lkKSB7fQorCitzdGF0aWMgaW5saW5lIGJvb2wgcHJjbXVfaXNfYWNfd2FrZV9yZXF1ZXN0ZWQodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9kaXNwbGF5X2Nsb2Nrcyh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9kaXNhYmxlX2RzaXBsbCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2NvbmZpZ19lc3JhbTBfZGVlcF9zbGVlcCh1OCBzdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X2NvbmZpZ19hYmJfZXZlbnRfcmVhZG91dCh1MzIgYWJiX2V2ZW50cykge30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1ZikKK3sKKwkqYnVmID0gTlVMTDsKK30KKworI2VuZGlmCisKKy8qIFBSQ01VIFFvUyBBUEUgT1BQIGNsYXNzICovCisjZGVmaW5lIFBSQ01VX1FPU19BUEVfT1BQIDEKKyNkZWZpbmUgUFJDTVVfUU9TX0REUl9PUFAgMgorI2RlZmluZSBQUkNNVV9RT1NfREVGQVVMVF9WQUxVRSAtMQorCisjaWZkZWYgQ09ORklHX1VYNTAwX1BSQ01VX1FPU19QT1dFUgorCit1bnNpZ25lZCBsb25nIHByY211X3Fvc19nZXRfY3B1ZnJlcV9vcHBfZGVsYXkodm9pZCk7Cit2b2lkIHByY211X3Fvc19zZXRfY3B1ZnJlcV9vcHBfZGVsYXkodW5zaWduZWQgbG9uZyk7Cit2b2lkIHByY211X3Fvc19mb3JjZV9vcHAoaW50LCBzMzIpOworaW50IHByY211X3Fvc19yZXF1aXJlbWVudChpbnQgcG1fcW9zX2NsYXNzKTsKK2ludCBwcmNtdV9xb3NfYWRkX3JlcXVpcmVtZW50KGludCBwbV9xb3NfY2xhc3MsIGNoYXIgKm5hbWUsIHMzMiB2YWx1ZSk7CitpbnQgcHJjbXVfcW9zX3VwZGF0ZV9yZXF1aXJlbWVudChpbnQgcG1fcW9zX2NsYXNzLCBjaGFyICpuYW1lLCBzMzIgbmV3X3ZhbHVlKTsKK3ZvaWQgcHJjbXVfcW9zX3JlbW92ZV9yZXF1aXJlbWVudChpbnQgcG1fcW9zX2NsYXNzLCBjaGFyICpuYW1lKTsKK2ludCBwcmNtdV9xb3NfYWRkX25vdGlmaWVyKGludCBwcmNtdV9xb3NfY2xhc3MsCisJCQkgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTsKK2ludCBwcmNtdV9xb3NfcmVtb3ZlX25vdGlmaWVyKGludCBwcmNtdV9xb3NfY2xhc3MsCisJCQkgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHByY211X3Fvc19nZXRfY3B1ZnJlcV9vcHBfZGVsYXkodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X3Fvc19zZXRfY3B1ZnJlcV9vcHBfZGVsYXkodW5zaWduZWQgbG9uZyBuKSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfcW9zX2ZvcmNlX29wcChpbnQgcHJjbXVfcW9zX2NsYXNzLCBzMzIgaSkge30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcW9zX3JlcXVpcmVtZW50KGludCBwcmNtdV9xb3NfY2xhc3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc19hZGRfcmVxdWlyZW1lbnQoaW50IHByY211X3Fvc19jbGFzcywKKwkJCQkJICAgIGNoYXIgKm5hbWUsIHMzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcW9zX3VwZGF0ZV9yZXF1aXJlbWVudChpbnQgcHJjbXVfcW9zX2NsYXNzLAorCQkJCQkgICAgICAgY2hhciAqbmFtZSwgczMyIG5ld192YWx1ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X3Fvc19yZW1vdmVfcmVxdWlyZW1lbnQoaW50IHByY211X3Fvc19jbGFzcywgY2hhciAqbmFtZSkKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcW9zX2FkZF9ub3RpZmllcihpbnQgcHJjbXVfcW9zX2NsYXNzLAorCQkJCQkgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc19yZW1vdmVfbm90aWZpZXIoaW50IHByY211X3Fvc19jbGFzcywKKwkJCQkJICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogX19NQUNIX1BSQ01VX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2ludGVsX21zaWMuaCBiL2luY2x1ZGUvbGludXgvbWZkL2ludGVsX21zaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzlhN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvaW50ZWxfbXNpYy5oCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogaW5jbHVkZS9saW51eC9tZmQvaW50ZWxfbXNpYy5oIC0gQ29yZSBpbnRlcmZhY2UgZm9yIEludGVsIE1TSUMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IE1pa2EgV2VzdGVyYmVyZyA8bWlrYS53ZXN0ZXJiZXJnQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfSU5URUxfTVNJQ19IX18KKyNkZWZpbmUgX19MSU5VWF9NRkRfSU5URUxfTVNJQ19IX18KKworLyogSUQgKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19JRDAJCQkweDAwMAkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0lEMQkJCTB4MDAxCS8qIFJPICovCisKKy8qIElSUSAqLworI2RlZmluZSBJTlRFTF9NU0lDX0lSUUxWTDEJCTB4MDAyCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUlOVAkJMHgwMDMKKyNkZWZpbmUgSU5URUxfTVNJQ19DQ0lOVAkJMHgwMDQKKyNkZWZpbmUgSU5URUxfTVNJQ19QV1JTUkNJTlQJCTB4MDA1CisjZGVmaW5lIElOVEVMX01TSUNfUFdSU1JDSU5UMQkJMHgwMDYKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJJTlQJCTB4MDA3CisjZGVmaW5lIElOVEVMX01TSUNfQ0hSSU5UMQkJMHgwMDgKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENJUlEJCTB4MDA5CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVklSUQkJMHgwMGEKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWSVJRCQkweDAwYgorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU9IVklSUQkJMHgwMGMKKyNkZWZpbmUgSU5URUxfTVNJQ19WUklOVAkJMHgwMGQKKyNkZWZpbmUgSU5URUxfTVNJQ19PQ0FVRElPCQkweDAwZQorI2RlZmluZSBJTlRFTF9NU0lDX0FDQ0RFVAkJMHgwMGYKKyNkZWZpbmUgSU5URUxfTVNJQ19SRVNFVElSUTEJCTB4MDEwCisjZGVmaW5lIElOVEVMX01TSUNfUkVTRVRJUlEyCQkweDAxMQorI2RlZmluZSBJTlRFTF9NU0lDX01BREMxSU5UCQkweDAxMgorI2RlZmluZSBJTlRFTF9NU0lDX01DQ0lOVAkJMHgwMTMKKyNkZWZpbmUgSU5URUxfTVNJQ19NUFdSU1JDSU5UCQkweDAxNAorI2RlZmluZSBJTlRFTF9NU0lDX01QV1JTUkNJTlQxCQkweDAxNQorI2RlZmluZSBJTlRFTF9NU0lDX01DSFJJTlQJCTB4MDE2CisjZGVmaW5lIElOVEVMX01TSUNfTUNIUklOVDEJCTB4MDE3CisjZGVmaW5lIElOVEVMX01TSUNfUlRDSVJRTUFTSwkJMHgwMTgKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWSVJRTUFTSwkweDAxOQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFZJUlFNQVNLCTB4MDFhCisjZGVmaW5lIElOVEVMX01TSUNfR1BJT0hWSVJRTUFTSwkweDAxYgorI2RlZmluZSBJTlRFTF9NU0lDX1ZSSU5UTUFTSwkJMHgwMWMKKyNkZWZpbmUgSU5URUxfTVNJQ19PQ0FVRElPTUFTSwkJMHgwMWQKKyNkZWZpbmUgSU5URUxfTVNJQ19BQ0NERVRNQVNLCQkweDAxZQorI2RlZmluZSBJTlRFTF9NU0lDX1JFU0VUSVJRMU1BU0sJMHgwMWYKKyNkZWZpbmUgSU5URUxfTVNJQ19SRVNFVElSUTJNQVNLCTB4MDIwCisjZGVmaW5lIElOVEVMX01TSUNfSVJRTFZMMU1TSwkJMHgwMjEKKyNkZWZpbmUgSU5URUxfTVNJQ19QQkNPTkZJRwkJMHgwM2UKKyNkZWZpbmUgSU5URUxfTVNJQ19QQlNUQVRVUwkJMHgwM2YJLyogUk8gKi8KKworLyogR1BJTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFY3Q1RMTwkJMHgwNDAKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWNkNUTE8JCTB4MDQxCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjVDVExPCQkweDA0MgorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFY0Q1RMTwkJMHgwNDMKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWM0NUTE8JCTB4MDQ0CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjJDVExPCQkweDA0NQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFYxQ1RMTwkJMHgwNDYKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWMENUTE8JCTB4MDQ3CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjdDVExPUwkweDA0OAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFY2Q1RMTwkJMHgwNDkKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWNUNUTE8JCTB4MDRhCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjRDVExPCQkweDA0YgorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFYzQ1RMTwkJMHgwNGMKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWMkNUTE8JCTB4MDRkCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjFDVExPCQkweDA0ZQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFYwQ1RMTwkJMHgwNGYKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWN0NUTEkJCTB4MDUwCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjZDVExJCQkweDA1MQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFY1Q1RMSQkJMHgwNTIKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWNENUTEkJCTB4MDUzCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjNDVExJCQkweDA1NAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFYyQ1RMSQkJMHgwNTUKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWMUNUTEkJCTB4MDU2CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjBDVExJCQkweDA1NworI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFY3Q1RMSVMJMHgwNTgKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWNkNUTEkJCTB4MDU5CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjVDVExJCQkweDA1YQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFY0Q1RMSQkJMHgwNWIKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWM0NUTEkJCTB4MDVjCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjJDVExJCQkweDA1ZAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFYxQ1RMSQkJMHgwNWUKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWMENUTEkJCTB4MDVmCisjZGVmaW5lIElOVEVMX01TSUNfUFdNMENMS0RJVjEJCTB4MDYxCisjZGVmaW5lIElOVEVMX01TSUNfUFdNMENMS0RJVjAJCTB4MDYyCisjZGVmaW5lIElOVEVMX01TSUNfUFdNMUNMS0RJVjEJCTB4MDYzCisjZGVmaW5lIElOVEVMX01TSUNfUFdNMUNMS0RJVjAJCTB4MDY0CisjZGVmaW5lIElOVEVMX01TSUNfUFdNMkNMS0RJVjEJCTB4MDY1CisjZGVmaW5lIElOVEVMX01TSUNfUFdNMkNMS0RJVjAJCTB4MDY2CisjZGVmaW5lIElOVEVMX01TSUNfUFdNMERVVFlDWUNMRQkweDA2NworI2RlZmluZSBJTlRFTF9NU0lDX1BXTTFEVVRZQ1lDTEUJMHgwNjgKKyNkZWZpbmUgSU5URUxfTVNJQ19QV00yRFVUWUNZQ0xFCTB4MDY5CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBIVjNDVExPCQkweDA2ZAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wSFYyQ1RMTwkJMHgwNmUKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMEhWMUNUTE8JCTB4MDZmCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBIVjBDVExPCQkweDA3MAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xSFYzQ1RMTwkJMHgwNzEKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUhWMkNUTE8JCTB4MDcyCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFIVjFDVExPCQkweDA3MworI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xSFYwQ1RMTwkJMHgwNzQKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMEhWM0NUTEkJCTB4MDc1CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBIVjJDVExJCQkweDA3NgorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wSFYxQ1RMSQkJMHgwNzcKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMEhWMENUTEkJCTB4MDc4CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFIVjNDVExJCQkweDA3OQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xSFYyQ1RMSQkJMHgwN2EKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUhWMUNUTEkJCTB4MDdiCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFIVjBDVExJCQkweDA3YworCisvKiBTVklEICovCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRENUUkwwCQkweDA4MAorI2RlZmluZSBJTlRFTF9NU0lDX1NWSURDVFJMMQkJMHgwODEKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEQ1RSTDIJCTB4MDgyCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFRYTEFTVFBLVDMJMHgwODMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEVFhMQVNUUEtUMgkweDA4NAkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1NWSURUWExBU1RQS1QxCTB4MDg1CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFRYTEFTVFBLVDAJMHgwODYJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUEtUT1VUQllURTMJMHgwODcKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUEtUT1VUQllURTIJMHgwODgKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUEtUT1VUQllURTEJMHgwODkKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUEtUT1VUQllURTAJMHgwOGEKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUlhWUERFQlVHMQkweDA4YgorI2RlZmluZSBJTlRFTF9NU0lDX1NWSURSWFZQREVCVUcwCTB4MDhjCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFJYTEFTVFBLVDMJMHgwOGQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUlhMQVNUUEtUMgkweDA4ZQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1NWSURSWExBU1RQS1QxCTB4MDhmCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFJYTEFTVFBLVDAJMHgwOTAJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUlhDSEtTVEFUVVMzCTB4MDkxCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFJYQ0hLU1RBVFVTMgkweDA5MgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1NWSURSWENIS1NUQVRVUzEJMHgwOTMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUlhDSEtTVEFUVVMwCTB4MDk0CS8qIFJPICovCisKKy8qIFZSRUcgKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0NMQVRDSAkJMHgwYzAKKyNkZWZpbmUgSU5URUxfTVNJQ19WTk5MQVRDSAkJMHgwYzEKKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0NDTlQJCTB4MGMyCisjZGVmaW5lIElOVEVMX01TSUNfU01QU1JBTVAJCTB4MGMzCisjZGVmaW5lIElOVEVMX01TSUNfVk5OQ05UCQkweDBjNAorI2RlZmluZSBJTlRFTF9NU0lDX1ZOTkFPTkNOVAkJMHgwYzUKKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0MxMjJBT05DTlQJCTB4MGM2CisjZGVmaW5lIElOVEVMX01TSUNfVjE4MEFPTkNOVAkJMHgwYzcKKyNkZWZpbmUgSU5URUxfTVNJQ19WNTAwQ05UCQkweDBjOAorI2RlZmluZSBJTlRFTF9NU0lDX1ZJSEZDTlQJCTB4MGM5CisjZGVmaW5lIElOVEVMX01TSUNfTERPUkFNUDEJCTB4MGNhCisjZGVmaW5lIElOVEVMX01TSUNfTERPUkFNUDIJCTB4MGNiCisjZGVmaW5lIElOVEVMX01TSUNfVkNDMTA4QU9OQ05UCQkweDBjYworI2RlZmluZSBJTlRFTF9NU0lDX1ZDQzEwOEFTQ05UCQkweDBjZAorI2RlZmluZSBJTlRFTF9NU0lDX1ZDQzEwOENOVAkJMHgwY2UKKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0NBMTAwQVNDTlQJCTB4MGNmCisjZGVmaW5lIElOVEVMX01TSUNfVkNDQTEwMENOVAkJMHgwZDAKKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0MxODBBT05DTlQJCTB4MGQxCisjZGVmaW5lIElOVEVMX01TSUNfVkNDMTgwQ05UCQkweDBkMgorI2RlZmluZSBJTlRFTF9NU0lDX1ZDQzMzMENOVAkJMHgwZDMKKyNkZWZpbmUgSU5URUxfTVNJQ19WVVNCMzMwQ05UCQkweDBkNAorI2RlZmluZSBJTlRFTF9NU0lDX1ZDQ1NESU9DTlQJCTB4MGQ1CisjZGVmaW5lIElOVEVMX01TSUNfVlBST0cxQ05UCQkweDBkNgorI2RlZmluZSBJTlRFTF9NU0lDX1ZQUk9HMkNOVAkJMHgwZDcKKyNkZWZpbmUgSU5URUxfTVNJQ19WRU1NQ1NDTlQJCTB4MGQ4CisjZGVmaW5lIElOVEVMX01TSUNfVkVNTUMxQ05UCQkweDBkOQorI2RlZmluZSBJTlRFTF9NU0lDX1ZFTU1DMkNOVAkJMHgwZGEKKyNkZWZpbmUgSU5URUxfTVNJQ19WQVVEQUNOVAkJMHgwZGIKKyNkZWZpbmUgSU5URUxfTVNJQ19WSFNQQ05UCQkweDBkYworI2RlZmluZSBJTlRFTF9NU0lDX1ZIU05DTlQJCTB4MGRkCisjZGVmaW5lIElOVEVMX01TSUNfVkhETUlDTlQJCTB4MGRlCisjZGVmaW5lIElOVEVMX01TSUNfVk9UR0NOVAkJMHgwZGYKKyNkZWZpbmUgSU5URUxfTVNJQ19WMVAzNUNOVAkJMHgwZTAKKyNkZWZpbmUgSU5URUxfTVNJQ19WMzMwQU9OQ05UCQkweDBlMQorCisvKiBSRVNFVCAqLworI2RlZmluZSBJTlRFTF9NU0lDX0NISVBDTlRSTAkJMHgxMDAJLyogV08gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19FUkNPTkZJRwkJMHgxMDEKKworLyogQlVSU1QgKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19CQVRDVVJSRU5UTElNSVQxMgkweDEwMgorI2RlZmluZSBJTlRFTF9NU0lDX0JBVFRJTUVMSU1JVDEyCTB4MTAzCisjZGVmaW5lIElOVEVMX01TSUNfQkFUVElNRUxJTUlUMwkweDEwNAorI2RlZmluZSBJTlRFTF9NU0lDX0JBVFRJTUVEQgkJMHgxMDUKKyNkZWZpbmUgSU5URUxfTVNJQ19CUlNUQ09ORklHT1VUUFVUUwkweDEwNgorI2RlZmluZSBJTlRFTF9NU0lDX0JSU1RDT05GSUdBQ1RJT05TCTB4MTA3CisjZGVmaW5lIElOVEVMX01TSUNfQlVSU1RDT05UUk9MU1RBVFVTCTB4MTA4CisKKy8qIFJUQyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0IxCQkweDE0MAkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0IyCQkweDE0MQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0IzCQkweDE0MgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0I0CQkweDE0MwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ09CMQkJMHgxNDQKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENPQjIJCTB4MTQ1CisjZGVmaW5lIElOVEVMX01TSUNfUlRDT0IzCQkweDE0NgorI2RlZmluZSBJTlRFTF9NU0lDX1JUQ09CNAkJMHgxNDcKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENBQjEJCTB4MTQ4CisjZGVmaW5lIElOVEVMX01TSUNfUlRDQUIyCQkweDE0OQorI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0FCMwkJMHgxNGEKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENBQjQJCTB4MTRiCisjZGVmaW5lIElOVEVMX01TSUNfUlRDV0FCMQkJMHgxNGMKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENXQUIyCQkweDE0ZAorI2RlZmluZSBJTlRFTF9NU0lDX1JUQ1dBQjMJCTB4MTRlCisjZGVmaW5lIElOVEVMX01TSUNfUlRDV0FCNAkJMHgxNGYKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENTQzEJCTB4MTUwCisjZGVmaW5lIElOVEVMX01TSUNfUlRDU0MyCQkweDE1MQorI2RlZmluZSBJTlRFTF9NU0lDX1JUQ1NDMwkJMHgxNTIKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENTQzQJCTB4MTUzCisjZGVmaW5lIElOVEVMX01TSUNfUlRDU1RBVFVTCQkweDE1NAkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0NPTkZJRzEJCTB4MTU1CisjZGVmaW5lIElOVEVMX01TSUNfUlRDQ09ORklHMgkJMHgxNTYKKworLyogQ0hBUkdFUiAqLworI2RlZmluZSBJTlRFTF9NU0lDX0JEVElNRVIJCTB4MTgwCisjZGVmaW5lIElOVEVMX01TSUNfQkFUVFJNVgkJMHgxODEKKyNkZWZpbmUgSU5URUxfTVNJQ19WQlVTREVUCQkweDE4MgorI2RlZmluZSBJTlRFTF9NU0lDX1ZCVVNERVQxCQkweDE4MworI2RlZmluZSBJTlRFTF9NU0lDX0FEUEhWREVUCQkweDE4NAorI2RlZmluZSBJTlRFTF9NU0lDX0FEUExWREVUCQkweDE4NQorI2RlZmluZSBJTlRFTF9NU0lDX0FEUERFVERCRE0JCTB4MTg2CisjZGVmaW5lIElOVEVMX01TSUNfTE9XQkFUVERFVAkJMHgxODcKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJDVFJMCQkweDE4OAorI2RlZmluZSBJTlRFTF9NU0lDX0NIUkNWT0xUQUdFCQkweDE4OQorI2RlZmluZSBJTlRFTF9NU0lDX0NIUkNDVVJSRU5UCQkweDE4YQorI2RlZmluZSBJTlRFTF9NU0lDX1NQQ0hBUkdFUgkJMHgxOGIKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJUVElNRQkJMHgxOGMKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJDVFJMMQkJMHgxOGQKKyNkZWZpbmUgSU5URUxfTVNJQ19QV1JTUkNMTVQJCTB4MThlCisjZGVmaW5lIElOVEVMX01TSUNfQ0hSU1RXRFQJCTB4MThmCisjZGVmaW5lIElOVEVMX01TSUNfV0RUV1JJVEUJCTB4MTkwCS8qIFdPICovCisjZGVmaW5lIElOVEVMX01TSUNfQ0hSU0FGRUxNVAkJMHgxOTEKKyNkZWZpbmUgSU5URUxfTVNJQ19TUFdSU1JDSU5UCQkweDE5MgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1NQV1JTUkNJTlQxCQkweDE5MwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0NIUkxFRFBXTQkJMHgxOTQKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJMRURDVFJMCQkweDE5NQorCisvKiBBREMgKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQ05UTDEJCTB4MWMwCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUNOVEwyCQkweDFjMQorI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFDTlRMMwkJMHgxYzIKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxT0ZGU0VUSAkJMHgxYzMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxT0ZGU0VUTAkJMHgxYzQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjAJCTB4MWM1CisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFIxCQkweDFjNgorI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFBRERSMgkJMHgxYzcKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjMJCTB4MWM4CisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFI0CQkweDFjOQorI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFBRERSNQkJMHgxY2EKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjYJCTB4MWNiCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFI3CQkweDFjYworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFBRERSOAkJMHgxY2QKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjkJCTB4MWNlCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFIxMAkJMHgxY2YKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjExCQkweDFkMAorI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFBRERSMTIJCTB4MWQxCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFIxMwkJMHgxZDIKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjE0CQkweDFkMworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMwSAkJMHgxZDQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMEwJCTB4MWQ1CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzFICQkweDFkNgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMxTAkJMHgxZDcJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMkgJCTB4MWQ4CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzJMCQkweDFkOQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMzSAkJMHgxZGEJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TM0wJCTB4MWRiCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzRICQkweDFkYwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlM0TAkJMHgxZGQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TNUgJCTB4MWRlCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzVMCQkweDFkZgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlM2SAkJMHgxZTAJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TNkwJCTB4MWUxCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzdICQkweDFlMgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlM3TAkJMHgxZTMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TOEgJCTB4MWU0CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzhMCQkweDFlNQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlM5SAkJMHgxZTYJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TOUwJCTB4MWU3CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzEwSAkJMHgxZTgJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMTBMCQkweDFlOQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMxMUgJCTB4MWVhCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzExTAkJMHgxZWIJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMTJICQkweDFlYwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMxMkwJCTB4MWVkCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzEzSAkJMHgxZWUJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMTNMCQkweDFlZgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMxNEgJCTB4MWYwCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzE0TAkJMHgxZjEJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYwSAkJMHgxZjIJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYwTAkJMHgxZjMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYxSAkJMHgxZjQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYxTAkJMHgxZjUJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYySAkJMHgxZjYJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYyTAkJMHgxZjcJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYzSAkJMHgxZjgJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYzTAkJMHgxZjkJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkwSAkJMHgxZmEJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkwTAkJMHgxZmIJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkxSAkJMHgxZmMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkxTAkJMHgxZmQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkySAkJMHgxZmUJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkyTAkJMHgxZmYJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkzSAkJMHgyMDAJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkzTAkJMHgyMDEJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19DQ0NOVEwJCTB4MjAyCisjZGVmaW5lIElOVEVMX01TSUNfQ0NPRkZTRVRICQkweDIwMwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0NDT0ZGU0VUTAkJMHgyMDQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19DQ0FEQ0hBCQkweDIwNQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0NDQURDTEEJCTB4MjA2CS8qIFJPICovCisKKy8qIEFVRElPICovCisjZGVmaW5lIElOVEVMX01TSUNfQVVEUExMQ1RSTAkJMHgyNDAKKyNkZWZpbmUgSU5URUxfTVNJQ19ETUlDQlVGMDEyMwkJMHgyNDEKKyNkZWZpbmUgSU5URUxfTVNJQ19ETUlDQlVGNDUJCTB4MjQyCisjZGVmaW5lIElOVEVMX01TSUNfRE1JQ0dQTwkJMHgyNDQKKyNkZWZpbmUgSU5URUxfTVNJQ19ETUlDTVVYCQkweDI0NQorI2RlZmluZSBJTlRFTF9NU0lDX0RNSUNDTEsJCTB4MjQ2CisjZGVmaW5lIElOVEVMX01TSUNfTUlDQklBUwkJMHgyNDcKKyNkZWZpbmUgSU5URUxfTVNJQ19BRENDT05GSUcJCTB4MjQ4CisjZGVmaW5lIElOVEVMX01TSUNfTUlDQU1QMQkJMHgyNDkKKyNkZWZpbmUgSU5URUxfTVNJQ19NSUNBTVAyCQkweDI0YQorI2RlZmluZSBJTlRFTF9NU0lDX05PSVNFTVVYCQkweDI0YgorI2RlZmluZSBJTlRFTF9NU0lDX0FVRElPTVVYMTIJCTB4MjRjCisjZGVmaW5lIElOVEVMX01TSUNfQVVESU9NVVgzNAkJMHgyNGQKKyNkZWZpbmUgSU5URUxfTVNJQ19BVURJT1NJTkMJCTB4MjRlCisjZGVmaW5lIElOVEVMX01TSUNfQVVESU9UWEVOCQkweDI0ZgorI2RlZmluZSBJTlRFTF9NU0lDX0hTRVBSWENUUkwJCTB4MjUwCisjZGVmaW5lIElOVEVMX01TSUNfSUhGUlhDVFJMCQkweDI1MQorI2RlZmluZSBJTlRFTF9NU0lDX1ZPSUNFVFhWT0wJCTB4MjUyCisjZGVmaW5lIElOVEVMX01TSUNfU0lERVRPTkVWT0wJCTB4MjUzCisjZGVmaW5lIElOVEVMX01TSUNfTVVTSUNTSEFSVk9MCQkweDI1NAorI2RlZmluZSBJTlRFTF9NU0lDX1ZPSUNFVFhDVFJMCQkweDI1NQorI2RlZmluZSBJTlRFTF9NU0lDX0hTTUlYRVIJCTB4MjU2CisjZGVmaW5lIElOVEVMX01TSUNfREFDQ09ORklHCQkweDI1NworI2RlZmluZSBJTlRFTF9NU0lDX1NPRlRNVVRFCQkweDI1OAorI2RlZmluZSBJTlRFTF9NU0lDX0hTTFZPTENUUkwJCTB4MjU5CisjZGVmaW5lIElOVEVMX01TSUNfSFNSVk9MQ1RSTAkJMHgyNWEKKyNkZWZpbmUgSU5URUxfTVNJQ19JSEZMVk9MQ1RSTAkJMHgyNWIKKyNkZWZpbmUgSU5URUxfTVNJQ19JSEZSVk9MQ1RSTAkJMHgyNWMKKyNkZWZpbmUgSU5URUxfTVNJQ19EUklWRVJFTgkJMHgyNWQKKyNkZWZpbmUgSU5URUxfTVNJQ19MSU5FT1VUQ1RSTAkJMHgyNWUKKyNkZWZpbmUgSU5URUxfTVNJQ19WSUIxQ1RSTDEJCTB4MjVmCisjZGVmaW5lIElOVEVMX01TSUNfVklCMUNUUkwyCQkweDI2MAorI2RlZmluZSBJTlRFTF9NU0lDX1ZJQjFDVFJMMwkJMHgyNjEKKyNkZWZpbmUgSU5URUxfTVNJQ19WSUIxU1BJUENNXzEJCTB4MjYyCisjZGVmaW5lIElOVEVMX01TSUNfVklCMVNQSVBDTV8yCQkweDI2MworI2RlZmluZSBJTlRFTF9NU0lDX1ZJQjFDVFJMNQkJMHgyNjQKKyNkZWZpbmUgSU5URUxfTVNJQ19WSUIyQ1RSTDEJCTB4MjY1CisjZGVmaW5lIElOVEVMX01TSUNfVklCMkNUUkwyCQkweDI2NgorI2RlZmluZSBJTlRFTF9NU0lDX1ZJQjJDVFJMMwkJMHgyNjcKKyNkZWZpbmUgSU5URUxfTVNJQ19WSUIyU1BJUENNXzEJCTB4MjY4CisjZGVmaW5lIElOVEVMX01TSUNfVklCMlNQSVBDTV8yCQkweDI2OQorI2RlZmluZSBJTlRFTF9NU0lDX1ZJQjJDVFJMNQkJMHgyNmEKKyNkZWZpbmUgSU5URUxfTVNJQ19CVE5DVFJMMQkJMHgyNmIKKyNkZWZpbmUgSU5URUxfTVNJQ19CVE5DVFJMMgkJMHgyNmMKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00xVFhTTE9UMDEJCTB4MjZkCisjZGVmaW5lIElOVEVMX01TSUNfUENNMVRYU0xPVDIzCQkweDI2ZQorI2RlZmluZSBJTlRFTF9NU0lDX1BDTTFUWFNMT1Q0NQkJMHgyNmYKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00xUlhTTE9UMDEyMwkweDI3MAorI2RlZmluZSBJTlRFTF9NU0lDX1BDTTFSWFNMT1QwNDUJMHgyNzEKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00yVFhTTE9UMDEJCTB4MjcyCisjZGVmaW5lIElOVEVMX01TSUNfUENNMlRYU0xPVDIzCQkweDI3MworI2RlZmluZSBJTlRFTF9NU0lDX1BDTTJUWFNMT1Q0NQkJMHgyNzQKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00yUlhTTE9UMDEJCTB4Mjc1CisjZGVmaW5lIElOVEVMX01TSUNfUENNMlJYU0xPVDIzCQkweDI3NgorI2RlZmluZSBJTlRFTF9NU0lDX1BDTTJSWFNMT1Q0NQkJMHgyNzcKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00xQ1RSTDEJCTB4Mjc4CisjZGVmaW5lIElOVEVMX01TSUNfUENNMUNUUkwyCQkweDI3OQorI2RlZmluZSBJTlRFTF9NU0lDX1BDTTFDVFJMMwkJMHgyN2EKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00yQ1RSTDEJCTB4MjdiCisjZGVmaW5lIElOVEVMX01TSUNfUENNMkNUUkwyCQkweDI3YworCisvKiBIRE1JICovCisjZGVmaW5lIElOVEVMX01TSUNfSERNSVBVRU4JCTB4MjgwCisjZGVmaW5lIElOVEVMX01TSUNfSERNSVNUQVRVUwkJMHgyODEJLyogUk8gKi8KKworLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIE1TSUMgaW50ZXJydXB0IHRyZWUgaW4gU1JBTSAqLworI2RlZmluZSBJTlRFTF9NU0lDX0lSUV9QSFlTX0JBU0UJMHhmZmZmN2ZjMAorCisvKioKKyAqIHN0cnVjdCBpbnRlbF9tc2ljX2dwaW9fcGRhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgTVNJQyBHUElPIGRyaXZlcgorICogQGdwaW9fYmFzZTogYmFzZSBudW1iZXIgZm9yIHRoZSBHUElPcworICovCitzdHJ1Y3QgaW50ZWxfbXNpY19ncGlvX3BkYXRhIHsKKwl1bnNpZ25lZAlncGlvX2Jhc2U7Cit9OworCisvKioKKyAqIHN0cnVjdCBpbnRlbF9tc2ljX29jZF9wZGF0YSAtIHBsYXRmb3JtIGRhdGEgZm9yIHRoZSBNU0lDIE9DRCBkcml2ZXIKKyAqIEBncGlvOiBHUElPIG51bWJlciB1c2VkIGZvciBPQ0QgaW50ZXJydXB0cworICoKKyAqIFRoZSBNU0lDIE1GRCBkcml2ZXIgY29udmVydHMgQGdwaW8gaW50byBhbiBJUlEgbnVtYmVyIGFuZCBwYXNzZXMgaXQgdG8KKyAqIHRoZSBPQ0QgZHJpdmVyIGFzICVJT1JFU09VUkNFX0lSUS4KKyAqLworc3RydWN0IGludGVsX21zaWNfb2NkX3BkYXRhIHsKKwl1bnNpZ25lZAlncGlvOworfTsKKworLyogTVNJQyBlbWJlZGRlZCBibG9ja3MgKHN1YmRldmljZXMpICovCitlbnVtIGludGVsX21zaWNfYmxvY2sgeworCUlOVEVMX01TSUNfQkxPQ0tfVE9VQ0gsCisJSU5URUxfTVNJQ19CTE9DS19BREMsCisJSU5URUxfTVNJQ19CTE9DS19CQVRURVJZLAorCUlOVEVMX01TSUNfQkxPQ0tfR1BJTywKKwlJTlRFTF9NU0lDX0JMT0NLX0FVRElPLAorCUlOVEVMX01TSUNfQkxPQ0tfSERNSSwKKwlJTlRFTF9NU0lDX0JMT0NLX1RIRVJNQUwsCisJSU5URUxfTVNJQ19CTE9DS19QT1dFUl9CVE4sCisJSU5URUxfTVNJQ19CTE9DS19PQ0QsCisKKwlJTlRFTF9NU0lDX0JMT0NLX0xBU1QsCit9OworCisvKioKKyAqIHN0cnVjdCBpbnRlbF9tc2ljX3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgTVNJQyBkcml2ZXIKKyAqIEBpcnE6IGFycmF5IG9mIGludGVycnVwdCBudW1iZXJzLCBvbmUgcGVyIGRldmljZS4gSWYgQGlycSBpcyBzZXQgdG8gJTAKKyAqCSBmb3IgYSBnaXZlbiBibG9jaywgdGhlIGNvcnJlc3BvbmRpbmcgcGxhdGZvcm0gZGV2aWNlIGlzIG5vdAorICoJIGNyZWF0ZWQuIEZvciBkZXZpY2VzIHdoaWNoIGRvbid0IGhhdmUgYW4gaW50ZXJydXB0LCB1c2UgJTB4ZmYKKyAqCSAodGhpcyBpcyBzYW1lIGFzIGluIFNGSSBzcGVjKS4KKyAqIEBncGlvOiBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgTVNJQyBHUElPIGRyaXZlcgorICogQG9jZDogcGxhdGZvcm0gZGF0YSBmb3IgdGhlIE1TSUMgT0NEIGRyaXZlcgorICoKKyAqIE9uY2UgdGhlIE1TSUMgZHJpdmVyIGlzIGluaXRpYWxpemVkLCB0aGUgcmVnaXN0ZXIgaW50ZXJmYWNlIGlzIHJlYWR5IHRvCisgKiB1c2UuIEFsbCB0aGUgcGxhdGZvcm0gZGV2aWNlcyBmb3Igc3ViZGV2aWNlcyBhcmUgY3JlYXRlZCBhZnRlciB0aGUKKyAqIHJlZ2lzdGVyIGludGVyZmFjZSBpcyByZWFkeSBzbyB0aGF0IHdlIGNhbiBndWFyYW50ZWUgaXRzIGF2YWlsYWJpbGl0eSB0bworICogdGhlIHN1YmRldmljZSBkcml2ZXJzLgorICoKKyAqIEludGVycnVwdCBudW1iZXJzIGFyZSBwYXNzZWQgdG8gdGhlIHN1YmRldmljZXMgdmlhICVJT1JFU09VUkNFX0lSUQorICogcmVzb3VyY2VzIG9mIHRoZSBjcmVhdGVkIHBsYXRmb3JtIGRldmljZS4KKyAqLworc3RydWN0IGludGVsX21zaWNfcGxhdGZvcm1fZGF0YSB7CisJaW50CQkJCWlycVtJTlRFTF9NU0lDX0JMT0NLX0xBU1RdOworCXN0cnVjdCBpbnRlbF9tc2ljX2dwaW9fcGRhdGEJKmdwaW87CisJc3RydWN0IGludGVsX21zaWNfb2NkX3BkYXRhCSpvY2Q7Cit9OworCitzdHJ1Y3QgaW50ZWxfbXNpYzsKKworZXh0ZXJuIGludCBpbnRlbF9tc2ljX3JlZ19yZWFkKHVuc2lnbmVkIHNob3J0IHJlZywgdTggKnZhbCk7CitleHRlcm4gaW50IGludGVsX21zaWNfcmVnX3dyaXRlKHVuc2lnbmVkIHNob3J0IHJlZywgdTggdmFsKTsKK2V4dGVybiBpbnQgaW50ZWxfbXNpY19yZWdfdXBkYXRlKHVuc2lnbmVkIHNob3J0IHJlZywgdTggdmFsLCB1OCBtYXNrKTsKK2V4dGVybiBpbnQgaW50ZWxfbXNpY19idWxrX3JlYWQodW5zaWduZWQgc2hvcnQgKnJlZywgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK2V4dGVybiBpbnQgaW50ZWxfbXNpY19idWxrX3dyaXRlKHVuc2lnbmVkIHNob3J0ICpyZWcsIHU4ICpidWYsIHNpemVfdCBjb3VudCk7CisKKy8qCisgKiBwZGV2X3RvX2ludGVsX21zaWMgLSBnZXRzIGFuIE1TSUMgaW5zdGFuY2UgZnJvbSB0aGUgcGxhdGZvcm0gZGV2aWNlCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBUaGUgY2xpZW50IGRyaXZlcnMgbmVlZCB0byBoYXZlIHBvaW50ZXIgdG8gdGhlIE1TSUMgaW5zdGFuY2UgaWYgdGhleQorICogd2FudCB0byBjYWxsIGludGVsX21zaWNfaXJxX3JlYWQoKS4gVGhpcyBtYWNybyBjYW4gYmUgdXNlZCBmb3IKKyAqIGNvbnZlbmllbmNlIHRvIGdldCB0aGUgTVNJQyBwb2ludGVyIGZyb20gQHBkZXYgd2hlcmUgbmVlZGVkLiBUaGlzIGlzCisgKiBfb25seV8gdmFsaWQgZm9yIGRldmljZXMgd2hpY2ggYXJlIG1hbmFnZWQgYnkgdGhlIE1TSUMuCisgKi8KKyNkZWZpbmUgcGRldl90b19pbnRlbF9tc2ljKHBkZXYpCShkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCkpCisKK2V4dGVybiBpbnQgaW50ZWxfbXNpY19pcnFfcmVhZChzdHJ1Y3QgaW50ZWxfbXNpYyAqbXNpYywgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJICAgICAgIHU4ICp2YWwpOworCisjZW5kaWYgLyogX19MSU5VWF9NRkRfSU5URUxfTVNJQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTctcHJpdmF0ZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny1wcml2YXRlLmgKaW5kZXggNWZmMjQwMC4uM2Y0ZGViNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny1wcml2YXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny1wcml2YXRlLmgKQEAgLTMyNiw3ICszMjYsNiBAQAogCWludCBpcnE7CiAJaW50IG9ubzsKIAlpbnQgaXJxX2Jhc2U7Ci0JYm9vbCB3YWtldXA7CiAJc3RydWN0IG11dGV4IGlycWxvY2s7CiAJaW50IGlycV9tYXNrc19jdXJbTUFYODk5N19JUlFfR1JPVVBfTlJdOwogCWludCBpcnFfbWFza3NfY2FjaGVbTUFYODk5N19JUlFfR1JPVVBfTlJdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvbWMxMzc4My5oIGIvaW5jbHVkZS9saW51eC9tZmQvbWMxMzc4My5oCmluZGV4IDdkMGYzZDYuLmE4ZWVkYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL21jMTM3ODMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9tYzEzNzgzLmgKQEAgLTEyLDExNyArMTIsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbWZkL21jMTN4eHguaD4KIAotc3RydWN0IG1jMTM3ODM7Ci0KLXN0cnVjdCBtYzEzeHh4ICptYzEzNzgzX3RvX21jMTN4eHgoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWMxMzc4M19sb2NrKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzKQotewotCW1jMTN4eHhfbG9jayhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWMxMzc4M191bmxvY2soc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMpCi17Ci0JbWMxM3h4eF91bmxvY2sobWMxMzc4M190b19tYzEzeHh4KG1jMTM3ODMpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWMxMzc4M19yZWdfcmVhZChzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywKLQkJdW5zaWduZWQgaW50IG9mZnNldCwgdTMyICp2YWwpCi17Ci0JcmV0dXJuIG1jMTN4eHhfcmVnX3JlYWQobWMxMzc4M190b19tYzEzeHh4KG1jMTM3ODMpLCBvZmZzZXQsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1jMTM3ODNfcmVnX3dyaXRlKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLAotCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1MzIgdmFsKQotewotCXJldHVybiBtYzEzeHh4X3JlZ193cml0ZShtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIG9mZnNldCwgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWMxMzc4M19yZWdfcm13KHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLAotCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1MzIgbWFzaywgdTMyIHZhbCkKLXsKLQlyZXR1cm4gbWMxM3h4eF9yZWdfcm13KG1jMTM3ODNfdG9fbWMxM3h4eChtYzEzNzgzKSwgb2Zmc2V0LCBtYXNrLCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtYzEzNzgzX2dldF9mbGFncyhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MykKLXsKLQlyZXR1cm4gbWMxM3h4eF9nZXRfZmxhZ3MobWMxMzc4M190b19tYzEzeHh4KG1jMTM3ODMpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWMxMzc4M19pcnFfcmVxdWVzdChzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSwKLQkJaXJxX2hhbmRsZXJfdCBoYW5kbGVyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkZXYpCi17Ci0JcmV0dXJuIG1jMTN4eHhfaXJxX3JlcXVlc3QobWMxMzc4M190b19tYzEzeHh4KG1jMTM3ODMpLCBpcnEsCi0JCQloYW5kbGVyLCBuYW1lLCBkZXYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtYzEzNzgzX2lycV9yZXF1ZXN0X25vdW5tYXNrKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgaXJxLAotCQlpcnFfaGFuZGxlcl90IGhhbmRsZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRldikKLXsKLQlyZXR1cm4gbWMxM3h4eF9pcnFfcmVxdWVzdF9ub3VubWFzayhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIGlycSwKLQkJCWhhbmRsZXIsIG5hbWUsIGRldik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1jMTM3ODNfaXJxX2ZyZWUoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEsIHZvaWQgKmRldikKLXsKLQlyZXR1cm4gbWMxM3h4eF9pcnFfZnJlZShtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIGlycSwgZGV2KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWMxMzc4M19pcnFfbWFzayhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSkKLXsKLQlyZXR1cm4gbWMxM3h4eF9pcnFfbWFzayhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIGlycSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1jMTM3ODNfaXJxX3VubWFzayhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSkKLXsKLQlyZXR1cm4gbWMxM3h4eF9pcnFfdW5tYXNrKG1jMTM3ODNfdG9fbWMxM3h4eChtYzEzNzgzKSwgaXJxKTsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IG1jMTM3ODNfaXJxX3N0YXR1cyhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSwKLQkJaW50ICplbmFibGVkLCBpbnQgKnBlbmRpbmcpCi17Ci0JcmV0dXJuIG1jMTN4eHhfaXJxX3N0YXR1cyhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksCi0JCQlpcnEsIGVuYWJsZWQsIHBlbmRpbmcpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtYzEzNzgzX2lycV9hY2soc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEpCi17Ci0JcmV0dXJuIG1jMTN4eHhfaXJxX2FjayhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIGlycSk7Ci19Ci0KLSNkZWZpbmUgTUMxMzc4M19BREMwCQk0MwotI2RlZmluZSBNQzEzNzgzX0FEQzBfQURSRUZFTgkJKDEgPDwgMTApCi0jZGVmaW5lIE1DMTM3ODNfQURDMF9BRFJFRk1PREUJCSgxIDw8IDExKQotI2RlZmluZSBNQzEzNzgzX0FEQzBfVFNNT0QwCQkoMSA8PCAxMikKLSNkZWZpbmUgTUMxMzc4M19BREMwX1RTTU9EMQkJKDEgPDwgMTMpCi0jZGVmaW5lIE1DMTM3ODNfQURDMF9UU01PRDIJCSgxIDw8IDE0KQotI2RlZmluZSBNQzEzNzgzX0FEQzBfQURJTkMxCQkoMSA8PCAxNikKLSNkZWZpbmUgTUMxMzc4M19BREMwX0FESU5DMgkJKDEgPDwgMTcpCi0KLSNkZWZpbmUgTUMxMzc4M19BREMwX1RTTU9EX01BU0sJCShNQzEzNzgzX0FEQzBfVFNNT0QwIHwgXAotCQkJCQlNQzEzNzgzX0FEQzBfVFNNT0QxIHwgXAotCQkJCQlNQzEzNzgzX0FEQzBfVFNNT0QyKQotCi0jZGVmaW5lIG1jMTM3ODNfcmVndWxhdG9yX2luaXRfZGF0YSBtYzEzeHh4X3JlZ3VsYXRvcl9pbml0X2RhdGEKLSNkZWZpbmUgbWMxMzc4M19yZWd1bGF0b3JfcGxhdGZvcm1fZGF0YSBtYzEzeHh4X3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhCi0jZGVmaW5lIG1jMTM3ODNfbGVkX3BsYXRmb3JtX2RhdGEgbWMxM3h4eF9sZWRfcGxhdGZvcm1fZGF0YQotI2RlZmluZSBtYzEzNzgzX2xlZHNfcGxhdGZvcm1fZGF0YSBtYzEzeHh4X2xlZHNfcGxhdGZvcm1fZGF0YQotCi0jZGVmaW5lIG1jMTM3ODNfcGxhdGZvcm1fZGF0YSBtYzEzeHh4X3BsYXRmb3JtX2RhdGEKLSNkZWZpbmUgTUMxMzc4M19VU0VfVE9VQ0hTQ1JFRU4JTUMxM1hYWF9VU0VfVE9VQ0hTQ1JFRU4KLSNkZWZpbmUgTUMxMzc4M19VU0VfQ09ERUMJTUMxM1hYWF9VU0VfQ09ERUMKLSNkZWZpbmUgTUMxMzc4M19VU0VfQURDCQlNQzEzWFhYX1VTRV9BREMKLSNkZWZpbmUgTUMxMzc4M19VU0VfUlRDCQlNQzEzWFhYX1VTRV9SVEMKLSNkZWZpbmUgTUMxMzc4M19VU0VfUkVHVUxBVE9SCU1DMTNYWFhfVVNFX1JFR1VMQVRPUgotI2RlZmluZSBNQzEzNzgzX1VTRV9MRUQJCU1DMTNYWFhfVVNFX0xFRAotCi0jZGVmaW5lIE1DMTM3ODNfQURDX01PREVfVFMJCTEKLSNkZWZpbmUgTUMxMzc4M19BRENfTU9ERV9TSU5HTEVfQ0hBTgkyCi0jZGVmaW5lIE1DMTM3ODNfQURDX01PREVfTVVMVF9DSEFOCTMKLQotaW50IG1jMTM3ODNfYWRjX2RvX2NvbnZlcnNpb24oc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIHVuc2lnbmVkIGludCBtb2RlLAotCQl1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50ICpzYW1wbGUpOwotCi0KICNkZWZpbmUJTUMxMzc4M19SRUdfU1cxQQkJMAogI2RlZmluZQlNQzEzNzgzX1JFR19TVzFCCQkxCiAjZGVmaW5lCU1DMTM3ODNfUkVHX1NXMkEJCTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21jMTN4eHguaCBiL2luY2x1ZGUvbGludXgvbWZkL21jMTN4eHguaAppbmRleCBjMDY0YmVhLi4zODE2YzJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9tYzEzeHh4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWMxM3h4eC5oCkBAIC0zNyw2ICszNyw5IEBACiAKIGludCBtYzEzeHh4X2dldF9mbGFncyhzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eCk7CiAKK2ludCBtYzEzeHh4X2FkY19kb19jb252ZXJzaW9uKHN0cnVjdCBtYzEzeHh4ICptYzEzeHh4LAorCQl1bnNpZ25lZCBpbnQgbW9kZSwgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCAqc2FtcGxlKTsKKwogI2RlZmluZSBNQzEzWFhYX0lSUV9BRENET05FCTAKICNkZWZpbmUgTUMxM1hYWF9JUlFfQURDQklTRE9ORQkxCiAjZGVmaW5lIE1DMTNYWFhfSVJRX1RTCQkyCkBAIC0xMzcsMTcgKzE0MCw0OCBAQAogCWNoYXIgdGMzX3BlcmlvZDsKIH07CiAKK3N0cnVjdCBtYzEzeHh4X2J1dHRvbnNfcGxhdGZvcm1fZGF0YSB7CisjZGVmaW5lIE1DMTM3ODNfQlVUVE9OX0RCTkNfME1TCQkwCisjZGVmaW5lIE1DMTM3ODNfQlVUVE9OX0RCTkNfMzBNUwkxCisjZGVmaW5lIE1DMTM3ODNfQlVUVE9OX0RCTkNfMTUwTVMJMgorI2RlZmluZSBNQzEzNzgzX0JVVFRPTl9EQk5DXzc1ME1TCTMKKyNkZWZpbmUgTUMxMzc4M19CVVRUT05fRU5BQkxFCQkoMSA8PCAyKQorI2RlZmluZSBNQzEzNzgzX0JVVFRPTl9QT0xfSU5WRVJUCSgxIDw8IDMpCisjZGVmaW5lIE1DMTM3ODNfQlVUVE9OX1JFU0VUX0VOCQkoMSA8PCA0KQorCWludCBiMW9uX2ZsYWdzOworCXVuc2lnbmVkIHNob3J0IGIxb25fa2V5OworCWludCBiMm9uX2ZsYWdzOworCXVuc2lnbmVkIHNob3J0IGIyb25fa2V5OworCWludCBiM29uX2ZsYWdzOworCXVuc2lnbmVkIHNob3J0IGIzb25fa2V5OworfTsKKwogc3RydWN0IG1jMTN4eHhfcGxhdGZvcm1fZGF0YSB7CiAjZGVmaW5lIE1DMTNYWFhfVVNFX1RPVUNIU0NSRUVOICgxIDw8IDApCiAjZGVmaW5lIE1DMTNYWFhfVVNFX0NPREVDCSgxIDw8IDEpCiAjZGVmaW5lIE1DMTNYWFhfVVNFX0FEQwkJKDEgPDwgMikKICNkZWZpbmUgTUMxM1hYWF9VU0VfUlRDCQkoMSA8PCAzKQotI2RlZmluZSBNQzEzWFhYX1VTRV9SRUdVTEFUT1IJKDEgPDwgNCkKLSNkZWZpbmUgTUMxM1hYWF9VU0VfTEVECQkoMSA8PCA1KQogCXVuc2lnbmVkIGludCBmbGFnczsKIAogCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhIHJlZ3VsYXRvcnM7CiAJc3RydWN0IG1jMTN4eHhfbGVkc19wbGF0Zm9ybV9kYXRhICpsZWRzOworCXN0cnVjdCBtYzEzeHh4X2J1dHRvbnNfcGxhdGZvcm1fZGF0YSAqYnV0dG9uczsKIH07CiAKKyNkZWZpbmUgTUMxM1hYWF9BRENfTU9ERV9UUwkJMQorI2RlZmluZSBNQzEzWFhYX0FEQ19NT0RFX1NJTkdMRV9DSEFOCTIKKyNkZWZpbmUgTUMxM1hYWF9BRENfTU9ERV9NVUxUX0NIQU4JMworCisjZGVmaW5lIE1DMTNYWFhfQURDMAkJNDMKKyNkZWZpbmUgTUMxM1hYWF9BREMwX0FEUkVGRU4JCSgxIDw8IDEwKQorI2RlZmluZSBNQzEzWFhYX0FEQzBfVFNNT0QwCQkoMSA8PCAxMikKKyNkZWZpbmUgTUMxM1hYWF9BREMwX1RTTU9EMQkJKDEgPDwgMTMpCisjZGVmaW5lIE1DMTNYWFhfQURDMF9UU01PRDIJCSgxIDw8IDE0KQorI2RlZmluZSBNQzEzWFhYX0FEQzBfQURJTkMxCQkoMSA8PCAxNikKKyNkZWZpbmUgTUMxM1hYWF9BREMwX0FESU5DMgkJKDEgPDwgMTcpCisKKyNkZWZpbmUgTUMxM1hYWF9BREMwX1RTTU9EX01BU0sJCShNQzEzWFhYX0FEQzBfVFNNT0QwIHwgXAorCQkJCQlNQzEzWFhYX0FEQzBfVFNNT0QxIHwgXAorCQkJCQlNQzEzWFhYX0FEQzBfVFNNT0QyKQorCiAjZW5kaWYgLyogaWZuZGVmIF9fTElOVVhfTUZEX01DMTNYWFhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvY29yZS5oCmluZGV4IDUwZDRhMDQuLmE4MDg0MDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3BjZjUwNjMzL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvcGNmNTA2MzMvYmFja2xpZ2h0Lmg+CiAKIHN0cnVjdCBwY2Y1MDYzMzsKK3N0cnVjdCByZWdtYXA7CiAKICNkZWZpbmUgUENGNTA2MzNfTlVNX1JFR1VMQVRPUlMJMTEKIApAQCAtMTM0LDcgKzEzNSw3IEBACiAKIHN0cnVjdCBwY2Y1MDYzMyB7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAogCXN0cnVjdCBwY2Y1MDYzM19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlpbnQgaXJxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU4NnguaCBiL2luY2x1ZGUvbGludXgvbWZkL3RwczY1ODZ4LmgKaW5kZXggYjZiYWIxYi4uYjE5MTc2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU4NnguaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTg2eC5oCkBAIC0xLDYgKzEsMTggQEAKICNpZm5kZWYgX19MSU5VWF9NRkRfVFBTNjU4NlhfSAogI2RlZmluZSBfX0xJTlVYX01GRF9UUFM2NTg2WF9ICiAKKyNkZWZpbmUgVFBTNjU4NlhfU0xFV19SQVRFX0lOU1RBTlRMWQkweDAwCisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV8xMTBVVgkweDAxCisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV8yMjBVVgkweDAyCisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV80NDBVVgkweDAzCisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV84ODBVVgkweDA0CisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV8xNzYwVVYJMHgwNQorI2RlZmluZSBUUFM2NTg2WF9TTEVXX1JBVEVfMzUyMFVWCTB4MDYKKyNkZWZpbmUgVFBTNjU4NlhfU0xFV19SQVRFXzcwNDBVVgkweDA3CisKKyNkZWZpbmUgVFBTNjU4NlhfU0xFV19SQVRFX1NFVAkJMHgwOAorI2RlZmluZSBUUFM2NTg2WF9TTEVXX1JBVEVfTUFTSyAgICAgICAgIDB4MDcKKwogZW51bSB7CiAJVFBTNjU4NlhfSURfU01fMCwKIAlUUFM2NTg2WF9JRF9TTV8xLApAQCAtNDgsNiArNjAsMTAgQEAKIAlUUFM2NTg2WF9JTlRfUlRDX0FMTTIsCiB9OwogCitzdHJ1Y3QgdHBzNjU4Nnhfc2V0dGluZ3MgeworCWludCBzbGV3X3JhdGU7Cit9OworCiBzdHJ1Y3QgdHBzNjU4Nnhfc3ViZGV2X2luZm8gewogCWludAkJaWQ7CiAJY29uc3QgY2hhcgkqbmFtZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3R3bDYwNDAuaCBiL2luY2x1ZGUvbGludXgvbWZkL3R3bDYwNDAuaAppbmRleCA0YzgwNmY2Li4yNDYzYzI2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdHdsNjA0MC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3R3bDYwNDAuaApAQCAtNjgsMTEgKzY4LDYgQEAKICNkZWZpbmUgVFdMNjA0MF9SRUdfQUNDQ1RMCQkweDJECiAjZGVmaW5lIFRXTDYwNDBfUkVHX1NUQVRVUwkJMHgyRQogCi0jZGVmaW5lIFRXTDYwNDBfQ0FDSEVSRUdOVU0JCShUV0w2MDQwX1JFR19TVEFUVVMgKyAxKQotCi0jZGVmaW5lIFRXTDYwNDBfVklPUkVHTlVNCQkxOAotI2RlZmluZSBUV0w2MDQwX1ZERFJFR05VTQkJMjEKLQogLyogSU5USUQgKDB4MDMpIGZpZWxkcyAqLwogCiAjZGVmaW5lIFRXTDYwNDBfVEhJTlQJCQkweDAxCkBAIC0xMjUsMzQgKzEyMCwyNCBAQAogI2RlZmluZSBUV0w2MDQwX0xQTExGSU4JCQkweDA4CiAjZGVmaW5lIFRXTDYwNDBfSFBMTFNFTAkJCTB4MTAKIAotLyogSFNMQ1RMICgweDEwKSBmaWVsZHMgKi8KKy8qIEhTTENUTC9SICgweDEwLzB4MTEpIGZpZWxkcyAqLwogCi0jZGVmaW5lIFRXTDYwNDBfSFNEQUNNT0RFTAkJMHgwMgotI2RlZmluZSBUV0w2MDQwX0hTRFJWTU9ERUwJCTB4MDgKKyNkZWZpbmUgVFdMNjA0MF9IU0RBQ0VOQQkJKDEgPDwgMCkKKyNkZWZpbmUgVFdMNjA0MF9IU0RBQ01PREUJCSgxIDw8IDEpCisjZGVmaW5lIFRXTDYwNDBfSFNEUlZNT0RFCQkoMSA8PCAzKQogCi0vKiBIU1JDVEwgKDB4MTEpIGZpZWxkcyAqLworLyogVklCQ1RMTC9SICgweDE4LzB4MUEpIGZpZWxkcyAqLwogCi0jZGVmaW5lIFRXTDYwNDBfSFNEQUNNT0RFUgkJMHgwMgotI2RlZmluZSBUV0w2MDQwX0hTRFJWTU9ERVIJCTB4MDgKKyNkZWZpbmUgVFdMNjA0MF9WSUJFTkEJCQkoMSA8PCAwKQorI2RlZmluZSBUV0w2MDQwX1ZJQlNFTAkJCSgxIDw8IDEpCisjZGVmaW5lIFRXTDYwNDBfVklCQ1RSTAkJCSgxIDw8IDIpCisjZGVmaW5lIFRXTDYwNDBfVklCQ1RSTF9QCQkoMSA8PCAzKQorI2RlZmluZSBUV0w2MDQwX1ZJQkNUUkxfTgkJKDEgPDwgNCkKIAotLyogVklCQ1RMTCAoMHgxOCkgZmllbGRzICovCi0KLSNkZWZpbmUgVFdMNjA0MF9WSUJFTkFMCQkJMHgwMQotI2RlZmluZSBUV0w2MDQwX1ZJQkNUUkxMCQkweDA0Ci0jZGVmaW5lIFRXTDYwNDBfVklCQ1RSTExQCQkweDA4Ci0jZGVmaW5lIFRXTDYwNDBfVklCQ1RSTExOCQkweDEwCi0KLS8qIFZJQkRBVEwgKDB4MTkpIGZpZWxkcyAqLworLyogVklCREFUTC9SICgweDE5LzB4MUIpIGZpZWxkcyAqLwogCiAjZGVmaW5lIFRXTDYwNDBfVklCREFUX01BWAkJMHg2NAogCi0vKiBWSUJDVExSICgweDFBKSBmaWVsZHMgKi8KLQotI2RlZmluZSBUV0w2MDQwX1ZJQkVOQVIJCQkweDAxCi0jZGVmaW5lIFRXTDYwNDBfVklCQ1RSTFIJCTB4MDQKLSNkZWZpbmUgVFdMNjA0MF9WSUJDVFJMUlAJCTB4MDgKLSNkZWZpbmUgVFdMNjA0MF9WSUJDVFJMUk4JCTB4MTAKLQogLyogR1BPQ1RMICgweDFFKSBmaWVsZHMgKi8KIAogI2RlZmluZSBUV0w2MDQwX0dQTzEJCQkweDAxCkBAIC0yMDAsNiArMTg1LDcgQEAKIAlpbnQgYXVkcHdyb247CiAJaW50IHBvd2VyX2NvdW50OwogCWludCByZXY7CisJdTggdmlicmFfY3RybF9jYWNoZVsyXTsKIAogCWludCBwbGw7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKQEAgLTIyNCw1ICsyMTAsMTMgQEAKIHVuc2lnbmVkIGludCB0d2w2MDQwX2dldF9zeXNjbGsoc3RydWN0IHR3bDYwNDAgKnR3bDYwNDApOwogaW50IHR3bDYwNDBfaXJxX2luaXQoc3RydWN0IHR3bDYwNDAgKnR3bDYwNDApOwogdm9pZCB0d2w2MDQwX2lycV9leGl0KHN0cnVjdCB0d2w2MDQwICp0d2w2MDQwKTsKKy8qIEdldCB0aGUgY29tYmluZWQgc3RhdHVzIG9mIHRoZSB2aWJyYSBjb250cm9sIHJlZ2lzdGVyICovCitpbnQgdHdsNjA0MF9nZXRfdmlicmFscl9zdGF0dXMoc3RydWN0IHR3bDYwNDAgKnR3bDYwNDApOworCitzdGF0aWMgaW5saW5lIGludCB0d2w2MDQwX2dldF9yZXZpZChzdHJ1Y3QgdHdsNjA0MCAqdHdsNjA0MCkKK3sKKwlyZXR1cm4gdHdsNjA0MC0+cmV2OworfQorCiAKICNlbmRpZiAgLyogRW5kIG9mIF9fVFdMNjA0MF9DT0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvY29yZS5oCmluZGV4IGVkOGZlMGQuLjRiMTIxMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L2NvcmUuaApAQCAtMzgyLDYgKzM4Miw3IEBACiAKIAkvKiBVc2VkIGJ5IHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBjb2RlIHRvIHBvc3Qgd3JpdGVzICovCiAJaW50IGdwaW9fdXBkYXRlW1dNODMxWF9OVU1fR1BJT19SRUdTXTsKKwlib29sIGdwaW9fbGV2ZWxbV004MzFYX05VTV9HUElPX1JFR1NdOwogCiAJc3RydWN0IG11dGV4IGF1eGFkY19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgYXV4YWRjX3BlbmRpbmc7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTg5OTQvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L2NvcmUuaAppbmRleCA0NWRmNDUwLi5mNDRiZGI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTg5OTQvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9jb3JlLmgKQEAgLTIwLDYgKzIwLDcgQEAKIGVudW0gd204OTk0X3R5cGUgewogCVdNODk5NCA9IDAsCiAJV004OTU4ID0gMSwKKwlXTTE4MTEgPSAyLAogfTsKIAogc3RydWN0IHJlZ3VsYXRvcl9kZXY7CkBAIC01OCw2ICs1OSw4IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAorCWJvb2wgbGRvX2VuYV9hbHdheXNfZHJpdmVuOworCiAJaW50IGdwaW9fYmFzZTsKIAlpbnQgaXJxX2Jhc2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9wZGF0YS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3BkYXRhLmgKaW5kZXggOTdjZjRmMi4uZWEzMmYzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3BkYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3BkYXRhLmgKQEAgLTE2Nyw2ICsxNjcsMTMgQEAKIAogCS8qIFdNODk1OCBtaWNyb3Bob25lIGJpYXMgY29uZmlndXJhdGlvbiAqLwogCWludCBtaWNiaWFzWzJdOworCisJLyogRGlzYWJsZSB0aGUgaW50ZXJuYWwgcHVsbCBkb3ducyBvbiB0aGUgTERPcyBpZiB0aGV5IGFyZQorCSAqIGFsd2F5cyBkcml2ZW4gKGVnLCBjb25uZWN0ZWQgdG8gYW4gYWx3YXlzIG9uIHN1cHBseSBvcgorCSAqIEdQSU8gdGhhdCBhbHdheXMgZHJpdmVzIGFuIG91dHB1dC4gIElmIHRoZXkgZmxvYXQgcG93ZXIKKwkgKiBjb25zdW1wdGlvbiB3aWxsIHJpc2UuCisJICovCisJYm9vbCBsZG9fZW5hX2Fsd2F5c19kcml2ZW47CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaAppbmRleCBmM2VlODQyLi44M2E5Y2FlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTg5OTQvcmVnaXN0ZXJzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3JlZ2lzdGVycy5oCkBAIC03Miw2ICs3Miw3IEBACiAjZGVmaW5lIFdNODk5NF9EQ19TRVJWT18yICAgICAgICAgICAgICAgICAgICAgICAweDU1CiAjZGVmaW5lIFdNODk5NF9EQ19TRVJWT180ICAgICAgICAgICAgICAgICAgICAgICAweDU3CiAjZGVmaW5lIFdNODk5NF9EQ19TRVJWT19SRUFEQkFDSyAgICAgICAgICAgICAgICAweDU4CisjZGVmaW5lIFdNODk5NF9EQ19TRVJWT180RQkJCTB4NTkKICNkZWZpbmUgV004OTk0X0FOQUxPR1VFX0hQXzEgICAgICAgICAgICAgICAgICAgIDB4NjAKICNkZWZpbmUgV004OTU4X01JQ19ERVRFQ1RfMSAgICAgICAgICAgICAgICAgICAgIDB4RDAKICNkZWZpbmUgV004OTU4X01JQ19ERVRFQ1RfMiAgICAgICAgICAgICAgICAgICAgIDB4RDEKQEAgLTEzMyw2ICsxMzQsOCBAQAogI2RlZmluZSBXTTg5OTRfQUlGMV9EQUMxX0ZJTFRFUlNfMiAgICAgICAgICAgICAgMHg0MjEKICNkZWZpbmUgV004OTk0X0FJRjFfREFDMl9GSUxURVJTXzEgICAgICAgICAgICAgIDB4NDIyCiAjZGVmaW5lIFdNODk5NF9BSUYxX0RBQzJfRklMVEVSU18yICAgICAgICAgICAgICAweDQyMworI2RlZmluZSBXTTg5NThfQUlGMV9EQUMxX05PSVNFX0dBVEUgICAgICAgICAgICAgMHg0MzAKKyNkZWZpbmUgV004OTU4X0FJRjFfREFDMl9OT0lTRV9HQVRFICAgICAgICAgICAgIDB4NDMxCiAjZGVmaW5lIFdNODk5NF9BSUYxX0RSQzFfMSAgICAgICAgICAgICAgICAgICAgICAweDQ0MAogI2RlZmluZSBXTTg5OTRfQUlGMV9EUkMxXzIgICAgICAgICAgICAgICAgICAgICAgMHg0NDEKICNkZWZpbmUgV004OTk0X0FJRjFfRFJDMV8zICAgICAgICAgICAgICAgICAgICAgIDB4NDQyCkBAIC0xOTAsNiArMTkzLDcgQEAKICNkZWZpbmUgV004OTk0X0FJRjJfQURDX0ZJTFRFUlMgICAgICAgICAgICAgICAgIDB4NTEwCiAjZGVmaW5lIFdNODk5NF9BSUYyX0RBQ19GSUxURVJTXzEgICAgICAgICAgICAgICAweDUyMAogI2RlZmluZSBXTTg5OTRfQUlGMl9EQUNfRklMVEVSU18yICAgICAgICAgICAgICAgMHg1MjEKKyNkZWZpbmUgV004OTU4X0FJRjJfREFDX05PSVNFX0dBVEUgICAgICAgICAgICAgIDB4NTMwCiAjZGVmaW5lIFdNODk5NF9BSUYyX0RSQ18xICAgICAgICAgICAgICAgICAgICAgICAweDU0MAogI2RlZmluZSBXTTg5OTRfQUlGMl9EUkNfMiAgICAgICAgICAgICAgICAgICAgICAgMHg1NDEKICNkZWZpbmUgV004OTk0X0FJRjJfRFJDXzMgICAgICAgICAgICAgICAgICAgICAgIDB4NTQyCkBAIC0xOTIxLDYgKzE5MjUsNTkgQEAKICNkZWZpbmUgV004OTk0X0xETzJfRElTQ0hfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9ESVNDSCAqLwogCiAvKgorICogUjYxICgweDNEKSAtIE1JQ0JJQVMxCisgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IxX1JBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTUlDQjFfUkFURSAqLworI2RlZmluZSBXTTg5NThfTUlDQjFfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBNSUNCMV9SQVRFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIE1JQ0IxX1JBVEUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IxX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjFfUkFURSAqLworI2RlZmluZSBXTTg5NThfTUlDQjFfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBNSUNCMV9NT0RFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIE1JQ0IxX01PREUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IxX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNCAgLyogTUlDQjFfTU9ERSAqLworI2RlZmluZSBXTTg5NThfTUlDQjFfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCMV9NT0RFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMEUgIC8qIE1JQ0IxX0xWTCAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX0xWTCAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE1JQ0IxX0xWTCAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9ESVNDSCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9ESVNDSF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9ESVNDSF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9ESVNDSF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX0RJU0NIICovCisKKy8qCisgKiBSNjIgKDB4M0UpIC0gTUlDQklBUzIKKyAqLworI2RlZmluZSBXTTg5NThfTUlDQjJfUkFURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBNSUNCMl9SQVRFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMl9SQVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE1JQ0IyX1JBVEUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTUlDQjJfUkFURSAqLworI2RlZmluZSBXTTg5NThfTUlDQjJfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCMl9SQVRFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIE1JQ0IyX01PREUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX01PREVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTUlDQjJfTU9ERSAqLworI2RlZmluZSBXTTg5NThfTUlDQjJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBNSUNCMl9NT0RFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IyX01PREUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwRSAgLyogTUlDQjJfTFZMIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfTFZMIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTUlDQjJfTFZMIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0RJU0NIICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0RJU0NIX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0RJU0NIX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0RJU0NIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfRElTQ0ggKi8KKworLyoKKyAqIFIyMTAgKDB4RDIpIC0gTWljIERldGVjdCAzCisgKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDdGQyAgLyogTUlDRF9MVkwgLSBbMTA6Ml0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTUlDRF9MVkwgLSBbMTA6Ml0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogTUlDRF9MVkwgLSBbMTA6Ml0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlDRF9WQUxJRCAqLworI2RlZmluZSBXTTg5NThfTUlDRF9WQUxJRF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBNSUNEX1ZBTElEICovCisjZGVmaW5lIFdNODk1OF9NSUNEX1ZBTElEX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RfVkFMSUQgKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfVkFMSURfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDRF9WQUxJRCAqLworI2RlZmluZSBXTTg5NThfTUlDRF9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSUNEX1NUUyAqLworI2RlZmluZSBXTTg5NThfTUlDRF9TVFNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSUNEX1NUUyAqLworI2RlZmluZSBXTTg5NThfTUlDRF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBNSUNEX1NUUyAqLworI2RlZmluZSBXTTg5NThfTUlDRF9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNEX1NUUyAqLworCisvKgogICogUjc2ICgweDRDKSAtIENoYXJnZSBQdW1wICgxKQogICovCiAjZGVmaW5lIFdNODk5NF9DUF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIENQX0VOQSAqLwpAQCAtMjAyNyw2ICsyMDg0LDEwIEBACiAvKgogICogUjk2ICgweDYwKSAtIEFuYWxvZ3VlIEhQICgxKQogICovCisjZGVmaW5lIFdNMTgxMV9IUE9VVDFfQVRUTiAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEhQT1VUMV9BVFROICovCisjZGVmaW5lIFdNMTgxMV9IUE9VVDFfQVRUTl9NQVNLICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEhQT1VUMV9BVFROICovCisjZGVmaW5lIFdNMTgxMV9IUE9VVDFfQVRUTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEhQT1VUMV9BVFROICovCisjZGVmaW5lIFdNMTgxMV9IUE9VVDFfQVRUTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQT1VUMV9BVFROICovCiAjZGVmaW5lIFdNODk5NF9IUE9VVDFMX1JNVl9TSE9SVCAgICAgICAgICAgICAgICAweDAwODAgIC8qIEhQT1VUMUxfUk1WX1NIT1JUICovCiAjZGVmaW5lIFdNODk5NF9IUE9VVDFMX1JNVl9TSE9SVF9NQVNLICAgICAgICAgICAweDAwODAgIC8qIEhQT1VUMUxfUk1WX1NIT1JUICovCiAjZGVmaW5lIFdNODk5NF9IUE9VVDFMX1JNVl9TSE9SVF9TSElGVCAgICAgICAgICAgICAgIDcgIC8qIEhQT1VUMUxfUk1WX1NIT1JUICovCkBAIC0yOTQ5LDYgKzMwMTAsMzQgQEAKICNkZWZpbmUgV004OTk0X0FJRjFEQUMyXzNEX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogQUlGMURBQzJfM0RfRU5BICovCiAKIC8qCisgKiBSMTA3MiAoMHg0MzApIC0gQUlGMSBEQUMxIE5vaXNlIEdhdGUKKyAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfSExEX01BU0sgICAgICAgICAgICAgMHgwMDYwICAvKiBBSUYxREFDMV9OR19ITEQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfSExEX1NISUZUICAgICAgICAgICAgICAgICA1ICAvKiBBSUYxREFDMV9OR19ITEQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfSExEX1dJRFRIICAgICAgICAgICAgICAgICAyICAvKiBBSUYxREFDMV9OR19ITEQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfVEhSX01BU0sgICAgICAgICAgICAgMHgwMDBFICAvKiBBSUYxREFDMV9OR19USFIgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfVEhSX1NISUZUICAgICAgICAgICAgICAgICAxICAvKiBBSUYxREFDMV9OR19USFIgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfVEhSX1dJRFRIICAgICAgICAgICAgICAgICAzICAvKiBBSUYxREFDMV9OR19USFIgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfRU5BICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYxREFDMV9OR19FTkEgKi8KKyNkZWZpbmUgV004OTU4X0FJRjFEQUMxX05HX0VOQV9NQVNLICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMURBQzFfTkdfRU5BICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMV9OR19FTkFfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFEQUMxX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBBSUYxREFDMV9OR19FTkEgKi8KKworLyoKKyAqIFIxMDczICgweDQzMSkgLSBBSUYxIERBQzIgTm9pc2UgR2F0ZQorICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19ITERfTUFTSyAgICAgICAgICAgICAweDAwNjAgIC8qIEFJRjFEQUMyX05HX0hMRCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19ITERfU0hJRlQgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjFEQUMyX05HX0hMRCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19ITERfV0lEVEggICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFEQUMyX05HX0hMRCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19USFJfTUFTSyAgICAgICAgICAgICAweDAwMEUgIC8qIEFJRjFEQUMyX05HX1RIUiAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19USFJfU0hJRlQgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFEQUMyX05HX1RIUiAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19USFJfV0lEVEggICAgICAgICAgICAgICAgIDMgIC8qIEFJRjFEQUMyX05HX1RIUiAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19FTkEgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFEQUMyX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzJfTkdfRU5BX01BU0sgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYxREFDMl9OR19FTkEgKi8KKyNkZWZpbmUgV004OTU4X0FJRjFEQUMyX05HX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogQUlGMURBQzJfTkdfRU5BICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19FTkFfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFEQUMyX05HX0VOQSAqLworCisvKgogICogUjEwODggKDB4NDQwKSAtIEFJRjEgRFJDMSAoMSkKICAqLwogI2RlZmluZSBXTTg5OTRfQUlGMURSQzFfU0lHX0RFVF9STVNfTUFTSyAgICAgICAgMHhGODAwICAvKiBBSUYxRFJDMV9TSUdfREVUX1JNUyAtIFsxNToxMV0gKi8KQEAgLTM1NjAsNiArMzY0OSwyMCBAQAogI2RlZmluZSBXTTg5OTRfQUlGMkRBQ18zRF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYyREFDXzNEX0VOQSAqLwogCiAvKgorICogUjEzMjggKDB4NTMwKSAtIEFJRjIgREFDIE5vaXNlIEdhdGUKKyAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19ITERfTUFTSyAgICAgICAgICAgICAgMHgwMDYwICAvKiBBSUYyREFDX05HX0hMRCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk1OF9BSUYyREFDX05HX0hMRF9TSElGVCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjJEQUNfTkdfSExEIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTU4X0FJRjJEQUNfTkdfSExEX1dJRFRIICAgICAgICAgICAgICAgICAgMiAgLyogQUlGMkRBQ19OR19ITEQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19USFJfTUFTSyAgICAgICAgICAgICAgMHgwMDBFICAvKiBBSUYyREFDX05HX1RIUiAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9BSUYyREFDX05HX1RIUl9TSElGVCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJEQUNfTkdfVEhSIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTU4X0FJRjJEQUNfTkdfVEhSX1dJRFRIICAgICAgICAgICAgICAgICAgMyAgLyogQUlGMkRBQ19OR19USFIgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19FTkEgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYyREFDX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19FTkFfTUFTSyAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYyREFDX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBBSUYyREFDX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYyREFDX05HX0VOQSAqLworCisvKgogICogUjEzNDQgKDB4NTQwKSAtIEFJRjIgRFJDICgxKQogICovCiAjZGVmaW5lIFdNODk5NF9BSUYyRFJDX1NJR19ERVRfUk1TX01BU0sgICAgICAgICAweEY4MDAgIC8qIEFJRjJEUkNfU0lHX0RFVF9STVMgLSBbMTU6MTFdICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCmluZGV4IGMzMDliMWUuLmM0MWQ3MjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCkBAIC0xLDcgKzEsOCBAQAogI2lmbmRlZiBfTElOVVhfTUlTQ0RFVklDRV9ICiAjZGVmaW5lIF9MSU5VWF9NSVNDREVWSUNFX0gKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKgogICoJVGhlc2UgYWxsb2NhdGlvbnMgYXJlIG1hbmFnZWQgYnkgZGV2aWNlQGxhbmFuYS5vcmcuIElmIHlvdSB1c2UgYW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaAppbmRleCAyMzY2Zjk0Li44NGIwYjE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCkBAIC02MSw2ICs2MSw3IEBACiAJTUxYNF9ERVZfQ0FQX0ZMQUdfUkMJCT0gMUxMIDw8ICAwLAogCU1MWDRfREVWX0NBUF9GTEFHX1VDCQk9IDFMTCA8PCAgMSwKIAlNTFg0X0RFVl9DQVBfRkxBR19VRAkJPSAxTEwgPDwgIDIsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfWFJDCQk9IDFMTCA8PCAgMywKIAlNTFg0X0RFVl9DQVBfRkxBR19TUlEJCT0gMUxMIDw8ICA2LAogCU1MWDRfREVWX0NBUF9GTEFHX0lQT0lCX0NTVU0JPSAxTEwgPDwgIDcsCiAJTUxYNF9ERVZfQ0FQX0ZMQUdfQkFEX1BLRVlfQ05UUgk9IDFMTCA8PCAgOCwKQEAgLTgzLDYgKzg0LDEyIEBACiAJTUxYNF9ERVZfQ0FQX0ZMQUdfQ09VTlRFUlMJPSAxTEwgPDwgNDgKIH07CiAKKyNkZWZpbmUgTUxYNF9BVFRSX0VYVEVOREVEX1BPUlRfSU5GTwljcHVfdG9fYmUxNigweGZmOTApCisKK2VudW0geworCU1MWF9FWFRfUE9SVF9DQVBfRkxBR19FWFRFTkRFRF9QT1JUX0lORk8JPSAxIDw8ICAwCit9OworCiBlbnVtIHsKIAlNTFg0X0JNTUVfRkxBR19MT0NBTF9JTlYJPSAxIDw8ICA2LAogCU1MWDRfQk1NRV9GTEFHX1JFTU9URV9JTlYJPSAxIDw8ICA3LApAQCAtMjU3LDYgKzI2NCw4IEBACiAJaW50CQkJbnVtX3FwX3Blcl9tZ207CiAJaW50CQkJbnVtX3BkczsKIAlpbnQJCQlyZXNlcnZlZF9wZHM7CisJaW50CQkJbWF4X3hyY2RzOworCWludAkJCXJlc2VydmVkX3hyY2RzOwogCWludAkJCW10dF9lbnRyeV9zejsKIAl1MzIJCQltYXhfbXNnX3N6OwogCXUzMgkJCXBhZ2Vfc2l6ZV9jYXA7CkBAIC0yNzcsNiArMjg2LDcgQEAKIAl1MzIJCQlwb3J0X21hc2s7CiAJZW51bSBtbHg0X3BvcnRfdHlwZQlwb3NzaWJsZV90eXBlW01MWDRfTUFYX1BPUlRTICsgMV07CiAJdTMyCQkJbWF4X2NvdW50ZXJzOworCXU4CQkJZXh0X3BvcnRfY2FwW01MWDRfTUFYX1BPUlRTICsgMV07CiB9OwogCiBzdHJ1Y3QgbWx4NF9idWZfbGlzdCB7CkBAIC01MDAsNiArNTEwLDggQEAKIAogaW50IG1seDRfcGRfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiAqcGRuKTsKIHZvaWQgbWx4NF9wZF9mcmVlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgcGRuKTsKK2ludCBtbHg0X3hyY2RfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiAqeHJjZG4pOwordm9pZCBtbHg0X3hyY2RfZnJlZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIHhyY2RuKTsKIAogaW50IG1seDRfdWFyX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF91YXIgKnVhcik7CiB2b2lkIG1seDRfdWFyX2ZyZWUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3VhciAqdWFyKTsKQEAgLTUzOSw4ICs1NTEsOCBAQAogaW50IG1seDRfcXBfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBxcG4sIHN0cnVjdCBtbHg0X3FwICpxcCk7CiB2b2lkIG1seDRfcXBfZnJlZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfcXAgKnFwKTsKIAotaW50IG1seDRfc3JxX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgcGRuLCBzdHJ1Y3QgbWx4NF9tdHQgKm10dCwKLQkJICAgdTY0IGRiX3JlYywgc3RydWN0IG1seDRfc3JxICpzcnEpOworaW50IG1seDRfc3JxX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgcGRuLCB1MzIgY3FuLCB1MTYgeHJjZG4sCisJCSAgIHN0cnVjdCBtbHg0X210dCAqbXR0LCB1NjQgZGJfcmVjLCBzdHJ1Y3QgbWx4NF9zcnEgKnNycSk7CiB2b2lkIG1seDRfc3JxX2ZyZWUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3NycSAqc3JxKTsKIGludCBtbHg0X3NycV9hcm0oc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3NycSAqc3JxLCBpbnQgbGltaXRfd2F0ZXJtYXJrKTsKIGludCBtbHg0X3NycV9xdWVyeShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfc3JxICpzcnEsIGludCAqbGltaXRfd2F0ZXJtYXJrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oIGIvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKaW5kZXggNDAwMWM4Mi4uNDhjYzRjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKQEAgLTc1LDYgKzc1LDcgQEAKIAlNTFg0X1FQX1NUX1VDCQkJCT0gMHgxLAogCU1MWDRfUVBfU1RfUkQJCQkJPSAweDIsCiAJTUxYNF9RUF9TVF9VRAkJCQk9IDB4MywKKwlNTFg0X1FQX1NUX1hSQwkJCQk9IDB4NiwKIAlNTFg0X1FQX1NUX01MWAkJCQk9IDB4NwogfTsKIApAQCAtMTM3LDcgKzEzOCw3IEBACiAJX19iZTMyCQkJc3NuOwogCV9fYmUzMgkJCXBhcmFtczI7CiAJX19iZTMyCQkJcm5yX25leHRyZWN2cHNuOwotCV9fYmUzMgkJCXNyY2Q7CisJX19iZTMyCQkJeHJjZDsKIAlfX2JlMzIJCQljcW5fcmVjdjsKIAlfX2JlNjQJCQlkYl9yZWNfYWRkcjsKIAlfX2JlMzIJCQlxa2V5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDc0MzgwNzEuLjNkYzNhOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTM1NiwzNiArMzU2LDUwIEBACiAJcmV0dXJuIHBhZ2U7CiB9CiAKKy8qCisgKiBUaGUgYXRvbWljIHBhZ2UtPl9tYXBjb3VudCwgc3RhcnRzIGZyb20gLTE6IHNvIHRoYXQgdHJhbnNpdGlvbnMKKyAqIGJvdGggZnJvbSBpdCBhbmQgdG8gaXQgY2FuIGJlIHRyYWNrZWQsIHVzaW5nIGF0b21pY19pbmNfYW5kX3Rlc3QKKyAqIGFuZCBhdG9taWNfYWRkX25lZ2F0aXZlKC0xKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X3BhZ2VfbWFwY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJYXRvbWljX3NldCgmKHBhZ2UpLT5fbWFwY291bnQsIC0xKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGFnZV9tYXBjb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJihwYWdlKS0+X21hcGNvdW50KSArIDE7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIGF0b21pY19yZWFkKCZjb21wb3VuZF9oZWFkKHBhZ2UpLT5fY291bnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2V0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2h1Z2VfcGFnZV90YWlsKHN0cnVjdCBwYWdlICpwYWdlKQogewogCS8qCi0JICogR2V0dGluZyBhIG5vcm1hbCBwYWdlIG9yIHRoZSBoZWFkIG9mIGEgY29tcG91bmQgcGFnZQotCSAqIHJlcXVpcmVzIHRvIGFscmVhZHkgaGF2ZSBhbiBlbGV2YXRlZCBwYWdlLT5fY291bnQuIE9ubHkgaWYKLQkgKiB3ZSdyZSBnZXR0aW5nIGEgdGFpbCBwYWdlLCB0aGUgZWxldmF0ZWQgcGFnZS0+X2NvdW50IGlzCi0JICogcmVxdWlyZWQgb25seSBpbiB0aGUgaGVhZCBwYWdlLCBzbyBmb3IgdGFpbCBwYWdlcyB0aGUKLQkgKiBidWdjaGVjayBvbmx5IHZlcmlmaWVzIHRoYXQgdGhlIHBhZ2UtPl9jb3VudCBpc24ndAotCSAqIG5lZ2F0aXZlLgorCSAqIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50KCkgY2Fubm90IHJ1bgorCSAqIGZyb20gdW5kZXIgdXMuCiAJICovCi0JVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5fY291bnQpIDwgIVBhZ2VUYWlsKHBhZ2UpKTsKLQlhdG9taWNfaW5jKCZwYWdlLT5fY291bnQpOworCVZNX0JVR19PTihwYWdlX21hcGNvdW50KHBhZ2UpIDwgMCk7CisJVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5fY291bnQpICE9IDApOworCWF0b21pY19pbmMoJnBhZ2UtPl9tYXBjb3VudCk7Cit9CisKK2V4dGVybiBib29sIF9fZ2V0X3BhZ2VfdGFpbChzdHJ1Y3QgcGFnZSAqcGFnZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAodW5saWtlbHkoUGFnZVRhaWwocGFnZSkpKQorCQlpZiAobGlrZWx5KF9fZ2V0X3BhZ2VfdGFpbChwYWdlKSkpCisJCQlyZXR1cm47CiAJLyoKLQkgKiBHZXR0aW5nIGEgdGFpbCBwYWdlIHdpbGwgZWxldmF0ZSBib3RoIHRoZSBoZWFkIGFuZCB0YWlsCi0JICogcGFnZS0+X2NvdW50KHMpLgorCSAqIEdldHRpbmcgYSBub3JtYWwgcGFnZSBvciB0aGUgaGVhZCBvZiBhIGNvbXBvdW5kIHBhZ2UKKwkgKiByZXF1aXJlcyB0byBhbHJlYWR5IGhhdmUgYW4gZWxldmF0ZWQgcGFnZS0+X2NvdW50LgogCSAqLwotCWlmICh1bmxpa2VseShQYWdlVGFpbChwYWdlKSkpIHsKLQkJLyoKLQkJICogVGhpcyBpcyBzYWZlIG9ubHkgYmVjYXVzZQotCQkgKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCBjYW4ndCBydW4gdW5kZXIKLQkJICogZ2V0X3BhZ2UoKS4KLQkJICovCi0JCVZNX0JVR19PTihhdG9taWNfcmVhZCgmcGFnZS0+Zmlyc3RfcGFnZS0+X2NvdW50KSA8PSAwKTsKLQkJYXRvbWljX2luYygmcGFnZS0+Zmlyc3RfcGFnZS0+X2NvdW50KTsKLQl9CisJVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5fY291bnQpIDw9IDApOworCWF0b21pY19pbmMoJnBhZ2UtPl9jb3VudCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnZpcnRfdG9faGVhZF9wYWdlKGNvbnN0IHZvaWQgKngpCkBAIC04MDQsMjEgKzgxOCw2IEBACiB9CiAKIC8qCi0gKiBUaGUgYXRvbWljIHBhZ2UtPl9tYXBjb3VudCwgbGlrZSBfY291bnQsIHN0YXJ0cyBmcm9tIC0xOgotICogc28gdGhhdCB0cmFuc2l0aW9ucyBib3RoIGZyb20gaXQgYW5kIHRvIGl0IGNhbiBiZSB0cmFja2VkLAotICogdXNpbmcgYXRvbWljX2luY19hbmRfdGVzdCBhbmQgYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9wYWdlX21hcGNvdW50KHN0cnVjdCBwYWdlICpwYWdlKQotewotCWF0b21pY19zZXQoJihwYWdlKS0+X21hcGNvdW50LCAtMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfbWFwY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIGF0b21pY19yZWFkKCYocGFnZSktPl9tYXBjb3VudCkgKyAxOwotfQotCi0vKgogICogUmV0dXJuIHRydWUgaWYgdGhpcyBwYWdlIGlzIG1hcHBlZCBpbnRvIHBhZ2V0YWJsZXMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfbWFwcGVkKHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtMTMzNCw3ICsxMzMzLDggQEAKIGV4dGVybiB2b2lkIHNpX21lbWluZm9fbm9kZShzdHJ1Y3Qgc3lzaW5mbyAqdmFsLCBpbnQgbmlkKTsKIGV4dGVybiBpbnQgYWZ0ZXJfYm9vdG1lbTsKIAotZXh0ZXJuIHZvaWQgd2Fybl9hbGxvY19mYWlsZWQoZ2ZwX3QgZ2ZwX21hc2ssIGludCBvcmRlciwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDMsIDQpCit2b2lkIHdhcm5fYWxsb2NfZmFpbGVkKGdmcF90IGdmcF9tYXNrLCBpbnQgb3JkZXIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogZXh0ZXJuIHZvaWQgc2V0dXBfcGVyX2NwdV9wYWdlc2V0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKaW5kZXggYzkzZDAwYS4uNWI0MmYxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaApAQCAtNjIsMTAgKzYyLDIzIEBACiAJCQlzdHJ1Y3QgewogCiAJCQkJdW5pb24gewotCQkJCQlhdG9taWNfdCBfbWFwY291bnQ7CS8qIENvdW50IG9mIHB0ZXMgbWFwcGVkIGluIG1tcywKLQkJCQkJCQkgKiB0byBzaG93IHdoZW4gcGFnZSBpcyBtYXBwZWQKLQkJCQkJCQkgKiAmIGxpbWl0IHJldmVyc2UgbWFwIHNlYXJjaGVzLgotCQkJCQkJCSAqLworCQkJCQkvKgorCQkJCQkgKiBDb3VudCBvZiBwdGVzIG1hcHBlZCBpbgorCQkJCQkgKiBtbXMsIHRvIHNob3cgd2hlbiBwYWdlIGlzCisJCQkJCSAqIG1hcHBlZCAmIGxpbWl0IHJldmVyc2UgbWFwCisJCQkJCSAqIHNlYXJjaGVzLgorCQkJCQkgKgorCQkJCQkgKiBVc2VkIGFsc28gZm9yIHRhaWwgcGFnZXMKKwkJCQkJICogcmVmY291bnRpbmcgaW5zdGVhZCBvZgorCQkJCQkgKiBfY291bnQuIFRhaWwgcGFnZXMgY2Fubm90CisJCQkJCSAqIGJlIG1hcHBlZCBhbmQga2VlcGluZyB0aGUKKwkJCQkJICogdGFpbCBwYWdlIF9jb3VudCB6ZXJvIGF0CisJCQkJCSAqIGFsbCB0aW1lcyBndWFyYW50ZWVzCisJCQkJCSAqIGdldF9wYWdlX3VubGVzc196ZXJvKCkgd2lsbAorCQkJCQkgKiBuZXZlciBzdWNjZWVkIG9uIHRhaWwKKwkJCQkJICogcGFnZXMuCisJCQkJCSAqLworCQkJCQlhdG9taWNfdCBfbWFwY291bnQ7CiAKIAkJCQkJc3RydWN0IHsKIAkJCQkJCXVuc2lnbmVkIGludXNlOjE2OwpAQCAtMzA0LDggKzMxNywxNSBAQAogCXVuc2lnbmVkIGxvbmcgaGl3YXRlcl9yc3M7CS8qIEhpZ2gtd2F0ZXJtYXJrIG9mIFJTUyB1c2FnZSAqLwogCXVuc2lnbmVkIGxvbmcgaGl3YXRlcl92bTsJLyogSGlnaC13YXRlciB2aXJ0dWFsIG1lbW9yeSB1c2FnZSAqLwogCi0JdW5zaWduZWQgbG9uZyB0b3RhbF92bSwgbG9ja2VkX3ZtLCBzaGFyZWRfdm0sIGV4ZWNfdm07Ci0JdW5zaWduZWQgbG9uZyBzdGFja192bSwgcmVzZXJ2ZWRfdm0sIGRlZl9mbGFncywgbnJfcHRlczsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3ZtOwkJLyogVG90YWwgcGFnZXMgbWFwcGVkICovCisJdW5zaWduZWQgbG9uZyBsb2NrZWRfdm07CS8qIFBhZ2VzIHRoYXQgaGF2ZSBQR19tbG9ja2VkIHNldCAqLworCXVuc2lnbmVkIGxvbmcgcGlubmVkX3ZtOwkvKiBSZWZjb3VudCBwZXJtYW5lbnRseSBpbmNyZWFzZWQgKi8KKwl1bnNpZ25lZCBsb25nIHNoYXJlZF92bTsJLyogU2hhcmVkIHBhZ2VzIChmaWxlcykgKi8KKwl1bnNpZ25lZCBsb25nIGV4ZWNfdm07CQkvKiBWTV9FWEVDICYgflZNX1dSSVRFICovCisJdW5zaWduZWQgbG9uZyBzdGFja192bTsJCS8qIFZNX0dST1dTVVAvRE9XTiAqLworCXVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWRfdm07CS8qIFZNX1JFU0VSVkVEfFZNX0lPIHBhZ2VzICovCisJdW5zaWduZWQgbG9uZyBkZWZfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBucl9wdGVzOwkJLyogUGFnZSB0YWJsZSBwYWdlcyAqLwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZSwgZW5kX2NvZGUsIHN0YXJ0X2RhdGEsIGVuZF9kYXRhOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfYnJrLCBicmssIHN0YXJ0X3N0YWNrOwogCXVuc2lnbmVkIGxvbmcgYXJnX3N0YXJ0LCBhcmdfZW5kLCBlbnZfc3RhcnQsIGVudl9lbmQ7CkBAIC0zMzYsOSArMzU2LDYgQEAKIAl1bnNpZ25lZCBpbnQgdG9rZW5fcHJpb3JpdHk7CiAJdW5zaWduZWQgaW50IGxhc3RfaW50ZXJ2YWw7CiAKLQkvKiBIb3cgbWFueSB0YXNrcyBzaGFyaW5nIHRoaXMgbW0gYXJlIE9PTV9ESVNBQkxFICovCi0JYXRvbWljX3Qgb29tX2Rpc2FibGVfY291bnQ7Ci0KIAl1bnNpZ25lZCBsb25nIGZsYWdzOyAvKiBNdXN0IHVzZSBhdG9taWMgYml0b3BzIHRvIGFjY2VzcyB0aGUgYml0cyAqLwogCiAJc3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGU7IC8qIGNvcmVkdW1waW5nIHN1cHBvcnQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAppbmRleCBiNDYwZmMyLi40MTVmMmRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCkBAIC01MCw4ICs1MCwxMiBAQAogCXU4CQkJcmVsX3NlY3RvcnM7CiAJdTgJCQlyZWxfcGFyYW07CiAJdTgJCQlwYXJ0X2NvbmZpZzsKKwl1OAkJCWNhY2hlX2N0cmw7CisJdTgJCQlyc3Rfbl9mdW5jdGlvbjsKIAl1bnNpZ25lZCBpbnQJCXBhcnRfdGltZTsJCS8qIFVuaXRzOiBtcyAqLwogCXVuc2lnbmVkIGludAkJc2FfdGltZW91dDsJCS8qIFVuaXRzOiAxMDBucyAqLworCXVuc2lnbmVkIGludAkJZ2VuZXJpY19jbWQ2X3RpbWU7CS8qIFVuaXRzOiAxMG1zICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgcG93ZXJfb2ZmX2xvbmd0aW1lOyAgICAgLyogVW5pdHM6IG1zICovCiAJdW5zaWduZWQgaW50CQloc19tYXhfZHRyOwogCXVuc2lnbmVkIGludAkJc2VjdG9yczsKIAl1bnNpZ25lZCBpbnQJCWNhcmRfdHlwZTsKQEAgLTYzLDExICs2NywxNSBAQAogCWJvb2wJCQllbmhhbmNlZF9hcmVhX2VuOwkvKiBlbmFibGUgYml0ICovCiAJdW5zaWduZWQgbG9uZyBsb25nCWVuaGFuY2VkX2FyZWFfb2Zmc2V0OwkvKiBVbml0czogQnl0ZSAqLwogCXVuc2lnbmVkIGludAkJZW5oYW5jZWRfYXJlYV9zaXplOwkvKiBVbml0czogS0IgKi8KLQl1bnNpZ25lZCBpbnQJCWJvb3Rfc2l6ZTsJCS8qIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50CQljYWNoZV9zaXplOwkJLyogVW5pdHM6IEtCICovCisJYm9vbAkJCWhwaV9lbjsJCQkvKiBIUEkgZW5hYmxlYml0ICovCisJYm9vbAkJCWhwaTsJCQkvKiBIUEkgc3VwcG9ydCBiaXQgKi8KKwl1bnNpZ25lZCBpbnQJCWhwaV9jbWQ7CQkvKiBjbWQgdXNlZCBhcyBIUEkgKi8KIAl1OAkJCXJhd19wYXJ0aXRpb25fc3VwcG9ydDsJLyogMTYwICovCiAJdTgJCQlyYXdfZXJhc2VkX21lbV9jb3VudDsJLyogMTgxICovCiAJdTgJCQlyYXdfZXh0X2NzZF9zdHJ1Y3R1cmU7CS8qIDE5NCAqLwogCXU4CQkJcmF3X2NhcmRfdHlwZTsJCS8qIDE5NiAqLworCXU4CQkJb3V0X29mX2ludF90aW1lOwkvKiAxOTggKi8KIAl1OAkJCXJhd19zX2FfdGltZW91dDsJCS8qIDIxNyAqLwogCXU4CQkJcmF3X2hjX2VyYXNlX2dhcF9zaXplOwkvKiAyMjEgKi8KIAl1OAkJCXJhd19lcmFzZV90aW1lb3V0X211bHQ7CS8qIDIyMyAqLwpAQCAtNzcsNiArODUsOSBAQAogCXU4CQkJcmF3X3NlY19mZWF0dXJlX3N1cHBvcnQ7LyogMjMxICovCiAJdTgJCQlyYXdfdHJpbV9tdWx0OwkJLyogMjMyICovCiAJdTgJCQlyYXdfc2VjdG9yc1s0XTsJCS8qIDIxMiAtIDQgYnl0ZXMgKi8KKworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGZlYXR1cmVfc3VwcG9ydDsKKyNkZWZpbmUgTU1DX0RJU0NBUkRfRkVBVFVSRQlCSVQoMCkgICAgICAgICAgICAgICAgICAvKiBDTUQzOCBmZWF0dXJlICovCiB9OwogCiBzdHJ1Y3Qgc2Rfc2NyIHsKQEAgLTE1Nyw2ICsxNjgsMjQgQEAKIAogI2RlZmluZSBTRElPX01BWF9GVU5DUwkJNwogCisvKiBUaGUgbnVtYmVyIG9mIE1NQyBwaHlzaWNhbCBwYXJ0aXRpb25zLiAgVGhlc2UgY29uc2lzdCBvZjoKKyAqIGJvb3QgcGFydGl0aW9ucyAoMiksIGdlbmVyYWwgcHVycG9zZSBwYXJ0aXRpb25zICg0KSBpbiBNTUMgdjQuNC4KKyAqLworI2RlZmluZSBNTUNfTlVNX0JPT1RfUEFSVElUSU9OCTIKKyNkZWZpbmUgTU1DX05VTV9HUF9QQVJUSVRJT04JNAorI2RlZmluZSBNTUNfTlVNX1BIWV9QQVJUSVRJT04JNgorI2RlZmluZSBNQVhfTU1DX1BBUlRfTkFNRV9MRU4JMjAKKworLyoKKyAqIE1NQyBQaHlzaWNhbCBwYXJ0aXRpb25zCisgKi8KK3N0cnVjdCBtbWNfcGFydCB7CisJdW5zaWduZWQgaW50CXNpemU7CS8qIHBhcnRpdGlvbiBzaXplIChpbiBieXRlcykgKi8KKwl1bnNpZ25lZCBpbnQJcGFydF9jZmc7CS8qIHBhcnRpdGlvbiB0eXBlICovCisJY2hhcgluYW1lW01BWF9NTUNfUEFSVF9OQU1FX0xFTl07CisJYm9vbAlmb3JjZV9ybzsJLyogdG8gbWFrZSBib290IHBhcnRzIFJPIGJ5IGRlZmF1bHQgKi8KK307CisKIC8qCiAgKiBNTUMgZGV2aWNlCiAgKi8KQEAgLTE4OCw2ICsyMTcsMTMgQEAKICNkZWZpbmUgTU1DX1FVSVJLX0RJU0FCTEVfQ0QJKDE8PDUpCQkvKiBkaXNjb25uZWN0IENEL0RBVFszXSByZXNpc3RvciAqLwogI2RlZmluZSBNTUNfUVVJUktfSU5BTkRfQ01EMzgJKDE8PDYpCQkvKiBpTkFORCBkZXZpY2VzIGhhdmUgYnJva2VuIENNRDM4ICovCiAjZGVmaW5lIE1NQ19RVUlSS19CTEtfTk9fQ01EMjMJKDE8PDcpCQkvKiBBdm9pZCBDTUQyMyBmb3IgcmVndWxhciBtdWx0aWJsb2NrICovCisjZGVmaW5lIE1NQ19RVUlSS19CUk9LRU5fQllURV9NT0RFXzUxMiAoMTw8OCkJLyogQXZvaWQgc2VuZGluZyA1MTIgYnl0ZXMgaW4gKi8KKwkJCQkJCS8qIGJ5dGUgbW9kZSAqLworCXVuc2lnbmVkIGludCAgICBwb3dlcm9mZl9ub3RpZnlfc3RhdGU7CS8qIGVNTUM0LjUgbm90aWZ5IGZlYXR1cmUgKi8KKyNkZWZpbmUgTU1DX05PX1BPV0VSX05PVElGSUNBVElPTgkwCisjZGVmaW5lIE1NQ19QT1dFUkVEX09OCQkJMQorI2RlZmluZSBNTUNfUE9XRVJPRkZfU0hPUlQJCTIKKyNkZWZpbmUgTU1DX1BPV0VST0ZGX0xPTkcJCTMKIAogCXVuc2lnbmVkIGludAkJZXJhc2Vfc2l6ZTsJLyogZXJhc2Ugc2l6ZSBpbiBzZWN0b3JzICovCiAgCXVuc2lnbmVkIGludAkJZXJhc2Vfc2hpZnQ7CS8qIGlmIGVyYXNlIHVuaXQgaXMgcG93ZXIgMiAqLwpAQCAtMjE2LDkgKzI1MiwyNCBAQAogCXVuc2lnbmVkIGludAkJc2RfYnVzX3NwZWVkOwkvKiBCdXMgU3BlZWQgTW9kZSBzZXQgZm9yIHRoZSBjYXJkICovCiAKIAlzdHJ1Y3QgZGVudHJ5CQkqZGVidWdmc19yb290OworCXN0cnVjdCBtbWNfcGFydAlwYXJ0W01NQ19OVU1fUEhZX1BBUlRJVElPTl07IC8qIHBoeXNpY2FsIHBhcnRpdGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgICAgbnJfcGFydHM7CiB9OwogCiAvKgorICogVGhpcyBmdW5jdGlvbiBmaWxsIGNvbnRlbnRzIGluIG1tY19wYXJ0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX3BhcnRfYWRkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHNpemUsCisJCQl1bnNpZ25lZCBpbnQgcGFydF9jZmcsIGNoYXIgKm5hbWUsIGludCBpZHgsIGJvb2wgcm8pCit7CisJY2FyZC0+cGFydFtjYXJkLT5ucl9wYXJ0c10uc2l6ZSA9IHNpemU7CisJY2FyZC0+cGFydFtjYXJkLT5ucl9wYXJ0c10ucGFydF9jZmcgPSBwYXJ0X2NmZzsKKwlzcHJpbnRmKGNhcmQtPnBhcnRbY2FyZC0+bnJfcGFydHNdLm5hbWUsIG5hbWUsIGlkeCk7CisJY2FyZC0+cGFydFtjYXJkLT5ucl9wYXJ0c10uZm9yY2Vfcm8gPSBybzsKKwljYXJkLT5ucl9wYXJ0cysrOworfQorCisvKgogICogIFRoZSB3b3JsZCBpcyBub3QgcGVyZmVjdCBhbmQgc3VwcGxpZXMgdXMgd2l0aCBicm9rZW4gbW1jL3NkaW8gZGV2aWNlcy4KICAqICBGb3IgYXQgbGVhc3Qgc29tZSBvZiB0aGVzZSBidWdzIHdlIG5lZWQgYSB3b3JrLWFyb3VuZC4KICAqLwpAQCAtMzc3LDYgKzQyOCwxMSBAQAogCXJldHVybiBjLT5xdWlya3MgJiBNTUNfUVVJUktfTk9OU1REX0ZVTkNfSUY7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1tY19jYXJkX2Jyb2tlbl9ieXRlX21vZGVfNTEyKGNvbnN0IHN0cnVjdCBtbWNfY2FyZCAqYykKK3sKKwlyZXR1cm4gYy0+cXVpcmtzICYgTU1DX1FVSVJLX0JST0tFTl9CWVRFX01PREVfNTEyOworfQorCiAjZGVmaW5lIG1tY19jYXJkX25hbWUoYykJKChjKS0+Y2lkLnByb2RfbmFtZSkKICNkZWZpbmUgbW1jX2NhcmRfaWQoYykJCShkZXZfbmFtZSgmKGMpLT5kZXYpKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmgKaW5kZXggYjhiMWI3YS4uMTc0YTg0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaApAQCAtMTM2LDYgKzEzNiw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqbW1jX3N0YXJ0X3JlcShzdHJ1Y3QgbW1jX2hvc3QgKiwKIAkJCQkJICAgc3RydWN0IG1tY19hc3luY19yZXEgKiwgaW50ICopOworZXh0ZXJuIGludCBtbWNfaW50ZXJydXB0X2hwaShzdHJ1Y3QgbW1jX2NhcmQgKik7CiBleHRlcm4gdm9pZCBtbWNfd2FpdF9mb3JfcmVxKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKik7CiBleHRlcm4gaW50IG1tY193YWl0X2Zvcl9jbWQoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfY29tbWFuZCAqLCBpbnQpOwogZXh0ZXJuIGludCBtbWNfYXBwX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19jYXJkICopOwpAQCAtMTQ2LDYgKzE0Nyw3IEBACiAjZGVmaW5lIE1NQ19FUkFTRV9BUkcJCTB4MDAwMDAwMDAKICNkZWZpbmUgTU1DX1NFQ1VSRV9FUkFTRV9BUkcJMHg4MDAwMDAwMAogI2RlZmluZSBNTUNfVFJJTV9BUkcJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTU1DX0RJU0NBUkRfQVJHCQkweDAwMDAwMDAzCiAjZGVmaW5lIE1NQ19TRUNVUkVfVFJJTTFfQVJHCTB4ODAwMDAwMDEKICNkZWZpbmUgTU1DX1NFQ1VSRV9UUklNMl9BUkcJMHg4MDAwODAwMAogCkBAIC0xNTYsMTIgKzE1OCwxNyBAQAogCQkgICAgIHVuc2lnbmVkIGludCBhcmcpOwogZXh0ZXJuIGludCBtbWNfY2FuX2VyYXNlKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiBleHRlcm4gaW50IG1tY19jYW5fdHJpbShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOworZXh0ZXJuIGludCBtbWNfY2FuX2Rpc2NhcmQoc3RydWN0IG1tY19jYXJkICpjYXJkKTsKK2V4dGVybiBpbnQgbW1jX2Nhbl9zYW5pdGl6ZShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwogZXh0ZXJuIGludCBtbWNfY2FuX3NlY3VyZV9lcmFzZV90cmltKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiBleHRlcm4gaW50IG1tY19lcmFzZV9ncm91cF9hbGlnbmVkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGZyb20sCiAJCQkJICAgdW5zaWduZWQgaW50IG5yKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgbW1jX2NhbGNfbWF4X2Rpc2NhcmQoc3RydWN0IG1tY19jYXJkICpjYXJkKTsKIAogZXh0ZXJuIGludCBtbWNfc2V0X2Jsb2NrbGVuKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGJsb2NrbGVuKTsKK2V4dGVybiBpbnQgbW1jX2h3X3Jlc2V0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CitleHRlcm4gaW50IG1tY19od19yZXNldF9jaGVjayhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOworZXh0ZXJuIGludCBtbWNfY2FuX3Jlc2V0KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiAKIGV4dGVybiB2b2lkIG1tY19zZXRfZGF0YV90aW1lb3V0KHN0cnVjdCBtbWNfZGF0YSAqLCBjb25zdCBzdHJ1Y3QgbW1jX2NhcmQgKik7CiBleHRlcm4gdW5zaWduZWQgaW50IG1tY19hbGlnbl9kYXRhX3NpemUoc3RydWN0IG1tY19jYXJkICosIHVuc2lnbmVkIGludCk7CkBAIC0xNzEsNiArMTc4LDggQEAKIGV4dGVybiB2b2lkIG1tY19kb19yZWxlYXNlX2hvc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKIGV4dGVybiBpbnQgbW1jX3RyeV9jbGFpbV9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiAKK2V4dGVybiBpbnQgbW1jX2ZsdXNoX2NhY2hlKHN0cnVjdCBtbWNfY2FyZCAqKTsKKwogLyoqCiAgKgltbWNfY2xhaW1faG9zdCAtIGV4Y2x1c2l2ZWx5IGNsYWltIGEgaG9zdAogICoJQGhvc3Q6IG1tYyBob3N0IHRvIGNsYWltCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCmluZGV4IDZiNDY4MTkuLjZkYzliODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCkBAIC03Miw2ICs3Miw4IEBACiAgKglyYXRlIGFuZCB0aW1lb3V0IGNhbGN1bGF0aW9ucy4KICAqIEBjdXJyZW50X3NwZWVkOiBDb25maWd1cmVkIHJhdGUgb2YgdGhlIGNvbnRyb2xsZXIuCiAgKiBAbnVtX3Nsb3RzOiBOdW1iZXIgb2Ygc2xvdHMgYXZhaWxhYmxlLgorICogQHZlcmlkOiBEZW5vdGUgVmVyc2lvbiBJRC4KKyAqIEBkYXRhX29mZnNldDogU2V0IHRoZSBvZmZzZXQgb2YgREFUQSByZWdpc3RlciBhY2NvcmRpbmcgdG8gVkVSSUQuCiAgKiBAcGRldjogUGxhdGZvcm0gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTU1DIGNvbnRyb2xsZXIuCiAgKiBAcGRhdGE6IFBsYXRmb3JtIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBNTUMgY29udHJvbGxlci4KICAqIEBzbG90OiBTbG90cyBzaGFyaW5nIHRoaXMgTU1DIGNvbnRyb2xsZXIuCkBAIC0xNDcsNiArMTQ5LDggQEAKIAl1MzIJCQljdXJyZW50X3NwZWVkOwogCXUzMgkJCW51bV9zbG90czsKIAl1MzIJCQlmaWZvdGhfdmFsOworCXUxNgkJCXZlcmlkOworCXUxNgkJCWRhdGFfb2Zmc2V0OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CiAJc3RydWN0IGR3X21jaV9ib2FyZAkqcGRhdGE7CiAJc3RydWN0IGR3X21jaV9zbG90CSpzbG90W01BWF9NQ0lfU0xPVFNdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCmluZGV4IDFkMDk1NjIuLmEzYWM5YzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvcG0uaD4KQEAgLTEwOCw2ICsxMDksOSBAQAogCSAqIEl0IGlzIG9wdGlvbmFsIGZvciB0aGUgaG9zdCB0byBpbXBsZW1lbnQgcHJlX3JlcSBhbmQgcG9zdF9yZXEgaW4KIAkgKiBvcmRlciB0byBzdXBwb3J0IGRvdWJsZSBidWZmZXJpbmcgb2YgcmVxdWVzdHMgKHByZXBhcmUgb25lCiAJICogcmVxdWVzdCB3aGlsZSBhbm90aGVyIHJlcXVlc3QgaXMgYWN0aXZlKS4KKwkgKiBwcmVfcmVxKCkgbXVzdCBhbHdheXMgYmUgZm9sbG93ZWQgYnkgYSBwb3N0X3JlcSgpLgorCSAqIFRvIHVuZG8gYSBjYWxsIG1hZGUgdG8gcHJlX3JlcSgpLCBjYWxsIHBvc3RfcmVxKCkgd2l0aAorCSAqIGEgbm9uemVybyBlcnIgY29uZGl0aW9uLgogCSAqLwogCXZvaWQJKCpwb3N0X3JlcSkoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKnJlcSwKIAkJCSAgICBpbnQgZXJyKTsKQEAgLTE0Nyw2ICsxNTEsNyBAQAogCWludAkoKmV4ZWN1dGVfdHVuaW5nKShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwogCXZvaWQJKCplbmFibGVfcHJlc2V0X3ZhbHVlKShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIGJvb2wgZW5hYmxlKTsKIAlpbnQJKCpzZWxlY3RfZHJpdmVfc3RyZW5ndGgpKHVuc2lnbmVkIGludCBtYXhfZHRyLCBpbnQgaG9zdF9kcnYsIGludCBjYXJkX2Rydik7CisJdm9pZAkoKmh3X3Jlc2V0KShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwogfTsKIAogc3RydWN0IG1tY19jYXJkOwpAQCAtMjI5LDggKzIzNCwyMCBAQAogI2RlZmluZSBNTUNfQ0FQX01BWF9DVVJSRU5UXzYwMAkoMSA8PCAyOCkJLyogSG9zdCBtYXggY3VycmVudCBsaW1pdCBpcyA2MDBtQSAqLwogI2RlZmluZSBNTUNfQ0FQX01BWF9DVVJSRU5UXzgwMAkoMSA8PCAyOSkJLyogSG9zdCBtYXggY3VycmVudCBsaW1pdCBpcyA4MDBtQSAqLwogI2RlZmluZSBNTUNfQ0FQX0NNRDIzCQkoMSA8PCAzMCkJLyogQ01EMjMgc3VwcG9ydGVkLiAqLworI2RlZmluZSBNTUNfQ0FQX0hXX1JFU0VUCSgxIDw8IDMxKQkvKiBIYXJkd2FyZSByZXNldCAqLworCisJdW5zaWduZWQgaW50CQljYXBzMjsJCS8qIE1vcmUgaG9zdCBjYXBhYmlsaXRpZXMgKi8KKworI2RlZmluZSBNTUNfQ0FQMl9CT09UUEFSVF9OT0FDQwkoMSA8PCAwKQkvKiBCb290IHBhcnRpdGlvbiBubyBhY2Nlc3MgKi8KKyNkZWZpbmUgTU1DX0NBUDJfQ0FDSEVfQ1RSTAkoMSA8PCAxKQkvKiBBbGxvdyBjYWNoZSBjb250cm9sICovCisjZGVmaW5lIE1NQ19DQVAyX1BPV0VST0ZGX05PVElGWSAoMSA8PCAyKQkvKiBOb3RpZnkgcG93ZXJvZmYgc3VwcG9ydGVkICovCisjZGVmaW5lIE1NQ19DQVAyX05PX01VTFRJX1JFQUQJKDEgPDwgMykJLyogTXVsdGlibG9jayByZWFkcyBkb24ndCB3b3JrICovCiAKIAltbWNfcG1fZmxhZ190CQlwbV9jYXBzOwkvKiBzdXBwb3J0ZWQgcG0gZmVhdHVyZXMgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgIHBvd2VyX25vdGlmeV90eXBlOworI2RlZmluZSBNTUNfSE9TVF9QV19OT1RJRllfTk9ORQkJMAorI2RlZmluZSBNTUNfSE9TVF9QV19OT1RJRllfU0hPUlQJMQorI2RlZmluZSBNTUNfSE9TVF9QV19OT1RJRllfTE9ORwkJMgogCiAjaWZkZWYgQ09ORklHX01NQ19DTEtHQVRFCiAJaW50CQkJY2xrX3JlcXVlc3RzOwkvKiBpbnRlcm5hbCByZWZlcmVuY2UgY291bnRlciAqLwpAQCAtMzAyLDYgKzMxOSwxMCBAQAogCiAJc3RydWN0IG1tY19hc3luY19yZXEJKmFyZXE7CQkvKiBhY3RpdmUgYXN5bmMgcmVxICovCiAKKyNpZmRlZiBDT05GSUdfRkFJTF9NTUNfUkVRVUVTVAorCXN0cnVjdCBmYXVsdF9hdHRyCWZhaWxfbW1jX3JlcXVlc3Q7CisjZW5kaWYKKwogCXVuc2lnbmVkIGxvbmcJCXByaXZhdGVbMF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogfTsKIApAQCAtMzMwLDYgKzM1MSw4IEBACiBleHRlcm4gdm9pZCBtbWNfZGV0ZWN0X2NoYW5nZShzdHJ1Y3QgbW1jX2hvc3QgKiwgdW5zaWduZWQgbG9uZyBkZWxheSk7CiBleHRlcm4gdm9pZCBtbWNfcmVxdWVzdF9kb25lKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKik7CiAKK2V4dGVybiBpbnQgbW1jX2NhY2hlX2N0cmwoc3RydWN0IG1tY19ob3N0ICosIHU4KTsKKwogc3RhdGljIGlubGluZSB2b2lkIG1tY19zaWduYWxfc2Rpb19pcnEoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewogCWhvc3QtPm9wcy0+ZW5hYmxlX3NkaW9faXJxKGhvc3QsIDApOwpAQCAtMzk0LDQgKzQxNywxMCBAQAogewogCXJldHVybiBob3N0LT5jYXBzICYgTU1DX0NBUF9DTUQyMzsKIH0KKworc3RhdGljIGlubGluZSBpbnQgbW1jX2Jvb3RfcGFydGl0aW9uX2FjY2VzcyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuICEoaG9zdC0+Y2FwczIgJiBNTUNfQ0FQMl9CT09UUEFSVF9OT0FDQyk7Cit9CisKICNlbmRpZiAvKiBMSU5VWF9NTUNfSE9TVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCmluZGV4IDVhNzk0Y2IuLjBlNzEzNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCkBAIC0yNzAsMTggKzI3MCwzMSBAQAogICogRVhUX0NTRCBmaWVsZHMKICAqLwogCisjZGVmaW5lIEVYVF9DU0RfRkxVU0hfQ0FDSEUJCTMyICAgICAgLyogVyAqLworI2RlZmluZSBFWFRfQ1NEX0NBQ0hFX0NUUkwJCTMzICAgICAgLyogUi9XICovCisjZGVmaW5lIEVYVF9DU0RfUE9XRVJfT0ZGX05PVElGSUNBVElPTgkzNAkvKiBSL1cgKi8KKyNkZWZpbmUgRVhUX0NTRF9HUF9TSVpFX01VTFQJCTE0MwkvKiBSL1cgKi8KICNkZWZpbmUgRVhUX0NTRF9QQVJUSVRJT05fQVRUUklCVVRFCTE1NgkvKiBSL1cgKi8KICNkZWZpbmUgRVhUX0NTRF9QQVJUSVRJT05fU1VQUE9SVAkxNjAJLyogUk8gKi8KKyNkZWZpbmUgRVhUX0NTRF9IUElfTUdNVAkJMTYxCS8qIFIvVyAqLworI2RlZmluZSBFWFRfQ1NEX1JTVF9OX0ZVTkNUSU9OCQkxNjIJLyogUi9XICovCisjZGVmaW5lIEVYVF9DU0RfU0FOSVRJWkVfU1RBUlQJCTE2NSAgICAgLyogVyAqLwogI2RlZmluZSBFWFRfQ1NEX1dSX1JFTF9QQVJBTQkJMTY2CS8qIFJPICovCiAjZGVmaW5lIEVYVF9DU0RfRVJBU0VfR1JPVVBfREVGCQkxNzUJLyogUi9XICovCiAjZGVmaW5lIEVYVF9DU0RfUEFSVF9DT05GSUcJCTE3OQkvKiBSL1cgKi8KICNkZWZpbmUgRVhUX0NTRF9FUkFTRURfTUVNX0NPTlQJCTE4MQkvKiBSTyAqLwogI2RlZmluZSBFWFRfQ1NEX0JVU19XSURUSAkJMTgzCS8qIFIvVyAqLwogI2RlZmluZSBFWFRfQ1NEX0hTX1RJTUlORwkJMTg1CS8qIFIvVyAqLworI2RlZmluZSBFWFRfQ1NEX1BPV0VSX0NMQVNTCQkxODcJLyogUi9XICovCiAjZGVmaW5lIEVYVF9DU0RfUkVWCQkJMTkyCS8qIFJPICovCiAjZGVmaW5lIEVYVF9DU0RfU1RSVUNUVVJFCQkxOTQJLyogUk8gKi8KICNkZWZpbmUgRVhUX0NTRF9DQVJEX1RZUEUJCTE5NgkvKiBSTyAqLworI2RlZmluZSBFWFRfQ1NEX09VVF9PRl9JTlRFUlJVUFRfVElNRQkxOTgJLyogUk8gKi8KICNkZWZpbmUgRVhUX0NTRF9QQVJUX1NXSVRDSF9USU1FICAgICAgICAxOTkgICAgIC8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzUyXzE5NQkJMjAwCS8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzI2XzE5NQkJMjAxCS8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzUyXzM2MAkJMjAyCS8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzI2XzM2MAkJMjAzCS8qIFJPICovCiAjZGVmaW5lIEVYVF9DU0RfU0VDX0NOVAkJCTIxMgkvKiBSTywgNCBieXRlcyAqLwogI2RlZmluZSBFWFRfQ1NEX1NfQV9USU1FT1VUCQkyMTcJLyogUk8gKi8KICNkZWZpbmUgRVhUX0NTRF9SRUxfV1JfU0VDX0MJCTIyMgkvKiBSTyAqLwpAQCAtMjkzLDYgKzMwNiwxNCBAQAogI2RlZmluZSBFWFRfQ1NEX1NFQ19FUkFTRV9NVUxUCQkyMzAJLyogUk8gKi8KICNkZWZpbmUgRVhUX0NTRF9TRUNfRkVBVFVSRV9TVVBQT1JUCTIzMQkvKiBSTyAqLwogI2RlZmluZSBFWFRfQ1NEX1RSSU1fTVVMVAkJMjMyCS8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzIwMF8xOTUJCTIzNgkvKiBSTyAqLworI2RlZmluZSBFWFRfQ1NEX1BXUl9DTF8yMDBfMzYwCQkyMzcJLyogUk8gKi8KKyNkZWZpbmUgRVhUX0NTRF9QV1JfQ0xfRERSXzUyXzE5NQkyMzgJLyogUk8gKi8KKyNkZWZpbmUgRVhUX0NTRF9QV1JfQ0xfRERSXzUyXzM2MAkyMzkJLyogUk8gKi8KKyNkZWZpbmUgRVhUX0NTRF9QT1dFUl9PRkZfTE9OR19USU1FCTI0NwkvKiBSTyAqLworI2RlZmluZSBFWFRfQ1NEX0dFTkVSSUNfQ01ENl9USU1FCTI0OAkvKiBSTyAqLworI2RlZmluZSBFWFRfQ1NEX0NBQ0hFX1NJWkUJCTI0OQkvKiBSTywgNCBieXRlcyAqLworI2RlZmluZSBFWFRfQ1NEX0hQSV9GRUFUVVJFUwkJNTAzCS8qIFJPICovCiAKIC8qCiAgKiBFWFRfQ1NEIGZpZWxkIGRlZmluaXRpb25zCkBAIC0zMDIsNyArMzIzLDkgQEAKIAogI2RlZmluZSBFWFRfQ1NEX1BBUlRfQ09ORklHX0FDQ19NQVNLCSgweDcpCiAjZGVmaW5lIEVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0JPT1QwCSgweDEpCi0jZGVmaW5lIEVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0JPT1QxCSgweDIpCisjZGVmaW5lIEVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0dQMAkoMHg0KQorCisjZGVmaW5lIEVYVF9DU0RfUEFSVF9TVVBQT1JUX1BBUlRfRU4JKDB4MSkKIAogI2RlZmluZSBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMCQkoMTw8MCkKICNkZWZpbmUgRVhUX0NTRF9DTURfU0VUX1NFQ1VSRQkJKDE8PDEpCkBAIC0zMjcsNyArMzUwLDIwIEBACiAjZGVmaW5lIEVYVF9DU0RfU0VDX0VSX0VOCUJJVCgwKQogI2RlZmluZSBFWFRfQ1NEX1NFQ19CRF9CTEtfRU4JQklUKDIpCiAjZGVmaW5lIEVYVF9DU0RfU0VDX0dCX0NMX0VOCUJJVCg0KQorI2RlZmluZSBFWFRfQ1NEX1NFQ19TQU5JVElaRQlCSVQoNikgIC8qIHY0LjUgb25seSAqLwogCisjZGVmaW5lIEVYVF9DU0RfUlNUX05fRU5fTUFTSwkweDMKKyNkZWZpbmUgRVhUX0NTRF9SU1RfTl9FTkFCTEVECTEJLyogUlNUX24gaXMgZW5hYmxlZCBvbiBjYXJkICovCisKKyNkZWZpbmUgRVhUX0NTRF9OT19QT1dFUl9OT1RJRklDQVRJT04JMAorI2RlZmluZSBFWFRfQ1NEX1BPV0VSX09OCQkxCisjZGVmaW5lIEVYVF9DU0RfUE9XRVJfT0ZGX1NIT1JUCQkyCisjZGVmaW5lIEVYVF9DU0RfUE9XRVJfT0ZGX0xPTkcJCTMKKworI2RlZmluZSBFWFRfQ1NEX1BXUl9DTF84QklUX01BU0sJMHhGMAkvKiA4IGJpdCBQV1IgQ0xTICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzRCSVRfTUFTSwkweDBGCS8qIDggYml0IFBXUiBDTFMgKi8KKyNkZWZpbmUgRVhUX0NTRF9QV1JfQ0xfOEJJVF9TSElGVAk0CisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzRCSVRfU0hJRlQJMAogLyoKICAqIE1NQ19TV0lUQ0ggYWNjZXNzIG1vZGVzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS5oCmluZGV4IDU2NjZmM2EuLmU0YjY5MzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaApAQCAtODgsNiArODgsMTAgQEAKIC8qIFRoZSByZWFkLW9ubHkgZGV0ZWN0aW9uIHZpYSBTREhDSV9QUkVTRU5UX1NUQVRFIHJlZ2lzdGVyIGlzIHVuc3RhYmxlICovCiAjZGVmaW5lIFNESENJX1FVSVJLX1VOU1RBQkxFX1JPX0RFVEVDVAkJCSgxPDwzMSkKIAorCXVuc2lnbmVkIGludCBxdWlya3MyOwkvKiBNb3JlIGRldmlhdGlvbnMgZnJvbSBzcGVjLiAqLworCisjZGVmaW5lIFNESENJX1FVSVJLMl9PV05fQ0FSRF9ERVRFQ1RJT04JCQkoMTw8MCkKKwogCWludCBpcnE7CQkvKiBEZXZpY2UgSVJRICovCiAJdm9pZCBfX2lvbWVtICppb2FkZHI7CS8qIE1hcHBlZCBhZGRyZXNzICovCiAKQEAgLTExNSw2ICsxMTksOCBAQAogI2RlZmluZSBTREhDSV9ORUVEU19SRVRVTklORwkoMTw8NSkJLyogSG9zdCBuZWVkcyByZXR1bmluZyAqLwogI2RlZmluZSBTREhDSV9BVVRPX0NNRDEyCSgxPDw2KQkvKiBBdXRvIENNRDEyIHN1cHBvcnQgKi8KICNkZWZpbmUgU0RIQ0lfQVVUT19DTUQyMwkoMTw8NykJLyogQXV0byBDTUQyMyBzdXBwb3J0ICovCisjZGVmaW5lIFNESENJX1BWX0VOQUJMRUQJKDE8PDgpCS8qIFByZXNldCB2YWx1ZSBlbmFibGVkICovCisjZGVmaW5lIFNESENJX1NESU9fSVJRX0VOQUJMRUQJKDE8PDkpCS8qIFNESU8gaXJxIGVuYWJsZWQgKi8KIAogCXVuc2lnbmVkIGludCB2ZXJzaW9uOwkvKiBTREhDSSBzcGVjLiB2ZXJzaW9uICovCiAKQEAgLTEyNSw2ICsxMzEsOCBAQAogCXVuc2lnbmVkIGludCBjbG9jazsJLyogQ3VycmVudCBjbG9jayAoTUh6KSAqLwogCXU4IHB3cjsJCQkvKiBDdXJyZW50IHZvbHRhZ2UgKi8KIAorCWJvb2wgcnVudGltZV9zdXNwZW5kZWQ7CS8qIEhvc3QgaXMgcnVudGltZSBzdXNwZW5kZWQgKi8KKwogCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOwkvKiBDdXJyZW50IHJlcXVlc3QgKi8KIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsJLyogQ3VycmVudCBjb21tYW5kICovCiAJc3RydWN0IG1tY19kYXRhICpkYXRhOwkvKiBDdXJyZW50IGRhdGEgcmVxdWVzdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2Rpby5oIGIvaW5jbHVkZS9saW51eC9tbWMvc2Rpby5oCmluZGV4IDJhMmU5OTAuLmUwYjExMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NkaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zZGlvLmgKQEAgLTcyLDExICs3MiwxMyBAQAogI2RlZmluZSAgU0RJT19DQ0NSX1JFVl8xXzAwCTAJLyogQ0NDUi9GQlIgVmVyc2lvbiAxLjAwICovCiAjZGVmaW5lICBTRElPX0NDQ1JfUkVWXzFfMTAJMQkvKiBDQ0NSL0ZCUiBWZXJzaW9uIDEuMTAgKi8KICNkZWZpbmUgIFNESU9fQ0NDUl9SRVZfMV8yMAkyCS8qIENDQ1IvRkJSIFZlcnNpb24gMS4yMCAqLworI2RlZmluZSAgU0RJT19DQ0NSX1JFVl8zXzAwCTMJLyogQ0NDUi9GQlIgVmVyc2lvbiAzLjAwICovCiAKICNkZWZpbmUgIFNESU9fU0RJT19SRVZfMV8wMAkwCS8qIFNESU8gU3BlYyBWZXJzaW9uIDEuMDAgKi8KICNkZWZpbmUgIFNESU9fU0RJT19SRVZfMV8xMAkxCS8qIFNESU8gU3BlYyBWZXJzaW9uIDEuMTAgKi8KICNkZWZpbmUgIFNESU9fU0RJT19SRVZfMV8yMAkyCS8qIFNESU8gU3BlYyBWZXJzaW9uIDEuMjAgKi8KICNkZWZpbmUgIFNESU9fU0RJT19SRVZfMl8wMAkzCS8qIFNESU8gU3BlYyBWZXJzaW9uIDIuMDAgKi8KKyNkZWZpbmUgIFNESU9fU0RJT19SRVZfM18wMAk0CS8qIFNESU8gU3BlYyBWZXJzaW9uIDMuMDAgKi8KIAogI2RlZmluZSBTRElPX0NDQ1JfU0QJCTB4MDEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2hfbW1jaWYuaCBiL2luY2x1ZGUvbGludXgvbW1jL3NoX21tY2lmLmgKaW5kZXggMDIyMmNkOC4uMDRmZjQ1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvc2hfbW1jaWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zaF9tbWNpZi5oCkBAIC00MSw3ICs0MSw5IEBACiAJdm9pZCAoKnNldF9wd3IpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBzdGF0ZSk7CiAJdm9pZCAoKmRvd25fcHdyKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIAlpbnQgKCpnZXRfY2QpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZWYpOwotCXN0cnVjdCBzaF9tbWNpZl9kbWEJKmRtYTsKKwlzdHJ1Y3Qgc2hfbW1jaWZfZG1hCSpkbWE7CQkvKiBEZXByZWNhdGVkLiBJbnN0ZWFkICovCisJdW5zaWduZWQgaW50CQlzbGF2ZV9pZF90eDsJLyogdXNlIGVtYmVkZGVkIHNsYXZlX2lkX1t0cl14ICovCisJdW5zaWduZWQgaW50CQlzbGF2ZV9pZF9yeDsKIAl1OAkJCXN1cF9wY2xrOwkvKiAxIDpTSDc3NTcsIDA6IFNINzcyNC9TSDczNzIgKi8KIAl1bnNpZ25lZCBsb25nCQljYXBzOwogCXUzMgkJCW9jcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zaF9tb2JpbGVfc2RoaS5oCmluZGV4IGJkNTBiMzYuLjcxYjgwNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaApAQCAtNiw2ICs2LDEwIEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOwogc3RydWN0IHRtaW9fbW1jX2RhdGE7CiAKKyNkZWZpbmUgU0hfTU9CSUxFX1NESElfSVJRX0NBUkRfREVURUNUCSJjYXJkX2RldGVjdCIKKyNkZWZpbmUgU0hfTU9CSUxFX1NESElfSVJRX1NEQ0FSRAkic2RjYXJkIgorI2RlZmluZSBTSF9NT0JJTEVfU0RISV9JUlFfU0RJTwkJInNkaW8iCisKIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHsKIAlpbnQgZG1hX3NsYXZlX3R4OwogCWludCBkbWFfc2xhdmVfcng7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21taW90cmFjZS5oIGIvaW5jbHVkZS9saW51eC9tbWlvdHJhY2UuaAppbmRleCA5NzQ5MWY3Li5jNWQ1Mjc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21taW90cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1pb3RyYWNlLmgKQEAgLTQ5LDggKzQ5LDcgQEAKIGV4dGVybiB2b2lkIG1taW90cmFjZV9pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CiAKIC8qIEZvciBhbnlvbmUgdG8gaW5zZXJ0IG1hcmtlcnMuIFJlbWVtYmVyIHRyYWlsaW5nIG5ld2xpbmUuICovCi1leHRlcm4gaW50IG1taW90cmFjZV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCi0JCQkJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIF9fcHJpbnRmKDEsIDIpIGludCBtbWlvdHJhY2VfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKICNlbHNlIC8qICFDT05GSUdfTU1JT1RSQUNFOiAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfa21taW9fYWN0aXZlKHZvaWQpCiB7CkBAIC03MSwxMCArNzAsNyBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIGludCBtbWlvdHJhY2VfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCQkJCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMCkpKTsKLQotc3RhdGljIGlubGluZSBpbnQgbW1pb3RyYWNlX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMSwgMikgaW50IG1taW90cmFjZV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCBiZTFhYzhkLi4xODhjYjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTEwMCw2ICsxMDAsNyBAQAogCU5SX1VOU1RBQkxFX05GUywJLyogTkZTIHVuc3RhYmxlIHBhZ2VzICovCiAJTlJfQk9VTkNFLAogCU5SX1ZNU0NBTl9XUklURSwKKwlOUl9WTVNDQU5fSU1NRURJQVRFLAkvKiBQcmlvcml0aXNlIGZvciByZWNsYWltIHdoZW4gd3JpdGViYWNrIGVuZHMgKi8KIAlOUl9XUklURUJBQ0tfVEVNUCwJLyogV3JpdGViYWNrIHVzaW5nIHRlbXBvcmFyeSBidWZmZXJzICovCiAJTlJfSVNPTEFURURfQU5PTiwJLyogVGVtcG9yYXJ5IGlzb2xhdGVkIHBhZ2VzIGZyb20gYW5vbiBscnUgKi8KIAlOUl9JU09MQVRFRF9GSUxFLAkvKiBUZW1wb3JhcnkgaXNvbGF0ZWQgcGFnZXMgZnJvbSBmaWxlIGxydSAqLwpAQCAtMTY0LDYgKzE2NSwxOCBAQAogI2RlZmluZSBMUlVfQUxMX0VWSUNUQUJMRSAoTFJVX0FMTF9GSUxFIHwgTFJVX0FMTF9BTk9OKQogI2RlZmluZSBMUlVfQUxMCSAgICAgKCgxIDw8IE5SX0xSVV9MSVNUUykgLSAxKQogCisvKiBJc29sYXRlIGluYWN0aXZlIHBhZ2VzICovCisjZGVmaW5lIElTT0xBVEVfSU5BQ1RJVkUJKChfX2ZvcmNlIGlzb2xhdGVfbW9kZV90KTB4MSkKKy8qIElzb2xhdGUgYWN0aXZlIHBhZ2VzICovCisjZGVmaW5lIElTT0xBVEVfQUNUSVZFCQkoKF9fZm9yY2UgaXNvbGF0ZV9tb2RlX3QpMHgyKQorLyogSXNvbGF0ZSBjbGVhbiBmaWxlICovCisjZGVmaW5lIElTT0xBVEVfQ0xFQU4JCSgoX19mb3JjZSBpc29sYXRlX21vZGVfdCkweDQpCisvKiBJc29sYXRlIHVubWFwcGVkIGZpbGUgKi8KKyNkZWZpbmUgSVNPTEFURV9VTk1BUFBFRAkoKF9fZm9yY2UgaXNvbGF0ZV9tb2RlX3QpMHg4KQorCisvKiBMUlUgSXNvbGF0aW9uIG1vZGVzLiAqLwordHlwZWRlZiB1bnNpZ25lZCBfX2JpdHdpc2VfXyBpc29sYXRlX21vZGVfdDsKKwogZW51bSB6b25lX3dhdGVybWFya3MgewogCVdNQVJLX01JTiwKIAlXTUFSS19MT1csCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCA4NjM5MjE2Li4zY2I3ODM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vbW9kdWxlLmg+CkBAIC0yNSwyMSArMjYsOCBAQAogLyogTm90IFlldCBJbXBsZW1lbnRlZCAqLwogI2RlZmluZSBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRShuYW1lKQogCi0vKiBTb21lIHRvb2xjaGFpbnMgdXNlIGEgYF8nIHByZWZpeCBmb3IgYWxsIHVzZXIgc3ltYm9scy4gKi8KLSNpZmRlZiBDT05GSUdfU1lNQk9MX1BSRUZJWAotI2RlZmluZSBNT0RVTEVfU1lNQk9MX1BSRUZJWCBDT05GSUdfU1lNQk9MX1BSRUZJWAotI2Vsc2UKLSNkZWZpbmUgTU9EVUxFX1NZTUJPTF9QUkVGSVggIiIKLSNlbmRpZgotCiAjZGVmaW5lIE1PRFVMRV9OQU1FX0xFTiBNQVhfUEFSQU1fUFJFRklYX0xFTgogCi1zdHJ1Y3Qga2VybmVsX3N5bWJvbAotewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KIHN0cnVjdCBtb2R2ZXJzaW9uX2luZm8KIHsKIAl1bnNpZ25lZCBsb25nIGNyYzsKQEAgLTk4LDExICs4Niw4IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGd0eXBlIyNfaWQgX19tb2RfIyNndHlwZSMjX3RhYmxlCQlcCiAgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsIGFsaWFzKF9fc3RyaW5naWZ5KG5hbWUpKSkpCiAKLWV4dGVybiBzdHJ1Y3QgbW9kdWxlIF9fdGhpc19tb2R1bGU7Ci0jZGVmaW5lIFRISVNfTU9EVUxFICgmX190aGlzX21vZHVsZSkKICNlbHNlICAvKiAhTU9EVUxFICovCiAjZGVmaW5lIE1PRFVMRV9HRU5FUklDX1RBQkxFKGd0eXBlLG5hbWUpCi0jZGVmaW5lIFRISVNfTU9EVUxFICgoc3RydWN0IG1vZHVsZSAqKTApCiAjZW5kaWYKIAogLyogR2VuZXJpYyBpbmZvIG9mIGZvcm0gdGFnID0gImluZm8iICovCkBAIC0xNTAsMTEgKzEzNSw2IEBACiAvKiBXaGF0IHlvdXIgbW9kdWxlIGRvZXMuICovCiAjZGVmaW5lIE1PRFVMRV9ERVNDUklQVElPTihfZGVzY3JpcHRpb24pIE1PRFVMRV9JTkZPKGRlc2NyaXB0aW9uLCBfZGVzY3JpcHRpb24pCiAKLS8qIE9uZSBmb3IgZWFjaCBwYXJhbWV0ZXIsIGRlc2NyaWJpbmcgaG93IHRvIHVzZSBpdC4gIFNvbWUgZmlsZXMgZG8KLSAgIG11bHRpcGxlIG9mIHRoZXNlIHBlciBsaW5lLCBzbyBjYW4ndCBqdXN0IHVzZSBNT0RVTEVfSU5GTy4gKi8KLSNkZWZpbmUgTU9EVUxFX1BBUk1fREVTQyhfcGFybSwgZGVzYykgXAotCV9fTU9EVUxFX0lORk8ocGFybSwgX3Bhcm0sICNfcGFybSAiOiIgZGVzYykKLQogI2RlZmluZSBNT0RVTEVfREVWSUNFX1RBQkxFKHR5cGUsbmFtZSkJCVwKICAgTU9EVUxFX0dFTkVSSUNfVEFCTEUodHlwZSMjX2RldmljZSxuYW1lKQogCkBAIC0yMTgsNTIgKzE5OCw2IEBACiAJc3RydWN0IG1vZHVsZSAqc291cmNlLCAqdGFyZ2V0OwogfTsKIAotI2lmbmRlZiBfX0dFTktTWU1TX18KLSNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKLS8qIE1hcmsgdGhlIENSQyB3ZWFrIHNpbmNlIGdlbmtzeW1zIGFwcGFyZW50bHkgZGVjaWRlcyBub3QgdG8KLSAqIGdlbmVyYXRlIGEgY2hlY2tzdW1zIGZvciBzb21lIHN5bWJvbHMgKi8KLSNkZWZpbmUgX19DUkNfU1lNQk9MKHN5bSwgc2VjKQkJCQkJXAotCWV4dGVybiB2b2lkICpfX2NyY18jI3N5bSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CQlcCi0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgX19rY3JjdGFiXyMjc3ltCQlcCi0JX191c2VkCQkJCQkJCVwKLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX19rY3JjdGFiIiBzZWMgIisiICNzeW0pLCB1bnVzZWQpKQlcCi0JPSAodW5zaWduZWQgbG9uZykgJl9fY3JjXyMjc3ltOwotI2Vsc2UKLSNkZWZpbmUgX19DUkNfU1lNQk9MKHN5bSwgc2VjKQotI2VuZGlmCi0KLS8qIEZvciBldmVyeSBleHBvcnRlZCBzeW1ib2wsIHBsYWNlIGEgc3RydWN0IGluIHRoZSBfX2tzeW10YWIgc2VjdGlvbiAqLwotI2RlZmluZSBfX0VYUE9SVF9TWU1CT0woc3ltLCBzZWMpCQkJCVwKLQlleHRlcm4gdHlwZW9mKHN5bSkgc3ltOwkJCQkJXAotCV9fQ1JDX1NZTUJPTChzeW0sIHNlYykJCQkJCVwKLQlzdGF0aWMgY29uc3QgY2hhciBfX2tzdHJ0YWJfIyNzeW1bXQkJCVwKLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX2tzeW10YWJfc3RyaW5ncyIpLCBhbGlnbmVkKDEpKSkgXAotCT0gTU9EVUxFX1NZTUJPTF9QUkVGSVggI3N5bTsgICAgICAgICAgICAgICAgICAgIAlcCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBrZXJuZWxfc3ltYm9sIF9fa3N5bXRhYl8jI3N5bQlcCi0JX191c2VkCQkJCQkJCVwKLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX19rc3ltdGFiIiBzZWMgIisiICNzeW0pLCB1bnVzZWQpKQlcCi0JPSB7ICh1bnNpZ25lZCBsb25nKSZzeW0sIF9fa3N0cnRhYl8jI3N5bSB9Ci0KLSNkZWZpbmUgRVhQT1JUX1NZTUJPTChzeW0pCQkJCQlcCi0JX19FWFBPUlRfU1lNQk9MKHN5bSwgIiIpCi0KLSNkZWZpbmUgRVhQT1JUX1NZTUJPTF9HUEwoc3ltKQkJCQkJXAotCV9fRVhQT1JUX1NZTUJPTChzeW0sICJfZ3BsIikKLQotI2RlZmluZSBFWFBPUlRfU1lNQk9MX0dQTF9GVVRVUkUoc3ltKQkJCQlcCi0JX19FWFBPUlRfU1lNQk9MKHN5bSwgIl9ncGxfZnV0dXJlIikKLQotCi0jaWZkZWYgQ09ORklHX1VOVVNFRF9TWU1CT0xTCi0jZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MKHN5bSkgX19FWFBPUlRfU1lNQk9MKHN5bSwgIl91bnVzZWQiKQotI2RlZmluZSBFWFBPUlRfVU5VU0VEX1NZTUJPTF9HUEwoc3ltKSBfX0VYUE9SVF9TWU1CT0woc3ltLCAiX3VudXNlZF9ncGwiKQotI2Vsc2UKLSNkZWZpbmUgRVhQT1JUX1VOVVNFRF9TWU1CT0woc3ltKQotI2RlZmluZSBFWFBPUlRfVU5VU0VEX1NZTUJPTF9HUEwoc3ltKQotI2VuZGlmCi0KLSNlbmRpZgotCiBlbnVtIG1vZHVsZV9zdGF0ZQogewogCU1PRFVMRV9TVEFURV9MSVZFLApAQCAtNTgxLDExICs1MTUsNiBAQAogZXh0ZXJuIHZvaWQgcHJpbnRfbW9kdWxlcyh2b2lkKTsKIAogI2Vsc2UgLyogIUNPTkZJR19NT0RVTEVTLi4uICovCi0jZGVmaW5lIEVYUE9SVF9TWU1CT0woc3ltKQotI2RlZmluZSBFWFBPUlRfU1lNQk9MX0dQTChzeW0pCi0jZGVmaW5lIEVYUE9SVF9TWU1CT0xfR1BMX0ZVVFVSRShzeW0pCi0jZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MKHN5bSkKLSNkZWZpbmUgRVhQT1JUX1VOVVNFRF9TWU1CT0xfR1BMKHN5bSkKIAogLyogR2l2ZW4gYW4gYWRkcmVzcywgbG9vayBmb3IgaXQgaW4gdGhlIGV4Y2VwdGlvbiB0YWJsZXMuICovCiBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGVwYXJhbS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGVwYXJhbS5oCmluZGV4IGZmZmIxMGIuLjc5MzlmNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kdWxlcGFyYW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZXBhcmFtLmgKQEAgLTMxLDYgKzMxLDExIEBACiAjZGVmaW5lIF9fTU9EVUxFX1BBUk1fVFlQRShuYW1lLCBfdHlwZSkJCQkJCSAgXAogICBfX01PRFVMRV9JTkZPKHBhcm10eXBlLCBuYW1lIyN0eXBlLCAjbmFtZSAiOiIgX3R5cGUpCiAKKy8qIE9uZSBmb3IgZWFjaCBwYXJhbWV0ZXIsIGRlc2NyaWJpbmcgaG93IHRvIHVzZSBpdC4gIFNvbWUgZmlsZXMgZG8KKyAgIG11bHRpcGxlIG9mIHRoZXNlIHBlciBsaW5lLCBzbyBjYW4ndCBqdXN0IHVzZSBNT0RVTEVfSU5GTy4gKi8KKyNkZWZpbmUgTU9EVUxFX1BBUk1fREVTQyhfcGFybSwgZGVzYykgXAorCV9fTU9EVUxFX0lORk8ocGFybSwgX3Bhcm0sICNfcGFybSAiOiIgZGVzYykKKwogc3RydWN0IGtlcm5lbF9wYXJhbTsKIAogc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvYmJtLmggYi9pbmNsdWRlL2xpbnV4L210ZC9iYm0uaAppbmRleCA1N2NjMGU2Li5jNGVlYzIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9iYm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9iYm0uaApAQCAtODYsMjQgKzg2LDM5IEBACiAjZGVmaW5lIE5BTkRfQkJUX1ZFUlNJT04JMHgwMDAwMDEwMAogLyogQ3JlYXRlIGEgYmJ0IGlmIG5vbmUgZXhpc3RzICovCiAjZGVmaW5lIE5BTkRfQkJUX0NSRUFURQkJMHgwMDAwMDIwMAorLyoKKyAqIENyZWF0ZSBhbiBlbXB0eSBCQlQgd2l0aCBubyB2ZW5kb3IgaW5mb3JtYXRpb24uIFZlbmRvcidzIGluZm9ybWF0aW9uIG1heSBiZQorICogdW5hdmFpbGFibGUsIGZvciBleGFtcGxlLCBpZiB0aGUgTkFORCBjb250cm9sbGVyIGhhcyBhIGRpZmZlcmVudCBkYXRhIGFuZCBPT0IKKyAqIGxheW91dCBvciBpZiB0aGlzIGluZm9ybWF0aW9uIGlzIGFscmVhZHkgcHVyZ2VkLiBNdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24KKyAqIHdpdGggTkFORF9CQlRfQ1JFQVRFLgorICovCisjZGVmaW5lIE5BTkRfQkJUX0NSRUFURV9FTVBUWQkweDAwMDAwNDAwCiAvKiBTZWFyY2ggZ29vZCAvIGJhZCBwYXR0ZXJuIHRocm91Z2ggYWxsIHBhZ2VzIG9mIGEgYmxvY2sgKi8KLSNkZWZpbmUgTkFORF9CQlRfU0NBTkFMTFBBR0VTCTB4MDAwMDA0MDAKKyNkZWZpbmUgTkFORF9CQlRfU0NBTkFMTFBBR0VTCTB4MDAwMDA4MDAKIC8qIFNjYW4gYmxvY2sgZW1wdHkgZHVyaW5nIGdvb2QgLyBiYWQgYmxvY2sgc2NhbiAqLwotI2RlZmluZSBOQU5EX0JCVF9TQ0FORU1QVFkJMHgwMDAwMDgwMAorI2RlZmluZSBOQU5EX0JCVF9TQ0FORU1QVFkJMHgwMDAwMTAwMAogLyogV3JpdGUgYmJ0IGlmIG5lY2NlY2FyeSAqLwotI2RlZmluZSBOQU5EX0JCVF9XUklURQkJMHgwMDAwMTAwMAorI2RlZmluZSBOQU5EX0JCVF9XUklURQkJMHgwMDAwMjAwMAogLyogUmVhZCBhbmQgd3JpdGUgYmFjayBibG9jayBjb250ZW50cyB3aGVuIHdyaXRpbmcgYmJ0ICovCi0jZGVmaW5lIE5BTkRfQkJUX1NBVkVDT05URU5UCTB4MDAwMDIwMDAKKyNkZWZpbmUgTkFORF9CQlRfU0FWRUNPTlRFTlQJMHgwMDAwNDAwMAogLyogU2VhcmNoIGdvb2QgLyBiYWQgcGF0dGVybiBvbiB0aGUgZmlyc3QgYW5kIHRoZSBzZWNvbmQgcGFnZSAqLwotI2RlZmluZSBOQU5EX0JCVF9TQ0FOMk5EUEFHRQkweDAwMDA0MDAwCisjZGVmaW5lIE5BTkRfQkJUX1NDQU4yTkRQQUdFCTB4MDAwMDgwMDAKIC8qIFNlYXJjaCBnb29kIC8gYmFkIHBhdHRlcm4gb24gdGhlIGxhc3QgcGFnZSBvZiB0aGUgZXJhc2VibG9jayAqLwotI2RlZmluZSBOQU5EX0JCVF9TQ0FOTEFTVFBBR0UJMHgwMDAwODAwMAotLyogQ2hpcCBzdG9yZXMgYmFkIGJsb2NrIG1hcmtlciBvbiBCT1RIIDFzdCBhbmQgNnRoIGJ5dGVzIG9mIE9PQiAqLwotI2RlZmluZSBOQU5EX0JCVF9TQ0FOQllURTFBTkQ2IDB4MDAxMDAwMDAKLS8qIFRoZSBuYW5kX2JidF9kZXNjciB3YXMgY3JlYXRlZCBkeW5hbWljYWx5IGFuZCBtdXN0IGJlIGZyZWVkICovCi0jZGVmaW5lIE5BTkRfQkJUX0RZTkFNSUNTVFJVQ1QgMHgwMDIwMDAwMAotLyogVGhlIGJhZCBibG9jayB0YWJsZSBkb2VzIG5vdCBPT0IgZm9yIG1hcmtlciAqLwotI2RlZmluZSBOQU5EX0JCVF9OT19PT0IJCTB4MDA0MDAwMDAKKyNkZWZpbmUgTkFORF9CQlRfU0NBTkxBU1RQQUdFCTB4MDAwMTAwMDAKKy8qCisgKiBVc2UgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUuIEJ5IGRlZmF1bHQsIE9PQiBpZGVudGlmaWVyIGlzIHNhdmVkIGluCisgKiBPT0IgYXJlYS4gVGhpcyBvcHRpb24gaXMgcGFzc2VkIHRvIHRoZSBkZWZhdWx0IGJhZCBibG9jayB0YWJsZSBmdW5jdGlvbi4KKyAqLworI2RlZmluZSBOQU5EX0JCVF9VU0VfRkxBU0gJMHgwMDAyMDAwMAorLyogRG8gbm90IHN0b3JlIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSBpbiBPT0IgYXJlYTsgc3RvcmUgaXQgaW4tYmFuZCAqLworI2RlZmluZSBOQU5EX0JCVF9OT19PT0IJCTB4MDAwNDAwMDAKKworLyoKKyAqIEZsYWcgc2V0IGJ5IG5hbmRfY3JlYXRlX2RlZmF1bHRfYmJ0X2Rlc2NyKCksIG1hcmtpbmcgdGhhdCB0aGUgbmFuZF9iYnRfZGVzY3IKKyAqIHdhcyBhbGxvY2F0ZWQgZHluYW1pY2FseSBhbmQgbXVzdCBiZSBmcmVlZCBpbiBuYW5kX3JlbGVhc2UoKS4gSGFzIG5vIG1lYW5pbmcKKyAqIGluIG5hbmRfY2hpcC5iYnRfb3B0aW9ucy4KKyAqLworI2RlZmluZSBOQU5EX0JCVF9EWU5BTUlDU1RSVUNUCTB4ODAwMDAwMDAKIAogLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyB0byBzY2FuIGZvciBhIGJidCAqLwogI2RlZmluZSBOQU5EX0JCVF9TQ0FOX01BWEJMT0NLUwk0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaCBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCmluZGV4IDI1NDFmYjguLjlmNWIzMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCkBAIC0yMSw3ICsyMSw2IEBACiAjZGVmaW5lIF9fTVREX01URF9IX18KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTMzLDE3ICszMiwxOSBAQAogI2RlZmluZSBNVERfQ0hBUl9NQUpPUiA5MAogI2RlZmluZSBNVERfQkxPQ0tfTUFKT1IgMzEKIAotI2RlZmluZSBNVERfRVJBU0VfUEVORElORyAgICAgIAkweDAxCisjZGVmaW5lIE1URF9FUkFTRV9QRU5ESU5HCTB4MDEKICNkZWZpbmUgTVREX0VSQVNJTkcJCTB4MDIKICNkZWZpbmUgTVREX0VSQVNFX1NVU1BFTkQJMHgwNAotI2RlZmluZSBNVERfRVJBU0VfRE9ORSAgICAgICAgICAweDA4Ci0jZGVmaW5lIE1URF9FUkFTRV9GQUlMRUQgICAgICAgIDB4MTAKKyNkZWZpbmUgTVREX0VSQVNFX0RPTkUJCTB4MDgKKyNkZWZpbmUgTVREX0VSQVNFX0ZBSUxFRAkweDEwCiAKICNkZWZpbmUgTVREX0ZBSUxfQUREUl9VTktOT1dOIC0xTEwKIAotLyogSWYgdGhlIGVyYXNlIGZhaWxzLCBmYWlsX2FkZHIgbWlnaHQgaW5kaWNhdGUgZXhhY3RseSB3aGljaCBibG9jayBmYWlsZWQuICBJZgotICAgZmFpbF9hZGRyID0gTVREX0ZBSUxfQUREUl9VTktOT1dOLCB0aGUgZmFpbHVyZSB3YXMgbm90IGF0IHRoZSBkZXZpY2UgbGV2ZWwgb3Igd2FzIG5vdAotICAgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIgYmxvY2suICovCisvKgorICogSWYgdGhlIGVyYXNlIGZhaWxzLCBmYWlsX2FkZHIgbWlnaHQgaW5kaWNhdGUgZXhhY3RseSB3aGljaCBibG9jayBmYWlsZWQuIElmCisgKiBmYWlsX2FkZHIgPSBNVERfRkFJTF9BRERSX1VOS05PV04sIHRoZSBmYWlsdXJlIHdhcyBub3QgYXQgdGhlIGRldmljZSBsZXZlbAorICogb3Igd2FzIG5vdCBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBibG9jay4KKyAqLwogc3RydWN0IGVyYXNlX2luZm8gewogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCXVpbnQ2NF90IGFkZHI7CkBAIC02MCwyNiArNjEsMTIgQEAKIH07CiAKIHN0cnVjdCBtdGRfZXJhc2VfcmVnaW9uX2luZm8gewotCXVpbnQ2NF90IG9mZnNldDsJCQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCisJdWludDY0X3Qgb2Zmc2V0OwkJLyogQXQgd2hpY2ggdGhpcyByZWdpb24gc3RhcnRzLCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1URCAqLwogCXVpbnQzMl90IGVyYXNlc2l6ZTsJCS8qIEZvciB0aGlzIHJlZ2lvbiAqLwogCXVpbnQzMl90IG51bWJsb2NrczsJCS8qIE51bWJlciBvZiBibG9ja3Mgb2YgZXJhc2VzaXplIGluIHRoaXMgcmVnaW9uICovCiAJdW5zaWduZWQgbG9uZyAqbG9ja21hcDsJCS8qIElmIGtlZXBpbmcgYml0bWFwIG9mIGxvY2tzICovCiB9OwogCi0vKgotICogb29iIG9wZXJhdGlvbiBtb2RlcwotICoKLSAqIE1URF9PT0JfUExBQ0U6CW9vYiBkYXRhIGFyZSBwbGFjZWQgYXQgdGhlIGdpdmVuIG9mZnNldAotICogTVREX09PQl9BVVRPOglvb2IgZGF0YSBhcmUgYXV0b21hdGljYWxseSBwbGFjZWQgYXQgdGhlIGZyZWUgYXJlYXMKLSAqCQkJd2hpY2ggYXJlIGRlZmluZWQgYnkgdGhlIGVjY2xheW91dAotICogTVREX09PQl9SQVc6CQltb2RlIHRvIHJlYWQgb29iIGFuZCBkYXRhIHdpdGhvdXQgZG9pbmcgRUNDIGNoZWNraW5nCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0JTVREX09PQl9QTEFDRSwKLQlNVERfT09CX0FVVE8sCi0JTVREX09PQl9SQVcsCi19IG10ZF9vb2JfbW9kZV90OwotCiAvKioKICAqIHN0cnVjdCBtdGRfb29iX29wcyAtIG9vYiBvcGVyYXRpb24gb3BlcmFuZHMKICAqIEBtb2RlOglvcGVyYXRpb24gbW9kZQpAQCAtOTEsNyArNzgsNyBAQAogICogQG9vYmxlbjoJbnVtYmVyIG9mIG9vYiBieXRlcyB0byB3cml0ZS9yZWFkCiAgKiBAb29icmV0bGVuOgludW1iZXIgb2Ygb29iIGJ5dGVzIHdyaXR0ZW4vcmVhZAogICogQG9vYm9mZnM6CW9mZnNldCBvZiBvb2IgZGF0YSBpbiB0aGUgb29iIGFyZWEgKG9ubHkgcmVsZXZhbnQgd2hlbgotICoJCW1vZGUgPSBNVERfT09CX1BMQUNFKQorICoJCW1vZGUgPSBNVERfT1BTX1BMQUNFX09PQiBvciBNVERfT1BTX1JBVykKICAqIEBkYXRidWY6CWRhdGEgYnVmZmVyIC0gaWYgTlVMTCBvbmx5IG9vYiBkYXRhIGFyZSByZWFkL3dyaXR0ZW4KICAqIEBvb2JidWY6CW9vYiBkYXRhIGJ1ZmZlcgogICoKQEAgLTEwMCw3ICs4Nyw3IEBACiAgKiBPT0IgYXJlYS4KICAqLwogc3RydWN0IG10ZF9vb2Jfb3BzIHsKLQltdGRfb29iX21vZGVfdAltb2RlOworCXVuc2lnbmVkIGludAltb2RlOwogCXNpemVfdAkJbGVuOwogCXNpemVfdAkJcmV0bGVuOwogCXNpemVfdAkJb29ibGVuOwpAQCAtMTI1LDYgKzExMiw4IEBACiAJc3RydWN0IG5hbmRfb29iZnJlZSBvb2JmcmVlW01URF9NQVhfT09CRlJFRV9FTlRSSUVTX0xBUkdFXTsKIH07CiAKK3N0cnVjdCBtb2R1bGU7CS8qIG9ubHkgbmVlZGVkIGZvciBvd25lciBmaWVsZCBpbiBtdGRfaW5mbyAqLworCiBzdHJ1Y3QgbXRkX2luZm8gewogCXVfY2hhciB0eXBlOwogCXVpbnQzMl90IGZsYWdzOwpAQCAtMTcyLDcgKzE2MSw3IEBACiAJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgaW5kZXg7CiAKLQkvKiBlY2MgbGF5b3V0IHN0cnVjdHVyZSBwb2ludGVyIC0gcmVhZCBvbmx5ICEgKi8KKwkvKiBFQ0MgbGF5b3V0IHN0cnVjdHVyZSBwb2ludGVyIC0gcmVhZCBvbmx5ISAqLwogCXN0cnVjdCBuYW5kX2VjY2xheW91dCAqZWNjbGF5b3V0OwogCiAJLyogRGF0YSBmb3IgdmFyaWFibGUgZXJhc2UgcmVnaW9ucy4gSWYgbnVtZXJhc2VyZWdpb25zIGlzIHplcm8sCkBAIC0zMjMsMTAgKzMxMiwxNSBAQAogCS8qIEtlcm5lbC1zaWRlIGlvY3RsIGRlZmluaXRpb25zICovCiAKIHN0cnVjdCBtdGRfcGFydGl0aW9uOworc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhOwogCi1leHRlcm4gaW50IG10ZF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG10ZF9pbmZvICptYXN0ZXIsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzLAotCQkJICAgICAgIGludCBucl9wYXJ0cyk7CitleHRlcm4gaW50IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkgICAgICBjb25zdCBjaGFyICoqcGFydF9wcm9iZV90eXBlcywKKwkJCSAgICAgIHN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSAqcGFyc2VyX2RhdGEsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqZGVmcGFydHMsCisJCQkgICAgICBpbnQgZGVmbnJfcGFydHMpOworI2RlZmluZSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG1hc3RlciwgcGFydHMsIG5yX3BhcnRzKQlcCisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtYXN0ZXIsIE5VTEwsIE5VTEwsIHBhcnRzLCBucl9wYXJ0cykKIGV4dGVybiBpbnQgbXRkX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyKTsKIGV4dGVybiBzdHJ1Y3QgbXRkX2luZm8gKmdldF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbnVtKTsKIGV4dGVybiBpbnQgX19nZXRfbXRkX2RldmljZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CkBAIC0zNTUsMjcgKzM0OSwxNiBAQAogCiB2b2lkIG10ZF9lcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpOwogCi0vKgotICogRGVidWdnaW5nIG1hY3JvIGFuZCBkZWZpbmVzCi0gKi8KLSNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMAkoMCkJLyogUXVpZXQgICAqLwotI2RlZmluZSBNVERfREVCVUdfTEVWRUwxCSgxKQkvKiBBdWRpYmxlICovCi0jZGVmaW5lIE1URF9ERUJVR19MRVZFTDIJKDIpCS8qIExvdWQgICAgKi8KLSNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMwkoMykJLyogTm9pc3kgICAqLworc3RhdGljIGlubGluZSBpbnQgbXRkX2lzX2JpdGZsaXAoaW50IGVycikgeworCXJldHVybiBlcnIgPT0gLUVVQ0xFQU47Cit9CiAKLSNpZmRlZiBDT05GSUdfTVREX0RFQlVHCi0jZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCQkJCVwKLQlkbyB7CQkJCQkJXAotCQlpZiAobiA8PSBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UpCVwKLQkJCXByaW50ayhLRVJOX0lORk8gYXJncyk7CQlcCi0JfSB3aGlsZSgwKQotI2Vsc2UgLyogQ09ORklHX01URF9ERUJVRyAqLwotI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJaWYgKDApCQkJCQlcCi0JCQlwcmludGsoS0VSTl9JTkZPIGFyZ3MpOwkJXAotCX0gd2hpbGUoMCkKK3N0YXRpYyBpbmxpbmUgaW50IG10ZF9pc19lY2NlcnIoaW50IGVycikgeworCXJldHVybiBlcnIgPT0gLUVCQURNU0c7Cit9CiAKLSNlbmRpZiAvKiBDT05GSUdfTVREX0RFQlVHICovCitzdGF0aWMgaW5saW5lIGludCBtdGRfaXNfYml0ZmxpcF9vcl9lY2NlcnIoaW50IGVycikgeworCXJldHVybiBtdGRfaXNfYml0ZmxpcChlcnIpIHx8IG10ZF9pc19lY2NlcnIoZXJyKTsKK30KIAogI2VuZGlmIC8qIF9fTVREX01URF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaCBiL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaAppbmRleCBjMmI5YWM0Li45MDQxMzFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIEludGVybmFsIGhlbHBlciBmb3IgYm9hcmQgZHJpdmVycyB3aGljaCBuZWVkIHRvIG92ZXJyaWRlIGNvbW1hbmQgZnVuY3Rpb24gKi8KIGV4dGVybiB2b2lkIG5hbmRfd2FpdF9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CiAKLS8qIGxvY2tzIGFsbCBibG9ja2VzIHByZXNlbnQgaW4gdGhlIGRldmljZSAqLworLyogbG9ja3MgYWxsIGJsb2NrcyBwcmVzZW50IGluIHRoZSBkZXZpY2UgKi8KIGV4dGVybiBpbnQgbmFuZF9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pOwogCi0vKiB1bmxvY2tzIHNwZWNpZmllZCBsb2NrZWQgYmxvY2tlcyAqLworLyogdW5sb2NrcyBzcGVjaWZpZWQgbG9ja2VkIGJsb2NrcyAqLwogZXh0ZXJuIGludCBuYW5kX3VubG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKTsKIAogLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIE5BTkQgY2hpcHMgaW4gYW4gYXJyYXkgKi8KQEAgLTE1MCw3ICsxNTAsNyBAQAogI2RlZmluZSBOQU5EX0VDQ19SRUFECQkwCiAvKiBSZXNldCBIYXJkd2FyZSBFQ0MgZm9yIHdyaXRlICovCiAjZGVmaW5lIE5BTkRfRUNDX1dSSVRFCQkxCi0vKiBFbmFibGUgSGFyZHdhcmUgRUNDIGJlZm9yZSBzeW5kcm9tIGlzIHJlYWQgYmFjayBmcm9tIGZsYXNoICovCisvKiBFbmFibGUgSGFyZHdhcmUgRUNDIGJlZm9yZSBzeW5kcm9tZSBpcyByZWFkIGJhY2sgZnJvbSBmbGFzaCAqLwogI2RlZmluZSBOQU5EX0VDQ19SRUFEU1lOCTIKIAogLyogQml0IG1hc2sgZm9yIGZsYWdzIHBhc3NlZCB0byBkb19uYW5kX3JlYWRfZWNjICovCkBAIC0xNjMsNyArMTYzLDcgQEAKICAqLwogLyogQ2hpcCBjYW4gbm90IGF1dG8gaW5jcmVtZW50IHBhZ2VzICovCiAjZGVmaW5lIE5BTkRfTk9fQVVUT0lOQ1IJMHgwMDAwMDAwMQotLyogQnVzd2l0ZGggaXMgMTYgYml0ICovCisvKiBCdXN3aWR0aCBpcyAxNiBiaXQgKi8KICNkZWZpbmUgTkFORF9CVVNXSURUSF8xNgkweDAwMDAwMDAyCiAvKiBEZXZpY2Ugc3VwcG9ydHMgcGFydGlhbCBwcm9ncmFtbWluZyB3aXRob3V0IHBhZGRpbmcgKi8KICNkZWZpbmUgTkFORF9OT19QQURESU5HCQkweDAwMDAwMDA0CkBAIC0yMTksMjcgKzIxOSwxNSBAQAogI2RlZmluZSBOQU5EX0NISVBPUFRJT05TX01TSwkoMHgwMDAwZmZmZiAmIH5OQU5EX05PX0FVVE9JTkNSKQogCiAvKiBOb24gY2hpcCByZWxhdGVkIG9wdGlvbnMgKi8KLS8qCi0gKiBVc2UgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUuIE9PQiBpZGVudGlmaWVyIGlzIHNhdmVkIGluIE9PQiBhcmVhLgotICogVGhpcyBvcHRpb24gaXMgcGFzc2VkIHRvIHRoZSBkZWZhdWx0IGJhZCBibG9jayB0YWJsZSBmdW5jdGlvbi4KLSAqLwotI2RlZmluZSBOQU5EX1VTRV9GTEFTSF9CQlQJMHgwMDAxMDAwMAogLyogVGhpcyBvcHRpb24gc2tpcHMgdGhlIGJidCBzY2FuIGR1cmluZyBpbml0aWFsaXphdGlvbi4gKi8KLSNkZWZpbmUgTkFORF9TS0lQX0JCVFNDQU4JMHgwMDAyMDAwMAorI2RlZmluZSBOQU5EX1NLSVBfQkJUU0NBTgkweDAwMDEwMDAwCiAvKgogICogVGhpcyBvcHRpb24gaXMgZGVmaW5lZCBpZiB0aGUgYm9hcmQgZHJpdmVyIGFsbG9jYXRlcyBpdHMgb3duIGJ1ZmZlcnMKICAqIChlLmcuIGJlY2F1c2UgaXQgbmVlZHMgdGhlbSBETUEtY29oZXJlbnQpLgogICovCi0jZGVmaW5lIE5BTkRfT1dOX0JVRkZFUlMJMHgwMDA0MDAwMAorI2RlZmluZSBOQU5EX09XTl9CVUZGRVJTCTB4MDAwMjAwMDAKIC8qIENoaXAgbWF5IG5vdCBleGlzdCwgc28gc2lsZW5jZSBhbnkgZXJyb3JzIGluIHNjYW4gKi8KLSNkZWZpbmUgTkFORF9TQ0FOX1NJTEVOVF9OT0RFVgkweDAwMDgwMDAwCi0vKgotICogSWYgcGFzc2VkIGFkZGl0aW9uYWxseSB0byBOQU5EX1VTRV9GTEFTSF9CQlQgdGhlbiBCQlQgY29kZSB3aWxsIG5vdCB0b3VjaAotICogdGhlIE9PQiBhcmVhLgotICovCi0jZGVmaW5lIE5BTkRfVVNFX0ZMQVNIX0JCVF9OT19PT0IJMHgwMDgwMDAwMAotLyogQ3JlYXRlIGFuIGVtcHR5IEJCVCB3aXRoIG5vIHZlbmRvciBpbmZvcm1hdGlvbiBpZiB0aGUgQkJUIGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZSBOQU5EX0NSRUFURV9FTVBUWV9CQlQJCTB4MDEwMDAwMDAKKyNkZWZpbmUgTkFORF9TQ0FOX1NJTEVOVF9OT0RFVgkweDAwMDQwMDAwCiAKIC8qIE9wdGlvbnMgc2V0IGJ5IG5hbmQgc2NhbiAqLwogLyogTmFuZCBzY2FuIGhhcyBhbGxvY2F0ZWQgY29udHJvbGxlciBzdHJ1Y3QgKi8KQEAgLTMzMSwyNyArMzE5LDI5IEBACiB9OwogCiAvKioKLSAqIHN0cnVjdCBuYW5kX2VjY19jdHJsIC0gQ29udHJvbCBzdHJ1Y3R1cmUgZm9yIGVjYwotICogQG1vZGU6CWVjYyBtb2RlCi0gKiBAc3RlcHM6CW51bWJlciBvZiBlY2Mgc3RlcHMgcGVyIHBhZ2UKLSAqIEBzaXplOglkYXRhIGJ5dGVzIHBlciBlY2Mgc3RlcAotICogQGJ5dGVzOgllY2MgYnl0ZXMgcGVyIHN0ZXAKLSAqIEB0b3RhbDoJdG90YWwgbnVtYmVyIG9mIGVjYyBieXRlcyBwZXIgcGFnZQotICogQHByZXBhZDoJcGFkZGluZyBpbmZvcm1hdGlvbiBmb3Igc3luZHJvbWUgYmFzZWQgZWNjIGdlbmVyYXRvcnMKLSAqIEBwb3N0cGFkOglwYWRkaW5nIGluZm9ybWF0aW9uIGZvciBzeW5kcm9tZSBiYXNlZCBlY2MgZ2VuZXJhdG9ycworICogc3RydWN0IG5hbmRfZWNjX2N0cmwgLSBDb250cm9sIHN0cnVjdHVyZSBmb3IgRUNDCisgKiBAbW9kZToJRUNDIG1vZGUKKyAqIEBzdGVwczoJbnVtYmVyIG9mIEVDQyBzdGVwcyBwZXIgcGFnZQorICogQHNpemU6CWRhdGEgYnl0ZXMgcGVyIEVDQyBzdGVwCisgKiBAYnl0ZXM6CUVDQyBieXRlcyBwZXIgc3RlcAorICogQHRvdGFsOgl0b3RhbCBudW1iZXIgb2YgRUNDIGJ5dGVzIHBlciBwYWdlCisgKiBAcHJlcGFkOglwYWRkaW5nIGluZm9ybWF0aW9uIGZvciBzeW5kcm9tZSBiYXNlZCBFQ0MgZ2VuZXJhdG9ycworICogQHBvc3RwYWQ6CXBhZGRpbmcgaW5mb3JtYXRpb24gZm9yIHN5bmRyb21lIGJhc2VkIEVDQyBnZW5lcmF0b3JzCiAgKiBAbGF5b3V0OglFQ0MgbGF5b3V0IGNvbnRyb2wgc3RydWN0IHBvaW50ZXIKLSAqIEBwcml2Oglwb2ludGVyIHRvIHByaXZhdGUgZWNjIGNvbnRyb2wgZGF0YQotICogQGh3Y3RsOglmdW5jdGlvbiB0byBjb250cm9sIGhhcmR3YXJlIGVjYyBnZW5lcmF0b3IuIE11c3Qgb25seQorICogQHByaXY6CXBvaW50ZXIgdG8gcHJpdmF0ZSBFQ0MgY29udHJvbCBkYXRhCisgKiBAaHdjdGw6CWZ1bmN0aW9uIHRvIGNvbnRyb2wgaGFyZHdhcmUgRUNDIGdlbmVyYXRvci4gTXVzdCBvbmx5CiAgKgkJYmUgcHJvdmlkZWQgaWYgYW4gaGFyZHdhcmUgRUNDIGlzIGF2YWlsYWJsZQotICogQGNhbGN1bGF0ZToJZnVuY3Rpb24gZm9yIGVjYyBjYWxjdWxhdGlvbiBvciByZWFkYmFjayBmcm9tIGVjYyBoYXJkd2FyZQotICogQGNvcnJlY3Q6CWZ1bmN0aW9uIGZvciBlY2MgY29ycmVjdGlvbiwgbWF0Y2hpbmcgdG8gZWNjIGdlbmVyYXRvciAoc3cvaHcpCisgKiBAY2FsY3VsYXRlOglmdW5jdGlvbiBmb3IgRUNDIGNhbGN1bGF0aW9uIG9yIHJlYWRiYWNrIGZyb20gRUNDIGhhcmR3YXJlCisgKiBAY29ycmVjdDoJZnVuY3Rpb24gZm9yIEVDQyBjb3JyZWN0aW9uLCBtYXRjaGluZyB0byBFQ0MgZ2VuZXJhdG9yIChzdy9odykKICAqIEByZWFkX3BhZ2VfcmF3OglmdW5jdGlvbiB0byByZWFkIGEgcmF3IHBhZ2Ugd2l0aG91dCBFQ0MKICAqIEB3cml0ZV9wYWdlX3JhdzoJZnVuY3Rpb24gdG8gd3JpdGUgYSByYXcgcGFnZSB3aXRob3V0IEVDQwotICogQHJlYWRfcGFnZToJZnVuY3Rpb24gdG8gcmVhZCBhIHBhZ2UgYWNjb3JkaW5nIHRvIHRoZSBlY2MgZ2VuZXJhdG9yCisgKiBAcmVhZF9wYWdlOglmdW5jdGlvbiB0byByZWFkIGEgcGFnZSBhY2NvcmRpbmcgdG8gdGhlIEVDQyBnZW5lcmF0b3IKICAqCQlyZXF1aXJlbWVudHMuCiAgKiBAcmVhZF9zdWJwYWdlOglmdW5jdGlvbiB0byByZWFkIHBhcnRzIG9mIHRoZSBwYWdlIGNvdmVyZWQgYnkgRUNDLgotICogQHdyaXRlX3BhZ2U6CWZ1bmN0aW9uIHRvIHdyaXRlIGEgcGFnZSBhY2NvcmRpbmcgdG8gdGhlIGVjYyBnZW5lcmF0b3IKKyAqIEB3cml0ZV9wYWdlOglmdW5jdGlvbiB0byB3cml0ZSBhIHBhZ2UgYWNjb3JkaW5nIHRvIHRoZSBFQ0MgZ2VuZXJhdG9yCiAgKgkJcmVxdWlyZW1lbnRzLgorICogQHdyaXRlX29vYl9yYXc6CWZ1bmN0aW9uIHRvIHdyaXRlIGNoaXAgT09CIGRhdGEgd2l0aG91dCBFQ0MKKyAqIEByZWFkX29vYl9yYXc6CWZ1bmN0aW9uIHRvIHJlYWQgY2hpcCBPT0IgZGF0YSB3aXRob3V0IEVDQwogICogQHJlYWRfb29iOglmdW5jdGlvbiB0byByZWFkIGNoaXAgT09CIGRhdGEKICAqIEB3cml0ZV9vb2I6CWZ1bmN0aW9uIHRvIHdyaXRlIGNoaXAgT09CIGRhdGEKICAqLwpAQCAtMzgwLDYgKzM3MCwxMCBAQAogCQkJdWludDMyX3Qgb2ZmcywgdWludDMyX3QgbGVuLCB1aW50OF90ICpidWYpOwogCXZvaWQgKCp3cml0ZV9wYWdlKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCWNvbnN0IHVpbnQ4X3QgKmJ1Zik7CisJaW50ICgqd3JpdGVfb29iX3Jhdykoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCisJCQlpbnQgcGFnZSk7CisJaW50ICgqcmVhZF9vb2JfcmF3KShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKKwkJCWludCBwYWdlLCBpbnQgc25kY21kKTsKIAlpbnQgKCpyZWFkX29vYikoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBwYWdlLAogCQkJaW50IHNuZGNtZCk7CiAJaW50ICgqd3JpdGVfb29iKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKQEAgLTM4OCw4ICszODIsOCBAQAogCiAvKioKICAqIHN0cnVjdCBuYW5kX2J1ZmZlcnMgLSBidWZmZXIgc3RydWN0dXJlIGZvciByZWFkL3dyaXRlCi0gKiBAZWNjY2FsYzoJYnVmZmVyIGZvciBjYWxjdWxhdGVkIGVjYwotICogQGVjY2NvZGU6CWJ1ZmZlciBmb3IgZWNjIHJlYWQgZnJvbSBmbGFzaAorICogQGVjY2NhbGM6CWJ1ZmZlciBmb3IgY2FsY3VsYXRlZCBFQ0MKKyAqIEBlY2Njb2RlOglidWZmZXIgZm9yIEVDQyByZWFkIGZyb20gZmxhc2gKICAqIEBkYXRhYnVmOglidWZmZXIgZm9yIGRhdGEgLSBkeW5hbWljYWxseSBzaXplZAogICoKICAqIERvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIGJ1ZmZlcnMuIGRhdGFidWYgYW5kIG9vYnJidWYgbXVzdCBiZSBpbgpAQCAtNDIyLDcgKzQxNiw3IEBACiAgKgkJCW10ZC0+b29ic2l6ZSwgbXRkLT53cml0ZXNpemUgYW5kIHNvIG9uLgogICoJCQlAaWRfZGF0YSBjb250YWlucyB0aGUgOCBieXRlcyB2YWx1ZXMgb2YgTkFORF9DTURfUkVBRElELgogICoJCQlSZXR1cm4gd2l0aCB0aGUgYnVzIHdpZHRoLgotICogQGRldl9yZWFkeToJCVtCT0FSRFNQRUNJRklDXSBoYXJkd2FyZXNwZWNpZmljIGZ1bmN0aW9uIGZvciBhY2Nlc2luZworICogQGRldl9yZWFkeToJCVtCT0FSRFNQRUNJRklDXSBoYXJkd2FyZXNwZWNpZmljIGZ1bmN0aW9uIGZvciBhY2Nlc3NpbmcKICAqCQkJZGV2aWNlIHJlYWR5L2J1c3kgbGluZS4gSWYgc2V0IHRvIE5VTEwgbm8gYWNjZXNzIHRvCiAgKgkJCXJlYWR5L2J1c3kgaXMgYXZhaWxhYmxlIGFuZCB0aGUgcmVhZHkvYnVzeSBpbmZvcm1hdGlvbgogICoJCQlpcyByZWFkIGZyb20gdGhlIGNoaXAgc3RhdHVzIHJlZ2lzdGVyLgpAQCAtNDMwLDE3ICs0MjQsMTcgQEAKICAqCQkJY29tbWFuZHMgdG8gdGhlIGNoaXAuCiAgKiBAd2FpdGZ1bmM6CQlbUkVQTEFDRUFCTEVdIGhhcmR3YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yIHdhaXQgb24KICAqCQkJcmVhZHkuCi0gKiBAZWNjOgkJW0JPQVJEU1BFQ0lGSUNdIGVjYyBjb250cm9sIGN0cnVjdHVyZQorICogQGVjYzoJCVtCT0FSRFNQRUNJRklDXSBFQ0MgY29udHJvbCBzdHJ1Y3R1cmUKICAqIEBidWZmZXJzOgkJYnVmZmVyIHN0cnVjdHVyZSBmb3IgcmVhZC93cml0ZQogICogQGh3Y29udHJvbDoJCXBsYXRmb3JtLXNwZWNpZmljIGhhcmR3YXJlIGNvbnRyb2wgc3RydWN0dXJlCi0gKiBAb3BzOgkJb29iIG9wZXJhdGlvbiBvcGVyYW5kcwogICogQGVyYXNlX2NtZDoJCVtJTlRFUk5dIGVyYXNlIGNvbW1hbmQgd3JpdGUgZnVuY3Rpb24sIHNlbGVjdGFibGUgZHVlCiAgKgkJCXRvIEFORCBzdXBwb3J0LgogICogQHNjYW5fYmJ0OgkJW1JFUExBQ0VBQkxFXSBmdW5jdGlvbiB0byBzY2FuIGJhZCBibG9jayB0YWJsZQogICogQGNoaXBfZGVsYXk6CQlbQk9BUkRTUEVDSUZJQ10gY2hpcCBkZXBlbmRlbnQgZGVsYXkgZm9yIHRyYW5zZmVycmluZwogICoJCQlkYXRhIGZyb20gYXJyYXkgdG8gcmVhZCByZWdzICh0UikuCiAgKiBAc3RhdGU6CQlbSU5URVJOXSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgTkFORCBkZXZpY2UKLSAqIEBvb2JfcG9pOgkJcG9pc29uIHZhbHVlIGJ1ZmZlcgorICogQG9vYl9wb2k6CQkicG9pc29uIHZhbHVlIGJ1ZmZlciwiIHVzZWQgZm9yIGxheWluZyBvdXQgT09CIGRhdGEKKyAqCQkJYmVmb3JlIHdyaXRpbmcKICAqIEBwYWdlX3NoaWZ0OgkJW0lOVEVSTl0gbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBpbiBhIHBhZ2UgKGNvbHVtbgogICoJCQlhZGRyZXNzIGJpdHMpLgogICogQHBoeXNfZXJhc2Vfc2hpZnQ6CVtJTlRFUk5dIG51bWJlciBvZiBhZGRyZXNzIGJpdHMgaW4gYSBwaHlzaWNhbCBlcmFzZWJsb2NrCkBAIC00NDksNiArNDQzLDkgQEAKICAqIEBvcHRpb25zOgkJW0JPQVJEU1BFQ0lGSUNdIHZhcmlvdXMgY2hpcCBvcHRpb25zLiBUaGV5IGNhbiBwYXJ0bHkKICAqCQkJYmUgc2V0IHRvIGluZm9ybSBuYW5kX3NjYW4gYWJvdXQgc3BlY2lhbCBmdW5jdGlvbmFsaXR5LgogICoJCQlTZWUgdGhlIGRlZmluZXMgZm9yIGZ1cnRoZXIgZXhwbGFuYXRpb24uCisgKiBAYmJ0X29wdGlvbnM6CVtJTlRFUk5dIGJhZCBibG9jayBzcGVjaWZpYyBvcHRpb25zLiBBbGwgb3B0aW9ucyB1c2VkCisgKgkJCWhlcmUgbXVzdCBjb21lIGZyb20gYmJtLmguIEJ5IGRlZmF1bHQsIHRoZXNlIG9wdGlvbnMKKyAqCQkJd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGFwcHJvcHJpYXRlIG5hbmRfYmJ0X2Rlc2NyJ3MuCiAgKiBAYmFkYmxvY2twb3M6CVtJTlRFUk5dIHBvc2l0aW9uIG9mIHRoZSBiYWQgYmxvY2sgbWFya2VyIGluIHRoZSBvb2IKICAqCQkJYXJlYS4KICAqIEBiYWRibG9ja2JpdHM6CVtJTlRFUk5dIG51bWJlciBvZiBiaXRzIHRvIGxlZnQtc2hpZnQgdGhlIGJhZCBibG9jawpAQCAtNDY0LDcgKzQ2MSw3IEBACiAgKgkJCW5vbiAwIGlmIE9ORkkgc3VwcG9ydGVkLgogICogQG9uZmlfcGFyYW1zOglbSU5URVJOXSBob2xkcyB0aGUgT05GSSBwYWdlIHBhcmFtZXRlciB3aGVuIE9ORkkgaXMKICAqCQkJc3VwcG9ydGVkLCAwIG90aGVyd2lzZS4KLSAqIEBlY2NsYXlvdXQ6CQlbUkVQTEFDRUFCTEVdIHRoZSBkZWZhdWx0IGVjYyBwbGFjZW1lbnQgc2NoZW1lCisgKiBAZWNjbGF5b3V0OgkJW1JFUExBQ0VBQkxFXSB0aGUgZGVmYXVsdCBFQ0MgcGxhY2VtZW50IHNjaGVtZQogICogQGJidDoJCVtJTlRFUk5dIGJhZCBibG9jayB0YWJsZSBwb2ludGVyCiAgKiBAYmJ0X3RkOgkJW1JFUExBQ0VBQkxFXSBiYWQgYmxvY2sgdGFibGUgZGVzY3JpcHRvciBmb3IgZmxhc2gKICAqCQkJbG9va3VwLgpAQCAtNDcyLDkgKzQ2OSw5IEBACiAgKiBAYmFkYmxvY2tfcGF0dGVybjoJW1JFUExBQ0VBQkxFXSBiYWQgYmxvY2sgc2NhbiBwYXR0ZXJuIHVzZWQgZm9yIGluaXRpYWwKICAqCQkJYmFkIGJsb2NrIHNjYW4uCiAgKiBAY29udHJvbGxlcjoJCVtSRVBMQUNFQUJMRV0gYSBwb2ludGVyIHRvIGEgaGFyZHdhcmUgY29udHJvbGxlcgotICoJCQlzdHJ1Y3R1cmUgd2hpY2ggaXMgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluZGVwZW5kZW5kCisgKgkJCXN0cnVjdHVyZSB3aGljaCBpcyBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5kZXBlbmRlbnQKICAqCQkJZGV2aWNlcy4KLSAqIEBwcml2OgkJW09QVElPTkFMXSBwb2ludGVyIHRvIHByaXZhdGUgY2hpcCBkYXRlCisgKiBAcHJpdjoJCVtPUFRJT05BTF0gcG9pbnRlciB0byBwcml2YXRlIGNoaXAgZGF0YQogICogQGVycnN0YXQ6CQlbT1BUSU9OQUxdIGhhcmR3YXJlIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHBlcmZvcm0KICAqCQkJYWRkaXRpb25hbCBlcnJvciBzdGF0dXMgY2hlY2tzIChkZXRlcm1pbmUgaWYgZXJyb3JzIGFyZQogICoJCQljb3JyZWN0YWJsZSkuCkBAIC01MDksNiArNTA2LDcgQEAKIAogCWludCBjaGlwX2RlbGF5OwogCXVuc2lnbmVkIGludCBvcHRpb25zOworCXVuc2lnbmVkIGludCBiYnRfb3B0aW9uczsKIAogCWludCBwYWdlX3NoaWZ0OwogCWludCBwaHlzX2VyYXNlX3NoaWZ0OwpAQCAtNTM2LDggKzUzNCw2IEBACiAJc3RydWN0IG5hbmRfYnVmZmVycyAqYnVmZmVyczsKIAlzdHJ1Y3QgbmFuZF9od19jb250cm9sIGh3Y29udHJvbDsKIAotCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7Ci0KIAl1aW50OF90ICpiYnQ7CiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiYnRfdGQ7CiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiYnRfbWQ7CkBAIC02MTEsMTAgKzYwNyw5IEBACiAgKiBAcGFydGl0aW9uczoJCW10ZCBwYXJ0aXRpb24gbGlzdAogICogQGNoaXBfZGVsYXk6CQlSL0IgZGVsYXkgdmFsdWUgaW4gdXMKICAqIEBvcHRpb25zOgkJT3B0aW9uIGZsYWdzLCBlLmcuIDE2Yml0IGJ1c3dpZHRoCi0gKiBAZWNjbGF5b3V0OgkJZWNjIGxheW91dCBpbmZvIHN0cnVjdHVyZQorICogQGJidF9vcHRpb25zOglCQlQgb3B0aW9uIGZsYWdzLCBlLmcuIE5BTkRfQkJUX1VTRV9GTEFTSAorICogQGVjY2xheW91dDoJCUVDQyBsYXlvdXQgaW5mbyBzdHJ1Y3R1cmUKICAqIEBwYXJ0X3Byb2JlX3R5cGVzOglOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgcHJvYmUgdHlwZXMKLSAqIEBzZXRfcGFydHM6CQlwbGF0Zm9ybSBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgcGFydGl0aW9ucwotICogQHByaXY6CQloYXJkd2FyZSBjb250cm9sbGVyIHNwZWNpZmljIHNldHRpbmdzCiAgKi8KIHN0cnVjdCBwbGF0Zm9ybV9uYW5kX2NoaXAgewogCWludCBucl9jaGlwczsKQEAgLTYyNCw5ICs2MTksOCBAQAogCXN0cnVjdCBuYW5kX2VjY2xheW91dCAqZWNjbGF5b3V0OwogCWludCBjaGlwX2RlbGF5OwogCXVuc2lnbmVkIGludCBvcHRpb25zOworCXVuc2lnbmVkIGludCBiYnRfb3B0aW9uczsKIAljb25zdCBjaGFyICoqcGFydF9wcm9iZV90eXBlczsKLQl2b2lkICgqc2V0X3BhcnRzKSh1aW50NjRfdCBzaXplLCBzdHJ1Y3QgcGxhdGZvcm1fbmFuZF9jaGlwICpjaGlwKTsKLQl2b2lkICpwcml2OwogfTsKIAogLyogS2VlcCBnY2MgaGFwcHkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL29uZW5hbmQuaCBiL2luY2x1ZGUvbGludXgvbXRkL29uZW5hbmQuaAppbmRleCA1MmI2ZjE4Li40NTk2NTAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvb25lbmFuZC5oCkBAIC0xODQsNiArMTg0LDkgQEAKICNkZWZpbmUgT05FTkFORF9JU19DQUNIRV9QUk9HUkFNKHRoaXMpCQkJCQlcCiAJKHRoaXMtPm9wdGlvbnMgJiBPTkVOQU5EX0hBU19DQUNIRV9QUk9HUkFNKQogCisjZGVmaW5lIE9ORU5BTkRfSVNfTk9QXzEodGhpcykJCQkJCQlcCisJKHRoaXMtPm9wdGlvbnMgJiBPTkVOQU5EX0hBU19OT1BfMSkKKwogLyogQ2hlY2sgYnl0ZSBhY2Nlc3MgaW4gT25lTkFORCAqLwogI2RlZmluZSBPTkVOQU5EX0NIRUNLX0JZVEVfQUNDRVNTKGFkZHIpCQkoYWRkciAmIDB4MSkKIApAQCAtMTk1LDYgKzE5OCw3IEBACiAjZGVmaW5lIE9ORU5BTkRfSEFTXzJQTEFORQkJKDB4MDAwNCkKICNkZWZpbmUgT05FTkFORF9IQVNfNEtCX1BBR0UJCSgweDAwMDgpCiAjZGVmaW5lIE9ORU5BTkRfSEFTX0NBQ0hFX1BST0dSQU0JKDB4MDAxMCkKKyNkZWZpbmUgT05FTkFORF9IQVNfTk9QXzEJCSgweDAwMjApCiAjZGVmaW5lIE9ORU5BTkRfU0tJUF9VTkxPQ0tfQ0hFQ0sJKDB4MDEwMCkKICNkZWZpbmUgT05FTkFORF9QQUdFQlVGX0FMTE9DCQkoMHgxMDAwKQogI2RlZmluZSBPTkVOQU5EX09PQkJVRl9BTExPQwkJKDB4MjAwMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaCBiL2luY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaAppbmRleCAzYTZmMDM3Li4yNDc1MjI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9wYXJ0aXRpb25zLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGFydGl0aW9ucy5oCkBAIC0yNCw3ICsyNCw5IEBACiAgKiAJd2lsbCBleHRlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbWFzdGVyIE1URCBkZXZpY2UuCiAgKiBvZmZzZXQ6IGFic29sdXRlIHN0YXJ0aW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgbWFzdGVyIE1URCBkZXZpY2U7IGlmCiAgKiAJZGVmaW5lZCBhcyBNVERQQVJUX09GU19BUFBFTkQsIHRoZSBwYXJ0aXRpb24gd2lsbCBzdGFydCB3aGVyZSB0aGUKLSAqIAlwcmV2aW91cyBvbmUgZW5kZWQ7IGlmIE1URFBBUlRfT0ZTX05YVEJMSywgYXQgdGhlIG5leHQgZXJhc2UgYmxvY2suCisgKglwcmV2aW91cyBvbmUgZW5kZWQ7IGlmIE1URFBBUlRfT0ZTX05YVEJMSywgYXQgdGhlIG5leHQgZXJhc2UgYmxvY2s7CisgKglpZiBNVERQQVJUX09GU19SRVRBSU4sIGNvbnN1bWUgYXMgbXVjaCBhcyBwb3NzaWJsZSwgbGVhdmluZyBzaXplCisgKglhZnRlciB0aGUgZW5kIG9mIHBhcnRpdGlvbi4KICAqIG1hc2tfZmxhZ3M6IGNvbnRhaW5zIGZsYWdzIHRoYXQgaGF2ZSB0byBiZSBtYXNrZWQgKHJlbW92ZWQpIGZyb20gdGhlCiAgKiAJbWFzdGVyIE1URCBmbGFnIHNldCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgTVREIHBhcnRpdGlvbi4KICAqIAlGb3IgZXhhbXBsZSwgdG8gZm9yY2UgYSByZWFkLW9ubHkgcGFydGl0aW9uLCBzaW1wbHkgYWRkaW5nCkBAIC00MiwxMiArNDQsMjUgQEAKIAlzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgKmVjY2xheW91dDsJLyogb3V0IG9mIGJhbmQgbGF5b3V0IGZvciB0aGlzIHBhcnRpdGlvbiAoTkFORCBvbmx5KSAqLwogfTsKIAorI2RlZmluZSBNVERQQVJUX09GU19SRVRBSU4JKC0zKQogI2RlZmluZSBNVERQQVJUX09GU19OWFRCTEsJKC0yKQogI2RlZmluZSBNVERQQVJUX09GU19BUFBFTkQJKC0xKQogI2RlZmluZSBNVERQQVJUX1NJWl9GVUxMCSgwKQogCiAKIHN0cnVjdCBtdGRfaW5mbzsKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKKworLyoqCisgKiBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgLSB1c2VkIHRvIHBhc3MgZGF0YSB0byBNVEQgcGFydGl0aW9uIHBhcnNlcnMuCisgKiBAb3JpZ2luOiBmb3IgUmVkQm9vdCwgc3RhcnQgYWRkcmVzcyBvZiBNVEQgZGV2aWNlCisgKiBAb2Zfbm9kZTogZm9yIE9GIHBhcnNlcnMsIGRldmljZSBub2RlIGNvbnRhaW5pbmcgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBvcmlnaW47CisJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOworfTsKKwogCiAvKgogICogRnVuY3Rpb25zIGRlYWxpbmcgd2l0aCB0aGUgdmFyaW91cyB3YXlzIG9mIHBhcnRpdGlvbmluZyB0aGUgc3BhY2UKQEAgLTU3LDM3ICs3MiwxMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAljb25zdCBjaGFyICpuYW1lOwotCWludCAoKnBhcnNlX2ZuKShzdHJ1Y3QgbXRkX2luZm8gKiwgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiosIHVuc2lnbmVkIGxvbmcpOworCWludCAoKnBhcnNlX2ZuKShzdHJ1Y3QgbXRkX2luZm8gKiwgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiosCisJCQlzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKik7CiB9OwogCiBleHRlcm4gaW50IHJlZ2lzdGVyX210ZF9wYXJzZXIoc3RydWN0IG10ZF9wYXJ0X3BhcnNlciAqcGFyc2VyKTsKIGV4dGVybiBpbnQgZGVyZWdpc3Rlcl9tdGRfcGFyc2VyKHN0cnVjdCBtdGRfcGFydF9wYXJzZXIgKnBhcnNlcik7Ci1leHRlcm4gaW50IHBhcnNlX210ZF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLCBjb25zdCBjaGFyICoqdHlwZXMsCi0JCQkJc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsIHVuc2lnbmVkIGxvbmcgb3JpZ2luKTsKLQotI2RlZmluZSBwdXRfcGFydGl0aW9uX3BhcnNlcihwKSBkbyB7IG1vZHVsZV9wdXQoKHApLT5vd25lcik7IH0gd2hpbGUoMCkKLQotc3RydWN0IGRldmljZTsKLXN0cnVjdCBkZXZpY2Vfbm9kZTsKLQotI2lmZGVmIENPTkZJR19NVERfT0ZfUEFSVFMKLWludCBfX2RldmluaXQgb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBvZl9tdGRfcGFyc2VfcGFydGl0aW9ucyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAotCQkJCQkgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLXN0YXRpYyBpbmxpbmUgaW50IG10ZF9oYXNfY21kbGluZXBhcnQodm9pZCkgeyByZXR1cm4gMTsgfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IG10ZF9oYXNfY21kbGluZXBhcnQodm9pZCkgeyByZXR1cm4gMDsgfQotI2VuZGlmCiAKIGludCBtdGRfaXNfcGFydGl0aW9uKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKIGludCBtdGRfYWRkX3BhcnRpdGlvbihzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwgY2hhciAqbmFtZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3BoeXNtYXAuaCBiL2luY2x1ZGUvbGludXgvbXRkL3BoeXNtYXAuaAppbmRleCBlNWYyMWQyLi4wNGUwMTgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9waHlzbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oCkBAIC0zMiwyMSArMzIsNCBAQAogCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKIH07CiAKLS8qCi0gKiBCb2FyZCBuZWVkcyB0byBzcGVjaWZ5IHRoZSBleGFjdCBtYXBwaW5nIGR1cmluZyB0aGVpciBzZXR1cCB0aW1lLgotICovCi12b2lkIHBoeXNtYXBfY29uZmlndXJlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQlpbnQgYmFua3dpZHRoLCB2b2lkICgqc2V0X3ZwcCkoc3RydWN0IG1hcF9pbmZvICosIGludCkgKTsKLQotLyoKLSAqIE1hY2hpbmVzIHRoYXQgd2lzaCB0byBkbyBmbGFzaCBwYXJ0aXRpb24gbWF5IHdhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGluCi0gKiB0aGVpciBzZXR1cCByb3V0aW5lLgotICoKLSAqCXBoeXNtYXBfc2V0X3BhcnRpdGlvbnMobXlwYXJ0aXRpb25zLCBudW1fcGFydHMpOwotICoKLSAqIE5vdGUgdGhhdCBvbmUgY2FuIGFsd2F5cyBvdmVycmlkZSB0aGlzIGhhcmQtY29kZWQgcGFydGl0aW9uIHdpdGgKLSAqIGNvbW1hbmQgbGluZSBwYXJ0aXRpb24gKHlvdSBuZWVkIHRvIGVuYWJsZSBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMpLgotICovCi12b2lkIHBoeXNtYXBfc2V0X3BhcnRpdGlvbnMoc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzLCBpbnQgbnVtX3BhcnRzKTsKLQogI2VuZGlmIC8qIF9fTElOVVhfTVREX1BIWVNNQVBfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYW1laS5oIGIvaW5jbHVkZS9saW51eC9uYW1laS5oCmluZGV4IDQwOTMyOGQuLmZmYzAyMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmFtZWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25hbWVpLmgKQEAgLTY3LDYgKzY3LDcgQEAKICNkZWZpbmUgTE9PS1VQX0VNUFRZCQkweDQwMDAKIAogZXh0ZXJuIGludCB1c2VyX3BhdGhfYXQoaW50LCBjb25zdCBjaGFyIF9fdXNlciAqLCB1bnNpZ25lZCwgc3RydWN0IHBhdGggKik7CitleHRlcm4gaW50IHVzZXJfcGF0aF9hdF9lbXB0eShpbnQsIGNvbnN0IGNoYXIgX191c2VyICosIHVuc2lnbmVkLCBzdHJ1Y3QgcGF0aCAqLCBpbnQgKmVtcHR5KTsKIAogI2RlZmluZSB1c2VyX3BhdGgobmFtZSwgcGF0aCkgdXNlcl9wYXRoX2F0KEFUX0ZEQ1dELCBuYW1lLCBMT09LVVBfRk9MTE9XLCBwYXRoKQogI2RlZmluZSB1c2VyX2xwYXRoKG5hbWUsIHBhdGgpIHVzZXJfcGF0aF9hdChBVF9GRENXRCwgbmFtZSwgMCwgcGF0aCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IGRmMWM4MzYuLmNiZWI1ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMjYyMiwyMyArMjYyMiwyMyBAQAogZXh0ZXJuIGludCBfX25ldGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpOwogCi1leHRlcm4gaW50IG5ldGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIGludCBuZXRkZXZfZW1lcmcoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBuZXRkZXZfYWxlcnQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBuZXRkZXZfY3JpdChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gaW50IG5ldGRldl9lcnIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBuZXRkZXZfd2Fybihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gaW50IG5ldGRldl9ub3RpY2UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBuZXRkZXZfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK2ludCBuZXRkZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQoraW50IG5ldGRldl9lbWVyZyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBuZXRkZXZfYWxlcnQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgbmV0ZGV2X2NyaXQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgbmV0ZGV2X2Vycihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBuZXRkZXZfd2Fybihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBuZXRkZXZfbm90aWNlKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQoraW50IG5ldGRldl9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKIAogI2RlZmluZSBNT0RVTEVfQUxJQVNfTkVUREVWKGRldmljZSkgXAogCU1PRFVMRV9BTElBUygibmV0ZGV2LSIgZGV2aWNlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L0tidWlsZAppbmRleCBmOTkzMGM4Li5jM2I0NTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L0tidWlsZApAQCAtMTIsMyArMTIsNCBAQAogaGVhZGVyLXkgKz0gaXB0X2Vjbi5oCiBoZWFkZXIteSArPSBpcHRfcmVhbG0uaAogaGVhZGVyLXkgKz0gaXB0X3R0bC5oCitoZWFkZXIteSArPSBuZl9uYXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9uZl9uYXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NjFkMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0LmgKQEAgLTAsMCArMSw1OCBAQAorI2lmbmRlZiBfTElOVVhfTkZfTkFUX0gKKyNkZWZpbmUgX0xJTlVYX05GX05BVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIElQX05BVF9SQU5HRV9NQVBfSVBTIDEKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCAyCisjZGVmaW5lIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00gNAorI2RlZmluZSBJUF9OQVRfUkFOR0VfUEVSU0lTVEVOVCA4CisKKy8qIFRoZSBwcm90b2NvbC1zcGVjaWZpYyBtYW5pcHVsYWJsZSBwYXJ0cyBvZiB0aGUgdHVwbGUuICovCit1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvIHsKKwkvKiBBZGQgb3RoZXIgcHJvdG9jb2xzIGhlcmUuICovCisJX19iZTE2IGFsbDsKKworCXN0cnVjdCB7CisJCV9fYmUxNiBwb3J0OworCX0gdGNwOworCXN0cnVjdCB7CisJCV9fYmUxNiBwb3J0OworCX0gdWRwOworCXN0cnVjdCB7CisJCV9fYmUxNiBpZDsKKwl9IGljbXA7CisJc3RydWN0IHsKKwkJX19iZTE2IHBvcnQ7CisJfSBkY2NwOworCXN0cnVjdCB7CisJCV9fYmUxNiBwb3J0OworCX0gc2N0cDsKKwlzdHJ1Y3QgeworCQlfX2JlMTYga2V5OwkvKiBHUkUga2V5IGlzIDMyYml0LCBQUHRQIG9ubHkgdXNlcyAxNmJpdCAqLworCX0gZ3JlOworfTsKKworLyogU2luZ2xlIHJhbmdlIHNwZWNpZmljYXRpb24uICovCitzdHJ1Y3QgbmZfbmF0X3JhbmdlIHsKKwkvKiBTZXQgdG8gT1Igb2YgZmxhZ3MgYWJvdmUuICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJLyogSW5jbHVzaXZlOiBuZXR3b3JrIG9yZGVyLiAqLworCV9fYmUzMiBtaW5faXAsIG1heF9pcDsKKworCS8qIEluY2x1c2l2ZTogbmV0d29yayBvcmRlciAqLworCXVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gbWluLCBtYXg7Cit9OworCisvKiBGb3IgYmFja3dhcmRzIGNvbXBhdDogZG9uJ3QgdXNlIGluIG1vZGVybiBjb2RlLiAqLworc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgeworCXVuc2lnbmVkIGludCByYW5nZXNpemU7IC8qIE11c3QgYmUgMS4gKi8KKworCS8qIGhhbmdzIG9mZiBlbmQuICovCisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZVsxXTsKK307CisKKyNkZWZpbmUgbmZfbmF0X211bHRpX3JhbmdlIG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvbmV0bGluay5oCmluZGV4IDgxODBjZDkuLjgzNzRkMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0bGluay5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIE5FVExJTktfU0NTSVRSQU5TUE9SVAkxOAkvKiBTQ1NJIFRyYW5zcG9ydHMgKi8KICNkZWZpbmUgTkVUTElOS19FQ1JZUFRGUwkxOQogI2RlZmluZSBORVRMSU5LX1JETUEJCTIwCisjZGVmaW5lIE5FVExJTktfQ1JZUFRPCQkyMQkvKiBDcnlwdG8gbGF5ZXIgKi8KIAogI2RlZmluZSBNQVhfTElOS1MgMzIJCQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19mcy5oIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaAppbmRleCA2MGExMzdiLi5hYjJjNjM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKQEAgLTIyOSw2ICsyMjksNyBAQAogI2RlZmluZSBORlNfSU5PX0NPTU1JVAkJKDcpCQkvKiBpbm9kZSBpcyBjb21taXR0aW5nIHVuc3RhYmxlIHdyaXRlcyAqLwogI2RlZmluZSBORlNfSU5PX1BORlNfQ09NTUlUCSg4KQkJLyogdXNlIHBuZnMgY29kZSBmb3IgY29tbWl0ICovCiAjZGVmaW5lIE5GU19JTk9fTEFZT1VUQ09NTUlUCSg5KQkJLyogbGF5b3V0Y29tbWl0IHJlcXVpcmVkICovCisjZGVmaW5lIE5GU19JTk9fTEFZT1VUQ09NTUlUVElORyAoMTApCQkvKiBsYXlvdXRjb21taXQgaW5mbGlnaHQgKi8KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZzX2lub2RlICpORlNfSShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ubDgwMjExLmggYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaAppbmRleCA4MDQ5YmY3Li5mNTFlM2JmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25sODAyMTEuaAorKysgYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaApAQCAtNTA5LDYgKzUwOSwzOCBAQAogICogQE5MODAyMTFfQ01EX1RETFNfT1BFUjogUGVyZm9ybSBhIGhpZ2gtbGV2ZWwgVERMUyBjb21tYW5kIChlLmcuIGxpbmsgc2V0dXApLgogICogQE5MODAyMTFfQ01EX1RETFNfTUdNVDogU2VuZCBhIFRETFMgbWFuYWdlbWVudCBmcmFtZS4KICAqCisgKiBATkw4MDIxMV9DTURfVU5FWFBFQ1RFRF9GUkFNRTogVXNlZCBieSBhbiBhcHBsaWNhdGlvbiBjb250cm9sbGluZyBhbiBBUAorICoJKG9yIEdPKSBpbnRlcmZhY2UgKGkuZS4gaG9zdGFwZCkgdG8gYXNrIGZvciB1bmV4cGVjdGVkIGZyYW1lcyB0bworICoJaW1wbGVtZW50IHNlbmRpbmcgZGVhdXRoIHRvIHN0YXRpb25zIHRoYXQgc2VuZCB1bmV4cGVjdGVkIGNsYXNzIDMKKyAqCWZyYW1lcy4gQWxzbyB1c2VkIGFzIHRoZSBldmVudCBzZW50IGJ5IHRoZSBrZXJuZWwgd2hlbiBzdWNoIGEgZnJhbWUKKyAqCWlzIHJlY2VpdmVkLgorICoJRm9yIHRoZSBldmVudCwgdGhlICVOTDgwMjExX0FUVFJfTUFDIGF0dHJpYnV0ZSBjYXJyaWVzIHRoZSBUQSBhbmQKKyAqCW90aGVyIGF0dHJpYnV0ZXMgbGlrZSB0aGUgaW50ZXJmYWNlIGluZGV4IGFyZSBwcmVzZW50LgorICoJSWYgdXNlZCBhcyB0aGUgY29tbWFuZCBpdCBtdXN0IGhhdmUgYW4gaW50ZXJmYWNlIGluZGV4IGFuZCB5b3UgY2FuCisgKglvbmx5IHVuc3Vic2NyaWJlIGZyb20gdGhlIGV2ZW50IGJ5IGNsb3NpbmcgdGhlIHNvY2tldC4gU3Vic2NyaXB0aW9uCisgKglpcyBhbHNvIGZvciAlTkw4MDIxMV9DTURfVU5FWFBFQ1RFRF80QUREUl9GUkFNRSBldmVudHMuCisgKgorICogQE5MODAyMTFfQ01EX1VORVhQRUNURURfNEFERFJfRlJBTUU6IFNlbnQgYXMgYW4gZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZQorICoJYXNzb2NpYXRlZCBzdGF0aW9uIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9NQUMgc2VudCBhIDRhZGRyIGZyYW1lCisgKglhbmQgd2Fzbid0IGFscmVhZHkgaW4gYSA0LWFkZHIgVkxBTi4gVGhlIGV2ZW50IHdpbGwgYmUgc2VudCBzaW1pbGFybHkKKyAqCXRvIHRoZSAlTkw4MDIxMV9DTURfVU5FWFBFQ1RFRF9GUkFNRSBldmVudCwgdG8gdGhlIHNhbWUgbGlzdGVuZXIuCisgKgorICogQE5MODAyMTFfQ01EX1BST0JFX0NMSUVOVDogUHJvYmUgYW4gYXNzb2NpYXRlZCBzdGF0aW9uIG9uIGFuIEFQIGludGVyZmFjZQorICoJYnkgc2VuZGluZyBhIG51bGwgZGF0YSBmcmFtZSB0byBpdCBhbmQgcmVwb3J0aW5nIHdoZW4gdGhlIGZyYW1lIGlzCisgKglhY2tub3dsZWdlZC4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IHRpbWluZyBvdXQgaW5hY3RpdmUgY2xpZW50cy4gVXNlcworICoJJU5MODAyMTFfQVRUUl9JRklOREVYIGFuZCAlTkw4MDIxMV9BVFRSX01BQy4gVGhlIGNvbW1hbmQgcmV0dXJucyBhCisgKglkaXJlY3QgcmVwbHkgd2l0aCBhbiAlTkw4MDIxMV9BVFRSX0NPT0tJRSB0aGF0IGlzIGxhdGVyIHVzZWQgdG8gbWF0Y2gKKyAqCXVwIHRoZSBldmVudCB3aXRoIHRoZSByZXF1ZXN0LiBUaGUgZXZlbnQgaW5jbHVkZXMgdGhlIHNhbWUgZGF0YSBhbmQKKyAqCWhhcyAlTkw4MDIxMV9BVFRSX0FDSyBzZXQgaWYgdGhlIGZyYW1lIHdhcyBBQ0tlZC4KKyAqCisgKiBATkw4MDIxMV9DTURfUkVHSVNURVJfQkVBQ09OUzogUmVnaXN0ZXIgdGhpcyBzb2NrZXQgdG8gcmVjZWl2ZSBiZWFjb25zIGZyb20KKyAqCW90aGVyIEJTU2VzIHdoZW4gYW55IGludGVyZmFjZXMgYXJlIGluIEFQIG1vZGUuIFRoaXMgaGVscHMgaW1wbGVtZW50CisgKglPTEJDIGhhbmRsaW5nIGluIGhvc3RhcGQuIEJlYWNvbnMgYXJlIHJlcG9ydGVkIGluICVOTDgwMjExX0NNRF9GUkFNRQorICoJbWVzc2FnZXMuIE5vdGUgdGhhdCBwZXIgUEhZIG9ubHkgb25lIGFwcGxpY2F0aW9uIG1heSByZWdpc3Rlci4KKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX05PQUNLX01BUDogc2V0cyBhIGJpdG1hcCBmb3IgdGhlIGluZGl2aWR1YWwgVElEcyB3aGV0aGVyCisgKiAgICAgIE5vIEFja25vd2xlZGdlbWVudCBQb2xpY3kgc2hvdWxkIGJlIGFwcGxpZWQuCisgKgogICogQE5MODAyMTFfQ01EX01BWDogaGlnaGVzdCB1c2VkIGNvbW1hbmQgbnVtYmVyCiAgKiBAX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtNjM4LDYgKzY3MCwxNiBAQAogCU5MODAyMTFfQ01EX1RETFNfT1BFUiwKIAlOTDgwMjExX0NNRF9URExTX01HTVQsCiAKKwlOTDgwMjExX0NNRF9VTkVYUEVDVEVEX0ZSQU1FLAorCisJTkw4MDIxMV9DTURfUFJPQkVfQ0xJRU5ULAorCisJTkw4MDIxMV9DTURfUkVHSVNURVJfQkVBQ09OUywKKworCU5MODAyMTFfQ01EX1VORVhQRUNURURfNEFERFJfRlJBTUUsCisKKwlOTDgwMjExX0NNRF9TRVRfTk9BQ0tfTUFQLAorCiAJLyogYWRkIG5ldyBjb21tYW5kcyBhYm92ZSBoZXJlICovCiAKIAkvKiB1c2VkIHRvIGRlZmluZSBOTDgwMjExX0NNRF9NQVggYmVsb3cgKi8KQEAgLTY1OCw2ICs3MDAsOCBAQAogI2RlZmluZSBOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEUgTkw4MDIxMV9DTURfRElTQVNTT0NJQVRFCiAjZGVmaW5lIE5MODAyMTFfQ01EX1JFR19CRUFDT05fSElOVCBOTDgwMjExX0NNRF9SRUdfQkVBQ09OX0hJTlQKIAorI2RlZmluZSBOTDgwMjExX0FUVFJfRkVBVFVSRV9GTEFHUyBOTDgwMjExX0FUVFJfRkVBVFVSRV9GTEFHUworCiAvKiBzb3VyY2UtbGV2ZWwgQVBJIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgTkw4MDIxMV9DTURfR0VUX01FU0hfUEFSQU1TIE5MODAyMTFfQ01EX0dFVF9NRVNIX0NPTkZJRwogI2RlZmluZSBOTDgwMjExX0NNRF9TRVRfTUVTSF9QQVJBTVMgTkw4MDIxMV9DTURfU0VUX01FU0hfQ09ORklHCkBAIC0xMTA5LDYgKzExNTMsNDYgQEAKICAqCSVOTDgwMjExX0NNRF9URExTX01HTVQuIE90aGVyd2lzZSAlTkw4MDIxMV9DTURfVERMU19PUEVSIHNob3VsZCBiZQogICoJdXNlZCBmb3IgYXNraW5nIHRoZSBkcml2ZXIgdG8gcGVyZm9ybSBhIFRETFMgb3BlcmF0aW9uLgogICoKKyAqIEBOTDgwMjExX0FUVFJfREVWSUNFX0FQX1NNRTogVGhpcyB1MzIgYXR0cmlidXRlIG1heSBiZSBsaXN0ZWQgZm9yIGRldmljZXMKKyAqCXRoYXQgaGF2ZSBBUCBzdXBwb3J0IHRvIGluZGljYXRlIHRoYXQgdGhleSBoYXZlIHRoZSBBUCBTTUUgaW50ZWdyYXRlZAorICoJd2l0aCBzdXBwb3J0IGZvciB0aGUgZmVhdHVyZXMgbGlzdGVkIGluIHRoaXMgYXR0cmlidXRlLCBzZWUKKyAqCSZlbnVtIG5sODAyMTFfYXBfc21lX2ZlYXR1cmVzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfRE9OVF9XQUlUX0ZPUl9BQ0s6IFVzZWQgd2l0aCAlTkw4MDIxMV9DTURfRlJBTUUsIHRoaXMgdGVsbHMKKyAqCXRoZSBkcml2ZXIgdG8gbm90IHdhaXQgZm9yIGFuIGFja25vd2xlZGdlbWVudC4gTm90ZSB0aGF0IGR1ZSB0byB0aGlzLAorICoJaXQgd2lsbCBhbHNvIG5vdCBnaXZlIGEgc3RhdHVzIGNhbGxiYWNrIG5vciByZXR1cm4gYSBjb29raWUuIFRoaXMgaXMKKyAqCW1vc3RseSB1c2VmdWwgZm9yIHByb2JlIHJlc3BvbnNlcyB0byBzYXZlIGFpcnRpbWUuCisgKgorICogQE5MODAyMTFfQVRUUl9GRUFUVVJFX0ZMQUdTOiBUaGlzIHUzMiBhdHRyaWJ1dGUgY29udGFpbnMgZmxhZ3MgZnJvbQorICoJJmVudW0gbmw4MDIxMV9mZWF0dXJlX2ZsYWdzIGFuZCBpcyBhZHZlcnRpc2VkIGluIHdpcGh5IGluZm9ybWF0aW9uLgorICogQE5MODAyMTFfQVRUUl9QUk9CRV9SRVNQX09GRkxPQUQ6IEluZGljYXRlcyB0aGF0IHRoZSBIVyByZXNwb25kcyB0byBwcm9iZQorICoKKyAqCXJlcXVlc3RzIHdoaWxlIG9wZXJhdGluZyBpbiBBUC1tb2RlLgorICoJVGhpcyBhdHRyaWJ1dGUgaG9sZHMgYSBiaXRtYXAgb2YgdGhlIHN1cHBvcnRlZCBwcm90b2NvbHMgZm9yCisgKglvZmZsb2FkaW5nIChzZWUgJmVudW0gbmw4MDIxMV9wcm9iZV9yZXNwX29mZmxvYWRfc3VwcG9ydF9hdHRyKS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1BST0JFX1JFU1A6IFByb2JlIFJlc3BvbnNlIHRlbXBsYXRlIGRhdGEuIENvbnRhaW5zIHRoZSBlbnRpcmUKKyAqCXByb2JlLXJlc3BvbnNlIGZyYW1lLiBUaGUgREEgZmllbGQgaW4gdGhlIDgwMi4xMSBoZWFkZXIgaXMgemVyby1lZCBvdXQsCisgKgl0byBiZSBmaWxsZWQgYnkgdGhlIEZXLgorICogQE5MODAyMTFfQVRUUl9ESVNBQkxFX0hUOiAgRm9yY2UgSFQgY2FwYWJsZSBpbnRlcmZhY2VzIHRvIGRpc2FibGUKKyAqICAgICAgdGhpcyBmZWF0dXJlLiAgQ3VycmVudGx5LCBvbmx5IHN1cHBvcnRlZCBpbiBtYWM4MDIxMSBkcml2ZXJzLgorICogQE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0s6IFNwZWNpZnkgd2hpY2ggYml0cyBvZiB0aGUKKyAqICAgICAgQVRUUl9IVF9DQVBBQklMSVRZIHRvIHdoaWNoIGF0dGVudGlvbiBzaG91bGQgYmUgcGFpZC4KKyAqICAgICAgQ3VycmVudGx5LCBvbmx5IG1hYzgwMjExIE5JQ3Mgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCisgKiAgICAgIFRoZSB2YWx1ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBhcmU6CisgKiAgICAgICBNQ1MgcmF0ZXMsIE1BWC1BTVNEVSwgSFQtMjAtNDAgYW5kIEhUX0NBUF9TR0lfNDAKKyAqICAgICAgIEFNUERVIGRlbnNpdHkgYW5kIEFNUERVIGZhY3Rvci4KKyAqICAgICAgQWxsIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBzdWdnZXN0aW9ucyBhbmQgbWF5IGJlIGlnbm9yZWQKKyAqICAgICAgYnkgdGhlIGRyaXZlciBhcyByZXF1aXJlZC4gIFRoZSBhY3R1YWwgdmFsdWVzIG1heSBiZSBzZWVuIGluCisgKiAgICAgIHRoZSBzdGF0aW9uIGRlYnVnZnMgaHRfY2FwcyBmaWxlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfREZTX1JFR0lPTjogcmVnaW9uIGZvciByZWd1bGF0b3J5IHJ1bGVzIHdoaWNoIHRoaXMgY291bnRyeQorICogICAgYWJpZGVzIHRvIHdoZW4gaW5pdGlhdGluZyByYWRpYXRpb24gb24gREZTIGNoYW5uZWxzLiBBIGNvdW50cnkgbWFwcworICogICAgdG8gb25lIERGUyByZWdpb24uCisgKgorICogQE5MODAyMTFfQVRUUl9OT0FDS19NQVA6IFRoaXMgdTE2IGJpdG1hcCBjb250YWlucyB0aGUgTm8gQWNrIFBvbGljeSBvZgorICogICAgICB1cCB0byAxNiBUSURzLgorICoKICAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtMTMzNyw2ICsxNDIxLDIzIEBACiAJTkw4MDIxMV9BVFRSX1RETFNfU1VQUE9SVCwKIAlOTDgwMjExX0FUVFJfVERMU19FWFRFUk5BTF9TRVRVUCwKIAorCU5MODAyMTFfQVRUUl9ERVZJQ0VfQVBfU01FLAorCisJTkw4MDIxMV9BVFRSX0RPTlRfV0FJVF9GT1JfQUNLLAorCisJTkw4MDIxMV9BVFRSX0ZFQVRVUkVfRkxBR1MsCisKKwlOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF9PRkZMT0FELAorCisJTkw4MDIxMV9BVFRSX1BST0JFX1JFU1AsCisKKwlOTDgwMjExX0FUVFJfREZTX1JFR0lPTiwKKworCU5MODAyMTFfQVRUUl9ESVNBQkxFX0hULAorCU5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0ssCisKKwlOTDgwMjExX0FUVFJfTk9BQ0tfTUFQLAorCiAJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCiAKIAlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULApAQCAtMTM3MSw2ICsxNDcyLDcgQEAKICNkZWZpbmUgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMKICNkZWZpbmUgTkw4MDIxMV9BVFRSX0tFWSBOTDgwMjExX0FUVFJfS0VZCiAjZGVmaW5lIE5MODAyMTFfQVRUUl9LRVlTIE5MODAyMTFfQVRUUl9LRVlTCisjZGVmaW5lIE5MODAyMTFfQVRUUl9GRUFUVVJFX0ZMQUdTIE5MODAyMTFfQVRUUl9GRUFUVVJFX0ZMQUdTCiAKICNkZWZpbmUgTkw4MDIxMV9NQVhfU1VQUF9SQVRFUwkJCTMyCiAjZGVmaW5lIE5MODAyMTFfTUFYX1NVUFBfUkVHX1JVTEVTCQkzMgpAQCAtMTg0NSw2ICsxOTQ3LDIxIEBACiB9OwogCiAvKioKKyAqIGVudW0gbmw4MDIxMV9kZnNfcmVnaW9ucyAtIHJlZ3VsYXRvcnkgREZTIHJlZ2lvbnMKKyAqCisgKiBATkw4MDIxMV9ERlNfVU5TRVQ6IENvdW50cnkgaGFzIG5vIERGUyBtYXN0ZXIgcmVnaW9uIHNwZWNpZmllZAorICogQE5MODAyMTFfREZTX0ZDQ186IENvdW50cnkgZm9sbG93cyBERlMgbWFzdGVyIHJ1bGVzIGZyb20gRkNDCisgKiBATkw4MDIxMV9ERlNfRkNDXzogQ291bnRyeSBmb2xsb3dzIERGUyBtYXN0ZXIgcnVsZXMgZnJvbSBFVFNJCisgKiBATkw4MDIxMV9ERlNfSlBfOiBDb3VudHJ5IGZvbGxvd3MgREZTIG1hc3RlciBydWxlcyBmcm9tIEpQL01LSy9UZWxlYworICovCitlbnVtIG5sODAyMTFfZGZzX3JlZ2lvbnMgeworCU5MODAyMTFfREZTX1VOU0VUCT0gMCwKKwlOTDgwMjExX0RGU19GQ0MJCT0gMSwKKwlOTDgwMjExX0RGU19FVFNJCT0gMiwKKwlOTDgwMjExX0RGU19KUAkJPSAzLAorfTsKKworLyoqCiAgKiBlbnVtIG5sODAyMTFfc3VydmV5X2luZm8gLSBzdXJ2ZXkgaW5mb3JtYXRpb24KICAqCiAgKiBUaGVzZSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHVzZWQgd2l0aCAlTkw4MDIxMV9BVFRSX1NVUlZFWV9JTkZPCkBAIC0xOTc3LDYgKzIwOTQsMTAgQEAKICAqIGFjY2VzcyB0byBhIGJyb2FkZXIgbmV0d29yayBiZXlvbmQgdGhlIE1CU1MuICBUaGlzIGlzIGRvbmUgdmlhIFJvb3QKICAqIEFubm91bmNlbWVudCBmcmFtZXMuCiAgKgorICogQE5MODAyMTFfTUVTSENPTkZfSFdNUF9QRVJSX01JTl9JTlRFUlZBTDogVGhlIG1pbmltdW0gaW50ZXJ2YWwgb2YgdGltZSAoaW4KKyAqIFRVcykgZHVyaW5nIHdoaWNoIGEgbWVzaCBTVEEgY2FuIHNlbmQgb25seSBvbmUgQWN0aW9uIGZyYW1lIGNvbnRhaW5pbmcgYQorICogUEVSUiBlbGVtZW50LgorICoKICAqIEBOTDgwMjExX01FU0hDT05GX0FUVFJfTUFYOiBoaWdoZXN0IHBvc3NpYmxlIG1lc2ggY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUKICAqCiAgKiBAX19OTDgwMjExX01FU0hDT05GX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCkBAIC0yMDAwLDYgKzIxMjEsNyBAQAogCU5MODAyMTFfTUVTSENPTkZfRUxFTUVOVF9UVEwsCiAJTkw4MDIxMV9NRVNIQ09ORl9IV01QX1JBTk5fSU5URVJWQUwsCiAJTkw4MDIxMV9NRVNIQ09ORl9HQVRFX0FOTk9VTkNFTUVOVFMsCisJTkw4MDIxMV9NRVNIQ09ORl9IV01QX1BFUlJfTUlOX0lOVEVSVkFMLAogCiAJLyoga2VlcCBsYXN0ICovCiAJX19OTDgwMjExX01FU0hDT05GX0FUVFJfQUZURVJfTEFTVCwKQEAgLTI2NTAsNCArMjc3Miw0MyBAQAogCU5MODAyMTFfVERMU19ESVNBQkxFX0xJTkssCiB9OwogCisvKgorICogZW51bSBubDgwMjExX2FwX3NtZV9mZWF0dXJlcyAtIGRldmljZS1pbnRlZ3JhdGVkIEFQIGZlYXR1cmVzCisgKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSwgbm8gYml0cyBhcmUgZGVmaW5lZCBpbgorICogTkw4MDIxMV9BVFRSX0RFVklDRV9BUF9TTUUgeWV0LgorZW51bSBubDgwMjExX2FwX3NtZV9mZWF0dXJlcyB7Cit9OworICovCisKKy8qKgorICogZW51bSBubDgwMjExX2ZlYXR1cmVfZmxhZ3MgLSBkZXZpY2UvZHJpdmVyIGZlYXR1cmVzCisgKiBATkw4MDIxMV9GRUFUVVJFX1NLX1RYX1NUQVRVUzogVGhpcyBkcml2ZXIgc3VwcG9ydHMgcmVmbGVjdGluZyBiYWNrCisgKglUWCBzdGF0dXMgdG8gdGhlIHNvY2tldCBlcnJvciBxdWV1ZSB3aGVuIHJlcXVlc3RlZCB3aXRoIHRoZQorICoJc29ja2V0IG9wdGlvbi4KKyAqLworZW51bSBubDgwMjExX2ZlYXR1cmVfZmxhZ3MgeworCU5MODAyMTFfRkVBVFVSRV9TS19UWF9TVEFUVVMJPSAxIDw8IDAsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9wcm9iZV9yZXNwX29mZmxvYWRfc3VwcG9ydF9hdHRyIC0gb3B0aW9uYWwgc3VwcG9ydGVkCisgKglwcm90b2NvbHMgZm9yIHByb2JlLXJlc3BvbnNlIG9mZmxvYWRpbmcgYnkgdGhlIGRyaXZlci9GVy4KKyAqCVRvIGJlIHVzZWQgd2l0aCB0aGUgJU5MODAyMTFfQVRUUl9QUk9CRV9SRVNQX09GRkxPQUQgYXR0cmlidXRlLgorICoJRWFjaCBlbnVtIHZhbHVlIHJlcHJlc2VudHMgYSBiaXQgaW4gdGhlIGJpdG1hcCBvZiBzdXBwb3J0ZWQKKyAqCXByb3RvY29scy4gVHlwaWNhbGx5IGEgc3Vic2V0IG9mIHByb2JlLXJlcXVlc3RzIGJlbG9uZ2luZyB0byBhCisgKglzdXBwb3J0ZWQgcHJvdG9jb2wgd2lsbCBiZSBleGNsdWRlZCBmcm9tIG9mZmxvYWQgYW5kIHVwbG9hZGVkCisgKgl0byB0aGUgaG9zdC4KKyAqCisgKiBATkw4MDIxMV9QUk9CRV9SRVNQX09GRkxPQURfU1VQUE9SVF9XUFM6IFN1cHBvcnQgZm9yIFdQUyB2ZXIuIDEKKyAqIEBOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUzI6IFN1cHBvcnQgZm9yIFdQUyB2ZXIuIDIKKyAqIEBOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1AyUDogU3VwcG9ydCBmb3IgUDJQCisgKiBATkw4MDIxMV9QUk9CRV9SRVNQX09GRkxPQURfU1VQUE9SVF84MDIxMVU6IFN1cHBvcnQgZm9yIDgwMi4xMXUKKyAqLworZW51bSBubDgwMjExX3Byb2JlX3Jlc3Bfb2ZmbG9hZF9zdXBwb3J0X2F0dHIgeworCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfV1BTID0JMTw8MCwKKwlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUzIgPQkxPDwxLAorCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfUDJQID0JMTw8MiwKKwlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUXzgwMjExVSA9CTE8PDMsCit9OworCiAjZW5kaWYgLyogX19MSU5VWF9OTDgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2YuaCBiL2luY2x1ZGUvbGludXgvb2YuaAppbmRleCA5MTgwZGM1Li40OTQ4NTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZi5oCkBAIC0xNywxMSArMTcsMTMgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAogdHlwZWRlZiB1MzIgcGhhbmRsZTsKIHR5cGVkZWYgdTMyIGloYW5kbGU7CkBAIC02OCw2ICs3MCw3IEBACiAvKiBQb2ludGVyIGZvciBmaXJzdCBlbnRyeSBpbiBjaGFpbiBvZiBhbGwgbm9kZXMuICovCiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICphbGxub2RlczsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2Nob3NlbjsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2FsaWFzZXM7CiBleHRlcm4gcndsb2NrX3QgZGV2dHJlZV9sb2NrOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgb2ZfaGF2ZV9wb3B1bGF0ZWRfZHQodm9pZCkKQEAgLTE5OSwxNiArMjAyLDI2IEBACiAJCQkJICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJICAgICAgdTMyICpvdXRfdmFsdWVzLAogCQkJCSAgICAgIHNpemVfdCBzeik7CitleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdTY0KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHU2NCAqb3V0X3ZhbHVlKTsKIAogZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCSAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQkJCSAgIGNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKTsKK2V4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgaW50IGluZGV4LCBjb25zdCBjaGFyICoqb3V0cHV0KTsKK2V4dGVybiBpbnQgb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUpOwogZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwKIAkJCQkgICBjb25zdCBjaGFyICopOwogZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKTsKIGV4dGVybiBjb25zdCB2b2lkICpvZl9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCWNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJaW50ICpsZW5wKTsKKyNkZWZpbmUgZm9yX2VhY2hfcHJvcGVydHkocHAsIHByb3BlcnRpZXMpIFwKKwlmb3IgKHBwID0gcHJvcGVydGllczsgcHAgIT0gTlVMTDsgcHAgPSBwcC0+bmV4dCkKKwogZXh0ZXJuIGludCBvZl9uX2FkZHJfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiBleHRlcm4gaW50IG9mX25fc2l6ZV9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9ub2RlKApAQCAtMjIxLDYgKzIzNCw5IEBACiAJY29uc3QgY2hhciAqbGlzdF9uYW1lLCBjb25zdCBjaGFyICpjZWxsc19uYW1lLCBpbnQgaW5kZXgsCiAJc3RydWN0IGRldmljZV9ub2RlICoqb3V0X25vZGUsIGNvbnN0IHZvaWQgKipvdXRfYXJncyk7CiAKK2V4dGVybiB2b2lkIG9mX2FsaWFzX3NjYW4odm9pZCAqICgqZHRfYWxsb2MpKHU2NCBzaXplLCB1NjQgYWxpZ24pKTsKK2V4dGVybiBpbnQgb2ZfYWxpYXNfZ2V0X2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKnN0ZW0pOworCiBleHRlcm4gaW50IG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZShjb25zdCBjaGFyICpjb21wYXQpOwogCiBleHRlcm4gaW50IHByb21fYWRkX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSogbnAsIHN0cnVjdCBwcm9wZXJ0eSogcHJvcCk7CkBAIC0yMzUsNiArMjUxLDcgQEAKIGV4dGVybiB2b2lkIG9mX2RldGFjaF9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKICNlbmRpZgogCisjZGVmaW5lIG9mX21hdGNoX3B0cihfcHRyKQkoX3B0cikKICNlbHNlIC8qIENPTkZJR19PRiAqLwogCiBzdGF0aWMgaW5saW5lIGJvb2wgb2ZfaGF2ZV9wb3B1bGF0ZWRfZHQodm9pZCkKQEAgLTI0Miw2ICsyNTksMjIgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKyNkZWZpbmUgZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShwYXJlbnQsIGNoaWxkKSBcCisJd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHByb3BlcnR5ICpvZl9maW5kX3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCQkJaW50ICpsZW5wKQoreworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQkJCQkgICAgIHUzMiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQpAQCAtMjU2LDYgKzI4OSwxOSBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBpbmRleCwKKwkJCQkJCWNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCSAgICBjb25zdCBjaGFyICpwcm9wbmFtZSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwogc3RhdGljIGlubGluZSBjb25zdCB2b2lkICpvZl9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCWNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJaW50ICpsZW5wKQpAQCAtMjYzLDYgKzMwOSwzMSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3U2NChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgdTY0ICpvdXRfdmFsdWUpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZV9ub2RlICpvZl9wYXJzZV9waGFuZGxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCQkgICBjb25zdCBjaGFyICpwaGFuZGxlX25hbWUsCisJCQkJCQkgICBpbnQgaW5kZXgpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2FsaWFzX2dldF9pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpzdGVtKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIGludCBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoY29uc3QgY2hhciAqY29tcGF0KQoreworCXJldHVybiAwOworfQorCisjZGVmaW5lIG9mX21hdGNoX3B0cihfcHRyKQlOVUxMCisjZGVmaW5lIG9mX21hdGNoX25vZGUoX21hdGNoZXMsIF9ub2RlKQlOVUxMCiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2lycS5oIGIvaW5jbHVkZS9saW51eC9vZl9pcnEuaAppbmRleCBjZDJlNjFjLi5kMDMwN2VlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfaXJxLmgKQEAgLTMzLDYgKzMzLDggQEAKIAl1MzIgc3BlY2lmaWVyW09GX01BWF9JUlFfU1BFQ107IC8qIFNwZWNpZmllciBjb3B5ICovCiB9OwogCit0eXBlZGVmIGludCAoKm9mX2lycV9pbml0X2NiX3QpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKik7CisKIC8qCiAgKiBXb3JrYXJvdW5kcyBvbmx5IGFwcGxpZWQgdG8gMzJiaXQgcG93ZXJtYWMgbWFjaGluZXMKICAqLwpAQCAtNzMsNiArNzUsNyBAQAogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IG5yX2lycXMpOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfaXJxX2ZpbmRfcGFyZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQpOwogCitleHRlcm4gdm9pZCBvZl9pcnFfaW5pdChjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzKTsKIAogI2VuZGlmIC8qIENPTkZJR19PRl9JUlEgKi8KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfcGxhdGZvcm0uaCBiL2luY2x1ZGUvbGludXgvb2ZfcGxhdGZvcm0uaAppbmRleCA1YTZmNDU4Li4wNDBjZTJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9wbGF0Zm9ybS5oCkBAIC0xMiw3ICsxMiw2IEBACiAgKi8KIAogI2lmZGVmIENPTkZJR19PRl9ERVZJQ0UKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vbWFwM2lzcC5oIGIvaW5jbHVkZS9saW51eC9vbWFwM2lzcC5oCmluZGV4IGI2MTExZjguLmM3M2EzNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb21hcDNpc3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L29tYXAzaXNwLmgKQEAgLTYyLDE0ICs2MiwxMiBAQAogICogVjRMMl9FVkVOVF9PTUFQM0lTUF9BRVdCOiBBRVdCIHN0YXRpc3RpY3MgZGF0YSByZWFkeQogICogVjRMMl9FVkVOVF9PTUFQM0lTUF9BRjogQUYgc3RhdGlzdGljcyBkYXRhIHJlYWR5CiAgKiBWNEwyX0VWRU5UX09NQVAzSVNQX0hJU1Q6IEhpc3RvZ3JhbSBzdGF0aXN0aWNzIGRhdGEgcmVhZHkKLSAqIFY0TDJfRVZFTlRfT01BUDNJU1BfSFNfVlM6IEhvcml6b250YWwvdmVydGljYWwgc3luY2hyb25pemF0aW9uIGRldGVjdGVkCiAgKi8KIAogI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTCShWNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQgfCAweDEwMCkKICNkZWZpbmUgVjRMMl9FVkVOVF9PTUFQM0lTUF9BRVdCCShWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTIHwgMHgxKQogI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0FGCQkoVjRMMl9FVkVOVF9PTUFQM0lTUF9DTEFTUyB8IDB4MikKICNkZWZpbmUgVjRMMl9FVkVOVF9PTUFQM0lTUF9ISVNUCShWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTIHwgMHgzKQotI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0hTX1ZTCShWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTIHwgMHg0KQogCiBzdHJ1Y3Qgb21hcDNpc3Bfc3RhdF9ldmVudF9zdGF0dXMgewogCV9fdTMyIGZyYW1lX251bWJlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb29tLmggYi9pbmNsdWRlL2xpbnV4L29vbS5oCmluZGV4IDEzYjdiMDIuLjZmOWQwNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb29tLmgKKysrIGIvaW5jbHVkZS9saW51eC9vb20uaApAQCAtNDAsNiArNDAsNyBAQAogCUNPTlNUUkFJTlRfTUVNQ0csCiB9OwogCitleHRlcm4gdm9pZCBjb21wYXJlX3N3YXBfb29tX3Njb3JlX2FkaihpbnQgb2xkX3ZhbCwgaW50IG5ld192YWwpOwogZXh0ZXJuIGludCB0ZXN0X3NldF9vb21fc2NvcmVfYWRqKGludCBuZXdfdmFsKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBvb21fYmFkbmVzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29wcC5oIGIvaW5jbHVkZS9saW51eC9vcHAuaAppbmRleCA4N2E5MjA4Li5lZTk0YjMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29wcC5oCisrKyBiL2luY2x1ZGUvbGludXgvb3BwLmgKQEAgLTk3LDExICs5NywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgc3JjdV9ub3RpZmllcl9oZWFkICpvcHBfZ2V0X25vdGlmaWVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNyY3Vfbm90aWZpZXJfaGVhZCAqb3BwX2dldF9ub3RpZmllcihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiB9Ci0jZW5kaWYJCS8qIENPTkZJR19QTSAqLworI2VuZGlmCQkvKiBDT05GSUdfUE1fT1BQICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfRlJFUSkgJiYgZGVmaW5lZChDT05GSUdfUE1fT1BQKQogaW50IG9wcF9pbml0X2NwdWZyZXFfdGFibGUoc3RydWN0IGRldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2ktYXRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaS1hdHMuaAppbmRleCA2NTU4MjRmLi5lM2QwYjM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS1hdHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1hdHMuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgTElOVVhfUENJX0FUU19ICiAjZGVmaW5lIExJTlVYX1BDSV9BVFNfSAogCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKIC8qIEFkZHJlc3MgVHJhbnNsYXRpb24gU2VydmljZSAqLwogc3RydWN0IHBjaV9hdHMgewogCWludCBwb3M7ICAgICAgICAvKiBjYXBhYmlsaXR5IHBvc2l0aW9uICovCkBAIC0xNSw2ICsxNyw3IEBACiBleHRlcm4gaW50IHBjaV9lbmFibGVfYXRzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwcyk7CiBleHRlcm4gdm9pZCBwY2lfZGlzYWJsZV9hdHMoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gaW50IHBjaV9hdHNfcXVldWVfZGVwdGgoc3RydWN0IHBjaV9kZXYgKmRldik7CisKIC8qKgogICogcGNpX2F0c19lbmFibGVkIC0gcXVlcnkgdGhlIEFUUyBzdGF0dXMKICAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCkBAIC00OSw0ICs1Miw3NiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BDSV9JT1YgKi8KIAorI2lmZGVmIENPTkZJR19QQ0lfUFJJCisKK2V4dGVybiBpbnQgIHBjaV9lbmFibGVfcHJpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgcmVxcyk7CitleHRlcm4gdm9pZCBwY2lfZGlzYWJsZV9wcmkoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIGJvb2wgcGNpX3ByaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2V4dGVybiBpbnQgIHBjaV9yZXNldF9wcmkoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIGJvb2wgcGNpX3ByaV9zdG9wcGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2V4dGVybiBpbnQgIHBjaV9wcmlfc3RhdHVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworI2Vsc2UgLyogQ09ORklHX1BDSV9QUkkgKi8KKworc3RhdGljIGlubGluZSBpbnQgcGNpX2VuYWJsZV9wcmkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiByZXFzKQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2Rpc2FibGVfcHJpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcGNpX3ByaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGNpX3Jlc2V0X3ByaShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGlubGluZSBib29sIHBjaV9wcmlfc3RvcHBlZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGNpX3ByaV9zdGF0dXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSV9QUkkgKi8KKworI2lmZGVmIENPTkZJR19QQ0lfUEFTSUQKKworZXh0ZXJuIGludCBwY2lfZW5hYmxlX3Bhc2lkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZmVhdHVyZXMpOworZXh0ZXJuIHZvaWQgcGNpX2Rpc2FibGVfcGFzaWQoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIGludCBwY2lfcGFzaWRfZmVhdHVyZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIGludCBwY2lfbWF4X3Bhc2lkcyhzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKKyNlbHNlICAvKiBDT05GSUdfUENJX1BBU0lEICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHBjaV9lbmFibGVfcGFzaWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBmZWF0dXJlcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjaV9kaXNhYmxlX3Bhc2lkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBwY2lfcGFzaWRfZmVhdHVyZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBjaV9tYXhfcGFzaWRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiAtRUlOVkFMOworfQorCisjZW5kaWYgLyogQ09ORklHX1BDSV9QQVNJRCAqLworCisKICNlbmRpZiAvKiBMSU5VWF9QQ0lfQVRTX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggZjFiMWNhMS4uMzM3ZGYwZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMjc1LDYgKzI3NSw3IEBACiAJdW5zaWduZWQgaW50CXBtZV9zdXBwb3J0OjU7CS8qIEJpdG1hc2sgb2Ygc3RhdGVzIGZyb20gd2hpY2ggUE1FIwogCQkJCQkgICBjYW4gYmUgZ2VuZXJhdGVkICovCiAJdW5zaWduZWQgaW50CXBtZV9pbnRlcnJ1cHQ6MTsKKwl1bnNpZ25lZCBpbnQJcG1lX3BvbGw6MTsJLyogUG9sbCBkZXZpY2UncyBQTUUgc3RhdHVzIGJpdCAqLwogCXVuc2lnbmVkIGludAlkMV9zdXBwb3J0OjE7CS8qIExvdyBwb3dlciBzdGF0ZSBEMSBpcyBzdXBwb3J0ZWQgKi8KIAl1bnNpZ25lZCBpbnQJZDJfc3VwcG9ydDoxOwkvKiBMb3cgcG93ZXIgc3RhdGUgRDIgaXMgc3VwcG9ydGVkICovCiAJdW5zaWduZWQgaW50CW5vX2QxZDI6MTsJLyogT25seSBhbGxvdyBEMCBhbmQgRDMgKi8KQEAgLTk1Nyw2ICs5NTgsNyBAQAogaW50IHBjaV9jZmdfc3BhY2Vfc2l6ZV9leHQoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX2NmZ19zcGFjZV9zaXplKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogdW5zaWduZWQgY2hhciBwY2lfYnVzX21heF9idXNucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKK3ZvaWQgcGNpX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIAogI2RlZmluZSBQQ0lfVkdBX1NUQVRFX0NIQU5HRV9CUklER0UgKDEgPDwgMCkKICNkZWZpbmUgUENJX1ZHQV9TVEFURV9DSEFOR0VfREVDT0RFUyAoMSA8PCAxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oCmluZGV4IDVkMDljYmEuLjQ1ZmMxNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2hvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9ob3RwbHVnLmgKQEAgLTEzMiwxMyArMTMyLDkgQEAKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIHBjaV9ocF9jaGFuZ2Vfc2xvdF9pbmZvCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LAogCQkJCQkJIHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyAqaW5mbyk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IHBjaV9ocF9yZWdpc3RlcihzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LAotCQkJCSAgc3RydWN0IHBjaV9idXMgKnBidXMsCi0JCQkJICBpbnQgZGV2bnIsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIF9fcGNpX2hwX3JlZ2lzdGVyKHNsb3QsIHBidXMsIGRldm5yLCBuYW1lLAotCQkJCSBUSElTX01PRFVMRSwgS0JVSUxEX01PRE5BTUUpOwotfQorLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICYgZnJpZW5kcyAqLworI2RlZmluZSBwY2lfaHBfcmVnaXN0ZXIoc2xvdCwgcGJ1cywgZGV2bnIsIG5hbWUpIFwKKwlfX3BjaV9ocF9yZWdpc3RlcihzbG90LCBwYnVzLCBkZXZuciwgbmFtZSwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQogCiAvKiBQQ0kgU2V0dGluZyBSZWNvcmQgKFR5cGUgMCkgKi8KIHN0cnVjdCBocHBfdHlwZTAgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCBhZTk2YmJlLi4xNzJiYTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMjMwMiw2ICsyMzAyLDExIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVORVNBU19TSDc3ODUJMHgwMDA3CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVORVNBU19TSDc3ODYJMHgwMDEwCiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFCTB4MTkyNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NPTEFSRkxBUkVfU0ZDNDAwMEFfMAkweDA3MDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TT0xBUkZMQVJFX1NGQzQwMDBBXzEJMHg2NzAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU09MQVJGTEFSRV9TRkM0MDAwQgkweDA3MTAKKwogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RESSAgICAgICAgICAgICAgIDB4MTkyRQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RESV9FSENJICAgICAgICAgIDB4MDEwMQogCkBAIC0yNDAwLDYgKzI0MDUsOCBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVpXQVZFCQkweDFhM2IKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FTTUVESUEJCTB4MWIyMQorCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfVEVLUkFNCQkweDFkZTEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9URUtSQU1fREMyOTAJMHhkYzI5CiAKQEAgLTI4NjgsMyArMjg3NSw1IEBACiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9YRU4JCTB4NTg1MwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1hFTl9QTEFURk9STQkweDAwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX09DWgkJMHgxYjg1CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKaW5kZXggZTg4NDA5Ni4uYjVkOTY1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApAQCAtNjYzLDYgKzY2MywyNiBAQAogI2RlZmluZSAgUENJX0FUU19DVFJMX1NUVSh4KQkoKHgpICYgMHgxZikJLyogU21hbGxlc3QgVHJhbnNsYXRpb24gVW5pdCAqLwogI2RlZmluZSAgUENJX0FUU19NSU5fU1RVCTEyCS8qIHNoaWZ0IG9mIG1pbmltdW0gU1RVIGJsb2NrICovCiAKKy8qIFBhZ2UgUmVxdWVzdCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgUENJX1BSSV9DQVAJCTB4MTMgICAgLyogUFJJIGNhcGFiaWxpdHkgSUQgKi8KKyNkZWZpbmUgUENJX1BSSV9DT05UUk9MX09GRgkweDA0CS8qIE9mZnNldCBvZiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9QUklfU1RBVFVTX09GRgkweDA2CS8qIE9mZnNldCBvZiBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1BSSV9FTkFCTEUJCTB4MDAwMQkvKiBFbmFibGUgbWFzayAqLworI2RlZmluZSBQQ0lfUFJJX1JFU0VUCQkweDAwMDIJLyogUmVzZXQgYml0IG1hc2sgKi8KKyNkZWZpbmUgUENJX1BSSV9TVEFUVVNfUkYJMHgwMDAxICAvKiBSZXF1ZXN0IEZhaWx1cmUgKi8KKyNkZWZpbmUgUENJX1BSSV9TVEFUVVNfVVBSR0kJMHgwMDAyICAvKiBVbmV4cGVjdGVkIFBSRyBpbmRleCAqLworI2RlZmluZSBQQ0lfUFJJX1NUQVRVU19TVE9QUEVECTB4MDEwMCAgLyogUFJJIFN0b3BwZWQgKi8KKyNkZWZpbmUgUENJX1BSSV9NQVhfUkVRX09GRgkweDA4CS8qIENhcCBvZmZzZXQgZm9yIG1heCByZXFzIHN1cHBvcnRlZCAqLworI2RlZmluZSBQQ0lfUFJJX0FMTE9DX1JFUV9PRkYJMHgwYwkvKiBDYXAgb2Zmc2V0IGZvciBtYXggcmVxcyBhbGxvd2VkICovCisKKy8qIFBBU0lEIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgUENJX1BBU0lEX0NBUAkJMHgxYiAgICAvKiBQQVNJRCBjYXBhYmlsaXR5IElEICovCisjZGVmaW5lIFBDSV9QQVNJRF9DQVBfT0ZGCTB4MDQgICAgLyogUEFTSUQgZmVhdHVyZSByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfUEFTSURfQ09OVFJPTF9PRkYgICAweDA2ICAgIC8qIFBBU0lEIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1BBU0lEX0VOQUJMRQkweDAxCS8qIEVuYWJsZS9TdXBwb3J0ZWQgYml0ICovCisjZGVmaW5lIFBDSV9QQVNJRF9FWEVDCQkweDAyCS8qIEV4ZWMgcGVybWlzc2lvbnMgRW5hYmxlL1N1cHBvcnRlZCAqLworI2RlZmluZSBQQ0lfUEFTSURfUFJJVgkJMHgwNAkvKiBQcml2aWxlZGdlIE1vZGUgRW5hYmxlL1N1cHBvcnQgKi8KKwogLyogU2luZ2xlIFJvb3QgSS9PIFZpcnR1YWxpemF0aW9uICovCiAjZGVmaW5lIFBDSV9TUklPVl9DQVAJCTB4MDQJLyogU1ItSU9WIENhcGFiaWxpdGllcyAqLwogI2RlZmluZSAgUENJX1NSSU9WX0NBUF9WRk0JMHgwMQkvKiBWRiBNaWdyYXRpb24gQ2FwYWJsZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waW5jdHJsL3BpbmN0cmwuaCBiL2luY2x1ZGUvbGludXgvcGluY3RybC9waW5jdHJsLmgKaW5kZXggMzYwNWU5NC4uMDRjMDExMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waW5jdHJsL3BpbmN0cmwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BpbmN0cmwvcGluY3RybC5oCkBAIC0xMjEsNiArMTIxLDcgQEAKIGV4dGVybiB2b2lkICpwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpOwogI2Vsc2UKIAorc3RydWN0IHBpbmN0cmxfZGV2OwogCiAvKiBTdWZmaWNpZW50bHkgc3R1cGlkIGRlZmF1bHQgZnVuY3Rpb24gd2hlbiBwaW5jdHJsIGlzIG5vdCBpbiB1c2UgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBwaW5faXNfdmFsaWQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCBpbnQgcGluKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2xlZHMtcmVuZXNhcy10cHUuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9sZWRzLXJlbmVzYXMtdHB1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1Mzg3MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9sZWRzLXJlbmVzYXMtdHB1LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfX0xFRFNfUkVORVNBU19UUFVfSF9fCisjZGVmaW5lIF9fTEVEU19SRU5FU0FTX1RQVV9IX18KKworc3RydWN0IGxlZF9yZW5lc2FzX3RwdV9jb25maWcgeworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgcGluX2dwaW9fZm47CisJdW5zaWduZWQgcGluX2dwaW87CisJdW5zaWduZWQgaW50IGNoYW5uZWxfb2Zmc2V0OworCXVuc2lnbmVkIGludCB0aW1lcl9iaXQ7CisJdW5zaWduZWQgaW50IG1heF9icmlnaHRuZXNzOworCXVuc2lnbmVkIGludCByZWZyZXNoX3JhdGU7Cit9OworCisjZW5kaWYgLyogX19MRURTX1JFTkVTQVNfVFBVX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKaW5kZXggNjUxYTA2Ni4uMmEyM2Y3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCkBAIC0xOTAsNiArMTkwLDIzIEBACiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRhdGEpOwogfQogCisvKiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKCkgLSBIZWxwZXIgbWFjcm8gZm9yIGRyaXZlcnMgdGhhdCBkb24ndCBkbworICogYW55dGhpbmcgc3BlY2lhbCBpbiBtb2R1bGUgaW5pdC9leGl0LiAgVGhpcyBlbGltaW5hdGVzIGEgbG90IG9mCisgKiBib2lsZXJwbGF0ZS4gIEVhY2ggbW9kdWxlIG1heSBvbmx5IHVzZSB0aGlzIG1hY3JvIG9uY2UsIGFuZAorICogY2FsbGluZyBpdCByZXBsYWNlcyBtb2R1bGVfaW5pdCgpIGFuZCBtb2R1bGVfZXhpdCgpCisgKi8KKyNkZWZpbmUgbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihfX3BsYXRmb3JtX2RyaXZlcikgXAorc3RhdGljIGludCBfX2luaXQgX19wbGF0Zm9ybV9kcml2ZXIjI19pbml0KHZvaWQpIFwKK3sgXAorCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJihfX3BsYXRmb3JtX2RyaXZlcikpOyBcCit9IFwKK21vZHVsZV9pbml0KF9fcGxhdGZvcm1fZHJpdmVyIyNfaW5pdCk7IFwKK3N0YXRpYyB2b2lkIF9fZXhpdCBfX3BsYXRmb3JtX2RyaXZlciMjX2V4aXQodm9pZCkgXAoreyBcCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJihfX3BsYXRmb3JtX2RyaXZlcikpOyBcCit9IFwKK21vZHVsZV9leGl0KF9fcGxhdGZvcm1fZHJpdmVyIyNfZXhpdCk7CisKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9jcmVhdGVfYnVuZGxlKHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKmRyaXZlciwKIAkJCQkJaW50ICgqcHJvYmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiksCiAJCQkJCXN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgbl9yZXMsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaCBiL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCmluZGV4IDcwYjI4NDAuLmQ4ZDkwMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCkBAIC0xMCw2ICsxMCw3IEBACiAjZGVmaW5lIF9MSU5VWF9QTV9SVU5USU1FX0gKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHBzLWdwaW8uaCBiL2luY2x1ZGUvbGludXgvcHBzLWdwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDM1YWJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wcHMtZ3Bpby5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBwcHMtZ3Bpby5oIC0tIFBQUyBjbGllbnQgZm9yIEdQSU9zCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKYW1lcyBOdXNzIDxqYW1lc251c3NAbmFub21ldHJpY3MuY2E+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX1BQU19HUElPX0gKKyNkZWZpbmUgX1BQU19HUElPX0gKKworc3RydWN0IHBwc19ncGlvX3BsYXRmb3JtX2RhdGEgeworCWJvb2wgYXNzZXJ0X2ZhbGxpbmdfZWRnZTsKKwlib29sIGNhcHR1cmVfY2xlYXI7CisJdW5zaWduZWQgaW50IGdwaW9fcGluOworCWNvbnN0IGNoYXIgKmdwaW9fbGFiZWw7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJpbnRrLmggYi9pbmNsdWRlL2xpbnV4L3ByaW50ay5oCmluZGV4IDAxMDFkNTUuLmYwZTIyZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJpbnRrLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcmludGsuaApAQCAtODIsMjIgKzgyLDIyIEBACiAgKiBEdW1teSBwcmludGsgZm9yIGRpc2FibGVkIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHRvIHVzZSB3aGlsc3QgbWFpbnRhaW5pbmcKICAqIGdjYydzIGZvcm1hdCBhbmQgc2lkZS1lZmZlY3QgY2hlY2tpbmcuCiAgKi8KLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpCitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDEsIDIpCiBpbnQgbm9fcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXJldHVybiAwOwogfQogCi1leHRlcm4gYXNtbGlua2FnZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkKK2V4dGVybiBhc21saW5rYWdlIF9fcHJpbnRmKDEsIDIpCiB2b2lkIGVhcmx5X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIGV4dGVybiBpbnQgcHJpbnRrX25lZWRzX2NwdShpbnQgY3B1KTsKIGV4dGVybiB2b2lkIHByaW50a190aWNrKHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX1BSSU5USwotYXNtbGlua2FnZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDApKSkKK2FzbWxpbmthZ2UgX19wcmludGYoMSwgMCkKIGludCB2cHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKLWFzbWxpbmthZ2UgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIF9fY29sZAorYXNtbGlua2FnZSBfX3ByaW50ZigxLCAyKSBfX2NvbGQKIGludCBwcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAvKgpAQCAtMTE3LDEyICsxMTcsMTIgQEAKIHZvaWQgbG9nX2J1Zl9rZXhlY19zZXR1cCh2b2lkKTsKIHZvaWQgX19pbml0IHNldHVwX2xvZ19idWYoaW50IGVhcmx5KTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMCkpKQorc3RhdGljIGlubGluZSBfX3ByaW50ZigxLCAwKQogaW50IHZwcmludGsoY29uc3QgY2hhciAqcywgdmFfbGlzdCBhcmdzKQogewogCXJldHVybiAwOwogfQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkgX19jb2xkCitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDEsIDIpIF9fY29sZAogaW50IHByaW50ayhjb25zdCBjaGFyICpzLCAuLi4pCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oIGIvaW5jbHVkZS9saW51eC9wc3RvcmUuaAppbmRleCBjYzAzYmJmLi5lYTU2NzMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHN0b3JlLmgKQEAgLTMyLDE1ICszMiwxNSBAQAogc3RydWN0IHBzdG9yZV9pbmZvIHsKIAlzdHJ1Y3QgbW9kdWxlCSpvd25lcjsKIAljaGFyCQkqbmFtZTsKLQlzdHJ1Y3QgbXV0ZXgJYnVmX211dGV4OwkvKiBzZXJpYWxpemUgYWNjZXNzIHRvICdidWYnICovCisJc3BpbmxvY2tfdAlidWZfbG9jazsJLyogc2VyaWFsaXplIGFjY2VzcyB0byAnYnVmJyAqLwogCWNoYXIJCSpidWY7CiAJc2l6ZV90CQlidWZzaXplOwogCWludAkJKCpvcGVuKShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJaW50CQkoKmNsb3NlKShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJc3NpemVfdAkJKCpyZWFkKSh1NjQgKmlkLCBlbnVtIHBzdG9yZV90eXBlX2lkICp0eXBlLAogCQkJc3RydWN0IHRpbWVzcGVjICp0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7Ci0JdTY0CQkoKndyaXRlKShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAotCQkJc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKKwlpbnQJCSgqd3JpdGUpKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0ICppZCwKKwkJCXVuc2lnbmVkIGludCBwYXJ0LCBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwogCWludAkJKCplcmFzZSkoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCiAJCQlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJdm9pZAkJKmRhdGE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmggYi9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmgKaW5kZXggMjZmOWUzNi4uZDkzZjk1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaApAQCAtMzEsNyArMzEsNyBAQAogI2RlZmluZSBxdW90YV9lcnJvcihzYiwgZm10LCBhcmdzLi4uKSBcCiAJX19xdW90YV9lcnJvcigoc2IpLCBfX2Z1bmNfXywgZm10ICwgIyMgYXJncykKIAotZXh0ZXJuIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpCitleHRlcm4gX19wcmludGYoMywgNCkKIHZvaWQgX19xdW90YV9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jLAogCQkgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFuZG9tLmggYi9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCmluZGV4IGQxMzA1OWYuLjhmNzQ1MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYW5kb20uaApAQCAtOTEsNiArOTEsMTkgQEAKIAlzdGF0ZS0+czMgPSBfX3NlZWQoaSwgMTUpOwogfQogCisjaWZkZWYgQ09ORklHX0FSQ0hfUkFORE9NCisjIGluY2x1ZGUgPGFzbS9hcmNocmFuZG9tLmg+CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgYXJjaF9nZXRfcmFuZG9tX2xvbmcodW5zaWduZWQgbG9uZyAqdikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFyY2hfZ2V0X3JhbmRvbV9pbnQodW5zaWduZWQgaW50ICp2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fXyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX1JBTkRPTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oIGIvaW5jbHVkZS9saW51eC9yZWdtYXAuaAppbmRleCAzZGFhYzJkLi42OTAyNzZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVnbWFwLmgKQEAgLTE1LDggKzE1LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAorc3RydWN0IG1vZHVsZTsKIHN0cnVjdCBpMmNfY2xpZW50Owogc3RydWN0IHNwaV9kZXZpY2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCmluZGV4IGI0Nzc3MWEuLmY3NzU2ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaApAQCAtMTQxLDYgKzE0MSw3IEBACiBpbnQgcmVndWxhdG9yX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKTsKIGludCByZWd1bGF0b3JfZm9yY2VfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpOwogaW50IHJlZ3VsYXRvcl9pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcik7CitpbnQgcmVndWxhdG9yX2Rpc2FibGVfZGVmZXJyZWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLCBpbnQgbXMpOwogCiBpbnQgcmVndWxhdG9yX2J1bGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG51bV9jb25zdW1lcnMsCiAJCSAgICAgICBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqY29uc3VtZXJzKTsKQEAgLTIxMSw2ICsyMTIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcmVndWxhdG9yX2Rpc2FibGVfZGVmZXJyZWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAorCQkJCQkgICAgIGludCBtcykKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKQogewogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAppbmRleCAxYTgwYmM3Li41MmM4OWFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaApAQCAtMTYsNiArMTYsNyBAQAogI2RlZmluZSBfX0xJTlVYX1JFR1VMQVRPUl9EUklWRVJfSF8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAKIHN0cnVjdCByZWd1bGF0b3JfZGV2OwpAQCAtMTk5LDYgKzIwMCw5IEBACiAJc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgKmNvbnN0cmFpbnRzOwogCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsJLyogZm9yIHRyZWUgKi8KIAorCXN0cnVjdCBkZWxheWVkX3dvcmsgZGlzYWJsZV93b3JrOworCWludCBkZWZlcnJlZF9kaXNhYmxlczsKKwogCXZvaWQgKnJlZ19kYXRhOwkJLyogcmVndWxhdG9yX2RldiBkYXRhICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZmJkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBncGlvLXJlZ3VsYXRvci5oCisgKgorICogQ29weXJpZ2h0IDIwMTEgSGVpa28gU3R1ZWJuZXIgPGhlaWtvQHNudGVjaC5kZT4KKyAqCisgKiBiYXNlZCBvbiBmaXhlZC5oCisgKgorICogQ29weXJpZ2h0IDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogUm9nZXIgUXVhZHJvcyA8ZXh0LXJvZ2VyLnF1YWRyb3NAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX1JFR1VMQVRPUl9HUElPX0gKKyNkZWZpbmUgX19SRUdVTEFUT1JfR1BJT19ICisKK3N0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhOworCitlbnVtIHJlZ3VsYXRvcl90eXBlOworCisvKioKKyAqIHN0cnVjdCBncGlvX3JlZ3VsYXRvcl9zdGF0ZSAtIHN0YXRlIGRlc2NyaXB0aW9uCisgKiBAdmFsdWU6CQltaWNyb3ZvbHRzIG9yIG1pY3JvYW1wcworICogQGdwaW9zOgkJYml0ZmllbGQgb2YgZ3BpbyB0YXJnZXQtc3RhdGVzIGZvciB0aGUgdmFsdWUKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzdXBwb3J0ZWQgc2V0dGluZyBvZiB0aGUgcmVndWxhdG9yCisgKiBhbmQgdGhlIG5lY2Vzc2FyeSBncGlvLXN0YXRlIHRvIGFjaGlldmUgaXQuCisgKgorICogVGhlIG4tdGggYml0IGluIHRoZSBiaXRmaWVsZCBkZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBuLXRoIEdQSU8KKyAqIGZyb20gdGhlIGdwaW9zLWFycmF5IGRlZmluZWQgaW4gZ3Bpb19yZWd1bGF0b3JfY29uZmlnIGJlbG93LgorICovCitzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3Jfc3RhdGUgeworCWludCB2YWx1ZTsKKwlpbnQgZ3Bpb3M7Cit9OworCisvKioKKyAqIHN0cnVjdCBncGlvX3JlZ3VsYXRvcl9jb25maWcgLSBjb25maWcgc3RydWN0dXJlCisgKiBAc3VwcGx5X25hbWU6CU5hbWUgb2YgdGhlIHJlZ3VsYXRvciBzdXBwbHkKKyAqIEBlbmFibGVfZ3BpbzoJR1BJTyB0byB1c2UgZm9yIGVuYWJsZSBjb250cm9sCisgKgkJCXNldCB0byAtRUlOVkFMIGlmIG5vdCB1c2VkCisgKiBAZW5hYmxlX2hpZ2g6CVBvbGFyaXR5IG9mIGVuYWJsZSBHUElPCisgKgkJCTEgPSBBY3RpdmUgaGlnaCwgMCA9IEFjdGl2ZSBsb3cKKyAqIEBlbmFibGVkX2F0X2Jvb3Q6CVdoZXRoZXIgcmVndWxhdG9yIGhhcyBiZWVuIGVuYWJsZWQgYXQKKyAqCQkJYm9vdCBvciBub3QuIDEgPSBZZXMsIDAgPSBObworICoJCQlUaGlzIGlzIHVzZWQgdG8ga2VlcCB0aGUgcmVndWxhdG9yIGF0CisgKgkJCXRoZSBkZWZhdWx0IHN0YXRlCisgKiBAc3RhcnR1cF9kZWxheToJU3RhcnQtdXAgdGltZSBpbiBtaWNyb3NlY29uZHMKKyAqIEBncGlvczoJCUFycmF5IGNvbnRhaW5pbmcgdGhlIGdwaW9zIG5lZWRlZCB0byBjb250cm9sCisgKgkJCXRoZSBzZXR0aW5nIG9mIHRoZSByZWd1bGF0b3IKKyAqIEBucl9ncGlvczoJCU51bWJlciBvZiBncGlvcworICogQHN0YXRlczoJCUFycmF5IG9mIGdwaW9fcmVndWxhdG9yX3N0YXRlIGVudHJpZXMgZGVzY3JpYmluZworICoJCQl0aGUgZ3BpbyBzdGF0ZSBmb3Igc3BlY2lmaWMgdm9sdGFnZXMKKyAqIEBucl9zdGF0ZXM6CQlOdW1iZXIgb2Ygc3RhdGVzIGF2YWlsYWJsZQorICogQHJlZ3VsYXRvcl90eXBlOgllaXRoZXIgUkVHVUxBVE9SX0NVUlJFTlQgb3IgUkVHVUxBVE9SX1ZPTFRBR0UKKyAqIEBpbml0X2RhdGE6CQlyZWd1bGF0b3JfaW5pdF9kYXRhCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZ3Bpby12b2x0YWdlIHJlZ3VsYXRvciBjb25maWd1cmF0aW9uCisgKiBpbmZvcm1hdGlvbiB0aGF0IG11c3QgYmUgcGFzc2VkIGJ5IHBsYXRmb3JtIGNvZGUgdG8gdGhlCisgKiBncGlvLXZvbHRhZ2UgcmVndWxhdG9yIGRyaXZlci4KKyAqLworc3RydWN0IGdwaW9fcmVndWxhdG9yX2NvbmZpZyB7CisJY29uc3QgY2hhciAqc3VwcGx5X25hbWU7CisKKwlpbnQgZW5hYmxlX2dwaW87CisJdW5zaWduZWQgZW5hYmxlX2hpZ2g6MTsKKwl1bnNpZ25lZCBlbmFibGVkX2F0X2Jvb3Q6MTsKKwl1bnNpZ25lZCBzdGFydHVwX2RlbGF5OworCisJc3RydWN0IGdwaW8gKmdwaW9zOworCWludCBucl9ncGlvczsKKworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9zdGF0ZSAqc3RhdGVzOworCWludCBucl9zdGF0ZXM7CisKKwllbnVtIHJlZ3VsYXRvcl90eXBlIHR5cGU7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oCmluZGV4IGNlMzEyN2EuLmYzZjEzZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmgKQEAgLTk1LDcgKzk1LDcgQEAKICAqLwogc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgewogCi0JY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpuYW1lOwogCiAJLyogdm9sdGFnZSBvdXRwdXQgcmFuZ2UgKGluY2x1c2l2ZSkgLSBmb3Igdm9sdGFnZSBjb250cm9sICovCiAJaW50IG1pbl91VjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmlvX2lkcy5oIGIvaW5jbHVkZS9saW51eC9yaW9faWRzLmgKaW5kZXggMGNlZTAxNS4uYjY2ZDEzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yaW9faWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9yaW9faWRzLmgKQEAgLTM5LDUgKzM5LDYgQEAKICNkZWZpbmUgUklPX0RJRF9JRFRDUFMxNjE2CQkweDAzNzkKICNkZWZpbmUgUklPX0RJRF9JRFRWUFMxNjE2CQkweDAzNzcKICNkZWZpbmUgUklPX0RJRF9JRFRTUFMxNjE2CQkweDAzNzgKKyNkZWZpbmUgUklPX0RJRF9UU0k3MjEJCQkweDgwYWIKIAogI2VuZGlmCQkJCS8qIExJTlVYX1JJT19JRFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydGMvc2lyZnNvY19ydGNpb2JyZy5oIGIvaW5jbHVkZS9saW51eC9ydGMvc2lyZnNvY19ydGNpb2JyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOTJlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3J0Yy9zaXJmc29jX3J0Y2lvYnJnLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIFJUQyBJL08gQnJpZGdlIGludGVyZmFjZXMgZm9yIENTUiBTaVJGcHJpbWFJSQorICogQVJNIGFjY2VzcyB0aGUgcmVnaXN0ZXJzIG9mIFNZU1JUQywgR1BTUlRDIGFuZCBQV1JDIHRocm91Z2ggdGhpcyBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCisgKi8KKyNpZm5kZWYgX1NJUkZTT0NfUlRDX0lPQlJHX0hfCisjZGVmaW5lIF9TSVJGU09DX1JUQ19JT0JSR19IXworCitleHRlcm4gdm9pZCBzaXJmc29jX3J0Y19pb2JyZ19iZXN5bmNpbmcodm9pZCk7CisKK2V4dGVybiB1MzIgc2lyZnNvY19ydGNfaW9icmdfcmVhZGwodTMyIGFkZHIpOworCitleHRlcm4gdm9pZCBzaXJmc29jX3J0Y19pb2JyZ193cml0ZWwodTMyIHZhbCwgdTMyIGFkZHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCBlOGFjY2U3Li42OGRhZjRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xNTIyLDYgKzE1MjIsMTMgQEAKIAlpbnQgbWFrZV9pdF9mYWlsOwogI2VuZGlmCiAJc3RydWN0IHByb3BfbG9jYWxfc2luZ2xlIGRpcnRpZXM7CisJLyoKKwkgKiB3aGVuIChucl9kaXJ0aWVkID49IG5yX2RpcnRpZWRfcGF1c2UpLCBpdCdzIHRpbWUgdG8gY2FsbAorCSAqIGJhbGFuY2VfZGlydHlfcGFnZXMoKSBmb3Igc29tZSBkaXJ0eSB0aHJvdHRsaW5nIHBhdXNlCisJICovCisJaW50IG5yX2RpcnRpZWQ7CisJaW50IG5yX2RpcnRpZWRfcGF1c2U7CisKICNpZmRlZiBDT05GSUdfTEFURU5DWVRPUAogCWludCBsYXRlbmN5X3JlY29yZF9jb3VudDsKIAlzdHJ1Y3QgbGF0ZW5jeV9yZWNvcmQgbGF0ZW5jeV9yZWNvcmRbTFRfU0FWRUNPVU5UXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VtLmggYi9pbmNsdWRlL2xpbnV4L3NlbS5oCmluZGV4IDFmZWIyZGUuLjEwZDZiMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VtLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZW0uaApAQCAtODMsMTMgKzgzLDYgQEAKIAogc3RydWN0IHRhc2tfc3RydWN0OwogCi0vKiBPbmUgc2VtYXBob3JlIHN0cnVjdHVyZSBmb3IgZWFjaCBzZW1hcGhvcmUgaW4gdGhlIHN5c3RlbS4gKi8KLXN0cnVjdCBzZW0gewotCWludAlzZW12YWw7CQkvKiBjdXJyZW50IHZhbHVlICovCi0JaW50CXNlbXBpZDsJCS8qIHBpZCBvZiBsYXN0IG9wZXJhdGlvbiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2VtX3BlbmRpbmc7IC8qIHBlbmRpbmcgc2luZ2xlLXNvcCBvcGVyYXRpb25zICovCi19OwotCiAvKiBPbmUgc2VtX2FycmF5IGRhdGEgc3RydWN0dXJlIGZvciBlYWNoIHNldCBvZiBzZW1hcGhvcmVzIGluIHRoZSBzeXN0ZW0uICovCiBzdHJ1Y3Qgc2VtX2FycmF5IHsKIAlzdHJ1Y3Qga2Vybl9pcGNfcGVybQlfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wCkBAIC0xMDMsNTEgKzk2LDIxIEBACiAJaW50CQkJY29tcGxleF9jb3VudDsJLyogcGVuZGluZyBjb21wbGV4IG9wZXJhdGlvbnMgKi8KIH07CiAKLS8qIE9uZSBxdWV1ZSBmb3IgZWFjaCBzbGVlcGluZyBwcm9jZXNzIGluIHRoZSBzeXN0ZW0uICovCi1zdHJ1Y3Qgc2VtX3F1ZXVlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXNpbXBsZV9saXN0OyAvKiBxdWV1ZSBvZiBwZW5kaW5nIG9wZXJhdGlvbnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CSAvKiBxdWV1ZSBvZiBwZW5kaW5nIG9wZXJhdGlvbnMgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnNsZWVwZXI7IC8qIHRoaXMgcHJvY2VzcyAqLwotCXN0cnVjdCBzZW1fdW5kbwkJKnVuZG87CSAvKiB1bmRvIHN0cnVjdHVyZSAqLwotCWludCAgICAJCQlwaWQ7CSAvKiBwcm9jZXNzIGlkIG9mIHJlcXVlc3RpbmcgcHJvY2VzcyAqLwotCWludCAgICAJCQlzdGF0dXM7CSAvKiBjb21wbGV0aW9uIHN0YXR1cyBvZiBvcGVyYXRpb24gKi8KLQlzdHJ1Y3Qgc2VtYnVmCQkqc29wczsJIC8qIGFycmF5IG9mIHBlbmRpbmcgb3BlcmF0aW9ucyAqLwotCWludAkJCW5zb3BzOwkgLyogbnVtYmVyIG9mIG9wZXJhdGlvbnMgKi8KLQlpbnQJCQlhbHRlcjsgICAvKiBkb2VzIHRoZSBvcGVyYXRpb24gYWx0ZXIgdGhlIGFycmF5PyAqLwotfTsKLQotLyogRWFjaCB0YXNrIGhhcyBhIGxpc3Qgb2YgdW5kbyByZXF1ZXN0cy4gVGhleSBhcmUgZXhlY3V0ZWQgYXV0b21hdGljYWxseQotICogd2hlbiB0aGUgcHJvY2VzcyBleGl0cy4KLSAqLwotc3RydWN0IHNlbV91bmRvIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3RfcHJvYzsJLyogcGVyLXByb2Nlc3MgbGlzdDogYWxsIHVuZG9zIGZyb20gb25lIHByb2Nlc3MuICovCi0JCQkJCQkvKiByY3UgcHJvdGVjdGVkICovCi0Jc3RydWN0IHJjdV9oZWFkCQlyY3U7CQkvKiByY3Ugc3RydWN0IGZvciBzZW1fdW5kbygpICovCi0Jc3RydWN0IHNlbV91bmRvX2xpc3QJKnVscDsJCS8qIHNlbV91bmRvX2xpc3QgZm9yIHRoZSBwcm9jZXNzICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0X2lkOwkvKiBwZXIgc2VtYXBob3JlIGFycmF5IGxpc3Q6IGFsbCB1bmRvcyBmb3Igb25lIGFycmF5ICovCi0JaW50CQkJc2VtaWQ7CQkvKiBzZW1hcGhvcmUgc2V0IGlkZW50aWZpZXIgKi8KLQlzaG9ydCAqCQkJc2VtYWRqOwkJLyogYXJyYXkgb2YgYWRqdXN0bWVudHMsIG9uZSBwZXIgc2VtYXBob3JlICovCi19OwotCi0vKiBzZW1fdW5kb19saXN0IGNvbnRyb2xzIHNoYXJlZCBhY2Nlc3MgdG8gdGhlIGxpc3Qgb2Ygc2VtX3VuZG8gc3RydWN0dXJlcwotICogdGhhdCBtYXkgYmUgc2hhcmVkIGFtb25nIGFsbCBhIENMT05FX1NZU1ZTRU0gdGFzayBncm91cC4KLSAqLyAKLXN0cnVjdCBzZW1fdW5kb19saXN0IHsKLQlhdG9taWNfdAkJcmVmY250OwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0X3Byb2M7Ci19OworI2lmZGVmIENPTkZJR19TWVNWSVBDCiAKIHN0cnVjdCBzeXN2X3NlbSB7CiAJc3RydWN0IHNlbV91bmRvX2xpc3QgKnVuZG9fbGlzdDsKIH07CiAKLSNpZmRlZiBDT05GSUdfU1lTVklQQwotCiBleHRlcm4gaW50IGNvcHlfc2VtdW5kbyh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiBleHRlcm4gdm9pZCBleGl0X3NlbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAKICNlbHNlCisKK3N0cnVjdCBzeXN2X3NlbSB7CisJLyogZW1wdHkgKi8KK307CisKIHN0YXRpYyBpbmxpbmUgaW50IGNvcHlfc2VtdW5kbyh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VxX2ZpbGUuaCBiL2luY2x1ZGUvbGludXgvc2VxX2ZpbGUuaAppbmRleCBiZTcyMGNkLi4wYjY5YTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcV9maWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXFfZmlsZS5oCkBAIC04NCw4ICs4NCw3IEBACiBpbnQgc2VxX3B1dHMoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCBjaGFyICpzKTsKIGludCBzZXFfd3JpdGUoc3RydWN0IHNlcV9maWxlICpzZXEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOwogCi1pbnQgc2VxX3ByaW50ZihzdHJ1Y3Qgc2VxX2ZpbGUgKiwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLDIsMykpKTsKK19fcHJpbnRmKDIsIDMpIGludCBzZXFfcHJpbnRmKHN0cnVjdCBzZXFfZmlsZSAqLCBjb25zdCBjaGFyICosIC4uLik7CiAKIGludCBzZXFfcGF0aChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHBhdGggKiwgY2hhciAqKTsKIGludCBzZXFfZGVudHJ5KHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9zY2kuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCmluZGV4IDhiZmZlOWEuLjM2OTI3M2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCkBAIC02Nyw2ICs2Nyw3IEBACiAJU0NJeF9JUkRBX1JFR1RZUEUsCiAJU0NJeF9TQ0lGQV9SRUdUWVBFLAogCVNDSXhfU0NJRkJfUkVHVFlQRSwKKwlTQ0l4X1NIMl9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiAJU0NJeF9TSDNfU0NJRl9SRUdUWVBFLAogCVNDSXhfU0g0X1NDSUZfUkVHVFlQRSwKIAlTQ0l4X1NINF9TQ0lGX05PX1NDU1BUUl9SRUdUWVBFLApAQCAtMTMxLDggKzEzMiw2IEBACiAKIAlzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMJKm9wczsKIAotCXN0cnVjdCBkZXZpY2UJKmRtYV9kZXY7Ci0KIAl1bnNpZ25lZCBpbnQJZG1hX3NsYXZlX3R4OwogCXVuc2lnbmVkIGludAlkbWFfc2xhdmVfcng7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpby5oIGIvaW5jbHVkZS9saW51eC9zZXJpby5oCmluZGV4IGUyNmY0NzguLmNhODI4NjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKQEAgLTc5LDE5ICs3OSwyMSBAQAogaXJxcmV0dXJuX3Qgc2VyaW9faW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzKTsKIAogdm9pZCBfX3NlcmlvX3JlZ2lzdGVyX3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IG1vZHVsZSAqb3duZXIpOwotc3RhdGljIGlubGluZSB2b2lkIHNlcmlvX3JlZ2lzdGVyX3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbykKLXsKLQlfX3NlcmlvX3JlZ2lzdGVyX3BvcnQoc2VyaW8sIFRISVNfTU9EVUxFKTsKLX0KKworLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICovCisjZGVmaW5lIHNlcmlvX3JlZ2lzdGVyX3BvcnQoc2VyaW8pIFwKKwlfX3NlcmlvX3JlZ2lzdGVyX3BvcnQoc2VyaW8sIFRISVNfTU9EVUxFKQogCiB2b2lkIHNlcmlvX3VucmVnaXN0ZXJfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKIHZvaWQgc2VyaW9fdW5yZWdpc3Rlcl9jaGlsZF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pOwogCi1pbnQgX19zZXJpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgbW9kdWxlICpvd25lciwgY29uc3QgY2hhciAqbW9kX25hbWUpOwotc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCi17Ci0JcmV0dXJuIF9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKGRydiwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKTsKLX0KK2ludCBfX211c3RfY2hlY2sgX19zZXJpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2LAorCQkJCXN0cnVjdCBtb2R1bGUgKm93bmVyLCBjb25zdCBjaGFyICptb2RfbmFtZSk7CisKKy8qIHVzZSBhIGRlZmluZSB0byBhdm9pZCBpbmNsdWRlIGNoYWluaW5nIHRvIGdldCBUSElTX01PRFVMRSAmIGZyaWVuZHMgKi8KKyNkZWZpbmUgc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKGRydikgXAorCV9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKGRydiwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQorCiB2b2lkIHNlcmlvX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydik7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlcmlvX3dyaXRlKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSkKQEAgLTE5OSw1ICsyMDEsNiBAQAogI2RlZmluZSBTRVJJT19EWU5BUFJPCTB4M2EKICNkZWZpbmUgU0VSSU9fSEFNUFNISVJFCTB4M2IKICNkZWZpbmUgU0VSSU9fUFMyTVVMVAkweDNjCisjZGVmaW5lIFNFUklPX1RTQzQwCTB4M2QKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NoX2Nsay5oIGIvaW5jbHVkZS9saW51eC9zaF9jbGsuaAppbmRleCAzY2NmMTg2Li5hMjA4MzFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NoX2Nsay5oCisrKyBiL2luY2x1ZGUvbGludXgvc2hfY2xrLmgKQEAgLTUyLDcgKzUyLDYgQEAKIAogCXVuc2lnbmVkIGxvbmcJCWFyY2hfZmxhZ3M7CiAJdm9pZAkJCSpwcml2OwotCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CiAJc3RydWN0IGNsa19tYXBwaW5nCSptYXBwaW5nOwogCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZTsKIAl1bnNpZ25lZCBpbnQJCW5yX2ZyZXFzOwpAQCAtOTQsNiArOTMsOSBAQAogbG9uZyBjbGtfcmF0ZV9kaXZfcmFuZ2Vfcm91bmQoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBpbnQgZGl2X21pbiwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBkaXZfbWF4LCB1bnNpZ25lZCBsb25nIHJhdGUpOwogCitsb25nIGNsa19yYXRlX211bHRfcmFuZ2Vfcm91bmQoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBpbnQgbXVsdF9taW4sCisJCQkgICAgICAgdW5zaWduZWQgaW50IG11bHRfbWF4LCB1bnNpZ25lZCBsb25nIHJhdGUpOworCiBsb25nIGNsa19yb3VuZF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHRhcmdldCwKIAkJICAgICAgdW5zaWduZWQgbG9uZyAqYmVzdF9mcmVxLCB1bnNpZ25lZCBsb25nICpwYXJlbnRfZnJlcSwKIAkJICAgICAgdW5zaWduZWQgaW50IGRpdl9taW4sIHVuc2lnbmVkIGludCBkaXZfbWF4KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2hfcGZjLmggYi9pbmNsdWRlL2xpbnV4L3NoX3BmYy5oCmluZGV4IDMwY2FlNzAuLjg0NDY3ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2hfcGZjLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaF9wZmMuaApAQCAtNjEsNiArNjEsMTQgQEAKIAkucmVnID0gciwgLnJlZ193aWR0aCA9IHJfd2lkdGgsCVwKIAkuZW51bV9pZHMgPSAocGlubXV4X2VudW1fdCBbcl93aWR0aF0pIFwKIAorc3RydWN0IHBpbm11eF9pcnEgeworCWludCBpcnE7CisJcGlubXV4X2VudW1fdCAqZW51bV9pZHM7Cit9OworCisjZGVmaW5lIFBJTk1VWF9JUlEoaXJxX25yLCBpZHMuLi4pCQkJICAgXAorCXsgLmlycSA9IGlycV9uciwgLmVudW1faWRzID0gKHBpbm11eF9lbnVtX3QgW10pIHsgaWRzLCAwIH0gfQlcCisKIHN0cnVjdCBwaW5tdXhfcmFuZ2UgewogCXBpbm11eF9lbnVtX3QgYmVnaW47CiAJcGlubXV4X2VudW1fdCBlbmQ7CkBAIC04NywxMSArOTUsODkgQEAKIAlwaW5tdXhfZW51bV90ICpncGlvX2RhdGE7CiAJdW5zaWduZWQgaW50IGdwaW9fZGF0YV9zaXplOwogCi0JdW5zaWduZWQgbG9uZyAqZ3Bpb19pbl91c2U7CisJc3RydWN0IHBpbm11eF9pcnEgKmdwaW9faXJxOworCXVuc2lnbmVkIGludCBncGlvX2lycV9zaXplOworCiAJc3RydWN0IGdwaW9fY2hpcCBjaGlwOwogfTsKIAogaW50IHJlZ2lzdGVyX3Bpbm11eChzdHJ1Y3QgcGlubXV4X2luZm8gKnBpcCk7CiBpbnQgdW5yZWdpc3Rlcl9waW5tdXgoc3RydWN0IHBpbm11eF9pbmZvICpwaXApOwogCisvKiBoZWxwZXIgbWFjcm8gZm9yIHBvcnQgKi8KKyNkZWZpbmUgUE9SVF8xKGZuLCBwZngsIHNmeCkgZm4ocGZ4LCBzZngpCisKKyNkZWZpbmUgUE9SVF8xMChmbiwgcGZ4LCBzZngpIFwKKwlQT1JUXzEoZm4sIHBmeCMjMCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzEsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMiwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzMsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjNCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzUsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjNiwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzcsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjOCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzksIHNmeCkKKworI2RlZmluZSBQT1JUXzkwKGZuLCBwZngsIHNmeCkgXAorCVBPUlRfMTAoZm4sIHBmeCMjMSwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMyLCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMzLCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzQsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzUsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjNiwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjNywgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyM4LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyM5LCBzZngpCisKKyNkZWZpbmUgX1BPUlRfQUxMKHBmeCwgc2Z4KSBwZngjI18jI3NmeAorI2RlZmluZSBfR1BJT19QT1JUKHBmeCwgc2Z4KSBQSU5NVVhfR1BJTyhHUElPX1BPUlQjI3BmeCwgUE9SVCMjcGZ4IyNfREFUQSkKKyNkZWZpbmUgUE9SVF9BTEwoc3RyKQlDUFVfQUxMX1BPUlQoX1BPUlRfQUxMLCBQT1JULCBzdHIpCisjZGVmaW5lIEdQSU9fUE9SVF9BTEwoKQlDUFVfQUxMX1BPUlQoX0dQSU9fUE9SVCwgLCB1bnVzZWQpCisjZGVmaW5lIEdQSU9fRk4oc3RyKSBQSU5NVVhfR1BJTyhHUElPX0ZOXyMjc3RyLCBzdHIjI19NQVJLKQorCisvKiBoZWxwZXIgbWFjcm8gZm9yIHBpbm11eF9lbnVtX3QgKi8KKyNkZWZpbmUgUE9SVF9EQVRBX0kobnIpCVwKKwlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX0lOKQorCisjZGVmaW5lIFBPUlRfREFUQV9JX1BEKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAorCQkgICAgUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCkKKworI2RlZmluZSBQT1JUX0RBVEFfSV9QVShucikJXAorCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUFUpCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lfUFVfUEQobnIpCVwKKwlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAkJCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQsIFBPUlQjI25yIyNfSU5fUFUpCisKKyNkZWZpbmUgUE9SVF9EQVRBX08obnIpCQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQpCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lPKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4pCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lPX1BEKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQpCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lPX1BVKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUFUpCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lPX1BVX1BEKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQsIFBPUlQjI25yIyNfSU5fUFUpCisKKy8qIGhlbHBlciBtYWNybyBmb3IgdG9wIDQgYml0cyBpbiBQT1JUbkNSICovCisjZGVmaW5lIF9QQ1JIKGluLCBpbl9wZCwgaW5fcHUsIG91dCkJXAorCTAsIChvdXQpLCAoaW4pLCAwLAkJXAorCTAsIDAsIDAsIDAsCQkJXAorCTAsIDAsIChpbl9wZCksIDAsCQlcCisJMCwgMCwgKGluX3B1KSwgMAorCisjZGVmaW5lIFBPUlRDUihuciwgcmVnKQkJCQkJCQlcCisJewkJCQkJCQkJXAorCQlQSU5NVVhfQ0ZHX1JFRygiUE9SVCIgbnIgIkNSIiwgcmVnLCA4LCA0KSB7CQlcCisJCQlfUENSSChQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BELAkJXAorCQkJICAgICAgUE9SVCMjbnIjI19JTl9QVSwgUE9SVCMjbnIjI19PVVQpLAlcCisJCQkJUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfRk4xLAkJXAorCQkJCVBPUlQjI25yIyNfRk4yLCBQT1JUIyNuciMjX0ZOMywJCVwKKwkJCQlQT1JUIyNuciMjX0ZONCwgUE9SVCMjbnIjI19GTjUsCQlcCisJCQkJUE9SVCMjbnIjI19GTjYsIFBPUlQjI25yIyNfRk43IH0JXAorCX0KKwogI2VuZGlmIC8qIF9fU0hfUEZDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2hyaW5rZXIuaCBiL2luY2x1ZGUvbGludXgvc2hyaW5rZXIuaAppbmRleCA3OTA2NTFiLi5hODM4MzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Nocmlua2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaHJpbmtlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAgKiAnbnJfdG9fc2NhbicgZW50cmllcyBhbmQgYXR0ZW1wdCB0byBmcmVlIHRoZW0gdXAuICBJdCBzaG91bGQgcmV0dXJuCiAgKiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgd2hpY2ggcmVtYWluIGluIHRoZSBjYWNoZS4gIElmIGl0IHJldHVybnMgLTEsIGl0IG1lYW5zCiAgKiBpdCBjYW5ub3QgZG8gYW55IHNjYW5uaW5nIGF0IHRoaXMgdGltZSAoZWcuIHRoZXJlIGlzIGEgcmlzayBvZiBkZWFkbG9jaykuCisgKiBUaGUgY2FsbGJhY2sgbXVzdCBub3QgcmV0dXJuIC0xIGlmIG5yX3RvX3NjYW4gaXMgemVyby4KICAqCiAgKiBUaGUgJ2dmcG1hc2snIHJlZmVycyB0byB0aGUgYWxsb2NhdGlvbiB3ZSBhcmUgY3VycmVudGx5IHRyeWluZyB0bwogICogZnVsZmlsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNmE2YjM1Mi4uZjQ0NDI2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC0yMTgsNiArMjE4LDkgQEAKIAogCS8qIGRldmljZSBkcml2ZXIgc3VwcG9ydHMgVFggemVyby1jb3B5IGJ1ZmZlcnMgKi8KIAlTS0JUWF9ERVZfWkVST0NPUFkgPSAxIDw8IDQsCisKKwkvKiBnZW5lcmF0ZSB3aWZpIHN0YXR1cyBpbmZvcm1hdGlvbiAod2hlcmUgcG9zc2libGUpICovCisJU0tCVFhfV0lGSV9TVEFUVVMgPSAxIDw8IDUsCiB9OwogCiAvKgpAQCAtMzUyLDYgKzM1NSw4IEBACiAgKglAb29vX29rYXk6IGFsbG93IHRoZSBtYXBwaW5nIG9mIGEgc29ja2V0IHRvIGEgcXVldWUgdG8gYmUgY2hhbmdlZAogICoJQGw0X3J4aGFzaDogaW5kaWNhdGUgcnhoYXNoIGlzIGEgY2Fub25pY2FsIDQtdHVwbGUgaGFzaCBvdmVyIHRyYW5zcG9ydAogICoJCXBvcnRzLgorICoJQHdpZmlfYWNrZWRfdmFsaWQ6IHdpZmlfYWNrZWQgd2FzIHNldAorICoJQHdpZmlfYWNrZWQ6IHdoZXRoZXIgZnJhbWUgd2FzIGFja2VkIG9uIHdpZmkgb3Igbm90CiAgKglAZG1hX2Nvb2tpZTogYSBjb29raWUgdG8gb25lIG9mIHNldmVyYWwgcG9zc2libGUgRE1BIG9wZXJhdGlvbnMKICAqCQlkb25lIGJ5IHNrYiBETUEgZnVuY3Rpb25zCiAgKglAc2VjbWFyazogc2VjdXJpdHkgbWFya2luZwpAQCAtNDQ1LDEwICs0NTAsMTEgQEAKICNlbmRpZgogCV9fdTgJCQlvb29fb2theToxOwogCV9fdTgJCQlsNF9yeGhhc2g6MTsKKwlfX3U4CQkJd2lmaV9hY2tlZF92YWxpZDoxOworCV9fdTgJCQl3aWZpX2Fja2VkOjE7CisJLyogMTAvMTIgYml0IGhvbGUgKGRlcGVuZGluZyBvbiBuZGlzY19ub2RldHlwZSBwcmVzZW5jZSkgKi8KIAlrbWVtY2hlY2tfYml0ZmllbGRfZW5kKGZsYWdzMik7CiAKLQkvKiAwLzEzIGJpdCBob2xlICovCi0KICNpZmRlZiBDT05GSUdfTkVUX0RNQQogCWRtYV9jb29raWVfdAkJZG1hX2Nvb2tpZTsKICNlbmRpZgpAQCAtMTgwNiwxMiArMTgxMiwxMiBAQAogCiAvKioKICAqIHNrYl9mcmFnX2RtYV9tYXAgLSBtYXBzIGEgcGFnZWQgZnJhZ21lbnQgdmlhIHRoZSBETUEgQVBJCi0gKiBAZGV2aWNlOiB0aGUgZGV2aWNlIHRvIG1hcCB0aGUgZnJhZ21lbnQgdG8KKyAqIEBkZXY6IHRoZSBkZXZpY2UgdG8gbWFwIHRoZSBmcmFnbWVudCB0bwogICogQGZyYWc6IHRoZSBwYWdlZCBmcmFnbWVudCB0byBtYXAKICAqIEBvZmZzZXQ6IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmcmFnbWVudCAoc3RhcnRpbmcgYXQgdGhlCiAgKiAgICAgICAgICBmcmFnbWVudCdzIG93biBvZmZzZXQpCiAgKiBAc2l6ZTogdGhlIG51bWJlciBvZiBieXRlcyB0byBtYXAKLSAqIEBkaXJlY3Rpb246IHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1hcHBpbmcgKCVQQ0lfRE1BXyopCisgKiBAZGlyOiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtYXBwaW5nICglUENJX0RNQV8qKQogICoKICAqIE1hcHMgdGhlIHBhZ2UgYXNzb2NpYXRlZCB3aXRoIEBmcmFnIHRvIEBkZXZpY2UuCiAgKi8KQEAgLTIyNjMsNiArMjI2OSwxNSBAQAogCXN3X3R4X3RpbWVzdGFtcChza2IpOwogfQogCisvKioKKyAqIHNrYl9jb21wbGV0ZV93aWZpX2FjayAtIGRlbGl2ZXIgc2tiIHdpdGggd2lmaSBzdGF0dXMKKyAqCisgKiBAc2tiOiB0aGUgb3JpZ2luYWwgb3V0Z29pbmcgcGFja2V0CisgKiBAYWNrZWQ6IGFjayBzdGF0dXMKKyAqCisgKi8KK3ZvaWQgc2tiX2NvbXBsZXRlX3dpZmlfYWNrKHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgYWNrZWQpOworCiBleHRlcm4gX19zdW0xNiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZV9oZWFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pOwogZXh0ZXJuIF9fc3VtMTYgX19za2JfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL2w0ZjAwMjQydDAzLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9sNGYwMDI0MnQwMy5oCmluZGV4IGFlZTFkYmQuLmJjODY3N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpL2w0ZjAwMjQydDAzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvbDRmMDAyNDJ0MDMuaApAQCAtMjQsOCArMjQsNiBAQAogc3RydWN0IGw0ZjAwMjQydDAzX3BkYXRhIHsKIAl1bnNpZ25lZCBpbnQJcmVzZXRfZ3BpbzsKIAl1bnNpZ25lZCBpbnQJZGF0YV9lbmFibGVfZ3BpbzsKLQljb25zdCBjaGFyIAkqaW9fc3VwcGx5OwkvKiB3aWxsIGJlIHNldCB0byAxLjggViAqLwotCWNvbnN0IGNoYXIgCSpjb3JlX3N1cHBseTsJLyogd2lsbCBiZSBzZXQgdG8gMi44IFYgKi8KIH07CiAKICNlbmRpZiAvKiBfSU5DTFVERV9MSU5VWF9TUElfTDRGMDAyNDJUMDNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3NiL3NzYi5oIGIvaW5jbHVkZS9saW51eC9zc2Ivc3NiLmgKaW5kZXggZjEwZWQ3Yi4uMDYxZTU2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zc2Ivc3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zc2Ivc3NiLmgKQEAgLTIzMSwxMCArMjMxLDkgQEAKICNkZWZpbmUgZHJ2X3RvX3NzYl9kcnYoX2RydikgY29udGFpbmVyX29mKF9kcnYsIHN0cnVjdCBzc2JfZHJpdmVyLCBkcnYpCiAKIGV4dGVybiBpbnQgX19zc2JfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBzc2JfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLXN0YXRpYyBpbmxpbmUgaW50IHNzYl9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHNzYl9kcml2ZXIgKmRydikKLXsKLQlyZXR1cm4gX19zc2JfZHJpdmVyX3JlZ2lzdGVyKGRydiwgVEhJU19NT0RVTEUpOwotfQorI2RlZmluZSBzc2JfZHJpdmVyX3JlZ2lzdGVyKGRydikgXAorCV9fc3NiX2RyaXZlcl9yZWdpc3RlcihkcnYsIFRISVNfTU9EVUxFKQorCiBleHRlcm4gdm9pZCBzc2JfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHNzYl9kcml2ZXIgKmRydik7CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdG9wX21hY2hpbmUuaCBiL2luY2x1ZGUvbGludXgvc3RvcF9tYWNoaW5lLmgKaW5kZXggMmQwNGVhOS4uYzE3MGVkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdG9wX21hY2hpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N0b3BfbWFjaGluZS5oCkBAIC0zLDYgKzMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmggYi9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCmluZGV4IGExNzZkYjIuLmUwMzM1NjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdHJpbmcuaApAQCAtMTE0LDYgKzExNCw3IEBACiAjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNIUgogZXh0ZXJuIHZvaWQgKiBtZW1jaHIoY29uc3Qgdm9pZCAqLGludCxfX2tlcm5lbF9zaXplX3QpOwogI2VuZGlmCit2b2lkICptZW1jaHJfaW52KGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CiAKIGV4dGVybiBjaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIGdmcF90IGdmcCk7CiBleHRlcm4gY2hhciAqa3N0cm5kdXAoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgZ2ZwX3QgZ2ZwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaAppbmRleCA0OTI0ODZhLi4zZDhmOWM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oCkBAIC0xMzYsNiArMTM2LDggQEAKIHZvaWQJCXJwY19yZWxlYXNlX2NsaWVudChzdHJ1Y3QgcnBjX2NsbnQgKik7CiB2b2lkCQlycGNfdGFza19yZWxlYXNlX2NsaWVudChzdHJ1Y3QgcnBjX3Rhc2sgKik7CiAKK2ludAkJcnBjYl9jcmVhdGVfbG9jYWwodm9pZCk7Cit2b2lkCQlycGNiX3B1dF9sb2NhbCh2b2lkKTsKIGludAkJcnBjYl9yZWdpc3Rlcih1MzIsIHUzMiwgaW50LCB1bnNpZ25lZCBzaG9ydCk7CiBpbnQJCXJwY2JfdjRfcmVnaXN0ZXIoY29uc3QgdTMyIHByb2dyYW0sIGNvbnN0IHUzMiB2ZXJzaW9uLAogCQkJCSBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJlc3MsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCmluZGV4IGQ4ZDVkOTMuLjM1YjM3YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCkBAIC00MTMsNiArNDEzLDcgQEAKIC8qCiAgKiBGdW5jdGlvbiBwcm90b3R5cGVzLgogICovCit2b2lkIHN2Y19ycGNiX2NsZWFudXAoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KTsKIHN0cnVjdCBzdmNfc2VydiAqc3ZjX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKiwgdW5zaWduZWQgaW50LAogCQkJICAgIHZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHN2Y19zZXJ2ICopKTsKIHN0cnVjdCBzdmNfcnFzdCAqc3ZjX3ByZXBhcmVfdGhyZWFkKHN0cnVjdCBzdmNfc2VydiAqc2VydiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y194cHJ0LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNfeHBydC5oCmluZGV4IDdhZDk3NTEuLjg2MjBmNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y194cHJ0LmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjX3hwcnQuaApAQCAtOCw3ICs4LDggQEAKICNkZWZpbmUgU1VOUlBDX1NWQ19YUFJUX0gKIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworc3RydWN0IG1vZHVsZTsKIAogc3RydWN0IHN2Y194cHJ0X29wcyB7CiAJc3RydWN0IHN2Y194cHJ0CSooKnhwb19jcmVhdGUpKHN0cnVjdCBzdmNfc2VydiAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCBjNzFmODRiLi4xZTIyZTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMjQzLDE1ICsyNDMsMTAgQEAKIAlfX2xydV9jYWNoZV9hZGQocGFnZSwgTFJVX0lOQUNUSVZFX0ZJTEUpOwogfQogCi0vKiBMUlUgSXNvbGF0aW9uIG1vZGVzLiAqLwotI2RlZmluZSBJU09MQVRFX0lOQUNUSVZFIDAJLyogSXNvbGF0ZSBpbmFjdGl2ZSBwYWdlcy4gKi8KLSNkZWZpbmUgSVNPTEFURV9BQ1RJVkUgMQkvKiBJc29sYXRlIGFjdGl2ZSBwYWdlcy4gKi8KLSNkZWZpbmUgSVNPTEFURV9CT1RIIDIJCS8qIElzb2xhdGUgYm90aCBhY3RpdmUgYW5kIGluYWN0aXZlIHBhZ2VzLiAqLwotCiAvKiBsaW51eC9tbS92bXNjYW4uYyAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgaW50IG9yZGVyLAogCQkJCQlnZnBfdCBnZnBfbWFzaywgbm9kZW1hc2tfdCAqbWFzayk7Ci1leHRlcm4gaW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1vZGUsIGludCBmaWxlKTsKK2V4dGVybiBpbnQgX19pc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpc29sYXRlX21vZGVfdCBtb2RlLCBpbnQgZmlsZSk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCiAJCQkJCQkgIGdmcF90IGdmcF9tYXNrLCBib29sIG5vc3dhcCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlX3pvbmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCAxZmYwZWMyLi44NmEyNGIxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaApAQCAtODQ0LDQgKzg0NCwxNyBAQAogCQkJCSAgICAgIHN0cnVjdCBmaWxlX2hhbmRsZSBfX3VzZXIgKmhhbmRsZSwKIAkJCQkgICAgICBpbnQgZmxhZ3MpOwogYXNtbGlua2FnZSBsb25nIHN5c19zZXRucyhpbnQgZmQsIGludCBuc3R5cGUpOworYXNtbGlua2FnZSBsb25nIHN5c19wcm9jZXNzX3ZtX3JlYWR2KHBpZF90IHBpZCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKmx2ZWMsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGxpb3ZjbnQsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICpydmVjLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyByaW92Y250LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7Cithc21saW5rYWdlIGxvbmcgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KHBpZF90IHBpZCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICpsdmVjLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGlvdmNudCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICpydmVjLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcmlvdmNudCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaAppbmRleCA5YTFlYzEwLi43MDNjZmEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTkzMSw2ICs5MzEsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKIC8qIEZvciB0aGUgL3Byb2Mvc3lzIHN1cHBvcnQgKi8KIHN0cnVjdCBjdGxfdGFibGU7CkBAIC0xMDExLDYgKzEwMTIsMjYgQEAKICAqIGNvdmVyIGNvbW1vbiBjYXNlcy4KICAqLwogCisvKiBTdXBwb3J0IGZvciB1c2Vyc3BhY2UgcG9sbCgpIHRvIHdhdGNoIGZvciBjaGFuZ2VzICovCitzdHJ1Y3QgY3RsX3RhYmxlX3BvbGwgeworCWF0b21pY190IGV2ZW50OworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgKnByb2Nfc3lzX3BvbGxfZXZlbnQoc3RydWN0IGN0bF90YWJsZV9wb2xsICpwb2xsKQoreworCXJldHVybiAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWF0b21pY19yZWFkKCZwb2xsLT5ldmVudCk7Cit9CisKK3ZvaWQgcHJvY19zeXNfcG9sbF9ub3RpZnkoc3RydWN0IGN0bF90YWJsZV9wb2xsICpwb2xsKTsKKworI2RlZmluZSBfX0NUTF9UQUJMRV9QT0xMX0lOSVRJQUxJWkVSKG5hbWUpIHsJCQkJXAorCS5ldmVudCA9IEFUT01JQ19JTklUKDApLAkJCQkJXAorCS53YWl0ID0gX19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVIobmFtZS53YWl0KSB9CisKKyNkZWZpbmUgREVGSU5FX0NUTF9UQUJMRV9QT0xMKG5hbWUpCQkJCQlcCisJc3RydWN0IGN0bF90YWJsZV9wb2xsIG5hbWUgPSBfX0NUTF9UQUJMRV9QT0xMX0lOSVRJQUxJWkVSKG5hbWUpCisKIC8qIEEgc3lzY3RsIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBjdGxfdGFibGU6ICovCiBzdHJ1Y3QgY3RsX3RhYmxlIAogewpAQCAtMTAyMSw2ICsxMDQyLDcgQEAKIAlzdHJ1Y3QgY3RsX3RhYmxlICpjaGlsZDsKIAlzdHJ1Y3QgY3RsX3RhYmxlICpwYXJlbnQ7CS8qIEF1dG9tYXRpY2FsbHkgc2V0ICovCiAJcHJvY19oYW5kbGVyICpwcm9jX2hhbmRsZXI7CS8qIENhbGxiYWNrIGZvciB0ZXh0IGZvcm1hdHRpbmcgKi8KKwlzdHJ1Y3QgY3RsX3RhYmxlX3BvbGwgKnBvbGw7CiAJdm9pZCAqZXh0cmExOwogCXZvaWQgKmV4dHJhMjsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2Rldi5oIGIvaW5jbHVkZS9saW51eC9zeXNkZXYuaAppbmRleCBkMzVlNzgzLi4yMGY2M2QzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzZGV2LmgKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgX1NZU0RFVl9IXwogCiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90ZXh0c2VhcmNoLmggYi9pbmNsdWRlL2xpbnV4L3RleHRzZWFyY2guaAppbmRleCBkOWE4NWQ2Li5jZmFlZTg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RleHRzZWFyY2guaAorKysgYi9pbmNsdWRlL2xpbnV4L3RleHRzZWFyY2guaApAQCAtNCwxMCArNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAorc3RydWN0IG1vZHVsZTsKKwogc3RydWN0IHRzX2NvbmZpZzsKIAogI2RlZmluZSBUU19BVVRPTE9BRAkxIC8qIEF1dG9tYXRpY2FsbHkgbG9hZCB0ZXh0c2VhcmNoIG1vZHVsZXMgd2hlbiBuZWVkZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAppbmRleCBmYzgzOWJmLi5lMjZkYjAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCkBAIC0yMDEsNiArMjAxLDEwIEBACiAJLmJhbGFuY2VfaW50ZXJ2YWwJPSA2NCwJCQkJCVwKIH0KIAorI2lmbmRlZiBTRF9OT0RFU19QRVJfRE9NQUlOCisjZGVmaW5lIFNEX05PREVTX1BFUl9ET01BSU4gMTYKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1NDSEVEX0JPT0sKICNpZm5kZWYgU0RfQk9PS19JTklUCiAjZXJyb3IgUGxlYXNlIGRlZmluZSBhbiBhcHByb3ByaWF0ZSBTRF9CT09LX0lOSVQgaW4gaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCEhIQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaCBiL2luY2x1ZGUvbGludXgvdHJhY2Vfc2VxLmgKaW5kZXggNWNmMzk3Yy4uN2RhZGMzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RyYWNlX3NlcS5oCkBAIC0yOSwxMCArMjksMTAgQEAKICAqIEN1cnJlbnRseSBvbmx5IGRlZmluZWQgd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQuCiAgKi8KICNpZmRlZiBDT05GSUdfVFJBQ0lORwotZXh0ZXJuIGludCB0cmFjZV9zZXFfcHJpbnRmKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLWV4dGVybiBpbnQgdHJhY2Vfc2VxX3ZwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAwKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgdHJhY2Vfc2VxX3ByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMCkKK2ludCB0cmFjZV9zZXFfdnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyk7CiBleHRlcm4gaW50CiB0cmFjZV9zZXFfYnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHUzMiAqYmluYXJ5KTsKIGV4dGVybiBpbnQgdHJhY2VfcHJpbnRfc2VxKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHRyYWNlX3NlcSAqcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VpbnB1dC5oIGIvaW5jbHVkZS9saW51eC91aW5wdXQuaAppbmRleCBkMjhjNzI2Li4yYWEyODgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VpbnB1dC5oCisrKyBiL2luY2x1ZGUvbGludXgvdWlucHV0LmgKQEAgLTY4LDcgKzY4LDcgQEAKIAl1bnNpZ25lZCBjaGFyCQloZWFkOwogCXVuc2lnbmVkIGNoYXIJCXRhaWw7CiAJc3RydWN0IGlucHV0X2V2ZW50CWJ1ZmZbVUlOUFVUX0JVRkZFUl9TSVpFXTsKLQlpbnQJCQlmZl9lZmZlY3RzX21heDsKKwl1bnNpZ25lZCBpbnQJCWZmX2VmZmVjdHNfbWF4OwogCiAJc3RydWN0IHVpbnB1dF9yZXF1ZXN0CSpyZXF1ZXN0c1tVSU5QVVRfTlVNX1JFUVVFU1RTXTsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlyZXF1ZXN0c193YWl0cTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWlvX2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKaW5kZXggZmQ5OWZmOS4uMWFkNDcyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKQEAgLTE0LDEwICsxNCwxMCBAQAogI2lmbmRlZiBfVUlPX0RSSVZFUl9IXwogI2RlZmluZSBfVUlPX0RSSVZFUl9IXwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorc3RydWN0IG1vZHVsZTsKIHN0cnVjdCB1aW9fbWFwOwogCiAvKioKQEAgLTEwMSwxMSArMTAxLDExIEBACiAJX191aW9fcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtb2R1bGUgKm93bmVyLAogCQkJICAgICAgc3RydWN0IGRldmljZSAqcGFyZW50LAogCQkJICAgICAgc3RydWN0IHVpb19pbmZvICppbmZvKTsKLXN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjawotCXVpb19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgdWlvX2luZm8gKmluZm8pCi17Ci0JcmV0dXJuIF9fdWlvX3JlZ2lzdGVyX2RldmljZShUSElTX01PRFVMRSwgcGFyZW50LCBpbmZvKTsKLX0KKworLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICovCisjZGVmaW5lIHVpb19yZWdpc3Rlcl9kZXZpY2UocGFyZW50LCBpbmZvKSBcCisJX191aW9fcmVnaXN0ZXJfZGV2aWNlKFRISVNfTU9EVUxFLCBwYXJlbnQsIGluZm8pCisKIGV4dGVybiB2b2lkIHVpb191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdWlvX2luZm8gKmluZm8pOwogZXh0ZXJuIHZvaWQgdWlvX2V2ZW50X25vdGlmeShzdHJ1Y3QgdWlvX2luZm8gKmluZm8pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IuaAppbmRleCA2ZjQ5YTFiLi5kM2QwYzEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiLmgKQEAgLTk0NiwxMCArOTQ2LDExIEBACiAgKi8KIGV4dGVybiBpbnQgdXNiX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2RyaXZlciAqLCBzdHJ1Y3QgbW9kdWxlICosCiAJCQkgICAgICAgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBpbmxpbmUgaW50IHVzYl9yZWdpc3RlcihzdHJ1Y3QgdXNiX2RyaXZlciAqZHJpdmVyKQotewotCXJldHVybiB1c2JfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlciwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKTsKLX0KKworLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICYgZnJpZW5kcyAqLworI2RlZmluZSB1c2JfcmVnaXN0ZXIoZHJpdmVyKSBcCisJdXNiX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSkKKwogZXh0ZXJuIHZvaWQgdXNiX2RlcmVnaXN0ZXIoc3RydWN0IHVzYl9kcml2ZXIgKik7CiAKIGV4dGVybiBpbnQgdXNiX3JlZ2lzdGVyX2RldmljZV9kcml2ZXIoc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L3VzYi9LYnVpbGQKaW5kZXggZWQ5MWZiNi4uYjYwN2YzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL0tidWlsZApAQCAtNywzICs3LDQgQEAKIGhlYWRlci15ICs9IG1pZGkuaAogaGVhZGVyLXkgKz0gZ19wcmludGVyLmgKIGhlYWRlci15ICs9IHRtYy5oCitoZWFkZXIteSArPSB2aWRlby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jaDkuaCBiL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCmluZGV4IGYzMmE2NGUuLmQ1ZGE2YzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCkBAIC0zODMsMTIgKzM4Myw2IEBACiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSwkweDBmCS8qIGluIGJFbmRwb2ludEFkZHJlc3MgKi8KICNkZWZpbmUgVVNCX0VORFBPSU5UX0RJUl9NQVNLCQkweDgwCiAKLSNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNUWVBFCQkweDBjCi0jZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DX05PTkUJCSgwIDw8IDIpCi0jZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DX0FTWU5DCQkoMSA8PCAyKQotI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19BREFQVElWRQkoMiA8PCAyKQotI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19TWU5DCQkoMyA8PCAyKQotCiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLCTB4MDMJLyogaW4gYm1BdHRyaWJ1dGVzICovCiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wJMAogI2RlZmluZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DCQkxCkBAIC0zOTYsNiArMzkwLDE3IEBACiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSX0lOVAkJMwogI2RlZmluZSBVU0JfRU5EUE9JTlRfTUFYX0FESlVTVEFCTEUJMHg4MAogCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DVFlQRQkJMHgwYworI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19OT05FCQkoMCA8PCAyKQorI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19BU1lOQwkJKDEgPDwgMikKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNfQURBUFRJVkUJKDIgPDwgMikKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNfU1lOQwkJKDMgPDwgMikKKworI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfTUFTSwkJMHgzMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfREFUQQkJMHgwMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfRkVFREJBQ0sJMHgxMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfSU1QTElDSVRfRkIJMHgyMAkvKiBJbXBsaWNpdCBmZWVkYmFjayBEYXRhIGVuZHBvaW50ICovCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91dHNuYW1lLmggYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAppbmRleCA0ZTViMDIxLi5jNzE0ZWQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaApAQCAtMzcsNiArMzcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKK2VudW0gdXRzX3Byb2MgeworCVVUU19QUk9DX09TVFlQRSwKKwlVVFNfUFJPQ19PU1JFTEVBU0UsCisJVVRTX1BST0NfVkVSU0lPTiwKKwlVVFNfUFJPQ19IT1NUTkFNRSwKKwlVVFNfUFJPQ19ET01BSU5OQU1FLAorfTsKKwogc3RydWN0IHVzZXJfbmFtZXNwYWNlOwogZXh0ZXJuIHN0cnVjdCB1c2VyX25hbWVzcGFjZSBpbml0X3VzZXJfbnM7CiAKQEAgLTgwLDYgKzg4LDE0IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUk9DX1NZU0NUTAorZXh0ZXJuIHZvaWQgdXRzX3Byb2Nfbm90aWZ5KGVudW0gdXRzX3Byb2MgcHJvYyk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHV0c19wcm9jX25vdGlmeShlbnVtIHV0c19wcm9jIHByb2MpCit7Cit9CisjZW5kaWYKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV3X3V0c25hbWUgKnV0c25hbWUodm9pZCkKIHsKIAlyZXR1cm4gJmN1cnJlbnQtPm5zcHJveHktPnV0c19ucy0+bmFtZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXdiLmggYi9pbmNsdWRlL2xpbnV4L3V3Yi5oCmluZGV4IGIwYzU2NGUuLjdkYmJlZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXdiLmgKKysrIGIvaW5jbHVkZS9saW51eC91d2IuaApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC91d2Ivc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIHN0cnVjdCB1d2JfZGV2Owogc3RydWN0IHV3Yl9iZWNhX2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3V3Yi91bWMuaCBiL2luY2x1ZGUvbGludXgvdXdiL3VtYy5oCmluZGV4IDdiNDg0MjAuLjg5MWQxZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXdiL3VtYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXdiL3VtYy5oCkBAIC0xMTEsMTAgKzExMSw5IEBACiAgKiB1bWNfZHJpdmVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYSBVTUMgY2FwYWJpbHRpdHkgZHJpdmVyLgogICogQHVtY19kcnY6ICBwb2ludGVyIHRvIHRoZSBkcml2ZXIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayB1bWNfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCB1bWNfZHJpdmVyICp1bWNfZHJ2KQotewotCXJldHVybiBfX3VtY19kcml2ZXJfcmVnaXN0ZXIodW1jX2RydiwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKTsKLX0KKyNkZWZpbmUgdW1jX2RyaXZlcl9yZWdpc3Rlcih1bWNfZHJ2KSBcCisJX191bWNfZHJpdmVyX3JlZ2lzdGVyKHVtY19kcnYsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSkKKwogdm9pZCB1bWNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHVtY19kcml2ZXIgKnVtY19kcnYpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92ZXJtYWdpYy5oIGIvaW5jbHVkZS9saW51eC92ZXJtYWdpYy5oCmluZGV4IGNmOTdiNWIuLjZmOGZiY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmVybWFnaWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Zlcm1hZ2ljLmgKQEAgLTEsNSArMSw0IEBACiAjaW5jbHVkZSA8Z2VuZXJhdGVkL3V0c3JlbGVhc2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogU2ltcGx5IHNhbml0eSB2ZXJzaW9uIHN0YW1wIGZvciBtb2R1bGVzLiAqLwogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCmluZGV4IGZjYTI0Y2MuLjRiNzUyZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApAQCAtNjUzLDYgKzY1MywxMCBAQAogI2RlZmluZSBWNEwyX0JVRl9GTEFHX0VSUk9SCTB4MDA0MAogI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RJTUVDT0RFCTB4MDEwMAkvKiB0aW1lY29kZSBmaWVsZCBpcyB2YWxpZCAqLwogI2RlZmluZSBWNEwyX0JVRl9GTEFHX0lOUFVUICAgICAweDAyMDAgIC8qIGlucHV0IGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfUFJFUEFSRUQJMHgwNDAwCS8qIEJ1ZmZlciBpcyBwcmVwYXJlZCBmb3IgcXVldWluZyAqLworLyogQ2FjaGUgaGFuZGxpbmcgZmxhZ3MgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19OT19DQUNIRV9JTlZBTElEQVRFCTB4MDgwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX05PX0NBQ0hFX0NMRUFOCQkweDEwMDAKIAogLyoKICAqCU8gViBFIFIgTCBBIFkgICBQIFIgRSBWIEkgRSBXCkBAIC03NTksMTAgKzc2MywxMCBAQAogI2RlZmluZSBWNEwyX1NURF9QQUxfTmMgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDA0MDApCiAjZGVmaW5lIFY0TDJfU1REX1BBTF82MCAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDgwMCkKIAotI2RlZmluZSBWNEwyX1NURF9OVFNDX00gICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDEwMDApCi0jZGVmaW5lIFY0TDJfU1REX05UU0NfTV9KUCAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMjAwMCkKKyNkZWZpbmUgVjRMMl9TVERfTlRTQ19NICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAxMDAwKQkvKiBCVFNDICovCisjZGVmaW5lIFY0TDJfU1REX05UU0NfTV9KUCAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMjAwMCkJLyogRUlBLUogKi8KICNkZWZpbmUgVjRMMl9TVERfTlRTQ180NDMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA0MDAwKQotI2RlZmluZSBWNEwyX1NURF9OVFNDX01fS1IgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDgwMDApCisjZGVmaW5lIFY0TDJfU1REX05UU0NfTV9LUiAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwODAwMCkJLyogRk0gQTIgKi8KIAogI2RlZmluZSBWNEwyX1NURF9TRUNBTV9CICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMTAwMDApCiAjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0QgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAyMDAwMCkKQEAgLTc4Niw0NyArNzkwLDg2IEBACiAgICB2NGwyLWNvbW1vbi5jIHNob3VsZCBiZSBmaXhlZC4KICAqLwogCi0vKiBzb21lIG1lcmdlZCBzdGFuZGFyZHMgKi8KLSNkZWZpbmUgVjRMMl9TVERfTU4JKFY0TDJfU1REX1BBTF9NfFY0TDJfU1REX1BBTF9OfFY0TDJfU1REX1BBTF9OY3xWNEwyX1NURF9OVFNDKQotI2RlZmluZSBWNEwyX1NURF9CCShWNEwyX1NURF9QQUxfQnxWNEwyX1NURF9QQUxfQjF8VjRMMl9TVERfU0VDQU1fQikKLSNkZWZpbmUgVjRMMl9TVERfR0gJKFY0TDJfU1REX1BBTF9HfFY0TDJfU1REX1BBTF9IfFY0TDJfU1REX1NFQ0FNX0d8VjRMMl9TVERfU0VDQU1fSCkKLSNkZWZpbmUgVjRMMl9TVERfREsJKFY0TDJfU1REX1BBTF9ES3xWNEwyX1NURF9TRUNBTV9ESykKKy8qCisgKiBTb21lIG1hY3JvcyB0byBtZXJnZSB2aWRlbyBzdGFuZGFyZHMgaW4gb3JkZXIgdG8gbWFrZSBsaXZlIGVhc2llciBmb3IgdGhlCisgKiBkcml2ZXJzIGFuZCBWNEwyIGFwcGxpY2F0aW9ucworICovCiAKLS8qIHNvbWUgY29tbW9uIG5lZWRlZCBzdHVmZiAqLwotI2RlZmluZSBWNEwyX1NURF9QQUxfQkcJCShWNEwyX1NURF9QQUxfQgkJfFwKLQkJCQkgVjRMMl9TVERfUEFMX0IxCXxcCi0JCQkJIFY0TDJfU1REX1BBTF9HKQotI2RlZmluZSBWNEwyX1NURF9QQUxfREsJCShWNEwyX1NURF9QQUxfRAkJfFwKLQkJCQkgVjRMMl9TVERfUEFMX0QxCXxcCi0JCQkJIFY0TDJfU1REX1BBTF9LKQotI2RlZmluZSBWNEwyX1NURF9QQUwJCShWNEwyX1NURF9QQUxfQkcJfFwKLQkJCQkgVjRMMl9TVERfUEFMX0RLCXxcCi0JCQkJIFY0TDJfU1REX1BBTF9ICQl8XAotCQkJCSBWNEwyX1NURF9QQUxfSSkKKy8qCisgKiAiQ29tbW9uIiBOVFNDL00gLSBJdCBzaG91bGQgYmUgbm90aWNlZCB0aGF0IFY0TDJfU1REX05UU0NfNDQzIGlzCisgKiBNaXNzaW5nIGhlcmUuCisgKi8KICNkZWZpbmUgVjRMMl9TVERfTlRTQyAgICAgICAgICAgKFY0TDJfU1REX05UU0NfTQl8XAogCQkJCSBWNEwyX1NURF9OVFNDX01fSlAgICAgIHxcCiAJCQkJIFY0TDJfU1REX05UU0NfTV9LUikKKy8qIFNlY2FtIG1hY3JvcyAqLwogI2RlZmluZSBWNEwyX1NURF9TRUNBTV9ESyAgICAgIAkoVjRMMl9TVERfU0VDQU1fRAl8XAogCQkJCSBWNEwyX1NURF9TRUNBTV9LCXxcCiAJCQkJIFY0TDJfU1REX1NFQ0FNX0sxKQorLyogQWxsIFNlY2FtIFN0YW5kYXJkcyAqLwogI2RlZmluZSBWNEwyX1NURF9TRUNBTQkJKFY0TDJfU1REX1NFQ0FNX0IJfFwKIAkJCQkgVjRMMl9TVERfU0VDQU1fRwl8XAogCQkJCSBWNEwyX1NURF9TRUNBTV9ICXxcCiAJCQkJIFY0TDJfU1REX1NFQ0FNX0RLCXxcCiAJCQkJIFY0TDJfU1REX1NFQ0FNX0wgICAgICAgfFwKIAkJCQkgVjRMMl9TVERfU0VDQU1fTEMpCisvKiBQQUwgbWFjcm9zICovCisjZGVmaW5lIFY0TDJfU1REX1BBTF9CRwkJKFY0TDJfU1REX1BBTF9CCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfQjEJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0cpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9ESwkJKFY0TDJfU1REX1BBTF9ECQl8XAorCQkJCSBWNEwyX1NURF9QQUxfRDEJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0spCisvKgorICogIkNvbW1vbiIgUEFMIC0gVGhpcyBtYWNybyBpcyB0aGVyZSB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG9sZAorICogVjRMMSBjb25jZXB0IG9mICJQQUwiOiAvQkdES0hJLgorICogU2V2ZXJhbCBQQUwgc3RhbmRhcmRzIGFyZSBtaXNpbmcgaGVyZTogL00sIC9OIGFuZCAvTmMKKyAqLworI2RlZmluZSBWNEwyX1NURF9QQUwJCShWNEwyX1NURF9QQUxfQkcJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0RLCXxcCisJCQkJIFY0TDJfU1REX1BBTF9ICQl8XAorCQkJCSBWNEwyX1NURF9QQUxfSSkKKy8qIENocm9tYSAiYWdub3N0aWMiIHN0YW5kYXJkcyAqLworI2RlZmluZSBWNEwyX1NURF9CCQkoVjRMMl9TVERfUEFMX0IJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9CMQl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9CKQorI2RlZmluZSBWNEwyX1NURF9HCQkoVjRMMl9TVERfUEFMX0cJCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0cpCisjZGVmaW5lIFY0TDJfU1REX0gJCShWNEwyX1NURF9QQUxfSAkJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSCkKKyNkZWZpbmUgVjRMMl9TVERfTAkJKFY0TDJfU1REX1NFQ0FNX0wJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fTEMpCisjZGVmaW5lIFY0TDJfU1REX0dICQkoVjRMMl9TVERfRwkJfFwKKwkJCQkgVjRMMl9TVERfSCkKKyNkZWZpbmUgVjRMMl9TVERfREsJCShWNEwyX1NURF9QQUxfREsJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fREspCisjZGVmaW5lIFY0TDJfU1REX0JHCQkoVjRMMl9TVERfQgkJfFwKKwkJCQkgVjRMMl9TVERfRykKKyNkZWZpbmUgVjRMMl9TVERfTU4JCShWNEwyX1NURF9QQUxfTQkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX04JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OYwl8XAorCQkJCSBWNEwyX1NURF9OVFNDKQogCisvKiBTdGFuZGFyZHMgd2hlcmUgTVRTL0JUU0Mgc3RlcmVvIGNvdWxkIGJlIGZvdW5kICovCisjZGVmaW5lIFY0TDJfU1REX01UUwkJKFY0TDJfU1REX05UU0NfTQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTQkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX04JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OYykKKworLyogU3RhbmRhcmRzIGZvciBDb3VudHJpZXMgd2l0aCA2MEh6IExpbmUgZnJlcXVlbmN5ICovCiAjZGVmaW5lIFY0TDJfU1REXzUyNV82MAkJKFY0TDJfU1REX1BBTF9NCQl8XAogCQkJCSBWNEwyX1NURF9QQUxfNjAJfFwKIAkJCQkgVjRMMl9TVERfTlRTQwkJfFwKIAkJCQkgVjRMMl9TVERfTlRTQ180NDMpCisvKiBTdGFuZGFyZHMgZm9yIENvdW50cmllcyB3aXRoIDUwSHogTGluZSBmcmVxdWVuY3kgKi8KICNkZWZpbmUgVjRMMl9TVERfNjI1XzUwCQkoVjRMMl9TVERfUEFMCQl8XAogCQkJCSBWNEwyX1NURF9QQUxfTgkJfFwKIAkJCQkgVjRMMl9TVERfUEFMX05jCXxcCiAJCQkJIFY0TDJfU1REX1NFQ0FNKQorCiAjZGVmaW5lIFY0TDJfU1REX0FUU0MgICAgICAgICAgIChWNEwyX1NURF9BVFNDXzhfVlNCICAgIHxcCiAJCQkJIFY0TDJfU1REX0FUU0NfMTZfVlNCKQotCisvKiBNYWNyb3Mgd2l0aCBub25lIGFuZCBhbGwgYW5hbG9nIHN0YW5kYXJkcyAqLwogI2RlZmluZSBWNEwyX1NURF9VTktOT1dOICAgICAgICAwCiAjZGVmaW5lIFY0TDJfU1REX0FMTCAgICAgICAgICAgIChWNEwyX1NURF81MjVfNjAJfFwKIAkJCQkgVjRMMl9TVERfNjI1XzUwKQpAQCAtMTA4Miw2ICsxMTI1LDcgQEAKICNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgCTB4MDAxMAogI2RlZmluZSBWNEwyX0NUUkxfRkxBR19TTElERVIgCQkweDAwMjAKICNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSAJMHgwMDQwCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFCQkweDAwODAKIAogLyogIFF1ZXJ5IGZsYWcsIHRvIGJlIE9SZWQgd2l0aCB0aGUgY29udHJvbCBJRCAqLwogI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwJMHg4MDAwMDAwMApAQCAtMTEyNSw2ICsxMTY5LDcgQEAKIAlWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9ESVNBQkxFRAk9IDAsCiAJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNTBIWgk9IDEsCiAJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWgk9IDIsCisJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfQVVUTwk9IDMsCiB9OwogI2RlZmluZSBWNEwyX0NJRF9IVUVfQVVUTwkJCShWNEwyX0NJRF9CQVNFKzI1KQogI2RlZmluZSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFCShWNEwyX0NJRF9CQVNFKzI2KQpAQCAtMjAwNiw2ICsyMDUxLDcgQEAKICNkZWZpbmUgVjRMMl9FVkVOVF9WU1lOQwkJCTEKICNkZWZpbmUgVjRMMl9FVkVOVF9FT1MJCQkJMgogI2RlZmluZSBWNEwyX0VWRU5UX0NUUkwJCQkJMworI2RlZmluZSBWNEwyX0VWRU5UX0ZSQU1FX1NZTkMJCQk0CiAjZGVmaW5lIFY0TDJfRVZFTlRfUFJJVkFURV9TVEFSVAkJMHgwODAwMDAwMAogCiAvKiBQYXlsb2FkIGZvciBWNEwyX0VWRU5UX1ZTWU5DICovCkBAIC0yMDMyLDEyICsyMDc4LDE3IEBACiAJX19zMzIgZGVmYXVsdF92YWx1ZTsKIH07CiAKK3N0cnVjdCB2NGwyX2V2ZW50X2ZyYW1lX3N5bmMgeworCV9fdTMyIGZyYW1lX3NlcXVlbmNlOworfTsKKwogc3RydWN0IHY0bDJfZXZlbnQgewogCV9fdTMyCQkJCXR5cGU7CiAJdW5pb24gewotCQlzdHJ1Y3QgdjRsMl9ldmVudF92c3luYyB2c3luYzsKLQkJc3RydWN0IHY0bDJfZXZlbnRfY3RybAljdHJsOwotCQlfX3U4CQkJZGF0YVs2NF07CisJCXN0cnVjdCB2NGwyX2V2ZW50X3ZzeW5jCQl2c3luYzsKKwkJc3RydWN0IHY0bDJfZXZlbnRfY3RybAkJY3RybDsKKwkJc3RydWN0IHY0bDJfZXZlbnRfZnJhbWVfc3luYwlmcmFtZV9zeW5jOworCQlfX3U4CQkJCWRhdGFbNjRdOwogCX0gdTsKIAlfX3UzMgkJCQlwZW5kaW5nOwogCV9fdTMyCQkJCXNlcXVlbmNlOwpAQCAtMjA5Miw2ICsyMTQzLDIzIEBACiAJX191MzIgcmV2aXNpb247ICAgIC8qIGNoaXAgcmV2aXNpb24sIGNoaXAgc3BlY2lmaWMgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKioKKyAqIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzIC0gVklESU9DX0NSRUFURV9CVUZTIGFyZ3VtZW50CisgKiBAaW5kZXg6CW9uIHJldHVybiwgaW5kZXggb2YgdGhlIGZpcnN0IGNyZWF0ZWQgYnVmZmVyCisgKiBAY291bnQ6CWVudHJ5OiBudW1iZXIgb2YgcmVxdWVzdGVkIGJ1ZmZlcnMsCisgKgkJcmV0dXJuOiBudW1iZXIgb2YgY3JlYXRlZCBidWZmZXJzCisgKiBAbWVtb3J5OglidWZmZXIgbWVtb3J5IHR5cGUKKyAqIEBmb3JtYXQ6CWZyYW1lIGZvcm1hdCwgZm9yIHdoaWNoIGJ1ZmZlcnMgYXJlIHJlcXVlc3RlZAorICogQHJlc2VydmVkOglmdXR1cmUgZXh0ZW5zaW9ucworICovCitzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyB7CisJX191MzIJCQlpbmRleDsKKwlfX3UzMgkJCWNvdW50OworCWVudW0gdjRsMl9tZW1vcnkgICAgICAgIG1lbW9yeTsKKwlzdHJ1Y3QgdjRsMl9mb3JtYXQJZm9ybWF0OworCV9fdTMyCQkJcmVzZXJ2ZWRbOF07Cit9OworCiAvKgogICoJSSBPIEMgVCBMICAgQyBPIEQgRSBTICAgRiBPIFIgICBWIEkgRCBFIE8gICBEIEUgViBJIEMgRSBTCiAgKgpAQCAtMjE4Miw2ICsyMjUwLDExIEBACiAjZGVmaW5lCVZJRElPQ19TVUJTQ1JJQkVfRVZFTlQJIF9JT1coJ1YnLCA5MCwgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uKQogI2RlZmluZQlWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQgX0lPVygnVicsIDkxLCBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24pCiAKKy8qIEV4cGVyaW1lbnRhbCwgdGhlIGJlbG93IHR3byBpb2N0bHMgbWF5IGNoYW5nZSBvdmVyIHRoZSBuZXh0IGNvdXBsZSBvZiBrZXJuZWwKKyAgIHZlcnNpb25zICovCisjZGVmaW5lIFZJRElPQ19DUkVBVEVfQlVGUwlfSU9XUignVicsIDkyLCBzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycykKKyNkZWZpbmUgVklESU9DX1BSRVBBUkVfQlVGCV9JT1dSKCdWJywgOTMsIHN0cnVjdCB2NGwyX2J1ZmZlcikKKwogLyogUmVtaW5kZXI6IHdoZW4gYWRkaW5nIG5ldyBpb2N0bHMgcGxlYXNlIGFkZCBzdXBwb3J0IGZvciB0aGVtIHRvCiAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tcGF0LWlvY3RsMzIuYyBhcyB3ZWxsISAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpby5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW8uaAppbmRleCA4NTFlYmYxLi40YzA2OWQ4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpby5oCkBAIC0xMzEsMTAgKzEzMSwxMCBAQAogICogdmlydGlvX2RyaXZlciAtIG9wZXJhdGlvbnMgZm9yIGEgdmlydGlvIEkvTyBkcml2ZXIKICAqIEBkcml2ZXI6IHVuZGVybHlpbmcgZGV2aWNlIGRyaXZlciAocG9wdWxhdGUgbmFtZSBhbmQgb3duZXIpLgogICogQGlkX3RhYmxlOiB0aGUgaWRzIHNlcnZpY2VkIGJ5IHRoaXMgZHJpdmVyLgotICogQGZlYXR1cmVfdGFibGU6IGFuIGFycmF5IG9mIGZlYXR1cmUgbnVtYmVycyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuCisgKiBAZmVhdHVyZV90YWJsZTogYW4gYXJyYXkgb2YgZmVhdHVyZSBudW1iZXJzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KICAqIEBmZWF0dXJlX3RhYmxlX3NpemU6IG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmZWF0dXJlIHRhYmxlIGFycmF5LgogICogQHByb2JlOiB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgZGV2aWNlIGlzIGZvdW5kLiAgUmV0dXJucyAwIG9yIC1lcnJuby4KLSAqIEByZW1vdmU6IHRoZSBmdW5jdGlvbiB3aGVuIGEgZGV2aWNlIGlzIHJlbW92ZWQuCisgKiBAcmVtb3ZlOiB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgZGV2aWNlIGlzIHJlbW92ZWQuCiAgKiBAY29uZmlnX2NoYW5nZWQ6IG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAqICAgIGNoYW5nZXM7IG1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmgKaW5kZXggMzljODhjNS4uYWRkNDc5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmgKQEAgLTE1NSw2ICsxNTUsOSBAQAogI2RlZmluZSB2aXJ0aW9fY29uZmlnX3ZhbCh2ZGV2LCBmYml0LCBvZmZzZXQsIHYpIFwKIAl2aXJ0aW9fY29uZmlnX2J1ZigodmRldiksIChmYml0KSwgKG9mZnNldCksICh2KSwgc2l6ZW9mKCp2KSkKIAorI2RlZmluZSB2aXJ0aW9fY29uZmlnX3ZhbF9sZW4odmRldiwgZmJpdCwgb2Zmc2V0LCB2LCBsZW4pIFwKKwl2aXJ0aW9fY29uZmlnX2J1ZigodmRldiksIChmYml0KSwgKG9mZnNldCksICh2KSwgKGxlbikpCisKIHN0YXRpYyBpbmxpbmUgaW50IHZpcnRpb19jb25maWdfYnVmKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LAogCQkJCSAgICB1bnNpZ25lZCBpbnQgZmJpdCwKIAkJCQkgICAgdW5zaWduZWQgaW50IG9mZnNldCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX21taW8uaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX21taW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2M3ZWRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fbW1pby5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogVmlydGlvIHBsYXRmb3JtIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSwgQVJNIEx0ZC4KKyAqCisgKiBCYXNlZCBvbiBWaXJ0aW8gUENJIGRyaXZlciBieSBBbnRob255IExpZ3VvcmksIGNvcHlyaWdodCBJQk0gQ29ycC4gMjAwNworICoKKyAqIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9WSVJUSU9fTU1JT19ICisjZGVmaW5lIF9MSU5VWF9WSVJUSU9fTU1JT19ICisKKy8qCisgKiBDb250cm9sIHJlZ2lzdGVycworICovCisKKy8qIE1hZ2ljIHZhbHVlICgidmlydCIgc3RyaW5nKSAtIFJlYWQgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19NQUdJQ19WQUxVRQkJMHgwMDAKKworLyogVmlydGlvIGRldmljZSB2ZXJzaW9uIC0gUmVhZCBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX1ZFUlNJT04JCTB4MDA0CisKKy8qIFZpcnRpbyBkZXZpY2UgSUQgLSBSZWFkIE9ubHkgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fREVWSUNFX0lECQkweDAwOAorCisvKiBWaXJ0aW8gdmVuZG9yIElEIC0gUmVhZCBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX1ZFTkRPUl9JRAkJMHgwMGMKKworLyogQml0bWFzayBvZiB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBob3N0CisgKiAoMzIgYml0cyBwZXIgc2V0KSAtIFJlYWQgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19IT1NUX0ZFQVRVUkVTCTB4MDEwCisKKy8qIEhvc3QgZmVhdHVyZXMgc2V0IHNlbGVjdG9yIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19IT1NUX0ZFQVRVUkVTX1NFTAkweDAxNAorCisvKiBCaXRtYXNrIG9mIGZlYXR1cmVzIGFjdGl2YXRlZCBieSB0aGUgZ3Vlc3QKKyAqICgzMiBiaXRzIHBlciBzZXQpIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19HVUVTVF9GRUFUVVJFUwkweDAyMAorCisvKiBBY3RpdmF0ZWQgZmVhdHVyZXMgc2V0IHNlbGVjdG9yIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19HVUVTVF9GRUFUVVJFU19TRVQJMHgwMjQKKworLyogR3Vlc3QncyBtZW1vcnkgcGFnZSBzaXplIGluIGJ5dGVzIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19HVUVTVF9QQUdFX1NJWkUJMHgwMjgKKworLyogUXVldWUgc2VsZWN0b3IgLSBXcml0ZSBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX1FVRVVFX1NFTAkJMHgwMzAKKworLyogTWF4aW11bSBzaXplIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUgLSBSZWFkIE9ubHkgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fUVVFVUVfTlVNX01BWAkweDAzNAorCisvKiBRdWV1ZSBzaXplIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHF1ZXVlIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19RVUVVRV9OVU0JCTB4MDM4CisKKy8qIFVzZWQgUmluZyBhbGlnbm1lbnQgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUgLSBXcml0ZSBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX1FVRVVFX0FMSUdOCQkweDAzYworCisvKiBHdWVzdCdzIFBGTiBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBxdWV1ZSAtIFJlYWQgV3JpdGUgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fUVVFVUVfUEZOCQkweDA0MAorCisvKiBRdWV1ZSBub3RpZmllciAtIFdyaXRlIE9ubHkgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fUVVFVUVfTk9USUZZCTB4MDUwCisKKy8qIEludGVycnVwdCBzdGF0dXMgLSBSZWFkIE9ubHkgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fSU5URVJSVVBUX1NUQVRVUwkweDA2MAorCisvKiBJbnRlcnJ1cHQgYWNrbm93bGVkZ2UgLSBXcml0ZSBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX0lOVEVSUlVQVF9BQ0sJMHgwNjQKKworLyogRGV2aWNlIHN0YXR1cyByZWdpc3RlciAtIFJlYWQgV3JpdGUgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fU1RBVFVTCQkweDA3MAorCisvKiBUaGUgY29uZmlnIHNwYWNlIGlzIGRlZmluZWQgYnkgZWFjaCBkcml2ZXIgYXMKKyAqIHRoZSBwZXItZHJpdmVyIGNvbmZpZ3VyYXRpb24gc3BhY2UgLSBSZWFkIFdyaXRlICovCisjZGVmaW5lIFZJUlRJT19NTUlPX0NPTkZJRwkJMHgxMDAKKworCisKKy8qCisgKiBJbnRlcnJ1cHQgZmxhZ3MgKHJlOiBpbnRlcnJ1cHQgc3RhdHVzICYgYWNrbm93bGVkZ2UgcmVnaXN0ZXJzKQorICovCisKKyNkZWZpbmUgVklSVElPX01NSU9fSU5UX1ZSSU5HCQkoMSA8PCAwKQorI2RlZmluZSBWSVJUSU9fTU1JT19JTlRfQ09ORklHCQkoMSA8PCAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaAppbmRleCA0YTMyY2I2Li4zNmJlMGY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19yaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fcmluZy5oCkBAIC0xMzUsMTMgKzEzNSwxMyBAQAogCXZyLT5udW0gPSBudW07CiAJdnItPmRlc2MgPSBwOwogCXZyLT5hdmFpbCA9IHAgKyBudW0qc2l6ZW9mKHN0cnVjdCB2cmluZ19kZXNjKTsKLQl2ci0+dXNlZCA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZykmdnItPmF2YWlsLT5yaW5nW251bV0gKyBhbGlnbi0xKQotCQkJICAgICYgfihhbGlnbiAtIDEpKTsKKwl2ci0+dXNlZCA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZykmdnItPmF2YWlsLT5yaW5nW251bV0gKyBzaXplb2YoX191MTYpCisJCSsgYWxpZ24tMSkgJiB+KGFsaWduIC0gMSkpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHZyaW5nX3NpemUodW5zaWduZWQgaW50IG51bSwgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKLQlyZXR1cm4gKChzaXplb2Yoc3RydWN0IHZyaW5nX2Rlc2MpICogbnVtICsgc2l6ZW9mKF9fdTE2KSAqICgyICsgbnVtKQorCXJldHVybiAoKHNpemVvZihzdHJ1Y3QgdnJpbmdfZGVzYykgKiBudW0gKyBzaXplb2YoX191MTYpICogKDMgKyBudW0pCiAJCSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSkpCiAJCSsgc2l6ZW9mKF9fdTE2KSAqIDMgKyBzaXplb2Yoc3RydWN0IHZyaW5nX3VzZWRfZWxlbSkgKiBudW07CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZseW5xLmggYi9pbmNsdWRlL2xpbnV4L3ZseW5xLmgKaW5kZXggOGY2YTk1OC4uMDE3ZDRhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bHlucS5oCisrKyBiL2luY2x1ZGUvbGludXgvdmx5bnEuaApAQCAtMjAsOSArMjAsMTAgQEAKICNkZWZpbmUgX19WTFlOUV9IX18KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKK3N0cnVjdCBtb2R1bGU7CisKICNkZWZpbmUgVkxZTlFfTlVNX0lSUVMgMzIKIAogc3RydWN0IHZseW5xX21hcHBpbmcgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmggYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAppbmRleCA5MzMyZTUyLi42ODdmYjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaApAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBWTV9NQVAJCTB4MDAwMDAwMDQJLyogdm1hcCgpZWQgcGFnZXMgKi8KICNkZWZpbmUgVk1fVVNFUk1BUAkweDAwMDAwMDA4CS8qIHN1aXRhYmxlIGZvciByZW1hcF92bWFsbG9jX3JhbmdlICovCiAjZGVmaW5lIFZNX1ZQQUdFUwkweDAwMDAwMDEwCS8qIGJ1ZmZlciBmb3IgcGFnZXMgd2FzIHZtYWxsb2MnZWQgKi8KKyNkZWZpbmUgVk1fVU5MSVNUCTB4MDAwMDAwMjAJLyogdm1fc3RydWN0IGlzIG5vdCBsaXN0ZWQgaW4gdm1saXN0ICovCiAvKiBiaXRzIFsyMC4uMzJdIHJlc2VydmVkIGZvciBhcmNoIHNwZWNpZmljIGlvcmVtYXAgaW50ZXJuYWxzICovCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAppbmRleCAyYjg5NjNmLi5hMzc4YzI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKQEAgLTM5LDYgKzM5LDIzIEBACiB9OwogCiAvKgorICogd2h5IHNvbWUgd3JpdGViYWNrIHdvcmsgd2FzIGluaXRpYXRlZAorICovCitlbnVtIHdiX3JlYXNvbiB7CisJV0JfUkVBU09OX0JBQ0tHUk9VTkQsCisJV0JfUkVBU09OX1RSWV9UT19GUkVFX1BBR0VTLAorCVdCX1JFQVNPTl9TWU5DLAorCVdCX1JFQVNPTl9QRVJJT0RJQywKKwlXQl9SRUFTT05fTEFQVE9QX1RJTUVSLAorCVdCX1JFQVNPTl9GUkVFX01PUkVfTUVNLAorCVdCX1JFQVNPTl9GU19GUkVFX1NQQUNFLAorCVdCX1JFQVNPTl9GT1JLRVJfVEhSRUFELAorCisJV0JfUkVBU09OX01BWCwKK307CitleHRlcm4gY29uc3QgY2hhciAqd2JfcmVhc29uX25hbWVbXTsKKworLyoKICAqIEEgY29udHJvbCBzdHJ1Y3R1cmUgd2hpY2ggdGVsbHMgdGhlIHdyaXRlYmFjayBjb2RlIHdoYXQgdG8gZG8uICBUaGVzZSBhcmUKICAqIGFsd2F5cyBvbiB0aGUgc3RhY2ssIGFuZCBoZW5jZSBuZWVkIG5vIGxvY2tpbmcuICBUaGV5IGFyZSBhbHdheXMgaW5pdGlhbGlzZWQKICAqIGluIGEgbWFubmVyIHN1Y2ggdGhhdCB1bnNwZWNpZmllZCBmaWVsZHMgYXJlIHNldCB0byB6ZXJvLgpAQCAtNjksMTQgKzg2LDE3IEBACiAgKi8JCiBzdHJ1Y3QgYmRpX3dyaXRlYmFjazsKIGludCBpbm9kZV93YWl0KHZvaWQgKik7Ci12b2lkIHdyaXRlYmFja19pbm9kZXNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICopOwotdm9pZCB3cml0ZWJhY2tfaW5vZGVzX3NiX25yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nIG5yKTsKLWludCB3cml0ZWJhY2tfaW5vZGVzX3NiX2lmX2lkbGUoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotaW50IHdyaXRlYmFja19pbm9kZXNfc2JfbnJfaWZfaWRsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyBucik7Cit2b2lkIHdyaXRlYmFja19pbm9kZXNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGVudW0gd2JfcmVhc29uIHJlYXNvbik7Cit2b2lkIHdyaXRlYmFja19pbm9kZXNfc2JfbnIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcgbnIsCisJCQkJCQkJZW51bSB3Yl9yZWFzb24gcmVhc29uKTsKK2ludCB3cml0ZWJhY2tfaW5vZGVzX3NiX2lmX2lkbGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIGVudW0gd2JfcmVhc29uIHJlYXNvbik7CitpbnQgd3JpdGViYWNrX2lub2Rlc19zYl9ucl9pZl9pZGxlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nIG5yLAorCQkJCQkJCWVudW0gd2JfcmVhc29uIHJlYXNvbik7CiB2b2lkIHN5bmNfaW5vZGVzX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLWxvbmcgd3JpdGViYWNrX2lub2Rlc193YihzdHJ1Y3QgYmRpX3dyaXRlYmFjayAqd2IsIGxvbmcgbnJfcGFnZXMpOworbG9uZyB3cml0ZWJhY2tfaW5vZGVzX3diKHN0cnVjdCBiZGlfd3JpdGViYWNrICp3YiwgbG9uZyBucl9wYWdlcywKKwkJCQllbnVtIHdiX3JlYXNvbiByZWFzb24pOwogbG9uZyB3Yl9kb193cml0ZWJhY2soc3RydWN0IGJkaV93cml0ZWJhY2sgKndiLCBpbnQgZm9yY2Vfd2FpdCk7Ci12b2lkIHdha2V1cF9mbHVzaGVyX3RocmVhZHMobG9uZyBucl9wYWdlcyk7Cit2b2lkIHdha2V1cF9mbHVzaGVyX3RocmVhZHMobG9uZyBucl9wYWdlcywgZW51bSB3Yl9yZWFzb24gcmVhc29uKTsKIAogLyogd3JpdGViYWNrLmggcmVxdWlyZXMgZnMuaDsgaXQsIHRvbywgaXMgbm90IGluY2x1ZGVkIGZyb20gaGVyZS4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X29uX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC0xNDMsNiArMTYzLDcgQEAKIAogdm9pZCBfX2JkaV91cGRhdGVfYmFuZHdpZHRoKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCiAJCQkgICAgdW5zaWduZWQgbG9uZyB0aHJlc2gsCisJCQkgICAgdW5zaWduZWQgbG9uZyBiZ190aHJlc2gsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBkaXJ0eSwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGJkaV90aHJlc2gsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBiZGlfZGlydHksCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL201bW9scy5oIGIvaW5jbHVkZS9tZWRpYS9tNW1vbHMuaAppbmRleCBhYWMyYzBlLi40YTgyNWFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL201bW9scy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbTVtb2xzLmgKQEAgLTE4LDE1ICsxOCwxMyBAQAogCiAvKioKICAqIHN0cnVjdCBtNW1vbHNfcGxhdGZvcm1fZGF0YSAtIHBsYXRmb3JtIGRhdGEgZm9yIE0tNU1PTFMgZHJpdmVyCi0gKiBAaXJxOglHUElPIGdldHRpbmcgdGhlIGlycSBwaW4gb2YgTS01TU9MUwogICogQGdwaW9fcmVzZXQ6CUdQSU8gZHJpdmluZyB0aGUgcmVzZXQgcGluIG9mIE0tNU1PTFMKLSAqIEByZXNldF9wb2xhcml0eTogYWN0aXZlIHN0YXRlIGZvciBncGlvX3JzdCBwaW4sIDAgb3IgMQorICogQHJlc2V0X3BvbGFyaXR5OiBhY3RpdmUgc3RhdGUgZm9yIGdwaW9fcmVzZXQgcGluLCAwIG9yIDEKICAqIEBzZXRfcG93ZXI6CWFuIGFkZGl0aW9uYWwgY2FsbGJhY2sgdG8gdGhlIGJvYXJkIHNldHVwIGNvZGUKICAqCQl0byBiZSBjYWxsZWQgYWZ0ZXIgZW5hYmxpbmcgYW5kIGJlZm9yZSBkaXNhYmxpbmcKICAqCQl0aGUgc2Vuc29yJ3Mgc3VwcGx5IHJlZ3VsYXRvcnMKICAqLwogc3RydWN0IG01bW9sc19wbGF0Zm9ybV9kYXRhIHsKLQlpbnQgaXJxOwogCWludCBncGlvX3Jlc2V0OwogCXU4IHJlc2V0X3BvbGFyaXR5OwogCWludCAoKnNldF9wb3dlcikoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgb24pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tdDlwMDMxLmggYi9pbmNsdWRlL21lZGlhL210OXAwMzEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQ0OGM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9tdDlwMDMxLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBNVDlQMDMxX0gKKyNkZWZpbmUgTVQ5UDAzMV9ICisKK3N0cnVjdCB2NGwyX3N1YmRldjsKKworZW51bSB7CisJTVQ5UDAzMV9DT0xPUl9WRVJTSU9OLAorCU1UOVAwMzFfTU9OT0NIUk9NRV9WRVJTSU9OLAorfTsKKworc3RydWN0IG10OXAwMzFfcGxhdGZvcm1fZGF0YSB7CisJaW50ICgqc2V0X3hjbGspKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LCBpbnQgaHopOworCWludCAoKnJlc2V0KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgaW50IGFjdGl2ZSk7CisJaW50IGV4dF9mcmVxOyAvKiBpbnB1dCBmcmVxdWVuY3kgdG8gdGhlIG10OXAwMzEgZm9yIFBMTCBkaXZpZGVycyAqLworCWludCB0YXJnZXRfZnJlcTsgLyogZnJlcXVlbmN5IHRhcmdldCBmb3IgdGhlIFBMTCAqLworCWludCB2ZXJzaW9uOyAvKiBNVDlQMDMxX0NPTE9SX1ZFUlNJT04gb3IgTVQ5UDAzMV9NT05PQ0hST01FX1ZFUlNJT04gKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tdDl0MDAxLmggYi9pbmNsdWRlL21lZGlhL210OXQwMDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODM5YTc4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9tdDl0MDAxLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9NRURJQV9NVDlUMDAxX0gKKyNkZWZpbmUgX01FRElBX01UOVQwMDFfSAorCitzdHJ1Y3QgbXQ5dDAwMV9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgY2xrX3BvbDoxOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29tYXAzaXNwLmggYi9pbmNsdWRlL21lZGlhL29tYXAzaXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxN2IxZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvb21hcDNpc3AuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIG9tYXAzaXNwLmgKKyAqCisgKiBUSSBPTUFQMyBJU1AgLSBQbGF0Zm9ybSBkYXRhCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogQ29udGFjdHM6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KKyAqCSAgICAgU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAaWtpLmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9fTUVESUFfT01BUDNJU1BfSF9fCisjZGVmaW5lIF9fTUVESUFfT01BUDNJU1BfSF9fCisKK3N0cnVjdCBpMmNfYm9hcmRfaW5mbzsKK3N0cnVjdCBpc3BfZGV2aWNlOworCitlbnVtIGlzcF9pbnRlcmZhY2VfdHlwZSB7CisJSVNQX0lOVEVSRkFDRV9QQVJBTExFTCwKKwlJU1BfSU5URVJGQUNFX0NTSTJBX1BIWTIsCisJSVNQX0lOVEVSRkFDRV9DQ1AyQl9QSFkxLAorCUlTUF9JTlRFUkZBQ0VfQ0NQMkJfUEhZMiwKKwlJU1BfSU5URVJGQUNFX0NTSTJDX1BIWTEsCit9OworCitlbnVtIHsKKwlJU1BfQlJJREdFX0RJU0FCTEUgPSAwLAorCUlTUF9CUklER0VfTElUVExFX0VORElBTiA9IDIsCisJSVNQX0JSSURHRV9CSUdfRU5ESUFOID0gMywKK307CisKK2VudW0geworCUlTUF9MQU5FX1NISUZUXzAgPSAwLAorCUlTUF9MQU5FX1NISUZUXzIgPSAxLAorCUlTUF9MQU5FX1NISUZUXzQgPSAyLAorCUlTUF9MQU5FX1NISUZUXzYgPSAzLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgaXNwX3BhcmFsbGVsX3BsYXRmb3JtX2RhdGEgLSBQYXJhbGxlbCBpbnRlcmZhY2UgcGxhdGZvcm0gZGF0YQorICogQGRhdGFfbGFuZV9zaGlmdDogRGF0YSBsYW5lIHNoaWZ0ZXIKKyAqCQlJU1BfTEFORV9TSElGVF8wIC0gQ0FNRVhUWzEzOjBdIC0+IENBTVsxMzowXQorICoJCUlTUF9MQU5FX1NISUZUXzIgLSBDQU1FWFRbMTM6Ml0gLT4gQ0FNWzExOjBdCisgKgkJSVNQX0xBTkVfU0hJRlRfNCAtIENBTUVYVFsxMzo0XSAtPiBDQU1bOTowXQorICoJCUlTUF9MQU5FX1NISUZUXzYgLSBDQU1FWFRbMTM6Nl0gLT4gQ0FNWzc6MF0KKyAqIEBjbGtfcG9sOiBQaXhlbCBjbG9jayBwb2xhcml0eQorICoJCTAgLSBOb24gSW52ZXJ0ZWQsIDEgLSBJbnZlcnRlZAorICogQGhzX3BvbDogSG9yaXpvbnRhbCBzeW5jaHJvbml6YXRpb24gcG9sYXJpdHkKKyAqCQkwIC0gQWN0aXZlIGhpZ2gsIDEgLSBBY3RpdmUgbG93CisgKiBAdnNfcG9sOiBWZXJ0aWNhbCBzeW5jaHJvbml6YXRpb24gcG9sYXJpdHkKKyAqCQkwIC0gQWN0aXZlIGhpZ2gsIDEgLSBBY3RpdmUgbG93CisgKiBAYnJpZGdlOiBDQ0RDIEJyaWRnZSBpbnB1dCBjb250cm9sCisgKgkJSVNQX0JSSURHRV9ESVNBQkxFIC0gRGlzYWJsZQorICoJCUlTUF9CUklER0VfTElUVExFX0VORElBTiAtIExpdHRsZSBlbmRpYW4KKyAqCQlJU1BfQlJJREdFX0JJR19FTkRJQU4gLSBCaWcgZW5kaWFuCisgKi8KK3N0cnVjdCBpc3BfcGFyYWxsZWxfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgaW50IGRhdGFfbGFuZV9zaGlmdDoyOworCXVuc2lnbmVkIGludCBjbGtfcG9sOjE7CisJdW5zaWduZWQgaW50IGhzX3BvbDoxOworCXVuc2lnbmVkIGludCB2c19wb2w6MTsKKwl1bnNpZ25lZCBpbnQgYnJpZGdlOjI7Cit9OworCitlbnVtIHsKKwlJU1BfQ0NQMl9QSFlfREFUQV9DTE9DSyA9IDAsCisJSVNQX0NDUDJfUEhZX0RBVEFfU1RST0JFID0gMSwKK307CisKK2VudW0geworCUlTUF9DQ1AyX01PREVfTUlQSSA9IDAsCisJSVNQX0NDUDJfTU9ERV9DQ1AyID0gMSwKK307CisKKy8qKgorICogc3RydWN0IGlzcF9jY3AyX3BsYXRmb3JtX2RhdGEgLSBDQ1AyIGludGVyZmFjZSBwbGF0Zm9ybSBkYXRhCisgKiBAc3Ryb2JlX2Nsa19wb2w6IFN0cm9iZS9jbG9jayBwb2xhcml0eQorICoJCTAgLSBOb24gSW52ZXJ0ZWQsIDEgLSBJbnZlcnRlZAorICogQGNyYzogRW5hYmxlIHRoZSBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjaworICogQGNjcDJfbW9kZTogRW5hYmxlIENDUDIgY29tcGF0aWJpbGl0eSBtb2RlCisgKgkJSVNQX0NDUDJfTU9ERV9NSVBJIC0gTUlQSS1DU0kxIG1vZGUKKyAqCQlJU1BfQ0NQMl9NT0RFX0NDUDIgLSBDQ1AyIG1vZGUKKyAqIEBwaHlfbGF5ZXI6IFBoeXNpY2FsIGxheWVyIHNlbGVjdGlvbgorICoJCUlTUF9DQ1AyX1BIWV9EQVRBX0NMT0NLIC0gRGF0YS9jbG9jayBwaHlzaWNhbCBsYXllcgorICoJCUlTUF9DQ1AyX1BIWV9EQVRBX1NUUk9CRSAtIERhdGEvc3Ryb2JlIHBoeXNpY2FsIGxheWVyCisgKiBAdnBjbGtfZGl2OiBWaWRlbyBwb3J0IG91dHB1dCBjbG9jayBjb250cm9sCisgKi8KK3N0cnVjdCBpc3BfY2NwMl9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgc3Ryb2JlX2Nsa19wb2w6MTsKKwl1bnNpZ25lZCBpbnQgY3JjOjE7CisJdW5zaWduZWQgaW50IGNjcDJfbW9kZToxOworCXVuc2lnbmVkIGludCBwaHlfbGF5ZXI6MTsKKwl1bnNpZ25lZCBpbnQgdnBjbGtfZGl2OjI7Cit9OworCisvKioKKyAqIHN0cnVjdCBpc3BfY3NpMl9wbGF0Zm9ybV9kYXRhIC0gQ1NJMiBpbnRlcmZhY2UgcGxhdGZvcm0gZGF0YQorICogQGNyYzogRW5hYmxlIHRoZSBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjaworICogQHZwY2xrX2RpdjogVmlkZW8gcG9ydCBvdXRwdXQgY2xvY2sgY29udHJvbAorICovCitzdHJ1Y3QgaXNwX2NzaTJfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgY3JjOjE7CisJdW5zaWduZWQgdnBjbGtfZGl2OjI7Cit9OworCitzdHJ1Y3QgaXNwX3N1YmRldl9pMmNfYm9hcmRfaW5mbyB7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvICpib2FyZF9pbmZvOworCWludCBpMmNfYWRhcHRlcl9pZDsKK307CisKK3N0cnVjdCBpc3BfdjRsMl9zdWJkZXZzX2dyb3VwIHsKKwlzdHJ1Y3QgaXNwX3N1YmRldl9pMmNfYm9hcmRfaW5mbyAqc3ViZGV2czsKKwllbnVtIGlzcF9pbnRlcmZhY2VfdHlwZSBpbnRlcmZhY2U7CisJdW5pb24geworCQlzdHJ1Y3QgaXNwX3BhcmFsbGVsX3BsYXRmb3JtX2RhdGEgcGFyYWxsZWw7CisJCXN0cnVjdCBpc3BfY2NwMl9wbGF0Zm9ybV9kYXRhIGNjcDI7CisJCXN0cnVjdCBpc3BfY3NpMl9wbGF0Zm9ybV9kYXRhIGNzaTI7CisJfSBidXM7IC8qIGdjYyA8IDQuNi4wIGNob2tlcyBvbiBhbm9ueW1vdXMgdW5pb24gaW5pdGlhbGl6ZXJzICovCit9OworCitzdHJ1Y3QgaXNwX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCBpc3BfdjRsMl9zdWJkZXZzX2dyb3VwICpzdWJkZXZzOworCXZvaWQgKCpzZXRfY29uc3RyYWludHMpKHN0cnVjdCBpc3BfZGV2aWNlICppc3AsIGJvb2wgZW5hYmxlKTsKK307CisKKyNlbmRpZgkvKiBfX01FRElBX09NQVAzSVNQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vdjc3MnguaCBiL2luY2x1ZGUvbWVkaWEvb3Y3NzJ4LmgKaW5kZXggNTQ4YmYxMS4uMDBkYmI3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9vdjc3MnguaAorKysgYi9pbmNsdWRlL21lZGlhL292NzcyeC5oCkBAIC0xMiwxMiArMTIsOSBAQAogI2lmbmRlZiBfX09WNzcyWF9IX18KICNkZWZpbmUgX19PVjc3MlhfSF9fCiAKLSNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+Ci0KIC8qIGZvciBmbGFncyAqLwogI2RlZmluZSBPVjc3MlhfRkxBR19WRkxJUAkoMSA8PCAwKSAvKiBWZXJ0aWNhbCBmbGlwIGltYWdlICovCiAjZGVmaW5lIE9WNzcyWF9GTEFHX0hGTElQCSgxIDw8IDEpIC8qIEhvcml6b250YWwgZmxpcCBpbWFnZSAqLwotI2RlZmluZSBPVjc3MlhfRkxBR184QklUCSgxIDw8IDIpIC8qIGRlZmF1bHQgMTAgYml0ICovCiAKIC8qCiAgKiBmb3IgRWRnZSBjdHJsCkBAIC0zMiwyMiArMjksMjMgQEAKIAl1bnNpZ25lZCBjaGFyIGxvd2VyOwogfTsKIAotI2RlZmluZSBPVjc3MlhfTUFOVUFMX0VER0VfQ1RSTAkweDgwIC8qIHVuLXVzZWQgYml0IG9mIHN0cmVuZ3RoICovCi0jZGVmaW5lIEVER0VfU1RSRU5HVEhfTUFTSwkweDFGCi0jZGVmaW5lIEVER0VfVEhSRVNIT0xEX01BU0sJMHgwRgotI2RlZmluZSBFREdFX1VQUEVSX01BU0sJCTB4RkYKLSNkZWZpbmUgRURHRV9MT1dFUl9NQVNLCQkweEZGCisjZGVmaW5lIE9WNzcyWF9NQU5VQUxfRURHRV9DVFJMCQkweDgwIC8qIHVuLXVzZWQgYml0IG9mIHN0cmVuZ3RoICovCisjZGVmaW5lIE9WNzcyWF9FREdFX1NUUkVOR1RIX01BU0sJMHgxRgorI2RlZmluZSBPVjc3MlhfRURHRV9USFJFU0hPTERfTUFTSwkweDBGCisjZGVmaW5lIE9WNzcyWF9FREdFX1VQUEVSX01BU0sJCTB4RkYKKyNkZWZpbmUgT1Y3NzJYX0VER0VfTE9XRVJfTUFTSwkJMHhGRgogCiAjZGVmaW5lIE9WNzcyWF9BVVRPX0VER0VDVFJMKHUsIGwpCVwKIHsJCQkJCVwKLQkudXBwZXIgPSAodSAmIEVER0VfVVBQRVJfTUFTSyksCVwKLQkubG93ZXIgPSAobCAmIEVER0VfTE9XRVJfTUFTSyksCVwKKwkudXBwZXIgPSAodSAmIE9WNzcyWF9FREdFX1VQUEVSX01BU0spLAlcCisJLmxvd2VyID0gKGwgJiBPVjc3MlhfRURHRV9MT1dFUl9NQVNLKSwJXAogfQogCi0jZGVmaW5lIE9WNzcyWF9NQU5VQUxfRURHRUNUUkwocywgdCkJCQkJCVwKLXsJCQkJCQkJCQlcCi0JLnN0cmVuZ3RoICA9IChzICYgRURHRV9TVFJFTkdUSF9NQVNLKSB8IE9WNzcyWF9NQU5VQUxfRURHRV9DVFJMLFwKLQkudGhyZXNob2xkID0gKHQgJiBFREdFX1RIUkVTSE9MRF9NQVNLKSwJCQkJXAorI2RlZmluZSBPVjc3MlhfTUFOVUFMX0VER0VDVFJMKHMsIHQpCQkJXAorewkJCQkJCQlcCisJLnN0cmVuZ3RoICA9IChzICYgT1Y3NzJYX0VER0VfU1RSRU5HVEhfTUFTSykgfAlcCisJCQlPVjc3MlhfTUFOVUFMX0VER0VfQ1RSTCwJXAorCS50aHJlc2hvbGQgPSAodCAmIE9WNzcyWF9FREdFX1RIUkVTSE9MRF9NQVNLKSwJXAogfQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9yYy1jb3JlLmggYi9pbmNsdWRlL21lZGlhL3JjLWNvcmUuaAppbmRleCBiMWYxOWI3Li5iMGM0OTRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3JjLWNvcmUuaAorKysgYi9pbmNsdWRlL21lZGlhL3JjLWNvcmUuaApAQCAtMjMsOCArMjMsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KIAogZXh0ZXJuIGludCByY19jb3JlX2RlYnVnOwotI2RlZmluZSBJUl9kcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikJaWYgKHJjX2NvcmVfZGVidWcgPj0gbGV2ZWwpIFwKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10ICwgX19mdW5jX18sICMjIGFyZykKKyNkZWZpbmUgSVJfZHByaW50ayhsZXZlbCwgZm10LCAuLi4pCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAocmNfY29yZV9kZWJ1ZyA+PSBsZXZlbCkJCQkJXAorCQlwcl9kZWJ1ZygiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXyk7CVwKK30gd2hpbGUgKDApCiAKIGVudW0gcmNfZHJpdmVyX3R5cGUgewogCVJDX0RSSVZFUl9TQ0FOQ09ERSA9IDAsCS8qIERyaXZlciBvciBoYXJkd2FyZSBnZW5lcmF0ZXMgYSBzY2FuY29kZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9yYy1tYXAuaCBiL2luY2x1ZGUvbWVkaWEvcmMtbWFwLmgKaW5kZXggMTdjOTc1OS4uMjZhM2JkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9yYy1tYXAuaAorKysgYi9pbmNsdWRlL21lZGlhL3JjLW1hcC5oCkBAIC02MSw2ICs2MSw3IEBACiAjZGVmaW5lIFJDX01BUF9BUEFDX1ZJRVdDT01QICAgICAgICAgICAgICJyYy1hcGFjLXZpZXdjb21wIgogI2RlZmluZSBSQ19NQVBfQVNVU19QQzM5ICAgICAgICAgICAgICAgICAicmMtYXN1cy1wYzM5IgogI2RlZmluZSBSQ19NQVBfQVRJX1RWX1dPTkRFUl9IRF82MDAgICAgICAicmMtYXRpLXR2LXdvbmRlci1oZC02MDAiCisjZGVmaW5lIFJDX01BUF9BVElfWDEwICAgICAgICAgICAgICAgICAgICJyYy1hdGkteDEwIgogI2RlZmluZSBSQ19NQVBfQVZFUk1FRElBX0ExNkQgICAgICAgICAgICAicmMtYXZlcm1lZGlhLWExNmQiCiAjZGVmaW5lIFJDX01BUF9BVkVSTUVESUFfQ0FSREJVUyAgICAgICAgICJyYy1hdmVybWVkaWEtY2FyZGJ1cyIKICNkZWZpbmUgUkNfTUFQX0FWRVJNRURJQV9EVkJUICAgICAgICAgICAgInJjLWF2ZXJtZWRpYS1kdmJ0IgpAQCAtMTA2LDYgKzEwNyw3IEBACiAjZGVmaW5lIFJDX01BUF9MSVJDICAgICAgICAgICAgICAgICAgICAgICJyYy1saXJjIgogI2RlZmluZSBSQ19NQVBfTE1FMjUxMCAgICAgICAgICAgICAgICAgICAicmMtbG1lMjUxMCIKICNkZWZpbmUgUkNfTUFQX01BTkxJICAgICAgICAgICAgICAgICAgICAgInJjLW1hbmxpIgorI2RlZmluZSBSQ19NQVBfTUVESU9OX1gxMCAgICAgICAgICAgICAgICAicmMtbWVkaW9uLXgxMCIKICNkZWZpbmUgUkNfTUFQX01TSV9ESUdJVk9YX0lJICAgICAgICAgICAgInJjLW1zaS1kaWdpdm94LWlpIgogI2RlZmluZSBSQ19NQVBfTVNJX0RJR0lWT1hfSUlJICAgICAgICAgICAicmMtbXNpLWRpZ2l2b3gtaWlpIgogI2RlZmluZSBSQ19NQVBfTVNJX1RWQU5ZV0hFUkVfUExVUyAgICAgICAicmMtbXNpLXR2YW55d2hlcmUtcGx1cyIKQEAgLTEzMCw2ICsxMzIsNyBAQAogI2RlZmluZSBSQ19NQVBfUkM1X1RWICAgICAgICAgICAgICAgICAgICAicmMtcmM1LXR2IgogI2RlZmluZSBSQ19NQVBfUkM2X01DRSAgICAgICAgICAgICAgICAgICAicmMtcmM2LW1jZSIKICNkZWZpbmUgUkNfTUFQX1JFQUxfQVVESU9fMjIwXzMyX0tFWVMgICAgInJjLXJlYWwtYXVkaW8tMjIwLTMyLWtleXMiCisjZGVmaW5lIFJDX01BUF9TTkFQU1RSRUFNX0ZJUkVGTFkgICAgICAgICJyYy1zbmFwc3RyZWFtLWZpcmVmbHkiCiAjZGVmaW5lIFJDX01BUF9TVFJFQU1aQVAgICAgICAgICAgICAgICAgICJyYy1zdHJlYW16YXAiCiAjZGVmaW5lIFJDX01BUF9UQlNfTkVDICAgICAgICAgICAgICAgICAgICJyYy10YnMtbmVjIgogI2RlZmluZSBSQ19NQVBfVEVDSE5JU0FUX1VTQjIgICAgICAgICAgICAicmMtdGVjaG5pc2F0LXVzYjIiCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3M1azZhYS5oIGIvaW5jbHVkZS9tZWRpYS9zNWs2YWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM0ZjcwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zNWs2YWEuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogUzVLNkFBRlggY2FtZXJhIHNlbnNvciBkcml2ZXIgaGVhZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIFM1SzZBQV9ICisjZGVmaW5lIFM1SzZBQV9ICisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLW1lZGlhYnVzLmg+CisKKy8qKgorICogc3RydWN0IHM1azZhYV9ncGlvIC0gZGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIEdQSU8KKyAqIEBncGlvOiAgR1BJTyBudW1iZXIKKyAqIEBsZXZlbDogaW5kaWNhdGVzIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgQGdwaW8KKyAqLworc3RydWN0IHM1azZhYV9ncGlvIHsKKwlpbnQgZ3BpbzsKKwlpbnQgbGV2ZWw7Cit9OworCisvKioKKyAqIHN0cnVjdCBzNWs2YWFfcGxhdGZvcm1fZGF0YSAtIHM1azZhYSBkcml2ZXIgcGxhdGZvcm0gZGF0YQorICogQHNldF9wb3dlcjogICBhbiBhZGRpdGlvbmFsIGNhbGxiYWNrIHRvIHRoZSBib2FyZCBjb2RlLCBjYWxsZWQKKyAqICAgICAgICAgICAgICAgYWZ0ZXIgZW5hYmxpbmcgdGhlIHJlZ3VsYXRvcnMgYW5kIGJlZm9yZSBzd2l0Y2hpbmcKKyAqICAgICAgICAgICAgICAgdGhlIHNlbnNvciBvZmYKKyAqIEBtY2xrX2ZyZXF1ZW5jeTogc2Vuc29yJ3MgbWFzdGVyIGNsb2NrIGZyZXF1ZW5jeSBpbiBIegorICogQGdwaW9fcmVzZXQ6ICBHUElPIGRyaXZpbmcgUkVTRVQgcGluCisgKiBAZ3Bpb19zdGJ5OiAgIEdQSU8gZHJpdmluZyBTVEJZIHBpbgorICogQG5sYW5lczogICAgICBtYXhpbXVtIG51bWJlciBvZiBNSVBJLUNTSSBsYW5lcyB1c2VkCisgKiBAaG9yaXpfZmxpcDogIGRlZmF1bHQgaG9yaXpvbnRhbCBpbWFnZSBmbGlwIHZhbHVlLCBub24gemVybyB0byBlbmFibGUKKyAqIEB2ZXJ0X2ZsaXA6ICAgZGVmYXVsdCB2ZXJ0aWNhbCBpbWFnZSBmbGlwIHZhbHVlLCBub24gemVybyB0byBlbmFibGUKKyAqLworCitzdHJ1Y3QgczVrNmFhX3BsYXRmb3JtX2RhdGEgeworCWludCAoKnNldF9wb3dlcikoaW50IGVuYWJsZSk7CisJdW5zaWduZWQgbG9uZyBtY2xrX2ZyZXF1ZW5jeTsKKwlzdHJ1Y3QgczVrNmFhX2dwaW8gZ3Bpb19yZXNldDsKKwlzdHJ1Y3QgczVrNmFhX2dwaW8gZ3Bpb19zdGJ5OworCWVudW0gdjRsMl9tYnVzX3R5cGUgYnVzX3R5cGU7CisJdTggbmxhbmVzOworCXU4IGhvcml6X2ZsaXA7CisJdTggdmVydF9mbGlwOworfTsKKworI2VuZGlmIC8qIFM1SzZBQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3M1cF9maW1jLmggYi9pbmNsdWRlL21lZGlhL3M1cF9maW1jLmgKaW5kZXggOWZkZmY4YTQuLjY4OGZiM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvczVwX2ZpbWMuaAorKysgYi9pbmNsdWRlL21lZGlhL3M1cF9maW1jLmgKQEAgLTE5LDExICsxOSw2IEBACiAJRklNQ19MQ0RfV0IsIC8qIEZJRk8gbGluayBmcm9tIExDRCBtaXhlciAqLwogfTsKIAotI2RlZmluZSBGSU1DX0NMS19JTlZfUENMSwkoMSA8PCAwKQotI2RlZmluZSBGSU1DX0NMS19JTlZfVlNZTkMJKDEgPDwgMSkKLSNkZWZpbmUgRklNQ19DTEtfSU5WX0hSRUYJKDEgPDwgMikKLSNkZWZpbmUgRklNQ19DTEtfSU5WX0hTWU5DCSgxIDw8IDMpCi0KIHN0cnVjdCBpMmNfYm9hcmRfaW5mbzsKIAogLyoqCkBAIC0zNiw3ICszMSw4IEBACiAgKiBAY3NpX2RhdGFfYWxpZ246IE1JUEktQ1NJIGludGVyZmFjZSBkYXRhIGFsaWdubWVudCBpbiBiaXRzCiAgKiBAaTJjX2J1c19udW06IGkyYyBjb250cm9sIGJ1cyBpZCB0aGUgc2Vuc29yIGlzIGF0dGFjaGVkIHRvCiAgKiBAbXV4X2lkOiBGSU1DIGNhbWVyYSBpbnRlcmZhY2UgbXVsdGlwbGV4ZXIgaW5kZXggKHNlcGFyYXRlIGZvciBNSVBJIGFuZCBJVFUpCi0gKiBAZmxhZ3M6IGZsYWdzIGRlZmluaW5nIGJ1cyBzaWduYWxzIHBvbGFyaXR5IGludmVyc2lvbiAoSGlnaCBieSBkZWZhdWx0KQorICogQGNsa19pZDogaW5kZXggb2YgdGhlIFNvQyBwZXJpcGhlcmFsIGNsb2NrIGZvciBzZW5zb3JzCisgKiBAZmxhZ3M6IHRoZSBwYXJhbGxlbCBidXMgZmxhZ3MgZGVmaW5pbmcgc2lnbmFscyBwb2xhcml0eSAoVjRMMl9NQlVTXyopCiAgKi8KIHN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyB7CiAJc3RydWN0IGkyY19ib2FyZF9pbmZvICpib2FyZF9pbmZvOwpAQCAtNDYsNiArNDIsNyBAQAogCXUxNiBpMmNfYnVzX251bTsKIAl1MTYgbXV4X2lkOwogCXUxNiBmbGFnczsKKwl1OCBjbGtfaWQ7CiB9OwogCiAvKioKQEAgLTU4LDQgKzU1LDEzIEBACiAJc3RydWN0IHM1cF9maW1jX2lzcF9pbmZvICppc3BfaW5mbzsKIAlpbnQgbnVtX2NsaWVudHM7CiB9OworCisvKgorICogdjRsMl9kZXZpY2Ugbm90aWZpY2F0aW9uIGlkLiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIHVzZSBpbiB0aGUga2VybmVsLgorICogU2Vuc29yIHN1YmRldnMgc2hvdWxkIGlzc3VlIFM1UF9GSU1DX1RYX0VORF9OT1RJRlkgbm90aWZpY2F0aW9uIGluIHNpbmdsZQorICogZnJhbWUgY2FwdHVyZSBtb2RlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgVlNZTkMgcHVsc2UgaXNzdWVkIGJ5IHRoZSBzZW5zb3IKKyAqIGF0IGJlZ2luaW5nIG9mIHRoZSBmcmFtZSB0cmFuc21pc3Npb24uCisgKi8KKyNkZWZpbmUgUzVQX0ZJTUNfVFhfRU5EX05PVElGWSBfSU8oJ2UnLCAwKQorCiAjZW5kaWYgLyogUzVQX0ZJTUNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2FhNzE0Ni5oIGIvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2LmgKaW5kZXggNzk4MjcxNC4uMGYwMzdlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2LmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9fU0FBNzE0Nl9fCiAjZGVmaW5lIF9fU0FBNzE0Nl9fCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogZm9yIG1vZHVsZS12ZXJzaW9uICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogZm9yIGRlbGF5LXN0dWZmICovCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyogZm9yIGttYWxsb2Mva2ZyZWUgKi8KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4JCS8qIGZvciBwY2ktY29uZmlnLXN0dWZmLCB2ZW5kb3IgaWRzIGV0Yy4gKi8KQEAgLTI1LDI4ICsyNCwzOCBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IHNhYTcxNDZfZGVidWc7CiAKLS8vI2RlZmluZSBERUJVR19QUk9MT0cgcHJpbnRrKCIoMHglMDh4KSgweCUwOHgpICVzOiAlcygpOiAiLChkZXY9PTA/LTE6KGRldi0+bWVtPT0wPy0xOnNhYTcxNDZfcmVhZChkZXYsUlBTX0FERFIwKSkpLChkZXY9PTA/LTE6KGRldi0+bWVtPT0wPy0xOnNhYTcxNDZfcmVhZChkZXYsSUVSKSkpLEtCVUlMRF9NT0ROQU1FLF9fZnVuY19fKQotCiAjaWZuZGVmIERFQlVHX1ZBUklBQkxFCiAJI2RlZmluZSBERUJVR19WQVJJQUJMRSBzYWE3MTQ2X2RlYnVnCiAjZW5kaWYKIAotI2RlZmluZSBERUJVR19QUk9MT0cgcHJpbnRrKCIlczogJXMoKTogIixLQlVJTERfTU9ETkFNRSwgX19mdW5jX18pCi0jZGVmaW5lIElORk8oeCkgeyBwcmludGsoIiVzOiAiLEtCVUlMRF9NT0ROQU1FKTsgcHJpbnRrIHg7IH0KKyNkZWZpbmUgRVJSKGZtdCwgLi4uKQlwcl9lcnIoIiVzOiAiIGZtdCwgX19mdW5jX18sICMjX19WQV9BUkdTX18pCiAKLSNkZWZpbmUgRVJSKHgpIHsgREVCVUdfUFJPTE9HOyBwcmludGsgeDsgfQorI2RlZmluZSBfREJHKG1hc2ssIGZtdCwgLi4uKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKERFQlVHX1ZBUklBQkxFICYgbWFzaykJCQkJCVwKKwkJcHJfZGVidWcoIiVzKCk6ICIgZm10LCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXyk7CVwKK30gd2hpbGUgKDApCiAKLSNkZWZpbmUgREVCX1MoeCkgICAgaWYgKDAhPShERUJVR19WQVJJQUJMRSYweDAxKSkgeyBERUJVR19QUk9MT0c7IHByaW50ayB4OyB9IC8qIHNpbXBsZSBkZWJ1ZyBtZXNzYWdlcyAqLwotI2RlZmluZSBERUJfRCh4KSAgICBpZiAoMCE9KERFQlVHX1ZBUklBQkxFJjB4MDIpKSB7IERFQlVHX1BST0xPRzsgcHJpbnRrIHg7IH0gLyogbW9yZSBkZXRhaWxlZCBkZWJ1ZyBtZXNzYWdlcyAqLwotI2RlZmluZSBERUJfRUUoeCkgICBpZiAoMCE9KERFQlVHX1ZBUklBQkxFJjB4MDQpKSB7IERFQlVHX1BST0xPRzsgcHJpbnRrIHg7IH0gLyogcHJpbnQgZW50ZXIgYW5kIGV4aXQgb2YgZnVuY3Rpb25zICovCi0jZGVmaW5lIERFQl9JMkMoeCkgIGlmICgwIT0oREVCVUdfVkFSSUFCTEUmMHgwOCkpIHsgREVCVUdfUFJPTE9HOyBwcmludGsgeDsgfSAvKiBpMmMgZGVidWcgbWVzc2FnZXMgKi8KLSNkZWZpbmUgREVCX1ZCSSh4KSAgaWYgKDAhPShERUJVR19WQVJJQUJMRSYweDEwKSkgeyBERUJVR19QUk9MT0c7IHByaW50ayB4OyB9IC8qIHZiaSBkZWJ1ZyBtZXNzYWdlcyAqLwotI2RlZmluZSBERUJfSU5UKHgpICBpZiAoMCE9KERFQlVHX1ZBUklBQkxFJjB4MjApKSB7IERFQlVHX1BST0xPRzsgcHJpbnRrIHg7IH0gLyogaW50ZXJydXB0IGRlYnVnIG1lc3NhZ2VzICovCi0jZGVmaW5lIERFQl9DQVAoeCkgIGlmICgwIT0oREVCVUdfVkFSSUFCTEUmMHg0MCkpIHsgREVCVUdfUFJPTE9HOyBwcmludGsgeDsgfSAvKiBjYXB0dXJlIGRlYnVnIG1lc3NhZ2VzICovCisvKiBzaW1wbGUgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCX1MoZm10LCAuLi4pCQlfREJHKDB4MDEsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKy8qIG1vcmUgZGV0YWlsZWQgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCX0QoZm10LCAuLi4pCQlfREJHKDB4MDIsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKy8qIHByaW50IGVudGVyIGFuZCBleGl0IG9mIGZ1bmN0aW9ucyAqLworI2RlZmluZSBERUJfRUUoZm10LCAuLi4pCV9EQkcoMHgwNCwgZm10LCAjI19fVkFfQVJHU19fKQorLyogaTJjIGRlYnVnIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQl9JMkMoZm10LCAuLi4pCV9EQkcoMHgwOCwgZm10LCAjI19fVkFfQVJHU19fKQorLyogdmJpIGRlYnVnIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQl9WQkkoZm10LCAuLi4pCV9EQkcoMHgxMCwgZm10LCAjI19fVkFfQVJHU19fKQorLyogaW50ZXJydXB0IGRlYnVnIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQl9JTlQoZm10LCAuLi4pCV9EQkcoMHgyMCwgZm10LCAjI19fVkFfQVJHU19fKQorLyogY2FwdHVyZSBkZWJ1ZyBtZXNzYWdlcyAqLworI2RlZmluZSBERUJfQ0FQKGZtdCwgLi4uKQlfREJHKDB4NDAsIGZtdCwgIyNfX1ZBX0FSR1NfXykKIAogI2RlZmluZSBTQUE3MTQ2X0lTUl9DTEVBUih4LHkpIFwKIAlzYWE3MTQ2X3dyaXRlKHgsIElTUiwgKHkpKTsKIAorc3RydWN0IG1vZHVsZTsKKwogc3RydWN0IHNhYTcxNDZfZGV2Owogc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uOwogc3RydWN0IHNhYTcxNDZfdnY7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaCBiL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oCmluZGV4IDc1ODI5NTIuLmIxMzc3YjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oCkBAIC0xMiwxMiArMTIsMTQgQEAKICNpZm5kZWYgU09DX0NBTUVSQV9ICiAjZGVmaW5lIFNPQ19DQU1FUkFfSAogCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWNvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItY29yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogCiBzdHJ1Y3QgZmlsZTsKQEAgLTM3LDggKzM5LDggQEAKIAl1bnNpZ25lZCBjaGFyIGlmYWNlOwkJLyogSG9zdCBudW1iZXIgKi8KIAl1bnNpZ25lZCBjaGFyIGRldm51bTsJCS8qIERldmljZSBudW1iZXIgcGVyIGhvc3QgKi8KIAlzdHJ1Y3Qgc29jX2NhbWVyYV9zZW5zZSAqc2Vuc2U7CS8qIFNlZSBjb21tZW50IGluIHN0cnVjdCBkZWZpbml0aW9uICovCi0Jc3RydWN0IHNvY19jYW1lcmFfb3BzICpvcHM7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgY3RybF9oYW5kbGVyOwogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqY3VycmVudF9mbXQ7CiAJc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp1c2VyX2Zvcm1hdHM7CiAJaW50IG51bV91c2VyX2Zvcm1hdHM7CkBAIC05MywxNCArOTUsMTAgQEAKIAlpbnQgKCpyZXFidWZzKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKik7CiAJaW50ICgqcXVlcnljYXApKHN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKiwgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqKTsKIAlpbnQgKCpzZXRfYnVzX3BhcmFtKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgX191MzIpOwotCWludCAoKmdldF9jdHJsKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgc3RydWN0IHY0bDJfY29udHJvbCAqKTsKLQlpbnQgKCpzZXRfY3RybCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX2NvbnRyb2wgKik7CiAJaW50ICgqZ2V0X3Bhcm0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICopOwogCWludCAoKnNldF9wYXJtKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqKTsKIAlpbnQgKCplbnVtX2ZzaXplcykoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICopOwogCXVuc2lnbmVkIGludCAoKnBvbGwpKHN0cnVjdCBmaWxlICosIHBvbGxfdGFibGUgKik7Ci0JY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjb250cm9sczsKLQlpbnQgbnVtX2NvbnRyb2xzOwogfTsKIAogI2RlZmluZSBTT0NBTV9TRU5TT1JfSU5WRVJUX1BDTEsJKDEgPDwgMCkKQEAgLTE5MywxMyArMTkxLDYgQEAKIAljb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgKmhvc3RfZm10OwogfTsKIAotc3RydWN0IHNvY19jYW1lcmFfb3BzIHsKLQl1bnNpZ25lZCBsb25nICgqcXVlcnlfYnVzX3BhcmFtKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7Ci0JaW50ICgqc2V0X2J1c19wYXJhbSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwotCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY29udHJvbHM7Ci0JaW50IG51bV9jb250cm9sczsKLX07Ci0KICNkZWZpbmUgU09DQU1fU0VOU0VfUENMS19DSEFOR0VECSgxIDw8IDApCiAKIC8qKgpAQCAtMjI2LDY1ICsyMTcsMTggQEAKIAl1bnNpZ25lZCBsb25nIHBpeGVsX2Nsb2NrOwogfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgY29uc3QgKnNvY19jYW1lcmFfZmluZF9xY3RybCgKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgKm9wcywgaW50IGlkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG9wcy0+bnVtX2NvbnRyb2xzOyBpKyspCi0JCWlmIChvcHMtPmNvbnRyb2xzW2ldLmlkID09IGlkKQotCQkJcmV0dXJuICZvcHMtPmNvbnRyb2xzW2ldOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgU09DQU1fTUFTVEVSCQkJKDEgPDwgMCkKLSNkZWZpbmUgU09DQU1fU0xBVkUJCQkoMSA8PCAxKQotI2RlZmluZSBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSAkJKDEgPDwgMikKLSNkZWZpbmUgU09DQU1fSFNZTkNfQUNUSVZFX0xPVwkJKDEgPDwgMykKLSNkZWZpbmUgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0gJCSgxIDw8IDQpCi0jZGVmaW5lIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cJCSgxIDw8IDUpCi0jZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF80CQkoMSA8PCA2KQotI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfOAkJKDEgPDwgNykKLSNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzkJCSgxIDw8IDgpCi0jZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF8xMAkJKDEgPDwgOSkKLSNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzE1CQkoMSA8PCAxMCkKLSNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzE2CQkoMSA8PCAxMSkKLSNkZWZpbmUgU09DQU1fUENMS19TQU1QTEVfUklTSU5HCSgxIDw8IDEyKQotI2RlZmluZSBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HCSgxIDw8IDEzKQotI2RlZmluZSBTT0NBTV9EQVRBX0FDVElWRV9ISUdICQkoMSA8PCAxNCkKLSNkZWZpbmUgU09DQU1fREFUQV9BQ1RJVkVfTE9XCQkoMSA8PCAxNSkKLSNkZWZpbmUgU09DQU1fTUlQSV8xTEFORQkJKDEgPDwgMTYpCi0jZGVmaW5lIFNPQ0FNX01JUElfMkxBTkUJCSgxIDw8IDE3KQotI2RlZmluZSBTT0NBTV9NSVBJXzNMQU5FCQkoMSA8PCAxOCkKLSNkZWZpbmUgU09DQU1fTUlQSV80TEFORQkJKDEgPDwgMTkpCi0jZGVmaW5lIFNPQ0FNX01JUEkJKFNPQ0FNX01JUElfMUxBTkUgfCBTT0NBTV9NSVBJXzJMQU5FIHwgXAotCQkJU09DQU1fTUlQSV8zTEFORSB8IFNPQ0FNX01JUElfNExBTkUpCisjZGVmaW5lIFNPQ0FNX0RBVEFXSURUSCh4KQlCSVQoKHgpIC0gMSkKKyNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzQJU09DQU1fREFUQVdJRFRIKDQpCisjZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF84CVNPQ0FNX0RBVEFXSURUSCg4KQorI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfOQlTT0NBTV9EQVRBV0lEVEgoOSkKKyNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzEwCVNPQ0FNX0RBVEFXSURUSCgxMCkKKyNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzE1CVNPQ0FNX0RBVEFXSURUSCgxNSkKKyNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzE2CVNPQ0FNX0RBVEFXSURUSCgxNikKIAogI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfTUFTSyAoU09DQU1fREFUQVdJRFRIXzQgfCBTT0NBTV9EQVRBV0lEVEhfOCB8IFwKIAkJCSAgICAgIFNPQ0FNX0RBVEFXSURUSF85IHwgU09DQU1fREFUQVdJRFRIXzEwIHwgXAogCQkJICAgICAgU09DQU1fREFUQVdJRFRIXzE1IHwgU09DQU1fREFUQVdJRFRIXzE2KQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZSgKLQkJCXVuc2lnbmVkIGxvbmcgY2FtZXJhX2ZsYWdzLCB1bnNpZ25lZCBsb25nIGJ1c19mbGFncykKLXsKLQl1bnNpZ25lZCBsb25nIGNvbW1vbl9mbGFncywgaHN5bmMsIHZzeW5jLCBwY2xrLCBkYXRhLCBidXN3aWR0aCwgbW9kZTsKLQl1bnNpZ25lZCBsb25nIG1pcGk7Ci0KLQljb21tb25fZmxhZ3MgPSBjYW1lcmFfZmxhZ3MgJiBidXNfZmxhZ3M7Ci0KLQloc3luYyA9IGNvbW1vbl9mbGFncyAmIChTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cpOwotCXZzeW5jID0gY29tbW9uX2ZsYWdzICYgKFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0xPVyk7Ci0JcGNsayA9IGNvbW1vbl9mbGFncyAmIChTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HKTsKLQlkYXRhID0gY29tbW9uX2ZsYWdzICYgKFNPQ0FNX0RBVEFfQUNUSVZFX0hJR0ggfCBTT0NBTV9EQVRBX0FDVElWRV9MT1cpOwotCW1vZGUgPSBjb21tb25fZmxhZ3MgJiAoU09DQU1fTUFTVEVSIHwgU09DQU1fU0xBVkUpOwotCWJ1c3dpZHRoID0gY29tbW9uX2ZsYWdzICYgU09DQU1fREFUQVdJRFRIX01BU0s7Ci0JbWlwaSA9IGNvbW1vbl9mbGFncyAmIFNPQ0FNX01JUEk7Ci0KLQlyZXR1cm4gKCghaHN5bmMgfHwgIXZzeW5jIHx8ICFwY2xrIHx8ICFkYXRhIHx8ICFtb2RlIHx8ICFidXN3aWR0aCkgJiYgIW1pcGkpID8gMCA6Ci0JCWNvbW1vbl9mbGFnczsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHNvY19jYW1lcmFfbGltaXRfc2lkZShpbnQgKnN0YXJ0LCBpbnQgKmxlbmd0aCwKIAkJdW5zaWduZWQgaW50IHN0YXJ0X21pbiwKIAkJdW5zaWduZWQgaW50IGxlbmd0aF9taW4sIHVuc2lnbmVkIGludCBsZW5ndGhfbWF4KQpAQCAtMzAwLDIzICsyNDQsMzcgQEAKIAkJKnN0YXJ0ID0gc3RhcnRfbWluICsgbGVuZ3RoX21heCAtICpsZW5ndGg7CiB9CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordW5zaWduZWQgbG9uZyBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3Vuc2lnbmVkIGxvbmcgc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpOwogCiAvKiBUaGlzIGlzIG9ubHkgdGVtcG9yYXJ5IGhlcmUgLSB1bnRpbCB2NGwyLXN1YmRldiBiZWdpbnMgdG8gbGluayB0byB2aWRlb19kZXZpY2UgKi8KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZpZGVvX2RldmljZSAqc29jX2NhbWVyYV9pMmNfdG9fdmRldihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgdmlkZW9fZGV2aWNlICpzb2NfY2FtZXJhX2kyY190b192ZGV2KGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXJldHVybiBpY2QtPnZkZXY7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKXNkLT5ncnBfaWQ7CisJcmV0dXJuIGljZCA/IGljZC0+dmRldiA6IE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICpzb2NfY2FtZXJhX2Zyb21fdmIycShzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY19jYW1lcmFfbGluayAqc29jX2NhbWVyYV9pMmNfdG9fbGluayhjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2NGwyX3N1YmRldiAqc29jX2NhbWVyYV92ZGV2X3RvX3N1YmRldihjb25zdCBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZGV2X2dldF9kcnZkYXRhKHZkZXYtPnBhcmVudCk7CisJcmV0dXJuIHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICpzb2NfY2FtZXJhX2Zyb21fdmIycShjb25zdCBzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKHZxLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIHZiMl92aWRxKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKnNvY19jYW1lcmFfZnJvbV92YnEoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICpzb2NfY2FtZXJhX2Zyb21fdmJxKGNvbnN0IHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZih2cSwgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLCB2Yl92aWRxKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYV9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhX3BsYXRmb3JtLmgKaW5kZXggNzRmMGZhMS4uOGFhNDIwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhX3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhX3BsYXRmb3JtLmgKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLW1lZGlhYnVzLmg+CiAKIHN0cnVjdCBkZXZpY2U7CiAKQEAgLTIwLDcgKzIxLDggQEAKIAljb25zdCBjaGFyICpmb3JtYXRfbmFtZTsKIAl1bnNpZ25lZCBsb25nIGZvcm1hdF9kZXB0aDsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdDsKLQl1bnNpZ25lZCBsb25nIGJ1c19wYXJhbTsKKwl1bnNpZ25lZCBsb25nIG1idXNfcGFyYW07CisJZW51bSB2NGwyX21idXNfdHlwZSBtYnVzX3R5cGU7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2Q7CiAJaW50ICgqc2V0X2NhcHR1cmUpKHN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKmluZm8sIGludCBlbmFibGUpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc29jX21lZGlhYnVzLmggYi9pbmNsdWRlL21lZGlhL3NvY19tZWRpYWJ1cy5oCmluZGV4IGZhZTQzMjUuLjczZjFlN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc29jX21lZGlhYnVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zb2NfbWVkaWFidXMuaApAQCAtODIsNSArODIsNyBAQAogczMyIHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKHUzMiB3aWR0aCwgY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICptZik7CiBpbnQgc29jX21idXNfc2FtcGxlc19wZXJfcGl4ZWwoY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICptZiwKIAkJCXVuc2lnbmVkIGludCAqbnVtZXJhdG9yLCB1bnNpZ25lZCBpbnQgKmRlbm9taW5hdG9yKTsKK3Vuc2lnbmVkIGludCBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnLAorCQkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oCmluZGV4IDYzZmQ5ZDMuLjgxMGEyMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaApAQCAtMjEyLDkgKzIxMiw2IEBACiAJLyogbW9kdWxlIHNuOWMyMHg6IGp1c3QgaWRlbnQgMTAwMDAgKi8KIAlWNEwyX0lERU5UX1NOOUMyMFggPSAxMDAwMCwKIAotCS8qIFNpbGljb25maWxlIHNlbnNvcnM6IHJlc2VydmVkIHJhbmdlIDEwMTAwIC0gMTAxOTkgKi8KLQlWNEwyX0lERU5UX05PT04wMTBQQzMwCT0gMTAxMDAsCi0KIAkvKiBtb2R1bGUgY3gyMzF4eCBhbmQgY3gyNTg0MCAqLwogCVY0TDJfSURFTlRfQ1gyMzEwWF9BViA9IDIzMDk5LCAvKiBJbnRlZ3JhdGVkIEEvViBkZWNvZGVyOyBub3QgaW4gJzEwMCAqLwogCVY0TDJfSURFTlRfQ1gyMzEwMCAgICA9IDIzMTAwLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWN0cmxzLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItY3RybHMuaAppbmRleCAxM2ZlNGQ3Li5lZWIzZGY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItY3RybHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItY3RybHMuaApAQCAtNjUsMTQgKzY1LDEyIEBACiAgICogQGlzX3ByaXZhdGU6IElmIHNldCwgdGhlbiB0aGlzIGNvbnRyb2wgaXMgcHJpdmF0ZSB0byBpdHMgaGFuZGxlciBhbmQgaXQKICAgKgkJd2lsbCBub3QgYmUgYWRkZWQgdG8gYW55IG90aGVyIGhhbmRsZXJzLiBEcml2ZXJzIGNhbiBzZXQKICAgKgkJdGhpcyBmbGFnLgotICAqIEBpc192b2xhdGlsZTogSWYgc2V0LCB0aGVuIHRoaXMgY29udHJvbCBpcyB2b2xhdGlsZS4gVGhpcyBtZWFucyB0aGF0IHRoZQotICAqCQljb250cm9sJ3MgY3VycmVudCB2YWx1ZSBjYW5ub3QgYmUgY2FjaGVkIGFuZCBuZWVkcyB0byBiZQotICAqCQlyZXRyaWV2ZWQgdGhyb3VnaCB0aGUgZ192b2xhdGlsZV9jdHJsIG9wLiBEcml2ZXJzIGNhbiBzZXQKLSAgKgkJdGhpcyBmbGFnLgogICAqIEBpc19hdXRvOiAgIElmIHNldCwgdGhlbiB0aGlzIGNvbnRyb2wgc2VsZWN0cyB3aGV0aGVyIHRoZSBvdGhlciBjbHVzdGVyCiAgICoJCW1lbWJlcnMgYXJlIGluICdhdXRvbWF0aWMnIG1vZGUgb3IgJ21hbnVhbCcgbW9kZS4gVGhpcyBpcwogICAqCQl1c2VkIGZvciBhdXRvZ2Fpbi9nYWluIHR5cGUgY2x1c3RlcnMuIERyaXZlcnMgc2hvdWxkIG5ldmVyCiAgICoJCXNldCB0aGlzIGZsYWcgZGlyZWN0bHkuCisgICogQGhhc192b2xhdGlsZXM6IElmIHNldCwgdGhlbiBvbmUgb3IgbW9yZSBtZW1iZXJzIG9mIHRoZSBjbHVzdGVyIGFyZSB2b2xhdGlsZS4KKyAgKgkJRHJpdmVycyBzaG91bGQgbmV2ZXIgdG91Y2ggdGhpcyBmbGFnLgogICAqIEBtYW51YWxfbW9kZV92YWx1ZTogSWYgdGhlIGlzX2F1dG8gZmxhZyBpcyBzZXQsIHRoZW4gdGhpcyBpcyB0aGUgdmFsdWUKICAgKgkJb2YgdGhlIGF1dG8gY29udHJvbCB0aGF0IGRldGVybWluZXMgaWYgdGhhdCBjb250cm9sIGlzIGluCiAgICoJCW1hbnVhbCBtb2RlLiBTbyBpZiB0aGUgdmFsdWUgb2YgdGhlIGF1dG8gY29udHJvbCBlcXVhbHMgdGhpcwpAQCAtMTE4LDggKzExNiw4IEBACiAKIAl1bnNpZ25lZCBpbnQgaXNfbmV3OjE7CiAJdW5zaWduZWQgaW50IGlzX3ByaXZhdGU6MTsKLQl1bnNpZ25lZCBpbnQgaXNfdm9sYXRpbGU6MTsKIAl1bnNpZ25lZCBpbnQgaXNfYXV0bzoxOworCXVuc2lnbmVkIGludCBoYXNfdm9sYXRpbGVzOjE7CiAJdW5zaWduZWQgaW50IG1hbnVhbF9tb2RlX3ZhbHVlOjg7CiAKIAljb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyAqb3BzOwpAQCAtMjA4LDkgKzIwNiw2IEBACiAgICoJCW11c3QgYmUgTlVMTC4KICAgKiBAaXNfcHJpdmF0ZTogSWYgc2V0LCB0aGVuIHRoaXMgY29udHJvbCBpcyBwcml2YXRlIHRvIGl0cyBoYW5kbGVyIGFuZCBpdAogICAqCQl3aWxsIG5vdCBiZSBhZGRlZCB0byBhbnkgb3RoZXIgaGFuZGxlcnMuCi0gICogQGlzX3ZvbGF0aWxlOiBJZiBzZXQsIHRoZW4gdGhpcyBjb250cm9sIGlzIHZvbGF0aWxlLiBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICoJCWNvbnRyb2wncyBjdXJyZW50IHZhbHVlIGNhbm5vdCBiZSBjYWNoZWQgYW5kIG5lZWRzIHRvIGJlCi0gICoJCXJldHJpZXZlZCB0aHJvdWdoIHRoZSBnX3ZvbGF0aWxlX2N0cmwgb3AuCiAgICovCiBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyB7CiAJY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgKm9wczsKQEAgLTIyNSw3ICsyMjAsNiBAQAogCXUzMiBtZW51X3NraXBfbWFzazsKIAljb25zdCBjaGFyICogY29uc3QgKnFtZW51OwogCXVuc2lnbmVkIGludCBpc19wcml2YXRlOjE7Ci0JdW5zaWduZWQgaW50IGlzX3ZvbGF0aWxlOjE7CiB9OwogCiAvKiogdjRsMl9jdHJsX2ZpbGwoKSAtIEZpbGwgaW4gdGhlIGNvbnRyb2wgZmllbGRzIGJhc2VkIG9uIHRoZSBjb250cm9sIElELgpAQCAtMzg5LDggKzM4Myw3IEBACiAgICogQG1hbnVhbF92YWw6IFRoZSB2YWx1ZSBmb3IgdGhlIGZpcnN0IGNvbnRyb2wgaW4gdGhlIGNsdXN0ZXIgdGhhdCBlcXVhbHMgdGhlCiAgICoJCW1hbnVhbCBzZXR0aW5nLgogICAqIEBzZXRfdm9sYXRpbGU6IElmIHRydWUsIHRoZW4gYWxsIGNvbnRyb2xzIGV4Y2VwdCB0aGUgZmlyc3QgYXV0byBjb250cm9sIHdpbGwKLSAgKgkJaGF2ZSBpc192b2xhdGlsZSBzZXQgdG8gdHJ1ZS4gSWYgZmFsc2UsIHRoZW4gaXNfdm9sYXRpbGUgd2lsbCBub3QKLSAgKgkJYmUgdG91Y2hlZC4KKyAgKgkJYmUgdm9sYXRpbGUuCiAgICoKICAgKiBVc2UgZm9yIGNvbnRyb2wgZ3JvdXBzIHdoZXJlIG9uZSBjb250cm9sIHNlbGVjdHMgc29tZSBhdXRvbWF0aWMgZmVhdHVyZSBhbmQKICAgKiB0aGUgb3RoZXIgY29udHJvbHMgYXJlIG9ubHkgYWN0aXZlIHdoZW5ldmVyIHRoZSBhdXRvbWF0aWMgZmVhdHVyZSBpcyB0dXJuZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1pbnQtZGV2aWNlLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItaW50LWRldmljZS5oCmluZGV4IGZiZjU4NTUuLmU2YWEyMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1pbnQtZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWludC1kZXZpY2UuaApAQCAtMjUsNyArMjUsNiBAQAogI2lmbmRlZiBWNEwyX0lOVF9ERVZJQ0VfSAogI2RlZmluZSBWNEwyX0lOVF9ERVZJQ0VfSAogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2RlZmluZSBWNEwyTkFNRVNJWkUgMzIKQEAgLTQxLDYgKzQwLDggQEAKIAl2NGwyX2ludF90eXBlX3NsYXZlCiB9OwogCitzdHJ1Y3QgbW9kdWxlOworCiBzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlOwogCiBzdHJ1Y3QgdjRsMl9pbnRfbWFzdGVyIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1pb2N0bC5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWlvY3RsLmgKaW5kZXggZGQ5ZjFlNy4uNGQxYzc0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWlvY3RsLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWlvY3RsLmgKQEAgLTEyMiw2ICsxMjIsOCBAQAogCWludCAoKnZpZGlvY19xYnVmKSAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpOwogCWludCAoKnZpZGlvY19kcWJ1ZikgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpOwogCisJaW50ICgqdmlkaW9jX2NyZWF0ZV9idWZzKShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzICpiKTsKKwlpbnQgKCp2aWRpb2NfcHJlcGFyZV9idWYpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKIAogCWludCAoKnZpZGlvY19vdmVybGF5KSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgaSk7CiAJaW50ICgqdmlkaW9jX2dfZmJ1ZikgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLW1lZGlhYnVzLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItbWVkaWFidXMuaAppbmRleCA2MTE0MDA3Li44M2FlMDdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItbWVkaWFidXMuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItbWVkaWFidXMuaApAQCAtMjIsOCArMjIsMTIgQEAKICAqLwogI2RlZmluZSBWNEwyX01CVVNfTUFTVEVSCQkJKDEgPDwgMCkKICNkZWZpbmUgVjRMMl9NQlVTX1NMQVZFCQkJCSgxIDw8IDEpCi0vKiBXaGljaCBzaWduYWwgcG9sYXJpdGllcyBpdCBzdXBwb3J0cyAqLwotLyogTm90ZTogaW4gQlQuNjU2IG1vZGUgSFNZTkMgYW5kIFZTWU5DIGFyZSB1bnVzZWQgKi8KKy8qCisgKiBTaWduYWwgcG9sYXJpdHkgZmxhZ3MKKyAqIE5vdGU6IGluIEJULjY1NiBtb2RlIEhTWU5DLCBGSUVMRCwgYW5kIFZTWU5DIGFyZSB1bnVzZWQKKyAqIFY0TDJfTUJVU19bSFZdU1lOQyogZmxhZ3Mgc2hvdWxkIGJlIGFsc28gdXNlZCBmb3Igc3BlY2lmeWluZworICogY29uZmlndXJhdGlvbiBvZiBoYXJkd2FyZSB0aGF0IHVzZXMgW0hWXVJFRiBzaWduYWxzCisgKi8KICNkZWZpbmUgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdICQkoMSA8PCAyKQogI2RlZmluZSBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVwkJKDEgPDwgMykKICNkZWZpbmUgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdICQkoMSA8PCA0KQpAQCAtMzIsNiArMzYsMTAgQEAKICNkZWZpbmUgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcJCSgxIDw8IDcpCiAjZGVmaW5lIFY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdICQkoMSA8PCA4KQogI2RlZmluZSBWNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XCQkoMSA8PCA5KQorLyogRklFTEQgPSAwLzEgLSBGaWVsZDEgKG9kZCkvRmllbGQyIChldmVuKSAqLworI2RlZmluZSBWNEwyX01CVVNfRklFTERfRVZFTl9ISUdICQkoMSA8PCAxMCkKKy8qIEZJRUxEID0gMS8wIC0gRmllbGQxIChvZGQpL0ZpZWxkMiAoZXZlbikgKi8KKyNkZWZpbmUgVjRMMl9NQlVTX0ZJRUxEX0VWRU5fTE9XCQkoMSA8PCAxMSkKIAogLyogU2VyaWFsIGZsYWdzICovCiAvKiBIb3cgbWFueSBsYW5lcyB0aGUgY2xpZW50IGNhbiB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaAppbmRleCAyNTdkYTFhLi5mMGYzMzU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oCkBAIC0xNTgsNiArMTU4LDcgQEAKIAlpbnQgKCpzX2V4dF9jdHJscykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjdHJscyk7CiAJaW50ICgqdHJ5X2V4dF9jdHJscykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjdHJscyk7CiAJaW50ICgqcXVlcnltZW51KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKnFtKTsKKwlpbnQgKCpnX3N0ZCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKm5vcm0pOwogCWludCAoKnNfc3RkKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBub3JtKTsKIAlsb25nICgqaW9jdGwpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwpAQCAtNTM0LDEzICs1MzUsMTMgQEAKIAl2b2lkICpkZXZfcHJpdjsKIAl2b2lkICpob3N0X3ByaXY7CiAJLyogc3ViZGV2IGRldmljZSBub2RlICovCi0Jc3RydWN0IHZpZGVvX2RldmljZSBkZXZub2RlOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldm5vZGU7CiB9OwogCiAjZGVmaW5lIG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihlbnQpIFwKIAljb250YWluZXJfb2YoZW50LCBzdHJ1Y3QgdjRsMl9zdWJkZXYsIGVudGl0eSkKICNkZWZpbmUgdmRldl90b192NGwyX3N1YmRldih2ZGV2KSBcCi0JY29udGFpbmVyX29mKHZkZXYsIHN0cnVjdCB2NGwyX3N1YmRldiwgZGV2bm9kZSkKKwl2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KQogCiAvKgogICogVXNlZCBmb3Igc3RvcmluZyBzdWJkZXYgaW5mb3JtYXRpb24gcGVyIGZpbGUgaGFuZGxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi1jb3JlLmggYi9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi1jb3JlLmgKaW5kZXggZjg3NDcyYS4uYTE1ZDFmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItY29yZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYyLWNvcmUuaApAQCAtNzUsNyArNzUsNiBAQAogCiBzdHJ1Y3QgdmIyX3BsYW5lIHsKIAl2b2lkCQkJKm1lbV9wcml2OwotCWludAkJCW1hcHBlZDoxOwogfTsKIAogLyoqCkBAIC0xMDYsNiArMTA1LDcgQEAKIC8qKgogICogZW51bSB2YjJfYnVmZmVyX3N0YXRlIC0gY3VycmVudCB2aWRlbyBidWZmZXIgc3RhdGUKICAqIEBWQjJfQlVGX1NUQVRFX0RFUVVFVUVEOglidWZmZXIgdW5kZXIgdXNlcnNwYWNlIGNvbnRyb2wKKyAqIEBWQjJfQlVGX1NUQVRFX1BSRVBBUkVEOglidWZmZXIgcHJlcGFyZWQgaW4gdmlkZW9idWYgYW5kIGJ5IHRoZSBkcml2ZXIKICAqIEBWQjJfQlVGX1NUQVRFX1FVRVVFRDoJYnVmZmVyIHF1ZXVlZCBpbiB2aWRlb2J1ZiwgYnV0IG5vdCBpbiBkcml2ZXIKICAqIEBWQjJfQlVGX1NUQVRFX0FDVElWRToJYnVmZmVyIHF1ZXVlZCBpbiBkcml2ZXIgYW5kIHBvc3NpYmx5IHVzZWQKICAqCQkJCWluIGEgaGFyZHdhcmUgb3BlcmF0aW9uCkBAIC0xMTcsNiArMTE3LDcgQEAKICAqLwogZW51bSB2YjJfYnVmZmVyX3N0YXRlIHsKIAlWQjJfQlVGX1NUQVRFX0RFUVVFVUVELAorCVZCMl9CVUZfU1RBVEVfUFJFUEFSRUQsCiAJVkIyX0JVRl9TVEFURV9RVUVVRUQsCiAJVkIyX0JVRl9TVEFURV9BQ1RJVkUsCiAJVkIyX0JVRl9TVEFURV9ET05FLApAQCAtMTQ3LDcgKzE0OCw2IEBACiAgKiBAZG9uZV9lbnRyeToJCWVudHJ5IG9uIHRoZSBsaXN0IHRoYXQgc3RvcmVzIGFsbCBidWZmZXJzIHJlYWR5IHRvCiAgKgkJCWJlIGRlcXVldWVkIHRvIHVzZXJzcGFjZQogICogQHBsYW5lczoJCXByaXZhdGUgcGVyLXBsYW5lIGluZm9ybWF0aW9uOyBkbyBub3QgY2hhbmdlCi0gKiBAbnVtX3BsYW5lc19tYXBwZWQ6CW51bWJlciBvZiBtYXBwZWQgcGxhbmVzOyBkbyBub3QgY2hhbmdlCiAgKi8KIHN0cnVjdCB2YjJfYnVmZmVyIHsKIAlzdHJ1Y3QgdjRsMl9idWZmZXIJdjRsMl9idWY7CkBAIC0xNjQsMTkgKzE2NCwyNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQJZG9uZV9lbnRyeTsKIAogCXN0cnVjdCB2YjJfcGxhbmUJcGxhbmVzW1ZJREVPX01BWF9QTEFORVNdOwotCXVuc2lnbmVkIGludAkJbnVtX3BsYW5lc19tYXBwZWQ7CiB9OwogCiAvKioKICAqIHN0cnVjdCB2YjJfb3BzIC0gZHJpdmVyLXNwZWNpZmljIGNhbGxiYWNrcwogICoKLSAqIEBxdWV1ZV9zZXR1cDoJY2FsbGVkIGZyb20gYSBWSURJT0NfUkVRQlVGUyBoYW5kbGVyLCBiZWZvcmUKLSAqCQkJbWVtb3J5IGFsbG9jYXRpb247IGRyaXZlciBzaG91bGQgcmV0dXJuIHRoZSByZXF1aXJlZAotICoJCQludW1iZXIgb2YgYnVmZmVycyBpbiBudW1fYnVmZmVycywgdGhlIHJlcXVpcmVkIG51bWJlcgotICoJCQlvZiBwbGFuZXMgcGVyIGJ1ZmZlciBpbiBudW1fcGxhbmVzOyB0aGUgc2l6ZSBvZiBlYWNoCi0gKgkJCXBsYW5lIHNob3VsZCBiZSBzZXQgaW4gdGhlIHNpemVzW10gYXJyYXkgYW5kIG9wdGlvbmFsCi0gKgkJCXBlci1wbGFuZSBhbGxvY2F0b3Igc3BlY2lmaWMgY29udGV4dCBpbiBhbGxvY19jdHhzW10KLSAqCQkJYXJyYXkKKyAqIEBxdWV1ZV9zZXR1cDoJY2FsbGVkIGZyb20gVklESU9DX1JFUUJVRlMgYW5kIFZJRElPQ19DUkVBVEVfQlVGUworICoJCQloYW5kbGVycyBiZWZvcmUgbWVtb3J5IGFsbG9jYXRpb24sIG9yLCBpZgorICoJCQkqbnVtX3BsYW5lcyAhPSAwLCBhZnRlciB0aGUgYWxsb2NhdGlvbiB0byB2ZXJpZnkgYQorICoJCQlzbWFsbGVyIG51bWJlciBvZiBidWZmZXJzLiBEcml2ZXIgc2hvdWxkIHJldHVybgorICoJCQl0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gKm51bV9idWZmZXJzLCB0aGUKKyAqCQkJcmVxdWlyZWQgbnVtYmVyIG9mIHBsYW5lcyBwZXIgYnVmZmVyIGluICpudW1fcGxhbmVzOyB0aGUKKyAqCQkJc2l6ZSBvZiBlYWNoIHBsYW5lIHNob3VsZCBiZSBzZXQgaW4gdGhlIHNpemVzW10gYXJyYXkKKyAqCQkJYW5kIG9wdGlvbmFsIHBlci1wbGFuZSBhbGxvY2F0b3Igc3BlY2lmaWMgY29udGV4dCBpbiB0aGUKKyAqCQkJYWxsb2NfY3R4c1tdIGFycmF5LiBXaGVuIGNhbGxlZCBmcm9tIFZJRElPQ19SRVFCVUZTLAorICoJCQlmbXQgPT0gTlVMTCwgdGhlIGRyaXZlciBoYXMgdG8gdXNlIHRoZSBjdXJyZW50bHkKKyAqCQkJY29uZmlndXJlZCBmb3JtYXQgYW5kICpudW1fYnVmZmVycyBpcyB0aGUgdG90YWwgbnVtYmVyCisgKgkJCW9mIGJ1ZmZlcnMsIHRoYXQgYXJlIGJlaW5nIGFsbG9jYXRlZC4gV2hlbiBjYWxsZWQgZnJvbQorICoJCQlWSURJT0NfQ1JFQVRFX0JVRlMsIGZtdCAhPSBOVUxMIGFuZCBpdCBkZXNjcmliZXMgdGhlCisgKgkJCXRhcmdldCBmcmFtZSBmb3JtYXQuIEluIHRoaXMgY2FzZSAqbnVtX2J1ZmZlcnMgYXJlIGJlaW5nCisgKgkJCWFsbG9jYXRlZCBhZGRpdGlvbmFsbHkgdG8gcS0+bnVtX2J1ZmZlcnMuCiAgKiBAd2FpdF9wcmVwYXJlOglyZWxlYXNlIGFueSBsb2NrcyB0YWtlbiB3aGlsZSBjYWxsaW5nIHZiMiBmdW5jdGlvbnM7CiAgKgkJCWl0IGlzIGNhbGxlZCBiZWZvcmUgYW4gaW9jdGwgbmVlZHMgdG8gd2FpdCBmb3IgYSBuZXcKICAqCQkJYnVmZmVyIHRvIGFycml2ZTsgcmVxdWlyZWQgdG8gYXZvaWQgYSBkZWFkbG9jayBpbgpAQCAtMTg5LDMwICsxOTYsMzkgQEAKICAqCQkJcGVyZm9ybSBhZGRpdGlvbmFsIGJ1ZmZlci1yZWxhdGVkIGluaXRpYWxpemF0aW9uOwogICoJCQlpbml0aWFsaXphdGlvbiBmYWlsdXJlIChyZXR1cm4gIT0gMCkgd2lsbCBwcmV2ZW50CiAgKgkJCXF1ZXVlIHNldHVwIGZyb20gY29tcGxldGluZyBzdWNjZXNzZnVsbHk7IG9wdGlvbmFsCi0gKiBAYnVmX3ByZXBhcmU6CWNhbGxlZCBldmVyeSB0aW1lIHRoZSBidWZmZXIgaXMgcXVldWVkIGZyb20gdXNlcnNwYWNlOwotICoJCQlkcml2ZXJzIG1heSBwZXJmb3JtIGFueSBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBiZWZvcmUKLSAqCQkJZWFjaCBoYXJkd2FyZSBvcGVyYXRpb24gaW4gdGhpcyBjYWxsYmFjazsKLSAqCQkJaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgcXVldWVkCi0gKgkJCWluIGRyaXZlcjsgb3B0aW9uYWwKKyAqIEBidWZfcHJlcGFyZToJY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGJ1ZmZlciBpcyBxdWV1ZWQgZnJvbSB1c2Vyc3BhY2UKKyAqCQkJYW5kIGZyb20gdGhlIFZJRElPQ19QUkVQQVJFX0JVRiBpb2N0bDsgZHJpdmVycyBtYXkKKyAqCQkJcGVyZm9ybSBhbnkgaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgYmVmb3JlIGVhY2ggaGFyZHdhcmUKKyAqCQkJb3BlcmF0aW9uIGluIHRoaXMgY2FsbGJhY2s7IGlmIGFuIGVycm9yIGlzIHJldHVybmVkLCB0aGUKKyAqCQkJYnVmZmVyIHdpbGwgbm90IGJlIHF1ZXVlZCBpbiBkcml2ZXI7IG9wdGlvbmFsCiAgKiBAYnVmX2ZpbmlzaDoJCWNhbGxlZCBiZWZvcmUgZXZlcnkgZGVxdWV1ZSBvZiB0aGUgYnVmZmVyIGJhY2sgdG8KICAqCQkJdXNlcnNwYWNlOyBkcml2ZXJzIG1heSBwZXJmb3JtIGFueSBvcGVyYXRpb25zIHJlcXVpcmVkCiAgKgkJCWJlZm9yZSB1c2Vyc3BhY2UgYWNjZXNzZXMgdGhlIGJ1ZmZlcjsgb3B0aW9uYWwKICAqIEBidWZfY2xlYW51cDoJY2FsbGVkIG9uY2UgYmVmb3JlIHRoZSBidWZmZXIgaXMgZnJlZWQ7IGRyaXZlcnMgbWF5CiAgKgkJCXBlcmZvcm0gYW55IGFkZGl0aW9uYWwgY2xlYW51cDsgb3B0aW9uYWwKLSAqIEBzdGFydF9zdHJlYW1pbmc6CWNhbGxlZCBvbmNlIGJlZm9yZSBlbnRlcmluZyAnc3RyZWFtaW5nJyBzdGF0ZTsgZW5hYmxlcwotICoJCQlkcml2ZXIgdG8gcmVjZWl2ZSBidWZmZXJzIG92ZXIgYnVmX3F1ZXVlKCkgY2FsbGJhY2sKKyAqIEBzdGFydF9zdHJlYW1pbmc6CWNhbGxlZCBvbmNlIHRvIGVudGVyICdzdHJlYW1pbmcnIHN0YXRlOyB0aGUgZHJpdmVyIG1heQorICoJCQlyZWNlaXZlIGJ1ZmZlcnMgd2l0aCBAYnVmX3F1ZXVlIGNhbGxiYWNrIGJlZm9yZQorICoJCQlAc3RhcnRfc3RyZWFtaW5nIGlzIGNhbGxlZDsgdGhlIGRyaXZlciBnZXRzIHRoZSBudW1iZXIKKyAqCQkJb2YgYWxyZWFkeSBxdWV1ZWQgYnVmZmVycyBpbiBjb3VudCBwYXJhbWV0ZXI7IGRyaXZlcgorICoJCQljYW4gcmV0dXJuIGFuIGVycm9yIGlmIGhhcmR3YXJlIGZhaWxzIG9yIG5vdCBlbm91Z2gKKyAqCQkJYnVmZmVycyBoYXMgYmVlbiBxdWV1ZWQsIGluIHN1Y2ggY2FzZSBhbGwgYnVmZmVycyB0aGF0CisgKgkJCWhhdmUgYmVlbiBhbHJlYWR5IGdpdmVuIGJ5IHRoZSBAYnVmX3F1ZXVlIGNhbGxiYWNrIGFyZQorICoJCQlpbnZhbGlkYXRlZC4KICAqIEBzdG9wX3N0cmVhbWluZzoJY2FsbGVkIHdoZW4gJ3N0cmVhbWluZycgc3RhdGUgbXVzdCBiZSBkaXNhYmxlZDsgZHJpdmVyCiAgKgkJCXNob3VsZCBzdG9wIGFueSBETUEgdHJhbnNhY3Rpb25zIG9yIHdhaXQgdW50aWwgdGhleQogICoJCQlmaW5pc2ggYW5kIGdpdmUgYmFjayBhbGwgYnVmZmVycyBpdCBnb3QgZnJvbSBidWZfcXVldWUoKQogICoJCQljYWxsYmFjazsgbWF5IHVzZSB2YjJfd2FpdF9mb3JfYWxsX2J1ZmZlcnMoKSBmdW5jdGlvbgogICogQGJ1Zl9xdWV1ZToJCXBhc3NlcyBidWZmZXIgdmIgdG8gdGhlIGRyaXZlcjsgZHJpdmVyIG1heSBzdGFydAogICoJCQloYXJkd2FyZSBvcGVyYXRpb24gb24gdGhpcyBidWZmZXI7IGRyaXZlciBzaG91bGQgZ2l2ZQotICoJCQl0aGUgYnVmZmVyIGJhY2sgYnkgY2FsbGluZyB2YjJfYnVmZmVyX2RvbmUoKSBmdW5jdGlvbgorICoJCQl0aGUgYnVmZmVyIGJhY2sgYnkgY2FsbGluZyB2YjJfYnVmZmVyX2RvbmUoKSBmdW5jdGlvbjsKKyAqCQkJaXQgaXMgYWxsd2F5cyBjYWxsZWQgYWZ0ZXIgY2FsbGluZyBTVFJFQU1PTiBpb2N0bDsKKyAqCQkJbWlnaHQgYmUgY2FsbGVkIGJlZm9yZSBzdGFydF9zdHJlYW1pbmcgY2FsbGJhY2sgaWYgdXNlcgorICoJCQlwcmUtcXVldWVkIGJ1ZmZlcnMgYmVmb3JlIGNhbGxpbmcgU1RSRUFNT04KICAqLwogc3RydWN0IHZiMl9vcHMgewotCWludCAoKnF1ZXVlX3NldHVwKShzdHJ1Y3QgdmIyX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgKm51bV9idWZmZXJzLAotCQkJICAgdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCi0JCQkgICB2b2lkICphbGxvY19jdHhzW10pOworCWludCAoKnF1ZXVlX3NldHVwKShzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKKwkJCSAgIHVuc2lnbmVkIGludCAqbnVtX2J1ZmZlcnMsIHVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywKKwkJCSAgIHVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY19jdHhzW10pOwogCiAJdm9pZCAoKndhaXRfcHJlcGFyZSkoc3RydWN0IHZiMl9xdWV1ZSAqcSk7CiAJdm9pZCAoKndhaXRfZmluaXNoKShzdHJ1Y3QgdmIyX3F1ZXVlICpxKTsKQEAgLTIyMiw3ICsyMzgsNyBAQAogCWludCAoKmJ1Zl9maW5pc2gpKHN0cnVjdCB2YjJfYnVmZmVyICp2Yik7CiAJdm9pZCAoKmJ1Zl9jbGVhbnVwKShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpOwogCi0JaW50ICgqc3RhcnRfc3RyZWFtaW5nKShzdHJ1Y3QgdmIyX3F1ZXVlICpxKTsKKwlpbnQgKCpzdGFydF9zdHJlYW1pbmcpKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCBjb3VudCk7CiAJaW50ICgqc3RvcF9zdHJlYW1pbmcpKHN0cnVjdCB2YjJfcXVldWUgKnEpOwogCiAJdm9pZCAoKmJ1Zl9xdWV1ZSkoc3RydWN0IHZiMl9idWZmZXIgKnZiKTsKQEAgLTI3Niw2ICsyOTIsNyBAQAogCXdhaXRfcXVldWVfaGVhZF90CQlkb25lX3dxOwogCiAJdm9pZAkJCQkqYWxsb2NfY3R4W1ZJREVPX01BWF9QTEFORVNdOworCXVuc2lnbmVkIGludAkJCXBsYW5lX3NpemVzW1ZJREVPX01BWF9QTEFORVNdOwogCiAJdW5zaWduZWQgaW50CQkJc3RyZWFtaW5nOjE7CiAKQEAgLTI5MSw2ICszMDgsOSBAQAogaW50IHZiMl9xdWVyeWJ1ZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpOwogaW50IHZiMl9yZXFidWZzKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpOwogCitpbnQgdmIyX2NyZWF0ZV9idWZzKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzICpjcmVhdGUpOworaW50IHZiMl9wcmVwYXJlX2J1ZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpOworCiBpbnQgdmIyX3F1ZXVlX2luaXQoc3RydWN0IHZiMl9xdWV1ZSAqcSk7CiAKIHZvaWQgdmIyX3F1ZXVlX3JlbGVhc2Uoc3RydWN0IHZiMl9xdWV1ZSAqcSk7CkBAIC0zMDIsNiArMzIyLDEzIEBACiBpbnQgdmIyX3N0cmVhbW9mZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSk7CiAKIGludCB2YjJfbW1hcChzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisjaWZuZGVmIENPTkZJR19NTVUKK3Vuc2lnbmVkIGxvbmcgdmIyX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCB2YjJfcXVldWUgKnEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworI2VuZGlmCiB1bnNpZ25lZCBpbnQgdmIyX3BvbGwoc3RydWN0IHZiMl9xdWV1ZSAqcSwgc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOwogc2l6ZV90IHZiMl9yZWFkKHN0cnVjdCB2YjJfcXVldWUgKnEsIGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsCiAJCWxvZmZfdCAqcHBvcywgaW50IG5vbmJsb2NrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaAppbmRleCA3ZTZjNjhiLi4xOWFlMWUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oCkBAIC0xNywxMSArMTcsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKLXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHN0cnVjdCB2YjJfYnVmZmVyICp2YiwgdW5zaWduZWQgaW50IHBsYW5lX25vKQordmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoc3RydWN0IHZiMl9idWZmZXIgKnZiLCB1bnNpZ25lZCBpbnQgcGxhbmVfbm8pCiB7Ci0JZG1hX2FkZHJfdCAqcGFkZHIgPSB2YjJfcGxhbmVfY29va2llKHZiLCBwbGFuZV9ubyk7CisJZG1hX2FkZHJfdCAqYWRkciA9IHZiMl9wbGFuZV9jb29raWUodmIsIHBsYW5lX25vKTsKIAotCXJldHVybiAqcGFkZHI7CisJcmV0dXJuICphZGRyOwogfQogCiB2b2lkICp2YjJfZG1hX2NvbnRpZ19pbml0X2N0eChzdHJ1Y3QgZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuaCBiL2luY2x1ZGUvbWlzYy9hbHRlcmEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuaApyZW5hbWUgdG8gaW5jbHVkZS9taXNjL2FsdGVyYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL210ZC9tdGQtYWJpLmggYi9pbmNsdWRlL210ZC9tdGQtYWJpLmgKaW5kZXggMmY3ZDQ1Yi4uMWE3ZTFkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tdGQvbXRkLWFiaS5oCisrKyBiL2luY2x1ZGUvbXRkL210ZC1hYmkuaApAQCAtNDUsNiArNDUsNTEgQEAKIAlfX3U2NCB1c3JfcHRyOwogfTsKIAorLyoqCisgKiBNVEQgb3BlcmF0aW9uIG1vZGVzCisgKgorICogQE1URF9PUFNfUExBQ0VfT09COglPT0IgZGF0YSBhcmUgcGxhY2VkIGF0IHRoZSBnaXZlbiBvZmZzZXQgKGRlZmF1bHQpCisgKiBATVREX09QU19BVVRPX09PQjoJT09CIGRhdGEgYXJlIGF1dG9tYXRpY2FsbHkgcGxhY2VkIGF0IHRoZSBmcmVlIGFyZWFzCisgKgkJCXdoaWNoIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcm5hbCBlY2NsYXlvdXQKKyAqIEBNVERfT1BTX1JBVzoJZGF0YSBhcmUgdHJhbnNmZXJyZWQgYXMtaXMsIHdpdGggbm8gZXJyb3IgY29ycmVjdGlvbjsKKyAqCQkJdGhpcyBtb2RlIGltcGxpZXMgJU1URF9PUFNfUExBQ0VfT09CCisgKgorICogVGhlc2UgbW9kZXMgY2FuIGJlIHBhc3NlZCB0byBpb2N0bChNRU1XUklURSkgYW5kIGFyZSBhbHNvIHVzZWQgaW50ZXJuYWxseS4KKyAqIFNlZSBub3RlcyBvbiAiTVREIGZpbGUgbW9kZXMiIGZvciBkaXNjdXNzaW9uIG9uICVNVERfT1BTX1JBVyB2cy4KKyAqICVNVERfRklMRV9NT0RFX1JBVy4KKyAqLworZW51bSB7CisJTVREX09QU19QTEFDRV9PT0IgPSAwLAorCU1URF9PUFNfQVVUT19PT0IgPSAxLAorCU1URF9PUFNfUkFXID0gMiwKK307CisKKy8qKgorICogc3RydWN0IG10ZF93cml0ZV9yZXEgLSBkYXRhIHN0cnVjdHVyZSBmb3IgcmVxdWVzdGluZyBhIHdyaXRlIG9wZXJhdGlvbgorICoKKyAqIEBzdGFydDoJc3RhcnQgYWRkcmVzcworICogQGxlbjoJbGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAb29ibGVuOglsZW5ndGggb2YgT09CIGJ1ZmZlcgorICogQHVzcl9kYXRhOgl1c2VyLXByb3ZpZGVkIGRhdGEgYnVmZmVyCisgKiBAdXNyX29vYjoJdXNlci1wcm92aWRlZCBPT0IgYnVmZmVyCisgKiBAbW9kZToJTVREIG1vZGUgKHNlZSAiTVREIG9wZXJhdGlvbiBtb2RlcyIpCisgKiBAcGFkZGluZzoJcmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIDAKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBzdXBwb3J0cyBpb2N0bChNRU1XUklURSkgb3BlcmF0aW9ucywgYWxsb3dpbmcgZGF0YSBhbmQvb3IgT09CCisgKiB3cml0ZXMgaW4gdmFyaW91cyBtb2Rlcy4gVG8gd3JpdGUgdG8gT09CLW9ubHksIHNldCBAdXNyX2RhdGEgPT0gTlVMTCwgYW5kIHRvCisgKiB3cml0ZSBkYXRhLW9ubHksIHNldCBAdXNyX29vYiA9PSBOVUxMLiBIb3dldmVyLCBzZXR0aW5nIGJvdGggQHVzcl9kYXRhIGFuZAorICogQHVzcl9vb2IgdG8gTlVMTCBpcyBub3QgYWxsb3dlZC4KKyAqLworc3RydWN0IG10ZF93cml0ZV9yZXEgeworCV9fdTY0IHN0YXJ0OworCV9fdTY0IGxlbjsKKwlfX3U2NCBvb2JsZW47CisJX191NjQgdXNyX2RhdGE7CisJX191NjQgdXNyX29vYjsKKwlfX3U4IG1vZGU7CisJX191OCBwYWRkaW5nWzddOworfTsKKwogI2RlZmluZSBNVERfQUJTRU5UCQkwCiAjZGVmaW5lIE1URF9SQU0JCQkxCiAjZGVmaW5lIE1URF9ST00JCQkyCkBAIC01OSwxMyArMTA0LDEzIEBACiAjZGVmaW5lIE1URF9OT19FUkFTRQkJMHgxMDAwCS8qIE5vIGVyYXNlIG5lY2Vzc2FyeSAqLwogI2RlZmluZSBNVERfUE9XRVJVUF9MT0NLCTB4MjAwMAkvKiBBbHdheXMgbG9ja2VkIGFmdGVyIHJlc2V0ICovCiAKLS8vIFNvbWUgY29tbW9uIGRldmljZXMgLyBjb21iaW5hdGlvbnMgb2YgY2FwYWJpbGl0aWVzCisvKiBTb21lIGNvbW1vbiBkZXZpY2VzIC8gY29tYmluYXRpb25zIG9mIGNhcGFiaWxpdGllcyAqLwogI2RlZmluZSBNVERfQ0FQX1JPTQkJMAogI2RlZmluZSBNVERfQ0FQX1JBTQkJKE1URF9XUklURUFCTEUgfCBNVERfQklUX1dSSVRFQUJMRSB8IE1URF9OT19FUkFTRSkKICNkZWZpbmUgTVREX0NBUF9OT1JGTEFTSAkoTVREX1dSSVRFQUJMRSB8IE1URF9CSVRfV1JJVEVBQkxFKQogI2RlZmluZSBNVERfQ0FQX05BTkRGTEFTSAkoTVREX1dSSVRFQUJMRSkKIAotLyogRUNDIGJ5dGUgcGxhY2VtZW50ICovCisvKiBPYnNvbGV0ZSBFQ0MgYnl0ZSBwbGFjZW1lbnQgbW9kZXMgKHVzZWQgd2l0aCBvYnNvbGV0ZSBNRU1HRVRPT0JTRUwpICovCiAjZGVmaW5lIE1URF9OQU5ERUNDX09GRgkJMAkvLyBTd2l0Y2ggb2ZmIEVDQyAoTm90IHJlY29tbWVuZGVkKQogI2RlZmluZSBNVERfTkFOREVDQ19QTEFDRQkxCS8vIFVzZSB0aGUgZ2l2ZW4gcGxhY2VtZW50IGluIHRoZSBzdHJ1Y3R1cmUgKFlBRkZTMSBsZWdhY3kgbW9kZSkKICNkZWZpbmUgTVREX05BTkRFQ0NfQVVUT1BMQUNFCTIJLy8gVXNlIHRoZSBkZWZhdWx0IHBsYWNlbWVudCBzY2hlbWUKQEAgLTgwLDIxICsxMjUsMTggQEAKIHN0cnVjdCBtdGRfaW5mb191c2VyIHsKIAlfX3U4IHR5cGU7CiAJX191MzIgZmxhZ3M7Ci0JX191MzIgc2l6ZTsJIC8vIFRvdGFsIHNpemUgb2YgdGhlIE1URAorCV9fdTMyIHNpemU7CS8qIFRvdGFsIHNpemUgb2YgdGhlIE1URCAqLwogCV9fdTMyIGVyYXNlc2l6ZTsKIAlfX3UzMiB3cml0ZXNpemU7Ci0JX191MzIgb29ic2l6ZTsgICAvLyBBbW91bnQgb2YgT09CIGRhdGEgcGVyIGJsb2NrIChlLmcuIDE2KQotCS8qIFRoZSBiZWxvdyB0d28gZmllbGRzIGFyZSBvYnNvbGV0ZSBhbmQgYnJva2VuLCBkbyBub3QgdXNlIHRoZW0KLQkgKiAoVE9ETzogcmVtb3ZlIGF0IHNvbWUgcG9pbnQpICovCi0JX191MzIgZWNjdHlwZTsKLQlfX3UzMiBlY2NzaXplOworCV9fdTMyIG9vYnNpemU7CS8qIEFtb3VudCBvZiBPT0IgZGF0YSBwZXIgYmxvY2sgKGUuZy4gMTYpICovCisJX191NjQgcGFkZGluZzsJLyogT2xkIG9ic29sZXRlIGZpZWxkOyBkbyBub3QgdXNlICovCiB9OwogCiBzdHJ1Y3QgcmVnaW9uX2luZm9fdXNlciB7CiAJX191MzIgb2Zmc2V0OwkJLyogQXQgd2hpY2ggdGhpcyByZWdpb24gc3RhcnRzLAotCQkJCQkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1URCAqLwotCV9fdTMyIGVyYXNlc2l6ZTsJCS8qIEZvciB0aGlzIHJlZ2lvbiAqLwotCV9fdTMyIG51bWJsb2NrczsJCS8qIE51bWJlciBvZiBibG9ja3MgaW4gdGhpcyByZWdpb24gKi8KKwkJCQkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1URCAqLworCV9fdTMyIGVyYXNlc2l6ZTsJLyogRm9yIHRoaXMgcmVnaW9uICovCisJX191MzIgbnVtYmxvY2tzOwkvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgcmVnaW9uICovCiAJX191MzIgcmVnaW9uaW5kZXg7CiB9OwogCkBAIC0xMDQsMjkgKzE0Niw2MSBAQAogCV9fdTMyIGxvY2tlZDsKIH07CiAKKy8qCisgKiBOb3RlLCB0aGUgZm9sbG93aW5nIGlvY3RsIGV4aXN0ZWQgaW4gdGhlIHBhc3QgYW5kIHdhcyByZW1vdmVkOgorICogI2RlZmluZSBNRU1TRVRPT0JTRUwgICAgICAgICAgIF9JT1coJ00nLCA5LCBzdHJ1Y3QgbmFuZF9vb2JpbmZvKQorICogVHJ5IHRvIGF2b2lkIGFkZGluZyBhIG5ldyBpb2N0bCB3aXRoIHRoZSBzYW1lIGlvY3RsIG51bWJlci4KKyAqLworCisvKiBHZXQgYmFzaWMgTVREIGNoYXJhY3RlcmlzdGljcyBpbmZvIChiZXR0ZXIgdG8gdXNlIHN5c2ZzKSAqLwogI2RlZmluZSBNRU1HRVRJTkZPCQlfSU9SKCdNJywgMSwgc3RydWN0IG10ZF9pbmZvX3VzZXIpCisvKiBFcmFzZSBzZWdtZW50IG9mIE1URCAqLwogI2RlZmluZSBNRU1FUkFTRQkJX0lPVygnTScsIDIsIHN0cnVjdCBlcmFzZV9pbmZvX3VzZXIpCisvKiBXcml0ZSBvdXQtb2YtYmFuZCBkYXRhIGZyb20gTVREICovCiAjZGVmaW5lIE1FTVdSSVRFT09CCQlfSU9XUignTScsIDMsIHN0cnVjdCBtdGRfb29iX2J1ZikKKy8qIFJlYWQgb3V0LW9mLWJhbmQgZGF0YSBmcm9tIE1URCAqLwogI2RlZmluZSBNRU1SRUFET09CCQlfSU9XUignTScsIDQsIHN0cnVjdCBtdGRfb29iX2J1ZikKKy8qIExvY2sgYSBjaGlwIChmb3IgTVREIHRoYXQgc3VwcG9ydHMgaXQpICovCiAjZGVmaW5lIE1FTUxPQ0sJCQlfSU9XKCdNJywgNSwgc3RydWN0IGVyYXNlX2luZm9fdXNlcikKKy8qIFVubG9jayBhIGNoaXAgKGZvciBNVEQgdGhhdCBzdXBwb3J0cyBpdCkgKi8KICNkZWZpbmUgTUVNVU5MT0NLCQlfSU9XKCdNJywgNiwgc3RydWN0IGVyYXNlX2luZm9fdXNlcikKKy8qIEdldCB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlcmFzZSByZWdpb25zICovCiAjZGVmaW5lIE1FTUdFVFJFR0lPTkNPVU5UCV9JT1IoJ00nLCA3LCBpbnQpCisvKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVyYXNlIHJlZ2lvbiBmb3IgYSBzcGVjaWZpYyBpbmRleCAqLwogI2RlZmluZSBNRU1HRVRSRUdJT05JTkZPCV9JT1dSKCdNJywgOCwgc3RydWN0IHJlZ2lvbl9pbmZvX3VzZXIpCi0jZGVmaW5lIE1FTVNFVE9PQlNFTAkJX0lPVygnTScsIDksIHN0cnVjdCBuYW5kX29vYmluZm8pCisvKiBHZXQgaW5mbyBhYm91dCBPT0IgbW9kZXMgKGUuZy4sIFJBVywgUExBQ0UsIEFVVE8pIC0gbGVnYWN5IGludGVyZmFjZSAqLwogI2RlZmluZSBNRU1HRVRPT0JTRUwJCV9JT1IoJ00nLCAxMCwgc3RydWN0IG5hbmRfb29iaW5mbykKKy8qIENoZWNrIGlmIGFuIGVyYXNlYmxvY2sgaXMgYmFkICovCiAjZGVmaW5lIE1FTUdFVEJBREJMT0NLCQlfSU9XKCdNJywgMTEsIF9fa2VybmVsX2xvZmZfdCkKKy8qIE1hcmsgYW4gZXJhc2VibG9jayBhcyBiYWQgKi8KICNkZWZpbmUgTUVNU0VUQkFEQkxPQ0sJCV9JT1coJ00nLCAxMiwgX19rZXJuZWxfbG9mZl90KQorLyogU2V0IE9UUCAoT25lLVRpbWUgUHJvZ3JhbW1hYmxlKSBtb2RlIChmYWN0b3J5IHZzLiB1c2VyKSAqLwogI2RlZmluZSBPVFBTRUxFQ1QJCV9JT1IoJ00nLCAxMywgaW50KQorLyogR2V0IG51bWJlciBvZiBPVFAgKE9uZS1UaW1lIFByb2dyYW1tYWJsZSkgcmVnaW9ucyAqLwogI2RlZmluZSBPVFBHRVRSRUdJT05DT1VOVAlfSU9XKCdNJywgMTQsIGludCkKKy8qIEdldCBhbGwgT1RQIChPbmUtVGltZSBQcm9ncmFtbWFibGUpIGluZm8gYWJvdXQgTVREICovCiAjZGVmaW5lIE9UUEdFVFJFR0lPTklORk8JX0lPVygnTScsIDE1LCBzdHJ1Y3Qgb3RwX2luZm8pCisvKiBMb2NrIGEgZ2l2ZW4gcmFuZ2Ugb2YgdXNlciBkYXRhIChtdXN0IGJlIGluIG1vZGUgJU1URF9GSUxFX01PREVfT1RQX1VTRVIpICovCiAjZGVmaW5lIE9UUExPQ0sJCQlfSU9SKCdNJywgMTYsIHN0cnVjdCBvdHBfaW5mbykKKy8qIEdldCBFQ0MgbGF5b3V0IChkZXByZWNhdGVkKSAqLwogI2RlZmluZSBFQ0NHRVRMQVlPVVQJCV9JT1IoJ00nLCAxNywgc3RydWN0IG5hbmRfZWNjbGF5b3V0X3VzZXIpCisvKiBHZXQgc3RhdGlzdGljcyBhYm91dCBjb3JyZWN0ZWQvdW5jb3JyZWN0ZWQgZXJyb3JzICovCiAjZGVmaW5lIEVDQ0dFVFNUQVRTCQlfSU9SKCdNJywgMTgsIHN0cnVjdCBtdGRfZWNjX3N0YXRzKQorLyogU2V0IE1URCBtb2RlIG9uIGEgcGVyLWZpbGUtZGVzY3JpcHRvciBiYXNpcyAoc2VlICJNVEQgZmlsZSBtb2RlcyIpICovCiAjZGVmaW5lIE1UREZJTEVNT0RFCQlfSU8oJ00nLCAxOSkKKy8qIEVyYXNlIHNlZ21lbnQgb2YgTVREIChzdXBwb3J0cyA2NC1iaXQgYWRkcmVzcykgKi8KICNkZWZpbmUgTUVNRVJBU0U2NAkJX0lPVygnTScsIDIwLCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyNjQpCisvKiBXcml0ZSBkYXRhIHRvIE9PQiAoNjQtYml0IHZlcnNpb24pICovCiAjZGVmaW5lIE1FTVdSSVRFT09CNjQJCV9JT1dSKCdNJywgMjEsIHN0cnVjdCBtdGRfb29iX2J1ZjY0KQorLyogUmVhZCBkYXRhIGZyb20gT09CICg2NC1iaXQgdmVyc2lvbikgKi8KICNkZWZpbmUgTUVNUkVBRE9PQjY0CQlfSU9XUignTScsIDIyLCBzdHJ1Y3QgbXRkX29vYl9idWY2NCkKKy8qIENoZWNrIGlmIGNoaXAgaXMgbG9ja2VkIChmb3IgTVREIHRoYXQgc3VwcG9ydHMgaXQpICovCiAjZGVmaW5lIE1FTUlTTE9DS0VECQlfSU9SKCdNJywgMjMsIHN0cnVjdCBlcmFzZV9pbmZvX3VzZXIpCisvKgorICogTW9zdCBnZW5lcmljIHdyaXRlIGludGVyZmFjZTsgY2FuIHdyaXRlIGluLWJhbmQgYW5kL29yIG91dC1vZi1iYW5kIGluIHZhcmlvdXMKKyAqIG1vZGVzIChzZWUgInN0cnVjdCBtdGRfd3JpdGVfcmVxIikKKyAqLworI2RlZmluZSBNRU1XUklURQkJX0lPV1IoJ00nLCAyNCwgc3RydWN0IG10ZF93cml0ZV9yZXEpCiAKIC8qCiAgKiBPYnNvbGV0ZSBsZWdhY3kgaW50ZXJmYWNlLiBLZWVwIGl0IGluIG9yZGVyIG5vdCB0byBicmVhayB1c2Vyc3BhY2UKQEAgLTE3NywxMyArMjUxLDI3IEBACiB9OwogCiAvKgotICogUmVhZC93cml0ZSBmaWxlIG1vZGVzIGZvciBhY2Nlc3MgdG8gTVRECisgKiBNVEQgZmlsZSBtb2RlcyAtIGZvciByZWFkL3dyaXRlIGFjY2VzcyB0byBNVEQKKyAqCisgKiBATVREX0ZJTEVfTU9ERV9OT1JNQUw6CU9UUCBkaXNhYmxlZCwgRUNDIGVuYWJsZWQKKyAqIEBNVERfRklMRV9NT0RFX09UUF9GQUNUT1JZOglPVFAgZW5hYmxlZCBpbiBmYWN0b3J5IG1vZGUKKyAqIEBNVERfRklMRV9NT0RFX09UUF9VU0VSOglPVFAgZW5hYmxlZCBpbiB1c2VyIG1vZGUKKyAqIEBNVERfRklMRV9NT0RFX1JBVzoJCU9UUCBkaXNhYmxlZCwgRUNDIGRpc2FibGVkCisgKgorICogVGhlc2UgbW9kZXMgY2FuIGJlIHNldCB2aWEgaW9jdGwoTVRERklMRU1PREUpLiBUaGUgbW9kZSBtb2RlIHdpbGwgYmUgcmV0YWluZWQKKyAqIHNlcGFyYXRlbHkgZm9yIGVhY2ggb3BlbiBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogTm90ZTogJU1URF9GSUxFX01PREVfUkFXIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgJU1URF9PUFNfUkFXIC0KKyAqIHJhdyBhY2Nlc3MgdG8gdGhlIGZsYXNoLCB3aXRob3V0IGVycm9yIGNvcnJlY3Rpb24gb3IgYXV0b3BsYWNlbWVudCBzY2hlbWVzLgorICogV2hlcmV2ZXIgcG9zc2libGUsIHRoZSBNVERfT1BTXyogbW9kZSB3aWxsIG92ZXJyaWRlIHRoZSBNVERfRklMRV9NT0RFXyogbW9kZQorICogKGUuZy4sIHdoZW4gdXNpbmcgaW9jdGwoTUVNV1JJVEUpKSwgYnV0IGluIHNvbWUgY2FzZXMsIHRoZSBNVERfRklMRV9NT0RFIGlzCisgKiB1c2VkIG91dCBvZiBuZWNlc3NpdHkgKGUuZy4sIGB3cml0ZSgpJywgaW9jdGwoTUVNV1JJVEVPT0I2NCkpLgogICovCiBlbnVtIG10ZF9maWxlX21vZGVzIHsKLQlNVERfTU9ERV9OT1JNQUwgPSBNVERfT1RQX09GRiwKLQlNVERfTU9ERV9PVFBfRkFDVE9SWSA9IE1URF9PVFBfRkFDVE9SWSwKLQlNVERfTU9ERV9PVFBfVVNFUiA9IE1URF9PVFBfVVNFUiwKLQlNVERfTU9ERV9SQVcsCisJTVREX0ZJTEVfTU9ERV9OT1JNQUwgPSBNVERfT1RQX09GRiwKKwlNVERfRklMRV9NT0RFX09UUF9GQUNUT1JZID0gTVREX09UUF9GQUNUT1JZLAorCU1URF9GSUxFX01PREVfT1RQX1VTRVIgPSBNVERfT1RQX1VTRVIsCisJTVREX0ZJTEVfTU9ERV9SQVcsCiB9OwogCiAjZW5kaWYgLyogX19NVERfQUJJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCmluZGV4IGU3Mjc1NTUuLjgzNWYzYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKQEAgLTc3LDcgKzc3LDM0IEBACiAjZGVmaW5lIEJUX1BPV0VSX0ZPUkNFX0FDVElWRV9PRkYgMAogI2RlZmluZSBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT04gIDEKIAotX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKKyNkZWZpbmUgQlRfQ0hBTk5FTF9QT0xJQ1kJMTAKKworLyogQlIvRURSIG9ubHkgKGRlZmF1bHQgcG9saWN5KQorICogICBBTVAgY29udHJvbGxlcnMgY2Fubm90IGJlIHVzZWQuCisgKiAgIENoYW5uZWwgbW92ZSByZXF1ZXN0cyBmcm9tIHRoZSByZW1vdGUgZGV2aWNlIGFyZSBkZW5pZWQuCisgKiAgIElmIHRoZSBMMkNBUCBjaGFubmVsIGlzIGN1cnJlbnRseSB1c2luZyBBTVAsIG1vdmUgdGhlIGNoYW5uZWwgdG8gQlIvRURSLgorICovCisjZGVmaW5lIEJUX0NIQU5ORUxfUE9MSUNZX0JSRURSX09OTFkJCTAKKworLyogQlIvRURSIFByZWZlcnJlZAorICogICBBbGxvdyB1c2Ugb2YgQU1QIGNvbnRyb2xsZXJzLgorICogICBJZiB0aGUgTDJDQVAgY2hhbm5lbCBpcyBjdXJyZW50bHkgb24gQU1QLCBtb3ZlIGl0IHRvIEJSL0VEUi4KKyAqICAgQ2hhbm5lbCBtb3ZlIHJlcXVlc3RzIGZyb20gdGhlIHJlbW90ZSBkZXZpY2UgYXJlIGFsbG93ZWQuCisgKi8KKyNkZWZpbmUgQlRfQ0hBTk5FTF9QT0xJQ1lfQlJFRFJfUFJFRkVSUkVECTEKKworLyogQU1QIFByZWZlcnJlZAorICogICBBbGxvdyB1c2Ugb2YgQU1QIGNvbnRyb2xsZXJzCisgKiAgIElmIHRoZSBMMkNBUCBjaGFubmVsIGlzIGN1cnJlbnRseSBvbiBCUi9FRFIgYW5kIEFNUCBjb250cm9sbGVyCisgKiAgICAgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUsIGluaXRpYXRlIGEgY2hhbm5lbCBtb3ZlIHRvIEFNUC4KKyAqICAgQ2hhbm5lbCBtb3ZlIHJlcXVlc3RzIGZyb20gdGhlIHJlbW90ZSBkZXZpY2UgYXJlIGFsbG93ZWQuCisgKiAgIElmIHRoZSBMMkNBUCBzb2NrZXQgaGFzIG5vdCBiZWVuIGNvbm5lY3RlZCB5ZXQsIHRyeSB0byBjcmVhdGUKKyAqICAgICBhbmQgY29uZmlndXJlIHRoZSBjaGFubmVsIGRpcmVjdGx5IG9uIGFuIEFNUCBjb250cm9sbGVyIHJhdGhlcgorICogICAgIHRoYW4gQlIvRURSLgorICovCisjZGVmaW5lIEJUX0NIQU5ORUxfUE9MSUNZX0FNUF9QUkVGRVJSRUQJCTIKKworX19wcmludGYoMiwgMykKIGludCBidF9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogI2RlZmluZSBCVF9JTkZPKGZtdCwgYXJnLi4uKSAgIGJ0X3ByaW50ayhLRVJOX0lORk8sIHByX2ZtdChmbXQpLCAjI2FyZykKQEAgLTE1OCw3ICsxODUsNyBAQAogCV9fdTggcGt0X3R5cGU7CiAJX191OCBpbmNvbWluZzsKIAlfX3UxNiBleHBlY3Q7Ci0JX191OCB0eF9zZXE7CisJX191MTYgdHhfc2VxOwogCV9fdTggcmV0cmllczsKIAlfX3U4IHNhcjsKIAl1bnNpZ25lZCBzaG9ydCBjaGFubmVsOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCmluZGV4IGFhZjc5YWYuLjEzOWNlMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKQEAgLTI2NCw2ICsyNjQsMTMgQEAKICNkZWZpbmUgSENJX0xLX1NNUF9JUksJCQkweDgyCiAjZGVmaW5lIEhDSV9MS19TTVBfQ1NSSwkJCTB4ODMKIAorLyogLS0tLSBIQ0kgRXJyb3IgQ29kZXMgLS0tLSAqLworI2RlZmluZSBIQ0lfRVJST1JfQVVUSF9GQUlMVVJFCQkweDA1CisjZGVmaW5lIEhDSV9FUlJPUl9SRUpfQkFEX0FERFIJCTB4MGYKKyNkZWZpbmUgSENJX0VSUk9SX1JFTU9URV9VU0VSX1RFUk0JMHgxMworI2RlZmluZSBIQ0lfRVJST1JfTE9DQUxfSE9TVF9URVJNCTB4MTYKKyNkZWZpbmUgSENJX0VSUk9SX1BBSVJJTkdfTk9UX0FMTE9XRUQJMHgxOAorCiAvKiAtLS0tLSAgSENJIENvbW1hbmRzIC0tLS0gKi8KICNkZWZpbmUgSENJX09QX05PUAkJCTB4MDAwMAogCkBAIC03MjYsNiArNzMzLDIxIEBACiAJI2RlZmluZSBQQUdFX1NDQU5fVFlQRV9TVEFOREFSRAkJMHgwMAogCSNkZWZpbmUgUEFHRV9TQ0FOX1RZUEVfSU5URVJMQUNFRAkweDAxCiAKKyNkZWZpbmUgSENJX09QX1JFQURfTE9DQUxfQU1QX0lORk8JMHgxNDA5CitzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfYW1wX2luZm8geworCV9fdTggICAgIHN0YXR1czsKKwlfX3U4ICAgICBhbXBfc3RhdHVzOworCV9fbGUzMiAgIHRvdGFsX2J3OworCV9fbGUzMiAgIG1heF9idzsKKwlfX2xlMzIgICBtaW5fbGF0ZW5jeTsKKwlfX2xlMzIgICBtYXhfcGR1OworCV9fdTggICAgIGFtcF90eXBlOworCV9fbGUxNiAgIHBhbF9jYXA7CisJX19sZTE2ICAgbWF4X2Fzc29jX3NpemU7CisJX19sZTMyICAgbWF4X2ZsdXNoX3RvOworCV9fbGUzMiAgIGJlX2ZsdXNoX3RvOworfSBfX3BhY2tlZDsKKwogI2RlZmluZSBIQ0lfT1BfTEVfU0VUX0VWRU5UX01BU0sJMHgyMDAxCiBzdHJ1Y3QgaGNpX2NwX2xlX3NldF9ldmVudF9tYXNrIHsKIAlfX3U4ICAgICBtYXNrWzhdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAppbmRleCA1YjkyNDQyLi5mMzMzZTc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaApAQCAtMzIsNiArMzIsOSBAQAogI2RlZmluZSBIQ0lfUFJPVE9fTDJDQVAJMAogI2RlZmluZSBIQ0lfUFJPVE9fU0NPCTEKIAorLyogSENJIHByaW9yaXR5ICovCisjZGVmaW5lIEhDSV9QUklPX01BWAk3CisKIC8qIEhDSSBDb3JlIHN0cnVjdHVyZXMgKi8KIHN0cnVjdCBpbnF1aXJ5X2RhdGEgewogCWJkYWRkcl90CWJkYWRkcjsKQEAgLTY0LDYgKzY3LDEyIEBACiAJdW5zaWduZWQgaW50ICAgICBsZV9udW07CiB9OwogCitzdHJ1Y3QgaGNpX2NoYW5faGFzaCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXNwaW5sb2NrX3QgICAgICAgbG9jazsKKwl1bnNpZ25lZCBpbnQgICAgIG51bTsKK307CisKIHN0cnVjdCBiZGFkZHJfbGlzdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWJkYWRkcl90IGJkYWRkcjsKQEAgLTE1MCw2ICsxNTksMTcgQEAKIAlfX3UxNgkJc25pZmZfbWluX2ludGVydmFsOwogCV9fdTE2CQlzbmlmZl9tYXhfaW50ZXJ2YWw7CiAKKwlfX3U4CQlhbXBfc3RhdHVzOworCV9fdTMyCQlhbXBfdG90YWxfYnc7CisJX191MzIJCWFtcF9tYXhfYnc7CisJX191MzIJCWFtcF9taW5fbGF0ZW5jeTsKKwlfX3UzMgkJYW1wX21heF9wZHU7CisJX191OAkJYW1wX3R5cGU7CisJX191MTYJCWFtcF9wYWxfY2FwOworCV9fdTE2CQlhbXBfYXNzb2Nfc2l6ZTsKKwlfX3UzMgkJYW1wX21heF9mbHVzaF90bzsKKwlfX3UzMgkJYW1wX2JlX2ZsdXNoX3RvOworCiAJdW5zaWduZWQgaW50CWF1dG9fYWNjZXB0X2RlbGF5OwogCiAJdW5zaWduZWQgbG9uZwlxdWlya3M7CkBAIC0xNzMsOCArMTkzLDEwIEBACiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKndvcmtxdWV1ZTsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdAlwb3dlcl9vbjsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcG93ZXJfb2ZmOwotCXN0cnVjdCB0aW1lcl9saXN0CW9mZl90aW1lcjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXBvd2VyX29mZjsKKworCV9fdTE2CQkJZGlzY292X3RpbWVvdXQ7CisJc3RydWN0IGRlbGF5ZWRfd29yawlkaXNjb3Zfb2ZmOwogCiAJc3RydWN0IHRpbWVyX2xpc3QJY21kX3RpbWVyOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAljbWRfdGFzazsKQEAgLTE5NSw2ICsyMTcsOCBAQAogCiAJX191MTYJCQlpbml0X2xhc3RfY21kOwogCisJc3RydWN0IGxpc3RfaGVhZAltZ210X3BlbmRpbmc7CisKIAlzdHJ1Y3QgaW5xdWlyeV9jYWNoZQlpbnFfY2FjaGU7CiAJc3RydWN0IGhjaV9jb25uX2hhc2gJY29ubl9oYXNoOwogCXN0cnVjdCBsaXN0X2hlYWQJYmxhY2tsaXN0OwpAQCAtMjczLDYgKzI5Nyw3IEBACiAJdW5zaWduZWQgaW50CXNlbnQ7CiAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGRhdGFfcTsKKwlzdHJ1Y3QgaGNpX2NoYW5faGFzaCBjaGFuX2hhc2g7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBkaXNjX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IGlkbGVfdGltZXI7CkBAIC0yOTUsNiArMzIwLDE0IEBACiAJdm9pZCAoKmRpc2Nvbm5fY2ZtX2NiKQkoc3RydWN0IGhjaV9jb25uICpjb25uLCB1OCByZWFzb24pOwogfTsKIAorc3RydWN0IGhjaV9jaGFuIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBkYXRhX3E7CisJdW5zaWduZWQgaW50CXNlbnQ7Cit9OworCiBleHRlcm4gc3RydWN0IGhjaV9wcm90byAqaGNpX3Byb3RvW107CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBoY2lfZGV2X2xpc3Q7CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBoY2lfY2JfbGlzdDsKQEAgLTQ1NSw2ICs0ODgsMjggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGhjaV9jaGFuX2hhc2hfaW5pdChzdHJ1Y3QgaGNpX2Nvbm4gKmMpCit7CisJc3RydWN0IGhjaV9jaGFuX2hhc2ggKmggPSAmYy0+Y2hhbl9oYXNoOworCUlOSVRfTElTVF9IRUFEKCZoLT5saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmaC0+bG9jayk7CisJaC0+bnVtID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhjaV9jaGFuX2hhc2hfYWRkKHN0cnVjdCBoY2lfY29ubiAqYywgc3RydWN0IGhjaV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBoY2lfY2hhbl9oYXNoICpoID0gJmMtPmNoYW5faGFzaDsKKwlsaXN0X2FkZCgmY2hhbi0+bGlzdCwgJmgtPmxpc3QpOworCWgtPm51bSsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2NoYW5faGFzaF9kZWwoc3RydWN0IGhjaV9jb25uICpjLCBzdHJ1Y3QgaGNpX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGhjaV9jaGFuX2hhc2ggKmggPSAmYy0+Y2hhbl9oYXNoOworCWxpc3RfZGVsKCZjaGFuLT5saXN0KTsKKwloLT5udW0tLTsKK30KKwogdm9pZCBoY2lfYWNsX2Nvbm5lY3Qoc3RydWN0IGhjaV9jb25uICpjb25uKTsKIHZvaWQgaGNpX2FjbF9kaXNjb25uKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCByZWFzb24pOwogdm9pZCBoY2lfYWRkX3NjbyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTE2IGhhbmRsZSk7CkBAIC00NjYsNiArNTIxLDEwIEBACiB2b2lkIGhjaV9jb25uX2hhc2hfZmx1c2goc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogdm9pZCBoY2lfY29ubl9jaGVja19wZW5kaW5nKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIAorc3RydWN0IGhjaV9jaGFuICpoY2lfY2hhbl9jcmVhdGUoc3RydWN0IGhjaV9jb25uICpjb25uKTsKK2ludCBoY2lfY2hhbl9kZWwoc3RydWN0IGhjaV9jaGFuICpjaGFuKTsKK3ZvaWQgaGNpX2NoYW5faGFzaF9mbHVzaChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOworCiBzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9jb25uZWN0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKmRzdCwKIAkJCQkJCV9fdTggc2VjX2xldmVsLCBfX3U4IGF1dGhfdHlwZSk7CiBpbnQgaGNpX2Nvbm5fY2hlY2tfbGlua19tb2RlKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CkBAIC01MTMsMTEgKzU3MiwxNSBAQAogCQlkLT5kZXN0cnVjdChkKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGhjaV9kZXZfcHV0KHN0cnVjdCBoY2lfZGV2ICpkKQotewotCV9faGNpX2Rldl9wdXQoZCk7Ci0JbW9kdWxlX3B1dChkLT5vd25lcik7Ci19CisvKgorICogaGNpX2Rldl9wdXQgYW5kIGhjaV9kZXZfaG9sZCBhcmUgbWFjcm9zIHRvIGF2b2lkIGRyYWdnaW5nIGFsbCB0aGUKKyAqIG92ZXJoZWFkIG9mIGFsbCB0aGUgbW9kdWxhciBpbmZyYXN0cnVjdHVyZSBpbnRvIHRoaXMgaGVhZGVyLgorICovCisjZGVmaW5lIGhjaV9kZXZfcHV0KGQpCQlcCitkbyB7CQkJCVwKKwlfX2hjaV9kZXZfcHV0KGQpOwlcCisJbW9kdWxlX3B1dChkLT5vd25lcik7CVwKK30gd2hpbGUgKDApCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGhjaV9kZXYgKl9faGNpX2Rldl9ob2xkKHN0cnVjdCBoY2lfZGV2ICpkKQogewpAQCAtNTI1LDEyICs1ODgsMTAgQEAKIAlyZXR1cm4gZDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2RldiAqaGNpX2Rldl9ob2xkKHN0cnVjdCBoY2lfZGV2ICpkKQotewotCWlmICh0cnlfbW9kdWxlX2dldChkLT5vd25lcikpCi0JCXJldHVybiBfX2hjaV9kZXZfaG9sZChkKTsKLQlyZXR1cm4gTlVMTDsKLX0KKyNkZWZpbmUgaGNpX2Rldl9ob2xkKGQpCQkJCQkJXAorKHsJCQkJCQkJCVwKKwl0cnlfbW9kdWxlX2dldChkLT5vd25lcikgPyBfX2hjaV9kZXZfaG9sZChkKSA6IE5VTEw7CVwKK30pCiAKICNkZWZpbmUgaGNpX2Rldl9sb2NrKGQpCQlzcGluX2xvY2soJmQtPmxvY2spCiAjZGVmaW5lIGhjaV9kZXZfdW5sb2NrKGQpCXNwaW5fdW5sb2NrKCZkLT5sb2NrKQpAQCAtNTQzLDcgKzYwNCw3IEBACiBzdHJ1Y3QgaGNpX2RldiAqaGNpX2FsbG9jX2Rldih2b2lkKTsKIHZvaWQgaGNpX2ZyZWVfZGV2KHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIGludCBoY2lfcmVnaXN0ZXJfZGV2KHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKLWludCBoY2lfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwordm9pZCBoY2lfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogaW50IGhjaV9zdXNwZW5kX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiBpbnQgaGNpX3Jlc3VtZV9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogaW50IGhjaV9kZXZfb3BlbihfX3UxNiBkZXYpOwpAQCAtNTk3LDggKzY1OCw5IEBACiBpbnQgaGNpX3JlY3ZfZnJhZ21lbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgY291bnQpOwogaW50IGhjaV9yZWN2X3N0cmVhbV9mcmFnbWVudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwgaW50IGNvdW50KTsKIAotaW50IGhjaV9yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgaGNpX2RldiAqaGRldik7Ci12b2lkIGhjaV91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKK3ZvaWQgaGNpX2luaXRfc3lzZnMoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworaW50IGhjaV9hZGRfc3lzZnMoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwordm9pZCBoY2lfZGVsX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIHZvaWQgaGNpX2Nvbm5faW5pdF9zeXNmcyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOwogdm9pZCBoY2lfY29ubl9hZGRfc3lzZnMoc3RydWN0IGhjaV9jb25uICpjb25uKTsKIHZvaWQgaGNpX2Nvbm5fZGVsX3N5c2ZzKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CkBAIC02NzQsNyArNzM2LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGhjaV9wcm90b19kaXNjb25uX2luZChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCiB7CiAJcmVnaXN0ZXIgc3RydWN0IGhjaV9wcm90byAqaHA7Ci0JaW50IHJlYXNvbiA9IDB4MTM7CisJaW50IHJlYXNvbiA9IEhDSV9FUlJPUl9SRU1PVEVfVVNFUl9URVJNOwogCiAJaHAgPSBoY2lfcHJvdG9bSENJX1BST1RPX0wyQ0FQXTsKIAlpZiAoaHAgJiYgaHAtPmRpc2Nvbm5faW5kKQpAQCAtODM0LDcgKzg5Niw3IEBACiBpbnQgaGNpX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiAKIGludCBoY2lfc2VuZF9jbWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9wY29kZSwgX191MzIgcGxlbiwgdm9pZCAqcGFyYW0pOwotdm9pZCBoY2lfc2VuZF9hY2woc3RydWN0IGhjaV9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3UxNiBmbGFncyk7Cit2b2lkIGhjaV9zZW5kX2FjbChzdHJ1Y3QgaGNpX2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGZsYWdzKTsKIHZvaWQgaGNpX3NlbmRfc2NvKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIHZvaWQgKmhjaV9zZW50X2NtZF9kYXRhKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3UxNiBvcGNvZGUpOwpAQCAtODQ3LDM0ICs5MDksNDEgQEAKIAogLyogTWFuYWdlbWVudCBpbnRlcmZhY2UgKi8KIGludCBtZ210X2NvbnRyb2woc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pOwotaW50IG1nbXRfaW5kZXhfYWRkZWQodTE2IGluZGV4KTsKLWludCBtZ210X2luZGV4X3JlbW92ZWQodTE2IGluZGV4KTsKLWludCBtZ210X3Bvd2VyZWQodTE2IGluZGV4LCB1OCBwb3dlcmVkKTsKLWludCBtZ210X2Rpc2NvdmVyYWJsZSh1MTYgaW5kZXgsIHU4IGRpc2NvdmVyYWJsZSk7Ci1pbnQgbWdtdF9jb25uZWN0YWJsZSh1MTYgaW5kZXgsIHU4IGNvbm5lY3RhYmxlKTsKLWludCBtZ210X25ld19rZXkodTE2IGluZGV4LCBzdHJ1Y3QgbGlua19rZXkgKmtleSwgdTggcGVyc2lzdGVudCk7Ci1pbnQgbWdtdF9jb25uZWN0ZWQodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBsaW5rX3R5cGUpOwotaW50IG1nbXRfZGlzY29ubmVjdGVkKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkcik7Ci1pbnQgbWdtdF9kaXNjb25uZWN0X2ZhaWxlZCh1MTYgaW5kZXgpOwotaW50IG1nbXRfY29ubmVjdF9mYWlsZWQodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBzdGF0dXMpOwotaW50IG1nbXRfcGluX2NvZGVfcmVxdWVzdCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHNlY3VyZSk7Ci1pbnQgbWdtdF9waW5fY29kZV9yZXBseV9jb21wbGV0ZSh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cyk7Ci1pbnQgbWdtdF9waW5fY29kZV9uZWdfcmVwbHlfY29tcGxldGUodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBzdGF0dXMpOwotaW50IG1nbXRfdXNlcl9jb25maXJtX3JlcXVlc3QodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCBfX2xlMzIgdmFsdWUsCi0JCQkJCQkJdTggY29uZmlybV9oaW50KTsKLWludCBtZ210X3VzZXJfY29uZmlybV9yZXBseV9jb21wbGV0ZSh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cyk7Ci1pbnQgbWdtdF91c2VyX2NvbmZpcm1fbmVnX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwKK2ludCBtZ210X2luZGV4X2FkZGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKK2ludCBtZ210X2luZGV4X3JlbW92ZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworaW50IG1nbXRfcG93ZXJlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggcG93ZXJlZCk7CitpbnQgbWdtdF9kaXNjb3ZlcmFibGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGRpc2NvdmVyYWJsZSk7CitpbnQgbWdtdF9jb25uZWN0YWJsZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggY29ubmVjdGFibGUpOworaW50IG1nbXRfd3JpdGVfc2Nhbl9mYWlsZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHNjYW4sIHU4IHN0YXR1cyk7CitpbnQgbWdtdF9uZXdfbGlua19rZXkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBsaW5rX2tleSAqa2V5LAorCQkJCQkJCQl1OCBwZXJzaXN0ZW50KTsKK2ludCBtZ210X2Nvbm5lY3RlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgdTggdHlwZSk7CitpbnQgbWdtdF9kaXNjb25uZWN0ZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHR5cGUpOworaW50IG1nbXRfZGlzY29ubmVjdF9mYWlsZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworaW50IG1nbXRfY29ubmVjdF9mYWlsZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHR5cGUsCiAJCQkJCQkJCXU4IHN0YXR1cyk7Ci1pbnQgbWdtdF9hdXRoX2ZhaWxlZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cyk7Ci1pbnQgbWdtdF9zZXRfbG9jYWxfbmFtZV9jb21wbGV0ZSh1MTYgaW5kZXgsIHU4ICpuYW1lLCB1OCBzdGF0dXMpOwotaW50IG1nbXRfcmVhZF9sb2NhbF9vb2JfZGF0YV9yZXBseV9jb21wbGV0ZSh1MTYgaW5kZXgsIHU4ICpoYXNoLCB1OCAqcmFuZG9taXplciwKK2ludCBtZ210X3Bpbl9jb2RlX3JlcXVlc3Qoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHNlY3VyZSk7CitpbnQgbWdtdF9waW5fY29kZV9yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwKIAkJCQkJCQkJdTggc3RhdHVzKTsKLWludCBtZ210X2RldmljZV9mb3VuZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4ICpkZXZfY2xhc3MsIHM4IHJzc2ksCi0JCQkJCQkJCXU4ICplaXIpOwotaW50IG1nbXRfcmVtb3RlX25hbWUodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCAqbmFtZSk7Ci1pbnQgbWdtdF9kaXNjb3ZlcmluZyh1MTYgaW5kZXgsIHU4IGRpc2NvdmVyaW5nKTsKLWludCBtZ210X2RldmljZV9ibG9ja2VkKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkcik7Ci1pbnQgbWdtdF9kZXZpY2VfdW5ibG9ja2VkKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkcik7CitpbnQgbWdtdF9waW5fY29kZV9uZWdfcmVwbHlfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCisJCQkJCQkJCXU4IHN0YXR1cyk7CitpbnQgbWdtdF91c2VyX2NvbmZpcm1fcmVxdWVzdChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwKKwkJCQkJCV9fbGUzMiB2YWx1ZSwgdTggY29uZmlybV9oaW50KTsKK2ludCBtZ210X3VzZXJfY29uZmlybV9yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwKKwkJCQkJCQkJdTggc3RhdHVzKTsKK2ludCBtZ210X3VzZXJfY29uZmlybV9uZWdfcmVwbHlfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCQliZGFkZHJfdCAqYmRhZGRyLCB1OCBzdGF0dXMpOworaW50IG1nbXRfYXV0aF9mYWlsZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cyk7CitpbnQgbWdtdF9zZXRfbG9jYWxfbmFtZV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKm5hbWUsIHU4IHN0YXR1cyk7CitpbnQgbWdtdF9yZWFkX2xvY2FsX29vYl9kYXRhX3JlcGx5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqaGFzaCwKKwkJCQkJCXU4ICpyYW5kb21pemVyLCB1OCBzdGF0dXMpOworaW50IG1nbXRfZGV2aWNlX2ZvdW5kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCB0eXBlLAorCQkJCQl1OCAqZGV2X2NsYXNzLCBzOCByc3NpLCB1OCAqZWlyKTsKK2ludCBtZ210X3JlbW90ZV9uYW1lKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCAqbmFtZSk7CitpbnQgbWdtdF9pbnF1aXJ5X2ZhaWxlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzKTsKK2ludCBtZ210X2Rpc2NvdmVyaW5nKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBkaXNjb3ZlcmluZyk7CitpbnQgbWdtdF9kZXZpY2VfYmxvY2tlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcik7CitpbnQgbWdtdF9kZXZpY2VfdW5ibG9ja2VkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKTsKIAogLyogSENJIGluZm8gZm9yIHNvY2tldCAqLwogI2RlZmluZSBoY2lfcGkoc2spICgoc3RydWN0IGhjaV9waW5mbyAqKSBzaykKQEAgLTkxMyw0ICs5ODIsNyBAQAogdm9pZCBoY2lfbGVfbHRrX3JlcGx5KHN0cnVjdCBoY2lfY29ubiAqY29ubiwgdTggbHRrWzE2XSk7CiB2b2lkIGhjaV9sZV9sdGtfbmVnX3JlcGx5KHN0cnVjdCBoY2lfY29ubiAqY29ubik7CiAKK2ludCBoY2lfZG9faW5xdWlyeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggbGVuZ3RoKTsKK2ludCBoY2lfY2FuY2VsX2lucXVpcnkoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworCiAjZW5kaWYgLyogX19IQ0lfQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvbDJjYXAuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9sMmNhcC5oCmluZGV4IDZjYzE4ZjMuLjg3NTAyMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9sMmNhcC5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9sMmNhcC5oCkBAIC0yNywxNyArMjcsMjMgQEAKICNpZm5kZWYgX19MMkNBUF9ICiAjZGVmaW5lIF9fTDJDQVBfSAogCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCiAvKiBMMkNBUCBkZWZhdWx0cyAqLwogI2RlZmluZSBMMkNBUF9ERUZBVUxUX01UVQkJNjcyCiAjZGVmaW5lIEwyQ0FQX0RFRkFVTFRfTUlOX01UVQkJNDgKICNkZWZpbmUgTDJDQVBfREVGQVVMVF9GTFVTSF9UTwkJMHhmZmZmCiAjZGVmaW5lIEwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XCQk2MworI2RlZmluZSBMMkNBUF9ERUZBVUxUX0VYVF9XSU5ET1cJMHgzRkZGCiAjZGVmaW5lIEwyQ0FQX0RFRkFVTFRfTUFYX1RYCQkzCiAjZGVmaW5lIEwyQ0FQX0RFRkFVTFRfUkVUUkFOU19UTwkyMDAwICAgIC8qIDIgc2Vjb25kcyAqLwogI2RlZmluZSBMMkNBUF9ERUZBVUxUX01PTklUT1JfVE8JMTIwMDAgICAvKiAxMiBzZWNvbmRzICovCiAjZGVmaW5lIEwyQ0FQX0RFRkFVTFRfTUFYX1BEVV9TSVpFCTEwMDkgICAgLyogU2l6ZWQgZm9yIDMtREg1IHBhY2tldCAqLwogI2RlZmluZSBMMkNBUF9ERUZBVUxUX0FDS19UTwkJMjAwCiAjZGVmaW5lIEwyQ0FQX0xFX0RFRkFVTFRfTVRVCQkyMworI2RlZmluZSBMMkNBUF9ERUZBVUxUX01BWF9TRFVfU0laRQkweEZGRkYKKyNkZWZpbmUgTDJDQVBfREVGQVVMVF9TRFVfSVRJTUUJCTB4RkZGRkZGRkYKKyNkZWZpbmUgTDJDQVBfREVGQVVMVF9BQ0NfTEFUCQkweEZGRkZGRkZGCiAKICNkZWZpbmUgTDJDQVBfRElTQ19USU1FT1VUICAgICAgICAgICAgICgxMDApCiAjZGVmaW5lIEwyQ0FQX0RJU0NfUkVKX1RJTUVPVVQgICAgICAgICAoNTAwMCkgIC8qICA1IHNlY29uZHMgKi8KQEAgLTkxLDUyICs5Nyw4MiBAQAogI2RlZmluZSBMMkNBUF9FQ0hPX1JTUAkJMHgwOQogI2RlZmluZSBMMkNBUF9JTkZPX1JFUQkJMHgwYQogI2RlZmluZSBMMkNBUF9JTkZPX1JTUAkJMHgwYgorI2RlZmluZSBMMkNBUF9DUkVBVEVfQ0hBTl9SRVEJMHgwYworI2RlZmluZSBMMkNBUF9DUkVBVEVfQ0hBTl9SU1AJMHgwZAorI2RlZmluZSBMMkNBUF9NT1ZFX0NIQU5fUkVRCTB4MGUKKyNkZWZpbmUgTDJDQVBfTU9WRV9DSEFOX1JTUAkweDBmCisjZGVmaW5lIEwyQ0FQX01PVkVfQ0hBTl9DRk0JMHgxMAorI2RlZmluZSBMMkNBUF9NT1ZFX0NIQU5fQ0ZNX1JTUAkweDExCiAjZGVmaW5lIEwyQ0FQX0NPTk5fUEFSQU1fVVBEQVRFX1JFUQkweDEyCiAjZGVmaW5lIEwyQ0FQX0NPTk5fUEFSQU1fVVBEQVRFX1JTUAkweDEzCiAKLS8qIEwyQ0FQIGZlYXR1cmUgbWFzayAqLworLyogTDJDQVAgZXh0ZW5kZWQgZmVhdHVyZSBtYXNrICovCiAjZGVmaW5lIEwyQ0FQX0ZFQVRfRkxPV0NUTAkweDAwMDAwMDAxCiAjZGVmaW5lIEwyQ0FQX0ZFQVRfUkVUUkFOUwkweDAwMDAwMDAyCisjZGVmaW5lIEwyQ0FQX0ZFQVRfQklESVJfUU9TCTB4MDAwMDAwMDQKICNkZWZpbmUgTDJDQVBfRkVBVF9FUlRNCQkweDAwMDAwMDA4CiAjZGVmaW5lIEwyQ0FQX0ZFQVRfU1RSRUFNSU5HCTB4MDAwMDAwMTAKICNkZWZpbmUgTDJDQVBfRkVBVF9GQ1MJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTDJDQVBfRkVBVF9FWFRfRkxPVwkweDAwMDAwMDQwCiAjZGVmaW5lIEwyQ0FQX0ZFQVRfRklYRURfQ0hBTgkweDAwMDAwMDgwCisjZGVmaW5lIEwyQ0FQX0ZFQVRfRVhUX1dJTkRPVwkweDAwMDAwMTAwCisjZGVmaW5lIEwyQ0FQX0ZFQVRfVUNECQkweDAwMDAwMjAwCiAKIC8qIEwyQ0FQIGNoZWNrc3VtIG9wdGlvbiAqLwogI2RlZmluZSBMMkNBUF9GQ1NfTk9ORQkJMHgwMAogI2RlZmluZSBMMkNBUF9GQ1NfQ1JDMTYJCTB4MDEKIAotLyogTDJDQVAgQ29udHJvbCBGaWVsZCBiaXQgbWFza3MgKi8KLSNkZWZpbmUgTDJDQVBfQ1RSTF9TQVIgICAgICAgICAgICAgICAweEMwMDAKLSNkZWZpbmUgTDJDQVBfQ1RSTF9SRVFTRVEgICAgICAgICAgICAweDNGMDAKLSNkZWZpbmUgTDJDQVBfQ1RSTF9UWFNFUSAgICAgICAgICAgICAweDAwN0UKLSNkZWZpbmUgTDJDQVBfQ1RSTF9SRVRSQU5TICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgTDJDQVBfQ1RSTF9GSU5BTCAgICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgTDJDQVBfQ1RSTF9QT0xMICAgICAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgTDJDQVBfQ1RSTF9TVVBFUlZJU0UgICAgICAgICAweDAwMEMKLSNkZWZpbmUgTDJDQVBfQ1RSTF9GUkFNRV9UWVBFICAgICAgICAweDAwMDEgLyogSS0gb3IgUy1GcmFtZSAqLworLyogTDJDQVAgZml4ZWQgY2hhbm5lbHMgKi8KKyNkZWZpbmUgTDJDQVBfRkNfTDJDQVAJCTB4MDIKKyNkZWZpbmUgTDJDQVBfRkNfQTJNUAkJMHgwOAogCi0jZGVmaW5lIEwyQ0FQX0NUUkxfVFhTRVFfU0hJRlQgICAgICAxCi0jZGVmaW5lIEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUICAgICA4Ci0jZGVmaW5lIEwyQ0FQX0NUUkxfU0FSX1NISUZUICAgICAgIDE0CisvKiBMMkNBUCBDb250cm9sIEZpZWxkIGJpdCBtYXNrcyAqLworI2RlZmluZSBMMkNBUF9DVFJMX1NBUgkJCTB4QzAwMAorI2RlZmluZSBMMkNBUF9DVFJMX1JFUVNFUQkJMHgzRjAwCisjZGVmaW5lIEwyQ0FQX0NUUkxfVFhTRVEJCTB4MDA3RQorI2RlZmluZSBMMkNBUF9DVFJMX1NVUEVSVklTRQkJMHgwMDBDCisKKyNkZWZpbmUgTDJDQVBfQ1RSTF9SRVRSQU5TCQkweDAwODAKKyNkZWZpbmUgTDJDQVBfQ1RSTF9GSU5BTAkJMHgwMDgwCisjZGVmaW5lIEwyQ0FQX0NUUkxfUE9MTAkJCTB4MDAxMAorI2RlZmluZSBMMkNBUF9DVFJMX0ZSQU1FX1RZUEUJCTB4MDAwMSAvKiBJLSBvciBTLUZyYW1lICovCisKKyNkZWZpbmUgTDJDQVBfQ1RSTF9UWFNFUV9TSElGVAkJMQorI2RlZmluZSBMMkNBUF9DVFJMX1NVUEVSX1NISUZUCQkyCisjZGVmaW5lIEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUCQk4CisjZGVmaW5lIEwyQ0FQX0NUUkxfU0FSX1NISUZUCQkxNAorCisvKiBMMkNBUCBFeHRlbmRlZCBDb250cm9sIEZpZWxkIGJpdCBtYXNrICovCisjZGVmaW5lIEwyQ0FQX0VYVF9DVFJMX1RYU0VRCQkweEZGRkMwMDAwCisjZGVmaW5lIEwyQ0FQX0VYVF9DVFJMX1NBUgkJMHgwMDAzMDAwMAorI2RlZmluZSBMMkNBUF9FWFRfQ1RSTF9TVVBFUlZJU0UJMHgwMDAzMDAwMAorI2RlZmluZSBMMkNBUF9FWFRfQ1RSTF9SRVFTRVEJCTB4MDAwMEZGRkMKKworI2RlZmluZSBMMkNBUF9FWFRfQ1RSTF9QT0xMCQkweDAwMDQwMDAwCisjZGVmaW5lIEwyQ0FQX0VYVF9DVFJMX0ZJTkFMCQkweDAwMDAwMDAyCisjZGVmaW5lIEwyQ0FQX0VYVF9DVFJMX0ZSQU1FX1RZUEUJMHgwMDAwMDAwMSAvKiBJLSBvciBTLUZyYW1lICovCisKKyNkZWZpbmUgTDJDQVBfRVhUX0NUUkxfUkVRU0VRX1NISUZUCTIKKyNkZWZpbmUgTDJDQVBfRVhUX0NUUkxfU0FSX1NISUZUCTE2CisjZGVmaW5lIEwyQ0FQX0VYVF9DVFJMX1NVUEVSX1NISUZUCTE2CisjZGVmaW5lIEwyQ0FQX0VYVF9DVFJMX1RYU0VRX1NISUZUCTE4CiAKIC8qIEwyQ0FQIFN1cGVydmlzb3J5IEZ1bmN0aW9uICovCi0jZGVmaW5lIEwyQ0FQX1NVUEVSX1JDVl9SRUFEWSAgICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIEwyQ0FQX1NVUEVSX1JFSkVDVCAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIEwyQ0FQX1NVUEVSX1JDVl9OT1RfUkVBRFkgICAgICAgMHgwMDA4Ci0jZGVmaW5lIEwyQ0FQX1NVUEVSX1NFTEVDVF9SRUpFQ1QgICAgICAgMHgwMDBDCisjZGVmaW5lIEwyQ0FQX1NVUEVSX1JSCQkweDAwCisjZGVmaW5lIEwyQ0FQX1NVUEVSX1JFSgkJMHgwMQorI2RlZmluZSBMMkNBUF9TVVBFUl9STlIJCTB4MDIKKyNkZWZpbmUgTDJDQVBfU1VQRVJfU1JFSgkweDAzCiAKIC8qIEwyQ0FQIFNlZ21lbnRhdGlvbiBhbmQgUmVhc3NlbWJseSAqLwotI2RlZmluZSBMMkNBUF9TRFVfVU5TRUdNRU5URUQgICAgICAgMHgwMDAwCi0jZGVmaW5lIEwyQ0FQX1NEVV9TVEFSVCAgICAgICAgICAgICAweDQwMDAKLSNkZWZpbmUgTDJDQVBfU0RVX0VORCAgICAgICAgICAgICAgIDB4ODAwMAotI2RlZmluZSBMMkNBUF9TRFVfQ09OVElOVUUgICAgICAgICAgMHhDMDAwCisjZGVmaW5lIEwyQ0FQX1NBUl9VTlNFR01FTlRFRAkweDAwCisjZGVmaW5lIEwyQ0FQX1NBUl9TVEFSVAkJMHgwMQorI2RlZmluZSBMMkNBUF9TQVJfRU5ECQkweDAyCisjZGVmaW5lIEwyQ0FQX1NBUl9DT05USU5VRQkweDAzCiAKIC8qIEwyQ0FQIENvbW1hbmQgcmVqLiByZWFzb25zICovCi0jZGVmaW5lIEwyQ0FQX1JFSl9OT1RfVU5ERVJTVE9PRCAgICAgIDB4MDAwMAotI2RlZmluZSBMMkNBUF9SRUpfTVRVX0VYQ0VFREVEICAgICAgICAweDAwMDEKLSNkZWZpbmUgTDJDQVBfUkVKX0lOVkFMSURfQ0lEICAgICAgICAgMHgwMDAyCi0KKyNkZWZpbmUgTDJDQVBfUkVKX05PVF9VTkRFUlNUT09ECTB4MDAwMAorI2RlZmluZSBMMkNBUF9SRUpfTVRVX0VYQ0VFREVECQkweDAwMDEKKyNkZWZpbmUgTDJDQVBfUkVKX0lOVkFMSURfQ0lECQkweDAwMDIKIAogLyogTDJDQVAgc3RydWN0dXJlcyAqLwogc3RydWN0IGwyY2FwX2hkciB7CkBAIC0xNDQsNiArMTgwLDEyIEBACiAJX19sZTE2ICAgICBjaWQ7CiB9IF9fcGFja2VkOwogI2RlZmluZSBMMkNBUF9IRFJfU0laRQkJNAorI2RlZmluZSBMMkNBUF9FTkhfSERSX1NJWkUJNgorI2RlZmluZSBMMkNBUF9FWFRfSERSX1NJWkUJOAorCisjZGVmaW5lIEwyQ0FQX0ZDU19TSVpFCQkyCisjZGVmaW5lIEwyQ0FQX1NEVUxFTl9TSVpFCTIKKyNkZWZpbmUgTDJDQVBfUFNNTEVOX1NJWkUJMgogCiBzdHJ1Y3QgbDJjYXBfY21kX2hkciB7CiAJX191OCAgICAgICBjb2RlOwpAQCAtMTg4LDE0ICsyMzAsMTUgQEAKICNkZWZpbmUgTDJDQVBfQ0lEX0RZTl9TVEFSVAkweDAwNDAKICNkZWZpbmUgTDJDQVBfQ0lEX0RZTl9FTkQJMHhmZmZmCiAKLS8qIGNvbm5lY3QgcmVzdWx0ICovCisvKiBjb25uZWN0L2NyZWF0ZSBjaGFubmVsIHJlc3VsdHMgKi8KICNkZWZpbmUgTDJDQVBfQ1JfU1VDQ0VTUwkweDAwMDAKICNkZWZpbmUgTDJDQVBfQ1JfUEVORAkJMHgwMDAxCiAjZGVmaW5lIEwyQ0FQX0NSX0JBRF9QU00JMHgwMDAyCiAjZGVmaW5lIEwyQ0FQX0NSX1NFQ19CTE9DSwkweDAwMDMKICNkZWZpbmUgTDJDQVBfQ1JfTk9fTUVNCQkweDAwMDQKKyNkZWZpbmUgTDJDQVBfQ1JfQkFEX0FNUAkweDAwMDUKIAotLyogY29ubmVjdCBzdGF0dXMgKi8KKy8qIGNvbm5lY3QvY3JlYXRlIGNoYW5uZWwgc3RhdHVzICovCiAjZGVmaW5lIEwyQ0FQX0NTX05PX0lORk8JMHgwMDAwCiAjZGVmaW5lIEwyQ0FQX0NTX0FVVEhFTl9QRU5ECTB4MDAwMQogI2RlZmluZSBMMkNBUF9DU19BVVRIT1JfUEVORAkweDAwMDIKQEAgLTIxNyw2ICsyNjAsOCBAQAogI2RlZmluZSBMMkNBUF9DT05GX1VOQUNDRVBUCTB4MDAwMQogI2RlZmluZSBMMkNBUF9DT05GX1JFSkVDVAkweDAwMDIKICNkZWZpbmUgTDJDQVBfQ09ORl9VTktOT1dOCTB4MDAwMworI2RlZmluZSBMMkNBUF9DT05GX1BFTkRJTkcJMHgwMDA0CisjZGVmaW5lIEwyQ0FQX0NPTkZfRUZTX1JFSkVDVAkweDAwMDUKIAogc3RydWN0IGwyY2FwX2NvbmZfb3B0IHsKIAlfX3U4ICAgICAgIHR5cGU7CkBAIC0yMzMsNiArMjc4LDggQEAKICNkZWZpbmUgTDJDQVBfQ09ORl9RT1MJCTB4MDMKICNkZWZpbmUgTDJDQVBfQ09ORl9SRkMJCTB4MDQKICNkZWZpbmUgTDJDQVBfQ09ORl9GQ1MJCTB4MDUKKyNkZWZpbmUgTDJDQVBfQ09ORl9FRlMJCTB4MDYKKyNkZWZpbmUgTDJDQVBfQ09ORl9FV1MJCTB4MDcKIAogI2RlZmluZSBMMkNBUF9DT05GX01BWF9TSVpFCTIyCiAKQEAgLTI1MSw2ICsyOTgsMjEgQEAKICNkZWZpbmUgTDJDQVBfTU9ERV9FUlRNCQkweDAzCiAjZGVmaW5lIEwyQ0FQX01PREVfU1RSRUFNSU5HCTB4MDQKIAorc3RydWN0IGwyY2FwX2NvbmZfZWZzIHsKKwlfX3U4CWlkOworCV9fdTgJc3R5cGU7CisJX19sZTE2CW1zZHU7CisJX19sZTMyCXNkdV9pdGltZTsKKwlfX2xlMzIJYWNjX2xhdDsKKwlfX2xlMzIJZmx1c2hfdG87Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEwyQ0FQX1NFUlZfTk9UUkFGSUMJMHgwMAorI2RlZmluZSBMMkNBUF9TRVJWX0JFU1RFRkZPUlQJMHgwMQorI2RlZmluZSBMMkNBUF9TRVJWX0dVQVJBTlRFRUQJMHgwMgorCisjZGVmaW5lIEwyQ0FQX0JFU1RFRkZPUlRfSUQJMHgwMQorCiBzdHJ1Y3QgbDJjYXBfZGlzY29ubl9yZXEgewogCV9fbGUxNiAgICAgZGNpZDsKIAlfX2xlMTYgICAgIHNjaWQ7CkBAIC0yNzEsMTQgKzMzMyw1NyBAQAogCV9fdTggICAgICAgIGRhdGFbMF07CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgbDJjYXBfY3JlYXRlX2NoYW5fcmVxIHsKKwlfX2xlMTYgICAgICBwc207CisJX19sZTE2ICAgICAgc2NpZDsKKwlfX3U4ICAgICAgICBhbXBfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbDJjYXBfY3JlYXRlX2NoYW5fcnNwIHsKKwlfX2xlMTYgICAgICBkY2lkOworCV9fbGUxNiAgICAgIHNjaWQ7CisJX19sZTE2ICAgICAgcmVzdWx0OworCV9fbGUxNiAgICAgIHN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsMmNhcF9tb3ZlX2NoYW5fcmVxIHsKKwlfX2xlMTYgICAgICBpY2lkOworCV9fdTggICAgICAgIGRlc3RfYW1wX2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGwyY2FwX21vdmVfY2hhbl9yc3AgeworCV9fbGUxNiAgICAgIGljaWQ7CisJX19sZTE2ICAgICAgcmVzdWx0OworfSBfX3BhY2tlZDsKKworI2RlZmluZSBMMkNBUF9NUl9TVUNDRVNTCTB4MDAwMAorI2RlZmluZSBMMkNBUF9NUl9QRU5ECQkweDAwMDEKKyNkZWZpbmUgTDJDQVBfTVJfQkFEX0lECQkweDAwMDIKKyNkZWZpbmUgTDJDQVBfTVJfU0FNRV9JRAkweDAwMDMKKyNkZWZpbmUgTDJDQVBfTVJfTk9UX1NVUFAJMHgwMDA0CisjZGVmaW5lIEwyQ0FQX01SX0NPTExJU0lPTgkweDAwMDUKKyNkZWZpbmUgTDJDQVBfTVJfTk9UX0FMTE9XRUQJMHgwMDA2CisKK3N0cnVjdCBsMmNhcF9tb3ZlX2NoYW5fY2ZtIHsKKwlfX2xlMTYgICAgICBpY2lkOworCV9fbGUxNiAgICAgIHJlc3VsdDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTDJDQVBfTUNfQ09ORklSTUVECTB4MDAwMAorI2RlZmluZSBMMkNBUF9NQ19VTkNPTkZJUk1FRAkweDAwMDEKKworc3RydWN0IGwyY2FwX21vdmVfY2hhbl9jZm1fcnNwIHsKKwlfX2xlMTYgICAgICBpY2lkOworfSBfX3BhY2tlZDsKKwogLyogaW5mbyB0eXBlICovCi0jZGVmaW5lIEwyQ0FQX0lUX0NMX01UVSAgICAgMHgwMDAxCi0jZGVmaW5lIEwyQ0FQX0lUX0ZFQVRfTUFTSyAgMHgwMDAyCi0jZGVmaW5lIEwyQ0FQX0lUX0ZJWEVEX0NIQU4gMHgwMDAzCisjZGVmaW5lIEwyQ0FQX0lUX0NMX01UVQkJMHgwMDAxCisjZGVmaW5lIEwyQ0FQX0lUX0ZFQVRfTUFTSwkweDAwMDIKKyNkZWZpbmUgTDJDQVBfSVRfRklYRURfQ0hBTgkweDAwMDMKIAogLyogaW5mbyByZXN1bHQgKi8KLSNkZWZpbmUgTDJDQVBfSVJfU1VDQ0VTUyAgICAweDAwMDAKLSNkZWZpbmUgTDJDQVBfSVJfTk9UU1VQUCAgICAweDAwMDEKKyNkZWZpbmUgTDJDQVBfSVJfU1VDQ0VTUwkweDAwMDAKKyNkZWZpbmUgTDJDQVBfSVJfTk9UU1VQUAkweDAwMDEKIAogc3RydWN0IGwyY2FwX2Nvbm5fcGFyYW1fdXBkYXRlX3JlcSB7CiAJX19sZTE2ICAgICAgbWluOwpAQCAtMjk3LDcgKzQwMiw3IEBACiAKIC8qIC0tLS0tIEwyQ0FQIGNoYW5uZWxzIGFuZCBjb25uZWN0aW9ucyAtLS0tLSAqLwogc3RydWN0IHNyZWpfbGlzdCB7Ci0JX191OAl0eF9zZXE7CisJX191MTYJdHhfc2VxOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKQEAgLTMxOSwxNCArNDI0LDExIEBACiAJX191MTYJCWZsdXNoX3RvOwogCV9fdTgJCW1vZGU7CiAJX191OAkJY2hhbl90eXBlOworCV9fdTgJCWNoYW5fcG9saWN5OwogCiAJX19sZTE2CQlzcG9ydDsKIAogCV9fdTgJCXNlY19sZXZlbDsKLQlfX3U4CQlyb2xlX3N3aXRjaDsKLQlfX3U4CQlmb3JjZV9yZWxpYWJsZTsKLQlfX3U4CQlmbHVzaGFibGU7Ci0JX191OAkJZm9yY2VfYWN0aXZlOwogCiAJX191OAkJaWRlbnQ7CiAKQEAgLTMzNyw3ICs0MzksOCBAQAogCiAJX191OAkJZmNzOwogCi0JX191OAkJdHhfd2luOworCV9fdTE2CQl0eF93aW47CisJX191MTYJCXR4X3dpbl9tYXg7CiAJX191OAkJbWF4X3R4OwogCV9fdTE2CQlyZXRyYW5zX3RpbWVvdXQ7CiAJX191MTYJCW1vbml0b3JfdGltZW91dDsKQEAgLTM0NSwyNSArNDQ4LDQwIEBACiAKIAl1bnNpZ25lZCBsb25nCWNvbmZfc3RhdGU7CiAJdW5zaWduZWQgbG9uZwljb25uX3N0YXRlOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKLQlfX3U4CQluZXh0X3R4X3NlcTsKLQlfX3U4CQlleHBlY3RlZF9hY2tfc2VxOwotCV9fdTgJCWV4cGVjdGVkX3R4X3NlcTsKLQlfX3U4CQlidWZmZXJfc2VxOwotCV9fdTgJCWJ1ZmZlcl9zZXFfc3JlajsKLQlfX3U4CQlzcmVqX3NhdmVfcmVxc2VxOwotCV9fdTgJCWZyYW1lc19zZW50OwotCV9fdTgJCXVuYWNrZWRfZnJhbWVzOworCV9fdTE2CQluZXh0X3R4X3NlcTsKKwlfX3UxNgkJZXhwZWN0ZWRfYWNrX3NlcTsKKwlfX3UxNgkJZXhwZWN0ZWRfdHhfc2VxOworCV9fdTE2CQlidWZmZXJfc2VxOworCV9fdTE2CQlidWZmZXJfc2VxX3NyZWo7CisJX191MTYJCXNyZWpfc2F2ZV9yZXFzZXE7CisJX191MTYJCWZyYW1lc19zZW50OworCV9fdTE2CQl1bmFja2VkX2ZyYW1lczsKIAlfX3U4CQlyZXRyeV9jb3VudDsKIAlfX3U4CQludW1fYWNrZWQ7CiAJX191MTYJCXNkdV9sZW47CiAJc3RydWN0IHNrX2J1ZmYJKnNkdTsKIAlzdHJ1Y3Qgc2tfYnVmZgkqc2R1X2xhc3RfZnJhZzsKIAotCV9fdTgJCXJlbW90ZV90eF93aW47CisJX191MTYJCXJlbW90ZV90eF93aW47CiAJX191OAkJcmVtb3RlX21heF90eDsKIAlfX3UxNgkJcmVtb3RlX21wczsKIAorCV9fdTgJCWxvY2FsX2lkOworCV9fdTgJCWxvY2FsX3N0eXBlOworCV9fdTE2CQlsb2NhbF9tc2R1OworCV9fdTMyCQlsb2NhbF9zZHVfaXRpbWU7CisJX191MzIJCWxvY2FsX2FjY19sYXQ7CisJX191MzIJCWxvY2FsX2ZsdXNoX3RvOworCisJX191OAkJcmVtb3RlX2lkOworCV9fdTgJCXJlbW90ZV9zdHlwZTsKKwlfX3UxNgkJcmVtb3RlX21zZHU7CisJX191MzIJCXJlbW90ZV9zZHVfaXRpbWU7CisJX191MzIJCXJlbW90ZV9hY2NfbGF0OworCV9fdTMyCQlyZW1vdGVfZmx1c2hfdG87CisKIAlzdHJ1Y3QgdGltZXJfbGlzdAljaGFuX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0CXJldHJhbnNfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QJbW9uaXRvcl90aW1lcjsKQEAgLTM5MSw2ICs1MDksNyBAQAogCiBzdHJ1Y3QgbDJjYXBfY29ubiB7CiAJc3RydWN0IGhjaV9jb25uCSpoY29uOworCXN0cnVjdCBoY2lfY2hhbgkqaGNoYW47CiAKIAliZGFkZHJfdAkqZHN0OwogCWJkYWRkcl90CSpzcmM7CkBAIC00NDUsNiArNTY0LDkgQEAKIAlDT05GX0NPTk5FQ1RfUEVORCwKIAlDT05GX05PX0ZDU19SRUNWLAogCUNPTkZfU1RBVEUyX0RFVklDRSwKKwlDT05GX0VXU19SRUNWLAorCUNPTkZfTE9DX0NPTkZfUEVORCwKKwlDT05GX1JFTV9DT05GX1BFTkQsCiB9OwogCiAjZGVmaW5lIEwyQ0FQX0NPTkZfTUFYX0NPTkZfUkVRIDIKQEAgLTQ2Miw2ICs1ODQsMTYgQEAKIAlDT05OX1JOUl9TRU5ULAogfTsKIAorLyogRGVmaW5pdGlvbnMgZm9yIGZsYWdzIGluIGwyY2FwX2NoYW4gKi8KK2VudW0geworCUZMQUdfUk9MRV9TV0lUQ0gsCisJRkxBR19GT1JDRV9BQ1RJVkUsCisJRkxBR19GT1JDRV9SRUxJQUJMRSwKKwlGTEFHX0ZMVVNIQUJMRSwKKwlGTEFHX0VYVF9DVFJMLAorCUZMQUdfRUZTX0VOQUJMRSwKK307CisKICNkZWZpbmUgX19zZXRfY2hhbl90aW1lcihjLCB0KSBsMmNhcF9zZXRfdGltZXIoYywgJmMtPmNoYW5fdGltZXIsICh0KSkKICNkZWZpbmUgX19jbGVhcl9jaGFuX3RpbWVyKGMpIGwyY2FwX2NsZWFyX3RpbWVyKGMsICZjLT5jaGFuX3RpbWVyKQogI2RlZmluZSBfX3NldF9yZXRyYW5zX3RpbWVyKGMpIGwyY2FwX3NldF90aW1lcihjLCAmYy0+cmV0cmFuc190aW1lciwgXApAQCAtNDc0LDYgKzYwNiwyMiBAQAogCQlMMkNBUF9ERUZBVUxUX0FDS19UTyk7CiAjZGVmaW5lIF9fY2xlYXJfYWNrX3RpbWVyKGMpIGwyY2FwX2NsZWFyX3RpbWVyKGMsICZjLT5hY2tfdGltZXIpCiAKK3N0YXRpYyBpbmxpbmUgaW50IF9fc2VxX29mZnNldChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MTYgc2VxMSwgX191MTYgc2VxMikKK3sKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gKHNlcTEgLSBzZXEyKSAlIChjaGFuLT50eF93aW5fbWF4ICsgMSk7CisJaWYgKG9mZnNldCA8IDApCisJCW9mZnNldCArPSAoY2hhbi0+dHhfd2luX21heCArIDEpOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSBfX3UxNiBfX25leHRfc2VxKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX3UxNiBzZXEpCit7CisJcmV0dXJuIChzZXEgKyAxKSAlIChjaGFuLT50eF93aW5fbWF4ICsgMSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGwyY2FwX3R4X3dpbmRvd19mdWxsKHN0cnVjdCBsMmNhcF9jaGFuICpjaCkKIHsKIAlpbnQgc3ViOwpAQCAtNDg2LDEzICs2MzQsMTY1IEBACiAJcmV0dXJuIHN1YiA9PSBjaC0+cmVtb3RlX3R4X3dpbjsKIH0KIAotI2RlZmluZSBfX2dldF90eHNlcShjdHJsKQkoKChjdHJsKSAmIEwyQ0FQX0NUUkxfVFhTRVEpID4+IDEpCi0jZGVmaW5lIF9fZ2V0X3JlcXNlcShjdHJsKQkoKChjdHJsKSAmIEwyQ0FQX0NUUkxfUkVRU0VRKSA+PiA4KQotI2RlZmluZSBfX2lzX2lmcmFtZShjdHJsKQkoISgoY3RybCkgJiBMMkNBUF9DVFJMX0ZSQU1FX1RZUEUpKQotI2RlZmluZSBfX2lzX3NmcmFtZShjdHJsKQkoKGN0cmwpICYgTDJDQVBfQ1RSTF9GUkFNRV9UWVBFKQotI2RlZmluZSBfX2lzX3Nhcl9zdGFydChjdHJsKQkoKChjdHJsKSAmIEwyQ0FQX0NUUkxfU0FSKSA9PSBMMkNBUF9TRFVfU1RBUlQpCitzdGF0aWMgaW5saW5lIF9fdTE2IF9fZ2V0X3JlcXNlcShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgY3RybCkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIChjdHJsICYgTDJDQVBfRVhUX0NUUkxfUkVRU0VRKSA+PgorCQkJCQkJTDJDQVBfRVhUX0NUUkxfUkVRU0VRX1NISUZUOworCWVsc2UKKwkJcmV0dXJuIChjdHJsICYgTDJDQVBfQ1RSTF9SRVFTRVEpID4+IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fc2V0X3JlcXNlcShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgcmVxc2VxKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gKHJlcXNlcSA8PCBMMkNBUF9FWFRfQ1RSTF9SRVFTRVFfU0hJRlQpICYKKwkJCQkJCQlMMkNBUF9FWFRfQ1RSTF9SRVFTRVE7CisJZWxzZQorCQlyZXR1cm4gKHJlcXNlcSA8PCBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVCkgJiBMMkNBUF9DVFJMX1JFUVNFUTsKK30KKworc3RhdGljIGlubGluZSBfX3UxNiBfX2dldF90eHNlcShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgY3RybCkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIChjdHJsICYgTDJDQVBfRVhUX0NUUkxfVFhTRVEpID4+CisJCQkJCQlMMkNBUF9FWFRfQ1RSTF9UWFNFUV9TSElGVDsKKwllbHNlCisJCXJldHVybiAoY3RybCAmIEwyQ0FQX0NUUkxfVFhTRVEpID4+IEwyQ0FQX0NUUkxfVFhTRVFfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MzIgX19zZXRfdHhzZXEoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIF9fdTMyIHR4c2VxKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gKHR4c2VxIDw8IEwyQ0FQX0VYVF9DVFJMX1RYU0VRX1NISUZUKSAmCisJCQkJCQkJTDJDQVBfRVhUX0NUUkxfVFhTRVE7CisJZWxzZQorCQlyZXR1cm4gKHR4c2VxIDw8IEwyQ0FQX0NUUkxfVFhTRVFfU0hJRlQpICYgTDJDQVBfQ1RSTF9UWFNFUTsKK30KKworc3RhdGljIGlubGluZSBib29sIF9faXNfc2ZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX3UzMiBjdHJsKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gY3RybCAmIEwyQ0FQX0VYVF9DVFJMX0ZSQU1FX1RZUEU7CisJZWxzZQorCQlyZXR1cm4gY3RybCAmIEwyQ0FQX0NUUkxfRlJBTUVfVFlQRTsKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBfX3NldF9zZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCit7CisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCXJldHVybiBMMkNBUF9FWFRfQ1RSTF9GUkFNRV9UWVBFOworCWVsc2UKKwkJcmV0dXJuIEwyQ0FQX0NUUkxfRlJBTUVfVFlQRTsKK30KKworc3RhdGljIGlubGluZSBfX3U4IF9fZ2V0X2N0cmxfc2FyKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX3UzMiBjdHJsKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gKGN0cmwgJiBMMkNBUF9FWFRfQ1RSTF9TQVIpID4+IEwyQ0FQX0VYVF9DVFJMX1NBUl9TSElGVDsKKwllbHNlCisJCXJldHVybiAoY3RybCAmIEwyQ0FQX0NUUkxfU0FSKSA+PiBMMkNBUF9DVFJMX1NBUl9TSElGVDsKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBfX3NldF9jdHJsX3NhcihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgc2FyKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gKHNhciA8PCBMMkNBUF9FWFRfQ1RSTF9TQVJfU0hJRlQpICYgTDJDQVBfRVhUX0NUUkxfU0FSOworCWVsc2UKKwkJcmV0dXJuIChzYXIgPDwgTDJDQVBfQ1RSTF9TQVJfU0hJRlQpICYgTDJDQVBfQ1RSTF9TQVI7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2lzX3Nhcl9zdGFydChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgY3RybCkKK3sKKwlyZXR1cm4gX19nZXRfY3RybF9zYXIoY2hhbiwgY3RybCkgPT0gTDJDQVBfU0FSX1NUQVJUOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fZ2V0X3Nhcl9tYXNrKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gTDJDQVBfRVhUX0NUUkxfU0FSOworCWVsc2UKKwkJcmV0dXJuIEwyQ0FQX0NUUkxfU0FSOworfQorCitzdGF0aWMgaW5saW5lIF9fdTggX19nZXRfY3RybF9zdXBlcihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgY3RybCkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIChjdHJsICYgTDJDQVBfRVhUX0NUUkxfU1VQRVJWSVNFKSA+PgorCQkJCQkJTDJDQVBfRVhUX0NUUkxfU1VQRVJfU0hJRlQ7CisJZWxzZQorCQlyZXR1cm4gKGN0cmwgJiBMMkNBUF9DVFJMX1NVUEVSVklTRSkgPj4gTDJDQVBfQ1RSTF9TVVBFUl9TSElGVDsKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBfX3NldF9jdHJsX3N1cGVyKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX3UzMiBzdXBlcikKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIChzdXBlciA8PCBMMkNBUF9FWFRfQ1RSTF9TVVBFUl9TSElGVCkgJgorCQkJCQkJTDJDQVBfRVhUX0NUUkxfU1VQRVJWSVNFOworCWVsc2UKKwkJcmV0dXJuIChzdXBlciA8PCBMMkNBUF9DVFJMX1NVUEVSX1NISUZUKSAmCisJCQkJCQkJTDJDQVBfQ1RSTF9TVVBFUlZJU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MzIgX19zZXRfY3RybF9maW5hbChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIEwyQ0FQX0VYVF9DVFJMX0ZJTkFMOworCWVsc2UKKwkJcmV0dXJuIEwyQ0FQX0NUUkxfRklOQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2lzX2N0cmxfZmluYWwoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIF9fdTMyIGN0cmwpCit7CisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCXJldHVybiBjdHJsICYgTDJDQVBfRVhUX0NUUkxfRklOQUw7CisJZWxzZQorCQlyZXR1cm4gY3RybCAmIEwyQ0FQX0NUUkxfRklOQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MzIgX19zZXRfY3RybF9wb2xsKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gTDJDQVBfRVhUX0NUUkxfUE9MTDsKKwllbHNlCisJCXJldHVybiBMMkNBUF9DVFJMX1BPTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2lzX2N0cmxfcG9sbChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgY3RybCkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIGN0cmwgJiBMMkNBUF9FWFRfQ1RSTF9QT0xMOworCWVsc2UKKwkJcmV0dXJuIGN0cmwgJiBMMkNBUF9DVFJMX1BPTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MzIgX19nZXRfY29udHJvbChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdm9pZCAqcCkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIGdldF91bmFsaWduZWRfbGUzMihwKTsKKwllbHNlCisJCXJldHVybiBnZXRfdW5hbGlnbmVkX2xlMTYocCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B1dF9jb250cm9sKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX3UzMiBjb250cm9sLAorCQkJCQkJCQl2b2lkICpwKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gcHV0X3VuYWxpZ25lZF9sZTMyKGNvbnRyb2wsIHApOworCWVsc2UKKwkJcmV0dXJuIHB1dF91bmFsaWduZWRfbGUxNihjb250cm9sLCBwKTsKK30KKworc3RhdGljIGlubGluZSBfX3U4IF9fY3RybF9zaXplKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gTDJDQVBfRVhUX0hEUl9TSVpFIC0gTDJDQVBfSERSX1NJWkU7CisJZWxzZQorCQlyZXR1cm4gTDJDQVBfRU5IX0hEUl9TSVpFIC0gTDJDQVBfSERSX1NJWkU7Cit9CiAKIGV4dGVybiBpbnQgZGlzYWJsZV9lcnRtOworZXh0ZXJuIGludCBlbmFibGVfaHM7CiAKIGludCBsMmNhcF9pbml0X3NvY2tldHModm9pZCk7CiB2b2lkIGwyY2FwX2NsZWFudXBfc29ja2V0cyh2b2lkKTsKQEAgLTUwNyw3ICs4MDcsOCBAQAogdm9pZCBsMmNhcF9jaGFuX2Nsb3NlKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBpbnQgcmVhc29uKTsKIHZvaWQgbDJjYXBfY2hhbl9kZXN0cm95KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKTsKIGludCBsMmNhcF9jaGFuX2Nvbm5lY3Qoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pOwotaW50IGwyY2FwX2NoYW5fc2VuZChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKK2ludCBsMmNhcF9jaGFuX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCQkJCQkJdTMyIHByaW9yaXR5KTsKIHZvaWQgbDJjYXBfY2hhbl9idXN5KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBpbnQgYnVzeSk7CiAKICNlbmRpZiAvKiBfX0wyQ0FQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oCmluZGV4IGQ2NmRhMGYuLjNlMzIwYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaApAQCAtNjksNiArNjksMTAgQEAKICNkZWZpbmUgTUdNVF9PUF9TRVRfUE9XRVJFRAkJMHgwMDA1CiAKICNkZWZpbmUgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFCTB4MDAwNgorc3RydWN0IG1nbXRfY3Bfc2V0X2Rpc2NvdmVyYWJsZSB7CisJX191OCB2YWw7CisJX191MTYgdGltZW91dDsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUJCTB4MDAwNwogCkBAIC05NiwyNCArMTAwLDIyIEBACiAJX191OCBlbmFibGU7CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgbWdtdF9rZXlfaW5mbyB7CitzdHJ1Y3QgbWdtdF9saW5rX2tleV9pbmZvIHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJdTggdHlwZTsKIAl1OCB2YWxbMTZdOwogCXU4IHBpbl9sZW47Ci0JdTggZGxlbjsKLQl1OCBkYXRhWzBdOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBNR01UX09QX0xPQURfS0VZUwkJMHgwMDBECi1zdHJ1Y3QgbWdtdF9jcF9sb2FkX2tleXMgeworI2RlZmluZSBNR01UX09QX0xPQURfTElOS19LRVlTCQkweDAwMEQKK3N0cnVjdCBtZ210X2NwX2xvYWRfbGlua19rZXlzIHsKIAlfX3U4IGRlYnVnX2tleXM7CiAJX19sZTE2IGtleV9jb3VudDsKLQlzdHJ1Y3QgbWdtdF9rZXlfaW5mbyBrZXlzWzBdOworCXN0cnVjdCBtZ210X2xpbmtfa2V5X2luZm8ga2V5c1swXTsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTUdNVF9PUF9SRU1PVkVfS0VZCQkweDAwMEUKLXN0cnVjdCBtZ210X2NwX3JlbW92ZV9rZXkgeworI2RlZmluZSBNR01UX09QX1JFTU9WRV9LRVlTCQkweDAwMEUKK3N0cnVjdCBtZ210X2NwX3JlbW92ZV9rZXlzIHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCBkaXNjb25uZWN0OwogfSBfX3BhY2tlZDsKQEAgLTEyNiwxMCArMTI4LDIwIEBACiAJYmRhZGRyX3QgYmRhZGRyOwogfSBfX3BhY2tlZDsKIAorI2RlZmluZSBNR01UX0FERFJfQlJFRFIJCQkweDAwCisjZGVmaW5lIE1HTVRfQUREUl9MRQkJCTB4MDEKKyNkZWZpbmUgTUdNVF9BRERSX0JSRURSX0xFCQkweDAyCisjZGVmaW5lIE1HTVRfQUREUl9JTlZBTElECQkweGZmCisKK3N0cnVjdCBtZ210X2FkZHJfaW5mbyB7CisJYmRhZGRyX3QgYmRhZGRyOworCV9fdTggdHlwZTsKK30gX19wYWNrZWQ7CisKICNkZWZpbmUgTUdNVF9PUF9HRVRfQ09OTkVDVElPTlMJCTB4MDAxMAogc3RydWN0IG1nbXRfcnBfZ2V0X2Nvbm5lY3Rpb25zIHsKIAlfX2xlMTYgY29ubl9jb3VudDsKLQliZGFkZHJfdCBjb25uWzBdOworCXN0cnVjdCBtZ210X2FkZHJfaW5mbyBhZGRyWzBdOwogfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNR01UX09QX1BJTl9DT0RFX1JFUExZCQkweDAwMTEKQEAgLTI0NSwyNiArMjU3LDE5IEBACiAKICNkZWZpbmUgTUdNVF9FVl9QQUlSQUJMRQkJMHgwMDA5CiAKLSNkZWZpbmUgTUdNVF9FVl9ORVdfS0VZCQkJMHgwMDBBCi1zdHJ1Y3QgbWdtdF9ldl9uZXdfa2V5IHsKKyNkZWZpbmUgTUdNVF9FVl9ORVdfTElOS19LRVkJCTB4MDAwQQorc3RydWN0IG1nbXRfZXZfbmV3X2xpbmtfa2V5IHsKIAlfX3U4IHN0b3JlX2hpbnQ7Ci0Jc3RydWN0IG1nbXRfa2V5X2luZm8ga2V5OworCXN0cnVjdCBtZ210X2xpbmtfa2V5X2luZm8ga2V5OwogfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNR01UX0VWX0NPTk5FQ1RFRAkJMHgwMDBCCi1zdHJ1Y3QgbWdtdF9ldl9jb25uZWN0ZWQgewotCWJkYWRkcl90IGJkYWRkcjsKLQlfX3U4IGxpbmtfdHlwZTsKLX0gX19wYWNrZWQ7CiAKICNkZWZpbmUgTUdNVF9FVl9ESVNDT05ORUNURUQJCTB4MDAwQwotc3RydWN0IG1nbXRfZXZfZGlzY29ubmVjdGVkIHsKLQliZGFkZHJfdCBiZGFkZHI7Ci19IF9fcGFja2VkOwogCiAjZGVmaW5lIE1HTVRfRVZfQ09OTkVDVF9GQUlMRUQJCTB4MDAwRAogc3RydWN0IG1nbXRfZXZfY29ubmVjdF9mYWlsZWQgewotCWJkYWRkcl90IGJkYWRkcjsKKwlzdHJ1Y3QgbWdtdF9hZGRyX2luZm8gYWRkcjsKIAlfX3U4IHN0YXR1czsKIH0gX19wYWNrZWQ7CiAKQEAgLTI5NCw3ICsyOTksNyBAQAogCiAjZGVmaW5lIE1HTVRfRVZfREVWSUNFX0ZPVU5ECQkweDAwMTIKIHN0cnVjdCBtZ210X2V2X2RldmljZV9mb3VuZCB7Ci0JYmRhZGRyX3QgYmRhZGRyOworCXN0cnVjdCBtZ210X2FkZHJfaW5mbyBhZGRyOwogCV9fdTggZGV2X2NsYXNzWzNdOwogCV9fczggcnNzaTsKIAlfX3U4IGVpcltIQ0lfTUFYX0VJUl9MRU5HVEhdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKaW5kZXggOTU4NTJlMy4uZjBlODJiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCkBAIC0zOTEsNiArMzkxLDggQEAKICAqIEBhc3NvY3Jlc3BfaWVzOiBleHRyYSBpbmZvcm1hdGlvbiBlbGVtZW50KHMpIHRvIGFkZCBpbnRvIChSZSlBc3NvY2lhdGlvbgogICoJUmVzcG9uc2UgZnJhbWVzIG9yICVOVUxMCiAgKiBAYXNzb2NyZXNwX2llc19sZW46IGxlbmd0aCBvZiBhc3NvY3Jlc3BfaWVzIGluIG9jdGV0cworICogQHByb2JlX3Jlc3BfbGVuOiBsZW5ndGggb2YgcHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUgKEBwcm9iZV9yZXNwKQorICogQHByb2JlX3Jlc3A6IHByb2JlIHJlc3BvbnNlIHRlbXBsYXRlIChBUCBtb2RlIG9ubHkpCiAgKi8KIHN0cnVjdCBiZWFjb25fcGFyYW1ldGVycyB7CiAJdTggKmhlYWQsICp0YWlsOwpAQCAtNDA4LDYgKzQxMCw4IEBACiAJc2l6ZV90IHByb2JlcmVzcF9pZXNfbGVuOwogCWNvbnN0IHU4ICphc3NvY3Jlc3BfaWVzOwogCXNpemVfdCBhc3NvY3Jlc3BfaWVzX2xlbjsKKwlpbnQgcHJvYmVfcmVzcF9sZW47CisJdTggKnByb2JlX3Jlc3A7CiB9OwogCiAvKioKQEAgLTc3OCw2ICs3ODIsNyBAQAogCXUxNiBtaW5fZGlzY292ZXJ5X3RpbWVvdXQ7CiAJdTMyIGRvdDExTWVzaEhXTVBhY3RpdmVQYXRoVGltZW91dDsKIAl1MTYgZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbDsKKwl1MTYgZG90MTFNZXNoSFdNUHBlcnJNaW5JbnRlcnZhbDsKIAl1MTYgZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZTsKIAl1OCAgZG90MTFNZXNoSFdNUFJvb3RNb2RlOwogCXUxNiBkb3QxMU1lc2hIV01QUmFubkludGVydmFsOwpAQCAtNzk4LDYgKzgwMyw3IEBACiAgKiBAaWVfbGVuOiBsZW5ndGggb2YgdmVuZG9yIGluZm9ybWF0aW9uIGVsZW1lbnRzCiAgKiBAaXNfYXV0aGVudGljYXRlZDogdGhpcyBtZXNoIHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uCiAgKiBAaXNfc2VjdXJlOiB0aGlzIG1lc2ggdXNlcyBzZWN1cml0eQorICogQG1jYXN0X3JhdGU6IG11bHRpY2F0IHJhdGUgZm9yIE1lc2ggTm9kZSBbNk1icHMgaXMgdGhlIGRlZmF1bHQgZm9yIDgwMi4xMWFdCiAgKgogICogVGhlc2UgcGFyYW1ldGVycyBhcmUgZml4ZWQgd2hlbiB0aGUgbWVzaCBpcyBjcmVhdGVkLgogICovCkBAIC04MTAsNiArODE2LDcgQEAKIAl1OCBpZV9sZW47CiAJYm9vbCBpc19hdXRoZW50aWNhdGVkOwogCWJvb2wgaXNfc2VjdXJlOworCWludCBtY2FzdF9yYXRlW0lFRUU4MDIxMV9OVU1fQkFORFNdOwogfTsKIAogLyoqCkBAIC0xMDQwLDYgKzEwNDcsMTUgQEAKIH07CiAKIC8qKgorICogZW51bSBjZmc4MDIxMV9hc3NvY19yZXFfZmxhZ3MgLSBPdmVyLXJpZGUgZGVmYXVsdCBiZWhhdmlvdXIgaW4gYXNzb2NpYXRpb24uCisgKgorICogQEFTU09DX1JFUV9ESVNBQkxFX0hUOiAgRGlzYWJsZSBIVCAoODAyLjExbikKKyAqLworZW51bSBjZmc4MDIxMV9hc3NvY19yZXFfZmxhZ3MgeworCUFTU09DX1JFUV9ESVNBQkxFX0hUCQk9IEJJVCgwKSwKK307CisKKy8qKgogICogc3RydWN0IGNmZzgwMjExX2Fzc29jX3JlcXVlc3QgLSAoUmUpQXNzb2NpYXRpb24gcmVxdWVzdCBkYXRhCiAgKgogICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNvbXBsZXRlIElFRUUgODAyLjExCkBAIC0xMDUwLDYgKzEwNjYsMTAgQEAKICAqIEB1c2VfbWZwOiBVc2UgbWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIChJRUVFIDgwMi4xMXcpIGluIHRoaXMgYXNzb2NpYXRpb24KICAqIEBjcnlwdG86IGNyeXB0byBzZXR0aW5ncwogICogQHByZXZfYnNzaWQ6IHByZXZpb3VzIEJTU0lELCBpZiBub3QgJU5VTEwgdXNlIHJlYXNzb2NpYXRlIGZyYW1lCisgKiBAZmxhZ3M6ICBTZWUgJmVudW0gY2ZnODAyMTFfYXNzb2NfcmVxX2ZsYWdzCisgKiBAaHRfY2FwYTogIEhUIENhcGFiaWxpdGllcyBvdmVyLXJpZGVzLiAgVmFsdWVzIHNldCBpbiBodF9jYXBhX21hc2sKKyAqICAgd2lsbCBiZSB1c2VkIGluIGh0X2NhcGEuICBVbi1zdXBwb3J0ZWQgdmFsdWVzIHdpbGwgYmUgaWdub3JlZC4KKyAqIEBodF9jYXBhX21hc2s6ICBUaGUgYml0cyBvZiBodF9jYXBhIHdoaWNoIGFyZSB0byBiZSB1c2VkLgogICovCiBzdHJ1Y3QgY2ZnODAyMTFfYXNzb2NfcmVxdWVzdCB7CiAJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwpAQCAtMTA1Nyw2ICsxMDc3LDkgQEAKIAlzaXplX3QgaWVfbGVuOwogCXN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgY3J5cHRvOwogCWJvb2wgdXNlX21mcDsKKwl1MzIgZmxhZ3M7CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwYTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXBhX21hc2s7CiB9OwogCiAvKioKQEAgLTExNTUsNiArMTE3OCwxMCBAQAogICogQGtleV9sZW46IGxlbmd0aCBvZiBXRVAga2V5IGZvciBzaGFyZWQga2V5IGF1dGhlbnRpY2F0aW9uCiAgKiBAa2V5X2lkeDogaW5kZXggb2YgV0VQIGtleSBmb3Igc2hhcmVkIGtleSBhdXRoZW50aWNhdGlvbgogICogQGtleTogV0VQIGtleSBmb3Igc2hhcmVkIGtleSBhdXRoZW50aWNhdGlvbgorICogQGZsYWdzOiAgU2VlICZlbnVtIGNmZzgwMjExX2Fzc29jX3JlcV9mbGFncworICogQGh0X2NhcGE6ICBIVCBDYXBhYmlsaXRpZXMgb3Zlci1yaWRlcy4gIFZhbHVlcyBzZXQgaW4gaHRfY2FwYV9tYXNrCisgKiAgIHdpbGwgYmUgdXNlZCBpbiBodF9jYXBhLiAgVW4tc3VwcG9ydGVkIHZhbHVlcyB3aWxsIGJlIGlnbm9yZWQuCisgKiBAaHRfY2FwYV9tYXNrOiAgVGhlIGJpdHMgb2YgaHRfY2FwYSB3aGljaCBhcmUgdG8gYmUgdXNlZC4KICAqLwogc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CkBAIC0xMTY4LDYgKzExOTUsOSBAQAogCXN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgY3J5cHRvOwogCWNvbnN0IHU4ICprZXk7CiAJdTgga2V5X2xlbiwga2V5X2lkeDsKKwl1MzIgZmxhZ3M7CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwYTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXBhX21hc2s7CiB9OwogCiAvKioKQEAgLTEzNDIsNiArMTM3Miw5IEBACiAgKglkb2Vzbid0IHZlcmlmeSBtdWNoLiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSBwYXNzZWQgbmV0ZGV2IG1heSBiZQogICoJJU5VTEwgYXMgd2VsbCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgY2hhbmdpbmcgdGhlIGNoYW5uZWwgZm9yIHRoZQogICoJZGV2aWNlIGl0c2VsZiwgb3IgZm9yIGEgbW9uaXRvciBpbnRlcmZhY2UuCisgKiBAZ2V0X2NoYW5uZWw6IEdldCB0aGUgY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbCwgc2hvdWxkIHJldHVybiAlTlVMTCBpZgorICoJdGhlcmUncyBubyBzaW5nbGUgZGVmaW5lZCBvcGVyYXRpbmcgY2hhbm5lbCBpZiBmb3IgZXhhbXBsZSB0aGUKKyAqCWRldmljZSBpbXBsZW1lbnRzIGNoYW5uZWwgaG9wcGluZyBmb3IgbXVsdGktY2hhbm5lbCB2aXJ0dWFsIGludGVyZmFjZXMuCiAgKgogICogQHNjYW46IFJlcXVlc3QgdG8gZG8gYSBzY2FuLiBJZiByZXR1cm5pbmcgemVybywgdGhlIHNjYW4gcmVxdWVzdCBpcyBnaXZlbgogICoJdGhlIGRyaXZlciwgYW5kIHdpbGwgYmUgdmFsaWQgdW50aWwgcGFzc2VkIHRvIGNmZzgwMjExX3NjYW5fZG9uZSgpLgpAQCAtMTM2OSw3ICsxNDAyLDggQEAKICAqCWhhdmUgY2hhbmdlZC4gVGhlIGFjdHVhbCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBhdmFpbGFibGUgaW4KICAqCXN0cnVjdCB3aXBoeS4gSWYgcmV0dXJuaW5nIGFuIGVycm9yLCBubyB2YWx1ZSBzaG91bGQgYmUgY2hhbmdlZC4KICAqCi0gKiBAc2V0X3R4X3Bvd2VyOiBzZXQgdGhlIHRyYW5zbWl0IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycworICogQHNldF90eF9wb3dlcjogc2V0IHRoZSB0cmFuc21pdCBwb3dlciBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMsCisgKgl0aGUgcG93ZXIgcGFzc2VkIGlzIGluIG1CbSwgdG8gZ2V0IGRCbSB1c2UgTUJNX1RPX0RCTSgpLgogICogQGdldF90eF9wb3dlcjogc3RvcmUgdGhlIGN1cnJlbnQgVFggcG93ZXIgaW50byB0aGUgZGJtIHZhcmlhYmxlOwogICoJcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bAogICoKQEAgLTE0MzIsNiArMTQ2NiwxMSBAQAogICoKICAqIEB0ZGxzX21nbXQ6IFRyYW5zbWl0IGEgVERMUyBtYW5hZ2VtZW50IGZyYW1lLgogICogQHRkbHNfb3BlcjogUGVyZm9ybSBhIGhpZ2gtbGV2ZWwgVERMUyBvcGVyYXRpb24gKGUuZy4gVERMUyBsaW5rIHNldHVwKS4KKyAqCisgKiBAcHJvYmVfY2xpZW50OiBwcm9iZSBhbiBhc3NvY2lhdGVkIGNsaWVudCwgbXVzdCByZXR1cm4gYSBjb29raWUgdGhhdCBpdAorICoJbGF0ZXIgcGFzc2VzIHRvIGNmZzgwMjExX3Byb2JlX3N0YXR1cygpLgorICoKKyAqIEBzZXRfbm9hY2tfbWFwOiBTZXQgdGhlIE5vQWNrIE1hcCBmb3IgdGhlIFRJRHMuCiAgKi8KIHN0cnVjdCBjZmc4MDIxMV9vcHMgewogCWludAkoKnN1c3BlbmQpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdyk7CkBAIC0xNTg1LDcgKzE2MjQsNyBAQAogCQkJICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKIAkJCSAgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsIHVuc2lnbmVkIGludCB3YWl0LAogCQkJICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBib29sIG5vX2NjaywKLQkJCSAgdTY0ICpjb29raWUpOworCQkJICBib29sIGRvbnRfd2FpdF9mb3JfYWNrLCB1NjQgKmNvb2tpZSk7CiAJaW50CSgqbWdtdF90eF9jYW5jZWxfd2FpdCkoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgICAgdTY0IGNvb2tpZSk7CkBAIC0xNjIxLDYgKzE2NjAsMTUgQEAKIAkJCSAgICAgdTE2IHN0YXR1c19jb2RlLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKIAlpbnQJKCp0ZGxzX29wZXIpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHU4ICpwZWVyLCBlbnVtIG5sODAyMTFfdGRsc19vcGVyYXRpb24gb3Blcik7CisKKwlpbnQJKCpwcm9iZV9jbGllbnQpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJY29uc3QgdTggKnBlZXIsIHU2NCAqY29va2llKTsKKworCWludAkoKnNldF9ub2Fja19tYXApKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgdTE2IG5vYWNrX21hcCk7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKigqZ2V0X2NoYW5uZWwpKHN0cnVjdCB3aXBoeSAqd2lwaHkpOwogfTsKIAogLyoKQEAgLTE2NzksNiArMTcyNywxNCBAQAogICoJdGVhcmRvd24gcGFja2V0cyBzaG91bGQgYmUgc2VudCB0aHJvdWdoIHRoZSBATkw4MDIxMV9DTURfVERMU19NR01UCiAgKgljb21tYW5kLiBXaGVuIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBATkw4MDIxMV9DTURfVERMU19PUEVSIHNob3VsZCBiZQogICoJdXNlZCBmb3IgYXNraW5nIHRoZSBkcml2ZXIvZmlybXdhcmUgdG8gcGVyZm9ybSBhIFRETFMgb3BlcmF0aW9uLgorICogQFdJUEhZX0ZMQUdfSEFWRV9BUF9TTUU6IGRldmljZSBpbnRlZ3JhdGVzIEFQIFNNRQorICogQFdJUEhZX0ZMQUdfUkVQT1JUU19PQlNTOiB0aGUgZGV2aWNlIHdpbGwgcmVwb3J0IGJlYWNvbnMgZnJvbSBvdGhlciBCU1NlcworICoJd2hlbiB0aGVyZSBhcmUgdmlydHVhbCBpbnRlcmZhY2VzIGluIEFQIG1vZGUgYnkgY2FsbGluZworICoJY2ZnODAyMTFfcmVwb3J0X29ic3NfYmVhY29uKCkuCisgKiBAV0lQSFlfRkxBR19BUF9QUk9CRV9SRVNQX09GRkxPQUQ6IFdoZW4gb3BlcmF0aW5nIGFzIGFuIEFQLCB0aGUgZGV2aWNlCisgKglyZXNwb25kcyB0byBwcm9iZS1yZXF1ZXN0cyBpbiBoYXJkd2FyZS4KKyAqIEBXSVBIWV9GTEFHX09GRkNIQU5fVFg6IERldmljZSBzdXBwb3J0cyBkaXJlY3Qgb2ZmLWNoYW5uZWwgVFguCisgKiBAV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUw6IERldmljZSBzdXBwb3J0cyByZW1haW4tb24tY2hhbm5lbCBjYWxsLgogICovCiBlbnVtIHdpcGh5X2ZsYWdzIHsKIAlXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZCQk9IEJJVCgwKSwKQEAgLTE2OTcsNiArMTc1MywxMSBAQAogCVdJUEhZX0ZMQUdfQVBfVUFQU0QJCQk9IEJJVCgxNCksCiAJV0lQSFlfRkxBR19TVVBQT1JUU19URExTCQk9IEJJVCgxNSksCiAJV0lQSFlfRkxBR19URExTX0VYVEVSTkFMX1NFVFVQCQk9IEJJVCgxNiksCisJV0lQSFlfRkxBR19IQVZFX0FQX1NNRQkJCT0gQklUKDE3KSwKKwlXSVBIWV9GTEFHX1JFUE9SVFNfT0JTUwkJCT0gQklUKDE4KSwKKwlXSVBIWV9GTEFHX0FQX1BST0JFX1JFU1BfT0ZGTE9BRAk9IEJJVCgxOSksCisJV0lQSFlfRkxBR19PRkZDSEFOX1RYCQkJPSBCSVQoMjApLAorCVdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMCT0gQklUKDIxKSwKIH07CiAKIC8qKgpAQCAtMTg2OSw2ICsxOTMwLDcgQEAKICAqIEBzb2Z0d2FyZV9pZnR5cGVzOiBiaXRtYXNrIG9mIHNvZnR3YXJlIGludGVyZmFjZSB0eXBlcywgdGhlc2UgYXJlIG5vdAogICoJc3ViamVjdCB0byBhbnkgcmVzdHJpY3Rpb25zIHNpbmNlIHRoZXkgYXJlIHB1cmVseSBtYW5hZ2VkIGluIFNXLgogICogQGZsYWdzOiB3aXBoeSBmbGFncywgc2VlICZlbnVtIHdpcGh5X2ZsYWdzCisgKiBAZmVhdHVyZXM6IGZlYXR1cmVzIGFkdmVydGlzZWQgdG8gbmw4MDIxMSwgc2VlICZlbnVtIG5sODAyMTFfZmVhdHVyZV9mbGFncy4KICAqIEBic3NfcHJpdl9zaXplOiBlYWNoIEJTUyBzdHJ1Y3QgaGFzIHByaXZhdGUgZGF0YSBhbGxvY2F0ZWQgd2l0aCBpdCwKICAqCXRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyBpdHMgc2l6ZQogICogQG1heF9zY2FuX3NzaWRzOiBtYXhpbXVtIG51bWJlciBvZiBTU0lEcyB0aGUgZGV2aWNlIGNhbiBzY2FuIGZvciBpbgpAQCAtMTkwNyw2ICsxOTY5LDEwIEBACiAgKgltYXkgcmVxdWVzdCwgaWYgaW1wbGVtZW50ZWQuCiAgKgogICogQHdvd2xhbjogV29XTEFOIHN1cHBvcnQgaW5mb3JtYXRpb24KKyAqCisgKiBAYXBfc21lX2NhcGE6IEFQIFNNRSBjYXBhYmlsaXRpZXMsIGZsYWdzIGZyb20gJmVudW0gbmw4MDIxMV9hcF9zbWVfZmVhdHVyZXMuCisgKiBAaHRfY2FwYV9tb2RfbWFzazogIFNwZWNpZnkgd2hhdCBodF9jYXAgdmFsdWVzIGNhbiBiZSBvdmVyLXJpZGRlbi4KKyAqCUlmIG51bGwsIHRoZW4gbm9uZSBjYW4gYmUgb3Zlci1yaWRkZW4uCiAgKi8KIHN0cnVjdCB3aXBoeSB7CiAJLyogYXNzaWduIHRoZXNlIGZpZWxkcyBiZWZvcmUgeW91IHJlZ2lzdGVyIHRoZSB3aXBoeSAqLwpAQCAtMTkyOCw3ICsxOTk0LDkgQEAKIAkvKiBTdXBwb3J0ZWQgaW50ZXJmYWNlIG1vZGVzLCBPUiB0b2dldGhlciBCSVQoTkw4MDIxMV9JRlRZUEVfLi4uKSAqLwogCXUxNiBpbnRlcmZhY2VfbW9kZXM7CiAKLQl1MzIgZmxhZ3M7CisJdTMyIGZsYWdzLCBmZWF0dXJlczsKKworCXUzMiBhcF9zbWVfY2FwYTsKIAogCWVudW0gY2ZnODAyMTFfc2lnbmFsX3R5cGUgc2lnbmFsX3R5cGU7CiAKQEAgLTE5NjAsNiArMjAyOCwxMyBAQAogCXUzMiBhdmFpbGFibGVfYW50ZW5uYXNfdHg7CiAJdTMyIGF2YWlsYWJsZV9hbnRlbm5hc19yeDsKIAorCS8qCisJICogQml0bWFwIG9mIHN1cHBvcnRlZCBwcm90b2NvbHMgZm9yIHByb2JlIHJlc3BvbnNlIG9mZmxvYWRpbmcKKwkgKiBzZWUgJmVudW0gbmw4MDIxMV9wcm9iZV9yZXNwX29mZmxvYWRfc3VwcG9ydF9hdHRyLiBPbmx5IHZhbGlkCisJICogd2hlbiB0aGUgd2lwaHkgZmxhZyBAV0lQSFlfRkxBR19BUF9QUk9CRV9SRVNQX09GRkxPQUQgaXMgc2V0LgorCSAqLworCXUzMiBwcm9iZV9yZXNwX29mZmxvYWQ7CisKIAkvKiBJZiBtdWx0aXBsZSB3aXBoeXMgYXJlIHJlZ2lzdGVyZWQgYW5kIHlvdSdyZSBoYW5kZWQgZS5nLgogCSAqIGEgcmVndWxhciBuZXRkZXYgd2l0aCBhc3NpZ25lZCBpZWVlODAyMTFfcHRyLCB5b3Ugd29uJ3QKIAkgKiBrbm93IHdoZXRoZXIgaXQgcG9pbnRzIHRvIGEgd2lwaHkgeW91ciBkcml2ZXIgaGFzIHJlZ2lzdGVyZWQKQEAgLTE5ODcsNiArMjA2Miw4IEBACiAJLyogZGlyIGluIGRlYnVnZnM6IGllZWU4MDIxMS88d2lwaHluYW1lPiAqLwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNkaXI7CiAKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYV9tb2RfbWFzazsKKwogI2lmZGVmIENPTkZJR19ORVRfTlMKIAkvKiB0aGUgbmV0d29yayBuYW1lc3BhY2UgdGhpcyBwaHkgbGl2ZXMgaW4gY3VycmVudGx5ICovCiAJc3RydWN0IG5ldCAqX25ldDsKQEAgLTIxODMsNiArMjI2MCw4IEBACiAKIAlpbnQgYmVhY29uX2ludGVydmFsOwogCisJdTMyIGFwX3VuZXhwZWN0ZWRfbmxwaWQ7CisKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfV0VYVAogCS8qIHdleHQgZGF0YSAqLwogCXN0cnVjdCB7CkBAIC0yMzQ5LDY5ICsyNDI4LDYgQEAKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyWzZdOwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnJpZGdlX3R1bm5lbF9oZWFkZXJbNl07CiAKLS8qIFBhcnNlZCBJbmZvcm1hdGlvbiBFbGVtZW50cyAqLwotc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgewotCXU4ICppZV9zdGFydDsKLQlzaXplX3QgdG90YWxfbGVuOwotCi0JLyogcG9pbnRlcnMgdG8gSUVzICovCi0JdTggKnNzaWQ7Ci0JdTggKnN1cHBfcmF0ZXM7Ci0JdTggKmZoX3BhcmFtczsKLQl1OCAqZHNfcGFyYW1zOwotCXU4ICpjZl9wYXJhbXM7Ci0Jc3RydWN0IGllZWU4MDIxMV90aW1faWUgKnRpbTsKLQl1OCAqaWJzc19wYXJhbXM7Ci0JdTggKmNoYWxsZW5nZTsKLQl1OCAqd3BhOwotCXU4ICpyc247Ci0JdTggKmVycF9pbmZvOwotCXU4ICpleHRfc3VwcF9yYXRlczsKLQl1OCAqd21tX2luZm87Ci0JdTggKndtbV9wYXJhbTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwX2VsZW07Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9pbmZvICpodF9pbmZvX2VsZW07Ci0Jc3RydWN0IGllZWU4MDIxMV9tZXNoY29uZl9pZSAqbWVzaF9jb25maWc7Ci0JdTggKm1lc2hfaWQ7Ci0JdTggKnBlZXJpbmc7Ci0JdTggKnByZXE7Ci0JdTggKnByZXA7Ci0JdTggKnBlcnI7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYW5uX2llICpyYW5uOwotCXU4ICpjaF9zd2l0Y2hfZWxlbTsKLQl1OCAqY291bnRyeV9lbGVtOwotCXU4ICpwd3JfY29uc3RyX2VsZW07Ci0JdTggKnF1aWV0X2VsZW07CS8qIGZpcnN0IHF1aXRlIGVsZW1lbnQgKi8KLQl1OCAqdGltZW91dF9pbnQ7Ci0KLQkvKiBsZW5ndGggb2YgdGhlbSwgcmVzcGVjdGl2ZWx5ICovCi0JdTggc3NpZF9sZW47Ci0JdTggc3VwcF9yYXRlc19sZW47Ci0JdTggZmhfcGFyYW1zX2xlbjsKLQl1OCBkc19wYXJhbXNfbGVuOwotCXU4IGNmX3BhcmFtc19sZW47Ci0JdTggdGltX2xlbjsKLQl1OCBpYnNzX3BhcmFtc19sZW47Ci0JdTggY2hhbGxlbmdlX2xlbjsKLQl1OCB3cGFfbGVuOwotCXU4IHJzbl9sZW47Ci0JdTggZXJwX2luZm9fbGVuOwotCXU4IGV4dF9zdXBwX3JhdGVzX2xlbjsKLQl1OCB3bW1faW5mb19sZW47Ci0JdTggd21tX3BhcmFtX2xlbjsKLQl1OCBtZXNoX2lkX2xlbjsKLQl1OCBwZWVyaW5nX2xlbjsKLQl1OCBwcmVxX2xlbjsKLQl1OCBwcmVwX2xlbjsKLQl1OCBwZXJyX2xlbjsKLQl1OCBjaF9zd2l0Y2hfZWxlbV9sZW47Ci0JdTggY291bnRyeV9lbGVtX2xlbjsKLQl1OCBwd3JfY29uc3RyX2VsZW1fbGVuOwotCXU4IHF1aWV0X2VsZW1fbGVuOwotCXU4IG51bV9vZl9xdWlldF9lbGVtOwkvKiBjYW4gYmUgbW9yZSB0aGUgb25lICovCi0JdTggdGltZW91dF9pbnRfbGVuOwotfTsKLQogLyoqCiAgKiBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYiAtIGdldCBoZWFkZXIgbGVuZ3RoIGZyb20gZGF0YQogICoKQEAgLTI2MzYsOCArMjY1MiwxMCBAQAogICoKICAqIFRoaXMgaW5mb3JtcyBjZmc4MDIxMSB0aGF0IEJTUyBpbmZvcm1hdGlvbiB3YXMgZm91bmQgYW5kCiAgKiB0aGUgQlNTIHNob3VsZCBiZSB1cGRhdGVkL2FkZGVkLgorICoKKyAqIE5PVEU6IFJldHVybnMgYSByZWZlcmVuY2VkIHN0cnVjdCwgbXVzdCBiZSByZWxlYXNlZCB3aXRoIGNmZzgwMjExX3B1dF9ic3MoKSEKICAqLwotc3RydWN0IGNmZzgwMjExX2JzcyoKK3N0cnVjdCBjZmc4MDIxMV9ic3MgKiBfX211c3RfY2hlY2sKIGNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHNpemVfdCBsZW4sCkBAIC0yNjU5LDggKzI2NzcsMTAgQEAKICAqCiAgKiBUaGlzIGluZm9ybXMgY2ZnODAyMTEgdGhhdCBCU1MgaW5mb3JtYXRpb24gd2FzIGZvdW5kIGFuZAogICogdGhlIEJTUyBzaG91bGQgYmUgdXBkYXRlZC9hZGRlZC4KKyAqCisgKiBOT1RFOiBSZXR1cm5zIGEgcmVmZXJlbmNlZCBzdHJ1Y3QsIG11c3QgYmUgcmVsZWFzZWQgd2l0aCBjZmc4MDIxMV9wdXRfYnNzKCkhCiAgKi8KLXN0cnVjdCBjZmc4MDIxMV9ic3MqCitzdHJ1Y3QgY2ZnODAyMTFfYnNzICogX19tdXN0X2NoZWNrCiBjZmc4MDIxMV9pbmZvcm1fYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCiAJCSAgICBjb25zdCB1OCAqYnNzaWQsCkBAIC0zMTg5LDYgKzMyMDksNjQgQEAKIHZvaWQgY2ZnODAyMTFfcG1rc2FfY2FuZGlkYXRlX25vdGlmeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5kZXgsCiAJCQkJICAgICBjb25zdCB1OCAqYnNzaWQsIGJvb2wgcHJlYXV0aCwgZ2ZwX3QgZ2ZwKTsKIAorLyoqCisgKiBjZmc4MDIxMV9yeF9zcHVyaW91c19mcmFtZSAtIGluZm9ybSB1c2Vyc3BhY2UgYWJvdXQgYSBzcHVyaW91cyBmcmFtZQorICogQGRldjogVGhlIGRldmljZSB0aGUgZnJhbWUgbWF0Y2hlZCB0bworICogQGFkZHI6IHRoZSB0cmFuc21pdHRlciBhZGRyZXNzCisgKiBAZ2ZwOiBjb250ZXh0IGZsYWdzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEFQIG1vZGUgKG9ubHkhKSB0byBpbmZvcm0gdXNlcnNwYWNlIHRoYXQKKyAqIGEgc3B1cmlvdXMgY2xhc3MgMyBmcmFtZSB3YXMgcmVjZWl2ZWQsIHRvIGJlIGFibGUgdG8gZGVhdXRoIHRoZQorICogc2VuZGVyLgorICogUmV0dXJucyAldHJ1ZSBpZiB0aGUgZnJhbWUgd2FzIHBhc3NlZCB0byB1c2Vyc3BhY2UgKG9yIHRoaXMgZmFpbGVkCisgKiBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiBub3QgaGF2aW5nIGEgc3Vic2NyaXB0aW9uLikKKyAqLworYm9vbCBjZmc4MDIxMV9yeF9zcHVyaW91c19mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCWNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApOworCisvKioKKyAqIGNmZzgwMjExX3J4X3VuZXhwZWN0ZWRfNGFkZHJfZnJhbWUgLSBpbmZvcm0gYWJvdXQgdW5leHBlY3RlZCBXRFMgZnJhbWUKKyAqIEBkZXY6IFRoZSBkZXZpY2UgdGhlIGZyYW1lIG1hdGNoZWQgdG8KKyAqIEBhZGRyOiB0aGUgdHJhbnNtaXR0ZXIgYWRkcmVzcworICogQGdmcDogY29udGV4dCBmbGFncworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBBUCBtb2RlIChvbmx5ISkgdG8gaW5mb3JtIHVzZXJzcGFjZSB0aGF0CisgKiBhbiBhc3NvY2lhdGVkIHN0YXRpb24gc2VudCBhIDRhZGRyIGZyYW1lIGJ1dCB0aGF0IHdhc24ndCBleHBlY3RlZC4KKyAqIEl0IGlzIGFsbG93ZWQgYW5kIGRlc2lyYWJsZSB0byBzZW5kIHRoaXMgZXZlbnQgb25seSBvbmNlIGZvciBlYWNoCisgKiBzdGF0aW9uIHRvIGF2b2lkIGV2ZW50IGZsb29kaW5nLgorICogUmV0dXJucyAldHJ1ZSBpZiB0aGUgZnJhbWUgd2FzIHBhc3NlZCB0byB1c2Vyc3BhY2UgKG9yIHRoaXMgZmFpbGVkCisgKiBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiBub3QgaGF2aW5nIGEgc3Vic2NyaXB0aW9uLikKKyAqLworYm9vbCBjZmc4MDIxMV9yeF91bmV4cGVjdGVkXzRhZGRyX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCWNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApOworCisvKioKKyAqIGNmZzgwMjExX3Byb2JlX3N0YXR1cyAtIG5vdGlmeSB1c2Vyc3BhY2UgYWJvdXQgcHJvYmUgc3RhdHVzCisgKiBAZGV2OiB0aGUgZGV2aWNlIHRoZSBwcm9iZSB3YXMgc2VudCBvbgorICogQGFkZHI6IHRoZSBhZGRyZXNzIG9mIHRoZSBwZWVyCisgKiBAY29va2llOiB0aGUgY29va2llIGZpbGxlZCBpbiBAcHJvYmVfY2xpZW50IHByZXZpb3VzbHkKKyAqIEBhY2tlZDogaW5kaWNhdGVzIHdoZXRoZXIgcHJvYmUgd2FzIGFja2VkIG9yIG5vdAorICogQGdmcDogYWxsb2NhdGlvbiBmbGFncworICovCit2b2lkIGNmZzgwMjExX3Byb2JlX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqYWRkciwKKwkJCSAgIHU2NCBjb29raWUsIGJvb2wgYWNrZWQsIGdmcF90IGdmcCk7CisKKy8qKgorICogY2ZnODAyMTFfcmVwb3J0X29ic3NfYmVhY29uIC0gcmVwb3J0IGJlYWNvbiBmcm9tIG90aGVyIEFQcworICogQHdpcGh5OiBUaGUgd2lwaHkgdGhhdCByZWNlaXZlZCB0aGUgYmVhY29uCisgKiBAZnJhbWU6IHRoZSBmcmFtZQorICogQGxlbjogbGVuZ3RoIG9mIHRoZSBmcmFtZQorICogQGZyZXE6IGZyZXF1ZW5jeSB0aGUgZnJhbWUgd2FzIHJlY2VpdmVkIG9uCisgKiBAZ2ZwOiBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gcmVwb3J0IHRvIHVzZXJzcGFjZSB3aGVuIGEgYmVhY29uIHdhcworICogcmVjZWl2ZWQuIEl0IGlzIG5vdCB1c2VmdWwgdG8gY2FsbCB0aGlzIHdoZW4gdGhlcmUgaXMgbm8KKyAqIG5ldGRldiB0aGF0IGlzIGluIEFQL0dPIG1vZGUuCisgKi8KK3ZvaWQgY2ZnODAyMTFfcmVwb3J0X29ic3NfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJIGNvbnN0IHU4ICpmcmFtZSwgc2l6ZV90IGxlbiwKKwkJCQkgaW50IGZyZXEsIGdmcF90IGdmcCk7CisKIC8qIExvZ2dpbmcsIGRlYnVnZ2luZyBhbmQgdHJvdWJsZXNob290aW5nL2RpYWdub3N0aWMgaGVscGVycy4gKi8KIAogLyogd2lwaHlfcHJpbnRrIGhlbHBlcnMsIHNpbWlsYXIgdG8gZGV2X3ByaW50ayAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExX3JhZGlvdGFwLmggYi9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaAppbmRleCA3ZTJjNGQ0Li43MTM5MjU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaAorKysgYi9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaApAQCAtMjcxLDE0ICsyNzEsNiBAQAogI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfTUNTX0ZFQ19MRFBDCQkweDEwCiAKIAotLyogVWdseSBtYWNybyB0byBjb252ZXJ0IGxpdGVyYWwgY2hhbm5lbCBudW1iZXJzIGludG8gdGhlaXIgbWh6IGVxdWl2YWxlbnRzCi0gKiBUaGVyZSBhcmUgY2VydGlhbmx5IHNvbWUgY29uZGl0aW9ucyB0aGF0IHdpbGwgYnJlYWsgdGhpcyAobGlrZSBmZWVkaW5nIGl0ICczMCcpCi0gKiBidXQgdGhleSBzaG91bGRuJ3QgYXJpc2Ugc2luY2Ugbm90aGluZyB0YWxrcyBvbiBjaGFubmVsIDMwLiAqLwotI2RlZmluZSBpZWVlODAyMTFjaGFuMm1oeih4KSBcCi0JKCgoeCkgPD0gMTQpID8gXAotCSgoKHgpID09IDE0KSA/IDI0ODQgOiAoKHgpICogNSkgKyAyNDA3KSA6IFwKLQkoKHgpICsgMTAwMCkgKiA1KQotCiAvKiBoZWxwZXJzICovCiBzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X3JhZGlvdGFwX2xlbih1bnNpZ25lZCBjaGFyICpkYXRhKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAppbmRleCBmOTFhMWZiLi5lOGMyNWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaApAQCAtMTgsNyArMTgsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva21lbWNoZWNrLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwX3ZzLmggYi9pbmNsdWRlL25ldC9pcF92cy5oCmluZGV4IDhmYTQ0MzAuLjg3M2Q1YmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX3ZzLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBfdnMuaApAQCAtNDI1LDkgKzQyNSw5IEBACiAKIAljb25zdCBjaGFyICooKnN0YXRlX25hbWUpKGludCBzdGF0ZSk7CiAKLQlpbnQgKCpzdGF0ZV90cmFuc2l0aW9uKShzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBkaXJlY3Rpb24sCi0JCQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgaXBfdnNfcHJvdG9fZGF0YSAqcGQpOworCXZvaWQgKCpzdGF0ZV90cmFuc2l0aW9uKShzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBkaXJlY3Rpb24sCisJCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCk7CiAKIAlpbnQgKCpyZWdpc3Rlcl9hcHApKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGlwX3ZzX2FwcCAqaW5jKTsKIApAQCAtMTEyNiwxNyArMTEyNiwxNiBAQAogc3RydWN0IGlwX3ZzX3BlICppcF92c19wZV9nZXRieW5hbWUoY29uc3QgY2hhciAqbmFtZSk7CiBzdHJ1Y3QgaXBfdnNfcGUgKl9faXBfdnNfcGVfZ2V0YnluYW1lKGNvbnN0IGNoYXIgKnBlX25hbWUpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfcGVfZ2V0KGNvbnN0IHN0cnVjdCBpcF92c19wZSAqcGUpCi17Ci0JaWYgKHBlICYmIHBlLT5tb2R1bGUpCisvKgorICogVXNlIGEgI2RlZmluZSB0byBhdm9pZCBhbGwgb2YgbW9kdWxlLmgganVzdCBmb3IgdGhlc2UgdHJpdmlhbCBvcHMKKyAqLworI2RlZmluZSBpcF92c19wZV9nZXQocGUpCQkJXAorCWlmIChwZSAmJiBwZS0+bW9kdWxlKQkJCVwKIAkJX19tb2R1bGVfZ2V0KHBlLT5tb2R1bGUpOwotfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfcGVfcHV0KGNvbnN0IHN0cnVjdCBpcF92c19wZSAqcGUpCi17Ci0JaWYgKHBlICYmIHBlLT5tb2R1bGUpCisjZGVmaW5lIGlwX3ZzX3BlX3B1dChwZSkJCQlcCisJaWYgKHBlICYmIHBlLT5tb2R1bGUpCQkJXAogCQltb2R1bGVfcHV0KHBlLT5tb2R1bGUpOwotfQogCiAvKgogICoJSVBWUyBwcm90b2NvbCBmdW5jdGlvbnMgKGZyb20gaXBfdnNfcHJvdG8uYykKQEAgLTEzNzgsNyArMTM3Nyw3IEBACiAKIGV4dGVybiB2b2lkIGlwX3ZzX3VwZGF0ZV9jb25udHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAogCQkJCSAgIGludCBvdXRpbik7Ci1leHRlcm4gaW50IGlwX3ZzX2NvbmZpcm1fY29ubnRyYWNrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCk7CitleHRlcm4gaW50IGlwX3ZzX2NvbmZpcm1fY29ubnRyYWNrKHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHZvaWQgaXBfdnNfbmZjdF9leHBlY3RfcmVsYXRlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCQkJICAgICAgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCB1X2ludDhfdCBwcm90bywKIAkJCQkgICAgICBjb25zdCBfX2JlMTYgcG9ydCwgaW50IGZyb21fcnMpOwpAQCAtMTM5Niw4ICsxMzk1LDcgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXBfdnNfY29uZmlybV9jb25udHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCitzdGF0aWMgaW5saW5lIGludCBpcF92c19jb25maXJtX2Nvbm50cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiBORl9BQ0NFUFQ7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9saWI4MDIxMS5oIGIvaW5jbHVkZS9uZXQvbGliODAyMTEuaAppbmRleCAyZWM4OTZiLi5kMTc4YzI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9saWI4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2xpYjgwMjExLmgKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC00Miw2ICs0MSw4IEBACiAJSUVFRTgwMjExX0NSWVBUT19US0lQX0NPVU5URVJNRUFTVVJFUyA9ICgxIDw8IDApLAogfTsKIAorc3RydWN0IG1vZHVsZTsKKwogc3RydWN0IGxpYjgwMjExX2NyeXB0b19vcHMgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKaW5kZXggNzJlZGRkMS4uNWI1YzhhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCkBAIC0xNjYsNiArMTY2LDcgQEAKICAqCXRoYXQgaXQgaXMgb25seSBldmVyIGRpc2FibGVkIGZvciBzdGF0aW9uIG1vZGUuCiAgKiBAQlNTX0NIQU5HRURfSURMRTogSWRsZSBjaGFuZ2VkIGZvciB0aGlzIEJTUy9pbnRlcmZhY2UuCiAgKiBAQlNTX0NIQU5HRURfU1NJRDogU1NJRCBjaGFuZ2VkIGZvciB0aGlzIEJTUyAoQVAgbW9kZSkKKyAqIEBCU1NfQ0hBTkdFRF9BUF9QUk9CRV9SRVNQOiBQcm9iZSBSZXNwb25zZSBjaGFuZ2VkIGZvciB0aGlzIEJTUyAoQVAgbW9kZSkKICAqLwogZW51bSBpZWVlODAyMTFfYnNzX2NoYW5nZSB7CiAJQlNTX0NIQU5HRURfQVNTT0MJCT0gMTw8MCwKQEAgLTE4NCw2ICsxODUsNyBAQAogCUJTU19DSEFOR0VEX1FPUwkJCT0gMTw8MTMsCiAJQlNTX0NIQU5HRURfSURMRQkJPSAxPDwxNCwKIAlCU1NfQ0hBTkdFRF9TU0lECQk9IDE8PDE1LAorCUJTU19DSEFOR0VEX0FQX1BST0JFX1JFU1AJPSAxPDwxNiwKIAogCS8qIHdoZW4gYWRkaW5nIGhlcmUsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgaWVlZTgwMjExX3JlY29uZmlnICovCiB9OwpAQCAtNTE4LDcgKzUyMCw3IEBACiAgKiBAZmxhZ3M6IHRyYW5zbWl0IGluZm8gZmxhZ3MsIGRlZmluZWQgYWJvdmUKICAqIEBiYW5kOiB0aGUgYmFuZCB0byB0cmFuc21pdCBvbiAodXNlIGZvciBjaGVja2luZyBmb3IgcmFjZXMpCiAgKiBAYW50ZW5uYV9zZWxfdHg6IGFudGVubmEgdG8gdXNlLCAwIGZvciBhdXRvbWF0aWMgZGl2ZXJzaXR5Ci0gKiBAcGFkOiBwYWRkaW5nLCBpZ25vcmUKKyAqIEBhY2tfZnJhbWVfaWQ6IGludGVybmFsIGZyYW1lIElEIGZvciBUWCBzdGF0dXMsIHVzZWQgaW50ZXJuYWxseQogICogQGNvbnRyb2w6IHVuaW9uIGZvciBjb250cm9sIGRhdGEKICAqIEBzdGF0dXM6IHVuaW9uIGZvciBzdGF0dXMgZGF0YQogICogQGRyaXZlcl9kYXRhOiBhcnJheSBvZiBkcml2ZXJfZGF0YSBwb2ludGVycwpAQCAtNTM1LDggKzUzNyw3IEBACiAKIAl1OCBhbnRlbm5hX3NlbF90eDsKIAotCS8qIDIgYnl0ZSBob2xlICovCi0JdTggcGFkWzJdOworCXUxNiBhY2tfZnJhbWVfaWQ7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CkBAIC05MDEsNiArOTAyLDEwIEBACiAgKiBASUVFRTgwMjExX0tFWV9GTEFHX1NXX01HTVQ6IFRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBkcml2ZXIgZm9yIGEKICAqCUNDTVAga2V5IGlmIGl0IHJlcXVpcmVzIENDTVAgZW5jcnlwdGlvbiBvZiBtYW5hZ2VtZW50IGZyYW1lcyAoTUZQKSB0bwogICoJYmUgZG9uZSBpbiBzb2Z0d2FyZS4KKyAqIEBJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFOiBUaGlzIGZsYWcgc2hvdWxkIGJlIHNldCBieSB0aGUgZHJpdmVyCisgKglmb3IgYSBDQ01QIGtleSBpZiBzcGFjZSBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIHRoZSBJViwgYnV0IHRoZSBJVgorICoJaXRzZWxmIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkLiBEbyBub3Qgc2V0IHRvZ2V0aGVyIHdpdGgKKyAqCUBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYgb24gdGhlIHNhbWUga2V5LgogICovCiBlbnVtIGllZWU4MDIxMV9rZXlfZmxhZ3MgewogCUlFRUU4MDIxMV9LRVlfRkxBR19XTU1fU1RBCT0gMTw8MCwKQEAgLTkwOCw2ICs5MTMsNyBAQAogCUlFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDPSAxPDwyLAogCUlFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRQk9IDE8PDMsCiAJSUVFRTgwMjExX0tFWV9GTEFHX1NXX01HTVQJPSAxPDw0LAorCUlFRUU4MDIxMV9LRVlfRkxBR19QVVRfSVZfU1BBQ0UgPSAxPDw1LAogfTsKIAogLyoqCkBAIC0xMzA0LDYgKzEzMTAsMTYgQEAKIH0KIAogLyoqCisgKiBpZWVlODAyMTFfZnJlZV90eHNrYiAtIGZyZWUgVFggc2tiCisgKiBAaHc6IHRoZSBoYXJkd2FyZQorICogQHNrYjogdGhlIHNrYgorICoKKyAqIEZyZWUgYSB0cmFuc21pdCBza2IuIFVzZSB0aGlzIGZ1bnRpb24gd2hlbiBzb21lIGZhaWx1cmUKKyAqIHRvIHRyYW5zbWl0IGhhcHBlbmVkIGFuZCB0aHVzIHN0YXR1cyBjYW5ub3QgYmUgcmVwb3J0ZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX2ZyZWVfdHhza2Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOworCisvKioKICAqIERPQzogSGFyZHdhcmUgY3J5cHRvIGFjY2VsZXJhdGlvbgogICoKICAqIG1hYzgwMjExIGlzIGNhcGFibGUgb2YgdGFraW5nIGFkdmFudGFnZSBvZiBtYW55IGhhcmR3YXJlCkBAIC0xNzQ0LDExICsxNzYwLDIxIEBACiAgKglza2IgY29udGFpbnMgdGhlIGJ1ZmZlciBzdGFydGluZyBmcm9tIHRoZSBJRUVFIDgwMi4xMSBoZWFkZXIuCiAgKglUaGUgbG93LWxldmVsIGRyaXZlciBzaG91bGQgc2VuZCB0aGUgZnJhbWUgb3V0IGJhc2VkIG9uCiAgKgljb25maWd1cmF0aW9uIGluIHRoZSBUWCBjb250cm9sIGRhdGEuIFRoaXMgaGFuZGxlciBzaG91bGQsCi0gKglwcmVmZXJhYmx5LCBuZXZlciBmYWlsIGFuZCBzdG9wIHF1ZXVlcyBhcHByb3ByaWF0ZWx5LCBtb3JlCi0gKglpbXBvcnRhbnRseSwgaG93ZXZlciwgaXQgbXVzdCBuZXZlciBmYWlsIGZvciBBLU1QRFUtcXVldWVzLgotICoJVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIE5FVERFVl9UWF9PSyBleGNlcHQgaW4gdmVyeQotICoJbGltaXRlZCBjYXNlcy4KLSAqCU11c3QgYmUgaW1wbGVtZW50ZWQgYW5kIGF0b21pYy4KKyAqCXByZWZlcmFibHksIG5ldmVyIGZhaWwgYW5kIHN0b3AgcXVldWVzIGFwcHJvcHJpYXRlbHkuCisgKglUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgaWYgQHR4X2ZyYWdzIGlzIG5vdC4KKyAqCU11c3QgYmUgYXRvbWljLgorICoKKyAqIEB0eF9mcmFnczogQ2FsbGVkIHRvIHRyYW5zbWl0IG11bHRpcGxlIGZyYWdtZW50cyBvZiBhIHNpbmdsZSBNU0RVLgorICoJVGhpcyBoYW5kbGVyIG11c3QgY29uc3VtZSBhbGwgZnJhZ21lbnRzLCBzZW5kaW5nIG91dCBzb21lIG9mCisgKgl0aGVtIG9ubHkgaXMgdXNlbGVzcyBhbmQgaXQgY2FuJ3QgYXNrIGZvciBzb21lIG9mIHRoZW0gdG8gYmUKKyAqCXF1ZXVlZCBhZ2Fpbi4gSWYgdGhlIGZyYW1lIGlzIG5vdCBmcmFnbWVudGVkIHRoZSBxdWV1ZSBoYXMgYQorICoJc2luZ2xlIFNLQiBvbmx5LiBUbyBhdm9pZCBpc3N1ZXMgd2l0aCB0aGUgbmV0d29ya2luZyBzdGFjaworICoJd2hlbiBUWCBzdGF0dXMgaXMgcmVwb3J0ZWQgdGhlIGZyYW1lcyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tCisgKgl0aGUgc2tiIHF1ZXVlLgorICoJSWYgdGhpcyBpcyB1c2VkLCB0aGUgdHhfaW5mbyBAdmlmIGFuZCBAc3RhIHBvaW50ZXJzIHdpbGwgYmUKKyAqCWludmFsaWQgLS0geW91IG11c3Qgbm90IHVzZSB0aGVtIGluIHRoYXQgY2FzZS4KKyAqCVRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpZiBAdHggaXNuJ3QuCisgKglNdXN0IGJlIGF0b21pYy4KICAqCiAgKiBAc3RhcnQ6IENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IG5ldGRldmljZSBhdHRhY2hlZCB0byB0aGUgaGFyZHdhcmUKICAqCWlzIGVuYWJsZWQuIFRoaXMgc2hvdWxkIHR1cm4gb24gdGhlIGhhcmR3YXJlIGFuZCBtdXN0IHR1cm4gb24KQEAgLTIwODUsNiArMjExMSw4IEBACiAgKi8KIHN0cnVjdCBpZWVlODAyMTFfb3BzIHsKIAl2b2lkICgqdHgpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwl2b2lkICgqdHhfZnJhZ3MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMpOwogCWludCAoKnN0YXJ0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAJdm9pZCAoKnN0b3ApKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKICNpZmRlZiBDT05GSUdfUE0KQEAgLTI2NjEsNiArMjY4OSwxOSBAQAogfQogCiAvKioKKyAqIGllZWU4MDIxMV9wcm9iZXJlc3BfZ2V0IC0gcmV0cmlldmUgYSBQcm9iZSBSZXNwb25zZSB0ZW1wbGF0ZQorICogQGh3OiBwb2ludGVyIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkuCisgKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgorICoKKyAqIENyZWF0ZXMgYSBQcm9iZSBSZXNwb25zZSB0ZW1wbGF0ZSB3aGljaCBjYW4sIGZvciBleGFtcGxlLCBiZSB1cGxvYWRlZCB0bworICogaGFyZHdhcmUuIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHNob3VsZCBiZSBzZXQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBDYW4gb25seSBiZSBjYWxsZWQgaW4gQVAgbW9kZS4KKyAqLworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZXJlc3BfZ2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKKworLyoqCiAgKiBpZWVlODAyMTFfcHNwb2xsX2dldCAtIHJldHJpZXZlIGEgUFMgUG9sbCB0ZW1wbGF0ZQogICogQGh3OiBwb2ludGVyIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkuCiAgKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IDBiN2YwNWUuLjhhMmIwYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTMxMyw2ICszMTMsOCBAQAogCXJldHVybiBza2ItPmRldiAmJiBza2ItPnNrYl9paWYgJiYgc2tiLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLOwogfQogCitzdHJ1Y3Qga2VybmVsX3BhcmFtOworCiBleHRlcm4gaW50IG5mX2Nvbm50cmFja19zZXRfaGFzaHNpemUoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX21heDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaAppbmRleCA3Y2E2YmRkLi4yZjhmYjc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L25mX25hdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3RfbnVsbHMuaD4KIAogLyogQSBgdHVwbGUnIGlzIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIHRvIHVuaXF1ZWx5CkBAIC0yNCwzMiArMjUsNiBAQAogCiAjZGVmaW5lIE5GX0NUX1RVUExFX0wzU0laRQlBUlJBWV9TSVpFKCgodW5pb24gbmZfaW5ldF9hZGRyICopTlVMTCktPmFsbCkKIAotLyogVGhlIHByb3RvY29sLXNwZWNpZmljIG1hbmlwdWxhYmxlIHBhcnRzIG9mIHRoZSB0dXBsZTogYWx3YXlzIGluCi0gICBuZXR3b3JrIG9yZGVyISAqLwotdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byB7Ci0JLyogQWRkIG90aGVyIHByb3RvY29scyBoZXJlLiAqLwotCV9fYmUxNiBhbGw7Ci0KLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHRjcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHVkcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgaWQ7Ci0JfSBpY21wOwotCXN0cnVjdCB7Ci0JCV9fYmUxNiBwb3J0OwotCX0gZGNjcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHNjdHA7Ci0Jc3RydWN0IHsKLQkJX19iZTE2IGtleTsJLyogR1JFIGtleSBpcyAzMmJpdCwgUFB0UCBvbmx5IHVzZXMgMTZiaXQgKi8KLQl9IGdyZTsKLX07Ci0KIC8qIFRoZSBtYW5pcHVsYWJsZSBwYXJ0IG9mIHRoZSB0dXBsZS4gKi8KIHN0cnVjdCBuZl9jb25udHJhY2tfbWFuIHsKIAl1bmlvbiBuZl9pbmV0X2FkZHIgdTM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmgKaW5kZXggOTIwOTk3Zi4uZTk5MWJkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2xvZy5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9sb2cuaApAQCAtNTMsMTIgKzUzLDEzIEBACiB2b2lkIG5mX2xvZ191bmJpbmRfcGYodV9pbnQ4X3QgcGYpOwogCiAvKiBDYWxscyB0aGUgcmVnaXN0ZXJlZCBiYWNrZW5kIGxvZ2dpbmcgZnVuY3Rpb24gKi8KK19fcHJpbnRmKDcsIDgpCiB2b2lkIG5mX2xvZ19wYWNrZXQodV9pbnQ4X3QgcGYsCiAJCSAgIHVuc2lnbmVkIGludCBob29rbnVtLAogCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCSAgIGNvbnN0IHN0cnVjdCBuZl9sb2dpbmZvICpsaSwKLQkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLDcsOCkpKTsKKwkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAjZW5kaWYgLyogX05GX0xPR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0LmgKaW5kZXggMDM0NmIwMC4uYjg4NzJkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX05GX05BVF9ICiAjZGVmaW5lIF9ORl9OQVRfSAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaD4KIAogI2RlZmluZSBORl9OQVRfTUFQUElOR19UWVBFX01BWF9OQU1FTEVOIDE2CkBAIC0xNCwxMSArMTUsNiBAQAogI2RlZmluZSBIT09LMk1BTklQKGhvb2tudW0pICgoaG9va251bSkgIT0gTkZfSU5FVF9QT1NUX1JPVVRJTkcgJiYgXAogCQkJICAgICAoaG9va251bSkgIT0gTkZfSU5FVF9MT0NBTF9JTikKIAotI2RlZmluZSBJUF9OQVRfUkFOR0VfTUFQX0lQUyAxCi0jZGVmaW5lIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQgMgotI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NIDQKLSNkZWZpbmUgSVBfTkFUX1JBTkdFX1BFUlNJU1RFTlQgOAotCiAvKiBOQVQgc2VxdWVuY2UgbnVtYmVyIG1vZGlmaWNhdGlvbnMgKi8KIHN0cnVjdCBuZl9uYXRfc2VxIHsKIAkvKiBwb3NpdGlvbiBvZiB0aGUgbGFzdCBUQ1Agc2VxdWVuY2UgbnVtYmVyIG1vZGlmaWNhdGlvbiAoaWYgYW55KSAqLwpAQCAtMjgsMjYgKzI0LDYgQEAKIAlpbnQxNl90IG9mZnNldF9iZWZvcmUsIG9mZnNldF9hZnRlcjsKIH07CiAKLS8qIFNpbmdsZSByYW5nZSBzcGVjaWZpY2F0aW9uLiAqLwotc3RydWN0IG5mX25hdF9yYW5nZSB7Ci0JLyogU2V0IHRvIE9SIG9mIGZsYWdzIGFib3ZlLiAqLwotCXVuc2lnbmVkIGludCBmbGFnczsKLQotCS8qIEluY2x1c2l2ZTogbmV0d29yayBvcmRlci4gKi8KLQlfX2JlMzIgbWluX2lwLCBtYXhfaXA7Ci0KLQkvKiBJbmNsdXNpdmU6IG5ldHdvcmsgb3JkZXIgKi8KLQl1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvIG1pbiwgbWF4OwotfTsKLQotLyogRm9yIGJhY2t3YXJkcyBjb21wYXQ6IGRvbid0IHVzZSBpbiBtb2Rlcm4gY29kZS4gKi8KLXN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0IHsKLQl1bnNpZ25lZCBpbnQgcmFuZ2VzaXplOyAvKiBNdXN0IGJlIDEuICovCi0KLQkvKiBoYW5ncyBvZmYgZW5kLiAqLwotCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2VbMV07Ci19OwotCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bGluay5oIGIvaW5jbHVkZS9uZXQvbmV0bGluay5oCmluZGV4IDk4YzE4NTQuLmNiMWYzNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGxpbmsuaAorKysgYi9pbmNsdWRlL25ldC9uZXRsaW5rLmgKQEAgLTE5Miw4ICsxOTIsMTUgQEAKICAqICAgIE5MQV9OVUxfU1RSSU5HICAgICAgIE1heGltdW0gbGVuZ3RoIG9mIHN0cmluZyAoZXhjbHVkaW5nIE5VTCkKICAqICAgIE5MQV9GTEFHICAgICAgICAgICAgIFVudXNlZAogICogICAgTkxBX0JJTkFSWSAgICAgICAgICAgTWF4aW11bSBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKLSAqICAgIE5MQV9ORVNURURfQ09NUEFUICAgIEV4YWN0IGxlbmd0aCBvZiBzdHJ1Y3R1cmUgcGF5bG9hZAotICogICAgQWxsIG90aGVyICAgICAgICAgICAgRXhhY3QgbGVuZ3RoIG9mIGF0dHJpYnV0ZSBwYXlsb2FkCisgKiAgICBOTEFfTkVTVEVEICAgICAgICAgICBEb24ndCB1c2UgYGxlbicgZmllbGQgLS0gbGVuZ3RoIHZlcmlmaWNhdGlvbiBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSBieSBjaGVja2luZyBsZW4gb2YgbmVzdGVkIGhlYWRlciAob3IgZW1wdHkpCisgKiAgICBOTEFfTkVTVEVEX0NPTVBBVCAgICBNaW5pbXVtIGxlbmd0aCBvZiBzdHJ1Y3R1cmUgcGF5bG9hZAorICogICAgTkxBX1U4LCBOTEFfVTE2LAorICogICAgTkxBX1UzMiwgTkxBX1U2NCwKKyAqICAgIE5MQV9NU0VDUyAgICAgICAgICAgIExlYXZpbmcgdGhlIGxlbmd0aCBmaWVsZCB6ZXJvIHdpbGwgdmVyaWZ5IHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gdHlwZSBmaXRzLCB1c2luZyBpdCB2ZXJpZmllcyBtaW5pbXVtIGxlbmd0aAorICogICAgICAgICAgICAgICAgICAgICAgICAganVzdCBsaWtlICJBbGwgb3RoZXIiCisgKiAgICBBbGwgb3RoZXIgICAgICAgICAgICBNaW5pbXVtIGxlbmd0aCBvZiBhdHRyaWJ1dGUgcGF5bG9hZAogICoKICAqIEV4YW1wbGU6CiAgKiBzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbXlfcG9saWN5W0FUVFJfTUFYKzFdID0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmZjL25jaS5oIGIvaW5jbHVkZS9uZXQvbmZjL25jaS5oCmluZGV4IDM5Yjg1YmMuLmI2MWViNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25mYy9uY2kuaAorKysgYi9pbmNsdWRlL25ldC9uZmMvbmNpLmgKQEAgLTM0LDMxICszNCwzMCBAQAogI2RlZmluZSBOQ0lfTUFYX05VTV9DT05OCQkJCQkxMAogCiAvKiBOQ0kgU3RhdHVzIENvZGVzICovCi0jZGVmaW5lCU5DSV9TVEFUVVNfT0sJCQkJCQkweDAwCi0jZGVmaW5lCU5DSV9TVEFUVVNfUkVKRUNURUQJCQkJCTB4MDEKLSNkZWZpbmUJTkNJX1NUQVRVU19NRVNTQUdFX0NPUlJVUFRFRAkJCQkweDAyCi0jZGVmaW5lCU5DSV9TVEFUVVNfQlVGRkVSX0ZVTEwJCQkJCTB4MDMKLSNkZWZpbmUJTkNJX1NUQVRVU19GQUlMRUQJCQkJCTB4MDQKLSNkZWZpbmUJTkNJX1NUQVRVU19OT1RfSU5JVElBTElaRUQJCQkJMHgwNQotI2RlZmluZQlOQ0lfU1RBVFVTX1NZTlRBWF9FUlJPUgkJCQkJMHgwNgotI2RlZmluZQlOQ0lfU1RBVFVTX1NFTUFOVElDX0VSUk9SCQkJCTB4MDcKLSNkZWZpbmUJTkNJX1NUQVRVU19VTktOT1dOX0dJRAkJCQkJMHgwOAotI2RlZmluZQlOQ0lfU1RBVFVTX1VOS05PV05fT0lECQkJCQkweDA5Ci0jZGVmaW5lCU5DSV9TVEFUVVNfSU5WQUxJRF9QQVJBTQkJCQkweDBhCi0jZGVmaW5lCU5DSV9TVEFUVVNfTUVTU0FHRV9TSVpFX0VYQ0VFREVECQkJMHgwYgorI2RlZmluZSBOQ0lfU1RBVFVTX09LCQkJCQkJMHgwMAorI2RlZmluZSBOQ0lfU1RBVFVTX1JFSkVDVEVECQkJCQkweDAxCisjZGVmaW5lIE5DSV9TVEFUVVNfUkZfRlJBTUVfQ09SUlVQVEVECQkJCTB4MDIKKyNkZWZpbmUgTkNJX1NUQVRVU19GQUlMRUQJCQkJCTB4MDMKKyNkZWZpbmUgTkNJX1NUQVRVU19OT1RfSU5JVElBTElaRUQJCQkJMHgwNAorI2RlZmluZSBOQ0lfU1RBVFVTX1NZTlRBWF9FUlJPUgkJCQkJMHgwNQorI2RlZmluZSBOQ0lfU1RBVFVTX1NFTUFOVElDX0VSUk9SCQkJCTB4MDYKKyNkZWZpbmUgTkNJX1NUQVRVU19VTktOT1dOX0dJRAkJCQkJMHgwNworI2RlZmluZSBOQ0lfU1RBVFVTX1VOS05PV05fT0lECQkJCQkweDA4CisjZGVmaW5lIE5DSV9TVEFUVVNfSU5WQUxJRF9QQVJBTQkJCQkweDA5CisjZGVmaW5lIE5DSV9TVEFUVVNfTUVTU0FHRV9TSVpFX0VYQ0VFREVECQkJMHgwYQogLyogRGlzY292ZXJ5IFNwZWNpZmljIFN0YXR1cyBDb2RlcyAqLwotI2RlZmluZQlOQ0lfU1RBVFVTX0RJU0NPVkVSWV9BTFJFQURZX1NUQVJURUQJCQkweGEwCi0jZGVmaW5lCU5DSV9TVEFUVVNfRElTQ09WRVJZX1RBUkdFVF9BQ1RJVkFUSU9OX0ZBSUxFRAkJMHhhMQorI2RlZmluZSBOQ0lfU1RBVFVTX0RJU0NPVkVSWV9BTFJFQURZX1NUQVJURUQJCQkweGEwCisjZGVmaW5lIE5DSV9TVEFUVVNfRElTQ09WRVJZX1RBUkdFVF9BQ1RJVkFUSU9OX0ZBSUxFRAkJMHhhMQorI2RlZmluZSBOQ0lfU1RBVFVTX0RJU0NPVkVSWV9URUFSX0RPV04JCQkJMHhhMgogLyogUkYgSW50ZXJmYWNlIFNwZWNpZmljIFN0YXR1cyBDb2RlcyAqLwotI2RlZmluZQlOQ0lfU1RBVFVTX1JGX1RSQU5TTUlTU0lPTl9FUlJPUgkJCTB4YjAKLSNkZWZpbmUJTkNJX1NUQVRVU19SRl9QUk9UT0NPTF9FUlJPUgkJCQkweGIxCi0jZGVmaW5lCU5DSV9TVEFUVVNfUkZfVElNRU9VVF9FUlJPUgkJCQkweGIyCi0jZGVmaW5lCU5DSV9TVEFUVVNfUkZfTElOS19MT1NTX0VSUk9SCQkJCTB4YjMKKyNkZWZpbmUgTkNJX1NUQVRVU19SRl9UUkFOU01JU1NJT05fRVJST1IJCQkweGIwCisjZGVmaW5lIE5DSV9TVEFUVVNfUkZfUFJPVE9DT0xfRVJST1IJCQkJMHhiMQorI2RlZmluZSBOQ0lfU1RBVFVTX1JGX1RJTUVPVVRfRVJST1IJCQkJMHhiMgogLyogTkZDRUUgSW50ZXJmYWNlIFNwZWNpZmljIFN0YXR1cyBDb2RlcyAqLwotI2RlZmluZQlOQ0lfU1RBVFVTX01BWF9BQ1RJVkVfTkZDRUVfSU5URVJGQUNFU19SRUFDSEVECQkweGMwCi0jZGVmaW5lCU5DSV9TVEFUVVNfTkZDRUVfSU5URVJGQUNFX0FDVElWQVRJT05fRkFJTEVECQkweGMxCi0jZGVmaW5lCU5DSV9TVEFUVVNfTkZDRUVfVFJBTlNNSVNTSU9OX0VSUk9SCQkJMHhjMgotI2RlZmluZQlOQ0lfU1RBVFVTX05GQ0VFX1BST1RPQ09MX0VSUk9SCQkJCTB4YzMKKyNkZWZpbmUgTkNJX1NUQVRVU19NQVhfQUNUSVZFX05GQ0VFX0lOVEVSRkFDRVNfUkVBQ0hFRAkJMHhjMAorI2RlZmluZSBOQ0lfU1RBVFVTX05GQ0VFX0lOVEVSRkFDRV9BQ1RJVkFUSU9OX0ZBSUxFRAkJMHhjMQorI2RlZmluZSBOQ0lfU1RBVFVTX05GQ0VFX1RSQU5TTUlTU0lPTl9FUlJPUgkJCTB4YzIKKyNkZWZpbmUgTkNJX1NUQVRVU19ORkNFRV9QUk9UT0NPTF9FUlJPUgkJCQkweGMzCiAjZGVmaW5lIE5DSV9TVEFUVVNfTkZDRUVfVElNRU9VVF9FUlJPUgkJCQkweGM0CiAKIC8qIE5DSSBSRiBUZWNobm9sb2d5IGFuZCBNb2RlICovCkBAIC03Myw2ICs3MiwyMSBAQAogI2RlZmluZSBOQ0lfTkZDX0FfQUNUSVZFX0xJU1RFTl9NT0RFCQkJCTB4ODMKICNkZWZpbmUgTkNJX05GQ19GX0FDVElWRV9MSVNURU5fTU9ERQkJCQkweDg1CiAKKy8qIE5DSSBSRiBUZWNobm9sb2dpZXMgKi8KKyNkZWZpbmUgTkNJX05GQ19SRl9URUNITk9MT0dZX0EJCQkJCTB4MDAKKyNkZWZpbmUgTkNJX05GQ19SRl9URUNITk9MT0dZX0IJCQkJCTB4MDEKKyNkZWZpbmUgTkNJX05GQ19SRl9URUNITk9MT0dZX0YJCQkJCTB4MDIKKyNkZWZpbmUgTkNJX05GQ19SRl9URUNITk9MT0dZXzE1NjkzCQkJCTB4MDMKKworLyogTkNJIEJpdCBSYXRlcyAqLworI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzEwNgkJCQkJMHgwMAorI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzIxMgkJCQkJMHgwMQorI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzQyNAkJCQkJMHgwMgorI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzg0OAkJCQkJMHgwMworI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzE2OTYJCQkJCTB4MDQKKyNkZWZpbmUgTkNJX05GQ19CSVRfUkFURV8zMzkyCQkJCQkweDA1CisjZGVmaW5lIE5DSV9ORkNfQklUX1JBVEVfNjc4NAkJCQkJMHgwNgorCiAvKiBOQ0kgUkYgUHJvdG9jb2xzICovCiAjZGVmaW5lIE5DSV9SRl9QUk9UT0NPTF9VTktOT1dOCQkJCQkweDAwCiAjZGVmaW5lIE5DSV9SRl9QUk9UT0NPTF9UMVQJCQkJCTB4MDEKQEAgLTgyLDEwICs5NiwyMCBAQAogI2RlZmluZSBOQ0lfUkZfUFJPVE9DT0xfTkZDX0RFUAkJCQkJMHgwNQogCiAvKiBOQ0kgUkYgSW50ZXJmYWNlcyAqLwotI2RlZmluZSBOQ0lfUkZfSU5URVJGQUNFX1JGVQkJCQkJMHgwMAotI2RlZmluZQlOQ0lfUkZfSU5URVJGQUNFX0ZSQU1FCQkJCQkweDAxCi0jZGVmaW5lCU5DSV9SRl9JTlRFUkZBQ0VfSVNPX0RFUAkJCQkweDAyCi0jZGVmaW5lCU5DSV9SRl9JTlRFUkZBQ0VfTkZDX0RFUAkJCQkweDAzCisjZGVmaW5lIE5DSV9SRl9JTlRFUkZBQ0VfTkZDRUVfRElSRUNUCQkJCTB4MDAKKyNkZWZpbmUgTkNJX1JGX0lOVEVSRkFDRV9GUkFNRQkJCQkJMHgwMQorI2RlZmluZSBOQ0lfUkZfSU5URVJGQUNFX0lTT19ERVAJCQkJMHgwMgorI2RlZmluZSBOQ0lfUkZfSU5URVJGQUNFX05GQ19ERVAJCQkJMHgwMworCisvKiBOQ0kgUmVzZXQgdHlwZXMgKi8KKyNkZWZpbmUgTkNJX1JFU0VUX1RZUEVfS0VFUF9DT05GSUcJCQkJMHgwMAorI2RlZmluZSBOQ0lfUkVTRVRfVFlQRV9SRVNFVF9DT05GSUcJCQkJMHgwMQorCisvKiBOQ0kgU3RhdGljIFJGIGNvbm5lY3Rpb24gSUQgKi8KKyNkZWZpbmUgTkNJX1NUQVRJQ19SRl9DT05OX0lECQkJCQkweDAwCisKKy8qIE5DSSBEYXRhIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSBOQ0lfREFUQV9GTE9XX0NPTlRST0xfTk9UX1VTRUQJCQkJMHhmZgogCiAvKiBOQ0kgUkZfRElTQ09WRVJfTUFQX0NNRCBtb2RlcyAqLwogI2RlZmluZSBOQ0lfRElTQ19NQVBfTU9ERV9QT0xMCQkJCQkweDAxCkBAIC05NCwyNSArMTE4LDIyIEBACiAKIC8qIE5DSSBEaXNjb3ZlcnkgVHlwZXMgKi8KICNkZWZpbmUgTkNJX0RJU0NPVkVSWV9UWVBFX1BPTExfQV9QQVNTSVZFCQkJMHgwMAotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfUE9MTF9CX1BBU1NJVkUJCQkweDAxCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0ZfUEFTU0lWRQkJCTB4MDIKLSNkZWZpbmUJTkNJX0RJU0NPVkVSWV9UWVBFX1BPTExfQV9BQ1RJVkUJCQkweDAzCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0ZfQUNUSVZFCQkJMHgwNQotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfV0FLRVVQX0FfUEFTU0lWRQkJCTB4MDYKLSNkZWZpbmUJTkNJX0RJU0NPVkVSWV9UWVBFX1dBS0VVUF9CX1BBU1NJVkUJCQkweDA3Ci0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9XQUtFVVBfQV9BQ1RJVkUJCQkweDA5Ci0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fQV9QQVNTSVZFCQkJMHg4MAotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfTElTVEVOX0JfUEFTU0lWRQkJCTB4ODEKLSNkZWZpbmUJTkNJX0RJU0NPVkVSWV9UWVBFX0xJU1RFTl9GX1BBU1NJVkUJCQkweDgyCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fQV9BQ1RJVkUJCQkweDgzCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fRl9BQ1RJVkUJCQkweDg1CisjZGVmaW5lIE5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0JfUEFTU0lWRQkJCTB4MDEKKyNkZWZpbmUgTkNJX0RJU0NPVkVSWV9UWVBFX1BPTExfRl9QQVNTSVZFCQkJMHgwMgorI2RlZmluZSBOQ0lfRElTQ09WRVJZX1RZUEVfUE9MTF9BX0FDVElWRQkJCTB4MDMKKyNkZWZpbmUgTkNJX0RJU0NPVkVSWV9UWVBFX1BPTExfRl9BQ1RJVkUJCQkweDA1CisjZGVmaW5lIE5DSV9ESVNDT1ZFUllfVFlQRV9XQUtFVVBfQV9BQ1RJVkUJCQkweDA5CisjZGVmaW5lIE5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fQV9QQVNTSVZFCQkJMHg4MAorI2RlZmluZSBOQ0lfRElTQ09WRVJZX1RZUEVfTElTVEVOX0JfUEFTU0lWRQkJCTB4ODEKKyNkZWZpbmUgTkNJX0RJU0NPVkVSWV9UWVBFX0xJU1RFTl9GX1BBU1NJVkUJCQkweDgyCisjZGVmaW5lIE5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fQV9BQ1RJVkUJCQkweDgzCisjZGVmaW5lIE5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fRl9BQ1RJVkUJCQkweDg1CiAKIC8qIE5DSSBEZWFjdGl2YXRpb24gVHlwZSAqLwotI2RlZmluZQlOQ0lfREVBQ1RJVkFURV9UWVBFX0lETEVfTU9ERQkJCQkweDAwCi0jZGVmaW5lCU5DSV9ERUFDVElWQVRFX1RZUEVfU0xFRVBfTU9ERQkJCQkweDAxCi0jZGVmaW5lCU5DSV9ERUFDVElWQVRFX1RZUEVfU0xFRVBfQUZfTU9ERQkJCTB4MDIKLSNkZWZpbmUJTkNJX0RFQUNUSVZBVEVfVFlQRV9SRl9MSU5LX0xPU1MJCQkweDAzCi0jZGVmaW5lCU5DSV9ERUFDVElWQVRFX1RZUEVfRElTQ09WRVJZX0VSUk9SCQkJMHgwNAorI2RlZmluZSBOQ0lfREVBQ1RJVkFURV9UWVBFX0lETEVfTU9ERQkJCQkweDAwCisjZGVmaW5lIE5DSV9ERUFDVElWQVRFX1RZUEVfU0xFRVBfTU9ERQkJCQkweDAxCisjZGVmaW5lIE5DSV9ERUFDVElWQVRFX1RZUEVfU0xFRVBfQUZfTU9ERQkJCTB4MDIKKyNkZWZpbmUgTkNJX0RFQUNUSVZBVEVfVFlQRV9ESVNDT1ZFUlkJCQkJMHgwMwogCiAvKiBNZXNzYWdlIFR5cGUgKE1UKSAqLwogI2RlZmluZSBOQ0lfTVRfREFUQV9QS1QJCQkJCQkweDAwCkBAIC0xNDQsMTAgKzE2NSwxMCBAQAogI2RlZmluZSBuY2lfY29ubl9pZChoZHIpCQkoX191OCkoKChoZHIpWzBdKSYweDBmKQogCiAvKiBHSUQgdmFsdWVzICovCi0jZGVmaW5lCU5DSV9HSURfQ09SRQkJCQkJCTB4MAotI2RlZmluZQlOQ0lfR0lEX1JGX01HTVQJCQkJCQkweDEKLSNkZWZpbmUJTkNJX0dJRF9ORkNFRV9NR01UCQkJCQkweDIKLSNkZWZpbmUJTkNJX0dJRF9QUk9QUklFVEFSWQkJCQkJMHhmCisjZGVmaW5lIE5DSV9HSURfQ09SRQkJCQkJCTB4MAorI2RlZmluZSBOQ0lfR0lEX1JGX01HTVQJCQkJCQkweDEKKyNkZWZpbmUgTkNJX0dJRF9ORkNFRV9NR01UCQkJCQkweDIKKyNkZWZpbmUgTkNJX0dJRF9QUk9QUklFVEFSWQkJCQkJMHhmCiAKIC8qIC0tLS0gTkNJIFBhY2tldCBzdHJ1Y3R1cmVzIC0tLS0gKi8KICNkZWZpbmUgTkNJX0NUUkxfSERSX1NJWkUJCQkJCTMKQEAgLTE2OSwxOCArMTkwLDExIEBACiAvKiAtLS0tLSAgTkNJIENvbW1hbmRzIC0tLS0gKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogI2RlZmluZSBOQ0lfT1BfQ09SRV9SRVNFVF9DTUQJCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDApCi0KLSNkZWZpbmUgTkNJX09QX0NPUkVfSU5JVF9DTUQJCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDEpCi0KLSNkZWZpbmUgTkNJX09QX0NPUkVfU0VUX0NPTkZJR19DTUQJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwMikKLQotI2RlZmluZSBOQ0lfT1BfQ09SRV9DT05OX0NSRUFURV9DTUQJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwNCkKLXN0cnVjdCBuY2lfY29yZV9jb25uX2NyZWF0ZV9jbWQgewotCV9fdTgJdGFyZ2V0X2hhbmRsZTsKLQlfX3U4CW51bV90YXJnZXRfc3BlY2lmaWNfcGFyYW1zOworc3RydWN0IG5jaV9jb3JlX3Jlc2V0X2NtZCB7CisJX191OAlyZXNldF90eXBlOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBOQ0lfT1BfQ09SRV9DT05OX0NMT1NFX0NNRAluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDA2KQorI2RlZmluZSBOQ0lfT1BfQ09SRV9JTklUX0NNRAkJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwMSkKIAogI2RlZmluZSBOQ0lfT1BfUkZfRElTQ09WRVJfTUFQX0NNRAluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9SRl9NR01ULCAweDAwKQogc3RydWN0IGRpc2NfbWFwX2NvbmZpZyB7CkBAIC0yMTgsNiArMjMyLDcgQEAKIHN0cnVjdCBuY2lfY29yZV9yZXNldF9yc3AgewogCV9fdTgJc3RhdHVzOwogCV9fdTgJbmNpX3ZlcjsKKwlfX3U4CWNvbmZpZ19zdGF0dXM7CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIE5DSV9PUF9DT1JFX0lOSVRfUlNQCQluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDAxKQpAQCAtMjMyLDI0ICsyNDcsMTQgQEAKIHN0cnVjdCBuY2lfY29yZV9pbml0X3JzcF8yIHsKIAlfX3U4CW1heF9sb2dpY2FsX2Nvbm5lY3Rpb25zOwogCV9fbGUxNgltYXhfcm91dGluZ190YWJsZV9zaXplOwotCV9fdTgJbWF4X2NvbnRyb2xfcGFja2V0X3BheWxvYWRfbGVuZ3RoOwotCV9fbGUxNglyZl9zZW5kaW5nX2J1ZmZlcl9zaXplOwotCV9fbGUxNglyZl9yZWNlaXZpbmdfYnVmZmVyX3NpemU7Ci0JX19sZTE2CW1hbnVmYWN0dXJlcl9pZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgTkNJX09QX0NPUkVfU0VUX0NPTkZJR19SU1AJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwMikKLQotI2RlZmluZSBOQ0lfT1BfQ09SRV9DT05OX0NSRUFURV9SU1AJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwNCkKLXN0cnVjdCBuY2lfY29yZV9jb25uX2NyZWF0ZV9yc3AgewotCV9fdTgJc3RhdHVzOwotCV9fdTgJbWF4X3BrdF9wYXlsb2FkX3NpemU7CisJX191OAltYXhfY3RybF9wa3RfcGF5bG9hZF9sZW47CisJX19sZTE2CW1heF9zaXplX2Zvcl9sYXJnZV9wYXJhbXM7CisJX191OAltYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplOwogCV9fdTgJaW5pdGlhbF9udW1fY3JlZGl0czsKLQlfX3U4CWNvbm5faWQ7CisJX191OAltYW51ZmFjdF9pZDsKKwlfX2xlMzIJbWFudWZhY3Rfc3BlY2lmaWNfaW5mbzsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTkNJX09QX0NPUkVfQ09OTl9DTE9TRV9SU1AJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwNikKLQogI2RlZmluZSBOQ0lfT1BfUkZfRElTQ09WRVJfTUFQX1JTUAluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9SRl9NR01ULCAweDAwKQogCiAjZGVmaW5lIE5DSV9PUF9SRl9ESVNDT1ZFUl9SU1AJCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX1JGX01HTVQsIDB4MDMpCkBAIC0yNzAsMTIgKzI3NSw3IEBACiAJc3RydWN0IGNvbm5fY3JlZGl0X2VudHJ5CWNvbm5fZW50cmllc1tOQ0lfTUFYX05VTV9DT05OXTsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTkNJX09QX1JGX0ZJRUxEX0lORk9fTlRGCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDgpCi1zdHJ1Y3QgbmNpX3JmX2ZpZWxkX2luZm9fbnRmIHsKLQlfX3U4CXJmX2ZpZWxkX3N0YXR1czsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgTkNJX09QX1JGX0FDVElWQVRFX05URgkJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfUkZfTUdNVCwgMHgwNSkKKyNkZWZpbmUgTkNJX09QX1JGX0lOVEZfQUNUSVZBVEVEX05URgluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9SRl9NR01ULCAweDA1KQogc3RydWN0IHJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX25mY2FfcG9sbCB7CiAJX191MTYJc2Vuc19yZXM7CiAJX191OAluZmNpZDFfbGVuOwkvKiAwLCA0LCA3LCBvciAxMCBCeXRlcyAqLwpAQCAtMjg5LDE3ICsyODksMjAgQEAKIAlfX3U4CXJhdHNfcmVzWzIwXTsKIH07CiAKLXN0cnVjdCBuY2lfcmZfYWN0aXZhdGVfbnRmIHsKLQlfX3U4CXRhcmdldF9oYW5kbGU7CitzdHJ1Y3QgbmNpX3JmX2ludGZfYWN0aXZhdGVkX250ZiB7CisJX191OAlyZl9kaXNjb3ZlcnlfaWQ7CisJX191OAlyZl9pbnRlcmZhY2VfdHlwZTsKIAlfX3U4CXJmX3Byb3RvY29sOwotCV9fdTgJcmZfdGVjaF9hbmRfbW9kZTsKKwlfX3U4CWFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZTsKIAlfX3U4CXJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX2xlbjsKIAogCXVuaW9uIHsKIAkJc3RydWN0IHJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX25mY2FfcG9sbCBuZmNhX3BvbGw7CiAJfSByZl90ZWNoX3NwZWNpZmljX3BhcmFtczsKIAotCV9fdTgJcmZfaW50ZXJmYWNlX3R5cGU7CisJX191OAlkYXRhX2V4Y2hfcmZfdGVjaF9hbmRfbW9kZTsKKwlfX3U4CWRhdGFfZXhjaF90eF9iaXRfcmF0ZTsKKwlfX3U4CWRhdGFfZXhjaF9yeF9iaXRfcmF0ZTsKIAlfX3U4CWFjdGl2YXRpb25fcGFyYW1zX2xlbjsKIAogCXVuaW9uIHsKQEAgLTMwOSw1ICszMTIsOSBAQAogfSBfX3BhY2tlZDsKIAogI2RlZmluZSBOQ0lfT1BfUkZfREVBQ1RJVkFURV9OVEYJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfUkZfTUdNVCwgMHgwNikKK3N0cnVjdCBuY2lfcmZfZGVhY3RpdmF0ZV9udGYgeworCV9fdTgJdHlwZTsKKwlfX3U4CXJlYXNvbjsKK30gX19wYWNrZWQ7CiAKICNlbmRpZiAvKiBfX05DSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZmMvbmNpX2NvcmUuaCBiL2luY2x1ZGUvbmV0L25mYy9uY2lfY29yZS5oCmluZGV4IGI4YjRiYmQuLmM5MmI2OWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25mYy9uY2lfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L25mYy9uY2lfY29yZS5oCkBAIC0xMDksMTUgKzEwOSwxMiBAQAogCQkJCVtOQ0lfTUFYX1NVUFBPUlRFRF9SRl9JTlRFUkZBQ0VTXTsKIAlfX3U4CQkJbWF4X2xvZ2ljYWxfY29ubmVjdGlvbnM7CiAJX191MTYJCQltYXhfcm91dGluZ190YWJsZV9zaXplOwotCV9fdTgJCQltYXhfY29udHJvbF9wYWNrZXRfcGF5bG9hZF9sZW5ndGg7Ci0JX191MTYJCQlyZl9zZW5kaW5nX2J1ZmZlcl9zaXplOwotCV9fdTE2CQkJcmZfcmVjZWl2aW5nX2J1ZmZlcl9zaXplOwotCV9fdTE2CQkJbWFudWZhY3R1cmVyX2lkOwotCi0JLyogcmVjZWl2ZWQgZHVyaW5nIE5DSV9PUF9DT1JFX0NPTk5fQ1JFQVRFX1JTUCBmb3Igc3RhdGljIGNvbm4gMCAqLwotCV9fdTgJCQltYXhfcGt0X3BheWxvYWRfc2l6ZTsKKwlfX3U4CQkJbWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuOworCV9fdTE2CQkJbWF4X3NpemVfZm9yX2xhcmdlX3BhcmFtczsKKwlfX3U4CQkJbWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZTsKIAlfX3U4CQkJaW5pdGlhbF9udW1fY3JlZGl0czsKLQlfX3U4CQkJY29ubl9pZDsKKwlfX3U4CQkJbWFudWZhY3RfaWQ7CisJX191MzIJCQltYW51ZmFjdF9zcGVjaWZpY19pbmZvOwogCiAJLyogc3RvcmVkIGR1cmluZyBuY2lfZGF0YV9leGNoYW5nZSAqLwogCWRhdGFfZXhjaGFuZ2VfY2JfdAlkYXRhX2V4Y2hhbmdlX2NiOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcmVndWxhdG9yeS5oIGIvaW5jbHVkZS9uZXQvcmVndWxhdG9yeS5oCmluZGV4IGViN2QzYzIuLmE1Zjc5OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3JlZ3VsYXRvcnkuaAorKysgYi9pbmNsdWRlL25ldC9yZWd1bGF0b3J5LmgKQEAgLTQ4LDYgKzQ4LDEwIEBACiAgKiAJOTkgLSBidWlsdCBieSBkcml2ZXIgYnV0IGEgc3BlY2lmaWMgYWxwaGEyIGNhbm5vdCBiZSBkZXRlcm1pbmVkCiAgKiAJOTggLSByZXN1bHQgb2YgYW4gaW50ZXJzZWN0aW9uIGJldHdlZW4gdHdvIHJlZ3VsYXRvcnkgZG9tYWlucwogICoJOTcgLSByZWd1bGF0b3J5IGRvbWFpbiBoYXMgbm90IHlldCBiZWVuIGNvbmZpZ3VyZWQKKyAqIEBkZnNfcmVnaW9uOiBJZiBDUkRBIHJlc3BvbmRlZCB3aXRoIGEgcmVndWxhdG9yeSBkb21haW4gdGhhdCByZXF1aXJlcworICoJREZTIG1hc3RlciBvcGVyYXRpb24gb24gYSBrbm93biBERlMgcmVnaW9uIChOTDgwMjExX0RGU18qKSwKKyAqCWRmc19yZWdpb24gcmVwcmVzZW50cyB0aGF0IHJlZ2lvbi4gRHJpdmVycyBjYW4gdXNlIHRoaXMgYW5kIHRoZQorICoJQGFscGhhMiB0byBhZGp1c3QgdGhlaXIgZGV2aWNlJ3MgREZTIHBhcmFtZXRlcnMgYXMgcmVxdWlyZWQuCiAgKiBAaW50ZXJzZWN0OiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgd2lyZWxlc3MgY29yZSBzaG91bGQgaW50ZXJzZWN0CiAgKiAJdGhlIHJlcXVlc3RlZCByZWd1bGF0b3J5IGRvbWFpbiB3aXRoIHRoZSBwcmVzZW50bHkgc2V0IHJlZ3VsYXRvcnkKICAqIAlkb21haW4uCkBAIC02Nyw2ICs3MSw3IEBACiAJaW50IHdpcGh5X2lkeDsKIAllbnVtIG5sODAyMTFfcmVnX2luaXRpYXRvciBpbml0aWF0b3I7CiAJY2hhciBhbHBoYTJbMl07CisJdTggZGZzX3JlZ2lvbjsKIAlib29sIGludGVyc2VjdDsKIAlib29sIHByb2Nlc3NlZDsKIAllbnVtIGVudmlyb25tZW50X2NhcCBjb3VudHJ5X2llX2VudjsKQEAgLTkzLDYgKzk4LDcgQEAKIHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluIHsKIAl1MzIgbl9yZWdfcnVsZXM7CiAJY2hhciBhbHBoYTJbMl07CisJdTggZGZzX3JlZ2lvbjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlIHJlZ19ydWxlc1tdOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaCBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKaW5kZXggMmViMjA3ZS4uZjZiYjA4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAorKysgYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCkBAIC00LDcgKzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CiAjaW5jbHVkZSA8bmV0L2dlbl9zdGF0cy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc29jay5oIGIvaW5jbHVkZS9uZXQvc29jay5oCmluZGV4IDVhYzY4MmYuLmMwYzMyYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9zb2NrLmgKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0X251bGxzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4JLyogc3RydWN0IHNrX2J1ZmYgKi8KQEAgLTc2LDggKzc1LDggQEAKIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcgbXNnKTsgfSB3aGlsZSAoMCkKICNlbHNlCiAvKiBWYWxpZGF0ZSBhcmd1bWVudHMgYW5kIGRvIG5vdGhpbmcgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKLVNPQ0tfREVCVUcoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBjaGFyICptc2csIC4uLikKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMiwgMykKK3ZvaWQgU09DS19ERUJVRyhzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IGNoYXIgKm1zZywgLi4uKQogewogfQogI2VuZGlmCkBAIC01NjQsNiArNTYzLDcgQEAKIAlTT0NLX0ZBU1lOQywgLyogZmFzeW5jKCkgYWN0aXZlICovCiAJU09DS19SWFFfT1ZGTCwKIAlTT0NLX1pFUk9DT1BZLCAvKiBidWZmZXJzIGZyb20gdXNlcnNwYWNlICovCisJU09DS19XSUZJX1NUQVRVUywgLyogcHVzaCB3aWZpIHN0YXR1cyB0byB1c2Vyc3BhY2UgKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzb2NrX2NvcHlfZmxhZ3Moc3RydWN0IHNvY2sgKm5zaywgc3RydWN0IHNvY2sgKm9zaykKQEAgLTcyOSw2ICs3MjksNyBAQAogc3RydWN0IHRpbWV3YWl0X3NvY2tfb3BzOwogc3RydWN0IGluZXRfaGFzaGluZm87CiBzdHJ1Y3QgcmF3X2hhc2hpbmZvOworc3RydWN0IG1vZHVsZTsKIAogLyogTmV0d29ya2luZyBwcm90b2NvbCBibG9ja3Mgd2UgYXR0YWNoIHRvIHNvY2tldHMuCiAgKiBzb2NrZXQgbGF5ZXIgLT4gdHJhbnNwb3J0IGxheWVyIGludGVyZmFjZQpAQCAtMTcxNCw2ICsxNzE1LDggQEAKIAogZXh0ZXJuIHZvaWQgX19zb2NrX3JlY3ZfdGltZXN0YW1wKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKnNrLAogCXN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIHZvaWQgX19zb2NrX3JlY3Zfd2lmaV9zdGF0dXMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCisJc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQKIHNvY2tfcmVjdl90aW1lc3RhbXAoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xNzQxLDYgKzE3NDQsOSBAQAogCQlfX3NvY2tfcmVjdl90aW1lc3RhbXAobXNnLCBzaywgc2tiKTsKIAllbHNlCiAJCXNrLT5za19zdGFtcCA9IGt0OworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19XSUZJX1NUQVRVUykgJiYgc2tiLT53aWZpX2Fja2VkX3ZhbGlkKQorCQlfX3NvY2tfcmVjdl93aWZpX3N0YXR1cyhtc2csIHNrLCBza2IpOwogfQogCiBleHRlcm4gdm9pZCBfX3NvY2tfcmVjdl90c19hbmRfZHJvcHMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y3AuaCBiL2luY2x1ZGUvbmV0L3RjcC5oCmluZGV4IGUxNDdmNDIuLmJiMThjNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjcC5oCisrKyBiL2luY2x1ZGUvbmV0L3RjcC5oCkBAIC0xNDAzLDExICsxNDAzLDEzIEBACiAJVENQX1NFUV9TVEFURV9USU1FX1dBSVQsCiB9OwogCitpbnQgdGNwX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKKwogc3RydWN0IHRjcF9zZXFfYWZpbmZvIHsKLQljaGFyCQkJKm5hbWU7Ci0Jc2FfZmFtaWx5X3QJCWZhbWlseTsKLQlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCXNlcV9mb3BzOwotCXN0cnVjdCBzZXFfb3BlcmF0aW9ucwlzZXFfb3BzOworCWNoYXIJCQkJKm5hbWU7CisJc2FfZmFtaWx5X3QJCQlmYW1pbHk7CisJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkqc2VxX2ZvcHM7CisJc3RydWN0IHNlcV9vcGVyYXRpb25zCQlzZXFfb3BzOwogfTsKIAogc3RydWN0IHRjcF9pdGVyX3N0YXRlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcC5oIGIvaW5jbHVkZS9uZXQvdWRwLmgKaW5kZXggNjdlYTZmYy4uM2IyODVmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdWRwLmgKKysrIGIvaW5jbHVkZS9uZXQvdWRwLmgKQEAgLTIzMCwxMiArMjMwLDE0IEBACiAjZW5kaWYKIAogLyogL3Byb2MgKi8KK2ludCB1ZHBfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCiBzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gewotCWNoYXIJCQkqbmFtZTsKLQlzYV9mYW1pbHlfdAkJZmFtaWx5OwotCXN0cnVjdCB1ZHBfdGFibGUJKnVkcF90YWJsZTsKLQlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCXNlcV9mb3BzOwotCXN0cnVjdCBzZXFfb3BlcmF0aW9ucwlzZXFfb3BzOworCWNoYXIJCQkJKm5hbWU7CisJc2FfZmFtaWx5X3QJCQlmYW1pbHk7CisJc3RydWN0IHVkcF90YWJsZQkJKnVkcF90YWJsZTsKKwljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCSpzZXFfZm9wczsKKwlzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMJCXNlcV9vcHM7CiB9OwogCiBzdHJ1Y3QgdWRwX2l0ZXJfc3RhdGUgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl91c2VyX3ZlcmJzLmgKaW5kZXggZmU1YjA1MS4uODFhYmEzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfdXNlcl92ZXJicy5oCkBAIC04MSw3ICs4MSwxMSBAQAogCUlCX1VTRVJfVkVSQlNfQ01EX01PRElGWV9TUlEsCiAJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfU1JRLAogCUlCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfU1JRLAotCUlCX1VTRVJfVkVSQlNfQ01EX1BPU1RfU1JRX1JFQ1YKKwlJQl9VU0VSX1ZFUkJTX0NNRF9QT1NUX1NSUV9SRUNWLAorCUlCX1VTRVJfVkVSQlNfQ01EX09QRU5fWFJDRCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9DTE9TRV9YUkNELAorCUlCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9YU1JRLAorCUlCX1VTRVJfVkVSQlNfQ01EX09QRU5fUVAKIH07CiAKIC8qCkBAIC0yMjIsNiArMjI2LDIxIEBACiAJX191MzIgcGRfaGFuZGxlOwogfTsKIAorc3RydWN0IGliX3V2ZXJic19vcGVuX3hyY2QgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGZkOworCV9fdTMyIG9mbGFnczsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfb3Blbl94cmNkX3Jlc3AgeworCV9fdTMyIHhyY2RfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19jbG9zZV94cmNkIHsKKwlfX3UzMiB4cmNkX2hhbmRsZTsKK307CisKIHN0cnVjdCBpYl91dmVyYnNfcmVnX21yIHsKIAlfX3U2NCByZXNwb25zZTsKIAlfX3U2NCBzdGFydDsKQEAgLTQwNCw2ICs0MjMsMTcgQEAKIAlfX3U2NCBkcml2ZXJfZGF0YVswXTsKIH07CiAKK3N0cnVjdCBpYl91dmVyYnNfb3Blbl9xcCB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgdXNlcl9oYW5kbGU7CisJX191MzIgcGRfaGFuZGxlOworCV9fdTMyIHFwbjsKKwlfX3U4ICBxcF90eXBlOworCV9fdTggIHJlc2VydmVkWzddOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworLyogYWxzbyB1c2VkIGZvciBvcGVuIHJlc3BvbnNlICovCiBzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9xcF9yZXNwIHsKIAlfX3UzMiBxcF9oYW5kbGU7CiAJX191MzIgcXBuOwpAQCAtNjQ4LDExICs2NzgsMjUgQEAKIAlfX3U2NCBkcml2ZXJfZGF0YVswXTsKIH07CiAKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3hzcnEgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IHVzZXJfaGFuZGxlOworCV9fdTMyIHNycV90eXBlOworCV9fdTMyIHBkX2hhbmRsZTsKKwlfX3UzMiBtYXhfd3I7CisJX191MzIgbWF4X3NnZTsKKwlfX3UzMiBzcnFfbGltaXQ7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191MzIgeHJjZF9oYW5kbGU7CisJX191MzIgY3FfaGFuZGxlOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKwogc3RydWN0IGliX3V2ZXJic19jcmVhdGVfc3JxX3Jlc3AgewogCV9fdTMyIHNycV9oYW5kbGU7CiAJX191MzIgbWF4X3dyOwogCV9fdTMyIG1heF9zZ2U7Ci0JX191MzIgcmVzZXJ2ZWQ7CisJX191MzIgc3JxbjsKIH07CiAKIHN0cnVjdCBpYl91dmVyYnNfbW9kaWZ5X3NycSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCmluZGV4IDIyOGJlM2UuLmJmNWRhYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCisrKyBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCkBAIC0xMTIsNiArMTEyLDcgQEAKIAkgKi8KIAlJQl9ERVZJQ0VfVURfSVBfQ1NVTQkJPSAoMTw8MTgpLAogCUlCX0RFVklDRV9VRF9UU08JCT0gKDE8PDE5KSwKKwlJQl9ERVZJQ0VfWFJDCQkJPSAoMTw8MjApLAogCUlCX0RFVklDRV9NRU1fTUdUX0VYVEVOU0lPTlMJPSAoMTw8MjEpLAogCUlCX0RFVklDRV9CTE9DS19NVUxUSUNBU1RfTE9PUEJBQ0sgPSAoMTw8MjIpLAogfTsKQEAgLTIwNyw2ICsyMDgsNyBAQAogCUlCX1BPUlRfU01fRElTQUJMRUQJCQk9IDEgPDwgMTAsCiAJSUJfUE9SVF9TWVNfSU1BR0VfR1VJRF9TVVAJCT0gMSA8PCAxMSwKIAlJQl9QT1JUX1BLRVlfU1dfRVhUX1BPUlRfVFJBUF9TVVAJPSAxIDw8IDEyLAorCUlCX1BPUlRfRVhURU5ERURfU1BFRURTX1NVUCAgICAgICAgICAgICA9IDEgPDwgMTQsCiAJSUJfUE9SVF9DTV9TVVAJCQkJPSAxIDw8IDE2LAogCUlCX1BPUlRfU05NUF9UVU5ORUxfU1VQCQkJPSAxIDw8IDE3LAogCUlCX1BPUlRfUkVJTklUX1NVUAkJCT0gMSA8PCAxOCwKQEAgLTQxNSw3ICs0MTcsMTUgQEAKIAlJQl9SQVRFXzQwX0dCUFMgID0gNywKIAlJQl9SQVRFXzYwX0dCUFMgID0gOCwKIAlJQl9SQVRFXzgwX0dCUFMgID0gOSwKLQlJQl9SQVRFXzEyMF9HQlBTID0gMTAKKwlJQl9SQVRFXzEyMF9HQlBTID0gMTAsCisJSUJfUkFURV8xNF9HQlBTICA9IDExLAorCUlCX1JBVEVfNTZfR0JQUyAgPSAxMiwKKwlJQl9SQVRFXzExMl9HQlBTID0gMTMsCisJSUJfUkFURV8xNjhfR0JQUyA9IDE0LAorCUlCX1JBVEVfMjVfR0JQUyAgPSAxNSwKKwlJQl9SQVRFXzEwMF9HQlBTID0gMTYsCisJSUJfUkFURV8yMDBfR0JQUyA9IDE3LAorCUlCX1JBVEVfMzAwX0dCUFMgPSAxOAogfTsKIAogLyoqCkBAIC00MjcsNiArNDM3LDEzIEBACiBpbnQgaWJfcmF0ZV90b19tdWx0KGVudW0gaWJfcmF0ZSByYXRlKSBfX2F0dHJpYnV0ZV9jb25zdF9fOwogCiAvKioKKyAqIGliX3JhdGVfdG9fbWJwcyAtIENvbnZlcnQgdGhlIElCIHJhdGUgZW51bSB0byBNYnBzLgorICogRm9yIGV4YW1wbGUsIElCX1JBVEVfMl81X0dCUFMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMjUwMC4KKyAqIEByYXRlOiByYXRlIHRvIGNvbnZlcnQuCisgKi8KK2ludCBpYl9yYXRlX3RvX21icHMoZW51bSBpYl9yYXRlIHJhdGUpIF9fYXR0cmlidXRlX2NvbnN0X187CisKKy8qKgogICogbXVsdF90b19pYl9yYXRlIC0gQ29udmVydCBhIG11bHRpcGxlIG9mIDIuNSBHYml0L3NlYyB0byBhbiBJQiByYXRlCiAgKiBlbnVtLgogICogQG11bHQ6IG11bHRpcGxlIHRvIGNvbnZlcnQuCkBAIC01MjIsNiArNTM5LDExIEBACiAJSUJfQ1FfUkVQT1JUX01JU1NFRF9FVkVOVFMJPSAxIDw8IDIsCiB9OwogCitlbnVtIGliX3NycV90eXBlIHsKKwlJQl9TUlFUX0JBU0lDLAorCUlCX1NSUVRfWFJDCit9OworCiBlbnVtIGliX3NycV9hdHRyX21hc2sgewogCUlCX1NSUV9NQVhfV1IJPSAxIDw8IDAsCiAJSUJfU1JRX0xJTUlUCT0gMSA8PCAxLApAQCAtNTM3LDYgKzU1OSwxNCBAQAogCXZvaWQJCSAgICAgICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKik7CiAJdm9pZAkJICAgICAgICpzcnFfY29udGV4dDsKIAlzdHJ1Y3QgaWJfc3JxX2F0dHIJYXR0cjsKKwllbnVtIGliX3NycV90eXBlCXNycV90eXBlOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGliX3hyY2QgKnhyY2Q7CisJCQlzdHJ1Y3QgaWJfY3EgICAqY3E7CisJCX0geHJjOworCX0gZXh0OwogfTsKIAogc3RydWN0IGliX3FwX2NhcCB7CkBAIC01NjUsNyArNTk1LDExIEBACiAJSUJfUVBUX1VDLAogCUlCX1FQVF9VRCwKIAlJQl9RUFRfUkFXX0lQVjYsCi0JSUJfUVBUX1JBV19FVEhFUlRZUEUKKwlJQl9RUFRfUkFXX0VUSEVSVFlQRSwKKwkvKiBTYXZlIDggZm9yIFJBV19QQUNLRVQgKi8KKwlJQl9RUFRfWFJDX0lOSSA9IDksCisJSUJfUVBUX1hSQ19UR1QsCisJSUJfUVBUX01BWAogfTsKIAogZW51bSBpYl9xcF9jcmVhdGVfZmxhZ3MgewpAQCAtNTc5LDYgKzYxMyw3IEBACiAJc3RydWN0IGliX2NxCSAgICAgICAqc2VuZF9jcTsKIAlzdHJ1Y3QgaWJfY3EJICAgICAgICpyZWN2X2NxOwogCXN0cnVjdCBpYl9zcnEJICAgICAgICpzcnE7CisJc3RydWN0IGliX3hyY2QJICAgICAgICp4cmNkOyAgICAgLyogWFJDIFRHVCBRUHMgb25seSAqLwogCXN0cnVjdCBpYl9xcF9jYXAJY2FwOwogCWVudW0gaWJfc2lnX3R5cGUJc3Ffc2lnX3R5cGU7CiAJZW51bSBpYl9xcF90eXBlCQlxcF90eXBlOwpAQCAtNTg2LDYgKzYyMSwxMyBAQAogCXU4CQkJcG9ydF9udW07IC8qIHNwZWNpYWwgUVAgdHlwZXMgb25seSAqLwogfTsKIAorc3RydWN0IGliX3FwX29wZW5fYXR0ciB7CisJdm9pZCAgICAgICAgICAgICAgICAgICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKik7CisJdm9pZAkJICAgICAgICpxcF9jb250ZXh0OworCXUzMgkJCXFwX251bTsKKwllbnVtIGliX3FwX3R5cGUJCXFwX3R5cGU7Cit9OworCiBlbnVtIGliX3Jucl90aW1lb3V0IHsKIAlJQl9STlJfVElNRVJfNjU1XzM2ID0gIDAsCiAJSUJfUk5SX1RJTUVSXzAwMF8wMSA9ICAxLApAQCAtNzcwLDYgKzgxMiw3IEBACiAJCQl1MzIJCQkJcmtleTsKIAkJfSBmYXN0X3JlZzsKIAl9IHdyOworCXUzMgkJCXhyY19yZW1vdGVfc3JxX251bTsJLyogWFJDIFRHVCBRUHMgb25seSAqLwogfTsKIAogc3RydWN0IGliX3JlY3Zfd3IgewpAQCAtODMxLDYgKzg3NCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlxcF9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQJc3JxX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlhaF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJeHJjZF9saXN0OwogCWludAkJCWNsb3Npbmc7CiB9OwogCkBAIC04NTgsNiArOTAyLDE1IEBACiAJYXRvbWljX3QgICAgICAgICAgCXVzZWNudDsgLyogY291bnQgYWxsIHJlc291cmNlcyAqLwogfTsKIAorc3RydWN0IGliX3hyY2QgeworCXN0cnVjdCBpYl9kZXZpY2UgICAgICAgKmRldmljZTsKKwlhdG9taWNfdAkJdXNlY250OyAvKiBjb3VudCBhbGwgZXhwb3NlZCByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgaW5vZGUJICAgICAgICppbm9kZTsKKworCXN0cnVjdCBtdXRleAkJdGd0X3FwX211dGV4OworCXN0cnVjdCBsaXN0X2hlYWQJdGd0X3FwX2xpc3Q7Cit9OworCiBzdHJ1Y3QgaWJfYWggewogCXN0cnVjdCBpYl9kZXZpY2UJKmRldmljZTsKIAlzdHJ1Y3QgaWJfcGQJCSpwZDsKQEAgLTg4Miw3ICs5MzUsMTYgQEAKIAlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICp1b2JqZWN0OwogCXZvaWQJCSAgICAgICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKik7CiAJdm9pZAkJICAgICAgICpzcnFfY29udGV4dDsKKwllbnVtIGliX3NycV90eXBlCXNycV90eXBlOwogCWF0b21pY190CQl1c2VjbnQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgaWJfeHJjZCAqeHJjZDsKKwkJCXN0cnVjdCBpYl9jcSAgICpjcTsKKwkJCXUzMgkJc3JxX251bTsKKwkJfSB4cmM7CisJfSBleHQ7CiB9OwogCiBzdHJ1Y3QgaWJfcXAgewpAQCAtODkxLDYgKzk1MywxMSBAQAogCXN0cnVjdCBpYl9jcQkgICAgICAgKnNlbmRfY3E7CiAJc3RydWN0IGliX2NxCSAgICAgICAqcmVjdl9jcTsKIAlzdHJ1Y3QgaWJfc3JxCSAgICAgICAqc3JxOworCXN0cnVjdCBpYl94cmNkCSAgICAgICAqeHJjZDsgLyogWFJDIFRHVCBRUHMgb25seSAqLworCXN0cnVjdCBsaXN0X2hlYWQJeHJjZF9saXN0OworCWF0b21pY190CQl1c2VjbnQ7IC8qIGNvdW50IHRpbWVzIG9wZW5lZCAqLworCXN0cnVjdCBsaXN0X2hlYWQJb3Blbl9saXN0OworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgKnJlYWxfcXA7CiAJc3RydWN0IGliX3VvYmplY3QgICAgICAqdW9iamVjdDsKIAl2b2lkICAgICAgICAgICAgICAgICAgKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgaWJfZXZlbnQgKiwgdm9pZCAqKTsKIAl2b2lkCQkgICAgICAgKnFwX2NvbnRleHQ7CkBAIC0xMTQ5LDYgKzEyMTYsMTAgQEAKIAkJCQkJCSAgc3RydWN0IGliX2dyaCAqaW5fZ3JoLAogCQkJCQkJICBzdHJ1Y3QgaWJfbWFkICppbl9tYWQsCiAJCQkJCQkgIHN0cnVjdCBpYl9tYWQgKm91dF9tYWQpOworCXN0cnVjdCBpYl94cmNkICoJICAgKCphbGxvY194cmNkKShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UsCisJCQkJCQkgc3RydWN0IGliX3Vjb250ZXh0ICp1Y29udGV4dCwKKwkJCQkJCSBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKTsKKwlpbnQJCQkgICAoKmRlYWxsb2NfeHJjZCkoc3RydWN0IGliX3hyY2QgKnhyY2QpOwogCiAJc3RydWN0IGliX2RtYV9tYXBwaW5nX29wcyAgICpkbWFfb3BzOwogCkBAIC0xNDQzLDYgKzE1MTQsMjUgQEAKIGludCBpYl9kZXN0cm95X3FwKHN0cnVjdCBpYl9xcCAqcXApOwogCiAvKioKKyAqIGliX29wZW5fcXAgLSBPYnRhaW4gYSByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgc2hhcmFibGUgUVAuCisgKiBAeHJjZCAtIFhSQyBkb21haW4KKyAqIEBxcF9vcGVuX2F0dHI6IEF0dHJpYnV0ZXMgaWRlbnRpZnlpbmcgdGhlIFFQIHRvIG9wZW4uCisgKgorICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHNoYXJhYmxlIFFQLgorICovCitzdHJ1Y3QgaWJfcXAgKmliX29wZW5fcXAoc3RydWN0IGliX3hyY2QgKnhyY2QsCisJCQkgc3RydWN0IGliX3FwX29wZW5fYXR0ciAqcXBfb3Blbl9hdHRyKTsKKworLyoqCisgKiBpYl9jbG9zZV9xcCAtIFJlbGVhc2UgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIGEgUVAuCisgKiBAcXA6IFRoZSBRUCBoYW5kbGUgdG8gcmVsZWFzZQorICoKKyAqIFRoZSBvcGVuZWQgUVAgaGFuZGxlIGlzIHJlbGVhc2VkIGJ5IHRoZSBjYWxsZXIuICBUaGUgdW5kZXJseWluZworICogc2hhcmVkIFFQIGlzIG5vdCBkZXN0cm95ZWQgdW50aWwgYWxsIGludGVybmFsIHJlZmVyZW5jZXMgYXJlIHJlbGVhc2VkLgorICovCitpbnQgaWJfY2xvc2VfcXAoc3RydWN0IGliX3FwICpxcCk7CisKKy8qKgogICogaWJfcG9zdF9zZW5kIC0gUG9zdHMgYSBsaXN0IG9mIHdvcmsgcmVxdWVzdHMgdG8gdGhlIHNlbmQgcXVldWUgb2YKICAqICAgdGhlIHNwZWNpZmllZCBRUC4KICAqIEBxcDogVGhlIFFQIHRvIHBvc3QgdGhlIHdvcmsgcmVxdWVzdCBvbi4KQEAgLTIwNjAsNCArMjE1MCwxNiBAQAogICovCiBpbnQgaWJfZGV0YWNoX21jYXN0KHN0cnVjdCBpYl9xcCAqcXAsIHVuaW9uIGliX2dpZCAqZ2lkLCB1MTYgbGlkKTsKIAorLyoqCisgKiBpYl9hbGxvY194cmNkIC0gQWxsb2NhdGVzIGFuIFhSQyBkb21haW4uCisgKiBAZGV2aWNlOiBUaGUgZGV2aWNlIG9uIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBYUkMgZG9tYWluLgorICovCitzdHJ1Y3QgaWJfeHJjZCAqaWJfYWxsb2NfeHJjZChzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpOworCisvKioKKyAqIGliX2RlYWxsb2NfeHJjZCAtIERlYWxsb2NhdGVzIGFuIFhSQyBkb21haW4uCisgKiBAeHJjZDogVGhlIFhSQyBkb21haW4gdG8gZGVhbGxvY2F0ZS4KKyAqLworaW50IGliX2RlYWxsb2NfeHJjZChzdHJ1Y3QgaWJfeHJjZCAqeHJjZCk7CisKICNlbmRpZiAvKiBJQl9WRVJCU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaXdfY20uaCBiL2luY2x1ZGUvcmRtYS9pd19jbS5oCmluZGV4IDJkMDE5MWMuLjFhMDQ2YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pd19jbS5oCisrKyBiL2luY2x1ZGUvcmRtYS9pd19jbS5oCkBAIC01Miw4ICs1MiwxMCBAQAogCXN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbF9hZGRyOwogCXN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVfYWRkcjsKIAl2b2lkICpwcml2YXRlX2RhdGE7Ci0JdTggcHJpdmF0ZV9kYXRhX2xlbjsKIAl2b2lkICpwcm92aWRlcl9kYXRhOworCXU4IHByaXZhdGVfZGF0YV9sZW47CisJdTggb3JkOworCXU4IGlyZDsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL3JkbWFfY20uaCBiL2luY2x1ZGUvcmRtYS9yZG1hX2NtLmgKaW5kZXggMjY5NzdjMS4uNTE5ODhmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL3JkbWFfY20uaAorKysgYi9pbmNsdWRlL3JkbWEvcmRtYV9jbS5oCkBAIC02NSw2ICs2NSw3IEBACiBlbnVtIHJkbWFfcG9ydF9zcGFjZSB7CiAJUkRNQV9QU19TRFAgICA9IDB4MDAwMSwKIAlSRE1BX1BTX0lQT0lCID0gMHgwMDAyLAorCVJETUFfUFNfSUIgICAgPSAweDAxM0YsCiAJUkRNQV9QU19UQ1AgICA9IDB4MDEwNiwKIAlSRE1BX1BTX1VEUCAgID0gMHgwMTExLAogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9yZG1hX3VzZXJfY20uaCBiL2luY2x1ZGUvcmRtYS9yZG1hX3VzZXJfY20uaAppbmRleCBmYzgyYzE4Li41MzQ4YTAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvcmRtYV91c2VyX2NtLmgKKysrIGIvaW5jbHVkZS9yZG1hL3JkbWFfdXNlcl9jbS5oCkBAIC03Nyw3ICs3Nyw4IEBACiAJX191NjQgdWlkOwogCV9fdTY0IHJlc3BvbnNlOwogCV9fdTE2IHBzOwotCV9fdTggIHJlc2VydmVkWzZdOworCV9fdTggIHFwX3R5cGU7CisJX191OCAgcmVzZXJ2ZWRbNV07CiB9OwogCiBzdHJ1Y3QgcmRtYV91Y21fY3JlYXRlX2lkX3Jlc3AgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2lzY3NpX2lmLmggYi9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaAppbmRleCBkZGIwNDU2Li4yNzAzZTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaAorKysgYi9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaApAQCAtNTksNiArNTksNyBAQAogCUlTQ1NJX1VFVkVOVF9UUkFOU1BPUlRfRVBfQ09OTkVDVF9USFJPVUdIX0hPU1QJPSBVRVZFTlRfQkFTRSArIDE5LAogCiAJSVNDU0lfVUVWRU5UX1BBVEhfVVBEQVRFCT0gVUVWRU5UX0JBU0UgKyAyMCwKKwlJU0NTSV9VRVZFTlRfU0VUX0lGQUNFX1BBUkFNUwk9IFVFVkVOVF9CQVNFICsgMjEsCiAKIAkvKiB1cCBldmVudHMgKi8KIAlJU0NTSV9LRVZFTlRfUkVDVl9QRFUJCT0gS0VWRU5UX0JBU0UgKyAxLApAQCAtNzAsNiArNzEsNyBAQAogCiAJSVNDU0lfS0VWRU5UX1BBVEhfUkVRCQk9IEtFVkVOVF9CQVNFICsgNywKIAlJU0NTSV9LRVZFTlRfSUZfRE9XTgkJPSBLRVZFTlRfQkFTRSArIDgsCisJSVNDU0lfS0VWRU5UX0NPTk5fTE9HSU5fU1RBVEUgICA9IEtFVkVOVF9CQVNFICsgOSwKIH07CiAKIGVudW0gaXNjc2lfdGd0X2RzY3ZyIHsKQEAgLTE3Miw2ICsxNzQsMTAgQEAKIAkJc3RydWN0IG1zZ19zZXRfcGF0aCB7CiAJCQl1aW50MzJfdAlob3N0X25vOwogCQl9IHNldF9wYXRoOworCQlzdHJ1Y3QgbXNnX3NldF9pZmFjZV9wYXJhbXMgeworCQkJdWludDMyX3QJaG9zdF9ubzsKKwkJCXVpbnQzMl90CWNvdW50OworCQl9IHNldF9pZmFjZV9wYXJhbXM7CiAJfSB1OwogCXVuaW9uIHsKIAkJLyogbWVzc2FnZXMgayAtPiB1ICovCkBAIC0xOTMsNiArMTk5LDExIEBACiAJCQl1aW50MzJfdAljaWQ7CiAJCQl1aW50NjRfdAlyZWN2X2hhbmRsZTsKIAkJfSByZWN2X3JlcTsKKwkJc3RydWN0IG1zZ19jb25uX2xvZ2luIHsKKwkJCXVpbnQzMl90ICAgICAgICBzaWQ7CisJCQl1aW50MzJfdCAgICAgICAgY2lkOworCQkJdWludDMyX3QgICAgICAgIHN0YXRlOyAvKiBlbnVtIGlzY3NpX2Nvbm5fc3RhdGUgKi8KKwkJfSBjb25uX2xvZ2luOwogCQlzdHJ1Y3QgbXNnX2Nvbm5fZXJyb3IgewogCQkJdWludDMyX3QJc2lkOwogCQkJdWludDMyX3QJY2lkOwpAQCAtMjE0LDYgKzIyNSwyMSBAQAogCX0gcjsKIH0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKHNpemVvZih1aW50NjRfdCkpKSk7CiAKK2VudW0gaXNjc2lfcGFyYW1fdHlwZSB7CisJSVNDU0lfUEFSQU0sCQkvKiBpc2NzaV9wYXJhbSAoc2Vzc2lvbiwgY29ubiwgdGFyZ2V0LCBMVSkgKi8KKwlJU0NTSV9IT1NUX1BBUkFNLAkvKiBpc2NzaV9ob3N0X3BhcmFtICovCisJSVNDU0lfTkVUX1BBUkFNLAkvKiBpc2NzaV9uZXRfcGFyYW0gKi8KK307CisKK3N0cnVjdCBpc2NzaV9pZmFjZV9wYXJhbV9pbmZvIHsKKwl1aW50MzJfdCBpZmFjZV9udW07CS8qIGlmYWNlIG51bWJlciwgMCAtIG4gKi8KKwl1aW50MzJfdCBsZW47CQkvKiBBY3R1YWwgbGVuZ3RoIG9mIHRoZSBwYXJhbSAqLworCXVpbnQxNl90IHBhcmFtOwkJLyogaXNjc2kgcGFyYW0gdmFsdWUgKi8KKwl1aW50OF90IGlmYWNlX3R5cGU7CS8qIElQdjQgb3IgSVB2NiAqLworCXVpbnQ4X3QgcGFyYW1fdHlwZTsJLyogaXNjc2lfcGFyYW1fdHlwZSAqLworCXVpbnQ4X3QgdmFsdWVbMF07CS8qIGxlbmd0aCBzaXplZCB2YWx1ZSBmb2xsb3dzICovCit9IF9fcGFja2VkOworCiAvKgogICogVG8ga2VlcCB0aGUgc3RydWN0IGlzY3NpX3VldmVudCBzaXplIHRoZSBzYW1lIGZvciB1c2Vyc3BhY2UgY29kZQogICogY29tcGF0aWJpbGl0eSwgdGhlIG1haW4gc3RydWN0dXJlIGZvciBJU0NTSV9VRVZFTlRfUEFUSF9VUERBVEUgYW5kCkBAIC0yMzcsNiArMjYzLDcxIEBACiAJdWludDE2X3QJcG10dTsKIH0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKHNpemVvZih1aW50NjRfdCkpKSk7CiAKKy8qIGlzY3NpIGlmYWNlIGVuYWJsZWQvZGlzYWJsZWQgc2V0dGluZyAqLworI2RlZmluZSBJU0NTSV9JRkFDRV9ESVNBQkxFCTB4MDEKKyNkZWZpbmUgSVNDU0lfSUZBQ0VfRU5BQkxFCTB4MDIKKworLyogaXB2NCBib290cHJvdG8gKi8KKyNkZWZpbmUgSVNDU0lfQk9PVFBST1RPX1NUQVRJQwkJMHgwMQorI2RlZmluZSBJU0NTSV9CT09UUFJPVE9fREhDUAkJMHgwMgorCisvKiBpcHY2IGFkZHIgYXV0b2NvbmZpZyB0eXBlICovCisjZGVmaW5lIElTQ1NJX0lQVjZfQVVUT0NGR19ESVNBQkxFCQkweDAxCisjZGVmaW5lIElTQ1NJX0lQVjZfQVVUT0NGR19ORF9FTkFCTEUJCTB4MDIKKyNkZWZpbmUgSVNDU0lfSVBWNl9BVVRPQ0ZHX0RIQ1BWNl9FTkFCTEUJMHgwMworCisvKiBpcHY2IGxpbmsgbG9jYWwgYWRkciB0eXBlICovCisjZGVmaW5lIElTQ1NJX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkdfRU5BQkxFCTB4MDEKKyNkZWZpbmUgSVNDU0lfSVBWNl9MSU5LTE9DQUxfQVVUT0NGR19ESVNBQkxFCTB4MDIKKworLyogaXB2NiByb3V0ZXIgYWRkciB0eXBlICovCisjZGVmaW5lIElTQ1NJX0lQVjZfUk9VVEVSX0FVVE9DRkdfRU5BQkxFCTB4MDEKKyNkZWZpbmUgSVNDU0lfSVBWNl9ST1VURVJfQVVUT0NGR19ESVNBQkxFCTB4MDIKKworI2RlZmluZSBJU0NTSV9JRkFDRV9UWVBFX0lQVjQJCTB4MDEKKyNkZWZpbmUgSVNDU0lfSUZBQ0VfVFlQRV9JUFY2CQkweDAyCisKKyNkZWZpbmUgSVNDU0lfTUFYX1ZMQU5fSUQJCTQwOTUKKyNkZWZpbmUgSVNDU0lfTUFYX1ZMQU5fUFJJT1JJVFkJCTcKKworLyogaXNjc2kgdmxhbiBlbmFibGUvZGlzYWJsZWQgc2V0dGluZyAqLworI2RlZmluZSBJU0NTSV9WTEFOX0RJU0FCTEUJMHgwMQorI2RlZmluZSBJU0NTSV9WTEFOX0VOQUJMRQkweDAyCisKKy8qIGlTQ1NJIG5ldHdvcmsgcGFyYW1zICovCitlbnVtIGlzY3NpX25ldF9wYXJhbSB7CisJSVNDU0lfTkVUX1BBUkFNX0lQVjRfQUREUgkJPSAxLAorCUlTQ1NJX05FVF9QQVJBTV9JUFY0X1NVQk5FVAkJPSAyLAorCUlTQ1NJX05FVF9QQVJBTV9JUFY0X0dXCQkJPSAzLAorCUlTQ1NJX05FVF9QQVJBTV9JUFY0X0JPT1RQUk9UTwkJPSA0LAorCUlTQ1NJX05FVF9QQVJBTV9NQUMJCQk9IDUsCisJSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMCQk9IDYsCisJSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUgkJPSA3LAorCUlTQ1NJX05FVF9QQVJBTV9JUFY2X1JPVVRFUgkJPSA4LAorCUlTQ1NJX05FVF9QQVJBTV9JUFY2X0FERFJfQVVUT0NGRwk9IDksCisJSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkcJPSAxMCwKKwlJU0NTSV9ORVRfUEFSQU1fSVBWNl9ST1VURVJfQVVUT0NGRwk9IDExLAorCUlTQ1NJX05FVF9QQVJBTV9JRkFDRV9FTkFCTEUJCT0gMTIsCisJSVNDU0lfTkVUX1BBUkFNX1ZMQU5fSUQJCQk9IDEzLAorCUlTQ1NJX05FVF9QQVJBTV9WTEFOX1BSSU9SSVRZCQk9IDE0LAorCUlTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQJCT0gMTUsCisJSVNDU0lfTkVUX1BBUkFNX1ZMQU5fVEFHCQk9IDE2LAorCUlTQ1NJX05FVF9QQVJBTV9JRkFDRV9UWVBFCQk9IDE3LAorCUlTQ1NJX05FVF9QQVJBTV9JRkFDRV9OQU1FCQk9IDE4LAorCUlTQ1NJX05FVF9QQVJBTV9NVFUJCQk9IDE5LAorCUlTQ1NJX05FVF9QQVJBTV9QT1JUCQkJPSAyMCwKK307CisKK2VudW0gaXNjc2lfY29ubl9zdGF0ZSB7CisJSVNDU0lfQ09OTl9TVEFURV9GUkVFLAorCUlTQ1NJX0NPTk5fU1RBVEVfWFBUX1dBSVQsCisJSVNDU0lfQ09OTl9TVEFURV9JTl9MT0dJTiwKKwlJU0NTSV9DT05OX1NUQVRFX0xPR0dFRF9JTiwKKwlJU0NTSV9DT05OX1NUQVRFX0lOX0xPR09VVCwKKwlJU0NTSV9DT05OX1NUQVRFX0xPR09VVF9SRVFVRVNURUQsCisJSVNDU0lfQ09OTl9TVEFURV9DTEVBTlVQX1dBSVQsCit9OworCiAvKgogICogQ29tbW9uIGVycm9yIGNvZGVzCiAgKi8KQEAgLTMxOSw0NCArNDEwLDYgQEAKIAlJU0NTSV9QQVJBTV9NQVgsCiB9OwogCi0jZGVmaW5lIElTQ1NJX01BWF9SRUNWX0RMRU5HVEgJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX01BWF9SRUNWX0RMRU5HVEgpCi0jZGVmaW5lIElTQ1NJX01BWF9YTUlUX0RMRU5HVEgJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX01BWF9YTUlUX0RMRU5HVEgpCi0jZGVmaW5lIElTQ1NJX0hEUkRHU1RfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0hEUkRHU1RfRU4pCi0jZGVmaW5lIElTQ1NJX0RBVEFER1NUX0VOCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9EQVRBREdTVF9FTikKLSNkZWZpbmUgSVNDU0lfSU5JVElBTF9SMlRfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0lOSVRJQUxfUjJUX0VOKQotI2RlZmluZSBJU0NTSV9NQVhfUjJUCQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fTUFYX1IyVCkKLSNkZWZpbmUgSVNDU0lfSU1NX0RBVEFfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0lNTV9EQVRBX0VOKQotI2RlZmluZSBJU0NTSV9GSVJTVF9CVVJTVAkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fRklSU1RfQlVSU1QpCi0jZGVmaW5lIElTQ1NJX01BWF9CVVJTVAkJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX01BWF9CVVJTVCkKLSNkZWZpbmUgSVNDU0lfUERVX0lOT1JERVJfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1BEVV9JTk9SREVSX0VOKQotI2RlZmluZSBJU0NTSV9EQVRBU0VRX0lOT1JERVJfRU4JKDFVTEwgPDwgSVNDU0lfUEFSQU1fREFUQVNFUV9JTk9SREVSX0VOKQotI2RlZmluZSBJU0NTSV9FUkwJCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9FUkwpCi0jZGVmaW5lIElTQ1NJX0lGTUFSS0VSX0VOCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9JRk1BUktFUl9FTikKLSNkZWZpbmUgSVNDU0lfT0ZNQVJLRVJfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX09GTUFSS0VSX0VOKQotI2RlZmluZSBJU0NTSV9FWFBfU1RBVFNOCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9FWFBfU1RBVFNOKQotI2RlZmluZSBJU0NTSV9UQVJHRVRfTkFNRQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fVEFSR0VUX05BTUUpCi0jZGVmaW5lIElTQ1NJX1RQR1QJCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9UUEdUKQotI2RlZmluZSBJU0NTSV9QRVJTSVNURU5UX0FERFJFU1MJKDFVTEwgPDwgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9BRERSRVNTKQotI2RlZmluZSBJU0NTSV9QRVJTSVNURU5UX1BPUlQJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfUE9SVCkKLSNkZWZpbmUgSVNDU0lfU0VTU19SRUNPVkVSWV9UTU8JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1NFU1NfUkVDT1ZFUllfVE1PKQotI2RlZmluZSBJU0NTSV9DT05OX1BPUlQJCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9DT05OX1BPUlQpCi0jZGVmaW5lIElTQ1NJX0NPTk5fQUREUkVTUwkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTKQotI2RlZmluZSBJU0NTSV9VU0VSTkFNRQkJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1VTRVJOQU1FKQotI2RlZmluZSBJU0NTSV9VU0VSTkFNRV9JTgkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fVVNFUk5BTUVfSU4pCi0jZGVmaW5lIElTQ1NJX1BBU1NXT1JECQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fUEFTU1dPUkQpCi0jZGVmaW5lIElTQ1NJX1BBU1NXT1JEX0lOCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9QQVNTV09SRF9JTikKLSNkZWZpbmUgSVNDU0lfRkFTVF9BQk9SVAkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fRkFTVF9BQk9SVCkKLSNkZWZpbmUgSVNDU0lfQUJPUlRfVE1PCQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fQUJPUlRfVE1PKQotI2RlZmluZSBJU0NTSV9MVV9SRVNFVF9UTU8JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0xVX1JFU0VUX1RNTykKLSNkZWZpbmUgSVNDU0lfSE9TVF9SRVNFVF9UTU8JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0hPU1RfUkVTRVRfVE1PKQotI2RlZmluZSBJU0NTSV9QSU5HX1RNTwkJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1BJTkdfVE1PKQotI2RlZmluZSBJU0NTSV9SRUNWX1RNTwkJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1JFQ1ZfVE1PKQotI2RlZmluZSBJU0NTSV9JRkFDRV9OQU1FCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9JRkFDRV9OQU1FKQotI2RlZmluZSBJU0NTSV9JU0lECQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fSVNJRCkKLSNkZWZpbmUgSVNDU0lfSU5JVElBVE9SX05BTUUJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0lOSVRJQVRPUl9OQU1FKQotI2RlZmluZSBJU0NTSV9UR1RfUkVTRVRfVE1PCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9UR1RfUkVTRVRfVE1PKQotI2RlZmluZSBJU0NTSV9UQVJHRVRfQUxJQVMJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1RBUkdFVF9BTElBUykKLQogLyogaVNDU0kgSEJBIHBhcmFtcyAqLwogZW51bSBpc2NzaV9ob3N0X3BhcmFtIHsKIAlJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUywKQEAgLTM2NiwxMSArNDE5LDYgQEAKIAlJU0NTSV9IT1NUX1BBUkFNX01BWCwKIH07CiAKLSNkZWZpbmUgSVNDU0lfSE9TVF9IV0FERFJFU1MJCSgxVUxMIDw8IElTQ1NJX0hPU1RfUEFSQU1fSFdBRERSRVNTKQotI2RlZmluZSBJU0NTSV9IT1NUX0lOSVRJQVRPUl9OQU1FCSgxVUxMIDw8IElTQ1NJX0hPU1RfUEFSQU1fSU5JVElBVE9SX05BTUUpCi0jZGVmaW5lIElTQ1NJX0hPU1RfTkVUREVWX05BTUUJCSgxVUxMIDw8IElTQ1NJX0hPU1RfUEFSQU1fTkVUREVWX05BTUUpCi0jZGVmaW5lIElTQ1NJX0hPU1RfSVBBRERSRVNTCQkoMVVMTCA8PCBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUykKLQogI2RlZmluZSBpc2NzaV9wdHIoX2hhbmRsZSkgKCh2b2lkKikodW5zaWduZWQgbG9uZylfaGFuZGxlKQogI2RlZmluZSBpc2NzaV9oYW5kbGUoX3B0cikgKCh1aW50NjRfdCkodW5zaWduZWQgbG9uZylfcHRyKQogCkBAIC0zOTIsNiArNDQwLDcgQEAKICNkZWZpbmUgQ0FQX0RJR0VTVF9PRkZMT0FECTB4MTAwMAkvKiBvZmZsb2FkIGhkciBhbmQgZGF0YSBkaWdlc3RzICovCiAjZGVmaW5lIENBUF9QQURESU5HX09GRkxPQUQJMHgyMDAwCS8qIG9mZmxvYWQgcGFkZGluZyBpbnNlcnRpb24sIHJlbW92YWwsCiAJCQkJCSBhbmQgdmVyaWZpY2F0aW9uICovCisjZGVmaW5lIENBUF9MT0dJTl9PRkZMT0FECTB4NDAwMCAgLyogb2ZmbG9hZCBzZXNzaW9uIGxvZ2luICovCiAKIC8qCiAgKiBUaGVzZSBmbGFncyBkZXNjcmliZXMgcmVhc29uIG9mIHN0b3BfY29ubigpIGNhbGwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJmYy5oIGIvaW5jbHVkZS9zY3NpL2xpYmZjLmgKaW5kZXggN2Q5NjgyOS4uNWQxYTc1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmZjLmgKKysrIGIvaW5jbHVkZS9zY3NpL2xpYmZjLmgKQEAgLTI4MSw5ICsyODEsNiBAQAogICogQHRpbWVyOiAgICAgICAgICAgVGhlIGNvbW1hbmQgdGltZXIKICAqIEB0bV9kb25lOiAgICAgICAgIENvbXBsZXRpb24gaW5kaWNhdG9yCiAgKiBAd2FpdF9mb3JfY29tcDogICBJbmRpY2F0b3IgdG8gd2FpdCBmb3IgY29tcGxldGlvbiBvZiB0aGUgSS9PIChpbiBqaWZmaWVzKQotICogQHN0YXJ0X3RpbWU6ICAgICAgVGltZXN0YW1wIGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIHRoZSBJL08gKGluIGppZmZpZXMpCi0gKiBAZW5kX3RpbWU6ICAgICAgICBUaW1lc3RhbXAgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSBJL08gKGluIGppZmZpZXMpCi0gKiBAbGFzdF9wa3RfdGltZTogICBUaW1lc3RhbXAgb2YgdGhlIGxhc3QgZnJhbWUgcmVjZWl2ZWQgKGluIGppZmZpZXMpCiAgKiBAZGF0YV9sZW46ICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhCiAgKiBAY2RiX2NtZDogICAgICAgICBUaGUgQ0RCIGNvbW1hbmQKICAqIEB4ZmVyX2xlbjogICAgICAgIFRoZSB0cmFuc2ZlciBsZW5ndGgKQEAgLTMwNCw1MCArMzAxLDQ2IEBACiAgKiBAcmVjb3Zfc2VxOiAgICAgICBUaGUgc2VxdWVuY2UgZm9yIFJFQyBvciBTUlIKICAqLwogc3RydWN0IGZjX2ZjcF9wa3QgewotCS8qIEhvdXNla2VlcGluZyBpbmZvcm1hdGlvbiAqLwotCXN0cnVjdCBmY19scG9ydCAgICpscDsKLQl1MTYJCSAgc3RhdGU7Ci0JYXRvbWljX3QJICByZWZfY250OwogCXNwaW5sb2NrX3QJICBzY3NpX3BrdF9sb2NrOworCWF0b21pY190CSAgcmVmX2NudDsKKworCS8qIFNDU0kgY29tbWFuZCBhbmQgZGF0YSB0cmFuc2ZlciBpbmZvcm1hdGlvbiAqLworCXUzMgkJICBkYXRhX2xlbjsKIAogCS8qIFNDU0kgSS9PIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KIAlzdHJ1Y3Qgc2NzaV9jbW5kICAqY21kOwogCXN0cnVjdCBsaXN0X2hlYWQgIGxpc3Q7CiAKLQkvKiBUaW1lb3V0IHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLQlzdHJ1Y3QgY29tcGxldGlvbiB0bV9kb25lOwotCWludAkgICAgICAgICAgd2FpdF9mb3JfY29tcDsKLQl1bnNpZ25lZCBsb25nCSAgc3RhcnRfdGltZTsKLQl1bnNpZ25lZCBsb25nCSAgZW5kX3RpbWU7Ci0JdW5zaWduZWQgbG9uZwkgIGxhc3RfcGt0X3RpbWU7Ci0KLQkvKiBTQ1NJIGNvbW1hbmQgYW5kIGRhdGEgdHJhbnNmZXIgaW5mb3JtYXRpb24gKi8KLQl1MzIJCSAgZGF0YV9sZW47Ci0KLQkvKiBUcmFuc3BvcnQgcmVsYXRlZCB2ZXJpYWJsZXMgKi8KLQlzdHJ1Y3QgZmNwX2NtbmQgICBjZGJfY21kOwotCXNpemVfdAkJICB4ZmVyX2xlbjsKLQl1MTYJCSAgeGZlcl9kZHA7Ci0JdTMyCQkgIHhmZXJfY29udGlnX2VuZDsKLQl1MTYJCSAgbWF4X3BheWxvYWQ7CisJLyogSG91c2VrZWVwaW5nIGluZm9ybWF0aW9uICovCisJc3RydWN0IGZjX2xwb3J0ICAgKmxwOworCXU4CQkgIHN0YXRlOwogCiAJLyogU0NTSS9GQ1AgcmV0dXJuIHN0YXR1cyAqLwotCXUzMgkJICBpb19zdGF0dXM7CiAJdTgJCSAgY2RiX3N0YXR1czsKIAl1OAkJICBzdGF0dXNfY29kZTsKIAl1OAkJICBzY3NpX2NvbXBfZmxhZ3M7CisJdTMyCQkgIGlvX3N0YXR1czsKIAl1MzIJCSAgcmVxX2ZsYWdzOwogCXUzMgkJICBzY3NpX3Jlc2lkOwogCisJLyogVHJhbnNwb3J0IHJlbGF0ZWQgdmVyaWFibGVzICovCisJc2l6ZV90CQkgIHhmZXJfbGVuOworCXN0cnVjdCBmY3BfY21uZCAgIGNkYl9jbWQ7CisJdTMyCQkgIHhmZXJfY29udGlnX2VuZDsKKwl1MTYJCSAgbWF4X3BheWxvYWQ7CisJdTE2CQkgIHhmZXJfZGRwOworCiAJLyogQXNzb2NpYXRlZCBzdHJ1Y3R1cmVzICovCiAJc3RydWN0IGZjX3Jwb3J0CSAgKnJwb3J0OwogCXN0cnVjdCBmY19zZXEJICAqc2VxX3B0cjsKIAotCS8qIEVycm9yIFByb2Nlc3NpbmcgaW5mb3JtYXRpb24gKi8KLQl1OAkJICByZWNvdl9yZXRyeTsKKwkvKiBUaW1lb3V0L2Vycm9yIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlpbnQJICAgICAgICAgIHdhaXRfZm9yX2NvbXA7CisJdTMyCQkgIHJlY292X3JldHJ5OwogCXN0cnVjdCBmY19zZXEJICAqcmVjb3Zfc2VxOwotfTsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0bV9kb25lOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiAvKgogICogU3RydWN0dXJlIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgbWFuYWdpbmcgRmlicmUgQ2hhbm5lbCBFeGNoYW5nZXMKQEAgLTQxMywzNSArNDA2LDMyIEBACiAgKglzZXF1ZW5jZSBhbGxvY2F0aW9uCiAgKi8KIHN0cnVjdCBmY19leGNoIHsKLQlzdHJ1Y3QgZmNfZXhjaF9tZ3IgICplbTsKLQlzdHJ1Y3QgZmNfZXhjaF9wb29sICpwb29sOwotCXUzMgkJICAgIHN0YXRlOwotCXUxNgkJICAgIHhpZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgIGV4X2xpc3Q7CiAJc3BpbmxvY2tfdAkgICAgZXhfbG9jazsKIAlhdG9taWNfdAkgICAgZXhfcmVmY250OwotCXN0cnVjdCBkZWxheWVkX3dvcmsgdGltZW91dF93b3JrOworCWVudW0gZmNfY2xhc3MJICAgIGNsYXNzOworCXN0cnVjdCBmY19leGNoX21nciAgKmVtOworCXN0cnVjdCBmY19leGNoX3Bvb2wgKnBvb2w7CisJc3RydWN0IGxpc3RfaGVhZCAgICBleF9saXN0OwogCXN0cnVjdCBmY19scG9ydAkgICAgKmxwOworCXUzMgkJICAgIGVzYl9zdGF0OworCXU4CQkgICAgc3RhdGU7CisJdTgJCSAgICBmaF90eXBlOworCXU4CQkgICAgc2VxX2lkOworCXU4CQkgICAgZW5jYXBzOworCXUxNgkJICAgIHhpZDsKIAl1MTYJCSAgICBveGlkOwogCXUxNgkJICAgIHJ4aWQ7CiAJdTMyCQkgICAgb2lkOwogCXUzMgkJICAgIHNpZDsKIAl1MzIJCSAgICBkaWQ7Ci0JdTMyCQkgICAgZXNiX3N0YXQ7CiAJdTMyCQkgICAgcl9hX3RvdjsKLQl1OAkJICAgIHNlcV9pZDsKLQl1OAkJICAgIGVuY2FwczsKIAl1MzIJCSAgICBmX2N0bDsKLQl1OAkJICAgIGZoX3R5cGU7Ci0JZW51bSBmY19jbGFzcwkgICAgY2xhc3M7Ci0Jc3RydWN0IGZjX3NlcQkgICAgc2VxOwotCisJc3RydWN0IGZjX3NlcSAgICAgICBzZXE7CiAJdm9pZAkJICAgICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwgdm9pZCAqKTsKIAl2b2lkCQkgICAgKmFyZzsKLQogCXZvaWQJCSAgICAoKmRlc3RydWN0b3IpKHN0cnVjdCBmY19zZXEgKiwgdm9pZCAqKTsKLQotfTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRpbWVvdXRfd29yazsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKICNkZWZpbmUJZmNfc2VxX2V4Y2goc3ApIGNvbnRhaW5lcl9vZihzcCwgc3RydWN0IGZjX2V4Y2gsIHNlcSkKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGliZmNvZS5oIGIvaW5jbHVkZS9zY3NpL2xpYmZjb2UuaAppbmRleCA4YzE2MzhiLi5kMWU5NWM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliZmNvZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJmY29lLmgKQEAgLTIyOSw2ICsyMjksMTEgQEAKIAkJICAgICAgY29uc3Qgc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlICosIGludCBpbml0X2ZjcCk7CiB1MzIgZmNvZV9mY19jcmMoc3RydWN0IGZjX2ZyYW1lICpmcCk7CiBpbnQgZmNvZV9zdGFydF9pbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBmY29lX2dldF93d24oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTY0ICp3d24sIGludCB0eXBlKTsKK3ZvaWQgX19mY29lX2dldF9sZXNiKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19lbHNfbGVzYiAqZmNfbGVzYiwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3ZvaWQgZmNvZV93d25fdG9fc3RyKHU2NCB3d24sIGNoYXIgKmJ1ZiwgaW50IGxlbik7CitpbnQgZmNvZV92YWxpZGF0ZV92cG9ydF9jcmVhdGUoc3RydWN0IGZjX3Zwb3J0ICp2cG9ydCk7CiAKIC8qKgogICogaXNfZmlwX21vZGUoKSAtIHJldHVybnMgdHJ1ZSBpZiBGSVAgbW9kZSBzZWxlY3RlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJzYXMuaCBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaAppbmRleCBlZTg2NjA2Li42YTMwOGQ0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYnNhcy5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaApAQCAtMTQyLDggKzE0MiwxMSBAQAogCXUxNiAgICBleF9jaGFuZ2VfY291bnQ7CiAJdTE2ICAgIG1heF9yb3V0ZV9pbmRleGVzOwogCXU4ICAgICBudW1fcGh5czsKKworCXU4ICAgICB0MnRfc3VwcDoxOwogCXU4ICAgICBjb25maWd1cmluZzoxOwogCXU4ICAgICBjb25mX3JvdXRlX3RhYmxlOjE7CisKIAl1OCAgICAgZW5jbG9zdXJlX2xvZ2ljYWxfaWRbOF07CiAKIAlzdHJ1Y3QgZXhfcGh5ICpleF9waHk7CkBAIC0zODYsNiArMzg5LDExIEBACiAJcmV0dXJuIHN0YXJnZXRfdG9fZG9tYWluX2RldihzZGV2LT5zZGV2X3RhcmdldCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF0YV9kZXZpY2UgKnNhc190b19hdGFfZGV2KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICZkZXYtPnNhdGFfZGV2LmFwLT5saW5rLmRldmljZVswXTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZG9tYWluX2RldmljZSAqCiBjbWRfdG9fZG9tYWluX2RldihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CkBAIC00MDUsNiArNDEzLDIwIEBACiAJcGh5LT5saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfVU5LTk9XTjsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdG9fc2FzX2dwaW9fb2QoaW50IGRldmljZSwgaW50IGJpdCkKK3sKKwlyZXR1cm4gMyAqIGRldmljZSArIGJpdDsKK30KKworI2lmZGVmIENPTkZJR19TQ1NJX1NBU19IT1NUX1NNUAoraW50IHRyeV90ZXN0X3Nhc19ncGlvX2dwX2JpdCh1bnNpZ25lZCBpbnQgb2QsIHU4ICpkYXRhLCB1OCBpbmRleCwgdTggY291bnQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV90ZXN0X3Nhc19ncGlvX2dwX2JpdCh1bnNpZ25lZCBpbnQgb2QsIHU4ICpkYXRhLCB1OCBpbmRleCwgdTggY291bnQpCit7CisJcmV0dXJuIC0xOworfQorI2VuZGlmCisKIC8qIC0tLS0tLS0tLS0gVGFza3MgLS0tLS0tLS0tLSAqLwogLyoKICAgICAgIHNlcnZpY2VfcmVzcG9uc2UgfCAgU0FTX1RBU0tfQ09NUExFVEUgIHwgIFNBU19UQVNLX1VOREVMSVZFUkVEIHwKQEAgLTU1NSwzNiArNTc3LDE0IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IGFib3J0X3dvcms7CiB9OwogCi1leHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnNhc190YXNrX2NhY2hlOwotCiAjZGVmaW5lIFNBU19UQVNLX1NUQVRFX1BFTkRJTkcgICAgICAxCiAjZGVmaW5lIFNBU19UQVNLX1NUQVRFX0RPTkUgICAgICAgICAyCiAjZGVmaW5lIFNBU19UQVNLX1NUQVRFX0FCT1JURUQgICAgICA0CiAjZGVmaW5lIFNBU19UQVNLX05FRURfREVWX1JFU0VUICAgICA4CiAjZGVmaW5lIFNBU19UQVNLX0FUX0lOSVRJQVRPUiAgICAgICAxNgogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzYXNfdGFzayAqc2FzX2FsbG9jX3Rhc2soZ2ZwX3QgZmxhZ3MpCi17Ci0Jc3RydWN0IHNhc190YXNrICp0YXNrID0ga21lbV9jYWNoZV96YWxsb2Moc2FzX3Rhc2tfY2FjaGUsIGZsYWdzKTsKLQotCWlmICh0YXNrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZ0YXNrLT5saXN0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7Ci0JCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgPSBTQVNfVEFTS19TVEFURV9QRU5ESU5HOwotCQlpbml0X3RpbWVyKCZ0YXNrLT50aW1lcik7Ci0JCWluaXRfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7Ci0JfQotCi0JcmV0dXJuIHRhc2s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYXNfZnJlZV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzaykKLXsKLQlpZiAodGFzaykgewotCQlCVUdfT04oIWxpc3RfZW1wdHkoJnRhc2stPmxpc3QpKTsKLQkJa21lbV9jYWNoZV9mcmVlKHNhc190YXNrX2NhY2hlLCB0YXNrKTsKLQl9Ci19CitleHRlcm4gc3RydWN0IHNhc190YXNrICpzYXNfYWxsb2NfdGFzayhnZnBfdCBmbGFncyk7CitleHRlcm4gdm9pZCBzYXNfZnJlZV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzayk7CiAKIHN0cnVjdCBzYXNfZG9tYWluX2Z1bmN0aW9uX3RlbXBsYXRlIHsKIAkvKiBUaGUgY2xhc3MgY2FsbHMgdGhlc2UgdG8gbm90aWZ5IHRoZSBMTEREIG9mIGFuIGV2ZW50LiAqLwpAQCAtNjE0LDYgKzYxNCwxMCBAQAogCiAJLyogUGh5IG1hbmFnZW1lbnQgKi8KIAlpbnQgKCpsbGRkX2NvbnRyb2xfcGh5KShzdHJ1Y3QgYXNkX3Nhc19waHkgKiwgZW51bSBwaHlfZnVuYywgdm9pZCAqKTsKKworCS8qIEdQSU8gc3VwcG9ydCAqLworCWludCAoKmxsZGRfd3JpdGVfZ3Bpbykoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKiwgdTggcmVnX3R5cGUsCisJCQkgICAgICAgdTggcmVnX2luZGV4LCB1OCByZWdfY291bnQsIHU4ICp3cml0ZV9kYXRhKTsKIH07CiAKIGV4dGVybiBpbnQgc2FzX3JlZ2lzdGVyX2hhKHN0cnVjdCBzYXNfaGFfc3RydWN0ICopOwpAQCAtNjUyLDcgKzY1Niw3IEBACiBpbnQgIHNhc19kaXNjb3Zlcl9zYXRhKHN0cnVjdCBkb21haW5fZGV2aWNlICopOwogaW50ICBzYXNfZGlzY292ZXJfZW5kX2RldihzdHJ1Y3QgZG9tYWluX2RldmljZSAqKTsKIAotdm9pZCBzYXNfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGRvbWFpbl9kZXZpY2UgKik7Cit2b2lkIHNhc191bnJlZ2lzdGVyX2RldihzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0LCBzdHJ1Y3QgZG9tYWluX2RldmljZSAqKTsKIAogdm9pZCBzYXNfaW5pdF9kZXYoc3RydWN0IGRvbWFpbl9kZXZpY2UgKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zYXMuaCBiL2luY2x1ZGUvc2NzaS9zYXMuaAppbmRleCBlOWZkMDIyLi4zNjczZDY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2FzLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Nhcy5oCkBAIC0xMDgsNiArMTA4LDcgQEAKIAlTQVNfUFJPVE9DT0xfU1RQCQk9IDB4MDQsCiAJU0FTX1BST1RPQ09MX1NTUAkJPSAweDA4LAogCVNBU19QUk9UT0NPTF9BTEwJCT0gMHgwRSwKKwlTQVNfUFJPVE9DT0xfU1RQX0FMTAkJPSBTQVNfUFJPVE9DT0xfU1RQfFNBU19QUk9UT0NPTF9TQVRBLAogfTsKIAogLyogRnJvbSB0aGUgc3BlYzsgbG9jYWwgcGh5cyBvbmx5ICovCkBAIC0xMjEsNiArMTIyLDcgQEAKIAlQSFlfRlVOQ19UWF9TQVRBX1BTX1NJR05BTCwKIAlQSFlfRlVOQ19SRUxFQVNFX1NQSU5VUF9IT0xEID0gMHgxMCwgLyogTE9DQUwgUE9SVCBPTkxZISAqLwogCVBIWV9GVU5DX1NFVF9MSU5LX1JBVEUsCisJUEhZX0ZVTkNfR0VUX0VWRU5UUywKIH07CiAKIC8qIFNBUyBMTEREIHdvdWxkIG5lZWQgdG8gcmVwb3J0IG9ubHkgX3ZlcnlfZmV3XyBvZiB0aG9zZSwgbGlrZSBCUk9BRENBU1QuCkBAIC0xOTUsNiArMTk3LDE0IEBACiAJU0FTX09SRUpfUlNWRF9SRVRSWSA9IDE4LAogfTsKIAorZW51bSBzYXNfZ3Bpb19yZWdfdHlwZSB7CisJU0FTX0dQSU9fUkVHX0NGRyAgID0gMCwKKwlTQVNfR1BJT19SRUdfUlggICAgPSAxLAorCVNBU19HUElPX1JFR19SWF9HUCA9IDIsCisJU0FTX0dQSU9fUkVHX1RYICAgID0gMywKKwlTQVNfR1BJT19SRUdfVFhfR1AgPSA0LAorfTsKKwogc3RydWN0ICBkZXZfdG9faG9zdF9maXMgewogCXU4ICAgICBmaXNfdHlwZTsJICAvKiAweDM0ICovCiAJdTggICAgIGZsYWdzOwpAQCAtMzQxLDcgKzM1MSwxMiBAQAogCiAJdTggICAgICBjb25mX3JvdXRlX3RhYmxlOjE7CiAJdTggICAgICBjb25maWd1cmluZzoxOwotCXU4ICAgICAgX3JfYjo2OworCXU4CWNvbmZpZ19vdGhlcnM6MTsKKwl1OAlvcmVqX3JldHJ5X3N1cHA6MTsKKwl1OAlzdHBfY29udF9hd3Q6MTsKKwl1OAlzZWxmX2NvbmZpZzoxOworCXU4CXpvbmVfY29uZmlnOjE7CisJdTgJdDJ0X3N1cHA6MTsKIAogCXU4ICAgICAgX3JfYzsKIApAQCAtNTI4LDcgKzU0MywxMiBAQAogCXU4ICAgICAgX3JfYTsKIAl1OCAgICAgIG51bV9waHlzOwogCi0JdTggICAgICBfcl9iOjY7CisJdTgJdDJ0X3N1cHA6MTsKKwl1OAl6b25lX2NvbmZpZzoxOworCXU4CXNlbGZfY29uZmlnOjE7CisJdTgJc3RwX2NvbnRfYXd0OjE7CisJdTgJb3Jlal9yZXRyeV9zdXBwOjE7CisJdTgJY29uZmlnX290aGVyczoxOwogCXU4ICAgICAgY29uZmlndXJpbmc6MTsKIAl1OCAgICAgIGNvbmZfcm91dGVfdGFibGU6MTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfYnNnX2lzY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9ic2dfaXNjc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU2ODlkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfYnNnX2lzY3NpLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiAgaVNDU0kgVHJhbnNwb3J0IEJTRyBJbnRlcmZhY2UKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5ICAgSmFtZXMgU21hcnQsIEVtdWxleCBDb3Jwb3JhdGlvbgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIFNDU0lfQlNHX0lTQ1NJX0gKKyNkZWZpbmUgU0NTSV9CU0dfSVNDU0lfSAorCisvKgorICogVGhpcyBmaWxlIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGJ5IGJvdGgga2VybmVsIGFuZCB1c2VyIHNwYWNlCisgKi8KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorCisvKgorICogaVNDU0kgVHJhbnNwb3J0IFNHSU8gdjQgQlNHIE1lc3NhZ2UgU3VwcG9ydAorICovCisKKy8qIERlZmF1bHQgQlNHIHJlcXVlc3QgdGltZW91dCAoaW4gc2Vjb25kcykgKi8KKyNkZWZpbmUgSVNDU0lfREVGQVVMVF9CU0dfVElNRU9VVCAgICAgICgxMCAqIEhaKQorCisKKy8qCisgKiBSZXF1ZXN0IE1lc3NhZ2UgQ29kZXMgc3VwcG9ydGVkIGJ5IHRoZSBpU0NTSSBUcmFuc3BvcnQKKyAqLworCisvKiBkZWZpbmUgdGhlIGNsYXNzIG1hc2tzIGZvciB0aGUgbWVzc2FnZSBjb2RlcyAqLworI2RlZmluZSBJU0NTSV9CU0dfQ0xTX01BU0sgICAgIDB4RjAwMDAwMDAgICAgICAvKiBmaW5kIG9iamVjdCBjbGFzcyAqLworI2RlZmluZSBJU0NTSV9CU0dfSFNUX01BU0sgICAgIDB4ODAwMDAwMDAgICAgICAvKiBpc2NzaSBob3N0IGNsYXNzICovCisKKy8qIGlzY3NpIGhvc3QgTWVzc2FnZSBDb2RlcyAqLworI2RlZmluZSBJU0NTSV9CU0dfSFNUX1ZFTkRPUiAgICAgICAgICAgKElTQ1NJX0JTR19IU1RfTUFTSyB8IDB4MDAwMDAwRkYpCisKKworLyoKKyAqIGlTQ1NJIEhvc3QgTWVzc2FnZXMKKyAqLworCisvKiBJU0NTSV9CU0dfSFNUX1ZFTkRPUiA6ICovCisKKy8qIFJlcXVlc3Q6CisgKiBOb3RlOiBXaGVuIHNwZWNpZnlpbmcgdmVuZG9yX2lkLCBiZSBzdXJlIHRvIHJlYWQgdGhlIFZlbmRvciBUeXBlIGFuZCBJRAorICogICBmb3JtYXR0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgaW4gc2NzaV9uZXRsaW5rLmgKKyAqLworc3RydWN0IGlzY3NpX2JzZ19ob3N0X3ZlbmRvciB7CisJLyoKKwkgKiBJZGVudGlmaWVzIHRoZSB2ZW5kb3IgdGhhdCB0aGUgbWVzc2FnZSBpcyBmb3JtYXR0ZWQgZm9yLiBUaGlzCisJICogc2hvdWxkIGJlIHRoZSByZWNpcGllbnQgb2YgdGhlIG1lc3NhZ2UuCisJICovCisJdWludDY0X3QgdmVuZG9yX2lkOworCisJLyogc3RhcnQgb2YgdmVuZG9yIGNvbW1hbmQgYXJlYSAqLworCXVpbnQzMl90IHZlbmRvcl9jbWRbMF07Cit9OworCisvKiBSZXNwb25zZToKKyAqLworc3RydWN0IGlzY3NpX2JzZ19ob3N0X3ZlbmRvcl9yZXBseSB7CisJLyogc3RhcnQgb2YgdmVuZG9yIHJlc3BvbnNlIGFyZWEgKi8KKwl1aW50MzJfdCB2ZW5kb3JfcnNwWzBdOworfTsKKworCisvKiByZXF1ZXN0IChDREIpIHN0cnVjdHVyZSBvZiB0aGUgc2dfaW9fdjQgKi8KK3N0cnVjdCBpc2NzaV9ic2dfcmVxdWVzdCB7CisJdWludDMyX3QgbXNnY29kZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBpc2NzaV9ic2dfaG9zdF92ZW5kb3IgICAgaF92ZW5kb3I7CisJfSBycXN0X2RhdGE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIHJlc3BvbnNlIChyZXF1ZXN0IHNlbnNlIGRhdGEpIHN0cnVjdHVyZSBvZiB0aGUgc2dfaW9fdjQgKi8KK3N0cnVjdCBpc2NzaV9ic2dfcmVwbHkgeworCS8qCisJICogVGhlIGNvbXBsZXRpb24gcmVzdWx0LiBSZXN1bHQgZXhpc3RzIGluIHR3byBmb3JtczoKKwkgKiBpZiBuZWdhdGl2ZSwgaXQgaXMgYW4gLUV4eHggc3lzdGVtIGVycm5vIHZhbHVlLiBUaGVyZSB3aWxsCisJICogYmUgbm8gZnVydGhlciByZXBseSBpbmZvcm1hdGlvbiBzdXBwbGllZC4KKwkgKiBlbHNlLCBpdCdzIHRoZSA0LWJ5dGUgc2NzaSBlcnJvciByZXN1bHQsIHdpdGggZHJpdmVyLCBob3N0LAorCSAqIG1zZyBhbmQgc3RhdHVzIGZpZWxkcy4gVGhlIHBlci1tc2djb2RlIHJlcGx5IHN0cnVjdHVyZQorCSAqIHdpbGwgY29udGFpbiB2YWxpZCBkYXRhLgorCSAqLworCXVpbnQzMl90IHJlc3VsdDsKKworCS8qIElmIHRoZXJlIHdhcyByZXBseV9wYXlsb2FkLCBob3cgbXVjaCB3YXMgcmVjZXZpZWQgPyAqLworCXVpbnQzMl90IHJlcGx5X3BheWxvYWRfcmN2X2xlbjsKKworCXVuaW9uIHsKKwkJc3RydWN0IGlzY3NpX2JzZ19ob3N0X3ZlbmRvcl9yZXBseSAgICAgIHZlbmRvcl9yZXBseTsKKwl9IHJlcGx5X2RhdGE7Cit9OworCisKKyNlbmRpZiAvKiBTQ1NJX0JTR19JU0NTSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCmluZGV4IGQzNzFjM2MuLjU1OTFlZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCkBAIC0xOTcsNiArMTk3LDcgQEAKIAlpbnQgKCphY3RpdmF0ZSkoc3RydWN0IHNjc2lfZGV2aWNlICosIGFjdGl2YXRlX2NvbXBsZXRlLCB2b2lkICopOwogCWludCAoKnByZXBfZm4pKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIAlpbnQgKCpzZXRfcGFyYW1zKShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgY29uc3QgY2hhciAqKTsKKwlib29sICgqbWF0Y2gpKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKIH07CiAKIHN0cnVjdCBzY3NpX2RoX2RhdGEgewpAQCAtNDcxLDYgKzQ3MiwxMSBAQAogCXJldHVybiBzZGV2LT5zY3NpX2xldmVsID4gU0NTSV8yICYmIHNkZXYtPmlucXVpcnlbNV0gJiAoMTw8MCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfZGV2aWNlX3RwZ3Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBzZGV2LT5pbnF1aXJ5ID8gKHNkZXYtPmlucXVpcnlbNV0gPj4gNCkgJiAweDMgOiAwOworfQorCiAjZGVmaW5lIE1PRFVMRV9BTElBU19TQ1NJX0RFVklDRSh0eXBlKSBcCiAJTU9EVUxFX0FMSUFTKCJzY3NpOnQtIiBfX3N0cmluZ2lmeSh0eXBlKSAiKiIpCiAjZGVmaW5lIFNDU0lfREVWSUNFX01PREFMSUFTX0ZNVCAic2NzaTp0LTB4JTAyeCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAppbmRleCBmMWYyNjQ0Li41MDI2NmM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCkBAIC0zNTUsNiArMzU1LDE5IEBACiAJICovCiAJZW51bSBibGtfZWhfdGltZXJfcmV0dXJuICgqZWhfdGltZWRfb3V0KShzdHJ1Y3Qgc2NzaV9jbW5kICopOwogCisJLyogVGhpcyBpcyBhbiBvcHRpb25hbCByb3V0aW5lIHRoYXQgYWxsb3dzIHRyYW5zcG9ydCB0byBpbml0aWF0ZQorCSAqIExMRCBhZGFwdGVyIG9yIGZpcm13YXJlIHJlc2V0IHVzaW5nIHN5c2ZzIGF0dHJpYnV0ZS4KKwkgKgorCSAqIFJldHVybiB2YWx1ZXM6IDAgb24gc3VjY2VzcywgLXZlIHZhbHVlIG9uIGZhaWx1cmUuCisJICoKKwkgKiBTdGF0dXM6IE9QVElPTkFMCisJICovCisKKwlpbnQgKCpob3N0X3Jlc2V0KShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgaW50IHJlc2V0X3R5cGUpOworI2RlZmluZSBTQ1NJX0FEQVBURVJfUkVTRVQJMQorI2RlZmluZSBTQ1NJX0ZJUk1XQVJFX1JFU0VUCTIKKworCiAJLyoKIAkgKiBOYW1lIG9mIHByb2MgZGlyZWN0b3J5CiAJICovCkBAIC03OTEsNyArODA0LDggQEAKICAqKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0JcmV0dXJuIHNob3N0LT5zaG9zdF9zdGF0ZSA9PSBTSE9TVF9SVU5OSU5HOworCXJldHVybiBzaG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfUlVOTklORyB8fAorCSAgICAgICBzaG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfUkVDT1ZFUlk7CiB9CiAKIGV4dGVybiB2b2lkIHNjc2lfdW5ibG9ja19yZXF1ZXN0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaAppbmRleCBiZjhmNTI5Li41OTk0YmNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaApAQCAtMzcsNiArMzcsOCBAQAogc3RydWN0IGlzY3NpX2Nvbm47CiBzdHJ1Y3QgaXNjc2lfdGFzazsKIHN0cnVjdCBzb2NrYWRkcjsKK3N0cnVjdCBpc2NzaV9pZmFjZTsKK3N0cnVjdCBic2dfam9iOwogCiAvKioKICAqIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgLSBpU0NTSSBUcmFuc3BvcnQgdGVtcGxhdGUKQEAgLTg0LDkgKzg2LDcgQEAKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAljaGFyICpuYW1lOwogCXVuc2lnbmVkIGludCBjYXBzOwotCS8qIExMRCBzZXRzIHRoaXMgdG8gaW5kaWNhdGUgd2hhdCB2YWx1ZXMgaXQgY2FuIGV4cG9ydCB0byBzeXNmcyAqLwotCXVpbnQ2NF90IHBhcmFtX21hc2s7Ci0JdWludDY0X3QgaG9zdF9wYXJhbV9tYXNrOworCiAJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICooKmNyZWF0ZV9zZXNzaW9uKSAoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwKIAkJCQkJdWludDE2X3QgY21kc19tYXgsIHVpbnQxNl90IHFkZXB0aCwKIAkJCQkJdWludDMyX3Qgc24pOwpAQCAtMTM3LDYgKzEzNywxMyBAQAogCWludCAoKnRndF9kc2N2cikgKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBlbnVtIGlzY3NpX3RndF9kc2N2ciB0eXBlLAogCQkJICB1aW50MzJfdCBlbmFibGUsIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIpOwogCWludCAoKnNldF9wYXRoKSAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBpc2NzaV9wYXRoICpwYXJhbXMpOworCWludCAoKnNldF9pZmFjZV9wYXJhbSkgKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB2b2lkICpkYXRhLAorCQkJCXVpbnQzMl90IGxlbik7CisJaW50ICgqZ2V0X2lmYWNlX3BhcmFtKSAoc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZSwKKwkJCQllbnVtIGlzY3NpX3BhcmFtX3R5cGUgcGFyYW1fdHlwZSwKKwkJCQlpbnQgcGFyYW0sIGNoYXIgKmJ1Zik7CisJbW9kZV90ICgqYXR0cl9pc192aXNpYmxlKShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKTsKKwlpbnQgKCpic2dfcmVxdWVzdCkoc3RydWN0IGJzZ19qb2IgKmpvYik7CiB9OwogCiAvKgpAQCAtMTUwLDYgKzE1Nyw4IEBACiAgKi8KIGV4dGVybiB2b2lkIGlzY3NpX2Nvbm5fZXJyb3JfZXZlbnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLAogCQkJCSAgIGVudW0gaXNjc2lfZXJyIGVycm9yKTsKK2V4dGVybiB2b2lkIGlzY3NpX2Nvbm5fbG9naW5fZXZlbnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLAorCQkJCSAgIGVudW0gaXNjc2lfY29ubl9zdGF0ZSBzdGF0ZSk7CiBleHRlcm4gaW50IGlzY3NpX3JlY3ZfcGR1KHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2hkciAqaGRyLAogCQkJICBjaGFyICpkYXRhLCB1aW50MzJfdCBkYXRhX3NpemUpOwogCkBAIC0xNzEsNiArMTgwLDkgQEAKICNkZWZpbmUgaXNjc2lfZGV2X3RvX2Nvbm4oX2RldikgXAogCWNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4sIGRldikKIAorI2RlZmluZSB0cmFuc3BvcnRfY2xhc3NfdG9fY29ubihfY2RldikgXAorCWlzY3NpX2Rldl90b19jb25uKF9jZGV2LT5wYXJlbnQpCisKICNkZWZpbmUgaXNjc2lfY29ubl90b19zZXNzaW9uKF9jb25uKSBcCiAJaXNjc2lfZGV2X3RvX3Nlc3Npb24oX2Nvbm4tPmRldi5wYXJlbnQpCiAKQEAgLTE5Nyw2ICsyMDksNyBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgcmVjb3Zlcnlfd29yazsKIAogCXVuc2lnbmVkIGludCB0YXJnZXRfaWQ7CisJYm9vbCBpZGFfdXNlZDsKIAogCWludCBzdGF0ZTsKIAlpbnQgc2lkOwkJCQkvKiBzZXNzaW9uIGlkICovCkBAIC0yMDcsNiArMjIwLDkgQEAKICNkZWZpbmUgaXNjc2lfZGV2X3RvX3Nlc3Npb24oX2RldikgXAogCWNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24sIGRldikKIAorI2RlZmluZSB0cmFuc3BvcnRfY2xhc3NfdG9fc2Vzc2lvbihfY2RldikgXAorCWlzY3NpX2Rldl90b19zZXNzaW9uKF9jZGV2LT5wYXJlbnQpCisKICNkZWZpbmUgaXNjc2lfc2Vzc2lvbl90b19zaG9zdChfc2Vzc2lvbikgXAogCWRldl90b19zaG9zdChfc2Vzc2lvbi0+ZGV2LnBhcmVudCkKIApAQCAtMjE2LDggKzIzMiwxMiBAQAogc3RydWN0IGlzY3NpX2Nsc19ob3N0IHsKIAlhdG9taWNfdCBucl9zY2FuczsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKmJzZ19xOwogfTsKIAorI2RlZmluZSBpc2NzaV9qb2JfdG9fc2hvc3QoX2pvYikgXAorICAgICAgICBkZXZfdG9fc2hvc3QoX2pvYi0+ZGV2KQorCiBleHRlcm4gdm9pZCBpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCiAJCQkJdm9pZCAoKmZuKShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKikpOwogCkBAIC0yMjgsNiArMjQ4LDIwIEBACiAJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uOwogfTsKIAorc3RydWN0IGlzY3NpX2lmYWNlIHsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisJdWludDMyX3QgaWZhY2VfdHlwZTsJLyogSVB2NCBvciBJUHY2ICovCisJdWludDMyX3QgaWZhY2VfbnVtOwkvKiBpZmFjZSBudW1iZXIsIDAgLSBuICovCisJdm9pZCAqZGRfZGF0YTsJCS8qIExMRCBwcml2YXRlIGRhdGEgKi8KK307CisKKyNkZWZpbmUgaXNjc2lfZGV2X3RvX2lmYWNlKF9kZXYpIFwKKwljb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGlzY3NpX2lmYWNlLCBkZXYpCisKKyNkZWZpbmUgaXNjc2lfaWZhY2VfdG9fc2hvc3QoX2lmYWNlKSBcCisJZGV2X3RvX3Nob3N0KF9pZmFjZS0+ZGV2LnBhcmVudCkKKwogLyoKICAqIHNlc3Npb24gYW5kIGNvbm5lY3Rpb24gZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgYnkgSFcgaVNDU0kgTExEcwogICovCkBAIC0yMzgsNiArMjcyLDcgQEAKIAlkZXZfcHJpbnRrKHByZWZpeCwgJihfY2xzX2Nvbm4pLT5kZXYsIGZtdCwgIyNhKQogCiBleHRlcm4gaW50IGlzY3NpX3Nlc3Npb25fY2hrcmVhZHkoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKTsKK2V4dGVybiBpbnQgaXNjc2lfaXNfc2Vzc2lvbl9vbmxpbmUoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKTsKIGV4dGVybiBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmlzY3NpX2FsbG9jX3Nlc3Npb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCiAJCQkJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCBpbnQgZGRfc2l6ZSk7CiBleHRlcm4gaW50IGlzY3NpX2FkZF9zZXNzaW9uKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiwKQEAgLTI2MSw1ICsyOTYsMTEgQEAKIGV4dGVybiB2b2lkIGlzY3NpX2Rlc3Ryb3lfZW5kcG9pbnQoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCk7CiBleHRlcm4gc3RydWN0IGlzY3NpX2VuZHBvaW50ICppc2NzaV9sb29rdXBfZW5kcG9pbnQodTY0IGhhbmRsZSk7CiBleHRlcm4gaW50IGlzY3NpX2Jsb2NrX3Njc2lfZWgoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiBzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlzY3NpX2NyZWF0ZV9pZmFjZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkJICAgICAgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdCwKKwkJCQkJICAgICAgdWludDMyX3QgaWZhY2VfdHlwZSwKKwkJCQkJICAgICAgdWludDMyX3QgaWZhY2VfbnVtLCBpbnQgZGRfc2l6ZSk7CitleHRlcm4gdm9pZCBpc2NzaV9kZXN0cm95X2lmYWNlKHN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UpOworZXh0ZXJuIHN0cnVjdCBpc2NzaV9pZmFjZSAqaXNjc2lfbG9va3VwX2lmYWNlKGludCBoYW5kbGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYWRhdTEzNzMuaCBiL2luY2x1ZGUvc291bmQvYWRhdTEzNzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE5Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9hZGF1MTM3My5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBBbmFsb2cgRGV2aWNlcyBBREFVMTM3MyBBdWRpbyBDb2RlYyBkcml2ZQorICoKKyAqIENvcHlyaWdodCAyMDExIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIEF1dGhvcjogTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19TT1VORF9BREFVMTM3M19IX18KKyNkZWZpbmUgX19TT1VORF9BREFVMTM3M19IX18KKworZW51bSBhZGF1MTM3M19taWNiaWFzX3ZvbHRhZ2UgeworCUFEQVUxMzczX01JQ0JJQVNfMl85ViA9IDAsCisJQURBVTEzNzNfTUlDQklBU18yXzJWID0gMSwKKwlBREFVMTM3M19NSUNCSUFTXzJfNlYgPSAyLAorCUFEQVUxMzczX01JQ0JJQVNfMV84ViA9IDMsCit9OworCisjZGVmaW5lIEFEQVUxMzczX0RSQ19TSVpFIDEzCisKK3N0cnVjdCBhZGF1MTM3M19wbGF0Zm9ybV9kYXRhIHsKKwlib29sIGlucHV0X2RpZmZlcmVudGlhbFs0XTsKKwlib29sIGxpbmVvdXRfZGlmZmVyZW50aWFsOworCWJvb2wgbGluZW91dF9ncm91bmRfc2Vuc2U7CisKKwl1bnNpZ25lZCBpbnQgbnVtX2RyYzsKKwl1aW50OF90IGRyY19zZXR0aW5nWzNdW0FEQVUxMzczX0RSQ19TSVpFXTsKKworCWVudW0gYWRhdTEzNzNfbWljYmlhc192b2x0YWdlIG1pY2JpYXMxOworCWVudW0gYWRhdTEzNzNfbWljYmlhc192b2x0YWdlIG1pY2JpYXMyOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oIGIvaW5jbHVkZS9zb3VuZC9hc291bmQuaAppbmRleCA1ZDYwNzRmLi5hMmU0ZmY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oCisrKyBiL2luY2x1ZGUvc291bmQvYXNvdW5kLmgKQEAgLTcwNiw3ICs3MDYsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIFNORFJWX0NUTF9WRVJTSU9OCQlTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKDIsIDAsIDYpCisjZGVmaW5lIFNORFJWX0NUTF9WRVJTSU9OCQlTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKDIsIDAsIDcpCiAKIHN0cnVjdCBzbmRfY3RsX2NhcmRfaW5mbyB7CiAJaW50IGNhcmQ7CQkJLyogY2FyZCBudW1iZXIgKi8KQEAgLTgwMyw2ICs4MDMsOCBAQAogCQkJdW5zaWduZWQgaW50IGl0ZW1zOwkvKiBSOiBudW1iZXIgb2YgaXRlbXMgKi8KIAkJCXVuc2lnbmVkIGludCBpdGVtOwkvKiBXOiBpdGVtIG51bWJlciAqLwogCQkJY2hhciBuYW1lWzY0XTsJCS8qIFI6IHZhbHVlIG5hbWUgKi8KKwkJCV9fdTY0IG5hbWVzX3B0cjsJLyogVzogbmFtZXMgbGlzdCAoRUxFTV9BREQgb25seSkgKi8KKwkJCXVuc2lnbmVkIGludCBuYW1lc19sZW5ndGg7CiAJCX0gZW51bWVyYXRlZDsKIAkJdW5zaWduZWQgY2hhciByZXNlcnZlZFsxMjhdOwogCX0gdmFsdWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2NvcmUuaCBiL2luY2x1ZGUvc291bmQvY29yZS5oCmluZGV4IDFmYTI0MDcuLjNiZTVhYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvY29yZS5oCisrKyBiL2luY2x1ZGUvc291bmQvY29yZS5oCkBAIC0yMiw3ICsyMiw2IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkJLyogd2FrZV91cCgpICovCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4JCS8qIHN0cnVjdCBtdXRleCAqLwogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CQkvKiBzdHJ1Y3Qgcndfc2VtYXBob3JlICovCkBAIC00Myw2ICs0Miw3IEBACiAjaWZkZWYgQ09ORklHX1BDSQogc3RydWN0IHBjaV9kZXY7CiAjZW5kaWYKK3N0cnVjdCBtb2R1bGU7CiAKIC8qIGRldmljZSBhbGxvY2F0aW9uIHN0dWZmICovCiAKQEAgLTMyNiw5ICszMjYsOSBAQAogLyogLS0tICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USykKK19fcHJpbnRmKDQsIDUpCiB2b2lkIF9fc25kX3ByaW50ayh1bnNpZ25lZCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAotCQkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDQsIDUpKSk7CisJCSAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwogI2Vsc2UKICNkZWZpbmUgX19zbmRfcHJpbnRrKGxldmVsLCBmaWxlLCBsaW5lLCBmb3JtYXQsIGFyZ3MuLi4pIFwKIAlwcmludGsoZm9ybWF0LCAjI2FyZ3MpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2luZm8uaCBiL2luY2x1ZGUvc291bmQvaW5mby5oCmluZGV4IDRlOTRjZjEuLjU0OTJjYzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvaW5mby5oCisrKyBiL2luY2x1ZGUvc291bmQvaW5mby5oCkBAIC0xMTAsOCArMTEwLDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfY2FyZF9pbmZvX3JlYWRfb3NzKHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikge30KICNlbmRpZgogCi1pbnQgc25kX2lwcmludGYoc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLCBjb25zdCBjaGFyICpmbXQsIC4uLikgXAotCQkJCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK19fcHJpbnRmKDIsIDMpCitpbnQgc25kX2lwcmludGYoc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiBpbnQgc25kX2luZm9faW5pdCh2b2lkKTsKIGludCBzbmRfaW5mb19kb25lKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2luaXR2YWwuaCBiL2luY2x1ZGUvc291bmQvaW5pdHZhbC5oCmluZGV4IDFkYWE2ZGZmLi5mOTlhMGQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2luaXR2YWwuaAorKysgYi9pbmNsdWRlL3NvdW5kL2luaXR2YWwuaApAQCAtNjIsNyArNjIsNyBAQAogewogCXdoaWxlICgqaXJxX3RhYmxlICE9IC0xKSB7CiAJCWlmICghcmVxdWVzdF9pcnEoKmlycV90YWJsZSwgc25kX2xlZ2FjeV9lbXB0eV9pcnFfaGFuZGxlciwKLQkJCQkgSVJRRl9ESVNBQkxFRCB8IElSUUZfUFJPQkVfU0hBUkVELCAiQUxTQSBUZXN0IElSUSIsCisJCQkJIElSUUZfUFJPQkVfU0hBUkVELCAiQUxTQSBUZXN0IElSUSIsCiAJCQkJICh2b2lkICopIGlycV90YWJsZSkpIHsKIAkJCWZyZWVfaXJxKCppcnFfdGFibGUsICh2b2lkICopIGlycV90YWJsZSk7CiAJCQlyZXR1cm4gKmlycV90YWJsZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvamFjay5oIGIvaW5jbHVkZS9zb3VuZC9qYWNrLmgKaW5kZXggYzE0MGZjNy4uNjNjNzkwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9qYWNrLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9qYWNrLmgKQEAgLTQyLDYgKzQyLDcgQEAKIAlTTkRfSkFDS19NRUNIQU5JQ0FMCT0gMHgwMDA4LCAvKiBJZiBkZXRlY3RlZCBzZXBhcmF0ZWx5ICovCiAJU05EX0pBQ0tfVklERU9PVVQJPSAweDAwMTAsCiAJU05EX0pBQ0tfQVZPVVQJCT0gU05EX0pBQ0tfTElORU9VVCB8IFNORF9KQUNLX1ZJREVPT1VULAorCVNORF9KQUNLX0xJTkVJTgkJPSAweDAwMjAsCiAKIAkvKiBLZXB0IHNlcGFyYXRlIGZyb20gc3dpdGNoZXMgdG8gZmFjaWxpdGF0ZSBpbXBsZW1lbnRhdGlvbiAqLwogCVNORF9KQUNLX0JUTl8wCQk9IDB4NDAwMCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvbXB1NDAxLmggYi9pbmNsdWRlL3NvdW5kL21wdTQwMS5oCmluZGV4IDFmMWQ1M2YuLjIwMjMwZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvbXB1NDAxLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9tcHU0MDEuaApAQCAtNTAsNyArNTAsMTAgQEAKICNkZWZpbmUgTVBVNDAxX0lORk9fSU5URUdSQVRFRAkoMSA8PCAyKQkvKiBpbnRlZ3JhdGVkIGgvdyBwb3J0ICovCiAjZGVmaW5lIE1QVTQwMV9JTkZPX01NSU8JKDEgPDwgMykJLyogTU1JTyBhY2Nlc3MgKi8KICNkZWZpbmUgTVBVNDAxX0lORk9fVFhfSVJRCSgxIDw8IDQpCS8qIGluZGVwZW5kZW50IFRYIGlycSAqLworI2RlZmluZSBNUFU0MDFfSU5GT19JUlFfSE9PSwkoMSA8PCA1KQkvKiBtcHU0MDEgaXJxIGhhbmRsZXIgaXMgY2FsbGVkCisJCQkJCQkgICBmcm9tIGRyaXZlciBpcnEgaGFuZGxlciAqLwogI2RlZmluZSBNUFU0MDFfSU5GT19OT19BQ0sJKDEgPDwgNikJLyogTm8gQUNLIGNtZCBuZWVkZWQgKi8KKyNkZWZpbmUgTVBVNDAxX0lORk9fVVNFX1RJTUVSCSgxIDw8IDE1KQkvKiBpbnRlcm5hbCAqLwogCiAjZGVmaW5lIE1QVTQwMV9NT0RFX0JJVF9JTlBVVAkJMAogI2RlZmluZSBNUFU0MDFfTU9ERV9CSVRfT1VUUFVUCQkxCkBAIC03Myw4ICs3Niw3IEBACiAJdW5zaWduZWQgbG9uZyBwb3J0OwkJLyogYmFzZSBwb3J0IG9mIE1QVS00MDEgY2hpcCAqLwogCXVuc2lnbmVkIGxvbmcgY3BvcnQ7CQkvKiBwb3J0ICsgMSAodXN1YWxseSkgKi8KIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsJCS8qIHBvcnQgcmVzb3VyY2UgKi8KLQlpbnQgaXJxOwkJCS8qIElSUSBudW1iZXIgb2YgTVBVLTQwMSBjaGlwICgtMSA9IHBvbGwpICovCi0JaW50IGlycV9mbGFnczsKKwlpbnQgaXJxOwkJCS8qIElSUSBudW1iZXIgb2YgTVBVLTQwMSBjaGlwICovCiAKIAl1bnNpZ25lZCBsb25nIG1vZGU7CQkvKiBNUFU0MDFfTU9ERV9YWFhYICovCiAJaW50IHRpbWVyX2ludm9rZWQ7CkBAIC0xMzEsNyArMTMzLDYgQEAKIAkJCXVuc2lnbmVkIGxvbmcgcG9ydCwKIAkJCXVuc2lnbmVkIGludCBpbmZvX2ZsYWdzLAogCQkJaW50IGlycSwKLQkJCWludCBpcnFfZmxhZ3MsCiAJCQlzdHJ1Y3Qgc25kX3Jhd21pZGkgKiogcnJhd21pZGkpOwogCiAjZW5kaWYgLyogX19TT1VORF9NUFU0MDFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9wY20uaCBiL2luY2x1ZGUvc291bmQvcGNtLmgKaW5kZXggNTRjYjA3OS4uMGNmOTFiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9wY20uaAorKysgYi9pbmNsdWRlL3NvdW5kL3BjbS5oCkBAIC04MjUsNiArODI1LDggQEAKIGludCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcG93MihzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBjb25kLAogCQkJICAgICAgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIpOworaW50IHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlKHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJhc2VfcmF0ZSk7CiBpbnQgc25kX3BjbV9od19ydWxlX2FkZChzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAogCQkJdW5zaWduZWQgaW50IGNvbmQsCiAJCQlpbnQgdmFyLApAQCAtMTAzNSw2ICsxMDM3LDggQEAKIAlhdG9taWNfZGVjKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpOwogfQogCitpbnQgc25kX3BjbV9saWJfZGVmYXVsdF9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpOwogLyogbW1hcCBmb3IgaW8tbWVtb3J5IGFyZWEgKi8KICNpZiBkZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX1BQQykgfHwgZGVmaW5lZChDT05GSUdfQUxQSEEpCiAjZGVmaW5lIFNORFJWX1BDTV9JTkZPX01NQVBfSU9NRU0JU05EUlZfUENNX0lORk9fTU1BUApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zYWlmLmggYi9pbmNsdWRlL3NvdW5kL3NhaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGUwZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9zYWlmLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fU09VTkRfU0FJRl9IX18KKyNkZWZpbmUgX19TT1VORF9TQUlGX0hfXworCitzdHJ1Y3QgbXhzX3NhaWZfcGxhdGZvcm1fZGF0YSB7CisJaW50ICgqaW5pdCkgKHZvaWQpOworCWludCAoKmdldF9tYXN0ZXJfaWQpICh1bnNpZ25lZCBpbnQgc2FpZl9pZCk7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NlcV9rZXJuZWwuaCBiL2luY2x1ZGUvc291bmQvc2VxX2tlcm5lbC5oCmluZGV4IDNkOWFmYjYuLmYzNTJhOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2VxX2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvc291bmQvc2VxX2tlcm5lbC5oCkBAIC03NSw5ICs3NSw5IEBACiB9OwogCiAvKiBpbnRlcmZhY2UgZm9yIGtlcm5lbCBjbGllbnQgKi8KK19fcHJpbnRmKDMsIDQpCiBpbnQgc25kX3NlcV9jcmVhdGVfa2VybmVsX2NsaWVudChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBjbGllbnRfaW5kZXgsCi0JCQkJIGNvbnN0IGNoYXIgKm5hbWVfZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworCQkJCSBjb25zdCBjaGFyICpuYW1lX2ZtdCwgLi4uKTsKIGludCBzbmRfc2VxX2RlbGV0ZV9rZXJuZWxfY2xpZW50KGludCBjbGllbnQpOwogaW50IHNuZF9zZXFfa2VybmVsX2NsaWVudF9lbnF1ZXVlKGludCBjbGllbnQsIHN0cnVjdCBzbmRfc2VxX2V2ZW50ICpldiwgaW50IGF0b21pYywgaW50IGhvcCk7CiBpbnQgc25kX3NlcV9rZXJuZWxfY2xpZW50X2Rpc3BhdGNoKGludCBjbGllbnQsIHN0cnVjdCBzbmRfc2VxX2V2ZW50ICpldiwgaW50IGF0b21pYywgaW50IGhvcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaCBiL2luY2x1ZGUvc291bmQvc29jLWRhaS5oCmluZGV4IDVhZDVmM2EuLjI0MTNhY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLWRhaS5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLWRhaS5oCkBAIC0yNCwxMyArMjQsMTMgQEAKICAqIERlc2NyaWJlcyB0aGUgcGh5c2ljYWwgUENNIGRhdGEgZm9ybWF0aW5nIGFuZCBjbG9ja2luZy4gQWRkIG5ldyBmb3JtYXRzCiAgKiB0byB0aGUgZW5kLgogICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0kyUwkJMCAvKiBJMlMgbW9kZSAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KCQkxIC8qIFJpZ2h0IEp1c3RpZmllZCBtb2RlICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0xFRlRfSgkJMiAvKiBMZWZ0IEp1c3RpZmllZCBtb2RlICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0RTUF9BCQkzIC8qIEwgZGF0YSBNU0IgYWZ0ZXIgRlJNIExSQyAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9EU1BfQgkJNCAvKiBMIGRhdGEgTVNCIGR1cmluZyBGUk0gTFJDICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0FDOTcJCTUgLyogQUM5NyAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9QRE0JCTYgLyogUHVsc2UgZGVuc2l0eSBtb2R1bGF0aW9uICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0kyUwkJMSAvKiBJMlMgbW9kZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KCQkyIC8qIFJpZ2h0IEp1c3RpZmllZCBtb2RlICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0xFRlRfSgkJMyAvKiBMZWZ0IEp1c3RpZmllZCBtb2RlICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0RTUF9BCQk0IC8qIEwgZGF0YSBNU0IgYWZ0ZXIgRlJNIExSQyAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9EU1BfQgkJNSAvKiBMIGRhdGEgTVNCIGR1cmluZyBGUk0gTFJDICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0FDOTcJCTYgLyogQUM5NyAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9QRE0JCTcgLyogUHVsc2UgZGVuc2l0eSBtb2R1bGF0aW9uICovCiAKIC8qIGxlZnQgYW5kIHJpZ2h0IGp1c3RpZmllZCBhbHNvIGtub3duIGFzIE1TQiBhbmQgTFNCIHJlc3BlY3RpdmVseSAqLwogI2RlZmluZSBTTkRfU09DX0RBSUZNVF9NU0IJCVNORF9TT0NfREFJRk1UX0xFRlRfSgpAQCAtNDIsOCArNDIsOCBAQAogICogREFJIGJpdCBjbG9ja3MgY2FuIGJlIGJlIGdhdGVkIChkaXNhYmxlZCkgd2hlbiB0aGUgREFJIGlzIG5vdAogICogc2VuZGluZyBvciByZWNlaXZpbmcgUENNIGRhdGEgaW4gYSBmcmFtZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBzYXZlIHBvd2VyLgogICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0NPTlQJCSgwIDw8IDQpIC8qIGNvbnRpbnVvdXMgY2xvY2sgKi8KLSNkZWZpbmUgU05EX1NPQ19EQUlGTVRfR0FURUQJCSgxIDw8IDQpIC8qIGNsb2NrIGlzIGdhdGVkICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0NPTlQJCSgxIDw8IDQpIC8qIGNvbnRpbnVvdXMgY2xvY2sgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfR0FURUQJCSgyIDw8IDQpIC8qIGNsb2NrIGlzIGdhdGVkICovCiAKIC8qCiAgKiBEQUkgaGFyZHdhcmUgc2lnbmFsIGludmVyc2lvbnMuCkBAIC01MSwxMCArNTEsMTAgQEAKICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBEQUkgY2FuIGFsc28gc3VwcG9ydCBpbnZlcnRlZCBjbG9ja3MgZm9yIHRoZSBzcGVjaWZpZWQKICAqIGZvcm1hdC4KICAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9OQl9ORgkJKDAgPDwgOCkgLyogbm9ybWFsIGJpdCBjbG9jayArIGZyYW1lICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX05CX0lGCQkoMSA8PCA4KSAvKiBub3JtYWwgQkNMSyArIGludiBGUk0gKi8KLSNkZWZpbmUgU05EX1NPQ19EQUlGTVRfSUJfTkYJCSgyIDw8IDgpIC8qIGludmVydCBCQ0xLICsgbm9yIEZSTSAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9JQl9JRgkJKDMgPDwgOCkgLyogaW52ZXJ0IEJDTEsgKyBGUk0gKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfTkJfTkYJCSgxIDw8IDgpIC8qIG5vcm1hbCBiaXQgY2xvY2sgKyBmcmFtZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9OQl9JRgkJKDIgPDwgOCkgLyogbm9ybWFsIEJDTEsgKyBpbnYgRlJNICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0lCX05GCQkoMyA8PCA4KSAvKiBpbnZlcnQgQkNMSyArIG5vciBGUk0gKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfSUJfSUYJCSg0IDw8IDgpIC8qIGludmVydCBCQ0xLICsgRlJNICovCiAKIC8qCiAgKiBEQUkgaGFyZHdhcmUgY2xvY2sgbWFzdGVycy4KQEAgLTYzLDEwICs2MywxMCBAQAogICogaS5lLiBpZiB0aGUgY29kZWMgaXMgY2xrIGFuZCBGUk0gbWFzdGVyIHRoZW4gdGhlIGludGVyZmFjZSBpcwogICogY2xrIGFuZCBmcmFtZSBzbGF2ZS4KICAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNCQkoMCA8PCAxMikgLyogY29kZWMgY2xrICYgRlJNIG1hc3RlciAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZNCQkoMSA8PCAxMikgLyogY29kZWMgY2xrIHNsYXZlICYgRlJNIG1hc3RlciAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTCQkoMiA8PCAxMikgLyogY29kZWMgY2xrIG1hc3RlciAmIGZyYW1lIHNsYXZlICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0NCU19DRlMJCSgzIDw8IDEyKSAvKiBjb2RlYyBjbGsgJiBGUk0gc2xhdmUgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTQkJKDEgPDwgMTIpIC8qIGNvZGVjIGNsayAmIEZSTSBtYXN0ZXIgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTQkJKDIgPDwgMTIpIC8qIGNvZGVjIGNsayBzbGF2ZSAmIEZSTSBtYXN0ZXIgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0JNX0NGUwkJKDMgPDwgMTIpIC8qIGNvZGVjIGNsayBtYXN0ZXIgJiBmcmFtZSBzbGF2ZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTCQkoNCA8PCAxMikgLyogY29kZWMgY2xrICYgRlJNIHNsYXZlICovCiAKICNkZWZpbmUgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0sJMHgwMDBmCiAjZGVmaW5lIFNORF9TT0NfREFJRk1UX0NMT0NLX01BU0sJMHgwMGYwCkBAIC0yNDIsNiArMjQyLDkgQEAKIAl2b2lkICpwbGF5YmFja19kbWFfZGF0YTsKIAl2b2lkICpjYXB0dXJlX2RtYV9kYXRhOwogCisJLyogU3ltbWV0cnkgZGF0YSAtIG9ubHkgdmFsaWQgaWYgc3ltbWV0cnkgaXMgYmVpbmcgZW5mb3JjZWQgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKwogCS8qIHBhcmVudCBwbGF0Zm9ybS9jb2RlYyAqLwogCXVuaW9uIHsKIAkJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCmluZGV4IGUwNTgzYjcuLjE3YTRjMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKQEAgLTM4MSw2ICszODEsOSBAQAogaW50IHNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkJY29uc3QgY2hhciAqcGluKTsKIAorLyogTW9zdGx5IGludGVybmFsIC0gc2hvdWxkIG5vdCBub3JtYWxseSBiZSB1c2VkICovCit2b2lkIGRhcG1fbWFya19kaXJ0eShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgY29uc3QgY2hhciAqcmVhc29uKTsKKwogLyogZGFwbSB3aWRnZXQgdHlwZXMgKi8KIGVudW0gc25kX3NvY19kYXBtX3R5cGUgewogCXNuZF9zb2NfZGFwbV9pbnB1dCA9IDAsCQkvKiBpbnB1dCBwaW4gKi8KQEAgLTQ3Myw2ICs0NzYsOCBAQAogCXVuc2lnbmVkIGNoYXIgZXh0OjE7CQkJLyogaGFzIGV4dGVybmFsIHdpZGdldHMgKi8KIAl1bnNpZ25lZCBjaGFyIGZvcmNlOjE7CQkJLyogZm9yY2Ugc3RhdGUgKi8KIAl1bnNpZ25lZCBjaGFyIGlnbm9yZV9zdXNwZW5kOjE7ICAgICAgICAgLyoga2VwdCBlbmFibGVkIG92ZXIgc3VzcGVuZCAqLworCXVuc2lnbmVkIGNoYXIgbmV3X3Bvd2VyOjE7CQkvKiBwb3dlciBmcm9tIHRoaXMgcnVuICovCisJdW5zaWduZWQgY2hhciBwb3dlcl9jaGVja2VkOjE7CQkvKiBwb3dlciBjaGVja2VkIHRoaXMgcnVuICovCiAJaW50IHN1YnNlcTsJCQkJLyogc29ydCB3aXRoaW4gd2lkZ2V0IHR5cGUgKi8KIAogCWludCAoKnBvd2VyX2NoZWNrKShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdyk7CkBAIC00OTIsNiArNDk3LDkgQEAKIAogCS8qIHVzZWQgZHVyaW5nIERBUE0gdXBkYXRlcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcG93ZXJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRpcnR5OworCWludCBpbnB1dHM7CisJaW50IG91dHB1dHM7CiB9OwogCiBzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSB7CkBAIC01MjQsNiArNTMyLDggQEAKIAllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCB0YXJnZXRfYmlhc19sZXZlbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKKwlpbnQgKCpzdHJlYW1fZXZlbnQpKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwgaW50IGV2ZW50KTsKKwogI2lmZGVmIENPTkZJR19ERUJVR19GUwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGFwbTsKICNlbmRpZgpAQCAtNTM1LDQgKzU0NSwxMCBAQAogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXRzWzBdOwogfTsKIAorc3RydWN0IHNuZF9zb2NfZGFwbV9zdGF0cyB7CisJaW50IHBvd2VyX2NoZWNrczsKKwlpbnQgcGF0aF9jaGVja3M7CisJaW50IG5laWdoYm91cl9jaGVja3M7Cit9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLmggYi9pbmNsdWRlL3NvdW5kL3NvYy5oCmluZGV4IGFhMTlmNWEuLjExY2ZiNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MuaApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CkBAIC0yNywxMyArMjgsMjAgQEAKIC8qCiAgKiBDb252ZW5pZW5jZSBrY29udHJvbCBidWlsZGVycwogICovCi0jZGVmaW5lIFNPQ19TSU5HTEVfVkFMVUUoeHJlZywgeHNoaWZ0LCB4bWF4LCB4aW52ZXJ0KSBcCisjZGVmaW5lIFNPQ19ET1VCTEVfVkFMVUUoeHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIHhtYXgsIHhpbnZlcnQpIFwKIAkoKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKLQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgLm1heCA9IHhtYXgsIFwKLQkucGxhdGZvcm1fbWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9KQorCXsucmVnID0geHJlZywgLnJyZWcgPSB4cmVnLCAuc2hpZnQgPSBzaGlmdF9sZWZ0LCBcCisJLnJzaGlmdCA9IHNoaWZ0X3JpZ2h0LCAubWF4ID0geG1heCwgLnBsYXRmb3JtX21heCA9IHhtYXgsIFwKKwkuaW52ZXJ0ID0geGludmVydH0pCisjZGVmaW5lIFNPQ19TSU5HTEVfVkFMVUUoeHJlZywgeHNoaWZ0LCB4bWF4LCB4aW52ZXJ0KSBcCisJU09DX0RPVUJMRV9WQUxVRSh4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1heCwgeGludmVydCkKICNkZWZpbmUgU09DX1NJTkdMRV9WQUxVRV9FWFQoeHJlZywgeG1heCwgeGludmVydCkgXAogCSgodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAogCXsucmVnID0geHJlZywgLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0pCisjZGVmaW5lIFNPQ19ET1VCTEVfUl9WQUxVRSh4bHJlZywgeHJyZWcsIHhzaGlmdCwgeG1heCwgeGludmVydCkgXAorCSgodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAorCXsucmVnID0geGxyZWcsIC5ycmVnID0geHJyZWcsIC5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgXAorCS5tYXggPSB4bWF4LCAucGxhdGZvcm1fbWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9KQogI2RlZmluZSBTT0NfU0lOR0xFKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAogCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCAuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3csXApAQCAtNDcsNDAgKzU1LDM2IEBACiAJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIC5nZXQgPSBzbmRfc29jX2dldF92b2xzdyxcCiAJLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3LCBcCiAJLnByaXZhdGVfdmFsdWUgPSAgU09DX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgfQotI2RlZmluZSBTT0NfRE9VQkxFKHhuYW1lLCB4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgeG1heCwgeGludmVydCkgXAorI2RlZmluZSBTT0NfRE9VQkxFKHhuYW1lLCByZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXgsIGludmVydCkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAoeG5hbWUpLFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LCBcCiAJLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCwgXAotCQkgLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQorCS5wcml2YXRlX3ZhbHVlID0gU09DX0RPVUJMRV9WQUxVRShyZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBcCisJCQkJCSAgbWF4LCBpbnZlcnQpIH0KICNkZWZpbmUgU09DX0RPVUJMRV9SKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAotCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3XzJyLCBcCi0JLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3XzJyLCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIsIFwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCi0JCXsucmVnID0gcmVnX2xlZnQsIC5ycmVnID0gcmVnX3JpZ2h0LCAuc2hpZnQgPSB4c2hpZnQsIFwKLQkJLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQotI2RlZmluZSBTT0NfRE9VQkxFX1RMVih4bmFtZSwgeHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIHhtYXgsIHhpbnZlcnQsIHRsdl9hcnJheSkgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCisJLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3csIFwKKwkucHJpdmF0ZV92YWx1ZSA9IFNPQ19ET1VCTEVfUl9WQUxVRShyZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIFwKKwkJCQkJICAgIHhtYXgsIHhpbnZlcnQpIH0KKyNkZWZpbmUgU09DX0RPVUJMRV9UTFYoeG5hbWUsIHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIG1heCwgaW52ZXJ0LCB0bHZfYXJyYXkpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCiAJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8XAogCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSxcCiAJLnRsdi5wID0gKHRsdl9hcnJheSksIFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LCBcCiAJLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCxcCi0JCSAubWF4ID0geG1heCwgLnBsYXRmb3JtX21heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9CisJLnByaXZhdGVfdmFsdWUgPSBTT0NfRE9VQkxFX1ZBTFVFKHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIFwKKwkJCQkJICBtYXgsIGludmVydCkgfQogI2RlZmluZSBTT0NfRE9VQkxFX1JfVExWKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAoeG5hbWUpLFwKIAkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEIHxcCiAJCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLFwKIAkudGx2LnAgPSAodGx2X2FycmF5KSwgXAotCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3XzJyLCBcCi0JLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3XzJyLCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIsIFwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCi0JCXsucmVnID0gcmVnX2xlZnQsIC5ycmVnID0gcmVnX3JpZ2h0LCAuc2hpZnQgPSB4c2hpZnQsIFwKLQkJLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCisJLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3csIFwKKwkucHJpdmF0ZV92YWx1ZSA9IFNPQ19ET1VCTEVfUl9WQUxVRShyZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIFwKKwkJCQkJICAgIHhtYXgsIHhpbnZlcnQpIH0KICNkZWZpbmUgU09DX0RPVUJMRV9TOF9UTFYoeG5hbWUsIHhyZWcsIHhtaW4sIHhtYXgsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCkBAIC0xMjAsMTQgKzEyNCwxMyBAQAogCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCiAJLmdldCA9IHhoYW5kbGVyX2dldCwgLnB1dCA9IHhoYW5kbGVyX3B1dCwgXAogCS5wcml2YXRlX3ZhbHVlID0gU09DX1NJTkdMRV9WQUxVRSh4cmVnLCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQpIH0KLSNkZWZpbmUgU09DX0RPVUJMRV9FWFQoeG5hbWUsIHhyZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCB4bWF4LCB4aW52ZXJ0LFwKKyNkZWZpbmUgU09DX0RPVUJMRV9FWFQoeG5hbWUsIHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIG1heCwgaW52ZXJ0LFwKIAkgeGhhbmRsZXJfZ2V0LCB4aGFuZGxlcl9wdXQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCiAJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKIAkuZ2V0ID0geGhhbmRsZXJfZ2V0LCAucHV0ID0geGhhbmRsZXJfcHV0LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCwgXAotCQkgLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQorCS5wcml2YXRlX3ZhbHVlID0gXAorCQlTT0NfRE9VQkxFX1ZBTFVFKHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIG1heCwgaW52ZXJ0KSB9CiAjZGVmaW5lIFNPQ19TSU5HTEVfRVhUX1RMVih4bmFtZSwgeHJlZywgeHNoaWZ0LCB4bWF4LCB4aW52ZXJ0LFwKIAkgeGhhbmRsZXJfZ2V0LCB4aGFuZGxlcl9wdXQsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXApAQCAtMTQ1LDIwICsxNDgsMTggQEAKIAkudGx2LnAgPSAodGx2X2FycmF5KSwgXAogCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCiAJLmdldCA9IHhoYW5kbGVyX2dldCwgLnB1dCA9IHhoYW5kbGVyX3B1dCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKLQkJey5yZWcgPSB4cmVnLCAuc2hpZnQgPSBzaGlmdF9sZWZ0LCAucnNoaWZ0ID0gc2hpZnRfcmlnaHQsIFwKLQkJLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQorCS5wcml2YXRlX3ZhbHVlID0gU09DX0RPVUJMRV9WQUxVRSh4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgXAorCQkJCQkgIHhtYXgsIHhpbnZlcnQpIH0KICNkZWZpbmUgU09DX0RPVUJMRV9SX0VYVF9UTFYoeG5hbWUsIHJlZ19sZWZ0LCByZWdfcmlnaHQsIHhzaGlmdCwgeG1heCwgeGludmVydCxcCiAJIHhoYW5kbGVyX2dldCwgeGhhbmRsZXJfcHV0LCB0bHZfYXJyYXkpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCiAJCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLCBcCiAJLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCiAJLmdldCA9IHhoYW5kbGVyX2dldCwgLnB1dCA9IHhoYW5kbGVyX3B1dCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKLQkJey5yZWcgPSByZWdfbGVmdCwgLnJyZWcgPSByZWdfcmlnaHQsIC5zaGlmdCA9IHhzaGlmdCwgXAotCQkubWF4ID0geG1heCwgLnBsYXRmb3JtX21heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9CisJLnByaXZhdGVfdmFsdWUgPSBTT0NfRE9VQkxFX1JfVkFMVUUocmVnX2xlZnQsIHJlZ19yaWdodCwgeHNoaWZ0LCBcCisJCQkJCSAgICB4bWF4LCB4aW52ZXJ0KSB9CiAjZGVmaW5lIFNPQ19TSU5HTEVfQk9PTF9FWFQoeG5hbWUsIHhkYXRhLCB4aGFuZGxlcl9nZXQsIHhoYW5kbGVyX3B1dCkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAogCS5pbmZvID0gc25kX3NvY19pbmZvX2Jvb2xfZXh0LCBcCkBAIC0yNjAsNiArMjYxLDcgQEAKIGVudW0gc25kX3NvY19jb250cm9sX3R5cGUgewogCVNORF9TT0NfSTJDID0gMSwKIAlTTkRfU09DX1NQSSwKKwlTTkRfU09DX1JFR01BUCwKIH07CiAKIGVudW0gc25kX3NvY19jb21wcmVzc190eXBlIHsKQEAgLTI3NCw3ICsyNzYsNyBAQAogfTsKIAogaW50IHNuZF9zb2NfY29kZWNfc2V0X3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBjbGtfaWQsCi0JCQkgICAgIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKTsKKwkJCSAgICAgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpOwogaW50IHNuZF9zb2NfY29kZWNfc2V0X3BsbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBwbGxfaWQsIGludCBzb3VyY2UsCiAJCQkgIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpOwogCkBAIC0zOTEsMTIgKzM5Myw4IEBACiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwogaW50IHNuZF9zb2NfcHV0X3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX2luZm9fdm9sc3dfMnIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7Ci1pbnQgc25kX3NvY19nZXRfdm9sc3dfMnIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9zb2NfcHV0X3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKKyNkZWZpbmUgc25kX3NvY19nZXRfdm9sc3dfMnIgc25kX3NvY19nZXRfdm9sc3cKKyNkZWZpbmUgc25kX3NvY19wdXRfdm9sc3dfMnIgc25kX3NvY19wdXRfdm9sc3cKIGludCBzbmRfc29jX2luZm9fdm9sc3dfczgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CiBpbnQgc25kX3NvY19nZXRfdm9sc3dfczgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC01NzYsOSArNTc0LDExIEBACiAJY29uc3Qgdm9pZCAqcmVnX2RlZl9jb3B5OwogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2NhY2hlX29wcyAqY2FjaGVfb3BzOwogCXN0cnVjdCBtdXRleCBjYWNoZV9yd19tdXRleDsKKwlpbnQgdmFsX2J5dGVzOwogCiAJLyogZGFwbSAqLwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCBkYXBtOworCXVuc2lnbmVkIGludCBpZ25vcmVfcG1kb3duX3RpbWU6MTsgLyogcG1kb3duX3RpbWUgaXMgaWdub3JlZCBhdCBzdG9wICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NvZGVjX3Jvb3Q7CkBAIC02MDcsNyArNjA3LDcgQEAKIAogCS8qIGNvZGVjIHdpZGUgb3BlcmF0aW9ucyAqLwogCWludCAoKnNldF9zeXNjbGspKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCSAgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpOworCQkJICBpbnQgY2xrX2lkLCBpbnQgc291cmNlLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcik7CiAJaW50ICgqc2V0X3BsbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgcGxsX2lkLCBpbnQgc291cmNlLAogCQl1bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWduZWQgaW50IGZyZXFfb3V0KTsKIApAQCAtNjE5LDcgKzYxOSw3IEBACiAJaW50ICgqdm9sYXRpbGVfcmVnaXN0ZXIpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7CiAJaW50ICgqcmVhZGFibGVfcmVnaXN0ZXIpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7CiAJaW50ICgqd3JpdGFibGVfcmVnaXN0ZXIpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7Ci0Jc2hvcnQgcmVnX2NhY2hlX3NpemU7CisJdW5zaWduZWQgaW50IHJlZ19jYWNoZV9zaXplOwogCXNob3J0IHJlZ19jYWNoZV9zdGVwOwogCXNob3J0IHJlZ193b3JkX3NpemU7CiAJY29uc3Qgdm9pZCAqcmVnX2NhY2hlX2RlZmF1bHQ7CkBAIC02MzAsMTAgKzYzMCwxNCBAQAogCS8qIGNvZGVjIGJpYXMgbGV2ZWwgKi8KIAlpbnQgKCpzZXRfYmlhc19sZXZlbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwKIAkJCSAgICAgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKTsKKwlib29sIGlkbGVfYmlhc19vZmY7CiAKIAl2b2lkICgqc2VxX25vdGlmaWVyKShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKiwKIAkJCSAgICAgZW51bSBzbmRfc29jX2RhcG1fdHlwZSwgaW50KTsKIAorCS8qIGNvZGVjIHN0cmVhbSBjb21wbGV0aW9uIGV2ZW50ICovCisJaW50ICgqc3RyZWFtX2V2ZW50KShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sIGludCBldmVudCk7CisKIAkvKiBwcm9iZSBvcmRlcmluZyAtIGZvciBjb21wb25lbnRzIHdpdGggcnVudGltZSBkZXBlbmRlbmNpZXMgKi8KIAlpbnQgcHJvYmVfb3JkZXI7CiAJaW50IHJlbW92ZV9vcmRlcjsKQEAgLTY2OSw2ICs2NzMsOSBAQAogCS8qIHBsYXRmb3JtIHN0cmVhbSBvcHMgKi8KIAlzdHJ1Y3Qgc25kX3BjbV9vcHMgKm9wczsKIAorCS8qIHBsYXRmb3JtIHN0cmVhbSBjb21wbGV0aW9uIGV2ZW50ICovCisJaW50ICgqc3RyZWFtX2V2ZW50KShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sIGludCBldmVudCk7CisKIAkvKiBwcm9iZSBvcmRlcmluZyAtIGZvciBjb21wb25lbnRzIHdpdGggcnVudGltZSBkZXBlbmRlbmNpZXMgKi8KIAlpbnQgcHJvYmVfb3JkZXI7CiAJaW50IHJlbW92ZV9vcmRlcjsKQEAgLTcwMyw2ICs3MTAsOCBAQAogCWNvbnN0IGNoYXIgKmNwdV9kYWlfbmFtZTsKIAljb25zdCBjaGFyICpjb2RlY19kYWlfbmFtZTsKIAorCXVuc2lnbmVkIGludCBkYWlfZm10OyAgICAgICAgICAgLyogZm9ybWF0IHRvIHNldCBvbiBpbml0ICovCisKIAkvKiBLZWVwIERBSSBhY3RpdmUgb3ZlciBzdXNwZW5kICovCiAJdW5zaWduZWQgaW50IGlnbm9yZV9zdXNwZW5kOjE7CiAKQEAgLTgxNSw5ICs4MjQsMTEgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHdpZGdldHM7CiAJc3RydWN0IGxpc3RfaGVhZCBwYXRoczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRhcG1fbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRhcG1fZGlydHk7CiAKIAkvKiBHZW5lcmljIERBUE0gY29udGV4dCBmb3IgdGhlIGNhcmQgKi8KIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3N0YXRzIGRhcG1fc3RhdHM7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NhcmRfcm9vdDsKQEAgLTg0MCw4ICs4NTEsNiBAQAogCXVuc2lnbmVkIGludCBjb21wbGV0ZToxOwogCXVuc2lnbmVkIGludCBkZXZfcmVnaXN0ZXJlZDoxOwogCi0JLyogU3ltbWV0cnkgZGF0YSAtIG9ubHkgdmFsaWQgaWYgc3ltbWV0cnkgaXMgYmVpbmcgZW5mb3JjZWQgKi8KLQl1bnNpZ25lZCBpbnQgcmF0ZTsKIAlsb25nIHBtZG93bl90aW1lOwogCiAJLyogcnVudGltZSBkZXZpY2VzICovCkBAIC05MzYsNiArOTQ1LDE4IEBACiAJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmRhcG1fbGlzdCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBzbmRfc29jX3ZvbHN3X2lzX3N0ZXJlbyhzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jKQoreworCWlmIChtYy0+cmVnID09IG1jLT5ycmVnICYmIG1jLT5zaGlmdCA9PSBtYy0+cnNoaWZ0KQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIG1jLT5yZWcgPT0gbWMtPnJyZWcgJiYgbWMtPnNoaWZ0ICE9IG1jLT5yc2hpZnQsIG9yCisJICogbWMtPnJlZyAhPSBtYy0+cnJlZyBtZWFucyB0aGF0IHRoZSBjb250cm9sIGlzCisJICogc3RlcmVvIChiaXRzIGluIG9uZSByZWdpc3RlciBvciBpbiB0d28gcmVnaXN0ZXJzKQorCSAqLworCXJldHVybiAxOworfQorCiBpbnQgc25kX3NvY191dGlsX2luaXQodm9pZCk7CiB2b2lkIHNuZF9zb2NfdXRpbF9leGl0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3RwYTYxMzBhMi1wbGF0LmggYi9pbmNsdWRlL3NvdW5kL3RwYTYxMzBhMi1wbGF0LmgKaW5kZXggODliZWNjYjUuLjRjYzEwOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdHBhNjEzMGEyLXBsYXQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3RwYTYxMzBhMi1wbGF0LmgKQEAgLTIzLDEzICsyMyw3IEBACiAjaWZuZGVmIFRQQTYxMzBBMl9QTEFUX0gKICNkZWZpbmUgVFBBNjEzMEEyX1BMQVRfSAogCi1lbnVtIHRwYV9tb2RlbCB7Ci0JVFBBNjEzMEEyLAotCVRQQTYxNDBBMiwKLX07Ci0KIHN0cnVjdCB0cGE2MTMwYTJfcGxhdGZvcm1fZGF0YSB7Ci0JZW51bSB0cGFfbW9kZWwgaWQ7CiAJaW50IHBvd2VyX2dwaW87CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3dtMTI1MC1ldjEuaCBiL2luY2x1ZGUvc291bmQvd20xMjUwLWV2MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmY4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL3dtMTI1MC1ldjEuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogbGludXgvc291bmQvd20xMjUwLWV2MS5oIC0gUGxhdGZvcm0gZGF0YSBmb3IgV00xMjUwLUVWMQorICoKKyAqIENvcHlyaWdodCAyMDExIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcy4gUExDLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1NORF9XTTEyNTBfRVYxX0gKKyNkZWZpbmUgX19MSU5VWF9TTkRfV00xMjUwX0VWMV9ICisKKyNkZWZpbmUgV00xMjUwX0VWMV9OVU1fR1BJT1MgNQorCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19DTEtfRU5BICAwCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19DTEtfU0VMMCAxCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19DTEtfU0VMMSAyCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19PU1IgICAgICAzCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19NQVNURVIgICA0CisKKworc3RydWN0IHdtMTI1MF9ldjFfcGRhdGEgeworCWludCBncGlvc1tXTTEyNTBfRVYxX05VTV9HUElPU107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvd201MTAwLmggYi9pbmNsdWRlL3NvdW5kL3dtNTEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxN2QwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL3dtNTEwMC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBsaW51eC9zb3VuZC93bTUxMDAuaCAtLSBQbGF0Zm9ybSBkYXRhIGZvciBXTTUxMDAKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MuIFBMQy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9TTkRfV001MTAwX0gKKyNkZWZpbmUgX19MSU5VWF9TTkRfV001MTAwX0gKKworZW51bSB3bTUxMDBfaW5fbW9kZSB7CisJV001MTAwX0lOX1NFID0gMCwKKwlXTTUxMDBfSU5fRElGRiA9IDEsCisJV001MTAwX0lOX0RNSUMgPSAyLAorfTsKKworZW51bSB3bTUxMDBfZG1pY19zdXAgeworCVdNNTEwMF9ETUlDX1NVUF9NSUNWREQgPSAwLAorCVdNNTEwMF9ETUlDX1NVUF9NSUNCSUFTMSA9IDEsCisJV001MTAwX0RNSUNfU1VQX01JQ0JJQVMyID0gMiwKKwlXTTUxMDBfRE1JQ19TVVBfTUlDQklBUzMgPSAzLAorfTsKKworZW51bSB3bTUxMDBfbWljZGV0X2JpYXMgeworCVdNNTEwMF9NSUNERVRfTUlDQklBUzEgPSAwLAorCVdNNTEwMF9NSUNERVRfTUlDQklBUzIgPSAxLAorCVdNNTEwMF9NSUNERVRfTUlDQklBUzMgPSAyLAorfTsKKworc3RydWN0IHdtNTEwMF9qYWNrX21vZGUgeworCWVudW0gd201MTAwX21pY2RldF9iaWFzIGJpYXM7CisJaW50IGhwX3BvbDsKKwlpbnQgbWljZF9zcmM7Cit9OworCisjZGVmaW5lIFdNNTEwMF9HUElPX1NFVCAweDEwMDAwCisKK3N0cnVjdCB3bTUxMDBfcGRhdGEgeworCWludCByZXNldDsgICAgICAvKiogR1BJTyBjb250cm9sbGluZyAvUkVTRVQsIGlmIGFueSAqLworCWludCBsZG9fZW5hOyAgICAvKiogR1BJTyBjb250cm9sbGluZyBMT0RFTkEsIGlmIGFueSAqLworCWludCBocF9wb2w7ICAgICAvKiogR1BJTyBjb250cm9sbGluZyBoZWFkc2V0IHBvbGFyaXR5LCBpZiBhbnkgKi8KKwlpbnQgaXJxX2ZsYWdzOworCWludCBncGlvX2Jhc2U7CisKKwlzdHJ1Y3Qgd201MTAwX2phY2tfbW9kZSBqYWNrX21vZGVzWzJdOworCisJLyogSW5wdXQgcGluIG1vZGUgc2VsZWN0aW9uICovCisJZW51bSB3bTUxMDBfaW5fbW9kZSBpbl9tb2RlWzRdOworCisJLyogRE1JQyBzdXBwbHkgc2VsZWN0aW9uICovCisJZW51bSB3bTUxMDBfZG1pY19zdXAgZG1pY19zdXBbNF07CisKKwlpbnQgZ3Bpb19kZWZhdWx0c1s2XTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oCmluZGV4IDM1YWE3ODZmLi43ZjVmZWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYXNlLmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oCkBAIC04OSw3ICs4OSw2IEBACiAJVFJBTlNQT1JUX1BST0NFU1NfVE1SCT0gOSwKIAlUUkFOU1BPUlRfSVNUQVRFX1BST0NFU1NJTkcgPSAxMSwKIAlUUkFOU1BPUlRfTkVXX0NNRF9NQVAJPSAxNiwKLQlUUkFOU1BPUlRfRlJFRV9DTURfSU5UUiA9IDE3LAogCVRSQU5TUE9SVF9DT01QTEVURV9RRl9XUCA9IDE4LAogCVRSQU5TUE9SVF9DT01QTEVURV9RRl9PSyA9IDE5LAogfTsKQEAgLTExNSw3ICsxMTQsNiBAQAogCVNDRl9ERUxBWUVEX0NNRF9GUk9NX1NBTV9BVFRSCT0gMHgwMDA4MDAwMCwKIAlTQ0ZfVU5VU0VECQkJPSAweDAwMTAwMDAwLAogCVNDRl9QQVNTVEhST1VHSF9TR19UT19NRU1fTk9BTExPQyA9IDB4MDA0MDAwMDAsCi0JU0NGX0VNVUxBVEVfQ0RCX0FTWU5DCQk9IDB4MDEwMDAwMDAsCiB9OwogCiAvKiBzdHJ1Y3Qgc2VfZGV2X2VudHJ5LT5sdW5fZmxhZ3MgYW5kIHN0cnVjdCBzZV9sdW4tPmx1bl9hY2Nlc3MgKi8KQEAgLTQyNiw2ICs0MjQsOSBAQAogCWVudW0gdHJhbnNwb3J0X3N0YXRlX3RhYmxlIHRfc3RhdGU7CiAJLyogVHJhbnNwb3J0IHNwZWNpZmljIGVycm9yIHN0YXR1cyAqLwogCWludAkJCXRyYW5zcG9ydF9lcnJvcl9zdGF0dXM7CisJLyogVXNlZCB0byBzaWduYWwgY21kLT5zZV90Zm8tPmNoZWNrX3JlbGVhc2VfY21kKCkgdXNhZ2UgcGVyIGNtZCAqLworCWludAkJCWNoZWNrX3JlbGVhc2U6MTsKKwlpbnQJCQljbWRfd2FpdF9zZXQ6MTsKIAkvKiBTZWUgc2VfY21kX2ZsYWdzX3RhYmxlICovCiAJdTMyCQkJc2VfY21kX2ZsYWdzOwogCXUzMgkJCXNlX29yZGVyZWRfaWQ7CkBAIC00NTIsOCArNDUzLDEwIEBACiAJc3RydWN0IHNlX3Nlc3Npb24JKnNlX3Nlc3M7CiAJc3RydWN0IHNlX3Rtcl9yZXEJKnNlX3Rtcl9yZXE7CiAJc3RydWN0IGxpc3RfaGVhZAlzZV9xdWV1ZV9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJc2VfY21kX2xpc3Q7CisJc3RydWN0IGNvbXBsZXRpb24JY21kX3dhaXRfY29tcDsKIAlzdHJ1Y3QgdGFyZ2V0X2NvcmVfZmFicmljX29wcyAqc2VfdGZvOwotCWludCAoKnRyYW5zcG9ydF9lbXVsYXRlX2NkYikoc3RydWN0IHNlX2NtZCAqKTsKKwlpbnQgKCpleGVjdXRlX3Rhc2spKHN0cnVjdCBzZV90YXNrICopOwogCXZvaWQgKCp0cmFuc3BvcnRfY29tcGxldGVfY2FsbGJhY2spKHN0cnVjdCBzZV9jbWQgKik7CiAKIAl1bnNpZ25lZCBjaGFyCQkqdF90YXNrX2NkYjsKQEAgLTU1OSwxMiArNTYyLDE2IEBACiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogc3RydWN0IHNlX3Nlc3Npb24geworCWludAkJCXNlc3NfdGVhcmluZ19kb3duOjE7CiAJdTY0CQkJc2Vzc19iaW5faXNpZDsKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wJKnNlX25vZGVfYWNsOwogCXN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnNlX3RwZzsKIAl2b2lkCQkJKmZhYnJpY19zZXNzX3B0cjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNlc3NfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNlc3NfYWNsX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlzZXNzX2NtZF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJc2Vzc193YWl0X2xpc3Q7CisJc3BpbmxvY2tfdAkJc2Vzc19jbWRfbG9jazsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCiBzdHJ1Y3Qgc2VfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmggYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaAppbmRleCA0NjU3MTkxLi4yYmUzMWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaApAQCAtMTcsNyArMTcsNyBAQAogCQkJCQlzdHJ1Y3Qgc2VfbHVuICopOwogZXh0ZXJuIHZvaWQgY29yZV9kZXZfdW5leHBvcnQoc3RydWN0IHNlX2RldmljZSAqLCBzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICosCiAJCQkJCXN0cnVjdCBzZV9sdW4gKik7Ci1leHRlcm4gaW50IHRyYW5zcG9ydF9jb3JlX3JlcG9ydF9sdW5fcmVzcG9uc2Uoc3RydWN0IHNlX2NtZCAqKTsKK2V4dGVybiBpbnQgdGFyZ2V0X3JlcG9ydF9sdW5zKHN0cnVjdCBzZV90YXNrICopOwogZXh0ZXJuIHZvaWQgc2VfcmVsZWFzZV9kZXZpY2VfZm9yX2hiYShzdHJ1Y3Qgc2VfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgc2VfcmVsZWFzZV92cGRfZm9yX2RldihzdHJ1Y3Qgc2VfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgc2VfY2xlYXJfZGV2X3BvcnRzKHN0cnVjdCBzZV9kZXZpY2UgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfb3BzLmggYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfb3BzLmgKaW5kZXggMTI2YzY3NS4uMDI1NjgyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX29wcy5oCisrKyBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19vcHMuaApAQCAtNDYsOSArNDYsMTYgQEAKIAlpbnQgKCpuZXdfY21kX21hcCkoc3RydWN0IHNlX2NtZCAqKTsKIAkvKgogCSAqIE9wdGlvbmFsIHRvIHJlbGVhc2Ugc3RydWN0IHNlX2NtZCBhbmQgZmFicmljIGRlcGVuZGVudCBhbGxvY2F0ZWQKLQkgKiBJL08gZGVzY3JpcHRvciBpbiB0cmFuc3BvcnRfY21kX2NoZWNrX3N0b3AoKQorCSAqIEkvTyBkZXNjcmlwdG9yIGluIHRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcCgpLgorCSAqCisJICogUmV0dXJuaW5nIDEgd2lsbCBzaWduYWwgYSBkZXNjcmlwdG9yIGhhcyBiZWVuIHJlbGVhc2VkLgorCSAqIFJldHVybmluZyAwIHdpbGwgc2lnbmFsIGEgZGVzY3JpcHRvciBoYXMgbm90IGJlZW4gcmVsZWFzZWQuCiAJICovCi0Jdm9pZCAoKmNoZWNrX3N0b3BfZnJlZSkoc3RydWN0IHNlX2NtZCAqKTsKKwlpbnQgKCpjaGVja19zdG9wX2ZyZWUpKHN0cnVjdCBzZV9jbWQgKik7CisJLyoKKwkgKiBPcHRpb25hbCBjaGVjayBmb3IgYWN0aXZlIEkvTyBzaHV0ZG93bgorCSAqLworCWludCAoKmNoZWNrX3JlbGVhc2VfY21kKShzdHJ1Y3Qgc2VfY21kICopOwogCXZvaWQgKCpyZWxlYXNlX2NtZCkoc3RydWN0IHNlX2NtZCAqKTsKIAkvKgogCSAqIENhbGxlZCB3aXRoIHNwaW5fbG9ja19iaChzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwLT5zZXNzaW9uX2xvY2sgaGVsZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKaW5kZXggYTAzN2ExYS4uYzE2ZTk0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKQEAgLTE2MCwxNyArMTYwLDIwIEBACiBleHRlcm4gaW50IHRyYW5zcG9ydF9nZW5lcmljX2hhbmRsZV9kYXRhKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gdm9pZCB0cmFuc3BvcnRfbmV3X2NtZF9mYWlsdXJlKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gaW50IHRyYW5zcG9ydF9nZW5lcmljX2hhbmRsZV90bXIoc3RydWN0IHNlX2NtZCAqKTsKLWV4dGVybiB2b2lkIHRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kX2ludHIoc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiBib29sIHRhcmdldF9zdG9wX3Rhc2soc3RydWN0IHNlX3Rhc2sgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKIGV4dGVybiBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfbWFwX21lbV90b19jbWQoc3RydWN0IHNlX2NtZCAqY21kLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgdTMyLAogCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqLCB1MzIpOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfY2xlYXJfbHVuX2Zyb21fc2Vzc2lvbnMoc3RydWN0IHNlX2x1biAqKTsKLWV4dGVybiB2b2lkIHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyhzdHJ1Y3Qgc2VfY21kICopOworZXh0ZXJuIGJvb2wgdHJhbnNwb3J0X3dhaXRfZm9yX3Rhc2tzKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gaW50IHRyYW5zcG9ydF9jaGVja19hYm9ydGVkX3N0YXR1cyhzdHJ1Y3Qgc2VfY21kICosIGludCk7CiBleHRlcm4gaW50IHRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2Uoc3RydWN0IHNlX2NtZCAqLCB1OCwgaW50KTsKIGV4dGVybiB2b2lkIHRyYW5zcG9ydF9zZW5kX3Rhc2tfYWJvcnQoc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiB2b2lkIHRyYW5zcG9ydF9yZWxlYXNlX2NtZChzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoc3RydWN0IHNlX2NtZCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgdGFyZ2V0X2dldF9zZXNzX2NtZChzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqLCBzdHJ1Y3Qgc2VfY21kICopOworZXh0ZXJuIGludCB0YXJnZXRfcHV0X3Nlc3NfY21kKHN0cnVjdCBzZV9zZXNzaW9uICosIHN0cnVjdCBzZV9jbWQgKik7CitleHRlcm4gdm9pZCB0YXJnZXRfc3BsaWNlX3Nlc3NfY21kX2xpc3Qoc3RydWN0IHNlX3Nlc3Npb24gKik7CitleHRlcm4gdm9pZCB0YXJnZXRfd2FpdF9mb3Jfc2Vzc19jbWRzKHN0cnVjdCBzZV9zZXNzaW9uICosIGludCk7CiBleHRlcm4gdm9pZCB0cmFuc3BvcnRfZ2VuZXJpY193YWl0X2Zvcl9jbWRzKHN0cnVjdCBzZV9jbWQgKiwgaW50KTsKIGV4dGVybiB2b2lkIHRyYW5zcG9ydF9kb190YXNrX3NnX2NoYWluKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gdm9pZCB0cmFuc3BvcnRfZ2VuZXJpY19wcm9jZXNzX3dyaXRlKHN0cnVjdCBzZV9jbWQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oIGIvaW5jbHVkZS90cmFjZS9kZWZpbmVfdHJhY2UuaAppbmRleCBkYTM5YjIyLi5iMGI0ZWIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZGVmaW5lX3RyYWNlLmgKQEAgLTIxLDE2ICsyMSw2IEBACiAjdW5kZWYgQ1JFQVRFX1RSQUNFX1BPSU5UUwogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0vKgotICogbW9kdWxlLmggaW5jbHVkZXMgdHJhY2Vwb2ludHMsIGFuZCBiZWNhdXNlIGZ0cmFjZS5oCi0gKiBwdWxscyBpbiBtb2R1bGUuaDoKLSAqICB0cmFjZS9mdHJhY2UuaCAtPiBsaW51eC9mdHJhY2VfZXZlbnQuaCAtPiBsaW51eC9wZXJmX2V2ZW50LmggLT4KLSAqICBsaW51eC9mdHJhY2UuaCAtPiBsaW51eC9tb2R1bGUuaAotICogd2UgbXVzdCBpbmNsdWRlIG1vZHVsZS5oIGhlcmUgYmVmb3JlIHdlIHBsYXkgd2l0aCBhbnkgb2YKLSAqIHRoZSBUUkFDRV9FVkVOVCgpIG1hY3Jvcywgb3RoZXJ3aXNlIHRoZSB0cmFjZXBvaW50cyBpbmNsdWRlZAotICogYnkgbW9kdWxlLmggbWF5IGJyZWFrIHRoZSBidWlsZC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjdW5kZWYgVFJBQ0VfRVZFTlQKICNkZWZpbmUgVFJBQ0VfRVZFTlQobmFtZSwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGFzc2lnbiwgcHJpbnQpCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Fzb2MuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Fzb2MuaAppbmRleCA2MDNmNWEwLi5hYjI2ZjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9hc29jLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYXNvYy5oCkBAIC0yMTYsNiArMjE2LDMxIEBACiAKICk7CiAKK1RSQUNFX0VWRU5UKHNuZF9zb2NfZGFwbV93YWxrX2RvbmUsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKSwKKworCVRQX0FSR1MoY2FyZCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZygJbmFtZSwJY2FyZC0+bmFtZQkJKQorCQlfX2ZpZWxkKAlpbnQsCXBvd2VyX2NoZWNrcwkJKQorCQlfX2ZpZWxkKAlpbnQsCXBhdGhfY2hlY2tzCQkpCisJCV9fZmllbGQoCWludCwJbmVpZ2hib3VyX2NoZWNrcwkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgY2FyZC0+bmFtZSk7CisJCV9fZW50cnktPnBvd2VyX2NoZWNrcyA9IGNhcmQtPmRhcG1fc3RhdHMucG93ZXJfY2hlY2tzOworCQlfX2VudHJ5LT5wYXRoX2NoZWNrcyA9IGNhcmQtPmRhcG1fc3RhdHMucGF0aF9jaGVja3M7CisJCV9fZW50cnktPm5laWdoYm91cl9jaGVja3MgPSBjYXJkLT5kYXBtX3N0YXRzLm5laWdoYm91cl9jaGVja3M7CisJKSwKKworCVRQX3ByaW50aygiJXM6IGNoZWNrcyAlZCBwb3dlciwgJWQgcGF0aCwgJWQgbmVpZ2hib3VyIiwKKwkJICBfX2dldF9zdHIobmFtZSksIChpbnQpX19lbnRyeS0+cG93ZXJfY2hlY2tzLAorCQkgIChpbnQpX19lbnRyeS0+cGF0aF9jaGVja3MsIChpbnQpX19lbnRyeS0+bmVpZ2hib3VyX2NoZWNrcykKKyk7CisKIFRSQUNFX0VWRU5UKHNuZF9zb2NfamFja19pcnEsCiAKIAlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lKSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAppbmRleCBiNTBhNTQ3Li43NDhmZjdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCkBAIC05LDkgKzksMTIgQEAKIAogc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0Owogc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0Oworc3RydWN0IGV4dDRfZXh0ZW50Owogc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2U7CiBzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvOwogc3RydWN0IG1wYWdlX2RhX2RhdGE7CitzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzOworc3RydWN0IGV4dDRfZXh0ZW50OwogCiAjZGVmaW5lIEVYVDRfSShpbm9kZSkgKGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IGV4dDRfaW5vZGVfaW5mbywgdmZzX2lub2RlKSkKIApAQCAtMTAzMiw5ICsxMDM1LDkgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UsCi0JVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgaW50IHVzZWRfYmxvY2tzKSwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdXNlZF9ibG9ja3MsIGludCBxdW90YV9jbGFpbSksCiAKLQlUUF9BUkdTKGlub2RlLCB1c2VkX2Jsb2NrcyksCisJVFBfQVJHUyhpbm9kZSwgdXNlZF9ibG9ja3MsIHF1b3RhX2NsYWltKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCkBAIC0xMDQ1LDYgKzEwNDgsNyBAQAogCQlfX2ZpZWxkKAlpbnQsCXJlc2VydmVkX2RhdGFfYmxvY2tzCSkKIAkJX19maWVsZCgJaW50LAlyZXNlcnZlZF9tZXRhX2Jsb2NrcwkpCiAJCV9fZmllbGQoCWludCwJYWxsb2NhdGVkX21ldGFfYmxvY2tzCSkKKwkJX19maWVsZCgJaW50LAlxdW90YV9jbGFpbQkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTEwNTMsMTkgKzEwNTcsMjQgQEAKIAkJX19lbnRyeS0+bW9kZQk9IGlub2RlLT5pX21vZGU7CiAJCV9fZW50cnktPmlfYmxvY2tzID0gaW5vZGUtPmlfYmxvY2tzOwogCQlfX2VudHJ5LT51c2VkX2Jsb2NrcyA9IHVzZWRfYmxvY2tzOwotCQlfX2VudHJ5LT5yZXNlcnZlZF9kYXRhX2Jsb2NrcyA9IEVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3M7Ci0JCV9fZW50cnktPnJlc2VydmVkX21ldGFfYmxvY2tzID0gRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKLQkJX19lbnRyeS0+YWxsb2NhdGVkX21ldGFfYmxvY2tzID0gRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7CisJCV9fZW50cnktPnJlc2VydmVkX2RhdGFfYmxvY2tzID0KKwkJCQlFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzOworCQlfX2VudHJ5LT5yZXNlcnZlZF9tZXRhX2Jsb2NrcyA9CisJCQkJRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKKwkJX19lbnRyeS0+YWxsb2NhdGVkX21ldGFfYmxvY2tzID0KKwkJCQlFWFQ0X0koaW5vZGUpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrczsKKwkJX19lbnRyeS0+cXVvdGFfY2xhaW0gPSBxdW90YV9jbGFpbTsKIAkpLAogCiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBtb2RlIDAlbyBpX2Jsb2NrcyAlbGx1IHVzZWRfYmxvY2tzICVkICIKIAkJICAicmVzZXJ2ZWRfZGF0YV9ibG9ja3MgJWQgcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgJWQgIgotCQkgICJhbGxvY2F0ZWRfbWV0YV9ibG9ja3MgJWQiLAorCQkgICJhbGxvY2F0ZWRfbWV0YV9ibG9ja3MgJWQgcXVvdGFfY2xhaW0gJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKIAkJICBfX2VudHJ5LT5tb2RlLCBfX2VudHJ5LT5pX2Jsb2NrcywKIAkJICBfX2VudHJ5LT51c2VkX2Jsb2NrcywgX19lbnRyeS0+cmVzZXJ2ZWRfZGF0YV9ibG9ja3MsCi0JCSAgX19lbnRyeS0+cmVzZXJ2ZWRfbWV0YV9ibG9ja3MsIF9fZW50cnktPmFsbG9jYXRlZF9tZXRhX2Jsb2NrcykKKwkJICBfX2VudHJ5LT5yZXNlcnZlZF9tZXRhX2Jsb2NrcywgX19lbnRyeS0+YWxsb2NhdGVkX21ldGFfYmxvY2tzLAorCQkgIF9fZW50cnktPnF1b3RhX2NsYWltKQogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9kYV9yZXNlcnZlX3NwYWNlLApAQCAtMTM4Niw2ICsxMzk1LDg3IEBACiAJVFBfQVJHUyhpbm9kZSkKICk7CiAKKy8qICd1eCcgaXMgdGhlIHVuaW5pdGlhbGl6ZWQgZXh0ZW50LiAqLworVFJBQ0VfRVZFTlQoZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZF9lbnRlciwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsCisJCSBzdHJ1Y3QgZXh0NF9leHRlbnQgKnV4KSwKKworCVRQX0FSR1MoaW5vZGUsIG1hcCwgdXgpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAltX2xibGsJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCwJbV9sZW4JKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJdV9sYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQsCXVfbGVuCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAl1X3BibGsJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bV9sYmxrCQk9IG1hcC0+bV9sYmxrOworCQlfX2VudHJ5LT5tX2xlbgkJPSBtYXAtPm1fbGVuOworCQlfX2VudHJ5LT51X2xibGsJCT0gbGUzMl90b19jcHUodXgtPmVlX2Jsb2NrKTsKKwkJX19lbnRyeS0+dV9sZW4JCT0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4odXgpOworCQlfX2VudHJ5LT51X3BibGsJCT0gZXh0NF9leHRfcGJsb2NrKHV4KTsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBtX2xibGsgJXUgbV9sZW4gJXUgdV9sYmxrICV1IHVfbGVuICV1ICIKKwkJICAidV9wYmxrICVsbHUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICBfX2VudHJ5LT5tX2xibGssIF9fZW50cnktPm1fbGVuLAorCQkgIF9fZW50cnktPnVfbGJsaywgX19lbnRyeS0+dV9sZW4sIF9fZW50cnktPnVfcGJsaykKKyk7CisKKy8qCisgKiAndXgnIGlzIHRoZSB1bmluaXRpYWxpemVkIGV4dGVudC4KKyAqICdpeCcgaXMgdGhlIGluaXRpYWxpemVkIGV4dGVudCB0byB3aGljaCBibG9ja3MgYXJlIHRyYW5zZmVycmVkLgorICovCitUUkFDRV9FVkVOVChleHQ0X2V4dF9jb252ZXJ0X3RvX2luaXRpYWxpemVkX2Zhc3RwYXRoLAorCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCwKKwkJIHN0cnVjdCBleHQ0X2V4dGVudCAqdXgsIHN0cnVjdCBleHQ0X2V4dGVudCAqaXgpLAorCisJVFBfQVJHUyhpbm9kZSwgbWFwLCB1eCwgaXgpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAltX2xibGsJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCwJbV9sZW4JKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJdV9sYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQsCXVfbGVuCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAl1X3BibGsJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJaV9sYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQsCWlfbGVuCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAlpX3BibGsJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bV9sYmxrCQk9IG1hcC0+bV9sYmxrOworCQlfX2VudHJ5LT5tX2xlbgkJPSBtYXAtPm1fbGVuOworCQlfX2VudHJ5LT51X2xibGsJCT0gbGUzMl90b19jcHUodXgtPmVlX2Jsb2NrKTsKKwkJX19lbnRyeS0+dV9sZW4JCT0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4odXgpOworCQlfX2VudHJ5LT51X3BibGsJCT0gZXh0NF9leHRfcGJsb2NrKHV4KTsKKwkJX19lbnRyeS0+aV9sYmxrCQk9IGxlMzJfdG9fY3B1KGl4LT5lZV9ibG9jayk7CisJCV9fZW50cnktPmlfbGVuCQk9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGl4KTsKKwkJX19lbnRyeS0+aV9wYmxrCQk9IGV4dDRfZXh0X3BibG9jayhpeCk7CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgbV9sYmxrICV1IG1fbGVuICV1ICIKKwkJICAidV9sYmxrICV1IHVfbGVuICV1IHVfcGJsayAlbGx1ICIKKwkJICAiaV9sYmxrICV1IGlfbGVuICV1IGlfcGJsayAlbGx1ICIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgIF9fZW50cnktPm1fbGJsaywgX19lbnRyeS0+bV9sZW4sCisJCSAgX19lbnRyeS0+dV9sYmxrLCBfX2VudHJ5LT51X2xlbiwgX19lbnRyeS0+dV9wYmxrLAorCQkgIF9fZW50cnktPmlfbGJsaywgX19lbnRyeS0+aV9sZW4sIF9fZW50cnktPmlfcGJsaykKKyk7CisKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoZXh0NF9fbWFwX2Jsb2Nrc19lbnRlciwKIAlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLAogCQkgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKSwKQEAgLTE1ODksNiArMTY3OSwzODIgQEAKIAlUUF9BUkdTKHNiLCBncm91cCwgc3RhcnQsIGxlbikKICk7CiAKK1RSQUNFX0VWRU5UKGV4dDRfZXh0X2hhbmRsZV91bmluaXRpYWxpemVkX2V4dGVudHMsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAorCQkgdW5zaWduZWQgaW50IGFsbG9jYXRlZCwgZXh0NF9mc2Jsa190IG5ld2Jsb2NrKSwKKworCVRQX0FSR1MoaW5vZGUsIG1hcCwgYWxsb2NhdGVkLCBuZXdibG9jayksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbm9fdCwJCWlubwkJKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkJKQorCQlfX2ZpZWxkKAlleHQ0X2ZzYmxrX3QsCXBibGsJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlsZW4JCSkKKwkJX19maWVsZCgJaW50LAkJZmxhZ3MJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlhbGxvY2F0ZWQJKQorCQlfX2ZpZWxkKAlleHQ0X2ZzYmxrX3QsCW5ld2JsawkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bGJsawkJPSBtYXAtPm1fbGJsazsKKwkJX19lbnRyeS0+cGJsawkJPSBtYXAtPm1fcGJsazsKKwkJX19lbnRyeS0+bGVuCQk9IG1hcC0+bV9sZW47CisJCV9fZW50cnktPmZsYWdzCQk9IG1hcC0+bV9mbGFnczsKKwkJX19lbnRyeS0+YWxsb2NhdGVkCT0gYWxsb2NhdGVkOworCQlfX2VudHJ5LT5uZXdibGsJCT0gbmV3YmxvY2s7CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgbV9sYmxrICV1IG1fcGJsayAlbGx1IG1fbGVuICV1IGZsYWdzICVkIgorCQkgICJhbGxvY2F0ZWQgJWQgbmV3YmxvY2sgJWxsdSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+bGJsaywgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cGJsaywKKwkJICBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmZsYWdzLAorCQkgICh1bnNpZ25lZCBpbnQpIF9fZW50cnktPmFsbG9jYXRlZCwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5uZXdibGspCispOworCitUUkFDRV9FVkVOVChleHQ0X2dldF9pbXBsaWVkX2NsdXN0ZXJfYWxsb2NfZXhpdCwKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsIGludCByZXQpLAorCisJVFBfQVJHUyhzYiwgbWFwLCByZXQpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkpCisJCV9fZmllbGQoCWV4dDRfZnNibGtfdCwJcGJsawkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJbGVuCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlmbGFncwkpCisJCV9fZmllbGQoCWludCwJCXJldAkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJPSBzYi0+c19kZXY7CisJCV9fZW50cnktPmxibGsJPSBtYXAtPm1fbGJsazsKKwkJX19lbnRyeS0+cGJsawk9IG1hcC0+bV9wYmxrOworCQlfX2VudHJ5LT5sZW4JPSBtYXAtPm1fbGVuOworCQlfX2VudHJ5LT5mbGFncwk9IG1hcC0+bV9mbGFnczsKKwkJX19lbnRyeS0+cmV0CT0gcmV0OworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBtX2xibGsgJXUgbV9wYmxrICVsbHUgbV9sZW4gJXUgbV9mbGFncyAldSByZXQgJWQiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+bGJsaywgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cGJsaywKKwkJICBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmZsYWdzLCBfX2VudHJ5LT5yZXQpCispOworCitUUkFDRV9FVkVOVChleHQ0X2V4dF9wdXRfaW5fY2FjaGUsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsaywgdW5zaWduZWQgaW50IGxlbiwKKwkJIGV4dDRfZnNibGtfdCBzdGFydCksCisKKwlUUF9BUkdTKGlub2RlLCBsYmxrLCBsZW4sIHN0YXJ0KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCSkKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJbGVuCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAlzdGFydAkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pbm8JPSBpbm9kZS0+aV9pbm87CisJCV9fZW50cnktPmRldgk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bGJsawk9IGxibGs7CisJCV9fZW50cnktPmxlbgk9IGxlbjsKKwkJX19lbnRyeS0+c3RhcnQJPSBzdGFydDsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBsYmxrICV1IGxlbiAldSBzdGFydCAlbGx1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5sYmxrLAorCQkgIF9fZW50cnktPmxlbiwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5zdGFydCkKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZXh0X2luX2NhY2hlLAorCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxibGssIGludCByZXQpLAorCisJVFBfQVJHUyhpbm9kZSwgbGJsaywgcmV0KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCSkKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkpCisJCV9fZmllbGQoCWludCwJCXJldAkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pbm8JPSBpbm9kZS0+aV9pbm87CisJCV9fZW50cnktPmRldgk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bGJsawk9IGxibGs7CisJCV9fZW50cnktPnJldAk9IHJldDsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBsYmxrICV1IHJldCAlZCIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+bGJsaywKKwkJICBfX2VudHJ5LT5yZXQpCisKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZmluZF9kZWxhbGxvY19yYW5nZSwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBmcm9tLCBleHQ0X2xibGtfdCB0bywKKwkJaW50IHJldmVyc2UsIGludCBmb3VuZCwgZXh0NF9sYmxrX3QgZm91bmRfYmxrKSwKKworCVRQX0FSR1MoaW5vZGUsIGZyb20sIHRvLCByZXZlcnNlLCBmb3VuZCwgZm91bmRfYmxrKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCQkpCisJCV9fZmllbGQoCWRldl90LAkJZGV2CQkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlmcm9tCQkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAl0bwkJKQorCQlfX2ZpZWxkKAlpbnQsCQlyZXZlcnNlCQkpCisJCV9fZmllbGQoCWludCwJCWZvdW5kCQkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlmb3VuZF9ibGsJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+ZnJvbQkJPSBmcm9tOworCQlfX2VudHJ5LT50bwkJPSB0bzsKKwkJX19lbnRyeS0+cmV2ZXJzZQk9IHJldmVyc2U7CisJCV9fZW50cnktPmZvdW5kCQk9IGZvdW5kOworCQlfX2VudHJ5LT5mb3VuZF9ibGsJPSBmb3VuZF9ibGs7CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgZnJvbSAldSB0byAldSByZXZlcnNlICVkIGZvdW5kICVkICIKKwkJICAiKGJsayA9ICV1KSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+ZnJvbSwgKHVuc2lnbmVkKSBfX2VudHJ5LT50bywKKwkJICBfX2VudHJ5LT5yZXZlcnNlLCBfX2VudHJ5LT5mb3VuZCwKKwkJICAodW5zaWduZWQpIF9fZW50cnktPmZvdW5kX2JsaykKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZ2V0X3Jlc2VydmVkX2NsdXN0ZXJfYWxsb2MsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsaywgdW5zaWduZWQgaW50IGxlbiksCisKKwlUUF9BUkdTKGlub2RlLCBsYmxrLCBsZW4pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlsYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlsZW4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCT0gaW5vZGUtPmlfaW5vOworCQlfX2VudHJ5LT5kZXYJPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPmxibGsJPSBsYmxrOworCQlfX2VudHJ5LT5sZW4JPSBsZW47CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgbGJsayAldSBsZW4gJXUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICAodW5zaWduZWQpIF9fZW50cnktPmxibGssCisJCSAgX19lbnRyeS0+bGVuKQorKTsKKworVFJBQ0VfRVZFTlQoZXh0NF9leHRfc2hvd19leHRlbnQsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsaywgZXh0NF9mc2Jsa190IHBibGssCisJCSB1bnNpZ25lZCBzaG9ydCBsZW4pLAorCisJVFBfQVJHUyhpbm9kZSwgbGJsaywgcGJsaywgbGVuKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCSkKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkpCisJCV9fZmllbGQoCWV4dDRfZnNibGtfdCwJcGJsawkpCisJCV9fZmllbGQoCXVuc2lnbmVkIHNob3J0LAlsZW4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCT0gaW5vZGUtPmlfaW5vOworCQlfX2VudHJ5LT5kZXYJPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPmxibGsJPSBsYmxrOworCQlfX2VudHJ5LT5wYmxrCT0gcGJsazsKKwkJX19lbnRyeS0+bGVuCT0gbGVuOworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGxibGsgJXUgcGJsayAlbGx1IGxlbiAldSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+bGJsaywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wYmxrLAorCQkgICh1bnNpZ25lZCBzaG9ydCkgX19lbnRyeS0+bGVuKQorKTsKKworVFJBQ0VfRVZFTlQoZXh0NF9yZW1vdmVfYmxvY2tzLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LAorCQlleHQ0X2xibGtfdCBmcm9tLCBleHQ0X2ZzYmxrX3QgdG8sCisJCWV4dDRfZnNibGtfdCBwYXJ0aWFsX2NsdXN0ZXIpLAorCisJVFBfQVJHUyhpbm9kZSwgZXgsIGZyb20sIHRvLCBwYXJ0aWFsX2NsdXN0ZXIpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAllZV9sYmxrCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAllZV9wYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQgc2hvcnQsCWVlX2xlbgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlmcm9tCSkKKwkJX19maWVsZCgJZXh0NF9sYmxrX3QsCXRvCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAlwYXJ0aWFsCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlubwkJPSBpbm9kZS0+aV9pbm87CisJCV9fZW50cnktPmRldgkJPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPmVlX2xibGsJPSBjcHVfdG9fbGUzMihleC0+ZWVfYmxvY2spOworCQlfX2VudHJ5LT5lZV9wYmxrCT0gZXh0NF9leHRfcGJsb2NrKGV4KTsKKwkJX19lbnRyeS0+ZWVfbGVuCQk9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKKwkJX19lbnRyeS0+ZnJvbQkJPSBmcm9tOworCQlfX2VudHJ5LT50bwkJPSB0bzsKKwkJX19lbnRyeS0+cGFydGlhbAk9IHBhcnRpYWxfY2x1c3RlcjsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBleHRlbnQgWyV1KCVsbHUpLCAldV0iCisJCSAgImZyb20gJXUgdG8gJXUgcGFydGlhbF9jbHVzdGVyICV1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5lZV9sYmxrLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmVlX3BibGssCisJCSAgKHVuc2lnbmVkIHNob3J0KSBfX2VudHJ5LT5lZV9sZW4sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5mcm9tLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+dG8sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5wYXJ0aWFsKQorKTsKKworVFJBQ0VfRVZFTlQoZXh0NF9leHRfcm1fbGVhZiwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCwKKwkJIHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsIGV4dDRfZnNibGtfdCBwYXJ0aWFsX2NsdXN0ZXIpLAorCisJVFBfQVJHUyhpbm9kZSwgc3RhcnQsIGV4LCBwYXJ0aWFsX2NsdXN0ZXIpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlzdGFydAkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAllZV9sYmxrCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAllZV9wYmxrCSkKKwkJX19maWVsZCgJc2hvcnQsCQllZV9sZW4JKQorCQlfX2ZpZWxkKAlleHQ0X2ZzYmxrX3QsCXBhcnRpYWwJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+c3RhcnQJCT0gc3RhcnQ7CisJCV9fZW50cnktPmVlX2xibGsJPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOworCQlfX2VudHJ5LT5lZV9wYmxrCT0gZXh0NF9leHRfcGJsb2NrKGV4KTsKKwkJX19lbnRyeS0+ZWVfbGVuCQk9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKKwkJX19lbnRyeS0+cGFydGlhbAk9IHBhcnRpYWxfY2x1c3RlcjsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBzdGFydF9sYmxrICV1IGxhc3RfZXh0ZW50IFsldSglbGx1KSwgJXVdIgorCQkgICJwYXJ0aWFsX2NsdXN0ZXIgJXUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICAodW5zaWduZWQpIF9fZW50cnktPnN0YXJ0LAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+ZWVfbGJsaywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5lZV9wYmxrLAorCQkgICh1bnNpZ25lZCBzaG9ydCkgX19lbnRyeS0+ZWVfbGVuLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+cGFydGlhbCkKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZXh0X3JtX2lkeCwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2ZzYmxrX3QgcGJsayksCisKKwlUUF9BUkdTKGlub2RlLCBwYmxrKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCSkKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2ZzYmxrX3QsCXBibGsJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCT0gaW5vZGUtPmlfaW5vOworCQlfX2VudHJ5LT5kZXYJPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPnBibGsJPSBwYmxrOworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGluZGV4X3BibGsgJWxsdSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBibGspCispOworCitUUkFDRV9FVkVOVChleHQ0X2V4dF9yZW1vdmVfc3BhY2UsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsIGludCBkZXB0aCksCisKKwlUUF9BUkdTKGlub2RlLCBzdGFydCwgZGVwdGgpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlzdGFydAkpCisJCV9fZmllbGQoCWludCwJCWRlcHRoCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlubwk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CT0gaW5vZGUtPmlfc2ItPnNfZGV2OworCQlfX2VudHJ5LT5zdGFydAk9IHN0YXJ0OworCQlfX2VudHJ5LT5kZXB0aAk9IGRlcHRoOworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHNpbmNlICV1IGRlcHRoICVkIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5zdGFydCwKKwkJICBfX2VudHJ5LT5kZXB0aCkKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZXh0X3JlbW92ZV9zcGFjZV9kb25lLAorCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LCBpbnQgZGVwdGgsCisJCWV4dDRfbGJsa190IHBhcnRpYWwsIHVuc2lnbmVkIHNob3J0IGVoX2VudHJpZXMpLAorCisJVFBfQVJHUyhpbm9kZSwgc3RhcnQsIGRlcHRoLCBwYXJ0aWFsLCBlaF9lbnRyaWVzKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCQkpCisJCV9fZmllbGQoCWRldl90LAkJZGV2CQkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlzdGFydAkJKQorCQlfX2ZpZWxkKAlpbnQsCQlkZXB0aAkJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJcGFydGlhbAkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBzaG9ydCwJZWhfZW50cmllcwkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pbm8JCT0gaW5vZGUtPmlfaW5vOworCQlfX2VudHJ5LT5kZXYJCT0gaW5vZGUtPmlfc2ItPnNfZGV2OworCQlfX2VudHJ5LT5zdGFydAkJPSBzdGFydDsKKwkJX19lbnRyeS0+ZGVwdGgJCT0gZGVwdGg7CisJCV9fZW50cnktPnBhcnRpYWwJPSBwYXJ0aWFsOworCQlfX2VudHJ5LT5laF9lbnRyaWVzCT0gZWhfZW50cmllczsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBzaW5jZSAldSBkZXB0aCAlZCBwYXJ0aWFsICV1ICIKKwkJICAicmVtYWluaW5nX2VudHJpZXMgJXUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICAodW5zaWduZWQpIF9fZW50cnktPnN0YXJ0LAorCQkgIF9fZW50cnktPmRlcHRoLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+cGFydGlhbCwKKwkJICAodW5zaWduZWQgc2hvcnQpIF9fZW50cnktPmVoX2VudHJpZXMpCispOworCiAjZW5kaWYgLyogX1RSQUNFX0VYVDRfSCAqLwogCiAvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21vZHVsZS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbW9kdWxlLmgKaW5kZXggMjFhNTQ2ZC4uMTYxOTMyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbW9kdWxlLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogQmVjYXVzZSBsaW51eC9tb2R1bGUuaCBoYXMgdHJhY2Vwb2ludHMgaW4gdGhlIGhlYWRlciwgYW5kIGZ0cmFjZS5oCi0gKiBldmVudHVhbGx5IGluY2x1ZGVzIHRoaXMgZmlsZSwgZGVmaW5lX3RyYWNlLmggaW5jbHVkZXMgbGludXgvbW9kdWxlLmgKKyAqIHVzZWQgdG8gaW5jbHVkZSB0aGlzIGZpbGUsIGRlZmluZV90cmFjZS5oIGluY2x1ZGVzIGxpbnV4L21vZHVsZS5oCiAgKiBCdXQgd2UgZG8gbm90IHdhbnQgdGhlIG1vZHVsZS5oIHRvIG92ZXJyaWRlIHRoZSBUUkFDRV9TWVNURU0gbWFjcm8KICAqIHZhcmlhYmxlIHRoYXQgZGVmaW5lX3RyYWNlLmggaXMgcHJvY2Vzc2luZywgc28gd2Ugb25seSBzZXQgaXQKICAqIHdoZW4gbW9kdWxlIGV2ZW50cyBhcmUgYmVpbmcgcHJvY2Vzc2VkLCB3aGljaCB3b3VsZCBoYXBwZW4gd2hlbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvdm1zY2FuLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAppbmRleCAzNjg1MWY3Li5lZGM0YjNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaApAQCAtMjY2LDcgKzI2Niw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfdGFrZW4sCiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfZGlydHksCiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfZmFpbGVkLAotCQlpbnQgaXNvbGF0ZV9tb2RlKSwKKwkJaXNvbGF0ZV9tb2RlX3QgaXNvbGF0ZV9tb2RlKSwKIAogCVRQX0FSR1Mob3JkZXIsIG5yX3JlcXVlc3RlZCwgbnJfc2Nhbm5lZCwgbnJfdGFrZW4sIG5yX2x1bXB5X3Rha2VuLCBucl9sdW1weV9kaXJ0eSwgbnJfbHVtcHlfZmFpbGVkLCBpc29sYXRlX21vZGUpLAogCkBAIC0yNzgsNyArMjc4LDcgQEAKIAkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9sdW1weV90YWtlbikKIAkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9sdW1weV9kaXJ0eSkKIAkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9sdW1weV9mYWlsZWQpCi0JCV9fZmllbGQoaW50LCBpc29sYXRlX21vZGUpCisJCV9fZmllbGQoaXNvbGF0ZV9tb2RlX3QsIGlzb2xhdGVfbW9kZSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkJdW5zaWduZWQgbG9uZyBucl9sdW1weV90YWtlbiwKIAkJdW5zaWduZWQgbG9uZyBucl9sdW1weV9kaXJ0eSwKIAkJdW5zaWduZWQgbG9uZyBucl9sdW1weV9mYWlsZWQsCi0JCWludCBpc29sYXRlX21vZGUpLAorCQlpc29sYXRlX21vZGVfdCBpc29sYXRlX21vZGUpLAogCiAJVFBfQVJHUyhvcmRlciwgbnJfcmVxdWVzdGVkLCBucl9zY2FubmVkLCBucl90YWtlbiwgbnJfbHVtcHlfdGFrZW4sIG5yX2x1bXB5X2RpcnR5LCBucl9sdW1weV9mYWlsZWQsIGlzb2xhdGVfbW9kZSkKIApAQCAtMzI3LDcgKzMyNyw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfdGFrZW4sCiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfZGlydHksCiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfZmFpbGVkLAotCQlpbnQgaXNvbGF0ZV9tb2RlKSwKKwkJaXNvbGF0ZV9tb2RlX3QgaXNvbGF0ZV9tb2RlKSwKIAogCVRQX0FSR1Mob3JkZXIsIG5yX3JlcXVlc3RlZCwgbnJfc2Nhbm5lZCwgbnJfdGFrZW4sIG5yX2x1bXB5X3Rha2VuLCBucl9sdW1weV9kaXJ0eSwgbnJfbHVtcHlfZmFpbGVkLCBpc29sYXRlX21vZGUpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dyaXRlYmFjay5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvd3JpdGViYWNrLmgKaW5kZXggNWYxNzI3MC4uYjk5Y2FhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvd3JpdGViYWNrLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvd3JpdGViYWNrLmgKQEAgLTM0LDYgKzM0LDcgQEAKIAkJX19maWVsZChpbnQsIGZvcl9rdXBkYXRlKQogCQlfX2ZpZWxkKGludCwgcmFuZ2VfY3ljbGljKQogCQlfX2ZpZWxkKGludCwgZm9yX2JhY2tncm91bmQpCisJCV9fZmllbGQoaW50LCByZWFzb24pCiAJKSwKIAlUUF9mYXN0X2Fzc2lnbigKIAkJc3RybmNweShfX2VudHJ5LT5uYW1lLCBkZXZfbmFtZShiZGktPmRldiksIDMyKTsKQEAgLTQzLDE2ICs0NCwxOCBAQAogCQlfX2VudHJ5LT5mb3Jfa3VwZGF0ZSA9IHdvcmstPmZvcl9rdXBkYXRlOwogCQlfX2VudHJ5LT5yYW5nZV9jeWNsaWMgPSB3b3JrLT5yYW5nZV9jeWNsaWM7CiAJCV9fZW50cnktPmZvcl9iYWNrZ3JvdW5kCT0gd29yay0+Zm9yX2JhY2tncm91bmQ7CisJCV9fZW50cnktPnJlYXNvbiA9IHdvcmstPnJlYXNvbjsKIAkpLAogCVRQX3ByaW50aygiYmRpICVzOiBzYl9kZXYgJWQ6JWQgbnJfcGFnZXM9JWxkIHN5bmNfbW9kZT0lZCAiCi0JCSAgImt1cGRhdGU9JWQgcmFuZ2VfY3ljbGljPSVkIGJhY2tncm91bmQ9JWQiLAorCQkgICJrdXBkYXRlPSVkIHJhbmdlX2N5Y2xpYz0lZCBiYWNrZ3JvdW5kPSVkIHJlYXNvbj0lcyIsCiAJCSAgX19lbnRyeS0+bmFtZSwKIAkJICBNQUpPUihfX2VudHJ5LT5zYl9kZXYpLCBNSU5PUihfX2VudHJ5LT5zYl9kZXYpLAogCQkgIF9fZW50cnktPm5yX3BhZ2VzLAogCQkgIF9fZW50cnktPnN5bmNfbW9kZSwKIAkJICBfX2VudHJ5LT5mb3Jfa3VwZGF0ZSwKIAkJICBfX2VudHJ5LT5yYW5nZV9jeWNsaWMsCi0JCSAgX19lbnRyeS0+Zm9yX2JhY2tncm91bmQKKwkJICBfX2VudHJ5LT5mb3JfYmFja2dyb3VuZCwKKwkJICB3Yl9yZWFzb25fbmFtZVtfX2VudHJ5LT5yZWFzb25dCiAJKQogKTsKICNkZWZpbmUgREVGSU5FX1dSSVRFQkFDS19XT1JLX0VWRU5UKG5hbWUpIFwKQEAgLTEwNCwzMCArMTA3LDYgQEAKIERFRklORV9XUklURUJBQ0tfRVZFTlQod3JpdGViYWNrX2JkaV91bnJlZ2lzdGVyKTsKIERFRklORV9XUklURUJBQ0tfRVZFTlQod3JpdGViYWNrX3RocmVhZF9zdGFydCk7CiBERUZJTkVfV1JJVEVCQUNLX0VWRU5UKHdyaXRlYmFja190aHJlYWRfc3RvcCk7Ci1ERUZJTkVfV1JJVEVCQUNLX0VWRU5UKGJhbGFuY2VfZGlydHlfc3RhcnQpOwotREVGSU5FX1dSSVRFQkFDS19FVkVOVChiYWxhbmNlX2RpcnR5X3dhaXQpOwotCi1UUkFDRV9FVkVOVChiYWxhbmNlX2RpcnR5X3dyaXR0ZW4sCi0KLQlUUF9QUk9UTyhzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgd3JpdHRlbiksCi0KLQlUUF9BUkdTKGJkaSwgd3JpdHRlbiksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2FycmF5KGNoYXIsCW5hbWUsIDMyKQotCQlfX2ZpZWxkKGludCwJd3JpdHRlbikKLQkpLAotCi0JVFBfZmFzdF9hc3NpZ24oCi0JCXN0cm5jcHkoX19lbnRyeS0+bmFtZSwgZGV2X25hbWUoYmRpLT5kZXYpLCAzMik7Ci0JCV9fZW50cnktPndyaXR0ZW4gPSB3cml0dGVuOwotCSksCi0KLQlUUF9wcmludGsoImJkaSAlcyB3cml0dGVuICVkIiwKLQkJICBfX2VudHJ5LT5uYW1lLAotCQkgIF9fZW50cnktPndyaXR0ZW4KLQkpCi0pOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKHdiY19jbGFzcywKIAlUUF9QUk9UTyhzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSksCkBAIC0xODEsMjcgKzE2MCwzMSBAQAogCiBUUkFDRV9FVkVOVCh3cml0ZWJhY2tfcXVldWVfaW8sCiAJVFBfUFJPVE8oc3RydWN0IGJkaV93cml0ZWJhY2sgKndiLAotCQkgdW5zaWduZWQgbG9uZyAqb2xkZXJfdGhhbl90aGlzLAorCQkgc3RydWN0IHdiX3dyaXRlYmFja193b3JrICp3b3JrLAogCQkgaW50IG1vdmVkKSwKLQlUUF9BUkdTKHdiLCBvbGRlcl90aGFuX3RoaXMsIG1vdmVkKSwKKwlUUF9BUkdTKHdiLCB3b3JrLCBtb3ZlZCksCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19hcnJheShjaGFyLAkJbmFtZSwgMzIpCiAJCV9fZmllbGQodW5zaWduZWQgbG9uZywJb2xkZXIpCiAJCV9fZmllbGQobG9uZywJCWFnZSkKIAkJX19maWVsZChpbnQsCQltb3ZlZCkKKwkJX19maWVsZChpbnQsCQlyZWFzb24pCiAJKSwKIAlUUF9mYXN0X2Fzc2lnbigKKwkJdW5zaWduZWQgbG9uZyAqb2xkZXJfdGhhbl90aGlzID0gd29yay0+b2xkZXJfdGhhbl90aGlzOwogCQlzdHJuY3B5KF9fZW50cnktPm5hbWUsIGRldl9uYW1lKHdiLT5iZGktPmRldiksIDMyKTsKIAkJX19lbnRyeS0+b2xkZXIJPSBvbGRlcl90aGFuX3RoaXMgPyAgKm9sZGVyX3RoYW5fdGhpcyA6IDA7CiAJCV9fZW50cnktPmFnZQk9IG9sZGVyX3RoYW5fdGhpcyA/CiAJCQkJICAoamlmZmllcyAtICpvbGRlcl90aGFuX3RoaXMpICogMTAwMCAvIEhaIDogLTE7CiAJCV9fZW50cnktPm1vdmVkCT0gbW92ZWQ7CisJCV9fZW50cnktPnJlYXNvbgk9IHdvcmstPnJlYXNvbjsKIAkpLAotCVRQX3ByaW50aygiYmRpICVzOiBvbGRlcj0lbHUgYWdlPSVsZCBlbnF1ZXVlPSVkIiwKKwlUUF9wcmludGsoImJkaSAlczogb2xkZXI9JWx1IGFnZT0lbGQgZW5xdWV1ZT0lZCByZWFzb249JXMiLAogCQlfX2VudHJ5LT5uYW1lLAogCQlfX2VudHJ5LT5vbGRlciwJLyogb2xkZXJfdGhhbl90aGlzIGluIGppZmZpZXMgKi8KIAkJX19lbnRyeS0+YWdlLAkvKiBvbGRlcl90aGFuX3RoaXMgaW4gcmVsYXRpdmUgbWlsbGlzZWNvbmRzICovCi0JCV9fZW50cnktPm1vdmVkKQorCQlfX2VudHJ5LT5tb3ZlZCwKKwkJd2JfcmVhc29uX25hbWVbX19lbnRyeS0+cmVhc29uXSkKICk7CiAKIFRSQUNFX0VWRU5UKGdsb2JhbF9kaXJ0eV9zdGF0ZSwKQEAgLTI1MCw2ICsyMzMsMTI0IEBACiAJKQogKTsKIAorI2RlZmluZSBLQnBzKHgpCQkJKCh4KSA8PCAoUEFHRV9TSElGVCAtIDEwKSkKKworVFJBQ0VfRVZFTlQoYmRpX2RpcnR5X3JhdGVsaW1pdCwKKworCVRQX1BST1RPKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCisJCSB1bnNpZ25lZCBsb25nIGRpcnR5X3JhdGUsCisJCSB1bnNpZ25lZCBsb25nIHRhc2tfcmF0ZWxpbWl0KSwKKworCVRQX0FSR1MoYmRpLCBkaXJ0eV9yYXRlLCB0YXNrX3JhdGVsaW1pdCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2FycmF5KGNoYXIsCQliZGksIDMyKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCXdyaXRlX2J3KQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCWF2Z193cml0ZV9idykKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAlkaXJ0eV9yYXRlKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCWRpcnR5X3JhdGVsaW1pdCkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAl0YXNrX3JhdGVsaW1pdCkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAliYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlzdHJsY3B5KF9fZW50cnktPmJkaSwgZGV2X25hbWUoYmRpLT5kZXYpLCAzMik7CisJCV9fZW50cnktPndyaXRlX2J3CT0gS0JwcyhiZGktPndyaXRlX2JhbmR3aWR0aCk7CisJCV9fZW50cnktPmF2Z193cml0ZV9idwk9IEtCcHMoYmRpLT5hdmdfd3JpdGVfYmFuZHdpZHRoKTsKKwkJX19lbnRyeS0+ZGlydHlfcmF0ZQk9IEtCcHMoZGlydHlfcmF0ZSk7CisJCV9fZW50cnktPmRpcnR5X3JhdGVsaW1pdCA9IEtCcHMoYmRpLT5kaXJ0eV9yYXRlbGltaXQpOworCQlfX2VudHJ5LT50YXNrX3JhdGVsaW1pdAk9IEtCcHModGFza19yYXRlbGltaXQpOworCQlfX2VudHJ5LT5iYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQgPQorCQkJCQkgIEtCcHMoYmRpLT5iYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQpOworCSksCisKKwlUUF9wcmludGsoImJkaSAlczogIgorCQkgICJ3cml0ZV9idz0lbHUgYXdyaXRlX2J3PSVsdSBkaXJ0eV9yYXRlPSVsdSAiCisJCSAgImRpcnR5X3JhdGVsaW1pdD0lbHUgdGFza19yYXRlbGltaXQ9JWx1ICIKKwkJICAiYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0PSVsdSIsCisJCSAgX19lbnRyeS0+YmRpLAorCQkgIF9fZW50cnktPndyaXRlX2J3LAkJLyogd3JpdGUgYmFuZHdpZHRoICovCisJCSAgX19lbnRyeS0+YXZnX3dyaXRlX2J3LAkvKiBhdmcgd3JpdGUgYmFuZHdpZHRoICovCisJCSAgX19lbnRyeS0+ZGlydHlfcmF0ZSwJCS8qIGJkaSBkaXJ0eSByYXRlICovCisJCSAgX19lbnRyeS0+ZGlydHlfcmF0ZWxpbWl0LAkvKiBiYXNlIHJhdGVsaW1pdCAqLworCQkgIF9fZW50cnktPnRhc2tfcmF0ZWxpbWl0LCAvKiByYXRlbGltaXQgd2l0aCBwb3NpdGlvbiBjb250cm9sICovCisJCSAgX19lbnRyeS0+YmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0IC8qIHRoZSBiYWxhbmNlZCByYXRlbGltaXQgKi8KKwkpCispOworCitUUkFDRV9FVkVOVChiYWxhbmNlX2RpcnR5X3BhZ2VzLAorCisJVFBfUFJPVE8oc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKKwkJIHVuc2lnbmVkIGxvbmcgdGhyZXNoLAorCQkgdW5zaWduZWQgbG9uZyBiZ190aHJlc2gsCisJCSB1bnNpZ25lZCBsb25nIGRpcnR5LAorCQkgdW5zaWduZWQgbG9uZyBiZGlfdGhyZXNoLAorCQkgdW5zaWduZWQgbG9uZyBiZGlfZGlydHksCisJCSB1bnNpZ25lZCBsb25nIGRpcnR5X3JhdGVsaW1pdCwKKwkJIHVuc2lnbmVkIGxvbmcgdGFza19yYXRlbGltaXQsCisJCSB1bnNpZ25lZCBsb25nIGRpcnRpZWQsCisJCSBsb25nIHBhdXNlLAorCQkgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKSwKKworCVRQX0FSR1MoYmRpLCB0aHJlc2gsIGJnX3RocmVzaCwgZGlydHksIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwKKwkJZGlydHlfcmF0ZWxpbWl0LCB0YXNrX3JhdGVsaW1pdCwKKwkJZGlydGllZCwgcGF1c2UsIHN0YXJ0X3RpbWUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19hcnJheSgJIGNoYXIsCWJkaSwgMzIpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJbGltaXQpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJc2V0cG9pbnQpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJZGlydHkpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJYmRpX3NldHBvaW50KQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCWJkaV9kaXJ0eSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAlkaXJ0eV9yYXRlbGltaXQpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJdGFza19yYXRlbGltaXQpCisJCV9fZmllbGQodW5zaWduZWQgaW50LAlkaXJ0aWVkKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGludCwJZGlydGllZF9wYXVzZSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAlwYXVzZWQpCisJCV9fZmllbGQoCSBsb25nLAlwYXVzZSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCXVuc2lnbmVkIGxvbmcgZnJlZXJ1biA9ICh0aHJlc2ggKyBiZ190aHJlc2gpIC8gMjsKKwkJc3RybGNweShfX2VudHJ5LT5iZGksIGRldl9uYW1lKGJkaS0+ZGV2KSwgMzIpOworCisJCV9fZW50cnktPmxpbWl0CQk9IGdsb2JhbF9kaXJ0eV9saW1pdDsKKwkJX19lbnRyeS0+c2V0cG9pbnQJPSAoZ2xvYmFsX2RpcnR5X2xpbWl0ICsgZnJlZXJ1bikgLyAyOworCQlfX2VudHJ5LT5kaXJ0eQkJPSBkaXJ0eTsKKwkJX19lbnRyeS0+YmRpX3NldHBvaW50CT0gX19lbnRyeS0+c2V0cG9pbnQgKgorCQkJCQkJYmRpX3RocmVzaCAvICh0aHJlc2ggKyAxKTsKKwkJX19lbnRyeS0+YmRpX2RpcnR5CT0gYmRpX2RpcnR5OworCQlfX2VudHJ5LT5kaXJ0eV9yYXRlbGltaXQgPSBLQnBzKGRpcnR5X3JhdGVsaW1pdCk7CisJCV9fZW50cnktPnRhc2tfcmF0ZWxpbWl0CT0gS0Jwcyh0YXNrX3JhdGVsaW1pdCk7CisJCV9fZW50cnktPmRpcnRpZWQJPSBkaXJ0aWVkOworCQlfX2VudHJ5LT5kaXJ0aWVkX3BhdXNlCT0gY3VycmVudC0+bnJfZGlydGllZF9wYXVzZTsKKwkJX19lbnRyeS0+cGF1c2UJCT0gcGF1c2UgKiAxMDAwIC8gSFo7CisJCV9fZW50cnktPnBhdXNlZAkJPSAoamlmZmllcyAtIHN0YXJ0X3RpbWUpICogMTAwMCAvIEhaOworCSksCisKKworCVRQX3ByaW50aygiYmRpICVzOiAiCisJCSAgImxpbWl0PSVsdSBzZXRwb2ludD0lbHUgZGlydHk9JWx1ICIKKwkJICAiYmRpX3NldHBvaW50PSVsdSBiZGlfZGlydHk9JWx1ICIKKwkJICAiZGlydHlfcmF0ZWxpbWl0PSVsdSB0YXNrX3JhdGVsaW1pdD0lbHUgIgorCQkgICJkaXJ0aWVkPSV1IGRpcnRpZWRfcGF1c2U9JXUgIgorCQkgICJwYXVzZWQ9JWx1IHBhdXNlPSVsZCIsCisJCSAgX19lbnRyeS0+YmRpLAorCQkgIF9fZW50cnktPmxpbWl0LAorCQkgIF9fZW50cnktPnNldHBvaW50LAorCQkgIF9fZW50cnktPmRpcnR5LAorCQkgIF9fZW50cnktPmJkaV9zZXRwb2ludCwKKwkJICBfX2VudHJ5LT5iZGlfZGlydHksCisJCSAgX19lbnRyeS0+ZGlydHlfcmF0ZWxpbWl0LAorCQkgIF9fZW50cnktPnRhc2tfcmF0ZWxpbWl0LAorCQkgIF9fZW50cnktPmRpcnRpZWQsCisJCSAgX19lbnRyeS0+ZGlydGllZF9wYXVzZSwKKwkJICBfX2VudHJ5LT5wYXVzZWQsCS8qIG1zICovCisJCSAgX19lbnRyeS0+cGF1c2UJLyogbXMgKi8KKwkgICkKKyk7CisKIERFQ0xBUkVfRVZFTlRfQ0xBU1Mod3JpdGViYWNrX2Nvbmdlc3Rfd2FpdGVkX3RlbXBsYXRlLAogCiAJVFBfUFJPVE8odW5zaWduZWQgaW50IHVzZWNfdGltZW91dCwgdW5zaWduZWQgaW50IHVzZWNfZGVsYXllZCksCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtZHZpLmggYi9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtZHZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhZDU2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtZHZpLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIEhlYWRlciBmb3IgRFZJIG91dHB1dCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fT01BUF9QQU5FTF9EVklfSAorI2RlZmluZSBfX09NQVBfUEFORUxfRFZJX0gKKworc3RydWN0IG9tYXBfZHNzX2RldmljZTsKKworLyoqCisgKiBzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgLSBwYW5lbCBkcml2ZXIgY29uZmlndXJhdGlvbiBkYXRhCisgKiBAcGxhdGZvcm1fZW5hYmxlOiBwbGF0Zm9ybSBzcGVjaWZpYyBwYW5lbCBlbmFibGUgZnVuY3Rpb24KKyAqIEBwbGF0Zm9ybV9kaXNhYmxlOiBwbGF0Zm9ybSBzcGVjaWZpYyBwYW5lbCBkaXNhYmxlIGZ1bmN0aW9uCisgKiBAaTJjX2J1c19udW06IGkyYyBidXMgaWQgZm9yIHRoZSBwYW5lbAorICovCitzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgeworCWludCAoKnBsYXRmb3JtX2VuYWJsZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKwl2b2lkICgqcGxhdGZvcm1fZGlzYWJsZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKwl1MTYgaTJjX2J1c19udW07Cit9OworCisjZW5kaWYgLyogX19PTUFQX1BBTkVMX0RWSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtbjh4MC5oIGIvaW5jbHVkZS92aWRlby9vbWFwLXBhbmVsLW44eDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGExMzAyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS92aWRlby9vbWFwLXBhbmVsLW44eDAuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9fT01BUF9QQU5FTF9OOFgwX0gKKyNkZWZpbmUgX19PTUFQX1BBTkVMX044WDBfSAorCitzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlOworCitzdHJ1Y3QgcGFuZWxfbjh4MF9kYXRhIHsKKwlpbnQgKCpwbGF0Zm9ybV9lbmFibGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJdm9pZCAoKnBsYXRmb3JtX2Rpc2FibGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJaW50IHBhbmVsX3Jlc2V0OworCWludCBjdHJsX3B3cmRvd247CisKKwlpbnQgKCpzZXRfYmFja2xpZ2h0KShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBsZXZlbCk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vb21hcC1wYW5lbC1ub2tpYS1kc2kuaCBiL2luY2x1ZGUvdmlkZW8vb21hcC1wYW5lbC1ub2tpYS1kc2kuaAppbmRleCA5MjFhZTkzLi43ZGM3MWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtbm9raWEtZHNpLmgKKysrIGIvaW5jbHVkZS92aWRlby9vbWFwLXBhbmVsLW5va2lhLWRzaS5oCkBAIC0xMCw5ICsxMCw3IEBACiAgKiBAZXh0X3RlX2dwaW86IGV4dGVybmFsIFRFIEdQSU8KICAqIEBlc2RfaW50ZXJ2YWw6IGludGVydmFsIG9mIEVTRCBjaGVja3MsIDAgPSBkaXNhYmxlZCAobXMpCiAgKiBAdWxwc190aW1lb3V0OiB0aW1lIHRvIHdhaXQgYmVmb3JlIGVudGVyaW5nIFVMUFMsIDAgPSBkaXNhYmxlZCAobXMpCi0gKiBAbWF4X2JhY2tsaWdodF9sZXZlbDogbWF4aW11bSBiYWNrbGlnaHQgbGV2ZWwKLSAqIEBzZXRfYmFja2xpZ2h0OiBwb2ludGVyIHRvIGJhY2tsaWdodCBzZXQgZnVuY3Rpb24KLSAqIEBnZXRfYmFja2xpZ2h0OiBwb2ludGVyIHRvIGJhY2tsaWdodCBnZXQgZnVuY3Rpb24KKyAqIEB1c2VfZHNpX2JhY2tsaWdodDogdHJ1ZSBpZiBwYW5lbCB1c2VzIERTSSBjb21tYW5kIHRvIGNvbnRyb2wgYmFja2xpZ2h0CiAgKi8KIHN0cnVjdCBub2tpYV9kc2lfcGFuZWxfZGF0YSB7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTI1LDkgKzIzLDcgQEAKIAl1bnNpZ25lZCBlc2RfaW50ZXJ2YWw7CiAJdW5zaWduZWQgdWxwc190aW1lb3V0OwogCi0JaW50IG1heF9iYWNrbGlnaHRfbGV2ZWw7Ci0JaW50ICgqc2V0X2JhY2tsaWdodCkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgbGV2ZWwpOwotCWludCAoKmdldF9iYWNrbGlnaHQpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJYm9vbCB1c2VfZHNpX2JhY2tsaWdodDsKIH07CiAKICNlbmRpZiAvKiBfX09NQVBfTk9LSUFfRFNJX1BBTkVMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vb21hcC1wYW5lbC1waWNvZGxwLmggYi9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtcGljb2RscC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzQyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtcGljb2RscC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBwYW5lbCBkYXRhIGZvciBwaWNvZGxwIHBhbmVsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzCisgKgorICogQXV0aG9yOiBNYXl1cmVzaCBKYW5vcmthciA8bWF5dXJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX19QQU5FTF9QSUNPRExQX0gKKyNkZWZpbmUgX19QQU5FTF9QSUNPRExQX0gKKy8qKgorICogc3RydWN0IDogcGljb2RscCBwYW5lbCBkYXRhCisgKiBwaWNvZGxwX2FkYXB0ZXJfaWQ6CWkyY19hZGFwdGVyIG51bWJlciBmb3IgcGljb2RscAorICovCitzdHJ1Y3QgcGljb2RscF9wYW5lbF9kYXRhIHsKKwlpbnQgcGljb2RscF9hZGFwdGVyX2lkOworCWludCBlbXVfZG9uZV9ncGlvOworCWludCBwd3Jnb29kX2dwaW87Cit9OworI2VuZGlmIC8qIF9fUEFORUxfUElDT0RMUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL29tYXBkc3MuaCBiL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oCmluZGV4IDNiNTVlZjIuLmI2NmViYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oCisrKyBiL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oCkBAIC00MSw4ICs0MSwxMyBAQAogI2RlZmluZSBESVNQQ19JUlFfV0FLRVVQCQkoMSA8PCAxNikKICNkZWZpbmUgRElTUENfSVJRX1NZTkNfTE9TVDIJCSgxIDw8IDE3KQogI2RlZmluZSBESVNQQ19JUlFfVlNZTkMyCQkoMSA8PCAxOCkKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDNfRU5EX1dJTgkJKDEgPDwgMTkpCisjZGVmaW5lIERJU1BDX0lSUV9WSUQzX0ZJRk9fVU5ERVJGTE9XCSgxIDw8IDIwKQogI2RlZmluZSBESVNQQ19JUlFfQUNCSUFTX0NPVU5UX1NUQVQyCSgxIDw8IDIxKQogI2RlZmluZSBESVNQQ19JUlFfRlJBTUVET05FMgkJKDEgPDwgMjIpCisjZGVmaW5lIERJU1BDX0lSUV9GUkFNRURPTkVXQgkJKDEgPDwgMjMpCisjZGVmaW5lIERJU1BDX0lSUV9GUkFNRURPTkVUVgkJKDEgPDwgMjQpCisjZGVmaW5lIERJU1BDX0lSUV9XQkJVRkZFUk9WRVJGTE9XCSgxIDw8IDI1KQogCiBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlOwogc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyOwpAQCAtNjAsNyArNjUsOCBAQAogZW51bSBvbWFwX3BsYW5lIHsKIAlPTUFQX0RTU19HRlgJPSAwLAogCU9NQVBfRFNTX1ZJREVPMQk9IDEsCi0JT01BUF9EU1NfVklERU8yCT0gMgorCU9NQVBfRFNTX1ZJREVPMgk9IDIsCisJT01BUF9EU1NfVklERU8zCT0gMywKIH07CiAKIGVudW0gb21hcF9jaGFubmVsIHsKQEAgLTEyOSw2ICsxMzUsMTggQEAKIAlPTUFQX0RTU19WRU5DX1RZUEVfU1ZJREVPLAogfTsKIAorZW51bSBvbWFwX2Rzc19kc2lfcGl4ZWxfZm9ybWF0IHsKKwlPTUFQX0RTU19EU0lfRk1UX1JHQjg4OCwKKwlPTUFQX0RTU19EU0lfRk1UX1JHQjY2NiwKKwlPTUFQX0RTU19EU0lfRk1UX1JHQjY2Nl9QQUNLRUQsCisJT01BUF9EU1NfRFNJX0ZNVF9SR0I1NjUsCit9OworCitlbnVtIG9tYXBfZHNzX2RzaV9tb2RlIHsKKwlPTUFQX0RTU19EU0lfQ01EX01PREUgPSAwLAorCU9NQVBfRFNTX0RTSV9WSURFT19NT0RFLAorfTsKKwogZW51bSBvbWFwX2Rpc3BsYXlfY2FwcyB7CiAJT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURQk9IDEgPDwgMCwKIAlPTUFQX0RTU19ESVNQTEFZX0NBUF9URUFSX0VMSU0JCT0gMSA8PCAxLApAQCAtMTYyLDExICsxODAsMTMgQEAKIAogZW51bSBvbWFwX292ZXJsYXlfY2FwcyB7CiAJT01BUF9EU1NfT1ZMX0NBUF9TQ0FMRSA9IDEgPDwgMCwKLQlPTUFQX0RTU19PVkxfQ0FQX0RJU1BDID0gMSA8PCAxLAorCU9NQVBfRFNTX09WTF9DQVBfR0xPQkFMX0FMUEhBID0gMSA8PCAxLAorCU9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgPSAxIDw8IDIsCisJT01BUF9EU1NfT1ZMX0NBUF9aT1JERVIgPSAxIDw8IDMsCiB9OwogCiBlbnVtIG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2NhcHMgewotCU9NQVBfRFNTX09WTF9NR1JfQ0FQX0RJU1BDID0gMSA8PCAwLAorCU9NQVBfRFNTX0RVTU1ZX1ZBTFVFLCAvKiBhZGQgYSBkdW1teSB2YWx1ZSB0byBwcmV2ZW50IGNvbXBpbGVyIGVycm9yICovCiB9OwogCiBlbnVtIG9tYXBfZHNzX2Nsa19zb3VyY2UgewpAQCAtMjE1LDI2ICsyMzUsNjcgQEAKIHZvaWQgcmZiaV9idXNfdW5sb2NrKHZvaWQpOwogCiAvKiBEU0kgKi8KKworc3RydWN0IG9tYXBfZHNzX2RzaV92aWRlb21vZGVfZGF0YSB7CisJLyogRFNJIHZpZGVvIG1vZGUgYmxhbmtpbmcgZGF0YSAqLworCS8qIFVuaXQ6IGJ5dGUgY2xvY2sgY3ljbGVzICovCisJdTE2IGhzYTsKKwl1MTYgaGZwOworCXUxNiBoYnA7CisJLyogVW5pdDogbGluZSBjbG9ja3MgKi8KKwl1MTYgdnNhOworCXUxNiB2ZnA7CisJdTE2IHZicDsKKworCS8qIERTSSBibGFua2luZyBtb2RlcyAqLworCWludCBibGFua2luZ19tb2RlOworCWludCBoc2FfYmxhbmtpbmdfbW9kZTsKKwlpbnQgaGJwX2JsYW5raW5nX21vZGU7CisJaW50IGhmcF9ibGFua2luZ19tb2RlOworCisJLyogVmlkZW8gcG9ydCBzeW5jIGV2ZW50cyAqLworCWludCB2cF9kZV9wb2w7CisJaW50IHZwX2hzeW5jX3BvbDsKKwlpbnQgdnBfdnN5bmNfcG9sOworCWJvb2wgdnBfdnN5bmNfZW5kOworCWJvb2wgdnBfaHN5bmNfZW5kOworCisJYm9vbCBkZHJfY2xrX2Fsd2F5c19vbjsKKwlpbnQgd2luZG93X3N5bmM7Cit9OworCiB2b2lkIGRzaV9idXNfbG9jayhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOwogdm9pZCBkc2lfYnVzX3VubG9jayhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOwogaW50IGRzaV92Y19kY3Nfd3JpdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggKmRhdGEsCiAJCWludCBsZW4pOwotaW50IGRzaV92Y19kY3Nfd3JpdGVfMChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLAotCQl1OCBkY3NfY21kKTsKK2ludCBkc2lfdmNfZ2VuZXJpY193cml0ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCAqZGF0YSwKKwkJaW50IGxlbik7CitpbnQgZHNpX3ZjX2Rjc193cml0ZV8wKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4IGRjc19jbWQpOworaW50IGRzaV92Y19nZW5lcmljX3dyaXRlXzAoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCk7CiBpbnQgZHNpX3ZjX2Rjc193cml0ZV8xKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4IGRjc19jbWQsCiAJCXU4IHBhcmFtKTsKK2ludCBkc2lfdmNfZ2VuZXJpY193cml0ZV8xKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4IHBhcmFtKTsKK2ludCBkc2lfdmNfZ2VuZXJpY193cml0ZV8yKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4IHBhcmFtMSwgdTggcGFyYW0yKTsKIGludCBkc2lfdmNfZGNzX3dyaXRlX25vc3luYyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLAogCQl1OCAqZGF0YSwgaW50IGxlbik7CitpbnQgZHNpX3ZjX2dlbmVyaWNfd3JpdGVfbm9zeW5jKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4ICpkYXRhLCBpbnQgbGVuKTsKIGludCBkc2lfdmNfZGNzX3JlYWQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwKIAkJdTggKmJ1ZiwgaW50IGJ1Zmxlbik7Ci1pbnQgZHNpX3ZjX2Rjc19yZWFkXzEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwKLQkJdTggKmRhdGEpOwotaW50IGRzaV92Y19kY3NfcmVhZF8yKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4IGRjc19jbWQsCi0JCXU4ICpkYXRhMSwgdTggKmRhdGEyKTsKK2ludCBkc2lfdmNfZ2VuZXJpY19yZWFkXzAoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggKmJ1ZiwKKwkJaW50IGJ1Zmxlbik7CitpbnQgZHNpX3ZjX2dlbmVyaWNfcmVhZF8xKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4IHBhcmFtLAorCQl1OCAqYnVmLCBpbnQgYnVmbGVuKTsKK2ludCBkc2lfdmNfZ2VuZXJpY19yZWFkXzIoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKKwkJdTggcGFyYW0xLCB1OCBwYXJhbTIsIHU4ICpidWYsIGludCBidWZsZW4pOwogaW50IGRzaV92Y19zZXRfbWF4X3J4X3BhY2tldF9zaXplKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCiAJCXUxNiBsZW4pOwogaW50IGRzaV92Y19zZW5kX251bGwoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCk7CiBpbnQgZHNpX3ZjX3NlbmRfYnRhX3N5bmMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCk7CitpbnQgZHNpX3ZpZGVvX21vZGVfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwpOwordm9pZCBkc2lfdmlkZW9fbW9kZV9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwpOwogCiAvKiBCb2FyZCBzcGVjaWZpYyBkYXRhICovCiBzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyB7CkBAIC0yNDIsNyArMzAzLDggQEAKIAlpbnQgbnVtX2RldmljZXM7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqKmRldmljZXM7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGVmYXVsdF9kZXZpY2U7Ci0Jdm9pZCAoKmRzaV9tdXhfcGFkcykoYm9vbCBlbmFibGUpOworCWludCAoKmRzaV9lbmFibGVfcGFkcykoaW50IGRzaV9pZCwgdW5zaWduZWQgbGFuZV9tYXNrKTsKKwl2b2lkICgqZHNpX2Rpc2FibGVfcGFkcykoaW50IGRzaV9pZCwgdW5zaWduZWQgbGFuZV9tYXNrKTsKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQMl9EU1NfTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQMl9EU1MpCkBAIC0zMDAsNyArMzYyLDYgQEAKIAlib29sIGVuYWJsZWQ7CiAKIAl1MzIgcGFkZHI7Ci0Jdm9pZCBfX2lvbWVtICp2YWRkcjsKIAl1MzIgcF91dl9hZGRyOyAgLyogZm9yIE5WMTIgZm9ybWF0ICovCiAJdTE2IHNjcmVlbl93aWR0aDsKIAl1MTYgd2lkdGg7CkBAIC0zMTYsNiArMzc3LDcgQEAKIAl1MTYgb3V0X2hlaWdodDsJLyogaWYgMCwgb3V0X2hlaWdodCA9PSBoZWlnaHQgKi8KIAl1OCBnbG9iYWxfYWxwaGE7CiAJdTggcHJlX211bHRfYWxwaGE7CisJdTggem9yZGVyOwogfTsKIAogc3RydWN0IG9tYXBfb3ZlcmxheSB7CkBAIC0zMjQsNyArMzg2LDcgQEAKIAogCS8qIHN0YXRpYyBmaWVsZHMgKi8KIAljb25zdCBjaGFyICpuYW1lOwotCWludCBpZDsKKwllbnVtIG9tYXBfcGxhbmUgaWQ7CiAJZW51bSBvbWFwX2NvbG9yX21vZGUgc3VwcG9ydGVkX21vZGVzOwogCWVudW0gb21hcF9vdmVybGF5X2NhcHMgY2FwczsKIApAQCAtMzMyLDYgKzM5NCw3IEBACiAJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptYW5hZ2VyOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOwogCisJYm9vbCBtYW5hZ2VyX2NoYW5nZWQ7CiAJLyogaWYgdHJ1ZSwgaW5mbyBoYXMgYmVlbiBjaGFuZ2VkLCBidXQgbm90IGFwcGxpZWQoKSB5ZXQgKi8KIAlib29sIGluZm9fZGlydHk7CiAKQEAgLTM1NCw3ICs0MTcsNyBAQAogCXUzMiB0cmFuc19rZXk7CiAJYm9vbCB0cmFuc19lbmFibGVkOwogCi0JYm9vbCBhbHBoYV9lbmFibGVkOworCWJvb2wgcGFydGlhbF9hbHBoYV9lbmFibGVkOwogCiAJYm9vbCBjcHJfZW5hYmxlOwogCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgY3ByX2NvZWZzOwpAQCAtMzY2LDcgKzQyOSw3IEBACiAKIAkvKiBzdGF0aWMgZmllbGRzICovCiAJY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgaWQ7CisJZW51bSBvbWFwX2NoYW5uZWwgaWQ7CiAJZW51bSBvbWFwX292ZXJsYXlfbWFuYWdlcl9jYXBzIGNhcHM7CiAJaW50IG51bV9vdmVybGF5czsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5ICoqb3ZlcmxheXM7CkBAIC00NTQsNiArNTE3LDcgQEAKIAkJfSBkaXNwYzsKIAogCQlzdHJ1Y3QgeworCQkJLyogcmVnbiBpcyBvbmUgZ3JlYXRlciB0aGFuIFRSTSdzIFJFR04gdmFsdWUgKi8KIAkJCXUxNiByZWduOwogCQkJdTE2IHJlZ207CiAJCQl1MTYgcmVnbV9kaXNwYzsKQEAgLTQ2NCw2ICs1MjgsNyBAQAogCQl9IGRzaTsKIAogCQlzdHJ1Y3QgeworCQkJLyogcmVnbiBpcyBvbmUgZ3JlYXRlciB0aGFuIFRSTSdzIFJFR04gdmFsdWUgKi8KIAkJCXUxNiByZWduOwogCQkJdTE2IHJlZ20yOwogCQl9IGhkbWk7CkBAIC00NzcsNiArNTQyLDEwIEBACiAJCWludCBhY2I7CS8qIGFjLWJpYXMgcGluIGZyZXF1ZW5jeSAqLwogCiAJCWVudW0gb21hcF9wYW5lbF9jb25maWcgY29uZmlnOworCisJCWVudW0gb21hcF9kc3NfZHNpX3BpeGVsX2Zvcm1hdCBkc2lfcGl4X2ZtdDsKKwkJZW51bSBvbWFwX2Rzc19kc2lfbW9kZSBkc2lfbW9kZTsKKwkJc3RydWN0IG9tYXBfZHNzX2RzaV92aWRlb21vZGVfZGF0YSBkc2lfdm1fZGF0YTsKIAl9IHBhbmVsOwogCiAJc3RydWN0IHsKQEAgLTU1Nyw2ICs2MjYsOSBAQAogCiAJaW50ICgqc2V0X3dzcykoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCB1MzIgd3NzKTsKIAl1MzIgKCpnZXRfd3NzKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOworCisJaW50ICgqcmVhZF9lZGlkKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIHU4ICpidWYsIGludCBsZW4pOworCWJvb2wgKCpkZXRlY3QpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CiB9OwogCiBpbnQgb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3NoX21vYmlsZV9sY2RjLmggYi9pbmNsdWRlL3ZpZGVvL3NoX21vYmlsZV9sY2RjLmgKaW5kZXggZDk2NGU2OC4uODEwMWI3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9zaF9tb2JpbGVfbGNkYy5oCisrKyBiL2luY2x1ZGUvdmlkZW8vc2hfbW9iaWxlX2xjZGMuaApAQCAtNCwyNiArNCwxMjMgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9tZXJhbS5oPgogCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBfTEREQ0tSCQkJMHg0MTAKKyNkZWZpbmUgTEREQ0tSX0lDS1NFTF9CVVMJKDAgPDwgMTYpCisjZGVmaW5lIExERENLUl9JQ0tTRUxfTUlQSQkoMSA8PCAxNikKKyNkZWZpbmUgTEREQ0tSX0lDS1NFTF9IRE1JCSgyIDw8IDE2KQorI2RlZmluZSBMRERDS1JfSUNLU0VMX0VYVAkoMyA8PCAxNikKKyNkZWZpbmUgTEREQ0tSX0lDS1NFTF9NQVNLCSg3IDw8IDE2KQorI2RlZmluZSBMRERDS1JfTU9TRUwJCSgxIDw8IDYpCisjZGVmaW5lIF9MRERDS1NUUFIJCTB4NDE0CisjZGVmaW5lIF9MRElOVFIJCQkweDQ2OAorI2RlZmluZSBMRElOVFJfRkUJCSgxIDw8IDEwKQorI2RlZmluZSBMRElOVFJfVlNFCQkoMSA8PCA5KQorI2RlZmluZSBMRElOVFJfVkVFCQkoMSA8PCA4KQorI2RlZmluZSBMRElOVFJfRlMJCSgxIDw8IDIpCisjZGVmaW5lIExESU5UUl9WU1MJCSgxIDw8IDEpCisjZGVmaW5lIExESU5UUl9WRVMJCSgxIDw8IDApCisjZGVmaW5lIExESU5UUl9TVEFUVVNfTUFTSwkoMHhmZiA8PCAwKQorI2RlZmluZSBfTERTUgkJCTB4NDZjCisjZGVmaW5lIExEU1JfTVNTCQkoMSA8PCAxMCkKKyNkZWZpbmUgTERTUl9NUlMJCSgxIDw8IDgpCisjZGVmaW5lIExEU1JfQVMJCQkoMSA8PCAxKQorI2RlZmluZSBfTERDTlQxUgkJMHg0NzAKKyNkZWZpbmUgTERDTlQxUl9ERQkJKDEgPDwgMCkKKyNkZWZpbmUgX0xEQ05UMlIJCTB4NDc0CisjZGVmaW5lIExEQ05UMlJfQlIJCSgxIDw8IDgpCisjZGVmaW5lIExEQ05UMlJfTUQJCSgxIDw8IDMpCisjZGVmaW5lIExEQ05UMlJfU0UJCSgxIDw8IDIpCisjZGVmaW5lIExEQ05UMlJfTUUJCSgxIDw8IDEpCisjZGVmaW5lIExEQ05UMlJfRE8JCSgxIDw8IDApCisjZGVmaW5lIF9MRFJDTlRSCQkweDQ3OAorI2RlZmluZSBMRFJDTlRSX1NSUwkJKDEgPDwgMTcpCisjZGVmaW5lIExEUkNOVFJfU1JDCQkoMSA8PCAxNikKKyNkZWZpbmUgTERSQ05UUl9NUlMJCSgxIDw8IDEpCisjZGVmaW5lIExEUkNOVFJfTVJDCQkoMSA8PCAwKQorI2RlZmluZSBfTERERFNSCQkJMHg0N2MKKyNkZWZpbmUgTERERFNSX0xTCQkoMSA8PCAyKQorI2RlZmluZSBMREREU1JfV1MJCSgxIDw8IDEpCisjZGVmaW5lIExERERTUl9CUwkJKDEgPDwgMCkKKworI2RlZmluZSBMRE1UMVJfVlBPTAkJKDEgPDwgMjgpCisjZGVmaW5lIExETVQxUl9IUE9MCQkoMSA8PCAyNykKKyNkZWZpbmUgTERNVDFSX0RXUE9MCQkoMSA8PCAyNikKKyNkZWZpbmUgTERNVDFSX0RJUE9MCQkoMSA8PCAyNSkKKyNkZWZpbmUgTERNVDFSX0RBUE9MCQkoMSA8PCAyNCkKKyNkZWZpbmUgTERNVDFSX0hTQ05UCQkoMSA8PCAxNykKKyNkZWZpbmUgTERNVDFSX0RXQ05UCQkoMSA8PCAxNikKKyNkZWZpbmUgTERNVDFSX0lGTQkJKDEgPDwgMTIpCisjZGVmaW5lIExETVQxUl9NSUZUWVBfUkdCOAkoMHgwIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfUkdCOQkoMHg0IDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfUkdCMTJBCSgweDUgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9SR0IxMkIJKDB4NiA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1JHQjE2CSgweDcgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9SR0IxOAkoMHhhIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfUkdCMjQJKDB4YiA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1lDQkNSCSgweGYgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9TWVM4QQkoMHgwIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfU1lTOEIJKDB4MSA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1NZUzhDCSgweDIgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9TWVM4RAkoMHgzIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfU1lTOQkoMHg0IDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfU1lTMTIJKDB4NSA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1NZUzE2QQkoMHg3IDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfU1lTMTZCCSgweDggPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9TWVMxNkMJKDB4OSA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1NZUzE4CSgweGEgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9TWVMyNAkoMHhiIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfTUFTSwkoMHhmIDw8IDApCisKKyNkZWZpbmUgTERERlJfQ0YxCQkoMSA8PCAxOCkKKyNkZWZpbmUgTERERlJfQ0YwCQkoMSA8PCAxNykKKyNkZWZpbmUgTERERlJfQ0MJCSgxIDw8IDE2KQorI2RlZmluZSBMRERGUl9ZRl80MjAJCSgwIDw8IDgpCisjZGVmaW5lIExEREZSX1lGXzQyMgkJKDEgPDwgOCkKKyNkZWZpbmUgTERERlJfWUZfNDQ0CQkoMiA8PCA4KQorI2RlZmluZSBMRERGUl9ZRl9NQVNLCQkoMyA8PCA4KQorI2RlZmluZSBMRERGUl9QS0ZfQVJHQjMyCSgweDAwIDw8IDApCisjZGVmaW5lIExEREZSX1BLRl9SR0IxNgkJKDB4MDMgPDwgMCkKKyNkZWZpbmUgTERERlJfUEtGX1JHQjI0CQkoMHgwYiA8PCAwKQorI2RlZmluZSBMRERGUl9QS0ZfTUFTSwkJKDB4MWYgPDwgMCkKKworI2RlZmluZSBMRFNNMVJfT1MJCSgxIDw8IDApCisKKyNkZWZpbmUgTERTTTJSX09TVFJHCQkoMSA8PCAwKQorCisjZGVmaW5lIExEUE1SX0xQUwkJKDMgPDwgMCkKKworI2RlZmluZSBfTEREV0QwUgkJMHg4MDAKKyNkZWZpbmUgTEREV0R4Ul9XREFDVAkJKDEgPDwgMjgpCisjZGVmaW5lIExERFdEeFJfUlNXCQkoMSA8PCAyNCkKKyNkZWZpbmUgX0xERFJEUgkJCTB4ODQwCisjZGVmaW5lIExERFJEUl9SU1IJCSgxIDw8IDI0KQorI2RlZmluZSBMRERSRFJfRFJEX01BU0sJCSgweDNmZmZmIDw8IDApCisjZGVmaW5lIF9MRERXQVIJCQkweDkwMAorI2RlZmluZSBMRERXQVJfV0EJCSgxIDw8IDApCisjZGVmaW5lIF9MRERSQVIJCQkweDkwNAorI2RlZmluZSBMRERSQVJfUkEJCSgxIDw8IDApCisKIGVudW0gewotCVJHQjgsICAgLyogMjRicHAsIDg6ODo4ICovCi0JUkdCOSwgICAvKiAxOGJwcCwgOTo5ICovCi0JUkdCMTJBLCAvKiAyNGJwcCwgMTI6MTIgKi8KLQlSR0IxMkIsIC8qIDEyYnBwICovCi0JUkdCMTYsICAvKiAxNmJwcCAqLwotCVJHQjE4LCAgLyogMThicHAgKi8KLQlSR0IyNCwgIC8qIDI0YnBwICovCi0JWVVWNDIyLCAvKiAxNmJwcCAqLwotCVNZUzhBLCAgLyogMjRicHAsIDg6ODo4ICovCi0JU1lTOEIsICAvKiAxOGJwcCwgODo4OjIgKi8KLQlTWVM4QywgIC8qIDE4YnBwLCAyOjg6OCAqLwotCVNZUzhELCAgLyogMTZicHAsIDg6OCAqLwotCVNZUzksICAgLyogMThicHAsIDk6OSAqLwotCVNZUzEyLCAgLyogMjRicHAsIDEyOjEyICovCi0JU1lTMTZBLCAvKiAxNmJwcCAqLwotCVNZUzE2QiwgLyogMThicHAsIDE2OjIgKi8KLQlTWVMxNkMsIC8qIDE4YnBwLCAyOjE2ICovCi0JU1lTMTgsICAvKiAxOGJwcCAqLwotCVNZUzI0LCAgLyogMjRicHAgKi8KKwlSR0I4CT0gTERNVDFSX01JRlRZUF9SR0I4LAkvKiAyNGJwcCwgODo4OjggKi8KKwlSR0I5CT0gTERNVDFSX01JRlRZUF9SR0I5LAkvKiAxOGJwcCwgOTo5ICovCisJUkdCMTJBCT0gTERNVDFSX01JRlRZUF9SR0IxMkEsCS8qIDI0YnBwLCAxMjoxMiAqLworCVJHQjEyQgk9IExETVQxUl9NSUZUWVBfUkdCMTJCLAkvKiAxMmJwcCAqLworCVJHQjE2CT0gTERNVDFSX01JRlRZUF9SR0IxNiwJLyogMTZicHAgKi8KKwlSR0IxOAk9IExETVQxUl9NSUZUWVBfUkdCMTgsCS8qIDE4YnBwICovCisJUkdCMjQJPSBMRE1UMVJfTUlGVFlQX1JHQjI0LAkvKiAyNGJwcCAqLworCVlVVjQyMgk9IExETVQxUl9NSUZUWVBfWUNCQ1IsCS8qIDE2YnBwICovCisJU1lTOEEJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM4QSwJLyogMjRicHAsIDg6ODo4ICovCisJU1lTOEIJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM4QiwJLyogMThicHAsIDg6ODoyICovCisJU1lTOEMJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM4QywJLyogMThicHAsIDI6ODo4ICovCisJU1lTOEQJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM4RCwJLyogMTZicHAsIDg6OCAqLworCVNZUzkJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM5LAkvKiAxOGJwcCwgOTo5ICovCisJU1lTMTIJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVMxMiwJLyogMjRicHAsIDEyOjEyICovCisJU1lTMTZBCT0gTERNVDFSX0lGTSB8IExETVQxUl9NSUZUWVBfU1lTMTZBLAkvKiAxNmJwcCAqLworCVNZUzE2Qgk9IExETVQxUl9JRk0gfCBMRE1UMVJfTUlGVFlQX1NZUzE2QiwJLyogMThicHAsIDE2OjIgKi8KKwlTWVMxNkMJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVMxNkMsCS8qIDE4YnBwLCAyOjE2ICovCisJU1lTMTgJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVMxOCwJLyogMThicHAgKi8KKwlTWVMyNAk9IExETVQxUl9JRk0gfCBMRE1UMVJfTUlGVFlQX1NZUzI0LAkvKiAyNGJwcCAqLwogfTsKIAogZW51bSB7IExDRENfQ0hBTl9ESVNBQkxFRCA9IDAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3VkbGZiLmggYi9pbmNsdWRlL3ZpZGVvL3VkbGZiLmgKaW5kZXggNjlkNDg1YS4uYzQxZjMwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby91ZGxmYi5oCisrKyBiL2luY2x1ZGUvdmlkZW8vdWRsZmIuaApAQCAtNTAsNiArNTAsNyBAQAogCWludCBiYXNlMTY7CiAJaW50IGJhc2U4OwogCXUzMiBwc2V1ZG9fcGFsZXR0ZVsyNTZdOworCWludCBibGFua19tb2RlOyAvKm9uZSBvZiBGQl9CTEFOS18gKi8KIAkvKiBibGl0LW9ubHkgcmVuZGVyaW5nIHBhdGggbWV0cmljcywgZXhwb3NlZCB0aHJvdWdoIHN5c2ZzICovCiAJYXRvbWljX3QgYnl0ZXNfcmVuZGVyZWQ7IC8qIHJhdyBwaXhlbC1ieXRlcyBkcml2ZXIgYXNrZWQgdG8gcmVuZGVyICovCiAJYXRvbWljX3QgYnl0ZXNfaWRlbnRpY2FsOyAvKiBzYXZlZCBlZmZvcnQgd2l0aCBiYWNrYnVmZmVyIGNvbXBhcmlzb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmggYi9pbmNsdWRlL3hlbi9ncmFudF90YWJsZS5oCmluZGV4IDZiOTliZmIuLjExZTJkZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmgKKysrIGIvaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaApAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvZ3JhbnRfdGFibGUuaD4KIAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgotI2luY2x1ZGUgPGFzbS94ZW4vZ3JhbnRfdGFibGUuaD4KIAogI2luY2x1ZGUgPHhlbi9mZWF0dXJlcy5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9odmMtY29uc29sZS5oIGIvaW5jbHVkZS94ZW4vaHZjLWNvbnNvbGUuaAppbmRleCA5MDE3MjRkLi5iNjJkZmVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi9odmMtY29uc29sZS5oCisrKyBiL2luY2x1ZGUveGVuL2h2Yy1jb25zb2xlLmgKQEAgLTYsMTIgKzYsMTIgQEAKICNpZmRlZiBDT05GSUdfSFZDX1hFTgogdm9pZCB4ZW5fY29uc29sZV9yZXN1bWUodm9pZCk7CiB2b2lkIHhlbl9yYXdfY29uc29sZV93cml0ZShjb25zdCBjaGFyICpzdHIpOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKQorX19wcmludGYoMSwgMikKIHZvaWQgeGVuX3Jhd19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fY29uc29sZV9yZXN1bWUodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgeGVuX3Jhd19jb25zb2xlX3dyaXRlKGNvbnN0IGNoYXIgKnN0cikgeyB9Ci1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSkKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMSwgMikKIHZvaWQgeGVuX3Jhd19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pIHsgfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9ibGtpZi5oIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL2Jsa2lmLmgKaW5kZXggM2Q1ZDZkYi4uOTMyNDQ4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL2Jsa2lmLmgKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL2Jsa2lmLmgKQEAgLTU3LDYgKzU3LDM2IEBACiAgKiAiZmVhdHVyZS1mbHVzaC1jYWNoZSIgbm9kZSEKICAqLwogI2RlZmluZSBCTEtJRl9PUF9GTFVTSF9ESVNLQ0FDSEUgICAzCisKKy8qCisgKiBSZWNvZ25pc2VkIG9ubHkgaWYgImZlYXR1cmUtZGlzY2FyZCIgaXMgcHJlc2VudCBpbiBiYWNrZW5kIHhlbmJ1cyBpbmZvLgorICogVGhlICJmZWF0dXJlLWRpc2NhcmQiIG5vZGUgY29udGFpbnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0cmltCisgKiAoQVRBKSBvciB1bm1hcCAoU0NTSSkgLSBjb252aWVudGx5IGNhbGxlZCBkaXNjYXJkIHJlcXVlc3RzIGFyZSBsaWtlbHkKKyAqIHRvIHN1Y2NlZWQgb3IgZmFpbC4gRWl0aGVyIHdheSwgYSBkaXNjYXJkIHJlcXVlc3QKKyAqIG1heSBmYWlsIGF0IGFueSB0aW1lIHdpdGggQkxLSUZfUlNQX0VPUE5PVFNVUFAgaWYgaXQgaXMgdW5zdXBwb3J0ZWQgYnkKKyAqIHRoZSB1bmRlcmx5aW5nIGJsb2NrLWRldmljZSBoYXJkd2FyZS4gVGhlIGJvb2xlYW4gc2ltcGx5IGluZGljYXRlcyB3aGV0aGVyCisgKiBvciBub3QgaXQgaXMgd29ydGh3aGlsZSBmb3IgdGhlIGZyb250ZW5kIHRvIGF0dGVtcHQgZGlzY2FyZCByZXF1ZXN0cy4KKyAqIElmIGEgYmFja2VuZCBkb2VzIG5vdCByZWNvZ25pc2UgQkxLSUZfT1BfRElTQ0FSRCwgaXQgc2hvdWxkICpub3QqCisgKiBjcmVhdGUgdGhlICJmZWF0dXJlLWRpc2NhcmQiIG5vZGUhCisgKgorICogRGlzY2FyZCBvcGVyYXRpb24gaXMgYSByZXF1ZXN0IGZvciB0aGUgdW5kZXJseWluZyBibG9jayBkZXZpY2UgdG8gbWFyaworICogZXh0ZW50cyB0byBiZSBlcmFzZWQuIEhvd2V2ZXIsIGRpc2NhcmQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIGJsb2NrcworICogd2lsbCBiZSBlcmFzZWQgZnJvbSB0aGUgZGV2aWNlIC0gaXQgaXMganVzdCBhIGhpbnQgdG8gdGhlIGRldmljZQorICogY29udHJvbGxlciB0aGF0IHRoZXNlIGJsb2NrcyBhcmUgbm8gbG9uZ2VyIGluIHVzZS4gV2hhdCB0aGUgZGV2aWNlCisgKiBjb250cm9sbGVyIGRvZXMgd2l0aCB0aGF0IGluZm9ybWF0aW9uIGlzIGxlZnQgdG8gdGhlIGNvbnRyb2xsZXIuCisgKiBEaXNjYXJkIG9wZXJhdGlvbnMgYXJlIHBhc3NlZCB3aXRoIHNlY3Rvcl9udW1iZXIgYXMgdGhlCisgKiBzZWN0b3IgaW5kZXggdG8gYmVnaW4gZGlzY2FyZCBvcGVyYXRpb25zIGF0IGFuZCBucl9zZWN0b3JzIGFzIHRoZSBudW1iZXIgb2YKKyAqIHNlY3RvcnMgdG8gYmUgZGlzY2FyZGVkLiBUaGUgc3BlY2lmaWVkIHNlY3RvcnMgc2hvdWxkIGJlIGRpc2NhcmRlZCBpZiB0aGUKKyAqIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlIHN1cHBvcnRzIHRyaW0gKEFUQSkgb3IgdW5tYXAgKFNDU0kpIG9wZXJhdGlvbnMsCisgKiBvciBhIEJMS0lGX1JTUF9FT1BOT1RTVVBQICBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRyaW0vdW5tYXAgb3BlcmF0aW9ucyBhdDoKKyAqIGh0dHA6Ly90MTMub3JnL0RvY3VtZW50cy9VcGxvYWRlZERvY3VtZW50cy9kb2NzMjAwOC8KKyAqICAgICBlMDcxNTRyNi1EYXRhX1NldF9NYW5hZ2VtZW50X1Byb3Bvc2FsX2Zvcl9BVEEtQUNTMi5kb2MKKyAqIGh0dHA6Ly93d3cuc2VhZ2F0ZS5jb20vc3RhdGljZmlsZXMvc3VwcG9ydC9kaXNjL21hbnVhbHMvCisgKiAgICAgSW50ZXJmYWNlJTIwbWFudWFscy8xMDAyOTMwNjhjLnBkZgorICovCisjZGVmaW5lIEJMS0lGX09QX0RJU0NBUkQgICAgICAgICAgIDUKKwogLyoKICAqIE1heGltdW0gc2NhdHRlci9nYXRoZXIgc2VnbWVudHMgcGVyIHJlcXVlc3QuCiAgKiBUaGlzIGlzIGNhcmVmdWxseSBjaG9zZW4gc28gdGhhdCBzaXplb2Yoc3RydWN0IGJsa2lmX3JpbmcpIDw9IFBBR0VfU0laRS4KQEAgLTc0LDYgKzEwNCwxMSBAQAogCX0gc2VnW0JMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVF07CiB9OwogCitzdHJ1Y3QgYmxraWZfcmVxdWVzdF9kaXNjYXJkIHsKKwlibGtpZl9zZWN0b3JfdCBzZWN0b3JfbnVtYmVyOworCXVpbnQ2NF90IG5yX3NlY3RvcnM7Cit9OworCiBzdHJ1Y3QgYmxraWZfcmVxdWVzdCB7CiAJdWludDhfdCAgICAgICAgb3BlcmF0aW9uOyAgICAvKiBCTEtJRl9PUF8/Pz8gICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAl1aW50OF90ICAgICAgICBucl9zZWdtZW50czsgIC8qIG51bWJlciBvZiBzZWdtZW50cyAgICAgICAgICAgICAgICAgICAqLwpAQCAtODEsNiArMTE2LDcgQEAKIAl1aW50NjRfdCAgICAgICBpZDsgICAgICAgICAgIC8qIHByaXZhdGUgZ3Vlc3QgdmFsdWUsIGVjaG9lZCBpbiByZXNwICAqLwogCXVuaW9uIHsKIAkJc3RydWN0IGJsa2lmX3JlcXVlc3Rfcncgcnc7CisJCXN0cnVjdCBibGtpZl9yZXF1ZXN0X2Rpc2NhcmQgZGlzY2FyZDsKIAl9IHU7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvcGxhdGZvcm0uaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjg0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvcGxhdGZvcm0uaApAQCAtMCwwICsxLDMyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcGxhdGZvcm0uaAorICoKKyAqIEhhcmR3YXJlIHBsYXRmb3JtIG9wZXJhdGlvbnMuIEludGVuZGVkIGZvciB1c2UgYnkgZG9tYWluLTAga2VybmVsLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bworICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiwgSyBGcmFzZXIKKyAqLworCisjaWZuZGVmIF9fWEVOX1BVQkxJQ19QTEFURk9STV9IX18KKyNkZWZpbmUgX19YRU5fUFVCTElDX1BMQVRGT1JNX0hfXworCisjaW5jbHVkZSAieGVuLmgiCisKKyNkZWZpbmUgWEVOUEZfSU5URVJGQUNFX1ZFUlNJT04gMHgwMzAwMDAwMQorCisvKgorICogU2V0IGNsb2NrIHN1Y2ggdGhhdCBpdCB3b3VsZCByZWFkIDxzZWNzLG5zZWNzPiBhZnRlciAwMDowMDowMCBVVEMsCisgKiAxIEphbnVhcnksIDE5NzAgaWYgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgd2FzIDxzeXN0ZW1fdGltZT4uCisgKi8KKyNkZWZpbmUgWEVOUEZfc2V0dGltZSAgICAgICAgICAgICAxNworc3RydWN0IHhlbnBmX3NldHRpbWUgeworCS8qIElOIHZhcmlhYmxlcy4gKi8KKwl1aW50MzJfdCBzZWNzOworCXVpbnQzMl90IG5zZWNzOworCXVpbnQ2NF90IHN5c3RlbV90aW1lOworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbnBmX3NldHRpbWVfdCk7CisKKy8qCisgKiBSZXF1ZXN0IG1lbW9yeSByYW5nZSAoQG1mbiwgQG1mbitAbnJfbWZucy0xKSB0byBoYXZlIHR5cGUgQHR5cGUuCisgKiBPbiB4ODYsIEB0eXBlIGlzIGFuIGFyY2hpdGVjdHVyZS1kZWZpbmVkIE1UUlIgbWVtb3J5IHR5cGUuCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIHRoZSBNVFJSIHRoYXQgd2FzIHVzZWQgKEByZWcpIGFuZCBhIGhhbmRsZSB0aGF0IGNhbgorICogYmUgcGFzc2VkIHRvIFhFTlBGX0RFTF9NRU1UWVBFIHRvIGFjY3VyYXRlbHkgdGVhciBkb3duIHRoZSBuZXcgc2V0dGluZy4KKyAqICh4ODYtc3BlY2lmaWMpLgorICovCisjZGVmaW5lIFhFTlBGX2FkZF9tZW10eXBlICAgICAgICAgMzEKK3N0cnVjdCB4ZW5wZl9hZGRfbWVtdHlwZSB7CisJLyogSU4gdmFyaWFibGVzLiAqLworCXVuc2lnbmVkIGxvbmcgbWZuOworCXVpbnQ2NF90IG5yX21mbnM7CisJdWludDMyX3QgdHlwZTsKKwkvKiBPVVQgdmFyaWFibGVzLiAqLworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCByZWc7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfYWRkX21lbXR5cGVfdCk7CisKKy8qCisgKiBUZWFyIGRvd24gYW4gZXhpc3RpbmcgbWVtb3J5LXJhbmdlIHR5cGUuIElmIEBoYW5kbGUgaXMgcmVtZW1iZXJlZCB0aGVuIGl0CisgKiBzaG91bGQgYmUgcGFzc2VkIGluIHRvIGFjY3VyYXRlbHkgdGVhciBkb3duIHRoZSBjb3JyZWN0IHNldHRpbmcgKGluIGNhc2UKKyAqIG9mIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zIHdpdGggZGlmZmVyaW5nIHR5cGVzKS4gSWYgaXQgaXMgbm90IGtub3duCisgKiB0aGVuIEBoYW5kbGUgc2hvdWxkIGJlIHNldCB0byB6ZXJvLiBJbiBhbGwgY2FzZXMgQHJlZyBtdXN0IGJlIHNldC4KKyAqICh4ODYtc3BlY2lmaWMpLgorICovCisjZGVmaW5lIFhFTlBGX2RlbF9tZW10eXBlICAgICAgICAgMzIKK3N0cnVjdCB4ZW5wZl9kZWxfbWVtdHlwZSB7CisJLyogSU4gdmFyaWFibGVzLiAqLworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCByZWc7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfZGVsX21lbXR5cGVfdCk7CisKKy8qIFJlYWQgY3VycmVudCB0eXBlIG9mIGFuIE1UUlIgKHg4Ni1zcGVjaWZpYykuICovCisjZGVmaW5lIFhFTlBGX3JlYWRfbWVtdHlwZSAgICAgICAgMzMKK3N0cnVjdCB4ZW5wZl9yZWFkX21lbXR5cGUgeworCS8qIElOIHZhcmlhYmxlcy4gKi8KKwl1aW50MzJfdCByZWc7CisJLyogT1VUIHZhcmlhYmxlcy4gKi8KKwl1bnNpZ25lZCBsb25nIG1mbjsKKwl1aW50NjRfdCBucl9tZm5zOworCXVpbnQzMl90IHR5cGU7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfcmVhZF9tZW10eXBlX3QpOworCisjZGVmaW5lIFhFTlBGX21pY3JvY29kZV91cGRhdGUgICAgMzUKK3N0cnVjdCB4ZW5wZl9taWNyb2NvZGVfdXBkYXRlIHsKKwkvKiBJTiB2YXJpYWJsZXMuICovCisJR1VFU1RfSEFORExFKHZvaWQpIGRhdGE7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbWljcm9jb2RlIGRhdGEgKi8KKwl1aW50MzJfdCBsZW5ndGg7ICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIG1pY3JvY29kZSBkYXRhLiAqLworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbnBmX21pY3JvY29kZV91cGRhdGVfdCk7CisKKyNkZWZpbmUgWEVOUEZfcGxhdGZvcm1fcXVpcmsgICAgICAzOQorI2RlZmluZSBRVUlSS19OT0lSUUJBTEFOQ0lORyAgICAgIDEgLyogRG8gbm90IHJlc3RyaWN0IElPLUFQSUMgUlRFIHRhcmdldHMgKi8KKyNkZWZpbmUgUVVJUktfSU9BUElDX0JBRF9SRUdTRUwgICAyIC8qIElPLUFQSUMgUkVHU0VMIGZvcmdldHMgaXRzIHZhbHVlICAgICovCisjZGVmaW5lIFFVSVJLX0lPQVBJQ19HT09EX1JFR1NFTCAgMyAvKiBJTy1BUElDIFJFR1NFTCBiZWhhdmVzIHByb3Blcmx5ICAgICAqLworc3RydWN0IHhlbnBmX3BsYXRmb3JtX3F1aXJrIHsKKwkvKiBJTiB2YXJpYWJsZXMuICovCisJdWludDMyX3QgcXVpcmtfaWQ7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfcGxhdGZvcm1fcXVpcmtfdCk7CisKKyNkZWZpbmUgWEVOUEZfZmlybXdhcmVfaW5mbyAgICAgICA1MAorI2RlZmluZSBYRU5fRldfRElTS19JTkZPICAgICAgICAgIDEgLyogZnJvbSBpbnQgMTMgQUg9MDgvNDEvNDggKi8KKyNkZWZpbmUgWEVOX0ZXX0RJU0tfTUJSX1NJR05BVFVSRSAyIC8qIGZyb20gTUJSIG9mZnNldCAweDFiOCAqLworI2RlZmluZSBYRU5fRldfVkJFRERDX0lORk8gICAgICAgIDMgLyogZnJvbSBpbnQgMTAgQVg9NGYxNSAqLworc3RydWN0IHhlbnBmX2Zpcm13YXJlX2luZm8geworCS8qIElOIHZhcmlhYmxlcy4gKi8KKwl1aW50MzJfdCB0eXBlOworCXVpbnQzMl90IGluZGV4OworCS8qIE9VVCB2YXJpYWJsZXMuICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogSW50MTMsIEZuNDg6IENoZWNrIEV4dGVuc2lvbnMgUHJlc2VudC4gKi8KKwkJCXVpbnQ4X3QgZGV2aWNlOyAgICAgICAgICAgICAgICAgICAvKiAlZGw6IGJpb3MgZGV2aWNlIG51bWJlciAqLworCQkJdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgIC8qICVhaDogbWFqb3IgdmVyc2lvbiAgICAgICovCisJCQl1aW50MTZfdCBpbnRlcmZhY2Vfc3VwcG9ydDsgICAgICAgLyogJWN4OiBzdXBwb3J0IGJpdG1hcCAgICAgKi8KKwkJCS8qIEludDEzLCBGbjA4OiBMZWdhY3kgR2V0IERldmljZSBQYXJhbWV0ZXJzLiAqLworCQkJdWludDE2X3QgbGVnYWN5X21heF9jeWxpbmRlcjsgICAgIC8qICVjbFs3OjZdOiVjaDogbWF4IGN5bCAjICovCisJCQl1aW50OF90IGxlZ2FjeV9tYXhfaGVhZDsgICAgICAgICAgLyogJWRoOiBtYXggaGVhZCAjICAgICAgICAgKi8KKwkJCXVpbnQ4X3QgbGVnYWN5X3NlY3RvcnNfcGVyX3RyYWNrOyAvKiAlY2xbNTowXTogbWF4IHNlY3RvciAjICAqLworCQkJLyogSW50MTMsIEZuNDE6IEdldCBEZXZpY2UgUGFyYW1ldGVycyAoYXMgZmlsbGVkIGludG8gJWRzOiVlc2kpLiAqLworCQkJLyogTkIuIEZpcnN0IHVpbnQxNl90IG9mIGJ1ZmZlciBtdXN0IGJlIHNldCB0byBidWZmZXIgc2l6ZS4gICAgICAqLworCQkJR1VFU1RfSEFORExFKHZvaWQpIGVkZF9wYXJhbXM7CisJCX0gZGlza19pbmZvOyAvKiBYRU5fRldfRElTS19JTkZPICovCisJCXN0cnVjdCB7CisJCQl1aW50OF90IGRldmljZTsgICAgICAgICAgICAgICAgICAgLyogYmlvcyBkZXZpY2UgbnVtYmVyICAqLworCQkJdWludDMyX3QgbWJyX3NpZ25hdHVyZTsgICAgICAgICAgIC8qIG9mZnNldCAweDFiOCBpbiBtYnIgKi8KKwkJfSBkaXNrX21icl9zaWduYXR1cmU7IC8qIFhFTl9GV19ESVNLX01CUl9TSUdOQVRVUkUgKi8KKwkJc3RydWN0IHsKKwkJCS8qIEludDEwLCBBWD00RjE1OiBHZXQgRURJRCBpbmZvLiAqLworCQkJdWludDhfdCBjYXBhYmlsaXRpZXM7CisJCQl1aW50OF90IGVkaWRfdHJhbnNmZXJfdGltZTsKKwkJCS8qIG11c3QgcmVmZXIgdG8gMTI4LWJ5dGUgYnVmZmVyICovCisJCQlHVUVTVF9IQU5ETEUodWNoYXIpIGVkaWQ7CisJCX0gdmJlZGRjX2luZm87IC8qIFhFTl9GV19WQkVERENfSU5GTyAqLworCX0gdTsKK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5wZl9maXJtd2FyZV9pbmZvX3QpOworCisjZGVmaW5lIFhFTlBGX2VudGVyX2FjcGlfc2xlZXAgICAgNTEKK3N0cnVjdCB4ZW5wZl9lbnRlcl9hY3BpX3NsZWVwIHsKKwkvKiBJTiB2YXJpYWJsZXMgKi8KKwl1aW50MTZfdCBwbTFhX2NudF92YWw7ICAgICAgLyogUE0xYSBjb250cm9sIHZhbHVlLiAqLworCXVpbnQxNl90IHBtMWJfY250X3ZhbDsgICAgICAvKiBQTTFiIGNvbnRyb2wgdmFsdWUuICovCisJdWludDMyX3Qgc2xlZXBfc3RhdGU7ICAgICAgIC8qIFdoaWNoIHN0YXRlIHRvIGVudGVyIChTbikuICovCisJdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qIE11c3QgYmUgemVyby4gKi8KK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5wZl9lbnRlcl9hY3BpX3NsZWVwX3QpOworCisjZGVmaW5lIFhFTlBGX2NoYW5nZV9mcmVxICAgICAgICAgNTIKK3N0cnVjdCB4ZW5wZl9jaGFuZ2VfZnJlcSB7CisJLyogSU4gdmFyaWFibGVzICovCisJdWludDMyX3QgZmxhZ3M7IC8qIE11c3QgYmUgemVyby4gKi8KKwl1aW50MzJfdCBjcHU7ICAgLyogUGh5c2ljYWwgY3B1LiAqLworCXVpbnQ2NF90IGZyZXE7ICAvKiBOZXcgZnJlcXVlbmN5IChIeikuICovCit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfY2hhbmdlX2ZyZXFfdCk7CisKKy8qCisgKiBHZXQgaWRsZSB0aW1lcyAobmFub3NlY29uZHMgc2luY2UgYm9vdCkgZm9yIHBoeXNpY2FsIENQVXMgc3BlY2lmaWVkIGluIHRoZQorICogQGNwdW1hcF9iaXRtYXAgd2l0aCByYW5nZSBbMC4uQGNwdW1hcF9ucl9jcHVzLTFdLiBUaGUgQGlkbGV0aW1lIGFycmF5IGlzCisgKiBpbmRleGVkIGJ5IENQVSBudW1iZXI7IG9ubHkgZW50cmllcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEBjcHVtYXBfYml0bWFwCisgKiBiaXQgc2V0IGFyZSB3cml0dGVuIHRvLiBPbiByZXR1cm4sIEBjcHVtYXBfYml0bWFwIGlzIG1vZGlmaWVkIHNvIHRoYXQgYW55CisgKiBub24tZXhpc3RlbnQgQ1BVcyBhcmUgY2xlYXJlZC4gU3VjaCBDUFVzIGhhdmUgdGhlaXIgQGlkbGV0aW1lIGFycmF5IGVudHJ5CisgKiBjbGVhcmVkLgorICovCisjZGVmaW5lIFhFTlBGX2dldGlkbGV0aW1lICAgICAgICAgNTMKK3N0cnVjdCB4ZW5wZl9nZXRpZGxldGltZSB7CisJLyogSU4vT1VUIHZhcmlhYmxlcyAqLworCS8qIElOOiBDUFVzIHRvIGludGVycm9nYXRlOyBPVVQ6IHN1YnNldCBvZiBJTiB3aGljaCBhcmUgcHJlc2VudCAqLworCUdVRVNUX0hBTkRMRSh1Y2hhcikgY3B1bWFwX2JpdG1hcDsKKwkvKiBJTiB2YXJpYWJsZXMgKi8KKwkvKiBTaXplIG9mIGNwdW1hcCBiaXRtYXAuICovCisJdWludDMyX3QgY3B1bWFwX25yX2NwdXM7CisJLyogTXVzdCBiZSBpbmRleGFibGUgZm9yIGV2ZXJ5IGNwdSBpbiBjcHVtYXBfYml0bWFwLiAqLworCUdVRVNUX0hBTkRMRSh1aW50NjRfdCkgaWRsZXRpbWU7CisJLyogT1VUIHZhcmlhYmxlcyAqLworCS8qIFN5c3RlbSB0aW1lIHdoZW4gdGhlIGlkbGV0aW1lIHNuYXBzaG90cyB3ZXJlIHRha2VuLiAqLworCXVpbnQ2NF90IG5vdzsKK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5wZl9nZXRpZGxldGltZV90KTsKKworI2RlZmluZSBYRU5QRl9zZXRfcHJvY2Vzc29yX3BtaW5mbyAgICAgIDU0CisKKy8qIGFiaWxpdHkgYml0cyAqLworI2RlZmluZSBYRU5fUFJPQ0VTU09SX1BNX0NYCTEKKyNkZWZpbmUgWEVOX1BST0NFU1NPUl9QTV9QWAkyCisjZGVmaW5lIFhFTl9QUk9DRVNTT1JfUE1fVFgJNAorCisvKiBjbWQgdHlwZSAqLworI2RlZmluZSBYRU5fUE1fQ1ggICAwCisjZGVmaW5lIFhFTl9QTV9QWCAgIDEKKyNkZWZpbmUgWEVOX1BNX1RYICAgMgorCisvKiBQeCBzdWIgaW5mbyB0eXBlICovCisjZGVmaW5lIFhFTl9QWF9QQ1QgICAxCisjZGVmaW5lIFhFTl9QWF9QU1MgICAyCisjZGVmaW5lIFhFTl9QWF9QUEMgICA0CisjZGVmaW5lIFhFTl9QWF9QU0QgICA4CisKK3N0cnVjdCB4ZW5fcG93ZXJfcmVnaXN0ZXIgeworCXVpbnQzMl90ICAgICBzcGFjZV9pZDsKKwl1aW50MzJfdCAgICAgYml0X3dpZHRoOworCXVpbnQzMl90ICAgICBiaXRfb2Zmc2V0OworCXVpbnQzMl90ICAgICBhY2Nlc3Nfc2l6ZTsKKwl1aW50NjRfdCAgICAgYWRkcmVzczsKK307CisKK3N0cnVjdCB4ZW5fcHJvY2Vzc29yX2NzZCB7CisJdWludDMyX3QgICAgZG9tYWluOyAgICAgIC8qIGRvbWFpbiBudW1iZXIgb2Ygb25lIGRlcGVuZGVudCBncm91cCAqLworCXVpbnQzMl90ICAgIGNvb3JkX3R5cGU7ICAvKiBjb29yZGluYXRpb24gdHlwZSAqLworCXVpbnQzMl90ICAgIG51bTsgICAgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBpbiBzYW1lIGRvbWFpbiAqLworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbl9wcm9jZXNzb3JfY3NkKTsKKworc3RydWN0IHhlbl9wcm9jZXNzb3JfY3ggeworCXN0cnVjdCB4ZW5fcG93ZXJfcmVnaXN0ZXIgIHJlZzsgLyogR0FTIGZvciBDeCB0cmlnZ2VyIHJlZ2lzdGVyICovCisJdWludDhfdCAgICAgdHlwZTsgICAgIC8qIGNzdGF0ZSB2YWx1ZSwgYzA6IDAsIGMxOiAxLCAuLi4gKi8KKwl1aW50MzJfdCAgICBsYXRlbmN5OyAgLyogd29yc3QgbGF0ZW5jeSAobXMpIHRvIGVudGVyL2V4aXQgdGhpcyBjc3RhdGUgKi8KKwl1aW50MzJfdCAgICBwb3dlcjsgICAgLyogYXZlcmFnZSBwb3dlciBjb25zdW1wdGlvbihtVykgKi8KKwl1aW50MzJfdCAgICBkcGNudDsgICAgLyogbnVtYmVyIG9mIGRlcGVuZGVuY3kgZW50cmllcyAqLworCUdVRVNUX0hBTkRMRSh4ZW5fcHJvY2Vzc29yX2NzZCkgZHA7IC8qIE5VTEwgaWYgbm8gZGVwZW5kZW5jeSAqLworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbl9wcm9jZXNzb3JfY3gpOworCitzdHJ1Y3QgeGVuX3Byb2Nlc3Nvcl9mbGFncyB7CisJdWludDMyX3QgYm1fY29udHJvbDoxOworCXVpbnQzMl90IGJtX2NoZWNrOjE7CisJdWludDMyX3QgaGFzX2NzdDoxOworCXVpbnQzMl90IHBvd2VyX3NldHVwX2RvbmU6MTsKKwl1aW50MzJfdCBibV9ybGRfc2V0OjE7Cit9OworCitzdHJ1Y3QgeGVuX3Byb2Nlc3Nvcl9wb3dlciB7CisJdWludDMyX3QgY291bnQ7ICAvKiBudW1iZXIgb2YgQyBzdGF0ZSBlbnRyaWVzIGluIGFycmF5IGJlbG93ICovCisJc3RydWN0IHhlbl9wcm9jZXNzb3JfZmxhZ3MgZmxhZ3M7ICAvKiBnbG9iYWwgZmxhZ3Mgb2YgdGhpcyBwcm9jZXNzb3IgKi8KKwlHVUVTVF9IQU5ETEUoeGVuX3Byb2Nlc3Nvcl9jeCkgc3RhdGVzOyAvKiBzdXBwb3J0ZWQgYyBzdGF0ZXMgKi8KK307CisKK3N0cnVjdCB4ZW5fcGN0X3JlZ2lzdGVyIHsKKwl1aW50OF90ICBkZXNjcmlwdG9yOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90ICBzcGFjZV9pZDsKKwl1aW50OF90ICBiaXRfd2lkdGg7CisJdWludDhfdCAgYml0X29mZnNldDsKKwl1aW50OF90ICByZXNlcnZlZDsKKwl1aW50NjRfdCBhZGRyZXNzOworfTsKKworc3RydWN0IHhlbl9wcm9jZXNzb3JfcHggeworCXVpbnQ2NF90IGNvcmVfZnJlcXVlbmN5OyAvKiBtZWdhaGVydHogKi8KKwl1aW50NjRfdCBwb3dlcjsgICAgICAvKiBtaWxsaVdhdHRzICovCisJdWludDY0X3QgdHJhbnNpdGlvbl9sYXRlbmN5OyAvKiBtaWNyb3NlY29uZHMgKi8KKwl1aW50NjRfdCBidXNfbWFzdGVyX2xhdGVuY3k7IC8qIG1pY3Jvc2Vjb25kcyAqLworCXVpbnQ2NF90IGNvbnRyb2w7ICAgICAgICAvKiBjb250cm9sIHZhbHVlICovCisJdWludDY0X3Qgc3RhdHVzOyAgICAgLyogc3VjY2VzcyBpbmRpY2F0b3IgKi8KK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5fcHJvY2Vzc29yX3B4KTsKKworc3RydWN0IHhlbl9wc2RfcGFja2FnZSB7CisJdWludDY0X3QgbnVtX2VudHJpZXM7CisJdWludDY0X3QgcmV2aXNpb247CisJdWludDY0X3QgZG9tYWluOworCXVpbnQ2NF90IGNvb3JkX3R5cGU7CisJdWludDY0X3QgbnVtX3Byb2Nlc3NvcnM7Cit9OworCitzdHJ1Y3QgeGVuX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSB7CisJdWludDMyX3QgZmxhZ3M7ICAgICAvKiBmbGFnIGZvciBQeCBzdWIgaW5mbyB0eXBlICovCisJdWludDMyX3QgcGxhdGZvcm1fbGltaXQ7ICAvKiBQbGF0Zm9ybSBsaW1pdGF0aW9uIG9uIGZyZXEgdXNhZ2UgKi8KKwlzdHJ1Y3QgeGVuX3BjdF9yZWdpc3RlciBjb250cm9sX3JlZ2lzdGVyOworCXN0cnVjdCB4ZW5fcGN0X3JlZ2lzdGVyIHN0YXR1c19yZWdpc3RlcjsKKwl1aW50MzJfdCBzdGF0ZV9jb3VudDsgICAgIC8qIHRvdGFsIGF2YWlsYWJsZSBwZXJmb3JtYW5jZSBzdGF0ZXMgKi8KKwlHVUVTVF9IQU5ETEUoeGVuX3Byb2Nlc3Nvcl9weCkgc3RhdGVzOworCXN0cnVjdCB4ZW5fcHNkX3BhY2thZ2UgZG9tYWluX2luZm87CisJdWludDMyX3Qgc2hhcmVkX3R5cGU7ICAgICAvKiBjb29yZGluYXRpb24gdHlwZSBvZiB0aGlzIHByb2Nlc3NvciAqLworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbl9wcm9jZXNzb3JfcGVyZm9ybWFuY2UpOworCitzdHJ1Y3QgeGVucGZfc2V0X3Byb2Nlc3Nvcl9wbWluZm8geworCS8qIElOIHZhcmlhYmxlcyAqLworCXVpbnQzMl90IGlkOyAgICAvKiBBQ1BJIENQVSBJRCAqLworCXVpbnQzMl90IHR5cGU7ICAvKiB7WEVOX1BNX0NYLCBYRU5fUE1fUFh9ICovCisJdW5pb24geworCQlzdHJ1Y3QgeGVuX3Byb2Nlc3Nvcl9wb3dlciAgICAgICAgICBwb3dlcjsvKiBDeDogX0NTVC9fQ1NEICovCisJCXN0cnVjdCB4ZW5fcHJvY2Vzc29yX3BlcmZvcm1hbmNlICAgIHBlcmY7IC8qIFB4OiBfUFBDL19QQ1QvX1BTUy9fUFNEICovCisJfTsKK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5wZl9zZXRfcHJvY2Vzc29yX3BtaW5mbyk7CisKK3N0cnVjdCB4ZW5fcGxhdGZvcm1fb3AgeworCXVpbnQzMl90IGNtZDsKKwl1aW50MzJfdCBpbnRlcmZhY2VfdmVyc2lvbjsgLyogWEVOUEZfSU5URVJGQUNFX1ZFUlNJT04gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB4ZW5wZl9zZXR0aW1lICAgICAgICAgICBzZXR0aW1lOworCQlzdHJ1Y3QgeGVucGZfYWRkX21lbXR5cGUgICAgICAgYWRkX21lbXR5cGU7CisJCXN0cnVjdCB4ZW5wZl9kZWxfbWVtdHlwZSAgICAgICBkZWxfbWVtdHlwZTsKKwkJc3RydWN0IHhlbnBmX3JlYWRfbWVtdHlwZSAgICAgIHJlYWRfbWVtdHlwZTsKKwkJc3RydWN0IHhlbnBmX21pY3JvY29kZV91cGRhdGUgIG1pY3JvY29kZTsKKwkJc3RydWN0IHhlbnBmX3BsYXRmb3JtX3F1aXJrICAgIHBsYXRmb3JtX3F1aXJrOworCQlzdHJ1Y3QgeGVucGZfZmlybXdhcmVfaW5mbyAgICAgZmlybXdhcmVfaW5mbzsKKwkJc3RydWN0IHhlbnBmX2VudGVyX2FjcGlfc2xlZXAgIGVudGVyX2FjcGlfc2xlZXA7CisJCXN0cnVjdCB4ZW5wZl9jaGFuZ2VfZnJlcSAgICAgICBjaGFuZ2VfZnJlcTsKKwkJc3RydWN0IHhlbnBmX2dldGlkbGV0aW1lICAgICAgIGdldGlkbGV0aW1lOworCQlzdHJ1Y3QgeGVucGZfc2V0X3Byb2Nlc3Nvcl9wbWluZm8gc2V0X3BtaW5mbzsKKwkJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgIHBhZFsxMjhdOworCX0gdTsKK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5fcGxhdGZvcm1fb3BfdCk7CisKKyNlbmRpZiAvKiBfX1hFTl9QVUJMSUNfUExBVEZPUk1fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UveGVuLmggYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UveGVuLmgKaW5kZXggNmFjZDljZS4uNmE2ZTkxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3hlbi5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS94ZW4uaApAQCAtNDkyLDYgKzQ5Miw3IEBACiAvKiBUaGVzZSBmbGFncyBhcmUgcGFzc2VkIGluIHRoZSAnZmxhZ3MnIGZpZWxkIG9mIHN0YXJ0X2luZm9fdC4gKi8KICNkZWZpbmUgU0lGX1BSSVZJTEVHRUQgICAgKDE8PDApICAvKiBJcyB0aGUgZG9tYWluIHByaXZpbGVnZWQ/ICovCiAjZGVmaW5lIFNJRl9JTklURE9NQUlOICAgICgxPDwxKSAgLyogSXMgdGhpcyB0aGUgaW5pdGlhbCBjb250cm9sIGRvbWFpbj8gKi8KKyNkZWZpbmUgU0lGX1BNX01BU0sgICAgICAgKDB4RkY8PDgpIC8qIHJlc2VydmUgMSBieXRlIGZvciB4ZW4tcG0gb3B0aW9ucyAqLwogCiB0eXBlZGVmIHVpbnQ2NF90IGNwdW1hcF90OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi94ZW5idXMuaCBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCmluZGV4IGFjZWVjYTcuLmIxYjY2NzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL3hlbmJ1cy5oCisrKyBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTU2LDkgKzE1Nyw5IEBACiAJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHNjYW5mLCA0LCA1KSkpOwogCiAvKiBTaW5nbGUgcHJpbnRmIGFuZCB3cml0ZTogcmV0dXJucyAtZXJybm8gb3IgMC4gKi8KK19fcHJpbnRmKDQsIDUpCiBpbnQgeGVuYnVzX3ByaW50ZihzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHQsCi0JCSAgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpub2RlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCA0LCA1KSkpOworCQkgIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqbm9kZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAvKiBHZW5lcmljIHJlYWQgZnVuY3Rpb246IE5VTEwtdGVybWluYXRlZCB0cmlwbGVzIG9mIG5hbWUsCiAgKiBzcHJpbnRmLXN0eWxlIHR5cGUgc3RyaW5nLCBhbmQgcG9pbnRlci4gUmV0dXJucyAwIG9yIGVycm5vLiovCkBAIC0yMDAsMTEgKzIwMSwxMSBAQAogCQkgICAgICBzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKIAkJICAgICAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgeGVuYnVzX3dhdGNoICosCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCkpOworX19wcmludGYoNCwgNSkKIGludCB4ZW5idXNfd2F0Y2hfcGF0aGZtdChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LCBzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKIAkJCSB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB4ZW5idXNfd2F0Y2ggKiwKIAkJCQkJICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQpLAotCQkJIGNvbnN0IGNoYXIgKnBhdGhmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDQsIDUpKSk7CisJCQkgY29uc3QgY2hhciAqcGF0aGZtdCwgLi4uKTsKIAogaW50IHhlbmJ1c19zd2l0Y2hfc3RhdGUoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwgZW51bSB4ZW5idXNfc3RhdGUgbmV3X3N0YXRlKTsKIGludCB4ZW5idXNfZ3JhbnRfcmluZyhzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHJpbmdfbWZuKTsKQEAgLTIyMyw5ICsyMjQsOSBAQAogCiBlbnVtIHhlbmJ1c19zdGF0ZSB4ZW5idXNfcmVhZF9kcml2ZXJfc3RhdGUoY29uc3QgY2hhciAqcGF0aCk7CiAKLV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDMsIDQpKSkKK19fcHJpbnRmKDMsIDQpCiB2b2lkIHhlbmJ1c19kZXZfZXJyb3Ioc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwgaW50IGVyciwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKQorX19wcmludGYoMywgNCkKIHZvaWQgeGVuYnVzX2Rldl9mYXRhbChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LCBpbnQgZXJyLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIGNvbnN0IGNoYXIgKnhlbmJ1c19zdHJzdGF0ZShlbnVtIHhlbmJ1c19zdGF0ZSBzdGF0ZSk7CmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggMzFiYTBmZC4uNDMyOThmOSAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtOTQ3LDcgKzk0Nyw3IEBACiBjb25maWcgU1lTQ1RMX1NZU0NBTEwKIAlib29sICJTeXNjdGwgc3lzY2FsbCBzdXBwb3J0IiBpZiBFWFBFUlQKIAlkZXBlbmRzIG9uIFBST0NfU1lTQ1RMCi0JZGVmYXVsdCB5CisJZGVmYXVsdCBuCiAJc2VsZWN0IFNZU0NUTAogCS0tLWhlbHAtLS0KIAkgIHN5c19zeXNjdGwgdXNlcyBiaW5hcnkgcGF0aHMgdGhhdCBoYXZlIGJlZW4gZm91bmQgY2hhbGxlbmdpbmcKQEAgLTk1OSw3ICs5NTksNyBAQAogCSAgdHJ5aW5nIHRvIHNhdmUgc29tZSBzcGFjZSBpdCBpcyBwcm9iYWJseSBzYWZlIHRvIGRpc2FibGUgdGhpcywKIAkgIG1ha2luZyB5b3VyIGtlcm5lbCBtYXJnaW5hbGx5IHNtYWxsZXIuCiAKLQkgIElmIHVuc3VyZSBzYXkgWSBoZXJlLgorCSAgSWYgdW5zdXJlIHNheSBOIGhlcmUuCiAKIGNvbmZpZyBLQUxMU1lNUwogCSBib29sICJMb2FkIGFsbCBzeW1ib2xzIGZvciBkZWJ1Z2dpbmcva3N5bW9vcHMiIGlmIEVYUEVSVApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuYyBiL2luaXQvZG9fbW91bnRzLmMKaW5kZXggYzA4NTFhOC4uMGY2ZTFkOSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHMuYworKysgYi9pbml0L2RvX21vdW50cy5jCkBAIC0yOCw3ICsyOCw3IEBACiBpbnQgcm9vdF9tb3VudGZsYWdzID0gTVNfUkRPTkxZIHwgTVNfU0lMRU5UOwogc3RhdGljIGNoYXIgKiBfX2luaXRkYXRhIHJvb3RfZGV2aWNlX25hbWU7CiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIHNhdmVkX3Jvb3RfbmFtZVs2NF07Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgcm9vdF93YWl0Oworc3RhdGljIGludCByb290X3dhaXQ7CiAKIGRldl90IFJPT1RfREVWOwogCkBAIC04NSwxMiArODUsMTUgQEAKIAogLyoqCiAgKiBkZXZ0X2Zyb21fcGFydHV1aWQgLSBsb29rcyB1cCB0aGUgZGV2X3Qgb2YgYSBwYXJ0aXRpb24gYnkgaXRzIFVVSUQKLSAqIEB1dWlkOgkzNiBieXRlIGNoYXIgYXJyYXkgY29udGFpbmluZyBhIGhleCBhc2NpaSBVVUlECisgKiBAdXVpZDoJbWluIDM2IGJ5dGUgY2hhciBhcnJheSBjb250YWluaW5nIGEgaGV4IGFzY2lpIFVVSUQKICAqCiAgKiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGZpcnN0IHBhcnRpdGlvbiB3aGljaCBjb250YWlucyBhIG1hdGNoaW5nCiAgKiBVVUlEIHZhbHVlIGluIGl0cyBwYXJ0aXRpb25fbWV0YV9pbmZvIHN0cnVjdC4gIFRoaXMgZG9lcyBub3Qgc2VhcmNoCiAgKiBieSBmaWxlc3lzdGVtIFVVSURzLgogICoKKyAqIElmIEB1dWlkIGlzIGZvbGxvd2VkIGJ5IGEgIi9QQVJUTlJPRkY9JWQiLCB0aGVuIHRoZSBudW1iZXIgd2lsbCBiZQorICogZXh0cmFjdGVkIGFuZCB1c2VkIGFzIGFuIG9mZnNldCBmcm9tIHRoZSBwYXJ0aXRpb24gaWRlbnRpZmllZCBieSB0aGUgVVVJRC4KKyAqCiAgKiBSZXR1cm5zIHRoZSBtYXRjaGluZyBkZXZfdCBvbiBzdWNjZXNzIG9yIDAgb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGRldl90IGRldnRfZnJvbV9wYXJ0dXVpZChjaGFyICp1dWlkX3N0cikKQEAgLTk4LDYgKzEwMSwyOCBAQAogCWRldl90IHJlcyA9IDA7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKIAl1OCB1dWlkWzE2XTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OworCWludCBvZmZzZXQgPSAwOworCisJaWYgKHN0cmxlbih1dWlkX3N0cikgPCAzNikKKwkJZ290byBkb25lOworCisJLyogQ2hlY2sgZm9yIG9wdGlvbmFsIHBhcnRpdGlvbiBudW1iZXIgb2Zmc2V0IGF0dHJpYnV0ZXMuICovCisJaWYgKHV1aWRfc3RyWzM2XSkgeworCQljaGFyIGMgPSAwOworCQkvKiBFeHBsaWNpdGx5IGZhaWwgb24gcG9vciBQQVJUVVVJRCBzeW50YXguICovCisJCWlmIChzc2NhbmYoJnV1aWRfc3RyWzM2XSwKKwkJCSAgICIvUEFSVE5ST0ZGPSVkJWMiLCAmb2Zmc2V0LCAmYykgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFBBUlRVVUlEPSBpcyBpbnZhbGlkLlxuIgorCQkJICJFeHBlY3RlZCBQQVJUVVVJRD08dmFsaWQtdXVpZC1pZD5bL1BBUlROUk9GRj0lJWRdXG4iKTsKKwkJCWlmIChyb290X3dhaXQpCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAiRGlzYWJsaW5nIHJvb3R3YWl0OyByb290PSBpcyBpbnZhbGlkLlxuIik7CisJCQlyb290X3dhaXQgPSAwOworCQkJZ290byBkb25lOworCQl9CisJfQogCiAJLyogUGFjayB0aGUgcmVxdWVzdGVkIFVVSUQgaW4gdGhlIGV4cGVjdGVkIGZvcm1hdC4gKi8KIAlwYXJ0X3BhY2tfdXVpZCh1dWlkX3N0ciwgdXVpZCk7CkBAIC0xMDcsOCArMTMyLDIxIEBACiAJCWdvdG8gZG9uZTsKIAogCXJlcyA9IGRldi0+ZGV2dDsKLQlwdXRfZGV2aWNlKGRldik7CiAKKwkvKiBBdHRlbXB0IHRvIGZpbmQgdGhlIHBhcnRpdGlvbiBieSBvZmZzZXQuICovCisJaWYgKCFvZmZzZXQpCisJCWdvdG8gbm9fb2Zmc2V0OworCisJcmVzID0gMDsKKwlkaXNrID0gcGFydF90b19kaXNrKGRldl90b19wYXJ0KGRldikpOworCXBhcnQgPSBkaXNrX2dldF9wYXJ0KGRpc2ssIGRldl90b19wYXJ0KGRldiktPnBhcnRubyArIG9mZnNldCk7CisJaWYgKHBhcnQpIHsKKwkJcmVzID0gcGFydF9kZXZ0KHBhcnQpOworCQlwdXRfZGV2aWNlKHBhcnRfdG9fZGV2KHBhcnQpKTsKKwl9CisKK25vX29mZnNldDoKKwlwdXRfZGV2aWNlKGRldik7CiBkb25lOgogCXJldHVybiByZXM7CiB9CkBAIC0xMjYsNiArMTY0LDggQEAKICAqCSAgIHVzZWQgd2hlbiBkaXNrIG5hbWUgb2YgcGFydGl0aW9uZWQgZGlzayBlbmRzIG9uIGEgZGlnaXQuCiAgKgk2KSBQQVJUVVVJRD0wMDExMjIzMy00NDU1LTY2NzctODg5OS1BQUJCQ0NEREVFRkYgcmVwcmVzZW50aW5nIHRoZQogICoJICAgdW5pcXVlIGlkIG9mIGEgcGFydGl0aW9uIGlmIHRoZSBwYXJ0aXRpb24gdGFibGUgcHJvdmlkZXMgaXQuCisgKgk3KSBQQVJUVVVJRD08VVVJRD4vUEFSVE5ST0ZGPTxpbnQ+IHRvIHNlbGVjdCBhIHBhcnRpdGlvbiBpbiByZWxhdGlvbiB0bworICoJICAgYSBwYXJ0aXRpb24gd2l0aCBhIGtub3duIHVuaXF1ZSBpZC4KICAqCiAgKglJZiBuYW1lIGRvZXNuJ3QgaGF2ZSBmYWxsIGludG8gdGhlIGNhdGVnb3JpZXMgYWJvdmUsIHdlIHJldHVybiAoMCwwKS4KICAqCWJsb2NrX2NsYXNzIGlzIHVzZWQgdG8gY2hlY2sgaWYgc29tZXRoaW5nIGlzIGEgZGlzayBuYW1lLiBJZiB0aGUgZGlzawpAQCAtMTQzLDggKzE4Myw2IEBACiAjaWZkZWYgQ09ORklHX0JMT0NLCiAJaWYgKHN0cm5jbXAobmFtZSwgIlBBUlRVVUlEPSIsIDkpID09IDApIHsKIAkJbmFtZSArPSA5OwotCQlpZiAoc3RybGVuKG5hbWUpICE9IDM2KQotCQkJZ290byBmYWlsOwogCQlyZXMgPSBkZXZ0X2Zyb21fcGFydHV1aWQobmFtZSk7CiAJCWlmICghcmVzKQogCQkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHNfcmQuYyBiL2luaXQvZG9fbW91bnRzX3JkLmMKaW5kZXggZmU5YWNiMC4uODg3NjI5ZSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHNfcmQuYworKysgYi9pbml0L2RvX21vdW50c19yZC5jCkBAIC0xMjAsNiArMTIwLDIwIEBACiAJfQogCiAJLyoKKwkgKiBSZWFkIDUxMiBieXRlcyBmdXJ0aGVyIHRvIGNoZWNrIGlmIGNyYW1mcyBpcyBwYWRkZWQKKwkgKi8KKwlzeXNfbHNlZWsoZmQsIHN0YXJ0X2Jsb2NrICogQkxPQ0tfU0laRSArIDB4MjAwLCAwKTsKKwlzeXNfcmVhZChmZCwgYnVmLCBzaXplKTsKKworCWlmIChjcmFtZnNiLT5tYWdpYyA9PSBDUkFNRlNfTUFHSUMpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCSAgICAgICAiUkFNRElTSzogY3JhbWZzIGZpbGVzeXN0ZW0gZm91bmQgYXQgYmxvY2sgJWRcbiIsCisJCSAgICAgICBzdGFydF9ibG9jayk7CisJCW5ibG9ja3MgPSAoY3JhbWZzYi0+c2l6ZSArIEJMT0NLX1NJWkUgLSAxKSA+PiBCTE9DS19TSVpFX0JJVFM7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgogCSAqIFJlYWQgYmxvY2sgMSB0byB0ZXN0IGZvciBtaW5peCBhbmQgZXh0MiBzdXBlcmJsb2NrCiAJICovCiAJc3lzX2xzZWVrKGZkLCAoc3RhcnRfYmxvY2srMSkgKiBCTE9DS19TSVpFLCAwKTsKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggNjNmNWY2Zi4uMjE3ZWQyMyAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTUxMiw2ICs1MTIsOSBAQAogCXBhcnNlX2FyZ3MoIkJvb3Rpbmcga2VybmVsIiwgc3RhdGljX2NvbW1hbmRfbGluZSwgX19zdGFydF9fX3BhcmFtLAogCQkgICBfX3N0b3BfX19wYXJhbSAtIF9fc3RhcnRfX19wYXJhbSwKIAkJICAgJnVua25vd25fYm9vdG9wdGlvbik7CisKKwlqdW1wX2xhYmVsX2luaXQoKTsKKwogCS8qCiAJICogVGhlc2UgdXNlIGxhcmdlIGJvb3RtZW0gYWxsb2NhdGlvbnMgYW5kIG11c3QgcHJlY2VkZQogCSAqIGttZW1fY2FjaGVfaW5pdCgpCmRpZmYgLS1naXQgYS9pcGMvbXF1ZXVlLmMgYi9pcGMvbXF1ZXVlLmMKaW5kZXggZWQwNDllYS4uMmUwZWNmYyAxMDA2NDQKLS0tIGEvaXBjL21xdWV1ZS5jCisrKyBiL2lwYy9tcXVldWUuYwpAQCAtNDQ5LDggKzQ0OSw4IEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQl0aW1lID0gc2NoZWR1bGVfaHJ0aW1lb3V0X3JhbmdlX2Nsb2NrKHRpbWVvdXQsCi0JCSAgICBIUlRJTUVSX01PREVfQUJTLCAwLCBDTE9DS19SRUFMVElNRSk7CisJCXRpbWUgPSBzY2hlZHVsZV9ocnRpbWVvdXRfcmFuZ2VfY2xvY2sodGltZW91dCwgMCwKKwkJCUhSVElNRVJfTU9ERV9BQlMsIENMT0NLX1JFQUxUSU1FKTsKIAogCQl3aGlsZSAoZXdwLT5zdGF0ZSA9PSBTVEFURV9QRU5ESU5HKQogCQkJY3B1X3JlbGF4KCk7CmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggYzhlMDBmOC4uNTIxNWE4MSAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtOTAsNiArOTAsNTIgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgInV0aWwuaCIKIAorLyogT25lIHNlbWFwaG9yZSBzdHJ1Y3R1cmUgZm9yIGVhY2ggc2VtYXBob3JlIGluIHRoZSBzeXN0ZW0uICovCitzdHJ1Y3Qgc2VtIHsKKwlpbnQJc2VtdmFsOwkJLyogY3VycmVudCB2YWx1ZSAqLworCWludAlzZW1waWQ7CQkvKiBwaWQgb2YgbGFzdCBvcGVyYXRpb24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNlbV9wZW5kaW5nOyAvKiBwZW5kaW5nIHNpbmdsZS1zb3Agb3BlcmF0aW9ucyAqLworfTsKKworLyogT25lIHF1ZXVlIGZvciBlYWNoIHNsZWVwaW5nIHByb2Nlc3MgaW4gdGhlIHN5c3RlbS4gKi8KK3N0cnVjdCBzZW1fcXVldWUgeworCXN0cnVjdCBsaXN0X2hlYWQJc2ltcGxlX2xpc3Q7IC8qIHF1ZXVlIG9mIHBlbmRpbmcgb3BlcmF0aW9ucyAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJIC8qIHF1ZXVlIG9mIHBlbmRpbmcgb3BlcmF0aW9ucyAqLworCXN0cnVjdCB0YXNrX3N0cnVjdAkqc2xlZXBlcjsgLyogdGhpcyBwcm9jZXNzICovCisJc3RydWN0IHNlbV91bmRvCQkqdW5kbzsJIC8qIHVuZG8gc3RydWN0dXJlICovCisJaW50CQkJcGlkOwkgLyogcHJvY2VzcyBpZCBvZiByZXF1ZXN0aW5nIHByb2Nlc3MgKi8KKwlpbnQJCQlzdGF0dXM7CSAvKiBjb21wbGV0aW9uIHN0YXR1cyBvZiBvcGVyYXRpb24gKi8KKwlzdHJ1Y3Qgc2VtYnVmCQkqc29wczsJIC8qIGFycmF5IG9mIHBlbmRpbmcgb3BlcmF0aW9ucyAqLworCWludAkJCW5zb3BzOwkgLyogbnVtYmVyIG9mIG9wZXJhdGlvbnMgKi8KKwlpbnQJCQlhbHRlcjsJIC8qIGRvZXMgKnNvcHMgYWx0ZXIgdGhlIGFycmF5PyAqLworfTsKKworLyogRWFjaCB0YXNrIGhhcyBhIGxpc3Qgb2YgdW5kbyByZXF1ZXN0cy4gVGhleSBhcmUgZXhlY3V0ZWQgYXV0b21hdGljYWxseQorICogd2hlbiB0aGUgcHJvY2VzcyBleGl0cy4KKyAqLworc3RydWN0IHNlbV91bmRvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3RfcHJvYzsJLyogcGVyLXByb2Nlc3MgbGlzdDogKgorCQkJCQkJICogYWxsIHVuZG9zIGZyb20gb25lIHByb2Nlc3MKKwkJCQkJCSAqIHJjdSBwcm90ZWN0ZWQgKi8KKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsJCS8qIHJjdSBzdHJ1Y3QgZm9yIHNlbV91bmRvICovCisJc3RydWN0IHNlbV91bmRvX2xpc3QJKnVscDsJCS8qIGJhY2sgcHRyIHRvIHNlbV91bmRvX2xpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3RfaWQ7CS8qIHBlciBzZW1hcGhvcmUgYXJyYXkgbGlzdDoKKwkJCQkJCSAqIGFsbCB1bmRvcyBmb3Igb25lIGFycmF5ICovCisJaW50CQkJc2VtaWQ7CQkvKiBzZW1hcGhvcmUgc2V0IGlkZW50aWZpZXIgKi8KKwlzaG9ydAkJCSpzZW1hZGo7CS8qIGFycmF5IG9mIGFkanVzdG1lbnRzICovCisJCQkJCQkvKiBvbmUgcGVyIHNlbWFwaG9yZSAqLworfTsKKworLyogc2VtX3VuZG9fbGlzdCBjb250cm9scyBzaGFyZWQgYWNjZXNzIHRvIHRoZSBsaXN0IG9mIHNlbV91bmRvIHN0cnVjdHVyZXMKKyAqIHRoYXQgbWF5IGJlIHNoYXJlZCBhbW9uZyBhbGwgYSBDTE9ORV9TWVNWU0VNIHRhc2sgZ3JvdXAuCisgKi8KK3N0cnVjdCBzZW1fdW5kb19saXN0IHsKKwlhdG9taWNfdAkJcmVmY250OworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0X3Byb2M7Cit9OworCisKICNkZWZpbmUgc2VtX2lkcyhucykJKChucyktPmlkc1tJUENfU0VNX0lEU10pCiAKICNkZWZpbmUgc2VtX3VubG9jayhzbWEpCQlpcGNfdW5sb2NrKCYoc21hKS0+c2VtX3Blcm0pCkBAIC0xNDI2LDYgKzE0NzIsOCBAQAogCiAJcXVldWUuc3RhdHVzID0gLUVJTlRSOwogCXF1ZXVlLnNsZWVwZXIgPSBjdXJyZW50OworCitzbGVlcF9hZ2FpbjoKIAljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKIAlzZW1fdW5sb2NrKHNtYSk7CiAKQEAgLTE0NjAsNyArMTUwOCw2IEBACiAJICogQXJyYXkgcmVtb3ZlZD8gSWYgeWVzLCBsZWF2ZSB3aXRob3V0IHNlbV91bmxvY2soKS4KIAkgKi8KIAlpZiAoSVNfRVJSKHNtYSkpIHsKLQkJZXJyb3IgPSAtRUlEUk07CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCkBAIC0xNDc5LDYgKzE1MjYsMTMgQEAKIAkgKi8KIAlpZiAodGltZW91dCAmJiBqaWZmaWVzX2xlZnQgPT0gMCkKIAkJZXJyb3IgPSAtRUFHQUlOOworCisJLyoKKwkgKiBJZiB0aGUgd2FrZXVwIHdhcyBzcHVyaW91cywganVzdCByZXRyeQorCSAqLworCWlmIChlcnJvciA9PSAtRUlOVFIgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlnb3RvIHNsZWVwX2FnYWluOworCiAJdW5saW5rX3F1ZXVlKHNtYSwgJnF1ZXVlKTsKIAogb3V0X3VubG9ja19mcmVlOgpkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IDJkYTQ4ZDMuLmU4OThjNWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTEwMSw2ICsxMDEsNyBAQAogb2JqLSQoQ09ORklHX1RSQUNFUE9JTlRTKSArPSB0cmFjZS8KIG9iai0kKENPTkZJR19TTVApICs9IHNjaGVkX2NwdXByaS5vCiBvYmotJChDT05GSUdfSVJRX1dPUkspICs9IGlycV93b3JrLm8KK29iai0kKENPTkZJR19DUFVfUE0pICs9IGNwdV9wbS5vCiAKIG9iai0kKENPTkZJR19QRVJGX0VWRU5UUykgKz0gZXZlbnRzLwogCmRpZmYgLS1naXQgYS9rZXJuZWwvYXN5bmMuYyBiL2tlcm5lbC9hc3luYy5jCmluZGV4IDRjMjg0M2MuLjgwYjc0Yjg4IDEwMDY0NAotLS0gYS9rZXJuZWwvYXN5bmMuYworKysgYi9rZXJuZWwvYXN5bmMuYwpAQCAtNTEsNyArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IDBhMTM1NWMuLjA5ZmFlMjYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0c2MuYyBiL2tlcm5lbC9hdWRpdHNjLmMKaW5kZXggY2U0YjA1NC4uNDdiN2ZjMSAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0c2MuYworKysgYi9rZXJuZWwvYXVkaXRzYy5jCkBAIC00OCw3ICs0OCw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvY2FwYWJpbGl0eS5jIGIva2VybmVsL2NhcGFiaWxpdHkuYwppbmRleCAyODNjNTI5Li5iNDYzODcxIDEwMDY0NAotLS0gYS9rZXJuZWwvY2FwYWJpbGl0eS5jCisrKyBiL2tlcm5lbC9jYXBhYmlsaXR5LmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwLmMKaW5kZXggNDUzMTAwYS4uZDlkNTY0OCAxMDA2NDQKLS0tIGEva2VybmVsL2Nncm91cC5jCisrKyBiL2tlcm5lbC9jZ3JvdXAuYwpAQCAtMjAyNyw3ICsyMDI3LDcgQEAKIAkJZ290byBvdXRfZnJlZV9ncm91cF9saXN0OwogCiAJLyogcHJldmVudCBjaGFuZ2VzIHRvIHRoZSB0aHJlYWRncm91cCBsaXN0IHdoaWxlIHdlIHRha2UgYSBzbmFwc2hvdC4gKi8KLQlyY3VfcmVhZF9sb2NrKCk7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIobGVhZGVyKSkgewogCQkvKgogCQkgKiBhIHJhY2Ugd2l0aCBkZV90aHJlYWQgZnJvbSBhbm90aGVyIHRocmVhZCdzIGV4ZWMoKSBtYXkgc3RyaXAKQEAgLTIwMzYsNyArMjAzNiw3IEBACiAJCSAqIHRocm93IHRoaXMgdGFzayBhd2F5IGFuZCB0cnkgYWdhaW4gKGZyb20gY2dyb3VwX3Byb2NzX3dyaXRlKTsKIAkJICogdGhpcyBpcyAiZG91YmxlLWRvdWJsZS10b2lsLWFuZC10cm91YmxlLWNoZWNrIGxvY2tpbmciLgogCQkgKi8KLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAkJcmV0dmFsID0gLUVBR0FJTjsKIAkJZ290byBvdXRfZnJlZV9ncm91cF9saXN0OwogCX0KQEAgLTIwNTcsNyArMjA1Nyw3IEBACiAJfSB3aGlsZV9lYWNoX3RocmVhZChsZWFkZXIsIHRzayk7CiAJLyogcmVtZW1iZXIgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBhcnJheSBmb3IgbGF0ZXIuICovCiAJZ3JvdXBfc2l6ZSA9IGk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCiAJLyoKIAkgKiBzdGVwIDE6IGNoZWNrIHRoYXQgd2UgY2FuIGxlZ2l0aW1hdGVseSBhdHRhY2ggdG8gdGhlIGNncm91cC4KQEAgLTIxMzUsMTQgKzIxMzUsMTcgQEAKIAkJb2xkY2dycCA9IHRhc2tfY2dyb3VwX2Zyb21fcm9vdCh0c2ssIHJvb3QpOwogCQlpZiAoY2dycCA9PSBvbGRjZ3JwKQogCQkJY29udGludWU7Ci0JCS8qIGF0dGFjaCBlYWNoIHRhc2sgdG8gZWFjaCBzdWJzeXN0ZW0gKi8KLQkJZm9yX2VhY2hfc3Vic3lzKHJvb3QsIHNzKSB7Ci0JCQlpZiAoc3MtPmF0dGFjaF90YXNrKQotCQkJCXNzLT5hdHRhY2hfdGFzayhjZ3JwLCB0c2spOwotCQl9CiAJCS8qIGlmIHRoZSB0aHJlYWQgaXMgUEZfRVhJVElORywgaXQgY2FuIGp1c3QgZ2V0IHNraXBwZWQuICovCiAJCXJldHZhbCA9IGNncm91cF90YXNrX21pZ3JhdGUoY2dycCwgb2xkY2dycCwgdHNrLCB0cnVlKTsKLQkJQlVHX09OKHJldHZhbCAhPSAwICYmIHJldHZhbCAhPSAtRVNSQ0gpOworCQlpZiAocmV0dmFsID09IDApIHsKKwkJCS8qIGF0dGFjaCBlYWNoIHRhc2sgdG8gZWFjaCBzdWJzeXN0ZW0gKi8KKwkJCWZvcl9lYWNoX3N1YnN5cyhyb290LCBzcykgeworCQkJCWlmIChzcy0+YXR0YWNoX3Rhc2spCisJCQkJCXNzLT5hdHRhY2hfdGFzayhjZ3JwLCB0c2spOworCQkJfQorCQl9IGVsc2UgeworCQkJQlVHX09OKHJldHZhbCAhPSAtRVNSQ0gpOworCQl9CiAJfQogCS8qIG5vdGhpbmcgaXMgc2Vuc2l0aXZlIHRvIGZvcmsoKSBhZnRlciB0aGlzIHBvaW50LiAqLwogCkBAIC00ODgwLDkgKzQ4ODMsOSBAQAogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKGlkLT5jc3MsIE5VTEwpOwogCXJjdV9hc3NpZ25fcG9pbnRlcihjc3MtPmlkLCBOVUxMKTsKLQlzcGluX2xvY2soJnNzLT5pZF9sb2NrKTsKKwl3cml0ZV9sb2NrKCZzcy0+aWRfbG9jayk7CiAJaWRyX3JlbW92ZSgmc3MtPmlkciwgaWQtPmlkKTsKLQlzcGluX3VubG9jaygmc3MtPmlkX2xvY2spOworCXdyaXRlX3VubG9jaygmc3MtPmlkX2xvY2spOwogCWtmcmVlX3JjdShpZCwgcmN1X2hlYWQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9jc3NfaWQpOwpAQCAtNDkwOCwxMCArNDkxMSwxMCBAQAogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dDsKIAl9Ci0Jc3Bpbl9sb2NrKCZzcy0+aWRfbG9jayk7CisJd3JpdGVfbG9jaygmc3MtPmlkX2xvY2spOwogCS8qIERvbid0IHVzZSAwLiBhbGxvY2F0ZXMgYW4gSUQgb2YgMS02NTUzNSAqLwogCWVycm9yID0gaWRyX2dldF9uZXdfYWJvdmUoJnNzLT5pZHIsIG5ld2lkLCAxLCAmbXlpZCk7Ci0Jc3Bpbl91bmxvY2soJnNzLT5pZF9sb2NrKTsKKwl3cml0ZV91bmxvY2soJnNzLT5pZF9sb2NrKTsKIAogCS8qIFJldHVybnMgZXJyb3Igd2hlbiB0aGVyZSBhcmUgbm8gZnJlZSBzcGFjZXMgZm9yIG5ldyBJRC4qLwogCWlmIChlcnJvcikgewpAQCAtNDkyNiw5ICs0OTI5LDkgQEAKIAlyZXR1cm4gbmV3aWQ7CiByZW1vdmVfaWRyOgogCWVycm9yID0gLUVOT1NQQzsKLQlzcGluX2xvY2soJnNzLT5pZF9sb2NrKTsKKwl3cml0ZV9sb2NrKCZzcy0+aWRfbG9jayk7CiAJaWRyX3JlbW92ZSgmc3MtPmlkciwgbXlpZCk7Ci0Jc3Bpbl91bmxvY2soJnNzLT5pZF9sb2NrKTsKKwl3cml0ZV91bmxvY2soJnNzLT5pZF9sb2NrKTsKIGVycl9vdXQ6CiAJa2ZyZWUobmV3aWQpOwogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKQEAgLTQ5NDAsNyArNDk0Myw3IEBACiB7CiAJc3RydWN0IGNzc19pZCAqbmV3aWQ7CiAKLQlzcGluX2xvY2tfaW5pdCgmc3MtPmlkX2xvY2spOworCXJ3bG9ja19pbml0KCZzcy0+aWRfbG9jayk7CiAJaWRyX2luaXQoJnNzLT5pZHIpOwogCiAJbmV3aWQgPSBnZXRfbmV3X2Nzc2lkKHNzLCAwKTsKQEAgLTUwMzUsOSArNTAzOCw5IEBACiAJCSAqIHNjYW4gbmV4dCBlbnRyeSBmcm9tIGJpdG1hcCh0cmVlKSwgdG1waWQgaXMgdXBkYXRlZCBhZnRlcgogCQkgKiBpZHJfZ2V0X25leHQoKS4KIAkJICovCi0JCXNwaW5fbG9jaygmc3MtPmlkX2xvY2spOworCQlyZWFkX2xvY2soJnNzLT5pZF9sb2NrKTsKIAkJdG1wID0gaWRyX2dldF9uZXh0KCZzcy0+aWRyLCAmdG1waWQpOwotCQlzcGluX3VubG9jaygmc3MtPmlkX2xvY2spOworCQlyZWFkX3VubG9jaygmc3MtPmlkX2xvY2spOwogCiAJCWlmICghdG1wKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwX2ZyZWV6ZXIuYyBiL2tlcm5lbC9jZ3JvdXBfZnJlZXplci5jCmluZGV4IGU2OTE4MTguLjVlODI4YTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXBfZnJlZXplci5jCisrKyBiL2tlcm5lbC9jZ3JvdXBfZnJlZXplci5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IGUyNDM1ZWUuLmYzNDZjZWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4LXRpbWVycy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1LmMgYi9rZXJuZWwvY3B1LmMKaW5kZXggMTJiNzQ1OC4uNTYzZjEzNiAxMDA2NDQKLS0tIGEva2VybmVsL2NwdS5jCisrKyBiL2tlcm5lbC9jcHUuYwpAQCAtMTAsMTEgKzEwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpZmRlZiBDT05GSUdfU01QCiAvKiBTZXJpYWxpemVzIHRoZSB1cGRhdGVzIHRvIGNwdV9vbmxpbmVfbWFzaywgY3B1X3ByZXNlbnRfbWFzayAqLwpAQCAtNDc2LDYgKzQ3Nyw3OSBAQAogCXJldHVybiAwOwogfQogY29yZV9pbml0Y2FsbChhbGxvY19mcm96ZW5fY3B1cyk7CisKKy8qCisgKiBQcmV2ZW50IHJlZ3VsYXIgQ1BVIGhvdHBsdWcgZnJvbSByYWNpbmcgd2l0aCB0aGUgZnJlZXplciwgYnkgZGlzYWJsaW5nIENQVQorICogaG90cGx1ZyB3aGVuIHRhc2tzIGFyZSBhYm91dCB0byBiZSBmcm96ZW4uIEFsc28sIGRvbid0IGFsbG93IHRoZSBmcmVlemVyCisgKiB0byBjb250aW51ZSB1bnRpbCBhbnkgY3VycmVudGx5IHJ1bm5pbmcgQ1BVIGhvdHBsdWcgb3BlcmF0aW9uIGdldHMKKyAqIGNvbXBsZXRlZC4KKyAqIFRvIG1vZGlmeSB0aGUgJ2NwdV9ob3RwbHVnX2Rpc2FibGVkJyBmbGFnLCB3ZSBuZWVkIHRvIGFjcXVpcmUgdGhlCisgKiAnY3B1X2FkZF9yZW1vdmVfbG9jaycuIEFuZCB0aGlzIHNhbWUgbG9jayBpcyBhbHNvIHRha2VuIGJ5IHRoZSByZWd1bGFyCisgKiBDUFUgaG90cGx1ZyBwYXRoIGFuZCByZWxlYXNlZCBvbmx5IGFmdGVyIGl0IGlzIGNvbXBsZXRlLiBUaHVzLCB3ZQorICogKGFuZCBoZW5jZSB0aGUgZnJlZXplcikgd2lsbCBibG9jayBoZXJlIHVudGlsIGFueSBjdXJyZW50bHkgcnVubmluZyBDUFUKKyAqIGhvdHBsdWcgb3BlcmF0aW9uIGdldHMgY29tcGxldGVkLgorICovCit2b2lkIGNwdV9ob3RwbHVnX2Rpc2FibGVfYmVmb3JlX2ZyZWV6ZSh2b2lkKQoreworCWNwdV9tYXBzX3VwZGF0ZV9iZWdpbigpOworCWNwdV9ob3RwbHVnX2Rpc2FibGVkID0gMTsKKwljcHVfbWFwc191cGRhdGVfZG9uZSgpOworfQorCisKKy8qCisgKiBXaGVuIHRhc2tzIGhhdmUgYmVlbiB0aGF3ZWQsIHJlLWVuYWJsZSByZWd1bGFyIENQVSBob3RwbHVnICh3aGljaCBoYWQgYmVlbgorICogZGlzYWJsZWQgd2hpbGUgYmVnaW5uaW5nIHRvIGZyZWV6ZSB0YXNrcykuCisgKi8KK3ZvaWQgY3B1X2hvdHBsdWdfZW5hYmxlX2FmdGVyX3RoYXcodm9pZCkKK3sKKwljcHVfbWFwc191cGRhdGVfYmVnaW4oKTsKKwljcHVfaG90cGx1Z19kaXNhYmxlZCA9IDA7CisJY3B1X21hcHNfdXBkYXRlX2RvbmUoKTsKK30KKworLyoKKyAqIFdoZW4gY2FsbGJhY2tzIGZvciBDUFUgaG90cGx1ZyBub3RpZmljYXRpb25zIGFyZSBiZWluZyBleGVjdXRlZCwgd2UgbXVzdAorICogZW5zdXJlIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gd2l0aCByZXNwZWN0IHRvIHRoZSB0YXNrcyBiZWluZyBmcm96ZW4KKyAqIG9yIG5vdCwgYXMgcmVwb3J0ZWQgYnkgdGhlIG5vdGlmaWNhdGlvbiwgcmVtYWlucyB1bmNoYW5nZWQgKnRocm91Z2hvdXQgdGhlCisgKiBkdXJhdGlvbiogb2YgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbGJhY2tzLgorICogSGVuY2Ugd2UgbmVlZCB0byBwcmV2ZW50IHRoZSBmcmVlemVyIGZyb20gcmFjaW5nIHdpdGggcmVndWxhciBDUFUgaG90cGx1Zy4KKyAqCisgKiBUaGlzIHN5bmNocm9uaXphdGlvbiBpcyBpbXBsZW1lbnRlZCBieSBtdXR1YWxseSBleGNsdWRpbmcgcmVndWxhciBDUFUKKyAqIGhvdHBsdWcgYW5kIFN1c3BlbmQvSGliZXJuYXRlIGNhbGwgcGF0aHMgYnkgaG9va2luZyBvbnRvIHRoZSBTdXNwZW5kLworICogSGliZXJuYXRlIG5vdGlmaWNhdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK2NwdV9ob3RwbHVnX3BtX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqcHRyKQoreworCXN3aXRjaCAoYWN0aW9uKSB7CisKKwljYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKKwljYXNlIFBNX0hJQkVSTkFUSU9OX1BSRVBBUkU6CisJCWNwdV9ob3RwbHVnX2Rpc2FibGVfYmVmb3JlX2ZyZWV6ZSgpOworCQlicmVhazsKKworCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgorCWNhc2UgUE1fUE9TVF9ISUJFUk5BVElPTjoKKwkJY3B1X2hvdHBsdWdfZW5hYmxlX2FmdGVyX3RoYXcoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworCitpbnQgY3B1X2hvdHBsdWdfcG1fc3luY19pbml0KHZvaWQpCit7CisJcG1fbm90aWZpZXIoY3B1X2hvdHBsdWdfcG1fY2FsbGJhY2ssIDApOworCXJldHVybiAwOworfQorY29yZV9pbml0Y2FsbChjcHVfaG90cGx1Z19wbV9zeW5jX2luaXQpOworCiAjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQX1NNUCAqLwogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVfcG0uYyBiL2tlcm5lbC9jcHVfcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDkxNTJlCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL2NwdV9wbS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgorICoKKyAqIEF1dGhvcjoKKyAqCUNvbGluIENyb3NzIDxjY3Jvc3NAYW5kcm9pZC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdV9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorCitzdGF0aWMgREVGSU5FX1JXTE9DSyhjcHVfcG1fbm90aWZpZXJfbG9jayk7CitzdGF0aWMgUkFXX05PVElGSUVSX0hFQUQoY3B1X3BtX25vdGlmaWVyX2NoYWluKTsKKworc3RhdGljIGludCBjcHVfcG1fbm90aWZ5KGVudW0gY3B1X3BtX2V2ZW50IGV2ZW50LCBpbnQgbnJfdG9fY2FsbCwgaW50ICpucl9jYWxscykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19yYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X3BtX25vdGlmaWVyX2NoYWluLCBldmVudCwgTlVMTCwKKwkJbnJfdG9fY2FsbCwgbnJfY2FsbHMpOworCisJcmV0dXJuIG5vdGlmaWVyX3RvX2Vycm5vKHJldCk7Cit9CisKKy8qKgorICogY3B1X3BtX3JlZ2lzdGVyX25vdGlmaWVyIC0gcmVnaXN0ZXIgYSBkcml2ZXIgd2l0aCBjcHVfcG0KKyAqIEBuYjogbm90aWZpZXIgYmxvY2sgdG8gcmVnaXN0ZXIKKyAqCisgKiBBZGQgYSBkcml2ZXIgdG8gYSBsaXN0IG9mIGRyaXZlcnMgdGhhdCBhcmUgbm90aWZpZWQgYWJvdXQKKyAqIENQVSBhbmQgQ1BVIGNsdXN0ZXIgbG93IHBvd2VyIGVudHJ5IGFuZCBleGl0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLCBhbmQgaGFzIHRoZSBzYW1lIHJldHVybiBjb25kaXRpb25zIGFzCisgKiByYXdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIuCisgKi8KK2ludCBjcHVfcG1fcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmNwdV9wbV9ub3RpZmllcl9sb2NrLCBmbGFncyk7CisJcmV0ID0gcmF3X25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZjcHVfcG1fbm90aWZpZXJfY2hhaW4sIG5iKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmY3B1X3BtX25vdGlmaWVyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfcG1fcmVnaXN0ZXJfbm90aWZpZXIpOworCisvKioKKyAqIGNwdV9wbV91bnJlZ2lzdGVyX25vdGlmaWVyIC0gdW5yZWdpc3RlciBhIGRyaXZlciB3aXRoIGNwdV9wbQorICogQG5iOiBub3RpZmllciBibG9jayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAqCisgKiBSZW1vdmUgYSBkcml2ZXIgZnJvbSB0aGUgQ1BVIFBNIG5vdGlmaWVyIGxpc3QuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAsIGFuZCBoYXMgdGhlIHNhbWUgcmV0dXJuIGNvbmRpdGlvbnMgYXMKKyAqIHJhd19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyLgorICovCitpbnQgY3B1X3BtX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmNwdV9wbV9ub3RpZmllcl9sb2NrLCBmbGFncyk7CisJcmV0ID0gcmF3X25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmNwdV9wbV9ub3RpZmllcl9jaGFpbiwgbmIpOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZjcHVfcG1fbm90aWZpZXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9wbV91bnJlZ2lzdGVyX25vdGlmaWVyKTsKKworLyoqCisgKiBjcG1fcG1fZW50ZXIgLSBDUFUgbG93IHBvd2VyIGVudHJ5IG5vdGlmaWVyCisgKgorICogTm90aWZpZXMgbGlzdGVuZXJzIHRoYXQgYSBzaW5nbGUgQ1BVIGlzIGVudGVyaW5nIGEgbG93IHBvd2VyIHN0YXRlIHRoYXQgbWF5CisgKiBjYXVzZSBzb21lIGJsb2NrcyBpbiB0aGUgc2FtZSBwb3dlciBkb21haW4gYXMgdGhlIGNwdSB0byByZXNldC4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCBvbiB0aGUgYWZmZWN0ZWQgQ1BVIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4gIFBsYXRmb3JtIGlzCisgKiByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCBjcHVfcG1fZW50ZXIgaXMgbm90IGNhbGxlZCB0d2ljZSBvbiB0aGUgc2FtZQorICogQ1BVIGJlZm9yZSBjcHVfcG1fZXhpdCBpcyBjYWxsZWQuIE5vdGlmaWVkIGRyaXZlcnMgY2FuIGluY2x1ZGUgVkZQCisgKiBjby1wcm9jZXNzb3IsIGludGVycnVwdCBjb250cm9sbGVyIGFuZCBpdCdzIFBNIGV4dGVuc2lvbnMsIGxvY2FsIENQVQorICogdGltZXJzIGNvbnRleHQgc2F2ZS9yZXN0b3JlIHdoaWNoIHNob3VsZG4ndCBiZSBpbnRlcnJ1cHRlZC4gSGVuY2UgaXQKKyAqIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqCisgKiBSZXR1cm4gY29uZGl0aW9ucyBhcmUgc2FtZSBhcyBfX3Jhd19ub3RpZmllcl9jYWxsX2NoYWluLgorICovCitpbnQgY3B1X3BtX2VudGVyKHZvaWQpCit7CisJaW50IG5yX2NhbGxzOworCWludCByZXQgPSAwOworCisJcmVhZF9sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisJcmV0ID0gY3B1X3BtX25vdGlmeShDUFVfUE1fRU5URVIsIC0xLCAmbnJfY2FsbHMpOworCWlmIChyZXQpCisJCS8qCisJCSAqIEluZm9ybSBsaXN0ZW5lcnMgKG5yX2NhbGxzIC0gMSkgYWJvdXQgZmFpbHVyZSBvZiBDUFUgUE0KKwkJICogUE0gZW50cnkgd2hvIGFyZSBub3RpZmllZCBlYXJsaWVyIHRvIHByZXBhcmUgZm9yIGl0LgorCQkgKi8KKwkJY3B1X3BtX25vdGlmeShDUFVfUE1fRU5URVJfRkFJTEVELCBucl9jYWxscyAtIDEsIE5VTEwpOworCXJlYWRfdW5sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3B1X3BtX2VudGVyKTsKKworLyoqCisgKiBjcG1fcG1fZXhpdCAtIENQVSBsb3cgcG93ZXIgZXhpdCBub3RpZmllcgorICoKKyAqIE5vdGlmaWVzIGxpc3RlbmVycyB0aGF0IGEgc2luZ2xlIENQVSBpcyBleGl0aW5nIGEgbG93IHBvd2VyIHN0YXRlIHRoYXQgbWF5CisgKiBoYXZlIGNhdXNlZCBzb21lIGJsb2NrcyBpbiB0aGUgc2FtZSBwb3dlciBkb21haW4gYXMgdGhlIGNwdSB0byByZXNldC4KKyAqCisgKiBOb3RpZmllZCBkcml2ZXJzIGNhbiBpbmNsdWRlIFZGUCBjby1wcm9jZXNzb3IsIGludGVycnVwdCBjb250cm9sbGVyCisgKiBhbmQgaXQncyBQTSBleHRlbnNpb25zLCBsb2NhbCBDUFUgdGltZXJzIGNvbnRleHQgc2F2ZS9yZXN0b3JlIHdoaWNoCisgKiBzaG91bGRuJ3QgYmUgaW50ZXJydXB0ZWQuIEhlbmNlIGl0IG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqCisgKiBSZXR1cm4gY29uZGl0aW9ucyBhcmUgc2FtZSBhcyBfX3Jhd19ub3RpZmllcl9jYWxsX2NoYWluLgorICovCitpbnQgY3B1X3BtX2V4aXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmVhZF9sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisJcmV0ID0gY3B1X3BtX25vdGlmeShDUFVfUE1fRVhJVCwgLTEsIE5VTEwpOworCXJlYWRfdW5sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3B1X3BtX2V4aXQpOworCisvKioKKyAqIGNwbV9jbHVzdGVyX3BtX2VudGVyIC0gQ1BVIGNsdXN0ZXIgbG93IHBvd2VyIGVudHJ5IG5vdGlmaWVyCisgKgorICogTm90aWZpZXMgbGlzdGVuZXJzIHRoYXQgYWxsIGNwdXMgaW4gYSBwb3dlciBkb21haW4gYXJlIGVudGVyaW5nIGEgbG93IHBvd2VyCisgKiBzdGF0ZSB0aGF0IG1heSBjYXVzZSBzb21lIGJsb2NrcyBpbiB0aGUgc2FtZSBwb3dlciBkb21haW4gdG8gcmVzZXQuCisgKgorICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY3B1X3BtX2VudGVyIGhhcyBiZWVuIGNhbGxlZCBvbiBhbGwgY3B1cyBpbiB0aGUgcG93ZXIKKyAqIGRvbWFpbiwgYW5kIGJlZm9yZSBjcHVfcG1fZXhpdCBoYXMgYmVlbiBjYWxsZWQgb24gYW55IGNwdSBpbiB0aGUgcG93ZXIKKyAqIGRvbWFpbi4gTm90aWZpZWQgZHJpdmVycyBjYW4gaW5jbHVkZSBWRlAgY28tcHJvY2Vzc29yLCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogYW5kIGl0J3MgUE0gZXh0ZW5zaW9ucywgbG9jYWwgQ1BVIHRpbWVycyBjb250ZXh0IHNhdmUvcmVzdG9yZSB3aGljaAorICogc2hvdWxkbid0IGJlIGludGVycnVwdGVkLiBIZW5jZSBpdCBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICoKKyAqIFJldHVybiBjb25kaXRpb25zIGFyZSBzYW1lIGFzIF9fcmF3X25vdGlmaWVyX2NhbGxfY2hhaW4uCisgKi8KK2ludCBjcHVfY2x1c3Rlcl9wbV9lbnRlcih2b2lkKQoreworCWludCBucl9jYWxsczsKKwlpbnQgcmV0ID0gMDsKKworCXJlYWRfbG9jaygmY3B1X3BtX25vdGlmaWVyX2xvY2spOworCXJldCA9IGNwdV9wbV9ub3RpZnkoQ1BVX0NMVVNURVJfUE1fRU5URVIsIC0xLCAmbnJfY2FsbHMpOworCWlmIChyZXQpCisJCS8qCisJCSAqIEluZm9ybSBsaXN0ZW5lcnMgKG5yX2NhbGxzIC0gMSkgYWJvdXQgZmFpbHVyZSBvZiBDUFUgY2x1c3RlcgorCQkgKiBQTSBlbnRyeSB3aG8gYXJlIG5vdGlmaWVkIGVhcmxpZXIgdG8gcHJlcGFyZSBmb3IgaXQuCisJCSAqLworCQljcHVfcG1fbm90aWZ5KENQVV9DTFVTVEVSX1BNX0VOVEVSX0ZBSUxFRCwgbnJfY2FsbHMgLSAxLCBOVUxMKTsKKwlyZWFkX3VubG9jaygmY3B1X3BtX25vdGlmaWVyX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9jbHVzdGVyX3BtX2VudGVyKTsKKworLyoqCisgKiBjcG1fY2x1c3Rlcl9wbV9leGl0IC0gQ1BVIGNsdXN0ZXIgbG93IHBvd2VyIGV4aXQgbm90aWZpZXIKKyAqCisgKiBOb3RpZmllcyBsaXN0ZW5lcnMgdGhhdCBhbGwgY3B1cyBpbiBhIHBvd2VyIGRvbWFpbiBhcmUgZXhpdGluZyBmb3JtIGEKKyAqIGxvdyBwb3dlciBzdGF0ZSB0aGF0IG1heSBoYXZlIGNhdXNlZCBzb21lIGJsb2NrcyBpbiB0aGUgc2FtZSBwb3dlciBkb21haW4KKyAqIHRvIHJlc2V0LgorICoKKyAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGNwdV9wbV9leGl0IGhhcyBiZWVuIGNhbGxlZCBvbiBhbGwgY3B1cyBpbiB0aGUgcG93ZXIKKyAqIGRvbWFpbiwgYW5kIGJlZm9yZSBjcHVfcG1fZXhpdCBoYXMgYmVlbiBjYWxsZWQgb24gYW55IGNwdSBpbiB0aGUgcG93ZXIKKyAqIGRvbWFpbi4gTm90aWZpZWQgZHJpdmVycyBjYW4gaW5jbHVkZSBWRlAgY28tcHJvY2Vzc29yLCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogYW5kIGl0J3MgUE0gZXh0ZW5zaW9ucywgbG9jYWwgQ1BVIHRpbWVycyBjb250ZXh0IHNhdmUvcmVzdG9yZSB3aGljaAorICogc2hvdWxkbid0IGJlIGludGVycnVwdGVkLiBIZW5jZSBpdCBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKgorICogUmV0dXJuIGNvbmRpdGlvbnMgYXJlIHNhbWUgYXMgX19yYXdfbm90aWZpZXJfY2FsbF9jaGFpbi4KKyAqLworaW50IGNwdV9jbHVzdGVyX3BtX2V4aXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmVhZF9sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisJcmV0ID0gY3B1X3BtX25vdGlmeShDUFVfQ0xVU1RFUl9QTV9FWElULCAtMSwgTlVMTCk7CisJcmVhZF91bmxvY2soJmNwdV9wbV9ub3RpZmllcl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfY2x1c3Rlcl9wbV9leGl0KTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBjcHVfcG1fc3VzcGVuZCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHVfcG1fZW50ZXIoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY3B1X2NsdXN0ZXJfcG1fZW50ZXIoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjcHVfcG1fcmVzdW1lKHZvaWQpCit7CisJY3B1X2NsdXN0ZXJfcG1fZXhpdCgpOworCWNwdV9wbV9leGl0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgY3B1X3BtX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kID0gY3B1X3BtX3N1c3BlbmQsCisJLnJlc3VtZSA9IGNwdV9wbV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IGNwdV9wbV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmNwdV9wbV9zeXNjb3JlX29wcyk7CisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKGNwdV9wbV9pbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDEwMTMxZmQuLjlmZTU4YzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CkBAIC05NDksNiArOTQ5LDggQEAKIHN0YXRpYyB2b2lkIGNwdXNldF9jaGFuZ2VfdGFza19ub2RlbWFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCQkJbm9kZW1hc2tfdCAqbmV3bWVtcykKIHsKKwlib29sIG1hc2tzX2Rpc2pvaW50ID0gIW5vZGVzX2ludGVyc2VjdHMoKm5ld21lbXMsIHRzay0+bWVtc19hbGxvd2VkKTsKKwogcmVwZWF0OgogCS8qCiAJICogQWxsb3cgdGFza3MgdGhhdCBoYXZlIGFjY2VzcyB0byBtZW1vcnkgcmVzZXJ2ZXMgYmVjYXVzZSB0aGV5IGhhdmUKQEAgLTk2Myw3ICs5NjUsNiBAQAogCW5vZGVzX29yKHRzay0+bWVtc19hbGxvd2VkLCB0c2stPm1lbXNfYWxsb3dlZCwgKm5ld21lbXMpOwogCW1wb2xfcmViaW5kX3Rhc2sodHNrLCBuZXdtZW1zLCBNUE9MX1JFQklORF9TVEVQMSk7CiAKLQogCS8qCiAJICogZW5zdXJlIGNoZWNraW5nIC0+bWVtc19hbGxvd2VkX2NoYW5nZV9kaXNhYmxlIGFmdGVyIHNldHRpbmcgYWxsIG5ldwogCSAqIGFsbG93ZWQgbm9kZXMuCkBAIC05ODAsOSArOTgxLDExIEBACiAKIAkvKgogCSAqIEFsbG9jYXRpb24gb2YgbWVtb3J5IGlzIHZlcnkgZmFzdCwgd2UgbmVlZG4ndCBzbGVlcCB3aGVuIHdhaXRpbmcKLQkgKiBmb3IgdGhlIHJlYWQtc2lkZS4KKwkgKiBmb3IgdGhlIHJlYWQtc2lkZS4gIE5vIHdhaXQgaXMgbmVjZXNzYXJ5LCBob3dldmVyLCBpZiBhdCBsZWFzdCBvbmUKKwkgKiBub2RlIHJlbWFpbnMgdW5jaGFuZ2VkLgogCSAqLwotCXdoaWxlIChBQ0NFU1NfT05DRSh0c2stPm1lbXNfYWxsb3dlZF9jaGFuZ2VfZGlzYWJsZSkpIHsKKwl3aGlsZSAobWFza3NfZGlzam9pbnQgJiYKKwkJCUFDQ0VTU19PTkNFKHRzay0+bWVtc19hbGxvd2VkX2NoYW5nZV9kaXNhYmxlKSkgewogCQl0YXNrX3VubG9jayh0c2spOwogCQlpZiAoIXRhc2tfY3Vycih0c2spKQogCQkJeWllbGQoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcmFzaF9kdW1wLmMgYi9rZXJuZWwvY3Jhc2hfZHVtcC5jCmluZGV4IDVmODU2OTAuLmM3NjZlZTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcmFzaF9kdW1wLmMKKysrIGIva2VybmVsL2NyYXNoX2R1bXAuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qCiAgKiBJZiB3ZSBoYXZlIGJvb3RlZCBkdWUgdG8gYSBjcmFzaCwgbWF4X3BmbiB3aWxsIGJlIGEgdmVyeSBsb3cgdmFsdWUuIFdlIG5lZWQKQEAgLTIwLDggKzIwLDE1IEBACiB1bnNpZ25lZCBsb25nIGxvbmcgZWxmY29yZWhkcl9hZGRyID0gRUxGQ09SRV9BRERSX01BWDsKIAogLyoKKyAqIHN0b3JlcyB0aGUgc2l6ZSBvZiBlbGYgaGVhZGVyIG9mIGNyYXNoIGltYWdlCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBlbGZjb3JlaGRyX3NpemU7CisKKy8qCiAgKiBlbGZjb3JlaGRyPSBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGVsZiBjb3JlIGhlYWRlciBzdG9yZWQgYnkgdGhlIGNyYXNoZWQKICAqIGtlcm5lbC4gVGhpcyBvcHRpb24gd2lsbCBiZSBwYXNzZWQgYnkga2V4ZWMgbG9hZGVyIHRvIHRoZSBjYXB0dXJlIGtlcm5lbC4KKyAqCisgKiBTeW50YXg6IGVsZmNvcmVoZHI9W3NpemVbS01HXUBdb2Zmc2V0W0tNR10KICAqLwogc3RhdGljIGludCBfX2luaXQgc2V0dXBfZWxmY29yZWhkcihjaGFyICphcmcpCiB7CkBAIC0yOSw2ICszNiwxMCBAQAogCWlmICghYXJnKQogCQlyZXR1cm4gLUVJTlZBTDsKIAllbGZjb3JlaGRyX2FkZHIgPSBtZW1wYXJzZShhcmcsICZlbmQpOworCWlmICgqZW5kID09ICdAJykgeworCQllbGZjb3JlaGRyX3NpemUgPSBlbGZjb3JlaGRyX2FkZHI7CisJCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKGVuZCArIDEsICZlbmQpOworCX0KIAlyZXR1cm4gZW5kID4gYXJnID8gMCA6IC1FSU5WQUw7CiB9CiBlYXJseV9wYXJhbSgiZWxmY29yZWhkciIsIHNldHVwX2VsZmNvcmVoZHIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NyZWQuYyBiL2tlcm5lbC9jcmVkLmMKaW5kZXggYmI1NWQwNS4uNTc5MTYxMiAxMDA2NDQKLS0tIGEva2VybmVsL2NyZWQuYworKysgYi9rZXJuZWwvY3JlZC5jCkBAIC04LDcgKzgsNyBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2dkYnN0dWIuYyBiL2tlcm5lbC9kZWJ1Zy9nZGJzdHViLmMKaW5kZXggMzQ4NzI0OC4uYzIyZDhjMiAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2dkYnN0dWIuYworKysgYi9rZXJuZWwvZGVidWcvZ2Ric3R1Yi5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCQkvKiBQYWNrIGluIGhleCBjaGFycyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgd2NvdW50OyBpKyspCi0JCQlidWZwdHIgPSBwYWNrX2hleF9ieXRlKGJ1ZnB0ciwgc1tpXSk7CisJCQlidWZwdHIgPSBoZXhfYnl0ZV9wYWNrKGJ1ZnB0ciwgc1tpXSk7CiAJCSpidWZwdHIgPSAnXDAnOwogCiAJCS8qIE1vdmUgdXAgKi8KQEAgLTI0OSw3ICsyNDksNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBOVUxMOwogCXdoaWxlIChjb3VudCA+IDApIHsKLQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsICp0bXApOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgKnRtcCk7CiAJCXRtcCsrOwogCQljb3VudC0tOwogCX0KQEAgLTQxMSwxNCArNDExLDE0IEBACiAJbGltaXQgPSBpZCArIChCVUZfVEhSRUFEX0lEX1NJWkUgLyAyKTsKIAl3aGlsZSAoaWQgPCBsaW1pdCkgewogCQlpZiAoIWx6ZXJvIHx8ICppZCAhPSAwKSB7Ci0JCQlwa3QgPSBwYWNrX2hleF9ieXRlKHBrdCwgKmlkKTsKKwkJCXBrdCA9IGhleF9ieXRlX3BhY2socGt0LCAqaWQpOwogCQkJbHplcm8gPSAwOwogCQl9CiAJCWlkKys7CiAJfQogCiAJaWYgKGx6ZXJvKQotCQlwa3QgPSBwYWNrX2hleF9ieXRlKHBrdCwgMCk7CisJCXBrdCA9IGhleF9ieXRlX3BhY2socGt0LCAwKTsKIAogCXJldHVybiBwa3Q7CiB9CkBAIC00ODYsNyArNDg2LDcgQEAKIAlkYmdfcmVtb3ZlX2FsbF9icmVhaygpOwogCiAJcmVtY29tX291dF9idWZmZXJbMF0gPSAnUyc7Ci0JcGFja19oZXhfYnl0ZSgmcmVtY29tX291dF9idWZmZXJbMV0sIGtzLT5zaWdubyk7CisJaGV4X2J5dGVfcGFjaygmcmVtY29tX291dF9idWZmZXJbMV0sIGtzLT5zaWdubyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdkYl9nZXRfcmVnc19oZWxwZXIoc3RydWN0IGtnZGJfc3RhdGUgKmtzKQpAQCAtOTU0LDcgKzk1NCw3IEBACiAJCS8qIFJlcGx5IHRvIGhvc3QgdGhhdCBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkICovCiAJCXB0ciA9IHJlbWNvbV9vdXRfYnVmZmVyOwogCQkqcHRyKysgPSAnVCc7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBrcy0+c2lnbm8pOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwga3MtPnNpZ25vKTsKIAkJcHRyICs9IHN0cmxlbihzdHJjcHkocHRyLCAidGhyZWFkOiIpKTsKIAkJaW50X3RvX3RocmVhZHJlZih0aHJlZiwgc2hhZG93X3BpZChjdXJyZW50LT5waWQpKTsKIAkJcHRyID0gcGFja190aHJlYWRpZChwdHIsIHRocmVmKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2RlYnVnZ2VyLmMgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9kZWJ1Z2dlci5jCmluZGV4IGQ5Y2E5YWEuLjhiNjhjZTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2RlYnVnZ2VyLmMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfZGVidWdnZXIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tnZGIuaD4KICNpbmNsdWRlIDxsaW51eC9rZGIuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJrZGJfcHJpdmF0ZS5oIgogI2luY2x1ZGUgIi4uL2RlYnVnX2NvcmUuaCIKIApkaWZmIC0tZ2l0IGEva2VybmVsL2RtYS5jIGIva2VybmVsL2RtYS5jCmluZGV4IGY5MDMxODkuLjY4YTIzMDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kbWEuYworKysgYi9rZXJuZWwvZG1hLmMKQEAgLTksNyArOSw3IEBACiAgKiAgIFtJdCBhbHNvIGhhcHBlbmVkIHRvIHJlbW92ZSB0aGUgc2l6ZW9mKGNoYXIgKikgPT0gc2l6ZW9mKGludCkKICAqICAgYXNzdW1wdGlvbiBpbnRyb2R1Y2VkIGJlY2F1c2Ugb2YgdGhvc2UgL3Byb2MvZG1hIHBhdGNoZXMuIC0tIEhlbm51c10KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvY29yZS5jIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKaW5kZXggZDFhMWJlZS4uMGU4NDU3ZCAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9jb3JlLmMKKysrIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKQEAgLTI1LDExICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Ztc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9hbm9uX2lub2Rlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CkBAIC0zNTQ0LDcgKzM1NDQsNyBAQAogCQlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gZXZlbnQtPnJiOwogCiAJCWF0b21pY19sb25nX3N1Yigoc2l6ZSA+PiBQQUdFX1NISUZUKSArIDEsICZ1c2VyLT5sb2NrZWRfdm0pOwotCQl2bWEtPnZtX21tLT5sb2NrZWRfdm0gLT0gZXZlbnQtPm1tYXBfbG9ja2VkOworCQl2bWEtPnZtX21tLT5waW5uZWRfdm0gLT0gZXZlbnQtPm1tYXBfbG9ja2VkOwogCQlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPnJiLCBOVUxMKTsKIAkJbXV0ZXhfdW5sb2NrKCZldmVudC0+bW1hcF9tdXRleCk7CiAKQEAgLTM2MjUsNyArMzYyNSw3IEBACiAKIAlsb2NrX2xpbWl0ID0gcmxpbWl0KFJMSU1JVF9NRU1MT0NLKTsKIAlsb2NrX2xpbWl0ID4+PSBQQUdFX1NISUZUOwotCWxvY2tlZCA9IHZtYS0+dm1fbW0tPmxvY2tlZF92bSArIGV4dHJhOworCWxvY2tlZCA9IHZtYS0+dm1fbW0tPnBpbm5lZF92bSArIGV4dHJhOwogCiAJaWYgKChsb2NrZWQgPiBsb2NrX2xpbWl0KSAmJiBwZXJmX3BhcmFub2lkX3RyYWNlcG9pbnRfcmF3KCkgJiYKIAkJIWNhcGFibGUoQ0FQX0lQQ19MT0NLKSkgewpAQCAtMzY1MSw3ICszNjUxLDcgQEAKIAlhdG9taWNfbG9uZ19hZGQodXNlcl9leHRyYSwgJnVzZXItPmxvY2tlZF92bSk7CiAJZXZlbnQtPm1tYXBfbG9ja2VkID0gZXh0cmE7CiAJZXZlbnQtPm1tYXBfdXNlciA9IGdldF9jdXJyZW50X3VzZXIoKTsKLQl2bWEtPnZtX21tLT5sb2NrZWRfdm0gKz0gZXZlbnQtPm1tYXBfbG9ja2VkOworCXZtYS0+dm1fbW0tPnBpbm5lZF92bSArPSBldmVudC0+bW1hcF9sb2NrZWQ7CiAKIHVubG9jazoKIAlpZiAoIXJldCkKQEAgLTY4NTMsNyArNjg1Myw3IEBACiAJc3RydWN0IHN3ZXZlbnRfaHRhYmxlICpzd2hhc2ggPSAmcGVyX2NwdShzd2V2ZW50X2h0YWJsZSwgY3B1KTsKIAogCW11dGV4X2xvY2soJnN3aGFzaC0+aGxpc3RfbXV0ZXgpOwotCWlmIChzd2hhc2gtPmhsaXN0X3JlZmNvdW50ID4gMCAmJiAhc3doYXNoLT5zd2V2ZW50X2hsaXN0KSB7CisJaWYgKHN3aGFzaC0+aGxpc3RfcmVmY291bnQgPiAwKSB7CiAJCXN0cnVjdCBzd2V2ZW50X2hsaXN0ICpobGlzdDsKIAogCQlobGlzdCA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmhsaXN0KSwgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7CkBAIC02OTQyLDE0ICs2OTQyLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gKGxvbmcpaGNwdTsKIAotCS8qCi0JICogSWdub3JlIHN1c3BlbmQvcmVzdW1lIGFjdGlvbiwgdGhlIHBlcmZfcG1fbm90aWZpZXIgd2lsbAotCSAqIHRha2UgY2FyZSBvZiB0aGF0LgotCSAqLwotCWlmIChhY3Rpb24gJiBDUFVfVEFTS1NfRlJPWkVOKQotCQlyZXR1cm4gTk9USUZZX09LOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKKwlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7CiAKIAljYXNlIENQVV9VUF9QUkVQQVJFOgogCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgpAQCAtNjk2OCw5MCArNjk2MSw2IEBACiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9wbV9yZXN1bWVfY3B1KHZvaWQgKnVudXNlZCkKLXsKLQlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4OwotCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eDsKLQlzdHJ1Y3QgcG11ICpwbXU7Ci0JaW50IGlkeDsKLQotCWlkeCA9IHNyY3VfcmVhZF9sb2NrKCZwbXVzX3NyY3UpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBtdSwgJnBtdXMsIGVudHJ5KSB7Ci0JCWNwdWN0eCA9IHRoaXNfY3B1X3B0cihwbXUtPnBtdV9jcHVfY29udGV4dCk7Ci0JCWN0eCA9IGNwdWN0eC0+dGFza19jdHg7Ci0KLQkJcGVyZl9jdHhfbG9jayhjcHVjdHgsIGN0eCk7Ci0JCXBlcmZfcG11X2Rpc2FibGUoY3B1Y3R4LT5jdHgucG11KTsKLQotCQljcHVfY3R4X3NjaGVkX291dChjcHVjdHgsIEVWRU5UX0FMTCk7Ci0JCWlmIChjdHgpCi0JCQljdHhfc2NoZWRfb3V0KGN0eCwgY3B1Y3R4LCBFVkVOVF9BTEwpOwotCi0JCXBlcmZfcG11X2VuYWJsZShjcHVjdHgtPmN0eC5wbXUpOwotCQlwZXJmX2N0eF91bmxvY2soY3B1Y3R4LCBjdHgpOwotCX0KLQlzcmN1X3JlYWRfdW5sb2NrKCZwbXVzX3NyY3UsIGlkeCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmZfcG1fc3VzcGVuZF9jcHUodm9pZCAqdW51c2VkKQotewotCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHg7Ci0Jc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4OwotCXN0cnVjdCBwbXUgKnBtdTsKLQlpbnQgaWR4OwotCi0JaWR4ID0gc3JjdV9yZWFkX2xvY2soJnBtdXNfc3JjdSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocG11LCAmcG11cywgZW50cnkpIHsKLQkJY3B1Y3R4ID0gdGhpc19jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0KTsKLQkJY3R4ID0gY3B1Y3R4LT50YXNrX2N0eDsKLQotCQlwZXJmX2N0eF9sb2NrKGNwdWN0eCwgY3R4KTsKLQkJcGVyZl9wbXVfZGlzYWJsZShjcHVjdHgtPmN0eC5wbXUpOwotCi0JCXBlcmZfZXZlbnRfc2NoZWRfaW4oY3B1Y3R4LCBjdHgsIGN1cnJlbnQpOwotCi0JCXBlcmZfcG11X2VuYWJsZShjcHVjdHgtPmN0eC5wbXUpOwotCQlwZXJmX2N0eF91bmxvY2soY3B1Y3R4LCBjdHgpOwotCX0KLQlzcmN1X3JlYWRfdW5sb2NrKCZwbXVzX3NyY3UsIGlkeCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGVyZl9yZXN1bWUodm9pZCkKLXsKLQlnZXRfb25saW5lX2NwdXMoKTsKLQlzbXBfY2FsbF9mdW5jdGlvbihwZXJmX3BtX3Jlc3VtZV9jcHUsIE5VTEwsIDEpOwotCXB1dF9vbmxpbmVfY3B1cygpOwotCi0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIGludCBwZXJmX3N1c3BlbmQodm9pZCkKLXsKLQlnZXRfb25saW5lX2NwdXMoKTsKLQlzbXBfY2FsbF9mdW5jdGlvbihwZXJmX3BtX3N1c3BlbmRfY3B1LCBOVUxMLCAxKTsKLQlwdXRfb25saW5lX2NwdXMoKTsKLQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBpbnQgcGVyZl9wbShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpwdHIpCi17Ci0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIFBNX1BPU1RfSElCRVJOQVRJT046Ci0JY2FzZSBQTV9QT1NUX1NVU1BFTkQ6Ci0JCXJldHVybiBwZXJmX3Jlc3VtZSgpOwotCWNhc2UgUE1fSElCRVJOQVRJT05fUFJFUEFSRToKLQljYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKLQkJcmV0dXJuIHBlcmZfc3VzcGVuZCgpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOT1RJRllfRE9ORTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGVyZl9wbV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IHBlcmZfcG0sCi19OwotCiB2b2lkIF9faW5pdCBwZXJmX2V2ZW50X2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwpAQCAtNzA2Niw3ICs2OTc1LDYgQEAKIAlwZXJmX3RwX3JlZ2lzdGVyKCk7CiAJcGVyZl9jcHVfbm90aWZpZXIocGVyZl9jcHVfbm90aWZ5KTsKIAlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBlcmZfcmVib290X25vdGlmaWVyKTsKLQlyZWdpc3Rlcl9wbV9ub3RpZmllcigmcGVyZl9wbV9ub3RpZmllcik7CiAKIAlyZXQgPSBpbml0X2h3X2JyZWFrcG9pbnQoKTsKIAlXQVJOKHJldCwgImh3X2JyZWFrcG9pbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkIHdpdGg6ICVkIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IDI5MTNiMzUuLmQwYjdkOTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtNjgxLDggKzY4MSw2IEBACiAJZW50ZXJfbGF6eV90bGIobW0sIGN1cnJlbnQpOwogCS8qIFdlIGRvbid0IHdhbnQgdGhpcyB0YXNrIHRvIGJlIGZyb3plbiBwcmVtYXR1cmVseSAqLwogCWNsZWFyX2ZyZWV6ZV9mbGFnKHRzayk7Ci0JaWYgKHRzay0+c2lnbmFsLT5vb21fc2NvcmVfYWRqID09IE9PTV9TQ09SRV9BREpfTUlOKQotCQlhdG9taWNfZGVjKCZtbS0+b29tX2Rpc2FibGVfY291bnQpOwogCXRhc2tfdW5sb2NrKHRzayk7CiAJbW1fdXBkYXRlX25leHRfb3duZXIobW0pOwogCW1tcHV0KG1tKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDhlNmI2ZjQuLmJhMGQxNzIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2ZvcmsuYwpAQCAtNTAxLDcgKzUwMSw2IEBACiAJbW0tPmNhY2hlZF9ob2xlX3NpemUgPSB+MFVMOwogCW1tX2luaXRfYWlvKG1tKTsKIAltbV9pbml0X293bmVyKG1tLCBwKTsKLQlhdG9taWNfc2V0KCZtbS0+b29tX2Rpc2FibGVfY291bnQsIDApOwogCiAJaWYgKGxpa2VseSghbW1fYWxsb2NfcGdkKG1tKSkpIHsKIAkJbW0tPmRlZl9mbGFncyA9IDA7CkBAIC04MTYsOCArODE1LDYgQEAKIAkvKiBJbml0aWFsaXppbmcgZm9yIFN3YXAgdG9rZW4gc3R1ZmYgKi8KIAltbS0+dG9rZW5fcHJpb3JpdHkgPSAwOwogCW1tLT5sYXN0X2ludGVydmFsID0gMDsKLQlpZiAodHNrLT5zaWduYWwtPm9vbV9zY29yZV9hZGogPT0gT09NX1NDT1JFX0FESl9NSU4pCi0JCWF0b21pY19pbmMoJm1tLT5vb21fZGlzYWJsZV9jb3VudCk7CiAKIAl0c2stPm1tID0gbW07CiAJdHNrLT5hY3RpdmVfbW0gPSBtbTsKQEAgLTEzMDIsNiArMTI5OSw5IEBACiAJcC0+cGRlYXRoX3NpZ25hbCA9IDA7CiAJcC0+ZXhpdF9zdGF0ZSA9IDA7CiAKKwlwLT5ucl9kaXJ0aWVkID0gMDsKKwlwLT5ucl9kaXJ0aWVkX3BhdXNlID0gMTI4ID4+IChQQUdFX1NISUZUIC0gMTApOworCiAJLyoKIAkgKiBPaywgbWFrZSBpdCB2aXNpYmxlIHRvIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCiAJICogV2UgZG9udCB3YWtlIGl0IHVwIHlldC4KQEAgLTEzOTEsMTMgKzEzOTEsOCBAQAogYmFkX2ZvcmtfY2xlYW51cF9uYW1lc3BhY2VzOgogCWV4aXRfdGFza19uYW1lc3BhY2VzKHApOwogYmFkX2ZvcmtfY2xlYW51cF9tbToKLQlpZiAocC0+bW0pIHsKLQkJdGFza19sb2NrKHApOwotCQlpZiAocC0+c2lnbmFsLT5vb21fc2NvcmVfYWRqID09IE9PTV9TQ09SRV9BREpfTUlOKQotCQkJYXRvbWljX2RlYygmcC0+bW0tPm9vbV9kaXNhYmxlX2NvdW50KTsKLQkJdGFza191bmxvY2socCk7CisJaWYgKHAtPm1tKQogCQltbXB1dChwLT5tbSk7Ci0JfQogYmFkX2ZvcmtfY2xlYW51cF9zaWduYWw6CiAJaWYgKCEoY2xvbmVfZmxhZ3MgJiBDTE9ORV9USFJFQUQpKQogCQlmcmVlX3NpZ25hbF9zdHJ1Y3QocC0+c2lnbmFsKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mcmVlemVyLmMgYi9rZXJuZWwvZnJlZXplci5jCmluZGV4IDY2YTU5NGUuLjdiZTU2YzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mcmVlemVyLmMKKysrIGIva2VybmVsL2ZyZWV6ZXIuYwpAQCAtNiw3ICs2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIApAQCAtNjcsNyArNjcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCXNpZ25hbF93YWtlX3VwKHAsIDEpOworCXNpZ25hbF93YWtlX3VwKHAsIDApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCAxNTExZGZmLi5lYTg3ZjRkIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkLmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2dyb3Vwcy5jIGIva2VybmVsL2dyb3Vwcy5jCmluZGV4IDFjYzQ3NmQuLjk5YjUzZDEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ncm91cHMuYworKysgYi9rZXJuZWwvZ3JvdXBzLmMKQEAgLTIsNyArMiw3IEBACiAgKiBTdXBwbGVtZW50YXJ5IGdyb3VwIElEcwogICovCiAjaW5jbHVkZSA8bGludXgvY3JlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCBhOTIwNWUzLi40MjJlNTY3IDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTMyLDcgKzMyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvaHVuZ190YXNrLmMgYi9rZXJuZWwvaHVuZ190YXNrLmMKaW5kZXggZWE2NDAxMi4uOGIxNzQ4ZCAxMDA2NDQKLS0tIGEva2VybmVsL2h1bmdfdGFzay5jCisrKyBiL2tlcm5lbC9odW5nX3Rhc2suYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogCiAvKgpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKaW5kZXggZTM4NTQ0ZC4uYzg5Mjk1YSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYworKysgYi9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KQEAgLTIxMSw2ICsyMTIsNyBAQAogCX0KIAlyZXR1cm4gZ2M7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKTsKIAogLyoKICAqIFNlcGFyYXRlIGxvY2tkZXAgY2xhc3MgZm9yIGludGVycnVwdCBjaGlwIHdoaWNoIGNhbiBuZXN0IGlycV9kZXNjCkBAIC0yNTgsNiArMjYwLDcgQEAKIAl9CiAJZ2MtPmlycV9jbnQgPSBpIC0gZ2MtPmlycV9iYXNlOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX3NldHVwX2dlbmVyaWNfY2hpcCk7CiAKIC8qKgogICogaXJxX3NldHVwX2FsdF9jaGlwIC0gU3dpdGNoIHRvIGFsdGVybmF0aXZlIGNoaXAKQEAgLTI4MSw2ICsyODQsNyBAQAogCX0KIAlyZXR1cm4gLUVJTlZBTDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9zZXR1cF9hbHRfY2hpcCk7CiAKIC8qKgogICogaXJxX3JlbW92ZV9nZW5lcmljX2NoaXAgLSBSZW1vdmUgYSBjaGlwCkBAIC0zMTEsNiArMzE1LDcgQEAKIAkJaXJxX21vZGlmeV9zdGF0dXMoaSwgY2xyLCBzZXQpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9yZW1vdmVfZ2VuZXJpY19jaGlwKTsKIAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBpcnFfZ2Nfc3VzcGVuZCh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pcnFkZXNjLmMgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwppbmRleCAxNTUwZTg0Li5kODZlMjU0IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2lycWRlc2MuYworKysgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwpAQCAtOSw3ICs5LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMgYi9rZXJuZWwvaXJxL2lycWRvbWFpbi5jCmluZGV4IGI1N2EzNzcuLjIwMGNlODMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMKKysrIGIva2VybmVsL2lycS9pcnFkb21haW4uYwpAQCAtMjAsMTUgKzIwLDE1IEBACiB2b2lkIGlycV9kb21haW5fYWRkKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4pCiB7CiAJc3RydWN0IGlycV9kYXRhICpkOwotCWludCBod2lycTsKKwlpbnQgaHdpcnEsIGlycTsKIAogCS8qCiAJICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGlycV9kb21haW4gb3duZXIgaGFzIGFscmVhZHkgYWxsb2NhdGVkCiAJICogdGhlIGlycV9kZXNjcy4gIFRoaXMgYmxvY2sgd2lsbCBiZSByZW1vdmVkIHdoZW4gc3VwcG9ydCBmb3IgZHluYW1pYwogCSAqIGFsbG9jYXRpb24gb2YgaXJxX2Rlc2NzIGlzIGFkZGVkIHRvIGlycV9kb21haW4uCiAJICovCi0JZm9yIChod2lycSA9IDA7IGh3aXJxIDwgZG9tYWluLT5ucl9pcnE7IGh3aXJxKyspIHsKLQkJZCA9IGlycV9nZXRfaXJxX2RhdGEoaXJxX2RvbWFpbl90b19pcnEoZG9tYWluLCBod2lycSkpOworCWlycV9kb21haW5fZm9yX2VhY2hfaXJxKGRvbWFpbiwgaHdpcnEsIGlycSkgeworCQlkID0gaXJxX2dldF9pcnFfZGF0YShpcnEpOwogCQlpZiAoIWQpIHsKIAkJCVdBUk4oMSwgImVycm9yOiBhc3NpZ25pbmcgZG9tYWluIHRvIG5vbiBleGlzdGFudCBpcnFfZGVzYyIpOwogCQkJcmV0dXJuOwpAQCAtNTQsMTUgKzU0LDE1IEBACiB2b2lkIGlycV9kb21haW5fZGVsKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4pCiB7CiAJc3RydWN0IGlycV9kYXRhICpkOwotCWludCBod2lycTsKKwlpbnQgaHdpcnEsIGlycTsKIAogCW11dGV4X2xvY2soJmlycV9kb21haW5fbXV0ZXgpOwogCWxpc3RfZGVsKCZkb21haW4tPmxpc3QpOwogCW11dGV4X3VubG9jaygmaXJxX2RvbWFpbl9tdXRleCk7CiAKIAkvKiBDbGVhciB0aGUgaXJxX2RvbWFpbiBhc3NpZ25tZW50cyAqLwotCWZvciAoaHdpcnEgPSAwOyBod2lycSA8IGRvbWFpbi0+bnJfaXJxOyBod2lycSsrKSB7Ci0JCWQgPSBpcnFfZ2V0X2lycV9kYXRhKGlycV9kb21haW5fdG9faXJxKGRvbWFpbiwgaHdpcnEpKTsKKwlpcnFfZG9tYWluX2Zvcl9lYWNoX2lycShkb21haW4sIGh3aXJxLCBpcnEpIHsKKwkJZCA9IGlycV9nZXRfaXJxX2RhdGEoaXJxKTsKIAkJZC0+ZG9tYWluID0gTlVMTDsKIAl9CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxX3dvcmsuYyBiL2tlcm5lbC9pcnFfd29yay5jCmluZGV4IDBlMmNkZTQuLmMzYzQ2YzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnFfd29yay5jCisrKyBiL2tlcm5lbC9pcnFfd29yay5jCkBAIC02LDkgKzYsMTEgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxX3dvcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAvKgogICogQW4gZW50cnkgY2FuIGJlIGluIG9uZSBvZiBmb3VyIHN0YXRlczoKZGlmZiAtLWdpdCBhL2tlcm5lbC9qdW1wX2xhYmVsLmMgYi9rZXJuZWwvanVtcF9sYWJlbC5jCmluZGV4IGE4Y2U0NTAuLmJiZGZlMmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9qdW1wX2xhYmVsLmMKKysrIGIva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtMTA0LDYgKzEwNCwxOCBAQAogCXJldHVybiAwOwogfQogCisvKiAKKyAqIFVwZGF0ZSBjb2RlIHdoaWNoIGlzIGRlZmluaXRlbHkgbm90IGN1cnJlbnRseSBleGVjdXRpbmcuCisgKiBBcmNoaXRlY3R1cmVzIHdoaWNoIG5lZWQgaGVhdnl3ZWlnaHQgc3luY2hyb25pemF0aW9uIHRvIG1vZGlmeQorICogcnVubmluZyBjb2RlIGNhbiBvdmVycmlkZSB0aGlzIHRvIG1ha2UgdGhlIG5vbi1saXZlIHVwZGF0ZSBjYXNlCisgKiBjaGVhcGVyLgorICovCit2b2lkIF9fd2VhayBhcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtX3N0YXRpYyhzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCisJCQkJCSAgICBlbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlKQoreworCWFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0oZW50cnksIHR5cGUpOwkKK30KKwogc3RhdGljIHZvaWQgX19qdW1wX2xhYmVsX3VwZGF0ZShzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSwKIAkJCQlzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCiAJCQkJc3RydWN0IGp1bXBfZW50cnkgKnN0b3AsIGludCBlbmFibGUpCkBAIC0xMjEsMTQgKzEzMyw3IEBACiAJfQogfQogCi0vKgotICogTm90IGFsbCBhcmNocyBuZWVkIHRoaXMuCi0gKi8KLXZvaWQgX193ZWFrIGFyY2hfanVtcF9sYWJlbF90ZXh0X3Bva2VfZWFybHkoanVtcF9sYWJlbF90IGFkZHIpCi17Ci19Ci0KLXN0YXRpYyBfX2luaXQgaW50IGp1bXBfbGFiZWxfaW5pdCh2b2lkKQordm9pZCBfX2luaXQganVtcF9sYWJlbF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGp1bXBfZW50cnkgKml0ZXJfc3RhcnQgPSBfX3N0YXJ0X19fanVtcF90YWJsZTsKIAlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcl9zdG9wID0gX19zdG9wX19fanVtcF90YWJsZTsKQEAgLTEzOSwyMiArMTQ0LDIyIEBACiAJanVtcF9sYWJlbF9zb3J0X2VudHJpZXMoaXRlcl9zdGFydCwgaXRlcl9zdG9wKTsKIAogCWZvciAoaXRlciA9IGl0ZXJfc3RhcnQ7IGl0ZXIgPCBpdGVyX3N0b3A7IGl0ZXIrKykgewotCQlhcmNoX2p1bXBfbGFiZWxfdGV4dF9wb2tlX2Vhcmx5KGl0ZXItPmNvZGUpOwotCQlpZiAoaXRlci0+a2V5ID09IChqdW1wX2xhYmVsX3QpKHVuc2lnbmVkIGxvbmcpa2V5KQorCQlzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKml0ZXJrOworCisJCWl0ZXJrID0gKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqKSh1bnNpZ25lZCBsb25nKWl0ZXItPmtleTsKKwkJYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoaXRlciwganVtcF9sYWJlbF9lbmFibGVkKGl0ZXJrKSA/CisJCQkJCQkgSlVNUF9MQUJFTF9FTkFCTEUgOiBKVU1QX0xBQkVMX0RJU0FCTEUpOworCQlpZiAoaXRlcmsgPT0ga2V5KQogCQkJY29udGludWU7CiAKLQkJa2V5ID0gKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqKSh1bnNpZ25lZCBsb25nKWl0ZXItPmtleTsKLQkJYXRvbWljX3NldCgma2V5LT5lbmFibGVkLCAwKTsKKwkJa2V5ID0gaXRlcms7CiAJCWtleS0+ZW50cmllcyA9IGl0ZXI7CiAjaWZkZWYgQ09ORklHX01PRFVMRVMKIAkJa2V5LT5uZXh0ID0gTlVMTDsKICNlbmRpZgogCX0KIAlqdW1wX2xhYmVsX3VubG9jaygpOwotCi0JcmV0dXJuIDA7CiB9Ci1lYXJseV9pbml0Y2FsbChqdW1wX2xhYmVsX2luaXQpOwogCiAjaWZkZWYgQ09ORklHX01PRFVMRVMKIApAQCAtMjEyLDcgKzIxNyw3IEBACiAJCXJldHVybjsKIAogCWZvciAoaXRlciA9IGl0ZXJfc3RhcnQ7IGl0ZXIgPCBpdGVyX3N0b3A7IGl0ZXIrKykKLQkJYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShpdGVyLT5jb2RlKTsKKwkJYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoaXRlciwgSlVNUF9MQUJFTF9ESVNBQkxFKTsKIH0KIAogc3RhdGljIGludCBqdW1wX2xhYmVsX2FkZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKQpkaWZmIC0tZ2l0IGEva2VybmVsL2tleGVjLmMgYi9rZXJuZWwva2V4ZWMuYwppbmRleCAyOTZmYmM4Li5kYzdiYzA4IDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWMuYworKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJd2hpbGUgKGhvbGVfZW5kIDw9IGNyYXNoa19yZXMuZW5kKSB7CiAJCXVuc2lnbmVkIGxvbmcgaTsKIAotCQlpZiAoaG9sZV9lbmQgPiBLRVhFQ19DT05UUk9MX01FTU9SWV9MSU1JVCkKKwkJaWYgKGhvbGVfZW5kID4gS0VYRUNfQ1JBU0hfQ09OVFJPTF9NRU1PUllfTElNSVQpCiAJCQlicmVhazsKIAkJaWYgKGhvbGVfZW5kID4gY3Jhc2hrX3Jlcy5lbmQpCiAJCQlicmVhazsKQEAgLTk5OSw2ICs5OTksNyBAQAogCQkJa2ltYWdlX2ZyZWUoeGNoZygma2V4ZWNfY3Jhc2hfaW1hZ2UsIE5VTEwpKTsKIAkJCXJlc3VsdCA9IGtpbWFnZV9jcmFzaF9hbGxvYygmaW1hZ2UsIGVudHJ5LAogCQkJCQkJICAgICBucl9zZWdtZW50cywgc2VnbWVudHMpOworCQkJY3Jhc2hfbWFwX3Jlc2VydmVkX3BhZ2VzKCk7CiAJCX0KIAkJaWYgKHJlc3VsdCkKIAkJCWdvdG8gb3V0OwpAQCAtMTAxNSw2ICsxMDE2LDggQEAKIAkJCQlnb3RvIG91dDsKIAkJfQogCQlraW1hZ2VfdGVybWluYXRlKGltYWdlKTsKKwkJaWYgKGZsYWdzICYgS0VYRUNfT05fQ1JBU0gpCisJCQljcmFzaF91bm1hcF9yZXNlcnZlZF9wYWdlcygpOwogCX0KIAkvKiBJbnN0YWxsIHRoZSBuZXcga2VybmVsLCBhbmQgIFVuaW5zdGFsbCB0aGUgb2xkICovCiAJaW1hZ2UgPSB4Y2hnKGRlc3RfaW1hZ2UsIGltYWdlKTsKQEAgLTEwMjYsNiArMTAyOSwxOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qCisgKiBBZGQgYW5kIHJlbW92ZSBwYWdlIHRhYmxlcyBmb3IgY3Jhc2hrZXJuZWwgbWVtb3J5CisgKgorICogUHJvdmlkZSBhbiBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhlcmUgLS0gYXJjaGl0ZWN0dXJlCisgKiBjb2RlIG1heSBvdmVycmlkZSB0aGlzCisgKi8KK3ZvaWQgX193ZWFrIGNyYXNoX21hcF9yZXNlcnZlZF9wYWdlcyh2b2lkKQore30KKwordm9pZCBfX3dlYWsgY3Jhc2hfdW5tYXBfcmVzZXJ2ZWRfcGFnZXModm9pZCkKK3t9CisKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19rZXhlY19sb2FkKHVuc2lnbmVkIGxvbmcgZW50cnksCiAJCQkJdW5zaWduZWQgbG9uZyBucl9zZWdtZW50cywKQEAgLTExMzQsMTQgKzExNDksMTYgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCi0Jc3RhcnQgPSByb3VuZHVwKHN0YXJ0LCBQQUdFX1NJWkUpOwotCWVuZCA9IHJvdW5kdXAoc3RhcnQgKyBuZXdfc2l6ZSwgUEFHRV9TSVpFKTsKKwlzdGFydCA9IHJvdW5kdXAoc3RhcnQsIEtFWEVDX0NSQVNIX01FTV9BTElHTik7CisJZW5kID0gcm91bmR1cChzdGFydCArIG5ld19zaXplLCBLRVhFQ19DUkFTSF9NRU1fQUxJR04pOwogCisJY3Jhc2hfbWFwX3Jlc2VydmVkX3BhZ2VzKCk7CiAJY3Jhc2hfZnJlZV9yZXNlcnZlZF9waHlzX3JhbmdlKGVuZCwgY3Jhc2hrX3Jlcy5lbmQpOwogCiAJaWYgKChzdGFydCA9PSBlbmQpICYmIChjcmFzaGtfcmVzLnBhcmVudCAhPSBOVUxMKSkKIAkJcmVsZWFzZV9yZXNvdXJjZSgmY3Jhc2hrX3Jlcyk7CiAJY3Jhc2hrX3Jlcy5lbmQgPSBlbmQgLSAxOworCWNyYXNoX3VubWFwX3Jlc2VydmVkX3BhZ2VzKCk7CiAKIHVubG9jazoKIAltdXRleF91bmxvY2soJmtleGVjX211dGV4KTsKQEAgLTEzODAsMjQgKzEzOTcsMjMgQEAKIH0KIAogCi0KLXZvaWQgY3Jhc2hfc2F2ZV92bWNvcmVpbmZvKHZvaWQpCitzdGF0aWMgdm9pZCB1cGRhdGVfdm1jb3JlaW5mb19ub3RlKHZvaWQpCiB7Ci0JdTMyICpidWY7CisJdTMyICpidWYgPSB2bWNvcmVpbmZvX25vdGU7CiAKIAlpZiAoIXZtY29yZWluZm9fc2l6ZSkKIAkJcmV0dXJuOwotCi0Jdm1jb3JlaW5mb19hcHBlbmRfc3RyKCJDUkFTSFRJTUU9JWxkIiwgZ2V0X3NlY29uZHMoKSk7Ci0KLQlidWYgPSAodTMyICopdm1jb3JlaW5mb19ub3RlOwotCiAJYnVmID0gYXBwZW5kX2VsZl9ub3RlKGJ1ZiwgVk1DT1JFSU5GT19OT1RFX05BTUUsIDAsIHZtY29yZWluZm9fZGF0YSwKIAkJCSAgICAgIHZtY29yZWluZm9fc2l6ZSk7Ci0KIAlmaW5hbF9ub3RlKGJ1Zik7CiB9CiAKK3ZvaWQgY3Jhc2hfc2F2ZV92bWNvcmVpbmZvKHZvaWQpCit7CisJdm1jb3JlaW5mb19hcHBlbmRfc3RyKCJDUkFTSFRJTUU9JWxkIiwgZ2V0X3NlY29uZHMoKSk7CisJdXBkYXRlX3ZtY29yZWluZm9fbm90ZSgpOworfQorCiB2b2lkIHZtY29yZWluZm9fYXBwZW5kX3N0cihjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CkBAIC0xNDgzLDYgKzE0OTksNyBAQAogCVZNQ09SRUlORk9fTlVNQkVSKFBHX3N3YXBjYWNoZSk7CiAKIAlhcmNoX2NyYXNoX3NhdmVfdm1jb3JlaW5mbygpOworCXVwZGF0ZV92bWNvcmVpbmZvX25vdGUoKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2tmaWZvLmMgYi9rZXJuZWwva2ZpZm8uYwppbmRleCAwMWEwNzAwLi5jNzQ0Yjg4IDEwMDY0NAotLS0gYS9rZXJuZWwva2ZpZm8uYworKysgYi9rZXJuZWwva2ZpZm8uYwpAQCAtMjAsNyArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggMmYxOTNkMC4uZTVkODQ2NCAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9rc3lzZnMuYyBiL2tlcm5lbC9rc3lzZnMuYwppbmRleCAzYjA1M2MwLi40ZTMxNmUxIDEwMDY0NAotLS0gYS9rZXJuZWwva3N5c2ZzLmMKKysrIGIva2VybmVsL2tzeXNmcy5jCkBAIC0xMSwxMCArMTEsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogCmRpZmYgLS1naXQgYS9rZXJuZWwva3RocmVhZC5jIGIva2VybmVsL2t0aHJlYWQuYwppbmRleCA0YmE3Y2NjLi5iNmQyMTZhIDEwMDY0NAotLS0gYS9rZXJuZWwva3RocmVhZC5jCisrKyBiL2tlcm5lbC9rdGhyZWFkLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2xhdGVuY3l0b3AuYyBiL2tlcm5lbC9sYXRlbmN5dG9wLmMKaW5kZXggNGFjOGViZi4uYTQ2MmIzMSAxMDA2NDQKLS0tIGEva2VybmVsL2xhdGVuY3l0b3AuYworKysgYi9rZXJuZWwvbGF0ZW5jeXRvcC5jCkBAIC01Myw3ICs1Myw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2RlcF9wcm9jLmMgYi9rZXJuZWwvbG9ja2RlcF9wcm9jLmMKaW5kZXggNzFlZGQyZi4uOTFjMzJhMCAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXBfcHJvYy5jCisrKyBiL2tlcm5lbC9sb2NrZGVwX3Byb2MuYwpAQCAtMTEsNyArMTEsNyBAQAogICogQ29kZSBmb3IgL3Byb2MvbG9ja2RlcCBhbmQgL3Byb2MvbG9ja2RlcF9zdGF0czoKICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IDkzMzQyZDkuLjE3ODMzM2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjQ4Nyw2ICsyNDg3LDkgQEAKIAkJcmV0dXJuIC1FTk9FWEVDOwogCX0KIAorCWlmICghZ2V0X21vZGluZm8oaW5mbywgImludHJlZSIpKQorCQlhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfT09UX01PRFVMRSk7CisKIAlpZiAoZ2V0X21vZGluZm8oaW5mbywgInN0YWdpbmciKSkgewogCQlhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfQ1JBUCk7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtb2R1bGUgaXMgZnJvbSB0aGUgc3RhZ2luZyBkaXJlY3RvcnksIgpAQCAtMjg3OCw4ICsyODgxLDcgQEAKIAl9CiAKIAkvKiBUaGlzIGhhcyB0byBiZSBkb25lIG9uY2Ugd2UncmUgc3VyZSBtb2R1bGUgbmFtZSBpcyB1bmlxdWUuICovCi0JaWYgKCFtb2QtPnRhaW50cyB8fCBtb2QtPnRhaW50cyA9PSAoMVU8PFRBSU5UX0NSQVApKQotCQlkeW5hbWljX2RlYnVnX3NldHVwKGluZm8uZGVidWcsIGluZm8ubnVtX2RlYnVnKTsKKwlkeW5hbWljX2RlYnVnX3NldHVwKGluZm8uZGVidWcsIGluZm8ubnVtX2RlYnVnKTsKIAogCS8qIEZpbmQgZHVwbGljYXRlIHN5bWJvbHMgKi8KIAllcnIgPSB2ZXJpZnlfZXhwb3J0X3N5bWJvbHMobW9kKTsKQEAgLTI5MTUsOCArMjkxNyw3IEBACiAJbW9kdWxlX2J1Z19jbGVhbnVwKG1vZCk7CiAKICBkZGVidWc6Ci0JaWYgKCFtb2QtPnRhaW50cyB8fCBtb2QtPnRhaW50cyA9PSAoMVU8PFRBSU5UX0NSQVApKQotCQlkeW5hbWljX2RlYnVnX3JlbW92ZShpbmZvLmRlYnVnKTsKKwlkeW5hbWljX2RlYnVnX3JlbW92ZShpbmZvLmRlYnVnKTsKICB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCXN5bmNocm9uaXplX3NjaGVkKCk7CkBAIC0zMjU3LDYgKzMyNTgsOCBAQAogCQlidWZbYngrK10gPSAnKCc7CiAJCWlmIChtb2QtPnRhaW50cyAmICgxIDw8IFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSkpCiAJCQlidWZbYngrK10gPSAnUCc7CisJCWVsc2UgaWYgKG1vZC0+dGFpbnRzICYgKDEgPDwgVEFJTlRfT09UX01PRFVMRSkpCisJCQlidWZbYngrK10gPSAnTyc7CiAJCWlmIChtb2QtPnRhaW50cyAmICgxIDw8IFRBSU5UX0ZPUkNFRF9NT0RVTEUpKQogCQkJYnVmW2J4KytdID0gJ0YnOwogCQlpZiAobW9kLT50YWludHMgJiAoMSA8PCBUQUlOVF9DUkFQKSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9tdXRleC1kZWJ1Zy5jIGIva2VybmVsL211dGV4LWRlYnVnLmMKaW5kZXggNzNkYTgzYS4uN2UzNDQzZiAxMDA2NDQKLS0tIGEva2VybmVsL211dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL211dGV4LWRlYnVnLmMKQEAgLTE0LDcgKzE0LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2lzb24uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXguYyBiL2tlcm5lbC9tdXRleC5jCmluZGV4IGQ2MDdlZDUuLjg5MDk2ZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC5jCisrKyBiL2tlcm5lbC9tdXRleC5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL25vdGlmaWVyLmMgYi9rZXJuZWwvbm90aWZpZXIuYwppbmRleCA4ZDdiNDM1Li4yZDVjYzRjIDEwMDY0NAotLS0gYS9rZXJuZWwvbm90aWZpZXIuYworKysgYi9rZXJuZWwvbm90aWZpZXIuYwpAQCAtMSw2ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9uc3Byb3h5LmMgYi9rZXJuZWwvbnNwcm94eS5jCmluZGV4IDlhZWFiNGIuLmI1NzZmN2YgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9uc3Byb3h5LmMKKysrIGIva2VybmVsL25zcHJveHkuYwpAQCAtMTQsNyArMTQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogI2luY2x1ZGUgPGxpbnV4L21udF9uYW1lc3BhY2UuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wYWRhdGEuYyBiL2tlcm5lbC9wYWRhdGEuYwppbmRleCBiOTE5NDFkLi5iNDUyNTk5IDEwMDY0NAotLS0gYS9rZXJuZWwvcGFkYXRhLmMKKysrIGIva2VybmVsL3BhZGF0YS5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvcGFuaWMuYyBiL2tlcm5lbC9wYW5pYy5jCmluZGV4IGQ3YmI2OTcuLmIyNjU5MzYwIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMTc3LDYgKzE3Nyw3IEBACiAJeyBUQUlOVF9XQVJOLAkJCSdXJywgJyAnIH0sCiAJeyBUQUlOVF9DUkFQLAkJCSdDJywgJyAnIH0sCiAJeyBUQUlOVF9GSVJNV0FSRV9XT1JLQVJPVU5ELAknSScsICcgJyB9LAorCXsgVEFJTlRfT09UX01PRFVMRSwJCSdPJywgJyAnIH0sCiB9OwogCiAvKioKQEAgLTE5NCw2ICsxOTUsNyBAQAogICogICdXJyAtIFRhaW50IG9uIHdhcm5pbmcuCiAgKiAgJ0MnIC0gbW9kdWxlcyBmcm9tIGRyaXZlcnMvc3RhZ2luZyBhcmUgbG9hZGVkLgogICogICdJJyAtIFdvcmtpbmcgYXJvdW5kIHNldmVyZSBmaXJtd2FyZSBidWcuCisgKiAgJ08nIC0gT3V0LW9mLXRyZWUgbW9kdWxlIGhhcyBiZWVuIGxvYWRlZC4KICAqCiAgKglUaGUgc3RyaW5nIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBuZXh0IGNhbGwgdG8gcHJpbnRfdGFpbnRlZCgpLgogICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcGFyYW1zLmMgYi9rZXJuZWwvcGFyYW1zLmMKaW5kZXggODIxNzg4OS4uNjVhYWUxMWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYXJhbXMuYworKysgYi9rZXJuZWwvcGFyYW1zLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3BpZC5jIGIva2VybmVsL3BpZC5jCmluZGV4IDhjYWZlN2UuLmZhNWY3MjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9waWQuYworKysgYi9rZXJuZWwvcGlkLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3NpeC10aW1lcnMuYyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwppbmRleCA0NTU2MTgyLi42OTE4NWFlIDEwMDY0NAotLS0gYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMKKysrIGIva2VybmVsL3Bvc2l4LXRpbWVycy5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qCiAgKiBNYW5hZ2VtZW50IGFycmF5cyBmb3IgUE9TSVggdGltZXJzLgkgVGltZXJzIGFyZSBrZXB0IGluIHNsYWIgbWVtb3J5CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IGNlZGQ5OTguLmRlYjU0NjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0yMzksMyArMjM5LDcgQEAKIGNvbmZpZyBQTV9HRU5FUklDX0RPTUFJTlNfUlVOVElNRQogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFBNX1JVTlRJTUUgJiYgUE1fR0VORVJJQ19ET01BSU5TCisKK2NvbmZpZyBDUFVfUE0KKwlib29sCisJZGVwZW5kcyBvbiBTVVNQRU5EIHx8IENQVV9JRExFCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKaW5kZXggMWM1M2Y3Zi4uYjQ1MTFiNiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCisrKyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwpAQCAtOSw2ICs5LDcgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggYTUyZTg4NC4uNzFmNDlmZSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC04LDYgKzgsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc3VtZS10cmFjZS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Fvcy5jIGIva2VybmVsL3Bvd2VyL3Fvcy5jCmluZGV4IDFjMTc5N2QuLjk5NWUzYmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9xb3MuYworKysgYi9rZXJuZWwvcG93ZXIvcW9zLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyoKICAqIGxvY2tpbmcgcnVsZTogYWxsIGNoYW5nZXMgdG8gY29uc3RyYWludHMgb3Igbm90aWZpZXJzIGxpc3RzCkBAIC02OSw2ICs3MCw3IEBACiB9Owogc3RhdGljIHN0cnVjdCBwbV9xb3Nfb2JqZWN0IGNwdV9kbWFfcG1fcW9zID0gewogCS5jb25zdHJhaW50cyA9ICZjcHVfZG1hX2NvbnN0cmFpbnRzLAorCS5uYW1lID0gImNwdV9kbWFfbGF0ZW5jeSIsCiB9OwogCiBzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChuZXR3b3JrX2xhdF9ub3RpZmllcik7CkBAIC0zODYsOCArMzg4LDcgQEAKIAkJcG1fcW9zX2FkZF9yZXF1ZXN0KHJlcSwgcG1fcW9zX2NsYXNzLCBQTV9RT1NfREVGQVVMVF9WQUxVRSk7CiAJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHJlcTsKIAotCQlpZiAoZmlscC0+cHJpdmF0ZV9kYXRhKQotCQkJcmV0dXJuIDA7CisJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVQRVJNOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYyBiL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKaW5kZXggZmRkNDI2My4uNDk1M2RjMCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYworKysgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CkBAIC0yMSw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuYyBiL2tlcm5lbC9wb3dlci91c2VyLmMKaW5kZXggNDJkZGJjNi4uNmQ4ZjUzNSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3VzZXIuYworKysgYi9rZXJuZWwvcG93ZXIvdXNlci5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCBiN2RhMTgzLi4xNDU1YTBkIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC01MzIsNiArNTMyLDkgQEAKIH0KIAogZWFybHlfcGFyYW0oImlnbm9yZV9sb2dsZXZlbCIsIGlnbm9yZV9sb2dsZXZlbF9zZXR1cCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoaWdub3JlX2xvZ2xldmVsLCBpZ25vcmVfbG9nbGV2ZWwsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2xvZ2xldmVsLCAiaWdub3JlIGxvZ2xldmVsIHNldHRpbmcsIHRvIgorCSJwcmludCBhbGwga2VybmVsIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlLiIpOwogCiAvKgogICogV3JpdGUgb3V0IGNoYXJzIGZyb20gc3RhcnQgdG8gZW5kIC0gMSBpbmNsdXNpdmUKQEAgLTU5Miw5ICs1OTUsNiBAQAogCQkvKiBtdWx0aSBkaWdpdCBpbmNsdWRpbmcgdGhlIGxldmVsIGFuZCBmYWNpbGl0eSBudW1iZXIgKi8KIAkJY2hhciAqZW5kcCA9IE5VTEw7CiAKLQkJaWYgKHBbMV0gPCAnMCcgJiYgcFsxXSA+ICc5JykKLQkJCXJldHVybiAwOwotCiAJCWxldiA9IChzaW1wbGVfc3RydG91bCgmcFsxXSwgJmVuZHAsIDEwKSAmIDcpOwogCQlpZiAoZW5kcCA9PSBOVUxMIHx8IGVuZHBbMF0gIT0gJz4nKQogCQkJcmV0dXJuIDA7CkBAIC0xMTA4LDYgKzExMDgsMTAgQEAKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoIm5vX2NvbnNvbGVfc3VzcGVuZCIsIGNvbnNvbGVfc3VzcGVuZF9kaXNhYmxlKTsKK21vZHVsZV9wYXJhbV9uYW1lZChjb25zb2xlX3N1c3BlbmQsIGNvbnNvbGVfc3VzcGVuZF9lbmFibGVkLAorCQlib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGNvbnNvbGVfc3VzcGVuZCwgInN1c3BlbmQgY29uc29sZSBkdXJpbmcgc3VzcGVuZCIKKwkiIGFuZCBoaWJlcm5hdGUgb3BlcmF0aW9ucyIpOwogCiAvKioKICAqIHN1c3BlbmRfY29uc29sZSAtIHN1c3BlbmQgdGhlIGNvbnNvbGUgc3Vic3lzdGVtCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJvZmlsZS5jIGIva2VybmVsL3Byb2ZpbGUuYwppbmRleCA5NjFiMzg5Li43NmI4ZTc3IDEwMDY0NAotLS0gYS9rZXJuZWwvcHJvZmlsZS5jCisrKyBiL2tlcm5lbC9wcm9maWxlLmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqCXRvIHJlc29sdmUgdGltZXIgaW50ZXJydXB0IGxpdmVsb2NrcywgV2lsbGlhbSBJcndpbiwgT3JhY2xlLCAyMDA0CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wdHJhY2UuYyBiL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhNzBkMmE1Li4yNGQwNDQ3IDEwMDY0NAotLS0gYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIva2VybmVsL3B0cmFjZS5jCkBAIC04LDcgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvcmFuZ2UuYyBiL2tlcm5lbC9yYW5nZS5jCmluZGV4IDM3ZmE5YjkuLjliOGFlMmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yYW5nZS5jCisrKyBiL2tlcm5lbC9yYW5nZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFJhbmdlIGFkZCBhbmQgc3VidHJhY3QKICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VwZGF0ZS5jIGIva2VybmVsL3JjdXBkYXRlLmMKaW5kZXggY2EwZDIzYi4uYzViOThlNSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXBkYXRlLmMKKysrIGIva2VybmVsL3JjdXBkYXRlLmMKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0aW55LmMgYi9rZXJuZWwvcmN1dGlueS5jCmluZGV4IGRhNzc1YzguLjYzNmFmNmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0aW55LmMKKysrIGIva2VybmVsL3JjdXRpbnkuYwpAQCAtMjIsMTMgKzIyLDEyIEBACiAgKiBGb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgUmVhZC1Db3B5IFVwZGF0ZSBtZWNoYW5pc20gc2VlIC0KICAqCQlEb2N1bWVudGF0aW9uL1JDVQogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRpbnlfcGx1Z2luLmggYi9rZXJuZWwvcmN1dGlueV9wbHVnaW4uaAppbmRleCAwMmFhNzEzLi4yYjA0ODRhIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dGlueV9wbHVnaW4uaAorKysgYi9rZXJuZWwvcmN1dGlueV9wbHVnaW4uaApAQCAtMjMsNiArMjMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlLmMgYi9rZXJuZWwvcmN1dHJlZS5jCmluZGV4IGUyMzRlYjkuLjZiNzZkODEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlLmMKKysrIGIva2VybmVsL3JjdXRyZWUuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3JlbGF5LmMgYi9rZXJuZWwvcmVsYXkuYwppbmRleCA4NTllYTVhLi4yMjZmYWRlIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVsYXkuYworKysgYi9rZXJuZWwvcmVsYXkuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCBjOGRjMjQ5Li43NjQwYjNhIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtNyw3ICs3LDcgQEAKICAqIEFyYml0cmFyeSByZXNvdXJjZSBtYW5hZ2VtZW50LgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMgYi9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jCmluZGV4IGEyZTdlNzIuLjhlYWZkMWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL3J0bXV0ZXgtZGVidWcuYwpAQCAtMTgsNyArMTgsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXgtdGVzdGVyLmMgYi9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYwppbmRleCA1YzljY2QzLi4zZDlmMzFjIDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYworKysgYi9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXguYyBiL2tlcm5lbC9ydG11dGV4LmMKaW5kZXggNWU4ZDljYy4uZjlkODQ4MiAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXguYworKysgYi9rZXJuZWwvcnRtdXRleC5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgU2VlIERvY3VtZW50YXRpb24vcnQtbXV0ZXgtZGVzaWduLnR4dCBmb3IgZGV0YWlscy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogCmRpZmYgLS1naXQgYS9rZXJuZWwvcndzZW0uYyBiL2tlcm5lbC9yd3NlbS5jCmluZGV4IDlmNDhmM2QuLmIxNTJmNzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yd3NlbS5jCisrKyBiL2tlcm5lbC9yd3NlbS5jCkBAIC03LDcgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCBkODdjNmU1Li4wZTkzNDRhIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtNzA4Nyw4ICs3MDg3LDYgQEAKIAogX19zZXR1cCgiaXNvbGNwdXM9IiwgaXNvbGF0ZWRfY3B1X3NldHVwKTsKIAotI2RlZmluZSBTRF9OT0RFU19QRVJfRE9NQUlOIDE2Ci0KICNpZmRlZiBDT05GSUdfTlVNQQogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9jbG9jay5jIGIva2VybmVsL3NjaGVkX2Nsb2NrLmMKaW5kZXggOWQ4YWYwYi4uYzY4NWUzMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2Nsb2NrLmMKKysrIGIva2VybmVsL3NjaGVkX2Nsb2NrLmMKQEAgLTYyLDcgKzYyLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9zZW1hcGhvcmUuYyBiL2tlcm5lbC9zZW1hcGhvcmUuYwppbmRleCBkODMxODQxLi42MDYzNmE0IDEwMDY0NAotLS0gYS9rZXJuZWwvc2VtYXBob3JlLmMKKysrIGIva2VybmVsL3NlbWFwaG9yZS5jCkBAIC0yNyw3ICsyNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCBkMjUyYmUyLi5iM2Y3OGQwIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3NtcC5jIGIva2VybmVsL3NtcC5jCmluZGV4IGZiNjdkZmEuLmRiMTk3ZDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zbXAuYworKysgYi9rZXJuZWwvc21wLmMKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggZmNhODJjMy4uMmM3MWQ5MSAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKglSZW1vdGUgc29mdGlycSBpbmZyYXN0cnVjdHVyZSBpcyBieSBKZW5zIEF4Ym9lLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9zcGlubG9jay5jIGIva2VybmVsL3NwaW5sb2NrLmMKaW5kZXggYmU2NTE3Zi4uODRjN2Q5NiAxMDA2NDQKLS0tIGEva2VybmVsL3NwaW5sb2NrLmMKKysrIGIva2VybmVsL3NwaW5sb2NrLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qCiAgKiBJZiBsb2NrZGVwIGlzIGVuYWJsZWQgdGhlbiB3ZSB1c2UgdGhlIG5vbi1wcmVlbXB0aW9uIHNwaW4tb3BzCmRpZmYgLS1naXQgYS9rZXJuZWwvc3JjdS5jIGIva2VybmVsL3NyY3UuYwppbmRleCA3M2NlMjNmLi4wZmViZjYxIDEwMDY0NAotLS0gYS9rZXJuZWwvc3JjdS5jCisrKyBiL2tlcm5lbC9zcmN1LmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3N0YWNrdHJhY2UuYyBiL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggZDIwYzY5OC4uMDBmZTU1YyAxMDA2NDQKLS0tIGEva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC03LDcgKzcsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KIApkaWZmIC0tZ2l0IGEva2VybmVsL3N0b3BfbWFjaGluZS5jIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCmluZGV4IGJhNTA3MGMuLjJmMTk0ZTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYworKysgYi9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CkBAIC00MSw2ICs0MSw3IEBACiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9zdG9wcGVyLCBjcHVfc3RvcHBlcik7CitzdGF0aWMgYm9vbCBzdG9wX21hY2hpbmVfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAogc3RhdGljIHZvaWQgY3B1X3N0b3BfaW5pdF9kb25lKHN0cnVjdCBjcHVfc3RvcF9kb25lICpkb25lLCB1bnNpZ25lZCBpbnQgbnJfdG9kbykKIHsKQEAgLTM4Niw2ICszODcsOCBAQAogCWNwdV9zdG9wX2NwdV9jYWxsYmFjaygmY3B1X3N0b3BfY3B1X25vdGlmaWVyLCBDUFVfT05MSU5FLCBiY3B1KTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNwdV9zdG9wX2NwdV9ub3RpZmllcik7CiAKKwlzdG9wX21hY2hpbmVfaW5pdGlhbGl6ZWQgPSB0cnVlOworCiAJcmV0dXJuIDA7CiB9CiBlYXJseV9pbml0Y2FsbChjcHVfc3RvcF9pbml0KTsKQEAgLTQ4NSw2ICs0ODgsMjUgQEAKIAkJCQkJICAgIC5udW1fdGhyZWFkcyA9IG51bV9vbmxpbmVfY3B1cygpLAogCQkJCQkgICAgLmFjdGl2ZV9jcHVzID0gY3B1cyB9OwogCisJaWYgKCFzdG9wX21hY2hpbmVfaW5pdGlhbGl6ZWQpIHsKKwkJLyoKKwkJICogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN0b3BfbWFjaGluZSgpIGlzIGNhbGxlZAorCQkgKiBlYXJseSBpbiBib290IGJlZm9yZSBzdG9wX21hY2hpbmUoKSBoYXMgYmVlbgorCQkgKiBpbml0aWFsaXplZC4KKwkJICovCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWludCByZXQ7CisKKwkJV0FSTl9PTl9PTkNFKHNtZGF0YS5udW1fdGhyZWFkcyAhPSAxKTsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWhhcmRfaXJxX2Rpc2FibGUoKTsKKwkJcmV0ID0gKCpmbikoZGF0YSk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQlyZXR1cm4gcmV0OworCX0KKwogCS8qIFNldCB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgc3RvcCBhbGwgb25saW5lIGNwdXMuICovCiAJc2V0X3N0YXRlKCZzbWRhdGEsIFNUT1BNQUNISU5FX1BSRVBBUkUpOwogCXJldHVybiBzdG9wX2NwdXMoY3B1X29ubGluZV9tYXNrLCBzdG9wX21hY2hpbmVfY3B1X3N0b3AsICZzbWRhdGEpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDU4NDU5NTAuLjQ4MTYxMWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xMjg2LDYgKzEyODcsNyBAQAogCQltZW1zZXQodS0+bm9kZW5hbWUgKyBsZW4sIDAsIHNpemVvZih1LT5ub2RlbmFtZSkgLSBsZW4pOwogCQllcnJubyA9IDA7CiAJfQorCXV0c19wcm9jX25vdGlmeShVVFNfUFJPQ19IT1NUTkFNRSk7CiAJdXBfd3JpdGUoJnV0c19zZW0pOwogCXJldHVybiBlcnJubzsKIH0KQEAgLTEzMzYsNiArMTMzOCw3IEBACiAJCW1lbXNldCh1LT5kb21haW5uYW1lICsgbGVuLCAwLCBzaXplb2YodS0+ZG9tYWlubmFtZSkgLSBsZW4pOwogCQllcnJubyA9IDA7CiAJfQorCXV0c19wcm9jX25vdGlmeShVVFNfUFJPQ19ET01BSU5OQU1FKTsKIAl1cF93cml0ZSgmdXRzX3NlbSk7CiAJcmV0dXJuIGVycm5vOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c19uaS5jIGIva2VybmVsL3N5c19uaS5jCmluZGV4IGE5YTVkZTAuLjQ3YmZhMTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNfbmkuYworKysgYi9rZXJuZWwvc3lzX25pLmMKQEAgLTE0NSw2ICsxNDUsMTAgQEAKIGNvbmRfc3lzY2FsbChzeXNfaW9fY2FuY2VsKTsKIGNvbmRfc3lzY2FsbChzeXNfaW9fZ2V0ZXZlbnRzKTsKIGNvbmRfc3lzY2FsbChzeXNfc3lzbG9nKTsKK2NvbmRfc3lzY2FsbChzeXNfcHJvY2Vzc192bV9yZWFkdik7Citjb25kX3N5c2NhbGwoc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KTsKK2NvbmRfc3lzY2FsbChjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYpOworY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfcHJvY2Vzc192bV93cml0ZXYpOwogCiAvKiBhcmNoLXNwZWNpZmljIHdlYWsgc3lzY2FsbCBlbnRyaWVzICovCiBjb25kX3N5c2NhbGwoc3lzX3BjaWNvbmZpZ19yZWFkKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCAyZDJlY2RjLi5hZTI3MTk2IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGlwZV9mc19pLmg+CiAjaW5jbHVkZSA8bGludXgvb29tLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtMTM0LDYgKzEzNSw3IEBACiBzdGF0aWMgaW50IG1pbl9wZXJjcHVfcGFnZWxpc3RfZnJhY3QgPSA4OwogCiBzdGF0aWMgaW50IG5ncm91cHNfbWF4ID0gTkdST1VQU19NQVg7CitzdGF0aWMgY29uc3QgaW50IGNhcF9sYXN0X2NhcCA9IENBUF9MQVNUX0NBUDsKIAogI2lmZGVmIENPTkZJR19JTk9USUZZX1VTRVIKICNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CkBAIC0xNTEsMTQgKzE1Myw2IEBACiBleHRlcm4gaW50IHVuYWxpZ25lZF9lbmFibGVkOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUzM5MAotI2lmZGVmIENPTkZJR19NQVRIRU1VCi1leHRlcm4gaW50IHN5c2N0bF9pZWVlX2VtdWxhdGlvbl93YXJuaW5nczsKLSNlbmRpZgotZXh0ZXJuIGludCBzeXNjdGxfdXNlcnByb2Nlc3NfZGVidWc7Ci1leHRlcm4gaW50IHNwaW5fcmV0cnk7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19JQTY0CiBleHRlcm4gaW50IG5vX3VuYWxpZ25lZF93YXJuaW5nOwogZXh0ZXJuIGludCB1bmFsaWduZWRfZHVtcF9zdGFjazsKQEAgLTc0MCw2ICs3MzQsMTMgQEAKIAkJLm1vZGUJCT0gMDQ0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJjYXBfbGFzdF9jYXAiLAorCQkuZGF0YQkJPSAodm9pZCAqKSZjYXBfbGFzdF9jYXAsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCX0sCiAjaWYgZGVmaW5lZChDT05GSUdfTE9DS1VQX0RFVEVDVE9SKQogCXsKIAkJLnByb2NuYW1lICAgICAgID0gIndhdGNoZG9nIiwKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IGQ3NzYwNjIuLjczZTQxNmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtMjcsNyArMjcsNyBAQAogICoJd2l0aCBuYW5vc2Vjb25kIGFjY3VyYWN5CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9wb3NpeC1jbG9jay5jIGIva2VybmVsL3RpbWUvcG9zaXgtY2xvY2suYwppbmRleCBjMzQwY2E2Li5jZTAzM2M3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9wb3NpeC1jbG9jay5jCisrKyBiL2tlcm5lbC90aW1lL3Bvc2l4LWNsb2NrLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeC1jbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggOGNmZjM2MS4uZGJhYTYyNCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTIwLDcgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCmluZGV4IDdjOTEwYTUuLjE2ZmMzNGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwppbmRleCAwNzdkODUzLi45MDBiNDA5IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N5c2NhbGxzLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYwppbmRleCBlZTdiNWEwLi5jYjY1NDU0IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYwpAQCAtMiw2ICsyLDcgQEAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIGZvciBNT0RVTEVfTkFNRV9MRU4gdmlhIEtTWU1fU1lNQk9MX0xFTiAqLwogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxhc20vc3lzY2FsbC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3VwLmMgYi9rZXJuZWwvdXAuYwppbmRleCAxZmYyN2EyLi5jNTRjNzVlIDEwMDY0NAotLS0gYS9rZXJuZWwvdXAuYworKysgYi9rZXJuZWwvdXAuYwpAQCAtNCw3ICs0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCiBpbnQgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGludCBjcHUsIHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sCmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci1yZXR1cm4tbm90aWZpZXIuYyBiL2tlcm5lbC91c2VyLXJldHVybi1ub3RpZmllci5jCmluZGV4IDkyY2I3MDYuLjE3NDRiYjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyLXJldHVybi1ub3RpZmllci5jCisrKyBiL2tlcm5lbC91c2VyLXJldHVybi1ub3RpZmllci5jCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzZXItcmV0dXJuLW5vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBobGlzdF9oZWFkLCByZXR1cm5fbm90aWZpZXJfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jCmluZGV4IDllMDNlOWMuLjcxZGQyMzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyLmMKKysrIGIva2VybmVsL3VzZXIuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tleS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCmluZGV4IDlkYTI4OWMuLjNiOTA2ZTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCisrKyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCkBAIC01LDcgKzUsNyBAQAogICogIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC91dHNuYW1lLmMgYi9rZXJuZWwvdXRzbmFtZS5jCmluZGV4IGJmZjEzMWIuLjQwNWNhZjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91dHNuYW1lLmMKKysrIGIva2VybmVsL3V0c25hbWUuYwpAQCAtOSw3ICs5LDcgQEAKICAqICBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91dHMuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvdXRzbmFtZV9zeXNjdGwuYyBiL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jCmluZGV4IGEyY2Q3N2UuLjYzZGEzOGMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jCisrKyBiL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jCkBAIC05LDEwICs5LDExIEBACiAgKiAgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXRzLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogc3RhdGljIHZvaWQgKmdldF91dHMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlKQogewpAQCAtNTEsMTIgKzUyLDE5IEBACiAJdXRzX3RhYmxlLmRhdGEgPSBnZXRfdXRzKHRhYmxlLCB3cml0ZSk7CiAJciA9IHByb2NfZG9zdHJpbmcoJnV0c190YWJsZSx3cml0ZSxidWZmZXIsbGVucCwgcHBvcyk7CiAJcHV0X3V0cyh0YWJsZSwgd3JpdGUsIHV0c190YWJsZS5kYXRhKTsKKworCWlmICh3cml0ZSkKKwkJcHJvY19zeXNfcG9sbF9ub3RpZnkodGFibGUtPnBvbGwpOworCiAJcmV0dXJuIHI7CiB9CiAjZWxzZQogI2RlZmluZSBwcm9jX2RvX3V0c19zdHJpbmcgTlVMTAogI2VuZGlmCiAKK3N0YXRpYyBERUZJTkVfQ1RMX1RBQkxFX1BPTEwoaG9zdG5hbWVfcG9sbCk7CitzdGF0aWMgREVGSU5FX0NUTF9UQUJMRV9QT0xMKGRvbWFpbm5hbWVfcG9sbCk7CisKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHV0c19rZXJuX3RhYmxlW10gPSB7CiAJewogCQkucHJvY25hbWUJPSAib3N0eXBlIiwKQEAgLTg1LDYgKzkzLDcgQEAKIAkJLm1heGxlbgkJPSBzaXplb2YoaW5pdF91dHNfbnMubmFtZS5ub2RlbmFtZSksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvX3V0c19zdHJpbmcsCisJCS5wb2xsCQk9ICZob3N0bmFtZV9wb2xsLAogCX0sCiAJewogCQkucHJvY25hbWUJPSAiZG9tYWlubmFtZSIsCkBAIC05Miw2ICsxMDEsNyBAQAogCQkubWF4bGVuCQk9IHNpemVvZihpbml0X3V0c19ucy5uYW1lLmRvbWFpbm5hbWUpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb191dHNfc3RyaW5nLAorCQkucG9sbAkJPSAmZG9tYWlubmFtZV9wb2xsLAogCX0sCiAJe30KIH07CkBAIC0xMDUsNiArMTE1LDE5IEBACiAJe30KIH07CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19TWVNDVEwKKy8qCisgKiBOb3RpZnkgdXNlcnNwYWNlIGFib3V0IGEgY2hhbmdlIGluIGEgY2VydGFpbiBlbnRyeSBvZiB1dHNfa2Vybl90YWJsZSwKKyAqIGlkZW50aWZpZWQgYnkgdGhlIHBhcmFtZXRlciBwcm9jLgorICovCit2b2lkIHV0c19wcm9jX25vdGlmeShlbnVtIHV0c19wcm9jIHByb2MpCit7CisJc3RydWN0IGN0bF90YWJsZSAqdGFibGUgPSAmdXRzX2tlcm5fdGFibGVbcHJvY107CisKKwlwcm9jX3N5c19wb2xsX25vdGlmeSh0YWJsZS0+cG9sbCk7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgdXRzbmFtZV9zeXNjdGxfaW5pdCh2b2lkKQogewogCXJlZ2lzdGVyX3N5c2N0bF90YWJsZSh1dHNfcm9vdF90YWJsZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvd2FpdC5jIGIva2VybmVsL3dhaXQuYwppbmRleCBmNDVlYThkLi4yNmZhNzc5IDEwMDY0NAotLS0gYS9rZXJuZWwvd2FpdC5jCisrKyBiL2tlcm5lbC93YWl0LmMKQEAgLTQsNyArNCw3IEBACiAgKiAoQykgMjAwNCBXaWxsaWFtIElyd2luLCBPcmFjbGUKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3dhdGNoZG9nLmMgYi9rZXJuZWwvd2F0Y2hkb2cuYwppbmRleCBkNjgwMzgxLi4xZDdiY2E3IDEwMDY0NAotLS0gYS9rZXJuZWwvd2F0Y2hkb2cuYworKysgYi9rZXJuZWwvd2F0Y2hkb2cuYwpAQCAtNDgxLDYgKzQ4MSw4IEBACiAJfQogfQogCisvKiBzeXNjdGwgZnVuY3Rpb25zICovCisjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIHZvaWQgd2F0Y2hkb2dfZW5hYmxlX2FsbF9jcHVzKHZvaWQpCiB7CiAJaW50IGNwdTsKQEAgLTUxMCw4ICs1MTIsNiBAQAogfQogCiAKLS8qIHN5c2N0bCBmdW5jdGlvbnMgKi8KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCiAvKgogICogcHJvYyBoYW5kbGVyIGZvciAvcHJvYy9zeXMva2VybmVsL25taV93YXRjaGRvZyx3YXRjaGRvZ190aHJlc2gKICAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IDE3ODNhYWIuLjQyZmE5YWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAqIFBsZWFzZSByZWFkIERvY3VtZW50YXRpb24vd29ya3F1ZXVlLnR4dCBmb3IgZGV0YWlscy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IDc1MzMwYmQuLjgyOTI4ZjUgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC0yNDgsOCArMjQ4LDkgQEAKIAkgIHRvIGRldGVybWluZSB3aGVuIGEgdGFzayBoYXMgYmVjb21lIG5vbi1yZXNwb25zaXZlIGFuZCBzaG91bGQKIAkgIGJlIGNvbnNpZGVyZWQgaHVuZy4KIAotCSAgSXQgY2FuIGJlIGFkanVzdGVkIGF0IHJ1bnRpbWUgdmlhIHRoZSBrZXJuZWwuaHVuZ190YXNrX3RpbWVvdXQKLQkgIHN5c2N0bCBvciBieSB3cml0aW5nIGEgdmFsdWUgdG8gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dC4KKwkgIEl0IGNhbiBiZSBhZGp1c3RlZCBhdCBydW50aW1lIHZpYSB0aGUga2VybmVsLmh1bmdfdGFza190aW1lb3V0X3NlY3MKKwkgIHN5c2N0bCBvciBieSB3cml0aW5nIGEgdmFsdWUgdG8KKwkgIC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2Vjcy4KIAogCSAgQSB0aW1lb3V0IG9mIDAgZGlzYWJsZXMgdGhlIGNoZWNrLiAgVGhlIGRlZmF1bHQgaXMgdHdvIG1pbnV0ZXMuCiAJICBLZWVwaW5nIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBmaW5lIGluIG1vc3QgY2FzZXMuCkBAIC0xMDcwLDYgKzEwNzEsMTcgQEAKIAkgIE9ubHkgd29ya3Mgd2l0aCBkcml2ZXJzIHRoYXQgdXNlIHRoZSBnZW5lcmljIHRpbWVvdXQgaGFuZGxpbmcsCiAJICBmb3Igb3RoZXJzIGl0IHdvbnQgZG8gYW55dGhpbmcuCiAKK2NvbmZpZyBGQUlMX01NQ19SRVFVRVNUCisJYm9vbCAiRmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdHkgZm9yIE1NQyBJTyIKKwlzZWxlY3QgREVCVUdfRlMKKwlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTiAmJiBNTUMKKwloZWxwCisJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IGZvciBNTUMgSU8uCisJICBUaGlzIHdpbGwgbWFrZSB0aGUgbW1jIGNvcmUgcmV0dXJuIGRhdGEgZXJyb3JzLiBUaGlzIGlzCisJICB1c2VmdWwgdG8gdGVzdCB0aGUgZXJyb3IgaGFuZGxpbmcgaW4gdGhlIG1tYyBibG9jayBkZXZpY2UKKwkgIGFuZCB0byB0ZXN0IGhvdyB0aGUgbW1jIGhvc3QgZHJpdmVyIGhhbmRsZXMgcmV0cmllcyBmcm9tCisJICB0aGUgYmxvY2sgZGV2aWNlLgorCiBjb25maWcgRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCiAJYm9vbCAiRGVidWdmcyBlbnRyaWVzIGZvciBmYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0aWVzIgogCWRlcGVuZHMgb24gRkFVTFRfSU5KRUNUSU9OICYmIFNZU0ZTICYmIERFQlVHX0ZTCmRpZmYgLS1naXQgYS9saWIvYml0bWFwLmMgYi9saWIvYml0bWFwLmMKaW5kZXggMmY0NDEyZS4uMGQ0YTEyNyAxMDA2NDQKLS0tIGEvbGliL2JpdG1hcC5jCisrKyBiL2xpYi9iaXRtYXAuYwpAQCAtNDE5LDcgKzQxOSw3IEBACiB7CiAJaW50IGMsIG9sZF9jLCB0b3RhbGRpZ2l0cywgbmRpZ2l0cywgbmNodW5rcywgbmJpdHM7CiAJdTMyIGNodW5rOwotCWNvbnN0IGNoYXIgX191c2VyICp1YnVmID0gYnVmOworCWNvbnN0IGNoYXIgX191c2VyIF9fZm9yY2UgKnVidWYgPSAoY29uc3QgY2hhciBfX3VzZXIgX19mb3JjZSAqKWJ1ZjsKIAogCWJpdG1hcF96ZXJvKG1hc2twLCBubWFza2JpdHMpOwogCkBAIC01MDQsNyArNTA0LDkgQEAKIHsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdWJ1ZiwgdWxlbikpCiAJCXJldHVybiAtRUZBVUxUOwotCXJldHVybiBfX2JpdG1hcF9wYXJzZSgoY29uc3QgY2hhciAqKXVidWYsIHVsZW4sIDEsIG1hc2twLCBubWFza2JpdHMpOworCXJldHVybiBfX2JpdG1hcF9wYXJzZSgoY29uc3QgY2hhciBfX2ZvcmNlICopdWJ1ZiwKKwkJCQl1bGVuLCAxLCBtYXNrcCwgbm1hc2tiaXRzKTsKKwogfQogRVhQT1JUX1NZTUJPTChiaXRtYXBfcGFyc2VfdXNlcik7CiAKQEAgLTU5NCw3ICs1OTYsNyBAQAogewogCXVuc2lnbmVkIGEsIGI7CiAJaW50IGMsIG9sZF9jLCB0b3RhbGRpZ2l0czsKLQljb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiA9IGJ1ZjsKKwljb25zdCBjaGFyIF9fdXNlciBfX2ZvcmNlICp1YnVmID0gKGNvbnN0IGNoYXIgX191c2VyIF9fZm9yY2UgKilidWY7CiAJaW50IGV4cF9kaWdpdCwgaW5fcmFuZ2U7CiAKIAl0b3RhbGRpZ2l0cyA9IGMgPSAwOwpAQCAtNjk0LDcgKzY5Niw3IEBACiB7CiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVidWYsIHVsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gX19iaXRtYXBfcGFyc2VsaXN0KChjb25zdCBjaGFyICopdWJ1ZiwKKwlyZXR1cm4gX19iaXRtYXBfcGFyc2VsaXN0KChjb25zdCBjaGFyIF9fZm9yY2UgKil1YnVmLAogCQkJCQl1bGVuLCAxLCBtYXNrcCwgbm1hc2tiaXRzKTsKIH0KIEVYUE9SVF9TWU1CT0woYml0bWFwX3BhcnNlbGlzdF91c2VyKTsKZGlmZiAtLWdpdCBhL2xpYi9kbWEtZGVidWcuYyBiL2xpYi9kbWEtZGVidWcuYwppbmRleCBkYjA3YmZkLi43NGM2YzdmIDEwMDY0NAotLS0gYS9saWIvZG1hLWRlYnVnLmMKKysrIGIvbGliL2RtYS1kZWJ1Zy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTYyLDYgKzYzLDggQEAKICNlbmRpZgogfTsKIAordHlwZWRlZiBib29sICgqbWF0Y2hfZm4pKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKiwgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqKTsKKwogc3RydWN0IGhhc2hfYnVja2V0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3BpbmxvY2tfdCBsb2NrOwpAQCAtMjQwLDE4ICsyNDMsMzcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidWNrZXQtPmxvY2ssIF9fZmxhZ3MpOwogfQogCitzdGF0aWMgYm9vbCBleGFjdF9tYXRjaChzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICphLCBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpiKQoreworCXJldHVybiAoKGEtPmRldl9hZGRyID09IGEtPmRldl9hZGRyKSAmJgorCQkoYS0+ZGV2ID09IGItPmRldikpID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBjb250YWluaW5nX21hdGNoKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmEsCisJCQkgICAgIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmIpCit7CisJaWYgKGEtPmRldiAhPSBiLT5kZXYpCisJCXJldHVybiBmYWxzZTsKKworCWlmICgoYi0+ZGV2X2FkZHIgPD0gYS0+ZGV2X2FkZHIpICYmCisJICAgICgoYi0+ZGV2X2FkZHIgKyBiLT5zaXplKSA+PSAoYS0+ZGV2X2FkZHIgKyBhLT5zaXplKSkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiAvKgogICogU2VhcmNoIGEgZ2l2ZW4gZW50cnkgaW4gdGhlIGhhc2ggYnVja2V0IGxpc3QKICAqLwotc3RhdGljIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmhhc2hfYnVja2V0X2ZpbmQoc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQsCi0JCQkJCQlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpyZWYpCitzdGF0aWMgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqX19oYXNoX2J1Y2tldF9maW5kKHN0cnVjdCBoYXNoX2J1Y2tldCAqYnVja2V0LAorCQkJCQkJICBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpyZWYsCisJCQkJCQkgIG1hdGNoX2ZuIG1hdGNoKQogewogCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5LCAqcmV0ID0gTlVMTDsKIAlpbnQgbWF0Y2hlcyA9IDAsIG1hdGNoX2x2bCwgbGFzdF9sdmwgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmJ1Y2tldC0+bGlzdCwgbGlzdCkgewotCQlpZiAoKGVudHJ5LT5kZXZfYWRkciAhPSByZWYtPmRldl9hZGRyKSB8fAotCQkgICAgKGVudHJ5LT5kZXYgIT0gcmVmLT5kZXYpKQorCQlpZiAoIW1hdGNoKHJlZiwgZW50cnkpKQogCQkJY29udGludWU7CiAKIAkJLyoKQEAgLTI5Myw2ICszMTUsMzkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqYnVja2V0X2ZpbmRfZXhhY3Qoc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQsCisJCQkJCQkgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqcmVmKQoreworCXJldHVybiBfX2hhc2hfYnVja2V0X2ZpbmQoYnVja2V0LCByZWYsIGV4YWN0X21hdGNoKTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmJ1Y2tldF9maW5kX2NvbnRhaW4oc3RydWN0IGhhc2hfYnVja2V0ICoqYnVja2V0LAorCQkJCQkJICAgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqcmVmLAorCQkJCQkJICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisKKwl1bnNpZ25lZCBpbnQgbWF4X3JhbmdlID0gZG1hX2dldF9tYXhfc2VnX3NpemUocmVmLT5kZXYpOworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5LCBpbmRleCA9ICpyZWY7CisJdW5zaWduZWQgaW50IHJhbmdlID0gMDsKKworCXdoaWxlIChyYW5nZSA8PSBtYXhfcmFuZ2UpIHsKKwkJZW50cnkgPSBfX2hhc2hfYnVja2V0X2ZpbmQoKmJ1Y2tldCwgJmluZGV4LCBjb250YWluaW5nX21hdGNoKTsKKworCQlpZiAoZW50cnkpCisJCQlyZXR1cm4gZW50cnk7CisKKwkJLyoKKwkJICogTm90aGluZyBmb3VuZCwgZ28gYmFjayBhIGhhc2ggYnVja2V0CisJCSAqLworCQlwdXRfaGFzaF9idWNrZXQoKmJ1Y2tldCwgZmxhZ3MpOworCQlyYW5nZSAgICAgICAgICArPSAoMSA8PCBIQVNIX0ZOX1NISUZUKTsKKwkJaW5kZXguZGV2X2FkZHIgLT0gKDEgPDwgSEFTSF9GTl9TSElGVCk7CisJCSpidWNrZXQgPSBnZXRfaGFzaF9idWNrZXQoJmluZGV4LCBmbGFncyk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKIC8qCiAgKiBBZGQgYW4gZW50cnkgdG8gYSBoYXNoIGJ1Y2tldAogICovCkBAIC04MDIsNyArODU3LDcgQEAKIAl9CiAKIAlidWNrZXQgPSBnZXRfaGFzaF9idWNrZXQocmVmLCAmZmxhZ3MpOwotCWVudHJ5ID0gaGFzaF9idWNrZXRfZmluZChidWNrZXQsIHJlZik7CisJZW50cnkgPSBidWNrZXRfZmluZF9leGFjdChidWNrZXQsIHJlZik7CiAKIAlpZiAoIWVudHJ5KSB7CiAJCWVycl9wcmludGsocmVmLT5kZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIHRyaWVzICIKQEAgLTkwMiw3ICs5NTcsNyBAQAogCiAJYnVja2V0ID0gZ2V0X2hhc2hfYnVja2V0KHJlZiwgJmZsYWdzKTsKIAotCWVudHJ5ID0gaGFzaF9idWNrZXRfZmluZChidWNrZXQsIHJlZik7CisJZW50cnkgPSBidWNrZXRfZmluZF9jb250YWluKCZidWNrZXQsIHJlZiwgJmZsYWdzKTsKIAogCWlmICghZW50cnkpIHsKIAkJZXJyX3ByaW50ayhkZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIHRyaWVzICIKQEAgLTEwNjAsNyArMTExNSw3IEBACiAJaW50IG1hcHBlZF9lbnRzOwogCiAJYnVja2V0ICAgICAgID0gZ2V0X2hhc2hfYnVja2V0KHJlZiwgJmZsYWdzKTsKLQllbnRyeSAgICAgICAgPSBoYXNoX2J1Y2tldF9maW5kKGJ1Y2tldCwgcmVmKTsKKwllbnRyeSAgICAgICAgPSBidWNrZXRfZmluZF9leGFjdChidWNrZXQsIHJlZik7CiAJbWFwcGVkX2VudHMgID0gMDsKIAogCWlmIChlbnRyeSkKZGlmZiAtLWdpdCBhL2xpYi9mYXVsdC1pbmplY3QuYyBiL2xpYi9mYXVsdC1pbmplY3QuYwppbmRleCBmMTkzYjc3Li40Zjc1NTQwIDEwMDY0NAotLS0gYS9saWIvZmF1bHQtaW5qZWN0LmMKKysrIGIvbGliL2ZhdWx0LWluamVjdC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBzZXR1cF9mYXVsdF9hdHRyKCkgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHZhcmlvdXMgX19zZXR1cCBoYW5kbGVycywgc28gaXQKICAqIHJldHVybnMgMCBvbiBlcnJvciwgYmVjYXVzZSB0aGF0IGlzIHdoYXQgX19zZXR1cCBoYW5kbGVycyBkby4KICAqLwotaW50IF9faW5pdCBzZXR1cF9mYXVsdF9hdHRyKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyLCBjaGFyICpzdHIpCitpbnQgc2V0dXBfZmF1bHRfYXR0cihzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0ciwgY2hhciAqc3RyKQogewogCXVuc2lnbmVkIGxvbmcgcHJvYmFiaWxpdHk7CiAJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKQEAgLTM2LDYgKzM2LDcgQEAKIAogCXJldHVybiAxOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2V0dXBfZmF1bHRfYXR0cik7CiAKIHN0YXRpYyB2b2lkIGZhaWxfZHVtcChzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0cikKIHsKQEAgLTEzMCw2ICsxMzEsNyBAQAogCiAJcmV0dXJuIHRydWU7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzaG91bGRfZmFpbCk7CiAKICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCiAKQEAgLTI0Myw1ICsyNDUsNiBAQAogCiAJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKTsKIAogI2VuZGlmIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2xpYi9pZHIuYyBiL2xpYi9pZHIuYwppbmRleCA1YWNmOWJiLi5lZDA1NWIyIDEwMDY0NAotLS0gYS9saWIvaWRyLmMKKysrIGIvbGliL2lkci5jCkBAIC03NjcsOCArNzY3LDggQEAKICAqIEBzdGFydGluZ19pZDogaWQgdG8gc3RhcnQgc2VhcmNoIGF0CiAgKiBAcF9pZDoJcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGhhbmRsZQogICoKLSAqIEFsbG9jYXRlIG5ldyBJRCBhYm92ZSBvciBlcXVhbCB0byBAaWRhLiAgSXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoCi0gKiBhbnkgcmVxdWlyZWQgbG9ja3MuCisgKiBBbGxvY2F0ZSBuZXcgSUQgYWJvdmUgb3IgZXF1YWwgdG8gQHN0YXJ0aW5nX2lkLiAgSXQgc2hvdWxkIGJlIGNhbGxlZAorICogd2l0aCBhbnkgcmVxdWlyZWQgbG9ja3MuCiAgKgogICogSWYgbWVtb3J5IGlzIHJlcXVpcmVkLCBpdCB3aWxsIHJldHVybiAlLUVBR0FJTiwgeW91IHNob3VsZCB1bmxvY2sKICAqIGFuZCBnbyBiYWNrIHRvIHRoZSBpZGFfcHJlX2dldCgpIGNhbGwuICBJZiB0aGUgaWRhIGlzIGZ1bGwsIGl0IHdpbGwKQEAgLTk0NCw2ICs5NDQsNyBAQAogewogCWludCByZXQsIGlkOwogCXVuc2lnbmVkIGludCBtYXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCUJVR19PTigoaW50KXN0YXJ0IDwgMCk7CiAJQlVHX09OKChpbnQpZW5kIDwgMCk7CkBAIC05NTksNyArOTYwLDcgQEAKIAlpZiAoIWlkYV9wcmVfZ2V0KGlkYSwgZ2ZwX21hc2spKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwaW5fbG9jaygmc2ltcGxlX2lkYV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2ltcGxlX2lkYV9sb2NrLCBmbGFncyk7CiAJcmV0ID0gaWRhX2dldF9uZXdfYWJvdmUoaWRhLCBzdGFydCwgJmlkKTsKIAlpZiAoIXJldCkgewogCQlpZiAoaWQgPiBtYXgpIHsKQEAgLTk2OSw3ICs5NzAsNyBAQAogCQkJcmV0ID0gaWQ7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJnNpbXBsZV9pZGFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2ltcGxlX2lkYV9sb2NrLCBmbGFncyk7CiAKIAlpZiAodW5saWtlbHkocmV0ID09IC1FQUdBSU4pKQogCQlnb3RvIGFnYWluOwpAQCAtOTg1LDEwICs5ODYsMTIgQEAKICAqLwogdm9pZCBpZGFfc2ltcGxlX3JlbW92ZShzdHJ1Y3QgaWRhICppZGEsIHVuc2lnbmVkIGludCBpZCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJQlVHX09OKChpbnQpaWQgPCAwKTsKLQlzcGluX2xvY2soJnNpbXBsZV9pZGFfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNpbXBsZV9pZGFfbG9jaywgZmxhZ3MpOwogCWlkYV9yZW1vdmUoaWRhLCBpZCk7Ci0Jc3Bpbl91bmxvY2soJnNpbXBsZV9pZGFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2ltcGxlX2lkYV9sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGlkYV9zaW1wbGVfcmVtb3ZlKTsKIApkaWZmIC0tZ2l0IGEvbGliL2tzdHJ0b3guYyBiL2xpYi9rc3RydG94LmMKaW5kZXggNWUwNjY3NS4uN2E5NGM4ZiAxMDA2NDQKLS0tIGEvbGliL2tzdHJ0b3guYworKysgYi9saWIva3N0cnRveC5jCkBAIC0xOCwyNiArMTgsNDAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAia3N0cnRveC5oIgogCi1zdGF0aWMgaW50IF9rc3RydG91bGwoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzKQorY29uc3QgY2hhciAqX3BhcnNlX2ludGVnZXJfZml4dXBfcmFkaXgoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50ICpiYXNlKQogewotCXVuc2lnbmVkIGxvbmcgbG9uZyBhY2M7Ci0JaW50IG9rOwotCi0JaWYgKGJhc2UgPT0gMCkgeworCWlmICgqYmFzZSA9PSAwKSB7CiAJCWlmIChzWzBdID09ICcwJykgewogCQkJaWYgKF90b2xvd2VyKHNbMV0pID09ICd4JyAmJiBpc3hkaWdpdChzWzJdKSkKLQkJCQliYXNlID0gMTY7CisJCQkJKmJhc2UgPSAxNjsKIAkJCWVsc2UKLQkJCQliYXNlID0gODsKKwkJCQkqYmFzZSA9IDg7CiAJCX0gZWxzZQotCQkJYmFzZSA9IDEwOworCQkJKmJhc2UgPSAxMDsKIAl9Ci0JaWYgKGJhc2UgPT0gMTYgJiYgc1swXSA9PSAnMCcgJiYgX3RvbG93ZXIoc1sxXSkgPT0gJ3gnKQorCWlmICgqYmFzZSA9PSAxNiAmJiBzWzBdID09ICcwJyAmJiBfdG9sb3dlcihzWzFdKSA9PSAneCcpCiAJCXMgKz0gMjsKKwlyZXR1cm4gczsKK30KIAotCWFjYyA9IDA7Ci0Jb2sgPSAwOworLyoKKyAqIENvbnZlcnQgbm9uLW5lZ2F0aXZlIGludGVnZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIGV4cGxpY2l0bHkgZ2l2ZW4gcmFkaXgKKyAqIHRvIGFuIGludGVnZXIuCisgKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29uc3VtZWQgbWF5YmUgb3ItZWQgd2l0aCBvdmVyZmxvdyBiaXQuCisgKiBJZiBvdmVyZmxvdyBvY2N1cnMsIHJlc3VsdCBpbnRlZ2VyIChpbmNvcnJlY3QpIGlzIHN0aWxsIHJldHVybmVkLgorICoKKyAqIERvbid0IHlvdSBkYXJlIHVzZSB0aGlzIGZ1bmN0aW9uLgorICovCit1bnNpZ25lZCBpbnQgX3BhcnNlX2ludGVnZXIoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzKQoreworCXVuc2lnbmVkIGludCBydjsKKwlpbnQgb3ZlcmZsb3c7CisKKwkqcmVzID0gMDsKKwlydiA9IDA7CisJb3ZlcmZsb3cgPSAwOwogCXdoaWxlICgqcykgewogCQl1bnNpZ25lZCBpbnQgdmFsOwogCkBAIC00NSwyMyArNTksNDAgQEAKIAkJCXZhbCA9ICpzIC0gJzAnOwogCQllbHNlIGlmICgnYScgPD0gX3RvbG93ZXIoKnMpICYmIF90b2xvd2VyKCpzKSA8PSAnZicpCiAJCQl2YWwgPSBfdG9sb3dlcigqcykgLSAnYScgKyAxMDsKLQkJZWxzZSBpZiAoKnMgPT0gJ1xuJyAmJiAqKHMgKyAxKSA9PSAnXDAnKQotCQkJYnJlYWs7CiAJCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAKIAkJaWYgKHZhbCA+PSBiYXNlKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChhY2MgPiBkaXZfdTY0KFVMTE9OR19NQVggLSB2YWwsIGJhc2UpKQotCQkJcmV0dXJuIC1FUkFOR0U7Ci0JCWFjYyA9IGFjYyAqIGJhc2UgKyB2YWw7Ci0JCW9rID0gMTsKLQorCQkJYnJlYWs7CisJCWlmICgqcmVzID4gZGl2X3U2NChVTExPTkdfTUFYIC0gdmFsLCBiYXNlKSkKKwkJCW92ZXJmbG93ID0gMTsKKwkJKnJlcyA9ICpyZXMgKiBiYXNlICsgdmFsOworCQlydisrOwogCQlzKys7CiAJfQotCWlmICghb2spCisJaWYgKG92ZXJmbG93KQorCQlydiB8PSBLU1RSVE9YX09WRVJGTE9XOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBfa3N0cnRvdWxsKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnJlcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgX3JlczsKKwl1bnNpZ25lZCBpbnQgcnY7CisKKwlzID0gX3BhcnNlX2ludGVnZXJfZml4dXBfcmFkaXgocywgJmJhc2UpOworCXJ2ID0gX3BhcnNlX2ludGVnZXIocywgYmFzZSwgJl9yZXMpOworCWlmIChydiAmIEtTVFJUT1hfT1ZFUkZMT1cpCisJCXJldHVybiAtRVJBTkdFOworCXJ2ICY9IH5LU1RSVE9YX09WRVJGTE9XOworCWlmIChydiA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQkqcmVzID0gYWNjOworCXMgKz0gcnY7CisJaWYgKCpzID09ICdcbicpCisJCXMrKzsKKwlpZiAoKnMpCisJCXJldHVybiAtRUlOVkFMOworCSpyZXMgPSBfcmVzOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWIva3N0cnRveC5oIGIvbGliL2tzdHJ0b3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTNlZWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2tzdHJ0b3guaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0xJQl9LU1RSVE9YX0gKKyNkZWZpbmUgX0xJQl9LU1RSVE9YX0gKKworI2RlZmluZSBLU1RSVE9YX09WRVJGTE9XCSgxVSA8PCAzMSkKK2NvbnN0IGNoYXIgKl9wYXJzZV9pbnRlZ2VyX2ZpeHVwX3JhZGl4KGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCAqYmFzZSk7Cit1bnNpZ25lZCBpbnQgX3BhcnNlX2ludGVnZXIoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbmxhdHRyLmMgYi9saWIvbmxhdHRyLmMKaW5kZXggYWMwOWYyMi4uYTg0MDhiNiAxMDA2NDQKLS0tIGEvbGliL25sYXR0ci5jCisrKyBiL2xpYi9ubGF0dHIuYwpAQCAtMjAsNiArMjAsNyBAQAogCVtOTEFfVTE2XQk9IHNpemVvZih1MTYpLAogCVtOTEFfVTMyXQk9IHNpemVvZih1MzIpLAogCVtOTEFfVTY0XQk9IHNpemVvZih1NjQpLAorCVtOTEFfTVNFQ1NdCT0gc2l6ZW9mKHU2NCksCiAJW05MQV9ORVNURURdCT0gTkxBX0hEUkxFTiwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJjcHVfY291bnRlci5jIGIvbGliL3BlcmNwdV9jb3VudGVyLmMKaW5kZXggZjA4NzEwNS4uZjhhM2YxYSAxMDA2NDQKLS0tIGEvbGliL3BlcmNwdV9jb3VudGVyLmMKKysrIGIvbGliL3BlcmNwdV9jb3VudGVyLmMKQEAgLTEwLDggKzEwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdvYmplY3RzLmg+CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIHN0YXRpYyBMSVNUX0hFQUQocGVyY3B1X2NvdW50ZXJzKTsKIHN0YXRpYyBERUZJTkVfTVVURVgocGVyY3B1X2NvdW50ZXJzX2xvY2spOworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19QRVJDUFVfQ09VTlRFUgogCmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCBhMmY5ZGE1Li5kOWRmNzQ1IDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTU3Niw3ICs1NzYsNiBAQAogewogCXVuc2lnbmVkIGludCBoZWlnaHQsIHNoaWZ0OwogCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7Ci0JaW50IHNhd191bnNldF90YWcgPSAwOwogCiAJLyogY2hlY2sgdGhlIHJvb3QncyB0YWcgYml0ICovCiAJaWYgKCFyb290X3RhZ19nZXQocm9vdCwgdGFnKSkKQEAgLTYwMywxNSArNjAyLDEwIEBACiAJCQlyZXR1cm4gMDsKIAogCQlvZmZzZXQgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKLQotCQkvKgotCQkgKiBUaGlzIGlzIGp1c3QgYSBkZWJ1ZyBjaGVjay4gIExhdGVyLCB3ZSBjYW4gYmFsZSBhcyBzb29uIGFzCi0JCSAqIHdlIHNlZSBhbiB1bnNldCB0YWcuCi0JCSAqLwogCQlpZiAoIXRhZ19nZXQobm9kZSwgdGFnLCBvZmZzZXQpKQotCQkJc2F3X3Vuc2V0X3RhZyA9IDE7CisJCQlyZXR1cm4gMDsKIAkJaWYgKGhlaWdodCA9PSAxKQotCQkJcmV0dXJuICEhdGFnX2dldChub2RlLCB0YWcsIG9mZnNldCk7CisJCQlyZXR1cm4gMTsKIAkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZV9yYXcobm9kZS0+c2xvdHNbb2Zmc2V0XSk7CiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwogCQloZWlnaHQtLTsKZGlmZiAtLWdpdCBhL2xpYi9yYWlkNi9hbGdvcy5jIGIvbGliL3JhaWQ2L2FsZ29zLmMKaW5kZXggYjU5NWY1Ni4uOGIwMmY2MCAxMDA2NDQKLS0tIGEvbGliL3JhaWQ2L2FsZ29zLmMKKysrIGIvbGliL3JhaWQ2L2FsZ29zLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2lmbmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzdGRpby5oPgpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L21rdGFibGVzLmMgYi9saWIvcmFpZDYvbWt0YWJsZXMuYwppbmRleCAzYjE1MDA4Li44YTM3ODA5IDEwMDY0NAotLS0gYS9saWIvcmFpZDYvbWt0YWJsZXMuYworKysgYi9saWIvcmFpZDYvbWt0YWJsZXMuYwpAQCAtNjAsNiArNjAsNyBAQAogCXVpbnQ4X3QgZXhwdGJsWzI1Nl0sIGludnRibFsyNTZdOwogCiAJcHJpbnRmKCIjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPlxuIik7CisJcHJpbnRmKCIjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+XG4iKTsKIAogCS8qIENvbXB1dGUgbXVsdGlwbGljYXRpb24gdGFibGUgKi8KIAlwcmludGYoIlxuY29uc3QgdTggIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMjU2KSkpXG4iCmRpZmYgLS1naXQgYS9saWIvcmFpZDYvcmVjb3YuYyBiL2xpYi9yYWlkNi9yZWNvdi5jCmluZGV4IDg1OTBkMTkuLmZlMjc1ZDcgMTAwNjQ0Ci0tLSBhL2xpYi9yYWlkNi9yZWNvdi5jCisrKyBiL2xpYi9yYWlkNi9yZWNvdi5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiB0aGUgc3luZHJvbWUuKQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CiAKIC8qIFJlY292ZXIgdHdvIGZhaWxlZCBkYXRhIGJsb2Nrcy4gKi8KZGlmZiAtLWdpdCBhL2xpYi9zcGlubG9ja19kZWJ1Zy5jIGIvbGliL3NwaW5sb2NrX2RlYnVnLmMKaW5kZXggNDc1NWI5OC4uNWYzZWFjZGQgMTAwNjQ0Ci0tLSBhL2xpYi9zcGlubG9ja19kZWJ1Zy5jCisrKyBiL2xpYi9zcGlubG9ja19kZWJ1Zy5jCkBAIC00OSwxMyArNDksMTAgQEAKIAogRVhQT1JUX1NZTUJPTChfX3J3bG9ja19pbml0KTsKIAotc3RhdGljIHZvaWQgc3Bpbl9idWcocmF3X3NwaW5sb2NrX3QgKmxvY2ssIGNvbnN0IGNoYXIgKm1zZykKK3N0YXRpYyB2b2lkIHNwaW5fZHVtcChyYXdfc3BpbmxvY2tfdCAqbG9jaywgY29uc3QgY2hhciAqbXNnKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXIgPSBOVUxMOwogCi0JaWYgKCFkZWJ1Z19sb2Nrc19vZmYoKSkKLQkJcmV0dXJuOwotCiAJaWYgKGxvY2stPm93bmVyICYmIGxvY2stPm93bmVyICE9IFNQSU5MT0NLX09XTkVSX0lOSVQpCiAJCW93bmVyID0gbG9jay0+b3duZXI7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIkJVRzogc3BpbmxvY2sgJXMgb24gQ1BVIyVkLCAlcy8lZFxuIiwKQEAgLTcwLDYgKzY3LDE0IEBACiAJZHVtcF9zdGFjaygpOwogfQogCitzdGF0aWMgdm9pZCBzcGluX2J1ZyhyYXdfc3BpbmxvY2tfdCAqbG9jaywgY29uc3QgY2hhciAqbXNnKQoreworCWlmICghZGVidWdfbG9ja3Nfb2ZmKCkpCisJCXJldHVybjsKKworCXNwaW5fZHVtcChsb2NrLCBtc2cpOworfQorCiAjZGVmaW5lIFNQSU5fQlVHX09OKGNvbmQsIGxvY2ssIG1zZykgaWYgKHVubGlrZWx5KGNvbmQpKSBzcGluX2J1Zyhsb2NrLCBtc2cpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMTEzLDExICsxMTgsNyBAQAogCQkvKiBsb2NrdXAgc3VzcGVjdGVkOiAqLwogCQlpZiAocHJpbnRfb25jZSkgewogCQkJcHJpbnRfb25jZSA9IDA7Ci0JCQlwcmludGsoS0VSTl9FTUVSRyAiQlVHOiBzcGlubG9jayBsb2NrdXAgb24gQ1BVIyVkLCAiCi0JCQkJCSIlcy8lZCwgJXBcbiIsCi0JCQkJcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwgY3VycmVudC0+Y29tbSwKLQkJCQl0YXNrX3BpZF9ucihjdXJyZW50KSwgbG9jayk7Ci0JCQlkdW1wX3N0YWNrKCk7CisJCQlzcGluX2R1bXAobG9jaywgImxvY2t1cCIpOwogI2lmZGVmIENPTkZJR19TTVAKIAkJCXRyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2UoKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N0cmluZy5jIGIvbGliL3N0cmluZy5jCmluZGV4IDAxZmFkOWIuLmRjNGE4NjMgMTAwNjQ0Ci0tLSBhL2xpYi9zdHJpbmcuYworKysgYi9saWIvc3RyaW5nLmMKQEAgLTM2MCw3ICszNjAsNiBAQAogCXNpemVfdCBzaXplOwogCWNoYXIgKmVuZDsKIAotCXMgPSBza2lwX3NwYWNlcyhzKTsKIAlzaXplID0gc3RybGVuKHMpOwogCWlmICghc2l6ZSkKIAkJcmV0dXJuIHM7CkBAIC0zNzAsNyArMzY5LDcgQEAKIAkJZW5kLS07CiAJKihlbmQgKyAxKSA9ICdcMCc7CiAKLQlyZXR1cm4gczsKKwlyZXR1cm4gc2tpcF9zcGFjZXMocyk7CiB9CiBFWFBPUlRfU1lNQk9MKHN0cmltKTsKIApAQCAtNzU2LDMgKzc1NSw1NyBAQAogfQogRVhQT1JUX1NZTUJPTChtZW1jaHIpOwogI2VuZGlmCisKK3N0YXRpYyB2b2lkICpjaGVja19ieXRlczgoY29uc3QgdTggKnN0YXJ0LCB1OCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCXdoaWxlIChieXRlcykgeworCQlpZiAoKnN0YXJ0ICE9IHZhbHVlKQorCQkJcmV0dXJuICh2b2lkICopc3RhcnQ7CisJCXN0YXJ0Kys7CisJCWJ5dGVzLS07CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG1lbWNocl9pbnYgLSBGaW5kIGFuIHVubWF0Y2hpbmcgY2hhcmFjdGVyIGluIGFuIGFyZWEgb2YgbWVtb3J5LgorICogQHN0YXJ0OiBUaGUgbWVtb3J5IGFyZWEKKyAqIEBjOiBGaW5kIGEgY2hhcmFjdGVyIG90aGVyIHRoYW4gYworICogQGJ5dGVzOiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KKyAqCisgKiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBAYywgb3IgJU5VTEwKKyAqIGlmIHRoZSB3aG9sZSBidWZmZXIgY29udGFpbnMganVzdCBAYy4KKyAqLwordm9pZCAqbWVtY2hyX2ludihjb25zdCB2b2lkICpzdGFydCwgaW50IGMsIHNpemVfdCBieXRlcykKK3sKKwl1OCB2YWx1ZSA9IGM7CisJdTY0IHZhbHVlNjQ7CisJdW5zaWduZWQgaW50IHdvcmRzLCBwcmVmaXg7CisKKwlpZiAoYnl0ZXMgPD0gMTYpCisJCXJldHVybiBjaGVja19ieXRlczgoc3RhcnQsIHZhbHVlLCBieXRlcyk7CisKKwl2YWx1ZTY0ID0gdmFsdWUgfCB2YWx1ZSA8PCA4IHwgdmFsdWUgPDwgMTYgfCB2YWx1ZSA8PCAyNDsKKwl2YWx1ZTY0ID0gKHZhbHVlNjQgJiAweGZmZmZmZmZmKSB8IHZhbHVlNjQgPDwgMzI7CisJcHJlZml4ID0gOCAtICgodW5zaWduZWQgbG9uZylzdGFydCkgJSA4OworCisJaWYgKHByZWZpeCkgeworCQl1OCAqciA9IGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIHByZWZpeCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJCXN0YXJ0ICs9IHByZWZpeDsKKwkJYnl0ZXMgLT0gcHJlZml4OworCX0KKworCXdvcmRzID0gYnl0ZXMgLyA4OworCisJd2hpbGUgKHdvcmRzKSB7CisJCWlmICgqKHU2NCAqKXN0YXJ0ICE9IHZhbHVlNjQpCisJCQlyZXR1cm4gY2hlY2tfYnl0ZXM4KHN0YXJ0LCB2YWx1ZSwgOCk7CisJCXN0YXJ0ICs9IDg7CisJCXdvcmRzLS07CisJfQorCisJcmV0dXJuIGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIGJ5dGVzICUgOCk7Cit9CitFWFBPUlRfU1lNQk9MKG1lbWNocl9pbnYpOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBkNzIyMmE5Li45OTM1OTllIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMzEsMTcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4JLyogZm9yIGRlcmVmZXJlbmNlX2Z1bmN0aW9uX2Rlc2NyaXB0b3IoKSAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHNpbXBsZV9ndWVzc19iYXNlKGNvbnN0IGNoYXIgKmNwKQotewotCWlmIChjcFswXSA9PSAnMCcpIHsKLQkJaWYgKF90b2xvd2VyKGNwWzFdKSA9PSAneCcgJiYgaXN4ZGlnaXQoY3BbMl0pKQotCQkJcmV0dXJuIDE2OwotCQllbHNlCi0JCQlyZXR1cm4gODsKLQl9IGVsc2UgewotCQlyZXR1cm4gMTA7Ci0JfQotfQorI2luY2x1ZGUgImtzdHJ0b3guaCIKIAogLyoqCiAgKiBzaW1wbGVfc3RydG91bGwgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZwpAQCAtNTEsMjMgKzQxLDE0IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgbG9uZyBzaW1wbGVfc3RydG91bGwoY29uc3QgY2hhciAqY3AsIGNoYXIgKiplbmRwLCB1bnNpZ25lZCBpbnQgYmFzZSkKIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVzdWx0OworCXVuc2lnbmVkIGludCBydjsKIAotCWlmICghYmFzZSkKLQkJYmFzZSA9IHNpbXBsZV9ndWVzc19iYXNlKGNwKTsKKwljcCA9IF9wYXJzZV9pbnRlZ2VyX2ZpeHVwX3JhZGl4KGNwLCAmYmFzZSk7CisJcnYgPSBfcGFyc2VfaW50ZWdlcihjcCwgYmFzZSwgJnJlc3VsdCk7CisJLyogRklYTUUgKi8KKwljcCArPSAocnYgJiB+S1NUUlRPWF9PVkVSRkxPVyk7CiAKLQlpZiAoYmFzZSA9PSAxNiAmJiBjcFswXSA9PSAnMCcgJiYgX3RvbG93ZXIoY3BbMV0pID09ICd4JykKLQkJY3AgKz0gMjsKLQotCXdoaWxlIChpc3hkaWdpdCgqY3ApKSB7Ci0JCXVuc2lnbmVkIGludCB2YWx1ZTsKLQotCQl2YWx1ZSA9IGlzZGlnaXQoKmNwKSA/ICpjcCAtICcwJyA6IF90b2xvd2VyKCpjcCkgLSAnYScgKyAxMDsKLQkJaWYgKHZhbHVlID49IGJhc2UpCi0JCQlicmVhazsKLQkJcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIHZhbHVlOwotCQljcCsrOwotCX0KIAlpZiAoZW5kcCkKIAkJKmVuZHAgPSAoY2hhciAqKWNwOwogCkBAIC01NjYsNyArNTQ3LDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCXAgPSBwYWNrX2hleF9ieXRlKHAsIGFkZHJbaV0pOworCQlwID0gaGV4X2J5dGVfcGFjayhwLCBhZGRyW2ldKTsKIAkJaWYgKGZtdFswXSA9PSAnTScgJiYgaSAhPSA1KQogCQkJKnArKyA9IHNlcGFyYXRvcjsKIAl9CkBAIC02ODYsMTMgKzY2NywxMyBAQAogCQlsbyA9IHdvcmQgJiAweGZmOwogCQlpZiAoaGkpIHsKIAkJCWlmIChoaSA+IDB4MGYpCi0JCQkJcCA9IHBhY2tfaGV4X2J5dGUocCwgaGkpOworCQkJCXAgPSBoZXhfYnl0ZV9wYWNrKHAsIGhpKTsKIAkJCWVsc2UKIAkJCQkqcCsrID0gaGV4X2FzY19sbyhoaSk7Ci0JCQlwID0gcGFja19oZXhfYnl0ZShwLCBsbyk7CisJCQlwID0gaGV4X2J5dGVfcGFjayhwLCBsbyk7CiAJCX0KIAkJZWxzZSBpZiAobG8gPiAweDBmKQotCQkJcCA9IHBhY2tfaGV4X2J5dGUocCwgbG8pOworCQkJcCA9IGhleF9ieXRlX3BhY2socCwgbG8pOwogCQllbHNlCiAJCQkqcCsrID0gaGV4X2FzY19sbyhsbyk7CiAJCW5lZWRjb2xvbiA9IHRydWU7CkBAIC03MTQsOCArNjk1LDggQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJcCA9IHBhY2tfaGV4X2J5dGUocCwgKmFkZHIrKyk7Ci0JCXAgPSBwYWNrX2hleF9ieXRlKHAsICphZGRyKyspOworCQlwID0gaGV4X2J5dGVfcGFjayhwLCAqYWRkcisrKTsKKwkJcCA9IGhleF9ieXRlX3BhY2socCwgKmFkZHIrKyk7CiAJCWlmIChmbXRbMF0gPT0gJ0knICYmIGkgIT0gNykKIAkJCSpwKysgPSAnOic7CiAJfQpAQCAtNzczLDcgKzc1NCw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJcCA9IHBhY2tfaGV4X2J5dGUocCwgYWRkcltpbmRleFtpXV0pOworCQlwID0gaGV4X2J5dGVfcGFjayhwLCBhZGRyW2luZGV4W2ldXSk7CiAJCXN3aXRjaCAoaSkgewogCQljYXNlIDM6CiAJCWNhc2UgNToKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IGYyZjFjYTEuLjAxMWIxMTAgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtMTMxLDYgKzEzMSw5IEBACiBjb25maWcgSEFWRV9NRU1CTE9DSwogCWJvb2xlYW4KIAorY29uZmlnIE5PX0JPT1RNRU0KKwlib29sZWFuCisKICMgZXZlbnR1YWxseSwgd2UgY2FuIGhhdmUgdGhpcyBvcHRpb24ganVzdCAnc2VsZWN0IFNQQVJTRU1FTScKIGNvbmZpZyBNRU1PUllfSE9UUExVRwogCWJvb2wgIkFsbG93IGZvciBtZW1vcnkgaG90LWFkZCIKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggODM2ZTQxNi4uNTBlYzAwZSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTUsNyArNSw4IEBACiBtbXUteQkJCTo9IG5vbW11Lm8KIG1tdS0kKENPTkZJR19NTVUpCTo9IGZyZW1hcC5vIGhpZ2htZW0ubyBtYWR2aXNlLm8gbWVtb3J5Lm8gbWluY29yZS5vIFwKIAkJCSAgIG1sb2NrLm8gbW1hcC5vIG1wcm90ZWN0Lm8gbXJlbWFwLm8gbXN5bmMubyBybWFwLm8gXAotCQkJICAgdm1hbGxvYy5vIHBhZ2V3YWxrLm8gcGd0YWJsZS1nZW5lcmljLm8KKwkJCSAgIHZtYWxsb2MubyBwYWdld2Fsay5vIHBndGFibGUtZ2VuZXJpYy5vIFwKKwkJCSAgIHByb2Nlc3Nfdm1fYWNjZXNzLm8KIAogb2JqLXkJCQk6PSBmaWxlbWFwLm8gbWVtcG9vbC5vIG9vbV9raWxsLm8gZmFkdmlzZS5vIFwKIAkJCSAgIG1hY2Nlc3MubyBwYWdlX2FsbG9jLm8gcGFnZS13cml0ZWJhY2subyBcCmRpZmYgLS1naXQgYS9tbS9iYWNraW5nLWRldi5jIGIvbW0vYmFja2luZy1kZXYuYwppbmRleCBhODdkYTUyLi5hMDg2MDY0IDEwMDY0NAotLS0gYS9tbS9iYWNraW5nLWRldi5jCisrKyBiL21tL2JhY2tpbmctZGV2LmMKQEAgLTk3LDYgKzk3LDcgQEAKIAkJICAgIkJkaURpcnR5VGhyZXNoOiAgICAgJTEwbHUga0JcbiIKIAkJICAgIkRpcnR5VGhyZXNoOiAgICAgICAgJTEwbHUga0JcbiIKIAkJICAgIkJhY2tncm91bmRUaHJlc2g6ICAgJTEwbHUga0JcbiIKKwkJICAgIkJkaURpcnRpZWQ6ICAgICAgICAgJTEwbHUga0JcbiIKIAkJICAgIkJkaVdyaXR0ZW46ICAgICAgICAgJTEwbHUga0JcbiIKIAkJICAgIkJkaVdyaXRlQmFuZHdpZHRoOiAgJTEwbHUga0Jwc1xuIgogCQkgICAiYl9kaXJ0eTogICAgICAgICAgICAlMTBsdVxuIgpAQCAtMTA5LDYgKzExMCw3IEBACiAJCSAgIEsoYmRpX3RocmVzaCksCiAJCSAgIEsoZGlydHlfdGhyZXNoKSwKIAkJICAgSyhiYWNrZ3JvdW5kX3RocmVzaCksCisJCSAgICh1bnNpZ25lZCBsb25nKSBLKGJkaV9zdGF0KGJkaSwgQkRJX0RJUlRJRUQpKSwKIAkJICAgKHVuc2lnbmVkIGxvbmcpIEsoYmRpX3N0YXQoYmRpLCBCRElfV1JJVFRFTikpLAogCQkgICAodW5zaWduZWQgbG9uZykgSyhiZGktPndyaXRlX2JhbmR3aWR0aCksCiAJCSAgIG5yX2RpcnR5LApAQCAtNDA0LDkgKzQwNiw4IEBACiAJCS8qCiAJCSAqIEluIHRoZSBmb2xsb3dpbmcgbG9vcCB3ZSBhcmUgZ29pbmcgdG8gY2hlY2sgd2hldGhlciB3ZSBoYXZlCiAJCSAqIHNvbWUgd29yayB0byBkbyB3aXRob3V0IGFueSBzeW5jaHJvbml6YXRpb24gd2l0aCB0YXNrcwotCQkgKiB3YWtpbmcgdXMgdXAgdG8gZG8gd29yayBmb3IgdGhlbS4gU28gd2UgaGF2ZSB0byBzZXQgdGFzawotCQkgKiBzdGF0ZSBhbHJlYWR5IGhlcmUgc28gdGhhdCB3ZSBkb24ndCBtaXNzIHdha2V1cHMgY29taW5nCi0JCSAqIGFmdGVyIHdlIHZlcmlmeSBzb21lIGNvbmRpdGlvbi4KKwkJICogd2FraW5nIHVzIHVwIHRvIGRvIHdvcmsgZm9yIHRoZW0uIFNldCB0aGUgdGFzayBzdGF0ZSBoZXJlCisJCSAqIHNvIHRoYXQgd2UgZG9uJ3QgbWlzcyB3YWtldXBzIGFmdGVyIHZlcmlmeWluZyBjb25kaXRpb25zLgogCQkgKi8KIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIApAQCAtNDc0LDcgKzQ3NSw4IEBACiAJCQkJICogdGhlIGJkaSBmcm9tIHRoZSB0aHJlYWQuIEhvcGVmdWxseSAxMDI0IGlzCiAJCQkJICogbGFyZ2UgZW5vdWdoIGZvciBlZmZpY2llbnQgSU8uCiAJCQkJICovCi0JCQkJd3JpdGViYWNrX2lub2Rlc193YigmYmRpLT53YiwgMTAyNCk7CisJCQkJd3JpdGViYWNrX2lub2Rlc193YigmYmRpLT53YiwgMTAyNCwKKwkJCQkJCSAgICBXQl9SRUFTT05fRk9SS0VSX1RIUkVBRCk7CiAJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogVGhlIHNwaW5sb2NrIG1ha2VzIHN1cmUgd2UgZG8gbm90IGxvc2UKQEAgLTY4NCw2ICs2ODYsOCBAQAogCWJkaS0+YndfdGltZV9zdGFtcCA9IGppZmZpZXM7CiAJYmRpLT53cml0dGVuX3N0YW1wID0gMDsKIAorCWJkaS0+YmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0ID0gSU5JVF9CVzsKKwliZGktPmRpcnR5X3JhdGVsaW1pdCA9IElOSVRfQlc7CiAJYmRpLT53cml0ZV9iYW5kd2lkdGggPSBJTklUX0JXOwogCWJkaS0+YXZnX3dyaXRlX2JhbmR3aWR0aCA9IElOSVRfQlc7CiAKZGlmZiAtLWdpdCBhL21tL2Jvb3RtZW0uYyBiL21tL2Jvb3RtZW0uYwppbmRleCAwMWQ1YTRiMy4uMWE3NzAxMiAxMDA2NDQKLS0tIGEvbW0vYm9vdG1lbS5jCisrKyBiL21tL2Jvb3RtZW0uYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5nZS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CmRpZmYgLS1naXQgYS9tbS9ib3VuY2UuYyBiL21tL2JvdW5jZS5jCmluZGV4IDE0ODFkZTYuLjRlOWFlNzIgMTAwNjQ0Ci0tLSBhL21tL2JvdW5jZS5jCisrKyBiL21tL2JvdW5jZS5jCkBAIC00LDcgKzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYmxvY2suaD4KQEAgLTI2LDEyICsyNywxMCBAQAogI2lmZGVmIENPTkZJR19ISUdITUVNCiBzdGF0aWMgX19pbml0IGludCBpbml0X2VtZXJnZW5jeV9wb29sKHZvaWQpCiB7Ci0Jc3RydWN0IHN5c2luZm8gaTsKLQlzaV9tZW1pbmZvKCZpKTsKLQlzaV9zd2FwaW5mbygmaSk7Ci0KLQlpZiAoIWkudG90YWxoaWdoKQorI2lmbmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKKwlpZiAobWF4X3BmbiA8PSBtYXhfbG93X3BmbikKIAkJcmV0dXJuIDA7CisjZW5kaWYKIAogCXBhZ2VfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3BhZ2VfcG9vbChQT09MX1NJWkUsIDApOwogCUJVR19PTighcGFnZV9wb29sKTsKZGlmZiAtLWdpdCBhL21tL2NvbXBhY3Rpb24uYyBiL21tL2NvbXBhY3Rpb24uYwppbmRleCA2Y2M2MDRiLi44OTlkOTU2IDEwMDY0NAotLS0gYS9tbS9jb21wYWN0aW9uLmMKKysrIGIvbW0vY29tcGFjdGlvbi5jCkBAIC0zNSwxMCArMzUsNiBAQAogCXVuc2lnbmVkIGxvbmcgbWlncmF0ZV9wZm47CS8qIGlzb2xhdGVfbWlncmF0ZXBhZ2VzIHNlYXJjaCBiYXNlICovCiAJYm9vbCBzeW5jOwkJCS8qIFN5bmNocm9ub3VzIG1pZ3JhdGlvbiAqLwogCi0JLyogQWNjb3VudCBmb3IgaXNvbGF0ZWQgYW5vbiBhbmQgZmlsZSBwYWdlcyAqLwotCXVuc2lnbmVkIGxvbmcgbnJfYW5vbjsKLQl1bnNpZ25lZCBsb25nIG5yX2ZpbGU7Ci0KIAl1bnNpZ25lZCBpbnQgb3JkZXI7CQkvKiBvcmRlciBhIGRpcmVjdCBjb21wYWN0b3IgbmVlZHMgKi8KIAlpbnQgbWlncmF0ZXR5cGU7CQkvKiBNT1ZBQkxFLCBSRUNMQUlNQUJMRSBldGMgKi8KIAlzdHJ1Y3Qgem9uZSAqem9uZTsKQEAgLTIyMywxNyArMjE5LDEzIEBACiBzdGF0aWMgdm9pZCBhY2N0X2lzb2xhdGVkKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYykKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBpbnQgY291bnRbTlJfTFJVX0xJU1RTXSA9IHsgMCwgfTsKKwl1bnNpZ25lZCBpbnQgY291bnRbMl0gPSB7IDAsIH07CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZjYy0+bWlncmF0ZXBhZ2VzLCBscnUpIHsKLQkJaW50IGxydSA9IHBhZ2VfbHJ1X2Jhc2VfdHlwZShwYWdlKTsKLQkJY291bnRbbHJ1XSsrOwotCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZjYy0+bWlncmF0ZXBhZ2VzLCBscnUpCisJCWNvdW50WyEhcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpXSsrOwogCi0JY2MtPm5yX2Fub24gPSBjb3VudFtMUlVfQUNUSVZFX0FOT05dICsgY291bnRbTFJVX0lOQUNUSVZFX0FOT05dOwotCWNjLT5ucl9maWxlID0gY291bnRbTFJVX0FDVElWRV9GSUxFXSArIGNvdW50W0xSVV9JTkFDVElWRV9GSUxFXTsKLQlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSVNPTEFURURfQU5PTiwgY2MtPm5yX2Fub24pOwotCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JU09MQVRFRF9GSUxFLCBjYy0+bnJfZmlsZSk7CisJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lTT0xBVEVEX0FOT04sIGNvdW50WzBdKTsKKwlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSVNPTEFURURfRklMRSwgY291bnRbMV0pOwogfQogCiAvKiBTaW1pbGFyIHRvIHJlY2xhaW0sIGJ1dCBkaWZmZXJlbnQgZW5vdWdoIHRoYXQgdGhleSBkb24ndCBzaGFyZSBsb2dpYyAqLwpAQCAtMjY5LDYgKzI2MSw3IEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3BhZ2VibG9ja19uciA9IDAsIHBhZ2VibG9ja19ucjsKIAl1bnNpZ25lZCBsb25nIG5yX3NjYW5uZWQgPSAwLCBucl9pc29sYXRlZCA9IDA7CiAJc3RydWN0IGxpc3RfaGVhZCAqbWlncmF0ZWxpc3QgPSAmY2MtPm1pZ3JhdGVwYWdlczsKKwlpc29sYXRlX21vZGVfdCBtb2RlID0gSVNPTEFURV9BQ1RJVkV8SVNPTEFURV9JTkFDVElWRTsKIAogCS8qIERvIG5vdCBzY2FuIG91dHNpZGUgem9uZSBib3VuZGFyaWVzICovCiAJbG93X3BmbiA9IG1heChjYy0+bWlncmF0ZV9wZm4sIHpvbmUtPnpvbmVfc3RhcnRfcGZuKTsKQEAgLTM1Niw4ICszNDksMTEgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJaWYgKCFjYy0+c3luYykKKwkJCW1vZGUgfD0gSVNPTEFURV9DTEVBTjsKKwogCQkvKiBUcnkgaXNvbGF0ZSB0aGUgcGFnZSAqLwotCQlpZiAoX19pc29sYXRlX2xydV9wYWdlKHBhZ2UsIElTT0xBVEVfQk9USCwgMCkgIT0gMCkKKwkJaWYgKF9faXNvbGF0ZV9scnVfcGFnZShwYWdlLCBtb2RlLCAwKSAhPSAwKQogCQkJY29udGludWU7CiAKIAkJVk1fQlVHX09OKFBhZ2VUcmFuc0NvbXBvdW5kKHBhZ2UpKTsKQEAgLTU4Niw3ICs1ODIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXVuc2lnbmVkIGxvbmcgY29tcGFjdF96b25lX29yZGVyKHN0cnVjdCB6b25lICp6b25lLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgY29tcGFjdF96b25lX29yZGVyKHN0cnVjdCB6b25lICp6b25lLAogCQkJCSBpbnQgb3JkZXIsIGdmcF90IGdmcF9tYXNrLAogCQkJCSBib29sIHN5bmMpCiB7CmRpZmYgLS1naXQgYS9tbS9kZWJ1Zy1wYWdlYWxsb2MuYyBiL21tL2RlYnVnLXBhZ2VhbGxvYy5jCmluZGV4IGExZTMzMjQuLjdjZWE1NTcgMTAwNjQ0Ci0tLSBhL21tL2RlYnVnLXBhZ2VhbGxvYy5jCisrKyBiL21tL2RlYnVnLXBhZ2VhbGxvYy5jCkBAIC0xLDcgKzEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlLWRlYnVnLWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGFnZV9wb2lzb24oc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CkBAIC0xOCwyOCArMjEsMTMgQEAKIAlyZXR1cm4gdGVzdF9iaXQoUEFHRV9ERUJVR19GTEFHX1BPSVNPTiwgJnBhZ2UtPmRlYnVnX2ZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgcG9pc29uX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICpwYWdlKQotewotCS8qCi0JICogUGFnZSBwb2lzb25pbmcgZm9yIGhpZ2htZW0gcGFnZXMgaXMgbm90IGltcGxlbWVudGVkLgotCSAqCi0JICogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHRzLgotCSAqIFNvIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGttYXBfYXRvbWljIHNsb3QgZm9yIHRoaXMKLQkgKiBhcHBsaWNhdGlvbiBhbmQgaXQgd2lsbCBuZWVkIGludGVycnVwdCBwcm90ZWN0aW9uLgotCSAqLwotfQotCiBzdGF0aWMgdm9pZCBwb2lzb25fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQl2b2lkICphZGRyOworCXZvaWQgKmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKIAotCWlmIChQYWdlSGlnaE1lbShwYWdlKSkgewotCQlwb2lzb25faGlnaHBhZ2UocGFnZSk7Ci0JCXJldHVybjsKLQl9CiAJc2V0X3BhZ2VfcG9pc29uKHBhZ2UpOwotCWFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAJbWVtc2V0KGFkZHIsIFBBR0VfUE9JU09OLCBQQUdFX1NJWkUpOworCWt1bm1hcF9hdG9taWMoYWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIHBvaXNvbl9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG4pCkBAIC01OSwxNCArNDcsMTIgQEAKIAogc3RhdGljIHZvaWQgY2hlY2tfcG9pc29uX21lbSh1bnNpZ25lZCBjaGFyICptZW0sIHNpemVfdCBieXRlcykKIHsKKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShyYXRlbGltaXQsIDUgKiBIWiwgMTApOwogCXVuc2lnbmVkIGNoYXIgKnN0YXJ0OwogCXVuc2lnbmVkIGNoYXIgKmVuZDsKIAotCWZvciAoc3RhcnQgPSBtZW07IHN0YXJ0IDwgbWVtICsgYnl0ZXM7IHN0YXJ0KyspIHsKLQkJaWYgKCpzdGFydCAhPSBQQUdFX1BPSVNPTikKLQkJCWJyZWFrOwotCX0KLQlpZiAoc3RhcnQgPT0gbWVtICsgYnl0ZXMpCisJc3RhcnQgPSBtZW1jaHJfaW52KG1lbSwgUEFHRV9QT0lTT04sIGJ5dGVzKTsKKwlpZiAoIXN0YXJ0KQogCQlyZXR1cm47CiAKIAlmb3IgKGVuZCA9IG1lbSArIGJ5dGVzIC0gMTsgZW5kID4gc3RhcnQ7IGVuZC0tKSB7CkBAIC03NCw3ICs2MCw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKKwlpZiAoIV9fcmF0ZWxpbWl0KCZyYXRlbGltaXQpKQogCQlyZXR1cm47CiAJZWxzZSBpZiAoc3RhcnQgPT0gZW5kICYmIHNpbmdsZV9iaXRfZmxpcCgqc3RhcnQsIFBBR0VfUE9JU09OKSkKIAkJcHJpbnRrKEtFUk5fRVJSICJwYWdlYWxsb2M6IHNpbmdsZSBiaXQgZXJyb3JcbiIpOwpAQCAtODYsMjcgKzcyLDE3IEBACiAJZHVtcF9zdGFjaygpOwogfQogCi1zdGF0aWMgdm9pZCB1bnBvaXNvbl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQkvKgotCSAqIFNlZSBjb21tZW50IGluIHBvaXNvbl9oaWdocGFnZSgpLgotCSAqIEhpZ2htZW0gcGFnZXMgc2hvdWxkIG5vdCBiZSBwb2lzb25lZCBmb3Igbm93Ci0JICovCi0JQlVHX09OKHBhZ2VfcG9pc29uKHBhZ2UpKTsKLX0KLQogc3RhdGljIHZvaWQgdW5wb2lzb25fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpIHsKLQkJdW5wb2lzb25faGlnaHBhZ2UocGFnZSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHBhZ2VfcG9pc29uKHBhZ2UpKSB7Ci0JCXZvaWQgKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJdm9pZCAqYWRkcjsKIAotCQljaGVja19wb2lzb25fbWVtKGFkZHIsIFBBR0VfU0laRSk7Ci0JCWNsZWFyX3BhZ2VfcG9pc29uKHBhZ2UpOwotCX0KKwlpZiAoIXBhZ2VfcG9pc29uKHBhZ2UpKQorCQlyZXR1cm47CisKKwlhZGRyID0ga21hcF9hdG9taWMocGFnZSk7CisJY2hlY2tfcG9pc29uX21lbShhZGRyLCBQQUdFX1NJWkUpOworCWNsZWFyX3BhZ2VfcG9pc29uKHBhZ2UpOworCWt1bm1hcF9hdG9taWMoYWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIHVucG9pc29uX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbikKZGlmZiAtLWdpdCBhL21tL2RtYXBvb2wuYyBiL21tL2RtYXBvb2wuYwppbmRleCBmYmI1OGUzLi5jNWFiMzNiIDEwMDY0NAotLS0gYS9tbS9kbWFwb29sLmMKKysrIGIvbW0vZG1hcG9vbC5jCkBAIC0yNywxMSArMjcsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCA3NzcxODcxLi5jMDAxOGYyIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC05LDcgKzksNyBAQAogICogbW9zdCAibm9ybWFsIiBmaWxlc3lzdGVtcyAoYnV0IHlvdSBkb24ndCAvaGF2ZS8gdG8gdXNlIHRoaXM6CiAgKiB0aGUgTkZTIGZpbGVzeXN0ZW0gdXNlZCB0byBkbyB0aGlzIGRpZmZlcmVudGx5LCBmb3IgZXhhbXBsZSkKICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CkBAIC0yMTE1LDYgKzIxMTUsNyBAQAogCX0gZWxzZSB7CiAJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92ID0gaS0+aW92OwogCQlzaXplX3QgYmFzZSA9IGktPmlvdl9vZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcgbnJfc2VncyA9IGktPm5yX3NlZ3M7CiAKIAkJLyoKIAkJICogVGhlICFpb3YtPmlvdl9sZW4gY2hlY2sgZW5zdXJlcyB3ZSBza2lwIG92ZXIgdW5saWtlbHkKQEAgLTIxMzAsMTEgKzIxMzEsMTMgQEAKIAkJCWJhc2UgKz0gY29weTsKIAkJCWlmIChpb3YtPmlvdl9sZW4gPT0gYmFzZSkgewogCQkJCWlvdisrOworCQkJCW5yX3NlZ3MtLTsKIAkJCQliYXNlID0gMDsKIAkJCX0KIAkJfQogCQlpLT5pb3YgPSBpb3Y7CiAJCWktPmlvdl9vZmZzZXQgPSBiYXNlOworCQlpLT5ucl9zZWdzID0gbnJfc2VnczsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2FkdmFuY2UpOwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcF94aXAuYyBiL21tL2ZpbGVtYXBfeGlwLmMKaW5kZXggOTMzNTZjZC4uZjkxYjJmNiAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcF94aXAuYworKysgYi9tbS9maWxlbWFwX3hpcC5jCkBAIC0xMCw3ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CmRpZmYgLS1naXQgYS9tbS9mcmVtYXAuYyBiL21tL2ZyZW1hcC5jCmluZGV4IGI4ZTBlMmQuLjllZDRmZDQgMTAwNjQ0Ci0tLSBhL21tL2ZyZW1hcC5jCisrKyBiL21tL2ZyZW1hcC5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KIApkaWZmIC0tZ2l0IGEvbW0vaGlnaG1lbS5jIGIvbW0vaGlnaG1lbS5jCmluZGV4IDVlZjY3MmMuLjU3ZDgyYzYgMTAwNjQ0Ci0tLSBhL21tL2hpZ2htZW0uYworKysgYi9tbS9oaWdobWVtLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgpAQCAtMjUwLDcgKzI1MCw3IEBACiAjZW5kaWYKIAogLyoqCi0gKiBrdW5tYXBfaGlnaCAtIG1hcCBhIGhpZ2htZW0gcGFnZSBpbnRvIG1lbW9yeQorICoga3VubWFwX2hpZ2ggLSB1bm1hcCBhIGhpZ2htZW0gcGFnZSBpbnRvIG1lbW9yeQogICogQHBhZ2U6ICZzdHJ1Y3QgcGFnZSB0byB1bm1hcAogICoKICAqIElmIEFSQ0hfTkVFRFNfS01BUF9ISUdIX0dFVCBpcyBub3QgZGVmaW5lZCB0aGVuIHRoaXMgbWF5IGJlIGNhbGxlZApkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmMKaW5kZXggZTJkMTU4Ny4uNDI5OGFiYSAxMDA2NDQKLS0tIGEvbW0vaHVnZV9tZW1vcnkuYworKysgYi9tbS9odWdlX21lbW9yeS5jCkBAIC04OSw3ICs4OSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBtbV9oZWFkOwogCXN0cnVjdCBtbV9zbG90ICptbV9zbG90OwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLX0ga2h1Z2VwYWdlZF9zY2FuID0geworfTsKK3N0YXRpYyBzdHJ1Y3Qga2h1Z2VwYWdlZF9zY2FuIGtodWdlcGFnZWRfc2NhbiA9IHsKIAkubW1faGVhZCA9IExJU1RfSEVBRF9JTklUKGtodWdlcGFnZWRfc2Nhbi5tbV9oZWFkKSwKIH07CiAKQEAgLTgyOSw3ICs4MzAsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IEhQQUdFX1BNRF9OUjsgaSsrKSB7CiAJCWNvcHlfdXNlcl9oaWdocGFnZShwYWdlc1tpXSwgcGFnZSArIGksCi0JCQkJICAgaGFkZHIgKyBQQUdFX1NISUZUKmksIHZtYSk7CisJCQkJICAgaGFkZHIgKyBQQUdFX1NJWkUgKiBpLCB2bWEpOwogCQlfX1NldFBhZ2VVcHRvZGF0ZShwYWdlc1tpXSk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KQEAgLTk4OSw3ICs5OTAsNyBAQAogCXBhZ2UgKz0gKGFkZHIgJiB+SFBBR0VfUE1EX01BU0spID4+IFBBR0VfU0hJRlQ7CiAJVk1fQlVHX09OKCFQYWdlQ29tcG91bmQocGFnZSkpOwogCWlmIChmbGFncyAmIEZPTExfR0VUKQotCQlnZXRfcGFnZShwYWdlKTsKKwkJZ2V0X3BhZ2VfZm9sbChwYWdlKTsKIAogb3V0OgogCXJldHVybiBwYWdlOwpAQCAtMTA1Miw2ICsxMDUzLDUxIEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IG1vdmVfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbmV3X3ZtYSwKKwkJICB1bnNpZ25lZCBsb25nIG9sZF9hZGRyLAorCQkgIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIsIHVuc2lnbmVkIGxvbmcgb2xkX2VuZCwKKwkJICBwbWRfdCAqb2xkX3BtZCwgcG1kX3QgKm5ld19wbWQpCit7CisJaW50IHJldCA9IDA7CisJcG1kX3QgcG1kOworCisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCisJaWYgKChvbGRfYWRkciAmIH5IUEFHRV9QTURfTUFTSykgfHwKKwkgICAgKG5ld19hZGRyICYgfkhQQUdFX1BNRF9NQVNLKSB8fAorCSAgICBvbGRfZW5kIC0gb2xkX2FkZHIgPCBIUEFHRV9QTURfU0laRSB8fAorCSAgICAobmV3X3ZtYS0+dm1fZmxhZ3MgJiBWTV9OT0hVR0VQQUdFKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFRoZSBkZXN0aW5hdGlvbiBwbWQgc2hvdWxkbid0IGJlIGVzdGFibGlzaGVkLCBmcmVlX3BndGFibGVzKCkKKwkgKiBzaG91bGQgaGF2ZSByZWxlYXNlIGl0LgorCSAqLworCWlmIChXQVJOX09OKCFwbWRfbm9uZSgqbmV3X3BtZCkpKSB7CisJCVZNX0JVR19PTihwbWRfdHJhbnNfaHVnZSgqbmV3X3BtZCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCWlmIChsaWtlbHkocG1kX3RyYW5zX2h1Z2UoKm9sZF9wbWQpKSkgeworCQlpZiAocG1kX3RyYW5zX3NwbGl0dGluZygqb2xkX3BtZCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJCXdhaXRfc3BsaXRfaHVnZV9wYWdlKHZtYS0+YW5vbl92bWEsIG9sZF9wbWQpOworCQkJcmV0ID0gLTE7CisJCX0gZWxzZSB7CisJCQlwbWQgPSBwbWRwX2dldF9hbmRfY2xlYXIobW0sIG9sZF9hZGRyLCBvbGRfcG1kKTsKKwkJCVZNX0JVR19PTighcG1kX25vbmUoKm5ld19wbWQpKTsKKwkJCXNldF9wbWRfYXQobW0sIG5ld19hZGRyLCBuZXdfcG1kLCBwbWQpOworCQkJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQkJcmV0ID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogaW50IGNoYW5nZV9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAkJdW5zaWduZWQgbG9uZyBhZGRyLCBwZ3Byb3RfdCBuZXdwcm90KQogewpAQCAtMTE1Niw2ICsxMjAyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGhlYWRfaW5kZXggPSBwYWdlLT5pbmRleDsKIAlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKIAlpbnQgem9uZXN0YXQ7CisJaW50IHRhaWxfY291bnQgPSAwOwogCiAJLyogcHJldmVudCBQYWdlTFJVIHRvIGdvIGF3YXkgZnJvbSB1bmRlciB1cywgYW5kIGZyZWV6ZSBscnUgc3RhdHMgKi8KIAlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CkBAIC0xMTY0LDExICsxMjExLDI3IEBACiAJZm9yIChpID0gMTsgaSA8IEhQQUdFX1BNRF9OUjsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlX3RhaWwgPSBwYWdlICsgaTsKIAotCQkvKiB0YWlsX3BhZ2UtPl9jb3VudCBjYW5ub3QgY2hhbmdlICovCi0JCWF0b21pY19zdWIoYXRvbWljX3JlYWQoJnBhZ2VfdGFpbC0+X2NvdW50KSwgJnBhZ2UtPl9jb3VudCk7Ci0JCUJVR19PTihwYWdlX2NvdW50KHBhZ2UpIDw9IDApOwotCQlhdG9taWNfYWRkKHBhZ2VfbWFwY291bnQocGFnZSkgKyAxLCAmcGFnZV90YWlsLT5fY291bnQpOwotCQlCVUdfT04oYXRvbWljX3JlYWQoJnBhZ2VfdGFpbC0+X2NvdW50KSA8PSAwKTsKKwkJLyogdGFpbF9wYWdlLT5fbWFwY291bnQgY2Fubm90IGNoYW5nZSAqLworCQlCVUdfT04ocGFnZV9tYXBjb3VudChwYWdlX3RhaWwpIDwgMCk7CisJCXRhaWxfY291bnQgKz0gcGFnZV9tYXBjb3VudChwYWdlX3RhaWwpOworCQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKwkJQlVHX09OKHRhaWxfY291bnQgPCAwKTsKKwkJQlVHX09OKGF0b21pY19yZWFkKCZwYWdlX3RhaWwtPl9jb3VudCkgIT0gMCk7CisJCS8qCisJCSAqIHRhaWxfcGFnZS0+X2NvdW50IGlzIHplcm8gYW5kIG5vdCBjaGFuZ2luZyBmcm9tCisJCSAqIHVuZGVyIHVzLiBCdXQgZ2V0X3BhZ2VfdW5sZXNzX3plcm8oKSBtYXkgYmUgcnVubmluZworCQkgKiBmcm9tIHVuZGVyIHVzIG9uIHRoZSB0YWlsX3BhZ2UuIElmIHdlIHVzZWQKKwkJICogYXRvbWljX3NldCgpIGJlbG93IGluc3RlYWQgb2YgYXRvbWljX2FkZCgpLCB3ZQorCQkgKiB3b3VsZCB0aGVuIHJ1biBhdG9taWNfc2V0KCkgY29uY3VycmVudGx5IHdpdGgKKwkJICogZ2V0X3BhZ2VfdW5sZXNzX3plcm8oKSwgYW5kIGF0b21pY19zZXQoKSBpcworCQkgKiBpbXBsZW1lbnRlZCBpbiBDIG5vdCB1c2luZyBsb2NrZWQgb3BzLiBzcGluX3VubG9jaworCQkgKiBvbiB4ODYgc29tZXRpbWUgdXNlcyBsb2NrZWQgb3BzIGJlY2F1c2Ugb2YgUFBybworCQkgKiBlcnJhdGEgNjYsIDkyLCBzbyB1bmxlc3Mgc29tZWJvZHkgY2FuIGd1YXJhbnRlZQorCQkgKiBhdG9taWNfc2V0KCkgaGVyZSB3b3VsZCBiZSBzYWZlIG9uIGFsbCBhcmNocyAoYW5kCisJCSAqIG5vdCBvbmx5IG9uIHg4NiksIGl0J3Mgc2FmZXIgdG8gdXNlIGF0b21pY19hZGQoKS4KKwkJICovCisJCWF0b21pY19hZGQocGFnZV9tYXBjb3VudChwYWdlKSArIHBhZ2VfbWFwY291bnQocGFnZV90YWlsKSArIDEsCisJCQkgICAmcGFnZV90YWlsLT5fY291bnQpOwogCiAJCS8qIGFmdGVyIGNsZWFyaW5nIFBhZ2VUYWlsIHRoZSBndXAgcmVmY291bnQgY2FuIGJlIHJlbGVhc2VkICovCiAJCXNtcF9tYigpOwpAQCAtMTE4NiwxMCArMTI0OSw3IEBACiAJCQkJICAgICAgKDFMIDw8IFBHX3VwdG9kYXRlKSkpOwogCQlwYWdlX3RhaWwtPmZsYWdzIHw9ICgxTCA8PCBQR19kaXJ0eSk7CiAKLQkJLyoKLQkJICogMSkgY2xlYXIgUGFnZVRhaWwgYmVmb3JlIG92ZXJ3cml0aW5nIGZpcnN0X3BhZ2UKLQkJICogMikgY2xlYXIgUGFnZVRhaWwgYmVmb3JlIGNsZWFyaW5nIFBhZ2VIZWFkIGZvciBWTV9CVUdfT04KLQkJICovCisJCS8qIGNsZWFyIFBhZ2VUYWlsIGJlZm9yZSBvdmVyd3JpdGluZyBmaXJzdF9wYWdlICovCiAJCXNtcF93bWIoKTsKIAogCQkvKgpAQCAtMTIwNiw3ICsxMjY2LDYgQEAKIAkJICogc3RhdHVzIGlzIGFjaGlldmVkIHNldHRpbmcgYSByZXNlcnZlZCBiaXQgaW4gdGhlCiAJCSAqIHBtZCwgbm90IGJ5IGNsZWFyaW5nIHRoZSBwcmVzZW50IGJpdC4KIAkJKi8KLQkJQlVHX09OKHBhZ2VfbWFwY291bnQocGFnZV90YWlsKSk7CiAJCXBhZ2VfdGFpbC0+X21hcGNvdW50ID0gcGFnZS0+X21hcGNvdW50OwogCiAJCUJVR19PTihwYWdlX3RhaWwtPm1hcHBpbmcpOwpAQCAtMTIyMyw2ICsxMjgyLDggQEAKIAogCQlscnVfYWRkX3BhZ2VfdGFpbCh6b25lLCBwYWdlLCBwYWdlX3RhaWwpOwogCX0KKwlhdG9taWNfc3ViKHRhaWxfY291bnQsICZwYWdlLT5fY291bnQpOworCUJVR19PTihhdG9taWNfcmVhZCgmcGFnZS0+X2NvdW50KSA8PSAwKTsKIAogCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9BTk9OX1RSQU5TUEFSRU5UX0hVR0VQQUdFUyk7CiAJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FOT05fUEFHRVMsIEhQQUdFX1BNRF9OUik7CkBAIC0xOTA2LDcgKzE5NjcsNyBAQAogCUJVR19PTighcG1kX25vbmUoKnBtZCkpOwogCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAobmV3X3BhZ2UsIHZtYSwgYWRkcmVzcyk7CiAJc2V0X3BtZF9hdChtbSwgYWRkcmVzcywgcG1kLCBfcG1kKTsKLQl1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkcmVzcywgZW50cnkpOworCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBhZGRyZXNzLCBfcG1kKTsKIAlwcmVwYXJlX3BtZF9odWdlX3B0ZShwZ3RhYmxlLCBtbSk7CiAJbW0tPm5yX3B0ZXMtLTsKIAlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CkBAIC0yMDI0LDYgKzIwODUsOCBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwYWdlcywKIAkJCQkJICAgIHN0cnVjdCBwYWdlICoqaHBhZ2UpCisJX19yZWxlYXNlcygma2h1Z2VwYWdlZF9tbV9sb2NrKQorCV9fYWNxdWlyZXMoJmtodWdlcGFnZWRfbW1fbG9jaykKIHsKIAlzdHJ1Y3QgbW1fc2xvdCAqbW1fc2xvdDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IGQwNzFkMzguLjIxODlhZjQgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKKysrIGIvbW0vaW50ZXJuYWwuaApAQCAtMzcsNiArMzcsNTIgQEAKIAlhdG9taWNfZGVjKCZwYWdlLT5fY291bnQpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19nZXRfcGFnZV90YWlsX2ZvbGwoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCWJvb2wgZ2V0X3BhZ2VfaGVhZCkKK3sKKwkvKgorCSAqIElmIHdlJ3JlIGdldHRpbmcgYSB0YWlsIHBhZ2UsIHRoZSBlbGV2YXRlZCBwYWdlLT5fY291bnQgaXMKKwkgKiByZXF1aXJlZCBvbmx5IGluIHRoZSBoZWFkIHBhZ2UgYW5kIHdlIHdpbGwgZWxldmF0ZSB0aGUgaGVhZAorCSAqIHBhZ2UtPl9jb3VudCBhbmQgdGFpbCBwYWdlLT5fbWFwY291bnQuCisJICoKKwkgKiBXZSBlbGV2YXRlIHBhZ2VfdGFpbC0+X21hcGNvdW50IGZvciB0YWlsIHBhZ2VzIHRvIGZvcmNlCisJICogcGFnZV90YWlsLT5fY291bnQgdG8gYmUgemVybyBhdCBhbGwgdGltZXMgdG8gYXZvaWQgZ2V0dGluZworCSAqIGZhbHNlIHBvc2l0aXZlcyBmcm9tIGdldF9wYWdlX3VubGVzc196ZXJvKCkgd2l0aAorCSAqIHNwZWN1bGF0aXZlIHBhZ2UgYWNjZXNzIChsaWtlIGluCisJICogcGFnZV9jYWNoZV9nZXRfc3BlY3VsYXRpdmUoKSkgb24gdGFpbCBwYWdlcy4KKwkgKi8KKwlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPmZpcnN0X3BhZ2UtPl9jb3VudCkgPD0gMCk7CisJVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5fY291bnQpICE9IDApOworCVZNX0JVR19PTihwYWdlX21hcGNvdW50KHBhZ2UpIDwgMCk7CisJaWYgKGdldF9wYWdlX2hlYWQpCisJCWF0b21pY19pbmMoJnBhZ2UtPmZpcnN0X3BhZ2UtPl9jb3VudCk7CisJYXRvbWljX2luYygmcGFnZS0+X21hcGNvdW50KTsKK30KKworLyoKKyAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgY2FsbGVkIGFzIHRoZSBGT0xMX0dFVCBvcGVyYXRpb24gb2YKKyAqIGZvbGxvd19wYWdlKCkgYW5kIGl0IG11c3QgYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcgdGhlIHByb3BlciBQVAorICogbG9jayB3aGlsZSB0aGUgcHRlIChvciBwbWRfdHJhbnNfaHVnZSkgaXMgc3RpbGwgbWFwcGluZyB0aGUgcGFnZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGdldF9wYWdlX2ZvbGwoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaWYgKHVubGlrZWx5KFBhZ2VUYWlsKHBhZ2UpKSkKKwkJLyoKKwkJICogVGhpcyBpcyBzYWZlIG9ubHkgYmVjYXVzZQorCQkgKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCgpIGNhbid0IHJ1biB1bmRlcgorCQkgKiBnZXRfcGFnZV9mb2xsKCkgYmVjYXVzZSB3ZSBob2xkIHRoZSBwcm9wZXIgUFQgbG9jay4KKwkJICovCisJCV9fZ2V0X3BhZ2VfdGFpbF9mb2xsKHBhZ2UsIHRydWUpOworCWVsc2UgeworCQkvKgorCQkgKiBHZXR0aW5nIGEgbm9ybWFsIHBhZ2Ugb3IgdGhlIGhlYWQgb2YgYSBjb21wb3VuZCBwYWdlCisJCSAqIHJlcXVpcmVzIHRvIGFscmVhZHkgaGF2ZSBhbiBlbGV2YXRlZCBwYWdlLT5fY291bnQuCisJCSAqLworCQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPD0gMCk7CisJCWF0b21pY19pbmMoJnBhZ2UtPl9jb3VudCk7CisJfQorfQorCiBleHRlcm4gdW5zaWduZWQgbG9uZyBoaWdoZXN0X21lbW1hcF9wZm47CiAKIC8qCmRpZmYgLS1naXQgYS9tbS9rbWVtbGVhay5jIGIvbW0va21lbWxlYWsuYwppbmRleCBkNjg4MGY1Li5mM2IyYTAwIDEwMDY0NAotLS0gYS9tbS9rbWVtbGVhay5jCisrKyBiL21tL2ttZW1sZWFrLmMKQEAgLTY5LDcgKzY5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmlvX3RyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvbW0va3NtLmMgYi9tbS9rc20uYwppbmRleCA5YTY4YjBjLi4zMTA1NDRhIDEwMDY0NAotLS0gYS9tbS9rc20uYworKysgYi9tbS9rc20uYwpAQCAtMTkwNSw3ICsxOTA1LDggQEAKIAogCQkJb29tX3Njb3JlX2FkaiA9IHRlc3Rfc2V0X29vbV9zY29yZV9hZGooT09NX1NDT1JFX0FESl9NQVgpOwogCQkJZXJyID0gdW5tZXJnZV9hbmRfcmVtb3ZlX2FsbF9ybWFwX2l0ZW1zKCk7Ci0JCQl0ZXN0X3NldF9vb21fc2NvcmVfYWRqKG9vbV9zY29yZV9hZGopOworCQkJY29tcGFyZV9zd2FwX29vbV9zY29yZV9hZGooT09NX1NDT1JFX0FESl9NQVgsCisJCQkJCQkJCW9vbV9zY29yZV9hZGopOwogCQkJaWYgKGVycikgewogCQkJCWtzbV9ydW4gPSBLU01fUlVOX1NUT1A7CiAJCQkJY291bnQgPSBlcnI7CmRpZmYgLS1naXQgYS9tbS9tYWNjZXNzLmMgYi9tbS9tYWNjZXNzLmMKaW5kZXggNGNlZTE4Mi4uZDUzYWRmOSAxMDA2NDQKLS0tIGEvbW0vbWFjY2Vzcy5jCisrKyBiL21tL21hY2Nlc3MuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBBY2Nlc3Mga2VybmVsIG1lbW9yeSB3aXRob3V0IGZhdWx0aW5nLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKZGlmZiAtLWdpdCBhL21tL21lbWJsb2NrLmMgYi9tbS9tZW1ibG9jay5jCmluZGV4IGNjYmY5NzMuLjg0YmVjNDkgMTAwNjQ0Ci0tLSBhL21tL21lbWJsb2NrLmMKKysrIGIvbW0vbWVtYmxvY2suYwpAQCAtNTgsNyArNTgsOCBAQAogCXJldHVybiAoKGJhc2UxIDwgKGJhc2UyICsgc2l6ZTIpKSAmJiAoYmFzZTIgPCAoYmFzZTEgKyBzaXplMSkpKTsKIH0KIAotbG9uZyBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfb3ZlcmxhcHNfcmVnaW9uKHN0cnVjdCBtZW1ibG9ja190eXBlICp0eXBlLCBwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKQorc3RhdGljIGxvbmcgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX292ZXJsYXBzX3JlZ2lvbihzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSwKKwkJCQkJcGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKQEAgLTI2Nyw3ICsyNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1leHRlcm4gaW50IF9faW5pdF9tZW1ibG9jayBfX3dlYWsgbWVtYmxvY2tfbWVtb3J5X2Nhbl9jb2FsZXNjZShwaHlzX2FkZHJfdCBhZGRyMSwgcGh5c19hZGRyX3Qgc2l6ZTEsCitpbnQgX19pbml0X21lbWJsb2NrIF9fd2VhayBtZW1ibG9ja19tZW1vcnlfY2FuX2NvYWxlc2NlKHBoeXNfYWRkcl90IGFkZHIxLCBwaHlzX2FkZHJfdCBzaXplMSwKIAkJCQkJICBwaHlzX2FkZHJfdCBhZGRyMiwgcGh5c19hZGRyX3Qgc2l6ZTIpCiB7CiAJcmV0dXJuIDE7CkBAIC02MjYsNiArNjI3LDEyIEBACiAJcmV0dXJuIG1lbWJsb2NrLm1lbW9yeV9zaXplOwogfQogCisvKiBsb3dlc3QgYWRkcmVzcyAqLworcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3N0YXJ0X29mX0RSQU0odm9pZCkKK3sKKwlyZXR1cm4gbWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbMF0uYmFzZTsKK30KKwogcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2VuZF9vZl9EUkFNKHZvaWQpCiB7CiAJaW50IGlkeCA9IG1lbWJsb2NrLm1lbW9yeS5jbnQgLSAxOwpkaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC5jIGIvbW0vbWVtY29udHJvbC5jCmluZGV4IDM1MDg3NzcuLjZhZmY5M2MgMTAwNjQ0Ci0tLSBhL21tL21lbWNvbnRyb2wuYworKysgYi9tbS9tZW1jb250cm9sLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRfc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjAxLDggKzIwMiw4IEBACiAJc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkOwogfTsKIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF90aHJlc2hvbGQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7Ci1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX29vbV9ub3RpZnkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3RocmVzaG9sZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOworc3RhdGljIHZvaWQgbWVtX2Nncm91cF9vb21fbm90aWZ5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CiAKIC8qCiAgKiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgZGF0YSBzdHJ1Y3R1cmUuIFRoZSBtZW1vcnkgY29udHJvbGxlciBjb250cm9scyBib3RoCkBAIC0zNjIsMjkgKzM2MywyOSBAQAogI2RlZmluZSBNRU1fQ0dST1VQX1JFQ0xBSU1fU09GVF9CSVQJMHgyCiAjZGVmaW5lIE1FTV9DR1JPVVBfUkVDTEFJTV9TT0ZUCQkoMSA8PCBNRU1fQ0dST1VQX1JFQ0xBSU1fU09GVF9CSVQpCiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZ2V0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9wdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7Ci1zdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudF9tZW1fY2dyb3VwKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwotc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrX2FzeW5jKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOworc3RhdGljIHZvaWQgbWVtX2Nncm91cF9nZXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTsKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudF9tZW1fY2dyb3VwKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CitzdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfYXN5bmMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTsKIAogc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICoKLW1lbV9jZ3JvdXBfem9uZWluZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IG5pZCwgaW50IHppZCkKK21lbV9jZ3JvdXBfem9uZWluZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgbmlkLCBpbnQgemlkKQogewotCXJldHVybiAmbWVtLT5pbmZvLm5vZGVpbmZvW25pZF0tPnpvbmVpbmZvW3ppZF07CisJcmV0dXJuICZtZW1jZy0+aW5mby5ub2RlaW5mb1tuaWRdLT56b25laW5mb1t6aWRdOwogfQogCi1zdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqbWVtX2Nncm91cF9jc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICptZW1fY2dyb3VwX2NzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7Ci0JcmV0dXJuICZtZW0tPmNzczsKKwlyZXR1cm4gJm1lbWNnLT5jc3M7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqCi1wYWdlX2Nncm91cF96b25laW5mbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3BhZ2VfY2dyb3VwX3pvbmVpbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaW50IG5pZCA9IHBhZ2VfdG9fbmlkKHBhZ2UpOwogCWludCB6aWQgPSBwYWdlX3pvbmVudW0ocGFnZSk7CiAKLQlyZXR1cm4gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5pZCwgemlkKTsKKwlyZXR1cm4gbWVtX2Nncm91cF96b25laW5mbyhtZW1jZywgbmlkLCB6aWQpOwogfQogCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXBfdHJlZV9wZXJfem9uZSAqCkBAIC00MDMsNyArNDA0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLV9fbWVtX2Nncm91cF9pbnNlcnRfZXhjZWVkZWQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK19fbWVtX2Nncm91cF9pbnNlcnRfZXhjZWVkZWQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCQkJCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKIAkJCQlzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICptY3R6LAogCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuZXdfdXNhZ2VfaW5fZXhjZXNzKQpAQCAtNDM3LDcgKzQzOCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1fX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitfX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXosCiAJCQkJc3RydWN0IG1lbV9jZ3JvdXBfdHJlZV9wZXJfem9uZSAqbWN0eikKIHsKQEAgLTQ0OCwxNyArNDQ5LDE3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1tZW1fY2dyb3VwX3JlbW92ZV9leGNlZWRlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorbWVtX2Nncm91cF9yZW1vdmVfZXhjZWVkZWQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCQkJCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKIAkJCQlzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICptY3R6KQogewogCXNwaW5fbG9jaygmbWN0ei0+bG9jayk7Ci0JX19tZW1fY2dyb3VwX3JlbW92ZV9leGNlZWRlZChtZW0sIG16LCBtY3R6KTsKKwlfX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKG1lbWNnLCBteiwgbWN0eik7CiAJc3Bpbl91bmxvY2soJm1jdHotPmxvY2spOwogfQogCiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfdXBkYXRlX3RyZWUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3VwZGF0ZV90cmVlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIGV4Y2VzczsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CkBAIC00NzEsOSArNDcyLDkgQEAKIAkgKiBOZWNlc3NhcnkgdG8gdXBkYXRlIGFsbCBhbmNlc3RvcnMgd2hlbiBoaWVyYXJjaHkgaXMgdXNlZC4KIAkgKiBiZWNhdXNlIHRoZWlyIGV2ZW50IGNvdW50ZXIgaXMgbm90IHRvdWNoZWQuCiAJICovCi0JZm9yICg7IG1lbTsgbWVtID0gcGFyZW50X21lbV9jZ3JvdXAobWVtKSkgewotCQlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBuaWQsIHppZCk7Ci0JCWV4Y2VzcyA9IHJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZtZW0tPnJlcyk7CisJZm9yICg7IG1lbWNnOyBtZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKSkgeworCQlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtY2csIG5pZCwgemlkKTsKKwkJZXhjZXNzID0gcmVzX2NvdW50ZXJfc29mdF9saW1pdF9leGNlc3MoJm1lbWNnLT5yZXMpOwogCQkvKgogCQkgKiBXZSBoYXZlIHRvIHVwZGF0ZSB0aGUgdHJlZSBpZiBteiBpcyBvbiBSQi10cmVlIG9yCiAJCSAqIG1lbSBpcyBvdmVyIGl0cyBzb2Z0bGltaXQuCkBAIC00ODIsMTggKzQ4MywxOCBAQAogCQkJc3Bpbl9sb2NrKCZtY3R6LT5sb2NrKTsKIAkJCS8qIGlmIG9uLXRyZWUsIHJlbW92ZSBpdCAqLwogCQkJaWYgKG16LT5vbl90cmVlKQotCQkJCV9fbWVtX2Nncm91cF9yZW1vdmVfZXhjZWVkZWQobWVtLCBteiwgbWN0eik7CisJCQkJX19tZW1fY2dyb3VwX3JlbW92ZV9leGNlZWRlZChtZW1jZywgbXosIG1jdHopOwogCQkJLyoKIAkJCSAqIEluc2VydCBhZ2Fpbi4gbXotPnVzYWdlX2luX2V4Y2VzcyB3aWxsIGJlIHVwZGF0ZWQuCiAJCQkgKiBJZiBleGNlc3MgaXMgMCwgbm8gdHJlZSBvcHMuCiAJCQkgKi8KLQkJCV9fbWVtX2Nncm91cF9pbnNlcnRfZXhjZWVkZWQobWVtLCBteiwgbWN0eiwgZXhjZXNzKTsKKwkJCV9fbWVtX2Nncm91cF9pbnNlcnRfZXhjZWVkZWQobWVtY2csIG16LCBtY3R6LCBleGNlc3MpOwogCQkJc3Bpbl91bmxvY2soJm1jdHotPmxvY2spOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3JlbW92ZV9mcm9tX3RyZWVzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3JlbW92ZV9mcm9tX3RyZWVzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlpbnQgbm9kZSwgem9uZTsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CkBAIC01MDEsOSArNTAyLDkgQEAKIAogCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkgewogCQlmb3IgKHpvbmUgPSAwOyB6b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspIHsKLQkJCW16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5vZGUsIHpvbmUpOworCQkJbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbWNnLCBub2RlLCB6b25lKTsKIAkJCW1jdHogPSBzb2Z0X2xpbWl0X3RyZWVfbm9kZV96b25lKG5vZGUsIHpvbmUpOwotCQkJbWVtX2Nncm91cF9yZW1vdmVfZXhjZWVkZWQobWVtLCBteiwgbWN0eik7CisJCQltZW1fY2dyb3VwX3JlbW92ZV9leGNlZWRlZChtZW1jZywgbXosIG1jdHopOwogCQl9CiAJfQogfQpAQCAtNTY0LDcgKzU2NSw3IEBACiAgKiBjb21tb24gd29ya2xvYWQsIHRocmVhc2hvbGQgYW5kIHN5bmNob25pemF0aW9uIGFzIHZtc3RhdFtdIHNob3VsZCBiZQogICogaW1wbGVtZW50ZWQuCiAgKi8KLXN0YXRpYyBsb25nIG1lbV9jZ3JvdXBfcmVhZF9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgbG9uZyBtZW1fY2dyb3VwX3JlYWRfc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJIGVudW0gbWVtX2Nncm91cF9zdGF0X2luZGV4IGlkeCkKIHsKIAlsb25nIHZhbCA9IDA7CkBAIC01NzIsODEgKzU3Myw4MyBAQAogCiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXZhbCArPSBwZXJfY3B1KG1lbS0+c3RhdC0+Y291bnRbaWR4XSwgY3B1KTsKKwkJdmFsICs9IHBlcl9jcHUobWVtY2ctPnN0YXQtPmNvdW50W2lkeF0sIGNwdSk7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0Jc3Bpbl9sb2NrKCZtZW0tPnBjcF9jb3VudGVyX2xvY2spOwotCXZhbCArPSBtZW0tPm5vY3B1X2Jhc2UuY291bnRbaWR4XTsKLQlzcGluX3VubG9jaygmbWVtLT5wY3BfY291bnRlcl9sb2NrKTsKKwlzcGluX2xvY2soJm1lbWNnLT5wY3BfY291bnRlcl9sb2NrKTsKKwl2YWwgKz0gbWVtY2ctPm5vY3B1X2Jhc2UuY291bnRbaWR4XTsKKwlzcGluX3VubG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogI2VuZGlmCiAJcHV0X29ubGluZV9jcHVzKCk7CiAJcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9zd2FwX3N0YXRpc3RpY3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfc3dhcF9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJIGJvb2wgY2hhcmdlKQogewogCWludCB2YWwgPSAoY2hhcmdlKSA/IDEgOiAtMTsKLQl0aGlzX2NwdV9hZGQobWVtLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX1NUQVRfU1dBUE9VVF0sIHZhbCk7CisJdGhpc19jcHVfYWRkKG1lbWNnLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX1NUQVRfU1dBUE9VVF0sIHZhbCk7CiB9CiAKLXZvaWQgbWVtX2Nncm91cF9wZ2ZhdWx0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCB2YWwpCit2b2lkIG1lbV9jZ3JvdXBfcGdmYXVsdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCB2YWwpCiB7Ci0JdGhpc19jcHVfYWRkKG1lbS0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX1BHRkFVTFRdLCB2YWwpOworCXRoaXNfY3B1X2FkZChtZW1jZy0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX1BHRkFVTFRdLCB2YWwpOwogfQogCi12b2lkIG1lbV9jZ3JvdXBfcGdtYWpmYXVsdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgdmFsKQordm9pZCBtZW1fY2dyb3VwX3BnbWFqZmF1bHQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgdmFsKQogewotCXRoaXNfY3B1X2FkZChtZW0tPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19QR01BSkZBVUxUXSwgdmFsKTsKKwl0aGlzX2NwdV9hZGQobWVtY2ctPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19QR01BSkZBVUxUXSwgdmFsKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJCSAgICBlbnVtIG1lbV9jZ3JvdXBfZXZlbnRzX2luZGV4IGlkeCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CiAJaW50IGNwdTsKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQl2YWwgKz0gcGVyX2NwdShtZW0tPnN0YXQtPmV2ZW50c1tpZHhdLCBjcHUpOworCQl2YWwgKz0gcGVyX2NwdShtZW1jZy0+c3RhdC0+ZXZlbnRzW2lkeF0sIGNwdSk7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0Jc3Bpbl9sb2NrKCZtZW0tPnBjcF9jb3VudGVyX2xvY2spOwotCXZhbCArPSBtZW0tPm5vY3B1X2Jhc2UuZXZlbnRzW2lkeF07Ci0Jc3Bpbl91bmxvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7CisJc3Bpbl9sb2NrKCZtZW1jZy0+cGNwX2NvdW50ZXJfbG9jayk7CisJdmFsICs9IG1lbWNnLT5ub2NwdV9iYXNlLmV2ZW50c1tpZHhdOworCXNwaW5fdW5sb2NrKCZtZW1jZy0+cGNwX2NvdW50ZXJfbG9jayk7CiAjZW5kaWYKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJIGJvb2wgZmlsZSwgaW50IG5yX3BhZ2VzKQogewogCXByZWVtcHRfZGlzYWJsZSgpOwogCiAJaWYgKGZpbGUpCi0JCV9fdGhpc19jcHVfYWRkKG1lbS0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9TVEFUX0NBQ0hFXSwgbnJfcGFnZXMpOworCQlfX3RoaXNfY3B1X2FkZChtZW1jZy0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9TVEFUX0NBQ0hFXSwKKwkJCQlucl9wYWdlcyk7CiAJZWxzZQotCQlfX3RoaXNfY3B1X2FkZChtZW0tPnN0YXQtPmNvdW50W01FTV9DR1JPVVBfU1RBVF9SU1NdLCBucl9wYWdlcyk7CisJCV9fdGhpc19jcHVfYWRkKG1lbWNnLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX1NUQVRfUlNTXSwKKwkJCQlucl9wYWdlcyk7CiAKIAkvKiBwYWdlaW4gb2YgYSBiaWcgcGFnZSBpcyBhbiBldmVudC4gU28sIGlnbm9yZSBwYWdlIHNpemUgKi8KIAlpZiAobnJfcGFnZXMgPiAwKQotCQlfX3RoaXNfY3B1X2luYyhtZW0tPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19QR1BHSU5dKTsKKwkJX190aGlzX2NwdV9pbmMobWVtY2ctPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19QR1BHSU5dKTsKIAllbHNlIHsKLQkJX190aGlzX2NwdV9pbmMobWVtLT5zdGF0LT5ldmVudHNbTUVNX0NHUk9VUF9FVkVOVFNfUEdQR09VVF0pOworCQlfX3RoaXNfY3B1X2luYyhtZW1jZy0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX1BHUEdPVVRdKTsKIAkJbnJfcGFnZXMgPSAtbnJfcGFnZXM7IC8qIGZvciBldmVudCAqLwogCX0KIAotCV9fdGhpc19jcHVfYWRkKG1lbS0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX0NPVU5UXSwgbnJfcGFnZXMpOworCV9fdGhpc19jcHVfYWRkKG1lbWNnLT5zdGF0LT5ldmVudHNbTUVNX0NHUk9VUF9FVkVOVFNfQ09VTlRdLCBucl9wYWdlcyk7CiAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCiB1bnNpZ25lZCBsb25nCi1tZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBuaWQsIGludCB6aWQsCittZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IG5pZCwgaW50IHppZCwKIAkJCXVuc2lnbmVkIGludCBscnVfbWFzaykKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CiAJZW51bSBscnVfbGlzdCBsOwogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKIAotCW16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5pZCwgemlkKTsKKwlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtY2csIG5pZCwgemlkKTsKIAogCWZvcl9lYWNoX2xydShsKSB7CiAJCWlmIChCSVQobCkgJiBscnVfbWFzaykKQEAgLTY1Niw0NCArNjU5LDQ1IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nCi1tZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCittZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCWludCBuaWQsIHVuc2lnbmVkIGludCBscnVfbWFzaykKIHsKIAl1NjQgdG90YWwgPSAwOwogCWludCB6aWQ7CiAKIAlmb3IgKHppZCA9IDA7IHppZCA8IE1BWF9OUl9aT05FUzsgemlkKyspCi0JCXRvdGFsICs9IG1lbV9jZ3JvdXBfem9uZV9ucl9scnVfcGFnZXMobWVtLCBuaWQsIHppZCwgbHJ1X21hc2spOworCQl0b3RhbCArPSBtZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKG1lbWNnLAorCQkJCQkJbmlkLCB6aWQsIGxydV9tYXNrKTsKIAogCXJldHVybiB0b3RhbDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9ucl9scnVfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCXVuc2lnbmVkIGludCBscnVfbWFzaykKIHsKIAlpbnQgbmlkOwogCXU2NCB0b3RhbCA9IDA7CiAKIAlmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9ISUdIX01FTU9SWSkKLQkJdG90YWwgKz0gbWVtX2Nncm91cF9ub2RlX25yX2xydV9wYWdlcyhtZW0sIG5pZCwgbHJ1X21hc2spOworCQl0b3RhbCArPSBtZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBuaWQsIGxydV9tYXNrKTsKIAlyZXR1cm4gdG90YWw7CiB9CiAKLXN0YXRpYyBib29sIF9fbWVtY2dfZXZlbnRfY2hlY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IHRhcmdldCkKK3N0YXRpYyBib29sIF9fbWVtY2dfZXZlbnRfY2hlY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgdGFyZ2V0KQogewogCXVuc2lnbmVkIGxvbmcgdmFsLCBuZXh0OwogCi0JdmFsID0gdGhpc19jcHVfcmVhZChtZW0tPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19DT1VOVF0pOwotCW5leHQgPSB0aGlzX2NwdV9yZWFkKG1lbS0+c3RhdC0+dGFyZ2V0c1t0YXJnZXRdKTsKKwl2YWwgPSBfX3RoaXNfY3B1X3JlYWQobWVtY2ctPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19DT1VOVF0pOworCW5leHQgPSBfX3RoaXNfY3B1X3JlYWQobWVtY2ctPnN0YXQtPnRhcmdldHNbdGFyZ2V0XSk7CiAJLyogZnJvbSB0aW1lX2FmdGVyKCkgaW4gamlmZmllcy5oICovCiAJcmV0dXJuICgobG9uZyluZXh0IC0gKGxvbmcpdmFsIDwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF90YXJnZXRfdXBkYXRlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCB0YXJnZXQpCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfdGFyZ2V0X3VwZGF0ZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCB0YXJnZXQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWwsIG5leHQ7CiAKLQl2YWwgPSB0aGlzX2NwdV9yZWFkKG1lbS0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX0NPVU5UXSk7CisJdmFsID0gX190aGlzX2NwdV9yZWFkKG1lbWNnLT5zdGF0LT5ldmVudHNbTUVNX0NHUk9VUF9FVkVOVFNfQ09VTlRdKTsKIAogCXN3aXRjaCAodGFyZ2V0KSB7CiAJY2FzZSBNRU1fQ0dST1VQX1RBUkdFVF9USFJFU0g6CkBAIC03MDksMzQgKzcxMywzNiBAQAogCQlyZXR1cm47CiAJfQogCi0JdGhpc19jcHVfd3JpdGUobWVtLT5zdGF0LT50YXJnZXRzW3RhcmdldF0sIG5leHQpOworCV9fdGhpc19jcHVfd3JpdGUobWVtY2ctPnN0YXQtPnRhcmdldHNbdGFyZ2V0XSwgbmV4dCk7CiB9CiAKIC8qCiAgKiBDaGVjayBldmVudHMgaW4gb3JkZXIuCiAgKgogICovCi1zdGF0aWMgdm9pZCBtZW1jZ19jaGVja19ldmVudHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgdm9pZCBtZW1jZ19jaGVja19ldmVudHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAkvKiB0aHJlc2hvbGQgZXZlbnQgaXMgdHJpZ2dlcmVkIGluIGZpbmVyIGdyYWluIHRoYW4gc29mdCBsaW1pdCAqLwotCWlmICh1bmxpa2VseShfX21lbWNnX2V2ZW50X2NoZWNrKG1lbSwgTUVNX0NHUk9VUF9UQVJHRVRfVEhSRVNIKSkpIHsKLQkJbWVtX2Nncm91cF90aHJlc2hvbGQobWVtKTsKLQkJX19tZW1fY2dyb3VwX3RhcmdldF91cGRhdGUobWVtLCBNRU1fQ0dST1VQX1RBUkdFVF9USFJFU0gpOwotCQlpZiAodW5saWtlbHkoX19tZW1jZ19ldmVudF9jaGVjayhtZW0sCisJaWYgKHVubGlrZWx5KF9fbWVtY2dfZXZlbnRfY2hlY2sobWVtY2csIE1FTV9DR1JPVVBfVEFSR0VUX1RIUkVTSCkpKSB7CisJCW1lbV9jZ3JvdXBfdGhyZXNob2xkKG1lbWNnKTsKKwkJX19tZW1fY2dyb3VwX3RhcmdldF91cGRhdGUobWVtY2csIE1FTV9DR1JPVVBfVEFSR0VUX1RIUkVTSCk7CisJCWlmICh1bmxpa2VseShfX21lbWNnX2V2ZW50X2NoZWNrKG1lbWNnLAogCQkJICAgICBNRU1fQ0dST1VQX1RBUkdFVF9TT0ZUTElNSVQpKSkgewotCQkJbWVtX2Nncm91cF91cGRhdGVfdHJlZShtZW0sIHBhZ2UpOwotCQkJX19tZW1fY2dyb3VwX3RhcmdldF91cGRhdGUobWVtLAorCQkJbWVtX2Nncm91cF91cGRhdGVfdHJlZShtZW1jZywgcGFnZSk7CisJCQlfX21lbV9jZ3JvdXBfdGFyZ2V0X3VwZGF0ZShtZW1jZywKIAkJCQkJCSAgIE1FTV9DR1JPVVBfVEFSR0VUX1NPRlRMSU1JVCk7CiAJCX0KICNpZiBNQVhfTlVNTk9ERVMgPiAxCi0JCWlmICh1bmxpa2VseShfX21lbWNnX2V2ZW50X2NoZWNrKG1lbSwKKwkJaWYgKHVubGlrZWx5KF9fbWVtY2dfZXZlbnRfY2hlY2sobWVtY2csCiAJCQlNRU1fQ0dST1VQX1RBUkdFVF9OVU1BSU5GTykpKSB7Ci0JCQlhdG9taWNfaW5jKCZtZW0tPm51bWFpbmZvX2V2ZW50cyk7Ci0JCQlfX21lbV9jZ3JvdXBfdGFyZ2V0X3VwZGF0ZShtZW0sCisJCQlhdG9taWNfaW5jKCZtZW1jZy0+bnVtYWluZm9fZXZlbnRzKTsKKwkJCV9fbWVtX2Nncm91cF90YXJnZXRfdXBkYXRlKG1lbWNnLAogCQkJCU1FTV9DR1JPVVBfVEFSR0VUX05VTUFJTkZPKTsKIAkJfQogI2VuZGlmCiAJfQorCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9mcm9tX2NvbnQoc3RydWN0IGNncm91cCAqY29udCkKQEAgLTc2Miw3ICs3NjgsNyBAQAogCiBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IE5VTEw7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDsKIAogCWlmICghbW0pCiAJCXJldHVybiBOVUxMOwpAQCAtNzczLDI1ICs3NzksMjUgQEAKIAkgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJZG8gewotCQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7Ci0JCWlmICh1bmxpa2VseSghbWVtKSkKKwkJbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7CisJCWlmICh1bmxpa2VseSghbWVtY2cpKQogCQkJYnJlYWs7Ci0JfSB3aGlsZSAoIWNzc190cnlnZXQoJm1lbS0+Y3NzKSk7CisJfSB3aGlsZSAoIWNzc190cnlnZXQoJm1lbWNnLT5jc3MpKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gbWVtOworCXJldHVybiBtZW1jZzsKIH0KIAogLyogVGhlIGNhbGxlciBoYXMgdG8gZ3VhcmFudGVlICJtZW0iIGV4aXN0cyBiZWZvcmUgY2FsbGluZyB0aGlzICovCi1zdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfc3RhcnRfbG9vcChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX3N0YXJ0X2xvb3Aoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3M7CiAJaW50IGZvdW5kOwogCi0JaWYgKCFtZW0pIC8qIFJPT1QgY2dyb3VwIGhhcyB0aGUgc21hbGxlc3QgSUQgKi8KKwlpZiAoIW1lbWNnKSAvKiBST09UIGNncm91cCBoYXMgdGhlIHNtYWxsZXN0IElEICovCiAJCXJldHVybiByb290X21lbV9jZ3JvdXA7IC8qY3NzX3B1dC9nZXQgYWdhaW5zdCByb290IGlzIGlnbm9yZWQqLwotCWlmICghbWVtLT51c2VfaGllcmFyY2h5KSB7Ci0JCWlmIChjc3NfdHJ5Z2V0KCZtZW0tPmNzcykpCi0JCQlyZXR1cm4gbWVtOworCWlmICghbWVtY2ctPnVzZV9oaWVyYXJjaHkpIHsKKwkJaWYgKGNzc190cnlnZXQoJm1lbWNnLT5jc3MpKQorCQkJcmV0dXJuIG1lbWNnOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtNzk5LDEzICs4MDUsMTMgQEAKIAkgKiBzZWFyY2hpbmcgYSBtZW1vcnkgY2dyb3VwIHdoaWNoIGhhcyB0aGUgc21hbGxlc3QgSUQgdW5kZXIgZ2l2ZW4KIAkgKiBST09UIGNncm91cC4gKElEID49IDEpCiAJICovCi0JY3NzID0gY3NzX2dldF9uZXh0KCZtZW1fY2dyb3VwX3N1YnN5cywgMSwgJm1lbS0+Y3NzLCAmZm91bmQpOworCWNzcyA9IGNzc19nZXRfbmV4dCgmbWVtX2Nncm91cF9zdWJzeXMsIDEsICZtZW1jZy0+Y3NzLCAmZm91bmQpOwogCWlmIChjc3MgJiYgY3NzX3RyeWdldChjc3MpKQotCQltZW0gPSBjb250YWluZXJfb2YoY3NzLCBzdHJ1Y3QgbWVtX2Nncm91cCwgY3NzKTsKKwkJbWVtY2cgPSBjb250YWluZXJfb2YoY3NzLCBzdHJ1Y3QgbWVtX2Nncm91cCwgY3NzKTsKIAllbHNlCi0JCW1lbSA9IE5VTEw7CisJCW1lbWNnID0gTlVMTDsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gbWVtOworCXJldHVybiBtZW1jZzsKIH0KIAogc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2dldF9uZXh0KHN0cnVjdCBtZW1fY2dyb3VwICppdGVyLApAQCAtODU5LDI5ICs4NjUsMjkgQEAKIAlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWVfY29uZChpdGVyLCBOVUxMLCB0cnVlKQogCiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBtZW1fY2dyb3VwX2lzX3Jvb3Qoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBtZW1fY2dyb3VwX2lzX3Jvb3Qoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewotCXJldHVybiAobWVtID09IHJvb3RfbWVtX2Nncm91cCk7CisJcmV0dXJuIChtZW1jZyA9PSByb290X21lbV9jZ3JvdXApOwogfQogCiB2b2lkIG1lbV9jZ3JvdXBfY291bnRfdm1fZXZlbnQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGVudW0gdm1fZXZlbnRfaXRlbSBpZHgpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKIAlpZiAoIW1tKQogCQlyZXR1cm47CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbWVtID0gbWVtX2Nncm91cF9mcm9tX3Rhc2socmN1X2RlcmVmZXJlbmNlKG1tLT5vd25lcikpOwotCWlmICh1bmxpa2VseSghbWVtKSkKKwltZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV90YXNrKHJjdV9kZXJlZmVyZW5jZShtbS0+b3duZXIpKTsKKwlpZiAodW5saWtlbHkoIW1lbWNnKSkKIAkJZ290byBvdXQ7CiAKIAlzd2l0Y2ggKGlkeCkgewogCWNhc2UgUEdNQUpGQVVMVDoKLQkJbWVtX2Nncm91cF9wZ21hamZhdWx0KG1lbSwgMSk7CisJCW1lbV9jZ3JvdXBfcGdtYWpmYXVsdChtZW1jZywgMSk7CiAJCWJyZWFrOwogCWNhc2UgUEdGQVVMVDoKLQkJbWVtX2Nncm91cF9wZ2ZhdWx0KG1lbSwgMSk7CisJCW1lbV9jZ3JvdXBfcGdmYXVsdChtZW1jZywgMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpAQCAtOTkwLDYgKzk5NiwxNiBAQAogCQlyZXR1cm47CiAJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CiAJVk1fQlVHX09OKFBhZ2VDZ3JvdXBBY2N0TFJVKHBjKSk7CisJLyoKKwkgKiBwdXRiYWNrOgkJCQljaGFyZ2U6CisJICogU2V0UGFnZUxSVQkJCQlTZXRQYWdlQ2dyb3VwVXNlZAorCSAqIHNtcF9tYgkJCQlzbXBfbWIKKwkgKiBQYWdlQ2dyb3VwVXNlZCAmJiBhZGQgdG8gbWVtY2cgTFJVCVBhZ2VMUlUgJiYgYWRkIHRvIG1lbWNnIExSVQorCSAqCisJICogRW5zdXJlIHRoYXQgb25lIG9mIHRoZSB0d28gc2lkZXMgYWRkcyB0aGUgcGFnZSB0byB0aGUgbWVtY2cKKwkgKiBMUlUgZHVyaW5nIGEgcmFjZS4KKwkgKi8KKwlzbXBfbWIoKTsKIAlpZiAoIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKIAkJcmV0dXJuOwogCS8qIEVuc3VyZSBwYy0+bWVtX2Nncm91cCBpcyB2aXNpYmxlIGFmdGVyIHJlYWRpbmcgUENHX1VTRUQuICovCkBAIC0xMDQxLDcgKzEwNTcsMTYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB6b25lICp6b25lID0gcGFnZV96b25lKHBhZ2UpOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7Ci0KKwkvKgorCSAqIHB1dGJhY2s6CQkJCWNoYXJnZToKKwkgKiBTZXRQYWdlTFJVCQkJCVNldFBhZ2VDZ3JvdXBVc2VkCisJICogc21wX21iCQkJCXNtcF9tYgorCSAqIFBhZ2VDZ3JvdXBVc2VkICYmIGFkZCB0byBtZW1jZyBMUlUJUGFnZUxSVSAmJiBhZGQgdG8gbWVtY2cgTFJVCisJICoKKwkgKiBFbnN1cmUgdGhhdCBvbmUgb2YgdGhlIHR3byBzaWRlcyBhZGRzIHRoZSBwYWdlIHRvIHRoZSBtZW1jZworCSAqIExSVSBkdXJpbmcgYSByYWNlLgorCSAqLworCXNtcF9tYigpOwogCS8qIHRha2luZyBjYXJlIG9mIHRoYXQgdGhlIHBhZ2UgaXMgYWRkZWQgdG8gTFJVIHdoaWxlIHdlIGNvbW1pdCBpdCAqLwogCWlmIChsaWtlbHkoIVBhZ2VMUlUocGFnZSkpKQogCQlyZXR1cm47CkBAIC0xMDYzLDIxICsxMDg4LDIxIEBACiB9CiAKIC8qCi0gKiBDaGVja3Mgd2hldGhlciBnaXZlbiBtZW0gaXMgc2FtZSBvciBpbiB0aGUgcm9vdF9tZW0ncworICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gbWVtIGlzIHNhbWUgb3IgaW4gdGhlIHJvb3RfbWVtX2Nncm91cCdzCiAgKiBoaWVyYXJjaHkgc3VidHJlZQogICovCi1zdGF0aWMgYm9vbCBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW0sCi0JCXN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgYm9vbCBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW1jZywKKwkJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewotCWlmIChyb290X21lbSAhPSBtZW0pIHsKLQkJcmV0dXJuIChyb290X21lbS0+dXNlX2hpZXJhcmNoeSAmJgotCQkJY3NzX2lzX2FuY2VzdG9yKCZtZW0tPmNzcywgJnJvb3RfbWVtLT5jc3MpKTsKKwlpZiAocm9vdF9tZW1jZyAhPSBtZW1jZykgeworCQlyZXR1cm4gKHJvb3RfbWVtY2ctPnVzZV9oaWVyYXJjaHkgJiYKKwkJCWNzc19pc19hbmNlc3RvcigmbWVtY2ctPmNzcywgJnJvb3RfbWVtY2ctPmNzcykpOwogCX0KIAogCXJldHVybiB0cnVlOwogfQogCi1pbnQgdGFza19pbl9tZW1fY2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK2ludCB0YXNrX2luX21lbV9jZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqY3VyciA9IE5VTEw7CkBAIC0xMDkxLDI1ICsxMTE2LDI5IEBACiAJaWYgKCFjdXJyKQogCQlyZXR1cm4gMDsKIAkvKgotCSAqIFdlIHNob3VsZCBjaGVjayB1c2VfaGllcmFyY2h5IG9mICJtZW0iIG5vdCAiY3VyciIuIEJlY2F1c2UgY2hlY2tpbmcKKwkgKiBXZSBzaG91bGQgY2hlY2sgdXNlX2hpZXJhcmNoeSBvZiAibWVtY2ciIG5vdCAiY3VyciIuIEJlY2F1c2UgY2hlY2tpbmcKIAkgKiB1c2VfaGllcmFyY2h5IG9mICJjdXJyIiBoZXJlIG1ha2UgdGhpcyBmdW5jdGlvbiB0cnVlIGlmIGhpZXJhcmNoeSBpcwotCSAqIGVuYWJsZWQgaW4gImN1cnIiIGFuZCAiY3VyciIgaXMgYSBjaGlsZCBvZiAibWVtIiBpbiAqY2dyb3VwKgotCSAqIGhpZXJhcmNoeShldmVuIGlmIHVzZV9oaWVyYXJjaHkgaXMgZGlzYWJsZWQgaW4gIm1lbSIpLgorCSAqIGVuYWJsZWQgaW4gImN1cnIiIGFuZCAiY3VyciIgaXMgYSBjaGlsZCBvZiAibWVtY2ciIGluICpjZ3JvdXAqCisJICogaGllcmFyY2h5KGV2ZW4gaWYgdXNlX2hpZXJhcmNoeSBpcyBkaXNhYmxlZCBpbiAibWVtY2ciKS4KIAkgKi8KLQlyZXQgPSBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShtZW0sIGN1cnIpOworCXJldCA9IG1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKG1lbWNnLCBjdXJyKTsKIAljc3NfcHV0KCZjdXJyLT5jc3MpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY2FsY19pbmFjdGl2ZV9yYXRpbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgKnByZXNlbnRfcGFnZXMpCitpbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9hbm9uX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCB6b25lICp6b25lKQogewotCXVuc2lnbmVkIGxvbmcgYWN0aXZlOwotCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7Ci0JdW5zaWduZWQgbG9uZyBnYjsKIAl1bnNpZ25lZCBsb25nIGluYWN0aXZlX3JhdGlvOworCWludCBuaWQgPSB6b25lX3RvX25pZCh6b25lKTsKKwlpbnQgemlkID0gem9uZV9pZHgoem9uZSk7CisJdW5zaWduZWQgbG9uZyBpbmFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIGdiOwogCi0JaW5hY3RpdmUgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW1jZywgQklUKExSVV9JTkFDVElWRV9BTk9OKSk7Ci0JYWN0aXZlID0gbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIEJJVChMUlVfQUNUSVZFX0FOT04pKTsKKwlpbmFjdGl2ZSA9IG1lbV9jZ3JvdXBfem9uZV9ucl9scnVfcGFnZXMobWVtY2csIG5pZCwgemlkLAorCQkJCQkJQklUKExSVV9JTkFDVElWRV9BTk9OKSk7CisJYWN0aXZlID0gbWVtX2Nncm91cF96b25lX25yX2xydV9wYWdlcyhtZW1jZywgbmlkLCB6aWQsCisJCQkJCSAgICAgIEJJVChMUlVfQUNUSVZFX0FOT04pKTsKIAogCWdiID0gKGluYWN0aXZlICsgYWN0aXZlKSA+PiAoMzAgLSBQQUdFX1NISUZUKTsKIAlpZiAoZ2IpCkBAIC0xMTE3LDM5ICsxMTQ2LDIwIEBACiAJZWxzZQogCQlpbmFjdGl2ZV9yYXRpbyA9IDE7CiAKLQlpZiAocHJlc2VudF9wYWdlcykgewotCQlwcmVzZW50X3BhZ2VzWzBdID0gaW5hY3RpdmU7Ci0JCXByZXNlbnRfcGFnZXNbMV0gPSBhY3RpdmU7Ci0JfQotCi0JcmV0dXJuIGluYWN0aXZlX3JhdGlvOworCXJldHVybiBpbmFjdGl2ZSAqIGluYWN0aXZlX3JhdGlvIDwgYWN0aXZlOwogfQogCi1pbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9hbm9uX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCitpbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCB6b25lICp6b25lKQogewogCXVuc2lnbmVkIGxvbmcgYWN0aXZlOwogCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7Ci0JdW5zaWduZWQgbG9uZyBwcmVzZW50X3BhZ2VzWzJdOwotCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmVfcmF0aW87CisJaW50IHppZCA9IHpvbmVfaWR4KHpvbmUpOworCWludCBuaWQgPSB6b25lX3RvX25pZCh6b25lKTsKIAotCWluYWN0aXZlX3JhdGlvID0gY2FsY19pbmFjdGl2ZV9yYXRpbyhtZW1jZywgcHJlc2VudF9wYWdlcyk7Ci0KLQlpbmFjdGl2ZSA9IHByZXNlbnRfcGFnZXNbMF07Ci0JYWN0aXZlID0gcHJlc2VudF9wYWdlc1sxXTsKLQotCWlmIChpbmFjdGl2ZSAqIGluYWN0aXZlX3JhdGlvIDwgYWN0aXZlKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCi17Ci0JdW5zaWduZWQgbG9uZyBhY3RpdmU7Ci0JdW5zaWduZWQgbG9uZyBpbmFjdGl2ZTsKLQotCWluYWN0aXZlID0gbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIEJJVChMUlVfSU5BQ1RJVkVfRklMRSkpOwotCWFjdGl2ZSA9IG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBCSVQoTFJVX0FDVElWRV9GSUxFKSk7CisJaW5hY3RpdmUgPSBtZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBuaWQsIHppZCwKKwkJCQkJCUJJVChMUlVfSU5BQ1RJVkVfRklMRSkpOworCWFjdGl2ZSA9IG1lbV9jZ3JvdXBfem9uZV9ucl9scnVfcGFnZXMobWVtY2csIG5pZCwgemlkLAorCQkJCQkgICAgICBCSVQoTFJVX0FDVElWRV9GSUxFKSk7CiAKIAlyZXR1cm4gKGFjdGl2ZSA+IGluYWN0aXZlKTsKIH0KQEAgLTExODUsNyArMTE5NSw4IEBACiB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyh1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4sCiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKIAkJCQkJdW5zaWduZWQgbG9uZyAqc2Nhbm5lZCwgaW50IG9yZGVyLAotCQkJCQlpbnQgbW9kZSwgc3RydWN0IHpvbmUgKnosCisJCQkJCWlzb2xhdGVfbW9kZV90IG1vZGUsCisJCQkJCXN0cnVjdCB6b25lICp6LAogCQkJCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2NvbnQsCiAJCQkJCWludCBhY3RpdmUsIGludCBmaWxlKQogewpAQCAtMTI1MywxMyArMTI2NCwxMyBAQAogICogUmV0dXJucyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IEBtZW0gY2FuIGJlIGNoYXJnZWQgd2l0aCwgaW4KICAqIHBhZ2VzLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX21hcmdpbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9tYXJnaW4oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXJnaW47CiAKLQltYXJnaW4gPSByZXNfY291bnRlcl9tYXJnaW4oJm1lbS0+cmVzKTsKKwltYXJnaW4gPSByZXNfY291bnRlcl9tYXJnaW4oJm1lbWNnLT5yZXMpOwogCWlmIChkb19zd2FwX2FjY291bnQpCi0JCW1hcmdpbiA9IG1pbihtYXJnaW4sIHJlc19jb3VudGVyX21hcmdpbigmbWVtLT5tZW1zdykpOworCQltYXJnaW4gPSBtaW4obWFyZ2luLCByZXNfY291bnRlcl9tYXJnaW4oJm1lbWNnLT5tZW1zdykpOwogCXJldHVybiBtYXJnaW4gPj4gUEFHRV9TSElGVDsKIH0KIApAQCAtMTI3NCwzMyArMTI4NSwzMyBAQAogCXJldHVybiBtZW1jZy0+c3dhcHBpbmVzczsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9zdGFydF9tb3ZlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3N0YXJ0X21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCWludCBjcHU7CiAKIAlnZXRfb25saW5lX2NwdXMoKTsKLQlzcGluX2xvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7CisJc3Bpbl9sb2NrKCZtZW1jZy0+cGNwX2NvdW50ZXJfbG9jayk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXBlcl9jcHUobWVtLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX09OX01PVkVdLCBjcHUpICs9IDE7Ci0JbWVtLT5ub2NwdV9iYXNlLmNvdW50W01FTV9DR1JPVVBfT05fTU9WRV0gKz0gMTsKLQlzcGluX3VubG9jaygmbWVtLT5wY3BfY291bnRlcl9sb2NrKTsKKwkJcGVyX2NwdShtZW1jZy0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9PTl9NT1ZFXSwgY3B1KSArPSAxOworCW1lbWNnLT5ub2NwdV9iYXNlLmNvdW50W01FTV9DR1JPVVBfT05fTU9WRV0gKz0gMTsKKwlzcGluX3VubG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogCXB1dF9vbmxpbmVfY3B1cygpOwogCiAJc3luY2hyb25pemVfcmN1KCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZW5kX21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZW5kX21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCWludCBjcHU7CiAKLQlpZiAoIW1lbSkKKwlpZiAoIW1lbWNnKQogCQlyZXR1cm47CiAJZ2V0X29ubGluZV9jcHVzKCk7Ci0Jc3Bpbl9sb2NrKCZtZW0tPnBjcF9jb3VudGVyX2xvY2spOworCXNwaW5fbG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQlwZXJfY3B1KG1lbS0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9PTl9NT1ZFXSwgY3B1KSAtPSAxOwotCW1lbS0+bm9jcHVfYmFzZS5jb3VudFtNRU1fQ0dST1VQX09OX01PVkVdIC09IDE7Ci0Jc3Bpbl91bmxvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7CisJCXBlcl9jcHUobWVtY2ctPnN0YXQtPmNvdW50W01FTV9DR1JPVVBfT05fTU9WRV0sIGNwdSkgLT0gMTsKKwltZW1jZy0+bm9jcHVfYmFzZS5jb3VudFtNRU1fQ0dST1VQX09OX01PVkVdIC09IDE7CisJc3Bpbl91bmxvY2soJm1lbWNnLT5wY3BfY291bnRlcl9sb2NrKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIH0KIC8qCkBAIC0xMzE1LDEzICsxMzI2LDEzIEBACiAgKgkJCSAgd2FpdGluZyBhdCBoaXRoLW1lbW9yeSBwcnJlc3N1cmUgY2F1c2VkIGJ5ICJtb3ZlIi4KICAqLwogCi1zdGF0aWMgYm9vbCBtZW1fY2dyb3VwX3N0ZWFsZWQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyBib29sIG1lbV9jZ3JvdXBfc3RlYWxlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJVk1fQlVHX09OKCFyY3VfcmVhZF9sb2NrX2hlbGQoKSk7Ci0JcmV0dXJuIHRoaXNfY3B1X3JlYWQobWVtLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX09OX01PVkVdKSA+IDA7CisJcmV0dXJuIHRoaXNfY3B1X3JlYWQobWVtY2ctPnN0YXQtPmNvdW50W01FTV9DR1JPVVBfT05fTU9WRV0pID4gMDsKIH0KIAotc3RhdGljIGJvb2wgbWVtX2Nncm91cF91bmRlcl9tb3ZlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgYm9vbCBtZW1fY2dyb3VwX3VuZGVyX21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICpmcm9tOwogCXN0cnVjdCBtZW1fY2dyb3VwICp0bzsKQEAgLTEzMzYsMTcgKzEzNDcsMTcgQEAKIAlpZiAoIWZyb20pCiAJCWdvdG8gdW5sb2NrOwogCi0JcmV0ID0gbWVtX2Nncm91cF9zYW1lX29yX3N1YnRyZWUobWVtLCBmcm9tKQotCQl8fCBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShtZW0sIHRvKTsKKwlyZXQgPSBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShtZW1jZywgZnJvbSkKKwkJfHwgbWVtX2Nncm91cF9zYW1lX29yX3N1YnRyZWUobWVtY2csIHRvKTsKIHVubG9jazoKIAlzcGluX3VubG9jaygmbWMubG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGJvb2wgbWVtX2Nncm91cF93YWl0X2FjY3RfbW92ZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIGJvb2wgbWVtX2Nncm91cF93YWl0X2FjY3RfbW92ZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJaWYgKG1jLm1vdmluZ190YXNrICYmIGN1cnJlbnQgIT0gbWMubW92aW5nX3Rhc2spIHsKLQkJaWYgKG1lbV9jZ3JvdXBfdW5kZXJfbW92ZShtZW0pKSB7CisJCWlmIChtZW1fY2dyb3VwX3VuZGVyX21vdmUobWVtY2cpKSB7CiAJCQlERUZJTkVfV0FJVCh3YWl0KTsKIAkJCXByZXBhcmVfdG9fd2FpdCgmbWMud2FpdHEsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJLyogbW92aW5nIGNoYXJnZSBjb250ZXh0IG1pZ2h0IGhhdmUgZmluaXNoZWQuICovCkBAIC0xNDMwLDEyICsxNDQxLDEyIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBtZW1jZyB1bmRlciBoaWVyYXJjaHkgdHJlZS4gUmV0dXJucwogICogMShzZWxmIGNvdW50KSBpZiBubyBjaGlsZHJlbi4KICAqLwotc3RhdGljIGludCBtZW1fY2dyb3VwX2NvdW50X2NoaWxkcmVuKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfY291bnRfY2hpbGRyZW4oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCWludCBudW0gPSAwOwogCXN0cnVjdCBtZW1fY2dyb3VwICppdGVyOwogCi0JZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlKGl0ZXIsIG1lbSkKKwlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtY2cpCiAJCW51bSsrOwogCXJldHVybiBudW07CiB9CkBAIC0xNDY1LDIxICsxNDc2LDIxIEBACiAgKiB0aGF0IHRvIHJlY2xhaW0gZnJlZSBwYWdlcyBmcm9tLgogICovCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKgotbWVtX2Nncm91cF9zZWxlY3RfdmljdGltKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbSkKK21lbV9jZ3JvdXBfc2VsZWN0X3ZpY3RpbShzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW1jZykKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqcmV0ID0gTlVMTDsKIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzOwogCWludCBuZXh0aWQsIGZvdW5kOwogCi0JaWYgKCFyb290X21lbS0+dXNlX2hpZXJhcmNoeSkgewotCQljc3NfZ2V0KCZyb290X21lbS0+Y3NzKTsKLQkJcmV0ID0gcm9vdF9tZW07CisJaWYgKCFyb290X21lbWNnLT51c2VfaGllcmFyY2h5KSB7CisJCWNzc19nZXQoJnJvb3RfbWVtY2ctPmNzcyk7CisJCXJldCA9IHJvb3RfbWVtY2c7CiAJfQogCiAJd2hpbGUgKCFyZXQpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQluZXh0aWQgPSByb290X21lbS0+bGFzdF9zY2FubmVkX2NoaWxkICsgMTsKLQkJY3NzID0gY3NzX2dldF9uZXh0KCZtZW1fY2dyb3VwX3N1YnN5cywgbmV4dGlkLCAmcm9vdF9tZW0tPmNzcywKKwkJbmV4dGlkID0gcm9vdF9tZW1jZy0+bGFzdF9zY2FubmVkX2NoaWxkICsgMTsKKwkJY3NzID0gY3NzX2dldF9uZXh0KCZtZW1fY2dyb3VwX3N1YnN5cywgbmV4dGlkLCAmcm9vdF9tZW1jZy0+Y3NzLAogCQkJCSAgICZmb3VuZCk7CiAJCWlmIChjc3MgJiYgY3NzX3RyeWdldChjc3MpKQogCQkJcmV0ID0gY29udGFpbmVyX29mKGNzcywgc3RydWN0IG1lbV9jZ3JvdXAsIGNzcyk7CkBAIC0xNDg4LDkgKzE0OTksOSBAQAogCQkvKiBVcGRhdGVzIHNjYW5uaW5nIHBhcmFtZXRlciAqLwogCQlpZiAoIWNzcykgewogCQkJLyogdGhpcyBtZWFucyBzdGFydCBzY2FuIGZyb20gSUQ6MSAqLwotCQkJcm9vdF9tZW0tPmxhc3Rfc2Nhbm5lZF9jaGlsZCA9IDA7CisJCQlyb290X21lbWNnLT5sYXN0X3NjYW5uZWRfY2hpbGQgPSAwOwogCQl9IGVsc2UKLQkJCXJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQgPSBmb3VuZDsKKwkJCXJvb3RfbWVtY2ctPmxhc3Rfc2Nhbm5lZF9jaGlsZCA9IGZvdW5kOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xNTA2LDE0ICsxNTE3LDE0IEBACiAgKiByZWNsYWltYWJsZSBwYWdlcyBvbiBhIG5vZGUuIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHJlY2xhaW1hYmxlCiAgKiBwYWdlcyBpbiB0aGUgbm9kZS4KICAqLwotc3RhdGljIGJvb2wgdGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK3N0YXRpYyBib29sIHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJaW50IG5pZCwgYm9vbCBub3N3YXApCiB7Ci0JaWYgKG1lbV9jZ3JvdXBfbm9kZV9ucl9scnVfcGFnZXMobWVtLCBuaWQsIExSVV9BTExfRklMRSkpCisJaWYgKG1lbV9jZ3JvdXBfbm9kZV9ucl9scnVfcGFnZXMobWVtY2csIG5pZCwgTFJVX0FMTF9GSUxFKSkKIAkJcmV0dXJuIHRydWU7CiAJaWYgKG5vc3dhcCB8fCAhdG90YWxfc3dhcF9wYWdlcykKIAkJcmV0dXJuIGZhbHNlOwotCWlmIChtZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKG1lbSwgbmlkLCBMUlVfQUxMX0FOT04pKQorCWlmIChtZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBuaWQsIExSVV9BTExfQU5PTikpCiAJCXJldHVybiB0cnVlOwogCXJldHVybiBmYWxzZTsKIApAQCAtMTUyNiwyOSArMTUzNywyOSBAQAogICogbm9kZXMgYmFzZWQgb24gdGhlIHpvbmVsaXN0LiBTbyB1cGRhdGUgdGhlIGxpc3QgbG9vc2VseSBvbmNlIHBlciAxMCBzZWNzLgogICoKICAqLwotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9tYXlfdXBkYXRlX25vZGVtYXNrKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX21heV91cGRhdGVfbm9kZW1hc2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCWludCBuaWQ7CiAJLyoKIAkgKiBudW1haW5mb19ldmVudHMgPiAwIG1lYW5zIHRoZXJlIHdhcyBhdCBsZWFzdCBOVU1BSU5GT19FVkVOVFNfVEFSR0VUCiAJICogcGFnZWluL3BhZ2VvdXQgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCB1cGRhdGUuCiAJICovCi0JaWYgKCFhdG9taWNfcmVhZCgmbWVtLT5udW1haW5mb19ldmVudHMpKQorCWlmICghYXRvbWljX3JlYWQoJm1lbWNnLT5udW1haW5mb19ldmVudHMpKQogCQlyZXR1cm47Ci0JaWYgKGF0b21pY19pbmNfcmV0dXJuKCZtZW0tPm51bWFpbmZvX3VwZGF0aW5nKSA+IDEpCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZtZW1jZy0+bnVtYWluZm9fdXBkYXRpbmcpID4gMSkKIAkJcmV0dXJuOwogCiAJLyogbWFrZSBhIG5vZGVtYXNrIHdoZXJlIHRoaXMgbWVtY2cgdXNlcyBtZW1vcnkgZnJvbSAqLwotCW1lbS0+c2Nhbl9ub2RlcyA9IG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldOworCW1lbWNnLT5zY2FuX25vZGVzID0gbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV07CiAKIAlmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXSkgewogCi0JCWlmICghdGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtLCBuaWQsIGZhbHNlKSkKLQkJCW5vZGVfY2xlYXIobmlkLCBtZW0tPnNjYW5fbm9kZXMpOworCQlpZiAoIXRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbWNnLCBuaWQsIGZhbHNlKSkKKwkJCW5vZGVfY2xlYXIobmlkLCBtZW1jZy0+c2Nhbl9ub2Rlcyk7CiAJfQogCi0JYXRvbWljX3NldCgmbWVtLT5udW1haW5mb19ldmVudHMsIDApOwotCWF0b21pY19zZXQoJm1lbS0+bnVtYWluZm9fdXBkYXRpbmcsIDApOworCWF0b21pY19zZXQoJm1lbWNnLT5udW1haW5mb19ldmVudHMsIDApOworCWF0b21pY19zZXQoJm1lbWNnLT5udW1haW5mb191cGRhdGluZywgMCk7CiB9CiAKIC8qCkBAIC0xNTYzLDE2ICsxNTc0LDE2IEBACiAgKgogICogTm93LCB3ZSB1c2Ugcm91bmQtcm9iaW4uIEJldHRlciBhbGdvcml0aG0gaXMgd2VsY29tZWQuCiAgKi8KLWludCBtZW1fY2dyb3VwX3NlbGVjdF92aWN0aW1fbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoraW50IG1lbV9jZ3JvdXBfc2VsZWN0X3ZpY3RpbV9ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlpbnQgbm9kZTsKIAotCW1lbV9jZ3JvdXBfbWF5X3VwZGF0ZV9ub2RlbWFzayhtZW0pOwotCW5vZGUgPSBtZW0tPmxhc3Rfc2Nhbm5lZF9ub2RlOworCW1lbV9jZ3JvdXBfbWF5X3VwZGF0ZV9ub2RlbWFzayhtZW1jZyk7CisJbm9kZSA9IG1lbWNnLT5sYXN0X3NjYW5uZWRfbm9kZTsKIAotCW5vZGUgPSBuZXh0X25vZGUobm9kZSwgbWVtLT5zY2FuX25vZGVzKTsKKwlub2RlID0gbmV4dF9ub2RlKG5vZGUsIG1lbWNnLT5zY2FuX25vZGVzKTsKIAlpZiAobm9kZSA9PSBNQVhfTlVNTk9ERVMpCi0JCW5vZGUgPSBmaXJzdF9ub2RlKG1lbS0+c2Nhbl9ub2Rlcyk7CisJCW5vZGUgPSBmaXJzdF9ub2RlKG1lbWNnLT5zY2FuX25vZGVzKTsKIAkvKgogCSAqIFdlIGNhbGwgdGhpcyB3aGVuIHdlIGhpdCBsaW1pdCwgbm90IHdoZW4gcGFnZXMgYXJlIGFkZGVkIHRvIExSVS4KIAkgKiBObyBMUlUgbWF5IGhvbGQgcGFnZXMgYmVjYXVzZSBhbGwgcGFnZXMgYXJlIFVORVZJQ1RBQkxFIG9yCkBAIC0xNTgyLDcgKzE1OTMsNyBAQAogCWlmICh1bmxpa2VseShub2RlID09IE1BWF9OVU1OT0RFUykpCiAJCW5vZGUgPSBudW1hX25vZGVfaWQoKTsKIAotCW1lbS0+bGFzdF9zY2FubmVkX25vZGUgPSBub2RlOworCW1lbWNnLT5sYXN0X3NjYW5uZWRfbm9kZSA9IG5vZGU7CiAJcmV0dXJuIG5vZGU7CiB9CiAKQEAgLTE1OTIsNyArMTYwMyw3IEBACiAgKiB1bnVzZWQgbm9kZXMuIEJ1dCBzY2FuX25vZGVzIGlzIGxhemlseSB1cGRhdGVkIGFuZCBtYXkgbm90IGNvdGFpbgogICogZW5vdWdoIG5ldyBpbmZvcm1hdGlvbi4gV2UgbmVlZCB0byBkbyBkb3VibGUgY2hlY2suCiAgKi8KLWJvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBib29sIG5vc3dhcCkKK2Jvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgbm9zd2FwKQogewogCWludCBuaWQ7CiAKQEAgLTE2MDAsMTIgKzE2MTEsMTIgQEAKIAkgKiBxdWljayBjaGVjay4uLm1ha2luZyB1c2Ugb2Ygc2Nhbl9ub2RlLgogCSAqIFdlIGNhbiBza2lwIHVudXNlZCBub2Rlcy4KIAkgKi8KLQlpZiAoIW5vZGVzX2VtcHR5KG1lbS0+c2Nhbl9ub2RlcykpIHsKLQkJZm9yIChuaWQgPSBmaXJzdF9ub2RlKG1lbS0+c2Nhbl9ub2Rlcyk7CisJaWYgKCFub2Rlc19lbXB0eShtZW1jZy0+c2Nhbl9ub2RlcykpIHsKKwkJZm9yIChuaWQgPSBmaXJzdF9ub2RlKG1lbWNnLT5zY2FuX25vZGVzKTsKIAkJICAgICBuaWQgPCBNQVhfTlVNTk9ERVM7Ci0JCSAgICAgbmlkID0gbmV4dF9ub2RlKG5pZCwgbWVtLT5zY2FuX25vZGVzKSkgeworCQkgICAgIG5pZCA9IG5leHRfbm9kZShuaWQsIG1lbWNnLT5zY2FuX25vZGVzKSkgewogCi0JCQlpZiAodGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtLCBuaWQsIG5vc3dhcCkpCisJCQlpZiAodGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtY2csIG5pZCwgbm9zd2FwKSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KQEAgLTE2MTMsMjMgKzE2MjQsMjMgQEAKIAkgKiBDaGVjayByZXN0IG9mIG5vZGVzLgogCSAqLwogCWZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX0hJR0hfTUVNT1JZKSB7Ci0JCWlmIChub2RlX2lzc2V0KG5pZCwgbWVtLT5zY2FuX25vZGVzKSkKKwkJaWYgKG5vZGVfaXNzZXQobmlkLCBtZW1jZy0+c2Nhbl9ub2RlcykpCiAJCQljb250aW51ZTsKLQkJaWYgKHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbSwgbmlkLCBub3N3YXApKQorCQlpZiAodGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtY2csIG5pZCwgbm9zd2FwKSkKIAkJCXJldHVybiB0cnVlOwogCX0KIAlyZXR1cm4gZmFsc2U7CiB9CiAKICNlbHNlCi1pbnQgbWVtX2Nncm91cF9zZWxlY3RfdmljdGltX25vZGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK2ludCBtZW1fY2dyb3VwX3NlbGVjdF92aWN0aW1fbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLWJvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBib29sIG5vc3dhcCkKK2Jvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgbm9zd2FwKQogewotCXJldHVybiB0ZXN0X21lbV9jZ3JvdXBfbm9kZV9yZWNsYWltYWJsZShtZW0sIDAsIG5vc3dhcCk7CisJcmV0dXJuIHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbWNnLCAwLCBub3N3YXApOwogfQogI2VuZGlmCiAKQEAgLTE2MzgsMTQgKzE2NDksMTQgQEAKICAqIHdlIHJlY2xhaW1lZCBmcm9tLCBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cCBwZW5hbGl6aW5nIG9uZSBjaGlsZCBleHRlbnNpdmVseQogICogYmFzZWQgb24gaXRzIHBvc2l0aW9uIGluIHRoZSBjaGlsZHJlbiBsaXN0LgogICoKLSAqIHJvb3RfbWVtIGlzIHRoZSBvcmlnaW5hbCBhbmNlc3RvciB0aGF0IHdlJ3ZlIGJlZW4gcmVjbGFpbSBmcm9tLgorICogcm9vdF9tZW1jZyBpcyB0aGUgb3JpZ2luYWwgYW5jZXN0b3IgdGhhdCB3ZSd2ZSBiZWVuIHJlY2xhaW0gZnJvbS4KICAqCi0gKiBXZSBnaXZlIHVwIGFuZCByZXR1cm4gdG8gdGhlIGNhbGxlciB3aGVuIHdlIHZpc2l0IHJvb3RfbWVtIHR3aWNlLgorICogV2UgZ2l2ZSB1cCBhbmQgcmV0dXJuIHRvIHRoZSBjYWxsZXIgd2hlbiB3ZSB2aXNpdCByb290X21lbWNnIHR3aWNlLgogICogKG90aGVyIGdyb3VwcyBjYW4gYmUgcmVtb3ZlZCB3aGlsZSB3ZSdyZSB3YWxraW5nLi4uLikKICAqCiAgKiBJZiBzaHJpbms9PXRydWUsIGZvciBhdm9pZGluZyB0byBmcmVlIHRvbyBtdWNoLCB0aGlzIHJldHVybnMgaW1tZWRpZWF0ZWx5LgogICovCi1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfaGllcmFyY2hpY2FsX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKnJvb3RfbWVtLAorc3RhdGljIGludCBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbWNnLAogCQkJCQkJc3RydWN0IHpvbmUgKnpvbmUsCiAJCQkJCQlnZnBfdCBnZnBfbWFzaywKIAkJCQkJCXVuc2lnbmVkIGxvbmcgcmVjbGFpbV9vcHRpb25zLApAQCAtMTY2MCwxNSArMTY3MSwxNSBAQAogCXVuc2lnbmVkIGxvbmcgZXhjZXNzOwogCXVuc2lnbmVkIGxvbmcgbnJfc2Nhbm5lZDsKIAotCWV4Y2VzcyA9IHJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZyb290X21lbS0+cmVzKSA+PiBQQUdFX1NISUZUOworCWV4Y2VzcyA9IHJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZyb290X21lbWNnLT5yZXMpID4+IFBBR0VfU0hJRlQ7CiAKIAkvKiBJZiBtZW1zd19pc19taW5pbXVtPT0xLCBzd2FwLW91dCBpcyBvZi1uby11c2UuICovCi0JaWYgKCFjaGVja19zb2Z0ICYmICFzaHJpbmsgJiYgcm9vdF9tZW0tPm1lbXN3X2lzX21pbmltdW0pCisJaWYgKCFjaGVja19zb2Z0ICYmICFzaHJpbmsgJiYgcm9vdF9tZW1jZy0+bWVtc3dfaXNfbWluaW11bSkKIAkJbm9zd2FwID0gdHJ1ZTsKIAogCXdoaWxlICgxKSB7Ci0JCXZpY3RpbSA9IG1lbV9jZ3JvdXBfc2VsZWN0X3ZpY3RpbShyb290X21lbSk7Ci0JCWlmICh2aWN0aW0gPT0gcm9vdF9tZW0pIHsKKwkJdmljdGltID0gbWVtX2Nncm91cF9zZWxlY3RfdmljdGltKHJvb3RfbWVtY2cpOworCQlpZiAodmljdGltID09IHJvb3RfbWVtY2cpIHsKIAkJCWxvb3ArKzsKIAkJCS8qCiAJCQkgKiBXZSBhcmUgbm90IGRyYWluaW5nIHBlciBjcHUgY2FjaGVkIGNoYXJnZXMgZHVyaW5nCkBAIC0xNjc3LDcgKzE2ODgsNyBAQAogCQkJICogY2hhcmdlcyB3aWxsIG5vdCBnaXZlIGFueS4KIAkJCSAqLwogCQkJaWYgKCFjaGVja19zb2Z0ICYmIGxvb3AgPj0gMSkKLQkJCQlkcmFpbl9hbGxfc3RvY2tfYXN5bmMocm9vdF9tZW0pOworCQkJCWRyYWluX2FsbF9zdG9ja19hc3luYyhyb290X21lbWNnKTsKIAkJCWlmIChsb29wID49IDIpIHsKIAkJCQkvKgogCQkJCSAqIElmIHdlIGhhdmUgbm90IGJlZW4gYWJsZSB0byByZWNsYWltCkBAIC0xNzI0LDkgKzE3MzUsOSBAQAogCQkJcmV0dXJuIHJldDsKIAkJdG90YWwgKz0gcmV0OwogCQlpZiAoY2hlY2tfc29mdCkgewotCQkJaWYgKCFyZXNfY291bnRlcl9zb2Z0X2xpbWl0X2V4Y2Vzcygmcm9vdF9tZW0tPnJlcykpCisJCQlpZiAoIXJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZyb290X21lbWNnLT5yZXMpKQogCQkJCXJldHVybiB0b3RhbDsKLQkJfSBlbHNlIGlmIChtZW1fY2dyb3VwX21hcmdpbihyb290X21lbSkpCisJCX0gZWxzZSBpZiAobWVtX2Nncm91cF9tYXJnaW4ocm9vdF9tZW1jZykpCiAJCQlyZXR1cm4gdG90YWw7CiAJfQogCXJldHVybiB0b3RhbDsKQEAgLTE3MzcsMTIgKzE3NDgsMTIgQEAKICAqIElmIHNvbWVvbmUgaXMgcnVubmluZywgcmV0dXJuIGZhbHNlLgogICogSGFzIHRvIGJlIGNhbGxlZCB3aXRoIG1lbWNnX29vbV9sb2NrCiAgKi8KLXN0YXRpYyBib29sIG1lbV9jZ3JvdXBfb29tX2xvY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyBib29sIG1lbV9jZ3JvdXBfb29tX2xvY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICppdGVyLCAqZmFpbGVkID0gTlVMTDsKIAlib29sIGNvbmQgPSB0cnVlOwogCi0JZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlX2NvbmQoaXRlciwgbWVtLCBjb25kKSB7CisJZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlX2NvbmQoaXRlciwgbWVtY2csIGNvbmQpIHsKIAkJaWYgKGl0ZXItPm9vbV9sb2NrKSB7CiAJCQkvKgogCQkJICogdGhpcyBzdWJ0cmVlIG9mIG91ciBoaWVyYXJjaHkgaXMgYWxyZWFkeSBsb2NrZWQKQEAgLTE3NjIsNyArMTc3Myw3IEBACiAJICogd2hhdCB3ZSBzZXQgdXAgdG8gdGhlIGZhaWxpbmcgc3VidHJlZQogCSAqLwogCWNvbmQgPSB0cnVlOwotCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZV9jb25kKGl0ZXIsIG1lbSwgY29uZCkgeworCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZV9jb25kKGl0ZXIsIG1lbWNnLCBjb25kKSB7CiAJCWlmIChpdGVyID09IGZhaWxlZCkgewogCQkJY29uZCA9IGZhbHNlOwogCQkJY29udGludWU7CkBAIC0xNzc1LDI0ICsxNzg2LDI0IEBACiAvKgogICogSGFzIHRvIGJlIGNhbGxlZCB3aXRoIG1lbWNnX29vbV9sb2NrCiAgKi8KLXN0YXRpYyBpbnQgbWVtX2Nncm91cF9vb21fdW5sb2NrKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfb29tX3VubG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKml0ZXI7CiAKLQlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtKQorCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW1jZykKIAkJaXRlci0+b29tX2xvY2sgPSBmYWxzZTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9tYXJrX3VuZGVyX29vbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIHZvaWQgbWVtX2Nncm91cF9tYXJrX3VuZGVyX29vbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKml0ZXI7CiAKLQlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtKQorCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW1jZykKIAkJYXRvbWljX2luYygmaXRlci0+dW5kZXJfb29tKTsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF91bm1hcmtfdW5kZXJfb29tKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3VubWFya191bmRlcl9vb20oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICppdGVyOwogCkBAIC0xODAxLDcgKzE4MTIsNyBAQAogCSAqIG1lbV9jZ3JvdXBfb29tX2xvY2soKSBtYXkgbm90IGJlIGNhbGxlZC4gV2UgaGF2ZSB0byB1c2UKIAkgKiBhdG9taWNfYWRkX3VubGVzcygpIGhlcmUuCiAJICovCi0JZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlKGl0ZXIsIG1lbSkKKwlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtY2cpCiAJCWF0b21pY19hZGRfdW5sZXNzKCZpdGVyLT51bmRlcl9vb20sIC0xLCAwKTsKIH0KIApAQCAtMTgxNiw4NSArMTgyNyw4NSBAQAogc3RhdGljIGludCBtZW1jZ19vb21fd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX3QgKndhaXQsCiAJdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqd2FrZV9tZW0gPSAoc3RydWN0IG1lbV9jZ3JvdXAgKilhcmcsCi0JCQkgICpvb21fd2FpdF9tZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKndha2VfbWVtY2cgPSAoc3RydWN0IG1lbV9jZ3JvdXAgKilhcmcsCisJCQkgICpvb21fd2FpdF9tZW1jZzsKIAlzdHJ1Y3Qgb29tX3dhaXRfaW5mbyAqb29tX3dhaXRfaW5mbzsKIAogCW9vbV93YWl0X2luZm8gPSBjb250YWluZXJfb2Yod2FpdCwgc3RydWN0IG9vbV93YWl0X2luZm8sIHdhaXQpOwotCW9vbV93YWl0X21lbSA9IG9vbV93YWl0X2luZm8tPm1lbTsKKwlvb21fd2FpdF9tZW1jZyA9IG9vbV93YWl0X2luZm8tPm1lbTsKIAogCS8qCiAJICogQm90aCBvZiBvb21fd2FpdF9pbmZvLT5tZW0gYW5kIHdha2VfbWVtIGFyZSBzdGFibGUgdW5kZXIgdXMuCiAJICogVGhlbiB3ZSBjYW4gdXNlIGNzc19pc19hbmNlc3RvciB3aXRob3V0IHRha2luZyBjYXJlIG9mIFJDVS4KIAkgKi8KLQlpZiAoIW1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKG9vbV93YWl0X21lbSwgd2FrZV9tZW0pCi0JCQkmJiAhbWVtX2Nncm91cF9zYW1lX29yX3N1YnRyZWUod2FrZV9tZW0sIG9vbV93YWl0X21lbSkpCisJaWYgKCFtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShvb21fd2FpdF9tZW1jZywgd2FrZV9tZW1jZykKKwkJJiYgIW1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKHdha2VfbWVtY2csIG9vbV93YWl0X21lbWNnKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIGF1dG9yZW1vdmVfd2FrZV9mdW5jdGlvbih3YWl0LCBtb2RlLCBzeW5jLCBhcmcpOwogfQogCi1zdGF0aWMgdm9pZCBtZW1jZ193YWtldXBfb29tKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1jZ193YWtldXBfb29tKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKLQkvKiBmb3IgZmlsdGVyaW5nLCBwYXNzICJtZW0iIGFzIGFyZ3VtZW50LiAqLwotCV9fd2FrZV91cCgmbWVtY2dfb29tX3dhaXRxLCBUQVNLX05PUk1BTCwgMCwgbWVtKTsKKwkvKiBmb3IgZmlsdGVyaW5nLCBwYXNzICJtZW1jZyIgYXMgYXJndW1lbnQuICovCisJX193YWtlX3VwKCZtZW1jZ19vb21fd2FpdHEsIFRBU0tfTk9STUFMLCAwLCBtZW1jZyk7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbWNnX29vbV9yZWNvdmVyKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1jZ19vb21fcmVjb3ZlcihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7Ci0JaWYgKG1lbSAmJiBhdG9taWNfcmVhZCgmbWVtLT51bmRlcl9vb20pKQotCQltZW1jZ193YWtldXBfb29tKG1lbSk7CisJaWYgKG1lbWNnICYmIGF0b21pY19yZWFkKCZtZW1jZy0+dW5kZXJfb29tKSkKKwkJbWVtY2dfd2FrZXVwX29vbShtZW1jZyk7CiB9CiAKIC8qCiAgKiB0cnkgdG8gY2FsbCBPT00ga2lsbGVyLiByZXR1cm5zIGZhbHNlIGlmIHdlIHNob3VsZCBleGl0IG1lbW9yeS1yZWNsYWltIGxvb3AuCiAgKi8KLWJvb2wgbWVtX2Nncm91cF9oYW5kbGVfb29tKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGdmcF90IG1hc2spCitib29sIG1lbV9jZ3JvdXBfaGFuZGxlX29vbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IG1hc2spCiB7CiAJc3RydWN0IG9vbV93YWl0X2luZm8gb3dhaXQ7CiAJYm9vbCBsb2NrZWQsIG5lZWRfdG9fa2lsbDsKIAotCW93YWl0Lm1lbSA9IG1lbTsKKwlvd2FpdC5tZW0gPSBtZW1jZzsKIAlvd2FpdC53YWl0LmZsYWdzID0gMDsKIAlvd2FpdC53YWl0LmZ1bmMgPSBtZW1jZ19vb21fd2FrZV9mdW5jdGlvbjsKIAlvd2FpdC53YWl0LnByaXZhdGUgPSBjdXJyZW50OwogCUlOSVRfTElTVF9IRUFEKCZvd2FpdC53YWl0LnRhc2tfbGlzdCk7CiAJbmVlZF90b19raWxsID0gdHJ1ZTsKLQltZW1fY2dyb3VwX21hcmtfdW5kZXJfb29tKG1lbSk7CisJbWVtX2Nncm91cF9tYXJrX3VuZGVyX29vbShtZW1jZyk7CiAKLQkvKiBBdCBmaXJzdCwgdHJ5IHRvIE9PTSBsb2NrIGhpZXJhcmNoeSB1bmRlciBtZW0uKi8KKwkvKiBBdCBmaXJzdCwgdHJ5IHRvIE9PTSBsb2NrIGhpZXJhcmNoeSB1bmRlciBtZW1jZy4qLwogCXNwaW5fbG9jaygmbWVtY2dfb29tX2xvY2spOwotCWxvY2tlZCA9IG1lbV9jZ3JvdXBfb29tX2xvY2sobWVtKTsKKwlsb2NrZWQgPSBtZW1fY2dyb3VwX29vbV9sb2NrKG1lbWNnKTsKIAkvKgogCSAqIEV2ZW4gaWYgc2lnbmFsX3BlbmRpbmcoKSwgd2UgY2FuJ3QgcXVpdCBjaGFyZ2UoKSBsb29wIHdpdGhvdXQKIAkgKiBhY2NvdW50aW5nLiBTbywgVU5JTlRFUlJVUFRJQkxFIGlzIGFwcHJvcHJpYXRlLiBCdXQgU0lHS0lMTAogCSAqIHVuZGVyIE9PTSBpcyBhbHdheXMgd2VsY29tZWQsIHVzZSBUQVNLX0tJTExBQkxFIGhlcmUuCiAJICovCiAJcHJlcGFyZV90b193YWl0KCZtZW1jZ19vb21fd2FpdHEsICZvd2FpdC53YWl0LCBUQVNLX0tJTExBQkxFKTsKLQlpZiAoIWxvY2tlZCB8fCBtZW0tPm9vbV9raWxsX2Rpc2FibGUpCisJaWYgKCFsb2NrZWQgfHwgbWVtY2ctPm9vbV9raWxsX2Rpc2FibGUpCiAJCW5lZWRfdG9fa2lsbCA9IGZhbHNlOwogCWlmIChsb2NrZWQpCi0JCW1lbV9jZ3JvdXBfb29tX25vdGlmeShtZW0pOworCQltZW1fY2dyb3VwX29vbV9ub3RpZnkobWVtY2cpOwogCXNwaW5fdW5sb2NrKCZtZW1jZ19vb21fbG9jayk7CiAKIAlpZiAobmVlZF90b19raWxsKSB7CiAJCWZpbmlzaF93YWl0KCZtZW1jZ19vb21fd2FpdHEsICZvd2FpdC53YWl0KTsKLQkJbWVtX2Nncm91cF9vdXRfb2ZfbWVtb3J5KG1lbSwgbWFzayk7CisJCW1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShtZW1jZywgbWFzayk7CiAJfSBlbHNlIHsKIAkJc2NoZWR1bGUoKTsKIAkJZmluaXNoX3dhaXQoJm1lbWNnX29vbV93YWl0cSwgJm93YWl0LndhaXQpOwogCX0KIAlzcGluX2xvY2soJm1lbWNnX29vbV9sb2NrKTsKIAlpZiAobG9ja2VkKQotCQltZW1fY2dyb3VwX29vbV91bmxvY2sobWVtKTsKLQltZW1jZ193YWtldXBfb29tKG1lbSk7CisJCW1lbV9jZ3JvdXBfb29tX3VubG9jayhtZW1jZyk7CisJbWVtY2dfd2FrZXVwX29vbShtZW1jZyk7CiAJc3Bpbl91bmxvY2soJm1lbWNnX29vbV9sb2NrKTsKIAotCW1lbV9jZ3JvdXBfdW5tYXJrX3VuZGVyX29vbShtZW0pOworCW1lbV9jZ3JvdXBfdW5tYXJrX3VuZGVyX29vbShtZW1jZyk7CiAKIAlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfTUVNRElFKSB8fCBmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJcmV0dXJuIGZhbHNlOwogCS8qIEdpdmUgY2hhbmNlIHRvIGR5aW5nIHByb2Nlc3MgKi8KLQlzY2hlZHVsZV90aW1lb3V0KDEpOworCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCXJldHVybiB0cnVlOwogfQogCkBAIC0xOTI1LDcgKzE5MzYsNyBAQAogdm9pZCBtZW1fY2dyb3VwX3VwZGF0ZV9wYWdlX3N0YXQoc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJIGVudW0gbWVtX2Nncm91cF9wYWdlX3N0YXRfaXRlbSBpZHgsIGludCB2YWwpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKIAlib29sIG5lZWRfdW5sb2NrID0gZmFsc2U7CiAJdW5zaWduZWQgbG9uZyB1bmluaXRpYWxpemVkX3ZhcihmbGFncyk7CkBAIC0xOTM0LDE2ICsxOTQ1LDE2IEBACiAJCXJldHVybjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQltZW0gPSBwYy0+bWVtX2Nncm91cDsKLQlpZiAodW5saWtlbHkoIW1lbSB8fCAhUGFnZUNncm91cFVzZWQocGMpKSkKKwltZW1jZyA9IHBjLT5tZW1fY2dyb3VwOworCWlmICh1bmxpa2VseSghbWVtY2cgfHwgIVBhZ2VDZ3JvdXBVc2VkKHBjKSkpCiAJCWdvdG8gb3V0OwogCS8qIHBjLT5tZW1fY2dyb3VwIGlzIHVuc3RhYmxlID8gKi8KLQlpZiAodW5saWtlbHkobWVtX2Nncm91cF9zdGVhbGVkKG1lbSkpIHx8IFBhZ2VUcmFuc0h1Z2UocGFnZSkpIHsKKwlpZiAodW5saWtlbHkobWVtX2Nncm91cF9zdGVhbGVkKG1lbWNnKSkgfHwgUGFnZVRyYW5zSHVnZShwYWdlKSkgewogCQkvKiB0YWtlIGEgbG9jayBhZ2FpbnN0IHRvIGFjY2VzcyBwYy0+bWVtX2Nncm91cCAqLwogCQltb3ZlX2xvY2tfcGFnZV9jZ3JvdXAocGMsICZmbGFncyk7CiAJCW5lZWRfdW5sb2NrID0gdHJ1ZTsKLQkJbWVtID0gcGMtPm1lbV9jZ3JvdXA7Ci0JCWlmICghbWVtIHx8ICFQYWdlQ2dyb3VwVXNlZChwYykpCisJCW1lbWNnID0gcGMtPm1lbV9jZ3JvdXA7CisJCWlmICghbWVtY2cgfHwgIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKIAkJCWdvdG8gb3V0OwogCX0KIApAQCAtMTk1OSw3ICsxOTcwLDcgQEAKIAkJQlVHKCk7CiAJfQogCi0JdGhpc19jcHVfYWRkKG1lbS0+c3RhdC0+Y291bnRbaWR4XSwgdmFsKTsKKwl0aGlzX2NwdV9hZGQobWVtY2ctPnN0YXQtPmNvdW50W2lkeF0sIHZhbCk7CiAKIG91dDoKIAlpZiAodW5saWtlbHkobmVlZF91bmxvY2spKQpAQCAtMTk5MCwxMyArMjAwMSwxMyBAQAogICogY2dyb3VwIHdoaWNoIGlzIG5vdCBjdXJyZW50IHRhcmdldCwgcmV0dXJucyBmYWxzZS4gVGhpcyBzdG9jayB3aWxsIGJlCiAgKiByZWZpbGxlZC4KICAqLwotc3RhdGljIGJvb2wgY29uc3VtZV9zdG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIGJvb2wgY29uc3VtZV9zdG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2s7CiAJYm9vbCByZXQgPSB0cnVlOwogCiAJc3RvY2sgPSAmZ2V0X2NwdV92YXIobWVtY2dfc3RvY2spOwotCWlmIChtZW0gPT0gc3RvY2stPmNhY2hlZCAmJiBzdG9jay0+bnJfcGFnZXMpCisJaWYgKG1lbWNnID09IHN0b2NrLT5jYWNoZWQgJiYgc3RvY2stPm5yX3BhZ2VzKQogCQlzdG9jay0+bnJfcGFnZXMtLTsKIAllbHNlIC8qIG5lZWQgdG8gY2FsbCByZXNfY291bnRlcl9jaGFyZ2UgKi8KIAkJcmV0ID0gZmFsc2U7CkBAIC0yMDM3LDI0ICsyMDQ4LDI0IEBACiAgKiBDYWNoZSBjaGFyZ2VzKHZhbCkgd2hpY2ggaXMgZnJvbSByZXNfY291bnRlciwgdG8gbG9jYWwgcGVyX2NwdSBhcmVhLgogICogVGhpcyB3aWxsIGJlIGNvbnN1bWVkIGJ5IGNvbnN1bWVfc3RvY2soKSBmdW5jdGlvbiwgbGF0ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHJlZmlsbF9zdG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCitzdGF0aWMgdm9pZCByZWZpbGxfc3RvY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCiB7CiAJc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2sgPSAmZ2V0X2NwdV92YXIobWVtY2dfc3RvY2spOwogCi0JaWYgKHN0b2NrLT5jYWNoZWQgIT0gbWVtKSB7IC8qIHJlc2V0IGlmIG5lY2Vzc2FyeSAqLworCWlmIChzdG9jay0+Y2FjaGVkICE9IG1lbWNnKSB7IC8qIHJlc2V0IGlmIG5lY2Vzc2FyeSAqLwogCQlkcmFpbl9zdG9jayhzdG9jayk7Ci0JCXN0b2NrLT5jYWNoZWQgPSBtZW07CisJCXN0b2NrLT5jYWNoZWQgPSBtZW1jZzsKIAl9CiAJc3RvY2stPm5yX3BhZ2VzICs9IG5yX3BhZ2VzOwogCXB1dF9jcHVfdmFyKG1lbWNnX3N0b2NrKTsKIH0KIAogLyoKLSAqIERyYWlucyBhbGwgcGVyLUNQVSBjaGFyZ2UgY2FjaGVzIGZvciBnaXZlbiByb290X21lbSByZXNwLiBzdWJ0cmVlCisgKiBEcmFpbnMgYWxsIHBlci1DUFUgY2hhcmdlIGNhY2hlcyBmb3IgZ2l2ZW4gcm9vdF9tZW1jZyByZXNwLiBzdWJ0cmVlCiAgKiBvZiB0aGUgaGllcmFyY2h5IHVuZGVyIGl0LiBzeW5jIGZsYWcgc2F5cyB3aGV0aGVyIHdlIHNob3VsZCBibG9jawogICogdW50aWwgdGhlIHdvcmsgaXMgZG9uZS4KICAqLwotc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbSwgYm9vbCBzeW5jKQorc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbWNnLCBib29sIHN5bmMpCiB7CiAJaW50IGNwdSwgY3VyY3B1OwogCkBAIC0yMDYzLDEyICsyMDc0LDEyIEBACiAJY3VyY3B1ID0gZ2V0X2NwdSgpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCXN0cnVjdCBtZW1jZ19zdG9ja19wY3AgKnN0b2NrID0gJnBlcl9jcHUobWVtY2dfc3RvY2ssIGNwdSk7Ci0JCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKIAotCQltZW0gPSBzdG9jay0+Y2FjaGVkOwotCQlpZiAoIW1lbSB8fCAhc3RvY2stPm5yX3BhZ2VzKQorCQltZW1jZyA9IHN0b2NrLT5jYWNoZWQ7CisJCWlmICghbWVtY2cgfHwgIXN0b2NrLT5ucl9wYWdlcykKIAkJCWNvbnRpbnVlOwotCQlpZiAoIW1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKHJvb3RfbWVtLCBtZW0pKQorCQlpZiAoIW1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKHJvb3RfbWVtY2csIG1lbWNnKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxVU0hJTkdfQ0FDSEVEX0NIQVJHRSwgJnN0b2NrLT5mbGFncykpIHsKIAkJCWlmIChjcHUgPT0gY3VyY3B1KQpAQCAtMjA5NywyMyArMjEwOCwyMyBAQAogICogZXhwZWN0cyBzb21lIGNoYXJnZXMgd2lsbCBiZSBiYWNrIHRvIHJlc19jb3VudGVyIGxhdGVyIGJ1dCBjYW5ub3Qgd2FpdCBmb3IKICAqIGl0LgogICovCi1zdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfYXN5bmMoc3RydWN0IG1lbV9jZ3JvdXAgKnJvb3RfbWVtKQorc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrX2FzeW5jKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbWNnKQogewogCS8qCiAJICogSWYgc29tZW9uZSBjYWxscyBkcmFpbmluZywgYXZvaWQgYWRkaW5nIG1vcmUga3dvcmtlciBydW5zLgogCSAqLwogCWlmICghbXV0ZXhfdHJ5bG9jaygmcGVyY3B1X2NoYXJnZV9tdXRleCkpCiAJCXJldHVybjsKLQlkcmFpbl9hbGxfc3RvY2socm9vdF9tZW0sIGZhbHNlKTsKKwlkcmFpbl9hbGxfc3RvY2socm9vdF9tZW1jZywgZmFsc2UpOwogCW11dGV4X3VubG9jaygmcGVyY3B1X2NoYXJnZV9tdXRleCk7CiB9CiAKIC8qIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBkcmFpbiBpbnRlcmZhY2UuICovCi1zdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfc3luYyhzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW0pCitzdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfc3luYyhzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW1jZykKIHsKIAkvKiBjYWxsZWQgd2hlbiBmb3JjZV9lbXB0eSBpcyBjYWxsZWQgKi8KIAltdXRleF9sb2NrKCZwZXJjcHVfY2hhcmdlX211dGV4KTsKLQlkcmFpbl9hbGxfc3RvY2socm9vdF9tZW0sIHRydWUpOworCWRyYWluX2FsbF9zdG9jayhyb290X21lbWNnLCB0cnVlKTsKIAltdXRleF91bmxvY2soJnBlcmNwdV9jaGFyZ2VfbXV0ZXgpOwogfQogCkBAIC0yMTIxLDM1ICsyMTMyLDM1IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGRyYWlucyBwZXJjcHUgY291bnRlciB2YWx1ZSBmcm9tIERFQUQgY3B1IGFuZAogICogbW92ZSBpdCB0byBsb2NhbCBjcHUuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBwcmVlbXB0ZWQuCiAgKi8KLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZHJhaW5fcGNwX2NvdW50ZXIoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IGNwdSkKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZHJhaW5fcGNwX2NvdW50ZXIoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgY3B1KQogewogCWludCBpOwogCi0Jc3Bpbl9sb2NrKCZtZW0tPnBjcF9jb3VudGVyX2xvY2spOworCXNwaW5fbG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCBNRU1fQ0dST1VQX1NUQVRfREFUQTsgaSsrKSB7Ci0JCWxvbmcgeCA9IHBlcl9jcHUobWVtLT5zdGF0LT5jb3VudFtpXSwgY3B1KTsKKwkJbG9uZyB4ID0gcGVyX2NwdShtZW1jZy0+c3RhdC0+Y291bnRbaV0sIGNwdSk7CiAKLQkJcGVyX2NwdShtZW0tPnN0YXQtPmNvdW50W2ldLCBjcHUpID0gMDsKLQkJbWVtLT5ub2NwdV9iYXNlLmNvdW50W2ldICs9IHg7CisJCXBlcl9jcHUobWVtY2ctPnN0YXQtPmNvdW50W2ldLCBjcHUpID0gMDsKKwkJbWVtY2ctPm5vY3B1X2Jhc2UuY291bnRbaV0gKz0geDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IE1FTV9DR1JPVVBfRVZFTlRTX05TVEFUUzsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgeCA9IHBlcl9jcHUobWVtLT5zdGF0LT5ldmVudHNbaV0sIGNwdSk7CisJCXVuc2lnbmVkIGxvbmcgeCA9IHBlcl9jcHUobWVtY2ctPnN0YXQtPmV2ZW50c1tpXSwgY3B1KTsKIAotCQlwZXJfY3B1KG1lbS0+c3RhdC0+ZXZlbnRzW2ldLCBjcHUpID0gMDsKLQkJbWVtLT5ub2NwdV9iYXNlLmV2ZW50c1tpXSArPSB4OworCQlwZXJfY3B1KG1lbWNnLT5zdGF0LT5ldmVudHNbaV0sIGNwdSkgPSAwOworCQltZW1jZy0+bm9jcHVfYmFzZS5ldmVudHNbaV0gKz0geDsKIAl9CiAJLyogbmVlZCB0byBjbGVhciBPTl9NT1ZFIHZhbHVlLCB3b3JrcyBhcyBhIGtpbmQgb2YgbG9jay4gKi8KLQlwZXJfY3B1KG1lbS0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9PTl9NT1ZFXSwgY3B1KSA9IDA7Ci0Jc3Bpbl91bmxvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7CisJcGVyX2NwdShtZW1jZy0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9PTl9NT1ZFXSwgY3B1KSA9IDA7CisJc3Bpbl91bmxvY2soJm1lbWNnLT5wY3BfY291bnRlcl9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgc3luY2hyb25pemVfbWVtX2Nncm91cF9vbl9tb3ZlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBjcHUpCitzdGF0aWMgdm9pZCBzeW5jaHJvbml6ZV9tZW1fY2dyb3VwX29uX21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgY3B1KQogewogCWludCBpZHggPSBNRU1fQ0dST1VQX09OX01PVkU7CiAKLQlzcGluX2xvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7Ci0JcGVyX2NwdShtZW0tPnN0YXQtPmNvdW50W2lkeF0sIGNwdSkgPSBtZW0tPm5vY3B1X2Jhc2UuY291bnRbaWR4XTsKLQlzcGluX3VubG9jaygmbWVtLT5wY3BfY291bnRlcl9sb2NrKTsKKwlzcGluX2xvY2soJm1lbWNnLT5wY3BfY291bnRlcl9sb2NrKTsKKwlwZXJfY3B1KG1lbWNnLT5zdGF0LT5jb3VudFtpZHhdLCBjcHUpID0gbWVtY2ctPm5vY3B1X2Jhc2UuY291bnRbaWR4XTsKKwlzcGluX3VubG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogfQogCiBzdGF0aWMgaW50IF9fY3B1aW5pdCBtZW1jZ19jcHVfaG90cGx1Z19jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLApAQCAtMjE4Nyw3ICsyMTk4LDcgQEAKIAlDSEFSR0VfT09NX0RJRSwJCS8qIHRoZSBjdXJyZW50IGlzIGtpbGxlZCBiZWNhdXNlIG9mIE9PTSAqLwogfTsKIAotc3RhdGljIGludCBtZW1fY2dyb3VwX2RvX2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBnZnBfdCBnZnBfbWFzaywKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9kb19jaGFyZ2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBnZnBfdCBnZnBfbWFzaywKIAkJCQl1bnNpZ25lZCBpbnQgbnJfcGFnZXMsIGJvb2wgb29tX2NoZWNrKQogewogCXVuc2lnbmVkIGxvbmcgY3NpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTsKQEAgLTIxOTYsMTYgKzIyMDcsMTYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlKCZtZW0tPnJlcywgY3NpemUsICZmYWlsX3Jlcyk7CisJcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlKCZtZW1jZy0+cmVzLCBjc2l6ZSwgJmZhaWxfcmVzKTsKIAogCWlmIChsaWtlbHkoIXJldCkpIHsKIAkJaWYgKCFkb19zd2FwX2FjY291bnQpCiAJCQlyZXR1cm4gQ0hBUkdFX09LOwotCQlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2UoJm1lbS0+bWVtc3csIGNzaXplLCAmZmFpbF9yZXMpOworCQlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2UoJm1lbWNnLT5tZW1zdywgY3NpemUsICZmYWlsX3Jlcyk7CiAJCWlmIChsaWtlbHkoIXJldCkpCiAJCQlyZXR1cm4gQ0hBUkdFX09LOwogCi0JCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgY3NpemUpOworCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPnJlcywgY3NpemUpOwogCQltZW1fb3Zlcl9saW1pdCA9IG1lbV9jZ3JvdXBfZnJvbV9yZXNfY291bnRlcihmYWlsX3JlcywgbWVtc3cpOwogCQlmbGFncyB8PSBNRU1fQ0dST1VQX1JFQ0xBSU1fTk9TV0FQOwogCX0gZWxzZQpAQCAtMjI2MywxMiArMjI3NCwxMiBAQAogc3RhdGljIGludCBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICBnZnBfdCBnZnBfbWFzaywKIAkJCQkgICB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCi0JCQkJICAgc3RydWN0IG1lbV9jZ3JvdXAgKiptZW1jZywKKwkJCQkgICBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0ciwKIAkJCQkgICBib29sIG9vbSkKIHsKIAl1bnNpZ25lZCBpbnQgYmF0Y2ggPSBtYXgoQ0hBUkdFX0JBVENILCBucl9wYWdlcyk7CiAJaW50IG5yX29vbV9yZXRyaWVzID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IE5VTEw7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJLyoKQEAgLTIyODYsMTcgKzIyOTcsMTcgQEAKIAkgKiB0aHJlYWQgZ3JvdXAgbGVhZGVyIG1pZ3JhdGVzLiBJdCdzIHBvc3NpYmxlIHRoYXQgbW0gaXMgbm90CiAJICogc2V0LCBpZiBzbyBjaGFyZ2UgdGhlIGluaXRfbW0gKGhhcHBlbnMgZm9yIHBhZ2VjYWNoZSB1c2FnZSkuCiAJICovCi0JaWYgKCEqbWVtY2cgJiYgIW1tKQorCWlmICghKnB0ciAmJiAhbW0pCiAJCWdvdG8gYnlwYXNzOwogYWdhaW46Ci0JaWYgKCptZW1jZykgeyAvKiBjc3Mgc2hvdWxkIGJlIGEgdmFsaWQgb25lICovCi0JCW1lbSA9ICptZW1jZzsKLQkJVk1fQlVHX09OKGNzc19pc19yZW1vdmVkKCZtZW0tPmNzcykpOwotCQlpZiAobWVtX2Nncm91cF9pc19yb290KG1lbSkpCisJaWYgKCpwdHIpIHsgLyogY3NzIHNob3VsZCBiZSBhIHZhbGlkIG9uZSAqLworCQltZW1jZyA9ICpwdHI7CisJCVZNX0JVR19PTihjc3NfaXNfcmVtb3ZlZCgmbWVtY2ctPmNzcykpOworCQlpZiAobWVtX2Nncm91cF9pc19yb290KG1lbWNnKSkKIAkJCWdvdG8gZG9uZTsKLQkJaWYgKG5yX3BhZ2VzID09IDEgJiYgY29uc3VtZV9zdG9jayhtZW0pKQorCQlpZiAobnJfcGFnZXMgPT0gMSAmJiBjb25zdW1lX3N0b2NrKG1lbWNnKSkKIAkJCWdvdG8gZG9uZTsKLQkJY3NzX2dldCgmbWVtLT5jc3MpOworCQljc3NfZ2V0KCZtZW1jZy0+Y3NzKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAKQEAgLTIzMDQsNyArMjMxNSw3IEBACiAJCXAgPSByY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKTsKIAkJLyoKIAkJICogQmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRhc2tfbG9jaygpLCAicCIgY2FuIGV4aXQuCi0JCSAqIEluIHRoYXQgY2FzZSwgIm1lbSIgY2FuIHBvaW50IHRvIHJvb3Qgb3IgcCBjYW4gYmUgTlVMTCB3aXRoCisJCSAqIEluIHRoYXQgY2FzZSwgIm1lbWNnIiBjYW4gcG9pbnQgdG8gcm9vdCBvciBwIGNhbiBiZSBOVUxMIHdpdGgKIAkJICogcmFjZSB3aXRoIHN3YXBvZmYuIFRoZW4sIHdlIGhhdmUgc21hbGwgcmlzayBvZiBtaXMtYWNjb3VuaW5nLgogCQkgKiBCdXQgc3VjaCBraW5kIG9mIG1pcy1hY2NvdW50IGJ5IHJhY2UgYWx3YXlzIGhhcHBlbnMgYmVjYXVzZQogCQkgKiB3ZSBkb24ndCBoYXZlIGNncm91cF9tdXRleCgpLiBJdCdzIG92ZXJraWxsIGFuZCB3ZSBhbGxvIHRoYXQKQEAgLTIzMTIsMTIgKzIzMjMsMTIgQEAKIAkJICogKCopIHN3YXBvZmYgYXQgZWwgd2lsbCBjaGFyZ2UgYWdhaW5zdCBtbS1zdHJ1Y3Qgbm90IGFnYWluc3QKIAkJICogdGFzay1zdHJ1Y3QuIFNvLCBtbS0+b3duZXIgY2FuIGJlIE5VTEwuCiAJCSAqLwotCQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhwKTsKLQkJaWYgKCFtZW0gfHwgbWVtX2Nncm91cF9pc19yb290KG1lbSkpIHsKKwkJbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhwKTsKKwkJaWYgKCFtZW1jZyB8fCBtZW1fY2dyb3VwX2lzX3Jvb3QobWVtY2cpKSB7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQotCQlpZiAobnJfcGFnZXMgPT0gMSAmJiBjb25zdW1lX3N0b2NrKG1lbSkpIHsKKwkJaWYgKG5yX3BhZ2VzID09IDEgJiYgY29uc3VtZV9zdG9jayhtZW1jZykpIHsKIAkJCS8qCiAJCQkgKiBJdCBzZWVtcyBkYWdlcm91cyB0byBhY2Nlc3MgbWVtY2cgd2l0aG91dCBjc3NfZ2V0KCkuCiAJCQkgKiBCdXQgY29uc2lkZXJpbmcgaG93IGNvbnN1bWVfc3RvayB3b3JrcywgaXQncyBub3QKQEAgLTIzMzAsNyArMjM0MSw3IEBACiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJLyogYWZ0ZXIgaGVyZSwgd2UgbWF5IGJlIGJsb2NrZWQuIHdlIG5lZWQgdG8gZ2V0IHJlZmNudCAqLwotCQlpZiAoIWNzc190cnlnZXQoJm1lbS0+Y3NzKSkgeworCQlpZiAoIWNzc190cnlnZXQoJm1lbWNnLT5jc3MpKSB7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWdvdG8gYWdhaW47CiAJCX0KQEAgLTIzNDIsNyArMjM1Myw3IEBACiAKIAkJLyogSWYga2lsbGVkLCBieXBhc3MgY2hhcmdlICovCiAJCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJY3NzX3B1dCgmbWVtLT5jc3MpOworCQkJY3NzX3B1dCgmbWVtY2ctPmNzcyk7CiAJCQlnb3RvIGJ5cGFzczsKIAkJfQogCkBAIC0yMzUyLDQzICsyMzYzLDQzIEBACiAJCQlucl9vb21fcmV0cmllcyA9IE1FTV9DR1JPVVBfUkVDTEFJTV9SRVRSSUVTOwogCQl9CiAKLQkJcmV0ID0gbWVtX2Nncm91cF9kb19jaGFyZ2UobWVtLCBnZnBfbWFzaywgYmF0Y2gsIG9vbV9jaGVjayk7CisJCXJldCA9IG1lbV9jZ3JvdXBfZG9fY2hhcmdlKG1lbWNnLCBnZnBfbWFzaywgYmF0Y2gsIG9vbV9jaGVjayk7CiAJCXN3aXRjaCAocmV0KSB7CiAJCWNhc2UgQ0hBUkdFX09LOgogCQkJYnJlYWs7CiAJCWNhc2UgQ0hBUkdFX1JFVFJZOiAvKiBub3QgaW4gT09NIHNpdHVhdGlvbiBidXQgcmV0cnkgKi8KIAkJCWJhdGNoID0gbnJfcGFnZXM7Ci0JCQljc3NfcHV0KCZtZW0tPmNzcyk7Ci0JCQltZW0gPSBOVUxMOworCQkJY3NzX3B1dCgmbWVtY2ctPmNzcyk7CisJCQltZW1jZyA9IE5VTEw7CiAJCQlnb3RvIGFnYWluOwogCQljYXNlIENIQVJHRV9XT1VMREJMT0NLOiAvKiAhX19HRlBfV0FJVCAqLwotCQkJY3NzX3B1dCgmbWVtLT5jc3MpOworCQkJY3NzX3B1dCgmbWVtY2ctPmNzcyk7CiAJCQlnb3RvIG5vbWVtOwogCQljYXNlIENIQVJHRV9OT01FTTogLyogT09NIHJvdXRpbmUgd29ya3MgKi8KIAkJCWlmICghb29tKSB7Ci0JCQkJY3NzX3B1dCgmbWVtLT5jc3MpOworCQkJCWNzc19wdXQoJm1lbWNnLT5jc3MpOwogCQkJCWdvdG8gbm9tZW07CiAJCQl9CiAJCQkvKiBJZiBvb20sIHdlIG5ldmVyIHJldHVybiAtRU5PTUVNICovCiAJCQlucl9vb21fcmV0cmllcy0tOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0hBUkdFX09PTV9ESUU6IC8qIEtpbGxlZCBieSBPT00gS2lsbGVyICovCi0JCQljc3NfcHV0KCZtZW0tPmNzcyk7CisJCQljc3NfcHV0KCZtZW1jZy0+Y3NzKTsKIAkJCWdvdG8gYnlwYXNzOwogCQl9CiAJfSB3aGlsZSAocmV0ICE9IENIQVJHRV9PSyk7CiAKIAlpZiAoYmF0Y2ggPiBucl9wYWdlcykKLQkJcmVmaWxsX3N0b2NrKG1lbSwgYmF0Y2ggLSBucl9wYWdlcyk7Ci0JY3NzX3B1dCgmbWVtLT5jc3MpOworCQlyZWZpbGxfc3RvY2sobWVtY2csIGJhdGNoIC0gbnJfcGFnZXMpOworCWNzc19wdXQoJm1lbWNnLT5jc3MpOwogZG9uZToKLQkqbWVtY2cgPSBtZW07CisJKnB0ciA9IG1lbWNnOwogCXJldHVybiAwOwogbm9tZW06Ci0JKm1lbWNnID0gTlVMTDsKKwkqcHRyID0gTlVMTDsKIAlyZXR1cm4gLUVOT01FTTsKIGJ5cGFzczoKLQkqbWVtY2cgPSBOVUxMOworCSpwdHIgPSBOVUxMOwogCXJldHVybiAwOwogfQogCkBAIC0yMzk3LDE1ICsyNDA4LDE1IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciB0aGF0IGFuZCBkbyB1bmNoYXJnZSwgcHV0IGNzcydzIHJlZmNudC4KICAqIGdvdHRlbiBieSB0cnlfY2hhcmdlKCkuCiAgKi8KLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBucl9wYWdlcykKIHsKLQlpZiAoIW1lbV9jZ3JvdXBfaXNfcm9vdChtZW0pKSB7CisJaWYgKCFtZW1fY2dyb3VwX2lzX3Jvb3QobWVtY2cpKSB7CiAJCXVuc2lnbmVkIGxvbmcgYnl0ZXMgPSBucl9wYWdlcyAqIFBBR0VfU0laRTsKIAotCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIGJ5dGVzKTsKKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbWNnLT5yZXMsIGJ5dGVzKTsKIAkJaWYgKGRvX3N3YXBfYWNjb3VudCkKLQkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBieXRlcyk7CisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPm1lbXN3LCBieXRlcyk7CiAJfQogfQogCkBAIC0yNDMwLDcgKzI0NDEsNyBAQAogCiBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBOVUxMOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CiAJdW5zaWduZWQgc2hvcnQgaWQ7CiAJc3dwX2VudHJ5X3QgZW50OwpAQCAtMjQ0MCwyMyArMjQ1MSwyMyBAQAogCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOwogCWxvY2tfcGFnZV9jZ3JvdXAocGMpOwogCWlmIChQYWdlQ2dyb3VwVXNlZChwYykpIHsKLQkJbWVtID0gcGMtPm1lbV9jZ3JvdXA7Ci0JCWlmIChtZW0gJiYgIWNzc190cnlnZXQoJm1lbS0+Y3NzKSkKLQkJCW1lbSA9IE5VTEw7CisJCW1lbWNnID0gcGMtPm1lbV9jZ3JvdXA7CisJCWlmIChtZW1jZyAmJiAhY3NzX3RyeWdldCgmbWVtY2ctPmNzcykpCisJCQltZW1jZyA9IE5VTEw7CiAJfSBlbHNlIGlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CiAJCWVudC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSk7CiAJCWlkID0gbG9va3VwX3N3YXBfY2dyb3VwKGVudCk7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbWVtID0gbWVtX2Nncm91cF9sb29rdXAoaWQpOwotCQlpZiAobWVtICYmICFjc3NfdHJ5Z2V0KCZtZW0tPmNzcykpCi0JCQltZW0gPSBOVUxMOworCQltZW1jZyA9IG1lbV9jZ3JvdXBfbG9va3VwKGlkKTsKKwkJaWYgKG1lbWNnICYmICFjc3NfdHJ5Z2V0KCZtZW1jZy0+Y3NzKSkKKwkJCW1lbWNnID0gTlVMTDsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCXVubG9ja19wYWdlX2Nncm91cChwYyk7Ci0JcmV0dXJuIG1lbTsKKwlyZXR1cm4gbWVtY2c7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJICAgICAgIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCiAJCQkJICAgICAgIHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsCkBAIC0yNDY1LDE0ICsyNDc2LDE0IEBACiAJbG9ja19wYWdlX2Nncm91cChwYyk7CiAJaWYgKHVubGlrZWx5KFBhZ2VDZ3JvdXBVc2VkKHBjKSkpIHsKIAkJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQkJX19tZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2UobWVtLCBucl9wYWdlcyk7CisJCV9fbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG1lbWNnLCBucl9wYWdlcyk7CiAJCXJldHVybjsKIAl9CiAJLyoKIAkgKiB3ZSBkb24ndCBuZWVkIHBhZ2VfY2dyb3VwX2xvY2sgYWJvdXQgdGFpbCBwYWdlcywgYmVjYXNlIHRoZXkgYXJlIG5vdAogCSAqIGFjY2Vzc2VkIGJ5IGFueSBvdGhlciBjb250ZXh0IGF0IHRoaXMgcG9pbnQuCiAJICovCi0JcGMtPm1lbV9jZ3JvdXAgPSBtZW07CisJcGMtPm1lbV9jZ3JvdXAgPSBtZW1jZzsKIAkvKgogCSAqIFdlIGFjY2VzcyBhIHBhZ2VfY2dyb3VwIGFzeW5jaHJvbm91c2x5IHdpdGhvdXQgbG9ja19wYWdlX2Nncm91cCgpLgogCSAqIEVzcGVjaWFsbHkgd2hlbiBhIHBhZ2VfY2dyb3VwIGlzIHRha2VuIGZyb20gYSBwYWdlLCBwYy0+bWVtX2Nncm91cApAQCAtMjQ5NSwxNCArMjUwNiwxNCBAQAogCQlicmVhazsKIAl9CiAKLQltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKG1lbSwgUGFnZUNncm91cENhY2hlKHBjKSwgbnJfcGFnZXMpOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtY2csIFBhZ2VDZ3JvdXBDYWNoZShwYyksIG5yX3BhZ2VzKTsKIAl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwogCS8qCiAJICogImNoYXJnZV9zdGF0aXN0aWNzIiB1cGRhdGVkIGV2ZW50IGNvdW50ZXIuIFRoZW4sIGNoZWNrIGl0LgogCSAqIEluc2VydCBhbmNlc3RvciAoYW5kIGFuY2VzdG9yJ3MgYW5jZXN0b3JzKSwgdG8gc29mdGxpbWl0IFJCLXRyZWUuCiAJICogaWYgdGhleSBleGNlZWRzIHNvZnRsaW1pdC4KIAkgKi8KLQltZW1jZ19jaGVja19ldmVudHMobWVtLCBwYWdlKTsKKwltZW1jZ19jaGVja19ldmVudHMobWVtY2csIHBhZ2UpOwogfQogCiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCkBAIC0yNjg5LDcgKzI3MDAsNyBAQAogc3RhdGljIGludCBtZW1fY2dyb3VwX2NoYXJnZV9jb21tb24oc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCWdmcF90IGdmcF9tYXNrLCBlbnVtIGNoYXJnZV90eXBlIGN0eXBlKQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7CiAJdW5zaWduZWQgaW50IG5yX3BhZ2VzID0gMTsKIAlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwogCWJvb2wgb29tID0gdHJ1ZTsKQEAgLTI3MDgsMTEgKzI3MTksMTEgQEAKIAlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKIAlCVUdfT04oIXBjKTsgLyogWFhYOiByZW1vdmUgdGhpcyBhbmQgbW92ZSBwYyBsb29rdXAgaW50byBjb21taXQgKi8KIAotCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBnZnBfbWFzaywgbnJfcGFnZXMsICZtZW0sIG9vbSk7Ci0JaWYgKHJldCB8fCAhbWVtKQorCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBnZnBfbWFzaywgbnJfcGFnZXMsICZtZW1jZywgb29tKTsKKwlpZiAocmV0IHx8ICFtZW1jZykKIAkJcmV0dXJuIHJldDsKIAotCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKG1lbSwgcGFnZSwgbnJfcGFnZXMsIHBjLCBjdHlwZSk7CisJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UobWVtY2csIHBhZ2UsIG5yX3BhZ2VzLCBwYywgY3R5cGUpOwogCXJldHVybiAwOwogfQogCkBAIC0yNzQxLDcgKzI3NTIsNyBAQAogCQkJCQllbnVtIGNoYXJnZV90eXBlIGN0eXBlKTsKIAogc3RhdGljIHZvaWQKLV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX2xydWNhcmUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9scnVjYXJlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJCWVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCiB7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKQEAgLTI3NTEsNyArMjc2Miw3IEBACiAJICogTFJVLiBUYWtlIGNhcmUgb2YgaXQuCiAJICovCiAJbWVtX2Nncm91cF9scnVfZGVsX2JlZm9yZV9jb21taXQocGFnZSk7Ci0JX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UobWVtLCBwYWdlLCAxLCBwYywgY3R5cGUpOworCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKG1lbWNnLCBwYWdlLCAxLCBwYywgY3R5cGUpOwogCW1lbV9jZ3JvdXBfbHJ1X2FkZF9hZnRlcl9jb21taXQocGFnZSk7CiAJcmV0dXJuOwogfQpAQCAtMjc1OSw3ICsyNzcwLDcgQEAKIGludCBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IE5VTEw7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKQEAgLTI3NzEsOCArMjc4Miw4IEBACiAJCW1tID0gJmluaXRfbW07CiAKIAlpZiAocGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpKSB7Ci0JCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBnZnBfbWFzaywgMSwgJm1lbSwgdHJ1ZSk7Ci0JCWlmIChyZXQgfHwgIW1lbSkKKwkJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UobW0sIGdmcF9tYXNrLCAxLCAmbWVtY2csIHRydWUpOworCQlpZiAocmV0IHx8ICFtZW1jZykKIAkJCXJldHVybiByZXQ7CiAKIAkJLyoKQEAgLTI3ODAsMTUgKzI3OTEsMTUgQEAKIAkJICogcHV0IHRoYXQgd291bGQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgTFJVIGxpc3QsIG1ha2UKIAkJICogc3VyZSB0aGF0IHRoZXkgZ2V0IHJlbGlua2VkIHByb3Blcmx5LgogCQkgKi8KLQkJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2VfbHJ1Y2FyZShwYWdlLCBtZW0sCisJCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX2xydWNhcmUocGFnZSwgbWVtY2csCiAJCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEUpOwogCQlyZXR1cm4gcmV0OwogCX0KIAkvKiBzaG1lbSAqLwogCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7Ci0JCXJldCA9IG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwaW4obW0sIHBhZ2UsIGdmcF9tYXNrLCAmbWVtKTsKKwkJcmV0ID0gbWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbihtbSwgcGFnZSwgZ2ZwX21hc2ssICZtZW1jZyk7CiAJCWlmICghcmV0KQotCQkJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2Vfc3dhcGluKHBhZ2UsIG1lbSwKKwkJCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX3N3YXBpbihwYWdlLCBtZW1jZywKIAkJCQkJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTSk7CiAJfSBlbHNlCiAJCXJldCA9IG1lbV9jZ3JvdXBfY2hhcmdlX2NvbW1vbihwYWdlLCBtbSwgZ2ZwX21hc2ssCkBAIC0yODA3LDcgKzI4MTgsNyBAQAogCQkJCSBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQkgZ2ZwX3QgbWFzaywgc3RydWN0IG1lbV9jZ3JvdXAgKipwdHIpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAJaW50IHJldDsKIAogCSpwdHIgPSBOVUxMOwpAQCAtMjgyNSwxMiArMjgzNiwxMiBAQAogCSAqLwogCWlmICghUGFnZVN3YXBDYWNoZShwYWdlKSkKIAkJZ290byBjaGFyZ2VfY3VyX21tOwotCW1lbSA9IHRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX3BhZ2UocGFnZSk7Ci0JaWYgKCFtZW0pCisJbWVtY2cgPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9wYWdlKHBhZ2UpOworCWlmICghbWVtY2cpCiAJCWdvdG8gY2hhcmdlX2N1cl9tbTsKLQkqcHRyID0gbWVtOworCSpwdHIgPSBtZW1jZzsKIAlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBtYXNrLCAxLCBwdHIsIHRydWUpOwotCWNzc19wdXQoJm1lbS0+Y3NzKTsKKwljc3NfcHV0KCZtZW1jZy0+Y3NzKTsKIAlyZXR1cm4gcmV0OwogY2hhcmdlX2N1cl9tbToKIAlpZiAodW5saWtlbHkoIW1tKSkKQEAgLTI4OTAsMTYgKzI5MDEsMTYgQEAKIAkJCQkJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQpOwogfQogCi12b2lkIG1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZV9zd2FwaW4oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3ZvaWQgbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuOwotCWlmICghbWVtKQorCWlmICghbWVtY2cpCiAJCXJldHVybjsKLQlfX21lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShtZW0sIDEpOworCV9fbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG1lbWNnLCAxKTsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9kb191bmNoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorc3RhdGljIHZvaWQgbWVtX2Nncm91cF9kb191bmNoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJICAgdW5zaWduZWQgaW50IG5yX3BhZ2VzLAogCQkJCSAgIGNvbnN0IGVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCiB7CkBAIC0yOTE3LDcgKzI5MjgsNyBAQAogCSAqIHVuY2hhcmdlcy4gVGhlbiwgaXQncyBvayB0byBpZ25vcmUgbWVtY2cncyByZWZjbnQuCiAJICovCiAJaWYgKCFiYXRjaC0+bWVtY2cpCi0JCWJhdGNoLT5tZW1jZyA9IG1lbTsKKwkJYmF0Y2gtPm1lbWNnID0gbWVtY2c7CiAJLyoKIAkgKiBkb19iYXRjaCA+IDAgd2hlbiB1bm1hcHBpbmcgcGFnZXMgb3IgaW5vZGUgaW52YWxpZGF0ZS90cnVuY2F0ZS4KIAkgKiBJbiB0aG9zZSBjYXNlcywgYWxsIHBhZ2VzIGZyZWVkIGNvbnRpbnVvdXNseSBjYW4gYmUgZXhwZWN0ZWQgdG8gYmUgaW4KQEAgLTI5MzcsNyArMjk0OCw3IEBACiAJICogbWVyZ2UgYSBzZXJpZXMgb2YgdW5jaGFyZ2VzIHRvIGFuIHVuY2hhcmdlIG9mIHJlc19jb3VudGVyLgogCSAqIElmIG5vdCwgd2UgdW5jaGFyZ2UgcmVzX2NvdW50ZXIgb255IGJ5IG9uZS4KIAkgKi8KLQlpZiAoYmF0Y2gtPm1lbWNnICE9IG1lbSkKKwlpZiAoYmF0Y2gtPm1lbWNnICE9IG1lbWNnKQogCQlnb3RvIGRpcmVjdF91bmNoYXJnZTsKIAkvKiByZW1lbWJlciBmcmVlZCBjaGFyZ2UgYW5kIHVuY2hhcmdlIGl0IGxhdGVyICovCiAJYmF0Y2gtPm5yX3BhZ2VzKys7CkBAIC0yOTQ1LDExICsyOTU2LDExIEBACiAJCWJhdGNoLT5tZW1zd19ucl9wYWdlcysrOwogCXJldHVybjsKIGRpcmVjdF91bmNoYXJnZToKLQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIG5yX3BhZ2VzICogUEFHRV9TSVpFKTsKKwlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPnJlcywgbnJfcGFnZXMgKiBQQUdFX1NJWkUpOwogCWlmICh1bmNoYXJnZV9tZW1zdykKLQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+bWVtc3csIG5yX3BhZ2VzICogUEFHRV9TSVpFKTsKLQlpZiAodW5saWtlbHkoYmF0Y2gtPm1lbWNnICE9IG1lbSkpCi0JCW1lbWNnX29vbV9yZWNvdmVyKG1lbSk7CisJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW1jZy0+bWVtc3csIG5yX3BhZ2VzICogUEFHRV9TSVpFKTsKKwlpZiAodW5saWtlbHkoYmF0Y2gtPm1lbWNnICE9IG1lbWNnKSkKKwkJbWVtY2dfb29tX3JlY292ZXIobWVtY2cpOwogCXJldHVybjsKIH0KIApAQCAtMjk1OSw3ICsyOTcwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqCiBfX21lbV9jZ3JvdXBfdW5jaGFyZ2VfY29tbW9uKHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGNoYXJnZV90eXBlIGN0eXBlKQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7CiAJdW5zaWduZWQgaW50IG5yX3BhZ2VzID0gMTsKIAlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwogCkBAIC0yOTgyLDcgKzI5OTMsNyBAQAogCiAJbG9ja19wYWdlX2Nncm91cChwYyk7CiAKLQltZW0gPSBwYy0+bWVtX2Nncm91cDsKKwltZW1jZyA9IHBjLT5tZW1fY2dyb3VwOwogCiAJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCiAJCWdvdG8gdW5sb2NrX291dDsKQEAgLTMwMDUsNyArMzAxNiw3IEBACiAJCWJyZWFrOwogCX0KIAotCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtLCBQYWdlQ2dyb3VwQ2FjaGUocGMpLCAtbnJfcGFnZXMpOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtY2csIFBhZ2VDZ3JvdXBDYWNoZShwYyksIC1ucl9wYWdlcyk7CiAKIAlDbGVhclBhZ2VDZ3JvdXBVc2VkKHBjKTsKIAkvKgpAQCAtMzAxNywxOCArMzAyOCwxOCBAQAogCiAJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKIAkvKgotCSAqIGV2ZW4gYWZ0ZXIgdW5sb2NrLCB3ZSBoYXZlIG1lbS0+cmVzLnVzYWdlIGhlcmUgYW5kIHRoaXMgbWVtY2cKKwkgKiBldmVuIGFmdGVyIHVubG9jaywgd2UgaGF2ZSBtZW1jZy0+cmVzLnVzYWdlIGhlcmUgYW5kIHRoaXMgbWVtY2cKIAkgKiB3aWxsIG5ldmVyIGJlIGZyZWVkLgogCSAqLwotCW1lbWNnX2NoZWNrX2V2ZW50cyhtZW0sIHBhZ2UpOworCW1lbWNnX2NoZWNrX2V2ZW50cyhtZW1jZywgcGFnZSk7CiAJaWYgKGRvX3N3YXBfYWNjb3VudCAmJiBjdHlwZSA9PSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NXQVBPVVQpIHsKLQkJbWVtX2Nncm91cF9zd2FwX3N0YXRpc3RpY3MobWVtLCB0cnVlKTsKLQkJbWVtX2Nncm91cF9nZXQobWVtKTsKKwkJbWVtX2Nncm91cF9zd2FwX3N0YXRpc3RpY3MobWVtY2csIHRydWUpOworCQltZW1fY2dyb3VwX2dldChtZW1jZyk7CiAJfQotCWlmICghbWVtX2Nncm91cF9pc19yb290KG1lbSkpCi0JCW1lbV9jZ3JvdXBfZG9fdW5jaGFyZ2UobWVtLCBucl9wYWdlcywgY3R5cGUpOworCWlmICghbWVtX2Nncm91cF9pc19yb290KG1lbWNnKSkKKwkJbWVtX2Nncm91cF9kb191bmNoYXJnZShtZW1jZywgbnJfcGFnZXMsIGN0eXBlKTsKIAotCXJldHVybiBtZW07CisJcmV0dXJuIG1lbWNnOwogCiB1bmxvY2tfb3V0OgogCXVubG9ja19wYWdlX2Nncm91cChwYyk7CkBAIC0zMjE4LDcgKzMyMjksNyBAQAogaW50IG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsCiAJc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICoqcHRyLCBnZnBfdCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBOVUxMOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CiAJZW51bSBjaGFyZ2VfdHlwZSBjdHlwZTsKIAlpbnQgcmV0ID0gMDsKQEAgLTMyMzIsOCArMzI0Myw4IEBACiAJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CiAJbG9ja19wYWdlX2Nncm91cChwYyk7CiAJaWYgKFBhZ2VDZ3JvdXBVc2VkKHBjKSkgewotCQltZW0gPSBwYy0+bWVtX2Nncm91cDsKLQkJY3NzX2dldCgmbWVtLT5jc3MpOworCQltZW1jZyA9IHBjLT5tZW1fY2dyb3VwOworCQljc3NfZ2V0KCZtZW1jZy0+Y3NzKTsKIAkJLyoKIAkJICogQXQgbWlncmF0aW5nIGFuIGFub255bW91cyBwYWdlLCBpdHMgbWFwY291bnQgZ29lcyBkb3duCiAJCSAqIHRvIDAgYW5kIHVuY2hhcmdlKCkgd2lsbCBiZSBjYWxsZWQuIEJ1dCwgZXZlbiBpZiBpdCdzIGZ1bGx5CkBAIC0zMjcxLDEyICszMjgyLDEyIEBACiAJICogSWYgdGhlIHBhZ2UgaXMgbm90IGNoYXJnZWQgYXQgdGhpcyBwb2ludCwKIAkgKiB3ZSByZXR1cm4gaGVyZS4KIAkgKi8KLQlpZiAoIW1lbSkKKwlpZiAoIW1lbWNnKQogCQlyZXR1cm4gMDsKIAotCSpwdHIgPSBtZW07CisJKnB0ciA9IG1lbWNnOwogCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsIGdmcF9tYXNrLCAxLCBwdHIsIGZhbHNlKTsKLQljc3NfcHV0KCZtZW0tPmNzcyk7LyogZHJvcCBleHRyYSByZWZjbnQgKi8KKwljc3NfcHV0KCZtZW1jZy0+Y3NzKTsvKiBkcm9wIGV4dHJhIHJlZmNudCAqLwogCWlmIChyZXQgfHwgKnB0ciA9PSBOVUxMKSB7CiAJCWlmIChQYWdlQW5vbihwYWdlKSkgewogCQkJbG9ja19wYWdlX2Nncm91cChwYyk7CkBAIC0zMzAyLDIxICszMzEzLDIxIEBACiAJCWN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9DQUNIRTsKIAllbHNlCiAJCWN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTTsKLQlfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShtZW0sIHBhZ2UsIDEsIHBjLCBjdHlwZSk7CisJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UobWVtY2csIHBhZ2UsIDEsIHBjLCBjdHlwZSk7CiAJcmV0dXJuIHJldDsKIH0KIAogLyogcmVtb3ZlIHJlZHVuZGFudCBjaGFyZ2UgaWYgbWlncmF0aW9uIGZhaWxlZCovCi12b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAordm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCXN0cnVjdCBwYWdlICpvbGRwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSwgYm9vbCBtaWdyYXRpb25fb2spCiB7CiAJc3RydWN0IHBhZ2UgKnVzZWQsICp1bnVzZWQ7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKIAotCWlmICghbWVtKQorCWlmICghbWVtY2cpCiAJCXJldHVybjsKIAkvKiBibG9ja3Mgcm1kaXIoKSAqLwotCWNncm91cF9leGNsdWRlX3JtZGlyKCZtZW0tPmNzcyk7CisJY2dyb3VwX2V4Y2x1ZGVfcm1kaXIoJm1lbWNnLT5jc3MpOwogCWlmICghbWlncmF0aW9uX29rKSB7CiAJCXVzZWQgPSBvbGRwYWdlOwogCQl1bnVzZWQgPSBuZXdwYWdlOwpAQCAtMzM1Miw3ICszMzYzLDcgQEAKIAkgKiBTbywgcm1kaXIoKS0+cHJlX2Rlc3Ryb3koKSBjYW4gYmUgY2FsbGVkIHdoaWxlIHdlIGRvIHRoaXMgY2hhcmdlLgogCSAqIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBjYWxsIHByZV9kZXN0cm95KCkgYWdhaW4uIGNoZWNrIGl0IGhlcmUuCiAJICovCi0JY2dyb3VwX3JlbGVhc2VfYW5kX3dha2V1cF9ybWRpcigmbWVtLT5jc3MpOworCWNncm91cF9yZWxlYXNlX2FuZF93YWtldXBfcm1kaXIoJm1lbWNnLT5jc3MpOwogfQogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCkBAIC0zNDMxLDcgKzM0NDIsNyBAQAogCQkvKgogCQkgKiBSYXRoZXIgdGhhbiBoaWRlIGFsbCBpbiBzb21lIGZ1bmN0aW9uLCBJIGRvIHRoaXMgaW4KIAkJICogb3BlbiBjb2RlZCBtYW5uZXIuIFlvdSBzZWUgd2hhdCB0aGlzIHJlYWxseSBkb2VzLgotCQkgKiBXZSBoYXZlIHRvIGd1YXJhbnRlZSBtZW0tPnJlcy5saW1pdCA8IG1lbS0+bWVtc3cubGltaXQuCisJCSAqIFdlIGhhdmUgdG8gZ3VhcmFudGVlIG1lbWNnLT5yZXMubGltaXQgPCBtZW1jZy0+bWVtc3cubGltaXQuCiAJCSAqLwogCQltdXRleF9sb2NrKCZzZXRfbGltaXRfbXV0ZXgpOwogCQltZW1zd2xpbWl0ID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5tZW1zdywgUkVTX0xJTUlUKTsKQEAgLTM0OTMsNyArMzUwNCw3IEBACiAJCS8qCiAJCSAqIFJhdGhlciB0aGFuIGhpZGUgYWxsIGluIHNvbWUgZnVuY3Rpb24sIEkgZG8gdGhpcyBpbgogCQkgKiBvcGVuIGNvZGVkIG1hbm5lci4gWW91IHNlZSB3aGF0IHRoaXMgcmVhbGx5IGRvZXMuCi0JCSAqIFdlIGhhdmUgdG8gZ3VhcmFudGVlIG1lbS0+cmVzLmxpbWl0IDwgbWVtLT5tZW1zdy5saW1pdC4KKwkJICogV2UgaGF2ZSB0byBndWFyYW50ZWUgbWVtY2ctPnJlcy5saW1pdCA8IG1lbWNnLT5tZW1zdy5saW1pdC4KIAkJICovCiAJCW11dGV4X2xvY2soJnNldF9saW1pdF9tdXRleCk7CiAJCW1lbWxpbWl0ID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5yZXMsIFJFU19MSU1JVCk7CkBAIC0zNjMxLDcgKzM2NDIsNyBAQAogICogVGhpcyByb3V0aW5lIHRyYXZlcnNlIHBhZ2VfY2dyb3VwIGluIGdpdmVuIGxpc3QgYW5kIGRyb3AgdGhlbSBhbGwuCiAgKiAqQW5kKiB0aGlzIHJvdXRpbmUgZG9lc24ndCByZWNsYWltIHBhZ2UgaXRzZWxmLCBqdXN0IHJlbW92ZXMgcGFnZV9jZ3JvdXAuCiAgKi8KLXN0YXRpYyBpbnQgbWVtX2Nncm91cF9mb3JjZV9lbXB0eV9saXN0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJaW50IG5vZGUsIGludCB6aWQsIGVudW0gbHJ1X2xpc3QgbHJ1KQogewogCXN0cnVjdCB6b25lICp6b25lOwpAQCAtMzY0Miw3ICszNjUzLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCXpvbmUgPSAmTk9ERV9EQVRBKG5vZGUpLT5ub2RlX3pvbmVzW3ppZF07Ci0JbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbSwgbm9kZSwgemlkKTsKKwlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtY2csIG5vZGUsIHppZCk7CiAJbGlzdCA9ICZtei0+bGlzdHNbbHJ1XTsKIAogCWxvb3AgPSBNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpOwpAQCAtMzY2OSw3ICszNjgwLDcgQEAKIAogCQlwYWdlID0gbG9va3VwX2Nncm91cF9wYWdlKHBjKTsKIAotCQlyZXQgPSBtZW1fY2dyb3VwX21vdmVfcGFyZW50KHBhZ2UsIHBjLCBtZW0sIEdGUF9LRVJORUwpOworCQlyZXQgPSBtZW1fY2dyb3VwX21vdmVfcGFyZW50KHBhZ2UsIHBjLCBtZW1jZywgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXQgPT0gLUVOT01FTSkKIAkJCWJyZWFrOwogCkBAIC0zNjkwLDE0ICszNzAxLDE0IEBACiAgKiBtYWtlIG1lbV9jZ3JvdXAncyBjaGFyZ2UgdG8gYmUgMCBpZiB0aGVyZSBpcyBubyB0YXNrLgogICogVGhpcyBlbmFibGVzIGRlbGV0aW5nIHRoaXMgbWVtX2Nncm91cC4KICAqLwotc3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGJvb2wgZnJlZV9hbGwpCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIGZyZWVfYWxsKQogewogCWludCByZXQ7CiAJaW50IG5vZGUsIHppZCwgc2hyaW5rOwogCWludCBucl9yZXRyaWVzID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7Ci0Jc3RydWN0IGNncm91cCAqY2dycCA9IG1lbS0+Y3NzLmNncm91cDsKKwlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gbWVtY2ctPmNzcy5jZ3JvdXA7CiAKLQljc3NfZ2V0KCZtZW0tPmNzcyk7CisJY3NzX2dldCgmbWVtY2ctPmNzcyk7CiAKIAlzaHJpbmsgPSAwOwogCS8qIHNob3VsZCBmcmVlIGFsbCA/ICovCkBAIC0zNzEzLDE0ICszNzI0LDE0IEBACiAJCQlnb3RvIG91dDsKIAkJLyogVGhpcyBpcyBmb3IgbWFraW5nIGFsbCAqdXNlZCogcGFnZXMgdG8gYmUgb24gTFJVLiAqLwogCQlscnVfYWRkX2RyYWluX2FsbCgpOwotCQlkcmFpbl9hbGxfc3RvY2tfc3luYyhtZW0pOworCQlkcmFpbl9hbGxfc3RvY2tfc3luYyhtZW1jZyk7CiAJCXJldCA9IDA7Ci0JCW1lbV9jZ3JvdXBfc3RhcnRfbW92ZShtZW0pOworCQltZW1fY2dyb3VwX3N0YXJ0X21vdmUobWVtY2cpOwogCQlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fSElHSF9NRU1PUlkpIHsKIAkJCWZvciAoemlkID0gMDsgIXJldCAmJiB6aWQgPCBNQVhfTlJfWk9ORVM7IHppZCsrKSB7CiAJCQkJZW51bSBscnVfbGlzdCBsOwogCQkJCWZvcl9lYWNoX2xydShsKSB7Ci0JCQkJCXJldCA9IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChtZW0sCisJCQkJCXJldCA9IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChtZW1jZywKIAkJCQkJCQlub2RlLCB6aWQsIGwpOwogCQkJCQlpZiAocmV0KQogCQkJCQkJYnJlYWs7CkBAIC0zNzI5LDE2ICszNzQwLDE2IEBACiAJCQlpZiAocmV0KQogCQkJCWJyZWFrOwogCQl9Ci0JCW1lbV9jZ3JvdXBfZW5kX21vdmUobWVtKTsKLQkJbWVtY2dfb29tX3JlY292ZXIobWVtKTsKKwkJbWVtX2Nncm91cF9lbmRfbW92ZShtZW1jZyk7CisJCW1lbWNnX29vbV9yZWNvdmVyKG1lbWNnKTsKIAkJLyogaXQgc2VlbXMgcGFyZW50IGNncm91cCBkb2Vzbid0IGhhdmUgZW5vdWdoIG1lbSAqLwogCQlpZiAocmV0ID09IC1FTk9NRU0pCiAJCQlnb3RvIHRyeV90b19mcmVlOwogCQljb25kX3Jlc2NoZWQoKTsKIAkvKiAicmV0IiBzaG91bGQgYWxzbyBiZSBjaGVja2VkIHRvIGVuc3VyZSBhbGwgbGlzdHMgYXJlIGVtcHR5LiAqLwotCX0gd2hpbGUgKG1lbS0+cmVzLnVzYWdlID4gMCB8fCByZXQpOworCX0gd2hpbGUgKG1lbWNnLT5yZXMudXNhZ2UgPiAwIHx8IHJldCk7CiBvdXQ6Ci0JY3NzX3B1dCgmbWVtLT5jc3MpOworCWNzc19wdXQoJm1lbWNnLT5jc3MpOwogCXJldHVybiByZXQ7CiAKIHRyeV90b19mcmVlOgpAQCAtMzc1MSwxNCArMzc2MiwxNCBAQAogCWxydV9hZGRfZHJhaW5fYWxsKCk7CiAJLyogdHJ5IHRvIGZyZWUgYWxsIHBhZ2VzIGluIHRoaXMgY2dyb3VwICovCiAJc2hyaW5rID0gMTsKLQl3aGlsZSAobnJfcmV0cmllcyAmJiBtZW0tPnJlcy51c2FnZSA+IDApIHsKKwl3aGlsZSAobnJfcmV0cmllcyAmJiBtZW1jZy0+cmVzLnVzYWdlID4gMCkgewogCQlpbnQgcHJvZ3Jlc3M7CiAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlyZXQgPSAtRUlOVFI7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlwcm9ncmVzcyA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtLCBHRlBfS0VSTkVMLAorCQlwcm9ncmVzcyA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIEdGUF9LRVJORUwsCiAJCQkJCQlmYWxzZSk7CiAJCWlmICghcHJvZ3Jlc3MpIHsKIAkJCW5yX3JldHJpZXMtLTsKQEAgLTM3ODcsMTIgKzM3OTgsMTIgQEAKIAkJCQkJdTY0IHZhbCkKIHsKIAlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CiAJc3RydWN0IGNncm91cCAqcGFyZW50ID0gY29udC0+cGFyZW50OwotCXN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnRfbWVtID0gTlVMTDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50X21lbWNnID0gTlVMTDsKIAogCWlmIChwYXJlbnQpCi0JCXBhcmVudF9tZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChwYXJlbnQpOworCQlwYXJlbnRfbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChwYXJlbnQpOwogCiAJY2dyb3VwX2xvY2soKTsKIAkvKgpAQCAtMzgwMywxMCArMzgxNCwxMCBAQAogCSAqIEZvciB0aGUgcm9vdCBjZ3JvdXAsIHBhcmVudF9tZW0gaXMgTlVMTCwgd2UgYWxsb3cgdmFsdWUgdG8gYmUKIAkgKiBzZXQgaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLgogCSAqLwotCWlmICgoIXBhcmVudF9tZW0gfHwgIXBhcmVudF9tZW0tPnVzZV9oaWVyYXJjaHkpICYmCisJaWYgKCghcGFyZW50X21lbWNnIHx8ICFwYXJlbnRfbWVtY2ctPnVzZV9oaWVyYXJjaHkpICYmCiAJCQkJKHZhbCA9PSAxIHx8IHZhbCA9PSAwKSkgewogCQlpZiAobGlzdF9lbXB0eSgmY29udC0+Y2hpbGRyZW4pKQotCQkJbWVtLT51c2VfaGllcmFyY2h5ID0gdmFsOworCQkJbWVtY2ctPnVzZV9oaWVyYXJjaHkgPSB2YWw7CiAJCWVsc2UKIAkJCXJldHZhbCA9IC1FQlVTWTsKIAl9IGVsc2UKQEAgLTM4MTcsMTQgKzM4MjgsMTQgQEAKIH0KIAogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3JlY3Vyc2l2ZV9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3JlY3Vyc2l2ZV9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJICAgICAgIGVudW0gbWVtX2Nncm91cF9zdGF0X2luZGV4IGlkeCkKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqaXRlcjsKIAlsb25nIHZhbCA9IDA7CiAKIAkvKiBQZXItY3B1IHZhbHVlcyBjYW4gYmUgbmVnYXRpdmUsIHVzZSBhIHNpZ25lZCBhY2N1bXVsYXRvciAqLwotCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW0pCisJZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlKGl0ZXIsIG1lbWNnKQogCQl2YWwgKz0gbWVtX2Nncm91cF9yZWFkX3N0YXQoaXRlciwgaWR4KTsKIAogCWlmICh2YWwgPCAwKSAvKiByYWNlID8gKi8KQEAgLTM4MzIsMjkgKzM4NDMsMjkgQEAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBtZW1fY2dyb3VwX3VzYWdlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGJvb2wgc3dhcCkKK3N0YXRpYyBpbmxpbmUgdTY0IG1lbV9jZ3JvdXBfdXNhZ2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHN3YXApCiB7CiAJdTY0IHZhbDsKIAotCWlmICghbWVtX2Nncm91cF9pc19yb290KG1lbSkpIHsKKwlpZiAoIW1lbV9jZ3JvdXBfaXNfcm9vdChtZW1jZykpIHsKIAkJaWYgKCFzd2FwKQotCQkJcmV0dXJuIHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW0tPnJlcywgUkVTX1VTQUdFKTsKKwkJCXJldHVybiByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPnJlcywgUkVTX1VTQUdFKTsKIAkJZWxzZQotCQkJcmV0dXJuIHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW0tPm1lbXN3LCBSRVNfVVNBR0UpOworCQkJcmV0dXJuIHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+bWVtc3csIFJFU19VU0FHRSk7CiAJfQogCi0JdmFsID0gbWVtX2Nncm91cF9yZWN1cnNpdmVfc3RhdChtZW0sIE1FTV9DR1JPVVBfU1RBVF9DQUNIRSk7Ci0JdmFsICs9IG1lbV9jZ3JvdXBfcmVjdXJzaXZlX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfUlNTKTsKKwl2YWwgPSBtZW1fY2dyb3VwX3JlY3Vyc2l2ZV9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUpOworCXZhbCArPSBtZW1fY2dyb3VwX3JlY3Vyc2l2ZV9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfUlNTKTsKIAogCWlmIChzd2FwKQotCQl2YWwgKz0gbWVtX2Nncm91cF9yZWN1cnNpdmVfc3RhdChtZW0sIE1FTV9DR1JPVVBfU1RBVF9TV0FQT1VUKTsKKwkJdmFsICs9IG1lbV9jZ3JvdXBfcmVjdXJzaXZlX3N0YXQobWVtY2csIE1FTV9DR1JPVVBfU1RBVF9TV0FQT1VUKTsKIAogCXJldHVybiB2YWwgPDwgUEFHRV9TSElGVDsKIH0KIAogc3RhdGljIHU2NCBtZW1fY2dyb3VwX3JlYWQoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNmdHlwZSAqY2Z0KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKIAl1NjQgdmFsOwogCWludCB0eXBlLCBuYW1lOwogCkBAIC0zODYzLDE1ICszODc0LDE1IEBACiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBfTUVNOgogCQlpZiAobmFtZSA9PSBSRVNfVVNBR0UpCi0JCQl2YWwgPSBtZW1fY2dyb3VwX3VzYWdlKG1lbSwgZmFsc2UpOworCQkJdmFsID0gbWVtX2Nncm91cF91c2FnZShtZW1jZywgZmFsc2UpOwogCQllbHNlCi0JCQl2YWwgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtLT5yZXMsIG5hbWUpOworCQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5yZXMsIG5hbWUpOwogCQlicmVhazsKIAljYXNlIF9NRU1TV0FQOgogCQlpZiAobmFtZSA9PSBSRVNfVVNBR0UpCi0JCQl2YWwgPSBtZW1fY2dyb3VwX3VzYWdlKG1lbSwgdHJ1ZSk7CisJCQl2YWwgPSBtZW1fY2dyb3VwX3VzYWdlKG1lbWNnLCB0cnVlKTsKIAkJZWxzZQotCQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbS0+bWVtc3csIG5hbWUpOworCQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5tZW1zdywgbmFtZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpAQCAtMzk1OSwyNCArMzk3MCwyNCBAQAogCiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfcmVzZXQoc3RydWN0IGNncm91cCAqY29udCwgdW5zaWduZWQgaW50IGV2ZW50KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwogCWludCB0eXBlLCBuYW1lOwogCi0JbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKIAl0eXBlID0gTUVNRklMRV9UWVBFKGV2ZW50KTsKIAluYW1lID0gTUVNRklMRV9BVFRSKGV2ZW50KTsKIAlzd2l0Y2ggKG5hbWUpIHsKIAljYXNlIFJFU19NQVhfVVNBR0U6CiAJCWlmICh0eXBlID09IF9NRU0pCi0JCQlyZXNfY291bnRlcl9yZXNldF9tYXgoJm1lbS0+cmVzKTsKKwkJCXJlc19jb3VudGVyX3Jlc2V0X21heCgmbWVtY2ctPnJlcyk7CiAJCWVsc2UKLQkJCXJlc19jb3VudGVyX3Jlc2V0X21heCgmbWVtLT5tZW1zdyk7CisJCQlyZXNfY291bnRlcl9yZXNldF9tYXgoJm1lbWNnLT5tZW1zdyk7CiAJCWJyZWFrOwogCWNhc2UgUkVTX0ZBSUxDTlQ6CiAJCWlmICh0eXBlID09IF9NRU0pCi0JCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZtZW0tPnJlcyk7CisJCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZtZW1jZy0+cmVzKTsKIAkJZWxzZQotCQkJcmVzX2NvdW50ZXJfcmVzZXRfZmFpbGNudCgmbWVtLT5tZW1zdyk7CisJCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZtZW1jZy0+bWVtc3cpOwogCQlicmVhazsKIAl9CiAKQEAgLTM5OTMsNyArNDAwNCw3IEBACiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfbW92ZV9jaGFyZ2Vfd3JpdGUoc3RydWN0IGNncm91cCAqY2dycCwKIAkJCQkJc3RydWN0IGNmdHlwZSAqY2Z0LCB1NjQgdmFsKQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JwKTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JwKTsKIAogCWlmICh2YWwgPj0gKDEgPDwgTlJfTU9WRV9UWVBFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MDAzLDcgKzQwMTQsNyBAQAogCSAqIGluY29uc2lzdGVudC4KIAkgKi8KIAljZ3JvdXBfbG9jaygpOwotCW1lbS0+bW92ZV9jaGFyZ2VfYXRfaW1taWdyYXRlID0gdmFsOworCW1lbWNnLT5tb3ZlX2NoYXJnZV9hdF9pbW1pZ3JhdGUgPSB2YWw7CiAJY2dyb3VwX3VubG9jaygpOwogCiAJcmV0dXJuIDA7CkBAIC00MDYwLDQ5ICs0MDcxLDQ5IEBACiAKIAogc3RhdGljIHZvaWQKLW1lbV9jZ3JvdXBfZ2V0X2xvY2FsX3N0YXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgc3RydWN0IG1jc190b3RhbF9zdGF0ICpzKQorbWVtX2Nncm91cF9nZXRfbG9jYWxfc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCBtY3NfdG90YWxfc3RhdCAqcykKIHsKIAlzNjQgdmFsOwogCiAJLyogcGVyIGNwdSBzdGF0ICovCi0JdmFsID0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUpOworCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUpOwogCXMtPnN0YXRbTUNTX0NBQ0hFXSArPSB2YWwgKiBQQUdFX1NJWkU7Ci0JdmFsID0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfUlNTKTsKKwl2YWwgPSBtZW1fY2dyb3VwX3JlYWRfc3RhdChtZW1jZywgTUVNX0NHUk9VUF9TVEFUX1JTUyk7CiAJcy0+c3RhdFtNQ1NfUlNTXSArPSB2YWwgKiBQQUdFX1NJWkU7Ci0JdmFsID0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfRklMRV9NQVBQRUQpOworCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfRklMRV9NQVBQRUQpOwogCXMtPnN0YXRbTUNTX0ZJTEVfTUFQUEVEXSArPSB2YWwgKiBQQUdFX1NJWkU7Ci0JdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW0sIE1FTV9DR1JPVVBfRVZFTlRTX1BHUEdJTik7CisJdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW1jZywgTUVNX0NHUk9VUF9FVkVOVFNfUEdQR0lOKTsKIAlzLT5zdGF0W01DU19QR1BHSU5dICs9IHZhbDsKLQl2YWwgPSBtZW1fY2dyb3VwX3JlYWRfZXZlbnRzKG1lbSwgTUVNX0NHUk9VUF9FVkVOVFNfUEdQR09VVCk7CisJdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW1jZywgTUVNX0NHUk9VUF9FVkVOVFNfUEdQR09VVCk7CiAJcy0+c3RhdFtNQ1NfUEdQR09VVF0gKz0gdmFsOwogCWlmIChkb19zd2FwX2FjY291bnQpIHsKLQkJdmFsID0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfU1dBUE9VVCk7CisJCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfU1dBUE9VVCk7CiAJCXMtPnN0YXRbTUNTX1NXQVBdICs9IHZhbCAqIFBBR0VfU0laRTsKIAl9Ci0JdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW0sIE1FTV9DR1JPVVBfRVZFTlRTX1BHRkFVTFQpOworCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9ldmVudHMobWVtY2csIE1FTV9DR1JPVVBfRVZFTlRTX1BHRkFVTFQpOwogCXMtPnN0YXRbTUNTX1BHRkFVTFRdICs9IHZhbDsKLQl2YWwgPSBtZW1fY2dyb3VwX3JlYWRfZXZlbnRzKG1lbSwgTUVNX0NHUk9VUF9FVkVOVFNfUEdNQUpGQVVMVCk7CisJdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW1jZywgTUVNX0NHUk9VUF9FVkVOVFNfUEdNQUpGQVVMVCk7CiAJcy0+c3RhdFtNQ1NfUEdNQUpGQVVMVF0gKz0gdmFsOwogCiAJLyogcGVyIHpvbmUgc3RhdCAqLwotCXZhbCA9IG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbSwgQklUKExSVV9JTkFDVElWRV9BTk9OKSk7CisJdmFsID0gbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIEJJVChMUlVfSU5BQ1RJVkVfQU5PTikpOwogCXMtPnN0YXRbTUNTX0lOQUNUSVZFX0FOT05dICs9IHZhbCAqIFBBR0VfU0laRTsKLQl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW0sIEJJVChMUlVfQUNUSVZFX0FOT04pKTsKKwl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW1jZywgQklUKExSVV9BQ1RJVkVfQU5PTikpOwogCXMtPnN0YXRbTUNTX0FDVElWRV9BTk9OXSArPSB2YWwgKiBQQUdFX1NJWkU7Ci0JdmFsID0gbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtLCBCSVQoTFJVX0lOQUNUSVZFX0ZJTEUpKTsKKwl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW1jZywgQklUKExSVV9JTkFDVElWRV9GSUxFKSk7CiAJcy0+c3RhdFtNQ1NfSU5BQ1RJVkVfRklMRV0gKz0gdmFsICogUEFHRV9TSVpFOwotCXZhbCA9IG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbSwgQklUKExSVV9BQ1RJVkVfRklMRSkpOworCXZhbCA9IG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBCSVQoTFJVX0FDVElWRV9GSUxFKSk7CiAJcy0+c3RhdFtNQ1NfQUNUSVZFX0ZJTEVdICs9IHZhbCAqIFBBR0VfU0laRTsKLQl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW0sIEJJVChMUlVfVU5FVklDVEFCTEUpKTsKKwl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW1jZywgQklUKExSVV9VTkVWSUNUQUJMRSkpOwogCXMtPnN0YXRbTUNTX1VORVZJQ1RBQkxFXSArPSB2YWwgKiBQQUdFX1NJWkU7CiB9CiAKIHN0YXRpYyB2b2lkCi1tZW1fY2dyb3VwX2dldF90b3RhbF9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIHN0cnVjdCBtY3NfdG90YWxfc3RhdCAqcykKK21lbV9jZ3JvdXBfZ2V0X3RvdGFsX3N0YXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBzdHJ1Y3QgbWNzX3RvdGFsX3N0YXQgKnMpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKml0ZXI7CiAKLQlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtKQorCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW1jZykKIAkJbWVtX2Nncm91cF9nZXRfbG9jYWxfc3RhdChpdGVyLCBzKTsKIH0KIApAQCAtNDE4OCw4ICs0MTk5LDYgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfREVCVUdfVk0KLQljYi0+ZmlsbChjYiwgImluYWN0aXZlX3JhdGlvIiwgY2FsY19pbmFjdGl2ZV9yYXRpbyhtZW1fY29udCwgTlVMTCkpOwotCiAJewogCQlpbnQgbmlkLCB6aWQ7CiAJCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKQEAgLTQzMjYsMjAgKzQzMzUsMjAgQEAKIAlyZXR1cm4gX2EtPnRocmVzaG9sZCAtIF9iLT50aHJlc2hvbGQ7CiB9CiAKLXN0YXRpYyBpbnQgbWVtX2Nncm91cF9vb21fbm90aWZ5X2NiKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfb29tX25vdGlmeV9jYihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXBfZXZlbnRmZF9saXN0ICpldjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZXYsICZtZW0tPm9vbV9ub3RpZnksIGxpc3QpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJm1lbWNnLT5vb21fbm90aWZ5LCBsaXN0KQogCQlldmVudGZkX3NpZ25hbChldi0+ZXZlbnRmZCwgMSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfb29tX25vdGlmeShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIHZvaWQgbWVtX2Nncm91cF9vb21fbm90aWZ5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqaXRlcjsKIAotCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW0pCisJZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlKGl0ZXIsIG1lbWNnKQogCQltZW1fY2dyb3VwX29vbV9ub3RpZnlfY2IoaXRlcik7CiB9CiAKQEAgLTQ1MjksNyArNDUzOCw3IEBACiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX29vbV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBjZ3JvdXAgKmNncnAsCiAJc3RydWN0IGNmdHlwZSAqY2Z0LCBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOwogCXN0cnVjdCBtZW1fY2dyb3VwX2V2ZW50ZmRfbGlzdCAqZXYsICp0bXA7CiAJaW50IHR5cGUgPSBNRU1GSUxFX1RZUEUoY2Z0LT5wcml2YXRlKTsKIApAQCAtNDUzNyw3ICs0NTQ2LDcgQEAKIAogCXNwaW5fbG9jaygmbWVtY2dfb29tX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2LCB0bXAsICZtZW0tPm9vbV9ub3RpZnksIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXYsIHRtcCwgJm1lbWNnLT5vb21fbm90aWZ5LCBsaXN0KSB7CiAJCWlmIChldi0+ZXZlbnRmZCA9PSBldmVudGZkKSB7CiAJCQlsaXN0X2RlbCgmZXYtPmxpc3QpOwogCQkJa2ZyZWUoZXYpOwpAQCAtNDU1MCwxMSArNDU1OSwxMSBAQAogc3RhdGljIGludCBtZW1fY2dyb3VwX29vbV9jb250cm9sX3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwKIAlzdHJ1Y3QgY2Z0eXBlICpjZnQsICBzdHJ1Y3QgY2dyb3VwX21hcF9jYiAqY2IpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOwogCi0JY2ItPmZpbGwoY2IsICJvb21fa2lsbF9kaXNhYmxlIiwgbWVtLT5vb21fa2lsbF9kaXNhYmxlKTsKKwljYi0+ZmlsbChjYiwgIm9vbV9raWxsX2Rpc2FibGUiLCBtZW1jZy0+b29tX2tpbGxfZGlzYWJsZSk7CiAKLQlpZiAoYXRvbWljX3JlYWQoJm1lbS0+dW5kZXJfb29tKSkKKwlpZiAoYXRvbWljX3JlYWQoJm1lbWNnLT51bmRlcl9vb20pKQogCQljYi0+ZmlsbChjYiwgInVuZGVyX29vbSIsIDEpOwogCWVsc2UKIAkJY2ItPmZpbGwoY2IsICJ1bmRlcl9vb20iLCAwKTsKQEAgLTQ1NjQsNyArNDU3Myw3IEBACiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfb29tX2NvbnRyb2xfd3JpdGUoc3RydWN0IGNncm91cCAqY2dycCwKIAlzdHJ1Y3QgY2Z0eXBlICpjZnQsIHU2NCB2YWwpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOwogCXN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnQ7CiAKIAkvKiBjYW5ub3Qgc2V0IHRvIHJvb3QgY2dyb3VwIGFuZCBvbmx5IDAgYW5kIDEgYXJlIGFsbG93ZWQgKi8KQEAgLTQ1NzYsMTMgKzQ1ODUsMTMgQEAKIAljZ3JvdXBfbG9jaygpOwogCS8qIG9vbS1raWxsLWRpc2FibGUgaXMgYSBmbGFnIGZvciBzdWJoaWVyYXJjaHkuICovCiAJaWYgKChwYXJlbnQtPnVzZV9oaWVyYXJjaHkpIHx8Ci0JICAgIChtZW0tPnVzZV9oaWVyYXJjaHkgJiYgIWxpc3RfZW1wdHkoJmNncnAtPmNoaWxkcmVuKSkpIHsKKwkgICAgKG1lbWNnLT51c2VfaGllcmFyY2h5ICYmICFsaXN0X2VtcHR5KCZjZ3JwLT5jaGlsZHJlbikpKSB7CiAJCWNncm91cF91bmxvY2soKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCW1lbS0+b29tX2tpbGxfZGlzYWJsZSA9IHZhbDsKKwltZW1jZy0+b29tX2tpbGxfZGlzYWJsZSA9IHZhbDsKIAlpZiAoIXZhbCkKLQkJbWVtY2dfb29tX3JlY292ZXIobWVtKTsKKwkJbWVtY2dfb29tX3JlY292ZXIobWVtY2cpOwogCWNncm91cF91bmxvY2soKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ3MTgsNyArNDcyNyw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBhbGxvY19tZW1fY2dyb3VwX3Blcl96b25lX2luZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IG5vZGUpCitzdGF0aWMgaW50IGFsbG9jX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBub2RlKQogewogCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl9ub2RlICpwbjsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CkBAIC00NzM4LDIxICs0NzQ3LDIxIEBACiAJaWYgKCFwbikKIAkJcmV0dXJuIDE7CiAKLQltZW0tPmluZm8ubm9kZWluZm9bbm9kZV0gPSBwbjsKIAlmb3IgKHpvbmUgPSAwOyB6b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspIHsKIAkJbXogPSAmcG4tPnpvbmVpbmZvW3pvbmVdOwogCQlmb3JfZWFjaF9scnUobCkKIAkJCUlOSVRfTElTVF9IRUFEKCZtei0+bGlzdHNbbF0pOwogCQltei0+dXNhZ2VfaW5fZXhjZXNzID0gMDsKIAkJbXotPm9uX3RyZWUgPSBmYWxzZTsKLQkJbXotPm1lbSA9IG1lbTsKKwkJbXotPm1lbSA9IG1lbWNnOwogCX0KKwltZW1jZy0+aW5mby5ub2RlaW5mb1tub2RlXSA9IHBuOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgbm9kZSkKK3N0YXRpYyB2b2lkIGZyZWVfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IG5vZGUpCiB7Ci0Ja2ZyZWUobWVtLT5pbmZvLm5vZGVpbmZvW25vZGVdKTsKKwlrZnJlZShtZW1jZy0+aW5mby5ub2RlaW5mb1tub2RlXSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9hbGxvYyh2b2lkKQpAQCAtNDc5NCw1MSArNDgwMyw1MSBAQAogICogUmVtb3ZhbCBvZiBjZ3JvdXAgaXRzZWxmIHN1Y2NlZWRzIHJlZ2FyZGxlc3Mgb2YgcmVmcyBmcm9tIHN3YXAuCiAgKi8KIAotc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX2ZyZWUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9mcmVlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlpbnQgbm9kZTsKIAotCW1lbV9jZ3JvdXBfcmVtb3ZlX2Zyb21fdHJlZXMobWVtKTsKLQlmcmVlX2Nzc19pZCgmbWVtX2Nncm91cF9zdWJzeXMsICZtZW0tPmNzcyk7CisJbWVtX2Nncm91cF9yZW1vdmVfZnJvbV90cmVlcyhtZW1jZyk7CisJZnJlZV9jc3NfaWQoJm1lbV9jZ3JvdXBfc3Vic3lzLCAmbWVtY2ctPmNzcyk7CiAKIAlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fUE9TU0lCTEUpCi0JCWZyZWVfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbSwgbm9kZSk7CisJCWZyZWVfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbWNnLCBub2RlKTsKIAotCWZyZWVfcGVyY3B1KG1lbS0+c3RhdCk7CisJZnJlZV9wZXJjcHUobWVtY2ctPnN0YXQpOwogCWlmIChzaXplb2Yoc3RydWN0IG1lbV9jZ3JvdXApIDwgUEFHRV9TSVpFKQotCQlrZnJlZShtZW0pOworCQlrZnJlZShtZW1jZyk7CiAJZWxzZQotCQl2ZnJlZShtZW0pOworCQl2ZnJlZShtZW1jZyk7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZ2V0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2dldChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7Ci0JYXRvbWljX2luYygmbWVtLT5yZWZjbnQpOworCWF0b21pY19pbmMoJm1lbWNnLT5yZWZjbnQpOwogfQogCi1zdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9wdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgY291bnQpCiB7Ci0JaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoY291bnQsICZtZW0tPnJlZmNudCkpIHsKLQkJc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudCA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbSk7Ci0JCV9fbWVtX2Nncm91cF9mcmVlKG1lbSk7CisJaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoY291bnQsICZtZW1jZy0+cmVmY250KSkgeworCQlzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50ID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpOworCQlfX21lbV9jZ3JvdXBfZnJlZShtZW1jZyk7CiAJCWlmIChwYXJlbnQpCiAJCQltZW1fY2dyb3VwX3B1dChwYXJlbnQpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9wdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKLQlfX21lbV9jZ3JvdXBfcHV0KG1lbSwgMSk7CisJX19tZW1fY2dyb3VwX3B1dChtZW1jZywgMSk7CiB9CiAKIC8qCiAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgbWVtX2Nncm91cCBpbiBtZW1jZ3JvdXAgaGllcmFyY2h5IHdpdGggaGllcmFyY2h5IGVuYWJsZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50X21lbV9jZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50X21lbV9jZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewotCWlmICghbWVtLT5yZXMucGFyZW50KQorCWlmICghbWVtY2ctPnJlcy5wYXJlbnQpCiAJCXJldHVybiBOVUxMOwotCXJldHVybiBtZW1fY2dyb3VwX2Zyb21fcmVzX2NvdW50ZXIobWVtLT5yZXMucGFyZW50LCByZXMpOworCXJldHVybiBtZW1fY2dyb3VwX2Zyb21fcmVzX2NvdW50ZXIobWVtY2ctPnJlcy5wYXJlbnQsIHJlcyk7CiB9CiAKICNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCkBAIC00ODgxLDE2ICs0ODkwLDE2IEBACiBzdGF0aWMgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKiBfX3JlZgogbWVtX2Nncm91cF9jcmVhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjb250KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0sICpwYXJlbnQ7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqcGFyZW50OwogCWxvbmcgZXJyb3IgPSAtRU5PTUVNOwogCWludCBub2RlOwogCi0JbWVtID0gbWVtX2Nncm91cF9hbGxvYygpOwotCWlmICghbWVtKQorCW1lbWNnID0gbWVtX2Nncm91cF9hbGxvYygpOworCWlmICghbWVtY2cpCiAJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIAogCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkKLQkJaWYgKGFsbG9jX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpKQorCQlpZiAoYWxsb2NfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbWNnLCBub2RlKSkKIAkJCWdvdG8gZnJlZV9vdXQ7CiAKIAkvKiByb290ID8gKi8KQEAgLTQ4OTgsNyArNDkwNyw3IEBACiAJCWludCBjcHU7CiAJCWVuYWJsZV9zd2FwX2Nncm91cCgpOwogCQlwYXJlbnQgPSBOVUxMOwotCQlyb290X21lbV9jZ3JvdXAgPSBtZW07CisJCXJvb3RfbWVtX2Nncm91cCA9IG1lbWNnOwogCQlpZiAobWVtX2Nncm91cF9zb2Z0X2xpbWl0X3RyZWVfaW5pdCgpKQogCQkJZ290byBmcmVlX291dDsKIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewpAQCAtNDkwOSwxMyArNDkxOCwxMyBAQAogCQlob3RjcHVfbm90aWZpZXIobWVtY2dfY3B1X2hvdHBsdWdfY2FsbGJhY2ssIDApOwogCX0gZWxzZSB7CiAJCXBhcmVudCA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQtPnBhcmVudCk7Ci0JCW1lbS0+dXNlX2hpZXJhcmNoeSA9IHBhcmVudC0+dXNlX2hpZXJhcmNoeTsKLQkJbWVtLT5vb21fa2lsbF9kaXNhYmxlID0gcGFyZW50LT5vb21fa2lsbF9kaXNhYmxlOworCQltZW1jZy0+dXNlX2hpZXJhcmNoeSA9IHBhcmVudC0+dXNlX2hpZXJhcmNoeTsKKwkJbWVtY2ctPm9vbV9raWxsX2Rpc2FibGUgPSBwYXJlbnQtPm9vbV9raWxsX2Rpc2FibGU7CiAJfQogCiAJaWYgKHBhcmVudCAmJiBwYXJlbnQtPnVzZV9oaWVyYXJjaHkpIHsKLQkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtLT5yZXMsICZwYXJlbnQtPnJlcyk7Ci0JCXJlc19jb3VudGVyX2luaXQoJm1lbS0+bWVtc3csICZwYXJlbnQtPm1lbXN3KTsKKwkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtY2ctPnJlcywgJnBhcmVudC0+cmVzKTsKKwkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtY2ctPm1lbXN3LCAmcGFyZW50LT5tZW1zdyk7CiAJCS8qCiAJCSAqIFdlIGluY3JlbWVudCByZWZjbnQgb2YgdGhlIHBhcmVudCB0byBlbnN1cmUgdGhhdCB3ZSBjYW4KIAkJICogc2FmZWx5IGFjY2VzcyBpdCBvbiByZXNfY291bnRlcl9jaGFyZ2UvdW5jaGFyZ2UuCkBAIC00OTI0LDIxICs0OTMzLDIxIEBACiAJCSAqLwogCQltZW1fY2dyb3VwX2dldChwYXJlbnQpOwogCX0gZWxzZSB7Ci0JCXJlc19jb3VudGVyX2luaXQoJm1lbS0+cmVzLCBOVUxMKTsKLQkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtLT5tZW1zdywgTlVMTCk7CisJCXJlc19jb3VudGVyX2luaXQoJm1lbWNnLT5yZXMsIE5VTEwpOworCQlyZXNfY291bnRlcl9pbml0KCZtZW1jZy0+bWVtc3csIE5VTEwpOwogCX0KLQltZW0tPmxhc3Rfc2Nhbm5lZF9jaGlsZCA9IDA7Ci0JbWVtLT5sYXN0X3NjYW5uZWRfbm9kZSA9IE1BWF9OVU1OT0RFUzsKLQlJTklUX0xJU1RfSEVBRCgmbWVtLT5vb21fbm90aWZ5KTsKKwltZW1jZy0+bGFzdF9zY2FubmVkX2NoaWxkID0gMDsKKwltZW1jZy0+bGFzdF9zY2FubmVkX25vZGUgPSBNQVhfTlVNTk9ERVM7CisJSU5JVF9MSVNUX0hFQUQoJm1lbWNnLT5vb21fbm90aWZ5KTsKIAogCWlmIChwYXJlbnQpCi0JCW1lbS0+c3dhcHBpbmVzcyA9IG1lbV9jZ3JvdXBfc3dhcHBpbmVzcyhwYXJlbnQpOwotCWF0b21pY19zZXQoJm1lbS0+cmVmY250LCAxKTsKLQltZW0tPm1vdmVfY2hhcmdlX2F0X2ltbWlncmF0ZSA9IDA7Ci0JbXV0ZXhfaW5pdCgmbWVtLT50aHJlc2hvbGRzX2xvY2spOwotCXJldHVybiAmbWVtLT5jc3M7CisJCW1lbWNnLT5zd2FwcGluZXNzID0gbWVtX2Nncm91cF9zd2FwcGluZXNzKHBhcmVudCk7CisJYXRvbWljX3NldCgmbWVtY2ctPnJlZmNudCwgMSk7CisJbWVtY2ctPm1vdmVfY2hhcmdlX2F0X2ltbWlncmF0ZSA9IDA7CisJbXV0ZXhfaW5pdCgmbWVtY2ctPnRocmVzaG9sZHNfbG9jayk7CisJcmV0dXJuICZtZW1jZy0+Y3NzOwogZnJlZV9vdXQ6Ci0JX19tZW1fY2dyb3VwX2ZyZWUobWVtKTsKKwlfX21lbV9jZ3JvdXBfZnJlZShtZW1jZyk7CiAJcm9vdF9tZW1fY2dyb3VwID0gTlVMTDsKIAlyZXR1cm4gRVJSX1BUUihlcnJvcik7CiB9CkBAIC00OTQ2LDE3ICs0OTU1LDE3IEBACiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfcHJlX2Rlc3Ryb3koc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAogCQkJCQlzdHJ1Y3QgY2dyb3VwICpjb250KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKIAotCXJldHVybiBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KG1lbSwgZmFsc2UpOworCXJldHVybiBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KG1lbWNnLCBmYWxzZSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZGVzdHJveShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCiAJCQkJc3RydWN0IGNncm91cCAqY29udCkKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CiAKLQltZW1fY2dyb3VwX3B1dChtZW0pOworCW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKIH0KIAogc3RhdGljIGludCBtZW1fY2dyb3VwX3BvcHVsYXRlKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKQEAgLTQ5NzksOSArNDk4OCw5IEBACiB7CiAJaW50IHJldCA9IDA7CiAJaW50IGJhdGNoX2NvdW50ID0gUFJFQ0hBUkdFX0NPVU5UX0FUX09OQ0U7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1jLnRvOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1jLnRvOwogCi0JaWYgKG1lbV9jZ3JvdXBfaXNfcm9vdChtZW0pKSB7CisJaWYgKG1lbV9jZ3JvdXBfaXNfcm9vdChtZW1jZykpIHsKIAkJbWMucHJlY2hhcmdlICs9IGNvdW50OwogCQkvKiB3ZSBkb24ndCBuZWVkIGNzc19nZXQgZm9yIHJvb3QgKi8KIAkJcmV0dXJuIHJldDsKQEAgLTQ5OTAsMTYgKzQ5OTksMTYgQEAKIAlpZiAoY291bnQgPiAxKSB7CiAJCXN0cnVjdCByZXNfY291bnRlciAqZHVtbXk7CiAJCS8qCi0JCSAqICJtZW0iIGNhbm5vdCBiZSB1bmRlciBybWRpcigpIGJlY2F1c2Ugd2UndmUgYWxyZWFkeSBjaGVja2VkCisJCSAqICJtZW1jZyIgY2Fubm90IGJlIHVuZGVyIHJtZGlyKCkgYmVjYXVzZSB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQKIAkJICogYnkgY2dyb3VwX2xvY2tfbGl2ZV9jZ3JvdXAoKSB0aGF0IGl0IGlzIG5vdCByZW1vdmVkIGFuZCB3ZQogCQkgKiBhcmUgc3RpbGwgdW5kZXIgdGhlIHNhbWUgY2dyb3VwX211dGV4LiBTbyB3ZSBjYW4gcG9zdHBvbmUKIAkJICogY3NzX2dldCgpLgogCQkgKi8KLQkJaWYgKHJlc19jb3VudGVyX2NoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSAqIGNvdW50LCAmZHVtbXkpKQorCQlpZiAocmVzX2NvdW50ZXJfY2hhcmdlKCZtZW1jZy0+cmVzLCBQQUdFX1NJWkUgKiBjb3VudCwgJmR1bW15KSkKIAkJCWdvdG8gb25lX2J5X29uZTsKLQkJaWYgKGRvX3N3YXBfYWNjb3VudCAmJiByZXNfY291bnRlcl9jaGFyZ2UoJm1lbS0+bWVtc3csCisJCWlmIChkb19zd2FwX2FjY291bnQgJiYgcmVzX2NvdW50ZXJfY2hhcmdlKCZtZW1jZy0+bWVtc3csCiAJCQkJCQlQQUdFX1NJWkUgKiBjb3VudCwgJmR1bW15KSkgewotCQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPnJlcywgUEFHRV9TSVpFICogY291bnQpOwogCQkJZ290byBvbmVfYnlfb25lOwogCQl9CiAJCW1jLnByZWNoYXJnZSArPSBjb3VudDsKQEAgLTUwMTYsOCArNTAyNSw5IEBACiAJCQliYXRjaF9jb3VudCA9IFBSRUNIQVJHRV9DT1VOVF9BVF9PTkNFOwogCQkJY29uZF9yZXNjaGVkKCk7CiAJCX0KLQkJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgR0ZQX0tFUk5FTCwgMSwgJm1lbSwgZmFsc2UpOwotCQlpZiAocmV0IHx8ICFtZW0pCisJCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsCisJCQkJCUdGUF9LRVJORUwsIDEsICZtZW1jZywgZmFsc2UpOworCQlpZiAocmV0IHx8ICFtZW1jZykKIAkJCS8qIG1lbV9jZ3JvdXBfY2xlYXJfbWMoKSB3aWxsIGRvIHVuY2hhcmdlIGxhdGVyICovCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJbWMucHJlY2hhcmdlKys7CkBAIC01MjkxLDEzICs1MzAxLDEzIEBACiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JvdXApOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncm91cCk7CiAKLQlpZiAobWVtLT5tb3ZlX2NoYXJnZV9hdF9pbW1pZ3JhdGUpIHsKKwlpZiAobWVtY2ctPm1vdmVfY2hhcmdlX2F0X2ltbWlncmF0ZSkgewogCQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAkJc3RydWN0IG1lbV9jZ3JvdXAgKmZyb20gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhwKTsKIAotCQlWTV9CVUdfT04oZnJvbSA9PSBtZW0pOworCQlWTV9CVUdfT04oZnJvbSA9PSBtZW1jZyk7CiAKIAkJbW0gPSBnZXRfdGFza19tbShwKTsKIAkJaWYgKCFtbSkKQEAgLTUzMTIsNyArNTMyMiw3IEBACiAJCQltZW1fY2dyb3VwX3N0YXJ0X21vdmUoZnJvbSk7CiAJCQlzcGluX2xvY2soJm1jLmxvY2spOwogCQkJbWMuZnJvbSA9IGZyb207Ci0JCQltYy50byA9IG1lbTsKKwkJCW1jLnRvID0gbWVtY2c7CiAJCQlzcGluX3VubG9jaygmbWMubG9jayk7CiAJCQkvKiBXZSBzZXQgbWMubW92aW5nX3Rhc2sgbGF0ZXIgKi8KIApkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LWZhaWx1cmUuYyBiL21tL21lbW9yeS1mYWlsdXJlLmMKaW5kZXggMmI0M2JhMC4uMDZkMzQ3OSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LWZhaWx1cmUuYworKysgYi9tbS9tZW1vcnktZmFpbHVyZS5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rc20uaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgpAQCAtMTMxMCw3ICsxMzExLDcgQEAKIAkJICogdG8gdGhlIGVuZC4KIAkJICovCiAJCWlmIChQYWdlSHVnZShwYWdlKSkgewotCQkJcHJfZGVidWcoIk1DRTogTWVtb3J5IGZhaWx1cmUgaXMgbm93IHJ1bm5pbmcgb24gZnJlZSBodWdlcGFnZSAlI2x4XG4iLCBwZm4pOworCQkJcHJfaW5mbygiTUNFOiBNZW1vcnkgZmFpbHVyZSBpcyBub3cgcnVubmluZyBvbiBmcmVlIGh1Z2VwYWdlICUjbHhcbiIsIHBmbik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAoVGVzdENsZWFyUGFnZUhXUG9pc29uKHApKQpAQCAtMTQxOSw3ICsxNDIwLDcgQEAKIAogCWlmIChQYWdlSFdQb2lzb24oaHBhZ2UpKSB7CiAJCXB1dF9wYWdlKGhwYWdlKTsKLQkJcHJfZGVidWcoInNvZnQgb2ZmbGluZTogJSNseCBodWdlcGFnZSBhbHJlYWR5IHBvaXNvbmVkXG4iLCBwZm4pOworCQlwcl9pbmZvKCJzb2Z0IG9mZmxpbmU6ICUjbHggaHVnZXBhZ2UgYWxyZWFkeSBwb2lzb25lZFxuIiwgcGZuKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTE0MzMsOCArMTQzNCw4IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlMSwgcGFnZTIsICZwYWdlbGlzdCwgbHJ1KQogCQkJcHV0X3BhZ2UocGFnZTEpOwogCi0JCXByX2RlYnVnKCJzb2Z0IG9mZmxpbmU6ICUjbHg6IG1pZ3JhdGlvbiBmYWlsZWQgJWQsIHR5cGUgJWx4XG4iLAotCQkJIHBmbiwgcmV0LCBwYWdlLT5mbGFncyk7CisJCXByX2luZm8oInNvZnQgb2ZmbGluZTogJSNseDogbWlncmF0aW9uIGZhaWxlZCAlZCwgdHlwZSAlbHhcbiIsCisJCQlwZm4sIHJldCwgcGFnZS0+ZmxhZ3MpOwogCQlpZiAocmV0ID4gMCkKIAkJCXJldCA9IC1FSU87CiAJCXJldHVybiByZXQ7CkBAIC0xNTA1LDcgKzE1MDYsNyBAQAogCX0KIAlpZiAoIVBhZ2VMUlUocGFnZSkpIHsKIAkJcHJfaW5mbygic29mdF9vZmZsaW5lOiAlI2x4OiB1bmtub3duIG5vbiBMUlUgcGFnZSB0eXBlICVseFxuIiwKLQkJCQlwZm4sIHBhZ2UtPmZsYWdzKTsKKwkJCXBmbiwgcGFnZS0+ZmxhZ3MpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE1NjYsNyArMTU2Nyw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlwcl9pbmZvKCJzb2Z0IG9mZmxpbmU6ICUjbHg6IGlzb2xhdGlvbiBmYWlsZWQ6ICVkLCBwYWdlIGNvdW50ICVkLCB0eXBlICVseFxuIiwKLQkJCQlwZm4sIHJldCwgcGFnZV9jb3VudChwYWdlKSwgcGFnZS0+ZmxhZ3MpOworCQkJcGZuLCByZXQsIHBhZ2VfY291bnQocGFnZSksIHBhZ2UtPmZsYWdzKTsKIAl9CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggYTU2ZTNiYS4uODI5ZDQzNyAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgva3NtLmg+CiAjaW5jbHVkZSA8bGludXgvcm1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5YWNjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KQEAgLTE1MDMsNyArMTUwMyw3IEBACiAJfQogCiAJaWYgKGZsYWdzICYgRk9MTF9HRVQpCi0JCWdldF9wYWdlKHBhZ2UpOworCQlnZXRfcGFnZV9mb2xsKHBhZ2UpOwogCWlmIChmbGFncyAmIEZPTExfVE9VQ0gpIHsKIAkJaWYgKChmbGFncyAmIEZPTExfV1JJVEUpICYmCiAJCSAgICAhcHRlX2RpcnR5KHB0ZSkgJiYgIVBhZ2VEaXJ0eShwYWdlKSkKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDZlN2Q4YjIuLjIxNjg0ODkgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCA5YzUxZjlmLi5hZGMzOTU0IDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYworKysgYi9tbS9tZW1wb2xpY3kuYwpAQCAtNzUsNyArNzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTExLDcgKzExMSw3IEBACiAvKgogICogcnVuLXRpbWUgc3lzdGVtLXdpZGUgZGVmYXVsdCBwb2xpY3kgPT4gbG9jYWwgYWxsb2NhdGlvbgogICovCi1zdHJ1Y3QgbWVtcG9saWN5IGRlZmF1bHRfcG9saWN5ID0geworc3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgZGVmYXVsdF9wb2xpY3kgPSB7CiAJLnJlZmNudCA9IEFUT01JQ19JTklUKDEpLCAvKiBuZXZlciBmcmVlIGl0ICovCiAJLm1vZGUgPSBNUE9MX1BSRUZFUlJFRCwKIAkuZmxhZ3MgPSBNUE9MX0ZfTE9DQUwsCmRpZmYgLS1naXQgYS9tbS9tZW1wb29sLmMgYi9tbS9tZW1wb29sLmMKaW5kZXggMWEzYmMzZC4uZTczNjQxYiAxMDA2NDQKLS0tIGEvbW0vbWVtcG9vbC5jCisrKyBiL21tL21lbXBvb2wuYwpAQCAtMTAsNyArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgpkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IDE0ZDBhNmEuLjU3OGUyOTEgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYworKysgYi9tbS9taWdyYXRlLmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgpAQCAtNjIxLDM4ICs2MjEsMTggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLS8qCi0gKiBPYnRhaW4gdGhlIGxvY2sgb24gcGFnZSwgcmVtb3ZlIGFsbCBwdGVzIGFuZCBtaWdyYXRlIHRoZSBwYWdlCi0gKiB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHBhZ2UgaW4gbmV3cGFnZS4KLSAqLwotc3RhdGljIGludCB1bm1hcF9hbmRfbW92ZShuZXdfcGFnZV90IGdldF9uZXdfcGFnZSwgdW5zaWduZWQgbG9uZyBwcml2YXRlLAotCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBmb3JjZSwgYm9vbCBvZmZsaW5pbmcsIGJvb2wgc3luYykKK3N0YXRpYyBpbnQgX191bm1hcF9hbmRfbW92ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHBhZ2UgKm5ld3BhZ2UsCisJCQkJaW50IGZvcmNlLCBib29sIG9mZmxpbmluZywgYm9vbCBzeW5jKQogewotCWludCByYyA9IDA7Ci0JaW50ICpyZXN1bHQgPSBOVUxMOwotCXN0cnVjdCBwYWdlICpuZXdwYWdlID0gZ2V0X25ld19wYWdlKHBhZ2UsIHByaXZhdGUsICZyZXN1bHQpOworCWludCByYyA9IC1FQUdBSU47CiAJaW50IHJlbWFwX3N3YXBjYWNoZSA9IDE7CiAJaW50IGNoYXJnZSA9IDA7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKIAlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDsKIAotCWlmICghbmV3cGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAocGFnZV9jb3VudChwYWdlKSA9PSAxKSB7Ci0JCS8qIHBhZ2Ugd2FzIGZyZWVkIGZyb20gdW5kZXIgdXMuIFNvIHdlIGFyZSBkb25lLiAqLwotCQlnb3RvIG1vdmVfbmV3cGFnZTsKLQl9Ci0JaWYgKHVubGlrZWx5KFBhZ2VUcmFuc0h1Z2UocGFnZSkpKQotCQlpZiAodW5saWtlbHkoc3BsaXRfaHVnZV9wYWdlKHBhZ2UpKSkKLQkJCWdvdG8gbW92ZV9uZXdwYWdlOwotCi0JLyogcHJlcGFyZSBjZ3JvdXAganVzdCByZXR1cm5zIDAgb3IgLUVOT01FTSAqLwotCXJjID0gLUVBR0FJTjsKLQogCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CiAJCWlmICghZm9yY2UgfHwgIXN5bmMpCi0JCQlnb3RvIG1vdmVfbmV3cGFnZTsKKwkJCWdvdG8gb3V0OwogCiAJCS8qCiAJCSAqIEl0J3Mgbm90IHNhZmUgZm9yIGRpcmVjdCBjb21wYWN0aW9uIHRvIGNhbGwgbG9ja19wYWdlLgpAQCAtNjY4LDcgKzY0OCw3IEBACiAJCSAqIGFsdG9nZXRoZXIuCiAJCSAqLwogCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKLQkJCWdvdG8gbW92ZV9uZXdwYWdlOworCQkJZ290byBvdXQ7CiAKIAkJbG9ja19wYWdlKHBhZ2UpOwogCX0KQEAgLTc4NSwyNyArNzY1LDUyIEBACiAJCW1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihtZW0sIHBhZ2UsIG5ld3BhZ2UsIHJjID09IDApOwogdW5sb2NrOgogCXVubG9ja19wYWdlKHBhZ2UpOworb3V0OgorCXJldHVybiByYzsKK30KIAotbW92ZV9uZXdwYWdlOgorLyoKKyAqIE9idGFpbiB0aGUgbG9jayBvbiBwYWdlLCByZW1vdmUgYWxsIHB0ZXMgYW5kIG1pZ3JhdGUgdGhlIHBhZ2UKKyAqIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgcGFnZSBpbiBuZXdwYWdlLgorICovCitzdGF0aWMgaW50IHVubWFwX2FuZF9tb3ZlKG5ld19wYWdlX3QgZ2V0X25ld19wYWdlLCB1bnNpZ25lZCBsb25nIHByaXZhdGUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGZvcmNlLCBib29sIG9mZmxpbmluZywgYm9vbCBzeW5jKQoreworCWludCByYyA9IDA7CisJaW50ICpyZXN1bHQgPSBOVUxMOworCXN0cnVjdCBwYWdlICpuZXdwYWdlID0gZ2V0X25ld19wYWdlKHBhZ2UsIHByaXZhdGUsICZyZXN1bHQpOworCisJaWYgKCFuZXdwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChwYWdlX2NvdW50KHBhZ2UpID09IDEpIHsKKwkJLyogcGFnZSB3YXMgZnJlZWQgZnJvbSB1bmRlciB1cy4gU28gd2UgYXJlIGRvbmUuICovCisJCWdvdG8gb3V0OworCX0KKworCWlmICh1bmxpa2VseShQYWdlVHJhbnNIdWdlKHBhZ2UpKSkKKwkJaWYgKHVubGlrZWx5KHNwbGl0X2h1Z2VfcGFnZShwYWdlKSkpCisJCQlnb3RvIG91dDsKKworCXJjID0gX191bm1hcF9hbmRfbW92ZShwYWdlLCBuZXdwYWdlLCBmb3JjZSwgb2ZmbGluaW5nLCBzeW5jKTsKK291dDoKIAlpZiAocmMgIT0gLUVBR0FJTikgewotIAkJLyoKLSAJCSAqIEEgcGFnZSB0aGF0IGhhcyBiZWVuIG1pZ3JhdGVkIGhhcyBhbGwgcmVmZXJlbmNlcwotIAkJICogcmVtb3ZlZCBhbmQgd2lsbCBiZSBmcmVlZC4gQSBwYWdlIHRoYXQgaGFzIG5vdCBiZWVuCi0gCQkgKiBtaWdyYXRlZCB3aWxsIGhhdmUga2VwdHMgaXRzIHJlZmVyZW5jZXMgYW5kIGJlCi0gCQkgKiByZXN0b3JlZC4KLSAJCSAqLwotIAkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCS8qCisJCSAqIEEgcGFnZSB0aGF0IGhhcyBiZWVuIG1pZ3JhdGVkIGhhcyBhbGwgcmVmZXJlbmNlcworCQkgKiByZW1vdmVkIGFuZCB3aWxsIGJlIGZyZWVkLiBBIHBhZ2UgdGhhdCBoYXMgbm90IGJlZW4KKwkJICogbWlncmF0ZWQgd2lsbCBoYXZlIGtlcHRzIGl0cyByZWZlcmVuY2VzIGFuZCBiZQorCQkgKiByZXN0b3JlZC4KKwkJICovCisJCWxpc3RfZGVsKCZwYWdlLT5scnUpOwogCQlkZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0lTT0xBVEVEX0FOT04gKwogCQkJCXBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKSk7CiAJCXB1dGJhY2tfbHJ1X3BhZ2UocGFnZSk7CiAJfQotCiAJLyoKIAkgKiBNb3ZlIHRoZSBuZXcgcGFnZSB0byB0aGUgTFJVLiBJZiBtaWdyYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsCiAJICogdGhlbiB0aGlzIHdpbGwgZnJlZSB0aGUgcGFnZS4KIAkgKi8KIAlwdXRiYWNrX2xydV9wYWdlKG5ld3BhZ2UpOwotCiAJaWYgKHJlc3VsdCkgewogCQlpZiAocmMpCiAJCQkqcmVzdWx0ID0gcmM7CmRpZmYgLS1naXQgYS9tbS9tbG9jay5jIGIvbW0vbWxvY2suYwppbmRleCAwNDgyNjBjLi40ZjRmNTNiIDEwMDY0NAotLS0gYS9tbS9tbG9jay5jCisrKyBiL21tL21sb2NrLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcm1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KQEAgLTExMCw3ICsxMTAsMTUgQEAKIAlpZiAoVGVzdENsZWFyUGFnZU1sb2NrZWQocGFnZSkpIHsKIAkJZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9NTE9DSyk7CiAJCWlmICghaXNvbGF0ZV9scnVfcGFnZShwYWdlKSkgewotCQkJaW50IHJldCA9IHRyeV90b19tdW5sb2NrKHBhZ2UpOworCQkJaW50IHJldCA9IFNXQVBfQUdBSU47CisKKwkJCS8qCisJCQkgKiBPcHRpbWl6YXRpb246IGlmIHRoZSBwYWdlIHdhcyBtYXBwZWQganVzdCBvbmNlLAorCQkJICogdGhhdCdzIG91ciBtYXBwaW5nIGFuZCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGFsbCB0aGUKKwkJCSAqIG90aGVyIHZtYXMuCisJCQkgKi8KKwkJCWlmIChwYWdlX21hcGNvdW50KHBhZ2UpID4gMSkKKwkJCQlyZXQgPSB0cnlfdG9fbXVubG9jayhwYWdlKTsKIAkJCS8qCiAJCQkgKiBkaWQgdHJ5X3RvX3VubG9jaygpIHN1Y2NlZWQgb3IgcHVudD8KIAkJCSAqLwpAQCAtNTQ5LDcgKzU1Nyw4IEBACiAJaWYgKCFjYW5fZG9fbWxvY2soKSkKIAkJZ290byBvdXQ7CiAKLQlscnVfYWRkX2RyYWluX2FsbCgpOwkvKiBmbHVzaCBwYWdldmVjICovCisJaWYgKGZsYWdzICYgTUNMX0NVUlJFTlQpCisJCWxydV9hZGRfZHJhaW5fYWxsKCk7CS8qIGZsdXNoIHBhZ2V2ZWMgKi8KIAogCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuYwppbmRleCA0ZTBlMjY1Li4xZmZkOTdhIDEwMDY0NAotLS0gYS9tbS9tbV9pbml0LmMKKysrIGIvbW0vbW1faW5pdC5jCkBAIC04LDcgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2lmZGVmIENPTkZJR19ERUJVR19NRU1PUllfSU5JVApkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IGE2NWVmZDQuLmVhZTkwYWYgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CkBAIC0yNTU4LDcgKzI1NTgsNiBAQAogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYXZjOwotCWludCByZXQgPSAtRUlOVFI7CiAKIAlCVUdfT04oZG93bl9yZWFkX3RyeWxvY2soJm1tLT5tbWFwX3NlbSkpOwogCkBAIC0yNTc5LDEzICsyNTc4LDExIEBACiAJCQkJdm1fbG9ja19hbm9uX3ZtYShtbSwgYXZjLT5hbm9uX3ZtYSk7CiAJfQogCi0JcmV0ID0gMDsKKwlyZXR1cm4gMDsKIAogb3V0X3VubG9jazoKLQlpZiAocmV0KQotCQltbV9kcm9wX2FsbF9sb2NrcyhtbSk7Ci0KLQlyZXR1cm4gcmV0OworCW1tX2Ryb3BfYWxsX2xvY2tzKG1tKTsKKwlyZXR1cm4gLUVJTlRSOwogfQogCiBzdGF0aWMgdm9pZCB2bV91bmxvY2tfYW5vbl92bWEoc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSkKZGlmZiAtLWdpdCBhL21tL21tdV9jb250ZXh0LmMgYi9tbS9tbXVfY29udGV4dC5jCmluZGV4IDllODJlOTMuLmNmMzMyYmMgMTAwNjQ0Ci0tLSBhL21tL21tdV9jb250ZXh0LmMKKysrIGIvbW0vbW11X2NvbnRleHQuYwpAQCAtNSw3ICs1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X2NvbnRleHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CmRpZmYgLS1naXQgYS9tbS9tbXVfbm90aWZpZXIuYyBiL21tL21tdV9ub3RpZmllci5jCmluZGV4IDhkMDMyZGUuLjlhNjExZDMgMTAwNjQ0Ci0tLSBhL21tL21tdV9ub3RpZmllci5jCisrKyBiL21tL21tdV9ub3RpZmllci5jCkBAIC0xMSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgpkaWZmIC0tZ2l0IGEvbW0vbW16b25lLmMgYi9tbS9tbXpvbmUuYwppbmRleCBmNWI3ZDE3Li43Y2Y3YjdkIDEwMDY0NAotLS0gYS9tbS9tbXpvbmUuYworKysgYi9tbS9tbXpvbmUuYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdHJ1Y3QgcGdsaXN0X2RhdGEgKmZpcnN0X29ubGluZV9wZ2RhdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvbW0vbXJlbWFwLmMgYi9tbS9tcmVtYXAuYwppbmRleCA1MDZmYTQ0Li5kNjk1OWNiIDEwMDY0NAotLS0gYS9tbS9tcmVtYXAuYworKysgYi9tbS9tcmVtYXAuYwpAQCAtNDEsOCArNDEsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKLQlzcGxpdF9odWdlX3BhZ2VfcG1kKG1tLCBwbWQpOwotCWlmIChwbWRfbm9uZV9vcl9jbGVhcl9iYWQocG1kKSkKKwlpZiAocG1kX25vbmUoKnBtZCkpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHBtZDsKQEAgLTY1LDggKzY0LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlWTV9CVUdfT04ocG1kX3RyYW5zX2h1Z2UoKnBtZCkpOwotCWlmIChwbWRfbm9uZSgqcG1kKSAmJiBfX3B0ZV9hbGxvYyhtbSwgdm1hLCBwbWQsIGFkZHIpKQotCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBwbWQ7CiB9CkBAIC04MCwxMSArNzcsNyBAQAogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKIAlwdGVfdCAqb2xkX3B0ZSwgKm5ld19wdGUsIHB0ZTsKIAlzcGlubG9ja190ICpvbGRfcHRsLCAqbmV3X3B0bDsKLQl1bnNpZ25lZCBsb25nIG9sZF9zdGFydDsKIAotCW9sZF9zdGFydCA9IG9sZF9hZGRyOwotCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KHZtYS0+dm1fbW0sCi0JCQkJCSAgICBvbGRfc3RhcnQsIG9sZF9lbmQpOwogCWlmICh2bWEtPnZtX2ZpbGUpIHsKIAkJLyoKIAkJICogU3VidGxlIHBvaW50IGZyb20gUmFqZXNoIFZlbmthdGFzdWJyYW1hbmlhbjogYmVmb3JlCkBAIC0xMTEsNyArMTA0LDcgQEAKIAkJCQkgICBuZXdfcHRlKyssIG5ld19hZGRyICs9IFBBR0VfU0laRSkgewogCQlpZiAocHRlX25vbmUoKm9sZF9wdGUpKQogCQkJY29udGludWU7Ci0JCXB0ZSA9IHB0ZXBfY2xlYXJfZmx1c2godm1hLCBvbGRfYWRkciwgb2xkX3B0ZSk7CisJCXB0ZSA9IHB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgb2xkX2FkZHIsIG9sZF9wdGUpOwogCQlwdGUgPSBtb3ZlX3B0ZShwdGUsIG5ld192bWEtPnZtX3BhZ2VfcHJvdCwgb2xkX2FkZHIsIG5ld19hZGRyKTsKIAkJc2V0X3B0ZV9hdChtbSwgbmV3X2FkZHIsIG5ld19wdGUsIHB0ZSk7CiAJfQpAQCAtMTIzLDcgKzExNiw2IEBACiAJcHRlX3VubWFwX3VubG9jayhvbGRfcHRlIC0gMSwgb2xkX3B0bCk7CiAJaWYgKG1hcHBpbmcpCiAJCW11dGV4X3VubG9jaygmbWFwcGluZy0+aV9tbWFwX211dGV4KTsKLQltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9lbmQodm1hLT52bV9tbSwgb2xkX3N0YXJ0LCBvbGRfZW5kKTsKIH0KIAogI2RlZmluZSBMQVRFTkNZX0xJTUlUCSg2NCAqIFBBR0VfU0laRSkKQEAgLTEzNCwyMiArMTI2LDQzIEBACiB7CiAJdW5zaWduZWQgbG9uZyBleHRlbnQsIG5leHQsIG9sZF9lbmQ7CiAJcG1kX3QgKm9sZF9wbWQsICpuZXdfcG1kOworCWJvb2wgbmVlZF9mbHVzaCA9IGZhbHNlOwogCiAJb2xkX2VuZCA9IG9sZF9hZGRyICsgbGVuOwogCWZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgb2xkX2FkZHIsIG9sZF9lbmQpOwogCisJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQodm1hLT52bV9tbSwgb2xkX2FkZHIsIG9sZF9lbmQpOworCiAJZm9yICg7IG9sZF9hZGRyIDwgb2xkX2VuZDsgb2xkX2FkZHIgKz0gZXh0ZW50LCBuZXdfYWRkciArPSBleHRlbnQpIHsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCW5leHQgPSAob2xkX2FkZHIgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKLQkJaWYgKG5leHQgLSAxID4gb2xkX2VuZCkKLQkJCW5leHQgPSBvbGRfZW5kOworCQkvKiBldmVuIGlmIG5leHQgb3ZlcmZsb3dlZCwgZXh0ZW50IGJlbG93IHdpbGwgYmUgb2sgKi8KIAkJZXh0ZW50ID0gbmV4dCAtIG9sZF9hZGRyOworCQlpZiAoZXh0ZW50ID4gb2xkX2VuZCAtIG9sZF9hZGRyKQorCQkJZXh0ZW50ID0gb2xkX2VuZCAtIG9sZF9hZGRyOwogCQlvbGRfcG1kID0gZ2V0X29sZF9wbWQodm1hLT52bV9tbSwgb2xkX2FkZHIpOwogCQlpZiAoIW9sZF9wbWQpCiAJCQljb250aW51ZTsKIAkJbmV3X3BtZCA9IGFsbG9jX25ld19wbWQodm1hLT52bV9tbSwgdm1hLCBuZXdfYWRkcik7CiAJCWlmICghbmV3X3BtZCkKIAkJCWJyZWFrOworCQlpZiAocG1kX3RyYW5zX2h1Z2UoKm9sZF9wbWQpKSB7CisJCQlpbnQgZXJyID0gMDsKKwkJCWlmIChleHRlbnQgPT0gSFBBR0VfUE1EX1NJWkUpCisJCQkJZXJyID0gbW92ZV9odWdlX3BtZCh2bWEsIG5ld192bWEsIG9sZF9hZGRyLAorCQkJCQkJICAgIG5ld19hZGRyLCBvbGRfZW5kLAorCQkJCQkJICAgIG9sZF9wbWQsIG5ld19wbWQpOworCQkJaWYgKGVyciA+IDApIHsKKwkJCQluZWVkX2ZsdXNoID0gdHJ1ZTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoIWVycikgeworCQkJCXNwbGl0X2h1Z2VfcGFnZV9wbWQodm1hLT52bV9tbSwgb2xkX3BtZCk7CisJCQl9CisJCQlWTV9CVUdfT04ocG1kX3RyYW5zX2h1Z2UoKm9sZF9wbWQpKTsKKwkJfQorCQlpZiAocG1kX25vbmUoKm5ld19wbWQpICYmIF9fcHRlX2FsbG9jKG5ld192bWEtPnZtX21tLCBuZXdfdm1hLAorCQkJCQkJICAgICAgbmV3X3BtZCwgbmV3X2FkZHIpKQorCQkJYnJlYWs7CiAJCW5leHQgPSAobmV3X2FkZHIgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKIAkJaWYgKGV4dGVudCA+IG5leHQgLSBuZXdfYWRkcikKIAkJCWV4dGVudCA9IG5leHQgLSBuZXdfYWRkcjsKQEAgLTE1Nyw3ICsxNzAsMTIgQEAKIAkJCWV4dGVudCA9IExBVEVOQ1lfTElNSVQ7CiAJCW1vdmVfcHRlcyh2bWEsIG9sZF9wbWQsIG9sZF9hZGRyLCBvbGRfYWRkciArIGV4dGVudCwKIAkJCQluZXdfdm1hLCBuZXdfcG1kLCBuZXdfYWRkcik7CisJCW5lZWRfZmx1c2ggPSB0cnVlOwogCX0KKwlpZiAobGlrZWx5KG5lZWRfZmx1c2gpKQorCQlmbHVzaF90bGJfcmFuZ2Uodm1hLCBvbGRfZW5kLWxlbiwgb2xkX2FkZHIpOworCisJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKHZtYS0+dm1fbW0sIG9sZF9lbmQtbGVuLCBvbGRfZW5kKTsKIAogCXJldHVybiBsZW4gKyBvbGRfYWRkciAtIG9sZF9lbmQ7CS8qIGhvdyBtdWNoIGRvbmUgKi8KIH0KZGlmZiAtLWdpdCBhL21tL25vYm9vdG1lbS5jIGIvbW0vbm9ib290bWVtLmMKaW5kZXggNmU5M2RjNy4uN2ZhNDFiNCAxMDA2NDQKLS0tIGEvbW0vbm9ib290bWVtLmMKKysrIGIvbW0vbm9ib290bWVtLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgpkaWZmIC0tZ2l0IGEvbW0vbm9tbXUuYyBiL21tL25vbW11LmMKaW5kZXggNDM1ODAzMi4uNzM0MTljNSAxMDA2NDQKLS0tIGEvbW0vbm9tbXUuYworKysgYi9tbS9ub21tdS5jCkBAIC0xMyw3ICsxMyw3IEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggNjI2MzAzYi4uNDcxZGVkYiAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0yNiwxOCArMjYsMzggQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogaW50IHN5c2N0bF9wYW5pY19vbl9vb207CiBpbnQgc3lzY3RsX29vbV9raWxsX2FsbG9jYXRpbmdfdGFzazsKIGludCBzeXNjdGxfb29tX2R1bXBfdGFza3MgPSAxOwogc3RhdGljIERFRklORV9TUElOTE9DSyh6b25lX3NjYW5fbG9jayk7CiAKKy8qCisgKiBjb21wYXJlX3N3YXBfb29tX3Njb3JlX2FkaigpIC0gY29tcGFyZSBhbmQgc3dhcCBjdXJyZW50J3Mgb29tX3Njb3JlX2FkagorICogQG9sZF92YWw6IG9sZCBvb21fc2NvcmVfYWRqIGZvciBjb21wYXJlCisgKiBAbmV3X3ZhbDogbmV3IG9vbV9zY29yZV9hZGogZm9yIHN3YXAKKyAqCisgKiBTZXRzIHRoZSBvb21fc2NvcmVfYWRqIHZhbHVlIGZvciBjdXJyZW50IHRvIEBuZXdfdmFsIGlmZiBpdHMgcHJlc2VudCB2YWx1ZSBpcworICogQG9sZF92YWwuICBVc3VhbGx5IHVzZWQgdG8gcmVpbnN0YXRlIGEgcHJldmlvdXMgdmFsdWUgdG8gcHJldmVudCByYWNpbmcgd2l0aAorICogdXNlcnNwYWNpbmcgdHVuaW5nIHRoZSB2YWx1ZSBpbiB0aGUgaW50ZXJpbS4KKyAqLwordm9pZCBjb21wYXJlX3N3YXBfb29tX3Njb3JlX2FkaihpbnQgb2xkX3ZhbCwgaW50IG5ld192YWwpCit7CisJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kID0gY3VycmVudC0+c2lnaGFuZDsKKworCXNwaW5fbG9ja19pcnEoJnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChjdXJyZW50LT5zaWduYWwtPm9vbV9zY29yZV9hZGogPT0gb2xkX3ZhbCkKKwkJY3VycmVudC0+c2lnbmFsLT5vb21fc2NvcmVfYWRqID0gbmV3X3ZhbDsKKwlzcGluX3VubG9ja19pcnEoJnNpZ2hhbmQtPnNpZ2xvY2spOworfQorCiAvKioKICAqIHRlc3Rfc2V0X29vbV9zY29yZV9hZGooKSAtIHNldCBjdXJyZW50J3Mgb29tX3Njb3JlX2FkaiBhbmQgcmV0dXJuIG9sZCB2YWx1ZQogICogQG5ld192YWw6IG5ldyBvb21fc2NvcmVfYWRqIHZhbHVlCkBAIC01MywxMyArNzMsNyBAQAogCiAJc3Bpbl9sb2NrX2lycSgmc2lnaGFuZC0+c2lnbG9jayk7CiAJb2xkX3ZhbCA9IGN1cnJlbnQtPnNpZ25hbC0+b29tX3Njb3JlX2FkajsKLQlpZiAobmV3X3ZhbCAhPSBvbGRfdmFsKSB7Ci0JCWlmIChuZXdfdmFsID09IE9PTV9TQ09SRV9BREpfTUlOKQotCQkJYXRvbWljX2luYygmY3VycmVudC0+bW0tPm9vbV9kaXNhYmxlX2NvdW50KTsKLQkJZWxzZSBpZiAob2xkX3ZhbCA9PSBPT01fU0NPUkVfQURKX01JTikKLQkJCWF0b21pY19kZWMoJmN1cnJlbnQtPm1tLT5vb21fZGlzYWJsZV9jb3VudCk7Ci0JCWN1cnJlbnQtPnNpZ25hbC0+b29tX3Njb3JlX2FkaiA9IG5ld192YWw7Ci0JfQorCWN1cnJlbnQtPnNpZ25hbC0+b29tX3Njb3JlX2FkaiA9IG5ld192YWw7CiAJc3Bpbl91bmxvY2tfaXJxKCZzaWdoYW5kLT5zaWdsb2NrKTsKIAogCXJldHVybiBvbGRfdmFsOwpAQCAtMTcyLDE2ICsxODYsNiBAQAogCQlyZXR1cm4gMDsKIAogCS8qCi0JICogU2hvcnRjdXQgY2hlY2sgZm9yIGEgdGhyZWFkIHNoYXJpbmcgcC0+bW0gdGhhdCBpcyBPT01fU0NPUkVfQURKX01JTgotCSAqIHNvIHRoZSBlbnRpcmUgaGV1cmlzdGljIGRvZXNuJ3QgbmVlZCB0byBiZSBleGVjdXRlZCBmb3Igc29tZXRoaW5nCi0JICogdGhhdCBjYW5ub3QgYmUga2lsbGVkLgotCSAqLwotCWlmIChhdG9taWNfcmVhZCgmcC0+bW0tPm9vbV9kaXNhYmxlX2NvdW50KSkgewotCQl0YXNrX3VubG9jayhwKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKIAkgKiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgbWF5IGhhdmUgYSBsaW1pdCBvZiAwIGJ5dGVzLCBzbyBhdm9pZCBhIGRpdmlkZQogCSAqIGJ5IHplcm8sIGlmIG5lY2Vzc2FyeS4KIAkgKi8KQEAgLTMxNyw4ICszMjEsMTEgQEAKIAkJICogYmxvY2tlZCB3YWl0aW5nIGZvciBhbm90aGVyIHRhc2sgd2hpY2ggaXRzZWxmIGlzIHdhaXRpbmcKIAkJICogZm9yIG1lbW9yeS4gSXMgdGhlcmUgYSBiZXR0ZXIgYWx0ZXJuYXRpdmU/CiAJCSAqLwotCQlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX01FTURJRSkpCisJCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTUVNRElFKSkgeworCQkJaWYgKHVubGlrZWx5KGZyb3plbihwKSkpCisJCQkJdGhhd19wcm9jZXNzKHApOwogCQkJcmV0dXJuIEVSUl9QVFIoLTFVTCk7CisJCX0KIAkJaWYgKCFwLT5tbSkKIAkJCWNvbnRpbnVlOwogCkBAIC00MzUsNyArNDQyLDcgQEAKIAl0YXNrX3VubG9jayhwKTsKIAogCS8qCi0JICogS2lsbCBhbGwgcHJvY2Vzc2VzIHNoYXJpbmcgcC0+bW0gaW4gb3RoZXIgdGhyZWFkIGdyb3VwcywgaWYgYW55LgorCSAqIEtpbGwgYWxsIHVzZXIgcHJvY2Vzc2VzIHNoYXJpbmcgcC0+bW0gaW4gb3RoZXIgdGhyZWFkIGdyb3VwcywgaWYgYW55LgogCSAqIFRoZXkgZG9uJ3QgZ2V0IGFjY2VzcyB0byBtZW1vcnkgcmVzZXJ2ZXMgb3IgYSBoaWdoZXIgc2NoZWR1bGVyCiAJICogcHJpb3JpdHksIHRob3VnaCwgdG8gYXZvaWQgZGVwbGV0aW9uIG9mIGFsbCBtZW1vcnkgb3IgdGFzawogCSAqIHN0YXJ2YXRpb24uICBUaGlzIHByZXZlbnRzIG1tLT5tbWFwX3NlbSBsaXZlbG9jayB3aGVuIGFuIG9vbSBraWxsZWQKQEAgLTQ0NSw3ICs0NTIsMTEgQEAKIAkgKiBzaWduYWwuCiAJICovCiAJZm9yX2VhY2hfcHJvY2VzcyhxKQotCQlpZiAocS0+bW0gPT0gbW0gJiYgIXNhbWVfdGhyZWFkX2dyb3VwKHEsIHApKSB7CisJCWlmIChxLT5tbSA9PSBtbSAmJiAhc2FtZV90aHJlYWRfZ3JvdXAocSwgcCkgJiYKKwkJICAgICEocS0+ZmxhZ3MgJiBQRl9LVEhSRUFEKSkgeworCQkJaWYgKHEtPnNpZ25hbC0+b29tX3Njb3JlX2FkaiA9PSBPT01fU0NPUkVfQURKX01JTikKKwkJCQljb250aW51ZTsKKwogCQkJdGFza19sb2NrKHEpOwkvKiBQcm90ZWN0IC0+Y29tbSBmcm9tIHByY3RsKCkgKi8KIAkJCXByX2VycigiS2lsbCBwcm9jZXNzICVkICglcykgc2hhcmluZyBzYW1lIG1lbW9yeVxuIiwKIAkJCQl0YXNrX3BpZF9ucihxKSwgcS0+Y29tbSk7CkBAIC03MjIsNyArNzMzLDcgQEAKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCWlmIChzeXNjdGxfb29tX2tpbGxfYWxsb2NhdGluZ190YXNrICYmCiAJICAgICFvb21fdW5raWxsYWJsZV90YXNrKGN1cnJlbnQsIE5VTEwsIG5vZGVtYXNrKSAmJgotCSAgICBjdXJyZW50LT5tbSAmJiAhYXRvbWljX3JlYWQoJmN1cnJlbnQtPm1tLT5vb21fZGlzYWJsZV9jb3VudCkpIHsKKwkgICAgY3VycmVudC0+bW0pIHsKIAkJLyoKIAkJICogb29tX2tpbGxfcHJvY2VzcygpIG5lZWRzIHRhc2tsaXN0X2xvY2sgaGVsZC4gIElmIGl0IHJldHVybnMKIAkJICogbm9uLXplcm8sIGN1cnJlbnQgY291bGQgbm90IGJlIGtpbGxlZCBzbyB3ZSBtdXN0IGZhbGxiYWNrIHRvCmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCAwZTMwOWNkLi5hMzI3OGYwIDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC00NiwyNiArNDYsMTQgQEAKICAqLwogI2RlZmluZSBCQU5EV0lEVEhfSU5URVJWQUwJbWF4KEhaLzUsIDEpCiAKKyNkZWZpbmUgUkFURUxJTUlUX0NBTENfU0hJRlQJMTAKKwogLyoKICAqIEFmdGVyIGEgQ1BVIGhhcyBkaXJ0aWVkIHRoaXMgbWFueSBwYWdlcywgYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZAogICogd2lsbCBsb29rIHRvIHNlZSBpZiBpdCBuZWVkcyB0byBmb3JjZSB3cml0ZWJhY2sgb3IgdGhyb3R0bGluZy4KICAqLwogc3RhdGljIGxvbmcgcmF0ZWxpbWl0X3BhZ2VzID0gMzI7CiAKLS8qCi0gKiBXaGVuIGJhbGFuY2VfZGlydHlfcGFnZXMgZGVjaWRlcyB0aGF0IHRoZSBjYWxsZXIgbmVlZHMgdG8gcGVyZm9ybSBzb21lCi0gKiBub24tYmFja2dyb3VuZCB3cml0ZWJhY2ssIHRoaXMgaXMgaG93IG1hbnkgcGFnZXMgaXQgd2lsbCBhdHRlbXB0IHRvIHdyaXRlLgotICogSXQgc2hvdWxkIGJlIHNvbWV3aGF0IGxhcmdlciB0aGFuIGRpcnRpZWQgcGFnZXMgdG8gZW5zdXJlIHRoYXQgcmVhc29uYWJseQotICogbGFyZ2UgYW1vdW50cyBvZiBJL08gYXJlIHN1Ym1pdHRlZC4KLSAqLwotc3RhdGljIGlubGluZSBsb25nIHN5bmNfd3JpdGViYWNrX3BhZ2VzKHVuc2lnbmVkIGxvbmcgZGlydGllZCkKLXsKLQlpZiAoZGlydGllZCA8IHJhdGVsaW1pdF9wYWdlcykKLQkJZGlydGllZCA9IHJhdGVsaW1pdF9wYWdlczsKLQotCXJldHVybiBkaXJ0aWVkICsgZGlydGllZCAvIDI7Ci19Ci0KIC8qIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZXhwb3J0ZWQgdmlhIC9wcm9jL3N5cy92bSAqLwogCiAvKgpAQCAtMTY3LDYgKzE1NSw4IEBACiAJaW50IHNoaWZ0ID0gY2FsY19wZXJpb2Rfc2hpZnQoKTsKIAlwcm9wX2NoYW5nZV9zaGlmdCgmdm1fY29tcGxldGlvbnMsIHNoaWZ0KTsKIAlwcm9wX2NoYW5nZV9zaGlmdCgmdm1fZGlydGllcywgc2hpZnQpOworCisJd3JpdGViYWNrX3NldF9yYXRlbGltaXQoKTsKIH0KIAogaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLApAQCAtMjYwLDUyICsyNTAsMTAgQEAKIAkJCQludW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRhc2tfZGlydGllc19mcmFjdGlvbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJbG9uZyAqbnVtZXJhdG9yLCBsb25nICpkZW5vbWluYXRvcikKLXsKLQlwcm9wX2ZyYWN0aW9uX3NpbmdsZSgmdm1fZGlydGllcywgJnRzay0+ZGlydGllcywKLQkJCQludW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKLX0KLQogLyoKLSAqIHRhc2tfZGlydHlfbGltaXQgLSBzY2FsZSBkb3duIGRpcnR5IHRocm90dGxpbmcgdGhyZXNob2xkIGZvciBvbmUgdGFzawotICoKLSAqIHRhc2sgc3BlY2lmaWMgZGlydHkgbGltaXQ6Ci0gKgotICogICBkaXJ0eSAtPSAoZGlydHkvOCkgKiBwX3t0fQotICoKLSAqIFRvIHByb3RlY3QgbGlnaHQvc2xvdyBkaXJ0eWluZyB0YXNrcyBmcm9tIGhlYXZpZXIvZmFzdCBvbmVzLCB3ZSBzdGFydAotICogdGhyb3R0bGluZyBpbmRpdmlkdWFsIHRhc2tzIGJlZm9yZSByZWFjaGluZyB0aGUgYmRpIGRpcnR5IGxpbWl0LgotICogUmVsYXRpdmVseSBsb3cgdGhyZXNob2xkcyB3aWxsIGJlIGFsbG9jYXRlZCB0byBoZWF2eSBkaXJ0aWVycy4gU28gd2hlbgotICogZGlydHkgcGFnZXMgZ3JvdyBsYXJnZSwgaGVhdnkgZGlydGllcnMgd2lsbCBiZSB0aHJvdHRsZWQgZmlyc3QsIHdoaWNoIHdpbGwKLSAqIGVmZmVjdGl2ZWx5IGN1cmIgdGhlIGdyb3d0aCBvZiBkaXJ0eSBwYWdlcy4gTGlnaHQgZGlydGllcnMgd2l0aCBoaWdoIGVub3VnaAotICogZGlydHkgdGhyZXNob2xkIG1heSBuZXZlciBnZXQgdGhyb3R0bGVkLgotICovCi0jZGVmaW5lIFRBU0tfTElNSVRfRlJBQ1RJT04gOAotc3RhdGljIHVuc2lnbmVkIGxvbmcgdGFza19kaXJ0eV9saW1pdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBiZGlfZGlydHkpCi17Ci0JbG9uZyBudW1lcmF0b3IsIGRlbm9taW5hdG9yOwotCXVuc2lnbmVkIGxvbmcgZGlydHkgPSBiZGlfZGlydHk7Ci0JdTY0IGludiA9IGRpcnR5IC8gVEFTS19MSU1JVF9GUkFDVElPTjsKLQotCXRhc2tfZGlydGllc19mcmFjdGlvbih0c2ssICZudW1lcmF0b3IsICZkZW5vbWluYXRvcik7Ci0JaW52ICo9IG51bWVyYXRvcjsKLQlkb19kaXYoaW52LCBkZW5vbWluYXRvcik7Ci0KLQlkaXJ0eSAtPSBpbnY7Ci0KLQlyZXR1cm4gbWF4KGRpcnR5LCBiZGlfZGlydHkvMik7Ci19Ci0KLS8qIE1pbmltdW0gbGltaXQgZm9yIGFueSB0YXNrICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB0YXNrX21pbl9kaXJ0eV9saW1pdCh1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eSkKLXsKLQlyZXR1cm4gYmRpX2RpcnR5IC0gYmRpX2RpcnR5IC8gVEFTS19MSU1JVF9GUkFDVElPTjsKLX0KLQotLyoKLSAqCisgKiBiZGlfbWluX3JhdGlvIGtlZXBzIHRoZSBzdW0gb2YgdGhlIG1pbmltdW0gZGlydHkgc2hhcmVzIG9mIGFsbAorICogcmVnaXN0ZXJlZCBiYWNraW5nIGRldmljZXMsIHdoaWNoLCBmb3Igb2J2aW91cyByZWFzb25zLCBjYW4gbm90CisgKiBleGNlZWQgMTAwJS4KICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBiZGlfbWluX3JhdGlvOwogCkBAIC00MTEsNiArMzU5LDEyIEBACiAJcmV0dXJuIHggKyAxOwkvKiBFbnN1cmUgdGhhdCB3ZSBuZXZlciByZXR1cm4gMCAqLwogfQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJ0eV9mcmVlcnVuX2NlaWxpbmcodW5zaWduZWQgbG9uZyB0aHJlc2gsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgYmdfdGhyZXNoKQoreworCXJldHVybiAodGhyZXNoICsgYmdfdGhyZXNoKSAvIDI7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGhhcmRfZGlydHlfbGltaXQodW5zaWduZWQgbG9uZyB0aHJlc2gpCiB7CiAJcmV0dXJuIG1heCh0aHJlc2gsIGdsb2JhbF9kaXJ0eV9saW1pdCk7CkBAIC00OTUsNiArNDQ5LDE5OCBAQAogCXJldHVybiBiZGlfZGlydHk7CiB9CiAKKy8qCisgKiBEaXJ0eSBwb3NpdGlvbiBjb250cm9sLgorICoKKyAqIChvKSBnbG9iYWwvYmRpIHNldHBvaW50cworICoKKyAqIFdlIHdhbnQgdGhlIGRpcnR5IHBhZ2VzIGJlIGJhbGFuY2VkIGFyb3VuZCB0aGUgZ2xvYmFsL2JkaSBzZXRwb2ludHMuCisgKiBXaGVuIHRoZSBudW1iZXIgb2YgZGlydHkgcGFnZXMgaXMgaGlnaGVyL2xvd2VyIHRoYW4gdGhlIHNldHBvaW50LCB0aGUKKyAqIGRpcnR5IHBvc2l0aW9uIGNvbnRyb2wgcmF0aW8gKGFuZCBoZW5jZSB0YXNrIGRpcnR5IHJhdGVsaW1pdCkgd2lsbCBiZQorICogZGVjcmVhc2VkL2luY3JlYXNlZCB0byBicmluZyB0aGUgZGlydHkgcGFnZXMgYmFjayB0byB0aGUgc2V0cG9pbnQuCisgKgorICogICAgIHBvc19yYXRpbyA9IDEgPDwgUkFURUxJTUlUX0NBTENfU0hJRlQKKyAqCisgKiAgICAgaWYgKGRpcnR5IDwgc2V0cG9pbnQpIHNjYWxlIHVwICAgcG9zX3JhdGlvCisgKiAgICAgaWYgKGRpcnR5ID4gc2V0cG9pbnQpIHNjYWxlIGRvd24gcG9zX3JhdGlvCisgKgorICogICAgIGlmIChiZGlfZGlydHkgPCBiZGlfc2V0cG9pbnQpIHNjYWxlIHVwICAgcG9zX3JhdGlvCisgKiAgICAgaWYgKGJkaV9kaXJ0eSA+IGJkaV9zZXRwb2ludCkgc2NhbGUgZG93biBwb3NfcmF0aW8KKyAqCisgKiAgICAgdGFza19yYXRlbGltaXQgPSBkaXJ0eV9yYXRlbGltaXQgKiBwb3NfcmF0aW8gPj4gUkFURUxJTUlUX0NBTENfU0hJRlQKKyAqCisgKiAobykgZ2xvYmFsIGNvbnRyb2wgbGluZQorICoKKyAqICAgICBeIHBvc19yYXRpbworICogICAgIHwKKyAqICAgICB8ICAgICAgICAgICAgfDw9PT09PSBnbG9iYWwgZGlydHkgY29udHJvbCBzY29wZSA9PT09PT0+fAorICogMi4wIC4uLi4uLi4uLi4uLi4qCisgKiAgICAgfCAgICAgICAgICAgIC4qCisgKiAgICAgfCAgICAgICAgICAgIC4gKgorICogICAgIHwgICAgICAgICAgICAuICAgKgorICogICAgIHwgICAgICAgICAgICAuICAgICAqCisgKiAgICAgfCAgICAgICAgICAgIC4gICAgICAgICoKKyAqICAgICB8ICAgICAgICAgICAgLiAgICAgICAgICAgICoKKyAqIDEuMCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioKKyAqICAgICB8ICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgIC4gICAgICoKKyAqICAgICB8ICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgKgorICogICAwICstLS0tLS0tLS0tLS0uLS0tLS0tLS0tLS0tLS0tLS0tLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLT4KKyAqICAgICAgICAgICBmcmVlcnVuXiAgICAgICAgICBzZXRwb2ludF4gICAgICAgICAgICAgICAgIGxpbWl0XiAgIGRpcnR5IHBhZ2VzCisgKgorICogKG8pIGJkaSBjb250cm9sIGxpbmUKKyAqCisgKiAgICAgXiBwb3NfcmF0aW8KKyAqICAgICB8CisgKiAgICAgfCAgICAgICAgICAgICoKKyAqICAgICB8ICAgICAgICAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICoKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAqIHw8PT09PT09PT09PT0gc3BhbiA9PT09PT09PT09PT0+fAorICogMS4wIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAuICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgKgorICogMS80IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKiAqICogKiAqICogKiAqICogKiAqICoKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgLgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAqICAgMCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi0tLS0tLS0tLS0tLS0+CisgKiAgICAgICAgICAgICAgICBiZGlfc2V0cG9pbnReICAgICAgICAgICAgICAgICAgICB4X2ludGVyY2VwdF4KKyAqCisgKiBUaGUgYmRpIGNvbnRyb2wgbGluZSB3b24ndCBkcm9wIGJlbG93IHBvc19yYXRpbz0xLzQsIHNvIHRoYXQgYmRpX2RpcnR5IGNhbgorICogYmUgc21vb3RobHkgdGhyb3R0bGVkIGRvd24gdG8gbm9ybWFsIGlmIGl0IHN0YXJ0cyBoaWdoIGluIHNpdHVhdGlvbnMgbGlrZQorICogLSBzdGFydCB3cml0aW5nIHRvIGEgc2xvdyBTRCBjYXJkIGFuZCBhIGZhc3QgZGlzayBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgU0QKKyAqICAgY2FyZCdzIGJkaV9kaXJ0eSBtYXkgcnVzaCB0byBtYW55IHRpbWVzIGhpZ2hlciB0aGFuIGJkaV9zZXRwb2ludC4KKyAqIC0gdGhlIGJkaSBkaXJ0eSB0aHJlc2ggZHJvcHMgcXVpY2tseSBkdWUgdG8gY2hhbmdlIG9mIEpCT0Qgd29ya2xvYWQKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmRpX3Bvc2l0aW9uX3JhdGlvKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCisJCQkJCXVuc2lnbmVkIGxvbmcgdGhyZXNoLAorCQkJCQl1bnNpZ25lZCBsb25nIGJnX3RocmVzaCwKKwkJCQkJdW5zaWduZWQgbG9uZyBkaXJ0eSwKKwkJCQkJdW5zaWduZWQgbG9uZyBiZGlfdGhyZXNoLAorCQkJCQl1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eSkKK3sKKwl1bnNpZ25lZCBsb25nIHdyaXRlX2J3ID0gYmRpLT5hdmdfd3JpdGVfYmFuZHdpZHRoOworCXVuc2lnbmVkIGxvbmcgZnJlZXJ1biA9IGRpcnR5X2ZyZWVydW5fY2VpbGluZyh0aHJlc2gsIGJnX3RocmVzaCk7CisJdW5zaWduZWQgbG9uZyBsaW1pdCA9IGhhcmRfZGlydHlfbGltaXQodGhyZXNoKTsKKwl1bnNpZ25lZCBsb25nIHhfaW50ZXJjZXB0OworCXVuc2lnbmVkIGxvbmcgc2V0cG9pbnQ7CQkvKiBkaXJ0eSBwYWdlcycgdGFyZ2V0IGJhbGFuY2UgcG9pbnQgKi8KKwl1bnNpZ25lZCBsb25nIGJkaV9zZXRwb2ludDsKKwl1bnNpZ25lZCBsb25nIHNwYW47CisJbG9uZyBsb25nIHBvc19yYXRpbzsJCS8qIGZvciBzY2FsaW5nIHVwL2Rvd24gdGhlIHJhdGUgbGltaXQgKi8KKwlsb25nIHg7CisKKwlpZiAodW5saWtlbHkoZGlydHkgPj0gbGltaXQpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogZ2xvYmFsIHNldHBvaW50CisJICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHBvaW50IC0gZGlydHkgMworCSAqICAgICAgICBmKGRpcnR5KSA6PSAxLjAgKyAoLS0tLS0tLS0tLS0tLS0tLSkKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IC0gc2V0cG9pbnQKKwkgKgorCSAqIGl0J3MgYSAzcmQgb3JkZXIgcG9seW5vbWlhbCB0aGF0IHN1YmplY3RzIHRvCisJICoKKwkgKiAoMSkgZihmcmVlcnVuKSAgPSAyLjAgPT4gcmFtcHVwIGRpcnR5X3JhdGVsaW1pdCByZWFzb25hYmx5IGZhc3QKKwkgKiAoMikgZihzZXRwb2ludCkgPSAxLjAgPT4gdGhlIGJhbGFuY2UgcG9pbnQKKwkgKiAoMykgZihsaW1pdCkgICAgPSAwICAgPT4gdGhlIGhhcmQgbGltaXQKKwkgKiAoNCkgZGYvZHggICAgICA8PSAwCSA9PiBuZWdhdGl2ZSBmZWVkYmFjayBjb250cm9sCisJICogKDUpIHRoZSBjbG9zZXIgdG8gc2V0cG9pbnQsIHRoZSBzbWFsbGVyIHxkZi9keHwgKGFuZCB0aGUgcmV2ZXJzZSkKKwkgKiAgICAgPT4gZmFzdCByZXNwb25zZSBvbiBsYXJnZSBlcnJvcnM7IHNtYWxsIG9zY2lsbGF0aW9uIG5lYXIgc2V0cG9pbnQKKwkgKi8KKwlzZXRwb2ludCA9IChmcmVlcnVuICsgbGltaXQpIC8gMjsKKwl4ID0gZGl2X3M2NCgoc2V0cG9pbnQgLSBkaXJ0eSkgPDwgUkFURUxJTUlUX0NBTENfU0hJRlQsCisJCSAgICBsaW1pdCAtIHNldHBvaW50ICsgMSk7CisJcG9zX3JhdGlvID0geDsKKwlwb3NfcmF0aW8gPSBwb3NfcmF0aW8gKiB4ID4+IFJBVEVMSU1JVF9DQUxDX1NISUZUOworCXBvc19yYXRpbyA9IHBvc19yYXRpbyAqIHggPj4gUkFURUxJTUlUX0NBTENfU0hJRlQ7CisJcG9zX3JhdGlvICs9IDEgPDwgUkFURUxJTUlUX0NBTENfU0hJRlQ7CisKKwkvKgorCSAqIFdlIGhhdmUgY29tcHV0ZWQgYmFzaWMgcG9zX3JhdGlvIGFib3ZlIGJhc2VkIG9uIGdsb2JhbCBzaXR1YXRpb24uIElmCisJICogdGhlIGJkaSBpcyBvdmVyL3VuZGVyIGl0cyBzaGFyZSBvZiBkaXJ0eSBwYWdlcywgd2Ugd2FudCB0byBzY2FsZQorCSAqIHBvc19yYXRpbyBmdXJ0aGVyIGRvd24vdXAuIFRoYXQgaXMgZG9uZSBieSB0aGUgZm9sbG93aW5nIG1lY2hhbmlzbS4KKwkgKi8KKworCS8qCisJICogYmRpIHNldHBvaW50CisJICoKKwkgKiAgICAgICAgZihiZGlfZGlydHkpIDo9IDEuMCArIGsgKiAoYmRpX2RpcnR5IC0gYmRpX3NldHBvaW50KQorCSAqCisJICogICAgICAgICAgICAgICAgICAgICAgICB4X2ludGVyY2VwdCAtIGJkaV9kaXJ0eQorCSAqICAgICAgICAgICAgICAgICAgICAgOj0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIHhfaW50ZXJjZXB0IC0gYmRpX3NldHBvaW50CisJICoKKwkgKiBUaGUgbWFpbiBiZGkgY29udHJvbCBsaW5lIGlzIGEgbGluZWFyIGZ1bmN0aW9uIHRoYXQgc3ViamVjdHMgdG8KKwkgKgorCSAqICgxKSBmKGJkaV9zZXRwb2ludCkgPSAxLjAKKwkgKiAoMikgayA9IC0gMSAvICg4ICogd3JpdGVfYncpICAoaW4gc2luZ2xlIGJkaSBjYXNlKQorCSAqICAgICBvciBlcXVhbGx5OiB4X2ludGVyY2VwdCA9IGJkaV9zZXRwb2ludCArIDggKiB3cml0ZV9idworCSAqCisJICogRm9yIHNpbmdsZSBiZGkgY2FzZSwgdGhlIGRpcnR5IHBhZ2VzIGFyZSBvYnNlcnZlZCB0byBmbHVjdHVhdGUKKwkgKiByZWd1bGFybHkgd2l0aGluIHJhbmdlCisJICogICAgICAgIFtiZGlfc2V0cG9pbnQgLSB3cml0ZV9idy8yLCBiZGlfc2V0cG9pbnQgKyB3cml0ZV9idy8yXQorCSAqIGZvciB2YXJpb3VzIGZpbGVzeXN0ZW1zLCB3aGVyZSAoMikgY2FuIHlpZWxkIGluIGEgcmVhc29uYWJsZSAxMi41JQorCSAqIGZsdWN0dWF0aW9uIHJhbmdlIGZvciBwb3NfcmF0aW8uCisJICoKKwkgKiBGb3IgSkJPRCBjYXNlLCBiZGlfdGhyZXNoIChub3QgYmRpX2RpcnR5ISkgY291bGQgZmx1Y3R1YXRlIHVwIHRvIGl0cworCSAqIG93biBzaXplLCBzbyBtb3ZlIHRoZSBzbG9wZSBvdmVyIGFjY29yZGluZ2x5IGFuZCBjaG9vc2UgYSBzbG9wZSB0aGF0CisJICogeWllbGRzIDEwMCUgcG9zX3JhdGlvIGZsdWN0dWF0aW9uIG9uIHN1ZGRlbmx5IGRvdWJsZWQgYmRpX3RocmVzaC4KKwkgKi8KKwlpZiAodW5saWtlbHkoYmRpX3RocmVzaCA+IHRocmVzaCkpCisJCWJkaV90aHJlc2ggPSB0aHJlc2g7CisJYmRpX3RocmVzaCA9IG1heChiZGlfdGhyZXNoLCAobGltaXQgLSBkaXJ0eSkgLyA4KTsKKwkvKgorCSAqIHNjYWxlIGdsb2JhbCBzZXRwb2ludCB0byBiZGknczoKKwkgKgliZGlfc2V0cG9pbnQgPSBzZXRwb2ludCAqIGJkaV90aHJlc2ggLyB0aHJlc2gKKwkgKi8KKwl4ID0gZGl2X3U2NCgodTY0KWJkaV90aHJlc2ggPDwgMTYsIHRocmVzaCArIDEpOworCWJkaV9zZXRwb2ludCA9IHNldHBvaW50ICogKHU2NCl4ID4+IDE2OworCS8qCisJICogVXNlIHNwYW49KDgqd3JpdGVfYncpIGluIHNpbmdsZSBiZGkgY2FzZSBhcyBpbmRpY2F0ZWQgYnkKKwkgKiAodGhyZXNoIC0gYmRpX3RocmVzaCB+PSAwKSBhbmQgdHJhbnNpdCB0byBiZGlfdGhyZXNoIGluIEpCT0QgY2FzZS4KKwkgKgorCSAqICAgICAgICBiZGlfdGhyZXNoICAgICAgICAgICAgICAgICAgICB0aHJlc2ggLSBiZGlfdGhyZXNoCisJICogc3BhbiA9IC0tLS0tLS0tLS0gKiAoOCAqIHdyaXRlX2J3KSArIC0tLS0tLS0tLS0tLS0tLS0tLS0gKiBiZGlfdGhyZXNoCisJICogICAgICAgICAgdGhyZXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaAorCSAqLworCXNwYW4gPSAodGhyZXNoIC0gYmRpX3RocmVzaCArIDggKiB3cml0ZV9idykgKiAodTY0KXggPj4gMTY7CisJeF9pbnRlcmNlcHQgPSBiZGlfc2V0cG9pbnQgKyBzcGFuOworCisJaWYgKGJkaV9kaXJ0eSA8IHhfaW50ZXJjZXB0IC0gc3BhbiAvIDQpIHsKKwkJcG9zX3JhdGlvID0gZGl2X3U2NChwb3NfcmF0aW8gKiAoeF9pbnRlcmNlcHQgLSBiZGlfZGlydHkpLAorCQkJCSAgICB4X2ludGVyY2VwdCAtIGJkaV9zZXRwb2ludCArIDEpOworCX0gZWxzZQorCQlwb3NfcmF0aW8gLz0gNDsKKworCS8qCisJICogYmRpIHJlc2VydmUgYXJlYSwgc2FmZWd1YXJkIGFnYWluc3QgZGlydHkgcG9vbCB1bmRlcnJ1biBhbmQgZGlzayBpZGxlCisJICogSXQgbWF5IHB1c2ggdGhlIGRlc2lyZWQgY29udHJvbCBwb2ludCBvZiBnbG9iYWwgZGlydHkgcGFnZXMgaGlnaGVyCisJICogdGhhbiBzZXRwb2ludC4KKwkgKi8KKwl4X2ludGVyY2VwdCA9IGJkaV90aHJlc2ggLyAyOworCWlmIChiZGlfZGlydHkgPCB4X2ludGVyY2VwdCkgeworCQlpZiAoYmRpX2RpcnR5ID4geF9pbnRlcmNlcHQgLyA4KQorCQkJcG9zX3JhdGlvID0gZGl2X3U2NChwb3NfcmF0aW8gKiB4X2ludGVyY2VwdCwgYmRpX2RpcnR5KTsKKwkJZWxzZQorCQkJcG9zX3JhdGlvICo9IDg7CisJfQorCisJcmV0dXJuIHBvc19yYXRpbzsKK30KKwogc3RhdGljIHZvaWQgYmRpX3VwZGF0ZV93cml0ZV9iYW5kd2lkdGgoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbGFwc2VkLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHdyaXR0ZW4pCkBAIC01OTEsOCArNzM3LDE1MyBAQAogCXNwaW5fdW5sb2NrKCZkaXJ0eV9sb2NrKTsKIH0KIAorLyoKKyAqIE1haW50YWluIGJkaS0+ZGlydHlfcmF0ZWxpbWl0LCB0aGUgYmFzZSBkaXJ0eSB0aHJvdHRsZSByYXRlLgorICoKKyAqIE5vcm1hbCBiZGkgdGFza3Mgd2lsbCBiZSBjdXJiZWQgYXQgb3IgYmVsb3cgaXQgaW4gbG9uZyB0ZXJtLgorICogT2J2aW91c2x5IGl0IHNob3VsZCBiZSBhcm91bmQgKHdyaXRlX2J3IC8gTikgd2hlbiB0aGVyZSBhcmUgTiBkZCB0YXNrcy4KKyAqLworc3RhdGljIHZvaWQgYmRpX3VwZGF0ZV9kaXJ0eV9yYXRlbGltaXQoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0aHJlc2gsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmdfdGhyZXNoLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRpcnR5LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGJkaV90aHJlc2gsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmRpX2RpcnR5LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRpcnRpZWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZWxhcHNlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZyZWVydW4gPSBkaXJ0eV9mcmVlcnVuX2NlaWxpbmcodGhyZXNoLCBiZ190aHJlc2gpOworCXVuc2lnbmVkIGxvbmcgbGltaXQgPSBoYXJkX2RpcnR5X2xpbWl0KHRocmVzaCk7CisJdW5zaWduZWQgbG9uZyBzZXRwb2ludCA9IChmcmVlcnVuICsgbGltaXQpIC8gMjsKKwl1bnNpZ25lZCBsb25nIHdyaXRlX2J3ID0gYmRpLT5hdmdfd3JpdGVfYmFuZHdpZHRoOworCXVuc2lnbmVkIGxvbmcgZGlydHlfcmF0ZWxpbWl0ID0gYmRpLT5kaXJ0eV9yYXRlbGltaXQ7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV9yYXRlOworCXVuc2lnbmVkIGxvbmcgdGFza19yYXRlbGltaXQ7CisJdW5zaWduZWQgbG9uZyBiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQ7CisJdW5zaWduZWQgbG9uZyBwb3NfcmF0aW87CisJdW5zaWduZWQgbG9uZyBzdGVwOworCXVuc2lnbmVkIGxvbmcgeDsKKworCS8qCisJICogVGhlIGRpcnR5IHJhdGUgd2lsbCBtYXRjaCB0aGUgd3JpdGVvdXQgcmF0ZSBpbiBsb25nIHRlcm0sIGV4Y2VwdAorCSAqIHdoZW4gZGlydHkgcGFnZXMgYXJlIHRydW5jYXRlZCBieSB1c2Vyc3BhY2Ugb3IgcmUtZGlydGllZCBieSBGUy4KKwkgKi8KKwlkaXJ0eV9yYXRlID0gKGRpcnRpZWQgLSBiZGktPmRpcnRpZWRfc3RhbXApICogSFogLyBlbGFwc2VkOworCisJcG9zX3JhdGlvID0gYmRpX3Bvc2l0aW9uX3JhdGlvKGJkaSwgdGhyZXNoLCBiZ190aHJlc2gsIGRpcnR5LAorCQkJCSAgICAgICBiZGlfdGhyZXNoLCBiZGlfZGlydHkpOworCS8qCisJICogdGFza19yYXRlbGltaXQgcmVmbGVjdHMgZWFjaCBkZCdzIGRpcnR5IHJhdGUgZm9yIHRoZSBwYXN0IDIwMG1zLgorCSAqLworCXRhc2tfcmF0ZWxpbWl0ID0gKHU2NClkaXJ0eV9yYXRlbGltaXQgKgorCQkJCQlwb3NfcmF0aW8gPj4gUkFURUxJTUlUX0NBTENfU0hJRlQ7CisJdGFza19yYXRlbGltaXQrKzsgLyogaXQgaGVscHMgcmFtcHVwIGRpcnR5X3JhdGVsaW1pdCBmcm9tIHRpbnkgdmFsdWVzICovCisKKwkvKgorCSAqIEEgbGluZWFyIGVzdGltYXRpb24gb2YgdGhlICJiYWxhbmNlZCIgdGhyb3R0bGUgcmF0ZS4gVGhlIHRoZW9yeSBpcywKKwkgKiBpZiB0aGVyZSBhcmUgTiBkZCB0YXNrcywgZWFjaCB0aHJvdHRsZWQgYXQgdGFza19yYXRlbGltaXQsIHRoZSBiZGkncworCSAqIGRpcnR5X3JhdGUgd2lsbCBiZSBtZWFzdXJlZCB0byBiZSAoTiAqIHRhc2tfcmF0ZWxpbWl0KS4gU28gdGhlIGJlbG93CisJICogZm9ybXVsYSB3aWxsIHlpZWxkIHRoZSBiYWxhbmNlZCByYXRlIGxpbWl0ICh3cml0ZV9idyAvIE4pLgorCSAqCisJICogTm90ZSB0aGF0IHRoZSBleHBhbmRlZCBmb3JtIGlzIG5vdCBhIHB1cmUgcmF0ZSBmZWVkYmFjazoKKwkgKglyYXRlXyhpKzEpID0gcmF0ZV8oaSkgKiAod3JpdGVfYncgLyBkaXJ0eV9yYXRlKQkJICAgICAoMSkKKwkgKiBidXQgYWxzbyB0YWtlcyBwb3NfcmF0aW8gaW50byBhY2NvdW50OgorCSAqCXJhdGVfKGkrMSkgPSByYXRlXyhpKSAqICh3cml0ZV9idyAvIGRpcnR5X3JhdGUpICogcG9zX3JhdGlvICAoMikKKwkgKgorCSAqICgxKSBpcyBub3QgcmVhbGlzdGljIGJlY2F1c2UgcG9zX3JhdGlvIGFsc28gdGFrZXMgcGFydCBpbiBiYWxhbmNpbmcKKwkgKiB0aGUgZGlydHkgcmF0ZS4gIENvbnNpZGVyIHRoZSBzdGF0ZQorCSAqCXBvc19yYXRpbyA9IDAuNQkJCQkJCSAgICAgKDMpCisJICoJcmF0ZSA9IDIgKiAod3JpdGVfYncgLyBOKQkJCQkgICAgICg0KQorCSAqIElmICgxKSBpcyB1c2VkLCBpdCB3aWxsIHN0dWNrIGluIHRoYXQgc3RhdGUhIEJlY2F1c2UgZWFjaCBkZCB3aWxsCisJICogYmUgdGhyb3R0bGVkIGF0CisJICoJdGFza19yYXRlbGltaXQgPSBwb3NfcmF0aW8gKiByYXRlID0gKHdyaXRlX2J3IC8gTikJICAgICAoNSkKKwkgKiB5aWVsZGluZworCSAqCWRpcnR5X3JhdGUgPSBOICogdGFza19yYXRlbGltaXQgPSB3cml0ZV9idwkJICAgICAoNikKKwkgKiBwdXQgKDYpIGludG8gKDEpIHdlIGdldAorCSAqCXJhdGVfKGkrMSkgPSByYXRlXyhpKQkJCQkJICAgICAoNykKKwkgKgorCSAqIFNvIHdlIGVuZCB1cCB1c2luZyAoMikgdG8gYWx3YXlzIGtlZXAKKwkgKglyYXRlXyhpKzEpIH49ICh3cml0ZV9idyAvIE4pCQkJCSAgICAgKDgpCisJICogcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgcG9zX3JhdGlvLiBBcyBsb25nIGFzICg4KSBpcyBzYXRpc2ZpZWQsCisJICogcG9zX3JhdGlvIGlzIGFibGUgdG8gZHJpdmUgaXRzZWxmIHRvIDEuMCwgd2hpY2ggaXMgbm90IG9ubHkgd2hlcmUKKwkgKiB0aGUgZGlydHkgY291bnQgbWVldCB0aGUgc2V0cG9pbnQsIGJ1dCBhbHNvIHdoZXJlIHRoZSBzbG9wZSBvZgorCSAqIHBvc19yYXRpbyBpcyBtb3N0IGZsYXQgYW5kIGhlbmNlIHRhc2tfcmF0ZWxpbWl0IGlzIGxlYXN0IGZsdWN0dWF0ZWQuCisJICovCisJYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0ID0gZGl2X3U2NCgodTY0KXRhc2tfcmF0ZWxpbWl0ICogd3JpdGVfYncsCisJCQkJCSAgIGRpcnR5X3JhdGUgfCAxKTsKKworCS8qCisJICogV2UgY291bGQgc2FmZWx5IGRvIHRoaXMgYW5kIHJldHVybiBpbW1lZGlhdGVseToKKwkgKgorCSAqCWJkaS0+ZGlydHlfcmF0ZWxpbWl0ID0gYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0OworCSAqCisJICogSG93ZXZlciB0byBnZXQgYSBtb3JlIHN0YWJsZSBkaXJ0eV9yYXRlbGltaXQsIHRoZSBiZWxvdyBlbGFib3JhdGVkCisJICogY29kZSBtYWtlcyB1c2Ugb2YgdGFza19yYXRlbGltaXQgdG8gZmlsdGVyIG91dCBzaWd1bGFyIHBvaW50cyBhbmQKKwkgKiBsaW1pdCB0aGUgc3RlcCBzaXplLgorCSAqCisJICogVGhlIGJlbG93IGNvZGUgZXNzZW50aWFsbHkgb25seSB1c2VzIHRoZSByZWxhdGl2ZSB2YWx1ZSBvZgorCSAqCisJICoJdGFza19yYXRlbGltaXQgLSBkaXJ0eV9yYXRlbGltaXQKKwkgKgk9IChwb3NfcmF0aW8gLSAxKSAqIGRpcnR5X3JhdGVsaW1pdAorCSAqCisJICogd2hpY2ggcmVmbGVjdHMgdGhlIGRpcmVjdGlvbiBhbmQgc2l6ZSBvZiBkaXJ0eSBwb3NpdGlvbiBlcnJvci4KKwkgKi8KKworCS8qCisJICogZGlydHlfcmF0ZWxpbWl0IHdpbGwgZm9sbG93IGJhbGFuY2VkX2RpcnR5X3JhdGVsaW1pdCBpZmYKKwkgKiB0YXNrX3JhdGVsaW1pdCBpcyBvbiB0aGUgc2FtZSBzaWRlIG9mIGRpcnR5X3JhdGVsaW1pdCwgdG9vLgorCSAqIEZvciBleGFtcGxlLCB3aGVuCisJICogLSBkaXJ0eV9yYXRlbGltaXQgPiBiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQKKwkgKiAtIGRpcnR5X3JhdGVsaW1pdCA+IHRhc2tfcmF0ZWxpbWl0IChkaXJ0eSBwYWdlcyBhcmUgYWJvdmUgc2V0cG9pbnQpCisJICogbG93ZXJpbmcgZGlydHlfcmF0ZWxpbWl0IHdpbGwgaGVscCBtZWV0IGJvdGggdGhlIHBvc2l0aW9uIGFuZCByYXRlCisJICogY29udHJvbCB0YXJnZXRzLiBPdGhlcndpc2UsIGRvbid0IHVwZGF0ZSBkaXJ0eV9yYXRlbGltaXQgaWYgaXQgd2lsbAorCSAqIG9ubHkgaGVscCBtZWV0IHRoZSByYXRlIHRhcmdldC4gQWZ0ZXIgYWxsLCB3aGF0IHRoZSB1c2VycyB1bHRpbWF0ZWx5CisJICogZmVlbCBhbmQgY2FyZSBhcmUgc3RhYmxlIGRpcnR5IHJhdGUgYW5kIHNtYWxsIHBvc2l0aW9uIGVycm9yLgorCSAqCisJICogfHRhc2tfcmF0ZWxpbWl0IC0gZGlydHlfcmF0ZWxpbWl0fCBpcyB1c2VkIHRvIGxpbWl0IHRoZSBzdGVwIHNpemUKKwkgKiBhbmQgZmlsdGVyIG91dCB0aGUgc2lndWxhciBwb2ludHMgb2YgYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0LiBXaGljaAorCSAqIGtlZXBzIGp1bXBpbmcgYXJvdW5kIHJhbmRvbWx5IGFuZCBjYW4gZXZlbiBsZWFwIGZhciBhd2F5IGF0IHRpbWVzCisJICogZHVlIHRvIHRoZSBzbWFsbCAyMDBtcyBlc3RpbWF0aW9uIHBlcmlvZCBvZiBkaXJ0eV9yYXRlICh3ZSB3YW50IHRvCisJICoga2VlcCB0aGF0IHBlcmlvZCBzbWFsbCB0byByZWR1Y2UgdGltZSBsYWdzKS4KKwkgKi8KKwlzdGVwID0gMDsKKwlpZiAoZGlydHkgPCBzZXRwb2ludCkgeworCQl4ID0gbWluKGJkaS0+YmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0LAorCQkJIG1pbihiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQsIHRhc2tfcmF0ZWxpbWl0KSk7CisJCWlmIChkaXJ0eV9yYXRlbGltaXQgPCB4KQorCQkJc3RlcCA9IHggLSBkaXJ0eV9yYXRlbGltaXQ7CisJfSBlbHNlIHsKKwkJeCA9IG1heChiZGktPmJhbGFuY2VkX2RpcnR5X3JhdGVsaW1pdCwKKwkJCSBtYXgoYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0LCB0YXNrX3JhdGVsaW1pdCkpOworCQlpZiAoZGlydHlfcmF0ZWxpbWl0ID4geCkKKwkJCXN0ZXAgPSBkaXJ0eV9yYXRlbGltaXQgLSB4OworCX0KKworCS8qCisJICogRG9uJ3QgcHVyc3VlIDEwMCUgcmF0ZSBtYXRjaGluZy4gSXQncyBpbXBvc3NpYmxlIHNpbmNlIHRoZSBiYWxhbmNlZAorCSAqIHJhdGUgaXRzZWxmIGlzIGNvbnN0YW50bHkgZmx1Y3R1YXRpbmcuIFNvIGRlY3JlYXNlIHRoZSB0cmFjayBzcGVlZAorCSAqIHdoZW4gaXQgZ2V0cyBjbG9zZSB0byB0aGUgdGFyZ2V0LiBIZWxwcyBlbGltaW5hdGUgcG9pbnRsZXNzIHRyZW1vcnMuCisJICovCisJc3RlcCA+Pj0gZGlydHlfcmF0ZWxpbWl0IC8gKDIgKiBzdGVwICsgMSk7CisJLyoKKwkgKiBMaW1pdCB0aGUgdHJhY2tpbmcgc3BlZWQgdG8gYXZvaWQgb3ZlcnNob290aW5nLgorCSAqLworCXN0ZXAgPSAoc3RlcCArIDcpIC8gODsKKworCWlmIChkaXJ0eV9yYXRlbGltaXQgPCBiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQpCisJCWRpcnR5X3JhdGVsaW1pdCArPSBzdGVwOworCWVsc2UKKwkJZGlydHlfcmF0ZWxpbWl0IC09IHN0ZXA7CisKKwliZGktPmRpcnR5X3JhdGVsaW1pdCA9IG1heChkaXJ0eV9yYXRlbGltaXQsIDFVTCk7CisJYmRpLT5iYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQgPSBiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQ7CisKKwl0cmFjZV9iZGlfZGlydHlfcmF0ZWxpbWl0KGJkaSwgZGlydHlfcmF0ZSwgdGFza19yYXRlbGltaXQpOworfQorCiB2b2lkIF9fYmRpX3VwZGF0ZV9iYW5kd2lkdGgoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKIAkJCSAgICB1bnNpZ25lZCBsb25nIHRocmVzaCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGJnX3RocmVzaCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGRpcnR5LAogCQkJICAgIHVuc2lnbmVkIGxvbmcgYmRpX3RocmVzaCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eSwKQEAgLTYwMCw2ICs4OTEsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAl1bnNpZ25lZCBsb25nIGVsYXBzZWQgPSBub3cgLSBiZGktPmJ3X3RpbWVfc3RhbXA7CisJdW5zaWduZWQgbG9uZyBkaXJ0aWVkOwogCXVuc2lnbmVkIGxvbmcgd3JpdHRlbjsKIAogCS8qCkBAIC02MDgsNiArOTAwLDcgQEAKIAlpZiAoZWxhcHNlZCA8IEJBTkRXSURUSF9JTlRFUlZBTCkKIAkJcmV0dXJuOwogCisJZGlydGllZCA9IHBlcmNwdV9jb3VudGVyX3JlYWQoJmJkaS0+YmRpX3N0YXRbQkRJX0RJUlRJRURdKTsKIAl3cml0dGVuID0gcGVyY3B1X2NvdW50ZXJfcmVhZCgmYmRpLT5iZGlfc3RhdFtCRElfV1JJVFRFTl0pOwogCiAJLyoKQEAgLTYxNywxOCArOTEwLDIzIEBACiAJaWYgKGVsYXBzZWQgPiBIWiAmJiB0aW1lX2JlZm9yZShiZGktPmJ3X3RpbWVfc3RhbXAsIHN0YXJ0X3RpbWUpKQogCQlnb3RvIHNuYXBzaG90OwogCi0JaWYgKHRocmVzaCkKKwlpZiAodGhyZXNoKSB7CiAJCWdsb2JhbF91cGRhdGVfYmFuZHdpZHRoKHRocmVzaCwgZGlydHksIG5vdyk7Ci0KKwkJYmRpX3VwZGF0ZV9kaXJ0eV9yYXRlbGltaXQoYmRpLCB0aHJlc2gsIGJnX3RocmVzaCwgZGlydHksCisJCQkJCSAgIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwKKwkJCQkJICAgZGlydGllZCwgZWxhcHNlZCk7CisJfQogCWJkaV91cGRhdGVfd3JpdGVfYmFuZHdpZHRoKGJkaSwgZWxhcHNlZCwgd3JpdHRlbik7CiAKIHNuYXBzaG90OgorCWJkaS0+ZGlydGllZF9zdGFtcCA9IGRpcnRpZWQ7CiAJYmRpLT53cml0dGVuX3N0YW1wID0gd3JpdHRlbjsKIAliZGktPmJ3X3RpbWVfc3RhbXAgPSBub3c7CiB9CiAKIHN0YXRpYyB2b2lkIGJkaV91cGRhdGVfYmFuZHdpZHRoKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCiAJCQkJIHVuc2lnbmVkIGxvbmcgdGhyZXNoLAorCQkJCSB1bnNpZ25lZCBsb25nIGJnX3RocmVzaCwKIAkJCQkgdW5zaWduZWQgbG9uZyBkaXJ0eSwKIAkJCQkgdW5zaWduZWQgbG9uZyBiZGlfdGhyZXNoLAogCQkJCSB1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eSwKQEAgLTYzNywzNyArOTM1LDk5IEBACiAJaWYgKHRpbWVfaXNfYWZ0ZXJfZXFfamlmZmllcyhiZGktPmJ3X3RpbWVfc3RhbXAgKyBCQU5EV0lEVEhfSU5URVJWQUwpKQogCQlyZXR1cm47CiAJc3Bpbl9sb2NrKCZiZGktPndiLmxpc3RfbG9jayk7Ci0JX19iZGlfdXBkYXRlX2JhbmR3aWR0aChiZGksIHRocmVzaCwgZGlydHksIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwKLQkJCSAgICAgICBzdGFydF90aW1lKTsKKwlfX2JkaV91cGRhdGVfYmFuZHdpZHRoKGJkaSwgdGhyZXNoLCBiZ190aHJlc2gsIGRpcnR5LAorCQkJICAgICAgIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwgc3RhcnRfdGltZSk7CiAJc3Bpbl91bmxvY2soJmJkaS0+d2IubGlzdF9sb2NrKTsKIH0KIAogLyoKKyAqIEFmdGVyIGEgdGFzayBkaXJ0aWVkIHRoaXMgbWFueSBwYWdlcywgYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucigpCisgKiB3aWxsIGxvb2sgdG8gc2VlIGlmIGl0IG5lZWRzIHRvIHN0YXJ0IGRpcnR5IHRocm90dGxpbmcuCisgKgorICogSWYgZGlydHlfcG9sbF9pbnRlcnZhbCBpcyB0b28gbG93LCBiaWcgTlVNQSBtYWNoaW5lcyB3aWxsIGNhbGwgdGhlIGV4cGVuc2l2ZQorICogZ2xvYmFsX3BhZ2Vfc3RhdGUoKSB0b28gb2Z0ZW4uIFNvIHNjYWxlIGl0IG5lYXItc3FydCB0byB0aGUgc2FmZXR5IG1hcmdpbgorICogKHRoZSBudW1iZXIgb2YgcGFnZXMgd2UgbWF5IGRpcnR5IHdpdGhvdXQgZXhjZWVkaW5nIHRoZSBkaXJ0eSBsaW1pdHMpLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJ0eV9wb2xsX2ludGVydmFsKHVuc2lnbmVkIGxvbmcgZGlydHksCisJCQkJCSB1bnNpZ25lZCBsb25nIHRocmVzaCkKK3sKKwlpZiAodGhyZXNoID4gZGlydHkpCisJCXJldHVybiAxVUwgPDwgKGlsb2cyKHRocmVzaCAtIGRpcnR5KSA+PiAxKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiZGlfbWF4X3BhdXNlKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCisJCQkJICAgdW5zaWduZWQgbG9uZyBiZGlfZGlydHkpCit7CisJdW5zaWduZWQgbG9uZyBidyA9IGJkaS0+YXZnX3dyaXRlX2JhbmR3aWR0aDsKKwl1bnNpZ25lZCBsb25nIGhpID0gaWxvZzIoYncpOworCXVuc2lnbmVkIGxvbmcgbG8gPSBpbG9nMihiZGktPmRpcnR5X3JhdGVsaW1pdCk7CisJdW5zaWduZWQgbG9uZyB0OworCisJLyogdGFyZ2V0IGZvciAyMG1zIG1heCBwYXVzZSBvbiAxLWRkIGNhc2UgKi8KKwl0ID0gSFogLyA1MDsKKworCS8qCisJICogU2NhbGUgdXAgcGF1c2UgdGltZSBmb3IgY29uY3VycmVudCBkaXJ0aWVycyBpbiBvcmRlciB0byByZWR1Y2UgQ1BVCisJICogb3ZlcmhlYWRzLgorCSAqCisJICogKE4gKiAyMG1zKSBvbiAyXk4gY29uY3VycmVudCB0YXNrcy4KKwkgKi8KKwlpZiAoaGkgPiBsbykKKwkJdCArPSAoaGkgLSBsbykgKiAoMjAgKiBIWikgLyAxMDI0OworCisJLyoKKwkgKiBMaW1pdCBwYXVzZSB0aW1lIGZvciBzbWFsbCBtZW1vcnkgc3lzdGVtcy4gSWYgc2xlZXBpbmcgZm9yIHRvbyBsb25nCisJICogdGltZSwgYSBzbWFsbCBwb29sIG9mIGRpcnR5L3dyaXRlYmFjayBwYWdlcyBtYXkgZ28gZW1wdHkgYW5kIGRpc2sgZ28KKwkgKiBpZGxlLgorCSAqCisJICogOCBzZXJ2ZXMgYXMgdGhlIHNhZmV0eSByYXRpby4KKwkgKi8KKwlpZiAoYmRpX2RpcnR5KQorCQl0ID0gbWluKHQsIGJkaV9kaXJ0eSAqIEhaIC8gKDggKiBidyArIDEpKTsKKworCS8qCisJICogVGhlIHBhdXNlIHRpbWUgd2lsbCBiZSBzZXR0bGVkIHdpdGhpbiByYW5nZSAobWF4X3BhdXNlLzQsIG1heF9wYXVzZSkuCisJICogQXBwbHkgYSBtaW5pbWFsIHZhbHVlIG9mIDQgdG8gZ2V0IGEgbm9uLXplcm8gbWF4X3BhdXNlLzQuCisJICovCisJcmV0dXJuIGNsYW1wX3ZhbCh0LCA0LCBNQVhfUEFVU0UpOworfQorCisvKgogICogYmFsYW5jZV9kaXJ0eV9wYWdlcygpIG11c3QgYmUgY2FsbGVkIGJ5IHByb2Nlc3NlcyB3aGljaCBhcmUgZ2VuZXJhdGluZyBkaXJ0eQogICogZGF0YS4gIEl0IGxvb2tzIGF0IHRoZSBudW1iZXIgb2YgZGlydHkgcGFnZXMgaW4gdGhlIG1hY2hpbmUgYW5kIHdpbGwgZm9yY2UKLSAqIHRoZSBjYWxsZXIgdG8gcGVyZm9ybSB3cml0ZWJhY2sgaWYgdGhlIHN5c3RlbSBpcyBvdmVyIGB2bV9kaXJ0eV9yYXRpbycuCisgKiB0aGUgY2FsbGVyIHRvIHdhaXQgb25jZSBjcm9zc2luZyB0aGUgKGJhY2tncm91bmRfdGhyZXNoICsgZGlydHlfdGhyZXNoKSAvIDIuCiAgKiBJZiB3ZSdyZSBvdmVyIGBiYWNrZ3JvdW5kX3RocmVzaCcgdGhlbiB0aGUgd3JpdGViYWNrIHRocmVhZHMgYXJlIHdva2VuIHRvCiAgKiBwZXJmb3JtIHNvbWUgd3JpdGVvdXQuCiAgKi8KIHN0YXRpYyB2b2lkIGJhbGFuY2VfZGlydHlfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkJdW5zaWduZWQgbG9uZyB3cml0ZV9jaHVuaykKKwkJCQl1bnNpZ25lZCBsb25nIHBhZ2VzX2RpcnRpZWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltYWJsZSwgYmRpX25yX3JlY2xhaW1hYmxlOworCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWFibGU7CS8qID0gZmlsZV9kaXJ0eSArIHVuc3RhYmxlX25mcyAqLworCXVuc2lnbmVkIGxvbmcgYmRpX3JlY2xhaW1hYmxlOwogCXVuc2lnbmVkIGxvbmcgbnJfZGlydHk7ICAvKiA9IGZpbGVfZGlydHkgKyB3cml0ZWJhY2sgKyB1bnN0YWJsZV9uZnMgKi8KIAl1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eTsKKwl1bnNpZ25lZCBsb25nIGZyZWVydW47CiAJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKIAl1bnNpZ25lZCBsb25nIGRpcnR5X3RocmVzaDsKIAl1bnNpZ25lZCBsb25nIGJkaV90aHJlc2g7Ci0JdW5zaWduZWQgbG9uZyB0YXNrX2JkaV90aHJlc2g7Ci0JdW5zaWduZWQgbG9uZyBtaW5fdGFza19iZGlfdGhyZXNoOwotCXVuc2lnbmVkIGxvbmcgcGFnZXNfd3JpdHRlbiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBwYXVzZSA9IDE7CisJbG9uZyBwYXVzZSA9IDA7CisJbG9uZyB1bmluaXRpYWxpemVkX3ZhcihtYXhfcGF1c2UpOwogCWJvb2wgZGlydHlfZXhjZWVkZWQgPSBmYWxzZTsKLQlib29sIGNsZWFyX2RpcnR5X2V4Y2VlZGVkID0gdHJ1ZTsKKwl1bnNpZ25lZCBsb25nIHRhc2tfcmF0ZWxpbWl0OworCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZGlydHlfcmF0ZWxpbWl0KTsKKwl1bnNpZ25lZCBsb25nIHBvc19yYXRpbzsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpID0gbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCiAJZm9yICg7OykgeworCQkvKgorCQkgKiBVbnN0YWJsZSB3cml0ZXMgYXJlIGEgZmVhdHVyZSBvZiBjZXJ0YWluIG5ldHdvcmtlZAorCQkgKiBmaWxlc3lzdGVtcyAoaS5lLiBORlMpIGluIHdoaWNoIGRhdGEgbWF5IGhhdmUgYmVlbgorCQkgKiB3cml0dGVuIHRvIHRoZSBzZXJ2ZXIncyB3cml0ZSBjYWNoZSwgYnV0IGhhcyBub3QgeWV0CisJCSAqIGJlZW4gZmx1c2hlZCB0byBwZXJtYW5lbnQgc3RvcmFnZS4KKwkJICovCiAJCW5yX3JlY2xhaW1hYmxlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9ESVJUWSkgKwogCQkJCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9VTlNUQUJMRV9ORlMpOwogCQlucl9kaXJ0eSA9IG5yX3JlY2xhaW1hYmxlICsgZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfV1JJVEVCQUNLKTsKQEAgLTY3OSwxMiArMTAzOSwyOCBAQAogCQkgKiBjYXRjaC11cC4gVGhpcyBhdm9pZHMgKGV4Y2Vzc2l2ZWx5KSBzbWFsbCB3cml0ZW91dHMKIAkJICogd2hlbiB0aGUgYmRpIGxpbWl0cyBhcmUgcmFtcGluZyB1cC4KIAkJICovCi0JCWlmIChucl9kaXJ0eSA8PSAoYmFja2dyb3VuZF90aHJlc2ggKyBkaXJ0eV90aHJlc2gpIC8gMikKKwkJZnJlZXJ1biA9IGRpcnR5X2ZyZWVydW5fY2VpbGluZyhkaXJ0eV90aHJlc2gsCisJCQkJCQliYWNrZ3JvdW5kX3RocmVzaCk7CisJCWlmIChucl9kaXJ0eSA8PSBmcmVlcnVuKQogCQkJYnJlYWs7CiAKKwkJaWYgKHVubGlrZWx5KCF3cml0ZWJhY2tfaW5fcHJvZ3Jlc3MoYmRpKSkpCisJCQliZGlfc3RhcnRfYmFja2dyb3VuZF93cml0ZWJhY2soYmRpKTsKKworCQkvKgorCQkgKiBiZGlfdGhyZXNoIGlzIG5vdCB0cmVhdGVkIGFzIHNvbWUgbGltaXRpbmcgZmFjdG9yIGFzCisJCSAqIGRpcnR5X3RocmVzaCwgZHVlIHRvIHJlYXNvbnMKKwkJICogLSBpbiBKQk9EIHNldHVwLCBiZGlfdGhyZXNoIGNhbiBmbHVjdHVhdGUgYSBsb3QKKwkJICogLSBpbiBhIHN5c3RlbSB3aXRoIEhERCBhbmQgVVNCIGtleSwgdGhlIFVTQiBrZXkgbWF5IHNvbWVob3cKKwkJICogICBnbyBpbnRvIHN0YXRlIChiZGlfZGlydHkgPj4gYmRpX3RocmVzaCkgZWl0aGVyIGJlY2F1c2UKKwkJICogICBiZGlfZGlydHkgc3RhcnRzIGhpZ2gsIG9yIGJlY2F1c2UgYmRpX3RocmVzaCBkcm9wcyBsb3cuCisJCSAqICAgSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gaGFyZCB0aHJvdHRsZSB0aGUgVVNCIGtleQorCQkgKiAgIGRpcnRpZXJzIGZvciAxMDAgc2Vjb25kcyB1bnRpbCBiZGlfZGlydHkgZHJvcHMgdW5kZXIKKwkJICogICBiZGlfdGhyZXNoLiBJbnN0ZWFkIHRoZSBhdXhpbGlhcnkgYmRpIGNvbnRyb2wgbGluZSBpbgorCQkgKiAgIGJkaV9wb3NpdGlvbl9yYXRpbygpIHdpbGwgbGV0IHRoZSBkaXJ0aWVyIHRhc2sgcHJvZ3Jlc3MKKwkJICogICBhdCBzb21lIHJhdGUgPD0gKHdyaXRlX2J3IC8gMikgZm9yIGJyaW5naW5nIGRvd24gYmRpX2RpcnR5LgorCQkgKi8KIAkJYmRpX3RocmVzaCA9IGJkaV9kaXJ0eV9saW1pdChiZGksIGRpcnR5X3RocmVzaCk7Ci0JCW1pbl90YXNrX2JkaV90aHJlc2ggPSB0YXNrX21pbl9kaXJ0eV9saW1pdChiZGlfdGhyZXNoKTsKLQkJdGFza19iZGlfdGhyZXNoID0gdGFza19kaXJ0eV9saW1pdChjdXJyZW50LCBiZGlfdGhyZXNoKTsKIAogCQkvKgogCQkgKiBJbiBvcmRlciB0byBhdm9pZCB0aGUgc3RhY2tlZCBCREkgZGVhZGxvY2sgd2UgbmVlZApAQCAtNjk2LDU2ICsxMDcyLDY5IEBACiAJCSAqIGFjdHVhbGx5IGRpcnR5OyB3aXRoIG0rbiBzaXR0aW5nIGluIHRoZSBwZXJjcHUKIAkJICogZGVsdGFzLgogCQkgKi8KLQkJaWYgKHRhc2tfYmRpX3RocmVzaCA8IDIgKiBiZGlfc3RhdF9lcnJvcihiZGkpKSB7Ci0JCQliZGlfbnJfcmVjbGFpbWFibGUgPSBiZGlfc3RhdF9zdW0oYmRpLCBCRElfUkVDTEFJTUFCTEUpOwotCQkJYmRpX2RpcnR5ID0gYmRpX25yX3JlY2xhaW1hYmxlICsKKwkJaWYgKGJkaV90aHJlc2ggPCAyICogYmRpX3N0YXRfZXJyb3IoYmRpKSkgeworCQkJYmRpX3JlY2xhaW1hYmxlID0gYmRpX3N0YXRfc3VtKGJkaSwgQkRJX1JFQ0xBSU1BQkxFKTsKKwkJCWJkaV9kaXJ0eSA9IGJkaV9yZWNsYWltYWJsZSArCiAJCQkJICAgIGJkaV9zdGF0X3N1bShiZGksIEJESV9XUklURUJBQ0spOwogCQl9IGVsc2UgewotCQkJYmRpX25yX3JlY2xhaW1hYmxlID0gYmRpX3N0YXQoYmRpLCBCRElfUkVDTEFJTUFCTEUpOwotCQkJYmRpX2RpcnR5ID0gYmRpX25yX3JlY2xhaW1hYmxlICsKKwkJCWJkaV9yZWNsYWltYWJsZSA9IGJkaV9zdGF0KGJkaSwgQkRJX1JFQ0xBSU1BQkxFKTsKKwkJCWJkaV9kaXJ0eSA9IGJkaV9yZWNsYWltYWJsZSArCiAJCQkJICAgIGJkaV9zdGF0KGJkaSwgQkRJX1dSSVRFQkFDSyk7CiAJCX0KIAotCQkvKgotCQkgKiBUaGUgYmRpIHRocmVzaCBpcyBzb21laG93ICJzb2Z0IiBsaW1pdCBkZXJpdmVkIGZyb20gdGhlCi0JCSAqIGdsb2JhbCAiaGFyZCIgbGltaXQuIFRoZSBmb3JtZXIgaGVscHMgdG8gcHJldmVudCBoZWF2eSBJTwotCQkgKiBiZGkgb3IgcHJvY2VzcyBmcm9tIGhvbGRpbmcgYmFjayBsaWdodCBvbmVzOyBUaGUgbGF0dGVyIGlzCi0JCSAqIHRoZSBsYXN0IHJlc29ydCBzYWZlZ3VhcmQuCi0JCSAqLwotCQlkaXJ0eV9leGNlZWRlZCA9IChiZGlfZGlydHkgPiB0YXNrX2JkaV90aHJlc2gpIHx8CisJCWRpcnR5X2V4Y2VlZGVkID0gKGJkaV9kaXJ0eSA+IGJkaV90aHJlc2gpIHx8CiAJCQkJICAobnJfZGlydHkgPiBkaXJ0eV90aHJlc2gpOwotCQljbGVhcl9kaXJ0eV9leGNlZWRlZCA9IChiZGlfZGlydHkgPD0gbWluX3Rhc2tfYmRpX3RocmVzaCkgJiYKLQkJCQkJKG5yX2RpcnR5IDw9IGRpcnR5X3RocmVzaCk7Ci0KLQkJaWYgKCFkaXJ0eV9leGNlZWRlZCkKLQkJCWJyZWFrOwotCi0JCWlmICghYmRpLT5kaXJ0eV9leGNlZWRlZCkKKwkJaWYgKGRpcnR5X2V4Y2VlZGVkICYmICFiZGktPmRpcnR5X2V4Y2VlZGVkKQogCQkJYmRpLT5kaXJ0eV9leGNlZWRlZCA9IDE7CiAKLQkJYmRpX3VwZGF0ZV9iYW5kd2lkdGgoYmRpLCBkaXJ0eV90aHJlc2gsIG5yX2RpcnR5LAotCQkJCSAgICAgYmRpX3RocmVzaCwgYmRpX2RpcnR5LCBzdGFydF90aW1lKTsKKwkJYmRpX3VwZGF0ZV9iYW5kd2lkdGgoYmRpLCBkaXJ0eV90aHJlc2gsIGJhY2tncm91bmRfdGhyZXNoLAorCQkJCSAgICAgbnJfZGlydHksIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwKKwkJCQkgICAgIHN0YXJ0X3RpbWUpOwogCi0JCS8qIE5vdGU6IG5yX3JlY2xhaW1hYmxlIGRlbm90ZXMgbnJfZGlydHkgKyBucl91bnN0YWJsZS4KLQkJICogVW5zdGFibGUgd3JpdGVzIGFyZSBhIGZlYXR1cmUgb2YgY2VydGFpbiBuZXR3b3JrZWQKLQkJICogZmlsZXN5c3RlbXMgKGkuZS4gTkZTKSBpbiB3aGljaCBkYXRhIG1heSBoYXZlIGJlZW4KLQkJICogd3JpdHRlbiB0byB0aGUgc2VydmVyJ3Mgd3JpdGUgY2FjaGUsIGJ1dCBoYXMgbm90IHlldAotCQkgKiBiZWVuIGZsdXNoZWQgdG8gcGVybWFuZW50IHN0b3JhZ2UuCi0JCSAqIE9ubHkgbW92ZSBwYWdlcyB0byB3cml0ZWJhY2sgaWYgdGhpcyBiZGkgaXMgb3ZlciBpdHMKLQkJICogdGhyZXNob2xkIG90aGVyd2lzZSB3YWl0IHVudGlsIHRoZSBkaXNrIHdyaXRlcyBjYXRjaAotCQkgKiB1cC4KLQkJICovCi0JCXRyYWNlX2JhbGFuY2VfZGlydHlfc3RhcnQoYmRpKTsKLQkJaWYgKGJkaV9ucl9yZWNsYWltYWJsZSA+IHRhc2tfYmRpX3RocmVzaCkgewotCQkJcGFnZXNfd3JpdHRlbiArPSB3cml0ZWJhY2tfaW5vZGVzX3diKCZiZGktPndiLAotCQkJCQkJCSAgICAgd3JpdGVfY2h1bmspOwotCQkJdHJhY2VfYmFsYW5jZV9kaXJ0eV93cml0dGVuKGJkaSwgcGFnZXNfd3JpdHRlbik7Ci0JCQlpZiAocGFnZXNfd3JpdHRlbiA+PSB3cml0ZV9jaHVuaykKLQkJCQlicmVhazsJCS8qIFdlJ3ZlIGRvbmUgb3VyIGR1dHkgKi8KKwkJbWF4X3BhdXNlID0gYmRpX21heF9wYXVzZShiZGksIGJkaV9kaXJ0eSk7CisKKwkJZGlydHlfcmF0ZWxpbWl0ID0gYmRpLT5kaXJ0eV9yYXRlbGltaXQ7CisJCXBvc19yYXRpbyA9IGJkaV9wb3NpdGlvbl9yYXRpbyhiZGksIGRpcnR5X3RocmVzaCwKKwkJCQkJICAgICAgIGJhY2tncm91bmRfdGhyZXNoLCBucl9kaXJ0eSwKKwkJCQkJICAgICAgIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSk7CisJCXRhc2tfcmF0ZWxpbWl0ID0gKCh1NjQpZGlydHlfcmF0ZWxpbWl0ICogcG9zX3JhdGlvKSA+PgorCQkJCQkJCVJBVEVMSU1JVF9DQUxDX1NISUZUOworCQlpZiAodW5saWtlbHkodGFza19yYXRlbGltaXQgPT0gMCkpIHsKKwkJCXBhdXNlID0gbWF4X3BhdXNlOworCQkJZ290byBwYXVzZTsKIAkJfQorCQlwYXVzZSA9IEhaICogcGFnZXNfZGlydGllZCAvIHRhc2tfcmF0ZWxpbWl0OworCQlpZiAodW5saWtlbHkocGF1c2UgPD0gMCkpIHsKKwkJCXRyYWNlX2JhbGFuY2VfZGlydHlfcGFnZXMoYmRpLAorCQkJCQkJICBkaXJ0eV90aHJlc2gsCisJCQkJCQkgIGJhY2tncm91bmRfdGhyZXNoLAorCQkJCQkJICBucl9kaXJ0eSwKKwkJCQkJCSAgYmRpX3RocmVzaCwKKwkJCQkJCSAgYmRpX2RpcnR5LAorCQkJCQkJICBkaXJ0eV9yYXRlbGltaXQsCisJCQkJCQkgIHRhc2tfcmF0ZWxpbWl0LAorCQkJCQkJICBwYWdlc19kaXJ0aWVkLAorCQkJCQkJICBwYXVzZSwKKwkJCQkJCSAgc3RhcnRfdGltZSk7CisJCQlwYXVzZSA9IDE7IC8qIGF2b2lkIHJlc2V0dGluZyBucl9kaXJ0aWVkX3BhdXNlIGJlbG93ICovCisJCQlicmVhazsKKwkJfQorCQlwYXVzZSA9IG1pbihwYXVzZSwgbWF4X3BhdXNlKTsKKworcGF1c2U6CisJCXRyYWNlX2JhbGFuY2VfZGlydHlfcGFnZXMoYmRpLAorCQkJCQkgIGRpcnR5X3RocmVzaCwKKwkJCQkJICBiYWNrZ3JvdW5kX3RocmVzaCwKKwkJCQkJICBucl9kaXJ0eSwKKwkJCQkJICBiZGlfdGhyZXNoLAorCQkJCQkgIGJkaV9kaXJ0eSwKKwkJCQkJICBkaXJ0eV9yYXRlbGltaXQsCisJCQkJCSAgdGFza19yYXRlbGltaXQsCisJCQkJCSAgcGFnZXNfZGlydGllZCwKKwkJCQkJICBwYXVzZSwKKwkJCQkJICBzdGFydF90aW1lKTsKIAkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCWlvX3NjaGVkdWxlX3RpbWVvdXQocGF1c2UpOwotCQl0cmFjZV9iYWxhbmNlX2RpcnR5X3dhaXQoYmRpKTsKIAogCQlkaXJ0eV90aHJlc2ggPSBoYXJkX2RpcnR5X2xpbWl0KGRpcnR5X3RocmVzaCk7CiAJCS8qCkBAIC03NTQsMjQgKzExNDMsMzAgQEAKIAkJICogMjAwbXMgaXMgdHlwaWNhbGx5IG1vcmUgdGhhbiBlbm91Z2ggdG8gY3VyYiBoZWF2eSBkaXJ0aWVyczsKIAkJICogKGIpIHRoZSBwYXVzZSB0aW1lIGxpbWl0IG1ha2VzIHRoZSBkaXJ0aWVycyBtb3JlIHJlc3BvbnNpdmUuCiAJCSAqLwotCQlpZiAobnJfZGlydHkgPCBkaXJ0eV90aHJlc2ggJiYKLQkJICAgIGJkaV9kaXJ0eSA8ICh0YXNrX2JkaV90aHJlc2ggKyBiZGlfdGhyZXNoKSAvIDIgJiYKLQkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnRfdGltZSArIE1BWF9QQVVTRSkpCisJCWlmIChucl9kaXJ0eSA8IGRpcnR5X3RocmVzaCkKIAkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIEluY3JlYXNlIHRoZSBkZWxheSBmb3IgZWFjaCBsb29wLCB1cCB0byBvdXIgcHJldmlvdXMKLQkJICogZGVmYXVsdCBvZiB0YWtpbmcgYSAxMDBtcyBuYXAuCi0JCSAqLwotCQlwYXVzZSA8PD0gMTsKLQkJaWYgKHBhdXNlID4gSFogLyAxMCkKLQkJCXBhdXNlID0gSFogLyAxMDsKIAl9CiAKLQkvKiBDbGVhciBkaXJ0eV9leGNlZWRlZCBmbGFnIG9ubHkgd2hlbiBubyB0YXNrIGNhbiBleGNlZWQgdGhlIGxpbWl0ICovCi0JaWYgKGNsZWFyX2RpcnR5X2V4Y2VlZGVkICYmIGJkaS0+ZGlydHlfZXhjZWVkZWQpCisJaWYgKCFkaXJ0eV9leGNlZWRlZCAmJiBiZGktPmRpcnR5X2V4Y2VlZGVkKQogCQliZGktPmRpcnR5X2V4Y2VlZGVkID0gMDsKIAorCWN1cnJlbnQtPm5yX2RpcnRpZWQgPSAwOworCWlmIChwYXVzZSA9PSAwKSB7IC8qIGluIGZyZWVydW4gYXJlYSAqLworCQljdXJyZW50LT5ucl9kaXJ0aWVkX3BhdXNlID0KKwkJCQlkaXJ0eV9wb2xsX2ludGVydmFsKG5yX2RpcnR5LCBkaXJ0eV90aHJlc2gpOworCX0gZWxzZSBpZiAocGF1c2UgPD0gbWF4X3BhdXNlIC8gNCAmJgorCQkgICBwYWdlc19kaXJ0aWVkID49IGN1cnJlbnQtPm5yX2RpcnRpZWRfcGF1c2UpIHsKKwkJY3VycmVudC0+bnJfZGlydGllZF9wYXVzZSA9IGNsYW1wX3ZhbCgKKwkJCQkJZGlydHlfcmF0ZWxpbWl0ICogKG1heF9wYXVzZSAvIDIpIC8gSFosCisJCQkJCXBhZ2VzX2RpcnRpZWQgKyBwYWdlc19kaXJ0aWVkIC8gOCwKKwkJCQkJcGFnZXNfZGlydGllZCAqIDQpOworCX0gZWxzZSBpZiAocGF1c2UgPj0gbWF4X3BhdXNlKSB7CisJCWN1cnJlbnQtPm5yX2RpcnRpZWRfcGF1c2UgPSAxIHwgY2xhbXBfdmFsKAorCQkJCQlkaXJ0eV9yYXRlbGltaXQgKiAobWF4X3BhdXNlIC8gMikgLyBIWiwKKwkJCQkJcGFnZXNfZGlydGllZCAvIDQsCisJCQkJCXBhZ2VzX2RpcnRpZWQgLSBwYWdlc19kaXJ0aWVkIC8gOCk7CisJfQorCiAJaWYgKHdyaXRlYmFja19pbl9wcm9ncmVzcyhiZGkpKQogCQlyZXR1cm47CiAKQEAgLTc4Myw4ICsxMTc4LDEwIEBACiAJICogSW4gbm9ybWFsIG1vZGUsIHdlIHN0YXJ0IGJhY2tncm91bmQgd3JpdGVvdXQgYXQgdGhlIGxvd2VyCiAJICogYmFja2dyb3VuZF90aHJlc2gsIHRvIGtlZXAgdGhlIGFtb3VudCBvZiBkaXJ0eSBtZW1vcnkgbG93LgogCSAqLwotCWlmICgobGFwdG9wX21vZGUgJiYgcGFnZXNfd3JpdHRlbikgfHwKLQkgICAgKCFsYXB0b3BfbW9kZSAmJiAobnJfcmVjbGFpbWFibGUgPiBiYWNrZ3JvdW5kX3RocmVzaCkpKQorCWlmIChsYXB0b3BfbW9kZSkKKwkJcmV0dXJuOworCisJaWYgKG5yX3JlY2xhaW1hYmxlID4gYmFja2dyb3VuZF90aHJlc2gpCiAJCWJkaV9zdGFydF9iYWNrZ3JvdW5kX3dyaXRlYmFjayhiZGkpOwogfQogCkBAIC03OTgsNyArMTE5NSw3IEBACiAJfQogfQogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgYmRwX3JhdGVsaW1pdHMpID0gMDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGJkcF9yYXRlbGltaXRzKTsKIAogLyoqCiAgKiBiYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkX25yIC0gYmFsYW5jZSBkaXJ0eSBtZW1vcnkgc3RhdGUKQEAgLTgxOCwzMSArMTIxNSwzOSBAQAogCQkJCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzX2RpcnRpZWQpCiB7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87Ci0JdW5zaWduZWQgbG9uZyByYXRlbGltaXQ7Ci0JdW5zaWduZWQgbG9uZyAqcDsKKwlpbnQgcmF0ZWxpbWl0OworCWludCAqcDsKIAogCWlmICghYmRpX2NhcF9hY2NvdW50X2RpcnR5KGJkaSkpCiAJCXJldHVybjsKIAotCXJhdGVsaW1pdCA9IHJhdGVsaW1pdF9wYWdlczsKLQlpZiAobWFwcGluZy0+YmFja2luZ19kZXZfaW5mby0+ZGlydHlfZXhjZWVkZWQpCi0JCXJhdGVsaW1pdCA9IDg7CisJcmF0ZWxpbWl0ID0gY3VycmVudC0+bnJfZGlydGllZF9wYXVzZTsKKwlpZiAoYmRpLT5kaXJ0eV9leGNlZWRlZCkKKwkJcmF0ZWxpbWl0ID0gbWluKHJhdGVsaW1pdCwgMzIgPj4gKFBBR0VfU0hJRlQgLSAxMCkpOwogCi0JLyoKLQkgKiBDaGVjayB0aGUgcmF0ZSBsaW1pdGluZy4gQWxzbywgd2UgZG8gbm90IHdhbnQgdG8gdGhyb3R0bGUgcmVhbC10aW1lCi0JICogdGFza3MgaW4gYmFsYW5jZV9kaXJ0eV9wYWdlcygpLiBQZXJpb2QuCi0JICovCisJY3VycmVudC0+bnJfZGlydGllZCArPSBucl9wYWdlc19kaXJ0aWVkOworCiAJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyoKKwkgKiBUaGlzIHByZXZlbnRzIG9uZSBDUFUgdG8gYWNjdW11bGF0ZSB0b28gbWFueSBkaXJ0aWVkIHBhZ2VzIHdpdGhvdXQKKwkgKiBjYWxsaW5nIGludG8gYmFsYW5jZV9kaXJ0eV9wYWdlcygpLCB3aGljaCBjYW4gaGFwcGVuIHdoZW4gdGhlcmUgYXJlCisJICogMTAwMCsgdGFza3MsIGFsbCBvZiB0aGVtIHN0YXJ0IGRpcnR5aW5nIHBhZ2VzIGF0IGV4YWN0bHkgdGhlIHNhbWUKKwkgKiB0aW1lLCBoZW5jZSBhbGwgaG9ub3VyZWQgdG9vIGxhcmdlIGluaXRpYWwgdGFzay0+bnJfZGlydGllZF9wYXVzZS4KKwkgKi8KIAlwID0gICZfX2dldF9jcHVfdmFyKGJkcF9yYXRlbGltaXRzKTsKLQkqcCArPSBucl9wYWdlc19kaXJ0aWVkOwotCWlmICh1bmxpa2VseSgqcCA+PSByYXRlbGltaXQpKSB7Ci0JCXJhdGVsaW1pdCA9IHN5bmNfd3JpdGViYWNrX3BhZ2VzKCpwKTsKKwlpZiAodW5saWtlbHkoY3VycmVudC0+bnJfZGlydGllZCA+PSByYXRlbGltaXQpKQogCQkqcCA9IDA7Ci0JCXByZWVtcHRfZW5hYmxlKCk7Ci0JCWJhbGFuY2VfZGlydHlfcGFnZXMobWFwcGluZywgcmF0ZWxpbWl0KTsKLQkJcmV0dXJuOworCWVsc2UgeworCQkqcCArPSBucl9wYWdlc19kaXJ0aWVkOworCQlpZiAodW5saWtlbHkoKnAgPj0gcmF0ZWxpbWl0X3BhZ2VzKSkgeworCQkJKnAgPSAwOworCQkJcmF0ZWxpbWl0ID0gMDsKKwkJfQogCX0KIAlwcmVlbXB0X2VuYWJsZSgpOworCisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPm5yX2RpcnRpZWQgPj0gcmF0ZWxpbWl0KSkKKwkJYmFsYW5jZV9kaXJ0eV9wYWdlcyhtYXBwaW5nLCBjdXJyZW50LT5ucl9kaXJ0aWVkKTsKIH0KIEVYUE9SVF9TWU1CT0woYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucik7CiAKQEAgLTg5OCw3ICsxMzAzLDggQEAKIAkgKiB0aHJlc2hvbGQKIAkgKi8KIAlpZiAoYmRpX2hhc19kaXJ0eV9pbygmcS0+YmFja2luZ19kZXZfaW5mbykpCi0JCWJkaV9zdGFydF93cml0ZWJhY2soJnEtPmJhY2tpbmdfZGV2X2luZm8sIG5yX3BhZ2VzKTsKKwkJYmRpX3N0YXJ0X3dyaXRlYmFjaygmcS0+YmFja2luZ19kZXZfaW5mbywgbnJfcGFnZXMsCisJCQkJCVdCX1JFQVNPTl9MQVBUT1BfVElNRVIpOwogfQogCiAvKgpAQCAtOTM3LDIyICsxMzQzLDE3IEBACiAgKgogICogSGVyZSB3ZSBzZXQgcmF0ZWxpbWl0X3BhZ2VzIHRvIGEgbGV2ZWwgd2hpY2ggZW5zdXJlcyB0aGF0IHdoZW4gYWxsIENQVXMgYXJlCiAgKiBkaXJ0eWluZyBpbiBwYXJhbGxlbCwgd2UgY2Fubm90IGdvIG1vcmUgdGhhbiAzJSAoMS8zMikgb3ZlciB0aGUgZGlydHkgbWVtb3J5Ci0gKiB0aHJlc2hvbGRzIGJlZm9yZSB3cml0ZWJhY2sgY3V0cyBpbi4KLSAqCi0gKiBCdXQgdGhlIGxpbWl0IHNob3VsZCBub3QgYmUgc2V0IHRvbyBoaWdoLiAgQmVjYXVzZSBpdCBhbHNvIGNvbnRyb2xzIHRoZQotICogYW1vdW50IG9mIG1lbW9yeSB3aGljaCB0aGUgYmFsYW5jZV9kaXJ0eV9wYWdlcygpIGNhbGxlciBoYXMgdG8gd3JpdGUgYmFjay4KLSAqIElmIHRoaXMgaXMgdG9vIGxhcmdlIHRoZW4gdGhlIGNhbGxlciB3aWxsIGJsb2NrIG9uIHRoZSBJTyBxdWV1ZSBhbGwgdGhlCi0gKiB0aW1lLiAgU28gbGltaXQgaXQgdG8gZm91ciBtZWdhYnl0ZXMgLSB0aGUgYmFsYW5jZV9kaXJ0eV9wYWdlcygpIGNhbGxlcgotICogd2lsbCB3cml0ZSBzaXggbWVnYWJ5dGUgY2h1bmtzLCBtYXguCisgKiB0aHJlc2hvbGRzLgogICovCiAKIHZvaWQgd3JpdGViYWNrX3NldF9yYXRlbGltaXQodm9pZCkKIHsKLQlyYXRlbGltaXRfcGFnZXMgPSB2bV90b3RhbF9wYWdlcyAvIChudW1fb25saW5lX2NwdXMoKSAqIDMyKTsKKwl1bnNpZ25lZCBsb25nIGJhY2tncm91bmRfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgZGlydHlfdGhyZXNoOworCWdsb2JhbF9kaXJ0eV9saW1pdHMoJmJhY2tncm91bmRfdGhyZXNoLCAmZGlydHlfdGhyZXNoKTsKKwlyYXRlbGltaXRfcGFnZXMgPSBkaXJ0eV90aHJlc2ggLyAobnVtX29ubGluZV9jcHVzKCkgKiAzMik7CiAJaWYgKHJhdGVsaW1pdF9wYWdlcyA8IDE2KQogCQlyYXRlbGltaXRfcGFnZXMgPSAxNjsKLQlpZiAocmF0ZWxpbWl0X3BhZ2VzICogUEFHRV9DQUNIRV9TSVpFID4gNDA5NiAqIDEwMjQpCi0JCXJhdGVsaW1pdF9wYWdlcyA9ICg0MDk2ICogMTAyNCkgLyBQQUdFX0NBQ0hFX1NJWkU7CiB9CiAKIHN0YXRpYyBpbnQgX19jcHVpbml0CkBAIC0xMzIyLDYgKzE3MjMsNyBAQAogCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9ESVJUWSk7CiAJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9ESVJUSUVEKTsKIAkJX19pbmNfYmRpX3N0YXQobWFwcGluZy0+YmFja2luZ19kZXZfaW5mbywgQkRJX1JFQ0xBSU1BQkxFKTsKKwkJX19pbmNfYmRpX3N0YXQobWFwcGluZy0+YmFja2luZ19kZXZfaW5mbywgQkRJX0RJUlRJRUQpOwogCQl0YXNrX2RpcnR5X2luYyhjdXJyZW50KTsKIAkJdGFza19pb19hY2NvdW50X3dyaXRlKFBBR0VfQ0FDSEVfU0laRSk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDZlOGVjYjYuLjlkZDQ0M2QgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTMxOCw2ICszMTgsNyBAQAogCQljdXJyZW50LT5jb21tLCBwYWdlX3RvX3BmbihwYWdlKSk7CiAJZHVtcF9wYWdlKHBhZ2UpOwogCisJcHJpbnRfbW9kdWxlcygpOwogCWR1bXBfc3RhY2soKTsKIG91dDoKIAkvKiBMZWF2ZSBiYWQgZmllbGRzIGZvciBkZWJ1ZywgZXhjZXB0IFBhZ2VCdWRkeSBjb3VsZCBtYWtlIHRyb3VibGUgKi8KQEAgLTE3NTMsNyArMTc1NCw2IEBACiAKIHZvaWQgd2Fybl9hbGxvY19mYWlsZWQoZ2ZwX3QgZ2ZwX21hc2ssIGludCBvcmRlciwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0JdmFfbGlzdCBhcmdzOwogCXVuc2lnbmVkIGludCBmaWx0ZXIgPSBTSE9XX01FTV9GSUxURVJfTk9ERVM7CiAKIAlpZiAoKGdmcF9tYXNrICYgX19HRlBfTk9XQVJOKSB8fCAhX19yYXRlbGltaXQoJm5vcGFnZV9ycykpCkBAIC0xNzcyLDE0ICsxNzcyLDIxIEBACiAJCWZpbHRlciAmPSB+U0hPV19NRU1fRklMVEVSX05PREVTOwogCiAJaWYgKGZtdCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HKTsKKwkJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CisJCXZhX2xpc3QgYXJnczsKKwogCQl2YV9zdGFydChhcmdzLCBmbXQpOwotCQl2cHJpbnRrKGZtdCwgYXJncyk7CisKKwkJdmFmLmZtdCA9IGZtdDsKKwkJdmFmLnZhID0gJmFyZ3M7CisKKwkJcHJfd2FybigiJXBWIiwgJnZhZik7CisKIAkJdmFfZW5kKGFyZ3MpOwogCX0KIAotCXByX3dhcm5pbmcoIiVzOiBwYWdlIGFsbG9jYXRpb24gZmFpbHVyZTogb3JkZXI6JWQsIG1vZGU6MHgleFxuIiwKLQkJICAgY3VycmVudC0+Y29tbSwgb3JkZXIsIGdmcF9tYXNrKTsKKwlwcl93YXJuKCIlczogcGFnZSBhbGxvY2F0aW9uIGZhaWx1cmU6IG9yZGVyOiVkLCBtb2RlOjB4JXhcbiIsCisJCWN1cnJlbnQtPmNvbW0sIG9yZGVyLCBnZnBfbWFzayk7CiAKIAlkdW1wX3N0YWNrKCk7CiAJaWYgKCFzaG91bGRfc3VwcHJlc3Nfc2hvd19tZW0oKSkKZGlmZiAtLWdpdCBhL21tL3BhZ2VfY2dyb3VwLmMgYi9tbS9wYWdlX2Nncm91cC5jCmluZGV4IDZiZGM2N2QuLjJkMTIzZjkgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfY2dyb3VwLmMKKysrIGIvbW0vcGFnZV9jZ3JvdXAuYwpAQCAtMTMzLDEwICsxMzMsMTMgQEAKIHN0YXRpYyB2b2lkICpfX21lbWluaXQgYWxsb2NfcGFnZV9jZ3JvdXAoc2l6ZV90IHNpemUsIGludCBuaWQpCiB7CiAJdm9pZCAqYWRkciA9IE5VTEw7CisJZ2ZwX3QgZmxhZ3MgPSBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOOwogCi0JYWRkciA9IGFsbG9jX3BhZ2VzX2V4YWN0X25pZChuaWQsIHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pOwotCWlmIChhZGRyKQorCWFkZHIgPSBhbGxvY19wYWdlc19leGFjdF9uaWQobmlkLCBzaXplLCBmbGFncyk7CisJaWYgKGFkZHIpIHsKKwkJa21lbWxlYWtfYWxsb2MoYWRkciwgc2l6ZSwgMSwgZmxhZ3MpOwogCQlyZXR1cm4gYWRkcjsKKwl9CiAKIAlpZiAobm9kZV9zdGF0ZShuaWQsIE5fSElHSF9NRU1PUlkpKQogCQlhZGRyID0gdm1hbGxvY19ub2RlKHNpemUsIG5pZCk7CkBAIC0zNTcsNyArMzYwLDcgQEAKIAlzcGlubG9ja190CWxvY2s7CiB9OwogCi1zdHJ1Y3Qgc3dhcF9jZ3JvdXBfY3RybCBzd2FwX2Nncm91cF9jdHJsW01BWF9TV0FQRklMRVNdOworc3RhdGljIHN0cnVjdCBzd2FwX2Nncm91cF9jdHJsIHN3YXBfY2dyb3VwX2N0cmxbTUFYX1NXQVBGSUxFU107CiAKIHN0cnVjdCBzd2FwX2Nncm91cCB7CiAJdW5zaWduZWQgc2hvcnQJCWlkOwpkaWZmIC0tZ2l0IGEvbW0vcHJvY2Vzc192bV9hY2Nlc3MuYyBiL21tL3Byb2Nlc3Nfdm1fYWNjZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyMGFhMwotLS0gL2Rldi9udWxsCisrKyBiL21tL3Byb2Nlc3Nfdm1fYWNjZXNzLmMKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBsaW51eC9tbS9wcm9jZXNzX3ZtX2FjY2Vzcy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgQ2hyaXN0b3BoZXIgWWVvaCA8Y3llb2hAYXUxLmlibS5jb20+LCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2VuZGlmCisKKy8qKgorICogcHJvY2Vzc192bV9yd19wYWdlcyAtIHJlYWQvd3JpdGUgcGFnZXMgZnJvbSB0YXNrIHNwZWNpZmllZAorICogQHRhc2s6IHRhc2sgdG8gcmVhZC93cml0ZSBmcm9tCisgKiBAbW06IG1tIGZvciB0YXNrCisgKiBAcHJvY2Vzc19wYWdlczogc3RydWN0IHBhZ2VzIGFyZWEgdGhhdCBjYW4gc3RvcmUgYXQgbGVhc3QKKyAqICBucl9wYWdlc190b19jb3B5IHN0cnVjdCBwYWdlIHBvaW50ZXJzCisgKiBAcGE6IGFkZHJlc3Mgb2YgcGFnZSBpbiB0YXNrIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbS90bworICogQHN0YXJ0X29mZnNldDogb2Zmc2V0IGluIHBhZ2UgdG8gc3RhcnQgY29weWluZyBmcm9tL3RvCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICogQGx2ZWM6IGlvdmVjIGFycmF5IHNwZWNpZnlpbmcgd2hlcmUgdG8gY29weSB0by9mcm9tCisgKiBAbHZlY19jbnQ6IG51bWJlciBvZiBlbGVtZW50cyBpbiBpb3ZlYyBhcnJheQorICogQGx2ZWNfY3VycmVudDogaW5kZXggaW4gaW92ZWMgYXJyYXkgd2UgYXJlIHVwIHRvCisgKiBAbHZlY19vZmZzZXQ6IG9mZnNldCBpbiBieXRlcyBmcm9tIGN1cnJlbnQgaW92ZWMgaW92X2Jhc2Ugd2UgYXJlIHVwIHRvCisgKiBAdm1fd3JpdGU6IDAgbWVhbnMgY29weSBmcm9tLCAxIG1lYW5zIGNvcHkgdG8KKyAqIEBucl9wYWdlc190b19jb3B5OiBudW1iZXIgb2YgcGFnZXMgdG8gY29weQorICogQGJ5dGVzX2NvcGllZDogcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5IGNvcGllZAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc192bV9yd19wYWdlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkgICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkgICAgICAgc3RydWN0IHBhZ2UgKipwcm9jZXNzX3BhZ2VzLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcGEsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9vZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICpsdmVjLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbHZlY19jbnQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbHZlY19jdXJyZW50LAorCQkJICAgICAgIHNpemVfdCAqbHZlY19vZmZzZXQsCisJCQkgICAgICAgaW50IHZtX3dyaXRlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBucl9wYWdlc190b19jb3B5LAorCQkJICAgICAgIHNzaXplX3QgKmJ5dGVzX2NvcGllZCkKK3sKKwlpbnQgcGFnZXNfcGlubmVkOworCXZvaWQgKnRhcmdldF9rYWRkcjsKKwlpbnQgcGdzX2NvcGllZCA9IDA7CisJaW50IGo7CisJaW50IHJldDsKKwlzc2l6ZV90IGJ5dGVzX3RvX2NvcHk7CisJc3NpemVfdCByYyA9IDA7CisKKwkqYnl0ZXNfY29waWVkID0gMDsKKworCS8qIEdldCB0aGUgcGFnZXMgd2UncmUgaW50ZXJlc3RlZCBpbiAqLworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlwYWdlc19waW5uZWQgPSBnZXRfdXNlcl9wYWdlcyh0YXNrLCBtbSwgcGEsCisJCQkJICAgICAgbnJfcGFnZXNfdG9fY29weSwKKwkJCQkgICAgICB2bV93cml0ZSwgMCwgcHJvY2Vzc19wYWdlcywgTlVMTCk7CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKworCWlmIChwYWdlc19waW5uZWQgIT0gbnJfcGFnZXNfdG9fY29weSkgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kOworCX0KKworCS8qIERvIHRoZSBjb3B5IGZvciBlYWNoIHBhZ2UgKi8KKwlmb3IgKHBnc19jb3BpZWQgPSAwOworCSAgICAgKHBnc19jb3BpZWQgPCBucl9wYWdlc190b19jb3B5KSAmJiAoKmx2ZWNfY3VycmVudCA8IGx2ZWNfY250KTsKKwkgICAgIHBnc19jb3BpZWQrKykgeworCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIG5vbiB6ZXJvIGxlbmd0aCBpb3ZlYyAqLworCQl3aGlsZSAoKmx2ZWNfY3VycmVudCA8IGx2ZWNfY250CisJCSAgICAgICAmJiBsdmVjWypsdmVjX2N1cnJlbnRdLmlvdl9sZW4gPT0gMCkKKwkJCSgqbHZlY19jdXJyZW50KSsrOworCQlpZiAoKmx2ZWNfY3VycmVudCA9PSBsdmVjX2NudCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdpbGwgY29weSBzbWFsbGVzdCBvZjoKKwkJICogLSBieXRlcyByZW1haW5pbmcgaW4gcGFnZQorCQkgKiAtIGJ5dGVzIHJlbWFpbmluZyBpbiBkZXN0aW5hdGlvbiBpb3ZlYworCQkgKi8KKwkJYnl0ZXNfdG9fY29weSA9IG1pbl90KHNzaXplX3QsIFBBR0VfU0laRSAtIHN0YXJ0X29mZnNldCwKKwkJCQkgICAgICBsZW4gLSAqYnl0ZXNfY29waWVkKTsKKwkJYnl0ZXNfdG9fY29weSA9IG1pbl90KHNzaXplX3QsIGJ5dGVzX3RvX2NvcHksCisJCQkJICAgICAgbHZlY1sqbHZlY19jdXJyZW50XS5pb3ZfbGVuCisJCQkJICAgICAgLSAqbHZlY19vZmZzZXQpOworCisJCXRhcmdldF9rYWRkciA9IGttYXAocHJvY2Vzc19wYWdlc1twZ3NfY29waWVkXSkgKyBzdGFydF9vZmZzZXQ7CisKKwkJaWYgKHZtX3dyaXRlKQorCQkJcmV0ID0gY29weV9mcm9tX3VzZXIodGFyZ2V0X2thZGRyLAorCQkJCQkgICAgIGx2ZWNbKmx2ZWNfY3VycmVudF0uaW92X2Jhc2UKKwkJCQkJICAgICArICpsdmVjX29mZnNldCwKKwkJCQkJICAgICBieXRlc190b19jb3B5KTsKKwkJZWxzZQorCQkJcmV0ID0gY29weV90b191c2VyKGx2ZWNbKmx2ZWNfY3VycmVudF0uaW92X2Jhc2UKKwkJCQkJICAgKyAqbHZlY19vZmZzZXQsCisJCQkJCSAgIHRhcmdldF9rYWRkciwgYnl0ZXNfdG9fY29weSk7CisJCWt1bm1hcChwcm9jZXNzX3BhZ2VzW3Bnc19jb3BpZWRdKTsKKwkJaWYgKHJldCkgeworCQkJKmJ5dGVzX2NvcGllZCArPSBieXRlc190b19jb3B5IC0gcmV0OworCQkJcGdzX2NvcGllZCsrOworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBlbmQ7CisJCX0KKwkJKmJ5dGVzX2NvcGllZCArPSBieXRlc190b19jb3B5OworCQkqbHZlY19vZmZzZXQgKz0gYnl0ZXNfdG9fY29weTsKKwkJaWYgKCpsdmVjX29mZnNldCA9PSBsdmVjWypsdmVjX2N1cnJlbnRdLmlvdl9sZW4pIHsKKwkJCS8qCisJCQkgKiBOZWVkIHRvIGNvcHkgcmVtYWluaW5nIHBhcnQgb2YgcGFnZSBpbnRvIHRoZQorCQkJICogbmV4dCBpb3ZlYyBpZiB0aGVyZSBhcmUgYW55IGJ5dGVzIGxlZnQgaW4gcGFnZQorCQkJICovCisJCQkoKmx2ZWNfY3VycmVudCkrKzsKKwkJCSpsdmVjX29mZnNldCA9IDA7CisJCQlzdGFydF9vZmZzZXQgPSAoc3RhcnRfb2Zmc2V0ICsgYnl0ZXNfdG9fY29weSkKKwkJCQklIFBBR0VfU0laRTsKKwkJCWlmIChzdGFydF9vZmZzZXQpCisJCQkJcGdzX2NvcGllZC0tOworCQl9IGVsc2UgeworCQkJc3RhcnRfb2Zmc2V0ID0gMDsKKwkJfQorCX0KKworZW5kOgorCWlmICh2bV93cml0ZSkgeworCQlmb3IgKGogPSAwOyBqIDwgcGFnZXNfcGlubmVkOyBqKyspIHsKKwkJCWlmIChqIDwgcGdzX2NvcGllZCkKKwkJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKHByb2Nlc3NfcGFnZXNbal0pOworCQkJcHV0X3BhZ2UocHJvY2Vzc19wYWdlc1tqXSk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGogPSAwOyBqIDwgcGFnZXNfcGlubmVkOyBqKyspCisJCQlwdXRfcGFnZShwcm9jZXNzX3BhZ2VzW2pdKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHBhZ2VzIGttYWxsb2MnZCB0byBob2xkIHN0cnVjdCBwYWdlJ3MgZHVyaW5nIGNvcHkgKi8KKyNkZWZpbmUgUFZNX01BWF9LTUFMTE9DX1BBR0VTIChQQUdFX1NJWkUgKiAyKQorCisvKioKKyAqIHByb2Nlc3Nfdm1fcndfc2luZ2xlX3ZlYyAtIHJlYWQvd3JpdGUgcGFnZXMgZnJvbSB0YXNrIHNwZWNpZmllZAorICogQGFkZHI6IHN0YXJ0IG1lbW9yeSBhZGRyZXNzIG9mIHRhcmdldCBwcm9jZXNzCisgKiBAbGVuOiBzaXplIG9mIGFyZWEgdG8gY29weSB0by9mcm9tCisgKiBAbHZlYzogaW92ZWMgYXJyYXkgc3BlY2lmeWluZyB3aGVyZSB0byBjb3B5IHRvL2Zyb20gbG9jYWxseQorICogQGx2ZWNfY250OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaW92ZWMgYXJyYXkKKyAqIEBsdmVjX2N1cnJlbnQ6IGluZGV4IGluIGlvdmVjIGFycmF5IHdlIGFyZSB1cCB0bworICogQGx2ZWNfb2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSBjdXJyZW50IGlvdmVjIGlvdl9iYXNlIHdlIGFyZSB1cCB0bworICogQHByb2Nlc3NfcGFnZXM6IHN0cnVjdCBwYWdlcyBhcmVhIHRoYXQgY2FuIHN0b3JlIGF0IGxlYXN0CisgKiAgbnJfcGFnZXNfdG9fY29weSBzdHJ1Y3QgcGFnZSBwb2ludGVycworICogQG1tOiBtbSBmb3IgdGFzaworICogQHRhc2s6IHRhc2sgdG8gcmVhZC93cml0ZSBmcm9tCisgKiBAdm1fd3JpdGU6IDAgbWVhbnMgY29weSBmcm9tLCAxIG1lYW5zIGNvcHkgdG8KKyAqIEBieXRlc19jb3BpZWQ6IHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSBjb3BpZWQKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG9uIGZhaWx1cmUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHByb2Nlc3Nfdm1fcndfc2luZ2xlX3ZlYyh1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmx2ZWMsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbHZlY19jbnQsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgKmx2ZWNfY3VycmVudCwKKwkJCQkgICAgc2l6ZV90ICpsdmVjX29mZnNldCwKKwkJCQkgICAgc3RydWN0IHBhZ2UgKipwcm9jZXNzX3BhZ2VzLAorCQkJCSAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICBpbnQgdm1fd3JpdGUsCisJCQkJICAgIHNzaXplX3QgKmJ5dGVzX2NvcGllZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBhID0gYWRkciAmIFBBR0VfTUFTSzsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X29mZnNldCA9IGFkZHIgLSBwYTsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOworCXNzaXplX3QgYnl0ZXNfY29waWVkX2xvb3A7CisJc3NpemVfdCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlc19jb3BpZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXNfdG9fY29weTsKKwl1bnNpZ25lZCBsb25nIG1heF9wYWdlc19wZXJfbG9vcCA9IFBWTV9NQVhfS01BTExPQ19QQUdFUworCQkvIHNpemVvZihzdHJ1Y3QgcGFnZXMgKik7CisKKwkqYnl0ZXNfY29waWVkID0gMDsKKworCS8qIFdvcmsgb3V0IGFkZHJlc3MgYW5kIHBhZ2UgcmFuZ2UgcmVxdWlyZWQgKi8KKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCW5yX3BhZ2VzID0gKGFkZHIgKyBsZW4gLSAxKSAvIFBBR0VfU0laRSAtIGFkZHIgLyBQQUdFX1NJWkUgKyAxOworCisJd2hpbGUgKChucl9wYWdlc19jb3BpZWQgPCBucl9wYWdlcykgJiYgKCpsdmVjX2N1cnJlbnQgPCBsdmVjX2NudCkpIHsKKwkJbnJfcGFnZXNfdG9fY29weSA9IG1pbihucl9wYWdlcyAtIG5yX3BhZ2VzX2NvcGllZCwKKwkJCQkgICAgICAgbWF4X3BhZ2VzX3Blcl9sb29wKTsKKworCQlyYyA9IHByb2Nlc3Nfdm1fcndfcGFnZXModGFzaywgbW0sIHByb2Nlc3NfcGFnZXMsIHBhLAorCQkJCQkgc3RhcnRfb2Zmc2V0LCBsZW4sCisJCQkJCSBsdmVjLCBsdmVjX2NudCwKKwkJCQkJIGx2ZWNfY3VycmVudCwgbHZlY19vZmZzZXQsCisJCQkJCSB2bV93cml0ZSwgbnJfcGFnZXNfdG9fY29weSwKKwkJCQkJICZieXRlc19jb3BpZWRfbG9vcCk7CisJCXN0YXJ0X29mZnNldCA9IDA7CisJCSpieXRlc19jb3BpZWQgKz0gYnl0ZXNfY29waWVkX2xvb3A7CisKKwkJaWYgKHJjIDwgMCkgeworCQkJcmV0dXJuIHJjOworCQl9IGVsc2UgeworCQkJbGVuIC09IGJ5dGVzX2NvcGllZF9sb29wOworCQkJbnJfcGFnZXNfY29waWVkICs9IG5yX3BhZ2VzX3RvX2NvcHk7CisJCQlwYSArPSBucl9wYWdlc190b19jb3B5ICogUEFHRV9TSVpFOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGZvciBwcm9jZXNzIHBhZ2VzIGFycmF5CisgICB3aGljaCBsaXZlcyBvbiBzdGFjayAqLworI2RlZmluZSBQVk1fTUFYX1BQX0FSUkFZX0NPVU5UIDE2CisKKy8qKgorICogcHJvY2Vzc192bV9yd19jb3JlIC0gY29yZSBvZiByZWFkaW5nL3dyaXRpbmcgcGFnZXMgZnJvbSB0YXNrIHNwZWNpZmllZAorICogQHBpZDogUElEIG9mIHByb2Nlc3MgdG8gcmVhZC93cml0ZSBmcm9tL3RvCisgKiBAbHZlYzogaW92ZWMgYXJyYXkgc3BlY2lmeWluZyB3aGVyZSB0byBjb3B5IHRvL2Zyb20gbG9jYWxseQorICogQGxpb3ZjbnQ6IHNpemUgb2YgbHZlYyBhcnJheQorICogQHJ2ZWM6IGlvdmVjIGFycmF5IHNwZWNpZnlpbmcgd2hlcmUgdG8gY29weSB0by9mcm9tIGluIHRoZSBvdGhlciBwcm9jZXNzCisgKiBAcmlvdmNudDogc2l6ZSBvZiBydmVjIGFycmF5CisgKiBAZmxhZ3M6IGN1cnJlbnRseSB1bnVzZWQKKyAqIEB2bV93cml0ZTogMCBpZiByZWFkaW5nIGZyb20gb3RoZXIgcHJvY2VzcywgMSBpZiB3cml0aW5nIHRvIG90aGVyIHByb2Nlc3MKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkL3dyaXR0ZW4gb3IgZXJyb3IgY29kZS4gTWF5CisgKiAgcmV0dXJuIGxlc3MgYnl0ZXMgdGhhbiBleHBlY3RlZCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBjb3B5aW5nCisgKiAgcHJvY2Vzcy4KKyAqLworc3RhdGljIHNzaXplX3QgcHJvY2Vzc192bV9yd19jb3JlKHBpZF90IHBpZCwgY29uc3Qgc3RydWN0IGlvdmVjICpsdmVjLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsaW92Y250LAorCQkJCSAgY29uc3Qgc3RydWN0IGlvdmVjICpydmVjLAorCQkJCSAgdW5zaWduZWQgbG9uZyByaW92Y250LAorCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHZtX3dyaXRlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzdHJ1Y3QgcGFnZSAqcHBfc3RhY2tbUFZNX01BWF9QUF9BUlJBWV9DT1VOVF07CisJc3RydWN0IHBhZ2UgKipwcm9jZXNzX3BhZ2VzID0gcHBfc3RhY2s7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJdW5zaWduZWQgbG9uZyBpOworCXNzaXplX3QgcmMgPSAwOworCXNzaXplX3QgYnl0ZXNfY29waWVkX2xvb3A7CisJc3NpemVfdCBieXRlc19jb3BpZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXNfaW92OworCXVuc2lnbmVkIGxvbmcgaW92X2xfY3Vycl9pZHggPSAwOworCXNpemVfdCBpb3ZfbF9jdXJyX29mZnNldCA9IDA7CisJc3NpemVfdCBpb3ZfbGVuOworCisJLyoKKwkgKiBXb3JrIG91dCBob3cgbWFueSBwYWdlcyBvZiBzdHJ1Y3QgcGFnZXMgd2UncmUgZ29pbmcgdG8gbmVlZAorCSAqIHdoZW4gZXZlbnR1YWxseSBjYWxsaW5nIGdldF91c2VyX3BhZ2VzCisJICovCisJZm9yIChpID0gMDsgaSA8IHJpb3ZjbnQ7IGkrKykgeworCQlpb3ZfbGVuID0gcnZlY1tpXS5pb3ZfbGVuOworCQlpZiAoaW92X2xlbiA+IDApIHsKKwkJCW5yX3BhZ2VzX2lvdiA9ICgodW5zaWduZWQgbG9uZylydmVjW2ldLmlvdl9iYXNlCisJCQkJCSsgaW92X2xlbikKKwkJCQkvIFBBR0VfU0laRSAtICh1bnNpZ25lZCBsb25nKXJ2ZWNbaV0uaW92X2Jhc2UKKwkJCQkvIFBBR0VfU0laRSArIDE7CisJCQlucl9wYWdlcyA9IG1heChucl9wYWdlcywgbnJfcGFnZXNfaW92KTsKKwkJfQorCX0KKworCWlmIChucl9wYWdlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChucl9wYWdlcyA+IFBWTV9NQVhfUFBfQVJSQVlfQ09VTlQpIHsKKwkJLyogRm9yIHJlbGlhYmlsaXR5IGRvbid0IHRyeSB0byBrbWFsbG9jIG1vcmUgdGhhbgorCQkgICAyIHBhZ2VzIHdvcnRoICovCisJCXByb2Nlc3NfcGFnZXMgPSBrbWFsbG9jKG1pbl90KHNpemVfdCwgUFZNX01BWF9LTUFMTE9DX1BBR0VTLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHBhZ2VzICopKm5yX3BhZ2VzKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFwcm9jZXNzX3BhZ2VzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogR2V0IHByb2Nlc3MgaW5mb3JtYXRpb24gKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJdGFzayA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CisJaWYgKHRhc2spCisJCWdldF90YXNrX3N0cnVjdCh0YXNrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAoIXRhc2spIHsKKwkJcmMgPSAtRVNSQ0g7CisJCWdvdG8gZnJlZV9wcm9jX3BhZ2VzOworCX0KKworCXRhc2tfbG9jayh0YXNrKTsKKwlpZiAoX19wdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9BVFRBQ0gpKSB7CisJCXRhc2tfdW5sb2NrKHRhc2spOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBwdXRfdGFza19zdHJ1Y3Q7CisJfQorCW1tID0gdGFzay0+bW07CisKKwlpZiAoIW1tIHx8ICh0YXNrLT5mbGFncyAmIFBGX0tUSFJFQUQpKSB7CisJCXRhc2tfdW5sb2NrKHRhc2spOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gcHV0X3Rhc2tfc3RydWN0OworCX0KKworCWF0b21pY19pbmMoJm1tLT5tbV91c2Vycyk7CisJdGFza191bmxvY2sodGFzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmlvdmNudCAmJiBpb3ZfbF9jdXJyX2lkeCA8IGxpb3ZjbnQ7IGkrKykgeworCQlyYyA9IHByb2Nlc3Nfdm1fcndfc2luZ2xlX3ZlYygKKwkJCSh1bnNpZ25lZCBsb25nKXJ2ZWNbaV0uaW92X2Jhc2UsIHJ2ZWNbaV0uaW92X2xlbiwKKwkJCWx2ZWMsIGxpb3ZjbnQsICZpb3ZfbF9jdXJyX2lkeCwgJmlvdl9sX2N1cnJfb2Zmc2V0LAorCQkJcHJvY2Vzc19wYWdlcywgbW0sIHRhc2ssIHZtX3dyaXRlLCAmYnl0ZXNfY29waWVkX2xvb3ApOworCQlieXRlc19jb3BpZWQgKz0gYnl0ZXNfY29waWVkX2xvb3A7CisJCWlmIChyYyAhPSAwKSB7CisJCQkvKiBJZiB3ZSBoYXZlIG1hbmFnZWQgdG8gY29weSBhbnkgZGF0YSBhdCBhbGwgdGhlbgorCQkJICAgd2UgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLiBPdGhlcndpc2UKKwkJCSAgIHdlIHJldHVybiB0aGUgZXJyb3IgY29kZSAqLworCQkJaWYgKGJ5dGVzX2NvcGllZCkKKwkJCQlyYyA9IGJ5dGVzX2NvcGllZDsKKwkJCWdvdG8gcHV0X21tOworCQl9CisJfQorCisJcmMgPSBieXRlc19jb3BpZWQ7CitwdXRfbW06CisJbW1wdXQobW0pOworCitwdXRfdGFza19zdHJ1Y3Q6CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCitmcmVlX3Byb2NfcGFnZXM6CisJaWYgKHByb2Nlc3NfcGFnZXMgIT0gcHBfc3RhY2spCisJCWtmcmVlKHByb2Nlc3NfcGFnZXMpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBwcm9jZXNzX3ZtX3J3IC0gY2hlY2sgaW92ZWNzIGJlZm9yZSBjYWxsaW5nIGNvcmUgcm91dGluZQorICogQHBpZDogUElEIG9mIHByb2Nlc3MgdG8gcmVhZC93cml0ZSBmcm9tL3RvCisgKiBAbHZlYzogaW92ZWMgYXJyYXkgc3BlY2lmeWluZyB3aGVyZSB0byBjb3B5IHRvL2Zyb20gbG9jYWxseQorICogQGxpb3ZjbnQ6IHNpemUgb2YgbHZlYyBhcnJheQorICogQHJ2ZWM6IGlvdmVjIGFycmF5IHNwZWNpZnlpbmcgd2hlcmUgdG8gY29weSB0by9mcm9tIGluIHRoZSBvdGhlciBwcm9jZXNzCisgKiBAcmlvdmNudDogc2l6ZSBvZiBydmVjIGFycmF5CisgKiBAZmxhZ3M6IGN1cnJlbnRseSB1bnVzZWQKKyAqIEB2bV93cml0ZTogMCBpZiByZWFkaW5nIGZyb20gb3RoZXIgcHJvY2VzcywgMSBpZiB3cml0aW5nIHRvIG90aGVyIHByb2Nlc3MKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkL3dyaXR0ZW4gb3IgZXJyb3IgY29kZS4gTWF5CisgKiAgcmV0dXJuIGxlc3MgYnl0ZXMgdGhhbiBleHBlY3RlZCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBjb3B5aW5nCisgKiAgcHJvY2Vzcy4KKyAqLworc3RhdGljIHNzaXplX3QgcHJvY2Vzc192bV9ydyhwaWRfdCBwaWQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKmx2ZWMsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbGlvdmNudCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqcnZlYywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyByaW92Y250LAorCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgdm1fd3JpdGUpCit7CisJc3RydWN0IGlvdmVjIGlvdnN0YWNrX2xbVUlPX0ZBU1RJT1ZdOworCXN0cnVjdCBpb3ZlYyBpb3ZzdGFja19yW1VJT19GQVNUSU9WXTsKKwlzdHJ1Y3QgaW92ZWMgKmlvdl9sID0gaW92c3RhY2tfbDsKKwlzdHJ1Y3QgaW92ZWMgKmlvdl9yID0gaW92c3RhY2tfcjsKKwlzc2l6ZV90IHJjOworCisJaWYgKGZsYWdzICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgaW92ZWNzICovCisJaWYgKHZtX3dyaXRlKQorCQlyYyA9IHJ3X2NvcHlfY2hlY2tfdXZlY3RvcihXUklURSwgbHZlYywgbGlvdmNudCwgVUlPX0ZBU1RJT1YsCisJCQkJCSAgIGlvdnN0YWNrX2wsICZpb3ZfbCwgMSk7CisJZWxzZQorCQlyYyA9IHJ3X2NvcHlfY2hlY2tfdXZlY3RvcihSRUFELCBsdmVjLCBsaW92Y250LCBVSU9fRkFTVElPViwKKwkJCQkJICAgaW92c3RhY2tfbCwgJmlvdl9sLCAxKTsKKwlpZiAocmMgPD0gMCkKKwkJZ290byBmcmVlX2lvdmVjczsKKworCXJjID0gcndfY29weV9jaGVja191dmVjdG9yKFJFQUQsIHJ2ZWMsIHJpb3ZjbnQsIFVJT19GQVNUSU9WLAorCQkJCSAgIGlvdnN0YWNrX3IsICZpb3ZfciwgMCk7CisJaWYgKHJjIDw9IDApCisJCWdvdG8gZnJlZV9pb3ZlY3M7CisKKwlyYyA9IHByb2Nlc3Nfdm1fcndfY29yZShwaWQsIGlvdl9sLCBsaW92Y250LCBpb3ZfciwgcmlvdmNudCwgZmxhZ3MsCisJCQkJdm1fd3JpdGUpOworCitmcmVlX2lvdmVjczoKKwlpZiAoaW92X3IgIT0gaW92c3RhY2tfcikKKwkJa2ZyZWUoaW92X3IpOworCWlmIChpb3ZfbCAhPSBpb3ZzdGFja19sKQorCQlrZnJlZShpb3ZfbCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK1NZU0NBTExfREVGSU5FNihwcm9jZXNzX3ZtX3JlYWR2LCBwaWRfdCwgcGlkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICosIGx2ZWMsCisJCXVuc2lnbmVkIGxvbmcsIGxpb3ZjbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKiwgcnZlYywKKwkJdW5zaWduZWQgbG9uZywgcmlvdmNudCwJdW5zaWduZWQgbG9uZywgZmxhZ3MpCit7CisJcmV0dXJuIHByb2Nlc3Nfdm1fcncocGlkLCBsdmVjLCBsaW92Y250LCBydmVjLCByaW92Y250LCBmbGFncywgMCk7Cit9CisKK1NZU0NBTExfREVGSU5FNihwcm9jZXNzX3ZtX3dyaXRldiwgcGlkX3QsIHBpZCwKKwkJY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqLCBsdmVjLAorCQl1bnNpZ25lZCBsb25nLCBsaW92Y250LCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICosIHJ2ZWMsCisJCXVuc2lnbmVkIGxvbmcsIHJpb3ZjbnQsCXVuc2lnbmVkIGxvbmcsIGZsYWdzKQoreworCXJldHVybiBwcm9jZXNzX3ZtX3J3KHBpZCwgbHZlYywgbGlvdmNudCwgcnZlYywgcmlvdmNudCwgZmxhZ3MsIDEpOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCithc21saW5rYWdlIHNzaXplX3QKK2NvbXBhdF9wcm9jZXNzX3ZtX3J3KGNvbXBhdF9waWRfdCBwaWQsCisJCSAgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKmx2ZWMsCisJCSAgICAgdW5zaWduZWQgbG9uZyBsaW92Y250LAorCQkgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpydmVjLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgcmlvdmNudCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgdm1fd3JpdGUpCit7CisJc3RydWN0IGlvdmVjIGlvdnN0YWNrX2xbVUlPX0ZBU1RJT1ZdOworCXN0cnVjdCBpb3ZlYyBpb3ZzdGFja19yW1VJT19GQVNUSU9WXTsKKwlzdHJ1Y3QgaW92ZWMgKmlvdl9sID0gaW92c3RhY2tfbDsKKwlzdHJ1Y3QgaW92ZWMgKmlvdl9yID0gaW92c3RhY2tfcjsKKwlzc2l6ZV90IHJjID0gLUVGQVVMVDsKKworCWlmIChmbGFncyAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBsdmVjLCBsaW92Y250ICogc2l6ZW9mKCpsdmVjKSkpCisJCWdvdG8gb3V0OworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHJ2ZWMsIHJpb3ZjbnQgKiBzaXplb2YoKnJ2ZWMpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAodm1fd3JpdGUpCisJCXJjID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3RvcihXUklURSwgbHZlYywgbGlvdmNudCwKKwkJCQkJCSAgVUlPX0ZBU1RJT1YsIGlvdnN0YWNrX2wsCisJCQkJCQkgICZpb3ZfbCwgMSk7CisJZWxzZQorCQlyYyA9IGNvbXBhdF9yd19jb3B5X2NoZWNrX3V2ZWN0b3IoUkVBRCwgbHZlYywgbGlvdmNudCwKKwkJCQkJCSAgVUlPX0ZBU1RJT1YsIGlvdnN0YWNrX2wsCisJCQkJCQkgICZpb3ZfbCwgMSk7CisJaWYgKHJjIDw9IDApCisJCWdvdG8gZnJlZV9pb3ZlY3M7CisJcmMgPSBjb21wYXRfcndfY29weV9jaGVja191dmVjdG9yKFJFQUQsIHJ2ZWMsIHJpb3ZjbnQsCisJCQkJCSAgVUlPX0ZBU1RJT1YsIGlvdnN0YWNrX3IsCisJCQkJCSAgJmlvdl9yLCAwKTsKKwlpZiAocmMgPD0gMCkKKwkJZ290byBmcmVlX2lvdmVjczsKKworCXJjID0gcHJvY2Vzc192bV9yd19jb3JlKHBpZCwgaW92X2wsIGxpb3ZjbnQsIGlvdl9yLCByaW92Y250LCBmbGFncywKKwkJCSAgIHZtX3dyaXRlKTsKKworZnJlZV9pb3ZlY3M6CisJaWYgKGlvdl9yICE9IGlvdnN0YWNrX3IpCisJCWtmcmVlKGlvdl9yKTsKKwlpZiAoaW92X2wgIT0gaW92c3RhY2tfbCkKKwkJa2ZyZWUoaW92X2wpOworCitvdXQ6CisJcmV0dXJuIHJjOworfQorCithc21saW5rYWdlIHNzaXplX3QKK2NvbXBhdF9zeXNfcHJvY2Vzc192bV9yZWFkdihjb21wYXRfcGlkX3QgcGlkLAorCQkJICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpsdmVjLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbGlvdmNudCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqcnZlYywKKwkJCSAgICB1bnNpZ25lZCBsb25nIHJpb3ZjbnQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gY29tcGF0X3Byb2Nlc3Nfdm1fcncocGlkLCBsdmVjLCBsaW92Y250LCBydmVjLAorCQkJCSAgICByaW92Y250LCBmbGFncywgMCk7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdAorY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldihjb21wYXRfcGlkX3QgcGlkLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqbHZlYywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBsaW92Y250LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqcnZlYywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyByaW92Y250LAorCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBjb21wYXRfcHJvY2Vzc192bV9ydyhwaWQsIGx2ZWMsIGxpb3ZjbnQsIHJ2ZWMsCisJCQkJICAgIHJpb3ZjbnQsIGZsYWdzLCAxKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tbS9xdWlja2xpc3QuYyBiL21tL3F1aWNrbGlzdC5jCmluZGV4IDI4NzYzNDkuLjk0MjIxMjkgMTAwNjQ0Ci0tLSBhL21tL3F1aWNrbGlzdC5jCisrKyBiL21tL3F1aWNrbGlzdC5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9xdWlja2xpc3QuaD4KIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IHF1aWNrbGlzdCBbQ09ORklHX05SX1FVSUNLXSwgcXVpY2tsaXN0KTsKZGlmZiAtLWdpdCBhL21tL3JlYWRhaGVhZC5jIGIvbW0vcmVhZGFoZWFkLmMKaW5kZXggODY3ZjlkZC4uY2JjYmIwMiAxMDA2NDQKLS0tIGEvbW0vcmVhZGFoZWFkLmMKKysrIGIvbW0vcmVhZGFoZWFkLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggODAwNTA4MC4uYTRmZDM2OCAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtNTEsNyArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tzbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CkBAIC0xMTY0LDcgKzExNjQsNyBAQAogCiAvKgogICogU3ViZnVuY3Rpb25zIG9mIHRyeV90b191bm1hcDogdHJ5X3RvX3VubWFwX29uZSBjYWxsZWQKLSAqIHJlcGVhdGVkbHkgZnJvbSBlaXRoZXIgdHJ5X3RvX3VubWFwX2Fub24gb3IgdHJ5X3RvX3VubWFwX2ZpbGUuCisgKiByZXBlYXRlZGx5IGZyb20gdHJ5X3RvX3VubWFwX2tzbSwgdHJ5X3RvX3VubWFwX2Fub24gb3IgdHJ5X3RvX3VubWFwX2ZpbGUuCiAgKi8KIGludCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGVudW0gdHR1X2ZsYWdzIGZsYWdzKQpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggMmQzNTc3Mi4uZDY3MjI1MDYgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNobV9tbnQ7CkBAIC0xMDY4LDYgKzEwNjgsMTIgQEAKIAkJdXNlcl9zaG1fdW5sb2NrKGlub2RlLT5pX3NpemUsIHVzZXIpOwogCQlpbmZvLT5mbGFncyAmPSB+Vk1fTE9DS0VEOwogCQltYXBwaW5nX2NsZWFyX3VuZXZpY3RhYmxlKGZpbGUtPmZfbWFwcGluZyk7CisJCS8qCisJCSAqIEVuc3VyZSB0aGF0IGEgcmFjaW5nIHB1dGJhY2tfbHJ1X3BhZ2UoKSBjYW4gc2VlCisJCSAqIHRoZSBwYWdlcyBvZiB0aGlzIG1hcHBpbmcgYXJlIGV2aWN0YWJsZSB3aGVuIHdlCisJCSAqIHNraXAgdGhlbSBkdWUgdG8gIVBhZ2VMUlUgZHVyaW5nIHRoZSBzY2FuLgorCQkgKi8KKwkJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKIAkJc2Nhbl9tYXBwaW5nX3VuZXZpY3RhYmxlX3BhZ2VzKGZpbGUtPmZfbWFwcGluZyk7CiAJfQogCXJldHZhbCA9IDA7CkBAIC0yNDk3LDcgKzI1MDMsNyBAQAogCiAJZF9pbnN0YW50aWF0ZShwYXRoLmRlbnRyeSwgaW5vZGUpOwogCWlub2RlLT5pX3NpemUgPSBzaXplOwotCWlub2RlLT5pX25saW5rID0gMDsJLyogSXQgaXMgdW5saW5rZWQgKi8KKwljbGVhcl9ubGluayhpbm9kZSk7CS8qIEl0IGlzIHVubGlua2VkICovCiAjaWZuZGVmIENPTkZJR19NTVUKIAllcnJvciA9IHJhbWZzX25vbW11X2V4cGFuZF9mb3JfbWFwcGluZyhpbm9kZSwgc2l6ZSk7CiAJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvbW0vc2xvYi5jIGIvbW0vc2xvYi5jCmluZGV4IGJmMzkxODEuLjgxMDViZTQgMTAwNjQ0Ci0tLSBhL21tL3Nsb2IuYworKysgYi9tbS9zbG9iLmMKQEAgLTYzLDcgKzYzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+IC8qIHN0cnVjdCByZWNsYWltX3N0YXRlICovCiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCA5NTIxNWFhLi43ZDJhOTk2IDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC02NTUsNDkgKzY1NSw2IEBACiAJCW1lbXNldChwICsgcy0+b2Jqc2l6ZSwgdmFsLCBzLT5pbnVzZSAtIHMtPm9ianNpemUpOwogfQogCi1zdGF0aWMgdTggKmNoZWNrX2J5dGVzOCh1OCAqc3RhcnQsIHU4IHZhbHVlLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCi17Ci0Jd2hpbGUgKGJ5dGVzKSB7Ci0JCWlmICgqc3RhcnQgIT0gdmFsdWUpCi0JCQlyZXR1cm4gc3RhcnQ7Ci0JCXN0YXJ0Kys7Ci0JCWJ5dGVzLS07Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdTggKmNoZWNrX2J5dGVzKHU4ICpzdGFydCwgdTggdmFsdWUsIHVuc2lnbmVkIGludCBieXRlcykKLXsKLQl1NjQgdmFsdWU2NDsKLQl1bnNpZ25lZCBpbnQgd29yZHMsIHByZWZpeDsKLQotCWlmIChieXRlcyA8PSAxNikKLQkJcmV0dXJuIGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIGJ5dGVzKTsKLQotCXZhbHVlNjQgPSB2YWx1ZSB8IHZhbHVlIDw8IDggfCB2YWx1ZSA8PCAxNiB8IHZhbHVlIDw8IDI0OwotCXZhbHVlNjQgPSAodmFsdWU2NCAmIDB4ZmZmZmZmZmYpIHwgdmFsdWU2NCA8PCAzMjsKLQlwcmVmaXggPSA4IC0gKCh1bnNpZ25lZCBsb25nKXN0YXJ0KSAlIDg7Ci0KLQlpZiAocHJlZml4KSB7Ci0JCXU4ICpyID0gY2hlY2tfYnl0ZXM4KHN0YXJ0LCB2YWx1ZSwgcHJlZml4KTsKLQkJaWYgKHIpCi0JCQlyZXR1cm4gcjsKLQkJc3RhcnQgKz0gcHJlZml4OwotCQlieXRlcyAtPSBwcmVmaXg7Ci0JfQotCi0Jd29yZHMgPSBieXRlcyAvIDg7Ci0KLQl3aGlsZSAod29yZHMpIHsKLQkJaWYgKCoodTY0ICopc3RhcnQgIT0gdmFsdWU2NCkKLQkJCXJldHVybiBjaGVja19ieXRlczgoc3RhcnQsIHZhbHVlLCA4KTsKLQkJc3RhcnQgKz0gODsKLQkJd29yZHMtLTsKLQl9Ci0KLQlyZXR1cm4gY2hlY2tfYnl0ZXM4KHN0YXJ0LCB2YWx1ZSwgYnl0ZXMgJSA4KTsKLX0KLQogc3RhdGljIHZvaWQgcmVzdG9yZV9ieXRlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqbWVzc2FnZSwgdTggZGF0YSwKIAkJCQkJCXZvaWQgKmZyb20sIHZvaWQgKnRvKQogewpAQCAtNzEyLDcgKzY2OSw3IEBACiAJdTggKmZhdWx0OwogCXU4ICplbmQ7CiAKLQlmYXVsdCA9IGNoZWNrX2J5dGVzKHN0YXJ0LCB2YWx1ZSwgYnl0ZXMpOworCWZhdWx0ID0gbWVtY2hyX2ludihzdGFydCwgdmFsdWUsIGJ5dGVzKTsKIAlpZiAoIWZhdWx0KQogCQlyZXR1cm4gMTsKIApAQCAtODA1LDcgKzc2Miw3IEBACiAJaWYgKCFyZW1haW5kZXIpCiAJCXJldHVybiAxOwogCi0JZmF1bHQgPSBjaGVja19ieXRlcyhlbmQgLSByZW1haW5kZXIsIFBPSVNPTl9JTlVTRSwgcmVtYWluZGVyKTsKKwlmYXVsdCA9IG1lbWNocl9pbnYoZW5kIC0gcmVtYWluZGVyLCBQT0lTT05fSU5VU0UsIHJlbWFpbmRlcik7CiAJaWYgKCFmYXVsdCkKIAkJcmV0dXJuIDE7CiAJd2hpbGUgKGVuZCA+IGZhdWx0ICYmIGVuZFstMV0gPT0gUE9JU09OX0lOVVNFKQpkaWZmIC0tZ2l0IGEvbW0vc3BhcnNlLXZtZW1tYXAuYyBiL21tL3NwYXJzZS12bWVtbWFwLmMKaW5kZXggNjRiOTg0MC4uMWI3ZTIyYSAxMDA2NDQKLS0tIGEvbW0vc3BhcnNlLXZtZW1tYXAuYworKysgYi9tbS9zcGFyc2Utdm1lbW1hcC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CmRpZmYgLS1naXQgYS9tbS9zcGFyc2UuYyBiL21tL3NwYXJzZS5jCmluZGV4IDg1OGUxZGYuLjYxZDdjZGUgMTAwNjQ0Ci0tLSBhL21tL3NwYXJzZS5jCisrKyBiL21tL3NwYXJzZS5jCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL21tL3N3YXAuYyBiL21tL3N3YXAuYwppbmRleCAzYTQ0MmYxLi5hOTFjYWY3IDEwMDY0NAotLS0gYS9tbS9zd2FwLmMKKysrIGIvbW0vc3dhcC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1faW5saW5lLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JLyogZm9yIHRyeV90b19yZWxlYXNlX3BhZ2UoKSAqLwogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+CkBAIC03OCwzOSArNzgsMjIgQEAKIHsKIAlpZiAodW5saWtlbHkoUGFnZVRhaWwocGFnZSkpKSB7CiAJCS8qIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50IGNhbiBydW4gdW5kZXIgdXMgKi8KLQkJc3RydWN0IHBhZ2UgKnBhZ2VfaGVhZCA9IHBhZ2UtPmZpcnN0X3BhZ2U7Ci0JCXNtcF9ybWIoKTsKLQkJLyoKLQkJICogSWYgUGFnZVRhaWwgaXMgc3RpbGwgc2V0IGFmdGVyIHNtcF9ybWIoKSB3ZSBjYW4gYmUgc3VyZQotCQkgKiB0aGF0IHRoZSBwYWdlLT5maXJzdF9wYWdlIHdlIHJlYWQgd2Fzbid0IGEgZGFuZ2xpbmcgcG9pbnRlci4KLQkJICogU2VlIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50KCkgc21wX3dtYigpLgotCQkgKi8KLQkJaWYgKGxpa2VseShQYWdlVGFpbChwYWdlKSAmJiBnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlX2hlYWQpKSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZV9oZWFkID0gY29tcG91bmRfdHJhbnNfaGVhZChwYWdlKTsKKworCQlpZiAobGlrZWx5KHBhZ2UgIT0gcGFnZV9oZWFkICYmCisJCQkgICBnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlX2hlYWQpKSkgewogCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJCS8qCi0JCQkgKiBWZXJpZnkgdGhhdCBvdXIgcGFnZV9oZWFkIHdhc24ndCBjb252ZXJ0ZWQKLQkJCSAqIHRvIGEgYSByZWd1bGFyIHBhZ2UgYmVmb3JlIHdlIGdvdCBhCi0JCQkgKiByZWZlcmVuY2Ugb24gaXQuCisJCQkgKiBwYWdlX2hlYWQgd2Fzbid0IGEgZGFuZ2xpbmcgcG9pbnRlciBidXQgaXQKKwkJCSAqIG1heSBub3QgYmUgYSBoZWFkIHBhZ2UgYW55bW9yZSBieSB0aGUgdGltZQorCQkJICogd2Ugb2J0YWluIHRoZSBsb2NrLiBUaGF0IGlzIG9rIGFzIGxvbmcgYXMgaXQKKwkJCSAqIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuCiAJCQkgKi8KLQkJCWlmICh1bmxpa2VseSghUGFnZUhlYWQocGFnZV9oZWFkKSkpIHsKLQkJCQkvKiBQYWdlSGVhZCBpcyBjbGVhcmVkIGFmdGVyIFBhZ2VUYWlsICovCi0JCQkJc21wX3JtYigpOwotCQkJCVZNX0JVR19PTihQYWdlVGFpbChwYWdlKSk7Ci0JCQkJZ290byBvdXRfcHV0X2hlYWQ7Ci0JCQl9Ci0JCQkvKgotCQkJICogT25seSBydW4gY29tcG91bmRfbG9jayBvbiBhIHZhbGlkIFBhZ2VIZWFkLAotCQkJICogYWZ0ZXIgaGF2aW5nIGl0IHBpbm5lZCB3aXRoCi0JCQkgKiBnZXRfcGFnZV91bmxlc3NfemVybygpIGFib3ZlLgotCQkJICovCi0JCQlzbXBfbWIoKTsKLQkJCS8qIHBhZ2VfaGVhZCB3YXNuJ3QgYSBkYW5nbGluZyBwb2ludGVyICovCiAJCQlmbGFncyA9IGNvbXBvdW5kX2xvY2tfaXJxc2F2ZShwYWdlX2hlYWQpOwogCQkJaWYgKHVubGlrZWx5KCFQYWdlVGFpbChwYWdlKSkpIHsKIAkJCQkvKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCBydW4gYmVmb3JlIHVzICovCiAJCQkJY29tcG91bmRfdW5sb2NrX2lycXJlc3RvcmUocGFnZV9oZWFkLCBmbGFncyk7CiAJCQkJVk1fQlVHX09OKFBhZ2VIZWFkKHBhZ2VfaGVhZCkpOwotCQkJb3V0X3B1dF9oZWFkOgogCQkJCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlX2hlYWQpKQogCQkJCQlfX3B1dF9zaW5nbGVfcGFnZShwYWdlX2hlYWQpOwogCQkJb3V0X3B1dF9zaW5nbGU6CkBAIC0xMjEsMTYgKzEwNCwxNyBAQAogCQkJVk1fQlVHX09OKHBhZ2VfaGVhZCAhPSBwYWdlLT5maXJzdF9wYWdlKTsKIAkJCS8qCiAJCQkgKiBXZSBjYW4gcmVsZWFzZSB0aGUgcmVmY291bnQgdGFrZW4gYnkKLQkJCSAqIGdldF9wYWdlX3VubGVzc196ZXJvIG5vdyB0aGF0Ci0JCQkgKiBzcGxpdF9odWdlX3BhZ2VfcmVmY291bnQgaXMgYmxvY2tlZCBvbiB0aGUKLQkJCSAqIGNvbXBvdW5kX2xvY2suCisJCQkgKiBnZXRfcGFnZV91bmxlc3NfemVybygpIG5vdyB0aGF0CisJCQkgKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCgpIGlzIGJsb2NrZWQgb24KKwkJCSAqIHRoZSBjb21wb3VuZF9sb2NrLgogCQkJICovCiAJCQlpZiAocHV0X3BhZ2VfdGVzdHplcm8ocGFnZV9oZWFkKSkKIAkJCQlWTV9CVUdfT04oMSk7CiAJCQkvKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCB3aWxsIHdhaXQgbm93ICovCi0JCQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPD0gMCk7Ci0JCQlhdG9taWNfZGVjKCZwYWdlLT5fY291bnQpOworCQkJVk1fQlVHX09OKHBhZ2VfbWFwY291bnQocGFnZSkgPD0gMCk7CisJCQlhdG9taWNfZGVjKCZwYWdlLT5fbWFwY291bnQpOwogCQkJVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlX2hlYWQtPl9jb3VudCkgPD0gMCk7CisJCQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgIT0gMCk7CiAJCQljb21wb3VuZF91bmxvY2tfaXJxcmVzdG9yZShwYWdlX2hlYWQsIGZsYWdzKTsKIAkJCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlX2hlYWQpKSB7CiAJCQkJaWYgKFBhZ2VIZWFkKHBhZ2VfaGVhZCkpCkBAIC0xNjAsNiArMTQ0LDQ1IEBACiB9CiBFWFBPUlRfU1lNQk9MKHB1dF9wYWdlKTsKIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgYnV0IG11c3Qgbm90IGJlIGNhbGxlZCBieSBhbnl0aGluZyBvdGhlcgorICogdGhhbiBnZXRfcGFnZSgpLiBJdCBpbXBsZW1lbnRzIHRoZSBzbG93IHBhdGggb2YgZ2V0X3BhZ2UoKS4KKyAqLworYm9vbCBfX2dldF9wYWdlX3RhaWwoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJLyoKKwkgKiBUaGlzIHRha2VzIGNhcmUgb2YgZ2V0X3BhZ2UoKSBpZiBydW4gb24gYSB0YWlsIHBhZ2UKKwkgKiByZXR1cm5lZCBieSBvbmUgb2YgdGhlIGdldF91c2VyX3BhZ2VzL2ZvbGxvd19wYWdlIHZhcmlhbnRzLgorCSAqIGdldF91c2VyX3BhZ2VzL2ZvbGxvd19wYWdlIGl0c2VsZiBkb2Vzbid0IG5lZWQgdGhlIGNvbXBvdW5kCisJICogbG9jayBiZWNhdXNlIGl0IHJ1bnMgX19nZXRfcGFnZV90YWlsX2ZvbGwoKSB1bmRlciB0aGUKKwkgKiBwcm9wZXIgUFQgbG9jayB0aGF0IGFscmVhZHkgc2VyaWFsaXplcyBhZ2FpbnN0CisJICogc3BsaXRfaHVnZV9wYWdlKCkuCisJICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGdvdCA9IGZhbHNlOworCXN0cnVjdCBwYWdlICpwYWdlX2hlYWQgPSBjb21wb3VuZF90cmFuc19oZWFkKHBhZ2UpOworCisJaWYgKGxpa2VseShwYWdlICE9IHBhZ2VfaGVhZCAmJiBnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlX2hlYWQpKSkgeworCQkvKgorCQkgKiBwYWdlX2hlYWQgd2Fzbid0IGEgZGFuZ2xpbmcgcG9pbnRlciBidXQgaXQKKwkJICogbWF5IG5vdCBiZSBhIGhlYWQgcGFnZSBhbnltb3JlIGJ5IHRoZSB0aW1lCisJCSAqIHdlIG9idGFpbiB0aGUgbG9jay4gVGhhdCBpcyBvayBhcyBsb25nIGFzIGl0CisJCSAqIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuCisJCSAqLworCQlmbGFncyA9IGNvbXBvdW5kX2xvY2tfaXJxc2F2ZShwYWdlX2hlYWQpOworCQkvKiBoZXJlIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50IHdvbid0IHJ1biBhbnltb3JlICovCisJCWlmIChsaWtlbHkoUGFnZVRhaWwocGFnZSkpKSB7CisJCQlfX2dldF9wYWdlX3RhaWxfZm9sbChwYWdlLCBmYWxzZSk7CisJCQlnb3QgPSB0cnVlOworCQl9CisJCWNvbXBvdW5kX3VubG9ja19pcnFyZXN0b3JlKHBhZ2VfaGVhZCwgZmxhZ3MpOworCQlpZiAodW5saWtlbHkoIWdvdCkpCisJCQlwdXRfcGFnZShwYWdlX2hlYWQpOworCX0KKwlyZXR1cm4gZ290OworfQorRVhQT1JUX1NZTUJPTChfX2dldF9wYWdlX3RhaWwpOworCiAvKioKICAqIHB1dF9wYWdlc19saXN0KCkgLSByZWxlYXNlIGEgbGlzdCBvZiBwYWdlcwogICogQHBhZ2VzOiBsaXN0IG9mIHBhZ2VzIHRocmVhZGVkIG9uIHBhZ2UtPmxydQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDQ2NjgwNDYxLi43OGNjNGQxIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKKysrIGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC02LDcgKzYsNiBAQAogICoKICAqICBSZXdyaXR0ZW4gdG8gdXNlIHBhZ2UgY2FjaGUsIChDKSAxOTk4IFN0ZXBoZW4gVHdlZWRpZQogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggMTdiYzIyNC4uYjFjZDEyMCAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tzbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpAQCAtMTYxNyw3ICsxNjE2LDcgQEAKIAogCW9vbV9zY29yZV9hZGogPSB0ZXN0X3NldF9vb21fc2NvcmVfYWRqKE9PTV9TQ09SRV9BREpfTUFYKTsKIAllcnIgPSB0cnlfdG9fdW51c2UodHlwZSk7Ci0JdGVzdF9zZXRfb29tX3Njb3JlX2Fkaihvb21fc2NvcmVfYWRqKTsKKwljb21wYXJlX3N3YXBfb29tX3Njb3JlX2FkaihPT01fU0NPUkVfQURKX01BWCwgb29tX3Njb3JlX2Fkaik7CiAKIAlpZiAoZXJyKSB7CiAJCS8qCmRpZmYgLS1naXQgYS9tbS90aHJhc2guYyBiL21tL3RocmFzaC5jCmluZGV4IGU1M2Y3ZDAuLjU3YWQ0OTUgMTAwNjQ0Ci0tLSBhL21tL3RocmFzaC5jCisrKyBiL21tL3RocmFzaC5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF90b2tlbl9sb2NrKTsKIHN0cnVjdCBtbV9zdHJ1Y3QgKnN3YXBfdG9rZW5fbW07Ci1zdHJ1Y3QgbWVtX2Nncm91cCAqc3dhcF90b2tlbl9tZW1jZzsKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqc3dhcF90b2tlbl9tZW1jZzsKIAogI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfdG9rZW5fbWVtY2dfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKZGlmZiAtLWdpdCBhL21tL3RydW5jYXRlLmMgYi9tbS90cnVuY2F0ZS5jCmluZGV4IGI0MGFjNmQuLjYzMmIxNWUgMTAwNjQ0Ci0tLSBhL21tL3RydW5jYXRlLmMKKysrIGIvbW0vdHJ1bmNhdGUuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgpkaWZmIC0tZ2l0IGEvbW0vdXRpbC5jIGIvbW0vdXRpbC5jCmluZGV4IDg4ZWExYmQuLjEzNmFjNGYgMTAwNjQ0Ci0tLSBhL21tL3V0aWwuYworKysgYi9tbS91dGlsLmMKQEAgLTEsNyArMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IDUwMTZmMTkuLmI2NjlhYTYgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTEyNTMsMTggKzEyNTMsMjIgQEAKIERFRklORV9SV0xPQ0sodm1saXN0X2xvY2spOwogc3RydWN0IHZtX3N0cnVjdCAqdm1saXN0OwogCi1zdGF0aWMgdm9pZCBpbnNlcnRfdm1hbGxvY192bShzdHJ1Y3Qgdm1fc3RydWN0ICp2bSwgc3RydWN0IHZtYXBfYXJlYSAqdmEsCitzdGF0aWMgdm9pZCBzZXR1cF92bWFsbG9jX3ZtKHN0cnVjdCB2bV9zdHJ1Y3QgKnZtLCBzdHJ1Y3Qgdm1hcF9hcmVhICp2YSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKmNhbGxlcikKIHsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICp0bXAsICoqcDsKLQogCXZtLT5mbGFncyA9IGZsYWdzOwogCXZtLT5hZGRyID0gKHZvaWQgKil2YS0+dmFfc3RhcnQ7CiAJdm0tPnNpemUgPSB2YS0+dmFfZW5kIC0gdmEtPnZhX3N0YXJ0OwogCXZtLT5jYWxsZXIgPSBjYWxsZXI7CiAJdmEtPnByaXZhdGUgPSB2bTsKIAl2YS0+ZmxhZ3MgfD0gVk1fVk1fQVJFQTsKK30KIAorc3RhdGljIHZvaWQgaW5zZXJ0X3ZtYWxsb2Nfdm1saXN0KHN0cnVjdCB2bV9zdHJ1Y3QgKnZtKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QgKnRtcCwgKipwOworCisJdm0tPmZsYWdzICY9IH5WTV9VTkxJU1Q7CiAJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOwogCWZvciAocCA9ICZ2bWxpc3Q7ICh0bXAgPSAqcCkgIT0gTlVMTDsgcCA9ICZ0bXAtPm5leHQpIHsKIAkJaWYgKHRtcC0+YWRkciA+PSB2bS0+YWRkcikKQEAgLTEyNzUsNiArMTI3OSwxMyBAQAogCXdyaXRlX3VubG9jaygmdm1saXN0X2xvY2spOwogfQogCitzdGF0aWMgdm9pZCBpbnNlcnRfdm1hbGxvY192bShzdHJ1Y3Qgdm1fc3RydWN0ICp2bSwgc3RydWN0IHZtYXBfYXJlYSAqdmEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkICpjYWxsZXIpCit7CisJc2V0dXBfdm1hbGxvY192bSh2bSwgdmEsIGZsYWdzLCBjYWxsZXIpOworCWluc2VydF92bWFsbG9jX3ZtbGlzdCh2bSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgdm1fc3RydWN0ICpfX2dldF92bV9hcmVhX25vZGUodW5zaWduZWQgbG9uZyBzaXplLAogCQl1bnNpZ25lZCBsb25nIGFsaWduLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQl1bnNpZ25lZCBsb25nIGVuZCwgaW50IG5vZGUsIGdmcF90IGdmcF9tYXNrLCB2b2lkICpjYWxsZXIpCkBAIC0xMzEzLDcgKzEzMjQsMTggQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaW5zZXJ0X3ZtYWxsb2Nfdm0oYXJlYSwgdmEsIGZsYWdzLCBjYWxsZXIpOworCS8qCisJICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIF9fdm1hbGxvY19ub2RlX3JhbmdlLAorCSAqIHdlIGRvIG5vdCBhZGQgdm1fc3RydWN0IHRvIHZtbGlzdCBoZXJlIHRvIGF2b2lkCisJICogYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgbWVtYmVycyBvZiB2bV9zdHJ1Y3Qgc3VjaCBhcworCSAqIHBhZ2VzIGFuZCBucl9wYWdlcyBmaWVsZHMuIFRoZXkgd2lsbCBiZSBzZXQgbGF0ZXIuCisJICogVG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBvdGhlcnMsIHdlIHVzZSBhIFZNX1VOTElTVCBmbGFnLgorCSAqLworCWlmIChmbGFncyAmIFZNX1VOTElTVCkKKwkJc2V0dXBfdm1hbGxvY192bShhcmVhLCB2YSwgZmxhZ3MsIGNhbGxlcik7CisJZWxzZQorCQlpbnNlcnRfdm1hbGxvY192bShhcmVhLCB2YSwgZmxhZ3MsIGNhbGxlcik7CisKIAlyZXR1cm4gYXJlYTsKIH0KIApAQCAtMTM4MSwxNyArMTQwMywyMCBAQAogCXZhID0gZmluZF92bWFwX2FyZWEoKHVuc2lnbmVkIGxvbmcpYWRkcik7CiAJaWYgKHZhICYmIHZhLT5mbGFncyAmIFZNX1ZNX0FSRUEpIHsKIAkJc3RydWN0IHZtX3N0cnVjdCAqdm0gPSB2YS0+cHJpdmF0ZTsKLQkJc3RydWN0IHZtX3N0cnVjdCAqdG1wLCAqKnA7Ci0JCS8qCi0JCSAqIHJlbW92ZSBmcm9tIGxpc3QgYW5kIGRpc2FsbG93IGFjY2VzcyB0byB0aGlzIHZtX3N0cnVjdAotCQkgKiBiZWZvcmUgdW5tYXAuIChhZGRyZXNzIHJhbmdlIGNvbmZsaWN0aW9uIGlzIG1haW50YWluZWQgYnkKLQkJICogdm1hcC4pCi0JCSAqLwotCQl3cml0ZV9sb2NrKCZ2bWxpc3RfbG9jayk7Ci0JCWZvciAocCA9ICZ2bWxpc3Q7ICh0bXAgPSAqcCkgIT0gdm07IHAgPSAmdG1wLT5uZXh0KQotCQkJOwotCQkqcCA9IHRtcC0+bmV4dDsKLQkJd3JpdGVfdW5sb2NrKCZ2bWxpc3RfbG9jayk7CisKKwkJaWYgKCEodm0tPmZsYWdzICYgVk1fVU5MSVNUKSkgeworCQkJc3RydWN0IHZtX3N0cnVjdCAqdG1wLCAqKnA7CisJCQkvKgorCQkJICogcmVtb3ZlIGZyb20gbGlzdCBhbmQgZGlzYWxsb3cgYWNjZXNzIHRvCisJCQkgKiB0aGlzIHZtX3N0cnVjdCBiZWZvcmUgdW5tYXAuIChhZGRyZXNzIHJhbmdlCisJCQkgKiBjb25mbGljdGlvbiBpcyBtYWludGFpbmVkIGJ5IHZtYXAuKQorCQkJICovCisJCQl3cml0ZV9sb2NrKCZ2bWxpc3RfbG9jayk7CisJCQlmb3IgKHAgPSAmdm1saXN0OyAodG1wID0gKnApICE9IHZtOyBwID0gJnRtcC0+bmV4dCkKKwkJCQk7CisJCQkqcCA9IHRtcC0+bmV4dDsKKwkJCXdyaXRlX3VubG9jaygmdm1saXN0X2xvY2spOworCQl9CiAKIAkJdm1hcF9kZWJ1Z19mcmVlX3JhbmdlKHZhLT52YV9zdGFydCwgdmEtPnZhX2VuZCk7CiAJCWZyZWVfdW5tYXBfdm1hcF9hcmVhKHZhKTsKQEAgLTE1NjgsOCArMTU5Myw4IEBACiAJcmV0dXJuIGFyZWEtPmFkZHI7CiAKIGZhaWw6Ci0Jd2Fybl9hbGxvY19mYWlsZWQoZ2ZwX21hc2ssIG9yZGVyLCAidm1hbGxvYzogYWxsb2NhdGlvbiBmYWlsdXJlLCAiCi0JCQkgICJhbGxvY2F0ZWQgJWxkIG9mICVsZCBieXRlc1xuIiwKKwl3YXJuX2FsbG9jX2ZhaWxlZChnZnBfbWFzaywgb3JkZXIsCisJCQkgICJ2bWFsbG9jOiBhbGxvY2F0aW9uIGZhaWx1cmUsIGFsbG9jYXRlZCAlbGQgb2YgJWxkIGJ5dGVzXG4iLAogCQkJICAoYXJlYS0+bnJfcGFnZXMqUEFHRV9TSVpFKSwgYXJlYS0+c2l6ZSk7CiAJdmZyZWUoYXJlYS0+YWRkcik7CiAJcmV0dXJuIE5VTEw7CkBAIC0xNjAwLDE3ICsxNjI1LDIyIEBACiAKIAlzaXplID0gUEFHRV9BTElHTihzaXplKTsKIAlpZiAoIXNpemUgfHwgKHNpemUgPj4gUEFHRV9TSElGVCkgPiB0b3RhbHJhbV9wYWdlcykKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZmFpbDsKIAotCWFyZWEgPSBfX2dldF92bV9hcmVhX25vZGUoc2l6ZSwgYWxpZ24sIFZNX0FMTE9DLCBzdGFydCwgZW5kLCBub2RlLAotCQkJCSAgZ2ZwX21hc2ssIGNhbGxlcik7Ci0KKwlhcmVhID0gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIGFsaWduLCBWTV9BTExPQyB8IFZNX1VOTElTVCwKKwkJCQkgIHN0YXJ0LCBlbmQsIG5vZGUsIGdmcF9tYXNrLCBjYWxsZXIpOwogCWlmICghYXJlYSkKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZmFpbDsKIAogCWFkZHIgPSBfX3ZtYWxsb2NfYXJlYV9ub2RlKGFyZWEsIGdmcF9tYXNrLCBwcm90LCBub2RlLCBjYWxsZXIpOwogCiAJLyoKKwkgKiBJbiB0aGlzIGZ1bmN0aW9uLCBuZXdseSBhbGxvY2F0ZWQgdm1fc3RydWN0IGlzIG5vdCBhZGRlZAorCSAqIHRvIHZtbGlzdCBhdCBfX2dldF92bV9hcmVhX25vZGUoKS4gc28sIGl0IGlzIGFkZGVkIGhlcmUuCisJICovCisJaW5zZXJ0X3ZtYWxsb2Nfdm1saXN0KGFyZWEpOworCisJLyoKIAkgKiBBIHJlZl9jb3VudCA9IDMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHZtX3N0cnVjdCBhbmQgdm1hcF9hcmVhCiAJICogc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gdGhlIF9fZ2V0X3ZtX2FyZWFfbm9kZSgpIGZ1bmN0aW9uIGNvbnRhaW4KIAkgKiByZWZlcmVuY2VzIHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHZtYWxsb2MnZWQgYmxvY2suCkBAIC0xNjE4LDYgKzE2NDgsMTIgQEAKIAlrbWVtbGVha19hbGxvYyhhZGRyLCByZWFsX3NpemUsIDMsIGdmcF9tYXNrKTsKIAogCXJldHVybiBhZGRyOworCitmYWlsOgorCXdhcm5fYWxsb2NfZmFpbGVkKGdmcF9tYXNrLCAwLAorCQkJICAidm1hbGxvYzogYWxsb2NhdGlvbiBmYWlsdXJlOiAlbHUgYnl0ZXNcbiIsCisJCQkgIHJlYWxfc2l6ZSk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCA5ZmRmY2U3Li5hMTg5M2MwIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtNDk1LDE1ICs0OTUsNiBAQAogCQkJcmV0dXJuIFBBR0VfQUNUSVZBVEU7CiAJCX0KIAotCQkvKgotCQkgKiBXYWl0IG9uIHdyaXRlYmFjayBpZiByZXF1ZXN0ZWQgdG8uIFRoaXMgaGFwcGVucyB3aGVuCi0JCSAqIGRpcmVjdCByZWNsYWltaW5nIGEgbGFyZ2UgY29udGlndW91cyBhcmVhIGFuZCB0aGUKLQkJICogZmlyc3QgYXR0ZW1wdCB0byBmcmVlIGEgcmFuZ2Ugb2YgcGFnZXMgZmFpbHMuCi0JCSAqLwotCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSAmJgotCQkgICAgKHNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfU1lOQykpCi0JCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCiAJCWlmICghUGFnZVdyaXRlYmFjayhwYWdlKSkgewogCQkJLyogc3luY2hyb25vdXMgd3JpdGUgb3IgYnJva2VuIGFfb3BzPyAqLwogCQkJQ2xlYXJQYWdlUmVjbGFpbShwYWdlKTsKQEAgLTY0MiwxMyArNjMzLDE0IEBACiAJCWxydSA9IExSVV9VTkVWSUNUQUJMRTsKIAkJYWRkX3BhZ2VfdG9fdW5ldmljdGFibGVfbGlzdChwYWdlKTsKIAkJLyoKLQkJICogV2hlbiByYWNpbmcgd2l0aCBhbiBtbG9jayBjbGVhcmluZyAocGFnZSBpcwotCQkgKiB1bmxvY2tlZCksIG1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBvdGhlciB0aHJlYWQgZG9lcwotCQkgKiBub3Qgb2JzZXJ2ZSBvdXIgc2V0dGluZyBvZiBQR19scnUgYW5kIGZhaWxzCi0JCSAqIGlzb2xhdGlvbiwgd2Ugc2VlIFBHX21sb2NrZWQgY2xlYXJlZCBiZWxvdyBhbmQgbW92ZQorCQkgKiBXaGVuIHJhY2luZyB3aXRoIGFuIG1sb2NrIG9yIEFTX1VORVZJQ1RBQkxFIGNsZWFyaW5nCisJCSAqIChwYWdlIGlzIHVubG9ja2VkKSBtYWtlIHN1cmUgdGhhdCBpZiB0aGUgb3RoZXIgdGhyZWFkCisJCSAqIGRvZXMgbm90IG9ic2VydmUgb3VyIHNldHRpbmcgb2YgUEdfbHJ1IGFuZCBmYWlscworCQkgKiBpc29sYXRpb24vY2hlY2tfbW92ZV91bmV2aWN0YWJsZV9wYWdlLAorCQkgKiB3ZSBzZWUgUEdfbWxvY2tlZC9BU19VTkVWSUNUQUJMRSBjbGVhcmVkIGJlbG93IGFuZCBtb3ZlCiAJCSAqIHRoZSBwYWdlIGJhY2sgdG8gdGhlIGV2aWN0YWJsZSBsaXN0LgogCQkgKgotCQkgKiBUaGUgb3RoZXIgc2lkZSBpcyBUZXN0Q2xlYXJQYWdlTWxvY2tlZCgpLgorCQkgKiBUaGUgb3RoZXIgc2lkZSBpcyBUZXN0Q2xlYXJQYWdlTWxvY2tlZCgpIG9yIHNobWVtX2xvY2soKS4KIAkJICovCiAJCXNtcF9tYigpOwogCX0KQEAgLTc1OSw3ICs3NTEsMTAgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hyaW5rX3BhZ2VfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlX2xpc3QsCiAJCQkJICAgICAgc3RydWN0IHpvbmUgKnpvbmUsCi0JCQkJICAgICAgc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCisJCQkJICAgICAgc3RydWN0IHNjYW5fY29udHJvbCAqc2MsCisJCQkJICAgICAgaW50IHByaW9yaXR5LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnJldF9ucl9kaXJ0eSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpyZXRfbnJfd3JpdGViYWNrKQogewogCUxJU1RfSEVBRChyZXRfcGFnZXMpOwogCUxJU1RfSEVBRChmcmVlX3BhZ2VzKTsKQEAgLTc2Nyw2ICs3NjIsNyBAQAogCXVuc2lnbmVkIGxvbmcgbnJfZGlydHkgPSAwOwogCXVuc2lnbmVkIGxvbmcgbnJfY29uZ2VzdGVkID0gMDsKIAl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CisJdW5zaWduZWQgbG9uZyBucl93cml0ZWJhY2sgPSAwOwogCiAJY29uZF9yZXNjaGVkKCk7CiAKQEAgLTgwMywxMyArNzk5LDEyIEBACiAJCQkoUGFnZVN3YXBDYWNoZShwYWdlKSAmJiAoc2MtPmdmcF9tYXNrICYgX19HRlBfSU8pKTsKIAogCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgeworCQkJbnJfd3JpdGViYWNrKys7CiAJCQkvKgotCQkJICogU3luY2hyb25vdXMgcmVjbGFpbSBpcyBwZXJmb3JtZWQgaW4gdHdvIHBhc3NlcywKLQkJCSAqIGZpcnN0IGFuIGFzeW5jaHJvbm91cyBwYXNzIG92ZXIgdGhlIGxpc3QgdG8KLQkJCSAqIHN0YXJ0IHBhcmFsbGVsIHdyaXRlYmFjaywgYW5kIGEgc2Vjb25kIHN5bmNocm9ub3VzCi0JCQkgKiBwYXNzIHRvIHdhaXQgZm9yIHRoZSBJTyB0byBjb21wbGV0ZS4gIFdhaXQgaGVyZQotCQkJICogZm9yIGFueSBwYWdlIGZvciB3aGljaCB3cml0ZWJhY2sgaGFzIGFscmVhZHkKLQkJCSAqIHN0YXJ0ZWQuCisJCQkgKiBTeW5jaHJvbm91cyByZWNsYWltIGNhbm5vdCBxdWV1ZSBwYWdlcyBmb3IKKwkJCSAqIHdyaXRlYmFjayBkdWUgdG8gdGhlIHBvc3NpYmlsaXR5IG9mIHN0YWNrIG92ZXJmbG93CisJCQkgKiBidXQgaWYgaXQgZW5jb3VudGVycyBhIHBhZ2UgdW5kZXIgd3JpdGViYWNrLCB3YWl0CisJCQkgKiBmb3IgdGhlIElPIHRvIGNvbXBsZXRlLgogCQkJICovCiAJCQlpZiAoKHNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfU1lOQykgJiYKIAkJCSAgICBtYXlfZW50ZXJfZnMpCkBAIC04NjUsNiArODYwLDI1IEBACiAJCWlmIChQYWdlRGlydHkocGFnZSkpIHsKIAkJCW5yX2RpcnR5Kys7CiAKKwkJCS8qCisJCQkgKiBPbmx5IGtzd2FwZCBjYW4gd3JpdGViYWNrIGZpbGVzeXN0ZW0gcGFnZXMgdG8KKwkJCSAqIGF2b2lkIHJpc2sgb2Ygc3RhY2sgb3ZlcmZsb3cgYnV0IGRvIG5vdCB3cml0ZWJhY2sKKwkJCSAqIHVubGVzcyB1bmRlciBzaWduaWZpY2FudCBwcmVzc3VyZS4KKwkJCSAqLworCQkJaWYgKHBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKSAmJgorCQkJCQkoIWN1cnJlbnRfaXNfa3N3YXBkKCkgfHwgcHJpb3JpdHkgPj0gREVGX1BSSU9SSVRZIC0gMikpIHsKKwkJCQkvKgorCQkJCSAqIEltbWVkaWF0ZWx5IHJlY2xhaW0gd2hlbiB3cml0dGVuIGJhY2suCisJCQkJICogU2ltaWxhciBpbiBwcmluY2lwYWwgdG8gZGVhY3RpdmF0ZV9wYWdlKCkKKwkJCQkgKiBleGNlcHQgd2UgYWxyZWFkeSBoYXZlIHRoZSBwYWdlIGlzb2xhdGVkCisJCQkJICogYW5kIGtub3cgaXQncyBkaXJ0eQorCQkJCSAqLworCQkJCWluY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfVk1TQ0FOX0lNTUVESUFURSk7CisJCQkJU2V0UGFnZVJlY2xhaW0ocGFnZSk7CisKKwkJCQlnb3RvIGtlZXBfbG9ja2VkOworCQkJfQorCiAJCQlpZiAocmVmZXJlbmNlcyA9PSBQQUdFUkVGX1JFQ0xBSU1fQ0xFQU4pCiAJCQkJZ290byBrZWVwX2xvY2tlZDsKIAkJCWlmICghbWF5X2VudGVyX2ZzKQpAQCAtOTk5LDYgKzEwMTMsOCBAQAogCiAJbGlzdF9zcGxpY2UoJnJldF9wYWdlcywgcGFnZV9saXN0KTsKIAljb3VudF92bV9ldmVudHMoUEdBQ1RJVkFURSwgcGdhY3RpdmF0ZSk7CisJKnJldF9ucl9kaXJ0eSArPSBucl9kaXJ0eTsKKwkqcmV0X25yX3dyaXRlYmFjayArPSBucl93cml0ZWJhY2s7CiAJcmV0dXJuIG5yX3JlY2xhaW1lZDsKIH0KIApAQCAtMTAxMiwyMyArMTAyOCwyNyBAQAogICoKICAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtdmUgZXJybm8gb24gZmFpbHVyZS4KICAqLwotaW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1vZGUsIGludCBmaWxlKQoraW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaXNvbGF0ZV9tb2RlX3QgbW9kZSwgaW50IGZpbGUpCiB7CisJYm9vbCBhbGxfbHJ1X21vZGU7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKIAkvKiBPbmx5IHRha2UgcGFnZXMgb24gdGhlIExSVS4gKi8KIAlpZiAoIVBhZ2VMUlUocGFnZSkpCiAJCXJldHVybiByZXQ7CiAKKwlhbGxfbHJ1X21vZGUgPSAobW9kZSAmIChJU09MQVRFX0FDVElWRXxJU09MQVRFX0lOQUNUSVZFKSkgPT0KKwkJKElTT0xBVEVfQUNUSVZFfElTT0xBVEVfSU5BQ1RJVkUpOworCiAJLyoKIAkgKiBXaGVuIGNoZWNraW5nIHRoZSBhY3RpdmUgc3RhdGUsIHdlIG5lZWQgdG8gYmUgc3VyZSB3ZSBhcmUKIAkgKiBkZWFsaW5nIHdpdGggY29tcGFyaWJsZSBib29sZWFuIHZhbHVlcy4gIFRha2UgdGhlIGxvZ2ljYWwgbm90CiAJICogb2YgZWFjaC4KIAkgKi8KLQlpZiAobW9kZSAhPSBJU09MQVRFX0JPVEggJiYgKCFQYWdlQWN0aXZlKHBhZ2UpICE9ICFtb2RlKSkKKwlpZiAoIWFsbF9scnVfbW9kZSAmJiAhUGFnZUFjdGl2ZShwYWdlKSAhPSAhKG1vZGUgJiBJU09MQVRFX0FDVElWRSkpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAobW9kZSAhPSBJU09MQVRFX0JPVEggJiYgcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpICE9IGZpbGUpCisJaWYgKCFhbGxfbHJ1X21vZGUgJiYgISFwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkgIT0gZmlsZSkKIAkJcmV0dXJuIHJldDsKIAogCS8qCkBAIC0xMDQxLDYgKzEwNjEsMTIgQEAKIAogCXJldCA9IC1FQlVTWTsKIAorCWlmICgobW9kZSAmIElTT0xBVEVfQ0xFQU4pICYmIChQYWdlRGlydHkocGFnZSkgfHwgUGFnZVdyaXRlYmFjayhwYWdlKSkpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKG1vZGUgJiBJU09MQVRFX1VOTUFQUEVEKSAmJiBwYWdlX21hcHBlZChwYWdlKSkKKwkJcmV0dXJuIHJldDsKKwogCWlmIChsaWtlbHkoZ2V0X3BhZ2VfdW5sZXNzX3plcm8ocGFnZSkpKSB7CiAJCS8qCiAJCSAqIEJlIGNhcmVmdWwgbm90IHRvIGNsZWFyIFBhZ2VMUlUgdW50aWwgYWZ0ZXIgd2UncmUKQEAgLTEwNzYsNyArMTEwMiw4IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlzb2xhdGVfbHJ1X3BhZ2VzKHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKIAkJc3RydWN0IGxpc3RfaGVhZCAqc3JjLCBzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsCi0JCXVuc2lnbmVkIGxvbmcgKnNjYW5uZWQsIGludCBvcmRlciwgaW50IG1vZGUsIGludCBmaWxlKQorCQl1bnNpZ25lZCBsb25nICpzY2FubmVkLCBpbnQgb3JkZXIsIGlzb2xhdGVfbW9kZV90IG1vZGUsCisJCWludCBmaWxlKQogewogCXVuc2lnbmVkIGxvbmcgbnJfdGFrZW4gPSAwOwogCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfdGFrZW4gPSAwOwpAQCAtMTIwMSw4ICsxMjI4LDggQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlzb2xhdGVfcGFnZXNfZ2xvYmFsKHVuc2lnbmVkIGxvbmcgbnIsCiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKIAkJCQkJdW5zaWduZWQgbG9uZyAqc2Nhbm5lZCwgaW50IG9yZGVyLAotCQkJCQlpbnQgbW9kZSwgc3RydWN0IHpvbmUgKnosCi0JCQkJCWludCBhY3RpdmUsIGludCBmaWxlKQorCQkJCQlpc29sYXRlX21vZGVfdCBtb2RlLAorCQkJCQlzdHJ1Y3Qgem9uZSAqeiwJaW50IGFjdGl2ZSwgaW50IGZpbGUpCiB7CiAJaW50IGxydSA9IExSVV9CQVNFOwogCWlmIChhY3RpdmUpCkBAIC0xMzk0LDcgKzE0MjEsNyBAQAogfQogCiAvKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsZXIgc2hvdWxkIHdhaXQgdG8gY2xlYW4gZGlydHkvd3JpdGViYWNrIHBhZ2VzLgorICogUmV0dXJucyB0cnVlIGlmIGEgZGlyZWN0IHJlY2xhaW0gc2hvdWxkIHdhaXQgb24gcGFnZXMgdW5kZXIgd3JpdGViYWNrLgogICoKICAqIElmIHdlIGFyZSBkaXJlY3QgcmVjbGFpbWluZyBmb3IgY29udGlndW91cyBwYWdlcyBhbmQgd2UgZG8gbm90IHJlY2xhaW0KICAqIGV2ZXJ5dGhpbmcgaW4gdGhlIGxpc3QsIHRyeSBhZ2FpbiBhbmQgd2FpdCBmb3Igd3JpdGViYWNrIElPIHRvIGNvbXBsZXRlLgpAQCAtMTQ0OCw2ICsxNDc1LDkgQEAKIAl1bnNpZ25lZCBsb25nIG5yX3Rha2VuOwogCXVuc2lnbmVkIGxvbmcgbnJfYW5vbjsKIAl1bnNpZ25lZCBsb25nIG5yX2ZpbGU7CisJdW5zaWduZWQgbG9uZyBucl9kaXJ0eSA9IDA7CisJdW5zaWduZWQgbG9uZyBucl93cml0ZWJhY2sgPSAwOworCWlzb2xhdGVfbW9kZV90IHJlY2xhaW1fbW9kZSA9IElTT0xBVEVfSU5BQ1RJVkU7CiAKIAl3aGlsZSAodW5saWtlbHkodG9vX21hbnlfaXNvbGF0ZWQoem9uZSwgZmlsZSwgc2MpKSkgewogCQljb25nZXN0aW9uX3dhaXQoQkxLX1JXX0FTWU5DLCBIWi8xMCk7CkBAIC0xNDU4LDE1ICsxNDg4LDIxIEBACiAJfQogCiAJc2V0X3JlY2xhaW1fbW9kZShwcmlvcml0eSwgc2MsIGZhbHNlKTsKKwlpZiAoc2MtPnJlY2xhaW1fbW9kZSAmIFJFQ0xBSU1fTU9ERV9MVU1QWVJFQ0xBSU0pCisJCXJlY2xhaW1fbW9kZSB8PSBJU09MQVRFX0FDVElWRTsKKwogCWxydV9hZGRfZHJhaW4oKTsKKworCWlmICghc2MtPm1heV91bm1hcCkKKwkJcmVjbGFpbV9tb2RlIHw9IElTT0xBVEVfVU5NQVBQRUQ7CisJaWYgKCFzYy0+bWF5X3dyaXRlcGFnZSkKKwkJcmVjbGFpbV9tb2RlIHw9IElTT0xBVEVfQ0xFQU47CisKIAlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAKIAlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKLQkJbnJfdGFrZW4gPSBpc29sYXRlX3BhZ2VzX2dsb2JhbChucl90b19zY2FuLAotCQkJJnBhZ2VfbGlzdCwgJm5yX3NjYW5uZWQsIHNjLT5vcmRlciwKLQkJCXNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfTFVNUFlSRUNMQUlNID8KLQkJCQkJSVNPTEFURV9CT1RIIDogSVNPTEFURV9JTkFDVElWRSwKLQkJCXpvbmUsIDAsIGZpbGUpOworCQlucl90YWtlbiA9IGlzb2xhdGVfcGFnZXNfZ2xvYmFsKG5yX3RvX3NjYW4sICZwYWdlX2xpc3QsCisJCQkmbnJfc2Nhbm5lZCwgc2MtPm9yZGVyLCByZWNsYWltX21vZGUsIHpvbmUsIDAsIGZpbGUpOwogCQl6b25lLT5wYWdlc19zY2FubmVkICs9IG5yX3NjYW5uZWQ7CiAJCWlmIChjdXJyZW50X2lzX2tzd2FwZCgpKQogCQkJX19jb3VudF96b25lX3ZtX2V2ZW50cyhQR1NDQU5fS1NXQVBELCB6b25lLApAQCAtMTQ3NSwxMiArMTUxMSw5IEBACiAJCQlfX2NvdW50X3pvbmVfdm1fZXZlbnRzKFBHU0NBTl9ESVJFQ1QsIHpvbmUsCiAJCQkJCSAgICAgICBucl9zY2FubmVkKTsKIAl9IGVsc2UgewotCQlucl90YWtlbiA9IG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyhucl90b19zY2FuLAotCQkJJnBhZ2VfbGlzdCwgJm5yX3NjYW5uZWQsIHNjLT5vcmRlciwKLQkJCXNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfTFVNUFlSRUNMQUlNID8KLQkJCQkJSVNPTEFURV9CT1RIIDogSVNPTEFURV9JTkFDVElWRSwKLQkJCXpvbmUsIHNjLT5tZW1fY2dyb3VwLAotCQkJMCwgZmlsZSk7CisJCW5yX3Rha2VuID0gbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKG5yX3RvX3NjYW4sICZwYWdlX2xpc3QsCisJCQkmbnJfc2Nhbm5lZCwgc2MtPm9yZGVyLCByZWNsYWltX21vZGUsIHpvbmUsCisJCQlzYy0+bWVtX2Nncm91cCwgMCwgZmlsZSk7CiAJCS8qCiAJCSAqIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcygpIGtlZXBzIHRyYWNrIG9mCiAJCSAqIHNjYW5uZWQgcGFnZXMgb24gaXRzIG93bi4KQEAgLTE0OTYsMTIgKzE1MjksMTQgQEAKIAogCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCi0JbnJfcmVjbGFpbWVkID0gc2hyaW5rX3BhZ2VfbGlzdCgmcGFnZV9saXN0LCB6b25lLCBzYyk7CisJbnJfcmVjbGFpbWVkID0gc2hyaW5rX3BhZ2VfbGlzdCgmcGFnZV9saXN0LCB6b25lLCBzYywgcHJpb3JpdHksCisJCQkJCQkmbnJfZGlydHksICZucl93cml0ZWJhY2spOwogCiAJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHN5bmNyb25vdXNseSB3YWl0IGZvciB3cml0ZWJhY2sgKi8KIAlpZiAoc2hvdWxkX3JlY2xhaW1fc3RhbGwobnJfdGFrZW4sIG5yX3JlY2xhaW1lZCwgcHJpb3JpdHksIHNjKSkgewogCQlzZXRfcmVjbGFpbV9tb2RlKHByaW9yaXR5LCBzYywgdHJ1ZSk7Ci0JCW5yX3JlY2xhaW1lZCArPSBzaHJpbmtfcGFnZV9saXN0KCZwYWdlX2xpc3QsIHpvbmUsIHNjKTsKKwkJbnJfcmVjbGFpbWVkICs9IHNocmlua19wYWdlX2xpc3QoJnBhZ2VfbGlzdCwgem9uZSwgc2MsCisJCQkJCXByaW9yaXR5LCAmbnJfZGlydHksICZucl93cml0ZWJhY2spOwogCX0KIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CkBAIC0xNTExLDYgKzE1NDYsMzIgQEAKIAogCXB1dGJhY2tfbHJ1X3BhZ2VzKHpvbmUsIHNjLCBucl9hbm9uLCBucl9maWxlLCAmcGFnZV9saXN0KTsKIAorCS8qCisJICogSWYgcmVjbGFpbSBpcyBpc29sYXRpbmcgZGlydHkgcGFnZXMgdW5kZXIgd3JpdGViYWNrLCBpdCBpbXBsaWVzCisJICogdGhhdCB0aGUgbG9uZy1saXZlZCBwYWdlIGFsbG9jYXRpb24gcmF0ZSBpcyBleGNlZWRpbmcgdGhlIHBhZ2UKKwkgKiBsYXVuZGVyaW5nIHJhdGUuIEVpdGhlciB0aGUgZ2xvYmFsIGxpbWl0cyBhcmUgbm90IGJlaW5nIGVmZmVjdGl2ZQorCSAqIGF0IHRocm90dGxpbmcgcHJvY2Vzc2VzIGR1ZSB0byB0aGUgcGFnZSBkaXN0cmlidXRpb24gdGhyb3VnaG91dAorCSAqIHpvbmVzIG9yIHRoZXJlIGlzIGhlYXZ5IHVzYWdlIG9mIGEgc2xvdyBiYWNraW5nIGRldmljZS4gVGhlCisJICogb25seSBvcHRpb24gaXMgdG8gdGhyb3R0bGUgZnJvbSByZWNsYWltIGNvbnRleHQgd2hpY2ggaXMgbm90IGlkZWFsCisJICogYXMgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSBkaXJ0eWluZyBwcm9jZXNzIGlzIHRocm90dGxlZCBpbiB0aGUKKwkgKiBzYW1lIHdheSBiYWxhbmNlX2RpcnR5X3BhZ2VzKCkgbWFuYWdlcy4KKwkgKgorCSAqIFRoaXMgc2NhbGVzIHRoZSBudW1iZXIgb2YgZGlydHkgcGFnZXMgdGhhdCBtdXN0IGJlIHVuZGVyIHdyaXRlYmFjaworCSAqIGJlZm9yZSB0aHJvdHRsaW5nIGRlcGVuZGluZyBvbiBwcmlvcml0eS4gSXQgaXMgYSBzaW1wbGUgYmFja29mZgorCSAqIGZ1bmN0aW9uIHRoYXQgaGFzIHRoZSBtb3N0IGVmZmVjdCBpbiB0aGUgcmFuZ2UgREVGX1BSSU9SSVRZIHRvCisJICogREVGX1BSSU9SSVRZLTIgd2hpY2ggaXMgdGhlIHByaW9yaXR5IHJlY2xhaW0gaXMgY29uc2lkZXJlZCB0byBiZQorCSAqIGluIHRyb3VibGUgYW5kIHJlY2xhaW0gaXMgY29uc2lkZXJlZCB0byBiZSBpbiB0cm91YmxlLgorCSAqCisJICogREVGX1BSSU9SSVRZICAgMTAwJSBpc29sYXRlZCBwYWdlcyBtdXN0IGJlIFBhZ2VXcml0ZWJhY2sgdG8gdGhyb3R0bGUKKwkgKiBERUZfUFJJT1JJVFktMSAgNTAlIG11c3QgYmUgUGFnZVdyaXRlYmFjaworCSAqIERFRl9QUklPUklUWS0yICAyNSUgbXVzdCBiZSBQYWdlV3JpdGViYWNrLCBrc3dhcGQgaW4gdHJvdWJsZQorCSAqIC4uLgorCSAqIERFRl9QUklPUklUWS02IEZvciBTV0FQX0NMVVNURVJfTUFYIGlzb2xhdGVkIHBhZ2VzLCB0aHJvdHRsZSBpZiBhbnkKKwkgKiAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkIHBhZ2UgaXMgUGFnZVdyaXRlYmFjaworCSAqLworCWlmIChucl93cml0ZWJhY2sgJiYgbnJfd3JpdGViYWNrID49IChucl90YWtlbiA+PiAoREVGX1BSSU9SSVRZLXByaW9yaXR5KSkpCisJCXdhaXRfaWZmX2Nvbmdlc3RlZCh6b25lLCBCTEtfUldfQVNZTkMsIEhaLzEwKTsKKwogCXRyYWNlX21tX3Ztc2Nhbl9scnVfc2hyaW5rX2luYWN0aXZlKHpvbmUtPnpvbmVfcGdkYXQtPm5vZGVfaWQsCiAJCXpvbmVfaWR4KHpvbmUpLAogCQlucl9zY2FubmVkLCBucl9yZWNsYWltZWQsCkBAIC0xNTgyLDE5ICsxNjQzLDI2IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICpyZWNsYWltX3N0YXQgPSBnZXRfcmVjbGFpbV9zdGF0KHpvbmUsIHNjKTsKIAl1bnNpZ25lZCBsb25nIG5yX3JvdGF0ZWQgPSAwOworCWlzb2xhdGVfbW9kZV90IHJlY2xhaW1fbW9kZSA9IElTT0xBVEVfQUNUSVZFOwogCiAJbHJ1X2FkZF9kcmFpbigpOworCisJaWYgKCFzYy0+bWF5X3VubWFwKQorCQlyZWNsYWltX21vZGUgfD0gSVNPTEFURV9VTk1BUFBFRDsKKwlpZiAoIXNjLT5tYXlfd3JpdGVwYWdlKQorCQlyZWNsYWltX21vZGUgfD0gSVNPTEFURV9DTEVBTjsKKwogCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIAlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKIAkJbnJfdGFrZW4gPSBpc29sYXRlX3BhZ2VzX2dsb2JhbChucl9wYWdlcywgJmxfaG9sZCwKIAkJCQkJCSZwZ3NjYW5uZWQsIHNjLT5vcmRlciwKLQkJCQkJCUlTT0xBVEVfQUNUSVZFLCB6b25lLAorCQkJCQkJcmVjbGFpbV9tb2RlLCB6b25lLAogCQkJCQkJMSwgZmlsZSk7CiAJCXpvbmUtPnBhZ2VzX3NjYW5uZWQgKz0gcGdzY2FubmVkOwogCX0gZWxzZSB7CiAJCW5yX3Rha2VuID0gbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKG5yX3BhZ2VzLCAmbF9ob2xkLAogCQkJCQkJJnBnc2Nhbm5lZCwgc2MtPm9yZGVyLAotCQkJCQkJSVNPTEFURV9BQ1RJVkUsIHpvbmUsCisJCQkJCQlyZWNsYWltX21vZGUsIHpvbmUsCiAJCQkJCQlzYy0+bWVtX2Nncm91cCwgMSwgZmlsZSk7CiAJCS8qCiAJCSAqIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcygpIGtlZXBzIHRyYWNrIG9mCkBAIC0xNjk5LDcgKzE3NjcsNyBAQAogCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkKIAkJbG93ID0gaW5hY3RpdmVfYW5vbl9pc19sb3dfZ2xvYmFsKHpvbmUpOwogCWVsc2UKLQkJbG93ID0gbWVtX2Nncm91cF9pbmFjdGl2ZV9hbm9uX2lzX2xvdyhzYy0+bWVtX2Nncm91cCk7CisJCWxvdyA9IG1lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc2MtPm1lbV9jZ3JvdXAsIHpvbmUpOwogCXJldHVybiBsb3c7CiB9CiAjZWxzZQpAQCAtMTc0Miw3ICsxODEwLDcgQEAKIAlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpCiAJCWxvdyA9IGluYWN0aXZlX2ZpbGVfaXNfbG93X2dsb2JhbCh6b25lKTsKIAllbHNlCi0JCWxvdyA9IG1lbV9jZ3JvdXBfaW5hY3RpdmVfZmlsZV9pc19sb3coc2MtPm1lbV9jZ3JvdXApOworCQlsb3cgPSBtZW1fY2dyb3VwX2luYWN0aXZlX2ZpbGVfaXNfbG93KHNjLT5tZW1fY2dyb3VwLCB6b25lKTsKIAlyZXR1cm4gbG93OwogfQogCkBAIC0xNzk1LDEyICsxODYzLDE5IEBACiAJZW51bSBscnVfbGlzdCBsOwogCWludCBub3N3YXAgPSAwOwogCWJvb2wgZm9yY2Vfc2NhbiA9IGZhbHNlOwotCXVuc2lnbmVkIGxvbmcgbnJfZm9yY2Vfc2NhblsyXTsKIAotCS8qIGtzd2FwZCBkb2VzIHpvbmUgYmFsYW5jaW5nIGFuZCBuZWVkcyB0byBzY2FuIHRoaXMgem9uZSAqLworCS8qCisJICogSWYgdGhlIHpvbmUgb3IgbWVtY2cgaXMgc21hbGwsIG5yW2xdIGNhbiBiZSAwLiAgVGhpcworCSAqIHJlc3VsdHMgaW4gbm8gc2Nhbm5pbmcgb24gdGhpcyBwcmlvcml0eSBhbmQgYSBwb3RlbnRpYWwKKwkgKiBwcmlvcml0eSBkcm9wLiAgR2xvYmFsIGRpcmVjdCByZWNsYWltIGNhbiBnbyB0byB0aGUgbmV4dAorCSAqIHpvbmUgYW5kIHRlbmRzIHRvIGhhdmUgbm8gcHJvYmxlbXMuIEdsb2JhbCBrc3dhcGQgaXMgZm9yCisJICogem9uZSBiYWxhbmNpbmcgYW5kIGl0IG5lZWRzIHRvIHNjYW4gYSBtaW5pbXVtIGFtb3VudC4gV2hlbgorCSAqIHJlY2xhaW1pbmcgZm9yIGEgbWVtY2csIGEgcHJpb3JpdHkgZHJvcCBjYW4gY2F1c2UgaGlnaAorCSAqIGxhdGVuY2llcywgc28gaXQncyBiZXR0ZXIgdG8gc2NhbiBhIG1pbmltdW0gYW1vdW50IHRoZXJlIGFzCisJICogd2VsbC4KKwkgKi8KIAlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykgJiYgY3VycmVudF9pc19rc3dhcGQoKSkKIAkJZm9yY2Vfc2NhbiA9IHRydWU7Ci0JLyogbWVtY2cgbWF5IGhhdmUgc21hbGwgbGltaXQgYW5kIG5lZWQgdG8gYXZvaWQgcHJpb3JpdHkgZHJvcCAqLwogCWlmICghc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpCiAJCWZvcmNlX3NjYW4gPSB0cnVlOwogCkBAIC0xODEwLDggKzE4ODUsNiBAQAogCQlmcmFjdGlvblswXSA9IDA7CiAJCWZyYWN0aW9uWzFdID0gMTsKIAkJZGVub21pbmF0b3IgPSAxOwotCQlucl9mb3JjZV9zY2FuWzBdID0gMDsKLQkJbnJfZm9yY2Vfc2NhblsxXSA9IFNXQVBfQ0xVU1RFUl9NQVg7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTgyOCw4ICsxOTAxLDYgQEAKIAkJCWZyYWN0aW9uWzBdID0gMTsKIAkJCWZyYWN0aW9uWzFdID0gMDsKIAkJCWRlbm9taW5hdG9yID0gMTsKLQkJCW5yX2ZvcmNlX3NjYW5bMF0gPSBTV0FQX0NMVVNURVJfTUFYOwotCQkJbnJfZm9yY2Vfc2NhblsxXSA9IDA7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTE4NzgsMTEgKzE5NDksNiBAQAogCWZyYWN0aW9uWzBdID0gYXA7CiAJZnJhY3Rpb25bMV0gPSBmcDsKIAlkZW5vbWluYXRvciA9IGFwICsgZnAgKyAxOwotCWlmIChmb3JjZV9zY2FuKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc2NhbiA9IFNXQVBfQ0xVU1RFUl9NQVg7Ci0JCW5yX2ZvcmNlX3NjYW5bMF0gPSBkaXY2NF91NjQoc2NhbiAqIGFwLCBkZW5vbWluYXRvcik7Ci0JCW5yX2ZvcmNlX3NjYW5bMV0gPSBkaXY2NF91NjQoc2NhbiAqIGZwLCBkZW5vbWluYXRvcik7Ci0JfQogb3V0OgogCWZvcl9lYWNoX2V2aWN0YWJsZV9scnUobCkgewogCQlpbnQgZmlsZSA9IGlzX2ZpbGVfbHJ1KGwpOwpAQCAtMTg5MSwyMCArMTk1NywxMCBAQAogCQlzY2FuID0gem9uZV9ucl9scnVfcGFnZXMoem9uZSwgc2MsIGwpOwogCQlpZiAocHJpb3JpdHkgfHwgbm9zd2FwKSB7CiAJCQlzY2FuID4+PSBwcmlvcml0eTsKKwkJCWlmICghc2NhbiAmJiBmb3JjZV9zY2FuKQorCQkJCXNjYW4gPSBTV0FQX0NMVVNURVJfTUFYOwogCQkJc2NhbiA9IGRpdjY0X3U2NChzY2FuICogZnJhY3Rpb25bZmlsZV0sIGRlbm9taW5hdG9yKTsKIAkJfQotCi0JCS8qCi0JCSAqIElmIHpvbmUgaXMgc21hbGwgb3IgbWVtY2cgaXMgc21hbGwsIG5yW2xdIGNhbiBiZSAwLgotCQkgKiBUaGlzIHJlc3VsdHMgbm8tc2NhbiBvbiB0aGlzIHByaW9yaXR5IGFuZCBwcmlvcml0eSBkcm9wIGRvd24uCi0JCSAqIEZvciBnbG9iYWwgZGlyZWN0IHJlY2xhaW0sIGl0IGNhbiB2aXNpdCBuZXh0IHpvbmUgYW5kIHRlbmQKLQkJICogbm90IHRvIGhhdmUgcHJvYmxlbXMuIEZvciBnbG9iYWwga3N3YXBkLCBpdCdzIGZvciB6b25lCi0JCSAqIGJhbGFuY2luZyBhbmQgaXQgbmVlZCB0byBzY2FuIGEgc21hbGwgYW1vdW50cy4gV2hlbiB1c2luZwotCQkgKiBtZW1jZywgcHJpb3JpdHkgZHJvcCBjYW4gY2F1c2UgYmlnIGxhdGVuY3kuIFNvLCBpdCdzIGJldHRlcgotCQkgKiB0byBzY2FuIHNtYWxsIGFtb3VudC4gU2VlIG1heV9ub3NjYW4gYWJvdmUuCi0JCSAqLwotCQlpZiAoIXNjYW4gJiYgZm9yY2Vfc2NhbikKLQkJCXNjYW4gPSBucl9mb3JjZV9zY2FuW2ZpbGVdOwogCQlucltsXSA9IHNjYW47CiAJfQogfQpAQCAtMTk4MywxMiArMjAzOSwxNCBAQAogCWVudW0gbHJ1X2xpc3QgbDsKIAl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCwgbnJfc2Nhbm5lZDsKIAl1bnNpZ25lZCBsb25nIG5yX3RvX3JlY2xhaW0gPSBzYy0+bnJfdG9fcmVjbGFpbTsKKwlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKIAogcmVzdGFydDoKIAlucl9yZWNsYWltZWQgPSAwOwogCW5yX3NjYW5uZWQgPSBzYy0+bnJfc2Nhbm5lZDsKIAlnZXRfc2Nhbl9jb3VudCh6b25lLCBzYywgbnIsIHByaW9yaXR5KTsKIAorCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKIAl3aGlsZSAobnJbTFJVX0lOQUNUSVZFX0FOT05dIHx8IG5yW0xSVV9BQ1RJVkVfRklMRV0gfHwKIAkJCQkJbnJbTFJVX0lOQUNUSVZFX0ZJTEVdKSB7CiAJCWZvcl9lYWNoX2V2aWN0YWJsZV9scnUobCkgewpAQCAtMjAxMiw2ICsyMDcwLDcgQEAKIAkJaWYgKG5yX3JlY2xhaW1lZCA+PSBucl90b19yZWNsYWltICYmIHByaW9yaXR5IDwgREVGX1BSSU9SSVRZKQogCQkJYnJlYWs7CiAJfQorCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAJc2MtPm5yX3JlY2xhaW1lZCArPSBucl9yZWNsYWltZWQ7CiAKIAkvKgpAQCAtMjA0NCwxNCArMjEwMywxOSBAQAogICoKICAqIElmIGEgem9uZSBpcyBkZWVtZWQgdG8gYmUgZnVsbCBvZiBwaW5uZWQgcGFnZXMgdGhlbiBqdXN0IGdpdmUgaXQgYSBsaWdodAogICogc2NhbiB0aGVuIGdpdmUgdXAgb24gaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgYSB6b25lIGlzIGJlaW5nIHJlY2xhaW1lZCBmb3IgYSBjb3N0bHkKKyAqIGhpZ2gtb3JkZXIgYWxsb2NhdGlvbiBhbmQgY29tcGFjdGlvbiBpcyBlaXRoZXIgcmVhZHkgdG8gYmVnaW4gb3IgZGVmZXJyZWQuCisgKiBUaGlzIGluZGljYXRlcyB0byB0aGUgY2FsbGVyIHRoYXQgaXQgc2hvdWxkIHJldHJ5IHRoZSBhbGxvY2F0aW9uIG9yIGZhaWwuCiAgKi8KLXN0YXRpYyB2b2lkIHNocmlua196b25lcyhpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCitzdGF0aWMgYm9vbCBzaHJpbmtfem9uZXMoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAogCQkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKIHsKIAlzdHJ1Y3Qgem9uZXJlZiAqejsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAl1bnNpZ25lZCBsb25nIG5yX3NvZnRfcmVjbGFpbWVkOwogCXVuc2lnbmVkIGxvbmcgbnJfc29mdF9zY2FubmVkOworCWJvb2wgc2hvdWxkX2Fib3J0X3JlY2xhaW0gPSBmYWxzZTsKIAogCWZvcl9lYWNoX3pvbmVfem9uZWxpc3Rfbm9kZW1hc2soem9uZSwgeiwgem9uZWxpc3QsCiAJCQkJCWdmcF96b25lKHNjLT5nZnBfbWFzayksIHNjLT5ub2RlbWFzaykgewpAQCAtMjA2Niw2ICsyMTMwLDIzIEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoem9uZS0+YWxsX3VucmVjbGFpbWFibGUgJiYgcHJpb3JpdHkgIT0gREVGX1BSSU9SSVRZKQogCQkJCWNvbnRpbnVlOwkvKiBMZXQga3N3YXBkIHBvbGwgaXQgKi8KKwkJCWlmIChDT01QQUNUSU9OX0JVSUxEKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBhbHJlYWR5IGhhdmUgcGxlbnR5IG9mIG1lbW9yeSBmcmVlIGZvcgorCQkJCSAqIGNvbXBhY3Rpb24gaW4gdGhpcyB6b25lLCBkb24ndCBmcmVlIGFueSBtb3JlLgorCQkJCSAqIEV2ZW4gdGhvdWdoIGNvbXBhY3Rpb24gaXMgaW52b2tlZCBmb3IgYW55CisJCQkJICogbm9uLXplcm8gb3JkZXIsIG9ubHkgZnJlcXVlbnQgY29zdGx5IG9yZGVyCisJCQkJICogcmVjbGFtYXRpb24gaXMgZGlzcnVwdGl2ZSBlbm91Z2ggdG8gYmVjb21lIGEKKwkJCQkgKiBub3RpY2FibGUgcHJvYmxlbSwgbGlrZSB0cmFuc3BhcmVudCBodWdlIHBhZ2UKKwkJCQkgKiBhbGxvY2F0aW9ucy4KKwkJCQkgKi8KKwkJCQlpZiAoc2MtPm9yZGVyID4gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgJiYKKwkJCQkJKGNvbXBhY3Rpb25fc3VpdGFibGUoem9uZSwgc2MtPm9yZGVyKSB8fAorCQkJCQkgY29tcGFjdGlvbl9kZWZlcnJlZCh6b25lKSkpIHsKKwkJCQkJc2hvdWxkX2Fib3J0X3JlY2xhaW0gPSB0cnVlOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CiAJCQkvKgogCQkJICogVGhpcyBzdGVhbHMgcGFnZXMgZnJvbSBtZW1vcnkgY2dyb3VwcyBvdmVyIHNvZnRsaW1pdAogCQkJICogYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiByZWNsYWltZWQgcGFnZXMgYW5kCkBAIC0yMDgzLDYgKzIxNjQsOCBAQAogCiAJCXNocmlua196b25lKHByaW9yaXR5LCB6b25lLCBzYyk7CiAJfQorCisJcmV0dXJuIHNob3VsZF9hYm9ydF9yZWNsYWltOwogfQogCiBzdGF0aWMgYm9vbCB6b25lX3JlY2xhaW1hYmxlKHN0cnVjdCB6b25lICp6b25lKQpAQCAtMjE0Nyw3ICsyMjMwLDkgQEAKIAkJc2MtPm5yX3NjYW5uZWQgPSAwOwogCQlpZiAoIXByaW9yaXR5KQogCQkJZGlzYWJsZV9zd2FwX3Rva2VuKHNjLT5tZW1fY2dyb3VwKTsKLQkJc2hyaW5rX3pvbmVzKHByaW9yaXR5LCB6b25lbGlzdCwgc2MpOworCQlpZiAoc2hyaW5rX3pvbmVzKHByaW9yaXR5LCB6b25lbGlzdCwgc2MpKQorCQkJYnJlYWs7CisKIAkJLyoKIAkJICogRG9uJ3Qgc2hyaW5rIHNsYWJzIHdoZW4gcmVjbGFpbWluZyBtZW1vcnkgZnJvbQogCQkgKiBvdmVyIGxpbWl0IGNncm91cHMKQEAgLTIxODEsNyArMjI2Niw4IEBACiAJCSAqLwogCQl3cml0ZWJhY2tfdGhyZXNob2xkID0gc2MtPm5yX3RvX3JlY2xhaW0gKyBzYy0+bnJfdG9fcmVjbGFpbSAvIDI7CiAJCWlmICh0b3RhbF9zY2FubmVkID4gd3JpdGViYWNrX3RocmVzaG9sZCkgewotCQkJd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcyhsYXB0b3BfbW9kZSA/IDAgOiB0b3RhbF9zY2FubmVkKTsKKwkJCXdha2V1cF9mbHVzaGVyX3RocmVhZHMobGFwdG9wX21vZGUgPyAwIDogdG90YWxfc2Nhbm5lZCwKKwkJCQkJCVdCX1JFQVNPTl9UUllfVE9fRlJFRV9QQUdFUyk7CiAJCQlzYy0+bWF5X3dyaXRlcGFnZSA9IDE7CiAJCX0KIApAQCAtMjY5MCw2ICsyNzc2LDggQEAKIAogCQkJLyogSWYgYmFsYW5jZWQsIGNsZWFyIHRoZSBjb25nZXN0ZWQgZmxhZyAqLwogCQkJem9uZV9jbGVhcl9mbGFnKHpvbmUsIFpPTkVfQ09OR0VTVEVEKTsKKwkJCWlmIChpIDw9ICpjbGFzc3pvbmVfaWR4KQorCQkJCWJhbGFuY2VkICs9IHpvbmUtPnByZXNlbnRfcGFnZXM7CiAJCX0KIAl9CiAKQEAgLTI3NjMsNyArMjg1MSw5IEBACiBzdGF0aWMgaW50IGtzd2FwZCh2b2lkICpwKQogewogCXVuc2lnbmVkIGxvbmcgb3JkZXIsIG5ld19vcmRlcjsKKwl1bnNpZ25lZCBiYWxhbmNlZF9vcmRlcjsKIAlpbnQgY2xhc3N6b25lX2lkeCwgbmV3X2NsYXNzem9uZV9pZHg7CisJaW50IGJhbGFuY2VkX2NsYXNzem9uZV9pZHg7CiAJcGdfZGF0YV90ICpwZ2RhdCA9IChwZ19kYXRhX3QqKXA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCkBAIC0yNzk0LDcgKzI4ODQsOSBAQAogCXNldF9mcmVlemFibGUoKTsKIAogCW9yZGVyID0gbmV3X29yZGVyID0gMDsKKwliYWxhbmNlZF9vcmRlciA9IDA7CiAJY2xhc3N6b25lX2lkeCA9IG5ld19jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsKKwliYWxhbmNlZF9jbGFzc3pvbmVfaWR4ID0gY2xhc3N6b25lX2lkeDsKIAlmb3IgKCA7IDsgKSB7CiAJCWludCByZXQ7CiAKQEAgLTI4MDMsNyArMjg5NSw4IEBACiAJCSAqIG5ldyByZXF1ZXN0IG9mIGEgc2ltaWxhciBvciBoYXJkZXIgdHlwZSB3aWxsIHN1Y2NlZWQgc29vbgogCQkgKiBzbyBjb25zaWRlciBnb2luZyB0byBzbGVlcCBvbiB0aGUgYmFzaXMgd2UgcmVjbGFpbWVkIGF0CiAJCSAqLwotCQlpZiAoY2xhc3N6b25lX2lkeCA+PSBuZXdfY2xhc3N6b25lX2lkeCAmJiBvcmRlciA9PSBuZXdfb3JkZXIpIHsKKwkJaWYgKGJhbGFuY2VkX2NsYXNzem9uZV9pZHggPj0gbmV3X2NsYXNzem9uZV9pZHggJiYKKwkJCQkJYmFsYW5jZWRfb3JkZXIgPT0gbmV3X29yZGVyKSB7CiAJCQluZXdfb3JkZXIgPSBwZ2RhdC0+a3N3YXBkX21heF9vcmRlcjsKIAkJCW5ld19jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPmNsYXNzem9uZV9pZHg7CiAJCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9ICAwOwpAQCAtMjgxOCw5ICsyOTExLDEyIEBACiAJCQlvcmRlciA9IG5ld19vcmRlcjsKIAkJCWNsYXNzem9uZV9pZHggPSBuZXdfY2xhc3N6b25lX2lkeDsKIAkJfSBlbHNlIHsKLQkJCWtzd2FwZF90cnlfdG9fc2xlZXAocGdkYXQsIG9yZGVyLCBjbGFzc3pvbmVfaWR4KTsKKwkJCWtzd2FwZF90cnlfdG9fc2xlZXAocGdkYXQsIGJhbGFuY2VkX29yZGVyLAorCQkJCQkJYmFsYW5jZWRfY2xhc3N6b25lX2lkeCk7CiAJCQlvcmRlciA9IHBnZGF0LT5rc3dhcGRfbWF4X29yZGVyOwogCQkJY2xhc3N6b25lX2lkeCA9IHBnZGF0LT5jbGFzc3pvbmVfaWR4OworCQkJbmV3X29yZGVyID0gb3JkZXI7CisJCQluZXdfY2xhc3N6b25lX2lkeCA9IGNsYXNzem9uZV9pZHg7CiAJCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IDA7CiAJCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IHBnZGF0LT5ucl96b25lcyAtIDE7CiAJCX0KQEAgLTI4MzUsNyArMjkzMSw5IEBACiAJCSAqLwogCQlpZiAoIXJldCkgewogCQkJdHJhY2VfbW1fdm1zY2FuX2tzd2FwZF93YWtlKHBnZGF0LT5ub2RlX2lkLCBvcmRlcik7Ci0JCQlvcmRlciA9IGJhbGFuY2VfcGdkYXQocGdkYXQsIG9yZGVyLCAmY2xhc3N6b25lX2lkeCk7CisJCQliYWxhbmNlZF9jbGFzc3pvbmVfaWR4ID0gY2xhc3N6b25lX2lkeDsKKwkJCWJhbGFuY2VkX29yZGVyID0gYmFsYW5jZV9wZ2RhdChwZ2RhdCwgb3JkZXIsCisJCQkJCQkmYmFsYW5jZWRfY2xhc3N6b25lX2lkeCk7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC0zMzQ3LDY2ICszNDQ1LDEyIEBACiAKIH0KIAotLyoqCi0gKiBzY2FuX3pvbmVfdW5ldmljdGFibGVfcGFnZXMgLSBjaGVjayB1bmV2aWN0YWJsZSBsaXN0IGZvciBldmljdGFibGUgcGFnZXMKLSAqIEB6b25lIC0gem9uZSBvZiB3aGljaCB0byBzY2FuIHRoZSB1bmV2aWN0YWJsZSBsaXN0Ci0gKgotICogU2NhbiBAem9uZSdzIHVuZXZpY3RhYmxlIExSVSBsaXN0cyB0byBjaGVjayBmb3IgcGFnZXMgdGhhdCBoYXZlIGJlY29tZQotICogZXZpY3RhYmxlLiAgTW92ZSB0aG9zZSB0aGF0IGhhdmUgdG8gQHpvbmUncyBpbmFjdGl2ZSBsaXN0IHdoZXJlIHRoZXkKLSAqIGJlY29tZSBjYW5kaWRhdGVzIGZvciByZWNsYWltLCB1bmxlc3Mgc2hyaW5rX2luYWN0aXZlX3pvbmUoKSBkZWNpZGVzCi0gKiB0byByZWFjdGl2YXRlIHRoZW0uICBQYWdlcyB0aGF0IGFyZSBzdGlsbCB1bmV2aWN0YWJsZSBhcmUgcm90YXRlZAotICogYmFjayBvbnRvIEB6b25lJ3MgdW5ldmljdGFibGUgbGlzdC4KLSAqLwotI2RlZmluZSBTQ0FOX1VORVZJQ1RBQkxFX0JBVENIX1NJWkUgMTZVTCAvKiBhcmJpdHJhcnkgbG9jayBob2xkIGJhdGNoIHNpemUgKi8KLXN0YXRpYyB2b2lkIHNjYW5fem9uZV91bmV2aWN0YWJsZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSkKK3N0YXRpYyB2b2lkIHdhcm5fc2Nhbl91bmV2aWN0YWJsZV9wYWdlcyh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxfdW5ldmljdGFibGUgPSAmem9uZS0+bHJ1W0xSVV9VTkVWSUNUQUJMRV0ubGlzdDsKLQl1bnNpZ25lZCBsb25nIHNjYW47Ci0JdW5zaWduZWQgbG9uZyBucl90b19zY2FuID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX1VORVZJQ1RBQkxFKTsKLQotCXdoaWxlIChucl90b19zY2FuID4gMCkgewotCQl1bnNpZ25lZCBsb25nIGJhdGNoX3NpemUgPSBtaW4obnJfdG9fc2NhbiwKLQkJCQkJCVNDQU5fVU5FVklDVEFCTEVfQkFUQ0hfU0laRSk7Ci0KLQkJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwotCQlmb3IgKHNjYW4gPSAwOyAgc2NhbiA8IGJhdGNoX3NpemU7IHNjYW4rKykgewotCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBscnVfdG9fcGFnZShsX3VuZXZpY3RhYmxlKTsKLQotCQkJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpCi0JCQkJY29udGludWU7Ci0KLQkJCXByZWZldGNod19wcmV2X2xydV9wYWdlKHBhZ2UsIGxfdW5ldmljdGFibGUsIGZsYWdzKTsKLQotCQkJaWYgKGxpa2VseShQYWdlTFJVKHBhZ2UpICYmIFBhZ2VVbmV2aWN0YWJsZShwYWdlKSkpCi0JCQkJY2hlY2tfbW92ZV91bmV2aWN0YWJsZV9wYWdlKHBhZ2UsIHpvbmUpOwotCi0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKLQotCQlucl90b19zY2FuIC09IGJhdGNoX3NpemU7Ci0JfQotfQotCi0KLS8qKgotICogc2Nhbl9hbGxfem9uZXNfdW5ldmljdGFibGVfcGFnZXMgLSBzY2FuIGFsbCB1bmV2aWN0YWJsZSBsaXN0cyBmb3IgZXZpY3RhYmxlIHBhZ2VzCi0gKgotICogQSByZWFsbHkgYmlnIGhhbW1lcjogIHNjYW4gYWxsIHpvbmVzJyB1bmV2aWN0YWJsZSBMUlUgbGlzdHMgdG8gY2hlY2sgZm9yCi0gKiBwYWdlcyB0aGF0IGhhdmUgYmVjb21lIGV2aWN0YWJsZS4gIE1vdmUgdGhvc2UgYmFjayB0byB0aGUgem9uZXMnCi0gKiBpbmFjdGl2ZSBsaXN0IHdoZXJlIHRoZXkgYmVjb21lIGNhbmRpZGF0ZXMgZm9yIHJlY2xhaW0uCi0gKiBUaGlzIG9jY3VycyB3aGVuLCBlLmcuLCB3ZSBoYXZlIHVuc3dhcHBhYmxlIHBhZ2VzIG9uIHRoZSB1bmV2aWN0YWJsZSBsaXN0cywKLSAqIGFuZCB3ZSBhZGQgc3dhcCB0byB0aGUgc3lzdGVtLiAgQXMgc3VjaCwgaXQgcnVucyBpbiB0aGUgY29udGV4dCBvZiBhIHRhc2sKLSAqIHRoYXQgaGFzIHBvc3NpYmx5L3Byb2JhYmx5IG1hZGUgc29tZSBwcmV2aW91c2x5IHVuZXZpY3RhYmxlIHBhZ2VzCi0gKiBldmljdGFibGUuCi0gKi8KLXN0YXRpYyB2b2lkIHNjYW5fYWxsX3pvbmVzX3VuZXZpY3RhYmxlX3BhZ2VzKHZvaWQpCi17Ci0Jc3RydWN0IHpvbmUgKnpvbmU7Ci0KLQlmb3JfZWFjaF96b25lKHpvbmUpIHsKLQkJc2Nhbl96b25lX3VuZXZpY3RhYmxlX3BhZ2VzKHpvbmUpOwotCX0KKwlwcmludGtfb25jZShLRVJOX1dBUk5JTkcKKwkJICAgICJUaGUgc2Nhbl91bmV2aWN0YWJsZV9wYWdlcyBzeXNjdGwvbm9kZS1pbnRlcmZhY2UgaGFzIGJlZW4gIgorCQkgICAgImRpc2FibGVkIGZvciBsYWNrIG9mIGEgbGVnaXRpbWF0ZSB1c2UgY2FzZS4gIElmIHlvdSBoYXZlICIKKwkJICAgICJvbmUsIHBsZWFzZSBzZW5kIGFuIGVtYWlsIHRvIGxpbnV4LW1tQGt2YWNrLm9yZy5cbiIpOwogfQogCiAvKgpAQCAtMzQxOSwxMSArMzQ2Myw4IEBACiAJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJICAgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKIHsKKwl3YXJuX3NjYW5fdW5ldmljdGFibGVfcGFnZXMoKTsKIAlwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwotCi0JaWYgKHdyaXRlICYmICoodW5zaWduZWQgbG9uZyAqKXRhYmxlLT5kYXRhKQotCQlzY2FuX2FsbF96b25lc191bmV2aWN0YWJsZV9wYWdlcygpOwotCiAJc2Nhbl91bmV2aWN0YWJsZV9wYWdlcyA9IDA7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNDM4LDYgKzM0NzksNyBAQAogCQkJCQkgIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLAogCQkJCQkgIGNoYXIgKmJ1ZikKIHsKKwl3YXJuX3NjYW5fdW5ldmljdGFibGVfcGFnZXMoKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsJLyogYWx3YXlzIHplcm87IHNob3VsZCBmaXQuLi4gKi8KIH0KIApAQCAtMzQ0NSwxOSArMzQ4Nyw3IEBACiAJCQkJCSAgIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLAogCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3Qgem9uZSAqbm9kZV96b25lcyA9IE5PREVfREFUQShkZXYtPmlkKS0+bm9kZV96b25lczsKLQlzdHJ1Y3Qgem9uZSAqem9uZTsKLQl1bnNpZ25lZCBsb25nIHJlczsKLQl1bnNpZ25lZCBsb25nIHJlcSA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZyZXMpOwotCi0JaWYgKCFyZXEpCi0JCXJldHVybiAxOwkvKiB6ZXJvIGlzIG5vLW9wICovCi0KLQlmb3IgKHpvbmUgPSBub2RlX3pvbmVzOyB6b25lIC0gbm9kZV96b25lcyA8IE1BWF9OUl9aT05FUzsgKyt6b25lKSB7Ci0JCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCi0JCQljb250aW51ZTsKLQkJc2Nhbl96b25lX3VuZXZpY3RhYmxlX3BhZ2VzKHpvbmUpOwotCX0KKwl3YXJuX3NjYW5fdW5ldmljdGFibGVfcGFnZXMoKTsKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vdm1zdGF0LmMgYi9tbS92bXN0YXQuYwppbmRleCBkNTJiMTNkLi44ZmQ2MDNiIDEwMDY0NAotLS0gYS9tbS92bXN0YXQuYworKysgYi9tbS92bXN0YXQuYwpAQCAtNzgsNyArNzgsNyBAQAogICoKICAqIHZtX3N0YXQgY29udGFpbnMgdGhlIGdsb2JhbCBjb3VudGVycwogICovCi1hdG9taWNfbG9uZ190IHZtX3N0YXRbTlJfVk1fWk9ORV9TVEFUX0lURU1TXTsKK2F0b21pY19sb25nX3Qgdm1fc3RhdFtOUl9WTV9aT05FX1NUQVRfSVRFTVNdIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogRVhQT1JUX1NZTUJPTCh2bV9zdGF0KTsKIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTcwMiw2ICs3MDIsNyBAQAogCSJucl91bnN0YWJsZSIsCiAJIm5yX2JvdW5jZSIsCiAJIm5yX3Ztc2Nhbl93cml0ZSIsCisJIm5yX3Ztc2Nhbl9pbW1lZGlhdGVfcmVjbGFpbSIsCiAJIm5yX3dyaXRlYmFja190ZW1wIiwKIAkibnJfaXNvbGF0ZWRfYW5vbiIsCiAJIm5yX2lzb2xhdGVkX2ZpbGUiLApkaWZmIC0tZ2l0IGEvbmV0LzgwMi9mYy5jIGIvbmV0LzgwMi9mYy5jCmluZGV4IDFlNDlmMmQuLmJkMzQ1ZjMgMTAwNjQ0Ci0tLSBhL25ldC84MDIvZmMuYworKysgYi9uZXQvODAyL2ZjLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KIAogLyoKZGlmZiAtLWdpdCBhL25ldC84MDIvZ2FycC5jIGIvbmV0LzgwMi9nYXJwLmMKaW5kZXggMDcwYmY0NC4uOGUyMWI2ZCAxMDA2NDQKLS0tIGEvbmV0LzgwMi9nYXJwLmMKKysrIGIvbmV0LzgwMi9nYXJwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9sbGMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2xsYy5oPgogI2luY2x1ZGUgPG5ldC9sbGNfcGR1Lmg+CiAjaW5jbHVkZSA8bmV0L2dhcnAuaD4KZGlmZiAtLWdpdCBhL25ldC84MDIvc3RwLmMgYi9uZXQvODAyL3N0cC5jCmluZGV4IDBlMTM2ZWYuLjE1NTQwYjcgMTAwNjQ0Ci0tLSBhL25ldC84MDIvc3RwLmMKKysrIGIvbmV0LzgwMi9zdHAuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGxjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9sbGMuaD4KICNpbmNsdWRlIDxuZXQvbGxjX3BkdS5oPgogI2luY2x1ZGUgPG5ldC9zdHAuaD4KZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX2NvcmUuYyBiL25ldC84MDIxcS92bGFuX2NvcmUuYwppbmRleCAxNjMzOTdmLi5mNWZmYzAyIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9jb3JlLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCkBAIC0yLDYgKzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAidmxhbi5oIgogCiBib29sIHZsYW5fZG9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnAsIGJvb2wgbGFzdF9oYW5kbGVyKQpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwppbmRleCBjOGNmOTM5Li5iYzI1Mjg2IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9kZXYuYworKysgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpAQCAtNDcwLDEwICs0NzAsMTIgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OwogCi0JaWYgKGNoYW5nZSAmIElGRl9BTExNVUxUSSkKLQkJZGV2X3NldF9hbGxtdWx0aShyZWFsX2RldiwgZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSA/IDEgOiAtMSk7Ci0JaWYgKGNoYW5nZSAmIElGRl9QUk9NSVNDKQotCQlkZXZfc2V0X3Byb21pc2N1aXR5KHJlYWxfZGV2LCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgPyAxIDogLTEpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCWlmIChjaGFuZ2UgJiBJRkZfQUxMTVVMVEkpCisJCQlkZXZfc2V0X2FsbG11bHRpKHJlYWxfZGV2LCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJID8gMSA6IC0xKTsKKwkJaWYgKGNoYW5nZSAmIElGRl9QUk9NSVNDKQorCQkJZGV2X3NldF9wcm9taXNjdWl0eShyZWFsX2RldiwgZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDID8gMSA6IC0xKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHZsYW5fZGV2X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2RldikKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX25ldGxpbmsuYyBiL25ldC84MDIxcS92bGFuX25ldGxpbmsuYwppbmRleCBiZTlhNWMxLi4yMzVjMjE5IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9uZXRsaW5rLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fbmV0bGluay5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CmRpZmYgLS1naXQgYS9uZXQvYXBwbGV0YWxrL2FhcnAuYyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCmluZGV4IDFhY2M2OTUuLjE3M2EyZTggMTAwNjQ0Ci0tLSBhL25ldC9hcHBsZXRhbGsvYWFycC5jCisrKyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBpbnQgc3lzY3RsX2FhcnBfZXhwaXJ5X3RpbWUgPSBBQVJQX0VYUElSWV9USU1FOwogaW50IHN5c2N0bF9hYXJwX3RpY2tfdGltZSA9IEFBUlBfVElDS19USU1FOwpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9hdGFsa19wcm9jLmMgYi9uZXQvYXBwbGV0YWxrL2F0YWxrX3Byb2MuYwppbmRleCA2ZWYwZTc2Li5iNWIxYTIyIDEwMDY0NAotLS0gYS9uZXQvYXBwbGV0YWxrL2F0YWxrX3Byb2MuYworKysgYi9uZXQvYXBwbGV0YWxrL2F0YWxrX3Byb2MuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9hdGFsay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBhdGFsa19pZmFjZSAqYXRhbGtfZ2V0X2ludGVyZmFjZV9pZHgobG9mZl90IHBvcykKZGlmZiAtLWdpdCBhL25ldC9hdG0vcHZjLmMgYi9uZXQvYXRtL3B2Yy5jCmluZGV4IDQzN2VlNzAuLjNhNzM0OTEgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vcHZjLmMKKysrIGIvbmV0L2F0bS9wdmMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgkJLyogZm9yIHNvY2tfbm9fKiAqLwogCiAjaW5jbHVkZSAicmVzb3VyY2VzLmgiCQkvKiBkZXZzIGFuZCB2Y2NzICovCmRpZmYgLS1naXQgYS9uZXQvYXRtL3N2Yy5jIGIvbmV0L2F0bS9zdmMuYwppbmRleCA3NTRlZTQ3Li4xMjgxMDQ5IDEwMDY0NAotLS0gYS9uZXQvYXRtL3N2Yy5jCisrKyBiL25ldC9hdG0vc3ZjLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgkJLyogZm9yIHNvY2tfbm9fKiAqLwogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJlc291cmNlcy5oIgogI2luY2x1ZGUgImNvbW1vbi5oIgkJLyogY29tbW9uIGZvciBQVkNzIGFuZCBTVkNzICovCmRpZmYgLS1naXQgYS9uZXQvYXgyNS9heDI1X3JvdXRlLmMgYi9uZXQvYXgyNS9heDI1X3JvdXRlLmMKaW5kZXggYTE2OTA4NC4uODdmZGRhYiAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jCisrKyBiL25ldC9heDI1L2F4MjVfcm91dGUuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgYXgyNV9yb3V0ZSAqYXgyNV9yb3V0ZV9saXN0Owogc3RhdGljIERFRklORV9SV0xPQ0soYXgyNV9yb3V0ZV9sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfdWlkLmMgYi9uZXQvYXgyNS9heDI1X3VpZC5jCmluZGV4IGQzNDliZTkuLjRjODMxMzcgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfdWlkLmMKKysrIGIvbmV0L2F4MjUvYXgyNV91aWQuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCmluZGV4IDkxYmNkM2EuLmE2Y2Q4NTYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpAQCAtNjUsMTUgKzY1LDEzIEBACiBzdGF0aWMgc3RydWN0IGJuZXBfc2Vzc2lvbiAqX19ibmVwX2dldF9zZXNzaW9uKHU4ICpkc3QpCiB7CiAJc3RydWN0IGJuZXBfc2Vzc2lvbiAqczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJQlRfREJHKCIiKTsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmJuZXBfc2Vzc2lvbl9saXN0KSB7Ci0JCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibmVwX3Nlc3Npb24sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJmJuZXBfc2Vzc2lvbl9saXN0LCBsaXN0KQogCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihkc3QsIHMtPmVoLmhfc291cmNlKSkKIAkJCXJldHVybiBzOwotCX0KKwogCXJldHVybiBOVUxMOwogfQogCkBAIC02NjcsMTcgKzY2NSwxNCBAQAogCiBpbnQgYm5lcF9nZXRfY29ubmxpc3Qoc3RydWN0IGJuZXBfY29ubmxpc3RfcmVxICpyZXEpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzOwogCWludCBlcnIgPSAwLCBuID0gMDsKIAogCWRvd25fcmVhZCgmYm5lcF9zZXNzaW9uX3NlbSk7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZibmVwX3Nlc3Npb25fbGlzdCkgewotCQlzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzOworCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJmJuZXBfc2Vzc2lvbl9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBibmVwX2Nvbm5pbmZvIGNpOwogCi0JCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibmVwX3Nlc3Npb24sIGxpc3QpOwotCiAJCV9fYm5lcF9jb3B5X2NpKCZjaSwgcyk7CiAKIAkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmNpLCAmY2ksIHNpemVvZihjaSkpKSB7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwppbmRleCA3ZDAwZGRmLi45ZTg5NDBiIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKQEAgLTUzLDE1ICs1MywxMyBAQAogc3RhdGljIHN0cnVjdCBjbXRwX3Nlc3Npb24gKl9fY210cF9nZXRfc2Vzc2lvbihiZGFkZHJfdCAqYmRhZGRyKQogewogCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAogCUJUX0RCRygiIik7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZjbXRwX3Nlc3Npb25fbGlzdCkgewotCQlzZXNzaW9uID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgY210cF9zZXNzaW9uLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlc3Npb24sICZjbXRwX3Nlc3Npb25fbGlzdCwgbGlzdCkKIAkJaWYgKCFiYWNtcChiZGFkZHIsICZzZXNzaW9uLT5iZGFkZHIpKQogCQkJcmV0dXJuIHNlc3Npb247Ci0JfQorCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTQzMSwxOSArNDI5LDE2IEBACiAKIGludCBjbXRwX2dldF9jb25ubGlzdChzdHJ1Y3QgY210cF9jb25ubGlzdF9yZXEgKnJlcSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb247CiAJaW50IGVyciA9IDAsIG4gPSAwOwogCiAJQlRfREJHKCIiKTsKIAogCWRvd25fcmVhZCgmY210cF9zZXNzaW9uX3NlbSk7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZjbXRwX3Nlc3Npb25fbGlzdCkgewotCQlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2Vzc2lvbiwgJmNtdHBfc2Vzc2lvbl9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBjbXRwX2Nvbm5pbmZvIGNpOwogCi0JCXNlc3Npb24gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBjbXRwX3Nlc3Npb24sIGxpc3QpOwotCiAJCV9fY210cF9jb3B5X3Nlc3Npb24oc2Vzc2lvbiwgJmNpKTsKIAogCQlpZiAoY29weV90b191c2VyKHJlcS0+Y2ksICZjaSwgc2l6ZW9mKGNpKSkpIHsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwppbmRleCBlMGFmNzIzLi5kZTBiOTNlIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCkBAIC0zNzQsNiArMzc0LDggQEAKIAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPmRhdGFfcSk7CiAKKwloY2lfY2hhbl9oYXNoX2luaXQoY29ubik7CisKIAlzZXR1cF90aW1lcigmY29ubi0+ZGlzY190aW1lciwgaGNpX2Nvbm5fdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpY29ubik7CiAJc2V0dXBfdGltZXIoJmNvbm4tPmlkbGVfdGltZXIsIGhjaV9jb25uX2lkbGUsICh1bnNpZ25lZCBsb25nKWNvbm4pOwogCXNldHVwX3RpbWVyKCZjb25uLT5hdXRvX2FjY2VwdF90aW1lciwgaGNpX2Nvbm5fYXV0b19hY2NlcHQsCkBAIC00MzIsNiArNDM0LDggQEAKIAogCXRhc2tsZXRfZGlzYWJsZSgmaGRldi0+dHhfdGFzayk7CiAKKwloY2lfY2hhbl9oYXNoX2ZsdXNoKGNvbm4pOworCiAJaGNpX2Nvbm5faGFzaF9kZWwoaGRldiwgY29ubik7CiAJaWYgKGhkZXYtPm5vdGlmeSkKIAkJaGRldi0+bm90aWZ5KGhkZXYsIEhDSV9OT1RJRllfQ09OTl9ERUwpOwpAQCAtNDUzLDE2ICs0NTcsMTMgQEAKIHN0cnVjdCBoY2lfZGV2ICpoY2lfZ2V0X3JvdXRlKGJkYWRkcl90ICpkc3QsIGJkYWRkcl90ICpzcmMpCiB7CiAJaW50IHVzZV9zcmMgPSBiYWNtcChzcmMsIEJEQUREUl9BTlkpOwotCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTCwgKmQ7CiAKIAlCVF9EQkcoIiVzIC0+ICVzIiwgYmF0b3N0cihzcmMpLCBiYXRvc3RyKGRzdCkpOwogCiAJcmVhZF9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfZGV2X2xpc3QpIHsKLQkJc3RydWN0IGhjaV9kZXYgKmQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfZGV2LCBsaXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmhjaV9kZXZfbGlzdCwgbGlzdCkgewogCQlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmQtPmZsYWdzKSB8fCB0ZXN0X2JpdChIQ0lfUkFXLCAmZC0+ZmxhZ3MpKQogCQkJY29udGludWU7CiAKQEAgLTgxOSw3ICs4MjAsNyBAQAogCiAJCWMtPnN0YXRlID0gQlRfQ0xPU0VEOwogCi0JCWhjaV9wcm90b19kaXNjb25uX2NmbShjLCAweDE2KTsKKwkJaGNpX3Byb3RvX2Rpc2Nvbm5fY2ZtKGMsIEhDSV9FUlJPUl9MT0NBTF9IT1NUX1RFUk0pOwogCQloY2lfY29ubl9kZWwoYyk7CiAJfQogfQpAQCAtODU1LDEwICs4NTYsMTAgQEAKIAogaW50IGhjaV9nZXRfY29ubl9saXN0KHZvaWQgX191c2VyICphcmcpCiB7CisJcmVnaXN0ZXIgc3RydWN0IGhjaV9jb25uICpjOwogCXN0cnVjdCBoY2lfY29ubl9saXN0X3JlcSByZXEsICpjbDsKIAlzdHJ1Y3QgaGNpX2Nvbm5faW5mbyAqY2k7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlpbnQgbiA9IDAsIHNpemUsIGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBhcmcsIHNpemVvZihyZXEpKSkKQEAgLTg4MiwxMCArODgzLDcgQEAKIAljaSA9IGNsLT5jb25uX2luZm87CiAKIAloY2lfZGV2X2xvY2tfYmgoaGRldik7Ci0JbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+Y29ubl9oYXNoLmxpc3QpIHsKLQkJcmVnaXN0ZXIgc3RydWN0IGhjaV9jb25uICpjOwotCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaGRldi0+Y29ubl9oYXNoLmxpc3QsIGxpc3QpIHsKIAkJYmFjcHkoJihjaSArIG4pLT5iZGFkZHIsICZjLT5kc3QpOwogCQkoY2kgKyBuKS0+aGFuZGxlID0gYy0+aGFuZGxlOwogCQkoY2kgKyBuKS0+dHlwZSAgPSBjLT50eXBlOwpAQCAtOTU2LDMgKzk1NCw1MiBAQAogCiAJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmcsICZyZXEsIHNpemVvZihyZXEpKSA/IC1FRkFVTFQgOiAwOwogfQorCitzdHJ1Y3QgaGNpX2NoYW4gKmhjaV9jaGFuX2NyZWF0ZShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OworCXN0cnVjdCBoY2lfY2hhbiAqY2hhbjsKKworCUJUX0RCRygiJXMgY29ubiAlcCIsIGhkZXYtPm5hbWUsIGNvbm4pOworCisJY2hhbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoY2lfY2hhbiksIEdGUF9BVE9NSUMpOworCWlmICghY2hhbikKKwkJcmV0dXJuIE5VTEw7CisKKwljaGFuLT5jb25uID0gY29ubjsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZjaGFuLT5kYXRhX3EpOworCisJdGFza2xldF9kaXNhYmxlKCZoZGV2LT50eF90YXNrKTsKKwloY2lfY2hhbl9oYXNoX2FkZChjb25uLCBjaGFuKTsKKwl0YXNrbGV0X2VuYWJsZSgmaGRldi0+dHhfdGFzayk7CisKKwlyZXR1cm4gY2hhbjsKK30KKworaW50IGhjaV9jaGFuX2RlbChzdHJ1Y3QgaGNpX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gY2hhbi0+Y29ubjsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7CisKKwlCVF9EQkcoIiVzIGNvbm4gJXAgY2hhbiAlcCIsIGhkZXYtPm5hbWUsIGNvbm4sIGNoYW4pOworCisJdGFza2xldF9kaXNhYmxlKCZoZGV2LT50eF90YXNrKTsKKwloY2lfY2hhbl9oYXNoX2RlbChjb25uLCBjaGFuKTsKKwl0YXNrbGV0X2VuYWJsZSgmaGRldi0+dHhfdGFzayk7CisKKwlza2JfcXVldWVfcHVyZ2UoJmNoYW4tPmRhdGFfcSk7CisJa2ZyZWUoY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBoY2lfY2hhbl9oYXNoX2ZsdXNoKHN0cnVjdCBoY2lfY29ubiAqY29ubikKK3sKKwlzdHJ1Y3QgaGNpX2NoYW5faGFzaCAqaCA9ICZjb25uLT5jaGFuX2hhc2g7CisJc3RydWN0IGhjaV9jaGFuICpjaGFuLCAqdG1wOworCisJQlRfREJHKCJjb25uICVwIiwgY29ubik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hhbiwgdG1wLCAmaC0+bGlzdCwgbGlzdCkKKwkJaGNpX2NoYW5fZGVsKGNoYW4pOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jIGIvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCmluZGV4IGJlODRhZTMuLmZiM2ZlZWIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKQEAgLTMxOSw4ICszMTksNyBAQAogICogRGV2aWNlIGlzIGhlbGQgb24gcmV0dXJuLiAqLwogc3RydWN0IGhjaV9kZXYgKmhjaV9kZXZfZ2V0KGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IE5VTEwsICpkOwogCiAJQlRfREJHKCIlZCIsIGluZGV4KTsKIApAQCAtMzI4LDggKzMyNyw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJcmVhZF9sb2NrKCZoY2lfZGV2X2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmaGNpX2Rldl9saXN0KSB7Ci0JCXN0cnVjdCBoY2lfZGV2ICpkID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2RldiwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmaGNpX2Rldl9saXN0LCBsaXN0KSB7CiAJCWlmIChkLT5pZCA9PSBpbmRleCkgewogCQkJaGRldiA9IGhjaV9kZXZfaG9sZChkKTsKIAkJCWJyZWFrOwpAQCAtNTUxLDggKzU0OSwxMSBAQAogCQloY2lfZGV2X2hvbGQoaGRldik7CiAJCXNldF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpOwogCQloY2lfbm90aWZ5KGhkZXYsIEhDSV9ERVZfVVApOwotCQlpZiAoIXRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmZsYWdzKSkKLQkJCW1nbXRfcG93ZXJlZChoZGV2LT5pZCwgMSk7CisJCWlmICghdGVzdF9iaXQoSENJX1NFVFVQLCAmaGRldi0+ZmxhZ3MpKSB7CisJCQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJCQltZ210X3Bvd2VyZWQoaGRldiwgMSk7CisJCQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIEluaXQgZmFpbGVkLCBjbGVhbnVwICovCiAJCXRhc2tsZXRfa2lsbCgmaGRldi0+cnhfdGFzayk7CkBAIC01OTcsNiArNTk4LDE0IEBACiAJdGFza2xldF9raWxsKCZoZGV2LT5yeF90YXNrKTsKIAl0YXNrbGV0X2tpbGwoJmhkZXYtPnR4X3Rhc2spOwogCisJaWYgKGhkZXYtPmRpc2Nvdl90aW1lb3V0ID4gMCkgeworCQljYW5jZWxfZGVsYXllZF93b3JrKCZoZGV2LT5kaXNjb3Zfb2ZmKTsKKwkJaGRldi0+ZGlzY292X3RpbWVvdXQgPSAwOworCX0KKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0FVVE9fT0ZGLCAmaGRldi0+ZmxhZ3MpKQorCQljYW5jZWxfZGVsYXllZF93b3JrKCZoZGV2LT5wb3dlcl9vZmYpOworCiAJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCWlucXVpcnlfY2FjaGVfZmx1c2goaGRldik7CiAJaGNpX2Nvbm5faGFzaF9mbHVzaChoZGV2KTsKQEAgLTYzNiw3ICs2NDUsOSBAQAogCSAqIGFuZCBubyB0YXNrcyBhcmUgc2NoZWR1bGVkLiAqLwogCWhkZXYtPmNsb3NlKGhkZXYpOwogCi0JbWdtdF9wb3dlcmVkKGhkZXYtPmlkLCAwKTsKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJbWdtdF9wb3dlcmVkKGhkZXYsIDApOworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCiAJLyogQ2xlYXIgZmxhZ3MgKi8KIAloZGV2LT5mbGFncyA9IDA7CkBAIC03OTQsOSArODA1LDkgQEAKIAogaW50IGhjaV9nZXRfZGV2X2xpc3Qodm9pZCBfX3VzZXIgKmFyZykKIHsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKIAlzdHJ1Y3QgaGNpX2Rldl9saXN0X3JlcSAqZGw7CiAJc3RydWN0IGhjaV9kZXZfcmVxICpkcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCWludCBuID0gMCwgc2l6ZSwgZXJyOwogCV9fdTE2IGRldl9udW07CiAKQEAgLTgxNSwxMiArODI2LDkgQEAKIAlkciA9IGRsLT5kZXZfcmVxOwogCiAJcmVhZF9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmaGNpX2Rldl9saXN0KSB7Ci0JCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwotCi0JCWhkZXYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfZGV2LCBsaXN0KTsKLQotCQloY2lfZGVsX29mZl90aW1lcihoZGV2KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhkZXYsICZoY2lfZGV2X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfQVVUT19PRkYsICZoZGV2LT5mbGFncykpCisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZoZGV2LT5wb3dlcl9vZmYpOwogCiAJCWlmICghdGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCiAJCQlzZXRfYml0KEhDSV9QQUlSQUJMRSwgJmhkZXYtPmZsYWdzKTsKQEAgLTg1NSw3ICs4NjMsOCBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQloY2lfZGVsX29mZl90aW1lcihoZGV2KTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmZsYWdzKSkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZGV2LT5wb3dlcl9vZmYpOwogCiAJaWYgKCF0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKIAkJc2V0X2JpdChIQ0lfUEFJUkFCTEUsICZoZGV2LT5mbGFncyk7CkBAIC05MTIsNiArOTIxLDcgQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBOVUxMOwogCisJaGNpX2luaXRfc3lzZnMoaGRldik7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaGRldi0+ZHJpdmVyX2luaXQpOwogCiAJcmV0dXJuIGhkZXY7CkBAIC05MzgsMzkgKzk0OCw0MSBAQAogCQlyZXR1cm47CiAKIAlpZiAodGVzdF9iaXQoSENJX0FVVE9fT0ZGLCAmaGRldi0+ZmxhZ3MpKQotCQltb2RfdGltZXIoJmhkZXYtPm9mZl90aW1lciwKLQkJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhBVVRPX09GRl9USU1FT1VUKSk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5wb3dlcl9vZmYsCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoQVVUT19PRkZfVElNRU9VVCkpOwogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfU0VUVVAsICZoZGV2LT5mbGFncykpCi0JCW1nbXRfaW5kZXhfYWRkZWQoaGRldi0+aWQpOworCQltZ210X2luZGV4X2FkZGVkKGhkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfcG93ZXJfb2ZmKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGNpX2RldiwgcG93ZXJfb2ZmKTsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGNpX2RldiwKKwkJCQkJCQlwb3dlcl9vZmYud29yayk7CiAKIAlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CiAKKwljbGVhcl9iaXQoSENJX0FVVE9fT0ZGLCAmaGRldi0+ZmxhZ3MpOworCiAJaGNpX2Rldl9jbG9zZShoZGV2LT5pZCk7CiB9CiAKLXN0YXRpYyB2b2lkIGhjaV9hdXRvX29mZih1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBoY2lfZGlzY292X29mZihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGhjaV9kZXYgKmhkZXYgPSAoc3RydWN0IGhjaV9kZXYgKikgZGF0YTsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwl1OCBzY2FuID0gU0NBTl9QQUdFOworCisJaGRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGNpX2RldiwgZGlzY292X29mZi53b3JrKTsKIAogCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKIAotCWNsZWFyX2JpdChIQ0lfQVVUT19PRkYsICZoZGV2LT5mbGFncyk7CisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCi0JcXVldWVfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5wb3dlcl9vZmYpOwotfQorCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfV1JJVEVfU0NBTl9FTkFCTEUsIHNpemVvZihzY2FuKSwgJnNjYW4pOwogCi12b2lkIGhjaV9kZWxfb2ZmX3RpbWVyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQotewotCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKwloZGV2LT5kaXNjb3ZfdGltZW91dCA9IDA7CiAKLQljbGVhcl9iaXQoSENJX0FVVE9fT0ZGLCAmaGRldi0+ZmxhZ3MpOwotCWRlbF90aW1lcigmaGRldi0+b2ZmX3RpbWVyKTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIH0KIAogaW50IGhjaV91dWlkc19jbGVhcihzdHJ1Y3QgaGNpX2RldiAqaGRldikKQEAgLTEwMDcsMTYgKzEwMTksMTEgQEAKIAogc3RydWN0IGxpbmtfa2V5ICpoY2lfZmluZF9saW5rX2tleShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBsaW5rX2tleSAqazsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmhkZXYtPmxpbmtfa2V5cykgewotCQlzdHJ1Y3QgbGlua19rZXkgKms7Ci0KLQkJayA9IGxpc3RfZW50cnkocCwgc3RydWN0IGxpbmtfa2V5LCBsaXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoaywgJmhkZXYtPmxpbmtfa2V5cywgbGlzdCkKIAkJaWYgKGJhY21wKGJkYWRkciwgJmstPmJkYWRkcikgPT0gMCkKIAkJCXJldHVybiBrOwotCX0KIAogCXJldHVybiBOVUxMOwogfQpAQCAtMTEzOCw3ICsxMTQ1LDcgQEAKIAogCXBlcnNpc3RlbnQgPSBoY2lfcGVyc2lzdGVudF9rZXkoaGRldiwgY29ubiwgdHlwZSwgb2xkX2tleV90eXBlKTsKIAotCW1nbXRfbmV3X2tleShoZGV2LT5pZCwga2V5LCBwZXJzaXN0ZW50KTsKKwltZ210X25ld19saW5rX2tleShoZGV2LCBrZXksIHBlcnNpc3RlbnQpOwogCiAJaWYgKCFwZXJzaXN0ZW50KSB7CiAJCWxpc3RfZGVsKCZrZXktPmxpc3QpOwpAQCAtMTE4MSw3ICsxMTg4LDcgQEAKIAltZW1jcHkoaWQtPnJhbmQsIHJhbmQsIHNpemVvZihpZC0+cmFuZCkpOwogCiAJaWYgKG5ld19rZXkpCi0JCW1nbXRfbmV3X2tleShoZGV2LT5pZCwga2V5LCBvbGRfa2V5X3R5cGUpOworCQltZ210X25ld19saW5rX2tleShoZGV2LCBrZXksIG9sZF9rZXlfdHlwZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNzksMTYgKzEyODYsMTEgQEAKIHN0cnVjdCBiZGFkZHJfbGlzdCAqaGNpX2JsYWNrbGlzdF9sb29rdXAoc3RydWN0IGhjaV9kZXYgKmhkZXYsCiAJCQkJCQliZGFkZHJfdCAqYmRhZGRyKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGJkYWRkcl9saXN0ICpiOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+YmxhY2tsaXN0KSB7Ci0JCXN0cnVjdCBiZGFkZHJfbGlzdCAqYjsKLQotCQliID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmRhZGRyX2xpc3QsIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShiLCAmaGRldi0+YmxhY2tsaXN0LCBsaXN0KQogCQlpZiAoYmFjbXAoYmRhZGRyLCAmYi0+YmRhZGRyKSA9PSAwKQogCQkJcmV0dXJuIGI7Ci0JfQogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xMzI3LDcgKzEzMjksNyBAQAogCiAJbGlzdF9hZGQoJmVudHJ5LT5saXN0LCAmaGRldi0+YmxhY2tsaXN0KTsKIAotCXJldHVybiBtZ210X2RldmljZV9ibG9ja2VkKGhkZXYtPmlkLCBiZGFkZHIpOworCXJldHVybiBtZ210X2RldmljZV9ibG9ja2VkKGhkZXYsIGJkYWRkcik7CiB9CiAKIGludCBoY2lfYmxhY2tsaXN0X2RlbChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcikKQEAgLTEzNDYsNyArMTM0OCw3IEBACiAJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKIAlrZnJlZShlbnRyeSk7CiAKLQlyZXR1cm4gbWdtdF9kZXZpY2VfdW5ibG9ja2VkKGhkZXYtPmlkLCBiZGFkZHIpOworCXJldHVybiBtZ210X2RldmljZV91bmJsb2NrZWQoaGRldiwgYmRhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgaGNpX2NsZWFyX2Fkdl9jYWNoZSh1bnNpZ25lZCBsb25nIGFyZykKQEAgLTE0MjUsNyArMTQyNyw3IEBACiBpbnQgaGNpX3JlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmhjaV9kZXZfbGlzdCwgKnA7Ci0JaW50IGksIGlkID0gMDsKKwlpbnQgaSwgaWQsIGVycm9yOwogCiAJQlRfREJHKCIlcCBuYW1lICVzIGJ1cyAlZCBvd25lciAlcCIsIGhkZXYsIGhkZXYtPm5hbWUsCiAJCQkJCQloZGV2LT5idXMsIGhkZXYtPm93bmVyKTsKQEAgLTE0MzMsNiArMTQzNSwxMSBAQAogCWlmICghaGRldi0+b3BlbiB8fCAhaGRldi0+Y2xvc2UgfHwgIWhkZXYtPmRlc3RydWN0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIERvIG5vdCBhbGxvdyBIQ0lfQU1QIGRldmljZXMgdG8gcmVnaXN0ZXIgYXQgaW5kZXggMCwKKwkgKiBzbyB0aGUgaW5kZXggY2FuIGJlIHVzZWQgYXMgdGhlIEFNUCBjb250cm9sbGVyIElELgorCSAqLworCWlkID0gKGhkZXYtPmRldl90eXBlID09IEhDSV9CUkVEUikgPyAwIDogMTsKKwogCXdyaXRlX2xvY2tfYmgoJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAogCS8qIEZpbmQgZmlyc3QgYXZhaWxhYmxlIGRldmljZSBpZCAqLwpAQCAtMTQ3OSw2ICsxNDg2LDggQEAKIAogCWhjaV9jb25uX2hhc2hfaW5pdChoZGV2KTsKIAorCUlOSVRfTElTVF9IRUFEKCZoZGV2LT5tZ210X3BlbmRpbmcpOworCiAJSU5JVF9MSVNUX0hFQUQoJmhkZXYtPmJsYWNrbGlzdCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmaGRldi0+dXVpZHMpOwpAQCAtMTQ5Miw4ICsxNTAxLDkgQEAKIAkJCQkJCSh1bnNpZ25lZCBsb25nKSBoZGV2KTsKIAogCUlOSVRfV09SSygmaGRldi0+cG93ZXJfb24sIGhjaV9wb3dlcl9vbik7Ci0JSU5JVF9XT1JLKCZoZGV2LT5wb3dlcl9vZmYsIGhjaV9wb3dlcl9vZmYpOwotCXNldHVwX3RpbWVyKCZoZGV2LT5vZmZfdGltZXIsIGhjaV9hdXRvX29mZiwgKHVuc2lnbmVkIGxvbmcpIGhkZXYpOworCUlOSVRfREVMQVlFRF9XT1JLKCZoZGV2LT5wb3dlcl9vZmYsIGhjaV9wb3dlcl9vZmYpOworCisJSU5JVF9ERUxBWUVEX1dPUksoJmhkZXYtPmRpc2Nvdl9vZmYsIGhjaV9kaXNjb3Zfb2ZmKTsKIAogCW1lbXNldCgmaGRldi0+c3RhdCwgMCwgc2l6ZW9mKHN0cnVjdCBoY2lfZGV2X3N0YXRzKSk7CiAKQEAgLTE1MDIsMTAgKzE1MTIsMTQgQEAKIAl3cml0ZV91bmxvY2tfYmgoJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAogCWhkZXYtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGhkZXYtPm5hbWUpOwotCWlmICghaGRldi0+d29ya3F1ZXVlKQotCQlnb3RvIG5vbWVtOworCWlmICghaGRldi0+d29ya3F1ZXVlKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQogCi0JaGNpX3JlZ2lzdGVyX3N5c2ZzKGhkZXYpOworCWVycm9yID0gaGNpX2FkZF9zeXNmcyhoZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycl93cXVldWU7CiAKIAloZGV2LT5yZmtpbGwgPSByZmtpbGxfYWxsb2MoaGRldi0+bmFtZSwgJmhkZXYtPmRldiwKIAkJCQlSRktJTExfVFlQRV9CTFVFVE9PVEgsICZoY2lfcmZraWxsX29wcywgaGRldik7CkBAIC0xNTI0LDE3ICsxNTM4LDE5IEBACiAKIAlyZXR1cm4gaWQ7CiAKLW5vbWVtOgorZXJyX3dxdWV1ZToKKwlkZXN0cm95X3dvcmtxdWV1ZShoZGV2LT53b3JrcXVldWUpOworZXJyOgogCXdyaXRlX2xvY2tfYmgoJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmaGRldi0+bGlzdCk7CiAJd3JpdGVfdW5sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CiAKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gZXJyb3I7CiB9CiBFWFBPUlRfU1lNQk9MKGhjaV9yZWdpc3Rlcl9kZXYpOwogCiAvKiBVbnJlZ2lzdGVyIEhDSSBkZXZpY2UgKi8KLWludCBoY2lfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit2b2lkIGhjaV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlpbnQgaTsKIApAQCAtMTU1MCw4ICsxNTY2LDE1IEBACiAJCWtmcmVlX3NrYihoZGV2LT5yZWFzc2VtYmx5W2ldKTsKIAogCWlmICghdGVzdF9iaXQoSENJX0lOSVQsICZoZGV2LT5mbGFncykgJiYKLQkJCQkJIXRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmZsYWdzKSkKLQkJbWdtdF9pbmRleF9yZW1vdmVkKGhkZXYtPmlkKTsKKwkJCQkJIXRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmZsYWdzKSkgeworCQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJCW1nbXRfaW5kZXhfcmVtb3ZlZChoZGV2KTsKKwkJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJfQorCisJLyogbWdtdF9pbmRleF9yZW1vdmVkIHNob3VsZCB0YWtlIGNhcmUgb2YgZW1wdHlpbmcgdGhlCisJICogcGVuZGluZyBsaXN0ICovCisJQlVHX09OKCFsaXN0X2VtcHR5KCZoZGV2LT5tZ210X3BlbmRpbmcpKTsKIAogCWhjaV9ub3RpZnkoaGRldiwgSENJX0RFVl9VTlJFRyk7CiAKQEAgLTE1NjAsOSArMTU4Myw4IEBACiAJCXJma2lsbF9kZXN0cm95KGhkZXYtPnJma2lsbCk7CiAJfQogCi0JaGNpX3VucmVnaXN0ZXJfc3lzZnMoaGRldik7CisJaGNpX2RlbF9zeXNmcyhoZGV2KTsKIAotCWhjaV9kZWxfb2ZmX3RpbWVyKGhkZXYpOwogCWRlbF90aW1lcigmaGRldi0+YWR2X3RpbWVyKTsKIAogCWRlc3Ryb3lfd29ya3F1ZXVlKGhkZXYtPndvcmtxdWV1ZSk7CkBAIC0xNTc2LDggKzE1OTgsNiBAQAogCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCiAJX19oY2lfZGV2X3B1dChoZGV2KTsKLQotCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChoY2lfdW5yZWdpc3Rlcl9kZXYpOwogCkBAIC0xOTQ4LDIzICsxOTY4LDE4IEBACiAJaGRyLT5kbGVuICAgPSBjcHVfdG9fbGUxNihsZW4pOwogfQogCi12b2lkIGhjaV9zZW5kX2FjbChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGZsYWdzKQorc3RhdGljIHZvaWQgaGNpX3F1ZXVlX2FjbChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmX2hlYWQgKnF1ZXVlLAorCQkJCXN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGZsYWdzKQogewogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdDsKIAotCUJUX0RCRygiJXMgY29ubiAlcCBmbGFncyAweCV4IiwgaGRldi0+bmFtZSwgY29ubiwgZmxhZ3MpOwotCi0Jc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OwotCWJ0X2NiKHNrYiktPnBrdF90eXBlID0gSENJX0FDTERBVEFfUEtUOwotCWhjaV9hZGRfYWNsX2hkcihza2IsIGNvbm4tPmhhbmRsZSwgZmxhZ3MpOwotCiAJbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OwogCWlmICghbGlzdCkgewogCQkvKiBOb24gZnJhZ21lbnRlZCAqLwogCQlCVF9EQkcoIiVzIG5vbmZyYWcgc2tiICVwIGxlbiAlZCIsIGhkZXYtPm5hbWUsIHNrYiwgc2tiLT5sZW4pOwogCi0JCXNrYl9xdWV1ZV90YWlsKCZjb25uLT5kYXRhX3EsIHNrYik7CisJCXNrYl9xdWV1ZV90YWlsKHF1ZXVlLCBza2IpOwogCX0gZWxzZSB7CiAJCS8qIEZyYWdtZW50ZWQgKi8KIAkJQlRfREJHKCIlcyBmcmFnICVwIGxlbiAlZCIsIGhkZXYtPm5hbWUsIHNrYiwgc2tiLT5sZW4pOwpAQCAtMTk3Miw5ICsxOTg3LDkgQEAKIAkJc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QgPSBOVUxMOwogCiAJCS8qIFF1ZXVlIGFsbCBmcmFnbWVudHMgYXRvbWljYWxseSAqLwotCQlzcGluX2xvY2tfYmgoJmNvbm4tPmRhdGFfcS5sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAKLQkJX19za2JfcXVldWVfdGFpbCgmY29ubi0+ZGF0YV9xLCBza2IpOworCQlfX3NrYl9xdWV1ZV90YWlsKHF1ZXVlLCBza2IpOwogCiAJCWZsYWdzICY9IH5BQ0xfU1RBUlQ7CiAJCWZsYWdzIHw9IEFDTF9DT05UOwpAQCAtMTk4NywxMSArMjAwMiwyNSBAQAogCiAJCQlCVF9EQkcoIiVzIGZyYWcgJXAgbGVuICVkIiwgaGRldi0+bmFtZSwgc2tiLCBza2ItPmxlbik7CiAKLQkJCV9fc2tiX3F1ZXVlX3RhaWwoJmNvbm4tPmRhdGFfcSwgc2tiKTsKKwkJCV9fc2tiX3F1ZXVlX3RhaWwocXVldWUsIHNrYik7CiAJCX0gd2hpbGUgKGxpc3QpOwogCi0JCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5kYXRhX3EubG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAJfQorfQorCit2b2lkIGhjaV9zZW5kX2FjbChzdHJ1Y3QgaGNpX2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGZsYWdzKQoreworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IGNoYW4tPmNvbm47CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OworCisJQlRfREJHKCIlcyBjaGFuICVwIGZsYWdzIDB4JXgiLCBoZGV2LT5uYW1lLCBjaGFuLCBmbGFncyk7CisKKwlza2ItPmRldiA9ICh2b2lkICopIGhkZXY7CisJYnRfY2Ioc2tiKS0+cGt0X3R5cGUgPSBIQ0lfQUNMREFUQV9QS1Q7CisJaGNpX2FkZF9hY2xfaGRyKHNrYiwgY29ubi0+aGFuZGxlLCBmbGFncyk7CisKKwloY2lfcXVldWVfYWNsKGNvbm4sICZjaGFuLT5kYXRhX3EsIHNrYiwgZmxhZ3MpOwogCiAJdGFza2xldF9zY2hlZHVsZSgmaGRldi0+dHhfdGFzayk7CiB9CkBAIC0yMDI2LDE2ICsyMDU1LDEyIEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBoY2lfY29ubiAqaGNpX2xvd19zZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHR5cGUsIGludCAqcXVvdGUpCiB7CiAJc3RydWN0IGhjaV9jb25uX2hhc2ggKmggPSAmaGRldi0+Y29ubl9oYXNoOwotCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gTlVMTCwgKmM7CiAJaW50IG51bSA9IDAsIG1pbiA9IH4wOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKIAkvKiBXZSBkb24ndCBoYXZlIHRvIGxvY2sgZGV2aWNlIGhlcmUuIENvbm5lY3Rpb25zIGFyZSBhbHdheXMKIAkgKiBhZGRlZCBhbmQgcmVtb3ZlZCB3aXRoIFRYIHRhc2sgZGlzYWJsZWQuICovCi0JbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgewotCQlzdHJ1Y3QgaGNpX2Nvbm4gKmM7Ci0JCWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfY29ubiwgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZoLT5saXN0LCBsaXN0KSB7CiAJCWlmIChjLT50eXBlICE9IHR5cGUgfHwgc2tiX3F1ZXVlX2VtcHR5KCZjLT5kYXRhX3EpKQogCQkJY29udGludWU7CiAKQEAgLTIwODQsMTQgKzIxMDksMTIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbGlua190eF90byhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191OCB0eXBlKQogewogCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCXN0cnVjdCBoY2lfY29ubiAgKmM7CisJc3RydWN0IGhjaV9jb25uICpjOwogCiAJQlRfRVJSKCIlcyBsaW5rIHR4IHRpbWVvdXQiLCBoZGV2LT5uYW1lKTsKIAogCS8qIEtpbGwgc3RhbGxlZCBjb25uZWN0aW9ucyAqLwotCWxpc3RfZm9yX2VhY2gocCwgJmgtPmxpc3QpIHsKLQkJYyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9jb25uLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZoLT5saXN0LCBsaXN0KSB7CiAJCWlmIChjLT50eXBlID09IHR5cGUgJiYgYy0+c2VudCkgewogCQkJQlRfRVJSKCIlcyBraWxsaW5nIHN0YWxsZWQgY29ubmVjdGlvbiAlcyIsCiAJCQkJaGRldi0+bmFtZSwgYmF0b3N0cigmYy0+ZHN0KSk7CkBAIC0yMTAwLDExICsyMTIzLDEzNyBAQAogCX0KIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2NoYW4gKmhjaV9jaGFuX3NlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTggdHlwZSwKKwkJCQkJCWludCAqcXVvdGUpCit7CisJc3RydWN0IGhjaV9jb25uX2hhc2ggKmggPSAmaGRldi0+Y29ubl9oYXNoOworCXN0cnVjdCBoY2lfY2hhbiAqY2hhbiA9IE5VTEw7CisJaW50IG51bSA9IDAsIG1pbiA9IH4wLCBjdXJfcHJpbyA9IDA7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCWludCBjbnQsIHEsIGNvbm5fbnVtID0gMDsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJmgtPmxpc3QsIGxpc3QpIHsKKwkJc3RydWN0IGhjaV9jaGFuX2hhc2ggKmNoOworCQlzdHJ1Y3QgaGNpX2NoYW4gKnRtcDsKKworCQlpZiAoY29ubi0+dHlwZSAhPSB0eXBlKQorCQkJY29udGludWU7CisKKwkJaWYgKGNvbm4tPnN0YXRlICE9IEJUX0NPTk5FQ1RFRCAmJiBjb25uLT5zdGF0ZSAhPSBCVF9DT05GSUcpCisJCQljb250aW51ZTsKKworCQljb25uX251bSsrOworCisJCWNoID0gJmNvbm4tPmNoYW5faGFzaDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmNoLT5saXN0LCBsaXN0KSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0bXAtPmRhdGFfcSkpCisJCQkJY29udGludWU7CisKKwkJCXNrYiA9IHNrYl9wZWVrKCZ0bXAtPmRhdGFfcSk7CisJCQlpZiAoc2tiLT5wcmlvcml0eSA8IGN1cl9wcmlvKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc2tiLT5wcmlvcml0eSA+IGN1cl9wcmlvKSB7CisJCQkJbnVtID0gMDsKKwkJCQltaW4gPSB+MDsKKwkJCQljdXJfcHJpbyA9IHNrYi0+cHJpb3JpdHk7CisJCQl9CisKKwkJCW51bSsrOworCisJCQlpZiAoY29ubi0+c2VudCA8IG1pbikgeworCQkJCW1pbiAgPSBjb25uLT5zZW50OworCQkJCWNoYW4gPSB0bXA7CisJCQl9CisJCX0KKworCQlpZiAoaGNpX2Nvbm5fbnVtKGhkZXYsIHR5cGUpID09IGNvbm5fbnVtKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFjaGFuKQorCQlyZXR1cm4gTlVMTDsKKworCXN3aXRjaCAoY2hhbi0+Y29ubi0+dHlwZSkgeworCWNhc2UgQUNMX0xJTks6CisJCWNudCA9IGhkZXYtPmFjbF9jbnQ7CisJCWJyZWFrOworCWNhc2UgU0NPX0xJTks6CisJY2FzZSBFU0NPX0xJTks6CisJCWNudCA9IGhkZXYtPnNjb19jbnQ7CisJCWJyZWFrOworCWNhc2UgTEVfTElOSzoKKwkJY250ID0gaGRldi0+bGVfbXR1ID8gaGRldi0+bGVfY250IDogaGRldi0+YWNsX2NudDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY250ID0gMDsKKwkJQlRfRVJSKCJVbmtub3duIGxpbmsgdHlwZSIpOworCX0KKworCXEgPSBjbnQgLyBudW07CisJKnF1b3RlID0gcSA/IHEgOiAxOworCUJUX0RCRygiY2hhbiAlcCBxdW90ZSAlZCIsIGNoYW4sICpxdW90ZSk7CisJcmV0dXJuIGNoYW47Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9wcmlvX3JlY2FsY3VsYXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHR5cGUpCit7CisJc3RydWN0IGhjaV9jb25uX2hhc2ggKmggPSAmaGRldi0+Y29ubl9oYXNoOworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlpbnQgbnVtID0gMDsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJmgtPmxpc3QsIGxpc3QpIHsKKwkJc3RydWN0IGhjaV9jaGFuX2hhc2ggKmNoOworCQlzdHJ1Y3QgaGNpX2NoYW4gKmNoYW47CisKKwkJaWYgKGNvbm4tPnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjb25uLT5zdGF0ZSAhPSBCVF9DT05ORUNURUQgJiYgY29ubi0+c3RhdGUgIT0gQlRfQ09ORklHKQorCQkJY29udGludWU7CisKKwkJbnVtKys7CisKKwkJY2ggPSAmY29ubi0+Y2hhbl9oYXNoOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZjaC0+bGlzdCwgbGlzdCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKGNoYW4tPnNlbnQpIHsKKwkJCQljaGFuLT5zZW50ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmY2hhbi0+ZGF0YV9xKSkKKwkJCQljb250aW51ZTsKKworCQkJc2tiID0gc2tiX3BlZWsoJmNoYW4tPmRhdGFfcSk7CisJCQlpZiAoc2tiLT5wcmlvcml0eSA+PSBIQ0lfUFJJT19NQVggLSAxKQorCQkJCWNvbnRpbnVlOworCisJCQlza2ItPnByaW9yaXR5ID0gSENJX1BSSU9fTUFYIC0gMTsKKworCQkJQlRfREJHKCJjaGFuICVwIHNrYiAlcCBwcm9tb3RlZCB0byAlZCIsIGNoYW4sIHNrYiwKKwkJCQkJCQkJc2tiLT5wcmlvcml0eSk7CisJCX0KKworCQlpZiAoaGNpX2Nvbm5fbnVtKGhkZXYsIHR5cGUpID09IG51bSkKKwkJCWJyZWFrOworCX0KK30KKwogc3RhdGljIGlubGluZSB2b2lkIGhjaV9zY2hlZF9hY2woc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7Ci0Jc3RydWN0IGhjaV9jb25uICpjb25uOworCXN0cnVjdCBoY2lfY2hhbiAqY2hhbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBxdW90ZTsKKwl1bnNpZ25lZCBpbnQgY250OwogCiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwogCkBAIC0yMTE4LDE5ICsyMjY3LDM1IEBACiAJCQloY2lfbGlua190eF90byhoZGV2LCBBQ0xfTElOSyk7CiAJfQogCi0Jd2hpbGUgKGhkZXYtPmFjbF9jbnQgJiYgKGNvbm4gPSBoY2lfbG93X3NlbnQoaGRldiwgQUNMX0xJTkssICZxdW90ZSkpKSB7Ci0JCXdoaWxlIChxdW90ZS0tICYmIChza2IgPSBza2JfZGVxdWV1ZSgmY29ubi0+ZGF0YV9xKSkpIHsKLQkJCUJUX0RCRygic2tiICVwIGxlbiAlZCIsIHNrYiwgc2tiLT5sZW4pOworCWNudCA9IGhkZXYtPmFjbF9jbnQ7CiAKLQkJCWhjaV9jb25uX2VudGVyX2FjdGl2ZV9tb2RlKGNvbm4sIGJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSk7CisJd2hpbGUgKGhkZXYtPmFjbF9jbnQgJiYKKwkJCShjaGFuID0gaGNpX2NoYW5fc2VudChoZGV2LCBBQ0xfTElOSywgJnF1b3RlKSkpIHsKKwkJdTMyIHByaW9yaXR5ID0gKHNrYl9wZWVrKCZjaGFuLT5kYXRhX3EpKS0+cHJpb3JpdHk7CisJCXdoaWxlIChxdW90ZS0tICYmIChza2IgPSBza2JfcGVlaygmY2hhbi0+ZGF0YV9xKSkpIHsKKwkJCUJUX0RCRygiY2hhbiAlcCBza2IgJXAgbGVuICVkIHByaW9yaXR5ICV1IiwgY2hhbiwgc2tiLAorCQkJCQlza2ItPmxlbiwgc2tiLT5wcmlvcml0eSk7CisKKwkJCS8qIFN0b3AgaWYgcHJpb3JpdHkgaGFzIGNoYW5nZWQgKi8KKwkJCWlmIChza2ItPnByaW9yaXR5IDwgcHJpb3JpdHkpCisJCQkJYnJlYWs7CisKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZjaGFuLT5kYXRhX3EpOworCisJCQloY2lfY29ubl9lbnRlcl9hY3RpdmVfbW9kZShjaGFuLT5jb25uLAorCQkJCQkJYnRfY2Ioc2tiKS0+Zm9yY2VfYWN0aXZlKTsKIAogCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsKIAkJCWhkZXYtPmFjbF9sYXN0X3R4ID0gamlmZmllczsKIAogCQkJaGRldi0+YWNsX2NudC0tOwotCQkJY29ubi0+c2VudCsrOworCQkJY2hhbi0+c2VudCsrOworCQkJY2hhbi0+Y29ubi0+c2VudCsrOwogCQl9CiAJfQorCisJaWYgKGNudCAhPSBoZGV2LT5hY2xfY250KQorCQloY2lfcHJpb19yZWNhbGN1bGF0ZShoZGV2LCBBQ0xfTElOSyk7CiB9CiAKIC8qIFNjaGVkdWxlIFNDTyAqLwpAQCAtMjE4Miw5ICsyMzQ3LDkgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9zY2hlZF9sZShzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKLQlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CisJc3RydWN0IGhjaV9jaGFuICpjaGFuOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHF1b3RlLCBjbnQ7CisJaW50IHF1b3RlLCBjbnQsIHRtcDsKIAogCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKIApAQCAtMjIwMCwyMSArMjM2NSwzNSBAQAogCX0KIAogCWNudCA9IGhkZXYtPmxlX3BrdHMgPyBoZGV2LT5sZV9jbnQgOiBoZGV2LT5hY2xfY250OwotCXdoaWxlIChjbnQgJiYgKGNvbm4gPSBoY2lfbG93X3NlbnQoaGRldiwgTEVfTElOSywgJnF1b3RlKSkpIHsKLQkJd2hpbGUgKHF1b3RlLS0gJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5kYXRhX3EpKSkgewotCQkJQlRfREJHKCJza2IgJXAgbGVuICVkIiwgc2tiLCBza2ItPmxlbik7CisJdG1wID0gY250OworCXdoaWxlIChjbnQgJiYgKGNoYW4gPSBoY2lfY2hhbl9zZW50KGhkZXYsIExFX0xJTkssICZxdW90ZSkpKSB7CisJCXUzMiBwcmlvcml0eSA9IChza2JfcGVlaygmY2hhbi0+ZGF0YV9xKSktPnByaW9yaXR5OworCQl3aGlsZSAocXVvdGUtLSAmJiAoc2tiID0gc2tiX3BlZWsoJmNoYW4tPmRhdGFfcSkpKSB7CisJCQlCVF9EQkcoImNoYW4gJXAgc2tiICVwIGxlbiAlZCBwcmlvcml0eSAldSIsIGNoYW4sIHNrYiwKKwkJCQkJc2tiLT5sZW4sIHNrYi0+cHJpb3JpdHkpOworCisJCQkvKiBTdG9wIGlmIHByaW9yaXR5IGhhcyBjaGFuZ2VkICovCisJCQlpZiAoc2tiLT5wcmlvcml0eSA8IHByaW9yaXR5KQorCQkJCWJyZWFrOworCisJCQlza2IgPSBza2JfZGVxdWV1ZSgmY2hhbi0+ZGF0YV9xKTsKIAogCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsKIAkJCWhkZXYtPmxlX2xhc3RfdHggPSBqaWZmaWVzOwogCiAJCQljbnQtLTsKLQkJCWNvbm4tPnNlbnQrKzsKKwkJCWNoYW4tPnNlbnQrKzsKKwkJCWNoYW4tPmNvbm4tPnNlbnQrKzsKIAkJfQogCX0KKwogCWlmIChoZGV2LT5sZV9wa3RzKQogCQloZGV2LT5sZV9jbnQgPSBjbnQ7CiAJZWxzZQogCQloZGV2LT5hY2xfY250ID0gY250OworCisJaWYgKGNudCAhPSB0bXApCisJCWhjaV9wcmlvX3JlY2FsY3VsYXRlKGhkZXYsIExFX0xJTkspOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfdHhfdGFzayh1bnNpZ25lZCBsb25nIGFyZykKQEAgLTI0MDcsMyArMjU4NiwzMSBAQAogCQl9CiAJfQogfQorCitpbnQgaGNpX2RvX2lucXVpcnkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGxlbmd0aCkKK3sKKwkvKiBHZW5lcmFsIGlucXVpcnkgYWNjZXNzIGNvZGUgKEdJQUMpICovCisJdTggbGFwWzNdID0geyAweDMzLCAweDhiLCAweDllIH07CisJc3RydWN0IGhjaV9jcF9pbnF1aXJ5IGNwOworCisJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOworCisJaWYgKHRlc3RfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTlBST0dSRVNTOworCisJbWVtc2V0KCZjcCwgMCwgc2l6ZW9mKGNwKSk7CisJbWVtY3B5KCZjcC5sYXAsIGxhcCwgc2l6ZW9mKGNwLmxhcCkpOworCWNwLmxlbmd0aCAgPSBsZW5ndGg7CisKKwlyZXR1cm4gaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9JTlFVSVJZLCBzaXplb2YoY3ApLCAmY3ApOworfQorCitpbnQgaGNpX2NhbmNlbF9pbnF1aXJ5KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCWlmICghdGVzdF9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncykpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9JTlFVSVJZX0NBTkNFTCwgMCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwppbmRleCBkN2Q5NmI2Li5hODljZjFmIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKQEAgLTU4LDkgKzU4LDExIEBACiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuOwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKSAmJgotCQkJdGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCi0JCW1nbXRfZGlzY292ZXJpbmcoaGRldi0+aWQsIDApOworCWNsZWFyX2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKwltZ210X2Rpc2NvdmVyaW5nKGhkZXYsIDApOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCiAJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBIQ0lfT1BfSU5RVUlSWV9DQU5DRUwsIHN0YXR1cyk7CiAKQEAgLTc2LDEwICs3OCw2IEBACiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuOwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKSAmJgotCQkJCXRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQotCQltZ210X2Rpc2NvdmVyaW5nKGhkZXYtPmlkLCAwKTsKLQogCWhjaV9jb25uX2NoZWNrX3BlbmRpbmcoaGRldik7CiB9CiAKQEAgLTIwNSwxMyArMjAzLDE1IEBACiAJaWYgKCFzZW50KQogCQlyZXR1cm47CiAKKwloY2lfZGV2X2xvY2soaGRldik7CisKIAlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCi0JCW1nbXRfc2V0X2xvY2FsX25hbWVfY29tcGxldGUoaGRldi0+aWQsIHNlbnQsIHN0YXR1cyk7CisJCW1nbXRfc2V0X2xvY2FsX25hbWVfY29tcGxldGUoaGRldiwgc2VudCwgc3RhdHVzKTsKIAotCWlmIChzdGF0dXMpCi0JCXJldHVybjsKKwlpZiAoc3RhdHVzID09IDApCisJCW1lbWNweShoZGV2LT5kZXZfbmFtZSwgc2VudCwgSENJX01BWF9OQU1FX0xFTkdUSCk7CiAKLQltZW1jcHkoaGRldi0+ZGV2X25hbWUsIHNlbnQsIEhDSV9NQVhfTkFNRV9MRU5HVEgpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfY2NfcmVhZF9sb2NhbF9uYW1lKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMjc0LDcgKzI3NCw4IEBACiAKIHN0YXRpYyB2b2lkIGhjaV9jY193cml0ZV9zY2FuX2VuYWJsZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlfX3U4IHN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKwlfX3U4IHBhcmFtLCBzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisJaW50IG9sZF9wc2Nhbiwgb2xkX2lzY2FuOwogCXZvaWQgKnNlbnQ7CiAKIAlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKQEAgLTI4MywyOCArMjg0LDQwIEBACiAJaWYgKCFzZW50KQogCQlyZXR1cm47CiAKLQlpZiAoIXN0YXR1cykgewotCQlfX3U4IHBhcmFtID0gKigoX191OCAqKSBzZW50KTsKLQkJaW50IG9sZF9wc2Nhbiwgb2xkX2lzY2FuOworCXBhcmFtID0gKigoX191OCAqKSBzZW50KTsKIAotCQlvbGRfcHNjYW4gPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX1BTQ0FOLCAmaGRldi0+ZmxhZ3MpOwotCQlvbGRfaXNjYW4gPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0lTQ0FOLCAmaGRldi0+ZmxhZ3MpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCQlpZiAocGFyYW0gJiBTQ0FOX0lOUVVJUlkpIHsKLQkJCXNldF9iaXQoSENJX0lTQ0FOLCAmaGRldi0+ZmxhZ3MpOwotCQkJaWYgKCFvbGRfaXNjYW4pCi0JCQkJbWdtdF9kaXNjb3ZlcmFibGUoaGRldi0+aWQsIDEpOwotCQl9IGVsc2UgaWYgKG9sZF9pc2NhbikKLQkJCW1nbXRfZGlzY292ZXJhYmxlKGhkZXYtPmlkLCAwKTsKLQotCQlpZiAocGFyYW0gJiBTQ0FOX1BBR0UpIHsKLQkJCXNldF9iaXQoSENJX1BTQ0FOLCAmaGRldi0+ZmxhZ3MpOwotCQkJaWYgKCFvbGRfcHNjYW4pCi0JCQkJbWdtdF9jb25uZWN0YWJsZShoZGV2LT5pZCwgMSk7Ci0JCX0gZWxzZSBpZiAob2xkX3BzY2FuKQotCQkJbWdtdF9jb25uZWN0YWJsZShoZGV2LT5pZCwgMCk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCW1nbXRfd3JpdGVfc2Nhbl9mYWlsZWQoaGRldiwgcGFyYW0sIHN0YXR1cyk7CisJCWhkZXYtPmRpc2Nvdl90aW1lb3V0ID0gMDsKKwkJZ290byBkb25lOwogCX0KIAorCW9sZF9wc2NhbiA9IHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfUFNDQU4sICZoZGV2LT5mbGFncyk7CisJb2xkX2lzY2FuID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9JU0NBTiwgJmhkZXYtPmZsYWdzKTsKKworCWlmIChwYXJhbSAmIFNDQU5fSU5RVUlSWSkgeworCQlzZXRfYml0KEhDSV9JU0NBTiwgJmhkZXYtPmZsYWdzKTsKKwkJaWYgKCFvbGRfaXNjYW4pCisJCQltZ210X2Rpc2NvdmVyYWJsZShoZGV2LCAxKTsKKwkJaWYgKGhkZXYtPmRpc2Nvdl90aW1lb3V0ID4gMCkgeworCQkJaW50IHRvID0gbXNlY3NfdG9famlmZmllcyhoZGV2LT5kaXNjb3ZfdGltZW91dCAqIDEwMDApOworCQkJcXVldWVfZGVsYXllZF93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPmRpc2Nvdl9vZmYsCisJCQkJCQkJCQl0byk7CisJCX0KKwl9IGVsc2UgaWYgKG9sZF9pc2NhbikKKwkJbWdtdF9kaXNjb3ZlcmFibGUoaGRldiwgMCk7CisKKwlpZiAocGFyYW0gJiBTQ0FOX1BBR0UpIHsKKwkJc2V0X2JpdChIQ0lfUFNDQU4sICZoZGV2LT5mbGFncyk7CisJCWlmICghb2xkX3BzY2FuKQorCQkJbWdtdF9jb25uZWN0YWJsZShoZGV2LCAxKTsKKwl9IGVsc2UgaWYgKG9sZF9wc2NhbikKKwkJbWdtdF9jb25uZWN0YWJsZShoZGV2LCAwKTsKKworZG9uZToKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIEhDSV9PUF9XUklURV9TQ0FOX0VOQUJMRSwgc3RhdHVzKTsKIH0KIApAQCAtNzQ4LDYgKzc2MSwzMCBAQAogCWhjaV9yZXFfY29tcGxldGUoaGRldiwgSENJX09QX1dSSVRFX0NBX1RJTUVPVVQsIHN0YXR1cyk7CiB9CiAKK3N0YXRpYyB2b2lkIGhjaV9jY19yZWFkX2xvY2FsX2FtcF9pbmZvKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfcnBfcmVhZF9sb2NhbF9hbXBfaW5mbyAqcnAgPSAodm9pZCAqKSBza2ItPmRhdGE7CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgcnAtPnN0YXR1cyk7CisKKwlpZiAocnAtPnN0YXR1cykKKwkJcmV0dXJuOworCisJaGRldi0+YW1wX3N0YXR1cyA9IHJwLT5hbXBfc3RhdHVzOworCWhkZXYtPmFtcF90b3RhbF9idyA9IF9fbGUzMl90b19jcHUocnAtPnRvdGFsX2J3KTsKKwloZGV2LT5hbXBfbWF4X2J3ID0gX19sZTMyX3RvX2NwdShycC0+bWF4X2J3KTsKKwloZGV2LT5hbXBfbWluX2xhdGVuY3kgPSBfX2xlMzJfdG9fY3B1KHJwLT5taW5fbGF0ZW5jeSk7CisJaGRldi0+YW1wX21heF9wZHUgPSBfX2xlMzJfdG9fY3B1KHJwLT5tYXhfcGR1KTsKKwloZGV2LT5hbXBfdHlwZSA9IHJwLT5hbXBfdHlwZTsKKwloZGV2LT5hbXBfcGFsX2NhcCA9IF9fbGUxNl90b19jcHUocnAtPnBhbF9jYXApOworCWhkZXYtPmFtcF9hc3NvY19zaXplID0gX19sZTE2X3RvX2NwdShycC0+bWF4X2Fzc29jX3NpemUpOworCWhkZXYtPmFtcF9iZV9mbHVzaF90byA9IF9fbGUzMl90b19jcHUocnAtPmJlX2ZsdXNoX3RvKTsKKwloZGV2LT5hbXBfbWF4X2ZsdXNoX3RvID0gX19sZTMyX3RvX2NwdShycC0+bWF4X2ZsdXNoX3RvKTsKKworCWhjaV9yZXFfY29tcGxldGUoaGRldiwgSENJX09QX1JFQURfTE9DQUxfQU1QX0lORk8sIHJwLT5zdGF0dXMpOworfQorCiBzdGF0aWMgdm9pZCBoY2lfY2NfZGVsZXRlX3N0b3JlZF9saW5rX2tleShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKIAkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtODA0LDE5ICs4NDEsMjQgQEAKIAogCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKIAorCWhjaV9kZXZfbG9jayhoZGV2KTsKKwogCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJbWdtdF9waW5fY29kZV9yZXBseV9jb21wbGV0ZShoZGV2LT5pZCwgJnJwLT5iZGFkZHIsIHJwLT5zdGF0dXMpOworCQltZ210X3Bpbl9jb2RlX3JlcGx5X2NvbXBsZXRlKGhkZXYsICZycC0+YmRhZGRyLCBycC0+c3RhdHVzKTsKIAogCWlmIChycC0+c3RhdHVzICE9IDApCi0JCXJldHVybjsKKwkJZ290byB1bmxvY2s7CiAKIAljcCA9IGhjaV9zZW50X2NtZF9kYXRhKGhkZXYsIEhDSV9PUF9QSU5fQ09ERV9SRVBMWSk7CiAJaWYgKCFjcCkKLQkJcmV0dXJuOworCQlnb3RvIHVubG9jazsKIAogCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywgJmNwLT5iZGFkZHIpOwogCWlmIChjb25uKQogCQljb25uLT5waW5fbGVuZ3RoID0gY3AtPnBpbl9sZW47CisKK3VubG9jazoKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgaGNpX2NjX3Bpbl9jb2RlX25lZ19yZXBseShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTgyNSwxMCArODY3LDE1IEBACiAKIAlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgcnAtPnN0YXR1cyk7CiAKKwloY2lfZGV2X2xvY2soaGRldik7CisKIAlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCi0JCW1nbXRfcGluX2NvZGVfbmVnX3JlcGx5X2NvbXBsZXRlKGhkZXYtPmlkLCAmcnAtPmJkYWRkciwKKwkJbWdtdF9waW5fY29kZV9uZWdfcmVwbHlfY29tcGxldGUoaGRldiwgJnJwLT5iZGFkZHIsCiAJCQkJCQkJCXJwLT5zdGF0dXMpOworCisJaGNpX2Rldl91bmxvY2soaGRldik7CiB9CisKIHN0YXRpYyB2b2lkIGhjaV9jY19sZV9yZWFkX2J1ZmZlcl9zaXplKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAogCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtODU1LDkgKzkwMiwxMyBAQAogCiAJQlRfREJHKCIlcyBzdGF0dXMgMHgleCIsIGhkZXYtPm5hbWUsIHJwLT5zdGF0dXMpOwogCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCiAJaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQotCQltZ210X3VzZXJfY29uZmlybV9yZXBseV9jb21wbGV0ZShoZGV2LT5pZCwgJnJwLT5iZGFkZHIsCisJCW1nbXRfdXNlcl9jb25maXJtX3JlcGx5X2NvbXBsZXRlKGhkZXYsICZycC0+YmRhZGRyLAogCQkJCQkJCQlycC0+c3RhdHVzKTsKKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfY2NfdXNlcl9jb25maXJtX25lZ19yZXBseShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKQEAgLTg2Nyw5ICs5MTgsMTMgQEAKIAogCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKIAorCWhjaV9kZXZfbG9jayhoZGV2KTsKKwogCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJbWdtdF91c2VyX2NvbmZpcm1fbmVnX3JlcGx5X2NvbXBsZXRlKGhkZXYtPmlkLCAmcnAtPmJkYWRkciwKKwkJbWdtdF91c2VyX2NvbmZpcm1fbmVnX3JlcGx5X2NvbXBsZXRlKGhkZXYsICZycC0+YmRhZGRyLAogCQkJCQkJCQlycC0+c3RhdHVzKTsKKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfY2NfcmVhZF9sb2NhbF9vb2JfZGF0YV9yZXBseShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKQEAgLTg3OSw4ICs5MzQsMTAgQEAKIAogCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKIAotCW1nbXRfcmVhZF9sb2NhbF9vb2JfZGF0YV9yZXBseV9jb21wbGV0ZShoZGV2LT5pZCwgcnAtPmhhc2gsCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCW1nbXRfcmVhZF9sb2NhbF9vb2JfZGF0YV9yZXBseV9jb21wbGV0ZShoZGV2LCBycC0+aGFzaCwKIAkJCQkJCXJwLT5yYW5kb21pemVyLCBycC0+c3RhdHVzKTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgaGNpX2NjX2xlX3NldF9zY2FuX2VuYWJsZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKQEAgLTk1NSwxMiArMTAxMiwxOCBAQAogCWlmIChzdGF0dXMpIHsKIAkJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBIQ0lfT1BfSU5RVUlSWSwgc3RhdHVzKTsKIAkJaGNpX2Nvbm5fY2hlY2tfcGVuZGluZyhoZGV2KTsKKwkJaGNpX2Rldl9sb2NrKGhkZXYpOworCQlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCisJCQltZ210X2lucXVpcnlfZmFpbGVkKGhkZXYsIHN0YXR1cyk7CisJCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpICYmCi0JCQkJdGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCi0JCW1nbXRfZGlzY292ZXJpbmcoaGRldi0+aWQsIDEpOworCXNldF9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisJbWdtdF9kaXNjb3ZlcmluZyhoZGV2LCAxKTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9jc19jcmVhdGVfY29ubihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191OCBzdGF0dXMpCkBAIC0xMzM5LDEzICsxNDAyLDE2IEBACiAKIAlCVF9EQkcoIiVzIHN0YXR1cyAlZCIsIGhkZXYtPm5hbWUsIHN0YXR1cyk7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpICYmCi0JCQkJdGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCi0JCW1nbXRfZGlzY292ZXJpbmcoaGRldi0+aWQsIDApOwotCiAJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBIQ0lfT1BfSU5RVUlSWSwgc3RhdHVzKTsKIAogCWhjaV9jb25uX2NoZWNrX3BlbmRpbmcoaGRldik7CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKSkKKwkJcmV0dXJuOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCW1nbXRfZGlzY292ZXJpbmcoaGRldiwgMCk7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfaW5xdWlyeV9yZXN1bHRfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTM2MSwxMiArMTQyNyw2IEBACiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncykpIHsKLQotCQlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCi0JCQltZ210X2Rpc2NvdmVyaW5nKGhkZXYtPmlkLCAxKTsKLQl9Ci0KIAlmb3IgKDsgbnVtX3JzcDsgbnVtX3JzcC0tLCBpbmZvKyspIHsKIAkJYmFjcHkoJmRhdGEuYmRhZGRyLCAmaW5mby0+YmRhZGRyKTsKIAkJZGF0YS5wc2Nhbl9yZXBfbW9kZQk9IGluZm8tPnBzY2FuX3JlcF9tb2RlOwpAQCAtMTM3Nyw4ICsxNDM3LDggQEAKIAkJZGF0YS5yc3NpCQk9IDB4MDA7CiAJCWRhdGEuc3NwX21vZGUJCT0gMHgwMDsKIAkJaGNpX2lucXVpcnlfY2FjaGVfdXBkYXRlKGhkZXYsICZkYXRhKTsKLQkJbWdtdF9kZXZpY2VfZm91bmQoaGRldi0+aWQsICZpbmZvLT5iZGFkZHIsIGluZm8tPmRldl9jbGFzcywgMCwKLQkJCQkJCQkJCU5VTEwpOworCQltZ210X2RldmljZV9mb3VuZChoZGV2LCAmaW5mby0+YmRhZGRyLCBBQ0xfTElOSywKKwkJCQkJCWluZm8tPmRldl9jbGFzcywgMCwgTlVMTCk7CiAJfQogCiAJaGNpX2Rldl91bmxvY2soaGRldik7CkBAIC0xNDEyLDcgKzE0NzIsNyBAQAogCQkJY29ubi0+c3RhdGUgPSBCVF9DT05GSUc7CiAJCQloY2lfY29ubl9ob2xkKGNvbm4pOwogCQkJY29ubi0+ZGlzY190aW1lb3V0ID0gSENJX0RJU0NPTk5fVElNRU9VVDsKLQkJCW1nbXRfY29ubmVjdGVkKGhkZXYtPmlkLCAmZXYtPmJkYWRkciwgY29ubi0+dHlwZSk7CisJCQltZ210X2Nvbm5lY3RlZChoZGV2LCAmZXYtPmJkYWRkciwgY29ubi0+dHlwZSk7CiAJCX0gZWxzZQogCQkJY29ubi0+c3RhdGUgPSBCVF9DT05ORUNURUQ7CiAKQEAgLTE0NDQsNyArMTUwNCw4IEBACiAJfSBlbHNlIHsKIAkJY29ubi0+c3RhdGUgPSBCVF9DTE9TRUQ7CiAJCWlmIChjb25uLT50eXBlID09IEFDTF9MSU5LKQotCQkJbWdtdF9jb25uZWN0X2ZhaWxlZChoZGV2LT5pZCwgJmV2LT5iZGFkZHIsIGV2LT5zdGF0dXMpOworCQkJbWdtdF9jb25uZWN0X2ZhaWxlZChoZGV2LCAmZXYtPmJkYWRkciwgY29ubi0+dHlwZSwKKwkJCQkJCQkJZXYtPnN0YXR1cyk7CiAJfQogCiAJaWYgKGNvbm4tPnR5cGUgPT0gQUNMX0xJTkspCkBAIC0xNTMxLDcgKzE1OTIsNyBAQAogCQlzdHJ1Y3QgaGNpX2NwX3JlamVjdF9jb25uX3JlcSBjcDsKIAogCQliYWNweSgmY3AuYmRhZGRyLCAmZXYtPmJkYWRkcik7Ci0JCWNwLnJlYXNvbiA9IDB4MGY7CisJCWNwLnJlYXNvbiA9IEhDSV9FUlJPUl9SRUpfQkFEX0FERFI7CiAJCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfUkVKRUNUX0NPTk5fUkVRLCBzaXplb2YoY3ApLCAmY3ApOwogCX0KIH0KQEAgLTE1NDQsNyArMTYwNSw5IEBACiAJQlRfREJHKCIlcyBzdGF0dXMgJWQiLCBoZGV2LT5uYW1lLCBldi0+c3RhdHVzKTsKIAogCWlmIChldi0+c3RhdHVzKSB7Ci0JCW1nbXRfZGlzY29ubmVjdF9mYWlsZWQoaGRldi0+aWQpOworCQloY2lfZGV2X2xvY2soaGRldik7CisJCW1nbXRfZGlzY29ubmVjdF9mYWlsZWQoaGRldik7CisJCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNTU3LDcgKzE2MjAsNyBAQAogCWNvbm4tPnN0YXRlID0gQlRfQ0xPU0VEOwogCiAJaWYgKGNvbm4tPnR5cGUgPT0gQUNMX0xJTksgfHwgY29ubi0+dHlwZSA9PSBMRV9MSU5LKQotCQltZ210X2Rpc2Nvbm5lY3RlZChoZGV2LT5pZCwgJmNvbm4tPmRzdCk7CisJCW1nbXRfZGlzY29ubmVjdGVkKGhkZXYsICZjb25uLT5kc3QsIGNvbm4tPnR5cGUpOwogCiAJaGNpX3Byb3RvX2Rpc2Nvbm5fY2ZtKGNvbm4sIGV2LT5yZWFzb24pOwogCWhjaV9jb25uX2RlbChjb25uKTsKQEAgLTE1ODgsNyArMTY1MSw3IEBACiAJCQljb25uLT5zZWNfbGV2ZWwgPSBjb25uLT5wZW5kaW5nX3NlY19sZXZlbDsKIAkJfQogCX0gZWxzZSB7Ci0JCW1nbXRfYXV0aF9mYWlsZWQoaGRldi0+aWQsICZjb25uLT5kc3QsIGV2LT5zdGF0dXMpOworCQltZ210X2F1dGhfZmFpbGVkKGhkZXYsICZjb25uLT5kc3QsIGV2LT5zdGF0dXMpOwogCX0KIAogCWNsZWFyX2JpdChIQ0lfQ09OTl9BVVRIX1BFTkQsICZjb25uLT5wZW5kKTsKQEAgLTE2NDMsNyArMTcwNiw3IEBACiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKGV2LT5zdGF0dXMgPT0gMCAmJiB0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJbWdtdF9yZW1vdGVfbmFtZShoZGV2LT5pZCwgJmV2LT5iZGFkZHIsIGV2LT5uYW1lKTsKKwkJbWdtdF9yZW1vdGVfbmFtZShoZGV2LCAmZXYtPmJkYWRkciwgZXYtPm5hbWUpOwogCiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCAmZXYtPmJkYWRkcik7CiAJaWYgKCFjb25uKQpAQCAtMTg5OCw2ICsxOTYxLDEwIEBACiAJCWhjaV9jY193cml0ZV9jYV90aW1lb3V0KGhkZXYsIHNrYik7CiAJCWJyZWFrOwogCisJY2FzZSBIQ0lfT1BfUkVBRF9MT0NBTF9BTVBfSU5GTzoKKwkJaGNpX2NjX3JlYWRfbG9jYWxfYW1wX2luZm8oaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKIAljYXNlIEhDSV9PUF9ERUxFVEVfU1RPUkVEX0xJTktfS0VZOgogCQloY2lfY2NfZGVsZXRlX3N0b3JlZF9saW5rX2tleShoZGV2LCBza2IpOwogCQlicmVhazsKQEAgLTIwMjksNyArMjA5Niw3IEBACiAKIAljYXNlIEhDSV9PUF9ESVNDT05ORUNUOgogCQlpZiAoZXYtPnN0YXR1cyAhPSAwKQotCQkJbWdtdF9kaXNjb25uZWN0X2ZhaWxlZChoZGV2LT5pZCk7CisJCQltZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKGhkZXYpOwogCQlicmVhazsKIAogCWNhc2UgSENJX09QX0xFX0NSRUFURV9DT05OOgpAQCAtMjE5NCw3ICsyMjYxLDcgQEAKIAkJZWxzZQogCQkJc2VjdXJlID0gMDsKIAotCQltZ210X3Bpbl9jb2RlX3JlcXVlc3QoaGRldi0+aWQsICZldi0+YmRhZGRyLCBzZWN1cmUpOworCQltZ210X3Bpbl9jb2RlX3JlcXVlc3QoaGRldiwgJmV2LT5iZGFkZHIsIHNlY3VyZSk7CiAJfQogCiB1bmxvY2s6CkBAIC0yMzYzLDEyICsyNDMwLDYgQEAKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKSkgewotCi0JCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJCW1nbXRfZGlzY292ZXJpbmcoaGRldi0+aWQsIDEpOwotCX0KLQogCWlmICgoc2tiLT5sZW4gLSAxKSAvIG51bV9yc3AgIT0gc2l6ZW9mKHN0cnVjdCBpbnF1aXJ5X2luZm9fd2l0aF9yc3NpKSkgewogCQlzdHJ1Y3QgaW5xdWlyeV9pbmZvX3dpdGhfcnNzaV9hbmRfcHNjYW5fbW9kZSAqaW5mbzsKIAkJaW5mbyA9ICh2b2lkICopIChza2ItPmRhdGEgKyAxKTsKQEAgLTIzODMsNyArMjQ0NCw3IEBACiAJCQlkYXRhLnJzc2kJCT0gaW5mby0+cnNzaTsKIAkJCWRhdGEuc3NwX21vZGUJCT0gMHgwMDsKIAkJCWhjaV9pbnF1aXJ5X2NhY2hlX3VwZGF0ZShoZGV2LCAmZGF0YSk7Ci0JCQltZ210X2RldmljZV9mb3VuZChoZGV2LT5pZCwgJmluZm8tPmJkYWRkciwKKwkJCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZpbmZvLT5iZGFkZHIsIEFDTF9MSU5LLAogCQkJCQkJaW5mby0+ZGV2X2NsYXNzLCBpbmZvLT5yc3NpLAogCQkJCQkJTlVMTCk7CiAJCX0KQEAgLTI0MDAsNyArMjQ2MSw3IEBACiAJCQlkYXRhLnJzc2kJCT0gaW5mby0+cnNzaTsKIAkJCWRhdGEuc3NwX21vZGUJCT0gMHgwMDsKIAkJCWhjaV9pbnF1aXJ5X2NhY2hlX3VwZGF0ZShoZGV2LCAmZGF0YSk7Ci0JCQltZ210X2RldmljZV9mb3VuZChoZGV2LT5pZCwgJmluZm8tPmJkYWRkciwKKwkJCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZpbmZvLT5iZGFkZHIsIEFDTF9MSU5LLAogCQkJCQkJaW5mby0+ZGV2X2NsYXNzLCBpbmZvLT5yc3NpLAogCQkJCQkJTlVMTCk7CiAJCX0KQEAgLTI1MzEsMTIgKzI1OTIsNiBAQAogCWlmICghbnVtX3JzcCkKIAkJcmV0dXJuOwogCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpKSB7Ci0KLQkJaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQotCQkJbWdtdF9kaXNjb3ZlcmluZyhoZGV2LT5pZCwgMSk7Ci0JfQotCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJZm9yICg7IG51bV9yc3A7IG51bV9yc3AtLSwgaW5mbysrKSB7CkBAIC0yNTQ5LDggKzI2MDQsOCBAQAogCQlkYXRhLnJzc2kJCT0gaW5mby0+cnNzaTsKIAkJZGF0YS5zc3BfbW9kZQkJPSAweDAxOwogCQloY2lfaW5xdWlyeV9jYWNoZV91cGRhdGUoaGRldiwgJmRhdGEpOwotCQltZ210X2RldmljZV9mb3VuZChoZGV2LT5pZCwgJmluZm8tPmJkYWRkciwgaW5mby0+ZGV2X2NsYXNzLAotCQkJCQkJaW5mby0+cnNzaSwgaW5mby0+ZGF0YSk7CisJCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZpbmZvLT5iZGFkZHIsIEFDTF9MSU5LLAorCQkJCWluZm8tPmRldl9jbGFzcywgaW5mby0+cnNzaSwgaW5mby0+ZGF0YSk7CiAJfQogCiAJaGNpX2Rldl91bmxvY2soaGRldik7CkBAIC0yNjE0LDcgKzI2NjksNyBAQAogCQlzdHJ1Y3QgaGNpX2NwX2lvX2NhcGFiaWxpdHlfbmVnX3JlcGx5IGNwOwogCiAJCWJhY3B5KCZjcC5iZGFkZHIsICZldi0+YmRhZGRyKTsKLQkJY3AucmVhc29uID0gMHgxODsgLyogUGFpcmluZyBub3QgYWxsb3dlZCAqLworCQljcC5yZWFzb24gPSBIQ0lfRVJST1JfUEFJUklOR19OT1RfQUxMT1dFRDsKIAogCQloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0lPX0NBUEFCSUxJVFlfTkVHX1JFUExZLAogCQkJCQkJCXNpemVvZihjcCksICZjcCk7CkBAIC0yNzA2LDcgKzI3NjEsNyBAQAogCX0KIAogY29uZmlybToKLQltZ210X3VzZXJfY29uZmlybV9yZXF1ZXN0KGhkZXYtPmlkLCAmZXYtPmJkYWRkciwgZXYtPnBhc3NrZXksCisJbWdtdF91c2VyX2NvbmZpcm1fcmVxdWVzdChoZGV2LCAmZXYtPmJkYWRkciwgZXYtPnBhc3NrZXksCiAJCQkJCQkJCWNvbmZpcm1faGludCk7CiAKIHVubG9jazoKQEAgLTI3MzIsNyArMjc4Nyw3IEBACiAJICogZXZlbnQgZ2V0cyBhbHdheXMgcHJvZHVjZWQgYXMgaW5pdGlhdG9yIGFuZCBpcyBhbHNvIG1hcHBlZCB0bwogCSAqIHRoZSBtZ210X2F1dGhfZmFpbGVkIGV2ZW50ICovCiAJaWYgKCF0ZXN0X2JpdChIQ0lfQ09OTl9BVVRIX1BFTkQsICZjb25uLT5wZW5kKSAmJiBldi0+c3RhdHVzICE9IDApCi0JCW1nbXRfYXV0aF9mYWlsZWQoaGRldi0+aWQsICZjb25uLT5kc3QsIGV2LT5zdGF0dXMpOworCQltZ210X2F1dGhfZmFpbGVkKGhkZXYsICZjb25uLT5kc3QsIGV2LT5zdGF0dXMpOwogCiAJaGNpX2Nvbm5fcHV0KGNvbm4pOwogCkBAIC0yODEzLDE0ICsyODY4LDE0IEBACiAJfQogCiAJaWYgKGV2LT5zdGF0dXMpIHsKLQkJbWdtdF9jb25uZWN0X2ZhaWxlZChoZGV2LT5pZCwgJmV2LT5iZGFkZHIsIGV2LT5zdGF0dXMpOworCQltZ210X2Nvbm5lY3RfZmFpbGVkKGhkZXYsICZldi0+YmRhZGRyLCBjb25uLT50eXBlLCBldi0+c3RhdHVzKTsKIAkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOwogCQljb25uLT5zdGF0ZSA9IEJUX0NMT1NFRDsKIAkJaGNpX2Nvbm5fZGVsKGNvbm4pOwogCQlnb3RvIHVubG9jazsKIAl9CiAKLQltZ210X2Nvbm5lY3RlZChoZGV2LT5pZCwgJmV2LT5iZGFkZHIsIGNvbm4tPnR5cGUpOworCW1nbXRfY29ubmVjdGVkKGhkZXYsICZldi0+YmRhZGRyLCBjb25uLT50eXBlKTsKIAogCWNvbm4tPnNlY19sZXZlbCA9IEJUX1NFQ1VSSVRZX0xPVzsKIAljb25uLT5oYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpOwpAQCAtMzEwNCw1ICszMTU5LDUgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIH0KIAotbW9kdWxlX3BhcmFtKGVuYWJsZV9sZSwgYm9vbCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oZW5hYmxlX2xlLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2xlLCAiRW5hYmxlIExFIHN1cHBvcnQiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jCmluZGV4IDIyZjFhNmMuLmM2MmQyNTQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KQEAgLTQzNSwxNyArNDM2LDEyIEBACiBzdGF0aWMgaW50IGJsYWNrbGlzdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGYtPnByaXZhdGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3QgYmRhZGRyX2xpc3QgKmI7CiAKIAloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKLQlsaXN0X2Zvcl9lYWNoKGwsICZoZGV2LT5ibGFja2xpc3QpIHsKLQkJc3RydWN0IGJkYWRkcl9saXN0ICpiOwotCi0JCWIgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBiZGFkZHJfbGlzdCwgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZoZGV2LT5ibGFja2xpc3QsIGxpc3QpCiAJCXNlcV9wcmludGYoZiwgIiVzXG4iLCBiYXRvc3RyKCZiLT5iZGFkZHIpKTsKLQl9CiAKIAloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIApAQCAtNDg0LDE3ICs0ODAsMTIgQEAKIHN0YXRpYyBpbnQgdXVpZHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnApCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBmLT5wcml2YXRlOwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IGJ0X3V1aWQgKnV1aWQ7CiAKIAloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKLQlsaXN0X2Zvcl9lYWNoKGwsICZoZGV2LT51dWlkcykgewotCQlzdHJ1Y3QgYnRfdXVpZCAqdXVpZDsKLQotCQl1dWlkID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYnRfdXVpZCwgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHV1aWQsICZoZGV2LT51dWlkcywgbGlzdCkKIAkJcHJpbnRfYnRfdXVpZChmLCB1dWlkLT51dWlkKTsKLQl9CiAKIAloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIApAQCAtNTQyLDIyICs1MzMsMjggQEAKIERFRklORV9TSU1QTEVfQVRUUklCVVRFKGF1dG9fYWNjZXB0X2RlbGF5X2ZvcHMsIGF1dG9fYWNjZXB0X2RlbGF5X2dldCwKIAkJCQkJYXV0b19hY2NlcHRfZGVsYXlfc2V0LCAiJWxsdVxuIik7CiAKLWludCBoY2lfcmVnaXN0ZXJfc3lzZnMoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit2b2lkIGhjaV9pbml0X3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZoZGV2LT5kZXY7CisKKwlkZXYtPnR5cGUgPSAmYnRfaG9zdDsKKwlkZXYtPmNsYXNzID0gYnRfY2xhc3M7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBoZGV2KTsKKwlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOworfQorCitpbnQgaGNpX2FkZF9zeXNmcyhzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaGRldi0+ZGV2OwogCWludCBlcnI7CiAKIAlCVF9EQkcoIiVwIG5hbWUgJXMgYnVzICVkIiwgaGRldiwgaGRldi0+bmFtZSwgaGRldi0+YnVzKTsKIAotCWRldi0+dHlwZSA9ICZidF9ob3N0OwotCWRldi0+Y2xhc3MgPSBidF9jbGFzczsKIAlkZXYtPnBhcmVudCA9IGhkZXYtPnBhcmVudDsKLQogCWRldl9zZXRfbmFtZShkZXYsICIlcyIsIGhkZXYtPm5hbWUpOwogCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgaGRldik7Ci0KLQllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoZGV2KTsKKwllcnIgPSBkZXZpY2VfYWRkKGRldik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTU4MSw3ICs1NzgsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGhjaV91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQordm9pZCBoY2lfZGVsX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCUJUX0RCRygiJXAgbmFtZSAlcyBidXMgJWQiLCBoZGV2LCBoZGV2LT5uYW1lLCBoZGV2LT5idXMpOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwppbmRleCAwNzVhM2U5Li4zYzJkODg4IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKQEAgLTgxLDI0ICs4MSwyMCBAQAogc3RhdGljIHN0cnVjdCBoaWRwX3Nlc3Npb24gKl9faGlkcF9nZXRfc2Vzc2lvbihiZGFkZHJfdCAqYmRhZGRyKQogewogCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAogCUJUX0RCRygiIik7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZoaWRwX3Nlc3Npb25fbGlzdCkgewotCQlzZXNzaW9uID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGlkcF9zZXNzaW9uLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlc3Npb24sICZoaWRwX3Nlc3Npb25fbGlzdCwgbGlzdCkgewogCQlpZiAoIWJhY21wKGJkYWRkciwgJnNlc3Npb24tPmJkYWRkcikpCiAJCQlyZXR1cm4gc2Vzc2lvbjsKIAl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgX19oaWRwX2xpbmtfc2Vzc2lvbihzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQogewotCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAJbGlzdF9hZGQoJnNlc3Npb24tPmxpc3QsICZoaWRwX3Nlc3Npb25fbGlzdCk7Ci0KLQloY2lfY29ubl9ob2xkX2RldmljZShzZXNzaW9uLT5jb25uKTsKIH0KIAogc3RhdGljIHZvaWQgX19oaWRwX3VubGlua19zZXNzaW9uKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCkBAIC0xMDYsNyArMTAyLDYgQEAKIAloY2lfY29ubl9wdXRfZGV2aWNlKHNlc3Npb24tPmNvbm4pOwogCiAJbGlzdF9kZWwoJnNlc3Npb24tPmxpc3QpOwotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2hpZHBfY29weV9zZXNzaW9uKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBoaWRwX2Nvbm5pbmZvICpjaSkKQEAgLTI1NSw2ICsyNTAsOSBAQAogCiAJQlRfREJHKCJzZXNzaW9uICVwIGRhdGEgJXAgc2l6ZSAlZCIsIHNlc3Npb24sIGRhdGEsIHNpemUpOwogCisJaWYgKGF0b21pY19yZWFkKCZzZXNzaW9uLT50ZXJtaW5hdGUpKQorCQlyZXR1cm4gLUVJTzsKKwogCXNrYiA9IGFsbG9jX3NrYihzaXplICsgMSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFza2IpIHsKIAkJQlRfRVJSKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBmcmFtZSIpOwpAQCAtMzI5LDYgKzMyNyw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzaXplX3QgbGVuOwogCWludCBudW1iZXJlZF9yZXBvcnRzID0gaGlkLT5yZXBvcnRfZW51bVtyZXBvcnRfdHlwZV0ubnVtYmVyZWQ7CisJaW50IHJldDsKIAogCXN3aXRjaCAocmVwb3J0X3R5cGUpIHsKIAljYXNlIEhJRF9GRUFUVVJFX1JFUE9SVDoKQEAgLTM1Miw4ICszNTEsOSBAQAogCXNlc3Npb24tPndhaXRpbmdfcmVwb3J0X251bWJlciA9IG51bWJlcmVkX3JlcG9ydHMgPyByZXBvcnRfbnVtYmVyIDogLTE7CiAJc2V0X2JpdChISURQX1dBSVRJTkdfRk9SX1JFVFVSTiwgJnNlc3Npb24tPmZsYWdzKTsKIAlkYXRhWzBdID0gcmVwb3J0X251bWJlcjsKLQlpZiAoaGlkcF9zZW5kX2N0cmxfbWVzc2FnZShoaWQtPmRyaXZlcl9kYXRhLCByZXBvcnRfdHlwZSwgZGF0YSwgMSkpCi0JCWdvdG8gZXJyX2VpbzsKKwlyZXQgPSBoaWRwX3NlbmRfY3RybF9tZXNzYWdlKGhpZC0+ZHJpdmVyX2RhdGEsIHJlcG9ydF90eXBlLCBkYXRhLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKIAogCS8qIFdhaXQgZm9yIHRoZSByZXR1cm4gb2YgdGhlIHJlcG9ydC4gVGhlIHJldHVybmVkIHJlcG9ydAogCSAgIGdldHMgcHV0IGluIHNlc3Npb24tPnJlcG9ydF9yZXR1cm4uICAqLwpAQCAtMzY1LDExICszNjUsMTMgQEAKIAkJCTUqSFopOwogCQlpZiAocmVzID09IDApIHsKIAkJCS8qIHRpbWVvdXQgKi8KLQkJCWdvdG8gZXJyX2VpbzsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycjsKIAkJfQogCQlpZiAocmVzIDwgMCkgewogCQkJLyogc2lnbmFsICovCi0JCQlnb3RvIGVycl9yZXN0YXJ0c3lzOworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJZ290byBlcnI7CiAJCX0KIAl9CiAKQEAgLTM5MCwxNCArMzkyLDEwIEBACiAKIAlyZXR1cm4gbGVuOwogCi1lcnJfcmVzdGFydHN5czoKK2VycjoKIAljbGVhcl9iaXQoSElEUF9XQUlUSU5HX0ZPUl9SRVRVUk4sICZzZXNzaW9uLT5mbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5yZXBvcnRfbXV0ZXgpOwotCXJldHVybiAtRVJFU1RBUlRTWVM7Ci1lcnJfZWlvOgotCWNsZWFyX2JpdChISURQX1dBSVRJTkdfRk9SX1JFVFVSTiwgJnNlc3Npb24tPmZsYWdzKTsKLQltdXRleF91bmxvY2soJnNlc3Npb24tPnJlcG9ydF9tdXRleCk7Ci0JcmV0dXJuIC1FSU87CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBoaWRwX291dHB1dF9yYXdfcmVwb3J0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCwKQEAgLTQyMiwxMSArNDIwLDEwIEBACiAKIAkvKiBTZXQgdXAgb3VyIHdhaXQsIGFuZCBzZW5kIHRoZSByZXBvcnQgcmVxdWVzdCB0byB0aGUgZGV2aWNlLiAqLwogCXNldF9iaXQoSElEUF9XQUlUSU5HX0ZPUl9TRU5EX0FDSywgJnNlc3Npb24tPmZsYWdzKTsKLQlpZiAoaGlkcF9zZW5kX2N0cmxfbWVzc2FnZShoaWQtPmRyaXZlcl9kYXRhLCByZXBvcnRfdHlwZSwKLQkJCWRhdGEsIGNvdW50KSkgewotCQlyZXQgPSAtRU5PTUVNOworCXJldCA9IGhpZHBfc2VuZF9jdHJsX21lc3NhZ2UoaGlkLT5kcml2ZXJfZGF0YSwgcmVwb3J0X3R5cGUsIGRhdGEsCisJCQkJCQkJCQljb3VudCk7CisJaWYgKHJldCkKIAkJZ290byBlcnI7Ci0JfQogCiAJLyogV2FpdCBmb3IgdGhlIEFDSyBmcm9tIHRoZSBkZXZpY2UuICovCiAJd2hpbGUgKHRlc3RfYml0KEhJRFBfV0FJVElOR19GT1JfU0VORF9BQ0ssICZzZXNzaW9uLT5mbGFncykpIHsKQEAgLTQ5NiwxMCArNDkzLDkgQEAKIAljYXNlIEhJRFBfSFNIS19FUlJfSU5WQUxJRF9SRVBPUlRfSUQ6CiAJY2FzZSBISURQX0hTSEtfRVJSX1VOU1VQUE9SVEVEX1JFUVVFU1Q6CiAJY2FzZSBISURQX0hTSEtfRVJSX0lOVkFMSURfUEFSQU1FVEVSOgotCQlpZiAodGVzdF9iaXQoSElEUF9XQUlUSU5HX0ZPUl9SRVRVUk4sICZzZXNzaW9uLT5mbGFncykpIHsKLQkJCWNsZWFyX2JpdChISURQX1dBSVRJTkdfRk9SX1JFVFVSTiwgJnNlc3Npb24tPmZsYWdzKTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChISURQX1dBSVRJTkdfRk9SX1JFVFVSTiwgJnNlc3Npb24tPmZsYWdzKSkKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2Vzc2lvbi0+cmVwb3J0X3F1ZXVlKTsKLQkJfQorCiAJCS8qIEZJWE1FOiBDYWxsIGludG8gU0VUXyBHRVRfIGhhbmRsZXJzIGhlcmUgKi8KIAkJYnJlYWs7CiAKQEAgLTUyMCwxMCArNTE2LDggQEAKIAl9CiAKIAkvKiBXYWtlIHVwIHRoZSB3YWl0aW5nIHRocmVhZC4gKi8KLQlpZiAodGVzdF9iaXQoSElEUF9XQUlUSU5HX0ZPUl9TRU5EX0FDSywgJnNlc3Npb24tPmZsYWdzKSkgewotCQljbGVhcl9iaXQoSElEUF9XQUlUSU5HX0ZPUl9TRU5EX0FDSywgJnNlc3Npb24tPmZsYWdzKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhJRFBfV0FJVElOR19GT1JfU0VORF9BQ0ssICZzZXNzaW9uLT5mbGFncykpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2Vzc2lvbi0+cmVwb3J0X3F1ZXVlKTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIGhpZHBfcHJvY2Vzc19oaWRfY29udHJvbChzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uLApAQCAtNjYzLDcgKzY1NywyNCBAQAogCXJldHVybiBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaXYsIDEsIGxlbik7CiB9CiAKLXN0YXRpYyB2b2lkIGhpZHBfcHJvY2Vzc190cmFuc21pdChzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQorc3RhdGljIHZvaWQgaGlkcF9wcm9jZXNzX2ludHJfdHJhbnNtaXQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJQlRfREJHKCJzZXNzaW9uICVwIiwgc2Vzc2lvbik7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0KSkpIHsKKwkJaWYgKGhpZHBfc2VuZF9mcmFtZShzZXNzaW9uLT5pbnRyX3NvY2ssIHNrYi0+ZGF0YSwgc2tiLT5sZW4pIDwgMCkgeworCQkJc2tiX3F1ZXVlX2hlYWQoJnNlc3Npb24tPmludHJfdHJhbnNtaXQsIHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCWhpZHBfc2V0X3RpbWVyKHNlc3Npb24pOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhpZHBfcHJvY2Vzc19jdHJsX3RyYW5zbWl0KHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtNjc4LDE2ICs2ODksNiBAQAogCQloaWRwX3NldF90aW1lcihzZXNzaW9uKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJfQotCi0Jd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2Vzc2lvbi0+aW50cl90cmFuc21pdCkpKSB7Ci0JCWlmIChoaWRwX3NlbmRfZnJhbWUoc2Vzc2lvbi0+aW50cl9zb2NrLCBza2ItPmRhdGEsIHNrYi0+bGVuKSA8IDApIHsKLQkJCXNrYl9xdWV1ZV9oZWFkKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0LCBza2IpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQloaWRwX3NldF90aW1lcihzZXNzaW9uKTsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JfQogfQogCiBzdGF0aWMgaW50IGhpZHBfc2Vzc2lvbih2b2lkICphcmcpCkBAIC03MDAsNiArNzAxLDcgQEAKIAogCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOwogCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xNSk7CiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmY3RybF93YWl0LCBjdXJyZW50KTsKQEAgLTcxNCwxNCArNzE2LDYgQEAKIAkJCQlpbnRyX3NrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpCiAJCQlicmVhazsKIAotCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjdHJsX3NrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKLQkJCXNrYl9vcnBoYW4oc2tiKTsKLQkJCWlmICghc2tiX2xpbmVhcml6ZShza2IpKQotCQkJCWhpZHBfcmVjdl9jdHJsX2ZyYW1lKHNlc3Npb24sIHNrYik7Ci0JCQllbHNlCi0JCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCX0KLQogCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZpbnRyX3NrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKIAkJCXNrYl9vcnBoYW4oc2tiKTsKIAkJCWlmICghc2tiX2xpbmVhcml6ZShza2IpKQpAQCAtNzMwLDcgKzcyNCwxNyBAQAogCQkJCWtmcmVlX3NrYihza2IpOwogCQl9CiAKLQkJaGlkcF9wcm9jZXNzX3RyYW5zbWl0KHNlc3Npb24pOworCQloaWRwX3Byb2Nlc3NfaW50cl90cmFuc21pdChzZXNzaW9uKTsKKworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjdHJsX3NrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCXNrYl9vcnBoYW4oc2tiKTsKKwkJCWlmICghc2tiX2xpbmVhcml6ZShza2IpKQorCQkJCWhpZHBfcmVjdl9jdHJsX2ZyYW1lKHNlc3Npb24sIHNrYik7CisJCQllbHNlCisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKworCQloaWRwX3Byb2Nlc3NfY3RybF90cmFuc21pdChzZXNzaW9uKTsKIAogCQlzY2hlZHVsZSgpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwpAQCAtNzM5LDYgKzc0MywxMCBAQAogCXJlbW92ZV93YWl0X3F1ZXVlKHNrX3NsZWVwKGludHJfc2spLCAmaW50cl93YWl0KTsKIAlyZW1vdmVfd2FpdF9xdWV1ZShza19zbGVlcChjdHJsX3NrKSwgJmN0cmxfd2FpdCk7CiAKKwljbGVhcl9iaXQoSElEUF9XQUlUSU5HX0ZPUl9TRU5EX0FDSywgJnNlc3Npb24tPmZsYWdzKTsKKwljbGVhcl9iaXQoSElEUF9XQUlUSU5HX0ZPUl9SRVRVUk4sICZzZXNzaW9uLT5mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXNzaW9uLT5yZXBvcnRfcXVldWUpOworCiAJZG93bl93cml0ZSgmaGlkcF9zZXNzaW9uX3NlbSk7CiAKIAloaWRwX2RlbF90aW1lcihzZXNzaW9uKTsKQEAgLTc3MiwzNCArNzgwLDM3IEBACiAKIAlrZnJlZShzZXNzaW9uLT5yZF9kYXRhKTsKIAlrZnJlZShzZXNzaW9uKTsKKwltb2R1bGVfcHV0X2FuZF9leGl0KDApOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZSAqaGlkcF9nZXRfZGV2aWNlKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCitzdGF0aWMgc3RydWN0IGhjaV9jb25uICpoaWRwX2dldF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJYmRhZGRyX3QgKnNyYyA9ICZidF9zayhzZXNzaW9uLT5jdHJsX3NvY2stPnNrKS0+c3JjOwogCWJkYWRkcl90ICpkc3QgPSAmYnRfc2soc2Vzc2lvbi0+Y3RybF9zb2NrLT5zayktPmRzdDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSBOVUxMOworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKIAogCWhkZXYgPSBoY2lfZ2V0X3JvdXRlKGRzdCwgc3JjKTsKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBOVUxMOwogCi0Jc2Vzc2lvbi0+Y29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCBkc3QpOwotCWlmIChzZXNzaW9uLT5jb25uKQotCQlkZXZpY2UgPSAmc2Vzc2lvbi0+Y29ubi0+ZGV2OworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssIGRzdCk7CisJaWYgKGNvbm4pCisJCWhjaV9jb25uX2hvbGRfZGV2aWNlKGNvbm4pOworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCiAJaGNpX2Rldl9wdXQoaGRldik7CiAKLQlyZXR1cm4gZGV2aWNlOworCXJldHVybiBjb25uOwogfQogCiBzdGF0aWMgaW50IGhpZHBfc2V0dXBfaW5wdXQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwKIAkJCQlzdHJ1Y3QgaGlkcF9jb25uYWRkX3JlcSAqcmVxKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwotCWludCBlcnIsIGk7CisJaW50IGk7CiAKIAlpbnB1dCA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghaW5wdXQpCkBAIC04NDIsMTcgKzg1MywxMCBAQAogCQlpbnB1dC0+cmVsYml0WzBdIHw9IEJJVF9NQVNLKFJFTF9XSEVFTCk7CiAJfQogCi0JaW5wdXQtPmRldi5wYXJlbnQgPSBoaWRwX2dldF9kZXZpY2Uoc2Vzc2lvbik7CisJaW5wdXQtPmRldi5wYXJlbnQgPSAmc2Vzc2lvbi0+Y29ubi0+ZGV2OwogCiAJaW5wdXQtPmV2ZW50ID0gaGlkcF9pbnB1dF9ldmVudDsKIAotCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOwotCQlzZXNzaW9uLT5pbnB1dCA9IE5VTEw7Ci0JCXJldHVybiBlcnI7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk0OSw3ICs5NTMsNyBAQAogCXN0cm5jcHkoaGlkLT5waHlzLCBiYXRvc3RyKCZidF9zayhzZXNzaW9uLT5jdHJsX3NvY2stPnNrKS0+c3JjKSwgNjQpOwogCXN0cm5jcHkoaGlkLT51bmlxLCBiYXRvc3RyKCZidF9zayhzZXNzaW9uLT5jdHJsX3NvY2stPnNrKS0+ZHN0KSwgNjQpOwogCi0JaGlkLT5kZXYucGFyZW50ID0gaGlkcF9nZXRfZGV2aWNlKHNlc3Npb24pOworCWhpZC0+ZGV2LnBhcmVudCA9ICZzZXNzaW9uLT5jb25uLT5kZXY7CiAJaGlkLT5sbF9kcml2ZXIgPSAmaGlkcF9oaWRfZHJpdmVyOwogCiAJaGlkLT5oaWRfZ2V0X3Jhd19yZXBvcnQgPSBoaWRwX2dldF9yYXdfcmVwb3J0OwpAQCAtOTc2LDE4ICs5ODAsMjAgQEAKIAkJCWJhY21wKCZidF9zayhjdHJsX3NvY2stPnNrKS0+ZHN0LCAmYnRfc2soaW50cl9zb2NrLT5zayktPmRzdCkpCiAJCXJldHVybiAtRU5PVFVOSVE7CiAKLQlzZXNzaW9uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZHBfc2Vzc2lvbiksIEdGUF9LRVJORUwpOwotCWlmICghc2Vzc2lvbikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlCVF9EQkcoInJkX2RhdGEgJXAgcmRfc2l6ZSAlZCIsIHJlcS0+cmRfZGF0YSwgcmVxLT5yZF9zaXplKTsKIAogCWRvd25fd3JpdGUoJmhpZHBfc2Vzc2lvbl9zZW0pOwogCiAJcyA9IF9faGlkcF9nZXRfc2Vzc2lvbigmYnRfc2soY3RybF9zb2NrLT5zayktPmRzdCk7CiAJaWYgKHMgJiYgcy0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEKSB7Ci0JCWVyciA9IC1FRVhJU1Q7Ci0JCWdvdG8gZmFpbGVkOworCQl1cF93cml0ZSgmaGlkcF9zZXNzaW9uX3NlbSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCXNlc3Npb24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkcF9zZXNzaW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXNzaW9uKSB7CisJCXVwX3dyaXRlKCZoaWRwX3Nlc3Npb25fc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJYmFjcHkoJnNlc3Npb24tPmJkYWRkciwgJmJ0X3NrKGN0cmxfc29jay0+c2spLT5kc3QpOwpAQCAtMTAwMyw2ICsxMDA5LDEyIEBACiAJc2Vzc2lvbi0+aW50cl9zb2NrID0gaW50cl9zb2NrOwogCXNlc3Npb24tPnN0YXRlICAgICA9IEJUX0NPTk5FQ1RFRDsKIAorCXNlc3Npb24tPmNvbm4gPSBoaWRwX2dldF9jb25uZWN0aW9uKHNlc3Npb24pOworCWlmICghc2Vzc2lvbi0+Y29ubikgeworCQllcnIgPSAtRU5PVENPTk47CisJCWdvdG8gZmFpbGVkOworCX0KKwogCXNldHVwX3RpbWVyKCZzZXNzaW9uLT50aW1lciwgaGlkcF9pZGxlX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKXNlc3Npb24pOwogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCk7CkBAIC0xMDE1LDkgKzEwMjcsMTEgQEAKIAlzZXNzaW9uLT5mbGFncyAgID0gcmVxLT5mbGFncyAmICgxIDw8IEhJRFBfQkxVRVRPT1RIX1ZFTkRPUl9JRCk7CiAJc2Vzc2lvbi0+aWRsZV90byA9IHJlcS0+aWRsZV90bzsKIAorCV9faGlkcF9saW5rX3Nlc3Npb24oc2Vzc2lvbik7CisKIAlpZiAocmVxLT5yZF9zaXplID4gMCkgewogCQllcnIgPSBoaWRwX3NldHVwX2hpZChzZXNzaW9uLCByZXEpOwotCQlpZiAoZXJyICYmIGVyciAhPSAtRU5PREVWKQorCQlpZiAoZXJyKQogCQkJZ290byBwdXJnZTsKIAl9CiAKQEAgLTEwMjcsOCArMTA0MSw2IEBACiAJCQlnb3RvIHB1cmdlOwogCX0KIAotCV9faGlkcF9saW5rX3Nlc3Npb24oc2Vzc2lvbik7Ci0KIAloaWRwX3NldF90aW1lcihzZXNzaW9uKTsKIAogCWlmIChzZXNzaW9uLT5oaWQpIHsKQEAgLTEwNTQsNyArMTA2NiwxMSBAQAogCQkJIXNlc3Npb24tPndhaXRpbmdfZm9yX3N0YXJ0dXApOwogCX0KIAotCWVyciA9IGhpZF9hZGRfZGV2aWNlKHNlc3Npb24tPmhpZCk7CisJaWYgKHNlc3Npb24tPmhpZCkKKwkJZXJyID0gaGlkX2FkZF9kZXZpY2Uoc2Vzc2lvbi0+aGlkKTsKKwllbHNlCisJCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShzZXNzaW9uLT5pbnB1dCk7CisKIAlpZiAoZXJyIDwgMCkgewogCQlhdG9taWNfaW5jKCZzZXNzaW9uLT50ZXJtaW5hdGUpOwogCQl3YWtlX3VwX3Byb2Nlc3Moc2Vzc2lvbi0+dGFzayk7CkBAIC0xMDc3LDggKzEwOTMsNiBAQAogdW5saW5rOgogCWhpZHBfZGVsX3RpbWVyKHNlc3Npb24pOwogCi0JX19oaWRwX3VubGlua19zZXNzaW9uKHNlc3Npb24pOwotCiAJaWYgKHNlc3Npb24tPmlucHV0KSB7CiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNlc3Npb24tPmlucHV0KTsKIAkJc2Vzc2lvbi0+aW5wdXQgPSBOVUxMOwpAQCAtMTA5Myw2ICsxMTA3LDggQEAKIAlzZXNzaW9uLT5yZF9kYXRhID0gTlVMTDsKIAogcHVyZ2U6CisJX19oaWRwX3VubGlua19zZXNzaW9uKHNlc3Npb24pOworCiAJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KTsKIAlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmludHJfdHJhbnNtaXQpOwogCkBAIC0xMTM0LDE5ICsxMTUwLDE2IEBACiAKIGludCBoaWRwX2dldF9jb25ubGlzdChzdHJ1Y3QgaGlkcF9jb25ubGlzdF9yZXEgKnJlcSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb247CiAJaW50IGVyciA9IDAsIG4gPSAwOwogCiAJQlRfREJHKCIiKTsKIAogCWRvd25fcmVhZCgmaGlkcF9zZXNzaW9uX3NlbSk7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZoaWRwX3Nlc3Npb25fbGlzdCkgewotCQlzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2Vzc2lvbiwgJmhpZHBfc2Vzc2lvbl9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBoaWRwX2Nvbm5pbmZvIGNpOwogCi0JCXNlc3Npb24gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoaWRwX3Nlc3Npb24sIGxpc3QpOwotCiAJCV9faGlkcF9jb3B5X3Nlc3Npb24oc2Vzc2lvbiwgJmNpKTsKIAogCQlpZiAoY29weV90b191c2VyKHJlcS0+Y2ksICZjaSwgc2l6ZW9mKGNpKSkpIHsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKaW5kZXggNWVhOTRhMS4uZThhNjgzNyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKQEAgLTU3LDkgKzU3LDEwIEBACiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9zbXAuaD4KIAogaW50IGRpc2FibGVfZXJ0bTsKK2ludCBlbmFibGVfaHM7CiAKIHN0YXRpYyB1MzIgbDJjYXBfZmVhdF9tYXNrID0gTDJDQVBfRkVBVF9GSVhFRF9DSEFOOwotc3RhdGljIHU4IGwyY2FwX2ZpeGVkX2NoYW5bOF0gPSB7IDB4MDIsIH07CitzdGF0aWMgdTggbDJjYXBfZml4ZWRfY2hhbls4XSA9IHsgTDJDQVBfRkNfTDJDQVAsIH07CiAKIHN0YXRpYyBMSVNUX0hFQUQoY2hhbl9saXN0KTsKIHN0YXRpYyBERUZJTkVfUldMT0NLKGNoYW5fbGlzdF9sb2NrKTsKQEAgLTIxOSw3ICsyMjAsNyBAQAogCiBzdGF0aWMgdm9pZCBsMmNhcF9zZXRfdGltZXIoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgbG9uZyB0aW1lb3V0KQogewotCUJUX0RCRygiY2hhbiAlcCBzdGF0ZSAlZCB0aW1lb3V0ICVsZCIsIGNoYW4tPnNrLCBjaGFuLT5zdGF0ZSwgdGltZW91dCk7CisJQlRfREJHKCJjaGFuICVwIHN0YXRlICVkIHRpbWVvdXQgJWxkIiwgY2hhbiwgY2hhbi0+c3RhdGUsIHRpbWVvdXQpOwogCiAJaWYgKCFtb2RfdGltZXIodGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKSkKIAkJY2hhbl9ob2xkKGNoYW4pOwpAQCAtMjkzLDYgKzI5NCw4IEBACiAKIAlhdG9taWNfc2V0KCZjaGFuLT5yZWZjbnQsIDEpOwogCisJQlRfREJHKCJzayAlcCBjaGFuICVwIiwgc2ssIGNoYW4pOworCiAJcmV0dXJuIGNoYW47CiB9CiAKQEAgLTMxMCw3ICszMTMsNyBAQAogCUJUX0RCRygiY29ubiAlcCwgcHNtIDB4JTIuMngsIGRjaWQgMHglNC40eCIsIGNvbm4sCiAJCQljaGFuLT5wc20sIGNoYW4tPmRjaWQpOwogCi0JY29ubi0+ZGlzY19yZWFzb24gPSAweDEzOworCWNvbm4tPmRpc2NfcmVhc29uID0gSENJX0VSUk9SX1JFTU9URV9VU0VSX1RFUk07CiAKIAljaGFuLT5jb25uID0gY29ubjsKIApAQCAtMzM3LDYgKzM0MCwxMyBAQAogCQljaGFuLT5vbXR1ID0gTDJDQVBfREVGQVVMVF9NVFU7CiAJfQogCisJY2hhbi0+bG9jYWxfaWQJCT0gTDJDQVBfQkVTVEVGRk9SVF9JRDsKKwljaGFuLT5sb2NhbF9zdHlwZQk9IEwyQ0FQX1NFUlZfQkVTVEVGRk9SVDsKKwljaGFuLT5sb2NhbF9tc2R1CT0gTDJDQVBfREVGQVVMVF9NQVhfU0RVX1NJWkU7CisJY2hhbi0+bG9jYWxfc2R1X2l0aW1lCT0gTDJDQVBfREVGQVVMVF9TRFVfSVRJTUU7CisJY2hhbi0+bG9jYWxfYWNjX2xhdAk9IEwyQ0FQX0RFRkFVTFRfQUNDX0xBVDsKKwljaGFuLT5sb2NhbF9mbHVzaF90bwk9IEwyQ0FQX0RFRkFVTFRfRkxVU0hfVE87CisKIAljaGFuX2hvbGQoY2hhbik7CiAKIAlsaXN0X2FkZCgmY2hhbi0+bGlzdCwgJmNvbm4tPmNoYW5fbCk7CkBAIC01NTYsMzQgKzU2Niw1OCBAQAogCQlmbGFncyA9IEFDTF9TVEFSVDsKIAogCWJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSA9IEJUX1BPV0VSX0ZPUkNFX0FDVElWRV9PTjsKKwlza2ItPnByaW9yaXR5ID0gSENJX1BSSU9fTUFYOwogCi0JaGNpX3NlbmRfYWNsKGNvbm4tPmhjb24sIHNrYiwgZmxhZ3MpOworCWhjaV9zZW5kX2FjbChjb25uLT5oY2hhbiwgc2tiLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9zZW5kX3NmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IGNvbnRyb2wpCitzdGF0aWMgdm9pZCBsMmNhcF9kb19zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfY29ubiAqaGNvbiA9IGNoYW4tPmNvbm4tPmhjb247CisJdTE2IGZsYWdzOworCisJQlRfREJHKCJjaGFuICVwLCBza2IgJXAgbGVuICVkIHByaW9yaXR5ICV1IiwgY2hhbiwgc2tiLCBza2ItPmxlbiwKKwkJCQkJCQlza2ItPnByaW9yaXR5KTsKKworCWlmICghdGVzdF9iaXQoRkxBR19GTFVTSEFCTEUsICZjaGFuLT5mbGFncykgJiYKKwkJCQkJbG1wX25vX2ZsdXNoX2NhcGFibGUoaGNvbi0+aGRldikpCisJCWZsYWdzID0gQUNMX1NUQVJUX05PX0ZMVVNIOworCWVsc2UKKwkJZmxhZ3MgPSBBQ0xfU1RBUlQ7CisKKwlidF9jYihza2IpLT5mb3JjZV9hY3RpdmUgPSB0ZXN0X2JpdChGTEFHX0ZPUkNFX0FDVElWRSwgJmNoYW4tPmZsYWdzKTsKKwloY2lfc2VuZF9hY2woY2hhbi0+Y29ubi0+aGNoYW4sIHNrYiwgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfc2VuZF9zZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUzMiBjb250cm9sKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGwyY2FwX2hkciAqbGg7CiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBjaGFuLT5jb25uOwotCWludCBjb3VudCwgaGxlbiA9IEwyQ0FQX0hEUl9TSVpFICsgMjsKLQl1OCBmbGFnczsKKwlpbnQgY291bnQsIGhsZW47CiAKIAlpZiAoY2hhbi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKQogCQlyZXR1cm47CiAKLQlpZiAoY2hhbi0+ZmNzID09IEwyQ0FQX0ZDU19DUkMxNikKLQkJaGxlbiArPSAyOworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlobGVuID0gTDJDQVBfRVhUX0hEUl9TSVpFOworCWVsc2UKKwkJaGxlbiA9IEwyQ0FQX0VOSF9IRFJfU0laRTsKIAotCUJUX0RCRygiY2hhbiAlcCwgY29udHJvbCAweCUyLjJ4IiwgY2hhbiwgY29udHJvbCk7CisJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpCisJCWhsZW4gKz0gTDJDQVBfRkNTX1NJWkU7CisKKwlCVF9EQkcoImNoYW4gJXAsIGNvbnRyb2wgMHglOC44eCIsIGNoYW4sIGNvbnRyb2wpOwogCiAJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbm4tPm10dSwgaGxlbik7Ci0JY29udHJvbCB8PSBMMkNBUF9DVFJMX0ZSQU1FX1RZUEU7CisKKwljb250cm9sIHw9IF9fc2V0X3NmcmFtZShjaGFuKTsKIAogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9TRU5EX0ZCSVQsICZjaGFuLT5jb25uX3N0YXRlKSkKLQkJY29udHJvbCB8PSBMMkNBUF9DVFJMX0ZJTkFMOworCQljb250cm9sIHw9IF9fc2V0X2N0cmxfZmluYWwoY2hhbik7CiAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fU0VORF9QQklULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCi0JCWNvbnRyb2wgfD0gTDJDQVBfQ1RSTF9QT0xMOworCQljb250cm9sIHw9IF9fc2V0X2N0cmxfcG9sbChjaGFuKTsKIAogCXNrYiA9IGJ0X3NrYl9hbGxvYyhjb3VudCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFza2IpCkBAIC01OTIsMzIgKzYyNiwyNyBAQAogCWxoID0gKHN0cnVjdCBsMmNhcF9oZHIgKikgc2tiX3B1dChza2IsIEwyQ0FQX0hEUl9TSVpFKTsKIAlsaC0+bGVuID0gY3B1X3RvX2xlMTYoaGxlbiAtIEwyQ0FQX0hEUl9TSVpFKTsKIAlsaC0+Y2lkID0gY3B1X3RvX2xlMTYoY2hhbi0+ZGNpZCk7Ci0JcHV0X3VuYWxpZ25lZF9sZTE2KGNvbnRyb2wsIHNrYl9wdXQoc2tiLCAyKSk7CisKKwlfX3B1dF9jb250cm9sKGNoYW4sIGNvbnRyb2wsIHNrYl9wdXQoc2tiLCBfX2N0cmxfc2l6ZShjaGFuKSkpOwogCiAJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpIHsKLQkJdTE2IGZjcyA9IGNyYzE2KDAsICh1OCAqKWxoLCBjb3VudCAtIDIpOwotCQlwdXRfdW5hbGlnbmVkX2xlMTYoZmNzLCBza2JfcHV0KHNrYiwgMikpOworCQl1MTYgZmNzID0gY3JjMTYoMCwgKHU4ICopbGgsIGNvdW50IC0gTDJDQVBfRkNTX1NJWkUpOworCQlwdXRfdW5hbGlnbmVkX2xlMTYoZmNzLCBza2JfcHV0KHNrYiwgTDJDQVBfRkNTX1NJWkUpKTsKIAl9CiAKLQlpZiAobG1wX25vX2ZsdXNoX2NhcGFibGUoY29ubi0+aGNvbi0+aGRldikpCi0JCWZsYWdzID0gQUNMX1NUQVJUX05PX0ZMVVNIOwotCWVsc2UKLQkJZmxhZ3MgPSBBQ0xfU1RBUlQ7Ci0KLQlidF9jYihza2IpLT5mb3JjZV9hY3RpdmUgPSBjaGFuLT5mb3JjZV9hY3RpdmU7Ci0KLQloY2lfc2VuZF9hY2woY2hhbi0+Y29ubi0+aGNvbiwgc2tiLCBmbGFncyk7CisJc2tiLT5wcmlvcml0eSA9IEhDSV9QUklPX01BWDsKKwlsMmNhcF9kb19zZW5kKGNoYW4sIHNrYik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9zZW5kX3JyX29yX3JucihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IGNvbnRyb2wpCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfc2VuZF9ycl9vcl9ybnIoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUzMiBjb250cm9sKQogewogCWlmICh0ZXN0X2JpdChDT05OX0xPQ0FMX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKSkgewotCQljb250cm9sIHw9IEwyQ0FQX1NVUEVSX1JDVl9OT1RfUkVBRFk7CisJCWNvbnRyb2wgfD0gX19zZXRfY3RybF9zdXBlcihjaGFuLCBMMkNBUF9TVVBFUl9STlIpOwogCQlzZXRfYml0KENPTk5fUk5SX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKTsKIAl9IGVsc2UKLQkJY29udHJvbCB8PSBMMkNBUF9TVVBFUl9SQ1ZfUkVBRFk7CisJCWNvbnRyb2wgfD0gX19zZXRfY3RybF9zdXBlcihjaGFuLCBMMkNBUF9TVVBFUl9SUik7CiAKLQljb250cm9sIHw9IGNoYW4tPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7CisJY29udHJvbCB8PSBfX3NldF9yZXFzZXEoY2hhbiwgY2hhbi0+YnVmZmVyX3NlcSk7CiAKIAlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIH0KQEAgLTk0Nyw3ICs5NzYsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmNvbm4tPmNoYW5fbCwgbGlzdCkgewogCQlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKIAotCQlpZiAoY2hhbi0+Zm9yY2VfcmVsaWFibGUpCisJCWlmICh0ZXN0X2JpdChGTEFHX0ZPUkNFX1JFTElBQkxFLCAmY2hhbi0+ZmxhZ3MpKQogCQkJc2stPnNrX2VyciA9IGVycjsKIAl9CiAKQEAgLTk4Niw2ICsxMDE1LDggQEAKIAkJY2hhbi0+b3BzLT5jbG9zZShjaGFuLT5kYXRhKTsKIAl9CiAKKwloY2lfY2hhbl9kZWwoY29ubi0+aGNoYW4pOworCiAJaWYgKGNvbm4tPmluZm9fc3RhdGUgJiBMMkNBUF9JTkZPX0ZFQVRfTUFTS19SRVFfU0VOVCkKIAkJZGVsX3RpbWVyX3N5bmMoJmNvbm4tPmluZm9fdGltZXIpOwogCkBAIC0xMDA4LDE4ICsxMDM5LDI2IEBACiBzdGF0aWMgc3RydWN0IGwyY2FwX2Nvbm4gKmwyY2FwX2Nvbm5fYWRkKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzKQogewogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gaGNvbi0+bDJjYXBfZGF0YTsKKwlzdHJ1Y3QgaGNpX2NoYW4gKmhjaGFuOwogCiAJaWYgKGNvbm4gfHwgc3RhdHVzKQogCQlyZXR1cm4gY29ubjsKIAotCWNvbm4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbDJjYXBfY29ubiksIEdGUF9BVE9NSUMpOwotCWlmICghY29ubikKKwloY2hhbiA9IGhjaV9jaGFuX2NyZWF0ZShoY29uKTsKKwlpZiAoIWhjaGFuKQogCQlyZXR1cm4gTlVMTDsKIAorCWNvbm4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbDJjYXBfY29ubiksIEdGUF9BVE9NSUMpOworCWlmICghY29ubikgeworCQloY2lfY2hhbl9kZWwoaGNoYW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAloY29uLT5sMmNhcF9kYXRhID0gY29ubjsKIAljb25uLT5oY29uID0gaGNvbjsKKwljb25uLT5oY2hhbiA9IGhjaGFuOwogCi0JQlRfREJHKCJoY29uICVwIGNvbm4gJXAiLCBoY29uLCBjb25uKTsKKwlCVF9EQkcoImhjb24gJXAgY29ubiAlcCBoY2hhbiAlcCIsIGhjb24sIGNvbm4sIGhjaGFuKTsKIAogCWlmIChoY29uLT5oZGV2LT5sZV9tdHUgJiYgaGNvbi0+dHlwZSA9PSBMRV9MSU5LKQogCQljb25uLT5tdHUgPSBoY29uLT5oZGV2LT5sZV9tdHU7CkBAIC0xMDQzLDcgKzEwODIsNyBAQAogCQlzZXR1cF90aW1lcigmY29ubi0+aW5mb190aW1lciwgbDJjYXBfaW5mb190aW1lb3V0LAogCQkJCQkJKHVuc2lnbmVkIGxvbmcpIGNvbm4pOwogCi0JY29ubi0+ZGlzY19yZWFzb24gPSAweDEzOworCWNvbm4tPmRpc2NfcmVhc29uID0gSENJX0VSUk9SX1JFTU9URV9VU0VSX1RFUk07CiAKIAlyZXR1cm4gY29ubjsKIH0KQEAgLTEyNDUsNDcgKzEyODQsMzUgQEAKIAkJX19jbGVhcl9yZXRyYW5zX3RpbWVyKGNoYW4pOwogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9kb19zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBoY2lfY29ubiAqaGNvbiA9IGNoYW4tPmNvbm4tPmhjb247Ci0JdTE2IGZsYWdzOwotCi0JQlRfREJHKCJjaGFuICVwLCBza2IgJXAgbGVuICVkIiwgY2hhbiwgc2tiLCBza2ItPmxlbik7Ci0KLQlpZiAoIWNoYW4tPmZsdXNoYWJsZSAmJiBsbXBfbm9fZmx1c2hfY2FwYWJsZShoY29uLT5oZGV2KSkKLQkJZmxhZ3MgPSBBQ0xfU1RBUlRfTk9fRkxVU0g7Ci0JZWxzZQotCQlmbGFncyA9IEFDTF9TVEFSVDsKLQotCWJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSA9IGNoYW4tPmZvcmNlX2FjdGl2ZTsKLQloY2lfc2VuZF9hY2woaGNvbiwgc2tiLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyB2b2lkIGwyY2FwX3N0cmVhbWluZ19zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTE2IGNvbnRyb2wsIGZjczsKKwl1MzIgY29udHJvbDsKKwl1MTYgZmNzOwogCiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2hhbi0+dHhfcSkpKSB7Ci0JCWNvbnRyb2wgPSBnZXRfdW5hbGlnbmVkX2xlMTYoc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOwotCQljb250cm9sIHw9IGNoYW4tPm5leHRfdHhfc2VxIDw8IEwyQ0FQX0NUUkxfVFhTRVFfU0hJRlQ7Ci0JCXB1dF91bmFsaWduZWRfbGUxNihjb250cm9sLCBza2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7CisJCWNvbnRyb2wgPSBfX2dldF9jb250cm9sKGNoYW4sIHNrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKKwkJY29udHJvbCB8PSBfX3NldF90eHNlcShjaGFuLCBjaGFuLT5uZXh0X3R4X3NlcSk7CisJCV9fcHV0X2NvbnRyb2woY2hhbiwgY29udHJvbCwgc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOwogCiAJCWlmIChjaGFuLT5mY3MgPT0gTDJDQVBfRkNTX0NSQzE2KSB7Ci0JCQlmY3MgPSBjcmMxNigwLCAodTggKilza2ItPmRhdGEsIHNrYi0+bGVuIC0gMik7Ci0JCQlwdXRfdW5hbGlnbmVkX2xlMTYoZmNzLCBza2ItPmRhdGEgKyBza2ItPmxlbiAtIDIpOworCQkJZmNzID0gY3JjMTYoMCwgKHU4ICopc2tiLT5kYXRhLAorCQkJCQkJc2tiLT5sZW4gLSBMMkNBUF9GQ1NfU0laRSk7CisJCQlwdXRfdW5hbGlnbmVkX2xlMTYoZmNzLAorCQkJCQlza2ItPmRhdGEgKyBza2ItPmxlbiAtIEwyQ0FQX0ZDU19TSVpFKTsKIAkJfQogCiAJCWwyY2FwX2RvX3NlbmQoY2hhbiwgc2tiKTsKIAotCQljaGFuLT5uZXh0X3R4X3NlcSA9IChjaGFuLT5uZXh0X3R4X3NlcSArIDEpICUgNjQ7CisJCWNoYW4tPm5leHRfdHhfc2VxID0gX19uZXh0X3NlcShjaGFuLCBjaGFuLT5uZXh0X3R4X3NlcSk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9yZXRyYW5zbWl0X29uZV9mcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTggdHhfc2VxKQorc3RhdGljIHZvaWQgbDJjYXBfcmV0cmFuc21pdF9vbmVfZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiB0eF9zZXEpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnR4X3NrYjsKLQl1MTYgY29udHJvbCwgZmNzOworCXUxNiBmY3M7CisJdTMyIGNvbnRyb2w7CiAKIAlza2IgPSBza2JfcGVlaygmY2hhbi0+dHhfcSk7CiAJaWYgKCFza2IpCkBAIC0xMzA4LDIwICsxMzM1LDIzIEBACiAKIAl0eF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAlidF9jYihza2IpLT5yZXRyaWVzKys7Ci0JY29udHJvbCA9IGdldF91bmFsaWduZWRfbGUxNih0eF9za2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7Ci0JY29udHJvbCAmPSBMMkNBUF9DVFJMX1NBUjsKKworCWNvbnRyb2wgPSBfX2dldF9jb250cm9sKGNoYW4sIHR4X3NrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKKwljb250cm9sICY9IF9fZ2V0X3Nhcl9tYXNrKGNoYW4pOwogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1NFTkRfRkJJVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQotCQljb250cm9sIHw9IEwyQ0FQX0NUUkxfRklOQUw7CisJCWNvbnRyb2wgfD0gX19zZXRfY3RybF9maW5hbChjaGFuKTsKIAotCWNvbnRyb2wgfD0gKGNoYW4tPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQpCi0JCQl8ICh0eF9zZXEgPDwgTDJDQVBfQ1RSTF9UWFNFUV9TSElGVCk7CisJY29udHJvbCB8PSBfX3NldF9yZXFzZXEoY2hhbiwgY2hhbi0+YnVmZmVyX3NlcSk7CisJY29udHJvbCB8PSBfX3NldF90eHNlcShjaGFuLCB0eF9zZXEpOwogCi0JcHV0X3VuYWxpZ25lZF9sZTE2KGNvbnRyb2wsIHR4X3NrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKKwlfX3B1dF9jb250cm9sKGNoYW4sIGNvbnRyb2wsIHR4X3NrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKIAogCWlmIChjaGFuLT5mY3MgPT0gTDJDQVBfRkNTX0NSQzE2KSB7Ci0JCWZjcyA9IGNyYzE2KDAsICh1OCAqKXR4X3NrYi0+ZGF0YSwgdHhfc2tiLT5sZW4gLSAyKTsKLQkJcHV0X3VuYWxpZ25lZF9sZTE2KGZjcywgdHhfc2tiLT5kYXRhICsgdHhfc2tiLT5sZW4gLSAyKTsKKwkJZmNzID0gY3JjMTYoMCwgKHU4ICopdHhfc2tiLT5kYXRhLAorCQkJCQkJdHhfc2tiLT5sZW4gLSBMMkNBUF9GQ1NfU0laRSk7CisJCXB1dF91bmFsaWduZWRfbGUxNihmY3MsCisJCQkJdHhfc2tiLT5kYXRhICsgdHhfc2tiLT5sZW4gLSBMMkNBUF9GQ1NfU0laRSk7CiAJfQogCiAJbDJjYXBfZG9fc2VuZChjaGFuLCB0eF9za2IpOwpAQCAtMTMzMCw3ICsxMzYwLDggQEAKIHN0YXRpYyBpbnQgbDJjYXBfZXJ0bV9zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXN0cnVjdCBza19idWZmICpza2IsICp0eF9za2I7Ci0JdTE2IGNvbnRyb2wsIGZjczsKKwl1MTYgZmNzOworCXUzMiBjb250cm9sOwogCWludCBuc2VudCA9IDA7CiAKIAlpZiAoY2hhbi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKQpAQCAtMTM0OCwyMCArMTM3OSwyMiBAQAogCiAJCWJ0X2NiKHNrYiktPnJldHJpZXMrKzsKIAotCQljb250cm9sID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHR4X3NrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKLQkJY29udHJvbCAmPSBMMkNBUF9DVFJMX1NBUjsKKwkJY29udHJvbCA9IF9fZ2V0X2NvbnRyb2woY2hhbiwgdHhfc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOworCQljb250cm9sICY9IF9fZ2V0X3Nhcl9tYXNrKGNoYW4pOwogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9TRU5EX0ZCSVQsICZjaGFuLT5jb25uX3N0YXRlKSkKLQkJCWNvbnRyb2wgfD0gTDJDQVBfQ1RSTF9GSU5BTDsKKwkJCWNvbnRyb2wgfD0gX19zZXRfY3RybF9maW5hbChjaGFuKTsKIAotCQljb250cm9sIHw9IChjaGFuLT5idWZmZXJfc2VxIDw8IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUKQotCQkJCXwgKGNoYW4tPm5leHRfdHhfc2VxIDw8IEwyQ0FQX0NUUkxfVFhTRVFfU0hJRlQpOwotCQlwdXRfdW5hbGlnbmVkX2xlMTYoY29udHJvbCwgdHhfc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOworCQljb250cm9sIHw9IF9fc2V0X3JlcXNlcShjaGFuLCBjaGFuLT5idWZmZXJfc2VxKTsKKwkJY29udHJvbCB8PSBfX3NldF90eHNlcShjaGFuLCBjaGFuLT5uZXh0X3R4X3NlcSk7CiAKKwkJX19wdXRfY29udHJvbChjaGFuLCBjb250cm9sLCB0eF9za2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7CiAKIAkJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpIHsKLQkJCWZjcyA9IGNyYzE2KDAsICh1OCAqKXNrYi0+ZGF0YSwgdHhfc2tiLT5sZW4gLSAyKTsKLQkJCXB1dF91bmFsaWduZWRfbGUxNihmY3MsIHNrYi0+ZGF0YSArIHR4X3NrYi0+bGVuIC0gMik7CisJCQlmY3MgPSBjcmMxNigwLCAodTggKilza2ItPmRhdGEsCisJCQkJCQl0eF9za2ItPmxlbiAtIEwyQ0FQX0ZDU19TSVpFKTsKKwkJCXB1dF91bmFsaWduZWRfbGUxNihmY3MsIHNrYi0+ZGF0YSArCisJCQkJCQl0eF9za2ItPmxlbiAtIEwyQ0FQX0ZDU19TSVpFKTsKIAkJfQogCiAJCWwyY2FwX2RvX3NlbmQoY2hhbiwgdHhfc2tiKTsKQEAgLTEzNjksNyArMTQwMiw4IEBACiAJCV9fc2V0X3JldHJhbnNfdGltZXIoY2hhbik7CiAKIAkJYnRfY2Ioc2tiKS0+dHhfc2VxID0gY2hhbi0+bmV4dF90eF9zZXE7Ci0JCWNoYW4tPm5leHRfdHhfc2VxID0gKGNoYW4tPm5leHRfdHhfc2VxICsgMSkgJSA2NDsKKworCQljaGFuLT5uZXh0X3R4X3NlcSA9IF9fbmV4dF9zZXEoY2hhbiwgY2hhbi0+bmV4dF90eF9zZXEpOwogCiAJCWlmIChidF9jYihza2IpLT5yZXRyaWVzID09IDEpCiAJCQljaGFuLT51bmFja2VkX2ZyYW1lcysrOwpAQCAtMTQwMSwxMiArMTQzNSwxMiBAQAogCiBzdGF0aWMgdm9pZCBsMmNhcF9zZW5kX2FjayhzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKIHsKLQl1MTYgY29udHJvbCA9IDA7CisJdTMyIGNvbnRyb2wgPSAwOwogCi0JY29udHJvbCB8PSBjaGFuLT5idWZmZXJfc2VxIDw8IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUOworCWNvbnRyb2wgfD0gX19zZXRfcmVxc2VxKGNoYW4sIGNoYW4tPmJ1ZmZlcl9zZXEpOwogCiAJaWYgKHRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7Ci0JCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX05PVF9SRUFEWTsKKwkJY29udHJvbCB8PSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1JOUik7CiAJCXNldF9iaXQoQ09OTl9STlJfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCQlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIAkJcmV0dXJuOwpAQCAtMTQxNSwyMCArMTQ0OSwyMCBAQAogCWlmIChsMmNhcF9lcnRtX3NlbmQoY2hhbikgPiAwKQogCQlyZXR1cm47CiAKLQljb250cm9sIHw9IEwyQ0FQX1NVUEVSX1JDVl9SRUFEWTsKKwljb250cm9sIHw9IF9fc2V0X2N0cmxfc3VwZXIoY2hhbiwgTDJDQVBfU1VQRVJfUlIpOwogCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpOwogfQogCiBzdGF0aWMgdm9pZCBsMmNhcF9zZW5kX3NyZWp0YWlsKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXN0cnVjdCBzcmVqX2xpc3QgKnRhaWw7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAKLQljb250cm9sID0gTDJDQVBfU1VQRVJfU0VMRUNUX1JFSkVDVDsKLQljb250cm9sIHw9IEwyQ0FQX0NUUkxfRklOQUw7CisJY29udHJvbCA9IF9fc2V0X2N0cmxfc3VwZXIoY2hhbiwgTDJDQVBfU1VQRVJfU1JFSik7CisJY29udHJvbCB8PSBfX3NldF9jdHJsX2ZpbmFsKGNoYW4pOwogCiAJdGFpbCA9IGxpc3RfZW50cnkoKCZjaGFuLT5zcmVqX2wpLT5wcmV2LCBzdHJ1Y3Qgc3Jlal9saXN0LCBsaXN0KTsKLQljb250cm9sIHw9IHRhaWwtPnR4X3NlcSA8PCBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVDsKKwljb250cm9sIHw9IF9fc2V0X3JlcXNlcShjaGFuLCB0YWlsLT50eF9zZXEpOwogCiAJbDJjYXBfc2VuZF9zZnJhbWUoY2hhbiwgY29udHJvbCk7CiB9CkBAIC0xNDU2LDYgKzE0OTAsOCBAQAogCQlpZiAobWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KCpmcmFnLCBjb3VudCksIG1zZy0+bXNnX2lvdiwgY291bnQpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKKwkJKCpmcmFnKS0+cHJpb3JpdHkgPSBza2ItPnByaW9yaXR5OworCiAJCXNlbnQgKz0gY291bnQ7CiAJCWxlbiAgLT0gY291bnQ7CiAKQEAgLTE0NjUsMTUgKzE1MDEsMTcgQEAKIAlyZXR1cm4gc2VudDsKIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICpsMmNhcF9jcmVhdGVfY29ubmxlc3NfcGR1KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmwyY2FwX2NyZWF0ZV9jb25ubGVzc19wZHUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sCisJCQkJCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCQkJCQl1MzIgcHJpb3JpdHkpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gY2hhbi0+c2s7CiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBjaGFuLT5jb25uOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IGVyciwgY291bnQsIGhsZW4gPSBMMkNBUF9IRFJfU0laRSArIDI7CisJaW50IGVyciwgY291bnQsIGhsZW4gPSBMMkNBUF9IRFJfU0laRSArIEwyQ0FQX1BTTUxFTl9TSVpFOwogCXN0cnVjdCBsMmNhcF9oZHIgKmxoOwogCi0JQlRfREJHKCJzayAlcCBsZW4gJWQiLCBzaywgKGludClsZW4pOworCUJUX0RCRygic2sgJXAgbGVuICVkIHByaW9yaXR5ICV1Iiwgc2ssIChpbnQpbGVuLCBwcmlvcml0eSk7CiAKIAljb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgKGNvbm4tPm10dSAtIGhsZW4pLCBsZW4pOwogCXNrYiA9IGJ0X3NrYl9zZW5kX2FsbG9jKHNrLCBjb3VudCArIGhsZW4sCkBAIC0xNDgxLDYgKzE1MTksOCBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCisJc2tiLT5wcmlvcml0eSA9IHByaW9yaXR5OworCiAJLyogQ3JlYXRlIEwyQ0FQIGhlYWRlciAqLwogCWxoID0gKHN0cnVjdCBsMmNhcF9oZHIgKikgc2tiX3B1dChza2IsIEwyQ0FQX0hEUl9TSVpFKTsKIAlsaC0+Y2lkID0gY3B1X3RvX2xlMTYoY2hhbi0+ZGNpZCk7CkBAIC0xNDk1LDcgKzE1MzUsOSBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbDJjYXBfY3JlYXRlX2Jhc2ljX3BkdShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIHN0cnVjdCBza19idWZmICpsMmNhcF9jcmVhdGVfYmFzaWNfcGR1KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLAorCQkJCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAorCQkJCQkJdTMyIHByaW9yaXR5KQogewogCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tPnNrOwogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gY2hhbi0+Y29ubjsKQEAgLTE1MTEsNiArMTU1Myw4IEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAKKwlza2ItPnByaW9yaXR5ID0gcHJpb3JpdHk7CisKIAkvKiBDcmVhdGUgTDJDQVAgaGVhZGVyICovCiAJbGggPSAoc3RydWN0IGwyY2FwX2hkciAqKSBza2JfcHV0KHNrYiwgTDJDQVBfSERSX1NJWkUpOwogCWxoLT5jaWQgPSBjcHVfdG9fbGUxNihjaGFuLT5kY2lkKTsKQEAgLTE1MjYsMTIgKzE1NzAsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBza19idWZmICpsMmNhcF9jcmVhdGVfaWZyYW1lX3BkdShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwKIAkJCQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKLQkJCQkJCXUxNiBjb250cm9sLCB1MTYgc2R1bGVuKQorCQkJCQkJdTMyIGNvbnRyb2wsIHUxNiBzZHVsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gY2hhbi0+c2s7CiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBjaGFuLT5jb25uOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IGVyciwgY291bnQsIGhsZW4gPSBMMkNBUF9IRFJfU0laRSArIDI7CisJaW50IGVyciwgY291bnQsIGhsZW47CiAJc3RydWN0IGwyY2FwX2hkciAqbGg7CiAKIAlCVF9EQkcoInNrICVwIGxlbiAlZCIsIHNrLCAoaW50KWxlbik7CkBAIC0xNTM5LDExICsxNTgzLDE2IEBACiAJaWYgKCFjb25uKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PVENPTk4pOwogCisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCWhsZW4gPSBMMkNBUF9FWFRfSERSX1NJWkU7CisJZWxzZQorCQlobGVuID0gTDJDQVBfRU5IX0hEUl9TSVpFOworCiAJaWYgKHNkdWxlbikKLQkJaGxlbiArPSAyOworCQlobGVuICs9IEwyQ0FQX1NEVUxFTl9TSVpFOwogCiAJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpCi0JCWhsZW4gKz0gMjsKKwkJaGxlbiArPSBMMkNBUF9GQ1NfU0laRTsKIAogCWNvdW50ID0gbWluX3QodW5zaWduZWQgaW50LCAoY29ubi0+bXR1IC0gaGxlbiksIGxlbik7CiAJc2tiID0gYnRfc2tiX3NlbmRfYWxsb2Moc2ssIGNvdW50ICsgaGxlbiwKQEAgLTE1NTUsOSArMTYwNCwxMSBAQAogCWxoID0gKHN0cnVjdCBsMmNhcF9oZHIgKikgc2tiX3B1dChza2IsIEwyQ0FQX0hEUl9TSVpFKTsKIAlsaC0+Y2lkID0gY3B1X3RvX2xlMTYoY2hhbi0+ZGNpZCk7CiAJbGgtPmxlbiA9IGNwdV90b19sZTE2KGxlbiArIChobGVuIC0gTDJDQVBfSERSX1NJWkUpKTsKLQlwdXRfdW5hbGlnbmVkX2xlMTYoY29udHJvbCwgc2tiX3B1dChza2IsIDIpKTsKKworCV9fcHV0X2NvbnRyb2woY2hhbiwgY29udHJvbCwgc2tiX3B1dChza2IsIF9fY3RybF9zaXplKGNoYW4pKSk7CisKIAlpZiAoc2R1bGVuKQotCQlwdXRfdW5hbGlnbmVkX2xlMTYoc2R1bGVuLCBza2JfcHV0KHNrYiwgMikpOworCQlwdXRfdW5hbGlnbmVkX2xlMTYoc2R1bGVuLCBza2JfcHV0KHNrYiwgTDJDQVBfU0RVTEVOX1NJWkUpKTsKIAogCWVyciA9IGwyY2FwX3NrYnVmZl9mcm9taW92ZWMoc2ssIG1zZywgbGVuLCBjb3VudCwgc2tiKTsKIAlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKQEAgLTE1NjYsNyArMTYxNyw3IEBACiAJfQogCiAJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpCi0JCXB1dF91bmFsaWduZWRfbGUxNigwLCBza2JfcHV0KHNrYiwgMikpOworCQlwdXRfdW5hbGlnbmVkX2xlMTYoMCwgc2tiX3B1dChza2IsIEwyQ0FQX0ZDU19TSVpFKSk7CiAKIAlidF9jYihza2IpLT5yZXRyaWVzID0gMDsKIAlyZXR1cm4gc2tiOwpAQCAtMTU3NiwxMSArMTYyNywxMSBAQAogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBzYXJfcXVldWU7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAJc2l6ZV90IHNpemUgPSAwOwogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2FyX3F1ZXVlKTsKLQljb250cm9sID0gTDJDQVBfU0RVX1NUQVJUOworCWNvbnRyb2wgPSBfX3NldF9jdHJsX3NhcihjaGFuLCBMMkNBUF9TQVJfU1RBUlQpOwogCXNrYiA9IGwyY2FwX2NyZWF0ZV9pZnJhbWVfcGR1KGNoYW4sIG1zZywgY2hhbi0+cmVtb3RlX21wcywgY29udHJvbCwgbGVuKTsKIAlpZiAoSVNfRVJSKHNrYikpCiAJCXJldHVybiBQVFJfRVJSKHNrYik7CkBAIC0xNTkzLDEwICsxNjQ0LDEwIEBACiAJCXNpemVfdCBidWZsZW47CiAKIAkJaWYgKGxlbiA+IGNoYW4tPnJlbW90ZV9tcHMpIHsKLQkJCWNvbnRyb2wgPSBMMkNBUF9TRFVfQ09OVElOVUU7CisJCQljb250cm9sID0gX19zZXRfY3RybF9zYXIoY2hhbiwgTDJDQVBfU0FSX0NPTlRJTlVFKTsKIAkJCWJ1ZmxlbiA9IGNoYW4tPnJlbW90ZV9tcHM7CiAJCX0gZWxzZSB7Ci0JCQljb250cm9sID0gTDJDQVBfU0RVX0VORDsKKwkJCWNvbnRyb2wgPSBfX3NldF9jdHJsX3NhcihjaGFuLCBMMkNBUF9TQVJfRU5EKTsKIAkJCWJ1ZmxlbiA9IGxlbjsKIAkJfQogCkBAIC0xNjE3LDE1ICsxNjY4LDE2IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludCBsMmNhcF9jaGFuX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK2ludCBsMmNhcF9jaGFuX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCQkJCQkJdTMyIHByaW9yaXR5KQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAJaW50IGVycjsKIAogCS8qIENvbm5lY3Rpb25sZXNzIGNoYW5uZWwgKi8KIAlpZiAoY2hhbi0+Y2hhbl90eXBlID09IEwyQ0FQX0NIQU5fQ09OTl9MRVNTKSB7Ci0JCXNrYiA9IGwyY2FwX2NyZWF0ZV9jb25ubGVzc19wZHUoY2hhbiwgbXNnLCBsZW4pOworCQlza2IgPSBsMmNhcF9jcmVhdGVfY29ubmxlc3NfcGR1KGNoYW4sIG1zZywgbGVuLCBwcmlvcml0eSk7CiAJCWlmIChJU19FUlIoc2tiKSkKIAkJCXJldHVybiBQVFJfRVJSKHNrYik7CiAKQEAgLTE2NDAsNyArMTY5Miw3IEBACiAJCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJCS8qIENyZWF0ZSBhIGJhc2ljIFBEVSAqLwotCQlza2IgPSBsMmNhcF9jcmVhdGVfYmFzaWNfcGR1KGNoYW4sIG1zZywgbGVuKTsKKwkJc2tiID0gbDJjYXBfY3JlYXRlX2Jhc2ljX3BkdShjaGFuLCBtc2csIGxlbiwgcHJpb3JpdHkpOwogCQlpZiAoSVNfRVJSKHNrYikpCiAJCQlyZXR1cm4gUFRSX0VSUihza2IpOwogCkBAIC0xNjUyLDcgKzE3MDQsNyBAQAogCWNhc2UgTDJDQVBfTU9ERV9TVFJFQU1JTkc6CiAJCS8qIEVudGlyZSBTRFUgZml0cyBpbnRvIG9uZSBQRFUgKi8KIAkJaWYgKGxlbiA8PSBjaGFuLT5yZW1vdGVfbXBzKSB7Ci0JCQljb250cm9sID0gTDJDQVBfU0RVX1VOU0VHTUVOVEVEOworCQkJY29udHJvbCA9IF9fc2V0X2N0cmxfc2FyKGNoYW4sIEwyQ0FQX1NBUl9VTlNFR01FTlRFRCk7CiAJCQlza2IgPSBsMmNhcF9jcmVhdGVfaWZyYW1lX3BkdShjaGFuLCBtc2csIGxlbiwgY29udHJvbCwKIAkJCQkJCQkJCTApOwogCQkJaWYgKElTX0VSUihza2IpKQpAQCAtMTg1MCw2ICsxOTAyLDM3IEBACiAJKnB0ciArPSBMMkNBUF9DT05GX09QVF9TSVpFICsgbGVuOwogfQogCitzdGF0aWMgdm9pZCBsMmNhcF9hZGRfb3B0X2Vmcyh2b2lkICoqcHRyLCBzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgbDJjYXBfY29uZl9lZnMgZWZzOworCisJc3dpdGNoKGNoYW4tPm1vZGUpIHsKKwljYXNlIEwyQ0FQX01PREVfRVJUTToKKwkJZWZzLmlkCQk9IGNoYW4tPmxvY2FsX2lkOworCQllZnMuc3R5cGUJPSBjaGFuLT5sb2NhbF9zdHlwZTsKKwkJZWZzLm1zZHUJPSBjcHVfdG9fbGUxNihjaGFuLT5sb2NhbF9tc2R1KTsKKwkJZWZzLnNkdV9pdGltZQk9IGNwdV90b19sZTMyKGNoYW4tPmxvY2FsX3NkdV9pdGltZSk7CisJCWVmcy5hY2NfbGF0CT0gY3B1X3RvX2xlMzIoTDJDQVBfREVGQVVMVF9BQ0NfTEFUKTsKKwkJZWZzLmZsdXNoX3RvCT0gY3B1X3RvX2xlMzIoTDJDQVBfREVGQVVMVF9GTFVTSF9UTyk7CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKKwkJZWZzLmlkCQk9IDE7CisJCWVmcy5zdHlwZQk9IEwyQ0FQX1NFUlZfQkVTVEVGRk9SVDsKKwkJZWZzLm1zZHUJPSBjcHVfdG9fbGUxNihjaGFuLT5sb2NhbF9tc2R1KTsKKwkJZWZzLnNkdV9pdGltZQk9IGNwdV90b19sZTMyKGNoYW4tPmxvY2FsX3NkdV9pdGltZSk7CisJCWVmcy5hY2NfbGF0CT0gMDsKKwkJZWZzLmZsdXNoX3RvCT0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJbDJjYXBfYWRkX2NvbmZfb3B0KHB0ciwgTDJDQVBfQ09ORl9FRlMsIHNpemVvZihlZnMpLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nKSAmZWZzKTsKK30KKwogc3RhdGljIHZvaWQgbDJjYXBfYWNrX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4gPSAodm9pZCAqKSBhcmc7CkBAIC0xODk2LDExICsxOTc5LDM2IEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgX19sMmNhcF9ld3Nfc3VwcG9ydGVkKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCXJldHVybiBlbmFibGVfaHMgJiYgY2hhbi0+Y29ubi0+ZmVhdF9tYXNrICYgTDJDQVBfRkVBVF9FWFRfV0lORE9XOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19sMmNhcF9lZnNfc3VwcG9ydGVkKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCXJldHVybiBlbmFibGVfaHMgJiYgY2hhbi0+Y29ubi0+ZmVhdF9tYXNrICYgTDJDQVBfRkVBVF9FWFRfRkxPVzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX3R4d2luX3NldHVwKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCWlmIChjaGFuLT50eF93aW4gPiBMMkNBUF9ERUZBVUxUX1RYX1dJTkRPVyAmJgorCQkJCQkJX19sMmNhcF9ld3Nfc3VwcG9ydGVkKGNoYW4pKSB7CisJCS8qIHVzZSBleHRlbmRlZCBjb250cm9sIGZpZWxkICovCisJCXNldF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKTsKKwkJY2hhbi0+dHhfd2luX21heCA9IEwyQ0FQX0RFRkFVTFRfRVhUX1dJTkRPVzsKKwl9IGVsc2UgeworCQljaGFuLT50eF93aW4gPSBtaW5fdCh1MTYsIGNoYW4tPnR4X3dpbiwKKwkJCQkJCUwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XKTsKKwkJY2hhbi0+dHhfd2luX21heCA9IEwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XOworCX0KK30KKwogc3RhdGljIGludCBsMmNhcF9idWlsZF9jb25mX3JlcShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbDJjYXBfY29uZl9yZXEgKnJlcSA9IGRhdGE7CiAJc3RydWN0IGwyY2FwX2NvbmZfcmZjIHJmYyA9IHsgLm1vZGUgPSBjaGFuLT5tb2RlIH07CiAJdm9pZCAqcHRyID0gcmVxLT5kYXRhOworCXUxNiBzaXplOwogCiAJQlRfREJHKCJjaGFuICVwIiwgY2hhbik7CiAKQEAgLTE5MTMsNiArMjAyMSw5IEBACiAJCWlmICh0ZXN0X2JpdChDT05GX1NUQVRFMl9ERVZJQ0UsICZjaGFuLT5jb25mX3N0YXRlKSkKIAkJCWJyZWFrOwogCisJCWlmIChfX2wyY2FwX2Vmc19zdXBwb3J0ZWQoY2hhbikpCisJCQlzZXRfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKTsKKwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OgogCQljaGFuLT5tb2RlID0gbDJjYXBfc2VsZWN0X21vZGUocmZjLm1vZGUsIGNoYW4tPmNvbm4tPmZlYXRfbWFzayk7CkBAIC0xOTQyLDE3ICsyMDUzLDI3IEBACiAKIAljYXNlIEwyQ0FQX01PREVfRVJUTToKIAkJcmZjLm1vZGUgICAgICAgICAgICA9IEwyQ0FQX01PREVfRVJUTTsKLQkJcmZjLnR4d2luX3NpemUgICAgICA9IGNoYW4tPnR4X3dpbjsKIAkJcmZjLm1heF90cmFuc21pdCAgICA9IGNoYW4tPm1heF90eDsKIAkJcmZjLnJldHJhbnNfdGltZW91dCA9IDA7CiAJCXJmYy5tb25pdG9yX3RpbWVvdXQgPSAwOwotCQlyZmMubWF4X3BkdV9zaXplICAgID0gY3B1X3RvX2xlMTYoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUpOwotCQlpZiAoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUgPiBjaGFuLT5jb25uLT5tdHUgLSAxMCkKLQkJCXJmYy5tYXhfcGR1X3NpemUgPSBjcHVfdG9fbGUxNihjaGFuLT5jb25uLT5tdHUgLSAxMCk7CisKKwkJc2l6ZSA9IG1pbl90KHUxNiwgTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUsIGNoYW4tPmNvbm4tPm10dSAtCisJCQkJCQlMMkNBUF9FWFRfSERSX1NJWkUgLQorCQkJCQkJTDJDQVBfU0RVTEVOX1NJWkUgLQorCQkJCQkJTDJDQVBfRkNTX1NJWkUpOworCQlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisKKwkJbDJjYXBfdHh3aW5fc2V0dXAoY2hhbik7CisKKwkJcmZjLnR4d2luX3NpemUgPSBtaW5fdCh1MTYsIGNoYW4tPnR4X3dpbiwKKwkJCQkJCUwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XKTsKIAogCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9SRkMsIHNpemVvZihyZmMpLAogCQkJCQkJCSh1bnNpZ25lZCBsb25nKSAmcmZjKTsKIAorCQlpZiAodGVzdF9iaXQoRkxBR19FRlNfRU5BQkxFLCAmY2hhbi0+ZmxhZ3MpKQorCQkJbDJjYXBfYWRkX29wdF9lZnMoJnB0ciwgY2hhbik7CisKIAkJaWYgKCEoY2hhbi0+Y29ubi0+ZmVhdF9tYXNrICYgTDJDQVBfRkVBVF9GQ1MpKQogCQkJYnJlYWs7CiAKQEAgLTE5NjEsNiArMjA4MiwxMCBAQAogCQkJY2hhbi0+ZmNzID0gTDJDQVBfRkNTX05PTkU7CiAJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9GQ1MsIDEsIGNoYW4tPmZjcyk7CiAJCX0KKworCQlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VXUywgMiwKKwkJCQkJCQkJY2hhbi0+dHhfd2luKTsKIAkJYnJlYWs7CiAKIAljYXNlIEwyQ0FQX01PREVfU1RSRUFNSU5HOgpAQCAtMTk2OSwxMyArMjA5NCwxOSBAQAogCQlyZmMubWF4X3RyYW5zbWl0ICAgID0gMDsKIAkJcmZjLnJldHJhbnNfdGltZW91dCA9IDA7CiAJCXJmYy5tb25pdG9yX3RpbWVvdXQgPSAwOwotCQlyZmMubWF4X3BkdV9zaXplICAgID0gY3B1X3RvX2xlMTYoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUpOwotCQlpZiAoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUgPiBjaGFuLT5jb25uLT5tdHUgLSAxMCkKLQkJCXJmYy5tYXhfcGR1X3NpemUgPSBjcHVfdG9fbGUxNihjaGFuLT5jb25uLT5tdHUgLSAxMCk7CisKKwkJc2l6ZSA9IG1pbl90KHUxNiwgTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUsIGNoYW4tPmNvbm4tPm10dSAtCisJCQkJCQlMMkNBUF9FWFRfSERSX1NJWkUgLQorCQkJCQkJTDJDQVBfU0RVTEVOX1NJWkUgLQorCQkJCQkJTDJDQVBfRkNTX1NJWkUpOworCQlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CiAKIAkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLCBzaXplb2YocmZjKSwKIAkJCQkJCQkodW5zaWduZWQgbG9uZykgJnJmYyk7CiAKKwkJaWYgKHRlc3RfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKSkKKwkJCWwyY2FwX2FkZF9vcHRfZWZzKCZwdHIsIGNoYW4pOworCiAJCWlmICghKGNoYW4tPmNvbm4tPmZlYXRfbWFzayAmIEwyQ0FQX0ZFQVRfRkNTKSkKIAkJCWJyZWFrOwogCkBAIC0yMDAyLDggKzIxMzMsMTEgQEAKIAlpbnQgdHlwZSwgaGludCwgb2xlbjsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlzdHJ1Y3QgbDJjYXBfY29uZl9yZmMgcmZjID0geyAubW9kZSA9IEwyQ0FQX01PREVfQkFTSUMgfTsKKwlzdHJ1Y3QgbDJjYXBfY29uZl9lZnMgZWZzOworCXU4IHJlbW90ZV9lZnMgPSAwOwogCXUxNiBtdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKIAl1MTYgcmVzdWx0ID0gTDJDQVBfQ09ORl9TVUNDRVNTOworCXUxNiBzaXplOwogCiAJQlRfREJHKCJjaGFuICVwIiwgY2hhbik7CiAKQEAgLTIwMzMsNyArMjE2NywyMiBAQAogCQljYXNlIEwyQ0FQX0NPTkZfRkNTOgogCQkJaWYgKHZhbCA9PSBMMkNBUF9GQ1NfTk9ORSkKIAkJCQlzZXRfYml0KENPTkZfTk9fRkNTX1JFQ1YsICZjaGFuLT5jb25mX3N0YXRlKTsKKwkJCWJyZWFrOwogCisJCWNhc2UgTDJDQVBfQ09ORl9FRlM6CisJCQlyZW1vdGVfZWZzID0gMTsKKwkJCWlmIChvbGVuID09IHNpemVvZihlZnMpKQorCQkJCW1lbWNweSgmZWZzLCAodm9pZCAqKSB2YWwsIG9sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05GX0VXUzoKKwkJCWlmICghZW5hYmxlX2hzKQorCQkJCXJldHVybiAtRUNPTk5SRUZVU0VEOworCisJCQlzZXRfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncyk7CisJCQlzZXRfYml0KENPTkZfRVdTX1JFQ1YsICZjaGFuLT5jb25mX3N0YXRlKTsKKwkJCWNoYW4tPnR4X3dpbl9tYXggPSBMMkNBUF9ERUZBVUxUX0VYVF9XSU5ET1c7CisJCQljaGFuLT5yZW1vdGVfdHhfd2luID0gdmFsOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTIwNTgsNiArMjIwNywxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQlpZiAocmVtb3RlX2VmcykgeworCQkJaWYgKF9fbDJjYXBfZWZzX3N1cHBvcnRlZChjaGFuKSkKKwkJCQlzZXRfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKwkJfQorCiAJCWlmIChjaGFuLT5tb2RlICE9IHJmYy5tb2RlKQogCQkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CiAKQEAgLTIwNzYsNyArMjIzMiw2IEBACiAJCQkJCXNpemVvZihyZmMpLCAodW5zaWduZWQgbG9uZykgJnJmYyk7CiAJfQogCi0KIAlpZiAocmVzdWx0ID09IEwyQ0FQX0NPTkZfU1VDQ0VTUykgewogCQkvKiBDb25maWd1cmUgb3V0cHV0IG9wdGlvbnMgYW5kIGxldCB0aGUgb3RoZXIgc2lkZSBrbm93CiAJCSAqIHdoaWNoIG9uZXMgd2UgZG9uJ3QgbGlrZS4gKi8KQEAgLTIwODksNiArMjI0NCwyNiBAQAogCQl9CiAJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX01UVSwgMiwgY2hhbi0+b210dSk7CiAKKwkJaWYgKHJlbW90ZV9lZnMpIHsKKwkJCWlmIChjaGFuLT5sb2NhbF9zdHlwZSAhPSBMMkNBUF9TRVJWX05PVFJBRklDICYmCisJCQkJCWVmcy5zdHlwZSAhPSBMMkNBUF9TRVJWX05PVFJBRklDICYmCisJCQkJCWVmcy5zdHlwZSAhPSBjaGFuLT5sb2NhbF9zdHlwZSkgeworCisJCQkJcmVzdWx0ID0gTDJDQVBfQ09ORl9VTkFDQ0VQVDsKKworCQkJCWlmIChjaGFuLT5udW1fY29uZl9yZXEgPj0gMSkKKwkJCQkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisKKwkJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9FRlMsCisJCQkJCQkJc2l6ZW9mKGVmcyksCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpICZlZnMpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTZW5kIFBFTkRJTkcgQ29uZiBSc3AgKi8KKwkJCQlyZXN1bHQgPSBMMkNBUF9DT05GX1BFTkRJTkc7CisJCQkJc2V0X2JpdChDT05GX0xPQ19DT05GX1BFTkQsICZjaGFuLT5jb25mX3N0YXRlKTsKKwkJCX0KKwkJfQorCiAJCXN3aXRjaCAocmZjLm1vZGUpIHsKIAkJY2FzZSBMMkNBUF9NT0RFX0JBU0lDOgogCQkJY2hhbi0+ZmNzID0gTDJDQVBfRkNTX05PTkU7CkBAIC0yMDk2LDEzICsyMjcxLDIwIEBACiAJCQlicmVhazsKIAogCQljYXNlIEwyQ0FQX01PREVfRVJUTToKLQkJCWNoYW4tPnJlbW90ZV90eF93aW4gPSByZmMudHh3aW5fc2l6ZTsKKwkJCWlmICghdGVzdF9iaXQoQ09ORl9FV1NfUkVDViwgJmNoYW4tPmNvbmZfc3RhdGUpKQorCQkJCWNoYW4tPnJlbW90ZV90eF93aW4gPSByZmMudHh3aW5fc2l6ZTsKKwkJCWVsc2UKKwkJCQlyZmMudHh3aW5fc2l6ZSA9IEwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XOworCiAJCQljaGFuLT5yZW1vdGVfbWF4X3R4ID0gcmZjLm1heF90cmFuc21pdDsKIAotCQkJaWYgKGxlMTZfdG9fY3B1KHJmYy5tYXhfcGR1X3NpemUpID4gY2hhbi0+Y29ubi0+bXR1IC0gMTApCi0JCQkJcmZjLm1heF9wZHVfc2l6ZSA9IGNwdV90b19sZTE2KGNoYW4tPmNvbm4tPm10dSAtIDEwKTsKLQotCQkJY2hhbi0+cmVtb3RlX21wcyA9IGxlMTZfdG9fY3B1KHJmYy5tYXhfcGR1X3NpemUpOworCQkJc2l6ZSA9IG1pbl90KHUxNiwgbGUxNl90b19jcHUocmZjLm1heF9wZHVfc2l6ZSksCisJCQkJCQljaGFuLT5jb25uLT5tdHUgLQorCQkJCQkJTDJDQVBfRVhUX0hEUl9TSVpFIC0KKwkJCQkJCUwyQ0FQX1NEVUxFTl9TSVpFIC0KKwkJCQkJCUwyQ0FQX0ZDU19TSVpFKTsKKwkJCXJmYy5tYXhfcGR1X3NpemUgPSBjcHVfdG9fbGUxNihzaXplKTsKKwkJCWNoYW4tPnJlbW90ZV9tcHMgPSBzaXplOwogCiAJCQlyZmMucmV0cmFuc190aW1lb3V0ID0KIAkJCQlsZTE2X3RvX2NwdShMMkNBUF9ERUZBVUxUX1JFVFJBTlNfVE8pOwpAQCAtMjExNCwxMyArMjI5NiwyOSBAQAogCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLAogCQkJCQlzaXplb2YocmZjKSwgKHVuc2lnbmVkIGxvbmcpICZyZmMpOwogCisJCQlpZiAodGVzdF9iaXQoRkxBR19FRlNfRU5BQkxFLCAmY2hhbi0+ZmxhZ3MpKSB7CisJCQkJY2hhbi0+cmVtb3RlX2lkID0gZWZzLmlkOworCQkJCWNoYW4tPnJlbW90ZV9zdHlwZSA9IGVmcy5zdHlwZTsKKwkJCQljaGFuLT5yZW1vdGVfbXNkdSA9IGxlMTZfdG9fY3B1KGVmcy5tc2R1KTsKKwkJCQljaGFuLT5yZW1vdGVfZmx1c2hfdG8gPQorCQkJCQkJbGUzMl90b19jcHUoZWZzLmZsdXNoX3RvKTsKKwkJCQljaGFuLT5yZW1vdGVfYWNjX2xhdCA9CisJCQkJCQlsZTMyX3RvX2NwdShlZnMuYWNjX2xhdCk7CisJCQkJY2hhbi0+cmVtb3RlX3NkdV9pdGltZSA9CisJCQkJCWxlMzJfdG9fY3B1KGVmcy5zZHVfaXRpbWUpOworCQkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VGUywKKwkJCQkJc2l6ZW9mKGVmcyksICh1bnNpZ25lZCBsb25nKSAmZWZzKTsKKwkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgTDJDQVBfTU9ERV9TVFJFQU1JTkc6Ci0JCQlpZiAobGUxNl90b19jcHUocmZjLm1heF9wZHVfc2l6ZSkgPiBjaGFuLT5jb25uLT5tdHUgLSAxMCkKLQkJCQlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYoY2hhbi0+Y29ubi0+bXR1IC0gMTApOwotCi0JCQljaGFuLT5yZW1vdGVfbXBzID0gbGUxNl90b19jcHUocmZjLm1heF9wZHVfc2l6ZSk7CisJCQlzaXplID0gbWluX3QodTE2LCBsZTE2X3RvX2NwdShyZmMubWF4X3BkdV9zaXplKSwKKwkJCQkJCWNoYW4tPmNvbm4tPm10dSAtCisJCQkJCQlMMkNBUF9FWFRfSERSX1NJWkUgLQorCQkJCQkJTDJDQVBfU0RVTEVOX1NJWkUgLQorCQkJCQkJTDJDQVBfRkNTX1NJWkUpOworCQkJcmZjLm1heF9wZHVfc2l6ZSA9IGNwdV90b19sZTE2KHNpemUpOworCQkJY2hhbi0+cmVtb3RlX21wcyA9IHNpemU7CiAKIAkJCXNldF9iaXQoQ09ORl9NT0RFX0RPTkUsICZjaGFuLT5jb25mX3N0YXRlKTsKIApAQCAtMjE1Myw2ICsyMzUxLDcgQEAKIAlpbnQgdHlwZSwgb2xlbjsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlzdHJ1Y3QgbDJjYXBfY29uZl9yZmMgcmZjOworCXN0cnVjdCBsMmNhcF9jb25mX2VmcyBlZnM7CiAKIAlCVF9EQkcoImNoYW4gJXAsIHJzcCAlcCwgbGVuICVkLCByZXEgJXAiLCBjaGFuLCByc3AsIGxlbiwgZGF0YSk7CiAKQEAgLTIxODgsNiArMjM4NywyNiBAQAogCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLAogCQkJCQlzaXplb2YocmZjKSwgKHVuc2lnbmVkIGxvbmcpICZyZmMpOwogCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05GX0VXUzoKKwkJCWNoYW4tPnR4X3dpbiA9IG1pbl90KHUxNiwgdmFsLAorCQkJCQkJTDJDQVBfREVGQVVMVF9FWFRfV0lORE9XKTsKKwkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VXUywgMiwKKwkJCQkJCQljaGFuLT50eF93aW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05GX0VGUzoKKwkJCWlmIChvbGVuID09IHNpemVvZihlZnMpKQorCQkJCW1lbWNweSgmZWZzLCAodm9pZCAqKXZhbCwgb2xlbik7CisKKwkJCWlmIChjaGFuLT5sb2NhbF9zdHlwZSAhPSBMMkNBUF9TRVJWX05PVFJBRklDICYmCisJCQkJCWVmcy5zdHlwZSAhPSBMMkNBUF9TRVJWX05PVFJBRklDICYmCisJCQkJCWVmcy5zdHlwZSAhPSBjaGFuLT5sb2NhbF9zdHlwZSkKKwkJCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKworCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfRUZTLAorCQkJCQlzaXplb2YoZWZzKSwgKHVuc2lnbmVkIGxvbmcpICZlZnMpOworCQkJYnJlYWs7CiAJCX0KIAl9CiAKQEAgLTIxOTYsMTMgKzI0MTUsMjMgQEAKIAogCWNoYW4tPm1vZGUgPSByZmMubW9kZTsKIAotCWlmICgqcmVzdWx0ID09IEwyQ0FQX0NPTkZfU1VDQ0VTUykgeworCWlmICgqcmVzdWx0ID09IEwyQ0FQX0NPTkZfU1VDQ0VTUyB8fCAqcmVzdWx0ID09IEwyQ0FQX0NPTkZfUEVORElORykgewogCQlzd2l0Y2ggKHJmYy5tb2RlKSB7CiAJCWNhc2UgTDJDQVBfTU9ERV9FUlRNOgogCQkJY2hhbi0+cmV0cmFuc190aW1lb3V0ID0gbGUxNl90b19jcHUocmZjLnJldHJhbnNfdGltZW91dCk7CiAJCQljaGFuLT5tb25pdG9yX3RpbWVvdXQgPSBsZTE2X3RvX2NwdShyZmMubW9uaXRvcl90aW1lb3V0KTsKIAkJCWNoYW4tPm1wcyAgICA9IGxlMTZfdG9fY3B1KHJmYy5tYXhfcGR1X3NpemUpOworCisJCQlpZiAodGVzdF9iaXQoRkxBR19FRlNfRU5BQkxFLCAmY2hhbi0+ZmxhZ3MpKSB7CisJCQkJY2hhbi0+bG9jYWxfbXNkdSA9IGxlMTZfdG9fY3B1KGVmcy5tc2R1KTsKKwkJCQljaGFuLT5sb2NhbF9zZHVfaXRpbWUgPQorCQkJCQkJbGUzMl90b19jcHUoZWZzLnNkdV9pdGltZSk7CisJCQkJY2hhbi0+bG9jYWxfYWNjX2xhdCA9IGxlMzJfdG9fY3B1KGVmcy5hY2NfbGF0KTsKKwkJCQljaGFuLT5sb2NhbF9mbHVzaF90byA9CisJCQkJCQlsZTMyX3RvX2NwdShlZnMuZmx1c2hfdG8pOworCQkJfQogCQkJYnJlYWs7CisKIAkJY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKIAkJCWNoYW4tPm1wcyAgICA9IGxlMTZfdG9fY3B1KHJmYy5tYXhfcGR1X3NpemUpOwogCQl9CkBAIC0yMzMwLDcgKzI1NTksNyBAQAogCS8qIENoZWNrIGlmIHRoZSBBQ0wgaXMgc2VjdXJlIGVub3VnaCAoaWYgbm90IFNEUCkgKi8KIAlpZiAocHNtICE9IGNwdV90b19sZTE2KDB4MDAwMSkgJiYKIAkJCQkhaGNpX2Nvbm5fY2hlY2tfbGlua19tb2RlKGNvbm4tPmhjb24pKSB7Ci0JCWNvbm4tPmRpc2NfcmVhc29uID0gMHgwNTsKKwkJY29ubi0+ZGlzY19yZWFzb24gPSBIQ0lfRVJST1JfQVVUSF9GQUlMVVJFOwogCQlyZXN1bHQgPSBMMkNBUF9DUl9TRUNfQkxPQ0s7CiAJCWdvdG8gcmVzcG9uc2U7CiAJfQpAQCAtMjYwMiw2ICsyODMxLDIxIEBACiAJCWNoYW4tPm51bV9jb25mX3JlcSsrOwogCX0KIAorCS8qIEdvdCBDb25mIFJzcCBQRU5ESU5HIGZyb20gcmVtb3RlIHNpZGUgYW5kIGFzdW1lIHdlIHNlbnQKKwkgICBDb25mIFJzcCBQRU5ESU5HIGluIHRoZSBjb2RlIGFib3ZlICovCisJaWYgKHRlc3RfYml0KENPTkZfUkVNX0NPTkZfUEVORCwgJmNoYW4tPmNvbmZfc3RhdGUpICYmCisJCQl0ZXN0X2JpdChDT05GX0xPQ19DT05GX1BFTkQsICZjaGFuLT5jb25mX3N0YXRlKSkgeworCisJCS8qIGNoZWNrIGNvbXBhdGliaWxpdHkgKi8KKworCQljbGVhcl9iaXQoQ09ORl9MT0NfQ09ORl9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSk7CisJCXNldF9iaXQoQ09ORl9PVVRQVVRfRE9ORSwgJmNoYW4tPmNvbmZfc3RhdGUpOworCisJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNtZC0+aWRlbnQsIEwyQ0FQX0NPTkZfUlNQLAorCQkJCQlsMmNhcF9idWlsZF9jb25mX3JzcChjaGFuLCByc3AsCisJCQkJCUwyQ0FQX0NPTkZfU1VDQ0VTUywgMHgwMDAwKSwgcnNwKTsKKwl9CisKIHVubG9jazoKIAliaF91bmxvY2tfc29jayhzayk7CiAJcmV0dXJuIDA7CkBAIC0yNjMxLDggKzI4NzUsMzMgQEAKIAlzd2l0Y2ggKHJlc3VsdCkgewogCWNhc2UgTDJDQVBfQ09ORl9TVUNDRVNTOgogCQlsMmNhcF9jb25mX3JmY19nZXQoY2hhbiwgcnNwLT5kYXRhLCBsZW4pOworCQljbGVhcl9iaXQoQ09ORl9SRU1fQ09ORl9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSk7CiAJCWJyZWFrOwogCisJY2FzZSBMMkNBUF9DT05GX1BFTkRJTkc6CisJCXNldF9iaXQoQ09ORl9SRU1fQ09ORl9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSk7CisKKwkJaWYgKHRlc3RfYml0KENPTkZfTE9DX0NPTkZfUEVORCwgJmNoYW4tPmNvbmZfc3RhdGUpKSB7CisJCQljaGFyIGJ1Zls2NF07CisKKwkJCWxlbiA9IGwyY2FwX3BhcnNlX2NvbmZfcnNwKGNoYW4sIHJzcC0+ZGF0YSwgbGVuLAorCQkJCQkJCQlidWYsICZyZXN1bHQpOworCQkJaWYgKGxlbiA8IDApIHsKKwkJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNvbm4sIGNoYW4sIEVDT05OUkVTRVQpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKworCQkJLyogY2hlY2sgY29tcGF0aWJpbGl0eSAqLworCisJCQljbGVhcl9iaXQoQ09ORl9MT0NfQ09ORl9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSk7CisJCQlzZXRfYml0KENPTkZfT1VUUFVUX0RPTkUsICZjaGFuLT5jb25mX3N0YXRlKTsKKworCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwgTDJDQVBfQ09ORl9SU1AsCisJCQkJCQlsMmNhcF9idWlsZF9jb25mX3JzcChjaGFuLCBidWYsCisJCQkJCQlMMkNBUF9DT05GX1NVQ0NFU1MsIDB4MDAwMCksIGJ1Zik7CisJCX0KKwkJZ290byBkb25lOworCiAJY2FzZSBMMkNBUF9DT05GX1VOQUNDRVBUOgogCQlpZiAoY2hhbi0+bnVtX2NvbmZfcnNwIDw9IEwyQ0FQX0NPTkZfTUFYX0NPTkZfUlNQKSB7CiAJCQljaGFyIHJlcVs2NF07CkBAIC0yNzgyLDE1ICszMDUxLDI1IEBACiAJCWlmICghZGlzYWJsZV9lcnRtKQogCQkJZmVhdF9tYXNrIHw9IEwyQ0FQX0ZFQVRfRVJUTSB8IEwyQ0FQX0ZFQVRfU1RSRUFNSU5HCiAJCQkJCQkJIHwgTDJDQVBfRkVBVF9GQ1M7CisJCWlmIChlbmFibGVfaHMpCisJCQlmZWF0X21hc2sgfD0gTDJDQVBfRkVBVF9FWFRfRkxPVworCQkJCQkJfCBMMkNBUF9GRUFUX0VYVF9XSU5ET1c7CisKIAkJcHV0X3VuYWxpZ25lZF9sZTMyKGZlYXRfbWFzaywgcnNwLT5kYXRhKTsKIAkJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwKIAkJCQkJTDJDQVBfSU5GT19SU1AsIHNpemVvZihidWYpLCBidWYpOwogCX0gZWxzZSBpZiAodHlwZSA9PSBMMkNBUF9JVF9GSVhFRF9DSEFOKSB7CiAJCXU4IGJ1ZlsxMl07CiAJCXN0cnVjdCBsMmNhcF9pbmZvX3JzcCAqcnNwID0gKHN0cnVjdCBsMmNhcF9pbmZvX3JzcCAqKSBidWY7CisKKwkJaWYgKGVuYWJsZV9ocykKKwkJCWwyY2FwX2ZpeGVkX2NoYW5bMF0gfD0gTDJDQVBfRkNfQTJNUDsKKwkJZWxzZQorCQkJbDJjYXBfZml4ZWRfY2hhblswXSAmPSB+TDJDQVBfRkNfQTJNUDsKKwogCQlyc3AtPnR5cGUgICA9IGNwdV90b19sZTE2KEwyQ0FQX0lUX0ZJWEVEX0NIQU4pOwogCQlyc3AtPnJlc3VsdCA9IGNwdV90b19sZTE2KEwyQ0FQX0lSX1NVQ0NFU1MpOwotCQltZW1jcHkoYnVmICsgNCwgbDJjYXBfZml4ZWRfY2hhbiwgOCk7CisJCW1lbWNweShyc3AtPmRhdGEsIGwyY2FwX2ZpeGVkX2NoYW4sIHNpemVvZihsMmNhcF9maXhlZF9jaGFuKSk7CiAJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNtZC0+aWRlbnQsCiAJCQkJCUwyQ0FQX0lORk9fUlNQLCBzaXplb2YoYnVmKSwgYnVmKTsKIAl9IGVsc2UgewpAQCAtMjg1Nyw2ICszMTM2LDE2NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9jcmVhdGVfY2hhbm5lbF9yZXEoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCisJCQkJCXN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHUxNiBjbWRfbGVuLAorCQkJCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9jcmVhdGVfY2hhbl9yZXEgKnJlcSA9IGRhdGE7CisJc3RydWN0IGwyY2FwX2NyZWF0ZV9jaGFuX3JzcCByc3A7CisJdTE2IHBzbSwgc2NpZDsKKworCWlmIChjbWRfbGVuICE9IHNpemVvZigqcmVxKSkKKwkJcmV0dXJuIC1FUFJPVE87CisKKwlpZiAoIWVuYWJsZV9ocykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwc20gPSBsZTE2X3RvX2NwdShyZXEtPnBzbSk7CisJc2NpZCA9IGxlMTZfdG9fY3B1KHJlcS0+c2NpZCk7CisKKwlCVF9EQkcoInBzbSAlZCwgc2NpZCAlZCwgYW1wX2lkICVkIiwgcHNtLCBzY2lkLCByZXEtPmFtcF9pZCk7CisKKwkvKiBQbGFjZWhvbGRlcjogQWx3YXlzIHJlamVjdCAqLworCXJzcC5kY2lkID0gMDsKKwlyc3Auc2NpZCA9IGNwdV90b19sZTE2KHNjaWQpOworCXJzcC5yZXN1bHQgPSBMMkNBUF9DUl9OT19NRU07CisJcnNwLnN0YXR1cyA9IEwyQ0FQX0NTX05PX0lORk87CisKKwlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9DUkVBVEVfQ0hBTl9SU1AsCisJCSAgICAgICBzaXplb2YocnNwKSwgJnJzcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfY3JlYXRlX2NoYW5uZWxfcnNwKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLAorCQkJCQlzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB2b2lkICpkYXRhKQoreworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCisJcmV0dXJuIGwyY2FwX2Nvbm5lY3RfcnNwKGNvbm4sIGNtZCwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NlbmRfbW92ZV9jaGFuX3JzcChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgdTggaWRlbnQsCisJCQkJCQkJdTE2IGljaWQsIHUxNiByZXN1bHQpCit7CisJc3RydWN0IGwyY2FwX21vdmVfY2hhbl9yc3AgcnNwOworCisJQlRfREJHKCJpY2lkICVkLCByZXN1bHQgJWQiLCBpY2lkLCByZXN1bHQpOworCisJcnNwLmljaWQgPSBjcHVfdG9fbGUxNihpY2lkKTsKKwlyc3AucmVzdWx0ID0gY3B1X3RvX2xlMTYocmVzdWx0KTsKKworCWwyY2FwX3NlbmRfY21kKGNvbm4sIGlkZW50LCBMMkNBUF9NT1ZFX0NIQU5fUlNQLCBzaXplb2YocnNwKSwgJnJzcCk7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NlbmRfbW92ZV9jaGFuX2NmbShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwKKwkJCQlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IGljaWQsIHUxNiByZXN1bHQpCit7CisJc3RydWN0IGwyY2FwX21vdmVfY2hhbl9jZm0gY2ZtOworCXU4IGlkZW50OworCisJQlRfREJHKCJpY2lkICVkLCByZXN1bHQgJWQiLCBpY2lkLCByZXN1bHQpOworCisJaWRlbnQgPSBsMmNhcF9nZXRfaWRlbnQoY29ubik7CisJaWYgKGNoYW4pCisJCWNoYW4tPmlkZW50ID0gaWRlbnQ7CisKKwljZm0uaWNpZCA9IGNwdV90b19sZTE2KGljaWQpOworCWNmbS5yZXN1bHQgPSBjcHVfdG9fbGUxNihyZXN1bHQpOworCisJbDJjYXBfc2VuZF9jbWQoY29ubiwgaWRlbnQsIEwyQ0FQX01PVkVfQ0hBTl9DRk0sIHNpemVvZihjZm0pLCAmY2ZtKTsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfc2VuZF9tb3ZlX2NoYW5fY2ZtX3JzcChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgdTggaWRlbnQsCisJCQkJCQkJCXUxNiBpY2lkKQoreworCXN0cnVjdCBsMmNhcF9tb3ZlX2NoYW5fY2ZtX3JzcCByc3A7CisKKwlCVF9EQkcoImljaWQgJWQiLCBpY2lkKTsKKworCXJzcC5pY2lkID0gY3B1X3RvX2xlMTYoaWNpZCk7CisJbDJjYXBfc2VuZF9jbWQoY29ubiwgaWRlbnQsIEwyQ0FQX01PVkVfQ0hBTl9DRk1fUlNQLCBzaXplb2YocnNwKSwgJnJzcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX21vdmVfY2hhbm5lbF9yZXEoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCisJCQlzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB1MTYgY21kX2xlbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbDJjYXBfbW92ZV9jaGFuX3JlcSAqcmVxID0gZGF0YTsKKwl1MTYgaWNpZCA9IDA7CisJdTE2IHJlc3VsdCA9IEwyQ0FQX01SX05PVF9BTExPV0VEOworCisJaWYgKGNtZF9sZW4gIT0gc2l6ZW9mKCpyZXEpKQorCQlyZXR1cm4gLUVQUk9UTzsKKworCWljaWQgPSBsZTE2X3RvX2NwdShyZXEtPmljaWQpOworCisJQlRfREJHKCJpY2lkICVkLCBkZXN0X2FtcF9pZCAlZCIsIGljaWQsIHJlcS0+ZGVzdF9hbXBfaWQpOworCisJaWYgKCFlbmFibGVfaHMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUGxhY2Vob2xkZXI6IEFsd2F5cyByZWZ1c2UgKi8KKwlsMmNhcF9zZW5kX21vdmVfY2hhbl9yc3AoY29ubiwgY21kLT5pZGVudCwgaWNpZCwgcmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9tb3ZlX2NoYW5uZWxfcnNwKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLAorCQkJc3RydWN0IGwyY2FwX2NtZF9oZHIgKmNtZCwgdTE2IGNtZF9sZW4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX21vdmVfY2hhbl9yc3AgKnJzcCA9IGRhdGE7CisJdTE2IGljaWQsIHJlc3VsdDsKKworCWlmIChjbWRfbGVuICE9IHNpemVvZigqcnNwKSkKKwkJcmV0dXJuIC1FUFJPVE87CisKKwlpY2lkID0gbGUxNl90b19jcHUocnNwLT5pY2lkKTsKKwlyZXN1bHQgPSBsZTE2X3RvX2NwdShyc3AtPnJlc3VsdCk7CisKKwlCVF9EQkcoImljaWQgJWQsIHJlc3VsdCAlZCIsIGljaWQsIHJlc3VsdCk7CisKKwkvKiBQbGFjZWhvbGRlcjogQWx3YXlzIHVuY29uZmlybWVkICovCisJbDJjYXBfc2VuZF9tb3ZlX2NoYW5fY2ZtKGNvbm4sIE5VTEwsIGljaWQsIEwyQ0FQX01DX1VOQ09ORklSTUVEKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9tb3ZlX2NoYW5uZWxfY29uZmlybShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwKKwkJCXN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHUxNiBjbWRfbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9tb3ZlX2NoYW5fY2ZtICpjZm0gPSBkYXRhOworCXUxNiBpY2lkLCByZXN1bHQ7CisKKwlpZiAoY21kX2xlbiAhPSBzaXplb2YoKmNmbSkpCisJCXJldHVybiAtRVBST1RPOworCisJaWNpZCA9IGxlMTZfdG9fY3B1KGNmbS0+aWNpZCk7CisJcmVzdWx0ID0gbGUxNl90b19jcHUoY2ZtLT5yZXN1bHQpOworCisJQlRfREJHKCJpY2lkICVkLCByZXN1bHQgJWQiLCBpY2lkLCByZXN1bHQpOworCisJbDJjYXBfc2VuZF9tb3ZlX2NoYW5fY2ZtX3JzcChjb25uLCBjbWQtPmlkZW50LCBpY2lkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9tb3ZlX2NoYW5uZWxfY29uZmlybV9yc3Aoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCisJCQlzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB1MTYgY21kX2xlbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbDJjYXBfbW92ZV9jaGFuX2NmbV9yc3AgKnJzcCA9IGRhdGE7CisJdTE2IGljaWQ7CisKKwlpZiAoY21kX2xlbiAhPSBzaXplb2YoKnJzcCkpCisJCXJldHVybiAtRVBST1RPOworCisJaWNpZCA9IGxlMTZfdG9fY3B1KHJzcC0+aWNpZCk7CisKKwlCVF9EQkcoImljaWQgJWQiLCBpY2lkKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBsMmNhcF9jaGVja19jb25uX3BhcmFtKHUxNiBtaW4sIHUxNiBtYXgsIHUxNiBsYXRlbmN5LAogCQkJCQkJCXUxNiB0b19tdWx0aXBsaWVyKQogewpAQCAtMjk2OSw2ICszNDA3LDMwIEBACiAJCWVyciA9IGwyY2FwX2luZm9ybWF0aW9uX3JzcChjb25uLCBjbWQsIGRhdGEpOwogCQlicmVhazsKIAorCWNhc2UgTDJDQVBfQ1JFQVRFX0NIQU5fUkVROgorCQllcnIgPSBsMmNhcF9jcmVhdGVfY2hhbm5lbF9yZXEoY29ubiwgY21kLCBjbWRfbGVuLCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIEwyQ0FQX0NSRUFURV9DSEFOX1JTUDoKKwkJZXJyID0gbDJjYXBfY3JlYXRlX2NoYW5uZWxfcnNwKGNvbm4sIGNtZCwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9NT1ZFX0NIQU5fUkVROgorCQllcnIgPSBsMmNhcF9tb3ZlX2NoYW5uZWxfcmVxKGNvbm4sIGNtZCwgY21kX2xlbiwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9NT1ZFX0NIQU5fUlNQOgorCQllcnIgPSBsMmNhcF9tb3ZlX2NoYW5uZWxfcnNwKGNvbm4sIGNtZCwgY21kX2xlbiwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9NT1ZFX0NIQU5fQ0ZNOgorCQllcnIgPSBsMmNhcF9tb3ZlX2NoYW5uZWxfY29uZmlybShjb25uLCBjbWQsIGNtZF9sZW4sIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgTDJDQVBfTU9WRV9DSEFOX0NGTV9SU1A6CisJCWVyciA9IGwyY2FwX21vdmVfY2hhbm5lbF9jb25maXJtX3JzcChjb25uLCBjbWQsIGNtZF9sZW4sIGRhdGEpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCUJUX0VSUigiVW5rbm93biBCUi9FRFIgc2lnbmFsaW5nIGNvbW1hbmQgMHglMi4yeCIsIGNtZC0+Y29kZSk7CiAJCWVyciA9IC1FSU5WQUw7CkBAIC0zMDQ3LDEwICszNTA5LDE1IEBACiBzdGF0aWMgaW50IGwyY2FwX2NoZWNrX2ZjcyhzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdTE2IG91cl9mY3MsIHJjdl9mY3M7Ci0JaW50IGhkcl9zaXplID0gTDJDQVBfSERSX1NJWkUgKyAyOworCWludCBoZHJfc2l6ZTsKKworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQloZHJfc2l6ZSA9IEwyQ0FQX0VYVF9IRFJfU0laRTsKKwllbHNlCisJCWhkcl9zaXplID0gTDJDQVBfRU5IX0hEUl9TSVpFOwogCiAJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpIHsKLQkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDIpOworCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gTDJDQVBfRkNTX1NJWkUpOwogCQlyY3ZfZmNzID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHNrYi0+ZGF0YSArIHNrYi0+bGVuKTsKIAkJb3VyX2ZjcyA9IGNyYzE2KDAsIHNrYi0+ZGF0YSAtIGhkcl9zaXplLCBza2ItPmxlbiArIGhkcl9zaXplKTsKIApAQCAtMzA2MiwxNCArMzUyOSwxNCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfc2VuZF9pX29yX3JyX29yX3JucihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKIHsKLQl1MTYgY29udHJvbCA9IDA7CisJdTMyIGNvbnRyb2wgPSAwOwogCiAJY2hhbi0+ZnJhbWVzX3NlbnQgPSAwOwogCi0JY29udHJvbCB8PSBjaGFuLT5idWZmZXJfc2VxIDw8IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUOworCWNvbnRyb2wgfD0gX19zZXRfcmVxc2VxKGNoYW4sIGNoYW4tPmJ1ZmZlcl9zZXEpOwogCiAJaWYgKHRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7Ci0JCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX05PVF9SRUFEWTsKKwkJY29udHJvbCB8PSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1JOUik7CiAJCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpOwogCQlzZXRfYml0KENPTk5fUk5SX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKTsKIAl9CkBAIC0zMDgxLDEyICszNTQ4LDEyIEBACiAKIAlpZiAoIXRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpICYmCiAJCQljaGFuLT5mcmFtZXNfc2VudCA9PSAwKSB7Ci0JCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX1JFQURZOworCQljb250cm9sIHw9IF9fc2V0X2N0cmxfc3VwZXIoY2hhbiwgTDJDQVBfU1VQRVJfUlIpOwogCQlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbDJjYXBfYWRkX3RvX3NyZWpfcXVldWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IsIHU4IHR4X3NlcSwgdTggc2FyKQorc3RhdGljIGludCBsMmNhcF9hZGRfdG9fc3Jlal9xdWV1ZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHR4X3NlcSwgdTggc2FyKQogewogCXN0cnVjdCBza19idWZmICpuZXh0X3NrYjsKIAlpbnQgdHhfc2VxX29mZnNldCwgbmV4dF90eF9zZXFfb2Zmc2V0OwpAQCAtMzEwMCwxOCArMzU2NywxNCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQl0eF9zZXFfb2Zmc2V0ID0gKHR4X3NlcSAtIGNoYW4tPmJ1ZmZlcl9zZXEpICUgNjQ7Ci0JaWYgKHR4X3NlcV9vZmZzZXQgPCAwKQotCQl0eF9zZXFfb2Zmc2V0ICs9IDY0OworCXR4X3NlcV9vZmZzZXQgPSBfX3NlcV9vZmZzZXQoY2hhbiwgdHhfc2VxLCBjaGFuLT5idWZmZXJfc2VxKTsKIAogCWRvIHsKIAkJaWYgKGJ0X2NiKG5leHRfc2tiKS0+dHhfc2VxID09IHR4X3NlcSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCW5leHRfdHhfc2VxX29mZnNldCA9IChidF9jYihuZXh0X3NrYiktPnR4X3NlcSAtCi0JCQkJCQljaGFuLT5idWZmZXJfc2VxKSAlIDY0OwotCQlpZiAobmV4dF90eF9zZXFfb2Zmc2V0IDwgMCkKLQkJCW5leHRfdHhfc2VxX29mZnNldCArPSA2NDsKKwkJbmV4dF90eF9zZXFfb2Zmc2V0ID0gX19zZXFfb2Zmc2V0KGNoYW4sCisJCQkJYnRfY2IobmV4dF9za2IpLT50eF9zZXEsIGNoYW4tPmJ1ZmZlcl9zZXEpOwogCiAJCWlmIChuZXh0X3R4X3NlcV9vZmZzZXQgPiB0eF9zZXFfb2Zmc2V0KSB7CiAJCQlfX3NrYl9xdWV1ZV9iZWZvcmUoJmNoYW4tPnNyZWpfcSwgbmV4dF9za2IsIHNrYik7CkBAIC0zMTQ3LDI0ICszNjEwLDI0IEBACiAJc2tiLT50cnVlc2l6ZSArPSBuZXdfZnJhZy0+dHJ1ZXNpemU7CiB9CiAKLXN0YXRpYyBpbnQgbDJjYXBfcmVhc3NlbWJsZV9zZHUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IsIHUxNiBjb250cm9sKQorc3RhdGljIGludCBsMmNhcF9yZWFzc2VtYmxlX3NkdShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGNvbnRyb2wpCiB7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlzd2l0Y2ggKGNvbnRyb2wgJiBMMkNBUF9DVFJMX1NBUikgewotCWNhc2UgTDJDQVBfU0RVX1VOU0VHTUVOVEVEOgorCXN3aXRjaCAoX19nZXRfY3RybF9zYXIoY2hhbiwgY29udHJvbCkpIHsKKwljYXNlIEwyQ0FQX1NBUl9VTlNFR01FTlRFRDoKIAkJaWYgKGNoYW4tPnNkdSkKIAkJCWJyZWFrOwogCiAJCWVyciA9IGNoYW4tPm9wcy0+cmVjdihjaGFuLT5kYXRhLCBza2IpOwogCQlicmVhazsKIAotCWNhc2UgTDJDQVBfU0RVX1NUQVJUOgorCWNhc2UgTDJDQVBfU0FSX1NUQVJUOgogCQlpZiAoY2hhbi0+c2R1KQogCQkJYnJlYWs7CiAKIAkJY2hhbi0+c2R1X2xlbiA9IGdldF91bmFsaWduZWRfbGUxNihza2ItPmRhdGEpOwotCQlza2JfcHVsbChza2IsIDIpOworCQlza2JfcHVsbChza2IsIEwyQ0FQX1NEVUxFTl9TSVpFKTsKIAogCQlpZiAoY2hhbi0+c2R1X2xlbiA+IGNoYW4tPmltdHUpIHsKIAkJCWVyciA9IC1FTVNHU0laRTsKQEAgLTMxODEsNyArMzY0NCw3IEBACiAJCWVyciA9IDA7CiAJCWJyZWFrOwogCi0JY2FzZSBMMkNBUF9TRFVfQ09OVElOVUU6CisJY2FzZSBMMkNBUF9TQVJfQ09OVElOVUU6CiAJCWlmICghY2hhbi0+c2R1KQogCQkJYnJlYWs7CiAKQEAgLTMxOTUsNyArMzY1OCw3IEBACiAJCWVyciA9IDA7CiAJCWJyZWFrOwogCi0JY2FzZSBMMkNBUF9TRFVfRU5EOgorCWNhc2UgTDJDQVBfU0FSX0VORDoKIAkJaWYgKCFjaGFuLT5zZHUpCiAJCQlicmVhazsKIApAQCAtMzIzMCwxNCArMzY5MywxNCBAQAogCiBzdGF0aWMgdm9pZCBsMmNhcF9lcnRtX2VudGVyX2xvY2FsX2J1c3koc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCiB7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAKIAlCVF9EQkcoImNoYW4gJXAsIEVudGVyIGxvY2FsIGJ1c3kiLCBjaGFuKTsKIAogCXNldF9iaXQoQ09OTl9MT0NBTF9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAKLQljb250cm9sID0gY2hhbi0+YnVmZmVyX3NlcSA8PCBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVDsKLQljb250cm9sIHw9IEwyQ0FQX1NVUEVSX1JDVl9OT1RfUkVBRFk7CisJY29udHJvbCA9IF9fc2V0X3JlcXNlcShjaGFuLCBjaGFuLT5idWZmZXJfc2VxKTsKKwljb250cm9sIHw9IF9fc2V0X2N0cmxfc3VwZXIoY2hhbiwgTDJDQVBfU1VQRVJfUk5SKTsKIAlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIAogCXNldF9iaXQoQ09OTl9STlJfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpOwpAQCAtMzI0NywxMyArMzcxMCwxNCBAQAogCiBzdGF0aWMgdm9pZCBsMmNhcF9lcnRtX2V4aXRfbG9jYWxfYnVzeShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKIHsKLQl1MTYgY29udHJvbDsKKwl1MzIgY29udHJvbDsKIAogCWlmICghdGVzdF9iaXQoQ09OTl9STlJfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQogCQlnb3RvIGRvbmU7CiAKLQljb250cm9sID0gY2hhbi0+YnVmZmVyX3NlcSA8PCBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVDsKLQljb250cm9sIHw9IEwyQ0FQX1NVUEVSX1JDVl9SRUFEWSB8IEwyQ0FQX0NUUkxfUE9MTDsKKwljb250cm9sID0gX19zZXRfcmVxc2VxKGNoYW4sIGNoYW4tPmJ1ZmZlcl9zZXEpOworCWNvbnRyb2wgfD0gX19zZXRfY3RybF9wb2xsKGNoYW4pOworCWNvbnRyb2wgfD0gX19zZXRfY3RybF9zdXBlcihjaGFuLCBMMkNBUF9TVVBFUl9SUik7CiAJbDJjYXBfc2VuZF9zZnJhbWUoY2hhbiwgY29udHJvbCk7CiAJY2hhbi0+cmV0cnlfY291bnQgPSAxOwogCkBAIC0zMjc5LDEwICszNzQzLDEwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9jaGVja19zcmVqX2dhcChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTggdHhfc2VxKQorc3RhdGljIHZvaWQgbDJjYXBfY2hlY2tfc3Jlal9nYXAoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiB0eF9zZXEpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1MTYgY29udHJvbDsKKwl1MzIgY29udHJvbDsKIAogCXdoaWxlICgoc2tiID0gc2tiX3BlZWsoJmNoYW4tPnNyZWpfcSkpICYmCiAJCQkhdGVzdF9iaXQoQ09OTl9MT0NBTF9CVVNZLCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKQEAgLTMyOTIsNyArMzc1Niw3IEBACiAJCQlicmVhazsKIAogCQlza2IgPSBza2JfZGVxdWV1ZSgmY2hhbi0+c3Jlal9xKTsKLQkJY29udHJvbCA9IGJ0X2NiKHNrYiktPnNhciA8PCBMMkNBUF9DVFJMX1NBUl9TSElGVDsKKwkJY29udHJvbCA9IF9fc2V0X2N0cmxfc2FyKGNoYW4sIGJ0X2NiKHNrYiktPnNhcik7CiAJCWVyciA9IGwyY2FwX3JlYXNzZW1ibGVfc2R1KGNoYW4sIHNrYiwgY29udHJvbCk7CiAKIAkJaWYgKGVyciA8IDApIHsKQEAgLTMzMDAsMTYgKzM3NjQsMTUgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJY2hhbi0+YnVmZmVyX3NlcV9zcmVqID0KLQkJCShjaGFuLT5idWZmZXJfc2VxX3NyZWogKyAxKSAlIDY0OwotCQl0eF9zZXEgPSAodHhfc2VxICsgMSkgJSA2NDsKKwkJY2hhbi0+YnVmZmVyX3NlcV9zcmVqID0gX19uZXh0X3NlcShjaGFuLCBjaGFuLT5idWZmZXJfc2VxX3NyZWopOworCQl0eF9zZXEgPSBfX25leHRfc2VxKGNoYW4sIHR4X3NlcSk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9yZXNlbmRfc3JlamZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1OCB0eF9zZXEpCitzdGF0aWMgdm9pZCBsMmNhcF9yZXNlbmRfc3JlamZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1MTYgdHhfc2VxKQogewogCXN0cnVjdCBzcmVqX2xpc3QgKmwsICp0bXA7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgdG1wLCAmY2hhbi0+c3Jlal9sLCBsaXN0KSB7CiAJCWlmIChsLT50eF9zZXEgPT0gdHhfc2VxKSB7CkBAIC0zMzE3LDQ1ICszNzgwLDQ4IEBACiAJCQlrZnJlZShsKTsKIAkJCXJldHVybjsKIAkJfQotCQljb250cm9sID0gTDJDQVBfU1VQRVJfU0VMRUNUX1JFSkVDVDsKLQkJY29udHJvbCB8PSBsLT50eF9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7CisJCWNvbnRyb2wgPSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1NSRUopOworCQljb250cm9sIHw9IF9fc2V0X3JlcXNlcShjaGFuLCBsLT50eF9zZXEpOwogCQlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIAkJbGlzdF9kZWwoJmwtPmxpc3QpOwogCQlsaXN0X2FkZF90YWlsKCZsLT5saXN0LCAmY2hhbi0+c3Jlal9sKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGwyY2FwX3NlbmRfc3JlamZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1OCB0eF9zZXEpCitzdGF0aWMgdm9pZCBsMmNhcF9zZW5kX3NyZWpmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IHR4X3NlcSkKIHsKIAlzdHJ1Y3Qgc3Jlal9saXN0ICpuZXc7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAKIAl3aGlsZSAodHhfc2VxICE9IGNoYW4tPmV4cGVjdGVkX3R4X3NlcSkgewotCQljb250cm9sID0gTDJDQVBfU1VQRVJfU0VMRUNUX1JFSkVDVDsKLQkJY29udHJvbCB8PSBjaGFuLT5leHBlY3RlZF90eF9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7CisJCWNvbnRyb2wgPSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1NSRUopOworCQljb250cm9sIHw9IF9fc2V0X3JlcXNlcShjaGFuLCBjaGFuLT5leHBlY3RlZF90eF9zZXEpOwogCQlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIAogCQluZXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3Jlal9saXN0KSwgR0ZQX0FUT01JQyk7CiAJCW5ldy0+dHhfc2VxID0gY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxOwotCQljaGFuLT5leHBlY3RlZF90eF9zZXEgPSAoY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxICsgMSkgJSA2NDsKKworCQljaGFuLT5leHBlY3RlZF90eF9zZXEgPSBfX25leHRfc2VxKGNoYW4sIGNoYW4tPmV4cGVjdGVkX3R4X3NlcSk7CisKIAkJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCAmY2hhbi0+c3Jlal9sKTsKIAl9Ci0JY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxID0gKGNoYW4tPmV4cGVjdGVkX3R4X3NlcSArIDEpICUgNjQ7CisKKwljaGFuLT5leHBlY3RlZF90eF9zZXEgPSBfX25leHRfc2VxKGNoYW4sIGNoYW4tPmV4cGVjdGVkX3R4X3NlcSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2RhdGFfY2hhbm5lbF9pZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiByeF9jb250cm9sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSBpbnQgbDJjYXBfZGF0YV9jaGFubmVsX2lmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTMyIHJ4X2NvbnRyb2wsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JdTggdHhfc2VxID0gX19nZXRfdHhzZXEocnhfY29udHJvbCk7Ci0JdTggcmVxX3NlcSA9IF9fZ2V0X3JlcXNlcShyeF9jb250cm9sKTsKLQl1OCBzYXIgPSByeF9jb250cm9sID4+IEwyQ0FQX0NUUkxfU0FSX1NISUZUOworCXUxNiB0eF9zZXEgPSBfX2dldF90eHNlcShjaGFuLCByeF9jb250cm9sKTsKKwl1MTYgcmVxX3NlcSA9IF9fZ2V0X3JlcXNlcShjaGFuLCByeF9jb250cm9sKTsKKwl1OCBzYXIgPSBfX2dldF9jdHJsX3NhcihjaGFuLCByeF9jb250cm9sKTsKIAlpbnQgdHhfc2VxX29mZnNldCwgZXhwZWN0ZWRfdHhfc2VxX29mZnNldDsKIAlpbnQgbnVtX3RvX2FjayA9IChjaGFuLT50eF93aW4vNikgKyAxOwogCWludCBlcnIgPSAwOwogCi0JQlRfREJHKCJjaGFuICVwIGxlbiAlZCB0eF9zZXEgJWQgcnhfY29udHJvbCAweCU0LjR4IiwgY2hhbiwgc2tiLT5sZW4sCisJQlRfREJHKCJjaGFuICVwIGxlbiAlZCB0eF9zZXEgJWQgcnhfY29udHJvbCAweCU4Ljh4IiwgY2hhbiwgc2tiLT5sZW4sCiAJCQkJCQkJdHhfc2VxLCByeF9jb250cm9sKTsKIAotCWlmIChMMkNBUF9DVFJMX0ZJTkFMICYgcnhfY29udHJvbCAmJgorCWlmIChfX2lzX2N0cmxfZmluYWwoY2hhbiwgcnhfY29udHJvbCkgJiYKIAkJCXRlc3RfYml0KENPTk5fV0FJVF9GLCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKIAkJX19jbGVhcl9tb25pdG9yX3RpbWVyKGNoYW4pOwogCQlpZiAoY2hhbi0+dW5hY2tlZF9mcmFtZXMgPiAwKQpAQCAtMzM2Niw5ICszODMyLDcgQEAKIAljaGFuLT5leHBlY3RlZF9hY2tfc2VxID0gcmVxX3NlcTsKIAlsMmNhcF9kcm9wX2Fja2VkX2ZyYW1lcyhjaGFuKTsKIAotCXR4X3NlcV9vZmZzZXQgPSAodHhfc2VxIC0gY2hhbi0+YnVmZmVyX3NlcSkgJSA2NDsKLQlpZiAodHhfc2VxX29mZnNldCA8IDApCi0JCXR4X3NlcV9vZmZzZXQgKz0gNjQ7CisJdHhfc2VxX29mZnNldCA9IF9fc2VxX29mZnNldChjaGFuLCB0eF9zZXEsIGNoYW4tPmJ1ZmZlcl9zZXEpOwogCiAJLyogaW52YWxpZCB0eF9zZXEgKi8KIAlpZiAodHhfc2VxX29mZnNldCA+PSBjaGFuLT50eF93aW4pIHsKQEAgLTM0MTYsMTAgKzM4ODAsOCBAQAogCQkJbDJjYXBfc2VuZF9zcmVqZnJhbWUoY2hhbiwgdHhfc2VxKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWV4cGVjdGVkX3R4X3NlcV9vZmZzZXQgPQotCQkJKGNoYW4tPmV4cGVjdGVkX3R4X3NlcSAtIGNoYW4tPmJ1ZmZlcl9zZXEpICUgNjQ7Ci0JCWlmIChleHBlY3RlZF90eF9zZXFfb2Zmc2V0IDwgMCkKLQkJCWV4cGVjdGVkX3R4X3NlcV9vZmZzZXQgKz0gNjQ7CisJCWV4cGVjdGVkX3R4X3NlcV9vZmZzZXQgPSBfX3NlcV9vZmZzZXQoY2hhbiwKKwkJCQljaGFuLT5leHBlY3RlZF90eF9zZXEsIGNoYW4tPmJ1ZmZlcl9zZXEpOwogCiAJCS8qIGR1cGxpY2F0ZWQgdHhfc2VxICovCiAJCWlmICh0eF9zZXFfb2Zmc2V0IDwgZXhwZWN0ZWRfdHhfc2VxX29mZnNldCkKQEAgLTM0NDQsNyArMzkwNiw3IEBACiAJcmV0dXJuIDA7CiAKIGV4cGVjdGVkOgotCWNoYW4tPmV4cGVjdGVkX3R4X3NlcSA9IChjaGFuLT5leHBlY3RlZF90eF9zZXEgKyAxKSAlIDY0OworCWNoYW4tPmV4cGVjdGVkX3R4X3NlcSA9IF9fbmV4dF9zZXEoY2hhbiwgY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxKTsKIAogCWlmICh0ZXN0X2JpdChDT05OX1NSRUpfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7CiAJCWJ0X2NiKHNrYiktPnR4X3NlcSA9IHR4X3NlcTsKQEAgLTM0NTQsMTMgKzM5MTYsMTQgQEAKIAl9CiAKIAllcnIgPSBsMmNhcF9yZWFzc2VtYmxlX3NkdShjaGFuLCBza2IsIHJ4X2NvbnRyb2wpOwotCWNoYW4tPmJ1ZmZlcl9zZXEgPSAoY2hhbi0+YnVmZmVyX3NlcSArIDEpICUgNjQ7CisJY2hhbi0+YnVmZmVyX3NlcSA9IF9fbmV4dF9zZXEoY2hhbiwgY2hhbi0+YnVmZmVyX3NlcSk7CisKIAlpZiAoZXJyIDwgMCkgewogCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNoYW4tPmNvbm4sIGNoYW4sIEVDT05OUkVTRVQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmIChyeF9jb250cm9sICYgTDJDQVBfQ1RSTF9GSU5BTCkgeworCWlmIChfX2lzX2N0cmxfZmluYWwoY2hhbiwgcnhfY29udHJvbCkpIHsKIAkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9SRUpfQUNULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCQlsMmNhcF9yZXRyYW5zbWl0X2ZyYW1lcyhjaGFuKTsKIAl9CkBAIC0zNDc4LDE1ICszOTQxLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9kYXRhX2NoYW5uZWxfcnJmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IHJ4X2NvbnRyb2wpCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfZGF0YV9jaGFubmVsX3JyZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUzMiByeF9jb250cm9sKQogewotCUJUX0RCRygiY2hhbiAlcCwgcmVxX3NlcSAlZCBjdHJsIDB4JTQuNHgiLCBjaGFuLCBfX2dldF9yZXFzZXEocnhfY29udHJvbCksCi0JCQkJCQlyeF9jb250cm9sKTsKKwlCVF9EQkcoImNoYW4gJXAsIHJlcV9zZXEgJWQgY3RybCAweCU4Ljh4IiwgY2hhbiwKKwkJCQlfX2dldF9yZXFzZXEoY2hhbiwgcnhfY29udHJvbCksIHJ4X2NvbnRyb2wpOwogCi0JY2hhbi0+ZXhwZWN0ZWRfYWNrX3NlcSA9IF9fZ2V0X3JlcXNlcShyeF9jb250cm9sKTsKKwljaGFuLT5leHBlY3RlZF9hY2tfc2VxID0gX19nZXRfcmVxc2VxKGNoYW4sIHJ4X2NvbnRyb2wpOwogCWwyY2FwX2Ryb3BfYWNrZWRfZnJhbWVzKGNoYW4pOwogCi0JaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX1BPTEwpIHsKKwlpZiAoX19pc19jdHJsX3BvbGwoY2hhbiwgcnhfY29udHJvbCkpIHsKIAkJc2V0X2JpdChDT05OX1NFTkRfRkJJVCwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCQlpZiAodGVzdF9iaXQoQ09OTl9TUkVKX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKSkgewogCQkJaWYgKHRlc3RfYml0KENPTk5fUkVNT1RFX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKSAmJgpAQCAtMzQ5OSw3ICszOTYyLDcgQEAKIAkJCWwyY2FwX3NlbmRfaV9vcl9ycl9vcl9ybnIoY2hhbik7CiAJCX0KIAotCX0gZWxzZSBpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfRklOQUwpIHsKKwl9IGVsc2UgaWYgKF9faXNfY3RybF9maW5hbChjaGFuLCByeF9jb250cm9sKSkgewogCQljbGVhcl9iaXQoQ09OTl9SRU1PVEVfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCiAJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KENPTk5fUkVKX0FDVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQpAQCAtMzUxOCwxOCArMzk4MSwxOCBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2RhdGFfY2hhbm5lbF9yZWpmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IHJ4X2NvbnRyb2wpCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfZGF0YV9jaGFubmVsX3JlamZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1MzIgcnhfY29udHJvbCkKIHsKLQl1OCB0eF9zZXEgPSBfX2dldF9yZXFzZXEocnhfY29udHJvbCk7CisJdTE2IHR4X3NlcSA9IF9fZ2V0X3JlcXNlcShjaGFuLCByeF9jb250cm9sKTsKIAotCUJUX0RCRygiY2hhbiAlcCwgcmVxX3NlcSAlZCBjdHJsIDB4JTQuNHgiLCBjaGFuLCB0eF9zZXEsIHJ4X2NvbnRyb2wpOworCUJUX0RCRygiY2hhbiAlcCwgcmVxX3NlcSAlZCBjdHJsIDB4JTguOHgiLCBjaGFuLCB0eF9zZXEsIHJ4X2NvbnRyb2wpOwogCiAJY2xlYXJfYml0KENPTk5fUkVNT1RFX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKTsKIAogCWNoYW4tPmV4cGVjdGVkX2Fja19zZXEgPSB0eF9zZXE7CiAJbDJjYXBfZHJvcF9hY2tlZF9mcmFtZXMoY2hhbik7CiAKLQlpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfRklOQUwpIHsKKwlpZiAoX19pc19jdHJsX2ZpbmFsKGNoYW4sIHJ4X2NvbnRyb2wpKSB7CiAJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KENPTk5fUkVKX0FDVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQogCQkJbDJjYXBfcmV0cmFuc21pdF9mcmFtZXMoY2hhbik7CiAJfSBlbHNlIHsKQEAgLTM1MzksMTUgKzQwMDIsMTUgQEAKIAkJCXNldF9iaXQoQ09OTl9SRUpfQUNULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJfQogfQotc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2RhdGFfY2hhbm5lbF9zcmVqZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiByeF9jb250cm9sKQorc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2RhdGFfY2hhbm5lbF9zcmVqZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUzMiByeF9jb250cm9sKQogewotCXU4IHR4X3NlcSA9IF9fZ2V0X3JlcXNlcShyeF9jb250cm9sKTsKKwl1MTYgdHhfc2VxID0gX19nZXRfcmVxc2VxKGNoYW4sIHJ4X2NvbnRyb2wpOwogCi0JQlRfREJHKCJjaGFuICVwLCByZXFfc2VxICVkIGN0cmwgMHglNC40eCIsIGNoYW4sIHR4X3NlcSwgcnhfY29udHJvbCk7CisJQlRfREJHKCJjaGFuICVwLCByZXFfc2VxICVkIGN0cmwgMHglOC44eCIsIGNoYW4sIHR4X3NlcSwgcnhfY29udHJvbCk7CiAKIAljbGVhcl9iaXQoQ09OTl9SRU1PVEVfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCi0JaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX1BPTEwpIHsKKwlpZiAoX19pc19jdHJsX3BvbGwoY2hhbiwgcnhfY29udHJvbCkpIHsKIAkJY2hhbi0+ZXhwZWN0ZWRfYWNrX3NlcSA9IHR4X3NlcTsKIAkJbDJjYXBfZHJvcF9hY2tlZF9mcmFtZXMoY2hhbik7CiAKQEAgLTM1NjAsNyArNDAyMyw3IEBACiAJCQljaGFuLT5zcmVqX3NhdmVfcmVxc2VxID0gdHhfc2VxOwogCQkJc2V0X2JpdChDT05OX1NSRUpfQUNULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJCX0KLQl9IGVsc2UgaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX0ZJTkFMKSB7CisJfSBlbHNlIGlmIChfX2lzX2N0cmxfZmluYWwoY2hhbiwgcnhfY29udHJvbCkpIHsKIAkJaWYgKHRlc3RfYml0KENPTk5fU1JFSl9BQ1QsICZjaGFuLT5jb25uX3N0YXRlKSAmJgogCQkJCWNoYW4tPnNyZWpfc2F2ZV9yZXFzZXEgPT0gdHhfc2VxKQogCQkJY2xlYXJfYml0KENPTk5fU1JFSl9BQ1QsICZjaGFuLT5jb25uX3N0YXRlKTsKQEAgLTM1NzUsMzcgKzQwMzgsMzkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9kYXRhX2NoYW5uZWxfcm5yZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiByeF9jb250cm9sKQorc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2RhdGFfY2hhbm5lbF9ybnJmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTMyIHJ4X2NvbnRyb2wpCiB7Ci0JdTggdHhfc2VxID0gX19nZXRfcmVxc2VxKHJ4X2NvbnRyb2wpOworCXUxNiB0eF9zZXEgPSBfX2dldF9yZXFzZXEoY2hhbiwgcnhfY29udHJvbCk7CiAKLQlCVF9EQkcoImNoYW4gJXAsIHJlcV9zZXEgJWQgY3RybCAweCU0LjR4IiwgY2hhbiwgdHhfc2VxLCByeF9jb250cm9sKTsKKwlCVF9EQkcoImNoYW4gJXAsIHJlcV9zZXEgJWQgY3RybCAweCU4Ljh4IiwgY2hhbiwgdHhfc2VxLCByeF9jb250cm9sKTsKIAogCXNldF9iaXQoQ09OTl9SRU1PVEVfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCWNoYW4tPmV4cGVjdGVkX2Fja19zZXEgPSB0eF9zZXE7CiAJbDJjYXBfZHJvcF9hY2tlZF9mcmFtZXMoY2hhbik7CiAKLQlpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfUE9MTCkKKwlpZiAoX19pc19jdHJsX3BvbGwoY2hhbiwgcnhfY29udHJvbCkpCiAJCXNldF9iaXQoQ09OTl9TRU5EX0ZCSVQsICZjaGFuLT5jb25uX3N0YXRlKTsKIAogCWlmICghdGVzdF9iaXQoQ09OTl9TUkVKX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKSkgewogCQlfX2NsZWFyX3JldHJhbnNfdGltZXIoY2hhbik7Ci0JCWlmIChyeF9jb250cm9sICYgTDJDQVBfQ1RSTF9QT0xMKQorCQlpZiAoX19pc19jdHJsX3BvbGwoY2hhbiwgcnhfY29udHJvbCkpCiAJCQlsMmNhcF9zZW5kX3JyX29yX3JucihjaGFuLCBMMkNBUF9DVFJMX0ZJTkFMKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChyeF9jb250cm9sICYgTDJDQVBfQ1RSTF9QT0xMKQorCWlmIChfX2lzX2N0cmxfcG9sbChjaGFuLCByeF9jb250cm9sKSkgewogCQlsMmNhcF9zZW5kX3NyZWp0YWlsKGNoYW4pOwotCWVsc2UKLQkJbDJjYXBfc2VuZF9zZnJhbWUoY2hhbiwgTDJDQVBfU1VQRVJfUkNWX1JFQURZKTsKKwl9IGVsc2UgeworCQlyeF9jb250cm9sID0gX19zZXRfY3RybF9zdXBlcihjaGFuLCBMMkNBUF9TVVBFUl9SUik7CisJCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIHJ4X2NvbnRyb2wpOworCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgbDJjYXBfZGF0YV9jaGFubmVsX3NmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IHJ4X2NvbnRyb2wsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9kYXRhX2NoYW5uZWxfc2ZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1MzIgcnhfY29udHJvbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlCVF9EQkcoImNoYW4gJXAgcnhfY29udHJvbCAweCU0LjR4IGxlbiAlZCIsIGNoYW4sIHJ4X2NvbnRyb2wsIHNrYi0+bGVuKTsKKwlCVF9EQkcoImNoYW4gJXAgcnhfY29udHJvbCAweCU4Ljh4IGxlbiAlZCIsIGNoYW4sIHJ4X2NvbnRyb2wsIHNrYi0+bGVuKTsKIAotCWlmIChMMkNBUF9DVFJMX0ZJTkFMICYgcnhfY29udHJvbCAmJgorCWlmIChfX2lzX2N0cmxfZmluYWwoY2hhbiwgcnhfY29udHJvbCkgJiYKIAkJCXRlc3RfYml0KENPTk5fV0FJVF9GLCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKIAkJX19jbGVhcl9tb25pdG9yX3RpbWVyKGNoYW4pOwogCQlpZiAoY2hhbi0+dW5hY2tlZF9mcmFtZXMgPiAwKQpAQCAtMzYxMywyMCArNDA3OCwyMCBAQAogCQljbGVhcl9iaXQoQ09OTl9XQUlUX0YsICZjaGFuLT5jb25uX3N0YXRlKTsKIAl9CiAKLQlzd2l0Y2ggKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX1NVUEVSVklTRSkgewotCWNhc2UgTDJDQVBfU1VQRVJfUkNWX1JFQURZOgorCXN3aXRjaCAoX19nZXRfY3RybF9zdXBlcihjaGFuLCByeF9jb250cm9sKSkgeworCWNhc2UgTDJDQVBfU1VQRVJfUlI6CiAJCWwyY2FwX2RhdGFfY2hhbm5lbF9ycmZyYW1lKGNoYW4sIHJ4X2NvbnRyb2wpOwogCQlicmVhazsKIAotCWNhc2UgTDJDQVBfU1VQRVJfUkVKRUNUOgorCWNhc2UgTDJDQVBfU1VQRVJfUkVKOgogCQlsMmNhcF9kYXRhX2NoYW5uZWxfcmVqZnJhbWUoY2hhbiwgcnhfY29udHJvbCk7CiAJCWJyZWFrOwogCi0JY2FzZSBMMkNBUF9TVVBFUl9TRUxFQ1RfUkVKRUNUOgorCWNhc2UgTDJDQVBfU1VQRVJfU1JFSjoKIAkJbDJjYXBfZGF0YV9jaGFubmVsX3NyZWpmcmFtZShjaGFuLCByeF9jb250cm9sKTsKIAkJYnJlYWs7CiAKLQljYXNlIEwyQ0FQX1NVUEVSX1JDVl9OT1RfUkVBRFk6CisJY2FzZSBMMkNBUF9TVVBFUl9STlI6CiAJCWwyY2FwX2RhdGFfY2hhbm5lbF9ybnJmcmFtZShjaGFuLCByeF9jb250cm9sKTsKIAkJYnJlYWs7CiAJfQpAQCAtMzYzOCwxMiArNDEwMywxMiBAQAogc3RhdGljIGludCBsMmNhcF9lcnRtX2RhdGFfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGwyY2FwX3BpKHNrKS0+Y2hhbjsKLQl1MTYgY29udHJvbDsKLQl1OCByZXFfc2VxOworCXUzMiBjb250cm9sOworCXUxNiByZXFfc2VxOwogCWludCBsZW4sIG5leHRfdHhfc2VxX29mZnNldCwgcmVxX3NlcV9vZmZzZXQ7CiAKLQljb250cm9sID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHNrYi0+ZGF0YSk7Ci0Jc2tiX3B1bGwoc2tiLCAyKTsKKwljb250cm9sID0gX19nZXRfY29udHJvbChjaGFuLCBza2ItPmRhdGEpOworCXNrYl9wdWxsKHNrYiwgX19jdHJsX3NpemUoY2hhbikpOwogCWxlbiA9IHNrYi0+bGVuOwogCiAJLyoKQEAgLTM2NTQsMjYgKzQxMTksMjMgQEAKIAlpZiAobDJjYXBfY2hlY2tfZmNzKGNoYW4sIHNrYikpCiAJCWdvdG8gZHJvcDsKIAotCWlmIChfX2lzX3Nhcl9zdGFydChjb250cm9sKSAmJiBfX2lzX2lmcmFtZShjb250cm9sKSkKLQkJbGVuIC09IDI7CisJaWYgKF9faXNfc2FyX3N0YXJ0KGNoYW4sIGNvbnRyb2wpICYmICFfX2lzX3NmcmFtZShjaGFuLCBjb250cm9sKSkKKwkJbGVuIC09IEwyQ0FQX1NEVUxFTl9TSVpFOwogCiAJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpCi0JCWxlbiAtPSAyOworCQlsZW4gLT0gTDJDQVBfRkNTX1NJWkU7CiAKIAlpZiAobGVuID4gY2hhbi0+bXBzKSB7CiAJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY2hhbi0+Y29ubiwgY2hhbiwgRUNPTk5SRVNFVCk7CiAJCWdvdG8gZHJvcDsKIAl9CiAKLQlyZXFfc2VxID0gX19nZXRfcmVxc2VxKGNvbnRyb2wpOwotCXJlcV9zZXFfb2Zmc2V0ID0gKHJlcV9zZXEgLSBjaGFuLT5leHBlY3RlZF9hY2tfc2VxKSAlIDY0OwotCWlmIChyZXFfc2VxX29mZnNldCA8IDApCi0JCXJlcV9zZXFfb2Zmc2V0ICs9IDY0OworCXJlcV9zZXEgPSBfX2dldF9yZXFzZXEoY2hhbiwgY29udHJvbCk7CiAKLQluZXh0X3R4X3NlcV9vZmZzZXQgPQotCQkoY2hhbi0+bmV4dF90eF9zZXEgLSBjaGFuLT5leHBlY3RlZF9hY2tfc2VxKSAlIDY0OwotCWlmIChuZXh0X3R4X3NlcV9vZmZzZXQgPCAwKQotCQluZXh0X3R4X3NlcV9vZmZzZXQgKz0gNjQ7CisJcmVxX3NlcV9vZmZzZXQgPSBfX3NlcV9vZmZzZXQoY2hhbiwgcmVxX3NlcSwgY2hhbi0+ZXhwZWN0ZWRfYWNrX3NlcSk7CisKKwluZXh0X3R4X3NlcV9vZmZzZXQgPSBfX3NlcV9vZmZzZXQoY2hhbiwgY2hhbi0+bmV4dF90eF9zZXEsCisJCQkJCQljaGFuLT5leHBlY3RlZF9hY2tfc2VxKTsKIAogCS8qIGNoZWNrIGZvciBpbnZhbGlkIHJlcS1zZXEgKi8KIAlpZiAocmVxX3NlcV9vZmZzZXQgPiBuZXh0X3R4X3NlcV9vZmZzZXQpIHsKQEAgLTM2ODEsNyArNDE0Myw3IEBACiAJCWdvdG8gZHJvcDsKIAl9CiAKLQlpZiAoX19pc19pZnJhbWUoY29udHJvbCkpIHsKKwlpZiAoIV9faXNfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpKSB7CiAJCWlmIChsZW4gPCAwKSB7CiAJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNoYW4tPmNvbm4sIGNoYW4sIEVDT05OUkVTRVQpOwogCQkJZ290byBkcm9wOwpAQCAtMzcwOSw4ICs0MTcxLDggQEAKIHsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbjsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMOwotCXUxNiBjb250cm9sOwotCXU4IHR4X3NlcTsKKwl1MzIgY29udHJvbDsKKwl1MTYgdHhfc2VxOwogCWludCBsZW47CiAKIAljaGFuID0gbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZChjb25uLCBjaWQpOwpAQCAtMzc1MSwyMyArNDIxMywyMyBAQAogCQlnb3RvIGRvbmU7CiAKIAljYXNlIEwyQ0FQX01PREVfU1RSRUFNSU5HOgotCQljb250cm9sID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHNrYi0+ZGF0YSk7Ci0JCXNrYl9wdWxsKHNrYiwgMik7CisJCWNvbnRyb2wgPSBfX2dldF9jb250cm9sKGNoYW4sIHNrYi0+ZGF0YSk7CisJCXNrYl9wdWxsKHNrYiwgX19jdHJsX3NpemUoY2hhbikpOwogCQlsZW4gPSBza2ItPmxlbjsKIAogCQlpZiAobDJjYXBfY2hlY2tfZmNzKGNoYW4sIHNrYikpCiAJCQlnb3RvIGRyb3A7CiAKLQkJaWYgKF9faXNfc2FyX3N0YXJ0KGNvbnRyb2wpKQotCQkJbGVuIC09IDI7CisJCWlmIChfX2lzX3Nhcl9zdGFydChjaGFuLCBjb250cm9sKSkKKwkJCWxlbiAtPSBMMkNBUF9TRFVMRU5fU0laRTsKIAogCQlpZiAoY2hhbi0+ZmNzID09IEwyQ0FQX0ZDU19DUkMxNikKLQkJCWxlbiAtPSAyOworCQkJbGVuIC09IEwyQ0FQX0ZDU19TSVpFOwogCi0JCWlmIChsZW4gPiBjaGFuLT5tcHMgfHwgbGVuIDwgMCB8fCBfX2lzX3NmcmFtZShjb250cm9sKSkKKwkJaWYgKGxlbiA+IGNoYW4tPm1wcyB8fCBsZW4gPCAwIHx8IF9faXNfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpKQogCQkJZ290byBkcm9wOwogCi0JCXR4X3NlcSA9IF9fZ2V0X3R4c2VxKGNvbnRyb2wpOworCQl0eF9zZXEgPSBfX2dldF90eHNlcShjaGFuLCBjb250cm9sKTsKIAogCQlpZiAoY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxICE9IHR4X3NlcSkgewogCQkJLyogRnJhbWUocykgbWlzc2luZyAtIG11c3QgZGlzY2FyZCBwYXJ0aWFsIFNEVSAqLwpAQCAtMzc3OSw3ICs0MjQxLDcgQEAKIAkJCS8qIFRPRE86IE5vdGlmeSB1c2VybGFuZCBvZiBtaXNzaW5nIGRhdGEgKi8KIAkJfQogCi0JCWNoYW4tPmV4cGVjdGVkX3R4X3NlcSA9ICh0eF9zZXEgKyAxKSAlIDY0OworCQljaGFuLT5leHBlY3RlZF90eF9zZXEgPSBfX25leHRfc2VxKGNoYW4sIHR4X3NlcSk7CiAKIAkJaWYgKGwyY2FwX3JlYXNzZW1ibGVfc2R1KGNoYW4sIHNrYiwgY29udHJvbCkgPT0gLUVNU0dTSVpFKQogCQkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjaGFuLT5jb25uLCBjaGFuLCBFQ09OTlJFU0VUKTsKQEAgLTM5MzMsMTIgKzQzOTUsMTIgQEAKIAogCQlpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgJmhkZXYtPmJkYWRkcikpIHsKIAkJCWxtMSB8PSBIQ0lfTE1fQUNDRVBUOwotCQkJaWYgKGMtPnJvbGVfc3dpdGNoKQorCQkJaWYgKHRlc3RfYml0KEZMQUdfUk9MRV9TV0lUQ0gsICZjLT5mbGFncykpCiAJCQkJbG0xIHw9IEhDSV9MTV9NQVNURVI7CiAJCQlleGFjdCsrOwogCQl9IGVsc2UgaWYgKCFiYWNtcCgmYnRfc2soc2spLT5zcmMsIEJEQUREUl9BTlkpKSB7CiAJCQlsbTIgfD0gSENJX0xNX0FDQ0VQVDsKLQkJCWlmIChjLT5yb2xlX3N3aXRjaCkKKwkJCWlmICh0ZXN0X2JpdChGTEFHX1JPTEVfU1dJVENILCAmYy0+ZmxhZ3MpKQogCQkJCWxtMiB8PSBIQ0lfTE1fTUFTVEVSOwogCQl9CiAJfQpAQCAtMzk3Myw3ICs0NDM1LDcgQEAKIAlCVF9EQkcoImhjb24gJXAiLCBoY29uKTsKIAogCWlmICgoaGNvbi0+dHlwZSAhPSBBQ0xfTElOSyAmJiBoY29uLT50eXBlICE9IExFX0xJTkspIHx8ICFjb25uKQotCQlyZXR1cm4gMHgxMzsKKwkJcmV0dXJuIEhDSV9FUlJPUl9SRU1PVEVfVVNFUl9URVJNOwogCiAJcmV0dXJuIGNvbm4tPmRpc2NfcmVhc29uOwogfQpAQCAtNDMwNiwzICs0NzY4LDYgQEAKIAogbW9kdWxlX3BhcmFtKGRpc2FibGVfZXJ0bSwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfZXJ0bSwgIkRpc2FibGUgZW5oYW5jZWQgcmV0cmFuc21pc3Npb24gbW9kZSIpOworCittb2R1bGVfcGFyYW0oZW5hYmxlX2hzLCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2hzLCAiRW5hYmxlIEhpZ2ggU3BlZWQiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKaW5kZXggZTgyOTIzNi4uZTJlNzg1YyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKQEAgLTI3LDYgKzI3LDcgQEAKIC8qIEJsdWV0b290aCBMMkNBUCBzb2NrZXRzLiAqLwogCiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgpAQCAtMzMzLDcgKzMzNCw3IEBACiAJCW9wdHMubW9kZSAgICAgPSBjaGFuLT5tb2RlOwogCQlvcHRzLmZjcyAgICAgID0gY2hhbi0+ZmNzOwogCQlvcHRzLm1heF90eCAgID0gY2hhbi0+bWF4X3R4OwotCQlvcHRzLnR4d2luX3NpemUgPSAoX191MTYpY2hhbi0+dHhfd2luOworCQlvcHRzLnR4d2luX3NpemUgPSBjaGFuLT50eF93aW47CiAKIAkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihvcHRzKSk7CiAJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAoY2hhciAqKSAmb3B0cywgbGVuKSkKQEAgLTM1OCwxMCArMzU5LDEwIEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChjaGFuLT5yb2xlX3N3aXRjaCkKKwkJaWYgKHRlc3RfYml0KEZMQUdfUk9MRV9TV0lUQ0gsICZjaGFuLT5mbGFncykpCiAJCQlvcHQgfD0gTDJDQVBfTE1fTUFTVEVSOwogCi0JCWlmIChjaGFuLT5mb3JjZV9yZWxpYWJsZSkKKwkJaWYgKHRlc3RfYml0KEZMQUdfRk9SQ0VfUkVMSUFCTEUsICZjaGFuLT5mbGFncykpCiAJCQlvcHQgfD0gTDJDQVBfTE1fUkVMSUFCTEU7CiAKIAkJaWYgKHB1dF91c2VyKG9wdCwgKHUzMiBfX3VzZXIgKikgb3B0dmFsKSkKQEAgLTQ0OCw3ICs0NDksOCBAQAogCQlicmVhazsKIAogCWNhc2UgQlRfRkxVU0hBQkxFOgotCQlpZiAocHV0X3VzZXIoY2hhbi0+Zmx1c2hhYmxlLCAodTMyIF9fdXNlciAqKSBvcHR2YWwpKQorCQlpZiAocHV0X3VzZXIodGVzdF9iaXQoRkxBR19GTFVTSEFCTEUsICZjaGFuLT5mbGFncyksCisJCQkJCQkodTMyIF9fdXNlciAqKSBvcHR2YWwpKQogCQkJZXJyID0gLUVGQVVMVDsKIAogCQlicmVhazsKQEAgLTQ2MCw3ICs0NjIsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlwd3IuZm9yY2VfYWN0aXZlID0gY2hhbi0+Zm9yY2VfYWN0aXZlOworCQlwd3IuZm9yY2VfYWN0aXZlID0gdGVzdF9iaXQoRkxBR19GT1JDRV9BQ1RJVkUsICZjaGFuLT5mbGFncyk7CiAKIAkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihwd3IpKTsKIAkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIChjaGFyICopICZwd3IsIGxlbikpCkBAIC00NjgsNiArNDcwLDE2IEBACiAKIAkJYnJlYWs7CiAKKwljYXNlIEJUX0NIQU5ORUxfUE9MSUNZOgorCQlpZiAoIWVuYWJsZV9ocykgeworCQkJZXJyID0gLUVOT1BST1RPT1BUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocHV0X3VzZXIoY2hhbi0+Y2hhbl9wb2xpY3ksICh1MzIgX191c2VyICopIG9wdHZhbCkpCisJCQllcnIgPSAtRUZBVUxUOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FTk9QUk9UT09QVDsKIAkJYnJlYWs7CkBAIC01MDIsNyArNTE0LDcgQEAKIAkJb3B0cy5tb2RlICAgICA9IGNoYW4tPm1vZGU7CiAJCW9wdHMuZmNzICAgICAgPSBjaGFuLT5mY3M7CiAJCW9wdHMubWF4X3R4ICAgPSBjaGFuLT5tYXhfdHg7Ci0JCW9wdHMudHh3aW5fc2l6ZSA9IChfX3UxNiljaGFuLT50eF93aW47CisJCW9wdHMudHh3aW5fc2l6ZSA9IGNoYW4tPnR4X3dpbjsKIAogCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNpemVvZihvcHRzKSwgb3B0bGVuKTsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopICZvcHRzLCBvcHR2YWwsIGxlbikpIHsKQEAgLTUxMCw3ICs1MjIsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAob3B0cy50eHdpbl9zaXplID4gTDJDQVBfREVGQVVMVF9UWF9XSU5ET1cpIHsKKwkJaWYgKG9wdHMudHh3aW5fc2l6ZSA+IEwyQ0FQX0RFRkFVTFRfRVhUX1dJTkRPVykgewogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CkBAIC01MzQsNyArNTQ2LDcgQEAKIAkJY2hhbi0+b210dSA9IG9wdHMub210dTsKIAkJY2hhbi0+ZmNzICA9IG9wdHMuZmNzOwogCQljaGFuLT5tYXhfdHggPSBvcHRzLm1heF90eDsKLQkJY2hhbi0+dHhfd2luID0gKF9fdTgpb3B0cy50eHdpbl9zaXplOworCQljaGFuLT50eF93aW4gPSBvcHRzLnR4d2luX3NpemU7CiAJCWJyZWFrOwogCiAJY2FzZSBMMkNBUF9MTToKQEAgLTU1MCw4ICs1NjIsMTUgQEAKIAkJaWYgKG9wdCAmIEwyQ0FQX0xNX1NFQ1VSRSkKIAkJCWNoYW4tPnNlY19sZXZlbCA9IEJUX1NFQ1VSSVRZX0hJR0g7CiAKLQkJY2hhbi0+cm9sZV9zd2l0Y2ggICAgPSAob3B0ICYgTDJDQVBfTE1fTUFTVEVSKTsKLQkJY2hhbi0+Zm9yY2VfcmVsaWFibGUgPSAob3B0ICYgTDJDQVBfTE1fUkVMSUFCTEUpOworCQlpZiAob3B0ICYgTDJDQVBfTE1fTUFTVEVSKQorCQkJc2V0X2JpdChGTEFHX1JPTEVfU1dJVENILCAmY2hhbi0+ZmxhZ3MpOworCQllbHNlCisJCQljbGVhcl9iaXQoRkxBR19ST0xFX1NXSVRDSCwgJmNoYW4tPmZsYWdzKTsKKworCQlpZiAob3B0ICYgTDJDQVBfTE1fUkVMSUFCTEUpCisJCQlzZXRfYml0KEZMQUdfRk9SQ0VfUkVMSUFCTEUsICZjaGFuLT5mbGFncyk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdChGTEFHX0ZPUkNFX1JFTElBQkxFLCAmY2hhbi0+ZmxhZ3MpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC02NTcsNyArNjc2LDEwIEBACiAJCQl9CiAJCX0KIAotCQljaGFuLT5mbHVzaGFibGUgPSBvcHQ7CisJCWlmIChvcHQpCisJCQlzZXRfYml0KEZMQUdfRkxVU0hBQkxFLCAmY2hhbi0+ZmxhZ3MpOworCQllbHNlCisJCQljbGVhcl9iaXQoRkxBR19GTFVTSEFCTEUsICZjaGFuLT5mbGFncyk7CiAJCWJyZWFrOwogCiAJY2FzZSBCVF9QT1dFUjoKQEAgLTY3NCw3ICs2OTYsMzYgQEAKIAkJCWVyciA9IC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfQotCQljaGFuLT5mb3JjZV9hY3RpdmUgPSBwd3IuZm9yY2VfYWN0aXZlOworCisJCWlmIChwd3IuZm9yY2VfYWN0aXZlKQorCQkJc2V0X2JpdChGTEFHX0ZPUkNFX0FDVElWRSwgJmNoYW4tPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KEZMQUdfRk9SQ0VfQUNUSVZFLCAmY2hhbi0+ZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgQlRfQ0hBTk5FTF9QT0xJQ1k6CisJCWlmICghZW5hYmxlX2hzKSB7CisJCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChnZXRfdXNlcihvcHQsICh1MzIgX191c2VyICopIG9wdHZhbCkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChvcHQgPiBCVF9DSEFOTkVMX1BPTElDWV9BTVBfUFJFRkVSUkVEKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY2hhbi0+bW9kZSAhPSBMMkNBUF9NT0RFX0VSVE0gJiYKKwkJCQljaGFuLT5tb2RlICE9IEwyQ0FQX01PREVfU1RSRUFNSU5HKSB7CisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQl9CisKKwkJY2hhbi0+Y2hhbl9wb2xpY3kgPSAodTgpIG9wdDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNzA4LDcgKzc1OSw3IEBACiAJCXJldHVybiAtRU5PVENPTk47CiAJfQogCi0JZXJyID0gbDJjYXBfY2hhbl9zZW5kKGNoYW4sIG1zZywgbGVuKTsKKwllcnIgPSBsMmNhcF9jaGFuX3NlbmQoY2hhbiwgbXNnLCBsZW4sIHNrLT5za19wcmlvcml0eSk7CiAKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CkBAIC05MzAsMTEgKzk4MSw5IEBACiAJCWNoYW4tPmZjcyAgPSBwY2hhbi0+ZmNzOwogCQljaGFuLT5tYXhfdHggPSBwY2hhbi0+bWF4X3R4OwogCQljaGFuLT50eF93aW4gPSBwY2hhbi0+dHhfd2luOworCQljaGFuLT50eF93aW5fbWF4ID0gcGNoYW4tPnR4X3dpbl9tYXg7CiAJCWNoYW4tPnNlY19sZXZlbCA9IHBjaGFuLT5zZWNfbGV2ZWw7Ci0JCWNoYW4tPnJvbGVfc3dpdGNoID0gcGNoYW4tPnJvbGVfc3dpdGNoOwotCQljaGFuLT5mb3JjZV9yZWxpYWJsZSA9IHBjaGFuLT5mb3JjZV9yZWxpYWJsZTsKLQkJY2hhbi0+Zmx1c2hhYmxlID0gcGNoYW4tPmZsdXNoYWJsZTsKLQkJY2hhbi0+Zm9yY2VfYWN0aXZlID0gcGNoYW4tPmZvcmNlX2FjdGl2ZTsKKwkJY2hhbi0+ZmxhZ3MgPSBwY2hhbi0+ZmxhZ3M7CiAKIAkJc2VjdXJpdHlfc2tfY2xvbmUocGFyZW50LCBzayk7CiAJfSBlbHNlIHsKQEAgLTk2MywxMiArMTAxMiwxMCBAQAogCQljaGFuLT5tYXhfdHggPSBMMkNBUF9ERUZBVUxUX01BWF9UWDsKIAkJY2hhbi0+ZmNzICA9IEwyQ0FQX0ZDU19DUkMxNjsKIAkJY2hhbi0+dHhfd2luID0gTDJDQVBfREVGQVVMVF9UWF9XSU5ET1c7CisJCWNoYW4tPnR4X3dpbl9tYXggPSBMMkNBUF9ERUZBVUxUX1RYX1dJTkRPVzsKIAkJY2hhbi0+c2VjX2xldmVsID0gQlRfU0VDVVJJVFlfTE9XOwotCQljaGFuLT5yb2xlX3N3aXRjaCA9IDA7Ci0JCWNoYW4tPmZvcmNlX3JlbGlhYmxlID0gMDsKLQkJY2hhbi0+Zmx1c2hhYmxlID0gQlRfRkxVU0hBQkxFX09GRjsKLQkJY2hhbi0+Zm9yY2VfYWN0aXZlID0gQlRfUE9XRVJfRk9SQ0VfQUNUSVZFX09OOwotCisJCWNoYW4tPmZsYWdzID0gMDsKKwkJc2V0X2JpdChGTEFHX0ZPUkNFX0FDVElWRSwgJmNoYW4tPmZsYWdzKTsKIAl9CiAKIAkvKiBEZWZhdWx0IGNvbmZpZyBvcHRpb25zICovCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL21nbXQuYyBiL25ldC9ibHVldG9vdGgvbWdtdC5jCmluZGV4IDVjYWZmNGQuLjk0NzM5ZDMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbWdtdC5jCisrKyBiL25ldC9ibHVldG9vdGgvbWdtdC5jCkBAIC0yMyw2ICsyMyw3IEBACiAvKiBCbHVldG9vdGggSENJIE1hbmFnZW1lbnQgaW50ZXJmYWNlICovCiAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KQEAgLTMyLDIyICszMywyMyBAQAogI2RlZmluZSBNR01UX1ZFUlNJT04JMAogI2RlZmluZSBNR01UX1JFVklTSU9OCTEKIAorI2RlZmluZSBJTlFVSVJZX0xFTl9CUkVEUiAweDA4IC8qIFRHQVAoMTAwKSAqLworCiBzdHJ1Y3QgcGVuZGluZ19jbWQgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlfX3UxNiBvcGNvZGU7CisJdTE2IG9wY29kZTsKIAlpbnQgaW5kZXg7CiAJdm9pZCAqcGFyYW07CiAJc3RydWN0IHNvY2sgKnNrOwogCXZvaWQgKnVzZXJfZGF0YTsKIH07CiAKLXN0YXRpYyBMSVNUX0hFQUQoY21kX2xpc3QpOwotCiBzdGF0aWMgaW50IGNtZF9zdGF0dXMoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHUxNiBjbWQsIHU4IHN0YXR1cykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBtZ210X2hkciAqaGRyOwogCXN0cnVjdCBtZ210X2V2X2NtZF9zdGF0dXMgKmV2OworCWludCBlcnI7CiAKIAlCVF9EQkcoInNvY2sgJXAsIGluZGV4ICV1LCBjbWQgJXUsIHN0YXR1cyAldSIsIHNrLCBpbmRleCwgY21kLCBzdGF0dXMpOwogCkBAIC02NSwxMCArNjcsMTEgQEAKIAlldi0+c3RhdHVzID0gc3RhdHVzOwogCXB1dF91bmFsaWduZWRfbGUxNihjbWQsICZldi0+b3Bjb2RlKTsKIAotCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikgPCAwKQorCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKKwlpZiAoZXJyIDwgMCkKIAkJa2ZyZWVfc2tiKHNrYik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGNtZF9jb21wbGV0ZShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdTE2IGNtZCwgdm9pZCAqcnAsCkBAIC03Nyw2ICs4MCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKIAlzdHJ1Y3QgbWdtdF9ldl9jbWRfY29tcGxldGUgKmV2OworCWludCBlcnI7CiAKIAlCVF9EQkcoInNvY2sgJXAiLCBzayk7CiAKQEAgLTk2LDEwICsxMDAsMTEgQEAKIAlpZiAocnApCiAJCW1lbWNweShldi0+ZGF0YSwgcnAsIHJwX2xlbik7CiAKLQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpIDwgMCkKKwllcnIgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisJaWYgKGVyciA8IDApCiAJCWtmcmVlX3NrYihza2IpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjs7CiB9CiAKIHN0YXRpYyBpbnQgcmVhZF92ZXJzaW9uKHN0cnVjdCBzb2NrICpzaykKQEAgLTExOSw2ICsxMjQsNyBAQAogewogCXN0cnVjdCBtZ210X3JwX3JlYWRfaW5kZXhfbGlzdCAqcnA7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGNpX2RldiAqZDsKIAlzaXplX3QgcnBfbGVuOwogCXUxNiBjb3VudDsKIAlpbnQgaSwgZXJyOwpAQCAtMTQyLDEwICsxNDgsOSBAQAogCXB1dF91bmFsaWduZWRfbGUxNihjb3VudCwgJnJwLT5udW1fY29udHJvbGxlcnMpOwogCiAJaSA9IDA7Ci0JbGlzdF9mb3JfZWFjaChwLCAmaGNpX2Rldl9saXN0KSB7Ci0JCXN0cnVjdCBoY2lfZGV2ICpkID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2RldiwgbGlzdCk7Ci0KLQkJaGNpX2RlbF9vZmZfdGltZXIoZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmaGNpX2Rldl9saXN0LCBsaXN0KSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0FVVE9fT0ZGLCAmZC0+ZmxhZ3MpKQorCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZC0+cG93ZXJfb2ZmKTsKIAogCQlpZiAodGVzdF9iaXQoSENJX1NFVFVQLCAmZC0+ZmxhZ3MpKQogCQkJY29udGludWU7CkBAIC0xNzUsNyArMTgwLDggQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRUFEX0lORk8sIEVOT0RFVik7CiAKLQloY2lfZGVsX29mZl90aW1lcihoZGV2KTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmZsYWdzKSkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZGV2LT5wb3dlcl9vZmYpOwogCiAJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCkBAIC0yMjAsNyArMjI2LDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwZW5kaW5nX2NtZCAqbWdtdF9wZW5kaW5nX2FkZChzdHJ1Y3Qgc29jayAqc2ssIHUxNiBvcGNvZGUsCi0JCQkJCQl1MTYgaW5kZXgsIHZvaWQgKmRhdGEsIHUxNiBsZW4pCisJCQkJCQkJc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCQkJdm9pZCAqZGF0YSwgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKIApAQCAtMjI5LDcgKzIzNiw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJY21kLT5vcGNvZGUgPSBvcGNvZGU7Ci0JY21kLT5pbmRleCA9IGluZGV4OworCWNtZC0+aW5kZXggPSBoZGV2LT5pZDsKIAogCWNtZC0+cGFyYW0gPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFjbWQtPnBhcmFtKSB7CkBAIC0yNDMsNDggKzI1MCwzNiBAQAogCWNtZC0+c2sgPSBzazsKIAlzb2NrX2hvbGQoc2spOwogCi0JbGlzdF9hZGQoJmNtZC0+bGlzdCwgJmNtZF9saXN0KTsKKwlsaXN0X2FkZCgmY21kLT5saXN0LCAmaGRldi0+bWdtdF9wZW5kaW5nKTsKIAogCXJldHVybiBjbWQ7CiB9CiAKLXN0YXRpYyB2b2lkIG1nbXRfcGVuZGluZ19mb3JlYWNoKHUxNiBvcGNvZGUsIGludCBpbmRleCwKK3N0YXRpYyB2b2lkIG1nbXRfcGVuZGluZ19mb3JlYWNoKHUxNiBvcGNvZGUsIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAogCQkJCXZvaWQgKCpjYikoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpLAogCQkJCXZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJmNtZF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZoZGV2LT5tZ210X3BlbmRpbmcpIHsKIAkJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAKIAkJY21kID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgcGVuZGluZ19jbWQsIGxpc3QpOwogCi0JCWlmIChjbWQtPm9wY29kZSAhPSBvcGNvZGUpCi0JCQljb250aW51ZTsKLQotCQlpZiAoaW5kZXggPj0gMCAmJiBjbWQtPmluZGV4ICE9IGluZGV4KQorCQlpZiAob3Bjb2RlID4gMCAmJiBjbWQtPm9wY29kZSAhPSBvcGNvZGUpCiAJCQljb250aW51ZTsKIAogCQljYihjbWQsIGRhdGEpOwogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBwZW5kaW5nX2NtZCAqbWdtdF9wZW5kaW5nX2ZpbmQodTE2IG9wY29kZSwgaW50IGluZGV4KQorc3RhdGljIHN0cnVjdCBwZW5kaW5nX2NtZCAqbWdtdF9wZW5kaW5nX2ZpbmQodTE2IG9wY29kZSwgc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmNtZF9saXN0KSB7Ci0JCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwotCi0JCWNtZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHBlbmRpbmdfY21kLCBsaXN0KTsKLQotCQlpZiAoY21kLT5vcGNvZGUgIT0gb3Bjb2RlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGluZGV4ID49IDAgJiYgY21kLT5pbmRleCAhPSBpbmRleCkKLQkJCWNvbnRpbnVlOwotCi0JCXJldHVybiBjbWQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWQsICZoZGV2LT5tZ210X3BlbmRpbmcsIGxpc3QpIHsKKwkJaWYgKGNtZC0+b3Bjb2RlID09IG9wY29kZSkKKwkJCXJldHVybiBjbWQ7CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC0zMjIsMTIgKzMxNywxMiBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfUE9XRVJFRCwgaW5kZXgpKSB7CisJaWYgKG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX1BPV0VSRUQsIGhkZXYpKSB7CiAJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9QT1dFUkVELCBFQlVTWSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX1BPV0VSRUQsIGluZGV4LCBkYXRhLCBsZW4pOworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX1BPV0VSRUQsIGhkZXYsIGRhdGEsIGxlbik7CiAJaWYgKCFjbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CkBAIC0zMzYsNyArMzMxLDcgQEAKIAlpZiAoY3AtPnZhbCkKIAkJcXVldWVfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5wb3dlcl9vbik7CiAJZWxzZQotCQlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPnBvd2VyX29mZik7CisJCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+cG93ZXJfb2ZmLndvcmspOwogCiAJZXJyID0gMDsKIApAQCAtMzQ5LDcgKzM0NCw3IEBACiBzdGF0aWMgaW50IHNldF9kaXNjb3ZlcmFibGUoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCiAJCQkJCQkJCQl1MTYgbGVuKQogewotCXN0cnVjdCBtZ210X21vZGUgKmNwOworCXN0cnVjdCBtZ210X2NwX3NldF9kaXNjb3ZlcmFibGUgKmNwOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCXU4IHNjYW47CkBAIC0zNzMsOCArMzY4LDggQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JaWYgKG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwgaW5kZXgpIHx8Ci0JCQltZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaW5kZXgpKSB7CisJaWYgKG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwgaGRldikgfHwKKwkJCW1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBoZGV2KSkgewogCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBFQlVTWSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTM4NSw3ICszODAsNyBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsIGluZGV4LCBkYXRhLCBsZW4pOworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwgaGRldiwgZGF0YSwgbGVuKTsKIAlpZiAoIWNtZCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZDsKQEAgLTM5NSwxMSArMzkwLDE2IEBACiAKIAlpZiAoY3AtPnZhbCkKIAkJc2NhbiB8PSBTQ0FOX0lOUVVJUlk7CisJZWxzZQorCQljYW5jZWxfZGVsYXllZF93b3JrKCZoZGV2LT5kaXNjb3Zfb2ZmKTsKIAogCWVyciA9IGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfV1JJVEVfU0NBTl9FTkFCTEUsIDEsICZzY2FuKTsKIAlpZiAoZXJyIDwgMCkKIAkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogCisJaWYgKGNwLT52YWwpCisJCWhkZXYtPmRpc2Nvdl90aW1lb3V0ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZjcC0+dGltZW91dCk7CisKIGZhaWxlZDoKIAloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKQEAgLTQzNCw4ICs0MzQsOCBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBpbmRleCkgfHwKLQkJCW1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBpbmRleCkpIHsKKwlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KSB8fAorCQkJbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIGhkZXYpKSB7CiAJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgRUJVU1kpOwogCQlnb3RvIGZhaWxlZDsKIAl9CkBAIC00NDUsNyArNDQ1LDcgQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIGluZGV4LCBkYXRhLCBsZW4pOworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBoZGV2LCBkYXRhLCBsZW4pOwogCWlmICghY21kKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbGVkOwpAQCAtNDY3LDggKzQ2Nyw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBtZ210X2V2ZW50KHUxNiBldmVudCwgdTE2IGluZGV4LCB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4sCi0JCQkJCQkJc3RydWN0IHNvY2sgKnNraXBfc2spCitzdGF0aWMgaW50IG1nbXRfZXZlbnQodTE2IGV2ZW50LCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKKwkJCQkJdTE2IGRhdGFfbGVuLCBzdHJ1Y3Qgc29jayAqc2tpcF9zaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBtZ210X2hkciAqaGRyOwpAQCAtNDgxLDcgKzQ4MSwxMCBAQAogCiAJaGRyID0gKHZvaWQgKikgc2tiX3B1dChza2IsIHNpemVvZigqaGRyKSk7CiAJaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihldmVudCk7Ci0JaGRyLT5pbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKKwlpZiAoaGRldikKKwkJaGRyLT5pbmRleCA9IGNwdV90b19sZTE2KGhkZXYtPmlkKTsKKwllbHNlCisJCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihNR01UX0lOREVYX05PTkUpOwogCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoZGF0YV9sZW4pOwogCiAJaWYgKGRhdGEpCkBAIC01MzMsNyArNTM2LDcgQEAKIAogCWV2LnZhbCA9IGNwLT52YWw7CiAKLQllcnIgPSBtZ210X2V2ZW50KE1HTVRfRVZfUEFJUkFCTEUsIGluZGV4LCAmZXYsIHNpemVvZihldiksIHNrKTsKKwllcnIgPSBtZ210X2V2ZW50KE1HTVRfRVZfUEFJUkFCTEUsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwgc2spOwogCiBmYWlsZWQ6CiAJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CkBAIC01ODYsNyArNTg5LDcgQEAKIAl1MTYgZWlyX2xlbiA9IDA7CiAJdTE2IHV1aWQxNl9saXN0W0hDSV9NQVhfRUlSX0xFTkdUSCAvIHNpemVvZih1MTYpXTsKIAlpbnQgaSwgdHJ1bmNhdGVkID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBidF91dWlkICp1dWlkOwogCXNpemVfdCBuYW1lX2xlbjsKIAogCW5hbWVfbGVuID0gc3RybGVuKGhkZXYtPmRldl9uYW1lKTsKQEAgLTYxMSw4ICs2MTQsNyBAQAogCW1lbXNldCh1dWlkMTZfbGlzdCwgMCwgc2l6ZW9mKHV1aWQxNl9saXN0KSk7CiAKIAkvKiBHcm91cCBhbGwgVVVJRDE2IHR5cGVzICovCi0JbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+dXVpZHMpIHsKLQkJc3RydWN0IGJ0X3V1aWQgKnV1aWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBidF91dWlkLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHV1aWQsICZoZGV2LT51dWlkcywgbGlzdCkgewogCQl1MTYgdXVpZDE2OwogCiAJCXV1aWQxNiA9IGdldF91dWlkMTYodXVpZC0+dXVpZCk7CkBAIC02ODgsMTQgKzY5MCwxMSBAQAogCiBzdGF0aWMgdTggZ2V0X3NlcnZpY2VfY2xhc3NlcyhzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBidF91dWlkICp1dWlkOwogCXU4IHZhbCA9IDA7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZoZGV2LT51dWlkcykgewotCQlzdHJ1Y3QgYnRfdXVpZCAqdXVpZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJ0X3V1aWQsIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1dWlkLCAmaGRldi0+dXVpZHMsIGxpc3QpCiAJCXZhbCB8PSB1dWlkLT5zdmNfaGludDsKLQl9CiAKIAlyZXR1cm4gdmFsOwogfQpAQCAtODk0LDYgKzg5Myw5IEBACiAJaWYgKGVyciA9PSAwKQogCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBNR01UX09QX1NFVF9TRVJWSUNFX0NBQ0hFLCBOVUxMLAogCQkJCQkJCQkJMCk7CisJZWxzZQorCQljbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfU0VSVklDRV9DQUNIRSwgLWVycik7CisKIAogCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwpAQCAtOTAxLDMwICs5MDMsMzIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGxvYWRfa2V5cyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSwgdTE2IGxlbikKK3N0YXRpYyBpbnQgbG9hZF9saW5rX2tleXMoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkJCQkJCXUxNiBsZW4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7Ci0Jc3RydWN0IG1nbXRfY3BfbG9hZF9rZXlzICpjcDsKKwlzdHJ1Y3QgbWdtdF9jcF9sb2FkX2xpbmtfa2V5cyAqY3A7CiAJdTE2IGtleV9jb3VudCwgZXhwZWN0ZWRfbGVuOwogCWludCBpOwogCiAJY3AgPSAodm9pZCAqKSBkYXRhOwogCiAJaWYgKGxlbiA8IHNpemVvZigqY3ApKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0xPQURfTElOS19LRVlTLCBFSU5WQUwpOwogCiAJa2V5X2NvdW50ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZjcC0+a2V5X2NvdW50KTsKIAotCWV4cGVjdGVkX2xlbiA9IHNpemVvZigqY3ApICsga2V5X2NvdW50ICogc2l6ZW9mKHN0cnVjdCBtZ210X2tleV9pbmZvKTsKKwlleHBlY3RlZF9sZW4gPSBzaXplb2YoKmNwKSArIGtleV9jb3VudCAqCisJCQkJCXNpemVvZihzdHJ1Y3QgbWdtdF9saW5rX2tleV9pbmZvKTsKIAlpZiAoZXhwZWN0ZWRfbGVuICE9IGxlbikgewotCQlCVF9FUlIoImxvYWRfa2V5czogZXhwZWN0ZWQgJXUgYnl0ZXMsIGdvdCAldSBieXRlcyIsCisJCUJUX0VSUigibG9hZF9saW5rX2tleXM6IGV4cGVjdGVkICV1IGJ5dGVzLCBnb3QgJXUgYnl0ZXMiLAogCQkJCQkJCWxlbiwgZXhwZWN0ZWRfbGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9MT0FEX0xJTktfS0VZUywgRUlOVkFMKTsKIAl9CiAKIAloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwogCWlmICghaGRldikKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0xPQURfS0VZUywgRU5PREVWKTsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0xPQURfTElOS19LRVlTLCBFTk9ERVYpOwogCiAJQlRfREJHKCJoY2kldSBkZWJ1Z19rZXlzICV1IGtleV9jb3VudCAldSIsIGluZGV4LCBjcC0+ZGVidWdfa2V5cywKIAkJCQkJCQkJa2V5X2NvdW50KTsKQEAgLTk0MSw3ICs5NDUsNyBAQAogCQljbGVhcl9iaXQoSENJX0RFQlVHX0tFWVMsICZoZGV2LT5mbGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyBpKyspIHsKLQkJc3RydWN0IG1nbXRfa2V5X2luZm8gKmtleSA9ICZjcC0+a2V5c1tpXTsKKwkJc3RydWN0IG1nbXRfbGlua19rZXlfaW5mbyAqa2V5ID0gJmNwLT5rZXlzW2ldOwogCiAJCWhjaV9hZGRfbGlua19rZXkoaGRldiwgTlVMTCwgMCwgJmtleS0+YmRhZGRyLCBrZXktPnZhbCwga2V5LT50eXBlLAogCQkJCQkJCQlrZXktPnBpbl9sZW4pOwpAQCAtOTUzLDI3ICs5NTcsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZW1vdmVfa2V5KHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1MTYgbGVuKQorc3RhdGljIGludCByZW1vdmVfa2V5cyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCQkJCQkJdTE2IGxlbikKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKLQlzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfa2V5ICpjcDsKKwlzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfa2V5cyAqY3A7CiAJc3RydWN0IGhjaV9jb25uICpjb25uOwogCWludCBlcnI7CiAKIAljcCA9ICh2b2lkICopIGRhdGE7CiAKIAlpZiAobGVuICE9IHNpemVvZigqY3ApKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX0tFWSwgRUlOVkFMKTsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFTU9WRV9LRVlTLCBFSU5WQUwpOwogCiAJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKIAlpZiAoIWhkZXYpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfS0VZLCBFTk9ERVYpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX0tFWVMsIEVOT0RFVik7CiAKIAloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKIAllcnIgPSBoY2lfcmVtb3ZlX2xpbmtfa2V5KGhkZXYsICZjcC0+YmRhZGRyKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfS0VZLCAtZXJyKTsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX0tFWVMsIC1lcnIpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTEwMjUsNyArMTAzMCw3IEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX0RJU0NPTk5FQ1QsIGluZGV4KSkgeworCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX0RJU0NPTk5FQ1QsIGhkZXYpKSB7CiAJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0RJU0NPTk5FQ1QsIEVCVVNZKTsKIAkJZ290byBmYWlsZWQ7CiAJfQpAQCAtMTAzOSw3ICsxMDQ0LDcgQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9ESVNDT05ORUNULCBpbmRleCwgZGF0YSwgbGVuKTsKKwljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX0RJU0NPTk5FQ1QsIGhkZXYsIGRhdGEsIGxlbik7CiAJaWYgKCFjbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CkBAIC0xMDU5LDEwICsxMDY0LDIzIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHU4IGxpbmtfdG9fbWdtdCh1OCBsaW5rX3R5cGUpCit7CisJc3dpdGNoIChsaW5rX3R5cGUpIHsKKwljYXNlIExFX0xJTks6CisJCXJldHVybiBNR01UX0FERFJfTEU7CisJY2FzZSBBQ0xfTElOSzoKKwkJcmV0dXJuIE1HTVRfQUREUl9CUkVEUjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTUdNVF9BRERSX0lOVkFMSUQ7CisJfQorfQorCiBzdGF0aWMgaW50IGdldF9jb25uZWN0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCkKIHsKIAlzdHJ1Y3QgbWdtdF9ycF9nZXRfY29ubmVjdGlvbnMgKnJwOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCXN0cnVjdCBoY2lfY29ubiAqYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXNpemVfdCBycF9sZW47CiAJdTE2IGNvdW50OwpAQCAtMTA4MSw3ICsxMDk5LDcgQEAKIAkJY291bnQrKzsKIAl9CiAKLQlycF9sZW4gPSBzaXplb2YoKnJwKSArIChjb3VudCAqIHNpemVvZihiZGFkZHJfdCkpOworCXJwX2xlbiA9IHNpemVvZigqcnApICsgKGNvdW50ICogc2l6ZW9mKHN0cnVjdCBtZ210X2FkZHJfaW5mbykpOwogCXJwID0ga21hbGxvYyhycF9sZW4sIEdGUF9BVE9NSUMpOwogCWlmICghcnApIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTEwOTEsMTIgKzExMDksMTcgQEAKIAlwdXRfdW5hbGlnbmVkX2xlMTYoY291bnQsICZycC0+Y29ubl9jb3VudCk7CiAKIAlpID0gMDsKLQlsaXN0X2Zvcl9lYWNoKHAsICZoZGV2LT5jb25uX2hhc2gubGlzdCkgewotCQlzdHJ1Y3QgaGNpX2Nvbm4gKmMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfY29ubiwgbGlzdCk7Ci0KLQkJYmFjcHkoJnJwLT5jb25uW2krK10sICZjLT5kc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmhkZXYtPmNvbm5faGFzaC5saXN0LCBsaXN0KSB7CisJCWJhY3B5KCZycC0+YWRkcltpXS5iZGFkZHIsICZjLT5kc3QpOworCQlycC0+YWRkcltpXS50eXBlID0gbGlua190b19tZ210KGMtPnR5cGUpOworCQlpZiAocnAtPmFkZHJbaV0udHlwZSA9PSBNR01UX0FERFJfSU5WQUxJRCkKKwkJCWNvbnRpbnVlOworCQlpKys7CiAJfQogCisJLyogUmVjYWxjdWxhdGUgbGVuZ3RoIGluIGNhc2Ugb2YgZmlsdGVyZWQgU0NPIGNvbm5lY3Rpb25zLCBldGMgKi8KKwlycF9sZW4gPSBzaXplb2YoKnJwKSArIChpICogc2l6ZW9mKHN0cnVjdCBtZ210X2FkZHJfaW5mbykpOworCiAJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9HRVRfQ09OTkVDVElPTlMsIHJwLCBycF9sZW4pOwogCiB1bmxvY2s6CkBAIC0xMTEyLDcgKzExMzUsNyBAQAogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCWludCBlcnI7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX1BJTl9DT0RFX05FR19SRVBMWSwgaW5kZXgsIGNwLAorCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfUElOX0NPREVfTkVHX1JFUExZLCBoZGV2LCBjcCwKIAkJCQkJCQkJc2l6ZW9mKCpjcCkpOwogCWlmICghY21kKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTExNzMsNyArMTE5Niw3IEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfUElOX0NPREVfUkVQTFksIGluZGV4LCBkYXRhLCBsZW4pOworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfUElOX0NPREVfUkVQTFksIGhkZXYsIGRhdGEsIGxlbik7CiAJaWYgKCFjbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CkBAIC0xMjY0LDE5ICsxMjg3LDEyIEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwZW5kaW5nX2NtZCAqZmluZF9wYWlyaW5nKHN0cnVjdCBoY2lfY29ubiAqY29ubikKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmNtZF9saXN0KSB7Ci0JCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwotCi0JCWNtZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHBlbmRpbmdfY21kLCBsaXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY21kLCAmaGRldi0+bWdtdF9wZW5kaW5nLCBsaXN0KSB7CiAJCWlmIChjbWQtPm9wY29kZSAhPSBNR01UX09QX1BBSVJfREVWSUNFKQogCQkJY29udGludWU7CiAKLQkJaWYgKGNtZC0+aW5kZXggIT0gaGRldi0+aWQpCi0JCQljb250aW51ZTsKLQogCQlpZiAoY21kLT51c2VyX2RhdGEgIT0gY29ubikKIAkJCWNvbnRpbnVlOwogCkBAIC0xMzA5LDE2ICsxMzI1LDE5IEBACiBzdGF0aWMgdm9pZCBwYWlyaW5nX2NvbXBsZXRlX2NiKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgdTggc3RhdHVzKQogewogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKIAogCUJUX0RCRygic3RhdHVzICV1Iiwgc3RhdHVzKTsKIAotCWNtZCA9IGZpbmRfcGFpcmluZyhjb25uKTsKLQlpZiAoIWNtZCkgewotCQlCVF9EQkcoIlVuYWJsZSB0byBmaW5kIGEgcGVuZGluZyBjb21tYW5kIik7Ci0JCXJldHVybjsKLQl9CisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCi0JcGFpcmluZ19jb21wbGV0ZShjbWQsIHN0YXR1cyk7CisJY21kID0gZmluZF9wYWlyaW5nKGNvbm4pOworCWlmICghY21kKQorCQlCVF9EQkcoIlVuYWJsZSB0byBmaW5kIGEgcGVuZGluZyBjb21tYW5kIik7CisJZWxzZQorCQlwYWlyaW5nX2NvbXBsZXRlKGNtZCwgc3RhdHVzKTsKKworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwogfQogCiBzdGF0aWMgaW50IHBhaXJfZGV2aWNlKHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1MTYgbGVuKQpAQCAtMTM2OSw3ICsxMzg4LDcgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9QQUlSX0RFVklDRSwgaW5kZXgsIGRhdGEsIGxlbik7CisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9QQUlSX0RFVklDRSwgaGRldiwgZGF0YSwgbGVuKTsKIAlpZiAoIWNtZCkgewogCQllcnIgPSAtRU5PTUVNOwogCQloY2lfY29ubl9wdXQoY29ubik7CkBAIC0xNDMxLDcgKzE0NTAsNyBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBtZ210X29wLCBpbmRleCwgZGF0YSwgbGVuKTsKKwljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBtZ210X29wLCBoZGV2LCBkYXRhLCBsZW4pOwogCWlmICghY21kKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbGVkOwpAQCAtMTQ2OCw3ICsxNDg3LDcgQEAKIAogCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIGluZGV4LCBkYXRhLCBsZW4pOworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIGhkZXYsIGRhdGEsIGxlbik7CiAJaWYgKCFjbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CkBAIC0xNTE0LDEyICsxNTMzLDEyIEBACiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsIGluZGV4KSkgeworCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsIGhkZXYpKSB7CiAJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsIEVCVVNZKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBpbmRleCwgTlVMTCwgMCk7CisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBoZGV2LCBOVUxMLCAwKTsKIAlpZiAoIWNtZCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIHVubG9jazsKQEAgLTE2MDYsOCArMTYyNSw2IEBACiAKIHN0YXRpYyBpbnQgc3RhcnRfZGlzY292ZXJ5KHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4KQogewotCXU4IGxhcFszXSA9IHsgMHgzMywgMHg4YiwgMHg5ZSB9OwotCXN0cnVjdCBoY2lfY3BfaW5xdWlyeSBjcDsKIAlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKIAlpbnQgZXJyOwpAQCAtMTYyMCwxOCArMTYzNywxOCBAQAogCiAJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksIGluZGV4LCBOVUxMLCAwKTsKKwlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkgeworCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksIEVORVRET1dOKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksIGhkZXYsIE5VTEwsIDApOwogCWlmICghY21kKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOwotCW1lbWNweSgmY3AubGFwLCBsYXAsIDMpOwotCWNwLmxlbmd0aCAgPSAweDA4OwotCWNwLm51bV9yc3AgPSAweDAwOwotCi0JZXJyID0gaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9JTlFVSVJZLCBzaXplb2YoY3ApLCAmY3ApOworCWVyciA9IGhjaV9kb19pbnF1aXJ5KGhkZXYsIElOUVVJUllfTEVOX0JSRURSKTsKIAlpZiAoZXJyIDwgMCkKIAkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogCkBAIC0xNjU2LDEzICsxNjczLDEzIEBACiAKIAloY2lfZGV2X2xvY2tfYmgoaGRldik7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX1NUT1BfRElTQ09WRVJZLCBpbmRleCwgTlVMTCwgMCk7CisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TVE9QX0RJU0NPVkVSWSwgaGRldiwgTlVMTCwgMCk7CiAJaWYgKCFjbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JZXJyID0gaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9JTlFVSVJZX0NBTkNFTCwgMCwgTlVMTCk7CisJZXJyID0gaGNpX2NhbmNlbF9pbnF1aXJ5KGhkZXYpOwogCWlmIChlcnIgPCAwKQogCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKQEAgLTE2NzcsNyArMTY5NCw2IEBACiAJCQkJCQkJCXUxNiBsZW4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IG1nbXRfY3BfYmxvY2tfZGV2aWNlICpjcCA9ICh2b2lkICopIGRhdGE7CiAJaW50IGVycjsKIApAQCAtMTY5NCwyMyArMTcxMCwxMyBAQAogCiAJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9CTE9DS19ERVZJQ0UsIGluZGV4LCBOVUxMLCAwKTsKLQlpZiAoIWNtZCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KIAllcnIgPSBoY2lfYmxhY2tsaXN0X2FkZChoZGV2LCAmY3AtPmJkYWRkcik7Ci0KIAlpZiAoZXJyIDwgMCkKIAkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfQkxPQ0tfREVWSUNFLCAtZXJyKTsKIAllbHNlCiAJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfQkxPQ0tfREVWSUNFLAogCQkJCQkJCU5VTEwsIDApOwogCi0JbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwotCi1mYWlsZWQ6CiAJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKQEAgLTE3MjEsNyArMTcyNyw2IEBACiAJCQkJCQkJCXUxNiBsZW4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IG1nbXRfY3BfdW5ibG9ja19kZXZpY2UgKmNwID0gKHZvaWQgKikgZGF0YTsKIAlpbnQgZXJyOwogCkBAIC0xNzM4LDEyICsxNzQzLDYgQEAKIAogCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsIGluZGV4LCBOVUxMLCAwKTsKLQlpZiAoIWNtZCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KIAllcnIgPSBoY2lfYmxhY2tsaXN0X2RlbChoZGV2LCAmY3AtPmJkYWRkcik7CiAKIAlpZiAoZXJyIDwgMCkKQEAgLTE3NTIsOSArMTc1MSw2IEBACiAJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsCiAJCQkJCQkJCU5VTEwsIDApOwogCi0JbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwotCi1mYWlsZWQ6CiAJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKQEAgLTE4ODIsMTEgKzE4NzgsMTEgQEAKIAljYXNlIE1HTVRfT1BfU0VUX1NFUlZJQ0VfQ0FDSEU6CiAJCWVyciA9IHNldF9zZXJ2aWNlX2NhY2hlKHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLCBsZW4pOwogCQlicmVhazsKLQljYXNlIE1HTVRfT1BfTE9BRF9LRVlTOgotCQllcnIgPSBsb2FkX2tleXMoc2ssIGluZGV4LCBidWYgKyBzaXplb2YoKmhkciksIGxlbik7CisJY2FzZSBNR01UX09QX0xPQURfTElOS19LRVlTOgorCQllcnIgPSBsb2FkX2xpbmtfa2V5cyhzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwgbGVuKTsKIAkJYnJlYWs7Ci0JY2FzZSBNR01UX09QX1JFTU9WRV9LRVk6Ci0JCWVyciA9IHJlbW92ZV9rZXkoc2ssIGluZGV4LCBidWYgKyBzaXplb2YoKmhkciksIGxlbik7CisJY2FzZSBNR01UX09QX1JFTU9WRV9LRVlTOgorCQllcnIgPSByZW1vdmVfa2V5cyhzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwgbGVuKTsKIAkJYnJlYWs7CiAJY2FzZSBNR01UX09QX0RJU0NPTk5FQ1Q6CiAJCWVyciA9IGRpc2Nvbm5lY3Qoc2ssIGluZGV4LCBidWYgKyBzaXplb2YoKmhkciksIGxlbik7CkBAIC0xOTU3LDE0ICsxOTUzLDI2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG1nbXRfaW5kZXhfYWRkZWQodTE2IGluZGV4KQorc3RhdGljIHZvaWQgY21kX3N0YXR1c19yc3Aoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9JTkRFWF9BRERFRCwgaW5kZXgsIE5VTEwsIDAsIE5VTEwpOworCXU4ICpzdGF0dXMgPSBkYXRhOworCisJY21kX3N0YXR1cyhjbWQtPnNrLCBjbWQtPmluZGV4LCBjbWQtPm9wY29kZSwgKnN0YXR1cyk7CisJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogfQogCi1pbnQgbWdtdF9pbmRleF9yZW1vdmVkKHUxNiBpbmRleCkKK2ludCBtZ210X2luZGV4X2FkZGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewotCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfSU5ERVhfUkVNT1ZFRCwgaW5kZXgsIE5VTEwsIDAsIE5VTEwpOworCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfSU5ERVhfQURERUQsIGhkZXYsIE5VTEwsIDAsIE5VTEwpOworfQorCitpbnQgbWdtdF9pbmRleF9yZW1vdmVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXU4IHN0YXR1cyA9IEVOT0RFVjsKKworCW1nbXRfcGVuZGluZ19mb3JlYWNoKDAsIGhkZXYsIGNtZF9zdGF0dXNfcnNwLCAmc3RhdHVzKTsKKworCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfSU5ERVhfUkVNT1ZFRCwgaGRldiwgTlVMTCwgMCwgTlVMTCk7CiB9CiAKIHN0cnVjdCBjbWRfbG9va3VwIHsKQEAgLTE5OTIsMTcgKzIwMDAsMjIgQEAKIAltZ210X3BlbmRpbmdfZnJlZShjbWQpOwogfQogCi1pbnQgbWdtdF9wb3dlcmVkKHUxNiBpbmRleCwgdTggcG93ZXJlZCkKK2ludCBtZ210X3Bvd2VyZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHBvd2VyZWQpCiB7CiAJc3RydWN0IG1nbXRfbW9kZSBldjsKIAlzdHJ1Y3QgY21kX2xvb2t1cCBtYXRjaCA9IHsgcG93ZXJlZCwgTlVMTCB9OwogCWludCByZXQ7CiAKLQltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1NFVF9QT1dFUkVELCBpbmRleCwgbW9kZV9yc3AsICZtYXRjaCk7CisJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9TRVRfUE9XRVJFRCwgaGRldiwgbW9kZV9yc3AsICZtYXRjaCk7CisKKwlpZiAoIXBvd2VyZWQpIHsKKwkJdTggc3RhdHVzID0gRU5FVERPV047CisJCW1nbXRfcGVuZGluZ19mb3JlYWNoKDAsIGhkZXYsIGNtZF9zdGF0dXNfcnNwLCAmc3RhdHVzKTsKKwl9CiAKIAlldi52YWwgPSBwb3dlcmVkOwogCi0JcmV0ID0gbWdtdF9ldmVudChNR01UX0VWX1BPV0VSRUQsIGluZGV4LCAmZXYsIHNpemVvZihldiksIG1hdGNoLnNrKTsKKwlyZXQgPSBtZ210X2V2ZW50KE1HTVRfRVZfUE9XRVJFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBtYXRjaC5zayk7CiAKIAlpZiAobWF0Y2guc2spCiAJCXNvY2tfcHV0KG1hdGNoLnNrKTsKQEAgLTIwMTAsMTcgKzIwMjMsMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbWdtdF9kaXNjb3ZlcmFibGUodTE2IGluZGV4LCB1OCBkaXNjb3ZlcmFibGUpCitpbnQgbWdtdF9kaXNjb3ZlcmFibGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGRpc2NvdmVyYWJsZSkKIHsKIAlzdHJ1Y3QgbWdtdF9tb2RlIGV2OwogCXN0cnVjdCBjbWRfbG9va3VwIG1hdGNoID0geyBkaXNjb3ZlcmFibGUsIE5VTEwgfTsKIAlpbnQgcmV0OwogCi0JbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBpbmRleCwgbW9kZV9yc3AsICZtYXRjaCk7CisJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2LCBtb2RlX3JzcCwgJm1hdGNoKTsKIAogCWV2LnZhbCA9IGRpc2NvdmVyYWJsZTsKIAotCXJldCA9IG1nbXRfZXZlbnQoTUdNVF9FVl9ESVNDT1ZFUkFCTEUsIGluZGV4LCAmZXYsIHNpemVvZihldiksCisJcmV0ID0gbWdtdF9ldmVudChNR01UX0VWX0RJU0NPVkVSQUJMRSwgaGRldiwgJmV2LCBzaXplb2YoZXYpLAogCQkJCQkJCQltYXRjaC5zayk7CiAKIAlpZiAobWF0Y2guc2spCkBAIC0yMDI5LDE3ICsyMDQyLDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG1nbXRfY29ubmVjdGFibGUodTE2IGluZGV4LCB1OCBjb25uZWN0YWJsZSkKK2ludCBtZ210X2Nvbm5lY3RhYmxlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBjb25uZWN0YWJsZSkKIHsKIAlzdHJ1Y3QgbWdtdF9tb2RlIGV2OwogCXN0cnVjdCBjbWRfbG9va3VwIG1hdGNoID0geyBjb25uZWN0YWJsZSwgTlVMTCB9OwogCWludCByZXQ7CiAKLQltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaW5kZXgsIG1vZGVfcnNwLCAmbWF0Y2gpOworCW1nbXRfcGVuZGluZ19mb3JlYWNoKE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBoZGV2LCBtb2RlX3JzcCwgJm1hdGNoKTsKIAogCWV2LnZhbCA9IGNvbm5lY3RhYmxlOwogCi0JcmV0ID0gbWdtdF9ldmVudChNR01UX0VWX0NPTk5FQ1RBQkxFLCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLCBtYXRjaC5zayk7CisJcmV0ID0gbWdtdF9ldmVudChNR01UX0VWX0NPTk5FQ1RBQkxFLCBoZGV2LCAmZXYsIHNpemVvZihldiksIG1hdGNoLnNrKTsKIAogCWlmIChtYXRjaC5zaykKIAkJc29ja19wdXQobWF0Y2guc2spOwpAQCAtMjA0Nyw5ICsyMDYwLDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG1nbXRfbmV3X2tleSh1MTYgaW5kZXgsIHN0cnVjdCBsaW5rX2tleSAqa2V5LCB1OCBwZXJzaXN0ZW50KQoraW50IG1nbXRfd3JpdGVfc2Nhbl9mYWlsZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHNjYW4sIHU4IHN0YXR1cykKIHsKLQlzdHJ1Y3QgbWdtdF9ldl9uZXdfa2V5IGV2OworCWlmIChzY2FuICYgU0NBTl9QQUdFKQorCQltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaGRldiwKKwkJCQkJCWNtZF9zdGF0dXNfcnNwLCAmc3RhdHVzKTsKKworCWlmIChzY2FuICYgU0NBTl9JTlFVSVJZKQorCQltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsIGhkZXYsCisJCQkJCQljbWRfc3RhdHVzX3JzcCwgJnN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1nbXRfbmV3X2xpbmtfa2V5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3QgbGlua19rZXkgKmtleSwKKwkJCQkJCQkJdTggcGVyc2lzdGVudCkKK3sKKwlzdHJ1Y3QgbWdtdF9ldl9uZXdfbGlua19rZXkgZXY7CiAKIAltZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKIApAQCAtMjA1OSwxNyArMjA4NiwxNyBAQAogCW1lbWNweShldi5rZXkudmFsLCBrZXktPnZhbCwgMTYpOwogCWV2LmtleS5waW5fbGVuID0ga2V5LT5waW5fbGVuOwogCi0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9ORVdfS0VZLCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKKwlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX05FV19MSU5LX0tFWSwgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKIH0KIAotaW50IG1nbXRfY29ubmVjdGVkKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggbGlua190eXBlKQoraW50IG1nbXRfY29ubmVjdGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBsaW5rX3R5cGUpCiB7Ci0Jc3RydWN0IG1nbXRfZXZfY29ubmVjdGVkIGV2OworCXN0cnVjdCBtZ210X2FkZHJfaW5mbyBldjsKIAogCWJhY3B5KCZldi5iZGFkZHIsIGJkYWRkcik7Ci0JZXYubGlua190eXBlID0gbGlua190eXBlOworCWV2LnR5cGUgPSBsaW5rX3RvX21nbXQobGlua190eXBlKTsKIAotCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfQ09OTkVDVEVELCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKKwlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX0NPTk5FQ1RFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgZGlzY29ubmVjdF9yc3Aoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpCkBAIC0yMDg4LDE3ICsyMTE1LDE4IEBACiAJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogfQogCi1pbnQgbWdtdF9kaXNjb25uZWN0ZWQodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyKQoraW50IG1nbXRfZGlzY29ubmVjdGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCB0eXBlKQogewotCXN0cnVjdCBtZ210X2V2X2Rpc2Nvbm5lY3RlZCBldjsKKwlzdHJ1Y3QgbWdtdF9hZGRyX2luZm8gZXY7CiAJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKIAlpbnQgZXJyOwogCi0JbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9ESVNDT05ORUNULCBpbmRleCwgZGlzY29ubmVjdF9yc3AsICZzayk7CisJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9ESVNDT05ORUNULCBoZGV2LCBkaXNjb25uZWN0X3JzcCwgJnNrKTsKIAogCWJhY3B5KCZldi5iZGFkZHIsIGJkYWRkcik7CisJZXYudHlwZSA9IGxpbmtfdG9fbWdtdCh0eXBlKTsKIAotCWVyciA9IG1nbXRfZXZlbnQoTUdNVF9FVl9ESVNDT05ORUNURUQsIGluZGV4LCAmZXYsIHNpemVvZihldiksIHNrKTsKKwllcnIgPSBtZ210X2V2ZW50KE1HTVRfRVZfRElTQ09OTkVDVEVELCBoZGV2LCAmZXYsIHNpemVvZihldiksIHNrKTsKIAogCWlmIChzaykKIAkJc29ja19wdXQoc2spOwpAQCAtMjEwNiw1NyArMjEzNCw2MCBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBtZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKHUxNiBpbmRleCkKK2ludCBtZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCWludCBlcnI7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX0RJU0NPTk5FQ1QsIGluZGV4KTsKKwljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX0RJU0NPTk5FQ1QsIGhkZXYpOwogCWlmICghY21kKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWVyciA9IGNtZF9zdGF0dXMoY21kLT5zaywgaW5kZXgsIE1HTVRfT1BfRElTQ09OTkVDVCwgRUlPKTsKKwllcnIgPSBjbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX0RJU0NPTk5FQ1QsIEVJTyk7CiAKIAltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbWdtdF9jb25uZWN0X2ZhaWxlZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cykKK2ludCBtZ210X2Nvbm5lY3RfZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCB0eXBlLAorCQkJCQkJCQl1OCBzdGF0dXMpCiB7CiAJc3RydWN0IG1nbXRfZXZfY29ubmVjdF9mYWlsZWQgZXY7CiAKLQliYWNweSgmZXYuYmRhZGRyLCBiZGFkZHIpOworCWJhY3B5KCZldi5hZGRyLmJkYWRkciwgYmRhZGRyKTsKKwlldi5hZGRyLnR5cGUgPSBsaW5rX3RvX21nbXQodHlwZSk7CiAJZXYuc3RhdHVzID0gc3RhdHVzOwogCi0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9DT05ORUNUX0ZBSUxFRCwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9DT05ORUNUX0ZBSUxFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKIH0KIAotaW50IG1nbXRfcGluX2NvZGVfcmVxdWVzdCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHNlY3VyZSkKK2ludCBtZ210X3Bpbl9jb2RlX3JlcXVlc3Qoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHNlY3VyZSkKIHsKIAlzdHJ1Y3QgbWdtdF9ldl9waW5fY29kZV9yZXF1ZXN0IGV2OwogCiAJYmFjcHkoJmV2LmJkYWRkciwgYmRhZGRyKTsKIAlldi5zZWN1cmUgPSBzZWN1cmU7CiAKLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX1BJTl9DT0RFX1JFUVVFU1QsIGluZGV4LCAmZXYsIHNpemVvZihldiksCisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9QSU5fQ09ERV9SRVFVRVNULCBoZGV2LCAmZXYsIHNpemVvZihldiksCiAJCQkJCQkJCQlOVUxMKTsKIH0KIAotaW50IG1nbXRfcGluX2NvZGVfcmVwbHlfY29tcGxldGUodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBzdGF0dXMpCitpbnQgbWdtdF9waW5fY29kZV9yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwKKwkJCQkJCQkJdTggc3RhdHVzKQogewogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBtZ210X3JwX3Bpbl9jb2RlX3JlcGx5IHJwOwogCWludCBlcnI7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1BJTl9DT0RFX1JFUExZLCBpbmRleCk7CisJY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9QSU5fQ09ERV9SRVBMWSwgaGRldik7CiAJaWYgKCFjbWQpCiAJCXJldHVybiAtRU5PRU5UOwogCiAJYmFjcHkoJnJwLmJkYWRkciwgYmRhZGRyKTsKIAlycC5zdGF0dXMgPSBzdGF0dXM7CiAKLQllcnIgPSBjbWRfY29tcGxldGUoY21kLT5zaywgaW5kZXgsIE1HTVRfT1BfUElOX0NPREVfUkVQTFksICZycCwKKwllcnIgPSBjbWRfY29tcGxldGUoY21kLT5zaywgaGRldi0+aWQsIE1HTVRfT1BfUElOX0NPREVfUkVQTFksICZycCwKIAkJCQkJCQkJc2l6ZW9mKHJwKSk7CiAKIAltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CkBAIC0yMTY0LDIwICsyMTk1LDIxIEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG1nbXRfcGluX2NvZGVfbmVnX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzKQoraW50IG1nbXRfcGluX2NvZGVfbmVnX3JlcGx5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAorCQkJCQkJCQl1OCBzdGF0dXMpCiB7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IG1nbXRfcnBfcGluX2NvZGVfcmVwbHkgcnA7CiAJaW50IGVycjsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfUElOX0NPREVfTkVHX1JFUExZLCBpbmRleCk7CisJY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFksIGhkZXYpOwogCWlmICghY21kKQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWJhY3B5KCZycC5iZGFkZHIsIGJkYWRkcik7CiAJcnAuc3RhdHVzID0gc3RhdHVzOwogCi0JZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGluZGV4LCBNR01UX09QX1BJTl9DT0RFX05FR19SRVBMWSwgJnJwLAorCWVyciA9IGNtZF9jb21wbGV0ZShjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFksICZycCwKIAkJCQkJCQkJc2l6ZW9mKHJwKSk7CiAKIAltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CkBAIC0yMTg1LDk3ICsyMjE3LDkzIEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG1nbXRfdXNlcl9jb25maXJtX3JlcXVlc3QodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCBfX2xlMzIgdmFsdWUsCi0JCQkJCQkJdTggY29uZmlybV9oaW50KQoraW50IG1nbXRfdXNlcl9jb25maXJtX3JlcXVlc3Qoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCisJCQkJCQlfX2xlMzIgdmFsdWUsIHU4IGNvbmZpcm1faGludCkKIHsKIAlzdHJ1Y3QgbWdtdF9ldl91c2VyX2NvbmZpcm1fcmVxdWVzdCBldjsKIAotCUJUX0RCRygiaGNpJXUiLCBpbmRleCk7CisJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwogCiAJYmFjcHkoJmV2LmJkYWRkciwgYmRhZGRyKTsKIAlldi5jb25maXJtX2hpbnQgPSBjb25maXJtX2hpbnQ7CiAJcHV0X3VuYWxpZ25lZF9sZTMyKHZhbHVlLCAmZXYudmFsdWUpOwogCi0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9VU0VSX0NPTkZJUk1fUkVRVUVTVCwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwKKwlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX1VTRVJfQ09ORklSTV9SRVFVRVNULCBoZGV2LCAmZXYsIHNpemVvZihldiksCiAJCQkJCQkJCQlOVUxMKTsKIH0KIAotc3RhdGljIGludCBjb25maXJtX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzLAotCQkJCQkJCQl1OCBvcGNvZGUpCitzdGF0aWMgaW50IGNvbmZpcm1fcmVwbHlfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCisJCQkJCQkJdTggc3RhdHVzLCB1OCBvcGNvZGUpCiB7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IG1nbXRfcnBfdXNlcl9jb25maXJtX3JlcGx5IHJwOwogCWludCBlcnI7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChvcGNvZGUsIGluZGV4KTsKKwljbWQgPSBtZ210X3BlbmRpbmdfZmluZChvcGNvZGUsIGhkZXYpOwogCWlmICghY21kKQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWJhY3B5KCZycC5iZGFkZHIsIGJkYWRkcik7CiAJcnAuc3RhdHVzID0gc3RhdHVzOwotCWVyciA9IGNtZF9jb21wbGV0ZShjbWQtPnNrLCBpbmRleCwgb3Bjb2RlLCAmcnAsIHNpemVvZihycCkpOworCWVyciA9IGNtZF9jb21wbGV0ZShjbWQtPnNrLCBoZGV2LT5pZCwgb3Bjb2RlLCAmcnAsIHNpemVvZihycCkpOwogCiAJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG1nbXRfdXNlcl9jb25maXJtX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzKQoraW50IG1nbXRfdXNlcl9jb25maXJtX3JlcGx5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAorCQkJCQkJCQl1OCBzdGF0dXMpCiB7Ci0JcmV0dXJuIGNvbmZpcm1fcmVwbHlfY29tcGxldGUoaW5kZXgsIGJkYWRkciwgc3RhdHVzLAorCXJldHVybiBjb25maXJtX3JlcGx5X2NvbXBsZXRlKGhkZXYsIGJkYWRkciwgc3RhdHVzLAogCQkJCQkJTUdNVF9PUF9VU0VSX0NPTkZJUk1fUkVQTFkpOwogfQogCi1pbnQgbWdtdF91c2VyX2NvbmZpcm1fbmVnX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzKQoraW50IG1nbXRfdXNlcl9jb25maXJtX25lZ19yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJCWJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cykKIHsKLQlyZXR1cm4gY29uZmlybV9yZXBseV9jb21wbGV0ZShpbmRleCwgYmRhZGRyLCBzdGF0dXMsCisJcmV0dXJuIGNvbmZpcm1fcmVwbHlfY29tcGxldGUoaGRldiwgYmRhZGRyLCBzdGF0dXMsCiAJCQkJCU1HTVRfT1BfVVNFUl9DT05GSVJNX05FR19SRVBMWSk7CiB9CiAKLWludCBtZ210X2F1dGhfZmFpbGVkKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzKQoraW50IG1nbXRfYXV0aF9mYWlsZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cykKIHsKIAlzdHJ1Y3QgbWdtdF9ldl9hdXRoX2ZhaWxlZCBldjsKIAogCWJhY3B5KCZldi5iZGFkZHIsIGJkYWRkcik7CiAJZXYuc3RhdHVzID0gc3RhdHVzOwogCi0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9BVVRIX0ZBSUxFRCwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9BVVRIX0ZBSUxFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKIH0KIAotaW50IG1nbXRfc2V0X2xvY2FsX25hbWVfY29tcGxldGUodTE2IGluZGV4LCB1OCAqbmFtZSwgdTggc3RhdHVzKQoraW50IG1nbXRfc2V0X2xvY2FsX25hbWVfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICpuYW1lLCB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7Ci0Jc3RydWN0IGhjaV9kZXYgKmhkZXY7CiAJc3RydWN0IG1nbXRfY3Bfc2V0X2xvY2FsX25hbWUgZXY7CiAJaW50IGVycjsKIAogCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwogCW1lbWNweShldi5uYW1lLCBuYW1lLCBIQ0lfTUFYX05BTUVfTEVOR1RIKTsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIGluZGV4KTsKKwljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9MT0NBTF9OQU1FLCBoZGV2KTsKIAlpZiAoIWNtZCkKIAkJZ290byBzZW5kX2V2ZW50OwogCiAJaWYgKHN0YXR1cykgewotCQllcnIgPSBjbWRfc3RhdHVzKGNtZC0+c2ssIGluZGV4LCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCBFSU8pOworCQllcnIgPSBjbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLAorCQkJCQkJCQkJRUlPKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKLQlpZiAoaGRldikgewotCQloY2lfZGV2X2xvY2tfYmgoaGRldik7Ci0JCXVwZGF0ZV9laXIoaGRldik7Ci0JCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwotCQloY2lfZGV2X3B1dChoZGV2KTsKLQl9CisJdXBkYXRlX2VpcihoZGV2KTsKIAotCWVyciA9IGNtZF9jb21wbGV0ZShjbWQtPnNrLCBpbmRleCwgTUdNVF9PUF9TRVRfTE9DQUxfTkFNRSwgJmV2LAorCWVyciA9IGNtZF9jb21wbGV0ZShjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTE9DQUxfTkFNRSwgJmV2LAogCQkJCQkJCQlzaXplb2YoZXYpKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmYWlsZWQ7CiAKIHNlbmRfZXZlbnQ6Ci0JZXJyID0gbWdtdF9ldmVudChNR01UX0VWX0xPQ0FMX05BTUVfQ0hBTkdFRCwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwKKwllcnIgPSBtZ210X2V2ZW50KE1HTVRfRVZfTE9DQUxfTkFNRV9DSEFOR0VELCBoZGV2LCAmZXYsIHNpemVvZihldiksCiAJCQkJCQkJY21kID8gY21kLT5zayA6IE5VTEwpOwogCiBmYWlsZWQ6CkBAIC0yMjg0LDI5ICsyMzEyLDMwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG1nbXRfcmVhZF9sb2NhbF9vb2JfZGF0YV9yZXBseV9jb21wbGV0ZSh1MTYgaW5kZXgsIHU4ICpoYXNoLCB1OCAqcmFuZG9taXplciwKLQkJCQkJCQkJdTggc3RhdHVzKQoraW50IG1nbXRfcmVhZF9sb2NhbF9vb2JfZGF0YV9yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKmhhc2gsCisJCQkJCQl1OCAqcmFuZG9taXplciwgdTggc3RhdHVzKQogewogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCWludCBlcnI7CiAKLQlCVF9EQkcoImhjaSV1IHN0YXR1cyAldSIsIGluZGV4LCBzdGF0dXMpOworCUJUX0RCRygiJXMgc3RhdHVzICV1IiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwgaW5kZXgpOworCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwgaGRldik7CiAJaWYgKCFjbWQpCiAJCXJldHVybiAtRU5PRU5UOwogCiAJaWYgKHN0YXR1cykgewotCQllcnIgPSBjbWRfc3RhdHVzKGNtZC0+c2ssIGluZGV4LCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCi0JCQkJCQkJCQlFSU8pOworCQllcnIgPSBjbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLAorCQkJCQlNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsIEVJTyk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IG1nbXRfcnBfcmVhZF9sb2NhbF9vb2JfZGF0YSBycDsKIAogCQltZW1jcHkocnAuaGFzaCwgaGFzaCwgc2l6ZW9mKHJwLmhhc2gpKTsKIAkJbWVtY3B5KHJwLnJhbmRvbWl6ZXIsIHJhbmRvbWl6ZXIsIHNpemVvZihycC5yYW5kb21pemVyKSk7CiAKLQkJZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGluZGV4LCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCi0JCQkJCQkJJnJwLCBzaXplb2YocnApKTsKKwkJZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGhkZXYtPmlkLAorCQkJCQkJTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLAorCQkJCQkJJnJwLCBzaXplb2YocnApKTsKIAl9CiAKIAltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CkBAIC0yMzE0LDE0ICsyMzQzLDE1IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG1nbXRfZGV2aWNlX2ZvdW5kKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggKmRldl9jbGFzcywgczggcnNzaSwKLQkJCQkJCQkJdTggKmVpcikKK2ludCBtZ210X2RldmljZV9mb3VuZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgdTggdHlwZSwKKwkJCQkJdTggKmRldl9jbGFzcywgczggcnNzaSwgdTggKmVpcikKIHsKIAlzdHJ1Y3QgbWdtdF9ldl9kZXZpY2VfZm91bmQgZXY7CiAKIAltZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKIAotCWJhY3B5KCZldi5iZGFkZHIsIGJkYWRkcik7CisJYmFjcHkoJmV2LmFkZHIuYmRhZGRyLCBiZGFkZHIpOworCWV2LmFkZHIudHlwZSA9IGxpbmtfdG9fbWdtdCh0eXBlKTsKIAlldi5yc3NpID0gcnNzaTsKIAogCWlmIChlaXIpCkBAIC0yMzMwLDEwICsyMzYwLDEwIEBACiAJaWYgKGRldl9jbGFzcykKIAkJbWVtY3B5KGV2LmRldl9jbGFzcywgZGV2X2NsYXNzLCBzaXplb2YoZXYuZGV2X2NsYXNzKSk7CiAKLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX0RFVklDRV9GT1VORCwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9ERVZJQ0VfRk9VTkQsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CiB9CiAKLWludCBtZ210X3JlbW90ZV9uYW1lKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggKm5hbWUpCitpbnQgbWdtdF9yZW1vdGVfbmFtZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgdTggKm5hbWUpCiB7CiAJc3RydWN0IG1nbXRfZXZfcmVtb3RlX25hbWUgZXY7CiAKQEAgLTIzNDIsMzcgKzIzNzIsNjQgQEAKIAliYWNweSgmZXYuYmRhZGRyLCBiZGFkZHIpOwogCW1lbWNweShldi5uYW1lLCBuYW1lLCBIQ0lfTUFYX05BTUVfTEVOR1RIKTsKIAotCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfUkVNT1RFX05BTUUsIGluZGV4LCAmZXYsIHNpemVvZihldiksIE5VTEwpOworCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfUkVNT1RFX05BTUUsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CiB9CiAKLWludCBtZ210X2Rpc2NvdmVyaW5nKHUxNiBpbmRleCwgdTggZGlzY292ZXJpbmcpCitpbnQgbWdtdF9pbnF1aXJ5X2ZhaWxlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzKQogewotCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfRElTQ09WRVJJTkcsIGluZGV4LCAmZGlzY292ZXJpbmcsCisJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJaW50IGVycjsKKworCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU1RBUlRfRElTQ09WRVJZLCBoZGV2KTsKKwlpZiAoIWNtZCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllcnIgPSBjbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLCBjbWQtPm9wY29kZSwgc3RhdHVzKTsKKwltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbWdtdF9kaXNjb3ZlcmluZyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggZGlzY292ZXJpbmcpCit7CisJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisKKwlpZiAoZGlzY292ZXJpbmcpCisJCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU1RBUlRfRElTQ09WRVJZLCBoZGV2KTsKKwllbHNlCisJCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU1RPUF9ESVNDT1ZFUlksIGhkZXYpOworCisJaWYgKGNtZCAhPSBOVUxMKSB7CisJCWNtZF9jb21wbGV0ZShjbWQtPnNrLCBoZGV2LT5pZCwgY21kLT5vcGNvZGUsIE5VTEwsIDApOworCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CisJfQorCisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9ESVNDT1ZFUklORywgaGRldiwgJmRpc2NvdmVyaW5nLAogCQkJCQkJc2l6ZW9mKGRpc2NvdmVyaW5nKSwgTlVMTCk7CiB9CiAKLWludCBtZ210X2RldmljZV9ibG9ja2VkKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkcikKK2ludCBtZ210X2RldmljZV9ibG9ja2VkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKQogewogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBtZ210X2V2X2RldmljZV9ibG9ja2VkIGV2OwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9CTE9DS19ERVZJQ0UsIGluZGV4KTsKKwljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX0JMT0NLX0RFVklDRSwgaGRldik7CiAKIAliYWNweSgmZXYuYmRhZGRyLCBiZGFkZHIpOwogCi0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9ERVZJQ0VfQkxPQ0tFRCwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwKLQkJCQkJCWNtZCA/IGNtZC0+c2sgOiBOVUxMKTsKKwlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX0RFVklDRV9CTE9DS0VELCBoZGV2LCAmZXYsIHNpemVvZihldiksCisJCQkJCQkJY21kID8gY21kLT5zayA6IE5VTEwpOwogfQogCi1pbnQgbWdtdF9kZXZpY2VfdW5ibG9ja2VkKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkcikKK2ludCBtZ210X2RldmljZV91bmJsb2NrZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIpCiB7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IG1nbXRfZXZfZGV2aWNlX3VuYmxvY2tlZCBldjsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsIGluZGV4KTsKKwljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1VOQkxPQ0tfREVWSUNFLCBoZGV2KTsKIAogCWJhY3B5KCZldi5iZGFkZHIsIGJkYWRkcik7CiAKLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX0RFVklDRV9VTkJMT0NLRUQsIGluZGV4LCAmZXYsIHNpemVvZihldiksCi0JCQkJCQljbWQgPyBjbWQtPnNrIDogTlVMTCk7CisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9ERVZJQ0VfVU5CTE9DS0VELCBoZGV2LCAmZXYsIHNpemVvZihldiksCisJCQkJCQkJY21kID8gY21kLT5zayA6IE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCmluZGV4IDRlMzJlMTguLjg3NDNmMzYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKQEAgLTY1LDcgKzY1LDggQEAKIAogc3RhdGljIExJU1RfSEVBRChzZXNzaW9uX2xpc3QpOwogCi1zdGF0aWMgaW50IHJmY29tbV9zZW5kX2ZyYW1lKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggKmRhdGEsIGludCBsZW4pOworc3RhdGljIGludCByZmNvbW1fc2VuZF9mcmFtZShzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4ICpkYXRhLCBpbnQgbGVuLAorCQkJCQkJCXUzMiBwcmlvcml0eSk7CiBzdGF0aWMgaW50IHJmY29tbV9zZW5kX3NhYm0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKTsKIHN0YXRpYyBpbnQgcmZjb21tX3NlbmRfZGlzYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpOwogc3RhdGljIGludCByZmNvbW1fcXVldWVfZGlzYyhzdHJ1Y3QgcmZjb21tX2RsYyAqZCk7CkBAIC0zNzcsMTMgKzM3OCwxMSBAQAogc3RhdGljIHN0cnVjdCByZmNvbW1fZGxjICpyZmNvbW1fZGxjX2dldChzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpCiB7CiAJc3RydWN0IHJmY29tbV9kbGMgKmQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnMtPmRsY3MpIHsKLQkJZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kbGMsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJnMtPmRsY3MsIGxpc3QpCiAJCWlmIChkLT5kbGNpID09IGRsY2kpCiAJCQlyZXR1cm4gZDsKLQl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtNzQ5LDE5ICs3NDgsMzQgQEAKIH0KIAogLyogLS0tLSBSRkNPTU0gZnJhbWUgc2VuZGluZyAtLS0tICovCi1zdGF0aWMgaW50IHJmY29tbV9zZW5kX2ZyYW1lKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggKmRhdGEsIGludCBsZW4pCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX2ZyYW1lKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggKmRhdGEsIGludCBsZW4sCisJCQkJCQkJdTMyIHByaW9yaXR5KQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzLT5zb2NrOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBrdmVjIGl2ID0geyBkYXRhLCBsZW4gfTsKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKIAotCUJUX0RCRygic2Vzc2lvbiAlcCBsZW4gJWQiLCBzLCBsZW4pOworCUJUX0RCRygic2Vzc2lvbiAlcCBsZW4gJWQgcHJpb3JpdHkgJXUiLCBzLCBsZW4sIHByaW9yaXR5KTsKKworCWlmIChzay0+c2tfcHJpb3JpdHkgIT0gcHJpb3JpdHkpIHsKKwkJbG9ja19zb2NrKHNrKTsKKwkJc2stPnNrX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJfQogCiAJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKIAogCXJldHVybiBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaXYsIDEsIGxlbik7CiB9CiAKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfY21kKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgc3RydWN0IHJmY29tbV9jbWQgKmNtZCkKK3sKKwlCVF9EQkcoIiVwIGNtZCAldSIsIHMsIGNtZC0+Y3RybCk7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgKHZvaWQgKikgY21kLCBzaXplb2YoKmNtZCksIEhDSV9QUklPX01BWCk7Cit9CisKIHN0YXRpYyBpbnQgcmZjb21tX3NlbmRfc2FibShzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpCiB7CiAJc3RydWN0IHJmY29tbV9jbWQgY21kOwpAQCAtNzczLDcgKzc4Nyw3IEBACiAJY21kLmxlbiAgPSBfX2xlbjgoMCk7CiAJY21kLmZjcyAgPSBfX2ZjczIoKHU4ICopICZjbWQpOwogCi0JcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsICh2b2lkICopICZjbWQsIHNpemVvZihjbWQpKTsKKwlyZXR1cm4gcmZjb21tX3NlbmRfY21kKHMsICZjbWQpOwogfQogCiBzdGF0aWMgaW50IHJmY29tbV9zZW5kX3VhKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSkKQEAgLTc4Nyw3ICs4MDEsNyBAQAogCWNtZC5sZW4gID0gX19sZW44KDApOwogCWNtZC5mY3MgID0gX19mY3MyKCh1OCAqKSAmY21kKTsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCAodm9pZCAqKSAmY21kLCBzaXplb2YoY21kKSk7CisJcmV0dXJuIHJmY29tbV9zZW5kX2NtZChzLCAmY21kKTsKIH0KIAogc3RhdGljIGludCByZmNvbW1fc2VuZF9kaXNjKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSkKQEAgLTgwMSw3ICs4MTUsNyBAQAogCWNtZC5sZW4gID0gX19sZW44KDApOwogCWNtZC5mY3MgID0gX19mY3MyKCh1OCAqKSAmY21kKTsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCAodm9pZCAqKSAmY21kLCBzaXplb2YoY21kKSk7CisJcmV0dXJuIHJmY29tbV9zZW5kX2NtZChzLCAmY21kKTsKIH0KIAogc3RhdGljIGludCByZmNvbW1fcXVldWVfZGlzYyhzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKQEAgLTgxNSw2ICs4MjksOCBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXNrYi0+cHJpb3JpdHkgPSBIQ0lfUFJJT19NQVg7CisKIAljbWQgPSAodm9pZCAqKSBfX3NrYl9wdXQoc2tiLCBzaXplb2YoKmNtZCkpOwogCWNtZC0+YWRkciA9IGQtPmFkZHI7CiAJY21kLT5jdHJsID0gX19jdHJsKFJGQ09NTV9ESVNDLCAxKTsKQEAgLTgzNyw3ICs4NTMsNyBAQAogCWNtZC5sZW4gID0gX19sZW44KDApOwogCWNtZC5mY3MgID0gX19mY3MyKCh1OCAqKSAmY21kKTsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCAodm9pZCAqKSAmY21kLCBzaXplb2YoY21kKSk7CisJcmV0dXJuIHJmY29tbV9zZW5kX2NtZChzLCAmY21kKTsKIH0KIAogc3RhdGljIGludCByZmNvbW1fc2VuZF9uc2Moc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4IHR5cGUpCkBAIC04NjIsNyArODc4LDcgQEAKIAogCSpwdHIgPSBfX2ZjcyhidWYpOyBwdHIrKzsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1Zik7CisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsIGJ1ZiwgcHRyIC0gYnVmLCBIQ0lfUFJJT19NQVgpOwogfQogCiBzdGF0aWMgaW50IHJmY29tbV9zZW5kX3BuKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKQEAgLTkwNCw3ICs5MjAsNyBAQAogCiAJKnB0ciA9IF9fZmNzKGJ1Zik7IHB0cisrOwogCi0JcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsIGJ1ZiwgcHRyIC0gYnVmKTsKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYsIEhDSV9QUklPX01BWCk7CiB9CiAKIGludCByZmNvbW1fc2VuZF9ycG4oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4IGRsY2ksCkBAIC05NDIsNyArOTU4LDcgQEAKIAogCSpwdHIgPSBfX2ZjcyhidWYpOyBwdHIrKzsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1Zik7CisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsIGJ1ZiwgcHRyIC0gYnVmLCBIQ0lfUFJJT19NQVgpOwogfQogCiBzdGF0aWMgaW50IHJmY29tbV9zZW5kX3JscyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggZGxjaSwgdTggc3RhdHVzKQpAQCAtOTY5LDcgKzk4NSw3IEBACiAKIAkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CiAKLQlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1ZiwgSENJX1BSSU9fTUFYKTsKIH0KIAogc3RhdGljIGludCByZmNvbW1fc2VuZF9tc2Moc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4IGRsY2ksIHU4IHYyNF9zaWcpCkBAIC05OTYsNyArMTAxMiw3IEBACiAKIAkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CiAKLQlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1ZiwgSENJX1BSSU9fTUFYKTsKIH0KIAogc3RhdGljIGludCByZmNvbW1fc2VuZF9mY29mZihzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjcikKQEAgLTEwMTgsNyArMTAzNCw3IEBACiAKIAkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CiAKLQlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1ZiwgSENJX1BSSU9fTUFYKTsKIH0KIAogc3RhdGljIGludCByZmNvbW1fc2VuZF9mY29uKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyKQpAQCAtMTA0MCw3ICsxMDU2LDcgQEAKIAogCSpwdHIgPSBfX2ZjcyhidWYpOyBwdHIrKzsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1Zik7CisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsIGJ1ZiwgcHRyIC0gYnVmLCBIQ0lfUFJJT19NQVgpOwogfQogCiBzdGF0aWMgaW50IHJmY29tbV9zZW5kX3Rlc3Qoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4ICpwYXR0ZXJuLCBpbnQgbGVuKQpAQCAtMTA5MSw3ICsxMTA3LDcgQEAKIAogCSpwdHIgPSBfX2ZjcyhidWYpOyBwdHIrKzsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1Zik7CisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsIGJ1ZiwgcHRyIC0gYnVmLCBIQ0lfUFJJT19NQVgpOwogfQogCiBzdGF0aWMgdm9pZCByZmNvbW1fbWFrZV91aWgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggYWRkcikKQEAgLTE3NjksNyArMTc4NSw4IEBACiAJCXJldHVybiBza2JfcXVldWVfbGVuKCZkLT50eF9xdWV1ZSk7CiAKIAl3aGlsZSAoZC0+dHhfY3JlZGl0cyAmJiAoc2tiID0gc2tiX2RlcXVldWUoJmQtPnR4X3F1ZXVlKSkpIHsKLQkJZXJyID0gcmZjb21tX3NlbmRfZnJhbWUoZC0+c2Vzc2lvbiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWVyciA9IHJmY29tbV9zZW5kX2ZyYW1lKGQtPnNlc3Npb24sIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJCQkJc2tiLT5wcmlvcml0eSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlza2JfcXVldWVfaGVhZCgmZC0+dHhfcXVldWUsIHNrYik7CiAJCQlicmVhazsKQEAgLTIxMjAsMTUgKzIxMzcsMTMgQEAKIHN0YXRpYyBpbnQgcmZjb21tX2RsY19kZWJ1Z2ZzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp4KQogewogCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwcCwgKnA7CiAKIAlyZmNvbW1fbG9jaygpOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmc2Vzc2lvbl9saXN0KSB7Ci0JCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiwgbGlzdCk7Ci0JCWxpc3RfZm9yX2VhY2gocHAsICZzLT5kbGNzKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc2Vzc2lvbl9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCByZmNvbW1fZGxjICpkOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZzLT5kbGNzLCBsaXN0KSB7CiAJCQlzdHJ1Y3Qgc29jayAqc2sgPSBzLT5zb2NrLT5zazsKLQkJCXN0cnVjdCByZmNvbW1fZGxjICpkID0gbGlzdF9lbnRyeShwcCwgc3RydWN0IHJmY29tbV9kbGMsIGxpc3QpOwogCiAJCQlzZXFfcHJpbnRmKGYsICIlcyAlcyAlbGQgJWQgJWQgJWQgJWRcbiIsCiAJCQkJCQliYXRvc3RyKCZidF9zayhzayktPnNyYyksCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKaW5kZXggNTQxN2Y2MS4uYWVhMmJkZCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwpAQCAtNjAwLDYgKzYwMCw4IEBACiAJCQlicmVhazsKIAkJfQogCisJCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CisKIAkJZXJyID0gcmZjb21tX2RsY19zZW5kKGQsIHNrYik7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlrZnJlZV9za2Ioc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMKaW5kZXggYzI1ODc5Ni4uZmE4ZjRkZTUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3R0eS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgpAQCAtNjUsNyArNjYsNyBAQAogCXN0cnVjdCByZmNvbW1fZGxjCSpkbGM7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICB3YWl0OwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgIHdha2V1cF90YXNrOworCXN0cnVjdCB3b3JrX3N0cnVjdAl3YWtldXBfdGFzazsKIAogCXN0cnVjdCBkZXZpY2UJCSp0dHlfZGV2OwogCkBAIC04MSw3ICs4Miw3IEBACiBzdGF0aWMgdm9pZCByZmNvbW1fZGV2X3N0YXRlX2NoYW5nZShzdHJ1Y3QgcmZjb21tX2RsYyAqZGxjLCBpbnQgZXJyKTsKIHN0YXRpYyB2b2lkIHJmY29tbV9kZXZfbW9kZW1fc3RhdHVzKHN0cnVjdCByZmNvbW1fZGxjICpkbGMsIHU4IHYyNF9zaWcpOwogCi1zdGF0aWMgdm9pZCByZmNvbW1fdHR5X3dha2V1cCh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCByZmNvbW1fdHR5X3dha2V1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKiAtLS0tIERldmljZSBmdW5jdGlvbnMgLS0tLSAqLwogc3RhdGljIHZvaWQgcmZjb21tX2Rldl9kZXN0cnVjdChzdHJ1Y3QgcmZjb21tX2RldiAqZGV2KQpAQCAtMTMzLDEzICsxMzQsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgcmZjb21tX2RldiAqX19yZmNvbW1fZGV2X2dldChpbnQgaWQpCiB7CiAJc3RydWN0IHJmY29tbV9kZXYgKmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAqcDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnJmY29tbV9kZXZfbGlzdCkgewotCQlkZXYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGV2LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnJmY29tbV9kZXZfbGlzdCwgbGlzdCkKIAkJaWYgKGRldi0+aWQgPT0gaWQpCiAJCQlyZXR1cm4gZGV2OwotCX0KIAogCXJldHVybiBOVUxMOwogfQpAQCAtMTk3LDcgKzE5NSw3IEBACiAKIHN0YXRpYyBpbnQgcmZjb21tX2Rldl9hZGQoc3RydWN0IHJmY29tbV9kZXZfcmVxICpyZXEsIHN0cnVjdCByZmNvbW1fZGxjICpkbGMpCiB7Ci0Jc3RydWN0IHJmY29tbV9kZXYgKmRldjsKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2LCAqZW50cnk7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZyZmNvbW1fZGV2X2xpc3QsICpwOwogCWludCBlcnIgPSAwOwogCkBAIC0yMTIsOCArMjEwLDggQEAKIAlpZiAocmVxLT5kZXZfaWQgPCAwKSB7CiAJCWRldi0+aWQgPSAwOwogCi0JCWxpc3RfZm9yX2VhY2gocCwgJnJmY29tbV9kZXZfbGlzdCkgewotCQkJaWYgKGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpLT5pZCAhPSBkZXYtPmlkKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmcmZjb21tX2Rldl9saXN0LCBsaXN0KSB7CisJCQlpZiAoZW50cnktPmlkICE9IGRldi0+aWQpCiAJCQkJYnJlYWs7CiAKIAkJCWRldi0+aWQrKzsKQEAgLTIyMiw5ICsyMjAsNyBAQAogCX0gZWxzZSB7CiAJCWRldi0+aWQgPSByZXEtPmRldl9pZDsKIAotCQlsaXN0X2Zvcl9lYWNoKHAsICZyZmNvbW1fZGV2X2xpc3QpIHsKLQkJCXN0cnVjdCByZmNvbW1fZGV2ICplbnRyeSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpOwotCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZyZmNvbW1fZGV2X2xpc3QsIGxpc3QpIHsKIAkJCWlmIChlbnRyeS0+aWQgPT0gZGV2LT5pZCkgewogCQkJCWVyciA9IC1FQUREUklOVVNFOwogCQkJCWdvdG8gb3V0OwpAQCAtMjU3LDcgKzI1Myw3IEBACiAJYXRvbWljX3NldCgmZGV2LT5vcGVuZWQsIDApOwogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53YWl0KTsKLQl0YXNrbGV0X2luaXQoJmRldi0+d2FrZXVwX3Rhc2ssIHJmY29tbV90dHlfd2FrZXVwLCAodW5zaWduZWQgbG9uZykgZGV2KTsKKwlJTklUX1dPUksoJmRldi0+d2FrZXVwX3Rhc2ssIHJmY29tbV90dHlfd2FrZXVwKTsKIAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmRldi0+cGVuZGluZyk7CiAKQEAgLTM1MSw3ICszNDcsNyBAQAogCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAodm9pZCAqKSBza2ItPnNrOwogCWF0b21pY19zdWIoc2tiLT50cnVlc2l6ZSwgJmRldi0+d21lbV9hbGxvYyk7CiAJaWYgKHRlc3RfYml0KFJGQ09NTV9UVFlfQVRUQUNIRUQsICZkZXYtPmZsYWdzKSkKLQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT53YWtldXBfdGFzayk7CisJCXF1ZXVlX3dvcmsoc3lzdGVtX25ydF93cSwgJmRldi0+d2FrZXVwX3Rhc2spOwogCXJmY29tbV9kZXZfcHV0KGRldik7CiB9CiAKQEAgLTQ1NSw5ICs0NTEsOSBAQAogCiBzdGF0aWMgaW50IHJmY29tbV9nZXRfZGV2X2xpc3Qodm9pZCBfX3VzZXIgKmFyZykKIHsKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OwogCXN0cnVjdCByZmNvbW1fZGV2X2xpc3RfcmVxICpkbDsKIAlzdHJ1Y3QgcmZjb21tX2Rldl9pbmZvICpkaTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCWludCBuID0gMCwgc2l6ZSwgZXJyOwogCXUxNiBkZXZfbnVtOwogCkBAIC00NzksOCArNDc1LDcgQEAKIAogCXJlYWRfbG9ja19iaCgmcmZjb21tX2Rldl9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnJmY29tbV9kZXZfbGlzdCkgewotCQlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgcmZjb21tX2RldiwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZyZmNvbW1fZGV2X2xpc3QsIGxpc3QpIHsKIAkJaWYgKHRlc3RfYml0KFJGQ09NTV9UVFlfUkVMRUFTRUQsICZkZXYtPmZsYWdzKSkKIAkJCWNvbnRpbnVlOwogCQkoZGkgKyBuKS0+aWQgICAgICA9IGRldi0+aWQ7CkBAIC02MzUsOSArNjMwLDEwIEBACiB9CiAKIC8qIC0tLS0gVFRZIGZ1bmN0aW9ucyAtLS0tICovCi1zdGF0aWMgdm9pZCByZmNvbW1fdHR5X3dha2V1cCh1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfd2FrZXVwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gKHZvaWQgKikgYXJnOworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJmY29tbV9kZXYsCisJCQkJCQkJCXdha2V1cF90YXNrKTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gZGV2LT50dHk7CiAJaWYgKCF0dHkpCiAJCXJldHVybjsKQEAgLTc2Miw3ICs3NTgsNyBAQAogCQlyZmNvbW1fZGxjX2Nsb3NlKGRldi0+ZGxjLCAwKTsKIAogCQljbGVhcl9iaXQoUkZDT01NX1RUWV9BVFRBQ0hFRCwgJmRldi0+ZmxhZ3MpOwotCQl0YXNrbGV0X2tpbGwoJmRldi0+d2FrZXVwX3Rhc2spOworCQljYW5jZWxfd29ya19zeW5jKCZkZXYtPndha2V1cF90YXNrKTsKIAogCQlyZmNvbW1fZGxjX2xvY2soZGV2LT5kbGMpOwogCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKQEAgLTExNTUsOSArMTE1MSwxMSBAQAogCiBpbnQgX19pbml0IHJmY29tbV9pbml0X3R0eXModm9pZCkKIHsKKwlpbnQgZXJyb3I7CisKIAlyZmNvbW1fdHR5X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoUkZDT01NX1RUWV9QT1JUUyk7CiAJaWYgKCFyZmNvbW1fdHR5X2RyaXZlcikKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT01FTTsKIAogCXJmY29tbV90dHlfZHJpdmVyLT5vd25lcgk9IFRISVNfTU9EVUxFOwogCXJmY29tbV90dHlfZHJpdmVyLT5kcml2ZXJfbmFtZQk9ICJyZmNvbW0iOwpAQCAtMTE3MiwxMCArMTE3MCwxMSBAQAogCXJmY29tbV90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19sZmxhZyAmPSB+SUNBTk9OOwogCXR0eV9zZXRfb3BlcmF0aW9ucyhyZmNvbW1fdHR5X2RyaXZlciwgJnJmY29tbV9vcHMpOwogCi0JaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIocmZjb21tX3R0eV9kcml2ZXIpKSB7CisJZXJyb3IgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHJmY29tbV90dHlfZHJpdmVyKTsKKwlpZiAoZXJyb3IpIHsKIAkJQlRfRVJSKCJDYW4ndCByZWdpc3RlciBSRkNPTU0gVFRZIGRyaXZlciIpOwogCQlwdXRfdHR5X2RyaXZlcihyZmNvbW1fdHR5X2RyaXZlcik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIGVycm9yOwogCX0KIAogCUJUX0lORk8oIlJGQ09NTSBUVFkgbGF5ZXIgaW5pdGlhbGl6ZWQiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc21wLmMgYi9uZXQvYmx1ZXRvb3RoL3NtcC5jCmluZGV4IDc1OWI2MzUuLjk0ZTk0Y2EgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc21wLmMKKysrIGIvbmV0L2JsdWV0b290aC9zbXAuYwpAQCAtMTgxLDcgKzE4MSw4IEBACiAJaWYgKCFza2IpCiAJCXJldHVybjsKIAotCWhjaV9zZW5kX2FjbChjb25uLT5oY29uLCBza2IsIDApOworCXNrYi0+cHJpb3JpdHkgPSBIQ0lfUFJJT19NQVg7CisJaGNpX3NlbmRfYWNsKGNvbm4tPmhjaGFuLCBza2IsIDApOwogCiAJbW9kX3RpbWVyKCZjb25uLT5zZWN1cml0eV90aW1lciwgamlmZmllcyArCiAJCQkJCW1zZWNzX3RvX2ppZmZpZXMoU01QX1RJTUVPVVQpKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaW5wdXQuYyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwppbmRleCA2ZjlmOGMwLi41YTMxNzMxIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMKKysrIGIvbmV0L2JyaWRnZS9icl9pbnB1dC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgogCiAvKiBCcmlkZ2UgZ3JvdXAgbXVsdGljYXN0IGFkZHJlc3MgODAyLjFkIChwZyA1MSkuICovCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jIGIvbmV0L2JyaWRnZS9icl9zdHBfaWYuYwppbmRleCAxMGVkYTNjLi4xOTMwOGUzIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCmluZGV4IGJmMmEzMzMuLjU0NDkyOTQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYwpAQCAtMTAyLDE2ICsxMDIsMTUgQEAKIAl1bnNpZ25lZCBpbnQgbjsKIAogCW4gPSBtYXgoc2l6ZSwgbmxidWZzaXopOwotCXNrYiA9IGFsbG9jX3NrYihuLCBHRlBfQVRPTUlDKTsKKwlza2IgPSBhbGxvY19za2IobiwgR0ZQX0FUT01JQyB8IF9fR0ZQX05PV0FSTik7CiAJaWYgKCFza2IpIHsKLQkJcHJfZGVidWcoImNhbm5vdCBhbGxvYyB3aG9sZSBidWZmZXIgb2Ygc2l6ZSAldWIhXG4iLCBuKTsKIAkJaWYgKG4gPiBzaXplKSB7CiAJCQkvKiB0cnkgdG8gYWxsb2NhdGUgb25seSBhcyBtdWNoIGFzIHdlIG5lZWQgZm9yCiAJCQkgKiBjdXJyZW50IHBhY2tldCAqLwogCQkJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9BVE9NSUMpOwogCQkJaWYgKCFza2IpCi0JCQkJcHJfZGVidWcoImNhbm5vdCBldmVuIGFsbG9jYXRlICIKLQkJCQkJICJidWZmZXIgb2Ygc2l6ZSAldWJcbiIsIHNpemUpOworCQkJCXByX2RlYnVnKCJjYW5ub3QgZXZlbiBhbGxvY2F0ZSBidWZmZXIgb2Ygc2l6ZSAldWJcbiIsCisJCQkJCSBzaXplKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2FpZl9kZXYuYyBiL25ldC9jYWlmL2NhaWZfZGV2LmMKaW5kZXggNDdmYzhmMy4uZjFmYTFmNiAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2FpZl9kZXYuYworKysgYi9uZXQvY2FpZi9jYWlmX2Rldi5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMgYi9uZXQvY2FpZi9jZnBrdF9za2J1ZmYuYwppbmRleCA3NWQ0YmZhLi5kZjA4YzQ3IDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jZnBrdF9za2J1ZmYuYworKysgYi9uZXQvY2FpZi9jZnBrdF9za2J1ZmYuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2NhaWYvY2Zwa3QuaD4KIAogI2RlZmluZSBQS1RfUFJFRklYICA0OApkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvS2NvbmZpZyBiL25ldC9jZXBoL0tjb25maWcKaW5kZXggYmU2ODNmMi4uY2MwNGRkNiAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvS2NvbmZpZworKysgYi9uZXQvY2VwaC9LY29uZmlnCkBAIC0yNywzICsyNywxNyBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgQ0VQSF9MSUJfVVNFX0ROU19SRVNPTFZFUgorCWJvb2wgIlVzZSBpbi1rZXJuZWwgc3VwcG9ydCBmb3IgRE5TIGxvb2t1cCIKKwlkZXBlbmRzIG9uIENFUEhfTElCCisJc2VsZWN0IEROU19SRVNPTFZFUgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCBob3N0bmFtZXMgKGUuZy4gbW9uaXRvciBhZGRyZXNzZXMpIHdpbGwKKwkgIGJlIHJlc29sdmVkIHVzaW5nIHRoZSBDT05GSUdfRE5TX1JFU09MVkVSIGZhY2lsaXR5LgorCisJICBGb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBDT05GSUdfRE5TX1JFU09MVkVSIGNvbnN1bHQKKwkgIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9kbnNfcmVzb2x2ZXIudHh0CisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKZGlmZiAtLWdpdCBhL25ldC9jZXBoL2NlcGhfY29tbW9uLmMgYi9uZXQvY2VwaC9jZXBoX2NvbW1vbi5jCmluZGV4IDI4ODNlYTAuLjk3ZjcwZTUgMTAwNjQ0Ci0tLSBhL25ldC9jZXBoL2NlcGhfY29tbW9uLmMKKysrIGIvbmV0L2NlcGgvY2VwaF9jb21tb24uYwpAQCAtNDMyLDkgKzQzMiwxMiBAQAogLyoKICAqIGNyZWF0ZSBhIGZyZXNoIGNsaWVudCBpbnN0YW5jZQogICovCi1zdHJ1Y3QgY2VwaF9jbGllbnQgKmNlcGhfY3JlYXRlX2NsaWVudChzdHJ1Y3QgY2VwaF9vcHRpb25zICpvcHQsIHZvaWQgKnByaXZhdGUpCitzdHJ1Y3QgY2VwaF9jbGllbnQgKmNlcGhfY3JlYXRlX2NsaWVudChzdHJ1Y3QgY2VwaF9vcHRpb25zICpvcHQsIHZvaWQgKnByaXZhdGUsCisJCQkJICAgICAgIHVuc2lnbmVkIHN1cHBvcnRlZF9mZWF0dXJlcywKKwkJCQkgICAgICAgdW5zaWduZWQgcmVxdWlyZWRfZmVhdHVyZXMpCiB7CiAJc3RydWN0IGNlcGhfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGNlcGhfZW50aXR5X2FkZHIgKm15YWRkciA9IE5VTEw7CiAJaW50IGVyciA9IC1FTk9NRU07CiAKIAljbGllbnQgPSBremFsbG9jKHNpemVvZigqY2xpZW50KSwgR0ZQX0tFUk5FTCk7CkBAIC00NDksMTUgKzQ1MiwyNyBAQAogCWNsaWVudC0+YXV0aF9lcnIgPSAwOwogCiAJY2xpZW50LT5leHRyYV9tb25fZGlzcGF0Y2ggPSBOVUxMOwotCWNsaWVudC0+c3VwcG9ydGVkX2ZlYXR1cmVzID0gQ0VQSF9GRUFUVVJFX1NVUFBPUlRFRF9ERUZBVUxUOwotCWNsaWVudC0+cmVxdWlyZWRfZmVhdHVyZXMgPSBDRVBIX0ZFQVRVUkVfUkVRVUlSRURfREVGQVVMVDsKKwljbGllbnQtPnN1cHBvcnRlZF9mZWF0dXJlcyA9IENFUEhfRkVBVFVSRV9TVVBQT1JURURfREVGQVVMVCB8CisJCXN1cHBvcnRlZF9mZWF0dXJlczsKKwljbGllbnQtPnJlcXVpcmVkX2ZlYXR1cmVzID0gQ0VQSF9GRUFUVVJFX1JFUVVJUkVEX0RFRkFVTFQgfAorCQlyZXF1aXJlZF9mZWF0dXJlczsKIAotCWNsaWVudC0+bXNnciA9IE5VTEw7CisJLyogbXNnciAqLworCWlmIChjZXBoX3Rlc3Rfb3B0KGNsaWVudCwgTVlJUCkpCisJCW15YWRkciA9ICZjbGllbnQtPm9wdGlvbnMtPm15X2FkZHI7CisJY2xpZW50LT5tc2dyID0gY2VwaF9tZXNzZW5nZXJfY3JlYXRlKG15YWRkciwKKwkJCQkJICAgICBjbGllbnQtPnN1cHBvcnRlZF9mZWF0dXJlcywKKwkJCQkJICAgICBjbGllbnQtPnJlcXVpcmVkX2ZlYXR1cmVzKTsKKwlpZiAoSVNfRVJSKGNsaWVudC0+bXNncikpIHsKKwkJZXJyID0gUFRSX0VSUihjbGllbnQtPm1zZ3IpOworCQlnb3RvIGZhaWw7CisJfQorCWNsaWVudC0+bXNnci0+bm9jcmMgPSBjZXBoX3Rlc3Rfb3B0KGNsaWVudCwgTk9DUkMpOwogCiAJLyogc3Vic3lzdGVtcyAqLwogCWVyciA9IGNlcGhfbW9uY19pbml0KCZjbGllbnQtPm1vbmMsIGNsaWVudCk7CiAJaWYgKGVyciA8IDApCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsX21zZ3I7CiAJZXJyID0gY2VwaF9vc2RjX2luaXQoJmNsaWVudC0+b3NkYywgY2xpZW50KTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmYWlsX21vbmM7CkBAIC00NjYsNiArNDgxLDggQEAKIAogZmFpbF9tb25jOgogCWNlcGhfbW9uY19zdG9wKCZjbGllbnQtPm1vbmMpOworZmFpbF9tc2dyOgorCWNlcGhfbWVzc2VuZ2VyX2Rlc3Ryb3koY2xpZW50LT5tc2dyKTsKIGZhaWw6CiAJa2ZyZWUoY2xpZW50KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtNDkwLDggKzUwNyw3IEBACiAKIAljZXBoX2RlYnVnZnNfY2xpZW50X2NsZWFudXAoY2xpZW50KTsKIAotCWlmIChjbGllbnQtPm1zZ3IpCi0JCWNlcGhfbWVzc2VuZ2VyX2Rlc3Ryb3koY2xpZW50LT5tc2dyKTsKKwljZXBoX21lc3Nlbmdlcl9kZXN0cm95KGNsaWVudC0+bXNncik7CiAKIAljZXBoX2Rlc3Ryb3lfb3B0aW9ucyhjbGllbnQtPm9wdGlvbnMpOwogCkBAIC01MTQsMjQgKzUzMCw5IEBACiAgKi8KIGludCBfX2NlcGhfb3Blbl9zZXNzaW9uKHN0cnVjdCBjZXBoX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBsb25nIHN0YXJ0ZWQpCiB7Ci0Jc3RydWN0IGNlcGhfZW50aXR5X2FkZHIgKm15YWRkciA9IE5VTEw7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBjbGllbnQtPm9wdGlvbnMtPm1vdW50X3RpbWVvdXQgKiBIWjsKIAotCS8qIGluaXRpYWxpemUgdGhlIG1lc3NlbmdlciAqLwotCWlmIChjbGllbnQtPm1zZ3IgPT0gTlVMTCkgewotCQlpZiAoY2VwaF90ZXN0X29wdChjbGllbnQsIE1ZSVApKQotCQkJbXlhZGRyID0gJmNsaWVudC0+b3B0aW9ucy0+bXlfYWRkcjsKLQkJY2xpZW50LT5tc2dyID0gY2VwaF9tZXNzZW5nZXJfY3JlYXRlKG15YWRkciwKLQkJCQkJY2xpZW50LT5zdXBwb3J0ZWRfZmVhdHVyZXMsCi0JCQkJCWNsaWVudC0+cmVxdWlyZWRfZmVhdHVyZXMpOwotCQlpZiAoSVNfRVJSKGNsaWVudC0+bXNncikpIHsKLQkJCWNsaWVudC0+bXNnciA9IE5VTEw7Ci0JCQlyZXR1cm4gUFRSX0VSUihjbGllbnQtPm1zZ3IpOwotCQl9Ci0JCWNsaWVudC0+bXNnci0+bm9jcmMgPSBjZXBoX3Rlc3Rfb3B0KGNsaWVudCwgTk9DUkMpOwotCX0KLQogCS8qIG9wZW4gc2Vzc2lvbiwgYW5kIHdhaXQgZm9yIG1vbiBhbmQgb3NkIG1hcHMgKi8KIAllcnIgPSBjZXBoX21vbmNfb3Blbl9zZXNzaW9uKCZjbGllbnQtPm1vbmMpOwogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvbWVzc2VuZ2VyLmMgYi9uZXQvY2VwaC9tZXNzZW5nZXIuYwppbmRleCA5OTE4ZTllLi5hZDViNzA4IDEwMDY0NAotLS0gYS9uZXQvY2VwaC9tZXNzZW5nZXIuYworKysgYi9uZXQvY2VwaC9tZXNzZW5nZXIuYwpAQCAtMTEsMTIgKzExLDE0IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZG5zX3Jlc29sdmVyLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogCiAjaW5jbHVkZSA8bGludXgvY2VwaC9saWJjZXBoLmg+CiAjaW5jbHVkZSA8bGludXgvY2VwaC9tZXNzZW5nZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jZXBoL2RlY29kZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NlcGgvcGFnZWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyoKICAqIENlcGggdXNlcyB0aGUgbWVzc2VuZ2VyIHRvIGV4Y2hhbmdlIGNlcGhfbXNnIG1lc3NhZ2VzIHdpdGggb3RoZXIKQEAgLTEwNzgsNiArMTA4MCwxMDEgQEAKIH0KIAogLyoKKyAqIFVubGlrZSBvdGhlciAqX3B0b24gZnVuY3Rpb24gc2VtYW50aWNzLCB6ZXJvIGluZGljYXRlcyBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGNlcGhfcHRvbihjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpzcywKKwkJY2hhciBkZWxpbSwgY29uc3QgY2hhciAqKmlwZW5kKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqaW40ID0gKHZvaWQgKilzczsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppbjYgPSAodm9pZCAqKXNzOworCisJbWVtc2V0KHNzLCAwLCBzaXplb2YoKnNzKSk7CisKKwlpZiAoaW40X3B0b24oc3RyLCBsZW4sICh1OCAqKSZpbjQtPnNpbl9hZGRyLnNfYWRkciwgZGVsaW0sIGlwZW5kKSkgeworCQlzcy0+c3NfZmFtaWx5ID0gQUZfSU5FVDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGluNl9wdG9uKHN0ciwgbGVuLCAodTggKikmaW42LT5zaW42X2FkZHIuczZfYWRkciwgZGVsaW0sIGlwZW5kKSkgeworCQlzcy0+c3NfZmFtaWx5ID0gQUZfSU5FVDY7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogRXh0cmFjdCBob3N0bmFtZSBzdHJpbmcgYW5kIHJlc29sdmUgdXNpbmcga2VybmVsIEROUyBmYWNpbGl0eS4KKyAqLworI2lmZGVmIENPTkZJR19DRVBIX0xJQl9VU0VfRE5TX1JFU09MVkVSCitzdGF0aWMgaW50IGNlcGhfZG5zX3Jlc29sdmVfbmFtZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKKwkJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzLCBjaGFyIGRlbGltLCBjb25zdCBjaGFyICoqaXBlbmQpCit7CisJY29uc3QgY2hhciAqZW5kLCAqZGVsaW1fcDsKKwljaGFyICpjb2xvbl9wLCAqaXBfYWRkciA9IE5VTEw7CisJaW50IGlwX2xlbiwgcmV0OworCisJLyoKKwkgKiBUaGUgZW5kIG9mIHRoZSBob3N0bmFtZSBvY2N1cnMgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSBkZWxpbWl0ZXIgb3IKKwkgKiB0aGUgcG9ydCBtYXJrZXIgKCc6Jykgd2hlcmUgdGhlIGRlbGltaXRlciB0YWtlcyBwcmVjZWRlbmNlLgorCSAqLworCWRlbGltX3AgPSBtZW1jaHIobmFtZSwgZGVsaW0sIG5hbWVsZW4pOworCWNvbG9uX3AgPSBtZW1jaHIobmFtZSwgJzonLCBuYW1lbGVuKTsKKworCWlmIChkZWxpbV9wICYmIGNvbG9uX3ApCisJCWVuZCA9IGRlbGltX3AgPCBjb2xvbl9wID8gZGVsaW1fcCA6IGNvbG9uX3A7CisJZWxzZSBpZiAoIWRlbGltX3AgJiYgY29sb25fcCkKKwkJZW5kID0gY29sb25fcDsKKwllbHNlIHsKKwkJZW5kID0gZGVsaW1fcDsKKwkJaWYgKCFlbmQpIC8qIGNhc2U6IGhvc3RuYW1lOi8gKi8KKwkJCWVuZCA9IG5hbWUgKyBuYW1lbGVuOworCX0KKworCWlmIChlbmQgPD0gbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBkbyBkbnNfcmVzb2x2ZSB1cGNhbGwgKi8KKwlpcF9sZW4gPSBkbnNfcXVlcnkoTlVMTCwgbmFtZSwgZW5kIC0gbmFtZSwgTlVMTCwgJmlwX2FkZHIsIE5VTEwpOworCWlmIChpcF9sZW4gPiAwKQorCQlyZXQgPSBjZXBoX3B0b24oaXBfYWRkciwgaXBfbGVuLCBzcywgLTEsIE5VTEwpOworCWVsc2UKKwkJcmV0ID0gLUVTUkNIOworCisJa2ZyZWUoaXBfYWRkcik7CisKKwkqaXBlbmQgPSBlbmQ7CisKKwlwcl9pbmZvKCJyZXNvbHZlICclLipzJyAocmV0PSVkKTogJXNcbiIsIChpbnQpKGVuZCAtIG5hbWUpLCBuYW1lLAorCQkJcmV0LCByZXQgPyAiZmFpbGVkIiA6IGNlcGhfcHJfYWRkcihzcykpOworCisJcmV0dXJuIHJldDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjZXBoX2Ruc19yZXNvbHZlX25hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCisJCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpzcywgY2hhciBkZWxpbSwgY29uc3QgY2hhciAqKmlwZW5kKQoreworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKKy8qCisgKiBQYXJzZSBhIHNlcnZlciBuYW1lIChJUCBvciBob3N0bmFtZSkuIElmIGEgdmFsaWQgSVAgYWRkcmVzcyBpcyBub3QgZm91bmQKKyAqIHRoZW4gdHJ5IHRvIGV4dHJhY3QgYSBob3N0bmFtZSB0byByZXNvbHZlIHVzaW5nIHVzZXJzcGFjZSBETlMgdXBjYWxsLgorICovCitzdGF0aWMgaW50IGNlcGhfcGFyc2Vfc2VydmVyX25hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCisJCQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc3MsIGNoYXIgZGVsaW0sIGNvbnN0IGNoYXIgKippcGVuZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY2VwaF9wdG9uKG5hbWUsIG5hbWVsZW4sIHNzLCBkZWxpbSwgaXBlbmQpOworCWlmIChyZXQpCisJCXJldCA9IGNlcGhfZG5zX3Jlc29sdmVfbmFtZShuYW1lLCBuYW1lbGVuLCBzcywgZGVsaW0sIGlwZW5kKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCiAgKiBQYXJzZSBhbiBpcFs6cG9ydF0gbGlzdCBpbnRvIGFuIGFkZHIgYXJyYXkuICBVc2UgdGhlIGRlZmF1bHQKICAqIG1vbml0b3IgcG9ydCBpZiBhIHBvcnQgaXNuJ3Qgc3BlY2lmaWVkLgogICovCkBAIC0xMDg1LDE1ICsxMTgyLDEzIEBACiAJCSAgIHN0cnVjdCBjZXBoX2VudGl0eV9hZGRyICphZGRyLAogCQkgICBpbnQgbWF4X2NvdW50LCBpbnQgKmNvdW50KQogewotCWludCBpOworCWludCBpLCByZXQgPSAtRUlOVkFMOwogCWNvbnN0IGNoYXIgKnAgPSBjOwogCiAJZG91dCgicGFyc2VfaXBzIG9uICclLipzJ1xuIiwgKGludCkoZW5kLWMpLCBjKTsKIAlmb3IgKGkgPSAwOyBpIDwgbWF4X2NvdW50OyBpKyspIHsKIAkJY29uc3QgY2hhciAqaXBlbmQ7CiAJCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpzcyA9ICZhZGRyW2ldLmluX2FkZHI7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiAqaW40ID0gKHZvaWQgKilzczsKLQkJc3RydWN0IHNvY2thZGRyX2luNiAqaW42ID0gKHZvaWQgKilzczsKIAkJaW50IHBvcnQ7CiAJCWNoYXIgZGVsaW0gPSAnLCc7CiAKQEAgLTExMDIsMTUgKzExOTcsMTEgQEAKIAkJCXArKzsKIAkJfQogCi0JCW1lbXNldChzcywgMCwgc2l6ZW9mKCpzcykpOwotCQlpZiAoaW40X3B0b24ocCwgZW5kIC0gcCwgKHU4ICopJmluNC0+c2luX2FkZHIuc19hZGRyLAotCQkJICAgICBkZWxpbSwgJmlwZW5kKSkKLQkJCXNzLT5zc19mYW1pbHkgPSBBRl9JTkVUOwotCQllbHNlIGlmIChpbjZfcHRvbihwLCBlbmQgLSBwLCAodTggKikmaW42LT5zaW42X2FkZHIuczZfYWRkciwKLQkJCQkgIGRlbGltLCAmaXBlbmQpKQotCQkJc3MtPnNzX2ZhbWlseSA9IEFGX0lORVQ2OwotCQllbHNlCisJCXJldCA9IGNlcGhfcGFyc2Vfc2VydmVyX25hbWUocCwgZW5kIC0gcCwgc3MsIGRlbGltLCAmaXBlbmQpOworCQlpZiAocmV0KQogCQkJZ290byBiYWQ7CisJCXJldCA9IC1FSU5WQUw7CisKIAkJcCA9IGlwZW5kOwogCiAJCWlmIChkZWxpbSA9PSAnXScpIHsKQEAgLTExNTUsNyArMTI0Niw3IEBACiAKIGJhZDoKIAlwcl9lcnIoInBhcnNlX2lwcyBiYWQgaXAgJyUuKnMnXG4iLCAoaW50KShlbmQgLSBjKSwgYyk7Ci0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woY2VwaF9wYXJzZV9pcHMpOwogCkBAIC0yMjgxLDcgKzIzNzIsOCBAQAogICogY29uc3RydWN0IGEgbmV3IG1lc3NhZ2Ugd2l0aCBnaXZlbiB0eXBlLCBzaXplCiAgKiB0aGUgbmV3IG1zZyBoYXMgYSByZWYgY291bnQgb2YgMS4KICAqLwotc3RydWN0IGNlcGhfbXNnICpjZXBoX21zZ19uZXcoaW50IHR5cGUsIGludCBmcm9udF9sZW4sIGdmcF90IGZsYWdzKQorc3RydWN0IGNlcGhfbXNnICpjZXBoX21zZ19uZXcoaW50IHR5cGUsIGludCBmcm9udF9sZW4sIGdmcF90IGZsYWdzLAorCQkJICAgICAgYm9vbCBjYW5fZmFpbCkKIHsKIAlzdHJ1Y3QgY2VwaF9tc2cgKm07CiAKQEAgLTIzMzMsNyArMjQyNSw3IEBACiAJCQltLT5mcm9udC5pb3ZfYmFzZSA9IGttYWxsb2MoZnJvbnRfbGVuLCBmbGFncyk7CiAJCX0KIAkJaWYgKG0tPmZyb250Lmlvdl9iYXNlID09IE5VTEwpIHsKLQkJCXByX2VycigibXNnX25ldyBjYW4ndCBhbGxvY2F0ZSAlZCBieXRlc1xuIiwKKwkJCWRvdXQoImNlcGhfbXNnX25ldyBjYW4ndCBhbGxvY2F0ZSAlZCBieXRlc1xuIiwKIAkJCSAgICAgZnJvbnRfbGVuKTsKIAkJCWdvdG8gb3V0MjsKIAkJfQpAQCAtMjM0OCw3ICsyNDQwLDE0IEBACiBvdXQyOgogCWNlcGhfbXNnX3B1dChtKTsKIG91dDoKLQlwcl9lcnIoIm1zZ19uZXcgY2FuJ3QgY3JlYXRlIHR5cGUgJWQgZnJvbnQgJWRcbiIsIHR5cGUsIGZyb250X2xlbik7CisJaWYgKCFjYW5fZmFpbCkgeworCQlwcl9lcnIoIm1zZ19uZXcgY2FuJ3QgY3JlYXRlIHR5cGUgJWQgZnJvbnQgJWRcbiIsIHR5cGUsCisJCSAgICAgICBmcm9udF9sZW4pOworCQlXQVJOX09OKDEpOworCX0gZWxzZSB7CisJCWRvdXQoIm1zZ19uZXcgY2FuJ3QgY3JlYXRlIHR5cGUgJWQgZnJvbnQgJWRcbiIsIHR5cGUsCisJCSAgICAgZnJvbnRfbGVuKTsKKwl9CiAJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKGNlcGhfbXNnX25ldyk7CkBAIC0yMzk4LDcgKzI0OTcsNyBAQAogCX0KIAlpZiAoIW1zZykgewogCQkqc2tpcCA9IDA7Ci0JCW1zZyA9IGNlcGhfbXNnX25ldyh0eXBlLCBmcm9udF9sZW4sIEdGUF9OT0ZTKTsKKwkJbXNnID0gY2VwaF9tc2dfbmV3KHR5cGUsIGZyb250X2xlbiwgR0ZQX05PRlMsIGZhbHNlKTsKIAkJaWYgKCFtc2cpIHsKIAkJCXByX2VycigidW5hYmxlIHRvIGFsbG9jYXRlIG1zZyB0eXBlICVkIGxlbiAlZFxuIiwKIAkJCSAgICAgICB0eXBlLCBmcm9udF9sZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvbW9uX2NsaWVudC5jIGIvbmV0L2NlcGgvbW9uX2NsaWVudC5jCmluZGV4IGNiZTMxZmEuLjBiNjJkZWEgMTAwNjQ0Ci0tLSBhL25ldC9jZXBoL21vbl9jbGllbnQuYworKysgYi9uZXQvY2VwaC9tb25fY2xpZW50LmMKQEAgLTExNiwxNCArMTE2LDEyIEBACiAgKi8KIHN0YXRpYyB2b2lkIF9fY2xvc2Vfc2Vzc2lvbihzdHJ1Y3QgY2VwaF9tb25fY2xpZW50ICptb25jKQogewotCWlmIChtb25jLT5jb24pIHsKLQkJZG91dCgiX19jbG9zZV9zZXNzaW9uIGNsb3NpbmcgbW9uJWRcbiIsIG1vbmMtPmN1cl9tb24pOwotCQljZXBoX2Nvbl9yZXZva2UobW9uYy0+Y29uLCBtb25jLT5tX2F1dGgpOwotCQljZXBoX2Nvbl9jbG9zZShtb25jLT5jb24pOwotCQltb25jLT5jdXJfbW9uID0gLTE7Ci0JCW1vbmMtPnBlbmRpbmdfYXV0aCA9IDA7Ci0JCWNlcGhfYXV0aF9yZXNldChtb25jLT5hdXRoKTsKLQl9CisJZG91dCgiX19jbG9zZV9zZXNzaW9uIGNsb3NpbmcgbW9uJWRcbiIsIG1vbmMtPmN1cl9tb24pOworCWNlcGhfY29uX3Jldm9rZShtb25jLT5jb24sIG1vbmMtPm1fYXV0aCk7CisJY2VwaF9jb25fY2xvc2UobW9uYy0+Y29uKTsKKwltb25jLT5jdXJfbW9uID0gLTE7CisJbW9uYy0+cGVuZGluZ19hdXRoID0gMDsKKwljZXBoX2F1dGhfcmVzZXQobW9uYy0+YXV0aCk7CiB9CiAKIC8qCkBAIC0zMDIsMTUgKzMwMCw2IEBACiAgKi8KIGludCBjZXBoX21vbmNfb3Blbl9zZXNzaW9uKHN0cnVjdCBjZXBoX21vbl9jbGllbnQgKm1vbmMpCiB7Ci0JaWYgKCFtb25jLT5jb24pIHsKLQkJbW9uYy0+Y29uID0ga21hbGxvYyhzaXplb2YoKm1vbmMtPmNvbiksIEdGUF9LRVJORUwpOwotCQlpZiAoIW1vbmMtPmNvbikKLQkJCXJldHVybiAtRU5PTUVNOwotCQljZXBoX2Nvbl9pbml0KG1vbmMtPmNsaWVudC0+bXNnciwgbW9uYy0+Y29uKTsKLQkJbW9uYy0+Y29uLT5wcml2YXRlID0gbW9uYzsKLQkJbW9uYy0+Y29uLT5vcHMgPSAmbW9uX2Nvbl9vcHM7Ci0JfQotCiAJbXV0ZXhfbG9jaygmbW9uYy0+bXV0ZXgpOwogCV9fb3Blbl9zZXNzaW9uKG1vbmMpOwogCV9fc2NoZWR1bGVfZGVsYXllZChtb25jKTsKQEAgLTUyOCwxMCArNTE3LDEyIEBACiAJaW5pdF9jb21wbGV0aW9uKCZyZXEtPmNvbXBsZXRpb24pOwogCiAJZXJyID0gLUVOT01FTTsKLQlyZXEtPnJlcXVlc3QgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfU1RBVEZTLCBzaXplb2YoKmgpLCBHRlBfTk9GUyk7CisJcmVxLT5yZXF1ZXN0ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX1NUQVRGUywgc2l6ZW9mKCpoKSwgR0ZQX05PRlMsCisJCQkJICAgIHRydWUpOwogCWlmICghcmVxLT5yZXF1ZXN0KQogCQlnb3RvIG91dDsKLQlyZXEtPnJlcGx5ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX1NUQVRGU19SRVBMWSwgMTAyNCwgR0ZQX05PRlMpOworCXJlcS0+cmVwbHkgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfU1RBVEZTX1JFUExZLCAxMDI0LCBHRlBfTk9GUywKKwkJCQkgIHRydWUpOwogCWlmICghcmVxLT5yZXBseSkKIAkJZ290byBvdXQ7CiAKQEAgLTYyNiwxMCArNjE3LDEyIEBACiAJaW5pdF9jb21wbGV0aW9uKCZyZXEtPmNvbXBsZXRpb24pOwogCiAJZXJyID0gLUVOT01FTTsKLQlyZXEtPnJlcXVlc3QgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfUE9PTE9QLCBzaXplb2YoKmgpLCBHRlBfTk9GUyk7CisJcmVxLT5yZXF1ZXN0ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX1BPT0xPUCwgc2l6ZW9mKCpoKSwgR0ZQX05PRlMsCisJCQkJICAgIHRydWUpOwogCWlmICghcmVxLT5yZXF1ZXN0KQogCQlnb3RvIG91dDsKLQlyZXEtPnJlcGx5ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX1BPT0xPUF9SRVBMWSwgMTAyNCwgR0ZQX05PRlMpOworCXJlcS0+cmVwbHkgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfUE9PTE9QX1JFUExZLCAxMDI0LCBHRlBfTk9GUywKKwkJCQkgIHRydWUpOwogCWlmICghcmVxLT5yZXBseSkKIAkJZ290byBvdXQ7CiAKQEAgLTc1NSwxMyArNzQ4LDIxIEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQltb25jLT5jb24gPSBOVUxMOworCS8qIGNvbm5lY3Rpb24gKi8KKwltb25jLT5jb24gPSBrbWFsbG9jKHNpemVvZigqbW9uYy0+Y29uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtb25jLT5jb24pCisJCWdvdG8gb3V0X21vbm1hcDsKKwljZXBoX2Nvbl9pbml0KG1vbmMtPmNsaWVudC0+bXNnciwgbW9uYy0+Y29uKTsKKwltb25jLT5jb24tPnByaXZhdGUgPSBtb25jOworCW1vbmMtPmNvbi0+b3BzID0gJm1vbl9jb25fb3BzOwogCiAJLyogYXV0aGVudGljYXRpb24gKi8KIAltb25jLT5hdXRoID0gY2VwaF9hdXRoX2luaXQoY2wtPm9wdGlvbnMtPm5hbWUsCiAJCQkJICAgIGNsLT5vcHRpb25zLT5rZXkpOwotCWlmIChJU19FUlIobW9uYy0+YXV0aCkpCi0JCXJldHVybiBQVFJfRVJSKG1vbmMtPmF1dGgpOworCWlmIChJU19FUlIobW9uYy0+YXV0aCkpIHsKKwkJZXJyID0gUFRSX0VSUihtb25jLT5hdXRoKTsKKwkJZ290byBvdXRfY29uOworCX0KIAltb25jLT5hdXRoLT53YW50X2tleXMgPQogCQlDRVBIX0VOVElUWV9UWVBFX0FVVEggfCBDRVBIX0VOVElUWV9UWVBFX01PTiB8CiAJCUNFUEhfRU5USVRZX1RZUEVfT1NEIHwgQ0VQSF9FTlRJVFlfVFlQRV9NRFM7CkBAIC03NzAsMTkgKzc3MSwyMSBAQAogCWVyciA9IC1FTk9NRU07CiAJbW9uYy0+bV9zdWJzY3JpYmVfYWNrID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX01PTl9TVUJTQ1JJQkVfQUNLLAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjZXBoX21vbl9zdWJzY3JpYmVfYWNrKSwKLQkJCQkgICAgIEdGUF9OT0ZTKTsKKwkJCQkgICAgIEdGUF9OT0ZTLCB0cnVlKTsKIAlpZiAoIW1vbmMtPm1fc3Vic2NyaWJlX2FjaykKLQkJZ290byBvdXRfbW9ubWFwOworCQlnb3RvIG91dF9hdXRoOwogCi0JbW9uYy0+bV9zdWJzY3JpYmUgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfTU9OX1NVQlNDUklCRSwgOTYsIEdGUF9OT0ZTKTsKKwltb25jLT5tX3N1YnNjcmliZSA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19NT05fU1VCU0NSSUJFLCA5NiwgR0ZQX05PRlMsCisJCQkJCSB0cnVlKTsKIAlpZiAoIW1vbmMtPm1fc3Vic2NyaWJlKQogCQlnb3RvIG91dF9zdWJzY3JpYmVfYWNrOwogCi0JbW9uYy0+bV9hdXRoX3JlcGx5ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX0FVVEhfUkVQTFksIDQwOTYsIEdGUF9OT0ZTKTsKKwltb25jLT5tX2F1dGhfcmVwbHkgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQVVUSF9SRVBMWSwgNDA5NiwgR0ZQX05PRlMsCisJCQkJCSAgdHJ1ZSk7CiAJaWYgKCFtb25jLT5tX2F1dGhfcmVwbHkpCiAJCWdvdG8gb3V0X3N1YnNjcmliZTsKIAotCW1vbmMtPm1fYXV0aCA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19BVVRILCA0MDk2LCBHRlBfTk9GUyk7CisJbW9uYy0+bV9hdXRoID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX0FVVEgsIDQwOTYsIEdGUF9OT0ZTLCB0cnVlKTsKIAltb25jLT5wZW5kaW5nX2F1dGggPSAwOwogCWlmICghbW9uYy0+bV9hdXRoKQogCQlnb3RvIG91dF9hdXRoX3JlcGx5OwpAQCAtODA4LDYgKzgxMSwxMCBAQAogCWNlcGhfbXNnX3B1dChtb25jLT5tX3N1YnNjcmliZSk7CiBvdXRfc3Vic2NyaWJlX2FjazoKIAljZXBoX21zZ19wdXQobW9uYy0+bV9zdWJzY3JpYmVfYWNrKTsKK291dF9hdXRoOgorCWNlcGhfYXV0aF9kZXN0cm95KG1vbmMtPmF1dGgpOworb3V0X2NvbjoKKwltb25jLT5jb24tPm9wcy0+cHV0KG1vbmMtPmNvbik7CiBvdXRfbW9ubWFwOgogCWtmcmVlKG1vbmMtPm1vbm1hcCk7CiBvdXQ6CkBAIC04MjIsMTEgKzgyOSwxMSBAQAogCiAJbXV0ZXhfbG9jaygmbW9uYy0+bXV0ZXgpOwogCV9fY2xvc2Vfc2Vzc2lvbihtb25jKTsKLQlpZiAobW9uYy0+Y29uKSB7Ci0JCW1vbmMtPmNvbi0+cHJpdmF0ZSA9IE5VTEw7Ci0JCW1vbmMtPmNvbi0+b3BzLT5wdXQobW9uYy0+Y29uKTsKLQkJbW9uYy0+Y29uID0gTlVMTDsKLQl9CisKKwltb25jLT5jb24tPnByaXZhdGUgPSBOVUxMOworCW1vbmMtPmNvbi0+b3BzLT5wdXQobW9uYy0+Y29uKTsKKwltb25jLT5jb24gPSBOVUxMOworCiAJbXV0ZXhfdW5sb2NrKCZtb25jLT5tdXRleCk7CiAKIAljZXBoX2F1dGhfZGVzdHJveShtb25jLT5hdXRoKTsKQEAgLTk3Myw3ICs5ODAsNyBAQAogCWNhc2UgQ0VQSF9NU0dfTU9OX01BUDoKIAljYXNlIENFUEhfTVNHX01EU19NQVA6CiAJY2FzZSBDRVBIX01TR19PU0RfTUFQOgotCQltID0gY2VwaF9tc2dfbmV3KHR5cGUsIGZyb250X2xlbiwgR0ZQX05PRlMpOworCQltID0gY2VwaF9tc2dfbmV3KHR5cGUsIGZyb250X2xlbiwgR0ZQX05PRlMsIGZhbHNlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMDAwLDcgKzEwMDcsNyBAQAogCWlmICghY29uLT5wcml2YXRlKQogCQlnb3RvIG91dDsKIAotCWlmIChtb25jLT5jb24gJiYgIW1vbmMtPmh1bnRpbmcpCisJaWYgKCFtb25jLT5odW50aW5nKQogCQlwcl9pbmZvKCJtb24lZCAlcyBzZXNzaW9uIGxvc3QsICIKIAkJCSJodW50aW5nIGZvciBuZXcgbW9uXG4iLCBtb25jLT5jdXJfbW9uLAogCQkJY2VwaF9wcl9hZGRyKCZtb25jLT5jb24tPnBlZXJfYWRkci5pbl9hZGRyKSk7CmRpZmYgLS1naXQgYS9uZXQvY2VwaC9tc2dwb29sLmMgYi9uZXQvY2VwaC9tc2dwb29sLmMKaW5kZXggMWY0Y2IzMC4uMTFkNWY0MSAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvbXNncG9vbC5jCisrKyBiL25ldC9jZXBoL21zZ3Bvb2wuYwpAQCAtMTIsNyArMTIsNyBAQAogCXN0cnVjdCBjZXBoX21zZ3Bvb2wgKnBvb2wgPSBhcmc7CiAJc3RydWN0IGNlcGhfbXNnICptc2c7CiAKLQltc2cgPSBjZXBoX21zZ19uZXcoMCwgcG9vbC0+ZnJvbnRfbGVuLCBnZnBfbWFzayk7CisJbXNnID0gY2VwaF9tc2dfbmV3KDAsIHBvb2wtPmZyb250X2xlbiwgZ2ZwX21hc2ssIHRydWUpOwogCWlmICghbXNnKSB7CiAJCWRvdXQoIm1zZ3Bvb2xfYWxsb2MgJXMgZmFpbGVkXG4iLCBwb29sLT5uYW1lKTsKIAl9IGVsc2UgewpAQCAtNjEsNyArNjEsNyBAQAogCQlXQVJOX09OKDEpOwogCiAJCS8qIHRyeSB0byBhbGxvYyBhIGZyZXNoIG1lc3NhZ2UgKi8KLQkJcmV0dXJuIGNlcGhfbXNnX25ldygwLCBmcm9udF9sZW4sIEdGUF9OT0ZTKTsKKwkJcmV0dXJuIGNlcGhfbXNnX25ldygwLCBmcm9udF9sZW4sIEdGUF9OT0ZTLCBmYWxzZSk7CiAJfQogCiAJbXNnID0gbWVtcG9vbF9hbGxvYyhwb29sLT5wb29sLCBHRlBfTk9GUyk7CmRpZmYgLS1naXQgYS9uZXQvY2VwaC9vc2RfY2xpZW50LmMgYi9uZXQvY2VwaC9vc2RfY2xpZW50LmMKaW5kZXggODhhZDhhMi4uNzMzZTQ2MDAgMTAwNjQ0Ci0tLSBhL25ldC9jZXBoL29zZF9jbGllbnQuYworKysgYi9uZXQvY2VwaC9vc2RfY2xpZW50LmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCQltc2cgPSBjZXBoX21zZ3Bvb2xfZ2V0KCZvc2RjLT5tc2dwb29sX29wX3JlcGx5LCAwKTsKIAllbHNlCiAJCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19PU0RfT1BSRVBMWSwKLQkJCQkgICBPU0RfT1BSRVBMWV9GUk9OVF9MRU4sIGdmcF9mbGFncyk7CisJCQkJICAgT1NEX09QUkVQTFlfRlJPTlRfTEVOLCBnZnBfZmxhZ3MsIHRydWUpOwogCWlmICghbXNnKSB7CiAJCWNlcGhfb3NkY19wdXRfcmVxdWVzdChyZXEpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCWlmICh1c2VfbWVtcG9vbCkKIAkJbXNnID0gY2VwaF9tc2dwb29sX2dldCgmb3NkYy0+bXNncG9vbF9vcCwgMCk7CiAJZWxzZQotCQltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfT1NEX09QLCBtc2dfc2l6ZSwgZ2ZwX2ZsYWdzKTsKKwkJbXNnID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX09TRF9PUCwgbXNnX3NpemUsIGdmcF9mbGFncywgdHJ1ZSk7CiAJaWYgKCFtc2cpIHsKIAkJY2VwaF9vc2RjX3B1dF9yZXF1ZXN0KHJlcSk7CiAJCXJldHVybiBOVUxMOwpAQCAtOTQzLDcgKzk0Myw3IEBACiAgKiBDYWxsZXIgc2hvdWxkIGhvbGQgbWFwX3NlbSBmb3IgcmVhZCBhbmQgcmVxdWVzdF9tdXRleC4KICAqLwogc3RhdGljIGludCBfX21hcF9yZXF1ZXN0KHN0cnVjdCBjZXBoX29zZF9jbGllbnQgKm9zZGMsCi0JCQkgc3RydWN0IGNlcGhfb3NkX3JlcXVlc3QgKnJlcSkKKwkJCSBzdHJ1Y3QgY2VwaF9vc2RfcmVxdWVzdCAqcmVxLCBpbnQgZm9yY2VfcmVzZW5kKQogewogCXN0cnVjdCBjZXBoX29zZF9yZXF1ZXN0X2hlYWQgKnJlcWhlYWQgPSByZXEtPnJfcmVxdWVzdC0+ZnJvbnQuaW92X2Jhc2U7CiAJc3RydWN0IGNlcGhfcGcgcGdpZDsKQEAgLTk2Nyw3ICs5NjcsOCBAQAogCQludW0gPSBlcnI7CiAJfQogCi0JaWYgKChyZXEtPnJfb3NkICYmIHJlcS0+cl9vc2QtPm9fb3NkID09IG8gJiYKKwlpZiAoKCFmb3JjZV9yZXNlbmQgJiYKKwkgICAgIHJlcS0+cl9vc2QgJiYgcmVxLT5yX29zZC0+b19vc2QgPT0gbyAmJgogCSAgICAgcmVxLT5yX3NlbnQgPj0gcmVxLT5yX29zZC0+b19pbmNhcm5hdGlvbiAmJgogCSAgICAgcmVxLT5yX251bV9wZ19vc2RzID09IG51bSAmJgogCSAgICAgbWVtY21wKHJlcS0+cl9wZ19vc2RzLCBhY3RpbmcsIHNpemVvZihhY3RpbmdbMF0pKm51bSkgPT0gMCkgfHwKQEAgLTEyODksMTggKzEyOTAsMTggQEAKICAqCiAgKiBDYWxsZXIgc2hvdWxkIGhvbGQgbWFwX3NlbSBmb3IgcmVhZCBhbmQgcmVxdWVzdF9tdXRleC4KICAqLwotc3RhdGljIHZvaWQga2lja19yZXF1ZXN0cyhzdHJ1Y3QgY2VwaF9vc2RfY2xpZW50ICpvc2RjKQorc3RhdGljIHZvaWQga2lja19yZXF1ZXN0cyhzdHJ1Y3QgY2VwaF9vc2RfY2xpZW50ICpvc2RjLCBpbnQgZm9yY2VfcmVzZW5kKQogewogCXN0cnVjdCBjZXBoX29zZF9yZXF1ZXN0ICpyZXEsICpucmVxOwogCXN0cnVjdCByYl9ub2RlICpwOwogCWludCBuZWVkbWFwID0gMDsKIAlpbnQgZXJyOwogCi0JZG91dCgia2lja19yZXF1ZXN0c1xuIik7CisJZG91dCgia2lja19yZXF1ZXN0cyAlc1xuIiwgZm9yY2VfcmVzZW5kID8gIiAoZm9yY2UgcmVzZW5kKSIgOiAiIik7CiAJbXV0ZXhfbG9jaygmb3NkYy0+cmVxdWVzdF9tdXRleCk7CiAJZm9yIChwID0gcmJfZmlyc3QoJm9zZGMtPnJlcXVlc3RzKTsgcDsgcCA9IHJiX25leHQocCkpIHsKIAkJcmVxID0gcmJfZW50cnkocCwgc3RydWN0IGNlcGhfb3NkX3JlcXVlc3QsIHJfbm9kZSk7Ci0JCWVyciA9IF9fbWFwX3JlcXVlc3Qob3NkYywgcmVxKTsKKwkJZXJyID0gX19tYXBfcmVxdWVzdChvc2RjLCByZXEsIGZvcmNlX3Jlc2VuZCk7CiAJCWlmIChlcnIgPCAwKQogCQkJY29udGludWU7ICAvKiBlcnJvciAqLwogCQlpZiAocmVxLT5yX29zZCA9PSBOVUxMKSB7CkBAIC0xMzE4LDcgKzEzMTksNyBAQAogCQkJCSByX2xpbmdlcl9pdGVtKSB7CiAJCWRvdXQoImxpbmdlciByZXE9JXAgcmVxLT5yX29zZD0lcFxuIiwgcmVxLCByZXEtPnJfb3NkKTsKIAotCQllcnIgPSBfX21hcF9yZXF1ZXN0KG9zZGMsIHJlcSk7CisJCWVyciA9IF9fbWFwX3JlcXVlc3Qob3NkYywgcmVxLCBmb3JjZV9yZXNlbmQpOwogCQlpZiAoZXJyID09IDApCiAJCQljb250aW51ZTsgIC8qIG5vIGNoYW5nZSBhbmQgbm8gb3NkIHdhcyBzcGVjaWZpZWQgKi8KIAkJaWYgKGVyciA8IDApCkBAIC0xMzk1LDcgKzEzOTYsNyBAQAogCQkJCWNlcGhfb3NkbWFwX2Rlc3Ryb3kob3NkYy0+b3NkbWFwKTsKIAkJCQlvc2RjLT5vc2RtYXAgPSBuZXdtYXA7CiAJCQl9Ci0JCQlraWNrX3JlcXVlc3RzKG9zZGMpOworCQkJa2lja19yZXF1ZXN0cyhvc2RjLCAwKTsKIAkJCXJlc2V0X2NoYW5nZWRfb3Nkcyhvc2RjKTsKIAkJfSBlbHNlIHsKIAkJCWRvdXQoImlnbm9yaW5nIGluY3JlbWVudGFsIG1hcCAldSBsZW4gJWRcbiIsCkBAIC0xNDIzLDYgKzE0MjQsOCBAQAogCQkJICAgICAib2xkZXIgdGhhbiBvdXIgJXVcbiIsIGVwb2NoLCBtYXBsZW4sCiAJCQkgICAgIG9zZGMtPm9zZG1hcC0+ZXBvY2gpOwogCQl9IGVsc2UgeworCQkJaW50IHNraXBwZWRfbWFwID0gMDsKKwogCQkJZG91dCgidGFraW5nIGZ1bGwgbWFwICV1IGxlbiAlZFxuIiwgZXBvY2gsIG1hcGxlbik7CiAJCQluZXdtYXAgPSBvc2RtYXBfZGVjb2RlKCZwLCBwK21hcGxlbik7CiAJCQlpZiAoSVNfRVJSKG5ld21hcCkpIHsKQEAgLTE0MzIsOSArMTQzNSwxMiBAQAogCQkJQlVHX09OKCFuZXdtYXApOwogCQkJb2xkbWFwID0gb3NkYy0+b3NkbWFwOwogCQkJb3NkYy0+b3NkbWFwID0gbmV3bWFwOwotCQkJaWYgKG9sZG1hcCkKKwkJCWlmIChvbGRtYXApIHsKKwkJCQlpZiAob2xkbWFwLT5lcG9jaCArIDEgPCBuZXdtYXAtPmVwb2NoKQorCQkJCQlza2lwcGVkX21hcCA9IDE7CiAJCQkJY2VwaF9vc2RtYXBfZGVzdHJveShvbGRtYXApOwotCQkJa2lja19yZXF1ZXN0cyhvc2RjKTsKKwkJCX0KKwkJCWtpY2tfcmVxdWVzdHMob3NkYywgc2tpcHBlZF9tYXApOwogCQl9CiAJCXAgKz0gbWFwbGVuOwogCQlucl9tYXBzLS07CkBAIC0xNzA3LDcgKzE3MTMsNyBAQAogCSAqIHRoZSByZXF1ZXN0IHN0aWxsIGhhbid0IGJlZW4gdG91Y2hlZCB5ZXQuCiAJICovCiAJaWYgKHJlcS0+cl9zZW50ID09IDApIHsKLQkJcmMgPSBfX21hcF9yZXF1ZXN0KG9zZGMsIHJlcSk7CisJCXJjID0gX19tYXBfcmVxdWVzdChvc2RjLCByZXEsIDApOwogCQlpZiAocmMgPCAwKSB7CiAJCQlpZiAobm9mYWlsKSB7CiAJCQkJZG91dCgib3NkY19zdGFydF9yZXF1ZXN0IGZhaWxlZCBtYXAsICIKQEAgLTIwMzIsNyArMjAzOCw3IEBACiAJaWYgKGZyb250ID4gcmVxLT5yX3JlcGx5LT5mcm9udC5pb3ZfbGVuKSB7CiAJCXByX3dhcm5pbmcoImdldF9yZXBseSBmcm9udCAlZCA+IHByZWFsbG9jYXRlZCAlZFxuIiwKIAkJCSAgIGZyb250LCAoaW50KXJlcS0+cl9yZXBseS0+ZnJvbnQuaW92X2xlbik7Ci0JCW0gPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfT1NEX09QUkVQTFksIGZyb250LCBHRlBfTk9GUyk7CisJCW0gPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfT1NEX09QUkVQTFksIGZyb250LCBHRlBfTk9GUywgZmFsc2UpOwogCQlpZiAoIW0pCiAJCQlnb3RvIG91dDsKIAkJY2VwaF9tc2dfcHV0KHJlcS0+cl9yZXBseSk7CkBAIC0yMDgwLDcgKzIwODYsNyBAQAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQ0VQSF9NU0dfT1NEX01BUDoKIAljYXNlIENFUEhfTVNHX1dBVENIX05PVElGWToKLQkJcmV0dXJuIGNlcGhfbXNnX25ldyh0eXBlLCBmcm9udCwgR0ZQX05PRlMpOworCQlyZXR1cm4gY2VwaF9tc2dfbmV3KHR5cGUsIGZyb250LCBHRlBfTk9GUywgZmFsc2UpOwogCWNhc2UgQ0VQSF9NU0dfT1NEX09QUkVQTFk6CiAJCXJldHVybiBnZXRfcmVwbHkoY29uLCBoZHIsIHNraXApOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggYzU3OGQ5My4uNmRlZjkwZSAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxuZXQvc2NtLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldl9hZGRyX2xpc3RzLmMgYi9uZXQvY29yZS9kZXZfYWRkcl9saXN0cy5jCmluZGV4IDI4M2QxYjguLjI3N2ZhZWYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldl9hZGRyX2xpc3RzLmMKKysrIGIvbmV0L2NvcmUvZGV2X2FkZHJfbGlzdHMuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmliX3J1bGVzLmMgYi9uZXQvY29yZS9maWJfcnVsZXMuYwppbmRleCA1N2U4Zjk1Li5jMDJlNjNjIDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWJfcnVsZXMuYworKysgYi9uZXQvY29yZS9maWJfcnVsZXMuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9maWJfcnVsZXMuaD4KZGlmZiAtLWdpdCBhL25ldC9jb3JlL25laWdoYm91ci5jIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKaW5kZXggOTA5ZWNiMy4uMDM5ZDUxZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMKKysrIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKQEAgLTg3MiwxMiArODcyLDggQEAKIAlub3cgPSBqaWZmaWVzOwogCW5leHQgPSBub3cgKyBIWjsKIAotCWlmICghKHN0YXRlICYgTlVEX0lOX1RJTUVSKSkgewotI2lmbmRlZiBDT05GSUdfU01QCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm5laWdoOiB0aW1lciAmICFudWRfaW5fdGltZXJcbiIpOwotI2VuZGlmCisJaWYgKCEoc3RhdGUgJiBOVURfSU5fVElNRVIpKQogCQlnb3RvIG91dDsKLQl9CiAKIAlpZiAoc3RhdGUgJiBOVURfUkVBQ0hBQkxFKSB7CiAJCWlmICh0aW1lX2JlZm9yZV9lcShub3csCmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXQtc3lzZnMuYyBiL25ldC9jb3JlL25ldC1zeXNmcy5jCmluZGV4IDc2MDRhNjMuLmM3MWM0MzQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldC1zeXNmcy5jCisrKyBiL25ldC9jb3JlL25ldC1zeXNmcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3dleHQuaD4KIAogI2luY2x1ZGUgIm5ldC1zeXNmcy5oIgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0LXRyYWNlcy5jIGIvbmV0L2NvcmUvbmV0LXRyYWNlcy5jCmluZGV4IDUyMzgwYjEuLmJhM2MwMTIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldC10cmFjZXMuYworKysgYi9uZXQvY29yZS9uZXQtdHJhY2VzLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldHBvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMgYi9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKaW5kZXggNWJiZGJmMC4uYWVmY2Q3YSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCisrKyBiL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0ZXZlbnQuYyBiL25ldC9jb3JlL25ldGV2ZW50LmMKaW5kZXggODY1ZjBjZS4uZjE3Y2NkMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0ZXZlbnQuYworKysgYi9uZXQvY29yZS9uZXRldmVudC5jCkBAIC0xNSw2ICsxNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRldmVudC5oPgogCiBzdGF0aWMgQVRPTUlDX05PVElGSUVSX0hFQUQobmV0ZXZlbnRfbm90aWZfY2hhaW4pOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0cG9sbC5jIGIvbmV0L2NvcmUvbmV0cG9sbC5jCmluZGV4IGY1N2Q5NDYuLmNmNjRjMWYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldHBvbGwuYworKysgYi9uZXQvY29yZS9uZXRwb2xsLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3VkcC5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggY2E0ZGI0MC4uMDY0MzhmOSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTE4OSw2ICsxODksNyBAQAogCSAqIGFsaWduZWQgbWVtb3J5IGJsb2NrcywgdW5sZXNzIFNMVUIvU0xBQiBkZWJ1ZyBpcyBlbmFibGVkLgogCSAqIEJvdGggc2tiLT5oZWFkIGFuZCBza2Jfc2hhcmVkX2luZm8gYXJlIGNhY2hlIGxpbmUgYWxpZ25lZC4KIAkgKi8KKwlzaXplID0gU0tCX0RBVEFfQUxJR04oc2l6ZSk7CiAJc2l6ZSArPSBTS0JfREFUQV9BTElHTihzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbykpOwogCWRhdGEgPSBrbWFsbG9jX25vZGVfdHJhY2tfY2FsbGVyKHNpemUsIGdmcF9tYXNrLCBub2RlKTsKIAlpZiAoIWRhdGEpCkBAIC0zMTY4LDYgKzMxNjksMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNrYl90c3RhbXBfdHgpOwogCit2b2lkIHNrYl9jb21wbGV0ZV93aWZpX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGFja2VkKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNrYi0+c2s7CisJc3RydWN0IHNvY2tfZXh0ZXJyX3NrYiAqc2VycjsKKwlpbnQgZXJyOworCisJc2tiLT53aWZpX2Fja2VkX3ZhbGlkID0gMTsKKwlza2ItPndpZmlfYWNrZWQgPSBhY2tlZDsKKworCXNlcnIgPSBTS0JfRVhUX0VSUihza2IpOworCW1lbXNldChzZXJyLCAwLCBzaXplb2YoKnNlcnIpKTsKKwlzZXJyLT5lZS5lZV9lcnJubyA9IEVOT01TRzsKKwlzZXJyLT5lZS5lZV9vcmlnaW4gPSBTT19FRV9PUklHSU5fVFhTVEFUVVM7CisKKwllcnIgPSBzb2NrX3F1ZXVlX2Vycl9za2Ioc2ssIHNrYik7CisJaWYgKGVycikKKwkJa2ZyZWVfc2tiKHNrYik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChza2JfY29tcGxldGVfd2lmaV9hY2spOworCiAKIC8qKgogICogc2tiX3BhcnRpYWxfY3N1bV9zZXQgLSBzZXQgdXAgYW5kIHZlcmlmeSBwYXJ0aWFsIGNzdW0gdmFsdWVzIGZvciBwYWNrZXQKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCA0ZWQ3YjFkLi5jYmRmNTFjIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC03NDAsNiArNzQwLDExIEBACiAJY2FzZSBTT19SWFFfT1ZGTDoKIAkJc29ja192YWxib29sX2ZsYWcoc2ssIFNPQ0tfUlhRX09WRkwsIHZhbGJvb2wpOwogCQlicmVhazsKKworCWNhc2UgU09fV0lGSV9TVEFUVVM6CisJCXNvY2tfdmFsYm9vbF9mbGFnKHNrLCBTT0NLX1dJRklfU1RBVFVTLCB2YWxib29sKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlyZXQgPSAtRU5PUFJPVE9PUFQ7CiAJCWJyZWFrOwpAQCAtOTYxLDYgKzk2NiwxMCBAQAogCQl2LnZhbCA9ICEhc29ja19mbGFnKHNrLCBTT0NLX1JYUV9PVkZMKTsKIAkJYnJlYWs7CiAKKwljYXNlIFNPX1dJRklfU1RBVFVTOgorCQl2LnZhbCA9ICEhc29ja19mbGFnKHNrLCBTT0NLX1dJRklfU1RBVFVTKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3RpbWVzdGFtcGluZy5jIGIvbmV0L2NvcmUvdGltZXN0YW1waW5nLmMKaW5kZXggODJmYjI4OC4uNjYxYjVhNCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvdGltZXN0YW1waW5nLmMKKysrIGIvbmV0L2NvcmUvdGltZXN0YW1waW5nLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9wdHBfY2xhc3NpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIHN0cnVjdCBzb2NrX2ZpbHRlciBwdHBfZmlsdGVyW10gPSB7CiAJUFRQX0ZJTFRFUgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvdXNlcl9kbWEuYyBiL25ldC9jb3JlL3VzZXJfZG1hLmMKaW5kZXggMmQ3Y2YzZC4uMWI1ZmVmZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvdXNlcl9kbWEuYworKysgYi9uZXQvY29yZS91c2VyX2RtYS5jCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L25ldGRtYS5oPgogCmRpZmYgLS1naXQgYS9uZXQvZGNiL2RjYmV2ZW50LmMgYi9uZXQvZGNiL2RjYmV2ZW50LmMKaW5kZXggNjY1YTg4MC4uMWQ5ZWI3YyAxMDA2NDQKLS0tIGEvbmV0L2RjYi9kY2JldmVudC5jCisrKyBiL25ldC9kY2IvZGNiZXZlbnQuYwpAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIEFUT01JQ19OT1RJRklFUl9IRUFEKGRjYmV2ZW50X25vdGlmX2NoYWluKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RjYi9kY2JubC5jIGIvbmV0L2RjYi9kY2JubC5jCmluZGV4IDliZmJjMWQuLmQ4NjA1MzAgMTAwNjQ0Ci0tLSBhL25ldC9kY2IvZGNibmwuYworKysgYi9uZXQvZGNiL2RjYm5sLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kY2JubC5oPgogI2luY2x1ZGUgPG5ldC9kY2JldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvYWNrdmVjLmMgYi9uZXQvZGNjcC9hY2t2ZWMuYwppbmRleCAyNWI3YThkLi5iYTA3ODI0IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9hY2t2ZWMuYworKysgYi9uZXQvZGNjcC9hY2t2ZWMuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImRjY3AuaCIKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZGNjcF9hY2t2ZWNfc2xhYjsKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZGNjcF9hY2t2ZWNfcmVjb3JkX3NsYWI7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5jIGIvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuYwppbmRleCA0OTAyMDI5Li4xZjk0YjdlIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMKQEAgLTQsNiArNCw3IEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgQWJlcmRlZW4sIFNjb3RsYW5kLCBVSwogICogQ29weXJpZ2h0IChjKSAyMDA3IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUByZWRoYXQuY29tPgogICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlICJ0ZnJjLmgiCiAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9URlJDX0RFQlVHCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY0LmMgYi9uZXQvZGNjcC9pcHY0LmMKaW5kZXggMzMyNjM5Yi4uOTBhOTE5YSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2NC5jCisrKyBiL25ldC9kY2NwL2lwdjQuYwpAQCAtNDMzLDYgKzQzMyw3IEBACiAJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9MSVNURU5EUk9QUyk7CiAJcmV0dXJuIE5VTEw7CiBwdXRfYW5kX2V4aXQ6CisJYmhfdW5sb2NrX3NvY2sobmV3c2spOwogCXNvY2tfcHV0KG5ld3NrKTsKIAlnb3RvIGV4aXQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvZGNjcC90aW1lci5jIGIvbmV0L2RjY3AvdGltZXIuYwppbmRleCA3NTg3ODcwLi4xNmYwYjIyIDEwMDY0NAotLS0gYS9uZXQvZGNjcC90aW1lci5jCisrKyBiL25ldC9kY2NwL3RpbWVyLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RjY3AuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImRjY3AuaCIKIApkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jIGIvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCmluZGV4IDQzNDUwYzEuLmE3N2QxNjEgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fcm91dGUuYworKysgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKQEAgLTc3LDYgKzc3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfZGVjbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fcnVsZXMuYyBiL25ldC9kZWNuZXQvZG5fcnVsZXMuYwppbmRleCBmMGVmYjBjLi5mNjVjOWRkIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX3J1bGVzLmMKKysrIGIvbmV0L2RlY25ldC9kbl9ydWxlcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CmRpZmYgLS1naXQgYS9uZXQvZHNhL2RzYS5jIGIvbmV0L2RzYS9kc2EuYwppbmRleCAzZmIxNGI3Li4wZGMxNTg5IDEwMDY0NAotLS0gYS9uZXQvZHNhL2RzYS5jCisrKyBiL25ldC9kc2EvZHNhLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2RzYS5oPgogI2luY2x1ZGUgImRzYV9wcml2LmgiCiAKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L25sLW1hYy5jIGIvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMKaW5kZXggNzFlZTExMC4uYWRhZjQ2MiAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9ubDgwMjE1NC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9hZl9pZWVlODAyMTU0Lmg+CiAjaW5jbHVkZSA8bmV0L25sODAyMTU0Lmg+CiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxNTQuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKaW5kZXggYTUzYmIxYi4uNDYzMzliYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3J1bGVzLmMKKysrIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3RyaWUuYyBiL25ldC9pcHY0L2ZpYl90cmllLmMKaW5kZXggODlkNmY3MS4uMzdiNjcxMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3RyaWUuYworKysgYi9uZXQvaXB2NC9maWJfdHJpZS5jCkBAIC03Myw2ICs3Myw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X3RpbWV3YWl0X3NvY2suYyBiL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jCmluZGV4IDQ0ZDY1ZDUuLjg5MTY4YzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jCisrKyBiL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva21lbWNoZWNrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2hhc2h0YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGNvbmZpZy5jIGIvbmV0L2lwdjQvaXBjb25maWcuYwppbmRleCA0NzJhOGM0Li4wZGEyYWZjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGNvbmZpZy5jCisrKyBiL25ldC9pcHY0L2lwY29uZmlnLmMKQEAgLTU0LDYgKzU0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwbXIuYyBiL25ldC9pcHY0L2lwbXIuYwppbmRleCA2MTY0ZTk4Li43NmE3ZjA3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcG1yLmMKKysrIGIvbmV0L2lwdjQvaXBtci5jCkBAIC02MSw2ICs2MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXBpcC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IDkyOWIyN2IuLjk4OTk2MTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCmluZGV4IGRiOGQyMmQuLmE2Mzk5NjcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwpAQCAtMzk1LDcgKzM5NSw2IEBACiAJCQljb25maWcgPSBjbHVzdGVyaXBfY29uZmlnX2luaXQoY2lwaW5mbywKIAkJCQkJCQllLT5pcC5kc3Quc19hZGRyLCBkZXYpOwogCQkJaWYgKCFjb25maWcpIHsKLQkJCQlwcl9pbmZvKCJjYW5ub3QgYWxsb2NhdGUgY29uZmlnXG4iKTsKIAkJCQlkZXZfcHV0KGRldik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCmluZGV4IDQ0NmUwZjQuLmI1NTA4MTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCkBAIC0xMzUsMTAgKzEzNSw4IEBACiAJICogZHVlIHRvIHNsYWIgYWxsb2NhdG9yIHJlc3RyaWN0aW9ucyAqLwogCiAJbiA9IG1heChzaXplLCBubGJ1ZnNpeik7Ci0Jc2tiID0gYWxsb2Nfc2tiKG4sIEdGUF9BVE9NSUMpOworCXNrYiA9IGFsbG9jX3NrYihuLCBHRlBfQVRPTUlDIHwgX19HRlBfTk9XQVJOKTsKIAlpZiAoIXNrYikgewotCQlwcl9kZWJ1ZygiY2Fubm90IGFsbG9jIHdob2xlIGJ1ZmZlciAldWIhXG4iLCBuKTsKLQogCQlpZiAobiA+IHNpemUpIHsKIAkJCS8qIHRyeSB0byBhbGxvY2F0ZSBvbmx5IGFzIG11Y2ggYXMgd2UgbmVlZCBmb3IKIAkJCSAqIGN1cnJlbnQgcGFja2V0ICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9jb21wYXQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCmluZGV4IDU1ODU5ODAuLjk2ODJiMzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3RfbnVsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RydWN0IGN0X2l0ZXJfc3RhdGUgewogCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fY29tbW9uLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2NvbW1vbi5jCmluZGV4IGY1MmQ0MWUuLmEzZDk5NzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fY29tbW9uLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19jb21tb24uYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc2VjdXJlX3NlcS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19pY21wLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2ljbXAuYwppbmRleCA1NzQ0YzNlLi45ZjRkYzEyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2ljbXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2ljbXAuYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaWNtcC5oPgogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3NjdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fc2N0cC5jCmluZGV4IDc1NjMzMWQuLmJkNWE4MGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fc2N0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fc2N0cC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvc2N0cC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9zY3RwL2NoZWNrc3VtLmg+CiAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9wcm90b2NvbC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b190Y3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdGNwLmMKaW5kZXggYWE0NjBhNS4uMGQ2N2JiOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b190Y3AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3RjcC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwLmMKaW5kZXggZGZlNjVjNy4uMGIxYjg2MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcC5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHBsaXRlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcGxpdGUuYwppbmRleCAzY2M4YzhhLi5mODNlZjIzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcGxpdGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcGxpdGUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9wcm90b2NvbC5oPgogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NubXBfYmFzaWMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc25tcF9iYXNpYy5jCmluZGV4IGQxY2I0MTIuLjIxMzNjMzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc25tcF9iYXNpYy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc25tcF9iYXNpYy5jCkBAIC00MDAsMTEgKzQwMCw4IEBACiAJKmxlbiA9IDA7CiAKIAkqb2N0ZXRzID0ga21hbGxvYyhlb2MgLSBjdHgtPnBvaW50ZXIsIEdGUF9BVE9NSUMpOwotCWlmICgqb2N0ZXRzID09IE5VTEwpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKKwlpZiAoKm9jdGV0cyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLQl9CiAKIAlwdHIgPSAqb2N0ZXRzOwogCXdoaWxlIChjdHgtPnBvaW50ZXIgPCBlb2MpIHsKQEAgLTQ1MSwxMSArNDQ4LDggQEAKIAkJcmV0dXJuIDA7CiAKIAkqb2lkID0ga21hbGxvYyhzaXplICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfQVRPTUlDKTsKLQlpZiAoKm9pZCA9PSBOVUxMKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcl9ub3RpY2UoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJaWYgKCpvaWQgPT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJb3B0ciA9ICpvaWQ7CiAKQEAgLTcyOCw4ICs3MjIsNiBAQAogCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICgqb2JqID09IE5VTEwpIHsKIAkJCWtmcmVlKGlkKTsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJcHJfbm90aWNlKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJKCpvYmopLT5zeW50YXgubFswXSA9IGw7CkBAIC03NDQsOCArNzM2LDYgQEAKIAkJaWYgKCpvYmogPT0gTlVMTCkgewogCQkJa2ZyZWUocCk7CiAJCQlrZnJlZShpZCk7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCW1lbWNweSgoKm9iaiktPnN5bnRheC5jLCBwLCBsZW4pOwpAQCAtNzU5LDggKzc0OSw2IEBACiAJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCpvYmogPT0gTlVMTCkgewogCQkJa2ZyZWUoaWQpOwotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcl9ub3RpY2UoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAoIWFzbjFfbnVsbF9kZWNvZGUoY3R4LCBlbmQpKSB7CkBAIC03ODAsOCArNzY4LDYgQEAKIAkJaWYgKCpvYmogPT0gTlVMTCkgewogCQkJa2ZyZWUobHApOwogCQkJa2ZyZWUoaWQpOwotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcl9ub3RpY2UoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQltZW1jcHkoKCpvYmopLT5zeW50YXgudWwsIGxwLCBsZW4pOwpAQCAtODAxLDggKzc4Nyw2IEBACiAJCWlmICgqb2JqID09IE5VTEwpIHsKIAkJCWtmcmVlKHApOwogCQkJa2ZyZWUoaWQpOwotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcl9ub3RpY2UoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQltZW1jcHkoKCpvYmopLT5zeW50YXgudWMsIHAsIGxlbik7CkBAIC04MTksOCArODAzLDYgQEAKIAkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoKm9iaiA9PSBOVUxMKSB7CiAJCQlrZnJlZShpZCk7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCSgqb2JqKS0+c3ludGF4LnVsWzBdID0gdWw7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9waW5nLmMgYi9uZXQvaXB2NC9waW5nLmMKaW5kZXggMzliNDAzZi4uYTA2ZjczZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcGluZy5jCisrKyBiL25ldC9pcHY0L3BpbmcuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9waW5nLmg+CiAjaW5jbHVkZSA8bmV0L3VkcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcHJvYy5jIGIvbmV0L2lwdjQvcHJvYy5jCmluZGV4IDRiZmFkNWQuLjQ2NmVhOGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Byb2MuYworKysgYi9uZXQvaXB2NC9wcm9jLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcmF3Lmg+CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Jhdy5jIGIvbmV0L2lwdjQvcmF3LmMKaW5kZXggNjE3MTRiZC4uMDA3ZTJlYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcmF3LmMKKysrIGIvbmV0L2lwdjQvcmF3LmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvc3luY29va2llcy5jIGIvbmV0L2lwdjQvc3luY29va2llcy5jCmluZGV4IGQ3Yjg5YjEuLjkwZjY1NDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5bmNvb2tpZXMuYworKysgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCAwZWExMGVlLi5hNzQ0MzE1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTE1MTAsNiArMTUxMCw3IEBACiAJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9MSVNURU5EUk9QUyk7CiAJcmV0dXJuIE5VTEw7CiBwdXRfYW5kX2V4aXQ6CisJYmhfdW5sb2NrX3NvY2sobmV3c2spOwogCXNvY2tfcHV0KG5ld3NrKTsKIAlnb3RvIGV4aXQ7CiB9CkBAIC0yMzM5LDcgKzIzNDAsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCB0Y3Bfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitpbnQgdGNwX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB0Y3Bfc2VxX2FmaW5mbyAqYWZpbmZvID0gUERFKGlub2RlKS0+ZGF0YTsKIAlzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUgKnM7CkBAIC0yMzU1LDIzICsyMzU2LDE5IEBACiAJcy0+bGFzdF9wb3MgCQk9IDA7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9zZXFfb3Blbik7CiAKIGludCB0Y3BfcHJvY19yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y3Bfc2VxX2FmaW5mbyAqYWZpbmZvKQogewogCWludCByYyA9IDA7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOwogCi0JYWZpbmZvLT5zZXFfZm9wcy5vcGVuCQk9IHRjcF9zZXFfb3BlbjsKLQlhZmluZm8tPnNlcV9mb3BzLnJlYWQJCT0gc2VxX3JlYWQ7Ci0JYWZpbmZvLT5zZXFfZm9wcy5sbHNlZWsJCT0gc2VxX2xzZWVrOwotCWFmaW5mby0+c2VxX2ZvcHMucmVsZWFzZQk9IHNlcV9yZWxlYXNlX25ldDsKLQogCWFmaW5mby0+c2VxX29wcy5zdGFydAkJPSB0Y3Bfc2VxX3N0YXJ0OwogCWFmaW5mby0+c2VxX29wcy5uZXh0CQk9IHRjcF9zZXFfbmV4dDsKIAlhZmluZm8tPnNlcV9vcHMuc3RvcAkJPSB0Y3Bfc2VxX3N0b3A7CiAKIAlwID0gcHJvY19jcmVhdGVfZGF0YShhZmluZm8tPm5hbWUsIFNfSVJVR08sIG5ldC0+cHJvY19uZXQsCi0JCQkgICAgICZhZmluZm8tPnNlcV9mb3BzLCBhZmluZm8pOworCQkJICAgICBhZmluZm8tPnNlcV9mb3BzLCBhZmluZm8pOwogCWlmICghcCkKIAkJcmMgPSAtRU5PTUVNOwogCXJldHVybiByYzsKQEAgLTI1MjAsMTIgKzI1MTcsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGNwX2FmaW5mb19zZXFfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gdGNwX3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9uZXQKK307CisKIHN0YXRpYyBzdHJ1Y3QgdGNwX3NlcV9hZmluZm8gdGNwNF9zZXFfYWZpbmZvID0gewogCS5uYW1lCQk9ICJ0Y3AiLAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkuc2VxX2ZvcHMJPSB7Ci0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQl9LAorCS5zZXFfZm9wcwk9ICZ0Y3BfYWZpbmZvX3NlcV9mb3BzLAogCS5zZXFfb3BzCT0gewogCQkuc2hvdwkJPSB0Y3A0X3NlcV9zaG93LAogCX0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IGViYWE5NmIuLmFiMDk2NmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC0xMzk3LDYgKzEzOTcsOCBAQAogCW5mX3Jlc2V0KHNrYik7CiAKIAlpZiAodXAtPmVuY2FwX3R5cGUpIHsKKwkJaW50ICgqZW5jYXBfcmN2KShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOworCiAJCS8qCiAJCSAqIFRoaXMgaXMgYW4gZW5jYXBzdWxhdGlvbiBzb2NrZXQgc28gcGFzcyB0aGUgc2tiIHRvCiAJCSAqIHRoZSBzb2NrZXQncyB1ZHBfZW5jYXBfcmN2KCkgaG9vay4gT3RoZXJ3aXNlLCBqdXN0CkBAIC0xNDA5LDExICsxNDExLDExIEBACiAJCSAqLwogCiAJCS8qIGlmIHdlJ3JlIG92ZXJseSBzaG9ydCwgbGV0IFVEUCBoYW5kbGUgaXQgKi8KLQkJaWYgKHNrYi0+bGVuID4gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICYmCi0JCSAgICB1cC0+ZW5jYXBfcmN2ICE9IE5VTEwpIHsKKwkJZW5jYXBfcmN2ID0gQUNDRVNTX09OQ0UodXAtPmVuY2FwX3Jjdik7CisJCWlmIChza2ItPmxlbiA+IHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAmJiBlbmNhcF9yY3YgIT0gTlVMTCkgewogCQkJaW50IHJldDsKIAotCQkJcmV0ID0gKCp1cC0+ZW5jYXBfcmN2KShzaywgc2tiKTsKKwkJCXJldCA9IGVuY2FwX3Jjdihzaywgc2tiKTsKIAkJCWlmIChyZXQgPD0gMCkgewogCQkJCVVEUF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLAogCQkJCQkJIFVEUF9NSUJfSU5EQVRBR1JBTVMsCkBAIC0yMDM3LDcgKzIwMzksNyBAQAogCQlzcGluX3VubG9ja19iaCgmc3RhdGUtPnVkcF90YWJsZS0+aGFzaFtzdGF0ZS0+YnVja2V0XS5sb2NrKTsKIH0KIAotc3RhdGljIGludCB1ZHBfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitpbnQgdWRwX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB1ZHBfc2VxX2FmaW5mbyAqYWZpbmZvID0gUERFKGlub2RlKS0+ZGF0YTsKIAlzdHJ1Y3QgdWRwX2l0ZXJfc3RhdGUgKnM7CkBAIC0yMDUzLDYgKzIwNTUsNyBAQAogCXMtPnVkcF90YWJsZQkJPSBhZmluZm8tPnVkcF90YWJsZTsKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTCh1ZHBfc2VxX29wZW4pOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIGludCB1ZHBfcHJvY19yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB1ZHBfc2VxX2FmaW5mbyAqYWZpbmZvKQpAQCAtMjA2MCwxNyArMjA2MywxMiBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKIAlpbnQgcmMgPSAwOwogCi0JYWZpbmZvLT5zZXFfZm9wcy5vcGVuCQk9IHVkcF9zZXFfb3BlbjsKLQlhZmluZm8tPnNlcV9mb3BzLnJlYWQJCT0gc2VxX3JlYWQ7Ci0JYWZpbmZvLT5zZXFfZm9wcy5sbHNlZWsJCT0gc2VxX2xzZWVrOwotCWFmaW5mby0+c2VxX2ZvcHMucmVsZWFzZQk9IHNlcV9yZWxlYXNlX25ldDsKLQogCWFmaW5mby0+c2VxX29wcy5zdGFydAkJPSB1ZHBfc2VxX3N0YXJ0OwogCWFmaW5mby0+c2VxX29wcy5uZXh0CQk9IHVkcF9zZXFfbmV4dDsKIAlhZmluZm8tPnNlcV9vcHMuc3RvcAkJPSB1ZHBfc2VxX3N0b3A7CiAKIAlwID0gcHJvY19jcmVhdGVfZGF0YShhZmluZm8tPm5hbWUsIFNfSVJVR08sIG5ldC0+cHJvY19uZXQsCi0JCQkgICAgICZhZmluZm8tPnNlcV9mb3BzLCBhZmluZm8pOworCQkJICAgICBhZmluZm8tPnNlcV9mb3BzLCBhZmluZm8pOwogCWlmICghcCkKIAkJcmMgPSAtRU5PTUVNOwogCXJldHVybiByYzsKQEAgLTIxMjAsMTQgKzIxMTgsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWRwX2FmaW5mb19zZXFfZm9wcyA9IHsKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgPSB1ZHBfc2VxX29wZW4sCisJLnJlYWQgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICA9IHNlcV9yZWxlYXNlX25ldAorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgc3RydWN0IHVkcF9zZXFfYWZpbmZvIHVkcDRfc2VxX2FmaW5mbyA9IHsKIAkubmFtZQkJPSAidWRwIiwKIAkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnVkcF90YWJsZQk9ICZ1ZHBfdGFibGUsCi0JLnNlcV9mb3BzCT0gewotCQkub3duZXIJPQlUSElTX01PRFVMRSwKLQl9LAorCS5zZXFfZm9wcwk9ICZ1ZHBfYWZpbmZvX3NlcV9mb3BzLAogCS5zZXFfb3BzCT0gewogCQkuc2hvdwkJPSB1ZHA0X3NlcV9zaG93LAogCX0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHBsaXRlLmMgYi9uZXQvaXB2NC91ZHBsaXRlLmMKaW5kZXggYWVlOTk2My4uMTJlOTQ5OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwbGl0ZS5jCisrKyBiL25ldC9pcHY0L3VkcGxpdGUuYwpAQCAtMTAsNiArMTAsNyBAQAogICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ1ZHBfaW1wbC5oIgogCiBzdHJ1Y3QgdWRwX3RhYmxlIAl1ZHBsaXRlX3RhYmxlIF9fcmVhZF9tb3N0bHk7CkBAIC03MSwxMyArNzIsMjAgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZHBsaXRlX2FmaW5mb19zZXFfZm9wcyA9IHsKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgPSB1ZHBfc2VxX29wZW4sCisJLnJlYWQgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICA9IHNlcV9yZWxlYXNlX25ldAorfTsKKwogc3RhdGljIHN0cnVjdCB1ZHBfc2VxX2FmaW5mbyB1ZHBsaXRlNF9zZXFfYWZpbmZvID0gewogCS5uYW1lCQk9ICJ1ZHBsaXRlIiwKIAkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnVkcF90YWJsZSAJPSAmdWRwbGl0ZV90YWJsZSwKLQkuc2VxX2ZvcHMJPSB7Ci0JCS5vd25lcgk9CVRISVNfTU9EVUxFLAotCX0sCisJLnNlcV9mb3BzCT0gJnVkcGxpdGVfYWZpbmZvX3NlcV9mb3BzLAogCS5zZXFfb3BzCT0gewogCQkuc2hvdwkJPSB1ZHA0X3NlcV9zaG93LAogCX0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jIGIvbmV0L2lwdjQveGZybTRfc3RhdGUuYwppbmRleCBkOWFjMGEwLi45MjU4ZTc1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jCisrKyBiL25ldC9pcHY0L3hmcm00X3N0YXRlLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZmtleXYyLmg+CiAjaW5jbHVkZSA8bGludXgvaXBzZWMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgaW50IHhmcm00X2luaXRfZmxhZ3Moc3RydWN0IHhmcm1fc3RhdGUgKngpCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZi5jIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwppbmRleCBkMDYxMWE1Li5jZjg4ZGY4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRyY29uZi5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mLmMKQEAgLTg3LDYgKzg3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKiBTZXQgdG8gMyB0byBnZXQgdHJhY2luZy4uLiAqLwogI2RlZmluZSBBQ09ORl9ERUJVRyAyCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZl9jb3JlLmMgYi9uZXQvaXB2Ni9hZGRyY29uZl9jb3JlLmMKaW5kZXggNmIwMzgyNi4uMzk5Mjg3ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmZfY29yZS5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mX2NvcmUuYwpAQCAtMyw2ICszLDcgQEAKICAqIG5vdCBjb25maWd1cmVkIG9yIHN0YXRpYy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KIAogI2RlZmluZSBJUFY2X0FERFJfU0NPUEVfVFlQRShzY29wZSkJKChzY29wZSkgPDwgMTYpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9leHRoZHJzLmMgYi9uZXQvaXB2Ni9leHRoZHJzLmMKaW5kZXggMTMxOGRlNC4uYmYyMmEyMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXh0aGRycy5jCisrKyBiL25ldC9pcHY2L2V4dGhkcnMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG5ldC9kc3QuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXh0aGRyc19jb3JlLmMgYi9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYwppbmRleCAxNGVkMGE5Li4zN2Y1NDhiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYworKysgYi9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYwpAQCAtMiw2ICsyLDcgQEAKICAqIElQdjYgbGlicmFyeSBjb2RlLCBuZWVkZWQgYnkgc3RhdGljIGNvbXBvbmVudHMgd2hlbiBmdWxsIElQdjYgc3VwcG9ydCBpcwogICogbm90IGNvbmZpZ3VyZWQgb3Igc3RhdGljLgogICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYyBiL25ldC9pcHY2L2ZpYjZfcnVsZXMuYwppbmRleCAzNGQyNDRkLi4yOTU1NzE1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKKysrIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bmV0L2ZpYl9ydWxlcy5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMgYi9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKaW5kZXggNTQzMDM5NC4uNDU2NmRiZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCisrKyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jCmluZGV4IGRlZjA1MzguLjQ0OWE5MTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNm1yLmMKKysrIGIvbmV0L2lwdjYvaXA2bXIuYwpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BpbS5oPgogI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogCiBzdHJ1Y3QgbXI2X3RhYmxlIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKaW5kZXggMzBmY2VlNC4uZGIzMTU2MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKQEAgLTMsNiArMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgpAQCAtMTAwLDkgKzEwMSwxNiBAQAogCQkucGluZXQ2ID0gKHN0cnVjdCBpcHY2X3BpbmZvICopICZmYWtlX3BpbmZvLAogCX07CiAJY29uc3Qgdm9pZCAqc2sgPSBzdHJpY3QgPyAmZmFrZV9zayA6IE5VTEw7CisJc3RydWN0IGRzdF9lbnRyeSAqcmVzdWx0OworCWludCBlcnI7CiAKLQkqZHN0ID0gaXA2X3JvdXRlX291dHB1dChuZXQsIHNrLCAmZmwtPnUuaXA2KTsKLQlyZXR1cm4gKCpkc3QpLT5lcnJvcjsKKwlyZXN1bHQgPSBpcDZfcm91dGVfb3V0cHV0KG5ldCwgc2ssICZmbC0+dS5pcDYpOworCWVyciA9IHJlc3VsdC0+ZXJyb3I7CisJaWYgKGVycikKKwkJZHN0X3JlbGVhc2UocmVzdWx0KTsKKwllbHNlCisJCSpkc3QgPSByZXN1bHQ7CisJcmV0dXJuIGVycjsKIH0KIAogX19zdW0xNiBuZl9pcDZfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKaW5kZXggZTg3NjJjNy4uMzhmMDBiMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYwpAQCAtMTgyLDcgKzE4Miw2IEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihxLCBzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUsIHEpOwogCiBvb206Ci0JcHJfZGVidWcoIkNhbid0IGFsbG9jIG5ldyBxdWV1ZVxuIik7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM3MCwxMCArMzY5LDEwIEBACiAJCXN0cnVjdCBza19idWZmICpjbG9uZTsKIAkJaW50IGksIHBsZW4gPSAwOwogCi0JCWlmICgoY2xvbmUgPSBhbGxvY19za2IoMCwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKLQkJCXByX2RlYnVnKCJDYW4ndCBhbGxvYyBza2JcbiIpOworCQljbG9uZSA9IGFsbG9jX3NrYigwLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGNsb25lID09IE5VTEwpCiAJCQlnb3RvIG91dF9vb207Ci0JCX0KKwogCQljbG9uZS0+bmV4dCA9IGhlYWQtPm5leHQ7CiAJCWhlYWQtPm5leHQgPSBjbG9uZTsKIAkJc2tiX3NoaW5mbyhjbG9uZSktPmZyYWdfbGlzdCA9IHNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Byb2MuYyBiL25ldC9pcHY2L3Byb2MuYwppbmRleCAxOGZmNWRmLi4xMDA4Y2U5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9wcm9jLmMKKysrIGIvbmV0L2lwdjYvcHJvYy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmF3LmMgYi9uZXQvaXB2Ni9yYXcuYwppbmRleCA2Zjc4MjRlLi4zMzFhZjNiOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcmF3LmMKKysrIGIvbmV0L2lwdjYvcmF3LmMKQEAgLTYxLDYgKzYxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgc3RydWN0IHJhd19oYXNoaW5mbyByYXdfdjZfaGFzaGluZm8gPSB7CiAJLmxvY2sgPSBfX1JXX0xPQ0tfVU5MT0NLRUQocmF3X3Y2X2hhc2hpbmZvLmxvY2spLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCmluZGV4IGNjMjIwOTkuLmRmYjE2NGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYworKysgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3NubXAuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JvdXRlLmMgYi9uZXQvaXB2Ni9yb3V0ZS5jCmluZGV4IDU3YjgyZGMuLjg0NzMwMTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JvdXRlLmMKKysrIGIvbmV0L2lwdjYvcm91dGUuYwpAQCAtMjYsNiArMjYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMgYi9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYwppbmRleCA2ZGNmNWU3Li4xNjZhNTdjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYworKysgYi9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L25kaXNjLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IDEwYjJiMzEuLjM2MTMxZDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtMjE2MSwxMiArMjE2MSwxOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0Y3A2X2FmaW5mb19zZXFfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gdGNwX3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9uZXQKK307CisKIHN0YXRpYyBzdHJ1Y3QgdGNwX3NlcV9hZmluZm8gdGNwNl9zZXFfYWZpbmZvID0gewogCS5uYW1lCQk9ICJ0Y3A2IiwKIAkuZmFtaWx5CQk9IEFGX0lORVQ2LAotCS5zZXFfZm9wcwk9IHsKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCX0sCisJLnNlcV9mb3BzCT0gJnRjcDZfYWZpbmZvX3NlcV9mb3BzLAogCS5zZXFfb3BzCT0gewogCQkuc2hvdwkJPSB0Y3A2X3NlcV9zaG93LAogCX0sCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHAuYyBiL25ldC9pcHY2L3VkcC5jCmluZGV4IGY0Y2EwYTUuLjg0NmY0NzU3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtMTQyNCwxMyArMTQyNCwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZHA2X2FmaW5mb19zZXFfZm9wcyA9IHsKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgPSB1ZHBfc2VxX29wZW4sCisJLnJlYWQgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICA9IHNlcV9yZWxlYXNlX25ldAorfTsKKwogc3RhdGljIHN0cnVjdCB1ZHBfc2VxX2FmaW5mbyB1ZHA2X3NlcV9hZmluZm8gPSB7CiAJLm5hbWUJCT0gInVkcDYiLAogCS5mYW1pbHkJCT0gQUZfSU5FVDYsCiAJLnVkcF90YWJsZQk9ICZ1ZHBfdGFibGUsCi0JLnNlcV9mb3BzCT0gewotCQkub3duZXIJPQlUSElTX01PRFVMRSwKLQl9LAorCS5zZXFfZm9wcwk9ICZ1ZHA2X2FmaW5mb19zZXFfZm9wcywKIAkuc2VxX29wcwk9IHsKIAkJLnNob3cJCT0gdWRwNl9zZXFfc2hvdywKIAl9LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwbGl0ZS5jIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCmluZGV4IDk4NmM0ZGUuLjFkMDhlMjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcGxpdGUuYworKysgYi9uZXQvaXB2Ni91ZHBsaXRlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAidWRwX2ltcGwuaCIKIAogc3RhdGljIGludCB1ZHBsaXRldjZfcmN2KHN0cnVjdCBza19idWZmICpza2IpCkBAIC05MywxMyArOTQsMjAgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVkcGxpdGU2X2FmaW5mb19zZXFfZm9wcyA9IHsKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgPSB1ZHBfc2VxX29wZW4sCisJLnJlYWQgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICA9IHNlcV9yZWxlYXNlX25ldAorfTsKKwogc3RhdGljIHN0cnVjdCB1ZHBfc2VxX2FmaW5mbyB1ZHBsaXRlNl9zZXFfYWZpbmZvID0gewogCS5uYW1lCQk9ICJ1ZHBsaXRlNiIsCiAJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkudWRwX3RhYmxlCT0gJnVkcGxpdGVfdGFibGUsCi0JLnNlcV9mb3BzCT0gewotCQkub3duZXIJPQlUSElTX01PRFVMRSwKLQl9LAorCS5zZXFfZm9wcwk9ICZ1ZHBsaXRlNl9hZmluZm9fc2VxX2ZvcHMsCiAJLnNlcV9vcHMJPSB7CiAJCS5zaG93CQk9IHVkcDZfc2VxX3Nob3csCiAJfSwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3N0YXRlLmMgYi9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jCmluZGV4IDI0OGYwYjIuLmYyZDcyYjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X3N0YXRlLmMKKysrIGIvbmV0L2lwdjYveGZybTZfc3RhdGUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bma2V5djIuaD4KICNpbmNsdWRlIDxsaW51eC9pcHNlYy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2RzZmllbGQuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lweC9pcHhfcHJvYy5jIGIvbmV0L2lweC9pcHhfcHJvYy5jCmluZGV4IDI2YjViZmMuLmY4YmEzMGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHgvaXB4X3Byb2MuYworKysgYi9uZXQvaXB4L2lweF9wcm9jLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC90Y3Bfc3RhdGVzLmg+CiAjaW5jbHVkZSA8bmV0L2lweC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvZGlzY292ZXJ5LmMgYi9uZXQvaXJkYS9kaXNjb3ZlcnkuYwppbmRleCAzNmMzZjAzLi5iMGI1NmEzIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9kaXNjb3ZlcnkuYworKysgYi9uZXQvaXJkYS9kaXNjb3ZlcnkuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMgYi9uZXQvaXJkYS9pcmRhX2RldmljZS5jCmluZGV4IDNlY2EzNWYuLjE0NjUzYjggMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMKKysrIGIvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJ0dHAuYyBiL25ldC9pcmRhL2lydHRwLmMKaW5kZXggMjg1Y2NkNi4uMzJlM2JiMCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJ0dHAuYworKysgYi9uZXQvaXJkYS9pcnR0cC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9xb3MuYyBiL25ldC9pcmRhL3Fvcy5jCmluZGV4IDQzNjlmN2YuLjc5OGZmZDkgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL3Fvcy5jCisrKyBiL25ldC9pcmRhL3Fvcy5jCkBAIC0zMCw2ICszMCw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKICNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2NvcmUuYyBiL25ldC9sMnRwL2wydHBfY29yZS5jCmluZGV4IDM0YjJkZGUuLmJmOGQ1MGMgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfY29yZS5jCisrKyBiL25ldC9sMnRwL2wydHBfY29yZS5jCkBAIC0zOTcsNiArMzk3LDcgQEAKIAkgKiBleHBlY3QgdG8gc2VuZCB1cCBuZXh0LCBkZXF1ZXVlIGl0IGFuZCBhbnkgb3RoZXIKIAkgKiBpbi1zZXF1ZW5jZSBwYWNrZXRzIGJlaGluZCBpdC4KIAkgKi8KK3N0YXJ0OgogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+cmVvcmRlcl9xLmxvY2spOwogCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnNlc3Npb24tPnJlb3JkZXJfcSwgc2tiLCB0bXApIHsKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgTDJUUF9TS0JfQ0Ioc2tiKS0+ZXhwaXJlcykpIHsKQEAgLTQzMyw3ICs0MzQsNyBAQAogCQkgKi8KIAkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPnJlb3JkZXJfcS5sb2NrKTsKIAkJbDJ0cF9yZWN2X2RlcXVldWVfc2tiKHNlc3Npb24sIHNrYik7Ci0JCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+cmVvcmRlcl9xLmxvY2spOworCQlnb3RvIHN0YXJ0OwogCX0KIAogb3V0OgpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfaW5wdXQuYyBiL25ldC9sbGMvbGxjX2lucHV0LmMKaW5kZXggOTAzMjQyMS4uZTMyY2FiNCAxMDA2NDQKLS0tIGEvbmV0L2xsYy9sbGNfaW5wdXQuYworKysgYi9uZXQvbGxjL2xsY19pbnB1dC5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbGxjLmg+CiAjaW5jbHVkZSA8bmV0L2xsY19wZHUuaD4KZGlmZiAtLWdpdCBhL25ldC9sbGMvbGxjX291dHB1dC5jIGIvbmV0L2xsYy9sbGNfb3V0cHV0LmMKaW5kZXggYjM4YTEwNy4uYjY1OGNiYSAxMDA2NDQKLS0tIGEvbmV0L2xsYy9sbGNfb3V0cHV0LmMKKysrIGIvbmV0L2xsYy9sbGNfb3V0cHV0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9sbGMuaD4KICNpbmNsdWRlIDxuZXQvbGxjX3BkdS5oPgogCmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19wcm9jLmMgYi9uZXQvbGxjL2xsY19wcm9jLmMKaW5kZXggN2FmMWZmMi4uYTE4MzljMCAxMDA2NDQKLS0tIGEvbmV0L2xsYy9sbGNfcHJvYy5jCisrKyBiL25ldC9sbGMvbGxjX3Byb2MuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9sbGMuaD4KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9LY29uZmlnIGIvbmV0L21hYzgwMjExL0tjb25maWcKaW5kZXggN2QzYjQzOC4uOTZkZGI3MiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL0tjb25maWcKKysrIGIvbmV0L21hYzgwMjExL0tjb25maWcKQEAgLTI0NywxNSArMjQ3LDMgQEAKIAkgIGFuZCBzaG93IHRoZW0gaW4gZGVidWdmcy4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIE1BQzgwMjExX0RSSVZFUl9BUElfVFJBQ0VSCi0JYm9vbCAiRHJpdmVyIEFQSSB0cmFjZXIiCi0JZGVwZW5kcyBvbiBNQUM4MDIxMV9ERUJVR19NRU5VCi0JZGVwZW5kcyBvbiBFVkVOVF9UUkFDSU5HCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBtYWtlIG1hYzgwMjExIHJlZ2lzdGVyIHdpdGggdGhlIGZ0cmFjZQotCSAgZnJhbWV3b3JrIGZvciB0aGUgZHJpdmVyIEFQSSAtLSB5b3UgY2FuIHRoZW4gc2VlIHdoaWNoCi0JICBkcml2ZXIgbWV0aG9kcyBpdCBpcyBjYWxsaW5nIGFuZCB3aGljaCBBUEkgZnVuY3Rpb25zCi0JICBkcml2ZXJzIGFyZSBjYWxsaW5nIGJ5IGxvb2tpbmcgYXQgdGhlIHRyYWNlLgotCi0JICBJZiB1bnN1cmUsIHNheSBZLgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL01ha2VmaWxlIGIvbmV0L21hYzgwMjExL01ha2VmaWxlCmluZGV4IGZkYjU0ZTYuLmQ1NDBjM2IgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9NYWtlZmlsZQorKysgYi9uZXQvbWFjODAyMTEvTWFrZWZpbGUKQEAgLTI0LDcgKzI0LDggQEAKIAl1dGlsLm8gXAogCXdtZS5vIFwKIAlldmVudC5vIFwKLQljaGFuLm8KKwljaGFuLm8gXAorCWRyaXZlci10cmFjZS5vCiAKIG1hYzgwMjExLSQoQ09ORklHX01BQzgwMjExX0xFRFMpICs9IGxlZC5vCiBtYWM4MDIxMS0kKENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTKSArPSBcCkBAIC00MSw3ICs0Miw2IEBACiAKIG1hYzgwMjExLSQoQ09ORklHX1BNKSArPSBwbS5vCiAKLW1hYzgwMjExLSQoQ09ORklHX01BQzgwMjExX0RSSVZFUl9BUElfVFJBQ0VSKSArPSBkcml2ZXItdHJhY2UubwogQ0ZMQUdTX2RyaXZlci10cmFjZS5vIDo9IC1JJChzcmMpCiAKICMgb2JqZWN0cyBmb3IgUElEIGFsZ29yaXRobQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy1yeC5jIGIvbmV0L21hYzgwMjExL2FnZy1yeC5jCmluZGV4IDk3ZjMzNTguLmU4NDRlNWEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctcnguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXJ4LmMKQEAgLTM4LDYgKzM4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgogI2luY2x1ZGUgImRyaXZlci1vcHMuaCIKQEAgLTcyLDggKzczLDExIEBACiAJUkNVX0lOSVRfUE9JTlRFUihzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0sIE5VTEwpOwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIlJ4IEJBIHNlc3Npb24gc3RvcCByZXF1ZXN0ZWQgZm9yICVwTSB0aWQgJXVcbiIsCi0JICAgICAgIHN0YS0+c3RhLmFkZHIsIHRpZCk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIlJ4IEJBIHNlc3Npb24gc3RvcCByZXF1ZXN0ZWQgZm9yICVwTSB0aWQgJXUgJXMgcmVhc29uOiAlZFxuIiwKKwkgICAgICAgc3RhLT5zdGEuYWRkciwgdGlkLAorCSAgICAgICBpbml0aWF0b3IgPT0gV0xBTl9CQUNLX1JFQ0lQSUVOVCA/ICJyZWNpcGllbnQiIDogImluaXRpdGF0b3IiLAorCSAgICAgICAoaW50KXJlYXNvbik7CiAjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCiAKIAlpZiAoZHJ2X2FtcGR1X2FjdGlvbihsb2NhbCwgc3RhLT5zZGF0YSwgSUVFRTgwMjExX0FNUERVX1JYX1NUT1AsCkBAIC04NCw3ICs4OCw3IEBACiAJLyogY2hlY2sgaWYgdGhpcyBpcyBhIHNlbGYgZ2VuZXJhdGVkIGFnZ3JlZ2F0aW9uIGhhbHQgKi8KIAlpZiAoaW5pdGlhdG9yID09IFdMQU5fQkFDS19SRUNJUElFTlQgJiYgdHgpCiAJCWllZWU4MDIxMV9zZW5kX2RlbGJhKHN0YS0+c2RhdGEsIHN0YS0+c3RhLmFkZHIsCi0JCQkJICAgICB0aWQsIDAsIHJlYXNvbik7CisJCQkJICAgICB0aWQsIFdMQU5fQkFDS19SRUNJUElFTlQsIHJlYXNvbik7CiAKIAlkZWxfdGltZXJfc3luYygmdGlkX3J4LT5zZXNzaW9uX3RpbWVyKTsKIAlkZWxfdGltZXJfc3luYygmdGlkX3J4LT5yZW9yZGVyX3RpbWVyKTsKQEAgLTEwOCw3ICsxMTIsNyBAQAogCWludCBpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgYWRkcik7CisJc3RhID0gc3RhX2luZm9fZ2V0X2JzcyhzZGF0YSwgYWRkcik7CiAJaWYgKCFzdGEpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybjsKQEAgLTE3Niw3ICsxODAsOCBAQAogCW1lbWNweShtZ210LT5kYSwgZGEsIEVUSF9BTEVOKTsKIAltZW1jcHkobWdtdC0+c2EsIHNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOwogCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOIHx8CisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKQogCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOwogCWVsc2UgaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT51Lm1nZC5ic3NpZCwgRVRIX0FMRU4pOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy10eC5jIGIvbmV0L21hYzgwMjExL2FnZy10eC5jCmluZGV4IDMzMTQ3MmMuLjJjMmU5NTEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctdHguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXR4LmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgogI2luY2x1ZGUgImRyaXZlci1vcHMuaCIKQEAgLTc3LDcgKzc4LDggQEAKIAltZW1jcHkobWdtdC0+ZGEsIGRhLCBFVEhfQUxFTik7CiAJbWVtY3B5KG1nbXQtPnNhLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKIAlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8Ci0JICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQorCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTiB8fAorCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkKIAkJbWVtY3B5KG1nbXQtPmJzc2lkLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKIAllbHNlIGlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKIAkJbWVtY3B5KG1nbXQtPmJzc2lkLCBzZGF0YS0+dS5tZ2QuYnNzaWQsIEVUSF9BTEVOKTsKQEAgLTE4NCw2ICsxODYsNyBAQAogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLwogCiAJZGVsX3RpbWVyX3N5bmMoJnRpZF90eC0+YWRkYmFfcmVzcF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnRpZF90eC0+c2Vzc2lvbl90aW1lcik7CiAKIAkvKgogCSAqIEFmdGVyIHRoaXMgcGFja2V0cyBhcmUgbm8gbG9uZ2VyIGhhbmRlZCByaWdodCB0aHJvdWdoCkBAIC0zNjcsNiArMzcwLDI4IEBACiAJCQkJICAgICB0aWRfdHgtPnRpbWVvdXQpOwogfQogCisvKgorICogQWZ0ZXIgYWNjZXB0aW5nIHRoZSBBZGRCQSBSZXNwb25zZSB3ZSBhY3RpdmF0ZWQgYSB0aW1lciwKKyAqIHJlc2V0dGluZyBpdCBhZnRlciBlYWNoIGZyYW1lIHRoYXQgd2Ugc2VuZC4KKyAqLworc3RhdGljIHZvaWQgc3RhX3R4X2FnZ19zZXNzaW9uX3RpbWVyX2V4cGlyZWQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCS8qIG5vdCBhbiBlbGVnYW50IGRldG91ciwgYnV0IHRoZXJlIGlzIG5vIGNob2ljZSBhcyB0aGUgdGltZXIgcGFzc2VzCisJICogb25seSBvbmUgYXJndW1lbnQsIGFuZCB2YXJpb3VzIHN0YV9pbmZvIGFyZSBuZWVkZWQgaGVyZSwgc28gaW5pdAorCSAqIGZsb3cgaW4gc3RhX2luZm9fY3JlYXRlIGdpdmVzIHRoZSBUSUQgYXMgZGF0YSwgd2hpbGUgdGhlIHRpbWVyX3RvX2lkCisJICogYXJyYXkgZ2l2ZXMgdGhlIHN0YSB0aHJvdWdoIGNvbnRhaW5lcl9vZiAqLworCXU4ICpwdGlkID0gKHU4ICopZGF0YTsKKwl1OCAqdGltZXJfdG9faWQgPSBwdGlkIC0gKnB0aWQ7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBjb250YWluZXJfb2YodGltZXJfdG9faWQsIHN0cnVjdCBzdGFfaW5mbywKKwkJCQkJIHRpbWVyX3RvX3RpZFswXSk7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAidHggc2Vzc2lvbiB0aW1lciBleHBpcmVkIG9uIHRpZCAlZFxuIiwgKHUxNikqcHRpZCk7CisjZW5kaWYKKworCWllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oJnN0YS0+c3RhLCAqcHRpZCk7Cit9CisKIGludCBpZWVlODAyMTFfc3RhcnRfdHhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqcHVic3RhLCB1MTYgdGlkLAogCQkJCSAgdTE2IHRpbWVvdXQpCiB7CkBAIC0zOTEsMTMgKzQxNiw4IEBACiAJICAgICAgIHB1YnN0YS0+YWRkciwgdGlkKTsKICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KIAotCS8qCi0JICogVGhlIGFnZ3JlZ2F0aW9uIGNvZGUgaXMgbm90IHByZXBhcmVkIHRvIGhhbmRsZQotCSAqIGFueXRoaW5nIGJ1dCBTVEEvQVAgZHVlIHRvIHRoZSBCU1NJRCBoYW5kbGluZy4KLQkgKiBJQlNTIGNvdWxkIHdvcmsgaW4gdGhlIGNvZGUgYnV0IGlzbid0IHN1cHBvcnRlZAotCSAqIGJ5IGRyaXZlcnMgb3IgdGhlIHN0YW5kYXJkLgotCSAqLwogCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCAmJgogCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTiAmJgogCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDQxLDExICs0NjEsMTYgQEAKIAogCXRpZF90eC0+dGltZW91dCA9IHRpbWVvdXQ7CiAKLQkvKiBUeCB0aW1lciAqLworCS8qIHJlc3BvbnNlIHRpbWVyICovCiAJdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyLmZ1bmN0aW9uID0gc3RhX2FkZGJhX3Jlc3BfdGltZXJfZXhwaXJlZDsKIAl0aWRfdHgtPmFkZGJhX3Jlc3BfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZzdGEtPnRpbWVyX3RvX3RpZFt0aWRdOwogCWluaXRfdGltZXIoJnRpZF90eC0+YWRkYmFfcmVzcF90aW1lcik7CiAKKwkvKiB0eCB0aW1lciAqLworCXRpZF90eC0+c2Vzc2lvbl90aW1lci5mdW5jdGlvbiA9IHN0YV90eF9hZ2dfc2Vzc2lvbl90aW1lcl9leHBpcmVkOworCXRpZF90eC0+c2Vzc2lvbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnN0YS0+dGltZXJfdG9fdGlkW3RpZF07CisJaW5pdF90aW1lcigmdGlkX3R4LT5zZXNzaW9uX3RpbWVyKTsKKwogCS8qIGFzc2lnbiBhIGRpYWxvZyB0b2tlbiAqLwogCXN0YS0+YW1wZHVfbWxtZS5kaWFsb2dfdG9rZW5fYWxsb2NhdG9yKys7CiAJdGlkX3R4LT5kaWFsb2dfdG9rZW4gPSBzdGEtPmFtcGR1X21sbWUuZGlhbG9nX3Rva2VuX2FsbG9jYXRvcjsKQEAgLTU1MCw3ICs1NzUsNyBAQAogCX0KIAogCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKLQlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIHJhKTsKKwlzdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNkYXRhLCByYSk7CiAJaWYgKCFzdGEpIHsKIAkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c3RhX210eCk7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCkBAIC02NzksNyArNzA0LDcgQEAKIAogCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKIAotCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgcmEpOworCXN0YSA9IHN0YV9pbmZvX2dldF9ic3Moc2RhdGEsIHJhKTsKIAlpZiAoIXN0YSkgewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGZpbmQgc3RhdGlvbjogJXBNXG4iLCByYSk7CkBAIC04MTcsNiArODQyLDExIEBACiAJCQlpZWVlODAyMTFfYWdnX3R4X29wZXJhdGlvbmFsKGxvY2FsLCBzdGEsIHRpZCk7CiAKIAkJc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSA9IDA7CisKKwkJaWYgKHRpZF90eC0+dGltZW91dCkKKwkJCW1vZF90aW1lcigmdGlkX3R4LT5zZXNzaW9uX3RpbWVyLAorCQkJCSAgVFVfVE9fRVhQX1RJTUUodGlkX3R4LT50aW1lb3V0KSk7CisKIAl9IGVsc2UgewogCQlfX19pZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkLCBXTEFOX0JBQ0tfSU5JVElBVE9SLAogCQkJCQkJdHJ1ZSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvY2ZnLmMgYi9uZXQvbWFjODAyMTEvY2ZnLmMKaW5kZXggZDA2YzY1Zi4uMzkzYjJhNCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2NmZy5jCisrKyBiL25ldC9tYWM4MDIxMS9jZmcuYwpAQCAtMTAyLDYgKzEwMiwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9zZXRfbm9hY2tfbWFwKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgdTE2IG5vYWNrX21hcCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisKKwlzZGF0YS0+bm9hY2tfbWFwID0gbm9hY2tfbWFwOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGllZWU4MDIxMV9hZGRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHU4IGtleV9pZHgsIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkciwKIAkJCSAgICAgc3RydWN0IGtleV9wYXJhbXMgKnBhcmFtcykKQEAgLTQxMSw3ICs0MjEsOCBAQAogCQkJCUJJVChOTDgwMjExX1NUQV9GTEFHX1NIT1JUX1BSRUFNQkxFKSB8CiAJCQkJQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSB8CiAJCQkJQklUKE5MODAyMTFfU1RBX0ZMQUdfTUZQKSB8Ci0JCQkJQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCk7CisJCQkJQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkgfAorCQkJCUJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7CiAJaWYgKHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BVVRIT1JJWkVEKSkKIAkJc2luZm8tPnN0YV9mbGFncy5zZXQgfD0gQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCk7CiAJaWYgKHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9TSE9SVF9QUkVBTUJMRSkpCkBAIC00MjIsNiArNDMzLDggQEAKIAkJc2luZm8tPnN0YV9mbGFncy5zZXQgfD0gQklUKE5MODAyMTFfU1RBX0ZMQUdfTUZQKTsKIAlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEgpKQogCQlzaW5mby0+c3RhX2ZsYWdzLnNldCB8PSBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEKTsKKwlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikpCisJCXNpbmZvLT5zdGFfZmxhZ3Muc2V0IHw9IEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7CiB9CiAKIApAQCAtNDg4LDYgKzUwMSwzMSBAQAogCQkocGFyYW1zLT5oaWRkZW5fc3NpZCAhPSBOTDgwMjExX0hJRERFTl9TU0lEX05PVF9JTl9VU0UpOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9zZXRfcHJvYmVfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgdTggKnJlc3AsIHNpemVfdCByZXNwX2xlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3LCAqb2xkOworCisJaWYgKCFyZXNwIHx8ICFyZXNwX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbGQgPSBydG5sX2RlcmVmZXJlbmNlKHNkYXRhLT51LmFwLnByb2JlX3Jlc3ApOworCisJbmV3ID0gZGV2X2FsbG9jX3NrYihyZXNwX2xlbik7CisJaWYgKCFuZXcpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KHNrYl9wdXQobmV3LCByZXNwX2xlbiksIHJlc3AsIHJlc3BfbGVuKTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihzZGF0YS0+dS5hcC5wcm9iZV9yZXNwLCBuZXcpOworCXN5bmNocm9uaXplX3JjdSgpOworCisJaWYgKG9sZCkKKwkJZGV2X2tmcmVlX3NrYihvbGQpOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBUaGlzIGhhbmRsZXMgYm90aCBhZGRpbmcgYSBiZWFjb24gYW5kIHNldHRpbmcgbmV3IGJlYWNvbiBpbmZvCiAgKi8KQEAgLTQ5OCw2ICs1MzYsNyBAQAogCWludCBuZXdfaGVhZF9sZW4sIG5ld190YWlsX2xlbjsKIAlpbnQgc2l6ZTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKKwl1MzIgY2hhbmdlZCA9IDA7CiAKIAlvbGQgPSBydG5sX2RlcmVmZXJlbmNlKHNkYXRhLT51LmFwLmJlYWNvbik7CiAKQEAgLTU4MSwxMSArNjIwLDE3IEBACiAKIAlrZnJlZShvbGQpOwogCi0JaWVlZTgwMjExX2NvbmZpZ19hcF9zc2lkKHNkYXRhLCBwYXJhbXMpOworCWVyciA9IGllZWU4MDIxMV9zZXRfcHJvYmVfcmVzcChzZGF0YSwgcGFyYW1zLT5wcm9iZV9yZXNwLAorCQkJCSAgICAgICBwYXJhbXMtPnByb2JlX3Jlc3BfbGVuKTsKKwlpZiAoIWVycikKKwkJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9BUF9QUk9CRV9SRVNQOwogCi0JaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEIHwKLQkJCQkJCUJTU19DSEFOR0VEX0JFQUNPTiB8Ci0JCQkJCQlCU1NfQ0hBTkdFRF9TU0lEKTsKKwlpZWVlODAyMTFfY29uZmlnX2FwX3NzaWQoc2RhdGEsIHBhcmFtcyk7CisJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCB8CisJCSAgIEJTU19DSEFOR0VEX0JFQUNPTiB8CisJCSAgIEJTU19DSEFOR0VEX1NTSUQ7CisKKwlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgY2hhbmdlZCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU5NCw2ICs2MzksOCBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXN0cnVjdCBiZWFjb25fZGF0YSAqb2xkOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnZsYW47CisJaW50IHJldDsKIAogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIApAQCAtNjAxLDcgKzY0OCwyNCBAQAogCWlmIChvbGQpCiAJCXJldHVybiAtRUFMUkVBRFk7CiAKLQlyZXR1cm4gaWVlZTgwMjExX2NvbmZpZ19iZWFjb24oc2RhdGEsIHBhcmFtcyk7CisJcmV0ID0gaWVlZTgwMjExX2NvbmZpZ19iZWFjb24oc2RhdGEsIHBhcmFtcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQXBwbHkgY29udHJvbCBwb3J0IHByb3RvY29sLCB0aGlzIGFsbG93cyB1cyB0bworCSAqIG5vdCBlbmNyeXB0IGR5bmFtaWMgV0VQIGNvbnRyb2wgZnJhbWVzLgorCSAqLworCXNkYXRhLT5jb250cm9sX3BvcnRfcHJvdG9jb2wgPSBwYXJhbXMtPmNyeXB0by5jb250cm9sX3BvcnRfZXRoZXJ0eXBlOworCXNkYXRhLT5jb250cm9sX3BvcnRfbm9fZW5jcnlwdCA9IHBhcmFtcy0+Y3J5cHRvLmNvbnRyb2xfcG9ydF9ub19lbmNyeXB0OworCWxpc3RfZm9yX2VhY2hfZW50cnkodmxhbiwgJnNkYXRhLT51LmFwLnZsYW5zLCB1LnZsYW4ubGlzdCkgeworCQl2bGFuLT5jb250cm9sX3BvcnRfcHJvdG9jb2wgPQorCQkJcGFyYW1zLT5jcnlwdG8uY29udHJvbF9wb3J0X2V0aGVydHlwZTsKKwkJdmxhbi0+Y29udHJvbF9wb3J0X25vX2VuY3J5cHQgPQorCQkJcGFyYW1zLT5jcnlwdG8uY29udHJvbF9wb3J0X25vX2VuY3J5cHQ7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX3NldF9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTc3OCw3ICs4NDIsNyBAQAogCX0KIAogCWlmIChwYXJhbXMtPmh0X2NhcGEpCi0JCWllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzYmFuZCwKKwkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNkYXRhLCBzYmFuZCwKIAkJCQkJCSAgcGFyYW1zLT5odF9jYXBhLAogCQkJCQkJICAmc3RhLT5zdGEuaHRfY2FwKTsKIApAQCAtODQ3LDcgKzkxMSwxMiBAQAogCiAJc3RhX2FwcGx5X3BhcmFtZXRlcnMobG9jYWwsIHN0YSwgcGFyYW1zKTsKIAotCXJhdGVfY29udHJvbF9yYXRlX2luaXQoc3RhKTsKKwkvKgorCSAqIGZvciBURExTLCByYXRlIGNvbnRyb2wgc2hvdWxkIGJlIGluaXRpYWxpemVkIG9ubHkgd2hlbiBzdXBwb3J0ZWQKKwkgKiByYXRlcyBhcmUga25vd24uCisJICovCisJaWYgKCF0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSKSkKKwkJcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOwogCiAJbGF5ZXIyX3VwZGF0ZSA9IHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOIHx8CiAJCXNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUDsKQEAgLTkzMSw2ICsxMDAwLDkgQEAKIAogCXN0YV9hcHBseV9wYXJhbWV0ZXJzKGxvY2FsLCBzdGEsIHBhcmFtcyk7CiAKKwlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikgJiYgcGFyYW1zLT5zdXBwb3J0ZWRfcmF0ZXMpCisJCXJhdGVfY29udHJvbF9yYXRlX2luaXQoc3RhKTsKKwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCkBAIC0xMTIzLDYgKzExOTUsOCBAQAogewogCXU4ICpuZXdfaWU7CiAJY29uc3QgdTggKm9sZF9pZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IGNvbnRhaW5lcl9vZihpZm1zaCwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwgdS5tZXNoKTsKIAogCS8qIGFsbG9jYXRlIGluZm9ybWF0aW9uIGVsZW1lbnRzICovCiAJbmV3X2llID0gTlVMTDsKQEAgLTExNDksNiArMTIyMywxMCBAQAogCWlmIChzZXR1cC0+aXNfc2VjdXJlKQogCQlpZm1zaC0+c2VjdXJpdHkgfD0gSUVFRTgwMjExX01FU0hfU0VDX1NFQ1VSRUQ7CiAKKwkvKiBtY2FzdCByYXRlIHNldHRpbmcgaW4gTWVzaCBOb2RlICovCisJbWVtY3B5KHNkYXRhLT52aWYuYnNzX2NvbmYubWNhc3RfcmF0ZSwgc2V0dXAtPm1jYXN0X3JhdGUsCisJCQkJCQlzaXplb2Yoc2V0dXAtPm1jYXN0X3JhdGUpKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMTk0LDYgKzEyNzIsOSBAQAogCWlmIChfY2hnX21lc2hfYXR0cihOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUwsIG1hc2spKQogCQljb25mLT5kb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsID0KIAkJCW5jb25mLT5kb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsOworCWlmIChfY2hnX21lc2hfYXR0cihOTDgwMjExX01FU0hDT05GX0hXTVBfUEVSUl9NSU5fSU5URVJWQUwsIG1hc2spKQorCQljb25mLT5kb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsID0KKwkJCW5jb25mLT5kb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsOwogCWlmIChfY2hnX21lc2hfYXR0cihOTDgwMjExX01FU0hDT05GX0hXTVBfTkVUX0RJQU1fVFJWU19USU1FLAogCQkJICAgbWFzaykpCiAJCWNvbmYtPmRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUgPQpAQCAtMTM5NCw3ICsxNDc1LDcgQEAKIAkgICAgKG9sZF9vcGVyX3R5cGUgIT0gbG9jYWwtPl9vcGVyX2NoYW5uZWxfdHlwZSkpCiAJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKTsKIAotCWlmICgoc2RhdGEgJiYgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpICYmCisJaWYgKHNkYXRhICYmIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SICYmCiAJICAgIG9sZF92aWZfb3Blcl90eXBlICE9IHNkYXRhLT52aWYuYnNzX2NvbmYuY2hhbm5lbF90eXBlKQogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfSFQpOwogCkBAIC0xOTE3LDcgKzE5OTgsNyBAQAogCQkJICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKIAkJCSAgICAgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsIHVuc2lnbmVkIGludCB3YWl0LAogCQkJICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBib29sIG5vX2NjaywKLQkJCSAgICAgdTY0ICpjb29raWUpCisJCQkgICAgIGJvb2wgZG9udF93YWl0X2Zvcl9hY2ssIHU2NCAqY29va2llKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKQEAgLTE5MjUsMTAgKzIwMDYsMTUgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3dvcmsgKndrOwogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9ICh2b2lkICopYnVmOwotCXUzMiBmbGFncyA9IElFRUU4MDIxMV9UWF9JTlRGTF9OTDgwMjExX0ZSQU1FX1RYIHwKLQkJICAgIElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUzsKKwl1MzIgZmxhZ3M7CiAJYm9vbCBpc19vZmZjaGFuID0gZmFsc2U7CiAKKwlpZiAoZG9udF93YWl0X2Zvcl9hY2spCisJCWZsYWdzID0gSUVFRTgwMjExX1RYX0NUTF9OT19BQ0s7CisJZWxzZQorCQlmbGFncyA9IElFRUU4MDIxMV9UWF9JTlRGTF9OTDgwMjExX0ZSQU1FX1RYIHwKKwkJCUlFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUzsKKwogCS8qIENoZWNrIHRoYXQgd2UgYXJlIG9uIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCBmb3IgdHJhbnNtaXNzaW9uICovCiAJaWYgKGNoYW4gIT0gbG9jYWwtPnRtcF9jaGFubmVsICYmCiAJICAgIGNoYW4gIT0gbG9jYWwtPm9wZXJfY2hhbm5lbCkKQEAgLTI0ODgsNiArMjU3NCw4MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9wcm9iZV9jbGllbnQoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIGNvbnN0IHU4ICpwZWVyLCB1NjQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICpudWxsZnVuYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzaXplID0gc2l6ZW9mKCpudWxsZnVuYyk7CisJX19sZTE2IGZjOworCWJvb2wgcW9zOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIHBlZXIpOworCWlmIChzdGEpIHsKKwkJcW9zID0gdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1dNRSk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0gZWxzZSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gLUVOT0xJTks7CisJfQorCisJaWYgKHFvcykgeworCQlmYyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJCQkgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMRlVOQyB8CisJCQkJIElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7CisJfSBlbHNlIHsKKwkJc2l6ZSAtPSAyOworCQlmYyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJCQkgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DIHwKKwkJCQkgSUVFRTgwMjExX0ZDVExfRlJPTURTKTsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIHNpemUpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYi0+ZGV2ID0gZGV2OworCisJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOworCisJbnVsbGZ1bmMgPSAodm9pZCAqKSBza2JfcHV0KHNrYiwgc2l6ZSk7CisJbnVsbGZ1bmMtPmZyYW1lX2NvbnRyb2wgPSBmYzsKKwludWxsZnVuYy0+ZHVyYXRpb25faWQgPSAwOworCW1lbWNweShudWxsZnVuYy0+YWRkcjEsIHN0YS0+c3RhLmFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIyLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIzLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKKwludWxsZnVuYy0+c2VxX2N0cmwgPSAwOworCisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKworCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUyB8CisJCSAgICAgICBJRUVFODAyMTFfVFhfSU5URkxfTkw4MDIxMV9GUkFNRV9UWDsKKworCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIElFRUU4MDIxMV9BQ19WTyk7CisJc2tiLT5wcmlvcml0eSA9IDc7CisJaWYgKHFvcykKKwkJbnVsbGZ1bmMtPnFvc19jdHJsID0gY3B1X3RvX2xlMTYoNyk7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJaWVlZTgwMjExX3htaXQoc2RhdGEsIHNrYik7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisKKwkqY29va2llID0gKHVuc2lnbmVkIGxvbmcpIHNrYjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqCitpZWVlODAyMTFfd2lwaHlfZ2V0X2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdpcGh5X3ByaXYod2lwaHkpOworCisJcmV0dXJuIGxvY2FsLT5vcGVyX2NoYW5uZWw7Cit9CisKIHN0cnVjdCBjZmc4MDIxMV9vcHMgbWFjODAyMTFfY29uZmlnX29wcyA9IHsKIAkuYWRkX3ZpcnR1YWxfaW50ZiA9IGllZWU4MDIxMV9hZGRfaWZhY2UsCiAJLmRlbF92aXJ0dWFsX2ludGYgPSBpZWVlODAyMTFfZGVsX2lmYWNlLApAQCAtMjU1Myw0ICsyNzE1LDcgQEAKIAkuc2V0X3Jla2V5X2RhdGEgPSBpZWVlODAyMTFfc2V0X3Jla2V5X2RhdGEsCiAJLnRkbHNfb3BlciA9IGllZWU4MDIxMV90ZGxzX29wZXIsCiAJLnRkbHNfbWdtdCA9IGllZWU4MDIxMV90ZGxzX21nbXQsCisJLnByb2JlX2NsaWVudCA9IGllZWU4MDIxMV9wcm9iZV9jbGllbnQsCisJLmdldF9jaGFubmVsID0gaWVlZTgwMjExX3dpcGh5X2dldF9jaGFubmVsLAorCS5zZXRfbm9hY2tfbWFwID0gaWVlZTgwMjExX3NldF9ub2Fja19tYXAsCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKaW5kZXggODgzOTk2Yi4uOTBiYWVhNSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnMuYworKysgYi9uZXQvbWFjODAyMTEvZGVidWdmcy5jCkBAIC05Nyw0MCArOTcsNiBAQAogCS5sbHNlZWsgPSBub29wX2xsc2VlaywKIH07CiAKLXN0YXRpYyBzc2l6ZV90IG5vYWNrX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gbWFjODAyMTFfZm9ybWF0X2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsICIlZFxuIiwKLQkJCQkgICAgICBsb2NhbC0+d2lmaV93bWVfbm9hY2tfdGVzdCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG5vYWNrX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbMTBdOwotCXNpemVfdCBsZW47Ci0KLQlsZW4gPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGxlbikpCi0JCXJldHVybiAtRUZBVUxUOwotCWJ1ZltsZW5dID0gJ1wwJzsKLQotCWxvY2FsLT53aWZpX3dtZV9ub2Fja190ZXN0ID0gISFzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBub2Fja19vcHMgPSB7Ci0JLnJlYWQgPSBub2Fja19yZWFkLAotCS53cml0ZSA9IG5vYWNrX3dyaXRlLAotCS5vcGVuID0gbWFjODAyMTFfb3Blbl9maWxlX2dlbmVyaWMsCi0JLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAotfTsKLQogc3RhdGljIHNzaXplX3QgdWFwc2RfcXVldWVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0xOTAsNyArMTU2LDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJYnVmW2xlbl0gPSAnXDAnOwogCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zOTgsNyArMzY0LDYgQEAKIAlERUJVR0ZTX0FERCh3ZXBfaXYpOwogCURFQlVHRlNfQUREKHF1ZXVlcyk7CiAJREVCVUdGU19BRERfTU9ERShyZXNldCwgMDIwMCk7Ci0JREVCVUdGU19BREQobm9hY2spOwogCURFQlVHRlNfQUREKHVhcHNkX3F1ZXVlcyk7CiAJREVCVUdGU19BREQodWFwc2RfbWF4X3NwX2xlbik7CiAJREVCVUdGU19BREQoY2hhbm5lbF90eXBlKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX25ldGRldi5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKaW5kZXggOTM1MjgxOS4uOGRmMjg5MSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKQEAgLTQwNSw2ICs0MDUsOCBAQAogCQl1Lm1lc2gubXNoY2ZnLmRvdDExTWVzaEhXTVBhY3RpdmVQYXRoVGltZW91dCwgREVDKTsKIElFRUU4MDIxMV9JRl9GSUxFKGRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWwsCiAJCXUubWVzaC5tc2hjZmcuZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbCwgREVDKTsKK0lFRUU4MDIxMV9JRl9GSUxFKGRvdDExTWVzaEhXTVBwZXJyTWluSW50ZXJ2YWwsCisJCXUubWVzaC5tc2hjZmcuZG90MTFNZXNoSFdNUHBlcnJNaW5JbnRlcnZhbCwgREVDKTsKIElFRUU4MDIxMV9JRl9GSUxFKGRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUsCiAJCXUubWVzaC5tc2hjZmcuZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZSwgREVDKTsKIElFRUU4MDIxMV9JRl9GSUxFKGRvdDExTWVzaEhXTVBtYXhQUkVRcmV0cmllcywKQEAgLTUzNCw2ICs1MzYsNyBAQAogCU1FU0hQQVJBTVNfQUREKGRvdDExTWVzaE1heFBlZXJMaW5rcyk7CiAJTUVTSFBBUkFNU19BREQoZG90MTFNZXNoSFdNUGFjdGl2ZVBhdGhUaW1lb3V0KTsKIAlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsKTsKKwlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsKTsKIAlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lKTsKIAlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QbWF4UFJFUXJldHJpZXMpOwogCU1FU0hQQVJBTVNfQUREKHBhdGhfcmVmcmVzaF90aW1lKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKaW5kZXggMzExMGNiZC4uMjQwNmIzZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKQEAgLTYzLDEwICs2MywxMCBAQAogCXRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV8jI2ZsZykgPyAjZmxnICJcbiIgOiAiIgogCiAJaW50IHJlcyA9IHNjbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJICAgICIlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzIiwKKwkJCSAgICAiJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMiLAogCQkJICAgIFRFU1QoQVVUSCksIFRFU1QoQVNTT0MpLCBURVNUKFBTX1NUQSksCiAJCQkgICAgVEVTVChQU19EUklWRVIpLCBURVNUKEFVVEhPUklaRUQpLAotCQkJICAgIFRFU1QoU0hPUlRfUFJFQU1CTEUpLCBURVNUKEFTU09DX0FQKSwKKwkJCSAgICBURVNUKFNIT1JUX1BSRUFNQkxFKSwKIAkJCSAgICBURVNUKFdNRSksIFRFU1QoV0RTKSwgVEVTVChDTEVBUl9QU19GSUxUKSwKIAkJCSAgICBURVNUKE1GUCksIFRFU1QoQkxPQ0tfQkEpLCBURVNUKFBTUE9MTCksCiAJCQkgICAgVEVTVChVQVBTRCksIFRFU1QoU1ApLCBURVNUKFRETFNfUEVFUiksCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaAppbmRleCA1ZjE2NWQ3Li5lODk2MGFlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCisrKyBiL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKQEAgLTUsMTEgKzUsMzQgQEAKICNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgogI2luY2x1ZGUgImRyaXZlci10cmFjZS5oIgogCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCVdBUk5fT04oIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfSU5fRFJJVkVSKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqCitnZXRfYnNzX3NkYXRhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKKwkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwKKwkJCQkgICAgIHUuYXApOworCisJcmV0dXJuIHNkYXRhOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWxvY2FsLT5vcHMtPnR4KCZsb2NhbC0+aHcsIHNrYik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcnZfdHhfZnJhZ3Moc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCXN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMpCit7CisJbG9jYWwtPm9wcy0+dHhfZnJhZ3MoJmxvY2FsLT5odywgdmlmLCBzdGEsIHNrYnMpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBkcnZfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJaW50IHJldDsKQEAgLTY5LDE1ICs5MiwyMyBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50IGRydl9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlpbnQgcmV0OwogCiAJbWlnaHRfc2xlZXAoKTsKIAotCXRyYWNlX2Rydl9hZGRfaW50ZXJmYWNlKGxvY2FsLCB2aWZfdG9fc2RhdGEodmlmKSk7Ci0JcmV0ID0gbG9jYWwtPm9wcy0+YWRkX2ludGVyZmFjZSgmbG9jYWwtPmh3LCB2aWYpOworCWlmIChXQVJOX09OKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOIHx8CisJCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikpCisJCXJldHVybiAtRUlOVkFMOworCisJdHJhY2VfZHJ2X2FkZF9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKKwlyZXQgPSBsb2NhbC0+b3BzLT5hZGRfaW50ZXJmYWNlKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmKTsKIAl0cmFjZV9kcnZfcmV0dXJuX2ludChsb2NhbCwgcmV0KTsKKworCWlmIChyZXQgPT0gMCkKKwkJc2RhdGEtPmZsYWdzIHw9IElFRUU4MDIxMV9TREFUQV9JTl9EUklWRVI7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04OSw2ICsxMjAsOCBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAorCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfY2hhbmdlX2ludGVyZmFjZShsb2NhbCwgc2RhdGEsIHR5cGUsIHAycCk7CiAJcmV0ID0gbG9jYWwtPm9wcy0+Y2hhbmdlX2ludGVyZmFjZSgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgdHlwZSwgcDJwKTsKIAl0cmFjZV9kcnZfcmV0dXJuX2ludChsb2NhbCwgcmV0KTsKQEAgLTk2LDEyICsxMjksMTUgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRydl9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAltaWdodF9zbGVlcCgpOwogCi0JdHJhY2VfZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsIHZpZl90b19zZGF0YSh2aWYpKTsKLQlsb2NhbC0+b3BzLT5yZW1vdmVfaW50ZXJmYWNlKCZsb2NhbC0+aHcsIHZpZik7CisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKworCXRyYWNlX2Rydl9yZW1vdmVfaW50ZXJmYWNlKGxvY2FsLCBzZGF0YSk7CisJbG9jYWwtPm9wcy0+cmVtb3ZlX2ludGVyZmFjZSgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CisJc2RhdGEtPmZsYWdzICY9IH5JRUVFODAyMTFfU0RBVEFfSU5fRFJJVkVSOwogCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7CiB9CiAKQEAgLTEyNCw2ICsxNjAsOCBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X2Jzc19pbmZvX2NoYW5nZWQobG9jYWwsIHNkYXRhLCBpbmZvLCBjaGFuZ2VkKTsKIAlpZiAobG9jYWwtPm9wcy0+YnNzX2luZm9fY2hhbmdlZCkKIAkJbG9jYWwtPm9wcy0+YnNzX2luZm9fY2hhbmdlZCgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgaW5mbywgY2hhbmdlZCk7CkBAIC0xMzksNiArMTc3LDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3R4X3N5bmMobG9jYWwsIHNkYXRhLCBic3NpZCwgdHlwZSk7CiAJaWYgKGxvY2FsLT5vcHMtPnR4X3N5bmMpCiAJCXJldCA9IGxvY2FsLT5vcHMtPnR4X3N5bmMoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCkBAIC0xNTQsNiArMTk0LDggQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9maW5pc2hfdHhfc3luYyhsb2NhbCwgc2RhdGEsIGJzc2lkLCB0eXBlKTsKIAlpZiAobG9jYWwtPm9wcy0+ZmluaXNoX3R4X3N5bmMpCiAJCWxvY2FsLT5vcHMtPmZpbmlzaF90eF9zeW5jKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLApAQCAtMjExLDYgKzI1Myw4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9zZXRfa2V5KGxvY2FsLCBjbWQsIHNkYXRhLCBzdGEsIGtleSk7CiAJcmV0ID0gbG9jYWwtPm9wcy0+c2V0X2tleSgmbG9jYWwtPmh3LCBjbWQsICZzZGF0YS0+dmlmLCBzdGEsIGtleSk7CiAJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CkBAIC0yMjgsNiArMjcyLDggQEAKIAlpZiAoc3RhKQogCQlpc3RhID0gJnN0YS0+c3RhOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl91cGRhdGVfdGtpcF9rZXkobG9jYWwsIHNkYXRhLCBjb25mLCBpc3RhLCBpdjMyKTsKIAlpZiAobG9jYWwtPm9wcy0+dXBkYXRlX3RraXBfa2V5KQogCQlsb2NhbC0+b3BzLT51cGRhdGVfdGtpcF9rZXkoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGNvbmYsCkBAIC0yNDMsNiArMjg5LDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X2h3X3NjYW4obG9jYWwsIHNkYXRhKTsKIAlyZXQgPSBsb2NhbC0+b3BzLT5od19zY2FuKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCByZXEpOwogCXRyYWNlX2Rydl9yZXR1cm5faW50KGxvY2FsLCByZXQpOwpAQCAtMjU0LDYgKzMwMiw4IEBACiB7CiAJbWlnaHRfc2xlZXAoKTsKIAorCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfY2FuY2VsX2h3X3NjYW4obG9jYWwsIHNkYXRhKTsKIAlsb2NhbC0+b3BzLT5jYW5jZWxfaHdfc2NhbigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CiAJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKQEAgLTI2OSw2ICszMTksOCBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAorCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfc2NoZWRfc2Nhbl9zdGFydChsb2NhbCwgc2RhdGEpOwogCXJldCA9IGxvY2FsLT5vcHMtPnNjaGVkX3NjYW5fc3RhcnQoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCiAJCQkJCSAgICAgIHJlcSwgaWVzKTsKQEAgLTI4MSw2ICszMzMsOCBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3NjaGVkX3NjYW5fc3RvcChsb2NhbCwgc2RhdGEpOwogCWxvY2FsLT5vcHMtPnNjaGVkX3NjYW5fc3RvcCgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CiAJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKQEAgLTM3Nyw2ICs0MzEsOSBAQAogCQkJCSAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsCiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogeworCXNkYXRhID0gZ2V0X2Jzc19zZGF0YShzZGF0YSk7CisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9zdGFfbm90aWZ5KGxvY2FsLCBzZGF0YSwgY21kLCBzdGEpOwogCWlmIChsb2NhbC0+b3BzLT5zdGFfbm90aWZ5KQogCQlsb2NhbC0+b3BzLT5zdGFfbm90aWZ5KCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBjbWQsIHN0YSk7CkBAIC0zOTEsNiArNDQ4LDkgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwlzZGF0YSA9IGdldF9ic3Nfc2RhdGEoc2RhdGEpOworCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfc3RhX2FkZChsb2NhbCwgc2RhdGEsIHN0YSk7CiAJaWYgKGxvY2FsLT5vcHMtPnN0YV9hZGQpCiAJCXJldCA9IGxvY2FsLT5vcHMtPnN0YV9hZGQoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIHN0YSk7CkBAIC00MDYsNiArNDY2LDkgQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3N0YV9yZW1vdmUobG9jYWwsIHNkYXRhLCBzdGEpOwogCWlmIChsb2NhbC0+b3BzLT5zdGFfcmVtb3ZlKQogCQlsb2NhbC0+b3BzLT5zdGFfcmVtb3ZlKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBzdGEpOwpAQCAtNDIxLDYgKzQ4NCw4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9jb25mX3R4KGxvY2FsLCBzZGF0YSwgcXVldWUsIHBhcmFtcyk7CiAJaWYgKGxvY2FsLT5vcHMtPmNvbmZfdHgpCiAJCXJldCA9IGxvY2FsLT5vcHMtPmNvbmZfdHgoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCkBAIC00MzYsNiArNTAxLDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X2dldF90c2YobG9jYWwsIHNkYXRhKTsKIAlpZiAobG9jYWwtPm9wcy0+Z2V0X3RzZikKIAkJcmV0ID0gbG9jYWwtPm9wcy0+Z2V0X3RzZigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CkBAIC00NDksNiArNTE2LDggQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9zZXRfdHNmKGxvY2FsLCBzZGF0YSwgdHNmKTsKIAlpZiAobG9jYWwtPm9wcy0+c2V0X3RzZikKIAkJbG9jYWwtPm9wcy0+c2V0X3RzZigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgdHNmKTsKQEAgLTQ2MCw2ICs1MjksOCBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3Jlc2V0X3RzZihsb2NhbCwgc2RhdGEpOwogCWlmIChsb2NhbC0+b3BzLT5yZXNldF90c2YpCiAJCWxvY2FsLT5vcHMtPnJlc2V0X3RzZigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CkBAIC00ODksNiArNTYwLDkgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwlzZGF0YSA9IGdldF9ic3Nfc2RhdGEoc2RhdGEpOworCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfYW1wZHVfYWN0aW9uKGxvY2FsLCBzZGF0YSwgYWN0aW9uLCBzdGEsIHRpZCwgc3NuLCBidWZfc2l6ZSk7CiAKIAlpZiAobG9jYWwtPm9wcy0+YW1wZHVfYWN0aW9uKQpAQCAtNjQ0LDYgKzcxOCw4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9zZXRfYml0cmF0ZV9tYXNrKGxvY2FsLCBzZGF0YSwgbWFzayk7CiAJaWYgKGxvY2FsLT5vcHMtPnNldF9iaXRyYXRlX21hc2spCiAJCXJldCA9IGxvY2FsLT5vcHMtPnNldF9iaXRyYXRlX21hc2soJmxvY2FsLT5odywKQEAgLTY1Nyw2ICs3MzMsOCBAQAogCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9ndGtfcmVrZXlfZGF0YSAqZGF0YSkKIHsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3NldF9yZWtleV9kYXRhKGxvY2FsLCBzZGF0YSwgZGF0YSk7CiAJaWYgKGxvY2FsLT5vcHMtPnNldF9yZWtleV9kYXRhKQogCQlsb2NhbC0+b3BzLT5zZXRfcmVrZXlfZGF0YSgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgZGF0YSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZHJpdmVyLXRyYWNlLmggYi9uZXQvbWFjODAyMTEvZHJpdmVyLXRyYWNlLmgKaW5kZXggMmFmNGZjYS4uNmU5ZGY4ZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RyaXZlci10cmFjZS5oCisrKyBiL25ldC9tYWM4MDIxMS9kcml2ZXItdHJhY2UuaApAQCAtNSwxNyArNSw2IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKIAotI2lmICFkZWZpbmVkKENPTkZJR19NQUM4MDIxMV9EUklWRVJfQVBJX1RSQUNFUikgfHwgZGVmaW5lZChfX0NIRUNLRVJfXykKLSN1bmRlZiBUUkFDRV9FVkVOVAotI2RlZmluZSBUUkFDRV9FVkVOVChuYW1lLCBwcm90bywgLi4uKSBcCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhY2VfICMjIG5hbWUocHJvdG8pIHt9Ci0jdW5kZWYgREVDTEFSRV9FVkVOVF9DTEFTUwotI2RlZmluZSBERUNMQVJFX0VWRU5UX0NMQVNTKC4uLikKLSN1bmRlZiBERUZJTkVfRVZFTlQKLSNkZWZpbmUgREVGSU5FX0VWRU5UKGV2dF9jbGFzcywgbmFtZSwgcHJvdG8sIC4uLikgXAotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlXyAjIyBuYW1lKHByb3RvKSB7fQotI2VuZGlmCi0KICN1bmRlZiBUUkFDRV9TWVNURU0KICNkZWZpbmUgVFJBQ0VfU1lTVEVNIG1hYzgwMjExCiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9odC5jIGIvbmV0L21hYzgwMjExL2h0LmMKaW5kZXggZjgwYTM1Yy4uZDNlYWZhZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2h0LmMKKysrIGIvbmV0L21hYzgwMjExL2h0LmMKQEAgLTE0LDExICsxNCw4NyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgogI2luY2x1ZGUgInJhdGUuaCIKIAotdm9pZCBpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCitib29sIGllZWU4MDExMV9jZmdfb3ZlcnJpZGVfZGlzYWJsZXNfaHQ0MChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKK3sKKwljb25zdCBfX2xlMTYgZmxnID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApOworCWlmICgoc2RhdGEtPnUubWdkLmh0X2NhcGFfbWFzay5jYXBfaW5mbyAmIGZsZykgJiYKKwkgICAgIShzZGF0YS0+dS5tZ2QuaHRfY2FwYS5jYXBfaW5mbyAmIGZsZykpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgX19jaGVja19odGNhcF9kaXNhYmxlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCisJCQkJICB1MTYgZmxhZykKK3sKKwlfX2xlMTYgbGVfZmxhZyA9IGNwdV90b19sZTE2KGZsYWcpOworCWlmIChzZGF0YS0+dS5tZ2QuaHRfY2FwYV9tYXNrLmNhcF9pbmZvICYgbGVfZmxhZykgeworCQlpZiAoIShzZGF0YS0+dS5tZ2QuaHRfY2FwYS5jYXBfaW5mbyAmIGxlX2ZsYWcpKQorCQkJaHRfY2FwLT5jYXAgJj0gfmZsYWc7CisJfQorfQorCit2b2lkIGllZWU4MDIxMV9hcHBseV9odGNhcF9vdmVycmlkZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCkKK3sKKwl1OCAqc2NhcHMgPSAodTggKikoJnNkYXRhLT51Lm1nZC5odF9jYXBhLm1jcy5yeF9tYXNrKTsKKwl1OCAqc21hc2sgPSAodTggKikoJnNkYXRhLT51Lm1nZC5odF9jYXBhX21hc2subWNzLnJ4X21hc2spOworCWludCBpOworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CisJCVdBUk5fT05fT05DRShzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTik7CisJCXJldHVybjsKKwl9CisKKwkvKiBOT1RFOiAgSWYgeW91IGFkZCBtb3JlIG92ZXItcmlkZXMgaGVyZSwgdXBkYXRlIHJlZ2lzdGVyX2h3CisJICogaHRfY2FwYV9tb2RfbXNrIGxvZ2ljIGluIG1haW4uYyBhcyB3ZWxsLgorCSAqIEFuZCwgaWYgdGhpcyBtZXRob2QgY2FuIGV2ZXIgY2hhbmdlIGh0X2NhcC5odF9zdXBwb3J0ZWQsIGZpeAorCSAqIHRoZSBjaGVjayBpbiBpZWVlODAyMTFfYWRkX2h0X2llLgorCSAqLworCisJLyogY2hlY2sgZm9yIEhUIG92ZXItcmlkZXMsIE1DUyByYXRlcyBmaXJzdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTjsgaSsrKSB7CisJCXU4IG0gPSBzbWFza1tpXTsKKwkJaHRfY2FwLT5tY3MucnhfbWFza1tpXSAmPSB+bTsgLyogdHVybiBvZmYgYWxsIG1hc2tlZCBiaXRzICovCisJCS8qIEFkZCBiYWNrIHJhdGVzIHRoYXQgYXJlIHN1cHBvcnRlZCAqLworCQlodF9jYXAtPm1jcy5yeF9tYXNrW2ldIHw9IChtICYgc2NhcHNbaV0pOworCX0KKworCS8qIEZvcmNlIHJlbW92YWwgb2YgSFQtNDAgY2FwYWJpbGl0aWVzPyAqLworCV9fY2hlY2tfaHRjYXBfZGlzYWJsZShzZGF0YSwgaHRfY2FwLCBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCk7CisJX19jaGVja19odGNhcF9kaXNhYmxlKHNkYXRhLCBodF9jYXAsIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKTsKKworCS8qIEFsbG93IHVzZXIgdG8gZGlzYWJsZSB0aGUgbWF4LUFNU0RVIGJpdC4gKi8KKwlfX2NoZWNrX2h0Y2FwX2Rpc2FibGUoc2RhdGEsIGh0X2NhcCwgSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFUpOworCisJLyogQWxsb3cgdXNlciB0byBkZWNyZWFzZSBBTVBEVSBmYWN0b3IgKi8KKwlpZiAoc2RhdGEtPnUubWdkLmh0X2NhcGFfbWFzay5hbXBkdV9wYXJhbXNfaW5mbyAmCisJICAgIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUikgeworCQl1OCBuID0gc2RhdGEtPnUubWdkLmh0X2NhcGEuYW1wZHVfcGFyYW1zX2luZm8KKwkJCSYgSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fRkFDVE9SOworCQlpZiAobiA8IGh0X2NhcC0+YW1wZHVfZmFjdG9yKQorCQkJaHRfY2FwLT5hbXBkdV9mYWN0b3IgPSBuOworCX0KKworCS8qIEFsbG93IHRoZSB1c2VyIHRvIGluY3JlYXNlIEFNUERVIGRlbnNpdHkuICovCisJaWYgKHNkYXRhLT51Lm1nZC5odF9jYXBhX21hc2suYW1wZHVfcGFyYW1zX2luZm8gJgorCSAgICBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZKSB7CisJCXU4IG4gPSAoc2RhdGEtPnUubWdkLmh0X2NhcGEuYW1wZHVfcGFyYW1zX2luZm8gJgorCQkJSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSkKKwkJCT4+IElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFlfU0hJRlQ7CisJCWlmIChuID4gaHRfY2FwLT5hbXBkdV9kZW5zaXR5KQorCQkJaHRfY2FwLT5hbXBkdV9kZW5zaXR5ID0gbjsKKwl9Cit9CisKKwordm9pZCBpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAogCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwX2llLAogCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCkKIHsKQEAgLTEwMiw2ICsxNzgsMTIgQEAKIAkvKiBoYW5kbGUgTUNTIHJhdGUgMzIgdG9vICovCiAJaWYgKHNiYW5kLT5odF9jYXAubWNzLnJ4X21hc2tbMzIvOF0gJiBodF9jYXBfaWUtPm1jcy5yeF9tYXNrWzMyLzhdICYgMSkKIAkJaHRfY2FwLT5tY3MucnhfbWFza1szMi84XSB8PSAxOworCisJLyoKKwkgKiBJZiB1c2VyIGhhcyBzcGVjaWZpZWQgY2FwYWJpbGl0eSBvdmVyLXJpZGVzLCB0YWtlIGNhcmUKKwkgKiBvZiB0aGF0IGhlcmUuCisJICovCisJaWVlZTgwMjExX2FwcGx5X2h0Y2FwX292ZXJyaWRlcyhzZGF0YSwgaHRfY2FwKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfc3RhX3RlYXJfZG93bl9CQV9zZXNzaW9ucyhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgYm9vbCB0eCkKQEAgLTE5NSw3ICsyNzcsOCBAQAogCW1lbWNweShtZ210LT5kYSwgZGEsIEVUSF9BTEVOKTsKIAltZW1jcHkobWdtdC0+c2EsIHNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOwogCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOIHx8CisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKQogCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOwogCWVsc2UgaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT51Lm1nZC5ic3NpZCwgRVRIX0FMRU4pOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2lic3MuYyBiL25ldC9tYWM4MDIxMS9pYnNzLmMKaW5kZXggZWRlOWE4Yi4uN2Q4NGFmNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lic3MuYworKysgYi9uZXQvbWFjODAyMTEvaWJzcy5jCkBAIC05Nyw2ICs5Nyw3IEBACiAJLyogaWYgbWVyZ2luZywgaW5kaWNhdGUgdG8gZHJpdmVyIHRoYXQgd2UgbGVhdmUgdGhlIG9sZCBJQlNTICovCiAJaWYgKHNkYXRhLT52aWYuYnNzX2NvbmYuaWJzc19qb2luZWQpIHsKIAkJc2RhdGEtPnZpZi5ic3NfY29uZi5pYnNzX2pvaW5lZCA9IGZhbHNlOworCQluZXRpZl9jYXJyaWVyX29mZihzZGF0YS0+ZGV2KTsKIAkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIEJTU19DSEFOR0VEX0lCU1MpOwogCX0KIApAQCAtMjA3LDYgKzIwOCw3IEBACiAJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZShsb2NhbC0+aHcud2lwaHksIGxvY2FsLT5ody5jb25mLmNoYW5uZWwsCiAJCQkJCW1nbXQsIHNrYi0+bGVuLCAwLCBHRlBfS0VSTkVMKTsKIAljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CisJbmV0aWZfY2Fycmllcl9vbihzZGF0YS0+ZGV2KTsKIAljZmc4MDIxMV9pYnNzX2pvaW5lZChzZGF0YS0+ZGV2LCBpZmlic3MtPmJzc2lkLCBHRlBfS0VSTkVMKTsKIH0KIApAQCAtOTkwLDYgKzk5Miw3IEBACiAJfQogCiAJc3RhX2luZm9fZmx1c2goc2RhdGEtPmxvY2FsLCBzZGF0YSk7CisJbmV0aWZfY2Fycmllcl9vZmYoc2RhdGEtPmRldik7CiAKIAkvKiByZW1vdmUgYmVhY29uICovCiAJa2ZyZWUoc2RhdGEtPnUuaWJzcy5pZSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaCBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCmluZGV4IGVhMTBhNTEuLmJkZWZhNmIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCisrKyBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CkBAIC0xNDEsNiArMTQyLDcgQEAKIAogc3RydWN0IGllZWU4MDIxMV90eF9kYXRhIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBza19idWZmX2hlYWQgc2ticzsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKQEAgLTE4NCwxMiArMTg2LDE1IEBACiAgKiBlbnVtIGllZWU4MDIxMV9yeF9mbGFncyAtIFJYIGRhdGEgZmxhZ3MKICAqCiAgKiBASUVFRTgwMjExX1JYX0NNTlRSOiByZWNlaXZlZCBvbiBjb29rZWQgbW9uaXRvciBhbHJlYWR5CisgKiBASUVFRTgwMjExX1JYX0JFQUNPTl9SRVBPUlRFRDogVGhpcyBmcmFtZSB3YXMgYWxyZWFkeSByZXBvcnRlZAorICoJdG8gY2ZnODAyMTFfcmVwb3J0X29ic3NfYmVhY29uKCkuCiAgKgogICogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgYWNyb3NzIGhhbmRsaW5nIG11bHRpcGxlIGludGVyZmFjZXMKICAqIGZvciBhIHNpbmdsZSBmcmFtZS4KICAqLwogZW51bSBpZWVlODAyMTFfcnhfZmxhZ3MgewogCUlFRUU4MDIxMV9SWF9DTU5UUgkJPSBCSVQoMCksCisJSUVFRTgwMjExX1JYX0JFQUNPTl9SRVBPUlRFRAk9IEJJVCgxKSwKIH07CiAKIHN0cnVjdCBpZWVlODAyMTFfcnhfZGF0YSB7CkBAIC0yMjgsNiArMjMzLDcgQEAKIAogc3RydWN0IGllZWU4MDIxMV9pZl9hcCB7CiAJc3RydWN0IGJlYWNvbl9kYXRhIF9fcmN1ICpiZWFjb247CisJc3RydWN0IHNrX2J1ZmYgX19yY3UgKnByb2JlX3Jlc3A7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHZsYW5zOwogCkBAIC00NDMsNiArNDQ5LDkgQEAKIAkgKi8KIAlpbnQgcnNzaV9taW5fdGhvbGQsIHJzc2lfbWF4X3Rob2xkOwogCWludCBsYXN0X2F2ZV9iZWFjb25fc2lnbmFsOworCisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwYTsgLyogY29uZmlndXJlZCBodC1jYXAgb3Zlci1yaWRlcyAqLworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcGFfbWFzazsgLyogVmFsaWQgcGFydHMgb2YgaHRfY2FwYSAqLwogfTsKIAogc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzIHsKQEAgLTUwNSw3ICs1MTQsOSBAQAogCWF0b21pY190IG1wYXRoczsKIAkvKiBUaW1lc3RhbXAgb2YgbGFzdCBTTiB1cGRhdGUgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3Rfc25fdXBkYXRlOwotCS8qIFRpbWVzdGFtcCBvZiBsYXN0IFNOIHNlbnQgKi8KKwkvKiBUaW1lIHdoZW4gaXQncyBvayB0byBzZW5kIG5leHQgUEVSUiAqLworCXVuc2lnbmVkIGxvbmcgbmV4dF9wZXJyOworCS8qIFRpbWVzdGFtcCBvZiBsYXN0IFBSRVEgc2VudCAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF9wcmVxOwogCXN0cnVjdCBtZXNoX3JtYyAqcm1jOwogCXNwaW5sb2NrX3QgbWVzaF9wcmVxX3F1ZXVlX2xvY2s7CkBAIC01NDMsNiArNTU0LDcgQEAKICAqCWFzc29jaWF0ZWQgc3RhdGlvbnMgYW5kIGRlbGl2ZXIgbXVsdGljYXN0IGZyYW1lcyBib3RoCiAgKgliYWNrIHRvIHdpcmVsZXNzIG1lZGlhIGFuZCB0byB0aGUgbG9jYWwgbmV0IHN0YWNrLgogICogQElFRUU4MDIxMV9TREFUQV9ESVNDT05ORUNUX1JFU1VNRTogRGlzY29ubmVjdCBhZnRlciByZXN1bWUuCisgKiBASUVFRTgwMjExX1NEQVRBX0lOX0RSSVZFUjogaW5kaWNhdGVzIGludGVyZmFjZSB3YXMgYWRkZWQgdG8gZHJpdmVyCiAgKi8KIGVudW0gaWVlZTgwMjExX3N1Yl9pZl9kYXRhX2ZsYWdzIHsKIAlJRUVFODAyMTFfU0RBVEFfQUxMTVVMVEkJCT0gQklUKDApLApAQCAtNTUwLDYgKzU2Miw3IEBACiAJSUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERQkJPSBCSVQoMiksCiAJSUVFRTgwMjExX1NEQVRBX0RPTlRfQlJJREdFX1BBQ0tFVFMJPSBCSVQoMyksCiAJSUVFRTgwMjExX1NEQVRBX0RJU0NPTk5FQ1RfUkVTVU1FCT0gQklUKDQpLAorCUlFRUU4MDIxMV9TREFUQV9JTl9EUklWRVIJCT0gQklUKDUpLAogfTsKIAogLyoqCkBAIC02MDAsNiArNjEzLDkgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdtZW50X2VudHJ5CWZyYWdtZW50c1tJRUVFODAyMTFfRlJBR01FTlRfTUFYXTsKIAl1bnNpZ25lZCBpbnQgZnJhZ21lbnRfbmV4dDsKIAorCS8qIFRJRCBiaXRtYXAgZm9yIE5vQWNrIHBvbGljeSAqLworCXUxNiBub2Fja19tYXA7CisKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSBfX3JjdSAqa2V5c1tOVU1fREVGQVVMVF9LRVlTICsgTlVNX0RFRkFVTFRfTUdNVF9LRVlTXTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSBfX3JjdSAqZGVmYXVsdF91bmljYXN0X2tleTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSBfX3JjdSAqZGVmYXVsdF9tdWx0aWNhc3Rfa2V5OwpAQCAtNzIyLDE3ICs3MzgsMTYgQEAKICAqCW9wZXJhdGluZyBjaGFubmVsCiAgKiBAU0NBTl9TRVRfQ0hBTk5FTDogU2V0IHRoZSBuZXh0IGNoYW5uZWwgdG8gYmUgc2Nhbm5lZAogICogQFNDQU5fU0VORF9QUk9CRTogU2VuZCBwcm9iZSByZXF1ZXN0cyBhbmQgd2FpdCBmb3IgcHJvYmUgcmVzcG9uc2VzCi0gKiBAU0NBTl9MRUFWRV9PUEVSX0NIQU5ORUw6IExlYXZlIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCwgbm90aWZ5IHRoZSBBUAotICoJYWJvdXQgdXMgbGVhdmluZyB0aGUgY2hhbm5lbCBhbmQgc3RvcCBhbGwgYXNzb2NpYXRlZCBTVEEgaW50ZXJmYWNlcwotICogQFNDQU5fRU5URVJfT1BFUl9DSEFOTkVMOiBFbnRlciB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgYWdhaW4sIG5vdGlmeSB0aGUKLSAqCUFQIGFib3V0IHVzIGJlaW5nIGJhY2sgYW5kIHJlc3RhcnQgYWxsIGFzc29jaWF0ZWQgU1RBIGludGVyZmFjZXMKKyAqIEBTQ0FOX1NVU1BFTkQ6IFN1c3BlbmQgdGhlIHNjYW4gYW5kIGdvIGJhY2sgdG8gb3BlcmF0aW5nIGNoYW5uZWwgdG8KKyAqCXNlbmQgb3V0IGRhdGEKKyAqIEBTQ0FOX1JFU1VNRTogUmVzdW1lIHRoZSBzY2FuIGFuZCBzY2FuIHRoZSBuZXh0IGNoYW5uZWwKICAqLwogZW51bSBtYWM4MDIxMV9zY2FuX3N0YXRlIHsKIAlTQ0FOX0RFQ0lTSU9OLAogCVNDQU5fU0VUX0NIQU5ORUwsCiAJU0NBTl9TRU5EX1BST0JFLAotCVNDQU5fTEVBVkVfT1BFUl9DSEFOTkVMLAotCVNDQU5fRU5URVJfT1BFUl9DSEFOTkVMLAorCVNDQU5fU1VTUEVORCwKKwlTQ0FOX1JFU1VNRSwKIH07CiAKIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgewpAQCAtOTUxLDcgKzk2Niw2IEBACiAJaW50IHRvdGFsX3BzX2J1ZmZlcmVkOyAvKiB0b3RhbCBudW1iZXIgb2YgYWxsIGJ1ZmZlcmVkIHVuaWNhc3QgYW5kCiAJCQkJKiBtdWx0aWNhc3QgcGFja2V0cyBmb3IgcG93ZXIgc2F2aW5nIHN0YXRpb25zCiAJCQkJKi8KLQlpbnQgd2lmaV93bWVfbm9hY2tfdGVzdDsKIAl1bnNpZ25lZCBpbnQgd21tX2FjbTsgLyogYml0IGZpZWxkIG9mIEFDTSBiaXRzIChCSVQoODAyLjFEIHRhZykpICovCiAKIAkvKgpAQCAtMTAxMiw2ICsxMDI2LDkgQEAKIAl1MzIgaHdfcm9jX2Nvb2tpZTsKIAlib29sIGh3X3JvY19mb3JfdHg7CiAKKwlzdHJ1Y3QgaWRyIGFja19zdGF0dXNfZnJhbWVzOworCXNwaW5sb2NrX3QgYWNrX3N0YXR1c19sb2NrOworCiAJLyogZHVtbXkgbmV0ZGV2IGZvciB1c2Ugdy8gTkFQSSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlIG5hcGlfZGV2OwogCkBAIC0xMDMwLDYgKzEwNDcsNjkgQEAKIAl1MTYgdGlkOwogfTsKIAorLyogUGFyc2VkIEluZm9ybWF0aW9uIEVsZW1lbnRzICovCitzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyB7CisJdTggKmllX3N0YXJ0OworCXNpemVfdCB0b3RhbF9sZW47CisKKwkvKiBwb2ludGVycyB0byBJRXMgKi8KKwl1OCAqc3NpZDsKKwl1OCAqc3VwcF9yYXRlczsKKwl1OCAqZmhfcGFyYW1zOworCXU4ICpkc19wYXJhbXM7CisJdTggKmNmX3BhcmFtczsKKwlzdHJ1Y3QgaWVlZTgwMjExX3RpbV9pZSAqdGltOworCXU4ICppYnNzX3BhcmFtczsKKwl1OCAqY2hhbGxlbmdlOworCXU4ICp3cGE7CisJdTggKnJzbjsKKwl1OCAqZXJwX2luZm87CisJdTggKmV4dF9zdXBwX3JhdGVzOworCXU4ICp3bW1faW5mbzsKKwl1OCAqd21tX3BhcmFtOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBfZWxlbTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKmh0X2luZm9fZWxlbTsKKwlzdHJ1Y3QgaWVlZTgwMjExX21lc2hjb25mX2llICptZXNoX2NvbmZpZzsKKwl1OCAqbWVzaF9pZDsKKwl1OCAqcGVlcmluZzsKKwl1OCAqcHJlcTsKKwl1OCAqcHJlcDsKKwl1OCAqcGVycjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Jhbm5faWUgKnJhbm47CisJdTggKmNoX3N3aXRjaF9lbGVtOworCXU4ICpjb3VudHJ5X2VsZW07CisJdTggKnB3cl9jb25zdHJfZWxlbTsKKwl1OCAqcXVpZXRfZWxlbTsJLyogZmlyc3QgcXVpdGUgZWxlbWVudCAqLworCXU4ICp0aW1lb3V0X2ludDsKKworCS8qIGxlbmd0aCBvZiB0aGVtLCByZXNwZWN0aXZlbHkgKi8KKwl1OCBzc2lkX2xlbjsKKwl1OCBzdXBwX3JhdGVzX2xlbjsKKwl1OCBmaF9wYXJhbXNfbGVuOworCXU4IGRzX3BhcmFtc19sZW47CisJdTggY2ZfcGFyYW1zX2xlbjsKKwl1OCB0aW1fbGVuOworCXU4IGlic3NfcGFyYW1zX2xlbjsKKwl1OCBjaGFsbGVuZ2VfbGVuOworCXU4IHdwYV9sZW47CisJdTggcnNuX2xlbjsKKwl1OCBlcnBfaW5mb19sZW47CisJdTggZXh0X3N1cHBfcmF0ZXNfbGVuOworCXU4IHdtbV9pbmZvX2xlbjsKKwl1OCB3bW1fcGFyYW1fbGVuOworCXU4IG1lc2hfaWRfbGVuOworCXU4IHBlZXJpbmdfbGVuOworCXU4IHByZXFfbGVuOworCXU4IHByZXBfbGVuOworCXU4IHBlcnJfbGVuOworCXU4IGNoX3N3aXRjaF9lbGVtX2xlbjsKKwl1OCBjb3VudHJ5X2VsZW1fbGVuOworCXU4IHB3cl9jb25zdHJfZWxlbV9sZW47CisJdTggcXVpZXRfZWxlbV9sZW47CisJdTggbnVtX29mX3F1aWV0X2VsZW07CS8qIGNhbiBiZSBtb3JlIHRoZSBvbmUgKi8KKwl1OCB0aW1lb3V0X2ludF9sZW47Cit9OworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmh3X3RvX2xvY2FsKAogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewpAQCAtMTE0MCwxMyArMTIyMCwxMSBAQAogdm9pZCBpZWVlODAyMTFfc2NoZWRfc2Nhbl9zdG9wcGVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyogb2ZmLWNoYW5uZWwgaGVscGVycyAqLwotYm9vbCBpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7CiB2b2lkIGllZWU4MDIxMV9vZmZjaGFubmVsX2VuYWJsZV9hbGxfcHMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkJCWJvb2wgdGVsbF9hcCk7CiB2b2lkIGllZWU4MDIxMV9vZmZjaGFubmVsX3N0b3BfdmlmcyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCQkgICAgYm9vbCBvZmZjaGFubmVsX3BzX2VuYWJsZSk7CiB2b2lkIGllZWU4MDIxMV9vZmZjaGFubmVsX3JldHVybihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkgYm9vbCBlbmFibGVfYmVhY29uaW5nLAogCQkJCSBib29sIG9mZmNoYW5uZWxfcHNfZGlzYWJsZSk7CiB2b2lkIGllZWU4MDIxMV9od19yb2Nfc2V0dXAoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwogCkBAIC0xMTc5LDcgKzEyNTcsMTEgQEAKIAkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIC8qIEhUICovCi12b2lkIGllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKK2Jvb2wgaWVlZTgwMTExX2NmZ19vdmVycmlkZV9kaXNhYmxlc19odDQwKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKK3ZvaWQgaWVlZTgwMjExX2FwcGx5X2h0Y2FwX292ZXJyaWRlcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKTsKK3ZvaWQgaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKIAkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcF9pZSwKIAkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXApOwogdm9pZCBpZWVlODAyMTFfc2VuZF9kZWxiYShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKQEAgLTEzMzQsNiArMTQxNiwxMiBAQAogc2l6ZV90IGllZWU4MDIxMV9pZV9zcGxpdChjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVsZW4sCiAJCQkgIGNvbnN0IHU4ICppZHMsIGludCBuX2lkcywgc2l6ZV90IG9mZnNldCk7CiBzaXplX3QgaWVlZTgwMjExX2llX3NwbGl0X3ZlbmRvcihjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVsZW4sIHNpemVfdCBvZmZzZXQpOwordTggKmllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCisJCQkgICAgICB1MTYgY2FwKTsKK3U4ICppZWVlODAyMTFfaWVfYnVpbGRfaHRfaW5mbyh1OCAqcG9zLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSk7CiAKIC8qIGludGVybmFsIHdvcmsgaXRlbXMgKi8KIHZvaWQgaWVlZTgwMjExX3dvcmtfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7CkBAIC0xMzYyLDYgKzE0NTAsOCBAQAogYm9vbCBpZWVlODAyMTFfc2V0X2NoYW5uZWxfdHlwZShzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW50eXBlKTsKK2VudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUKK2llZWU4MDIxMV9odF9pbmZvX3RvX2NoYW5uZWxfdHlwZShzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKmh0X2luZm8pOwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX05PSU5MSU5FCiAjZGVmaW5lIGRlYnVnX25vaW5saW5lIG5vaW5saW5lCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWZhY2UuYyBiL25ldC9tYWM4MDIxMS9pZmFjZS5jCmluZGV4IDMwZDczNTUuLjNkM2JiNWUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZmFjZS5jCisrKyBiL25ldC9tYWM4MDIxMS9pZmFjZS5jCkBAIC0xODgsMTEgKzE4OCwyMiBAQAogCQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoc2RhdGEtPnUud2RzLnJlbW90ZV9hZGRyKSkKIAkJCXJldHVybiAtRU5PTElOSzsKIAkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjogeworCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICptYXN0ZXI7CisKIAkJaWYgKCFzZGF0YS0+YnNzKQogCQkJcmV0dXJuIC1FTk9MSU5LOworCiAJCWxpc3RfYWRkKCZzZGF0YS0+dS52bGFuLmxpc3QsICZzZGF0YS0+YnNzLT52bGFucyk7CisKKwkJbWFzdGVyID0gY29udGFpbmVyX29mKHNkYXRhLT5ic3MsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwgdS5hcCk7CisJCXNkYXRhLT5jb250cm9sX3BvcnRfcHJvdG9jb2wgPQorCQkJbWFzdGVyLT5jb250cm9sX3BvcnRfcHJvdG9jb2w7CisJCXNkYXRhLT5jb250cm9sX3BvcnRfbm9fZW5jcnlwdCA9CisJCQltYXN0ZXItPmNvbnRyb2xfcG9ydF9ub19lbmNyeXB0OwogCQlicmVhazsKKwkJfQogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CiAJCXNkYXRhLT5ic3MgPSAmc2RhdGEtPnUuYXA7CiAJCWJyZWFrOwpAQCAtMjY1LDcgKzI3Niw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWlmIChjb21pbmdfdXApIHsKLQkJCXJlcyA9IGRydl9hZGRfaW50ZXJmYWNlKGxvY2FsLCAmc2RhdGEtPnZpZik7CisJCQlyZXMgPSBkcnZfYWRkX2ludGVyZmFjZShsb2NhbCwgc2RhdGEpOwogCQkJaWYgKHJlcykKIAkJCQlnb3RvIGVycl9zdG9wOwogCQl9CkBAIC0yODIsMTAgKzI5MywxOCBAQAogCQljaGFuZ2VkIHw9IGllZWU4MDIxMV9yZXNldF9lcnBfaW5mbyhzZGF0YSk7CiAJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKIAotCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCQkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAkJZWxzZQogCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCisJCS8qCisJCSAqIHNldCBkZWZhdWx0IHF1ZXVlIHBhcmFtZXRlcnMgc28gZHJpdmVycyBkb24ndAorCQkgKiBuZWVkIHRvIGluaXRpYWxpc2UgdGhlIGhhcmR3YXJlIGlmIHRoZSBoYXJkd2FyZQorCQkgKiBkb2Vzbid0IHN0YXJ0IHVwIHdpdGggc2FuZSBkZWZhdWx0cworCQkgKi8KKwkJaWVlZTgwMjExX3NldF93bW1fZGVmYXVsdChzZGF0YSk7CiAJfQogCiAJc2V0X2JpdChTREFUQV9TVEFURV9SVU5OSU5HLCAmc2RhdGEtPnN0YXRlKTsKQEAgLTMyOSwxNSArMzQ4LDggQEAKIAlpZiAoY29taW5nX3VwKQogCQlsb2NhbC0+b3Blbl9jb3VudCsrOwogCi0JaWYgKGh3X3JlY29uZl9mbGFncykgeworCWlmIChod19yZWNvbmZfZmxhZ3MpCiAJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIGh3X3JlY29uZl9mbGFncyk7Ci0JCS8qCi0JCSAqIHNldCBkZWZhdWx0IHF1ZXVlIHBhcmFtZXRlcnMgc28gZHJpdmVycyBkb24ndAotCQkgKiBuZWVkIHRvIGluaXRpYWxpc2UgdGhlIGhhcmR3YXJlIGlmIHRoZSBoYXJkd2FyZQotCQkgKiBkb2Vzbid0IHN0YXJ0IHVwIHdpdGggc2FuZSBkZWZhdWx0cwotCQkgKi8KLQkJaWVlZTgwMjExX3NldF93bW1fZGVmYXVsdChzZGF0YSk7Ci0JfQogCiAJaWVlZTgwMjExX3JlY2FsY19wcyhsb2NhbCwgLTEpOwogCkBAIC0zNDUsNyArMzU3LDcgQEAKIAogCXJldHVybiAwOwogIGVycl9kZWxfaW50ZXJmYWNlOgotCWRydl9yZW1vdmVfaW50ZXJmYWNlKGxvY2FsLCAmc2RhdGEtPnZpZik7CisJZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKICBlcnJfc3RvcDoKIAlpZiAoIWxvY2FsLT5vcGVuX2NvdW50KQogCQlkcnZfc3RvcChsb2NhbCk7CkBAIC00NTAsMTUgKzQ2MiwxOSBAQAogCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICp2bGFuLCAqdG1wc2RhdGE7CiAJCXN0cnVjdCBiZWFjb25fZGF0YSAqb2xkX2JlYWNvbiA9CiAJCQlydG5sX2RlcmVmZXJlbmNlKHNkYXRhLT51LmFwLmJlYWNvbik7CisJCXN0cnVjdCBza19idWZmICpvbGRfcHJvYmVfcmVzcCA9CisJCQlydG5sX2RlcmVmZXJlbmNlKHNkYXRhLT51LmFwLnByb2JlX3Jlc3ApOwogCiAJCS8qIHNkYXRhX3J1bm5pbmcgd2lsbCByZXR1cm4gZmFsc2UsIHNvIHRoaXMgd2lsbCBkaXNhYmxlICovCiAJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLAogCQkJCQkJIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKTsKIAotCQkvKiByZW1vdmUgYmVhY29uICovCisJCS8qIHJlbW92ZSBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlICovCiAJCVJDVV9JTklUX1BPSU5URVIoc2RhdGEtPnUuYXAuYmVhY29uLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihzZGF0YS0+dS5hcC5wcm9iZV9yZXNwLCBOVUxMKTsKIAkJc3luY2hyb25pemVfcmN1KCk7CiAJCWtmcmVlKG9sZF9iZWFjb24pOworCQlrZnJlZV9za2Iob2xkX3Byb2JlX3Jlc3ApOwogCiAJCS8qIGRvd24gYWxsIGRlcGVuZGVudCBkZXZpY2VzLCB0aGF0IGlzIFZMQU5zICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bGFuLCB0bXBzZGF0YSwgJnNkYXRhLT51LmFwLnZsYW5zLApAQCAtNTIwLDcgKzUzNiw3IEBACiAJCWllZWU4MDIxMV9mcmVlX2tleXMoc2RhdGEpOwogCiAJCWlmIChnb2luZ19kb3duKQotCQkJZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsICZzZGF0YS0+dmlmKTsKKwkJCWRydl9yZW1vdmVfaW50ZXJmYWNlKGxvY2FsLCBzZGF0YSk7CiAJfQogCiAJc2RhdGEtPmJzcyA9IE5VTEw7CkBAIC02NTYsNyArNjcyLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyICpydGFwID0gKHZvaWQgKilza2ItPmRhdGE7Ci0JdTggKnA7CiAKIAlpZiAobG9jYWwtPmh3LnF1ZXVlcyA8IDQpCiAJCXJldHVybiAwOwpAQCAtNjY3LDE5ICs2ODIsNyBAQAogCiAJaGRyID0gKHZvaWQgKikoKHU4ICopc2tiLT5kYXRhICsgbGUxNl90b19jcHUocnRhcC0+aXRfbGVuKSk7CiAKLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJc2tiLT5wcmlvcml0eSA9IDc7Ci0JCXJldHVybiBpZWVlODAyXzFkX3RvX2FjW3NrYi0+cHJpb3JpdHldOwotCX0KLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXNrYi0+cHJpb3JpdHkgPSAwOwotCQlyZXR1cm4gaWVlZTgwMl8xZF90b19hY1tza2ItPnByaW9yaXR5XTsKLQl9Ci0KLQlwID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0Jc2tiLT5wcmlvcml0eSA9ICpwICYgSUVFRTgwMjExX1FPU19DVExfVEFHMURfTUFTSzsKLQotCXJldHVybiBpZWVlODAyMTFfZG93bmdyYWRlX3F1ZXVlKGxvY2FsLCBza2IpOworCXJldHVybiBpZWVlODAyMTFfc2VsZWN0X3F1ZXVlXzgwMjExKGxvY2FsLCBza2IsIGhkcik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaWVlZTgwMjExX21vbml0b3JpZl9vcHMgPSB7CkBAIC04NTAsNiArODUzLDggQEAKIAlzZGF0YS0+Y29udHJvbF9wb3J0X3Byb3RvY29sID0gY3B1X3RvX2JlMTYoRVRIX1BfUEFFKTsKIAlzZGF0YS0+Y29udHJvbF9wb3J0X25vX2VuY3J5cHQgPSBmYWxzZTsKIAorCXNkYXRhLT5ub2Fja19tYXAgPSAwOworCiAJLyogb25seSBtb25pdG9yIGRpZmZlcnMgKi8KIAlzZGF0YS0+ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEva2V5LmMgYi9uZXQvbWFjODAyMTEva2V5LmMKaW5kZXggNzU2YjE1Ny4uODdhODk3NCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2tleS5jCisrKyBiL25ldC9tYWM4MDIxMS9rZXkuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAjaW5jbHVkZSAiZHJpdmVyLW9wcy5oIgpAQCAtMTMzLDkgKzEzNCwxMyBAQAogCQlrZXktPmZsYWdzIHw9IEtFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFOwogCiAJCWlmICghKChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQykgfHwKLQkJICAgICAgKGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikpKQorCQkgICAgICAoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSB8fAorCQkgICAgICAoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9JVl9TUEFDRSkpKQogCQkJc2RhdGEtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250LS07CiAKKwkJV0FSTl9PTigoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9JVl9TUEFDRSkgJiYKKwkJCShrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKTsKKwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE3OCw3ICsxODMsOCBAQAogCXNkYXRhID0ga2V5LT5zZGF0YTsKIAogCWlmICghKChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQykgfHwKLQkgICAgICAoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSkpCisJICAgICAgKGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikgfHwKKwkgICAgICAoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9JVl9TUEFDRSkpKQogCQlpbmNyZW1lbnRfdGFpbHJvb21fbmVlZF9jb3VudChzZGF0YSk7CiAKIAlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbGVkLmMgYi9uZXQvbWFjODAyMTEvbGVkLmMKaW5kZXggMTQ1OTAzMy4uMWJmNzkwMyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2xlZC5jCisrKyBiL25ldC9tYWM4MDIxMS9sZWQuYwpAQCAtOSw2ICs5LDcgQEAKIC8qIGp1c3QgZm9yIElGTkFNU0laICovCiAjaW5jbHVkZSA8bGludXgvaWYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAibGVkLmgiCiAKIHZvaWQgaWVlZTgwMjExX2xlZF9yeChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tYWluLmMgYi9uZXQvbWFjODAyMTEvbWFpbi5jCmluZGV4IGNhZTQ0MzUuLjI0Y2M1MGIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tYWluLmMKKysrIGIvbmV0L21hYzgwMjExL21haW4uYwpAQCAtOTIsMTggKzkyLDIwIEBACiAJaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIobG9jYWwpOwogfQogCi0vKgotICogUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBsb2dpY2FsbHkgY29uZmlndXJlZCB0byBiZSBvbgotICogdGhlIG9wZXJhdGluZyBjaGFubmVsIEFORCB0aGUgaGFyZHdhcmUtY29uZiBpcyBjdXJyZW50bHkKLSAqIGNvbmZpZ3VyZWQgb24gdGhlIG9wZXJhdGluZyBjaGFubmVsLiAgQ29tcGFyZXMgY2hhbm5lbC10eXBlCi0gKiBhcyB3ZWxsLgotICovCi1ib29sIGllZWU4MDIxMV9jZmdfb25fb3Blcl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQoraW50IGllZWU4MDIxMV9od19jb25maWcoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHUzMiBjaGFuZ2VkKQogewotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwgKnNjYW5fY2hhbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisJaW50IHJldCA9IDA7CisJaW50IHBvd2VyOwogCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlOworCXUzMiBvZmZjaGFubmVsX2ZsYWc7CiAKLQkvKiBUaGlzIGxvZ2ljIG5lZWRzIHRvIG1hdGNoIGxvZ2ljIGluIGllZWU4MDIxMV9od19jb25maWcgKi8KKwltaWdodF9zbGVlcCgpOworCisJLyogSWYgdGhpcyBvZmYtY2hhbm5lbCBsb2dpYyBldmVyIGNoYW5nZXMsICBpZWVlODAyMTFfb25fb3Blcl9jaGFubmVsCisJICogbWF5IG5lZWQgdG8gY2hhbmdlIGFzIHdlbGwuCisJICovCisJb2ZmY2hhbm5lbF9mbGFnID0gbG9jYWwtPmh3LmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9PRkZDSEFOTkVMOwogCWlmIChsb2NhbC0+c2Nhbl9jaGFubmVsKSB7CiAJCWNoYW4gPSBsb2NhbC0+c2Nhbl9jaGFubmVsOwogCQkvKiBJZiBzY2FubmluZyBvbiBvcGVyIGNoYW5uZWwsIHVzZSB3aGF0ZXZlciBjaGFubmVsLXR5cGUKQEAgLTExNCw1MiArMTE2LDcgQEAKIAkJZWxzZQogCQkJY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX05PX0hUOwogCX0gZWxzZSBpZiAobG9jYWwtPnRtcF9jaGFubmVsKSB7Ci0JCWNoYW4gPSBzY2FuX2NoYW4gPSBsb2NhbC0+dG1wX2NoYW5uZWw7Ci0JCWNoYW5uZWxfdHlwZSA9IGxvY2FsLT50bXBfY2hhbm5lbF90eXBlOwotCX0gZWxzZSB7Ci0JCWNoYW4gPSBsb2NhbC0+b3Blcl9jaGFubmVsOwotCQljaGFubmVsX3R5cGUgPSBsb2NhbC0+X29wZXJfY2hhbm5lbF90eXBlOwotCX0KLQotCWlmIChjaGFuICE9IGxvY2FsLT5vcGVyX2NoYW5uZWwgfHwKLQkgICAgY2hhbm5lbF90eXBlICE9IGxvY2FsLT5fb3Blcl9jaGFubmVsX3R5cGUpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIENoZWNrIGN1cnJlbnQgaGFyZHdhcmUtY29uZmlnIGFnYWluc3Qgb3Blcl9jaGFubmVsLiAqLwotCWlmICgobG9jYWwtPm9wZXJfY2hhbm5lbCAhPSBsb2NhbC0+aHcuY29uZi5jaGFubmVsKSB8fAotCSAgICAobG9jYWwtPl9vcGVyX2NoYW5uZWxfdHlwZSAhPSBsb2NhbC0+aHcuY29uZi5jaGFubmVsX3R5cGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotaW50IGllZWU4MDIxMV9od19jb25maWcoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHUzMiBjaGFuZ2VkKQotewotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwgKnNjYW5fY2hhbjsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgcG93ZXI7Ci0JZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGU7Ci0JdTMyIG9mZmNoYW5uZWxfZmxhZzsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQlzY2FuX2NoYW4gPSBsb2NhbC0+c2Nhbl9jaGFubmVsOwotCi0JLyogSWYgdGhpcyBvZmYtY2hhbm5lbCBsb2dpYyBldmVyIGNoYW5nZXMsICBpZWVlODAyMTFfb25fb3Blcl9jaGFubmVsCi0JICogbWF5IG5lZWQgdG8gY2hhbmdlIGFzIHdlbGwuCi0JICovCi0Jb2ZmY2hhbm5lbF9mbGFnID0gbG9jYWwtPmh3LmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9PRkZDSEFOTkVMOwotCWlmIChzY2FuX2NoYW4pIHsKLQkJY2hhbiA9IHNjYW5fY2hhbjsKLQkJLyogSWYgc2Nhbm5pbmcgb24gb3BlciBjaGFubmVsLCB1c2Ugd2hhdGV2ZXIgY2hhbm5lbC10eXBlCi0JCSAqIGlzIGN1cnJlbnRseSBpbiB1c2UuCi0JCSAqLwotCQlpZiAoY2hhbiA9PSBsb2NhbC0+b3Blcl9jaGFubmVsKQotCQkJY2hhbm5lbF90eXBlID0gbG9jYWwtPl9vcGVyX2NoYW5uZWxfdHlwZTsKLQkJZWxzZQotCQkJY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX05PX0hUOwotCX0gZWxzZSBpZiAobG9jYWwtPnRtcF9jaGFubmVsKSB7Ci0JCWNoYW4gPSBzY2FuX2NoYW4gPSBsb2NhbC0+dG1wX2NoYW5uZWw7CisJCWNoYW4gPSBsb2NhbC0+dG1wX2NoYW5uZWw7CiAJCWNoYW5uZWxfdHlwZSA9IGxvY2FsLT50bXBfY2hhbm5lbF90eXBlOwogCX0gZWxzZSB7CiAJCWNoYW4gPSBsb2NhbC0+b3Blcl9jaGFubmVsOwpAQCAtNTYwLDYgKzUxNywxOSBAQAogCX0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgbWFjODAyMTFfaHRfY2FwYV9tb2RfbWFzayA9IHsKKwkuYW1wZHVfcGFyYW1zX2luZm8gPSBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1IgfAorCQkJICAgICBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZLAorCisJLmNhcF9pbmZvID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDAgfAorCQkJCUlFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVIHwKKwkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCksCisJLm1jcyA9IHsKKwkJLnJ4X21hc2sgPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCQkgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIH0sCisJfSwKK307CisKIHN0cnVjdCBpZWVlODAyMTFfaHcgKmllZWU4MDIxMV9hbGxvY19odyhzaXplX3QgcHJpdl9kYXRhX2xlbiwKIAkJCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgKm9wcykKIHsKQEAgLTU5NSw3ICs1NjUsMTIgQEAKIAogCXdpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX05FVE5TX09LIHwKIAkJCVdJUEhZX0ZMQUdfNEFERFJfQVAgfAotCQkJV0lQSFlfRkxBR180QUREUl9TVEFUSU9OOworCQkJV0lQSFlfRkxBR180QUREUl9TVEFUSU9OIHwKKwkJCVdJUEhZX0ZMQUdfUkVQT1JUU19PQlNTIHwKKwkJCVdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWCB8CisJCQlXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTDsKKworCXdpcGh5LT5mZWF0dXJlcyA9IE5MODAyMTFfRkVBVFVSRV9TS19UWF9TVEFUVVM7CiAKIAlpZiAoIW9wcy0+c2V0X2tleSkKIAkJd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfSUJTU19SU047CkBAIC02MDgsNyArNTgzLDcgQEAKIAogCWxvY2FsLT5ody5wcml2ID0gKGNoYXIgKilsb2NhbCArIEFMSUdOKHNpemVvZigqbG9jYWwpLCBORVRERVZfQUxJR04pOwogCi0JQlVHX09OKCFvcHMtPnR4KTsKKwlCVUdfT04oIW9wcy0+dHggJiYgIW9wcy0+dHhfZnJhZ3MpOwogCUJVR19PTighb3BzLT5zdGFydCk7CiAJQlVHX09OKCFvcHMtPnN0b3ApOwogCUJVR19PTighb3BzLT5jb25maWcpOwpAQCAtNjI4LDYgKzYwMyw3IEBACiAJbG9jYWwtPnVzZXJfcG93ZXJfbGV2ZWwgPSAtMTsKIAlsb2NhbC0+dWFwc2RfcXVldWVzID0gSUVFRTgwMjExX0RFRkFVTFRfVUFQU0RfUVVFVUVTOwogCWxvY2FsLT51YXBzZF9tYXhfc3BfbGVuID0gSUVFRTgwMjExX0RFRkFVTFRfTUFYX1NQX0xFTjsKKwl3aXBoeS0+aHRfY2FwYV9tb2RfbWFzayA9ICZtYWM4MDIxMV9odF9jYXBhX21vZF9tYXNrOwogCiAJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5pbnRlcmZhY2VzKTsKIApAQCAtNjcwLDYgKzY0NiwxMSBAQAogCUlOSVRfV09SSygmbG9jYWwtPnNjaGVkX3NjYW5fc3RvcHBlZF93b3JrLAogCQkgIGllZWU4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWRfd29yayk7CiAKKwlzcGluX2xvY2tfaW5pdCgmbG9jYWwtPmFja19zdGF0dXNfbG9jayk7CisJaWRyX2luaXQoJmxvY2FsLT5hY2tfc3RhdHVzX2ZyYW1lcyk7CisJLyogcHJlYWxsb2NhdGUgYXQgbGVhc3Qgb25lIGVudHJ5ICovCisJaWRyX3ByZV9nZXQoJmxvY2FsLT5hY2tfc3RhdHVzX2ZyYW1lcywgR0ZQX0tFUk5FTCk7CisKIAlzdGFfaW5mb19pbml0KGxvY2FsKTsKIAogCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTUFYX1FVRVVFUzsgaSsrKSB7CkBAIC0xMDUxLDYgKzEwMzIsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcpOwogCitzdGF0aWMgaW50IGllZWU4MDIxMV9mcmVlX2Fja19mcmFtZShpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpCit7CisJV0FSTl9PTkNFKDEsICJIYXZlIHBlbmRpbmcgYWNrIGZyYW1lcyFcbiIpOworCWtmcmVlX3NrYihwKTsKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBpZWVlODAyMTFfZnJlZV9odyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKQEAgLTEwNjEsNiArMTA0OSwxMCBAQAogCWlmIChsb2NhbC0+d2lwaHlfY2lwaGVyc19hbGxvY2F0ZWQpCiAJCWtmcmVlKGxvY2FsLT5ody53aXBoeS0+Y2lwaGVyX3N1aXRlcyk7CiAKKwlpZHJfZm9yX2VhY2goJmxvY2FsLT5hY2tfc3RhdHVzX2ZyYW1lcywKKwkJICAgICBpZWVlODAyMTFfZnJlZV9hY2tfZnJhbWUsIE5VTEwpOworCWlkcl9kZXN0cm95KCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMpOworCiAJd2lwaHlfZnJlZShsb2NhbC0+aHcud2lwaHkpOwogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZnJlZV9odyk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5jIGIvbmV0L21hYzgwMjExL21lc2guYwppbmRleCBhNzA3OGZkLi5jNzA3YzhiIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmMKQEAgLTc2LDYgKzc2LDcgQEAKIGJvb2wgbWVzaF9tYXRjaGVzX2xvY2FsKHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICppZSwgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCiAJLyoKIAkgKiBBcyBzdXBwb3J0IGZvciBlYWNoIGZlYXR1cmUgaXMgYWRkZWQsIGNoZWNrIGZvciBtYXRjaGluZwpAQCAtODcsMTUgKzg4LDIzIEBACiAJICogICAtIE1EQSBlbmFibGVkCiAJICogLSBQb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgb24gZmMKIAkgKi8KLQlpZiAoaWZtc2gtPm1lc2hfaWRfbGVuID09IGllLT5tZXNoX2lkX2xlbiAmJgotCQltZW1jbXAoaWZtc2gtPm1lc2hfaWQsIGllLT5tZXNoX2lkLCBpZS0+bWVzaF9pZF9sZW4pID09IDAgJiYKLQkJKGlmbXNoLT5tZXNoX3BwX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfcHNlbCkgJiYKLQkJKGlmbXNoLT5tZXNoX3BtX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfcG1ldHJpYykgJiYKLQkJKGlmbXNoLT5tZXNoX2NjX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfY29uZ2VzdCkgJiYKLQkJKGlmbXNoLT5tZXNoX3NwX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfc3luY2gpICYmCi0JCShpZm1zaC0+bWVzaF9hdXRoX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfYXV0aCkpCi0JCXJldHVybiB0cnVlOworCWlmICghKGlmbXNoLT5tZXNoX2lkX2xlbiA9PSBpZS0+bWVzaF9pZF9sZW4gJiYKKwkgICAgIG1lbWNtcChpZm1zaC0+bWVzaF9pZCwgaWUtPm1lc2hfaWQsIGllLT5tZXNoX2lkX2xlbikgPT0gMCAmJgorCSAgICAgKGlmbXNoLT5tZXNoX3BwX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfcHNlbCkgJiYKKwkgICAgIChpZm1zaC0+bWVzaF9wbV9pZCA9PSBpZS0+bWVzaF9jb25maWctPm1lc2hjb25mX3BtZXRyaWMpICYmCisJICAgICAoaWZtc2gtPm1lc2hfY2NfaWQgPT0gaWUtPm1lc2hfY29uZmlnLT5tZXNoY29uZl9jb25nZXN0KSAmJgorCSAgICAgKGlmbXNoLT5tZXNoX3NwX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfc3luY2gpICYmCisJICAgICAoaWZtc2gtPm1lc2hfYXV0aF9pZCA9PSBpZS0+bWVzaF9jb25maWctPm1lc2hjb25mX2F1dGgpKSkKKwkJZ290byBtaXNtYXRjaDsKIAorCS8qIGRpc2FsbG93IHBlZXJpbmcgd2l0aCBtaXNtYXRjaGVkIGNoYW5uZWwgdHlwZXMgZm9yIG5vdyAqLworCWlmIChpZS0+aHRfaW5mb19lbGVtICYmCisJICAgIChsb2NhbC0+X29wZXJfY2hhbm5lbF90eXBlICE9CisJICAgICBpZWVlODAyMTFfaHRfaW5mb190b19jaGFubmVsX3R5cGUoaWUtPmh0X2luZm9fZWxlbSkpKQorCQlnb3RvIG1pc21hdGNoOworCisJcmV0dXJuIHRydWU7CittaXNtYXRjaDoKIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTM0MSw2ICszNTAsNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IG1lc2hfYWRkX2h0X2NhcF9pZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJdTggKnBvczsKKworCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+b3Blcl9jaGFubmVsLT5iYW5kXTsKKwlpZiAoIXNiYW5kLT5odF9jYXAuaHRfc3VwcG9ydGVkIHx8CisJICAgIGxvY2FsLT5fb3Blcl9jaGFubmVsX3R5cGUgPT0gTkw4MDIxMV9DSEFOX05PX0hUKQorCQlyZXR1cm4gMDsKKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IDIgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBvcyA9IHNrYl9wdXQoc2tiLCAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7CisJaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcChwb3MsICZzYmFuZC0+aHRfY2FwLCBzYmFuZC0+aHRfY2FwLmNhcCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1lc2hfYWRkX2h0X2luZm9faWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGxvY2FsLT5vcGVyX2NoYW5uZWw7CisJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUgPSBsb2NhbC0+X29wZXJfY2hhbm5lbF90eXBlOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0KKwkJCQlsb2NhbC0+aHcud2lwaHktPmJhbmRzW2NoYW5uZWwtPmJhbmRdOworCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnNiYW5kLT5odF9jYXA7CisJdTggKnBvczsKKworCWlmICghaHRfY2FwLT5odF9zdXBwb3J0ZWQgfHwgY2hhbm5lbF90eXBlID09IE5MODAyMTFfQ0hBTl9OT19IVCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpCisJCXJldHVybiAtRU5PTUVNOworCisJcG9zID0gc2tiX3B1dChza2IsIDIgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvKSk7CisJaWVlZTgwMjExX2llX2J1aWxkX2h0X2luZm8ocG9zLCBodF9jYXAsIGNoYW5uZWwsIGNoYW5uZWxfdHlwZSk7CisKKwlyZXR1cm4gMDsKK30KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9tZXNoX3BhdGhfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KQEAgLTY5Nyw2ICs3NDksNyBAQAogCWF0b21pY19zZXQoJmlmbXNoLT5tcGF0aHMsIDApOwogCW1lc2hfcm1jX2luaXQoc2RhdGEpOwogCWlmbXNoLT5sYXN0X3ByZXEgPSBqaWZmaWVzOworCWlmbXNoLT5uZXh0X3BlcnIgPSBqaWZmaWVzOwogCS8qIEFsbG9jYXRlIGFsbCBtZXNoIHN0cnVjdHVyZXMgd2hlbiBjcmVhdGluZyB0aGUgZmlyc3QgbWVzaCBpbnRlcmZhY2UuICovCiAJaWYgKCFtZXNoX2FsbG9jYXRlZCkKIAkJaWVlZTgwMjExc19pbml0KCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5oIGIvbmV0L21hYzgwMjExL21lc2guaAppbmRleCA4YzAwZTJkLi5iZDE0YmQyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5oCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmgKQEAgLTMxLDYgKzMxLDggQEAKICAqIEBNRVNIX1BBVEhfRklYRUQ6IHRoZSBtZXNoIHBhdGggaGFzIGJlZW4gbWFudWFsbHkgc2V0IGFuZCBzaG91bGQgbm90IGJlCiAgKiAJbW9kaWZpZWQKICAqIEBNRVNIX1BBVEhfUkVTT0xWRUQ6IHRoZSBtZXNoIHBhdGggY2FuIGhhcyBiZWVuIHJlc29sdmVkCisgKiBATUVTSF9QQVRIX1JFUV9RVUVVRUQ6IHRoZXJlIGlzIGFuIHVuc2VudCBwYXRoIHJlcXVlc3QgZm9yIHRoaXMgZGVzdGluYXRpb24KKyAqIGFscmVhZHkgcXVldWVkIHVwLCB3YWl0aW5nIGZvciB0aGUgZGlzY292ZXJ5IHByb2Nlc3MgdG8gc3RhcnQuCiAgKgogICogTUVTSF9QQVRIX1JFU09MVkVEIGlzIHVzZWQgYnkgdGhlIG1lc2ggcGF0aCB0aW1lciB0bwogICogZGVjaWRlIHdoZW4gdG8gc3RvcCBvciBjYW5jZWwgdGhlIG1lc2ggcGF0aCBkaXNjb3ZlcnkuCkBAIC00MSw2ICs0Myw3IEBACiAJTUVTSF9QQVRIX1NOX1ZBTElEID0JQklUKDIpLAogCU1FU0hfUEFUSF9GSVhFRAk9CUJJVCgzKSwKIAlNRVNIX1BBVEhfUkVTT0xWRUQgPQlCSVQoNCksCisJTUVTSF9QQVRIX1JFUV9RVUVVRUQgPQlCSVQoNSksCiB9OwogCiAvKioKQEAgLTIxMiw2ICsyMTUsMTAgQEAKIAkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIGludCBtZXNoX2FkZF9kc19wYXJhbXNfaWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOworaW50IG1lc2hfYWRkX2h0X2NhcF9pZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOworaW50IG1lc2hfYWRkX2h0X2luZm9faWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIHZvaWQgbWVzaF9ybWNfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiBpbnQgbWVzaF9ybWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiB2b2lkIGllZWU4MDIxMXNfaW5pdCh2b2lkKTsKQEAgLTIyNiw2ICsyMzMsOCBAQAogLyogTWVzaCBwYXRocyAqLwogaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOworaW50IG1lc2hfbmV4dGhvcF9yZXNvbHZlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBtZXNoX3BhdGhfc3RhcnRfZGlzY292ZXJ5KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIHN0cnVjdCBtZXNoX3BhdGggKm1lc2hfcGF0aF9sb29rdXAodTggKmRzdCwKIAkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jIGIvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCmluZGV4IDE3NDA0MGEuLjczYWJiNzUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKQEAgLTExMywyMCArMTEzLDIwIEBACiAJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIDQwMCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdTggKnBvczsKLQlpbnQgaWVfbGVuOworCXU4ICpwb3MsIGllX2xlbjsKKwlpbnQgaGRyX2xlbiA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hY3Rpb24udS5tZXNoX2FjdGlvbikgKworCQkgICAgICBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5tZXNoX2FjdGlvbik7CiAKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArCisJCQkgICAgaGRyX2xlbiArCisJCQkgICAgMiArIDM3KTsgLyogbWF4IEhXTVAgSUUgKi8KIAlpZiAoIXNrYikKIAkJcmV0dXJuIC0xOwogCXNrYl9yZXNlcnZlKHNrYiwgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKLQkvKiAyNSBpcyB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uIG1nbXQgcGFydCAoMjQpIHBsdXMgdGhlIHNpemUgb2YgdGhlCi0JICogY29tbW9uIGFjdGlvbiBwYXJ0ICgxKQotCSAqLwotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopCi0JCXNrYl9wdXQoc2tiLCAyNSArIHNpemVvZihtZ210LT51LmFjdGlvbi51Lm1lc2hfYWN0aW9uKSk7Ci0JbWVtc2V0KG1nbXQsIDAsIDI1ICsgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUubWVzaF9hY3Rpb24pKTsKKwltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2JfcHV0KHNrYiwgaGRyX2xlbik7CisJbWVtc2V0KG1nbXQsIDAsIGhkcl9sZW4pOwogCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CiAJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CiAKQEAgLTI0MCwyMCArMjQwLDI0IEBACiAJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKyA0MDApOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOwogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQl1OCAqcG9zOwotCWludCBpZV9sZW47CisJdTggKnBvcywgaWVfbGVuOworCWludCBoZHJfbGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFjdGlvbi51Lm1lc2hfYWN0aW9uKSArCisJCSAgICAgIHNpemVvZihtZ210LT51LmFjdGlvbi51Lm1lc2hfYWN0aW9uKTsKIAorCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBpZm1zaC0+bmV4dF9wZXJyKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArCisJCQkgICAgaGRyX2xlbiArCisJCQkgICAgMiArIDE1IC8qIFBFUlIgSUUgKi8pOwogCWlmICghc2tiKQogCQlyZXR1cm4gLTE7CiAJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+dHhfaGVhZHJvb20gKyBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOwotCS8qIDI1IGlzIHRoZSBzaXplIG9mIHRoZSBjb21tb24gbWdtdCBwYXJ0ICgyNCkgcGx1cyB0aGUgc2l6ZSBvZiB0aGUKLQkgKiBjb21tb24gYWN0aW9uIHBhcnQgKDEpCi0JICovCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikKLQkJc2tiX3B1dChza2IsIDI1ICsgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUubWVzaF9hY3Rpb24pKTsKLQltZW1zZXQobWdtdCwgMCwgMjUgKyBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5tZXNoX2FjdGlvbikpOworCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYl9wdXQoc2tiLCBoZHJfbGVuKTsKKwltZW1zZXQobWdtdCwgMCwgaGRyX2xlbik7CiAJbWdtdC0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKIAkJCQkJICBJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKIApAQCAtMjkwLDYgKzI5NCw4IEBACiAKIAkvKiBzZWUgbm90ZSBpbiBmdW5jdGlvbiBoZWFkZXIgKi8KIAlwcmVwYXJlX2ZyYW1lX2Zvcl9kZWZlcnJlZF90eChzZGF0YSwgc2tiKTsKKwlpZm1zaC0+bmV4dF9wZXJyID0gVFVfVE9fRVhQX1RJTUUoCisJCQkJICAgaWZtc2gtPm1zaGNmZy5kb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsKTsKIAlpZWVlODAyMTFfYWRkX3BlbmRpbmdfc2tiKGxvY2FsLCBza2IpOwogCXJldHVybiAwOwogfQpAQCAtMzkzLDE1ICszOTksMTMgQEAKIAkJb3JpZ19tZXRyaWMgPSBQUkVRX0lFX01FVFJJQyhod21wX2llKTsKIAkJYnJlYWs7CiAJY2FzZSBNUEFUSF9QUkVQOgotCQkvKiBPcmlnaW5hdG9yIGhlcmUgcmVmZXJzIHRvIHRoZSBNUCB0aGF0IHdhcyB0aGUgZGVzdGluYXRpb24gaW4KLQkJICogdGhlIFBhdGggUmVxdWVzdC4gVGhlIGRyYWZ0IHJlZmVycyB0byB0aGF0IE1QIGFzIHRoZQotCQkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzLCBldmVuIHRob3VnaCB1c3VhbGx5IGl0IGlzIHRoZSBvcmlnaW4gb2YKLQkJICogdGhlIFBSRVAgZnJhbWUuIFdlIGRpdmVydCBmcm9tIHRoZSBub21lbmNsYXR1cmUgaW4gdGhlIGRyYWZ0CisJCS8qIE9yaWdpbmF0b3IgaGVyZSByZWZlcnMgdG8gdGhlIE1QIHRoYXQgd2FzIHRoZSB0YXJnZXQgaW4gdGhlCisJCSAqIFBhdGggUmVxdWVzdC4gV2UgZGl2ZXJ0IGZyb20gdGhlIG5vbWVuY2xhdHVyZSBpbiB0aGUgZHJhZnQKIAkJICogc28gdGhhdCB3ZSBjYW4gZWFzaWx5IHVzZSBhIHNpbmdsZSBmdW5jdGlvbiB0byBnYXRoZXIgcGF0aAogCQkgKiBpbmZvcm1hdGlvbiBmcm9tIGJvdGggUFJFUSBhbmQgUFJFUCBmcmFtZXMuCiAJCSAqLwotCQlvcmlnX2FkZHIgPSBQUkVQX0lFX09SSUdfQUREUihod21wX2llKTsKLQkJb3JpZ19zbiA9IFBSRVBfSUVfT1JJR19TTihod21wX2llKTsKKwkJb3JpZ19hZGRyID0gUFJFUF9JRV9UQVJHRVRfQUREUihod21wX2llKTsKKwkJb3JpZ19zbiA9IFBSRVBfSUVfVEFSR0VUX1NOKGh3bXBfaWUpOwogCQlvcmlnX2xpZmV0aW1lID0gUFJFUF9JRV9MSUZFVElNRShod21wX2llKTsKIAkJb3JpZ19tZXRyaWMgPSBQUkVQX0lFX01FVFJJQyhod21wX2llKTsKIAkJYnJlYWs7CkBAIC01NjIsOSArNTY2LDkgQEAKIAkJdHRsID0gaWZtc2gtPm1zaGNmZy5lbGVtZW50X3R0bDsKIAkJaWYgKHR0bCAhPSAwKSB7CiAJCQltaHdtcF9kYmcoInJlcGx5aW5nIHRvIHRoZSBQUkVRIik7Ci0JCQltZXNoX3BhdGhfc2VsX2ZyYW1lX3R4KE1QQVRIX1BSRVAsIDAsIHRhcmdldF9hZGRyLAotCQkJCWNwdV90b19sZTMyKHRhcmdldF9zbiksIDAsIG9yaWdfYWRkciwKLQkJCQljcHVfdG9fbGUzMihvcmlnX3NuKSwgbWdtdC0+c2EsIDAsIHR0bCwKKwkJCW1lc2hfcGF0aF9zZWxfZnJhbWVfdHgoTVBBVEhfUFJFUCwgMCwgb3JpZ19hZGRyLAorCQkJCWNwdV90b19sZTMyKG9yaWdfc24pLCAwLCB0YXJnZXRfYWRkciwKKwkJCQljcHVfdG9fbGUzMih0YXJnZXRfc24pLCBtZ210LT5zYSwgMCwgdHRsLAogCQkJCWNwdV90b19sZTMyKGxpZmV0aW1lKSwgY3B1X3RvX2xlMzIobWV0cmljKSwKIAkJCQkwLCBzZGF0YSk7CiAJCX0gZWxzZQpAQCAtNjE4LDE0ICs2MjIsOCBAQAogCiAJbWh3bXBfZGJnKCJyZWNlaXZlZCBQUkVQIGZyb20gJXBNIiwgUFJFUF9JRV9PUklHX0FERFIocHJlcF9lbGVtKSk7CiAKLQkvKiBOb3RlIHRoYXQgd2UgZGl2ZXJ0IGZyb20gdGhlIGRyYWZ0IG5vbWVuY2xhdHVyZSBhbmQgZGVub21pbmF0ZQotCSAqIGRlc3RpbmF0aW9uIHRvIHdoYXQgdGhlIGRyYWZ0IHJlZmVycyB0byBhcyBvcmlnaW5pbmF0b3IuIFNvIGluIHRoaXMKLQkgKiBmdW5jdGlvbiBkZXN0bmF0aW9uIHJlZmVycyB0byB0aGUgZmluYWwgZGVzdGluYXRpb24gb2YgdGhlIFBSRVAsCi0JICogd2hpY2ggY29ycmVzcG9uZHMgd2l0aCB0aGUgb3JpZ2luYXRvciBvZiB0aGUgUFJFUSB3aGljaCB0aGlzIFBSRVAKLQkgKiByZXBsaWVzCi0JICovCi0JdGFyZ2V0X2FkZHIgPSBQUkVQX0lFX1RBUkdFVF9BRERSKHByZXBfZWxlbSk7Ci0JaWYgKG1lbWNtcCh0YXJnZXRfYWRkciwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTikgPT0gMCkKKwlvcmlnX2FkZHIgPSBQUkVQX0lFX09SSUdfQUREUihwcmVwX2VsZW0pOworCWlmIChtZW1jbXAob3JpZ19hZGRyLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKSA9PSAwKQogCQkvKiBkZXN0aW5hdGlvbiwgbm8gZm9yd2FyZGluZyByZXF1aXJlZCAqLwogCQlyZXR1cm47CiAKQEAgLTYzNiw3ICs2MzQsNyBAQAogCX0KIAogCXJjdV9yZWFkX2xvY2soKTsKLQltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGFyZ2V0X2FkZHIsIHNkYXRhKTsKKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAob3JpZ19hZGRyLCBzZGF0YSk7CiAJaWYgKG1wYXRoKQogCQlzcGluX2xvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKIAllbHNlCkBAIC02NTEsNyArNjQ5LDcgQEAKIAlmbGFncyA9IFBSRVBfSUVfRkxBR1MocHJlcF9lbGVtKTsKIAlsaWZldGltZSA9IFBSRVBfSUVfTElGRVRJTUUocHJlcF9lbGVtKTsKIAlob3Bjb3VudCA9IFBSRVBfSUVfSE9QQ09VTlQocHJlcF9lbGVtKSArIDE7Ci0Jb3JpZ19hZGRyID0gUFJFUF9JRV9PUklHX0FERFIocHJlcF9lbGVtKTsKKwl0YXJnZXRfYWRkciA9IFBSRVBfSUVfVEFSR0VUX0FERFIocHJlcF9lbGVtKTsKIAl0YXJnZXRfc24gPSBQUkVQX0lFX1RBUkdFVF9TTihwcmVwX2VsZW0pOwogCW9yaWdfc24gPSBQUkVQX0lFX09SSUdfU04ocHJlcF9lbGVtKTsKIApAQCAtODY3LDkgKzg2NSwyMCBAQAogCQlyZXR1cm47CiAJfQogCisJc3Bpbl9sb2NrKCZtcGF0aC0+c3RhdGVfbG9jayk7CisJaWYgKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9SRVFfUVVFVUVEKSB7CisJCXNwaW5fdW5sb2NrKCZtcGF0aC0+c3RhdGVfbG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZpZm1zaC0+bWVzaF9wcmVxX3F1ZXVlX2xvY2spOworCQlrZnJlZShwcmVxX25vZGUpOworCQlyZXR1cm47CisJfQorCiAJbWVtY3B5KHByZXFfbm9kZS0+ZHN0LCBtcGF0aC0+ZHN0LCBFVEhfQUxFTik7CiAJcHJlcV9ub2RlLT5mbGFncyA9IGZsYWdzOwogCisJbXBhdGgtPmZsYWdzIHw9IE1FU0hfUEFUSF9SRVFfUVVFVUVEOworCXNwaW5fdW5sb2NrKCZtcGF0aC0+c3RhdGVfbG9jayk7CisKIAlsaXN0X2FkZF90YWlsKCZwcmVxX25vZGUtPmxpc3QsICZpZm1zaC0+cHJlcV9xdWV1ZS5saXN0KTsKIAkrK2lmbXNoLT5wcmVxX3F1ZXVlX2xlbjsKIAlzcGluX3VubG9ja19iaCgmaWZtc2gtPm1lc2hfcHJlcV9xdWV1ZV9sb2NrKTsKQEAgLTkyMSw2ICs5MzAsNyBAQAogCQlnb3RvIGVuZGRpc2NvdmVyeTsKIAogCXNwaW5fbG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOworCW1wYXRoLT5mbGFncyAmPSB+TUVTSF9QQVRIX1JFUV9RVUVVRUQ7CiAJaWYgKHByZXFfbm9kZS0+ZmxhZ3MgJiBQUkVRX1FfRl9TVEFSVCkgewogCQlpZiAobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFU09MVklORykgewogCQkJc3Bpbl91bmxvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKQEAgLTk3Miw3MSArOTgyLDk3IEBACiAJa2ZyZWUocHJlcV9ub2RlKTsKIH0KIAotLyoqCi0gKiBtZXNoX25leHRob3BfbG9va3VwIC0gcHV0IHRoZSBhcHByb3ByaWF0ZSBuZXh0IGhvcCBvbiBhIG1lc2ggZnJhbWUKKy8qIG1lc2hfbmV4dGhvcF9yZXNvbHZlIC0gbG9va3VwIG5leHQgaG9wIGZvciBnaXZlbiBza2IgYW5kIHN0YXJ0IHBhdGgKKyAqIGRpc2NvdmVyeSBpZiBubyBmb3J3YXJkaW5nIGluZm9ybWF0aW9uIGlzIGZvdW5kLgogICoKICAqIEBza2I6IDgwMi4xMSBmcmFtZSB0byBiZSBzZW50CiAgKiBAc2RhdGE6IG5ldHdvcmsgc3ViaWYgdGhlIGZyYW1lIHdpbGwgYmUgc2VudCB0aHJvdWdoCiAgKgotICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kLiBOb256ZXJvIG90aGVyd2lzZS4gSWYgbm8gbmV4dCBob3AgaXMKLSAqIGZvdW5kLCB0aGUgZnVuY3Rpb24gd2lsbCBzdGFydCBhIHBhdGggZGlzY292ZXJ5IGFuZCBxdWV1ZSB0aGUgZnJhbWUgc28gaXQgaXMKLSAqIHNlbnQgd2hlbiB0aGUgcGF0aCBpcyByZXNvbHZlZC4gVGhpcyBtZWFucyB0aGUgY2FsbGVyIG11c3Qgbm90IGZyZWUgdGhlIHNrYgotICogaW4gdGhpcyBjYXNlLgorICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kIGFuZCAtRU5PRU5UIGlmIHRoZSBmcmFtZSB3YXMgcXVldWVkLgorICogc2tiIGlzIGZyZWVlZCBoZXJlIGlmIG5vIG1wYXRoIGNvdWxkIGJlIGFsbG9jYXRlZC4KICAqLwotaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoraW50IG1lc2hfbmV4dGhvcF9yZXNvbHZlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYl90b19mcmVlID0gTlVMTDsKLQlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKm5leHRfaG9wOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3RvX2ZyZWUgPSBOVUxMOwogCXU4ICp0YXJnZXRfYWRkciA9IGhkci0+YWRkcjM7CiAJaW50IGVyciA9IDA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKHRhcmdldF9hZGRyLCBzZGF0YSk7CisJZXJyID0gbWVzaF9uZXh0aG9wX2xvb2t1cChza2IsIHNkYXRhKTsKKwlpZiAoIWVycikKKwkJZ290byBlbmRsb29rdXA7CiAKKwkvKiBubyBuZXh0aG9wIGZvdW5kLCBzdGFydCByZXNvbHZpbmcgKi8KKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGFyZ2V0X2FkZHIsIHNkYXRhKTsKIAlpZiAoIW1wYXRoKSB7CiAJCW1lc2hfcGF0aF9hZGQodGFyZ2V0X2FkZHIsIHNkYXRhKTsKIAkJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKHRhcmdldF9hZGRyLCBzZGF0YSk7CiAJCWlmICghbXBhdGgpIHsKLQkJCXNkYXRhLT51Lm1lc2gubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfbm9fcm91dGUrKzsKKwkJCW1lc2hfcGF0aF9kaXNjYXJkX2ZyYW1lKHNrYiwgc2RhdGEpOwogCQkJZXJyID0gLUVOT1NQQzsKIAkJCWdvdG8gZW5kbG9va3VwOwogCQl9CiAJfQogCi0JaWYgKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9BQ1RJVkUpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKLQkJCSAgICAgICBtcGF0aC0+ZXhwX3RpbWUgLQotCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoc2RhdGEtPnUubWVzaC5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUpKSAmJgotCQkgICAgIW1lbWNtcChzZGF0YS0+dmlmLmFkZHIsIGhkci0+YWRkcjQsIEVUSF9BTEVOKSAmJgotCQkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfUkVTT0xWSU5HKSAmJgotCQkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpKSB7Ci0JCQltZXNoX3F1ZXVlX3ByZXEobXBhdGgsCi0JCQkJCVBSRVFfUV9GX1NUQVJUIHwgUFJFUV9RX0ZfUkVGUkVTSCk7Ci0JCX0KLQkJbmV4dF9ob3AgPSByY3VfZGVyZWZlcmVuY2UobXBhdGgtPm5leHRfaG9wKTsKLQkJaWYgKG5leHRfaG9wKQotCQkJbWVtY3B5KGhkci0+YWRkcjEsIG5leHRfaG9wLT5zdGEuYWRkciwgRVRIX0FMRU4pOwotCQllbHNlCi0JCQllcnIgPSAtRU5PRU5UOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQkJaWYgKCEobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFU09MVklORykpIHsKLQkJCS8qIFN0YXJ0IGRpc2NvdmVyeSBvbmx5IGlmIGl0IGlzIG5vdCBydW5uaW5nIHlldCAqLwotCQkJbWVzaF9xdWV1ZV9wcmVxKG1wYXRoLCBQUkVRX1FfRl9TVEFSVCk7Ci0JCX0KKwlpZiAoIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfUkVTT0xWSU5HKSkKKwkJbWVzaF9xdWV1ZV9wcmVxKG1wYXRoLCBQUkVRX1FfRl9TVEFSVCk7CiAKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJm1wYXRoLT5mcmFtZV9xdWV1ZSkgPj0KLQkJCQlNRVNIX0ZSQU1FX1FVRVVFX0xFTikKLQkJCXNrYl90b19mcmVlID0gc2tiX2RlcXVldWUoJm1wYXRoLT5mcmFtZV9xdWV1ZSk7CisJaWYgKHNrYl9xdWV1ZV9sZW4oJm1wYXRoLT5mcmFtZV9xdWV1ZSkgPj0gTUVTSF9GUkFNRV9RVUVVRV9MRU4pCisJCXNrYl90b19mcmVlID0gc2tiX2RlcXVldWUoJm1wYXRoLT5mcmFtZV9xdWV1ZSk7CiAKLQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0lOVEZMX05FRURfVFhQUk9DRVNTSU5HOwotCQlza2JfcXVldWVfdGFpbCgmbXBhdGgtPmZyYW1lX3F1ZXVlLCBza2IpOwotCQlpZiAoc2tiX3RvX2ZyZWUpCi0JCQltZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShza2JfdG9fZnJlZSwgc2RhdGEpOwotCQllcnIgPSAtRU5PRU5UOworCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9JTlRGTF9ORUVEX1RYUFJPQ0VTU0lORzsKKwlpZWVlODAyMTFfc2V0X3Fvc19oZHIoc2RhdGEsIHNrYik7CisJc2tiX3F1ZXVlX3RhaWwoJm1wYXRoLT5mcmFtZV9xdWV1ZSwgc2tiKTsKKwllcnIgPSAtRU5PRU5UOworCWlmIChza2JfdG9fZnJlZSkKKwkJbWVzaF9wYXRoX2Rpc2NhcmRfZnJhbWUoc2tiX3RvX2ZyZWUsIHNkYXRhKTsKKworZW5kbG9va3VwOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBlcnI7Cit9CisvKioKKyAqIG1lc2hfbmV4dGhvcF9sb29rdXAgLSBwdXQgdGhlIGFwcHJvcHJpYXRlIG5leHQgaG9wIG9uIGEgbWVzaCBmcmFtZS4gQ2FsbGluZworICogdGhpcyBmdW5jdGlvbiBpcyBjb25zaWRlcmVkICJ1c2luZyIgdGhlIGFzc29jaWF0ZWQgbXBhdGgsIHNvIHByZWVtcHQgYSBwYXRoCisgKiByZWZyZXNoIGlmIHRoaXMgbXBhdGggZXhwaXJlcyBzb29uLgorICoKKyAqIEBza2I6IDgwMi4xMSBmcmFtZSB0byBiZSBzZW50CisgKiBAc2RhdGE6IG5ldHdvcmsgc3ViaWYgdGhlIGZyYW1lIHdpbGwgYmUgc2VudCB0aHJvdWdoCisgKgorICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kLiBOb256ZXJvIG90aGVyd2lzZS4KKyAqLworaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN0cnVjdCBtZXNoX3BhdGggKm1wYXRoOworCXN0cnVjdCBzdGFfaW5mbyAqbmV4dF9ob3A7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJdTggKnRhcmdldF9hZGRyID0gaGRyLT5hZGRyMzsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGFyZ2V0X2FkZHIsIHNkYXRhKTsKKworCWlmICghbXBhdGggfHwgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfQUNUSVZFKSkKKwkJZ290byBlbmRsb29rdXA7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkgICAgICAgbXBhdGgtPmV4cF90aW1lIC0KKwkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoc2RhdGEtPnUubWVzaC5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUpKSAmJgorCSAgICAhbWVtY21wKHNkYXRhLT52aWYuYWRkciwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pICYmCisJICAgICEobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFU09MVklORykgJiYKKwkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpKQorCQltZXNoX3F1ZXVlX3ByZXEobXBhdGgsIFBSRVFfUV9GX1NUQVJUIHwgUFJFUV9RX0ZfUkVGUkVTSCk7CisKKwluZXh0X2hvcCA9IHJjdV9kZXJlZmVyZW5jZShtcGF0aC0+bmV4dF9ob3ApOworCWlmIChuZXh0X2hvcCkgeworCQltZW1jcHkoaGRyLT5hZGRyMSwgbmV4dF9ob3AtPnN0YS5hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweShoZHItPmFkZHIyLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKKwkJZXJyID0gMDsKIAl9CiAKIGVuZGxvb2t1cDoKQEAgLTEwNjEsNiArMTA5Nyw3IEBACiAJfSBlbHNlIGlmIChtcGF0aC0+ZGlzY292ZXJ5X3JldHJpZXMgPCBtYXhfcHJlcV9yZXRyaWVzKHNkYXRhKSkgewogCQkrK21wYXRoLT5kaXNjb3ZlcnlfcmV0cmllczsKIAkJbXBhdGgtPmRpc2NvdmVyeV90aW1lb3V0ICo9IDI7CisJCW1wYXRoLT5mbGFncyAmPSB+TUVTSF9QQVRIX1JFUV9RVUVVRUQ7CiAJCXNwaW5fdW5sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJCW1lc2hfcXVldWVfcHJlcShtcGF0aCwgMCk7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYyBiL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYwppbmRleCA3ZjU0YzUwLi5lZGYxNjdlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCkBAIC02OSw4ICs2OSw2IEBACiAJCWxvY2tkZXBfaXNfaGVsZCgmcGF0aHRibF9yZXNpemVfbG9jaykpOwogfQogCi1zdGF0aWMgaW50IG1lc2hfZ2F0ZV9hZGQoc3RydWN0IG1lc2hfdGFibGUgKnRibCwgc3RydWN0IG1lc2hfcGF0aCAqbXBhdGgpOwotCiAvKgogICogQ0FSRUZVTCAtLSAidGJsIiBtdXN0IG5vdCBiZSBhbiBleHByZXNzaW9uLAogICogaW4gcGFydGljdWxhciBub3QgYW4gcmN1X2RlcmVmZXJlbmNlKCksIHNpbmNlCkBAIC0yMTMsNyArMjExLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXN0cnVjdCBza19idWZmX2hlYWQgdG1wcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gbXBhdGgtPnNkYXRhOwogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKG1wYXRoLT5uZXh0X2hvcCwgc3RhKTsKIApAQCAtMjI0LDggKzIyMSw3IEBACiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZtcGF0aC0+ZnJhbWVfcXVldWUpKSAhPSBOVUxMKSB7CiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJCW1lbWNweShoZHItPmFkZHIxLCBzdGEtPnN0YS5hZGRyLCBFVEhfQUxFTik7Ci0JCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIGllZWU4MDIxMV9zZWxlY3RfcXVldWUoc2RhdGEsIHNrYikpOwotCQlpZWVlODAyMTFfc2V0X3Fvc19oZHIoc2RhdGEsIHNrYik7CisJCW1lbWNweShoZHItPmFkZHIyLCBtcGF0aC0+c2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CiAJCV9fc2tiX3F1ZXVlX3RhaWwoJnRtcHEsIHNrYik7CiAJfQogCkBAIC0yNjksNiArMjY1LDcgQEAKIAluZXh0X2hvcCA9IHJjdV9kZXJlZmVyZW5jZShnYXRlX21wYXRoLT5uZXh0X2hvcCktPnN0YS5hZGRyOwogCW1lbWNweShoZHItPmFkZHIxLCBuZXh0X2hvcCwgRVRIX0FMRU4pOwogCXJjdV9yZWFkX3VubG9jaygpOworCW1lbWNweShoZHItPmFkZHIyLCBnYXRlX21wYXRoLT5zZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKIAltZW1jcHkoaGRyLT5hZGRyMywgZHN0X2FkZHIsIEVUSF9BTEVOKTsKIH0KIApAQCAtNDIzLDIxICs0MjAsMTggQEAKIH0KIAogLyoqCi0gKiBtZXNoX2dhdGVfYWRkIC0gbWFyayBtcGF0aCBhcyBwYXRoIHRvIGEgbWVzaCBnYXRlIGFuZCBhZGQgdG8ga25vd25fZ2F0ZXMKLSAqIEBtZXNoX3RibDogdGFibGUgd2hpY2ggY29udGFpbnMga25vd25fZ2F0ZXMgbGlzdAotICogQG1wYXRoOiBtcGF0aCB0byBrbm93biBtZXNoIGdhdGUKLSAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MKLSAqCisgKiBtZXNoX3BhdGhfYWRkX2dhdGUgLSBhZGQgdGhlIGdpdmVuIG1wYXRoIHRvIGEgbWVzaCBnYXRlIHRvIG91ciBwYXRoIHRhYmxlCisgKiBAbXBhdGg6IGdhdGUgcGF0aCB0byBhZGQgdG8gdGFibGUKICAqLwotc3RhdGljIGludCBtZXNoX2dhdGVfYWRkKHN0cnVjdCBtZXNoX3RhYmxlICp0YmwsIHN0cnVjdCBtZXNoX3BhdGggKm1wYXRoKQoraW50IG1lc2hfcGF0aF9hZGRfZ2F0ZShzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aCkKIHsKKwlzdHJ1Y3QgbWVzaF90YWJsZSAqdGJsOwogCXN0cnVjdCBtcGF0aF9ub2RlICpnYXRlLCAqbmV3X2dhdGU7CiAJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJaW50IGVycjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQl0YmwgPSByY3VfZGVyZWZlcmVuY2UodGJsKTsKKwl0YmwgPSByY3VfZGVyZWZlcmVuY2UobWVzaF9wYXRocyk7CiAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ2F0ZSwgbiwgdGJsLT5rbm93bl9nYXRlcywgbGlzdCkKIAkJaWYgKGdhdGUtPm1wYXRoID09IG1wYXRoKSB7CkBAIC00ODEsOCArNDc1LDYgQEAKIAlzdHJ1Y3QgbXBhdGhfbm9kZSAqZ2F0ZTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcCwgKnE7CiAKLQl0YmwgPSByY3VfZGVyZWZlcmVuY2UodGJsKTsKLQogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZ2F0ZSwgcCwgcSwgdGJsLT5rbm93bl9nYXRlcywgbGlzdCkKIAkJaWYgKGdhdGUtPm1wYXRoID09IG1wYXRoKSB7CiAJCQlzcGluX2xvY2tfYmgoJnRibC0+Z2F0ZXNfbG9jayk7CkBAIC01MDEsMTYgKzQ5Myw2IEBACiB9CiAKIC8qKgotICoKLSAqIG1lc2hfcGF0aF9hZGRfZ2F0ZSAtIGFkZCB0aGUgZ2l2ZW4gbXBhdGggdG8gYSBtZXNoIGdhdGUgdG8gb3VyIHBhdGggdGFibGUKLSAqIEBtcGF0aDogZ2F0ZSBwYXRoIHRvIGFkZCB0byB0YWJsZQotICovCi1pbnQgbWVzaF9wYXRoX2FkZF9nYXRlKHN0cnVjdCBtZXNoX3BhdGggKm1wYXRoKQotewotCXJldHVybiBtZXNoX2dhdGVfYWRkKG1lc2hfcGF0aHMsIG1wYXRoKTsKLX0KLQotLyoqCiAgKiBtZXNoX2dhdGVfbnVtIC0gbnVtYmVyIG9mIGdhdGVzIGtub3duIHRvIHRoaXMgaW50ZXJmYWNlCiAgKiBAc2RhdGE6IHN1YmlmIGRhdGEKICAqLwpAQCAtOTkxLDM4ICs5NzMsMTEgQEAKICAqIEBza2I6IGZyYW1lIHRvIGRpc2NhcmQKICAqIEBzZGF0YTogbmV0d29yayBzdWJpZiB0aGUgZnJhbWUgd2FzIHRvIGJlIHNlbnQgdGhyb3VnaAogICoKLSAqIElmIHRoZSBmcmFtZSB3YXMgYmVpbmcgZm9yd2FyZGVkIGZyb20gYW5vdGhlciBNUCwgYSBQRVJSIGZyYW1lIHdpbGwgYmUgc2VudAotICogdG8gdGhlIHByZWN1cnNvci4gIFRoZSBwcmVjdXJzb3IncyBhZGRyZXNzIChpLmUuIHRoZSBwcmV2aW91cyBob3ApIHdhcyBzYXZlZAotICogaW4gYWRkcjEgb2YgdGhlIGZyYW1lLXRvLWJlLWZvcndhcmRlZCwgYW5kIHdvdWxkIG9ubHkgYmUgb3ZlcndyaXR0ZW4gb25jZQotICogdGhlIGRlc3RpbmF0aW9uIGlzIHN1Y2Nlc3NmdWxseSByZXNvbHZlZC4KLSAqCiAgKiBMb2NraW5nOiB0aGUgZnVuY3Rpb24gbXVzdCBtZSBjYWxsZWQgd2l0aGluIGEgcmN1X3JlYWRfbG9jayByZWdpb24KICAqLwogdm9pZCBtZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKLQl1MzIgc24gPSAwOwotCV9fbGUxNiByZWFzb24gPSBjcHVfdG9fbGUxNihXTEFOX1JFQVNPTl9NRVNIX1BBVEhfTk9GT1JXQVJEKTsKLQotCWlmIChtZW1jbXAoaGRyLT5hZGRyNCwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTikgIT0gMCkgewotCQl1OCAqcmEsICpkYTsKLQotCQlkYSA9IGhkci0+YWRkcjM7Ci0JCXJhID0gaGRyLT5hZGRyMTsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAoZGEsIHNkYXRhKTsKLQkJaWYgKG1wYXRoKSB7Ci0JCQlzcGluX2xvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKLQkJCXNuID0gKyttcGF0aC0+c247Ci0JCQlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwotCQl9Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQltZXNoX3BhdGhfZXJyb3JfdHgoc2RhdGEtPnUubWVzaC5tc2hjZmcuZWxlbWVudF90dGwsIHNrYi0+ZGF0YSwKLQkJCQkgICBjcHVfdG9fbGUzMihzbiksIHJlYXNvbiwgcmEsIHNkYXRhKTsKLQl9Ci0KIAlrZnJlZV9za2Ioc2tiKTsKIAlzZGF0YS0+dS5tZXNoLm1zaHN0YXRzLmRyb3BwZWRfZnJhbWVzX25vX3JvdXRlKys7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jIGIvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYwppbmRleCA3ZTU3ZjVkLi43MzE0MzcyYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jCkBAIC04MCwxMSArODAsMTUgQEAKICAqICAgICAgIG9uIGl0IGluIHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBzZWN0aW9uIQogICovCiBzdGF0aWMgc3RydWN0IHN0YV9pbmZvICptZXNoX3BsaW5rX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCQkgdTggKmh3X2FkZHIsIHUzMiByYXRlcykKKwkJCQkJIHU4ICpod19hZGRyLCB1MzIgcmF0ZXMsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyAqZWxlbXMpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAKKwlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPm9wZXJfY2hhbm5lbC0+YmFuZF07CisKIAlpZiAobG9jYWwtPm51bV9zdGEgPj0gTUVTSF9NQVhfUExJTktTKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtOTYsNiArMTAwLDEwIEBACiAJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSE9SSVpFRCk7CiAJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfV01FKTsKIAlzdGEtPnN0YS5zdXBwX3JhdGVzW2xvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmRdID0gcmF0ZXM7CisJaWYgKGVsZW1zLT5odF9jYXBfZWxlbSkKKwkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNkYXRhLCBzYmFuZCwKKwkJCQkJCSAgZWxlbXMtPmh0X2NhcF9lbGVtLAorCQkJCQkJICAmc3RhLT5zdGEuaHRfY2FwKTsKIAlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7CiAKIAlyZXR1cm4gc3RhOwpAQCAtMTUzLDIzICsxNjEsMzEgQEAKIAkJZW51bSBpZWVlODAyMTFfc2VsZl9wcm90ZWN0ZWRfYWN0aW9uY29kZSBhY3Rpb24sCiAJCXU4ICpkYSwgX19sZTE2IGxsaWQsIF9fbGUxNiBwbGlkLCBfX2xlMTYgcmVhc29uKSB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IobG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tICsgNDAwICsKLQkJCXNkYXRhLT51Lm1lc2guaWVfbGVuKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKIAlib29sIGluY2x1ZGVfcGxpZCA9IGZhbHNlOwotCWludCBpZV9sZW4gPSA0OwogCXUxNiBwZWVyaW5nX3Byb3RvID0gMDsKLQl1OCAqcG9zOworCXU4ICpwb3MsIGllX2xlbiA9IDQ7CisJaW50IGhkcl9sZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYWN0aW9uLnUuc2VsZl9wcm90KSArCisJCSAgICAgIHNpemVvZihtZ210LT51LmFjdGlvbi51LnNlbGZfcHJvdCk7CiAKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArCisJCQkgICAgaGRyX2xlbiArCisJCQkgICAgMiArIC8qIGNhcGFiaWxpdHkgaW5mbyAqLworCQkJICAgIDIgKyAvKiBBSUQgKi8KKwkJCSAgICAyICsgOCArIC8qIHN1cHBvcnRlZCByYXRlcyAqLworCQkJICAgIDIgKyAoSUVFRTgwMjExX01BWF9TVVBQX1JBVEVTIC0gOCkgKworCQkJICAgIDIgKyBzZGF0YS0+dS5tZXNoLm1lc2hfaWRfbGVuICsKKwkJCSAgICAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUpICsKKwkJCSAgICAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSArCisJCQkgICAgMiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8pICsKKwkJCSAgICAyICsgOCArIC8qIHBlZXJpbmcgSUUgKi8KKwkJCSAgICBzZGF0YS0+dS5tZXNoLmllX2xlbik7CiAJaWYgKCFza2IpCiAJCXJldHVybiAtMTsKIAlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7Ci0JLyogMjUgaXMgdGhlIHNpemUgb2YgdGhlIGNvbW1vbiBtZ210IHBhcnQgKDI0KSBwbHVzIHRoZSBzaXplIG9mIHRoZQotCSAqIGNvbW1vbiBhY3Rpb24gcGFydCAoMSkKLQkgKi8KLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKQotCQlza2JfcHV0KHNrYiwgMjUgKyBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5zZWxmX3Byb3QpKTsKLQltZW1zZXQobWdtdCwgMCwgMjUgKyBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5zZWxmX3Byb3QpKTsKKwltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2JfcHV0KHNrYiwgaGRyX2xlbik7CisJbWVtc2V0KG1nbXQsIDAsIGhkcl9sZW4pOwogCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CiAJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CiAJbWVtY3B5KG1nbXQtPmRhLCBkYSwgRVRIX0FMRU4pOwpAQCAtMjM1LDYgKzI1MSwxMyBAQAogCQltZW1jcHkocG9zLCAmcmVhc29uLCAyKTsKIAkJcG9zICs9IDI7CiAJfQorCisJaWYgKGFjdGlvbiAhPSBXTEFOX1NQX01FU0hfUEVFUklOR19DTE9TRSkgeworCQlpZiAobWVzaF9hZGRfaHRfY2FwX2llKHNrYiwgc2RhdGEpIHx8CisJCSAgICBtZXNoX2FkZF9odF9pbmZvX2llKHNrYiwgc2RhdGEpKQorCQkJcmV0dXJuIC0xOworCX0KKwogCWlmIChtZXNoX2FkZF92ZW5kb3JfaWVzKHNrYiwgc2RhdGEpKQogCQlyZXR1cm4gLTE7CiAKQEAgLTI2MSw3ICsyODQsNyBAQAogCQkJCQllbGVtcy0+aWVfc3RhcnQsIGVsZW1zLT50b3RhbF9sZW4sCiAJCQkJCUdGUF9LRVJORUwpOwogCQllbHNlCi0JCQlzdGEgPSBtZXNoX3BsaW5rX2FsbG9jKHNkYXRhLCBod19hZGRyLCByYXRlcyk7CisJCQlzdGEgPSBtZXNoX3BsaW5rX2FsbG9jKHNkYXRhLCBod19hZGRyLCByYXRlcywgZWxlbXMpOwogCQlpZiAoIXN0YSkKIAkJCXJldHVybjsKIAkJaWYgKHN0YV9pbmZvX2luc2VydF9yY3Uoc3RhKSkgewpAQCAtNTUyLDcgKzU3NSw3IEBACiAJCX0KIAogCQlyYXRlcyA9IGllZWU4MDIxMV9zdGFfZ2V0X3JhdGVzKGxvY2FsLCAmZWxlbXMsIHJ4X3N0YXR1cy0+YmFuZCk7Ci0JCXN0YSA9IG1lc2hfcGxpbmtfYWxsb2Moc2RhdGEsIG1nbXQtPnNhLCByYXRlcyk7CisJCXN0YSA9IG1lc2hfcGxpbmtfYWxsb2Moc2RhdGEsIG1nbXQtPnNhLCByYXRlcywgJmVsZW1zKTsKIAkJaWYgKCFzdGEpIHsKIAkJCW1wbF9kYmcoIk1lc2ggcGxpbmsgZXJyb3I6IHBsaW5rIHRhYmxlIGZ1bGxcbiIpOwogCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21sbWUuYyBiL25ldC9tYWM4MDIxMS9tbG1lLmMKaW5kZXggNDBkYjAxMS4uMDkwMTlkMSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21sbWUuYworKysgYi9uZXQvbWFjODAyMTEvbWxtZS5jCkBAIC0xNiwxMCArMTYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCkBAIC0yMDcsNiArMjA5LDcgQEAKIAkJY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX0hUMjA7CiAKIAkJaWYgKCEoYXBfaHRfY2FwX2ZsYWdzICYgSUVFRTgwMjExX0hUX0NBUF80ME1IWl9JTlRPTEVSQU5UKSAmJgorCQkgICAgIWllZWU4MDExMV9jZmdfb3ZlcnJpZGVfZGlzYWJsZXNfaHQ0MChzZGF0YSkgJiYKIAkJICAgIChzYmFuZC0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKSAmJgogCQkgICAgKGh0aS0+aHRfcGFyYW0gJiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBTl9XSURUSF9BTlkpKSB7CiAJCQlzd2l0Y2goaHRpLT5odF9wYXJhbSAmIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX09GRlNFVCkgewpAQCAtMTExOCw2ICsxMTIxLDggQEAKIAogCS8qIG9uIHRoZSBuZXh0IGFzc29jLCByZS1wcm9ncmFtIEhUIHBhcmFtZXRlcnMgKi8KIAlzZGF0YS0+aHRfb3Btb2RlX3ZhbGlkID0gZmFsc2U7CisJbWVtc2V0KCZpZm1nZC0+aHRfY2FwYSwgMCwgc2l6ZW9mKGlmbWdkLT5odF9jYXBhKSk7CisJbWVtc2V0KCZpZm1nZC0+aHRfY2FwYV9tYXNrLCAwLCBzaXplb2YoaWZtZ2QtPmh0X2NhcGFfbWFzaykpOwogCiAJbG9jYWwtPnBvd2VyX2NvbnN0cl9sZXZlbCA9IDA7CiAKQEAgLTEzNTcsOSArMTM2Miw2IEBACiAJaWVlZTgwMjExX3NldF9kaXNhc3NvYyhzZGF0YSwgdHJ1ZSwgdHJ1ZSk7CiAJbXV0ZXhfdW5sb2NrKCZpZm1nZC0+bXR4KTsKIAotCW11dGV4X2xvY2soJmxvY2FsLT5tdHgpOwotCWllZWU4MDIxMV9yZWNhbGNfaWRsZShsb2NhbCk7Ci0JbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAkvKgogCSAqIG11c3QgYmUgb3V0c2lkZSBsb2NrIGR1ZSB0byBjZmc4MDIxMSwKIAkgKiBidXQgdGhhdCdzIG5vdCBhIHByb2JsZW0uCkBAIC0xMzY4LDYgKzEzNzAsMTAgQEAKIAkJCQkgICAgICAgSUVFRTgwMjExX1NUWVBFX0RFQVVUSCwKIAkJCQkgICAgICAgV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFksCiAJCQkJICAgICAgIE5VTEwsIHRydWUpOworCisJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CisJaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKKwltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwogfQogCiB2b2lkIGllZWU4MDIxMV9iZWFjb25fY29ubmVjdGlvbl9sb3NzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMTQ2Niw2ICsxNDcyLDQ3IEBACiAJcmV0dXJuIFJYX01HTVRfQ0ZHODAyMTFfRElTQVNTT0M7CiB9CiAKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9nZXRfcmF0ZXMoc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkJdTggKnN1cHBfcmF0ZXMsIHVuc2lnbmVkIGludCBzdXBwX3JhdGVzX2xlbiwKKwkJCQl1MzIgKnJhdGVzLCB1MzIgKmJhc2ljX3JhdGVzLAorCQkJCWJvb2wgKmhhdmVfaGlnaGVyX3RoYW5fMTFtYml0LAorCQkJCWludCAqbWluX3JhdGUsIGludCAqbWluX3JhdGVfaW5kZXgpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3VwcF9yYXRlc19sZW47IGkrKykgeworCQlpbnQgcmF0ZSA9IChzdXBwX3JhdGVzW2ldICYgMHg3ZikgKiA1OworCQlib29sIGlzX2Jhc2ljID0gISEoc3VwcF9yYXRlc1tpXSAmIDB4ODApOworCisJCWlmIChyYXRlID4gMTEwKQorCQkJKmhhdmVfaGlnaGVyX3RoYW5fMTFtYml0ID0gdHJ1ZTsKKworCQkvKgorCQkgKiBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9IVF9QSFkgaXMgZGVmaW5lZCBpbiA4MDIuMTFuLTIwMDkKKwkJICogNy4zLjIuMiBhcyBhIG1hZ2ljIHZhbHVlIGluc3RlYWQgb2YgYSByYXRlLiBIZW5jZSwgc2tpcCBpdC4KKwkJICoKKwkJICogTm90ZTogRXZlbiB0aHJvdWdoIHRoZSBtZW1iZXJzaGlwIHNlbGVjdG9yIGFuZCB0aGUgYmFzaWMKKwkJICoJIHJhdGUgZmxhZyBzaGFyZSB0aGUgc2FtZSBiaXQsIHRoZXkgYXJlIG5vdCBleGFjdGx5CisJCSAqCSB0aGUgc2FtZS4KKwkJICovCisJCWlmICghIShzdXBwX3JhdGVzW2ldICYgMHg4MCkgJiYKKwkJICAgIChzdXBwX3JhdGVzW2ldICYgMHg3ZikgPT0gQlNTX01FTUJFUlNISVBfU0VMRUNUT1JfSFRfUEhZKQorCQkJY29udGludWU7CisKKwkJZm9yIChqID0gMDsgaiA8IHNiYW5kLT5uX2JpdHJhdGVzOyBqKyspIHsKKwkJCWlmIChzYmFuZC0+Yml0cmF0ZXNbal0uYml0cmF0ZSA9PSByYXRlKSB7CisJCQkJKnJhdGVzIHw9IEJJVChqKTsKKwkJCQlpZiAoaXNfYmFzaWMpCisJCQkJCSpiYXNpY19yYXRlcyB8PSBCSVQoaik7CisJCQkJaWYgKHJhdGUgPCAqbWluX3JhdGUpIHsKKwkJCQkJKm1pbl9yYXRlID0gcmF0ZTsKKwkJCQkJKm1pbl9yYXRlX2luZGV4ID0gajsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CiAKIHN0YXRpYyBib29sIGllZWU4MDIxMV9hc3NvY19zdWNjZXNzKHN0cnVjdCBpZWVlODAyMTFfd29yayAqd2ssCiAJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbikKQEAgLTE0ODIsNyArMTUyOSw3IEBACiAJc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgZWxlbXM7CiAJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmc2RhdGEtPnZpZi5ic3NfY29uZjsKIAl1MzIgY2hhbmdlZCA9IDA7Ci0JaW50IGksIGosIGVycjsKKwlpbnQgZXJyOwogCWJvb2wgaGF2ZV9oaWdoZXJfdGhhbl8xMW1iaXQgPSBmYWxzZTsKIAl1MTYgYXBfaHRfY2FwX2ZsYWdzOwogCWludCBtaW5fcmF0ZSA9IElOVF9NQVgsIG1pbl9yYXRlX2luZGV4ID0gLTE7CkBAIC0xNTMyLDcgKzE1NzksNiBAQAogCiAJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSCk7CiAJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVNTT0MpOwotCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FTU09DX0FQKTsKIAlpZiAoIShpZm1nZC0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX0NPTlRST0xfUE9SVCkpCiAJCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEhPUklaRUQpOwogCkBAIC0xNTQwLDQ3ICsxNTg2LDE0IEBACiAJYmFzaWNfcmF0ZXMgPSAwOwogCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1t3ay0+Y2hhbi0+YmFuZF07CiAKLQlmb3IgKGkgPSAwOyBpIDwgZWxlbXMuc3VwcF9yYXRlc19sZW47IGkrKykgewotCQlpbnQgcmF0ZSA9IChlbGVtcy5zdXBwX3JhdGVzW2ldICYgMHg3ZikgKiA1OwotCQlib29sIGlzX2Jhc2ljID0gISEoZWxlbXMuc3VwcF9yYXRlc1tpXSAmIDB4ODApOworCWllZWU4MDIxMV9nZXRfcmF0ZXMoc2JhbmQsIGVsZW1zLnN1cHBfcmF0ZXMsIGVsZW1zLnN1cHBfcmF0ZXNfbGVuLAorCQkJICAgICZyYXRlcywgJmJhc2ljX3JhdGVzLCAmaGF2ZV9oaWdoZXJfdGhhbl8xMW1iaXQsCisJCQkgICAgJm1pbl9yYXRlLCAmbWluX3JhdGVfaW5kZXgpOwogCi0JCWlmIChyYXRlID4gMTEwKQotCQkJaGF2ZV9oaWdoZXJfdGhhbl8xMW1iaXQgPSB0cnVlOwotCi0JCWZvciAoaiA9IDA7IGogPCBzYmFuZC0+bl9iaXRyYXRlczsgaisrKSB7Ci0JCQlpZiAoc2JhbmQtPmJpdHJhdGVzW2pdLmJpdHJhdGUgPT0gcmF0ZSkgewotCQkJCXJhdGVzIHw9IEJJVChqKTsKLQkJCQlpZiAoaXNfYmFzaWMpCi0JCQkJCWJhc2ljX3JhdGVzIHw9IEJJVChqKTsKLQkJCQlpZiAocmF0ZSA8IG1pbl9yYXRlKSB7Ci0JCQkJCW1pbl9yYXRlID0gcmF0ZTsKLQkJCQkJbWluX3JhdGVfaW5kZXggPSBqOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBlbGVtcy5leHRfc3VwcF9yYXRlc19sZW47IGkrKykgewotCQlpbnQgcmF0ZSA9IChlbGVtcy5leHRfc3VwcF9yYXRlc1tpXSAmIDB4N2YpICogNTsKLQkJYm9vbCBpc19iYXNpYyA9ICEhKGVsZW1zLmV4dF9zdXBwX3JhdGVzW2ldICYgMHg4MCk7Ci0KLQkJaWYgKHJhdGUgPiAxMTApCi0JCQloYXZlX2hpZ2hlcl90aGFuXzExbWJpdCA9IHRydWU7Ci0KLQkJZm9yIChqID0gMDsgaiA8IHNiYW5kLT5uX2JpdHJhdGVzOyBqKyspIHsKLQkJCWlmIChzYmFuZC0+Yml0cmF0ZXNbal0uYml0cmF0ZSA9PSByYXRlKSB7Ci0JCQkJcmF0ZXMgfD0gQklUKGopOwotCQkJCWlmIChpc19iYXNpYykKLQkJCQkJYmFzaWNfcmF0ZXMgfD0gQklUKGopOwotCQkJCWlmIChyYXRlIDwgbWluX3JhdGUpIHsKLQkJCQkJbWluX3JhdGUgPSByYXRlOwotCQkJCQltaW5fcmF0ZV9pbmRleCA9IGo7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorCWllZWU4MDIxMV9nZXRfcmF0ZXMoc2JhbmQsIGVsZW1zLmV4dF9zdXBwX3JhdGVzLAorCQkJICAgIGVsZW1zLmV4dF9zdXBwX3JhdGVzX2xlbiwgJnJhdGVzLCAmYmFzaWNfcmF0ZXMsCisJCQkgICAgJmhhdmVfaGlnaGVyX3RoYW5fMTFtYml0LAorCQkJICAgICZtaW5fcmF0ZSwgJm1pbl9yYXRlX2luZGV4KTsKIAogCS8qCiAJICogc29tZSBidWdneSBBUHMgZG9uJ3QgYWR2ZXJ0aXNlIGJhc2ljX3JhdGVzLiB1c2UgdGhlIGxvd2VzdApAQCAtMTYwMyw3ICsxNjE2LDcgQEAKIAkJc2RhdGEtPmZsYWdzICY9IH5JRUVFODAyMTFfU0RBVEFfT1BFUkFUSU5HX0dNT0RFOwogCiAJaWYgKGVsZW1zLmh0X2NhcF9lbGVtICYmICEoaWZtZ2QtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9ESVNBQkxFXzExTikpCi0JCWllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzYmFuZCwKKwkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNkYXRhLCBzYmFuZCwKIAkJCQllbGVtcy5odF9jYXBfZWxlbSwgJnN0YS0+c3RhLmh0X2NhcCk7CiAKIAlhcF9odF9jYXBfZmxhZ3MgPSBzdGEtPnN0YS5odF9jYXAuY2FwOwpAQCAtMTk3Miw3ICsxOTg1LDcgQEAKIAogCQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF07CiAKLQkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNiYW5kLAorCQlpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc2RhdGEsIHNiYW5kLAogCQkJCWVsZW1zLmh0X2NhcF9lbGVtLCAmc3RhLT5zdGEuaHRfY2FwKTsKIAogCQlhcF9odF9jYXBfZmxhZ3MgPSBzdGEtPnN0YS5odF9jYXAuY2FwOwpAQCAtMjEyNiw5ICsyMTM5LDYgQEAKIAogCWllZWU4MDIxMV9zZXRfZGlzYXNzb2Moc2RhdGEsIHRydWUsIHRydWUpOwogCW11dGV4X3VubG9jaygmaWZtZ2QtPm10eCk7Ci0JbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7Ci0JaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKLQltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwogCS8qCiAJICogbXVzdCBiZSBvdXRzaWRlIGxvY2sgZHVlIHRvIGNmZzgwMjExLAogCSAqIGJ1dCB0aGF0J3Mgbm90IGEgcHJvYmxlbS4KQEAgLTIxMzYsNiArMjE0NiwxMSBAQAogCWllZWU4MDIxMV9zZW5kX2RlYXV0aF9kaXNhc3NvYyhzZGF0YSwgYnNzaWQsCiAJCQlJRUVFODAyMTFfU1RZUEVfREVBVVRILCByZWFzb24sCiAJCQlOVUxMLCB0cnVlKTsKKworCW11dGV4X2xvY2soJmxvY2FsLT5tdHgpOworCWllZWU4MDIxMV9yZWNhbGNfaWRsZShsb2NhbCk7CisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKKwogCW11dGV4X2xvY2soJmlmbWdkLT5tdHgpOwogfQogCkBAIC0yNjMwLDYgKzI2NDUsMTMgQEAKIAkJCWlmbWdkLT5mbGFncyB8PSBJRUVFODAyMTFfU1RBX0RJU0FCTEVfMTFOOwogCiAKKwlpZiAocmVxLT5mbGFncyAmIEFTU09DX1JFUV9ESVNBQkxFX0hUKQorCQlpZm1nZC0+ZmxhZ3MgfD0gSUVFRTgwMjExX1NUQV9ESVNBQkxFXzExTjsKKworCW1lbWNweSgmaWZtZ2QtPmh0X2NhcGEsICZyZXEtPmh0X2NhcGEsIHNpemVvZihpZm1nZC0+aHRfY2FwYSkpOworCW1lbWNweSgmaWZtZ2QtPmh0X2NhcGFfbWFzaywgJnJlcS0+aHRfY2FwYV9tYXNrLAorCSAgICAgICBzaXplb2YoaWZtZ2QtPmh0X2NhcGFfbWFzaykpOworCiAJaWYgKHJlcS0+aWUgJiYgcmVxLT5pZV9sZW4pIHsKIAkJbWVtY3B5KHdrLT5pZSwgcmVxLT5pZSwgcmVxLT5pZV9sZW4pOwogCQl3ay0+aWVfbGVuID0gcmVxLT5pZV9sZW47CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvb2ZmY2hhbm5lbC5jIGIvbmV0L21hYzgwMjExL29mZmNoYW5uZWwuYwppbmRleCAxMzQyN2IxLi5lNDMzMGQ4NCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL29mZmNoYW5uZWwuYworKysgYi9uZXQvbWFjODAyMTEvb2ZmY2hhbm5lbC5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgogI2luY2x1ZGUgImRyaXZlci10cmFjZS5oIgpAQCAtMTU1LDcgKzE1Niw2IEBACiB9CiAKIHZvaWQgaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCSBib29sIGVuYWJsZV9iZWFjb25pbmcsCiAJCQkJIGJvb2wgb2ZmY2hhbm5lbF9wc19kaXNhYmxlKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwpAQCAtMTg3LDExICsxODcsOSBAQAogCQkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKHNkYXRhLT5kZXYpOwogCQl9CiAKLQkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCByZS1lbmFibGUgYmVhY29uaW5nICovCi0JCWlmIChlbmFibGVfYmVhY29uaW5nICYmCi0JCSAgICAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8Ci0JCSAgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DIHx8Ci0JCSAgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CisJCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKKwkJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKQogCQkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoCiAJCQkJc2RhdGEsIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKTsKIAl9CkBAIC0yMTEsOCArMjA5LDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWllZWU4MDIxMV9yZWNhbGNfaWRsZShsb2NhbCk7Ci0KIAlpZiAobG9jYWwtPmh3X3JvY19za2IpIHsKIAkJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihsb2NhbC0+aHdfcm9jX2Rldik7CiAJCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIGxvY2FsLT5od19yb2Nfc2tiKTsKQEAgLTIyNiw2ICsyMjIsOCBAQAogCQkJCQkgIEdGUF9LRVJORUwpOwogCX0KIAorCWllZWU4MDIxMV9yZWNhbGNfaWRsZShsb2NhbCk7CisKIAltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcG0uYyBiL25ldC9tYWM4MDIxMS9wbS5jCmluZGV4IDllZTcxNjQuLjU5NmVmYWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9wbS5jCisrKyBiL25ldC9tYWM4MDIxMS9wbS5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsCiAJCQlCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCk7CiAKLQkJZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsICZzZGF0YS0+dmlmKTsKKwkJZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKIAl9CiAKIAkvKiBzdG9wIGhhcmR3YXJlIC0gdGhpcyBtdXN0IHN0b3AgUlggKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYXRlLmMgYi9uZXQvbWFjODAyMTEvcmF0ZS5jCmluZGV4IGZmNWMzYWEuLjVhNWE3NzYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yYXRlLmMKKysrIGIvbmV0L21hYzgwMjExL3JhdGUuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJyYXRlLmgiCiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKICNpbmNsdWRlICJkZWJ1Z2ZzLmgiCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYwppbmRleCA1OGE4OTU1Li5iMzlkZGE1IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMKQEAgLTMzNCw4ICszMzQsOCBAQAogCiAKIHN0YXRpYyB2b2lkCi1jYWxjX3JhdGVfZHVyYXRpb25zKHN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWksIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWluc3RyZWxfcmF0ZSAqZCwgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlKQorY2FsY19yYXRlX2R1cmF0aW9ucyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgc3RydWN0IG1pbnN0cmVsX3JhdGUgKmQsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGUpCiB7CiAJaW50IGVycCA9ICEhKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1JBVEVfRVJQX0cpOwogCkBAIC00MDIsOCArNDAyLDcgQEAKIAogCQltci0+cml4ID0gaTsKIAkJbXItPmJpdHJhdGUgPSBzYmFuZC0+Yml0cmF0ZXNbaV0uYml0cmF0ZSAvIDU7Ci0JCWNhbGNfcmF0ZV9kdXJhdGlvbnMobWksIGxvY2FsLCBtciwKLQkJCQkmc2JhbmQtPmJpdHJhdGVzW2ldKTsKKwkJY2FsY19yYXRlX2R1cmF0aW9ucyhsb2NhbCwgbXIsICZzYmFuZC0+Yml0cmF0ZXNbaV0pOwogCiAJCS8qIGNhbGN1bGF0ZSBtYXhpbXVtIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgYmVmb3JlCiAJCSAqIGZhbGxiYWNrIChiYXNlZCBvbiBtYXhpbXVtIHNlZ21lbnQgc2l6ZSkgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2RlYnVnZnMuYwppbmRleCBhMjkwYWQyMy4uZDVhNTYyMiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfZGVidWdmcy5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2RlYnVnZnMuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSAicmM4MDIxMV9taW5zdHJlbC5oIgogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuYwppbmRleCBjZGIyODUzLi5mZjVmN2I4IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0LmMKQEAgLTM2LDggKzM2LDE3IEBACiAvKiBUcmFuc21pdCBkdXJhdGlvbiBmb3IgdGhlIHJhdyBkYXRhIHBhcnQgb2YgYW4gYXZlcmFnZSBzaXplZCBwYWNrZXQgKi8KICNkZWZpbmUgTUNTX0RVUkFUSU9OKHN0cmVhbXMsIHNnaSwgYnBzKSBNQ1NfU1lNQk9MX1RJTUUoc2dpLCBNQ1NfTlNZTVMoKHN0cmVhbXMpICogKGJwcykpKQogCisvKgorICogRGVmaW5lIGdyb3VwIHNvcnQgb3JkZXI6IEhUNDAgLT4gU0dJIC0+ICNzdHJlYW1zCisgKi8KKyNkZWZpbmUgR1JPVVBfSURYKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCkJXAorCU1JTlNUUkVMX01BWF9TVFJFQU1TICogMiAqIF9odDQwICsJXAorCU1JTlNUUkVMX01BWF9TVFJFQU1TICogX3NnaSArCQlcCisJX3N0cmVhbXMgLSAxCisKIC8qIE1DUyByYXRlIGluZm9ybWF0aW9uIGZvciBhbiBNQ1MgZ3JvdXAgKi8KLSNkZWZpbmUgTUNTX0dST1VQKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCkgewkJCQlcCisjZGVmaW5lIE1DU19HUk9VUChfc3RyZWFtcywgX3NnaSwgX2h0NDApCQkJCVwKKwlbR1JPVVBfSURYKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCldID0gewkJCQlcCiAJLnN0cmVhbXMgPSBfc3RyZWFtcywJCQkJCQlcCiAJLmZsYWdzID0JCQkJCQkJXAogCQkoX3NnaSA/IElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSA6IDApIHwJCQlcCkBAIC01OCw2ICs2Nyw5IEBACiAgKiBUbyBlbmFibGUgc3VmZmljaWVudGx5IHRhcmdldGVkIHJhdGUgc2FtcGxpbmcsIE1DUyByYXRlcyBhcmUgZGl2aWRlZCBpbnRvCiAgKiBncm91cHMsIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyBhbmQgZmxhZ3MgKEhUNDAsIFNHSSkgdGhhdCB0aGV5CiAgKiB1c2UuCisgKgorICogU29ydG9yZGVyIGhhcyB0byBiZSBmaXhlZCBmb3IgR1JPVVBfSURYIG1hY3JvIHRvIGJlIGFwcGxpY2FibGU6CisgKiBIVDQwIC0+IFNHSSAtPiAjc3RyZWFtcwogICovCiBjb25zdCBzdHJ1Y3QgbWNzX2dyb3VwIG1pbnN0cmVsX21jc19ncm91cHNbXSA9IHsKIAlNQ1NfR1JPVVAoMSwgMCwgMCksCkBAIC0xMDIsMjEgKzExNCw5IEBACiBzdGF0aWMgaW50CiBtaW5zdHJlbF9odF9nZXRfZ3JvdXBfaWR4KHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZSkKIHsKLQlpbnQgc3RyZWFtcyA9IChyYXRlLT5pZHggLyBNQ1NfR1JPVVBfUkFURVMpICsgMTsKLQl1MzIgZmxhZ3MgPSBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kgfCBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWluc3RyZWxfbWNzX2dyb3Vwcyk7IGkrKykgewotCQlpZiAobWluc3RyZWxfbWNzX2dyb3Vwc1tpXS5zdHJlYW1zICE9IHN0cmVhbXMpCi0JCQljb250aW51ZTsKLQkJaWYgKG1pbnN0cmVsX21jc19ncm91cHNbaV0uZmxhZ3MgIT0gKHJhdGUtPmZsYWdzICYgZmxhZ3MpKQotCQkJY29udGludWU7Ci0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JV0FSTl9PTigxKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gR1JPVVBfSURYKChyYXRlLT5pZHggLyBNQ1NfR1JPVVBfUkFURVMpICsgMSwKKwkJCSAhIShyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSksCisJCQkgISEocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKgpAQCAtMTMwLDcgKzEzMCw3IEBACiAgKiBSZWNhbGN1bGF0ZSBzdWNjZXNzIHByb2JhYmlsaXRpZXMgYW5kIGNvdW50ZXJzIGZvciBhIHJhdGUgdXNpbmcgRVdNQQogICovCiBzdGF0aWMgdm9pZAotbWluc3RyZWxfY2FsY19yYXRlX2V3bWEoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXIpCittaW5zdHJlbF9jYWxjX3JhdGVfZXdtYShzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXIpCiB7CiAJaWYgKHVubGlrZWx5KG1yLT5hdHRlbXB0cyA+IDApKSB7CiAJCW1yLT5zYW1wbGVfc2tpcHBlZCA9IDA7CkBAIC0xNTYsOCArMTU2LDcgQEAKICAqIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGFuZCB0aGVpciBleHBlY3RlZCBsZW5ndGgKICAqLwogc3RhdGljIHZvaWQKLW1pbnN0cmVsX2h0X2NhbGNfdHAoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwLCBpbnQgcmF0ZSkKK21pbnN0cmVsX2h0X2NhbGNfdHAoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksIGludCBncm91cCwgaW50IHJhdGUpCiB7CiAJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yOwogCXVuc2lnbmVkIGludCB1c2VjczsKQEAgLTIyNiw4ICsyMjUsOCBAQAogCQkJbXIgPSAmbWctPnJhdGVzW2ldOwogCQkJbXItPnJldHJ5X3VwZGF0ZWQgPSBmYWxzZTsKIAkJCWluZGV4ID0gTUNTX0dST1VQX1JBVEVTICogZ3JvdXAgKyBpOwotCQkJbWluc3RyZWxfY2FsY19yYXRlX2V3bWEobXAsIG1yKTsKLQkJCW1pbnN0cmVsX2h0X2NhbGNfdHAobXAsIG1pLCBncm91cCwgaSk7CisJCQltaW5zdHJlbF9jYWxjX3JhdGVfZXdtYShtcik7CisJCQltaW5zdHJlbF9odF9jYWxjX3RwKG1pLCBncm91cCwgaSk7CiAKIAkJCWlmICghbXItPmN1cl90cCkKIAkJCQljb250aW51ZTsKQEAgLTMwMCwxMCArMjk5LDEwIEBACiBzdGF0aWMgYm9vbAogbWluc3RyZWxfaHRfdHhzdGF0X3ZhbGlkKHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZSkKIHsKLQlpZiAoIXJhdGUtPmNvdW50KQorCWlmIChyYXRlLT5pZHggPCAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAocmF0ZS0+aWR4IDwgMCkKKwlpZiAoIXJhdGUtPmNvdW50KQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gISEocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKTsKQEAgLTM1Nyw3ICszNTYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbWluc3RyZWxfYWdncl9jaGVjayhzdHJ1Y3QgbWluc3RyZWxfcHJpdiAqbXAsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGEsIHN0cnVjdCBza19idWZmICpza2IpCittaW5zdHJlbF9hZ2dyX2NoZWNrKHN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGEsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBjb250YWluZXJfb2YocHVic3RhLCBzdHJ1Y3Qgc3RhX2luZm8sIHN0YSk7CkBAIC00NTUsNyArNDU0LDcgQEAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBtaS0+c3RhdHNfdXBkYXRlICsgKG1wLT51cGRhdGVfaW50ZXJ2YWwgLyAyICogSFopIC8gMTAwMCkpIHsKIAkJbWluc3RyZWxfaHRfdXBkYXRlX3N0YXRzKG1wLCBtaSk7CiAJCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkpCi0JCQltaW5zdHJlbF9hZ2dyX2NoZWNrKG1wLCBzdGEsIHNrYik7CisJCQltaW5zdHJlbF9hZ2dyX2NoZWNrKHN0YSwgc2tiKTsKIAl9CiB9CiAKQEAgLTUxNSw3ICs1MTQsNiBAQAogc3RhdGljIHZvaWQKIG1pbnN0cmVsX2h0X3NldF9yYXRlKHN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCwgc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksCiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGUsIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9jb250cm9sICp0eHJjLAogICAgICAgICAgICAgICAgICAgICAgYm9vbCBzYW1wbGUsIGJvb2wgcnRzY3RzKQogewogCWNvbnN0IHN0cnVjdCBtY3NfZ3JvdXAgKmdyb3VwID0gJm1pbnN0cmVsX21jc19ncm91cHNbaW5kZXggLyBNQ1NfR1JPVVBfUkFURVNdOwpAQCAtNjI4LDExICs2MjYsMTEgQEAKIAlpZiAoc2FtcGxlX2lkeCA+PSAwKSB7CiAJCXNhbXBsZSA9IHRydWU7CiAJCW1pbnN0cmVsX2h0X3NldF9yYXRlKG1wLCBtaSwgJmFyWzBdLCBzYW1wbGVfaWR4LAotCQkJdHhyYywgdHJ1ZSwgZmFsc2UpOworCQkJdHJ1ZSwgZmFsc2UpOwogCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRTsKIAl9IGVsc2UgewogCQltaW5zdHJlbF9odF9zZXRfcmF0ZShtcCwgbWksICZhclswXSwgbWktPm1heF90cF9yYXRlLAotCQkJdHhyYywgZmFsc2UsIGZhbHNlKTsKKwkJCWZhbHNlLCBmYWxzZSk7CiAJfQogCiAJaWYgKG1wLT5ody0+bWF4X3JhdGVzID49IDMpIHsKQEAgLTY0MywxMyArNjQxLDEzIEBACiAJCSAqLwogCQlpZiAoc2FtcGxlX2lkeCA+PSAwKQogCQkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMV0sIG1pLT5tYXhfdHBfcmF0ZSwKLQkJCQl0eHJjLCBmYWxzZSwgZmFsc2UpOworCQkJCWZhbHNlLCBmYWxzZSk7CiAJCWVsc2UKIAkJCW1pbnN0cmVsX2h0X3NldF9yYXRlKG1wLCBtaSwgJmFyWzFdLCBtaS0+bWF4X3RwX3JhdGUyLAotCQkJCXR4cmMsIGZhbHNlLCB0cnVlKTsKKwkJCQlmYWxzZSwgdHJ1ZSk7CiAKIAkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMl0sIG1pLT5tYXhfcHJvYl9yYXRlLAotCQkJCSAgICAgdHhyYywgZmFsc2UsICFzYW1wbGUpOworCQkJCSAgICAgZmFsc2UsICFzYW1wbGUpOwogCiAJCWFyWzNdLmNvdW50ID0gMDsKIAkJYXJbM10uaWR4ID0gLTE7CkBAIC02NjAsNyArNjU4LDcgQEAKIAkJICogbWF4X3RwX3JhdGUgLT4gbWF4X3Byb2JfcmF0ZSBieSBkZWZhdWx0LgogCQkgKi8KIAkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMV0sIG1pLT5tYXhfcHJvYl9yYXRlLAotCQkJCSAgICAgdHhyYywgZmFsc2UsICFzYW1wbGUpOworCQkJCSAgICAgZmFsc2UsICFzYW1wbGUpOwogCiAJCWFyWzJdLmNvdW50ID0gMDsKIAkJYXJbMl0uaWR4ID0gLTE7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odF9kZWJ1Z2ZzLmMgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odF9kZWJ1Z2ZzLmMKaW5kZXggY2VmY2I1ZC4uZTc4OGY3NiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHRfZGVidWdmcy5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0X2RlYnVnZnMuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJyYzgwMjExX21pbnN0cmVsLmgiCiAjaW5jbHVkZSAicmM4MDIxMV9taW5zdHJlbF9odC5oIgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3JjODAyMTFfcGlkX2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX3BpZF9kZWJ1Z2ZzLmMKaW5kZXggNDg1MWU5ZS4uYzk3YTA2NSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JjODAyMTFfcGlkX2RlYnVnZnMuYworKysgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9waWRfZGVidWdmcy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJyYXRlLmgiCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcnguYyBiL25ldC9tYWM4MDIxMS9yeC5jCmluZGV4IDA5N2I0MmQuLmRhZjVjZGUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yeC5jCisrKyBiL25ldC9tYWM4MDIxMS9yeC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KIApAQCAtNzQ3LDEwICs3NDgsMTEgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHJ4LT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9ICZsb2NhbC0+aHc7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihza2IpOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gcngtPnN0YTsKIAlzdHJ1Y3QgdGlkX2FtcGR1X3J4ICp0aWRfYWdnX3J4OwogCXUxNiBzYzsKLQlpbnQgdGlkOworCXU4IHRpZCwgYWNrX3BvbGljeTsKIAogCWlmICghaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCWdvdG8gZG9udF9yZW9yZGVyOwpAQCAtNzYzLDYgKzc2NSw4IEBACiAJaWYgKCFzdGEpCiAJCWdvdG8gZG9udF9yZW9yZGVyOwogCisJYWNrX3BvbGljeSA9ICppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSAmCisJCSAgICAgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9NQVNLOwogCXRpZCA9ICppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCiAJdGlkX2FnZ19yeCA9IHJjdV9kZXJlZmVyZW5jZShzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pOwpAQCAtNzczLDYgKzc3NywxNSBAQAogCWlmICh1bmxpa2VseShoZHItPmZyYW1lX2NvbnRyb2wgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMpKSkKIAkJZ290byBkb250X3Jlb3JkZXI7CiAKKwkvKiBub3QgcGFydCBvZiBhIEJBIHNlc3Npb24gKi8KKwlpZiAoYWNrX3BvbGljeSAhPSBJRUVFODAyMTFfUU9TX0NUTF9BQ0tfUE9MSUNZX0JMT0NLQUNLICYmCisJICAgIGFja19wb2xpY3kgIT0gSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT1JNQUwpCisJCWdvdG8gZG9udF9yZW9yZGVyOworCisJLyogbm90IGFjdHVhbGx5IHBhcnQgb2YgdGhpcyBCQSBzZXNzaW9uICovCisJaWYgKCEoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkpCisJCWdvdG8gZG9udF9yZW9yZGVyOworCiAJLyogbmV3LCBwb3RlbnRpYWxseSB1bi1vcmRlcmVkLCBhbXBkdSBmcmFtZSAtIHByb2Nlc3MgaXQgKi8KIAogCS8qIHJlc2V0IHNlc3Npb24gdGltZXIgKi8KQEAgLTg1Nyw2ICs4NzAsMTMgQEAKIAkJCSAgICByeC0+c2RhdGEtPmNvbnRyb2xfcG9ydF9wcm90b2NvbCkKIAkJCQlyZXR1cm4gUlhfQ09OVElOVUU7CiAJCX0KKworCQlpZiAocngtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCAmJgorCQkgICAgY2ZnODAyMTFfcnhfc3B1cmlvdXNfZnJhbWUocngtPnNkYXRhLT5kZXYsCisJCQkJCSAgICAgICBoZHItPmFkZHIyLAorCQkJCQkgICAgICAgR0ZQX0FUT01JQykpCisJCQlyZXR1cm4gUlhfRFJPUF9VTlVTQUJMRTsKKwogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwogCX0KIApAQCAtMTMyNiwxNSArMTM0NiwyMCBAQAogCiAJCS8qCiAJCSAqIElmIHdlIHJlY2VpdmUgYSA0LWFkZHIgbnVsbGZ1bmMgZnJhbWUgZnJvbSBhIFNUQQotCQkgKiB0aGF0IHdhcyBub3QgbW92ZWQgdG8gYSA0LWFkZHIgU1RBIHZsYW4geWV0LCBkcm9wCi0JCSAqIHRoZSBmcmFtZSB0byB0aGUgbW9uaXRvciBpbnRlcmZhY2UsIHRvIG1ha2Ugc3VyZQotCQkgKiB0aGF0IGhvc3RhcGQgc2VlcyBpdAorCQkgKiB0aGF0IHdhcyBub3QgbW92ZWQgdG8gYSA0LWFkZHIgU1RBIHZsYW4geWV0IHNlbmQKKwkJICogdGhlIGV2ZW50IHRvIHVzZXJzcGFjZSBhbmQgZm9yIG9sZGVyIGhvc3RhcGQgZHJvcAorCQkgKiB0aGUgZnJhbWUgdG8gdGhlIG1vbml0b3IgaW50ZXJmYWNlLgogCQkgKi8KIAkJaWYgKGllZWU4MDIxMV9oYXNfYTQoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCQkgICAgKHJ4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKIAkJICAgICAocngtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCi0JCSAgICAgICFyeC0+c2RhdGEtPnUudmxhbi5zdGEpKSkKKwkJICAgICAgIXJ4LT5zZGF0YS0+dS52bGFuLnN0YSkpKSB7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBXzRBRERSX0VWRU5UKSkKKwkJCQljZmc4MDIxMV9yeF91bmV4cGVjdGVkXzRhZGRyX2ZyYW1lKAorCQkJCQlyeC0+c2RhdGEtPmRldiwgc3RhLT5zdGEuYWRkciwKKwkJCQkJR0ZQX0FUT01JQyk7CiAJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCQl9CiAJCS8qCiAJCSAqIFVwZGF0ZSBjb3VudGVyIGFuZCBmcmVlIHBhY2tldCBoZXJlIHRvIGF2b2lkCiAJCSAqIGNvdW50aW5nIHRoaXMgYXMgYSBkcm9wcGVkIHBhY2tlZC4KQEAgLTE4NzAsMTMgKzE4OTUsMTYgQEAKIHN0YXRpYyBpZWVlODAyMTFfcnhfcmVzdWx0CiBpZWVlODAyMTFfcnhfaF9tZXNoX2Z3ZGluZyhzdHJ1Y3QgaWVlZTgwMjExX3J4X2RhdGEgKnJ4KQogewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmZ3ZF9oZHIsICpoZHI7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCXN0cnVjdCBpZWVlODAyMTFzX2hkciAqbWVzaF9oZHI7Ci0JdW5zaWduZWQgaW50IGhkcmxlbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcngtPnNrYiwgKmZ3ZF9za2I7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSByeC0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSByeC0+c2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCAqaWZtc2ggPSAmc2RhdGEtPnUubWVzaDsKKwlfX2xlMTYgcmVhc29uID0gY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fTUVTSF9QQVRIX05PRk9SV0FSRCk7CisJdTE2IHEsIGhkcmxlbjsKIAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwpAQCAtMTg5MiwxNSArMTkyMCw4IEBACiAJCXJldHVybiBSWF9DT05USU5VRTsKIAogCWlmICghbWVzaF9oZHItPnR0bCkKLQkJLyogaWxsZWdhbCBmcmFtZSAqLwogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwogCi0JaWYgKGllZWU4MDIxMV9xdWV1ZV9zdG9wcGVkKCZsb2NhbC0+aHcsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKSkgewotCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKCZzZGF0YS0+dS5tZXNoLAotCQkJCQkJZHJvcHBlZF9mcmFtZXNfY29uZ2VzdGlvbik7Ci0JCXJldHVybiBSWF9EUk9QX01PTklUT1I7Ci0JfQotCiAJaWYgKG1lc2hfaGRyLT5mbGFncyAmIE1FU0hfRkxBR1NfQUUpIHsKIAkJc3RydWN0IG1lc2hfcGF0aCAqbXBwYXRoOwogCQljaGFyICpwcm94aWVkX2FkZHI7CkBAIC0xOTMyLDYwICsxOTUzLDUwIEBACiAJICAgIGNvbXBhcmVfZXRoZXJfYWRkcihzZGF0YS0+dmlmLmFkZHIsIGhkci0+YWRkcjMpID09IDApCiAJCXJldHVybiBSWF9DT05USU5VRTsKIAotCW1lc2hfaGRyLT50dGwtLTsKKwlxID0gaWVlZTgwMjExX3NlbGVjdF9xdWV1ZV84MDIxMShsb2NhbCwgc2tiLCBoZHIpOworCWlmIChpZWVlODAyMTFfcXVldWVfc3RvcHBlZCgmbG9jYWwtPmh3LCBxKSkgeworCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKGlmbXNoLCBkcm9wcGVkX2ZyYW1lc19jb25nZXN0aW9uKTsKKwkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKKwl9CisJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgcSk7CiAKLQlpZiAoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkgewotCQlpZiAoIW1lc2hfaGRyLT50dGwpCi0JCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKCZyeC0+c2RhdGEtPnUubWVzaCwKLQkJCQkJCSAgICAgZHJvcHBlZF9mcmFtZXNfdHRsKTsKLQkJZWxzZSB7Ci0JCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqZndkX2hkcjsKLQkJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKKwlpZiAoIShzdGF0dXMtPnJ4X2ZsYWdzICYgSUVFRTgwMjExX1JYX1JBX01BVENIKSkKKwkJZ290byBvdXQ7CiAKLQkJCWZ3ZF9za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOwotCi0JCQlpZiAoIWZ3ZF9za2IgJiYgbmV0X3JhdGVsaW1pdCgpKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGNsb25lIG1lc2ggZnJhbWVcbiIsCi0JCQkJCQkgICBzZGF0YS0+bmFtZSk7Ci0JCQlpZiAoIWZ3ZF9za2IpCi0JCQkJZ290byBvdXQ7Ci0KLQkJCWZ3ZF9oZHIgPSAgKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIGZ3ZF9za2ItPmRhdGE7Ci0JCQltZW1jcHkoZndkX2hkci0+YWRkcjIsIHNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOwotCQkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoZndkX3NrYik7Ci0JCQltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7Ci0JCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfSU5URkxfTkVFRF9UWFBST0NFU1NJTkc7Ci0JCQlpbmZvLT5jb250cm9sLnZpZiA9ICZyeC0+c2RhdGEtPnZpZjsKLQkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihmd2RfaGRyLT5hZGRyMSkpIHsKLQkJCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKCZzZGF0YS0+dS5tZXNoLAotCQkJCQkJCQlmd2RlZF9tY2FzdCk7Ci0JCQkJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKGZ3ZF9za2IsCi0JCQkJCWllZWU4MDIxMV9zZWxlY3RfcXVldWUoc2RhdGEsIGZ3ZF9za2IpKTsKLQkJCQlpZWVlODAyMTFfc2V0X3Fvc19oZHIoc2RhdGEsIGZ3ZF9za2IpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgZXJyOwotCQkJCS8qCi0JCQkJICogU2F2ZSBUQSB0byBhZGRyMSB0byBzZW5kIFRBIGEgcGF0aCBlcnJvciBpZiBhCi0JCQkJICogc3VpdGFibGUgbmV4dCBob3AgaXMgbm90IGZvdW5kCi0JCQkJICovCi0JCQkJbWVtY3B5KGZ3ZF9oZHItPmFkZHIxLCBmd2RfaGRyLT5hZGRyMiwKLQkJCQkJCUVUSF9BTEVOKTsKLQkJCQllcnIgPSBtZXNoX25leHRob3BfbG9va3VwKGZ3ZF9za2IsIHNkYXRhKTsKLQkJCQkvKiBGYWlsZWQgdG8gaW1tZWRpYXRlbHkgcmVzb2x2ZSBuZXh0IGhvcDoKLQkJCQkgKiBmd2RlZCBmcmFtZSB3YXMgZHJvcHBlZCBvciB3aWxsIGJlIGFkZGVkCi0JCQkJICogbGF0ZXIgdG8gdGhlIHBlbmRpbmcgc2tiIHF1ZXVlLiAgKi8KLQkJCQlpZiAoZXJyKQotCQkJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwotCi0JCQkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQygmc2RhdGEtPnUubWVzaCwKLQkJCQkJCQkJZndkZWRfdW5pY2FzdCk7Ci0JCQl9Ci0JCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKCZzZGF0YS0+dS5tZXNoLAotCQkJCQkJICAgICBmd2RlZF9mcmFtZXMpOwotCQkJaWVlZTgwMjExX2FkZF9wZW5kaW5nX3NrYihsb2NhbCwgZndkX3NrYik7Ci0JCX0KKwlpZiAoIS0tbWVzaF9oZHItPnR0bCkgeworCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKGlmbXNoLCBkcm9wcGVkX2ZyYW1lc190dGwpOworCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwogCX0KIAorCWZ3ZF9za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCWlmICghZndkX3NrYikgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gY2xvbmUgbWVzaCBmcmFtZVxuIiwKKwkJCQkJc2RhdGEtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlmd2RfaGRyID0gIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBmd2Rfc2tiLT5kYXRhOworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKGZ3ZF9za2IpOworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfSU5URkxfTkVFRF9UWFBST0NFU1NJTkc7CisJaW5mby0+Y29udHJvbC52aWYgPSAmcngtPnNkYXRhLT52aWY7CisJaW5mby0+Y29udHJvbC5qaWZmaWVzID0gamlmZmllczsKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZndkX2hkci0+YWRkcjEpKSB7CisJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoaWZtc2gsIGZ3ZGVkX21jYXN0KTsKKwkJbWVtY3B5KGZ3ZF9oZHItPmFkZHIyLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKKwl9IGVsc2UgaWYgKCFtZXNoX25leHRob3BfbG9va3VwKGZ3ZF9za2IsIHNkYXRhKSkgeworCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKGlmbXNoLCBmd2RlZF91bmljYXN0KTsKKwl9IGVsc2UgeworCQkvKiB1bmFibGUgdG8gcmVzb2x2ZSBuZXh0IGhvcCAqLworCQltZXNoX3BhdGhfZXJyb3JfdHgoaWZtc2gtPm1zaGNmZy5lbGVtZW50X3R0bCwgZndkX2hkci0+YWRkcjMsCisJCQkJICAgIDAsIHJlYXNvbiwgZndkX2hkci0+YWRkcjIsIHNkYXRhKTsKKwkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQyhpZm1zaCwgZHJvcHBlZF9mcmFtZXNfbm9fcm91dGUpOworCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCX0KKworCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoaWZtc2gsIGZ3ZGVkX2ZyYW1lcyk7CisJaWVlZTgwMjExX2FkZF9wZW5kaW5nX3NrYihsb2NhbCwgZndkX3NrYik7CiAgb3V0OgogCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSB8fAogCSAgICBzZGF0YS0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQpAQCAtMjAxMywxMiArMjAyNCwxNyBAQAogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwogCiAJLyoKLQkgKiBBbGxvdyB0aGUgY29va2VkIG1vbml0b3IgaW50ZXJmYWNlIG9mIGFuIEFQIHRvIHNlZSA0LWFkZHIgZnJhbWVzIHNvCi0JICogdGhhdCBhIDQtYWRkciBzdGF0aW9uIGNhbiBiZSBkZXRlY3RlZCBhbmQgbW92ZWQgaW50byBhIHNlcGFyYXRlIFZMQU4KKwkgKiBTZW5kIHVuZXhwZWN0ZWQtNGFkZHItZnJhbWUgZXZlbnQgdG8gaG9zdGFwZC4gRm9yIG9sZGVyIHZlcnNpb25zLAorCSAqIGFsc28gZHJvcCB0aGUgZnJhbWUgdG8gY29va2VkIG1vbml0b3IgaW50ZXJmYWNlcy4KIAkgKi8KIAlpZiAoaWVlZTgwMjExX2hhc19hNChoZHItPmZyYW1lX2NvbnRyb2wpICYmCi0JICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CisJCWlmIChyeC0+c3RhICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X3N0YV9mbGFnKHJ4LT5zdGEsIFdMQU5fU1RBXzRBRERSX0VWRU5UKSkKKwkJCWNmZzgwMjExX3J4X3VuZXhwZWN0ZWRfNGFkZHJfZnJhbWUoCisJCQkJcngtPnNkYXRhLT5kZXYsIHJ4LT5zdGEtPnN0YS5hZGRyLCBHRlBfQVRPTUlDKTsKIAkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKKwl9CiAKIAllcnIgPSBfX2llZWU4MDIxMV9kYXRhX3RvXzgwMjMocngsICZwb3J0X2NvbnRyb2wpOwogCWlmICh1bmxpa2VseShlcnIpKQpAQCAtMjE3Myw2ICsyMTg5LDE4IEBACiAJaWYgKCFpZWVlODAyMTFfaXNfbWdtdChtZ210LT5mcmFtZV9jb250cm9sKSkKIAkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKIAorCWlmIChyeC0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQICYmCisJICAgIGllZWU4MDIxMV9pc19iZWFjb24obWdtdC0+ZnJhbWVfY29udHJvbCkgJiYKKwkgICAgIShyeC0+ZmxhZ3MgJiBJRUVFODAyMTFfUlhfQkVBQ09OX1JFUE9SVEVEKSkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzOworCisJCXN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihyeC0+c2tiKTsKKwkJY2ZnODAyMTFfcmVwb3J0X29ic3NfYmVhY29uKHJ4LT5sb2NhbC0+aHcud2lwaHksCisJCQkJCSAgICByeC0+c2tiLT5kYXRhLCByeC0+c2tiLT5sZW4sCisJCQkJCSAgICBzdGF0dXMtPmZyZXEsIEdGUF9BVE9NSUMpOworCQlyeC0+ZmxhZ3MgfD0gSUVFRTgwMjExX1JYX0JFQUNPTl9SRVBPUlRFRDsKKwl9CisKIAlpZiAoIShzdGF0dXMtPnJ4X2ZsYWdzICYgSUVFRTgwMjExX1JYX1JBX01BVENIKSkKIAkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKIApAQCAtMjIwNiwxMyArMjIzNCw4IEBACiAKIAlzd2l0Y2ggKG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5KSB7CiAJY2FzZSBXTEFOX0NBVEVHT1JZX0JBQ0s6Ci0JCS8qCi0JCSAqIFRoZSBhZ2dyZWdhdGlvbiBjb2RlIGlzIG5vdCBwcmVwYXJlZCB0byBoYW5kbGUKLQkJICogYW55dGhpbmcgYnV0IFNUQS9BUCBkdWUgdG8gdGhlIEJTU0lEIGhhbmRsaW5nOwotCQkgKiBJQlNTIGNvdWxkIHdvcmsgaW4gdGhlIGNvZGUgYnV0IGlzbid0IHN1cHBvcnRlZAotCQkgKiBieSBkcml2ZXJzIG9yIHRoZSBzdGFuZGFyZC4KLQkJICovCiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQgJiYKIAkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCiAJCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCQlicmVhazsKQEAgLTI0OTIsNiArMjUxNSwxMCBAQAogCQlnb3RvIG91dF9mcmVlX3NrYjsKIAlyeC0+ZmxhZ3MgfD0gSUVFRTgwMjExX1JYX0NNTlRSOwogCisJLyogSWYgdGhlcmUgYXJlIG5vIGNvb2tlZCBtb25pdG9yIGludGVyZmFjZXMsIGp1c3QgZnJlZSB0aGUgU0tCICovCisJaWYgKCFsb2NhbC0+Y29va2VkX21udHJzKQorCQlnb3RvIG91dF9mcmVlX3NrYjsKKwogCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IHNpemVvZigqcnRoZHIpICYmCiAJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCBzaXplb2YoKnJ0aGRyKSwgMCwgR0ZQX0FUT01JQykpCiAJCWdvdG8gb3V0X2ZyZWVfc2tiOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3NjYW4uYyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKaW5kZXggODNhMGIwNS4uMmM1MDQxYyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3NjYW4uYworKysgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+CiAjaW5jbHVkZSA8bmV0L3NjaF9nZW5lcmljLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKQEAgLTIxMiwxMiArMjEzLDcgQEAKIAlpZiAoYnNzKQogCQlpZWVlODAyMTFfcnhfYnNzX3B1dChzZGF0YS0+bG9jYWwsIGJzcyk7CiAKLQkvKiBJZiB3ZSBhcmUgb24tb3BlcmF0aW5nLWNoYW5uZWwsIGFuZCB0aGlzIHBhY2tldCBpcyBmb3IgdGhlCi0JICogY3VycmVudCBjaGFubmVsLCBwYXNzIHRoZSBwa3Qgb24gdXAgdGhlIHN0YWNrIHNvIHRoYXQKLQkgKiB0aGUgcmVzdCBvZiB0aGUgc3RhY2sgY2FuIG1ha2UgdXNlIG9mIGl0LgotCSAqLwotCWlmIChpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChzZGF0YS0+bG9jYWwpCi0JICAgICYmIChjaGFubmVsID09IHNkYXRhLT5sb2NhbC0+b3Blcl9jaGFubmVsKSkKKwlpZiAoY2hhbm5lbCA9PSBzZGF0YS0+bG9jYWwtPm9wZXJfY2hhbm5lbCkKIAkJcmV0dXJuIFJYX0NPTlRJTlVFOwogCiAJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMjYzLDggKzI1OSw2IEBACiAJCQkJICAgICAgIGJvb2wgd2FzX2h3X3NjYW4pCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7Ci0JYm9vbCBvbl9vcGVyX2NoYW47Ci0JYm9vbCBlbmFibGVfYmVhY29ucyA9IGZhbHNlOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPm10eCk7CiAKQEAgLTI5NywyNSArMjkxLDEzIEBACiAJbG9jYWwtPnNjYW5uaW5nID0gMDsKIAlsb2NhbC0+c2Nhbl9jaGFubmVsID0gTlVMTDsKIAotCW9uX29wZXJfY2hhbiA9IGllZWU4MDIxMV9jZmdfb25fb3Blcl9jaGFubmVsKGxvY2FsKTsKLQotCWlmICh3YXNfaHdfc2NhbiB8fCAhb25fb3Blcl9jaGFuKQotCQlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCk7Ci0JZWxzZQotCQkvKiBTZXQgcG93ZXIgYmFjayB0byBub3JtYWwgb3BlcmF0aW5nIGxldmVscy4gKi8KLQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7CisJLyogU2V0IHBvd2VyIGJhY2sgdG8gbm9ybWFsIG9wZXJhdGluZyBsZXZlbHMuICovCisJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7CiAKIAlpZiAoIXdhc19od19zY2FuKSB7Ci0JCWJvb2wgb25fb3Blcl9jaGFuMjsKIAkJaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIobG9jYWwpOwogCQlkcnZfc3dfc2Nhbl9jb21wbGV0ZShsb2NhbCk7Ci0JCW9uX29wZXJfY2hhbjIgPSBpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCk7Ci0JCS8qIFdlIHNob3VsZCBhbHdheXMgYmUgb24tY2hhbm5lbCBhdCB0aGlzIHBvaW50LiAqLwotCQlXQVJOX09OKCFvbl9vcGVyX2NoYW4yKTsKLQkJaWYgKG9uX29wZXJfY2hhbjIgJiYgKG9uX29wZXJfY2hhbiAhPSBvbl9vcGVyX2NoYW4yKSkKLQkJCWVuYWJsZV9iZWFjb25zID0gdHJ1ZTsKLQotCQlpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4obG9jYWwsIGVuYWJsZV9iZWFjb25zLCB0cnVlKTsKKwkJaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKGxvY2FsLCB0cnVlKTsKIAl9CiAKIAlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOwpAQCAtMzYwLDExICszNDIsNyBAQAogCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX0RFQ0lTSU9OOwogCWxvY2FsLT5zY2FuX2NoYW5uZWxfaWR4ID0gMDsKIAotCS8qIFdlIGFsd2F5cyB3YW50IHRvIHVzZSBvZmYtY2hhbm5lbCBQUywgZXZlbiBpZiB3ZQotCSAqIGFyZSBub3QgcmVhbGx5IGxlYXZpbmcgb3Blci1jaGFubmVsLiAgRG9uJ3QKLQkgKiB0ZWxsIHRoZSBBUCB0aG91Z2gsIGFzIGxvbmcgYXMgd2UgYXJlIG9uLWNoYW5uZWwuCi0JICovCi0JaWVlZTgwMjExX29mZmNoYW5uZWxfZW5hYmxlX2FsbF9wcyhsb2NhbCwgZmFsc2UpOworCWllZWU4MDIxMV9vZmZjaGFubmVsX3N0b3Bfdmlmcyhsb2NhbCwgdHJ1ZSk7CiAKIAlpZWVlODAyMTFfY29uZmlndXJlX2ZpbHRlcihsb2NhbCk7CiAKQEAgLTM3Miw4ICszNTAsNyBAQAogCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOwogCiAJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yaygmbG9jYWwtPmh3LAotCQkJCSAgICAgJmxvY2FsLT5zY2FuX3dvcmssCi0JCQkJICAgICBJRUVFODAyMTFfQ0hBTk5FTF9USU1FKTsKKwkJCQkgICAgICZsb2NhbC0+c2Nhbl93b3JrLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTA5LDk4ICs0ODYsNDEgQEAKIAogCW5leHRfY2hhbiA9IGxvY2FsLT5zY2FuX3JlcS0+Y2hhbm5lbHNbbG9jYWwtPnNjYW5fY2hhbm5lbF9pZHhdOwogCi0JaWYgKGllZWU4MDIxMV9jZmdfb25fb3Blcl9jaGFubmVsKGxvY2FsKSkgewotCQkvKiBXZSdyZSBjdXJyZW50bHkgb24gb3BlcmF0aW5nIGNoYW5uZWwuICovCi0JCWlmIChuZXh0X2NoYW4gPT0gbG9jYWwtPm9wZXJfY2hhbm5lbCkKLQkJCS8qIFdlIGRvbid0IG5lZWQgdG8gbW92ZSBvZmYgb2Ygb3BlcmF0aW5nIGNoYW5uZWwuICovCi0JCQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9TRVRfQ0hBTk5FTDsKLQkJZWxzZQotCQkJLyoKLQkJCSAqIFdlIGRvIG5lZWQgdG8gbGVhdmUgb3BlcmF0aW5nIGNoYW5uZWwsIGFzIG5leHQKLQkJCSAqIHNjYW4gaXMgc29tZXdoZXJlIGVsc2UuCi0JCQkgKi8KLQkJCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX0xFQVZFX09QRVJfQ0hBTk5FTDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiB3ZSdyZSBjdXJyZW50bHkgc2Nhbm5pbmcgYSBkaWZmZXJlbnQgY2hhbm5lbCwgbGV0J3MKLQkJICogc2VlIGlmIHdlIGNhbiBzY2FuIGFub3RoZXIgY2hhbm5lbCB3aXRob3V0IGludGVyZmVyaW5nCi0JCSAqIHdpdGggdGhlIGN1cnJlbnQgdHJhZmZpYyBzaXR1YXRpb24uCi0JCSAqCi0JCSAqIFNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhlIEFQIGhhcyBwZW5kaW5nIGZyYW1lcyBmb3IgdXMKLQkJICogd2UgY2FuIG9ubHkgY2hlY2sgZm9yIG91ciB0eCBxdWV1ZXMgYW5kIHVzZSB0aGUgY3VycmVudAotCQkgKiBwbV9xb3MgcmVxdWlyZW1lbnRzIGZvciByeC4gSGVuY2UsIGlmIG5vIHR4IHRyYWZmaWMgb2NjdXJzCi0JCSAqIGF0IGFsbCB3ZSB3aWxsIHNjYW4gYXMgbWFueSBjaGFubmVscyBpbiBhIHJvdyBhcyB0aGUgcG1fcW9zCi0JCSAqIGxhdGVuY3kgYWxsb3dzIHVzIHRvLiBBZGRpdGlvbmFsbHkgd2UgYWxzbyBjaGVjayBmb3IgdGhlCi0JCSAqIGN1cnJlbnRseSBuZWdvdGlhdGVkIGxpc3RlbiBpbnRlcnZhbCB0byBwcmV2ZW50IGxvc2luZwotCQkgKiBmcmFtZXMgdW5uZWNlc3NhcmlseS4KLQkJICoKLQkJICogT3RoZXJ3aXNlIHN3aXRjaCBiYWNrIHRvIHRoZSBvcGVyYXRpbmcgY2hhbm5lbC4KLQkJICovCisJLyoKKwkgKiB3ZSdyZSBjdXJyZW50bHkgc2Nhbm5pbmcgYSBkaWZmZXJlbnQgY2hhbm5lbCwgbGV0J3MKKwkgKiBzZWUgaWYgd2UgY2FuIHNjYW4gYW5vdGhlciBjaGFubmVsIHdpdGhvdXQgaW50ZXJmZXJpbmcKKwkgKiB3aXRoIHRoZSBjdXJyZW50IHRyYWZmaWMgc2l0dWF0aW9uLgorCSAqCisJICogU2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgQVAgaGFzIHBlbmRpbmcgZnJhbWVzIGZvciB1cworCSAqIHdlIGNhbiBvbmx5IGNoZWNrIGZvciBvdXIgdHggcXVldWVzIGFuZCB1c2UgdGhlIGN1cnJlbnQKKwkgKiBwbV9xb3MgcmVxdWlyZW1lbnRzIGZvciByeC4gSGVuY2UsIGlmIG5vIHR4IHRyYWZmaWMgb2NjdXJzCisJICogYXQgYWxsIHdlIHdpbGwgc2NhbiBhcyBtYW55IGNoYW5uZWxzIGluIGEgcm93IGFzIHRoZSBwbV9xb3MKKwkgKiBsYXRlbmN5IGFsbG93cyB1cyB0by4gQWRkaXRpb25hbGx5IHdlIGFsc28gY2hlY2sgZm9yIHRoZQorCSAqIGN1cnJlbnRseSBuZWdvdGlhdGVkIGxpc3RlbiBpbnRlcnZhbCB0byBwcmV2ZW50IGxvc2luZworCSAqIGZyYW1lcyB1bm5lY2Vzc2FyaWx5LgorCSAqCisJICogT3RoZXJ3aXNlIHN3aXRjaCBiYWNrIHRvIHRoZSBvcGVyYXRpbmcgY2hhbm5lbC4KKwkgKi8KIAotCQliYWRfbGF0ZW5jeSA9IHRpbWVfYWZ0ZXIoamlmZmllcyArCi0JCQkJaWVlZTgwMjExX3NjYW5fZ2V0X2NoYW5uZWxfdGltZShuZXh0X2NoYW4pLAotCQkJCWxvY2FsLT5sZWF2ZV9vcGVyX2NoYW5uZWxfdGltZSArCi0JCQkJdXNlY3NfdG9famlmZmllcyhwbV9xb3NfcmVxdWVzdChQTV9RT1NfTkVUV09SS19MQVRFTkNZKSkpOworCWJhZF9sYXRlbmN5ID0gdGltZV9hZnRlcihqaWZmaWVzICsKKwkJCWllZWU4MDIxMV9zY2FuX2dldF9jaGFubmVsX3RpbWUobmV4dF9jaGFuKSwKKwkJCWxvY2FsLT5sZWF2ZV9vcGVyX2NoYW5uZWxfdGltZSArCisJCQl1c2Vjc190b19qaWZmaWVzKHBtX3Fvc19yZXF1ZXN0KFBNX1FPU19ORVRXT1JLX0xBVEVOQ1kpKSk7CiAKLQkJbGlzdGVuX2ludF9leGNlZWRlZCA9IHRpbWVfYWZ0ZXIoamlmZmllcyArCi0JCQkJaWVlZTgwMjExX3NjYW5fZ2V0X2NoYW5uZWxfdGltZShuZXh0X2NoYW4pLAotCQkJCWxvY2FsLT5sZWF2ZV9vcGVyX2NoYW5uZWxfdGltZSArCi0JCQkJdXNlY3NfdG9famlmZmllcyhtaW5fYmVhY29uX2ludCAqIDEwMjQpICoKLQkJCQlsb2NhbC0+aHcuY29uZi5saXN0ZW5faW50ZXJ2YWwpOworCWxpc3Rlbl9pbnRfZXhjZWVkZWQgPSB0aW1lX2FmdGVyKGppZmZpZXMgKworCQkJaWVlZTgwMjExX3NjYW5fZ2V0X2NoYW5uZWxfdGltZShuZXh0X2NoYW4pLAorCQkJbG9jYWwtPmxlYXZlX29wZXJfY2hhbm5lbF90aW1lICsKKwkJCXVzZWNzX3RvX2ppZmZpZXMobWluX2JlYWNvbl9pbnQgKiAxMDI0KSAqCisJCQlsb2NhbC0+aHcuY29uZi5saXN0ZW5faW50ZXJ2YWwpOwogCi0JCWlmIChhc3NvY2lhdGVkICYmICggIXR4X2VtcHR5IHx8IGJhZF9sYXRlbmN5IHx8Ci0JCSAgICBsaXN0ZW5faW50X2V4Y2VlZGVkKSkKLQkJCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX0VOVEVSX09QRVJfQ0hBTk5FTDsKLQkJZWxzZQotCQkJbG9jYWwtPm5leHRfc2Nhbl9zdGF0ZSA9IFNDQU5fU0VUX0NIQU5ORUw7Ci0JfQorCWlmIChhc3NvY2lhdGVkICYmICghdHhfZW1wdHkgfHwgYmFkX2xhdGVuY3kgfHwgbGlzdGVuX2ludF9leGNlZWRlZCkpCisJCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX1NVU1BFTkQ7CisJZWxzZQorCQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9TRVRfQ0hBTk5FTDsKIAogCSpuZXh0X2RlbGF5ID0gMDsKIH0KIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX3NjYW5fc3RhdGVfbGVhdmVfb3Blcl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm5leHRfZGVsYXkpCi17Ci0JLyogUFMgd2lsbCBhbHJlYWR5IGJlIGluIG9mZi1jaGFubmVsIG1vZGUsCi0JICogd2UgZG8gdGhhdCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgb2Ygc2Nhbm5pbmcuCi0JICovCi0JaWVlZTgwMjExX29mZmNoYW5uZWxfc3RvcF92aWZzKGxvY2FsLCBmYWxzZSk7Ci0KLQkvKgotCSAqIFdoYXQgaWYgdGhlIG51bGxmdW5jIGZyYW1lcyBkaWRuJ3QgYXJyaXZlPwotCSAqLwotCWRydl9mbHVzaChsb2NhbCwgZmFsc2UpOwotCWlmIChsb2NhbC0+b3BzLT5mbHVzaCkKLQkJKm5leHRfZGVsYXkgPSAwOwotCWVsc2UKLQkJKm5leHRfZGVsYXkgPSBIWiAvIDEwOwotCi0JLyogcmVtZW1iZXIgd2hlbiB3ZSBsZWZ0IHRoZSBvcGVyYXRpbmcgY2hhbm5lbCAqLwotCWxvY2FsLT5sZWF2ZV9vcGVyX2NoYW5uZWxfdGltZSA9IGppZmZpZXM7Ci0KLQkvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGNoYW5uZWwgdG8gYmUgc2Nhbm5lZCAqLwotCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX1NFVF9DSEFOTkVMOwotfQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc2Nhbl9zdGF0ZV9lbnRlcl9vcGVyX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZyAqbmV4dF9kZWxheSkKLXsKLQkvKiBzd2l0Y2ggYmFjayB0byB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgKi8KLQlsb2NhbC0+c2Nhbl9jaGFubmVsID0gTlVMTDsKLQlpZiAoIWllZWU4MDIxMV9jZmdfb25fb3Blcl9jaGFubmVsKGxvY2FsKSkKLQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpOwotCi0JLyoKLQkgKiBSZS1lbmFibGUgdmlmcyBhbmQgYmVhY29uaW5nLiAgTGVhdmUgUFMKLQkgKiBpbiBvZmYtY2hhbm5lbCBzdGF0ZS4ud2lsbCBwdXQgdGhhdCBiYWNrCi0JICogb24tY2hhbm5lbCBhdCB0aGUgZW5kIG9mIHNjYW5uaW5nLgotCSAqLwotCWllZWU4MDIxMV9vZmZjaGFubmVsX3JldHVybihsb2NhbCwgdHJ1ZSwgZmFsc2UpOwotCi0JKm5leHRfZGVsYXkgPSBIWiAvIDU7Ci0JbG9jYWwtPm5leHRfc2Nhbl9zdGF0ZSA9IFNDQU5fREVDSVNJT047Ci19Ci0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9zY2FuX3N0YXRlX3NldF9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKm5leHRfZGVsYXkpCiB7CkBAIC02MTIsMTAgKzUzMiw4IEBACiAKIAlsb2NhbC0+c2Nhbl9jaGFubmVsID0gY2hhbjsKIAotCS8qIE9ubHkgY2FsbCBody1jb25maWcgaWYgd2UgcmVhbGx5IG5lZWQgdG8gY2hhbmdlIGNoYW5uZWxzLiAqLwotCWlmIChjaGFuICE9IGxvY2FsLT5ody5jb25mLmNoYW5uZWwpCi0JCWlmIChpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkpCi0JCQlza2lwID0gMTsKKwlpZiAoaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpKQorCQlza2lwID0gMTsKIAogCS8qIGFkdmFuY2Ugc3RhdGUgbWFjaGluZSB0byBuZXh0IGNoYW5uZWwvYmFuZCAqLwogCWxvY2FsLT5zY2FuX2NoYW5uZWxfaWR4Kys7CkBAIC02NzIsNiArNTkwLDQ0IEBACiAJbG9jYWwtPm5leHRfc2Nhbl9zdGF0ZSA9IFNDQU5fREVDSVNJT047CiB9CiAKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zY2FuX3N0YXRlX3N1c3BlbmQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJCSB1bnNpZ25lZCBsb25nICpuZXh0X2RlbGF5KQoreworCS8qIHN3aXRjaCBiYWNrIHRvIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCAqLworCWxvY2FsLT5zY2FuX2NoYW5uZWwgPSBOVUxMOworCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKTsKKworCS8qCisJICogUmUtZW5hYmxlIHZpZnMgYW5kIGJlYWNvbmluZy4gIExlYXZlIFBTCisJICogaW4gb2ZmLWNoYW5uZWwgc3RhdGUuLndpbGwgcHV0IHRoYXQgYmFjaworCSAqIG9uLWNoYW5uZWwgYXQgdGhlIGVuZCBvZiBzY2FubmluZy4KKwkgKi8KKwlpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4obG9jYWwsIGZhbHNlKTsKKworCSpuZXh0X2RlbGF5ID0gSFogLyA1OworCS8qIGFmdGVyd2FyZHMsIHJlc3VtZSBzY2FuICYgZ28gdG8gbmV4dCBjaGFubmVsICovCisJbG9jYWwtPm5leHRfc2Nhbl9zdGF0ZSA9IFNDQU5fUkVTVU1FOworfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2Nhbl9zdGF0ZV9yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJCXVuc2lnbmVkIGxvbmcgKm5leHRfZGVsYXkpCit7CisJLyogUFMgYWxyZWFkeSBpcyBpbiBvZmYtY2hhbm5lbCBtb2RlICovCisJaWVlZTgwMjExX29mZmNoYW5uZWxfc3RvcF92aWZzKGxvY2FsLCBmYWxzZSk7CisKKwlpZiAobG9jYWwtPm9wcy0+Zmx1c2gpIHsKKwkJZHJ2X2ZsdXNoKGxvY2FsLCBmYWxzZSk7CisJCSpuZXh0X2RlbGF5ID0gMDsKKwl9IGVsc2UKKwkJKm5leHRfZGVsYXkgPSBIWiAvIDEwOworCisJLyogcmVtZW1iZXIgd2hlbiB3ZSBsZWZ0IHRoZSBvcGVyYXRpbmcgY2hhbm5lbCAqLworCWxvY2FsLT5sZWF2ZV9vcGVyX2NoYW5uZWxfdGltZSA9IGppZmZpZXM7CisKKwkvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGNoYW5uZWwgdG8gYmUgc2Nhbm5lZCAqLworCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX0RFQ0lTSU9OOworfQorCiB2b2lkIGllZWU4MDIxMV9zY2FuX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0KQEAgLTc0MiwxMSArNjk4LDExIEBACiAJCWNhc2UgU0NBTl9TRU5EX1BST0JFOgogCQkJaWVlZTgwMjExX3NjYW5fc3RhdGVfc2VuZF9wcm9iZShsb2NhbCwgJm5leHRfZGVsYXkpOwogCQkJYnJlYWs7Ci0JCWNhc2UgU0NBTl9MRUFWRV9PUEVSX0NIQU5ORUw6Ci0JCQlpZWVlODAyMTFfc2Nhbl9zdGF0ZV9sZWF2ZV9vcGVyX2NoYW5uZWwobG9jYWwsICZuZXh0X2RlbGF5KTsKKwkJY2FzZSBTQ0FOX1NVU1BFTkQ6CisJCQlpZWVlODAyMTFfc2Nhbl9zdGF0ZV9zdXNwZW5kKGxvY2FsLCAmbmV4dF9kZWxheSk7CiAJCQlicmVhazsKLQkJY2FzZSBTQ0FOX0VOVEVSX09QRVJfQ0hBTk5FTDoKLQkJCWllZWU4MDIxMV9zY2FuX3N0YXRlX2VudGVyX29wZXJfY2hhbm5lbChsb2NhbCwgJm5leHRfZGVsYXkpOworCQljYXNlIFNDQU5fUkVTVU1FOgorCQkJaWVlZTgwMjExX3NjYW5fc3RhdGVfcmVzdW1lKGxvY2FsLCAmbmV4dF9kZWxheSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKG5leHRfZGVsYXkgPT0gMCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCmluZGV4IDhlYWE3NDYuLmY5ODIzNTI2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYworKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwpAQCAtMzUxLDEwICszNTEsNiBAQAogCiAJaWYgKCFzdGEtPmR1bW15IHx8IGR1bW15X3JlaW5zZXJ0KSB7CiAJCS8qIG5vdGlmeSBkcml2ZXIgKi8KLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQotCQkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKLQkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLAotCQkJCQkgICAgIHUuYXApOwogCQllcnIgPSBkcnZfc3RhX2FkZChsb2NhbCwgc2RhdGEsICZzdGEtPnN0YSk7CiAJCWlmIChlcnIpIHsKIAkJCWlmICghYXN5bmMpCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uaCBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCmluZGV4IDhjOGNlMDUuLjFhMTRmYWIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCisrKyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCkBAIC0zMCw3ICszMCw2IEBACiAgKgl3aGVuIHZpcnR1YWwgcG9ydCBjb250cm9sIGlzIG5vdCBpbiB1c2UuCiAgKiBAV0xBTl9TVEFfU0hPUlRfUFJFQU1CTEU6IFN0YXRpb24gaXMgY2FwYWJsZSBvZiByZWNlaXZpbmcgc2hvcnQtcHJlYW1ibGUKICAqCWZyYW1lcy4KLSAqIEBXTEFOX1NUQV9BU1NPQ19BUDogV2UncmUgYXNzb2NpYXRlZCB0byB0aGF0IHN0YXRpb24sIGl0IGlzIGFuIEFQLgogICogQFdMQU5fU1RBX1dNRTogU3RhdGlvbiBpcyBhIFFvUy1TVEEuCiAgKiBAV0xBTl9TVEFfV0RTOiBTdGF0aW9uIGlzIG9uZSBvZiBvdXIgV0RTIHBlZXJzLgogICogQFdMQU5fU1RBX0NMRUFSX1BTX0ZJTFQ6IENsZWFyIFBTIGZpbHRlciBpbiBoYXJkd2FyZSAodXNpbmcgdGhlCkBAIC01Miw2ICs1MSw3IEBACiAgKgl1bmJsb2NrcyB0aGUgc3RhdGlvbi4KICAqIEBXTEFOX1NUQV9TUDogU3RhdGlvbiBpcyBpbiBhIHNlcnZpY2UgcGVyaW9kLCBzbyBkb24ndCB0cnkgdG8KICAqCXJlcGx5IHRvIG90aGVyIHVBUFNEIHRyaWdnZXIgZnJhbWVzIG9yIFBTLVBvbGwuCisgKiBAV0xBTl9TVEFfNEFERFJfRVZFTlQ6IDQtYWRkciBldmVudCB3YXMgYWxyZWFkeSBzZW50IGZvciB0aGlzIGZyYW1lLgogICovCiBlbnVtIGllZWU4MDIxMV9zdGFfaW5mb19mbGFncyB7CiAJV0xBTl9TVEFfQVVUSCwKQEAgLTU5LDcgKzU5LDYgQEAKIAlXTEFOX1NUQV9QU19TVEEsCiAJV0xBTl9TVEFfQVVUSE9SSVpFRCwKIAlXTEFOX1NUQV9TSE9SVF9QUkVBTUJMRSwKLQlXTEFOX1NUQV9BU1NPQ19BUCwKIAlXTEFOX1NUQV9XTUUsCiAJV0xBTl9TVEFfV0RTLAogCVdMQU5fU1RBX0NMRUFSX1BTX0ZJTFQsCkBAIC03MSw2ICs3MCw3IEBACiAJV0xBTl9TVEFfVERMU19QRUVSX0FVVEgsCiAJV0xBTl9TVEFfVUFQU0QsCiAJV0xBTl9TVEFfU1AsCisJV0xBTl9TVEFfNEFERFJfRVZFTlQsCiB9OwogCiAjZGVmaW5lIFNUQV9USURfTlVNIDE2CkBAIC04OCw2ICs4OCw3IEBACiAgKiBzdHJ1Y3QgdGlkX2FtcGR1X3R4IC0gVElEIGFnZ3JlZ2F0aW9uIGluZm9ybWF0aW9uIChUeCkuCiAgKgogICogQHJjdV9oZWFkOiByY3UgaGVhZCBmb3IgZnJlZWluZyBzdHJ1Y3R1cmUKKyAqIEBzZXNzaW9uX3RpbWVyOiBjaGVjayBpZiB3ZSBrZWVwIFR4LWluZyBvbiB0aGUgVElEIChieSB0aW1lb3V0IHZhbHVlKQogICogQGFkZGJhX3Jlc3BfdGltZXI6IHRpbWVyIGZvciBwZWVyJ3MgcmVzcG9uc2UgdG8gYWRkYmEgcmVxdWVzdAogICogQHBlbmRpbmc6IHBlbmRpbmcgZnJhbWVzIHF1ZXVlIC0tIHVzZSBzdGEncyBzcGlubG9jayB0byBwcm90ZWN0CiAgKiBAZGlhbG9nX3Rva2VuOiBkaWFsb2cgdG9rZW4gZm9yIGFnZ3JlZ2F0aW9uIHNlc3Npb24KQEAgLTExMCw2ICsxMTEsNyBAQAogICovCiBzdHJ1Y3QgdGlkX2FtcGR1X3R4IHsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CisJc3RydWN0IHRpbWVyX2xpc3Qgc2Vzc2lvbl90aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBhZGRiYV9yZXNwX3RpbWVyOwogCXN0cnVjdCBza19idWZmX2hlYWQgcGVuZGluZzsKIAl1bnNpZ25lZCBsb25nIHN0YXRlOwpAQCAtMzkwLDYgKzM5MiwxMiBAQAogCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoZmxhZywgJnN0YS0+X2ZsYWdzKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfc2V0X3N0YV9mbGFnKHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJCQllbnVtIGllZWU4MDIxMV9zdGFfaW5mb19mbGFncyBmbGFnKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KGZsYWcsICZzdGEtPl9mbGFncyk7Cit9CisKIHZvaWQgaWVlZTgwMjExX2Fzc2lnbl90aWRfdHgoc3RydWN0IHN0YV9pbmZvICpzdGEsIGludCB0aWQsCiAJCQkgICAgIHN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eCk7CiAKQEAgLTQ5MSw3ICs0OTksNiBAQAogICovCiBpbnQgc3RhX2luZm9faW5zZXJ0KHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKIGludCBzdGFfaW5mb19pbnNlcnRfcmN1KHN0cnVjdCBzdGFfaW5mbyAqc3RhKSBfX2FjcXVpcmVzKFJDVSk7Ci1pbnQgc3RhX2luZm9faW5zZXJ0X2F0b21pYyhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CiBpbnQgc3RhX2luZm9fcmVpbnNlcnQoc3RydWN0IHN0YV9pbmZvICpzdGEpOwogCiBpbnQgc3RhX2luZm9fZGVzdHJveV9hZGRyKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YXR1cy5jIGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCmluZGV4IDU1MzNhNzQuLjQ2MjIyY2UgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGF0dXMuYworKysgYi9uZXQvbWFjODAyMTEvc3RhdHVzLmMKQEAgLTksNiArOSw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKICNpbmNsdWRlICJyYXRlLmgiCkBAIC01MTYsMjcgKzUxNyw1NCBAQAogCX0KIAogCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9JTlRGTF9OTDgwMjExX0ZSQU1FX1RYKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfd29yayAqd2s7CiAJCXU2NCBjb29raWUgPSAodW5zaWduZWQgbG9uZylza2I7CiAKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh3aywgJmxvY2FsLT53b3JrX2xpc3QsIGxpc3QpIHsKLQkJCWlmICh3ay0+dHlwZSAhPSBJRUVFODAyMTFfV09SS19PRkZDSEFOTkVMX1RYKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHdrLT5vZmZjaGFuX3R4LmZyYW1lICE9IHNrYikKLQkJCQljb250aW51ZTsKLQkJCXdrLT5vZmZjaGFuX3R4LnN0YXR1cyA9IHRydWU7Ci0JCQlicmVhazsKLQkJfQotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKGxvY2FsLT5od19yb2Nfc2tiX2Zvcl9zdGF0dXMgPT0gc2tiKSB7Ci0JCQljb29raWUgPSBsb2NhbC0+aHdfcm9jX2Nvb2tpZSBeIDI7Ci0JCQlsb2NhbC0+aHdfcm9jX3NrYl9mb3Jfc3RhdHVzID0gTlVMTDsKLQkJfQorCQlpZiAoaWVlZTgwMjExX2lzX251bGxmdW5jKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKKwkJICAgIGllZWU4MDIxMV9pc19xb3NfbnVsbGZ1bmMoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQkJYm9vbCBhY2tlZCA9IGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLOworCQkJY2ZnODAyMTFfcHJvYmVfc3RhdHVzKHNrYi0+ZGV2LCBoZHItPmFkZHIxLAorCQkJCQkgICAgICBjb29raWUsIGFja2VkLCBHRlBfQVRPTUlDKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBpZWVlODAyMTFfd29yayAqd2s7CiAKLQkJY2ZnODAyMTFfbWdtdF90eF9zdGF0dXMoCi0JCQlza2ItPmRldiwgY29va2llLCBza2ItPmRhdGEsIHNrYi0+bGVuLAotCQkJISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spLCBHRlBfQVRPTUlDKTsKKwkJCXJjdV9yZWFkX2xvY2soKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHdrLCAmbG9jYWwtPndvcmtfbGlzdCwgbGlzdCkgeworCQkJCWlmICh3ay0+dHlwZSAhPSBJRUVFODAyMTFfV09SS19PRkZDSEFOTkVMX1RYKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAod2stPm9mZmNoYW5fdHguZnJhbWUgIT0gc2tiKQorCQkJCQljb250aW51ZTsKKwkJCQl3ay0+b2ZmY2hhbl90eC5zdGF0dXMgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlpZiAobG9jYWwtPmh3X3JvY19za2JfZm9yX3N0YXR1cyA9PSBza2IpIHsKKwkJCQljb29raWUgPSBsb2NhbC0+aHdfcm9jX2Nvb2tpZSBeIDI7CisJCQkJbG9jYWwtPmh3X3JvY19za2JfZm9yX3N0YXR1cyA9IE5VTEw7CisJCQl9CisKKwkJCWNmZzgwMjExX21nbXRfdHhfc3RhdHVzKAorCQkJCXNrYi0+ZGV2LCBjb29raWUsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spLAorCQkJCUdGUF9BVE9NSUMpOworCQl9CisJfQorCisJaWYgKHVubGlrZWx5KGluZm8tPmFja19mcmFtZV9pZCkpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5hY2tfc3RhdHVzX2xvY2ssIGZsYWdzKTsKKwkJYWNrX3NrYiA9IGlkcl9maW5kKCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMsCisJCQkJICAgaW5mby0+YWNrX2ZyYW1lX2lkKTsKKwkJaWYgKGFja19za2IpCisJCQlpZHJfcmVtb3ZlKCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMsCisJCQkJICAgaW5mby0+YWNrX2ZyYW1lX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmFja19zdGF0dXNfbG9jaywgZmxhZ3MpOworCisJCS8qIGNvbnN1bWVzIGFja19za2IgKi8KKwkJaWYgKGFja19za2IpCisJCQlza2JfY29tcGxldGVfd2lmaV9hY2soYWNrX3NrYiwKKwkJCQlpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSyk7CiAJfQogCiAJLyogdGhpcyB3YXMgYSB0cmFuc21pdHRlZCBmcmFtZSwgYnV0IG5vdyB3ZSB3YW50IHRvIHJldXNlIGl0ICovCkBAIC02MDksMyArNjM3LDI5IEBACiAJCQkJICAgIG51bV9wYWNrZXRzLCBHRlBfQVRPTUlDKTsKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3JlcG9ydF9sb3dfYWNrKTsKKwordm9pZCBpZWVlODAyMTFfZnJlZV90eHNrYihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisKKwlpZiAodW5saWtlbHkoaW5mby0+YWNrX2ZyYW1lX2lkKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPmFja19zdGF0dXNfbG9jaywgZmxhZ3MpOworCQlhY2tfc2tiID0gaWRyX2ZpbmQoJmxvY2FsLT5hY2tfc3RhdHVzX2ZyYW1lcywKKwkJCQkgICBpbmZvLT5hY2tfZnJhbWVfaWQpOworCQlpZiAoYWNrX3NrYikKKwkJCWlkcl9yZW1vdmUoJmxvY2FsLT5hY2tfc3RhdHVzX2ZyYW1lcywKKwkJCQkgICBpbmZvLT5hY2tfZnJhbWVfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+YWNrX3N0YXR1c19sb2NrLCBmbGFncyk7CisKKwkJLyogY29uc3VtZXMgYWNrX3NrYiAqLworCQlpZiAoYWNrX3NrYikKKwkJCWRldl9rZnJlZV9za2JfYW55KGFja19za2IpOworCX0KKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9mcmVlX3R4c2tiKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90a2lwLmMgYi9uZXQvbWFjODAyMTEvdGtpcC5jCmluZGV4IGY0OWQwMGEuLjUxMDc3YTkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90a2lwLmMKKysrIGIvbmV0L21hYzgwMjExL3RraXAuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHguYyBiL25ldC9tYWM4MDIxMS90eC5jCmluZGV4IDQ4YmJiOTYuLmM0Y2I0YTUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90eC5jCisrKyBiL25ldC9tYWM4MDIxMS90eC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgpAQCAtMzUsNyArMzYsOCBAQAogCiAvKiBtaXNjIHV0aWxzICovCiAKLXN0YXRpYyBfX2xlMTYgaWVlZTgwMjExX2R1cmF0aW9uKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgsIGludCBncm91cF9hZGRyLAorc3RhdGljIF9fbGUxNiBpZWVlODAyMTFfZHVyYXRpb24oc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdyb3VwX2FkZHIsCiAJCQkJIGludCBuZXh0X2ZyYWdfbGVuKQogewogCWludCByYXRlLCBtcmF0ZSwgZXJwLCBkdXIsIGk7CkBAIC00Myw3ICs0NSw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB0eC0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4LT5za2IpOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAogCS8qIGFzc3VtZSBIVyBoYW5kbGVzIHRoaXMgKi8KIAlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpCkBAIC03NSw3ICs3Nyw3IEBACiAJICogICBhdCB0aGUgaGlnaGVzdCBwb3NzaWJsZSByYXRlIGJlbG9uZ2luZyB0byB0aGUgUEhZIHJhdGVzIGluIHRoZQogCSAqICAgQlNTQmFzaWNSYXRlU2V0CiAJICovCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHgtPnNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJaWYgKGllZWU4MDIxMV9pc19jdGwoaGRyLT5mcmFtZV9jb250cm9sKSkgewogCQkvKiBUT0RPOiBUaGVzZSBjb250cm9sIGZyYW1lcyBhcmUgbm90IGN1cnJlbnRseSBzZW50IGJ5CiAJCSAqIG1hYzgwMjExLCBidXQgc2hvdWxkIHRoZXkgYmUgaW1wbGVtZW50ZWQsIHRoaXMgZnVuY3Rpb24KQEAgLTE0OSwxMSArMTUxLDE1IEBACiAJCXJhdGUgPSBtcmF0ZTsKIAl9CiAKLQkvKiBUaW1lIG5lZWRlZCB0byB0cmFuc21pdCBBQ0sKLQkgKiAoMTAgYnl0ZXMgKyA0LWJ5dGUgRkNTID0gMTEyIGJpdHMpIHBsdXMgU0lGUzsgcm91bmRlZCB1cAotCSAqIHRvIGNsb3Nlc3QgaW50ZWdlciAqLwotCi0JZHVyID0gaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKGxvY2FsLCAxMCwgcmF0ZSwgZXJwLAorCS8qIERvbid0IGNhbGN1bGF0ZSBBQ0tzIGZvciBRb1MgRnJhbWVzIHdpdGggTm9BY2sgUG9saWN5IHNldCAqLworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSAmJgorCSAgICAqKGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpKSB8IElFRUU4MDIxMV9RT1NfQ1RMX0FDS19QT0xJQ1lfTk9BQ0spCisJCWR1ciA9IDA7CisJZWxzZQorCQkvKiBUaW1lIG5lZWRlZCB0byB0cmFuc21pdCBBQ0sKKwkJICogKDEwIGJ5dGVzICsgNC1ieXRlIEZDUyA9IDExMiBiaXRzKSBwbHVzIFNJRlM7IHJvdW5kZWQgdXAKKwkJICogdG8gY2xvc2VzdCBpbnRlZ2VyICovCisJCWR1ciA9IGllZWU4MDIxMV9mcmFtZV9kdXJhdGlvbihsb2NhbCwgMTAsIHJhdGUsIGVycCwKIAkJCQl0eC0+c2RhdGEtPnZpZi5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpOwogCiAJaWYgKG5leHRfZnJhZ19sZW4pIHsKQEAgLTU3MSw4ICs1NzcsNiBAQAogCQlzd2l0Y2ggKHR4LT5rZXktPmNvbmYuY2lwaGVyKSB7CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkJaWYgKGllZWU4MDIxMV9pc19hdXRoKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKIAkJCWlmICghaWVlZTgwMjExX2lzX2RhdGFfcHJlc2VudChoZHItPmZyYW1lX2NvbnRyb2wpKQogCQkJCXR4LT5rZXkgPSBOVUxMOwpAQCAtNjM2LDYgKzY0MCw3IEBACiAJZWxzZQogCQl0eHJjLm1heF9yYXRlX2lkeCA9IGZscyh0eHJjLnJhdGVfaWR4X21hc2spIC0gMTsKIAl0eHJjLmJzcyA9ICh0eC0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CisJCSAgICB0eC0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQgfHwKIAkJICAgIHR4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpOwogCiAJLyogc2V0IHVwIFJUUyBwcm90ZWN0aW9uIGlmIGRlc2lyZWQgKi8KQEAgLTg0MywxMSArODQ4LDEzIEBACiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQogCi1zdGF0aWMgaW50IGllZWU4MDIxMV9mcmFnbWVudChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2ZyYWdtZW50KHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgsCiAJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRybGVuLAogCQkJICAgICAgaW50IGZyYWdfdGhyZXNob2xkKQogewotCXN0cnVjdCBza19idWZmICp0YWlsID0gc2tiLCAqdG1wOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gdHgtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdG1wOwogCWludCBwZXJfZnJhZ20gPSBmcmFnX3RocmVzaG9sZCAtIGhkcmxlbiAtIEZDU19MRU47CiAJaW50IHBvcyA9IGhkcmxlbiArIHBlcl9mcmFnbTsKIAlpbnQgcmVtID0gc2tiLT5sZW4gLSBoZHJsZW4gLSBwZXJfZnJhZ207CkBAIC04NTUsNiArODYyLDggQEAKIAlpZiAoV0FSTl9PTihyZW0gPCAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBmaXJzdCBmcmFnbWVudCB3YXMgYWxyZWFkeSBhZGRlZCB0byBxdWV1ZSBieSBjYWxsZXIgKi8KKwogCXdoaWxlIChyZW0pIHsKIAkJaW50IGZyYWdsZW4gPSBwZXJfZnJhZ207CiAKQEAgLTg2NywxMiArODc2LDIxIEBACiAJCQkJICAgIElFRUU4MDIxMV9FTkNSWVBUX1RBSUxST09NKTsKIAkJaWYgKCF0bXApCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJdGFpbC0+bmV4dCA9IHRtcDsKLQkJdGFpbCA9IHRtcDsKKworCQlfX3NrYl9xdWV1ZV90YWlsKCZ0eC0+c2ticywgdG1wKTsKKwogCQlza2JfcmVzZXJ2ZSh0bXAsIGxvY2FsLT50eF9oZWFkcm9vbSArCiAJCQkJIElFRUU4MDIxMV9FTkNSWVBUX0hFQURST09NKTsKIAkJLyogY29weSBjb250cm9sIGluZm9ybWF0aW9uICovCiAJCW1lbWNweSh0bXAtPmNiLCBza2ItPmNiLCBzaXplb2YodG1wLT5jYikpOworCisJCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHRtcCk7CisJCWluZm8tPmZsYWdzICY9IH4oSUVFRTgwMjExX1RYX0NUTF9DTEVBUl9QU19GSUxUIHwKKwkJCQkgSUVFRTgwMjExX1RYX0NUTF9GSVJTVF9GUkFHTUVOVCk7CisKKwkJaWYgKHJlbSkKKwkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfTU9SRV9GUkFNRVM7CisKIAkJc2tiX2NvcHlfcXVldWVfbWFwcGluZyh0bXAsIHNrYik7CiAJCXRtcC0+cHJpb3JpdHkgPSBza2ItPnByaW9yaXR5OwogCQl0bXAtPmRldiA9IHNrYi0+ZGV2OwpAQCAtODg0LDYgKzkwMiw3IEBACiAJCXBvcyArPSBmcmFnbGVuOwogCX0KIAorCS8qIGFkanVzdCBmaXJzdCBmcmFnbWVudCdzIGxlbmd0aCAqLwogCXNrYi0+bGVuID0gaGRybGVuICsgcGVyX2ZyYWdtOwogCXJldHVybiAwOwogfQpAQCAtODk4LDYgKzkxNywxMCBAQAogCWludCBoZHJsZW47CiAJaW50IGZyYWdudW07CiAKKwkvKiBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zLCB0eC0+c2tiIG1vdmVzIHRvIHR4LT5za2JzICovCisJX19za2JfcXVldWVfdGFpbCgmdHgtPnNrYnMsIHNrYik7CisJdHgtPnNrYiA9IE5VTEw7CisKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0RPTlRGUkFHKQogCQlyZXR1cm4gVFhfQ09OVElOVUU7CiAKQEAgLTkyNiwyMSArOTQ5LDIxIEBACiAJICogb2YgdGhlIGZyYWdtZW50cyB0aGVuIHdlIHdpbGwgc2ltcGx5IHByZXRlbmQgdG8gYWNjZXB0IHRoZSBza2IKIAkgKiBidXQgc3RvcmUgaXQgYXdheSBhcyBwZW5kaW5nLgogCSAqLwotCWlmIChpZWVlODAyMTFfZnJhZ21lbnQodHgtPmxvY2FsLCBza2IsIGhkcmxlbiwgZnJhZ190aHJlc2hvbGQpKQorCWlmIChpZWVlODAyMTFfZnJhZ21lbnQodHgsIHNrYiwgaGRybGVuLCBmcmFnX3RocmVzaG9sZCkpCiAJCXJldHVybiBUWF9EUk9QOwogCiAJLyogdXBkYXRlIGR1cmF0aW9uL3NlcS9mbGFncyBvZiBmcmFnbWVudHMgKi8KIAlmcmFnbnVtID0gMDsKLQlkbyB7CisKKwlza2JfcXVldWVfd2FsaygmdHgtPnNrYnMsIHNrYikgewogCQlpbnQgbmV4dF9sZW47CiAJCWNvbnN0IF9fbGUxNiBtb3JlZnJhZ3MgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpOwogCiAJCWhkciA9ICh2b2lkICopc2tiLT5kYXRhOwogCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCi0JCWlmIChza2ItPm5leHQpIHsKKwkJaWYgKCFza2JfcXVldWVfaXNfbGFzdCgmdHgtPnNrYnMsIHNrYikpIHsKIAkJCWhkci0+ZnJhbWVfY29udHJvbCB8PSBtb3JlZnJhZ3M7Ci0JCQluZXh0X2xlbiA9IHNrYi0+bmV4dC0+bGVuOwogCQkJLyoKIAkJCSAqIE5vIG11bHRpLXJhdGUgcmV0cmllcyBmb3IgZnJhZ21lbnRlZCBmcmFtZXMsIHRoYXQKIAkJCSAqIHdvdWxkIGNvbXBsZXRlbHkgdGhyb3cgb2ZmIHRoZSBOQVYgYXQgb3RoZXIgU1RBcy4KQEAgLTk1NSwxMCArOTc4LDkgQEAKIAkJCWhkci0+ZnJhbWVfY29udHJvbCAmPSB+bW9yZWZyYWdzOwogCQkJbmV4dF9sZW4gPSAwOwogCQl9Ci0JCWhkci0+ZHVyYXRpb25faWQgPSBpZWVlODAyMTFfZHVyYXRpb24odHgsIDAsIG5leHRfbGVuKTsKIAkJaGRyLT5zZXFfY3RybCB8PSBjcHVfdG9fbGUxNihmcmFnbnVtICYgSUVFRTgwMjExX1NDVExfRlJBRyk7CiAJCWZyYWdudW0rKzsKLQl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CisJfQogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQpAQCAtOTY2LDE2ICs5ODgsMTYgQEAKIHN0YXRpYyBpZWVlODAyMTFfdHhfcmVzdWx0IGRlYnVnX25vaW5saW5lCiBpZWVlODAyMTFfdHhfaF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSB0eC0+c2tiOworCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlpZiAoIXR4LT5zdGEpCiAJCXJldHVybiBUWF9DT05USU5VRTsKIAogCXR4LT5zdGEtPnR4X3BhY2tldHMrKzsKLQlkbyB7CisJc2tiX3F1ZXVlX3dhbGsoJnR4LT5za2JzLCBza2IpIHsKIAkJdHgtPnN0YS0+dHhfZnJhZ21lbnRzKys7CiAJCXR4LT5zdGEtPnR4X2J5dGVzICs9IHNrYi0+bGVuOwotCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKwl9CiAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CkBAIC0xMDE0LDIxICsxMDM2LDI1IEBACiBzdGF0aWMgaWVlZTgwMjExX3R4X3Jlc3VsdCBkZWJ1Z19ub2lubGluZQogaWVlZTgwMjExX3R4X2hfY2FsY3VsYXRlX2R1cmF0aW9uKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4LT5za2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCWludCBuZXh0X2xlbjsKIAlib29sIGdyb3VwX2FkZHI7CiAKLQlkbyB7CisJc2tiX3F1ZXVlX3dhbGsoJnR4LT5za2JzLCBza2IpIHsKIAkJaGRyID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCQlpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX3BzcG9sbChoZHItPmZyYW1lX2NvbnRyb2wpKSkKIAkJCWJyZWFrOyAvKiBtdXN0IG5vdCBvdmVyd3JpdGUgQUlEICovCi0JCW5leHRfbGVuID0gc2tiLT5uZXh0ID8gc2tiLT5uZXh0LT5sZW4gOiAwOworCQlpZiAoIXNrYl9xdWV1ZV9pc19sYXN0KCZ0eC0+c2ticywgc2tiKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBza2JfcXVldWVfbmV4dCgmdHgtPnNrYnMsIHNrYik7CisJCQluZXh0X2xlbiA9IG5leHQtPmxlbjsKKwkJfSBlbHNlCisJCQluZXh0X2xlbiA9IDA7CiAJCWdyb3VwX2FkZHIgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKTsKIAogCQloZHItPmR1cmF0aW9uX2lkID0KLQkJCWllZWU4MDIxMV9kdXJhdGlvbih0eCwgZ3JvdXBfYWRkciwgbmV4dF9sZW4pOwotCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKwkJCWllZWU4MDIxMV9kdXJhdGlvbih0eCwgc2tiLCBncm91cF9hZGRyLCBuZXh0X2xlbik7CisJfQogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQpAQCAtMTA0Miw5ICsxMDY4LDExIEBACiAJCQkJICBpbnQgdGlkKQogewogCWJvb2wgcXVldWVkID0gZmFsc2U7CisJYm9vbCByZXNldF9hZ2dfdGltZXIgPSBmYWxzZTsKIAogCWlmICh0ZXN0X2JpdChIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUwsICZ0aWRfdHgtPnN0YXRlKSkgewogCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX0FNUERVOworCQlyZXNldF9hZ2dfdGltZXIgPSB0cnVlOwogCX0gZWxzZSBpZiAodGVzdF9iaXQoSFRfQUdHX1NUQVRFX1dBTlRfU1RBUlQsICZ0aWRfdHgtPnN0YXRlKSkgewogCQkvKgogCQkgKiBub3RoaW5nIC0tIHRoaXMgYWdncmVnYXRpb24gc2Vzc2lvbiBpcyBiZWluZyBzdGFydGVkCkBAIC0xMDc2LDYgKzExMDQsNyBAQAogCQkJLyogZG8gbm90aGluZywgbGV0IHBhY2tldCBwYXNzIHRocm91Z2ggKi8KIAkJfSBlbHNlIGlmICh0ZXN0X2JpdChIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUwsICZ0aWRfdHgtPnN0YXRlKSkgewogCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9BTVBEVTsKKwkJCXJlc2V0X2FnZ190aW1lciA9IHRydWU7CiAJCX0gZWxzZSB7CiAJCQlxdWV1ZWQgPSB0cnVlOwogCQkJaW5mby0+Y29udHJvbC52aWYgPSAmdHgtPnNkYXRhLT52aWY7CkBAIC0xMDg1LDYgKzExMTQsMTEgQEAKIAkJc3Bpbl91bmxvY2soJnR4LT5zdGEtPmxvY2spOwogCX0KIAorCS8qIHJlc2V0IHNlc3Npb24gdGltZXIgKi8KKwlpZiAocmVzZXRfYWdnX3RpbWVyICYmIHRpZF90eC0+dGltZW91dCkKKwkJbW9kX3RpbWVyKCZ0aWRfdHgtPnNlc3Npb25fdGltZXIsCisJCQkgIFRVX1RPX0VYUF9USU1FKHRpZF90eC0+dGltZW91dCkpOworCiAJcmV0dXJuIHF1ZXVlZDsKIH0KIApAQCAtMTEwNyw2ICsxMTQxLDcgQEAKIAl0eC0+bG9jYWwgPSBsb2NhbDsKIAl0eC0+c2RhdGEgPSBzZGF0YTsKIAl0eC0+Y2hhbm5lbCA9IGxvY2FsLT5ody5jb25mLmNoYW5uZWw7CisJX19za2JfcXVldWVfaGVhZF9pbml0KCZ0eC0+c2ticyk7CiAKIAkvKgogCSAqIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSBhbnl3aGVyZSwgYW5kIHdlIGdldCBoZXJlLApAQCAtMTE1MSwxNiArMTE4Niw4IEBACiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKSB7CiAJCXR4LT5mbGFncyAmPSB+SUVFRTgwMjExX1RYX1VOSUNBU1Q7CiAJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfTk9fQUNLOwotCX0gZWxzZSB7CisJfSBlbHNlCiAJCXR4LT5mbGFncyB8PSBJRUVFODAyMTFfVFhfVU5JQ0FTVDsKLQkJaWYgKHVubGlrZWx5KGxvY2FsLT53aWZpX3dtZV9ub2Fja190ZXN0KSkKLQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfTk9fQUNLOwotCQkvKgotCQkgKiBGbGFncyBhcmUgaW5pdGlhbGl6ZWQgdG8gMC4gSGVuY2UsIG5vIG5lZWQgdG8KLQkJICogZXhwbGljaXRseSB1bnNldCBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSyBzaW5jZQotCQkgKiBpdCBtaWdodCBhbHJlYWR5IGJlIHNldCBmb3IgaW5qZWN0ZWQgZnJhbWVzLgotCQkgKi8KLQl9CiAKIAlpZiAoIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfRE9OVEZSQUcpKSB7CiAJCWlmICghKHR4LT5mbGFncyAmIElFRUU4MDIxMV9UWF9VTklDQVNUKSB8fApAQCAtMTE3OSwyMiArMTIwNiwxOCBAQAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KIAotLyoKLSAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGZyYW1lIGNvdWxkbid0IGJlIHRyYW5zbWl0dGVkIGJ1dCB3YXMgcXVldWVkIGluc3RlYWQuCi0gKi8KLXN0YXRpYyBib29sIF9faWVlZTgwMjExX3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnAsCi0JCQkgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgYm9vbCB0eHBlbmRpbmcpCitzdGF0aWMgYm9vbCBpZWVlODAyMTFfdHhfZnJhZ3Moc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMsCisJCQkgICAgICAgYm9vbCB0eHBlbmRpbmcpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JwLCAqbmV4dDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBsZW47Ci0JYm9vbCBmcmFnbSA9IGZhbHNlOwogCi0Jd2hpbGUgKHNrYikgeworCXNrYl9xdWV1ZV93YWxrX3NhZmUoc2ticywgc2tiLCB0bXApIHsKIAkJaW50IHEgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKLQkJX19sZTE2IGZjOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+cXVldWVfc3RvcF9yZWFzb25fbG9jaywgZmxhZ3MpOwogCQlpZiAobG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uc1txXSB8fApAQCAtMTIwNCwyNCArMTIyNywxMSBAQAogCQkJICogdHJhbnNtaXNzaW9uIGZyb20gdGhlIHR4LXBlbmRpbmcgdGFza2xldCB3aGVuIHRoZQogCQkJICogcXVldWUgaXMgd29rZW4gYWdhaW4uCiAJCQkgKi8KLQotCQkJZG8gewotCQkJCW5leHQgPSBza2ItPm5leHQ7Ci0JCQkJc2tiLT5uZXh0ID0gTlVMTDsKLQkJCQkvKgotCQkJCSAqIE5COiBJZiB0eHBlbmRpbmcgaXMgdHJ1ZSwgbmV4dCBtdXN0IGFscmVhZHkKLQkJCQkgKiBiZSBOVUxMIHNpbmNlIHdlIG11c3QndmUgZ29uZSB0aHJvdWdoIHRoaXMKLQkJCQkgKiBsb29wIGJlZm9yZSBhbHJlYWR5OyB0aGVyZWZvcmUgd2UgY2FuIGp1c3QKLQkJCQkgKiBxdWV1ZSB0aGUgZnJhbWUgdG8gdGhlIGhlYWQgd2l0aG91dCB3b3JyeWluZwotCQkJCSAqIGFib3V0IHJlb3JkZXJpbmcgb2YgZnJhZ21lbnRzLgotCQkJCSAqLwotCQkJCWlmICh1bmxpa2VseSh0eHBlbmRpbmcpKQotCQkJCQlfX3NrYl9xdWV1ZV9oZWFkKCZsb2NhbC0+cGVuZGluZ1txXSwKLQkJCQkJCQkgc2tiKTsKLQkJCQllbHNlCi0JCQkJCV9fc2tiX3F1ZXVlX3RhaWwoJmxvY2FsLT5wZW5kaW5nW3FdLAotCQkJCQkJCSBza2IpOwotCQkJfSB3aGlsZSAoKHNrYiA9IG5leHQpKTsKKwkJCWlmICh0eHBlbmRpbmcpCisJCQkJc2tiX3F1ZXVlX3NwbGljZV9pbml0KHNrYnMsICZsb2NhbC0+cGVuZGluZ1txXSk7CisJCQllbHNlCisJCQkJc2tiX3F1ZXVlX3NwbGljZV90YWlsX2luaXQoc2ticywKKwkJCQkJCQkgICAmbG9jYWwtPnBlbmRpbmdbcV0pOwogCiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+cXVldWVfc3RvcF9yZWFzb25fbG9jaywKIAkJCQkJICAgICAgIGZsYWdzKTsKQEAgLTEyMzAsNTcgKzEyNDAsODEgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssIGZsYWdzKTsKIAogCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCQlpbmZvLT5jb250cm9sLnZpZiA9IHZpZjsKKwkJaW5mby0+Y29udHJvbC5zdGEgPSBzdGE7CiAKLQkJaWYgKGZyYWdtKQotCQkJaW5mby0+ZmxhZ3MgJj0gfihJRUVFODAyMTFfVFhfQ1RMX0NMRUFSX1BTX0ZJTFQgfAotCQkJCQkgSUVFRTgwMjExX1RYX0NUTF9GSVJTVF9GUkFHTUVOVCk7Ci0KLQkJbmV4dCA9IHNrYi0+bmV4dDsKLQkJbGVuID0gc2tiLT5sZW47Ci0KLQkJaWYgKG5leHQpCi0JCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX01PUkVfRlJBTUVTOwotCi0JCXNkYXRhID0gdmlmX3RvX3NkYXRhKGluZm8tPmNvbnRyb2wudmlmKTsKLQotCQlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewotCQljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6Ci0JCQlpbmZvLT5jb250cm9sLnZpZiA9IE5VTEw7Ci0JCQlicmVhazsKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgotCQkJaW5mby0+Y29udHJvbC52aWYgPSAmY29udGFpbmVyX29mKHNkYXRhLT5ic3MsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwgdS5hcCktPnZpZjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyoga2VlcCAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoc3RhICYmIHN0YS0+dXBsb2FkZWQpCi0JCQlpbmZvLT5jb250cm9sLnN0YSA9ICZzdGEtPnN0YTsKLQkJZWxzZQotCQkJaW5mby0+Y29udHJvbC5zdGEgPSBOVUxMOwotCi0JCWZjID0gKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YSktPmZyYW1lX2NvbnRyb2w7CisJCV9fc2tiX3VubGluayhza2IsIHNrYnMpOwogCQlkcnZfdHgobG9jYWwsIHNrYik7Ci0KLQkJaWVlZTgwMjExX3RwdF9sZWRfdHJpZ190eChsb2NhbCwgZmMsIGxlbik7Ci0JCSpza2JwID0gc2tiID0gbmV4dDsKLQkJaWVlZTgwMjExX2xlZF90eChsb2NhbCwgMSk7Ci0JCWZyYWdtID0gdHJ1ZTsKIAl9CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoKKyAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGZyYW1lIGNvdWxkbid0IGJlIHRyYW5zbWl0dGVkIGJ1dCB3YXMgcXVldWVkIGluc3RlYWQuCisgKi8KK3N0YXRpYyBib29sIF9faWVlZTgwMjExX3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2ticywgaW50IGxlZF9sZW4sCisJCQkgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgYm9vbCB0eHBlbmRpbmcpCit7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnB1YnN0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWJvb2wgcmVzdWx0ID0gdHJ1ZTsKKwlfX2xlMTYgZmM7CisKKwlpZiAoV0FSTl9PTihza2JfcXVldWVfZW1wdHkoc2ticykpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXNrYiA9IHNrYl9wZWVrKHNrYnMpOworCWZjID0gKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YSktPmZyYW1lX2NvbnRyb2w7CisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzZGF0YSA9IHZpZl90b19zZGF0YShpbmZvLT5jb250cm9sLnZpZik7CisJaWYgKHN0YSAmJiAhc3RhLT51cGxvYWRlZCkKKwkJc3RhID0gTlVMTDsKKworCWlmIChzdGEpCisJCXB1YnN0YSA9ICZzdGEtPnN0YTsKKwllbHNlCisJCXB1YnN0YSA9IE5VTEw7CisKKwlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwkJc2RhdGEgPSBOVUxMOworCQl2aWYgPSBOVUxMOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CisJCXNkYXRhID0gY29udGFpbmVyX29mKHNkYXRhLT5ic3MsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLCB1LmFwKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJdmlmID0gJnNkYXRhLT52aWY7CisJCWJyZWFrOworCX0KKworCWlmIChsb2NhbC0+b3BzLT50eF9mcmFncykKKwkJZHJ2X3R4X2ZyYWdzKGxvY2FsLCB2aWYsIHB1YnN0YSwgc2ticyk7CisJZWxzZQorCQlyZXN1bHQgPSBpZWVlODAyMTFfdHhfZnJhZ3MobG9jYWwsIHZpZiwgcHVic3RhLCBza2JzLAorCQkJCQkgICAgdHhwZW5kaW5nKTsKKworCWllZWU4MDIxMV90cHRfbGVkX3RyaWdfdHgobG9jYWwsIGZjLCBsZWRfbGVuKTsKKwlpZWVlODAyMTFfbGVkX3R4KGxvY2FsLCAxKTsKKworCVdBUk5fT05fT05DRSghc2tiX3F1ZXVlX2VtcHR5KHNrYnMpKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCiAgKiBJbnZva2UgVFggaGFuZGxlcnMsIHJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIG5vbi16ZXJvIGlmIHRoZQogICogZnJhbWUgd2FzIGRyb3BwZWQgb3IgcXVldWVkLgogICovCiBzdGF0aWMgaW50IGludm9rZV90eF9oYW5kbGVycyhzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSB0eC0+c2tiOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4LT5za2IpOwogCWllZWU4MDIxMV90eF9yZXN1bHQgcmVzID0gVFhfRFJPUDsKIAogI2RlZmluZSBDQUxMX1RYSCh0eGgpIFwKQEAgLTEzMTQsMTMgKzEzNDgsMTAgQEAKICB0eGhfZG9uZToKIAlpZiAodW5saWtlbHkocmVzID09IFRYX0RST1ApKSB7CiAJCUk4MDJfREVCVUdfSU5DKHR4LT5sb2NhbC0+dHhfaGFuZGxlcnNfZHJvcCk7Ci0JCXdoaWxlIChza2IpIHsKLQkJCXN0cnVjdCBza19idWZmICpuZXh0OwotCi0JCQluZXh0ID0gc2tiLT5uZXh0OwotCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQkJc2tiID0gbmV4dDsKLQkJfQorCQlpZiAodHgtPnNrYikKKwkJCWRldl9rZnJlZV9za2IodHgtPnNrYik7CisJCWVsc2UKKwkJCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0eC0+c2ticyk7CiAJCXJldHVybiAtMTsKIAl9IGVsc2UgaWYgKHVubGlrZWx5KHJlcyA9PSBUWF9RVUVVRUQpKSB7CiAJCUk4MDJfREVCVUdfSU5DKHR4LT5sb2NhbC0+dHhfaGFuZGxlcnNfcXVldWVkKTsKQEAgLTEzNDEsNiArMTM3Miw3IEBACiAJaWVlZTgwMjExX3R4X3Jlc3VsdCByZXNfcHJlcGFyZTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJYm9vbCByZXN1bHQgPSB0cnVlOworCWludCBsZWRfbGVuOwogCiAJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgMTApKSB7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKQEAgLTEzNTAsNiArMTM4Miw3IEBACiAJcmN1X3JlYWRfbG9jaygpOwogCiAJLyogaW5pdGlhbGlzZXMgdHggKi8KKwlsZWRfbGVuID0gc2tiLT5sZW47CiAJcmVzX3ByZXBhcmUgPSBpZWVlODAyMTFfdHhfcHJlcGFyZShzZGF0YSwgJnR4LCBza2IpOwogCiAJaWYgKHVubGlrZWx5KHJlc19wcmVwYXJlID09IFRYX0RST1ApKSB7CkBAIC0xMzYzLDcgKzEzOTYsOCBAQAogCWluZm8tPmJhbmQgPSB0eC5jaGFubmVsLT5iYW5kOwogCiAJaWYgKCFpbnZva2VfdHhfaGFuZGxlcnMoJnR4KSkKLQkJcmVzdWx0ID0gX19pZWVlODAyMTFfdHgobG9jYWwsICZ0eC5za2IsIHR4LnN0YSwgdHhwZW5kaW5nKTsKKwkJcmVzdWx0ID0gX19pZWVlODAyMTFfdHgobG9jYWwsICZ0eC5za2JzLCBsZWRfbGVuLAorCQkJCQl0eC5zdGEsIHR4cGVuZGluZyk7CiAgb3V0OgogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXN1bHQ7CkBAIC0xNDMwLDcgKzE0NjQsNyBAQAogCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpICYmCiAJICAgIGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKIAkJIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKQotCQkJaWYgKG1lc2hfbmV4dGhvcF9sb29rdXAoc2tiLCBzZGF0YSkpIHsKKwkJCWlmIChtZXNoX25leHRob3BfcmVzb2x2ZShza2IsIHNkYXRhKSkgewogCQkJCS8qIHNrYiBxdWV1ZWQ6IGRvbid0IGZyZWUgKi8KIAkJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCQlyZXR1cm47CkBAIC0xNjg0LDggKzE3MTgsMTAgQEAKIAlpbnQgbmhfcG9zLCBoX3BvczsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IE5VTEw7CiAJYm9vbCB3bWVfc3RhID0gZmFsc2UsIGF1dGhvcml6ZWQgPSBmYWxzZSwgdGRsc19hdXRoID0gZmFsc2U7Ci0Jc3RydWN0IHNrX2J1ZmYgKnRtcF9za2I7CiAJYm9vbCB0ZGxzX2RpcmVjdCA9IGZhbHNlOworCWJvb2wgbXVsdGljYXN0OworCXUzMiBpbmZvX2ZsYWdzID0gMDsKKwl1MTYgaW5mb19pZCA9IDA7CiAKIAlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBFVEhfSExFTikpIHsKIAkJcmV0ID0gTkVUREVWX1RYX09LOwpAQCAtMTg3Miw3ICsxOTA4LDggQEAKIAkgKiBpZiBpdCBpcyBhIG11bHRpY2FzdCBhZGRyZXNzICh3aGljaCBjYW4gb25seSBoYXBwZW4KIAkgKiBpbiBBUCBtb2RlKQogCSAqLwotCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLmFkZHIxKSkgeworCW11bHRpY2FzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci5hZGRyMSk7CisJaWYgKCFtdWx0aWNhc3QpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwogCQlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIGhkci5hZGRyMSk7CiAJCWlmIChzdGEpIHsKQEAgLTE5MTMsMTEgKzE5NTAsNTQgQEAKIAkJZ290byBmYWlsOwogCX0KIAorCWlmICh1bmxpa2VseSghbXVsdGljYXN0ICYmIHNrYi0+c2sgJiYKKwkJICAgICBza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzICYgU0tCVFhfV0lGSV9TVEFUVVMpKSB7CisJCXN0cnVjdCBza19idWZmICpvcmlnX3NrYiA9IHNrYjsKKworCQlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHNrYikgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCWludCBpZCwgcjsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5hY2tfc3RhdHVzX2xvY2ssIGZsYWdzKTsKKwkJCXIgPSBpZHJfZ2V0X25ld19hYm92ZSgmbG9jYWwtPmFja19zdGF0dXNfZnJhbWVzLAorCQkJCQkgICAgICBvcmlnX3NrYiwgMSwgJmlkKTsKKwkJCWlmIChyID09IC1FQUdBSU4pIHsKKwkJCQlpZHJfcHJlX2dldCgmbG9jYWwtPmFja19zdGF0dXNfZnJhbWVzLAorCQkJCQkgICAgR0ZQX0FUT01JQyk7CisJCQkJciA9IGlkcl9nZXRfbmV3X2Fib3ZlKCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMsCisJCQkJCQkgICAgICBvcmlnX3NrYiwgMSwgJmlkKTsKKwkJCX0KKwkJCWlmIChXQVJOX09OKCFpZCkgfHwgaWQgPiAweGZmZmYpIHsKKwkJCQlpZHJfcmVtb3ZlKCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMsIGlkKTsKKwkJCQlyID0gLUVSQU5HRTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5hY2tfc3RhdHVzX2xvY2ssIGZsYWdzKTsKKworCQkJaWYgKCFyKSB7CisJCQkJaW5mb19pZCA9IGlkOworCQkJCWluZm9fZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9SRVFfVFhfU1RBVFVTOworCQkJfSBlbHNlIGlmIChza2Jfc2hhcmVkKHNrYikpIHsKKwkJCQlrZnJlZV9za2Iob3JpZ19za2IpOworCQkJfSBlbHNlIHsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQlza2IgPSBvcmlnX3NrYjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGNvdWxkbid0IGNsb25lIC0tIGxvc2UgdHggc3RhdHVzIC4uLiAqLworCQkJc2tiID0gb3JpZ19za2I7CisJCX0KKwl9CisKIAkvKgogCSAqIElmIHRoZSBza2IgaXMgc2hhcmVkIHdlIG5lZWQgdG8gb2J0YWluIG91ciBvd24gY29weS4KIAkgKi8KIAlpZiAoc2tiX3NoYXJlZChza2IpKSB7Ci0JCXRtcF9za2IgPSBza2I7CisJCXN0cnVjdCBza19idWZmICp0bXBfc2tiID0gc2tiOworCisJCS8qIGNhbid0IGhhcHBlbiAtLSBza2IgaXMgYSBjbG9uZSBpZiBpbmZvX2lkICE9IDAgKi8KKwkJV0FSTl9PTihpbmZvX2lkKTsKKwogCQlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAkJa2ZyZWVfc2tiKHRtcF9za2IpOwogCkBAIC0yMDE4LDYgKzIwOTgsMTAgQEAKIAltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CiAKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWluZm8tPmZsYWdzID0gaW5mb19mbGFnczsKKwlpbmZvLT5hY2tfZnJhbWVfaWQgPSBpbmZvX2lkOworCiAJaWVlZTgwMjExX3htaXQoc2RhdGEsIHNrYik7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtMjA2MSwxMCArMjE0NSwxNSBAQAogCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9JTlRGTF9ORUVEX1RYUFJPQ0VTU0lORykgewogCQlyZXN1bHQgPSBpZWVlODAyMTFfdHgoc2RhdGEsIHNrYiwgdHJ1ZSk7CiAJfSBlbHNlIHsKKwkJc3RydWN0IHNrX2J1ZmZfaGVhZCBza2JzOworCisJCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2ticyk7CisJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrYnMsIHNrYik7CisKIAkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCQlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIGhkci0+YWRkcjEpOwogCi0JCXJlc3VsdCA9IF9faWVlZTgwMjExX3R4KGxvY2FsLCAmc2tiLCBzdGEsIHRydWUpOworCQlyZXN1bHQgPSBfX2llZWU4MDIxMV90eChsb2NhbCwgJnNrYnMsIHNrYi0+bGVuLCBzdGEsIHRydWUpOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC0yMTc3LDEwICsyMjY2LDEwIEBACiAJCS8qIEJpdG1hcCBjb250cm9sICovCiAJCSpwb3MrKyA9IG4xIHwgYWlkMDsKIAkJLyogUGFydCBWaXJ0IEJpdG1hcCAqLworCQlza2JfcHV0KHNrYiwgbjIgLSBuMSk7CiAJCW1lbWNweShwb3MsIGJzcy0+dGltICsgbjEsIG4yIC0gbjEgKyAxKTsKIAogCQl0aW1bMV0gPSBuMiAtIG4xICsgNDsKLQkJc2tiX3B1dChza2IsIG4yIC0gbjEpOwogCX0gZWxzZSB7CiAJCSpwb3MrKyA9IGFpZDA7IC8qIEJpdG1hcCBjb250cm9sICovCiAJCSpwb3MrKyA9IDA7IC8qIFBhcnQgVmlydCBCaXRtYXAgKi8KQEAgLTIyNzgsMjIgKzIzNjcsMzEgQEAKIAl9IGVsc2UgaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCQl1OCAqcG9zOworCQlpbnQgaGRyX2xlbiA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24pICsKKwkJCSAgICAgIHNpemVvZihtZ210LT51LmJlYWNvbik7CiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAogCQlpZiAoIXNkYXRhLT51Lm1lc2gubWVzaF9pZF9sZW4pCiAJCQlnb3RvIG91dDsKICNlbmRpZgogCi0JCS8qIGhlYWRyb29tLCBoZWFkIGxlbmd0aCwgdGFpbCBsZW5ndGggYW5kIG1heGltdW0gVElNIGxlbmd0aCAqLwotCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT50eF9oZWFkcm9vbSArIDQwMCArCi0JCQkJc2RhdGEtPnUubWVzaC5pZV9sZW4pOworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT50eF9oZWFkcm9vbSArCisJCQkJICAgIGhkcl9sZW4gKworCQkJCSAgICAyICsgLyogTlVMTCBTU0lEICovCisJCQkJICAgIDIgKyA4ICsgLyogc3VwcG9ydGVkIHJhdGVzICovCisJCQkJICAgIDIgKyAzICsgLyogRFMgcGFyYW1zICovCisJCQkJICAgIDIgKyAoSUVFRTgwMjExX01BWF9TVVBQX1JBVEVTIC0gOCkgKworCQkJCSAgICAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSArCisJCQkJICAgIDIgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvKSArCisJCQkJICAgIDIgKyBzZGF0YS0+dS5tZXNoLm1lc2hfaWRfbGVuICsKKwkJCQkgICAgMiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21lc2hjb25mX2llKSArCisJCQkJICAgIHNkYXRhLT51Lm1lc2guaWVfbGVuKTsKIAkJaWYgKCFza2IpCiAJCQlnb3RvIG91dDsKIAogCQlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7Ci0JCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopCi0JCQlza2JfcHV0KHNrYiwgMjQgKyBzaXplb2YobWdtdC0+dS5iZWFjb24pKTsKLQkJbWVtc2V0KG1nbXQsIDAsIDI0ICsgc2l6ZW9mKG1nbXQtPnUuYmVhY29uKSk7CisJCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYl9wdXQoc2tiLCBoZHJfbGVuKTsKKwkJbWVtc2V0KG1nbXQsIDAsIGhkcl9sZW4pOwogCQltZ210LT5mcmFtZV9jb250cm9sID0KIAkJICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7CiAJCW1lbXNldChtZ210LT5kYSwgMHhmZiwgRVRIX0FMRU4pOwpAQCAtMjMxMiw2ICsyNDEwLDggQEAKIAkJICAgIG1lc2hfYWRkX2RzX3BhcmFtc19pZShza2IsIHNkYXRhKSB8fAogCQkgICAgaWVlZTgwMjExX2FkZF9leHRfc3JhdGVzX2llKCZzZGF0YS0+dmlmLCBza2IpIHx8CiAJCSAgICBtZXNoX2FkZF9yc25faWUoc2tiLCBzZGF0YSkgfHwKKwkJICAgIG1lc2hfYWRkX2h0X2NhcF9pZShza2IsIHNkYXRhKSB8fAorCQkgICAgbWVzaF9hZGRfaHRfaW5mb19pZShza2IsIHNkYXRhKSB8fAogCQkgICAgbWVzaF9hZGRfbWVzaGlkX2llKHNrYiwgc2RhdGEpIHx8CiAJCSAgICBtZXNoX2FkZF9tZXNoY29uZl9pZShza2IsIHNkYXRhKSB8fAogCQkgICAgbWVzaF9hZGRfdmVuZG9yX2llcyhza2IsIHNkYXRhKSkgewpAQCAtMjM1NCw2ICsyNDU0LDM3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9iZWFjb25fZ2V0X3RpbSk7CiAKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfcHJvYmVyZXNwX2dldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX2FwICphcCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnByZXNwID0gTlVMTCwgKnNrYiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh2aWYpOworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlhcCA9ICZzZGF0YS0+dS5hcDsKKwlwcmVzcCA9IHJjdV9kZXJlZmVyZW5jZShhcC0+cHJvYmVfcmVzcCk7CisJaWYgKCFwcmVzcCkKKwkJZ290byBvdXQ7CisKKwlza2IgPSBza2JfY29weShwcmVzcCwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwltZW1zZXQoaGRyLT5hZGRyMSwgMCwgc2l6ZW9mKGhkci0+YWRkcjEpKTsKKworb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBza2I7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9wcm9iZXJlc3BfZ2V0KTsKKwogc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wc3BvbGxfZ2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS91dGlsLmMgYi9uZXQvbWFjODAyMTEvdXRpbC5jCmluZGV4IDY3MTliY2UuLjUyNDNjMmMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS91dGlsLmMKKysrIGIvbmV0L21hYzgwMjExL3V0aWwuYwpAQCAtMTMsMTIgKzEzLDE0IEBACiAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CkBAIC05NSwxMyArOTcsMTMgQEAKIAogdm9pZCBpZWVlODAyMTFfdHhfc2V0X3Byb3RlY3RlZChzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSB0eC0+c2tiOworCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAotCWRvIHsKKwlza2JfcXVldWVfd2FsaygmdHgtPnNrYnMsIHNrYikgewogCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwogCQloZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKTsKLQl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CisJfQogfQogCiBpbnQgaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzaXplX3QgbGVuLApAQCAtNTYzLDYgKzU2NSwxNzIgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayk7CiAKK3UzMiBpZWVlODAyXzExX3BhcnNlX2VsZW1zX2NyYyh1OCAqc3RhcnQsIHNpemVfdCBsZW4sCisJCQkgICAgICAgc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zLAorCQkJICAgICAgIHU2NCBmaWx0ZXIsIHUzMiBjcmMpCit7CisJc2l6ZV90IGxlZnQgPSBsZW47CisJdTggKnBvcyA9IHN0YXJ0OworCWJvb2wgY2FsY19jcmMgPSBmaWx0ZXIgIT0gMDsKKworCW1lbXNldChlbGVtcywgMCwgc2l6ZW9mKCplbGVtcykpOworCWVsZW1zLT5pZV9zdGFydCA9IHN0YXJ0OworCWVsZW1zLT50b3RhbF9sZW4gPSBsZW47CisKKwl3aGlsZSAobGVmdCA+PSAyKSB7CisJCXU4IGlkLCBlbGVuOworCisJCWlkID0gKnBvcysrOworCQllbGVuID0gKnBvcysrOworCQlsZWZ0IC09IDI7CisKKwkJaWYgKGVsZW4gPiBsZWZ0KQorCQkJYnJlYWs7CisKKwkJaWYgKGNhbGNfY3JjICYmIGlkIDwgNjQgJiYgKGZpbHRlciAmICgxVUxMIDw8IGlkKSkpCisJCQljcmMgPSBjcmMzMl9iZShjcmMsIHBvcyAtIDIsIGVsZW4gKyAyKTsKKworCQlzd2l0Y2ggKGlkKSB7CisJCWNhc2UgV0xBTl9FSURfU1NJRDoKKwkJCWVsZW1zLT5zc2lkID0gcG9zOworCQkJZWxlbXMtPnNzaWRfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6CisJCQllbGVtcy0+c3VwcF9yYXRlcyA9IHBvczsKKwkJCWVsZW1zLT5zdXBwX3JhdGVzX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9GSF9QQVJBTVM6CisJCQllbGVtcy0+ZmhfcGFyYW1zID0gcG9zOworCQkJZWxlbXMtPmZoX3BhcmFtc19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfRFNfUEFSQU1TOgorCQkJZWxlbXMtPmRzX3BhcmFtcyA9IHBvczsKKwkJCWVsZW1zLT5kc19wYXJhbXNfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0NGX1BBUkFNUzoKKwkJCWVsZW1zLT5jZl9wYXJhbXMgPSBwb3M7CisJCQllbGVtcy0+Y2ZfcGFyYW1zX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9USU06CisJCQlpZiAoZWxlbiA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90aW1faWUpKSB7CisJCQkJZWxlbXMtPnRpbSA9ICh2b2lkICopcG9zOworCQkJCWVsZW1zLT50aW1fbGVuID0gZWxlbjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0lCU1NfUEFSQU1TOgorCQkJZWxlbXMtPmlic3NfcGFyYW1zID0gcG9zOworCQkJZWxlbXMtPmlic3NfcGFyYW1zX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9DSEFMTEVOR0U6CisJCQllbGVtcy0+Y2hhbGxlbmdlID0gcG9zOworCQkJZWxlbXMtPmNoYWxsZW5nZV9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOgorCQkJaWYgKGVsZW4gPj0gNCAmJiBwb3NbMF0gPT0gMHgwMCAmJiBwb3NbMV0gPT0gMHg1MCAmJgorCQkJICAgIHBvc1syXSA9PSAweGYyKSB7CisJCQkJLyogTWljcm9zb2Z0IE9VSSAoMDA6NTA6RjIpICovCisKKwkJCQlpZiAoY2FsY19jcmMpCisJCQkJCWNyYyA9IGNyYzMyX2JlKGNyYywgcG9zIC0gMiwgZWxlbiArIDIpOworCisJCQkJaWYgKHBvc1szXSA9PSAxKSB7CisJCQkJCS8qIE9VSSBUeXBlIDEgLSBXUEEgSUUgKi8KKwkJCQkJZWxlbXMtPndwYSA9IHBvczsKKwkJCQkJZWxlbXMtPndwYV9sZW4gPSBlbGVuOworCQkJCX0gZWxzZSBpZiAoZWxlbiA+PSA1ICYmIHBvc1szXSA9PSAyKSB7CisJCQkJCS8qIE9VSSBUeXBlIDIgLSBXTU0gSUUgKi8KKwkJCQkJaWYgKHBvc1s0XSA9PSAwKSB7CisJCQkJCQllbGVtcy0+d21tX2luZm8gPSBwb3M7CisJCQkJCQllbGVtcy0+d21tX2luZm9fbGVuID0gZWxlbjsKKwkJCQkJfSBlbHNlIGlmIChwb3NbNF0gPT0gMSkgeworCQkJCQkJZWxlbXMtPndtbV9wYXJhbSA9IHBvczsKKwkJCQkJCWVsZW1zLT53bW1fcGFyYW1fbGVuID0gZWxlbjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1JTTjoKKwkJCWVsZW1zLT5yc24gPSBwb3M7CisJCQllbGVtcy0+cnNuX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9FUlBfSU5GTzoKKwkJCWVsZW1zLT5lcnBfaW5mbyA9IHBvczsKKwkJCWVsZW1zLT5lcnBfaW5mb19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfRVhUX1NVUFBfUkFURVM6CisJCQllbGVtcy0+ZXh0X3N1cHBfcmF0ZXMgPSBwb3M7CisJCQllbGVtcy0+ZXh0X3N1cHBfcmF0ZXNfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0hUX0NBUEFCSUxJVFk6CisJCQlpZiAoZWxlbiA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKQorCQkJCWVsZW1zLT5odF9jYXBfZWxlbSA9ICh2b2lkICopcG9zOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfSFRfSU5GT1JNQVRJT046CisJCQlpZiAoZWxlbiA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvKSkKKwkJCQllbGVtcy0+aHRfaW5mb19lbGVtID0gKHZvaWQgKilwb3M7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9NRVNIX0lEOgorCQkJZWxlbXMtPm1lc2hfaWQgPSBwb3M7CisJCQllbGVtcy0+bWVzaF9pZF9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfTUVTSF9DT05GSUc6CisJCQlpZiAoZWxlbiA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9tZXNoY29uZl9pZSkpCisJCQkJZWxlbXMtPm1lc2hfY29uZmlnID0gKHZvaWQgKilwb3M7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9QRUVSX01HTVQ6CisJCQllbGVtcy0+cGVlcmluZyA9IHBvczsKKwkJCWVsZW1zLT5wZWVyaW5nX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9QUkVROgorCQkJZWxlbXMtPnByZXEgPSBwb3M7CisJCQllbGVtcy0+cHJlcV9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUFJFUDoKKwkJCWVsZW1zLT5wcmVwID0gcG9zOworCQkJZWxlbXMtPnByZXBfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1BFUlI6CisJCQllbGVtcy0+cGVyciA9IHBvczsKKwkJCWVsZW1zLT5wZXJyX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9SQU5OOgorCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmFubl9pZSkpCisJCQkJZWxlbXMtPnJhbm4gPSAodm9pZCAqKXBvczsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0NIQU5ORUxfU1dJVENIOgorCQkJZWxlbXMtPmNoX3N3aXRjaF9lbGVtID0gcG9zOworCQkJZWxlbXMtPmNoX3N3aXRjaF9lbGVtX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9RVUlFVDoKKwkJCWlmICghZWxlbXMtPnF1aWV0X2VsZW0pIHsKKwkJCQllbGVtcy0+cXVpZXRfZWxlbSA9IHBvczsKKwkJCQllbGVtcy0+cXVpZXRfZWxlbV9sZW4gPSBlbGVuOworCQkJfQorCQkJZWxlbXMtPm51bV9vZl9xdWlldF9lbGVtKys7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9DT1VOVFJZOgorCQkJZWxlbXMtPmNvdW50cnlfZWxlbSA9IHBvczsKKwkJCWVsZW1zLT5jb3VudHJ5X2VsZW1fbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1BXUl9DT05TVFJBSU5UOgorCQkJZWxlbXMtPnB3cl9jb25zdHJfZWxlbSA9IHBvczsKKwkJCWVsZW1zLT5wd3JfY29uc3RyX2VsZW1fbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1RJTUVPVVRfSU5URVJWQUw6CisJCQllbGVtcy0+dGltZW91dF9pbnQgPSBwb3M7CisJCQllbGVtcy0+dGltZW91dF9pbnRfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlsZWZ0IC09IGVsZW47CisJCXBvcyArPSBlbGVuOworCX0KKworCXJldHVybiBjcmM7Cit9CisKIHZvaWQgaWVlZTgwMl8xMV9wYXJzZV9lbGVtcyh1OCAqc3RhcnQsIHNpemVfdCBsZW4sCiAJCQkgICAgc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zKQogewpAQCAtODExLDIzICs5NzksOSBAQAogCQlvZmZzZXQgPSBub2Zmc2V0OwogCX0KIAotCWlmIChzYmFuZC0+aHRfY2FwLmh0X3N1cHBvcnRlZCkgewotCQl1MTYgY2FwID0gc2JhbmQtPmh0X2NhcC5jYXA7Ci0JCV9fbGUxNiB0bXA7Ci0KLQkJKnBvcysrID0gV0xBTl9FSURfSFRfQ0FQQUJJTElUWTsKLQkJKnBvcysrID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKTsKLQkJbWVtc2V0KHBvcywgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7Ci0JCXRtcCA9IGNwdV90b19sZTE2KGNhcCk7Ci0JCW1lbWNweShwb3MsICZ0bXAsIHNpemVvZih1MTYpKTsKLQkJcG9zICs9IHNpemVvZih1MTYpOwotCQkqcG9zKysgPSBzYmFuZC0+aHRfY2FwLmFtcGR1X2ZhY3RvciB8Ci0JCQkgKHNiYW5kLT5odF9jYXAuYW1wZHVfZGVuc2l0eSA8PAotCQkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFlfU0hJRlQpOwotCQltZW1jcHkocG9zLCAmc2JhbmQtPmh0X2NhcC5tY3MsIHNpemVvZihzYmFuZC0+aHRfY2FwLm1jcykpOwotCQlwb3MgKz0gc2l6ZW9mKHNiYW5kLT5odF9jYXAubWNzKTsKLQkJcG9zICs9IDIgKyA0ICsgMTsgLyogZXh0IGluZm8sIEJGIGNhcCwgYW50c2VsICovCi0JfQorCWlmIChzYmFuZC0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKKwkJcG9zID0gaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcChwb3MsICZzYmFuZC0+aHRfY2FwLAorCQkJCQkJc2JhbmQtPmh0X2NhcC5jYXApOwogCiAJLyoKIAkgKiBJZiBhZGRpbmcgbW9yZSBoZXJlLCBhZGp1c3QgY29kZSBpbiBtYWluLmMKQEAgLTEwMjUsNyArMTE3OSw3IEBACiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTiAmJgogCQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYKIAkJICAgIGllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKLQkJCXJlcyA9IGRydl9hZGRfaW50ZXJmYWNlKGxvY2FsLCAmc2RhdGEtPnZpZik7CisJCQlyZXMgPSBkcnZfYWRkX2ludGVyZmFjZShsb2NhbCwgc2RhdGEpOwogCX0KIAogCS8qIGFkZCBTVEFzIGJhY2sgKi8KQEAgLTEwNzUsNyArMTIyOSw4IEBACiAJCQkgIEJTU19DSEFOR0VEX0JFQUNPTl9JTlQgfAogCQkJICBCU1NfQ0hBTkdFRF9CU1NJRCB8CiAJCQkgIEJTU19DSEFOR0VEX0NRTSB8Ci0JCQkgIEJTU19DSEFOR0VEX1FPUzsKKwkJCSAgQlNTX0NIQU5HRURfUU9TIHwKKwkJCSAgQlNTX0NIQU5HRURfSURMRTsKIAogCQlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewogCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CkBAIC0xMDg5LDYgKzEyNDQsMTAgQEAKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCQkJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9TU0lEOworCisJCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQkJCWNoYW5nZWQgfD0gQlNTX0NIQU5HRURfQVBfUFJPQkVfUkVTUDsKKwogCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKIAkJCWNoYW5nZWQgfD0gQlNTX0NIQU5HRURfQkVBQ09OIHwKQEAgLTExMTAsNiArMTI2OSw4IEBACiAJCX0KIAl9CiAKKwlpZWVlODAyMTFfcmVjYWxjX3BzKGxvY2FsLCAtMSk7CisKIAkvKgogCSAqIENsZWFyIHRoZSBXTEFOX1NUQV9CTE9DS19CQSBmbGFnIHNvIG5ldyBhZ2dyZWdhdGlvbgogCSAqIHNlc3Npb25zIGNhbiBiZSBlc3RhYmxpc2hlZCBhZnRlciBhIHJlc3VtZS4KQEAgLTEzNjUsNiArMTUyNiwxMDMgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX2Rpc2FibGVfcnNzaV9yZXBvcnRzKTsKIAordTggKmllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCisJCQkgICAgICB1MTYgY2FwKQoreworCV9fbGUxNiB0bXA7CisKKwkqcG9zKysgPSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOworCSpwb3MrKyA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCk7CisJbWVtc2V0KHBvcywgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7CisKKwkvKiBjYXBhYmlsaXR5IGZsYWdzICovCisJdG1wID0gY3B1X3RvX2xlMTYoY2FwKTsKKwltZW1jcHkocG9zLCAmdG1wLCBzaXplb2YodTE2KSk7CisJcG9zICs9IHNpemVvZih1MTYpOworCisJLyogQU1QRFUgcGFyYW1ldGVycyAqLworCSpwb3MrKyA9IGh0X2NhcC0+YW1wZHVfZmFjdG9yIHwKKwkJIChodF9jYXAtPmFtcGR1X2RlbnNpdHkgPDwKKwkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFlfU0hJRlQpOworCisJLyogTUNTIHNldCAqLworCW1lbWNweShwb3MsICZodF9jYXAtPm1jcywgc2l6ZW9mKGh0X2NhcC0+bWNzKSk7CisJcG9zICs9IHNpemVvZihodF9jYXAtPm1jcyk7CisKKwkvKiBleHRlbmRlZCBjYXBhYmlsaXRpZXMgKi8KKwlwb3MgKz0gc2l6ZW9mKF9fbGUxNik7CisKKwkvKiBCRiBjYXBhYmlsaXRpZXMgKi8KKwlwb3MgKz0gc2l6ZW9mKF9fbGUzMik7CisKKwkvKiBhbnRlbm5hIHNlbGVjdGlvbiAqLworCXBvcyArPSBzaXplb2YodTgpOworCisJcmV0dXJuIHBvczsKK30KKwordTggKmllZWU4MDIxMV9pZV9idWlsZF9odF9pbmZvKHU4ICpwb3MsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAorCQkJICAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlKQoreworCXN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqaHRfaW5mbzsKKwkvKiBCdWlsZCBIVCBJbmZvcm1hdGlvbiAqLworCSpwb3MrKyA9IFdMQU5fRUlEX0hUX0lORk9STUFUSU9OOworCSpwb3MrKyA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8pOworCWh0X2luZm8gPSAoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvICopcG9zOworCWh0X2luZm8tPmNvbnRyb2xfY2hhbiA9CisJCQlpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCXN3aXRjaCAoY2hhbm5lbF90eXBlKSB7CisJY2FzZSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTOgorCQlodF9pbmZvLT5odF9wYXJhbSA9IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ0hBTl9IVDQwUExVUzoKKwkJaHRfaW5mby0+aHRfcGFyYW0gPSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0NIQU5fSFQyMDoKKwlkZWZhdWx0OgorCQlodF9pbmZvLT5odF9wYXJhbSA9IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7CisJCWJyZWFrOworCX0KKwlpZiAoaHRfY2FwLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkKKwkJaHRfaW5mby0+aHRfcGFyYW0gfD0gSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZOworCWh0X2luZm8tPm9wZXJhdGlvbl9tb2RlID0gMHgwMDAwOworCWh0X2luZm8tPnN0YmNfcGFyYW0gPSAweDAwMDA7CisKKwkvKiBJdCBzZWVtcyB0aGF0IEJhc2ljIE1DUyBzZXQgYW5kIFN1cHBvcnRlZCBNQ1Mgc2V0CisJICAgYXJlIGlkZW50aWNhbCBmb3IgdGhlIGZpcnN0IDEwIGJ5dGVzICovCisJbWVtc2V0KCZodF9pbmZvLT5iYXNpY19zZXQsIDAsIDE2KTsKKwltZW1jcHkoJmh0X2luZm8tPmJhc2ljX3NldCwgJmh0X2NhcC0+bWNzLCAxMCk7CisKKwlyZXR1cm4gcG9zICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyk7Cit9CisKK2VudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUKK2llZWU4MDIxMV9odF9pbmZvX3RvX2NoYW5uZWxfdHlwZShzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKmh0X2luZm8pCit7CisJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGU7CisKKwlpZiAoIWh0X2luZm8pCisJCXJldHVybiBOTDgwMjExX0NIQU5fTk9fSFQ7CisKKwlzd2l0Y2ggKGh0X2luZm8tPmh0X3BhcmFtICYgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfT0ZGU0VUKSB7CisJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOgorCQljaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fSFQyMDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKKwkJY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX0hUNDBQTFVTOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgorCQljaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fTk9fSFQ7CisJfQorCisJcmV0dXJuIGNoYW5uZWxfdHlwZTsKK30KKwogaW50IGllZWU4MDIxMV9hZGRfc3JhdGVzX2llKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93ZXAuYyBiL25ldC9tYWM4MDIxMS93ZXAuYwppbmRleCBhMWM2YmZkLi42OGFkMzUxIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd2VwLmMKKysrIGIvbmV0L21hYzgwMjExL3dlcC5jCkBAIC0zMzAsMTMgKzMzMCwxMiBAQAogCiAJaWVlZTgwMjExX3R4X3NldF9wcm90ZWN0ZWQodHgpOwogCi0Jc2tiID0gdHgtPnNrYjsKLQlkbyB7CisJc2tiX3F1ZXVlX3dhbGsoJnR4LT5za2JzLCBza2IpIHsKIAkJaWYgKHdlcF9lbmNyeXB0X3NrYih0eCwgc2tiKSA8IDApIHsKIAkJCUk4MDJfREVCVUdfSU5DKHR4LT5sb2NhbC0+dHhfaGFuZGxlcnNfZHJvcF93ZXApOwogCQkJcmV0dXJuIFRYX0RST1A7CiAJCX0KLQl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CisJfQogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dtZS5jIGIvbmV0L21hYzgwMjExL3dtZS5jCmluZGV4IGZkNTJlNjkuLjg5NTExYmUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93bWUuYworKysgYi9uZXQvbWFjODAyMTEvd21lLmMKQEAgLTUyLDYgKzUyLDMwIEBACiAJfQogfQogCisvKiBJbmRpY2F0ZSB3aGljaCBxdWV1ZSB0byB1c2UgZm9yIHRoaXMgZnVsbHkgZm9ybWVkIDgwMi4xMSBmcmFtZSAqLwordTE2IGllZWU4MDIxMV9zZWxlY3RfcXVldWVfODAyMTEoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJdTggKnA7CisKKwlpZiAobG9jYWwtPmh3LnF1ZXVlcyA8IDQpCisJCXJldHVybiAwOworCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCXNrYi0+cHJpb3JpdHkgPSA3OworCQlyZXR1cm4gaWVlZTgwMl8xZF90b19hY1tza2ItPnByaW9yaXR5XTsKKwl9CisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQlza2ItPnByaW9yaXR5ID0gMDsKKwkJcmV0dXJuIGllZWU4MDJfMWRfdG9fYWNbc2tiLT5wcmlvcml0eV07CisJfQorCisJcCA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCXNrYi0+cHJpb3JpdHkgPSAqcCAmIElFRUU4MDIxMV9RT1NfQ1RMX1RBRzFEX01BU0s7CisKKwlyZXR1cm4gaWVlZTgwMjExX2Rvd25ncmFkZV9xdWV1ZShsb2NhbCwgc2tiKTsKK30KIAogLyogSW5kaWNhdGUgd2hpY2ggcXVldWUgdG8gdXNlLiAqLwogdTE2IGllZWU4MDIxMV9zZWxlY3RfcXVldWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCkBAIC04Myw3ICsxMDcsNyBAQAogCQlicmVhazsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKLQkJcmEgPSBza2ItPmRhdGE7CisJCXFvcyA9IHRydWU7CiAJCWJyZWFrOwogI2VuZGlmCiAJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgpAQCAtMTM5LDE2ICsxNjMsMjQgQEAKIAkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9ICh2b2lkICopc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAogCS8qIEZpbGwgaW4gdGhlIFFvUyBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAqLwogCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkgewogCQl1OCAqcCA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwotCQl1OCBhY2tfcG9saWN5ID0gMCwgdGlkOworCQl1OCBhY2tfcG9saWN5LCB0aWQ7CiAKIAkJdGlkID0gc2tiLT5wcmlvcml0eSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RBRzFEX01BU0s7CiAKLQkJaWYgKHVubGlrZWx5KHNkYXRhLT5sb2NhbC0+d2lmaV93bWVfbm9hY2tfdGVzdCkpCisJCS8qIHByZXNlcnZlIEVPU1AgYml0ICovCisJCWFja19wb2xpY3kgPSAqcCAmIElFRUU4MDIxMV9RT1NfQ1RMX0VPU1A7CisKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpIHx8CisJCSAgICBzZGF0YS0+bm9hY2tfbWFwICYgQklUKHRpZCkpIHsKIAkJCWFja19wb2xpY3kgfD0gSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT0FDSzsKKwkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfTk9fQUNLOworCQl9CisKIAkJLyogcW9zIGhlYWRlciBpcyAyIGJ5dGVzICovCiAJCSpwKysgPSBhY2tfcG9saWN5IHwgdGlkOwogCQkqcCA9IGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikgPwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dtZS5oIGIvbmV0L21hYzgwMjExL3dtZS5oCmluZGV4IDM0ZTE2NmYuLjk0ZWRjZWIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93bWUuaAorKysgYi9uZXQvbWFjODAyMTEvd21lLmgKQEAgLTE1LDYgKzE1LDkgQEAKIAogZXh0ZXJuIGNvbnN0IGludCBpZWVlODAyXzFkX3RvX2FjWzhdOwogCit1MTYgaWVlZTgwMjExX3NlbGVjdF9xdWV1ZV84MDIxMShzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcik7CiB1MTYgaWVlZTgwMjExX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBpZWVlODAyMTFfc2V0X3Fvc19oZHIoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd29yay5jIGIvbmV0L21hYzgwMjExL3dvcmsuYwppbmRleCA2YzUzYjZkLi5jNmRkMDFhIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd29yay5jCisrKyBiL25ldC9tYWM4MDIxMS93b3JrLmMKQEAgLTk0LDcgKzk0LDggQEAKIAogLyogZnJhbWUgc2VuZGluZyBmdW5jdGlvbnMgKi8KIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX2FkZF9odF9pZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCB1OCAqaHRfaW5mb19pZSwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hZGRfaHRfaWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgdTggKmh0X2luZm9faWUsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAogCQkJCWVudW0gaWVlZTgwMjExX3NtcHNfbW9kZSBzbXBzKQpAQCAtMTAyLDggKzEwMywxMCBAQAogCXN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqaHRfaW5mbzsKIAl1OCAqcG9zOwogCXUzMiBmbGFncyA9IGNoYW5uZWwtPmZsYWdzOwotCXUxNiBjYXAgPSBzYmFuZC0+aHRfY2FwLmNhcDsKLQlfX2xlMTYgdG1wOworCXUxNiBjYXA7CisJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwIGh0X2NhcDsKKworCUJVSUxEX0JVR19PTihzaXplb2YoaHRfY2FwKSAhPSBzaXplb2Yoc2JhbmQtPmh0X2NhcCkpOwogCiAJaWYgKCFzYmFuZC0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKIAkJcmV0dXJuOwpAQCAtMTE0LDkgKzExNywxMyBAQAogCWlmIChodF9pbmZvX2llWzFdIDwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpCiAJCXJldHVybjsKIAorCW1lbWNweSgmaHRfY2FwLCAmc2JhbmQtPmh0X2NhcCwgc2l6ZW9mKGh0X2NhcCkpOworCWllZWU4MDIxMV9hcHBseV9odGNhcF9vdmVycmlkZXMoc2RhdGEsICZodF9jYXApOworCiAJaHRfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKikoaHRfaW5mb19pZSArIDIpOwogCiAJLyogZGV0ZXJtaW5lIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKwljYXAgPSBodF9jYXAuY2FwOwogCiAJc3dpdGNoIChodF9pbmZvLT5odF9wYXJhbSAmIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX09GRlNFVCkgewogCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU6CkBAIC0xNTQsMzQgKzE2MSw4IEBACiAJfQogCiAJLyogcmVzZXJ2ZSBhbmQgZmlsbCBJRSAqLwotCiAJcG9zID0gc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkgKyAyKTsKLQkqcG9zKysgPSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOwotCSpwb3MrKyA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCk7Ci0JbWVtc2V0KHBvcywgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7Ci0KLQkvKiBjYXBhYmlsaXR5IGZsYWdzICovCi0JdG1wID0gY3B1X3RvX2xlMTYoY2FwKTsKLQltZW1jcHkocG9zLCAmdG1wLCBzaXplb2YodTE2KSk7Ci0JcG9zICs9IHNpemVvZih1MTYpOwotCi0JLyogQU1QRFUgcGFyYW1ldGVycyAqLwotCSpwb3MrKyA9IHNiYW5kLT5odF9jYXAuYW1wZHVfZmFjdG9yIHwKLQkJIChzYmFuZC0+aHRfY2FwLmFtcGR1X2RlbnNpdHkgPDwKLQkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFlfU0hJRlQpOwotCi0JLyogTUNTIHNldCAqLwotCW1lbWNweShwb3MsICZzYmFuZC0+aHRfY2FwLm1jcywgc2l6ZW9mKHNiYW5kLT5odF9jYXAubWNzKSk7Ci0JcG9zICs9IHNpemVvZihzYmFuZC0+aHRfY2FwLm1jcyk7Ci0KLQkvKiBleHRlbmRlZCBjYXBhYmlsaXRpZXMgKi8KLQlwb3MgKz0gc2l6ZW9mKF9fbGUxNik7Ci0KLQkvKiBCRiBjYXBhYmlsaXRpZXMgKi8KLQlwb3MgKz0gc2l6ZW9mKF9fbGUzMik7Ci0KLQkvKiBhbnRlbm5hIHNlbGVjdGlvbiAqLwotCXBvcyArPSBzaXplb2YodTgpOworCWllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAocG9zLCAmaHRfY2FwLCBjYXApOwogfQogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9hc3NvYyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKQEAgLTM1Niw3ICszMzcsNyBAQAogCiAJaWYgKHdrLT5hc3NvYy51c2VfMTFuICYmIHdrLT5hc3NvYy53bW1fdXNlZCAmJgogCSAgICBsb2NhbC0+aHcucXVldWVzID49IDQpCi0JCWllZWU4MDIxMV9hZGRfaHRfaWUoc2tiLCB3ay0+YXNzb2MuaHRfaW5mb3JtYXRpb25faWUsCisJCWllZWU4MDIxMV9hZGRfaHRfaWUoc2RhdGEsIHNrYiwgd2stPmFzc29jLmh0X2luZm9ybWF0aW9uX2llLAogCQkJCSAgICBzYmFuZCwgd2stPmNoYW4sIHdrLT5hc3NvYy5zbXBzKTsKIAogCS8qIGlmIHByZXNlbnQsIGFkZCBhbnkgY3VzdG9tIG5vbi12ZW5kb3IgSUVzIHRoYXQgZ28gYWZ0ZXIgSFQgKi8KQEAgLTg4MSw0NCArODYyLDYgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIH0KIAotc3RhdGljIGJvb2wgaWVlZTgwMjExX3dvcmtfY3RfY29leGlzdHMoZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSB3a19jdCwKLQkJCQkgICAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBvcGVyX2N0KQotewotCXN3aXRjaCAod2tfY3QpIHsKLQljYXNlIE5MODAyMTFfQ0hBTl9OT19IVDoKLQkJcmV0dXJuIHRydWU7Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQyMDoKLQkJaWYgKG9wZXJfY3QgIT0gTkw4MDIxMV9DSEFOX05PX0hUKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQljYXNlIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVM6Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQ0MFBMVVM6Ci0JCXJldHVybiAod2tfY3QgPT0gb3Blcl9jdCk7Ci0JfQotCVdBUk5fT04oMSk7IC8qIHNob3VsZG4ndCBnZXQgaGVyZSAqLwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUKLWllZWU4MDIxMV9jYWxjX2N0KGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgd2tfY3QsCi0JCSAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBvcGVyX2N0KQotewotCXN3aXRjaCAod2tfY3QpIHsKLQljYXNlIE5MODAyMTFfQ0hBTl9OT19IVDoKLQkJcmV0dXJuIG9wZXJfY3Q7Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQyMDoKLQkJaWYgKG9wZXJfY3QgIT0gTkw4MDIxMV9DSEFOX05PX0hUKQotCQkJcmV0dXJuIG9wZXJfY3Q7Ci0JCXJldHVybiB3a19jdDsKLQljYXNlIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVM6Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQ0MFBMVVM6Ci0JCXJldHVybiB3a19jdDsKLQl9Ci0JV0FSTl9PTigxKTsgLyogc2hvdWxkbid0IGdldCBoZXJlICovCi0JcmV0dXJuIHdrX2N0OwotfQotCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV93b3JrX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9ICh2b2lkICopIGRhdGE7CkBAIC05NjksNTEgKzkxMiwxMiBAQAogCQl9CiAKIAkJaWYgKCFzdGFydGVkICYmICFsb2NhbC0+dG1wX2NoYW5uZWwpIHsKLQkJCWJvb2wgb25fb3Blcl9jaGFuOwotCQkJYm9vbCB0bXBfY2hhbl9jaGFuZ2VkID0gZmFsc2U7Ci0JCQlib29sIG9uX29wZXJfY2hhbjI7Ci0JCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIHdrX2N0OwotCQkJb25fb3Blcl9jaGFuID0gaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwobG9jYWwpOwotCi0JCQkvKiBXb3JrIHdpdGggZXhpc3RpbmcgY2hhbm5lbCB0eXBlIGlmIHBvc3NpYmxlLiAqLwotCQkJd2tfY3QgPSB3ay0+Y2hhbl90eXBlOwotCQkJaWYgKHdrLT5jaGFuID09IGxvY2FsLT5ody5jb25mLmNoYW5uZWwpCi0JCQkJd2tfY3QgPSBpZWVlODAyMTFfY2FsY19jdCh3ay0+Y2hhbl90eXBlLAotCQkJCQkJbG9jYWwtPmh3LmNvbmYuY2hhbm5lbF90eXBlKTsKLQotCQkJaWYgKGxvY2FsLT50bXBfY2hhbm5lbCkKLQkJCQlpZiAoKGxvY2FsLT50bXBfY2hhbm5lbCAhPSB3ay0+Y2hhbikgfHwKLQkJCQkgICAgKGxvY2FsLT50bXBfY2hhbm5lbF90eXBlICE9IHdrX2N0KSkKLQkJCQkJdG1wX2NoYW5fY2hhbmdlZCA9IHRydWU7CisJCQlpZWVlODAyMTFfb2ZmY2hhbm5lbF9zdG9wX3ZpZnMobG9jYWwsIHRydWUpOwogCiAJCQlsb2NhbC0+dG1wX2NoYW5uZWwgPSB3ay0+Y2hhbjsKLQkJCWxvY2FsLT50bXBfY2hhbm5lbF90eXBlID0gd2tfY3Q7Ci0JCQkvKgotCQkJICogTGVhdmUgdGhlIHN0YXRpb24gdmlmcyBpbiBhd2FrZSBtb2RlIGlmIHRoZXkKLQkJCSAqIGhhcHBlbiB0byBiZSBvbiB0aGUgc2FtZSBjaGFubmVsIGFzCi0JCQkgKiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuCi0JCQkgKi8KLQkJCW9uX29wZXJfY2hhbjIgPSBpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCk7Ci0JCQlpZiAob25fb3Blcl9jaGFuICE9IG9uX29wZXJfY2hhbjIpIHsKLQkJCQlpZiAob25fb3Blcl9jaGFuMikgewotCQkJCQkvKiBnb2luZyBvZmYgb3BlciBjaGFubmVsLCBQUyB0b28gKi8KLQkJCQkJaWVlZTgwMjExX29mZmNoYW5uZWxfc3RvcF92aWZzKGxvY2FsLAotCQkJCQkJCQkgICAgICAgdHJ1ZSk7Ci0JCQkJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIGdvaW5nIG9uIGNoYW5uZWwsIGJ1dCBsZWF2ZSBQUwotCQkJCQkgKiBvZmYtY2hhbm5lbC4gKi8KLQkJCQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7Ci0JCQkJCWllZWU4MDIxMV9vZmZjaGFubmVsX3JldHVybihsb2NhbCwKLQkJCQkJCQkJICAgIHRydWUsCi0JCQkJCQkJCSAgICBmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0bXBfY2hhbl9jaGFuZ2VkKQotCQkJCS8qIFN0aWxsIG9mZi1jaGFubmVsLCBidXQgb24gc29tZSBvdGhlcgotCQkJCSAqIGNoYW5uZWwsIHNvIHVwZGF0ZSBoYXJkd2FyZS4KLQkJCQkgKiBQUyBzaG91bGQgYWxyZWFkeSBiZSBvZmYtY2hhbm5lbC4KLQkJCQkgKi8KLQkJCQlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCAwKTsKKwkJCWxvY2FsLT50bXBfY2hhbm5lbF90eXBlID0gd2stPmNoYW5fdHlwZTsKKworCQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7CiAKIAkJCXN0YXJ0ZWQgPSB0cnVlOwogCQkJd2stPnRpbWVvdXQgPSBqaWZmaWVzOwpAQCAtMTA4MiwzNCArOTg2LDE3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh3aywgJmxvY2FsLT53b3JrX2xpc3QsIGxpc3QpIHsKIAkJaWYgKCF3ay0+c3RhcnRlZCkKIAkJCWNvbnRpbnVlOwotCQlpZiAod2stPmNoYW4gIT0gbG9jYWwtPnRtcF9jaGFubmVsKQotCQkJY29udGludWU7Ci0JCWlmICghaWVlZTgwMjExX3dvcmtfY3RfY29leGlzdHMod2stPmNoYW5fdHlwZSwKLQkJCQkJCWxvY2FsLT50bXBfY2hhbm5lbF90eXBlKSkKKwkJaWYgKHdrLT5jaGFuICE9IGxvY2FsLT50bXBfY2hhbm5lbCB8fAorCQkgICAgd2stPmNoYW5fdHlwZSAhPSBsb2NhbC0+dG1wX2NoYW5uZWxfdHlwZSkKIAkJCWNvbnRpbnVlOwogCQlyZW1haW5fb2ZmX2NoYW5uZWwgPSB0cnVlOwogCX0KIAogCWlmICghcmVtYWluX29mZl9jaGFubmVsICYmIGxvY2FsLT50bXBfY2hhbm5lbCkgewogCQlsb2NhbC0+dG1wX2NoYW5uZWwgPSBOVUxMOwotCQkvKiBJZiB0bXBfY2hhbm5lbCB3YXNuJ3Qgb3BlcmF0aW5nIGNoYW5uZWwsIHRoZW4KLQkJICogd2UgbmVlZCB0byBnbyBiYWNrIG9uLWNoYW5uZWwuCi0JCSAqIE5PVEU6ICBJZiB3ZSBjYW4gZXZlciBiZSBoZXJlIHdoaWxlIHNjYW5ubmluZywKLQkJICogb3IgaWYgdGhlIGh3X2NvbmZpZygpIGNoYW5uZWwgY29uZmlnIGxvZ2ljIGNoYW5nZXMsCi0JCSAqIHRoZW4gd2UgbWF5IG5lZWQgdG8gZG8gYSBtb3JlIHRob3JvdWdoIGNoZWNrIHRvIHNlZSBpZgotCQkgKiB3ZSBzdGlsbCBuZWVkIHRvIGRvIGEgaGFyZHdhcmUgY29uZmlnLiAgQ3VycmVudGx5LAotCQkgKiB3ZSBjYW5ub3QgYmUgaGVyZSB3aGlsZSBzY2FubmluZywgaG93ZXZlci4KLQkJICovCi0JCWlmICghaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwobG9jYWwpKQotCQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7CisJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOwogCi0JCS8qIEF0IHRoZSBsZWFzdCwgd2UgbmVlZCB0byBkaXNhYmxlIG9mZmNoYW5uZWxfcHMsCi0JCSAqIHNvIGp1c3QgZ28gYWhlYWQgYW5kIHJ1biB0aGUgZW50aXJlIG9mZmNoYW5uZWwKLQkJICogcmV0dXJuIGxvZ2ljIGhlcmUuICBXZSAqY291bGQqIHNraXAgZW5hYmxpbmcKLQkJICogYmVhY29uaW5nIGlmIHdlIHdlcmUgYWxyZWFkeSBvbi1vcGVyLWNoYW5uZWwKLQkJICogYXMgYSBmdXR1cmUgb3B0aW1pemF0aW9uLgotCQkgKi8KLQkJaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKGxvY2FsLCB0cnVlLCB0cnVlKTsKKwkJaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKGxvY2FsLCB0cnVlKTsKIAogCQkvKiBnaXZlIGNvbm5lY3Rpb24gc29tZSB0aW1lIHRvIGJyZWF0aGUgKi8KIAkJcnVuX2FnYWluKGxvY2FsLCBqaWZmaWVzICsgSFovMik7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd3BhLmMgYi9uZXQvbWFjODAyMTEvd3BhLmMKaW5kZXggZjYxNGNlNy4uOTNhYWIwNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3dwYS5jCisrKyBiL25ldC9tYWM4MDIxMS93cGEuYwpAQCAtMjIzLDE0ICsyMjMsMTQgQEAKIGllZWU4MDIxMV90eF9yZXN1bHQKIGllZWU4MDIxMV9jcnlwdG9fdGtpcF9lbmNyeXB0KHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4LT5za2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCWllZWU4MDIxMV90eF9zZXRfcHJvdGVjdGVkKHR4KTsKIAotCWRvIHsKKwlza2JfcXVldWVfd2FsaygmdHgtPnNrYnMsIHNrYikgewogCQlpZiAodGtpcF9lbmNyeXB0X3NrYih0eCwgc2tiKSA8IDApCiAJCQlyZXR1cm4gVFhfRFJPUDsKLQl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CisJfQogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQpAQCAtMzkwLDcgKzM5MCw4IEBACiAJdTggc2NyYXRjaFs2ICogQUVTX0JMT0NLX1NJWkVdOwogCiAJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5ICYmCi0JICAgICEoaW5mby0+Y29udHJvbC5od19rZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSkgeworCSAgICAhKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikgJiYKKwkgICAgIShpbmZvLT5jb250cm9sLmh3X2tleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFKSkgewogCQkvKgogCQkgKiBod2FjY2VsIGhhcyBubyBuZWVkIGZvciBwcmVhbGxvY2F0ZWQgcm9vbSBmb3IgQ0NNUAogCQkgKiBoZWFkZXIgb3IgTUlDIGZpZWxkcwpAQCAtNDEyLDYgKzQxMywxMiBAQAogCiAJcG9zID0gc2tiX3B1c2goc2tiLCBDQ01QX0hEUl9MRU4pOwogCW1lbW1vdmUocG9zLCBwb3MgKyBDQ01QX0hEUl9MRU4sIGhkcmxlbik7CisKKwkvKiB0aGUgSFcgb25seSBuZWVkcyByb29tIGZvciB0aGUgSVYsIGJ1dCBub3QgdGhlIGFjdHVhbCBJViAqLworCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSAmJgorCSAgICAoaW5mby0+Y29udHJvbC5od19rZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9JVl9TUEFDRSkpCisJCXJldHVybiAwOworCiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHBvczsKIAlwb3MgKz0gaGRybGVuOwogCkBAIC00NDIsMTQgKzQ0OSwxNCBAQAogaWVlZTgwMjExX3R4X3Jlc3VsdAogaWVlZTgwMjExX2NyeXB0b19jY21wX2VuY3J5cHQoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHgtPnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJaWVlZTgwMjExX3R4X3NldF9wcm90ZWN0ZWQodHgpOwogCi0JZG8geworCXNrYl9xdWV1ZV93YWxrKCZ0eC0+c2ticywgc2tiKSB7CiAJCWlmIChjY21wX2VuY3J5cHRfc2tiKHR4LCBza2IpIDwgMCkKIAkJCXJldHVybiBUWF9EUk9QOwotCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKwl9CiAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CkBAIC01NDcsMTUgKzU1NCwyMiBAQAogaWVlZTgwMjExX3R4X3Jlc3VsdAogaWVlZTgwMjExX2NyeXB0b19hZXNfY21hY19lbmNyeXB0KHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4LT5za2I7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkgPSB0eC0+a2V5OwogCXN0cnVjdCBpZWVlODAyMTFfbW1pZSAqbW1pZTsKIAl1OCBhYWRbMjBdOwogCXU2NCBwbjY0OwogCisJaWYgKFdBUk5fT04oc2tiX3F1ZXVlX2xlbigmdHgtPnNrYnMpICE9IDEpKQorCQlyZXR1cm4gVFhfRFJPUDsKKworCXNrYiA9IHNrYl9wZWVrKCZ0eC0+c2ticyk7CisKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCiAJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5KQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIFRYX0NPTlRJTlVFOwogCiAJaWYgKFdBUk5fT04oc2tiX3RhaWxyb29tKHNrYikgPCBzaXplb2YoKm1taWUpKSkKIAkJcmV0dXJuIFRYX0RST1A7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvY29yZS5jCmluZGV4IDMzNDY4MjkuLmFmY2E2YzcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvY29yZS5jCkBAIC0xODAsMTcgKzE4MCwxNiBAQAogCQlpZiAocmV0ID09IDApCiAJCQlyZXQgPSAtRVBFUk07CiAJfSBlbHNlIGlmICgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgPT0gTkZfUVVFVUUpIHsKLQkJcmV0ID0gbmZfcXVldWUoc2tiLCBlbGVtLCBwZiwgaG9vaywgaW5kZXYsIG91dGRldiwgb2tmbiwKLQkJCSAgICAgICB2ZXJkaWN0ID4+IE5GX1ZFUkRJQ1RfUUJJVFMpOwotCQlpZiAocmV0IDwgMCkgewotCQkJaWYgKHJldCA9PSAtRUNBTkNFTEVEKQorCQlpbnQgZXJyID0gbmZfcXVldWUoc2tiLCBlbGVtLCBwZiwgaG9vaywgaW5kZXYsIG91dGRldiwgb2tmbiwKKwkJCQkJCXZlcmRpY3QgPj4gTkZfVkVSRElDVF9RQklUUyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlpZiAoZXJyID09IC1FQ0FOQ0VMRUQpCiAJCQkJZ290byBuZXh0X2hvb2s7Ci0JCQlpZiAocmV0ID09IC1FU1JDSCAmJgorCQkJaWYgKGVyciA9PSAtRVNSQ0ggJiYKIAkJCSAgICh2ZXJkaWN0ICYgTkZfVkVSRElDVF9GTEFHX1FVRVVFX0JZUEFTUykpCiAJCQkJZ290byBuZXh0X2hvb2s7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJfQotCQlyZXQgPSAwOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfY29yZS5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfY29yZS5jCmluZGV4IGQ3ZTg2ZWYuLjg2MTM3YjUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMKQEAgLTE2OTksMTAgKzE2OTksOCBAQAogCiAJaXBfc2V0X2xpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfc2V0ICopICogaXBfc2V0X21heCwKIAkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmICghaXBfc2V0X2xpc3QpIHsKLQkJcHJfZXJyKCJpcF9zZXQ6IFVuYWJsZSB0byBjcmVhdGUgaXBfc2V0X2xpc3RcbiIpOworCWlmICghaXBfc2V0X2xpc3QpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJldCA9IG5mbmV0bGlua19zdWJzeXNfcmVnaXN0ZXIoJmlwX3NldF9uZXRsaW5rX3N1YnN5cyk7CiAJaWYgKHJldCAhPSAwKSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9nZXRwb3J0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9nZXRwb3J0LmMKaW5kZXggNzU3MTQzYi4uMDUyNTc5ZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfZ2V0cG9ydC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2dldHBvcnQuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2dldHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyogV2UgbXVzdCBoYW5kbGUgbm9uLWxpbmVhciBza2JzICovCiBzdGF0aWMgYm9vbApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9wZnhsZW4uYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvcGZ4bGVuLmMKaW5kZXggYmQxM2Q2Ni4uNGYyOWZhOSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9wZnhsZW4uYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L3BmeGxlbi5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9wZnhsZW4uaD4KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCmluZGV4IDRmNzdiYjEuLjA5M2NjMzIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYwpAQCAtMTg4LDE0ICsxODgsMTMgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSB2b2lkCiBpcF92c19zZXRfc3RhdGUoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBpbnQgZGlyZWN0aW9uLAogCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQlzdHJ1Y3QgaXBfdnNfcHJvdG9fZGF0YSAqcGQpCiB7Ci0JaWYgKHVubGlrZWx5KCFwZC0+cHAtPnN0YXRlX3RyYW5zaXRpb24pKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gcGQtPnBwLT5zdGF0ZV90cmFuc2l0aW9uKGNwLCBkaXJlY3Rpb24sIHNrYiwgcGQpOworCWlmIChsaWtlbHkocGQtPnBwLT5zdGF0ZV90cmFuc2l0aW9uKSkKKwkJcGQtPnBwLT5zdGF0ZV90cmFuc2l0aW9uKGNwLCBkaXJlY3Rpb24sIHNrYiwgcGQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtNTMwLDcgKzUyOSw3IEBACiAJICAgYSBjYWNoZV9ieXBhc3MgY29ubmVjdGlvbiBlbnRyeSAqLwogCWlwdnMgPSBuZXRfaXB2cyhuZXQpOwogCWlmIChpcHZzLT5zeXNjdGxfY2FjaGVfYnlwYXNzICYmIHN2Yy0+ZndtYXJrICYmIHVuaWNhc3QpIHsKLQkJaW50IHJldCwgY3M7CisJCWludCByZXQ7CiAJCXN0cnVjdCBpcF92c19jb25uICpjcDsKIAkJdW5zaWduZWQgaW50IGZsYWdzID0gKHN2Yy0+ZmxhZ3MgJiBJUF9WU19TVkNfRl9PTkVQQUNLRVQgJiYKIAkJCQkgICAgICBpcGgucHJvdG9jb2wgPT0gSVBQUk9UT19VRFApPwpAQCAtNTU3LDcgKzU1Niw3IEBACiAJCWlwX3ZzX2luX3N0YXRzKGNwLCBza2IpOwogCiAJCS8qIHNldCBzdGF0ZSAqLwotCQljcyA9IGlwX3ZzX3NldF9zdGF0ZShjcCwgSVBfVlNfRElSX0lOUFVULCBza2IsIHBkKTsKKwkJaXBfdnNfc2V0X3N0YXRlKGNwLCBJUF9WU19ESVJfSU5QVVQsIHNrYiwgcGQpOwogCiAJCS8qIHRyYW5zbWl0IHRoZSBmaXJzdCBTWU4gcGFja2V0ICovCiAJCXJldCA9IGNwLT5wYWNrZXRfeG1pdChza2IsIGNwLCBwZC0+cHApOwpAQCAtMTQ5MCw3ICsxNDg5LDcgQEAKIAlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwOwogCXN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZDsKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0JaW50IHJldCwgcmVzdGFydCwgcGt0czsKKwlpbnQgcmV0LCBwa3RzOwogCXN0cnVjdCBuZXRuc19pcHZzICppcHZzOwogCiAJLyogQWxyZWFkeSBtYXJrZWQgYXMgSVBWUyByZXF1ZXN0IG9yIHJlcGx5PyAqLwpAQCAtMTU5MSw3ICsxNTkwLDcgQEAKIAl9CiAKIAlpcF92c19pbl9zdGF0cyhjcCwgc2tiKTsKLQlyZXN0YXJ0ID0gaXBfdnNfc2V0X3N0YXRlKGNwLCBJUF9WU19ESVJfSU5QVVQsIHNrYiwgcGQpOworCWlwX3ZzX3NldF9zdGF0ZShjcCwgSVBfVlNfRElSX0lOUFVULCBza2IsIHBkKTsKIAlpZiAoY3AtPnBhY2tldF94bWl0KQogCQlyZXQgPSBjcC0+cGFja2V0X3htaXQoc2tiLCBjcCwgcHApOwogCQkvKiBkbyBub3QgdG91Y2ggc2tiIGFueW1vcmUgKi8KQEAgLTE4NzgsMTAgKzE4NzcsOSBAQAogCXN0cnVjdCBuZXRuc19pcHZzICppcHZzOwogCiAJaXB2cyA9IG5ldF9nZW5lcmljKG5ldCwgaXBfdnNfbmV0X2lkKTsKLQlpZiAoaXB2cyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMoKTogbm8gbWVtb3J5LlxuIiwgX19mdW5jX18pOworCWlmIChpcHZzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCS8qIEhvbGQgdGhlIGJlYXN0IHVudGlsIGEgc2VydmljZSBpcyByZWdpc3RlcmQgKi8KIAlpcHZzLT5lbmFibGUgPSAwOwogCWlwdnMtPm5ldCA9IG5ldDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYwppbmRleCBlM2JlNDhiLi4wMDhiZjk3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jCkBAIC04NTYsMTUgKzg1NiwxMiBAQAogCX0KIAogCWRlc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfZGVzdCksIEdGUF9LRVJORUwpOwotCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcygpOiBubyBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGRlc3QgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJZGVzdC0+c3RhdHMuY3B1c3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGlwX3ZzX2NwdV9zdGF0cyk7Ci0JaWYgKCFkZXN0LT5zdGF0cy5jcHVzdGF0cykgewotCQlwcl9lcnIoIiVzKCkgYWxsb2NfcGVyY3B1IGZhaWxlZFxuIiwgX19mdW5jX18pOworCWlmICghZGVzdC0+c3RhdHMuY3B1c3RhdHMpCiAJCWdvdG8gZXJyX2FsbG9jOwotCX0KIAogCWRlc3QtPmFmID0gc3ZjLT5hZjsKIAlkZXN0LT5wcm90b2NvbCA9IHN2Yy0+cHJvdG9jb2w7CkBAIC0xMTY4LDEwICsxMTY1LDggQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAlzdmMtPnN0YXRzLmNwdXN0YXRzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBpcF92c19jcHVfc3RhdHMpOwotCWlmICghc3ZjLT5zdGF0cy5jcHVzdGF0cykgewotCQlwcl9lcnIoIiVzKCkgYWxsb2NfcGVyY3B1IGZhaWxlZFxuIiwgX19mdW5jX18pOworCWlmICghc3ZjLT5zdGF0cy5jcHVzdGF0cykKIAkJZ290byBvdXRfZXJyOwotCX0KIAogCS8qIEknbSB0aGUgZmlyc3QgdXNlciBvZiB0aGUgc2VydmljZSAqLwogCWF0b21pY19zZXQoJnN2Yy0+dXNlY250LCAwKTsKQEAgLTMzMjYsMTAgKzMzMjEsOCBAQAogCWludCByZXQgPSAwLCBjbWQ7CiAJaW50IG5lZWRfZnVsbF9zdmMgPSAwLCBuZWVkX2Z1bGxfZGVzdCA9IDA7CiAJc3RydWN0IG5ldCAqbmV0OwotCXN0cnVjdCBuZXRuc19pcHZzICppcHZzOwogCiAJbmV0ID0gc2tiX3NrbmV0KHNrYik7Ci0JaXB2cyA9IG5ldF9pcHZzKG5ldCk7CiAJY21kID0gaW5mby0+Z2VubGhkci0+Y21kOwogCiAJbXV0ZXhfbG9jaygmX19pcF92c19tdXRleCk7CkBAIC0zNDIxLDEwICszNDE0LDggQEAKIAl2b2lkICpyZXBseTsKIAlpbnQgcmV0LCBjbWQsIHJlcGx5X2NtZDsKIAlzdHJ1Y3QgbmV0ICpuZXQ7Ci0Jc3RydWN0IG5ldG5zX2lwdnMgKmlwdnM7CiAKIAluZXQgPSBza2Jfc2tuZXQoc2tiKTsKLQlpcHZzID0gbmV0X2lwdnMobmV0KTsKIAljbWQgPSBpbmZvLT5nZW5saGRyLT5jbWQ7CiAKIAlpZiAoY21kID09IElQVlNfQ01EX0dFVF9TRVJWSUNFKQpAQCAtMzcyMCwxMCArMzcxMSw5IEBACiAKIAkvKiBwcm9jZnMgc3RhdHMgKi8KIAlpcHZzLT50b3Rfc3RhdHMuY3B1c3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGlwX3ZzX2NwdV9zdGF0cyk7Ci0JaWYgKCFpcHZzLT50b3Rfc3RhdHMuY3B1c3RhdHMpIHsKLQkJcHJfZXJyKCIlcygpOiBhbGxvY19wZXJjcHUuXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFpcHZzLT50b3Rfc3RhdHMuY3B1c3RhdHMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCXNwaW5fbG9ja19pbml0KCZpcHZzLT50b3Rfc3RhdHMubG9jayk7CiAKIAlwcm9jX25ldF9mb3BzX2NyZWF0ZShuZXQsICJpcF92cyIsIDAsICZpcF92c19pbmZvX2ZvcHMpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2RoLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZGguYwppbmRleCA5NWZkMGQxLi4xYzI2OWU1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZGguYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZGguYwpAQCAtMTUwLDEwICsxNTAsOSBAQAogCS8qIGFsbG9jYXRlIHRoZSBESCB0YWJsZSBmb3IgdGhpcyBzZXJ2aWNlICovCiAJdGJsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCkqSVBfVlNfREhfVEFCX1NJWkUsCiAJCSAgICAgIEdGUF9BVE9NSUMpOwotCWlmICh0YmwgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzKCk6IG5vIG1lbW9yeVxuIiwgX19mdW5jX18pOworCWlmICh0YmwgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJc3ZjLT5zY2hlZF9kYXRhID0gdGJsOwogCUlQX1ZTX0RCRyg2LCAiREggaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKIAkJICAiY3VycmVudCBzZXJ2aWNlXG4iLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Z0cC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Z0cC5jCmluZGV4IDQ0OTBhMzIuLjUzOGQ3NGUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19mdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZnRwLmMKQEAgLTUyLDggKzUyLDkgQEAKICAqIExpc3Qgb2YgcG9ydHMgKHVwIHRvIElQX1ZTX0FQUF9NQVhfUE9SVFMpIHRvIGJlIGhhbmRsZWQgYnkgaGVscGVyCiAgKiBGaXJzdCBwb3J0IGlzIHNldCB0byB0aGUgZGVmYXVsdCBwb3J0LgogICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBvcnRzX2NvdW50ID0gMTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tJUF9WU19BUFBfTUFYX1BPUlRTXSA9IHsyMSwgMH07Ci1tb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2NvdW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJQb3J0cyB0byBtb25pdG9yIGZvciBGVFAgY29udHJvbCBjb21tYW5kcyIpOwogCiAKQEAgLTQ0OSw3ICs0NTAsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2V4aXQ7CiAKLQlmb3IgKGk9MDsgaTxJUF9WU19BUFBfTUFYX1BPUlRTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfY291bnQ7IGkrKykgewogCQlpZiAoIXBvcnRzW2ldKQogCQkJY29udGludWU7CiAJCXJldCA9IHJlZ2lzdGVyX2lwX3ZzX2FwcF9pbmMobmV0LCBhcHAsIGFwcC0+cHJvdG9jb2wsIHBvcnRzW2ldKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsYy5jCmluZGV4IDg3ZTQwZWEuLjBmMTYyODMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGMuYwpAQCAtMjAyLDEwICsyMDIsOCBAQAogCWVuID0gaXBfdnNfbGJsY19nZXQoZGVzdC0+YWYsIHRibCwgZGFkZHIpOwogCWlmICghZW4pIHsKIAkJZW4gPSBrbWFsbG9jKHNpemVvZigqZW4pLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFlbikgewotCQkJcHJfZXJyKCIlcygpOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJaWYgKCFlbikKIAkJCXJldHVybiBOVUxMOwotCQl9CiAKIAkJZW4tPmFmID0gZGVzdC0+YWY7CiAJCWlwX3ZzX2FkZHJfY29weShkZXN0LT5hZiwgJmVuLT5hZGRyLCBkYWRkcik7CkBAIC0zNDUsMTAgKzM0Myw5IEBACiAJICogICAgQWxsb2NhdGUgdGhlIGlwX3ZzX2xibGNfdGFibGUgZm9yIHRoaXMgc2VydmljZQogCSAqLwogCXRibCA9IGttYWxsb2Moc2l6ZW9mKCp0YmwpLCBHRlBfQVRPTUlDKTsKLQlpZiAodGJsID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcygpOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwlpZiAodGJsID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCXN2Yy0+c2NoZWRfZGF0YSA9IHRibDsKIAlJUF9WU19EQkcoNiwgIkxCTEMgaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKIAkJICAiY3VycmVudCBzZXJ2aWNlXG4iLCBzaXplb2YoKnRibCkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGNyLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYwppbmRleCA5MGY2MThhLi5lZWM3OTdmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYwpAQCAtMTEyLDEwICsxMTIsOCBAQAogCX0KIAogCWUgPSBrbWFsbG9jKHNpemVvZigqZSksIEdGUF9BVE9NSUMpOwotCWlmIChlID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcygpOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwlpZiAoZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOwogCWUtPmRlc3QgPSBkZXN0OwpAQCAtMzczLDEwICszNzEsOCBAQAogCWVuID0gaXBfdnNfbGJsY3JfZ2V0KGRlc3QtPmFmLCB0YmwsIGRhZGRyKTsKIAlpZiAoIWVuKSB7CiAJCWVuID0ga21hbGxvYyhzaXplb2YoKmVuKSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZW4pIHsKLQkJCXByX2VycigiJXMoKTogbm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCWlmICghZW4pCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQogCiAJCWVuLT5hZiA9IGRlc3QtPmFmOwogCQlpcF92c19hZGRyX2NvcHkoZGVzdC0+YWYsICZlbi0+YWRkciwgZGFkZHIpOwpAQCAtNTE2LDEwICs1MTIsOSBAQAogCSAqICAgIEFsbG9jYXRlIHRoZSBpcF92c19sYmxjcl90YWJsZSBmb3IgdGhpcyBzZXJ2aWNlCiAJICovCiAJdGJsID0ga21hbGxvYyhzaXplb2YoKnRibCksIEdGUF9BVE9NSUMpOwotCWlmICh0YmwgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzKCk6IG5vIG1lbW9yeVxuIiwgX19mdW5jX18pOworCWlmICh0YmwgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJc3ZjLT5zY2hlZF9kYXRhID0gdGJsOwogCUlQX1ZTX0RCRyg2LCAiTEJMQ1IgaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKIAkJICAiY3VycmVudCBzZXJ2aWNlXG4iLCBzaXplb2YoKnRibCkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25mY3QuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19uZmN0LmMKaW5kZXggZjQ1NGM4MC4uMDIyZTc3ZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25mY3QuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbmZjdC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAluZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkoY3QsICZuZXdfdHVwbGUpOwogfQogCi1pbnQgaXBfdnNfY29uZmlybV9jb25udHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoraW50IGlwX3ZzX2NvbmZpcm1fY29ubnRyYWNrKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIG5mX2Nvbm50cmFja19jb25maXJtKHNrYik7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG8uYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCmluZGV4IDUyZDA3M2MuLjg1MzEyOTMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCkBAIC03NCwxMCArNzQsOSBAQAogCXN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCA9CiAJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfcHJvdG9fZGF0YSksIEdGUF9BVE9NSUMpOwogCi0JaWYgKCFwZCkgewotCQlwcl9lcnIoIiVzKCk6IG5vIG1lbW9yeS5cbiIsIF9fZnVuY19fKTsKKwlpZiAoIXBkKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAlwZC0+cHAgPSBwcDsJLyogRm9yIHNwZWVkIGlzc3VlcyAqLwogCXBkLT5uZXh0ID0gaXB2cy0+cHJvdG9fZGF0YV90YWJsZVtoYXNoXTsKIAlpcHZzLT5wcm90b19kYXRhX3RhYmxlW2hhc2hdID0gcGQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fc2N0cC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3NjdHAuYwppbmRleCBkMTJlZDUzLi4xZmJmN2EyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fc2N0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b19zY3RwLmMKQEAgLTkwNiw3ICs5MDYsNyBAQAogCXJldHVybiAiPyI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIHZvaWQKIHNldF9zY3RwX3N0YXRlKHN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAogCQlpbnQgZGlyZWN0aW9uLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtOTI0LDcgKzkyNCw3IEBACiAJc2NoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaWhsICsgc2l6ZW9mKHNjdHBfc2N0cGhkcl90KSwKIAkJCQlzaXplb2YoX3NjdHBjaCksICZfc2N0cGNoKTsKIAlpZiAoc2NoID09IE5VTEwpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAljaHVua190eXBlID0gc2NoLT50eXBlOwogCS8qCkBAIC05OTMsMjEgKzk5MywxNSBAQAogCQljcC0+dGltZW91dCA9IHBkLT50aW1lb3V0X3RhYmxlW2NwLT5zdGF0ZSA9IG5leHRfc3RhdGVdOwogCWVsc2UJLyogV2hhdCB0byBkbyA/ICovCiAJCWNwLT50aW1lb3V0ID0gc2N0cF90aW1lb3V0c1tjcC0+c3RhdGUgPSBuZXh0X3N0YXRlXTsKLQotCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogc2N0cF9zdGF0ZV90cmFuc2l0aW9uKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKIAkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvX2RhdGEgKnBkKQogewotCWludCByZXQgPSAwOwotCiAJc3Bpbl9sb2NrKCZjcC0+bG9jayk7Ci0JcmV0ID0gc2V0X3NjdHBfc3RhdGUocGQsIGNwLCBkaXJlY3Rpb24sIHNrYik7CisJc2V0X3NjdHBfc3RhdGUocGQsIGNwLCBkaXJlY3Rpb24sIHNrYik7CiAJc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgX191MTYgc2N0cF9hcHBfaGFzaGtleShfX2JlMTYgcG9ydCkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b190Y3AuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b190Y3AuYwppbmRleCBjMGNjMzQxLi5lZjg2NDFmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCkBAIC01NDYsNyArNTQ2LDcgQEAKIC8qCiAgKglIYW5kbGUgc3RhdGUgdHJhbnNpdGlvbnMKICAqLwotc3RhdGljIGludAorc3RhdGljIHZvaWQKIHRjcF9zdGF0ZV90cmFuc2l0aW9uKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKIAkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgIHN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCkKQEAgLTU2MSwxMyArNTYxLDExIEBACiAKIAl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlobCwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAlpZiAodGggPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCXNwaW5fbG9jaygmY3AtPmxvY2spOwogCXNldF90Y3Bfc3RhdGUocGQsIGNwLCBkaXJlY3Rpb24sIHRoKTsKIAlzcGluX3VubG9jaygmY3AtPmxvY2spOwotCi0JcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgX191MTYgdGNwX2FwcF9oYXNoa2V5KF9fYmUxNiBwb3J0KQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCmluZGV4IGYxMjgyY2IuLmY0YjcyNjIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b191ZHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKQEAgLTQ1NCwxOCArNDU0LDE3IEBACiAJcmV0dXJuIHVkcF9zdGF0ZV9uYW1lX3RhYmxlW3N0YXRlXSA/IHVkcF9zdGF0ZV9uYW1lX3RhYmxlW3N0YXRlXSA6ICI/IjsKIH0KIAotc3RhdGljIGludAorc3RhdGljIHZvaWQKIHVkcF9zdGF0ZV90cmFuc2l0aW9uKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKIAkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgIHN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCkKIHsKIAlpZiAodW5saWtlbHkoIXBkKSkgewogCQlwcl9lcnIoIlVEUCBubyBucyBkYXRhXG4iKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAljcC0+dGltZW91dCA9IHBkLT50aW1lb3V0X3RhYmxlW0lQX1ZTX1VEUF9TX05PUk1BTF07Ci0JcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIF9fdWRwX2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgaXBfdnNfcHJvdG9fZGF0YSAqcGQpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc2guYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCmluZGV4IGI1ZTI1NTYuLjMzODE1ZjQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCkBAIC0xNDcsMTAgKzE0Nyw5IEBACiAJLyogYWxsb2NhdGUgdGhlIFNIIHRhYmxlIGZvciB0aGlzIHNlcnZpY2UgKi8KIAl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0KSpJUF9WU19TSF9UQUJfU0laRSwKIAkJICAgICAgR0ZQX0FUT01JQyk7Ci0JaWYgKHRibCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMoKTogbm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJaWYgKHRibCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAlzdmMtPnNjaGVkX2RhdGEgPSB0Ymw7CiAJSVBfVlNfREJHKDYsICJTSCBoYXNoIHRhYmxlIChtZW1vcnk9JVpkYnl0ZXMpIGFsbG9jYXRlZCBmb3IgIgogCQkgICJjdXJyZW50IHNlcnZpY2VcbiIsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfd3JyLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfd3JyLmMKaW5kZXggMWVmNDFmNS4uZmQwZDRlMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3dyci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c193cnIuYwpAQCAtODUsMTAgKzg1LDkgQEAKIAkgKiAgICBBbGxvY2F0ZSB0aGUgbWFyayB2YXJpYWJsZSBmb3IgV1JSIHNjaGVkdWxpbmcKIAkgKi8KIAltYXJrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX3dycl9tYXJrKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKG1hcmsgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzKCk6IG5vIG1lbW9yeVxuIiwgX19mdW5jX18pOworCWlmIChtYXJrID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCW1hcmstPmNsID0gJnN2Yy0+ZGVzdGluYXRpb25zOwogCW1hcmstPmN3ID0gMDsKIAltYXJrLT5tdyA9IGlwX3ZzX3dycl9tYXhfd2VpZ2h0KHN2Yyk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3htaXQuYwppbmRleCBlZTMxOWE0Li5hYTJkNzIwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c194bWl0LmMKQEAgLTMzOSw3ICszMzksNyBAQAogCQkJCQkJCQlcCiAJKHNrYiktPmlwdnNfcHJvcGVydHkgPSAxOwkJCQlcCiAJaWYgKHVubGlrZWx5KChjcCktPmZsYWdzICYgSVBfVlNfQ09OTl9GX05GQ1QpKQkJXAotCQlfX3JldCA9IGlwX3ZzX2NvbmZpcm1fY29ubnRyYWNrKHNrYiwgY3ApOwlcCisJCV9fcmV0ID0gaXBfdnNfY29uZmlybV9jb25udHJhY2soc2tiKTsJCVwKIAlpZiAoX19yZXQgPT0gTkZfQUNDRVBUKSB7CQkJCVwKIAkJbmZfcmVzZXQoc2tiKTsJCQkJCVwKIAkJc2tiX2ZvcndhcmRfY3N1bShza2IpOwkJCQlcCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMKaW5kZXggNTE3OGM2OS4uMzY5ZGYzZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaD4KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwppbmRleCA1YWNmYWY1Li43MjAyYjA2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCkBAIC02NjEsNyArNjYxLDYgQEAKIAkgKi8KIAljdCA9IGttZW1fY2FjaGVfYWxsb2MobmV0LT5jdC5uZl9jb25udHJhY2tfY2FjaGVwLCBnZnApOwogCWlmIChjdCA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCJuZl9jb25udHJhY2tfYWxsb2M6IENhbid0IGFsbG9jIGNvbm50cmFjay5cbiIpOwogCQlhdG9taWNfZGVjKCZuZXQtPmN0LmNvdW50KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQpAQCAtNzQ5LDEwICs3NDgsOCBAQAogCiAJY3QgPSBfX25mX2Nvbm50cmFja19hbGxvYyhuZXQsIHpvbmUsIHR1cGxlLCAmcmVwbF90dXBsZSwgR0ZQX0FUT01JQywKIAkJCQkgIGhhc2gpOwotCWlmIChJU19FUlIoY3QpKSB7Ci0JCXByX2RlYnVnKCJDYW4ndCBhbGxvY2F0ZSBjb25udHJhY2suXG4iKTsKKwlpZiAoSVNfRVJSKGN0KSkKIAkJcmV0dXJuIChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKiljdDsKLQl9CiAKIAlpZiAoIWw0cHJvdG8tPm5ldyhjdCwgc2tiLCBkYXRhb2ZmKSkgewogCQluZl9jb25udHJhY2tfZnJlZShjdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCmluZGV4IDNhZGQ5OTQuLjZiMzY4YmUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCmluZGV4IGNkMWU4ZTAuLjM0MGM4MGQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwppbmRleCAyZDgxNThhLi42NmIyYzU0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwpAQCAtMzA3LDE3ICszMDcsMTQgQEAKIAluID0gbWF4KGluc3Rfc2l6ZSwgcGt0X3NpemUpOwogCXNrYiA9IGFsbG9jX3NrYihuLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikgewotCQlwcl9ub3RpY2UoIm5mbmV0bGlua19sb2c6IGNhbid0IGFsbG9jIHdob2xlIGJ1ZmZlciAoJXUgYnl0ZXMpXG4iLAotCQkJaW5zdF9zaXplKTsKLQogCQlpZiAobiA+IHBrdF9zaXplKSB7CiAJCQkvKiB0cnkgdG8gYWxsb2NhdGUgb25seSBhcyBtdWNoIGFzIHdlIG5lZWQgZm9yIGN1cnJlbnQKIAkJCSAqIHBhY2tldCAqLwogCiAJCQlza2IgPSBhbGxvY19za2IocGt0X3NpemUsIEdGUF9BVE9NSUMpOwogCQkJaWYgKCFza2IpCi0JCQkJcHJfZXJyKCJuZm5ldGxpbmtfbG9nOiBjYW4ndCBldmVuIGFsbG9jICV1ICIKLQkJCQkgICAgICAgImJ5dGVzXG4iLCBwa3Rfc2l6ZSk7CisJCQkJcHJfZXJyKCJuZm5ldGxpbmtfbG9nOiBjYW4ndCBldmVuIGFsbG9jICV1IGJ5dGVzXG4iLAorCQkJCSAgICAgICBwa3Rfc2l6ZSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwppbmRleCA3MTQ0MWI5Li44ZDk4N2MzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKi8KICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5jIGIvbmV0L25ldGZpbHRlci94dF9JRExFVElNRVIuYwppbmRleCAzYmRkNDQzLi5mNDA3ZWJjMSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9JRExFVElNRVIuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5jCkBAIC0xMjIsMTQgKzEyMiwxMiBAQAogCiAJaW5mby0+dGltZXIgPSBrbWFsbG9jKHNpemVvZigqaW5mby0+dGltZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8tPnRpbWVyKSB7Ci0JCXByX2RlYnVnKCJjb3VsZG4ndCBhbGxvYyB0aW1lclxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAogCWluZm8tPnRpbWVyLT5hdHRyLmF0dHIubmFtZSA9IGtzdHJkdXAoaW5mby0+bGFiZWwsIEdGUF9LRVJORUwpOwogCWlmICghaW5mby0+dGltZXItPmF0dHIuYXR0ci5uYW1lKSB7Ci0JCXByX2RlYnVnKCJjb3VsZG4ndCBhbGxvYyBhdHRyaWJ1dGUgbmFtZVxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWVfdGltZXI7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKaW5kZXggOTIyOGVlMGQuLmRmZDUyYmEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYwpAQCAtMTc2LDEwICsxNzYsNyBAQAogCQllbnQgPSBOVUxMOwogCX0gZWxzZQogCQllbnQgPSBrbWVtX2NhY2hlX2FsbG9jKGhhc2hsaW1pdF9jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmICghZW50KSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcl9lcnIoImNhbm5vdCBhbGxvY2F0ZSBkc3RoYXNoX2VudFxuIik7Ci0JfSBlbHNlIHsKKwlpZiAoZW50KSB7CiAJCW1lbWNweSgmZW50LT5kc3QsIGRzdCwgc2l6ZW9mKGVudC0+ZHN0KSk7CiAJCXNwaW5fbG9ja19pbml0KCZlbnQtPmxvY2spOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3F1b3RhLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3F1b3RhLmMKaW5kZXggNzBlYjJiNC4uNDRjOGViNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9xdW90YS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcXVvdGEuYwpAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9xdW90YS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdHJ1Y3QgeHRfcXVvdGFfcHJpdiB7CiAJc3BpbmxvY2tfdAlsb2NrOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zdGF0aXN0aWMuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGlzdGljLmMKaW5kZXggNDJlY2I3MS4uNGZlNGZiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zdGF0aXN0aWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRpc3RpYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfc3RhdGlzdGljLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCB4dF9zdGF0aXN0aWNfcHJpdiB7CiAJYXRvbWljX3QgY291bnQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX3JvdXRlLmMgYi9uZXQvbmV0cm9tL25yX3JvdXRlLmMKaW5kZXggY2Q1ZGRiMi4uOTE1YTg3YiAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCisrKyBiL25ldC9uZXRyb20vbnJfcm91dGUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bmV0L25ldHJvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfbmVpZ2hfbm8gPSAxOwogCmRpZmYgLS1naXQgYS9uZXQvbmZjL2FmX25mYy5jIGIvbmV0L25mYy9hZl9uZmMuYwppbmRleCBlOTgyY2VmLi5kYTY3NzU2IDEwMDY0NAotLS0gYS9uZXQvbmZjL2FmX25mYy5jCisrKyBiL25ldC9uZmMvYWZfbmZjLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbmZjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJuZmMuaCIKIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9jb3JlLmMgYi9uZXQvbmZjL2NvcmUuYwppbmRleCA0N2UwMmMxLi4zZWJjNmIzYWEgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvY29yZS5jCisrKyBiL25ldC9uZmMvY29yZS5jCkBAIC0yMSw2ICsyMSw4IEBACiAgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTMzLDI1ICszNSw2IEBACiBpbnQgbmZjX2Rldmxpc3RfZ2VuZXJhdGlvbjsKIERFRklORV9NVVRFWChuZmNfZGV2bGlzdF9tdXRleCk7CiAKLWludCBuZmNfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLQlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKLQl2YV9saXN0IGFyZ3M7Ci0JaW50IHI7Ci0KLQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotCi0JdmFmLmZtdCA9IGZvcm1hdDsKLQl2YWYudmEgPSAmYXJnczsKLQotCXIgPSBwcmludGsoIiVzTkZDOiAlcFZcbiIsIGxldmVsLCAmdmFmKTsKLQotCXZhX2VuZChhcmdzKTsKLQotCXJldHVybiByOwotfQotRVhQT1JUX1NZTUJPTChuZmNfcHJpbnRrKTsKLQogLyoqCiAgKiBuZmNfZGV2X3VwIC0gdHVybiBvbiB0aGUgTkZDIGRldmljZQogICoKQEAgLTYzLDcgKzQ2LDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwlwcl9kZWJ1ZygiZGV2X25hbWU9JXNcbiIsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJZGV2aWNlX2xvY2soJmRldi0+ZGV2KTsKIApAQCAtOTcsNyArODAsNyBAQAogewogCWludCByYyA9IDA7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyIsIGRldl9uYW1lKCZkZXYtPmRldikpOworCXByX2RlYnVnKCJkZXZfbmFtZT0lc1xuIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0xMzksNyArMTIyLDggQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyBwcm90b2NvbHM9MHgleCIsIGRldl9uYW1lKCZkZXYtPmRldiksIHByb3RvY29scyk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIHByb3RvY29scz0weCV4XG4iLAorCQkgZGV2X25hbWUoJmRldi0+ZGV2KSwgcHJvdG9jb2xzKTsKIAogCWlmICghcHJvdG9jb2xzKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE3NCw3ICsxNTgsNyBAQAogewogCWludCByYyA9IDA7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyIsIGRldl9uYW1lKCZkZXYtPmRldikpOworCXByX2RlYnVnKCJkZXZfbmFtZT0lc1xuIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0yMDcsOCArMTkxLDggQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1IHByb3RvY29sPSV1IiwgZGV2X25hbWUoJmRldi0+ZGV2KSwKLQkJCQkJCQl0YXJnZXRfaWR4LCBwcm90b2NvbCk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIHRhcmdldF9pZHg9JXUgcHJvdG9jb2w9JXVcbiIsCisJCSBkZXZfbmFtZSgmZGV2LT5kZXYpLCB0YXJnZXRfaWR4LCBwcm90b2NvbCk7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0yMzYsNyArMjIwLDggQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMgdGFyZ2V0X2lkeD0ldSIsIGRldl9uYW1lKCZkZXYtPmRldiksIHRhcmdldF9pZHgpOworCXByX2RlYnVnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1XG4iLAorCQkgZGV2X25hbWUoJmRldi0+ZGV2KSwgdGFyZ2V0X2lkeCk7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0yNzEsOCArMjU2LDggQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1IHNrYi0+bGVuPSV1IiwgZGV2X25hbWUoJmRldi0+ZGV2KSwKLQkJCQkJCQl0YXJnZXRfaWR4LCBza2ItPmxlbik7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIHRhcmdldF9pZHg9JXUgc2tiLT5sZW49JXVcbiIsCisJCSBkZXZfbmFtZSgmZGV2LT5kZXYpLCB0YXJnZXRfaWR4LCBza2ItPmxlbik7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0zMjYsNyArMzExLDcgQEAKIHsKIAlpbnQgaTsKIAotCW5mY19kYmcoImRldl9uYW1lPSVzIG5fdGFyZ2V0cz0lZCIsIGRldl9uYW1lKCZkZXYtPmRldiksIG5fdGFyZ2V0cyk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIG5fdGFyZ2V0cz0lZFxuIiwgZGV2X25hbWUoJmRldi0+ZGV2KSwgbl90YXJnZXRzKTsKIAogCWRldi0+cG9sbGluZyA9IGZhbHNlOwogCkBAIC0zNjAsNyArMzQ1LDcgQEAKIHsKIAlzdHJ1Y3QgbmZjX2RldiAqZGV2ID0gdG9fbmZjX2RldihkKTsKIAotCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCW5mY19nZW5sX2RhdGFfZXhpdCgmZGV2LT5nZW5sX2RhdGEpOwogCWtmcmVlKGRldi0+dGFyZ2V0cyk7CkBAIC00NDYsNyArNDMxLDcgQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyIsIGRldl9uYW1lKCZkZXYtPmRldikpOworCXByX2RlYnVnKCJkZXZfbmFtZT0lc1xuIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAKIAltdXRleF9sb2NrKCZuZmNfZGV2bGlzdF9tdXRleCk7CiAJbmZjX2Rldmxpc3RfZ2VuZXJhdGlvbisrOwpAQCAtNDU4LDkgKzQ0Myw4IEBACiAKIAlyYyA9IG5mY19nZW5sX2RldmljZV9hZGRlZChkZXYpOwogCWlmIChyYykKLQkJbmZjX2RiZygiVGhlIHVzZXJzcGFjZSB3b24ndCBiZSBub3RpZmllZCB0aGF0IHRoZSBkZXZpY2UgJXMgd2FzIgotCQkJCQkJIiBhZGRlZCIsIGRldl9uYW1lKCZkZXYtPmRldikpOwotCisJCXByX2RlYnVnKCJUaGUgdXNlcnNwYWNlIHdvbid0IGJlIG5vdGlmaWVkIHRoYXQgdGhlIGRldmljZSAlcyB3YXMgYWRkZWRcbiIsCisJCQkgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ3NSw3ICs0NTksNyBAQAogewogCWludCByYzsKIAotCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCW11dGV4X2xvY2soJm5mY19kZXZsaXN0X211dGV4KTsKIAluZmNfZGV2bGlzdF9nZW5lcmF0aW9uKys7CkBAIC00OTAsOCArNDc0LDggQEAKIAogCXJjID0gbmZjX2dlbmxfZGV2aWNlX3JlbW92ZWQoZGV2KTsKIAlpZiAocmMpCi0JCW5mY19kYmcoIlRoZSB1c2Vyc3BhY2Ugd29uJ3QgYmUgbm90aWZpZWQgdGhhdCB0aGUgZGV2aWNlICVzIgotCQkJCQkiIHdhcyByZW1vdmVkIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJCXByX2RlYnVnKCJUaGUgdXNlcnNwYWNlIHdvbid0IGJlIG5vdGlmaWVkIHRoYXQgdGhlIGRldmljZSAlcyB3YXMgcmVtb3ZlZFxuIiwKKwkJCSBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogfQogRVhQT1JUX1NZTUJPTChuZmNfdW5yZWdpc3Rlcl9kZXZpY2UpOwpAQCAtNTAwLDcgKzQ4NCw3IEBACiB7CiAJaW50IHJjOwogCi0JbmZjX2luZm8oIk5GQyBDb3JlIHZlciAlcyIsIFZFUlNJT04pOworCXByX2luZm8oIk5GQyBDb3JlIHZlciAlc1xuIiwgVkVSU0lPTik7CiAKIAlyYyA9IGNsYXNzX3JlZ2lzdGVyKCZuZmNfY2xhc3MpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmNpL2NvcmUuYyBiL25ldC9uZmMvbmNpL2NvcmUuYwppbmRleCA0MDQ3ZTI5Li4zN2RlMjhlIDEwMDY0NAotLS0gYS9uZXQvbmZjL25jaS9jb3JlLmMKKysrIGIvbmV0L25mYy9uY2kvY29yZS5jCkBAIC0yNSw5ICsyNSwxMiBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpAQCAtNzgsNyArODEsNyBAQAogCQkJCQkJCSZuZGV2LT5yZXFfY29tcGxldGlvbiwKIAkJCQkJCQl0aW1lb3V0KTsKIAotCW5mY19kYmcoIndhaXRfZm9yX2NvbXBsZXRpb24gcmV0dXJuICVsZCIsIGNvbXBsZXRpb25fcmMpOworCXByX2RlYnVnKCJ3YWl0X2Zvcl9jb21wbGV0aW9uIHJldHVybiAlbGRcbiIsIGNvbXBsZXRpb25fcmMpOwogCiAJaWYgKGNvbXBsZXRpb25fcmMgPiAwKSB7CiAJCXN3aXRjaCAobmRldi0+cmVxX3N0YXR1cykgewpAQCAtOTUsOCArOTgsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgewotCQluZmNfZXJyKCJ3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCBmYWlsZWQgJWxkIiwKLQkJCWNvbXBsZXRpb25fcmMpOworCQlwcl9lcnIoIndhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0IGZhaWxlZCAlbGRcbiIsCisJCSAgICAgICBjb21wbGV0aW9uX3JjKTsKIAogCQlyYyA9ICgoY29tcGxldGlvbl9yYyA9PSAwKSA/ICgtRVRJTUVET1VUKSA6IChjb21wbGV0aW9uX3JjKSk7CiAJfQpAQCAtMTI1LDcgKzEyOCwxMCBAQAogCiBzdGF0aWMgdm9pZCBuY2lfcmVzZXRfcmVxKHN0cnVjdCBuY2lfZGV2ICpuZGV2LCB1bnNpZ25lZCBsb25nIG9wdCkKIHsKLQluY2lfc2VuZF9jbWQobmRldiwgTkNJX09QX0NPUkVfUkVTRVRfQ01ELCAwLCBOVUxMKTsKKwlzdHJ1Y3QgbmNpX2NvcmVfcmVzZXRfY21kIGNtZDsKKworCWNtZC5yZXNldF90eXBlID0gTkNJX1JFU0VUX1RZUEVfUkVTRVRfQ09ORklHOworCW5jaV9zZW5kX2NtZChuZGV2LCBOQ0lfT1BfQ09SRV9SRVNFVF9DTUQsIDEsICZjbWQpOwogfQogCiBzdGF0aWMgdm9pZCBuY2lfaW5pdF9yZXEoc3RydWN0IG5jaV9kZXYgKm5kZXYsIHVuc2lnbmVkIGxvbmcgb3B0KQpAQCAtMTM1LDE3ICsxNDEsMTEgQEAKIAogc3RhdGljIHZvaWQgbmNpX2luaXRfY29tcGxldGVfcmVxKHN0cnVjdCBuY2lfZGV2ICpuZGV2LCB1bnNpZ25lZCBsb25nIG9wdCkKIHsKLQlzdHJ1Y3QgbmNpX2NvcmVfY29ubl9jcmVhdGVfY21kIGNvbm5fY21kOwogCXN0cnVjdCBuY2lfcmZfZGlzY19tYXBfY21kIGNtZDsKIAlzdHJ1Y3QgZGlzY19tYXBfY29uZmlnICpjZmcgPSBjbWQubWFwcGluZ19jb25maWdzOwogCV9fdTggKm51bSA9ICZjbWQubnVtX21hcHBpbmdfY29uZmlnczsKIAlpbnQgaTsKIAotCS8qIGNyZWF0ZSBzdGF0aWMgcmYgY29ubmVjdGlvbiAqLwotCWNvbm5fY21kLnRhcmdldF9oYW5kbGUgPSAwOwotCWNvbm5fY21kLm51bV90YXJnZXRfc3BlY2lmaWNfcGFyYW1zID0gMDsKLQluY2lfc2VuZF9jbWQobmRldiwgTkNJX09QX0NPUkVfQ09OTl9DUkVBVEVfQ01ELCAyLCAmY29ubl9jbWQpOwotCiAJLyogc2V0IHJmIG1hcHBpbmcgY29uZmlndXJhdGlvbnMgKi8KIAkqbnVtID0gMDsKIApAQCAtMzI1LDggKzMyNSw2IEBACiB7CiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSAodm9pZCAqKSBhcmc7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJYXRvbWljX3NldCgmbmRldi0+Y21kX2NudCwgMSk7CiAJcXVldWVfd29yayhuZGV2LT5jbWRfd3EsICZuZGV2LT5jbWRfd29yayk7CiB9CkBAIC0zMzUsOCArMzMzLDYgQEAKIHsKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IG5mY19nZXRfZHJ2ZGF0YShuZmNfZGV2KTsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlyZXR1cm4gbmNpX29wZW5fZGV2aWNlKG5kZXYpOwogfQogCkBAIC0zNDQsOCArMzQwLDYgQEAKIHsKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IG5mY19nZXRfZHJ2ZGF0YShuZmNfZGV2KTsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlyZXR1cm4gbmNpX2Nsb3NlX2RldmljZShuZGV2KTsKIH0KIApAQCAtMzU0LDIwICszNDgsMTggQEAKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IG5mY19nZXRfZHJ2ZGF0YShuZmNfZGV2KTsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaWYgKHRlc3RfYml0KE5DSV9ESVNDT1ZFUlksICZuZGV2LT5mbGFncykpIHsKLQkJbmZjX2VycigidW5hYmxlIHRvIHN0YXJ0IHBvbGwsIHNpbmNlIHBvbGwgaXMgYWxyZWFkeSBhY3RpdmUiKTsKKwkJcHJfZXJyKCJ1bmFibGUgdG8gc3RhcnQgcG9sbCwgc2luY2UgcG9sbCBpcyBhbHJlYWR5IGFjdGl2ZVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJaWYgKG5kZXYtPnRhcmdldF9hY3RpdmVfcHJvdCkgewotCQluZmNfZXJyKCJ0aGVyZSBpcyBhbiBhY3RpdmUgdGFyZ2V0Iik7CisJCXByX2VycigidGhlcmUgaXMgYW4gYWN0aXZlIHRhcmdldFxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJaWYgKHRlc3RfYml0KE5DSV9QT0xMX0FDVElWRSwgJm5kZXYtPmZsYWdzKSkgewotCQluZmNfZGJnKCJ0YXJnZXQgaXMgYWN0aXZlLCBpbXBsaWNpdGx5IGRlYWN0aXZhdGUuLi4iKTsKKwkJcHJfZGVidWcoInRhcmdldCBpcyBhY3RpdmUsIGltcGxpY2l0bHkgZGVhY3RpdmF0ZS4uLlxuIik7CiAKIAkJcmMgPSBuY2lfcmVxdWVzdChuZGV2LCBuY2lfcmZfZGVhY3RpdmF0ZV9yZXEsIDAsCiAJCQltc2Vjc190b19qaWZmaWVzKE5DSV9SRl9ERUFDVElWQVRFX1RJTUVPVVQpKTsKQEAgLTM4OCwxMCArMzgwLDggQEAKIHsKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IG5mY19nZXRfZHJ2ZGF0YShuZmNfZGV2KTsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIXRlc3RfYml0KE5DSV9ESVNDT1ZFUlksICZuZGV2LT5mbGFncykpIHsKLQkJbmZjX2VycigidW5hYmxlIHRvIHN0b3AgcG9sbCwgc2luY2UgcG9sbCBpcyBub3QgYWN0aXZlIik7CisJCXByX2VycigidW5hYmxlIHRvIHN0b3AgcG9sbCwgc2luY2UgcG9sbCBpcyBub3QgYWN0aXZlXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDA0LDIxICszOTQsMjEgQEAKIHsKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IG5mY19nZXRfZHJ2ZGF0YShuZmNfZGV2KTsKIAotCW5mY19kYmcoImVudHJ5LCB0YXJnZXRfaWR4ICVkLCBwcm90b2NvbCAweCV4IiwgdGFyZ2V0X2lkeCwgcHJvdG9jb2wpOworCXByX2RlYnVnKCJ0YXJnZXRfaWR4ICVkLCBwcm90b2NvbCAweCV4XG4iLCB0YXJnZXRfaWR4LCBwcm90b2NvbCk7CiAKIAlpZiAoIXRlc3RfYml0KE5DSV9QT0xMX0FDVElWRSwgJm5kZXYtPmZsYWdzKSkgewotCQluZmNfZXJyKCJ0aGVyZSBpcyBubyBhdmFpbGFibGUgdGFyZ2V0IHRvIGFjdGl2YXRlIik7CisJCXByX2VycigidGhlcmUgaXMgbm8gYXZhaWxhYmxlIHRhcmdldCB0byBhY3RpdmF0ZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChuZGV2LT50YXJnZXRfYWN0aXZlX3Byb3QpIHsKLQkJbmZjX2VycigidGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUgdGFyZ2V0Iik7CisJCXByX2VycigidGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUgdGFyZ2V0XG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlpZiAoIShuZGV2LT50YXJnZXRfYXZhaWxhYmxlX3Byb3RzICYgKDEgPDwgcHJvdG9jb2wpKSkgewotCQluZmNfZXJyKCJ0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHByb3RvY29sIDB4JXgiLAotCQkJcHJvdG9jb2wpOworCQlwcl9lcnIoInRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgMHgleFxuIiwKKwkJICAgICAgIHByb3RvY29sKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00MzIsMTAgKzQyMiwxMCBAQAogewogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOwogCi0JbmZjX2RiZygiZW50cnksIHRhcmdldF9pZHggJWQiLCB0YXJnZXRfaWR4KTsKKwlwcl9kZWJ1ZygidGFyZ2V0X2lkeCAlZFxuIiwgdGFyZ2V0X2lkeCk7CiAKIAlpZiAoIW5kZXYtPnRhcmdldF9hY3RpdmVfcHJvdCkgewotCQluZmNfZXJyKCJ1bmFibGUgdG8gZGVhY3RpdmF0ZSB0YXJnZXQsIG5vIGFjdGl2ZSB0YXJnZXQiKTsKKwkJcHJfZXJyKCJ1bmFibGUgdG8gZGVhY3RpdmF0ZSB0YXJnZXQsIG5vIGFjdGl2ZSB0YXJnZXRcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC00NTUsMTAgKzQ0NSwxMCBAQAogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOwogCWludCByYzsKIAotCW5mY19kYmcoImVudHJ5LCB0YXJnZXRfaWR4ICVkLCBsZW4gJWQiLCB0YXJnZXRfaWR4LCBza2ItPmxlbik7CisJcHJfZGVidWcoInRhcmdldF9pZHggJWQsIGxlbiAlZFxuIiwgdGFyZ2V0X2lkeCwgc2tiLT5sZW4pOwogCiAJaWYgKCFuZGV2LT50YXJnZXRfYWN0aXZlX3Byb3QpIHsKLQkJbmZjX2VycigidW5hYmxlIHRvIGV4Y2hhbmdlIGRhdGEsIG5vIGFjdGl2ZSB0YXJnZXQiKTsKKwkJcHJfZXJyKCJ1bmFibGUgdG8gZXhjaGFuZ2UgZGF0YSwgbm8gYWN0aXZlIHRhcmdldFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDY5LDcgKzQ1OSw3IEBACiAJbmRldi0+ZGF0YV9leGNoYW5nZV9jYiA9IGNiOwogCW5kZXYtPmRhdGFfZXhjaGFuZ2VfY2JfY29udGV4dCA9IGNiX2NvbnRleHQ7CiAKLQlyYyA9IG5jaV9zZW5kX2RhdGEobmRldiwgbmRldi0+Y29ubl9pZCwgc2tiKTsKKwlyYyA9IG5jaV9zZW5kX2RhdGEobmRldiwgTkNJX1NUQVRJQ19SRl9DT05OX0lELCBza2IpOwogCWlmIChyYykKIAkJY2xlYXJfYml0KE5DSV9EQVRBX0VYQ0hBTkdFLCAmbmRldi0+ZmxhZ3MpOwogCkBAIC01MDEsNyArNDkxLDcgQEAKIHsKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldjsKIAotCW5mY19kYmcoImVudHJ5LCBzdXBwb3J0ZWRfcHJvdG9jb2xzIDB4JXgiLCBzdXBwb3J0ZWRfcHJvdG9jb2xzKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3Byb3RvY29scyAweCV4XG4iLCBzdXBwb3J0ZWRfcHJvdG9jb2xzKTsKIAogCWlmICghb3BzLT5vcGVuIHx8ICFvcHMtPmNsb3NlIHx8ICFvcHMtPnNlbmQpCiAJCXJldHVybiBOVUxMOwpAQCAtNTQxLDggKzUzMSw2IEBACiAgKi8KIHZvaWQgbmNpX2ZyZWVfZGV2aWNlKHN0cnVjdCBuY2lfZGV2ICpuZGV2KQogewotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAluZmNfZnJlZV9kZXZpY2UobmRldi0+bmZjX2Rldik7CiAJa2ZyZWUobmRldik7CiB9CkBAIC01NTksOCArNTQ3LDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbmRldi0+bmZjX2Rldi0+ZGV2OwogCWNoYXIgbmFtZVszMl07CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJcmMgPSBuZmNfcmVnaXN0ZXJfZGV2aWNlKG5kZXYtPm5mY19kZXYpOwogCWlmIChyYykKIAkJZ290byBleGl0OwpAQCAtNjIzLDggKzYwOSw2IEBACiAgKi8KIHZvaWQgbmNpX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBuY2lfZGV2ICpuZGV2KQogewotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAluY2lfY2xvc2VfZGV2aWNlKG5kZXYpOwogCiAJZGVzdHJveV93b3JrcXVldWUobmRldi0+Y21kX3dxKTsKQEAgLTY0NCw3ICs2MjgsNyBAQAogewogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gKHN0cnVjdCBuY2lfZGV2ICopIHNrYi0+ZGV2OwogCi0JbmZjX2RiZygiZW50cnksIGxlbiAlZCIsIHNrYi0+bGVuKTsKKwlwcl9kZWJ1ZygibGVuICVkXG4iLCBza2ItPmxlbik7CiAKIAlpZiAoIW5kZXYgfHwgKCF0ZXN0X2JpdChOQ0lfVVAsICZuZGV2LT5mbGFncykKIAkJJiYgIXRlc3RfYml0KE5DSV9JTklULCAmbmRldi0+ZmxhZ3MpKSkgewpAQCAtNjY0LDcgKzY0OCw3IEBACiB7CiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSAoc3RydWN0IG5jaV9kZXYgKikgc2tiLT5kZXY7CiAKLQluZmNfZGJnKCJlbnRyeSwgbGVuICVkIiwgc2tiLT5sZW4pOworCXByX2RlYnVnKCJsZW4gJWRcbiIsIHNrYi0+bGVuKTsKIAogCWlmICghbmRldikgewogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTY4MywxMSArNjY3LDExIEBACiAJc3RydWN0IG5jaV9jdHJsX2hkciAqaGRyOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQluZmNfZGJnKCJlbnRyeSwgb3Bjb2RlIDB4JXgsIHBsZW4gJWQiLCBvcGNvZGUsIHBsZW4pOworCXByX2RlYnVnKCJvcGNvZGUgMHgleCwgcGxlbiAlZFxuIiwgb3Bjb2RlLCBwbGVuKTsKIAogCXNrYiA9IG5jaV9za2JfYWxsb2MobmRldiwgKE5DSV9DVFJMX0hEUl9TSVpFICsgcGxlbiksIEdGUF9LRVJORUwpOwogCWlmICghc2tiKSB7Ci0JCW5mY19lcnIoIm5vIG1lbW9yeSBmb3IgY29tbWFuZCIpOworCQlwcl9lcnIoIm5vIG1lbW9yeSBmb3IgY29tbWFuZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNzE3LDcgKzcwMSw3IEBACiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5jaV9kZXYsIHR4X3dvcmspOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQluZmNfZGJnKCJlbnRyeSwgY3JlZGl0c19jbnQgJWQiLCBhdG9taWNfcmVhZCgmbmRldi0+Y3JlZGl0c19jbnQpKTsKKwlwcl9kZWJ1ZygiY3JlZGl0c19jbnQgJWRcbiIsIGF0b21pY19yZWFkKCZuZGV2LT5jcmVkaXRzX2NudCkpOwogCiAJLyogU2VuZCBxdWV1ZWQgdHggZGF0YSAqLwogCXdoaWxlIChhdG9taWNfcmVhZCgmbmRldi0+Y3JlZGl0c19jbnQpKSB7CkBAIC03MjUsMTIgKzcwOSwxNSBAQAogCQlpZiAoIXNrYikKIAkJCXJldHVybjsKIAotCQlhdG9taWNfZGVjKCZuZGV2LT5jcmVkaXRzX2NudCk7CisJCS8qIENoZWNrIGlmIGRhdGEgZmxvdyBjb250cm9sIGlzIHVzZWQgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZuZGV2LT5jcmVkaXRzX2NudCkgIT0KKwkJCQlOQ0lfREFUQV9GTE9XX0NPTlRST0xfTk9UX1VTRUQpCisJCQlhdG9taWNfZGVjKCZuZGV2LT5jcmVkaXRzX2NudCk7CiAKLQkJbmZjX2RiZygiTkNJIFRYOiBNVD1kYXRhLCBQQkY9JWQsIGNvbm5faWQ9JWQsIHBsZW49JWQiLAotCQkJCW5jaV9wYmYoc2tiLT5kYXRhKSwKLQkJCQluY2lfY29ubl9pZChza2ItPmRhdGEpLAotCQkJCW5jaV9wbGVuKHNrYi0+ZGF0YSkpOworCQlwcl9kZWJ1ZygiTkNJIFRYOiBNVD1kYXRhLCBQQkY9JWQsIGNvbm5faWQ9JWQsIHBsZW49JWRcbiIsCisJCQkgbmNpX3BiZihza2ItPmRhdGEpLAorCQkJIG5jaV9jb25uX2lkKHNrYi0+ZGF0YSksCisJCQkgbmNpX3BsZW4oc2tiLT5kYXRhKSk7CiAKIAkJbmNpX3NlbmRfZnJhbWUoc2tiKTsKIAl9CkBAIC03NTksNyArNzQ2LDcgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQluZmNfZXJyKCJ1bmtub3duIE1UIDB4JXgiLCBuY2lfbXQoc2tiLT5kYXRhKSk7CisJCQlwcl9lcnIoInVua25vd24gTVQgMHgleFxuIiwgbmNpX210KHNrYi0+ZGF0YSkpOwogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlicmVhazsKIAkJfQpAQCAtNzczLDcgKzc2MCw3IEBACiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5jaV9kZXYsIGNtZF93b3JrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JbmZjX2RiZygiZW50cnksIGNtZF9jbnQgJWQiLCBhdG9taWNfcmVhZCgmbmRldi0+Y21kX2NudCkpOworCXByX2RlYnVnKCJjbWRfY250ICVkXG4iLCBhdG9taWNfcmVhZCgmbmRldi0+Y21kX2NudCkpOwogCiAJLyogU2VuZCBxdWV1ZWQgY29tbWFuZCAqLwogCWlmIChhdG9taWNfcmVhZCgmbmRldi0+Y21kX2NudCkpIHsKQEAgLTc4MywxMSArNzcwLDExIEBACiAKIAkJYXRvbWljX2RlYygmbmRldi0+Y21kX2NudCk7CiAKLQkJbmZjX2RiZygiTkNJIFRYOiBNVD1jbWQsIFBCRj0lZCwgR0lEPTB4JXgsIE9JRD0weCV4LCBwbGVuPSVkIiwKLQkJCQluY2lfcGJmKHNrYi0+ZGF0YSksCi0JCQkJbmNpX29wY29kZV9naWQobmNpX29wY29kZShza2ItPmRhdGEpKSwKLQkJCQluY2lfb3Bjb2RlX29pZChuY2lfb3Bjb2RlKHNrYi0+ZGF0YSkpLAotCQkJCW5jaV9wbGVuKHNrYi0+ZGF0YSkpOworCQlwcl9kZWJ1ZygiTkNJIFRYOiBNVD1jbWQsIFBCRj0lZCwgR0lEPTB4JXgsIE9JRD0weCV4LCBwbGVuPSVkXG4iLAorCQkJIG5jaV9wYmYoc2tiLT5kYXRhKSwKKwkJCSBuY2lfb3Bjb2RlX2dpZChuY2lfb3Bjb2RlKHNrYi0+ZGF0YSkpLAorCQkJIG5jaV9vcGNvZGVfb2lkKG5jaV9vcGNvZGUoc2tiLT5kYXRhKSksCisJCQkgbmNpX3BsZW4oc2tiLT5kYXRhKSk7CiAKIAkJbmNpX3NlbmRfZnJhbWUoc2tiKTsKIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9uY2kvZGF0YS5jIGIvbmV0L25mYy9uY2kvZGF0YS5jCmluZGV4IGU1ZWQ5MGYuLjFlMDQwZmUgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvbmNpL2RhdGEuYworKysgYi9uZXQvbmZjL25jaS9kYXRhLmMKQEAgLTIxLDYgKzIxLDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CkBAIC00MCw3ICs0Miw3IEBACiAJZGF0YV9leGNoYW5nZV9jYl90IGNiID0gbmRldi0+ZGF0YV9leGNoYW5nZV9jYjsKIAl2b2lkICpjYl9jb250ZXh0ID0gbmRldi0+ZGF0YV9leGNoYW5nZV9jYl9jb250ZXh0OwogCi0JbmZjX2RiZygiZW50cnksIGxlbiAlZCwgZXJyICVkIiwgKChza2IpID8gKHNrYi0+bGVuKSA6ICgwKSksIGVycik7CisJcHJfZGVidWcoImxlbiAlZCwgZXJyICVkXG4iLCBza2IgPyBza2ItPmxlbiA6IDAsIGVycik7CiAKIAlpZiAoY2IpIHsKIAkJbmRldi0+ZGF0YV9leGNoYW5nZV9jYiA9IE5VTEw7CkBAIC00OSw3ICs1MSw3IEBACiAJCS8qIGZvcndhcmQgc2tiIHRvIG5mYyBjb3JlICovCiAJCWNiKGNiX2NvbnRleHQsIHNrYiwgZXJyKTsKIAl9IGVsc2UgaWYgKHNrYikgewotCQluZmNfZXJyKCJubyByeCBjYWxsYmFjaywgZHJvcHBpbmcgcnggZGF0YS4uLiIpOworCQlwcl9lcnIoIm5vIHJ4IGNhbGxiYWNrLCBkcm9wcGluZyByeCBkYXRhLi4uXG4iKTsKIAogCQkvKiBubyB3YWl0aW5nIGNhbGxiYWNrLCBmcmVlIHNrYiAqLwogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTkwLDEyICs5MiwxMyBAQAogCWludCBmcmFnX2xlbjsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZW50cnksIGNvbm5faWQgMHgleCwgdG90YWxfbGVuICVkIiwgY29ubl9pZCwgdG90YWxfbGVuKTsKKwlwcl9kZWJ1ZygiY29ubl9pZCAweCV4LCB0b3RhbF9sZW4gJWRcbiIsIGNvbm5faWQsIHRvdGFsX2xlbik7CiAKIAlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmZyYWdzX3EpOwogCiAJd2hpbGUgKHRvdGFsX2xlbikgewotCQlmcmFnX2xlbiA9IG1pbl90KGludCwgdG90YWxfbGVuLCBuZGV2LT5tYXhfcGt0X3BheWxvYWRfc2l6ZSk7CisJCWZyYWdfbGVuID0KKwkJCW1pbl90KGludCwgdG90YWxfbGVuLCBuZGV2LT5tYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplKTsKIAogCQlza2JfZnJhZyA9IG5jaV9za2JfYWxsb2MobmRldiwKIAkJCQkJKE5DSV9EQVRBX0hEUl9TSVpFICsgZnJhZ19sZW4pLApAQCAtMTE4LDggKzEyMSw4IEBACiAJCWRhdGEgKz0gZnJhZ19sZW47CiAJCXRvdGFsX2xlbiAtPSBmcmFnX2xlbjsKIAotCQluZmNfZGJnKCJmcmFnX2xlbiAlZCwgcmVtYWluaW5nIHRvdGFsX2xlbiAlZCIsCi0JCQlmcmFnX2xlbiwgdG90YWxfbGVuKTsKKwkJcHJfZGVidWcoImZyYWdfbGVuICVkLCByZW1haW5pbmcgdG90YWxfbGVuICVkXG4iLAorCQkJIGZyYWdfbGVuLCB0b3RhbF9sZW4pOwogCX0KIAogCS8qIHF1ZXVlIGFsbCBmcmFnbWVudHMgYXRvbWljYWxseSAqLwpAQCAtMTQ4LDEwICsxNTEsMTAgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZW50cnksIGNvbm5faWQgMHgleCwgcGxlbiAlZCIsIGNvbm5faWQsIHNrYi0+bGVuKTsKKwlwcl9kZWJ1ZygiY29ubl9pZCAweCV4LCBwbGVuICVkXG4iLCBjb25uX2lkLCBza2ItPmxlbik7CiAKIAkvKiBjaGVjayBpZiB0aGUgcGFja2V0IG5lZWQgdG8gYmUgZnJhZ21lbnRlZCAqLwotCWlmIChza2ItPmxlbiA8PSBuZGV2LT5tYXhfcGt0X3BheWxvYWRfc2l6ZSkgeworCWlmIChza2ItPmxlbiA8PSBuZGV2LT5tYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplKSB7CiAJCS8qIG5vIG5lZWQgdG8gZnJhZ21lbnQgcGFja2V0ICovCiAJCW5jaV9wdXNoX2RhdGFfaGRyKG5kZXYsIGNvbm5faWQsIHNrYiwgTkNJX1BCRl9MQVNUKTsKIApAQCAtMTYwLDcgKzE2Myw3IEBACiAJCS8qIGZyYWdtZW50IHBhY2tldCBhbmQgcXVldWUgdGhlIGZyYWdtZW50cyAqLwogCQlyYyA9IG5jaV9xdWV1ZV90eF9kYXRhX2ZyYWdzKG5kZXYsIGNvbm5faWQsIHNrYik7CiAJCWlmIChyYykgewotCQkJbmZjX2VycigiZmFpbGVkIHRvIGZyYWdtZW50IHR4IGRhdGEgcGFja2V0Iik7CisJCQlwcl9lcnIoImZhaWxlZCB0byBmcmFnbWVudCB0eCBkYXRhIHBhY2tldFxuIik7CiAJCQlnb3RvIGZyZWVfZXhpdDsKIAkJfQogCX0KQEAgLTE5MCw3ICsxOTMsNyBAQAogCiAJCS8qIGZpcnN0LCBtYWtlIGVub3VnaCByb29tIGZvciB0aGUgYWxyZWFkeSBhY2N1bXVsYXRlZCBkYXRhICovCiAJCWlmIChza2JfY293X2hlYWQoc2tiLCByZWFzc2VtYmx5X2xlbikpIHsKLQkJCW5mY19lcnIoImVycm9yIGFkZGluZyByb29tIGZvciBhY2N1bXVsYXRlZCByeCBkYXRhIik7CisJCQlwcl9lcnIoImVycm9yIGFkZGluZyByb29tIGZvciBhY2N1bXVsYXRlZCByeCBkYXRhXG4iKTsKIAogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlza2IgPSAwOwpAQCAtMjI3LDE5ICsyMzAsMTkgQEAKIHsKIAlfX3U4IHBiZiA9IG5jaV9wYmYoc2tiLT5kYXRhKTsKIAotCW5mY19kYmcoImVudHJ5LCBsZW4gJWQiLCBza2ItPmxlbik7CisJcHJfZGVidWcoImxlbiAlZFxuIiwgc2tiLT5sZW4pOwogCi0JbmZjX2RiZygiTkNJIFJYOiBNVD1kYXRhLCBQQkY9JWQsIGNvbm5faWQ9JWQsIHBsZW49JWQiLAotCQkJbmNpX3BiZihza2ItPmRhdGEpLAotCQkJbmNpX2Nvbm5faWQoc2tiLT5kYXRhKSwKLQkJCW5jaV9wbGVuKHNrYi0+ZGF0YSkpOworCXByX2RlYnVnKCJOQ0kgUlg6IE1UPWRhdGEsIFBCRj0lZCwgY29ubl9pZD0lZCwgcGxlbj0lZFxuIiwKKwkJIG5jaV9wYmYoc2tiLT5kYXRhKSwKKwkJIG5jaV9jb25uX2lkKHNrYi0+ZGF0YSksCisJCSBuY2lfcGxlbihza2ItPmRhdGEpKTsKIAogCS8qIHN0cmlwIHRoZSBuY2kgZGF0YSBoZWFkZXIgKi8KIAlza2JfcHVsbChza2IsIE5DSV9EQVRBX0hEUl9TSVpFKTsKIAogCWlmIChuZGV2LT50YXJnZXRfYWN0aXZlX3Byb3QgPT0gTkZDX1BST1RPX01JRkFSRSkgewogCQkvKiBmcmFtZSBJL0YgPT4gcmVtb3ZlIHRoZSBzdGF0dXMgYnl0ZSAqLwotCQluZmNfZGJnKCJORkNfUFJPVE9fTUlGQVJFID0+IHJlbW92ZSB0aGUgc3RhdHVzIGJ5dGUiKTsKKwkJcHJfZGVidWcoIk5GQ19QUk9UT19NSUZBUkUgPT4gcmVtb3ZlIHRoZSBzdGF0dXMgYnl0ZVxuIik7CiAJCXNrYl90cmltKHNrYiwgKHNrYi0+bGVuIC0gMSkpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9uY2kvbGliLmMgYi9uZXQvbmZjL25jaS9saWIuYwppbmRleCBiMTlkYzJmLi5lOTlhZGNmIDEwMDY0NAotLS0gYS9uZXQvbmZjL25jaS9saWIuYworKysgYi9uZXQvbmZjL25jaS9saWIuYwpAQCAtNDIsMTIgKzQyLDkgQEAKIAljYXNlIE5DSV9TVEFUVVNfUkVKRUNURUQ6CiAJCXJldHVybiAtRUJVU1k7CiAKLQljYXNlIE5DSV9TVEFUVVNfTUVTU0FHRV9DT1JSVVBURUQ6CisJY2FzZSBOQ0lfU1RBVFVTX1JGX0ZSQU1FX0NPUlJVUFRFRDoKIAkJcmV0dXJuIC1FQkFETVNHOwogCi0JY2FzZSBOQ0lfU1RBVFVTX0JVRkZFUl9GVUxMOgotCQlyZXR1cm4gLUVOT0JVRlM7Ci0KIAljYXNlIE5DSV9TVEFUVVNfTk9UX0lOSVRJQUxJWkVEOgogCQlyZXR1cm4gLUVIT1NURE9XTjsKIApAQCAtODAsOSArNzcsNiBAQAogCWNhc2UgTkNJX1NUQVRVU19ORkNFRV9USU1FT1VUX0VSUk9SOgogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAotCWNhc2UgTkNJX1NUQVRVU19SRl9MSU5LX0xPU1NfRVJST1I6Ci0JCXJldHVybiAtRU5PTElOSzsKLQogCWNhc2UgTkNJX1NUQVRVU19NQVhfQUNUSVZFX05GQ0VFX0lOVEVSRkFDRVNfUkVBQ0hFRDoKIAkJcmV0dXJuIC1FRFFVT1Q7CiAKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmNpL250Zi5jIGIvbmV0L25mYy9uY2kvbnRmLmMKaW5kZXggOTY2MzNmNS4uYzM2YmQ0YTAgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvbmNpL250Zi5jCisrKyBiL25ldC9uZmMvbmNpL250Zi5jCkBAIC0yNSw2ICsyNSw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC00MywxOCArNDUsMTggQEAKIAlzdHJ1Y3QgbmNpX2NvcmVfY29ubl9jcmVkaXRfbnRmICpudGYgPSAodm9pZCAqKSBza2ItPmRhdGE7CiAJaW50IGk7CiAKLQluZmNfZGJnKCJlbnRyeSwgbnVtX2VudHJpZXMgJWQiLCBudGYtPm51bV9lbnRyaWVzKTsKKwlwcl9kZWJ1ZygibnVtX2VudHJpZXMgJWRcbiIsIG50Zi0+bnVtX2VudHJpZXMpOwogCiAJaWYgKG50Zi0+bnVtX2VudHJpZXMgPiBOQ0lfTUFYX05VTV9DT05OKQogCQludGYtPm51bV9lbnRyaWVzID0gTkNJX01BWF9OVU1fQ09OTjsKIAogCS8qIHVwZGF0ZSB0aGUgY3JlZGl0cyAqLwogCWZvciAoaSA9IDA7IGkgPCBudGYtPm51bV9lbnRyaWVzOyBpKyspIHsKLQkJbmZjX2RiZygiZW50cnlbJWRdOiBjb25uX2lkICVkLCBjcmVkaXRzICVkIiwgaSwKLQkJCW50Zi0+Y29ubl9lbnRyaWVzW2ldLmNvbm5faWQsCi0JCQludGYtPmNvbm5fZW50cmllc1tpXS5jcmVkaXRzKTsKKwkJcHJfZGVidWcoImVudHJ5WyVkXTogY29ubl9pZCAlZCwgY3JlZGl0cyAlZFxuIiwKKwkJCSBpLCBudGYtPmNvbm5fZW50cmllc1tpXS5jb25uX2lkLAorCQkJIG50Zi0+Y29ubl9lbnRyaWVzW2ldLmNyZWRpdHMpOwogCi0JCWlmIChudGYtPmNvbm5fZW50cmllc1tpXS5jb25uX2lkID09IG5kZXYtPmNvbm5faWQpIHsKKwkJaWYgKG50Zi0+Y29ubl9lbnRyaWVzW2ldLmNvbm5faWQgPT0gTkNJX1NUQVRJQ19SRl9DT05OX0lEKSB7CiAJCQkvKiBmb3VuZCBzdGF0aWMgcmYgY29ubmVjdGlvbiAqLwogCQkJYXRvbWljX2FkZChudGYtPmNvbm5fZW50cmllc1tpXS5jcmVkaXRzLAogCQkJCSZuZGV2LT5jcmVkaXRzX2NudCk7CkBAIC02NiwzMSArNjgsMjAgQEAKIAkJcXVldWVfd29yayhuZGV2LT50eF93cSwgJm5kZXYtPnR4X3dvcmspOwogfQogCi1zdGF0aWMgdm9pZCBuY2lfcmZfZmllbGRfaW5mb19udGZfcGFja2V0KHN0cnVjdCBuY2lfZGV2ICpuZGV2LAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBuY2lfcmZfZmllbGRfaW5mb19udGYgKm50ZiA9ICh2b2lkICopIHNrYi0+ZGF0YTsKLQotCW5mY19kYmcoImVudHJ5LCByZl9maWVsZF9zdGF0dXMgJWQiLCBudGYtPnJmX2ZpZWxkX3N0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbnQgbmNpX3JmX2FjdGl2YXRlX25mY2FfcGFzc2l2ZV9wb2xsKHN0cnVjdCBuY2lfZGV2ICpuZGV2LAotCQkJc3RydWN0IG5jaV9yZl9hY3RpdmF0ZV9udGYgKm50ZiwgX191OCAqZGF0YSkKK3N0YXRpYyBfX3U4ICpuY2lfZXh0cmFjdF9yZl9wYXJhbXNfbmZjYV9wYXNzaXZlX3BvbGwoc3RydWN0IG5jaV9kZXYgKm5kZXYsCisJCQlzdHJ1Y3QgbmNpX3JmX2ludGZfYWN0aXZhdGVkX250ZiAqbnRmLCBfX3U4ICpkYXRhKQogewogCXN0cnVjdCByZl90ZWNoX3NwZWNpZmljX3BhcmFtc19uZmNhX3BvbGwgKm5mY2FfcG9sbDsKLQlzdHJ1Y3QgYWN0aXZhdGlvbl9wYXJhbXNfbmZjYV9wb2xsX2lzb19kZXAgKm5mY2FfcG9sbF9pc29fZGVwOwogCiAJbmZjYV9wb2xsID0gJm50Zi0+cmZfdGVjaF9zcGVjaWZpY19wYXJhbXMubmZjYV9wb2xsOwotCW5mY2FfcG9sbF9pc29fZGVwID0gJm50Zi0+YWN0aXZhdGlvbl9wYXJhbXMubmZjYV9wb2xsX2lzb19kZXA7CiAKIAluZmNhX3BvbGwtPnNlbnNfcmVzID0gX19sZTE2X3RvX2NwdSgqKChfX3UxNiAqKWRhdGEpKTsKIAlkYXRhICs9IDI7CiAKIAluZmNhX3BvbGwtPm5mY2lkMV9sZW4gPSAqZGF0YSsrOwogCi0JbmZjX2RiZygic2Vuc19yZXMgMHgleCwgbmZjaWQxX2xlbiAlZCIsCi0JCW5mY2FfcG9sbC0+c2Vuc19yZXMsCi0JCW5mY2FfcG9sbC0+bmZjaWQxX2xlbik7CisJcHJfZGVidWcoInNlbnNfcmVzIDB4JXgsIG5mY2lkMV9sZW4gJWRcbiIsCisJCSBuZmNhX3BvbGwtPnNlbnNfcmVzLCBuZmNhX3BvbGwtPm5mY2lkMV9sZW4pOwogCiAJbWVtY3B5KG5mY2FfcG9sbC0+bmZjaWQxLCBkYXRhLCBuZmNhX3BvbGwtPm5mY2lkMV9sZW4pOwogCWRhdGEgKz0gbmZjYV9wb2xsLT5uZmNpZDFfbGVuOwpAQCAtMTAwLDMyICs5MSwzMiBAQAogCWlmIChuZmNhX3BvbGwtPnNlbF9yZXNfbGVuICE9IDApCiAJCW5mY2FfcG9sbC0+c2VsX3JlcyA9ICpkYXRhKys7CiAKLQludGYtPnJmX2ludGVyZmFjZV90eXBlID0gKmRhdGErKzsKLQludGYtPmFjdGl2YXRpb25fcGFyYW1zX2xlbiA9ICpkYXRhKys7CisJcHJfZGVidWcoInNlbF9yZXNfbGVuICVkLCBzZWxfcmVzIDB4JXhcbiIsCisJCSBuZmNhX3BvbGwtPnNlbF9yZXNfbGVuLAorCQkgbmZjYV9wb2xsLT5zZWxfcmVzKTsKIAotCW5mY19kYmcoInNlbF9yZXNfbGVuICVkLCBzZWxfcmVzIDB4JXgsIHJmX2ludGVyZmFjZV90eXBlICVkLCBhY3RpdmF0aW9uX3BhcmFtc19sZW4gJWQiLAotCQluZmNhX3BvbGwtPnNlbF9yZXNfbGVuLAotCQluZmNhX3BvbGwtPnNlbF9yZXMsCi0JCW50Zi0+cmZfaW50ZXJmYWNlX3R5cGUsCi0JCW50Zi0+YWN0aXZhdGlvbl9wYXJhbXNfbGVuKTsKKwlyZXR1cm4gZGF0YTsKK30KIAotCXN3aXRjaCAobnRmLT5yZl9pbnRlcmZhY2VfdHlwZSkgewotCWNhc2UgTkNJX1JGX0lOVEVSRkFDRV9JU09fREVQOgotCQluZmNhX3BvbGxfaXNvX2RlcC0+cmF0c19yZXNfbGVuID0gKmRhdGErKzsKLQkJaWYgKG5mY2FfcG9sbF9pc29fZGVwLT5yYXRzX3Jlc19sZW4gPiAwKSB7Ci0JCQltZW1jcHkobmZjYV9wb2xsX2lzb19kZXAtPnJhdHNfcmVzLAorc3RhdGljIGludCBuY2lfZXh0cmFjdF9hY3RpdmF0aW9uX3BhcmFtc19pc29fZGVwKHN0cnVjdCBuY2lfZGV2ICpuZGV2LAorCQkJc3RydWN0IG5jaV9yZl9pbnRmX2FjdGl2YXRlZF9udGYgKm50ZiwgX191OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWN0aXZhdGlvbl9wYXJhbXNfbmZjYV9wb2xsX2lzb19kZXAgKm5mY2FfcG9sbDsKKworCXN3aXRjaCAobnRmLT5hY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUpIHsKKwljYXNlIE5DSV9ORkNfQV9QQVNTSVZFX1BPTExfTU9ERToKKwkJbmZjYV9wb2xsID0gJm50Zi0+YWN0aXZhdGlvbl9wYXJhbXMubmZjYV9wb2xsX2lzb19kZXA7CisJCW5mY2FfcG9sbC0+cmF0c19yZXNfbGVuID0gKmRhdGErKzsKKwkJaWYgKG5mY2FfcG9sbC0+cmF0c19yZXNfbGVuID4gMCkgeworCQkJbWVtY3B5KG5mY2FfcG9sbC0+cmF0c19yZXMsCiAJCQkJZGF0YSwKLQkJCQluZmNhX3BvbGxfaXNvX2RlcC0+cmF0c19yZXNfbGVuKTsKKwkJCQluZmNhX3BvbGwtPnJhdHNfcmVzX2xlbik7CiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIE5DSV9SRl9JTlRFUkZBQ0VfRlJBTUU6Ci0JCS8qIG5vIGFjdGl2YXRpb24gcGFyYW1zICovCi0JCWJyZWFrOwotCiAJZGVmYXVsdDoKLQkJbmZjX2VycigidW5zdXBwb3J0ZWQgcmZfaW50ZXJmYWNlX3R5cGUgMHgleCIsCi0JCQludGYtPnJmX2ludGVyZmFjZV90eXBlKTsKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBhY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUgMHgleFxuIiwKKwkJICAgICAgIG50Zi0+YWN0aXZhdGlvbl9yZl90ZWNoX2FuZF9tb2RlKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCkBAIC0xMzMsNyArMTI0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgbmNpX3RhcmdldF9mb3VuZChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKLQkJCQlzdHJ1Y3QgbmNpX3JmX2FjdGl2YXRlX250ZiAqbnRmKQorCQkJCXN0cnVjdCBuY2lfcmZfaW50Zl9hY3RpdmF0ZWRfbnRmICpudGYpCiB7CiAJc3RydWN0IG5mY190YXJnZXQgbmZjX3RndDsKIApAQCAtMTQxLDY2ICsxMzIsMTA1IEBACiAJCW5mY190Z3Quc3VwcG9ydGVkX3Byb3RvY29scyA9IE5GQ19QUk9UT19NSUZBUkVfTUFTSzsKIAllbHNlIGlmIChudGYtPnJmX3Byb3RvY29sID09IE5DSV9SRl9QUk9UT0NPTF9JU09fREVQKQkvKiA0QSAqLwogCQluZmNfdGd0LnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fSVNPMTQ0NDNfTUFTSzsKKwllbHNlCisJCW5mY190Z3Quc3VwcG9ydGVkX3Byb3RvY29scyA9IDA7CiAKIAluZmNfdGd0LnNlbnNfcmVzID0gbnRmLT5yZl90ZWNoX3NwZWNpZmljX3BhcmFtcy5uZmNhX3BvbGwuc2Vuc19yZXM7CiAJbmZjX3RndC5zZWxfcmVzID0gbnRmLT5yZl90ZWNoX3NwZWNpZmljX3BhcmFtcy5uZmNhX3BvbGwuc2VsX3JlczsKIAogCWlmICghKG5mY190Z3Quc3VwcG9ydGVkX3Byb3RvY29scyAmIG5kZXYtPnBvbGxfcHJvdHMpKSB7Ci0JCW5mY19kYmcoInRoZSB0YXJnZXQgZm91bmQgZG9lcyBub3QgaGF2ZSB0aGUgZGVzaXJlZCBwcm90b2NvbCIpOworCQlwcl9kZWJ1ZygidGhlIHRhcmdldCBmb3VuZCBkb2VzIG5vdCBoYXZlIHRoZSBkZXNpcmVkIHByb3RvY29sXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCW5mY19kYmcoIm5ldyB0YXJnZXQgZm91bmQsICBzdXBwb3J0ZWRfcHJvdG9jb2xzIDB4JXgiLAotCQluZmNfdGd0LnN1cHBvcnRlZF9wcm90b2NvbHMpOworCXByX2RlYnVnKCJuZXcgdGFyZ2V0IGZvdW5kLCAgc3VwcG9ydGVkX3Byb3RvY29scyAweCV4XG4iLAorCQkgbmZjX3RndC5zdXBwb3J0ZWRfcHJvdG9jb2xzKTsKIAogCW5kZXYtPnRhcmdldF9hdmFpbGFibGVfcHJvdHMgPSBuZmNfdGd0LnN1cHBvcnRlZF9wcm90b2NvbHM7CiAKIAluZmNfdGFyZ2V0c19mb3VuZChuZGV2LT5uZmNfZGV2LCAmbmZjX3RndCwgMSk7CiB9CiAKLXN0YXRpYyB2b2lkIG5jaV9yZl9hY3RpdmF0ZV9udGZfcGFja2V0KHN0cnVjdCBuY2lfZGV2ICpuZGV2LAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgbmNpX3JmX2ludGZfYWN0aXZhdGVkX250Zl9wYWNrZXQoc3RydWN0IG5jaV9kZXYgKm5kZXYsCisJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBuY2lfcmZfYWN0aXZhdGVfbnRmIG50ZjsKKwlzdHJ1Y3QgbmNpX3JmX2ludGZfYWN0aXZhdGVkX250ZiBudGY7CiAJX191OCAqZGF0YSA9IHNrYi0+ZGF0YTsKLQlpbnQgcmMgPSAtMTsKKwlpbnQgZXJyID0gMDsKIAogCWNsZWFyX2JpdChOQ0lfRElTQ09WRVJZLCAmbmRldi0+ZmxhZ3MpOwogCXNldF9iaXQoTkNJX1BPTExfQUNUSVZFLCAmbmRldi0+ZmxhZ3MpOwogCi0JbnRmLnRhcmdldF9oYW5kbGUgPSAqZGF0YSsrOworCW50Zi5yZl9kaXNjb3ZlcnlfaWQgPSAqZGF0YSsrOworCW50Zi5yZl9pbnRlcmZhY2VfdHlwZSA9ICpkYXRhKys7CiAJbnRmLnJmX3Byb3RvY29sID0gKmRhdGErKzsKLQludGYucmZfdGVjaF9hbmRfbW9kZSA9ICpkYXRhKys7CisJbnRmLmFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZSA9ICpkYXRhKys7CiAJbnRmLnJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX2xlbiA9ICpkYXRhKys7CiAKLQluZmNfZGJnKCJ0YXJnZXRfaGFuZGxlICVkLCByZl9wcm90b2NvbCAweCV4LCByZl90ZWNoX2FuZF9tb2RlIDB4JXgsIHJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX2xlbiAlZCIsCi0JCW50Zi50YXJnZXRfaGFuZGxlLAotCQludGYucmZfcHJvdG9jb2wsCi0JCW50Zi5yZl90ZWNoX2FuZF9tb2RlLAotCQludGYucmZfdGVjaF9zcGVjaWZpY19wYXJhbXNfbGVuKTsKKwlwcl9kZWJ1ZygicmZfZGlzY292ZXJ5X2lkICVkXG4iLCBudGYucmZfZGlzY292ZXJ5X2lkKTsKKwlwcl9kZWJ1ZygicmZfaW50ZXJmYWNlX3R5cGUgMHgleFxuIiwgbnRmLnJmX2ludGVyZmFjZV90eXBlKTsKKwlwcl9kZWJ1ZygicmZfcHJvdG9jb2wgMHgleFxuIiwgbnRmLnJmX3Byb3RvY29sKTsKKwlwcl9kZWJ1ZygiYWN0aXZhdGlvbl9yZl90ZWNoX2FuZF9tb2RlIDB4JXhcbiIsCisJCSBudGYuYWN0aXZhdGlvbl9yZl90ZWNoX2FuZF9tb2RlKTsKKwlwcl9kZWJ1ZygicmZfdGVjaF9zcGVjaWZpY19wYXJhbXNfbGVuICVkXG4iLAorCQkgbnRmLnJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX2xlbik7CiAKLQlzd2l0Y2ggKG50Zi5yZl90ZWNoX2FuZF9tb2RlKSB7Ci0JY2FzZSBOQ0lfTkZDX0FfUEFTU0lWRV9QT0xMX01PREU6Ci0JCXJjID0gbmNpX3JmX2FjdGl2YXRlX25mY2FfcGFzc2l2ZV9wb2xsKG5kZXYsICZudGYsCi0JCQlkYXRhKTsKLQkJYnJlYWs7CisJaWYgKG50Zi5yZl90ZWNoX3NwZWNpZmljX3BhcmFtc19sZW4gPiAwKSB7CisJCXN3aXRjaCAobnRmLmFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZSkgeworCQljYXNlIE5DSV9ORkNfQV9QQVNTSVZFX1BPTExfTU9ERToKKwkJCWRhdGEgPSBuY2lfZXh0cmFjdF9yZl9wYXJhbXNfbmZjYV9wYXNzaXZlX3BvbGwobmRldiwKKwkJCQkmbnRmLCBkYXRhKTsKKwkJCWJyZWFrOwogCi0JZGVmYXVsdDoKLQkJbmZjX2VycigidW5zdXBwb3J0ZWQgcmZfdGVjaF9hbmRfbW9kZSAweCV4IiwKLQkJCW50Zi5yZl90ZWNoX2FuZF9tb2RlKTsKLQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBhY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUgMHgleFxuIiwKKwkJCSAgICAgICBudGYuYWN0aXZhdGlvbl9yZl90ZWNoX2FuZF9tb2RlKTsKKwkJCXJldHVybjsKKwkJfQogCX0KIAotCWlmICghcmMpCisJbnRmLmRhdGFfZXhjaF9yZl90ZWNoX2FuZF9tb2RlID0gKmRhdGErKzsKKwludGYuZGF0YV9leGNoX3R4X2JpdF9yYXRlID0gKmRhdGErKzsKKwludGYuZGF0YV9leGNoX3J4X2JpdF9yYXRlID0gKmRhdGErKzsKKwludGYuYWN0aXZhdGlvbl9wYXJhbXNfbGVuID0gKmRhdGErKzsKKworCXByX2RlYnVnKCJkYXRhX2V4Y2hfcmZfdGVjaF9hbmRfbW9kZSAweCV4XG4iLAorCQkgbnRmLmRhdGFfZXhjaF9yZl90ZWNoX2FuZF9tb2RlKTsKKwlwcl9kZWJ1ZygiZGF0YV9leGNoX3R4X2JpdF9yYXRlIDB4JXhcbiIsCisJCSBudGYuZGF0YV9leGNoX3R4X2JpdF9yYXRlKTsKKwlwcl9kZWJ1ZygiZGF0YV9leGNoX3J4X2JpdF9yYXRlIDB4JXhcbiIsCisJCSBudGYuZGF0YV9leGNoX3J4X2JpdF9yYXRlKTsKKwlwcl9kZWJ1ZygiYWN0aXZhdGlvbl9wYXJhbXNfbGVuICVkXG4iLAorCQkgbnRmLmFjdGl2YXRpb25fcGFyYW1zX2xlbik7CisKKwlpZiAobnRmLmFjdGl2YXRpb25fcGFyYW1zX2xlbiA+IDApIHsKKwkJc3dpdGNoIChudGYucmZfaW50ZXJmYWNlX3R5cGUpIHsKKwkJY2FzZSBOQ0lfUkZfSU5URVJGQUNFX0lTT19ERVA6CisJCQllcnIgPSBuY2lfZXh0cmFjdF9hY3RpdmF0aW9uX3BhcmFtc19pc29fZGVwKG5kZXYsCisJCQkJJm50ZiwgZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIE5DSV9SRl9JTlRFUkZBQ0VfRlJBTUU6CisJCQkvKiBubyBhY3RpdmF0aW9uIHBhcmFtcyAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByX2VycigidW5zdXBwb3J0ZWQgcmZfaW50ZXJmYWNlX3R5cGUgMHgleFxuIiwKKwkJCSAgICAgICBudGYucmZfaW50ZXJmYWNlX3R5cGUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKCFlcnIpCiAJCW5jaV90YXJnZXRfZm91bmQobmRldiwgJm50Zik7CiB9CiAKIHN0YXRpYyB2b2lkIG5jaV9yZl9kZWFjdGl2YXRlX250Zl9wYWNrZXQoc3RydWN0IG5jaV9kZXYgKm5kZXYsCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JX191OCB0eXBlID0gc2tiLT5kYXRhWzBdOworCXN0cnVjdCBuY2lfcmZfZGVhY3RpdmF0ZV9udGYgKm50ZiA9ICh2b2lkICopIHNrYi0+ZGF0YTsKIAotCW5mY19kYmcoImVudHJ5LCB0eXBlIDB4JXgiLCB0eXBlKTsKKwlwcl9kZWJ1ZygiZW50cnksIHR5cGUgMHgleCwgcmVhc29uIDB4JXhcbiIsIG50Zi0+dHlwZSwgbnRmLT5yZWFzb24pOwogCiAJY2xlYXJfYml0KE5DSV9QT0xMX0FDVElWRSwgJm5kZXYtPmZsYWdzKTsKIAluZGV2LT50YXJnZXRfYWN0aXZlX3Byb3QgPSAwOwpAQCAtMjE0LDYgKzI0NCw5IEBACiAJCW5kZXYtPnJ4X2RhdGFfcmVhc3NlbWJseSA9IDA7CiAJfQogCisJLyogc2V0IHRoZSBhdmFpbGFibGUgY3JlZGl0cyB0byBpbml0aWFsIHZhbHVlICovCisJYXRvbWljX3NldCgmbmRldi0+Y3JlZGl0c19jbnQsIG5kZXYtPmluaXRpYWxfbnVtX2NyZWRpdHMpOworCiAJLyogY29tcGxldGUgdGhlIGRhdGEgZXhjaGFuZ2UgdHJhbnNhY3Rpb24sIGlmIGV4aXN0cyAqLwogCWlmICh0ZXN0X2JpdChOQ0lfREFUQV9FWENIQU5HRSwgJm5kZXYtPmZsYWdzKSkKIAkJbmNpX2RhdGFfZXhjaGFuZ2VfY29tcGxldGUobmRldiwgTlVMTCwgLUVJTyk7CkBAIC0yMjMsMTEgKzI1NiwxMSBAQAogewogCV9fdTE2IG50Zl9vcGNvZGUgPSBuY2lfb3Bjb2RlKHNrYi0+ZGF0YSk7CiAKLQluZmNfZGJnKCJOQ0kgUlg6IE1UPW50ZiwgUEJGPSVkLCBHSUQ9MHgleCwgT0lEPTB4JXgsIHBsZW49JWQiLAotCQkJbmNpX3BiZihza2ItPmRhdGEpLAotCQkJbmNpX29wY29kZV9naWQobnRmX29wY29kZSksCi0JCQluY2lfb3Bjb2RlX29pZChudGZfb3Bjb2RlKSwKLQkJCW5jaV9wbGVuKHNrYi0+ZGF0YSkpOworCXByX2RlYnVnKCJOQ0kgUlg6IE1UPW50ZiwgUEJGPSVkLCBHSUQ9MHgleCwgT0lEPTB4JXgsIHBsZW49JWRcbiIsCisJCSBuY2lfcGJmKHNrYi0+ZGF0YSksCisJCSBuY2lfb3Bjb2RlX2dpZChudGZfb3Bjb2RlKSwKKwkJIG5jaV9vcGNvZGVfb2lkKG50Zl9vcGNvZGUpLAorCQkgbmNpX3BsZW4oc2tiLT5kYXRhKSk7CiAKIAkvKiBzdHJpcCB0aGUgbmNpIGNvbnRyb2wgaGVhZGVyICovCiAJc2tiX3B1bGwoc2tiLCBOQ0lfQ1RSTF9IRFJfU0laRSk7CkBAIC0yMzcsMTIgKzI3MCw4IEBACiAJCW5jaV9jb3JlX2Nvbm5fY3JlZGl0c19udGZfcGFja2V0KG5kZXYsIHNrYik7CiAJCWJyZWFrOwogCi0JY2FzZSBOQ0lfT1BfUkZfRklFTERfSU5GT19OVEY6Ci0JCW5jaV9yZl9maWVsZF9pbmZvX250Zl9wYWNrZXQobmRldiwgc2tiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE5DSV9PUF9SRl9BQ1RJVkFURV9OVEY6Ci0JCW5jaV9yZl9hY3RpdmF0ZV9udGZfcGFja2V0KG5kZXYsIHNrYik7CisJY2FzZSBOQ0lfT1BfUkZfSU5URl9BQ1RJVkFURURfTlRGOgorCQluY2lfcmZfaW50Zl9hY3RpdmF0ZWRfbnRmX3BhY2tldChuZGV2LCBza2IpOwogCQlicmVhazsKIAogCWNhc2UgTkNJX09QX1JGX0RFQUNUSVZBVEVfTlRGOgpAQCAtMjUwLDcgKzI3OSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJbmZjX2VycigidW5rbm93biBudGYgb3Bjb2RlIDB4JXgiLCBudGZfb3Bjb2RlKTsKKwkJcHJfZXJyKCJ1bmtub3duIG50ZiBvcGNvZGUgMHgleFxuIiwgbnRmX29wY29kZSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9uY2kvcnNwLmMgYi9uZXQvbmZjL25jaS9yc3AuYwppbmRleCAwNDAzZDRjLi5jYTYxMWM1IDEwMDY0NAotLS0gYS9uZXQvbmZjL25jaS9yc3AuYworKysgYi9uZXQvbmZjL25jaS9yc3AuYwpAQCAtMjUsNiArMjUsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtNDAsMTIgKzQyLDEzIEBACiB7CiAJc3RydWN0IG5jaV9jb3JlX3Jlc2V0X3JzcCAqcnNwID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCi0JbmZjX2RiZygiZW50cnksIHN0YXR1cyAweCV4IiwgcnNwLT5zdGF0dXMpOworCXByX2RlYnVnKCJzdGF0dXMgMHgleFxuIiwgcnNwLT5zdGF0dXMpOwogCi0JaWYgKHJzcC0+c3RhdHVzID09IE5DSV9TVEFUVVNfT0spCisJaWYgKHJzcC0+c3RhdHVzID09IE5DSV9TVEFUVVNfT0spIHsKIAkJbmRldi0+bmNpX3ZlciA9IHJzcC0+bmNpX3ZlcjsKLQotCW5mY19kYmcoIm5jaV92ZXIgMHgleCIsIG5kZXYtPm5jaV92ZXIpOworCQlwcl9kZWJ1ZygibmNpX3ZlciAweCV4LCBjb25maWdfc3RhdHVzIDB4JXhcbiIsCisJCQkgcnNwLT5uY2lfdmVyLCByc3AtPmNvbmZpZ19zdGF0dXMpOworCX0KIAogCW5jaV9yZXFfY29tcGxldGUobmRldiwgcnNwLT5zdGF0dXMpOwogfQpAQCAtNTUsMTYgKzU4LDE2IEBACiAJc3RydWN0IG5jaV9jb3JlX2luaXRfcnNwXzEgKnJzcF8xID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCXN0cnVjdCBuY2lfY29yZV9pbml0X3JzcF8yICpyc3BfMjsKIAotCW5mY19kYmcoImVudHJ5LCBzdGF0dXMgMHgleCIsIHJzcF8xLT5zdGF0dXMpOworCXByX2RlYnVnKCJzdGF0dXMgMHgleFxuIiwgcnNwXzEtPnN0YXR1cyk7CiAKIAlpZiAocnNwXzEtPnN0YXR1cyAhPSBOQ0lfU1RBVFVTX09LKQotCQlyZXR1cm47CisJCWdvdG8gZXhpdDsKIAogCW5kZXYtPm5mY2NfZmVhdHVyZXMgPSBfX2xlMzJfdG9fY3B1KHJzcF8xLT5uZmNjX2ZlYXR1cmVzKTsKIAluZGV2LT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMgPSByc3BfMS0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzOwogCiAJaWYgKG5kZXYtPm51bV9zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlcyA+Ci0JCU5DSV9NQVhfU1VQUE9SVEVEX1JGX0lOVEVSRkFDRVMpIHsKKwkJCU5DSV9NQVhfU1VQUE9SVEVEX1JGX0lOVEVSRkFDRVMpIHsKIAkJbmRldi0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzID0KIAkJCU5DSV9NQVhfU1VQUE9SVEVEX1JGX0lOVEVSRkFDRVM7CiAJfQpAQCAtNzMsNjggKzc2LDU4IEBACiAJCXJzcF8xLT5zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlcywKIAkJbmRldi0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzKTsKIAotCXJzcF8yID0gKHZvaWQgKikgKHNrYi0+ZGF0YSArIDYgKyBuZGV2LT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMpOworCXJzcF8yID0gKHZvaWQgKikgKHNrYi0+ZGF0YSArIDYgKyByc3BfMS0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzKTsKIAogCW5kZXYtPm1heF9sb2dpY2FsX2Nvbm5lY3Rpb25zID0KIAkJcnNwXzItPm1heF9sb2dpY2FsX2Nvbm5lY3Rpb25zOwogCW5kZXYtPm1heF9yb3V0aW5nX3RhYmxlX3NpemUgPQogCQlfX2xlMTZfdG9fY3B1KHJzcF8yLT5tYXhfcm91dGluZ190YWJsZV9zaXplKTsKLQluZGV2LT5tYXhfY29udHJvbF9wYWNrZXRfcGF5bG9hZF9sZW5ndGggPQotCQlyc3BfMi0+bWF4X2NvbnRyb2xfcGFja2V0X3BheWxvYWRfbGVuZ3RoOwotCW5kZXYtPnJmX3NlbmRpbmdfYnVmZmVyX3NpemUgPQotCQlfX2xlMTZfdG9fY3B1KHJzcF8yLT5yZl9zZW5kaW5nX2J1ZmZlcl9zaXplKTsKLQluZGV2LT5yZl9yZWNlaXZpbmdfYnVmZmVyX3NpemUgPQotCQlfX2xlMTZfdG9fY3B1KHJzcF8yLT5yZl9yZWNlaXZpbmdfYnVmZmVyX3NpemUpOwotCW5kZXYtPm1hbnVmYWN0dXJlcl9pZCA9Ci0JCV9fbGUxNl90b19jcHUocnNwXzItPm1hbnVmYWN0dXJlcl9pZCk7Ci0KLQluZmNfZGJnKCJuZmNjX2ZlYXR1cmVzIDB4JXgiLAotCQluZGV2LT5uZmNjX2ZlYXR1cmVzKTsKLQluZmNfZGJnKCJudW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMgJWQiLAotCQluZGV2LT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMpOwotCW5mY19kYmcoInN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzBdIDB4JXgiLAotCQluZGV2LT5zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1swXSk7Ci0JbmZjX2RiZygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMV0gMHgleCIsCi0JCW5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzFdKTsKLQluZmNfZGJnKCJzdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1syXSAweCV4IiwKLQkJbmRldi0+c3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMl0pOwotCW5mY19kYmcoInN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzNdIDB4JXgiLAotCQluZGV2LT5zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1szXSk7Ci0JbmZjX2RiZygibWF4X2xvZ2ljYWxfY29ubmVjdGlvbnMgJWQiLAotCQluZGV2LT5tYXhfbG9naWNhbF9jb25uZWN0aW9ucyk7Ci0JbmZjX2RiZygibWF4X3JvdXRpbmdfdGFibGVfc2l6ZSAlZCIsCi0JCW5kZXYtPm1heF9yb3V0aW5nX3RhYmxlX3NpemUpOwotCW5mY19kYmcoIm1heF9jb250cm9sX3BhY2tldF9wYXlsb2FkX2xlbmd0aCAlZCIsCi0JCW5kZXYtPm1heF9jb250cm9sX3BhY2tldF9wYXlsb2FkX2xlbmd0aCk7Ci0JbmZjX2RiZygicmZfc2VuZGluZ19idWZmZXJfc2l6ZSAlZCIsCi0JCW5kZXYtPnJmX3NlbmRpbmdfYnVmZmVyX3NpemUpOwotCW5mY19kYmcoInJmX3JlY2VpdmluZ19idWZmZXJfc2l6ZSAlZCIsCi0JCW5kZXYtPnJmX3JlY2VpdmluZ19idWZmZXJfc2l6ZSk7Ci0JbmZjX2RiZygibWFudWZhY3R1cmVyX2lkIDB4JXgiLAotCQluZGV2LT5tYW51ZmFjdHVyZXJfaWQpOwotCi0JbmNpX3JlcV9jb21wbGV0ZShuZGV2LCByc3BfMS0+c3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQgbmNpX2NvcmVfY29ubl9jcmVhdGVfcnNwX3BhY2tldChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKLQkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5jaV9jb3JlX2Nvbm5fY3JlYXRlX3JzcCAqcnNwID0gKHZvaWQgKikgc2tiLT5kYXRhOwotCi0JbmZjX2RiZygiZW50cnksIHN0YXR1cyAweCV4IiwgcnNwLT5zdGF0dXMpOwotCi0JaWYgKHJzcC0+c3RhdHVzICE9IE5DSV9TVEFUVVNfT0spCi0JCXJldHVybjsKLQotCW5kZXYtPm1heF9wa3RfcGF5bG9hZF9zaXplID0gcnNwLT5tYXhfcGt0X3BheWxvYWRfc2l6ZTsKLQluZGV2LT5pbml0aWFsX251bV9jcmVkaXRzID0gcnNwLT5pbml0aWFsX251bV9jcmVkaXRzOwotCW5kZXYtPmNvbm5faWQgPSByc3AtPmNvbm5faWQ7CisJbmRldi0+bWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuID0KKwkJcnNwXzItPm1heF9jdHJsX3BrdF9wYXlsb2FkX2xlbjsKKwluZGV2LT5tYXhfc2l6ZV9mb3JfbGFyZ2VfcGFyYW1zID0KKwkJX19sZTE2X3RvX2NwdShyc3BfMi0+bWF4X3NpemVfZm9yX2xhcmdlX3BhcmFtcyk7CisJbmRldi0+bWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZSA9CisJCXJzcF8yLT5tYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplOworCW5kZXYtPmluaXRpYWxfbnVtX2NyZWRpdHMgPQorCQlyc3BfMi0+aW5pdGlhbF9udW1fY3JlZGl0czsKKwluZGV2LT5tYW51ZmFjdF9pZCA9CisJCXJzcF8yLT5tYW51ZmFjdF9pZDsKKwluZGV2LT5tYW51ZmFjdF9zcGVjaWZpY19pbmZvID0KKwkJX19sZTMyX3RvX2NwdShyc3BfMi0+bWFudWZhY3Rfc3BlY2lmaWNfaW5mbyk7CiAKIAlhdG9taWNfc2V0KCZuZGV2LT5jcmVkaXRzX2NudCwgbmRldi0+aW5pdGlhbF9udW1fY3JlZGl0cyk7CiAKLQluZmNfZGJnKCJtYXhfcGt0X3BheWxvYWRfc2l6ZSAlZCIsIG5kZXYtPm1heF9wa3RfcGF5bG9hZF9zaXplKTsKLQluZmNfZGJnKCJpbml0aWFsX251bV9jcmVkaXRzICVkIiwgbmRldi0+aW5pdGlhbF9udW1fY3JlZGl0cyk7Ci0JbmZjX2RiZygiY29ubl9pZCAlZCIsIG5kZXYtPmNvbm5faWQpOworCXByX2RlYnVnKCJuZmNjX2ZlYXR1cmVzIDB4JXhcbiIsCisJCSBuZGV2LT5uZmNjX2ZlYXR1cmVzKTsKKwlwcl9kZWJ1ZygibnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzICVkXG4iLAorCQkgbmRldi0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMF0gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzBdKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMV0gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzFdKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMl0gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzJdKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbM10gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzNdKTsKKwlwcl9kZWJ1ZygibWF4X2xvZ2ljYWxfY29ubmVjdGlvbnMgJWRcbiIsCisJCSBuZGV2LT5tYXhfbG9naWNhbF9jb25uZWN0aW9ucyk7CisJcHJfZGVidWcoIm1heF9yb3V0aW5nX3RhYmxlX3NpemUgJWRcbiIsCisJCSBuZGV2LT5tYXhfcm91dGluZ190YWJsZV9zaXplKTsKKwlwcl9kZWJ1ZygibWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuICVkXG4iLAorCQkgbmRldi0+bWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuKTsKKwlwcl9kZWJ1ZygibWF4X3NpemVfZm9yX2xhcmdlX3BhcmFtcyAlZFxuIiwKKwkJIG5kZXYtPm1heF9zaXplX2Zvcl9sYXJnZV9wYXJhbXMpOworCXByX2RlYnVnKCJtYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplICVkXG4iLAorCQkgbmRldi0+bWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZSk7CisJcHJfZGVidWcoImluaXRpYWxfbnVtX2NyZWRpdHMgJWRcbiIsCisJCSBuZGV2LT5pbml0aWFsX251bV9jcmVkaXRzKTsKKwlwcl9kZWJ1ZygibWFudWZhY3RfaWQgMHgleFxuIiwKKwkJIG5kZXYtPm1hbnVmYWN0X2lkKTsKKwlwcl9kZWJ1ZygibWFudWZhY3Rfc3BlY2lmaWNfaW5mbyAweCV4XG4iLAorCQkgbmRldi0+bWFudWZhY3Rfc3BlY2lmaWNfaW5mbyk7CisKK2V4aXQ6CisJbmNpX3JlcV9jb21wbGV0ZShuZGV2LCByc3BfMS0+c3RhdHVzKTsKIH0KIAogc3RhdGljIHZvaWQgbmNpX3JmX2Rpc2NfbWFwX3JzcF9wYWNrZXQoc3RydWN0IG5jaV9kZXYgKm5kZXYsCkBAIC0xNDIsNyArMTM1LDcgQEAKIHsKIAlfX3U4IHN0YXR1cyA9IHNrYi0+ZGF0YVswXTsKIAotCW5mY19kYmcoImVudHJ5LCBzdGF0dXMgMHgleCIsIHN0YXR1cyk7CisJcHJfZGVidWcoInN0YXR1cyAweCV4XG4iLCBzdGF0dXMpOwogCiAJbmNpX3JlcV9jb21wbGV0ZShuZGV2LCBzdGF0dXMpOwogfQpAQCAtMTUxLDcgKzE0NCw3IEBACiB7CiAJX191OCBzdGF0dXMgPSBza2ItPmRhdGFbMF07CiAKLQluZmNfZGJnKCJlbnRyeSwgc3RhdHVzIDB4JXgiLCBzdGF0dXMpOworCXByX2RlYnVnKCJzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKIAogCWlmIChzdGF0dXMgPT0gTkNJX1NUQVRVU19PSykKIAkJc2V0X2JpdChOQ0lfRElTQ09WRVJZLCAmbmRldi0+ZmxhZ3MpOwpAQCAtMTY0LDcgKzE1Nyw3IEBACiB7CiAJX191OCBzdGF0dXMgPSBza2ItPmRhdGFbMF07CiAKLQluZmNfZGJnKCJlbnRyeSwgc3RhdHVzIDB4JXgiLCBzdGF0dXMpOworCXByX2RlYnVnKCJzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKIAogCWNsZWFyX2JpdChOQ0lfRElTQ09WRVJZLCAmbmRldi0+ZmxhZ3MpOwogCkBAIC0xNzgsMTEgKzE3MSwxMSBAQAogCS8qIHdlIGdvdCBhIHJzcCwgc3RvcCB0aGUgY21kIHRpbWVyICovCiAJZGVsX3RpbWVyKCZuZGV2LT5jbWRfdGltZXIpOwogCi0JbmZjX2RiZygiTkNJIFJYOiBNVD1yc3AsIFBCRj0lZCwgR0lEPTB4JXgsIE9JRD0weCV4LCBwbGVuPSVkIiwKLQkJCW5jaV9wYmYoc2tiLT5kYXRhKSwKLQkJCW5jaV9vcGNvZGVfZ2lkKHJzcF9vcGNvZGUpLAotCQkJbmNpX29wY29kZV9vaWQocnNwX29wY29kZSksCi0JCQluY2lfcGxlbihza2ItPmRhdGEpKTsKKwlwcl9kZWJ1ZygiTkNJIFJYOiBNVD1yc3AsIFBCRj0lZCwgR0lEPTB4JXgsIE9JRD0weCV4LCBwbGVuPSVkXG4iLAorCQkgbmNpX3BiZihza2ItPmRhdGEpLAorCQkgbmNpX29wY29kZV9naWQocnNwX29wY29kZSksCisJCSBuY2lfb3Bjb2RlX29pZChyc3Bfb3Bjb2RlKSwKKwkJIG5jaV9wbGVuKHNrYi0+ZGF0YSkpOwogCiAJLyogc3RyaXAgdGhlIG5jaSBjb250cm9sIGhlYWRlciAqLwogCXNrYl9wdWxsKHNrYiwgTkNJX0NUUkxfSERSX1NJWkUpOwpAQCAtMTk2LDEwICsxODksNiBAQAogCQluY2lfY29yZV9pbml0X3JzcF9wYWNrZXQobmRldiwgc2tiKTsKIAkJYnJlYWs7CiAKLQljYXNlIE5DSV9PUF9DT1JFX0NPTk5fQ1JFQVRFX1JTUDoKLQkJbmNpX2NvcmVfY29ubl9jcmVhdGVfcnNwX3BhY2tldChuZGV2LCBza2IpOwotCQlicmVhazsKLQogCWNhc2UgTkNJX09QX1JGX0RJU0NPVkVSX01BUF9SU1A6CiAJCW5jaV9yZl9kaXNjX21hcF9yc3BfcGFja2V0KG5kZXYsIHNrYik7CiAJCWJyZWFrOwpAQCAtMjEzLDcgKzIwMiw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJbmZjX2VycigidW5rbm93biByc3Agb3Bjb2RlIDB4JXgiLCByc3Bfb3Bjb2RlKTsKKwkJcHJfZXJyKCJ1bmtub3duIHJzcCBvcGNvZGUgMHgleFxuIiwgcnNwX29wY29kZSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9uZXRsaW5rLmMgYi9uZXQvbmZjL25ldGxpbmsuYwppbmRleCAwM2Y4ODE4Li5jMTBlOWI4IDEwMDY0NAotLS0gYS9uZXQvbmZjL25ldGxpbmsuYworKysgYi9uZXQvbmZjL25ldGxpbmsuYwpAQCAtMjEsNiArMjEsOCBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbmZjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTEsOCArNTMsNiBAQAogewogCXZvaWQgKmhkcjsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAloZHIgPSBnZW5sbXNnX3B1dChtc2csIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLCBjYi0+bmxoLT5ubG1zZ19zZXEsCiAJCQkJJm5mY19nZW5sX2ZhbWlseSwgZmxhZ3MsIE5GQ19DTURfR0VUX1RBUkdFVCk7CiAJaWYgKCFoZHIpCkBAIC0xMDUsOCArMTA1LDYgQEAKIAlzdHJ1Y3QgbmZjX2RldiAqZGV2ID0gKHN0cnVjdCBuZmNfZGV2ICopIGNiLT5hcmdzWzFdOwogCWludCByYzsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIWRldikgewogCQlkZXYgPSBfX2dldF9kZXZpY2VfZnJvbV9jYihjYik7CiAJCWlmIChJU19FUlIoZGV2KSkKQEAgLTEzOSw4ICsxMzcsNiBAQAogewogCXN0cnVjdCBuZmNfZGV2ICpkZXYgPSAoc3RydWN0IG5mY19kZXYgKikgY2ItPmFyZ3NbMV07CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaWYgKGRldikKIAkJbmZjX3B1dF9kZXZpY2UoZGV2KTsKIApAQCAtMTUyLDggKzE0OCw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAl2b2lkICpoZHI7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJZGV2LT5nZW5sX2RhdGEucG9sbF9yZXFfcGlkID0gMDsKIAogCW1zZyA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0FUT01JQyk7CkBAIC0xODMsOCArMTc3LDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCXZvaWQgKmhkcjsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAltc2cgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOwogCWlmICghbXNnKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIxNiw4ICsyMDgsNiBAQAogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCW1zZyA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtc2cpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjQ5LDggKzIzOSw2IEBACiB7CiAJdm9pZCAqaGRyOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcGlkLCBzZXEsICZuZmNfZ2VubF9mYW1pbHksIGZsYWdzLAogCQkJCQkJCU5GQ19DTURfR0VUX0RFVklDRSk7CiAJaWYgKCFoZHIpCkBAIC0yNzcsOCArMjY1LDYgQEAKIAlzdHJ1Y3QgbmZjX2RldiAqZGV2ID0gKHN0cnVjdCBuZmNfZGV2ICopIGNiLT5hcmdzWzFdOwogCWJvb2wgZmlyc3RfY2FsbCA9IGZhbHNlOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWlmICghaXRlcikgewogCQlmaXJzdF9jYWxsID0gdHJ1ZTsKIAkJaXRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGFzc19kZXZfaXRlciksIEdGUF9LRVJORUwpOwpAQCAtMzE5LDggKzMwNSw2IEBACiB7CiAJc3RydWN0IGNsYXNzX2Rldl9pdGVyICppdGVyID0gKHN0cnVjdCBjbGFzc19kZXZfaXRlciAqKSBjYi0+YXJnc1swXTsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAluZmNfZGV2aWNlX2l0ZXJfZXhpdChpdGVyKTsKIAlrZnJlZShpdGVyKTsKIApAQCAtMzM0LDggKzMxOCw2IEBACiAJdTMyIGlkeDsKIAlpbnQgcmMgPSAtRU5PQlVGUzsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zNzMsOCArMzU1LDYgQEAKIAlpbnQgcmM7CiAJdTMyIGlkeDsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zOTYsOCArMzc2LDYgQEAKIAlpbnQgcmM7CiAJdTMyIGlkeDsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC00MjAsOCArMzk4LDYgQEAKIAl1MzIgaWR4OwogCXUzMiBwcm90b2NvbHM7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaWYgKCFpbmZvLT5hdHRyc1tORkNfQVRUUl9ERVZJQ0VfSU5ERVhdIHx8CiAJCSFpbmZvLT5hdHRyc1tORkNfQVRUUl9QUk9UT0NPTFNdKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ1MSw4ICs0MjcsNiBAQAogCWludCByYzsKIAl1MzIgaWR4OwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWlmICghaW5mby0+YXR0cnNbTkZDX0FUVFJfREVWSUNFX0lOREVYXSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTUyNCw3ICs0OTgsNyBAQAogCWlmIChldmVudCAhPSBORVRMSU5LX1VSRUxFQVNFIHx8IG4tPnByb3RvY29sICE9IE5FVExJTktfR0VORVJJQykKIAkJZ290byBvdXQ7CiAKLQluZmNfZGJnKCJORVRMSU5LX1VSRUxFQVNFIGV2ZW50IGZyb20gaWQgJWQiLCBuLT5waWQpOworCXByX2RlYnVnKCJORVRMSU5LX1VSRUxFQVNFIGV2ZW50IGZyb20gaWQgJWRcbiIsIG4tPnBpZCk7CiAKIAluZmNfZGV2aWNlX2l0ZXJfaW5pdCgmaXRlcik7CiAJZGV2ID0gbmZjX2RldmljZV9pdGVyX25leHQoJml0ZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L25mYy9uZmMuaCBiL25ldC9uZmMvbmZjLmgKaW5kZXggYjY3NTNmNC4uNjdkNjA1MCAxMDA2NDQKLS0tIGEvbmV0L25mYy9uZmMuaAorKysgYi9uZXQvbmZjL25mYy5oCkBAIC0yNywxMyArMjcsNiBAQAogI2luY2x1ZGUgPG5ldC9uZmMvbmZjLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAotX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKLWludCBuZmNfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci0KLSNkZWZpbmUgbmZjX2luZm8oZm10LCBhcmcuLi4pIG5mY19wcmludGsoS0VSTl9JTkZPLCBmbXQsICMjYXJnKQotI2RlZmluZSBuZmNfZXJyKGZtdCwgYXJnLi4uKSBuZmNfcHJpbnRrKEtFUk5fRVJSLCBmbXQsICMjYXJnKQotI2RlZmluZSBuZmNfZGJnKGZtdCwgYXJnLi4uKSBwcl9kZWJ1ZyhmbXQgIlxuIiwgIyNhcmcpCi0KIHN0cnVjdCBuZmNfcHJvdG9jb2wgewogCWludCBpZDsKIAlzdHJ1Y3QgcHJvdG8gKnByb3RvOwpkaWZmIC0tZ2l0IGEvbmV0L25mYy9yYXdzb2NrLmMgYi9uZXQvbmZjL3Jhd3NvY2suYwppbmRleCA5ZmQ2NTJhLi42OGVjZjNmIDEwMDY0NAotLS0gYS9uZXQvbmZjL3Jhd3NvY2suYworKysgYi9uZXQvbmZjL3Jhd3NvY2suYwpAQCAtMjEsMTQgKzIxLDE3IEBACiAgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPG5ldC90Y3Bfc3RhdGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZjLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJuZmMuaCIKIAogc3RhdGljIHZvaWQgcmF3c29ja193cml0ZV9xdWV1ZV9wdXJnZShzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JbmZjX2RiZygic2s9JXAiLCBzayk7CisJcHJfZGVidWcoInNrPSVwXG4iLCBzayk7CiAKIAlzcGluX2xvY2tfYmgoJnNrLT5za193cml0ZV9xdWV1ZS5sb2NrKTsKIAlfX3NrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKQEAgLTM4LDcgKzQxLDcgQEAKIAogc3RhdGljIHZvaWQgcmF3c29ja19yZXBvcnRfZXJyb3Ioc3RydWN0IHNvY2sgKnNrLCBpbnQgZXJyKQogewotCW5mY19kYmcoInNrPSVwIGVycj0lZCIsIHNrLCBlcnIpOworCXByX2RlYnVnKCJzaz0lcCBlcnI9JWRcbiIsIHNrLCBlcnIpOwogCiAJc2stPnNrX3NodXRkb3duID0gU0hVVERPV05fTUFTSzsKIAlzay0+c2tfZXJyID0gLWVycjsKQEAgLTUxLDcgKzU0LDcgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAotCW5mY19kYmcoInNvY2s9JXAiLCBzb2NrKTsKKwlwcl9kZWJ1Zygic29jaz0lcFxuIiwgc29jayk7CiAKIAlzb2NrX29ycGhhbihzayk7CiAJc29ja19wdXQoc2spOwpAQCAtNjcsMTQgKzcwLDE0IEBACiAJc3RydWN0IG5mY19kZXYgKmRldjsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygic29jaz0lcCBzaz0lcCBmbGFncz0lZCIsIHNvY2ssIHNrLCBmbGFncyk7CisJcHJfZGVidWcoInNvY2s9JXAgc2s9JXAgZmxhZ3M9JWRcbiIsIHNvY2ssIHNrLCBmbGFncyk7CiAKIAlpZiAoIWFkZHIgfHwgbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9uZmMpIHx8CiAJCWFkZHItPnNhX2ZhbWlseSAhPSBBRl9ORkMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbmZjX2RiZygiYWRkciBkZXZfaWR4PSV1IHRhcmdldF9pZHg9JXUgcHJvdG9jb2w9JXUiLCBhZGRyLT5kZXZfaWR4LAotCQkJCQlhZGRyLT50YXJnZXRfaWR4LCBhZGRyLT5uZmNfcHJvdG9jb2wpOworCXByX2RlYnVnKCJhZGRyIGRldl9pZHg9JXUgdGFyZ2V0X2lkeD0ldSBwcm90b2NvbD0ldVxuIiwKKwkJIGFkZHItPmRldl9pZHgsIGFkZHItPnRhcmdldF9pZHgsIGFkZHItPm5mY19wcm90b2NvbCk7CiAKIAlsb2NrX3NvY2soc2spOwogCkBAIC0xMzUsNyArMTM4LDcgQEAKIAogCUJVR19PTihpbl9pcnEoKSk7CiAKLQluZmNfZGJnKCJzaz0lcCBlcnI9JWQiLCBzaywgZXJyKTsKKwlwcl9kZWJ1Zygic2s9JXAgZXJyPSVkXG4iLCBzaywgZXJyKTsKIAogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7CkBAIC0xNzEsNyArMTc0LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByYzsKIAotCW5mY19kYmcoInNrPSVwIHRhcmdldF9pZHg9JXUiLCBzaywgdGFyZ2V0X2lkeCk7CisJcHJfZGVidWcoInNrPSVwIHRhcmdldF9pZHg9JXVcbiIsIHNrLCB0YXJnZXRfaWR4KTsKIAogCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSB7CiAJCXJhd3NvY2tfd3JpdGVfcXVldWVfcHVyZ2Uoc2spOwpAQCAtMTk3LDcgKzIwMCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJzb2NrPSVwIHNrPSVwIGxlbj0lenUiLCBzb2NrLCBzaywgbGVuKTsKKwlwcl9kZWJ1Zygic29jaz0lcCBzaz0lcCBsZW49JXp1XG4iLCBzb2NrLCBzaywgbGVuKTsKIAogCWlmIChtc2ctPm1zZ19uYW1lbGVuKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0yMzgsNyArMjQxLDcgQEAKIAlpbnQgY29waWVkOwogCWludCByYzsKIAotCW5mY19kYmcoInNvY2s9JXAgc2s9JXAgbGVuPSV6dSBmbGFncz0lZCIsIHNvY2ssIHNrLCBsZW4sIGZsYWdzKTsKKwlwcl9kZWJ1Zygic29jaz0lcCBzaz0lcCBsZW49JXp1IGZsYWdzPSVkXG4iLCBzb2NrLCBzaywgbGVuLCBmbGFncyk7CiAKIAlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsIG5vYmxvY2ssICZyYyk7CiAJaWYgKCFza2IpCkBAIC0yODIsNyArMjg1LDcgQEAKIAogc3RhdGljIHZvaWQgcmF3c29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JbmZjX2RiZygic2s9JXAiLCBzayk7CisJcHJfZGVidWcoInNrPSVwXG4iLCBzayk7CiAKIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCkgewogCQluZmNfZGVhY3RpdmF0ZV90YXJnZXQobmZjX3Jhd3NvY2soc2spLT5kZXYsCkBAIC0yOTMsNyArMjk2LDcgQEAKIAlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKIAogCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7Ci0JCW5mY19lcnIoIkZyZWVpbmcgYWxpdmUgTkZDIHJhdyBzb2NrZXQgJXAiLCBzayk7CisJCXByX2VycigiRnJlZWluZyBhbGl2ZSBORkMgcmF3IHNvY2tldCAlcFxuIiwgc2spOwogCQlyZXR1cm47CiAJfQogfQpAQCAtMzAzLDcgKzMwNiw3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCi0JbmZjX2RiZygic29jaz0lcCIsIHNvY2spOworCXByX2RlYnVnKCJzb2NrPSVwXG4iLCBzb2NrKTsKIAogCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfU0VRUEFDS0VUKQogCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCmluZGV4IDAzYmI0NWEuLjgyYTZmMzQgMTAwNjQ0Ci0tLSBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKysrIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwpAQCAtMzM1LDcgKzMzNSw3IEBACiAJKCgoeCktPmthY3RpdmVfYmxrX251bSA8ICgoeCktPmtudW1fYmxvY2tzLTEpKSA/IFwKIAkoKHgpLT5rYWN0aXZlX2Jsa19udW0rMSkgOiAwKQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWNrZXRfc29jayAqcGt0X3NrKHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3NvY2sgKnBrdF9zayhzdHJ1Y3Qgc29jayAqc2spCiB7CiAJcmV0dXJuIChzdHJ1Y3QgcGFja2V0X3NvY2sgKilzazsKIH0KQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCXJldHVybiBoLnJhdzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpwYWNrZXRfY3VycmVudF9mcmFtZShzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAorc3RhdGljIHZvaWQgKnBhY2tldF9jdXJyZW50X2ZyYW1lKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCiAJCXN0cnVjdCBwYWNrZXRfcmluZ19idWZmZXIgKnJiLAogCQlpbnQgc3RhdHVzKQogewpAQCAtNzE1LDcgKzcxNSw3IEBACiAJc3Bpbl91bmxvY2soJnBvLT5zay5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX2ZsdXNoX2Jsb2NrKHN0cnVjdCB0cGFja2V0X2tiZHFfY29yZSAqcGtjMSwKK3N0YXRpYyB2b2lkIHByYl9mbHVzaF9ibG9jayhzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYzEsCiAJCXN0cnVjdCB0cGFja2V0X2Jsb2NrX2Rlc2MgKnBiZDEsIF9fdTMyIHN0YXR1cykKIHsKIAkvKiBGbHVzaCBldmVyeXRoaW5nIG1pbnVzIHRoZSBibG9jayBoZWFkZXIgKi8KQEAgLTc5Myw3ICs3OTMsNyBAQAogCXBrYzEtPmthY3RpdmVfYmxrX251bSA9IEdFVF9ORVhUX1BSQl9CTEtfTlVNKHBrYzEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX3RoYXdfcXVldWUoc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MpCitzdGF0aWMgdm9pZCBwcmJfdGhhd19xdWV1ZShzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYykKIHsKIAlwa2MtPnJlc2V0X3BlbmRpbmdfb25fY3Vycl9ibGsgPSAwOwogfQpAQCAtODY5LDcgKzg2OSw3IEBACiAgKiAgICAgICAgIGNhc2UgYW5kIF9fcGFja2V0X2xvb2t1cF9mcmFtZV9pbl9ibG9jayB3aWxsIGNoZWNrIGlmIGJsb2NrLTAKICAqICAgICAgICAgaXMgZnJlZSBhbmQgY2FuIG5vdyBiZSByZS11c2VkLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX2ZyZWV6ZV9xdWV1ZShzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKK3N0YXRpYyB2b2lkIHByYl9mcmVlemVfcXVldWUoc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MsCiAJCQkJICBzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvKQogewogCXBrYy0+cmVzZXRfcGVuZGluZ19vbl9jdXJyX2JsayA9IDE7CkBAIC05NDAsMzYgKzk0MCwzNiBAQAogCUJVRygpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwcmJfY3Vycl9ibGtfaW5fdXNlKHN0cnVjdCB0cGFja2V0X2tiZHFfY29yZSAqcGtjLAorc3RhdGljIGludCBwcmJfY3Vycl9ibGtfaW5fdXNlKHN0cnVjdCB0cGFja2V0X2tiZHFfY29yZSAqcGtjLAogCQkJCSAgICAgIHN0cnVjdCB0cGFja2V0X2Jsb2NrX2Rlc2MgKnBiZCkKIHsKIAlyZXR1cm4gVFBfU1RBVFVTX1VTRVIgJiBCTE9DS19TVEFUVVMocGJkKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHJiX3F1ZXVlX2Zyb3plbihzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYykKK3N0YXRpYyBpbnQgcHJiX3F1ZXVlX2Zyb3plbihzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYykKIHsKIAlyZXR1cm4gcGtjLT5yZXNldF9wZW5kaW5nX29uX2N1cnJfYmxrOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX2NsZWFyX2Jsa19maWxsX3N0YXR1cyhzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpyYikKK3N0YXRpYyB2b2lkIHByYl9jbGVhcl9ibGtfZmlsbF9zdGF0dXMoc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIpCiB7CiAJc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MgID0gR0VUX1BCRFFDX0ZST01fUkIocmIpOwogCWF0b21pY19kZWMoJnBrYy0+YmxrX2ZpbGxfaW5fcHJvZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmJfZmlsbF9yeGhhc2goc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MsCitzdGF0aWMgdm9pZCBwcmJfZmlsbF9yeGhhc2goc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MsCiAJCQlzdHJ1Y3QgdHBhY2tldDNfaGRyICpwcGQpCiB7CiAJcHBkLT5odjEudHBfcnhoYXNoID0gc2tiX2dldF9yeGhhc2gocGtjLT5za2IpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX2NsZWFyX3J4aGFzaChzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKK3N0YXRpYyB2b2lkIHByYl9jbGVhcl9yeGhhc2goc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MsCiAJCQlzdHJ1Y3QgdHBhY2tldDNfaGRyICpwcGQpCiB7CiAJcHBkLT5odjEudHBfcnhoYXNoID0gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHByYl9maWxsX3ZsYW5faW5mbyhzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKK3N0YXRpYyB2b2lkIHByYl9maWxsX3ZsYW5faW5mbyhzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKIAkJCXN0cnVjdCB0cGFja2V0M19oZHIgKnBwZCkKIHsKIAlpZiAodmxhbl90eF90YWdfcHJlc2VudChwa2MtPnNrYikpIHsKQEAgLTk5MSw3ICs5OTEsNyBAQAogCQlwcmJfY2xlYXJfcnhoYXNoKHBrYywgcHBkKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHByYl9maWxsX2N1cnJfYmxvY2soY2hhciAqY3VyciwKK3N0YXRpYyB2b2lkIHByYl9maWxsX2N1cnJfYmxvY2soY2hhciAqY3VyciwKIAkJCQlzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKIAkJCQlzdHJ1Y3QgdHBhY2tldF9ibG9ja19kZXNjICpwYmQsCiAJCQkJdW5zaWduZWQgaW50IGxlbikKQEAgLTEwNzEsNyArMTA3MSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGFja2V0X2N1cnJlbnRfcnhfZnJhbWUoc3RydWN0IHBhY2tldF9zb2NrICpwbywKK3N0YXRpYyB2b2lkICpwYWNrZXRfY3VycmVudF9yeF9mcmFtZShzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAogCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgIGludCBzdGF0dXMsIHVuc2lnbmVkIGludCBsZW4pCiB7CkBAIC0xMDkxLDcgKzEwOTEsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpwcmJfbG9va3VwX2Jsb2NrKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCitzdGF0aWMgdm9pZCAqcHJiX2xvb2t1cF9ibG9jayhzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAogCQkJCSAgICAgc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgcHJldmlvdXMsCiAJCQkJICAgICBpbnQgc3RhdHVzKQpAQCAtMTEwNCw3ICsxMTA0LDcgQEAKIAlyZXR1cm4gcGJkOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwcmJfcHJldmlvdXNfYmxrX251bShzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpyYikKK3N0YXRpYyBpbnQgcHJiX3ByZXZpb3VzX2Jsa19udW0oc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIpCiB7CiAJdW5zaWduZWQgaW50IHByZXY7CiAJaWYgKHJiLT5wcmJfYmRxYy5rYWN0aXZlX2Jsa19udW0pCkBAIC0xMTE1LDcgKzExMTUsNyBAQAogfQogCiAvKiBBc3N1bWVzIGNhbGxlciBoYXMgaGVsZCB0aGUgcnhfcXVldWUubG9jayAqLwotc3RhdGljIGlubGluZSB2b2lkICpfX3ByYl9wcmV2aW91c19ibG9jayhzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAorc3RhdGljIHZvaWQgKl9fcHJiX3ByZXZpb3VzX2Jsb2NrKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCiAJCQkJCSBzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpyYiwKIAkJCQkJIGludCBzdGF0dXMpCiB7CkBAIC0xMTIzLDcgKzExMjMsNyBAQAogCXJldHVybiBwcmJfbG9va3VwX2Jsb2NrKHBvLCByYiwgcHJldmlvdXMsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGFja2V0X3ByZXZpb3VzX3J4X2ZyYW1lKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCitzdGF0aWMgdm9pZCAqcGFja2V0X3ByZXZpb3VzX3J4X2ZyYW1lKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCiAJCQkJCSAgICAgc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIsCiAJCQkJCSAgICAgaW50IHN0YXR1cykKIHsKQEAgLTExMzMsNyArMTEzMyw3IEBACiAJcmV0dXJuIF9fcHJiX3ByZXZpb3VzX2Jsb2NrKHBvLCByYiwgc3RhdHVzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBhY2tldF9pbmNyZW1lbnRfcnhfaGVhZChzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAorc3RhdGljIHZvaWQgcGFja2V0X2luY3JlbWVudF9yeF9oZWFkKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCiAJCQkJCSAgICBzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpyYikKIHsKIAlzd2l0Y2ggKHBvLT50cF92ZXJzaW9uKSB7CkBAIC0xMTQ4LDcgKzExNDgsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpwYWNrZXRfcHJldmlvdXNfZnJhbWUoc3RydWN0IHBhY2tldF9zb2NrICpwbywKK3N0YXRpYyB2b2lkICpwYWNrZXRfcHJldmlvdXNfZnJhbWUoc3RydWN0IHBhY2tldF9zb2NrICpwbywKIAkJc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIsCiAJCWludCBzdGF0dXMpCiB7CkBAIC0xMTU2LDcgKzExNTYsNyBAQAogCXJldHVybiBwYWNrZXRfbG9va3VwX2ZyYW1lKHBvLCByYiwgcHJldmlvdXMsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWNrZXRfaW5jcmVtZW50X2hlYWQoc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqYnVmZikKK3N0YXRpYyB2b2lkIHBhY2tldF9pbmNyZW1lbnRfaGVhZChzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpidWZmKQogewogCWJ1ZmYtPmhlYWQgPSBidWZmLT5oZWFkICE9IGJ1ZmYtPmZyYW1lX21heCA/IGJ1ZmYtPmhlYWQrMSA6IDA7CiB9CkBAIC0xNTU4LDcgKzE1NTgsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJ1bl9maWx0ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnVuX2ZpbHRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVzKQogewpAQCAtMjE2NywxMCArMjE2NywxMCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnBhY2tldF9hbGxvY19za2Ioc3RydWN0IHNvY2sgKnNrLCBzaXplX3QgcHJlcGFkLAotCQkJCQkgICAgICAgc2l6ZV90IHJlc2VydmUsIHNpemVfdCBsZW4sCi0JCQkJCSAgICAgICBzaXplX3QgbGluZWFyLCBpbnQgbm9ibG9jaywKLQkJCQkJICAgICAgIGludCAqZXJyKQorc3RhdGljIHN0cnVjdCBza19idWZmICpwYWNrZXRfYWxsb2Nfc2tiKHN0cnVjdCBzb2NrICpzaywgc2l6ZV90IHByZXBhZCwKKwkJCQkgICAgICAgIHNpemVfdCByZXNlcnZlLCBzaXplX3QgbGVuLAorCQkJCSAgICAgICAgc2l6ZV90IGxpbmVhciwgaW50IG5vYmxvY2ssCisJCQkJICAgICAgICBpbnQgKmVycikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC0zNDk0LDcgKzM0OTQsNyBAQAogCWtmcmVlKHBnX3ZlYyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqYWxsb2Nfb25lX3BnX3ZlY19wYWdlKHVuc2lnbmVkIGxvbmcgb3JkZXIpCitzdGF0aWMgY2hhciAqYWxsb2Nfb25lX3BnX3ZlY19wYWdlKHVuc2lnbmVkIGxvbmcgb3JkZXIpCiB7CiAJY2hhciAqYnVmZmVyID0gTlVMTDsKIAlnZnBfdCBnZnBfZmxhZ3MgPSBHRlBfS0VSTkVMIHwgX19HRlBfQ09NUCB8CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L2RhdGFncmFtLmMgYi9uZXQvcGhvbmV0L2RhdGFncmFtLmMKaW5kZXggMmYwMzIzOC4uYmYzNWI0ZSAxMDA2NDQKLS0tIGEvbmV0L3Bob25ldC9kYXRhZ3JhbS5jCisrKyBiL25ldC9waG9uZXQvZGF0YWdyYW0uYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKICNpbmNsdWRlIDxsaW51eC9waG9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvcGhvbmV0L3Bob25ldC5oPgogCiBzdGF0aWMgaW50IHBuX2JhY2tsb2dfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3BlcC5jIGIvbmV0L3Bob25ldC9wZXAuYwppbmRleCBmMTdmZDg0Li4yYmE2ZTlmIDEwMDY0NAotLS0gYS9uZXQvcGhvbmV0L3BlcC5jCisrKyBiL25ldC9waG9uZXQvcGVwLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9waG9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvcGhvbmV0L3Bob25ldC5oPgogI2luY2x1ZGUgPG5ldC9waG9uZXQvcGVwLmg+CiAjaW5jbHVkZSA8bmV0L3Bob25ldC9ncHJzLmg+CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3NvY2tldC5jIGIvbmV0L3Bob25ldC9zb2NrZXQuYwppbmRleCA2NzZkMThkLi4zZjhkMGIxIDEwMDY0NAotLS0gYS9uZXQvcGhvbmV0L3NvY2tldC5jCisrKyBiL25ldC9waG9uZXQvc29ja2V0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwX3N0YXRlcy5oPgogCiAjaW5jbHVkZSA8bGludXgvcGhvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3Bob25ldC9waG9uZXQuaD4KICNpbmNsdWRlIDxuZXQvcGhvbmV0L3BlcC5oPgogI2luY2x1ZGUgPG5ldC9waG9uZXQvcG5fZGV2Lmg+CmRpZmYgLS1naXQgYS9uZXQvcmRzL2NvbmcuYyBiL25ldC9yZHMvY29uZy5jCmluZGV4IDZkYWFhNDkuLmU1YjY1YWMgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvY29uZy5jCisrKyBiL25ldC9yZHMvY29uZy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmRzL2Nvbm5lY3Rpb24uYyBiL25ldC9yZHMvY29ubmVjdGlvbi5jCmluZGV4IDkzMzRkODkuLjllMDdjNzUgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvY29ubmVjdGlvbi5jCisrKyBiL25ldC9yZHMvY29ubmVjdGlvbi5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9oYXNodGFibGVzLmg+CiAKICNpbmNsdWRlICJyZHMuaCIKZGlmZiAtLWdpdCBhL25ldC9yZHMvaWIuYyBiL25ldC9yZHMvaWIuYwppbmRleCAzYjgzMDg2Li5iNGM4YjAwIDEwMDY0NAotLS0gYS9uZXQvcmRzL2liLmMKKysrIGIvbmV0L3Jkcy9pYi5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJyZHMuaCIKICNpbmNsdWRlICJpYi5oIgpkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9pbmZvLmMgYi9uZXQvcmRzL2luZm8uYwppbmRleCA0ZmRmMWI2Li5mMWMwMTZjIDEwMDY0NAotLS0gYS9uZXQvcmRzL2luZm8uYworKysgYi9uZXQvcmRzL2luZm8uYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmRzL2l3LmMgYi9uZXQvcmRzL2l3LmMKaW5kZXggZjc0NzQ4NC4uNzgyNmQ0NiAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9pdy5jCisrKyBiL25ldC9yZHMvaXcuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAjaW5jbHVkZSAiaXcuaCIKZGlmZiAtLWdpdCBhL25ldC9yZHMvbWVzc2FnZS5jIGIvbmV0L3Jkcy9tZXNzYWdlLmMKaW5kZXggMWZkM2QyOS4uZjBhNDY1OCAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9tZXNzYWdlLmMKKysrIGIvbmV0L3Jkcy9tZXNzYWdlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmRzL3BhZ2UuYyBiL25ldC9yZHMvcGFnZS5jCmluZGV4IGI4MmQ2M2UuLjI0OTljZDEgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvcGFnZS5jCisrKyBiL25ldC9yZHMvcGFnZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvcmRtYV90cmFuc3BvcnQuYyBiL25ldC9yZHMvcmRtYV90cmFuc3BvcnQuYwppbmRleCBmODc2MGUxLi5jMmJlOTAxIDEwMDY0NAotLS0gYS9uZXQvcmRzL3JkbWFfdHJhbnNwb3J0LmMKKysrIGIvbmV0L3Jkcy9yZG1hX3RyYW5zcG9ydC5jCkBAIC0zMCw2ICszMCw3IEBACiAgKiBTT0ZUV0FSRS4KICAqCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWFfY20uaD4KIAogI2luY2x1ZGUgInJkbWFfdHJhbnNwb3J0LmgiCmRpZmYgLS1naXQgYS9uZXQvcmRzL3Jkcy5oIGIvbmV0L3Jkcy9yZHMuaAppbmRleCBkYThhZGFjLi43ZWFiYTE4IDEwMDY0NAotLS0gYS9uZXQvcmRzL3Jkcy5oCisrKyBiL25ldC9yZHMvcmRzLmgKQEAgLTM2LDggKzM2LDggQEAKICNkZWZpbmUgcmRzZGVidWcoZm10LCBhcmdzLi4uKSBwcl9kZWJ1ZygiJXMoKTogIiBmbXQsIF9fZnVuY19fICwgIyNhcmdzKQogI2Vsc2UKIC8qIHNpZ2gsIHByX2RlYnVnKCkgY2F1c2VzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncyAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKQotcmRzZGVidWcoY2hhciAqZm10LCAuLi4pCitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDEsIDIpCit2b2lkIHJkc2RlYnVnKGNoYXIgKmZtdCwgLi4uKQogewogfQogI2VuZGlmCkBAIC02MjUsOCArNjI1LDggQEAKIAkJCSAgc3RydWN0IHJkc19pbmZvX2xlbmd0aHMgKmxlbnMsCiAJCQkgIGludCAoKnZpc2l0b3IpKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqLCB2b2lkICopLAogCQkJICBzaXplX3QgaXRlbV9sZW4pOwotdm9pZCBfX3Jkc19jb25uX2Vycm9yKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgY29uc3QgY2hhciAqLCAuLi4pCi0JCQkJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworX19wcmludGYoMiwgMykKK3ZvaWQgX19yZHNfY29ubl9lcnJvcihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sIGNvbnN0IGNoYXIgKiwgLi4uKTsKICNkZWZpbmUgcmRzX2Nvbm5fZXJyb3IoY29ubiwgZm10Li4uKSBcCiAJX19yZHNfY29ubl9lcnJvcihjb25uLCBLRVJOX1dBUk5JTkcgIlJEUzogIiBmbXQpCiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvcmVjdi5jIGIvbmV0L3Jkcy9yZWN2LmMKaW5kZXggNTk2Njg5ZS4uYmMzZjhjZCAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9yZWN2LmMKKysrIGIvbmV0L3Jkcy9yZWN2LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvc2VuZC5jIGIvbmV0L3Jkcy9zZW5kLmMKaW5kZXggYWE1N2UyMi4uZTJkNjNjNSAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9zZW5kLmMKKysrIGIvbmV0L3Jkcy9zZW5kLmMKQEAgLTMxLDExICszMSwxMyBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmRzL3N0YXRzLmMgYi9uZXQvcmRzL3N0YXRzLmMKaW5kZXggMTBjNzU5Yy4uN2JlNzkwZCAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9zdGF0cy5jCisrKyBiL25ldC9yZHMvc3RhdHMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvdGNwLmMgYi9uZXQvcmRzL3RjcC5jCmluZGV4IDhlMGEzMjAuLmVkYWM5ZWYgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvdGNwLmMKKysrIGIvbmV0L3Jkcy90Y3AuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KIAogI2luY2x1ZGUgInJkcy5oIgpkaWZmIC0tZ2l0IGEvbmV0L3Jkcy90aHJlYWRzLmMgYi9uZXQvcmRzL3RocmVhZHMuYwppbmRleCAwZmQ5MGY4Li42NWVhZWZjIDEwMDY0NAotLS0gYS9uZXQvcmRzL3RocmVhZHMuYworKysgYi9uZXQvcmRzL3RocmVhZHMuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJyZHMuaCIKIApkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9jb3JlLmMgYi9uZXQvcmZraWxsL2NvcmUuYwppbmRleCA1YmUxOTU3Li4zNTQ3NjBlIDEwMDY0NAotLS0gYS9uZXQvcmZraWxsL2NvcmUuYworKysgYi9uZXQvcmZraWxsL2NvcmUuYwpAQCAtNjQ0LDcgKzY0NCw3IEBACiAJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JZXJyID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmc3RhdGUpOworCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnN0YXRlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC02ODgsNyArNjg4LDcgQEAKIAlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZzdGF0ZSk7CisJZXJyID0ga3N0cnRvdWwoYnVmLCAwLCAmc3RhdGUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL25ldC9yZmtpbGwvaW5wdXQuYyBiL25ldC9yZmtpbGwvaW5wdXQuYwppbmRleCAxYmNhNmQ0Li4yNGM1NWM1IDEwMDY0NAotLS0gYS9uZXQvcmZraWxsL2lucHV0LmMKKysrIGIvbmV0L3Jma2lsbC9pbnB1dC5jCkBAIC0xNSw2ICsxNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KZGlmZiAtLWdpdCBhL25ldC9yZmtpbGwvcmZraWxsLWdwaW8uYyBiL25ldC9yZmtpbGwvcmZraWxsLWdwaW8uYwppbmRleCAxMjg2NzdkLi5jYTM1NWU3IDEwMDY0NAotLS0gYS9uZXQvcmZraWxsL3Jma2lsbC1ncGlvLmMKKysrIGIvbmV0L3Jma2lsbC9yZmtpbGwtZ3Bpby5jCkBAIC0yMjAsMTggKzIyMCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHJma2lsbF9ncGlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyZmtpbGxfZ3Bpb19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcmZraWxsX2dwaW9fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZyZmtpbGxfZ3Bpb19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChyZmtpbGxfZ3Bpb19pbml0KTsKLW1vZHVsZV9leGl0KHJma2lsbF9ncGlvX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyZmtpbGxfZ3Bpb19kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oImdwaW8gcmZraWxsIik7CiBNT0RVTEVfQVVUSE9SKCJOVklESUEiKTsKZGlmZiAtLWdpdCBhL25ldC9yZmtpbGwvcmZraWxsLXJlZ3VsYXRvci5jIGIvbmV0L3Jma2lsbC9yZmtpbGwtcmVndWxhdG9yLmMKaW5kZXggM2NhNzI3Ny4uMmViZmU4ZCAxMDA2NDQKLS0tIGEvbmV0L3Jma2lsbC9yZmtpbGwtcmVndWxhdG9yLmMKKysrIGIvbmV0L3Jma2lsbC9yZmtpbGwtcmVndWxhdG9yLmMKQEAgLTE0NCwxNyArMTQ0LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcmZraWxsX3JlZ3VsYXRvcl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcmZraWxsX3JlZ3VsYXRvcl9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQocmZraWxsX3JlZ3VsYXRvcl9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHJma2lsbF9yZWd1bGF0b3JfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZyZmtpbGxfcmVndWxhdG9yX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChyZmtpbGxfcmVndWxhdG9yX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyZmtpbGxfcmVndWxhdG9yX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkd1aW1pbmcgWmh1byA8Z216aHVvQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9BVVRIT1IoIkFudG9uaW8gT3NwaXRlIDxvc3BpdGVAc3R1ZGVudGkudW5pbmEuaXQ+Iik7CmRpZmYgLS1naXQgYS9uZXQvcm9zZS9yb3NlX3JvdXRlLmMgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKaW5kZXggZDM4OWRlMS4uY2Q5YjdlZSAxMDA2NDQKLS0tIGEvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jCisrKyBiL25ldC9yb3NlL3Jvc2Vfcm91dGUuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxuZXQvcm9zZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcm9zZV9uZWlnaF9ubyA9IDE7CiAKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1vdXRwdXQuYyBiL25ldC9yeHJwYy9hci1vdXRwdXQuYwppbmRleCA1ZjIyZTI2Li4zMzhkNzkzIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvYXItb3V0cHV0LmMKKysrIGIvbmV0L3J4cnBjL2FyLW91dHB1dC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItcmVjdm1zZy5jIGIvbmV0L3J4cnBjL2FyLXJlY3Ztc2cuYwppbmRleCAwYzY1MDEzLi40YjQ4Njg3IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvYXItcmVjdm1zZy5jCisrKyBiL25ldC9yeHJwYy9hci1yZWN2bXNnLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYXBpLmMgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCmluZGV4IGYyZmI2N2UuLjkzZmRmMTMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9zY2hfZ2VuZXJpYy5oPgpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19mbG93LmMgYi9uZXQvc2NoZWQvY2xzX2Zsb3cuYwppbmRleCA5ZTA4N2Q4Li43YjU4MjMwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Zsb3cuYworKysgYi9uZXQvc2NoZWQvY2xzX2Zsb3cuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfbXEuYyBiL25ldC9zY2hlZC9zY2hfbXEuYwppbmRleCBlYzVjYmM4Li4wYTRiMmY5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX21xLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9tcS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfbXFwcmlvLmMgYi9uZXQvc2NoZWQvc2NoX21xcHJpby5jCmluZGV4IGVhMTdjYmUuLmY4ODI1NmMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfbXFwcmlvLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9tcXByaW8uYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L3NjaF9nZW5lcmljLmg+CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9wcm9jLmMgYi9uZXQvc2N0cC9wcm9jLmMKaW5kZXggMDVhNmNlMi4uMWUyZWVlOCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvYy5jCisrKyBiL25ldC9zY3RwL3Byb2MuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPiAvKiBmb3Igc25tcF9mb2xkX2ZpZWxkICovCiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggODM2YWE2My4uMTNiZjVmYyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTc4LDYgKzc4LDcgQEAKICNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPiAvKiBmb3Igc2FfZmFtaWx5X3QgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KICNpbmNsdWRlIDxuZXQvc2N0cC9zbS5oPgpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDI4Nzc2NDcuLjQyNWVmNDIgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTUzOCw2ICs1MzgsOCBAQAogCQkqdHhfZmxhZ3MgfD0gU0tCVFhfSFdfVFNUQU1QOwogCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfVElNRVNUQU1QSU5HX1RYX1NPRlRXQVJFKSkKIAkJKnR4X2ZsYWdzIHw9IFNLQlRYX1NXX1RTVEFNUDsKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1dJRklfU1RBVFVTKSkKKwkJKnR4X2ZsYWdzIHw9IFNLQlRYX1dJRklfU1RBVFVTOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChzb2NrX3R4X3RpbWVzdGFtcCk7CkBAIC02NzQsNiArNjc2LDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX3NvY2tfcmVjdl90aW1lc3RhbXApOwogCit2b2lkIF9fc29ja19yZWN2X3dpZmlfc3RhdHVzKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKnNrLAorCXN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGFjazsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1dJRklfU1RBVFVTKSkKKwkJcmV0dXJuOworCWlmICghc2tiLT53aWZpX2Fja2VkX3ZhbGlkKQorCQlyZXR1cm47CisKKwlhY2sgPSBza2ItPndpZmlfYWNrZWQ7CisKKwlwdXRfY21zZyhtc2csIFNPTF9TT0NLRVQsIFNDTV9XSUZJX1NUQVRVUywgc2l6ZW9mKGFjayksICZhY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19zb2NrX3JlY3Zfd2lmaV9zdGF0dXMpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgc29ja19yZWN2X2Ryb3BzKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKnNrLAogCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2FkZHIuYyBiL25ldC9zdW5ycGMvYWRkci5jCmluZGV4IDQ1NDg3NTcuLjY3YTY1NWUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYWRkci5jCisrKyBiL25ldC9zdW5ycGMvYWRkci5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfdW5peC5jIGIvbmV0L3N1bnJwYy9hdXRoX3VuaXguYwppbmRleCA0Y2I3MGRjLi5lNTA1MDJkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfdW5peC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF91bml4LmMKQEAgLTEyOSw2ICsxMjksOSBAQAogCWZvciAoaSA9IDA7IGkgPCBncm91cHMgOyBpKyspCiAJCWlmIChjcmVkLT51Y19naWRzW2ldICE9IEdST1VQX0FUKGFjcmVkLT5ncm91cF9pbmZvLCBpKSkKIAkJCXJldHVybiAwOworCWlmIChncm91cHMgPCBORlNfTkdST1VQUyAmJgorCSAgICBjcmVkLT51Y19naWRzW2dyb3Vwc10gIT0gTk9HUk9VUCkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYmFja2NoYW5uZWxfcnFzdC5jIGIvbmV0L3N1bnJwYy9iYWNrY2hhbm5lbF9ycXN0LmMKaW5kZXggOTFlYWEyNi4uM2FkNDM1YSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9iYWNrY2hhbm5lbF9ycXN0LmMKKysrIGIvbmV0L3N1bnJwYy9iYWNrY2hhbm5lbF9ycXN0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2lmZGVmIFJQQ19ERUJVRwogI2RlZmluZSBSUENEQkdfRkFDSUxJVFkJUlBDREJHX1RSQU5TCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCBmNTg4Yjg1Li44NzYxYmY4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCisrKyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTExNCw2ICsxMTQsOSBAQAogc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCXJwY2JfbG9jYWxfY2xudDsKIHN0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKglycGNiX2xvY2FsX2NsbnQ0OwogCitERUZJTkVfU1BJTkxPQ0socnBjYl9jbG50X2xvY2spOwordW5zaWduZWQgaW50CQkJcnBjYl91c2VyczsKKwogc3RydWN0IHJwY2JpbmRfYXJncyB7CiAJc3RydWN0IHJwY194cHJ0ICoJcl94cHJ0OwogCkBAIC0xNjEsNiArMTY0LDU2IEBACiAJa2ZyZWUobWFwKTsKIH0KIAorc3RhdGljIGludCBycGNiX2dldF9sb2NhbCh2b2lkKQoreworCWludCBjbnQ7CisKKwlzcGluX2xvY2soJnJwY2JfY2xudF9sb2NrKTsKKwlpZiAocnBjYl91c2VycykKKwkJcnBjYl91c2VycysrOworCWNudCA9IHJwY2JfdXNlcnM7CisJc3Bpbl91bmxvY2soJnJwY2JfY2xudF9sb2NrKTsKKworCXJldHVybiBjbnQ7Cit9CisKK3ZvaWQgcnBjYl9wdXRfbG9jYWwodm9pZCkKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSBycGNiX2xvY2FsX2NsbnQ7CisJc3RydWN0IHJwY19jbG50ICpjbG50NCA9IHJwY2JfbG9jYWxfY2xudDQ7CisJaW50IHNodXRkb3duOworCisJc3Bpbl9sb2NrKCZycGNiX2NsbnRfbG9jayk7CisJaWYgKC0tcnBjYl91c2VycyA9PSAwKSB7CisJCXJwY2JfbG9jYWxfY2xudCA9IE5VTEw7CisJCXJwY2JfbG9jYWxfY2xudDQgPSBOVUxMOworCX0KKwlzaHV0ZG93biA9ICFycGNiX3VzZXJzOworCXNwaW5fdW5sb2NrKCZycGNiX2NsbnRfbG9jayk7CisKKwlpZiAoc2h1dGRvd24pIHsKKwkJLyoKKwkJICogY2xlYW51cF9ycGNiX2NsbnQgLSByZW1vdmUgeHBydHNvY2sncyBzeXNjdGxzLCB1bnJlZ2lzdGVyCisJCSAqLworCQlpZiAoY2xudDQpCisJCQlycGNfc2h1dGRvd25fY2xpZW50KGNsbnQ0KTsKKwkJaWYgKGNsbnQpCisJCQlycGNfc2h1dGRvd25fY2xpZW50KGNsbnQpOworCX0KK30KKworc3RhdGljIHZvaWQgcnBjYl9zZXRfbG9jYWwoc3RydWN0IHJwY19jbG50ICpjbG50LCBzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQ0KQoreworCS8qIFByb3RlY3RlZCBieSBycGNiX2NyZWF0ZV9sb2NhbF9tdXRleCAqLworCXJwY2JfbG9jYWxfY2xudCA9IGNsbnQ7CisJcnBjYl9sb2NhbF9jbG50NCA9IGNsbnQ0OworCXNtcF93bWIoKTsgCisJcnBjYl91c2VycyA9IDE7CisJZHByaW50aygiUlBDOiAgICAgICBjcmVhdGVkIG5ldyBycGNiIGxvY2FsIGNsaWVudHMgKHJwY2JfbG9jYWxfY2xudDogIgorCQkJIiVwLCBycGNiX2xvY2FsX2NsbnQ0OiAlcClcbiIsIHJwY2JfbG9jYWxfY2xudCwKKwkJCXJwY2JfbG9jYWxfY2xudDQpOworfQorCiAvKgogICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCiAgKiBpcyByZXR1cm5lZC4KQEAgLTIwNSw5ICsyNTgsNyBAQAogCQljbG50NCA9IE5VTEw7CiAJfQogCi0JLyogUHJvdGVjdGVkIGJ5IHJwY2JfY3JlYXRlX2xvY2FsX211dGV4ICovCi0JcnBjYl9sb2NhbF9jbG50ID0gY2xudDsKLQlycGNiX2xvY2FsX2NsbnQ0ID0gY2xudDQ7CisJcnBjYl9zZXRfbG9jYWwoY2xudCwgY2xudDQpOwogCiBvdXQ6CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTI1OSw5ICszMTAsNyBAQAogCQljbG50NCA9IE5VTEw7CiAJfQogCi0JLyogUHJvdGVjdGVkIGJ5IHJwY2JfY3JlYXRlX2xvY2FsX211dGV4ICovCi0JcnBjYl9sb2NhbF9jbG50ID0gY2xudDsKLQlycGNiX2xvY2FsX2NsbnQ0ID0gY2xudDQ7CisJcnBjYl9zZXRfbG9jYWwoY2xudCwgY2xudDQpOwogCiBvdXQ6CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTI3MSwxNiArMzIwLDE2IEBACiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKICAqIGlzIHJldHVybmVkLgogICovCi1zdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsKHZvaWQpCitpbnQgcnBjYl9jcmVhdGVfbG9jYWwodm9pZCkKIHsKIAlzdGF0aWMgREVGSU5FX01VVEVYKHJwY2JfY3JlYXRlX2xvY2FsX211dGV4KTsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWlmIChycGNiX2xvY2FsX2NsbnQpCisJaWYgKHJwY2JfZ2V0X2xvY2FsKCkpCiAJCXJldHVybiByZXN1bHQ7CiAKIAltdXRleF9sb2NrKCZycGNiX2NyZWF0ZV9sb2NhbF9tdXRleCk7Ci0JaWYgKHJwY2JfbG9jYWxfY2xudCkKKwlpZiAocnBjYl9nZXRfbG9jYWwoKSkKIAkJZ290byBvdXQ7CiAKIAlpZiAocnBjYl9jcmVhdGVfbG9jYWxfdW5peCgpICE9IDApCkBAIC0zODIsMTEgKzQzMSw2IEBACiAJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKIAkJLnJwY19hcmdwCT0gJm1hcCwKIAl9OwotCWludCBlcnJvcjsKLQotCWVycm9yID0gcnBjYl9jcmVhdGVfbG9jYWwoKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKIAogCWRwcmludGsoIlJQQzogICAgICAgJXNyZWdpc3RlcmluZyAoJXUsICV1LCAlZCwgJXUpIHdpdGggbG9jYWwgIgogCQkJInJwY2JpbmRcbiIsIChwb3J0ID8gIiIgOiAidW4iKSwKQEAgLTUyMiwxMSArNTY2LDcgQEAKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX2FyZ3AJPSAmbWFwLAogCX07Ci0JaW50IGVycm9yOwogCi0JZXJyb3IgPSBycGNiX2NyZWF0ZV9sb2NhbCgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwogCWlmIChycGNiX2xvY2FsX2NsbnQ0ID09IE5VTEwpCiAJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCkBAIC0xMDYwLDE1ICsxMTAwLDMgQEAKIAkudmVyc2lvbgk9IHJwY2JfdmVyc2lvbiwKIAkuc3RhdHMJCT0gJnJwY2Jfc3RhdHMsCiB9OwotCi0vKioKLSAqIGNsZWFudXBfcnBjYl9jbG50IC0gcmVtb3ZlIHhwcnRzb2NrJ3Mgc3lzY3RscywgdW5yZWdpc3RlcgotICoKLSAqLwotdm9pZCBjbGVhbnVwX3JwY2JfY2xudCh2b2lkKQotewotCWlmIChycGNiX2xvY2FsX2NsbnQ0KQotCQlycGNfc2h1dGRvd25fY2xpZW50KHJwY2JfbG9jYWxfY2xudDQpOwotCWlmIChycGNiX2xvY2FsX2NsbnQpCi0JCXJwY19zaHV0ZG93bl9jbGllbnQocnBjYl9sb2NhbF9jbG50KTsKLX0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc29ja2xpYi5jIGIvbmV0L3N1bnJwYy9zb2NrbGliLmMKaW5kZXggMTBiNDMxOS4uMTQ1ZTY3ODQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc29ja2xpYi5jCisrKyBiL25ldC9zdW5ycGMvc29ja2xpYi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYyBiL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYwppbmRleCA5ZDA4MDkxLi44ZWM5Nzc4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMKKysrIGIvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCkBAIC02MSw4ICs2MSw2IEBACiAKIGV4dGVybiBzdHJ1Y3QgY2FjaGVfZGV0YWlsIHVuaXhfZ2lkX2NhY2hlOwogCi1leHRlcm4gdm9pZCBjbGVhbnVwX3JwY2JfY2xudCh2b2lkKTsKLQogc3RhdGljIGludCBfX2luaXQKIGluaXRfc3VucnBjKHZvaWQpCiB7CkBAIC0xMDIsNyArMTAwLDYgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdAogY2xlYW51cF9zdW5ycGModm9pZCkKIHsKLQljbGVhbnVwX3JwY2JfY2xudCgpOwogCXJwY2F1dGhfcmVtb3ZlX21vZHVsZSgpOwogCWNsZWFudXBfc29ja2V0X3hwcnQoKTsKIAlzdmNfY2xlYW51cF94cHJ0X3NvY2soKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjLmMgYi9uZXQvc3VucnBjL3N2Yy5jCmluZGV4IDMwZDcwYWIuLjZlMDM4ODggMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjLmMKKysrIGIvbmV0L3N1bnJwYy9zdmMuYwpAQCAtMzY2LDYgKzM2Niw0MiBAQAogCXJldHVybiAmc2Vydi0+c3ZfcG9vbHNbcGlkeCAlIHNlcnYtPnN2X25ycG9vbHNdOwogfQogCitzdGF0aWMgaW50IHN2Y19ycGNiX3NldHVwKHN0cnVjdCBzdmNfc2VydiAqc2VydikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcnBjYl9jcmVhdGVfbG9jYWwoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogUmVtb3ZlIGFueSBzdGFsZSBwb3J0bWFwIHJlZ2lzdHJhdGlvbnMgKi8KKwlzdmNfdW5yZWdpc3RlcihzZXJ2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzdmNfcnBjYl9jbGVhbnVwKHN0cnVjdCBzdmNfc2VydiAqc2VydikKK3sKKwlzdmNfdW5yZWdpc3RlcihzZXJ2KTsKKwlycGNiX3B1dF9sb2NhbCgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3JwY2JfY2xlYW51cCk7CisKK3N0YXRpYyBpbnQgc3ZjX3VzZXNfcnBjYmluZChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpCit7CisJc3RydWN0IHN2Y19wcm9ncmFtCSpwcm9ncDsKKwl1bnNpZ25lZCBpbnQJCWk7CisKKwlmb3IgKHByb2dwID0gc2Vydi0+c3ZfcHJvZ3JhbTsgcHJvZ3A7IHByb2dwID0gcHJvZ3AtPnBnX25leHQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHByb2dwLT5wZ19udmVyczsgaSsrKSB7CisJCQlpZiAocHJvZ3AtPnBnX3ZlcnNbaV0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwcm9ncC0+cGdfdmVyc1tpXS0+dnNfaGlkZGVuID09IDApCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIENyZWF0ZSBhbiBSUEMgc2VydmljZQpAQCAtNDMxLDggKzQ2NywxNSBAQAogCQlzcGluX2xvY2tfaW5pdCgmcG9vbC0+c3BfbG9jayk7CiAJfQogCi0JLyogUmVtb3ZlIGFueSBzdGFsZSBwb3J0bWFwIHJlZ2lzdHJhdGlvbnMgKi8KLQlzdmNfdW5yZWdpc3RlcihzZXJ2KTsKKwlpZiAoc3ZjX3VzZXNfcnBjYmluZChzZXJ2KSkgeworCSAgICAgICAJaWYgKHN2Y19ycGNiX3NldHVwKHNlcnYpIDwgMCkgeworCQkJa2ZyZWUoc2Vydi0+c3ZfcG9vbHMpOworCQkJa2ZyZWUoc2Vydik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoIXNlcnYtPnN2X3NodXRkb3duKQorCQkJc2Vydi0+c3Zfc2h1dGRvd24gPSBzdmNfcnBjYl9jbGVhbnVwOworCX0KIAogCXJldHVybiBzZXJ2OwogfQpAQCAtNTAwLDcgKzU0Myw2IEBACiAJaWYgKHN2Y19zZXJ2X2lzX3Bvb2xlZChzZXJ2KSkKIAkJc3ZjX3Bvb2xfbWFwX3B1dCgpOwogCi0Jc3ZjX3VucmVnaXN0ZXIoc2Vydik7CiAJa2ZyZWUoc2Vydi0+c3ZfcG9vbHMpOwogCWtmcmVlKHNlcnYpOwogfQpAQCAtOTcxLDkgKzEwMTMsOCBAQAogLyoKICAqIFByaW50ayB0aGUgZ2l2ZW4gZXJyb3Igd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUgY2xpZW50IHRoYXQgY2F1c2VkIGl0LgogICovCi1zdGF0aWMgaW50Ci1fX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKLXN2Y19wcmludGsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgY29uc3QgY2hhciAqZm10LCAuLi4pCitzdGF0aWMgX19wcmludGYoMiwgMykKK2ludCBzdmNfcHJpbnRrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKIAlpbnQgCXI7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y194cHJ0LmMgYi9uZXQvc3VucnBjL3N2Y194cHJ0LmMKaW5kZXggZDg2YmI2Ny4uNDQ3Y2QwZSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNfeHBydC5jCisrKyBiL25ldC9zdW5ycGMvc3ZjX3hwcnQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNfeHBydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBSUENEQkdfRkFDSUxJVFkJUlBDREJHX1NWQ1hQUlQKIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwppbmRleCBkZmQ2ODZlLi43MWJlZDFjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y3NvY2suYworKysgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3RyYW5zcG9ydC5jIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV90cmFuc3BvcnQuYwppbmRleCBhMzg1NDMwLi5iYTEyOTZkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3RyYW5zcG9ydC5jCisrKyBiL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfdHJhbnNwb3J0LmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hX2NtLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y19yZG1hLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19TVkNYUFJUCiAKZGlmZiAtLWdpdCBhL25ldC9zeXNjdGxfbmV0LmMgYi9uZXQvc3lzY3RsX25ldC5jCmluZGV4IGNhODQyMTIuLmU3NTgxMzkgMTAwNjQ0Ci0tLSBhL25ldC9zeXNjdGxfbmV0LmMKKysrIGIvbmV0L3N5c2N0bF9uZXQuYwpAQCAtMTIsNiArMTIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY29yZS5jIGIvbmV0L3RpcGMvY29yZS5jCmluZGV4IDk0M2I2YWYuLmMyMTMzMWQgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2NvcmUuYworKysgYi9uZXQvdGlwYy9jb3JlLmMKQEAgLTM0LDYgKzM0LDggQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJyZWYuaCIKICNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zb2NrZXQuYyBiL25ldC90aXBjL3NvY2tldC5jCmluZGV4IDk0NDBhM2QuLjQyYjgzMjQgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3NvY2tldC5jCisrKyBiL25ldC90aXBjL3NvY2tldC5jCkBAIC0zNCw2ICszNCw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgImNvcmUuaCIKZGlmZiAtLWdpdCBhL25ldC93YW5yb3V0ZXIvd2FucHJvYy5jIGIvbmV0L3dhbnJvdXRlci93YW5wcm9jLmMKaW5kZXggZjM0NjM5NS4uYzQzNjEyZSAxMDA2NDQKLS0tIGEvbmV0L3dhbnJvdXRlci93YW5wcm9jLmMKKysrIGIvbmV0L3dhbnJvdXRlci93YW5wcm9jLmMKQEAgLTgxLDcgKzgxLDYgQEAKICAqCUl0ZXJhdG9yCiAgKi8KIHN0YXRpYyB2b2lkICpyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCi0JX19hY3F1aXJlcyhrZXJuZWxfbG9jaykKIHsKIAlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2OwogCWxvZmZfdCBsID0gKnBvczsKQEAgLTEwMyw3ICsxMDIsNiBAQAogfQogCiBzdGF0aWMgdm9pZCByX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQotCV9fcmVsZWFzZXMoa2VybmVsX2xvY2spCiB7CiAJbXV0ZXhfdW5sb2NrKCZjb25maWdfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L29wLW1zZy5jIGIvbmV0L3dpbWF4L29wLW1zZy5jCmluZGV4IGQ1YjdjMzcuLjA2OTRkNjIgMTAwNjQ0Ci0tLSBhL25ldC93aW1heC9vcC1tc2cuYworKysgYi9uZXQvd2ltYXgvb3AtbXNnLmMKQEAgLTc3LDYgKzc3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93aW1heC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAid2ltYXgtaW50ZXJuYWwuaCIKIAogCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvb3AtcmVzZXQuYyBiL25ldC93aW1heC9vcC1yZXNldC5jCmluZGV4IDY4YmVkZjMuLjdjZWZmZTMgMTAwNjQ0Ci0tLSBhL25ldC93aW1heC9vcC1yZXNldC5jCisrKyBiL25ldC93aW1heC9vcC1yZXNldC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ3aW1heC1pbnRlcm5hbC5oIgogCiAjZGVmaW5lIERfU1VCTU9EVUxFIG9wX3Jlc2V0CmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvb3AtcmZraWxsLmMgYi9uZXQvd2ltYXgvb3AtcmZraWxsLmMKaW5kZXggMjYwOWU0NC4uN2FiNjBiYSAxMDA2NDQKLS0tIGEvbmV0L3dpbWF4L29wLXJma2lsbC5jCisrKyBiL25ldC93aW1heC9vcC1yZmtpbGwuYwpAQCAtNjUsNiArNjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ3aW1heC1pbnRlcm5hbC5oIgogCiAjZGVmaW5lIERfU1VCTU9EVUxFIG9wX3Jma2lsbApkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L3N0YWNrLmMgYi9uZXQvd2ltYXgvc3RhY2suYwppbmRleCBlZTk5ZTdkLi4zYzY1ZWFlIDEwMDY0NAotLS0gYS9uZXQvd2ltYXgvc3RhY2suYworKysgYi9uZXQvd2ltYXgvc3RhY2suYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIndpbWF4LWludGVybmFsLmgiCiAKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuYyBiL25ldC93aXJlbGVzcy9jb3JlLmMKaW5kZXggMjIwZjNiZC4uY2NkZmVkOCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NvcmUuYworKysgYi9uZXQvd2lyZWxlc3MvY29yZS5jCkBAIC00OTIsNiArNDkyLDEwIEBACiAJCSAgICAhKHdpcGh5LT53b3dsYW4uZmxhZ3MgJiBXSVBIWV9XT1dMQU5fU1VQUE9SVFNfR1RLX1JFS0VZKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKFdBUk5fT04od2lwaHktPmFwX3NtZV9jYXBhICYmCisJCSAgICAhKHdpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfSEFWRV9BUF9TTUUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoV0FSTl9PTih3aXBoeS0+YWRkcmVzc2VzICYmICF3aXBoeS0+bl9hZGRyZXNzZXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuaCBiL25ldC93aXJlbGVzcy9jb3JlLmgKaW5kZXggYjllYzMwNi4uZmIwOGMyOCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NvcmUuaAorKysgYi9uZXQvd2lyZWxlc3MvY29yZS5oCkBAIC01NCw2ICs1NCw4IEBACiAJaW50IG9wZW5jb3VudDsgLyogYWxzbyBwcm90ZWN0ZWQgYnkgZGV2bGlzdF9tdHggKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBkZXZfd2FpdDsKIAorCXUzMiBhcF9iZWFjb25zX25scGlkOworCiAJLyogQlNTZXMvc2Nhbm5pbmcgKi8KIAlzcGlubG9ja190IGJzc19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgYnNzX2xpc3Q7CkBAIC0zMzksMTMgKzM0MSwxNyBAQAogCQkJICBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpwcmV2X2Jzc2lkLAogCQkJICBjb25zdCB1OCAqc3NpZCwgaW50IHNzaWRfbGVuLAogCQkJICBjb25zdCB1OCAqaWUsIGludCBpZV9sZW4sIGJvb2wgdXNlX21mcCwKLQkJCSAgc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQpOworCQkJICBzdHJ1Y3QgY2ZnODAyMTFfY3J5cHRvX3NldHRpbmdzICpjcnlwdCwKKwkJCSAgdTMyIGFzc29jX2ZsYWdzLCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYSwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGFfbWFzayk7CiBpbnQgY2ZnODAyMTFfbWxtZV9hc3NvYyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQljb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpwcmV2X2Jzc2lkLAogCQkJY29uc3QgdTggKnNzaWQsIGludCBzc2lkX2xlbiwKIAkJCWNvbnN0IHU4ICppZSwgaW50IGllX2xlbiwgYm9vbCB1c2VfbWZwLAotCQkJc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQpOworCQkJc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQsCisJCQl1MzIgYXNzb2NfZmxhZ3MsIHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhLAorCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGFfbWFzayk7CiBpbnQgX19jZmc4MDIxMV9tbG1lX2RlYXV0aChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqYnNzaWQsCiAJCQkgICBjb25zdCB1OCAqaWUsIGludCBpZV9sZW4sIHUxNiByZWFzb24sCkBAIC0zNzYsNyArMzgyLDkgQEAKIAkJCSAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCiAJCQkgIGJvb2wgY2hhbm5lbF90eXBlX3ZhbGlkLCB1bnNpZ25lZCBpbnQgd2FpdCwKIAkJCSAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBub19jY2ssCi0JCQkgIHU2NCAqY29va2llKTsKKwkJCSAgYm9vbCBkb250X3dhaXRfZm9yX2FjaywgdTY0ICpjb29raWUpOwordm9pZCBjZmc4MDIxMV9vcGVyX2FuZF9odF9jYXBhKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21hc2spOwogCiAvKiBTTUUgKi8KIGludCBfX2NmZzgwMjExX2Nvbm5lY3Qoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2lic3MuYyBiL25ldC93aXJlbGVzcy9pYnNzLmMKaW5kZXggZjMzZmJiNy4uMzBmMjBmZSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2lic3MuYworKysgYi9uZXQvd2lyZWxlc3MvaWJzcy5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogI2luY2x1ZGUgIndleHQtY29tcGF0LmgiCiAjaW5jbHVkZSAibmw4MDIxMS5oIgpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL21lc2guYyBiL25ldC93aXJlbGVzcy9tZXNoLmMKaW5kZXggNDQyM2U2NC4uOGM1NTBkZiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL21lc2guYworKysgYi9uZXQvd2lyZWxlc3MvbWVzaC5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogI2luY2x1ZGUgIm5sODAyMTEuaCIKICNpbmNsdWRlICJjb3JlLmgiCkBAIC0xOSw2ICsyMCw3IEBACiAgKiBpbnRlcmZhY2UKICAqLwogI2RlZmluZSBNRVNIX1BSRVFfTUlOX0lOVAkxMAorI2RlZmluZSBNRVNIX1BFUlJfTUlOX0lOVAkxMDAKICNkZWZpbmUgTUVTSF9ESUFNX1RSQVZFUlNBTF9USU1FIDUwCiAKIC8qCkBAIC00Niw2ICs0OCw3IEBACiAJLmRvdDExTWVzaE1heFBlZXJMaW5rcyA9IE1FU0hfTUFYX0VTVEFCX1BMSU5LUywKIAkuZG90MTFNZXNoSFdNUGFjdGl2ZVBhdGhUaW1lb3V0ID0gTUVTSF9QQVRIX1RJTUVPVVQsCiAJLmRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWwgPSBNRVNIX1BSRVFfTUlOX0lOVCwKKwkuZG90MTFNZXNoSFdNUHBlcnJNaW5JbnRlcnZhbCA9IE1FU0hfUEVSUl9NSU5fSU5ULAogCS5kb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lID0gTUVTSF9ESUFNX1RSQVZFUlNBTF9USU1FLAogCS5kb3QxMU1lc2hIV01QbWF4UFJFUXJldHJpZXMgPSBNRVNIX01BWF9QUkVRX1JFVFJJRVMsCiAJLnBhdGhfcmVmcmVzaF90aW1lID0gTUVTSF9QQVRIX1JFRlJFU0hfVElNRSwKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9tbG1lLmMgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCmluZGV4IDIxZmM5NzAuLjQzOGRmYzEgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9tbG1lLmMKKysrIGIvbmV0L3dpcmVsZXNzL21sbWUuYwpAQCAtNTAxLDEzICs1MDEsMzIgQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKiAgRG8gYSBsb2dpY2FsIGh0X2NhcGEgJj0gaHRfY2FwYV9tYXNrLiAgKi8KK3ZvaWQgY2ZnODAyMTFfb3Blcl9hbmRfaHRfY2FwYShzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYV9tYXNrKQoreworCWludCBpOworCXU4ICpwMSwgKnAyOworCWlmICghaHRfY2FwYV9tYXNrKSB7CisJCW1lbXNldChodF9jYXBhLCAwLCBzaXplb2YoKmh0X2NhcGEpKTsKKwkJcmV0dXJuOworCX0KKworCXAxID0gKHU4KikoaHRfY2FwYSk7CisJcDIgPSAodTgqKShodF9jYXBhX21hc2spOworCWZvciAoaSA9IDA7IGk8c2l6ZW9mKCpodF9jYXBhKTsgaSsrKQorCQlwMVtpXSAmPSBwMltpXTsKK30KKwogaW50IF9fY2ZnODAyMTFfbWxtZV9hc3NvYyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKIAkJCSAgY29uc3QgdTggKmJzc2lkLCBjb25zdCB1OCAqcHJldl9ic3NpZCwKIAkJCSAgY29uc3QgdTggKnNzaWQsIGludCBzc2lkX2xlbiwKIAkJCSAgY29uc3QgdTggKmllLCBpbnQgaWVfbGVuLCBib29sIHVzZV9tZnAsCi0JCQkgIHN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgKmNyeXB0KQorCQkJICBzdHJ1Y3QgY2ZnODAyMTFfY3J5cHRvX3NldHRpbmdzICpjcnlwdCwKKwkJCSAgdTMyIGFzc29jX2ZsYWdzLCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYSwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGFfbWFzaykKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwogCXN0cnVjdCBjZmc4MDIxMV9hc3NvY19yZXF1ZXN0IHJlcTsKQEAgLTUzNyw2ICs1NTYsMTUgQEAKIAltZW1jcHkoJnJlcS5jcnlwdG8sIGNyeXB0LCBzaXplb2YocmVxLmNyeXB0bykpOwogCXJlcS51c2VfbWZwID0gdXNlX21mcDsKIAlyZXEucHJldl9ic3NpZCA9IHByZXZfYnNzaWQ7CisJcmVxLmZsYWdzID0gYXNzb2NfZmxhZ3M7CisJaWYgKGh0X2NhcGEpCisJCW1lbWNweSgmcmVxLmh0X2NhcGEsIGh0X2NhcGEsIHNpemVvZihyZXEuaHRfY2FwYSkpOworCWlmIChodF9jYXBhX21hc2spCisJCW1lbWNweSgmcmVxLmh0X2NhcGFfbWFzaywgaHRfY2FwYV9tYXNrLAorCQkgICAgICAgc2l6ZW9mKHJlcS5odF9jYXBhX21hc2spKTsKKwljZmc4MDIxMV9vcGVyX2FuZF9odF9jYXBhKCZyZXEuaHRfY2FwYV9tYXNrLAorCQkJCSAgcmRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzayk7CisKIAlyZXEuYnNzID0gY2ZnODAyMTFfZ2V0X2JzcygmcmRldi0+d2lwaHksIGNoYW4sIGJzc2lkLCBzc2lkLCBzc2lkX2xlbiwKIAkJCQkgICBXTEFOX0NBUEFCSUxJVFlfRVNTLCBXTEFOX0NBUEFCSUxJVFlfRVNTKTsKIAlpZiAoIXJlcS5ic3MpIHsKQEAgLTU3NCwxNCArNjAyLDE3IEBACiAJCQljb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpwcmV2X2Jzc2lkLAogCQkJY29uc3QgdTggKnNzaWQsIGludCBzc2lkX2xlbiwKIAkJCWNvbnN0IHU4ICppZSwgaW50IGllX2xlbiwgYm9vbCB1c2VfbWZwLAotCQkJc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQpCisJCQlzdHJ1Y3QgY2ZnODAyMTFfY3J5cHRvX3NldHRpbmdzICpjcnlwdCwKKwkJCXUzMiBhc3NvY19mbGFncywgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGEsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYV9tYXNrKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CiAJaW50IGVycjsKIAogCXdkZXZfbG9jayh3ZGV2KTsKIAllcnIgPSBfX2NmZzgwMjExX21sbWVfYXNzb2MocmRldiwgZGV2LCBjaGFuLCBic3NpZCwgcHJldl9ic3NpZCwKLQkJCQkgICAgc3NpZCwgc3NpZF9sZW4sIGllLCBpZV9sZW4sIHVzZV9tZnAsIGNyeXB0KTsKKwkJCQkgICAgc3NpZCwgc3NpZF9sZW4sIGllLCBpZV9sZW4sIHVzZV9tZnAsIGNyeXB0LAorCQkJCSAgICBhc3NvY19mbGFncywgaHRfY2FwYSwgaHRfY2FwYV9tYXNrKTsKIAl3ZGV2X3VubG9jayh3ZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC04NzksNiArOTEwLDkgQEAKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmd2Rldi0+bWdtdF9yZWdpc3RyYXRpb25zX2xvY2spOworCisJaWYgKG5scGlkID09IHdkZXYtPmFwX3VuZXhwZWN0ZWRfbmxwaWQpCisJCXdkZXYtPmFwX3VuZXhwZWN0ZWRfbmxwaWQgPSAwOwogfQogCiB2b2lkIGNmZzgwMjExX21sbWVfcHVyZ2VfcmVnaXN0cmF0aW9ucyhzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQpAQCAtOTAxLDcgKzkzNSw3IEBACiAJCQkgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAogCQkJICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwgdW5zaWduZWQgaW50IHdhaXQsCiAJCQkgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sIGJvb2wgbm9fY2NrLAotCQkJICB1NjQgKmNvb2tpZSkKKwkJCSAgYm9vbCBkb250X3dhaXRfZm9yX2FjaywgdTY0ICpjb29raWUpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7CkBAIC05OTIsNyArMTAyNiw4IEBACiAJLyogVHJhbnNtaXQgdGhlIEFjdGlvbiBmcmFtZSBhcyByZXF1ZXN0ZWQgYnkgdXNlciBzcGFjZSAqLwogCXJldHVybiByZGV2LT5vcHMtPm1nbXRfdHgoJnJkZXYtPndpcGh5LCBkZXYsIGNoYW4sIG9mZmNoYW4sCiAJCQkJICBjaGFubmVsX3R5cGUsIGNoYW5uZWxfdHlwZV92YWxpZCwKLQkJCQkgIHdhaXQsIGJ1ZiwgbGVuLCBub19jY2ssIGNvb2tpZSk7CisJCQkJICB3YWl0LCBidWYsIGxlbiwgbm9fY2NrLCBkb250X3dhaXRfZm9yX2FjaywKKwkJCQkgIGNvb2tpZSk7CiB9CiAKIGJvb2wgY2ZnODAyMTFfcnhfbWdtdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZnJlcSwgY29uc3QgdTggKmJ1ZiwKQEAgLTExMDcsMyArMTE0MiwzMCBAQAogCW5sODAyMTFfcG1rc2FfY2FuZGlkYXRlX25vdGlmeShyZGV2LCBkZXYsIGluZGV4LCBic3NpZCwgcHJlYXV0aCwgZ2ZwKTsKIH0KIEVYUE9SVF9TWU1CT0woY2ZnODAyMTFfcG1rc2FfY2FuZGlkYXRlX25vdGlmeSk7CisKK2Jvb2wgY2ZnODAyMTFfcnhfc3B1cmlvdXNfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQljb25zdCB1OCAqYWRkciwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisKKwlpZiAoV0FSTl9PTih3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkJICAgIHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfR08pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gbmw4MDIxMV91bmV4cGVjdGVkX2ZyYW1lKGRldiwgYWRkciwgZ2ZwKTsKK30KK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfcnhfc3B1cmlvdXNfZnJhbWUpOworCitib29sIGNmZzgwMjExX3J4X3VuZXhwZWN0ZWRfNGFkZHJfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJY29uc3QgdTggKmFkZHIsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOworCisJaWYgKFdBUk5fT04od2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCisJCSAgICB3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0dPICYmCisJCSAgICB3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBubDgwMjExX3VuZXhwZWN0ZWRfNGFkZHJfZnJhbWUoZGV2LCBhZGRyLCBnZnApOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9yeF91bmV4cGVjdGVkXzRhZGRyX2ZyYW1lKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCmluZGV4IGZmYWZkYTUuLjhhOWI0ZDggMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMKKysrIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwpAQCAtOTgsNyArOTgsNyBAQAogCVtOTDgwMjExX0FUVFJfS0VZX0lEWF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCiAJW05MODAyMTFfQVRUUl9LRVlfQ0lQSEVSXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW05MODAyMTFfQVRUUl9LRVlfREVGQVVMVF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKLQlbTkw4MDIxMV9BVFRSX0tFWV9TRVFdID0geyAudHlwZSA9IE5MQV9CSU5BUlksIC5sZW4gPSA4IH0sCisJW05MODAyMTFfQVRUUl9LRVlfU0VRXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCAubGVuID0gMTYgfSwKIAlbTkw4MDIxMV9BVFRSX0tFWV9UWVBFXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAKIAlbTkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LApAQCAtMTk2LDYgKzE5NiwxNSBAQAogCVtOTDgwMjExX0FUVFJfVERMU19PUEVSQVRJT05dID0geyAudHlwZSA9IE5MQV9VOCB9LAogCVtOTDgwMjExX0FUVFJfVERMU19TVVBQT1JUXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogCVtOTDgwMjExX0FUVFJfVERMU19FWFRFUk5BTF9TRVRVUF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbTkw4MDIxMV9BVFRSX0RPTlRfV0FJVF9GT1JfQUNLXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgICAgICAubGVuID0gSUVFRTgwMjExX01BWF9EQVRBX0xFTiB9LAorCVtOTDgwMjExX0FUVFJfREZTX1JFR0lPTl0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfQVRUUl9ESVNBQkxFX0hUXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSA9IHsKKwkJLmxlbiA9IE5MODAyMTFfSFRfQ0FQQUJJTElUWV9MRU4KKwl9LAorCVtOTDgwMjExX0FUVFJfTk9BQ0tfTUFQXSA9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiB9OwogCiAvKiBwb2xpY3kgZm9yIHRoZSBrZXkgYXR0cmlidXRlcyAqLwpAQCAtMjAzLDcgKzIxMiw3IEBACiAJW05MODAyMTFfS0VZX0RBVEFdID0geyAudHlwZSA9IE5MQV9CSU5BUlksIC5sZW4gPSBXTEFOX01BWF9LRVlfTEVOIH0sCiAJW05MODAyMTFfS0VZX0lEWF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCiAJW05MODAyMTFfS0VZX0NJUEhFUl0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAotCVtOTDgwMjExX0tFWV9TRVFdID0geyAudHlwZSA9IE5MQV9CSU5BUlksIC5sZW4gPSA4IH0sCisJW05MODAyMTFfS0VZX1NFUV0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwgLmxlbiA9IDE2IH0sCiAJW05MODAyMTFfS0VZX0RFRkFVTFRdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCiAJW05MODAyMTFfS0VZX0RFRkFVTFRfTUdNVF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIAlbTkw4MDIxMV9LRVlfVFlQRV0gPSB7IC50eXBlID0gTkxBX1UzMiB9LApAQCAtNzU4LDYgKzc2NywxMCBAQAogCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfQVZBSUxfUlgsCiAJCSAgICBkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc19yeCk7CiAKKwlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfQVBfUFJPQkVfUkVTUF9PRkZMT0FEKQorCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9QUk9CRV9SRVNQX09GRkxPQUQsCisJCQkgICAgZGV2LT53aXBoeS5wcm9iZV9yZXNwX29mZmxvYWQpOworCiAJaWYgKChkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc190eCB8fAogCSAgICAgZGV2LT53aXBoeS5hdmFpbGFibGVfYW50ZW5uYXNfcngpICYmIGRldi0+b3BzLT5nZXRfYW50ZW5uYSkgewogCQl1MzIgdHhfYW50ID0gMCwgcnhfYW50ID0gMDsKQEAgLTg3NCw3ICs4ODcsOCBAQAogCUNNRChzZXRfcG1rc2EsIFNFVF9QTUtTQSk7CiAJQ01EKGRlbF9wbWtzYSwgREVMX1BNS1NBKTsKIAlDTUQoZmx1c2hfcG1rc2EsIEZMVVNIX1BNS1NBKTsKLQlDTUQocmVtYWluX29uX2NoYW5uZWwsIFJFTUFJTl9PTl9DSEFOTkVMKTsKKwlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMKQorCQlDTUQocmVtYWluX29uX2NoYW5uZWwsIFJFTUFJTl9PTl9DSEFOTkVMKTsKIAlDTUQoc2V0X2JpdHJhdGVfbWFzaywgU0VUX1RYX0JJVFJBVEVfTUFTSyk7CiAJQ01EKG1nbXRfdHgsIEZSQU1FKTsKIAlDTUQobWdtdF90eF9jYW5jZWxfd2FpdCwgRlJBTUVfV0FJVF9DQU5DRUwpOwpAQCAtODkwLDYgKzkwNCwxNiBAQAogCX0KIAlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfU0NIRURfU0NBTikKIAkJQ01EKHNjaGVkX3NjYW5fc3RhcnQsIFNUQVJUX1NDSEVEX1NDQU4pOworCUNNRChwcm9iZV9jbGllbnQsIFBST0JFX0NMSUVOVCk7CisJQ01EKHNldF9ub2Fja19tYXAsIFNFVF9OT0FDS19NQVApOworCWlmIChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19SRVBPUlRTX09CU1MpIHsKKwkJaSsrOworCQlOTEFfUFVUX1UzMihtc2csIGksIE5MODAyMTFfQ01EX1JFR0lTVEVSX0JFQUNPTlMpOworCX0KKworI2lmZGVmIENPTkZJR19OTDgwMjExX1RFU1RNT0RFCisJQ01EKHRlc3Rtb2RlX2NtZCwgVEVTVE1PREUpOworI2VuZGlmCiAKICN1bmRlZiBDTUQKIApAQCAtOTA1LDExICs5MjksMTIgQEAKIAogCW5sYV9uZXN0X2VuZChtc2csIG5sX2NtZHMpOwogCi0JaWYgKGRldi0+b3BzLT5yZW1haW5fb25fY2hhbm5lbCkKKwlpZiAoZGV2LT5vcHMtPnJlbWFpbl9vbl9jaGFubmVsICYmCisJICAgIGRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTCkKIAkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfTUFYX1JFTUFJTl9PTl9DSEFOTkVMX0RVUkFUSU9OLAogCQkJICAgIGRldi0+d2lwaHkubWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uKTsKIAotCWlmIChkZXYtPm9wcy0+bWdtdF90eF9jYW5jZWxfd2FpdCkKKwlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWCkKIAkJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9BVFRSX09GRkNIQU5ORUxfVFhfT0spOwogCiAJaWYgKG1nbXRfc3R5cGVzKSB7CkBAIC0xMDA3LDYgKzEwMzIsMTcgQEAKIAlpZiAobmw4MDIxMV9wdXRfaWZhY2VfY29tYmluYXRpb25zKCZkZXYtPndpcGh5LCBtc2cpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAorCWlmIChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19IQVZFX0FQX1NNRSkKKwkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfREVWSUNFX0FQX1NNRSwKKwkJCSAgICBkZXYtPndpcGh5LmFwX3NtZV9jYXBhKTsKKworCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0ZFQVRVUkVfRkxBR1MsIGRldi0+d2lwaHkuZmVhdHVyZXMpOworCisJaWYgKGRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzaykKKwkJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0ssCisJCQlzaXplb2YoKmRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzayksCisJCQlkZXYtPndpcGh5Lmh0X2NhcGFfbW9kX21hc2spOworCiAJcmV0dXJuIGdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogIG5sYV9wdXRfZmFpbHVyZToKQEAgLTE3MjUsNiArMTc2MSwyMyBAQAogCXJldHVybiByZGV2LT5vcHMtPmRlbF92aXJ0dWFsX2ludGYoJnJkZXYtPndpcGh5LCBkZXYpOwogfQogCitzdGF0aWMgaW50IG5sODAyMTFfc2V0X25vYWNrX21hcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKwl1MTYgbm9hY2tfbWFwOworCisJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTk9BQ0tfTUFQXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXJkZXYtPm9wcy0+c2V0X25vYWNrX21hcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbm9hY2tfbWFwID0gbmxhX2dldF91MTYoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05PQUNLX01BUF0pOworCisJcmV0dXJuIHJkZXYtPm9wcy0+c2V0X25vYWNrX21hcCgmcmRldi0+d2lwaHksIGRldiwgbm9hY2tfbWFwKTsKK30KKwogc3RydWN0IGdldF9rZXlfY29va2llIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCWludCBlcnJvcjsKQEAgLTIxNTUsNiArMjIwOCwxMyBAQAogCQkJbmxhX2xlbihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSUVfQVNTT0NfUkVTUF0pOwogCX0KIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF0pIHsKKwkJcGFyYW1zLnByb2JlX3Jlc3AgPQorCQkJbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BST0JFX1JFU1BdKTsKKwkJcGFyYW1zLnByb2JlX3Jlc3BfbGVuID0KKwkJCW5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BST0JFX1JFU1BdKTsKKwl9CisKIAllcnIgPSBjYWxsKCZyZGV2LT53aXBoeSwgZGV2LCAmcGFyYW1zKTsKIAlpZiAoIWVyciAmJiBwYXJhbXMuaW50ZXJ2YWwpCiAJCXdkZXYtPmJlYWNvbl9pbnRlcnZhbCA9IHBhcmFtcy5pbnRlcnZhbDsKQEAgLTI0NTMsMjYgKzI1MTMsMzQgQEAKIC8qCiAgKiBHZXQgdmxhbiBpbnRlcmZhY2UgbWFraW5nIHN1cmUgaXQgaXMgcnVubmluZyBhbmQgb24gdGhlIHJpZ2h0IHdpcGh5LgogICovCi1zdGF0aWMgaW50IGdldF92bGFuKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCi0JCSAgICBzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCi0JCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKnZsYW4pCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmdldF92bGFuKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCisJCQkJICAgc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2KQogewogCXN0cnVjdCBubGF0dHIgKnZsYW5hdHRyID0gaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9WTEFOXTsKLQkqdmxhbiA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKnY7CisJaW50IHJldDsKIAotCWlmICh2bGFuYXR0cikgewotCQkqdmxhbiA9IGRldl9nZXRfYnlfaW5kZXgoZ2VubF9pbmZvX25ldChpbmZvKSwKLQkJCQkJIG5sYV9nZXRfdTMyKHZsYW5hdHRyKSk7Ci0JCWlmICghKnZsYW4pCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJaWYgKCEoKnZsYW4pLT5pZWVlODAyMTFfcHRyKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICgoKnZsYW4pLT5pZWVlODAyMTFfcHRyLT53aXBoeSAhPSAmcmRldi0+d2lwaHkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKCFuZXRpZl9ydW5uaW5nKCp2bGFuKSkKLQkJCXJldHVybiAtRU5FVERPV047CisJaWYgKCF2bGFuYXR0cikKKwkJcmV0dXJuIE5VTEw7CisKKwl2ID0gZGV2X2dldF9ieV9pbmRleChnZW5sX2luZm9fbmV0KGluZm8pLCBubGFfZ2V0X3UzMih2bGFuYXR0cikpOworCWlmICghdikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlpZiAoIXYtPmllZWU4MDIxMV9wdHIgfHwgdi0+aWVlZTgwMjExX3B0ci0+d2lwaHkgIT0gJnJkZXYtPndpcGh5KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CiAJfQotCXJldHVybiAwOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKHYpKSB7CisJCXJldCA9IC1FTkVURE9XTjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gdjsKKyBlcnJvcjoKKwlkZXZfcHV0KHYpOworCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIHN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQpAQCAtMjUyMiw5ICsyNTkwLDkgQEAKIAkJcGFyYW1zLnBsaW5rX3N0YXRlID0KIAkJICAgIG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9QTElOS19TVEFURV0pOwogCi0JZXJyID0gZ2V0X3ZsYW4oaW5mbywgcmRldiwgJnBhcmFtcy52bGFuKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKKwlwYXJhbXMudmxhbiA9IGdldF92bGFuKGluZm8sIHJkZXYpOworCWlmIChJU19FUlIocGFyYW1zLnZsYW4pKQorCQlyZXR1cm4gUFRSX0VSUihwYXJhbXMudmxhbik7CiAKIAkvKiB2YWxpZGF0ZSBzZXR0aW5ncyAqLwogCWVyciA9IDA7CkBAIC0yNjkyLDkgKzI3NjAsOSBAQAogCSAgICAgIChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfVERMU19FWFRFUk5BTF9TRVRVUCkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVyciA9IGdldF92bGFuKGluZm8sIHJkZXYsICZwYXJhbXMudmxhbik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7CisJcGFyYW1zLnZsYW4gPSBnZXRfdmxhbihpbmZvLCByZGV2KTsKKwlpZiAoSVNfRVJSKHBhcmFtcy52bGFuKSkKKwkJcmV0dXJuIFBUUl9FUlIocGFyYW1zLnZsYW4pOwogCiAJLyogdmFsaWRhdGUgc2V0dGluZ3MgKi8KIAllcnIgPSAwOwpAQCAtMzEyNyw2ICszMTk1LDggQEAKIAkJCWN1cl9wYXJhbXMuZG90MTFNZXNoSFdNUGFjdGl2ZVBhdGhUaW1lb3V0KTsKIAlOTEFfUFVUX1UxNihtc2csIE5MODAyMTFfTUVTSENPTkZfSFdNUF9QUkVRX01JTl9JTlRFUlZBTCwKIAkJCWN1cl9wYXJhbXMuZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbCk7CisJTkxBX1BVVF9VMTYobXNnLCBOTDgwMjExX01FU0hDT05GX0hXTVBfUEVSUl9NSU5fSU5URVJWQUwsCisJCQljdXJfcGFyYW1zLmRvdDExTWVzaEhXTVBwZXJyTWluSW50ZXJ2YWwpOwogCU5MQV9QVVRfVTE2KG1zZywgTkw4MDIxMV9NRVNIQ09ORl9IV01QX05FVF9ESUFNX1RSVlNfVElNRSwKIAkJCWN1cl9wYXJhbXMuZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZSk7CiAJTkxBX1BVVF9VOChtc2csIE5MODAyMTFfTUVTSENPTkZfSFdNUF9ST09UTU9ERSwKQEAgLTMxNjEsNiArMzIzMSw3IEBACiAJW05MODAyMTFfTUVTSENPTkZfTUlOX0RJU0NPVkVSWV9USU1FT1VUXSA9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW05MODAyMTFfTUVTSENPTkZfSFdNUF9BQ1RJVkVfUEFUSF9USU1FT1VUXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW05MODAyMTFfTUVTSENPTkZfSFdNUF9QUkVRX01JTl9JTlRFUlZBTF0gPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtOTDgwMjExX01FU0hDT05GX0hXTVBfUEVSUl9NSU5fSU5URVJWQUxdID0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbTkw4MDIxMV9NRVNIQ09ORl9IV01QX05FVF9ESUFNX1RSVlNfVElNRV0gPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtOTDgwMjExX01FU0hDT05GX0hXTVBfUk9PVE1PREVdID0geyAudHlwZSA9IE5MQV9VOCB9LAogCVtOTDgwMjExX01FU0hDT05GX0hXTVBfUkFOTl9JTlRFUlZBTF0gPSB7IC50eXBlID0gTkxBX1UxNiB9LApAQCAtMzIzNSw2ICszMzA2LDkgQEAKIAlGSUxMX0lOX01FU0hfUEFSQU1fSUZfU0VUKHRiLCBjZmcsIGRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWwsCiAJCQltYXNrLCBOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUwsCiAJCQlubGFfZ2V0X3UxNik7CisJRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBkb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsLAorCQkJbWFzaywgTkw4MDIxMV9NRVNIQ09ORl9IV01QX1BFUlJfTUlOX0lOVEVSVkFMLAorCQkJbmxhX2dldF91MTYpOwogCUZJTExfSU5fTUVTSF9QQVJBTV9JRl9TRVQodGIsIGNmZywKIAkJCWRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUsCiAJCQltYXNrLCBOTDgwMjExX01FU0hDT05GX0hXTVBfTkVUX0RJQU1fVFJWU19USU1FLApAQCAtMzM1Nyw2ICszNDMxLDkgQEAKIAogCU5MQV9QVVRfU1RSSU5HKG1zZywgTkw4MDIxMV9BVFRSX1JFR19BTFBIQTIsCiAJCWNmZzgwMjExX3JlZ2RvbWFpbi0+YWxwaGEyKTsKKwlpZiAoY2ZnODAyMTFfcmVnZG9tYWluLT5kZnNfcmVnaW9uKQorCQlOTEFfUFVUX1U4KG1zZywgTkw4MDIxMV9BVFRSX0RGU19SRUdJT04sCisJCQkgICBjZmc4MDIxMV9yZWdkb21haW4tPmRmc19yZWdpb24pOwogCiAJbmxfcmVnX3J1bGVzID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfUkVHX1JVTEVTKTsKIAlpZiAoIW5sX3JlZ19ydWxlcykKQEAgLTM0MTUsNiArMzQ5Miw3IEBACiAJY2hhciAqYWxwaGEyID0gTlVMTDsKIAlpbnQgcmVtX3JlZ19ydWxlcyA9IDAsIHIgPSAwOwogCXUzMiBudW1fcnVsZXMgPSAwLCBydWxlX2lkeCA9IDAsIHNpemVfb2ZfcmVnZDsKKwl1OCBkZnNfcmVnaW9uID0gMDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQgPSBOVUxMOwogCiAJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUkVHX0FMUEhBMl0pCkBAIC0zNDI1LDYgKzM1MDMsOSBAQAogCiAJYWxwaGEyID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19BTFBIQTJdKTsKIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfREZTX1JFR0lPTl0pCisJCWRmc19yZWdpb24gPSBubGFfZ2V0X3U4KGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9ERlNfUkVHSU9OXSk7CisKIAlubGFfZm9yX2VhY2hfbmVzdGVkKG5sX3JlZ19ydWxlLCBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUkVHX1JVTEVTXSwKIAkJCXJlbV9yZWdfcnVsZXMpIHsKIAkJbnVtX3J1bGVzKys7CkBAIC0zNDUyLDYgKzM1MzMsMTMgQEAKIAlyZC0+YWxwaGEyWzBdID0gYWxwaGEyWzBdOwogCXJkLT5hbHBoYTJbMV0gPSBhbHBoYTJbMV07CiAKKwkvKgorCSAqIERpc2FibGUgREZTIG1hc3RlciBtb2RlIGlmIHRoZSBERlMgcmVnaW9uIHdhcworCSAqIG5vdCBzdXBwb3J0ZWQgb3Iga25vd24gb24gdGhpcyBrZXJuZWwuCisJICovCisJaWYgKHJlZ19zdXBwb3J0ZWRfZGZzX3JlZ2lvbihkZnNfcmVnaW9uKSkKKwkJcmQtPmRmc19yZWdpb24gPSBkZnNfcmVnaW9uOworCiAJbmxhX2Zvcl9lYWNoX25lc3RlZChubF9yZWdfcnVsZSwgaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19SVUxFU10sCiAJCQlyZW1fcmVnX3J1bGVzKSB7CiAJCW5sYV9wYXJzZSh0YiwgTkw4MDIxMV9SRUdfUlVMRV9BVFRSX01BWCwKQEAgLTQzNTksNiArNDQ0Nyw5IEBACiAJY29uc3QgdTggKmJzc2lkLCAqc3NpZCwgKmllID0gTlVMTCwgKnByZXZfYnNzaWQgPSBOVUxMOwogCWludCBlcnIsIHNzaWRfbGVuLCBpZV9sZW4gPSAwOwogCWJvb2wgdXNlX21mcCA9IGZhbHNlOworCXUzMiBmbGFncyA9IDA7CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGEgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21hc2sgPSBOVUxMOwogCiAJaWYgKCFpc192YWxpZF9pZV9hdHRyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9JRV0pKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ0MDIsMTEgKzQ0OTMsMjUgQEAKIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BSRVZfQlNTSURdKQogCQlwcmV2X2Jzc2lkID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BSRVZfQlNTSURdKTsKIAorCWlmIChubGFfZ2V0X2ZsYWcoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0RJU0FCTEVfSFRdKSkKKwkJZmxhZ3MgfD0gQVNTT0NfUkVRX0RJU0FCTEVfSFQ7CisKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFlfTUFTS10pCisJCWh0X2NhcGFfbWFzayA9CisJCQlubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSk7CisKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFldKSB7CisJCWlmICghaHRfY2FwYV9tYXNrKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWh0X2NhcGEgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0pOworCX0KKwogCWVyciA9IG5sODAyMTFfY3J5cHRvX3NldHRpbmdzKHJkZXYsIGluZm8sICZjcnlwdG8sIDEpOwogCWlmICghZXJyKQogCQllcnIgPSBjZmc4MDIxMV9tbG1lX2Fzc29jKHJkZXYsIGRldiwgY2hhbiwgYnNzaWQsIHByZXZfYnNzaWQsCiAJCQkJCSAgc3NpZCwgc3NpZF9sZW4sIGllLCBpZV9sZW4sIHVzZV9tZnAsCi0JCQkJCSAgJmNyeXB0byk7CisJCQkJCSAgJmNyeXB0bywgZmxhZ3MsIGh0X2NhcGEsCisJCQkJCSAgaHRfY2FwYV9tYXNrKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00ODk2LDYgKzUwMDEsMjIgQEAKIAkJCXJldHVybiBQVFJfRVJSKGNvbm5rZXlzKTsKIAl9CiAKKwlpZiAobmxhX2dldF9mbGFnKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9ESVNBQkxFX0hUXSkpCisJCWNvbm5lY3QuZmxhZ3MgfD0gQVNTT0NfUkVRX0RJU0FCTEVfSFQ7CisKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFlfTUFTS10pCisJCW1lbWNweSgmY29ubmVjdC5odF9jYXBhX21hc2ssCisJCSAgICAgICBubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSksCisJCSAgICAgICBzaXplb2YoY29ubmVjdC5odF9jYXBhX21hc2spKTsKKworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0pIHsKKwkJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1jcHkoJmNvbm5lY3QuaHRfY2FwYSwKKwkJICAgICAgIG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSksCisJCSAgICAgICBzaXplb2YoY29ubmVjdC5odF9jYXBhKSk7CisJfQorCiAJZXJyID0gY2ZnODAyMTFfY29ubmVjdChyZGV2LCBkZXYsICZjb25uZWN0LCBjb25ua2V5cyk7CiAJaWYgKGVycikKIAkJa2ZyZWUoY29ubmtleXMpOwpAQCAtNTA4Myw3ICs1MjA0LDggQEAKIAkgICAgZHVyYXRpb24gPiByZGV2LT53aXBoeS5tYXhfcmVtYWluX29uX2NoYW5uZWxfZHVyYXRpb24pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFyZGV2LT5vcHMtPnJlbWFpbl9vbl9jaGFubmVsKQorCWlmICghcmRldi0+b3BzLT5yZW1haW5fb25fY2hhbm5lbCB8fAorCSAgICAhKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUwpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRV0pIHsKQEAgLTUyNzEsMTIgKzUzOTMsMTMgQEAKIAlib29sIGNoYW5uZWxfdHlwZV92YWxpZCA9IGZhbHNlOwogCXUzMiBmcmVxOwogCWludCBlcnI7Ci0Jdm9pZCAqaGRyOworCXZvaWQgKmhkciA9IE5VTEw7CiAJdTY0IGNvb2tpZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXN0cnVjdCBza19idWZmICptc2cgPSBOVUxMOwogCXVuc2lnbmVkIGludCB3YWl0ID0gMDsKLQlib29sIG9mZmNoYW47Ci0JYm9vbCBub19jY2s7CisJYm9vbCBvZmZjaGFuLCBub19jY2ssIGRvbnRfd2FpdF9mb3JfYWNrOworCisJZG9udF93YWl0X2Zvcl9hY2sgPSBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfRE9OVF9XQUlUX0ZPUl9BQ0tdOwogCiAJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfRlJBTUVdIHx8CiAJICAgICFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfV0lQSFlfRlJFUV0pCkBAIC01Mjk1LDcgKzU0MTgsNyBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0RVUkFUSU9OXSkgewotCQlpZiAoIXJkZXYtPm9wcy0+bWdtdF90eF9jYW5jZWxfd2FpdCkKKwkJaWYgKCEocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX09GRkNIQU5fVFgpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXdhaXQgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfRFVSQVRJT05dKTsKIAl9CkBAIC01MzEzLDYgKzU0MzYsOSBAQAogCiAJb2ZmY2hhbiA9IGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9PRkZDSEFOTkVMX1RYX09LXTsKIAorCWlmIChvZmZjaGFuICYmICEocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX09GRkNIQU5fVFgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCW5vX2NjayA9IG5sYV9nZXRfZmxhZyhpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfVFhfTk9fQ0NLX1JBVEVdKTsKIAogCWZyZXEgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfV0lQSFlfRlJFUV0pOwpAQCAtNTMyMCwyOSArNTQ0NiwzNiBAQAogCWlmIChjaGFuID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbXNnID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc2cpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghZG9udF93YWl0X2Zvcl9hY2spIHsKKwkJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbXNnKQorCQkJcmV0dXJuIC1FTk9NRU07CiAKLQloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIGluZm8tPnNuZF9waWQsIGluZm8tPnNuZF9zZXEsIDAsCi0JCQkgICAgIE5MODAyMTFfQ01EX0ZSQU1FKTsKKwkJaGRyID0gbmw4MDIxMWhkcl9wdXQobXNnLCBpbmZvLT5zbmRfcGlkLCBpbmZvLT5zbmRfc2VxLCAwLAorCQkJCSAgICAgTkw4MDIxMV9DTURfRlJBTUUpOwogCi0JaWYgKElTX0VSUihoZHIpKSB7Ci0JCWVyciA9IFBUUl9FUlIoaGRyKTsKLQkJZ290byBmcmVlX21zZzsKKwkJaWYgKElTX0VSUihoZHIpKSB7CisJCQllcnIgPSBQVFJfRVJSKGhkcik7CisJCQlnb3RvIGZyZWVfbXNnOworCQl9CiAJfQorCiAJZXJyID0gY2ZnODAyMTFfbWxtZV9tZ210X3R4KHJkZXYsIGRldiwgY2hhbiwgb2ZmY2hhbiwgY2hhbm5lbF90eXBlLAogCQkJCSAgICBjaGFubmVsX3R5cGVfdmFsaWQsIHdhaXQsCiAJCQkJICAgIG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9GUkFNRV0pLAogCQkJCSAgICBubGFfbGVuKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9GUkFNRV0pLAotCQkJCSAgICBub19jY2ssICZjb29raWUpOworCQkJCSAgICBub19jY2ssIGRvbnRfd2FpdF9mb3JfYWNrLCAmY29va2llKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZyZWVfbXNnOwogCi0JTkxBX1BVVF9VNjQobXNnLCBOTDgwMjExX0FUVFJfQ09PS0lFLCBjb29raWUpOworCWlmIChtc2cpIHsKKwkJTkxBX1BVVF9VNjQobXNnLCBOTDgwMjExX0FUVFJfQ09PS0lFLCBjb29raWUpOwogCi0JZ2VubG1zZ19lbmQobXNnLCBoZHIpOwotCXJldHVybiBnZW5sbXNnX3JlcGx5KG1zZywgaW5mbyk7CisJCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwkJcmV0dXJuIGdlbmxtc2dfcmVwbHkobXNnLCBpbmZvKTsKKwl9CisKKwlyZXR1cm4gMDsKIAogIG5sYV9wdXRfZmFpbHVyZToKIAllcnIgPSAtRU5PQlVGUzsKQEAgLTU1NDAsNiArNTY3MywxMSBAQAogCXNldHVwLm1lc2hfaWQgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUVTSF9JRF0pOwogCXNldHVwLm1lc2hfaWRfbGVuID0gbmxhX2xlbihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUVTSF9JRF0pOwogCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NQ0FTVF9SQVRFXSAmJgorCSAgICAhbmw4MDIxMV9wYXJzZV9tY2FzdF9yYXRlKHJkZXYsIHNldHVwLm1jYXN0X3JhdGUsCisJCQkgICAgbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX01DQVNUX1JBVEVdKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUVTSF9TRVRVUF0pIHsKIAkJLyogcGFyc2UgYWRkaXRpb25hbCBzZXR1cCBwYXJhbWV0ZXJzIGlmIGdpdmVuICovCiAJCWVyciA9IG5sODAyMTFfcGFyc2VfbWVzaF9zZXR1cChpbmZvLCAmc2V0dXApOwpAQCAtNTgzMiw2ICs1OTcwLDkxIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBubDgwMjExX3JlZ2lzdGVyX3VuZXhwZWN0ZWRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgICBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOworCisJaWYgKHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgorCSAgICB3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0dPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3ZGV2LT5hcF91bmV4cGVjdGVkX25scGlkKQorCQlyZXR1cm4gLUVCVVNZOworCisJd2Rldi0+YXBfdW5leHBlY3RlZF9ubHBpZCA9IGluZm8tPnNuZF9waWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9wcm9iZV9jbGllbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOworCXN0cnVjdCBza19idWZmICptc2c7CisJdm9pZCAqaGRyOworCWNvbnN0IHU4ICphZGRyOworCXU2NCBjb29raWU7CisJaW50IGVycjsKKworCWlmICh3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkgICAgd2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9HTykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUFDXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXJkZXYtPm9wcy0+cHJvYmVfY2xpZW50KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIGluZm8tPnNuZF9waWQsIGluZm8tPnNuZF9zZXEsIDAsCisJCQkgICAgIE5MODAyMTFfQ01EX1BST0JFX0NMSUVOVCk7CisKKwlpZiAoSVNfRVJSKGhkcikpIHsKKwkJZXJyID0gUFRSX0VSUihoZHIpOworCQlnb3RvIGZyZWVfbXNnOworCX0KKworCWFkZHIgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUFDXSk7CisKKwllcnIgPSByZGV2LT5vcHMtPnByb2JlX2NsaWVudCgmcmRldi0+d2lwaHksIGRldiwgYWRkciwgJmNvb2tpZSk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX21zZzsKKworCU5MQV9QVVRfVTY0KG1zZywgTkw4MDIxMV9BVFRSX0NPT0tJRSwgY29va2llKTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKworCXJldHVybiBnZW5sbXNnX3JlcGx5KG1zZywgaW5mbyk7CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZXJyID0gLUVOT0JVRlM7CisgZnJlZV9tc2c6CisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9yZWdpc3Rlcl9iZWFjb25zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CisKKwlpZiAoIShyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfUkVQT1JUU19PQlNTKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHJkZXYtPmFwX2JlYWNvbnNfbmxwaWQpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZGV2LT5hcF9iZWFjb25zX25scGlkID0gaW5mby0+c25kX3BpZDsKKworCXJldHVybiAwOworfQorCiAjZGVmaW5lIE5MODAyMTFfRkxBR19ORUVEX1dJUEhZCQkweDAxCiAjZGVmaW5lIE5MODAyMTFfRkxBR19ORUVEX05FVERFVgkweDAyCiAjZGVmaW5lIE5MODAyMTFfRkxBR19ORUVEX1JUTkwJCTB4MDQKQEAgLTYzODcsNiArNjYxMCwzOSBAQAogCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9ORVRERVZfVVAgfAogCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKIAl9LAorCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX1VORVhQRUNURURfRlJBTUUsCisJCS5kb2l0ID0gbmw4MDIxMV9yZWdpc3Rlcl91bmV4cGVjdGVkX2ZyYW1lLAorCQkucG9saWN5ID0gbmw4MDIxMV9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmludGVybmFsX2ZsYWdzID0gTkw4MDIxMV9GTEFHX05FRURfTkVUREVWIHwKKwkJCQkgIE5MODAyMTFfRkxBR19ORUVEX1JUTkwsCisJfSwKKwl7CisJCS5jbWQgPSBOTDgwMjExX0NNRF9QUk9CRV9DTElFTlQsCisJCS5kb2l0ID0gbmw4MDIxMV9wcm9iZV9jbGllbnQsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9ORVRERVYgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX1JFR0lTVEVSX0JFQUNPTlMsCisJCS5kb2l0ID0gbmw4MDIxMV9yZWdpc3Rlcl9iZWFjb25zLAorCQkucG9saWN5ID0gbmw4MDIxMV9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmludGVybmFsX2ZsYWdzID0gTkw4MDIxMV9GTEFHX05FRURfV0lQSFkgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX1NFVF9OT0FDS19NQVAsCisJCS5kb2l0ID0gbmw4MDIxMV9zZXRfbm9hY2tfbWFwLAorCQkucG9saWN5ID0gbmw4MDIxMV9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmludGVybmFsX2ZsYWdzID0gTkw4MDIxMV9GTEFHX05FRURfTkVUREVWIHwKKwkJCQkgIE5MODAyMTFfRkxBR19ORUVEX1JUTkwsCisJfSwKKwogfTsKIAogc3RhdGljIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBubDgwMjExX21sbWVfbWNncnAgPSB7CkBAIC02NjM5LDEwICs2ODk1LDcgQEAKIAlpZiAod2lwaHlfaWR4X3ZhbGlkKHJlcXVlc3QtPndpcGh5X2lkeCkpCiAJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZLCByZXF1ZXN0LT53aXBoeV9pZHgpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlnZW5sbXNnX211bHRpY2FzdF9hbGxucyhtc2csIDAsIG5sODAyMTFfcmVndWxhdG9yeV9tY2dycC5pZCwKQEAgLTY2NzgsMTAgKzY5MzEsNyBAQAogCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsIG5ldGRldi0+aWZpbmRleCk7CiAJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9GUkFNRSwgbGVuLCBidWYpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNjc2MiwxMCArNzAxMiw3IEBACiAJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9BVFRSX1RJTUVEX09VVCk7CiAJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9NQUMsIEVUSF9BTEVOLCBhZGRyKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKQEAgLTY4MjEsMTAgKzcwNjgsNyBAQAogCWlmIChyZXNwX2llKQogCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX1JFU1BfSUUsIHJlc3BfaWVfbGVuLCByZXNwX2llKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKQEAgLTY4NjIsMTAgKzcxMDYsNyBAQAogCWlmIChyZXNwX2llKQogCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX1JFU1BfSUUsIHJlc3BfaWVfbGVuLCByZXNwX2llKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKQEAgLTY5MDMsMTAgKzcxNDQsNyBAQAogCWlmIChpZSkKIAkJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9JRSwgaWVfbGVuLCBpZSk7CiAKLQlpZiAoZ2VubG1zZ19lbmQobXNnLCBoZHIpIDwgMCkgewotCQlubG1zZ19mcmVlKG1zZyk7Ci0JCXJldHVybjsKLQl9CisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCiAJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgMCwKIAkJCQlubDgwMjExX21sbWVfbWNncnAuaWQsIEdGUF9LRVJORUwpOwpAQCAtNjkzOSwxMCArNzE3Nyw3IEBACiAJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgbmV0ZGV2LT5pZmluZGV4KTsKIAlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIGJzc2lkKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKQEAgLTY5NzcsMTAgKzcyMTIsNyBAQAogCWlmIChpZV9sZW4gJiYgaWUpCiAJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfSUUsIGllX2xlbiAsIGllKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKQEAgLTcwMTksMTAgKzcyNTEsNyBAQAogCWlmICh0c2MpCiAJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfS0VZX1NFUSwgNiwgdHNjKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKQEAgLTcwNzMsMTAgKzczMDIsNyBAQAogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlubGFfbmVzdF9lbmQobXNnLCBubF9mcmVxKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZ2VubG1zZ19tdWx0aWNhc3RfYWxsbnMobXNnLCAwLCBubDgwMjExX3JlZ3VsYXRvcnlfbWNncnAuaWQsCkBAIC03MTE5LDEwICs3MzQ1LDcgQEAKIAlpZiAoY21kID09IE5MODAyMTFfQ01EX1JFTUFJTl9PTl9DSEFOTkVMKQogCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9EVVJBVElPTiwgZHVyYXRpb24pOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNzE5MywxMCArNzQxNiw3IEBACiAJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgZGV2LT5pZmluZGV4KTsKIAlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIG1hY19hZGRyKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKQEAgLTcyMDcsMTMgKzc0MjcsNjggQEAKIAlubG1zZ19mcmVlKG1zZyk7CiB9CiAKK3N0YXRpYyBib29sIF9fbmw4MDIxMV91bmV4cGVjdGVkX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNtZCwKKwkJCQkgICAgICAgY29uc3QgdTggKmFkZHIsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKKwl2b2lkICpoZHI7CisJaW50IGVycjsKKwl1MzIgbmxwaWQgPSBBQ0NFU1NfT05DRSh3ZGV2LT5hcF91bmV4cGVjdGVkX25scGlkKTsKKworCWlmICghbmxwaWQpCisJCXJldHVybiBmYWxzZTsKKworCW1zZyA9IG5sbXNnX25ldygxMDAsIGdmcCk7CisJaWYgKCFtc2cpCisJCXJldHVybiB0cnVlOworCisJaGRyID0gbmw4MDIxMWhkcl9wdXQobXNnLCAwLCAwLCAwLCBjbWQpOworCWlmICghaGRyKSB7CisJCW5sbXNnX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFksIHJkZXYtPndpcGh5X2lkeCk7CisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgZGV2LT5pZmluZGV4KTsKKwlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIGFkZHIpOworCisJZXJyID0gZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCWlmIChlcnIgPCAwKSB7CisJCW5sbXNnX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJZ2VubG1zZ191bmljYXN0KHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIG5scGlkKTsKKwlyZXR1cm4gdHJ1ZTsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiB0cnVlOworfQorCitib29sIG5sODAyMTFfdW5leHBlY3RlZF9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqYWRkciwgZ2ZwX3QgZ2ZwKQoreworCXJldHVybiBfX25sODAyMTFfdW5leHBlY3RlZF9mcmFtZShkZXYsIE5MODAyMTFfQ01EX1VORVhQRUNURURfRlJBTUUsCisJCQkJCSAgYWRkciwgZ2ZwKTsKK30KKworYm9vbCBubDgwMjExX3VuZXhwZWN0ZWRfNGFkZHJfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgY29uc3QgdTggKmFkZHIsIGdmcF90IGdmcCkKK3sKKwlyZXR1cm4gX19ubDgwMjExX3VuZXhwZWN0ZWRfZnJhbWUoZGV2LAorCQkJCQkgIE5MODAyMTFfQ01EX1VORVhQRUNURURfNEFERFJfRlJBTUUsCisJCQkJCSAgYWRkciwgZ2ZwKTsKK30KKwogaW50IG5sODAyMTFfc2VuZF9tZ210KHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIG5scGlkLAogCQkgICAgICBpbnQgZnJlcSwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwotCWludCBlcnI7CiAKIAltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBnZnApOwogCWlmICghbXNnKQpAQCAtNzIzMCwxNiArNzUwNSw5IEBACiAJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSwgZnJlcSk7CiAJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9GUkFNRSwgbGVuLCBidWYpOwogCi0JZXJyID0gZ2VubG1zZ19lbmQobXNnLCBoZHIpOwotCWlmIChlcnIgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCi0JZXJyID0gZ2VubG1zZ191bmljYXN0KHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIG5scGlkKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ2VubG1zZ191bmljYXN0KHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIG5scGlkKTsKIAogIG5sYV9wdXRfZmFpbHVyZToKIAlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CkBAIC03MjcyLDEwICs3NTQwLDcgQEAKIAlpZiAoYWNrKQogCQlOTEFfUFVUX0ZMQUcobXNnLCBOTDgwMjExX0FUVFJfQUNLKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdChtc2csIDAsIG5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKIAlyZXR1cm47CkBAIC03MzE3LDEwICs3NTgyLDcgQEAKIAogCW5sYV9uZXN0X2VuZChtc2csIHBpbmZvYXR0cik7CiAKLQlpZiAoZ2VubG1zZ19lbmQobXNnLCBoZHIpIDwgMCkgewotCQlubG1zZ19mcmVlKG1zZyk7Ci0JCXJldHVybjsKLQl9CisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCiAJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgMCwKIAkJCQlubDgwMjExX21sbWVfbWNncnAuaWQsIGdmcCk7CkBAIC03MzYyLDEwICs3NjI0LDcgQEAKIAogCW5sYV9uZXN0X2VuZChtc2csIHJla2V5X2F0dHIpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNzQwOCwxMCArNzY2Nyw3IEBACiAKIAlubGFfbmVzdF9lbmQobXNnLCBhdHRyKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKQEAgLTc0NTMsNyArNzcwOSw0NSBAQAogCiAJbmxhX25lc3RfZW5kKG1zZywgcGluZm9hdHRyKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7CisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCisJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgMCwKKwkJCQlubDgwMjExX21sbWVfbWNncnAuaWQsIGdmcCk7CisJcmV0dXJuOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlubG1zZ19mcmVlKG1zZyk7Cit9CisKK3ZvaWQgY2ZnODAyMTFfcHJvYmVfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICphZGRyLAorCQkJICAgdTY0IGNvb2tpZSwgYm9vbCBhY2tlZCwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXZvaWQgKmhkcjsKKwlpbnQgZXJyOworCisJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBnZnApOworCWlmICghbXNnKQorCQlyZXR1cm47CisKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIDAsIDAsIDAsIE5MODAyMTFfQ01EX1BST0JFX0NMSUVOVCk7CisJaWYgKCFoZHIpIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFksIHJkZXYtPndpcGh5X2lkeCk7CisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgZGV2LT5pZmluZGV4KTsKKwlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIGFkZHIpOworCU5MQV9QVVRfVTY0KG1zZywgTkw4MDIxMV9BVFRSX0NPT0tJRSwgY29va2llKTsKKwlpZiAoYWNrZWQpCisJCU5MQV9QVVRfRkxBRyhtc2csIE5MODAyMTFfQVRUUl9BQ0spOworCisJZXJyID0gZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCWlmIChlcnIgPCAwKSB7CiAJCW5sbXNnX2ZyZWUobXNnKTsKIAkJcmV0dXJuOwogCX0KQEAgLTc0NjYsNiArNzc2MCw0NSBAQAogCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKIAlubG1zZ19mcmVlKG1zZyk7CiB9CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX3Byb2JlX3N0YXR1cyk7CisKK3ZvaWQgY2ZnODAyMTFfcmVwb3J0X29ic3NfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJIGNvbnN0IHU4ICpmcmFtZSwgc2l6ZV90IGxlbiwKKwkJCQkgaW50IGZyZXEsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2lwaHkpOworCXN0cnVjdCBza19idWZmICptc2c7CisJdm9pZCAqaGRyOworCXUzMiBubHBpZCA9IEFDQ0VTU19PTkNFKHJkZXYtPmFwX2JlYWNvbnNfbmxwaWQpOworCisJaWYgKCFubHBpZCkKKwkJcmV0dXJuOworCisJbXNnID0gbmxtc2dfbmV3KGxlbiArIDEwMCwgZ2ZwKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuOworCisJaGRyID0gbmw4MDIxMWhkcl9wdXQobXNnLCAwLCAwLCAwLCBOTDgwMjExX0NNRF9GUkFNRSk7CisJaWYgKCFoZHIpIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFksIHJkZXYtPndpcGh5X2lkeCk7CisJaWYgKGZyZXEpCisJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVEsIGZyZXEpOworCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfRlJBTUUsIGxlbiwgZnJhbWUpOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCisJZ2VubG1zZ191bmljYXN0KHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIG5scGlkKTsKKwlyZXR1cm47CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCW5sbXNnX2ZyZWUobXNnKTsKK30KK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfcmVwb3J0X29ic3NfYmVhY29uKTsKIAogc3RhdGljIGludCBubDgwMjExX25ldGxpbmtfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqIG5iLAogCQkJCSAgdW5zaWduZWQgbG9uZyBzdGF0ZSwKQEAgLTc0ODAsOSArNzgxMywxMiBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmRldiwgJmNmZzgwMjExX3JkZXZfbGlzdCwgbGlzdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZGV2LCAmY2ZnODAyMTFfcmRldl9saXN0LCBsaXN0KSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHdkZXYsICZyZGV2LT5uZXRkZXZfbGlzdCwgbGlzdCkKIAkJCWNmZzgwMjExX21sbWVfdW5yZWdpc3Rlcl9zb2NrZXQod2Rldiwgbm90aWZ5LT5waWQpOworCQlpZiAocmRldi0+YXBfYmVhY29uc19ubHBpZCA9PSBub3RpZnktPnBpZCkKKwkJCXJkZXYtPmFwX2JlYWNvbnNfbmxwaWQgPSAwOworCX0KIAogCXJjdV9yZWFkX3VubG9jaygpOwogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaAppbmRleCBmMjRhMWZiLi4xMmJmNGQxIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmgKQEAgLTExNyw0ICsxMTcsOSBAQAogCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgaW5kZXgsCiAJCQkJICAgIGNvbnN0IHU4ICpic3NpZCwgYm9vbCBwcmVhdXRoLCBnZnBfdCBnZnApOwogCitib29sIG5sODAyMTFfdW5leHBlY3RlZF9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgY29uc3QgdTggKmFkZHIsIGdmcF90IGdmcCk7Citib29sIG5sODAyMTFfdW5leHBlY3RlZF80YWRkcl9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBjb25zdCB1OCAqYWRkciwgZ2ZwX3QgZ2ZwKTsKKwogI2VuZGlmIC8qIF9fTkVUX1dJUkVMRVNTX05MODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JhZGlvdGFwLmMgYi9uZXQvd2lyZWxlc3MvcmFkaW90YXAuYwppbmRleCBkYmUzNWUxLi5jNGFkNzk1IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvcmFkaW90YXAuYworKysgYi9uZXQvd2lyZWxlc3MvcmFkaW90YXAuYwpAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JlZy5jIGIvbmV0L3dpcmVsZXNzL3JlZy5jCmluZGV4IDA3NGMxMTIuLjcwYjE3MWEgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9yZWcuYworKysgYi9uZXQvd2lyZWxlc3MvcmVnLmMKQEAgLTM2LDEyICszNiwxNCBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L25sODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJyZWcuaCIKQEAgLTExMzcsNiArMTEzOSw4IEBACiAJaWYgKGlnbm9yZV9yZWdfdXBkYXRlKHdpcGh5LCBpbml0aWF0b3IpKQogCQlyZXR1cm47CiAKKwlsYXN0X3JlcXVlc3QtPmRmc19yZWdpb24gPSBjZmc4MDIxMV9yZWdkb21haW4tPmRmc19yZWdpb247CisKIAlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYmFuZCsrKSB7CiAJCWlmICh3aXBoeS0+YmFuZHNbYmFuZF0pCiAJCQloYW5kbGVfYmFuZCh3aXBoeSwgYmFuZCwgaW5pdGlhdG9yKTsKQEAgLTE5NjAsNiArMTk2NCw0MiBAQAogCX0KIH0KIAorYm9vbCByZWdfc3VwcG9ydGVkX2Rmc19yZWdpb24odTggZGZzX3JlZ2lvbikKK3sKKwlzd2l0Y2ggKGRmc19yZWdpb24pIHsKKwljYXNlIE5MODAyMTFfREZTX1VOU0VUOgorCWNhc2UgTkw4MDIxMV9ERlNfRkNDOgorCWNhc2UgTkw4MDIxMV9ERlNfRVRTSToKKwljYXNlIE5MODAyMTFfREZTX0pQOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlSRUdfREJHX1BSSU5UKCJJZ25vcmluZyB1a25vd24gREZTIG1hc3RlciByZWdpb246ICVkXG4iLAorCQkJICAgICAgZGZzX3JlZ2lvbik7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Rmc19yZWdpb24odTggZGZzX3JlZ2lvbikKK3sKKwlpZiAoIWRmc19yZWdpb24pCisJCXJldHVybjsKKworCXN3aXRjaCAoZGZzX3JlZ2lvbikgeworCWNhc2UgTkw4MDIxMV9ERlNfRkNDOgorCQlwcl9pbmZvKCIgREZTIE1hc3RlciByZWdpb24gRkNDIik7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9ERlNfRVRTSToKKwkJcHJfaW5mbygiIERGUyBNYXN0ZXIgcmVnaW9uIEVUU0kiKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0RGU19KUDoKKwkJcHJfaW5mbygiIERGUyBNYXN0ZXIgcmVnaW9uIEpQIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2luZm8oIiBERlMgTWFzdGVyIHJlZ2lvbiBVa25vd24iKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgdm9pZCBwcmludF9yZWdkb21haW4oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKQogewogCkBAIC0xOTg3LDYgKzIwMjcsNyBAQAogCQkJcHJfaW5mbygiUmVndWxhdG9yeSBkb21haW4gY2hhbmdlZCB0byBjb3VudHJ5OiAlYyVjXG4iLAogCQkJCXJkLT5hbHBoYTJbMF0sIHJkLT5hbHBoYTJbMV0pOwogCX0KKwlwcmludF9kZnNfcmVnaW9uKHJkLT5kZnNfcmVnaW9uKTsKIAlwcmludF9yZF9ydWxlcyhyZCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9yZWcuaCBiL25ldC93aXJlbGVzcy9yZWcuaAppbmRleCA0YTU2Nzk5Li43ODZlNDE0IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvcmVnLmgKKysrIGIvbmV0L3dpcmVsZXNzL3JlZy5oCkBAIC01LDYgKzUsNyBAQAogCiBib29sIGlzX3dvcmxkX3JlZ2RvbShjb25zdCBjaGFyICphbHBoYTIpOwogYm9vbCByZWdfaXNfdmFsaWRfcmVxdWVzdChjb25zdCBjaGFyICphbHBoYTIpOworYm9vbCByZWdfc3VwcG9ydGVkX2Rmc19yZWdpb24odTggZGZzX3JlZ2lvbik7CiAKIGludCByZWd1bGF0b3J5X2hpbnRfdXNlcihjb25zdCBjaGFyICphbHBoYTIpOwogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvc2Nhbi5jIGIvbmV0L3dpcmVsZXNzL3NjYW4uYwppbmRleCBkYzIzYjMxLi4zMTExOWUzIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvc2Nhbi5jCisrKyBiL25ldC93aXJlbGVzcy9zY2FuLmMKQEAgLTM1NSw4ICszNTUsOCBAQAogCSAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9tZXNoY29uZl9pZSkgLSAyKSA9PSAwOwogfQogCi1zdGF0aWMgaW50IGNtcF9ic3Moc3RydWN0IGNmZzgwMjExX2JzcyAqYSwKLQkJICAgc3RydWN0IGNmZzgwMjExX2JzcyAqYikKK3N0YXRpYyBpbnQgY21wX2Jzc19jb3JlKHN0cnVjdCBjZmc4MDIxMV9ic3MgKmEsCisJCQlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpiKQogewogCWludCByOwogCkBAIC0zNzgsNyArMzc4LDE1IEBACiAJCQkgICAgICAgYi0+bGVuX2luZm9ybWF0aW9uX2VsZW1lbnRzKTsKIAl9CiAKLQlyID0gbWVtY21wKGEtPmJzc2lkLCBiLT5ic3NpZCwgRVRIX0FMRU4pOworCXJldHVybiBtZW1jbXAoYS0+YnNzaWQsIGItPmJzc2lkLCBFVEhfQUxFTik7Cit9CisKK3N0YXRpYyBpbnQgY21wX2JzcyhzdHJ1Y3QgY2ZnODAyMTFfYnNzICphLAorCQkgICBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpiKQoreworCWludCByOworCisJciA9IGNtcF9ic3NfY29yZShhLCBiKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTM4OSw2ICszOTcsNTIgQEAKIAkJICAgICAgIGItPmxlbl9pbmZvcm1hdGlvbl9lbGVtZW50cyk7CiB9CiAKK3N0YXRpYyBpbnQgY21wX2hpZGRlbl9ic3Moc3RydWN0IGNmZzgwMjExX2JzcyAqYSwKKwkJICAgc3RydWN0IGNmZzgwMjExX2JzcyAqYikKK3sKKwljb25zdCB1OCAqaWUxOworCWNvbnN0IHU4ICppZTI7CisJaW50IGk7CisJaW50IHI7CisKKwlyID0gY21wX2Jzc19jb3JlKGEsIGIpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWllMSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfU1NJRCwKKwkJCWEtPmluZm9ybWF0aW9uX2VsZW1lbnRzLAorCQkJYS0+bGVuX2luZm9ybWF0aW9uX2VsZW1lbnRzKTsKKwlpZTIgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NTSUQsCisJCQliLT5pbmZvcm1hdGlvbl9lbGVtZW50cywKKwkJCWItPmxlbl9pbmZvcm1hdGlvbl9lbGVtZW50cyk7CisKKwkvKiBLZXkgY29tcGFyYXRvciBtdXN0IHVzZSBzYW1lIGFsZ29yaXRobSBpbiBhbnkgcmItdHJlZQorCSAqIHNlYXJjaCBmdW5jdGlvbiAob3JkZXIgaXMgaW1wb3J0YW50KSwgb3RoZXJ3aXNlIG9yZGVyaW5nCisJICogb2YgaXRlbXMgaW4gdGhlIHRyZWUgaXMgYnJva2VuIGFuZCBzZWFyY2ggZ2l2ZXMgaW5jb3JyZWN0CisJICogcmVzdWx0cy4gVGhpcyBjb2RlIHVzZXMgc2FtZSBvcmRlciBhcyBjbXBfaWVzKCkgZG9lcy4gKi8KKworCS8qIHNvcnQgbWlzc2luZyBJRSBiZWZvcmUgKGxlZnQgb2YpIHByZXNlbnQgSUUgKi8KKwlpZiAoIWllMSkKKwkJcmV0dXJuIC0xOworCWlmICghaWUyKQorCQlyZXR1cm4gMTsKKworCS8qIHplcm8tc2l6ZSBTU0lEIGlzIHVzZWQgYXMgYW4gaW5kaWNhdGlvbiBvZiB0aGUgaGlkZGVuIGJzcyAqLworCWlmICghaWUyWzFdKQorCQlyZXR1cm4gMDsKKworCS8qIHNvcnQgYnkgbGVuZ3RoIGZpcnN0LCB0aGVuIGJ5IGNvbnRlbnRzICovCisJaWYgKGllMVsxXSAhPSBpZTJbMV0pCisJCXJldHVybiBpZTJbMV0gLSBpZTFbMV07CisKKwkvKiB6ZXJvZWQgU1NJRCBpZSBpcyBhbm90aGVyIGluZGljYXRpb24gb2YgYSBoaWRkZW4gYnNzICovCisJZm9yIChpID0gMDsgaSA8IGllMlsxXTsgaSsrKQorCQlpZiAoaWUyW2kgKyAyXSkKKwkJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCiBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpjZmc4MDIxMV9nZXRfYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAogCQkJCSAgICAgIGNvbnN0IHU4ICpic3NpZCwKQEAgLTUwNSw2ICs1NTksNDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKgorcmJfZmluZF9oaWRkZW5fYnNzKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2LAorCSAgICBzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpyZXMpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSBkZXYtPmJzc190cmVlLnJiX25vZGU7CisJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqYnNzOworCWludCByOworCisJd2hpbGUgKG4pIHsKKwkJYnNzID0gcmJfZW50cnkobiwgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcywgcmJuKTsKKwkJciA9IGNtcF9oaWRkZW5fYnNzKCZyZXMtPnB1YiwgJmJzcy0+cHViKTsKKworCQlpZiAociA9PSAwKQorCQkJcmV0dXJuIGJzczsKKwkJZWxzZSBpZiAociA8IDApCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY29weV9oaWRkZW5faWVzKHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKnJlcywKKwkJIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmhpZGRlbikKK3sKKwlpZiAodW5saWtlbHkocmVzLT5wdWIuYmVhY29uX2llcykpCisJCXJldHVybjsKKwlpZiAoV0FSTl9PTighaGlkZGVuLT5wdWIuYmVhY29uX2llcykpCisJCXJldHVybjsKKworCXJlcy0+cHViLmJlYWNvbl9pZXMgPSBrbWFsbG9jKGhpZGRlbi0+cHViLmxlbl9iZWFjb25faWVzLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoIXJlcy0+cHViLmJlYWNvbl9pZXMpKQorCQlyZXR1cm47CisKKwlyZXMtPmJlYWNvbl9pZXNfYWxsb2NhdGVkID0gdHJ1ZTsKKwlyZXMtPnB1Yi5sZW5fYmVhY29uX2llcyA9IGhpZGRlbi0+cHViLmxlbl9iZWFjb25faWVzOworCW1lbWNweShyZXMtPnB1Yi5iZWFjb25faWVzLCBoaWRkZW4tPnB1Yi5iZWFjb25faWVzLAorCQkJcmVzLT5wdWIubGVuX2JlYWNvbl9pZXMpOworfQorCitzdGF0aWMgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqCiBjZmc4MDIxMV9ic3NfdXBkYXRlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2LAogCQkgICAgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqcmVzKQogewpAQCAtNjA3LDYgKzcwMywyMSBAQAogCiAJCWtyZWZfcHV0KCZyZXMtPnJlZiwgYnNzX3JlbGVhc2UpOwogCX0gZWxzZSB7CisJCXN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmhpZGRlbjsKKworCQkvKiBGaXJzdCBjaGVjayBpZiB0aGUgYmVhY29uIGlzIGEgcHJvYmUgcmVzcG9uc2UgZnJvbQorCQkgKiBhIGhpZGRlbiBic3MuIElmIHNvLCBjb3B5IGJlYWNvbiBpZXMgKHdpdGggbnVsbGlmaWVkCisJCSAqIHNzaWQpIGludG8gdGhlIHByb2JlIHJlc3BvbnNlIGJzcyBlbnRyeSAod2l0aCByZWFsIHNzaWQpLgorCQkgKiBJdCBpcyByZXF1aXJlZCBiYXNpY2FsbHkgZm9yIFBTTSBpbXBsZW1lbnRhdGlvbgorCQkgKiAocHJvYmUgcmVzcG9uc2VzIGRvIG5vdCBjb250YWluIHRpbSBpZSkgKi8KKworCQkvKiBUT0RPOiBUaGUgY29kZSBpcyBub3QgdHJ5aW5nIHRvIHVwZGF0ZSBleGlzdGluZyBwcm9iZQorCQkgKiByZXNwb25zZSBic3MgZW50cmllcyB3aGVuIGJlYWNvbiBpZXMgYXJlCisJCSAqIGdldHRpbmcgY2hhbmdlZC4gKi8KKwkJaGlkZGVuID0gcmJfZmluZF9oaWRkZW5fYnNzKGRldiwgcmVzKTsKKwkJaWYgKGhpZGRlbikKKwkJCWNvcHlfaGlkZGVuX2llcyhyZXMsIGhpZGRlbik7CisKIAkJLyogdGhpcyAiY29uc3VtZXMiIHRoZSByZWZlcmVuY2UgKi8KIAkJbGlzdF9hZGRfdGFpbCgmcmVzLT5saXN0LCAmZGV2LT5ic3NfbGlzdCk7CiAJCXJiX2luc2VydF9ic3MoZGV2LCByZXMpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NtZS5jIGIvbmV0L3dpcmVsZXNzL3NtZS5jCmluZGV4IDZlODZkNWEuLmYwYzkwMGMgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zbWUuYworKysgYi9uZXQvd2lyZWxlc3Mvc21lLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KQEAgLTE4OSw3ICsxOTAsOSBAQAogCQkJCQkgICAgcHJldl9ic3NpZCwKIAkJCQkJICAgIHBhcmFtcy0+c3NpZCwgcGFyYW1zLT5zc2lkX2xlbiwKIAkJCQkJICAgIHBhcmFtcy0+aWUsIHBhcmFtcy0+aWVfbGVuLAotCQkJCQkgICAgZmFsc2UsICZwYXJhbXMtPmNyeXB0byk7CisJCQkJCSAgICBmYWxzZSwgJnBhcmFtcy0+Y3J5cHRvLAorCQkJCQkgICAgcGFyYW1zLT5mbGFncywgJnBhcmFtcy0+aHRfY2FwYSwKKwkJCQkJICAgICZwYXJhbXMtPmh0X2NhcGFfbWFzayk7CiAJCWlmIChlcnIpCiAJCQlfX2NmZzgwMjExX21sbWVfZGVhdXRoKHJkZXYsIHdkZXYtPm5ldGRldiwgcGFyYW1zLT5ic3NpZCwKIAkJCQkJICAgICAgIE5VTEwsIDAsCkBAIC03NzMsNiArNzc2LDkgQEAKIAkJd2Rldi0+Y29ubmVjdF9rZXlzID0gTlVMTDsKIAl9CiAKKwljZmc4MDIxMV9vcGVyX2FuZF9odF9jYXBhKCZjb25uZWN0LT5odF9jYXBhX21hc2ssCisJCQkJICByZGV2LT53aXBoeS5odF9jYXBhX21vZF9tYXNrKTsKKwogCWlmIChjb25ua2V5cyAmJiBjb25ua2V5cy0+ZGVmID49IDApIHsKIAkJaW50IGlkeDsKIAkJdTMyIGNpcGhlcjsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy91dGlsLmMgYi9uZXQvd2lyZWxlc3MvdXRpbC5jCmluZGV4IDJmMTc4ZjcuLjljNjAxZDUgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy91dGlsLmMKKysrIGIvbmV0L3dpcmVsZXNzL3V0aWwuYwpAQCAtMywxMCArMywxMCBAQAogICoKICAqIENvcHlyaWdodCAyMDA3LTIwMDkJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KICAqLworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSAiY29yZS5oIgpAQCAtMjM5LDE3ICsyMzksNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbiAqLwotLyogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykgKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSBfX2FsaWduZWQoMikgPQotCXsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OwotRVhQT1JUX1NZTUJPTChyZmMxMDQyX2hlYWRlcik7Ci0KLS8qIEJyaWRnZS1UdW5uZWwgaGVhZGVyIChmb3IgRXRoZXJUeXBlcyBFVEhfUF9BQVJQIGFuZCBFVEhfUF9JUFgpICovCi1jb25zdCB1bnNpZ25lZCBjaGFyIGJyaWRnZV90dW5uZWxfaGVhZGVyW10gX19hbGlnbmVkKDIpID0KLQl7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjggfTsKLUVYUE9SVF9TWU1CT0woYnJpZGdlX3R1bm5lbF9oZWFkZXIpOwotCiB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfY29uc3RfXyBpZWVlODAyMTFfaGRybGVuKF9fbGUxNiBmYykKIHsKIAl1bnNpZ25lZCBpbnQgaGRybGVuID0gMjQ7CkBAIC0xMDUwLDE2OSArMTAzOSwxMyBAQAogCXJldHVybiAwOwogfQogCi11MzIgaWVlZTgwMl8xMV9wYXJzZV9lbGVtc19jcmModTggKnN0YXJ0LCBzaXplX3QgbGVuLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcywKLQkJCSAgICAgICB1NjQgZmlsdGVyLCB1MzIgY3JjKQotewotCXNpemVfdCBsZWZ0ID0gbGVuOwotCXU4ICpwb3MgPSBzdGFydDsKLQlib29sIGNhbGNfY3JjID0gZmlsdGVyICE9IDA7CisvKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbiAqLworLyogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSBfX2FsaWduZWQoMikgPQorCXsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworRVhQT1JUX1NZTUJPTChyZmMxMDQyX2hlYWRlcik7CiAKLQltZW1zZXQoZWxlbXMsIDAsIHNpemVvZigqZWxlbXMpKTsKLQllbGVtcy0+aWVfc3RhcnQgPSBzdGFydDsKLQllbGVtcy0+dG90YWxfbGVuID0gbGVuOwotCi0Jd2hpbGUgKGxlZnQgPj0gMikgewotCQl1OCBpZCwgZWxlbjsKLQotCQlpZCA9ICpwb3MrKzsKLQkJZWxlbiA9ICpwb3MrKzsKLQkJbGVmdCAtPSAyOwotCi0JCWlmIChlbGVuID4gbGVmdCkKLQkJCWJyZWFrOwotCi0JCWlmIChjYWxjX2NyYyAmJiBpZCA8IDY0ICYmIChmaWx0ZXIgJiAoMVVMTCA8PCBpZCkpKQotCQkJY3JjID0gY3JjMzJfYmUoY3JjLCBwb3MgLSAyLCBlbGVuICsgMik7Ci0KLQkJc3dpdGNoIChpZCkgewotCQljYXNlIFdMQU5fRUlEX1NTSUQ6Ci0JCQllbGVtcy0+c3NpZCA9IHBvczsKLQkJCWVsZW1zLT5zc2lkX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgotCQkJZWxlbXMtPnN1cHBfcmF0ZXMgPSBwb3M7Ci0JCQllbGVtcy0+c3VwcF9yYXRlc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfRkhfUEFSQU1TOgotCQkJZWxlbXMtPmZoX3BhcmFtcyA9IHBvczsKLQkJCWVsZW1zLT5maF9wYXJhbXNfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0RTX1BBUkFNUzoKLQkJCWVsZW1zLT5kc19wYXJhbXMgPSBwb3M7Ci0JCQllbGVtcy0+ZHNfcGFyYW1zX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9DRl9QQVJBTVM6Ci0JCQllbGVtcy0+Y2ZfcGFyYW1zID0gcG9zOwotCQkJZWxlbXMtPmNmX3BhcmFtc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfVElNOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdGltX2llKSkgewotCQkJCWVsZW1zLT50aW0gPSAodm9pZCAqKXBvczsKLQkJCQllbGVtcy0+dGltX2xlbiA9IGVsZW47Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9JQlNTX1BBUkFNUzoKLQkJCWVsZW1zLT5pYnNzX3BhcmFtcyA9IHBvczsKLQkJCWVsZW1zLT5pYnNzX3BhcmFtc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfQ0hBTExFTkdFOgotCQkJZWxlbXMtPmNoYWxsZW5nZSA9IHBvczsKLQkJCWVsZW1zLT5jaGFsbGVuZ2VfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCWlmIChlbGVuID49IDQgJiYgcG9zWzBdID09IDB4MDAgJiYgcG9zWzFdID09IDB4NTAgJiYKLQkJCSAgICBwb3NbMl0gPT0gMHhmMikgewotCQkJCS8qIE1pY3Jvc29mdCBPVUkgKDAwOjUwOkYyKSAqLwotCi0JCQkJaWYgKGNhbGNfY3JjKQotCQkJCQljcmMgPSBjcmMzMl9iZShjcmMsIHBvcyAtIDIsIGVsZW4gKyAyKTsKLQotCQkJCWlmIChwb3NbM10gPT0gMSkgewotCQkJCQkvKiBPVUkgVHlwZSAxIC0gV1BBIElFICovCi0JCQkJCWVsZW1zLT53cGEgPSBwb3M7Ci0JCQkJCWVsZW1zLT53cGFfbGVuID0gZWxlbjsKLQkJCQl9IGVsc2UgaWYgKGVsZW4gPj0gNSAmJiBwb3NbM10gPT0gMikgewotCQkJCQkvKiBPVUkgVHlwZSAyIC0gV01NIElFICovCi0JCQkJCWlmIChwb3NbNF0gPT0gMCkgewotCQkJCQkJZWxlbXMtPndtbV9pbmZvID0gcG9zOwotCQkJCQkJZWxlbXMtPndtbV9pbmZvX2xlbiA9IGVsZW47Ci0JCQkJCX0gZWxzZSBpZiAocG9zWzRdID09IDEpIHsKLQkJCQkJCWVsZW1zLT53bW1fcGFyYW0gPSBwb3M7Ci0JCQkJCQllbGVtcy0+d21tX3BhcmFtX2xlbiA9IGVsZW47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9SU046Ci0JCQllbGVtcy0+cnNuID0gcG9zOwotCQkJZWxlbXMtPnJzbl9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfRVJQX0lORk86Ci0JCQllbGVtcy0+ZXJwX2luZm8gPSBwb3M7Ci0JCQllbGVtcy0+ZXJwX2luZm9fbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTOgotCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzID0gcG9zOwotCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSkKLQkJCQllbGVtcy0+aHRfY2FwX2VsZW0gPSAodm9pZCAqKXBvczsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0hUX0lORk9STUFUSU9OOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpCi0JCQkJZWxlbXMtPmh0X2luZm9fZWxlbSA9ICh2b2lkICopcG9zOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfTUVTSF9JRDoKLQkJCWVsZW1zLT5tZXNoX2lkID0gcG9zOwotCQkJZWxlbXMtPm1lc2hfaWRfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX01FU0hfQ09ORklHOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUpKQotCQkJCWVsZW1zLT5tZXNoX2NvbmZpZyA9ICh2b2lkICopcG9zOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUEVFUl9NR01UOgotCQkJZWxlbXMtPnBlZXJpbmcgPSBwb3M7Ci0JCQllbGVtcy0+cGVlcmluZ19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUFJFUToKLQkJCWVsZW1zLT5wcmVxID0gcG9zOwotCQkJZWxlbXMtPnByZXFfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1BSRVA6Ci0JCQllbGVtcy0+cHJlcCA9IHBvczsKLQkJCWVsZW1zLT5wcmVwX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9QRVJSOgotCQkJZWxlbXMtPnBlcnIgPSBwb3M7Ci0JCQllbGVtcy0+cGVycl9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUkFOTjoKLQkJCWlmIChlbGVuID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Jhbm5faWUpKQotCQkJCWVsZW1zLT5yYW5uID0gKHZvaWQgKilwb3M7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9DSEFOTkVMX1NXSVRDSDoKLQkJCWVsZW1zLT5jaF9zd2l0Y2hfZWxlbSA9IHBvczsKLQkJCWVsZW1zLT5jaF9zd2l0Y2hfZWxlbV9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUVVJRVQ6Ci0JCQlpZiAoIWVsZW1zLT5xdWlldF9lbGVtKSB7Ci0JCQkJZWxlbXMtPnF1aWV0X2VsZW0gPSBwb3M7Ci0JCQkJZWxlbXMtPnF1aWV0X2VsZW1fbGVuID0gZWxlbjsKLQkJCX0KLQkJCWVsZW1zLT5udW1fb2ZfcXVpZXRfZWxlbSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfQ09VTlRSWToKLQkJCWVsZW1zLT5jb3VudHJ5X2VsZW0gPSBwb3M7Ci0JCQllbGVtcy0+Y291bnRyeV9lbGVtX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9QV1JfQ09OU1RSQUlOVDoKLQkJCWVsZW1zLT5wd3JfY29uc3RyX2VsZW0gPSBwb3M7Ci0JCQllbGVtcy0+cHdyX2NvbnN0cl9lbGVtX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9USU1FT1VUX0lOVEVSVkFMOgotCQkJZWxlbXMtPnRpbWVvdXRfaW50ID0gcG9zOwotCQkJZWxlbXMtPnRpbWVvdXRfaW50X2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJbGVmdCAtPSBlbGVuOwotCQlwb3MgKz0gZWxlbjsKLQl9Ci0KLQlyZXR1cm4gY3JjOwotfQotRVhQT1JUX1NZTUJPTChpZWVlODAyXzExX3BhcnNlX2VsZW1zX2NyYyk7CisvKiBCcmlkZ2UtVHVubmVsIGhlYWRlciAoZm9yIEV0aGVyVHlwZXMgRVRIX1BfQUFSUCBhbmQgRVRIX1BfSVBYKSAqLworY29uc3QgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdIF9fYWxpZ25lZCgyKSA9CisJeyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07CitFWFBPUlRfU1lNQk9MKGJyaWRnZV90dW5uZWxfaGVhZGVyKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKaW5kZXggNjJmMTIxZC4uM2MyNGViOSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKQEAgLTgsNiArOCw3IEBACiAgKiBDb3B5cmlnaHQgMjAwOC0yMDA5CUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbmw4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgpAQCAtODE4LDEyICs4MTksMjQgQEAKIAkJCQkgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAKIAlzd2l0Y2ggKHdkZXYtPmlmdHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJcmV0dXJuIGNmZzgwMjExX21nZF93ZXh0X2dpd2ZyZXEoZGV2LCBpbmZvLCBmcmVxLCBleHRyYSk7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJcmV0dXJuIGNmZzgwMjExX2lic3Nfd2V4dF9naXdmcmVxKGRldiwgaW5mbywgZnJlcSwgZXh0cmEpOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwkJaWYgKCFyZGV2LT5vcHMtPmdldF9jaGFubmVsKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2hhbiA9IHJkZXYtPm9wcy0+Z2V0X2NoYW5uZWwod2Rldi0+d2lwaHkpOworCQlpZiAoIWNoYW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZnJlcS0+bSA9IGNoYW4tPmNlbnRlcl9mcmVxOworCQlmcmVxLT5lID0gNjsKKwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJaWYgKCF3ZGV2LT5jaGFubmVsKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb3JlLmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC1jb3JlLmMKaW5kZXggZmRiYzIzYy4uMGFmN2Y1NCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtY29yZS5jCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LWNvcmUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYyBiL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jCmluZGV4IDBkNGI4YzMuLjMyNjc1MGIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jCkBAIC01LDYgKzUsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA5ICAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQtc3B5LmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zcHkuYwppbmRleCA2ZGNmZTY1Li41ZDY0M2E1IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvd2V4dC1zcHkuYworKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zcHkuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KICNpbmNsdWRlIDxuZXQvd2V4dC5oPgpkaWZmIC0tZ2l0IGEvbmV0L3gyNS9hZl94MjUuYyBiL25ldC94MjUvYWZfeDI1LmMKaW5kZXggNWYwM2U0ZS4uM2UxNmM2YSAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC0xMjYxLDE0ICsxMjYxLDE5IEBACiAJc3RydWN0IHgyNV9zb2NrICp4MjUgPSB4MjVfc2soc2spOwogCXN0cnVjdCBzb2NrYWRkcl94MjUgKnN4MjUgPSAoc3RydWN0IHNvY2thZGRyX3gyNSAqKW1zZy0+bXNnX25hbWU7CiAJc2l6ZV90IGNvcGllZDsKLQlpbnQgcWJpdCwgaGVhZGVyX2xlbiA9IHgyNS0+bmVpZ2hib3VyLT5leHRlbmRlZCA/Ci0JCVgyNV9FWFRfTUlOX0xFTiA6IFgyNV9TVERfTUlOX0xFTjsKLQorCWludCBxYml0LCBoZWFkZXJfbGVuOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgY2hhciAqYXNtcHRyOwogCWludCByYyA9IC1FTk9UQ09OTjsKIAogCWxvY2tfc29jayhzayk7CisKKwlpZiAoeDI1LT5uZWlnaGJvdXIgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwloZWFkZXJfbGVuID0geDI1LT5uZWlnaGJvdXItPmV4dGVuZGVkID8KKwkJWDI1X0VYVF9NSU5fTEVOIDogWDI1X1NURF9NSU5fTEVOOworCiAJLyoKIAkgKiBUaGlzIHdvcmtzIGZvciBzZXFwYWNrZXQgdG9vLiBUaGUgcmVjZWl2ZXIgaGFzIG9yZGVyZWQgdGhlIHF1ZXVlIGZvcgogCSAqIHVzISBXZSBkbyBvbmUgcXVpY2sgY2hlY2sgZmlyc3QgdGhvdWdoCmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9wcm9jLmMgYi9uZXQveDI1L3gyNV9wcm9jLmMKaW5kZXggN2ZmMzczNy4uMmZmZGU0NiAxMDA2NDQKLS0tIGEvbmV0L3gyNS94MjVfcHJvYy5jCisrKyBiL25ldC94MjUveDI1X3Byb2MuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3gyNS5oPgpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wcm9jLmMgYi9uZXQveGZybS94ZnJtX3Byb2MuYwppbmRleCA1OGQ5YWUwLi5kMGExYWY4IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3Byb2MuYworKysgYi9uZXQveGZybS94ZnJtX3Byb2MuYwpAQCAtMTIsNiArMTIsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NubXAuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgogCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3JlcGxheS5jIGIvbmV0L3hmcm0veGZybV9yZXBsYXkuYwppbmRleCA2Y2EzNTc0Li4zOWUwMmM1IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3JlcGxheS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAKIHUzMiB4ZnJtX3JlcGxheV9zZXFoaShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgX19iZTMyIG5ldF9zZXEpCmRpZmYgLS1naXQgYS9zYW1wbGVzL0tjb25maWcgYi9zYW1wbGVzL0tjb25maWcKaW5kZXggOTZhNzU3Mi4uNDEwNjNlNyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9LY29uZmlnCisrKyBiL3NhbXBsZXMvS2NvbmZpZwpAQCAtNjEsMTAgKzYxLDQgQEAKIAkgIEJ1aWxkIGFuIGV4YW1wbGUgb2YgaG93IHRvIGR5bmFtaWNhbGx5IGFkZCB0aGUgaGVsbG8KIAkgIGNvbW1hbmQgdG8gdGhlIGtkYiBzaGVsbC4KIAotY29uZmlnIFNBTVBMRV9ISURSQVcKLQlib29sICJCdWlsZCBzaW1wbGUgaGlkcmF3IGV4YW1wbGUiCi0JZGVwZW5kcyBvbiBISURSQVcgJiYgSEVBREVSU19DSEVDSwotCWhlbHAKLQkgIEJ1aWxkIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBoaWRyYXcgZnJvbSB1c2Vyc3BhY2UuCi0KIGVuZGlmICMgU0FNUExFUwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKaW5kZXggYTBmZDUwMi4uZDJiMzY2YzEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZApAQCAtNDYsNyArNDYsNyBAQAogIyBJZiB0aGUgc2F2ZS0qIHZhcmlhYmxlcyBjaGFuZ2VkIGVycm9yIG91dAogaWZlcSAoJChLQlVJTERfTk9QRURBTlRJQyksKQogICAgICAgICBpZm5lcSAoIiQoc2F2ZS1jZmxhZ3MpIiwiJChDRkxBR1MpIikKLSAgICAgICAgICAgICAgICAkKGVycm9yIENGTEFHUyB3YXMgY2hhbmdlZCBpbiAiJChrYnVpbGQtZmlsZSkiLiBGaXggaXQgdG8gdXNlIEVYVFJBX0NGTEFHUykKKyAgICAgICAgICAgICAgICAkKGVycm9yIENGTEFHUyB3YXMgY2hhbmdlZCBpbiAiJChrYnVpbGQtZmlsZSkiLiBGaXggaXQgdG8gdXNlIGNjZmxhZ3MteSkKICAgICAgICAgZW5kaWYKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubGliIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKaW5kZXggYWVlYTg0YS4uNWQ5ODZkOSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5saWIKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKQEAgLTE2Nyw2ICsxNjcsNyBAQAogcXVpZXRfY21kX2dwZXJmID0gR1BFUkYgJEAKICAgICAgIGNtZF9ncGVyZiA9IGdwZXJmIC10IC0tb3V0cHV0LWZpbGUgJEAgLWEgLUMgLUUgLWcgLWsgMSwzLCQkIC1wIC10ICQ8CiAKKy5QUkVDSU9VUzogJChzcmMpLyUuaGFzaC5jX3NoaXBwZWQKICQoc3JjKS8lLmhhc2guY19zaGlwcGVkOiAkKHNyYykvJS5ncGVyZgogCSQoY2FsbCBjbWQsZ3BlcmYpCiAKQEAgLTE3Nyw2ICsxNzgsNyBAQAogcXVpZXRfY21kX2ZsZXggPSBMRVggICAgICRACiAgICAgICBjbWRfZmxleCA9IGZsZXggLW8kQCAtTCAtUCAkKExFWF9QUkVGSVgpICQ8CiAKKy5QUkVDSU9VUzogJChzcmMpLyUubGV4LmNfc2hpcHBlZAogJChzcmMpLyUubGV4LmNfc2hpcHBlZDogJChzcmMpLyUubAogCSQoY2FsbCBjbWQsZmxleCkKIApAQCAtMTg3LDEyICsxODksMTQgQEAKIHF1aWV0X2NtZF9iaXNvbiA9IFlBQ0MgICAgJEAKICAgICAgIGNtZF9iaXNvbiA9IGJpc29uIC1vJEAgLXQgLWwgLXAgJChZQUNDX1BSRUZJWCkgJDwKIAorLlBSRUNJT1VTOiAkKHNyYykvJS50YWIuY19zaGlwcGVkCiAkKHNyYykvJS50YWIuY19zaGlwcGVkOiAkKHNyYykvJS55CiAJJChjYWxsIGNtZCxiaXNvbikKIAogcXVpZXRfY21kX2Jpc29uX2ggPSBZQUNDICAgICRACiAgICAgICBjbWRfYmlzb25faCA9IGJpc29uIC1vL2Rldi9udWxsIC0tZGVmaW5lcz0kQCAtdCAtbCAtcCAkKFlBQ0NfUFJFRklYKSAkPAogCisuUFJFQ0lPVVM6ICQoc3JjKS8lLnRhYi5oX3NoaXBwZWQKICQoc3JjKS8lLnRhYi5oX3NoaXBwZWQ6ICQoc3JjKS8lLnkKIAkkKGNhbGwgY21kLGJpc29uX2gpCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCmluZGV4IDI5MTIyOGUuLmNiMWY1MGMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKKysrIGIvc2NyaXB0cy9iYXNpYy9maXhkZXAuYwpAQCAtMzQ1LDYgKzM0NSw3IEBACiAJCW1lbWNweShzLCBtLCBwLW0pOyBzW3AtbV0gPSAwOwogCQlpZiAoc3RycmNtcChzLCAiaW5jbHVkZS9nZW5lcmF0ZWQvYXV0b2NvbmYuaCIpICYmCiAJCSAgICBzdHJyY21wKHMsICJhcmNoL3VtL2luY2x1ZGUvdW1sLWNvbmZpZy5oIikgJiYKKwkJICAgIHN0cnJjbXAocywgImluY2x1ZGUvbGludXgva2NvbmZpZy5oIikgJiYKIAkJICAgIHN0cnJjbXAocywgIi52ZXIiKSkgewogCQkJLyoKIAkJCSAqIERvIG5vdCBsaXN0IHRoZSBzb3VyY2UgZmlsZSBhcyBkZXBlbmRlbmN5LCBzbyB0aGF0CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggMGIzZTM1Yy4uOGZkYTNiMyAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtMjQwLDkgKzI0MCw4IEBACiBvdXIgJFR5cGU7CiBvdXIgJERlY2xhcmU7CiAKLW91ciAkVVRGOAk9IHFyIHsKLQlbXHgwOVx4MEFceDBEXHgyMC1ceDdFXSAgICAgICAgICAgICAgIyBBU0NJSQotCXwgW1x4QzItXHhERl1bXHg4MC1ceEJGXSAgICAgICAgICAgICAjIG5vbi1vdmVybG9uZyAyLWJ5dGUKK291ciAkTk9OX0FTQ0lJX1VURjgJPSBxcnsKKwlbXHhDMi1ceERGXVtceDgwLVx4QkZdICAgICAgICAgICAgICAgIyBub24tb3ZlcmxvbmcgMi1ieXRlCiAJfCAgXHhFMFtceEEwLVx4QkZdW1x4ODAtXHhCRl0gICAgICAgICMgZXhjbHVkaW5nIG92ZXJsb25ncwogCXwgW1x4RTEtXHhFQ1x4RUVceEVGXVtceDgwLVx4QkZdezJ9ICAjIHN0cmFpZ2h0IDMtYnl0ZQogCXwgIFx4RURbXHg4MC1ceDlGXVtceDgwLVx4QkZdICAgICAgICAjIGV4Y2x1ZGluZyBzdXJyb2dhdGVzCkBAIC0yNTEsNiArMjUwLDExIEBACiAJfCAgXHhGNFtceDgwLVx4OEZdW1x4ODAtXHhCRl17Mn0gICAgICMgcGxhbmUgMTYKIH14OwogCitvdXIgJFVURjgJPSBxcnsKKwlbXHgwOVx4MEFceDBEXHgyMC1ceDdFXSAgICAgICAgICAgICAgIyBBU0NJSQorCXwgJE5PTl9BU0NJSV9VVEY4Cit9eDsKKwogb3VyICR0eXBlVHlwZWRlZnMgPSBxcnsoP3g6CiAJKD86X18pPyg/OnV8c3xiZXxsZSkoPzo4fDE2fDMyfDY0KXwKIAlhdG9taWNfdApAQCAtMTMzMCw2ICsxMzM0LDkgQEAKIAlteSAkc2lnbm9mZiA9IDA7CiAJbXkgJGlzX3BhdGNoID0gMDsKIAorCW15ICRpbl9oZWFkZXJfbGluZXMgPSAxOworCW15ICRpbl9jb21taXRfbG9nID0gMDsJCSNTY2FubmluZyBsaW5lcyBiZWZvcmUgcGF0Y2gKKwogCW91ciBAcmVwb3J0ID0gKCk7CiAJb3VyICRjbnRfbGluZXMgPSAwOwogCW91ciAkY250X2Vycm9yID0gMDsKQEAgLTE0OTcsNyArMTUwNCw2IEBACiAJCWlmICgkbGluZSA9fiAvXmRpZmYgLS1naXQuKj8oXFMrKSQvKSB7CiAJCQkkcmVhbGZpbGUgPSAkMTsKIAkJCSRyZWFsZmlsZSA9fiBzQF4oW14vXSopL0BAOwotCiAJCX0gZWxzaWYgKCRsaW5lID1+IC9eXCtcK1wrXHMrKFxTKykvKSB7CiAJCQkkcmVhbGZpbGUgPSAkMTsKIAkJCSRyZWFsZmlsZSA9fiBzQF4oW14vXSopL0BAOwpAQCAtMTUzNiw2ICsxNTQyLDcgQEAKICMgQ2hlY2sgdGhlIHBhdGNoIGZvciBhIHNpZ25vZmY6CiAJCWlmICgkbGluZSA9fiAvXlxzKnNpZ25lZC1vZmYtYnk6L2kpIHsKIAkJCSRzaWdub2ZmKys7CisJCQkkaW5fY29tbWl0X2xvZyA9IDA7CiAJCX0KIAogIyBDaGVjayBzaWduYXR1cmUgc3R5bGVzCkBAIC0xNjEzLDYgKzE2MjAsMjEgQEAKIAkJCSAgICAiSW52YWxpZCBVVEYtOCwgcGF0Y2ggYW5kIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBiZSBlbmNvZGVkIGluIFVURi04XG4iIC4gJGhlcmVwdHIpOwogCQl9CiAKKyMgQ2hlY2sgaWYgaXQncyB0aGUgc3RhcnQgb2YgYSBjb21taXQgbG9nCisjIChub3QgYSBoZWFkZXIgbGluZSBhbmQgd2UgaGF2ZW4ndCBzZWVuIHRoZSBwYXRjaCBmaWxlbmFtZSkKKwkJaWYgKCRpbl9oZWFkZXJfbGluZXMgJiYgJHJlYWxmaWxlID1+IC9eJC8gJiYKKwkJICAgICRyYXdsaW5lICF+IC9eKGNvbW1pdFxifGZyb21cYnxcdys6KS4rJC9pKSB7CisJCQkkaW5faGVhZGVyX2xpbmVzID0gMDsKKwkJCSRpbl9jb21taXRfbG9nID0gMTsKKwkJfQorCisjIFN0aWxsIG5vdCB5ZXQgaW4gYSBwYXRjaCwgY2hlY2sgZm9yIGFueSBVVEYtOAorCQlpZiAoJGluX2NvbW1pdF9sb2cgJiYgJHJlYWxmaWxlID1+IC9eJC8gJiYKKwkJICAgICRyYXdsaW5lID1+IC8kTk9OX0FTQ0lJX1VURjgvKSB7CisJCQlDSEsoIlVURjhfQkVGT1JFX1BBVENIIiwKKwkJCSAgICAiOC1iaXQgVVRGLTggdXNlZCBpbiBwb3NzaWJsZSBjb21taXQgbG9nXG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCiAjIGlnbm9yZSBub24taHVuayBsaW5lcyBhbmQgbGluZXMgYmVpbmcgcmVtb3ZlZAogCQluZXh0IGlmICghJGh1bmtfbGluZSB8fCAkbGluZSA9fiAvXi0vKTsKIApAQCAtMTY2MSw2ICsxNjgzLDIwIEBACiAJCQkjcHJpbnQgImlzX2VuZDwkaXNfZW5kPiBsZW5ndGg8JGxlbmd0aD5cbiI7CiAJCX0KIAorCQlpZiAoKCRyZWFsZmlsZSA9fiAvTWFrZWZpbGUuKi8gfHwgJHJlYWxmaWxlID1+IC9LYnVpbGQuKi8pICYmCisJCSAgICAoJGxpbmUgPX4gL1wrKEVYVFJBX1tBLVpdK0ZMQUdTKS4qLykpIHsKKwkJCW15ICRmbGFnID0gJDE7CisJCQlteSAkcmVwbGFjZW1lbnQgPSB7CisJCQkJJ0VYVFJBX0FGTEFHUycgPT4gICAnYXNmbGFncy15JywKKwkJCQknRVhUUkFfQ0ZMQUdTJyA9PiAgICdjY2ZsYWdzLXknLAorCQkJCSdFWFRSQV9DUFBGTEFHUycgPT4gJ2NwcGZsYWdzLXknLAorCQkJCSdFWFRSQV9MREZMQUdTJyA9PiAgJ2xkZmxhZ3MteScsCisJCQl9OworCisJCQlXQVJOKCJERVBSRUNBVEVEX1ZBUklBQkxFIiwKKwkJCSAgICAgIlVzZSBvZiAkZmxhZyBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIFxgJHJlcGxhY2VtZW50LT57JGZsYWd9IGluc3RlYWQuXG4iIC4gJGhlcmVjdXJyKSBpZiAoJHJlcGxhY2VtZW50LT57JGZsYWd9KTsKKwkJfQorCiAjIGNoZWNrIHdlIGFyZSBpbiBhIHZhbGlkIHNvdXJjZSBmaWxlIGlmIG5vdCB0aGVuIGlnbm9yZSB0aGlzIGh1bmsKIAkJbmV4dCBpZiAoJHJlYWxmaWxlICF+IC9cLihofGN8c3xTfHBsfHNoKSQvKTsKIApAQCAtMzE1MSwxMCArMzE4NywxMCBAQAogCQkJICAgICAiY29uc2lkZXIgdXNpbmcgYSBjb21wbGV0aW9uXG4iIC4gJGhlcmVjdXJyKTsKIAogCQl9Ci0jIHJlY29tbWVuZCBrc3RydG8qIG92ZXIgc2ltcGxlX3N0cnRvKgotCQlpZiAoJGxpbmUgPX4gL1xic2ltcGxlXyhzdHJ0by4qPylccypcKC8pIHsKKyMgcmVjb21tZW5kIGtzdHJ0byogb3ZlciBzaW1wbGVfc3RydG8qIGFuZCBzdHJpY3Rfc3RydG8qCisJCWlmICgkbGluZSA9fiAvXGIoKHNpbXBsZXxzdHJpY3QpXyhzdHJ0byhsfGxsfHVsfHVsbCkpKVxzKlwoLykgewogCQkJV0FSTigiQ09OU0lERVJfS1NUUlRPIiwKLQkJCSAgICAgImNvbnNpZGVyIHVzaW5nIGtzdHJ0byogaW4gcHJlZmVyZW5jZSB0byBzaW1wbGVfJDFcbiIgLiAkaGVyZWN1cnIpOworCQkJICAgICAiJDEgaXMgb2Jzb2xldGUsIHVzZSBrJDMgaW5zdGVhZFxuIiAuICRoZXJlY3Vycik7CiAJCX0KICMgY2hlY2sgZm9yIF9faW5pdGNhbGwoKSwgdXNlIGRldmljZV9pbml0Y2FsbCgpIGV4cGxpY2l0bHkgcGxlYXNlCiAJCWlmICgkbGluZSA9fiAvXi5ccypfX2luaXRjYWxsXHMqXCgvKSB7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2V4dHJhY3Qtdm1saW51eCBiL3NjcmlwdHMvZXh0cmFjdC12bWxpbnV4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwNjFhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2V4dHJhY3Qtdm1saW51eApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vc2gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBleHRyYWN0LXZtbGludXggLSBFeHRyYWN0IHVuY29tcHJlc3NlZCB2bWxpbnV4IGZyb20gYSBrZXJuZWwgaW1hZ2UKKyMKKyMgSW5zcGlyZWQgZnJvbSBleHRyYWN0LWlrY29uZmlnCisjIChjKSAyMDA5LDIwMTAgRGljayBTdHJlZWZsYW5kIDxkaWNrQHN0cmVlZmxhbmQubmV0PgorIworIyAoYykgMjAxMSAgICAgIENvcmVudGluIENoYXJ5IDxjb3JlbnRpbi5jaGFyeUBnbWFpbC5jb20+CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIChHUEx2MikuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2hlY2tfdm1saW51eCgpCit7CisJIyBVc2UgcmVhZGVsZiB0byBjaGVjayBpZiBpdCdzIGEgdmFsaWQgRUxGCisJIyBUT0RPOiBmaW5kIGEgYmV0dGVyIHRvIHdheSB0byBjaGVjayB0aGF0IGl0J3MgcmVhbGx5IHZtbGludXgKKwkjICAgICAgIGFuZCBub3QganVzdCBhbiBlbGYKKwlyZWFkZWxmIC1oICQxID4gL2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDEKKworCWNhdCAkMQorCWV4aXQgMAorfQorCit0cnlfZGVjb21wcmVzcygpCit7CisJIyBUaGUgb2JzY3VyZSB1c2Ugb2YgdGhlICJ0ciIgZmlsdGVyIGlzIHRvIHdvcmsgYXJvdW5kIG9sZGVyIHZlcnNpb25zIG9mCisJIyAiZ3JlcCIgdGhhdCByZXBvcnQgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBsaW5lIGluc3RlYWQgb2YgdGhlIHBhdHRlcm4uCisKKwkjIFRyeSB0byBmaW5kIHRoZSBoZWFkZXIgKCQxKSBhbmQgZGVjb21wcmVzcyBmcm9tIGhlcmUKKwlmb3IJcG9zIGluIGB0ciAiJDFcbiQyIiAiXG4kMj0iIDwgIiRpbWciIHwgZ3JlcCAtYWJvICJeJDIiYAorCWRvCisJCXBvcz0ke3BvcyUlOip9CisJCXRhaWwgLWMrJHBvcyAiJGltZyIgfCAkMyA+ICR0bXAgMj4gL2Rldi9udWxsCisJCWNoZWNrX3ZtbGludXggJHRtcAorCWRvbmUKK30KKworIyBDaGVjayBpbnZvY2F0aW9uOgorbWU9JHswIyMqL30KK2ltZz0kMQoraWYJWyAkIyAtbmUgMSAtbyAhIC1zICIkaW1nIiBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICRtZSA8a2VybmVsLWltYWdlPiIgPiYyCisJZXhpdCAyCitmaQorCisjIFByZXBhcmUgdGVtcCBmaWxlczoKK3RtcD0kKG1rdGVtcCAvdG1wL3ZtbGludXgtWFhYKQordHJhcCAicm0gLWYgJHRtcCIgMAorCisjIEluaXRpYWwgYXR0ZW1wdCBmb3IgdW5jb21wcmVzc2VkIGltYWdlcyBvciBvYmplY3RzOgorY2hlY2tfdm1saW51eCAkaW1nCisKKyMgVGhhdCBkaWRuJ3Qgd29yaywgc28gcmV0cnkgYWZ0ZXIgZGVjb21wcmVzc2lvbi4KK3RyeV9kZWNvbXByZXNzICdcMDM3XDIxM1wwMTAnIHh5ICAgIGd1bnppcAordHJ5X2RlY29tcHJlc3MgJ1wzNzU3elhaXDAwMCcgYWJjZGUgdW54egordHJ5X2RlY29tcHJlc3MgJ0JaaCcgICAgICAgICAgeHkgICAgYnVuemlwMgordHJ5X2RlY29tcHJlc3MgJ1wxMzVcMFwwXDAnICAgeHh4ICAgdW5sem1hCit0cnlfZGVjb21wcmVzcyAnXDIxMVwxMTRcMTMyJyB4eSAgICAnbHpvcCAtZCcKKworIyBCYWlsIG91dDoKK2VjaG8gIiRtZTogQ2Fubm90IGZpbmQgdm1saW51eC4iID4mMgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5jIGIvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5jCmluZGV4IDZkM2ZkYTAuLjhhMTA2NDkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuYworKysgYi9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmMKQEAgLTQwLDcgKzQwLDggQEAKIHN0YXRpYyBGSUxFICpkZWJ1Z2ZpbGU7CiAKIGludCBjdXJfbGluZSA9IDE7Ci1jaGFyICpjdXJfZmlsZW5hbWU7CitjaGFyICpjdXJfZmlsZW5hbWUsICpzb3VyY2VfZmlsZTsKK2ludCBpbl9zb3VyY2VfZmlsZTsKIAogc3RhdGljIGludCBmbGFnX2RlYnVnLCBmbGFnX2R1bXBfZGVmcywgZmxhZ19yZWZlcmVuY2UsIGZsYWdfZHVtcF90eXBlcywKIAkgICBmbGFnX3ByZXNlcnZlLCBmbGFnX3dhcm5pbmdzOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5oIGIvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5oCmluZGV4IDdlYzUyYWUuLjNiZmZkY2EgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuaAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmgKQEAgLTM3LDYgKzM3LDcgQEAKIHN0cnVjdCBzdHJpbmdfbGlzdCB7CiAJc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OwogCWVudW0gc3ltYm9sX3R5cGUgdGFnOworCWludCBpbl9zb3VyY2VfZmlsZTsKIAljaGFyICpzdHJpbmc7CiB9OwogCkBAIC01Nyw3ICs1OCw4IEBACiAjZGVmaW5lIFlZU1RZUEUgeXlzdHlwZQogCiBleHRlcm4gaW50IGN1cl9saW5lOwotZXh0ZXJuIGNoYXIgKmN1cl9maWxlbmFtZTsKK2V4dGVybiBjaGFyICpjdXJfZmlsZW5hbWUsICpzb3VyY2VfZmlsZTsKK2V4dGVybiBpbnQgaW5fc291cmNlX2ZpbGU7CiAKIHN0cnVjdCBzeW1ib2wgKmZpbmRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gc3ltYm9sX3R5cGUgbnMsIGludCBleGFjdCk7CiBzdHJ1Y3Qgc3ltYm9sICphZGRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gc3ltYm9sX3R5cGUgdHlwZSwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwgYi9zY3JpcHRzL2dlbmtzeW1zL2xleC5sCmluZGV4IDQwMGFlMDYuLmY3NzAwNzEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9sZXgubApAQCAtMTE2LDYgKzExNiw3IEBACiAJCQkgIGN1cl9ub2RlLT50YWcgPQkJCQkgICBcCiAJCQkgICAgZmluZF9zeW1ib2woY3VyX25vZGUtPnN0cmluZywgU1lNX0VOVU1fQ09OU1QsIDEpP1wKIAkJCSAgICBTWU1fRU5VTV9DT05TVCA6IFNZTV9OT1JNQUwgOwkJICAgXAorCQkJICBjdXJfbm9kZS0+aW5fc291cmNlX2ZpbGUgPSBpbl9zb3VyY2VfZmlsZTsgICAgICAgXAogCQkJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBBUFAJCV9BUFAoeXl0ZXh0LCB5eWxlbmcpCkBAIC0xNjYsNiArMTY3LDEzIEBACiAgICAgICBjdXJfZmlsZW5hbWUgPSBtZW1jcHkoeG1hbGxvYyhlLWZpbGUrMSksIGZpbGUsIGUtZmlsZSsxKTsKICAgICAgIGN1cl9saW5lID0gYXRvaSh5eXRleHQrMik7CiAKKyAgICAgIGlmICghc291cmNlX2ZpbGUpIHsKKyAgICAgICAgc291cmNlX2ZpbGUgPSB4c3RyZHVwKGN1cl9maWxlbmFtZSk7CisgICAgICAgIGluX3NvdXJjZV9maWxlID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluX3NvdXJjZV9maWxlID0gKHN0cmNtcChjdXJfZmlsZW5hbWUsIHNvdXJjZV9maWxlKSA9PSAwKTsKKyAgICAgIH0KKwogICAgICAgZ290byByZXBlYXQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL2xleC5sZXguY19zaGlwcGVkIGIvc2NyaXB0cy9nZW5rc3ltcy9sZXgubGV4LmNfc2hpcHBlZAppbmRleCBjODNjZjYwLi4wYmY0MTU3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL2xleC5sZXguY19zaGlwcGVkCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmxleC5jX3NoaXBwZWQKQEAgLTY2MCw3ICs2NjAsNyBAQAogLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCiAgKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgogICovCi0jZGVmaW5lIEVDSE8gZG8geyBpZiAoZndyaXRlKCB5eXRleHQsIHl5bGVuZywgMSwgeXlvdXQgKSkge30gfSB3aGlsZSAoMCkKKyNkZWZpbmUgRUNITyBmd3JpdGUoIHl5dGV4dCwgeXlsZW5nLCAxLCB5eW91dCApCiAjZW5kaWYKIAogLyogR2V0cyBpbnB1dCBhbmQgc3R1ZmZzIGl0IGludG8gImJ1ZiIuICBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciBZWV9OVUxMLApAQCAtNjcxLDcgKzY3MSw3IEBACiAJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lzX2ludGVyYWN0aXZlICkgXAogCQl7IFwKIAkJaW50IGMgPSAnKic7IFwKLQkJdW5zaWduZWQgbjsgXAorCQlpbnQgbjsgXAogCQlmb3IgKCBuID0gMDsgbiA8IG1heF9zaXplICYmIFwKIAkJCSAgICAgKGMgPSBnZXRjKCB5eWluICkpICE9IEVPRiAmJiBjICE9ICdcbic7ICsrbiApIFwKIAkJCWJ1ZltuXSA9IChjaGFyKSBjOyBcCkBAIC0xOTI2LDYgKzE5MjYsNyBAQAogCQkJICBjdXJfbm9kZS0+dGFnID0JCQkJICAgXAogCQkJICAgIGZpbmRfc3ltYm9sKGN1cl9ub2RlLT5zdHJpbmcsIFNZTV9FTlVNX0NPTlNULCAxKT9cCiAJCQkgICAgU1lNX0VOVU1fQ09OU1QgOiBTWU1fTk9STUFMIDsJCSAgIFwKKwkJCSAgY3VyX25vZGUtPmluX3NvdXJjZV9maWxlID0gaW5fc291cmNlX2ZpbGU7ICAgICAgIFwKIAkJCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgQVBQCQlfQVBQKHl5dGV4dCwgeXlsZW5nKQpAQCAtMTk3NSw2ICsxOTc2LDEzIEBACiAgICAgICBjdXJfZmlsZW5hbWUgPSBtZW1jcHkoeG1hbGxvYyhlLWZpbGUrMSksIGZpbGUsIGUtZmlsZSsxKTsKICAgICAgIGN1cl9saW5lID0gYXRvaSh5eXRleHQrMik7CiAKKyAgICAgIGlmICghc291cmNlX2ZpbGUpIHsKKyAgICAgICAgc291cmNlX2ZpbGUgPSB4c3RyZHVwKGN1cl9maWxlbmFtZSk7CisgICAgICAgIGluX3NvdXJjZV9maWxlID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluX3NvdXJjZV9maWxlID0gKHN0cmNtcChjdXJfZmlsZW5hbWUsIHNvdXJjZV9maWxlKSA9PSAwKTsKKyAgICAgIH0KKwogICAgICAgZ290byByZXBlYXQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnRhYi5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnRhYi5jX3NoaXBwZWQKaW5kZXggNjFkNGE1ZC4uZWNlNTNjNyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS50YWIuY19zaGlwcGVkCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UudGFiLmNfc2hpcHBlZApAQCAtMSw5ICsxLDggQEAKLS8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjQuMy4gICovCisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi41LiAgKi8KIAotLyogU2tlbGV0b24gaW1wbGVtZW50YXRpb24gZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQworLyogQmlzb24gaW1wbGVtZW50YXRpb24gZm9yIFlhY2MtbGlrZSBwYXJzZXJzIGluIEMKICAgIAotICAgICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAotICAgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OS0xOTkwLCAyMDAwLTIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICAKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDUsNyArNDQsNyBAQAogI2RlZmluZSBZWUJJU09OIDEKIAogLyogQmlzb24gdmVyc2lvbi4gICovCi0jZGVmaW5lIFlZQklTT05fVkVSU0lPTiAiMi40LjMiCisjZGVmaW5lIFlZQklTT05fVkVSU0lPTiAiMi41IgogCiAvKiBTa2VsZXRvbiBuYW1lLiAgKi8KICNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCkBAIC05Niw2ICs5NSwyNSBAQAogICBmcmVlX2xpc3QoYiwgZSk7CiB9CiAKKy8qIFJlY29yZCBkZWZpbml0aW9uIG9mIGEgc3RydWN0L3VuaW9uL2VudW0gKi8KK3N0YXRpYyB2b2lkIHJlY29yZF9jb21wb3VuZChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiprZXl3LAorCQkgICAgICAgc3RydWN0IHN0cmluZ19saXN0ICoqaWRlbnQsCisJCSAgICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipib2R5LAorCQkgICAgICAgZW51bSBzeW1ib2xfdHlwZSB0eXBlKQoreworCXN0cnVjdCBzdHJpbmdfbGlzdCAqYiA9ICpib2R5LCAqaSA9ICppZGVudCwgKnI7CisKKwlpZiAoaS0+aW5fc291cmNlX2ZpbGUpIHsKKwkJcmVtb3ZlX25vZGUoa2V5dyk7CisJCSgqaWRlbnQpLT50YWcgPSB0eXBlOworCQlyZW1vdmVfbGlzdChib2R5LCBpZGVudCk7CisJCXJldHVybjsKKwl9CisJciA9IGNvcHlfbm9kZShpKTsgci0+dGFnID0gdHlwZTsKKwlyLT5uZXh0ID0gKCprZXl3KS0+bmV4dDsgKmJvZHkgPSByOyAoKmtleXcpLT5uZXh0ID0gTlVMTDsKKwlhZGRfc3ltYm9sKGktPnN0cmluZywgdHlwZSwgYiwgaXNfZXh0ZXJuKTsKK30KKwogCiAKIApAQCAtMjgzLDExICszMDEsMTEgQEAKICMgICAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCiAjICAgZWxzZQogIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBhbGxvY2EKLSMgICAgaWYgISBkZWZpbmVkIF9BTExPQ0FfSCAmJiAhIGRlZmluZWQgX1NURExJQl9IICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisjICAgIGlmICEgZGVmaW5lZCBfQUxMT0NBX0ggJiYgISBkZWZpbmVkIEVYSVRfU1VDQ0VTUyAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiAjICAgICBpbmNsdWRlIDxzdGRsaWIuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyAgICAgaWZuZGVmIF9TVERMSUJfSAotIyAgICAgIGRlZmluZSBfU1RETElCX0ggMQorIyAgICAgaWZuZGVmIEVYSVRfU1VDQ0VTUworIyAgICAgIGRlZmluZSBFWElUX1NVQ0NFU1MgMAogIyAgICAgZW5kaWYKICMgICAgZW5kaWYKICMgICBlbmRpZgpAQCAtMzEwLDI0ICszMjgsMjQgQEAKICMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KICMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIFlZU0laRV9NQVhJTVVNCiAjICBlbmRpZgotIyAgaWYgKGRlZmluZWQgX19jcGx1c3BsdXMgJiYgISBkZWZpbmVkIF9TVERMSUJfSCBcCisjICBpZiAoZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiAhIGRlZmluZWQgRVhJVF9TVUNDRVNTIFwKICAgICAgICAmJiAhICgoZGVmaW5lZCBZWU1BTExPQyB8fCBkZWZpbmVkIG1hbGxvYykgXAogCSAgICAgJiYgKGRlZmluZWQgWVlGUkVFIHx8IGRlZmluZWQgZnJlZSkpKQogIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICAgaWZuZGVmIF9TVERMSUJfSAotIyAgICBkZWZpbmUgX1NURExJQl9IIDEKKyMgICBpZm5kZWYgRVhJVF9TVUNDRVNTCisjICAgIGRlZmluZSBFWElUX1NVQ0NFU1MgMAogIyAgIGVuZGlmCiAjICBlbmRpZgogIyAgaWZuZGVmIFlZTUFMTE9DCiAjICAgZGVmaW5lIFlZTUFMTE9DIG1hbGxvYwotIyAgIGlmICEgZGVmaW5lZCBtYWxsb2MgJiYgISBkZWZpbmVkIF9TVERMSUJfSCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorIyAgIGlmICEgZGVmaW5lZCBtYWxsb2MgJiYgISBkZWZpbmVkIEVYSVRfU1VDQ0VTUyAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiB2b2lkICptYWxsb2MgKFlZU0laRV9UKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwogIyAgIGVuZGlmCiAjICBlbmRpZgogIyAgaWZuZGVmIFlZRlJFRQogIyAgIGRlZmluZSBZWUZSRUUgZnJlZQotIyAgIGlmICEgZGVmaW5lZCBmcmVlICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyMgICBpZiAhIGRlZmluZWQgZnJlZSAmJiAhIGRlZmluZWQgRVhJVF9TVUNDRVNTICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCiAgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKIHZvaWQgZnJlZSAodm9pZCAqKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwogIyAgIGVuZGlmCkBAIC0zNTYsMjMgKzM3NCw3IEBACiAgICAgICgoTikgKiAoc2l6ZW9mICh5eXR5cGVfaW50MTYpICsgc2l6ZW9mIChZWVNUWVBFKSkgXAogICAgICAgKyBZWVNUQUNLX0dBUF9NQVhJTVVNKQogCi0vKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KLSAgIG5vdCBvdmVybGFwLiAgKi8KLSMgaWZuZGVmIFlZQ09QWQotIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAxIDwgX19HTlVDX18KLSMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAotICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQotIyAgZWxzZQotIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAotICAgICAgZG8JCQkJCVwKLQl7CQkJCQlcCi0JICBZWVNJWkVfVCB5eWk7CQkJCVwKLQkgIGZvciAoeXlpID0gMDsgeXlpIDwgKENvdW50KTsgeXlpKyspCVwKLQkgICAgKFRvKVt5eWldID0gKEZyb20pW3l5aV07CQlcCi0JfQkJCQkJXAotICAgICAgd2hpbGUgKFlZSUQgKDApKQotIyAgZW5kaWYKLSMgZW5kaWYKKyMgZGVmaW5lIFlZQ09QWV9ORUVERUQgMQogCiAvKiBSZWxvY2F0ZSBTVEFDSyBmcm9tIGl0cyBvbGQgbG9jYXRpb24gdG8gdGhlIG5ldyBvbmUuICBUaGUKICAgIGxvY2FsIHZhcmlhYmxlcyBZWVNJWkUgYW5kIFlZU1RBQ0tTSVpFIGdpdmUgdGhlIG9sZCBhbmQgbmV3IG51bWJlciBvZgpAQCAtMzkyLDYgKzM5NCwyNiBAQAogCiAjZW5kaWYKIAorI2lmIGRlZmluZWQgWVlDT1BZX05FRURFRCAmJiBZWUNPUFlfTkVFREVECisvKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KKyAgIG5vdCBvdmVybGFwLiAgKi8KKyMgaWZuZGVmIFlZQ09QWQorIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAxIDwgX19HTlVDX18KKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAorICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQorIyAgZWxzZQorIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAorICAgICAgZG8JCQkJCVwKKwl7CQkJCQlcCisJICBZWVNJWkVfVCB5eWk7CQkJCVwKKwkgIGZvciAoeXlpID0gMDsgeXlpIDwgKENvdW50KTsgeXlpKyspCVwKKwkgICAgKFRvKVt5eWldID0gKEZyb20pW3l5aV07CQlcCisJfQkJCQkJXAorICAgICAgd2hpbGUgKFlZSUQgKDApKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAvKiAhWVlDT1BZX05FRURFRCAqLworCiAvKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICAqLwogI2RlZmluZSBZWUZJTkFMICA0CiAvKiBZWUxBU1QgLS0gTGFzdCBpbmRleCBpbiBZWVRBQkxFLiAgKi8KQEAgLTUxNCwyMCArNTM2LDIwIEBACiAvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5cmxpbmVbXSA9CiB7Ci0gICAgICAgMCwgICAxMDQsICAgMTA0LCAgIDEwNSwgICAxMDksICAgMTA5LCAgIDExNSwgICAxMTUsICAgMTE3LCAgIDExNywKLSAgICAgMTE5LCAgIDEyMCwgICAxMjEsICAgMTIyLCAgIDEyMywgICAxMjQsICAgMTI4LCAgIDE0MiwgICAxNDMsICAgMTQ3LAotICAgICAxNTUsICAgMTY4LCAgIDE3NCwgICAxNzUsICAgMTc5LCAgIDE4MCwgICAxODQsICAgMTkwLCAgIDE5NCwgICAxOTUsCi0gICAgIDE5NiwgICAxOTcsICAgMTk4LCAgIDIwMiwgICAyMDMsICAgMjA0LCAgIDIwNSwgICAyMDksICAgMjExLCAgIDIxMywKLSAgICAgMjE3LCAgIDIyNCwgICAyMzEsICAgMjQxLCAgIDI0NCwgICAyNDUsICAgMjQ5LCAgIDI1MCwgICAyNTEsICAgMjUyLAotICAgICAyNTMsICAgMjU0LCAgIDI1NSwgICAyNTYsICAgMjU3LCAgIDI1OCwgICAyNTksICAgMjYzLCAgIDI2OCwgICAyNjksCi0gICAgIDI3MywgICAyNzQsICAgMjc4LCAgIDI3OCwgICAyNzgsICAgMjc5LCAgIDI4NywgICAyODgsICAgMjkyLCAgIDMwMSwKLSAgICAgMzAzLCAgIDMwNSwgICAzMDcsICAgMzA5LCAgIDMxNiwgICAzMTcsICAgMzIxLCAgIDMyMiwgICAzMjMsICAgMzI1LAotICAgICAzMjcsICAgMzI5LCAgIDMzMSwgICAzMzYsICAgMzM3LCAgIDMzOCwgICAzNDIsICAgMzQzLCAgIDM0NywgICAzNDgsCi0gICAgIDM1MywgICAzNTgsICAgMzYwLCAgIDM2NCwgICAzNjUsICAgMzczLCAgIDM3NywgICAzNzksICAgMzgxLCAgIDM4MywKLSAgICAgMzg1LCAgIDM5MCwgICAzOTksICAgNDAwLCAgIDQwNSwgICA0MTAsICAgNDExLCAgIDQxNSwgICA0MTYsICAgNDIwLAotICAgICA0MjEsICAgNDI1LCAgIDQyNywgICA0MzIsICAgNDMzLCAgIDQzNywgICA0MzgsICAgNDQyLCAgIDQ0MywgICA0NDQsCi0gICAgIDQ0OCwgICA0NTIsICAgNDUzLCAgIDQ1NywgICA0NTgsICAgNDYyLCAgIDQ2MywgICA0NjYsICAgNDcxLCAgIDQ3OSwKLSAgICAgNDgzLCAgIDQ4NCwgICA0ODgKKyAgICAgICAwLCAgIDEyMywgICAxMjMsICAgMTI0LCAgIDEyOCwgICAxMjgsICAgMTM0LCAgIDEzNCwgICAxMzYsICAgMTM2LAorICAgICAxMzgsICAgMTM5LCAgIDE0MCwgICAxNDEsICAgMTQyLCAgIDE0MywgICAxNDcsICAgMTYxLCAgIDE2MiwgICAxNjYsCisgICAgIDE3NCwgICAxODcsICAgMTkzLCAgIDE5NCwgICAxOTgsICAgMTk5LCAgIDIwMywgICAyMDksICAgMjEzLCAgIDIxNCwKKyAgICAgMjE1LCAgIDIxNiwgICAyMTcsICAgMjIxLCAgIDIyMiwgICAyMjMsICAgMjI0LCAgIDIyOCwgICAyMzAsICAgMjMyLAorICAgICAyMzYsICAgMjM4LCAgIDI0MCwgICAyNDUsICAgMjQ4LCAgIDI0OSwgICAyNTMsICAgMjU0LCAgIDI1NSwgICAyNTYsCisgICAgIDI1NywgICAyNTgsICAgMjU5LCAgIDI2MCwgICAyNjEsICAgMjYyLCAgIDI2MywgICAyNjcsICAgMjcyLCAgIDI3MywKKyAgICAgMjc3LCAgIDI3OCwgICAyODIsICAgMjgyLCAgIDI4MiwgICAyODMsICAgMjkxLCAgIDI5MiwgICAyOTYsICAgMzA1LAorICAgICAzMDcsICAgMzA5LCAgIDMxMSwgICAzMTMsICAgMzIwLCAgIDMyMSwgICAzMjUsICAgMzI2LCAgIDMyNywgICAzMjksCisgICAgIDMzMSwgICAzMzMsICAgMzM1LCAgIDM0MCwgICAzNDEsICAgMzQyLCAgIDM0NiwgICAzNDcsICAgMzUxLCAgIDM1MiwKKyAgICAgMzU3LCAgIDM2MiwgICAzNjQsICAgMzY4LCAgIDM2OSwgICAzNzcsICAgMzgxLCAgIDM4MywgICAzODUsICAgMzg3LAorICAgICAzODksICAgMzk0LCAgIDQwMywgICA0MDQsICAgNDA5LCAgIDQxNCwgICA0MTUsICAgNDE5LCAgIDQyMCwgICA0MjQsCisgICAgIDQyNSwgICA0MjksICAgNDMxLCAgIDQzNiwgICA0MzcsICAgNDQxLCAgIDQ0MiwgICA0NDYsICAgNDQ3LCAgIDQ0OCwKKyAgICAgNDUyLCAgIDQ1NiwgICA0NTcsICAgNDYxLCAgIDQ2MiwgICA0NjYsICAgNDY3LCAgIDQ3MCwgICA0NzUsICAgNDgzLAorICAgICA0ODcsICAgNDg4LCAgIDQ5MgogfTsKICNlbmRpZgogCkBAIC02MTgsOCArNjQwLDggQEAKICAgICAgICAwLCAgICAgMSwgICAgIDUKIH07CiAKLS8qIFlZREVGQUNUW1NUQVRFLU5BTUVdIC0tIERlZmF1bHQgcnVsZSB0byByZWR1Y2Ugd2l0aCBpbiBzdGF0ZQotICAgU1RBVEUtTlVNIHdoZW4gWVlUQUJMRSBkb2Vzbid0IHNwZWNpZnkgc29tZXRoaW5nIGVsc2UgdG8gZG8uICBaZXJvCisvKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJlZHVjdGlvbiBudW1iZXIgaW4gc3RhdGUgU1RBVEUtTlVNLgorICAgUGVyZm9ybWVkIHdoZW4gWVlUQUJMRSBkb2Vzbid0IHNwZWNpZnkgc29tZXRoaW5nIGVsc2UgdG8gZG8uICBaZXJvCiAgICBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbiBlcnJvci4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5ZGVmYWN0W10gPQogewpAQCAtNjkyLDggKzcxNCw3IEBACiAKIC8qIFlZVEFCTEVbWVlQQUNUW1NUQVRFLU5VTV1dLiAgV2hhdCB0byBkbyBpbiBzdGF0ZSBTVEFURS1OVU0uICBJZgogICAgcG9zaXRpdmUsIHNoaWZ0IHRoYXQgdG9rZW4uICBJZiBuZWdhdGl2ZSwgcmVkdWNlIHRoZSBydWxlIHdoaWNoCi0gICBudW1iZXIgaXMgdGhlIG9wcG9zaXRlLiAgSWYgemVybywgZG8gd2hhdCBZWURFRkFDVCBzYXlzLgotICAgSWYgWVlUQUJMRV9OSU5GLCBzeW50YXggZXJyb3IuICAqLworICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KICNkZWZpbmUgWVlUQUJMRV9OSU5GIC0xMDkKIHN0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXl0YWJsZVtdID0KIHsKQEAgLTc1Myw2ICs3NzQsMTIgQEAKICAgICAgICAwLCAgICAgMCwgICAgMzQKIH07CiAKKyNkZWZpbmUgeXlwYWN0X3ZhbHVlX2lzX2RlZmF1bHQoeXlzdGF0ZSkgXAorICAoKHl5c3RhdGUpID09ICgtMTM1KSkKKworI2RlZmluZSB5eXRhYmxlX3ZhbHVlX2lzX2Vycm9yKHl5dGFibGVfdmFsdWUpIFwKKyAgWVlJRCAoMCkKKwogc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eWNoZWNrW10gPQogewogICAgICAgNTksICAgIDM4LCAgICA3OSwgICAgIDMsICAgICAxLCAgICAgOCwgICAgNTYsICAgIDM3LCAgICAyNiwgICAgMzcsCkBAIC04NjksNyArODk2LDYgQEAKICAgICB7CQkJCQkJCQlcCiAgICAgICB5eWNoYXIgPSAoVG9rZW4pOwkJCQkJCVwKICAgICAgIHl5bHZhbCA9IChWYWx1ZSk7CQkJCQkJXAotICAgICAgeXl0b2tlbiA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCiAgICAgICBZWVBPUFNUQUNLICgxKTsJCQkJCQlcCiAgICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKICAgICB9CQkJCQkJCQlcCkBAIC05MTEsMTkgKzkzNywxMCBAQAogI2VuZGlmCiAKIAotLyogWVlfTE9DQVRJT05fUFJJTlQgLS0gUHJpbnQgdGhlIGxvY2F0aW9uIG9uIHRoZSBzdHJlYW0uCi0gICBUaGlzIG1hY3JvIHdhcyBub3QgbWFuZGF0ZWQgb3JpZ2luYWxseTogZGVmaW5lIG9ubHkgaWYgd2Uga25vdwotICAgd2Ugd29uJ3QgYnJlYWsgdXNlciBjb2RlOiB3aGVuIHRoZXNlIGFyZSB0aGUgbG9jYXRpb25zIHdlIGtub3cuICAqLworLyogVGhpcyBtYWNybyBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gKi8KIAogI2lmbmRlZiBZWV9MT0NBVElPTl9QUklOVAotIyBpZiBkZWZpbmVkIFlZTFRZUEVfSVNfVFJJVklBTCAmJiBZWUxUWVBFX0lTX1RSSVZJQUwKLSMgIGRlZmluZSBZWV9MT0NBVElPTl9QUklOVChGaWxlLCBMb2MpCQkJXAotICAgICBmcHJpbnRmIChGaWxlLCAiJWQuJWQtJWQuJWQiLAkJCVwKLQkgICAgICAoTG9jKS5maXJzdF9saW5lLCAoTG9jKS5maXJzdF9jb2x1bW4sCVwKLQkgICAgICAoTG9jKS5sYXN0X2xpbmUsICAoTG9jKS5sYXN0X2NvbHVtbikKLSMgZWxzZQotIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgKCh2b2lkKSAwKQotIyBlbmRpZgorIyBkZWZpbmUgWVlfTE9DQVRJT05fUFJJTlQoRmlsZSwgTG9jKSAoKHZvaWQpIDApCiAjZW5kaWYKIAogCkBAIC0xMTE1LDcgKzExMzIsNiBAQAogIyBkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAogI2VuZGlmCiAKLQwKIAogI2lmIFlZRVJST1JfVkVSQk9TRQogCkBAIC0xMjE4LDExNSArMTIzNCwxNDIgQEAKIH0KICMgZW5kaWYKIAotLyogQ29weSBpbnRvIFlZUkVTVUxUIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4KLSAgIFlZQ0hBUiB3aGlsZSBpbiBzdGF0ZSBZWVNUQVRFLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLAotICAgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUuICBJZiBZWVJFU1VMVCBpcyBudWxsLCBkbyBub3QKLSAgIGNvcHkgYW55dGhpbmc7IGp1c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZQotICAgY29waWVkLiAgQXMgYSBzcGVjaWFsIGNhc2UsIHJldHVybiAwIGlmIGFuIG9yZGluYXJ5ICJzeW50YXggZXJyb3IiCi0gICBtZXNzYWdlIHdpbGwgZG8uICBSZXR1cm4gWVlTSVpFX01BWElNVU0gaWYgb3ZlcmZsb3cgb2NjdXJzIGR1cmluZwotICAgc2l6ZSBjYWxjdWxhdGlvbi4gICovCi1zdGF0aWMgWVlTSVpFX1QKLXl5c3ludGF4X2Vycm9yIChjaGFyICp5eXJlc3VsdCwgaW50IHl5c3RhdGUsIGludCB5eWNoYXIpCisvKiBDb3B5IGludG8gKllZTVNHLCB3aGljaCBpcyBvZiBzaXplICpZWU1TR19BTExPQywgYW4gZXJyb3IgbWVzc2FnZQorICAgYWJvdXQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4gWVlUT0tFTiBmb3IgdGhlIHN0YXRlIHN0YWNrIHdob3NlIHRvcCBpcworICAgWVlTU1AuCisKKyAgIFJldHVybiAwIGlmICpZWU1TRyB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4uICBSZXR1cm4gMSBpZiAqWVlNU0cgaXMKKyAgIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgbWVzc2FnZS4gIEluIHRoYXQgY2FzZSwgYWxzbyBzZXQKKyAgICpZWU1TR19BTExPQyB0byB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJ5dGVzLiAgUmV0dXJuIDIgaWYgdGhlCisgICByZXF1aXJlZCBudW1iZXIgb2YgYnl0ZXMgaXMgdG9vIGxhcmdlIHRvIHN0b3JlLiAgKi8KK3N0YXRpYyBpbnQKK3l5c3ludGF4X2Vycm9yIChZWVNJWkVfVCAqeXltc2dfYWxsb2MsIGNoYXIgKip5eW1zZywKKyAgICAgICAgICAgICAgICB5eXR5cGVfaW50MTYgKnl5c3NwLCBpbnQgeXl0b2tlbikKIHsKLSAgaW50IHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgWVlTSVpFX1QgeXlzaXplMCA9IHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXRva2VuXSk7CisgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c2l6ZTA7CisgIFlZU0laRV9UIHl5c2l6ZTE7CisgIGVudW0geyBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNID0gNSB9OworICAvKiBJbnRlcm5hdGlvbmFsaXplZCBmb3JtYXQgc3RyaW5nLiAqLworICBjb25zdCBjaGFyICp5eWZvcm1hdCA9IDA7CisgIC8qIEFyZ3VtZW50cyBvZiB5eWZvcm1hdC4gKi8KKyAgY2hhciBjb25zdCAqeXlhcmdbWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTV07CisgIC8qIE51bWJlciBvZiByZXBvcnRlZCB0b2tlbnMgKG9uZSBmb3IgdGhlICJ1bmV4cGVjdGVkIiwgb25lIHBlcgorICAgICAiZXhwZWN0ZWQiKS4gKi8KKyAgaW50IHl5Y291bnQgPSAwOwogCi0gIGlmICghIChZWVBBQ1RfTklORiA8IHl5biAmJiB5eW4gPD0gWVlMQVNUKSkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQorICAvKiBUaGVyZSBhcmUgbWFueSBwb3NzaWJpbGl0aWVzIGhlcmUgdG8gY29uc2lkZXI6CisgICAgIC0gQXNzdW1lIFlZRkFJTCBpcyBub3QgdXNlZC4gIEl0J3MgdG9vIGZsYXdlZCB0byBjb25zaWRlci4gIFNlZQorICAgICAgIDxodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvYmlzb24tcGF0Y2hlcy8yMDA5LTEyL21zZzAwMDI0Lmh0bWw+CisgICAgICAgZm9yIGRldGFpbHMuICBZWUVSUk9SIGlzIGZpbmUgYXMgaXQgZG9lcyBub3QgaW52b2tlIHRoaXMKKyAgICAgICBmdW5jdGlvbi4KKyAgICAgLSBJZiB0aGlzIHN0YXRlIGlzIGEgY29uc2lzdGVudCBzdGF0ZSB3aXRoIGEgZGVmYXVsdCBhY3Rpb24sIHRoZW4KKyAgICAgICB0aGUgb25seSB3YXkgdGhpcyBmdW5jdGlvbiB3YXMgaW52b2tlZCBpcyBpZiB0aGUgZGVmYXVsdCBhY3Rpb24KKyAgICAgICBpcyBhbiBlcnJvciBhY3Rpb24uICBJbiB0aGF0IGNhc2UsIGRvbid0IGNoZWNrIGZvciBleHBlY3RlZAorICAgICAgIHRva2VucyBiZWNhdXNlIHRoZXJlIGFyZSBub25lLgorICAgICAtIFRoZSBvbmx5IHdheSB0aGVyZSBjYW4gYmUgbm8gbG9va2FoZWFkIHByZXNlbnQgKGluIHl5Y2hhcikgaXMgaWYKKyAgICAgICB0aGlzIHN0YXRlIGlzIGEgY29uc2lzdGVudCBzdGF0ZSB3aXRoIGEgZGVmYXVsdCBhY3Rpb24uICBUaHVzLAorICAgICAgIGRldGVjdGluZyB0aGUgYWJzZW5jZSBvZiBhIGxvb2thaGVhZCBpcyBzdWZmaWNpZW50IHRvIGRldGVybWluZQorICAgICAgIHRoYXQgdGhlcmUgaXMgbm8gdW5leHBlY3RlZCBvciBleHBlY3RlZCB0b2tlbiB0byByZXBvcnQuICBJbiB0aGF0CisgICAgICAgY2FzZSwganVzdCByZXBvcnQgYSBzaW1wbGUgInN5bnRheCBlcnJvciIuCisgICAgIC0gRG9uJ3QgYXNzdW1lIHRoZXJlIGlzbid0IGEgbG9va2FoZWFkIGp1c3QgYmVjYXVzZSB0aGlzIHN0YXRlIGlzIGEKKyAgICAgICBjb25zaXN0ZW50IHN0YXRlIHdpdGggYSBkZWZhdWx0IGFjdGlvbi4gIFRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBhCisgICAgICAgcHJldmlvdXMgaW5jb25zaXN0ZW50IHN0YXRlLCBjb25zaXN0ZW50IHN0YXRlIHdpdGggYSBub24tZGVmYXVsdAorICAgICAgIGFjdGlvbiwgb3IgdXNlciBzZW1hbnRpYyBhY3Rpb24gdGhhdCBtYW5pcHVsYXRlZCB5eWNoYXIuCisgICAgIC0gT2YgY291cnNlLCB0aGUgZXhwZWN0ZWQgdG9rZW4gbGlzdCBkZXBlbmRzIG9uIHN0YXRlcyB0byBoYXZlCisgICAgICAgY29ycmVjdCBsb29rYWhlYWQgaW5mb3JtYXRpb24sIGFuZCBpdCBkZXBlbmRzIG9uIHRoZSBwYXJzZXIgbm90CisgICAgICAgdG8gcGVyZm9ybSBleHRyYSByZWR1Y3Rpb25zIGFmdGVyIGZldGNoaW5nIGEgbG9va2FoZWFkIGZyb20gdGhlCisgICAgICAgc2Nhbm5lciBhbmQgYmVmb3JlIGRldGVjdGluZyBhIHN5bnRheCBlcnJvci4gIFRodXMsIHN0YXRlIG1lcmdpbmcKKyAgICAgICAoZnJvbSBMQUxSIG9yIElFTFIpIGFuZCBkZWZhdWx0IHJlZHVjdGlvbnMgY29ycnVwdCB0aGUgZXhwZWN0ZWQKKyAgICAgICB0b2tlbiBsaXN0LiAgSG93ZXZlciwgdGhlIGxpc3QgaXMgY29ycmVjdCBmb3IgY2Fub25pY2FsIExSIHdpdGgKKyAgICAgICBvbmUgZXhjZXB0aW9uOiBpdCB3aWxsIHN0aWxsIGNvbnRhaW4gYW55IHRva2VuIHRoYXQgd2lsbCBub3QgYmUKKyAgICAgICBhY2NlcHRlZCBkdWUgdG8gYW4gZXJyb3IgYWN0aW9uIGluIGEgbGF0ZXIgc3RhdGUuCisgICovCisgIGlmICh5eXRva2VuICE9IFlZRU1QVFkpCiAgICAgewotICAgICAgaW50IHl5dHlwZSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwotICAgICAgWVlTSVpFX1QgeXlzaXplMCA9IHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXR5cGVdKTsKLSAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c2l6ZTA7Ci0gICAgICBZWVNJWkVfVCB5eXNpemUxOwotICAgICAgaW50IHl5c2l6ZV9vdmVyZmxvdyA9IDA7Ci0gICAgICBlbnVtIHsgWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSA9IDUgfTsKLSAgICAgIGNoYXIgY29uc3QgKnl5YXJnW1lZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU1dOwotICAgICAgaW50IHl5eDsKKyAgICAgIGludCB5eW4gPSB5eXBhY3RbKnl5c3NwXTsKKyAgICAgIHl5YXJnW3l5Y291bnQrK10gPSB5eXRuYW1lW3l5dG9rZW5dOworICAgICAgaWYgKCF5eXBhY3RfdmFsdWVfaXNfZGVmYXVsdCAoeXluKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KKyAgICAgICAgICAgICBZWUNIRUNLLiAgSW4gb3RoZXIgd29yZHMsIHNraXAgdGhlIGZpcnN0IC1ZWU4gYWN0aW9ucyBmb3IKKyAgICAgICAgICAgICB0aGlzIHN0YXRlIGJlY2F1c2UgdGhleSBhcmUgZGVmYXVsdCBhY3Rpb25zLiAgKi8KKyAgICAgICAgICBpbnQgeXl4YmVnaW4gPSB5eW4gPCAwID8gLXl5biA6IDA7CisgICAgICAgICAgLyogU3RheSB3aXRoaW4gYm91bmRzIG9mIGJvdGggeXljaGVjayBhbmQgeXl0bmFtZS4gICovCisgICAgICAgICAgaW50IHl5Y2hlY2tsaW0gPSBZWUxBU1QgLSB5eW4gKyAxOworICAgICAgICAgIGludCB5eXhlbmQgPSB5eWNoZWNrbGltIDwgWVlOVE9LRU5TID8geXljaGVja2xpbSA6IFlZTlRPS0VOUzsKKyAgICAgICAgICBpbnQgeXl4OwogCi0jIGlmIDAKLSAgICAgIC8qIFRoaXMgaXMgc28geGdldHRleHQgc2VlcyB0aGUgdHJhbnNsYXRhYmxlIGZvcm1hdHMgdGhhdCBhcmUKLQkgY29uc3RydWN0ZWQgb24gdGhlIGZseS4gICovCi0gICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcyIpOwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyIpOwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyIpOwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyBvciAlcyIpOwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyBvciAlcyBvciAlcyIpOwotIyBlbmRpZgotICAgICAgY2hhciAqeXlmbXQ7Ci0gICAgICBjaGFyIGNvbnN0ICp5eWY7Ci0gICAgICBzdGF0aWMgY2hhciBjb25zdCB5eXVuZXhwZWN0ZWRbXSA9ICJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMiOwotICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXlleHBlY3RpbmdbXSA9ICIsIGV4cGVjdGluZyAlcyI7Ci0gICAgICBzdGF0aWMgY2hhciBjb25zdCB5eW9yW10gPSAiIG9yICVzIjsKLSAgICAgIGNoYXIgeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZAotCQkgICAgKyBzaXplb2YgeXlleHBlY3RpbmcgLSAxCi0JCSAgICArICgoWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSAtIDIpCi0JCSAgICAgICAqIChzaXplb2YgeXlvciAtIDEpKV07Ci0gICAgICBjaGFyIGNvbnN0ICp5eXByZWZpeCA9IHl5ZXhwZWN0aW5nOwotCi0gICAgICAvKiBTdGFydCBZWVggYXQgLVlZTiBpZiBuZWdhdGl2ZSB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluCi0JIFlZQ0hFQ0suICAqLwotICAgICAgaW50IHl5eGJlZ2luID0geXluIDwgMCA/IC15eW4gOiAwOwotCi0gICAgICAvKiBTdGF5IHdpdGhpbiBib3VuZHMgb2YgYm90aCB5eWNoZWNrIGFuZCB5eXRuYW1lLiAgKi8KLSAgICAgIGludCB5eWNoZWNrbGltID0gWVlMQVNUIC0geXluICsgMTsKLSAgICAgIGludCB5eXhlbmQgPSB5eWNoZWNrbGltIDwgWVlOVE9LRU5TID8geXljaGVja2xpbSA6IFlZTlRPS0VOUzsKLSAgICAgIGludCB5eWNvdW50ID0gMTsKLQotICAgICAgeXlhcmdbMF0gPSB5eXRuYW1lW3l5dHlwZV07Ci0gICAgICB5eWZtdCA9IHl5c3RwY3B5ICh5eWZvcm1hdCwgeXl1bmV4cGVjdGVkKTsKLQotICAgICAgZm9yICh5eXggPSB5eXhiZWdpbjsgeXl4IDwgeXl4ZW5kOyArK3l5eCkKLQlpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IpCi0JICB7Ci0JICAgIGlmICh5eWNvdW50ID09IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0pCi0JICAgICAgewotCQl5eWNvdW50ID0gMTsKLQkJeXlzaXplID0geXlzaXplMDsKLQkJeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZCAtIDFdID0gJ1wwJzsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICB5eWFyZ1t5eWNvdW50KytdID0geXl0bmFtZVt5eXhdOwotCSAgICB5eXNpemUxID0geXlzaXplICsgeXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5eF0pOwotCSAgICB5eXNpemVfb3ZlcmZsb3cgfD0gKHl5c2l6ZTEgPCB5eXNpemUpOwotCSAgICB5eXNpemUgPSB5eXNpemUxOwotCSAgICB5eWZtdCA9IHl5c3RwY3B5ICh5eWZtdCwgeXlwcmVmaXgpOwotCSAgICB5eXByZWZpeCA9IHl5b3I7Ci0JICB9Ci0KLSAgICAgIHl5ZiA9IFlZXyh5eWZvcm1hdCk7Ci0gICAgICB5eXNpemUxID0geXlzaXplICsgeXlzdHJsZW4gKHl5Zik7Ci0gICAgICB5eXNpemVfb3ZlcmZsb3cgfD0gKHl5c2l6ZTEgPCB5eXNpemUpOwotICAgICAgeXlzaXplID0geXlzaXplMTsKLQotICAgICAgaWYgKHl5c2l6ZV9vdmVyZmxvdykKLQlyZXR1cm4gWVlTSVpFX01BWElNVU07Ci0KLSAgICAgIGlmICh5eXJlc3VsdCkKLQl7Ci0JICAvKiBBdm9pZCBzcHJpbnRmLCBhcyB0aGF0IGluZnJpbmdlcyBvbiB0aGUgdXNlcidzIG5hbWUgc3BhY2UuCi0JICAgICBEb24ndCBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciBldmVuIGlmIHRoZSB0cmFuc2xhdGlvbgotCSAgICAgcHJvZHVjZWQgYSBzdHJpbmcgd2l0aCB0aGUgd3JvbmcgbnVtYmVyIG9mICIlcyJzLiAgKi8KLQkgIGNoYXIgKnl5cCA9IHl5cmVzdWx0OwotCSAgaW50IHl5aSA9IDA7Ci0JICB3aGlsZSAoKCp5eXAgPSAqeXlmKSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKCp5eXAgPT0gJyUnICYmIHl5ZlsxXSA9PSAncycgJiYgeXlpIDwgeXljb3VudCkKLQkJewotCQkgIHl5cCArPSB5eXRuYW1lcnIgKHl5cCwgeXlhcmdbeXlpKytdKTsKLQkJICB5eWYgKz0gMjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHl5cCsrOwotCQkgIHl5ZisrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4geXlzaXplOworICAgICAgICAgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCisgICAgICAgICAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IKKyAgICAgICAgICAgICAgICAmJiAheXl0YWJsZV92YWx1ZV9pc19lcnJvciAoeXl0YWJsZVt5eXggKyB5eW5dKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh5eWNvdW50ID09IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0pCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHl5Y291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICB5eXNpemUgPSB5eXNpemUwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB5eWFyZ1t5eWNvdW50KytdID0geXl0bmFtZVt5eXhdOworICAgICAgICAgICAgICAgIHl5c2l6ZTEgPSB5eXNpemUgKyB5eXRuYW1lcnIgKDAsIHl5dG5hbWVbeXl4XSk7CisgICAgICAgICAgICAgICAgaWYgKCEgKHl5c2l6ZSA8PSB5eXNpemUxCisgICAgICAgICAgICAgICAgICAgICAgICYmIHl5c2l6ZTEgPD0gWVlTVEFDS19BTExPQ19NQVhJTVVNKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgICAgIHl5c2l6ZSA9IHl5c2l6ZTE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KKworICBzd2l0Y2ggKHl5Y291bnQpCisgICAgeworIyBkZWZpbmUgWVlDQVNFXyhOLCBTKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIE46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeXlmb3JtYXQgPSBTOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWsKKyAgICAgIFlZQ0FTRV8oMCwgWVlfKCJzeW50YXggZXJyb3IiKSk7CisgICAgICBZWUNBU0VfKDEsIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIikpOworICAgICAgWVlDQVNFXygyLCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIikpOworICAgICAgWVlDQVNFXygzLCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIikpOworICAgICAgWVlDQVNFXyg0LCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIikpOworICAgICAgWVlDQVNFXyg1LCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIG9yICVzIikpOworIyB1bmRlZiBZWUNBU0VfCisgICAgfQorCisgIHl5c2l6ZTEgPSB5eXNpemUgKyB5eXN0cmxlbiAoeXlmb3JtYXQpOworICBpZiAoISAoeXlzaXplIDw9IHl5c2l6ZTEgJiYgeXlzaXplMSA8PSBZWVNUQUNLX0FMTE9DX01BWElNVU0pKQorICAgIHJldHVybiAyOworICB5eXNpemUgPSB5eXNpemUxOworCisgIGlmICgqeXltc2dfYWxsb2MgPCB5eXNpemUpCisgICAgeworICAgICAgKnl5bXNnX2FsbG9jID0gMiAqIHl5c2l6ZTsKKyAgICAgIGlmICghICh5eXNpemUgPD0gKnl5bXNnX2FsbG9jCisgICAgICAgICAgICAgJiYgKnl5bXNnX2FsbG9jIDw9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkpCisgICAgICAgICp5eW1zZ19hbGxvYyA9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBBdm9pZCBzcHJpbnRmLCBhcyB0aGF0IGluZnJpbmdlcyBvbiB0aGUgdXNlcidzIG5hbWUgc3BhY2UuCisgICAgIERvbid0IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGV2ZW4gaWYgdGhlIHRyYW5zbGF0aW9uCisgICAgIHByb2R1Y2VkIGEgc3RyaW5nIHdpdGggdGhlIHdyb25nIG51bWJlciBvZiAiJXMicy4gICovCisgIHsKKyAgICBjaGFyICp5eXAgPSAqeXltc2c7CisgICAgaW50IHl5aSA9IDA7CisgICAgd2hpbGUgKCgqeXlwID0gKnl5Zm9ybWF0KSAhPSAnXDAnKQorICAgICAgaWYgKCp5eXAgPT0gJyUnICYmIHl5Zm9ybWF0WzFdID09ICdzJyAmJiB5eWkgPCB5eWNvdW50KQorICAgICAgICB7CisgICAgICAgICAgeXlwICs9IHl5dG5hbWVyciAoeXlwLCB5eWFyZ1t5eWkrK10pOworICAgICAgICAgIHl5Zm9ybWF0ICs9IDI7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHl5cCsrOworICAgICAgICAgIHl5Zm9ybWF0Kys7CisgICAgICAgIH0KKyAgfQorICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KLQwKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KIHwgUmVsZWFzZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgdG8gdGhpcyBzeW1ib2wuICB8CkBAIC0xMzU5LDYgKzE0MDIsNyBAQAogICAgIH0KIH0KIAorCiAvKiBQcmV2ZW50IHdhcm5pbmdzIGZyb20gLVdtaXNzaW5nLXByb3RvdHlwZXMuICAqLwogI2lmZGVmIFlZUEFSU0VfUEFSQU0KICNpZiBkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKQEAgLTEzODUsMTAgKzE0MjksOSBAQAogaW50IHl5bmVycnM7CiAKIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5cGFyc2Ugb3IgeXlwdXNoX3BhcnNlLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLgorfCB5eXBhcnNlLiAgfAorYC0tLS0tLS0tLS0qLwogCiAjaWZkZWYgWVlQQVJTRV9QQVJBTQogI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCkBAIC0xNDEyLDggKzE0NTUsNiBAQAogI2VuZGlmCiAjZW5kaWYKIHsKLQotCiAgICAgaW50IHl5c3RhdGU7CiAgICAgLyogTnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZC4gICovCiAgICAgaW50IHl5ZXJyc3RhdHVzOwpAQCAtMTU2OCw3ICsxNjA5LDcgQEAKIAogICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZUEFDVF9OSU5GKQorICBpZiAoeXlwYWN0X3ZhbHVlX2lzX2RlZmF1bHQgKHl5bikpCiAgICAgZ290byB5eWRlZmF1bHQ7CiAKICAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KQEAgLTE1OTksOCArMTY0MCw4IEBACiAgIHl5biA9IHl5dGFibGVbeXluXTsKICAgaWYgKHl5biA8PSAwKQogICAgIHsKLSAgICAgIGlmICh5eW4gPT0gMCB8fCB5eW4gPT0gWVlUQUJMRV9OSU5GKQotCWdvdG8geXllcnJsYWI7CisgICAgICBpZiAoeXl0YWJsZV92YWx1ZV9pc19lcnJvciAoeXluKSkKKyAgICAgICAgZ290byB5eWVycmxhYjsKICAgICAgIHl5biA9IC15eW47CiAgICAgICBnb3RvIHl5cmVkdWNlOwogICAgIH0KQEAgLTE2NTUsNDIgKzE2OTYsNDIgQEAKICAgICB7CiAgICAgICAgIGNhc2UgNDoKIAotICAgIHsgaXNfdHlwZWRlZiA9IDA7IGlzX2V4dGVybiA9IDA7IGN1cnJlbnRfbmFtZSA9IE5VTEw7IGRlY2xfc3BlYyA9IE5VTEw7IDt9CisgICAgeyBpc190eXBlZGVmID0gMDsgaXNfZXh0ZXJuID0gMDsgY3VycmVudF9uYW1lID0gTlVMTDsgZGVjbF9zcGVjID0gTlVMTDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNToKIAotICAgIHsgZnJlZV9saXN0KCooeXl2c3BbKDIpIC0gKDIpXSksIE5VTEwpOyAqKHl5dnNwWygyKSAtICgyKV0pID0gTlVMTDsgO30KKyAgICB7IGZyZWVfbGlzdCgqKHl5dnNwWygyKSAtICgyKV0pLCBOVUxMKTsgKih5eXZzcFsoMikgLSAoMildKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDY6CiAKLSAgICB7IGlzX3R5cGVkZWYgPSAxOyA7fQorICAgIHsgaXNfdHlwZWRlZiA9IDE7IH0KICAgICBicmVhazsKIAogICBjYXNlIDc6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA4OgogCi0gICAgeyBpc190eXBlZGVmID0gMTsgO30KKyAgICB7IGlzX3R5cGVkZWYgPSAxOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTQ6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNToKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE2OgpAQCAtMTcwNCwxMiArMTc0NSwxMiBAQAogCQkgICAgY3VycmVudF9uYW1lID0gTlVMTDsKIAkJICB9CiAJCSAgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsKLQkJO30KKwkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTc6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE5OgpAQCAtMTcyMCw3ICsxNzYxLDcgQEAKIAkJCSAgICAgaXNfdHlwZWRlZiA/IFNZTV9UWVBFREVGIDogU1lNX05PUk1BTCwgZGVjbCwgaXNfZXh0ZXJuKTsKIAkJICBjdXJyZW50X25hbWUgPSBOVUxMOwogCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7Ci0JCTt9CisJCX0KICAgICBicmVhazsKIAogICBjYXNlIDIwOgpAQCAtMTczMywyNyArMTc3NCwyNyBAQAogCQkJICAgICBpc190eXBlZGVmID8gU1lNX1RZUEVERUYgOiBTWU1fTk9STUFMLCBkZWNsLCBpc19leHRlcm4pOwogCQkgIGN1cnJlbnRfbmFtZSA9IE5VTEw7CiAJCSAgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsKLQkJO30KKwkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMjE6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSkgPyAoeXl2c3BbKDQpIC0gKDQpXSkgOiAoeXl2c3BbKDMpIC0gKDQpXSkgPyAoeXl2c3BbKDMpIC0gKDQpXSkgOiAoeXl2c3BbKDIpIC0gKDQpXSkgPyAoeXl2c3BbKDIpIC0gKDQpXSkgOiAoeXl2c3BbKDEpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pID8gKHl5dnNwWyg0KSAtICg0KV0pIDogKHl5dnNwWygzKSAtICg0KV0pID8gKHl5dnNwWygzKSAtICg0KV0pIDogKHl5dnNwWygyKSAtICg0KV0pID8gKHl5dnNwWygyKSAtICg0KV0pIDogKHl5dnNwWygxKSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAyMjoKIAotICAgIHsgZGVjbF9zcGVjID0gTlVMTDsgO30KKyAgICB7IGRlY2xfc3BlYyA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDI0OgogCi0gICAgeyBkZWNsX3NwZWMgPSAqKHl5dnNwWygxKSAtICgxKV0pOyA7fQorICAgIHsgZGVjbF9zcGVjID0gKih5eXZzcFsoMSkgLSAoMSldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMjU6CiAKLSAgICB7IGRlY2xfc3BlYyA9ICooeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyBkZWNsX3NwZWMgPSAqKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAyNjoKQEAgLTE3NjIsOTcgKzE4MDMsODIgQEAKIAkJICAgICBpcyByZWFsbHkgaXJyZWxldmFudCB0byB0aGUgbGlua2FnZS4gICovCiAJCSAgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgxKV0pKTsKIAkJICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOwotCQk7fQorCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAzMToKIAotICAgIHsgaXNfZXh0ZXJuID0gMTsgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsgO30KKyAgICB7IGlzX2V4dGVybiA9IDE7ICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDMyOgogCi0gICAgeyBpc19leHRlcm4gPSAwOyAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOyA7fQorICAgIHsgaXNfZXh0ZXJuID0gMDsgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMzc6CiAKLSAgICB7IHJlbW92ZV9ub2RlKCh5eXZzcFsoMSkgLSAoMildKSk7ICgqKHl5dnNwWygyKSAtICgyKV0pKS0+dGFnID0gU1lNX1NUUlVDVDsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7IHJlbW92ZV9ub2RlKCh5eXZzcFsoMSkgLSAoMildKSk7ICgqKHl5dnNwWygyKSAtICgyKV0pKS0+dGFnID0gU1lNX1NUUlVDVDsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMzg6CiAKLSAgICB7IHJlbW92ZV9ub2RlKCh5eXZzcFsoMSkgLSAoMildKSk7ICgqKHl5dnNwWygyKSAtICgyKV0pKS0+dGFnID0gU1lNX1VOSU9OOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgyKV0pKTsgKCooeXl2c3BbKDIpIC0gKDIpXSkpLT50YWcgPSBTWU1fVU5JT047ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDM5OgogCi0gICAgeyByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDIpXSkpOyAoKih5eXZzcFsoMikgLSAoMildKSktPnRhZyA9IFNZTV9FTlVNOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgyKV0pKTsgKCooeXl2c3BbKDIpIC0gKDIpXSkpLT50YWcgPSBTWU1fRU5VTTsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDA6CiAKLSAgICB7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICooeXl2c3BbKDMpIC0gKDMpXSksICppID0gKih5eXZzcFsoMikgLSAoMyldKSwgKnI7Ci0JCSAgciA9IGNvcHlfbm9kZShpKTsgci0+dGFnID0gU1lNX1NUUlVDVDsKLQkJICByLT5uZXh0ID0gKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0OyAqKHl5dnNwWygzKSAtICgzKV0pID0gcjsgKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0ID0gTlVMTDsKLQkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1NUUlVDVCwgcywgaXNfZXh0ZXJuKTsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOwotCQk7fQorICAgIHsgcmVjb3JkX2NvbXBvdW5kKCh5eXZzcFsoMSkgLSAoMyldKSwgKHl5dnNwWygyKSAtICgzKV0pLCAoeXl2c3BbKDMpIC0gKDMpXSksIFNZTV9TVFJVQ1QpOyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA0MToKIAotICAgIHsgc3RydWN0IHN0cmluZ19saXN0ICpzID0gKih5eXZzcFsoMykgLSAoMyldKSwgKmkgPSAqKHl5dnNwWygyKSAtICgzKV0pLCAqcjsKLQkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fVU5JT047Ci0JCSAgci0+bmV4dCA9ICgqKHl5dnNwWygxKSAtICgzKV0pKS0+bmV4dDsgKih5eXZzcFsoMykgLSAoMyldKSA9IHI7ICgqKHl5dnNwWygxKSAtICgzKV0pKS0+bmV4dCA9IE5VTEw7Ci0JCSAgYWRkX3N5bWJvbChpLT5zdHJpbmcsIFNZTV9VTklPTiwgcywgaXNfZXh0ZXJuKTsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOwotCQk7fQorICAgIHsgcmVjb3JkX2NvbXBvdW5kKCh5eXZzcFsoMSkgLSAoMyldKSwgKHl5dnNwWygyKSAtICgzKV0pLCAoeXl2c3BbKDMpIC0gKDMpXSksIFNZTV9VTklPTik7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDQyOgogCi0gICAgeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqKHl5dnNwWygzKSAtICgzKV0pLCAqaSA9ICooeXl2c3BbKDIpIC0gKDMpXSksICpyOwotCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9FTlVNOwotCQkgIHItPm5leHQgPSAoKih5eXZzcFsoMSkgLSAoMyldKSktPm5leHQ7ICooeXl2c3BbKDMpIC0gKDMpXSkgPSByOyAoKih5eXZzcFsoMSkgLSAoMyldKSktPm5leHQgPSBOVUxMOwotCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fRU5VTSwgcywgaXNfZXh0ZXJuKTsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOwotCQk7fQorICAgIHsgcmVjb3JkX2NvbXBvdW5kKCh5eXZzcFsoMSkgLSAoMyldKSwgKHl5dnNwWygyKSAtICgzKV0pLCAoeXl2c3BbKDMpIC0gKDMpXSksIFNZTV9FTlVNKTsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDM6CiAKLSAgICB7IGFkZF9zeW1ib2woTlVMTCwgU1lNX0VOVU0sIE5VTEwsIDApOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgYWRkX3N5bWJvbChOVUxMLCBTWU1fRU5VTSwgTlVMTCwgMCk7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDQ0OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDU6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA1NjoKIAotICAgIHsgKCooeXl2c3BbKDEpIC0gKDEpXSkpLT50YWcgPSBTWU1fVFlQRURFRjsgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsgO30KKyAgICB7ICgqKHl5dnNwWygxKSAtICgxKV0pKS0+dGFnID0gU1lNX1RZUEVERUY7ICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDU3OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pID8gKHl5dnNwWygyKSAtICgyKV0pIDogKHl5dnNwWygxKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNTg6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDYxOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNjU6CkBAIC0xODYwLDEyICsxODg2LDEyIEBACiAgICAgeyAvKiByZXN0cmljdCBoYXMgbm8gZWZmZWN0IGluIHByb3RvdHlwZXMgc28gaWdub3JlIGl0ICovCiAJCSAgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgxKV0pKTsKIAkJICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOwotCQk7fQorCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA2NjoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDY4OgpAQCAtMTg3Nyw5NyArMTkwMyw5NyBAQAogCQkgICAgY3VycmVudF9uYW1lID0gKCooeXl2c3BbKDEpIC0gKDEpXSkpLT5zdHJpbmc7CiAJCSAgICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOwogCQkgIH0KLQkJO30KKwkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNjk6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3MDoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDcxOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNzI6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3MzoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDc0OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNzg6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3OToKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDgwOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODE6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA4MjoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDgzOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODU6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA4NjoKIAotICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9CisgICAgeyAoeXl2YWwpID0gTlVMTDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODk6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5MDoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSkgPyAoeXl2c3BbKDIpIC0gKDIpXSkgOiAoeXl2c3BbKDEpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDkxOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pID8gKHl5dnNwWygyKSAtICgyKV0pIDogKHl5dnNwWygxKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgOTM6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDk0OgpAQCAtMTk3NiwzOSArMjAwMiwzOSBAQAogCQkgICAgIHByaXZhdGUgcGFyYW1ldGVyIG5hbWVzLiAgKi8KIAkJICByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDEpXSkpOwogCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7Ci0JCTt9CisJCX0KICAgICBicmVhazsKIAogICBjYXNlIDk1OgogCiAgICAgeyByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDEpXSkpOwogCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7Ci0JCTt9CisJCX0KICAgICBicmVhazsKIAogICBjYXNlIDk2OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgOTc6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5ODoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDk5OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTAwOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTAxOgpAQCAtMjAxNyw4NyArMjA0Myw4NyBAQAogCQkgICooeXl2c3BbKDIpIC0gKDMpXSkgPSBOVUxMOwogCQkgIGFkZF9zeW1ib2woY3VycmVudF9uYW1lLCBTWU1fTk9STUFMLCBkZWNsLCBpc19leHRlcm4pOwogCQkgICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7Ci0JCTt9CisJCX0KICAgICBicmVhazsKIAogICBjYXNlIDEwMjoKIAotICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9CisgICAgeyAoeXl2YWwpID0gTlVMTDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA0OgogCi0gICAgeyByZW1vdmVfbGlzdCgoeXl2c3BbKDIpIC0gKDIpXSksICYoKih5eXZzcFsoMSkgLSAoMildKSktPm5leHQpOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgcmVtb3ZlX2xpc3QoKHl5dnNwWygyKSAtICgyKV0pLCAmKCooeXl2c3BbKDEpIC0gKDIpXSkpLT5uZXh0KTsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA1OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA2OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA3OgogCi0gICAgeyAoeXl2YWwpID0gTlVMTDsgO30KKyAgICB7ICh5eXZhbCkgPSBOVUxMOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTA6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTE6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTI6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTM6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDExNjoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDExNzoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSkgPyAoeXl2c3BbKDIpIC0gKDIpXSkgOiAoeXl2c3BbKDEpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDExODoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEyMDoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEyMToKIAotICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9CisgICAgeyAoeXl2YWwpID0gTlVMTDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTIzOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTI0OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTI3OgpAQCAtMjEwNSw3ICsyMTMxLDcgQEAKICAgICB7CiAJCQljb25zdCBjaGFyICpuYW1lID0gc3RyZHVwKCgqKHl5dnNwWygxKSAtICgxKV0pKS0+c3RyaW5nKTsKIAkJCWFkZF9zeW1ib2wobmFtZSwgU1lNX0VOVU1fQ09OU1QsIE5VTEwsIDApOwotCQk7fQorCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjg6CkBAIC0yMTE0LDI4ICsyMTQwLDM5IEBACiAJCQljb25zdCBjaGFyICpuYW1lID0gc3RyZHVwKCgqKHl5dnNwWygxKSAtICgzKV0pKS0+c3RyaW5nKTsKIAkJCXN0cnVjdCBzdHJpbmdfbGlzdCAqZXhwciA9IGNvcHlfbGlzdF9yYW5nZSgqKHl5dnNwWygzKSAtICgzKV0pLCAqKHl5dnNwWygyKSAtICgzKV0pKTsKIAkJCWFkZF9zeW1ib2wobmFtZSwgU1lNX0VOVU1fQ09OU1QsIGV4cHIsIDApOwotCQk7fQorCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjk6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzA6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEzMjoKIAotICAgIHsgZXhwb3J0X3N5bWJvbCgoKih5eXZzcFsoMykgLSAoNSldKSktPnN0cmluZyk7ICh5eXZhbCkgPSAoeXl2c3BbKDUpIC0gKDUpXSk7IDt9CisgICAgeyBleHBvcnRfc3ltYm9sKCgqKHl5dnNwWygzKSAtICg1KV0pKS0+c3RyaW5nKTsgKHl5dmFsKSA9ICh5eXZzcFsoNSkgLSAoNSldKTsgfQogICAgIGJyZWFrOwogCiAKIAogICAgICAgZGVmYXVsdDogYnJlYWs7CiAgICAgfQorICAvKiBVc2VyIHNlbWFudGljIGFjdGlvbnMgc29tZXRpbWVzIGFsdGVyIHl5Y2hhciwgYW5kIHRoYXQgcmVxdWlyZXMKKyAgICAgdGhhdCB5eXRva2VuIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IHRyYW5zbGF0aW9uLiAgV2UgdGFrZSB0aGUKKyAgICAgYXBwcm9hY2ggb2YgdHJhbnNsYXRpbmcgaW1tZWRpYXRlbHkgYmVmb3JlIGV2ZXJ5IHVzZSBvZiB5eXRva2VuLgorICAgICBPbmUgYWx0ZXJuYXRpdmUgaXMgdHJhbnNsYXRpbmcgaGVyZSBhZnRlciBldmVyeSBzZW1hbnRpYyBhY3Rpb24sCisgICAgIGJ1dCB0aGF0IHRyYW5zbGF0aW9uIHdvdWxkIGJlIG1pc3NlZCBpZiB0aGUgc2VtYW50aWMgYWN0aW9uIGludm9rZXMKKyAgICAgWVlBQk9SVCwgWVlBQ0NFUFQsIG9yIFlZRVJST1IgaW1tZWRpYXRlbHkgYWZ0ZXIgYWx0ZXJpbmcgeXljaGFyIG9yCisgICAgIGlmIGl0IGludm9rZXMgWVlCQUNLVVAuICBJbiB0aGUgY2FzZSBvZiBZWUFCT1JUIG9yIFlZQUNDRVBULCBhbgorICAgICBpbmNvcnJlY3QgZGVzdHJ1Y3RvciBtaWdodCB0aGVuIGJlIGludm9rZWQgaW1tZWRpYXRlbHkuICBJbiB0aGUKKyAgICAgY2FzZSBvZiBZWUVSUk9SIG9yIFlZQkFDS1VQLCBzdWJzZXF1ZW50IHBhcnNlciBhY3Rpb25zIG1pZ2h0IGxlYWQKKyAgICAgdG8gYW4gaW5jb3JyZWN0IGRlc3RydWN0b3IgY2FsbCBvciB2ZXJib3NlIHN5bnRheCBlcnJvciBtZXNzYWdlCisgICAgIGJlZm9yZSB0aGUgbG9va2FoZWFkIGlzIHRyYW5zbGF0ZWQuICAqLwogICBZWV9TWU1CT0xfUFJJTlQgKCItPiAkJCA9IiwgeXlyMVt5eW5dLCAmeXl2YWwsICZ5eWxvYyk7CiAKICAgWVlQT1BTVEFDSyAoeXlsZW4pOwpAQCAtMjE2Myw2ICsyMjAwLDEwIEBACiB8IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogeXllcnJsYWI6CisgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGxhdGVzdCBsb29rYWhlYWQgdHJhbnNsYXRpb24uICBTZWUgY29tbWVudHMgYXQKKyAgICAgdXNlciBzZW1hbnRpYyBhY3Rpb25zIGZvciB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuICAqLworICB5eXRva2VuID0geXljaGFyID09IFlZRU1QVFkgPyBZWUVNUFRZIDogWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisKICAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCiAgIGlmICgheXllcnJzdGF0dXMpCiAgICAgewpAQCAtMjE3MCwzNyArMjIxMSwzNiBAQAogI2lmICEgWVlFUlJPUl9WRVJCT1NFCiAgICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKICNlbHNlCisjIGRlZmluZSBZWVNZTlRBWF9FUlJPUiB5eXN5bnRheF9lcnJvciAoJnl5bXNnX2FsbG9jLCAmeXltc2csIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eXNzcCwgeXl0b2tlbikKICAgICAgIHsKLQlZWVNJWkVfVCB5eXNpemUgPSB5eXN5bnRheF9lcnJvciAoMCwgeXlzdGF0ZSwgeXljaGFyKTsKLQlpZiAoeXltc2dfYWxsb2MgPCB5eXNpemUgJiYgeXltc2dfYWxsb2MgPCBZWVNUQUNLX0FMTE9DX01BWElNVU0pCi0JICB7Ci0JICAgIFlZU0laRV9UIHl5YWxsb2MgPSAyICogeXlzaXplOwotCSAgICBpZiAoISAoeXlzaXplIDw9IHl5YWxsb2MgJiYgeXlhbGxvYyA8PSBZWVNUQUNLX0FMTE9DX01BWElNVU0pKQotCSAgICAgIHl5YWxsb2MgPSBZWVNUQUNLX0FMTE9DX01BWElNVU07Ci0JICAgIGlmICh5eW1zZyAhPSB5eW1zZ2J1ZikKLQkgICAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKLQkgICAgeXltc2cgPSAoY2hhciAqKSBZWVNUQUNLX0FMTE9DICh5eWFsbG9jKTsKLQkgICAgaWYgKHl5bXNnKQotCSAgICAgIHl5bXNnX2FsbG9jID0geXlhbGxvYzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJeXltc2cgPSB5eW1zZ2J1ZjsKLQkJeXltc2dfYWxsb2MgPSBzaXplb2YgeXltc2didWY7Ci0JICAgICAgfQotCSAgfQotCi0JaWYgKDAgPCB5eXNpemUgJiYgeXlzaXplIDw9IHl5bXNnX2FsbG9jKQotCSAgewotCSAgICAodm9pZCkgeXlzeW50YXhfZXJyb3IgKHl5bXNnLCB5eXN0YXRlLCB5eWNoYXIpOwotCSAgICB5eWVycm9yICh5eW1zZyk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKLQkgICAgaWYgKHl5c2l6ZSAhPSAwKQotCSAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7Ci0JICB9CisgICAgICAgIGNoYXIgY29uc3QgKnl5bXNncCA9IFlZXygic3ludGF4IGVycm9yIik7CisgICAgICAgIGludCB5eXN5bnRheF9lcnJvcl9zdGF0dXM7CisgICAgICAgIHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9IFlZU1lOVEFYX0VSUk9SOworICAgICAgICBpZiAoeXlzeW50YXhfZXJyb3Jfc3RhdHVzID09IDApCisgICAgICAgICAgeXltc2dwID0geXltc2c7CisgICAgICAgIGVsc2UgaWYgKHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9PSAxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh5eW1zZyAhPSB5eW1zZ2J1ZikKKyAgICAgICAgICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7CisgICAgICAgICAgICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5bXNnX2FsbG9jKTsKKyAgICAgICAgICAgIGlmICgheXltc2cpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5eW1zZyA9IHl5bXNnYnVmOworICAgICAgICAgICAgICAgIHl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOworICAgICAgICAgICAgICAgIHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9IDI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9IFlZU1lOVEFYX0VSUk9SOworICAgICAgICAgICAgICAgIHl5bXNncCA9IHl5bXNnOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB5eWVycm9yICh5eW1zZ3ApOworICAgICAgICBpZiAoeXlzeW50YXhfZXJyb3Jfc3RhdHVzID09IDIpCisgICAgICAgICAgZ290byB5eWV4aGF1c3RlZGxhYjsKICAgICAgIH0KKyMgdW5kZWYgWVlTWU5UQVhfRVJST1IKICNlbmRpZgogICAgIH0KIApAQCAtMjI1OSw3ICsyMjk5LDcgQEAKICAgZm9yICg7OykKICAgICB7CiAgICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gICAgICBpZiAoeXluICE9IFlZUEFDVF9OSU5GKQorICAgICAgaWYgKCF5eXBhY3RfdmFsdWVfaXNfZGVmYXVsdCAoeXluKSkKIAl7CiAJICB5eW4gKz0gWVlURVJST1I7CiAJICBpZiAoMCA8PSB5eW4gJiYgeXluIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5bl0gPT0gWVlURVJST1IpCkBAIC0yMzE4LDggKzIzNTgsMTMgQEAKIAogeXlyZXR1cm46CiAgIGlmICh5eWNoYXIgIT0gWVlFTVBUWSkKLSAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKLQkJIHl5dG9rZW4sICZ5eWx2YWwpOworICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGxhdGVzdCBsb29rYWhlYWQgdHJhbnNsYXRpb24uICBTZWUgY29tbWVudHMgYXQKKyAgICAgICAgIHVzZXIgc2VtYW50aWMgYWN0aW9ucyBmb3Igd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKyAgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBkaXNjYXJkaW5nIGxvb2thaGVhZCIsCisgICAgICAgICAgICAgICAgICB5eXRva2VuLCAmeXlsdmFsKTsKKyAgICB9CiAgIC8qIERvIG5vdCByZWNsYWltIHRoZSBzeW1ib2xzIG9mIHRoZSBydWxlIHdoaWNoIGFjdGlvbiB0cmlnZ2VyZWQKICAgICAgdGhpcyBZWUFCT1JUIG9yIFlZQUNDRVBULiAgKi8KICAgWVlQT1BTVEFDSyAoeXlsZW4pOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS50YWIuaF9zaGlwcGVkIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS50YWIuaF9zaGlwcGVkCmluZGV4IDM1MGMyYjQuLjkzMjQwYTMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UudGFiLmhfc2hpcHBlZAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnRhYi5oX3NoaXBwZWQKQEAgLTEsOSArMSw4IEBACi0vKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjMuICAqLworLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuNS4gICovCiAKLS8qIFNrZWxldG9uIGludGVyZmFjZSBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCisvKiBCaXNvbiBpbnRlcmZhY2UgZm9yIFlhY2MtbGlrZSBwYXJzZXJzIGluIEMKICAgIAotICAgICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAotICAgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OS0xOTkwLCAyMDAwLTIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICAKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55CmluZGV4IGJhNWMyNDIuLjIzYzM5OTkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueQorKysgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkKQEAgLTUxLDYgKzUxLDI1IEBACiAgIGZyZWVfbGlzdChiLCBlKTsKIH0KIAorLyogUmVjb3JkIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3QvdW5pb24vZW51bSAqLworc3RhdGljIHZvaWQgcmVjb3JkX2NvbXBvdW5kKHN0cnVjdCBzdHJpbmdfbGlzdCAqKmtleXcsCisJCSAgICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKippZGVudCwKKwkJICAgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqKmJvZHksCisJCSAgICAgICBlbnVtIHN5bWJvbF90eXBlIHR5cGUpCit7CisJc3RydWN0IHN0cmluZ19saXN0ICpiID0gKmJvZHksICppID0gKmlkZW50LCAqcjsKKworCWlmIChpLT5pbl9zb3VyY2VfZmlsZSkgeworCQlyZW1vdmVfbm9kZShrZXl3KTsKKwkJKCppZGVudCktPnRhZyA9IHR5cGU7CisJCXJlbW92ZV9saXN0KGJvZHksIGlkZW50KTsKKwkJcmV0dXJuOworCX0KKwlyID0gY29weV9ub2RlKGkpOyByLT50YWcgPSB0eXBlOworCXItPm5leHQgPSAoKmtleXcpLT5uZXh0OyAqYm9keSA9IHI7ICgqa2V5dyktPm5leHQgPSBOVUxMOworCWFkZF9zeW1ib2woaS0+c3RyaW5nLCB0eXBlLCBiLCBpc19leHRlcm4pOworfQorCiAlfQogCiAldG9rZW4gQVNNX0tFWVcKQEAgLTIxNSwyNiArMjM0LDExIEBACiAKIAkvKiBGdWxsIGRlZmluaXRpb25zIG9mIGFuIHMvdS9lLiAgUmVjb3JkIGl0LiAgKi8KIAl8IFNUUlVDVF9LRVlXIElERU5UIGNsYXNzX2JvZHkKLQkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqJDMsICppID0gKiQyLCAqcjsKLQkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fU1RSVUNUOwotCQkgIHItPm5leHQgPSAoKiQxKS0+bmV4dDsgKiQzID0gcjsgKCokMSktPm5leHQgPSBOVUxMOwotCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fU1RSVUNULCBzLCBpc19leHRlcm4pOwotCQkgICQkID0gJDM7Ci0JCX0KKwkJeyByZWNvcmRfY29tcG91bmQoJDEsICQyLCAkMywgU1lNX1NUUlVDVCk7ICQkID0gJDM7IH0KIAl8IFVOSU9OX0tFWVcgSURFTlQgY2xhc3NfYm9keQotCQl7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICokMywgKmkgPSAqJDIsICpyOwotCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9VTklPTjsKLQkJICByLT5uZXh0ID0gKCokMSktPm5leHQ7ICokMyA9IHI7ICgqJDEpLT5uZXh0ID0gTlVMTDsKLQkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1VOSU9OLCBzLCBpc19leHRlcm4pOwotCQkgICQkID0gJDM7Ci0JCX0KKwkJeyByZWNvcmRfY29tcG91bmQoJDEsICQyLCAkMywgU1lNX1VOSU9OKTsgJCQgPSAkMzsgfQogCXwgRU5VTV9LRVlXIElERU5UIGVudW1fYm9keQotCQl7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICokMywgKmkgPSAqJDIsICpyOwotCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9FTlVNOwotCQkgIHItPm5leHQgPSAoKiQxKS0+bmV4dDsgKiQzID0gcjsgKCokMSktPm5leHQgPSBOVUxMOwotCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fRU5VTSwgcywgaXNfZXh0ZXJuKTsKLQkJICAkJCA9ICQzOwotCQl9CisJCXsgcmVjb3JkX2NvbXBvdW5kKCQxLCAkMiwgJDMsIFNZTV9FTlVNKTsgJCQgPSAkMzsgfQogCS8qCiAJICogQW5vbnltb3VzIGVudW0gZGVmaW5pdGlvbi4gVGVsbCBhZGRfc3ltYm9sKCkgdG8gcmVzdGFydCBpdHMgY291bnRlci4KIAkgKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZSBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQppbmRleCA4MmQyZWIyLi5iYTU3M2ZlIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCkBAIC0zMywxNyArMzMsOSBAQAogCSQoUSlta2RpciAtcCBpbmNsdWRlL2dlbmVyYXRlZAogCSQ8IC0tJEAgJChLY29uZmlnKQogCi0jIGlmIG5vIHBhdGggaXMgZ2l2ZW4sIHRoZW4gdXNlIHNyYyBkaXJlY3RvcnkgdG8gZmluZCBmaWxlCi1pZmRlZiBMU01PRAotTFNNT0RfRiA6PSAkKExTTU9EKQotaWZlcSAoJChmaW5kc3RyaW5nIC8sJChMU01PRCkpLCkKLSAgTFNNT0RfRiA6PSAkKG9ianRyZWUpLyQoTFNNT0QpCi1lbmRpZgotZW5kaWYKLQotbG9jYWxtb2Rjb25maWc6ICQob2JqKS9zdHJlYW1saW5lX2NvbmZpZy5wbCAkKG9iaikvY29uZgorbG9jYWx5ZXNjb25maWcgbG9jYWxtb2Rjb25maWc6ICQob2JqKS9zdHJlYW1saW5lX2NvbmZpZy5wbCAkKG9iaikvY29uZgogCSQoUSlta2RpciAtcCBpbmNsdWRlL2dlbmVyYXRlZAotCSQoUSlwZXJsICQ8ICQoc3JjdHJlZSkgJChLY29uZmlnKSAkKExTTU9EX0YpID4gLnRtcC5jb25maWcKKwkkKFEpcGVybCAkPCAtLSRAICQoc3JjdHJlZSkgJChLY29uZmlnKSA+IC50bXAuY29uZmlnCiAJJChRKWlmIFsgLWYgLmNvbmZpZyBdOyB0aGVuIAkJCQkJXAogCQkJY21wIC1zIC50bXAuY29uZmlnIC5jb25maWcgfHwJCQlcCiAJCQkobXYgLWYgLmNvbmZpZyAuY29uZmlnLm9sZC4xOwkJCVwKQEAgLTU2LDIyICs0OCw2IEBACiAJZmkKIAkkKFEpcm0gLWYgLnRtcC5jb25maWcKIAotbG9jYWx5ZXNjb25maWc6ICQob2JqKS9zdHJlYW1saW5lX2NvbmZpZy5wbCAkKG9iaikvY29uZgotCSQoUSlta2RpciAtcCBpbmNsdWRlL2dlbmVyYXRlZAotCSQoUSlwZXJsICQ8ICQoc3JjdHJlZSkgJChLY29uZmlnKSAkKExTTU9EX0YpID4gLnRtcC5jb25maWcKLQkkKFEpc2VkIC1pIHMvPW0vPXkvIC50bXAuY29uZmlnCi0JJChRKWlmIFsgLWYgLmNvbmZpZyBdOyB0aGVuCQkJCQlcCi0JCQljbXAgLXMgLnRtcC5jb25maWcgLmNvbmZpZyB8fAkJCVwKLQkJCShtdiAtZiAuY29uZmlnIC5jb25maWcub2xkLjE7CQkJXAotCQkJIG12IC1mIC50bXAuY29uZmlnIC5jb25maWc7CQkJXAotCQkJICQob2JqKS9jb25mIC0tc2lsZW50b2xkY29uZmlnICQoS2NvbmZpZyk7CVwKLQkJCSBtdiAtZiAuY29uZmlnLm9sZC4xIC5jb25maWcub2xkKQkJXAotCWVsc2UJCQkJCQkJCVwKLQkJCW12IC1mIC50bXAuY29uZmlnIC5jb25maWc7CQkJXAotCQkJJChvYmopL2NvbmYgLS1zaWxlbnRvbGRjb25maWcgJChLY29uZmlnKTsJXAotCWZpCi0JJChRKXJtIC1mIC50bXAuY29uZmlnCi0KICMgQ3JlYXRlIG5ldyBsaW51eC5wb3QgZmlsZQogIyBBZGp1c3QgY2hhcnNldCB0byBVVEYtOCBpbiAucG8gZmlsZSB0byBhY2NlcHQgVVRGLTggaW4gS2NvbmZpZyBmaWxlcwogIyBUaGUgc3ltbGluayBpcyB1c2VkIHRvIHJlcGFpciBhIGRlZmljaWVuY3kgaW4gYXJjaC91bQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwppbmRleCA1OWI2NjdjLi41YTU4OTY1IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwpAQCAtNTAzLDE3ICs1MDMsNiBAQAogCQkJZnByaW50ZihmcCwgIiNkZWZpbmUgJXMlcyVzIDFcbiIsCiAJCQkgICAgQ09ORklHXywgc3ltLT5uYW1lLCBzdWZmaXgpOwogCQl9Ci0JCS8qCi0JCSAqIEdlbmVyYXRlIHRoZSBfX2VuYWJsZWRfQ09ORklHXyogYW5kCi0JCSAqIF9fZW5hYmxlZF9DT05GSUdfKl9NT0RVTEUgbWFjcm9zIGZvciB1c2UgYnkgdGhlCi0JCSAqIElTX3tFTkFCTEVELEJVSUxUSU4sTU9EVUxFfSBtYWNyb3MuIFRoZSBfTU9EVUxFIHZhcmlhbnQgaXMKLQkJICogZ2VuZXJhdGVkIGV2ZW4gZm9yIGJvb2xlYW5zIHNvIHRoYXQgdGhlIElTX0VOQUJMRUQoKSBtYWNybwotCQkgKiB3b3Jrcy4KLQkJICovCi0JCWZwcmludGYoZnAsICIjZGVmaW5lIF9fZW5hYmxlZF8iIENPTkZJR18gIiVzICVkXG4iLAotCQkJCXN5bS0+bmFtZSwgKCp2YWx1ZSA9PSAneScpKTsKLQkJZnByaW50ZihmcCwgIiNkZWZpbmUgX19lbmFibGVkXyIgQ09ORklHXyAiJXNfTU9EVUxFICVkXG4iLAotCQkJCXN5bS0+bmFtZSwgKCp2YWx1ZSA9PSAnbScpKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgU19IRVg6IHsKQEAgLTU2NSw2ICs1NTQsMzUgQEAKIH07CiAKIC8qCisgKiBHZW5lcmF0ZSB0aGUgX19lbmFibGVkX0NPTkZJR18qIGFuZCBfX2VuYWJsZWRfQ09ORklHXypfTU9EVUxFIG1hY3JvcyBmb3IKKyAqIHVzZSBieSB0aGUgSVNfe0VOQUJMRUQsQlVJTFRJTixNT0RVTEV9IG1hY3Jvcy4gVGhlIF9NT0RVTEUgdmFyaWFudCBpcworICogZ2VuZXJhdGVkIGV2ZW4gZm9yIGJvb2xlYW5zIHNvIHRoYXQgdGhlIElTX0VOQUJMRUQoKSBtYWNybyB3b3Jrcy4KKyAqLworc3RhdGljIHZvaWQKK2hlYWRlcl9wcmludF9fZW5hYmxlZF9zeW1ib2woRklMRSAqZnAsIHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmFyZykKK3sKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOiB7CisJCWZwcmludGYoZnAsICIjZGVmaW5lIF9fZW5hYmxlZF8iIENPTkZJR18gIiVzICVkXG4iLAorCQkgICAgc3ltLT5uYW1lLCAoKnZhbHVlID09ICd5JykpOworCQlmcHJpbnRmKGZwLCAiI2RlZmluZSBfX2VuYWJsZWRfIiBDT05GSUdfICIlc19NT0RVTEUgJWRcbiIsCisJCSAgICBzeW0tPm5hbWUsICgqdmFsdWUgPT0gJ20nKSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uZl9wcmludGVyIGhlYWRlcl9fZW5hYmxlZF9wcmludGVyX2NiID0KK3sKKwkucHJpbnRfc3ltYm9sID0gaGVhZGVyX3ByaW50X19lbmFibGVkX3N5bWJvbCwKKwkucHJpbnRfY29tbWVudCA9IGhlYWRlcl9wcmludF9jb21tZW50LAorfTsKKworLyoKICAqIFRyaXN0YXRlIHByaW50ZXIKICAqCiAgKiBUaGlzIHByaW50ZXIgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIGBpbmNsdWRlL2NvbmZpZy90cmlzdGF0ZS5jb25mJyBmaWxlLgpAQCAtOTQ1LDExICs5NjMsMTYgQEAKIAljb25mX3dyaXRlX2hlYWRpbmcob3V0X2gsICZoZWFkZXJfcHJpbnRlcl9jYiwgTlVMTCk7CiAKIAlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7Ci0JCXN5bV9jYWxjX3ZhbHVlKHN5bSk7Ci0JCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpIHx8ICFzeW0tPm5hbWUpCisJCWlmICghc3ltLT5uYW1lKQogCQkJY29udGludWU7CiAKLQkJLyogd3JpdGUgc3ltYm9sIHRvIGF1dG8uY29uZiwgdHJpc3RhdGUgYW5kIGhlYWRlciBmaWxlcyAqLworCQlzeW1fY2FsY192YWx1ZShzeW0pOworCisJCWNvbmZfd3JpdGVfc3ltYm9sKG91dF9oLCBzeW0sICZoZWFkZXJfX2VuYWJsZWRfcHJpbnRlcl9jYiwgTlVMTCk7CisKKwkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpCisJCQljb250aW51ZTsKKwogCQljb25mX3dyaXRlX3N5bWJvbChvdXQsIHN5bSwgJmtjb25maWdfcHJpbnRlcl9jYiwgKHZvaWQgKikxKTsKIAogCQljb25mX3dyaXRlX3N5bWJvbCh0cmlzdGF0ZSwgc3ltLCAmdHJpc3RhdGVfcHJpbnRlcl9jYiwgKHZvaWQgKikxKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy90ZXh0Ym94LmMgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdGV4dGJveC5jCmluZGV4IGM3MDQ3MTIuLjE1NGMyZGQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy90ZXh0Ym94LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3RleHRib3guYwpAQCAtMzIwLDcgKzMyMCw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIHByaW50X2xpbmUoV0lORE9XICogd2luLCBpbnQgcm93LCBpbnQgd2lkdGgpCiB7Ci0JaW50IHksIHg7CiAJY2hhciAqbGluZTsKIAogCWxpbmUgPSBnZXRfbGluZSgpOwpAQCAtMzI5LDEwICszMjgsMTAgQEAKIAl3YWRkY2god2luLCAnICcpOwogCXdhZGRuc3RyKHdpbiwgbGluZSwgTUlOKHN0cmxlbihsaW5lKSwgd2lkdGggLSAyKSk7CiAKLQlnZXR5eCh3aW4sIHksIHgpOwogCS8qIENsZWFyICdyZXNpZHVlJyBvZiBwcmV2aW91cyBsaW5lICovCiAjaWYgT0xEX05DVVJTRVMKIAl7CisJCWludCB4ID0gZ2V0Y3VyeCh3aW4pOwogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0geDsgaSsrKQogCQkJd2FkZGNoKHdpbiwgJyAnKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKaW5kZXggODIwZDJiNi4uMTllMjAwZCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxsb2NhbGUuaD4KIApAQCAtMjcyLDYgKzI3Myw3IEBACiBzdGF0aWMgaW50IGNoaWxkX2NvdW50Owogc3RhdGljIGludCBzaW5nbGVfbWVudV9tb2RlOwogc3RhdGljIGludCBzaG93X2FsbF9vcHRpb25zOworc3RhdGljIGludCBzYXZlZF94LCBzYXZlZF95OwogCiBzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KTsKIHN0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KTsKQEAgLTc5Miw5ICs3OTQsNTQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaGFuZGxlX2V4aXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJZGlhbG9nX2NsZWFyKCk7CisJaWYgKGNvbmZfZ2V0X2NoYW5nZWQoKSkKKwkJcmVzID0gZGlhbG9nX3llc25vKE5VTEwsCisJCQkJICAgXygiRG8geW91IHdpc2ggdG8gc2F2ZSB5b3VyIG5ldyBjb25maWd1cmF0aW9uID9cbiIKKwkJCQkgICAgICI8RVNDPjxFU0M+IHRvIGNvbnRpbnVlLiIpLAorCQkJCSAgIDYsIDYwKTsKKwllbHNlCisJCXJlcyA9IC0xOworCisJZW5kX2RpYWxvZyhzYXZlZF94LCBzYXZlZF95KTsKKworCXN3aXRjaCAocmVzKSB7CisJY2FzZSAwOgorCQlpZiAoY29uZl93cml0ZShmaWxlbmFtZSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgorCQkJCQkgICJFcnJvciB3aGlsZSB3cml0aW5nIG9mIHRoZSBjb25maWd1cmF0aW9uLlxuIgorCQkJCQkgICJZb3VyIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB3ZXJlIE5PVCBzYXZlZC4iCisJCQkJCSAgIlxuXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIC0xOgorCQlwcmludGYoXygiXG5cbiIKKwkJCSAiKioqIEVuZCBvZiB0aGUgY29uZmlndXJhdGlvbi5cbiIKKwkJCSAiKioqIEV4ZWN1dGUgJ21ha2UnIHRvIHN0YXJ0IHRoZSBidWlsZCBvciB0cnkgJ21ha2UgaGVscCcuIgorCQkJICJcblxuIikpOworCQlyZXMgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgXygiXG5cbiIKKwkJCQkgICJZb3VyIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB3ZXJlIE5PVCBzYXZlZC4iCisJCQkJICAiXG5cbiIpKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnbm8pCit7CisJZXhpdChoYW5kbGVfZXhpdCgpKTsKK30KKwogaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCiB7Ci0JaW50IHNhdmVkX3gsIHNhdmVkX3k7CiAJY2hhciAqbW9kZTsKIAlpbnQgcmVzOwogCkBAIC04MDIsNiArODQ5LDggQEAKIAliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwogCXRleHRkb21haW4oUEFDS0FHRSk7CiAKKwlzaWduYWwoU0lHSU5ULCBzaWdfaGFuZGxlcik7CisKIAljb25mX3BhcnNlKGF2WzFdKTsKIAljb25mX3JlYWQoTlVMTCk7CiAKQEAgLTgyMyw0MCArODcyLDkgQEAKIAlzZXRfY29uZmlnX2ZpbGVuYW1lKGNvbmZfZ2V0X2NvbmZpZ25hbWUoKSk7CiAJZG8gewogCQljb25mKCZyb290bWVudSk7Ci0JCWRpYWxvZ19jbGVhcigpOwotCQlpZiAoY29uZl9nZXRfY2hhbmdlZCgpKQotCQkJcmVzID0gZGlhbG9nX3llc25vKE5VTEwsCi0JCQkJCSAgIF8oIkRvIHlvdSB3aXNoIHRvIHNhdmUgeW91ciAiCi0JCQkJCSAgICAgIm5ldyBjb25maWd1cmF0aW9uP1xuIgotCQkJCQkgICAgICI8RVNDPjxFU0M+IHRvIGNvbnRpbnVlLiIpLAotCQkJCQkgICA2LCA2MCk7Ci0JCWVsc2UKLQkJCXJlcyA9IC0xOworCQlyZXMgPSBoYW5kbGVfZXhpdCgpOwogCX0gd2hpbGUgKHJlcyA9PSBLRVlfRVNDKTsKLQllbmRfZGlhbG9nKHNhdmVkX3gsIHNhdmVkX3kpOwogCi0Jc3dpdGNoIChyZXMpIHsKLQljYXNlIDA6Ci0JCWlmIChjb25mX3dyaXRlKGZpbGVuYW1lKSkgewotCQkJZnByaW50ZihzdGRlcnIsIF8oIlxuXG4iCi0JCQkJIkVycm9yIHdoaWxlIHdyaXRpbmcgb2YgdGhlIGNvbmZpZ3VyYXRpb24uXG4iCi0JCQkJIllvdXIgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdlcmUgTk9UIHNhdmVkLiIKLQkJCQkiXG5cbiIpKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgLTE6Ci0JCXByaW50ZihfKCJcblxuIgotCQkJIioqKiBFbmQgb2YgdGhlIGNvbmZpZ3VyYXRpb24uXG4iCi0JCQkiKioqIEV4ZWN1dGUgJ21ha2UnIHRvIHN0YXJ0IHRoZSBidWlsZCBvciB0cnkgJ21ha2UgaGVscCcuIgotCQkJIlxuXG4iKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgotCQkJIllvdXIgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdlcmUgTk9UIHNhdmVkLiIKLQkJCSJcblxuIikpOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCmluZGV4IGQ2NjAwODYuLjhjMmE5N2UgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpAQCAtMTAsOCArMTAsNyBAQAogCiAjaW5jbHVkZSAibGtjLmgiCiAKLXN0YXRpYyBjb25zdCBjaGFyIG5vaGVscF90ZXh0W10gPSBOXygKLQkiVGhlcmUgaXMgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uLlxuIik7CitzdGF0aWMgY29uc3QgY2hhciBub2hlbHBfdGV4dFtdID0gIlRoZXJlIGlzIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbi4iOwogCiBzdHJ1Y3QgbWVudSByb290bWVudTsKIHN0YXRpYyBzdHJ1Y3QgbWVudSAqKmxhc3RfZW50cnlfcHRyOwpAQCAtNTk1LDE2ICs1OTQsMTQgQEAKIHZvaWQgbWVudV9nZXRfZXh0X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUsIHN0cnVjdCBnc3RyICpoZWxwKQogewogCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwljb25zdCBjaGFyICpoZWxwX3RleHQgPSBub2hlbHBfdGV4dDsKIAogCWlmIChtZW51X2hhc19oZWxwKG1lbnUpKSB7Ci0JCWlmIChzeW0tPm5hbWUpIHsKKwkJaWYgKHN5bS0+bmFtZSkKIAkJCXN0cl9wcmludGYoaGVscCwgIiVzJXM6XG5cbiIsIENPTkZJR18sIHN5bS0+bmFtZSk7Ci0JCQlzdHJfYXBwZW5kKGhlbHAsIF8obWVudV9nZXRfaGVscChtZW51KSkpOwotCQkJc3RyX2FwcGVuZChoZWxwLCAiXG4iKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXN0cl9hcHBlbmQoaGVscCwgbm9oZWxwX3RleHQpOworCQloZWxwX3RleHQgPSBtZW51X2dldF9oZWxwKG1lbnUpOwogCX0KKwlzdHJfcHJpbnRmKGhlbHAsICIlc1xuIiwgXyhoZWxwX3RleHQpKTsKIAlpZiAoc3ltKQogCQlnZXRfc3ltYm9sX3N0cihoZWxwLCBzeW0pOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuYwppbmRleCAzOWNhMWYxLi43MzA3MGNiIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbmNvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuYwpAQCAtMTgyLDggKzE4Miw2IEBACiAiVGhpcyBmZWF0dXJlIGRlcGVuZHMgb24gYW5vdGhlciB3aGljaFxuIgogImhhcyBiZWVuIGNvbmZpZ3VyZWQgYXMgYSBtb2R1bGUuXG4iCiAiQXMgYSByZXN1bHQsIHRoaXMgZmVhdHVyZSB3aWxsIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiIpLAotbm9oZWxwX3RleHRbXSA9IE5fKAotIlRoZXJlIGlzIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbi5cbiIpLAogbG9hZF9jb25maWdfdGV4dFtdID0gTl8oCiAiRW50ZXIgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB5b3Ugd2lzaCB0byBsb2FkLlxuIgogIkFjY2VwdCB0aGUgbmFtZSBzaG93biB0byByZXN0b3JlIHRoZSBjb25maWd1cmF0aW9uIHlvdVxuIgpAQCAtMjgwLDYgKzI3OCw5IEBACiAvKiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJ1dHRvbiAqLwogY29uc3QgY2hhciAqY3VycmVudF9pbnN0cnVjdGlvbnMgPSBtZW51X2luc3RydWN0aW9uczsKIAorc3RhdGljIGNoYXIgKmRpYWxvZ19pbnB1dF9yZXN1bHQ7CitzdGF0aWMgaW50IGRpYWxvZ19pbnB1dF9yZXN1bHRfbGVuOworCiBzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KTsKIHN0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KTsKIHN0YXRpYyB2b2lkIGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KTsKQEAgLTY5NSw3ICs2OTYsNiBAQAogewogCXN0cnVjdCBzeW1ib2wgKipzeW1fYXJyOwogCXN0cnVjdCBnc3RyIHJlczsKLQljaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbMTAwXTsKIAljaGFyICpkaWFsb2dfaW5wdXQ7CiAJaW50IGRyZXM7CiBhZ2FpbjoKQEAgLTcwMyw3ICs3MDMsNyBAQAogCQkJXygiU2VhcmNoIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIiksCiAJCQlfKCJFbnRlciAiIENPTkZJR18gIiAoc3ViKXN0cmluZyB0byBzZWFyY2ggZm9yICIKIAkJCQkiKHdpdGggb3Igd2l0aG91dCBcIiIgQ09ORklHXyAiXCIpIiksCi0JCQkiIiwgZGlhbG9nX2lucHV0X3Jlc3VsdCwgOTkpOworCQkJIiIsICZkaWFsb2dfaW5wdXRfcmVzdWx0LCAmZGlhbG9nX2lucHV0X3Jlc3VsdF9sZW4pOwogCXN3aXRjaCAoZHJlcykgewogCWNhc2UgMDoKIAkJYnJlYWs7CkBAIC0xMzQ4LDcgKzEzNDgsNiBAQAogc3RhdGljIHZvaWQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpCiB7CiAJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOwotCWNoYXIgZGlhbG9nX2lucHV0X3Jlc3VsdFsyNTZdOwogCiAJd2hpbGUgKDEpIHsKIAkJaW50IHJlczsKQEAgLTEzNzEsOCArMTM3MCw4IEBACiAJCQkJcHJvbXB0ID8gXyhwcm9tcHQpIDogXygiTWFpbiBNZW51IiksCiAJCQkJaGVhZGluZywKIAkJCQlzeW1fZ2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0pLAotCQkJCWRpYWxvZ19pbnB1dF9yZXN1bHQsCi0JCQkJc2l6ZW9mKGRpYWxvZ19pbnB1dF9yZXN1bHQpKTsKKwkJCQkmZGlhbG9nX2lucHV0X3Jlc3VsdCwKKwkJCQkmZGlhbG9nX2lucHV0X3Jlc3VsdF9sZW4pOwogCQlzd2l0Y2ggKHJlcykgewogCQljYXNlIDA6CiAJCQlpZiAoc3ltX3NldF9zdHJpbmdfdmFsdWUobWVudS0+c3ltLApAQCAtMTM5MiwxNCArMTM5MSwxMyBAQAogCiBzdGF0aWMgdm9pZCBjb25mX2xvYWQodm9pZCkKIHsKLQljaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbMjU2XTsKIAl3aGlsZSAoMSkgewogCQlpbnQgcmVzOwogCQlyZXMgPSBkaWFsb2dfaW5wdXRib3gobWFpbl93aW5kb3csCiAJCQkJTlVMTCwgbG9hZF9jb25maWdfdGV4dCwKIAkJCQlmaWxlbmFtZSwKLQkJCQlkaWFsb2dfaW5wdXRfcmVzdWx0LAotCQkJCXNpemVvZihkaWFsb2dfaW5wdXRfcmVzdWx0KSk7CisJCQkJJmRpYWxvZ19pbnB1dF9yZXN1bHQsCisJCQkJJmRpYWxvZ19pbnB1dF9yZXN1bHRfbGVuKTsKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSAwOgogCQkJaWYgKCFkaWFsb2dfaW5wdXRfcmVzdWx0WzBdKQpAQCAtMTQyNCwxNCArMTQyMiwxMyBAQAogCiBzdGF0aWMgdm9pZCBjb25mX3NhdmUodm9pZCkKIHsKLQljaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbMjU2XTsKIAl3aGlsZSAoMSkgewogCQlpbnQgcmVzOwogCQlyZXMgPSBkaWFsb2dfaW5wdXRib3gobWFpbl93aW5kb3csCiAJCQkJTlVMTCwgc2F2ZV9jb25maWdfdGV4dCwKIAkJCQlmaWxlbmFtZSwKLQkJCQlkaWFsb2dfaW5wdXRfcmVzdWx0LAotCQkJCXNpemVvZihkaWFsb2dfaW5wdXRfcmVzdWx0KSk7CisJCQkJJmRpYWxvZ19pbnB1dF9yZXN1bHQsCisJCQkJJmRpYWxvZ19pbnB1dF9yZXN1bHRfbGVuKTsKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSAwOgogCQkJaWYgKCFkaWFsb2dfaW5wdXRfcmVzdWx0WzBdKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmd1aS5jIGIvc2NyaXB0cy9rY29uZmlnL25jb25mLmd1aS5jCmluZGV4IGY4MTM3YjMuLjNiMThkZDggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9uY29uZi5ndWkuYworKysgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuZ3VpLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogCiBpbnQgZGlhbG9nX2lucHV0Ym94KFdJTkRPVyAqbWFpbl93aW5kb3csCiAJCWNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsCi0JCWNvbnN0IGNoYXIgKmluaXQsIGNoYXIgKnJlc3VsdCwgaW50IHJlc3VsdF9sZW4pCisJCWNvbnN0IGNoYXIgKmluaXQsIGNoYXIgKipyZXN1bHRwLCBpbnQgKnJlc3VsdF9sZW4pCiB7CiAJaW50IHByb21wdF9saW5lcyA9IDA7CiAJaW50IHByb21wdF93aWR0aCA9IDA7CkBAIC0zNjcsNyArMzY3LDEzIEBACiAJaW50IGksIHgsIHk7CiAJaW50IHJlcyA9IC0xOwogCWludCBjdXJzb3JfcG9zaXRpb24gPSBzdHJsZW4oaW5pdCk7CisJaW50IGN1cnNvcl9mb3JtX3dpbjsKKwljaGFyICpyZXN1bHQgPSAqcmVzdWx0cDsKIAorCWlmIChzdHJsZW4oaW5pdCkrMSA+ICpyZXN1bHRfbGVuKSB7CisJCSpyZXN1bHRfbGVuID0gc3RybGVuKGluaXQpKzE7CisJCSpyZXN1bHRwID0gcmVzdWx0ID0gcmVhbGxvYyhyZXN1bHQsICpyZXN1bHRfbGVuKTsKKwl9CiAKIAkvKiBmaW5kIHRoZSB3aWRlc3QgbGluZSBvZiBtc2c6ICovCiAJcHJvbXB0X2xpbmVzID0gZ2V0X2xpbmVfbm8ocHJvbXB0KTsKQEAgLTM4NCw3ICszOTAsNyBAQAogCXkgPSAoTElORVMtKHByb21wdF9saW5lcys0KSkvMjsKIAl4ID0gKENPTFMtKHByb21wdF93aWR0aCs0KSkvMjsKIAotCXN0cm5jcHkocmVzdWx0LCBpbml0LCByZXN1bHRfbGVuKTsKKwlzdHJuY3B5KHJlc3VsdCwgaW5pdCwgKnJlc3VsdF9sZW4pOwogCiAJLyogY3JlYXRlIHRoZSB3aW5kb3dzICovCiAJd2luID0gbmV3d2luKHByb21wdF9saW5lcys2LCBwcm9tcHRfd2lkdGgrNywgeSwgeCk7CkBAIC00MDUsNyArNDExLDkgQEAKIAlmaWxsX3dpbmRvdyhwcm9tcHRfd2luLCBwcm9tcHQpOwogCiAJbXZ3cHJpbnR3KGZvcm1fd2luLCAwLCAwLCAiJSpzIiwgcHJvbXB0X3dpZHRoLCAiICIpOwotCW12d3ByaW50dyhmb3JtX3dpbiwgMCwgMCwgIiVzIiwgcmVzdWx0KTsKKwljdXJzb3JfZm9ybV93aW4gPSBtaW4oY3Vyc29yX3Bvc2l0aW9uLCBwcm9tcHRfd2lkdGgtMSk7CisJbXZ3cHJpbnR3KGZvcm1fd2luLCAwLCAwLCAiJXMiLAorCQkgIHJlc3VsdCArIGN1cnNvcl9wb3NpdGlvbi1jdXJzb3JfZm9ybV93aW4pOwogCiAJLyogY3JlYXRlIHBhbmVscyAqLwogCXBhbmVsID0gbmV3X3BhbmVsKHdpbik7CkBAIC00MzEsNiArNDM5LDggQEAKIAkJCQkJCSZyZXN1bHRbY3Vyc29yX3Bvc2l0aW9uXSwKIAkJCQkJCWxlbi1jdXJzb3JfcG9zaXRpb24rMSk7CiAJCQkJY3Vyc29yX3Bvc2l0aW9uLS07CisJCQkJY3Vyc29yX2Zvcm1fd2luLS07CisJCQkJbGVuLS07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBLRVlfREM6CkBAIC00MzgsMzggKzQ0OCw2MyBAQAogCQkJCW1lbW1vdmUoJnJlc3VsdFtjdXJzb3JfcG9zaXRpb25dLAogCQkJCQkJJnJlc3VsdFtjdXJzb3JfcG9zaXRpb24rMV0sCiAJCQkJCQlsZW4tY3Vyc29yX3Bvc2l0aW9uKzEpOworCQkJCWxlbi0tOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgS0VZX1VQOgogCQljYXNlIEtFWV9SSUdIVDoKLQkJCWlmIChjdXJzb3JfcG9zaXRpb24gPCBsZW4gJiYKLQkJCSAgICBjdXJzb3JfcG9zaXRpb24gPCBtaW4ocmVzdWx0X2xlbiwgcHJvbXB0X3dpZHRoKSkKKwkJCWlmIChjdXJzb3JfcG9zaXRpb24gPCBsZW4pIHsKIAkJCQljdXJzb3JfcG9zaXRpb24rKzsKKwkJCQljdXJzb3JfZm9ybV93aW4rKzsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIEtFWV9ET1dOOgogCQljYXNlIEtFWV9MRUZUOgotCQkJaWYgKGN1cnNvcl9wb3NpdGlvbiA+IDApCisJCQlpZiAoY3Vyc29yX3Bvc2l0aW9uID4gMCkgewogCQkJCWN1cnNvcl9wb3NpdGlvbi0tOworCQkJCWN1cnNvcl9mb3JtX3dpbi0tOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgS0VZX0hPTUU6CisJCQljdXJzb3JfcG9zaXRpb24gPSAwOworCQkJY3Vyc29yX2Zvcm1fd2luID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9FTkQ6CisJCQljdXJzb3JfcG9zaXRpb24gPSBsZW47CisJCQljdXJzb3JfZm9ybV93aW4gPSBtaW4oY3Vyc29yX3Bvc2l0aW9uLCBwcm9tcHRfd2lkdGgtMSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWlmICgoaXNncmFwaChyZXMpIHx8IGlzc3BhY2UocmVzKSkgJiYKLQkJCQkJbGVuLTIgPCByZXN1bHRfbGVuKSB7CisJCQlpZiAoKGlzZ3JhcGgocmVzKSB8fCBpc3NwYWNlKHJlcykpKSB7CisJCQkJLyogb25lIGZvciBuZXcgY2hhciwgb25lIGZvciAnXDAnICovCisJCQkJaWYgKGxlbisyID4gKnJlc3VsdF9sZW4pIHsKKwkJCQkJKnJlc3VsdF9sZW4gPSBsZW4rMjsKKwkJCQkJKnJlc3VsdHAgPSByZXN1bHQgPSByZWFsbG9jKHJlc3VsdCwKKwkJCQkJCQkJKnJlc3VsdF9sZW4pOworCQkJCX0KIAkJCQkvKiBpbnNlcnQgdGhlIGNoYXIgYXQgdGhlIHByb3BlciBwb3NpdGlvbiAqLwogCQkJCW1lbW1vdmUoJnJlc3VsdFtjdXJzb3JfcG9zaXRpb24rMV0sCiAJCQkJCQkmcmVzdWx0W2N1cnNvcl9wb3NpdGlvbl0sCi0JCQkJCQlsZW4rMSk7CisJCQkJCQlsZW4tY3Vyc29yX3Bvc2l0aW9uKzEpOwogCQkJCXJlc3VsdFtjdXJzb3JfcG9zaXRpb25dID0gcmVzOwogCQkJCWN1cnNvcl9wb3NpdGlvbisrOworCQkJCWN1cnNvcl9mb3JtX3dpbisrOworCQkJCWxlbisrOwogCQkJfSBlbHNlIHsKLQkJCQltdnByaW50dygwLCAwLCAidW5rbm93IGtleTogJWRcbiIsIHJlcyk7CisJCQkJbXZwcmludHcoMCwgMCwgInVua25vd24ga2V5OiAlZFxuIiwgcmVzKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CisJCWlmIChjdXJzb3JfZm9ybV93aW4gPCAwKQorCQkJY3Vyc29yX2Zvcm1fd2luID0gMDsKKwkJZWxzZSBpZiAoY3Vyc29yX2Zvcm1fd2luID4gcHJvbXB0X3dpZHRoLTEpCisJCQljdXJzb3JfZm9ybV93aW4gPSBwcm9tcHRfd2lkdGgtMTsKKwogCQl3bW92ZShmb3JtX3dpbiwgMCwgMCk7CiAJCXdjbHJ0b2VvbChmb3JtX3dpbik7CiAJCW12d3ByaW50dyhmb3JtX3dpbiwgMCwgMCwgIiUqcyIsIHByb21wdF93aWR0aCwgIiAiKTsKLQkJbXZ3cHJpbnR3KGZvcm1fd2luLCAwLCAwLCAiJXMiLCByZXN1bHQpOwotCQl3bW92ZShmb3JtX3dpbiwgMCwgY3Vyc29yX3Bvc2l0aW9uKTsKKwkJbXZ3cHJpbnR3KGZvcm1fd2luLCAwLCAwLCAiJXMiLAorCQkJcmVzdWx0ICsgY3Vyc29yX3Bvc2l0aW9uLWN1cnNvcl9mb3JtX3dpbik7CisJCXdtb3ZlKGZvcm1fd2luLCAwLCBjdXJzb3JfZm9ybV93aW4pOwogCQl0b3VjaHdpbih3aW4pOwogCQlyZWZyZXNoX2FsbF93aW5kb3dzKG1haW5fd2luZG93KTsKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmggYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuaAppbmRleCA1OGZiZGE4Li4wZDUyNjE3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbmNvbmYuaAorKysgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuaApAQCAtODksNyArODksNyBAQAogaW50IGJ0bl9kaWFsb2coV0lORE9XICptYWluX3dpbmRvdywgY29uc3QgY2hhciAqbXNnLCBpbnQgYnRuX251bSwgLi4uKTsKIGludCBkaWFsb2dfaW5wdXRib3goV0lORE9XICptYWluX3dpbmRvdywKIAkJY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwKLQkJY29uc3QgY2hhciAqaW5pdCwgY2hhciAqcmVzdWx0LCBpbnQgcmVzdWx0X2xlbik7CisJCWNvbnN0IGNoYXIgKmluaXQsIGNoYXIgKipyZXN1bHRwLCBpbnQgKnJlc3VsdF9sZW4pOwogdm9pZCByZWZyZXNoX2FsbF93aW5kb3dzKFdJTkRPVyAqbWFpbl93aW5kb3cpOwogdm9pZCBzaG93X3Njcm9sbF93aW4oV0lORE9XICptYWluX3dpbmRvdywKIAkJY29uc3QgY2hhciAqdGl0bGUsCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3RyZWFtbGluZV9jb25maWcucGwgYi9zY3JpcHRzL2tjb25maWcvc3RyZWFtbGluZV9jb25maWcucGwKaW5kZXggYTRmZTkyMy4uZWM3YWZjZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N0cmVhbWxpbmVfY29uZmlnLnBsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zdHJlYW1saW5lX2NvbmZpZy5wbApAQCAtNDMsNiArNDMsNyBAQAogIyAgICBtYWtlIG9sZGNvbmZpZwogIwogdXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6Okxvbmc7CiAKIG15ICRjb25maWcgPSAiLmNvbmZpZyI7CiAKQEAgLTExMiwxMCArMTEzLDE3IEBACiAKIGZpbmRfY29uZmlnOwogCisjIFBhcnNlIG9wdGlvbnMKK215ICRsb2NhbG1vZGNvbmZpZyA9IDA7CitteSAkbG9jYWx5ZXNjb25maWcgPSAwOworCitHZXRPcHRpb25zKCJsb2NhbG1vZGNvbmZpZyIgPT4gXCRsb2NhbG1vZGNvbmZpZywKKwkgICAibG9jYWx5ZXNjb25maWciID0+IFwkbG9jYWx5ZXNjb25maWcpOworCiAjIEdldCB0aGUgYnVpbGQgc291cmNlIGFuZCB0b3AgbGV2ZWwgS2NvbmZpZyBmaWxlIChwYXNzZWQgaW4pCiBteSAka3NvdXJjZSA9ICRBUkdWWzBdOwogbXkgJGtjb25maWcgPSAkQVJHVlsxXTsKLW15ICRsc21vZF9maWxlID0gJEFSR1ZbMl07CitteSAkbHNtb2RfZmlsZSA9ICRFTlZ7J0xTTU9EJ307CiAKIG15IEBtYWtlZmlsZXMgPSBgZmluZCAka3NvdXJjZSAtbmFtZSBNYWtlZmlsZSAyPi9kZXYvbnVsbGA7CiBjaG9tcCBAbWFrZWZpbGVzOwpAQCAtMjk2LDcgKzMwNCwxMSBAQAogCiBpZiAoZGVmaW5lZCgkbHNtb2RfZmlsZSkpIHsKICAgICBpZiAoICEgLWYgJGxzbW9kX2ZpbGUpIHsKLQlkaWUgIiRsc21vZF9maWxlIG5vdCBmb3VuZCI7CisJaWYgKCAtZiAkRU5WeydvYmp0cmVlJ30uIi8iLiRsc21vZF9maWxlKSB7CisJICAgICRsc21vZF9maWxlID0gJEVOVnsnb2JqdHJlZSd9LiIvIi4kbHNtb2RfZmlsZTsKKwl9IGVsc2UgeworCQlkaWUgIiRsc21vZF9maWxlIG5vdCBmb3VuZCI7CisJfQogICAgIH0KICAgICBpZiAoIC14ICRsc21vZF9maWxlKSB7CiAJIyB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLCBydW4gaXQKQEAgLTQyMSw3ICs0MzMsMTEgQEAKIAogICAgIGlmICgvXihDT05GSUcuKik9KG18eSkvKSB7CiAJaWYgKGRlZmluZWQoJGNvbmZpZ3N7JDF9KSkgewotCSAgICAkc2V0Y29uZmlnc3skMX0gPSAkMjsKKwkgICAgaWYgKCRsb2NhbHllc2NvbmZpZykgeworCSAgICAgICAgJHNldGNvbmZpZ3N7JDF9ID0gJ3knOworCSAgICB9IGVsc2UgeworCSAgICAgICAgJHNldGNvbmZpZ3N7JDF9ID0gJDI7CisJICAgIH0KIAl9IGVsc2lmICgkMiBlcSAibSIpIHsKIAkgICAgcHJpbnQgIiMgJDEgaXMgbm90IHNldFxuIjsKIAkgICAgbmV4dDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCBhNTA5ZmY4Li4yYmQ1OTRlIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC0xODQ5LDYgKzE4NDksMTIgQEAKIAlidWZfcHJpbnRmKGIsICJ9O1xuIik7CiB9CiAKK3N0YXRpYyB2b2lkIGFkZF9pbnRyZWVfZmxhZyhzdHJ1Y3QgYnVmZmVyICpiLCBpbnQgaXNfaW50cmVlKQoreworCWlmIChpc19pbnRyZWUpCisJCWJ1Zl9wcmludGYoYiwgIlxuTU9EVUxFX0lORk8oaW50cmVlLCBcIllcIik7XG4iKTsKK30KKwogc3RhdGljIHZvaWQgYWRkX3N0YWdpbmdfZmxhZyhzdHJ1Y3QgYnVmZmVyICpiLCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0YXRpYyBjb25zdCBjaGFyICpzdGFnaW5nX2RpciA9ICJkcml2ZXJzL3N0YWdpbmciOwpAQCAtMjE2OSw2ICsyMTc1LDcgQEAKIAkJYnVmLnBvcyA9IDA7CiAKIAkJYWRkX2hlYWRlcigmYnVmLCBtb2QpOworCQlhZGRfaW50cmVlX2ZsYWcoJmJ1ZiwgIWV4dGVybmFsX21vZHVsZSk7CiAJCWFkZF9zdGFnaW5nX2ZsYWcoJmJ1ZiwgbW9kLT5uYW1lKTsKIAkJZXJyIHw9IGFkZF92ZXJzaW9ucygmYnVmLCBtb2QpOwogCQlhZGRfZGVwZW5kcygmYnVmLCBtb2QsIG1vZHVsZXMpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90YWdzLnNoIGIvc2NyaXB0cy90YWdzLnNoCmluZGV4IDc1YzVkMjQuLjM4ZjY2MTcgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdGFncy5zaAorKysgYi9zY3JpcHRzL3RhZ3Muc2gKQEAgLTEyOSw3ICsxMjksNyBAQAogCS1JIEVYUE9SVF9TWU1CT0wsRVhQT1JUX1NZTUJPTF9HUEwgICAgICAgICAgICAgICAgICAgICAgXAogCS1JIERFRklORV9UUkFDRSxFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0wsRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTCBcCiAJLS1leHRyYT0rZiAtLWMta2luZHM9K3B4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JLS1yZWdleC1hc209Jy9eRU5UUllcKChbXildKilcKS4qL1wxLycgICAgICAgICAgICAgICAgICBcCisJLS1yZWdleC1hc209Jy9eKEVOVFJZfF9HTE9CQUwpXCgoW14pXSopXCkuKi9cMi8nICAgICAgICBcCiAJLS1yZWdleC1jPScvXlNZU0NBTExfREVGSU5FW1s6ZGlnaXQ6XV0/XCgoW14sKV0qKS4qL3N5c19cMS8nIFwKIAktLXJlZ2V4LWMrKz0nL15UUkFDRV9FVkVOVFwoKFteLCldKikuKi90cmFjZV9cMS8nCQlcCiAJLS1yZWdleC1jKys9Jy9eREVGSU5FX0VWRU5UXChbXiwpXSosICooW14sKV0qKS4qL3RyYWNlX1wxLycKQEAgLTE1MSw3ICsxNTEsNyBAQAogZW1hY3MoKQogewogCWFsbF9zb3VyY2VzIHwgeGFyZ3MgJDEgLWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCS0tcmVnZXg9Jy9eRU5UUlkoXChbXildKlwpKS4qL1wxLycgICAgICAgICAgICAgICAgICAgICAgXAorCS0tcmVnZXg9Jy9eKEVOVFJZfF9HTE9CQUwpKFwoW14pXSpcKSkuKi9cMi8nICAgICAgICAgICAgXAogCS0tcmVnZXg9Jy9eU1lTQ0FMTF9ERUZJTkVbMC05XT8oXChbXiwpXSpcKS4qL3N5c19cMS8nICAgXAogCS0tcmVnZXg9Jy9eVFJBQ0VfRVZFTlQoXChbXiwpXSpcKS4qL3RyYWNlX1wxLycJCVwKIAktLXJlZ2V4PScvXkRFRklORV9FVkVOVChbXiwpXSosICpcKFteLCldKlwpLiovdHJhY2VfXDEvJwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9LY29uZmlnIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9LY29uZmlnCmluZGV4IDE5YzA1M2IuLjRmNTU0ZjIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2ludGVncml0eS9pbWEvS2NvbmZpZworKysgYi9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL0tjb25maWcKQEAgLTksNyArOSw3IEBACiAJc2VsZWN0IENSWVBUT19ITUFDCiAJc2VsZWN0IENSWVBUT19NRDUKIAlzZWxlY3QgQ1JZUFRPX1NIQTEKLQlzZWxlY3QgVENHX1RQTSBpZiAhUzM5MAorCXNlbGVjdCBUQ0dfVFBNIGlmICFTMzkwICYmICFVTUwKIAlzZWxlY3QgVENHX1RJUyBpZiBUQ0dfVFBNCiAJaGVscAogCSAgVGhlIFRydXN0ZWQgQ29tcHV0aW5nIEdyb3VwKFRDRykgcnVudGltZSBJbnRlZ3JpdHkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvY29tcGF0LmMgYi9zZWN1cml0eS9rZXlzL2NvbXBhdC5jCmluZGV4IDMzOGI1MTAuLjRjNDhlMTMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvY29tcGF0LmMKKysrIGIvc2VjdXJpdHkva2V5cy9jb21wYXQuYwpAQCAtMzgsNyArMzgsNyBAQAogCiAJcmV0ID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3RvcihXUklURSwgX3BheWxvYWRfaW92LCBpb2MsCiAJCQkJCSAgIEFSUkFZX1NJWkUoaW92c3RhY2spLAotCQkJCQkgICBpb3ZzdGFjaywgJmlvdik7CisJCQkJCSAgIGlvdnN0YWNrLCAmaW92LCAxKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlpZiAocmV0ID09IDApCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZC1rZXlzL2VuY3J5cHRlZC5jIGIvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWQta2V5cy9lbmNyeXB0ZWQuYwppbmRleCBmMzM4MDRjLi5kY2M4NDNjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZC1rZXlzL2VuY3J5cHRlZC5jCisrKyBiL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkLWtleXMvZW5jcnlwdGVkLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCS8qIGNvbnZlcnQgdGhlIGhleCBlbmNvZGVkIGl2LCBlbmNyeXB0ZWQtZGF0YSBhbmQgSE1BQyB0byBhc2NpaSAqLwogCWJ1ZnAgPSAmYXNjaWlfYnVmW2xlbl07CiAJZm9yIChpID0gMDsgaSA8IChhc2NpaWJsb2JfbGVuIC0gbGVuKSAvIDI7IGkrKykKLQkJYnVmcCA9IHBhY2tfaGV4X2J5dGUoYnVmcCwgaXZbaV0pOworCQlidWZwID0gaGV4X2J5dGVfcGFjayhidWZwLCBpdltpXSk7CiBvdXQ6CiAJcmV0dXJuIGFzY2lpX2J1ZjsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMgYi9zZWN1cml0eS9rZXlzL2tleWN0bC5jCmluZGV4IGVjYTUxOTEuLjBiM2Y1ZDcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKKysrIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwpAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAkJZ290byBub19wYXlsb2FkOwogCiAJcmV0ID0gcndfY29weV9jaGVja191dmVjdG9yKFdSSVRFLCBfcGF5bG9hZF9pb3YsIGlvYywKLQkJCQkgICAgQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92KTsKKwkJCQkgICAgQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92LCAxKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlpZiAocmV0ID09IDApCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3RydXN0ZWQuYyBiL3NlY3VyaXR5L2tleXMvdHJ1c3RlZC5jCmluZGV4IDA5NjRmYzIuLjBlZDVmZGYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvdHJ1c3RlZC5jCisrKyBiL3NlY3VyaXR5L2tleXMvdHJ1c3RlZC5jCkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogCiAJYnVmcCA9IGFzY2lpX2J1ZjsKIAlmb3IgKGkgPSAwOyBpIDwgcC0+YmxvYl9sZW47IGkrKykKLQkJYnVmcCA9IHBhY2tfaGV4X2J5dGUoYnVmcCwgcC0+YmxvYltpXSk7CisJCWJ1ZnAgPSBoZXhfYnl0ZV9wYWNrKGJ1ZnAsIHAtPmJsb2JbaV0pOwogCWlmICgoY29weV90b191c2VyKGJ1ZmZlciwgYXNjaWlfYnVmLCAyICogcC0+YmxvYl9sZW4pKSAhPSAwKSB7CiAJCWtmcmVlKGFzY2lpX2J1Zik7CiAJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IGU1NDViOWYuLjExMjZjMTAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTgwLDYgKzgwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wb3NpeC10aW1lcnMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNsb2cuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiYXZjLmgiCiAjaW5jbHVkZSAib2Jqc2VjLmgiCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25ldGxpbmsuYyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCmluZGV4IGNlM2Y0ODEuLjE2MWUwMWEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9zZWxpbnV4X25ldGxpbmsuaD4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9jb21tb24uYyBiL3NlY3VyaXR5L3RvbW95by9jb21tb24uYwppbmRleCAxNTA5MTFjLi5jNDdkM2NlIDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vY29tbW9uLmMKKysrIGIvc2VjdXJpdHkvdG9tb3lvL2NvbW1vbi5jCkBAIC05NjYsNiArOTY2LDkgQEAKIAlyZXR1cm4gZm91bmQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICp0b21veW9fZmluZF9kb21haW5fYnlfcWlkCisodW5zaWduZWQgaW50IHNlcmlhbCk7CisKIC8qKgogICogdG9tb3lvX3NlbGVjdF9kb21haW4gLSBQYXJzZSBzZWxlY3QgY29tbWFuZC4KICAqCkBAIC05OTksNiArMTAwMiw4IEBACiAJfSBlbHNlIGlmICghc3RybmNtcChkYXRhLCAiZG9tYWluPSIsIDcpKSB7CiAJCWlmICh0b21veW9fZG9tYWluX2RlZihkYXRhICsgNykpCiAJCQlkb21haW4gPSB0b21veW9fZmluZF9kb21haW4oZGF0YSArIDcpOworCX0gZWxzZSBpZiAoc3NjYW5mKGRhdGEsICJRPSV1IiwgJnBpZCkgPT0gMSkgeworCQlkb21haW4gPSB0b21veW9fZmluZF9kb21haW5fYnlfcWlkKHBpZCk7CiAJfSBlbHNlCiAJCXJldHVybiBmYWxzZTsKIAloZWFkLT53LmRvbWFpbiA9IGRvbWFpbjsKQEAgLTE4OTQsNiArMTg5OSw3IEBACiAvKiBTdHJ1Y3R1cmUgZm9yIHF1ZXJ5LiAqLwogc3RydWN0IHRvbW95b19xdWVyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbjsKIAljaGFyICpxdWVyeTsKIAlzaXplX3QgcXVlcnlfbGVuOwogCXVuc2lnbmVkIGludCBzZXJpYWw7CkBAIC0yMDQ0LDYgKzIwNTAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAJbGVuID0gdG9tb3lvX3JvdW5kMihlbnRyeS5xdWVyeV9sZW4pOworCWVudHJ5LmRvbWFpbiA9IHItPmRvbWFpbjsKIAlzcGluX2xvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOwogCWlmICh0b21veW9fbWVtb3J5X3F1b3RhW1RPTU9ZT19NRU1PUllfUVVFUlldICYmCiAJICAgIHRvbW95b19tZW1vcnlfdXNlZFtUT01PWU9fTUVNT1JZX1FVRVJZXSArIGxlbgpAQCAtMjA5MSw2ICsyMDk4LDI5IEBACiB9CiAKIC8qKgorICogdG9tb3lvX2ZpbmRfZG9tYWluX2J5X3FpZCAtIEdldCBkb21haW4gYnkgcXVlcnkgaWQuCisgKgorICogQHNlcmlhbDogUXVlcnkgSUQgYXNzaWduZWQgYnkgdG9tb3lvX3N1cGVydmlzb3IoKS4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKnRvbW95b19maW5kX2RvbWFpbl9ieV9xaWQKKyh1bnNpZ25lZCBpbnQgc2VyaWFsKQoreworCXN0cnVjdCB0b21veW9fcXVlcnkgKnB0cjsKKwlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4gPSBOVUxMOworCXNwaW5fbG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwdHIsICZ0b21veW9fcXVlcnlfbGlzdCwgbGlzdCkgeworCQlpZiAocHRyLT5zZXJpYWwgIT0gc2VyaWFsIHx8IHB0ci0+YW5zd2VyKQorCQkJY29udGludWU7CisJCWRvbWFpbiA9IHB0ci0+ZG9tYWluOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOworCXJldHVybiBkb21haW47Cit9CisKKy8qKgogICogdG9tb3lvX3BvbGxfcXVlcnkgLSBwb2xsKCkgZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9xdWVyeS4KICAqCiAgKiBAZmlsZTogUG9pbnRlciB0byAic3RydWN0IGZpbGUiLgpkaWZmIC0tZ2l0IGEvc291bmQvS2NvbmZpZyBiL3NvdW5kL0tjb25maWcKaW5kZXggMWZlZjE0MS4uMjYxYTAzYyAxMDA2NDQKLS0tIGEvc291bmQvS2NvbmZpZworKysgYi9zb3VuZC9LY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAKIHNvdXJjZSAic291bmQvb3NzL2RtYXNvdW5kL0tjb25maWciCiAKLWlmICFNNjhLCitpZiAhTTY4SyAmJiAhVU1MCiAKIG1lbnVjb25maWcgU05ECiAJdHJpc3RhdGUgIkFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSIKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3Mvb255eC5jIGIvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKaW5kZXggMzY4N2E2Yy4uNzYyYWY2OCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKKysrIGIvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKQEAgLTEwNjcsNyArMTA2Nyw2IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJjcmVhdGVkIGFuZCBhdHRhY2hlZCBvbnl4IGluc3RhbmNlXG4iKTsKIAlyZXR1cm4gMDsKICBmYWlsOgotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOwogCWtmcmVlKG9ueXgpOwogCXJldHVybiAtRU5PREVWOwogfQpAQCAtMTExMiw4ICsxMTExLDcgQEAKIAogCWFvYV9jb2RlY191bnJlZ2lzdGVyKCZvbnl4LT5jb2RlYyk7CiAJb2Zfbm9kZV9wdXQob255eC0+Y29kZWMubm9kZSk7Ci0JaWYgKG9ueXgtPmNvZGVjX2luZm8pCi0JCWtmcmVlKG9ueXgtPmNvZGVjX2luZm8pOworCWtmcmVlKG9ueXgtPmNvZGVjX2luZm8pOwogCWtmcmVlKG9ueXgpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9wY20uYyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvcGNtLmMKaW5kZXggYmU4Mzg5OS4uMTk0OTFlZCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9wY20uYworKysgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL3BjbS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIi4uL3NvdW5kYnVzLmgiCiAjaW5jbHVkZSAiaTJzYnVzLmgiCiAKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9hYWNpLmMgYi9zb3VuZC9hcm0vYWFjaS5jCmluZGV4IGQwY2VhZDMuLmU1MThkMzggMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9hYWNpLmMKKysrIGIvc291bmQvYXJtL2FhY2kuYwpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJbXV0ZXhfbG9jaygmYWFjaS0+aXJxX2xvY2spOwogCWlmICghYWFjaS0+dXNlcnMrKykgewogCQlyZXQgPSByZXF1ZXN0X2lycShhYWNpLT5kZXYtPmlycVswXSwgYWFjaV9pcnEsCi0JCQkgICBJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsIERSSVZFUl9OQU1FLCBhYWNpKTsKKwkJCSAgIElSUUZfU0hBUkVELCBEUklWRVJfTkFNRSwgYWFjaSk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCWFhY2ktPnVzZXJzLS07CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvYXJtL3B4YTJ4eC1hYzk3LWxpYi5jIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LWxpYi5jCmluZGV4IDg4ZWVjMzguLmQxYWE0MjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYworKysgYi9zb3VuZC9hcm0vcHhhMnh4LWFjOTctbGliLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgogI2luY2x1ZGUgPHNvdW5kL3B4YTJ4eC1saWIuaD4KQEAgLTM1OSw3ICszNjAsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2NsazI7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShJUlFfQUM5NywgcHhhMnh4X2FjOTdfaXJxLCBJUlFGX0RJU0FCTEVELCAiQUM5NyIsIE5VTEwpOworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9BQzk3LCBweGEyeHhfYWM5N19pcnEsIDAsICJBQzk3IiwgTlVMTCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX2lycTsKIApkaWZmIC0tZ2l0IGEvc291bmQvYXJtL3B4YTJ4eC1wY20uYyBiL3NvdW5kL2FybS9weGEyeHgtcGNtLmMKaW5kZXggNTM1NzA0Zi4uMjY0MjJhMyAxMDA2NDQKLS0tIGEvc291bmQvYXJtL3B4YTJ4eC1wY20uYworKysgYi9zb3VuZC9hcm0vcHhhMnh4LXBjbS5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3B4YTJ4eC1saWIuaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sLmMgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwppbmRleCBmOGM1YmU0Li44MTlhNWM1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2NvbnRyb2wuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtOTg5LDcgKzk5MCw2IEBACiAJdm9pZCAqdGx2X2RhdGE7CQkJLyogVExWIGRhdGEgKi8KIAl1bnNpZ25lZCBsb25nIHRsdl9kYXRhX3NpemU7CS8qIFRMViBkYXRhIHNpemUgKi8KIAl2b2lkICpwcml2X2RhdGE7CQkvKiBwcml2YXRlIGRhdGEgKGxpa2Ugc3RyaW5ncyBmb3IgZW51bWVyYXRlZCB0eXBlKSAqLwotCXVuc2lnbmVkIGxvbmcgcHJpdl9kYXRhX3NpemU7CS8qIHNpemUgb2YgcHJpdmF0ZSBkYXRhIGluIGJ5dGVzICovCiB9OwogCiBzdGF0aWMgaW50IHNuZF9jdGxfZWxlbV91c2VyX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC0xMDAxLDYgKzEwMDEsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzbmRfY3RsX2VsZW1fdXNlcl9lbnVtX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IHVzZXJfZWxlbWVudCAqdWUgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IGNoYXIgKm5hbWVzOworCXVuc2lnbmVkIGludCBpdGVtOworCisJaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW07CisKKwkqdWluZm8gPSB1ZS0+aW5mbzsKKworCWl0ZW0gPSBtaW4oaXRlbSwgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxKTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gaXRlbTsKKworCW5hbWVzID0gdWUtPnByaXZfZGF0YTsKKwlmb3IgKDsgaXRlbSA+IDA7IC0taXRlbSkKKwkJbmFtZXMgKz0gc3RybGVuKG5hbWVzKSArIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIG5hbWVzKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHNuZF9jdGxfZWxlbV91c2VyX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CkBAIC0xMDU1LDExICsxMDc3LDQ2IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAorc3RhdGljIGludCBzbmRfY3RsX2VsZW1faW5pdF9lbnVtX25hbWVzKHN0cnVjdCB1c2VyX2VsZW1lbnQgKnVlKQoreworCWNoYXIgKm5hbWVzLCAqcDsKKwlzaXplX3QgYnVmX2xlbiwgbmFtZV9sZW47CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgdWludHB0cl90IHVzZXJfcHRydmFsID0gdWUtPmluZm8udmFsdWUuZW51bWVyYXRlZC5uYW1lc19wdHI7CisKKwlpZiAodWUtPmluZm8udmFsdWUuZW51bWVyYXRlZC5uYW1lc19sZW5ndGggPiA2NCAqIDEwMjQpCisJCXJldHVybiAtRUlOVkFMOworCisJbmFtZXMgPSBtZW1kdXBfdXNlcigoY29uc3Qgdm9pZCBfX3VzZXIgKil1c2VyX3B0cnZhbCwKKwkJdWUtPmluZm8udmFsdWUuZW51bWVyYXRlZC5uYW1lc19sZW5ndGgpOworCWlmIChJU19FUlIobmFtZXMpKQorCQlyZXR1cm4gUFRSX0VSUihuYW1lcyk7CisKKwkvKiBjaGVjayB0aGF0IHRoZXJlIGFyZSBlbm91Z2ggdmFsaWQgbmFtZXMgKi8KKwlidWZfbGVuID0gdWUtPmluZm8udmFsdWUuZW51bWVyYXRlZC5uYW1lc19sZW5ndGg7CisJcCA9IG5hbWVzOworCWZvciAoaSA9IDA7IGkgPCB1ZS0+aW5mby52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zOyArK2kpIHsKKwkJbmFtZV9sZW4gPSBzdHJubGVuKHAsIGJ1Zl9sZW4pOworCQlpZiAobmFtZV9sZW4gPT0gMCB8fCBuYW1lX2xlbiA+PSA2NCB8fCBuYW1lX2xlbiA9PSBidWZfbGVuKSB7CisJCQlrZnJlZShuYW1lcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwICs9IG5hbWVfbGVuICsgMTsKKwkJYnVmX2xlbiAtPSBuYW1lX2xlbiArIDE7CisJfQorCisJdWUtPnByaXZfZGF0YSA9IG5hbWVzOworCXVlLT5pbmZvLnZhbHVlLmVudW1lcmF0ZWQubmFtZXNfcHRyID0gMDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBzbmRfY3RsX2VsZW1fdXNlcl9mcmVlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQogewogCXN0cnVjdCB1c2VyX2VsZW1lbnQgKnVlID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQlpZiAodWUtPnRsdl9kYXRhKQotCQlrZnJlZSh1ZS0+dGx2X2RhdGEpOworCisJa2ZyZWUodWUtPnRsdl9kYXRhKTsKKwlrZnJlZSh1ZS0+cHJpdl9kYXRhKTsKIAlrZnJlZSh1ZSk7CiB9CiAKQEAgLTEwNzIsOCArMTEyOSw4IEBACiAJbG9uZyBwcml2YXRlX3NpemU7CiAJc3RydWN0IHVzZXJfZWxlbWVudCAqdWU7CiAJaW50IGlkeCwgZXJyOwotCQotCWlmIChjYXJkLT51c2VyX2N0bF9jb3VudCA+PSBNQVhfVVNFUl9DT05UUk9MUykKKworCWlmICghcmVwbGFjZSAmJiBjYXJkLT51c2VyX2N0bF9jb3VudCA+PSBNQVhfVVNFUl9DT05UUk9MUykKIAkJcmV0dXJuIC1FTk9NRU07CiAJaWYgKGluZm8tPmNvdW50IDwgMSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTAxLDcgKzExNTgsMTAgQEAKIAltZW1jcHkoJmtjdGwuaWQsICZpbmZvLT5pZCwgc2l6ZW9mKGluZm8tPmlkKSk7CiAJa2N0bC5jb3VudCA9IGluZm8tPm93bmVyID8gaW5mby0+b3duZXIgOiAxOwogCWFjY2VzcyB8PSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVVNFUjsKLQlrY3RsLmluZm8gPSBzbmRfY3RsX2VsZW1fdXNlcl9pbmZvOworCWlmIChpbmZvLT50eXBlID09IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCkKKwkJa2N0bC5pbmZvID0gc25kX2N0bF9lbGVtX3VzZXJfZW51bV9pbmZvOworCWVsc2UKKwkJa2N0bC5pbmZvID0gc25kX2N0bF9lbGVtX3VzZXJfaW5mbzsKIAlpZiAoYWNjZXNzICYgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQpCiAJCWtjdGwuZ2V0ID0gc25kX2N0bF9lbGVtX3VzZXJfZ2V0OwogCWlmIChhY2Nlc3MgJiBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEUpCkBAIC0xMTIyLDYgKzExODIsMTEgQEAKIAkJaWYgKGluZm8tPmNvdW50ID4gNjQpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ6CisJCXByaXZhdGVfc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBpbnQpOworCQlpZiAoaW5mby0+Y291bnQgPiAxMjggfHwgaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOwogCWNhc2UgU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzoKIAkJcHJpdmF0ZV9zaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwogCQlpZiAoaW5mby0+Y291bnQgPiA1MTIpCkBAIC0xMTQzLDkgKzEyMDgsMTcgQEAKIAl1ZS0+aW5mby5hY2Nlc3MgPSAwOwogCXVlLT5lbGVtX2RhdGEgPSAoY2hhciAqKXVlICsgc2l6ZW9mKCp1ZSk7CiAJdWUtPmVsZW1fZGF0YV9zaXplID0gcHJpdmF0ZV9zaXplOworCWlmICh1ZS0+aW5mby50eXBlID09IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCkgeworCQllcnIgPSBzbmRfY3RsX2VsZW1faW5pdF9lbnVtX25hbWVzKHVlKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKHVlKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CiAJa2N0bC5wcml2YXRlX2ZyZWUgPSBzbmRfY3RsX2VsZW1fdXNlcl9mcmVlOwogCV9rY3RsID0gc25kX2N0bF9uZXcoJmtjdGwsIGFjY2Vzcyk7CiAJaWYgKF9rY3RsID09IE5VTEwpIHsKKwkJa2ZyZWUodWUtPnByaXZfZGF0YSk7CiAJCWtmcmVlKHVlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jIGIvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jCmluZGV4IDQyNjg3NDQuLjJiYjk1YTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29udHJvbF9jb21wYXQuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMKQEAgLTgzLDYgKzgzLDggQEAKIAkJCXUzMiBpdGVtczsKIAkJCXUzMiBpdGVtOwogCQkJY2hhciBuYW1lWzY0XTsKKwkJCXU2NCBuYW1lc19wdHI7CisJCQl1MzIgbmFtZXNfbGVuZ3RoOwogCQl9IGVudW1lcmF0ZWQ7CiAJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMTI4XTsKIAl9IHZhbHVlOwpAQCAtMzcyLDYgKzM3NCw4IEBACiAJCQkJICAgJmRhdGEzMi0+dmFsdWUuZW51bWVyYXRlZCwKIAkJCQkgICBzaXplb2YoZGF0YS0+dmFsdWUuZW51bWVyYXRlZCkpKQogCQkJZ290byBlcnJvcjsKKwkJZGF0YS0+dmFsdWUuZW51bWVyYXRlZC5uYW1lc19wdHIgPQorCQkJKHVpbnRwdHJfdCljb21wYXRfcHRyKGRhdGEtPnZhbHVlLmVudW1lcmF0ZWQubmFtZXNfcHRyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2RldmljZS5jIGIvc291bmQvY29yZS9kZXZpY2UuYwppbmRleCAyZDFhZDRiMC4uZjAzY2I1NCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL2RldmljZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2h3ZGVwLmMgYi9zb3VuZC9jb3JlL2h3ZGVwLmMKaW5kZXggYTcwZWU3Zi4uNzVlYTE2ZiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9od2RlcC5jCisrKyBiL3NvdW5kL2NvcmUvaHdkZXAuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgpAQCAtMjcyLDcgKzI3MywxNCBAQAogCQkJaWYgKGdldF91c2VyKGRldmljZSwgKGludCBfX3VzZXIgKilhcmcpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCQkJZGV2aWNlID0gZGV2aWNlIDwgMCA/IDAgOiBkZXZpY2UgKyAxOworCisJCQlpZiAoZGV2aWNlIDwgMCkKKwkJCQlkZXZpY2UgPSAwOworCQkJZWxzZSBpZiAoZGV2aWNlIDwgU05EUlZfTUlOT1JfSFdERVBTKQorCQkJCWRldmljZSsrOworCQkJZWxzZQorCQkJCWRldmljZSA9IFNORFJWX01JTk9SX0hXREVQUzsKKwogCQkJd2hpbGUgKGRldmljZSA8IFNORFJWX01JTk9SX0hXREVQUykgewogCQkJCWlmIChzbmRfaHdkZXBfc2VhcmNoKGNhcmQsIGRldmljZSkpCiAJCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pbmZvLmMgYi9zb3VuZC9jb3JlL2luZm8uYwppbmRleCA2MDFmMGViLi5jMWU2MTFjIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2luZm8uYworKysgYi9zb3VuZC9jb3JlL2luZm8uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9taW5vcnMuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luZm9fb3NzLmMgYi9zb3VuZC9jb3JlL2luZm9fb3NzLmMKaW5kZXggZTRhZjEzOC4uY2Y0MmFiNSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbmZvX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvaW5mb19vc3MuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5pdC5jIGIvc291bmQvY29yZS9pbml0LmMKaW5kZXggMmMwNDFiYi4uM2FjNDliMSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbml0LmMKKysrIGIvc291bmQvY29yZS9pbml0LmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pc2FkbWEuYyBiL3NvdW5kL2NvcmUvaXNhZG1hLmMKaW5kZXggOTUwZTE5Yi4uYzBmMTIwOCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pc2FkbWEuYworKysgYi9zb3VuZC9jb3JlL2lzYWRtYS5jCkBAIC0yNiw2ICsyNiw3IEBACiAKICN1bmRlZiBIQVZFX1JFQUxMWV9TTE9XX0RNQV9DT05UUk9MTEVSCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2phY2suYyBiL3NvdW5kL2NvcmUvamFjay5jCmluZGV4IDUzYjUzZTkuLjI2ZWRmNjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvamFjay5jCisrKyBiL3NvdW5kL2NvcmUvamFjay5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogCkBAIC0zMCw2ICszMSw3IEBACiAJU1dfTElORU9VVF9JTlNFUlQsCiAJU1dfSkFDS19QSFlTSUNBTF9JTlNFUlQsCiAJU1dfVklERU9PVVRfSU5TRVJULAorCVNXX0xJTkVJTl9JTlNFUlQsCiB9OwogCiBzdGF0aWMgaW50IHNuZF9qYWNrX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21lbW9yeS5jIGIvc291bmQvY29yZS9tZW1vcnkuYwppbmRleCAxMTYxMTU4Li42NmEyNzhkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL21lbW9yeS5jCisrKyBiL3NvdW5kL2NvcmUvbWVtb3J5LmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9taXNjLmMgYi9zb3VuZC9jb3JlL21pc2MuYwppbmRleCBlYjlmZTJlLi40NjVmMGNlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL21pc2MuYworKysgYi9zb3VuZC9jb3JlL21pc2MuYwpAQCAtMjAsNiArMjAsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwppbmRleCBkODM1OWNmLi4xODI5N2Y3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KQEAgLTQ5OSw3ICs1MDAsNyBAQAogCQogCW1lbXNldCgmaWQsIDAsIHNpemVvZihpZCkpOwogCWlkLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7Ci0Jc3RyY3B5KGlkLm5hbWUsIG5hbWUpOworCXN0cmxjcHkoaWQubmFtZSwgbmFtZSwgc2l6ZW9mKGlkLm5hbWUpKTsKIAlpZC5pbmRleCA9IGluZGV4OwogCXJldHVybiBzbmRfY3RsX2ZpbmRfaWQoY2FyZCwgJmlkKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwppbmRleCAyM2MzNGEwLi4zY2M0Yjg2IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKKysrIGIvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbS5jIGIvc291bmQvY29yZS9wY20uYwppbmRleCBlZTlhYmIyLi44OTI4Y2E4NyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY20uYworKysgYi9zb3VuZC9jb3JlL3BjbS5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jIGIvc291bmQvY29yZS9wY21fbGliLmMKaW5kZXggNjJlOTBiOC4uMzQyMGJkMyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbGliLmMKKysrIGIvc291bmQvY29yZS9wY21fbGliLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpAQCAtMTM5OSw2ICsxNDAwLDMyIEBACiAKIEVYUE9SVF9TWU1CT0woc25kX3BjbV9od19jb25zdHJhaW50X3BvdzIpOwogCitzdGF0aWMgaW50IHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlX2Z1bmMoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJCSAgIHN0cnVjdCBzbmRfcGNtX2h3X3J1bGUgKnJ1bGUpCit7CisJdW5zaWduZWQgaW50IGJhc2VfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpKHVpbnRwdHJfdClydWxlLT5wcml2YXRlOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGU7CisKKwlyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJcmV0dXJuIHNuZF9pbnRlcnZhbF9saXN0KHJhdGUsIDEsICZiYXNlX3JhdGUsIDApOworfQorCisvKioKKyAqIHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlIC0gYWRkIGEgcnVsZSB0byBhbGxvdyBkaXNhYmxpbmcgaHcgcmVzYW1wbGluZworICogQHJ1bnRpbWU6IFBDTSBydW50aW1lIGluc3RhbmNlCisgKiBAYmFzZV9yYXRlOiB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgaGFyZHdhcmUgZG9lcyBub3QgcmVzYW1wbGUKKyAqLworaW50IHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlKHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJhc2VfcmF0ZSkKK3sKKwlyZXR1cm4gc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1TX05PUkVTQU1QTEUsCisJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkJICAgc25kX3BjbV9od19ydWxlX25vcmVzYW1wbGVfZnVuYywKKwkJCQkgICAodm9pZCAqKSh1aW50cHRyX3QpYmFzZV9yYXRlLAorCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAtMSk7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlKTsKKwogc3RhdGljIHZvaWQgX3NuZF9wY21faHdfcGFyYW1fYW55KHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhcikKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX21lbW9yeS5jIGIvc291bmQvY29yZS9wY21fbWVtb3J5LmMKaW5kZXggMTUwY2I3ZS4uOTU3MTMxMyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9wY21fbWVtb3J5LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX21pc2MuYyBiL3NvdW5kL2NvcmUvcGNtX21pc2MuYwppbmRleCA4OGYwMmUzLi45YzllZmY5IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9taXNjLmMKKysrIGIvc291bmQvY29yZS9wY21fbWlzYy5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KICAgCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNkZWZpbmUgU05EX1BDTV9GT1JNQVRfVU5LTk9XTiAoLTEpCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCmluZGV4IGM3NGUyMjguLjI1ZWQ5ZmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CkBAIC0yMDU4LDE2ICsyMDU5LDEyIEBACiAKIHN0YXRpYyBpbnQgc25kX3BjbV9vcGVuX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgICAgIHN0cnVjdCBzbmRfcGNtICpwY20sCi0JCQkgICAgIGludCBzdHJlYW0sCi0JCQkgICAgIHN0cnVjdCBzbmRfcGNtX2ZpbGUgKipycGNtX2ZpbGUpCisJCQkgICAgIGludCBzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9wY21fZmlsZSAqcGNtX2ZpbGU7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJaW50IGVycjsKIAotCWlmIChycGNtX2ZpbGUpCi0JCSpycGNtX2ZpbGUgPSBOVUxMOwotCiAJZXJyID0gc25kX3BjbV9vcGVuX3N1YnN0cmVhbShwY20sIHN0cmVhbSwgZmlsZSwgJnN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC0yMDgzLDggKzIwODAsNyBAQAogCQlzdWJzdHJlYW0tPnBjbV9yZWxlYXNlID0gcGNtX3JlbGVhc2VfcHJpdmF0ZTsKIAl9CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGNtX2ZpbGU7Ci0JaWYgKHJwY21fZmlsZSkKLQkJKnJwY21fZmlsZSA9IHBjbV9maWxlOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxMTMsNyArMjEwOSw2IEBACiBzdGF0aWMgaW50IHNuZF9wY21fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBzbmRfcGNtX2ZpbGUgKnBjbV9maWxlOwogCXdhaXRfcXVldWVfdCB3YWl0OwogCiAJaWYgKHBjbSA9PSBOVUxMKSB7CkBAIC0yMTMxLDcgKzIxMjYsNyBAQAogCWFkZF93YWl0X3F1ZXVlKCZwY20tPm9wZW5fd2FpdCwgJndhaXQpOwogCW11dGV4X2xvY2soJnBjbS0+b3Blbl9tdXRleCk7CiAJd2hpbGUgKDEpIHsKLQkJZXJyID0gc25kX3BjbV9vcGVuX2ZpbGUoZmlsZSwgcGNtLCBzdHJlYW0sICZwY21fZmlsZSk7CisJCWVyciA9IHNuZF9wY21fb3Blbl9maWxlKGZpbGUsIHBjbSwgc3RyZWFtKTsKIAkJaWYgKGVyciA+PSAwKQogCQkJYnJlYWs7CiAJCWlmIChlcnIgPT0gLUVBR0FJTikgewpAQCAtMzE1Niw4ICszMTUxLDggQEAKIC8qCiAgKiBtbWFwIHRoZSBETUEgYnVmZmVyIG9uIFJBTQogICovCi1zdGF0aWMgaW50IHNuZF9wY21fZGVmYXVsdF9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK2ludCBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKIHsKIAlhcmVhLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKICNpZmRlZiBBUkNIX0hBU19ETUFfTU1BUF9DT0hFUkVOVApAQCAtMzE3Nyw2ICszMTcyLDcgQEAKIAlhcmVhLT52bV9vcHMgPSAmc25kX3BjbV92bV9vcHNfZGF0YV9mYXVsdDsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9wY21fbGliX2RlZmF1bHRfbW1hcCk7CiAKIC8qCiAgKiBtbWFwIHRoZSBETUEgYnVmZmVyIG9uIEkvTyBtZW1vcnkgYXJlYQpAQCAtMzI0Miw3ICszMjM4LDcgQEAKIAlpZiAoc3Vic3RyZWFtLT5vcHMtPm1tYXApCiAJCWVyciA9IHN1YnN0cmVhbS0+b3BzLT5tbWFwKHN1YnN0cmVhbSwgYXJlYSk7CiAJZWxzZQotCQllcnIgPSBzbmRfcGNtX2RlZmF1bHRfbW1hcChzdWJzdHJlYW0sIGFyZWEpOworCQllcnIgPSBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3Vic3RyZWFtLCBhcmVhKTsKIAlpZiAoIWVycikKIAkJYXRvbWljX2luYygmc3Vic3RyZWFtLT5tbWFwX2NvdW50KTsKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9yYXdtaWRpLmMgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwppbmRleCA4NDlhMGVkLi5lYmY2ZTQ5IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3Jhd21pZGkuYworKysgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c291bmQvcmF3bWlkaS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jCmluZGV4IGExZjFhMmYuLjhkNGQ1ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYwpAQCAtMjEsNyArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9taW5vcnMuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYwppbmRleCA2OWNkN2IzLi5lM2NiNDZmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pbml0LmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfaW5pdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAic2VxX29zc190aW1lci5oIgogI2luY2x1ZGUgInNlcV9vc3NfZXZlbnQuaCIKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5jCmluZGV4IGVlNDRhYjkuLmM1Yjc3M2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3Nfc3ludGguYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgInNlcV9vc3NfbWlkaS5oIgogI2luY2x1ZGUgIi4uL3NlcV9sb2NrLmgiCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcS5jIGIvc291bmQvY29yZS9zZXEvc2VxLmMKaW5kZXggMTE5ZmRkYjYuLjlkODM3OWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcS5jCkBAIC0yMCw3ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwppbmRleCBmMjQzNmQzLi40ZGM2YmFlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jIGIvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCmluZGV4IDFmOTk3NjcuLjVjZjhkNjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKQEAgLTM3LDYgKzM3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvc2VxX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwppbmRleCAxZDdkOTBjLi5iOWIyMjM1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwpAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJzZXFfY2xpZW50bWdyLmgiCiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2luZm8uYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9pbmZvLmMKaW5kZXggMjAxZjgxMC4uYWNmNzc2OSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2luZm8uYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfaW5mby5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAKICNpbmNsdWRlICJzZXFfaW5mby5oIgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9sb2NrLmMKaW5kZXggNTRmOTIxZS4uMmNmZTUwYyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbG9jay5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAic2VxX2xvY2suaCIKIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jIGIvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jCmluZGV4IDdmNTBjMTQuLmY0NzhmNzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMKaW5kZXggZWJhZjFiNS4uNjQwNjlkYiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9lbXVsLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9lbXVsLmMKaW5kZXggMDdjNjYzMS4uNmY2NDQ3MSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX21pZGlfZW11bC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpX2VtdWwuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NlcV9rZXJuZWwuaD4KICNpbmNsdWRlIDxzb3VuZC9zZXFfbWlkaV9lbXVsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9ldmVudC5jIGIvc291bmQvY29yZS9zZXEvc2VxX21pZGlfZXZlbnQuYwppbmRleCBiNWQ2ZWE0Li4zN2RiN2JhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9ldmVudC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpX2V2ZW50LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvc2VxX2tlcm5lbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NlcV9taWRpX2V2ZW50Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jCmluZGV4IGUxMmJjZDkuLjk1MTZlNWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInNlcV9zeXN0ZW0uaCIKICNpbmNsdWRlICJzZXFfcG9ydHMuaCIKICNpbmNsdWRlICJzZXFfY2xpZW50bWdyLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfc3lzdGVtLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfc3lzdGVtLmMKaW5kZXggYzM4YjkwYy4uOGNlMWQwYiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3N5c3RlbS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9zeXN0ZW0uYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJzZXFfc3lzdGVtLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jIGIvc291bmQvY29yZS9zZXEvc2VxX3Zpcm1pZGkuYwppbmRleCA4NmU3NzM5Li40YjUwZTYwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMKQEAgLTM3LDYgKzM3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NvdW5kLmMgYi9zb3VuZC9jb3JlL3NvdW5kLmMKaW5kZXggMWM3YTNlZi4uODI4YWYzNSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZC5jCisrKyBiL3NvdW5kL2NvcmUvc291bmQuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvbWlub3JzLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZF9vc3MuYyBiL3NvdW5kL2NvcmUvc291bmRfb3NzLmMKaW5kZXggMGMxNjRlNS4uYzcwMDkyMCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZF9vc3MuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kX29zcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvdGltZXIuYyBiL3NvdW5kL2NvcmUvdGltZXIuYwppbmRleCA2N2ViZjFjLi44ZTc1NjFkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3RpbWVyLmMKKysrIGIvc291bmQvY29yZS90aW1lci5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3RpbWVyLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3ZtYXN0ZXIuYyBiL3NvdW5kL2NvcmUvdm1hc3Rlci5jCmluZGV4IGEzOWQzZDguLjEzMGNmZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvdm1hc3Rlci5jCisrKyBiL3NvdW5kL2NvcmUvdm1hc3Rlci5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgpAQCAtNTEsNiArNTIsNyBAQAogCXN0cnVjdCBsaW5rX2N0bF9pbmZvIGluZm87CiAJaW50IHZhbHNbMl07CQkvKiBjdXJyZW50IHZhbHVlcyAqLwogCXVuc2lnbmVkIGludCBmbGFnczsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOyAvKiBvcmlnaW5hbCBrY29udHJvbCBwb2ludGVyICovCiAJc3RydWN0IHNuZF9rY29udHJvbCBzbGF2ZTsgLyogdGhlIGNvcHkgb2Ygb3JpZ2luYWwgY29udHJvbCBlbnRyeSAqLwogfTsKIApAQCAtMjUxLDYgKzI1Myw3IEBACiAJCSAgICAgICBzbGF2ZS0+Y291bnQgKiBzaXplb2YoKnNsYXZlLT52ZCksIEdGUF9LRVJORUwpOwogCWlmICghc3JlYykKIAkJcmV0dXJuIC1FTk9NRU07CisJc3JlYy0+a2N0bCA9IHNsYXZlOwogCXNyZWMtPnNsYXZlID0gKnNsYXZlOwogCW1lbWNweShzcmVjLT5zbGF2ZS52ZCwgc2xhdmUtPnZkLCBzbGF2ZS0+Y291bnQgKiBzaXplb2YoKnNsYXZlLT52ZCkpOwogCXNyZWMtPm1hc3RlciA9IG1hc3Rlcl9saW5rOwpAQCAtMzMyLDEwICszMzUsMTggQEAKIHN0YXRpYyB2b2lkIG1hc3Rlcl9mcmVlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQogewogCXN0cnVjdCBsaW5rX21hc3RlciAqbWFzdGVyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBsaW5rX3NsYXZlICpzbGF2ZTsKKwlzdHJ1Y3QgbGlua19zbGF2ZSAqc2xhdmUsICpuOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzbGF2ZSwgJm1hc3Rlci0+c2xhdmVzLCBsaXN0KQotCQlzbGF2ZS0+bWFzdGVyID0gTlVMTDsKKwkvKiBmcmVlIGFsbCBzbGF2ZSBsaW5rcyBhbmQgcmV0b3JlIHRoZSBvcmlnaW5hbCBzbGF2ZSBrY3RscyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbGF2ZSwgbiwgJm1hc3Rlci0+c2xhdmVzLCBsaXN0KSB7CisJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKnNjdGwgPSBzbGF2ZS0+a2N0bDsKKwkJc3RydWN0IGxpc3RfaGVhZCBvbGlzdCA9IHNjdGwtPmxpc3Q7CisJCW1lbWNweShzY3RsLCAmc2xhdmUtPnNsYXZlLCBzaXplb2YoKnNjdGwpKTsKKwkJbWVtY3B5KHNjdGwtPnZkLCBzbGF2ZS0+c2xhdmUudmQsCisJCSAgICAgICBzY3RsLT5jb3VudCAqIHNpemVvZigqc2N0bC0+dmQpKTsKKwkJc2N0bC0+bGlzdCA9IG9saXN0OyAvKiBrZWVwIHRoZSBjdXJyZW50IGxpbmtlZC1saXN0ICovCisJCWtmcmVlKHNsYXZlKTsKKwl9CiAJa2ZyZWUobWFzdGVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9hbG9vcC5jIGIvc291bmQvZHJpdmVycy9hbG9vcC5jCmluZGV4IGEwZGE3NzUuLmQ4M2JhZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvYWxvb3AuYworKysgYi9zb3VuZC9kcml2ZXJzL2Fsb29wLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CkBAIC01NzUsNyArNTc1LDggQEAKIHN0YXRpYyBpbnQgbG9vcGJhY2tfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7Ci0JcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CisJcmV0dXJuIHNuZF9wY21fbGliX2FsbG9jX3ZtYWxsb2NfYnVmZmVyKHN1YnN0cmVhbSwKKwkJCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CiB9CiAKIHN0YXRpYyBpbnQgbG9vcGJhY2tfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTU4Nyw3ICs1ODgsNyBAQAogCW11dGV4X2xvY2soJmRwY20tPmxvb3BiYWNrLT5jYWJsZV9sb2NrKTsKIAljYWJsZS0+dmFsaWQgJj0gfigxIDw8IHN1YnN0cmVhbS0+c3RyZWFtKTsKIAltdXRleF91bmxvY2soJmRwY20tPmxvb3BiYWNrLT5jYWJsZV9sb2NrKTsKLQlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3ZtYWxsb2NfYnVmZmVyKHN1YnN0cmVhbSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2NhYmxlX2luZGV4KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpAQCAtNzQwLDYgKzc0MSw4IEBACiAJLnByZXBhcmUgPQlsb29wYmFja19wcmVwYXJlLAogCS50cmlnZ2VyID0JbG9vcGJhY2tfdHJpZ2dlciwKIAkucG9pbnRlciA9CWxvb3BiYWNrX3BvaW50ZXIsCisJLnBhZ2UgPQkJc25kX3BjbV9saWJfZ2V0X3ZtYWxsb2NfcGFnZSwKKwkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX3ZtYWxsb2MsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGxvb3BiYWNrX2NhcHR1cmVfb3BzID0gewpAQCAtNzUxLDYgKzc1NCw4IEBACiAJLnByZXBhcmUgPQlsb29wYmFja19wcmVwYXJlLAogCS50cmlnZ2VyID0JbG9vcGJhY2tfdHJpZ2dlciwKIAkucG9pbnRlciA9CWxvb3BiYWNrX3BvaW50ZXIsCisJLnBhZ2UgPQkJc25kX3BjbV9saWJfZ2V0X3ZtYWxsb2NfcGFnZSwKKwkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX3ZtYWxsb2MsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBsb29wYmFja19wY21fbmV3KHN0cnVjdCBsb29wYmFjayAqbG9vcGJhY2ssCkBAIC03NzEsMTAgKzc3Niw2IEBACiAJc3RyY3B5KHBjbS0+bmFtZSwgIkxvb3BiYWNrIFBDTSIpOwogCiAJbG9vcGJhY2stPnBjbVtkZXZpY2VdID0gcGNtOwotCi0Jc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCi0JCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKLQkJCTAsIDIgKiAxMDI0ICogMTAyNCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvZHVtbXkuYyBiL3NvdW5kL2RyaXZlcnMvZHVtbXkuYwppbmRleCA3ZjQxOTkwLi45N2YxZjkzIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL2R1bW15LmMKKysrIGIvc291bmQvZHJpdmVycy9kdW1teS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL21sNDAzLWFjOTdjci5jIGIvc291bmQvZHJpdmVycy9tbDQwMy1hYzk3Y3IuYwppbmRleCA1Y2ZjYjkwLi4yZWU4MmM1IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL21sNDAzLWFjOTdjci5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbWw0MDMtYWM5N2NyLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApAQCAtMTE1Myw3ICsxMTUzLDcgQEAKIAkJICAgIjB4JXggZG9uZVxuIiwgKHVuc2lnbmVkIGludCltbDQwM19hYzk3Y3ItPnBvcnQpOwogCS8qIGdldCBpcnEgKi8KIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBmZGV2LCAwKTsKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbWw0MDNfYWM5N2NyX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbWw0MDNfYWM5N2NyX2lycSwgMCwKIAkJCWRldl9uYW1lKCZwZmRldi0+ZGV2KSwgKHZvaWQgKiltbDQwM19hYzk3Y3IpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgU05EX01MNDAzX0FDOTdDUl9EUklWRVIgIjogIgogCQkJICAgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwKQEAgLTExNjYsNyArMTE2Niw3IEBACiAJCSAgICJyZXF1ZXN0IChwbGF5YmFjaykgaXJxICVkIGRvbmVcbiIsCiAJCSAgIG1sNDAzX2FjOTdjci0+aXJxKTsKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBmZGV2LCAxKTsKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbWw0MDNfYWM5N2NyX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbWw0MDNfYWM5N2NyX2lycSwgMCwKIAkJCWRldl9uYW1lKCZwZmRldi0+ZGV2KSwgKHZvaWQgKiltbDQwM19hYzk3Y3IpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgU05EX01MNDAzX0FDOTdDUl9EUklWRVIgIjogIgogCQkJICAgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMS5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKaW5kZXggMTQ5ZDA1YS4uMjU3NTY5MCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKKysrIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC04Niw4ICs4Niw3IEBACiAJfQogCiAJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLCBwb3J0W2Rldl0sIDAsCi0JCQkJICBpcnFbZGV2XSwgaXJxW2Rldl0gPj0gMCA/IElSUUZfRElTQUJMRUQgOiAwLAotCQkJCSAgTlVMTCk7CisJCQkJICBpcnFbZGV2XSwgTlVMTCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJNUFU0MDEgbm90IGRldGVjdGVkIGF0IDB4JWx4XG4iLCBwb3J0W2Rldl0pOwogCQlnb3RvIF9lcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL21wdTQwMS9tcHU0MDFfdWFydC5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxX3VhcnQuYwppbmRleCAyYWYwOTk5Li4xY2ZmMzMxIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL21wdTQwMS9tcHU0MDFfdWFydC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMV91YXJ0LmMKQEAgLTMsNyArMyw3IEBACiAgKiAgUm91dGluZXMgZm9yIGNvbnRyb2wgb2YgTVBVLTQwMSBpbiBVQVJUIG1vZGUKICAqCiAgKiAgTVBVLTQwMSBzdXBwb3J0cyBVQVJUIG1vZGUgd2hpY2ggaXMgbm90IGNhcGFibGUgZ2VuZXJhdGUgdHJhbnNtaXQKLSAqICBpbnRlcnJ1cHRzIHRodXMgb3V0cHV0IGlzIGRvbmUgdmlhIHBvbGxpbmcuIEFsc28sIGlmIGlycSA8IDAsIHRoZW4KKyAqICBpbnRlcnJ1cHRzIHRodXMgb3V0cHV0IGlzIGRvbmUgdmlhIHBvbGxpbmcuIFdpdGhvdXQgaW50ZXJydXB0LAogICogIGlucHV0IGlzIGRvbmUgYWxzbyB2aWEgcG9sbGluZy4gRG8gbm90IGV4cGVjdCBnb29kIHBlcmZvcm1hbmNlLgogICoKICAqCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTM3NCw3ICszNzUsNyBAQAogCQkJLyogZmlyc3QgdGltZSAtIGZsdXNoIEZJRk8gKi8KIAkJCXdoaWxlIChtYXgtLSA+IDApCiAJCQkJbXB1LT5yZWFkKG1wdSwgTVBVNDAxRChtcHUpKTsKLQkJCWlmIChtcHUtPmlycSA8IDApCisJCQlpZiAobXB1LT5pbmZvX2ZsYWdzICYgTVBVNDAxX0lORk9fVVNFX1RJTUVSKQogCQkJCXNuZF9tcHU0MDFfdWFydF9hZGRfdGltZXIobXB1LCAxKTsKIAkJfQogCQkKQEAgLTM4Myw3ICszODQsNyBAQAogCQlzbmRfbXB1NDAxX3VhcnRfaW5wdXRfcmVhZChtcHUpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcHUtPmlucHV0X2xvY2ssIGZsYWdzKTsKIAl9IGVsc2UgewotCQlpZiAobXB1LT5pcnEgPCAwKQorCQlpZiAobXB1LT5pbmZvX2ZsYWdzICYgTVBVNDAxX0lORk9fVVNFX1RJTUVSKQogCQkJc25kX21wdTQwMV91YXJ0X3JlbW92ZV90aW1lcihtcHUsIDEpOwogCQljbGVhcl9iaXQoTVBVNDAxX01PREVfQklUX0lOUFVUX1RSSUdHRVIsICZtcHUtPm1vZGUpOwogCX0KQEAgLTQ5Niw3ICs0OTcsNyBAQAogc3RhdGljIHZvaWQgc25kX21wdTQwMV91YXJ0X2ZyZWUoc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaSkKIHsKIAlzdHJ1Y3Qgc25kX21wdTQwMSAqbXB1ID0gcm1pZGktPnByaXZhdGVfZGF0YTsKLQlpZiAobXB1LT5pcnFfZmxhZ3MgJiYgbXB1LT5pcnEgPj0gMCkKKwlpZiAobXB1LT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEobXB1LT5pcnEsICh2b2lkICopIG1wdSk7CiAJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShtcHUtPnJlcyk7CiAJa2ZyZWUobXB1KTsKQEAgLTUwOSw4ICs1MTAsNyBAQAogICogQGhhcmR3YXJlOiB0aGUgaGFyZHdhcmUgdHlwZSwgTVBVNDAxX0hXX1hYWFgKICAqIEBwb3J0OiB0aGUgYmFzZSBhZGRyZXNzIG9mIE1QVTQwMSBwb3J0CiAgKiBAaW5mb19mbGFnczogYml0ZmxhZ3MgTVBVNDAxX0lORk9fWFhYCi0gKiBAaXJxOiB0aGUgaXJxIG51bWJlciwgLTEgaWYgbm8gaW50ZXJydXB0IGZvciBtcHUKLSAqIEBpcnFfZmxhZ3M6IHRoZSBpcnEgcmVxdWVzdCBmbGFncyAoU0FfWFhYKSwgMCBpZiBpcnEgd2FzIGFscmVhZHkgcmVzZXJ2ZWQuCisgKiBAaXJxOiB0aGUgSVNBIGlycSBudW1iZXIsIC0xIGlmIG5vdCB0byBiZSBhbGxvY2F0ZWQKICAqIEBycmF3bWlkaTogdGhlIHBvaW50ZXIgdG8gc3RvcmUgdGhlIG5ldyByYXdtaWRpIGluc3RhbmNlCiAgKgogICogQ3JlYXRlcyBhIG5ldyBNUFUtNDAxIGluc3RhbmNlLgpAQCAtNTI1LDcgKzUyNSw3IEBACiAJCQl1bnNpZ25lZCBzaG9ydCBoYXJkd2FyZSwKIAkJCXVuc2lnbmVkIGxvbmcgcG9ydCwKIAkJCXVuc2lnbmVkIGludCBpbmZvX2ZsYWdzLAotCQkJaW50IGlycSwgaW50IGlycV9mbGFncywKKwkJCWludCBpcnEsCiAJCQlzdHJ1Y3Qgc25kX3Jhd21pZGkgKiogcnJhd21pZGkpCiB7CiAJc3RydWN0IHNuZF9tcHU0MDEgKm1wdTsKQEAgLTU3Nyw4ICs1NzcsOCBAQAogCQltcHUtPmNwb3J0ID0gcG9ydCArIDI7CiAJZWxzZQogCQltcHUtPmNwb3J0ID0gcG9ydCArIDE7Ci0JaWYgKGlycSA+PSAwICYmIGlycV9mbGFncykgewotCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0LCBpcnFfZmxhZ3MsCisJaWYgKGlycSA+PSAwKSB7CisJCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQsIDAsCiAJCQkJIk1QVTQwMSBVQVJUIiwgKHZvaWQgKikgbXB1KSkgewogCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibXB1NDAxX3VhcnQ6ICIKIAkJCQkgICAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBpcnEpOwpAQCAtNTg2LDkgKzU4NiwxMCBAQAogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KKwlpZiAoaXJxIDwgMCAmJiAhKGluZm9fZmxhZ3MgJiBNUFU0MDFfSU5GT19JUlFfSE9PSykpCisJCWluZm9fZmxhZ3MgfD0gTVBVNDAxX0lORk9fVVNFX1RJTUVSOwogCW1wdS0+aW5mb19mbGFncyA9IGluZm9fZmxhZ3M7CiAJbXB1LT5pcnEgPSBpcnE7Ci0JbXB1LT5pcnFfZmxhZ3MgPSBpcnFfZmxhZ3M7CiAJaWYgKGNhcmQtPnNob3J0bmFtZVswXSkKIAkJc25wcmludGYocm1pZGktPm5hbWUsIHNpemVvZihybWlkaS0+bmFtZSksICIlcyBNSURJIiwKIAkJCSBjYXJkLT5zaG9ydG5hbWUpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9tdHBhdi5jIGIvc291bmQvZHJpdmVycy9tdHBhdi5jCmluZGV4IDVjNDI2ZGYuLjc2OTMwNzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvbXRwYXYuYworKysgYi9zb3VuZC9kcml2ZXJzL210cGF2LmMKQEAgLTUyLDYgKzUyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTU4OSw3ICs1OTAsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAltY2FyZC0+cG9ydCA9IHBvcnQ7Ci0JaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX210cGF2X2lycWgsIElSUUZfRElTQUJMRUQsICJNT1RVIE1UUEFWIiwgbWNhcmQpKSB7CisJaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX210cGF2X2lycWgsIDAsICJNT1RVIE1UUEFWIiwgbWNhcmQpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIk1UVkFQIElSUSAlZCBidXN5XG4iLCBpcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXRzNjQuYyBiL3NvdW5kL2RyaXZlcnMvbXRzNjQuYwppbmRleCA4NTM5YWIwLi5mMjRiZjlhIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL210czY0LmMKKysrIGIvc291bmQvZHJpdmVycy9tdHM2NC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfbGliLmMgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYwppbmRleCA2ZTMxZTQ2Li4zM2Q5YTg1IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19vc3MuYyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX29zcy5jCmluZGV4IGFkZTNjYTUuLmMxY2IyNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX29zcy5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX29zcy5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJvcGwzX3ZvaWNlLmgiCiAKIHN0YXRpYyBpbnQgc25kX29wbDNfb3Blbl9zZXFfb3NzKHN0cnVjdCBzbmRfc2VxX29zc19hcmcgKmFyZywgdm9pZCAqY2xvc3VyZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zZXEuYyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3NlcS5jCmluZGV4IDJkMzNmNTMuLjcyMzU2MmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3NlcS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3NlcS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAib3BsM192b2ljZS5oIgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogTU9EVUxFX0FVVEhPUigiVXJvcyBCaXpqYWsgPHVyb3NAa3NzLWxva2Euc2k+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfc3ludGguYwppbmRleCAzMDFhY2I2Li43NDJhNGI2IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRfZm0uaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfbGliLmMgYi9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9saWIuYwppbmRleCBmMDdlMzhkLi5iOTUzZmI0IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9saWIuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9saWIuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkNsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfcHJvYy5jIGIvc291bmQvZHJpdmVycy9vcGw0L29wbDRfcHJvYy5jCmluZGV4IGRmODUwYjguLjliODI0YmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsNC9vcGw0X3Byb2MuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9wcm9jLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgIm9wbDRfbG9jYWwuaCIKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvb3BsNC9vcGw0X3NlcS5jIGIvc291bmQvZHJpdmVycy9vcGw0L29wbDRfc2VxLmMKaW5kZXggNDNkOGEyYi4uOTkxOTc2OSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfc2VxLmMKKysrIGIvc291bmQvZHJpdmVycy9vcGw0L29wbDRfc2VxLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJvcGw0X2xvY2FsLmgiCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCiBNT0RVTEVfQVVUSE9SKCJDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMgYi9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcC5jCmluZGV4IGYxNjVjNzcuLjk0NmEwY2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMKKysrIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3AuYwpAQCAtNiw3ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jIGIvc291bmQvZHJpdmVycy9wb3J0bWFuMng0LmMKaW5kZXggZjJiMGJhMi4uZjY2NDgyMyAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9wb3J0bWFuMng0LmMKKysrIGIvc291bmQvZHJpdmVycy9wb3J0bWFuMng0LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvcmF3bWlkaS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMgYi9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYwppbmRleCBhMjVmYjdiLi44NWFhZDQzIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYworKysgYi9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpAQCAtODE2LDcgKzgxNiw3IEBACiAKIAlpZiAoaXJxID49IDAgJiYgaXJxICE9IFNORFJWX0FVVE9fSVJRKSB7CiAJCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF91YXJ0MTY1NTBfaW50ZXJydXB0LAotCQkJCUlSUUZfRElTQUJMRUQsICJTZXJpYWwgTUlESSIsIHVhcnQpKSB7CisJCQkJMCwgIlNlcmlhbCBNSURJIiwgdWFydCkpIHsKIAkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJICAgImlycSAlZCBidXN5LiBVc2luZyBQb2xsaW5nLlxuIiwgaXJxKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvdmlybWlkaS5jIGIvc291bmQvZHJpdmVycy92aXJtaWRpLmMKaW5kZXggZjRjZDQ5My4uZDc5ZDZlZCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92aXJtaWRpLmMKKysrIGIvc291bmQvZHJpdmVycy92aXJtaWRpLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvc2VxX2tlcm5lbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NlcV92aXJtaWRpLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2NvcmUuYyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfY29yZS5jCmluZGV4IDE5YzZlMzcuLmI4ZTUxNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvdngvdnhfY29yZS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfY29yZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2h3ZGVwLmMgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2h3ZGVwLmMKaW5kZXggZjdhNmZiZC4uNGExZmFlOSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92eC92eF9od2RlcC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfaHdkZXAuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaHdkZXAuaD4KICNpbmNsdWRlIDxzb3VuZC92eF9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9jbXAuYyBiL3NvdW5kL2ZpcmV3aXJlL2NtcC5jCmluZGV4IDE0Y2FjYmMuLjc2Mjk0ZjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2NtcC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2NtcC5jCkBAIC0zMiw3ICszMiw3IEBACiAJU1VDQ0VFRF9PTl9CVVNfUkVTRVQsCiB9OwogCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQorc3RhdGljIF9fcHJpbnRmKDIsIDMpCiB2b2lkIGNtcF9lcnJvcihzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24gKmMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgdmE7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9pc2lnaHQuYyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCmluZGV4IDQ0MDAzMDguLmNkMDk0ZWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCkBAIC01MSw3ICs1MSw2IEBACiAJc3RydWN0IGZ3X3VuaXQgKnVuaXQ7CiAJc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlOwogCXU2NCBhdWRpb19iYXNlOwotCXN0cnVjdCBmd19hZGRyZXNzX2hhbmRsZXIgaXJpc19oYW5kbGVyOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtOwogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3QgaXNvX3BhY2tldHNfYnVmZmVyIGJ1ZmZlcjsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2lzby1yZXNvdXJjZXMuYyBiL3NvdW5kL2ZpcmV3aXJlL2lzby1yZXNvdXJjZXMuYwppbmRleCBmZmUyMGI4Li41ZjE3Yjc3IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9pc28tcmVzb3VyY2VzLmMKKysrIGIvc291bmQvZmlyZXdpcmUvaXNvLXJlc291cmNlcy5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUtY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL3BhY2tldHMtYnVmZmVyLmMgYi9zb3VuZC9maXJld2lyZS9wYWNrZXRzLWJ1ZmZlci5jCmluZGV4IDNjNjFjYTIuLmVhMTUwNjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL3BhY2tldHMtYnVmZmVyLmMKKysrIGIvc291bmQvZmlyZXdpcmUvcGFja2V0cy1idWZmZXIuYwpAQCAtNiw2ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAicGFja2V0cy1idWZmZXIuaCIKIApkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYyBiL3NvdW5kL2ZpcmV3aXJlL3NwZWFrZXJzLmMKaW5kZXggM2ZjMjU3ZC4uY2JlNmJiOSAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYworKysgYi9zb3VuZC9maXJld2lyZS9zcGVha2Vycy5jCkBAIC03NzgsOSArNzc4LDEwIEBACiB7CiAJc3RydWN0IGZ3c3BrICpmd3NwayA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JbXV0ZXhfbG9jaygmZndzcGstPm11dGV4KTsKIAlhbWR0cF9vdXRfc3RyZWFtX3BjbV9hYm9ydCgmZndzcGstPnN0cmVhbSk7CiAJc25kX2NhcmRfZGlzY29ubmVjdChmd3Nway0+Y2FyZCk7CisKKwltdXRleF9sb2NrKCZmd3Nway0+bXV0ZXgpOwogCWZ3c3BrX3N0b3Bfc3RyZWFtKGZ3c3BrKTsKIAltdXRleF91bmxvY2soJmZ3c3BrLT5tdXRleCk7CiAKQEAgLTc5Niw4ICs3OTcsOCBAQAogCWZjcF9idXNfcmVzZXQoZndzcGstPnVuaXQpOwogCiAJaWYgKGNtcF9jb25uZWN0aW9uX3VwZGF0ZSgmZndzcGstPmNvbm5lY3Rpb24pIDwgMCkgewotCQltdXRleF9sb2NrKCZmd3Nway0+bXV0ZXgpOwogCQlhbWR0cF9vdXRfc3RyZWFtX3BjbV9hYm9ydCgmZndzcGstPnN0cmVhbSk7CisJCW11dGV4X2xvY2soJmZ3c3BrLT5tdXRleCk7CiAJCWZ3c3BrX3N0b3Bfc3RyZWFtKGZ3c3BrKTsKIAkJbXV0ZXhfdW5sb2NrKCZmd3Nway0+bXV0ZXgpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvY3M4NDI3LmMgYi9zb3VuZC9pMmMvY3M4NDI3LmMKaW5kZXggMDRhZTg3MC4uNmMyZGMzOCAxMDA2NDQKLS0tIGEvc291bmQvaTJjL2NzODQyNy5jCisrKyBiL3NvdW5kL2kyYy9jczg0MjcuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL2kyYy5jIGIvc291bmQvaTJjL2kyYy5jCmluZGV4IGViN2M3ZDAuLjQ2NzcwMzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9pMmMuYworKysgYi9zb3VuZC9pMmMvaTJjLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTEzLmMgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTEzLmMKaW5kZXggYzQyNGQzMi4uZGRlNWM5YyAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL2FrNDExMy5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYwppbmRleCBkOWZiNTM3Li5mZGYzYzFiIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExNC5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL290aGVyL2FrNDExNy5jIGIvc291bmQvaTJjL290aGVyL2FrNDExNy5jCmluZGV4IDJjYWQyZDYuLmI0YjJhNTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYworKysgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0eHh4LWFkZGEuYyBiL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCmluZGV4IDU3Y2NiYTguLmNlZjgxM2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9wdDIyNTguYyBiL3NvdW5kL2kyYy9vdGhlci9wdDIyNTguYwppbmRleCA3OTdkM2E2Li45ZmEzOTBiIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvcHQyMjU4LmMKKysrIGIvc291bmQvaTJjL290aGVyL3B0MjI1OC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvaTJjLmg+CiAjaW5jbHVkZSA8c291bmQvcHQyMjU4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkpvY2hlbiBWb3NzIDx2b3NzQHNlZWh1aG4uZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlBUMjI1OCB2b2x1bWUgY29udHJvbGxlciAoUHJpbmNldG9uIFRlY2hub2xvZ3kgQ29ycC4pIik7CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvdGVhNTc1eC10dW5lci5jIGIvc291bmQvaTJjL290aGVyL3RlYTU3NXgtdHVuZXIuYwppbmRleCA0ODRhMzViLi42YjY4YzgyIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvdGVhNTc1eC10dW5lci5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci90ZWE1NzV4LXR1bmVyLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvdGVhNjMzMHQuYyBiL3NvdW5kL2kyYy90ZWE2MzMwdC5jCmluZGV4IDBlM2E5ZjIuLjJkMjIzMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy90ZWE2MzMwdC5jCisrKyBiL3NvdW5kL2kyYy90ZWE2MzMwdC5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvdGVhNjMzMHQuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYwppbmRleCAzY2I3NWJjLi5jZDQ0Yzc0IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKKysrIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvYWQxODE2YS5oPgpAQCAtMjA0LDcgKzIwNCw3IEBACiAKIAlpZiAobXB1X3BvcnRbZGV2XSA+IDApIHsKIAkJaWYgKHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKLQkJCQkJbXB1X3BvcnRbZGV2XSwgMCwgbXB1X2lycVtkZXZdLCBJUlFGX0RJU0FCTEVELAorCQkJCQltcHVfcG9ydFtkZXZdLCAwLCBtcHVfaXJxW2Rldl0sCiAJCQkJCU5VTEwpIDwgMCkKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4LlxuIiwgbXB1X3BvcnRbZGV2XSk7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YV9saWIuYyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmFfbGliLmMKaW5kZXggMDVhZWY4Yi4uMTc3ZWVkMyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YV9saWIuYworKysgYi9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhX2xpYi5jCkBAIC01OTUsNyArNTk1LDcgQEAKIAkJc25kX2FkMTgxNmFfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0JaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX2FkMTgxNmFfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiQUQxODE2QSIsICh2b2lkICopIGNoaXApKSB7CisJaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX2FkMTgxNmFfaW50ZXJydXB0LCAwLCAiQUQxODE2QSIsICh2b2lkICopIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImFkMTgxNmE6IGNhbid0IGdyYWIgSVJRICVkXG4iLCBpcnEpOwogCQlzbmRfYWQxODE2YV9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYyBiL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMKaW5kZXggNGJlZWI2Zi4uMzRhYjY5YiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYworKysgYi9zb3VuZC9pc2EvYWQxODQ4L2FkMTg0OC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWxzMTAwLmMgYi9zb3VuZC9pc2EvYWxzMTAwLmMKaW5kZXggMjBiZWNjOC4uZmM1YjM4ZiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FsczEwMC5jCisrKyBiL3NvdW5kL2lzYS9hbHMxMDAuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgpAQCAtMjU2LDcgKzI1Niw2IEBACiAJCQkJCW1wdV90eXBlLAogCQkJCQltcHVfcG9ydFtkZXZdLCAwLCAKIAkJCQkJbXB1X2lycVtkZXZdLAotCQkJCQltcHVfaXJxW2Rldl0gPj0gMCA/IElSUUZfRElTQUJMRUQgOiAwLAogCQkJCQlOVUxMKSA8IDApCiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gTVBVLTQwMSBkZXZpY2UgYXQgMHglbHhcbiIsIG1wdV9wb3J0W2Rldl0pOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9henQyMzIwLmMgYi9zb3VuZC9pc2EvYXp0MjMyMC5jCmluZGV4IGFhYzhkYzEuLmU1NWYzZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9henQyMzIwLmMKKysrIGIvc291bmQvaXNhL2F6dDIzMjAuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3dzcy5oPgpAQCAtMjM0LDggKzIzNCw3IEBACiAJaWYgKG1wdV9wb3J0W2Rldl0gPiAwICYmIG1wdV9wb3J0W2Rldl0gIT0gU05EUlZfQVVUT19QT1JUKSB7CiAJCWlmIChzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19BWlQyMzIwLAogCQkJCW1wdV9wb3J0W2Rldl0sIDAsCi0JCQkJbXB1X2lycVtkZXZdLCBJUlFGX0RJU0FCTEVELAotCQkJCU5VTEwpIDwgMCkKKwkJCQltcHVfaXJxW2Rldl0sIE5VTEwpIDwgMCkKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJubyBNUFUtNDAxIGRldmljZSBhdCAweCVseFxuIiwgbXB1X3BvcnRbZGV2XSk7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY21pODMzMC5jIGIvc291bmQvaXNhL2NtaTgzMzAuYwppbmRleCBmZTc5YTE2Li5jOTQ1NzhkIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY21pODMzMC5jCisrKyBiL3NvdW5kL2lzYS9jbWk4MzMwLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CkBAIC01OTcsNyArNTk3LDcgQEAKIAlpZiAobXB1cG9ydFtkZXZdICE9IFNORFJWX0FVVE9fUE9SVCkgewogCQlpZiAoc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAogCQkJCQltcHVwb3J0W2Rldl0sIDAsIG1wdWlycVtkZXZdLAotCQkJCQlJUlFGX0RJU0FCTEVELCBOVUxMKSA8IDApCisJCQkJCU5VTEwpIDwgMCkKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4LlxuIiwKIAkJCQltcHVwb3J0W2Rldl0pOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMS5jCmluZGV4IGNiOTE1M2UuLjZkODFmYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMKKysrIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzEuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvd3NzLmg+CiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CkBAIC0xMzEsNyArMTMxLDYgQEAKIAkJCW1wdV9pcnFbbl0gPSAtMTsKIAkJaWYgKHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX0NTNDIzMiwKIAkJCQkJbXB1X3BvcnRbbl0sIDAsIG1wdV9pcnFbbl0sCi0JCQkJCW1wdV9pcnFbbl0gPj0gMCA/IElSUUZfRElTQUJMRUQgOiAwLAogCQkJCQlOVUxMKSA8IDApCiAJCQlkZXZfd2FybihkZXYsICJNUFU0MDEgbm90IGRldGVjdGVkXG4iKTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYwppbmRleCA5OTlkYzFlLi5mNWE5NGI2IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jCisrKyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2LmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KQEAgLTQ0OSw4ICs0NDksNyBAQAogCQkJbXB1X2lycVtkZXZdID0gLTE7CiAJCWlmIChzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19DUzQyMzIsCiAJCQkJCW1wdV9wb3J0W2Rldl0sIDAsCi0JCQkJCW1wdV9pcnFbZGV2XSwKLQkJCQkJbXB1X2lycVtkZXZdID49IDAgPyBJUlFGX0RJU0FCTEVEIDogMCwgTlVMTCkgPCAwKQorCQkJCQltcHVfaXJxW2Rldl0sIE5VTEwpIDwgMCkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgSURFTlQgIjogTVBVNDAxIG5vdCBkZXRlY3RlZFxuIik7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jIGIvc291bmQvaXNhL2VzMTY4OC9lczE2ODguYwppbmRleCAwY2RlODEzLi45YTFhNmYyIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jCisrKyBiL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4LmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lczE2ODguaD4KQEAgLTE3NCw3ICsxNzQsNyBAQAogCQkJY2hpcC0+bXB1X3BvcnQgPiAwKSB7CiAJCWVycm9yID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfRVMxNjg4LAogCQkJCWNoaXAtPm1wdV9wb3J0LCAwLAotCQkJCW1wdV9pcnFbbl0sIElSUUZfRElTQUJMRUQsIE5VTEwpOworCQkJCW1wdV9pcnFbbl0sIE5VTEwpOwogCQlpZiAoZXJyb3IgPCAwKQogCQkJcmV0dXJuIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4X2xpYi5jIGIvc291bmQvaXNhL2VzMTY4OC9lczE2ODhfbGliLmMKaW5kZXggMDc2NzYyMC4uMWQ0N2JlOCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2VzMTY4OC9lczE2ODhfbGliLmMKKysrIGIvc291bmQvaXNhL2VzMTY4OC9lczE2ODhfbGliLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZXMxNjg4Lmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpAQCAtNjYxLDcgKzY2Miw3IEBACiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImVzMTY4ODogY2FuJ3QgZ3JhYiBwb3J0IDB4JWx4XG4iLCBwb3J0ICsgNCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF9lczE2ODhfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiRVMxNjg4IiwgKHZvaWQgKikgY2hpcCkpIHsKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfZXMxNjg4X2ludGVycnVwdCwgMCwgIkVTMTY4OCIsICh2b2lkICopIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImVzMTY4ODogY2FuJ3QgZ3JhYiBJUlEgJWRcbiIsIGlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2VzMTh4eC5jIGIvc291bmQvaXNhL2VzMTh4eC5jCmluZGV4IGZiNGQ2YjMuLjk4ZTNhYzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9lczE4eHguYworKysgYi9zb3VuZC9pc2EvZXMxOHh4LmMKQEAgLTgyLDcgKzgyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTE4MDUsNyArMTgwNSw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX2VzMTh4eF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJFUzE4eHgiLAorCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF9lczE4eHhfaW50ZXJydXB0LCAwLCAiRVMxOHh4IiwKIAkJCSh2b2lkICopIGNhcmQpKSB7CiAJCXNuZF9lczE4eHhfZnJlZShjYXJkKTsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBncmFwIElSUSAlZFxuIiwgaXJxKTsKQEAgLTIxNjAsOCArMjE2MCw4IEBACiAKIAlpZiAobXB1X3BvcnRbZGV2XSA+IDAgJiYgbXB1X3BvcnRbZGV2XSAhPSBTTkRSVl9BVVRPX1BPUlQpIHsKIAkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfRVMxOFhYLAotCQkJCQkgIG1wdV9wb3J0W2Rldl0sIDAsCi0JCQkJCSAgaXJxW2Rldl0sIDAsICZjaGlwLT5ybWlkaSk7CisJCQkJCSAgbXB1X3BvcnRbZGV2XSwgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJCSAgLTEsICZjaGlwLT5ybWlkaSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ2FsYXh5L2dhbGF4eS5jIGIvc291bmQvaXNhL2dhbGF4eS9nYWxheHkuYwppbmRleCBlZTU0ZGYwLi5lNTFkMzI0IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ2FsYXh5L2dhbGF4eS5jCisrKyBiL3NvdW5kL2lzYS9nYWxheHkvZ2FsYXh5LmMKQEAgLTU4NSw4ICs1ODUsNyBAQAogCiAJaWYgKG1wdV9wb3J0W25dID49IDApIHsKIAkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAotCQkJCQkgIG1wdV9wb3J0W25dLCAwLCBtcHVfaXJxW25dLAotCQkJCQkgIElSUUZfRElTQUJMRUQsIE5VTEwpOworCQkJCQkgIG1wdV9wb3J0W25dLCAwLCBtcHVfaXJxW25dLCBOVUxMKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzX21haW4uYyBiL3NvdW5kL2lzYS9ndXMvZ3VzX21haW4uYwppbmRleCAxMmViOThmLi40NDkwZWU0IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c19tYWluLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNfbWFpbi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2d1cy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KQEAgLTE4MCw3ICsxODEsNyBAQAogCQlzbmRfZ3VzX2ZyZWUoZ3VzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0JaWYgKGlycSA+PSAwICYmIHJlcXVlc3RfaXJxKGlycSwgc25kX2d1c19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJHVVMgR0YxIiwgKHZvaWQgKikgZ3VzKSkgeworCWlmIChpcnEgPj0gMCAmJiByZXF1ZXN0X2lycShpcnEsIHNuZF9ndXNfaW50ZXJydXB0LCAwLCAiR1VTIEdGMSIsICh2b2lkICopIGd1cykpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiZ3VzOiBjYW4ndCBncmFiIGlycSAlZFxuIiwgaXJxKTsKIAkJc25kX2d1c19mcmVlKGd1cyk7CiAJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c192b2x1bWUuYyBiL3NvdW5kL2lzYS9ndXMvZ3VzX3ZvbHVtZS5jCmluZGV4IGMzYzAyOGEuLjNkZDg0MWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzX3ZvbHVtZS5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzX3ZvbHVtZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZ3VzLmg+CiAjZGVmaW5lIF9fR1VTX1RBQkxFU19BTExPQ19fCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c2NsYXNzaWMuYyBiL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jCmluZGV4IDA4NmI4ZjAuLmQ3Mjk2NTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2d1cy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9ndXNleHRyZW1lLmMgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwppbmRleCAwMDhlOGU1Li41OTdhY2NkIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9ndXMuaD4KQEAgLTMxNyw4ICszMTcsNyBAQAogCiAJaWYgKGVzMTY4OC0+bXB1X3BvcnQgPj0gMHgzMDApIHsKIAkJZXJyb3IgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19FUzE2ODgsCi0JCQkJZXMxNjg4LT5tcHVfcG9ydCwgMCwKLQkJCQltcHVfaXJxW25dLCBJUlFGX0RJU0FCTEVELCBOVUxMKTsKKwkJCQllczE2ODgtPm1wdV9wb3J0LCAwLCBtcHVfaXJxW25dLCBOVUxMKTsKIAkJaWYgKGVycm9yIDwgMCkKIAkJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzbWF4LmMgYi9zb3VuZC9pc2EvZ3VzL2d1c21heC5jCmluZGV4IDNlNGE1OGIuLjkzM2NiMGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzbWF4LmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNtYXguYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9ndXMuaD4KQEAgLTI5MSw3ICsyOTEsNyBAQAogCQlnb3RvIF9lcnI7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKHhpcnEsIHNuZF9ndXNtYXhfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiR1VTIE1BWCIsICh2b2lkICopbWF4Y2FyZCkpIHsKKwlpZiAocmVxdWVzdF9pcnEoeGlycSwgc25kX2d1c21heF9pbnRlcnJ1cHQsIDAsICJHVVMgTUFYIiwgKHZvaWQgKiltYXhjYXJkKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCB4aXJxKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIF9lcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jIGIvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYwppbmRleCBjN2I4MGU0Li44ZTdlMTk0IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCisrKyBiL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9ndXMuaD4KQEAgLTY4NCw3ICs2ODQsNyBAQAogCWlmICgoZXJyID0gc25kX2d1c19pbml0aWFsaXplKGd1cykpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWlmIChyZXF1ZXN0X2lycSh4aXJxLCBzbmRfaW50ZXJ3YXZlX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoeGlycSwgc25kX2ludGVyd2F2ZV9pbnRlcnJ1cHQsIDAsCiAJCQkiSW50ZXJXYXZlIiwgaXdjYXJkKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCB4aXJxKTsKIAkJcmV0dXJuIC1FQlVTWTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9tc25kL21zbmQuYyBiL3NvdW5kL2lzYS9tc25kL21zbmQuYwppbmRleCAzYTE1MjZhLi4xY2VlMThmIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvbXNuZC9tc25kLmMKKysrIGIvc291bmQvaXNhL21zbmQvbXNuZC5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL21zbmQvbXNuZF9taWRpLmMgYi9zb3VuZC9pc2EvbXNuZC9tc25kX21pZGkuYwppbmRleCA3ODc0OTU2Li5mZmM2N2ZkIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvbXNuZC9tc25kX21pZGkuYworKysgYi9zb3VuZC9pc2EvbXNuZC9tc25kX21pZGkuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcmF3bWlkaS5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlLmMgYi9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlLmMKaW5kZXggOTFkNjAyMy4uMDk2MWUyYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZS5jCisrKyBiL3NvdW5kL2lzYS9tc25kL21zbmRfcGlubmFjbGUuYwpAQCAtNjAwLDcgKzYwMCw3IEBACiAJCQkJCSAgbXB1X2lvWzBdLAogCQkJCQkgIE1QVTQwMV9NT0RFX0lOUFVUIHwKIAkJCQkJICBNUFU0MDFfTU9ERV9PVVRQVVQsCi0JCQkJCSAgbXB1X2lycVswXSwgSVJRRl9ESVNBQkxFRCwKKwkJCQkJICBtcHVfaXJxWzBdLAogCQkJCQkgICZjaGlwLT5ybWlkaSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZV9taXhlci5jIGIvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZV9taXhlci5jCmluZGV4IDQ5NDA1OGEuLjFkZTU5ZDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9tc25kL21zbmRfcGlubmFjbGVfbWl4ZXIuYworKysgYi9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlX21peGVyLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcGwzc2EyLmMgYi9zb3VuZC9pc2Evb3BsM3NhMi5jCmluZGV4IDliOTE1ZTIuLjY0YTlhMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcGwzc2EyLmMKKysrIGIvc291bmQvaXNhL29wbDNzYTIuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvd3NzLmg+CiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CkBAIC02NjcsNyArNjY3LDcgQEAKIAllcnIgPSBzbmRfb3BsM3NhMl9kZXRlY3QoY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gcmVxdWVzdF9pcnEoeGlycSwgc25kX29wbDNzYTJfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCWVyciA9IHJlcXVlc3RfaXJxKHhpcnEsIHNuZF9vcGwzc2EyX2ludGVycnVwdCwgMCwKIAkJCSAgIk9QTDMtU0EyIiwgY2FyZCk7CiAJaWYgKGVycikgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2FuJ3QgZ3JhYiBJUlEgJWRcbiIsIHhpcnEpOwpAQCAtNzA3LDggKzcwNyw5IEBACiAJfQogCWlmIChtaWRpX3BvcnRbZGV2XSA+PSAweDMwMCAmJiBtaWRpX3BvcnRbZGV2XSA8IDB4MzQwKSB7CiAJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfT1BMM1NBMiwKLQkJCQkJICAgICAgIG1pZGlfcG9ydFtkZXZdLCAwLAotCQkJCQkgICAgICAgeGlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKQorCQkJCQkgICAgICAgbWlkaV9wb3J0W2Rldl0sCisJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JUlFfSE9PSywgLTEsCisJCQkJCSAgICAgICAmY2hpcC0+cm1pZGkpKSA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIGlycSAlZCwgZG1hICVkIiwKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYyBiL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYwppbmRleCA4YzI0MTAyLi4zNzg1YjdhIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMKKysrIGIvc291bmQvaXNhL29wdGk5eHgvbWlyby5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CkBAIC0xMzc3LDggKzEzNzcsNyBAQAogCQlybWlkaSA9IE5VTEw7CiAJZWxzZSB7CiAJCWVycm9yID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAotCQkJCW1wdV9wb3J0LCAwLCBtaXJvLT5tcHVfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkJCSZybWlkaSk7CisJCQkJbXB1X3BvcnQsIDAsIG1pcm8tPm1wdV9pcnEsICZybWlkaSk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAibm8gTVBVLTQwMSBkZXZpY2UgYXQgMHglbHg/XG4iLAogCQkJCSAgIG1wdV9wb3J0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCmluZGV4IGMzNWRjNjguLjk3ODcxYmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKKysrIGIvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtODkyLDcgKzg5Miw3IEBACiAjZW5kaWYKICNpZmRlZiBPUFRpOTNYCiAJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIHNuZF9vcHRpOTN4X2ludGVycnVwdCwKLQkJCSAgICBJUlFGX0RJU0FCTEVELCBERVZfTkFNRSIgLSBXU1MiLCBjaGlwKTsKKwkJCSAgICAwLCBERVZfTkFNRSIgLSBXU1MiLCBjaGlwKTsKIAlpZiAoZXJyb3IgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIm9wdGk5eHg6IGNhbid0IGdyYWIgSVJRICVkXG4iLCBpcnEpOwogCQlyZXR1cm4gZXJyb3I7CkBAIC05MTQsNyArOTE0LDcgQEAKIAkJcm1pZGkgPSBOVUxMOwogCWVsc2UgewogCQllcnJvciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKLQkJCQltcHVfcG9ydCwgMCwgbXB1X2lycSwgSVJRRl9ESVNBQkxFRCwgJnJtaWRpKTsKKwkJCQltcHVfcG9ydCwgMCwgbXB1X2lycSwgJnJtaWRpKTsKIAkJaWYgKGVycm9yKQogCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIm5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4P1xuIiwKIAkJCQkgICBtcHVfcG9ydCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2IvZW11ODAwMC5jIGIvc291bmQvaXNhL3NiL2VtdTgwMDAuYwppbmRleCA1ZDYxZjVhLi43MTg4Nzg3IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2IvZW11ODAwMC5jCisrKyBiL3NvdW5kL2lzYS9zYi9lbXU4MDAwLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXU4MDAwLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2IvZW11ODAwMF9jYWxsYmFjay5jIGIvc291bmQvaXNhL3NiL2VtdTgwMDBfY2FsbGJhY2suYwppbmRleCA5YTNjNzFjYy4uMzQ0YjQzNSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL2VtdTgwMDBfY2FsbGJhY2suYworKysgYi9zb3VuZC9pc2Evc2IvZW11ODAwMF9jYWxsYmFjay5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImVtdTgwMDBfbG9jYWwuaCIKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL2VtdTgwMDBfcGF0Y2guYyBiL3NvdW5kL2lzYS9zYi9lbXU4MDAwX3BhdGNoLmMKaW5kZXggYzk5YzYwNy4uZTA5ZjE0NCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL2VtdTgwMDBfcGF0Y2guYworKysgYi9zb3VuZC9pc2Evc2IvZW11ODAwMF9wYXRjaC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiZW11ODAwMF9sb2NhbC5oIgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiBzdGF0aWMgaW50IGVtdTgwMDBfcmVzZXRfYWRkcjsKIG1vZHVsZV9wYXJhbShlbXU4MDAwX3Jlc2V0X2FkZHIsIGludCwgMDQ0NCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2IvZW11ODAwMF9zeW50aC5jIGIvc291bmQvaXNhL3NiL2VtdTgwMDBfc3ludGguYwppbmRleCAwYzc5MDVjLi40ZTNmY2ZiIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2IvZW11ODAwMF9zeW50aC5jCisrKyBiL3NvdW5kL2lzYS9zYi9lbXU4MDAwX3N5bnRoLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgImVtdTgwMDBfbG9jYWwuaCIKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCiBNT0RVTEVfQVVUSE9SKCJUYWthc2hpIEl3YWksIFN0ZXZlIFJhdGNsaWZmZSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL2phenoxNi5jIGIvc291bmQvaXNhL3NiL2phenoxNi5jCmluZGV4IDhjY2JjZGQuLjU0ZTNjMmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9qYXp6MTYuYworKysgYi9zb3VuZC9pc2Evc2IvamF6ejE2LmMKQEAgLTMyMiw3ICszMjIsNiBAQAogCQkJCQlNUFU0MDFfSFdfTVBVNDAxLAogCQkJCQltcHVfcG9ydFtkZXZdLCAwLAogCQkJCQltcHVfaXJxW2Rldl0sCi0JCQkJCW1wdV9pcnFbZGV2XSA+PSAwID8gSVJRRl9ESVNBQkxFRCA6IDAsCiAJCQkJCU5VTEwpIDwgMCkKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4XG4iLAogCQkJCQltcHVfcG9ydFtkZXZdKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2LmMgYi9zb3VuZC9pc2Evc2Ivc2IxNi5jCmluZGV4IDRkMWM1YTMuLjExNWM3NzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjE2LmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTYuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NiLmg+CiAjaW5jbHVkZSA8c291bmQvc2IxNl9jc3AuaD4KQEAgLTM5NCw4ICszOTQsOSBAQAogCiAJaWYgKGNoaXAtPm1wdV9wb3J0ID4gMCAmJiBjaGlwLT5tcHVfcG9ydCAhPSBTTkRSVl9BVVRPX1BPUlQpIHsKIAkJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19TQiwKLQkJCQkJICAgICAgIGNoaXAtPm1wdV9wb3J0LCAwLAotCQkJCQkgICAgICAgeGlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKQorCQkJCQkgICAgICAgY2hpcC0+bXB1X3BvcnQsCisJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JUlFfSE9PSywgLTEsCisJCQkJCSAgICAgICAmY2hpcC0+cm1pZGkpKSA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQljaGlwLT5ybWlkaV9jYWxsYmFjayA9IHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQ7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMgYi9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYwppbmRleCBiZGM4ZGRlLi5jMWFhMjFlIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYworKysgYi9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2X21haW4uYyBiL3NvdW5kL2lzYS9zYi9zYjE2X21haW4uYwppbmRleCAyYTZjYzFjLi4wYmJjZDQ3IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2IxNl9tYWluLmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTZfbWFpbi5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NiLmg+CiAjaW5jbHVkZSA8c291bmQvc2IxNl9jc3AuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjguYyBiL3NvdW5kL2lzYS9zYi9zYjguYwppbmRleCAyMjU5ZTNmLi40NTNlZjI4IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2I4LmMKKysrIGIvc291bmQvaXNhL3NiL3NiOC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvc2IuaD4KICNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2Ivc2I4X21haW4uYyBiL3NvdW5kL2lzYS9zYi9zYjhfbWFpbi5jCmluZGV4IDdkODRjOWYuLjI0ZDQxMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjhfbWFpbi5jCisrKyBiL3NvdW5kL2lzYS9zYi9zYjhfbWFpbi5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NiLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYl9jb21tb24uYyBiL3NvdW5kL2lzYS9zYi9zYl9jb21tb24uYwppbmRleCBlYWU2YzFjLi4zZWY5OTA2IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2JfY29tbW9uLmMKKysrIGIvc291bmQvaXNhL3NiL3NiX2NvbW1vbi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9zYi5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KQEAgLTI0MCw3ICsyNDEsNyBAQAogCWlmIChyZXF1ZXN0X2lycShpcnEsIGlycV9oYW5kbGVyLAogCQkJKGhhcmR3YXJlID09IFNCX0hXX0FMUzQwMDAgfHwKIAkJCSBoYXJkd2FyZSA9PSBTQl9IV19DUzU1MzApID8KLQkJCUlSUUZfU0hBUkVEIDogSVJRRl9ESVNBQkxFRCwKKwkJCUlSUUZfU0hBUkVEIDogMCwKIAkJCSJTb3VuZEJsYXN0ZXIiLCAodm9pZCAqKSBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzYjogY2FuJ3QgZ3JhYiBpcnEgJWRcbiIsIGlycSk7CiAJCXNuZF9zYmRzcF9mcmVlKGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NjNjAwMC5jIGIvc291bmQvaXNhL3NjNjAwMC5jCmluZGV4IDlhOGJiZjYuLjIwN2MxNjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYzYwMDAuYworKysgYi9zb3VuZC9pc2Evc2M2MDAwLmMKQEAgLTY1OCw4ICs2NTgsNyBAQAogCQlpZiAoc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLAogCQkJCQlNUFU0MDFfSFdfTVBVNDAxLAogCQkJCQltcHVfcG9ydFtkZXZdLCAwLAotCQkJCQltcHVfaXJxW2Rldl0sIElSUUZfRElTQUJMRUQsCi0JCQkJCU5VTEwpIDwgMCkKKwkJCQkJbXB1X2lycVtkZXZdLCBOVUxMKSA8IDApCiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJubyBNUFUtNDAxIGRldmljZSBhdCAweCVseCA/XG4iLAogCQkJCQltcHVfcG9ydFtkZXZdKTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc3NjYXBlLmMgYi9zb3VuZC9pc2Evc3NjYXBlLmMKaW5kZXggZTJkNWQyZC4uYjRhNmFhOSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NzY2FwZS5jCisrKyBiL3NvdW5kL2lzYS9zc2NhcGUuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvd3NzLmg+CkBAIC04MjUsOCArODI1LDcgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCBkZXZudW0sIE1QVTQwMV9IV19NUFU0MDEsIHBvcnQsCi0JCQkJICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELCBpcnEsIElSUUZfRElTQUJMRUQsCi0JCQkJICAmcmF3bWlkaSk7CisJCQkJICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELCBpcnEsICZyYXdtaWRpKTsKIAlpZiAoZXJyID09IDApIHsKIAkJc3RydWN0IHNuZF9tcHU0MDEgKm1wdSA9IHJhd21pZGktPnByaXZhdGVfZGF0YTsKIAkJbXB1LT5vcGVuX2lucHV0ID0gbXB1NDAxX29wZW47CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYwppbmRleCA3MTE2NzBlLi4xNTBiOTZiIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCisrKyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvb3BsMy5oPgpAQCAtNDE4LDcgKzQxOCw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWlmIChyZXF1ZXN0X2lycShpY3MyMTE1X2lycVtkZXZdLCBzbmRfd2F2ZWZyb250X2ljczIxMTVfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCwgIklDUzIxMTUiLCBhY2FyZCkpIHsKKwkJCTAsICJJQ1MyMTE1IiwgYWNhcmQpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byB1c2UgSUNTMjExNSBJUlEgJWRcbiIsIGljczIxMTVfaXJxW2Rldl0pOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTQ0OSw4ICs0NDksNyBAQAogCWlmIChjczQyMzJfbXB1X3BvcnRbZGV2XSA+IDAgJiYgY3M0MjMyX21wdV9wb3J0W2Rldl0gIT0gU05EUlZfQVVUT19QT1JUKSB7CiAJCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgbWlkaV9kZXYsIE1QVTQwMV9IV19DUzQyMzIsCiAJCQkJCSAgY3M0MjMyX21wdV9wb3J0W2Rldl0sIDAsCi0JCQkJCSAgY3M0MjMyX21wdV9pcnFbZGV2XSwgSVJRRl9ESVNBQkxFRCwKLQkJCQkJICBOVUxMKTsKKwkJCQkJICBjczQyMzJfbXB1X2lycVtkZXZdLCBOVUxMKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9wcmludGsgKEtFUk5fRVJSICJjYW4ndCBhbGxvY2F0ZSBDUzQyMzIgTVBVLTQwMSBkZXZpY2VcbiIpOwogCQkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9meC5jCmluZGV4IDY1N2UyZDYuLmU1MWUwOTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfZnguYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NuZF93YXZlZnJvbnQuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X3N5bnRoLmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9zeW50aC5jCmluZGV4IDRmYjdiMTkuLjQwNWY4YjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X3N5bnRoLmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfc3ludGguYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NuZF93YXZlZnJvbnQuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd3NzL3dzc19saWIuYyBiL3NvdW5kL2lzYS93c3Mvd3NzX2xpYi5jCmluZGV4IDJhNDJjYzMuLjQ5YzhhMGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93c3Mvd3NzX2xpYi5jCisrKyBiL3NvdW5kL2lzYS93c3Mvd3NzX2xpYi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0xODMzLDcgKzE4MzQsNyBAQAogCX0KIAljaGlwLT5jcG9ydCA9IGNwb3J0OwogCWlmICghKGh3c2hhcmUgJiBXU1NfSFdTSEFSRV9JUlEpKQotCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfd3NzX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwkJaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX3dzc19pbnRlcnJ1cHQsIDAsCiAJCQkJIldTUyIsICh2b2lkICopIGNoaXApKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ3c3M6IGNhbid0IGdyYWIgSVJRICVkXG4iLCBpcnEpOwogCQkJc25kX3dzc19mcmVlKGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9LY29uZmlnIGIvc291bmQvbWlwcy9LY29uZmlnCmluZGV4IGE5ODIzZmEuLmQyZjYxNWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL21pcHMvS2NvbmZpZworKysgYi9zb3VuZC9taXBzL0tjb25maWcKQEAgLTIzLDEyICsyMywxNSBAQAogCiAKIGNvbmZpZyBTTkRfQVUxWDAwCi0JdHJpc3RhdGUgIkF1MXgwMCBBQzk3IFBvcnQgRHJpdmVyIgotCWRlcGVuZHMgb24gU09DX0FVMTAwMCB8fCBTT0NfQVUxMTAwIHx8IFNPQ19BVTE1MDAKKwl0cmlzdGF0ZSAiQXUxeDAwIEFDOTcgUG9ydCBEcml2ZXIgKERFUFJFQ0FURUQpIgorCWRlcGVuZHMgb24gTUlQU19BTENIRU1ZCiAJc2VsZWN0IFNORF9QQ00KIAlzZWxlY3QgU05EX0FDOTdfQ09ERUMKIAloZWxwCiAJICBBTFNBIFNvdW5kIGRyaXZlciBmb3IgdGhlIEF1MXgwMCdzIEFDOTcgcG9ydC4KIAorCSAgTmV3ZXIgZHJpdmVycyBmb3IgQVNvQyBhcmUgYXZhaWxhYmxlLCBwbGVhc2UgZG8gbm90IHVzZQorCSAgdGhpcyBkcml2ZXIgYXMgaXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisKIGVuZGlmCSMgU05EX01JUFMKIApkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9hdTF4MDAuYyBiL3NvdW5kL21pcHMvYXUxeDAwLmMKaW5kZXggNDQ2Y2Y5Ny4uM2YzZWMwYiAxMDA2NDQKLS0tIGEvc291bmQvbWlwcy9hdTF4MDAuYworKysgYi9zb3VuZC9taXBzL2F1MXgwMC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtNDY1LDEzICs0NjYsMTMgQEAKIAogCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKIAlpZiAoKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gcmVxdWVzdF9hdTEwMDBfZG1hKERNQV9JRF9BQzk3Q19UWCwKLQkJCSJBQzk3IFRYIiwgYXUxMDAwX2RtYV9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJCQkiQUM5NyBUWCIsIGF1MTAwMF9kbWFfaW50ZXJydXB0LCAwLAogCQkJYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKSkgPCAwKSB7CiAJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlpZiAoKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEgPSByZXF1ZXN0X2F1MTAwMF9kbWEoRE1BX0lEX0FDOTdDX1JYLAotCQkJIkFDOTcgUlgiLCBhdTEwMDBfZG1hX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwkJCSJBQzk3IFJYIiwgYXUxMDAwX2RtYV9pbnRlcnJ1cHQsIDAsCiAJCQlhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSkpIDwgMCl7CiAJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9oYWwyLmMgYi9zb3VuZC9taXBzL2hhbDIuYwppbmRleCA0NTNkMzQzLi4yZTZjODU4IDEwMDY0NAotLS0gYS9zb3VuZC9taXBzL2hhbDIuYworKysgYi9zb3VuZC9taXBzL2hhbDIuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3NnaS9ocGMzLmg+CiAjaW5jbHVkZSA8YXNtL3NnaS9pcDIyLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYyBiL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCmluZGV4IDcxNzYwNGMuLjY5NDI1ZDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCisrKyBiL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaXAzMi9pcDMyX2ludHMuaD4KICNpbmNsdWRlIDxhc20vaXAzMi9tYWNlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc291bmRfdGltZXIuYyBiL3NvdW5kL29zcy9zb3VuZF90aW1lci5jCmluZGV4IDQ4Y2RhNmMuLjgwMjFjODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zb3VuZF90aW1lci5jCisrKyBiL3NvdW5kL29zcy9zb3VuZF90aW1lci5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAluID0gc291bmRfYWxsb2NfdGltZXJkZXYoKTsKIAlpZiAobiA9PSAtMSkKIAkJbiA9IDA7CQkvKiBPdmVyd3JpdGUgdGhlIHN5c3RlbSB0aW1lciAqLwotCXN0cmNweShzb3VuZF90aW1lci5pbmZvLm5hbWUsIG5hbWUpOworCXN0cmxjcHkoc291bmRfdGltZXIuaW5mby5uYW1lLCBuYW1lLCBzaXplb2Yoc291bmRfdGltZXIuaW5mby5uYW1lKSk7CiAJc291bmRfdGltZXJfZGV2c1tuXSA9ICZzb3VuZF90aW1lcjsKIH0KIEVYUE9SVF9TWU1CT0woc291bmRfdGltZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKaW5kZXggN2Y0ZDYxOS4uZmFjNTFlZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BjbS5jCmluZGV4IDQ4Y2JkYTkuLmYxNDg4ZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wY20uYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hZDE4ODkuYyBiL3NvdW5kL3BjaS9hZDE4ODkuYwppbmRleCAyMDE1MDM2Li42ZTMxMTE4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWQxODg5LmMKKysrIGIvc291bmQvcGNpL2FkMTg4OS5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FrNDUzMV9jb2RlYy5jIGIvc291bmQvcGNpL2FrNDUzMV9jb2RlYy5jCmluZGV4IGZkMTM1ZTMuLmNhZGY3YjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hazQ1MzFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvYWs0NTMxX2NvZGVjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvYWs0NTMxX2NvZGVjLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMgYi9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKaW5kZXggYjQ0NGI3NC4uZWY4NWFjNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCisrKyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbHMzMDAuYyBiL3NvdW5kL3BjaS9hbHMzMDAuYwppbmRleCA3MzZjOGU5Li44ZGM3N2EwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzMzAwLmMKKysrIGIvc291bmQvcGNpL2FsczMwMC5jCkBAIC0zMiw3ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzNDAwMC5jIGIvc291bmQvcGNpL2FsczQwMDAuYwppbmRleCBhOWMxYWYzLi4yOGVmNDBlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzNDAwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKQEAgLTY5LDcgKzY5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtOTMxLDggKzkzMSw5IEBACiAKIAlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoIGNhcmQsIDAsIE1QVTQwMV9IV19BTFM0MDAwLAogCQkJCQlpb2Jhc2UgKyBBTFM0S19JT0JfMzBfTUlESV9EQVRBLAotCQkJCQlNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCQlwY2ktPmlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CisJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAorCQkJCQlNUFU0MDFfSU5GT19JUlFfSE9PSywKKwkJCQkJLTEsICZjaGlwLT5ybWlkaSkpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IG5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4P1xuIiwKIAkJCQlpb2Jhc2UgKyBBTFM0S19JT0JfMzBfTUlESV9EQVRBKTsKIAkJZ290byBvdXRfZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYyBiL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKaW5kZXggZWFlNjJlYi4uZjRiOWUyYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvaHBpb2N0bC5jIGIvc291bmQvcGNpL2FzaWhwaS9ocGlvY3RsLmMKaW5kZXggYTMyNTAyZS4uZjZiOTUxNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9ocGlvY3RsLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9ocGlvY3RsLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaWZkZWYgTU9EVUxFX0ZJUk1XQVJFCiBNT0RVTEVfRklSTVdBUkUoImFzaWhwaS9kc3A1MDAwLmJpbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cC5jIGIvc291bmQvcGNpL2F0aWl4cC5jCmluZGV4IDUzN2UwYTIuLjE1ZTRlNWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHAuYworKysgYi9zb3VuZC9wY2kvYXRpaXhwLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKaW5kZXggNDVkZjI3NS4uNTdiZjhmNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jCmluZGV4IGEzODQ2OTkuLmRjMzI2YmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9nYW1lLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9nYW1lLmMKaW5kZXggZTI5MWFhNS4uYzA3Yzc5MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfZ2FtZS5jCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2dhbWUuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJhdTg4eDAuaCIKICNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfbXB1NDAxLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9tcHU0MDEuYwppbmRleCAwZGM4ZDI1Li5lNmM2YTBmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9tcHU0MDEuYworKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9tcHU0MDEuYwpAQCAtODQsNyArODQsNyBAQAogI2lmZGVmIFZPUlRFWF9NUFU0MDFfTEVHQUNZCiAJaWYgKCh0ZW1wID0KIAkgICAgIHNuZF9tcHU0MDFfdWFydF9uZXcodm9ydGV4LT5jYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLCAweDMzMCwKLQkJCQkgMCwgMCwgMCwgJnJtaWRpKSkgIT0gMCkgeworCQkJCSBNUFU0MDFfSU5GT19JUlFfSE9PSywgLTEsICZybWlkaSkpICE9IDApIHsKIAkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMLAogCQkJKGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMKSAmCiAJCQkgfkNUUkxfTUlESV9QT1JUKSAmIH5DVFJMX01JRElfRU4pOwpAQCAtOTQsOCArOTQsOCBAQAogCXBvcnQgPSAodW5zaWduZWQgbG9uZykodm9ydGV4LT5tbWlvICsgVk9SVEVYX01JRElfREFUQSk7CiAJaWYgKCh0ZW1wID0KIAkgICAgIHNuZF9tcHU0MDFfdWFydF9uZXcodm9ydGV4LT5jYXJkLCAwLCBNUFU0MDFfSFdfQVVSRUFMLCBwb3J0LAotCQkJCSBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwgTVBVNDAxX0lORk9fTU1JTywKLQkJCQkgMCwgMCwgJnJtaWRpKSkgIT0gMCkgeworCQkJCSBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwgTVBVNDAxX0lORk9fTU1JTyB8CisJCQkJIE1QVTQwMV9JTkZPX0lSUV9IT09LLCAtMSwgJnJtaWRpKSkgIT0gMCkgewogCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwsCiAJCQkoaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwpICYKIAkJCSB+Q1RSTF9NSURJX1BPUlQpICYgfkNUUkxfTUlESV9FTik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMgYi9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMKaW5kZXggZjg1NjliMS4uN2E1ODExNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jCisrKyBiL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguYyBiL3NvdW5kL3BjaS9henQzMzI4LmMKaW5kZXggNTc5ZmMwZGNlLi5iYzFlNjgzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXp0MzMyOC5jCisrKyBiL3NvdW5kL3BjaS9henQzMzI4LmMKQEAgLTE4Niw3ICsxODYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CkBAIC0yNjUyLDggKzI2NTIsOSBAQAogCSAgIHNpbmNlIG91ciBoYXJkd2FyZSBvdWdodCB0byBiZSBzaW1pbGFyLCB0aHVzIHVzZSBzYW1lIElELiAqLwogCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoCiAJCWNhcmQsIDAsCi0JCU1QVTQwMV9IV19BWlQyMzIwLCBjaGlwLT5tcHVfaW8sIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQsCi0JCXBjaS0+aXJxLCAwLCAmY2hpcC0+cm1pZGkKKwkJTVBVNDAxX0hXX0FaVDIzMjAsIGNoaXAtPm1wdV9pbywKKwkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQktMSwgJmNoaXAtPnJtaWRpCiAJKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhemYzMzI4OiBubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYnQ4N3guYyBiL3NvdW5kL3BjaS9idDg3eC5jCmluZGV4IDM5MTgwMzMuLmMxYzJkMGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9idDg3eC5jCisrKyBiL3NvdW5kL3BjaS9idDg3eC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCmluZGV4IDA2MWI3ZTYuLmZlOTlmZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCA5Y2Y5OWZiLi45NTRjOTkzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CkBAIC0zMjI4LDggKzMyMjgsOSBAQAogCQlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX0NNSVBDSSwKIAkJCQkJICAgICAgIGlvbWlkaSwKIAkJCQkJICAgICAgIChpbnRlZ3JhdGVkX21pZGkgPwotCQkJCQkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCA6IDApLAotCQkJCQkgICAgICAgY20tPmlycSwgMCwgJmNtLT5ybWlkaSkpIDwgMCkgeworCQkJCQkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCA6IDApIHwKKwkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQkJCQkgICAgICAgLTEsICZjbS0+cm1pZGkpKSA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBubyBVQVJUNDAxIGRldmljZSBhdCAweCVseFxuIiwgaW9taWRpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQyODEuYyBiL3NvdW5kL3BjaS9jczQyODEuYwppbmRleCAwN2YwNGUzLi5hNmM2YzVjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0MjgxLmMKKysrIGIvc291bmQvcGNpL2NzNDI4MS5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMKaW5kZXggMWFmOTU1NS4uYTRlY2I0MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jczQ2eHguaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCmluZGV4IDk1NDZiZjAuLjRmYTUzMTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCkBAIC01Myw2ICs1Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzMC5jIGIvc291bmQvcGNpL2NzNTUzMC5jCmluZGV4IGE0NjY5MzQuLjk1OGY0OTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzAuYworKysgYi9zb3VuZC9wY2kvY3M1NTMwLmMKQEAgLTM3LDcgKzM3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jCmluZGV4IDEwZDIyZWQuLmI4OTU5ZDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RwY20uYyBiL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jCmluZGV4IDQ1N2QyMTEuLjJjODYyMjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jCkBAIC00MDQsNyArNDA0LDcgQEAKIAlpbnQgZXJyOwogCWludCBwbGF5YmFja19jb3VudCwgY2FwdHVyZV9jb3VudDsKIAotCXBsYXliYWNrX2NvdW50ID0gKElFQzk1OCA9PSBkZXZpY2UpID8gMSA6IDg7CisJcGxheWJhY2tfY291bnQgPSAoSUVDOTU4ID09IGRldmljZSkgPyAxIDogMjU2OwogCWNhcHR1cmVfY291bnQgPSAoRlJPTlQgPT0gZGV2aWNlKSA/IDEgOiAwOwogCWVyciA9IHNuZF9wY21fbmV3KGF0Yy0+Y2FyZCwgImN0eGZpIiwgZGV2aWNlLAogCQkJICBwbGF5YmFja19jb3VudCwgY2FwdHVyZV9jb3VudCwgJnBjbSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RzcmMuYyBiL3NvdW5kL3BjaS9jdHhmaS9jdHNyYy5jCmluZGV4IGM3NDlmYTcuLmUxMzRiM2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdHNyYy5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdHNyYy5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSAiY3RoYXJkd2FyZS5oIgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2RlZmluZSBTUkNfUkVTT1VSQ0VfTlVNCTY0CisjZGVmaW5lIFNSQ19SRVNPVVJDRV9OVU0JMjU2CiAjZGVmaW5lIFNSQ0lNUF9SRVNPVVJDRV9OVU0JMjU2CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY29ual9tYXNrOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL2N0dm1lbS5oIGIvc291bmQvcGNpL2N0eGZpL2N0dm1lbS5oCmluZGV4IGIyM2FkZmMuLmU2ZGE2MGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdHZtZW0uaAorKysgYi9zb3VuZC9wY2kvY3R4ZmkvY3R2bWVtLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpZm5kZWYgQ1RWTUVNX0gKICNkZWZpbmUgQ1RWTUVNX0gKIAotI2RlZmluZSBDVF9QVFBfTlVNCTEJLyogbnVtIG9mIGRldmljZSBwYWdlIHRhYmxlIHBhZ2VzICovCisjZGVmaW5lIENUX1BUUF9OVU0JNAkvKiBudW0gb2YgZGV2aWNlIHBhZ2UgdGFibGUgcGFnZXMgKi8KIAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL3hmaS5jIGIvc291bmQvcGNpL2N0eGZpL3hmaS5jCmluZGV4IGIyNTlhYTAuLjMzOTMxZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS94ZmkuYworKysgYi9zb3VuZC9wY2kvY3R4ZmkveGZpLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgImN0YXRjLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjAuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jCmluZGV4IDQzYzdlMTIuLmQ0N2U3MmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jCkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTI0LmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYwppbmRleCA5NWIwMzMwLi40MTNhY2Y3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYwpAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG8zZy5jCmluZGV4IDg3MjNjNDAuLjFlYzRlZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2cuYwpAQCAtNTEsNyArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCmluZGV4IGQ3MzA2OTguLjlmZDY5NGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYwpAQCAtMTYsNiArMTYsOCBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiBNT0RVTEVfQVVUSE9SKCJHaXVsaWFubyBQb2NoaW5pIDxwb2NoaW5pQHNoaW55Lml0PiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJFY2hvYXVkaW8gIiBFQ0hPQ0FSRF9OQU1FICIgc291bmRjYXJkcyBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyMC5jCmluZGV4IDAwNThjNjcuLjAzOTEyNWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjAuYwpAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTI0LmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyNC5jCmluZGV4IDE0ZTQ5MjUuLjVlOTY2ZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTI0LmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjQuYwpAQCAtNTAsNyArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnby5jCmluZGV4IGY0MTZiMTUuLmMxNjZiN2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ28uYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGouYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGouYwppbmRleCBlNTk0YTNiLi5hM2VmM2I5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kai5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kanguYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGp4LmMKaW5kZXggZjBkMDBiZi4uZjUxNjQ0NCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kanguYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqeC5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW8uYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW8uYwppbmRleCAxYWYwMDM3Li5jMjJjODJmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pby5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pb3guYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW94LmMKaW5kZXggMGI1MTE2My4uODZjZjJkMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pb3guYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lveC5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyMC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKaW5kZXggM2Y2M2FiOC4uNmEwMjdmMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjQuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jCmluZGV4IDI4MzEzNzIuLjk2YTU5OTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jCkBAIC01MSw3ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhLmMKaW5kZXggZWRkYWViNC4uYjhjZTI3ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21pYS5jCkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9tb25hLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYwppbmRleCAwMzY0MDExLi4xMjgzYmZiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYwpAQCAtNDgsNyArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYwppbmRleCBhOWM0NWQyLi5lYWExOThlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jCmluZGV4IDdlZjk0OWQ5Li5hMGFmYTUwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJlbXUxMGsxX3N5bnRoX2xvY2FsLmgiCiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYwppbmRleCBmY2Q0OTM1Li42YTNlNTY3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoLmMKaW5kZXggYWQ3YjcxNC4uNGM0MWM5MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9zeW50aC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfc3ludGguYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiZW11MTBrMV9zeW50aF9sb2NhbC5oIgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBJd2FpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlJvdXRpbmVzIGZvciBjb250cm9sIG9mIEVNVTEwSzEgV2F2ZVRhYmxlIHN5bnRoIik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwppbmRleCBkNGZkZTFiLi4yMjI4YmU5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCmluZGV4IDYyMmJhY2UuLmUyMmI4ZTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCkBAIC0xMTQ2LDYgKzExNDYsMTEgQEAKIAkJa2ZyZWUoZXBjbSk7CiAJCXJldHVybiBlcnI7CiAJfQorCWVyciA9IHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlKHJ1bnRpbWUsIDQ4MDAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZShlcGNtKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAJbWl4ID0gJmVtdS0+cGNtX21peGVyW3N1YnN0cmVhbS0+bnVtYmVyXTsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQltaXgtPnNlbmRfcm91dGluZ1swXVtpXSA9IG1peC0+c2VuZF9yb3V0aW5nWzFdW2ldID0gbWl4LT5zZW5kX3JvdXRpbmdbMl1baV0gPSBpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvaW8uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMKaW5kZXggNWVmNzA4MC4uZTRmYmE0OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvaW8uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9pby5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2VtdTEwazEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgInAxN3YuaCIKIAogdW5zaWduZWQgaW50IHNuZF9lbXUxMGsxX3B0cl9yZWFkKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IGNobikKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL21lbW9yeS5jIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKaW5kZXggYzI1MDYxNC4uNGY1MDJhMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jIGIvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYwppbmRleCAyMGI4ZGEyLi4xMDFlN2NiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKQEAgLTI5LDYgKzI5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbnMxMzcwLmMgYi9zb3VuZC9wY2kvZW5zMTM3MC5jCmluZGV4IGYwMmUyZjguLmQwODVhZDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbnMxMzcwLmMKKysrIGIvc291bmQvcGNpL2VuczEzNzAuYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5MzguYyBiL3NvdW5kL3BjaS9lczE5MzguYwppbmRleCAyNmE1YTJmLi4wNGNjMjFmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTM4LmMKKysrIGIvc291bmQvcGNpL2VzMTkzOC5jCkBAIC01Miw3ICs1Miw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtMTg1NCw4ICsxODU0LDkgQEAKIAkJfQogCX0KIAlpZiAoc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAotCQkJCWNoaXAtPm1wdV9wb3J0LCBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCWNoaXAtPmlycSwgMCwgJmNoaXAtPnJtaWRpKSA8IDApIHsKKwkJCQljaGlwLT5tcHVfcG9ydCwKKwkJCQlNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJLTEsICZjaGlwLT5ybWlkaSkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZXMxOTM4OiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBNUFUtNDAxXG4iKTsKIAl9IGVsc2UgewogCQkvLyB0aGlzIGxpbmUgaXMgdml0YWwgZm9yIE1JREkgaW50ZXJydXB0IGhhbmRsaW5nIG9uIGVzcy1zb2xvMQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTk2OC5jIGIvc291bmQvcGNpL2VzMTk2OC5jCmluZGV4IDk5ZWE5MzIuLjI5N2ExNTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lczE5NjguYworKysgYi9zb3VuZC9wY2kvZXMxOTY4LmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAKQEAgLTI4NDMsOCArMjg0Myw5IEBACiAJaWYgKGVuYWJsZV9tcHVbZGV2XSkgewogCQlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKIAkJCQkJICAgICAgIGNoaXAtPmlvX3BvcnQgKyBFU01fTVBVNDAxX1BPUlQsCi0JCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCQkgICAgICAgY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpKSA8IDApIHsKKwkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAorCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJCSAgICAgICAtMSwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJlczE5Njg6IHNraXBwaW5nIE1QVS00MDEgTUlESSBzdXBwb3J0Li5cbiIpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ZtODAxLmMgYi9zb3VuZC9wY2kvZm04MDEuYwppbmRleCAzMmIwMmQ5Li5lYzA1ZWY1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZm04MDEuYworKysgYi9zb3VuZC9wY2kvZm04MDEuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KQEAgLTcyOSwxMSArNzI5LDE0IEBACiAJeyAuZGF0YSA9IDIsIC5jbGsgPSAwLCAud3JlbiA9IDEsIC5tb3N0ID0gMywgLm5hbWUgPSAiU0Y2NC1QQ1IiIH0sCiB9OwogCisjZGVmaW5lIGdldF90ZWE1NzV4X2dwaW8oY2hpcCkgXAorCSgmc25kX2ZtODAxX3RlYTU3NXhfZ3Bpb3NbKChjaGlwKS0+dGVhNTc1eF90dW5lciAmIFRVTkVSX1RZUEVfTUFTSykgLSAxXSkKKwogc3RhdGljIHZvaWQgc25kX2ZtODAxX3RlYTU3NXhfc2V0X3BpbnMoc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEsIHU4IHBpbnMpCiB7CiAJc3RydWN0IGZtODAxICpjaGlwID0gdGVhLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgc2hvcnQgcmVnID0gaW53KEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKLQlzdHJ1Y3Qgc25kX2ZtODAxX3RlYTU3NXhfZ3BpbyBncGlvID0gc25kX2ZtODAxX3RlYTU3NXhfZ3Bpb3NbKGNoaXAtPnRlYTU3NXhfdHVuZXIgJiBUVU5FUl9UWVBFX01BU0spIC0gMV07CisJc3RydWN0IHNuZF9mbTgwMV90ZWE1NzV4X2dwaW8gZ3BpbyA9ICpnZXRfdGVhNTc1eF9ncGlvKGNoaXApOwogCiAJcmVnICY9IH4oRk04MDFfR1BJT19HUChncGlvLmRhdGEpIHwKIAkJIEZNODAxX0dQSU9fR1AoZ3Bpby5jbGspIHwKQEAgLTc1MSw3ICs3NTQsNyBAQAogewogCXN0cnVjdCBmbTgwMSAqY2hpcCA9IHRlYS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIHNob3J0IHJlZyA9IGludyhGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7Ci0Jc3RydWN0IHNuZF9mbTgwMV90ZWE1NzV4X2dwaW8gZ3BpbyA9IHNuZF9mbTgwMV90ZWE1NzV4X2dwaW9zWyhjaGlwLT50ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSAtIDFdOworCXN0cnVjdCBzbmRfZm04MDFfdGVhNTc1eF9ncGlvIGdwaW8gPSAqZ2V0X3RlYTU3NXhfZ3BpbyhjaGlwKTsKIAogCXJldHVybiAgKHJlZyAmIEZNODAxX0dQSU9fR1AoZ3Bpby5kYXRhKSkgPyBURUE1NzVYX0RBVEEgOiAwIHwKIAkJKHJlZyAmIEZNODAxX0dQSU9fR1AoZ3Bpby5tb3N0KSkgPyBURUE1NzVYX01PU1QgOiAwOwpAQCAtNzYxLDcgKzc2NCw3IEBACiB7CiAJc3RydWN0IGZtODAxICpjaGlwID0gdGVhLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgc2hvcnQgcmVnID0gaW53KEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKLQlzdHJ1Y3Qgc25kX2ZtODAxX3RlYTU3NXhfZ3BpbyBncGlvID0gc25kX2ZtODAxX3RlYTU3NXhfZ3Bpb3NbKGNoaXAtPnRlYTU3NXhfdHVuZXIgJiBUVU5FUl9UWVBFX01BU0spIC0gMV07CisJc3RydWN0IHNuZF9mbTgwMV90ZWE1NzV4X2dwaW8gZ3BpbyA9ICpnZXRfdGVhNTc1eF9ncGlvKGNoaXApOwogCiAJLyogdXNlIEdQSU8gbGluZXMgYW5kIHNldCB3cml0ZSBlbmFibGUgYml0ICovCiAJcmVnIHw9IEZNODAxX0dQSU9fR1MoZ3Bpby5kYXRhKSB8CkBAIC0xMjQ2LDcgKzEyNDksNyBAQAogCQkJY2hpcC0+dGVhNTc1eF90dW5lciA9IHRlYTU3NXhfdHVuZXI7CiAJCQlpZiAoIXNuZF90ZWE1NzV4X2luaXQoJmNoaXAtPnRlYSkpIHsKIAkJCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZGV0ZWN0ZWQgVEVBNTc1eCByYWRpbyB0eXBlICVzXG4iLAotCQkJCQlzbmRfZm04MDFfdGVhNTc1eF9ncGlvc1t0ZWE1NzV4X3R1bmVyIC0gMV0ubmFtZSk7CisJCQkJCSAgIGdldF90ZWE1NzV4X2dwaW8oY2hpcCktPm5hbWUpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0xMjU2LDkgKzEyNTksNyBAQAogCQl9CiAJfQogCWlmICghKGNoaXAtPnRlYTU3NXhfdHVuZXIgJiBUVU5FUl9ESVNBQkxFRCkpIHsKLQkJc3RybGNweShjaGlwLT50ZWEuY2FyZCwKLQkJCXNuZF9mbTgwMV90ZWE1NzV4X2dwaW9zWyh0ZWE1NzV4X3R1bmVyICYKLQkJCQkJCSBUVU5FUl9UWVBFX01BU0spIC0gMV0ubmFtZSwKKwkJc3RybGNweShjaGlwLT50ZWEuY2FyZCwgZ2V0X3RlYTU3NXhfZ3BpbyhjaGlwKS0+bmFtZSwKIAkJCXNpemVvZihjaGlwLT50ZWEuY2FyZCkpOwogCX0KICNlbmRpZgpAQCAtMTMxMSw4ICsxMzEyLDkgQEAKIAl9CiAJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19GTTgwMSwKIAkJCQkgICAgICAgRk04MDFfUkVHKGNoaXAsIE1QVTQwMV9EQVRBKSwKLQkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKLQkJCQkgICAgICAgY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpKSA8IDApIHsKKwkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8CisJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQkJCSAgICAgICAtMSwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZSBiL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKaW5kZXggODczNjVkNS4uZjkyOGQ2NiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZQorKysgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCkBAIC02LDYgKzYsOSBAQAogc25kLWhkYS1jb2RlYy0kKENPTkZJR19TTkRfSERBX0hXREVQKSArPSBoZGFfaHdkZXAubwogc25kLWhkYS1jb2RlYy0kKENPTkZJR19TTkRfSERBX0lOUFVUX0JFRVApICs9IGhkYV9iZWVwLm8KIAorIyBmb3IgdHJhY2UtcG9pbnRzCitDRkxBR1NfaGRhX2NvZGVjLm8gOj0gLUkkKHNyYykKKwogc25kLWhkYS1jb2RlYy1yZWFsdGVrLW9ianMgOj0JcGF0Y2hfcmVhbHRlay5vCiBzbmQtaGRhLWNvZGVjLWNtZWRpYS1vYmpzIDo9CXBhdGNoX2NtZWRpYS5vCiBzbmQtaGRhLWNvZGVjLWFuYWxvZy1vYmpzIDo9CXBhdGNoX2FuYWxvZy5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2FsYzI2MF9xdWlya3MuYyBiL3NvdW5kL3BjaS9oZGEvYWxjMjYwX3F1aXJrcy5jCmluZGV4IDIxZWMyY2IuLjNiNTE3MGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvYWxjMjYwX3F1aXJrcy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjMjYwX3F1aXJrcy5jCkBAIC03LDkgKzcsNiBAQAogZW51bSB7CiAJQUxDMjYwX0FVVE8sCiAJQUxDMjYwX0JBU0lDLAotCUFMQzI2MF9IUCwKLQlBTEMyNjBfSFBfREM3NjAwLAotCUFMQzI2MF9IUF8zMDEzLAogCUFMQzI2MF9GVUpJVFNVX1M3MDJYLAogCUFMQzI2MF9BQ0VSLAogCUFMQzI2MF9XSUxMLApAQCAtMTQyLDggKzEzOSw2IEBACiAvKiBNaXhlciBjb21iaW5hdGlvbnMKICAqCiAgKiBiYXNpYzogYmFzZV9vdXRwdXQgKyBpbnB1dCArIHBjX2JlZXAgKyBjYXB0dXJlCi0gKiBIUDogYmFzZV9vdXRwdXQgKyBpbnB1dCArIGNhcHR1cmVfYWx0Ci0gKiBIUF8zMDEzOiBocF8zMDEzICsgaW5wdXQgKyBjYXB0dXJlCiAgKiBmdWppdHN1OiBmdWppdHN1ICsgY2FwdHVyZQogICogYWNlcjogYWNlciArIGNhcHR1cmUKICAqLwpAQCAtMTcwLDE0NSArMTY1LDYgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCi0vKiB1cGRhdGUgSFAsIGxpbmUgYW5kIG1vbm8gb3V0IHBpbnMgYWNjb3JkaW5nIHRvIHRoZSBtYXN0ZXIgc3dpdGNoICovCi1zdGF0aWMgdm9pZCBhbGMyNjBfaHBfbWFzdGVyX3VwZGF0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1cGRhdGVfc3BlYWtlcnMoY29kZWMpOwotfQotCi1zdGF0aWMgaW50IGFsYzI2MF9ocF9tYXN0ZXJfc3dfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCSp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZSA9ICFzcGVjLT5tYXN0ZXJfbXV0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbGMyNjBfaHBfbWFzdGVyX3N3X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgdmFsID0gISp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKLQotCWlmICh2YWwgPT0gc3BlYy0+bWFzdGVyX211dGUpCi0JCXJldHVybiAwOwotCXNwZWMtPm1hc3Rlcl9tdXRlID0gdmFsOwotCWFsYzI2MF9ocF9tYXN0ZXJfdXBkYXRlKGNvZGVjKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9ocF9vdXRwdXRfbWl4ZXJbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCAweDExLAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCi0JCS5nZXQgPSBhbGMyNjBfaHBfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2MF9ocF9tYXN0ZXJfc3dfcHV0LAotCX0sCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDA4LCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDA5LCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBhLCAxLCAweDAsCi0JCQkgICAgICBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYSwgMSwgMiwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9ocF91bnNvbF92ZXJic1tdID0gewotCXsweDEwLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzI2MF9ocF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MGY7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDEwOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxMTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfaHBfMzAxM19taXhlcltdID0gewotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IDB4MTEsCi0JCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKLQkJLmdldCA9IGFsYzI2MF9ocF9tYXN0ZXJfc3dfZ2V0LAotCQkucHV0ID0gYWxjMjYwX2hwX21hc3Rlcl9zd19wdXQsCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkF1eC1JbiBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA2LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJBdXgtSW4gUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwNiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGEsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDExLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzI2MF9ocF8zMDEzX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTA7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDExOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzI2MF9kYzc2MDBfYmluZF9tYXN0ZXJfdm9sID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDgsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDksIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MGEsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGMyNjBfZGM3NjAwX2JpbmRfc3dpdGNoID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxMSwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNSwgMywgMCwgSERBX09VVFBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9ocF9kYzc2MDBfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjMjYwX2RjNzYwMF9iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJMaW5lT3V0IFBsYXliYWNrIFN3aXRjaCIsICZhbGMyNjBfZGM3NjAwX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9ocF8zMDEzX3Vuc29sX3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9LAotfTsKLQotc3RhdGljIHZvaWQgYWxjMjYwX2hwXzMwMTJfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDEwOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgwZjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTE7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLX0KLQogLyogRnVqaXRzdSBTNzAyeCBzZXJpZXMgbGFwdG9wcy4gIEFMQzI2MCBwaW4gdXNhZ2U6IE1pYy9MaW5lIGphY2sgPSAweDEyLAogICogSFAgamFjayA9IDB4MTQsIENEIGF1ZGlvID0gIDB4MTYsIGludGVybmFsIHNwZWFrZXIgPSAweDEwLgogICovCkBAIC00ODAsMTA2ICszMzYsNiBAQAogCXsgfQogfTsKIAotI2lmIDAgLyogc2hvdWxkIGJlIGlkZW50aWNhbCB3aXRoIGFsYzI2MF9pbml0X3ZlcmJzPyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfaW5pdF92ZXJic1tdID0gewotCS8qIEhlYWRwaG9uZSBhbmQgb3V0cHV0ICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCi0JLyogbW9ubyBvdXRwdXQgKi8KLQl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQkvKiBNaWMxIChyZWFyIHBhbmVsKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQkvKiBNaWMyIChmcm9udCBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCi0JLyogTGluZSBJbiBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCS8qIExpbmUtMiBwaW4gd2lkZ2V0IGZvciBvdXRwdXQgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCS8qIHVubXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwfSwKLQkvKiBzZXQgY29ubmVjdGlvbiBzZWxlY3QgdG8gbGluZSBpbiAoZGVmYXVsdCBzZWxlY3QgZm9yIHRoaXMgQURDKSAqLwotCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JLyogdW5tdXRlIExpbmUtT3V0IG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKLQkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAotCS8qIHVubXV0ZSBIUCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCi0JLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKLQkvKiBBbXAgSW5kZXhlczogQ0QgPSAweDA0LCBMaW5lIEluIDEgPSAweDAyLCBNaWMgMSA9IDB4MDAgJgotCSAqIExpbmUgSW4gMiA9IDB4MDMKLQkgKi8KLQkvKiBtdXRlIGFuYWxvZyBpbnB1dHMgKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JLyogQW1wIEluZGV4ZXM6IERBQyA9IDB4MDEgJiBtaXhlciA9IDB4MDAgKi8KLQkvKiBVbm11dGUgRnJvbnQgb3V0IHBhdGggKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCS8qIFVubXV0ZSBIZWFkcGhvbmUgb3V0IHBhdGggKi8KLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCS8qIFVubXV0ZSBNb25vIG91dCBwYXRoICovCi0JezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQl7IH0KLX07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfMzAxM19pbml0X3ZlcmJzW10gPSB7Ci0JLyogTGluZSBvdXQgYW5kIG91dHB1dCAqLwotCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCS8qIG1vbm8gb3V0cHV0ICovCi0JezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCi0JLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCi0JLyogTWljMiAoZnJvbnQgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLwotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCS8qIExpbmUgSW4gcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQkvKiBIZWFkcGhvbmUgcGluIHdpZGdldCBmb3Igb3V0cHV0ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCi0JLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQkvKiB1bm11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMH0sCi0JLyogc2V0IGNvbm5lY3Rpb24gc2VsZWN0IHRvIGxpbmUgaW4gKGRlZmF1bHQgc2VsZWN0IGZvciB0aGlzIEFEQykgKi8KLQl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAotCS8qIHVubXV0ZSBMaW5lLU91dCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCi0JLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKLQkvKiB1bm11dGUgSFAgbWl4ZXIgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLwotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAotCS8qIG11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCi0JLyogQW1wIEluZGV4ZXM6IENEID0gMHgwNCwgTGluZSBJbiAxID0gMHgwMiwgTWljIDEgPSAweDAwICYKLQkgKiBMaW5lIEluIDIgPSAweDAzCi0JICovCi0JLyogbXV0ZSBhbmFsb2cgaW5wdXRzICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCS8qIEFtcCBJbmRleGVzOiBEQUMgPSAweDAxICYgbWl4ZXIgPSAweDAwICovCi0JLyogVW5tdXRlIEZyb250IG91dCBwYXRoICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQkvKiBVbm11dGUgSGVhZHBob25lIG91dCBwYXRoICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQkvKiBVbm11dGUgTW9ubyBvdXQgcGF0aCAqLwotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCi0JeyB9Ci19OwotCiAvKiBJbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSBmb3IgQUxDMjYwIGFzIGNvbmZpZ3VyZWQgaW4gRnVqaXRzdSBTNzAyeAogICogbGFwdG9wcy4gIEFMQzI2MCBwaW4gdXNhZ2U6IE1pYy9MaW5lIGphY2sgPSAweDEyLCBIUCBqYWNrID0gMHgxNCwgQ0QKICAqIGF1ZGlvID0gMHgxNiwgaW50ZXJuYWwgc3BlYWtlciA9IDB4MTAuCkBAIC0xMDkzLDkgKzg0OSw2IEBACiAgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjMjYwX21vZGVsc1tBTEMyNjBfTU9ERUxfTEFTVF0gPSB7CiAJW0FMQzI2MF9CQVNJQ10JCT0gImJhc2ljIiwKLQlbQUxDMjYwX0hQXQkJPSAiaHAiLAotCVtBTEMyNjBfSFBfMzAxM10JPSAiaHAtMzAxMyIsCi0JW0FMQzI2MF9IUF9EQzc2MDBdCT0gImhwLWRjNzYwMCIsCiAJW0FMQzI2MF9GVUpJVFNVX1M3MDJYXQk9ICJmdWppdHN1IiwKIAlbQUxDMjYwX0FDRVJdCQk9ICJhY2VyIiwKIAlbQUxDMjYwX1dJTExdCQk9ICJ3aWxsIiwKQEAgLTExMTIsMTUgKzg2NSw2IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA3ZiwgIkFjZXIiLCBBTEMyNjBfV0lMTCksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA4ZiwgIkFjZXIiLCBBTEMyNjBfQUNFUiksCiAJU05EX1BDSV9RVUlSSygweDE1MDksIDB4NDU0MCwgIkZhdm9yaXQgMTAwWFMiLCBBTEMyNjBfRkFWT1JJVDEwMCksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwOCwgIkhQIGQ1NzAwIiwgQUxDMjYwX0hQXzMwMTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MGEsICJIUCBkNTc1MCIsIEFMQzI2MF9BVVRPKSwgLyogbm8gcXVpcmsgKi8KLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDEwLCAiSFAiLCBBTEMyNjBfSFBfMzAxMyksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMSwgIkhQIiwgQUxDMjYwX0hQXzMwMTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTIsICJIUCIsIEFMQzI2MF9IUF9EQzc2MDApLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTMsICJIUCIsIEFMQzI2MF9IUF8zMDEzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDE0LCAiSFAiLCBBTEMyNjBfSFApLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTUsICJIUCIsIEFMQzI2MF9IUCksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNiwgIkhQIiwgQUxDMjYwX0hQKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWJiLCAiU29ueSBWQUlPIiwgQUxDMjYwX0JBU0lDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWNjLCAiU29ueSBWQUlPIiwgQUxDMjYwX0JBU0lDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWNkLCAiU29ueSBWQUlPIiwgQUxDMjYwX0JBU0lDKSwKQEAgLTExNDQsNTQgKzg4OCw2IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGMyNjBfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjMjYwX2NhcHR1cmVfc291cmNlLAogCX0sCi0JW0FMQzI2MF9IUF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2MF9ocF9vdXRwdXRfbWl4ZXIsCi0JCQkgICAgYWxjMjYwX2lucHV0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaW5pdF92ZXJicywKLQkJCQlhbGMyNjBfaHBfdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHNfYWx0LAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2MF9ocF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjBfSFBfREM3NjAwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYwX2hwX2RjNzYwMF9taXhlciwKLQkJCSAgICBhbGMyNjBfaW5wdXRfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9pbml0X3ZlcmJzLAotCQkJCWFsYzI2MF9ocF9kYzc2MDBfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHNfYWx0LAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2MF9ocF8zMDEyX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2MF9IUF8zMDEzXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYwX2hwXzMwMTNfbWl4ZXIsCi0JCQkgICAgYWxjMjYwX2lucHV0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaHBfMzAxM19pbml0X3ZlcmJzLAotCQkJCWFsYzI2MF9ocF8zMDEzX3Vuc29sX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYwX2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjYwX2FkY19uaWRzX2FsdCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2MF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjBfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjYwX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjBfaHBfMzAxM19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAogCVtBTEMyNjBfRlVKSVRTVV9TNzAyWF0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2MF9mdWppdHN1X21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfZnVqaXRzdV9pbml0X3ZlcmJzIH0sCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2FsYzI2Ml9xdWlya3MuYyBiL3NvdW5kL3BjaS9oZGEvYWxjMjYyX3F1aXJrcy5jCmluZGV4IDhkMjA5N2QuLjc4OTRiMmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvYWxjMjYyX3F1aXJrcy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjMjYyX3F1aXJrcy5jCkBAIC0xMCwxMyArMTAsNyBAQAogCUFMQzI2Ml9ISVBQTywKIAlBTEMyNjJfSElQUE9fMSwKIAlBTEMyNjJfRlVKSVRTVSwKLQlBTEMyNjJfSFBfQlBDLAotCUFMQzI2Ml9IUF9CUENfRDcwMDBfV0wsCi0JQUxDMjYyX0hQX0JQQ19ENzAwMF9XRiwKLQlBTEMyNjJfSFBfVENfVDU3MzUsCi0JQUxDMjYyX0hQX1JQNTcwMCwKIAlBTEMyNjJfQkVOUV9FRDgsCi0JQUxDMjYyX1NPTllfQVNTQU1ELAogCUFMQzI2Ml9CRU5RX1QzMSwKIAlBTEMyNjJfVUxUUkEsCiAJQUxDMjYyX0xFTk9WT18zMDAwLApAQCAtNjYsMTYzICs2MCwzMCBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKLS8qIHVwZGF0ZSBIUCwgbGluZSBhbmQgbW9uby1vdXQgcGlucyBhY2NvcmRpbmcgdG8gdGhlIG1hc3RlciBzd2l0Y2ggKi8KLSNkZWZpbmUgYWxjMjYyX2hwX21hc3Rlcl91cGRhdGUJCWFsYzI2MF9ocF9tYXN0ZXJfdXBkYXRlCi0KLXN0YXRpYyB2b2lkIGFsYzI2Ml9ocF9icGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2Ml9ocF93aWxkd2VzdF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE2OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLX0KLQotI2RlZmluZSBhbGMyNjJfaHBfbWFzdGVyX3N3X2dldAkJYWxjMjYwX2hwX21hc3Rlcl9zd19nZXQKLSNkZWZpbmUgYWxjMjYyX2hwX21hc3Rlcl9zd19wdXQJCWFsYzI2MF9ocF9tYXN0ZXJfc3dfcHV0Ci0KLSNkZWZpbmUgQUxDMjYyX0hQX01BU1RFUl9TV0lUQ0gJCQkJCVwKLQl7CQkJCQkJCVwKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCQlcCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAkJXAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCQlcCi0JCS5nZXQgPSBhbGMyNjJfaHBfbWFzdGVyX3N3X2dldCwJCQlcCi0JCS5wdXQgPSBhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dCwJCQlcCi0JfSwgXAotCXsJCQkJCQkJXAotCQkuaWZhY2UgPSBOSURfTUFQUElORywJCQkJXAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwJCVwKLQkJLnByaXZhdGVfdmFsdWUgPSAweDE1IHwgKDB4MTYgPDwgOCkgfCAoMHgxYiA8PCAxNiksCVwKLQl9Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSFBfTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLAotCQkJICAgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsCi0JCQkgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJBVVggSU4gUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQVVYIElOIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDYsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSFBfTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLAotCQkJICAgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsCi0JCQkgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDFhLCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3Rfb3B0aW9uX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiUmVhciBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJSZWFyIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiUmVhciBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBtdXRlL3VubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGFjY29yZGluZyB0byB0aGUgaHAgamFjayBhbmQgbXV0ZSBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjMjYyX2hwX3Q1NzM1X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX2hwX3Q1NzM1X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfaHBfdDU3MzVfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9ocF9ycDU3MDBfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfaHBfcnA1NzAwX3ZlcmJzW10gPSB7Ci0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAwIDw8IDgpKX0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjJfaHBfcnA1NzAwX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAxLAotCS5pdGVtcyA9IHsKLQkJeyAiTGluZSIsIDB4MSB9LAotCX0sCi19OwotCiAvKiBiaW5kIGhwIGFuZCBpbnRlcm5hbCBzcGVha2VyIG11dGUgKHdpdGggcGx1ZyBjaGVjaykgYXMgbWFzdGVyIHN3aXRjaCAqLwotI2RlZmluZSBhbGMyNjJfaGlwcG9fbWFzdGVyX3VwZGF0ZQlhbGMyNjJfaHBfbWFzdGVyX3VwZGF0ZQotI2RlZmluZSBhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X2dldAlhbGMyNjJfaHBfbWFzdGVyX3N3X2dldAotI2RlZmluZSBhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X3B1dAlhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dAorCitzdGF0aWMgaW50IGFsYzI2Ml9oaXBwb19tYXN0ZXJfc3dfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCSp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZSA9ICFzcGVjLT5tYXN0ZXJfbXV0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCB2YWwgPSAhKnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCisJaWYgKHZhbCA9PSBzcGVjLT5tYXN0ZXJfbXV0ZSkKKwkJcmV0dXJuIDA7CisJc3BlYy0+bWFzdGVyX211dGUgPSB2YWw7CisJdXBkYXRlX291dHB1dHMoY29kZWMpOworCXJldHVybiAxOworfQogCiAjZGVmaW5lIEFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENICQkJCVwKIAl7CQkJCQkJCVwKQEAgLTIzOSw2ICsxMDAsOSBAQAogCQkJICAgICAoU1VCREVWX1NQRUFLRVIoMCkgPDwgMTYpLCBcCiAJfQogCisjZGVmaW5lIGFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0CQlhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X2dldAorI2RlZmluZSBhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dAkJYWxjMjYyX2hpcHBvX21hc3Rlcl9zd19wdXQKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9oaXBwb19taXhlcltdID0gewogCUFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENILAogCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKQEAgLTI3OSw4ICsxNDMsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzI2Ml9oaXBwbzFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0yODksOCArMTUyLDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAKQEAgLTM1Myw4ICsyMTUsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIApAQCAtNDk2LDggKzM1Nyw3IEBACiAJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwogCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKIAlzcGVjLT5hdXRvX21pYyA9IDE7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX1BJTik7CiB9CiAKIC8qCkBAIC01NzEsMjcgKzQzMSw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjJfSFBfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDUsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQkJeyAiQVVYIElOIiwgMHg2IH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjJfSFBfRDcwMDBfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDQsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgyIH0sCi0JCXsgIkxpbmUiLCAweDEgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQogc3RhdGljIHZvaWQgYWxjMjYyX2Z1aml0c3Vfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC01OTksOCArNDM4LDcgQEAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1sxXSA9IDB4MWI7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAvKiBiaW5kIHZvbHVtZXMgb2YgYm90aCBOSUQgMHgwYyBhbmQgMHgwZCAqLwpAQCAtNjQ2LDggKzQ4NCw3IEBACiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX2xlbm92b18zMDAwX21peGVyW10gPSB7CkBAIC03NTIsOCArNTg5LDggQEAKIAltdXRlID0gMDsKIAkvKiBhdXRvLW11dGUgb25seSB3aGVuIEhQIGlzIHVzZWQgYXMgSFAgKi8KIAlpZiAoIXNwZWMtPmN1cl9tdXhbMF0pIHsKLQkJc3BlYy0+amFja19wcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxNSk7Ci0JCWlmIChzcGVjLT5qYWNrX3ByZXNlbnQpCisJCXNwZWMtPmhwX2phY2tfcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MTUpOworCQlpZiAoc3BlYy0+aHBfamFja19wcmVzZW50KQogCQkJbXV0ZSA9IEhEQV9BTVBfTVVURTsKIAl9CiAJLyogbXV0ZS91bm11dGUgaW50ZXJuYWwgc3BlYWtlciAqLwpAQCAtODE3LDIwNiArNjU0LDYgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9IUF9CUENfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAtMiBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogTXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjawotCSAqIG1peGVyIHdpZGdldAotCSAqIE5vdGU6IFBBU0QgbW90aGVyYm9hcmRzIHVzZXMgdGhlIExpbmUgSW4gMiBhcyB0aGUgaW5wdXQgZm9yCi0JICogZnJvbnQgcGFuZWwgbWljIChtaWMgMikKLQkgKi8KLQkvKiBBbXAgSW5kaWNlczogTWljMSA9IDAsIE1pYzIgPSAxLCBMaW5lMSA9IDIsIExpbmUyID0gMywgQ0QgPSA0ICovCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg1KX0sCi0gICAgICAgIHsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg2KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDBjIC0gMHgwZSkKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLwotCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCi0gICAgICAgIHsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLSAgICAgICAgezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCi0KLQkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDBiLCAxMiAqLwotCS8qIElucHV0IG1peGVyMTogb25seSB1bm11dGUgTWljICovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA1IDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNiA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDcgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA4IDw8IDgpKX0sCi0JLyogSW5wdXQgbWl4ZXIyICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA1IDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNiA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDcgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA4IDw8IDgpKX0sCi0JLyogSW5wdXQgbWl4ZXIzICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA1IDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNiA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDcgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA4IDw8IDgpKX0sCi0KLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBNdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IgZnJvbnQKLQkgKiBwYW5lbCBtaWMgKG1pYyAyKQotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg3KX0sCi0JLyoKLQkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwYyAtIDB4MGUpCi0JICovCi0JLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KLQkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAkvKiBIUCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwJLyogTW9ubyAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogcmVhciBNSUMgKi8KLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwJLyogTGluZSBpbiAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogRnJvbnQgTUlDICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAkvKiBMaW5lIG91dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAkvKiBDRCBpbiAqLwotCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0KLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0KLQkvKiB7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDIzIH0sICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDIzIH0sCi0JezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDFkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLQotCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLwotCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMTYsIDE3LCAwYiAqLwotCS8qIElucHV0IG1peGVyMTogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwgLypyZWFyIE1JQyovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LCAvKkxpbmUgaW4qLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwgLypGIE1JQyovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMyA8PCA4KSl9LCAvKkZyb250Ki8KLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA0IDw8IDgpKX0sIC8qQ0QqLwotICAgICAgICAvKiB7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA2IDw8IDgpKX0sICAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDcgPDwgOCkpfSwgLypIUCovCi0JLyogSW5wdXQgbWl4ZXIyICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDQgPDwgOCkpfSwKLSAgICAgICAgLyogezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNiA8PCA4KSl9LCAqLwotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDcgPDwgOCkpfSwKLQkvKiBJbnB1dCBtaXhlcjMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAzIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNCA8PCA4KSl9LAotICAgICAgICAvKiB7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA2IDw8IDgpKX0sICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNyA8PCA4KSl9LAotCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCi0JeyB9Ci19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml90b3NoaWJhX3J4MV91bnNvbF92ZXJic1tdID0gewogCiAJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAkvKiBGcm9udCBTcGVha2VyICovCkBAIC0xMDQyLDEzICs2NzksOCBAQAogCVtBTEMyNjJfSElQUE9dCQk9ICJoaXBwbyIsCiAJW0FMQzI2Ml9ISVBQT18xXQk9ICJoaXBwb18xIiwKIAlbQUxDMjYyX0ZVSklUU1VdCT0gImZ1aml0c3UiLAotCVtBTEMyNjJfSFBfQlBDXQkJPSAiaHAtYnBjIiwKLQlbQUxDMjYyX0hQX0JQQ19ENzAwMF9XTF09ICJocC1icGMtZDcwMDAiLAotCVtBTEMyNjJfSFBfVENfVDU3MzVdCT0gImhwLXRjLXQ1NzM1IiwKLQlbQUxDMjYyX0hQX1JQNTcwMF0JPSAiaHAtcnA1NzAwIiwKIAlbQUxDMjYyX0JFTlFfRUQ4XQk9ICJiZW5xIiwKIAlbQUxDMjYyX0JFTlFfVDMxXQk9ICJiZW5xLXQzMSIsCi0JW0FMQzI2Ml9TT05ZX0FTU0FNRF0JPSAic29ueS1hc3NhbWQiLAogCVtBTEMyNjJfVE9TSElCQV9TMDZdCT0gInRvc2hpYmEtczA2IiwKIAlbQUxDMjYyX1RPU0hJQkFfUlgxXQk9ICJ0b3NoaWJhLXJ4MSIsCiAJW0FMQzI2Ml9VTFRSQV0JCT0gInVsdHJhIiwKQEAgLTEwNjEsNDEgKzY5Myw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjYyX2NmZ190YmxbXSA9IHsKIAlTTkRfUENJX1FVSVJLKDB4MTAwMiwgMHg0MzdiLCAiSGlwcG8iLCBBTEMyNjJfSElQUE8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDMzLCAweDg4OTUsICJORUMgVmVyc2EgUzkxMDAiLCBBTEMyNjJfTkVDKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTIwMCwgIkhQIHh3IHNlcmllcyIsCi0JCQkgICBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTMwMCwgIkhQIHh3IHNlcmllcyIsCi0JCQkgICBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTUwMCwgIkhQIHogc2VyaWVzIiwKLQkJCSAgIEFMQzI2Ml9IUF9CUEMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDE3MGIsICJIUCBaMjAwIiwKLQkJCSAgIEFMQzI2Ml9BVVRPKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTcwMCwgIkhQIHh3IHNlcmllcyIsCi0JCQkgICBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAwLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAxLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAyLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAzLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA0LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA1LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA2LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA3LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODBjLCAiSFAgeHc0NDAwIiwgQUxDMjYyX0hQX0JQQyksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNCwgIkhQIHh3NjQwMCIsIEFMQzI2Ml9IUF9CUEMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTUsICJIUCB4dzg0MDAiLCBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDJmLCAiSFAgVGhpbiBDbGllbnQgVDU3MzUiLAotCQkgICAgICBBTEMyNjJfSFBfVENfVDU3MzUpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MTcsICJIUCBSUDU3MDAiLCBBTEMyNjJfSFBfUlA1NzAwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHgxZjAwLCAiU29ueSBBU1NBTUQiLCBBTEMyNjJfU09OWV9BU1NBTUQpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgyMDMsICJTb255IFVYLTkwIiwgQUxDMjYyX0hJUFBPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MjBmLCAiU29ueSBBU1NBTUQiLCBBTEMyNjJfU09OWV9BU1NBTUQpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwMTYsICJTb255IFZBSU8iLCBBTEMyNjJfQVVUTyksIC8qIGRpZy1vbmx5ICovCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTAyNSwgIlNvbnkgVkFJTyBaMjFNTiIsIEFMQzI2Ml9UT1NISUJBX1MwNiksCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTAzNSwgIlNvbnkgVkFJTyBWR04tRlcxNzBKIiwgQUxDMjYyX0FVVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwNDcsICJTb255IFZBSU8gVHlwZSBHIiwgQUxDMjYyX0FVVE8pLAotI2lmIDAgLyogZGlzYWJsZSB0aGUgcXVpcmsgc2luY2UgbW9kZWw9YXV0byB3b3JrcyBiZXR0ZXIgaW4gcmVjZW50IHZlcnNpb25zICovCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTA0ZCwgMHhmZjAwLCAweDkwMDAsICJTb255IFZBSU8iLAotCQkJICAgQUxDMjYyX1NPTllfQVNTQU1EKSwKLSNlbmRpZgogCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweDAwMDEsICJUb3NoaWJhIGR5bmFib29rIFNTIFJYMSIsCiAJCSAgICAgIEFMQzI2Ml9UT1NISUJBX1JYMSksCiAJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmY3YiwgIlRvc2hpYmEgUzA2IiwgQUxDMjYyX1RPU0hJQkFfUzA2KSwKQEAgLTExNjYsNjggKzc2Myw2IEBACiAJCS5zZXR1cCA9IGFsYzI2Ml9mdWppdHN1X3NldHVwLAogCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAogCX0sCi0JW0FMQzI2Ml9IUF9CUENdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfSFBfQlBDX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfSFBfQlBDX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfSFBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9ocF9icGNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjYyX0hQX0JQQ19ENzAwMF9XRl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9IUF9ENzAwMF9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjYyX2hwX3dpbGR3ZXN0X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2Ml9IUF9CUENfRDcwMDBfV0xdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X21peGVyLAotCQkJICAgIGFsYzI2Ml9IUF9CUENfV2lsZFdlc3Rfb3B0aW9uX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfSFBfRDcwMDBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9ocF93aWxkd2VzdF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfSFBfVENfVDU3MzVdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfaHBfdDU3MzVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfaHBfdDU3MzVfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9ocF90NTczNV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfSFBfUlA1NzAwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYyX2hwX3JwNTcwMF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9ocF9ycDU3MDBfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9ocF9ycDU3MDBfY2FwdHVyZV9zb3VyY2UsCi0gICAgICAgIH0sCiAJW0FMQzI2Ml9CRU5RX0VEOF0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2Ml9iYXNlX21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX0VBUERfdmVyYnMgfSwKQEAgLTEyMzgsMTkgKzc3Myw2IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAogCX0sCi0JW0FMQzI2Ml9TT05ZX0FTU0FNRF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2Ml9zb255X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX3NvbnlfdW5zb2xfdmVyYnN9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDIsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjYyX2hpcHBvX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCiAJW0FMQzI2Ml9CRU5RX1QzMV0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2Ml9iZW5xX3QzMV9taXhlciB9LAogCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9iZW5xX3QzMV9FQVBEX3ZlcmJzLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGMyNjhfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzI2OF9xdWlya3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1ODc2Yy4uMDAwMDAwMAotLS0gYS9zb3VuZC9wY2kvaGRhL2FsYzI2OF9xdWlya3MuYworKysgL2Rldi9udWxsCkBAIC0xLDYzNiArMCwwIEBACi0vKgotICogQUxDMjY3L0FMQzI2OCBxdWlyayBtb2RlbHMKLSAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYwotICovCi0KLS8qIEFMQzI2OCBtb2RlbHMgKi8KLWVudW0gewotCUFMQzI2OF9BVVRPLAotCUFMQzI2N19RVUFOVEFfSUwxLAotCUFMQzI2OF8zU1QsCi0JQUxDMjY4X1RPU0hJQkEsCi0JQUxDMjY4X0FDRVIsCi0JQUxDMjY4X0FDRVJfRE1JQywKLQlBTEMyNjhfQUNFUl9BU1BJUkVfT05FLAotCUFMQzI2OF9ERUxMLAotCUFMQzI2OF9aRVBUTywKLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JQUxDMjY4X1RFU1QsCi0jZW5kaWYKLQlBTEMyNjhfTU9ERUxfTEFTVCAvKiBsYXN0IHRhZyAqLwotfTsKLQotLyoKLSAqICBBTEMyNjggY2hhbm5lbCBzb3VyY2Ugc2V0dGluZyAoMiBjaGFubmVsKQotICovCi0jZGVmaW5lIEFMQzI2OF9ESUdPVVRfTklECUFMQzg4MF9ESUdPVVRfTklECi0jZGVmaW5lIGFsYzI2OF9tb2RlcwkJYWxjMjYwX21vZGVzCi0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY4X2RhY19uaWRzWzJdID0gewotCS8qIGZyb250LCBocCAqLwotCTB4MDIsIDB4MDMKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY4X2FkY19uaWRzWzJdID0gewotCS8qIEFEQzAtMSAqLwotCTB4MDgsIDB4MDcKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY4X2FkY19uaWRzX2FsdFsxXSA9IHsKLQkvKiBBREMwICovCi0JMHgwOAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjhfY2Fwc3JjX25pZHNbMl0gPSB7IDB4MjMsIDB4MjQgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9iYXNlX21peGVyW10gPSB7Ci0JLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBCb29zdCBWb2x1bWUiLCAweDFhLCAwLCBIREFfSU5QVVQpLAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF90b3NoaWJhX21peGVyW10gPSB7Ci0JLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF9lYXBkX3ZlcmJzW10gPSB7Ci0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsgfQotfTsKLQotLyogVG9zaGliYSBzcGVjaWZpYyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfdG9zaGliYV92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBBY2VyIHNwZWNpZmljICovCi0vKiBiaW5kIHZvbHVtZXMgb2YgYm90aCBOSUQgMHgwMiBhbmQgMHgwMyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDAyLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDAzLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjhfYWNlcl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotI2RlZmluZSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfZ2V0CWFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0Ci0jZGVmaW5lIGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQJYWxjMjYyX2hwX21hc3Rlcl9zd19wdXQKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9hY2VyX2FzcGlyZV9vbmVfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjhfYWNlcl9iaW5kX21hc3Rlcl92b2wpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IDB4MTUsCi0JCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKLQkJLmdldCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19nZXQsCi0JCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAotCX0sCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfYWNlcl9taXhlcltdID0gewotCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgMHgxNCwKLQkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAotCQkuZ2V0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQsCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2FjZXJfZG1pY19taXhlcltdID0gewotCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgMHgxNCwKLQkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAotCQkuZ2V0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQsCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF9hY2VyX2FzcGlyZV9vbmVfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDA2fSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhhMDE3fSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY4X2FjZXJfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LCAvKiBpbnRlcm5hbCBkbWljPyAqLwotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JeyB9Ci19OwotCi0vKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCi0jZGVmaW5lIGFsYzI2OF90b3NoaWJhX3NldHVwCQlhbGMyNjJfaGlwcG9fc2V0dXAKLQotc3RhdGljIHZvaWQgYWxjMjY4X2FjZXJfbGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKLQlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTI7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2RlbGxfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY4X2RlbGxfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19NSUNfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JeyB9Ci19OwotCi0vKiBtdXRlL3VubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGFjY29yZGluZyB0byB0aGUgaHAgamFjayBhbmQgbXV0ZSBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjMjY4X2RlbGxfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjdfcXVhbnRhX2lsMV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJNaWMgQ2FwdHVyZSBTd2l0Y2giLCAweDIzLCAyLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY3X3F1YW50YV9pbDFfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX01JQ19FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzI2N19xdWFudGFfaWwxX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKLQlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTk7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLX0KLQotLyoKLSAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfYmFzZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyogVW5tdXRlIERBQzAtMSBhbmQgc2V0IHZvbCA9IDAgKi8KLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qCi0JICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MGMgLSAweDBlKQotCSAqLwotCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwZSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzB9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCXsweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0KLQkvKiBzZXQgUENCRUVQIHZvbCA9IDAsIG11dGUgY29ubmVjdGlvbnMgKi8KLQl7MHgxZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCi0JLyogVW5tdXRlIFNlbGVjdG9yIDIzaCwyNGggYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4gKi8KLQotCXsweDIzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQl7IH0KLX07Ci0KLS8qIG9ubHkgZm9yIG1vZGVsPXRlc3QgKi8KLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF92b2x1bWVfaW5pdF92ZXJic1tdID0gewotCS8qIHNldCBvdXRwdXQgREFDICovCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JeyB9Ci19OwotI2VuZGlmIC8qIENPTkZJR19TTkRfREVCVUcgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9jYXB0dXJlX25vc3JjX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAotCV9ERUZJTkVfQ0FQU1JDKDEpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MjQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MjQsIDB4MCwgSERBX09VVFBVVCksCi0JX0RFRklORV9DQVBTUkMoMiksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2OF9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNCwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKLQkJeyAiTGluZSIsIDB4MiB9LAotCQl7ICJDRCIsIDB4MyB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjY4X2FjZXJfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDMsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiSW50ZXJuYWwgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2OF9hY2VyX2RtaWNfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDMsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiSW50ZXJuYWwgTWljIiwgMHg2IH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQl9LAotfTsKLQotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfdGVzdF9taXhlcltdID0gewotCS8qIFZvbHVtZSB3aWRnZXRzICovCi0JSERBX0NPREVDX1ZPTFVNRSgiTE9VVDEgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMT1VUMiBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTW9ubyBzdW0gUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJMSU5FLU9VVCBzdW0gUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJIUC1PVVQgc3VtIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDIsIEhEQV9JTlBVVCksCi0JSERBX0JJTkRfTVVURSgiTElORS1PVVQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMiwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiSFAtT1VUIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDIsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMiwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTUlDMSBDYXB0dXJlIFZvbHVtZSIsIDB4MTgsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJNSUMxIENhcHR1cmUgU3dpdGNoIiwgMHgxOCwgMiwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTUlDMiBDYXB0dXJlIFZvbHVtZSIsIDB4MTksIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMSU5FMSBDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJMSU5FMSBDYXB0dXJlIFN3aXRjaCIsIDB4MWEsIDIsIEhEQV9PVVRQVVQpLAotCS8qIFRoZSBiZWxvdyBhcHBlYXJzIHByb2JsZW1hdGljIG9uIHNvbWUgaGFyZHdhcmVzICovCi0JLypIREFfQ09ERUNfVk9MVU1FKCJQQ0JFRVAgUGxheWJhY2sgVm9sdW1lIiwgMHgxZCwgMHgwLCBIREFfSU5QVVQpLCovCi0JSERBX0NPREVDX1ZPTFVNRSgiUENNLUlOMSBDYXB0dXJlIFZvbHVtZSIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiUENNLUlOMSBDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDIsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlBDTS1JTjIgQ2FwdHVyZSBWb2x1bWUiLCAweDI0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlBDTS1JTjIgQ2FwdHVyZSBTd2l0Y2giLCAweDI0LCAyLCBIREFfT1VUUFVUKSwKLQotCS8qIE1vZGVzIGZvciByZXRhc2tpbmcgcGluIHdpZGdldHMgKi8KLQlBTENfUElOX01PREUoIkxJTkUtT1VUIHBpbiBtb2RlIiwgMHgxNCwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCUFMQ19QSU5fTU9ERSgiSFAtT1VUIHBpbiBtb2RlIiwgMHgxNSwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCUFMQ19QSU5fTU9ERSgiTUlDMSBwaW4gbW9kZSIsIDB4MTgsIEFMQ19QSU5fRElSX0lOT1VUKSwKLQlBTENfUElOX01PREUoIkxJTkUxIHBpbiBtb2RlIiwgMHgxYSwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCi0JLyogQ29udHJvbHMgZm9yIEdQSU8gcGlucywgYXNzdW1pbmcgdGhleSBhcmUgY29uZmlndXJlZCBhcyBvdXRwdXRzICovCi0JQUxDX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDAiLCAweDAxLCAweDAxKSwKLQlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMSIsIDB4MDEsIDB4MDIpLAotCUFMQ19HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAyIiwgMHgwMSwgMHgwNCksCi0JQUxDX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDMiLCAweDAxLCAweDA4KSwKLQotCS8qIFN3aXRjaGVzIHRvIGFsbG93IHRoZSBkaWdpdGFsIFNQRElGIG91dHB1dCBwaW4gdG8gYmUgZW5hYmxlZC4KLQkgKiBUaGUgQUxDMjY4IGRvZXMgbm90IGhhdmUgYW4gU1BESUYgaW5wdXQuCi0JICovCi0JQUxDX1NQRElGX0NUUkxfU1dJVENIKCJTUERJRiBQbGF5YmFjayBTd2l0Y2giLCAweDA2LCAweDAxKSwKLQotCS8qIEEgc3dpdGNoIGFsbG93aW5nIEVBUEQgdG8gYmUgZW5hYmxlZC4gIFNvbWUgbGFwdG9wcyBzZWVtIHRvIHVzZQotCSAqIHRoaXMgb3V0cHV0IHRvIHR1cm4gb24gYW4gZXh0ZXJuYWwgYW1wbGlmaWVyLgotCSAqLwotCUFMQ19FQVBEX0NUUkxfU1dJVENIKCJMSU5FLU9VVCBFQVBEIEVuYWJsZSBTd2l0Y2giLCAweDBmLCAweDAyKSwKLQlBTENfRUFQRF9DVFJMX1NXSVRDSCgiSFAtT1VUIEVBUEQgRW5hYmxlIFN3aXRjaCIsIDB4MTAsIDB4MDIpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLSNlbmRpZgotCi0vKgotICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjMjY4X21vZGVsc1tBTEMyNjhfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzI2N19RVUFOVEFfSUwxXQk9ICJxdWFudGEtaWwxIiwKLQlbQUxDMjY4XzNTVF0JCT0gIjNzdGFjayIsCi0JW0FMQzI2OF9UT1NISUJBXQk9ICJ0b3NoaWJhIiwKLQlbQUxDMjY4X0FDRVJdCQk9ICJhY2VyIiwKLQlbQUxDMjY4X0FDRVJfRE1JQ10JPSAiYWNlci1kbWljIiwKLQlbQUxDMjY4X0FDRVJfQVNQSVJFX09ORV0JPSAiYWNlci1hc3BpcmUiLAotCVtBTEMyNjhfREVMTF0JCT0gImRlbGwiLAotCVtBTEMyNjhfWkVQVE9dCQk9ICJ6ZXB0byIsCi0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCVtBTEMyNjhfVEVTVF0JCT0gInRlc3QiLAotI2VuZGlmCi0JW0FMQzI2OF9BVVRPXQkJPSAiYXV0byIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjY4X2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTFlLCAiQWNlciBBc3BpcmUgNTcyMHoiLCBBTEMyNjhfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEyNiwgIkFjZXIiLCBBTEMyNjhfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEyZSwgIkFjZXIgQXNwaXJlIDUzMTAiLCBBTEMyNjhfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEzMCwgIkFjZXIgRXh0ZW5zYSA1MjEwIiwgQUxDMjY4X0FDRVIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMzYsICJBY2VyIEFzcGlyZSA1MzE1IiwgQUxDMjY4X0FDRVIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxNWIsICJBY2VyIEFzcGlyZSBPbmUiLAotCQkJCQkJQUxDMjY4X0FDRVJfQVNQSVJFX09ORSksCi0JU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDI1MywgIkRlbGwgT0VNIiwgQUxDMjY4X0RFTEwpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAyYjAsICJEZWxsIEluc3Bpcm9uIDkxMCIsIEFMQzI2OF9BVVRPKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDI4LCAweGZmZjAsIDB4MDJiMCwKLQkJCSJEZWxsIEluc3Bpcm9uIE1pbmk5L1Zvc3RybyBBOTAiLCBBTEMyNjhfREVMTCksCi0JLyogYWxtb3N0IGNvbXBhdGlibGUgd2l0aCB0b3NoaWJhIGJ1dCB3aXRoIG9wdGlvbmFsIGRpZ2l0YWwgb3V0czsKLQkgKiBhdXRvLXByb2Jpbmcgc2VlbXMgd29ya2luZyBmaW5lCi0JICovCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDMwMDAsICJIUCBUWDI1eHggc2VyaWVzIiwKLQkJCSAgIEFMQzI2OF9BVVRPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjA1LCAiQVNVUyBXN0oiLCBBTEMyNjhfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3MCwgMHgwMDQwLCAiWkVQVE8iLCBBTEMyNjhfWkVQVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxNGMwLCAweDAwMjUsICJDT01QQUwgSUZMOTAvSkZMLTkyIiwgQUxDMjY4X1RPU0hJQkEpLAotCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA3NzEsICJRdWFudGEgSUwxIiwgQUxDMjY3X1FVQU5UQV9JTDEpLAotCXt9Ci19OwotCi0vKiBUb3NoaWJhIGxhcHRvcHMgaGF2ZSBubyB1bmlxdWUgUENJIFNTSUQgYnV0IG9ubHkgY29kZWMgU1NJRCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2OF9zc2lkX2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjBhLCAiVE9TSElCQSBYLTIwMCIsIEFMQzI2OF9BVVRPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjBlLCAiVE9TSElCQSBYLTIwMCBIRE1JIiwgQUxDMjY4X0FVVE8pLAotCVNORF9QQ0lfUVVJUktfTUFTSygweDExNzksIDB4ZmYwMCwgMHhmZjAwLCAiVE9TSElCQSBBL0x4MDUiLAotCQkJICAgQUxDMjY4X1RPU0hJQkEpLAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzI2OF9wcmVzZXRzW10gPSB7Ci0JW0FMQzI2N19RVUFOVEFfSUwxXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY3X3F1YW50YV9pbDFfbWl4ZXIsIGFsYzI2OF9iZWVwX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjhfY2FwdHVyZV9ub3NyY19taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2N19xdWFudGFfaWwxX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdCwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjdfcXVhbnRhX2lsMV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjhfM1NUXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY4X2Jhc2VfbWl4ZXIsIGFsYzI2OF9iZWVwX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjhfY2FwdHVyZV9hbHRfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjhfYmFzZV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAotICAgICAgICAgICAgICAgIC5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotICAgICAgICAgICAgICAgIC5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzI2OF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjhfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDMjY4X1RPU0hJQkFdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjhfdG9zaGliYV9taXhlciwgYWxjMjY4X2JlZXBfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2OF90b3NoaWJhX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdCwKLQkJLmNhcHNyY19uaWRzID0gYWxjMjY4X2NhcHNyY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjhfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjY4X2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjhfdG9zaGliYV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjhfQUNFUl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OF9hY2VyX21peGVyLCBhbGMyNjhfYmVlcF9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjMjY4X2NhcHR1cmVfYWx0X21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X2FjZXJfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAyLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjhfYWNlcl9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY4X2FjZXJfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY4X0FDRVJfRE1JQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OF9hY2VyX2RtaWNfbWl4ZXIsIGFsYzI2OF9iZWVwX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjhfY2FwdHVyZV9hbHRfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjhfYmFzZV9pbml0X3ZlcmJzLCBhbGMyNjhfZWFwZF92ZXJicywKLQkJCQlhbGMyNjhfYWNlcl92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCksCi0JCS5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDIsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2OF9hY2VyX2RtaWNfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OF9hY2VyX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2OF9BQ0VSX0FTUElSRV9PTkVdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjhfYWNlcl9hc3BpcmVfb25lX21peGVyLCBhbGMyNjhfYmVlcF9taXhlcn0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjhfY2FwdHVyZV9ub3NyY19taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2OF9hY2VyX2FzcGlyZV9vbmVfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY4X2FjZXJfbGNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY4X0RFTExdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjhfZGVsbF9taXhlciwgYWxjMjY4X2JlZXBfbWl4ZXJ9LAotCQkuY2FwX21peGVyID0gYWxjMjY4X2NhcHR1cmVfbm9zcmNfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjhfYmFzZV9pbml0X3ZlcmJzLCBhbGMyNjhfZWFwZF92ZXJicywKLQkJCQlhbGMyNjhfZGVsbF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCksCi0JCS5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDIsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjhfZGVsbF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjhfWkVQVE9dID0gewotCQkubWl4ZXJzID0geyBhbGMyNjhfYmFzZV9taXhlciwgYWxjMjY4X2JlZXBfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2OF90b3NoaWJhX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdCwKLQkJLmNhcHNyY19uaWRzID0gYWxjMjY4X2NhcHNyY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLmRpZ19vdXRfbmlkID0gQUxDMjY4X0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2OF9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY4X3Rvc2hpYmFfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JW0FMQzI2OF9URVNUXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY4X3Rlc3RfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OF9jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCWFsYzI2OF9iZWVwX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGlnX291dF9uaWQgPSBBTEMyNjhfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjhfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjY4X2NhcHR1cmVfc291cmNlLAotCX0sCi0jZW5kaWYKLX07Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjMjY5X3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGMyNjlfcXVpcmtzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYzBlMjEuLjAwMDAwMDAKLS0tIGEvc291bmQvcGNpL2hkYS9hbGMyNjlfcXVpcmtzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzQgKzAsMCBAQAotLyoKLSAqIEFMQzI2OS9BTEMyNzAvQUxDMjc1L0FMQzI3NiBxdWlyayBtb2RlbHMKLSAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYwotICovCi0KLS8qIEFMQzI2OSBtb2RlbHMgKi8KLWVudW0gewotCUFMQzI2OV9BVVRPLAotCUFMQzI2OV9CQVNJQywKLQlBTEMyNjlfUVVBTlRBX0ZMMSwKLQlBTEMyNjlfQU1JQywKLQlBTEMyNjlfRE1JQywKLQlBTEMyNjlWQl9BTUlDLAotCUFMQzI2OVZCX0RNSUMsCi0JQUxDMjY5X0ZVSklUU1UsCi0JQUxDMjY5X0xJRkVCT09LLAotCUFMQzI3MV9BQ0VSLAotCUFMQzI2OV9NT0RFTF9MQVNUIC8qIGxhc3QgdGFnICovCi19OwotCi0vKgotICogIEFMQzI2OSBjaGFubmVsIHNvdXJjZSBzZXR0aW5nICgyIGNoYW5uZWwpCi0gKi8KLSNkZWZpbmUgQUxDMjY5X0RJR09VVF9OSUQJQUxDODgwX0RJR09VVF9OSUQKLQotI2RlZmluZSBhbGMyNjlfZGFjX25pZHMJCWFsYzI2MF9kYWNfbmlkcwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OV9hZGNfbmlkc1sxXSA9IHsKLQkvKiBBREMxICovCi0JMHgwOCwKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY5X2NhcHNyY19uaWRzWzFdID0gewotCTB4MjMsCi19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OXZiX2FkY19uaWRzWzFdID0gewotCS8qIEFEQzEgKi8KLQkweDA5LAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjl2Yl9jYXBzcmNfbmlkc1sxXSA9IHsKLQkweDIyLAotfTsKLQotI2RlZmluZSBhbGMyNjlfbW9kZXMJCWFsYzI2MF9tb2RlcwotI2RlZmluZSBhbGMyNjlfY2FwdHVyZV9zb3VyY2UJYWxjODgwX2xnX2x3X2NhcHR1cmVfc291cmNlCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfYmFzZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5X3F1YW50YV9mbDFfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjhfYWNlcl9iaW5kX21hc3Rlcl92b2wpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9BTVBfRkxBRywKLQkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywKLQkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsCi0JCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAotCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGlmZWJvb2tfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjhfYWNlcl9iaW5kX21hc3Rlcl92b2wpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9BTVBfRkxBRywKLQkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywKLQkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsCi0JCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAotCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJEb2NrIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJEb2NrIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkRvY2sgTWljIEJvb3N0IFZvbHVtZSIsIDB4MWIsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5X2xhcHRvcF9taXhlcltdID0gewotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5dmJfbGFwdG9wX21peGVyW10gPSB7Ci0JSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfYXN1c19taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5dmJfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjl2Yl9sYXB0b3BfZGlnaXRhbF9jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIEZTQyBhbWlsbyAqLwotI2RlZmluZSBhbGMyNjlfZnVqaXRzdV9taXhlcglhbGMyNjlfbGFwdG9wX21peGVyCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X3F1YW50YV9mbDFfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjlfbGlmZWJvb2tfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7IH0KLX07Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzI2OV9xdWFudGFfZmwxX3NwZWFrZXJfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKLQotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCi0JCQlBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDBjKTsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAotCQkJQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDY4MCk7Ci0KLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAotCQkJQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwYyk7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMCwgMCwKLQkJCUFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0ODApOwotfQotCi0jZGVmaW5lIGFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlIFwKLQlhbGMyNjlfcXVhbnRhX2ZsMV9zcGVha2VyX2F1dG9tdXRlCi0KLXN0YXRpYyB2b2lkIGFsYzI2OV9saWZlYm9va19taWNfYXV0b3N3aXRjaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1bnNpZ25lZCBpbnQgcHJlc2VudF9sYXB0b3A7Ci0JdW5zaWduZWQgaW50IHByZXNlbnRfZG9jazsKLQotCXByZXNlbnRfbGFwdG9wCT0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxOCk7Ci0JcHJlc2VudF9kb2NrCT0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxYik7Ci0KLQkvKiBMYXB0b3AgbWljIHBvcnQgb3ZlcnJpZGVzIGRvY2sgbWljIHBvcnQsIGRlc2lnbiBkZWNpc2lvbiAqLwotCWlmIChwcmVzZW50X2RvY2spCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjMsIDAsCi0JCQkJQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4Myk7Ci0JaWYgKHByZXNlbnRfbGFwdG9wKQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIzLCAwLAotCQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDApOwotCWlmICghcHJlc2VudF9kb2NrICYmICFwcmVzZW50X2xhcHRvcCkKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMywgMCwKLQkJCQlBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJICAgIHVuc2lnbmVkIGludCByZXMpCi17Ci0Jc3dpdGNoIChyZXMgPj4gMjYpIHsKLQljYXNlIEFMQ19IUF9FVkVOVDoKLQkJYWxjMjY5X3F1YW50YV9mbDFfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7Ci0JCWJyZWFrOwotCWNhc2UgQUxDX01JQ19FVkVOVDoKLQkJYWxjX21pY19hdXRvbXV0ZShjb2RlYyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X2xpZmVib29rX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQl1bnNpZ25lZCBpbnQgcmVzKQotewotCWlmICgocmVzID4+IDI2KSA9PSBBTENfSFBfRVZFTlQpCi0JCWFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKLQlpZiAoKHJlcyA+PiAyNikgPT0gQUxDX01JQ19FVkVOVCkKLQkJYWxjMjY5X2xpZmVib29rX21pY19hdXRvc3dpdGNoKGNvZGVjKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsYzI2OV9xdWFudGFfZmwxX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOwotCWFsY19taWNfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGlmZWJvb2tfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMV0gPSAweDFhOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGlmZWJvb2tfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKLQlhbGMyNjlfbGlmZWJvb2tfbWljX2F1dG9zd2l0Y2goY29kZWMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OV9sYXB0b3BfZG1pY19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDV9LAotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMjYgfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAxOSB8ICgweDAwIDw8IDgpKX0sCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjlfbGFwdG9wX2FtaWNfaW5pdF92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDI2IH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMWIgfCAoMHgwMCA8PCA4KSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OXZiX2xhcHRvcF9kbWljX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwNn0sCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAyNiB9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDE5IHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OXZiX2xhcHRvcF9hbWljX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAyNiB9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDE5IHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI3MV9hY2VyX2RtaWNfdmVyYnNbXSA9IHsKLQl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwZH0sCi0JezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0MDAwfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgNn0sCi0JeyB9Ci19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGFwdG9wX2FtaWNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X2xhcHRvcF9kbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OXZiX2xhcHRvcF9hbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OXZiX2xhcHRvcF9kbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qCi0gKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyoKLQkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwMiAtIDB4MDMpCi0JICovCi0JLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KLQkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCS8qIEZJWE1FOiB1c2UgTXV4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLwotCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxZCwgMGIgKi8KLQkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KLQl7MHgyMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JLyogc2V0IEVBUEQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjl2Yl9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCS8qCi0JICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MDIgLSAweDAzKQotCSAqLwotCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQkvKiBzZXQgdXAgaW5wdXQgYW1wcyBmb3IgYW5hbG9nIGxvb3BiYWNrICovCi0JLyogQW1wIEluZGljZXM6IERBQyA9IDAsIG1peGVyID0gMSAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBGSVhNRTogdXNlIE11eC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWQsIDBiICovCi0JLyogSW5wdXQgbWl4ZXIxOiB1bm11dGUgTWljLCBGLU1pYywgTGluZSwgQ0QgaW5wdXRzICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCS8qIHNldCBFQVBEICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7IH0KLX07Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGMyNjlfbW9kZWxzW0FMQzI2OV9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDMjY5X0JBU0lDXQkJCT0gImJhc2ljIiwKLQlbQUxDMjY5X1FVQU5UQV9GTDFdCQk9ICJxdWFudGEiLAotCVtBTEMyNjlfQU1JQ10JCQk9ICJsYXB0b3AtYW1pYyIsCi0JW0FMQzI2OV9ETUlDXQkJCT0gImxhcHRvcC1kbWljIiwKLQlbQUxDMjY5X0ZVSklUU1VdCQk9ICJmdWppdHN1IiwKLQlbQUxDMjY5X0xJRkVCT09LXQkJPSAibGlmZWJvb2siLAotCVtBTEMyNjlfQVVUT10JCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjlfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZjgsICJRdWFudGEgRkwxIiwgQUxDMjY5X1FVQU5UQV9GTDEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA0N2MsICJBQ0VSIFpHQSIsIEFMQzI3MV9BQ0VSKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzMwLCAiQVNVUyBFZWVwYyBQNzAzIFA5MDBBIiwKLQkJICAgICAgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwMTMsICJBU1VTIE42MURhIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTExMywgIkFTVVMgTjYzSm4iLCBBTEMyNjlWQl9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTQzLCAiQVNVUyBCNTNmIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTEzMywgIkFTVVMgVUoyMGZ0IiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExODMsICJBU1VTIEs3MkRSIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFiMywgIkFTVVMgSzUyRFIiLCBBTEMyNjlWQl9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWUzLCAiQVNVUyBVMzNKYyIsIEFMQzI2OVZCX0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyNzMsICJBU1VTIFVMODBKdCIsIEFMQzI2OVZCX0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyODMsICJBU1VTIFU1M0pjIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyYjMsICJBU1VTIE44MkpWIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJkMywgIkFTVVMgTjYxSnYiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTNhMywgIkFTVVMgVUwzMFZ0IiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzNzMsICJBU1VTIEc3M0pYIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzODMsICJBU1VTIFVKMzBKYyIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2QzLCAiQVNVUyBONjFKQSIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDEzLCAiQVNVUyBVTDUwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0NDMsICJBU1VTIFVMMzAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ1MywgIkFTVVMgTTYwSnYiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ4MywgIkFTVVMgVUw4MCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGYzLCAiQVNVUyBGODNWZiIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGUzLCAiQVNVUyBVTDIwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1MTMsICJBU1VTIFVYMzAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTU5MywgIkFTVVMgTjUxVm4iLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVhMywgIkFTVVMgTjYwSnYiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTViMywgIkFTVVMgTjYwRHAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVjMywgIkFTVVMgTjcwRGUiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVlMywgIkFTVVMgRjgzVCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjQzLCAiQVNVUyBNNjBKIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2NTMsICJBU1VTIFU1MCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjkzLCAiQVNVUyBGNTBOIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2YTMsICJBU1VTIEY1USIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNzIzLCAiQVNVUyBQODAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc0MywgIkFTVVMgVTgwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NzMsICJBU1VTIFUyMEEiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg4MywgIkFTVVMgRjgxU2UiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA3MSwgIlNvbnkgVkFJTyIsIEFMQzI2OV9BVVRPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxNDc1LCAiTGlmZWJvb2sgSUNIOU0tYmFzZWQiLCBBTEMyNjlfTElGRUJPT0spLAotCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDE3NzgsICJRdWFudGEgT04xIiwgQUxDMjY5X0RNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDExNWQsICJGU0MgQW1pbG8iLCBBTEMyNjlfRlVKSVRTVSksCi0JU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JlOSwgIlF1YW50YSBXaXN0cm9uIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZjgsICJRdWFudGEgRkwxIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OWEsICJRdWFudGEgRUwzIiwgQUxDMjY5X0RNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OWIsICJRdWFudGEgSlIxIiwgQUxDMjY5X0RNSUMpLAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzI2OV9wcmVzZXRzW10gPSB7Ci0JW0FMQzI2OV9CQVNJQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9iYXNlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2OV9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEMyNjlfUVVBTlRBX0ZMMV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9xdWFudGFfZmwxX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicywgYWxjMjY5X3F1YW50YV9mbDFfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjlfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzI2OV9xdWFudGFfZmwxX3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjlfcXVhbnRhX2ZsMV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsYzI2OV9xdWFudGFfZmwxX2luaXRfaG9vaywKLQl9LAotCVtBTEMyNjlfQU1JQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9sYXB0b3BfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OV9sYXB0b3BfYW5hbG9nX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicywKLQkJCQlhbGMyNjlfbGFwdG9wX2FtaWNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjlfbGFwdG9wX2FtaWNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY5X0RNSUNdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjlfbGFwdG9wX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjlfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLAotCQkJCWFsYzI2OV9sYXB0b3BfZG1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OV9sYXB0b3BfZG1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjlWQl9BTUlDXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY5dmJfbGFwdG9wX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjl2Yl9sYXB0b3BfYW5hbG9nX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjl2Yl9pbml0X3ZlcmJzLAotCQkJCWFsYzI2OXZiX2xhcHRvcF9hbWljX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY5dmJfbGFwdG9wX2FtaWNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY5VkJfRE1JQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OXZiX2xhcHRvcF9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjMjY5dmJfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OXZiX2luaXRfdmVyYnMsCi0JCQkJYWxjMjY5dmJfbGFwdG9wX2RtaWNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjl2Yl9sYXB0b3BfZG1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjlfRlVKSVRTVV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9mdWppdHN1X21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjlfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLAotCQkJCWFsYzI2OV9sYXB0b3BfZG1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OV9sYXB0b3BfZG1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjlfTElGRUJPT0tdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjlfbGlmZWJvb2tfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLCBhbGMyNjlfbGlmZWJvb2tfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjlfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzI2OV9saWZlYm9va191bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY5X2xpZmVib29rX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjMjY5X2xpZmVib29rX2luaXRfaG9vaywKLQl9LAotCVtBTEMyNzFfQUNFUl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9hc3VzX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjl2Yl9sYXB0b3BfZGlnaXRhbF9jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5X2luaXRfdmVyYnMsIGFsYzI3MV9hY2VyX2RtaWNfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5hZGNfbmlkcyA9IGFsYzI2Ml9kbWljX2FkY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjJfZG1pY19hZGNfbmlkcyksCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2Ml9kbWljX2NhcHNyY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjlfY2FwdHVyZV9zb3VyY2UsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjl2Yl9sYXB0b3BfZG1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotfTsKLQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGM2NjJfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzY2Ml9xdWlya3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5YTZlYS4uMDAwMDAwMAotLS0gYS9zb3VuZC9wY2kvaGRhL2FsYzY2Ml9xdWlya3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MDggKzAsMCBAQAotLyoKLSAqIEFMQzY2Mi9BTEM2NjMvQUxDNjY1L0FMQzY3MCBxdWlyayBtb2RlbHMKLSAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYwotICovCi0KLS8qIEFMQzY2MiBtb2RlbHMgKi8KLWVudW0gewotCUFMQzY2Ml9BVVRPLAotCUFMQzY2Ml8zU1RfMmNoX0RJRywKLQlBTEM2NjJfM1NUXzZjaF9ESUcsCi0JQUxDNjYyXzNTVF82Y2gsCi0JQUxDNjYyXzVTVF9ESUcsCi0JQUxDNjYyX0xFTk9WT18xMDFFLAotCUFMQzY2Ml9BU1VTX0VFRVBDX1A3MDEsCi0JQUxDNjYyX0FTVVNfRUVFUENfRVAyMCwKLQlBTEM2NjNfQVNVU19NNTFWQSwKLQlBTEM2NjNfQVNVU19HNzFWLAotCUFMQzY2M19BU1VTX0gxMywKLQlBTEM2NjNfQVNVU19HNTBWLAotCUFMQzY2Ml9FQ1MsCi0JQUxDNjYzX0FTVVNfTU9ERTEsCi0JQUxDNjYyX0FTVVNfTU9ERTIsCi0JQUxDNjYzX0FTVVNfTU9ERTMsCi0JQUxDNjYzX0FTVVNfTU9ERTQsCi0JQUxDNjYzX0FTVVNfTU9ERTUsCi0JQUxDNjYzX0FTVVNfTU9ERTYsCi0JQUxDNjYzX0FTVVNfTU9ERTcsCi0JQUxDNjYzX0FTVVNfTU9ERTgsCi0JQUxDMjcyX0RFTEwsCi0JQUxDMjcyX0RFTExfWk0xLAotCUFMQzI3Ml9TQU1TVU5HX05DMTAsCi0JQUxDNjYyX01PREVMX0xBU1QsCi19OwotCi0jZGVmaW5lIEFMQzY2Ml9ESUdPVVRfTklECTB4MDYKLSNkZWZpbmUgQUxDNjYyX0RJR0lOX05JRAkweDBhCi0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjYyX2RhY19uaWRzWzNdID0gewotCS8qIGZyb250LCByZWFyLCBjbGZlICovCi0JMHgwMiwgMHgwMywgMHgwNAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNzJfZGFjX25pZHNbMl0gPSB7Ci0JMHgwMiwgMHgwMwotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2NjJfYWRjX25pZHNbMl0gPSB7Ci0JLyogQURDMS0yICovCi0JMHgwOSwgMHgwOAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNzJfYWRjX25pZHNbMV0gPSB7Ci0JLyogQURDMS0yICovCi0JMHgwOCwKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjYyX2NhcHNyY19uaWRzWzJdID0geyAweDIyLCAweDIzIH07Ci1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI3Ml9jYXBzcmNfbmlkc1sxXSA9IHsgMHgyMyB9OwotCi0KLS8qIGlucHV0IE1VWCAqLwotLyogRklYTUU6IHNob3VsZCBiZSBhIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM2NjJfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDQsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzY2Ml9sZW5vdm9fMTAxZV9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMiwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MSB9LAotCQl7ICJMaW5lIiwgMHgyIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM2NjNfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDMsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQl9LAotfTsKLQotI2lmIDAgLyogc2V0IHRvIDEgZm9yIHRlc3Rpbmcgb3RoZXIgaW5wdXQgc291cmNlcyBiZWxvdyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI3Ml9uYzEwX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAxNiwKLQkuaXRlbXMgPSB7Ci0JCXsgIkF1dG9zZWxlY3QgTWljIiwgMHgwIH0sCi0JCXsgIkludGVybmFsIE1pYyIsIDB4MSB9LAotCQl7ICJJbi0weDAyIiwgMHgyIH0sCi0JCXsgIkluLTB4MDMiLCAweDMgfSwKLQkJeyAiSW4tMHgwNCIsIDB4NCB9LAotCQl7ICJJbi0weDA1IiwgMHg1IH0sCi0JCXsgIkluLTB4MDYiLCAweDYgfSwKLQkJeyAiSW4tMHgwNyIsIDB4NyB9LAotCQl7ICJJbi0weDA4IiwgMHg4IH0sCi0JCXsgIkluLTB4MDkiLCAweDkgfSwKLQkJeyAiSW4tMHgwYSIsIDB4MGEgfSwKLQkJeyAiSW4tMHgwYiIsIDB4MGIgfSwKLQkJeyAiSW4tMHgwYyIsIDB4MGMgfSwKLQkJeyAiSW4tMHgwZCIsIDB4MGQgfSwKLQkJeyAiSW4tMHgwZSIsIDB4MGUgfSwKLQkJeyAiSW4tMHgwZiIsIDB4MGYgfSwKLQl9LAotfTsKLSNlbmRpZgotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzY2Ml8zU1RfMmNoX21vZGVzWzFdID0gewotCXsgMiwgTlVMTCB9Ci19OwotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfM1NUX2NoMl9pbml0W10gPSB7Ci0JeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml8zU1RfY2g2X2luaXRbXSA9IHsKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM2NjJfM1NUXzZjaF9tb2Rlc1syXSA9IHsKLQl7IDIsIGFsYzY2Ml8zU1RfY2gyX2luaXQgfSwKLQl7IDYsIGFsYzY2Ml8zU1RfY2g2X2luaXQgfSwKLX07Ci0KLS8qCi0gKiAyY2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9zaXhzdGFja19jaDZfaW5pdFtdID0gewotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9zaXhzdGFja19jaDhfaW5pdFtdID0gewotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM2NjJfNXN0YWNrX21vZGVzWzJdID0gewotCXsgMiwgYWxjNjYyX3NpeHN0YWNrX2NoNl9pbml0IH0sCi0JeyA2LCBhbGM2NjJfc2l4c3RhY2tfY2g4X2luaXQgfSwKLX07Ci0KLS8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBSZWFyPTB4MTUsIENMRkU9MHgxNiwgU2lkZT0weDE3Ci0gKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEZyb250IE1pYz0weDE5LCBMaW5lLUluPTB4MWEsIEhQPTB4MWIKLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2Jhc2VfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JLypJbnB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4YiwgMHg0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4YiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHhiLCAweDAxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfM1NUXzJjaF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml8zU1RfNmNoX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2xlbm92b18xMDFlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml9lZWVwY19wNzAxX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2VlZXBjX2VwMjBfbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIk11dGVDdHJsIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDIsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDMsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c19vbmVfYmluZF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDIxLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYzX201MXZhX21peGVyW10gPSB7Ci0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzY2M19hc3VzX2JpbmRfbWFzdGVyX3ZvbCksCi0JSERBX0JJTkRfU1coIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAmYWxjNjYzX2FzdXNfb25lX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c190cmVlX2JpbmRfc3dpdGNoID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNSwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgyMSwgMywgMCwgSERBX09VVFBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2M190d29faHBfbTFfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190cmVlX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkYtTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRi1NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX2ZvdXJfYmluZF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE1LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYzX3R3b19ocF9tMl9taXhlcltdID0gewotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgJmFsYzY2M19hc3VzX2ZvdXJfYmluZF9zd2l0Y2gpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRi1NaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGLU1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml8xYmpkX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRi1NaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGLU1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX3R3b19iaW5kX21hc3Rlcl92b2wgPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfdm9sLAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwMiwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwNCwgMywgMCwgSERBX09VVFBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX3R3b19iaW5kX3N3aXRjaCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTYsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfYXN1c18yMWpkX2NsZmVfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAotCQkJCSZhbGM2NjNfYXN1c190d29fYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190d29fYmluZF9zd2l0Y2gpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfYXN1c18xNWpkX2NsZmVfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190d29fYmluZF9zd2l0Y2gpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfZzcxdl9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfZzUwdl9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfbW9kZTdfOF9hbGxfYmluZF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE1LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE3LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDIxLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfbW9kZTdfOF9zcF9iaW5kX3N3aXRjaCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTcsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfbW9kZTdfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X2FsbF9iaW5kX3N3aXRjaCksCi0JSERBX0JJTkRfVk9MKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X3NwX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lMSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50TWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50TWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfbW9kZThfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X2FsbF9iaW5kX3N3aXRjaCksCi0JSERBX0JJTkRfVk9MKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X3NwX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lMSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfY2htb2RlX21peGVyW10gPSB7Ci0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKLQkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAotCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAotCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfaW5pdF92ZXJic1tdID0gewotCS8qIEFEQzogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCS8qIFJlYXIgUGluOiBvdXRwdXQgMSAoMHgwZCkgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogQ0xGRSBQaW46IG91dHB1dCAyICgweDBlKSAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIExpbmUgSW4gcGluOiBpbnB1dCAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTGluZS0yIEluOiBIZWFkcGhvbmUgb3V0cHV0IChvdXRwdXQgMCAtIDB4MGMpICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCi0JLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFjLCAxZCwgMTQsIDE1LCAxNiwgMTcsIDBiICovCi0JLyogSW5wdXQgbWl4ZXIgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lYXBkX2luaXRfdmVyYnNbXSA9IHsKLQkvKiBhbHdheXMgdHJ1biBvbiBFQVBEICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfc3VlX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTENfRlJPTlRfRVZFTlR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyX2VlZXBjX3N1ZV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLS8qIFNldCBVbnNvbGljaXRlZCBFdmVudCovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lZWVwY19lcDIwX3N1ZV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19tNTF2YV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDkpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjNfMjFqZF9hbWljX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyXzFiamRfYW1pY19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzXzE1amRfYW1pY19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCS8qIEhlYWRwaG9uZSAqLwotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M190d29faHBfYW1pY19tMV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX3R3b19ocF9hbWljX20yX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19nNzF2X2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCS8qIHsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sICovCi0JLyogezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgKi8gLyogSGVhZHBob25lICovCi0KLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwJLyogSGVhZHBob25lICovCi0KLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTENfRlJPTlRfRVZFTlR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQ19NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX2c1MHZfaW5pdF92ZXJic1tdID0gewotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAkvKiBIZWFkcGhvbmUgKi8KLQotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lY3NfaW5pdF92ZXJic1tdID0gewotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMWZ9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjcyX2RlbGxfem0xX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDkpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNzJfZGVsbF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX21vZGU3X2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19tb2RlOF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjcyX2F1dG9fY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgdm9pZCBhbGM2NjJfbGVub3ZvXzEwMWVfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5kZXRlY3RfbGluZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbGluZXMgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgdm9pZCBhbGM2NjJfZWVlcGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlhbGMyNjJfaGlwcG8xX3NldHVwKGNvZGVjKTsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotc3RhdGljIHZvaWQgYWxjNjYyX2VlZXBjX2VwMjBfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxYjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY2M19tNTF2YV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKLQlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTI7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKiBNb2RlMSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgyMTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotLyogKioqKioqKioqKioqKioqKiogTW9kZTIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxjNjYyX21vZGUyX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotLyogKioqKioqKioqKioqKioqKiogTW9kZTMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxjNjYzX21vZGUzX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOwotCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKLQlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTk7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKiBNb2RlNCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTRfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgyMTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzFdID0gMHgwZTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotLyogKioqKioqKioqKioqKioqKiogTW9kZTUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxjNjYzX21vZGU1X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFsxXSA9IDB4MGU7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGU2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlNl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGU3ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlN19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGU4ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlOF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1sxXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY2M19nNzF2X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotCXNwZWMtPmRldGVjdF9saW5lID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9saW5lcyA9IDE7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLSNkZWZpbmUgYWxjNjYzX2c1MHZfc2V0dXAJYWxjNjYzX201MXZhX3NldHVwCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfZWNzX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMvTGluZUluIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljL0xpbmVJbiBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYy9MaW5lSW4gUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjcyX25jMTBfbWl4ZXJbXSA9IHsKLQkvKiBNYXN0ZXIgUGxheWJhY2sgYXV0b21hdGljYWxseSBjcmVhdGVkIGZyb20gU3BlYWtlciBhbmQgSGVhZHBob25lICovCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotCi0vKgotICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjNjYyX21vZGVsc1tBTEM2NjJfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzY2Ml8zU1RfMmNoX0RJR10JPSAiM3N0YWNrLWRpZyIsCi0JW0FMQzY2Ml8zU1RfNmNoX0RJR10JPSAiM3N0YWNrLTZjaC1kaWciLAotCVtBTEM2NjJfM1NUXzZjaF0JPSAiM3N0YWNrLTZjaCIsCi0JW0FMQzY2Ml81U1RfRElHXQk9ICI1c3RhY2stZGlnIiwKLQlbQUxDNjYyX0xFTk9WT18xMDFFXQk9ICJsZW5vdm8tMTAxZSIsCi0JW0FMQzY2Ml9BU1VTX0VFRVBDX1A3MDFdID0gImVlZXBjLXA3MDEiLAotCVtBTEM2NjJfQVNVU19FRUVQQ19FUDIwXSA9ICJlZWVwYy1lcDIwIiwKLQlbQUxDNjYyX0VDU10gPSAiZWNzIiwKLQlbQUxDNjYzX0FTVVNfTTUxVkFdID0gIm01MXZhIiwKLQlbQUxDNjYzX0FTVVNfRzcxVl0gPSAiZzcxdiIsCi0JW0FMQzY2M19BU1VTX0gxM10gPSAiaDEzIiwKLQlbQUxDNjYzX0FTVVNfRzUwVl0gPSAiZzUwdiIsCi0JW0FMQzY2M19BU1VTX01PREUxXSA9ICJhc3VzLW1vZGUxIiwKLQlbQUxDNjYyX0FTVVNfTU9ERTJdID0gImFzdXMtbW9kZTIiLAotCVtBTEM2NjNfQVNVU19NT0RFM10gPSAiYXN1cy1tb2RlMyIsCi0JW0FMQzY2M19BU1VTX01PREU0XSA9ICJhc3VzLW1vZGU0IiwKLQlbQUxDNjYzX0FTVVNfTU9ERTVdID0gImFzdXMtbW9kZTUiLAotCVtBTEM2NjNfQVNVU19NT0RFNl0gPSAiYXN1cy1tb2RlNiIsCi0JW0FMQzY2M19BU1VTX01PREU3XSA9ICJhc3VzLW1vZGU3IiwKLQlbQUxDNjYzX0FTVVNfTU9ERThdID0gImFzdXMtbW9kZTgiLAotCVtBTEMyNzJfREVMTF0JCT0gImRlbGwiLAotCVtBTEMyNzJfREVMTF9aTTFdCT0gImRlbGwtem0xIiwKLQlbQUxDMjcyX1NBTVNVTkdfTkMxMF0JPSAic2Ftc3VuZy1uYzEwIiwKLQlbQUxDNjYyX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM2NjJfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDkwODcsICJFQ1MiLCBBTEM2NjJfRUNTKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmQ2LCAiREVMTCIsIEFMQzI3Ml9ERUxMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmY0LCAiREVMTCBaTTEiLCBBTEMyNzJfREVMTF9aTTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwMDAsICJBU1VTIE41MFZtIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwOTIsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExNzMsICJBU1VTIEs3M0puIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExYzMsICJBU1VTIE03MFYiLCBBTEM2NjNfQVNVU19NT0RFMyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFkMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFmMywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTIwMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMwMywgIkFTVVMgRzYwSiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzMzLCAiQVNVUyBHNjBKeCIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM5LCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2UzLCAiQVNVUyBONzFKQSIsIEFMQzY2M19BU1VTX01PREU3KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDYzLCAiQVNVUyBONzEiLCBBTEM2NjNfQVNVU19NT0RFNyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTRkMywgIkFTVVMgRzcyIiwgQUxDNjYzX0FTVVNfTU9ERTgpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1NjMsICJBU1VTIE45MCIsIEFMQzY2M19BU1VTX01PREUzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNWQzLCAiQVNVUyBONTBTRiBGNTBTRiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNmMzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNmYzLCAiQVNVUyBLNDBDIEs1MEMiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTczMywgIkFTVVMgTjgxRGUiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc1MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc2MywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFNiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc2NSwgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFNiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc4MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc5MywgIkFTVVMgRjUwR1giLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTdiMywgIkFTVVMgRjcwU0wiLCBBTEM2NjNfQVNVU19NT0RFMyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTdjMywgIkFTVVMgVVgyMCIsIEFMQzY2M19BU1VTX001MVZBKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxN2YzLCAiQVNVUyBYNThMRSIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODEzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODIzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREU1KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODMzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREU2KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODQzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODUzLCAiQVNVUyBGNTBaIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NjQsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzYsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzgsICJBU1VTIE01MVZBIiwgQUxDNjYzX0FTVVNfTTUxVkEpLAotCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg3OCwgIkFTVVMgTTUwVnIiLCBBTEM2NjNfQVNVU19NT0RFMSksKi8KLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODkzLCAiQVNVUyBNNTBWbSIsIEFMQzY2M19BU1VTX01PREUzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODk0LCAiQVNVUyBYNTUiLCBBTEM2NjNfQVNVU19NT0RFMyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MThiMywgIkFTVVMgTjgwVmMiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MThjMywgIkFTVVMgVlg1IiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4ZDMsICJBU1VTIE44MVRlIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4ZjMsICJBU1VTIE41MDVUcCIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTAzLCAiQVNVUyBGNUdMIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5MTMsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5MzMsICJBU1VTIEY4MFEiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk0MywgIkFTVVMgVngzViIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTUzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTYzLCAiQVNVUyBYNzFDIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5ODMsICJBU1VTIE41MDUxQSIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTkzLCAiQVNVUyBOMjAiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlhMywgIkFTVVMgRzUwViIsIEFMQzY2M19BU1VTX0c1MFYpLAotCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlhMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksKi8KLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWIzLCAiQVNVUyBGN1oiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTljMywgIkFTVVMgRjVaL0Y2eCIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWQzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX001MVZBKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWUzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWYzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREU0KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MjkwLCAiQVNVUyBQNUdDLU1YIiwgQUxDNjYyXzNTVF82Y2hfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MmExLCAiQVNVUyBFZWVwYyIsIEFMQzY2Ml9BU1VTX0VFRVBDX1A3MDEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgyZDEsICJBU1VTIEVlZXBjIEVQMjAiLCBBTEM2NjJfQVNVU19FRUVQQ19FUDIwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA1YiwgMHgwY2Q2LCAiRm94Y29ubiIsIEFMQzY2Ml9FQ1MpLAotCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDBkNDcsICJGb3hjb25uIDQ1Q01YLzQ1R01YLzQ1Q01YLUsiLAotCQkgICAgICBBTEM2NjJfM1NUXzZjaF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmNmUsICJUb3NoaWJhIE5CMjB4IiwgQUxDNjYyX0FVVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGNhMDAsICJTYW1zdW5nIE5DMTAiLCBBTEMyNzJfU0FNU1VOR19OQzEwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhhMDAyLCAiR2lnYWJ5dGUgOTQ1R0NNLVMyTCIsCi0JCSAgICAgIEFMQzY2Ml8zU1RfNmNoX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MjMwNCwgIlF1YW50YSBXSDEiLCBBTEM2NjNfQVNVU19IMTMpLAotCVNORF9QQ0lfUVVJUksoMHgxNTY1LCAweDgyMGYsICJCaW9zdGFyIFRBNzgwRyBNMisiLCBBTEM2NjJfM1NUXzZjaF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNjMxLCAweGMxMGMsICJQQiBSUzY1IiwgQUxDNjYzX0FTVVNfTTUxVkEpLAotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDEwMWUsICJMZW5vdm8iLCBBTEM2NjJfTEVOT1ZPXzEwMUUpLAotCVNORF9QQ0lfUVVJUksoMHgxODQ5LCAweDM2NjIsICJBU1JPQ0sgSzEwTjc4RnVsbEhELWhTTEkgUjMuMCIsCi0JCQkJCUFMQzY2Ml8zU1RfNmNoX0RJRyksCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTg1NCwgMHhmMDAwLCAweDIwMDAsICJBU1VTIEgxMy0yMDB4IiwKLQkJCSAgIEFMQzY2M19BU1VTX0gxMyksCi0JU05EX1BDSV9RVUlSSygweDE5OTEsIDB4NTYyOCwgIk9yZGlzc2ltbyBFVkUiLCBBTEM2NjJfTEVOT1ZPXzEwMUUpLAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzY2Ml9wcmVzZXRzW10gPSB7Ci0JW0FMQzY2Ml8zU1RfMmNoX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2Ml8zU1RfMmNoX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywgYWxjNjYyX2VhcGRfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDNjYyX0RJR0lOX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM2NjJfM1NUXzZjaF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM2NjJfM1NUXzZjaF9taXhlciwgYWxjNjYyX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsIGFsYzY2Ml9lYXBkX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkuZGlnX2luX25pZCA9IEFMQzY2Ml9ESUdJTl9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzZjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzZjaF9tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjNjYyX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzY2Ml8zU1RfNmNoXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyXzNTVF82Y2hfbWl4ZXIsIGFsYzY2Ml9jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLCBhbGM2NjJfZWFwZF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM2NjJfNVNUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2Ml9iYXNlX21peGVyLCBhbGM2NjJfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywgYWxjNjYyX2VhcGRfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDNjYyX0RJR0lOX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml81c3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzVzdGFja19tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM2NjJfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDNjYyX0xFTk9WT18xMDFFXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyX2xlbm92b18xMDFlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9zdWVfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9sZW5vdm9fMTAxZV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYyX2xlbm92b18xMDFlX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2Ml9BU1VTX0VFRVBDX1A3MDFdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjJfZWVlcGNfcDcwMV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWVlcGNfc3VlX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYyX2VlZXBjX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2Ml9BU1VTX0VFRVBDX0VQMjBdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjJfZWVlcGNfZXAyMF9taXhlciwKLQkJCSAgICBhbGM2NjJfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lZWVwY19lcDIwX3N1ZV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjNjYyX2xlbm92b18xMDFlX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjJfZWVlcGNfZXAyMF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjJfRUNTXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyX2Vjc19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWNzX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYyX2VlZXBjX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX001MVZBXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M19tNTF2YV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfRzcxVl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19nNzF2X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M19nNzF2X2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2M19nNzF2X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX0gxM10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19tNTF2YV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfbTUxdmFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfRzUwVl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19nNTB2X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M19nNTB2X2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjNjYzX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfZzUwdl9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjNfQVNVU19NT0RFMV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19tNTF2YV9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzXzIxamRfYW1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGUxX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2Ml9BU1VTX01PREUyXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyXzFiamRfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml8xYmpkX2FtaWNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYyX21vZGUyX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX01PREUzXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX3R3b19ocF9tMV9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzX3R3b19ocF9hbWljX20xX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfTU9ERTRdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfYXN1c18yMWpkX2NsZmVfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M18yMWpkX2FtaWNfaW5pdF92ZXJic30sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGU0X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX01PREU1XSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX2FzdXNfMTVqZF9jbGZlX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfMTVqZF9hbWljX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTVfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfTU9ERTZdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfdHdvX2hwX20yX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfdHdvX2hwX2FtaWNfbTJfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2M19tb2RlNl9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjNfQVNVU19NT0RFN10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19tb2RlN19taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzX21vZGU3X2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTdfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfTU9ERThdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfbW9kZThfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M19tb2RlOF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGU4X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI3Ml9ERUxMXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNzJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGMyNzJfZGVsbF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjcyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjcyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuYWRjX25pZHMgPSBhbGMyNzJfYWRjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI3Ml9hZGNfbmlkcyksCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI3Ml9jYXBzcmNfbmlkcywKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjcyX0RFTExfWk0xXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGMyNzJfZGVsbF96bTFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI3Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI3Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmFkY19uaWRzID0gYWxjNjYyX2FkY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gMSwKLQkJLmNhcHNyY19uaWRzID0gYWxjNjYyX2NhcHNyY19uaWRzLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2M19tNTF2YV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNzJfU0FNU1VOR19OQzEwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjcyX25jMTBfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzXzIxamRfYW1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjcyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjcyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS8qLmlucHV0X211eCA9ICZhbGMyNzJfbmMxMF9jYXB0dXJlX3NvdXJjZSwqLwotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTRfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGM2ODBfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzY4MF9xdWlya3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlYjIyNy4uMDAwMDAwMAotLS0gYS9zb3VuZC9wY2kvaGRhL2FsYzY4MF9xdWlya3MuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogQUxDNjgwIHF1aXJrIG1vZGVscwotICogaW5jbHVkZWQgYnkgcGF0Y2hfcmVhbHRlay5jCi0gKi8KLQotLyogQUxDNjgwIG1vZGVscyAqLwotZW51bSB7Ci0JQUxDNjgwX0FVVE8sCi0JQUxDNjgwX0JBU0UsCi0JQUxDNjgwX01PREVMX0xBU1QsCi19OwotCi0jZGVmaW5lIEFMQzY4MF9ESUdJTl9OSUQJQUxDODgwX0RJR0lOX05JRAotI2RlZmluZSBBTEM2ODBfRElHT1VUX05JRAlBTEM4ODBfRElHT1VUX05JRAotI2RlZmluZSBhbGM2ODBfbW9kZXMJCWFsYzI2MF9tb2RlcwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY4MF9kYWNfbmlkc1szXSA9IHsKLQkvKiBMb3V0MSwgTG91dDIsIGhwICovCi0JMHgwMiwgMHgwMywgMHgwNAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2ODBfYWRjX25pZHNbM10gPSB7Ci0JLyogQURDMC0yICovCi0JLyogRE1JQywgTUlDLCBMaW5lLWluKi8KLQkweDA3LCAweDA4LCAweDA5Ci19OwotCi0vKgotICogQW5hbG9nIGNhcHR1cmUgQURDIGNnYW5nZQotICovCi1zdGF0aWMgaGRhX25pZF90IGFsYzY4MF9nZXRfY3VyX2FkYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdGF0aWMgaGRhX25pZF90IHBpbnNbXSA9IHsweDE4LCAweDE5fTsKLQlzdGF0aWMgaGRhX25pZF90IGFkY3NbXSA9IHsweDA4LCAweDA5fTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBpbnMpOyBpKyspIHsKLQkJaWYgKCFpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIHBpbnNbaV0pKQotCQkJY29udGludWU7Ci0JCWlmIChzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCBwaW5zW2ldKSkKLQkJCXJldHVybiBhZGNzW2ldOwotCX0KLQlyZXR1cm4gMHgwNzsKLX0KLQotc3RhdGljIHZvaWQgYWxjNjgwX3JlY19hdXRvc3dpdGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBuaWQgPSBhbGM2ODBfZ2V0X2N1cl9hZGMoY29kZWMpOwotCWlmIChzcGVjLT5jdXJfYWRjICYmIG5pZCAhPSBzcGVjLT5jdXJfYWRjKSB7Ci0JCV9fc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+Y3VyX2FkYywgMSk7Ci0JCXNwZWMtPmN1cl9hZGMgPSBuaWQ7Ci0JCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWQsCi0JCQkJCSAgIHNwZWMtPmN1cl9hZGNfc3RyZWFtX3RhZywgMCwKLQkJCQkJICAgc3BlYy0+Y3VyX2FkY19mb3JtYXQpOwotCX0KLX0KLQotc3RhdGljIGludCBhbGM2ODBfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAotCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBmb3JtYXQsCi0JCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaGRhX25pZF90IG5pZCA9IGFsYzY4MF9nZXRfY3VyX2FkYyhjb2RlYyk7Ci0KLQlzcGVjLT5jdXJfYWRjID0gbmlkOwotCXNwZWMtPmN1cl9hZGNfc3RyZWFtX3RhZyA9IHN0cmVhbV90YWc7Ci0Jc3BlYy0+Y3VyX2FkY19mb3JtYXQgPSBmb3JtYXQ7Ci0Jc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5pZCwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbGM2ODBfY2FwdHVyZV9wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAotCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNuZF9oZGFfY29kZWNfY2xlYW51cF9zdHJlYW0oY29kZWMsIHNwZWMtPmN1cl9hZGMpOwotCXNwZWMtPmN1cl9hZGMgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFsYzY4MF9wY21fYW5hbG9nX2F1dG9fY2FwdHVyZSA9IHsKLQkuc3Vic3RyZWFtcyA9IDEsIC8qIGNhbiBiZSBvdmVycmlkZGVuICovCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDIsCi0JLyogTklEIGlzIHNldCBpbiBhbGNfYnVpbGRfcGNtcyAqLwotCS5vcHMgPSB7Ci0JCS5wcmVwYXJlID0gYWxjNjgwX2NhcHR1cmVfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gYWxjNjgwX2NhcHR1cmVfcGNtX2NsZWFudXAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY4MF9iYXNlX21peGVyW10gPSB7Ci0JLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4NCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTIsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY4MF9iaW5kX2NhcF92b2wgPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfdm9sLAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwNywgMywgMCwgSERBX0lOUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA4LCAzLCAwLCBIREFfSU5QVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDksIDMsIDAsIEhEQV9JTlBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY4MF9iaW5kX2NhcF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA3LCAzLCAwLCBIREFfSU5QVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDgsIDMsIDAsIEhEQV9JTlBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOSwgMywgMCwgSERBX0lOUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjgwX21hc3Rlcl9jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0JJTkRfVk9MKCJDYXB0dXJlIFZvbHVtZSIsICZhbGM2ODBfYmluZF9jYXBfdm9sKSwKLQlIREFfQklORF9TVygiQ2FwdHVyZSBTd2l0Y2giLCAmYWxjNjgwX2JpbmRfY2FwX3N3aXRjaCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2ODBfaW5pdF92ZXJic1tdID0gewotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQotCXsweDE2LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCAgIHwgQUNfVVNSU1BfRU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19NSUNfRVZFTlQgIHwgQUNfVVNSU1BfRU59LAotCXsweDE5LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19NSUNfRVZFTlQgIHwgQUNfVVNSU1BfRU59LAotCi0JeyB9Ci19OwotCi0vKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGM2ODBfYmFzZV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTY7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLm51bV9pbnB1dHMgPSAyOwotCXNwZWMtPmF1dG9jZmcuaW5wdXRzWzBdLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+YXV0b2NmZy5pbnB1dHNbMF0udHlwZSA9IEFVVE9fUElOX01JQzsKLQlzcGVjLT5hdXRvY2ZnLmlucHV0c1sxXS5waW4gPSAweDE5OwotCXNwZWMtPmF1dG9jZmcuaW5wdXRzWzFdLnR5cGUgPSBBVVRPX1BJTl9MSU5FX0lOOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjNjgwX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkgICB1bnNpZ25lZCBpbnQgcmVzKQotewotCWlmICgocmVzID4+IDI2KSA9PSBBTENfSFBfRVZFTlQpCi0JCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JaWYgKChyZXMgPj4gMjYpID09IEFMQ19NSUNfRVZFTlQpCi0JCWFsYzY4MF9yZWNfYXV0b3N3aXRjaChjb2RlYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY4MF9pbml0aG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlhbGNfaHBfYXV0b211dGUoY29kZWMpOwotCWFsYzY4MF9yZWNfYXV0b3N3aXRjaChjb2RlYyk7Ci19Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGM2ODBfbW9kZWxzW0FMQzY4MF9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDNjgwX0JBU0VdCQk9ICJiYXNlIiwKLQlbQUxDNjgwX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM2ODBfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyZjMsICJBU1VTIE5YOTAiLCBBTEM2ODBfQkFTRSksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjNjgwX3ByZXNldHNbXSA9IHsKLQlbQUxDNjgwX0JBU0VdID0gewotCQkubWl4ZXJzID0geyBhbGM2ODBfYmFzZV9taXhlciB9LAotCQkuY2FwX21peGVyID0gIGFsYzY4MF9tYXN0ZXJfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY4MF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjgwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjgwX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2ODBfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY4MF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2ODBfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsYzY4MF91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjgwX2Jhc2Vfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGM2ODBfaW5pdGhvb2ssCi0KLQl9LAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjODYxX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGM4NjFfcXVpcmtzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTllYzYuLjAwMDAwMDAKLS0tIGEvc291bmQvcGNpL2hkYS9hbGM4NjFfcXVpcmtzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotLyoKLSAqIEFMQzY2MC9BTEM4NjEgcXVpcmsgbW9kZWxzCi0gKiBpbmNsdWRlZCBieSBwYXRjaF9yZWFsdGVrLmMKLSAqLwotCi0vKiBBTEM4NjEgbW9kZWxzICovCi1lbnVtIHsKLQlBTEM4NjFfQVVUTywKLQlBTEM4NjFfM1NULAotCUFMQzY2MF8zU1QsCi0JQUxDODYxXzNTVF9ESUcsCi0JQUxDODYxXzZTVF9ESUcsCi0JQUxDODYxX1VOSVdJTExfTTMxLAotCUFMQzg2MV9UT1NISUJBLAotCUFMQzg2MV9BU1VTLAotCUFMQzg2MV9BU1VTX0xBUFRPUCwKLQlBTEM4NjFfTU9ERUxfTEFTVCwKLX07Ci0KLS8qCi0gKiAgQUxDODYxIGNoYW5uZWwgc291cmNlIHNldHRpbmcgKDIvNiBjaGFubmVsIHNlbGVjdGlvbiBmb3IgMy1zdGFjaykKLSAqLwotCi0vKgotICogc2V0IHRoZSBwYXRoIHdheXMgZm9yIDIgY2hhbm5lbCBvdXRwdXQKLSAqIG5lZWQgdG8gc2V0IHRoZSBjb2RlYyBsaW5lIG91dCBhbmQgbWljIDEgcGluIHdpZGdldHMgdG8gaW5wdXRzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3RocmVlc3RhY2tfY2gyX2luaXRbXSA9IHsKLQkvKiBzZXQgcGluIHdpZGdldCAxQWggKGxpbmUgaW4pIGZvciBpbnB1dCAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxLzIpIGZvciBpbnB1dCwgZm9yIG1pYyBhbHNvIGVuYWJsZQotCSAqIHRoZSB2cmVmCi0JICovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjIH0sCi0jaWYgMAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpIH0sIC8qbGluZS1pbiovCi0jZW5kaWYKLQl7IH0gLyogZW5kICovCi19OwotLyoKLSAqIDZjaCBtb2RlCi0gKiBuZWVkIHRvIHNldCB0aGUgY29kZWMgbGluZSBvdXQgYW5kIG1pYyAxIHBpbiB3aWRnZXRzIHRvIG91dHB1dHMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdGhyZWVzdGFja19jaDZfaW5pdFtdID0gewotCS8qIHNldCBwaW4gd2lkZ2V0IDFBaCAobGluZSBpbikgZm9yIG91dHB1dCAoQmFjayBTdXJyb3VuZCkqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxKSBmb3Igb3V0cHV0IChDTEZFKSovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQotCXsgMHgwYywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0KLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MCB9LAotI2lmIDAKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSkgfSwgLyptaWMqLwotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKSB9LCAvKmxpbmUgaW4qLwotI2VuZGlmCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg2MV90aHJlZXN0YWNrX21vZGVzWzJdID0gewotCXsgMiwgYWxjODYxX3RocmVlc3RhY2tfY2gyX2luaXQgfSwKLQl7IDYsIGFsYzg2MV90aHJlZXN0YWNrX2NoNl9pbml0IH0sCi19OwotLyogU2V0IG1pYzEgYXMgaW5wdXQgYW5kIHVubXV0ZSB0aGUgbWl4ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3VuaXdpbGxfbTMxX2NoMl9pbml0W10gPSB7Ci0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSkgfSwgLyptaWMqLwotCXsgfSAvKiBlbmQgKi8KLX07Ci0vKiBTZXQgbWljMSBhcyBvdXRwdXQgYW5kIG11dGUgbWl4ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3VuaXdpbGxfbTMxX2NoNF9pbml0W10gPSB7Ci0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSkgfSwgLyptaWMqLwotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjFfdW5pd2lsbF9tMzFfbW9kZXNbMl0gPSB7Ci0JeyAyLCBhbGM4NjFfdW5pd2lsbF9tMzFfY2gyX2luaXQgfSwKLQl7IDQsIGFsYzg2MV91bml3aWxsX20zMV9jaDRfaW5pdCB9LAotfTsKLQotLyogU2V0IG1pYzEgYW5kIGxpbmUtaW4gYXMgaW5wdXQgYW5kIHVubXV0ZSB0aGUgbWl4ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX2FzdXNfY2gyX2luaXRbXSA9IHsKLQkvKiBzZXQgcGluIHdpZGdldCAxQWggKGxpbmUgaW4pIGZvciBpbnB1dCAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxLzIpIGZvciBpbnB1dCwgZm9yIG1pYyBhbHNvIGVuYWJsZQotCSAqIHRoZSB2cmVmCi0JICovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjIH0sCi0jaWYgMAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpIH0sIC8qbGluZS1pbiovCi0jZW5kaWYKLQl7IH0gLyogZW5kICovCi19OwotLyogU2V0IG1pYzEgbmFkIGxpbmUtaW4gYXMgb3V0cHV0IGFuZCBtdXRlIG1peGVyICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2NoNl9pbml0W10gPSB7Ci0JLyogc2V0IHBpbiB3aWRnZXQgMUFoIChsaW5lIGluKSBmb3Igb3V0cHV0IChCYWNrIFN1cnJvdW5kKSovCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQkvKiB7IDB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sICovCi0JLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxKSBmb3Igb3V0cHV0IChDTEZFKSovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQkvKiB7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sICovCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCXsgMHgwZCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwIH0sCi0jaWYgMAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpIH0sIC8qbGluZSBpbiovCi0jZW5kaWYKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxX2FzdXNfbW9kZXNbMl0gPSB7Ci0JeyAyLCBhbGM4NjFfYXN1c19jaDJfaW5pdCB9LAotCXsgNiwgYWxjODYxX2FzdXNfY2g2X2luaXQgfSwKLX07Ci0KLS8qIHBhdGNoLUFMQzg2MSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX2Jhc2VfbWl4ZXJbXSA9IHsKLSAgICAgICAgLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwNiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDA0LCAweDAsIEhEQV9PVVRQVVQpLAotCi0gICAgICAgIC8qSW5wdXQgbWl4ZXIgY29udHJvbCAqLwotCS8qIEhEQV9DT0RFQ19WT0xVTUUoIklucHV0IFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JICAgSERBX0NPREVDX01VVEUoIklucHV0IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksICovCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwMSwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFhLCAweDAzLCBIREFfSU5QVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV8zU1RfbWl4ZXJbXSA9IHsKLSAgICAgICAgLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwNiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQkvKkhEQV9DT0RFQ19NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MDQsIDB4MCwgSERBX09VVFBVVCksICovCi0KLQkvKiBJbnB1dCBtaXhlciBjb250cm9sICovCi0JLyogSERBX0NPREVDX1ZPTFVNRSgiSW5wdXQgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQkgICBIREFfQ09ERUNfTVVURSgiSW5wdXQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAxLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MDMsIEhEQV9JTlBVVCksCi0KLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAotCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCi0JCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCi0JCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCi0gICAgICAgICAgICAgICAgLnByaXZhdGVfdmFsdWUgPSBBUlJBWV9TSVpFKGFsYzg2MV90aHJlZXN0YWNrX21vZGVzKSwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfdG9zaGliYV9taXhlcltdID0gewotICAgICAgICAvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0KLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX3VuaXdpbGxfbTMxX21peGVyW10gPSB7Ci0gICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MDYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JLypIREFfQ09ERUNfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDA0LCAweDAsIEhEQV9PVVRQVVQpLCAqLwotCi0JLyogSW5wdXQgbWl4ZXIgY29udHJvbCAqLwotCS8qIEhEQV9DT0RFQ19WT0xVTUUoIklucHV0IFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JICAgSERBX0NPREVDX01VVEUoIklucHV0IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksICovCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwMSwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFhLCAweDAzLCBIREFfSU5QVVQpLAotCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKLQkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAotCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAotCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAotICAgICAgICAgICAgICAgIC5wcml2YXRlX3ZhbHVlID0gQVJSQVlfU0laRShhbGM4NjFfdW5pd2lsbF9tMzFfbW9kZXMpLAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV9hc3VzX21peGVyW10gPSB7Ci0gICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MDYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNCwgMHgwLCBIREFfT1VUUFVUKSwKLQotCS8qIElucHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJJbnB1dCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnB1dCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MDEsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX09VVFBVVCksCi0KLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAotCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCi0JCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCi0JCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCi0gICAgICAgICAgICAgICAgLnByaXZhdGVfdmFsdWUgPSBBUlJBWV9TSVpFKGFsYzg2MV9hc3VzX21vZGVzKSwKLQl9LAotCXsgfQotfTsKLQotLyogYWRkaXRpb25hbCBtaXhlciAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV9hc3VzX2xhcHRvcF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCXsgfQotfTsKLQotLyoKLSAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYmFzZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCS8qIHBvcnQtQSBmb3Igc3Vycm91bmQgKHJlYXIgcGFuZWwpICovCi0JeyAweDBlLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQl7IDB4MGUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1CIGZvciBtaWMtaW4gKHJlYXIgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1DIGZvciBsaW5lLWluIChyZWFyIHBhbmVsKSAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcG9ydC1EIGZvciBGcm9udCAqLwotCXsgMHgwYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LAotCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBwb3J0LUYgZm9yIG1pYy1pbiAoZnJvbnQgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1HIGZvciBDTEZFIChyZWFyIHBhbmVsKSAqLwotCXsgMHgxZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDFmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtSCBmb3Igc2lkZSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCXsgMHgyMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBDRC1pbiAqLwotCXsgMHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcm91dGUgZnJvbnQgbWljIHRvIEFEQzEqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogVW5tdXRlIE1peGVyIDE0IChtaWMpIDFjIChMaW5lIGluKSovCi0JezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLSAgICAgICAgezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JLyogVW5tdXRlIFN0ZXJlbyBNaXhlciAxNSAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGN9LCAvKiBPdXRwdXQgMH4xMiBzdGVwICovCi0KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIGhwIHVzZWQgREFDIDMgKEZyb250KSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLSAgICAgICAgezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV90aHJlZXN0YWNrX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JLyogcG9ydC1BIGZvciBzdXJyb3VuZCAocmVhciBwYW5lbCkgKi8KLQl7IDB4MGUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIHBvcnQtQiBmb3IgbWljLWluIChyZWFyIHBhbmVsKSB3aXRoIHZyZWYgKi8KLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHBvcnQtQyBmb3IgbGluZS1pbiAocmVhciBwYW5lbCkgKi8KLQl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAotCS8qIHBvcnQtRCBmb3IgRnJvbnQgKi8KLQl7IDB4MGIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCXsgMHgwYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBwb3J0LUUgZm9yIEhQIG91dCAoZnJvbnQgcGFuZWwpICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzAgfSwKLQkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KLQl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MWYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIHBvcnQtSCBmb3Igc2lkZSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIENELWluICovCi0JeyAweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiByb3V0ZSBmcm9udCBtaWMgdG8gQURDMSovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogVW5tdXRlIE1peGVyIDE0IChtaWMpIDFjIChMaW5lIGluKSovCi0JezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLSAgICAgICAgezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JLyogVW5tdXRlIFN0ZXJlbyBNaXhlciAxNSAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGN9LCAvKiBPdXRwdXQgMH4xMiBzdGVwICovCi0KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIGhwIHVzZWQgREFDIDMgKEZyb250KSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLSAgICAgICAgezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdW5pd2lsbF9tMzFfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KLQkgKi8KLQkvKiBwb3J0LUEgZm9yIHN1cnJvdW5kIChyZWFyIHBhbmVsKSAqLwotCXsgMHgwZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JLyogcG9ydC1CIGZvciBtaWMtaW4gKHJlYXIgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1DIGZvciBsaW5lLWluIChyZWFyIHBhbmVsKSAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcG9ydC1EIGZvciBGcm9udCAqLwotCXsgMHgwYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KLQkvKiB0aGlzIGhhcyB0byBiZSBzZXQgdG8gVlJFRjgwICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KLQl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MWYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIHBvcnQtSCBmb3Igc2lkZSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIENELWluICovCi0JeyAweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiByb3V0ZSBmcm9udCBtaWMgdG8gQURDMSovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogVW5tdXRlIE1peGVyIDE0IChtaWMpIDFjIChMaW5lIGluKSovCi0JezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLSAgICAgICAgezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JLyogVW5tdXRlIFN0ZXJlbyBNaXhlciAxNSAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGN9LCAvKiBPdXRwdXQgMH4xMiBzdGVwICovCi0KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIGhwIHVzZWQgREFDIDMgKEZyb250KSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLSAgICAgICAgezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYXN1c19pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCS8qIHBvcnQtQSBmb3Igc3Vycm91bmQgKHJlYXIgcGFuZWwpCi0JICogYWNjb3JkaW5nIHRvIGNvZGVjIzAgdGhpcyBpcyB0aGUgSFAgamFjawotCSAqLwotCXsgMHgwZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sIC8qIHdhcyAweDAwICovCi0JLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCi0JeyAweDBlLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAotCS8qIHBvcnQtQiBmb3IgbWljLWluIChyZWFyIHBhbmVsKSB3aXRoIHZyZWYgKi8KLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHBvcnQtQyBmb3IgbGluZS1pbiAocmVhciBwYW5lbCkgKi8KLQl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAotCS8qIHBvcnQtRCBmb3IgRnJvbnQgKi8KLQl7IDB4MGIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCXsgMHgwYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBwb3J0LUUgZm9yIEhQIG91dCAoZnJvbnQgcGFuZWwpICovCi0JLyogdGhpcyBoYXMgdG8gYmUgc2V0IHRvIFZSRUY4MCAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtRiBmb3IgbWljLWluIChmcm9udCBwYW5lbCkgd2l0aCB2cmVmICovCi0JeyAweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQkvKiBwb3J0LUcgZm9yIENMRkUgKHJlYXIgcGFuZWwpICovCi0JeyAweDFmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQkvKiBwb3J0LUggZm9yIHNpZGUgKHJlYXIgcGFuZWwpICovCi0JeyAweDIwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQkvKiBDRC1pbiAqLwotCXsgMHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcm91dGUgZnJvbnQgbWljIHRvIEFEQzEqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCS8qIFVubXV0ZSBEQUMwfjMgJiBzcGRpZiBvdXQqLwotCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiBVbm11dGUgTWl4ZXIgMTQgKG1pYykgMWMgKExpbmUgaW4pKi8KLQl7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0gICAgICAgIHsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQkvKiBVbm11dGUgU3RlcmVvIE1peGVyIDE1ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwY30sIC8qIE91dHB1dCAwfjEyIHN0ZXAgKi8KLQotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKLQl7IH0KLX07Ci0KLS8qIGFkZGl0aW9uYWwgaW5pdCB2ZXJicyBmb3IgQVNVUyBsYXB0b3BzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2xhcHRvcF9pbml0X3ZlcmJzW10gPSB7Ci0JeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDUgfSwgLyogSFAtb3V0ICovCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKSB9LCAvKiBtdXRlIGxpbmUtaW4gKi8KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3Rvc2hpYmFfaW5pdF92ZXJic1tdID0gewotCXsweDBmLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQotCXsgfQotfTsKLQotLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjODYxX3Rvc2hpYmFfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JdW5zaWduZWQgaW50IHByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDBmKTsKLQotCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNiwgSERBX0lOUFVULCAwLAotCQkJCSBIREFfQU1QX01VVEUsIHByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwKTsKLQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MWEsIEhEQV9JTlBVVCwgMywKLQkJCQkgSERBX0FNUF9NVVRFLCBwcmVzZW50ID8gMCA6IEhEQV9BTVBfTVVURSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg2MV90b3NoaWJhX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVzKQotewotCWlmICgocmVzID4+IDI2KSA9PSBBTENfSFBfRVZFTlQpCi0JCWFsYzg2MV90b3NoaWJhX2F1dG9tdXRlKGNvZGVjKTsKLX0KLQotI2RlZmluZSBBTEM4NjFfRElHT1VUX05JRAkweDA3Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjFfOGNoX21vZGVzWzFdID0gewotCXsgOCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MV9kYWNfbmlkc1s0XSA9IHsKLQkvKiBmcm9udCwgc3Vycm91bmQsIGNsZmUsIHNpZGUgKi8KLQkweDAzLCAweDA2LCAweDA1LCAweDA0Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY2MF9kYWNfbmlkc1szXSA9IHsKLQkvKiBmcm9udCwgY2xmZSwgc3Vycm91bmQgKi8KLQkweDAzLCAweDA1LCAweDA2Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MV9hZGNfbmlkc1sxXSA9IHsKLQkvKiBBREMwLTIgKi8KLQkweDA4LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MV9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNSwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDMgfSwKLQkJeyAiTGluZSIsIDB4MSB9LAotCQl7ICJDRCIsIDB4NCB9LAotCQl7ICJNaXhlciIsIDB4NSB9LAotCX0sCi19OwotCi0vKgotICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjODYxX21vZGVsc1tBTEM4NjFfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzg2MV8zU1RdCQk9ICIzc3RhY2siLAotCVtBTEM2NjBfM1NUXQkJPSAiM3N0YWNrLTY2MCIsCi0JW0FMQzg2MV8zU1RfRElHXQk9ICIzc3RhY2stZGlnIiwKLQlbQUxDODYxXzZTVF9ESUddCT0gIjZzdGFjay1kaWciLAotCVtBTEM4NjFfVU5JV0lMTF9NMzFdCT0gInVuaXdpbGwtbTMxIiwKLQlbQUxDODYxX1RPU0hJQkFdCT0gInRvc2hpYmEiLAotCVtBTEM4NjFfQVNVU10JCT0gImFzdXMiLAotCVtBTEM4NjFfQVNVU19MQVBUT1BdCT0gImFzdXMtbGFwdG9wIiwKLQlbQUxDODYxX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4NjFfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMDUsICJBU1VTIFc3SiIsIEFMQzg2MV8zU1QpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzUsICJBU1VTIEYyLzMiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzgsICJBU1VTIEYyLzMiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzOTMsICJBU1VTIiwgQUxDODYxX0FTVVMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzZDcsICJBU1VTIEE5cnAiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxY2IsICJBU1VTIFAxLUFIMiIsIEFMQzg2MV8zU1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjAwLCAiVG9zaGliYSIsIEFMQzg2MV9UT1NISUJBKSwKLQkvKiBGSVhNRTogdGhlIGVudHJ5IGJlbG93IGJyZWFrcyBUb3NoaWJhIEExMDAgKG1vZGVsPWF1dG8gd29ya3MhKQotCSAqICAgICAgICBBbnkgb3RoZXIgbW9kZWxzIHRoYXQgbmVlZCB0aGlzIHByZXNldD8KLQkgKi8KLQkvKiBTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjEwLCAiVG9zaGliYSIsIEFMQzg2MV9UT1NISUJBKSwgKi8KLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MjU0LCAiSFAgZHgyMjAwIChNU0kgTVMtNzI1NCkiLCBBTEM4NjFfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3Mjk3LCAiSFAgZHgyMjUwIChNU0kgTVMtNzI5NykiLCBBTEM4NjFfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHgyYjAxLCAiVW5pd2lsbCBYNDBBSXgiLCBBTEM4NjFfVU5JV0lMTF9NMzEpLAotCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzIsICJVbml3aWxsIG0zMSIsIEFMQzg2MV9VTklXSUxMX00zMSksCi0JU05EX1BDSV9RVUlSSygweDE1ODQsIDB4OTA3NSwgIkFpcmlzIFByYXhpcyBOMTIxMiIsIEFMQzg2MV9BU1VTX0xBUFRPUCksCi0JLyogRklYTUU6IHRoZSBiZWxvdyBzZWVtcyBjb25mbGljdCAqLwotCS8qIFNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzUsICJVbml3aWxsIiwgQUxDODYxX1VOSVdJTExfTTMxKSwgKi8KLQlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgwNjYwLCAiQXNyb2NrIDkzOVNMSTMyIiwgQUxDNjYwXzNTVCksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYwMCwgIkludGVsIiwgQUxDODYxXzNTVCksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjODYxX3ByZXNldHNbXSA9IHsKLQlbQUxDODYxXzNTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV8zU1RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV90aHJlZXN0YWNrX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxXzNTVF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4NjFfYmFzZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX3RocmVlc3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxXzZTVF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4NjFfYmFzZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2Jhc2VfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfOGNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MV84Y2hfbW9kZXMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDNjYwXzNTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV8zU1RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV90aHJlZXN0YWNrX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjBfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxX1VOSVdJTExfTTMxXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxX3VuaXdpbGxfbTMxX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfdW5pd2lsbF9tMzFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdW5pd2lsbF9tMzFfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxX3VuaXdpbGxfbTMxX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxX2FkY19uaWRzKSwKLQkJLmFkY19uaWRzID0gYWxjODYxX2FkY19uaWRzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MV9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4NjFfVE9TSElCQV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV90b3NoaWJhX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfYmFzZV9pbml0X3ZlcmJzLAotCQkJCWFsYzg2MV90b3NoaWJhX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxX2FkY19uaWRzKSwKLQkJLmFkY19uaWRzID0gYWxjODYxX2FkY19uaWRzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjODYxX3Rvc2hpYmFfdW5zb2xfZXZlbnQsCi0JCS5pbml0X2hvb2sgPSBhbGM4NjFfdG9zaGliYV9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4NjFfQVNVU10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV9hc3VzX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfYXN1c19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4NjFfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MV9hc3VzX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MV9hc3VzX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmhwX25pZCA9IDB4MDYsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxX0FTVVNfTEFQVE9QXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxX3Rvc2hpYmFfbWl4ZXIsIGFsYzg2MV9hc3VzX2xhcHRvcF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2FzdXNfaW5pdF92ZXJicywKLQkJCQlhbGM4NjFfYXN1c19sYXB0b3BfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLX07Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjODYxdmRfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzg2MXZkX3F1aXJrcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjI4NDUwLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3BjaS9oZGEvYWxjODYxdmRfcXVpcmtzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDUgKzAsMCBAQAotLyoKLSAqIEFMQzY2MC1WRC9BTEM4NjEtVkQgcXVpcmsgbW9kZWxzCi0gKiBpbmNsdWRlZCBieSBwYXRjaF9yZWFsdGVrLmMKLSAqLwotCi0vKiBBTEM4NjEtVkQgbW9kZWxzICovCi1lbnVtIHsKLQlBTEM4NjFWRF9BVVRPLAotCUFMQzY2MFZEXzNTVCwKLQlBTEM2NjBWRF8zU1RfRElHLAotCUFMQzY2MFZEX0FTVVNfVjFTLAotCUFMQzg2MVZEXzNTVCwKLQlBTEM4NjFWRF8zU1RfRElHLAotCUFMQzg2MVZEXzZTVF9ESUcsCi0JQUxDODYxVkRfTEVOT1ZPLAotCUFMQzg2MVZEX0RBTExBUywKLQlBTEM4NjFWRF9IUCwKLQlBTEM4NjFWRF9NT0RFTF9MQVNULAotfTsKLQotI2RlZmluZSBBTEM4NjFWRF9ESUdPVVRfTklECTB4MDYKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjF2ZF9kYWNfbmlkc1s0XSA9IHsKLQkvKiBmcm9udCwgc3VyciwgY2xmZSwgc2lkZSBzdXJyICovCi0JMHgwMiwgMHgwMywgMHgwNCwgMHgwNQotfTsKLQotLyogZGFjX25pZHMgZm9yIEFMQzY2MHZkIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlciAtIGFjY29yZGluZyB0bwotICogUmVhbHRlaydzIGRyaXZlci4KLSAqIFRoaXMgc2hvdWxkIHByb2JhYmx5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCBtaXhlciBmb3IgNnN0YWNrIG1vZGVscwotICogb2YgQUxDNjYwdmQgY29kZWNzLCBidXQgZm9yIG5vdyB0aGVyZSBpcyBvbmx5IDNzdGFjayBtaXhlcgotICogLSBhbmQgaXQgaXMgdGhlIHNhbWUgYXMgaW4gODYxdmQuCi0gKiBhZGNfbmlkcyBpbiBBTEM2NjB2ZCBhcmUgKGlzKSB0aGUgc2FtZSBhcyBpbiA4NjF2ZAotICovCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY2MHZkX2RhY19uaWRzWzNdID0gewotCS8qIGZyb250LCByZWFyLCBjbGZlLCByZWFyX3N1cnIgKi8KLQkweDAyLCAweDA0LCAweDAzCi19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MXZkX2FkY19uaWRzWzFdID0gewotCS8qIEFEQzAgKi8KLQkweDA5LAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjF2ZF9jYXBzcmNfbmlkc1sxXSA9IHsgMHgyMiB9OwotCi0vKiBpbnB1dCBNVVggKi8KLS8qIEZJWE1FOiBzaG91bGQgYmUgYSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDQsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MXZkX2RhbGxhc19jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMiwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MXZkX2hwX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAyLAotCS5pdGVtcyA9IHsKLQkJeyAiRnJvbnQgTWljIiwgMHgwIH0sCi0JCXsgIkFUQVBJIE1pYyIsIDB4MSB9LAotCX0sCi19OwotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXNbMV0gPSB7Ci0JeyAyLCBOVUxMIH0KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzZzdGFja19jaDZfaW5pdFtdID0gewotCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDhjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfNnN0YWNrX2NoOF9pbml0W10gPSB7Ci0JeyAweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxdmRfNnN0YWNrX21vZGVzWzJdID0gewotCXsgNiwgYWxjODYxdmRfNnN0YWNrX2NoNl9pbml0IH0sCi0JeyA4LCBhbGM4NjF2ZF82c3RhY2tfY2g4X2luaXQgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9jaG1vZGVfbWl4ZXJbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAotCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCi0JCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCi0JCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBQaW4gYXNzaWdubWVudDogRnJvbnQ9MHgxNCwgUmVhcj0weDE1LCBDTEZFPTB4MTYsIFNpZGU9MHgxNwotICogICAgICAgICAgICAgICAgIE1pYz0weDE4LCBGcm9udCBNaWM9MHgxOSwgTGluZS1Jbj0weDFhLCBIUD0weDFiCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF82c3RfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsCi0JCQkJSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMiwgMHgwLAotCQkJCUhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF8zc3RfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9sZW5vdm9fbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCS8qSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwqLwotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogUGluIGFzc2lnbm1lbnQ6IFNwZWFrZXI9MHgxNCwgSFAgPSAweDE1LAotICogICAgICAgICAgICAgICAgIE1pYz0weDE4LCBJbnRlcm5hbCBNaWMgPSAweDE5LCBDRCA9IDB4MWMsIFBDIEJlZXAgPSAweDFkCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9kYWxsYXNfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBQaW4gYXNzaWdubWVudDogU3BlYWtlcj0weDE0LCBMaW5lLW91dCA9IDB4MTUsCi0gKiAgICAgICAgICAgICAgICAgRnJvbnQgTWljPTB4MTgsIEFUQVBJIE1pYyA9IDB4MTksCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9ocF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkFUQVBJIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkFUQVBJIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0KLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZgotCSAqIHRoZSBhbmFsb2ctbG9vcGJhY2sgbWl4ZXIgd2lkZ2V0Ci0JICovCi0JLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLwotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQotCS8qIENhcHR1cmUgbWl4ZXI6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDAyIC0gMHgwNSkKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLwotCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0KLQl7IH0KLX07Ci0KLS8qCi0gKiAzLXN0YWNrIHBpbiBjb25maWd1cmF0aW9uOgotICogZnJvbnQgPSAweDE0LCBtaWMvY2xmZSA9IDB4MTgsIEhQID0gMHgxOSwgbGluZS9zdXJyID0gMHgxYSwgZi1taWMgPSAweDFiCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFNldCBwaW4gbW9kZSBhbmQgbXV0aW5nCi0JICovCi0JLyogc2V0IGZyb250IHBpbiB3aWRnZXRzIDB4MTQgZm9yIG91dHB1dCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTGluZSBJbiBwaW46IGlucHV0ICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7IH0KLX07Ci0KLS8qCi0gKiA2LXN0YWNrIHBpbiBjb25maWd1cmF0aW9uOgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzZzdGFja19pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBTZXQgcGluIG1vZGUgYW5kIG11dGluZwotCSAqLwotCS8qIHNldCBmcm9udCBwaW4gd2lkZ2V0cyAweDE0IGZvciBvdXRwdXQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQkvKiBSZWFyIFBpbjogb3V0cHV0IDEgKDB4MGQpICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCS8qIENMRkUgUGluOiBvdXRwdXQgMiAoMHgwZSkgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JLyogU2lkZSBQaW46IG91dHB1dCAzICgweDBmKSAqLwotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKLQotCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTGluZSBJbiBwaW46IGlucHV0ICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfZWFwZF92ZXJic1tdID0gewotCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkX2xlbm92b191bnNvbF92ZXJic1tdID0gewotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlhbGNfaHBfYXV0b211dGUoY29kZWMpOwotCWFsYzg4eF9zaW1wbGVfbWljX2F1dG9tdXRlKGNvZGVjKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQl1bnNpZ25lZCBpbnQgcmVzKQotewotCXN3aXRjaCAocmVzID4+IDI2KSB7Ci0JY2FzZSBBTENfTUlDX0VWRU5UOgotCQlhbGM4OHhfc2ltcGxlX21pY19hdXRvbXV0ZShjb2RlYyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWFsY19za3VfdW5zb2xfZXZlbnQoY29kZWMsIHJlcyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjF2ZF9kYWxsYXNfdmVyYnNbXSA9IHsKLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0KLQl7IH0gLyogZW5kICovCi19OwotCi0vKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGM4NjF2ZF9kYWxsYXNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGM4NjF2ZF9tb2RlbHNbQUxDODYxVkRfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzY2MFZEXzNTVF0JCT0gIjNzdGFjay02NjAiLAotCVtBTEM2NjBWRF8zU1RfRElHXQk9ICIzc3RhY2stNjYwLWRpZ291dCIsCi0JW0FMQzY2MFZEX0FTVVNfVjFTXQk9ICJhc3VzLXYxcyIsCi0JW0FMQzg2MVZEXzNTVF0JCT0gIjNzdGFjayIsCi0JW0FMQzg2MVZEXzNTVF9ESUddCT0gIjNzdGFjay1kaWdvdXQiLAotCVtBTEM4NjFWRF82U1RfRElHXQk9ICI2c3RhY2stZGlnb3V0IiwKLQlbQUxDODYxVkRfTEVOT1ZPXQk9ICJsZW5vdm8iLAotCVtBTEM4NjFWRF9EQUxMQVNdCT0gImRhbGxhcyIsCi0JW0FMQzg2MVZEX0hQXQkJPSAiaHAiLAotCVtBTEM4NjFWRF9BVVRPXQkJPSAiYXV0byIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxdmRfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweGE4OGQsICJSZWFsdGVrIEFMQzY2MCBkZW1vIiwgQUxDNjYwVkRfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGJmLCAiSFAgVFgxMDAwIiwgQUxDODYxVkRfSFApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyZTIsICJBc3VzIHozNW0iLCBBTEM2NjBWRF8zU1QpLAotCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFzdXMgRzEiLCBBTEM2NjBWRF8zU1QpLCovIC8qIGF1dG8gKi8KLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjMzLCAiQXN1cyBWMVNuIiwgQUxDNjYwVkRfQVNVU19WMVMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxZTcsICJBU1VTIiwgQUxDNjYwVkRfM1NUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwZGUsIDB4MDNmMCwgIlJlYWx0ZWsgQUxDNjYwIGRlbW8iLCBBTEM2NjBWRF8zU1QpLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDAsICJUb3NoaWJhIEExMzUiLCBBTEM4NjFWRF9MRU5PVk8pLAotCS8qU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYwMCwgIkRBTExBUyIsIEFMQzg2MVZEX0RBTExBUyksKi8gLypsZW5vdm8qLwotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDEsICJUb3NoaWJhIEExMzUiLCBBTEM4NjFWRF9MRU5PVk8pLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDMsICJUb3NoaWJhIFAyMDUiLCBBTEM4NjFWRF9MRU5PVk8pLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMzEsICJUb3NoaWJhIEwzMC0xNDkiLCBBTEM4NjFWRF9EQUxMQVMpLAotCVNORF9QQ0lfUVVJUksoMHgxNTY1LCAweDgyMGQsICJCaW9zdGFyIE5GNjFTIFNFIiwgQUxDODYxVkRfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxN2FhLCAiTGVub3ZvIiwgQUxDODYxVkRfTEVOT1ZPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgwODYyLCAiQVNSb2NrIEs4TkY2Ry1WU1RBIiwgQUxDODYxVkRfNlNUX0RJRyksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjODYxdmRfcHJlc2V0c1tdID0gewotCVtBTEM2NjBWRF8zU1RdID0gewotCQkubWl4ZXJzID0geyBhbGM4NjF2ZF8zc3RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2MHZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYwdmRfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDNjYwVkRfM1NUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYwdmRfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjB2ZF9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxVkRfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4NjFWRF8zU1RdID0gewotCQkubWl4ZXJzID0geyBhbGM4NjF2ZF8zc3RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxVkRfM1NUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCSAJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxVkRfNlNUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkXzZzdF9taXhlciwgYWxjODYxdmRfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4NjF2ZF82c3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF82c3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfNnN0YWNrX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg2MVZEX0xFTk9WT10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkX2xlbm92b19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnMsCi0JCQkJYWxjODYxdmRfZWFwZF92ZXJicywKLQkJCQlhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjB2ZF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2MHZkX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg2MXZkX2xlbm92b19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsYzg2MXZkX2xlbm92b19pbml0X2hvb2ssCi0JfSwKLQlbQUxDODYxVkRfREFMTEFTXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxdmRfZGFsbGFzX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF9kYWxsYXNfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjF2ZF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MXZkX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2RhbGxhc19jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODYxdmRfZGFsbGFzX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg2MVZEX0hQXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxdmRfaHBfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX2RhbGxhc192ZXJicywgYWxjODYxdmRfZWFwZF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfaHBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg2MXZkX2RhbGxhc19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM2NjBWRF9BU1VTX1YxU10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkX2xlbm92b19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnMsCi0JCQkJYWxjODYxdmRfZWFwZF92ZXJicywKLQkJCQlhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjB2ZF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2MHZkX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4NjFWRF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg2MXZkX2xlbm92b19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsYzg2MXZkX2xlbm92b19pbml0X2hvb2ssCi0JfSwKLX07Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjODgwX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGM4ODBfcXVpcmtzLmMKaW5kZXggYzg0NGQyYi4uYmVhMjJlZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9hbGM4ODBfcXVpcmtzLmMKKysrIGIvc291bmQvcGNpL2hkYS9hbGM4ODBfcXVpcmtzLmMKQEAgLTc0OSw4ICs3NDksNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNzgxLDggKzc4MCw3IEBACiAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfcDUzX2Rjdm9sX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMTA1MSw4ICsxMDQ5LDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE3OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAvKgpAQCAtMTEzNyw4ICsxMTM0LDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX21lZGlvbl9yaW1fbWl4ZXJbXSA9IHsKQEAgLTExODgsNyArMTE4NCw3IEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKIAkvKiB0b2dnbGUgRUFQRCAqLwotCWlmIChzcGVjLT5qYWNrX3ByZXNlbnQpCisJaWYgKHNwZWMtPmhwX2phY2tfcHJlc2VudCkKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAwKTsKIAllbHNlCiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MDEsIDAsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMik7CkBAIC0xMjEwLDggKzEyMDYsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2FsYzg4Ml9xdWlya3MuYyBiL3NvdW5kL3BjaS9oZGEvYWxjODgyX3F1aXJrcy5jCmluZGV4IDYxN2QwNDcuLmUyNTE1MTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvYWxjODgyX3F1aXJrcy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjODgyX3F1aXJrcy5jCkBAIC0xNzMsOCArMTczLDcgQEAKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTc7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbM10gPSAweDE5OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzRdID0gMHgxYTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODg5X2ludGVsX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTE5MSw4ICsxOTAsNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1sxXSA9IDB4MWI7IC8qIGhwICovCiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OyAvKiBzcGVha2VyICovCiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE1OyAvKiBiYXNzICovCi0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIC8qCkBAIC00NzUsOCArNDczLDcgQEAKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODg4X2FjZXJfYXNwaXJlXzY1MzBnX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNDg3LDggKzQ4NCw3IEBACiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTc7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg4OF9hY2VyX2FzcGlyZV83NzMwZ19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTQ5OSw4ICs0OTUsNyBAQAogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTY7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE3OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODlfYWNlcl9hc3BpcmVfODkzMGdfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC01MTEsOCArNTA2LDcgQEAKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxYjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogI2RlZmluZSBBTEM4ODJfRElHT1VUX05JRAkweDA2CkBAIC0xNzExLDggKzE3MDUsNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE4OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxYTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogI2RlZmluZSBhbGM4ODVfbWI1X3NldHVwCWFsYzg4NV9pbWFjMjRfc2V0dXAKQEAgLTE3MjEsMTIgKzE3MTQsMTEgQEAKIC8qIE1hY2Jvb2sgQWlyIDIsMSAqLwogc3RhdGljIHZvaWQgYWxjODg1X21iYTIxX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotICAgICAgIHN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCi0gICAgICAgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKLSAgICAgICBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTg7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE4OworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIApAQCAtMTczNyw4ICsxNzI5LDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODVfaW1hYzkxX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMTc0OCw4ICsxNzM5LDcgQEAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxODsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MWE7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyX3RhcmdhX3ZlcmJzW10gPSB7CkBAIC0xNzczLDcgKzE3NjMsNyBAQAogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7CiAJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLAotCQkJCSAgc3BlYy0+amFja19wcmVzZW50ID8gMSA6IDMpOworCQkJCSAgc3BlYy0+aHBfamFja19wcmVzZW50ID8gMSA6IDMpOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODJfdGFyZ2Ffc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0xNzgyLDggKzE3NzIsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg4Ml90YXJnYV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlcykKQEAgLTIxODcsOCArMjE3Niw3IEBACiAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFhOwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19hY2VyX2FzcGlyZV9taXhlcltdID0gewpAQCAtMjM0MSw4ICsyMzI5LDcgQEAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTc7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX21pdGFjX3ZlcmJzW10gPSB7CkBAIC0yNTA3LDggKzI0OTQsNyBAQAogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTY7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE4OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF8zc3RfaHBfdmVyYnNbXSA9IHsKQEAgLTI1NjgsOCArMjU1NCw3IEBACiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKIAlzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLwpAQCAtMjU3OSw4ICsyNTY0LDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCkBAIC0yNTkzLDggKzI1NzcsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg4M19jbGV2b19tNzIwX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTI2MjMsOCArMjYwNiw3IEBACiAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgzX2hhaWVyX3c2Nl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTI2MzMsOCArMjYxNSw3IEBACiAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgzX2xlbm92b18xMDFlX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMjY0NCwxMCArMjYyNSw3IEBACiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKIAlzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+ZGV0ZWN0X2xpbmUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX2xpbmVzID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCkBAIC0yNjU4LDggKzI2MzYsNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfYWNlcl9lYXBkX3ZlcmJzW10gPSB7CkBAIC0yNjg5LDggKzI2NjYsNyBAQAogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNTsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTY7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbM10gPSAweDE3OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODhfbGVub3ZvX3NreV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTI3MDMsOCArMjY3OSw3IEBACiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE2OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzNdID0gMHgxNzsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1s0XSA9IDB4MWE7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg4M192YWlvdHRfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0yNzE0LDggKzI2ODksNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfYXN1c19tOTB2X3ZlcmJzW10gPSB7CkBAIC0yNzM5LDggKzI3MTMsNyBAQAogCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKIAlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTk7CiAJc3BlYy0+YXV0b19taWMgPSAxOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF9hc3VzX2VlZTE2MDFfdmVyYnNbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGNfcXVpcmtzLmMKaW5kZXggMmJlMTEyOS4uYTE4OTUyZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9hbGNfcXVpcmtzLmMKKysrIGIvc291bmQvcGNpL2hkYS9hbGNfcXVpcmtzLmMKQEAgLTQ1Myw2ICs0NTMsMTkgQEAKIAlhbGNfZml4dXBfYXV0b2NmZ19waW5fbnVtcyhjb2RlYyk7CiB9CiAKK3N0YXRpYyB2b2lkIGFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3RydWN0IGFsY19zcGVjICpzcGVjLCBpbnQgbW9kZSkKK3sKKwlpbnQgbG9fcGluID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdOworCisJaWYgKGxvX3BpbiA9PSBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSB8fAorCQlsb19waW4gPT0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKQorCQlsb19waW4gPSAwOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBtb2RlOworCXNwZWMtPmRldGVjdF9ocCA9ICEhc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOworCXNwZWMtPmRldGVjdF9sbyA9ICEhbG9fcGluOworCXNwZWMtPmF1dG9tdXRlX2xvID0gc3BlYy0+YXV0b211dGVfbG9fcG9zc2libGUgPSAhIWxvX3BpbjsKKwlzcGVjLT5hdXRvbXV0ZV9zcGVha2VyID0gc3BlYy0+YXV0b211dGVfc3BlYWtlcl9wb3NzaWJsZSA9ICEhc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF07Cit9CiAKIC8qIGF1dG8tdG9nZ2xlIGZyb250IG1pYyAqLwogc3RhdGljIHZvaWQgYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMKaW5kZXggMjk3MTRjOC4uNjA3MzhlNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2JlZXAuaCIKICNpbmNsdWRlICJoZGFfbG9jYWwuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCmluZGV4IGYzYWVmZWYuLmU0NGIxMDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpAQCAtMzQsNiArMzUsOSBAQAogI2luY2x1ZGUgImhkYV9iZWVwLmgiCiAjaW5jbHVkZSA8c291bmQvaGRhX2h3ZGVwLmg+CiAKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgImhkYV90cmFjZS5oIgorCiAvKgogICogdmVuZG9yIC8gcHJlc2V0IHRhYmxlCiAgKi8KQEAgLTIwOCwxNSArMjEyLDE5IEBACiAgYWdhaW46CiAJc25kX2hkYV9wb3dlcl91cChjb2RlYyk7CiAJbXV0ZXhfbG9jaygmYnVzLT5jbWRfbXV0ZXgpOworCXRyYWNlX2hkYV9zZW5kX2NtZChjb2RlYywgY21kKTsKIAllcnIgPSBidXMtPm9wcy5jb21tYW5kKGJ1cywgY21kKTsKLQlpZiAoIWVyciAmJiByZXMpCisJaWYgKCFlcnIgJiYgcmVzKSB7CiAJCSpyZXMgPSBidXMtPm9wcy5nZXRfcmVzcG9uc2UoYnVzLCBjb2RlYy0+YWRkcik7CisJCXRyYWNlX2hkYV9nZXRfcmVzcG9uc2UoY29kZWMsICpyZXMpOworCX0KIAltdXRleF91bmxvY2soJmJ1cy0+Y21kX211dGV4KTsKIAlzbmRfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOwogCWlmIChyZXMgJiYgKnJlcyA9PSAtMSAmJiBidXMtPnJpcmJfZXJyb3IpIHsKIAkJaWYgKGJ1cy0+cmVzcG9uc2VfcmVzZXQpIHsKIAkJCXNuZF9wcmludGQoImhkYV9jb2RlYzogcmVzZXR0aW5nIEJVUyBkdWUgdG8gIgogCQkJCSAgICJmYXRhbCBjb21tdW5pY2F0aW9uIGVycm9yXG4iKTsKKwkJCXRyYWNlX2hkYV9idXNfcmVzZXQoYnVzKTsKIAkJCWJ1cy0+b3BzLmJ1c19yZXNldChidXMpOwogCQl9CiAJCWdvdG8gYWdhaW47CkBAIC02MDcsNiArNjE1LDcgQEAKIAlzdHJ1Y3QgaGRhX2J1c191bnNvbGljaXRlZCAqdW5zb2w7CiAJdW5zaWduZWQgaW50IHdwOwogCisJdHJhY2VfaGRhX3Vuc29sX2V2ZW50KGJ1cywgcmVzLCByZXNfZXgpOwogCXVuc29sID0gYnVzLT51bnNvbDsKIAlpZiAoIXVuc29sKQogCQlyZXR1cm4gMDsKQEAgLTE0ODMsOCArMTQ5MiwxMSBAQAogCQkJCSAgc3RydWN0IGhkYV9jdnRfc2V0dXAgKnEpCiB7CiAJaGRhX25pZF90IG5pZCA9IHEtPm5pZDsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0NIQU5ORUxfU1RSRUFNSUQsIDApOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfU1RSRUFNX0ZPUk1BVCwgMCk7CisJaWYgKHEtPnN0cmVhbV90YWcgfHwgcS0+Y2hhbm5lbF9pZCkKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9DSEFOTkVMX1NUUkVBTUlELCAwKTsKKwlpZiAocS0+Zm9ybWF0X2lkKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1NUUkVBTV9GT1JNQVQsIDAKKyk7CiAJbWVtc2V0KHEsIDAsIHNpemVvZigqcSkpOwogCXEtPm5pZCA9IG5pZDsKIH0KQEAgLTE2ODksNiArMTcwMSwyOSBAQAogRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9xdWVyeV9waW5fY2Fwcyk7CiAKIC8qKgorICogc25kX2hkYV9vdmVycmlkZV9waW5fY2FwcyAtIE92ZXJyaWRlIHRoZSBwaW4gY2FwYWJpbGl0aWVzCisgKiBAY29kZWM6IHRoZSBDT0RFQworICogQG5pZDogdGhlIE5JRCB0byBvdmVycmlkZQorICogQGNhcHM6IHRoZSBjYXBhYmlsaXR5IGJpdHMgdG8gc2V0CisgKgorICogT3ZlcnJpZGUgdGhlIGNhY2hlZCBQSU4gY2FwYWJpbGl0aXkgYml0cyB2YWx1ZSBieSB0aGUgZ2l2ZW4gb25lLgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFfb3ZlcnJpZGVfcGluX2NhcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY2FwcykKK3sKKwlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvOworCWluZm8gPSBnZXRfYWxsb2NfYW1wX2hhc2goY29kZWMsIEhEQV9IQVNIX1BJTkNBUF9LRVkobmlkKSk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpbmZvLT5hbXBfY2FwcyA9IGNhcHM7CisJaW5mby0+aGVhZC52YWwgfD0gSU5GT19BTVBfQ0FQUzsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfb3ZlcnJpZGVfcGluX2NhcHMpOworCisvKioKICAqIHNuZF9oZGFfcGluX3NlbnNlIC0gZXhlY3V0ZSBwaW4gc2Vuc2UgbWVhc3VyZW1lbnQKICAqIEBjb2RlYzogdGhlIENPREVDIHRvIHNlbnNlCiAgKiBAbmlkOiB0aGUgcGluIE5JRCB0byBzZW5zZQpAQCAtMjI5Niw2ICsyMzMxLDM5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3R5cGVkZWYgaW50ICgqbWFwX3NsYXZlX2Z1bmNfdCkodm9pZCAqLCBzdHJ1Y3Qgc25kX2tjb250cm9sICopOworCisvKiBhcHBseSB0aGUgZnVuY3Rpb24gdG8gYWxsIG1hdGNoaW5nIHNsYXZlIGN0bHMgaW4gdGhlIG1peGVyIGxpc3QgKi8KK3N0YXRpYyBpbnQgbWFwX3NsYXZlcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqIGNvbnN0ICpzbGF2ZXMsCisJCSAgICAgIG1hcF9zbGF2ZV9mdW5jX3QgZnVuYywgdm9pZCAqZGF0YSkgCit7CisJc3RydWN0IGhkYV9uaWRfaXRlbSAqaXRlbXM7CisJY29uc3QgY2hhciAqIGNvbnN0ICpzOworCWludCBpLCBlcnI7CisKKwlpdGVtcyA9IGNvZGVjLT5taXhlcnMubGlzdDsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm1peGVycy51c2VkOyBpKyspIHsKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqc2N0bCA9IGl0ZW1zW2ldLmtjdGw7CisJCWlmICghc2N0bCB8fCAhc2N0bC0+aWQubmFtZSB8fAorCQkgICAgc2N0bC0+aWQuaWZhY2UgIT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIpCisJCQljb250aW51ZTsKKwkJZm9yIChzID0gc2xhdmVzOyAqczsgcysrKSB7CisJCQlpZiAoIXN0cmNtcChzY3RsLT5pZC5uYW1lLCAqcykpIHsKKwkJCQllcnIgPSBmdW5jKGRhdGEsIHNjdGwpOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc2xhdmVfcHJlc2VudCh2b2lkICpkYXRhLCBzdHJ1Y3Qgc25kX2tjb250cm9sICpzY3RsKQoreworCXJldHVybiAxOworfQorCiAvKioKICAqIHNuZF9oZGFfYWRkX3ZtYXN0ZXIgLSBjcmVhdGUgYSB2aXJ0dWFsIG1hc3RlciBjb250cm9sIGFuZCBhZGQgc2xhdmVzCiAgKiBAY29kZWM6IEhELWF1ZGlvIGNvZGVjCkBAIC0yMzE2LDEyICsyMzg0LDEwIEBACiAJCQl1bnNpZ25lZCBpbnQgKnRsdiwgY29uc3QgY2hhciAqIGNvbnN0ICpzbGF2ZXMpCiB7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQljb25zdCBjaGFyICogY29uc3QgKnM7CiAJaW50IGVycjsKIAotCWZvciAocyA9IHNsYXZlczsgKnMgJiYgIXNuZF9oZGFfZmluZF9taXhlcl9jdGwoY29kZWMsICpzKTsgcysrKQotCQk7Ci0JaWYgKCEqcykgeworCWVyciA9IG1hcF9zbGF2ZXMoY29kZWMsIHNsYXZlcywgY2hlY2tfc2xhdmVfcHJlc2VudCwgTlVMTCk7CisJaWYgKGVyciAhPSAxKSB7CiAJCXNuZF9wcmludGRkKCJObyBzbGF2ZSBmb3VuZCBmb3IgJXNcbiIsIG5hbWUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMzMyLDIzICsyMzk4LDEwIEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlmb3IgKHMgPSBzbGF2ZXM7ICpzOyBzKyspIHsKLQkJc3RydWN0IHNuZF9rY29udHJvbCAqc2N0bDsKLQkJaW50IGkgPSAwOwotCQlmb3IgKDs7KSB7Ci0JCQlzY3RsID0gX3NuZF9oZGFfZmluZF9taXhlcl9jdGwoY29kZWMsICpzLCBpKTsKLQkJCWlmICghc2N0bCkgewotCQkJCWlmICghaSkKLQkJCQkJc25kX3ByaW50ZGQoIkNhbm5vdCBmaW5kIHNsYXZlICVzLCAiCi0JCQkJCQkgICAgInNraXBwZWRcbiIsICpzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVyciA9IHNuZF9jdGxfYWRkX3NsYXZlKGtjdGwsIHNjdGwpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWkrKzsKLQkJfQotCX0KKwllcnIgPSBtYXBfc2xhdmVzKGNvZGVjLCBzbGF2ZXMsIChtYXBfc2xhdmVfZnVuY190KXNuZF9jdGxfYWRkX3NsYXZlLAorCQkJIGtjdGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9hZGRfdm1hc3Rlcik7CkBAIC00MDg3LDYgKzQxNDAsNyBAQAogCQlyZXR1cm47CiAJfQogCisJdHJhY2VfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOwogCWhkYV9jYWxsX2NvZGVjX3N1c3BlbmQoY29kZWMpOwogCWlmIChidXMtPm9wcy5wbV9ub3RpZnkpCiAJCWJ1cy0+b3BzLnBtX25vdGlmeShidXMpOwpAQCAtNDEyNSw2ICs0MTc5LDcgQEAKIAlpZiAoY29kZWMtPnBvd2VyX29uIHx8IGNvZGVjLT5wb3dlcl90cmFuc2l0aW9uKQogCQlyZXR1cm47CiAKKwl0cmFjZV9oZGFfcG93ZXJfdXAoY29kZWMpOwogCXNuZF9oZGFfdXBkYXRlX3Bvd2VyX2FjY3QoY29kZWMpOwogCWNvZGVjLT5wb3dlcl9vbiA9IDE7CiAJY29kZWMtPnBvd2VyX2ppZmZpZXMgPSBqaWZmaWVzOwpAQCAtNDUzNyw2ICs0NTkyLDExIEBACiAJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5ocF9uaWQsIHN0cmVhbV90YWcsCiAJCQkJCSAgIDAsIGZvcm1hdCk7CiAJLyogZXh0cmEgb3V0cHV0cyBjb3BpZWQgZnJvbSBmcm9udCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vdXQtPmhwX291dF9uaWQpOyBpKyspCisJCWlmICghbW91dC0+bm9fc2hhcmVfc3RyZWFtICYmIG1vdXQtPmhwX291dF9uaWRbaV0pCisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywKKwkJCQkJCSAgIG1vdXQtPmhwX291dF9uaWRbaV0sCisJCQkJCQkgICBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vdXQtPmV4dHJhX291dF9uaWQpOyBpKyspCiAJCWlmICghbW91dC0+bm9fc2hhcmVfc3RyZWFtICYmIG1vdXQtPmV4dHJhX291dF9uaWRbaV0pCiAJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywKQEAgLTQ1NjksNiArNDYyOSwxMCBAQAogCQlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBuaWRzW2ldKTsKIAlpZiAobW91dC0+aHBfbmlkKQogCQlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5ocF9uaWQpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vdXQtPmhwX291dF9uaWQpOyBpKyspCisJCWlmIChtb3V0LT5ocF9vdXRfbmlkW2ldKQorCQkJc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywKKwkJCQkJCSAgICAgbW91dC0+aHBfb3V0X25pZFtpXSk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW91dC0+ZXh0cmFfb3V0X25pZCk7IGkrKykKIAkJaWYgKG1vdXQtPmV4dHJhX291dF9uaWRbaV0pCiAJCQlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLApAQCAtNDY0OSw2ICs0NzEzLDI3IEBACiAJfQogfQogCisvKiBSZW9yZGVyIHRoZSBzdXJyb3VuZCBjaGFubmVscworICogQUxTQSBzZXF1ZW5jZSBpcyBmcm9udC9zdXJyL2NsZmUvc2lkZQorICogSERBIHNlcXVlbmNlIGlzOgorICogICAgNC1jaDogZnJvbnQvc3VyciAgPT4gIE9LIGFzIGl0IGlzCisgKiAgICA2LWNoOiBmcm9udC9jbGZlL3N1cnIKKyAqICAgIDgtY2g6IGZyb250L2NsZmUvcmVhci9zaWRlfGZjCisgKi8KK3N0YXRpYyB2b2lkIHJlb3JkZXJfb3V0cHV0cyh1bnNpZ25lZCBpbnQgbnVtcywgaGRhX25pZF90ICpwaW5zKQoreworCWhkYV9uaWRfdCBuaWQ7CisKKwlzd2l0Y2ggKG51bXMpIHsKKwljYXNlIDM6CisJY2FzZSA0OgorCQluaWQgPSBwaW5zWzFdOworCQlwaW5zWzFdID0gcGluc1syXTsKKwkJcGluc1syXSA9IG5pZDsKKwkJYnJlYWs7CisJfQorfQorCiAvKgogICogUGFyc2UgYWxsIHBpbiB3aWRnZXRzIGFuZCBzdG9yZSB0aGUgdXNlZnVsIHBpbiBuaWRzIHRvIGNmZwogICoKQEAgLTQ2NjYsMTIgKzQ3NTEsMTMgQEAKICAqIFRoZSBkaWdpdGFsIGlucHV0L291dHB1dCBwaW5zIGFyZSBhc3NpZ25lZCB0byBkaWdfaW5fcGluIGFuZCBkaWdfb3V0X3BpbiwKICAqIHJlc3BlY3RpdmVseS4KICAqLwotaW50IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJIHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKLQkJCQkgY29uc3QgaGRhX25pZF90ICppZ25vcmVfbmlkcykKK2ludCBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZjZmcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkgICAgIHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKKwkJCSAgICAgY29uc3QgaGRhX25pZF90ICppZ25vcmVfbmlkcywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvbmRfZmxhZ3MpCiB7CiAJaGRhX25pZF90IG5pZCwgZW5kX25pZDsKLQlzaG9ydCBzZXEsIGFzc29jX2xpbmVfb3V0LCBhc3NvY19zcGVha2VyOworCXNob3J0IHNlcSwgYXNzb2NfbGluZV9vdXQ7CiAJc2hvcnQgc2VxdWVuY2VzX2xpbmVfb3V0W0FSUkFZX1NJWkUoY2ZnLT5saW5lX291dF9waW5zKV07CiAJc2hvcnQgc2VxdWVuY2VzX3NwZWFrZXJbQVJSQVlfU0laRShjZmctPnNwZWFrZXJfcGlucyldOwogCXNob3J0IHNlcXVlbmNlc19ocFtBUlJBWV9TSVpFKGNmZy0+aHBfcGlucyldOwpAQCAtNDY4Miw4ICs0NzY4LDkgQEAKIAltZW1zZXQoc2VxdWVuY2VzX2xpbmVfb3V0LCAwLCBzaXplb2Yoc2VxdWVuY2VzX2xpbmVfb3V0KSk7CiAJbWVtc2V0KHNlcXVlbmNlc19zcGVha2VyLCAwLCBzaXplb2Yoc2VxdWVuY2VzX3NwZWFrZXIpKTsKIAltZW1zZXQoc2VxdWVuY2VzX2hwLCAwLCBzaXplb2Yoc2VxdWVuY2VzX2hwKSk7Ci0JYXNzb2NfbGluZV9vdXQgPSBhc3NvY19zcGVha2VyID0gMDsKKwlhc3NvY19saW5lX291dCA9IDA7CiAKKwljb2RlYy0+aWdub3JlX21pc2NfYml0ID0gdHJ1ZTsKIAllbmRfbmlkID0gY29kZWMtPnN0YXJ0X25pZCArIGNvZGVjLT5udW1fbm9kZXM7CiAJZm9yIChuaWQgPSBjb2RlYy0+c3RhcnRfbmlkOyBuaWQgPCBlbmRfbmlkOyBuaWQrKykgewogCQl1bnNpZ25lZCBpbnQgd2lkX2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7CkBAIC00Njk5LDYgKzQ3ODYsOSBAQAogCQkJY29udGludWU7CiAKIAkJZGVmX2NvbmYgPSBzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCk7CisJCWlmICghKGdldF9kZWZjZmdfbWlzYyhzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCkpICYKKwkJICAgICAgQUNfREVGQ0ZHX01JU0NfTk9fUFJFU0VOQ0UpKQorCQkJY29kZWMtPmlnbm9yZV9taXNjX2JpdCA9IGZhbHNlOwogCQljb25uID0gZ2V0X2RlZmNmZ19jb25uZWN0KGRlZl9jb25mKTsKIAkJaWYgKGNvbm4gPT0gQUNfSkFDS19QT1JUX05PTkUpCiAJCQljb250aW51ZTsKQEAgLTQ3MzQsMTYgKzQ4MjQsMTAgQEAKIAkJY2FzZSBBQ19KQUNLX1NQRUFLRVI6CiAJCQlzZXEgPSBnZXRfZGVmY2ZnX3NlcXVlbmNlKGRlZl9jb25mKTsKIAkJCWFzc29jID0gZ2V0X2RlZmNmZ19hc3NvY2lhdGlvbihkZWZfY29uZik7Ci0JCQlpZiAoIWFzc29jKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFhc3NvY19zcGVha2VyKQotCQkJCWFzc29jX3NwZWFrZXIgPSBhc3NvYzsKLQkJCWVsc2UgaWYgKGFzc29jX3NwZWFrZXIgIT0gYXNzb2MpCi0JCQkJY29udGludWU7CiAJCQlpZiAoY2ZnLT5zcGVha2VyX291dHMgPj0gQVJSQVlfU0laRShjZmctPnNwZWFrZXJfcGlucykpCiAJCQkJY29udGludWU7CiAJCQljZmctPnNwZWFrZXJfcGluc1tjZmctPnNwZWFrZXJfb3V0c10gPSBuaWQ7Ci0JCQlzZXF1ZW5jZXNfc3BlYWtlcltjZmctPnNwZWFrZXJfb3V0c10gPSBzZXE7CisJCQlzZXF1ZW5jZXNfc3BlYWtlcltjZmctPnNwZWFrZXJfb3V0c10gPSAoYXNzb2MgPDwgNCkgfCBzZXE7CiAJCQljZmctPnNwZWFrZXJfb3V0cysrOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNfSkFDS19IUF9PVVQ6CkBAIC00NzkyLDcgKzQ4NzYsOCBAQAogCSAqIElmIG5vIGxpbmUtb3V0IGlzIGRlZmluZWQgYnV0IG11bHRpcGxlIEhQcyBhcmUgZm91bmQsCiAJICogc29tZSBvZiB0aGVtIG1pZ2h0IGJlIHRoZSByZWFsIGxpbmUtb3V0cy4KIAkgKi8KLQlpZiAoIWNmZy0+bGluZV9vdXRzICYmIGNmZy0+aHBfb3V0cyA+IDEpIHsKKwlpZiAoIWNmZy0+bGluZV9vdXRzICYmIGNmZy0+aHBfb3V0cyA+IDEgJiYKKwkgICAgIShjb25kX2ZsYWdzICYgSERBX1BJTkNGR19OT19IUF9GSVhVUCkpIHsKIAkJaW50IGkgPSAwOwogCQl3aGlsZSAoaSA8IGNmZy0+aHBfb3V0cykgewogCQkJLyogVGhlIHJlYWwgSFBzIHNob3VsZCBoYXZlIHRoZSBzZXF1ZW5jZSAweDBmICovCkBAIC00ODI5LDcgKzQ5MTQsOCBAQAogCSAqIEZJWC1VUDogaWYgbm8gbGluZS1vdXRzIGFyZSBkZXRlY3RlZCwgdHJ5IHRvIHVzZSBzcGVha2VyIG9yIEhQIHBpbgogCSAqIGFzIGEgcHJpbWFyeSBvdXRwdXQKIAkgKi8KLQlpZiAoIWNmZy0+bGluZV9vdXRzKSB7CisJaWYgKCFjZmctPmxpbmVfb3V0cyAmJgorCSAgICAhKGNvbmRfZmxhZ3MgJiBIREFfUElOQ0ZHX05PX0xPX0ZJWFVQKSkgewogCQlpZiAoY2ZnLT5zcGVha2VyX291dHMpIHsKIAkJCWNmZy0+bGluZV9vdXRzID0gY2ZnLT5zcGVha2VyX291dHM7CiAJCQltZW1jcHkoY2ZnLT5saW5lX291dF9waW5zLCBjZmctPnNwZWFrZXJfcGlucywKQEAgLTQ4NDcsMjEgKzQ5MzMsOSBAQAogCQl9CiAJfQogCi0JLyogUmVvcmRlciB0aGUgc3Vycm91bmQgY2hhbm5lbHMKLQkgKiBBTFNBIHNlcXVlbmNlIGlzIGZyb250L3N1cnIvY2xmZS9zaWRlCi0JICogSERBIHNlcXVlbmNlIGlzOgotCSAqICAgIDQtY2g6IGZyb250L3N1cnIgID0+ICBPSyBhcyBpdCBpcwotCSAqICAgIDYtY2g6IGZyb250L2NsZmUvc3VycgotCSAqICAgIDgtY2g6IGZyb250L2NsZmUvcmVhci9zaWRlfGZjCi0JICovCi0Jc3dpdGNoIChjZmctPmxpbmVfb3V0cykgewotCWNhc2UgMzoKLQljYXNlIDQ6Ci0JCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1sxXTsKLQkJY2ZnLT5saW5lX291dF9waW5zWzFdID0gY2ZnLT5saW5lX291dF9waW5zWzJdOwotCQljZmctPmxpbmVfb3V0X3BpbnNbMl0gPSBuaWQ7Ci0JCWJyZWFrOwotCX0KKwlyZW9yZGVyX291dHB1dHMoY2ZnLT5saW5lX291dHMsIGNmZy0+bGluZV9vdXRfcGlucyk7CisJcmVvcmRlcl9vdXRwdXRzKGNmZy0+aHBfb3V0cywgY2ZnLT5ocF9waW5zKTsKKwlyZW9yZGVyX291dHB1dHMoY2ZnLT5zcGVha2VyX291dHMsIGNmZy0+c3BlYWtlcl9waW5zKTsKIAogCXNvcnRfYXV0b2NmZ19pbnB1dF9waW5zKGNmZyk7CiAKQEAgLTQ4OTksNyArNDk3Myw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcpOworRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9wYXJzZV9waW5fZGVmY2ZnKTsKIAogaW50IHNuZF9oZGFfZ2V0X2lucHV0X3Bpbl9hdHRyKHVuc2lnbmVkIGludCBkZWZfY29uZikKIHsKQEAgLTUxNTgsMzAgKzUyMzIsNiBAQAogRVhQT1JUX1NZTUJPTF9IREEoc25kX2FycmF5X2ZyZWUpOwogCiAvKioKLSAqIHNuZF9wcmludF9wY21fcmF0ZXMgLSBQcmludCB0aGUgc3VwcG9ydGVkIFBDTSByYXRlcyB0byB0aGUgc3RyaW5nIGJ1ZmZlcgotICogQHBjbTogUENNIGNhcHMgYml0cwotICogQGJ1ZjogdGhlIHN0cmluZyBidWZmZXIgdG8gd3JpdGUKLSAqIEBidWZsZW46IHRoZSBtYXggYnVmZmVyIGxlbmd0aAotICoKLSAqIHVzZWQgYnkgaGRhX3Byb2MuYyBhbmQgaGRhX2VsZC5jCi0gKi8KLXZvaWQgc25kX3ByaW50X3BjbV9yYXRlcyhpbnQgcGNtLCBjaGFyICpidWYsIGludCBidWZsZW4pCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGludCByYXRlc1tdID0gewotCQk4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA4ODIwMCwKLQkJOTYwMDAsIDE3NjQwMCwgMTkyMDAwLCAzODQwMDAKLQl9OwotCWludCBpLCBqOwotCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhdGVzKTsgaSsrKQotCQlpZiAocGNtICYgKDEgPDwgaSkpCi0JCQlqICs9IHNucHJpbnRmKGJ1ZiArIGosIGJ1ZmxlbiAtIGosICAiICVkIiwgcmF0ZXNbaV0pOwotCi0JYnVmW2pdID0gJ1wwJzsgLyogbmVjZXNzYXJ5IHdoZW4gaiA9PSAwICovCi19Ci1FWFBPUlRfU1lNQk9MX0hEQShzbmRfcHJpbnRfcGNtX3JhdGVzKTsKLQotLyoqCiAgKiBzbmRfcHJpbnRfcGNtX2JpdHMgLSBQcmludCB0aGUgc3VwcG9ydGVkIFBDTSBmbXQgYml0cyB0byB0aGUgc3RyaW5nIGJ1ZmZlcgogICogQHBjbTogUENNIGNhcHMgYml0cwogICogQGJ1ZjogdGhlIHN0cmluZyBidWZmZXIgdG8gd3JpdGUKQEAgLTUyMjIsNiArNTI3Miw4IEBACiAJCXJldHVybiAiTWljIjsKIAljYXNlIFNORF9KQUNLX0xJTkVPVVQ6CiAJCXJldHVybiAiTGluZS1vdXQiOworCWNhc2UgU05EX0pBQ0tfTElORUlOOgorCQlyZXR1cm4gIkxpbmUtaW4iOwogCWNhc2UgU05EX0pBQ0tfSEVBRFNFVDoKIAkJcmV0dXJuICJIZWFkc2V0IjsKIAljYXNlIFNORF9KQUNLX1ZJREVPT1VUOgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKaW5kZXggNzU1ZjJiMC4uNTY0NDcxMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCkBAIC04NTQsNiArODU0LDcgQEAKIAl1bnNpZ25lZCBpbnQgbm9fc3RpY2t5X3N0cmVhbToxOyAvKiBubyBzdGlja3ktUENNIHN0cmVhbSBhc3NpZ25tZW50ICovCiAJdW5zaWduZWQgaW50IHBpbnNfc2h1dHVwOjE7CS8qIHBpbnMgYXJlIHNodXQgdXAgKi8KIAl1bnNpZ25lZCBpbnQgbm9fdHJpZ2dlcl9zZW5zZToxOyAvKiBkb24ndCB0cmlnZ2VyIGF0IHBpbi1zZW5zaW5nICovCisJdW5zaWduZWQgaW50IGlnbm9yZV9taXNjX2JpdDoxOyAvKiBpZ25vcmUgTUlTQ19OT19QUkVTRU5DRSBiaXQgKi8KICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAJdW5zaWduZWQgaW50IHBvd2VyX29uIDoxOwkvKiBjdXJyZW50IChnbG9iYWwpIHBvd2VyLXN0YXRlICovCiAJdW5zaWduZWQgaW50IHBvd2VyX3RyYW5zaXRpb24gOjE7IC8qIHBvd2VyLXN0YXRlIGluIHRyYW5zaXRpb24gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jIGIvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKaW5kZXggYzM0ZjczMC4uMWM4ZGRmNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKQEAgLTMxOCw2ICszMTgsMTEgQEAKIAlpbnQgc2l6ZTsKIAl1bnNpZ25lZCBjaGFyICpidWY7CiAKKwkvKgorCSAqIEVMRCBzaXplIGlzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gY2FsbGVyIGZ1bmN0aW9uLiBJZiBubyBlcnJvcnMgYW5kCisJICogRUxEIGlzIHZhbGlkLCBhY3R1YWwgZWxkX3NpemUgaXMgYXNzaWduZWQgaW4gaGRtaV91cGRhdGVfZWxkKCkKKwkgKi8KKwogCWlmICghZWxkLT5lbGRfdmFsaWQpCiAJCXJldHVybiAtRU5PRU5UOwogCkBAIC0zMjcsMTQgKzMzMiwxMyBAQAogCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSTogRUxEIGJ1ZiBzaXplIGlzIDAsIGZvcmNlIDEyOFxuIik7CiAJCXNpemUgPSAxMjg7CiAJfQotCWlmIChzaXplIDwgRUxEX0ZJWEVEX0JZVEVTIHx8IHNpemUgPiBQQUdFX1NJWkUpIHsKKwlpZiAoc2l6ZSA8IEVMRF9GSVhFRF9CWVRFUyB8fCBzaXplID4gRUxEX01BWF9TSVpFKSB7CiAJCXNuZF9wcmludGQoS0VSTl9JTkZPICJIRE1JOiBpbnZhbGlkIEVMRCBidWYgc2l6ZSAlZFxuIiwgc2l6ZSk7CiAJCXJldHVybiAtRVJBTkdFOwogCX0KIAotCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOworCS8qIHNldCBFTEQgYnVmZmVyICovCisJYnVmID0gZWxkLT5lbGRfYnVmZmVyOwogCiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgdmFsID0gaGRtaV9nZXRfZWxkX2RhdGEoY29kZWMsIG5pZCwgaSk7CkBAIC0zNTYsMTAgKzM2MCwzMSBAQAogCXJldCA9IGhkbWlfdXBkYXRlX2VsZChlbGQsIGJ1Ziwgc2l6ZSk7CiAKIGVycm9yOgotCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBTTkRSVl9QQ01fUkFURV8qIGFuZCBBQ19QQVJfUENNIHZhbHVlcyBkb24ndCBtYXRjaCwgcHJpbnQgY29ycmVjdCByYXRlcyB3aXRoCisgKiBoZG1pLXNwZWNpZmljIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIGhkbWlfcHJpbnRfcGNtX3JhdGVzKGludCBwY20sIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IGFsc2FfcmF0ZXNbXSA9IHsKKwkJNTUxMiwgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgODgyMDAsCisJCTk2MDAwLCAxNzY0MDAsIDE5MjAwMCwgMzg0MDAwCisJfTsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgQVJSQVlfU0laRShhbHNhX3JhdGVzKTsgaSsrKQorCQlpZiAocGNtICYgKDEgPDwgaSkpCisJCQlqICs9IHNucHJpbnRmKGJ1ZiArIGosIGJ1ZmxlbiAtIGosICAiICVkIiwKKwkJCQlhbHNhX3JhdGVzW2ldKTsKKworCWJ1ZltqXSA9ICdcMCc7IC8qIG5lY2Vzc2FyeSB3aGVuIGogPT0gMCAqLworfQorCisjZGVmaW5lIFNORF9QUklOVF9SQVRFU19BRFZJU0VEX0JVRlNJWkUJODAKKwogc3RhdGljIHZvaWQgaGRtaV9zaG93X3Nob3J0X2F1ZGlvX2Rlc2Moc3RydWN0IGNlYV9zYWQgKmEpCiB7CiAJY2hhciBidWZbU05EX1BSSU5UX1JBVEVTX0FEVklTRURfQlVGU0laRV07CkBAIC0zNjgsNyArMzkzLDcgQEAKIAlpZiAoIWEtPmZvcm1hdCkKIAkJcmV0dXJuOwogCi0Jc25kX3ByaW50X3BjbV9yYXRlcyhhLT5yYXRlcywgYnVmLCBzaXplb2YoYnVmKSk7CisJaGRtaV9wcmludF9wY21fcmF0ZXMoYS0+cmF0ZXMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCiAJaWYgKGEtPmZvcm1hdCA9PSBBVURJT19DT0RJTkdfVFlQRV9MUENNKQogCQlzbmRfcHJpbnRfcGNtX2JpdHMoYS0+c2FtcGxlX2JpdHMsIGJ1ZjIgKyA4LCBzaXplb2YoYnVmMikgLSA4KTsKQEAgLTQyNyw3ICs0NTIsNyBAQAogCQkJaSwgYS0+Zm9ybWF0LCBjZWFfYXVkaW9fY29kaW5nX3R5cGVfbmFtZXNbYS0+Zm9ybWF0XSk7CiAJc25kX2lwcmludGYoYnVmZmVyLCAic2FkJWRfY2hhbm5lbHNcdFx0JWRcbiIsIGksIGEtPmNoYW5uZWxzKTsKIAotCXNuZF9wcmludF9wY21fcmF0ZXMoYS0+cmF0ZXMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWhkbWlfcHJpbnRfcGNtX3JhdGVzKGEtPnJhdGVzLCBidWYsIHNpemVvZihidWYpKTsKIAlzbmRfaXByaW50ZihidWZmZXIsICJzYWQlZF9yYXRlc1x0XHRbMHgleF0lc1xuIiwgaSwgYS0+cmF0ZXMsIGJ1Zik7CiAKIAlpZiAoYS0+Zm9ybWF0ID09IEFVRElPX0NPRElOR19UWVBFX0xQQ00pIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYwppbmRleCBhNjNjNTRkLi40MzFiZjg2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlICJoZGFfbG9jYWwuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9od2RlcC5jCmluZGV4IGJmM2NlZDUuLjZiMmVmYjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaHdkZXAuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCkBAIC02NDMsMTQgKzY0NCwxNCBAQAogc3RhdGljIHZvaWQgcGFyc2VfY29kZWNfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCiAJCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCiB7Ci0JdW5zaWduZWQgaW50IHZlbmRvcmlkLCBzdWJpZCwgY2FkZHI7CisJaW50IHZlbmRvcmlkLCBzdWJpZCwgY2FkZHI7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7CiAKIAkqY29kZWNwID0gTlVMTDsKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVpICVpICVpIiwgJnZlbmRvcmlkLCAmc3ViaWQsICZjYWRkcikgPT0gMykgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7Ci0JCQlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSB2ZW5kb3JpZCAmJgotCQkJICAgIGNvZGVjLT5zdWJzeXN0ZW1faWQgPT0gc3ViaWQgJiYKKwkJCWlmICgodmVuZG9yaWQgPD0gMCB8fCBjb2RlYy0+dmVuZG9yX2lkID09IHZlbmRvcmlkKSAmJgorCQkJICAgIChzdWJpZCA8PSAwIHx8IGNvZGVjLT5zdWJzeXN0ZW1faWQgPT0gc3ViaWQpICYmCiAJCQkgICAgY29kZWMtPmFkZHIgPT0gY2FkZHIpIHsKIAkJCQkqY29kZWNwID0gY29kZWM7CiAJCQkJYnJlYWs7CkBAIC03NTYsOCArNzU3LDYgQEAKIAl9CiAJaWYgKCFmdy0+c2l6ZSkKIAkJcmV0dXJuIDA7Ci0JaWYgKHNpemUgPCBmdy0+c2l6ZSkKLQkJc2l6ZSA9IGZ3LT5zaXplOwogCiAJZm9yIChsZW4gPSAwOyBsZW4gPCBmdy0+c2l6ZTsgbGVuKyspIHsKIAkJaWYgKCEqcCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IDE5MTI4NGEuLjA5NjUwN2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtMzQsNyArMzQsNiBAQAogICogCiAgKi8KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC00Niw2ICs0NSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpZmRlZiBDT05GSUdfWDg2CisvKiBmb3Igc25vb3AgY29udHJvbCAqLworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNlbmRpZgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCkBAIC0xMTYsNiArMTIxLDIyIEBACiBNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3NhdmVfY29udHJvbGxlciwgIlJlc2V0IGNvbnRyb2xsZXIgaW4gcG93ZXIgc2F2ZSBtb2RlLiIpOwogI2VuZGlmCiAKK3N0YXRpYyBpbnQgYWxpZ25fYnVmZmVyX3NpemUgPSAxOworbW9kdWxlX3BhcmFtKGFsaWduX2J1ZmZlcl9zaXplLCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWxpZ25fYnVmZmVyX3NpemUsCisJCSJGb3JjZSBidWZmZXIgYW5kIHBlcmlvZCBzaXplcyB0byBiZSBtdWx0aXBsZSBvZiAxMjggYnl0ZXMuIik7CisKKyNpZmRlZiBDT05GSUdfWDg2CitzdGF0aWMgYm9vbCBoZGFfc25vb3AgPSB0cnVlOworbW9kdWxlX3BhcmFtX25hbWVkKHNub29wLCBoZGFfc25vb3AsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzbm9vcCwgIkVuYWJsZS9kaXNhYmxlIHNub29waW5nIik7CisjZGVmaW5lIGF6eF9zbm9vcChjaGlwKQkJKGNoaXApLT5zbm9vcAorI2Vsc2UKKyNkZWZpbmUgaGRhX3Nub29wCQl0cnVlCisjZGVmaW5lIGF6eF9zbm9vcChjaGlwKQkJdHJ1ZQorI2VuZGlmCisKKwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7SW50ZWwsIElDSDZ9LCIKIAkJCSAie0ludGVsLCBJQ0g2TX0sIgpAQCAtMzYwLDcgKzM4MSw3IEBACiAJCQkJCSAqLwogCXVuc2lnbmVkIGNoYXIgc3RyZWFtX3RhZzsJLyogYXNzaWduZWQgc3RyZWFtICovCiAJdW5zaWduZWQgY2hhciBpbmRleDsJCS8qIHN0cmVhbSBpbmRleCAqLwotCWludCBkZXZpY2U7CQkJLyogbGFzdCBkZXZpY2UgbnVtYmVyIGFzc2lnbmVkIHRvICovCisJaW50IGFzc2lnbmVkX2tleTsJCS8qIGxhc3QgZGV2aWNlIyBrZXkgYXNzaWduZWQgdG8gKi8KIAogCXVuc2lnbmVkIGludCBvcGVuZWQgOjE7CiAJdW5zaWduZWQgaW50IHJ1bm5pbmcgOjE7CkBAIC0zNzEsNiArMzkyLDcgQEAKIAkgKiAgd2hlbiBsaW5rIHBvc2l0aW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gRklGTyBzaXplCiAJICovCiAJdW5zaWduZWQgaW50IGluc3VmZmljaWVudCA6MTsKKwl1bnNpZ25lZCBpbnQgd2NfbWFya2VkOjE7CiB9OwogCiAvKiBDT1JCL1JJUkIgKi8KQEAgLTQzOCw2ICs0NjAsNyBAQAogCXVuc2lnbmVkIGludCBtc2kgOjE7CiAJdW5zaWduZWQgaW50IGlycV9wZW5kaW5nX3dhcm5lZCA6MTsKIAl1bnNpZ25lZCBpbnQgcHJvYmluZyA6MTsgLyogY29kZWMgcHJvYmluZyBwaGFzZSAqLworCXVuc2lnbmVkIGludCBzbm9vcDoxOwogCiAJLyogZm9yIGRlYnVnZ2luZyAqLwogCXVuc2lnbmVkIGludCBsYXN0X2NtZFtBWlhfTUFYX0NPREVDU107CkBAIC00ODEsNiArNTA0LDcgQEAKICNkZWZpbmUgQVpYX0RDQVBTX05PXzY0QklUCSgxIDw8IDE4KQkvKiBObyA2NGJpdCBhZGRyZXNzICovCiAjZGVmaW5lIEFaWF9EQ0FQU19TWU5DX1dSSVRFCSgxIDw8IDE5KQkvKiBzeW5jIGVhY2ggY21kIHdyaXRlICovCiAjZGVmaW5lIEFaWF9EQ0FQU19PTERfU1NZTkMJKDEgPDwgMjApCS8qIE9sZCBTU1lOQyByZWcgZm9yIElDSCAqLworI2RlZmluZSBBWlhfRENBUFNfQlVGU0laRQkoMSA8PCAyMSkJLyogbm8gYnVmZmVyIHNpemUgYWxpZ25tZW50ICovCiAKIC8qIHF1aXJrcyBmb3IgQVRJIFNCIC8gQU1EIEh1ZHNvbiAqLwogI2RlZmluZSBBWlhfRENBUFNfUFJFU0VUX0FUSV9TQiBcCkBAIC01NDIsNiArNTY2LDQ1IEBACiAvKiBmb3IgcGNtIHN1cHBvcnQgKi8KICNkZWZpbmUgZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKSAoc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGEpCiAKKyNpZmRlZiBDT05GSUdfWDg2CitzdGF0aWMgdm9pZCBfX21hcmtfcGFnZXNfd2Moc3RydWN0IGF6eCAqY2hpcCwgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIGJvb2wgb24pCit7CisJaWYgKGF6eF9zbm9vcChjaGlwKSkKKwkJcmV0dXJuOworCWlmIChhZGRyICYmIHNpemUpIHsKKwkJaW50IHBhZ2VzID0gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCQlpZiAob24pCisJCQlzZXRfbWVtb3J5X3djKCh1bnNpZ25lZCBsb25nKWFkZHIsIHBhZ2VzKTsKKwkJZWxzZQorCQkJc2V0X21lbW9yeV93YigodW5zaWduZWQgbG9uZylhZGRyLCBwYWdlcyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19wYWdlc193YyhzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiwKKwkJCQkgYm9vbCBvbikKK3sKKwlfX21hcmtfcGFnZXNfd2MoY2hpcCwgYnVmLT5hcmVhLCBidWYtPmJ5dGVzLCBvbik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19ydW50aW1lX3djKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LAorCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsIGJvb2wgb24pCit7CisJaWYgKGF6eF9kZXYtPndjX21hcmtlZCAhPSBvbikgeworCQlfX21hcmtfcGFnZXNfd2MoY2hpcCwgcnVudGltZS0+ZG1hX2FyZWEsIHJ1bnRpbWUtPmRtYV9ieXRlcywgb24pOworCQlhenhfZGV2LT53Y19tYXJrZWQgPSBvbjsKKwl9Cit9CisjZWxzZQorLyogTk9QIGZvciBvdGhlciBhcmNocyAqLworc3RhdGljIGlubGluZSB2b2lkIG1hcmtfcGFnZXNfd2Moc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYsCisJCQkJIGJvb2wgb24pCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19ydW50aW1lX3djKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LAorCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsIGJvb2wgb24pCit7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBhenhfYWNxdWlyZV9pcnEoc3RydWN0IGF6eCAqY2hpcCwgaW50IGRvX2Rpc2Nvbm5lY3QpOwogc3RhdGljIGludCBhenhfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IHZhbCk7CiAvKgpAQCAtNTYzLDYgKzYyNiw3IEBACiAJCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICJjYW5ub3QgYWxsb2NhdGUgQ09SQi9SSVJCXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CisJbWFya19wYWdlc193YyhjaGlwLCAmY2hpcC0+cmIsIHRydWUpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDc5LDcgKzExNDMsMTUgQEAKIAogc3RhdGljIHZvaWQgYXp4X2luaXRfcGNpKHN0cnVjdCBhenggKmNoaXApCiB7Ci0JdW5zaWduZWQgc2hvcnQgc25vb3A7CisJLyogZm9yY2UgdG8gbm9uLXNub29wIG1vZGUgZm9yIGEgbmV3IFZJQSBjb250cm9sbGVyIHdoZW4gQklPUyBpcyBzZXQgKi8KKwlpZiAoY2hpcC0+c25vb3AgJiYgY2hpcC0+ZHJpdmVyX3R5cGUgPT0gQVpYX0RSSVZFUl9WSUEpIHsKKwkJdTggc25vb3A7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgMHg0MiwgJnNub29wKTsKKwkJaWYgKCEoc25vb3AgJiAweDgwKSAmJiBjaGlwLT5wY2ktPnJldmlzaW9uID09IDB4MzApIHsKKwkJCWNoaXAtPnNub29wID0gMDsKKwkJCXNuZF9wcmludGRkKFNGWCAiRm9yY2UgdG8gbm9uLXNub29wIG1vZGVcbiIpOworCQl9CisJfQogCiAJLyogQ2xlYXIgYml0cyAwLTIgb2YgUENJIHJlZ2lzdGVyIFRDU0VMIChhdCBvZmZzZXQgMHg0NCkKIAkgKiBUQ1NFTCA9PSBUcmFmZmljIENsYXNzIFNlbGVjdCBSZWdpc3Rlciwgd2hpY2ggc2V0cyBQQ0kgZXhwcmVzcyBRT1MKQEAgLTEwOTYsMTUgKzExNjgsMTUgQEAKIAkgKiB3ZSBuZWVkIHRvIGVuYWJsZSBzbm9vcC4KIAkgKi8KIAlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQVRJX1NOT09QKSB7Ci0JCXNuZF9wcmludGRkKFNGWCAiRW5hYmxpbmcgQVRJIHNub29wXG4iKTsKKwkJc25kX3ByaW50ZGQoU0ZYICJTZXR0aW5nIEFUSSBzbm9vcDogJWRcbiIsIGF6eF9zbm9vcChjaGlwKSk7CiAJCXVwZGF0ZV9wY2lfYnl0ZShjaGlwLT5wY2ksCi0JCQkJQVRJX1NCNDUwX0hEQVVESU9fTUlTQ19DTlRSMl9BRERSLCAKLQkJCQkweDA3LCBBVElfU0I0NTBfSERBVURJT19FTkFCTEVfU05PT1ApOworCQkJCUFUSV9TQjQ1MF9IREFVRElPX01JU0NfQ05UUjJfQUREUiwgMHgwNywKKwkJCQlhenhfc25vb3AoY2hpcCkgPyBBVElfU0I0NTBfSERBVURJT19FTkFCTEVfU05PT1AgOiAwKTsKIAl9CiAKIAkvKiBGb3IgTlZJRElBIEhEQSwgZW5hYmxlIHNub29wICovCiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX05WSURJQV9TTk9PUCkgewotCQlzbmRfcHJpbnRkZChTRlggIkVuYWJsaW5nIE52aWRpYSBzbm9vcFxuIik7CisJCXNuZF9wcmludGRkKFNGWCAiU2V0dGluZyBOdmlkaWEgc25vb3A6ICVkXG4iLCBhenhfc25vb3AoY2hpcCkpOwogCQl1cGRhdGVfcGNpX2J5dGUoY2hpcC0+cGNpLAogCQkJCU5WSURJQV9IREFfVFJBTlNSRUdfQUREUiwKIAkJCQkweDBmLCBOVklESUFfSERBX0VOQUJMRV9DT0hCSVRTKTsKQEAgLTExMTgsMTYgKzExOTAsMjAgQEAKIAogCS8qIEVuYWJsZSBTQ0gvUENIIHNub29wIGlmIG5lZWRlZCAqLwogCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19TQ0hfU05PT1ApIHsKKwkJdW5zaWduZWQgc2hvcnQgc25vb3A7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgSU5URUxfU0NIX0hEQV9ERVZDLCAmc25vb3ApOwotCQlpZiAoc25vb3AgJiBJTlRFTF9TQ0hfSERBX0RFVkNfTk9TTk9PUCkgewotCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgSU5URUxfU0NIX0hEQV9ERVZDLAotCQkJCXNub29wICYgKH5JTlRFTF9TQ0hfSERBX0RFVkNfTk9TTk9PUCkpOworCQlpZiAoKCFhenhfc25vb3AoY2hpcCkgJiYgIShzbm9vcCAmIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QKSkgfHwKKwkJICAgIChhenhfc25vb3AoY2hpcCkgJiYgKHNub29wICYgSU5URUxfU0NIX0hEQV9ERVZDX05PU05PT1ApKSkgeworCQkJc25vb3AgJj0gfklOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QOworCQkJaWYgKCFhenhfc25vb3AoY2hpcCkpCisJCQkJc25vb3AgfD0gSU5URUxfU0NIX0hEQV9ERVZDX05PU05PT1A7CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoY2hpcC0+cGNpLCBJTlRFTF9TQ0hfSERBX0RFVkMsIHNub29wKTsKIAkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwKIAkJCQlJTlRFTF9TQ0hfSERBX0RFVkMsICZzbm9vcCk7Ci0JCQlzbmRfcHJpbnRkZChTRlggIkhEQSBzbm9vcCBkaXNhYmxlZCwgZW5hYmxpbmcgLi4uICVzXG4iLAotCQkJCShzbm9vcCAmIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QKQotCQkJCT8gIkZhaWxlZCIgOiAiT0siKTsKIAkJfQorCQlzbmRfcHJpbnRkZChTRlggIlNDSCBzbm9vcDogJXNcbiIsCisJCQkJKHNub29wICYgSU5URUxfU0NIX0hEQV9ERVZDX05PU05PT1ApCisJCQkJPyAiRGlzYWJsZWQiIDogIkVuYWJsZWQiKTsKICAgICAgICAgfQogfQogCkBAIC0xMzM0LDEyICsxNDEwLDE2IEBACiAgKi8KIHN0YXRpYyBpbnQgYXp4X3NldHVwX2NvbnRyb2xsZXIoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCiB7CisJdW5zaWduZWQgaW50IHZhbDsKIAkvKiBtYWtlIHN1cmUgdGhlIHJ1biBiaXQgaXMgemVybyBmb3IgU0QgKi8KIAlhenhfc3RyZWFtX2NsZWFyKGNoaXAsIGF6eF9kZXYpOwogCS8qIHByb2dyYW0gdGhlIHN0cmVhbV90YWcgKi8KLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0NUTCwKLQkJICAgICAgKGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9DVEwpICYgflNEX0NUTF9TVFJFQU1fVEFHX01BU0spfAotCQkgICAgICAoYXp4X2Rldi0+c3RyZWFtX3RhZyA8PCBTRF9DVExfU1RSRUFNX1RBR19TSElGVCkpOworCXZhbCA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9DVEwpOworCXZhbCA9ICh2YWwgJiB+U0RfQ1RMX1NUUkVBTV9UQUdfTUFTSykgfAorCQkoYXp4X2Rldi0+c3RyZWFtX3RhZyA8PCBTRF9DVExfU1RSRUFNX1RBR19TSElGVCk7CisJaWYgKCFhenhfc25vb3AoY2hpcCkpCisJCXZhbCB8PSBTRF9DVExfVFJBRkZJQ19QUklPOworCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQ1RMLCB2YWwpOwogCiAJLyogcHJvZ3JhbSB0aGUgbGVuZ3RoIG9mIHNhbXBsZXMgaW4gY3ljbGljIGJ1ZmZlciAqLwogCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQ0JMLCBhenhfZGV2LT5idWZzaXplKTsKQEAgLTE1MzMsNiArMTYxMyw5IEBACiB7CiAJaW50IGRldiwgaSwgbnVtczsKIAlzdHJ1Y3QgYXp4X2RldiAqcmVzID0gTlVMTDsKKwkvKiBtYWtlIGEgbm9uLXplcm8gdW5pcXVlIGtleSBmb3IgdGhlIHN1YnN0cmVhbSAqLworCWludCBrZXkgPSAoc3Vic3RyZWFtLT5wY20tPmRldmljZSA8PCAxNikgfCAoc3Vic3RyZWFtLT5udW1iZXIgPDwgMikgfAorCQkoc3Vic3RyZWFtLT5zdHJlYW0gKyAxKTsKIAogCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CiAJCWRldiA9IGNoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldDsKQEAgLTE1NDQsMTIgKzE2MjcsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtczsgaSsrLCBkZXYrKykKIAkJaWYgKCFjaGlwLT5henhfZGV2W2Rldl0ub3BlbmVkKSB7CiAJCQlyZXMgPSAmY2hpcC0+YXp4X2RldltkZXZdOwotCQkJaWYgKHJlcy0+ZGV2aWNlID09IHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UpCisJCQlpZiAocmVzLT5hc3NpZ25lZF9rZXkgPT0ga2V5KQogCQkJCWJyZWFrOwogCQl9CiAJaWYgKHJlcykgewogCQlyZXMtPm9wZW5lZCA9IDE7Ci0JCXJlcy0+ZGV2aWNlID0gc3Vic3RyZWFtLT5wY20tPmRldmljZTsKKwkJcmVzLT5hc3NpZ25lZF9rZXkgPSBrZXk7CiAJfQogCXJldHVybiByZXM7CiB9CkBAIC0xNTk5LDYgKzE2ODIsNyBAQAogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyOworCWludCBidWZmX3N0ZXA7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKIAlhenhfZGV2ID0gYXp4X2Fzc2lnbl9kZXZpY2UoY2hpcCwgc3Vic3RyZWFtKTsKQEAgLTE2MTMsMTAgKzE2OTcsMjUgQEAKIAlydW50aW1lLT5ody5yYXRlcyA9IGhpbmZvLT5yYXRlczsKIAlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOwogCXNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAoYWxpZ25fYnVmZmVyX3NpemUpCisJCS8qIGNvbnN0cmFpbiBidWZmZXIgc2l6ZXMgdG8gYmUgbXVsdGlwbGUgb2YgMTI4CisJCSAgIGJ5dGVzLiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IGluIHRlcm1zIG9mIG1lbW9yeQorCQkgICBhY2Nlc3MgYnV0IGlzbid0IHJlcXVpcmVkIGJ5IHRoZSBIREEgc3BlYyBhbmQKKwkJICAgcHJldmVudHMgdXNlcnMgZnJvbSBzcGVjaWZ5aW5nIGV4YWN0IHBlcmlvZC9idWZmZXIKKwkJICAgc2l6ZXMuIEZvciBleGFtcGxlIGZvciA0NC4xa0h6LCBhIHBlcmlvZCBzaXplIHNldAorCQkgICB0byAyMG1zIHdpbGwgYmUgcm91bmRlZCB0byAxOS41OW1zLiAqLworCQlidWZmX3N0ZXAgPSAxMjg7CisJZWxzZQorCQkvKiBEb24ndCBlbmZvcmNlIHN0ZXBzIG9uIGJ1ZmZlciBzaXplcywgc3RpbGwgbmVlZCB0bworCQkgICBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzIChIREEgc3BlYykuIFRlc3RlZCBvbiBJbnRlbAorCQkgICBIREEgY29udHJvbGxlcnMsIG1heSBub3Qgd29yayBvbiBhbGwgZGV2aWNlcyB3aGVyZQorCQkgICBvcHRpb24gbmVlZHMgdG8gYmUgZGlzYWJsZWQgKi8KKwkJYnVmZl9zdGVwID0gNDsKKwogCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCi0JCQkJICAgMTI4KTsKKwkJCQkgICBidWZmX3N0ZXApOwogCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsCi0JCQkJICAgMTI4KTsKKwkJCQkgICBidWZmX3N0ZXApOwogCXNuZF9oZGFfcG93ZXJfdXAoYXBjbS0+Y29kZWMpOwogCWVyciA9IGhpbmZvLT5vcHMub3BlbihoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTE2NzEsMTkgKzE3NzAsMzAgQEAKIHN0YXRpYyBpbnQgYXp4X3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogeworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCWludCByZXQ7CiAKKwltYXJrX3J1bnRpbWVfd2MoY2hpcCwgYXp4X2RldiwgcnVudGltZSwgZmFsc2UpOwogCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOwogCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IDA7CiAJYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IDA7Ci0JcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCisJcmV0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKIAkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwltYXJrX3J1bnRpbWVfd2MoY2hpcCwgYXp4X2RldiwgcnVudGltZSwgdHJ1ZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhenhfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKIAogCS8qIHJlc2V0IEJETCBhZGRyZXNzICovCkBAIC0xNjk2LDYgKzE4MDYsNyBAQAogCiAJc25kX2hkYV9jb2RlY19jbGVhbnVwKGFwY20tPmNvZGVjLCBoaW5mbywgc3Vic3RyZWFtKTsKIAorCW1hcmtfcnVudGltZV93YyhjaGlwLCBhenhfZGV2LCBydW50aW1lLCBmYWxzZSk7CiAJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKIH0KIApAQCAtMjA1NSw2ICsyMTY2LDIwIEBACiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKKyNpZmRlZiBDT05GSUdfWDg2CitzdGF0aWMgaW50IGF6eF9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKKwlpZiAoIWF6eF9zbm9vcChjaGlwKSkKKwkJYXJlYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZShhcmVhLT52bV9wYWdlX3Byb3QpOworCXJldHVybiBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3Vic3RyZWFtLCBhcmVhKTsKK30KKyNlbHNlCisjZGVmaW5lIGF6eF9wY21fbW1hcAlOVUxMCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBhenhfcGNtX29wcyA9IHsKIAkub3BlbiA9IGF6eF9wY21fb3BlbiwKIAkuY2xvc2UgPSBhenhfcGNtX2Nsb3NlLApAQCAtMjA2NCw2ICsyMTg5LDcgQEAKIAkucHJlcGFyZSA9IGF6eF9wY21fcHJlcGFyZSwKIAkudHJpZ2dlciA9IGF6eF9wY21fdHJpZ2dlciwKIAkucG9pbnRlciA9IGF6eF9wY21fcG9pbnRlciwKKwkubW1hcCA9IGF6eF9wY21fbW1hcCwKIAkucGFnZSA9IHNuZF9wY21fc2didWZfb3BzX3BhZ2UsCiB9OwogCkBAIC0yMzQ0LDEzICsyNDcwLDE5IEBACiAKIAlpZiAoY2hpcC0+YXp4X2RldikgewogCQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykKLQkJCWlmIChjaGlwLT5henhfZGV2W2ldLmJkbC5hcmVhKQorCQkJaWYgKGNoaXAtPmF6eF9kZXZbaV0uYmRsLmFyZWEpIHsKKwkJCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5henhfZGV2W2ldLmJkbCwgZmFsc2UpOwogCQkJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+YXp4X2RldltpXS5iZGwpOworCQkJfQogCX0KLQlpZiAoY2hpcC0+cmIuYXJlYSkKKwlpZiAoY2hpcC0+cmIuYXJlYSkgeworCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5yYiwgZmFsc2UpOwogCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPnJiKTsKLQlpZiAoY2hpcC0+cG9zYnVmLmFyZWEpCisJfQorCWlmIChjaGlwLT5wb3NidWYuYXJlYSkgeworCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5wb3NidWYsIGZhbHNlKTsKIAkJc25kX2RtYV9mcmVlX3BhZ2VzKCZjaGlwLT5wb3NidWYpOworCX0KIAlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CiAJa2ZyZWUoY2hpcC0+YXp4X2Rldik7CkBAIC0yNTQ2LDYgKzI2NzgsNyBAQAogCWNoZWNrX3Byb2JlX21hc2soY2hpcCwgZGV2KTsKIAogCWNoaXAtPnNpbmdsZV9jbWQgPSBzaW5nbGVfY21kOworCWNoaXAtPnNub29wID0gaGRhX3Nub29wOwogCiAJaWYgKGJkbF9wb3NfYWRqW2Rldl0gPCAwKSB7CiAJCXN3aXRjaCAoY2hpcC0+ZHJpdmVyX3R5cGUpIHsKQEAgLTI2MTgsNiArMjc1MSwxMCBAQAogCQlnY2FwICY9IH5JQ0g2X0dDQVBfNjRPSzsKIAl9CiAKKwkvKiBkaXNhYmxlIGJ1ZmZlciBzaXplIHJvdW5kaW5nIHRvIDEyOC1ieXRlIG11bHRpcGxlcyBpZiBzdXBwb3J0ZWQgKi8KKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQlVGU0laRSkKKwkJYWxpZ25fYnVmZmVyX3NpemUgPSAwOworCiAJLyogYWxsb3cgNjRiaXQgRE1BIGFkZHJlc3MgaWYgc3VwcG9ydGVkIGJ5IEgvVyAqLwogCWlmICgoZ2NhcCAmIElDSDZfR0NBUF82NE9LKSAmJiAhcGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSyg2NCkpKQogCQlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soNjQpKTsKQEAgLTI2NjksNiArMjgwNiw3IEBACiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiY2Fubm90IGFsbG9jYXRlIEJETFxuIik7CiAJCQlnb3RvIGVycm91dDsKIAkJfQorCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5henhfZGV2W2ldLmJkbCwgdHJ1ZSk7CiAJfQogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLwogCWVyciA9IHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLApAQCAtMjY3OCw2ICsyODE2LDcgQEAKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCBhbGxvY2F0ZSBwb3NidWZcbiIpOwogCQlnb3RvIGVycm91dDsKIAl9CisJbWFya19wYWdlc193YyhjaGlwLCAmY2hpcC0+cG9zYnVmLCB0cnVlKTsKIAkvKiBhbGxvY2F0ZSBDT1JCL1JJUkIgKi8KIAllcnIgPSBhenhfYWxsb2NfY21kX2lvKGNoaXApOwogCWlmIChlcnIgPCAwKQpAQCAtMjgxOSwzNyArMjk1OCw0OSBAQAogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGF6eF9pZHMpID0gewogCS8qIENQVCAqLwogCXsgUENJX0RFVklDRSgweDgwODYsIDB4MWMyMCksCi0JICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX1BDSCB8IEFaWF9EQ0FQU19TQ0hfU05PT1AgfSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfUENIIHwgQVpYX0RDQVBTX1NDSF9TTk9PUCB8CisJICBBWlhfRENBUFNfQlVGU0laRSB9LAogCS8qIFBCRyAqLwogCXsgUENJX0RFVklDRSgweDgwODYsIDB4MWQyMCksCi0JICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX1BDSCB8IEFaWF9EQ0FQU19TQ0hfU05PT1AgfSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfUENIIHwgQVpYX0RDQVBTX1NDSF9TTk9PUCB8CisJICBBWlhfRENBUFNfQlVGU0laRX0sCiAJLyogUGFudGhlciBQb2ludCAqLwogCXsgUENJX0RFVklDRSgweDgwODYsIDB4MWUyMCksCi0JICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX1BDSCB8IEFaWF9EQ0FQU19TQ0hfU05PT1AgfSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfUENIIHwgQVpYX0RDQVBTX1NDSF9TTk9PUCB8CisJICBBWlhfRENBUFNfQlVGU0laRX0sCiAJLyogU0NIICovCiAJeyBQQ0lfREVWSUNFKDB4ODA4NiwgMHg4MTFiKSwKLQkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfU0NIIHwgQVpYX0RDQVBTX1NDSF9TTk9PUCB9LAorCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9TQ0ggfCBBWlhfRENBUFNfU0NIX1NOT09QIHwKKwkgIEFaWF9EQ0FQU19CVUZTSVpFfSwKIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI2NjgpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g2ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDYgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI3ZDgpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g3ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDcgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI2OWEpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBFU0IyICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIEVTQjIgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI4NGIpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g4ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDggKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI5M2UpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g5ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDkgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI5M2YpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g5ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDkgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDNhM2UpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0gxMCAqLworCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIHwKKwkgIEFaWF9EQ0FQU19CVUZTSVpFIH0sICAvKiBJQ0gxMCAqLwogCXsgUENJX0RFVklDRSgweDgwODYsIDB4M2E2ZSksCi0JICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfSwgIC8qIElDSDEwICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDEwICovCiAJLyogR2VuZXJpYyBJbnRlbCAqLwogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfQU5ZX0lEKSwKIAkgIC5jbGFzcyA9IFBDSV9DTEFTU19NVUxUSU1FRElBX0hEX0FVRElPIDw8IDgsCiAJICAuY2xhc3NfbWFzayA9IDB4ZmZmZmZmLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfSUNIIHwgQVpYX0RDQVBTX0JVRlNJWkUgfSwKIAkvKiBBVEkgU0IgNDUwLzYwMC83MDAvODAwLzkwMCAqLwogCXsgUENJX0RFVklDRSgweDEwMDIsIDB4NDM3YiksCiAJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0FUSSB8IEFaWF9EQ0FQU19QUkVTRVRfQVRJX1NCIH0sCkBAIC0yOTEyLDEyICszMDYzLDEyIEBACiAJICAuY2xhc3MgPSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9IRF9BVURJTyA8PCA4LAogCSAgLmNsYXNzX21hc2sgPSAweGZmZmZmZiwKIAkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfQ1RYIHwgQVpYX0RDQVBTX0NUWF9XT1JLQVJPVU5EIHwKLQkgIEFaWF9EQ0FQU19SSVJCX1BSRV9ERUxBWSB9LAorCSAgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZIHwgQVpYX0RDQVBTX1BPU0ZJWF9MUElCIH0sCiAjZWxzZQogCS8qIHRoaXMgZW50cnkgc2VlbXMgc3RpbGwgdmFsaWQgLS0gaS5lLiB3aXRob3V0IGVtdTIwa3ggY2hpcCAqLwogCXsgUENJX0RFVklDRSgweDExMDIsIDB4MDAwOSksCiAJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0NUWCB8IEFaWF9EQ0FQU19DVFhfV09SS0FST1VORCB8Ci0JICBBWlhfRENBUFNfUklSQl9QUkVfREVMQVkgfSwKKwkgIEFaWF9EQ0FQU19SSVJCX1BSRV9ERUxBWSB8IEFaWF9EQ0FQU19QT1NGSVhfTFBJQiB9LAogI2VuZGlmCiAJLyogVm9ydGV4ODZNWCAqLwogCXsgUENJX0RFVklDRSgweDE3ZjMsIDB4MzAxMCksIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfR0VORVJJQyB9LApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKaW5kZXggMmU3YWMzMS4uNjU3OWUwZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCkBAIC0yNjcsMTEgKzI2NywxNCBAQAogZW51bSB7IEhEQV9GUk9OVCwgSERBX1JFQVIsIEhEQV9DTEZFLCBIREFfU0lERSB9OyAvKiBpbmRleCBmb3IgZGFjX25pZHggKi8KIGVudW0geyBIREFfRElHX05PTkUsIEhEQV9ESUdfRVhDTFVTSVZFLCBIREFfRElHX0FOQUxPR19EVVAgfTsgLyogZGlnX291dF91c2VkICovCiAKKyNkZWZpbmUgSERBX01BWF9PVVRTCTUKKwogc3RydWN0IGhkYV9tdWx0aV9vdXQgewogCWludCBudW1fZGFjczsJCS8qICMgb2YgREFDcywgbXVzdCBiZSBtb3JlIHRoYW4gMSAqLwogCWNvbnN0IGhkYV9uaWRfdCAqZGFjX25pZHM7CS8qIERBQyBsaXN0ICovCiAJaGRhX25pZF90IGhwX25pZDsJLyogb3B0aW9uYWwgREFDIGZvciBIUCwgMCB3aGVuIG5vdCBleGlzdHMgKi8KLQloZGFfbmlkX3QgZXh0cmFfb3V0X25pZFszXTsJLyogb3B0aW9uYWwgREFDcywgMCB3aGVuIG5vdCBleGlzdHMgKi8KKwloZGFfbmlkX3QgaHBfb3V0X25pZFtIREFfTUFYX09VVFNdOwkvKiBEQUNzIGZvciBtdWx0aXBsZSBIUHMgKi8KKwloZGFfbmlkX3QgZXh0cmFfb3V0X25pZFtIREFfTUFYX09VVFNdOwkvKiBvdGhlciAoZS5nLiBzcGVha2VyKSBEQUNzICovCiAJaGRhX25pZF90IGRpZ19vdXRfbmlkOwkvKiBkaWdpdGFsIG91dCBhdWRpbyB3aWRnZXQgKi8KIAljb25zdCBoZGFfbmlkX3QgKnNsYXZlX2RpZ19vdXRzOwogCWludCBtYXhfY2hhbm5lbHM7CS8qIGN1cnJlbnRseSBzdXBwb3J0ZWQgYW5hbG9nIGNoYW5uZWxzICovCkBAIC0zMzMsOSArMzM2LDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFfY29kZWNfcHJvY19uZXcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCi0jZGVmaW5lIFNORF9QUklOVF9SQVRFU19BRFZJU0VEX0JVRlNJWkUJODAKLXZvaWQgc25kX3ByaW50X3BjbV9yYXRlcyhpbnQgcGNtLCBjaGFyICpidWYsIGludCBidWZsZW4pOwotCiAjZGVmaW5lIFNORF9QUklOVF9CSVRTX0FEVklTRURfQlVGU0laRQkxNgogdm9pZCBzbmRfcHJpbnRfcGNtX2JpdHMoaW50IHBjbSwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKIApAQCAtMzg1LDcgKzM4NSw3IEBACiAJQVVUT19QSU5fSFBfT1VUCiB9OwogCi0jZGVmaW5lIEFVVE9fQ0ZHX01BWF9PVVRTCTUKKyNkZWZpbmUgQVVUT19DRkdfTUFYX09VVFMJSERBX01BWF9PVVRTCiAjZGVmaW5lIEFVVE9fQ0ZHX01BWF9JTlMJOAogCiBzdHJ1Y3QgYXV0b19waW5fY2ZnX2l0ZW0gewpAQCAtNDQyLDEwICs0NDIsMjEgQEAKIAkoY2ZnICYgQUNfREVGQ0ZHX1NFUVVFTkNFKQogI2RlZmluZSBnZXRfZGVmY2ZnX2RldmljZShjZmcpIFwKIAkoKGNmZyAmIEFDX0RFRkNGR19ERVZJQ0UpID4+IEFDX0RFRkNGR19ERVZJQ0VfU0hJRlQpCisjZGVmaW5lIGdldF9kZWZjZmdfbWlzYyhjZmcpIFwKKwkoKGNmZyAmIEFDX0RFRkNGR19NSVNDKSA+PiBBQ19ERUZDRkdfTUlTQ19TSElGVCkKIAotaW50IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJIHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKLQkJCQkgY29uc3QgaGRhX25pZF90ICppZ25vcmVfbmlkcyk7CisvKiBiaXQtZmxhZ3MgZm9yIHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoKSBiZWhhdmlvciAqLworI2RlZmluZSBIREFfUElOQ0ZHX05PX0hQX0ZJWFVQCSgxIDw8IDApIC8qIG5vIEhQLXNwbGl0ICovCisjZGVmaW5lIEhEQV9QSU5DRkdfTk9fTE9fRklYVVAJKDEgPDwgMSkgLyogZG9uJ3QgdGFrZSBvdGhlciBvdXRzIGFzIExPICovCisKK2ludCBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZjZmcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkgICAgIHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKKwkJCSAgICAgY29uc3QgaGRhX25pZF90ICppZ25vcmVfbmlkcywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvbmRfZmxhZ3MpOworCisvKiBvbGRlciBmdW5jdGlvbiAqLworI2RlZmluZSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCBjZmcsIGlnbm9yZSkgXAorCXNuZF9oZGFfcGFyc2VfcGluX2RlZmNmZyhjb2RlYywgY2ZnLCBpZ25vcmUsIDApCiAKIC8qIGFtcCB2YWx1ZXMgKi8KICNkZWZpbmUgQU1QX0lOX01VVEUoaWR4KQkoMHg3MDgwIHwgKChpZHgpPDw4KSkKQEAgLTQ5MiwxMyArNTAzLDIyIEBACiBpbnQgc25kX2hkYV9vdmVycmlkZV9hbXBfY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpciwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBjYXBzKTsKIHUzMiBzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKTsKK2ludCBzbmRfaGRhX292ZXJyaWRlX3Bpbl9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNhcHMpOwogdTMyIHNuZF9oZGFfcGluX3NlbnNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKTsKIGludCBzbmRfaGRhX2phY2tfZGV0ZWN0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKTsKIAogc3RhdGljIGlubGluZSBib29sIGlzX2phY2tfZGV0ZWN0YWJsZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKIHsKLQlyZXR1cm4gKHNuZF9oZGFfcXVlcnlfcGluX2NhcHMoY29kZWMsIG5pZCkgJiBBQ19QSU5DQVBfUFJFU19ERVRFQ1QpICYmCi0JCShnZXRfd2NhcHMoY29kZWMsIG5pZCkgJiBBQ19XQ0FQX1VOU09MX0NBUCk7CisJaWYgKCEoc25kX2hkYV9xdWVyeV9waW5fY2Fwcyhjb2RlYywgbmlkKSAmIEFDX1BJTkNBUF9QUkVTX0RFVEVDVCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoIWNvZGVjLT5pZ25vcmVfbWlzY19iaXQgJiYKKwkgICAgKGdldF9kZWZjZmdfbWlzYyhzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCkpICYKKwkgICAgIEFDX0RFRkNGR19NSVNDX05PX1BSRVNFTkNFKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICghKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfVU5TT0xfQ0FQKSkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOwogfQogCiAvKiBmbGFncyBmb3IgaGRhX25pZF9pdGVtICovCkBAIC01ODksNyArNjA5LDggQEAKICNkZWZpbmUgZ2V0X2FtcF9uaWRfKHB2KQkoKHB2KSAmIDB4ZmZmZikKICNkZWZpbmUgZ2V0X2FtcF9uaWQoa2MpCQlnZXRfYW1wX25pZF8oKGtjKS0+cHJpdmF0ZV92YWx1ZSkKICNkZWZpbmUgZ2V0X2FtcF9jaGFubmVscyhrYykJKCgoa2MpLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4MykKLSNkZWZpbmUgZ2V0X2FtcF9kaXJlY3Rpb24oa2MpCSgoKGtjKS0+cHJpdmF0ZV92YWx1ZSA+PiAxOCkgJiAweDEpCisjZGVmaW5lIGdldF9hbXBfZGlyZWN0aW9uXyhwdikJKCgocHYpID4+IDE4KSAmIDB4MSkKKyNkZWZpbmUgZ2V0X2FtcF9kaXJlY3Rpb24oa2MpCWdldF9hbXBfZGlyZWN0aW9uXygoa2MpLT5wcml2YXRlX3ZhbHVlKQogI2RlZmluZSBnZXRfYW1wX2luZGV4KGtjKQkoKChrYyktPnByaXZhdGVfdmFsdWUgPj4gMTkpICYgMHhmKQogI2RlZmluZSBnZXRfYW1wX29mZnNldChrYykJKCgoa2MpLT5wcml2YXRlX3ZhbHVlID4+IDIzKSAmIDB4M2YpCiAjZGVmaW5lIGdldF9hbXBfbWluX211dGUoa2MpCSgoKGtjKS0+cHJpdmF0ZV92YWx1ZSA+PiAyOSkgJiAweDEpCkBAIC02MDcsNiArNjI4LDcgQEAKIH07CiAKICNkZWZpbmUgRUxEX0ZJWEVEX0JZVEVTCTIwCisjZGVmaW5lIEVMRF9NQVhfU0laRSAgICAyNTYKICNkZWZpbmUgRUxEX01BWF9NTkwJMTYKICNkZWZpbmUgRUxEX01BWF9TQUQJMTYKIApAQCAtNjMxLDYgKzY1Myw3IEBACiAJaW50CXNwa19hbGxvYzsKIAlpbnQJc2FkX2NvdW50OwogCXN0cnVjdCBjZWFfc2FkIHNhZFtFTERfTUFYX1NBRF07CisJY2hhciAgICBlbGRfYnVmZmVyW0VMRF9NQVhfU0laRV07CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnByb2NfZW50cnk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYwppbmRleCAyYmU1N2IwLi4yYzk4MWI1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jCkBAIC0xNTIsMTIgKzE1MiwxOCBAQAogCiBzdGF0aWMgdm9pZCBwcmludF9wY21fcmF0ZXMoc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgcGNtKQogewotCWNoYXIgYnVmW1NORF9QUklOVF9SQVRFU19BRFZJU0VEX0JVRlNJWkVdOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNbXSA9IHsKKwkJODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgODgyMDAsCisJCTk2MDAwLCAxNzY0MDAsIDE5MjAwMCwgMzg0MDAwCisJfTsKKwlpbnQgaTsKIAogCXBjbSAmPSBBQ19TVVBQQ01fUkFURVM7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiICAgIHJhdGVzIFsweCV4XToiLCBwY20pOwotCXNuZF9wcmludF9wY21fcmF0ZXMocGNtLCBidWYsIHNpemVvZihidWYpKTsKLQlzbmRfaXByaW50ZihidWZmZXIsICIlc1xuIiwgYnVmKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlcyk7IGkrKykKKwkJaWYgKHBjbSAmICgxIDw8IGkpKQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAgIiAlZCIsIHJhdGVzW2ldKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF9wY21fYml0cyhzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGludCBwY20pCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV90cmFjZS5oIGIvc291bmQvcGNpL2hkYS9oZGFfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODg0ODcxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfdHJhY2UuaApAQCAtMCwwICsxLDExNyBAQAorI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gaGRhCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBoZGFfdHJhY2UKKworI2lmICFkZWZpbmVkKF9UUkFDRV9IREFfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0hEQV9ICisKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK3N0cnVjdCBoZGFfYnVzOworc3RydWN0IGhkYV9jb2RlYzsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhoZGFfY21kLAorCisJVFBfUFJPVE8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhjb2RlYywgdmFsKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwgY2FyZCApCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwgYWRkciApCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwgdmFsICkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNhcmQgPSAoY29kZWMpLT5idXMtPmNhcmQtPm51bWJlcjsKKwkJX19lbnRyeS0+YWRkciA9IChjb2RlYyktPmFkZHI7CisJCV9fZW50cnktPnZhbCA9ICh2YWwpOworCSksCisKKwlUUF9wcmludGsoIlslZDolZF0gdmFsPSV4IiwgX19lbnRyeS0+Y2FyZCwgX19lbnRyeS0+YWRkciwgX19lbnRyeS0+dmFsKQorKTsKKworREVGSU5FX0VWRU5UKGhkYV9jbWQsIGhkYV9zZW5kX2NtZCwKKwlUUF9QUk9UTyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHZhbCksCisJVFBfQVJHUyhjb2RlYywgdmFsKQorKTsKKworREVGSU5FX0VWRU5UKGhkYV9jbWQsIGhkYV9nZXRfcmVzcG9uc2UsCisJVFBfUFJPVE8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCB2YWwpLAorCVRQX0FSR1MoY29kZWMsIHZhbCkKKyk7CisKK1RSQUNFX0VWRU5UKGhkYV9idXNfcmVzZXQsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgaGRhX2J1cyAqYnVzKSwKKworCVRQX0FSR1MoYnVzKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwgY2FyZCApCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jYXJkID0gKGJ1cyktPmNhcmQtPm51bWJlcjsKKwkpLAorCisJVFBfcHJpbnRrKCJbJWRdIiwgX19lbnRyeS0+Y2FyZCkKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoaGRhX3Bvd2VyLAorCisJVFBfUFJPVE8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpLAorCisJVFBfQVJHUyhjb2RlYyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsIGNhcmQgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsIGFkZHIgKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+Y2FyZCA9IChjb2RlYyktPmJ1cy0+Y2FyZC0+bnVtYmVyOworCQlfX2VudHJ5LT5hZGRyID0gKGNvZGVjKS0+YWRkcjsKKwkpLAorCisJVFBfcHJpbnRrKCJbJWQ6JWRdIiwgX19lbnRyeS0+Y2FyZCwgX19lbnRyeS0+YWRkcikKKyk7CisKK0RFRklORV9FVkVOVChoZGFfcG93ZXIsIGhkYV9wb3dlcl9kb3duLAorCVRQX1BST1RPKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKSwKKwlUUF9BUkdTKGNvZGVjKQorKTsKKworREVGSU5FX0VWRU5UKGhkYV9wb3dlciwgaGRhX3Bvd2VyX3VwLAorCVRQX1BST1RPKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKSwKKwlUUF9BUkdTKGNvZGVjKQorKTsKKworVFJBQ0VfRVZFTlQoaGRhX3Vuc29sX2V2ZW50LAorCisJVFBfUFJPVE8oc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHJlcywgdTMyIHJlc19leCksCisKKwlUUF9BUkdTKGJ1cywgcmVzLCByZXNfZXgpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggdW5zaWduZWQgaW50LCBjYXJkICkKKwkJX19maWVsZCggdTMyLCByZXMgKQorCQlfX2ZpZWxkKCB1MzIsIHJlc19leCApCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jYXJkID0gKGJ1cyktPmNhcmQtPm51bWJlcjsKKwkJX19lbnRyeS0+cmVzID0gcmVzOworCQlfX2VudHJ5LT5yZXNfZXggPSByZXNfZXg7CisJKSwKKworCVRQX3ByaW50aygiWyVkXSByZXM9JXgsIHJlc19leD0leCIsIF9fZW50cnktPmNhcmQsCisJCSAgX19lbnRyeS0+cmVzLCBfX2VudHJ5LT5yZXNfZXgpCispOworCisjZW5kaWYgLyogX1RSQUNFX0hEQV9IICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSAorI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLgorI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggODY0ODkxNy4uYmNiMzMxMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCkBAIC00OCw2ICs0OSw4IEBACiAKIAljb25zdCBoZGFfbmlkX3QgKmFsdF9kYWNfbmlkOwogCWNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqc3RyZWFtX2FuYWxvZ19hbHRfcGxheWJhY2s7CisJaW50IGluZGVwZW5kZW50X2hwOworCWludCBudW1fYWN0aXZlX3N0cmVhbXM7CiAKIAkvKiBjYXB0dXJlICovCiAJdW5zaWduZWQgaW50IG51bV9hZGNfbmlkczsKQEAgLTMwMiw2ICszMDUsNzIgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgdm9pZCBhY3RpdmF0ZV9jdGwoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBhY3RpdmUpCit7CisJc3RydWN0IHNuZF9rY29udHJvbCAqY3RsID0gc25kX2hkYV9maW5kX21peGVyX2N0bChjb2RlYywgbmFtZSk7CisJaWYgKGN0bCkgeworCQljdGwtPnZkWzBdLmFjY2VzcyAmPSB+U05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCQljdGwtPnZkWzBdLmFjY2VzcyB8PSBhY3RpdmUgPyAwIDoKKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwkJY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURTsKKwkJY3RsLT52ZFswXS5hY2Nlc3MgfD0gYWN0aXZlID8KKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURSA6IDA7CisJCXNuZF9jdGxfbm90aWZ5KGNvZGVjLT5idXMtPmNhcmQsCisJCQkgICAgICAgU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywgJmN0bC0+aWQpOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X3N0cmVhbV9hY3RpdmUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGJvb2wgYWN0aXZlKQoreworCXN0cnVjdCBhZDE5OHhfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWlmIChhY3RpdmUpCisJCXNwZWMtPm51bV9hY3RpdmVfc3RyZWFtcysrOworCWVsc2UKKwkJc3BlYy0+bnVtX2FjdGl2ZV9zdHJlYW1zLS07CisJYWN0aXZhdGVfY3RsKGNvZGVjLCAiSW5kZXBlbmRlbnQgSFAiLCBzcGVjLT5udW1fYWN0aXZlX3N0cmVhbXMgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWQxOTg4X2luZGVwZW5kZW50X2hwX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzW10gPSB7ICJPRkYiLCAiT04iLCBOVUxMfTsKKwlpbnQgaW5kZXg7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaW5kZXggPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtOworCWlmIChpbmRleCA+PSAyKQorCQlpbmRleCA9IDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW2luZGV4XSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQxOTg4X2luZGVwZW5kZW50X2hwX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhZDE5OHhfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5pbmRlcGVuZGVudF9ocDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE5ODhfaW5kZXBlbmRlbnRfaHBfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFkMTk4eF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IHNlbGVjdCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaWYgKHNwZWMtPmluZGVwZW5kZW50X2hwICE9IHNlbGVjdCkgeworCQlzcGVjLT5pbmRlcGVuZGVudF9ocCA9IHNlbGVjdDsKKwkJaWYgKHNwZWMtPmluZGVwZW5kZW50X2hwKQorCQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMDsKKwkJZWxzZQorCQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gc3BlYy0+YWx0X2RhY19uaWRbMF07CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIEFuYWxvZyBwbGF5YmFjayBjYWxsYmFja3MKICAqLwpAQCAtMzEwLDggKzM3OSwxNSBAQAogCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QgYWQxOTh4X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX29wZW4oY29kZWMsICZzcGVjLT5tdWx0aW91dCwgc3Vic3RyZWFtLAorCWludCBlcnI7CisJc2V0X3N0cmVhbV9hY3RpdmUoY29kZWMsIHRydWUpOworCWVyciA9IHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN1YnN0cmVhbSwKIAkJCQkJICAgICBoaW5mbyk7CisJaWYgKGVyciA8IDApIHsKKwkJc2V0X3N0cmVhbV9hY3RpdmUoY29kZWMsIGZhbHNlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWQxOTh4X3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCkBAIC0zMzMsMTEgKzQwOSw0MSBAQAogCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfY2xlYW51cChjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKIH0KIAorc3RhdGljIGludCBhZDE5OHhfcGxheWJhY2tfcGNtX2Nsb3NlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzZXRfc3RyZWFtX2FjdGl2ZShjb2RlYywgZmFsc2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkMTk4OF9hbHRfcGxheWJhY2tfcGNtX29wZW4oc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhZDE5OHhfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWlmICghc3BlYy0+aW5kZXBlbmRlbnRfaHApCisJCXJldHVybiAtRUJVU1k7CisJc2V0X3N0cmVhbV9hY3RpdmUoY29kZWMsIHRydWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkMTk4OF9hbHRfcGxheWJhY2tfcGNtX2Nsb3NlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzZXRfc3RyZWFtX2FjdGl2ZShjb2RlYywgZmFsc2UpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFkMTk4eF9wY21fYW5hbG9nX2FsdF9wbGF5YmFjayA9IHsKIAkuc3Vic3RyZWFtcyA9IDEsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDIsCi0JLyogTklEIGlzIHNldCBpbiBhZDE5OHhfYnVpbGRfcGNtcyAqLworCS5vcHMgPSB7CisJCS5vcGVuICA9IGFkMTk4OF9hbHRfcGxheWJhY2tfcGNtX29wZW4sCisJCS5jbG9zZSA9IGFkMTk4OF9hbHRfcGxheWJhY2tfcGNtX2Nsb3NlCisJfSwKIH07CiAKIC8qCkBAIC00MDIsNyArNTA4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFkMTk4eF9wY21fYW5hbG9nX3BsYXliYWNrID0gewpAQCAtNDEzLDcgKzUxOCw4IEBACiAJLm9wcyA9IHsKIAkJLm9wZW4gPSBhZDE5OHhfcGxheWJhY2tfcGNtX29wZW4sCiAJCS5wcmVwYXJlID0gYWQxOTh4X3BsYXliYWNrX3BjbV9wcmVwYXJlLAotCQkuY2xlYW51cCA9IGFkMTk4eF9wbGF5YmFja19wY21fY2xlYW51cAorCQkuY2xlYW51cCA9IGFkMTk4eF9wbGF5YmFja19wY21fY2xlYW51cCwKKwkJLmNsb3NlID0gYWQxOTh4X3BsYXliYWNrX3BjbV9jbG9zZQogCX0sCiB9OwogCkBAIC0yMDU4LDcgKzIxNjQsNiBAQAogZW51bSB7CiAJQUQxOTg4XzZTVEFDSywKIAlBRDE5ODhfNlNUQUNLX0RJRywKLQlBRDE5ODhfNlNUQUNLX0RJR19GUCwKIAlBRDE5ODhfM1NUQUNLLAogCUFEMTk4OF8zU1RBQ0tfRElHLAogCUFEMTk4OF9MQVBUT1AsCkBAIC0yMTY4LDYgKzIyNzMsMTcgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWQxOTg4X2hwX21peGVyc1tdID0geworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkluZGVwZW5kZW50IEhQIiwKKwkJLmluZm8gPSBhZDE5ODhfaW5kZXBlbmRlbnRfaHBfaW5mbywKKwkJLmdldCA9IGFkMTk4OF9pbmRlcGVuZGVudF9ocF9nZXQsCisJCS5wdXQgPSBhZDE5ODhfaW5kZXBlbmRlbnRfaHBfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKwogLyogNi1zdGFjayBtb2RlICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWQxOTg4XzZzdGFja19taXhlcnMxW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMHgwLCBIREFfT1VUUFVUKSwKQEAgLTIxODgsNiArMjMwNCw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWQxOTg4XzZzdGFja19taXhlcnMyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgyOSwgMiwgSERBX0lOUFVUKSwKIAlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDJhLCAyLCBIREFfSU5QVVQpLAogCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjcsIDEsIDIsIEhEQV9JTlBVVCksCkBAIC0yMjEwLDEzICsyMzI3LDYgQEAKIAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDM5LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDNjLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkMTk4OF82c3RhY2tfZnBfbWl4ZXJzW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0KIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC0yMjM4LDYgKzIzNDgsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkMTk4OF8zc3RhY2tfbWl4ZXJzMltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MjksIDIsIEhEQV9JTlBVVCksCiAJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgyYywgMiwgSERBX0lOUFVUKSwKIAlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDI2LCAxLCAyLCBIREFfSU5QVVQpLApAQCAtMjI3Miw2ICsyMzgzLDcgQEAKIAogLyogbGFwdG9wIG1vZGUgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZDE5ODhfbGFwdG9wX21peGVyc1tdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMHgyOSwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9CSU5EX01VVEUoIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxZSwgMiwgSERBX0lOUFVUKSwKQEAgLTI0NDYsNyArMjU1OCw3IEBACiAJezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKIAl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAogCS8qIFBvcnQtQSBmcm9udCBoZWFkcGhvbiBwYXRoICovCi0JezB4MzcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgLyogREFDMTowNGggKi8KKwl7MHgzNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBEQUMwOjAzaCAqLwogCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCiAJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKIAl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LApAQCAtMjU5NCw3ICsyNzA2LDcgQEAKIAl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAogCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJLyogUG9ydC1BIGZyb250IGhlYWRwaG9uIHBhdGggKi8KLQl7MHgzNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LCAvKiBEQUMxOjA0aCAqLworCXsweDM3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIERBQzA6MDNoICovCiAJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKIAl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAogCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCkBAIC0yNjY5LDcgKzI3ODEsNyBAQAogCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKIAkvKiBQb3J0LUEgZnJvbnQgaGVhZHBob24gcGF0aCAqLwotCXsweDM3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sIC8qIERBQzE6MDRoICovCisJezB4MzcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogREFDMDowM2ggKi8KIAl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAogCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCiAJezB4MTEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKQEAgLTI3ODIsMTEgKzI4OTQsMTEgQEAKIHsKIAlzdGF0aWMgY29uc3QgaGRhX25pZF90IGlkeF90b19kYWNbOF0gPSB7CiAJCS8qIEEgICAgIEIgICAgIEMgICAgIEQgICAgIEUgICAgIEYgICAgIEcgICAgIEggKi8KLQkJMHgwNCwgMHgwNiwgMHgwNSwgMHgwNCwgMHgwYSwgMHgwNiwgMHgwNSwgMHgwYQorCQkweDAzLCAweDA2LCAweDA1LCAweDA0LCAweDBhLCAweDA2LCAweDA1LCAweDBhCiAJfTsKIAlzdGF0aWMgY29uc3QgaGRhX25pZF90IGlkeF90b19kYWNfcmV2Mls4XSA9IHsKIAkJLyogQSAgICAgQiAgICAgQyAgICAgRCAgICAgRSAgICAgRiAgICAgRyAgICAgSCAqLwotCQkweDA0LCAweDA1LCAweDBhLCAweDA0LCAweDA2LCAweDA1LCAweDBhLCAweDA2CisJCTB4MDMsIDB4MDUsIDB4MGEsIDB4MDQsIDB4MDYsIDB4MDUsIDB4MGEsIDB4MDYKIAl9OwogCWlmIChpc19yZXYyKGNvZGVjKSkKIAkJcmV0dXJuIGlkeF90b19kYWNfcmV2MltpZHhdOwpAQCAtMzAyMyw4ICszMTM1LDggQEAKIAlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgcGluX3R5cGUpOwogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUpOwogCXN3aXRjaCAobmlkKSB7Ci0JY2FzZSAweDExOiAvKiBwb3J0LUEgLSBEQUMgMDQgKi8KLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgzNywgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEpOworCWNhc2UgMHgxMTogLyogcG9ydC1BIC0gREFDIDAzICovCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MzcsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwKTsKIAkJYnJlYWs7CiAJY2FzZSAweDE0OiAvKiBwb3J0LUIgLSBEQUMgMDYgKi8KIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgzMCwgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDIpOwpAQCAtMzE1MCw3ICszMjYyLDYgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWQxOTg4X21vZGVsc1tBRDE5ODhfTU9ERUxfTEFTVF0gPSB7CiAJW0FEMTk4OF82U1RBQ0tdCQk9ICI2c3RhY2siLAogCVtBRDE5ODhfNlNUQUNLX0RJR10JPSAiNnN0YWNrLWRpZyIsCi0JW0FEMTk4OF82U1RBQ0tfRElHX0ZQXQk9ICI2c3RhY2stZGlnLWZwIiwKIAlbQUQxOTg4XzNTVEFDS10JCT0gIjNzdGFjayIsCiAJW0FEMTk4OF8zU1RBQ0tfRElHXQk9ICIzc3RhY2stZGlnIiwKIAlbQUQxOTg4X0xBUFRPUF0JCT0gImxhcHRvcCIsCkBAIC0zMjA4LDEwICszMzE5LDExIEBACiAJfQogCXNldF9iZWVwX2FtcChzcGVjLCAweDEwLCAwLCBIREFfT1VUUFVUKTsKIAorCWlmICghc3BlYy0+bXVsdGlvdXQuaHBfbmlkKQorCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBhZDE5ODhfYWx0X2RhY19uaWRbMF07CiAJc3dpdGNoIChib2FyZF9jb25maWcpIHsKIAljYXNlIEFEMTk4OF82U1RBQ0s6CiAJY2FzZSBBRDE5ODhfNlNUQUNLX0RJRzoKLQljYXNlIEFEMTk4OF82U1RBQ0tfRElHX0ZQOgogCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSA4OwogCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDQ7CiAJCWlmIChpc19yZXYyKGNvZGVjKSkKQEAgLTMyMjcsMTkgKzMzMzksNyBAQAogCQlzcGVjLT5taXhlcnNbMV0gPSBhZDE5ODhfNnN0YWNrX21peGVyczI7CiAJCXNwZWMtPm51bV9pbml0X3ZlcmJzID0gMTsKIAkJc3BlYy0+aW5pdF92ZXJic1swXSA9IGFkMTk4OF82c3RhY2tfaW5pdF92ZXJiczsKLQkJaWYgKGJvYXJkX2NvbmZpZyA9PSBBRDE5ODhfNlNUQUNLX0RJR19GUCkgewotCQkJc3BlYy0+bnVtX21peGVycysrOwotCQkJc3BlYy0+bWl4ZXJzWzJdID0gYWQxOTg4XzZzdGFja19mcF9taXhlcnM7Ci0JCQlzcGVjLT5udW1faW5pdF92ZXJicysrOwotCQkJc3BlYy0+aW5pdF92ZXJic1sxXSA9IGFkMTk4OF82c3RhY2tfZnBfaW5pdF92ZXJiczsKLQkJCXNwZWMtPnNsYXZlX3ZvbHMgPSBhZDE5ODhfNnN0YWNrX2ZwX3NsYXZlX3ZvbHM7Ci0JCQlzcGVjLT5zbGF2ZV9zd3MgPSBhZDE5ODhfNnN0YWNrX2ZwX3NsYXZlX3N3czsKLQkJCXNwZWMtPmFsdF9kYWNfbmlkID0gYWQxOTg4X2FsdF9kYWNfbmlkOwotCQkJc3BlYy0+c3RyZWFtX2FuYWxvZ19hbHRfcGxheWJhY2sgPQotCQkJCSZhZDE5OHhfcGNtX2FuYWxvZ19hbHRfcGxheWJhY2s7Ci0JCX0KLQkJaWYgKChib2FyZF9jb25maWcgPT0gQUQxOTg4XzZTVEFDS19ESUcpIHx8Ci0JCQkoYm9hcmRfY29uZmlnID09IEFEMTk4OF82U1RBQ0tfRElHX0ZQKSkgeworCQlpZiAoYm9hcmRfY29uZmlnID09IEFEMTk4OF82U1RBQ0tfRElHKSB7CiAJCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IEFEMTk4OF9TUERJRl9PVVQ7CiAJCQlzcGVjLT5kaWdfaW5fbmlkID0gQUQxOTg4X1NQRElGX0lOOwogCQl9CkBAIC0zMjgyLDYgKzMzODIsMTUgQEAKIAkJYnJlYWs7CiAJfQogCisJaWYgKHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkgeworCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGFkMTk4OF9ocF9taXhlcnM7CisJCXNwZWMtPnNsYXZlX3ZvbHMgPSBhZDE5ODhfNnN0YWNrX2ZwX3NsYXZlX3ZvbHM7CisJCXNwZWMtPnNsYXZlX3N3cyA9IGFkMTk4OF82c3RhY2tfZnBfc2xhdmVfc3dzOworCQlzcGVjLT5hbHRfZGFjX25pZCA9IGFkMTk4OF9hbHRfZGFjX25pZDsKKwkJc3BlYy0+c3RyZWFtX2FuYWxvZ19hbHRfcGxheWJhY2sgPQorCQkJJmFkMTk4eF9wY21fYW5hbG9nX2FsdF9wbGF5YmFjazsKKwl9CisKIAlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFkMTk4OF9hZGNfbmlkcyk7CiAJc3BlYy0+YWRjX25pZHMgPSBhZDE5ODhfYWRjX25pZHM7CiAJc3BlYy0+Y2Fwc3JjX25pZHMgPSBhZDE5ODhfY2Fwc3JjX25pZHM7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMTAuYwppbmRleCA2YjQwNjg0Li45OTM3NTdiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTEwLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwppbmRleCBkOWEyMjU0Li4zNWFiZTNjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYwppbmRleCBjNDVmM2U2Li4yYTJkODY0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYwppbmRleCBjZDJjZjVlLi5iNjc2N2I0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKaW5kZXggNzY3NTJkOGUuLjBkZTIxMTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogCkBAIC0xMzYsNiArMTM3LDggQEAKIAl1bnNpZ25lZCBpbnQgdGhpbmtwYWQ6MTsKIAl1bnNpZ25lZCBpbnQgaHBfbGFwdG9wOjE7CiAJdW5zaWduZWQgaW50IGFzdXM6MTsKKwl1bnNpZ25lZCBpbnQgcGluX2VhcGRfY3RybHM6MTsKKwl1bnNpZ25lZCBpbnQgc2luZ2xlX2FkY19hbXA6MTsKIAogCXVuc2lnbmVkIGludCBhZGNfc3dpdGNoaW5nOjE7CiAKQEAgLTE4NjcsMzkgKzE4NzAsNiBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA1MV9sZW5vdm9feDIwMF9pbml0X3ZlcmJzW10gPSB7Ci0JLyogTGluZSBpbiwgTWljICovCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDAzfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKSB8IDB4MDN9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDAzfSwKLQkvKiBTUEsgICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBIUCwgQW1wICAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBEb2NraW5nIEhQICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIERBQzEgKi8KLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIFJlY29yZCBzZWxlY3RvcjogSW50ZXJuYWwgbWljICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDQ0fSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKSB8IDB4NDR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApIHwgMHg0NH0sCi0JLyogU1BESUYgcm91dGU6IFBDTSAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LCAvKiBuZWVkZWQgZm9yIFc1MDAgQWR2YW5jZWQgTWluaSBEb2NrIDI1MDQxMCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKLQkvKiBFQVBEICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDJ9LCAvKiBkZWZhdWx0IG9uICovCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU58Q09ORVhBTlRfSFBfRVZFTlR9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfENPTkVYQU5UX0hQX0VWRU5UfSwKLQl7IH0gLyogZW5kICovCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGN4dDUwNTFfZjcwMF9pbml0X3ZlcmJzW10gPSB7CiAJLyogTGluZSBpbiwgTWljICovCiAJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDAzfSwKQEAgLTE5NjgsNyArMTkzOCw2IEBACiAJQ1hUNTA1MV9MQVBUT1AsCSAvKiBMYXB0b3BzIHcvIEVBUEQgc3VwcG9ydCAqLwogCUNYVDUwNTFfSFAsCS8qIG5vIGRvY2tpbmcgKi8KIAlDWFQ1MDUxX0hQX0RWNjczNiwJLyogSFAgd2l0aG91dCBtaWMgc3dpdGNoICovCi0JQ1hUNTA1MV9MRU5PVk9fWDIwMCwJLyogTGVub3ZvIFgyMDAgbGFwdG9wLCBhbHNvIHVzZWQgZm9yIEFkdmFuY2VkIE1pbmkgRG9jayAyNTA0MTAgKi8KIAlDWFQ1MDUxX0Y3MDAsICAgICAgIC8qIEhQIENvbXBhcSBQcmVzYXJpbyBGNzAwICovCiAJQ1hUNTA1MV9UT1NISUJBLAkvKiBUb3NoaWJhIE0zMDAgJiBjbyAqLwogCUNYVDUwNTFfSURFQVBBRCwJLyogTGVub3ZvIElkZWFQYWQgWTQzMCAqLwpAQCAtMTk4MCw3ICsxOTQ5LDYgQEAKIAlbQ1hUNTA1MV9MQVBUT1BdCT0gImxhcHRvcCIsCiAJW0NYVDUwNTFfSFBdCQk9ICJocCIsCiAJW0NYVDUwNTFfSFBfRFY2NzM2XQk9ICJocC1kdjY3MzYiLAotCVtDWFQ1MDUxX0xFTk9WT19YMjAwXQk9ICJsZW5vdm8teDIwMCIsCiAJW0NYVDUwNTFfRjcwMF0gICAgICAgICAgPSAiaHAtNzAwIiwKIAlbQ1hUNTA1MV9UT1NISUJBXQk9ICJ0b3NoaWJhIiwKIAlbQ1hUNTA1MV9JREVBUEFEXQk9ICJpZGVhcGFkIiwKQEAgLTE5OTUsNyArMTk2Myw2IEBACiAJU05EX1BDSV9RVUlSSygweDE0ZjEsIDB4MDEwMSwgIkNvbmV4YW50IFJlZmVyZW5jZSBib2FyZCIsCiAJCSAgICAgIENYVDUwNTFfTEFQVE9QKSwKIAlTTkRfUENJX1FVSVJLKDB4MTRmMSwgMHg1MDUxLCAiSFAgU3BhcnRhbiAxLjEiLCBDWFQ1MDUxX0hQKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMGYyLCAiTGVub3ZvIFgyMDAiLCBDWFQ1MDUxX0xFTk9WT19YMjAwKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYTBkLCAiTGVub3ZvIElkZWFQYWQiLCBDWFQ1MDUxX0lERUFQQUQpLAogCXt9CiB9OwpAQCAtMjA1MywxMyArMjAyMCw2IEBACiAJCXNwZWMtPm1peGVyc1swXSA9IGN4dDUwNTFfaHBfZHY2NzM2X21peGVyczsKIAkJc3BlYy0+YXV0b19taWMgPSAwOwogCQlicmVhazsKLQljYXNlIENYVDUwNTFfTEVOT1ZPX1gyMDA6Ci0JCXNwZWMtPmluaXRfdmVyYnNbMF0gPSBjeHQ1MDUxX2xlbm92b194MjAwX2luaXRfdmVyYnM7Ci0JCS8qIFRoaW5rcGFkIFgzMDEgZG9lcyBub3QgaGF2ZSBTL1BESUYgd2lyZWQgYW5kIG5vIGFiaWxpdHkKLQkJICAgdG8gdXNlIGEgZG9ja2luZyBzdGF0aW9uLiAqLwotCQlpZiAoY29kZWMtPnN1YnN5c3RlbV9pZCA9PSAweDE3YWEyMTFmKQotCQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSAwOwotCQlicmVhazsKIAljYXNlIENYVDUwNTFfRjcwMDoKIAkJc3BlYy0+aW5pdF92ZXJic1swXSA9IGN4dDUwNTFfZjcwMF9pbml0X3ZlcmJzOwogCQlzcGVjLT5taXhlcnNbMF0gPSBjeHQ1MDUxX2Y3MDBfbWl4ZXJzOwpAQCAtMzEwMiw3ICszMDYyLDYgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTkzLCAiQXN1cyBVNTBGIiwgQ1hUNTA2Nl9BU1VTKSwKIAlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjFlLCAiVG9zaGliYSBTYXRlbGxpdGUgQzY1MEQiLCBDWFQ1MDY2X0lERUFQQUQpLAogCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmNTAsICJUb3NoaWJhIFNhdGVsbGl0ZSBQNTAwLVBTUEdTQy0wMTgwMFQiLCBDWFQ1MDY2X09MUENfWE9fMV81KSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZmUwLCAiVG9zaGliYSBTYXRlbGxpdGUgUHJvIFQxMzAtMTVGIiwgQ1hUNTA2Nl9PTFBDX1hPXzFfNSksCiAJU05EX1BDSV9RVUlSSygweDE0ZjEsIDB4MDEwMSwgIkNvbmV4YW50IFJlZmVyZW5jZSBib2FyZCIsCiAJCSAgICAgIENYVDUwNjZfTEFQVE9QKSwKIAlTTkRfUENJX1FVSVJLKDB4MTUyZCwgMHgwODMzLCAiT0xQQyBYTy0xLjUiLCBDWFQ1MDY2X09MUENfWE9fMV81KSwKQEAgLTM0NzMsMTIgKzM0MzIsMTQgQEAKIHN0YXRpYyB2b2lkIGRvX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgbnVtX3BpbnMsCiAJCQloZGFfbmlkX3QgKnBpbnMsIGJvb2wgb24pCiB7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgaTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BpbnM7IGkrKykKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGluc1tpXSwgMCwKIAkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAogCQkJCSAgICBvbiA/IFBJTl9PVVQgOiAwKTsKLQljeF9hdXRvX3R1cm5fZWFwZChjb2RlYywgbnVtX3BpbnMsIHBpbnMsIG9uKTsKKwlpZiAoc3BlYy0+cGluX2VhcGRfY3RybHMpCisJCWN4X2F1dG9fdHVybl9lYXBkKGNvZGVjLCBudW1fcGlucywgcGlucywgb24pOwogfQogCiBzdGF0aWMgaW50IGRldGVjdF9qYWNrcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9waW5zLCBoZGFfbmlkX3QgKnBpbnMpCkBAIC0zNTAzLDkgKzM0NjQsMTIgQEAKIAlpbnQgb24gPSAxOwogCiAJLyogdHVybiBvbiBIUCBFQVBEIHdoZW4gSFAgamFja3MgYXJlIHByZXNlbnQgKi8KLQlpZiAoc3BlYy0+YXV0b19tdXRlKQotCQlvbiA9IHNwZWMtPmhwX3ByZXNlbnQ7Ci0JY3hfYXV0b190dXJuX2VhcGQoY29kZWMsIGNmZy0+aHBfb3V0cywgY2ZnLT5ocF9waW5zLCBvbik7CisJaWYgKHNwZWMtPnBpbl9lYXBkX2N0cmxzKSB7CisJCWlmIChzcGVjLT5hdXRvX211dGUpCisJCQlvbiA9IHNwZWMtPmhwX3ByZXNlbnQ7CisJCWN4X2F1dG9fdHVybl9lYXBkKGNvZGVjLCBjZmctPmhwX291dHMsIGNmZy0+aHBfcGlucywgb24pOworCX0KKwogCS8qIG11dGUgc3BlYWtlcnMgaW4gYXV0by1tb2RlIGlmIEhQIG9yIExPIGphY2tzIGFyZSBwbHVnZ2VkICovCiAJaWYgKHNwZWMtPmF1dG9fbXV0ZSkKIAkJb24gPSAhKHNwZWMtPmhwX3ByZXNlbnQgfHwKQEAgLTM5MzIsMjAgKzM4OTYsMTAgQEAKICNkZWZpbmUgY3hfYXV0b19wYXJzZV9iZWVwKGNvZGVjKQogI2VuZGlmCiAKLXN0YXRpYyBib29sIGZvdW5kX2luX25pZF9saXN0KGhkYV9uaWRfdCBuaWQsIGNvbnN0IGhkYV9uaWRfdCAqbGlzdCwgaW50IG51bXMpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKykKLQkJaWYgKGxpc3RbaV0gPT0gbmlkKQotCQkJcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiBwYXJzZSBleHRyYS1FQVBEIHRoYXQgYXJlbid0IGFzc2lnbmVkIHRvIGFueSBwaW5zICovCisvKiBwYXJzZSBFQVBEcyAqLwogc3RhdGljIHZvaWQgY3hfYXV0b19wYXJzZV9lYXBkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CiAJaGRhX25pZF90IG5pZCwgZW5kX25pZDsKIAogCWVuZF9uaWQgPSBjb2RlYy0+c3RhcnRfbmlkICsgY29kZWMtPm51bV9ub2RlczsKQEAgLTM5NTQsMTQgKzM5MDgsMTggQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoIShzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKGNvZGVjLCBuaWQpICYgQUNfUElOQ0FQX0VBUEQpKQogCQkJY29udGludWU7Ci0JCWlmIChmb3VuZF9pbl9uaWRfbGlzdChuaWQsIGNmZy0+bGluZV9vdXRfcGlucywgY2ZnLT5saW5lX291dHMpIHx8Ci0JCSAgICBmb3VuZF9pbl9uaWRfbGlzdChuaWQsIGNmZy0+aHBfcGlucywgY2ZnLT5ocF9vdXRzKSB8fAotCQkgICAgZm91bmRfaW5fbmlkX2xpc3QobmlkLCBjZmctPnNwZWFrZXJfcGlucywgY2ZnLT5zcGVha2VyX291dHMpKQotCQkJY29udGludWU7CiAJCXNwZWMtPmVhcGRzW3NwZWMtPm51bV9lYXBkcysrXSA9IG5pZDsKIAkJaWYgKHNwZWMtPm51bV9lYXBkcyA+PSBBUlJBWV9TSVpFKHNwZWMtPmVhcGRzKSkKIAkJCWJyZWFrOwogCX0KKworCS8qIE5PVEU6IGJlbG93IGlzIGEgd2lsZCBndWVzczsgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gdHdvIEVBUERzLAorCSAqIGl0J3MgYSBuZXcgY2hpcCwgd2hlcmUgRUFQRHMgYXJlIHN1cHBvc2VkIHRvIGJlIGFzc29jaWF0ZWQgdG8KKwkgKiBwaW5zLCBhbmQgd2UgY2FuIGNvbnRyb2wgRUFQRCBwZXIgcGluLgorCSAqIE9UT0gsIGlmIG9ubHkgb25lIG9yIHR3byBFQVBEcyBhcmUgZm91bmQsIGl0J3MgYW4gb2xkIGNoaXAsCisJICogdGh1cyBpdCBtaWdodCBjb250cm9sIG92ZXIgYWxsIHBpbnMuCisJICovCisJc3BlYy0+cGluX2VhcGRfY3RybHMgPSBzcGVjLT5udW1fZWFwZHMgPiAyOwogfQogCiBzdGF0aWMgaW50IGN4X2F1dG9fcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC00MDY3LDggKzQwMjUsOSBAQAogCQl9CiAJfQogCWN4X2F1dG9fdXBkYXRlX3NwZWFrZXJzKGNvZGVjKTsKLQkvKiB0dXJuIG9uL29mZiBleHRyYSBFQVBEcywgdG9vICovCi0JY3hfYXV0b190dXJuX2VhcGQoY29kZWMsIHNwZWMtPm51bV9lYXBkcywgc3BlYy0+ZWFwZHMsIHRydWUpOworCS8qIHR1cm4gb24gYWxsIEVBUERzIGlmIG5vIGluZGl2aWR1YWwgRUFQRCBjb250cm9sIGlzIGF2YWlsYWJsZSAqLworCWlmICghc3BlYy0+cGluX2VhcGRfY3RybHMpCisJCWN4X2F1dG9fdHVybl9lYXBkKGNvZGVjLCBzcGVjLT5udW1fZWFwZHMsIHNwZWMtPmVhcGRzLCB0cnVlKTsKIH0KIAogc3RhdGljIHZvaWQgY3hfYXV0b19pbml0X2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNDI1NSw2ICs0MjE0LDggQEAKIAkJaW50IGlkeCA9IGdldF9pbnB1dF9jb25uZWN0aW9uKGNvZGVjLCBhZGNfbmlkLCBuaWQpOwogCQlpZiAoaWR4IDwgMCkKIAkJCWNvbnRpbnVlOworCQlpZiAoc3BlYy0+c2luZ2xlX2FkY19hbXApCisJCQlpZHggPSAwOwogCQlyZXR1cm4gY3hfYXV0b19hZGRfdm9sdW1lX2lkeChjb2RlYywgbGFiZWwsIHBmeCwKIAkJCQkJICAgICAgY2lkeCwgYWRjX25pZCwgSERBX0lOUFVULCBpZHgpOwogCX0KQEAgLTQyOTUsMTQgKzQyNTYsMjEgQEAKIAlzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CiAJY29uc3QgY2hhciAqcHJldl9sYWJlbDsKIAlpbnQgaW5wdXRfY29ubltIREFfTUFYX05VTV9JTlBVVFNdOwotCWludCBpLCBlcnIsIGNpZHg7CisJaW50IGksIGosIGVyciwgY2lkeDsKIAlpbnQgbXVsdGlfY29ubmVjdGlvbjsKIAorCWlmICghaW11eC0+bnVtX2l0ZW1zKQorCQlyZXR1cm4gMDsKKwogCW11bHRpX2Nvbm5lY3Rpb24gPSAwOwogCWZvciAoaSA9IDA7IGkgPCBpbXV4LT5udW1faXRlbXM7IGkrKykgewogCQljaWR4ID0gZ2V0X2lucHV0X2Nvbm5lY3Rpb24oY29kZWMsIHNwZWMtPmltdXhfaW5mb1tpXS5hZGMsCiAJCQkJCSAgICBzcGVjLT5pbXV4X2luZm9baV0ucGluKTsKLQkJaW5wdXRfY29ubltpXSA9IChzcGVjLT5pbXV4X2luZm9baV0uYWRjIDw8IDgpIHwgY2lkeDsKKwkJaWYgKGNpZHggPCAwKQorCQkJY29udGludWU7CisJCWlucHV0X2Nvbm5baV0gPSBzcGVjLT5pbXV4X2luZm9baV0uYWRjOworCQlpZiAoIXNwZWMtPnNpbmdsZV9hZGNfYW1wKQorCQkJaW5wdXRfY29ubltpXSB8PSBjaWR4IDw8IDg7CiAJCWlmIChpID4gMCAmJiBpbnB1dF9jb25uW2ldICE9IGlucHV0X2Nvbm5bMF0pCiAJCQltdWx0aV9jb25uZWN0aW9uID0gMTsKIAl9CkBAIC00MzMxLDYgKzQyOTksMTUgQEAKIAkJCWVyciA9IGN4X2F1dG9fYWRkX2NhcHR1cmVfdm9sdW1lKGNvZGVjLCBuaWQsCiAJCQkJCQkJICJDYXB0dXJlIiwgIiIsIGNpZHgpOwogCQl9IGVsc2UgeworCQkJYm9vbCBkdXBfZm91bmQgPSBmYWxzZTsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQlpZiAoaW5wdXRfY29ubltqXSA9PSBpbnB1dF9jb25uW2ldKSB7CisJCQkJCWR1cF9mb3VuZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChkdXBfZm91bmQpCisJCQkJY29udGludWU7CiAJCQllcnIgPSBjeF9hdXRvX2FkZF9jYXB0dXJlX3ZvbHVtZShjb2RlYywgbmlkLAogCQkJCQkJCSBsYWJlbCwgIiBDYXB0dXJlIiwgY2lkeCk7CiAJCX0KQEAgLTQzOTQsNiArNDM3MSw1MyBAQAogCS5yZWJvb3Rfbm90aWZ5ID0gc25kX2hkYV9zaHV0dXBfcGlucywKIH07CiAKKy8qCisgKiBwaW4gZml4LXVwCisgKi8KK3N0cnVjdCBjeHRfcGluY2ZnIHsKKwloZGFfbmlkX3QgbmlkOworCXUzMiB2YWw7Cit9OworCitzdGF0aWMgdm9pZCBhcHBseV9waW5jZmcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IHN0cnVjdCBjeHRfcGluY2ZnICpjZmcpCit7CisJZm9yICg7IGNmZy0+bmlkOyBjZmcrKykKKwkJc25kX2hkYV9jb2RlY19zZXRfcGluY2ZnKGNvZGVjLCBjZmctPm5pZCwgY2ZnLT52YWwpOworCit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X3Bpbl9maXh1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqcXVpcmssCisJCQkgICAgY29uc3Qgc3RydWN0IGN4dF9waW5jZmcgKip0YWJsZSkKK3sKKwlxdWlyayA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKGNvZGVjLT5idXMtPnBjaSwgcXVpcmspOworCWlmIChxdWlyaykgeworCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogYXBwbHlpbmcgcGluY2ZnIGZvciAlc1xuIiwKKwkJCSAgICBxdWlyay0+bmFtZSk7CisJCWFwcGx5X3BpbmNmZyhjb2RlYywgdGFibGVbcXVpcmstPnZhbHVlXSk7CisJfQorfQorCitlbnVtIHsKKwlDWFRfUElOQ0ZHX0xFTk9WT19YMjAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjeHRfcGluY2ZnIGN4dF9waW5jZmdfbGVub3ZvX3gyMDBbXSA9IHsKKwl7IDB4MTYsIDB4MDQyMTQwZmYgfSwgLyogSFAgKHNlcSMgb3ZlcnJpZGRlbikgKi8KKwl7IDB4MTcsIDB4MjFhMTEwMDAgfSwgLyogZG9jay1taWMgKi8KKwl7IDB4MTksIDB4MjEyMTEwM2YgfSwgLyogZG9jay1IUCAqLworCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN4dF9waW5jZmcgKmN4dF9waW5jZmdfdGJsW10gPSB7CisJW0NYVF9QSU5DRkdfTEVOT1ZPX1gyMDBdID0gY3h0X3BpbmNmZ19sZW5vdm9feDIwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHRfZml4dXBzW10gPSB7CisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjBmMiwgIkxlbm92byBYMjAwIiwgQ1hUX1BJTkNGR19MRU5PVk9fWDIwMCksCisJe30KK307CisKIHN0YXRpYyBpbnQgcGF0Y2hfY29uZXhhbnRfYXV0byhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYzsKQEAgLTQ0MDcsNiArNDQzMSwxNSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAljb2RlYy0+c3BlYyA9IHNwZWM7CiAJY29kZWMtPnBpbl9hbXBfd29ya2Fyb3VuZCA9IDE7CisKKwlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwljYXNlIDB4MTRmMTUwNDU6CisJCXNwZWMtPnNpbmdsZV9hZGNfYW1wID0gMTsKKwkJYnJlYWs7CisJfQorCisJYXBwbHlfcGluX2ZpeHVwKGNvZGVjLCBjeHRfZml4dXBzLCBjeHRfcGluY2ZnX3RibCk7CisKIAllcnIgPSBjeF9hdXRvX3NlYXJjaF9hZGNzKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKaW5kZXggMTljYjcyZC4uODFiN2I3OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgpAQCAtMzI0LDYgKzMyNCw2NiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgaW50IGhkbWlfZWxkX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjOworCWludCBwaW5faWR4OworCisJc3BlYyA9IGNvZGVjLT5zcGVjOworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzsKKworCXBpbl9pZHggPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1aW5mby0+Y291bnQgPSBzcGVjLT5waW5zW3Bpbl9pZHhdLnNpbmtfZWxkLmVsZF9zaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9lbGRfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWM7CisJaW50IHBpbl9pZHg7CisKKwlzcGVjID0gY29kZWMtPnNwZWM7CisJcGluX2lkeCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLAorCQlzcGVjLT5waW5zW3Bpbl9pZHhdLnNpbmtfZWxkLmVsZF9idWZmZXIsIEVMRF9NQVhfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGVsZF9ieXRlc19jdGwgPSB7CisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICJFTEQiLAorCS5pbmZvID0gaGRtaV9lbGRfY3RsX2luZm8sCisJLmdldCA9IGhkbWlfZWxkX2N0bF9nZXQsCit9OworCitzdGF0aWMgaW50IGhkbWlfY3JlYXRlX2VsZF9jdGwoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBwaW5faWR4LAorCQkJaW50IGRldmljZSkKK3sKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCisJa2N0bCA9IHNuZF9jdGxfbmV3MSgmZWxkX2J5dGVzX2N0bCwgY29kZWMpOworCWlmICgha2N0bCkKKwkJcmV0dXJuIC1FTk9NRU07CisJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IHBpbl9pZHg7CisJa2N0bC0+aWQuZGV2aWNlID0gZGV2aWNlOworCisJZXJyID0gc25kX2hkYV9jdGxfYWRkKGNvZGVjLCBzcGVjLT5waW5zW3Bpbl9pZHhdLnBpbl9uaWQsIGtjdGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKICNpZmRlZiBCRV9QQVJBTk9JRAogc3RhdGljIHZvaWQgaGRtaV9nZXRfZGlwX2luZGV4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluX25pZCwKIAkJCQlpbnQgKnBhY2tldF9pbmRleCwgaW50ICpieXRlX2luZGV4KQpAQCAtOTQ2LDcgKzEwMDYsNiBAQAogCXVuc2lnbmVkIGludCBjYXBzLCBjb25maWc7CiAJaW50IHBpbl9pZHg7CiAJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluOwotCXN0cnVjdCBoZG1pX2VsZCAqZWxkOwogCWludCBlcnI7CiAKIAljYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBwaW5fbmlkLCBBQ19QQVJfUElOX0NBUCk7CkBAIC05NjMsMjMgKzEwMjIsMTUgQEAKIAogCXBpbl9pZHggPSBzcGVjLT5udW1fcGluczsKIAlwZXJfcGluID0gJnNwZWMtPnBpbnNbcGluX2lkeF07Ci0JZWxkID0gJnBlcl9waW4tPnNpbmtfZWxkOwogCiAJcGVyX3Bpbi0+cGluX25pZCA9IHBpbl9uaWQ7CiAKLQllcnIgPSBzbmRfaGRhX2lucHV0X2phY2tfYWRkKGNvZGVjLCBwaW5fbmlkLAotCQkJCSAgICAgU05EX0pBQ0tfVklERU9PVVQsIE5VTEwpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCiAJZXJyID0gaGRtaV9yZWFkX3Bpbl9jb25uKGNvZGVjLCBwaW5faWR4KTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAogCXNwZWMtPm51bV9waW5zKys7CiAKLQloZG1pX3ByZXNlbnRfc2Vuc2UoY29kZWMsIHBpbl9uaWQsIGVsZCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE2Miw2ICsxMjEzLDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZ2VuZXJpY19oZG1pX2J1aWxkX2phY2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBwaW5faWR4KQoreworCWludCBlcnI7CisJY2hhciBoZG1pX3N0clszMl07CisJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbiA9ICZzcGVjLT5waW5zW3Bpbl9pZHhdOworCWludCBwY21kZXYgPSBzcGVjLT5wY21fcmVjW3Bpbl9pZHhdLmRldmljZTsKKworCXNucHJpbnRmKGhkbWlfc3RyLCBzaXplb2YoaGRtaV9zdHIpLCAiSERNSS9EUCxwY209JWQiLCBwY21kZXYpOworCisJZXJyID0gc25kX2hkYV9pbnB1dF9qYWNrX2FkZChjb2RlYywgcGVyX3Bpbi0+cGluX25pZCwKKwkJCSAgICAgU05EX0pBQ0tfVklERU9PVVQsIHBjbWRldiA+IDAgPyBoZG1pX3N0ciA6IE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaGRtaV9wcmVzZW50X3NlbnNlKGNvZGVjLCBwZXJfcGluLT5waW5fbmlkLCAmcGVyX3Bpbi0+c2lua19lbGQpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGdlbmVyaWNfaGRtaV9idWlsZF9jb250cm9scyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC0xMTcwLDEyICsxMjQwLDI1IEBACiAKIAlmb3IgKHBpbl9pZHggPSAwOyBwaW5faWR4IDwgc3BlYy0+bnVtX3BpbnM7IHBpbl9pZHgrKykgewogCQlzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9waW4gKnBlcl9waW4gPSAmc3BlYy0+cGluc1twaW5faWR4XTsKKworCQllcnIgPSBnZW5lcmljX2hkbWlfYnVpbGRfamFjayhjb2RlYywgcGluX2lkeCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwogCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywKIAkJCQkJCSAgICBwZXJfcGluLT5waW5fbmlkLAogCQkJCQkJICAgIHBlcl9waW4tPm11eF9uaWRzWzBdKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQlzbmRfaGRhX3NwZGlmX2N0bHNfdW5hc3NpZ24oY29kZWMsIHBpbl9pZHgpOworCisJCS8qIGFkZCBjb250cm9sIGZvciBFTEQgQnl0ZXMgKi8KKwkJZXJyID0gaGRtaV9jcmVhdGVfZWxkX2N0bChjb2RlYywKKwkJCQkJcGluX2lkeCwKKwkJCQkJc3BlYy0+cGNtX3JlY1twaW5faWR4XS5kZXZpY2UpOworCisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE0OTEsNyArMTU3NCw3IEBACiAJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlpbnQgY2hzOwotCXVuc2lnbmVkIGludCBkYXRhRENDMSwgZGF0YURDQzIsIGNoYW5uZWxfaWQ7CisJdW5zaWduZWQgaW50IGRhdGFEQ0MyLCBjaGFubmVsX2lkOwogCWludCBpOwogCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlzdHJ1Y3QgaGRhX3NwZGlmX291dCAqc3BkaWYgPQpAQCAtMTUwMSw3ICsxNTg0LDYgQEAKIAogCWNocyA9IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CiAKLQlkYXRhRENDMSA9IEFDX0RJRzFfRU5BQkxFIHwgQUNfRElHMV9DT1BZUklHSFQ7CiAJZGF0YURDQzIgPSAweDI7CiAKIAkvKiB0dXJuIG9mZiBTUERJRiBvbmNlOyBvdGhlcndpc2UgdGhlIElFQzk1OCBiaXRzIHdvbid0IGJlIHVwZGF0ZWQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggN2E3MzYyMS4uMzA4YmI1NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgpAQCAtMTE2LDYgKzExNyw4IEBACiAJY29uc3QgaGRhX25pZF90ICpjYXBzcmNfbmlkczsKIAloZGFfbmlkX3QgZGlnX2luX25pZDsJCS8qIGRpZ2l0YWwtaW4gTklEOyBvcHRpb25hbCAqLwogCWhkYV9uaWRfdCBtaXhlcl9uaWQ7CQkvKiBhbmFsb2ctbWl4ZXIgTklEICovCisJREVDTEFSRV9CSVRNQVAodm9sX2N0bHMsIDB4MjAgPDwgMSk7CisJREVDTEFSRV9CSVRNQVAoc3dfY3RscywgMHgyMCA8PCAxKTsKIAogCS8qIGNhcHR1cmUgc2V0dXAgZm9yIGR5bmFtaWMgZHVhbC1hZGMgc3dpdGNoICovCiAJaGRhX25pZF90IGN1cl9hZGM7CkBAIC0xNTksMjMgKzE2MiwyNyBAQAogCXZvaWQgKCpwb3dlcl9ob29rKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CiAjZW5kaWYKIAl2b2lkICgqc2h1dHVwKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CisJdm9pZCAoKmF1dG9tdXRlX2hvb2spKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKIAogCS8qIGZvciBwaW4gc2Vuc2luZyAqLwotCXVuc2lnbmVkIGludCBqYWNrX3ByZXNlbnQ6IDE7CisJdW5zaWduZWQgaW50IGhwX2phY2tfcHJlc2VudDoxOwogCXVuc2lnbmVkIGludCBsaW5lX2phY2tfcHJlc2VudDoxOwogCXVuc2lnbmVkIGludCBtYXN0ZXJfbXV0ZToxOwogCXVuc2lnbmVkIGludCBhdXRvX21pYzoxOwogCXVuc2lnbmVkIGludCBhdXRvX21pY192YWxpZF9pbXV4OjE7CS8qIHZhbGlkIGltdXggZm9yIGF1dG8tbWljICovCi0JdW5zaWduZWQgaW50IGF1dG9tdXRlOjE7CS8qIEhQIGF1dG9tdXRlIGVuYWJsZWQgKi8KLQl1bnNpZ25lZCBpbnQgZGV0ZWN0X2xpbmU6MTsJLyogTGluZS1vdXQgZGV0ZWN0aW9uIGVuYWJsZWQgKi8KLQl1bnNpZ25lZCBpbnQgYXV0b211dGVfbGluZXM6MTsJLyogYXV0b211dGUgbGluZS1vdXQgYXMgd2VsbDsgTk9QIHdoZW4gYXV0b211dGVfaHBfbG8gaXNuJ3Qgc2V0ICovCi0JdW5zaWduZWQgaW50IGF1dG9tdXRlX2hwX2xvOjE7CS8qIGJvdGggSFAgYW5kIExPIGF2YWlsYWJsZSAqLworCXVuc2lnbmVkIGludCBhdXRvbXV0ZV9zcGVha2VyOjE7IC8qIGF1dG9tdXRlIHNwZWFrZXIgb3V0cHV0cyAqLworCXVuc2lnbmVkIGludCBhdXRvbXV0ZV9sbzoxOyAvKiBhdXRvbXV0ZSBMTyBvdXRwdXRzICovCisJdW5zaWduZWQgaW50IGRldGVjdF9ocDoxOwkvKiBIZWFkcGhvbmUgZGV0ZWN0aW9uIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBpbnQgZGV0ZWN0X2xvOjE7CS8qIExpbmUtb3V0IGRldGVjdGlvbiBlbmFibGVkICovCisJdW5zaWduZWQgaW50IGF1dG9tdXRlX3NwZWFrZXJfcG9zc2libGU6MTsgLyogdGhlcmUgYXJlIHNwZWFrZXJzIGFuZCBlaXRoZXIgTE8gb3IgSFAgKi8KKwl1bnNpZ25lZCBpbnQgYXV0b211dGVfbG9fcG9zc2libGU6MTsJICAvKiB0aGVyZSBhcmUgbGluZSBvdXRzIGFuZCBIUCAqLwogCiAJLyogb3RoZXIgZmxhZ3MgKi8KIAl1bnNpZ25lZCBpbnQgbm9fYW5hbG9nIDoxOyAvKiBkaWdpdGFsIEkvTyBvbmx5ICovCiAJdW5zaWduZWQgaW50IGR5bl9hZGNfc3dpdGNoOjE7IC8qIHN3aXRjaCBBRENzIChmb3IgQUxDMjc1KSAqLwogCXVuc2lnbmVkIGludCBzaW5nbGVfaW5wdXRfc3JjOjE7CiAJdW5zaWduZWQgaW50IHZvbF9pbl9jYXBzcmM6MTsgLyogdXNlIGNhcHNyYyB2b2x1bWUgKEFEQyBoYXMgbm8gdm9sKSAqLworCXVuc2lnbmVkIGludCBwYXJzZV9mbGFnczsgLyogcGFzc2VkIHRvIHNuZF9oZGFfcGFyc2VfcGluX2RlZmNmZygpICovCiAKIAkvKiBhdXRvLW11dGUgY29udHJvbCAqLwogCWludCBhdXRvbXV0ZV9tb2RlOwpAQCAtMTkzLDYgKzIwMCw3IEBACiAJLyogZm9yIFBMTCBmaXggKi8KIAloZGFfbmlkX3QgcGxsX25pZDsKIAl1bnNpZ25lZCBpbnQgcGxsX2NvZWZfaWR4LCBwbGxfY29lZl9iaXQ7CisJdW5zaWduZWQgaW50IGNvZWYwOwogCiAJLyogZml4LXVwIGxpc3QgKi8KIAlpbnQgZml4dXBfaWQ7CkBAIC0yMDIsNiArMjEwLDkgQEAKIAkvKiBtdWx0aS1pbyAqLwogCWludCBtdWx0aV9pb3M7CiAJc3RydWN0IGFsY19tdWx0aV9pbyBtdWx0aV9pb1s0XTsKKworCS8qIGJpbmQgdm9sdW1lcyAqLworCXN0cnVjdCBzbmRfYXJyYXkgYmluZF9jdGxzOwogfTsKIAogI2RlZmluZSBBTENfTU9ERUxfQVVUTwkJMAkvKiBjb21tb24gZm9yIGFsbCBjaGlwcyAqLwpAQCAtMjczLDcgKzI4NCw3IEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXg7CiAJdW5zaWduZWQgaW50IG11eF9pZHg7Ci0JaW50IGksIHR5cGU7CisJaW50IGksIHR5cGUsIG51bV9jb25uczsKIAloZGFfbmlkX3QgbmlkOwogCiAJbXV4X2lkeCA9IGFkY19pZHggPj0gc3BlYy0+bnVtX211eF9kZWZzID8gMCA6IGFkY19pZHg7CkBAIC0yOTYsMTYgKzMwNywxNyBAQAogCQlzcGVjLT5jYXBzcmNfbmlkc1thZGNfaWR4XSA6IHNwZWMtPmFkY19uaWRzW2FkY19pZHhdOwogCiAJLyogbm8gc2VsZWN0aW9uPyAqLwotCWlmIChzbmRfaGRhX2dldF9jb25uX2xpc3QoY29kZWMsIG5pZCwgTlVMTCkgPD0gMSkKKwludW1fY29ubnMgPSBzbmRfaGRhX2dldF9jb25uX2xpc3QoY29kZWMsIG5pZCwgTlVMTCk7CisJaWYgKG51bV9jb25ucyA8PSAxKQogCQlyZXR1cm4gMTsKIAogCXR5cGUgPSBnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpOwogCWlmICh0eXBlID09IEFDX1dJRF9BVURfTUlYKSB7CiAJCS8qIE1hdHJpeC1taXhlciBzdHlsZSAoZS5nLiBBTEM4ODIpICovCi0JCWZvciAoaSA9IDA7IGkgPCBpbXV4LT5udW1faXRlbXM7IGkrKykgewotCQkJdW5zaWduZWQgaW50IHYgPSAoaSA9PSBpZHgpID8gMCA6IEhEQV9BTVBfTVVURTsKLQkJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgbmlkLCBIREFfSU5QVVQsCi0JCQkJCQkgaW11eC0+aXRlbXNbaV0uaW5kZXgsCisJCWludCBhY3RpdmUgPSBpbXV4LT5pdGVtc1tpZHhdLmluZGV4OworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Nvbm5zOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCB2ID0gKGkgPT0gYWN0aXZlKSA/IDAgOiBIREFfQU1QX01VVEU7CisJCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX0lOUFVULCBpLAogCQkJCQkJIEhEQV9BTVBfTVVURSwgdik7CiAJCX0KIAl9IGVsc2UgewpAQCAtNTI1LDggKzUzNyw4IEBACiAJfQogfQogCi0vKiBUb2dnbGUgaW50ZXJuYWwgc3BlYWtlcnMgbXV0aW5nICovCi1zdGF0aWMgdm9pZCB1cGRhdGVfc3BlYWtlcnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCisvKiBUb2dnbGUgb3V0cHV0cyBtdXRpbmcgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9vdXRwdXRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBvbjsKQEAgLTUzOCwxMCArNTUwLDEwIEBACiAJZG9fYXV0b211dGUoY29kZWMsIEFSUkFZX1NJWkUoc3BlYy0+YXV0b2NmZy5ocF9waW5zKSwKIAkJICAgIHNwZWMtPmF1dG9jZmcuaHBfcGlucywgc3BlYy0+bWFzdGVyX211dGUsIHRydWUpOwogCi0JaWYgKCFzcGVjLT5hdXRvbXV0ZSkKKwlpZiAoIXNwZWMtPmF1dG9tdXRlX3NwZWFrZXIpCiAJCW9uID0gMDsKIAllbHNlCi0JCW9uID0gc3BlYy0+amFja19wcmVzZW50IHwgc3BlYy0+bGluZV9qYWNrX3ByZXNlbnQ7CisJCW9uID0gc3BlYy0+aHBfamFja19wcmVzZW50IHwgc3BlYy0+bGluZV9qYWNrX3ByZXNlbnQ7CiAJb24gfD0gc3BlYy0+bWFzdGVyX211dGU7CiAJZG9fYXV0b211dGUoY29kZWMsIEFSUkFZX1NJWkUoc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnMpLAogCQkgICAgc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnMsIG9uLCBmYWxzZSk7CkBAIC01NTEsMjYgKzU2MywzNSBAQAogCWlmIChzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0gPT0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdIHx8CiAJICAgIHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSA9PSBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSkKIAkJcmV0dXJuOwotCWlmICghc3BlYy0+YXV0b211dGUgfHwgKHNwZWMtPmF1dG9tdXRlX2hwX2xvICYmICFzcGVjLT5hdXRvbXV0ZV9saW5lcykpCisJaWYgKCFzcGVjLT5hdXRvbXV0ZV9sbykKIAkJb24gPSAwOwogCWVsc2UKLQkJb24gPSBzcGVjLT5qYWNrX3ByZXNlbnQ7CisJCW9uID0gc3BlYy0+aHBfamFja19wcmVzZW50OwogCW9uIHw9IHNwZWMtPm1hc3Rlcl9tdXRlOwogCWRvX2F1dG9tdXRlKGNvZGVjLCBBUlJBWV9TSVpFKHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGlucyksCiAJCSAgICBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnMsIG9uLCBmYWxzZSk7CiB9CiAKK3N0YXRpYyB2b2lkIGNhbGxfdXBkYXRlX291dHB1dHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKHNwZWMtPmF1dG9tdXRlX2hvb2spCisJCXNwZWMtPmF1dG9tdXRlX2hvb2soY29kZWMpOworCWVsc2UKKwkJdXBkYXRlX291dHB1dHMoY29kZWMpOworfQorCiAvKiBzdGFuZGFyZCBIUC1hdXRvbXV0ZSBoZWxwZXIgKi8KIHN0YXRpYyB2b2lkIGFsY19ocF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAotCXNwZWMtPmphY2tfcHJlc2VudCA9CisJc3BlYy0+aHBfamFja19wcmVzZW50ID0KIAkJZGV0ZWN0X2phY2tzKGNvZGVjLCBBUlJBWV9TSVpFKHNwZWMtPmF1dG9jZmcuaHBfcGlucyksCiAJCQkgICAgIHNwZWMtPmF1dG9jZmcuaHBfcGlucyk7Ci0JaWYgKCFzcGVjLT5hdXRvbXV0ZSkKKwlpZiAoIXNwZWMtPmRldGVjdF9ocCB8fCAoIXNwZWMtPmF1dG9tdXRlX3NwZWFrZXIgJiYgIXNwZWMtPmF1dG9tdXRlX2xvKSkKIAkJcmV0dXJuOwotCXVwZGF0ZV9zcGVha2Vycyhjb2RlYyk7CisJY2FsbF91cGRhdGVfb3V0cHV0cyhjb2RlYyk7CiB9CiAKIC8qIHN0YW5kYXJkIGxpbmUtb3V0LWF1dG9tdXRlIGhlbHBlciAqLwpAQCAtNTg1LDkgKzYwNiw5IEBACiAJc3BlYy0+bGluZV9qYWNrX3ByZXNlbnQgPQogCQlkZXRlY3RfamFja3MoY29kZWMsIEFSUkFZX1NJWkUoc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zKSwKIAkJCSAgICAgc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zKTsKLQlpZiAoIXNwZWMtPmF1dG9tdXRlIHx8ICFzcGVjLT5kZXRlY3RfbGluZSkKKwlpZiAoIXNwZWMtPmF1dG9tdXRlX3NwZWFrZXIgfHwgIXNwZWMtPmRldGVjdF9sbykKIAkJcmV0dXJuOwotCXVwZGF0ZV9zcGVha2Vycyhjb2RlYyk7CisJY2FsbF91cGRhdGVfb3V0cHV0cyhjb2RlYyk7CiB9CiAKICNkZWZpbmUgZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIG11eCwgbmlkKSBcCkBAIC03ODUsNyArODA2LDcgQEAKIAogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwogCXVpbmZvLT5jb3VudCA9IDE7Ci0JaWYgKHNwZWMtPmF1dG9tdXRlX2hwX2xvKSB7CisJaWYgKHNwZWMtPmF1dG9tdXRlX3NwZWFrZXJfcG9zc2libGUgJiYgc3BlYy0+YXV0b211dGVfbG9fcG9zc2libGUpIHsKIAkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOwogCQl0ZXh0cyA9IHRleHRzMzsKIAl9IGVsc2UgewpAQCAtODA0LDEzICs4MjUsMTIgQEAKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCWlmICghc3BlYy0+YXV0b211dGUpCi0JCXZhbCA9IDA7Ci0JZWxzZSBpZiAoIXNwZWMtPmF1dG9tdXRlX2hwX2xvIHx8ICFzcGVjLT5hdXRvbXV0ZV9saW5lcykKLQkJdmFsID0gMTsKLQllbHNlCi0JCXZhbCA9IDI7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisJaWYgKHNwZWMtPmF1dG9tdXRlX3NwZWFrZXIpCisJCXZhbCsrOworCWlmIChzcGVjLT5hdXRvbXV0ZV9sbykKKwkJdmFsKys7CisKIAl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdmFsOwogCXJldHVybiAwOwogfQpAQCAtODIzLDI5ICs4NDMsMzYgQEAKIAogCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkgewogCWNhc2UgMDoKLQkJaWYgKCFzcGVjLT5hdXRvbXV0ZSkKKwkJaWYgKCFzcGVjLT5hdXRvbXV0ZV9zcGVha2VyICYmICFzcGVjLT5hdXRvbXV0ZV9sbykKIAkJCXJldHVybiAwOwotCQlzcGVjLT5hdXRvbXV0ZSA9IDA7CisJCXNwZWMtPmF1dG9tdXRlX3NwZWFrZXIgPSAwOworCQlzcGVjLT5hdXRvbXV0ZV9sbyA9IDA7CiAJCWJyZWFrOwogCWNhc2UgMToKLQkJaWYgKHNwZWMtPmF1dG9tdXRlICYmCi0JCSAgICAoIXNwZWMtPmF1dG9tdXRlX2hwX2xvIHx8ICFzcGVjLT5hdXRvbXV0ZV9saW5lcykpCi0JCQlyZXR1cm4gMDsKLQkJc3BlYy0+YXV0b211dGUgPSAxOwotCQlzcGVjLT5hdXRvbXV0ZV9saW5lcyA9IDA7CisJCWlmIChzcGVjLT5hdXRvbXV0ZV9zcGVha2VyX3Bvc3NpYmxlKSB7CisJCQlpZiAoIXNwZWMtPmF1dG9tdXRlX2xvICYmIHNwZWMtPmF1dG9tdXRlX3NwZWFrZXIpCisJCQkJcmV0dXJuIDA7CisJCQlzcGVjLT5hdXRvbXV0ZV9zcGVha2VyID0gMTsKKwkJCXNwZWMtPmF1dG9tdXRlX2xvID0gMDsKKwkJfSBlbHNlIGlmIChzcGVjLT5hdXRvbXV0ZV9sb19wb3NzaWJsZSkgeworCQkJaWYgKHNwZWMtPmF1dG9tdXRlX2xvKQorCQkJCXJldHVybiAwOworCQkJc3BlYy0+YXV0b211dGVfbG8gPSAxOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCWlmICghc3BlYy0+YXV0b211dGVfaHBfbG8pCisJCWlmICghc3BlYy0+YXV0b211dGVfbG9fcG9zc2libGUgfHwgIXNwZWMtPmF1dG9tdXRlX3NwZWFrZXJfcG9zc2libGUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHNwZWMtPmF1dG9tdXRlICYmIHNwZWMtPmF1dG9tdXRlX2xpbmVzKQorCQlpZiAoc3BlYy0+YXV0b211dGVfc3BlYWtlciAmJiBzcGVjLT5hdXRvbXV0ZV9sbykKIAkJCXJldHVybiAwOwotCQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0JCXNwZWMtPmF1dG9tdXRlX2xpbmVzID0gMTsKKwkJc3BlYy0+YXV0b211dGVfc3BlYWtlciA9IDE7CisJCXNwZWMtPmF1dG9tdXRlX2xvID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXVwZGF0ZV9zcGVha2Vycyhjb2RlYyk7CisJY2FsbF91cGRhdGVfb3V0cHV0cyhjb2RlYyk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTg4Miw3ICs5MDksNyBAQAogICogQ2hlY2sgdGhlIGF2YWlsYWJpbGl0eSBvZiBIUC9saW5lLW91dCBhdXRvLW11dGU7CiAgKiBTZXQgdXAgYXBwcm9wcmlhdGVseSBpZiByZWFsbHkgc3VwcG9ydGVkCiAgKi8KLXN0YXRpYyB2b2lkIGFsY19pbml0X2F1dG9faHAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCitzdGF0aWMgdm9pZCBhbGNfaW5pdF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKQEAgLTg5Nyw4ICs5MjQsNiBAQAogCQlwcmVzZW50Kys7CiAJaWYgKHByZXNlbnQgPCAyKSAvKiBuZWVkIHR3byBkaWZmZXJlbnQgb3V0cHV0IHR5cGVzICovCiAJCXJldHVybjsKLQlpZiAocHJlc2VudCA9PSAzKQotCQlzcGVjLT5hdXRvbXV0ZV9ocF9sbyA9IDE7IC8qIGJvdGggSFAgYW5kIExPIGF1dG9tdXRlICovCiAKIAlpZiAoIWNmZy0+c3BlYWtlcl9waW5zWzBdICYmCiAJICAgIGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCkgewpAQCAtOTE0LDYgKzkzOSw4IEBACiAJCWNmZy0+aHBfb3V0cyA9IGNmZy0+bGluZV9vdXRzOwogCX0KIAorCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOworCiAJZm9yIChpID0gMDsgaSA8IGNmZy0+aHBfb3V0czsgaSsrKSB7CiAJCWhkYV9uaWRfdCBuaWQgPSBjZmctPmhwX3BpbnNbaV07CiAJCWlmICghaXNfamFja19kZXRlY3RhYmxlKGNvZGVjLCBuaWQpKQpAQCAtOTIzLDI4ICs5NTAsMzIgQEAKIAkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAogCQkJCSAgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAogCQkJCSAgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlQpOwotCQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0JCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOwotCX0KLQlpZiAoc3BlYy0+YXV0b211dGUgJiYgY2ZnLT5saW5lX291dF9waW5zWzBdICYmCi0JICAgIGNmZy0+c3BlYWtlcl9waW5zWzBdICYmCi0JICAgIGNmZy0+bGluZV9vdXRfcGluc1swXSAhPSBjZmctPmhwX3BpbnNbMF0gJiYKLQkgICAgY2ZnLT5saW5lX291dF9waW5zWzBdICE9IGNmZy0+c3BlYWtlcl9waW5zWzBdKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7Ci0JCQloZGFfbmlkX3QgbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOwotCQkJaWYgKCFpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIG5pZCkpCi0JCQkJY29udGludWU7Ci0JCQlzbmRfcHJpbnRkZCgicmVhbHRlazogRW5hYmxlIExpbmUtT3V0IGF1dG8tbXV0aW5nICIKLQkJCQkgICAgIm9uIE5JRCAweCV4XG4iLCBuaWQpOwotCQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAotCQkJCQlBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCi0JCQkJCUFDX1VTUlNQX0VOIHwgQUxDX0ZST05UX0VWRU5UKTsKLQkJCXNwZWMtPmRldGVjdF9saW5lID0gMTsKLQkJfQotCQlzcGVjLT5hdXRvbXV0ZV9saW5lcyA9IHNwZWMtPmRldGVjdF9saW5lOworCQlzcGVjLT5kZXRlY3RfaHAgPSAxOwogCX0KIAotCWlmIChzcGVjLT5hdXRvbXV0ZSkgeworCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fTElORV9PVVQgJiYgY2ZnLT5saW5lX291dHMpIHsKKwkJaWYgKGNmZy0+c3BlYWtlcl9vdXRzKQorCQkJZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspIHsKKwkJCQloZGFfbmlkX3QgbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOworCQkJCWlmICghaXNfamFja19kZXRlY3RhYmxlKGNvZGVjLCBuaWQpKQorCQkJCQljb250aW51ZTsKKwkJCQlzbmRfcHJpbnRkZCgicmVhbHRlazogRW5hYmxlIExpbmUtT3V0ICIKKwkJCQkJICAgICJhdXRvLW11dGluZyBvbiBOSUQgMHgleFxuIiwgbmlkKTsKKwkJCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCisJCQkJCQlBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCisJCQkJCQlBQ19VU1JTUF9FTiB8IEFMQ19GUk9OVF9FVkVOVCk7CisJCQkJc3BlYy0+ZGV0ZWN0X2xvID0gMTsKKwkJfQorCQlzcGVjLT5hdXRvbXV0ZV9sb19wb3NzaWJsZSA9IHNwZWMtPmRldGVjdF9ocDsKKwl9CisKKwlzcGVjLT5hdXRvbXV0ZV9zcGVha2VyX3Bvc3NpYmxlID0gY2ZnLT5zcGVha2VyX291dHMgJiYKKwkJKHNwZWMtPmRldGVjdF9ocCB8fCBzcGVjLT5kZXRlY3RfbG8pOworCisJc3BlYy0+YXV0b211dGVfbG8gPSBzcGVjLT5hdXRvbXV0ZV9sb19wb3NzaWJsZTsKKwlzcGVjLT5hdXRvbXV0ZV9zcGVha2VyID0gc3BlYy0+YXV0b211dGVfc3BlYWtlcl9wb3NzaWJsZTsKKworCWlmIChzcGVjLT5hdXRvbXV0ZV9zcGVha2VyX3Bvc3NpYmxlIHx8IHNwZWMtPmF1dG9tdXRlX2xvX3Bvc3NpYmxlKSB7CiAJCS8qIGNyZWF0ZSBhIGNvbnRyb2wgZm9yIGF1dG9tdXRlIG1vZGUgKi8KIAkJYWxjX2FkZF9hdXRvbXV0ZV9tb2RlX2VudW0oY29kZWMpOwogCQlzcGVjLT51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQ7CkBAIC0xMTQ1LDcgKzExNzYsNyBAQAogLyogY2hlY2sgdGhlIGF2YWlsYWJpbGl0aWVzIG9mIGF1dG8tbXV0ZSBhbmQgYXV0by1taWMgc3dpdGNoZXMgKi8KIHN0YXRpYyB2b2lkIGFsY19hdXRvX2NoZWNrX3N3aXRjaGVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCWFsY19pbml0X2F1dG9faHAoY29kZWMpOworCWFsY19pbml0X2F1dG9tdXRlKGNvZGVjKTsKIAlhbGNfaW5pdF9hdXRvX21pYyhjb2RlYyk7CiB9CiAKQEAgLTE1MjgsNiArMTU1OSwxNSBAQAogCQkJICAgIGNvZWZfdmFsKTsKIH0KIAorLyogYSBzcGVjaWFsIGJ5cGFzcyBmb3IgQ09FRiAwOyByZWFkIHRoZSBjYWNoZWQgdmFsdWUgYXQgdGhlIHNlY29uZCB0aW1lICovCitzdGF0aWMgdW5zaWduZWQgaW50IGFsY19nZXRfY29lZjAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKCFzcGVjLT5jb2VmMCkKKwkJc3BlYy0+Y29lZjAgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCk7CisJcmV0dXJuIHNwZWMtPmNvZWYwOworfQorCiAvKgogICogRGlnaXRhbCBJL08gaGFuZGxpbmcKICAqLwpAQCAtMTU2NiwyNyArMTYwNiwyOSBAQAogc3RhdGljIHZvaWQgYWxjX2F1dG9fcGFyc2VfZGlnaXRhbChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaSwgZXJyOworCWludCBpLCBlcnIsIG51bXM7CiAJaGRhX25pZF90IGRpZ19uaWQ7CiAKIAkvKiBzdXBwb3J0IG11bHRpcGxlIFNQRElGczsgdGhlIHNlY29uZGFyeSBpcyBzZXQgdXAgYXMgYSBzbGF2ZSAqLworCW51bXMgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmRpZ19vdXRzOyBpKyspIHsKIAkJaGRhX25pZF90IGNvbm5bNF07CiAJCWVyciA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLAogCQkJCQkgICAgICBzcGVjLT5hdXRvY2ZnLmRpZ19vdXRfcGluc1tpXSwKIAkJCQkJICAgICAgY29ubiwgQVJSQVlfU0laRShjb25uKSk7Ci0JCWlmIChlcnIgPCAwKQorCQlpZiAoZXJyIDw9IDApCiAJCQljb250aW51ZTsKIAkJZGlnX25pZCA9IGNvbm5bMF07IC8qIGFzc3VtZSB0aGUgZmlyc3QgZWxlbWVudCBpcyBhdWRpby1vdXQgKi8KLQkJaWYgKCFpKSB7CisJCWlmICghbnVtcykgewogCQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBkaWdfbmlkOwogCQkJc3BlYy0+ZGlnX291dF90eXBlID0gc3BlYy0+YXV0b2NmZy5kaWdfb3V0X3R5cGVbMF07CiAJCX0gZWxzZSB7CiAJCQlzcGVjLT5tdWx0aW91dC5zbGF2ZV9kaWdfb3V0cyA9IHNwZWMtPnNsYXZlX2RpZ19vdXRzOwotCQkJaWYgKGkgPj0gQVJSQVlfU0laRShzcGVjLT5zbGF2ZV9kaWdfb3V0cykgLSAxKQorCQkJaWYgKG51bXMgPj0gQVJSQVlfU0laRShzcGVjLT5zbGF2ZV9kaWdfb3V0cykgLSAxKQogCQkJCWJyZWFrOwotCQkJc3BlYy0+c2xhdmVfZGlnX291dHNbaSAtIDFdID0gZGlnX25pZDsKKwkJCXNwZWMtPnNsYXZlX2RpZ19vdXRzW251bXMgLSAxXSA9IGRpZ19uaWQ7CiAJCX0KKwkJbnVtcysrOwogCX0KIAogCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW4pIHsKQEAgLTIyMzIsNiArMjI3NCw3IEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJc3RydWN0IGhkYV9wY20gKmluZm8gPSBzcGVjLT5wY21fcmVjOwogCWNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqcDsKKwlib29sIGhhdmVfbXVsdGlfYWRjczsKIAlpbnQgaTsKIAogCWNvZGVjLT5udW1fcGNtcyA9IDE7CkBAIC0yMzEwLDggKzIzNTMsMTEgQEAKIAkvKiBJZiB0aGUgdXNlIG9mIG1vcmUgdGhhbiBvbmUgQURDIGlzIHJlcXVlc3RlZCBmb3IgdGhlIGN1cnJlbnQKIAkgKiBtb2RlbCwgY29uZmlndXJlIGEgc2Vjb25kIGFuYWxvZyBjYXB0dXJlLW9ubHkgUENNLgogCSAqLworCWhhdmVfbXVsdGlfYWRjcyA9IChzcGVjLT5udW1fYWRjX25pZHMgPiAxKSAmJgorCQkhc3BlYy0+ZHluX2FkY19zd2l0Y2ggJiYgIXNwZWMtPmF1dG9fbWljICYmCisJCSghc3BlYy0+aW5wdXRfbXV4IHx8IHNwZWMtPmlucHV0X211eC0+bnVtX2l0ZW1zID4gMSk7CiAJLyogQWRkaXRpb25hbCBBbmFsYW9nIGNhcHR1cmUgZm9yIGluZGV4ICMyICovCi0JaWYgKHNwZWMtPmFsdF9kYWNfbmlkIHx8IHNwZWMtPm51bV9hZGNfbmlkcyA+IDEpIHsKKwlpZiAoc3BlYy0+YWx0X2RhY19uaWQgfHwgaGF2ZV9tdWx0aV9hZGNzKSB7CiAJCWNvZGVjLT5udW1fcGNtcyA9IDM7CiAJCWluZm8gPSBzcGVjLT5wY21fcmVjICsgMjsKIAkJaW5mby0+bmFtZSA9IHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZzsKQEAgLTIzMjcsNyArMjM3Myw3IEBACiAJCQkJYWxjX3BjbV9udWxsX3N0cmVhbTsKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPSAwOwogCQl9Ci0JCWlmIChzcGVjLT5udW1fYWRjX25pZHMgPiAxKSB7CisJCWlmIChoYXZlX211bHRpX2FkY3MpIHsKIAkJCXAgPSBzcGVjLT5zdHJlYW1fYW5hbG9nX2FsdF9jYXB0dXJlOwogCQkJaWYgKCFwKQogCQkJCXAgPSAmYWxjX3BjbV9hbmFsb2dfYWx0X2NhcHR1cmU7CkBAIC0yMzY4LDYgKzI0MTQsMTggQEAKIAlzbmRfYXJyYXlfZnJlZSgmc3BlYy0+a2N0bHMpOwogfQogCitzdGF0aWMgdm9pZCBhbGNfZnJlZV9iaW5kX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKHNwZWMtPmJpbmRfY3Rscy5saXN0KSB7CisJCXN0cnVjdCBoZGFfYmluZF9jdGxzICoqY3RsID0gc3BlYy0+YmluZF9jdGxzLmxpc3Q7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YmluZF9jdGxzLnVzZWQ7IGkrKykKKwkJCWtmcmVlKGN0bFtpXSk7CisJfQorCXNuZF9hcnJheV9mcmVlKCZzcGVjLT5iaW5kX2N0bHMpOworfQorCiBzdGF0aWMgdm9pZCBhbGNfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKQEAgLTIzNzgsNiArMjQzNiw3IEBACiAJYWxjX3NodXR1cChjb2RlYyk7CiAJc25kX2hkYV9pbnB1dF9qYWNrX2ZyZWUoY29kZWMpOwogCWFsY19mcmVlX2tjdGxzKGNvZGVjKTsKKwlhbGNfZnJlZV9iaW5kX2N0bHMoY29kZWMpOwogCWtmcmVlKHNwZWMpOwogCXNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKGNvZGVjKTsKIH0KQEAgLTI0NDEsNiArMjUwMCw0NyBAQAogfQogCiAvKgorICogUmVuYW1lIGNvZGVjcyBhcHByb3ByaWF0ZWx5IGZyb20gQ09FRiB2YWx1ZQorICovCitzdHJ1Y3QgYWxjX2NvZGVjX3JlbmFtZV90YWJsZSB7CisJdW5zaWduZWQgaW50IHZlbmRvcl9pZDsKKwl1bnNpZ25lZCBzaG9ydCBjb2VmX21hc2s7CisJdW5zaWduZWQgc2hvcnQgY29lZl9iaXRzOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IGFsY19jb2RlY19yZW5hbWVfdGFibGUgcmVuYW1lX3RibFtdID0geworCXsgMHgxMGVjMDI2OSwgMHhmZmYwLCAweDMwMTAsICJBTEMyNzciIH0sCisJeyAweDEwZWMwMjY5LCAweGYwZjAsIDB4MjAxMCwgIkFMQzI1OSIgfSwKKwl7IDB4MTBlYzAyNjksIDB4ZjBmMCwgMHgzMDEwLCAiQUxDMjU4IiB9LAorCXsgMHgxMGVjMDI2OSwgMHgwMGYwLCAweDAwMTAsICJBTEMyNjlWQiIgfSwKKwl7IDB4MTBlYzAyNjksIDB4ZmZmZiwgMHhhMDIzLCAiQUxDMjU5IiB9LAorCXsgMHgxMGVjMDI2OSwgMHhmZmZmLCAweDYwMjMsICJBTEMyODFYIiB9LAorCXsgMHgxMGVjMDI2OSwgMHgwMGYwLCAweDAwMjAsICJBTEMyNjlWQyIgfSwKKwl7IDB4MTBlYzA4ODcsIDB4MDBmMCwgMHgwMDMwLCAiQUxDODg3LVZEIiB9LAorCXsgMHgxMGVjMDg4OCwgMHgwMGYwLCAweDAwMzAsICJBTEM4ODgtVkQiIH0sCisJeyAweDEwZWMwODg4LCAweGYwZjAsIDB4MzAyMCwgIkFMQzg4NiIgfSwKKwl7IDB4MTBlYzA4OTksIDB4MjAwMCwgMHgyMDAwLCAiQUxDODk5IiB9LAorCXsgMHgxMGVjMDg5MiwgMHhmZmZmLCAweDgwMjAsICJBTEM2NjEiIH0sCisJeyAweDEwZWMwODkyLCAweGZmZmYsIDB4ODAxMSwgIkFMQzY2MSIgfSwKKwl7IDB4MTBlYzA4OTIsIDB4ZmZmZiwgMHg0MDExLCAiQUxDNjU2IiB9LAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgaW50IGFsY19jb2RlY19yZW5hbWVfZnJvbV9wcmVzZXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJY29uc3Qgc3RydWN0IGFsY19jb2RlY19yZW5hbWVfdGFibGUgKnA7CisKKwlmb3IgKHAgPSByZW5hbWVfdGJsOyBwLT52ZW5kb3JfaWQ7IHArKykgeworCQlpZiAocC0+dmVuZG9yX2lkICE9IGNvZGVjLT52ZW5kb3JfaWQpCisJCQljb250aW51ZTsKKwkJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmIHAtPmNvZWZfbWFzaykgPT0gcC0+Y29lZl9iaXRzKQorCQkJcmV0dXJuIGFsY19jb2RlY19yZW5hbWUoY29kZWMsIHAtPm5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKICAqIEF1dG9tYXRpYyBwYXJzZSBvZiBJL08gcGlucyBmcm9tIHRoZSBCSU9TIGNvbmZpZ3VyYXRpb24KICAqLwogCkBAIC0yNDQ4LDExICsyNTQ4LDE1IEBACiAJQUxDX0NUTF9XSURHRVRfVk9MLAogCUFMQ19DVExfV0lER0VUX01VVEUsCiAJQUxDX0NUTF9CSU5EX01VVEUsCisJQUxDX0NUTF9CSU5EX1ZPTCwKKwlBTENfQ1RMX0JJTkRfU1csCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsY19jb250cm9sX3RlbXBsYXRlc1tdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoTlVMTCwgMCwgMCwgMCksCiAJSERBX0NPREVDX01VVEUoTlVMTCwgMCwgMCwgMCksCiAJSERBX0JJTkRfTVVURShOVUxMLCAwLCAwLCAwKSwKKwlIREFfQklORF9WT0woTlVMTCwgMCksCisJSERBX0JJTkRfU1coTlVMTCwgMCksCiB9OwogCiAvKiBhZGQgZHluYW1pYyBjb250cm9scyAqLwpAQCAtMjQ5MywxMyArMjU5NywxNCBAQAogI2RlZmluZSBfX2FkZF9wYl9zd19jdHJsKHNwZWMsIHR5cGUsIHBmeCwgY2lkeCwgdmFsKQkJCVwKIAlhZGRfY29udHJvbF93aXRoX3BmeChzcGVjLCB0eXBlLCBwZngsICJQbGF5YmFjayIsICJTd2l0Y2giLCBjaWR4LCB2YWwpCiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2hhbm5lbF9uYW1lWzRdID0geworCSJGcm9udCIsICJTdXJyb3VuZCIsICJDTEZFIiwgIlNpZGUiCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX2dldF9saW5lX291dF9wZngoc3RydWN0IGFsY19zcGVjICpzcGVjLCBpbnQgY2gsCiAJCQkJCWJvb2wgY2FuX2JlX21hc3RlciwgaW50ICppbmRleCkKIHsKIAlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNobmFtZVs0XSA9IHsKLQkJIkZyb250IiwgIlN1cnJvdW5kIiwgTlVMTCAvKkNMRkUqLywgIlNpZGUiCi0JfTsKIAogCSppbmRleCA9IDA7CiAJaWYgKGNmZy0+bGluZV9vdXRzID09IDEgJiYgIXNwZWMtPm11bHRpX2lvcyAmJgpAQCAtMjUyMiw3ICsyNjI3LDEwIEBACiAJCQlyZXR1cm4gIlBDTSI7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gY2huYW1lW2NoXTsKKwlpZiAoc25kX0JVR19PTihjaCA+PSBBUlJBWV9TSVpFKGNoYW5uZWxfbmFtZSkpKQorCQlyZXR1cm4gIlBDTSI7CisKKwlyZXR1cm4gY2hhbm5lbF9uYW1lW2NoXTsKIH0KIAogLyogY3JlYXRlIGlucHV0IHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIHRoZSBnaXZlbiBwaW4gKi8KQEAgLTI1NTcsNyArMjY2NSw2IEBACiAJaGRhX25pZF90ICphZGNfbmlkcyA9IHNwZWMtPnByaXZhdGVfYWRjX25pZHM7CiAJaGRhX25pZF90ICpjYXBfbmlkcyA9IHNwZWMtPnByaXZhdGVfY2Fwc3JjX25pZHM7CiAJaW50IG1heF9udW1zID0gQVJSQVlfU0laRShzcGVjLT5wcml2YXRlX2FkY19uaWRzKTsKLQlib29sIGluZGVwX2NhcHNyYyA9IGZhbHNlOwogCWludCBpLCBudW1zID0gMDsKIAogCW5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7CkBAIC0yNTc5LDEzICsyNjg2LDExIEBACiAJCQkJYnJlYWs7CiAJCQlpZiAodHlwZSA9PSBBQ19XSURfQVVEX1NFTCkgewogCQkJCWNhcF9uaWRzW251bXNdID0gc3JjOwotCQkJCWluZGVwX2NhcHNyYyA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQluID0gc25kX2hkYV9nZXRfY29ubl9saXN0KGNvZGVjLCBzcmMsICZsaXN0KTsKIAkJCWlmIChuID4gMSkgewogCQkJCWNhcF9uaWRzW251bXNdID0gc3JjOwotCQkJCWluZGVwX2NhcHNyYyA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgaWYgKG4gIT0gMSkKIAkJCQlicmVhazsKQEAgLTI3ODYsOCArMjg5MSw5IEBACiAJCWlmIChmb3VuZF9pbl9uaWRfbGlzdChuaWQsIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzLAogCQkJCSAgICAgIHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoc3BlYy0+bXVsdGlvdXQuaHBfbmlkID09IG5pZCkKLQkJCWNvbnRpbnVlOworCQlpZiAoZm91bmRfaW5fbmlkX2xpc3QobmlkLCBzcGVjLT5tdWx0aW91dC5ocF9vdXRfbmlkLAorCQkJCSAgICAgIEFSUkFZX1NJWkUoc3BlYy0+bXVsdGlvdXQuaHBfb3V0X25pZCkpKQorCQkgICAgY29udGludWU7CiAJCWlmIChmb3VuZF9pbl9uaWRfbGlzdChuaWQsIHNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWQsCiAJCQkJICAgICAgQVJSQVlfU0laRShzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkKSkpCiAJCSAgICBjb250aW51ZTsKQEAgLTI4MDQsNiArMjkxMCwyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGFsY19hdXRvX2ZpbGxfZXh0cmFfZGFjcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9vdXRzLAorCQkJCSAgICBjb25zdCBoZGFfbmlkX3QgKnBpbnMsIGhkYV9uaWRfdCAqZGFjcykKK3sKKwlpbnQgaTsKKworCWlmIChudW1fb3V0cyAmJiAhZGFjc1swXSkgeworCQlkYWNzWzBdID0gYWxjX2F1dG9fbG9va19mb3JfZGFjKGNvZGVjLCBwaW5zWzBdKTsKKwkJaWYgKCFkYWNzWzBdKQorCQkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMTsgaSA8IG51bV9vdXRzOyBpKyspCisJCWRhY3NbaV0gPSBnZXRfZGFjX2lmX3NpbmdsZShjb2RlYywgcGluc1tpXSk7CisJZm9yIChpID0gMTsgaSA8IG51bV9vdXRzOyBpKyspIHsKKwkJaWYgKCFkYWNzW2ldKQorCQkJZGFjc1tpXSA9IGFsY19hdXRvX2xvb2tfZm9yX2RhYyhjb2RlYywgcGluc1tpXSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsY19hdXRvX2ZpbGxfbXVsdGlfaW9zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgIHVuc2lnbmVkIGludCBsb2NhdGlvbik7CisKIC8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLwogc3RhdGljIGludCBhbGNfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewpAQCAtMjgxNSw3ICsyOTQ0LDcgQEAKICBhZ2FpbjoKIAkvKiBzZXQgbnVtX2RhY3Mgb25jZSB0byBmdWxsIGZvciBhbGNfYXV0b19sb29rX2Zvcl9kYWMoKSAqLwogCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHM7Ci0Jc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMDsKKwlzcGVjLT5tdWx0aW91dC5ocF9vdXRfbmlkWzBdID0gMDsKIAlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0gMDsKIAltZW1zZXQoc3BlYy0+cHJpdmF0ZV9kYWNfbmlkcywgMCwgc2l6ZW9mKHNwZWMtPnByaXZhdGVfZGFjX25pZHMpKTsKIAlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7CkBAIC0yODI2LDcgKzI5NTUsNyBAQAogCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9CiAJCQkJZ2V0X2RhY19pZl9zaW5nbGUoY29kZWMsIGNmZy0+bGluZV9vdXRfcGluc1tpXSk7CiAJCWlmIChjZmctPmhwX291dHMpCi0JCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPQorCQkJc3BlYy0+bXVsdGlvdXQuaHBfb3V0X25pZFswXSA9CiAJCQkJZ2V0X2RhY19pZl9zaW5nbGUoY29kZWMsIGNmZy0+aHBfcGluc1swXSk7CiAJCWlmIChjZmctPnNwZWFrZXJfb3V0cykKIAkJCXNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0gPQpAQCAtMjg1OCwyNCArMjk4Nyw1OCBAQAogCQkJCXNpemVvZihoZGFfbmlkX3QpICogKGNmZy0+bGluZV9vdXRzIC0gaSAtIDEpKTsKIAl9CiAKLQlpZiAoY2ZnLT5ocF9vdXRzICYmICFzcGVjLT5tdWx0aW91dC5ocF9uaWQpCi0JCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9Ci0JCQlhbGNfYXV0b19sb29rX2Zvcl9kYWMoY29kZWMsIGNmZy0+aHBfcGluc1swXSk7Ci0JaWYgKGNmZy0+c3BlYWtlcl9vdXRzICYmICFzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdKQotCQlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0KLQkJCWFsY19hdXRvX2xvb2tfZm9yX2RhYyhjb2RlYywgY2ZnLT5zcGVha2VyX3BpbnNbMF0pOworCWlmIChjZmctPmxpbmVfb3V0cyA9PSAxICYmIGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9TUEVBS0VSX09VVCkgeworCQkvKiB0cnkgdG8gZmlsbCBtdWx0aS1pbyBmaXJzdCAqLworCQl1bnNpZ25lZCBpbnQgbG9jYXRpb24sIGRlZmNmZzsKKwkJaW50IG51bV9waW5zOworCisJCWRlZmNmZyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgY2ZnLT5saW5lX291dF9waW5zWzBdKTsKKwkJbG9jYXRpb24gPSBnZXRfZGVmY2ZnX2xvY2F0aW9uKGRlZmNmZyk7CisKKwkJbnVtX3BpbnMgPSBhbGNfYXV0b19maWxsX211bHRpX2lvcyhjb2RlYywgbG9jYXRpb24pOworCQlpZiAobnVtX3BpbnMgPiAwKSB7CisJCQlzcGVjLT5tdWx0aV9pb3MgPSBudW1fcGluczsKKwkJCXNwZWMtPmV4dF9jaGFubmVsX2NvdW50ID0gMjsKKwkJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gbnVtX3BpbnMgKyAxOworCQl9CisJfQorCisJaWYgKGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9IUF9PVVQpCisJCWFsY19hdXRvX2ZpbGxfZXh0cmFfZGFjcyhjb2RlYywgY2ZnLT5ocF9vdXRzLCBjZmctPmhwX3BpbnMsCisJCQkJIHNwZWMtPm11bHRpb3V0LmhwX291dF9uaWQpOworCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgIT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpCisJCWFsY19hdXRvX2ZpbGxfZXh0cmFfZGFjcyhjb2RlYywgY2ZnLT5zcGVha2VyX291dHMsIGNmZy0+c3BlYWtlcl9waW5zLAorCQkJCSBzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfY3RsX3Bvcyh1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwloZGFfbmlkX3QgbmlkID0gZ2V0X2FtcF9uaWRfKGRhdGEpOworCXVuc2lnbmVkIGludCBkaXIgPSBnZXRfYW1wX2RpcmVjdGlvbl8oZGF0YSk7CisJcmV0dXJuIChuaWQgPDwgMSkgfCBkaXI7Cit9CisKKyNkZWZpbmUgaXNfY3RsX3VzZWQoYml0cywgZGF0YSkgXAorCXRlc3RfYml0KGdldF9jdGxfcG9zKGRhdGEpLCBiaXRzKQorI2RlZmluZSBtYXJrX2N0bF91c2FnZShiaXRzLCBkYXRhKSBcCisJc2V0X2JpdChnZXRfY3RsX3BvcyhkYXRhKSwgYml0cykKKwogc3RhdGljIGludCBhbGNfYXV0b19hZGRfdm9sX2N0bChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCSAgICAgIGNvbnN0IGNoYXIgKnBmeCwgaW50IGNpZHgsCiAJCQkgICAgICBoZGFfbmlkX3QgbmlkLCB1bnNpZ25lZCBpbnQgY2hzKQogeworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCB2YWw7CiAJaWYgKCFuaWQpCiAJCXJldHVybiAwOworCXZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCBjaHMsIDAsIEhEQV9PVVRQVVQpOworCWlmIChpc19jdGxfdXNlZChzcGVjLT52b2xfY3RscywgdmFsKSAmJiBjaHMgIT0gMikgLyogZXhjbHVkZSBMRkUgKi8KKwkJcmV0dXJuIDA7CisJbWFya19jdGxfdXNhZ2Uoc3BlYy0+dm9sX2N0bHMsIHZhbCk7CiAJcmV0dXJuIF9fYWRkX3BiX3ZvbF9jdHJsKGNvZGVjLT5zcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIHBmeCwgY2lkeCwKLQkJCQkgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIGNocywgMCwgSERBX09VVFBVVCkpOworCQkJCSB2YWwpOwogfQogCiAjZGVmaW5lIGFsY19hdXRvX2FkZF9zdGVyZW9fdm9sKGNvZGVjLCBwZngsIGNpZHgsIG5pZCkJXApAQCAtMjg4OCw2ICszMDUxLDcgQEAKIAkJCSAgICAgY29uc3QgY2hhciAqcGZ4LCBpbnQgY2lkeCwKIAkJCSAgICAgaGRhX25pZF90IG5pZCwgdW5zaWduZWQgaW50IGNocykKIHsKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgd2lkX3R5cGU7CiAJaW50IHR5cGU7CiAJdW5zaWduZWQgbG9uZyB2YWw7CkBAIC0yOTA0LDYgKzMwNjgsOSBAQAogCQl0eXBlID0gQUxDX0NUTF9CSU5EX01VVEU7CiAJCXZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCBjaHMsIDIsIEhEQV9JTlBVVCk7CiAJfQorCWlmIChpc19jdGxfdXNlZChzcGVjLT5zd19jdGxzLCB2YWwpICYmIGNocyAhPSAyKSAvKiBleGNsdWRlIExGRSAqLworCQlyZXR1cm4gMDsKKwltYXJrX2N0bF91c2FnZShzcGVjLT5zd19jdGxzLCB2YWwpOwogCXJldHVybiBfX2FkZF9wYl9zd19jdHJsKGNvZGVjLT5zcGVjLCB0eXBlLCBwZngsIGNpZHgsIHZhbCk7CiB9CiAKQEAgLTI5NjQsNyArMzEzMSw3IEBACiAJCXN3ID0gYWxjX2xvb2tfZm9yX291dF9tdXRlX25pZChjb2RlYywgcGluLCBkYWMpOwogCQl2b2wgPSBhbGNfbG9va19mb3Jfb3V0X3ZvbF9uaWQoY29kZWMsIHBpbiwgZGFjKTsKIAkJbmFtZSA9IGFsY19nZXRfbGluZV9vdXRfcGZ4KHNwZWMsIGksIHRydWUsICZpbmRleCk7Ci0JCWlmICghbmFtZSkgeworCQlpZiAoIW5hbWUgfHwgIXN0cmNtcChuYW1lLCAiQ0xGRSIpKSB7CiAJCQkvKiBDZW50ZXIvTEZFICovCiAJCQllcnIgPSBhbGNfYXV0b19hZGRfdm9sX2N0bChjb2RlYywgIkNlbnRlciIsIDAsIHZvbCwgMSk7CiAJCQlpZiAoZXJyIDwgMCkKQEAgLTI5OTAsMjMgKzMxNTcsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZvciBzcGVha2VyIGFuZCBIUCBvdXRwdXRzICovCiBzdGF0aWMgaW50IGFsY19hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4sCi0JCQkJCWhkYV9uaWRfdCBkYWMsIGNvbnN0IGNoYXIgKnBmeCkKKwkJCQkgICAgIGhkYV9uaWRfdCBkYWMsIGNvbnN0IGNoYXIgKnBmeCkKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAloZGFfbmlkX3Qgc3csIHZvbDsKIAlpbnQgZXJyOwogCi0JaWYgKCFwaW4pCi0JCXJldHVybiAwOwogCWlmICghZGFjKSB7CisJCXVuc2lnbmVkIGludCB2YWw7CiAJCS8qIHRoZSBjb3JyZXNwb25kaW5nIERBQyBpcyBhbHJlYWR5IG9jY3VwaWVkICovCiAJCWlmICghKGdldF93Y2Fwcyhjb2RlYywgcGluKSAmIEFDX1dDQVBfT1VUX0FNUCkpCiAJCQlyZXR1cm4gMDsgLyogbm8gd2F5ICovCiAJCS8qIGNyZWF0ZSBhIHN3aXRjaCBvbmx5ICovCi0JCXJldHVybiBhZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBwZngsCi0JCQkJICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJdmFsID0gSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpOworCQlpZiAoaXNfY3RsX3VzZWQoc3BlYy0+c3dfY3RscywgdmFsKSkKKwkJCXJldHVybiAwOyAvKiBhbHJlYWR5IGNyZWF0ZWQgKi8KKwkJbWFya19jdGxfdXNhZ2Uoc3BlYy0+c3dfY3RscywgdmFsKTsKKwkJcmV0dXJuIGFkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIHBmeCwgdmFsKTsKIAl9CiAKIAlzdyA9IGFsY19sb29rX2Zvcl9vdXRfbXV0ZV9uaWQoY29kZWMsIHBpbiwgZGFjKTsKQEAgLTMwMjAsMjAgKzMxODgsMTEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX2JpbmRfY3RscyAqbmV3X2JpbmRfY3RsKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgIHVuc2lnbmVkIGludCBudW1zLAorCQkJCQkgIHN0cnVjdCBoZGFfY3RsX29wcyAqb3BzKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfYmluZF9jdGxzICoqY3RscCwgKmN0bDsKKwlzbmRfYXJyYXlfaW5pdCgmc3BlYy0+YmluZF9jdGxzLCBzaXplb2YoY3RsKSwgOCk7CisJY3RscCA9IHNuZF9hcnJheV9uZXcoJnNwZWMtPmJpbmRfY3Rscyk7CisJaWYgKCFjdGxwKQorCQlyZXR1cm4gTlVMTDsKKwljdGwgPSBremFsbG9jKHNpemVvZigqY3RsKSArIHNpemVvZihsb25nKSAqIChudW1zICsgMSksIEdGUF9LRVJORUwpOworCSpjdGxwID0gY3RsOworCWlmIChjdGwpCisJCWN0bC0+b3BzID0gb3BzOworCXJldHVybiBjdGw7Cit9CisKKy8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmb3Igc3BlYWtlciBhbmQgSFAgb3V0cHV0cyAqLworc3RhdGljIGludCBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0cyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9waW5zLAorCQkJCSAgICAgIGNvbnN0IGhkYV9uaWRfdCAqcGlucywKKwkJCQkgICAgICBjb25zdCBoZGFfbmlkX3QgKmRhY3MsCisJCQkJICAgICAgY29uc3QgY2hhciAqcGZ4KQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfYmluZF9jdGxzICpjdGw7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgaSwgbiwgZXJyOworCisJaWYgKCFudW1fcGlucyB8fCAhcGluc1swXSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobnVtX3BpbnMgPT0gMSkgeworCQloZGFfbmlkX3QgZGFjID0gKmRhY3M7CisJCWlmICghZGFjKQorCQkJZGFjID0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF07CisJCXJldHVybiBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0KGNvZGVjLCAqcGlucywgZGFjLCBwZngpOworCX0KKworCWlmIChkYWNzW251bV9waW5zIC0gMV0pIHsKKwkJLyogT0ssIHdlIGhhdmUgYSBtdWx0aS1vdXRwdXQgc3lzdGVtIHdpdGggaW5kaXZpZHVhbCB2b2x1bWVzICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcGluczsgaSsrKSB7CisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyAlcyIsCisJCQkJIHBmeCwgY2hhbm5lbF9uYW1lW2ldKTsKKwkJCWVyciA9IGFsY19hdXRvX2NyZWF0ZV9leHRyYV9vdXQoY29kZWMsIHBpbnNbaV0sIGRhY3NbaV0sCisJCQkJCQkJbmFtZSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIExldCdzIGNyZWF0ZSBhIGJpbmQtY29udHJvbHMgKi8KKwljdGwgPSBuZXdfYmluZF9jdGwoY29kZWMsIG51bV9waW5zLCAmc25kX2hkYV9iaW5kX3N3KTsKKwlpZiAoIWN0bCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9waW5zOyBpKyspIHsKKwkJaWYgKGdldF93Y2Fwcyhjb2RlYywgcGluc1tpXSkgJiBBQ19XQ0FQX09VVF9BTVApCisJCQljdGwtPnZhbHVlc1tuKytdID0KKwkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKHBpbnNbaV0sIDMsIDAsIEhEQV9PVVRQVVQpOworCX0KKwlpZiAobikgeworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOworCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfU1csIG5hbWUsIDAsIChsb25nKWN0bCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwljdGwgPSBuZXdfYmluZF9jdGwoY29kZWMsIG51bV9waW5zLCAmc25kX2hkYV9iaW5kX3ZvbCk7CisJaWYgKCFjdGwpCisJCXJldHVybiAtRU5PTUVNOworCW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGluczsgaSsrKSB7CisJCWhkYV9uaWRfdCB2b2w7CisJCWlmICghcGluc1tpXSB8fCAhZGFjc1tpXSkKKwkJCWNvbnRpbnVlOworCQl2b2wgPSBhbGNfbG9va19mb3Jfb3V0X3ZvbF9uaWQoY29kZWMsIHBpbnNbaV0sIGRhY3NbaV0pOworCQlpZiAodm9sKQorCQkJY3RsLT52YWx1ZXNbbisrXSA9CisJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTCh2b2wsIDMsIDAsIEhEQV9PVVRQVVQpOworCX0KKwlpZiAobikgeworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyBQbGF5YmFjayBWb2x1bWUiLCBwZngpOworCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfVk9MLCBuYW1lLCAwLCAobG9uZyljdGwpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGFsY19hdXRvX2NyZWF0ZV9ocF9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JcmV0dXJuIGFsY19hdXRvX2NyZWF0ZV9leHRyYV9vdXQoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKLQkJCQkJIHNwZWMtPm11bHRpb3V0LmhwX25pZCwKLQkJCQkJICJIZWFkcGhvbmUiKTsKKwlyZXR1cm4gYWxjX2F1dG9fY3JlYXRlX2V4dHJhX291dHMoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfb3V0cywKKwkJCQkJICBzcGVjLT5hdXRvY2ZnLmhwX3BpbnMsCisJCQkJCSAgc3BlYy0+bXVsdGlvdXQuaHBfb3V0X25pZCwKKwkJCQkJICAiSGVhZHBob25lIik7CiB9CiAKIHN0YXRpYyBpbnQgYWxjX2F1dG9fY3JlYXRlX3NwZWFrZXJfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXJldHVybiBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0KGNvZGVjLCBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKLQkJCQkJIHNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0sCi0JCQkJCSAiU3BlYWtlciIpOworCXJldHVybiBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0cyhjb2RlYywgc3BlYy0+YXV0b2NmZy5zcGVha2VyX291dHMsCisJCQkJCSAgc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnMsCisJCQkJCSAgc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZCwKKwkJCQkJICAiU3BlYWtlciIpOwogfQogCiBzdGF0aWMgdm9pZCBhbGNfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC0zMDcxLDYgKzMzMzEsMTIgQEAKIAlpZiAobmlkKQogCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCiAJCQkJICAgIEFNUF9PVVRfWkVSTyk7CisKKwkvKiB1bm11dGUgREFDIGlmIGl0J3Mgbm90IGFzc2lnbmVkIHRvIGEgbWl4ZXIgKi8KKwluaWQgPSBhbGNfbG9va19mb3Jfb3V0X211dGVfbmlkKGNvZGVjLCBwaW4sIGRhYyk7CisJaWYgKG5pZCA9PSBtaXggJiYgbmlkX2hhc19tdXRlKGNvZGVjLCBkYWMsIEhEQV9PVVRQVVQpKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBkYWMsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJCQkJICAgIEFNUF9PVVRfWkVSTyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsY19hdXRvX2luaXRfbXVsdGlfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMzA5MCwyMCArMzM1NiwzNyBAQAogc3RhdGljIHZvaWQgYWxjX2F1dG9faW5pdF9leHRyYV9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CiAJaGRhX25pZF90IHBpbiwgZGFjOwogCi0JcGluID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOwotCWlmIChwaW4pIHsKLQkJZGFjID0gc3BlYy0+bXVsdGlvdXQuaHBfbmlkOwotCQlpZiAoIWRhYykKLQkJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmhwX291dHM7IGkrKykgeworCQlpZiAoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlID09IEFVVE9fUElOX0hQX09VVCkKKwkJCWJyZWFrOworCQlwaW4gPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbaV07CisJCWlmICghcGluKQorCQkJYnJlYWs7CisJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmhwX291dF9uaWRbaV07CisJCWlmICghZGFjKSB7CisJCQlpZiAoaSA+IDAgJiYgc3BlYy0+bXVsdGlvdXQuaHBfb3V0X25pZFswXSkKKwkJCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5ocF9vdXRfbmlkWzBdOworCQkJZWxzZQorCQkJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCQl9CiAJCWFsY19hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fSFAsIGRhYyk7CiAJfQotCXBpbiA9IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdOwotCWlmIChwaW4pIHsKLQkJZGFjID0gc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXTsKLQkJaWYgKCFkYWMpCi0JCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YXV0b2NmZy5zcGVha2VyX291dHM7IGkrKykgeworCQlpZiAoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlID09IEFVVE9fUElOX1NQRUFLRVJfT1VUKQorCQkJYnJlYWs7CisJCXBpbiA9IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zW2ldOworCQlpZiAoIXBpbikKKwkJCWJyZWFrOworCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkW2ldOworCQlpZiAoIWRhYykgeworCQkJaWYgKGkgPiAwICYmIHNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0pCisJCQkJZGFjID0gc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXTsKKwkJCWVsc2UKKwkJCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsKKwkJfQogCQlhbGNfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX09VVCwgZGFjKTsKIAl9CiB9CkBAIC0zMTE2LDYgKzMzOTksNyBAQAogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCWhkYV9uaWRfdCBwcmltZV9kYWMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzWzBdOwogCWludCB0eXBlLCBpLCBudW1fcGlucyA9IDA7CiAKIAlmb3IgKHR5cGUgPSBBVVRPX1BJTl9MSU5FX0lOOyB0eXBlID49IEFVVE9fUElOX01JQzsgdHlwZS0tKSB7CkBAIC0zMTQzLDggKzM0MjcsMTMgQEAKIAkJfQogCX0KIAlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDE7Ci0JaWYgKG51bV9waW5zIDwgMikKKwlpZiAobnVtX3BpbnMgPCAyKSB7CisJCS8qIGNsZWFyIHVwIGFnYWluICovCisJCW1lbXNldChzcGVjLT5wcml2YXRlX2RhY19uaWRzLCAwLAorCQkgICAgICAgc2l6ZW9mKHNwZWMtPnByaXZhdGVfZGFjX25pZHMpKTsKKwkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1swXSA9IHByaW1lX2RhYzsKIAkJcmV0dXJuIDA7CisJfQogCXJldHVybiBudW1fcGluczsKIH0KIApAQCAtMzIzMCwzNiArMzUxOSwxMSBAQAogCS5wdXQgPSBhbGNfYXV0b19jaF9tb2RlX3B1dCwKIH07CiAKLXN0YXRpYyBpbnQgYWxjX2F1dG9fYWRkX211bHRpX2NoYW5uZWxfbW9kZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJICAgaW50ICgqZmlsbF9kYWMpKHN0cnVjdCBoZGFfY29kZWMgKikpCitzdGF0aWMgaW50IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7Ci0JdW5zaWduZWQgaW50IGxvY2F0aW9uLCBkZWZjZmc7Ci0JaW50IG51bV9waW5zOwogCi0JaWYgKGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCAmJiBjZmctPmhwX291dHMgPT0gMSkgewotCQkvKiB1c2UgSFAgYXMgcHJpbWFyeSBvdXQgKi8KLQkJY2ZnLT5zcGVha2VyX291dHMgPSBjZmctPmxpbmVfb3V0czsKLQkJbWVtY3B5KGNmZy0+c3BlYWtlcl9waW5zLCBjZmctPmxpbmVfb3V0X3BpbnMsCi0JCSAgICAgICBzaXplb2YoY2ZnLT5zcGVha2VyX3BpbnMpKTsKLQkJY2ZnLT5saW5lX291dHMgPSBjZmctPmhwX291dHM7Ci0JCW1lbWNweShjZmctPmxpbmVfb3V0X3BpbnMsIGNmZy0+aHBfcGlucywgc2l6ZW9mKGNmZy0+aHBfcGlucykpOwotCQljZmctPmhwX291dHMgPSAwOwotCQltZW1zZXQoY2ZnLT5ocF9waW5zLCAwLCBzaXplb2YoY2ZnLT5ocF9waW5zKSk7Ci0JCWNmZy0+bGluZV9vdXRfdHlwZSA9IEFVVE9fUElOX0hQX09VVDsKLQkJaWYgKGZpbGxfZGFjKQotCQkJZmlsbF9kYWMoY29kZWMpOwotCX0KLQlpZiAoY2ZnLT5saW5lX291dHMgIT0gMSB8fAotCSAgICBjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpCi0JCXJldHVybiAwOwotCi0JZGVmY2ZnID0gc25kX2hkYV9jb2RlY19nZXRfcGluY2ZnKGNvZGVjLCBjZmctPmxpbmVfb3V0X3BpbnNbMF0pOwotCWxvY2F0aW9uID0gZ2V0X2RlZmNmZ19sb2NhdGlvbihkZWZjZmcpOwotCi0JbnVtX3BpbnMgPSBhbGNfYXV0b19maWxsX211bHRpX2lvcyhjb2RlYywgbG9jYXRpb24pOwotCWlmIChudW1fcGlucyA+IDApIHsKKwlpZiAoc3BlYy0+bXVsdGlfaW9zID4gMCkgewogCQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa25ldzsKIAogCQlrbmV3ID0gYWxjX2tjb250cm9sX25ldyhzcGVjKTsKQEAgLTMyNjksMTAgKzM1MzMsNiBAQAogCQlrbmV3LT5uYW1lID0ga3N0cmR1cCgiQ2hhbm5lbCBNb2RlIiwgR0ZQX0tFUk5FTCk7CiAJCWlmICgha25ldy0+bmFtZSkKIAkJCXJldHVybiAtRU5PTUVNOwotCi0JCXNwZWMtPm11bHRpX2lvcyA9IG51bV9waW5zOwotCQlzcGVjLT5leHRfY2hhbm5lbF9jb3VudCA9IDI7Ci0JCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gbnVtX3BpbnMgKyAxOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM1NTUsMjcgKzM4MTUsNDIgQEAKIAkJCQkgY29uc3QgaGRhX25pZF90ICpzc2lkX25pZHMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAotCQkJCQkgICBpZ25vcmVfbmlkcyk7CisJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmY2ZnKGNvZGVjLCBjZmcsIGlnbm9yZV9uaWRzLAorCQkJCSAgICAgICBzcGVjLT5wYXJzZV9mbGFncyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cykgewotCQlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0cyB8fCBzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW4pIHsKKwlpZiAoIWNmZy0+bGluZV9vdXRzKSB7CisJCWlmIChjZmctPmRpZ19vdXRzIHx8IGNmZy0+ZGlnX2luX3BpbikgewogCQkJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKIAkJCXNwZWMtPm5vX2FuYWxvZyA9IDE7CiAJCQlnb3RvIGRpZ19vbmx5OwogCQl9CiAJCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLwogCX0KKworCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQgJiYKKwkgICAgY2ZnLT5saW5lX291dHMgPD0gY2ZnLT5ocF9vdXRzKSB7CisJCS8qIHVzZSBIUCBhcyBwcmltYXJ5IG91dCAqLworCQljZmctPnNwZWFrZXJfb3V0cyA9IGNmZy0+bGluZV9vdXRzOworCQltZW1jcHkoY2ZnLT5zcGVha2VyX3BpbnMsIGNmZy0+bGluZV9vdXRfcGlucywKKwkJICAgICAgIHNpemVvZihjZmctPnNwZWFrZXJfcGlucykpOworCQljZmctPmxpbmVfb3V0cyA9IGNmZy0+aHBfb3V0czsKKwkJbWVtY3B5KGNmZy0+bGluZV9vdXRfcGlucywgY2ZnLT5ocF9waW5zLCBzaXplb2YoY2ZnLT5ocF9waW5zKSk7CisJCWNmZy0+aHBfb3V0cyA9IDA7CisJCW1lbXNldChjZmctPmhwX3BpbnMsIDAsIHNpemVvZihjZmctPmhwX3BpbnMpKTsKKwkJY2ZnLT5saW5lX291dF90eXBlID0gQVVUT19QSU5fSFBfT1VUOworCX0KKwogCWVyciA9IGFsY19hdXRvX2ZpbGxfZGFjX25pZHMoY29kZWMpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoY29kZWMsIGFsY19hdXRvX2ZpbGxfZGFjX25pZHMpOworCWVyciA9IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoY29kZWMpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsY19hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3Rscyhjb2RlYywgJnNwZWMtPmF1dG9jZmcpOworCWVyciA9IGFsY19hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3Rscyhjb2RlYywgY2ZnKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAllcnIgPSBhbGNfYXV0b19jcmVhdGVfaHBfb3V0KGNvZGVjKTsKQEAgLTM2NzgsMTAgKzM5NTMsOCBAQAogCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKIAkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCiAJCWVyciA9IGFsYzg4MF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKIAkJZWxzZSBpZiAoIWVycikgewogCQkJcHJpbnRrKEtFUk5fSU5GTwpAQCAtMzcwNiwxMCArMzk3OSw4IEBACiAKIAlpZiAoIXNwZWMtPm5vX2FuYWxvZykgewogCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgxKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOwogCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwYiwgMHgwNSwgSERBX0lOUFVUKTsKIAl9CiAKQEAgLTM3MjQsNiArMzk5NSwxMCBAQAogI2VuZGlmCiAKIAlyZXR1cm4gMDsKKworIGVycm9yOgorCWFsY19mcmVlKGNvZGVjKTsKKwlyZXR1cm4gZXJyOwogfQogCiAKQEAgLTM4MDUsMTAgKzQwODAsOCBAQAogCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKIAkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCiAJCWVyciA9IGFsYzI2MF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKIAkJZWxzZSBpZiAoIWVycikgewogCQkJcHJpbnRrKEtFUk5fSU5GTwpAQCAtMzgzMywxMCArNDEwNiw4IEBACiAKIAlpZiAoIXNwZWMtPm5vX2FuYWxvZykgewogCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgxKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOwogCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwNywgMHgwNSwgSERBX0lOUFVUKTsKIAl9CiAKQEAgLTM4NTQsNiArNDEyNSwxMCBAQAogI2VuZGlmCiAKIAlyZXR1cm4gMDsKKworIGVycm9yOgorCWFsY19mcmVlKGNvZGVjKTsKKwlyZXR1cm4gZXJyOwogfQogCiAKQEAgLTM4ODAsNiArNDE1NSw3IEBACiAJUElORklYX0xFTk9WT19ZNTMwLAogCVBJTkZJWF9QQl9NNTIxMCwKIAlQSU5GSVhfQUNFUl9BU1BJUkVfNzczNiwKKwlQSU5GSVhfQVNVU19XOTBWLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjODgyX2ZpeHVwc1tdID0gewpAQCAtMzkxMSwxMCArNDE4NywxOCBAQAogCQkudHlwZSA9IEFMQ19GSVhVUF9TS1UsCiAJCS52LnNrdSA9IEFMQ19GSVhVUF9TS1VfSUdOT1JFLAogCX0sCisJW1BJTkZJWF9BU1VTX1c5MFZdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNiwgMHg5OTEzMDExMCB9LCAvKiBmaXggc2VxdWVuY2UgZm9yIENMRkUgKi8KKwkJCXsgfQorCQl9CisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4ODJfZml4dXBfdGJsW10gPSB7CiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE1NSwgIlBhY2thcmQtQmVsbCBNNTEyMCIsIFBJTkZJWF9QQl9NNTIxMCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg3MywgIkFTVVMgVzkwViIsIFBJTkZJWF9BU1VTX1c5MFYpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNhMGQsICJMZW5vdm8gWTUzMCIsIFBJTkZJWF9MRU5PVk9fWTUzMCksCiAJU05EX1BDSV9RVUlSSygweDE0N2IsIDB4MTA3YSwgIkFiaXQgQVc5RC1NQVgiLCBQSU5GSVhfQUJJVF9BVzlEX01BWCksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDI5NiwgIkFjZXIgQXNwaXJlIDc3MzZ6IiwgUElORklYX0FDRVJfQVNQSVJFXzc3MzYpLApAQCAtMzk2MSw2ICs0MjQ1LDEwIEBACiAJCWJyZWFrOwogCX0KIAorCWVyciA9IGFsY19jb2RlY19yZW5hbWVfZnJvbV9wcmVzZXQoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCiAJYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODgyX01PREVMX0xBU1QsCiAJCQkJCWFsYzg4Ml9tb2RlbHMsIGFsYzg4Ml9jZmdfdGJsKTsKIApAQCAtMzk4NCwxMCArNDI3Miw4IEBACiAJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewogCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KIAkJZXJyID0gYWxjODgyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOwogI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwogCQllbHNlIGlmICghZXJyKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCkBAIC00MDEyLDEwICs0Mjk4LDggQEAKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7CiAJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CiAJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwogCX0KIApAQCAtNDAzNCw2ICs0MzE4LDEwIEBACiAjZW5kaWYKIAogCXJldHVybiAwOworCisgZXJyb3I6CisJYWxjX2ZyZWUoY29kZWMpOworCXJldHVybiBlcnI7CiB9CiAKIApAQCAtNDEzOCwxMCArNDQyNiw4IEBACiAJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewogCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KIAkJZXJyID0gYWxjMjYyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOwogI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwogCQllbHNlIGlmICghZXJyKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCkBAIC00MTY2LDEwICs0NDUyLDggQEAKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7CiAJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CiAJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwogCX0KIApAQCAtNDE4OSw2ICs0NDczLDEwIEBACiAjZW5kaWYKIAogCXJldHVybiAwOworCisgZXJyb3I6CisJYWxjX2ZyZWUoY29kZWMpOworCXJldHVybiBlcnI7CiB9CiAKIC8qCkBAIC00MjM3LDE0ICs0NTI1LDkgQEAKIAogLyoKICAqLwotI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwotI2luY2x1ZGUgImFsYzI2OF9xdWlya3MuYyIKLSNlbmRpZgotCiBzdGF0aWMgaW50IHBhdGNoX2FsYzI2OChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWM7Ci0JaW50IGJvYXJkX2NvbmZpZzsKIAlpbnQgaSwgaGFzX2JlZXAsIGVycjsKIAogCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwpAQCAtNDI1NSwzOCArNDUzOCwxMCBAQAogCiAJLyogQUxDMjY4IGhhcyBubyBhYS1sb29wYmFjayBtaXhlciAqLwogCi0JYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDMjY4X01PREVMX0xBU1QsCi0JCQkJCWFsYzI2OF9tb2RlbHMsIGFsYzI2OF9jZmdfdGJsKTsKLQotCWlmIChib2FyZF9jb25maWcgPCAwKQotCQlib2FyZF9jb25maWcgPSBhbGNfYm9hcmRfY29kZWNfc2lkX2NvbmZpZyhjb2RlYywKLQkJCUFMQzI2OF9NT0RFTF9MQVNULCBhbGMyNjhfbW9kZWxzLCBhbGMyNjhfc3NpZF9jZmdfdGJsKTsKLQotCWlmIChib2FyZF9jb25maWcgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKLQkJICAgICAgIGNvZGVjLT5jaGlwX25hbWUpOwotCQlib2FyZF9jb25maWcgPSBBTENfTU9ERUxfQVVUTzsKLQl9Ci0KLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7Ci0JCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCQllcnIgPSBhbGMyNjhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwotCQllbHNlIGlmICghZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKLQkJCWJvYXJkX2NvbmZpZyA9IEFMQzI2OF8zU1Q7Ci0JCX0KLSNlbmRpZgotCX0KLQotCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzI2OF9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCWVyciA9IGFsYzI2OF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CiAKIAloYXNfYmVlcCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9taXhlcnM7IGkrKykgewpAQCAtNDI5OCwxMCArNDU1Myw4IEBACiAKIAlpZiAoaGFzX2JlZXApIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKIAkJaWYgKCFxdWVyeV9hbXBfY2Fwcyhjb2RlYywgMHgxZCwgSERBX0lOUFVUKSkKIAkJCS8qIG92ZXJyaWRlIHRoZSBhbXAgY2FwcyBmb3IgYmVlcCBnZW5lcmF0b3IgKi8KIAkJCXNuZF9oZGFfb3ZlcnJpZGVfYW1wX2NhcHMoY29kZWMsIDB4MWQsIEhEQV9JTlBVVCwKQEAgLTQzMjMsMTMgKzQ1NzYsMTYgQEAKIAlzcGVjLT52bWFzdGVyX25pZCA9IDB4MDI7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKQotCQlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKKwlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKIAlzcGVjLT5zaHV0dXAgPSBhbGNfZWFwZF9zaHV0dXA7CiAKIAlhbGNfaW5pdF9qYWNrcyhjb2RlYyk7CiAKIAlyZXR1cm4gMDsKKworIGVycm9yOgorCWFsY19mcmVlKGNvZGVjKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtNDQyMyw5ICs0Njc5LDkgQEAKIAogc3RhdGljIHZvaWQgYWxjMjY5X3NodXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTcpCisJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmIDB4MDBmZikgPT0gMHgwMTcpCiAJCWFsYzI2OV90b2dnbGVfcG93ZXJfb3V0cHV0KGNvZGVjLCAwKTsKLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTgpIHsKKwlpZiAoKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGZmKSA9PSAweDAxOCkgewogCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMCk7CiAJCW1zbGVlcCgxNTApOwogCX0KQEAgLTQ0MzQsMTkgKzQ2OTAsMTkgQEAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgYWxjMjY5X3Jlc3VtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTgpIHsKKwlpZiAoKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGZmKSA9PSAweDAxOCkgewogCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMCk7CiAJCW1zbGVlcCgxNTApOwogCX0KIAogCWNvZGVjLT5wYXRjaF9vcHMuaW5pdChjb2RlYyk7CiAKLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTcpIHsKKwlpZiAoKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGZmKSA9PSAweDAxNykgewogCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMSk7CiAJCW1zbGVlcCgyMDApOwogCX0KIAotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxOCkKKwlpZiAoKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGZmKSA9PSAweDAxOCkKIAkJYWxjMjY5X3RvZ2dsZV9wb3dlcl9vdXRwdXQoY29kZWMsIDEpOwogCiAJc25kX2hkYV9jb2RlY19yZXN1bWVfYW1wKGNvZGVjKTsKQEAgLTQ1MTUsNiArNDc3MSwzMCBAQAogCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwNywgY29lZiB8IDB4ODApOwogfQogCitzdGF0aWMgdm9pZCBhbGMyNjlfcXVhbnRhX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVwZGF0ZV9vdXRwdXRzKGNvZGVjKTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCisJCQlBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDBjKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAorCQkJQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDY4MCk7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAorCQkJQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwYyk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMCwgMCwKKwkJCUFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0ODApOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjlfZml4dXBfcXVhbnRhX211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKGFjdGlvbiAhPSBBTENfRklYVVBfQUNUX1BST0JFKQorCQlyZXR1cm47CisJc3BlYy0+YXV0b211dGVfaG9vayA9IGFsYzI2OV9xdWFudGFfYXV0b211dGU7Cit9CisKIGVudW0gewogCUFMQzI2OV9GSVhVUF9TT05ZX1ZBSU8sCiAJQUxDMjc1X0ZJWFVQX1NPTllfVkFJT19HUElPMiwKQEAgLTQ1MjYsNiArNDgwNiwxMiBAQAogCUFMQzI3MV9GSVhVUF9ETUlDLAogCUFMQzI2OV9GSVhVUF9QQ01fNDRLLAogCUFMQzI2OV9GSVhVUF9TVEVSRU9fRE1JQywKKwlBTEMyNjlfRklYVVBfUVVBTlRBX01VVEUsCisJQUxDMjY5X0ZJWFVQX0xJRkVCT09LLAorCUFMQzI2OV9GSVhVUF9BTUlDLAorCUFMQzI2OV9GSVhVUF9ETUlDLAorCUFMQzI2OVZCX0ZJWFVQX0FNSUMsCisJQUxDMjY5VkJfRklYVVBfRE1JQywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzI2OV9maXh1cHNbXSA9IHsKQEAgLTQ1OTIsNiArNDg3OCw2MCBAQAogCQkudHlwZSA9IEFMQ19GSVhVUF9GVU5DLAogCQkudi5mdW5jID0gYWxjMjY5X2ZpeHVwX3N0ZXJlb19kbWljLAogCX0sCisJW0FMQzI2OV9GSVhVUF9RVUFOVEFfTVVURV0gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBhbGMyNjlfZml4dXBfcXVhbnRhX211dGUsCisJfSwKKwlbQUxDMjY5X0ZJWFVQX0xJRkVCT09LXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MWEsIDB4MjEwMTEwM2YgfSwgLyogZG9jayBsaW5lLW91dCAqLworCQkJeyAweDFiLCAweDIzYTExMDQwIH0sIC8qIGRvY2sgbWljLWluICovCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEMyNjlfRklYVVBfUVVBTlRBX01VVEUKKwl9LAorCVtBTEMyNjlfRklYVVBfQU1JQ10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxNSwgMHgwMTIxNDAxZiB9LCAvKiBIUCBvdXQgKi8KKwkJCXsgMHgxOCwgMHgwMWExOWMyMCB9LCAvKiBtaWMgKi8KKwkJCXsgMHgxOSwgMHg5OWEzMDkyZiB9LCAvKiBpbnQtbWljICovCisJCQl7IH0KKwkJfSwKKwl9LAorCVtBTEMyNjlfRklYVVBfRE1JQ10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDEyLCAweDk5YTMwOTJmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgxNCwgMHg5OTEzMDExMCB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTUsIDB4MDEyMTQwMWYgfSwgLyogSFAgb3V0ICovCisJCQl7IDB4MTgsIDB4MDFhMTljMjAgfSwgLyogbWljICovCisJCQl7IH0KKwkJfSwKKwl9LAorCVtBTEMyNjlWQl9GSVhVUF9BTUlDXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTQsIDB4OTkxMzAxMTAgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE4LCAweDAxYTE5YzIwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTJmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxNDAxZiB9LCAvKiBIUCBvdXQgKi8KKwkJCXsgfQorCQl9LAorCX0sCisJW0FMQzI2OV9GSVhVUF9ETUlDXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTIsIDB4OTlhMzA5MmYgfSwgLyogaW50LW1pYyAqLworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxOCwgMHgwMWExOWMyMCB9LCAvKiBtaWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxNDAxZiB9LCAvKiBIUCBvdXQgKi8KKwkJCXsgfQorCQl9LAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjY5X2ZpeHVwX3RibFtdID0gewpAQCAtNDYwNywxMyArNDk0Nyw3MSBAQAogCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTA0ZCwgIlNvbnkgVkFJTyIsIEFMQzI2OV9GSVhVUF9TT05ZX1ZBSU8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA0NzAsICJEZWxsIE0xMDF6IiwgQUxDMjY5X0ZJWFVQX0RFTExfTTEwMVopLAogCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTAyNSwgIkFjZXIgQXNwaXJlIiwgQUxDMjcxX0ZJWFVQX0RNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDE0NzUsICJMaWZlYm9vayIsIEFMQzI2OV9GSVhVUF9MSUZFQk9PSyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjBmMiwgIlRoaW5rcGFkIFNMNDEwLzUxMCIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMTVlLCAiVGhpbmtwYWQgTDUxMiIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWI4LCAiVGhpbmtwYWQgRWRnZSAxNCIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWNhLCAiVGhpbmtwYWQgTDQxMiIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWU5LCAiVGhpbmtwYWQgRWRnZSAxNSIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYmY4LCAiUXVhbnRhIEZMMSIsIEFMQzI2OV9GSVhVUF9RVUFOVEFfTVVURSksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JmOCwgIkxlbm92byBJZGVhcGQiLCBBTEMyNjlfRklYVVBfUENNXzQ0SyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4OWU1NCwgIkxFTk9WTyBOQiIsIEFMQzI2OV9GSVhVUF9MRU5PVk9fRUFQRCksCisKKyNpZiAxCisJLyogQmVsb3cgaXMgYSBxdWlyayB0YWJsZSB0YWtlbiBmcm9tIHRoZSBvbGQgY29kZS4KKwkgKiBCYXNpY2FsbHkgdGhlIGRldmljZSBzaG91bGQgd29yayBhcyBpcyB3aXRob3V0IHRoZSBmaXh1cCB0YWJsZS4KKwkgKiBJZiBCSU9TIGRvZXNuJ3QgZ2l2ZSBhIHByb3BlciBpbmZvLCBlbmFibGUgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiBmaXh1cCBlbnRyeS4KKwkgKi8gCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODMzMCwgIkFTVVMgRWVlcGMgUDcwMyBQOTAwQSIsCisJCSAgICAgIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDEzLCAiQVNVUyBONjFEYSIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTEzLCAiQVNVUyBONjNKbiIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTQzLCAiQVNVUyBCNTNmIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExMzMsICJBU1VTIFVKMjBmdCIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTgzLCAiQVNVUyBLNzJEUiIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWIzLCAiQVNVUyBLNTJEUiIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWUzLCAiQVNVUyBVMzNKYyIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjczLCAiQVNVUyBVTDgwSnQiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTI4MywgIkFTVVMgVTUzSmMiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJiMywgIkFTVVMgTjgySlYiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJkMywgIkFTVVMgTjYxSnYiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTNhMywgIkFTVVMgVUwzMFZ0IiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzNzMsICJBU1VTIEc3M0pYIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzODMsICJBU1VTIFVKMzBKYyIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2QzLCAiQVNVUyBONjFKQSIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDEzLCAiQVNVUyBVTDUwIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0NDMsICJBU1VTIFVMMzAiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ1MywgIkFTVVMgTTYwSnYiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ4MywgIkFTVVMgVUw4MCIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGYzLCAiQVNVUyBGODNWZiIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGUzLCAiQVNVUyBVTDIwIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1MTMsICJBU1VTIFVYMzAiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTU5MywgIkFTVVMgTjUxVm4iLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVhMywgIkFTVVMgTjYwSnYiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTViMywgIkFTVVMgTjYwRHAiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVjMywgIkFTVVMgTjcwRGUiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVlMywgIkFTVVMgRjgzVCIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjQzLCAiQVNVUyBNNjBKIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2NTMsICJBU1VTIFU1MCIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjkzLCAiQVNVUyBGNTBOIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2YTMsICJBU1VTIEY1USIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNzIzLCAiQVNVUyBQODAiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc0MywgIkFTVVMgVTgwIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NzMsICJBU1VTIFUyMEEiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg4MywgIkFTVVMgRjgxU2UiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MTc3OCwgIlF1YW50YSBPTjEiLCBBTEMyNjlfRklYVVBfRE1JQyksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JlOSwgIlF1YW50YSBXaXN0cm9uIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZjgsICJRdWFudGEgRkwxIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OWEsICJRdWFudGEgRUwzIiwgQUxDMjY5X0ZJWFVQX0RNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OWIsICJRdWFudGEgSlIxIiwgQUxDMjY5X0ZJWFVQX0RNSUMpLAorI2VuZGlmCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX21vZGVsX2ZpeHVwIGFsYzI2OV9maXh1cF9tb2RlbHNbXSA9IHsKKwl7LmlkID0gQUxDMjY5X0ZJWFVQX0FNSUMsIC5uYW1lID0gImxhcHRvcC1hbWljIn0sCisJey5pZCA9IEFMQzI2OV9GSVhVUF9ETUlDLCAubmFtZSA9ICJsYXB0b3AtZG1pYyJ9LAogCXt9CiB9OwogCkBAIC00NjIyLDIzICs1MDIwLDIzIEBACiB7CiAJaW50IHZhbDsKIAotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA8IDB4MDE1KSB7CisJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmIDB4MDBmZikgPCAweDAxNSkgewogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4ZiwgMHg5NjBiKTsKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGUsIDB4ODgxNyk7CiAJfQogCi0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZmYpID09IDB4MDE2KSB7CisJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmIDB4MDBmZikgPT0gMHgwMTYpIHsKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGYsIDB4OTYwYik7CiAJCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHhlLCAweDg4MTQpOwogCX0KIAotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxNykgeworCWlmICgoYWxjX2dldF9jb2VmMChjb2RlYykgJiAweDAwZmYpID09IDB4MDE3KSB7CiAJCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDA0KTsKIAkJLyogUG93ZXIgdXAgb3V0cHV0IHBpbiAqLwogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDQsIHZhbCB8ICgxPDwxMSkpOwogCX0KIAotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxOCkgeworCWlmICgoYWxjX2dldF9jb2VmMChjb2RlYykgJiAweDAwZmYpID09IDB4MDE4KSB7CiAJCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweGQpOwogCQlpZiAoKHZhbCAmIDB4MGMwMCkgPj4gMTAgIT0gMHgxKSB7CiAJCQkvKiBDYXBsZXNzIHJhbXAgdXAgY2xvY2sgY29udHJvbCAqLwpAQCAtNDY2MiwxNSArNTA2MCwxMCBAQAogCiAvKgogICovCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCi0jaW5jbHVkZSAiYWxjMjY5X3F1aXJrcy5jIgotI2VuZGlmCi0KIHN0YXRpYyBpbnQgcGF0Y2hfYWxjMjY5KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgYm9hcmRfY29uZmlnLCBjb2VmOwotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAKIAlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3BlYyA9PSBOVUxMKQpAQCAtNDY4Miw3MiArNTA3NSw0MSBAQAogCiAJYWxjX2F1dG9fcGFyc2VfY3VzdG9taXplX2RlZmluZShjb2RlYyk7CiAKKwllcnIgPSBhbGNfY29kZWNfcmVuYW1lX2Zyb21fcHJlc2V0KGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwogCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzAyNjkpIHsKIAkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI2OVZBOwotCQljb2VmID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApOwotCQlpZiAoKGNvZWYgJiAweDAwZjApID09IDB4MDAxMCkgeworCQlzd2l0Y2ggKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGYwKSB7CisJCWNhc2UgMHgwMDEwOgogCQkJaWYgKGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwMjUgJiYKLQkJCSAgICBzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUgPT0gMSkgewotCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNzFYIik7Ci0JCQl9IGVsc2UgaWYgKChjb2VmICYgMHhmMDAwKSA9PSAweDIwMDApIHsKLQkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjU5Iik7Ci0JCQl9IGVsc2UgaWYgKChjb2VmICYgMHhmMDAwKSA9PSAweDMwMDApIHsKLQkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjU4Iik7Ci0JCQl9IGVsc2UgaWYgKChjb2VmICYgMHhmZmYwKSA9PSAweDMwMTApIHsKLQkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjc3Iik7Ci0JCQl9IGVsc2UgewotCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNjlWQiIpOwotCQkJfQorCQkJICAgIHNwZWMtPmNkZWZpbmUucGxhdGZvcm1fdHlwZSA9PSAxKQorCQkJCWVyciA9IGFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNzFYIik7CiAJCQlzcGVjLT5jb2RlY192YXJpYW50ID0gQUxDMjY5X1RZUEVfQUxDMjY5VkI7Ci0JCX0gZWxzZSBpZiAoKGNvZWYgJiAweDAwZjApID09IDB4MDAyMCkgewotCQkJaWYgKGNvZWYgPT0gMHhhMDIzKQotCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNTkiKTsKLQkJCWVsc2UgaWYgKGNvZWYgPT0gMHg2MDIzKQotCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyODFYIik7Ci0JCQllbHNlIGlmIChjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxN2FhICYmCi0JCQkJIGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSAweDIxZjMpCi0JCQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzMyMDIiKTsKLQkJCWVsc2UKLQkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjY5VkMiKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAyMDoKKwkJCWlmIChjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxN2FhICYmCisJCQkgICAgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MjFmMykKKwkJCQllcnIgPSBhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMzIwMiIpOwogCQkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI2OVZDOwotCQl9IGVsc2UKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJYWxjX2ZpeF9wbGxfaW5pdChjb2RlYywgMHgyMCwgMHgwNCwgMTUpOworCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKIAkJYWxjMjY5X2ZpbGxfY29lZihjb2RlYyk7CiAJfQogCi0JYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDMjY5X01PREVMX0xBU1QsCi0JCQkJCWFsYzI2OV9tb2RlbHMsIGFsYzI2OV9jZmdfdGJsKTsKKwlhbGNfcGlja19maXh1cChjb2RlYywgYWxjMjY5X2ZpeHVwX21vZGVscywKKwkJICAgICAgIGFsYzI2OV9maXh1cF90YmwsIGFsYzI2OV9maXh1cHMpOworCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwogCi0JaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAotCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7Ci0JCWJvYXJkX2NvbmZpZyA9IEFMQ19NT0RFTF9BVVRPOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKLQkJYWxjX3BpY2tfZml4dXAoY29kZWMsIE5VTEwsIGFsYzI2OV9maXh1cF90YmwsIGFsYzI2OV9maXh1cHMpOwotCQlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJFX1BST0JFKTsKLQl9Ci0KLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7Ci0JCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCQllcnIgPSBhbGMyNjlfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwotCQllbHNlIGlmICghZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKLQkJCWJvYXJkX2NvbmZpZyA9IEFMQzI2OV9CQVNJQzsKLQkJfQotI2VuZGlmCi0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTENfTU9ERUxfQVVUTykKLQkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjMjY5X3ByZXNldHNbYm9hcmRfY29uZmlnXSk7CisJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCisJZXJyID0gYWxjMjY5X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcykgewogCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKQEAgLTQ3NjAsMTAgKzUxMjIsOCBAQAogCiAJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgaGFzX2NkZWZpbmVfYmVlcChjb2RlYykpIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKIAkJc2V0X2JlZXBfYW1wKHNwZWMsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCk7CiAJfQogCkBAIC00Nzc1LDggKzUxMzUsNyBAQAogI2lmZGVmIENPTkZJR19QTQogCWNvZGVjLT5wYXRjaF9vcHMucmVzdW1lID0gYWxjMjY5X3Jlc3VtZTsKICNlbmRpZgotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pCi0JCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOworCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOwogCXNwZWMtPnNodXR1cCA9IGFsYzI2OV9zaHV0dXA7CiAKIAlhbGNfaW5pdF9qYWNrcyhjb2RlYyk7CkBAIC00Nzg4LDYgKzUxNDcsMTAgQEAKICNlbmRpZgogCiAJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlhbGNfZnJlZShjb2RlYyk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTQ4MzUsMTQgKzUxOTgsOSBAQAogCiAvKgogICovCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCi0jaW5jbHVkZSAiYWxjODYxX3F1aXJrcy5jIgotI2VuZGlmCi0KIHN0YXRpYyBpbnQgcGF0Y2hfYWxjODYxKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgYm9hcmRfY29uZmlnOwogCWludCBlcnI7CiAKIAlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKQEAgLTQ4NTMsMzkgKzUyMTEsMTMgQEAKIAogCXNwZWMtPm1peGVyX25pZCA9IDB4MTU7CiAKLSAgICAgICAgYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODYxX01PREVMX0xBU1QsCi0JCQkJCWFsYzg2MV9tb2RlbHMsIGFsYzg2MV9jZmdfdGJsKTsKKwlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjODYxX2ZpeHVwX3RibCwgYWxjODYxX2ZpeHVwcyk7CisJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7CiAKLQlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDX01PREVMX0FVVE87Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewotCQlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjODYxX2ZpeHVwX3RibCwgYWxjODYxX2ZpeHVwcyk7Ci0JCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKLQkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCi0JCWVyciA9IGFsYzg2MV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0jaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCi0JCWVsc2UgaWYgKCFlcnIpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOwotCQkgICBib2FyZF9jb25maWcgPSBBTEM4NjFfM1NUX0RJRzsKLQkJfQotI2VuZGlmCi0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTENfTU9ERUxfQVVUTykKLQkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjODYxX3ByZXNldHNbYm9hcmRfY29uZmlnXSk7CisJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCisJZXJyID0gYWxjODYxX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcykgewogCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKQEAgLTQ4OTgsMTAgKzUyMzAsOCBAQAogCiAJaWYgKCFzcGVjLT5ub19hbmFsb2cpIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MjMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CiAJCXNldF9iZWVwX2FtcChzcGVjLCAweDIzLCAwLCBIREFfT1VUUFVUKTsKIAl9CiAKQEAgLTQ5MTAsMTggKzUyNDAsMTggQEAKIAlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJPQkUpOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7Ci0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewotCQlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKKwlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0JCXNwZWMtPnBvd2VyX2hvb2sgPSBhbGNfcG93ZXJfZWFwZDsKLSNlbmRpZgotCX0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCisJc3BlYy0+cG93ZXJfaG9vayA9IGFsY19wb3dlcl9lYXBkOwogCWlmICghc3BlYy0+bG9vcGJhY2suYW1wbGlzdCkKIAkJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IGFsYzg2MV9sb29wYmFja3M7CiAjZW5kaWYKIAogCXJldHVybiAwOworCisgZXJyb3I6CisJYWxjX2ZyZWUoY29kZWMpOworCXJldHVybiBlcnI7CiB9CiAKIC8qCkBAIC00OTQzLDI0ICs1MjczLDQxIEBACiB9CiAKIGVudW0gewotCUFMQzY2MFZEX0ZJWF9BU1VTX0dQSU8xCisJQUxDNjYwVkRfRklYX0FTVVNfR1BJTzEsCisJQUxDODYxVkRfRklYX0RBTExBUywKIH07CiAKLS8qIHJlc2V0IEdQSU8xICovCisvKiBleGNsdWRlIFZSRUY4MCAqLworc3RhdGljIHZvaWQgYWxjODYxdmRfZml4dXBfZGFsbGFzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgY29uc3Qgc3RydWN0IGFsY19maXh1cCAqZml4LCBpbnQgYWN0aW9uKQoreworCWlmIChhY3Rpb24gPT0gQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpIHsKKwkJc25kX2hkYV9vdmVycmlkZV9waW5fY2Fwcyhjb2RlYywgMHgxOCwgMHgwMDAwMTcxNCk7CisJCXNuZF9oZGFfb3ZlcnJpZGVfcGluX2NhcHMoY29kZWMsIDB4MTksIDB4MDAwMDE3MWMpOworCX0KK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjODYxdmRfZml4dXBzW10gPSB7CiAJW0FMQzY2MFZEX0ZJWF9BU1VTX0dQSU8xXSA9IHsKIAkJLnR5cGUgPSBBTENfRklYVVBfVkVSQlMsCiAJCS52LnZlcmJzID0gKGNvbnN0IHN0cnVjdCBoZGFfdmVyYltdKSB7CisJCQkvKiByZXNldCBHUElPMSAqLwogCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwM30sCiAJCQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDF9LAogCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMX0sCiAJCQl7IH0KIAkJfQogCX0sCisJW0FMQzg2MVZEX0ZJWF9EQUxMQVNdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9GVU5DLAorCQkudi5mdW5jID0gYWxjODYxdmRfZml4dXBfZGFsbGFzLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxdmRfZml4dXBfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzBiZiwgIkhQIFRYMTAwMCIsIEFMQzg2MVZEX0ZJWF9EQUxMQVMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzksICJBU1VTIEE3LUsiLCBBTEM2NjBWRF9GSVhfQVNVU19HUElPMSksCisJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYzMSwgIlRvc2hpYmEgTDMwLTE0OSIsIEFMQzg2MVZEX0ZJWF9EQUxMQVMpLAogCXt9CiB9OwogCkBAIC00OTcyLDE0ICs1MzE5LDEwIEBACiAKIC8qCiAgKi8KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLSNpbmNsdWRlICJhbGM4NjF2ZF9xdWlya3MuYyIKLSNlbmRpZgotCiBzdGF0aWMgaW50IHBhdGNoX2FsYzg2MXZkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgZXJyLCBib2FyZF9jb25maWc7CisJaW50IGVycjsKIAogCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmIChzcGVjID09IE5VTEwpCkBAIC00OTg5LDM5ICs1MzMyLDEzIEBACiAKIAlzcGVjLT5taXhlcl9uaWQgPSAweDBiOwogCi0JYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODYxVkRfTU9ERUxfTEFTVCwKLQkJCQkJYWxjODYxdmRfbW9kZWxzLCBhbGM4NjF2ZF9jZmdfdGJsKTsKKwlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjODYxdmRfZml4dXBfdGJsLCBhbGM4NjF2ZF9maXh1cHMpOworCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwogCi0JaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAotCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7Ci0JCWJvYXJkX2NvbmZpZyA9IEFMQ19NT0RFTF9BVVRPOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKLQkJYWxjX3BpY2tfZml4dXAoY29kZWMsIE5VTEwsIGFsYzg2MXZkX2ZpeHVwX3RibCwgYWxjODYxdmRfZml4dXBzKTsKLQkJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewotCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQkJZXJyID0gYWxjODYxdmRfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwotCQllbHNlIGlmICghZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKLQkJCWJvYXJkX2NvbmZpZyA9IEFMQzg2MVZEXzNTVDsKLQkJfQotI2VuZGlmCi0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTENfTU9ERUxfQVVUTykKLQkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjODYxdmRfcHJlc2V0c1tib2FyZF9jb25maWddKTsKKwkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KKwllcnIgPSBhbGM4NjF2ZF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CiAKIAlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwNjYwKSB7CiAJCS8qIGFsd2F5cyB0dXJuIG9uIEVBUEQgKi8KQEAgLTUwMzksMTAgKzUzNTYsOCBAQAogCiAJaWYgKCFzcGVjLT5ub19hbmFsb2cpIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MjMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CiAJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwogCX0KIApAQCAtNTA1Miw4ICs1MzY3LDcgQEAKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwogCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykKLQkJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CisJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CiAJc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOwogI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKIAlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCkBAIC01MDYxLDYgKzUzNzUsMTAgQEAKICNlbmRpZgogCiAJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlhbGNfZnJlZShjb2RlYyk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTUxMTgsNiArNTQzNiwxNCBAQAogCUFMQzY2Ml9GSVhVUF9DWkNfUDEwVCwKIAlBTEM2NjJfRklYVVBfU0tVX0lHTk9SRSwKIAlBTEM2NjJfRklYVVBfSFBfUlA1ODAwLAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREUxLAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREUyLAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREUzLAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU0LAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU1LAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU2LAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU3LAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU4LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjNjYyX2ZpeHVwc1tdID0gewpAQCAtNTE1OSwzNyArNTQ4NSwyMDQgQEAKIAkJLmNoYWluZWQgPSB0cnVlLAogCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfU0tVX0lHTk9SRQogCX0sCisJW0FMQzY2Ml9GSVhVUF9BU1VTX01PREUxXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTQsIDB4OTkxMzAxMTAgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE4LCAweDAxYTE5YzIwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTJmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxNDAxZiB9LCAvKiBIUCBvdXQgKi8KKwkJCXsgfQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9TS1VfSUdOT1JFCisJfSwKKwlbQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTJdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNCwgMHg5OTEzMDExMCB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTgsIDB4MDFhMTk4MjAgfSwgLyogbWljICovCisJCQl7IDB4MTksIDB4OTlhMzA5MmYgfSwgLyogaW50LW1pYyAqLworCQkJeyAweDFiLCAweDAxMjE0MDFmIH0sIC8qIEhQIG91dCAqLworCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDNjYyX0ZJWFVQX1NLVV9JR05PUkUKKwl9LAorCVtBTEM2NjJfRklYVVBfQVNVU19NT0RFM10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxNSwgMHgwMTIxNDQxZiB9LCAvKiBIUCAqLworCQkJeyAweDE4LCAweDAxYTE5ODQwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTRmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxMTQyMCB9LCAvKiBIUDIgKi8KKwkJCXsgfQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9TS1VfSUdOT1JFCisJfSwKKwlbQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTRdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNCwgMHg5OTEzMDExMCB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTYsIDB4OTkxMzAxMTEgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE4LCAweDAxYTE5ODQwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTRmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxNDQxZiB9LCAvKiBIUCAqLworCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDNjYyX0ZJWFVQX1NLVV9JR05PUkUKKwl9LAorCVtBTEM2NjJfRklYVVBfQVNVU19NT0RFNV0gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxNSwgMHgwMTIxNDQxZiB9LCAvKiBIUCAqLworCQkJeyAweDE2LCAweDk5MTMwMTExIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxOCwgMHgwMWExOTg0MCB9LCAvKiBtaWMgKi8KKwkJCXsgMHgxOSwgMHg5OWEzMDk0ZiB9LCAvKiBpbnQtbWljICovCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfU0tVX0lHTk9SRQorCX0sCisJW0FMQzY2Ml9GSVhVUF9BU1VTX01PREU2XSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTQsIDB4OTkxMzAxMTAgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE1LCAweDAxMjExNDIwIH0sIC8qIEhQMiAqLworCQkJeyAweDE4LCAweDAxYTE5ODQwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTRmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgxYiwgMHgwMTIxNDQxZiB9LCAvKiBIUCAqLworCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDNjYyX0ZJWFVQX1NLVV9JR05PUkUKKwl9LAorCVtBTEM2NjJfRklYVVBfQVNVU19NT0RFN10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxNywgMHg5OTEzMDExMSB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTgsIDB4MDFhMTk4NDAgfSwgLyogbWljICovCisJCQl7IDB4MTksIDB4OTlhMzA5NGYgfSwgLyogaW50LW1pYyAqLworCQkJeyAweDFiLCAweDAxMjE0MDIwIH0sIC8qIEhQICovCisJCQl7IDB4MjEsIDB4MDEyMTQwMWYgfSwgLyogSFAgKi8KKwkJCXsgfQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9TS1VfSUdOT1JFCisJfSwKKwlbQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERThdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNCwgMHg5OTEzMDExMCB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTIsIDB4OTlhMzA5NzAgfSwgLyogaW50LW1pYyAqLworCQkJeyAweDE1LCAweDAxMjE0MDIwIH0sIC8qIEhQICovCisJCQl7IDB4MTcsIDB4OTkxMzAxMTEgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE4LCAweDAxYTE5ODQwIH0sIC8qIG1pYyAqLworCQkJeyAweDIxLCAweDAxMjE0MDFmIH0sIC8qIEhQICovCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfU0tVX0lHTk9SRQorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjNjYyX2ZpeHVwX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDkwODcsICJFQ1MiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDMwOCwgIkFjZXIgQXNwaXJlIDg5NDJHIiwgQUxDNjYyX0ZJWFVQX0FTUElSRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDMxYywgIkdhdGV3YXkgTlY3OSIsIEFMQzY2Ml9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMzhiLCAiQWNlciBBc3BpcmUgODk0M0ciLCBBTEM2NjJfRklYVVBfQVNQSVJFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgxNjMyLCAiSFAgUlA1ODAwIiwgQUxDNjYyX0ZJWFVQX0hQX1JQNTgwMCksCisJU05EX1BDSV9RVUlSSygweDEwNWIsIDB4MGNkNiwgIkZveGNvbm4iLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCiAJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4YzA1MSwgIlNhbXN1bmcgUjcyMCIsIEFMQzY2Ml9GSVhVUF9JREVBUEFEKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzOGFmLCAiTGVub3ZvIElkZWFwYWQgWTU1MFAiLCBBTEM2NjJfRklYVVBfSURFQVBBRCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2EwZCwgIkxlbm92byBJZGVhcGFkIFk1NTAiLCBBTEM2NjJfRklYVVBfSURFQVBBRCksCiAJU05EX1BDSV9RVUlSSygweDFiMzUsIDB4MjIwNiwgIkNaQyBQMTBUIiwgQUxDNjYyX0ZJWFVQX0NaQ19QMTBUKSwKKworI2lmIDAKKwkvKiBCZWxvdyBpcyBhIHF1aXJrIHRhYmxlIHRha2VuIGZyb20gdGhlIG9sZCBjb2RlLgorCSAqIEJhc2ljYWxseSB0aGUgZGV2aWNlIHNob3VsZCB3b3JrIGFzIGlzIHdpdGhvdXQgdGhlIGZpeHVwIHRhYmxlLgorCSAqIElmIEJJT1MgZG9lc24ndCBnaXZlIGEgcHJvcGVyIGluZm8sIGVuYWJsZSB0aGUgY29ycmVzcG9uZGluZworCSAqIGZpeHVwIGVudHJ5LgorCSAqLyAKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDAwLCAiQVNVUyBONTBWbSIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDkyLCAiQVNVUyBOQiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTczLCAiQVNVUyBLNzNKbiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWMzLCAiQVNVUyBNNzBWIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExZDMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExZjMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMDMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMDMsICJBU1VTIEc2MEoiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzMywgIkFTVVMgRzYwSngiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTNlMywgIkFTVVMgTjcxSkEiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFNyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ2MywgIkFTVVMgTjcxIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0ZDMsICJBU1VTIEc3MiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREU4KSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNTYzLCAiQVNVUyBOOTAiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVkMywgIkFTVVMgTjUwU0YgRjUwU0YiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTZjMywgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTZmMywgIkFTVVMgSzQwQyBLNTBDIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3MzMsICJBU1VTIE44MURlIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NTMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NjMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NjUsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3ODMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3OTMsICJBU1VTIEY1MEdYIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3YjMsICJBU1VTIEY3MFNMIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3ZjMsICJBU1VTIFg1OExFIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4MTMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4MjMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4MzMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NDMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NTMsICJBU1VTIEY1MFoiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg2NCwgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg3NiwgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg5MywgIkFTVVMgTTUwVm0iLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg5NCwgIkFTVVMgWDU1IiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4YjMsICJBU1VTIE44MFZjIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4YzMsICJBU1VTIFZYNSIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOGQzLCAiQVNVUyBOODFUZSIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOGYzLCAiQVNVUyBONTA1VHAiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTkwMywgIkFTVVMgRjVHTCIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTEzLCAiQVNVUyBOQiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTMzLCAiQVNVUyBGODBRIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5NDMsICJBU1VTIFZ4M1YiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk1MywgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk2MywgIkFTVVMgWDcxQyIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTgzLCAiQVNVUyBONTA1MUEiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk5MywgIkFTVVMgTjIwIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5YjMsICJBU1VTIEY3WiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWMzLCAiQVNVUyBGNVovRjZ4IiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5ZTMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5ZjMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTQpLAorI2VuZGlmCiAJe30KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX21vZGVsX2ZpeHVwIGFsYzY2Ml9maXh1cF9tb2RlbHNbXSA9IHsKIAl7LmlkID0gQUxDMjcyX0ZJWFVQX01BUklPLCAubmFtZSA9ICJtYXJpbyJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSwgLm5hbWUgPSAiYXN1cy1tb2RlMSJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiwgLm5hbWUgPSAiYXN1cy1tb2RlMiJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFMywgLm5hbWUgPSAiYXN1cy1tb2RlMyJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFNCwgLm5hbWUgPSAiYXN1cy1tb2RlNCJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFNSwgLm5hbWUgPSAiYXN1cy1tb2RlNSJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFNiwgLm5hbWUgPSAiYXN1cy1tb2RlNiJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFNywgLm5hbWUgPSAiYXN1cy1tb2RlNyJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFOCwgLm5hbWUgPSAiYXN1cy1tb2RlOCJ9LAogCXt9CiB9OwogCiAKIC8qCiAgKi8KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLSNpbmNsdWRlICJhbGM2NjJfcXVpcmtzLmMiCi0jZW5kaWYKLQogc3RhdGljIGludCBwYXRjaF9hbGM2NjIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjOwotCWludCBlcnIsIGJvYXJkX2NvbmZpZzsKLQlpbnQgY29lZjsKKwlpbnQgZXJyID0gMDsKIAogCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmICghc3BlYykKQEAgLTUxOTksNTAgKzU2OTIsMzEgQEAKIAogCXNwZWMtPm1peGVyX25pZCA9IDB4MGI7CiAKKwkvKiBoYW5kbGUgbXVsdGlwbGUgSFBzIGFzIGlzICovCisJc3BlYy0+cGFyc2VfZmxhZ3MgPSBIREFfUElOQ0ZHX05PX0hQX0ZJWFVQOworCiAJYWxjX2F1dG9fcGFyc2VfY3VzdG9taXplX2RlZmluZShjb2RlYyk7CiAKIAlhbGNfZml4X3BsbF9pbml0KGNvZGVjLCAweDIwLCAweDA0LCAxNSk7CiAKLQljb2VmID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApOwotCWlmIChjb2VmID09IDB4ODAyMCB8fCBjb2VmID09IDB4ODAxMSkKLQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzY2MSIpOwotCWVsc2UgaWYgKGNvZWYgJiAoMSA8PCAxNCkgJiYKLQkJY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSAmJgotCQlzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUgPT0gMSkKLQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI3MlgiKTsKLQllbHNlIGlmIChjb2VmID09IDB4NDAxMSkKLQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzY1NiIpOworCWVyciA9IGFsY19jb2RlY19yZW5hbWVfZnJvbV9wcmVzZXQoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOwogCi0JYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDNjYyX01PREVMX0xBU1QsCi0JCQkJCWFsYzY2Ml9tb2RlbHMsIGFsYzY2Ml9jZmdfdGJsKTsKLQlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDX01PREVMX0FVVE87CisJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmICgxIDw8IDE0KSkgJiYKKwkgICAgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSAmJgorCSAgICBzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUgPT0gMSkgeworCQlpZiAoYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI3MlgiKSA8IDApCisJCQlnb3RvIGVycm9yOwogCX0KIAotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKLQkJYWxjX3BpY2tfZml4dXAoY29kZWMsIGFsYzY2Ml9maXh1cF9tb2RlbHMsCi0JCQkgICAgICAgYWxjNjYyX2ZpeHVwX3RibCwgYWxjNjYyX2ZpeHVwcyk7Ci0JCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwotCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQkJZXJyID0gYWxjNjYyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLQkJZWxzZSBpZiAoIWVycikgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCi0JCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7Ci0JCQlib2FyZF9jb25maWcgPSBBTEM2NjJfM1NUXzJjaF9ESUc7Ci0JCX0KLSNlbmRpZgotCX0KLQotCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzY2Ml9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCWFsY19waWNrX2ZpeHVwKGNvZGVjLCBhbGM2NjJfZml4dXBfbW9kZWxzLAorCQkgICAgICAgYWxjNjYyX2ZpeHVwX3RibCwgYWxjNjYyX2ZpeHVwcyk7CisJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7CisJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCisJZXJyID0gYWxjNjYyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcykgewogCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKQEAgLTUyNTUsMTAgKzU3MjksOCBAQAogCiAJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgaGFzX2NkZWZpbmVfYmVlcChjb2RlYykpIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKIAkJc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CiAJCWNhc2UgMHgxMGVjMDY2MjoKIAkJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwpAQCAtNTI3OCw4ICs1NzUwLDcgQEAKIAlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJPQkUpOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7Ci0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykKLQkJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CisJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CiAJc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOwogCiAJYWxjX2luaXRfamFja3MoY29kZWMpOwpAQCAtNTI5MCwzMiArNTc2MSwxMCBAQAogI2VuZGlmCiAKIAlyZXR1cm4gMDsKLX0KIAotc3RhdGljIGludCBwYXRjaF9hbGM4ODgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZjApPT0weDAwMzApewotCQlrZnJlZShjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDg4NykKLQkJCWNvZGVjLT5jaGlwX25hbWUgPSBrc3RyZHVwKCJBTEM4ODctVkQiLCBHRlBfS0VSTkVMKTsKLQkJZWxzZQotCQkJY29kZWMtPmNoaXBfbmFtZSA9IGtzdHJkdXAoIkFMQzg4OC1WRCIsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNvZGVjLT5jaGlwX25hbWUpIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXJldHVybiBwYXRjaF9hbGM2NjIoY29kZWMpOwotCX0KLQlyZXR1cm4gcGF0Y2hfYWxjODgyKGNvZGVjKTsKLX0KLQotc3RhdGljIGludCBwYXRjaF9hbGM4OTkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDIwMDApICE9IDB4MjAwMCkgewotCQlrZnJlZShjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJY29kZWMtPmNoaXBfbmFtZSA9IGtzdHJkdXAoIkFMQzg5OCIsIEdGUF9LRVJORUwpOwotCX0KLQlyZXR1cm4gcGF0Y2hfYWxjODgyKGNvZGVjKTsKKyBlcnJvcjoKKwlhbGNfZnJlZShjb2RlYyk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTUzMjksMTQgKzU3NzgsOSBAQAogCiAvKgogICovCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCi0jaW5jbHVkZSAiYWxjNjgwX3F1aXJrcy5jIgotI2VuZGlmCi0KIHN0YXRpYyBpbnQgcGF0Y2hfYWxjNjgwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgYm9hcmRfY29uZmlnOwogCWludCBlcnI7CiAKIAlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKQEAgLTUzNDcsNDMgKzU3OTEsMTEgQEAKIAogCS8qIEFMQzY4MCBoYXMgbm8gYWEtbG9vcGJhY2sgbWl4ZXIgKi8KIAotCWJvYXJkX2NvbmZpZyA9IGFsY19ib2FyZF9jb25maWcoY29kZWMsIEFMQzY4MF9NT0RFTF9MQVNULAotCQkJCQlhbGM2ODBfbW9kZWxzLCBhbGM2ODBfY2ZnX3RibCk7Ci0KLQlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDX01PREVMX0FVVE87Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewotCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQkJZXJyID0gYWxjNjgwX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLQkJZWxzZSBpZiAoIWVycikgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCi0JCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7Ci0JCQlib2FyZF9jb25maWcgPSBBTEM2ODBfQkFTRTsKLQkJfQotI2VuZGlmCi0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTENfTU9ERUxfQVVUTykgewotCQlzZXR1cF9wcmVzZXQoY29kZWMsICZhbGM2ODBfcHJlc2V0c1tib2FyZF9jb25maWddKTsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLQkJc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJmFsYzY4MF9wY21fYW5hbG9nX2F1dG9fY2FwdHVyZTsKLSNlbmRpZgotCX0KLQotCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcykgewotCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKLQkJYWxjX3JlYnVpbGRfaW11eF9mb3JfYXV0b19taWMoY29kZWMpOwotCQlhbGNfcmVtb3ZlX2ludmFsaWRfYWRjX25pZHMoY29kZWMpOworCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCWVyciA9IGFsYzY4MF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApIHsKKwkJYWxjX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5jYXBfbWl4ZXIpCkBAIC01MzkyLDggKzU4MDQsNyBAQAogCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwMjsKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pCi0JCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOworCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NDIxLDYgKzU4MzIsOCBAQAogCSAgLnBhdGNoID0gcGF0Y2hfYWxjODgyIH0sCiAJeyAuaWQgPSAweDEwZWMwNjYyLCAucmV2ID0gMHgxMDAxMDEsIC5uYW1lID0gIkFMQzY2MiByZXYxIiwKIAkgIC5wYXRjaCA9IHBhdGNoX2FsYzY2MiB9LAorCXsgLmlkID0gMHgxMGVjMDY2MiwgLnJldiA9IDB4MTAwMzAwLCAubmFtZSA9ICJBTEM2NjIgcmV2MyIsCisJICAucGF0Y2ggPSBwYXRjaF9hbGM2NjIgfSwKIAl7IC5pZCA9IDB4MTBlYzA2NjMsIC5uYW1lID0gIkFMQzY2MyIsIC5wYXRjaCA9IHBhdGNoX2FsYzY2MiB9LAogCXsgLmlkID0gMHgxMGVjMDY2NSwgLm5hbWUgPSAiQUxDNjY1IiwgLnBhdGNoID0gcGF0Y2hfYWxjNjYyIH0sCiAJeyAuaWQgPSAweDEwZWMwNjcwLCAubmFtZSA9ICJBTEM2NzAiLCAucGF0Y2ggPSBwYXRjaF9hbGM2NjIgfSwKQEAgLTU0MzMsMTMgKzU4NDYsMTMgQEAKIAl7IC5pZCA9IDB4MTBlYzA4ODUsIC5yZXYgPSAweDEwMDEwMywgLm5hbWUgPSAiQUxDODg5QSIsCiAJICAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODUsIC5uYW1lID0gIkFMQzg4NSIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MiB9LAotCXsgLmlkID0gMHgxMGVjMDg4NywgLm5hbWUgPSAiQUxDODg3IiwgLnBhdGNoID0gcGF0Y2hfYWxjODg4IH0sCisJeyAuaWQgPSAweDEwZWMwODg3LCAubmFtZSA9ICJBTEM4ODciLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODgsIC5yZXYgPSAweDEwMDEwMSwgLm5hbWUgPSAiQUxDMTIwMCIsCiAJICAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKLQl7IC5pZCA9IDB4MTBlYzA4ODgsIC5uYW1lID0gIkFMQzg4OCIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4OCB9LAorCXsgLmlkID0gMHgxMGVjMDg4OCwgLm5hbWUgPSAiQUxDODg4IiwgLnBhdGNoID0gcGF0Y2hfYWxjODgyIH0sCiAJeyAuaWQgPSAweDEwZWMwODg5LCAubmFtZSA9ICJBTEM4ODkiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7IC5pZCA9IDB4MTBlYzA4OTIsIC5uYW1lID0gIkFMQzg5MiIsIC5wYXRjaCA9IHBhdGNoX2FsYzY2MiB9LAotCXsgLmlkID0gMHgxMGVjMDg5OSwgLm5hbWUgPSAiQUxDODk5IiwgLnBhdGNoID0gcGF0Y2hfYWxjODk5IH0sCisJeyAuaWQgPSAweDEwZWMwODk5LCAubmFtZSA9ICJBTEM4OTgiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaTMwNTQuYwppbmRleCAyZjU1ZjMyLi42Njc5YTUwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgogI2luY2x1ZGUgImhkYV9sb2NhbC5oIgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDk4N2UzY2YuLmVkYzJiN2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgpAQCAtOTQsNiArOTUsNyBAQAogCVNUQUNfOTJIRDgzWFhYX1JFRiwKIAlTVEFDXzkySEQ4M1hYWF9QV1JfUkVGLAogCVNUQUNfREVMTF9TMTQsCisJU1RBQ19ERUxMX1ZPU1RST18zNTAwLAogCVNUQUNfOTJIRDgzWFhYX0hQLAogCVNUQUNfOTJIRDgzWFhYX0hQX2NOQjExX0lOVFFVQUQsCiAJU1RBQ19IUF9EVjdfNDAwMCwKQEAgLTE2NTgsNiArMTY2MCwxMiBAQAogCTB4NDBmMDAwZjAsIDB4NDBmMDAwZjAsCiB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGRlbGxfdm9zdHJvXzM1MDBfcGluX2NvbmZpZ3NbMTBdID0geworCTB4MDJhMTEwMjAsIDB4MDIyMTEwMWYsIDB4NDAwMDAwZjAsIDB4OTAxNzAxMTAsCisJMHg0MDAwMDBmMSwgMHg0MDAwMDBmMiwgMHg0MDAwMDBmMywgMHg5MGE2MDE2MCwKKwkweDQwMDAwMGY0LCAweDQwMDAwMGY1LAorfTsKKwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBocF9kdjdfNDAwMF9waW5fY29uZmlnc1sxMF0gPSB7CiAJMHgwM2ExMjA1MCwgMHgwMzIxMjAxZiwgMHg0MGYwMDBmMCwgMHg5MDE3MDExMCwKIAkweDQwZjAwMGYwLCAweDQwZjAwMGYwLCAweDkwMTcwMTEwLCAweGQ1YTMwMTQwLApAQCAtMTY3NCw2ICsxNjgyLDcgQEAKIAlbU1RBQ185MkhEODNYWFhfUkVGXSA9IHJlZjkyaGQ4M3h4eF9waW5fY29uZmlncywKIAlbU1RBQ185MkhEODNYWFhfUFdSX1JFRl0gPSByZWY5MmhkODN4eHhfcGluX2NvbmZpZ3MsCiAJW1NUQUNfREVMTF9TMTRdID0gZGVsbF9zMTRfcGluX2NvbmZpZ3MsCisJW1NUQUNfREVMTF9WT1NUUk9fMzUwMF0gPSBkZWxsX3Zvc3Ryb18zNTAwX3Bpbl9jb25maWdzLAogCVtTVEFDXzkySEQ4M1hYWF9IUF9jTkIxMV9JTlRRVUFEXSA9IGhwX2NOQjExX2ludHF1YWRfcGluX2NvbmZpZ3MsCiAJW1NUQUNfSFBfRFY3XzQwMDBdID0gaHBfZHY3XzQwMDBfcGluX2NvbmZpZ3MsCiB9OwpAQCAtMTY4Myw2ICsxNjkyLDcgQEAKIAlbU1RBQ185MkhEODNYWFhfUkVGXSA9ICJyZWYiLAogCVtTVEFDXzkySEQ4M1hYWF9QV1JfUkVGXSA9ICJtaWMtcmVmIiwKIAlbU1RBQ19ERUxMX1MxNF0gPSAiZGVsbC1zMTQiLAorCVtTVEFDX0RFTExfVk9TVFJPXzM1MDBdID0gImRlbGwtdm9zdHJvLTM1MDAiLAogCVtTVEFDXzkySEQ4M1hYWF9IUF0gPSAiaHAiLAogCVtTVEFDXzkySEQ4M1hYWF9IUF9jTkIxMV9JTlRRVUFEXSA9ICJocF9jTkIxMV9pbnRxdWFkIiwKIAlbU1RBQ19IUF9EVjdfNDAwMF0gPSAiaHAtZHY3LTQwMDAiLApAQCAtMTY5Niw2ICsxNzA2LDggQEAKIAkJICAgICAgIkRGSSBMYW5QYXJ0eSIsIFNUQUNfOTJIRDgzWFhYX1JFRiksCiAJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDJiYSwKIAkJICAgICAgInVua25vd24gRGVsbCIsIFNUQUNfREVMTF9TMTQpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAweDEwMjgsCisJCSAgICAgICJEZWxsIFZvc3RybyAzNTAwIiwgU1RBQ19ERUxMX1ZPU1RST18zNTAwKSwKIAlTTkRfUENJX1FVSVJLX01BU0soUENJX1ZFTkRPUl9JRF9IUCwgMHhmZjAwLCAweDM2MDAsCiAJCQkgICJIUCIsIFNUQUNfOTJIRDgzWFhYX0hQKSwKIAlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSFAsIDB4MTY1NiwKQEAgLTI5NzIsOCArMjk4NCw5IEBACiBzdGF0aWMgaGRhX25pZF90IGdldF91bmFzc2lnbmVkX2RhYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKIHsKIAlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOwogCWludCBqLCBjb25uX2xlbjsKLQloZGFfbmlkX3QgY29ubltIREFfTUFYX0NPTk5FQ1RJT05TXTsKKwloZGFfbmlkX3QgY29ubltIREFfTUFYX0NPTk5FQ1RJT05TXSwgZmFsbGJhY2tfZGFjOwogCXVuc2lnbmVkIGludCB3Y2Fwcywgd3R5cGU7CiAKIAljb25uX2xlbiA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIGNvbm4sCkBAIC0zMDAxLDEwICszMDE0LDIxIEBACiAJCQlyZXR1cm4gY29ubltqXTsKIAkJfQogCX0KLQkvKiBpZiBhbGwgREFDcyBhcmUgYWxyZWFkeSBhc3NpZ25lZCwgY29ubmVjdCB0byB0aGUgcHJpbWFyeSBEQUMgKi8KKworCS8qIGlmIGFsbCBEQUNzIGFyZSBhbHJlYWR5IGFzc2lnbmVkLCBjb25uZWN0IHRvIHRoZSBwcmltYXJ5IERBQywKKwkgICB1bmxlc3Mgd2UncmUgYXNzaWduaW5nIGEgc2Vjb25kYXJ5IGhlYWRwaG9uZSAqLworCWZhbGxiYWNrX2RhYyA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCWlmIChzcGVjLT5tdWx0aW91dC5ocF9uaWQpIHsKKwkJZm9yIChqID0gMDsgaiA8IGNmZy0+aHBfb3V0czsgaisrKQorCQkJaWYgKGNmZy0+aHBfcGluc1tqXSA9PSBuaWQpIHsKKwkJCQlmYWxsYmFja19kYWMgPSBzcGVjLT5tdWx0aW91dC5ocF9uaWQ7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCiAJaWYgKGNvbm5fbGVuID4gMSkgewogCQlmb3IgKGogPSAwOyBqIDwgY29ubl9sZW47IGorKykgewotCQkJaWYgKGNvbm5bal0gPT0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0pIHsKKwkJCWlmIChjb25uW2pdID09IGZhbGxiYWNrX2RhYykgewogCQkJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIG5pZCwgMCwKIAkJCQkJCSAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIGopOwogCQkJCWJyZWFrOwpAQCAtMzc3OSw5ICszODAzLDEwIEBACiB9CiAKIAotc3RhdGljIGludCBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IGRpZ19vdXQsIGhkYV9uaWRfdCBkaWdfaW4pCitzdGF0aWMgaW50IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IGRpZ19vdXQgPSAwLCBkaWdfaW4gPSAwOwogCWludCBocF9zd2FwID0gMDsKIAlpbnQgaSwgZXJyOwogCkBAIC0zOTY0LDYgKzM5ODksMjIgQEAKIAlpZiAoc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID4gMikKIAkJc3BlYy0+c3Vycl9zd2l0Y2ggPSAxOwogCisJLyogZmluZCBkaWdpdGFsIG91dCBhbmQgaW4gY29udmVydGVycyAqLworCWZvciAoaSA9IGNvZGVjLT5zdGFydF9uaWQ7IGkgPCBjb2RlYy0+c3RhcnRfbmlkICsgY29kZWMtPm51bV9ub2RlczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB3aWRfY2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgaSk7CisJCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfRElHSVRBTCkgeworCQkJc3dpdGNoIChnZXRfd2NhcHNfdHlwZSh3aWRfY2FwcykpIHsKKwkJCWNhc2UgQUNfV0lEX0FVRF9PVVQ6CisJCQkJaWYgKCFkaWdfb3V0KQorCQkJCQlkaWdfb3V0ID0gaTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNfV0lEX0FVRF9JTjoKKwkJCQlpZiAoIWRpZ19pbikKKwkJCQkJZGlnX2luID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KIAlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0cykKIAkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBkaWdfb3V0OwogCWlmIChkaWdfaW4gJiYgc3BlYy0+YXV0b2NmZy5kaWdfaW5fcGluKQpAQCAtNDEzMCwyMiArNDE3MSwxNCBAQAogI2lmZGVmIENPTkZJR19TTkRfSERBX0lOUFVUX0pBQ0sKIAlpbnQgZGVmX2NvbmYgPSBzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCk7CiAJaW50IGNvbm5lY3Rpdml0eSA9IGdldF9kZWZjZmdfY29ubmVjdChkZWZfY29uZik7Ci0JY2hhciBuYW1lWzMyXTsKLQlpbnQgZXJyOwogCiAJaWYgKGNvbm5lY3Rpdml0eSAmJiBjb25uZWN0aXZpdHkgIT0gQUNfSkFDS19QT1JUX0ZJWEVEKQogCQlyZXR1cm4gMDsKIAotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzIGF0ICVzICVzIEphY2siLAotCQlzbmRfaGRhX2dldF9qYWNrX3R5cGUoZGVmX2NvbmYpLAotCQlzbmRfaGRhX2dldF9qYWNrX2Nvbm5lY3Rpdml0eShkZWZfY29uZiksCi0JCXNuZF9oZGFfZ2V0X2phY2tfbG9jYXRpb24oZGVmX2NvbmYpKTsKLQotCWVyciA9IHNuZF9oZGFfaW5wdXRfamFja19hZGQoY29kZWMsIG5pZCwgdHlwZSwgbmFtZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0jZW5kaWYgLyogQ09ORklHX1NORF9IREFfSU5QVVRfSkFDSyAqLworCXJldHVybiBzbmRfaGRhX2lucHV0X2phY2tfYWRkKGNvZGVjLCBuaWQsIHR5cGUsIE5VTEwpOworI2Vsc2UKIAlyZXR1cm4gMDsKKyNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9JTlBVVF9KQUNLICovCiB9CiAKIHN0YXRpYyBpbnQgc3RhY19hZGRfZXZlbnQoc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBuaWQsCkBAIC01Mjc1LDcgKzUzMDgsNyBAQAogCXNwZWMtPmNhcHZvbHMgPSBzdGFjOTI1eF9jYXB2b2xzOwogCXNwZWMtPmNhcHN3cyA9IHN0YWM5MjV4X2NhcHN3czsKIAotCWVyciA9IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCAweDgsIDB4Nyk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmICghZXJyKSB7CiAJCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6IE5vIGF1dG8tY29uZmlnIGlzICIKQEAgLTU0MTYsNyArNTQ0OSw3IEBACiAJc3BlYy0+bnVtX3B3cnMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkNzN4eF9wd3Jfbmlkcyk7CiAJc3BlYy0+cHdyX25pZHMgPSBzdGFjOTJoZDczeHhfcHdyX25pZHM7CiAKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgyNSwgMHgyNyk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCiAJaWYgKCFlcnIpIHsKIAkJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApIHsKQEAgLTU1ODUsOSArNTYxOCw3IEBACiBzdGF0aWMgaW50IHBhdGNoX3N0YWM5MmhkODN4eHgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWM7Ci0JaGRhX25pZF90IGNvbm5bU1RBQzkySEQ4M19EQUNfQ09VTlQgKyAxXTsKIAlpbnQgZXJyOwotCWludCBudW1fZGFjczsKIAogCXNwZWMgID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3BlYyA9PSBOVUxMKQpAQCAtNTYyNywyNiArNTY1OCw4IEBACiAJCXN0YWM5Mnh4X3NldF9jb25maWdfcmVncyhjb2RlYywKIAkJCQlzdGFjOTJoZDgzeHh4X2JyZF90Ymxbc3BlYy0+Ym9hcmRfY29uZmlnXSk7CiAKLQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKLQljYXNlIDB4MTExZDc2ZDE6Ci0JY2FzZSAweDExMWQ3NmQ5OgotCWNhc2UgMHgxMTFkNzZkZjoKLQljYXNlIDB4MTExZDc2ZTU6Ci0JY2FzZSAweDExMWQ3NjY2OgotCWNhc2UgMHgxMTFkNzY2NzoKLQljYXNlIDB4MTExZDc2Njg6Ci0JY2FzZSAweDExMWQ3NjY5OgotCWNhc2UgMHgxMTFkNzZlMzoKLQljYXNlIDB4MTExZDc2MDQ6Ci0JY2FzZSAweDExMWQ3NmQ0OgotCWNhc2UgMHgxMTFkNzYwNToKLQljYXNlIDB4MTExZDc2ZDU6Ci0JY2FzZSAweDExMWQ3NmU3OgotCQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnID09IFNUQUNfOTJIRDgzWFhYX1BXUl9SRUYpCi0JCQlicmVhazsKKwlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnICE9IFNUQUNfOTJIRDgzWFhYX1BXUl9SRUYpCiAJCXNwZWMtPm51bV9wd3JzID0gMDsKLQkJYnJlYWs7Ci0JfQogCiAJY29kZWMtPnBhdGNoX29wcyA9IHN0YWM5Mnh4X3BhdGNoX29wczsKIApAQCAtNTY3Myw3ICs1Njg2LDcgQEAKIAl9CiAjZW5kaWYJCiAKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgxZCwgMCk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmICghZXJyKSB7CiAJCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6IE5vIGF1dG8tY29uZmlnIGlzICIKQEAgLTU2ODksMjIgKzU3MDIsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCS8qIGRvY2tpbmcgb3V0cHV0IHN1cHBvcnQgKi8KLQludW1fZGFjcyA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCAweEYsCi0JCQkJY29ubiwgU1RBQzkySEQ4M19EQUNfQ09VTlQgKyAxKSAtIDE7Ci0JLyogc2tpcCBub24tREFDIGNvbm5lY3Rpb25zICovCi0Jd2hpbGUgKG51bV9kYWNzID49IDAgJiYKLQkJCShnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIGNvbm5bbnVtX2RhY3NdKSkKLQkJCQkJIT0gQUNfV0lEX0FVRF9PVVQpKQotCQludW1fZGFjcy0tOwotCS8qIHNldCBwb3J0IEUgYW5kIEYgdG8gc2VsZWN0IHRoZSBsYXN0IERBQyAqLwotCWlmIChudW1fZGFjcyA+PSAwKSB7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDB4RSwgMCwKLQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBudW1fZGFjcyk7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDB4RiwgMCwKLQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBudW1fZGFjcyk7Ci0JfQotCiAJY29kZWMtPnByb2Nfd2lkZ2V0X2hvb2sgPSBzdGFjOTJoZF9wcm9jX2hvb2s7CiAKIAlyZXR1cm4gMDsKQEAgLTYwMTAsNyArNjAwNyw3IEBACiAKIAlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPmRhY19uaWRzOwogCi0JZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMsIDB4MjEsIDApOworCWVyciA9IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKIAlpZiAoIWVycikgewogCQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRhX2NvZGVjOiBObyBhdXRvLWNvbmZpZyBpcyAiCkBAIC02MTE5LDcgKzYxMTYsNyBAQAogCiAJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5kYWNfbmlkczsKIAkKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgwOCwgMHgwOSk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmICghZXJyKSB7CiAJCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6IE5vIGF1dG8tY29uZmlnIGlzICIKQEAgLTYyNDQsNyArNjI0MSw3IEBACiAJc3BlYy0+YWxvb3BiYWNrX3NoaWZ0ID0gMDsKIAlzcGVjLT5lYXBkX3N3aXRjaCA9IDE7CiAKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgxZSwgMHgyMCk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmICghZXJyKSB7CiAJCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6IE5vIGF1dG8tY29uZmlnIGlzICIKQEAgLTYzNjksNyArNjM2Niw3IEBACiAJCWJyZWFrOwogCX0KIAotCWVyciA9IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCAweDFmLCAweDIwKTsKKwllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CiAJaWYgKCFlcnIpIHsKIAkJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhkYV9jb2RlYzogTm8gYXV0by1jb25maWcgaXMgIgpAQCAtNjQ3NCw3ICs2NDcxLDcgQEAKIAlzcGVjLT5jYXB2b2xzID0gc3RhYzk4NzJfY2Fwdm9sczsKIAlzcGVjLT5jYXBzd3MgPSBzdGFjOTg3Ml9jYXBzd3M7CiAKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgxMCwgMHgxMik7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmIChlcnIgPCAwKSB7CiAJCXN0YWM5Mnh4X2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY1NzksNiArNjU3NiwxOCBAQAogCXsgLmlkID0gMHgxMTFkNzZlMywgLm5hbWUgPSAiOTJIRDk4QlhYIiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyaGQ4M3h4eH0sCiAJeyAuaWQgPSAweDExMWQ3NmU1LCAubmFtZSA9ICI5MkhEOTlCWFgiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTJoZDgzeHh4fSwKIAl7IC5pZCA9IDB4MTExZDc2ZTcsIC5uYW1lID0gIjkySEQ5MEJYWCIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlOCwgLm5hbWUgPSAiOTJIRDY2QjFYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlOSwgLm5hbWUgPSAiOTJIRDY2QjJYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlYSwgLm5hbWUgPSAiOTJIRDY2QjNYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlYiwgLm5hbWUgPSAiOTJIRDY2QzFYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlYywgLm5hbWUgPSAiOTJIRDY2QzJYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlZCwgLm5hbWUgPSAiOTJIRDY2QzNYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlZSwgLm5hbWUgPSAiOTJIRDY2QjFYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlZiwgLm5hbWUgPSAiOTJIRDY2QjJYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZmMCwgLm5hbWUgPSAiOTJIRDY2QjNYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZmMSwgLm5hbWUgPSAiOTJIRDY2QzFYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZmMiwgLm5hbWUgPSAiOTJIRDY2QzJYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZmMywgLm5hbWUgPSAiOTJIRDY2QzMvNjUiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTJoZDgzeHh4fSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYwppbmRleCA0ZWJmYmQ4Li40MzFjMGQ0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCkBAIC0xNTA2LDM5ICsxNTA3LDQ5IEBACiAJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJc3RydWN0IGhkYV9wY20gKmluZm8gPSBzcGVjLT5wY21fcmVjOwogCi0JY29kZWMtPm51bV9wY21zID0gMTsKKwljb2RlYy0+bnVtX3BjbXMgPSAwOwogCWNvZGVjLT5wY21faW5mbyA9IGluZm87CiAKLQlzbnByaW50ZihzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2csIHNpemVvZihzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cpLAotCQkgIiVzIEFuYWxvZyIsIGNvZGVjLT5jaGlwX25hbWUpOwotCWluZm8tPm5hbWUgPSBzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2c7CisJaWYgKHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzIHx8IHNwZWMtPm51bV9hZGNfbmlkcykgeworCQlzbnByaW50ZihzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2csCisJCQkgc2l6ZW9mKHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyksCisJCQkgIiVzIEFuYWxvZyIsIGNvZGVjLT5jaGlwX25hbWUpOworCQlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nOwogCi0JaWYgKCFzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrKQotCQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZpYV9wY21fYW5hbG9nX3BsYXliYWNrOwotCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9Ci0JCSpzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrOwotCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQotCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsKLQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uY2hhbm5lbHNfbWF4ID0KLQkJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzOworCQlpZiAoc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MpIHsKKwkJCWlmICghc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjaykKKwkJCQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0KKwkJCQkJJnZpYV9wY21fYW5hbG9nX3BsYXliYWNrOworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0KKwkJCQkqc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjazsKKwkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQorCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmNoYW5uZWxzX21heCA9CisJCQkJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzOworCQl9CiAKLQlpZiAoIXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSkgewotCQlpZiAoc3BlYy0+ZHluX2FkY19zd2l0Y2gpCi0JCQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPQotCQkJCSZ2aWFfcGNtX2R5bl9hZGNfYW5hbG9nX2NhcHR1cmU7Ci0JCWVsc2UKLQkJCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2aWFfcGNtX2FuYWxvZ19jYXB0dXJlOwotCX0KLQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9Ci0JCSpzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmU7Ci0JaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0gc3BlYy0+YWRjX25pZHNbMF07Ci0JaWYgKCFzcGVjLT5keW5fYWRjX3N3aXRjaCkKLQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtcyA9Ci0JCQlzcGVjLT5udW1fYWRjX25pZHM7Ci0KLQlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgfHwgc3BlYy0+ZGlnX2luX25pZCkgeworCQlpZiAoIXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSkgeworCQkJaWYgKHNwZWMtPmR5bl9hZGNfc3dpdGNoKQorCQkJCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9CisJCQkJCSZ2aWFfcGNtX2R5bl9hZGNfYW5hbG9nX2NhcHR1cmU7CisJCQllbHNlCisJCQkJc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0KKwkJCQkJJnZpYV9wY21fYW5hbG9nX2NhcHR1cmU7CisJCX0KKwkJaWYgKHNwZWMtPm51bV9hZGNfbmlkcykgeworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQorCQkJCSpzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmU7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPQorCQkJCXNwZWMtPmFkY19uaWRzWzBdOworCQkJaWYgKCFzcGVjLT5keW5fYWRjX3N3aXRjaCkKKwkJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW1zID0KKwkJCQkJc3BlYy0+bnVtX2FkY19uaWRzOworCQl9CiAJCWNvZGVjLT5udW1fcGNtcysrOwogCQlpbmZvKys7CisJfQorCisJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkIHx8IHNwZWMtPmRpZ19pbl9uaWQpIHsKIAkJc25wcmludGYoc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCwKIAkJCSBzaXplb2Yoc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCksCiAJCQkgIiVzIERpZ2l0YWwiLCBjb2RlYy0+Y2hpcF9uYW1lKTsKQEAgLTE1NjIsMTcgKzE1NzMsMTkgQEAKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9CiAJCQkJc3BlYy0+ZGlnX2luX25pZDsKIAkJfQorCQljb2RlYy0+bnVtX3BjbXMrKzsKKwkJaW5mbysrOwogCX0KIAogCWlmIChzcGVjLT5ocF9kYWNfbmlkKSB7Ci0JCWNvZGVjLT5udW1fcGNtcysrOwotCQlpbmZvKys7CiAJCXNucHJpbnRmKHNwZWMtPnN0cmVhbV9uYW1lX2hwLCBzaXplb2Yoc3BlYy0+c3RyZWFtX25hbWVfaHApLAogCQkJICIlcyBIUCIsIGNvZGVjLT5jaGlwX25hbWUpOwogCQlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfaHA7CiAJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IHZpYV9wY21faHBfcGxheWJhY2s7CiAJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQogCQkJc3BlYy0+aHBfZGFjX25pZDsKKwkJY29kZWMtPm51bV9wY21zKys7CisJCWluZm8rKzsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zNjg4LDEzICszNzAxLDggQEAKIHN0YXRpYyB2b2lkIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTgxMihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaW11eF9pc19zbWl4ZXIgPQotCXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxMywgMCwgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDB4MDApID09IDM7CiAJdW5zaWduZWQgaW50IHBhcm07CiAJdW5zaWduZWQgaW50IHByZXNlbnQ7Ci0JLyogTVVYMTAgKDFlaCkgPSBzdGVyZW8gbWl4ZXIgKi8KLQlpbXV4X2lzX3NtaXhlciA9Ci0Jc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDFlLCAwLCBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTCwgMHgwMCkgPT0gNTsKIAkvKiBpbnB1dHMgKi8KIAkvKiBQVyA1LzYvNyAoMjloLzJhaC8yYmgpICovCiAJcGFybSA9IEFDX1BXUlNUX0QzOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYWs0eHh4LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9hazR4eHguYwppbmRleCA5MGQ1NjBjLi4zOTgxODIzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9hazR4eHguYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9hazR4eHguYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlICJpY2UxNzEyLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKaW5kZXggMGNjYzBlYi4uNDQ0NDZmMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYwpAQCAtNTQsNyArNTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTI3NDgsOCArMjc0OCw5IEBACiAJaWYgKCFjLT5ub19tcHU0MDEpIHsKIAkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfSUNFMTcxMiwKIAkJCUlDRVJFRyhpY2UsIE1QVTFfQ1RSTCksCi0JCQkoYy0+bXB1NDAxXzFfaW5mb19mbGFncyB8IE1QVTQwMV9JTkZPX0lOVEVHUkFURUQpLAotCQkJaWNlLT5pcnEsIDAsICZpY2UtPnJtaWRpWzBdKTsKKwkJCWMtPm1wdTQwMV8xX2luZm9fZmxhZ3MgfAorCQkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQkJLTEsICZpY2UtPnJtaWRpWzBdKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCQlyZXR1cm4gZXJyOwpAQCAtMjc2NCw4ICsyNzY1LDkgQEAKIAkJCS8qICAybmQgcG9ydCB1c2VkICAqLwogCQkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAxLCBNUFU0MDFfSFdfSUNFMTcxMiwKIAkJCQlJQ0VSRUcoaWNlLCBNUFUyX0NUUkwpLAotCQkJCShjLT5tcHU0MDFfMl9pbmZvX2ZsYWdzIHwgTVBVNDAxX0lORk9fSU5URUdSQVRFRCksCi0JCQkJaWNlLT5pcnEsIDAsICZpY2UtPnJtaWRpWzFdKTsKKwkJCQljLT5tcHU0MDFfMl9pbmZvX2ZsYWdzIHwKKwkJCQlNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJLTEsICZpY2UtPnJtaWRpWzFdKTsKIAogCQkJaWYgKGVyciA8IDApIHsKIAkJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCmluZGV4IGMyYjdmOGIuLjQzNTNlNzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ludGVsOHgwLmMgYi9zb3VuZC9wY2kvaW50ZWw4eDAuYwppbmRleCA2YTViMzg3Li4xMTcxOGI0OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KQEAgLTQyLDYgKzQyLDEyIEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCisjaWZkZWYgQ09ORklHX0tWTV9HVUVTVAorI2luY2x1ZGUgPGxpbnV4L2t2bV9wYXJhLmg+CisjZWxzZQorI2RlZmluZSBrdm1fcGFyYV9hdmFpbGFibGUoKSAoMCkKKyNlbmRpZgorCiBNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCA4MjgwMUFBLDgyOTAxQUIsaTgxMCxpODIwLGk4MzAsaTg0MCxpODQ1LE1YNDQwOyBTaVMgNzAxMjsgQWxpIDU0NTUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTc3LDYgKzgzLDcgQEAKIHN0YXRpYyBpbnQgYnVnZ3lfaXJxID0gLTE7IC8qIGF1dG8tY2hlY2sgKi8KIHN0YXRpYyBpbnQgeGJveDsKIHN0YXRpYyBpbnQgc3BkaWZfYWNsaW5rID0gLTE7CitzdGF0aWMgaW50IGluc2lkZV92bSA9IC0xOwogCiBtb2R1bGVfcGFyYW0oaW5kZXgsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEludGVsIGk4eDAgc291bmRjYXJkLiIpOwpAQCAtOTQsNiArMTAxLDggQEAKIE1PRFVMRV9QQVJNX0RFU0MoeGJveCwgIlNldCB0byAxIGZvciBYYm94LCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZSBBQyc5NyBjb2RlYyBkZXRlY3Rpb24uIik7CiBtb2R1bGVfcGFyYW0oc3BkaWZfYWNsaW5rLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzcGRpZl9hY2xpbmssICJTL1BESUYgb3ZlciBBQy1saW5rLiIpOworbW9kdWxlX3BhcmFtKGluc2lkZV92bSwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluc2lkZV92bSwgIktWTS9QYXJhbGxlbHMgb3B0aW1pemF0aW9uLiIpOwogCiAvKiBqdXN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiBzdGF0aWMgaW50IGVuYWJsZTsKQEAgLTQwMCw2ICs0MDksNyBAQAogCXVuc2lnbmVkIGJ1Z2d5X2lycTogMTsJCS8qIHdvcmthcm91bmQgZm9yIGJ1Z2d5IG1vYm9zICovCiAJdW5zaWduZWQgeGJveDogMTsJCS8qIHdvcmthcm91bmQgZm9yIFhib3ggQUMnOTcgZGV0ZWN0aW9uICovCiAJdW5zaWduZWQgYnVnZ3lfc2VtYXBob3JlOiAxOwkvKiB3b3JrYXJvdW5kIGZvciBidWdneSBjb2RlYyBzZW1hcGhvcmUgKi8KKwl1bnNpZ25lZCBpbnNpZGVfdm06IDE7CQkvKiBlbmFibGUgVk0gb3B0aW1pemF0aW9uICovCiAKIAlpbnQgc3BkaWZfaWR4OwkvKiBTUERJRiBCQVIgaW5kZXg7ICpfU1BCQVIgb3IgLTEgaWYgdXNlIFBDTU9VVCAqLwogCXVuc2lnbmVkIGludCBzZG1fc2F2ZWQ7CS8qIFNETSByZWcgdmFsdWUgKi8KQEAgLTEwNjUsOCArMTA3NSwxOCBAQAogCQkJdWRlbGF5KDEwKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmIChjaXYgPT0gaWdldGJ5dGUoY2hpcCwgaWNoZGV2LT5yZWdfb2Zmc2V0ICsgSUNIX1JFR19PRkZfQ0lWKSAmJgotCQkgICAgcHRyMSA9PSBpZ2V0d29yZChjaGlwLCBpY2hkZXYtPnJlZ19vZmZzZXQgKyBpY2hkZXYtPnJvZmZfcGljYikpCisJCWlmIChjaXYgIT0gaWdldGJ5dGUoY2hpcCwgaWNoZGV2LT5yZWdfb2Zmc2V0ICsgSUNIX1JFR19PRkZfQ0lWKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElPIHJlYWQgb3BlcmF0aW9uIGlzIHZlcnkgZXhwZW5zaXZlIGluc2lkZSB2aXJ0dWFsIG1hY2hpbmUKKwkJICogYXMgaXQgaXMgZW11bGF0ZWQuIFRoZSBwcm9iYWJpbGl0eSB0aGF0IHN1YnNlcXVlbnQgUElDQiByZWFkCisJCSAqIHdpbGwgcmV0dXJuIGRpZmZlcmVudCByZXN1bHQgaXMgaGlnaCBlbm91Z2ggdG8gbG9vcCB0aWxsCisJCSAqIHRpbWVvdXQgaGVyZS4KKwkJICogU2FtZSBDSVYgaXMgc3RyaWN0IGVub3VnaCBjb25kaXRpb24gdG8gYmUgc3VyZSB0aGF0IFBJQ0IKKwkJICogaXMgdmFsaWQgaW5zaWRlIFZNIG9uIGVtdWxhdGVkIGNhcmQuICovCisJCWlmIChjaGlwLT5pbnNpZGVfdm0pCisJCQlicmVhazsKKwkJaWYgKHB0cjEgPT0gaWdldHdvcmQoY2hpcCwgaWNoZGV2LT5yZWdfb2Zmc2V0ICsgaWNoZGV2LT5yb2ZmX3BpY2IpKQogCQkJYnJlYWs7CiAJfSB3aGlsZSAodGltZW91dC0tKTsKIAlwdHIgPSBpY2hkZXYtPmxhc3RfcG9zOwpAQCAtMjkxNyw2ICsyOTM3LDQ1IEBACiAJSUNIX1BDUiwgSUNIX1NDUiwgSUNIX1NJU19UQ1IKIH07CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlbDh4MF9pbnNpZGVfdm0oc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlpbnQgcmVzdWx0ICA9IGluc2lkZV92bTsKKwljaGFyICptc2cgICA9IE5VTEw7CisKKwkvKiBjaGVjayBtb2R1bGUgcGFyYW1ldGVyIGZpcnN0IChvdmVycmlkZSBkZXRlY3Rpb24pICovCisJaWYgKHJlc3VsdCA+PSAwKSB7CisJCW1zZyA9IHJlc3VsdCA/ICJlbmFibGUgKGZvcmNlZCkgVk0iIDogImRpc2FibGUgKGZvcmNlZCkgVk0iOworCQlnb3RvIGZpbmk7CisJfQorCisJLyogZGV0ZWN0IEtWTSBhbmQgUGFyYWxsZWxzIHZpcnR1YWwgZW52aXJvbm1lbnRzICovCisJcmVzdWx0ID0ga3ZtX3BhcmFfYXZhaWxhYmxlKCk7CisjaWZkZWYgWDg2X0ZFQVRVUkVfSFlQRVJWSVNPUgorCXJlc3VsdCA9IHJlc3VsdCB8fCBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfSFlQRVJWSVNPUik7CisjZW5kaWYKKwlpZiAoIXJlc3VsdCkKKwkJZ290byBmaW5pOworCisJLyogY2hlY2sgZm9yIGtub3duIChlbXVsYXRlZCkgZGV2aWNlcyAqLworCWlmIChwY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxYWY0ICYmCisJICAgIHBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSAweDExMDApIHsKKwkJLyogS1ZNIGVtdWxhdGVkIHNvdW5kLCBQQ0kgU1NJRDogMWFmNDoxMTAwICovCisJCW1zZyA9ICJlbmFibGUgS1ZNIjsKKwl9IGVsc2UgaWYgKHBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDFhYjgpIHsKKwkJLyogUGFyYWxsZWxzIFZNIGVtdWxhdGVkIHNvdW5kLCBQQ0kgU1NJRDogMWFiODp4eHh4ICovCisJCW1zZyA9ICJlbmFibGUgUGFyYWxsZWxzIFZNIjsKKwl9IGVsc2UgeworCQltc2cgPSAiZGlzYWJsZSAodW5rbm93biBvciBWVC1kKSBWTSI7CisJCXJlc3VsdCA9IDA7CisJfQorCitmaW5pOgorCWlmIChtc2cgIT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaW50ZWw4eDA6ICVzIG9wdGltaXphdGlvblxuIiwgbXNnKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlbDh4MF9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkJCQkgc3RydWN0IHBjaV9kZXYgKnBjaSwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgZGV2aWNlX3R5cGUsCkBAIC0yOTg0LDYgKzMwNDMsOCBAQAogCWlmICh4Ym94KQogCQljaGlwLT54Ym94ID0gMTsKIAorCWNoaXAtPmluc2lkZV92bSA9IHNuZF9pbnRlbDh4MF9pbnNpZGVfdm0ocGNpKTsKKwogCWlmIChwY2ktPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMICYmCiAJICAgIHBjaS0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfNDQwTVgpCiAJCWNoaXAtPmZpeF9ub2NhY2hlID0gMTsgLyogZW5hYmxlIHdvcmthcm91bmQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYyBiL3NvdW5kL3BjaS9pbnRlbDh4MG0uYwppbmRleCA3YzE2MTY0Li4wZjcwNDFlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCmluZGV4IGZjMWQ1NzNjLi44NDE4NjRiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYworKysgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9sb2xhL2xvbGEuYyBiL3NvdW5kL3BjaS9sb2xhL2xvbGEuYwppbmRleCAzZTkyZTViLi45MjQxNjhlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhLmMKKysrIGIvc291bmQvcGNpL2xvbGEvbG9sYS5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWFlc3RybzMuYyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCmluZGV4IDAzNzgxMjYuLjg2M2M4YmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jCisrKyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCkBAIC0zOSw3ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTI4MjAsOCArMjgyMCw4IEBACiAJLyogVE9ETyBlbmFibGUgTUlESSBJUlEgYW5kIEkvTyAqLwogCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2hpcC0+Y2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKIAkJCQkgIGNoaXAtPmlvYmFzZSArIE1QVTQwMV9EQVRBX1BPUlQsCi0JCQkJICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCSAgY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpOworCQkJCSAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQkJCSAgLTEsICZjaGlwLT5ybWlkaSk7CiAJaWYgKGVyciA8IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm8zOiBubyBNSURJIHN1cHBvcnQuXG4iKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKaW5kZXggZGJlZTU5OS4uYTBiZDFkOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYwppbmRleCBiZjI2OTZhLi5iZmJkYzkxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgIm1peGFydC5oIgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMgYi9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYwppbmRleCA4M2VhN2E3Li5jNmM0NWQ5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYworKysgYi9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW4uYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmMKaW5kZXggMjE4ZDk4NS4uNWYzYTEzZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW4uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMKaW5kZXggZjUxNjRiMS4uNTIxZWFlNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9pby5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwppbmRleCA4MjMxMWZjLi45MmUyZDY3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTY3OCwxNSArNjc5LDE1IEBACiAJCWdvdG8gZXJyX2NhcmQ7CiAKIAlpZiAoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIChNSURJX09VVFBVVCB8IE1JRElfSU5QVVQpKSB7Ci0JCXVuc2lnbmVkIGludCBpbmZvX2ZsYWdzID0gTVBVNDAxX0lORk9fSU5URUdSQVRFRDsKKwkJdW5zaWduZWQgaW50IGluZm9fZmxhZ3MgPQorCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfCBNUFU0MDFfSU5GT19JUlFfSE9PSzsKIAkJaWYgKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiBNSURJX09VVFBVVCkKIAkJCWluZm9fZmxhZ3MgfD0gTVBVNDAxX0lORk9fT1VUUFVUOwogCQlpZiAoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIE1JRElfSU5QVVQpCiAJCQlpbmZvX2ZsYWdzIHw9IE1QVTQwMV9JTkZPX0lOUFVUOwogCQllcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19DTUlQQ0ksCiAJCQkJCSAgY2hpcC0+YWRkciArIE9YWUdFTl9NUFU0MDEsCi0JCQkJCSAgaW5mb19mbGFncywgMCwgMCwKLQkJCQkJICAmY2hpcC0+bWlkaSk7CisJCQkJCSAgaW5mb19mbGFncywgLTEsICZjaGlwLT5taWRpKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGVycl9jYXJkOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vdmlydHVvc28uYyBiL3NvdW5kL3BjaS9veHlnZW4vdmlydHVvc28uYwppbmRleCA3NzNkYjc5Li40MTQ5YTBjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL3ZpcnR1b3NvLmMKKysrIGIvc291bmQvcGNpL294eWdlbi92aXJ0dW9zby5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX3BjbTE3OXguYyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfcGNtMTc5eC5jCmluZGV4IDMyZDA5NmMuLjg0MzNhYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfcGNtMTc5eC5jCisrKyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfcGNtMTc5eC5jCkBAIC0xMDc0LDYgKzEwNzQsNyBAQAogCS5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfAogCQkJIFBMQVlCQUNLXzFfVE9fU1BESUYgfAogCQkJIENBUFRVUkVfMF9GUk9NX0kyU18yIHwKKwkJCSBDQVBUVVJFXzFfRlJPTV9TUERJRiB8CiAJCQkgQUM5N19GTUlDX1NXSVRDSCwKIAkuZGFjX2NoYW5uZWxzX3BjbSA9IDIsCiAJLmRhY19jaGFubmVsc19taXhlciA9IDIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCmluZGV4IDA0NjU3OGQuLjU2YTUyNjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9od2RlcC5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKaW5kZXggMTdjYjEyMy4uZWMxNTg3YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaHdkZXAuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYyBiL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYwppbmRleCBlMzRhZTE0Li5kY2JlZGQzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKKysrIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCkBAIC05OCw2ICs5OCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpAQCAtMjEwOSw3ICsyMTEwLDcgQEAKIAkJdmFsID0gbXB1X3BvcnRbZGV2XTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgUENJX0VYVF9NUFVfQmFzZSwgdmFsKTsKIAkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfUklQVElERSwKLQkJCQkJICB2YWwsIDAsIGNoaXAtPmlycSwgMCwKKwkJCQkJICB2YWwsIE1QVTQwMV9JTkZPX0lSUV9IT09LLCAtMSwKIAkJCQkJICAmY2hpcC0+cm1pZGkpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lMzIuYyBiL3NvdW5kL3BjaS9ybWUzMi5jCmluZGV4IDZiZTc3YTIuLjIxYmNiNDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWUzMi5jCisrKyBiL3NvdW5kL3BjaS9ybWUzMi5jCkBAIC03NCw3ICs3NCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2LmMgYi9zb3VuZC9wY2kvcm1lOTYuYwppbmRleCA0MDllNWI4Li40NTg1Yzk3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTYuYworKysgYi9zb3VuZC9wY2kvcm1lOTYuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwppbmRleCAxYzZkMWUxLi5mMmEzNzU4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtMTUxLDcgKzE1MSw3IEBACiAjZGVmaW5lIEhEU1BfUFJPR1JBTQkgICAgICAgIDB4MDIwCiAjZGVmaW5lIEhEU1BfQ09ORklHX01PREVfMAkweDA0MAogI2RlZmluZSBIRFNQX0NPTkZJR19NT0RFXzEJMHgwODAKLSNkZWZpbmUgSERTUF9WRVJTSU9OX0JJVAkweDEwMAorI2RlZmluZSBIRFNQX1ZFUlNJT05fQklUCSgweDEwMCB8IEhEU1BfU19MT0FEKQogI2RlZmluZSBIRFNQX0JJR0VORElBTl9NT0RFICAgICAweDIwMAogI2RlZmluZSBIRFNQX1JEX01VTFRJUExFICAgICAgICAweDQwMAogI2RlZmluZSBIRFNQXzk2NTJfRU5BQkxFX01JWEVSICAweDgwMApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKaW5kZXggNDkzZTM5NC4uZTc2MGFkYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CkBAIC01MjAsMTYgKzUyMCw5IEBACiAjZGVmaW5lIEhEU1BNX0RNQV9BUkVBX0JZVEVTIChIRFNQTV9NQVhfQ0hBTk5FTFMgKiBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUykKICNkZWZpbmUgSERTUE1fRE1BX0FSRUFfS0lMT0JZVEVTIChIRFNQTV9ETUFfQVJFQV9CWVRFUy8xMDI0KQogCi0vKiByZXZpc2lvbnMgPj0gMjMwIGluZGljYXRlIEFFUzMyIGNhcmQgKi8KLSNkZWZpbmUgSERTUE1fTUFESV9BTkNJRU5UX1JFVgkyMDQKLSNkZWZpbmUgSERTUE1fTUFESV9PTERfUkVWCTIwNwotI2RlZmluZSBIRFNQTV9NQURJX1JFVgkJMjEwCiAjZGVmaW5lIEhEU1BNX1JBWURBVF9SRVYJMjExCiAjZGVmaW5lIEhEU1BNX0FJT19SRVYJCTIxMgogI2RlZmluZSBIRFNQTV9NQURJRkFDRV9SRVYJMjEzCi0jZGVmaW5lIEhEU1BNX0FFU19SRVYJCTI0MAotI2RlZmluZSBIRFNQTV9BRVMzMl9SRVYJCTIzNAotI2RlZmluZSBIRFNQTV9BRVMzMl9PTERfUkVWCTIzMwogCiAvKiBzcGVlZCBmYWN0b3IgbW9kZXMgKi8KICNkZWZpbmUgSERTUE1fU1BFRURfU0lOR0xFIDAKQEAgLTEyNDEsMTAgKzEyMzQsMzAgQEAKIAlyZXR1cm4gcmF0ZTsKIH0KIAorLyogcmV0dXJuIGxhdGVuY3kgaW4gc2FtcGxlcyBwZXIgcGVyaW9kICovCitzdGF0aWMgaW50IGhkc3BtX2dldF9sYXRlbmN5KHN0cnVjdCBoZHNwbSAqaGRzcG0pCit7CisJaW50IG47CisKKwluID0gaGRzcG1fZGVjb2RlX2xhdGVuY3koaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJLyogU3BlY2lhbCBjYXNlIGZvciBuZXcgUk1FIGNhcmRzIHdpdGggMzIgc2FtcGxlcyBwZXJpb2Qgc2l6ZS4KKwkgKiBUaGUgdGhyZWUgbGF0ZW5jeSBiaXRzIGluIHRoZSBjb250cm9sIHJlZ2lzdGVyCisJICogKEhEU1BfTGF0ZW5jeU1hc2spIGVuY29kZSBsYXRlbmN5IHZhbHVlcyBvZiA2NCBzYW1wbGVzIGFzCisJICogMCwgMTI4IHNhbXBsZXMgYXMgMSAuLi4gNDA5NiBzYW1wbGVzIGFzIDYuIEZvciBvbGQgY2FyZHMsIDcKKwkgKiBkZW5vdGVzIDgxOTIgc2FtcGxlcywgYnV0IG9uIG5ldyBjYXJkcyBsaWtlIFJheURBVCBvciBBSU8sCisJICogaXQgY29ycmVzcG9uZHMgdG8gMzIgc2FtcGxlcy4KKwkgKi8KKwlpZiAoKDcgPT0gbikgJiYgKFJheURBVCA9PSBoZHNwbS0+aW9fdHlwZSB8fCBBSU8gPT0gaGRzcG0tPmlvX3R5cGUpKQorCQluID0gLTE7CisKKwlyZXR1cm4gMSA8PCAobiArIDYpOworfQorCiAvKiBMYXRlbmN5IGZ1bmN0aW9uICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaGRzcG1fY29tcHV0ZV9wZXJpb2Rfc2l6ZShzdHJ1Y3QgaGRzcG0gKmhkc3BtKQogewotCWhkc3BtLT5wZXJpb2RfYnl0ZXMgPSAxIDw8ICgoaGRzcG1fZGVjb2RlX2xhdGVuY3koaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpICsgOCkpOworCWhkc3BtLT5wZXJpb2RfYnl0ZXMgPSA0ICogaGRzcG1fZ2V0X2xhdGVuY3koaGRzcG0pOwogfQogCiAKQEAgLTEzMDMsMTIgKzEzMTYsMjcgQEAKIAogCXNwaW5fbG9ja19pcnEoJnMtPmxvY2spOwogCi0JZnJhbWVzID4+PSA3OwotCW4gPSAwOwotCXdoaWxlIChmcmFtZXMpIHsKLQkJbisrOwotCQlmcmFtZXMgPj49IDE7CisJaWYgKDMyID09IGZyYW1lcykgeworCQkvKiBTcGVjaWFsIGNhc2UgZm9yIG5ldyBSTUUgY2FyZHMgbGlrZSBSYXlEQVQvQUlPIHdoaWNoCisJCSAqIHN1cHBvcnQgcGVyaW9kIHNpemVzIG9mIDMyIHNhbXBsZXMuIFNpbmNlIGxhdGVuY3kgaXMKKwkJICogZW5jb2RlZCBpbiB0aGUgdGhyZWUgYml0cyBvZiBIRFNQX0xhdGVuY3lNYXNrLCB3ZSBjYW4gb25seQorCQkgKiBoYXZlIHZhbHVlcyBmcm9tIDAgLi4gNy4gV2hpbGUgMCBzdGlsbCBtZWFucyA2NCBzYW1wbGVzIGFuZAorCQkgKiA2IHJlcHJlc2VudHMgNDA5NiBzYW1wbGVzIG9uIGFsbCBjYXJkcywgNyByZXByZXNlbnRzIDgxOTIKKwkJICogb24gb2xkZXIgY2FyZHMgYW5kIDMyIHNhbXBsZXMgb24gbmV3IGNhcmRzLgorCQkgKgorCQkgKiBJbiBvdGhlciB3b3JkcywgcGVyaW9kIHNpemUgaW4gc2FtcGxlcyBpcyBjYWxjdWxhdGVkIGJ5CisJCSAqIDJeKG4rNikgd2l0aCBuIHJhbmdpbmcgZnJvbSAwIC4uIDcuCisJCSAqLworCQluID0gNzsKKwl9IGVsc2UgeworCQlmcmFtZXMgPj49IDc7CisJCW4gPSAwOworCQl3aGlsZSAoZnJhbWVzKSB7CisJCQluKys7CisJCQlmcmFtZXMgPj49IDE7CisJCX0KIAl9CisKIAlzLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQTV9MYXRlbmN5TWFzazsKIAlzLT5jb250cm9sX3JlZ2lzdGVyIHw9IGhkc3BtX2VuY29kZV9sYXRlbmN5KG4pOwogCkBAIC00ODAxLDggKzQ4MjksNyBAQAogCiAJc25kX2lwcmludGYoYnVmZmVyLCAiLS0tIFNldHRpbmdzIC0tLVxuIik7CiAKLQl4ID0gMSA8PCAoNiArIGhkc3BtX2RlY29kZV9sYXRlbmN5KGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYKLQkJCQkJCQlIRFNQTV9MYXRlbmN5TWFzaykpOworCXggPSBoZHNwbV9nZXRfbGF0ZW5jeShoZHNwbSk7CiAKIAlzbmRfaXByaW50ZihidWZmZXIsCiAJCSJTaXplIChMYXRlbmN5KTogJWQgc2FtcGxlcyAoMiBwZXJpb2RzIG9mICVsdSBieXRlcylcbiIsCkBAIC00OTY1LDggKzQ5OTIsNyBAQAogCiAJc25kX2lwcmludGYoYnVmZmVyLCAiLS0tIFNldHRpbmdzIC0tLVxuIik7CiAKLQl4ID0gMSA8PCAoNiArIGhkc3BtX2RlY29kZV9sYXRlbmN5KGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYKLQkJCQlIRFNQTV9MYXRlbmN5TWFzaykpOworCXggPSBoZHNwbV9nZXRfbGF0ZW5jeShoZHNwbSk7CiAKIAlzbmRfaXByaW50ZihidWZmZXIsCiAJCSAgICAiU2l6ZSAoTGF0ZW5jeSk6ICVkIHNhbXBsZXMgKDIgcGVyaW9kcyBvZiAlbHUgYnl0ZXMpXG4iLApAQCAtNTY3MiwxOSArNTY5OCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemVzX29sZFtdID0gewotCTY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCA0MDk2Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHBlcmlvZF9zaXplc19uZXdbXSA9IHsKLQkzMiwgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDQwOTYKLX07Ci0KLS8qIFJheURBVCBhbmQgQUlPIGFsd2F5cyBoYXZlIGEgYnVmZmVyIG9mIDE2Mzg0IHNhbXBsZXMgcGVyIGNoYW5uZWwgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF5ZGF0X2Fpb19idWZmZXJfc2l6ZXNbXSA9IHsKLQkxNjM4NAotfTsKLQogc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9oZHNwbV9wbGF5YmFja19zdWJpbmZvID0gewogCS5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAogCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CkBAIC01NzAzLDggKzU3MTYsOCBAQAogCS5jaGFubmVsc19tYXggPSBIRFNQTV9NQVhfQ0hBTk5FTFMsCiAJLmJ1ZmZlcl9ieXRlc19tYXggPQogCSAgICBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUyAqIEhEU1BNX01BWF9DSEFOTkVMUywKLQkucGVyaW9kX2J5dGVzX21pbiA9ICg2NCAqIDQpLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gKDQwOTYgKiA0KSAqIEhEU1BNX01BWF9DSEFOTkVMUywKKwkucGVyaW9kX2J5dGVzX21pbiA9ICgzMiAqIDQpLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gKDgxOTIgKiA0KSAqIEhEU1BNX01BWF9DSEFOTkVMUywKIAkucGVyaW9kc19taW4gPSAyLAogCS5wZXJpb2RzX21heCA9IDUxMiwKIAkuZmlmb19zaXplID0gMApAQCAtNTcyOCwzMSArNTc0MSwxMyBAQAogCS5jaGFubmVsc19tYXggPSBIRFNQTV9NQVhfQ0hBTk5FTFMsCiAJLmJ1ZmZlcl9ieXRlc19tYXggPQogCSAgICBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUyAqIEhEU1BNX01BWF9DSEFOTkVMUywKLQkucGVyaW9kX2J5dGVzX21pbiA9ICg2NCAqIDQpLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gKDQwOTYgKiA0KSAqIEhEU1BNX01BWF9DSEFOTkVMUywKKwkucGVyaW9kX2J5dGVzX21pbiA9ICgzMiAqIDQpLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gKDgxOTIgKiA0KSAqIEhEU1BNX01BWF9DSEFOTkVMUywKIAkucGVyaW9kc19taW4gPSAyLAogCS5wZXJpb2RzX21heCA9IDUxMiwKIAkuZmlmb19zaXplID0gMAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBod19jb25zdHJhaW50c19wZXJpb2Rfc2l6ZXNfb2xkID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUocGVyaW9kX3NpemVzX29sZCksCi0JLmxpc3QgPSBwZXJpb2Rfc2l6ZXNfb2xkLAotCS5tYXNrID0gMAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBod19jb25zdHJhaW50c19wZXJpb2Rfc2l6ZXNfbmV3ID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUocGVyaW9kX3NpemVzX25ldyksCi0JLmxpc3QgPSBwZXJpb2Rfc2l6ZXNfbmV3LAotCS5tYXNrID0gMAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBod19jb25zdHJhaW50c19yYXlkYXRfaW9fYnVmZmVyID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUocmF5ZGF0X2Fpb19idWZmZXJfc2l6ZXMpLAotCS5saXN0ID0gcmF5ZGF0X2Fpb19idWZmZXJfc2l6ZXMsCi0JLm1hc2sgPSAwCi19OwotCiBzdGF0aWMgaW50IHNuZF9oZHNwbV9od19ydWxlX2luX2NoYW5uZWxzX3JhdGUoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJCSAgIHN0cnVjdCBzbmRfcGNtX2h3X3J1bGUgKnJ1bGUpCiB7CkBAIC01OTUzLDI2ICs1OTQ4LDI5IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CiAKIAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHJ1bnRpbWUsIDAsIDMyLCAyNCk7CisJc25kX3BjbV9od19jb25zdHJhaW50X3BvdzIocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFKTsKIAogCXN3aXRjaCAoaGRzcG0tPmlvX3R5cGUpIHsKIAljYXNlIEFJTzoKIAljYXNlIFJheURBVDoKLQkJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKLQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1NJWkUsCi0JCQkJJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplc19uZXcpOwotCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAotCQkJCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwKLQkJCQkmaHdfY29uc3RyYWludHNfcmF5ZGF0X2lvX2J1ZmZlcik7Ci0KKwkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwKKwkJCQkJICAgICAzMiwgNDA5Nik7CisJCS8qIFJheURBVCAmIEFJTyBoYXZlIGEgZml4ZWQgYnVmZmVyIG9mIDE2Mzg0IHNhbXBsZXMgcGVyIGNoYW5uZWwgKi8KKwkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwKKwkJCQkJICAgICAxNjM4NCwgMTYzODQpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCi0JCQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAotCQkJCSZod19jb25zdHJhaW50c19wZXJpb2Rfc2l6ZXNfb2xkKTsKKwkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwKKwkJCQkJICAgICA2NCwgODE5Mik7CisJCWJyZWFrOwogCX0KIAogCWlmIChBRVMzMiA9PSBoZHNwbS0+aW9fdHlwZSkgeworCQlydW50aW1lLT5ody5yYXRlcyB8PSBTTkRSVl9QQ01fUkFURV9LTk9UOwogCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKIAkJCQkmaGRzcG1faHdfY29uc3RyYWludHNfYWVzMzJfc2FtcGxlX3JhdGVzKTsKIAl9IGVsc2UgewpAQCAtNjAyNSwyNCArNjAyMywyOCBAQAogCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOwogCiAJc25kX3BjbV9od19jb25zdHJhaW50X21zYml0cyhydW50aW1lLCAwLCAzMiwgMjQpOworCXNuZF9wY21faHdfY29uc3RyYWludF9wb3cyKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSk7CisKIAlzd2l0Y2ggKGhkc3BtLT5pb190eXBlKSB7CiAJY2FzZSBBSU86CiAJY2FzZSBSYXlEQVQ6Ci0JICBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAotCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAotCQkJCSAgICAgJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplc19uZXcpOwotCSAgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKLQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwKLQkJCQkgICAgICZod19jb25zdHJhaW50c19yYXlkYXRfaW9fYnVmZmVyKTsKLQkgIGJyZWFrOworCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCisJCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAorCQkJCQkgICAgIDMyLCA0MDk2KTsKKwkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwKKwkJCQkJICAgICAxNjM4NCwgMTYzODQpOworCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JICBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAotCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAotCQkJCSAgICAgJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplc19vbGQpOworCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCisJCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAorCQkJCQkgICAgIDY0LCA4MTkyKTsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKEFFUzMyID09IGhkc3BtLT5pb190eXBlKSB7CisJCXJ1bnRpbWUtPmh3LnJhdGVzIHw9IFNORFJWX1BDTV9SQVRFX0tOT1Q7CiAJCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAogCQkJCSZoZHNwbV9od19jb25zdHJhaW50c19hZXMzMl9zYW1wbGVfcmF0ZXMpOwogCX0gZWxzZSB7CkBAIC02MDg4LDcgKzYwOTAsNyBAQAogfQogCiBzdGF0aWMgaW50IHNuZF9oZHNwbV9od2RlcF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCi0JCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgX191c2VyIGFyZykKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJc3RydWN0IGhkc3BtICpoZHNwbSA9IGh3LT5wcml2YXRlX2RhdGE7CkBAIC02MjEzLDExICs2MjE1LDEzIEBACiAJCWluZm8ubGluZV9vdXQgPSBoZHNwbV9saW5lX291dChoZHNwbSk7CiAJCWluZm8ucGFzc3RocnUgPSAwOwogCQlzcGluX3VubG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlicmVhazsKIAogCWNhc2UgU05EUlZfSERTUE1fSU9DVExfR0VUX1NUQVRVUzoKKwkJbWVtc2V0KCZzdGF0dXMsIDAsIHNpemVvZihzdGF0dXMpKTsKKwogCQlzdGF0dXMuY2FyZF90eXBlID0gaGRzcG0tPmlvX3R5cGU7CiAKIAkJc3RhdHVzLmF1dG9zeW5jX3NvdXJjZSA9IGhkc3BtX2F1dG9zeW5jX3JlZihoZHNwbSk7CkBAIC02MjQyLDcgKzYyNDYsNyBAQAogCQkJc3RhdHVzLmNhcmRfc3BlY2lmaWMubWFkaS5tYWRpX2lucHV0ID0KIAkJCQkoc3RhdHVzcmVnaXN0ZXIgJiBIRFNQTV9BQl9pbnQpID8gMSA6IDA7CiAJCQlzdGF0dXMuY2FyZF9zcGVjaWZpYy5tYWRpLmNoYW5uZWxfZm9ybWF0ID0KLQkJCQkoc3RhdHVzcmVnaXN0ZXIgJiBIRFNQTV9UWF82NGNoKSA/IDEgOiAwOworCQkJCShzdGF0dXNyZWdpc3RlciAmIEhEU1BNX1JYXzY0Y2gpID8gMSA6IDA7CiAJCQkvKiBUT0RPOiBNYWMgZHJpdmVyIHNldHMgaXQgd2hlbiBmX3M+NDhrSHogKi8KIAkJCXN0YXR1cy5jYXJkX3NwZWNpZmljLm1hZGkuZnJhbWVfZm9ybWF0ID0gMDsKIApAQCAtNjI1MCwxMyArNjI1NCwxNSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfVkVSU0lPTjoKKwkJbWVtc2V0KCZoZHNwbV92ZXJzaW9uLCAwLCBzaXplb2YoaGRzcG1fdmVyc2lvbikpOworCiAJCWhkc3BtX3ZlcnNpb24uY2FyZF90eXBlID0gaGRzcG0tPmlvX3R5cGU7CiAJCXN0cm5jcHkoaGRzcG1fdmVyc2lvbi5jYXJkbmFtZSwgaGRzcG0tPmNhcmRfbmFtZSwKIAkJCQlzaXplb2YoaGRzcG1fdmVyc2lvbi5jYXJkbmFtZSkpOwpAQCAtNjI2NywxMyArNjI3MywxMyBAQAogCQlpZiAoaGRzcG0tPnRjbykKIAkJCWhkc3BtX3ZlcnNpb24uYWRkb25zIHw9IEhEU1BNX0FERE9OX1RDTzsKIAotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZoZHNwbV92ZXJzaW9uLAorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZoZHNwbV92ZXJzaW9uLAogCQkJCQlzaXplb2YoaGRzcG1fdmVyc2lvbikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfTUlYRVI6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmbWl4ZXIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKG1peGVyKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbWl4ZXIsIGFyZ3AsIHNpemVvZihtaXhlcikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopbWl4ZXIubWl4ZXIsIGhkc3BtLT5taXhlciwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlcikpKQpAQCAtNjQ5MCwxMyArNjQ5Niw2IEBACiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkhEU1BNIik7CiAKIAlzd2l0Y2ggKGhkc3BtLT5maXJtd2FyZV9yZXYpIHsKLQljYXNlIEhEU1BNX01BRElfUkVWOgotCWNhc2UgSERTUE1fTUFESV9PTERfUkVWOgotCWNhc2UgSERTUE1fTUFESV9BTkNJRU5UX1JFVjoKLQkJaGRzcG0tPmlvX3R5cGUgPSBNQURJOwotCQloZHNwbS0+Y2FyZF9uYW1lID0gIlJNRSBNQURJIjsKLQkJaGRzcG0tPm1pZGlQb3J0cyA9IDM7Ci0JCWJyZWFrOwogCWNhc2UgSERTUE1fUkFZREFUX1JFVjoKIAkJaGRzcG0tPmlvX3R5cGUgPSBSYXlEQVQ7CiAJCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIFJheURBVCI7CkBAIC02NTEyLDE3ICs2NTExLDI1IEBACiAJCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIE1BRElmYWNlIjsKIAkJaGRzcG0tPm1pZGlQb3J0cyA9IDE7CiAJCWJyZWFrOwotCWNhc2UgSERTUE1fQUVTX1JFVjoKLQljYXNlIEhEU1BNX0FFUzMyX1JFVjoKLQljYXNlIEhEU1BNX0FFUzMyX09MRF9SRVY6Ci0JCWhkc3BtLT5pb190eXBlID0gQUVTMzI7Ci0JCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIEFFUzMyIjsKLQkJaGRzcG0tPm1pZGlQb3J0cyA9IDI7Ci0JCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhEU1BNOiB1bmtub3duIGZpcm13YXJlIHJldmlzaW9uICV4XG4iLAorCQlpZiAoKGhkc3BtLT5maXJtd2FyZV9yZXYgPT0gMHhmMCkgfHwKKwkJCSgoaGRzcG0tPmZpcm13YXJlX3JldiA+PSAweGU2KSAmJgorCQkJCQkoaGRzcG0tPmZpcm13YXJlX3JldiA8PSAweGVhKSkpIHsKKwkJCWhkc3BtLT5pb190eXBlID0gQUVTMzI7CisJCQloZHNwbS0+Y2FyZF9uYW1lID0gIlJNRSBBRVMzMiI7CisJCQloZHNwbS0+bWlkaVBvcnRzID0gMjsKKwkJfSBlbHNlIGlmICgoaGRzcG0tPmZpcm13YXJlX3JldiA9PSAweGQ1KSB8fAorCQkJKChoZHNwbS0+ZmlybXdhcmVfcmV2ID49IDB4YzgpICAmJgorCQkJCShoZHNwbS0+ZmlybXdhcmVfcmV2IDw9IDB4Y2YpKSkgeworCQkJaGRzcG0tPmlvX3R5cGUgPSBNQURJOworCQkJaGRzcG0tPmNhcmRfbmFtZSA9ICJSTUUgTUFESSI7CisJCQloZHNwbS0+bWlkaVBvcnRzID0gMzsKKwkJfSBlbHNlIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQkiSERTUE06IHVua25vd24gZmlybXdhcmUgcmV2aXNpb24gJXhcbiIsCiAJCQkJaGRzcG0tPmZpcm13YXJlX3Jldik7Ci0JCXJldHVybiAtRU5PREVWOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KIAl9CiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCmluZGV4IDFjN2JjMWUuLjczMmM1ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvc2lzNzAxOS5jIGIvc291bmQvcGNpL3NpczcwMTkuYwppbmRleCBiY2Y2MTUyLi5hMzkxZTYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc2lzNzAxOS5jCisrKyBiL3NvdW5kL3BjaS9zaXM3MDE5LmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CkBAIC0xMjM0LDcgKzEyMzQsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc2lzX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNpc19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHNpcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzaXM3MDE5OiB1bmFibGUgdG8gcmVnYWluIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlnb3RvIGVycm9yOwpAQCAtMTM0MCw3ICsxMzQwLDcgQEAKIAlpZiAocmMpCiAJCWdvdG8gZXJyb3Jfb3V0X2NsZWFudXA7CiAKLQlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNpc19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzaXNfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBzaXMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwgc2lzLT5pcnEpOwogCQlnb3RvIGVycm9yX291dF9jbGVhbnVwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3NvbmljdmliZXMuYyBiL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKaW5kZXggMjU3MWE2Ny4uMzFiNmFkMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3NvbmljdmliZXMuYworKysgYi9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtMTQ5Myw5ICsxNDkzLDEwIEBACiAJCXJldHVybiBlcnI7CiAJfQogCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfU09OSUNWSUJFUywKLQkJCQkgICAgICAgc29uaWMtPm1pZGlfcG9ydCwgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKLQkJCQkgICAgICAgc29uaWMtPmlycSwgMCwKLQkJCQkgICAgICAgJm1pZGlfdWFydCkpIDwgMCkgeworCQkJCSAgICAgICBzb25pYy0+bWlkaV9wb3J0LAorCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwKKwkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJICAgICAgIC0xLCAmbWlkaV91YXJ0KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jCmluZGV4IGQ4YTEyOGYuLmRlYjA0YjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3RyaWRlbnQuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC0xNDgsOCArMTQ4LDkgQEAKIAlpZiAodHJpZGVudC0+ZGV2aWNlICE9IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCAmJgogCSAgICAoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfVFJJRDREV0FWRSwKIAkJCQkgICAgICAgdHJpZGVudC0+bWlkaV9wb3J0LAotCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCSAgICAgICB0cmlkZW50LT5pcnEsIDAsICZ0cmlkZW50LT5ybWlkaSkpIDwgMCkgeworCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwKKwkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJICAgICAgIC0xLCAmdHJpZGVudC0+cm1pZGkpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCmluZGV4IDViZDU3YTcuLjYxZDNjMGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCBmMDNmZDYyLi5hZTk4ZDU2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTUzLDcgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0xMTc1LDYgKzExNzUsNyBAQAogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJaW50IGVycjsKIAlzdHJ1Y3QgdmlhX3JhdGVfbG9jayAqcmF0ZXA7CisJYm9vbCB1c2Vfc3JjID0gZmFsc2U7CiAKIAlydW50aW1lLT5odyA9IHNuZF92aWE4Mnh4X2h3OwogCQpAQCAtMTE5Niw2ICsxMTk3LDcgQEAKIAkJCQkgICAgIFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDApOwogCQlydW50aW1lLT5ody5yYXRlX21pbiA9IDgwMDA7CiAJCXJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gNDgwMDA7CisJCXVzZV9zcmMgPSB0cnVlOwogCX0gZWxzZSBpZiAoISByYXRlcC0+cmF0ZSkgewogCQlpbnQgaWR4ID0gdmlhZGV2LT5kaXJlY3Rpb24gPyBBQzk3X1JBVEVTX0FEQyA6IEFDOTdfUkFURVNfRlJPTlRfREFDOwogCQlydW50aW1lLT5ody5yYXRlcyA9IGNoaXAtPmFjOTctPnJhdGVzW2lkeF07CkBAIC0xMjEyLDYgKzEyMTQsMTIgQEAKIAlpZiAoKGVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJaWYgKHVzZV9zcmMpIHsKKwkJZXJyID0gc25kX3BjbV9od19ydWxlX25vcmVzYW1wbGUocnVudGltZSwgNDgwMDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gdmlhZGV2OwogCXZpYWRldi0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCkBAIC0yMDY4LDggKzIwNzYsOSBAQAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9QTlBfQ09OVFJPTCwgbGVnYWN5X2NmZyk7CiAJaWYgKGNoaXAtPm1wdV9yZXMpIHsKIAkJaWYgKHNuZF9tcHU0MDFfdWFydF9uZXcoY2hpcC0+Y2FyZCwgMCwgTVBVNDAxX0hXX1ZJQTY4NkEsCi0JCQkJCW1wdV9wb3J0LCBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCQljaGlwLT5pcnEsIDAsICZjaGlwLT5ybWlkaSkgPCAwKSB7CisJCQkJCW1wdV9wb3J0LCBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwKKwkJCQkJTVBVNDAxX0lORk9fSVJRX0hPT0ssIC0xLAorCQkJCQkmY2hpcC0+cm1pZGkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidW5hYmxlIHRvIGluaXRpYWxpemUgTVBVLTQwMSIKIAkJCSAgICAgICAiIGF0IDB4JWx4LCBza2lwcGluZ1xuIiwgbXB1X3BvcnQpOwogCQkJbGVnYWN5ICY9IH5WSUFfRlVOQ19FTkFCTEVfTUlESTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMgYi9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCmluZGV4IGEzODZkZDkuLjgwYTljMmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKKysrIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwppbmRleCA1MzQyZDVlLi42NzY1ODIyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdngyMjIvdngyMjIuYworKysgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYwppbmRleCA1MTFkNTc2Li5lOTdkZGNhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3ltZnBjaS5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgpAQCAtMzA1LDggKzMwNSw5IEBACiAJaWYgKGNoaXAtPm1wdV9yZXMpIHsKIAkJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19ZTUZQQ0ksCiAJCQkJCSAgICAgICBtcHVfcG9ydFtkZXZdLAotCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKLQkJCQkJICAgICAgIHBjaS0+aXJxLCAwLCAmY2hpcC0+cmF3bWlkaSkpIDwgMCkgeworCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8CisJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JUlFfSE9PSywKKwkJCQkJICAgICAgIC0xLCAmY2hpcC0+cmF3bWlkaSkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAieW1mcGNpOiBjYW5ub3QgaW5pdGlhbGl6ZSBNUFU0MDEgYXQgMHglbHgsIHNraXBwaW5nLi4uXG4iLCBtcHVfcG9ydFtkZXZdKTsKIAkJCWxlZ2FjeV9jdHJsICY9IH5ZTUZQQ0lfTEVHQUNZX01JRU47IC8qIGRpc2FibGUgTVBVNDAxIGlycSAqLwogCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX0xFR0FDWSwgbGVnYWN5X2N0cmwpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCmluZGV4IGYzMjYwZTYuLjAzZWU0ZTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYworKysgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtODk3LDYgKzg5OCwxOCBAQAogCXN0cnVjdCBzbmRfeW1mcGNpICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IHNuZF95bWZwY2lfcGNtICp5cGNtOworCWludCBlcnI7CisKKwlydW50aW1lLT5odyA9IHNuZF95bWZwY2lfcGxheWJhY2s7CisJLyogRklYTUU/IFRydWUgdmFsdWUgaXMgMjU2LzQ4ID0gNS4zMzMzMyBtcyAqLworCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwKKwkJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9USU1FLAorCQkJCQkgICA1MzM0LCBVSU5UX01BWCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gc25kX3BjbV9od19ydWxlX25vcmVzYW1wbGUocnVudGltZSwgNDgwMDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJeXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCp5cGNtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHlwY20gPT0gTlVMTCkKQEAgLTkwNCwxMSArOTE3LDggQEAKIAl5cGNtLT5jaGlwID0gY2hpcDsKIAl5cGNtLT50eXBlID0gUExBWUJBQ0tfVk9JQ0U7CiAJeXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCXJ1bnRpbWUtPmh3ID0gc25kX3ltZnBjaV9wbGF5YmFjazsKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB5cGNtOwogCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF95bWZwY2lfcGNtX2ZyZWVfc3Vic3RyZWFtOwotCS8qIEZJWE1FPyBUcnVlIHZhbHVlIGlzIDI1Ni80OCA9IDUuMzMzMzMgbXMgKi8KLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfVElNRSwgNTMzMywgVUlOVF9NQVgpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDEzLDYgKzEwMjMsMTggQEAKIAlzdHJ1Y3Qgc25kX3ltZnBjaSAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBzbmRfeW1mcGNpX3BjbSAqeXBjbTsKKwlpbnQgZXJyOworCisJcnVudGltZS0+aHcgPSBzbmRfeW1mcGNpX2NhcHR1cmU7CisJLyogRklYTUU/IFRydWUgdmFsdWUgaXMgMjU2LzQ4ID0gNS4zMzMzMyBtcyAqLworCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwKKwkJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9USU1FLAorCQkJCQkgICA1MzM0LCBVSU5UX01BWCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gc25kX3BjbV9od19ydWxlX25vcmVzYW1wbGUocnVudGltZSwgNDgwMDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJeXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCp5cGNtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHlwY20gPT0gTlVMTCkKQEAgLTEwMjIsOSArMTA0NCw2IEBACiAJeXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwkKIAl5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyID0gY2FwdHVyZV9iYW5rX251bWJlcjsKIAljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbVtjYXB0dXJlX2JhbmtfbnVtYmVyXSA9IHN1YnN0cmVhbTsKLQlydW50aW1lLT5odyA9IHNuZF95bWZwY2lfY2FwdHVyZTsKLQkvKiBGSVhNRT8gVHJ1ZSB2YWx1ZSBpcyAyNTYvNDggPSA1LjMzMzMzIG1zICovCi0Jc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1RJTUUsIDUzMzMsIFVJTlRfTUFYKTsKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB5cGNtOwogCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF95bWZwY2lfcGNtX2ZyZWVfc3Vic3RyZWFtOwogCXNuZF95bWZwY2lfaHdfc3RhcnQoY2hpcCk7CkBAIC0xNjE1LDcgKzE2MzQsNyBAQAogWU1GUENJX0RPVUJMRSgiQURDIENhcHR1cmUgVm9sdW1lIiwgMCwgWURTWEdSX1BSSUFEQ0xPT1BWT0wpLAogWU1GUENJX0RPVUJMRSgiQURDIFBsYXliYWNrIFZvbHVtZSIsIDEsIFlEU1hHUl9TRUNBRENPVVRWT0wpLAogWU1GUENJX0RPVUJMRSgiQURDIENhcHR1cmUgVm9sdW1lIiwgMSwgWURTWEdSX1NFQ0FEQ0xPT1BWT0wpLAotWU1GUENJX0RPVUJMRSgiRk0gTGVnYWN5IFZvbHVtZSIsIDAsIFlEU1hHUl9MRUdBQ1lPVVRWT0wpLAorWU1GUENJX0RPVUJMRSgiRk0gTGVnYWN5IFBsYXliYWNrIFZvbHVtZSIsIDAsIFlEU1hHUl9MRUdBQ1lPVVRWT0wpLAogWU1GUENJX0RPVUJMRShTTkRSVl9DVExfTkFNRV9JRUM5NTgoIkFDOTcgIiwgUExBWUJBQ0ssVk9MVU1FKSwgMCwgWURTWEdSX1pWT1VUVk9MKSwKIFlNRlBDSV9ET1VCTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBDQVBUVVJFLFZPTFVNRSksIDAsIFlEU1hHUl9aVkxPT1BWT0wpLAogWU1GUENJX0RPVUJMRShTTkRSVl9DVExfTkFNRV9JRUM5NTgoIkFDOTcgIixQTEFZQkFDSyxWT0xVTUUpLCAxLCBZRFNYR1JfU1BESUZPVVRWT0wpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKaW5kZXggNjY0ODhhNy4uNmFmNDFkMiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CiAjaW5jbHVkZSAicGRhdWRpb2NmLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCmluZGV4IDMxNzc3ZDEuLjllMzYxYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCkBAIC0yMCw3ICsyMCw3IEBACiAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAidnhwb2NrZXQuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9rZXl3ZXN0LmMgYi9zb3VuZC9wcGMva2V5d2VzdC5jCmluZGV4IDhmMDY0YzcuLjQwODBiZWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9rZXl3ZXN0LmMKKysrIGIvc291bmQvcHBjL2tleXdlc3QuYwpAQCAtODIsNyArODIsNiBAQAogCiBzdGF0aWMgaW50IGtleXdlc3RfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CiAJaWYgKCEga2V5d2VzdF9jdHgpCiAJCXJldHVybiAwOwogCWlmIChjbGllbnQgPT0ga2V5d2VzdF9jdHgtPmNsaWVudCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wb3dlcm1hYy5jIGIvc291bmQvcHBjL3Bvd2VybWFjLmMKaW5kZXggYTJiNjliOC4uNjU2NDU2OSAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3Bvd2VybWFjLmMKKysrIGIvc291bmQvcHBjL3Bvd2VybWFjLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgInBtYWMuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9zbmRfcHMzLmMgYi9zb3VuZC9wcGMvc25kX3BzMy5jCmluZGV4IGJjODIzYTUuLjFhYTUyZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9zbmRfcHMzLmMKKysrIGIvc291bmQvcHBjL3NuZF9wczMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvYXNvdW5kLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtODQ1LDcgKzg0Niw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEodGhlX2NhcmQuaXJxX25vLCBzbmRfcHMzX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwlyZXQgPSByZXF1ZXN0X2lycSh0aGVfY2FyZC5pcnFfbm8sIHNuZF9wczNfaW50ZXJydXB0LCAwLAogCQkJICBTTkRfUFMzX0RSSVZFUl9OQU1FLCAmdGhlX2NhcmQpOwogCWlmIChyZXQpIHsKIAkJcHJfaW5mbygiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKQEAgLTg3NSw3ICs4NzYsNyBAQAogCQkoMHgwZlVMIDw8IDEyKSB8CiAJCShQUzNfQVVESU9fSU9JRCk7CiAKLQlyZXQgPSBsdjFfZ3B1X2F0dHJpYnV0ZSgweDEwMCwgMHgwMDcsIHZhbCwgMCwgMCk7CisJcmV0ID0gbHYxX2dwdV9hdHRyaWJ1dGUoMHgxMDAsIDB4MDA3LCB2YWwpOwogCWlmIChyZXQpCiAJCXByX2luZm8oIiVzOiBncHVfYXR0cmlidXRlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCiAJCQlyZXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc2gvYWljYS5jIGIvc291bmQvc2gvYWljYS5jCmluZGV4IDk0YzZlYTcuLjExMjBjYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NoL2FpY2EuYworKysgYi9zb3VuZC9zaC9haWNhLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NoL3NoX2RhY19hdWRpby5jIGIvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKaW5kZXggNjhlMGRlZS4uNTZiY2I0NmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NoL3NoX2RhY19hdWRpby5jCisrKyBiL3NvdW5kL3NoL3NoX2RhY19hdWRpby5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9LY29uZmlnIGIvc291bmQvc29jL0tjb25maWcKaW5kZXggODIyNGRiNS4uMTM4MWRiOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL0tjb25maWcKKysrIGIvc291bmQvc29jL0tjb25maWcKQEAgLTcsNiArNyw4IEBACiAJc2VsZWN0IFNORF9QQ00KIAlzZWxlY3QgQUM5N19CVVMgaWYgU05EX1NPQ19BQzk3X0JVUwogCXNlbGVjdCBTTkRfSkFDSyBpZiBJTlBVVD15IHx8IElOUFVUPVNORAorCXNlbGVjdCBSRUdNQVBfSTJDIGlmIEkyQworCXNlbGVjdCBSRUdNQVBfU1BJIGlmIFNQSV9NQVNURVIKIAktLS1oZWxwLS0tCiAKIAkgIElmIHlvdSB3YW50IEFTb0Mgc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvIHRoZQpAQCAtNTEsNiArNTMsNyBAQAogc291cmNlICJzb3VuZC9zb2Mvb21hcC9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2Mva2lya3dvb2QvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL21pZC14ODYvS2NvbmZpZyIKK3NvdXJjZSAic291bmQvc29jL214cy9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvcHhhL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zYW1zdW5nL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zNjAwMC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL01ha2VmaWxlIGIvc291bmQvc29jL01ha2VmaWxlCmluZGV4IDRmOTEzODcuLjllYThhYzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKQEAgLTEyLDYgKzEyLDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DKSAgICs9IGlteC8KIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBqejQ3NDAvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gbWlkLXg4Ni8KK29iai0kKENPTkZJR19TTkRfU09DKQkrPSBteHMvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gbnVjOTAwLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IG9tYXAvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0ga2lya3dvb2QvCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvcGxheXBhcV93bTg1MTAuYyBiL3NvdW5kL3NvYy9hdG1lbC9wbGF5cGFxX3dtODUxMC5jCmluZGV4IDFhYWMyZjQuLjczYWU5OWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9wbGF5cGFxX3dtODUxMC5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9wbGF5cGFxX3dtODUxMC5jCkBAIC0zMzgsNyArMzM4LDYgQEAKIAkvKiBhbHdheXMgY29ubmVjdGVkIHBpbnMgKi8KIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSW50IE1pYyIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAogCkBAIC0zODMsMTQgKzM4MiwxNyBAQAogCV9nY2xrMCA9IGNsa19nZXQoTlVMTCwgImdjbGswIik7CiAJaWYgKElTX0VSUihfZ2NsazApKSB7CiAJCV9nY2xrMCA9IE5VTEw7CisJCXJldCA9IFBUUl9FUlIoX2djbGswKTsKIAkJZ290byBlcnJfZ2NsazA7CiAJfQogCV9wbGwwID0gY2xrX2dldChOVUxMLCAicGxsMCIpOwogCWlmIChJU19FUlIoX3BsbDApKSB7CiAJCV9wbGwwID0gTlVMTDsKKwkJcmV0ID0gUFRSX0VSUihfcGxsMCk7CiAJCWdvdG8gZXJyX3BsbDA7CiAJfQotCWlmIChjbGtfc2V0X3BhcmVudChfZ2NsazAsIF9wbGwwKSkgeworCXJldCA9IGNsa19zZXRfcGFyZW50KF9nY2xrMCwgX3BsbDApOworCWlmIChyZXQpIHsKIAkJcHJfd2FybmluZygic25kLXNvYy1wbGF5cGFxOiAiCiAJCQkgICAiRmFpbGVkIHRvIHNldCBQTEwwIGFzIHBhcmVudCBmb3IgREFDIGNsb2NrXG4iKTsKIAkJZ290byBlcnJfc2V0X2NsazsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jIGIvc291bmQvc29jL2F0bWVsL3NhbTlnMjBfd204NzMxLmMKaW5kZXggYmFkM2FhMS4uMDM3N2M1NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL3NhbTlnMjBfd204NzMxLmMKKysrIGIvc291bmQvc29jL2F0bWVsL3NhbTlnMjBfd204NzMxLmMKQEAgLTE3Myw4ICsxNzMsNiBAQAogCS8qIGFsd2F5cyBjb25uZWN0ZWQgKi8KIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL3NuZC1zb2MtYWZlYjkyNjAuYyBiL3NvdW5kL3NvYy9hdG1lbC9zbmQtc29jLWFmZWI5MjYwLmMKaW5kZXggNWU0ZDQ5OS4uZDQyN2U5MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL3NuZC1zb2MtYWZlYjkyNjAuYworKysgYi9zb3VuZC9zb2MvYXRtZWwvc25kLXNvYy1hZmViOTI2MC5jCkBAIC0xMTcsOCArMTE3LDYgQEAKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBJbiIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F1MXgvS2NvbmZpZyBiL3NvdW5kL3NvYy9hdTF4L0tjb25maWcKaW5kZXggNGI2NzE0MC4uZTkwOGE4MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F1MXgvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvYXUxeC9LY29uZmlnCkBAIC0zLDcgKzMsNyBAQAogIyMKIGNvbmZpZyBTTkRfU09DX0FVMVhQU0MKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIGZvciBBdTEyMDAvQXUxMjUwL0F1MTU1MCIKLQlkZXBlbmRzIG9uIFNPQ19BVTEyMDAgfHwgU09DX0FVMTU1MAorCWRlcGVuZHMgb24gTUlQU19BTENIRU1ZCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUHJvZ3JhbW1hYmxlIFNlcmlhbAogCSAgQ29udHJvbGxlcnMgaW4gQUM5NyBhbmQgSTJTIG1vZGUsIGFuZCB0aGUgRGVzY3JpcHRvci1CYXNlZCBETUEKQEAgLTE4LDEwICsxOCwzOCBAQAogCXNlbGVjdCBTTkRfQUM5N19DT0RFQwogCXNlbGVjdCBTTkRfU09DX0FDOTdfQlVTCiAKKyMjCisjIyBBdTEwMDAvMTUwMC8xMTAwIERNQSArIEFDOTdDL0kyU0MKKyMjCitjb25maWcgU05EX1NPQ19BVTFYQVVESU8KKwl0cmlzdGF0ZSAiU29DIEF1ZGlvIGZvciBBdTEwMDAvQXUxNTAwL0F1MTEwMCIKKwlkZXBlbmRzIG9uIE1JUFNfQUxDSEVNWQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgc2V0IGZvciB0aGUgQUM5NyB1bml0IGFuZCB0aGUKKwkgIG9sZCBETUEgY29udHJvbGxlciBhcyBmb3VuZCBvbiB0aGUgQXUxMDAwL0F1MTUwMC9BdTExMDAgY2hpcHMuCisKK2NvbmZpZyBTTkRfU09DX0FVMVhBQzk3QworCXRyaXN0YXRlCisJc2VsZWN0IEFDOTdfQlVTCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJc2VsZWN0IFNORF9TT0NfQUM5N19CVVMKKworY29uZmlnIFNORF9TT0NfQVUxWEkyU0MKKwl0cmlzdGF0ZQorCiAKICMjCiAjIyBCb2FyZHMKICMjCitjb25maWcgU05EX1NPQ19EQjEwMDAKKwl0cmlzdGF0ZSAiREIxMDAwIEF1ZGlvIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTTkRfU09DX0FVMVhBVURJTworCXNlbGVjdCBTTkRfU09DX0FVMVhBQzk3QworCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIEFDOTcgYXVkaW8gb24gdGhlIGVhcmx5IERCMXgwMCBzZXJpZXMKKwkgIG9mIGJvYXJkcyAoREIxMDAwL0RCMTUwMC9EQjExMDApLgorCiBjb25maWcgU05EX1NPQ19EQjEyMDAKIAl0cmlzdGF0ZSAiREIxMjAwIEFDOTcrSTJTIGF1ZGlvIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTTkRfU09DX0FVMVhQU0MKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L01ha2VmaWxlIGIvc291bmQvc29jL2F1MXgvTWFrZWZpbGUKaW5kZXggMTY4NzMwNy4uOTIwNzEwNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F1MXgvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2F1MXgvTWFrZWZpbGUKQEAgLTMsMTEgKzMsMjEgQEAKIHNuZC1zb2MtYXUxeHBzYy1pMnMtb2JqcyA6PSBwc2MtaTJzLm8KIHNuZC1zb2MtYXUxeHBzYy1hYzk3LW9ianMgOj0gcHNjLWFjOTcubwogCisjIEF1MTAwMC8xNTAwLzExMDAgQXVkaW8gdW5pdHMKK3NuZC1zb2MtYXUxeC1kbWEtb2JqcyA6PSBkbWEubworc25kLXNvYy1hdTF4LWFjOTdjLW9ianMgOj0gYWM5N2Mubworc25kLXNvYy1hdTF4LWkyc2Mtb2JqcyA6PSBpMnNjLm8KKwogb2JqLSQoQ09ORklHX1NORF9TT0NfQVUxWFBTQykgKz0gc25kLXNvYy1hdTF4cHNjLWRiZG1hLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FVMVhQU0NfSTJTKSArPSBzbmQtc29jLWF1MXhwc2MtaTJzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FVMVhQU0NfQUM5NykgKz0gc25kLXNvYy1hdTF4cHNjLWFjOTcubworb2JqLSQoQ09ORklHX1NORF9TT0NfQVUxWEFVRElPKSArPSBzbmQtc29jLWF1MXgtZG1hLm8KK29iai0kKENPTkZJR19TTkRfU09DX0FVMVhBQzk3QykgKz0gc25kLXNvYy1hdTF4LWFjOTdjLm8KK29iai0kKENPTkZJR19TTkRfU09DX0FVMVhJMlNDKSArPSBzbmQtc29jLWF1MXgtaTJzYy5vCiAKICMgQm9hcmRzCitzbmQtc29jLWRiMTAwMC1vYmpzIDo9IGRiMTAwMC5vCiBzbmQtc29jLWRiMTIwMC1vYmpzIDo9IGRiMTIwMC5vCiAKK29iai0kKENPTkZJR19TTkRfU09DX0RCMTAwMCkgKz0gc25kLXNvYy1kYjEwMDAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfREIxMjAwKSArPSBzbmQtc29jLWRiMTIwMC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXUxeC9hYzk3Yy5jIGIvc291bmQvc29jL2F1MXgvYWM5N2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjZiZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2F1MXgvYWM5N2MuYwpAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAqIEF1MTAwMC9BdTE1MDAvQXUxMTAwIEFDOTdDIGNvbnRyb2xsZXIgZHJpdmVyIGZvciBBU29DCisgKgorICogKGMpIDIwMTEgTWFudWVsIExhdXNzIDxtYW51ZWwubGF1c3NAZ29vZ2xlbWFpbC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBBTFNBIGRyaXZlciBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKKyAqCQkJQ2hhcmxlcyBFaWRzbmVzcyA8Y2hhcmxlc0Bjb29wZXItc3RyZWV0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorCisjaW5jbHVkZSAicHNjLmgiCisKKy8qIHJlZ2lzdGVyIG9mZnNldHMgYW5kIGJpdHMgKi8KKyNkZWZpbmUgQUM5N19DT05GSUcJMHgwMAorI2RlZmluZSBBQzk3X1NUQVRVUwkweDA0CisjZGVmaW5lIEFDOTdfREFUQQkweDA4CisjZGVmaW5lIEFDOTdfQ01EUkVTUAkweDBjCisjZGVmaW5lIEFDOTdfRU5BQkxFCTB4MTAKKworI2RlZmluZSBDRkdfUkMoeCkJKCgoeCkgJiAweDNmZikgPDwgMTMpCS8qIHZhbGlkIHJ4IHNsb3RzIG1hc2sgKi8KKyNkZWZpbmUgQ0ZHX1hTKHgpCSgoKHgpICYgMHgzZmYpIDw8IDMpCS8qIHZhbGlkIHR4IHNsb3RzIG1hc2sgKi8KKyNkZWZpbmUgQ0ZHX1NHCQkoMSA8PCAyKQkvKiBzeW5jIGdhdGUgKi8KKyNkZWZpbmUgQ0ZHX1NOCQkoMSA8PCAxKQkvKiBzeW5jIGNvbnRyb2wgKi8KKyNkZWZpbmUgQ0ZHX1JTCQkoMSA8PCAwKQkvKiBhY3JzdCMgY29udHJvbCAqLworI2RlZmluZSBTVEFUX1hVCQkoMSA8PCAxMSkJLyogdHggdW5kZXJmbG93ICovCisjZGVmaW5lIFNUQVRfWE8JCSgxIDw8IDEwKQkvKiB0eCBvdmVyZmxvdyAqLworI2RlZmluZSBTVEFUX1JVCQkoMSA8PCA5KQkvKiByeCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgU1RBVF9STwkJKDEgPDwgOCkJLyogcnggb3ZlcmZsb3cgKi8KKyNkZWZpbmUgU1RBVF9SRAkJKDEgPDwgNykJLyogY29kZWMgcmVhZHkgKi8KKyNkZWZpbmUgU1RBVF9DUAkJKDEgPDwgNikJLyogY29tbWFuZCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfVEUJCSgxIDw8IDQpCS8qIHR4IGZpZm8gZW1wdHkgKi8KKyNkZWZpbmUgU1RBVF9URgkJKDEgPDwgMykJLyogdHggZmlmbyBmdWxsICovCisjZGVmaW5lIFNUQVRfUkUJCSgxIDw8IDEpCS8qIHJ4IGZpZm8gZW1wdHkgKi8KKyNkZWZpbmUgU1RBVF9SRgkJKDEgPDwgMCkJLyogcnggZmlmbyBmdWxsICovCisjZGVmaW5lIENNRF9TRVRfREFUQSh4KQkoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIENNRF9HRVRfREFUQSh4KQkoKHgpICYgMHhmZmZmKQorI2RlZmluZSBDTURfUkVBRAkoMSA8PCA3KQorI2RlZmluZSBDTURfV1JJVEUJKDAgPDwgNykKKyNkZWZpbmUgQ01EX0lEWCh4KQkoKHgpICYgMHg3ZikKKyNkZWZpbmUgRU5fRAkJKDEgPDwgMSkJLyogRElTYWJsZSBiaXQgKi8KKyNkZWZpbmUgRU5fQ0UJCSgxIDw8IDApCS8qIGNsb2NrIGVuYWJsZSBiaXQgKi8KKworLyogaG93IG9mdGVuIHRvIHJldHJ5IGZhaWxlZCBjb2RlYyByZWdpc3RlciByZWFkcy93cml0ZXMgKi8KKyNkZWZpbmUgQUM5N19SV19SRVRSSUVTCTUKKworI2RlZmluZSBBQzk3X1JBVEVTCVwKKwlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTCisKKyNkZWZpbmUgQUM5N19GTVRTCVwKKwkoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSkKKworLyogaW5zdGFuY2UgZGF0YS4gVGhlcmUgY2FuIGJlIG9ubHkgb25lLCBNYWNMZW9kISEhISwgZm9ydHVuYXRlbHkgdGhlcmUgSVMgb25seQorICogb25jZSBBQzk3QyBvbiBlYXJseSBBbGNoZW15IGNoaXBzLiBUaGUgbmV3ZXIgb25lcyBhcmVuJ3Qgc28gbHVja3kuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICphYzk3Y193b3JrZGF0YTsKKyNkZWZpbmUgYWM5N190b19jdHgoeCkJCWFjOTdjX3dvcmtkYXRhCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBSRChzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHgsIGludCByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGN0eC0+bW1pbyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUihzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHgsIGludCByZWcsIHVuc2lnbmVkIGxvbmcgdikKK3sKKwlfX3Jhd193cml0ZWwodiwgY3R4LT5tbWlvICsgcmVnKTsKKwl3bWIoKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGF1MXhhYzk3Y19hYzk3X3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LAorCQkJCQkgIHVuc2lnbmVkIHNob3J0IHIpCit7CisJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqY3R4ID0gYWM5N190b19jdHgoYWM5Nyk7CisJdW5zaWduZWQgaW50IHRtbywgcmV0cnk7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCisJZGF0YSA9IH4wOworCXJldHJ5ID0gQUM5N19SV19SRVRSSUVTOworCWRvIHsKKwkJbXV0ZXhfbG9jaygmY3R4LT5sb2NrKTsKKworCQl0bW8gPSA1OworCQl3aGlsZSAoKFJEKGN0eCwgQUM5N19TVEFUVVMpICYgU1RBVF9DUCkgJiYgdG1vLS0pCisJCQl1ZGVsYXkoMjEpOwkvKiB3YWl0IGFuIGFjOTcgZnJhbWUgdGltZSAqLworCQlpZiAoIXRtbykgeworCQkJcHJfZGVidWcoImFjOTdyZCB0aW1lb3V0ICMxXG4iKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCVdSKGN0eCwgQUM5N19DTURSRVNQLCBDTURfSURYKHIpIHwgQ01EX1JFQUQpOworCisJCS8qIHN0dXBpZCBlcnJhdGE6IGRhdGEgaXMgb25seSB2YWxpZCBmb3IgMjF1cywgc28KKwkJICogcG9sbCwgRm9ycmVzdCwgcG9sbC4uLgorCQkgKi8KKwkJdG1vID0gMHgxMDAwMDsKKwkJd2hpbGUgKChSRChjdHgsIEFDOTdfU1RBVFVTKSAmIFNUQVRfQ1ApICYmIHRtby0tKQorCQkJYXNtIHZvbGF0aWxlICgibm9wIik7CisJCWRhdGEgPSBSRChjdHgsIEFDOTdfQ01EUkVTUCk7CisKKwkJaWYgKCF0bW8pCisJCQlwcl9kZWJ1ZygiYWM5N3JkIHRpbWVvdXQgIzJcbiIpOworCituZXh0OgorCQltdXRleF91bmxvY2soJmN0eC0+bG9jayk7CisJfSB3aGlsZSAoLS1yZXRyeSAmJiAhdG1vKTsKKworCXByX2RlYnVnKCJBQzk3UkQgJTA0eCAlMDRseCAlZFxuIiwgciwgZGF0YSwgcmV0cnkpOworCisJcmV0dXJuIHJldHJ5ID8gZGF0YSAmIDB4ZmZmZiA6IDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgYXUxeGFjOTdjX2FjOTdfd3JpdGUoc3RydWN0IHNuZF9hYzk3ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByLAorCQkJCSB1bnNpZ25lZCBzaG9ydCB2KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IGFjOTdfdG9fY3R4KGFjOTcpOworCXVuc2lnbmVkIGludCB0bW8sIHJldHJ5OworCisJcmV0cnkgPSBBQzk3X1JXX1JFVFJJRVM7CisJZG8geworCQltdXRleF9sb2NrKCZjdHgtPmxvY2spOworCisJCWZvciAodG1vID0gNTsgKFJEKGN0eCwgQUM5N19TVEFUVVMpICYgU1RBVF9DUCkgJiYgdG1vOyB0bW8tLSkKKwkJCXVkZWxheSgyMSk7CisJCWlmICghdG1vKSB7CisJCQlwcl9kZWJ1ZygiYWM5N3dyIHRpbWVvdXQgIzFcbiIpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJV1IoY3R4LCBBQzk3X0NNRFJFU1AsIENNRF9XUklURSB8IENNRF9JRFgocikgfCBDTURfU0VUX0RBVEEodikpOworCisJCWZvciAodG1vID0gMTA7IChSRChjdHgsIEFDOTdfU1RBVFVTKSAmIFNUQVRfQ1ApICYmIHRtbzsgdG1vLS0pCisJCQl1ZGVsYXkoMjEpOworCQlpZiAoIXRtbykKKwkJCXByX2RlYnVnKCJhYzk3d3IgdGltZW91dCAjMlxuIik7CituZXh0OgorCQltdXRleF91bmxvY2soJmN0eC0+bG9jayk7CisJfSB3aGlsZSAoLS1yZXRyeSAmJiAhdG1vKTsKKworCXByX2RlYnVnKCJBQzk3V1IgJTA0eCAlMDR4ICVkXG4iLCByLCB2LCByZXRyeSk7Cit9CisKK3N0YXRpYyB2b2lkIGF1MXhhYzk3Y19hYzk3X3dhcm1fcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IGFjOTdfdG9fY3R4KGFjOTcpOworCisJV1IoY3R4LCBBQzk3X0NPTkZJRywgY3R4LT5jZmcgfCBDRkdfU0cgfCBDRkdfU04pOworCW1zbGVlcCgyMCk7CisJV1IoY3R4LCBBQzk3X0NPTkZJRywgY3R4LT5jZmcgfCBDRkdfU0cpOworCVdSKGN0eCwgQUM5N19DT05GSUcsIGN0eC0+Y2ZnKTsKK30KKworc3RhdGljIHZvaWQgYXUxeGFjOTdjX2FjOTdfY29sZF9yZXNldChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCit7CisJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqY3R4ID0gYWM5N190b19jdHgoYWM5Nyk7CisJaW50IGk7CisKKwlXUihjdHgsIEFDOTdfQ09ORklHLCBjdHgtPmNmZyB8IENGR19SUyk7CisJbXNsZWVwKDUwMCk7CisJV1IoY3R4LCBBQzk3X0NPTkZJRywgY3R4LT5jZmcpOworCisJLyogd2FpdCBmb3IgY29kZWMgcmVhZHkgKi8KKwlpID0gNTA7CisJd2hpbGUgKCgoUkQoY3R4LCBBQzk3X1NUQVRVUykgJiBTVEFUX1JEKSA9PSAwKSAmJiAtLWkpCisJCW1zbGVlcCgyMCk7CisJaWYgKCFpKQorCQlwcmludGsoS0VSTl9FUlIgImFjOTdjOiBjb2RlYyBub3QgcmVhZHkgYWZ0ZXIgY29sZCByZXNldFxuIik7Cit9CisKKy8qIEFDOTcgY29udHJvbGxlciBvcGVyYXRpb25zICovCitzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBzb2NfYWM5N19vcHMgPSB7CisJLnJlYWQJCT0gYXUxeGFjOTdjX2FjOTdfcmVhZCwKKwkud3JpdGUJCT0gYXUxeGFjOTdjX2FjOTdfd3JpdGUsCisJLnJlc2V0CQk9IGF1MXhhYzk3Y19hYzk3X2NvbGRfcmVzZXQsCisJLndhcm1fcmVzZXQJPSBhdTF4YWM5N2NfYWM5N193YXJtX3Jlc2V0LAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNvY19hYzk3X29wcyk7CS8qIGdsb2JhbHMgYmUgZ29uZSEgKi8KKworc3RhdGljIGludCBhbGNoZW15X2FjOTdjX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLCAmY3R4LT5kbWFpZHNbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhbGNoZW15X2FjOTdjX29wcyA9IHsKKwkuc3RhcnR1cAkJPSBhbGNoZW15X2FjOTdjX3N0YXJ0dXAsCit9OworCitzdGF0aWMgaW50IGF1MXhhYzk3Y19kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJcmV0dXJuIGFjOTdjX3dvcmtkYXRhID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGF1MXhhYzk3Y19kYWlfZHJpdmVyID0geworCS5uYW1lCQkJPSAiYWxjaGVteS1hYzk3YyIsCisJLmFjOTdfY29udHJvbAkJPSAxLAorCS5wcm9iZQkJCT0gYXUxeGFjOTdjX2RhaV9wcm9iZSwKKwkucGxheWJhY2sgPSB7CisJCS5yYXRlcwkJPSBBQzk3X1JBVEVTLAorCQkuZm9ybWF0cwk9IEFDOTdfRk1UUywKKwkJLmNoYW5uZWxzX21pbgk9IDIsCisJCS5jaGFubmVsc19tYXgJPSAyLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5yYXRlcwkJPSBBQzk3X1JBVEVTLAorCQkuZm9ybWF0cwk9IEFDOTdfRk1UUywKKwkJLmNoYW5uZWxzX21pbgk9IDIsCisJCS5jaGFubmVsc19tYXgJPSAyLAorCX0sCisJLm9wcwkJCT0gJmFsY2hlbXlfYWM5N2Nfb3BzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYXUxeGFjOTdjX2RydnByb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzLCAqZG1hcmVzOworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eDsKKworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZjdHgtPmxvY2spOworCisJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaW9yZXMpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQwOworCX0KKworCXJldCA9IC1FQlVTWTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpb3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9yZXMpLAorCQkJCXBkZXYtPm5hbWUpKQorCQlnb3RvIG91dDA7CisKKwljdHgtPm1taW8gPSBpb3JlbWFwX25vY2FjaGUoaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CisJaWYgKCFjdHgtPm1taW8pCisJCWdvdG8gb3V0MTsKKworCWRtYXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CisJaWYgKCFkbWFyZXMpCisJCWdvdG8gb3V0MjsKKwljdHgtPmRtYWlkc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGRtYXJlcy0+c3RhcnQ7CisKKwlkbWFyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOworCWlmICghZG1hcmVzKQorCQlnb3RvIG91dDI7CisJY3R4LT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGRtYXJlcy0+c3RhcnQ7CisKKwkvKiBzd2l0Y2ggaXQgb24gKi8KKwlXUihjdHgsIEFDOTdfRU5BQkxFLCBFTl9EIHwgRU5fQ0UpOworCVdSKGN0eCwgQUM5N19FTkFCTEUsIEVOX0NFKTsKKworCWN0eC0+Y2ZnID0gQ0ZHX1JDKDMpIHwgQ0ZHX1hTKDMpOworCVdSKGN0eCwgQUM5N19DT05GSUcsIGN0eC0+Y2ZnKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2LCAmYXUxeGFjOTdjX2RhaV9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0MjsKKworCWFjOTdjX3dvcmtkYXRhID0gY3R4OworCXJldHVybiAwOworCitvdXQyOgorCWlvdW5tYXAoY3R4LT5tbWlvKTsKK291dDE6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcykpOworb3V0MDoKKwlrZnJlZShjdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGF1MXhhYzk3Y19kcnZyZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKKworCVdSKGN0eCwgQUM5N19FTkFCTEUsIEVOX0QpOwkvKiBjbG9jayBvZmYsIGRpc2FibGUgKi8KKworCWlvdW5tYXAoY3R4LT5tbWlvKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCWtmcmVlKGN0eCk7CisKKwlhYzk3Y193b3JrZGF0YSA9IE5VTEw7CS8qIE1ERVYgKi8KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGF1MXhhYzk3Y19kcnZzdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCVdSKGN0eCwgQUM5N19FTkFCTEUsIEVOX0QpOwkvKiBjbG9jayBvZmYsIGRpc2FibGUgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MXhhYzk3Y19kcnZyZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJV1IoY3R4LCBBQzk3X0VOQUJMRSwgRU5fRCB8IEVOX0NFKTsKKwlXUihjdHgsIEFDOTdfRU5BQkxFLCBFTl9DRSk7CisJV1IoY3R4LCBBQzk3X0NPTkZJRywgY3R4LT5jZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhdTF4cHNjYWM5N19wbW9wcyA9IHsKKwkuc3VzcGVuZAk9IGF1MXhhYzk3Y19kcnZzdXNwZW5kLAorCS5yZXN1bWUJCT0gYXUxeGFjOTdjX2RydnJlc3VtZSwKK307CisKKyNkZWZpbmUgQVUxWFBTQ0FDOTdfUE1PUFMgKCZhdTF4cHNjYWM5N19wbW9wcykKKworI2Vsc2UKKworI2RlZmluZSBBVTFYUFNDQUM5N19QTU9QUyBOVUxMCisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdTF4YWM5N2NfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImFsY2hlbXktYWM5N2MiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gQVUxWFBTQ0FDOTdfUE1PUFMsCisJfSwKKwkucHJvYmUJCT0gYXUxeGFjOTdjX2RydnByb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXUxeGFjOTdjX2RydnJlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdTF4YWM5N2NfbG9hZCh2b2lkKQoreworCWFjOTdjX3dvcmtkYXRhID0gTlVMTDsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdTF4YWM5N2NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1MXhhYzk3Y191bmxvYWQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXUxeGFjOTdjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF1MXhhYzk3Y19sb2FkKTsKK21vZHVsZV9leGl0KGF1MXhhYzk3Y191bmxvYWQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF1MTAwMC8xNTAwLzExMDAgQUM5N0MgQVNvQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hbnVlbCBMYXVzcyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F1MXgvZGIxMDAwLmMgYi9zb3VuZC9zb2MvYXUxeC9kYjEwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc0NzdhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2F1MXgvZGIxMDAwLmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIERCMTAwMC9EQjE1MDAvREIxMTAwIEFTb0MgYXVkaW8gZmFicmljIHN1cHBvcnQgY29kZS4KKyAqCisgKiAoYykgMjAxMSBNYW51ZWwgTGF1c3MgPG1hbnVlbC5sYXVzc0Bnb29nbGVtYWlsLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWRiMXgwMC9iY3NyLmg+CisKKyNpbmNsdWRlICJwc2MuaCIKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGRiMTAwMF9hYzk3X2RhaSA9IHsKKwkubmFtZQkJPSAiQUM5NyIsCisJLnN0cmVhbV9uYW1lCT0gIkFDOTcgSGlGaSIsCisJLmNvZGVjX2RhaV9uYW1lCT0gImFjOTctaGlmaSIsCisJLmNwdV9kYWlfbmFtZQk9ICJhbGNoZW15LWFjOTdjIiwKKwkucGxhdGZvcm1fbmFtZQk9ICJhbGNoZW15LXBjbS1kbWEuMCIsCisJLmNvZGVjX25hbWUJPSAiYWM5Ny1jb2RlYyIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBkYjEwMDBfYWM5NyA9IHsKKwkubmFtZQkJPSAiREIxMDAwX0FDOTciLAorCS5kYWlfbGluawk9ICZkYjEwMDBfYWM5N19kYWksCisJLm51bV9saW5rcwk9IDEsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYjEwMDBfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJmRiMTAwMF9hYzk3OworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGIxMDAwX2F1ZGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGIxMDAwX2F1ZGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJkYjEwMDAtYXVkaW8iLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJnNuZF9zb2NfcG1fb3BzLAorCX0sCisJLnByb2JlCQk9IGRiMTAwMF9hdWRpb19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRiMTAwMF9hdWRpb19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGIxMDAwX2F1ZGlvX2xvYWQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkYjEwMDBfYXVkaW9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRiMTAwMF9hdWRpb191bmxvYWQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGIxMDAwX2F1ZGlvX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRiMTAwMF9hdWRpb19sb2FkKTsKK21vZHVsZV9leGl0KGRiMTAwMF9hdWRpb191bmxvYWQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRCMTAwMC9EQjE1MDAvREIxMTAwIEFTb0MgYXVkaW8iKTsKK01PRFVMRV9BVVRIT1IoIk1hbnVlbCBMYXVzcyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F1MXgvZGIxMjAwLmMgYi9zb3VuZC9zb2MvYXUxeC9kYjEyMDAuYwppbmRleCAxZDNlMjU4Li4yODkzMTJjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXUxeC9kYjEyMDAuYworKysgYi9zb3VuZC9zb2MvYXUxeC9kYjEyMDAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBEQjEyMDAgQVNvQyBhdWRpbyBmYWJyaWMgc3VwcG9ydCBjb2RlLgogICoKLSAqIChjKSAyMDA4LTkgTWFudWVsIExhdXNzIDxtYW51ZWwubGF1c3NAZ21haWwuY29tPgorICogKGMpIDIwMDgtMjAxMSBNYW51ZWwgTGF1c3MgPG1hbnVlbC5sYXVzc0Bnb29nbGVtYWlsLmNvbT4KICAqCiAgKi8KIApAQCAtMjEsNiArMjEsMTcgQEAKICNpbmNsdWRlICIuLi9jb2RlY3Mvd204NzMxLmgiCiAjaW5jbHVkZSAicHNjLmgiCiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGRiMTIwMF9waWRzW10gPSB7CisJeworCQkubmFtZQkJPSAiZGIxMjAwLWFjOTciLAorCQkuZHJpdmVyX2RhdGEJPSAwLAorCX0sIHsKKwkJLm5hbWUJCT0gImRiMTIwMC1pMnMiLAorCQkuZHJpdmVyX2RhdGEJPSAxLAorCX0sCisJe30sCit9OworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEFDOTcgUEFSVCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGRiMTIwMF9hYzk3X2RhaSA9IHsKQEAgLTg5LDM2ICsxMDAsNDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDT01NT04gUEFSVCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRiMTIwMF9hc29jX2RldjsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkICpkYjEyMDBfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworCSZkYjEyMDBfYWM5N19tYWNoaW5lLAorCSZkYjEyMDBfaTJzX21hY2hpbmUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYjEyMDBfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICpwaWQgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQ7CisKKwljYXJkID0gZGIxMjAwX2NhcmRzW3BpZC0+ZHJpdmVyX2RhdGFdOworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGIxMjAwX2F1ZGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGIxMjAwX2F1ZGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJkYjEyMDAtYWM5NyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmc25kX3NvY19wbV9vcHMsCisJfSwKKwkuaWRfdGFibGUJPSBkYjEyMDBfcGlkcywKKwkucHJvYmUJCT0gZGIxMjAwX2F1ZGlvX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZGIxMjAwX2F1ZGlvX3JlbW92ZSksCit9OwogCiBzdGF0aWMgaW50IF9faW5pdCBkYjEyMDBfYXVkaW9fbG9hZCh2b2lkKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSAtRU5PTUVNOwotCWRiMTIwMF9hc29jX2RldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgMSk7IC8qIFBTQzEgKi8KLQlpZiAoIWRiMTIwMF9hc29jX2RldikKLQkJZ290byBvdXQ7Ci0KLQkvKiBEQjEyMDAgYm9hcmQgc2V0dXAgc2V0IFBTQzFNVVggdG8gcHJlZmVycmVkIGF1ZGlvIGRldmljZSAqLwotCWlmIChiY3NyX3JlYWQoQkNTUl9SRVNFVFMpICYgQkNTUl9SRVNFVFNfUFNDMU1VWCkKLQkJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGIxMjAwX2Fzb2NfZGV2LCAmZGIxMjAwX2kyc19tYWNoaW5lKTsKLQllbHNlCi0JCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRiMTIwMF9hc29jX2RldiwgJmRiMTIwMF9hYzk3X21hY2hpbmUpOwotCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChkYjEyMDBfYXNvY19kZXYpOwotCi0JaWYgKHJldCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGRiMTIwMF9hc29jX2Rldik7Ci0JCWRiMTIwMF9hc29jX2RldiA9IE5VTEw7Ci0JfQotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZGIxMjAwX2F1ZGlvX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkYjEyMDBfYXVkaW9fdW5sb2FkKHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGIxMjAwX2Fzb2NfZGV2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGIxMjAwX2F1ZGlvX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGRiMTIwMF9hdWRpb19sb2FkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jIGIvc291bmQvc29jL2F1MXgvZGJkbWEyLmMKaW5kZXggMjBiYjUzYS4uZDdkMDRlMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F1MXgvZGJkbWEyLmMKKysrIGIvc291bmQvc29jL2F1MXgvZGJkbWEyLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAJYXUxeF9wY21fZGJkbWFfZnJlZShwY2QpOwogCi0JaWYgKHN0eXBlID09IFBDTV9SWCkKKwlpZiAoc3R5cGUgPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQogCQlwY2QtPmRkbWFfY2hhbiA9IGF1MXh4eF9kYmRtYV9jaGFuX2FsbG9jKHBjZC0+ZGRtYV9pZCwKIAkJCQkJRFNDUl9DTUQwX0FMV0FZUywKIAkJCQkJYXUxeF9wY21fZG1hcnhfY2IsICh2b2lkICopcGNkKTsKQEAgLTE5OCw3ICsxOTgsNyBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzcy0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RtYWRhdGEgKnBjZCA9CiAJCQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKLQlyZXR1cm4gJnBjZFtTVUJTVFJFQU1fVFlQRShzcyldOworCXJldHVybiAmcGNkW3NzLT5zdHJlYW1dOwogfQogCiBzdGF0aWMgaW50IGF1MXhwc2NfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKQEAgLTIxMiw3ICsyMTIsNyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXN0eXBlID0gU1VCU1RSRUFNX1RZUEUoc3Vic3RyZWFtKTsKKwlzdHlwZSA9IHN1YnN0cmVhbS0+c3RyZWFtOwogCXBjZCA9IHRvX2RtYWRhdGEoc3Vic3RyZWFtKTsKIAogCURCRygicnVudGltZS0+ZG1hX2FyZWEgPSAweCUwOGx4IGRtYV9hZGRyX3QgPSAweCUwOGx4IGRtYV9zaXplID0gJWQgIgpAQCAtMjU1LDcgKzI1NSw3IEBACiAKIAlhdTF4eHhfZGJkbWFfcmVzZXQocGNkLT5kZG1hX2NoYW4pOwogCi0JaWYgKFNVQlNUUkVBTV9UWVBFKHN1YnN0cmVhbSkgPT0gUENNX1JYKSB7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewogCQlhdTF4X3BjbV9xdWV1ZV9yeChwY2QpOwogCQlhdTF4X3BjbV9xdWV1ZV9yeChwY2QpOwogCX0gZWxzZSB7CkBAIC0yOTMsNiArMjkzLDE2IEBACiAKIHN0YXRpYyBpbnQgYXUxeHBzY19wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKKwlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kbWFkYXRhICpwY2QgPSB0b19kbWFkYXRhKHN1YnN0cmVhbSk7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBzdHlwZSA9IHN1YnN0cmVhbS0+c3RyZWFtLCAqZG1haWRzOworCisJZG1haWRzID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKHJ0ZC0+Y3B1X2RhaSwgc3Vic3RyZWFtKTsKKwlpZiAoIWRtYWlkcykKKwkJcmV0dXJuIC1FTk9ERVY7CS8qIHdob2EsIGhhcyBvcmRlcmluZyBjaGFuZ2VkPyAqLworCisJcGNkLT5kZG1hX2lkID0gZG1haWRzW3N0eXBlXTsKKwogCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmYXUxeHBzY19wY21faGFyZHdhcmUpOwogCXJldHVybiAwOwogfQpAQCAtMzQwLDM2ICszNTAsMTggQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGF1MXhwc2NfcGNtX2RydnByb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZG1hZGF0YSAqZG1hZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJaW50IHJldDsKIAogCWRtYWRhdGEgPSBremFsbG9jKDIgKiBzaXplb2Yoc3RydWN0IGF1MXhwc2NfYXVkaW9fZG1hZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZG1hZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKLQlpZiAoIXIpIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXQxOwotCX0KLQlkbWFkYXRhW1BDTV9UWF0uZGRtYV9pZCA9IHItPnN0YXJ0OwotCi0JLyogUlggRE1BICovCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMSk7Ci0JaWYgKCFyKSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0MTsKLQl9Ci0JZG1hZGF0YVtQQ01fUlhdLmRkbWFfaWQgPSByLT5zdGFydDsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRtYWRhdGEpOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmYXUxeHBzY19zb2NfcGxhdGZvcm0pOwotCWlmICghcmV0KQotCQlyZXR1cm4gcmV0OworCWlmIChyZXQpCisJCWtmcmVlKGRtYWRhdGEpOwogCi1vdXQxOgotCWtmcmVlKGRtYWRhdGEpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQwNSw1NyArMzk3LDYgQEAKIG1vZHVsZV9pbml0KGF1MXhwc2NfYXVkaW9fZGJkbWFfbG9hZCk7CiBtb2R1bGVfZXhpdChhdTF4cHNjX2F1ZGlvX2RiZG1hX3VubG9hZCk7CiAKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXUxeHBzY19wY21fYWRkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXMsICpyOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkOwotCWludCBpZFsyXTsKLQlpbnQgcmV0OwotCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7Ci0JaWYgKCFyKQotCQlyZXR1cm4gTlVMTDsKLQlpZFswXSA9IHItPnN0YXJ0OwotCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMSk7Ci0JaWYgKCFyKQotCQlyZXR1cm4gTlVMTDsKLQlpZFsxXSA9IHItPnN0YXJ0OwotCi0JcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIDIsIEdGUF9LRVJORUwpOwotCWlmICghcmVzKQotCQlyZXR1cm4gTlVMTDsKLQotCXJlc1swXS5zdGFydCA9IHJlc1swXS5lbmQgPSBpZFswXTsKLQlyZXNbMV0uc3RhcnQgPSByZXNbMV0uZW5kID0gaWRbMV07Ci0JcmVzWzBdLmZsYWdzID0gcmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9ETUE7Ci0KLQlwZCA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiYXUxeHBzYy1wY20iLCBwZGV2LT5pZCk7Ci0JaWYgKCFwZCkKLQkJZ290byBvdXQ7Ci0KLQlwZC0+cmVzb3VyY2UgPSByZXM7Ci0JcGQtPm51bV9yZXNvdXJjZXMgPSAyOwotCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZCk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiBwZDsKLQotCXBsYXRmb3JtX2RldmljZV9wdXQocGQpOwotb3V0OgotCWtmcmVlKHJlcyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChhdTF4cHNjX3BjbV9hZGQpOwotCi12b2lkIGF1MXhwc2NfcGNtX2Rlc3Ryb3koc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZG1hcGQpCi17Ci0JaWYgKGRtYXBkKQotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkbWFwZCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChhdTF4cHNjX3BjbV9kZXN0cm95KTsKLQogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTEyeDAvQXUxNTUwIFBTQyBBdWRpbyBETUEgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYW51ZWwgTGF1c3MiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L2RtYS5jIGIvc291bmQvc29jL2F1MXgvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3ZjcxMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9hdTF4L2RtYS5jCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogQXUxMDAwL0F1MTUwMC9BdTExMDAgQXVkaW8gRE1BIHN1cHBvcnQuCisgKgorICogKGMpIDIwMTEgTWFudWVsIExhdXNzIDxtYW51ZWwubGF1c3NAZ29vZ2xlbWFpbC5jb20+CisgKgorICogY29waWVkIGFsbW9zdCB2ZXJiYXRpbSBmcm9tIHRoZSBvbGQgQUxTQSBkcml2ZXIsIHdyaXR0ZW4gYnkKKyAqCQkJQ2hhcmxlcyBFaWRzbmVzcyA8Y2hhcmxlc0Bjb29wZXItc3RyZWV0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZG1hLmg+CisKKyNpbmNsdWRlICJwc2MuaCIKKworI2RlZmluZSBBTENIRU1ZX1BDTV9GTVRTCQkJCQlcCisJKFNORFJWX1BDTV9GTVRCSVRfUzggICAgIHwgU05EUlZfUENNX0ZNVEJJVF9VOCB8CVwKKwkgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSB8CVwKKwkgU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9CRSB8CVwKKwkgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9CRSB8CVwKKwkgU05EUlZfUENNX0ZNVEJJVF9VMzJfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UzMl9CRSB8CVwKKwkgMCkKKworc3RydWN0IHBjbV9wZXJpb2QgeworCXUzMiBzdGFydDsKKwl1MzIgcmVsYXRpdmVfZW5kOwkvKiByZWxhdGl2ZSB0byBzdGFydCBvZiBidWZmZXIgKi8KKwlzdHJ1Y3QgcGNtX3BlcmlvZCAqbmV4dDsKK307CisKK3N0cnVjdCBhdWRpb19zdHJlYW0geworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCWludCBkbWE7CisJc3RydWN0IHBjbV9wZXJpb2QgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemU7CisJdW5zaWduZWQgaW50IHBlcmlvZHM7Cit9OworCitzdHJ1Y3QgYWxjaGVteV9wY21fY3R4IHsKKwlzdHJ1Y3QgYXVkaW9fc3RyZWFtIHN0cmVhbVsyXTsJLyogcGxheWJhY2sgJiBjYXB0dXJlICovCit9OworCitzdGF0aWMgdm9pZCBhdTEwMDBfcmVsZWFzZV9kbWFfbGluayhzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0pCit7CisJc3RydWN0IHBjbV9wZXJpb2QgKnBvaW50ZXI7CisJc3RydWN0IHBjbV9wZXJpb2QgKnBvaW50ZXJfbmV4dDsKKworCXN0cmVhbS0+cGVyaW9kX3NpemUgPSAwOworCXN0cmVhbS0+cGVyaW9kcyA9IDA7CisJcG9pbnRlciA9IHN0cmVhbS0+YnVmZmVyOworCWlmICghcG9pbnRlcikKKwkJcmV0dXJuOworCWRvIHsKKwkJcG9pbnRlcl9uZXh0ID0gcG9pbnRlci0+bmV4dDsKKwkJa2ZyZWUocG9pbnRlcik7CisJCXBvaW50ZXIgPSBwb2ludGVyX25leHQ7CisJfSB3aGlsZSAocG9pbnRlciAhPSBzdHJlYW0tPmJ1ZmZlcik7CisJc3RyZWFtLT5idWZmZXIgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGF1MTAwMF9zZXR1cF9kbWFfbGluayhzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0sCisJCQkJIHVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMsCisJCQkJIHVuc2lnbmVkIGludCBwZXJpb2RzKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gc3RyZWFtLT5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgcGNtX3BlcmlvZCAqcG9pbnRlcjsKKwl1bnNpZ25lZCBsb25nIGRtYV9zdGFydDsKKwlpbnQgaTsKKworCWRtYV9zdGFydCA9IHZpcnRfdG9fcGh5cyhydW50aW1lLT5kbWFfYXJlYSk7CisKKwlpZiAoc3RyZWFtLT5wZXJpb2Rfc2l6ZSA9PSBwZXJpb2RfYnl0ZXMgJiYKKwkgICAgc3RyZWFtLT5wZXJpb2RzID09IHBlcmlvZHMpCisJCXJldHVybiAwOyAvKiBub3QgY2hhbmdlZCAqLworCisJYXUxMDAwX3JlbGVhc2VfZG1hX2xpbmsoc3RyZWFtKTsKKworCXN0cmVhbS0+cGVyaW9kX3NpemUgPSBwZXJpb2RfYnl0ZXM7CisJc3RyZWFtLT5wZXJpb2RzID0gcGVyaW9kczsKKworCXN0cmVhbS0+YnVmZmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjbV9wZXJpb2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0cmVhbS0+YnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwb2ludGVyID0gc3RyZWFtLT5idWZmZXI7CisJZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgeworCQlwb2ludGVyLT5zdGFydCA9ICh1MzIpKGRtYV9zdGFydCArIChpICogcGVyaW9kX2J5dGVzKSk7CisJCXBvaW50ZXItPnJlbGF0aXZlX2VuZCA9ICh1MzIpICgoKGkrMSkgKiBwZXJpb2RfYnl0ZXMpIC0gMHgxKTsKKwkJaWYgKGkgPCBwZXJpb2RzIC0gMSkgeworCQkJcG9pbnRlci0+bmV4dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY21fcGVyaW9kKSwKKwkJCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKCFwb2ludGVyLT5uZXh0KSB7CisJCQkJYXUxMDAwX3JlbGVhc2VfZG1hX2xpbmsoc3RyZWFtKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCXBvaW50ZXIgPSBwb2ludGVyLT5uZXh0OworCQl9CisJfQorCXBvaW50ZXItPm5leHQgPSBzdHJlYW0tPmJ1ZmZlcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXUxMDAwX2RtYV9zdG9wKHN0cnVjdCBhdWRpb19zdHJlYW0gKnN0cmVhbSkKK3sKKwlpZiAoc3RyZWFtLT5idWZmZXIpCisJCWRpc2FibGVfZG1hKHN0cmVhbS0+ZG1hKTsKK30KKworc3RhdGljIHZvaWQgYXUxMDAwX2RtYV9zdGFydChzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0pCit7CisJaWYgKCFzdHJlYW0tPmJ1ZmZlcikKKwkJcmV0dXJuOworCisJaW5pdF9kbWEoc3RyZWFtLT5kbWEpOworCWlmIChnZXRfZG1hX2FjdGl2ZV9idWZmZXIoc3RyZWFtLT5kbWEpID09IDApIHsKKwkJY2xlYXJfZG1hX2RvbmUwKHN0cmVhbS0+ZG1hKTsKKwkJc2V0X2RtYV9hZGRyMChzdHJlYW0tPmRtYSwgc3RyZWFtLT5idWZmZXItPnN0YXJ0KTsKKwkJc2V0X2RtYV9jb3VudDAoc3RyZWFtLT5kbWEsIHN0cmVhbS0+cGVyaW9kX3NpemUgPj4gMSk7CisJCXNldF9kbWFfYWRkcjEoc3RyZWFtLT5kbWEsIHN0cmVhbS0+YnVmZmVyLT5uZXh0LT5zdGFydCk7CisJCXNldF9kbWFfY291bnQxKHN0cmVhbS0+ZG1hLCBzdHJlYW0tPnBlcmlvZF9zaXplID4+IDEpOworCX0gZWxzZSB7CisJCWNsZWFyX2RtYV9kb25lMShzdHJlYW0tPmRtYSk7CisJCXNldF9kbWFfYWRkcjEoc3RyZWFtLT5kbWEsIHN0cmVhbS0+YnVmZmVyLT5zdGFydCk7CisJCXNldF9kbWFfY291bnQxKHN0cmVhbS0+ZG1hLCBzdHJlYW0tPnBlcmlvZF9zaXplID4+IDEpOworCQlzZXRfZG1hX2FkZHIwKHN0cmVhbS0+ZG1hLCBzdHJlYW0tPmJ1ZmZlci0+bmV4dC0+c3RhcnQpOworCQlzZXRfZG1hX2NvdW50MChzdHJlYW0tPmRtYSwgc3RyZWFtLT5wZXJpb2Rfc2l6ZSA+PiAxKTsKKwl9CisJZW5hYmxlX2RtYV9idWZmZXJzKHN0cmVhbS0+ZG1hKTsKKwlzdGFydF9kbWEoc3RyZWFtLT5kbWEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXUxMDAwX2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBhdWRpb19zdHJlYW0gKnN0cmVhbSA9IChzdHJ1Y3QgYXVkaW9fc3RyZWFtICopcHRyOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gc3RyZWFtLT5zdWJzdHJlYW07CisKKwlzd2l0Y2ggKGdldF9kbWFfYnVmZmVyX2RvbmUoc3RyZWFtLT5kbWEpKSB7CisJY2FzZSBETUFfRDA6CisJCXN0cmVhbS0+YnVmZmVyID0gc3RyZWFtLT5idWZmZXItPm5leHQ7CisJCWNsZWFyX2RtYV9kb25lMChzdHJlYW0tPmRtYSk7CisJCXNldF9kbWFfYWRkcjAoc3RyZWFtLT5kbWEsIHN0cmVhbS0+YnVmZmVyLT5uZXh0LT5zdGFydCk7CisJCXNldF9kbWFfY291bnQwKHN0cmVhbS0+ZG1hLCBzdHJlYW0tPnBlcmlvZF9zaXplID4+IDEpOworCQllbmFibGVfZG1hX2J1ZmZlcjAoc3RyZWFtLT5kbWEpOworCQlicmVhazsKKwljYXNlIERNQV9EMToKKwkJc3RyZWFtLT5idWZmZXIgPSBzdHJlYW0tPmJ1ZmZlci0+bmV4dDsKKwkJY2xlYXJfZG1hX2RvbmUxKHN0cmVhbS0+ZG1hKTsKKwkJc2V0X2RtYV9hZGRyMShzdHJlYW0tPmRtYSwgc3RyZWFtLT5idWZmZXItPm5leHQtPnN0YXJ0KTsKKwkJc2V0X2RtYV9jb3VudDEoc3RyZWFtLT5kbWEsIHN0cmVhbS0+cGVyaW9kX3NpemUgPj4gMSk7CisJCWVuYWJsZV9kbWFfYnVmZmVyMShzdHJlYW0tPmRtYSk7CisJCWJyZWFrOworCWNhc2UgKERNQV9EMCB8IERNQV9EMSk6CisJCXByX2RlYnVnKCJETUEgJWQgbWlzc2VkIGludGVycnVwdC5cbiIsIHN0cmVhbS0+ZG1hKTsKKwkJYXUxMDAwX2RtYV9zdG9wKHN0cmVhbSk7CisJCWF1MTAwMF9kbWFfc3RhcnQoc3RyZWFtKTsKKwkJYnJlYWs7CisJY2FzZSAofkRNQV9EMCAmIH5ETUFfRDEpOgorCQlwcl9kZWJ1ZygiRE1BICVkIGVtcHR5IGlycS5cbiIsIHN0cmVhbS0+ZG1hKTsKKwl9CisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGFsY2hlbXlfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkgID0gU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJICAgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwgU05EUlZfUENNX0lORk9fQkFUQ0gsCisJLmZvcm1hdHMJICA9IEFMQ0hFTVlfUENNX0ZNVFMsCisJLnJhdGVzCQkgID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJLnJhdGVfbWluCSAgPSBTTkRSVl9QQ01fUkFURV84MDAwLAorCS5yYXRlX21heAkgID0gU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCS5jaGFubmVsc19taW4JICA9IDIsCisJLmNoYW5uZWxzX21heAkgID0gMiwKKwkucGVyaW9kX2J5dGVzX21pbiA9IDEwMjQsCisJLnBlcmlvZF9ieXRlc19tYXggPSAxNiAqIDEwMjQgLSAxLAorCS5wZXJpb2RzX21pbgkgID0gNCwKKwkucGVyaW9kc19tYXgJICA9IDI1NSwKKwkuYnVmZmVyX2J5dGVzX21heCA9IDEyOCAqIDEwMjQsCisJLmZpZm9fc2l6ZQkgID0gMTYsCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhbGNoZW15X3BjbV9jdHggKnNzX3RvX2N0eChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzcy0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdWRpb19zdHJlYW0gKnNzX3RvX2FzKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJc3RydWN0IGFsY2hlbXlfcGNtX2N0eCAqY3R4ID0gc3NfdG9fY3R4KHNzKTsKKwlyZXR1cm4gJihjdHgtPnN0cmVhbVtzcy0+c3RyZWFtXSk7Cit9CisKK3N0YXRpYyBpbnQgYWxjaGVteV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYWxjaGVteV9wY21fY3R4ICpjdHggPSBzc190b19jdHgoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJaW50ICpkbWFpZHMsIHMgPSBzdWJzdHJlYW0tPnN0cmVhbTsKKwljaGFyICpuYW1lOworCisJZG1haWRzID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKHJ0ZC0+Y3B1X2RhaSwgc3Vic3RyZWFtKTsKKwlpZiAoIWRtYWlkcykKKwkJcmV0dXJuIC1FTk9ERVY7CS8qIHdob2EsIGhhcyBvcmRlcmluZyBjaGFuZ2VkPyAqLworCisJLyogRE1BIHNldHVwICovCisJbmFtZSA9IChzID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spID8gImF1ZGlvLXR4IiA6ICJhdWRpby1yeCI7CisJY3R4LT5zdHJlYW1bc10uZG1hID0gcmVxdWVzdF9hdTEwMDBfZG1hKGRtYWlkc1tzXSwgbmFtZSwKKwkJCQkJYXUxMDAwX2RtYV9pbnRlcnJ1cHQsIDAsCisJCQkJCSZjdHgtPnN0cmVhbVtzXSk7CisJc2V0X2RtYV9tb2RlKGN0eC0+c3RyZWFtW3NdLmRtYSwKKwkJICAgICBnZXRfZG1hX21vZGUoY3R4LT5zdHJlYW1bc10uZG1hKSAmIH5ETUFfTkMpOworCisJY3R4LT5zdHJlYW1bc10uc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWN0eC0+c3RyZWFtW3NdLmJ1ZmZlciA9IE5VTEw7CisJc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyhzdWJzdHJlYW0sICZhbGNoZW15X3BjbV9oYXJkd2FyZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGNoZW15X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYWxjaGVteV9wY21fY3R4ICpjdHggPSBzc190b19jdHgoc3Vic3RyZWFtKTsKKwlpbnQgc3R5cGUgPSBzdWJzdHJlYW0tPnN0cmVhbTsKKworCWN0eC0+c3RyZWFtW3N0eXBlXS5zdWJzdHJlYW0gPSBOVUxMOworCWZyZWVfYXUxMDAwX2RtYShjdHgtPnN0cmVhbVtzdHlwZV0uZG1hKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsY2hlbXlfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCit7CisJc3RydWN0IGF1ZGlvX3N0cmVhbSAqc3RyZWFtID0gc3NfdG9fYXMoc3Vic3RyZWFtKTsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKKwkJCQkgICAgICAgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBhdTEwMDBfc2V0dXBfZG1hX2xpbmsoc3RyZWFtLAorCQkJCSAgICBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcyksCisJCQkJICAgIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcykpOworCWlmIChlcnIpCisJCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYWxjaGVteV9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0gPSBzc190b19hcyhzdWJzdHJlYW0pOworCWF1MTAwMF9yZWxlYXNlX2RtYV9saW5rKHN0cmVhbSk7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCBhbGNoZW15X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBhdWRpb19zdHJlYW0gKnN0cmVhbSA9IHNzX3RvX2FzKHN1YnN0cmVhbSk7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWF1MTAwMF9kbWFfc3RhcnQoc3RyZWFtKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlhdTEwMDBfZG1hX3N0b3Aoc3RyZWFtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBhbGNoZW15X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJc3RydWN0IGF1ZGlvX3N0cmVhbSAqc3RyZWFtID0gc3NfdG9fYXMoc3MpOworCWxvbmcgbG9jYXRpb247CisKKwlsb2NhdGlvbiA9IGdldF9kbWFfcmVzaWR1ZShzdHJlYW0tPmRtYSk7CisJbG9jYXRpb24gPSBzdHJlYW0tPmJ1ZmZlci0+cmVsYXRpdmVfZW5kIC0gbG9jYXRpb247CisJaWYgKGxvY2F0aW9uID09IC0xKQorCQlsb2NhdGlvbiA9IDA7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzcy0+cnVudGltZSwgbG9jYXRpb24pOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGFsY2hlbXlfcGNtX29wcyA9IHsKKwkub3BlbgkJCT0gYWxjaGVteV9wY21fb3BlbiwKKwkuY2xvc2UJCQk9IGFsY2hlbXlfcGNtX2Nsb3NlLAorCS5pb2N0bAkJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcwkgICAgICAgID0gYWxjaGVteV9wY21faHdfcGFyYW1zLAorCS5od19mcmVlCSAgICAgICAgPSBhbGNoZW15X3BjbV9od19mcmVlLAorCS50cmlnZ2VyCQk9IGFsY2hlbXlfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIJCT0gYWxjaGVteV9wY21fcG9pbnRlciwKK307CisKK3N0YXRpYyB2b2lkIGFsY2hlbXlfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIGludCBhbGNoZW15X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfQ09OVElOVU9VUywKKwkJc25kX2RtYV9jb250aW51b3VzX2RhdGEoR0ZQX0tFUk5FTCksIDY1NTM2LCAoNDA5NiAqIDEwMjQpIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIGFsY2hlbXlfcGNtX3NvY19wbGF0Zm9ybSA9IHsKKwkub3BzCQk9ICZhbGNoZW15X3BjbV9vcHMsCisJLnBjbV9uZXcJPSBhbGNoZW15X3BjbV9uZXcsCisJLnBjbV9mcmVlCT0gYWxjaGVteV9wY21fZnJlZV9kbWFfYnVmZmVycywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFsY2hlbXlfcGNtX2RydnByb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFsY2hlbXlfcGNtX2N0eCAqY3R4OworCWludCByZXQ7CisKKwljdHggPSBremFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3R4KTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwgJmFsY2hlbXlfcGNtX3NvY19wbGF0Zm9ybSk7CisJaWYgKHJldCkKKwkJa2ZyZWUoY3R4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFsY2hlbXlfcGNtX2RydnJlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhbGNoZW15X3BjbV9jdHggKmN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworCWtmcmVlKGN0eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWxjaGVteV9wY21kbWFfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImFsY2hlbXktcGNtLWRtYSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFsY2hlbXlfcGNtX2RydnByb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWxjaGVteV9wY21fZHJ2cmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsY2hlbXlfcGNtZG1hX2xvYWQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbGNoZW15X3BjbWRtYV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxjaGVteV9wY21kbWFfdW5sb2FkKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFsY2hlbXlfcGNtZG1hX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsY2hlbXlfcGNtZG1hX2xvYWQpOworbW9kdWxlX2V4aXQoYWxjaGVteV9wY21kbWFfdW5sb2FkKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTEwMDAvQXUxNTAwL0F1MTEwMCBBdWRpbyBETUEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYW51ZWwgTGF1c3MiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L2kyc2MuYyBiL3NvdW5kL3NvYy9hdTF4L2kyc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNmNDhmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2F1MXgvaTJzYy5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQXUxMDAwL0F1MTUwMC9BdTExMDAgSTJTIGNvbnRyb2xsZXIgZHJpdmVyIGZvciBBU29DCisgKgorICogKGMpIDIwMTEgTWFudWVsIExhdXNzIDxtYW51ZWwubGF1c3NAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTm90ZTogY2xvY2sgc3VwcGxpZWQgdG8gdGhlIEkyUyBjb250cm9sbGVyIG11c3QgYmUgMjU2eCBzYW1wbGVyYXRlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKworI2luY2x1ZGUgInBzYy5oIgorCisjZGVmaW5lIEkyU19SWFRYCTB4MDAKKyNkZWZpbmUgSTJTX0NGRwkJMHgwNAorI2RlZmluZSBJMlNfRU5BQkxFCTB4MDgKKworI2RlZmluZSBDRkdfWFUJCSgxIDw8IDI1KQkvKiB0eCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgQ0ZHX1hPCQkoMSA8PCAyNCkKKyNkZWZpbmUgQ0ZHX1JVCQkoMSA8PCAyMykKKyNkZWZpbmUgQ0ZHX1JPCQkoMSA8PCAyMikKKyNkZWZpbmUgQ0ZHX1RSCQkoMSA8PCAyMSkKKyNkZWZpbmUgQ0ZHX1RFCQkoMSA8PCAyMCkKKyNkZWZpbmUgQ0ZHX1RGCQkoMSA8PCAxOSkKKyNkZWZpbmUgQ0ZHX1JSCQkoMSA8PCAxOCkKKyNkZWZpbmUgQ0ZHX1JGCQkoMSA8PCAxNykKKyNkZWZpbmUgQ0ZHX0lDSwkJKDEgPDwgMTIpCS8qIGNsb2NrIGludmVydCAqLworI2RlZmluZSBDRkdfUEQJCSgxIDw8IDExKQkvKiBzZXQgdG8gbWFrZSBJMlNESU8gSU5QVVQgKi8KKyNkZWZpbmUgQ0ZHX0xCCQkoMSA8PCAxMCkJLyogbG9vcGJhY2sgKi8KKyNkZWZpbmUgQ0ZHX0lDCQkoMSA8PCA5KQkvKiB3b3JkIHNlbGVjdCBpbnZlcnQgKi8KKyNkZWZpbmUgQ0ZHX0ZNX0kyUwkoMCA8PCA3KQkvKiBJMlMgZm9ybWF0ICovCisjZGVmaW5lIENGR19GTV9MSgkoMSA8PCA3KQkvKiBsZWZ0LWp1c3RpZmllZCAqLworI2RlZmluZSBDRkdfRk1fUkoJKDIgPDwgNykJLyogcmlnaHQtanVzdGlmaWVkICovCisjZGVmaW5lIENGR19GTV9NQVNLCSgzIDw8IDcpCisjZGVmaW5lIENGR19UTgkJKDEgPDwgNikJLyogdHggZmlmbyBlbiAqLworI2RlZmluZSBDRkdfUk4JCSgxIDw8IDUpCS8qIHJ4IGZpZm8gZW4gKi8KKyNkZWZpbmUgQ0ZHX1NaXzgJKDB4MDgpCisjZGVmaW5lIENGR19TWl8xNgkoMHgxMCkKKyNkZWZpbmUgQ0ZHX1NaXzE4CSgweDEyKQorI2RlZmluZSBDRkdfU1pfMjAJKDB4MTQpCisjZGVmaW5lIENGR19TWl8yNAkoMHgxOCkKKyNkZWZpbmUgQ0ZHX1NaX01BU0sJKDB4MWYpCisjZGVmaW5lIEVOX0QJCSgxIDw8IDEpCS8qIERJU2FibGUgKi8KKyNkZWZpbmUgRU5fQ0UJCSgxIDw8IDApCS8qIGNsb2NrIGVuYWJsZSAqLworCisvKiBvbmx5IGxpbWl0ZWQgYnkgY2xvY2sgZ2VuZXJhdG9yIGFuZCBib2FyZCBkZXNpZ24gKi8KKyNkZWZpbmUgQVUxWEkyU0NfUkFURVMgXAorCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMKKworI2RlZmluZSBBVTFYSTJTQ19GTVRTIFwKKwkoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFNORFJWX1BDTV9GTVRCSVRfVTggfAkJXAorCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUgfAlcCisJU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9CRSB8CVwKKwlTTkRSVl9QQ01fRk1UQklUX1MxOF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UxOF8zTEUgfAlcCisJU05EUlZfUENNX0ZNVEJJVF9TMThfM0JFIHwgU05EUlZfUENNX0ZNVEJJVF9VMThfM0JFIHwJXAorCVNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFNORFJWX1BDTV9GTVRCSVRfVTIwXzNMRSB8CVwKKwlTTkRSVl9QQ01fRk1UQklUX1MyMF8zQkUgfCBTTkRSVl9QQ01fRk1UQklUX1UyMF8zQkUgfAlcCisJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSB8CVwKKwlTTkRSVl9QQ01fRk1UQklUX1UyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfVTI0X0JFIHwJXAorCTApCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBSRChzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHgsIGludCByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGN0eC0+bW1pbyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUihzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHgsIGludCByZWcsIHVuc2lnbmVkIGxvbmcgdikKK3sKKwlfX3Jhd193cml0ZWwodiwgY3R4LT5tbWlvICsgcmVnKTsKKwl3bWIoKTsKK30KKworc3RhdGljIGludCBhdTF4aTJzX3NldF9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpLCB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOworCXVuc2lnbmVkIGxvbmcgYzsKKwlpbnQgcmV0OworCisJcmV0ID0gLUVJTlZBTDsKKwljID0gY3R4LT5jZmc7CisKKwljICY9IH5DRkdfRk1fTUFTSzsKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWMgfD0gQ0ZHX0ZNX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9NU0I6CisJCWMgfD0gQ0ZHX0ZNX1JKOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xTQjoKKwkJYyB8PSBDRkdfRk1fTEo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX0KKworCWMgJj0gfihDRkdfSUMgfCBDRkdfSUNLKTsJCS8qIElCLUlGICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWMgfD0gQ0ZHX0lDIHwgQ0ZHX0lDSzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9JRjoKKwkJYyB8PSBDRkdfSUM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWMgfD0gQ0ZHX0lDSzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CisJfQorCisJLyogSTJTIGNvbnRyb2xsZXIgb25seSBzdXBwb3J0cyBtYXN0ZXIgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgkvKiBDT0RFQyBzbGF2ZSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAwOworCWN0eC0+Y2ZnID0gYzsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF1MXhpMnNfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgIGludCBjbWQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJaW50IHN0eXBlID0gU1VCU1RSRUFNX1RZUEUoc3Vic3RyZWFtKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJLyogcG93ZXIgdXAgKi8KKwkJV1IoY3R4LCBJMlNfRU5BQkxFLCBFTl9EIHwgRU5fQ0UpOworCQlXUihjdHgsIEkyU19FTkFCTEUsIEVOX0NFKTsKKwkJY3R4LT5jZmcgfD0gKHN0eXBlID09IFBDTV9UWCkgPyBDRkdfVE4gOiBDRkdfUk47CisJCVdSKGN0eCwgSTJTX0NGRywgY3R4LT5jZmcpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQljdHgtPmNmZyAmPSB+KChzdHlwZSA9PSBQQ01fVFgpID8gQ0ZHX1ROIDogQ0ZHX1JOKTsKKwkJV1IoY3R4LCBJMlNfQ0ZHLCBjdHgtPmNmZyk7CisJCVdSKGN0eCwgSTJTX0VOQUJMRSwgRU5fRCk7CQkvKiBwb3dlciBvZmYgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1zYml0c190b19yZWcoaW50IG1zYml0cykKK3sKKwlzd2l0Y2ggKG1zYml0cykgeworCWNhc2UgODoKKwkJcmV0dXJuIENGR19TWl84OworCWNhc2UgMTY6CisJCXJldHVybiBDRkdfU1pfMTY7CisJY2FzZSAxODoKKwkJcmV0dXJuIENGR19TWl8xODsKKwljYXNlIDIwOgorCQlyZXR1cm4gQ0ZHX1NaXzIwOworCWNhc2UgMjQ6CisJCXJldHVybiBDRkdfU1pfMjQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MXhpMnNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqY3R4ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwl1bnNpZ25lZCBsb25nIHY7CisKKwl2ID0gbXNiaXRzX3RvX3JlZyhwYXJhbXMtPm1zYml0cyk7CisJaWYgKCF2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN0eC0+Y2ZnICY9IH5DRkdfU1pfTUFTSzsKKwljdHgtPmNmZyB8PSB2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MXhpMnNfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLCAmY3R4LT5kbWFpZHNbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhdTF4aTJzX2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAJPSBhdTF4aTJzX3N0YXJ0dXAsCisJLnRyaWdnZXIJPSBhdTF4aTJzX3RyaWdnZXIsCisJLmh3X3BhcmFtcwk9IGF1MXhpMnNfaHdfcGFyYW1zLAorCS5zZXRfZm10CT0gYXUxeGkyc19zZXRfZm10LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYXUxeGkyc19kYWlfZHJpdmVyID0geworCS5zeW1tZXRyaWNfcmF0ZXMJPSAxLAorCS5wbGF5YmFjayA9IHsKKwkJLnJhdGVzCQk9IEFVMVhJMlNDX1JBVEVTLAorCQkuZm9ybWF0cwk9IEFVMVhJMlNDX0ZNVFMsCisJCS5jaGFubmVsc19taW4JPSAyLAorCQkuY2hhbm5lbHNfbWF4CT0gMiwKKwl9LAorCS5jYXB0dXJlID0geworCQkucmF0ZXMJCT0gQVUxWEkyU0NfUkFURVMsCisJCS5mb3JtYXRzCT0gQVUxWEkyU0NfRk1UUywKKwkJLmNoYW5uZWxzX21pbgk9IDIsCisJCS5jaGFubmVsc19tYXgJPSAyLAorCX0sCisJLm9wcyA9ICZhdTF4aTJzX2RhaV9vcHMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTF4aTJzX2RydnByb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzLCAqZG1hcmVzOworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eDsKKworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpb3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFpb3JlcykgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDA7CisJfQorCisJcmV0ID0gLUVCVVNZOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcyksCisJCQkJcGRldi0+bmFtZSkpCisJCWdvdG8gb3V0MDsKKworCWN0eC0+bW1pbyA9IGlvcmVtYXBfbm9jYWNoZShpb3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9yZXMpKTsKKwlpZiAoIWN0eC0+bW1pbykKKwkJZ290byBvdXQxOworCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCWN0eC0+ZG1haWRzW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gZG1hcmVzLT5zdGFydDsKKworCWRtYXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMSk7CisJaWYgKCFkbWFyZXMpCisJCWdvdG8gb3V0MjsKKwljdHgtPmRtYWlkc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gZG1hcmVzLT5zdGFydDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2LCAmYXUxeGkyc19kYWlfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDI7CisKKwlyZXR1cm4gMDsKKworb3V0MjoKKwlpb3VubWFwKGN0eC0+bW1pbyk7CitvdXQxOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihpb3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9yZXMpKTsKK291dDA6CisJa2ZyZWUoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhdTF4aTJzX2RydnJlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYpOworCisJV1IoY3R4LCBJMlNfRU5BQkxFLCBFTl9EKTsJLyogY2xvY2sgb2ZmLCBkaXNhYmxlICovCisKKwlpb3VubWFwKGN0eC0+bW1pbyk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlrZnJlZShjdHgpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXUxeGkyc19kcnZzdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCVdSKGN0eCwgSTJTX0VOQUJMRSwgRU5fRCk7CS8qIGNsb2NrIG9mZiwgZGlzYWJsZSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXUxeGkyc19kcnZyZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYXUxeGkyc2NfcG1vcHMgPSB7CisJLnN1c3BlbmQJPSBhdTF4aTJzX2RydnN1c3BlbmQsCisJLnJlc3VtZQkJPSBhdTF4aTJzX2RydnJlc3VtZSwKK307CisKKyNkZWZpbmUgQVUxWEkyU0NfUE1PUFMgKCZhdTF4aTJzY19wbW9wcykKKworI2Vsc2UKKworI2RlZmluZSBBVTFYSTJTQ19QTU9QUyBOVUxMCisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdTF4aTJzX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJhbGNoZW15LWkyc2MiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gQVUxWEkyU0NfUE1PUFMsCisJfSwKKwkucHJvYmUJCT0gYXUxeGkyc19kcnZwcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF1MXhpMnNfZHJ2cmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF1MXhpMnNfbG9hZCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF1MXhpMnNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1MXhpMnNfdW5sb2FkKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1MXhpMnNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXUxeGkyc19sb2FkKTsKK21vZHVsZV9leGl0KGF1MXhpMnNfdW5sb2FkKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTEwMDAvMTUwMC8xMTAwIEkyUyBBU29DIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFudWVsIExhdXNzIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXUxeC9wc2MtYWM5Ny5jIGIvc291bmQvc29jL2F1MXgvcHNjLWFjOTcuYwppbmRleCBkMGRiNjZmLi4wYzZhY2Q1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXUxeC9wc2MtYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9hdTF4L3BzYy1hYzk3LmMKQEAgLTQxLDE0ICs0MSwxNCBAQAogCShTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNCRSkKIAogI2RlZmluZSBBQzk3UENSX1NUQVJUKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0FDOTdQQ1JfVFMgOiBQU0NfQUM5N1BDUl9SUykKKwkoKHN0eXBlKSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gUFNDX0FDOTdQQ1JfVFMgOiBQU0NfQUM5N1BDUl9SUykKICNkZWZpbmUgQUM5N1BDUl9TVE9QKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0FDOTdQQ1JfVFAgOiBQU0NfQUM5N1BDUl9SUCkKKwkoKHN0eXBlKSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gUFNDX0FDOTdQQ1JfVFAgOiBQU0NfQUM5N1BDUl9SUCkKICNkZWZpbmUgQUM5N1BDUl9DTFJGSUZPKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0FDOTdQQ1JfVEMgOiBQU0NfQUM5N1BDUl9SQykKKwkoKHN0eXBlKSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gUFNDX0FDOTdQQ1JfVEMgOiBQU0NfQUM5N1BDUl9SQykKIAogI2RlZmluZSBBQzk3U1RBVF9CVVNZKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0FDOTdTVEFUX1RCIDogUFNDX0FDOTdTVEFUX1JCKQorCSgoc3R5cGUpID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyBQU0NfQUM5N1NUQVRfVEIgOiBQU0NfQUM5N1NUQVRfUkIpCiAKIC8qIGluc3RhbmNlIGRhdGEuIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSwgTWFjTGVvZCEhISEgKi8KIHN0YXRpYyBzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICphdTF4cHNjX2FjOTdfd29ya2RhdGE7CkBAIC0yMTUsNyArMjE1LDcgQEAKIHsKIAlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpwc2NkYXRhID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKIAl1bnNpZ25lZCBsb25nIHIsIHJvLCBzdGF0OwotCWludCBjaGFucywgdCwgc3R5cGUgPSBTVUJTVFJFQU1fVFlQRShzdWJzdHJlYW0pOworCWludCBjaGFucywgdCwgc3R5cGUgPSBzdWJzdHJlYW0tPnN0cmVhbTsKIAogCWNoYW5zID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CiAKQEAgLTIzNSw3ICsyMzUsNyBAQAogCQlyIHw9IFBTQ19BQzk3Q0ZHX1NFVF9MRU4ocGFyYW1zLT5tc2JpdHMpOwogCiAJCS8qIGNoYW5uZWxzOiBlbmFibGUgc2xvdHMgZm9yIGZyb250IEwvUiBjaGFubmVsICovCi0JCWlmIChzdHlwZSA9PSBQQ01fVFgpIHsKKwkJaWYgKHN0eXBlID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJCXIgJj0gflBTQ19BQzk3Q0ZHX1RYU0xPVF9NQVNLOwogCQkJciB8PSBQU0NfQUM5N0NGR19UWFNMT1RfRU5BKDMpOwogCQkJciB8PSBQU0NfQUM5N0NGR19UWFNMT1RfRU5BKDQpOwpAQCAtMjk0LDcgKzI5NCw3IEBACiAJCQkJaW50IGNtZCwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqcHNjZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0JaW50IHJldCwgc3R5cGUgPSBTVUJTVFJFQU1fVFlQRShzdWJzdHJlYW0pOworCWludCByZXQsIHN0eXBlID0gc3Vic3RyZWFtLT5zdHJlYW07CiAKIAlyZXQgPSAwOwogCkBAIC0zMjQsMTIgKzMyNCwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYXUxeHBzY19hYzk3X3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqcHNjZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLCAmcHNjZGF0YS0+ZG1haWRzWzBdKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhdTF4cHNjX2FjOTdfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CiAJcmV0dXJuIGF1MXhwc2NfYWM5N193b3JrZGF0YSA/IDAgOiAtRU5PREVWOwogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhdTF4cHNjX2FjOTdfZGFpX29wcyA9IHsKKwkuc3RhcnR1cAk9IGF1MXhwc2NfYWM5N19zdGFydHVwLAogCS50cmlnZ2VyCT0gYXUxeHBzY19hYzk3X3RyaWdnZXIsCiAJLmh3X3BhcmFtcwk9IGF1MXhwc2NfYWM5N19od19wYXJhbXMsCiB9OwpAQCAtMzU1LDcgKzM2NCw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTF4cHNjX2FjOTdfZHJ2cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzLCAqZG1hcmVzOwogCXVuc2lnbmVkIGxvbmcgc2VsOwogCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKndkOwogCkBAIC0zNjUsMjAgKzM3NCwzMSBAQAogCiAJbXV0ZXhfaW5pdCgmd2QtPmxvY2spOwogCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyKSB7CisJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaW9yZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQwOwogCX0KIAogCXJldCA9IC1FQlVTWTsKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSwgcGRldi0+bmFtZSkpCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSwKKwkJCQlwZGV2LT5uYW1lKSkKIAkJZ290byBvdXQwOwogCi0Jd2QtPm1taW8gPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwl3ZC0+bW1pbyA9IGlvcmVtYXAoaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CiAJaWYgKCF3ZC0+bW1pbykKIAkJZ290byBvdXQxOwogCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCXdkLT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSBkbWFyZXMtPnN0YXJ0OworCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCXdkLT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGRtYXJlcy0+c3RhcnQ7CisKIAkvKiBjb25maWd1cmF0aW9uOiBtYXggZG1hIHRyaWdnZXIgdGhyZXNob2xkLCBlbmFibGUgYWM5NyAqLwogCXdkLT5jZmcgPSBQU0NfQUM5N0NGR19SVF9GSUZPOCB8IFBTQ19BQzk3Q0ZHX1RUX0ZJRk84IHwKIAkJICBQU0NfQUM5N0NGR19ERV9FTkFCTEU7CkBAIC00MDEsMTcgKzQyMSwxNSBAQAogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldiwgJndkLT5kYWlfZHJ2KTsKIAlpZiAocmV0KQotCQlnb3RvIG91dDE7CisJCWdvdG8gb3V0MjsKIAotCXdkLT5kbWFwZCA9IGF1MXhwc2NfcGNtX2FkZChwZGV2KTsKLQlpZiAod2QtPmRtYXBkKSB7Ci0JCWF1MXhwc2NfYWM5N193b3JrZGF0YSA9IHdkOwotCQlyZXR1cm4gMDsKLQl9CisJYXUxeHBzY19hYzk3X3dvcmtkYXRhID0gd2Q7CisJcmV0dXJuIDA7CiAKLQlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYpOworb3V0MjoKKwlpb3VubWFwKHdkLT5tbWlvKTsKIG91dDE6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CiBvdXQwOgogCWtmcmVlKHdkKTsKIAlyZXR1cm4gcmV0OwpAQCAtNDIyLDkgKzQ0MCw2IEBACiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqd2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCi0JaWYgKHdkLT5kbWFwZCkKLQkJYXUxeHBzY19wY21fZGVzdHJveSh3ZC0+ZG1hcGQpOwotCiAJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKIAogCS8qIGRpc2FibGUgUFNDIGNvbXBsZXRlbHkgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L3BzYy1pMnMuYyBiL3NvdW5kL3NvYy9hdTF4L3BzYy1pMnMuYwppbmRleCBmY2EwOTEyLi5lMDNjNWNlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXUxeC9wc2MtaTJzLmMKKysrIGIvc291bmQvc29jL2F1MXgvcHNjLWkycy5jCkBAIC00MiwxMyArNDIsMTMgQEAKIAkoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKIAogI2RlZmluZSBJMlNTVEFUX0JVU1koc3R5cGUpCVwKLQkoKHN0eXBlKSA9PSBQQ01fVFggPyBQU0NfSTJTU1RBVF9UQiA6IFBTQ19JMlNTVEFUX1JCKQorCSgoc3R5cGUpID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyBQU0NfSTJTU1RBVF9UQiA6IFBTQ19JMlNTVEFUX1JCKQogI2RlZmluZSBJMlNQQ1JfU1RBUlQoc3R5cGUpCVwKLQkoKHN0eXBlKSA9PSBQQ01fVFggPyBQU0NfSTJTUENSX1RTIDogUFNDX0kyU1BDUl9SUykKKwkoKHN0eXBlKSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gUFNDX0kyU1BDUl9UUyA6IFBTQ19JMlNQQ1JfUlMpCiAjZGVmaW5lIEkyU1BDUl9TVE9QKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0kyU1BDUl9UUCA6IFBTQ19JMlNQQ1JfUlApCisJKChzdHlwZSkgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IFBTQ19JMlNQQ1JfVFAgOiBQU0NfSTJTUENSX1JQKQogI2RlZmluZSBJMlNQQ1JfQ0xSRklGTyhzdHlwZSkJXAotCSgoc3R5cGUpID09IFBDTV9UWCA/IFBTQ19JMlNQQ1JfVEMgOiBQU0NfSTJTUENSX1JDKQorCSgoc3R5cGUpID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyBQU0NfSTJTUENSX1RDIDogUFNDX0kyU1BDUl9SQykKIAogCiBzdGF0aWMgaW50IGF1MXhwc2NfaTJzX3NldF9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpLApAQCAtMjQwLDcgKzI0MCw3IEBACiAJCQkgICAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqcHNjZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0JaW50IHJldCwgc3R5cGUgPSBTVUJTVFJFQU1fVFlQRShzdWJzdHJlYW0pOworCWludCByZXQsIHN0eXBlID0gc3Vic3RyZWFtLT5zdHJlYW07CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CkBAIC0yNTcsNyArMjU3LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBhdTF4cHNjX2kyc19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKnBzY2RhdGEgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCXNuZF9zb2NfZGFpX3NldF9kbWFfZGF0YShkYWksIHN1YnN0cmVhbSwgJnBzY2RhdGEtPmRtYWlkc1swXSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGF1MXhwc2NfaTJzX2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAJPSBhdTF4cHNjX2kyc19zdGFydHVwLAogCS50cmlnZ2VyCT0gYXUxeHBzY19pMnNfdHJpZ2dlciwKIAkuaHdfcGFyYW1zCT0gYXUxeHBzY19pMnNfaHdfcGFyYW1zLAogCS5zZXRfZm10CT0gYXUxeHBzY19pMnNfc2V0X2ZtdCwKQEAgLTI4MSw3ICsyOTAsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTF4cHNjX2kyc19kcnZwcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzLCAqZG1hcmVzOwogCXVuc2lnbmVkIGxvbmcgc2VsOwogCWludCByZXQ7CiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqd2Q7CkBAIC0yOTAsMjAgKzI5OSwzMSBAQAogCWlmICghd2QpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyKSB7CisJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaW9yZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQwOwogCX0KIAogCXJldCA9IC1FQlVTWTsKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSwgcGRldi0+bmFtZSkpCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSwKKwkJCQlwZGV2LT5uYW1lKSkKIAkJZ290byBvdXQwOwogCi0Jd2QtPm1taW8gPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwl3ZC0+bW1pbyA9IGlvcmVtYXAoaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CiAJaWYgKCF3ZC0+bW1pbykKIAkJZ290byBvdXQxOwogCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCXdkLT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSBkbWFyZXMtPnN0YXJ0OworCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCXdkLT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGRtYXJlcy0+c3RhcnQ7CisKIAkvKiBwcmVzZXJ2ZSBQU0MgY2xvY2sgc291cmNlIHNldCB1cCBieSBwbGF0Zm9ybSAoZGV2LnBsYXRmb3JtX2RhdGEKIAkgKiBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5IHNvYyBsYXllcikKIAkgKi8KQEAgLTMzMCwxNyArMzUwLDEzIEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgd2QpOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldiwgJndkLT5kYWlfZHJ2KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDE7Ci0KLQkvKiBmaW5hbGx5IGFkZCB0aGUgRE1BIGRldmljZSBmb3IgdGhpcyBQU0MgKi8KLQl3ZC0+ZG1hcGQgPSBhdTF4cHNjX3BjbV9hZGQocGRldik7Ci0JaWYgKHdkLT5kbWFwZCkKKwlpZiAoIXJldCkKIAkJcmV0dXJuIDA7CiAKLQlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYpOworb3V0MjoKKwlpb3VubWFwKHdkLT5tbWlvKTsKIG91dDE6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CiBvdXQwOgogCWtmcmVlKHdkKTsKIAlyZXR1cm4gcmV0OwpAQCAtMzUxLDkgKzM2Nyw2IEBACiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqd2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCi0JaWYgKHdkLT5kbWFwZCkKLQkJYXUxeHBzY19wY21fZGVzdHJveSh3ZC0+ZG1hcGQpOwotCiAJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKIAogCWF1X3dyaXRlbCgwLCBJMlNfQ0ZHKHdkKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXUxeC9wc2MuaCBiL3NvdW5kL3NvYy9hdTF4L3BzYy5oCmluZGV4IGIzMGVhZGQuLmIxNmIyZTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdTF4L3BzYy5oCisrKyBiL3NvdW5kL3NvYy9hdTF4L3BzYy5oCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIEF1MTJ4MC9BdTE1NTAgUFNDIEFMU0EgQVNvQyBhdWRpbyBzdXBwb3J0LgorICogQWxjaGVteSBBTFNBIEFTb0MgYXVkaW8gc3VwcG9ydC4KICAqCi0gKiAoYykgMjAwNy0yMDA4IE1TQyBWZXJ0cmllYnNnZXMubS5iLkguLAorICogKGMpIDIwMDctMjAxMSBNU0MgVmVydHJpZWJzZ2VzLm0uYi5ILiwKICAqCU1hbnVlbCBMYXVzcyA8bWFudWVsLmxhdXNzQGdtYWlsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMTMsMTAgKzEzLDYgQEAKICNpZm5kZWYgX0FVMVhfUENNX0gKICNkZWZpbmUgX0FVMVhfUENNX0gKIAotLyogREJETUEgaGVscGVycyAqLwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF1MXhwc2NfcGNtX2FkZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLWV4dGVybiB2b2lkIGF1MXhwc2NfcGNtX2Rlc3Ryb3koc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZG1hcGQpOwotCiBzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhIHsKIAl2b2lkIF9faW9tZW0gKm1taW87CiAKQEAgLTI3LDE1ICsyMyw5IEBACiAKIAl1bnNpZ25lZCBsb25nIHBtWzJdOwogCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRtYXBkOworCWludCBkbWFpZHNbMl07CiB9OwogCi0jZGVmaW5lIFBDTV9UWAkwCi0jZGVmaW5lIFBDTV9SWAkxCi0KLSNkZWZpbmUgU1VCU1RSRUFNX1RZUEUoc3Vic3RyZWFtKSBcCi0JKChzdWJzdHJlYW0pLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IFBDTV9UWCA6IFBDTV9SWCkKLQogLyogZWFzeSBhY2Nlc3MgbWFjcm9zICovCiAjZGVmaW5lIFBTQ19DVFJMKHgpCSgodW5zaWduZWQgbG9uZykoKHgpLT5tbWlvKSArIFBTQ19DVFJMX09GRlNFVCkKICNkZWZpbmUgUFNDX1NFTCh4KQkoKHVuc2lnbmVkIGxvbmcpKCh4KS0+bW1pbykgKyBQU0NfU0VMX09GRlNFVCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnIGIvc291bmQvc29jL2JsYWNrZmluL0tjb25maWcKaW5kZXggZmU5ZDU0OC4uOWY2YmM1NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2JsYWNrZmluL0tjb25maWcKKysrIGIvc291bmQvc29jL2JsYWNrZmluL0tjb25maWcKQEAgLTI3LDYgKzI3LDE5IEBACiAJICBib2FyZCBjb25uZWN0ZWQgdG8gb25lIG9mIHRoZSBCbGFja2ZpbiBldmFsdWF0aW9uIGJvYXJkcyBsaWtlIHRoZQogCSAgQkY1WFgtU1RBTVAgb3IgQkY1WFgtRVpLSVQuCiAKK2NvbmZpZyBTTkRfU09DX0JGSU5fRVZBTF9BREFVMTM3MworCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgRVZBTC1BREFVMTM3MyBib2FyZCBvbiBCbGFja2ZpbiBldmFsIGJvYXJkcyIKKwlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMgJiYgSTJDCisJc2VsZWN0IFNORF9CRjVYWF9TT0NfSTJTCisJc2VsZWN0IFNORF9TT0NfQURBVTEzNzMKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzIEVWQUwtQURBVTEzNzMKKwkgIGJvYXJkIGNvbm5lY3RlZCB0byBvbmUgb2YgdGhlIEJsYWNrZmluIGV2YWx1YXRpb24gYm9hcmRzIGxpa2UgdGhlCisJICBCRjVYWC1TVEFNUCBvciBCRjVYWC1FWktJVC4KKworCSAgTm90ZTogVGhpcyBkcml2ZXIgYXNzdW1lcyB0aGF0IGZpcnN0IEFEQVUxMzczIERBSSBpcyBjb25uZWN0ZWQgdG8gdGhlCisJICBmaXJzdCBTUE9SVCBwb3J0IG9uIHRoZSBCRjVYWCBib2FyZC4KKwogY29uZmlnIFNORF9TT0NfQkZJTl9FVkFMX0FEQVY4MFgKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdGhlIEVWQUwtQURBVjgwWCBib2FyZHMgb24gQmxhY2tmaW4gZXZhbCBib2FyZHMiCiAJZGVwZW5kcyBvbiBTTkRfQkY1WFhfSTJTICYmIChTUElfTUFTVEVSIHx8IEkyQykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9NYWtlZmlsZSBiL3NvdW5kL3NvYy9ibGFja2Zpbi9NYWtlZmlsZQppbmRleCA2MDE4YmY1Li4xYmY4NmNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2JsYWNrZmluL01ha2VmaWxlCkBAIC0yMSw2ICsyMSw3IEBACiBzbmQtc3NtMjYwMi1vYmpzIDo9IGJmNXh4LXNzbTI2MDIubwogc25kLWFkNzMzMTEtb2JqcyA6PSBiZjV4eC1hZDczMzExLm8KIHNuZC1hZDE5M3gtb2JqcyA6PSBiZjV4eC1hZDE5M3gubworc25kLXNvYy1iZmluLWV2YWwtYWRhdTEzNzMtb2JqcyA6PSBiZmluLWV2YWwtYWRhdTEzNzMubwogc25kLXNvYy1iZmluLWV2YWwtYWRhdTE3MDEtb2JqcyA6PSBiZmluLWV2YWwtYWRhdTE3MDEubwogc25kLXNvYy1iZmluLWV2YWwtYWRhdjgweC1vYmpzIDo9IGJmaW4tZXZhbC1hZGF2ODB4Lm8KIApAQCAtMjksNSArMzAsNiBAQAogb2JqLSQoQ09ORklHX1NORF9CRjVYWF9TT0NfU1NNMjYwMikgKz0gc25kLXNzbTI2MDIubwogb2JqLSQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQ3MzMxMSkgKz0gc25kLWFkNzMzMTEubwogb2JqLSQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxOTNYKSArPSBzbmQtYWQxOTN4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX0JGSU5fRVZBTF9BREFVMTM3MykgKz0gc25kLXNvYy1iZmluLWV2YWwtYWRhdTEzNzMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQkZJTl9FVkFMX0FEQVUxNzAxKSArPSBzbmQtc29jLWJmaW4tZXZhbC1hZGF1MTcwMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19CRklOX0VWQUxfQURBVjgwWCkgKz0gc25kLXNvYy1iZmluLWV2YWwtYWRhdjgweC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWM5Ny1wY20uYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCmluZGV4IDllNTlmNjguLjU2ODE1YzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCkBAIC00MTgsNyArNDE4LDcgQEAKIAogc3RhdGljIHU2NCBiZjV4eF9wY21fZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLWludCBiZjV4eF9wY21fYWM5N19uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX2FjOTdfbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtaTJzLXBjbS5jCmluZGV4IDYxZGRmOTQuLjc1NjVlMTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy1wY20uYwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAKIHN0YXRpYyB1NjQgYmY1eHhfcGNtX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1pbnQgYmY1eHhfcGNtX2kyc19uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX2kyc19uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LXNwb3J0LmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuYwppbmRleCBhMmQ0MDM0Li4yZmQ5ZjJhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuYworKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF1MTM3My5jIGIvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF1MTM3My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjJhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmZpbi1ldmFsLWFkYXUxMzczLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBNYWNoaW5lIGRyaXZlciBmb3IgRVZBTC1BREFVMTM3MyBvbiBBbmFsb2cgRGV2aWNlcyBiZmluCisgKiBldmFsdWF0aW9uIGJvYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKworI2luY2x1ZGUgIi4uL2NvZGVjcy9hZGF1MTM3My5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYmZpbl9ldmFsX2FkYXUxMzczX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEluMSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEluMiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEluMyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEluNCIsIE5VTEwpLAorCisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmUgT3V0MSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIE91dDIiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTElORSgiU3RlcmVvIE91dCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0hQKCJFYXJwaWVjZSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJmaW5fZXZhbF9hZGF1MTM3M19kYXBtX3JvdXRlc1tdID0geworCXsgIkFJTjFMIiwgTlVMTCwgIkxpbmUgSW4xIiB9LAorCXsgIkFJTjFSIiwgTlVMTCwgIkxpbmUgSW4xIiB9LAorCXsgIkFJTjJMIiwgTlVMTCwgIkxpbmUgSW4yIiB9LAorCXsgIkFJTjJSIiwgTlVMTCwgIkxpbmUgSW4yIiB9LAorCXsgIkFJTjNMIiwgTlVMTCwgIkxpbmUgSW4zIiB9LAorCXsgIkFJTjNSIiwgTlVMTCwgIkxpbmUgSW4zIiB9LAorCXsgIkFJTjRMIiwgTlVMTCwgIkxpbmUgSW40IiB9LAorCXsgIkFJTjRSIiwgTlVMTCwgIkxpbmUgSW40IiB9LAorCisJLyogTUlDQklBUyBjYW4gYmUgY29ubmVjdGVkIHZpYSBhIGp1bXBlciB0byB0aGUgbGluZS1pbiBqYWNrLCBzaW5jZSB3CisJICAgZG9uJ3Qga25vdyB3aGljaCBvbmUgaXMgZ29pbmcgdG8gYmUgdXNlZCwganVzdCBwb3dlciBib3RoLiAqLworCXsgIkxpbmUgSW4xIiwgTlVMTCwgIk1JQ0JJQVMxIiB9LAorCXsgIkxpbmUgSW4yIiwgTlVMTCwgIk1JQ0JJQVMxIiB9LAorCXsgIkxpbmUgSW4zIiwgTlVMTCwgIk1JQ0JJQVMxIiB9LAorCXsgIkxpbmUgSW40IiwgTlVMTCwgIk1JQ0JJQVMxIiB9LAorCXsgIkxpbmUgSW4xIiwgTlVMTCwgIk1JQ0JJQVMyIiB9LAorCXsgIkxpbmUgSW4yIiwgTlVMTCwgIk1JQ0JJQVMyIiB9LAorCXsgIkxpbmUgSW4zIiwgTlVMTCwgIk1JQ0JJQVMyIiB9LAorCXsgIkxpbmUgSW40IiwgTlVMTCwgIk1JQ0JJQVMyIiB9LAorCisJeyAiTGluZSBPdXQxIiwgTlVMTCwgIkxPVVQxTCIgfSwKKwl7ICJMaW5lIE91dDEiLCBOVUxMLCAiTE9VVDFSIiB9LAorCXsgIkxpbmUgT3V0MiIsIE5VTEwsICJMT1VUMkwiIH0sCisJeyAiTGluZSBPdXQyIiwgTlVMTCwgIkxPVVQyUiIgfSwKKwl7ICJIZWFkcGhvbmUiLCBOVUxMLCAiSFBMIiB9LAorCXsgIkhlYWRwaG9uZSIsIE5VTEwsICJIUFIiIH0sCisJeyAiRWFycGllY2UiLCBOVUxMLCAiRVAiIH0sCisJeyAiU3BlYWtlciIsIE5VTEwsICJTUEtMIiB9LAorCXsgIlN0ZXJlbyBPdXQiLCBOVUxMLCAiU1BLUiIgfSwKK307CisKK3N0YXRpYyBpbnQgYmZpbl9ldmFsX2FkYXUxMzczX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKwlpbnQgcGxsX3JhdGU7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CisJCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgNDgwMDA6CisJY2FzZSA4MDAwOgorCWNhc2UgMTIwMDA6CisJY2FzZSAxNjAwMDoKKwljYXNlIDI0MDAwOgorCWNhc2UgMzIwMDA6CisJCXBsbF9yYXRlID0gNDgwMDAgKiAxMDI0OworCQlicmVhazsKKwljYXNlIDQ0MTAwOgorCWNhc2UgNzM1MDoKKwljYXNlIDExMDI1OgorCWNhc2UgMTQ3MDA6CisJY2FzZSAyMjA1MDoKKwljYXNlIDI5NDAwOgorCQlwbGxfcmF0ZSA9IDQ0MTAwICogMTAyNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIEFEQVUxMzczX1BMTDEsCisJCQlBREFVMTM3M19QTExfU1JDX01DTEsxLCAxMjI4ODAwMCwgcGxsX3JhdGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgQURBVTEzNzNfQ0xLX1NSQ19QTEwxLCBwbGxfcmF0ZSwKKwkJCVNORF9TT0NfQ0xPQ0tfSU4pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiZmluX2V2YWxfYWRhdTEzNzNfY29kZWNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJdW5zaWduZWQgaW50IHBsbF9yYXRlID0gNDgwMDAgKiAxMDI0OworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgQURBVTEzNzNfUExMMSwKKwkJCUFEQVUxMzczX1BMTF9TUkNfTUNMSzEsIDEyMjg4MDAwLCBwbGxfcmF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBBREFVMTM3M19DTEtfU1JDX1BMTDEsIHBsbF9yYXRlLAorCQkJU05EX1NPQ19DTE9DS19JTik7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBiZmluX2V2YWxfYWRhdTEzNzNfb3BzID0geworCS5od19wYXJhbXMgPSBiZmluX2V2YWxfYWRhdTEzNzNfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGJmaW5fZXZhbF9hZGF1MTM3M19kYWkgPSB7CisJLm5hbWUgPSAiYWRhdTEzNzMiLAorCS5zdHJlYW1fbmFtZSA9ICJhZGF1MTM3MyIsCisJLmNwdV9kYWlfbmFtZSA9ICJiZmluLWkycy4wIiwKKwkuY29kZWNfZGFpX25hbWUgPSAiYWRhdTEzNzMtYWlmMSIsCisJLnBsYXRmb3JtX25hbWUgPSAiYmZpbi1pMnMtcGNtLWF1ZGlvIiwKKwkuY29kZWNfbmFtZSA9ICJhZGF1MTM3My4wLTAwMWEiLAorCS5vcHMgPSAmYmZpbl9ldmFsX2FkYXUxMzczX29wcywKKwkuaW5pdCA9IGJmaW5fZXZhbF9hZGF1MTM3M19jb2RlY19pbml0LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYmZpbl9ldmFsX2FkYXUxMzczID0geworCS5uYW1lID0gImJmaW4tZXZhbC1hZGF1MTM3MyIsCisJLmRhaV9saW5rID0gJmJmaW5fZXZhbF9hZGF1MTM3M19kYWksCisJLm51bV9saW5rcyA9IDEsCisKKwkuZGFwbV93aWRnZXRzCQk9IGJmaW5fZXZhbF9hZGF1MTM3M19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGJmaW5fZXZhbF9hZGF1MTM3M19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcwkJPSBiZmluX2V2YWxfYWRhdTEzNzNfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYmZpbl9ldmFsX2FkYXUxMzczX2RhcG1fcm91dGVzKSwKK307CisKK3N0YXRpYyBpbnQgYmZpbl9ldmFsX2FkYXUxMzczX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZiZmluX2V2YWxfYWRhdTEzNzM7CisKKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmYmZpbl9ldmFsX2FkYXUxMzczKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYmZpbl9ldmFsX2FkYXUxMzczX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJmaW5fZXZhbF9hZGF1MTM3M19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYmZpbi1ldmFsLWFkYXUxMzczIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzbmRfc29jX3BtX29wcywKKwl9LAorCS5wcm9iZSA9IGJmaW5fZXZhbF9hZGF1MTM3M19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYmZpbl9ldmFsX2FkYXUxMzczX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiZmluX2V2YWxfYWRhdTEzNzNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmJmaW5fZXZhbF9hZGF1MTM3M19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYmZpbl9ldmFsX2FkYXUxMzczX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYmZpbl9ldmFsX2FkYXUxMzczX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYmZpbl9ldmFsX2FkYXUxMzczX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChiZmluX2V2YWxfYWRhdTEzNzNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBiZmluIGFkYXUxMzczIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpiZmluLWV2YWwtYWRhdTEzNzMiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZmluLWV2YWwtYWRhdjgweC5jIGIvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF2ODB4LmMKaW5kZXggOGQwMTRkMC4uODk3Y2ZhNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF2ODB4LmMKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF2ODB4LmMKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMgYi9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMKaW5kZXggMTkyNDE1Ny4uNWNhMTIyZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC84OHBtODYweC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC03NzIsMTEgKzc3MywxMiBAQAogCiAKIAlTTkRfU09DX0RBUE1fQUlGX0lOKCJJMlMgRElOIiwgIkkyUyBQbGF5YmFjayIsIDAsCi0JCQkgICAgUE04NjBYX0RBQ19FTl8yLCAwLCAwKSwKKwkJCSAgICBTTkRfU09DX05PUE0sIDAsIDApLAogCVNORF9TT0NfREFQTV9BSUZfSU4oIkkyUyBESU4xIiwgIkkyUyBQbGF5YmFjayIsIDAsCi0JCQkgICAgUE04NjBYX0RBQ19FTl8yLCAwLCAwKSwKKwkJCSAgICBTTkRfU09DX05PUE0sIDAsIDApLAogCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJMlMgRE9VVCIsICJJMlMgQ2FwdHVyZSIsIDAsCiAJCQkgICAgIFBNODYwWF9JMlNfSUZBQ0VfMywgNSwgMSksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiSTJTIENMSyIsIFBNODYwWF9EQUNfRU5fMiwgMCwgMCwgTlVMTCwgMCksCiAJU05EX1NPQ19EQVBNX01VWCgiSTJTIE1pYyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpMnNfbWljX211eCksCiAJU05EX1NPQ19EQVBNX01VWCgiQURDIExlZnQgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmYWRjbF9tdXgpLAogCVNORF9TT0NfREFQTV9NVVgoIkFEQyBSaWdodCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZhZGNyX211eCksCkBAIC04NjgsNiArODcwLDExIEBACiAJeyJMZWZ0IEFEQyIsIE5VTEwsICJMZWZ0IEFEQyBNT0QifSwKIAl7IlJpZ2h0IEFEQyIsIE5VTEwsICJSaWdodCBBREMgTU9EIn0sCiAKKwkvKiBJMlMgQ2xvY2sgKi8KKwl7IkkyUyBESU4iLCBOVUxMLCAiSTJTIENMSyJ9LAorCXsiSTJTIERJTjEiLCBOVUxMLCAiSTJTIENMSyJ9LAorCXsiSTJTIERPVVQiLCBOVUxMLCAiSTJTIENMSyJ9LAorCiAJLyogUENNL0FJRjEgSW5wdXRzICovCiAJeyJQQ00gU0RPIiwgTlVMTCwgIkFEQyBMZWZ0IE11eCJ9LAogCXsiUENNIFNETyIsIE5VTEwsICJBRENSIEVDIE11eCJ9LApAQCAtMTE3Myw2ICsxMTgwLDkgQEAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQkvKiBFbmFibGUgQXVkaW8gUExMICYgQXVkaW8gc2VjdGlvbiAqLworCQkJZGF0YSA9IEFVRElPX1BMTCB8IEFVRElPX1NFQ1RJT05fT047CisJCQlwbTg2MHhfcmVnX3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIFJFR19NSVNDMiwgZGF0YSk7CisJCQl1ZGVsYXkoMzAwKTsKIAkJCWRhdGEgPSBBVURJT19QTEwgfCBBVURJT19TRUNUSU9OX1JFU0VUCiAJCQkJfCBBVURJT19TRUNUSU9OX09OOwogCQkJcG04NjB4X3JlZ193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBSRUdfTUlTQzIsIGRhdGEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCmluZGV4IDY2NWQ5MjQuLjQ1ODQ1MTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTE3LDYgKzE3LDcgQEAKIAlzZWxlY3QgU05EX1NPQ19BRDE5M1ggaWYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfU09DX0FEMTk4MCBpZiBTTkRfU09DX0FDOTdfQlVTCiAJc2VsZWN0IFNORF9TT0NfQUQ3MzMxMQorCXNlbGVjdCBTTkRfU09DX0FEQVUxMzczIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0FEQVY4MFgKIAlzZWxlY3QgU05EX1NPQ19BRFMxMTdYCiAJc2VsZWN0IFNORF9TT0NfQUs0MTA0IGlmIFNQSV9NQVNURVIKQEAgLTM5LDYgKzQwLDcgQEAKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODUwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX01BWDk4NzcgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfUENNMzAwOAorCXNlbGVjdCBTTkRfU09DX1JUNTYzMSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19TR1RMNTAwMCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19TTjk1MDMxIGlmIElOVEVMX1NDVV9JUEMKIAlzZWxlY3QgU05EX1NPQ19TUERJRgpAQCAtNDcsNyArNDksNyBAQAogCXNlbGVjdCBTTkRfU09DX1NUQUM5NzY2IGlmIFNORF9TT0NfQUM5N19CVVMKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyMyBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyNiBpZiBTUElfTUFTVEVSCi0Jc2VsZWN0IFNORF9TT0NfVFZMMzIwQUlDMzJYNCBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMzMlg0IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzNYIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1RQQTYxMzBBMiBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBEQUMzMyBpZiBJMkMKQEAgLTU4LDYgKzYwLDcgQEAKIAlzZWxlY3QgU05EX1NPQ19XTDEyNzMgaWYgTUZEX1dMMTI3M19DT1JFCiAJc2VsZWN0IFNORF9TT0NfV00xMjUwX0VWMSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19XTTIwMDAgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfV001MTAwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1dNODM1MCBpZiBNRkRfV004MzUwCiAJc2VsZWN0IFNORF9TT0NfV004NDAwIGlmIE1GRF9XTTg0MDAKIAlzZWxlY3QgU05EX1NPQ19XTTg1MTAgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQpAQCAtMTM5LDYgKzE0Miw5IEBACiAJc2VsZWN0IFNJR01BCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfQURBVTEzNzMKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19BREFWODBYCiAJdHJpc3RhdGUKIApAQCAtMjE0LDYgKzIyMCw5IEBACiBjb25maWcgU05EX1NPQ19QQ00zMDA4CiAgICAgICAgdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfUlQ1NjMxCisJdHJpc3RhdGUKKwogI0ZyZWVzY2FsZSBzZ3RsNTAwMCBjb2RlYwogY29uZmlnIFNORF9TT0NfU0dUTDUwMDAKIAl0cmlzdGF0ZQpAQCAtMjQwLDcgKzI0OSw3IEBACiAJdHJpc3RhdGUgIlRJIFRMVjMyMEFJQzI2IENvZGVjIHN1cHBvcnQiIGlmIFNORF9TT0NfT0ZfU0lNUExFCiAJZGVwZW5kcyBvbiBTUEkKIAotY29uZmlnIFNORF9TT0NfVFZMMzIwQUlDMzJYNAorY29uZmlnIFNORF9TT0NfVExWMzIwQUlDMzJYNAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzNYCkBAIC0yNjksNiArMjc4LDkgQEAKIGNvbmZpZyBTTkRfU09DX1dNMTI1MF9FVjEKIAl0cmlzdGF0ZQogCitjb25maWcgU05EX1NPQ19XTTUxMDAKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19XTTgzNTAKIAl0cmlzdGF0ZQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQppbmRleCA1MTE5YTdlLi5hMmM3ODQyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKQEAgLTUsNiArNSw3IEBACiBzbmQtc29jLWFkMTk4MC1vYmpzIDo9IGFkMTk4MC5vCiBzbmQtc29jLWFkNzMzMTEtb2JqcyA6PSBhZDczMzExLm8KIHNuZC1zb2MtYWRhdTE3MDEtb2JqcyA6PSBhZGF1MTcwMS5vCitzbmQtc29jLWFkYXUxMzczLW9ianMgOj0gYWRhdTEzNzMubwogc25kLXNvYy1hZGF2ODB4LW9ianMgOj0gYWRhdjgweC5vCiBzbmQtc29jLWFkczExN3gtb2JqcyA6PSBhZHMxMTd4Lm8KIHNuZC1zb2MtYWs0MTA0LW9ianMgOj0gYWs0MTA0Lm8KQEAgLTI1LDYgKzI2LDcgQEAKIHNuZC1zb2MtbWF4OTgwOTUtb2JqcyA6PSBtYXg5ODA5NS5vCiBzbmQtc29jLW1heDk4NTAtb2JqcyA6PSBtYXg5ODUwLm8KIHNuZC1zb2MtcGNtMzAwOC1vYmpzIDo9IHBjbTMwMDgubworc25kLXNvYy1ydDU2MzEtb2JqcyA6PSBydDU2MzEubwogc25kLXNvYy1zZ3RsNTAwMC1vYmpzIDo9IHNndGw1MDAwLm8KIHNuZC1zb2MtYWxjNTYyMy1vYmpzIDo9IGFsYzU2MjMubwogc25kLXNvYy1zbjk1MDMxLW9ianMgOj0gc245NTAzMS5vCkBAIC00Myw2ICs0NSw3IEBACiBzbmQtc29jLXVkYTEzODAtb2JqcyA6PSB1ZGExMzgwLm8KIHNuZC1zb2Mtd2wxMjczLW9ianMgOj0gd2wxMjczLm8KIHNuZC1zb2Mtd20xMjUwLWV2MS1vYmpzIDo9IHdtMTI1MC1ldjEubworc25kLXNvYy13bTUxMDAtb2JqcyA6PSB3bTUxMDAubyB3bTUxMDAtdGFibGVzLm8KIHNuZC1zb2Mtd204MzUwLW9ianMgOj0gd204MzUwLm8KIHNuZC1zb2Mtd204NDAwLW9ianMgOj0gd204NDAwLm8KIHNuZC1zb2Mtd204NTEwLW9ianMgOj0gd204NTEwLm8KQEAgLTEwMCw2ICsxMDMsNyBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfQUQxOTNYKQkrPSBzbmQtc29jLWFkMTkzeC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRDE5ODApCSs9IHNuZC1zb2MtYWQxOTgwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FENzMzMTEpICs9IHNuZC1zb2MtYWQ3MzMxMS5vCitvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTM3MykJKz0gc25kLXNvYy1hZGF1MTM3My5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTcwMSkgICs9IHNuZC1zb2MtYWRhdTE3MDEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQURBVjgwWCkgICs9IHNuZC1zb2MtYWRhdjgweC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRFMxMTdYKQkrPSBzbmQtc29jLWFkczExN3gubwpAQCAtMTIzLDYgKzEyNyw3IEBACiBvYmotJChDT05GSUdfU05EX1NPQ19NQVg5ODA5NSkJKz0gc25kLXNvYy1tYXg5ODA5NS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19NQVg5ODUwKQkrPSBzbmQtc29jLW1heDk4NTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUENNMzAwOCkJKz0gc25kLXNvYy1wY20zMDA4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1JUNTYzMSkJKz0gc25kLXNvYy1ydDU2MzEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU0dUTDUwMDApICArPSBzbmQtc29jLXNndGw1MDAwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NOOTUwMzEpCSs9c25kLXNvYy1zbjk1MDMxLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NQRElGKQkrPSBzbmQtc29jLXNwZGlmLm8KQEAgLTEzMiw3ICsxMzcsNyBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMjMpCSs9IHNuZC1zb2MtdGx2MzIwYWljMjMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMjYpCSs9IHNuZC1zb2MtdGx2MzIwYWljMjYubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDM1gpCSs9IHNuZC1zb2MtdGx2MzIwYWljM3gubwotb2JqLSQoQ09ORklHX1NORF9TT0NfVFZMMzIwQUlDMzJYNCkgICAgICs9IHNuZC1zb2MtdGx2MzIwYWljMzJ4NC5vCitvYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzMlg0KSAgICAgKz0gc25kLXNvYy10bHYzMjBhaWMzMng0Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMERBQzMzKQkrPSBzbmQtc29jLXRsdjMyMGRhYzMzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RXTDQwMzApCSs9IHNuZC1zb2MtdHdsNDAzMC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19UV0w2MDQwKQkrPSBzbmQtc29jLXR3bDYwNDAubwpAQCAtMTQwLDYgKzE0NSw3IEBACiBvYmotJChDT05GSUdfU05EX1NPQ19VREExMzgwKQkrPSBzbmQtc29jLXVkYTEzODAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV0wxMjczKQkrPSBzbmQtc29jLXdsMTI3My5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTEyNTBfRVYxKSArPSBzbmQtc29jLXdtMTI1MC1ldjEubworb2JqLSQoQ09ORklHX1NORF9TT0NfV001MTAwKQkrPSBzbmQtc29jLXdtNTEwMC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTgzNTApCSs9IHNuZC1zb2Mtd204MzUwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODQwMCkJKz0gc25kLXNvYy13bTg0MDAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004NTEwKQkrPSBzbmQtc29jLXdtODUxMC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCmluZGV4IDNjMDg3OTMuLmU3MTUxODYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYwppbmRleCBlZWRiNmY1Li4xMjA2MDIxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMKQEAgLTIzLDcgKzIzLDcgQEAKIAogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgYWQxOTN4X3ByaXYgewotCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlpbnQgc3lzY2xrOwogfTsKIApAQCAtMTAzLDEyICsxMDMsMTQgQEAKIHN0YXRpYyBpbnQgYWQxOTN4X211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Ci0JaW50IHJlZzsKIAotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUQxOTNYX0RBQ19DVFJMMik7Ci0JcmVnID0gKG11dGUgPiAwKSA/IHJlZyB8IEFEMTkzWF9EQUNfTUFTVEVSX01VVEUgOiByZWcgJgotCQkofkFEMTkzWF9EQUNfTUFTVEVSX01VVEUpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEMTkzWF9EQUNfQ1RSTDIsIHJlZyk7CisJaWYgKG11dGUpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTkzWF9EQUNfQ1RSTDIsCisJCQkJICAgIEFEMTkzWF9EQUNfTUFTVEVSX01VVEUsCisJCQkJICAgIEFEMTkzWF9EQUNfTUFTVEVSX01VVEUpOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUQxOTNYX0RBQ19DVFJMMiwKKwkJCQkgICAgQUQxOTNYX0RBQ19NQVNURVJfTVVURSwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2Miw3ICsyNjQsNyBAQAogCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0JaW50IHdvcmRfbGVuID0gMCwgcmVnID0gMCwgbWFzdGVyX3JhdGUgPSAwOworCWludCB3b3JkX2xlbiA9IDAsIG1hc3Rlcl9yYXRlID0gMDsKIAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwpAQCAtMjk3LDE4ICsyOTksMTUgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBBRDE5M1hfUExMX0NMS19DVFJMMCk7Ci0JcmVnID0gKHJlZyAmIEFEMTkzWF9QTExfSU5QVVRfTUFTSykgfCBtYXN0ZXJfcmF0ZTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBRDE5M1hfUExMX0NMS19DVFJMMCwgcmVnKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBRDE5M1hfUExMX0NMS19DVFJMMCwKKwkJCSAgICBBRDE5M1hfUExMX0lOUFVUX01BU0ssIG1hc3Rlcl9yYXRlKTsKIAotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUQxOTNYX0RBQ19DVFJMMik7Ci0JcmVnID0gKHJlZyAmICh+QUQxOTNYX0RBQ19XT1JEX0xFTl9NQVNLKSkKLQkJfCAod29yZF9sZW4gPDwgQUQxOTNYX0RBQ19XT1JEX0xFTl9TSEZUKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBRDE5M1hfREFDX0NUUkwyLCByZWcpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTkzWF9EQUNfQ1RSTDIsCisJCQkgICAgQUQxOTNYX0RBQ19XT1JEX0xFTl9NQVNLLAorCQkJICAgIHdvcmRfbGVuIDw8IEFEMTkzWF9EQUNfV09SRF9MRU5fU0hGVCk7CiAKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFEMTkzWF9BRENfQ1RSTDEpOwotCXJlZyA9IChyZWcgJiAofkFEMTkzWF9BRENfV09SRF9MRU5fTUFTSykpIHwgd29yZF9sZW47Ci0Jc25kX3NvY193cml0ZShjb2RlYywgQUQxOTNYX0FEQ19DVFJMMSwgcmVnKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBRDE5M1hfQURDX0NUUkwxLAorCQkJICAgIEFEMTkzWF9BRENfV09SRF9MRU5fTUFTSywgd29yZF9sZW4pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNDksMTAgKzM0OCw4IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKLQlpZiAoYWQxOTN4LT5jb250cm9sX3R5cGUgPT0gU05EX1NPQ19JMkMpCi0JCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBhZDE5M3gtPmNvbnRyb2xfdHlwZSk7Ci0JZWxzZQotCQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDgsIGFkMTkzeC0+Y29udHJvbF90eXBlKTsKKwljb2RlYy0+Y29udHJvbF9kYXRhID0gYWQxOTN4LT5yZWdtYXA7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDAsIDAsIFNORF9TT0NfUkVHTUFQKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJmYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC0zODgsNiArMzg1LDE0IEBACiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9zcGlfcmVnbWFwX2NvbmZpZyA9IHsKKwkudmFsX2JpdHMgPSA4LAorCS5yZWdfYml0cyA9IDE2LAorCS5yZWFkX2ZsYWdfbWFzayA9IDB4MDksCisJLndyaXRlX2ZsYWdfbWFzayA9IDB4MDgsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDE5M3hfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3g7CkBAIC0zOTcsMjAgKzQwMiwzNiBAQAogCWlmIChhZDE5M3ggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlhZDE5M3gtPnJlZ21hcCA9IHJlZ21hcF9pbml0X3NwaShzcGksICZhZDE5M3hfc3BpX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIoYWQxOTN4LT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIoYWQxOTN4LT5yZWdtYXApOworCQlnb3RvIGVycl9mcmVlOworCX0KKwogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGFkMTkzeCk7Ci0JYWQxOTN4LT5jb250cm9sX3R5cGUgPSBTTkRfU09DX1NQSTsKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZfYWQxOTN4LCAmYWQxOTN4X2RhaSwgMSk7CiAJaWYgKHJldCA8IDApCi0JCWtmcmVlKGFkMTkzeCk7CisJCWdvdG8gZXJyX3JlZ21hcF9leGl0OworCisJcmV0dXJuIDA7CisKK2Vycl9yZWdtYXBfZXhpdDoKKwlyZWdtYXBfZXhpdChhZDE5M3gtPnJlZ21hcCk7CitlcnJfZnJlZToKKwlrZnJlZShhZDE5M3gpOworCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgYWQxOTN4X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKKwlzdHJ1Y3QgYWQxOTN4X3ByaXYgKmFkMTkzeCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCiAJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZzcGktPmRldik7Ci0Ja2ZyZWUoc3BpX2dldF9kcnZkYXRhKHNwaSkpOworCXJlZ21hcF9leGl0KGFkMTkzeC0+cmVnbWFwKTsKKwlrZnJlZShhZDE5M3gpOwogCXJldHVybiAwOwogfQogCkBAIC00MjUsNiArNDQ2LDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9pMmNfcmVnbWFwX2NvbmZpZyA9IHsKKwkudmFsX2JpdHMgPSA4LAorCS5yZWdfYml0cyA9IDgsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQxOTN4X2lkW10gPSB7CiAJeyAiYWQxOTM2IiwgMCB9LAogCXsgImFkMTkzNyIsIDAgfSwKQEAgLTQ0MiwyMCArNDY5LDM1IEBACiAJaWYgKGFkMTkzeCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWFkMTkzeC0+cmVnbWFwID0gcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmFkMTkzeF9pMmNfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihhZDE5M3gtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihhZDE5M3gtPnJlZ21hcCk7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWQxOTN4KTsKLQlhZDE5M3gtPmNvbnRyb2xfdHlwZSA9IFNORF9TT0NfSTJDOwogCiAJcmV0ID0gIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZfYWQxOTN4LCAmYWQxOTN4X2RhaSwgMSk7CiAJaWYgKHJldCA8IDApCi0JCWtmcmVlKGFkMTkzeCk7CisJCWdvdG8gZXJyX3JlZ21hcF9leGl0OworCisJcmV0dXJuIDA7CisKK2Vycl9yZWdtYXBfZXhpdDoKKwlyZWdtYXBfZXhpdChhZDE5M3gtPnJlZ21hcCk7CitlcnJfZnJlZToKKwlrZnJlZShhZDE5M3gpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGFkMTkzeF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3ggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwogCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOwotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZWdtYXBfZXhpdChhZDE5M3gtPnJlZ21hcCk7CisJa2ZyZWUoYWQxOTN4KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmgKaW5kZXggY2NjYzJlOC4uMTUwN2VhYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5oCkBAIC05LDIwICs5LDIwIEBACiAjaWZuZGVmIF9fQUQxOTNYX0hfXwogI2RlZmluZSBfX0FEMTkzWF9IX18KIAotI2RlZmluZSBBRDE5M1hfUExMX0NMS19DVFJMMCAgICAweDgwMAorI2RlZmluZSBBRDE5M1hfUExMX0NMS19DVFJMMCAgICAweDAwCiAjZGVmaW5lIEFEMTkzWF9QTExfUE9XRVJET1dOICAgICAgICAgICAweDAxCi0jZGVmaW5lIEFEMTkzWF9QTExfSU5QVVRfTUFTSyAgICh+MHg2KQorI2RlZmluZSBBRDE5M1hfUExMX0lOUFVUX01BU0sgICAweDYKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF8yNTYgICAgKDAgPDwgMSkKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF8zODQgICAgKDEgPDwgMSkKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF81MTIgICAgKDIgPDwgMSkKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF83NjggICAgKDMgPDwgMSkKLSNkZWZpbmUgQUQxOTNYX1BMTF9DTEtfQ1RSTDEgICAgMHg4MDEKLSNkZWZpbmUgQUQxOTNYX0RBQ19DVFJMMCAgICAgICAgMHg4MDIKKyNkZWZpbmUgQUQxOTNYX1BMTF9DTEtfQ1RSTDEgICAgMHgwMQorI2RlZmluZSBBRDE5M1hfREFDX0NUUkwwICAgICAgICAweDAyCiAjZGVmaW5lIEFEMTkzWF9EQUNfUE9XRVJET1dOICAgICAgICAgICAweDAxCiAjZGVmaW5lIEFEMTkzWF9EQUNfU0VSRk1UX01BU0sJCTB4QzAKICNkZWZpbmUgQUQxOTNYX0RBQ19TRVJGTVRfU1RFUkVPCSgwIDw8IDYpCiAjZGVmaW5lIEFEMTkzWF9EQUNfU0VSRk1UX1RETQkJKDEgPDwgNikKLSNkZWZpbmUgQUQxOTNYX0RBQ19DVFJMMSAgICAgICAgMHg4MDMKKyNkZWZpbmUgQUQxOTNYX0RBQ19DVFJMMSAgICAgICAgMHgwMwogI2RlZmluZSBBRDE5M1hfREFDXzJfQ0hBTk5FTFMgICAwCiAjZGVmaW5lIEFEMTkzWF9EQUNfNF9DSEFOTkVMUyAgIDEKICNkZWZpbmUgQUQxOTNYX0RBQ184X0NIQU5ORUxTICAgMgpAQCAtMzMsMTEgKzMzLDExIEBACiAjZGVmaW5lIEFEMTkzWF9EQUNfQkNMS19NQVNURVIgICgxIDw8IDUpCiAjZGVmaW5lIEFEMTkzWF9EQUNfTEVGVF9ISUdIICAgICgxIDw8IDMpCiAjZGVmaW5lIEFEMTkzWF9EQUNfQkNMS19JTlYgICAgICgxIDw8IDcpCi0jZGVmaW5lIEFEMTkzWF9EQUNfQ1RSTDIgICAgICAgIDB4ODA0CisjZGVmaW5lIEFEMTkzWF9EQUNfQ1RSTDIgICAgICAgIDB4MDQKICNkZWZpbmUgQUQxOTNYX0RBQ19XT1JEX0xFTl9TSEZUICAgICAgICAzCiAjZGVmaW5lIEFEMTkzWF9EQUNfV09SRF9MRU5fTUFTSyAgICAgICAgMHgxOAogI2RlZmluZSBBRDE5M1hfREFDX01BU1RFUl9NVVRFICAxCi0jZGVmaW5lIEFEMTkzWF9EQUNfQ0hOTF9NVVRFICAgIDB4ODA1CisjZGVmaW5lIEFEMTkzWF9EQUNfQ0hOTF9NVVRFICAgIDB4MDUKICNkZWZpbmUgQUQxOTNYX0RBQ0wxX01VVEUgICAgICAgMAogI2RlZmluZSBBRDE5M1hfREFDUjFfTVVURSAgICAgICAxCiAjZGVmaW5lIEFEMTkzWF9EQUNMMl9NVVRFICAgICAgIDIKQEAgLTQ2LDI4ICs0NiwyOCBAQAogI2RlZmluZSBBRDE5M1hfREFDUjNfTVVURSAgICAgICA1CiAjZGVmaW5lIEFEMTkzWF9EQUNMNF9NVVRFICAgICAgIDYKICNkZWZpbmUgQUQxOTNYX0RBQ1I0X01VVEUgICAgICAgNwotI2RlZmluZSBBRDE5M1hfREFDX0wxX1ZPTCAgICAgICAweDgwNgotI2RlZmluZSBBRDE5M1hfREFDX1IxX1ZPTCAgICAgICAweDgwNwotI2RlZmluZSBBRDE5M1hfREFDX0wyX1ZPTCAgICAgICAweDgwOAotI2RlZmluZSBBRDE5M1hfREFDX1IyX1ZPTCAgICAgICAweDgwOQotI2RlZmluZSBBRDE5M1hfREFDX0wzX1ZPTCAgICAgICAweDgwYQotI2RlZmluZSBBRDE5M1hfREFDX1IzX1ZPTCAgICAgICAweDgwYgotI2RlZmluZSBBRDE5M1hfREFDX0w0X1ZPTCAgICAgICAweDgwYwotI2RlZmluZSBBRDE5M1hfREFDX1I0X1ZPTCAgICAgICAweDgwZAotI2RlZmluZSBBRDE5M1hfQURDX0NUUkwwICAgICAgICAweDgwZQorI2RlZmluZSBBRDE5M1hfREFDX0wxX1ZPTCAgICAgICAweDA2CisjZGVmaW5lIEFEMTkzWF9EQUNfUjFfVk9MICAgICAgIDB4MDcKKyNkZWZpbmUgQUQxOTNYX0RBQ19MMl9WT0wgICAgICAgMHgwOAorI2RlZmluZSBBRDE5M1hfREFDX1IyX1ZPTCAgICAgICAweDA5CisjZGVmaW5lIEFEMTkzWF9EQUNfTDNfVk9MICAgICAgIDB4MGEKKyNkZWZpbmUgQUQxOTNYX0RBQ19SM19WT0wgICAgICAgMHgwYgorI2RlZmluZSBBRDE5M1hfREFDX0w0X1ZPTCAgICAgICAweDBjCisjZGVmaW5lIEFEMTkzWF9EQUNfUjRfVk9MICAgICAgIDB4MGQKKyNkZWZpbmUgQUQxOTNYX0FEQ19DVFJMMCAgICAgICAgMHgwZQogI2RlZmluZSBBRDE5M1hfQURDX1BPV0VSRE9XTiAgICAgICAgICAgMHgwMQogI2RlZmluZSBBRDE5M1hfQURDX0hJR0hQQVNTX0ZJTFRFUgkxCiAjZGVmaW5lIEFEMTkzWF9BRENMMV9NVVRFIAkJMgogI2RlZmluZSBBRDE5M1hfQURDUjFfTVVURSAJCTMKICNkZWZpbmUgQUQxOTNYX0FEQ0wyX01VVEUgCQk0CiAjZGVmaW5lIEFEMTkzWF9BRENSMl9NVVRFIAkJNQotI2RlZmluZSBBRDE5M1hfQURDX0NUUkwxICAgICAgICAweDgwZgorI2RlZmluZSBBRDE5M1hfQURDX0NUUkwxICAgICAgICAweDBmCiAjZGVmaW5lIEFEMTkzWF9BRENfU0VSRk1UX01BU0sJCTB4NjAKICNkZWZpbmUgQUQxOTNYX0FEQ19TRVJGTVRfU1RFUkVPCSgwIDw8IDUpCiAjZGVmaW5lIEFEMTkzWF9BRENfU0VSRk1UX1RETQkJKDEgPDwgNSkKICNkZWZpbmUgQUQxOTNYX0FEQ19TRVJGTVRfQVVYCQkoMiA8PCA1KQogI2RlZmluZSBBRDE5M1hfQURDX1dPUkRfTEVOX01BU0sJMHgzCi0jZGVmaW5lIEFEMTkzWF9BRENfQ1RSTDIgICAgICAgIDB4ODEwCisjZGVmaW5lIEFEMTkzWF9BRENfQ1RSTDIgICAgICAgIDB4MTAKICNkZWZpbmUgQUQxOTNYX0FEQ18yX0NIQU5ORUxTICAgMAogI2RlZmluZSBBRDE5M1hfQURDXzRfQ0hBTk5FTFMgICAxCiAjZGVmaW5lIEFEMTkzWF9BRENfOF9DSEFOTkVMUyAgIDIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTk4MC5jCmluZGV4IDkyM2IzNjQuLmUzOTMxY2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5ODAuYwpAQCAtMTQ4LDcgKzE0OCw2IEBACiAJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAogCQkuZm9ybWF0cyA9IFNORF9TT0NfU1REX0FDOTdfRk1UUywgfSwKIH07Ci1FWFBPUlRfU1lNQk9MX0dQTChhZDE5ODBfZGFpKTsKIAogc3RhdGljIGludCBhZDE5ODBfcmVzZXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgdHJ5X3dhcm0pCiB7CkBAIC0yMDAsMTggKzE5OSwyMiBAQAogCX0KIAogCS8qIFJlYWQgb3V0IHZlbmRvciBJRCB0byBtYWtlIHN1cmUgaXQgaXMgYWQxOTgwICovCi0JaWYgKGFjOTdfcmVhZChjb2RlYywgQUM5N19WRU5ET1JfSUQxKSAhPSAweDQxNDQpCisJaWYgKGFjOTdfcmVhZChjb2RlYywgQUM5N19WRU5ET1JfSUQxKSAhPSAweDQxNDQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byByZXNldF9lcnI7CisJfQogCiAJdmVuZG9yX2lkMiA9IGFjOTdfcmVhZChjb2RlYywgQUM5N19WRU5ET1JfSUQyKTsKIAogCWlmICh2ZW5kb3JfaWQyICE9IDB4NTM3MCkgewotCQlpZiAodmVuZG9yX2lkMiAhPSAweDUzNzQpCisJCWlmICh2ZW5kb3JfaWQyICE9IDB4NTM3NCkgeworCQkJcmV0ID0gLUVOT0RFVjsKIAkJCWdvdG8gcmVzZXRfZXJyOwotCQllbHNlCisJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE5ODA6ICIKIAkJCQkiRm91bmQgQUQxOTgxIC0gb25seSAyLzIgSU4vT1VUIENoYW5uZWxzICIKIAkJCQkic3VwcG9ydGVkXG4iKTsKKwkJfQogCX0KIAogCS8qIHVubXV0ZSBjYXB0dXJlcyBhbmQgcGxheWJhY2tzIHZvbHVtZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjY2Y4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMKQEAgLTAsMCArMSwxNDE0IEBACisvKgorICogQW5hbG9nIERldmljZXMgQURBVTEzNzMgQXVkaW8gQ29kZWMgZHJpdmUKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ2NkLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2FkYXUxMzczLmg+CisKKyNpbmNsdWRlICJhZGF1MTM3My5oIgorCitzdHJ1Y3QgYWRhdTEzNzNfZGFpIHsKKwl1bnNpZ25lZCBpbnQgY2xrX3NyYzsKKwl1bnNpZ25lZCBpbnQgc3lzY2xrOworCWJvb2wgZW5hYmxlX3NyYzsKKwlib29sIG1hc3RlcjsKK307CisKK3N0cnVjdCBhZGF1MTM3MyB7CisJc3RydWN0IGFkYXUxMzczX2RhaSBkYWlzWzNdOworfTsKKworI2RlZmluZSBBREFVMTM3M19JTlBVVF9NT0RFCTB4MDAKKyNkZWZpbmUgQURBVTEzNzNfQUlOTF9DVFJMKHgpCSgweDAxICsgKHgpICogMikKKyNkZWZpbmUgQURBVTEzNzNfQUlOUl9DVFJMKHgpCSgweDAyICsgKHgpICogMikKKyNkZWZpbmUgQURBVTEzNzNfTExJTkVfT1VUKHgpCSgweDkgKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19STElORV9PVVQoeCkJKDB4YSArICh4KSAqIDIpCisjZGVmaW5lIEFEQVUxMzczX0xTUEtfT1VUCTB4MGQKKyNkZWZpbmUgQURBVTEzNzNfUlNQS19PVVQJMHgwZQorI2RlZmluZSBBREFVMTM3M19MSFBfT1VUCTB4MGYKKyNkZWZpbmUgQURBVTEzNzNfUkhQX09VVAkweDEwCisjZGVmaW5lIEFEQVUxMzczX0FEQ19HQUlOCTB4MTEKKyNkZWZpbmUgQURBVTEzNzNfTEFEQ19NSVhFUgkweDEyCisjZGVmaW5lIEFEQVUxMzczX1JBRENfTUlYRVIJMHgxMworI2RlZmluZSBBREFVMTM3M19MTElORTFfTUlYCTB4MTQKKyNkZWZpbmUgQURBVTEzNzNfUkxJTkUxX01JWAkweDE1CisjZGVmaW5lIEFEQVUxMzczX0xMSU5FMl9NSVgJMHgxNgorI2RlZmluZSBBREFVMTM3M19STElORTJfTUlYCTB4MTcKKyNkZWZpbmUgQURBVTEzNzNfTFNQS19NSVgJMHgxOAorI2RlZmluZSBBREFVMTM3M19SU1BLX01JWAkweDE5CisjZGVmaW5lIEFEQVUxMzczX0xIUF9NSVgJMHgxYQorI2RlZmluZSBBREFVMTM3M19SSFBfTUlYCTB4MWIKKyNkZWZpbmUgQURBVTEzNzNfRVBfTUlYCQkweDFjCisjZGVmaW5lIEFEQVUxMzczX0hQX0NUUkwJMHgxZAorI2RlZmluZSBBREFVMTM3M19IUF9DVFJMMgkweDFlCisjZGVmaW5lIEFEQVUxMzczX0xTX0NUUkwJMHgxZgorI2RlZmluZSBBREFVMTM3M19FUF9DVFJMCTB4MjEKKyNkZWZpbmUgQURBVTEzNzNfTUlDQklBU19DVFJMMQkweDIyCisjZGVmaW5lIEFEQVUxMzczX01JQ0JJQVNfQ1RSTDIJMHgyMworI2RlZmluZSBBREFVMTM3M19PVVRQVVRfQ1RSTAkweDI0CisjZGVmaW5lIEFEQVUxMzczX1BXRE5fQ1RSTDEJMHgyNQorI2RlZmluZSBBREFVMTM3M19QV0ROX0NUUkwyCTB4MjYKKyNkZWZpbmUgQURBVTEzNzNfUFdETl9DVFJMMwkweDI3CisjZGVmaW5lIEFEQVUxMzczX0RQTExfQ1RSTCh4KQkoMHgyOCArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMMSh4KQkoMHgyOSArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMMih4KQkoMHgyYSArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMMyh4KQkoMHgyYiArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNCh4KQkoMHgyYyArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNSh4KQkoMHgyZCArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNih4KQkoMHgyZSArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNyh4KQkoMHgyZiArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX0hFQURERUNUCTB4MzYKKyNkZWZpbmUgQURBVTEzNzNfQURDX0RBQ19TVEFUVVMJMHgzNworI2RlZmluZSBBREFVMTM3M19BRENfQ1RSTAkweDNjCisjZGVmaW5lIEFEQVUxMzczX0RBSSh4KQkJKDB4NDQgKyAoeCkpCisjZGVmaW5lIEFEQVUxMzczX0NMS19TUkNfRElWKHgpCSgweDQwICsgKHgpICogMikKKyNkZWZpbmUgQURBVTEzNzNfQkNMS0RJVih4KQkoMHg0NyArICh4KSkKKyNkZWZpbmUgQURBVTEzNzNfU1JDX1JBVElPQSh4KQkoMHg0YSArICh4KSAqIDIpCisjZGVmaW5lIEFEQVUxMzczX1NSQ19SQVRJT0IoeCkJKDB4NGIgKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19ERUVNUF9DVFJMCTB4NTAKKyNkZWZpbmUgQURBVTEzNzNfU1JDX0RBSV9DVFJMKHgpICgweDUxICsgKHgpKQorI2RlZmluZSBBREFVMTM3M19ESU5fTUlYX0NUUkwoeCkgKDB4NTYgKyAoeCkpCisjZGVmaW5lIEFEQVUxMzczX0RPVVRfTUlYX0NUUkwoeCkgKDB4NWIgKyAoeCkpCisjZGVmaW5lIEFEQVUxMzczX0RBSV9QQkxfVk9MKHgpCSgweDYyICsgKHgpICogMikKKyNkZWZpbmUgQURBVTEzNzNfREFJX1BCUl9WT0woeCkJKDB4NjMgKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19EQUlfUkVDTF9WT0woeCkgKDB4NjggKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19EQUlfUkVDUl9WT0woeCkgKDB4NjkgKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19EQUMxX1BCTF9WT0wJMHg2ZQorI2RlZmluZSBBREFVMTM3M19EQUMxX1BCUl9WT0wJMHg2ZgorI2RlZmluZSBBREFVMTM3M19EQUMyX1BCTF9WT0wJMHg3MAorI2RlZmluZSBBREFVMTM3M19EQUMyX1BCUl9WT0wJMHg3MQorI2RlZmluZSBBREFVMTM3M19BRENfUkVDTF9WT0wJMHg3MgorI2RlZmluZSBBREFVMTM3M19BRENfUkVDUl9WT0wJMHg3MworI2RlZmluZSBBREFVMTM3M19ETUlDX1JFQ0xfVk9MCTB4NzQKKyNkZWZpbmUgQURBVTEzNzNfRE1JQ19SRUNSX1ZPTAkweDc1CisjZGVmaW5lIEFEQVUxMzczX1ZPTF9HQUlOMQkweDc2CisjZGVmaW5lIEFEQVUxMzczX1ZPTF9HQUlOMgkweDc3CisjZGVmaW5lIEFEQVUxMzczX1ZPTF9HQUlOMwkweDc4CisjZGVmaW5lIEFEQVUxMzczX0hQRl9DVFJMCTB4N2QKKyNkZWZpbmUgQURBVTEzNzNfQkFTUzEJCTB4N2UKKyNkZWZpbmUgQURBVTEzNzNfQkFTUzIJCTB4N2YKKyNkZWZpbmUgQURBVTEzNzNfRFJDKHgpCQkoMHg4MCArICh4KSAqIDB4MTApCisjZGVmaW5lIEFEQVUxMzczXzNEX0NUUkwxCTB4YzAKKyNkZWZpbmUgQURBVTEzNzNfM0RfQ1RSTDIJMHhjMQorI2RlZmluZSBBREFVMTM3M19GRFNQX1NFTDEJMHhkYworI2RlZmluZSBBREFVMTM3M19GRFNQX1NFTDIJMHhkZAorI2RlZmluZSBBREFVMTM3M19GRFNQX1NFTDMJMHhkZQorI2RlZmluZSBBREFVMTM3M19GRFNQX1NFTDQJMHhkZgorI2RlZmluZSBBREFVMTM3M19ESUdNSUNDVFJMCTB4ZTIKKyNkZWZpbmUgQURBVTEzNzNfRElHRU4JCTB4ZWIKKyNkZWZpbmUgQURBVTEzNzNfU09GVF9SRVNFVAkweGZmCisKKworI2RlZmluZSBBREFVMTM3M19QTExfQ1RSTDZfRFBMTF9CWVBBU1MJQklUKDEpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNl9QTExfRU4JQklUKDApCisKKyNkZWZpbmUgQURBVTEzNzNfREFJX0lOVkVSVF9CQ0xLCUJJVCg3KQorI2RlZmluZSBBREFVMTM3M19EQUlfTUFTVEVSCQlCSVQoNikKKyNkZWZpbmUgQURBVTEzNzNfREFJX0lOVkVSVF9MUkNMSwlCSVQoNCkKKyNkZWZpbmUgQURBVTEzNzNfREFJX1dMRU5fMTYJCTB4MAorI2RlZmluZSBBREFVMTM3M19EQUlfV0xFTl8yMAkJMHg0CisjZGVmaW5lIEFEQVUxMzczX0RBSV9XTEVOXzI0CQkweDgKKyNkZWZpbmUgQURBVTEzNzNfREFJX1dMRU5fMzIJCTB4YworI2RlZmluZSBBREFVMTM3M19EQUlfV0xFTl9NQVNLCQkweGMKKyNkZWZpbmUgQURBVTEzNzNfREFJX0ZPUk1BVF9SSUdIVF9KCTB4MAorI2RlZmluZSBBREFVMTM3M19EQUlfRk9STUFUX0xFRlRfSgkweDEKKyNkZWZpbmUgQURBVTEzNzNfREFJX0ZPUk1BVF9JMlMJCTB4MgorI2RlZmluZSBBREFVMTM3M19EQUlfRk9STUFUX0RTUAkJMHgzCisKKyNkZWZpbmUgQURBVTEzNzNfQkNMS0RJVl9TT1VSQ0UJCUJJVCg1KQorI2RlZmluZSBBREFVMTM3M19CQ0xLRElWXzMyCQkweDAzCisjZGVmaW5lIEFEQVUxMzczX0JDTEtESVZfNjQJCTB4MDIKKyNkZWZpbmUgQURBVTEzNzNfQkNMS0RJVl8xMjgJCTB4MDEKKyNkZWZpbmUgQURBVTEzNzNfQkNMS0RJVl8yNTYJCTB4MDAKKworI2RlZmluZSBBREFVMTM3M19BRENfQ1RSTF9QRUFLX0RFVEVDVAlCSVQoMCkKKyNkZWZpbmUgQURBVTEzNzNfQURDX0NUUkxfUkVTRVQJCUJJVCgxKQorI2RlZmluZSBBREFVMTM3M19BRENfQ1RSTF9SRVNFVF9GT1JDRQlCSVQoMikKKworI2RlZmluZSBBREFVMTM3M19PVVRQVVRfQ1RSTF9MRElGRglCSVQoMykKKyNkZWZpbmUgQURBVTEzNzNfT1VUUFVUX0NUUkxfTE5GQkVOCUJJVCgyKQorCisjZGVmaW5lIEFEQVUxMzczX1BXRE5fQ1RSTDNfUFdSX0VOIEJJVCgwKQorCisjZGVmaW5lIEFEQVUxMzczX0VQX0NUUkxfTUlDQklBUzFfT0ZGU0VUIDQKKyNkZWZpbmUgQURBVTEzNzNfRVBfQ1RSTF9NSUNCSUFTMl9PRkZTRVQgMgorCitzdGF0aWMgY29uc3QgdWludDhfdCBhZGF1MTM3M19kZWZhdWx0X3JlZ3NbXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAvKiAweDMwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDBhLCAweDBhLCAweDAwLCAvKiAweDQwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDA4LCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDc4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAvKiAweDgwICovCisJMHgwMCwgMHhjMCwgMHg4OCwgMHg3YSwgMHhkZiwgMHgyMCwgMHgwMCwgMHgwMCwKKwkweDc4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAvKiAweDkwICovCisJMHgwMCwgMHhjMCwgMHg4OCwgMHg3YSwgMHhkZiwgMHgyMCwgMHgwMCwgMHgwMCwKKwkweDc4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAvKiAweGEwICovCisJMHgwMCwgMHhjMCwgMHg4OCwgMHg3YSwgMHhkZiwgMHgyMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAvKiAweGIwICovCisJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgxZiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAvKiAweGUwICovCisJMHgwMCwgMHgxZiwgMHgwZiwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTEzNzNfb3V0X3RsdltdID0geworCVRMVl9EQl9SQU5HRV9IRUFEKDQpLAorCTAsIDcsIFRMVl9EQl9TQ0FMRV9JVEVNKC03OTAwLCA0MDAsIDEpLAorCTgsIDE1LCBUTFZfREJfU0NBTEVfSVRFTSgtNDcwMCwgMzAwLCAwKSwKKwkxNiwgMjMsIFRMVl9EQl9TQ0FMRV9JVEVNKC0yMzAwLCAyMDAsIDApLAorCTI0LCAzMSwgVExWX0RCX1NDQUxFX0lURU0oLTcwMCwgMTAwLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9NSU5NQVgoYWRhdTEzNzNfZGlnaXRhbF90bHYsIC05NTYzLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGF1MTM3M19pbl9wZ2FfdGx2LCAtMTMwMCwgMTAwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGF1MTM3M19lcF90bHYsIC02MDAsIDYwMCwgMSk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGF1MTM3M19pbnB1dF9ib29zdF90bHYsIDAsIDIwMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkYXUxMzczX2dhaW5fYm9vc3RfdGx2LCAwLCA2MDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkYXUxMzczX3NwZWFrZXJfYm9vc3RfdGx2LCAxMjAwLCA2MDAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfZmRzcF9zZWxfdGV4dFtdID0geworCSJOb25lIiwKKwkiQ2hhbm5lbCAxIiwKKwkiQ2hhbm5lbCAyIiwKKwkiQ2hhbm5lbCAzIiwKKwkiQ2hhbm5lbCA0IiwKKwkiQ2hhbm5lbCA1IiwKK307CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSwKKwlBREFVMTM3M19GRFNQX1NFTDEsIDQsIGFkYXUxMzczX2Zkc3Bfc2VsX3RleHQpOworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtLAorCUFEQVUxMzczX0ZEU1BfU0VMMSwgMCwgYWRhdTEzNzNfZmRzcF9zZWxfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0sCisJQURBVTEzNzNfRkRTUF9TRUwyLCAwLCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19ocGZfY2hhbm5lbF9lbnVtLAorCUFEQVUxMzczX0ZEU1BfU0VMMywgMCwgYWRhdTEzNzNfZmRzcF9zZWxfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfYmFzc19jaGFubmVsX2VudW0sCisJQURBVTEzNzNfRkRTUF9TRUw0LCA0LCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFkYXUxMzczX2hwZl9jdXRvZmZfdGV4dFtdID0geworCSIzLjdIeiIsICI1MEh6IiwgIjEwMEh6IiwgIjE1MEh6IiwgIjIwMEh6IiwgIjI1MEh6IiwgIjMwMEh6IiwgIjM1MEh6IiwKKwkiNDAwSHoiLCAiNDUwSHoiLCAiNTAwSHoiLCAiNTUwSHoiLCAiNjAwSHoiLCAiNjUwSHoiLCAiNzAwSHoiLCAiNzUwSHoiLAorCSI4MDBIeiIsCit9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfaHBmX2N1dG9mZl9lbnVtLAorCUFEQVUxMzczX0hQRl9DVFJMLCAzLCBhZGF1MTM3M19ocGZfY3V0b2ZmX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfYmFzc19scGZfY3V0b2ZmX3RleHRbXSA9IHsKKwkiODAxSHoiLCAiMTAwMUh6IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfdGV4dFtdID0geworCSIwLjEyNSIsICIwLjI1MCIsICIwLjM3MCIsICIwLjUwMCIsICIwLjYyNSIsICIwLjc1MCIsICIwLjg3NSIsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFkYXUxMzczX2Jhc3NfY2xpcF9sZXZlbF92YWx1ZXNbXSA9IHsKKwkxLCAyLCAzLCA0LCA1LCA2LCA3LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFkYXUxMzczX2Jhc3NfaHBmX2N1dG9mZl90ZXh0W10gPSB7CisJIjE1OEh6IiwgIjIzMkh6IiwgIjM0N0h6IiwgIjUyMEh6IiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTEzNzNfYmFzc190bHZbXSA9IHsKKwlUTFZfREJfUkFOR0VfSEVBRCg0KSwKKwkwLCAyLCBUTFZfREJfU0NBTEVfSVRFTSgtNjAwLCA2MDAsIDEpLAorCTMsIDQsIFRMVl9EQl9TQ0FMRV9JVEVNKDk1MCwgMjUwLCAwKSwKKwk1LCA3LCBUTFZfREJfU0NBTEVfSVRFTSgxNDAwLCAxNTAsIDApLAorfTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtLAorCUFEQVUxMzczX0JBU1MxLCA1LCBhZGF1MTM3M19iYXNzX2xwZl9jdXRvZmZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSwKKwlBREFVMTM3M19CQVNTMSwgMiwgNywgYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3RleHQsCisJYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3ZhbHVlcyk7CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSwKKwlBREFVMTM3M19CQVNTMSwgMCwgYWRhdTEzNzNfYmFzc19ocGZfY3V0b2ZmX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfM2RfbGV2ZWxfdGV4dFtdID0geworCSIwJSIsICI2LjY3JSIsICIxMy4zMyUiLCAiMjAlIiwgIjI2LjY3JSIsICIzMy4zMyUiLAorCSI0MCUiLCAiNDYuNjclIiwgIjUzLjMzJSIsICI2MCUiLCAiNjYuNjclIiwgIjczLjMzJSIsCisJIjgwJSIsICI4Ni42NyIsICI5OS4zMyUiLCAiMTAwJSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphZGF1MTM3M18zZF9jdXRvZmZfdGV4dFtdID0geworCSJObyAzRCIsICIwLjAzMTI1IGZzIiwgIjAuMDQ1ODMgZnMiLCAiMC4wNzUgZnMiLCAiMC4xMTQ1OCBmcyIsCisJIjAuMTY4NzUgZnMiLCAiMC4yNzA4MyBmcyIKK307CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M18zZF9sZXZlbF9lbnVtLAorCUFEQVUxMzczXzNEX0NUUkwxLCA0LCBhZGF1MTM3M18zZF9sZXZlbF90ZXh0KTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M18zZF9jdXRvZmZfZW51bSwKKwlBREFVMTM3M18zRF9DVFJMMSwgMCwgYWRhdTEzNzNfM2RfY3V0b2ZmX3RleHQpOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFkYXUxMzczXzNkX3RsdltdID0geworCVRMVl9EQl9SQU5HRV9IRUFEKDIpLAorCTAsIDAsIFRMVl9EQl9TQ0FMRV9JVEVNKDAsIDAsIDApLAorCTEsIDcsIFRMVl9EQl9MSU5FQVJfSVRFTSgtMTgwMCwgLTEyMCksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfbHJfbXV4X3RleHRbXSA9IHsKKwkiTXV0ZSIsCisJIlJpZ2h0IENoYW5uZWwgKEwrUikiLAorCSJMZWZ0IENoYW5uZWwgKEwrUikiLAorCSJTdGVyZW8iLAorfTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2xpbmVvdXQxX2xyX211eF9lbnVtLAorCUFEQVUxMzczX09VVFBVVF9DVFJMLCA0LCBhZGF1MTM3M19scl9tdXhfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0sCisJQURBVTEzNzNfT1VUUFVUX0NUUkwsIDYsIGFkYXUxMzczX2xyX211eF90ZXh0KTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19zcGVha2VyX2xyX211eF9lbnVtLAorCUFEQVUxMzczX0xTX0NUUkwsIDQsIGFkYXUxMzczX2xyX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYXUxMzczX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SX1RMVigiQUlGMSBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0RBSV9SRUNMX1ZPTCgwKSwKKwkJQURBVTEzNzNfREFJX1JFQ1JfVk9MKDApLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiQUlGMiBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0RBSV9SRUNMX1ZPTCgxKSwKKwkJQURBVTEzNzNfREFJX1JFQ1JfVk9MKDEpLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiQUlGMyBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0RBSV9SRUNMX1ZPTCgyKSwKKwkJQURBVTEzNzNfREFJX1JFQ1JfVk9MKDIpLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisKKwlTT0NfRE9VQkxFX1JfVExWKCJBREMgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BRENfUkVDTF9WT0wsCisJCUFEQVUxMzczX0FEQ19SRUNSX1ZPTCwgMCwgMHhmZiwgMSwgYWRhdTEzNzNfZGlnaXRhbF90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkRNSUMgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19ETUlDX1JFQ0xfVk9MLAorCQlBREFVMTM3M19ETUlDX1JFQ1JfVk9MLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisKKwlTT0NfRE9VQkxFX1JfVExWKCJBSUYxIFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX0RBSV9QQkxfVk9MKDApLAorCQlBREFVMTM3M19EQUlfUEJSX1ZPTCgwKSwgMCwgMHhmZiwgMSwgYWRhdTEzNzNfZGlnaXRhbF90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkFJRjIgUGxheWJhY2sgVm9sdW1lIiwgQURBVTEzNzNfREFJX1BCTF9WT0woMSksCisJCUFEQVUxMzczX0RBSV9QQlJfVk9MKDEpLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiQUlGMyBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19EQUlfUEJMX1ZPTCgyKSwKKwkJQURBVTEzNzNfREFJX1BCUl9WT0woMiksIDAsIDB4ZmYsIDEsIGFkYXUxMzczX2RpZ2l0YWxfdGx2KSwKKworCVNPQ19ET1VCTEVfUl9UTFYoIkRBQzEgUGxheWJhY2sgVm9sdW1lIiwgQURBVTEzNzNfREFDMV9QQkxfVk9MLAorCQlBREFVMTM3M19EQUMxX1BCUl9WT0wsIDAsIDB4ZmYsIDEsIGFkYXUxMzczX2RpZ2l0YWxfdGx2KSwKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUMyIFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX0RBQzJfUEJMX1ZPTCwKKwkJQURBVTEzNzNfREFDMl9QQlJfVk9MLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisKKwlTT0NfRE9VQkxFX1JfVExWKCJMaW5lb3V0MSBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19MTElORV9PVVQoMCksCisJCUFEQVUxMzczX1JMSU5FX09VVCgwKSwgMCwgMHgxZiwgMCwgYWRhdTEzNzNfb3V0X3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19MU1BLX09VVCwKKwkJQURBVTEzNzNfUlNQS19PVVQsIDAsIDB4MWYsIDAsIGFkYXUxMzczX291dF90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19MSFBfT1VULAorCQlBREFVMTM3M19SSFBfT1VULCAwLCAweDFmLCAwLCBhZGF1MTM3M19vdXRfdGx2KSwKKworCVNPQ19ET1VCTEVfUl9UTFYoIklucHV0IDEgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BSU5MX0NUUkwoMCksCisJCUFEQVUxMzczX0FJTlJfQ1RSTCgwKSwgMCwgMHgxZiwgMCwgYWRhdTEzNzNfaW5fcGdhX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiSW5wdXQgMiBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0FJTkxfQ1RSTCgxKSwKKwkJQURBVTEzNzNfQUlOUl9DVFJMKDEpLCAwLCAweDFmLCAwLCBhZGF1MTM3M19pbl9wZ2FfdGx2KSwKKwlTT0NfRE9VQkxFX1JfVExWKCJJbnB1dCAzIENhcHR1cmUgVm9sdW1lIiwgQURBVTEzNzNfQUlOTF9DVFJMKDIpLAorCQlBREFVMTM3M19BSU5SX0NUUkwoMiksIDAsIDB4MWYsIDAsIGFkYXUxMzczX2luX3BnYV90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIklucHV0IDQgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BSU5MX0NUUkwoMyksCisJCUFEQVUxMzczX0FJTlJfQ1RSTCgzKSwgMCwgMHgxZiwgMCwgYWRhdTEzNzNfaW5fcGdhX3RsdiksCisKKwlTT0NfU0lOR0xFX1RMVigiRWFycGllY2UgUGxheWJhY2sgVm9sdW1lIiwgQURBVTEzNzNfRVBfQ1RSTCwgMCwgMywgMCwKKwkJYWRhdTEzNzNfZXBfdGx2KSwKKworCVNPQ19ET1VCTEVfVExWKCJBSUYzIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMSwgNCwgNSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJBSUYyIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMSwgMiwgMywKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJBSUYxIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMSwgMCwgMSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJBSUYzIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgQURBVTEzNzNfVk9MX0dBSU4yLCA0LCA1LAorCQkxLCAwLCBhZGF1MTM3M19nYWluX2Jvb3N0X3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkFJRjIgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19WT0xfR0FJTjIsIDIsIDMsCisJCTEsIDAsIGFkYXUxMzczX2dhaW5fYm9vc3RfdGx2KSwKKwlTT0NfRE9VQkxFX1RMVigiQUlGMSBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMiwgMCwgMSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJETUlDIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgQURBVTEzNzNfVk9MX0dBSU4zLCA2LCA3LAorCQkxLCAwLCBhZGF1MTM3M19nYWluX2Jvb3N0X3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkFEQyBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMywgNCwgNSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJEQUMyIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMywgMiwgMywKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJEQUMxIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMywgMCwgMSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCisJU09DX0RPVUJMRV9UTFYoIklucHV0IDEgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BRENfR0FJTiwgMCwgNCwKKwkJMSwgMCwgYWRhdTEzNzNfaW5wdXRfYm9vc3RfdGx2KSwKKwlTT0NfRE9VQkxFX1RMVigiSW5wdXQgMiBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0FEQ19HQUlOLCAxLCA1LAorCQkxLCAwLCBhZGF1MTM3M19pbnB1dF9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJJbnB1dCAzIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgQURBVTEzNzNfQURDX0dBSU4sIDIsIDYsCisJCTEsIDAsIGFkYXUxMzczX2lucHV0X2Jvb3N0X3RsdiksCisJU09DX0RPVUJMRV9UTFYoIklucHV0IDQgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BRENfR0FJTiwgMywgNywKKwkJMSwgMCwgYWRhdTEzNzNfaW5wdXRfYm9vc3RfdGx2KSwKKworCVNPQ19ET1VCTEVfVExWKCJTcGVha2VyIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX0xTX0NUUkwsIDIsIDMsCisJCTEsIDAsIGFkYXUxMzczX3NwZWFrZXJfYm9vc3RfdGx2KSwKKworCVNPQ19FTlVNKCJMaW5lb3V0MSBMUiBNdXgiLCBhZGF1MTM3M19saW5lb3V0MV9scl9tdXhfZW51bSksCisJU09DX0VOVU0oIlNwZWFrZXIgTFIgTXV4IiwgYWRhdTEzNzNfc3BlYWtlcl9scl9tdXhfZW51bSksCisKKwlTT0NfRU5VTSgiSFBGIEN1dG9mZiIsIGFkYXUxMzczX2hwZl9jdXRvZmZfZW51bSksCisJU09DX0RPVUJMRSgiSFBGIFN3aXRjaCIsIEFEQVUxMzczX0hQRl9DVFJMLCAxLCAwLCAxLCAwKSwKKwlTT0NfRU5VTSgiSFBGIENoYW5uZWwiLCBhZGF1MTM3M19ocGZfY2hhbm5lbF9lbnVtKSwKKworCVNPQ19FTlVNKCJCYXNzIEhQRiBDdXRvZmYiLCBhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSksCisJU09DX1ZBTFVFX0VOVU0oIkJhc3MgQ2xpcCBMZXZlbCBUaHJlc2hvbGQiLAorCSAgICBhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSksCisJU09DX0VOVU0oIkJhc3MgTFBGIEN1dG9mZiIsIGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtKSwKKwlTT0NfRE9VQkxFKCJCYXNzIFBsYXliYWNrIFN3aXRjaCIsIEFEQVUxMzczX0JBU1MyLCAwLCAxLCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiQmFzcyBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19CQVNTMiwgMiwgNywgMCwKKwkgICAgYWRhdTEzNzNfYmFzc190bHYpLAorCVNPQ19FTlVNKCJCYXNzIENoYW5uZWwiLCBhZGF1MTM3M19iYXNzX2NoYW5uZWxfZW51bSksCisKKwlTT0NfRU5VTSgiM0QgRnJlcSIsIGFkYXUxMzczXzNkX2N1dG9mZl9lbnVtKSwKKwlTT0NfRU5VTSgiM0QgTGV2ZWwiLCBhZGF1MTM3M18zZF9sZXZlbF9lbnVtKSwKKwlTT0NfU0lOR0xFKCIzRCBQbGF5YmFjayBTd2l0Y2giLCBBREFVMTM3M18zRF9DVFJMMiwgMCwgMSwgMCksCisJU09DX1NJTkdMRV9UTFYoIjNEIFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczXzNEX0NUUkwyLCAyLCA3LCAwLAorCQlhZGF1MTM3M18zZF90bHYpLAorCVNPQ19FTlVNKCIzRCBDaGFubmVsIiwgYWRhdTEzNzNfYmFzc19jaGFubmVsX2VudW0pLAorCisJU09DX1NJTkdMRSgiWmVybyBDcm9zcyBTd2l0Y2giLCBBREFVMTM3M19QV0ROX0NUUkwzLCA3LCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGF1MTM3M19saW5lb3V0Ml9jb250cm9sc1tdID0geworCVNPQ19ET1VCTEVfUl9UTFYoIkxpbmVvdXQyIFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX0xMSU5FX09VVCgxKSwKKwkJQURBVTEzNzNfUkxJTkVfT1VUKDEpLCAwLCAweDFmLCAwLCBhZGF1MTM3M19vdXRfdGx2KSwKKwlTT0NfRU5VTSgiTGluZW91dDIgTFIgTXV4IiwgYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYXUxMzczX2RyY19jb250cm9sc1tdID0geworCVNPQ19FTlVNKCJEUkMxIENoYW5uZWwiLCBhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSksCisJU09DX0VOVU0oIkRSQzIgQ2hhbm5lbCIsIGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtKSwKKwlTT0NfRU5VTSgiRFJDMyBDaGFubmVsIiwgYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0pLAorfTsKKworc3RhdGljIGludCBhZGF1MTM3M19wbGxfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwl1bnNpZ25lZCBpbnQgcGxsX2lkID0gdy0+bmFtZVszXSAtICcxJzsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCXZhbCA9IEFEQVUxMzczX1BMTF9DVFJMNl9QTExfRU47CisJZWxzZQorCQl2YWwgPSAwOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVTEzNzNfUExMX0NUUkw2KHBsbF9pZCksCisJCUFEQVUxMzczX1BMTF9DVFJMNl9QTExfRU4sIHZhbCk7CisKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJbWRlbGF5KDUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphZGF1MTM3M19kZWNpbWF0b3JfdGV4dFtdID0geworCSJBREMiLAorCSJETUlDMSIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYXUxMzczX2RlY2ltYXRvcl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgMiwgYWRhdTEzNzNfZGVjaW1hdG9yX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfZGVjaW1hdG9yX211eCA9CisJU09DX0RBUE1fRU5VTV9WSVJUKCJEZWNpbWF0b3IgTXV4IiwgYWRhdTEzNzNfZGVjaW1hdG9yX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfbGVmdF9hZGNfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQzEgU3dpdGNoIiwgQURBVTEzNzNfTEFEQ19NSVhFUiwgNCwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCA0IFN3aXRjaCIsIEFEQVUxMzczX0xBRENfTUlYRVIsIDMsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMyBTd2l0Y2giLCBBREFVMTM3M19MQURDX01JWEVSLCAyLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDIgU3dpdGNoIiwgQURBVTEzNzNfTEFEQ19NSVhFUiwgMSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAxIFN3aXRjaCIsIEFEQVUxMzczX0xBRENfTUlYRVIsIDAsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYXUxMzczX3JpZ2h0X2FkY19taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDMSBTd2l0Y2giLCBBREFVMTM3M19SQURDX01JWEVSLCA0LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDQgU3dpdGNoIiwgQURBVTEzNzNfUkFEQ19NSVhFUiwgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAzIFN3aXRjaCIsIEFEQVUxMzczX1JBRENfTUlYRVIsIDIsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMiBTd2l0Y2giLCBBREFVMTM3M19SQURDX01JWEVSLCAxLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDEgU3dpdGNoIiwgQURBVTEzNzNfUkFEQ19NSVhFUiwgMCwgMSwgMCksCit9OworCisjZGVmaW5lIERFQ0xBUkVfQURBVTEzNzNfT1VUUFVUX01JWEVSX0NUUkxTKF9uYW1lLCBfcmVnKSBcCitjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBfbmFtZVtdID0geyBcCisJU09DX0RBUE1fU0lOR0xFKCJMZWZ0IERBQzIgU3dpdGNoIiwgX3JlZywgNywgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IERBQzIgU3dpdGNoIiwgX3JlZywgNiwgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIkxlZnQgREFDMSBTd2l0Y2giLCBfcmVnLCA1LCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiUmlnaHQgREFDMSBTd2l0Y2giLCBfcmVnLCA0LCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgNCBCeXBhc3MgU3dpdGNoIiwgX3JlZywgMywgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDMgQnlwYXNzIFN3aXRjaCIsIF9yZWcsIDIsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAyIEJ5cGFzcyBTd2l0Y2giLCBfcmVnLCAxLCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMSBCeXBhc3MgU3dpdGNoIiwgX3JlZywgMCwgMSwgMCksIFwKK30KKworc3RhdGljIERFQ0xBUkVfQURBVTEzNzNfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2xlZnRfbGluZTFfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfTExJTkUxX01JWCk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19PVVRQVVRfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfcmlnaHRfbGluZTFfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfUkxJTkUxX01JWCk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19PVVRQVVRfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfbGVmdF9saW5lMl9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19MTElORTJfTUlYKTsKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX09VVFBVVF9NSVhFUl9DVFJMUyhhZGF1MTM3M19yaWdodF9saW5lMl9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19STElORTJfTUlYKTsKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX09VVFBVVF9NSVhFUl9DVFJMUyhhZGF1MTM3M19sZWZ0X3Nwa19taXhlcl9jb250cm9scywKKwlBREFVMTM3M19MU1BLX01JWCk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19PVVRQVVRfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfcmlnaHRfc3BrX21peGVyX2NvbnRyb2xzLAorCUFEQVUxMzczX1JTUEtfTUlYKTsKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX09VVFBVVF9NSVhFUl9DVFJMUyhhZGF1MTM3M19lcF9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19FUF9NSVgpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfbGVmdF9ocF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTGVmdCBEQUMxIFN3aXRjaCIsIEFEQVUxMzczX0xIUF9NSVgsIDUsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiTGVmdCBEQUMyIFN3aXRjaCIsIEFEQVUxMzczX0xIUF9NSVgsIDQsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgNCBCeXBhc3MgU3dpdGNoIiwgQURBVTEzNzNfTEhQX01JWCwgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAzIEJ5cGFzcyBTd2l0Y2giLCBBREFVMTM3M19MSFBfTUlYLCAyLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDIgQnlwYXNzIFN3aXRjaCIsIEFEQVUxMzczX0xIUF9NSVgsIDEsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMSBCeXBhc3MgU3dpdGNoIiwgQURBVTEzNzNfTEhQX01JWCwgMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfcmlnaHRfaHBfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IERBQzEgU3dpdGNoIiwgQURBVTEzNzNfUkhQX01JWCwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJSaWdodCBEQUMyIFN3aXRjaCIsIEFEQVUxMzczX1JIUF9NSVgsIDQsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgNCBCeXBhc3MgU3dpdGNoIiwgQURBVTEzNzNfUkhQX01JWCwgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAzIEJ5cGFzcyBTd2l0Y2giLCBBREFVMTM3M19SSFBfTUlYLCAyLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDIgQnlwYXNzIFN3aXRjaCIsIEFEQVUxMzczX1JIUF9NSVgsIDEsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMSBCeXBhc3MgU3dpdGNoIiwgQURBVTEzNzNfUkhQX01JWCwgMCwgMSwgMCksCit9OworCisjZGVmaW5lIERFQ0xBUkVfQURBVTEzNzNfRFNQX0NIQU5ORUxfTUlYRVJfQ1RSTFMoX25hbWUsIF9yZWcpIFwKK2NvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IF9uYW1lW10gPSB7IFwKKwlTT0NfREFQTV9TSU5HTEUoIkRNSUMyIFN3YXBwZWQgU3dpdGNoIiwgX3JlZywgNiwgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIkRNSUMyIFN3aXRjaCIsIF9yZWcsIDUsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJBREMvRE1JQzEgU3dhcHBlZCBTd2l0Y2giLCBfcmVnLCA0LCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiQURDL0RNSUMxIFN3aXRjaCIsIF9yZWcsIDMsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJBSUYzIFN3aXRjaCIsIF9yZWcsIDIsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJBSUYyIFN3aXRjaCIsIF9yZWcsIDEsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJBSUYxIFN3aXRjaCIsIF9yZWcsIDAsIDEsIDApLCBcCit9CisKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX0RTUF9DSEFOTkVMX01JWEVSX0NUUkxTKGFkYXUxMzczX2RzcF9jaGFubmVsMV9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19ESU5fTUlYX0NUUkwoMCkpOworc3RhdGljIERFQ0xBUkVfQURBVTEzNzNfRFNQX0NIQU5ORUxfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfZHNwX2NoYW5uZWwyX21peGVyX2NvbnRyb2xzLAorCUFEQVUxMzczX0RJTl9NSVhfQ1RSTCgxKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfQ0hBTk5FTF9NSVhFUl9DVFJMUyhhZGF1MTM3M19kc3BfY2hhbm5lbDNfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRElOX01JWF9DVFJMKDIpKTsKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX0RTUF9DSEFOTkVMX01JWEVSX0NUUkxTKGFkYXUxMzczX2RzcF9jaGFubmVsNF9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19ESU5fTUlYX0NUUkwoMykpOworc3RhdGljIERFQ0xBUkVfQURBVTEzNzNfRFNQX0NIQU5ORUxfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfZHNwX2NoYW5uZWw1X21peGVyX2NvbnRyb2xzLAorCUFEQVUxMzczX0RJTl9NSVhfQ1RSTCg0KSk7CisKKyNkZWZpbmUgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKF9uYW1lLCBfcmVnKSBcCitjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBfbmFtZVtdID0geyBcCisJU09DX0RBUE1fU0lOR0xFKCJEU1AgQ2hhbm5lbDUgU3dpdGNoIiwgX3JlZywgNCwgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIkRTUCBDaGFubmVsNCBTd2l0Y2giLCBfcmVnLCAzLCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiRFNQIENoYW5uZWwzIFN3aXRjaCIsIF9yZWcsIDIsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJEU1AgQ2hhbm5lbDIgU3dpdGNoIiwgX3JlZywgMSwgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIkRTUCBDaGFubmVsMSBTd2l0Y2giLCBfcmVnLCAwLCAxLCAwKSwgXAorfQorCitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2FpZjFfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCgwKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2FpZjJfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCgxKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2FpZjNfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCgyKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2RhYzFfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCgzKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2RhYzJfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCg0KSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhZGF1MTM3M19kYXBtX3dpZGdldHNbXSA9IHsKKwkvKiBEYXRhc2hlZXQgY2xhaW1zIExlZnQgQURDIGlzIGJpdCA2IGFuZCBSaWdodCBBREMgaXMgYml0IDcsIGJ1dCB0aGF0CisJICogZG9lc24ndCBzZWVtIHRvIGJlIHRoZSBjYXNlLiAqLworCVNORF9TT0NfREFQTV9BREMoIkxlZnQgQURDIiwgTlVMTCwgQURBVTEzNzNfUFdETl9DVFJMMSwgNywgMCksCisJU05EX1NPQ19EQVBNX0FEQygiUmlnaHQgQURDIiwgTlVMTCwgQURBVTEzNzNfUFdETl9DVFJMMSwgNiwgMCksCisKKwlTTkRfU09DX0RBUE1fQURDKCJETUlDMSIsIE5VTEwsIEFEQVUxMzczX0RJR01JQ0NUUkwsIDAsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkRNSUMyIiwgTlVMTCwgQURBVTEzNzNfRElHTUlDQ1RSTCwgMiwgMCksCisKKwlTTkRfU09DX0RBUE1fVklSVF9NVVgoIkRlY2ltYXRvciBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZhZGF1MTM3M19kZWNpbWF0b3JfbXV4KSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMyIiwgQURBVTEzNzNfUFdETl9DVFJMMSwgNSwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUzEiLCBBREFVMTM3M19QV0ROX0NUUkwxLCA0LCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9QR0EoIklONFBHQSIsIEFEQVUxMzczX1BXRE5fQ1RSTDEsIDMsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklOM1BHQSIsIEFEQVUxMzczX1BXRE5fQ1RSTDEsIDIsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklOMlBHQSIsIEFEQVUxMzczX1BXRE5fQ1RSTDEsIDEsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklOMVBHQSIsIEFEQVUxMzczX1BXRE5fQ1RSTDEsIDAsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX0RBQygiTGVmdCBEQUMyIiwgTlVMTCwgQURBVTEzNzNfUFdETl9DVFJMMiwgNywgMCksCisJU05EX1NPQ19EQVBNX0RBQygiUmlnaHQgREFDMiIsIE5VTEwsIEFEQVUxMzczX1BXRE5fQ1RSTDIsIDYsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkxlZnQgREFDMSIsIE5VTEwsIEFEQVUxMzczX1BXRE5fQ1RSTDIsIDUsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIlJpZ2h0IERBQzEiLCBOVUxMLCBBREFVMTM3M19QV0ROX0NUUkwyLCA0LCAwKSwKKworCVNPQ19NSVhFUl9BUlJBWSgiTGVmdCBBREMgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWFkYXUxMzczX2xlZnRfYWRjX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIlJpZ2h0IEFEQyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfcmlnaHRfYWRjX21peGVyX2NvbnRyb2xzKSwKKworCVNPQ19NSVhFUl9BUlJBWSgiTGVmdCBMaW5lb3V0MiBNaXhlciIsIEFEQVUxMzczX1BXRE5fQ1RSTDIsIDMsIDAsCisJCWFkYXUxMzczX2xlZnRfbGluZTJfbWl4ZXJfY29udHJvbHMpLAorCVNPQ19NSVhFUl9BUlJBWSgiUmlnaHQgTGluZW91dDIgTWl4ZXIiLCBBREFVMTM3M19QV0ROX0NUUkwyLCAyLCAwLAorCQlhZGF1MTM3M19yaWdodF9saW5lMl9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJMZWZ0IExpbmVvdXQxIE1peGVyIiwgQURBVTEzNzNfUFdETl9DVFJMMiwgMSwgMCwKKwkJYWRhdTEzNzNfbGVmdF9saW5lMV9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJSaWdodCBMaW5lb3V0MSBNaXhlciIsIEFEQVUxMzczX1BXRE5fQ1RSTDIsIDAsIDAsCisJCWFkYXUxMzczX3JpZ2h0X2xpbmUxX21peGVyX2NvbnRyb2xzKSwKKworCVNPQ19NSVhFUl9BUlJBWSgiRWFycGllY2UgTWl4ZXIiLCBBREFVMTM3M19QV0ROX0NUUkwzLCA0LCAwLAorCQlhZGF1MTM3M19lcF9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJMZWZ0IFNwZWFrZXIgTWl4ZXIiLCBBREFVMTM3M19QV0ROX0NUUkwzLCAzLCAwLAorCQlhZGF1MTM3M19sZWZ0X3Nwa19taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJSaWdodCBTcGVha2VyIE1peGVyIiwgQURBVTEzNzNfUFdETl9DVFJMMywgMiwgMCwKKwkJYWRhdTEzNzNfcmlnaHRfc3BrX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkxlZnQgSGVhZHBob25lIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlhZGF1MTM3M19sZWZ0X2hwX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIlJpZ2h0IEhlYWRwaG9uZSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfcmlnaHRfaHBfbWl4ZXJfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkhlYWRwaG9uZSBFbmFibGUiLCBBREFVMTM3M19QV0ROX0NUUkwzLCAxLCAwLAorCQlOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjEgQ0xLIiwgQURBVTEzNzNfU1JDX0RBSV9DVFJMKDApLCAwLCAwLAorCSAgICBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBSUYyIENMSyIsIEFEQVUxMzczX1NSQ19EQUlfQ1RSTCgxKSwgMCwgMCwKKwkgICAgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQUlGMyBDTEsiLCBBREFVMTM3M19TUkNfREFJX0NUUkwoMiksIDAsIDAsCisJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjEgSU4gU1JDIiwgQURBVTEzNzNfU1JDX0RBSV9DVFJMKDApLCAyLCAwLAorCSAgICBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBSUYxIE9VVCBTUkMiLCBBREFVMTM3M19TUkNfREFJX0NUUkwoMCksIDEsIDAsCisJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjIgSU4gU1JDIiwgQURBVTEzNzNfU1JDX0RBSV9DVFJMKDEpLCAyLCAwLAorCSAgICBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBSUYyIE9VVCBTUkMiLCBBREFVMTM3M19TUkNfREFJX0NUUkwoMSksIDEsIDAsCisJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjMgSU4gU1JDIiwgQURBVTEzNzNfU1JDX0RBSV9DVFJMKDIpLCAyLCAwLAorCSAgICBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBSUYzIE9VVCBTUkMiLCBBREFVMTM3M19TUkNfREFJX0NUUkwoMiksIDEsIDAsCisJICAgIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMSBJTiIsICJBSUYxIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMSBPVVQiLCAiQUlGMSBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYyIElOIiwgIkFJRjIgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYyIE9VVCIsICJBSUYyIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIkFJRjMgSU4iLCAiQUlGMyBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjMgT1VUIiwgIkFJRjMgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsMSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWwxX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsMiBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWwyX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsMyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWwzX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsNCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWw0X21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsNSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWw1X21peGVyX2NvbnRyb2xzKSwKKworCVNPQ19NSVhFUl9BUlJBWSgiQUlGMSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfYWlmMV9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJBSUYyIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlhZGF1MTM3M19haWYyX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkFJRjMgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWFkYXUxMzczX2FpZjNfbWl4ZXJfY29udHJvbHMpLAorCVNPQ19NSVhFUl9BUlJBWSgiREFDMSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZGFjMV9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJEQUMyIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlhZGF1MTM3M19kYWMyX21peGVyX2NvbnRyb2xzKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkRTUCIsIEFEQVUxMzczX0RJR0VOLCA0LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSZWNvcmRpbmcgRW5naW5lIEIiLCBBREFVMTM3M19ESUdFTiwgMywgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUmVjb3JkaW5nIEVuZ2luZSBBIiwgQURBVTEzNzNfRElHRU4sIDIsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlBsYXliYWNrIEVuZ2luZSBCIiwgQURBVTEzNzNfRElHRU4sIDEsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlBsYXliYWNrIEVuZ2luZSBBIiwgQURBVTEzNzNfRElHRU4sIDAsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUExMMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgYWRhdTEzNzNfcGxsX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUExMMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgYWRhdTEzNzNfcGxsX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiU1lTQ0xLMSIsIEFEQVUxMzczX0NMS19TUkNfRElWKDApLCA3LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJTWVNDTEsyIiwgQURBVTEzNzNfQ0xLX1NSQ19ESVYoMSksIDcsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4xTCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlOMVIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjJMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4yUiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlOM0wiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjNSIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU40TCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlONFIiKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiRE1JQzFEQVQiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkRNSUMyREFUIiksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMUwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMVIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMkwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMlIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUFIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLUiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkVQIiksCit9OworCitzdGF0aWMgaW50IGFkYXUxMzczX2NoZWNrX2FpZl9jbGsoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb3VyY2UtPmNvZGVjOworCXN0cnVjdCBhZGF1MTM3MyAqYWRhdTEzNzMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgZGFpOworCWNvbnN0IGNoYXIgKmNsazsKKworCWRhaSA9IHNpbmstPm5hbWVbM10gLSAnMSc7CisKKwlpZiAoIWFkYXUxMzczLT5kYWlzW2RhaV0ubWFzdGVyKQorCQlyZXR1cm4gMDsKKworCWlmIChhZGF1MTM3My0+ZGFpc1tkYWldLmNsa19zcmMgPT0gQURBVTEzNzNfQ0xLX1NSQ19QTEwxKQorCQljbGsgPSAiU1lTQ0xLMSI7CisJZWxzZQorCQljbGsgPSAiU1lTQ0xLMiI7CisKKwlyZXR1cm4gc3RyY21wKHNvdXJjZS0+bmFtZSwgY2xrKSA9PSAwOworfQorCitzdGF0aWMgaW50IGFkYXUxMzczX2NoZWNrX3NyYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc291cmNlLAorCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvdXJjZS0+Y29kZWM7CisJc3RydWN0IGFkYXUxMzczICphZGF1MTM3MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCBkYWk7CisKKwlkYWkgPSBzaW5rLT5uYW1lWzNdIC0gJzEnOworCisJcmV0dXJuIGFkYXUxMzczLT5kYWlzW2RhaV0uZW5hYmxlX3NyYzsKK30KKworI2RlZmluZSBEU1BfQ0hBTk5FTF9NSVhFUl9ST1VURVMoX3NpbmspIFwKKwl7IF9zaW5rLCAiRE1JQzIgU3dhcHBlZCBTd2l0Y2giLCAiRE1JQzIiIH0sIFwKKwl7IF9zaW5rLCAiRE1JQzIgU3dpdGNoIiwgIkRNSUMyIiB9LCBcCisJeyBfc2luaywgIkFEQy9ETUlDMSBTd2FwcGVkIFN3aXRjaCIsICJEZWNpbWF0b3IgTXV4IiB9LCBcCisJeyBfc2luaywgIkFEQy9ETUlDMSBTd2l0Y2giLCAiRGVjaW1hdG9yIE11eCIgfSwgXAorCXsgX3NpbmssICJBSUYxIFN3aXRjaCIsICJBSUYxIElOIiB9LCBcCisJeyBfc2luaywgIkFJRjIgU3dpdGNoIiwgIkFJRjIgSU4iIH0sIFwKKwl7IF9zaW5rLCAiQUlGMyBTd2l0Y2giLCAiQUlGMyBJTiIgfQorCisjZGVmaW5lIERTUF9PVVRQVVRfTUlYRVJfUk9VVEVTKF9zaW5rKSBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsMSBTd2l0Y2giLCAiRFNQIENoYW5uZWwxIE1peGVyIiB9LCBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsMiBTd2l0Y2giLCAiRFNQIENoYW5uZWwyIE1peGVyIiB9LCBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsMyBTd2l0Y2giLCAiRFNQIENoYW5uZWwzIE1peGVyIiB9LCBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsNCBTd2l0Y2giLCAiRFNQIENoYW5uZWw0IE1peGVyIiB9LCBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsNSBTd2l0Y2giLCAiRFNQIENoYW5uZWw1IE1peGVyIiB9CisKKyNkZWZpbmUgTEVGVF9PVVRQVVRfTUlYRVJfUk9VVEVTKF9zaW5rKSBcCisJeyBfc2luaywgIlJpZ2h0IERBQzIgU3dpdGNoIiwgIlJpZ2h0IERBQzIiIH0sIFwKKwl7IF9zaW5rLCAiTGVmdCBEQUMyIFN3aXRjaCIsICJMZWZ0IERBQzIiIH0sIFwKKwl7IF9zaW5rLCAiUmlnaHQgREFDMSBTd2l0Y2giLCAiUmlnaHQgREFDMSIgfSwgXAorCXsgX3NpbmssICJMZWZ0IERBQzEgU3dpdGNoIiwgIkxlZnQgREFDMSIgfSwgXAorCXsgX3NpbmssICJJbnB1dCAxIEJ5cGFzcyBTd2l0Y2giLCAiSU4xUEdBIiB9LCBcCisJeyBfc2luaywgIklucHV0IDIgQnlwYXNzIFN3aXRjaCIsICJJTjJQR0EiIH0sIFwKKwl7IF9zaW5rLCAiSW5wdXQgMyBCeXBhc3MgU3dpdGNoIiwgIklOM1BHQSIgfSwgXAorCXsgX3NpbmssICJJbnB1dCA0IEJ5cGFzcyBTd2l0Y2giLCAiSU40UEdBIiB9CisKKyNkZWZpbmUgUklHSFRfT1VUUFVUX01JWEVSX1JPVVRFUyhfc2luaykgXAorCXsgX3NpbmssICJSaWdodCBEQUMyIFN3aXRjaCIsICJSaWdodCBEQUMyIiB9LCBcCisJeyBfc2luaywgIkxlZnQgREFDMiBTd2l0Y2giLCAiTGVmdCBEQUMyIiB9LCBcCisJeyBfc2luaywgIlJpZ2h0IERBQzEgU3dpdGNoIiwgIlJpZ2h0IERBQzEiIH0sIFwKKwl7IF9zaW5rLCAiTGVmdCBEQUMxIFN3aXRjaCIsICJMZWZ0IERBQzEiIH0sIFwKKwl7IF9zaW5rLCAiSW5wdXQgMSBCeXBhc3MgU3dpdGNoIiwgIklOMVBHQSIgfSwgXAorCXsgX3NpbmssICJJbnB1dCAyIEJ5cGFzcyBTd2l0Y2giLCAiSU4yUEdBIiB9LCBcCisJeyBfc2luaywgIklucHV0IDMgQnlwYXNzIFN3aXRjaCIsICJJTjNQR0EiIH0sIFwKKwl7IF9zaW5rLCAiSW5wdXQgNCBCeXBhc3MgU3dpdGNoIiwgIklONFBHQSIgfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhZGF1MTM3M19kYXBtX3JvdXRlc1tdID0geworCXsgIkxlZnQgQURDIE1peGVyIiwgIkRBQzEgU3dpdGNoIiwgIkxlZnQgREFDMSIgfSwKKwl7ICJMZWZ0IEFEQyBNaXhlciIsICJJbnB1dCAxIFN3aXRjaCIsICJJTjFQR0EiIH0sCisJeyAiTGVmdCBBREMgTWl4ZXIiLCAiSW5wdXQgMiBTd2l0Y2giLCAiSU4yUEdBIiB9LAorCXsgIkxlZnQgQURDIE1peGVyIiwgIklucHV0IDMgU3dpdGNoIiwgIklOM1BHQSIgfSwKKwl7ICJMZWZ0IEFEQyBNaXhlciIsICJJbnB1dCA0IFN3aXRjaCIsICJJTjRQR0EiIH0sCisKKwl7ICJSaWdodCBBREMgTWl4ZXIiLCAiREFDMSBTd2l0Y2giLCAiUmlnaHQgREFDMSIgfSwKKwl7ICJSaWdodCBBREMgTWl4ZXIiLCAiSW5wdXQgMSBTd2l0Y2giLCAiSU4xUEdBIiB9LAorCXsgIlJpZ2h0IEFEQyBNaXhlciIsICJJbnB1dCAyIFN3aXRjaCIsICJJTjJQR0EiIH0sCisJeyAiUmlnaHQgQURDIE1peGVyIiwgIklucHV0IDMgU3dpdGNoIiwgIklOM1BHQSIgfSwKKwl7ICJSaWdodCBBREMgTWl4ZXIiLCAiSW5wdXQgNCBTd2l0Y2giLCAiSU40UEdBIiB9LAorCisJeyAiTGVmdCBBREMiLCBOVUxMLCAiTGVmdCBBREMgTWl4ZXIiIH0sCisJeyAiUmlnaHQgQURDIiwgTlVMTCwgIlJpZ2h0IEFEQyBNaXhlciIgfSwKKworCXsgIkRlY2ltYXRvciBNdXgiLCAiQURDIiwgIkxlZnQgQURDIiB9LAorCXsgIkRlY2ltYXRvciBNdXgiLCAiQURDIiwgIlJpZ2h0IEFEQyIgfSwKKwl7ICJEZWNpbWF0b3IgTXV4IiwgIkRNSUMxIiwgIkRNSUMxIiB9LAorCisJRFNQX0NIQU5ORUxfTUlYRVJfUk9VVEVTKCJEU1AgQ2hhbm5lbDEgTWl4ZXIiKSwKKwlEU1BfQ0hBTk5FTF9NSVhFUl9ST1VURVMoIkRTUCBDaGFubmVsMiBNaXhlciIpLAorCURTUF9DSEFOTkVMX01JWEVSX1JPVVRFUygiRFNQIENoYW5uZWwzIE1peGVyIiksCisJRFNQX0NIQU5ORUxfTUlYRVJfUk9VVEVTKCJEU1AgQ2hhbm5lbDQgTWl4ZXIiKSwKKwlEU1BfQ0hBTk5FTF9NSVhFUl9ST1VURVMoIkRTUCBDaGFubmVsNSBNaXhlciIpLAorCisJRFNQX09VVFBVVF9NSVhFUl9ST1VURVMoIkFJRjEgTWl4ZXIiKSwKKwlEU1BfT1VUUFVUX01JWEVSX1JPVVRFUygiQUlGMiBNaXhlciIpLAorCURTUF9PVVRQVVRfTUlYRVJfUk9VVEVTKCJBSUYzIE1peGVyIiksCisJRFNQX09VVFBVVF9NSVhFUl9ST1VURVMoIkRBQzEgTWl4ZXIiKSwKKwlEU1BfT1VUUFVUX01JWEVSX1JPVVRFUygiREFDMiBNaXhlciIpLAorCisJeyAiQUlGMSBPVVQiLCBOVUxMLCAiQUlGMSBNaXhlciIgfSwKKwl7ICJBSUYyIE9VVCIsIE5VTEwsICJBSUYyIE1peGVyIiB9LAorCXsgIkFJRjMgT1VUIiwgTlVMTCwgIkFJRjMgTWl4ZXIiIH0sCisJeyAiTGVmdCBEQUMxIiwgTlVMTCwgIkRBQzEgTWl4ZXIiIH0sCisJeyAiUmlnaHQgREFDMSIsIE5VTEwsICJEQUMxIE1peGVyIiB9LAorCXsgIkxlZnQgREFDMiIsIE5VTEwsICJEQUMyIE1peGVyIiB9LAorCXsgIlJpZ2h0IERBQzIiLCBOVUxMLCAiREFDMiBNaXhlciIgfSwKKworCUxFRlRfT1VUUFVUX01JWEVSX1JPVVRFUygiTGVmdCBMaW5lb3V0MSBNaXhlciIpLAorCVJJR0hUX09VVFBVVF9NSVhFUl9ST1VURVMoIlJpZ2h0IExpbmVvdXQxIE1peGVyIiksCisJTEVGVF9PVVRQVVRfTUlYRVJfUk9VVEVTKCJMZWZ0IExpbmVvdXQyIE1peGVyIiksCisJUklHSFRfT1VUUFVUX01JWEVSX1JPVVRFUygiUmlnaHQgTGluZW91dDIgTWl4ZXIiKSwKKwlMRUZUX09VVFBVVF9NSVhFUl9ST1VURVMoIkxlZnQgU3BlYWtlciBNaXhlciIpLAorCVJJR0hUX09VVFBVVF9NSVhFUl9ST1VURVMoIlJpZ2h0IFNwZWFrZXIgTWl4ZXIiKSwKKworCXsgIkxlZnQgSGVhZHBob25lIE1peGVyIiwgIkxlZnQgREFDMiBTd2l0Y2giLCAiTGVmdCBEQUMyIiB9LAorCXsgIkxlZnQgSGVhZHBob25lIE1peGVyIiwgIkxlZnQgREFDMSBTd2l0Y2giLCAiTGVmdCBEQUMxIiB9LAorCXsgIkxlZnQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDEgQnlwYXNzIFN3aXRjaCIsICJJTjFQR0EiIH0sCisJeyAiTGVmdCBIZWFkcGhvbmUgTWl4ZXIiLCAiSW5wdXQgMiBCeXBhc3MgU3dpdGNoIiwgIklOMlBHQSIgfSwKKwl7ICJMZWZ0IEhlYWRwaG9uZSBNaXhlciIsICJJbnB1dCAzIEJ5cGFzcyBTd2l0Y2giLCAiSU4zUEdBIiB9LAorCXsgIkxlZnQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDQgQnlwYXNzIFN3aXRjaCIsICJJTjRQR0EiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIlJpZ2h0IERBQzIgU3dpdGNoIiwgIlJpZ2h0IERBQzIiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIlJpZ2h0IERBQzEgU3dpdGNoIiwgIlJpZ2h0IERBQzEiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDEgQnlwYXNzIFN3aXRjaCIsICJJTjFQR0EiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDIgQnlwYXNzIFN3aXRjaCIsICJJTjJQR0EiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDMgQnlwYXNzIFN3aXRjaCIsICJJTjNQR0EiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDQgQnlwYXNzIFN3aXRjaCIsICJJTjRQR0EiIH0sCisKKwl7ICJMZWZ0IEhlYWRwaG9uZSBNaXhlciIsIE5VTEwsICJIZWFkcGhvbmUgRW5hYmxlIiB9LAorCXsgIlJpZ2h0IEhlYWRwaG9uZSBNaXhlciIsIE5VTEwsICJIZWFkcGhvbmUgRW5hYmxlIiB9LAorCisJeyAiRWFycGllY2UgTWl4ZXIiLCAiUmlnaHQgREFDMiBTd2l0Y2giLCAiUmlnaHQgREFDMiIgfSwKKwl7ICJFYXJwaWVjZSBNaXhlciIsICJMZWZ0IERBQzIgU3dpdGNoIiwgIkxlZnQgREFDMiIgfSwKKwl7ICJFYXJwaWVjZSBNaXhlciIsICJSaWdodCBEQUMxIFN3aXRjaCIsICJSaWdodCBEQUMxIiB9LAorCXsgIkVhcnBpZWNlIE1peGVyIiwgIkxlZnQgREFDMSBTd2l0Y2giLCAiTGVmdCBEQUMxIiB9LAorCXsgIkVhcnBpZWNlIE1peGVyIiwgIklucHV0IDEgQnlwYXNzIFN3aXRjaCIsICJJTjFQR0EiIH0sCisJeyAiRWFycGllY2UgTWl4ZXIiLCAiSW5wdXQgMiBCeXBhc3MgU3dpdGNoIiwgIklOMlBHQSIgfSwKKwl7ICJFYXJwaWVjZSBNaXhlciIsICJJbnB1dCAzIEJ5cGFzcyBTd2l0Y2giLCAiSU4zUEdBIiB9LAorCXsgIkVhcnBpZWNlIE1peGVyIiwgIklucHV0IDQgQnlwYXNzIFN3aXRjaCIsICJJTjRQR0EiIH0sCisKKwl7ICJMT1VUMUwiLCBOVUxMLCAiTGVmdCBMaW5lb3V0MSBNaXhlciIgfSwKKwl7ICJMT1VUMVIiLCBOVUxMLCAiUmlnaHQgTGluZW91dDEgTWl4ZXIiIH0sCisJeyAiTE9VVDJMIiwgTlVMTCwgIkxlZnQgTGluZW91dDIgTWl4ZXIiIH0sCisJeyAiTE9VVDJSIiwgTlVMTCwgIlJpZ2h0IExpbmVvdXQyIE1peGVyIiB9LAorCXsgIlNQS0wiLCBOVUxMLCAiTGVmdCBTcGVha2VyIE1peGVyIiB9LAorCXsgIlNQS1IiLCBOVUxMLCAiUmlnaHQgU3BlYWtlciBNaXhlciIgfSwKKwl7ICJIUEwiLCBOVUxMLCAiTGVmdCBIZWFkcGhvbmUgTWl4ZXIiIH0sCisJeyAiSFBSIiwgTlVMTCwgIlJpZ2h0IEhlYWRwaG9uZSBNaXhlciIgfSwKKwl7ICJFUCIsIE5VTEwsICJFYXJwaWVjZSBNaXhlciIgfSwKKworCXsgIklOMVBHQSIsIE5VTEwsICJBSU4xTCIgfSwKKwl7ICJJTjJQR0EiLCBOVUxMLCAiQUlOMkwiIH0sCisJeyAiSU4zUEdBIiwgTlVMTCwgIkFJTjNMIiB9LAorCXsgIklONFBHQSIsIE5VTEwsICJBSU40TCIgfSwKKwl7ICJJTjFQR0EiLCBOVUxMLCAiQUlOMVIiIH0sCisJeyAiSU4yUEdBIiwgTlVMTCwgIkFJTjJSIiB9LAorCXsgIklOM1BHQSIsIE5VTEwsICJBSU4zUiIgfSwKKwl7ICJJTjRQR0EiLCBOVUxMLCAiQUlONFIiIH0sCisKKwl7ICJTWVNDTEsxIiwgTlVMTCwgIlBMTDEiIH0sCisJeyAiU1lTQ0xLMiIsIE5VTEwsICJQTEwyIiB9LAorCisJeyAiTGVmdCBEQUMxIiwgTlVMTCwgIlNZU0NMSzEiIH0sCisJeyAiUmlnaHQgREFDMSIsIE5VTEwsICJTWVNDTEsxIiB9LAorCXsgIkxlZnQgREFDMiIsIE5VTEwsICJTWVNDTEsxIiB9LAorCXsgIlJpZ2h0IERBQzIiLCBOVUxMLCAiU1lTQ0xLMSIgfSwKKwl7ICJMZWZ0IEFEQyIsIE5VTEwsICJTWVNDTEsxIiB9LAorCXsgIlJpZ2h0IEFEQyIsIE5VTEwsICJTWVNDTEsxIiB9LAorCisJeyAiRFNQIiwgTlVMTCwgIlNZU0NMSzEiIH0sCisKKwl7ICJBSUYxIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJBSUYyIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJBSUYzIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJEQUMxIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJEQUMyIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJEQUMxIE1peGVyIiwgTlVMTCwgIlBsYXliYWNrIEVuZ2luZSBBIiB9LAorCXsgIkRBQzIgTWl4ZXIiLCBOVUxMLCAiUGxheWJhY2sgRW5naW5lIEIiIH0sCisJeyAiTGVmdCBBREMgTWl4ZXIiLCBOVUxMLCAiUmVjb3JkaW5nIEVuZ2luZSBBIiB9LAorCXsgIlJpZ2h0IEFEQyBNaXhlciIsIE5VTEwsICJSZWNvcmRpbmcgRW5naW5lIEEiIH0sCisKKwl7ICJBSUYxIENMSyIsIE5VTEwsICJTWVNDTEsxIiwgYWRhdTEzNzNfY2hlY2tfYWlmX2NsayB9LAorCXsgIkFJRjIgQ0xLIiwgTlVMTCwgIlNZU0NMSzEiLCBhZGF1MTM3M19jaGVja19haWZfY2xrIH0sCisJeyAiQUlGMyBDTEsiLCBOVUxMLCAiU1lTQ0xLMSIsIGFkYXUxMzczX2NoZWNrX2FpZl9jbGsgfSwKKwl7ICJBSUYxIENMSyIsIE5VTEwsICJTWVNDTEsyIiwgYWRhdTEzNzNfY2hlY2tfYWlmX2NsayB9LAorCXsgIkFJRjIgQ0xLIiwgTlVMTCwgIlNZU0NMSzIiLCBhZGF1MTM3M19jaGVja19haWZfY2xrIH0sCisJeyAiQUlGMyBDTEsiLCBOVUxMLCAiU1lTQ0xLMiIsIGFkYXUxMzczX2NoZWNrX2FpZl9jbGsgfSwKKworCXsgIkFJRjEgSU4iLCBOVUxMLCAiQUlGMSBDTEsiIH0sCisJeyAiQUlGMSBPVVQiLCBOVUxMLCAiQUlGMSBDTEsiIH0sCisJeyAiQUlGMiBJTiIsIE5VTEwsICJBSUYyIENMSyIgfSwKKwl7ICJBSUYyIE9VVCIsIE5VTEwsICJBSUYyIENMSyIgfSwKKwl7ICJBSUYzIElOIiwgTlVMTCwgIkFJRjMgQ0xLIiB9LAorCXsgIkFJRjMgT1VUIiwgTlVMTCwgIkFJRjMgQ0xLIiB9LAorCXsgIkFJRjEgSU4iLCBOVUxMLCAiQUlGMSBJTiBTUkMiLCBhZGF1MTM3M19jaGVja19zcmMgfSwKKwl7ICJBSUYxIE9VVCIsIE5VTEwsICJBSUYxIE9VVCBTUkMiLCBhZGF1MTM3M19jaGVja19zcmMgfSwKKwl7ICJBSUYyIElOIiwgTlVMTCwgIkFJRjIgSU4gU1JDIiwgYWRhdTEzNzNfY2hlY2tfc3JjIH0sCisJeyAiQUlGMiBPVVQiLCBOVUxMLCAiQUlGMiBPVVQgU1JDIiwgYWRhdTEzNzNfY2hlY2tfc3JjIH0sCisJeyAiQUlGMyBJTiIsIE5VTEwsICJBSUYzIElOIFNSQyIsIGFkYXUxMzczX2NoZWNrX3NyYyB9LAorCXsgIkFJRjMgT1VUIiwgTlVMTCwgIkFJRjMgT1VUIFNSQyIsIGFkYXUxMzczX2NoZWNrX3NyYyB9LAorCisJeyAiRE1JQzEiLCBOVUxMLCAiRE1JQzFEQVQiIH0sCisJeyAiRE1JQzEiLCBOVUxMLCAiU1lTQ0xLMSIgfSwKKwl7ICJETUlDMSIsIE5VTEwsICJSZWNvcmRpbmcgRW5naW5lIEEiIH0sCisJeyAiRE1JQzIiLCBOVUxMLCAiRE1JQzJEQVQiIH0sCisJeyAiRE1JQzIiLCBOVUxMLCAiU1lTQ0xLMSIgfSwKKwl7ICJETUlDMiIsIE5VTEwsICJSZWNvcmRpbmcgRW5naW5lIEIiIH0sCit9OworCitzdGF0aWMgaW50IGFkYXUxMzczX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgYWRhdTEzNzMgKmFkYXUxMzczID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGFkYXUxMzczX2RhaSAqYWRhdTEzNzNfZGFpID0gJmFkYXUxMzczLT5kYWlzW2RhaS0+aWRdOworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgaW50IGZyZXE7CisJdW5zaWduZWQgaW50IGN0cmw7CisKKwlmcmVxID0gYWRhdTEzNzNfZGFpLT5zeXNjbGs7CisKKwlpZiAoZnJlcSAlIHBhcmFtc19yYXRlKHBhcmFtcykgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGZyZXEgLyBwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJY2FzZSAxMDI0OiAvKiBzeXNjbGsgLyAyNTYgKi8KKwkJZGl2ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxNTM2OiAvKiAyLzMgc3lzY2xrIC8gMjU2ICovCisJCWRpdiA9IDE7CisJCWJyZWFrOworCWNhc2UgMjA0ODogLyogMS8yIHN5c2NsayAvIDI1NiAqLworCQlkaXYgPSAyOworCQlicmVhazsKKwljYXNlIDMwNzI6IC8qIDEvMyBzeXNjbGsgLyAyNTYgKi8KKwkJZGl2ID0gMzsKKwkJYnJlYWs7CisJY2FzZSA0MDk2OiAvKiAxLzQgc3lzY2xrIC8gMjU2ICovCisJCWRpdiA9IDQ7CisJCWJyZWFrOworCWNhc2UgNjE0NDogLyogMS82IHN5c2NsayAvIDI1NiAqLworCQlkaXYgPSA1OworCQlicmVhazsKKwljYXNlIDU2MzI6IC8qIDIvMTEgc3lzY2xrIC8gMjU2ICovCisJCWRpdiA9IDY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkYXUxMzczX2RhaS0+ZW5hYmxlX3NyYyA9IChkaXYgIT0gMCk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFVMTM3M19CQ0xLRElWKGRhaS0+aWQpLAorCQl+QURBVTEzNzNfQkNMS0RJVl9TT1VSQ0UsIChkaXYgPDwgMikgfCBBREFVMTM3M19CQ0xLRElWXzY0KTsKKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJY3RybCA9IEFEQVUxMzczX0RBSV9XTEVOXzE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJY3RybCA9IEFEQVUxMzczX0RBSV9XTEVOXzIwOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQljdHJsID0gQURBVTEzNzNfREFJX1dMRU5fMjQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWN0cmwgPSBBREFVMTM3M19EQUlfV0xFTl8zMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX0RBSShkYWktPmlkKSwKKwkJCUFEQVUxMzczX0RBSV9XTEVOX01BU0ssIGN0cmwpOworfQorCitzdGF0aWMgaW50IGFkYXUxMzczX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IGFkYXUxMzczICphZGF1MTM3MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBhZGF1MTM3M19kYWkgKmFkYXUxMzczX2RhaSA9ICZhZGF1MTM3My0+ZGFpc1tkYWktPmlkXTsKKwl1bnNpZ25lZCBpbnQgY3RybDsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWN0cmwgPSBBREFVMTM3M19EQUlfTUFTVEVSOworCQlhZGF1MTM3M19kYWktPm1hc3RlciA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJY3RybCA9IDA7CisJCWFkYXUxMzczX2RhaS0+bWFzdGVyID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJY3RybCB8PSBBREFVMTM3M19EQUlfRk9STUFUX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCWN0cmwgfD0gQURBVTEzNzNfREFJX0ZPUk1BVF9MRUZUX0o7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfUklHSFRfSjoKKwkJY3RybCB8PSBBREFVMTM3M19EQUlfRk9STUFUX1JJR0hUX0o7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWN0cmwgfD0gQURBVTEzNzNfREFJX0ZPUk1BVF9EU1A7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQljdHJsIHw9IEFEQVUxMzczX0RBSV9JTlZFUlRfQkNMSzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9JRjoKKwkJY3RybCB8PSBBREFVMTM3M19EQUlfSU5WRVJUX0xSQ0xLOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQljdHJsIHw9IEFEQVUxMzczX0RBSV9JTlZFUlRfTFJDTEsgfCBBREFVMTM3M19EQUlfSU5WRVJUX0JDTEs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX0RBSShkYWktPmlkKSwKKwkJfkFEQVUxMzczX0RBSV9XTEVOX01BU0ssIGN0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTEzNzNfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IGFkYXUxMzczICphZGF1MTM3MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJc3RydWN0IGFkYXUxMzczX2RhaSAqYWRhdTEzNzNfZGFpID0gJmFkYXUxMzczLT5kYWlzW2RhaS0+aWRdOworCisJc3dpdGNoIChjbGtfaWQpIHsKKwljYXNlIEFEQVUxMzczX0NMS19TUkNfUExMMToKKwljYXNlIEFEQVUxMzczX0NMS19TUkNfUExMMjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWRhdTEzNzNfZGFpLT5zeXNjbGsgPSBmcmVxOworCWFkYXUxMzczX2RhaS0+Y2xrX3NyYyA9IGNsa19pZDsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoZGFpLT5jb2RlYywgQURBVTEzNzNfQkNMS0RJVihkYWktPmlkKSwKKwkJQURBVTEzNzNfQkNMS0RJVl9TT1VSQ0UsIGNsa19pZCA8PCA1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhZGF1MTM3M19kYWlfb3BzID0geworCS5od19wYXJhbXMJPSBhZGF1MTM3M19od19wYXJhbXMsCisJLnNldF9zeXNjbGsJPSBhZGF1MTM3M19zZXRfZGFpX3N5c2NsaywKKwkuc2V0X2ZtdAk9IGFkYXUxMzczX3NldF9kYWlfZm10LAorfTsKKworI2RlZmluZSBBREFVMTM3M19GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKKwlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhZGF1MTM3M19kYWlfZHJpdmVyW10gPSB7CisJeworCQkuaWQgPSAwLAorCQkubmFtZSA9ICJhZGF1MTM3My1haWYxIiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IEFEQVUxMzczX0ZPUk1BVFMsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gQURBVTEzNzNfRk9STUFUUywKKwkJfSwKKwkJLm9wcyA9ICZhZGF1MTM3M19kYWlfb3BzLAorCQkuc3ltbWV0cmljX3JhdGVzID0gMSwKKwl9LAorCXsKKwkJLmlkID0gMSwKKwkJLm5hbWUgPSAiYWRhdTEzNzMtYWlmMiIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBBREFVMTM3M19GT1JNQVRTLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IEFEQVUxMzczX0ZPUk1BVFMsCisJCX0sCisJCS5vcHMgPSAmYWRhdTEzNzNfZGFpX29wcywKKwkJLnN5bW1ldHJpY19yYXRlcyA9IDEsCisJfSwKKwl7CisJCS5pZCA9IDIsCisJCS5uYW1lID0gImFkYXUxMzczLWFpZjMiLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMyBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gQURBVTEzNzNfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMyBDYXB0dXJlIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBBREFVMTM3M19GT1JNQVRTLAorCQl9LAorCQkub3BzID0gJmFkYXUxMzczX2RhaV9vcHMsCisJCS5zeW1tZXRyaWNfcmF0ZXMgPSAxLAorCX0sCit9OworCitzdGF0aWMgaW50IGFkYXUxMzczX3NldF9wbGwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgcGxsX2lkLAorCWludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJdW5zaWduZWQgaW50IGRwbGxfZGl2ID0gMDsKKwl1bnNpZ25lZCBpbnQgeCwgciwgbiwgbSwgaSwgaiwgbW9kZTsKKworCXN3aXRjaCAocGxsX2lkKSB7CisJY2FzZSBBREFVMTM3M19QTEwxOgorCWNhc2UgQURBVTEzNzNfUExMMjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChzb3VyY2UpIHsKKwljYXNlIEFEQVUxMzczX1BMTF9TUkNfQkNMSzE6CisJY2FzZSBBREFVMTM3M19QTExfU1JDX0JDTEsyOgorCWNhc2UgQURBVTEzNzNfUExMX1NSQ19CQ0xLMzoKKwljYXNlIEFEQVUxMzczX1BMTF9TUkNfTFJDTEsxOgorCWNhc2UgQURBVTEzNzNfUExMX1NSQ19MUkNMSzI6CisJY2FzZSBBREFVMTM3M19QTExfU1JDX0xSQ0xLMzoKKwljYXNlIEFEQVUxMzczX1BMTF9TUkNfTUNMSzE6CisJY2FzZSBBREFVMTM3M19QTExfU1JDX01DTEsyOgorCWNhc2UgQURBVTEzNzNfUExMX1NSQ19HUElPMToKKwljYXNlIEFEQVUxMzczX1BMTF9TUkNfR1BJTzI6CisJY2FzZSBBREFVMTM3M19QTExfU1JDX0dQSU8zOgorCWNhc2UgQURBVTEzNzNfUExMX1NSQ19HUElPNDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZyZXFfaW4gPCA3ODEzIHx8IGZyZXFfaW4gPiAyNzAwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZnJlcV9vdXQgPCA0NTE1ODAwMCB8fCBmcmVxX291dCA+IDQ5MTUyMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEFQTEwgaW5wdXQgbmVlZHMgdG8gYmUgPj0gOE1oeiwgc28gaW4gY2FzZSBmcmVxX2luIGlzIGxlc3Mgd2UgdXNlIHRoZQorCSAqIERQTEwgdG8gZ2V0IGl0IHRoZXJlLiBEUExMX291dCA9IChEUExMX2luIC8gZGl2KSAqIDEwMjQgKi8KKwl3aGlsZSAoZnJlcV9pbiA8IDgwMDAwMDApIHsKKwkJZnJlcV9pbiAqPSAyOworCQlkcGxsX2RpdisrOworCX0KKworCWlmIChmcmVxX291dCAlIGZyZXFfaW4gIT0gMCkgeworCQkvKiBmb3V0ID0gZmluICogKHIgKyAobi9tKSkgLyB4ICovCisJCXggPSBESVZfUk9VTkRfVVAoZnJlcV9pbiwgMTM1MDAwMDApOworCQlmcmVxX2luIC89IHg7CisJCXIgPSBmcmVxX291dCAvIGZyZXFfaW47CisJCWkgPSBmcmVxX291dCAlIGZyZXFfaW47CisJCWogPSBnY2QoaSwgZnJlcV9pbik7CisJCW4gPSBpIC8gajsKKwkJbSA9IGZyZXFfaW4gLyBqOworCQl4LS07CisJCW1vZGUgPSAxOworCX0gZWxzZSB7CisJCS8qIGZvdXQgPSBmaW4gLyByICovCisJCXIgPSBmcmVxX291dCAvIGZyZXFfaW47CisJCW4gPSAwOworCQltID0gMDsKKwkJeCA9IDA7CisJCW1vZGUgPSAwOworCX0KKworCWlmIChyIDwgMiB8fCByID4gOCB8fCB4ID4gMyB8fCBtID4gMHhmZmZmIHx8IG4gPiAweGZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRwbGxfZGl2KSB7CisJCWRwbGxfZGl2ID0gMTEgLSBkcGxsX2RpdjsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVTEzNzNfUExMX0NUUkw2KHBsbF9pZCksCisJCQlBREFVMTM3M19QTExfQ1RSTDZfRFBMTF9CWVBBU1MsIDApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX1BMTF9DVFJMNihwbGxfaWQpLAorCQkJQURBVTEzNzNfUExMX0NUUkw2X0RQTExfQllQQVNTLAorCQkJQURBVTEzNzNfUExMX0NUUkw2X0RQTExfQllQQVNTKTsKKwl9CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19EUExMX0NUUkwocGxsX2lkKSwKKwkJKHNvdXJjZSA8PCA0KSB8IGRwbGxfZGl2KTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19QTExfQ1RSTDEocGxsX2lkKSwgKG0gPj4gOCkgJiAweGZmKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19QTExfQ1RSTDIocGxsX2lkKSwgbSAmIDB4ZmYpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxMzczX1BMTF9DVFJMMyhwbGxfaWQpLCAobiA+PiA4KSAmIDB4ZmYpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxMzczX1BMTF9DVFJMNChwbGxfaWQpLCBuICYgMHhmZik7CisJc25kX3NvY193cml0ZShjb2RlYywgQURBVTEzNzNfUExMX0NUUkw1KHBsbF9pZCksCisJCShyIDw8IDMpIHwgKHggPDwgMSkgfCBtb2RlKTsKKworCS8qIFNldCBzeXNjbGsgdG8gcGxsX3JhdGUgLyA0ICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVTEzNzNfQ0xLX1NSQ19ESVYocGxsX2lkKSwgMHgzZiwgMHgwOSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWRhdTEzNzNfbG9hZF9kcmNfc2V0dGluZ3Moc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCBuciwgdWludDhfdCAqZHJjKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFEQVUxMzczX0RSQ19TSVpFOyArK2kpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxMzczX0RSQyhucikgKyBpLCBkcmNbaV0pOworfQorCitzdGF0aWMgYm9vbCBhZGF1MTM3M192YWxpZF9taWNiaWFzKGVudW0gYWRhdTEzNzNfbWljYmlhc192b2x0YWdlIG1pY2JpYXMpCit7CisJc3dpdGNoIChtaWNiaWFzKSB7CisJY2FzZSBBREFVMTM3M19NSUNCSUFTXzJfOVY6CisJY2FzZSBBREFVMTM3M19NSUNCSUFTXzJfMlY6CisJY2FzZSBBREFVMTM3M19NSUNCSUFTXzJfNlY6CisJY2FzZSBBREFVMTM3M19NSUNCSUFTXzFfOFY6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTEzNzNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhZGF1MTM3M19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNvZGVjLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJYm9vbCBsaW5lb3V0X2RpZmZlcmVudGlhbCA9IGZhbHNlOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX0kyQyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJmYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IHRydWU7CisKKwlpZiAocGRhdGEpIHsKKwkJaWYgKHBkYXRhLT5udW1fZHJjID4gQVJSQVlfU0laRShwZGF0YS0+ZHJjX3NldHRpbmcpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCFhZGF1MTM3M192YWxpZF9taWNiaWFzKHBkYXRhLT5taWNiaWFzMSkgfHwKKwkJCSFhZGF1MTM3M192YWxpZF9taWNiaWFzKHBkYXRhLT5taWNiaWFzMikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9kcmM7ICsraSkgeworCQkJYWRhdTEzNzNfbG9hZF9kcmNfc2V0dGluZ3MoY29kZWMsIGksCisJCQkJcGRhdGEtPmRyY19zZXR0aW5nW2ldKTsKKwkJfQorCisJCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhZGF1MTM3M19kcmNfY29udHJvbHMsCisJCQlwZGF0YS0+bnVtX2RyYyk7CisKKwkJdmFsID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJaWYgKHBkYXRhLT5pbnB1dF9kaWZmZXJlbnRpYWxbaV0pCisJCQkJdmFsIHw9IEJJVChpKTsKKwkJfQorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19JTlBVVF9NT0RFLCB2YWwpOworCisJCXZhbCA9IDA7CisJCWlmIChwZGF0YS0+bGluZW91dF9kaWZmZXJlbnRpYWwpCisJCQl2YWwgfD0gQURBVTEzNzNfT1VUUFVUX0NUUkxfTERJRkY7CisJCWlmIChwZGF0YS0+bGluZW91dF9ncm91bmRfc2Vuc2UpCisJCQl2YWwgfD0gQURBVTEzNzNfT1VUUFVUX0NUUkxfTE5GQkVOOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19PVVRQVVRfQ1RSTCwgdmFsKTsKKworCQlsaW5lb3V0X2RpZmZlcmVudGlhbCA9IHBkYXRhLT5saW5lb3V0X2RpZmZlcmVudGlhbDsKKworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19FUF9DVFJMLAorCQkJKHBkYXRhLT5taWNiaWFzMSA8PCBBREFVMTM3M19FUF9DVFJMX01JQ0JJQVMxX09GRlNFVCkgfAorCQkJKHBkYXRhLT5taWNiaWFzMiA8PCBBREFVMTM3M19FUF9DVFJMX01JQ0JJQVMyX09GRlNFVCkpOworCX0KKworCWlmICghbGluZW91dF9kaWZmZXJlbnRpYWwpIHsKKwkJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIGFkYXUxMzczX2xpbmVvdXQyX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShhZGF1MTM3M19saW5lb3V0Ml9jb250cm9scykpOworCX0KKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxMzczX0FEQ19DVFJMLAorCSAgICBBREFVMTM3M19BRENfQ1RSTF9SRVNFVF9GT1JDRSB8IEFEQVUxMzczX0FEQ19DVFJMX1BFQUtfREVURUNUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxMzczX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfT046CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX1BXRE5fQ1RSTDMsCisJCQlBREFVMTM3M19QV0ROX0NUUkwzX1BXUl9FTiwgQURBVTEzNzNfUFdETl9DVFJMM19QV1JfRU4pOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX1BXRE5fQ1RSTDMsCisJCQlBREFVMTM3M19QV0ROX0NUUkwzX1BXUl9FTiwgMCk7CisJCWJyZWFrOworCX0KKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTEzNzNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlhZGF1MTM3M19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTEzNzNfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gYWRhdTEzNzNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworfQorCitzdGF0aWMgaW50IGFkYXUxMzczX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJYWRhdTEzNzNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKwlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgYWRhdTEzNzNfY29kZWNfZHJpdmVyID0geworCS5wcm9iZSA9CWFkYXUxMzczX3Byb2JlLAorCS5yZW1vdmUgPQlhZGF1MTM3M19yZW1vdmUsCisJLnN1c3BlbmQgPQlhZGF1MTM3M19zdXNwZW5kLAorCS5yZXN1bWUgPQlhZGF1MTM3M19yZXN1bWUsCisJLnNldF9iaWFzX2xldmVsID0gYWRhdTEzNzNfc2V0X2JpYXNfbGV2ZWwsCisJLnJlZ19jYWNoZV9zaXplID0gQVJSQVlfU0laRShhZGF1MTM3M19kZWZhdWx0X3JlZ3MpLAorCS5yZWdfY2FjaGVfZGVmYXVsdCA9IGFkYXUxMzczX2RlZmF1bHRfcmVncywKKwkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1aW50OF90KSwKKworCS5zZXRfcGxsID0gYWRhdTEzNzNfc2V0X3BsbCwKKworCS5jb250cm9scyA9IGFkYXUxMzczX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkYXUxMzczX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gYWRhdTEzNzNfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZGF1MTM3M19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGFkYXUxMzczX2RhcG1fcm91dGVzLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkYXUxMzczX2RhcG1fcm91dGVzKSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkYXUxMzczX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWRhdTEzNzMgKmFkYXUxMzczOworCWludCByZXQ7CisKKwlhZGF1MTM3MyA9IGt6YWxsb2Moc2l6ZW9mKCphZGF1MTM3MyksIEdGUF9LRVJORUwpOworCWlmICghYWRhdTEzNzMpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKCZjbGllbnQtPmRldiwgYWRhdTEzNzMpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsICZhZGF1MTM3M19jb2RlY19kcml2ZXIsCisJCQlhZGF1MTM3M19kYWlfZHJpdmVyLCBBUlJBWV9TSVpFKGFkYXUxMzczX2RhaV9kcml2ZXIpKTsKKwlpZiAocmV0IDwgMCkKKwkJa2ZyZWUoYWRhdTEzNzMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRhdTEzNzNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOworCWtmcmVlKGRldl9nZXRfZHJ2ZGF0YSgmY2xpZW50LT5kZXYpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkYXUxMzczX2kyY19pZFtdID0geworCXsgImFkYXUxMzczIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZGF1MTM3M19pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRhdTEzNzNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGF1MTM3MyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRhdTEzNzNfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGF1MTM3M19pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZGF1MTM3M19pMmNfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZGF1MTM3M19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZGF1MTM3M19pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkYXUxMzczX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWRhdTEzNzNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZGF1MTM3M19pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkYXUxMzczX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgQURBVTEzNzMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFiNTUzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX19BREFVMTM3M19IX18KKyNkZWZpbmUgX19BREFVMTM3M19IX18KKworZW51bSBhZGF1MTM3M19wbGxfc3JjIHsKKwlBREFVMTM3M19QTExfU1JDX01DTEsxID0gMCwKKwlBREFVMTM3M19QTExfU1JDX0JDTEsxID0gMSwKKwlBREFVMTM3M19QTExfU1JDX0JDTEsyID0gMiwKKwlBREFVMTM3M19QTExfU1JDX0JDTEszID0gMywKKwlBREFVMTM3M19QTExfU1JDX0xSQ0xLMSA9IDQsCisJQURBVTEzNzNfUExMX1NSQ19MUkNMSzIgPSA1LAorCUFEQVUxMzczX1BMTF9TUkNfTFJDTEszID0gNiwKKwlBREFVMTM3M19QTExfU1JDX0dQSU8xID0gNywKKwlBREFVMTM3M19QTExfU1JDX0dQSU8yID0gOCwKKwlBREFVMTM3M19QTExfU1JDX0dQSU8zID0gOSwKKwlBREFVMTM3M19QTExfU1JDX0dQSU80ID0gMTAsCisJQURBVTEzNzNfUExMX1NSQ19NQ0xLMiA9IDExLAorfTsKKworZW51bSBhZGF1MTM3M19wbGwgeworCUFEQVUxMzczX1BMTDEgPSAwLAorCUFEQVUxMzczX1BMTDIgPSAxLAorfTsKKworZW51bSBhZGF1MTM3M19jbGtfc3JjIHsKKwlBREFVMTM3M19DTEtfU1JDX1BMTDEgPSAwLAorCUFEQVUxMzczX0NMS19TUkNfUExMMiA9IDEsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYwppbmRleCAyNzU4ZDVmLi44YjdlMWM1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzAxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTcwMS5jCkBAIC00MDEsNyArNDAxLDcgQEAKIH0KIAogc3RhdGljIGludCBhZGF1MTcwMV9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGNsa19pZCwKLQl1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKKwlpbnQgc291cmNlLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCkBAIC00NTgsNiArNDU4LDcgQEAKIAlpbnQgcmV0OwogCiAJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CisJY29kZWMtPmNvbnRyb2xfZGF0YSA9IHRvX2kyY19jbGllbnQoY29kZWMtPmRldik7CiAKIAlyZXQgPSBhZGF1MTcwMV9sb2FkX2Zpcm13YXJlKGNvZGVjKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwppbmRleCAzMDBjMDRiLi5mOWYwODk0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwpAQCAtNTIzLDcgKzUyMyw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRhdjgweF9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCisJCQkgICAgICBpbnQgY2xrX2lkLCBpbnQgc291cmNlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCiB7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYwppbmRleCA4NDAyODU0Li45MDgyZTBmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRzMTE3eC5oIGIvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTAyODYuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogYWRzMTE3eC5oICAtLSAgRHJpdmVyIGZvciBhZHMxMTc0LzggQURDIGNoaXBzCi0gKgotICogQ29weXJpZ2h0IDIwMDkgU2hvdFNwb3R0ZXIgSW5jLgotICogQXV0aG9yOiBHcmFlbWUgR3JlZ29yeSA8Z2dAc2xpbWxvZ2ljLmNvLnVrPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi1leHRlcm4gc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhZHMxMTd4X2RhaTsKLWV4dGVybiBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hZHMxMTd4OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0MTA0LmMKaW5kZXggY2JmMGI2ZC4uZDNiMjlkYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDEwNC5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkucHJvYmUgPQlhazQxMDRfcHJvYmUsCiAJLnJlbW92ZSA9CWFrNDEwNF9yZW1vdmUsCiAJLnJlZ19jYWNoZV9zaXplID0gQUs0MTA0X05VTV9SRUdTLAotCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCisJLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTgpLAogfTsKIAogc3RhdGljIGludCBhazQxMDRfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jIGIvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYwppbmRleCBlMWEyMTRlLi45NWQ3ODJkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKQEAgLTM0LDc0ICszNCwxNiBAQAogc3RydWN0IGFrNDUzNV9wcml2IHsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKIC8qCiAgKiBhazQ1MzUgcmVnaXN0ZXIgY2FjaGUKICAqLwotc3RhdGljIGNvbnN0IHUxNiBhazQ1MzVfcmVnW0FLNDUzNV9DQUNIRVJFR05VTV0gPSB7Ci0gICAgMHgwMDAwLCAweDAwODAsIDB4MDAwMCwgMHgwMDAzLAotICAgIDB4MDAwMiwgMHgwMDAwLCAweDAwMTEsIDB4MDAwMSwKLSAgICAweDAwMDAsIDB4MDA0MCwgMHgwMDM2LCAweDAwMTAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDA1NywgMHgwMDAwLAotfTsKLQotLyoKLSAqIHJlYWQgYWs0NTM1IHJlZ2lzdGVyIGNhY2hlCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JdW5zaWduZWQgaW50IHJlZykKLXsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpZiAocmVnID49IEFLNDUzNV9DQUNIRVJFR05VTSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBjYWNoZVtyZWddOwotfQotCi0vKgotICogd3JpdGUgYWs0NTM1IHJlZ2lzdGVyIGNhY2hlCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhazQ1MzVfd3JpdGVfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQl1MTYgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0JaWYgKHJlZyA+PSBBSzQ1MzVfQ0FDSEVSRUdOVU0pCi0JCXJldHVybjsKLQljYWNoZVtyZWddID0gdmFsdWU7Ci19Ci0KLS8qCi0gKiB3cml0ZSB0byB0aGUgQUs0NTM1IHJlZ2lzdGVyIHNwYWNlCi0gKi8KLXN0YXRpYyBpbnQgYWs0NTM1X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKLQl1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTggZGF0YVsyXTsKLQotCS8qIGRhdGEgaXMKLQkgKiAgIEQxNS4uRDggQUs0NTM1IHJlZ2lzdGVyIG9mZnNldAotCSAqICAgRDcuLi5EMCByZWdpc3RlciBkYXRhCi0JICovCi0JZGF0YVswXSA9IHJlZyAmIDB4ZmY7Ci0JZGF0YVsxXSA9IHZhbHVlICYgMHhmZjsKLQotCWFrNDUzNV93cml0ZV9yZWdfY2FjaGUoY29kZWMsIHJlZywgdmFsdWUpOwotCWlmIChjb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMikgPT0gMikKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIGludCBhazQ1MzVfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0JaW50IGksIHIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFLNDUzNV9DQUNIRVJFR05VTTsgaSsrKQotCQlyIHw9IGFrNDUzNV93cml0ZShjb2RlYywgaSwgY2FjaGVbaV0pOwotCi0JcmV0dXJuIHI7CitzdGF0aWMgY29uc3QgdTggYWs0NTM1X3JlZ1tBSzQ1MzVfQ0FDSEVSRUdOVU1dID0geworCTB4MDAsIDB4ODAsIDB4MDAsIDB4MDMsCisJMHgwMiwgMHgwMCwgMHgxMSwgMHgwMSwKKwkweDAwLCAweDQwLCAweDM2LCAweDEwLAorCTB4MDAsIDB4MDAsIDB4NTcsIDB4MDAsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWs0NTM1X21vbm9fZ2FpbltdID0geyIrNmRCIiwgIi0xN2RCIn07CkBAIC0zMDQsNyArMjQ2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3QgYWs0NTM1X3ByaXYgKmFrNDUzNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXU4IG1vZGUyID0gYWs0NTM1X3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBBSzQ1MzVfTU9ERTIpICYgfigweDMgPDwgNSk7CisJdTggbW9kZTIgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFLNDUzNV9NT0RFMikgJiB+KDB4MyA8PCA1KTsKIAlpbnQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyksIGZzID0gMjU2OwogCiAJaWYgKHJhdGUpCkBAIC0zMjMsNyArMjY1LDcgQEAKIAl9CiAKIAkvKiBzZXQgcmF0ZSAqLwotCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X01PREUyLCBtb2RlMik7CisJc25kX3NvY193cml0ZShjb2RlYywgQUs0NTM1X01PREUyLCBtb2RlMik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0OCw0NCArMjkwLDM3IEBACiAJLyogdXNlIDMyIGZzIGZvciBCQ0xLIHRvIHNhdmUgcG93ZXIgKi8KIAltb2RlMSB8PSAweDQ7CiAKLQlhazQ1MzVfd3JpdGUoY29kZWMsIEFLNDUzNV9NT0RFMSwgbW9kZTEpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDUzNV9NT0RFMSwgbW9kZTEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFrNDUzNV9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwotCXUxNiBtdXRlX3JlZyA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X0RBQyk7CisJdTE2IG11dGVfcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBBSzQ1MzVfREFDKTsKIAlpZiAoIW11dGUpCi0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X0RBQywgbXV0ZV9yZWcgJiB+MHgyMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDUzNV9EQUMsIG11dGVfcmVnICYgfjB4MjApOwogCWVsc2UKLQkJYWs0NTM1X3dyaXRlKGNvZGVjLCBBSzQ1MzVfREFDLCBtdXRlX3JlZyB8IDB4MjApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSzQ1MzVfREFDLCBtdXRlX3JlZyB8IDB4MjApOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFrNDUzNV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCiB7Ci0JdTE2IGksIG11dGVfcmVnOwotCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgotCQltdXRlX3JlZyA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X0RBQyk7Ci0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X0RBQywgbXV0ZV9yZWcgJiB+MHgyMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFLNDUzNV9EQUMsIDB4MjAsIDApOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgotCQltdXRlX3JlZyA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X0RBQyk7Ci0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X0RBQywgbXV0ZV9yZWcgfCAweDIwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUs0NTM1X0RBQywgMHgyMCwgMHgyMCk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWkgPSBhazQ1MzVfcmVhZF9yZWdfY2FjaGUoY29kZWMsIEFLNDUzNV9QTTEpOwotCQlhazQ1MzVfd3JpdGUoY29kZWMsIEFLNDUzNV9QTTEsIGkgfCAweDgwKTsKLQkJaSA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X1BNMik7Ci0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X1BNMiwgaSAmICh+MHg4MCkpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSzQ1MzVfUE0xLCAweDgwLCAweDgwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUs0NTM1X1BNMiwgMHg4MCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJaSA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X1BNMSk7Ci0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X1BNMSwgaSAmICh+MHg4MCkpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSzQ1MzVfUE0xLCAweDgwLCAwKTsKIAkJYnJlYWs7CiAJfQogCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKQEAgLTQyOCw3ICszNjMsNyBAQAogCiBzdGF0aWMgaW50IGFrNDUzNV9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWFrNDUzNV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOwogCWFrNDUzNV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCXJldHVybiAwOwogfQpAQCAtNDM2LDExICszNzEsMTUgQEAKIHN0YXRpYyBpbnQgYWs0NTM1X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWs0NTM1X3ByaXYgKmFrNDUzNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBSzQ1MzUgQXVkaW8gQ29kZWMgJXMiLCBBSzQ1MzVfVkVSU0lPTik7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gYWs0NTM1LT5jb250cm9sX2RhdGE7Ci0KKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgYWs0NTM1LT5jb250cm9sX3R5cGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAJLyogcG93ZXIgb24gZGV2aWNlICovCiAJYWs0NTM1X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKQEAgLTQ2MSw4ICs0MDAsNiBAQAogCS5yZW1vdmUgPQlhazQ1MzVfcmVtb3ZlLAogCS5zdXNwZW5kID0JYWs0NTM1X3N1c3BlbmQsCiAJLnJlc3VtZSA9CWFrNDUzNV9yZXN1bWUsCi0JLnJlYWQgPSBhazQ1MzVfcmVhZF9yZWdfY2FjaGUsCi0JLndyaXRlID0gYWs0NTM1X3dyaXRlLAogCS5zZXRfYmlhc19sZXZlbCA9IGFrNDUzNV9zZXRfYmlhc19sZXZlbCwKIAkucmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKGFrNDUzNV9yZWcpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHU4KSwKQEAgLTQ4NSw3ICs0MjIsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGFrNDUzNSk7Ci0JYWs0NTM1LT5jb250cm9sX2RhdGEgPSBpMmM7CiAJYWs0NTM1LT5jb250cm9sX3R5cGUgPSBTTkRfU09DX0kyQzsKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMKaW5kZXggN2E2NGU1OC4uNzc4Mzg1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCkBAIC0zMSw3ICszMSw2IEBACiAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IGFrNDY0MV9wcml2IHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKIAlpbnQgZGVlbXBoOwogCWludCBwbGF5YmFja19mczsKQEAgLTIyNiw3ICsyMjUsNyBAQAogCVNORF9TT0NfREFQTV9QR0EoIk1vbm8gT3V0IDIiLCBBSzQ2NDFfUE0yLCAzLCAwLCBOVUxMLCAwKSwKIAogCVNORF9TT0NfREFQTV9BREMoIlZvaWNlIEFEQyIsICJWb2ljZSBDYXB0dXJlIiwgQUs0NjQxX0JUSUYsIDAsIDApLAotCVNORF9TT0NfREFQTV9BREMoIlZvaWNlIERBQyIsICJWb2ljZSBQbGF5YmFjayIsIEFLNDY0MV9CVElGLCAxLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJWb2ljZSBEQUMiLCAiVm9pY2UgUGxheWJhY2siLCBBSzQ2NDFfQlRJRiwgMSwgMCksCiAKIAlTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEludCBCaWFzIiwgQUs0NjQxX01JQywgMywgMCksCiAJU05EX1NPQ19EQVBNX01JQ0JJQVMoIk1pYyBFeHQgQmlhcyIsIEFLNDY0MV9NSUMsIDQsIDApLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKaW5kZXggNjVmNDYwNC4uMTJjMWJkZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KQEAgLTE1Niw4MSArMTU3LDIyIEBACiBzdHJ1Y3QgYWs0NjQyX3ByaXYgewogCXVuc2lnbmVkIGludCBzeXNjbGs7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7Ci0Jdm9pZCAqY29udHJvbF9kYXRhOwogfTsKIAogLyoKICAqIGFrNDY0MiByZWdpc3RlciBjYWNoZQogICovCi1zdGF0aWMgY29uc3QgdTE2IGFrNDY0Ml9yZWdbQUs0NjQyX0NBQ0hFUkVHTlVNXSA9IHsKLQkweDAwMDAsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDAsCi0JMHgwMDAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotCTB4MDBlMSwgMHgwMGUxLCAweDAwMTgsIDB4MDAwMCwKLQkweDAwZTEsIDB4MDAxOCwgMHgwMDExLCAweDAwMDgsCi0JMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0JMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLQkweDAwMDAsCi19OwotCi0vKgotICogcmVhZCBhazQ2NDIgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYWs0NjQyX3JlYWRfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQl1bnNpZ25lZCBpbnQgcmVnKQotewotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCWlmIChyZWcgPj0gQUs0NjQyX0NBQ0hFUkVHTlVNKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIGNhY2hlW3JlZ107Ci19Ci0KLS8qCi0gKiB3cml0ZSBhazQ2NDIgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGFrNDY0Ml93cml0ZV9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCXUxNiByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpZiAocmVnID49IEFLNDY0Ml9DQUNIRVJFR05VTSkKLQkJcmV0dXJuOwotCi0JY2FjaGVbcmVnXSA9IHZhbHVlOwotfQotCi0vKgotICogd3JpdGUgdG8gdGhlIEFLNDY0MiByZWdpc3RlciBzcGFjZQotICovCi1zdGF0aWMgaW50IGFrNDY0Ml93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCi0JdW5zaWduZWQgaW50IHZhbHVlKQotewotCXU4IGRhdGFbMl07Ci0KLQkvKiBkYXRhIGlzCi0JICogICBEMTUuLkQ4IEFLNDY0MiByZWdpc3RlciBvZmZzZXQKLQkgKiAgIEQ3Li4uRDAgcmVnaXN0ZXIgZGF0YQotCSAqLwotCWRhdGFbMF0gPSByZWcgJiAweGZmOwotCWRhdGFbMV0gPSB2YWx1ZSAmIDB4ZmY7Ci0KLQlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpIHsKLQkJYWs0NjQyX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgcmVnLCB2YWx1ZSk7Ci0JCXJldHVybiAwOwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIGludCBhazQ2NDJfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0JaW50IGksIHIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFLNDY0Ml9DQUNIRVJFR05VTTsgaSsrKQotCQlyIHw9IGFrNDY0Ml93cml0ZShjb2RlYywgaSwgY2FjaGVbaV0pOwotCi0JcmV0dXJuIHI7CitzdGF0aWMgY29uc3QgdTggYWs0NjQyX3JlZ1tBSzQ2NDJfQ0FDSEVSRUdOVU1dID0geworCTB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweGUxLCAweGUxLCAweDE4LCAweDAwLAorCTB4ZTEsIDB4MTgsIDB4MTEsIDB4MDgsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsCiB9OwogCiBzdGF0aWMgaW50IGFrNDY0Ml9kYWlfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKQEAgLTI1Miw4ICsxOTQsOCBAQAogCQkgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTURfQ1RMNCwgREFDSCwgREFDSCk7CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1EX0NUTDMsIEJTVDEsIEJTVDEpOwotCQlhazQ2NDJfd3JpdGUoY29kZWMsIExfSVZDLCAweDkxKTsgLyogdm9sdW1lICovCi0JCWFrNDY0Ml93cml0ZShjb2RlYywgUl9JVkMsIDB4OTEpOyAvKiB2b2x1bWUgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgTF9JVkMsIDB4OTEpOyAvKiB2b2x1bWUgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgUl9JVkMsIDB4OTEpOyAvKiB2b2x1bWUgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUFdfTUdNVDEsIFBNVkNNIHwgUE1NSU4gfCBQTURBQywKIAkJCQkJCSAgICAgUE1WQ00gfCBQTU1JTiB8IFBNREFDKTsKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUFdfTUdNVDIsIFBNSFBfTUFTSywJUE1IUCk7CkBAIC0yNzIsOSArMjE0LDkgQEAKIAkJICogVGhpcyBvcGVyYXRpb24gY2FtZSBmcm9tIGV4YW1wbGUgY29kZSBvZgogCQkgKiAiQVNBSEkgS0FTRUkgQUs0NjQyIiAoamFwYW5lc2UpIG1hbnVhbCBwOTQuCiAJCSAqLwotCQlhazQ2NDJfd3JpdGUoY29kZWMsIFNHX1NMMSwgUE1NUCB8IE1HQUlOMCk7Ci0JCWFrNDY0Ml93cml0ZShjb2RlYywgVElNRVIsIFpUTSgweDMpIHwgV1RNKDB4MykpOwotCQlhazQ2NDJfd3JpdGUoY29kZWMsIEFMQ19DVEwxLCBBTEMgfCBMTVRIMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFNHX1NMMSwgUE1NUCB8IE1HQUlOMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRJTUVSLCBaVE0oMHgzKSB8IFdUTSgweDMpKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgQUxDX0NUTDEsIEFMQyB8IExNVEgwKTsKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUFdfTUdNVDEsIFBNVkNNIHwgUE1BREwsCiAJCQkJCQkgICAgIFBNVkNNIHwgUE1BREwpOwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBQV19NR01UMywgUE1BRFIsIFBNQURSKTsKQEAgLTQ2Miw3ICs0MDQsNyBAQAogCiBzdGF0aWMgaW50IGFrNDY0Ml9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWFrNDY0Ml9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOwogCXJldHVybiAwOwogfQogCkBAIC00NzAsMTEgKzQxMiwxNSBAQAogc3RhdGljIGludCBhazQ2NDJfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhazQ2NDJfcHJpdiAqYWs0NjQyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldDsKIAogCWRldl9pbmZvKGNvZGVjLT5kZXYsICJBSzQ2NDIgQXVkaW8gQ29kZWMgJXMiLCBBSzQ2NDJfVkVSU0lPTik7CiAKLQljb2RlYy0+aHdfd3JpdGUJCT0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotCWNvZGVjLT5jb250cm9sX2RhdGEJPSBhazQ2NDItPmNvbnRyb2xfZGF0YTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgYWs0NjQyLT5jb250cm9sX3R5cGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgYWs0NjQyX3NuZF9jb250cm9scywKIAkJCSAgICAgQVJSQVlfU0laRShhazQ2NDJfc25kX2NvbnRyb2xzKSk7CkBAIC00ODUsOCArNDMxLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hazQ2NDIgPSB7CiAJLnByb2JlCQkJPSBhazQ2NDJfcHJvYmUsCiAJLnJlc3VtZQkJCT0gYWs0NjQyX3Jlc3VtZSwKLQkucmVhZAkJCT0gYWs0NjQyX3JlYWRfcmVnX2NhY2hlLAotCS53cml0ZQkJCT0gYWs0NjQyX3dyaXRlLAogCS5yZWdfY2FjaGVfc2l6ZQkJPSBBUlJBWV9TSVpFKGFrNDY0Ml9yZWcpLAogCS5yZWdfd29yZF9zaXplCQk9IHNpemVvZih1OCksCiAJLnJlZ19jYWNoZV9kZWZhdWx0CT0gYWs0NjQyX3JlZywKQEAgLTUwNCw3ICs0NDgsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGFrNDY0Mik7Ci0JYWs0NjQyLT5jb250cm9sX2RhdGEgPSBpMmM7CiAJYWs0NjQyLT5jb250cm9sX3R5cGUgPSBTTkRfU09DX0kyQzsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCmluZGV4IDg4YjI5ZjguLmRlOWZmNjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYwpAQCAtMjYsNyArMjYsNiBAQAogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgYWs0NjcxX3ByaXYgewogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKIC8qIGFrNDY3MSByZWdpc3RlciBjYWNoZSAmIGRlZmF1bHQgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KQEAgLTE2OSwxOCArMTY4LDE1IEBACiAJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7Ci0JdTggcmVnOwogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFLNDY3MV9MT1VUMl9QT1dFUl9NQU5BR0VSTUVOVCk7Ci0JCXJlZyB8PSBBSzQ2NzFfTVVURU47Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDY3MV9MT1VUMl9QT1dFUl9NQU5BR0VSTUVOVCwgcmVnKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUs0NjcxX0xPVVQyX1BPV0VSX01BTkFHRVJNRU5ULAorCQkJCSAgICBBSzQ2NzFfTVVURU4sIEFLNDY3MV9NVVRFTik7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUs0NjcxX0xPVVQyX1BPV0VSX01BTkFHRVJNRU5UKTsKLQkJcmVnICY9IH5BSzQ2NzFfTVVURU47Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDY3MV9MT1VUMl9QT1dFUl9NQU5BR0VSTUVOVCwgcmVnKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUs0NjcxX0xPVVQyX1BPV0VSX01BTkFHRVJNRU5ULAorCQkJCSAgICBBSzQ2NzFfTVVURU4sIDApOwogCQlicmVhazsKIAl9CiAKQEAgLTU3NiwxNSArNTcyLDEyIEBACiBzdGF0aWMgaW50IGFrNDY3MV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewotCXU4IHJlZzsKLQogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19PTjoKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUs0NjcxX0FEX0RBX1BPV0VSX01BTkFHRU1FTlQpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSzQ2NzFfQURfREFfUE9XRVJfTUFOQUdFTUVOVCwKLQkJCQlyZWcgfCBBSzQ2NzFfUE1WQ00pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSzQ2NzFfQURfREFfUE9XRVJfTUFOQUdFTUVOVCwKKwkJCQkgICAgQUs0NjcxX1BNVkNNLCBBSzQ2NzFfUE1WQ00pOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDY3MV9BRF9EQV9QT1dFUl9NQU5BR0VNRU5ULCAweDAwKTsKQEAgLTYyOSw4ICs2MjIsNiBAQAogCXN0cnVjdCBhazQ2NzFfcHJpdiAqYWs0NjcxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKLQogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBhazQ2NzEtPmNvbnRyb2xfdHlwZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwpAQCAtNjc1LDcgKzY2Niw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWs0NjcxKTsKLQlhazQ2NzEtPmNvbnRyb2xfZGF0YSA9IGNsaWVudDsKIAlhazQ2NzEtPmNvbnRyb2xfdHlwZSA9IFNORF9TT0NfSTJDOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYyMy5jCmluZGV4IGVlY2ZmYjUuLjk4NGIxNGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYyMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYyMy5jCkBAIC00MCw4ICs0MCw2IEBACiAvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KIHN0cnVjdCBhbGM1NjIzX3ByaXYgewogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJdTggaWQ7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKIAl1MTYgcmVnX2NhY2hlW0FMQzU2MjNfVkVORE9SX0lEMisyXTsKQEAgLTU1LDggKzUzLDEwIEBACiAJdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CiAKIAkvKiBub3QgcmVhbGx5IGVmZmljaWVudCAuLi4gKi8KKwljb2RlYy0+Y2FjaGVfYnlwYXNzID0gMTsKIAlmb3IgKGkgPSAwIDsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIDsgaSArPSBzdGVwKQotCQljYWNoZVtpXSA9IGNvZGVjLT5od19yZWFkKGNvZGVjLCBpKTsKKwkJY2FjaGVbaV0gPSBzbmRfc29jX3JlYWQoY29kZWMsIGkpOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhbGM1NjIzX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKQEAgLTEwNTAsOSArMTA1MCw3IEBACiAJfQogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWxjNTYyMyk7Ci0JYWxjNTYyMy0+Y29udHJvbF9kYXRhID0gY2xpZW50OwogCWFsYzU2MjMtPmNvbnRyb2xfdHlwZSA9IFNORF9TT0NfSTJDOwotCW11dGV4X2luaXQoJmFsYzU2MjMtPm11dGV4KTsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldiwKIAkJJnNvY19jb2RlY19kZXZpY2VfYWxjNTYyMywgJmFsYzU2MjNfZGFpLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCmluZGV4IDZjYzg2NzguLmYxZjIzN2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwpAQCAtMTI4LDcgKzEyOCw2IEBACiAvKiBQcml2YXRlIGRhdGEgZm9yIHRoZSBDUzQyNzAgKi8KIHN0cnVjdCBjczQyNzBfcHJpdmF0ZSB7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7Ci0Jdm9pZCAqY29udHJvbF9kYXRhOwogCXVuc2lnbmVkIGludCBtY2xrOyAvKiBJbnB1dCBmcmVxdWVuY3kgb2YgdGhlIE1DTEsgcGluICovCiAJdW5zaWduZWQgaW50IG1vZGU7IC8qIFRoZSBtb2RlIChJMlMgb3IgbGVmdC1qdXN0aWZpZWQpICovCiAJdW5zaWduZWQgaW50IHNsYXZlX21vZGU7CkBAIC0yNjIsNyArMjYxLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOwogCXN0cnVjdCBjczQyNzBfcHJpdmF0ZSAqY3M0MjcwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldCA9IDA7CiAKIAkvKiBzZXQgREFJIGZvcm1hdCAqLwogCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKQEAgLTI3Miw3ICsyNzAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJpbnZhbGlkIGRhaSBmb3JtYXRcbiIpOwotCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLwpAQCAtMjg1LDEwICsyODMsMTEgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogYWxsIG90aGVyIG1vZGVzIGFyZSB1bnN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUgKi8KLQkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBtYXN0ZXIvc2xhdmUgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNDkwLDggKzQ4OSw2IEBACiAJc3RydWN0IGNzNDI3MF9wcml2YXRlICpjczQyNzAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgaSwgcmV0OwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNzNDI3MC0+Y29udHJvbF9kYXRhOwotCiAJLyogVGVsbCBBU29DIHdoYXQga2luZCBvZiBJL08gdG8gdXNlIHRvIHJlYWQgdGhlIHJlZ2lzdGVycy4gIEFTb0Mgd2lsbAogCSAqIHRoZW4gZG8gdGhlIEkyQyB0cmFuc2FjdGlvbnMgaXRzZWxmLgogCSAqLwpAQCAtNjA0LDcgKzYwMSw3IEBACiBzdGF0aWMgaW50IGNzNDI3MF9zb2NfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY3M0MjcwX3ByaXZhdGUgKmNzNDI3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudCA9IHRvX2kyY19jbGllbnQoY29kZWMtPmRldik7CiAJaW50IHJlZzsKIAogCXJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGNzNDI3MC0+c3VwcGxpZXMpLApAQCAtNjkwLDcgKzY4Nyw2IEBACiAJfQogCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyY19jbGllbnQsIGNzNDI3MCk7Ci0JY3M0MjcwLT5jb250cm9sX2RhdGEgPSBpMmNfY2xpZW50OwogCWNzNDI3MC0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmNfY2xpZW50LT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYwppbmRleCAwODNhYWI5Li4yM2QxYmQ1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMKQEAgLTE1Niw3ICsxNTYsNiBAQAogc3RydWN0IGNzNDI3MV9wcml2YXRlIHsKIAkvKiBTTkRfU09DX0kyQyBvciBTTkRfU09DX1NQSSAqLwogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUJYnVzX3R5cGU7Ci0Jdm9pZAkJCQkqY29udHJvbF9kYXRhOwogCXVuc2lnbmVkIGludAkJCW1jbGs7CiAJYm9vbAkJCQltYXN0ZXI7CiAJYm9vbAkJCQlkZWVtcGg7CkBAIC00NjYsOCArNDY1LDYgQEAKIAlpbnQgcmV0OwogCWludCBncGlvX25yZXNldCA9IC1FSU5WQUw7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gY3M0MjcxLT5jb250cm9sX2RhdGE7Ci0KIAlpZiAoY3M0MjcxcGxhdCAmJiBncGlvX2lzX3ZhbGlkKGNzNDI3MXBsYXQtPmdwaW9fbnJlc2V0KSkKIAkJZ3Bpb19ucmVzZXQgPSBjczQyNzFwbGF0LT5ncGlvX25yZXNldDsKIApAQCAtNTU1LDcgKzU1Miw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgY3M0MjcxKTsKLQljczQyNzEtPmNvbnRyb2xfZGF0YSA9IHNwaTsKIAljczQyNzEtPmJ1c190eXBlID0gU05EX1NPQ19TUEk7CiAKIAlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYsICZzb2NfY29kZWNfZGV2X2NzNDI3MSwKQEAgLTU5NSw3ICs1OTEsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNzNDI3MSk7Ci0JY3M0MjcxLT5jb250cm9sX2RhdGEgPSBjbGllbnQ7CiAJY3M0MjcxLT5idXNfdHlwZSA9IFNORF9TT0NfSTJDOwogCiAJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2LCAmc29jX2NvZGVjX2Rldl9jczQyNzEsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCmluZGV4IDhmYjcwNzAuLjhjM2M4MjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCkBAIC00Miw3ICs0Miw2IEBACiAKIHN0cnVjdCBjczQybDUxX3ByaXZhdGUgewogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIAl1bnNpZ25lZCBpbnQgbWNsazsKIAl1bnNpZ25lZCBpbnQgYXVkaW9fbW9kZTsJLyogVGhlIG1vZGUgKEkyUyBvciBsZWZ0LWp1c3RpZmllZCkgKi8KIAllbnVtIG1hc3Rlcl9zbGF2ZV9tb2RlIGZ1bmM7CkBAIC01Nyw3ICs1Niw3IEBACiBzdGF0aWMgaW50IGNzNDJsNTFfZmlsbF9jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJdTggKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZSArIDE7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKIAlzMzIgbGVuZ3RoOwogCiAJbGVuZ3RoID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoaTJjX2NsaWVudCwKQEAgLTI4OSw3ICsyODgsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CiAJc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSAqY3M0Mmw1MSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwogCiAJc3dpdGNoIChmb3JtYXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgewogCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgpAQCAtMjk5LDcgKzI5Nyw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoY29kZWMtPmRldiwgImludmFsaWQgREFJIGZvcm1hdFxuIik7Ci0JCXJldCA9IC1FSU5WQUw7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKQEAgLTMxMCwxMSArMzA4LDExIEBACiAJCWNzNDJsNTEtPmZ1bmMgPSBNT0RFX1NMQVZFX0FVVE87CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIG1hc3Rlci9zbGF2ZSBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGNzNDJsNTFfcmF0aW9zIHsKQEAgLTUyMCw4ICs1MTgsNiBAQAogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0LCByZWc7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gY3M0Mmw1MS0+Y29udHJvbF9kYXRhOwotCiAJcmV0ID0gY3M0Mmw1MV9maWxsX2NhY2hlKGNvZGVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJmYWlsZWQgdG8gZmlsbCByZWdpc3RlciBjYWNoZVxuIik7CkBAIC01OTMsNyArNTg5LDYgQEAKIAl9CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCwgY3M0Mmw1MSk7Ci0JY3M0Mmw1MS0+Y29udHJvbF9kYXRhID0gaTJjX2NsaWVudDsKIAljczQybDUxLT5jb250cm9sX3R5cGUgPSBTTkRfU09DX0kyQzsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmNfY2xpZW50LT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2N4MjA0NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCmluZGV4IGQ2OGVhNTMuLmJjNzA2N2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCkBAIC0xNSw2ICsxNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMKaW5kZXggOTJmZDlkNy4uYjU0NWI3ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KQEAgLTI2LDIzICsyNyw0MSBAQAogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCiAvKiBEQTcyMTAgcmVnaXN0ZXIgc3BhY2UgKi8KKyNkZWZpbmUgREE3MjEwX0NPTlRST0wJCQkweDAxCiAjZGVmaW5lIERBNzIxMF9TVEFUVVMJCQkweDAyCiAjZGVmaW5lIERBNzIxMF9TVEFSVFVQMQkJCTB4MDMKKyNkZWZpbmUgREE3MjEwX1NUQVJUVVAyCQkJMHgwNAorI2RlZmluZSBEQTcyMTBfU1RBUlRVUDMJCQkweDA1CiAjZGVmaW5lIERBNzIxMF9NSUNfTAkJCTB4MDcKICNkZWZpbmUgREE3MjEwX01JQ19SCQkJMHgwOAorI2RlZmluZSBEQTcyMTBfQVVYMV9MCQkJMHgwOQorI2RlZmluZSBEQTcyMTBfQVVYMV9SCQkJMHgwQQorI2RlZmluZSBEQTcyMTBfQVVYMgkJCTB4MEIKKyNkZWZpbmUgREE3MjEwX0lOX0dBSU4JCQkweDBDCiAjZGVmaW5lIERBNzIxMF9JTk1JWF9MCQkJMHgwRAogI2RlZmluZSBEQTcyMTBfSU5NSVhfUgkJCTB4MEUKICNkZWZpbmUgREE3MjEwX0FEQ19IUEYJCQkweDBGCiAjZGVmaW5lIERBNzIxMF9BREMJCQkweDEwCisjZGVmaW5lIERBNzIxMF9BRENfRVExXzIJCTBYMTEKKyNkZWZpbmUgREE3MjEwX0FEQ19FUTNfNAkJMHgxMgorI2RlZmluZSBEQTcyMTBfQURDX0VRNQkJCTB4MTMKICNkZWZpbmUgREE3MjEwX0RBQ19IUEYJCQkweDE0CiAjZGVmaW5lIERBNzIxMF9EQUNfTAkJCTB4MTUKICNkZWZpbmUgREE3MjEwX0RBQ19SCQkJMHgxNgogI2RlZmluZSBEQTcyMTBfREFDX1NFTAkJCTB4MTcKKyNkZWZpbmUgREE3MjEwX1NPRlRNVVRFCQkJMHgxOAorI2RlZmluZSBEQTcyMTBfREFDX0VRMV8yCQkweDE5CisjZGVmaW5lIERBNzIxMF9EQUNfRVEzXzQJCTB4MUEKKyNkZWZpbmUgREE3MjEwX0RBQ19FUTUJCQkweDFCCiAjZGVmaW5lIERBNzIxMF9PVVRNSVhfTAkJCTB4MUMKICNkZWZpbmUgREE3MjEwX09VVE1JWF9SCQkJMHgxRAorI2RlZmluZSBEQTcyMTBfT1VUMV9MCQkJMHgxRQorI2RlZmluZSBEQTcyMTBfT1VUMV9SCQkJMHgxRgorI2RlZmluZSBEQTcyMTBfT1VUMgkJCTB4MjAKICNkZWZpbmUgREE3MjEwX0hQX0xfVk9MCQkJMHgyMQogI2RlZmluZSBEQTcyMTBfSFBfUl9WT0wJCQkweDIyCiAjZGVmaW5lIERBNzIxMF9IUF9DRkcJCQkweDIzCisjZGVmaW5lIERBNzIxMF9aRVJPX0NST1NTCQkweDI0CiAjZGVmaW5lIERBNzIxMF9EQUlfU1JDX1NFTAkJMHgyNQogI2RlZmluZSBEQTcyMTBfREFJX0NGRzEJCQkweDI2CiAjZGVmaW5lIERBNzIxMF9EQUlfQ0ZHMwkJCTB4MjgKQEAgLTUwLDYgKzY5LDEyIEBACiAjZGVmaW5lIERBNzIxMF9QTExfRElWMgkJCTB4MkEKICNkZWZpbmUgREE3MjEwX1BMTF9ESVYzCQkJMHgyQgogI2RlZmluZSBEQTcyMTBfUExMCQkJMHgyQworI2RlZmluZSBEQTcyMTBfQUxDX01BWAkJCTB4ODMKKyNkZWZpbmUgREE3MjEwX0FMQ19NSU4JCQkweDg0CisjZGVmaW5lIERBNzIxMF9BTENfTk9JUwkJCTB4ODUKKyNkZWZpbmUgREE3MjEwX0FMQ19BVFQJCQkweDg2CisjZGVmaW5lIERBNzIxMF9BTENfUkVMCQkJMHg4NworI2RlZmluZSBEQTcyMTBfQUxDX0RFTAkJCTB4ODgKICNkZWZpbmUgREE3MjEwX0FfSElEX1VOTE9DSwkJMHg4QQogI2RlZmluZSBEQTcyMTBfQV9URVNUX1VOTE9DSwkJMHg4QgogI2RlZmluZSBEQTcyMTBfQV9QTEwxCQkJMHg5MApAQCAtNzIsNiArOTcsNyBAQAogI2RlZmluZSBEQTcyMTBfSU5fUl9FTgkJCSgxIDw8IDcpCiAKIC8qIEFEQyBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9BRENfQUxDX0VOCQkoMSA8PCAwKQogI2RlZmluZSBEQTcyMTBfQURDX0xfRU4JCQkoMSA8PCAzKQogI2RlZmluZSBEQTcyMTBfQURDX1JfRU4JCQkoMSA8PCA3KQogCkBAIC0xMDUsMTIgKzEzMSwxNyBAQAogCiAvKiBEQUlfQ0ZHMSBiaXQgZmllbGRzICovCiAjZGVmaW5lIERBNzIxMF9EQUlfV09SRF9TMTZfTEUJCSgwIDw8IDApCisjZGVmaW5lIERBNzIxMF9EQUlfV09SRF9TMjBfM0xFCQkoMSA8PCAwKQogI2RlZmluZSBEQTcyMTBfREFJX1dPUkRfUzI0X0xFCQkoMiA8PCAwKQorI2RlZmluZSBEQTcyMTBfREFJX1dPUkRfUzMyX0xFCQkoMyA8PCAwKQogI2RlZmluZSBEQTcyMTBfREFJX0ZMRU5fNjRCSVQJCSgxIDw8IDIpCisjZGVmaW5lIERBNzIxMF9EQUlfTU9ERV9TTEFWRQkJKDAgPDwgNykKICNkZWZpbmUgREE3MjEwX0RBSV9NT0RFX01BU1RFUgkJKDEgPDwgNykKIAogLyogREFJX0NGRzMgYml0IGZpZWxkcyAqLwogI2RlZmluZSBEQTcyMTBfREFJX0ZPUk1BVF9JMlNNT0RFCSgwIDw8IDApCisjZGVmaW5lIERBNzIxMF9EQUlfRk9STUFUX0xFRlRfSgkoMSA8PCAwKQorI2RlZmluZSBEQTcyMTBfREFJX0ZPUk1BVF9SSUdIVF9KCSgyIDw8IDApCiAjZGVmaW5lIERBNzIxMF9EQUlfT0UJCQkoMSA8PCAzKQogI2RlZmluZSBEQTcyMTBfREFJX0VOCQkJKDEgPDwgNykKIApAQCAtMTMzLDYgKzE2NCw0MyBAQAogI2RlZmluZSBEQTcyMTBfUExMX0ZTXzk2MDAwCQkoMHhGIDw8IDApCiAjZGVmaW5lIERBNzIxMF9QTExfRU4JCQkoMHgxIDw8IDcpCiAKKy8qIFNPRlRNVVRFIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgREE3MjEwX1JBTVBfRU4JCQkoMSA8PCA2KQorCisvKiBDT05UUk9MIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgREE3MjEwX05PSVNFX1NVUF9FTgkJKDEgPDwgMykKKworLyogSU5fR0FJTiBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9JTlBHQV9MX1ZPTAkJKDB4MEYgPDwgMCkKKyNkZWZpbmUgREE3MjEwX0lOUEdBX1JfVk9MCQkoMHhGMCA8PCAwKQorCisvKiBaRVJPX0NST1NTIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgREE3MjEwX0FVWDFfTF9aQwkJKDEgPDwgMCkKKyNkZWZpbmUgREE3MjEwX0FVWDFfUl9aQwkJKDEgPDwgMSkKKyNkZWZpbmUgREE3MjEwX0hQX0xfWkMJCQkoMSA8PCA2KQorI2RlZmluZSBEQTcyMTBfSFBfUl9aQwkJCSgxIDw8IDcpCisKKy8qIEFVWDFfTCBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9BVVgxX0xfVk9MCQkoMHgzRiA8PCAwKQorCisvKiBBVVgxX1IgYml0IGZpZWxkcyAqLworI2RlZmluZSBEQTcyMTBfQVVYMV9SX1ZPTAkJKDB4M0YgPDwgMCkKKworLyogTWluaW11bSBJTlBHQSBhbmQgQVVYMSB2b2x1bWUgdG8gZW5hYmxlIG5vaXNlIHN1cHByZXNzaW9uICovCisjZGVmaW5lIERBNzIxMF9JTlBHQV9NSU5fVk9MX05TCQkweDBBICAvKiAxMC41ZEIgKi8KKyNkZWZpbmUgREE3MjEwX0FVWDFfTUlOX1ZPTF9OUwkJMHgzNSAgLyogNmRCICovCisKKy8qIE9VVDFfTCBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9PVVQxX0xfRU4JCSgxIDw8IDcpCisKKy8qIE9VVDFfUiBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9PVVQxX1JfRU4JCSgxIDw8IDcpCisKKy8qIE9VVDIgYml0IGZpZWxkcyAqLworI2RlZmluZSBEQTcyMTBfT1VUMl9PVVRNSVhfUgkJKDEgPDwgNSkKKyNkZWZpbmUgREE3MjEwX09VVDJfT1VUTUlYX0wJCSgxIDw8IDYpCisjZGVmaW5lIERBNzIxMF9PVVQyX0VOCQkJKDEgPDwgNykKKwogI2RlZmluZSBEQTcyMTBfVkVSU0lPTiAiMC4wLjEiCiAKIC8qCkBAIC0xNDQsMjQgKzIxMiwzNTEgQEAKICAqIG11dGUJCTogMHgxMAogICogcmVzZXJ2ZWQJOiAweDAwIC0gMHgwRgogICoKLSAqICoqIEZJWE1FICoqCi0gKgogICogUmVzZXJ2ZWQgYXJlYSBhcmUgY29uc2lkZXJlZCBhcyAibXV0ZSIuCi0gKiAtPiBtaW4gPSAtNzkuNSBkQgogICovCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHBfb3V0X3RsdiwgLTc5NTAsIDE1MCwgMSk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhwX291dF90bHZbXSA9IHsKKwlUTFZfREJfUkFOR0VfSEVBRCgyKSwKKwkweDAsIDB4MTAsIFRMVl9EQl9TQ0FMRV9JVEVNKFRMVl9EQl9HQUlOX01VVEUsIDAsIDEpLAorCS8qIC01NCBkQiB0byArMTUgZEIgKi8KKwkweDExLCAweDNmLCBUTFZfREJfU0NBTEVfSVRFTSgtNTQwMCwgMTUwLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGluZW91dF92b2xfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoMiksCisJMHgwLCAweDEwLCBUTFZfREJfU0NBTEVfSVRFTShUTFZfREJfR0FJTl9NVVRFLCAwLCAxKSwKKwkvKiAtNTRkQiB0byAxNWRCICovCisJMHgxMSwgMHgzZiwgVExWX0RCX1NDQUxFX0lURU0oLTU0MDAsIDE1MCwgMCkKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbW9ub192b2xfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoMiksCisJMHgwLCAweDIsIFRMVl9EQl9TQ0FMRV9JVEVNKC0xODAwLCAwLCAxKSwKKwkvKiAtMThkQiB0byA2ZEIgKi8KKwkweDMsIDB4NywgVExWX0RCX1NDQUxFX0lURU0oLTE4MDAsIDYwMCwgMCkKK307CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShlcV9nYWluX3RsdiwgLTEwNTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX2VxX21hc3Rlcl9nYWluX3RsdiwgLTE4MDAsIDYwMCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGFjX2dhaW5fdGx2LCAtNzcyNSwgNzUsIDApOworCisvKiBBREMgYW5kIERBQyBoaWdoIHBhc3MgZmlsdGVyIGYwIHZhbHVlICovCitzdGF0aWMgY29uc3QgY2hhciBjb25zdCAqZGE3MjEwX2hwZl9jdXRvZmZfdHh0W10gPSB7CisJIkZzLzgxOTIqcGkiLCAiRnMvNDA5NipwaSIsICJGcy8yMDQ4KnBpIiwgIkZzLzEwMjQqcGkiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9kYWNfaHBmX2N1dG9mZiA9CisJU09DX0VOVU1fU0lOR0xFKERBNzIxMF9EQUNfSFBGLCAwLCA0LCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9hZGNfaHBmX2N1dG9mZiA9CisJU09DX0VOVU1fU0lOR0xFKERBNzIxMF9BRENfSFBGLCAwLCA0LCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOworCisvKiBBREMgYW5kIERBQyB2b2ljZSAoOGtIeikgaGlnaCBwYXNzIGN1dG9mZiB2YWx1ZSAqLworc3RhdGljIGNvbnN0IGNoYXIgY29uc3QgKmRhNzIxMF92Zl9jdXRvZmZfdHh0W10gPSB7CisJIjIuNUh6IiwgIjI1SHoiLCAiNTBIeiIsICIxMDBIeiIsICIxNTBIeiIsICIyMDBIeiIsICIzMDBIeiIsICI0MDBIeiIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEwX2RhY192Zl9jdXRvZmYgPQorCVNPQ19FTlVNX1NJTkdMRShEQTcyMTBfREFDX0hQRiwgNCwgOCwgZGE3MjEwX3ZmX2N1dG9mZl90eHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9hZGNfdmZfY3V0b2ZmID0KKwlTT0NfRU5VTV9TSU5HTEUoREE3MjEwX0FEQ19IUEYsIDQsIDgsIGRhNzIxMF92Zl9jdXRvZmZfdHh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRhNzIxMF9ocF9tb2RlX3R4dFtdID0geworCSJDbGFzcyBIIiwgIkNsYXNzIEciCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9ocF9tb2RlX3NlbCA9CisJU09DX0VOVU1fU0lOR0xFKERBNzIxMF9IUF9DRkcsIDAsIDIsIGRhNzIxMF9ocF9tb2RlX3R4dCk7CisKKy8qIEFMQyBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmIG5vaXNlIHN1cHByZXNzaW9uIGlzIGRpc2FibGVkICovCitzdGF0aWMgaW50IGRhNzIxMF9wdXRfYWxjX3N3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwkJLyogQ2hlY2sgaWYgbm9pc2Ugc3VwcHJlc3Npb24gaXMgZW5hYmxlZCAqLworCQlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTBfQ09OVFJPTCkgJiBEQTcyMTBfTk9JU0VfU1VQX0VOKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkJIkRpc2FibGUgbm9pc2Ugc3VwcHJlc3Npb24gdG8gZW5hYmxlIEFMQ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwkvKiBJZiBhbGwgY29uZGl0aW9ucyBhcmUgbWV0IG9yIHdlIGFyZSBhY3R1YWxseSBkaXNhYmxpbmcgQUxDICovCisJcmV0dXJuIHNuZF9zb2NfcHV0X3ZvbHN3KGtjb250cm9sLCB1Y29udHJvbCk7Cit9CisKKy8qIE5vaXNlIHN1cHByZXNzaW9uIGNhbiBiZSBlbmFibGVkIG9ubHkgaWYgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldAorICogIEFMQyBkaXNhYmxlZAorICogIFpDIGVuYWJsZWQgZm9yIEhQIGFuZCBBVVgxIFBHQQorICogIElOUEdBX0xfVk9MIGFuZCBJTlBHQV9SX1ZPTCA+PSAxMC41IGRCCisgKiAgQVVYMV9MX1ZPTCBhbmQgQVVYMV9SX1ZPTCA+PSA2IGRCCisgKi8KK3N0YXRpYyBpbnQgZGE3MjEwX3B1dF9ub2lzZV9zdXBfc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXU4IHZhbDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQkvKiBDaGVjayBpZiBBTEMgaXMgZW5hYmxlZCAqLworCQlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTBfQURDKSAmIERBNzIxMF9BRENfQUxDX0VOKQorCQkJZ290byBlcnI7CisKKwkJLyogQ2hlY2sgWkMgZm9yIEhQIGFuZCBBVVgxIFBHQSAqLworCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjEwX1pFUk9fQ1JPU1MpICYKKwkJCShEQTcyMTBfQVVYMV9MX1pDIHwgREE3MjEwX0FVWDFfUl9aQyB8IERBNzIxMF9IUF9MX1pDIHwKKwkJCURBNzIxMF9IUF9SX1pDKSkgIT0gKERBNzIxMF9BVVgxX0xfWkMgfAorCQkJREE3MjEwX0FVWDFfUl9aQyB8IERBNzIxMF9IUF9MX1pDIHwgREE3MjEwX0hQX1JfWkMpKQorCQkJZ290byBlcnI7CisKKwkJLyogQ2hlY2sgSU5QR0FfTF9WT0wgYW5kIElOUEdBX1JfVk9MICovCisJCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjEwX0lOX0dBSU4pOworCQlpZiAoKCh2YWwgJiBEQTcyMTBfSU5QR0FfTF9WT0wpIDwgREE3MjEwX0lOUEdBX01JTl9WT0xfTlMpIHx8CisJCQkoKCh2YWwgJiBEQTcyMTBfSU5QR0FfUl9WT0wpID4+IDQpIDwKKwkJCURBNzIxMF9JTlBHQV9NSU5fVk9MX05TKSkKKwkJCWdvdG8gZXJyOworCisJCS8qIENoZWNrIEFVWDFfTF9WT0wgYW5kIEFVWDFfUl9WT0wgKi8KKwkJaWYgKCgoc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTBfQVVYMV9MKSAmIERBNzIxMF9BVVgxX0xfVk9MKSA8CisJCSAgICBEQTcyMTBfQVVYMV9NSU5fVk9MX05TKSB8fAorCQkgICAgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxMF9BVVgxX1IpICYgREE3MjEwX0FVWDFfUl9WT0wpIDwKKwkJICAgIERBNzIxMF9BVVgxX01JTl9WT0xfTlMpKQorCQkJZ290byBlcnI7CisJfQorCS8qIElmIGFsbCBjb25kaXRpb25zIGFyZSBtZXQgb3Igd2UgYXJlIGFjdHVhbGx5IGRpc2FibGluZyBOb2lzZSBzdXAgKi8KKwlyZXR1cm4gc25kX3NvY19wdXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKKworZXJyOgorCXJldHVybiAtRUlOVkFMOworfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEwX3NuZF9jb250cm9sc1tdID0gewogCiAJU09DX0RPVUJMRV9SX1RMVigiSGVhZFBob25lIFBsYXliYWNrIFZvbHVtZSIsCiAJCQkgREE3MjEwX0hQX0xfVk9MLCBEQTcyMTBfSFBfUl9WT0wsCiAJCQkgMCwgMHgzRiwgMCwgaHBfb3V0X3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLAorCQkJIERBNzIxMF9EQUNfTCwgREE3MjEwX0RBQ19SLAorCQkJIDAsIDB4NzcsIDEsIGRhY19nYWluX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiTGluZW91dCBQbGF5YmFjayBWb2x1bWUiLAorCQkJIERBNzIxMF9PVVQxX0wsIERBNzIxMF9PVVQxX1IsCisJCQkgMCwgMHgzZiwgMCwgbGluZW91dF92b2xfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiTW9ubyBQbGF5YmFjayBWb2x1bWUiLCBEQTcyMTBfT1VUMiwgMCwgMHg3LCAwLAorCQkgICAgICAgbW9ub192b2xfdGx2KSwKKworCS8qIERBQyBFcXVhbGl6ZXIgIGNvbnRyb2xzICovCisJU09DX1NJTkdMRSgiREFDIEVRIFN3aXRjaCIsIERBNzIxMF9EQUNfRVE1LCA3LCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiREFDIEVRMSBWb2x1bWUiLCBEQTcyMTBfREFDX0VRMV8yLCAwLCAweGYsIDEsCisJCSAgICAgICBlcV9nYWluX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkRBQyBFUTIgVm9sdW1lIiwgREE3MjEwX0RBQ19FUTFfMiwgNCwgMHhmLCAxLAorCQkgICAgICAgZXFfZ2Fpbl90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJEQUMgRVEzIFZvbHVtZSIsIERBNzIxMF9EQUNfRVEzXzQsIDAsIDB4ZiwgMSwKKwkJICAgICAgIGVxX2dhaW5fdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiREFDIEVRNCBWb2x1bWUiLCBEQTcyMTBfREFDX0VRM180LCA0LCAweGYsIDEsCisJCSAgICAgICBlcV9nYWluX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkRBQyBFUTUgVm9sdW1lIiwgREE3MjEwX0RBQ19FUTUsIDAsIDB4ZiwgMSwKKwkJICAgICAgIGVxX2dhaW5fdGx2KSwKKworCS8qIEFEQyBFcXVhbGl6ZXIgIGNvbnRyb2xzICovCisJU09DX1NJTkdMRSgiQURDIEVRIFN3aXRjaCIsIERBNzIxMF9BRENfRVE1LCA3LCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiQURDIEVRIE1hc3RlciBWb2x1bWUiLCBEQTcyMTBfQURDX0VRNSwgNCwgMHgzLAorCQkgICAgICAgMSwgYWRjX2VxX21hc3Rlcl9nYWluX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkFEQyBFUTEgVm9sdW1lIiwgREE3MjEwX0FEQ19FUTFfMiwgMCwgMHhmLCAxLAorCQkgICAgICAgZXFfZ2Fpbl90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJBREMgRVEyIFZvbHVtZSIsIERBNzIxMF9BRENfRVExXzIsIDQsIDB4ZiwgMSwKKwkJICAgICAgIGVxX2dhaW5fdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiQURDIEVRMyBWb2x1bWUiLCBEQTcyMTBfQURDX0VRM180LCAwLCAweGYsIDEsCisJCSAgICAgICBlcV9nYWluX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkFEQyBFUTQgVm9sdW1lIiwgREE3MjEwX0FEQ19FUTNfNCwgNCwgMHhmLCAxLAorCQkgICAgICAgZXFfZ2Fpbl90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJBREMgRVE1IFZvbHVtZSIsIERBNzIxMF9BRENfRVE1LCAwLCAweGYsIDEsCisJCSAgICAgICBlcV9nYWluX3RsdiksCisKKwlTT0NfU0lOR0xFKCJEQUMgSFBGIFN3aXRjaCIsIERBNzIxMF9EQUNfSFBGLCAzLCAxLCAwKSwKKwlTT0NfRU5VTSgiREFDIEhQRiBDdXRvZmYiLCBkYTcyMTBfZGFjX2hwZl9jdXRvZmYpLAorCVNPQ19TSU5HTEUoIkRBQyBWb2ljZSBNb2RlIFN3aXRjaCIsIERBNzIxMF9EQUNfSFBGLCA3LCAxLCAwKSwKKwlTT0NfRU5VTSgiREFDIFZvaWNlIEN1dG9mZiIsIGRhNzIxMF9kYWNfdmZfY3V0b2ZmKSwKKworCVNPQ19TSU5HTEUoIkFEQyBIUEYgU3dpdGNoIiwgREE3MjEwX0FEQ19IUEYsIDMsIDEsIDApLAorCVNPQ19FTlVNKCJBREMgSFBGIEN1dG9mZiIsIGRhNzIxMF9hZGNfaHBmX2N1dG9mZiksCisJU09DX1NJTkdMRSgiQURDIFZvaWNlIE1vZGUgU3dpdGNoIiwgREE3MjEwX0FEQ19IUEYsIDcsIDEsIDApLAorCVNPQ19FTlVNKCJBREMgVm9pY2UgQ3V0b2ZmIiwgZGE3MjEwX2FkY192Zl9jdXRvZmYpLAorCisJLyogTXV0ZSBjb250cm9scyAqLworCVNPQ19ET1VCTEVfUigiTWljIENhcHR1cmUgU3dpdGNoIiwgREE3MjEwX01JQ19MLCBEQTcyMTBfTUlDX1IsIDMsIDEsIDApLAorCVNPQ19TSU5HTEUoIkF1eDIgQ2FwdHVyZSBTd2l0Y2giLCBEQTcyMTBfQVVYMiwgMiwgMSwgMCksCisJU09DX0RPVUJMRSgiQURDIENhcHR1cmUgU3dpdGNoIiwgREE3MjEwX0FEQywgMiwgNiwgMSwgMCksCisJU09DX1NJTkdMRSgiRGlnaXRhbCBTb2Z0IE11dGUgU3dpdGNoIiwgREE3MjEwX1NPRlRNVVRFLCA3LCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJEaWdpdGFsIFNvZnQgTXV0ZSBSYXRlIiwgREE3MjEwX1NPRlRNVVRFLCAwLCAweDcsIDApLAorCisJLyogWmVybyBjcm9zcyBjb250cm9scyAqLworCVNPQ19ET1VCTEUoIkF1eDEgWkMgU3dpdGNoIiwgREE3MjEwX1pFUk9fQ1JPU1MsIDAsIDEsIDEsIDApLAorCVNPQ19ET1VCTEUoIkluIFBHQSBaQyBTd2l0Y2giLCBEQTcyMTBfWkVST19DUk9TUywgMiwgMywgMSwgMCksCisJU09DX0RPVUJMRSgiTGluZW91dCBaQyBTd2l0Y2giLCBEQTcyMTBfWkVST19DUk9TUywgNCwgNSwgMSwgMCksCisJU09DX0RPVUJMRSgiSGVhZHBob25lIFpDIFN3aXRjaCIsIERBNzIxMF9aRVJPX0NST1NTLCA2LCA3LCAxLCAwKSwKKworCVNPQ19FTlVNKCJIZWFkcGhvbmUgQ2xhc3MiLCBkYTcyMTBfaHBfbW9kZV9zZWwpLAorCisJLyogQUxDIGNvbnRyb2xzICovCisJU09DX1NJTkdMRV9FWFQoIkFMQyBFbmFibGUgU3dpdGNoIiwgREE3MjEwX0FEQywgMCwgMSwgMCwKKwkJICAgICAgIHNuZF9zb2NfZ2V0X3ZvbHN3LCBkYTcyMTBfcHV0X2FsY19zdyksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgTWF4IFZvbHVtZSIsIERBNzIxMF9BTENfTUFYLCAwLCAweDNGLCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBNaW4gVm9sdW1lIiwgREE3MjEwX0FMQ19NSU4sIDAsIDB4M0YsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIE5vaXNlIFZvbHVtZSIsIERBNzIxMF9BTENfTk9JUywgMCwgMHgzRiwgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgQXR0YWNrIFJhdGUiLCBEQTcyMTBfQUxDX0FUVCwgMCwgMHhGRiwgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgUmVsZWFzZSBSYXRlIiwgREE3MjEwX0FMQ19SRUwsIDAsIDB4RkYsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIFJlbGVhc2UgRGVsYXkiLCBEQTcyMTBfQUxDX0RFTCwgMCwgMHhGRiwgMCksCisKKwlTT0NfU0lOR0xFX0VYVCgiTm9pc2UgU3VwcHJlc3Npb24gRW5hYmxlIFN3aXRjaCIsIERBNzIxMF9DT05UUk9MLCAzLCAxLAorCQkgICAgICAgMCwgc25kX3NvY19nZXRfdm9sc3csIGRhNzIxMF9wdXRfbm9pc2Vfc3VwX3N3KSwKK307CisKKy8qCisgKiBEQVBNIENvbnRyb2xzCisgKgorICogQ3VycmVudCBEQVBNIGltcGxlbWVudGF0aW9uIGNvdmVycyBhbG1vc3QgYWxsIGNvZGVjIGNvbXBvbmVudHMgZS5nLiBJT3MsCisgKiBtaXhlcnMsIFBHQXMsQURDIGFuZCBEQUMuCisgKi8KKy8qIEluIE1peGVyIExlZnQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYTcyMTBfZGFwbV9pbm1peGxfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBMZWZ0IFN3aXRjaCIsIERBNzIxMF9JTk1JWF9MLCAwLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBSaWdodCBTd2l0Y2giLCBEQTcyMTBfSU5NSVhfTCwgMSwgMSwgMCksCit9OworCisvKiBJbiBNaXhlciBSaWdodCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhNzIxMF9kYXBtX2lubWl4cl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTWljIFJpZ2h0IFN3aXRjaCIsIERBNzIxMF9JTk1JWF9SLCAwLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBMZWZ0IFN3aXRjaCIsIERBNzIxMF9JTk1JWF9SLCAxLCAxLCAwKSwKK307CisKKy8qIE91dCBNaXhlciBMZWZ0ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEwX2RhcG1fb3V0bWl4bF9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDIExlZnQgU3dpdGNoIiwgREE3MjEwX09VVE1JWF9MLCA0LCAxLCAwKSwKK307CisKKy8qIE91dCBNaXhlciBSaWdodCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhNzIxMF9kYXBtX291dG1peHJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBSaWdodCBTd2l0Y2giLCBEQTcyMTBfT1VUTUlYX1IsIDQsIDEsIDApLAorfTsKKworLyogTW9ubyBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhNzIxMF9kYXBtX21vbm9taXhfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk91dG1peCBSaWdodCBTd2l0Y2giLCBEQTcyMTBfT1VUMiwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJPdXRtaXggTGVmdCBTd2l0Y2giLCBEQTcyMTBfT1VUMiwgNiwgMSwgMCksCit9OworCisvKiBEQVBNIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBkYTcyMTBfZGFwbV93aWRnZXRzW10gPSB7CisJLyogSW5wdXQgU2lkZSAqLworCS8qIElucHV0IExpbmVzICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNSIiksCisKKwkvKiBJbnB1dCBQR0FzICovCisJU05EX1NPQ19EQVBNX1BHQSgiTWljIExlZnQiLCBEQTcyMTBfU1RBUlRVUDMsIDAsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk1pYyBSaWdodCIsIERBNzIxMF9TVEFSVFVQMywgMSwgMSwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJJTlBHQSBMZWZ0IiwgREE3MjEwX0lOTUlYX0wsIDcsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklOUEdBIFJpZ2h0IiwgREE3MjEwX0lOTUlYX1IsIDcsIDAsIE5VTEwsIDApLAorCisJLyogSW5wdXQgTWl4ZXJzICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJJbiBNaXhlciBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZGE3MjEwX2RhcG1faW5taXhsX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKGRhNzIxMF9kYXBtX2lubWl4bF9jb250cm9scykpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJJbiBNaXhlciBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmRhNzIxMF9kYXBtX2lubWl4cl9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShkYTcyMTBfZGFwbV9pbm1peHJfY29udHJvbHMpKSwKKworCS8qIEFEQ3MgKi8KKwlTTkRfU09DX0RBUE1fQURDKCJBREMgTGVmdCIsICJDYXB0dXJlIiwgREE3MjEwX1NUQVJUVVAzLCA1LCAxKSwKKwlTTkRfU09DX0RBUE1fQURDKCJBREMgUmlnaHQiLCAiQ2FwdHVyZSIsIERBNzIxMF9TVEFSVFVQMywgNiwgMSksCisKKwkvKiBPdXRwdXQgU2lkZSAqLworCS8qIERBQ3MgKi8KKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgTGVmdCIsICJQbGF5YmFjayIsIERBNzIxMF9TVEFSVFVQMiwgNSwgMSksCisJU05EX1NPQ19EQVBNX0RBQygiREFDIFJpZ2h0IiwgIlBsYXliYWNrIiwgREE3MjEwX1NUQVJUVVAyLCA2LCAxKSwKKworCS8qIE91dHB1dCBNaXhlcnMgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dCBNaXhlciBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZGE3MjEwX2RhcG1fb3V0bWl4bF9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShkYTcyMTBfZGFwbV9vdXRtaXhsX2NvbnRyb2xzKSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dCBNaXhlciBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmRhNzIxMF9kYXBtX291dG1peHJfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUoZGE3MjEwX2RhcG1fb3V0bWl4cl9jb250cm9scykpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJNb25vIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZGE3MjEwX2RhcG1fbW9ub21peF9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShkYTcyMTBfZGFwbV9tb25vbWl4X2NvbnRyb2xzKSksCisKKwkvKiBPdXRwdXQgUEdBcyAqLworCVNORF9TT0NfREFQTV9QR0EoIk9VVFBHQSBMZWZ0IEVuYWJsZSIsIERBNzIxMF9PVVRNSVhfTCwgNywgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiT1VUUEdBIFJpZ2h0IEVuYWJsZSIsIERBNzIxMF9PVVRNSVhfUiwgNywgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJPdXQxIExlZnQiLCBEQTcyMTBfU1RBUlRVUDIsIDAsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk91dDEgUmlnaHQiLCBEQTcyMTBfU1RBUlRVUDIsIDEsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk91dDIgTW9ubyIsIERBNzIxMF9TVEFSVFVQMiwgMiwgMSwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSGVhZHBob25lIExlZnQiLCBEQTcyMTBfU1RBUlRVUDIsIDMsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkhlYWRwaG9uZSBSaWdodCIsIERBNzIxMF9TVEFSVFVQMiwgNCwgMSwgTlVMTCwgMCksCisKKwkvKiBPdXRwdXQgTGluZXMgKi8KKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJPVVQxTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIk9VVDFSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUMiIpLAorfTsKKworLyogREFQTSBhdWRpbyByb3V0ZSBkZWZpbml0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBkYTcyMTBfYXVkaW9fbWFwW10gPSB7CisJLyogRGVzdCAgICAgICBDb25uZWN0aW5nIFdpZGdldCAgICBzb3VyY2UgKi8KKwkvKiBJbnB1dCBwYXRoICovCisJeyJNaWMgTGVmdCIsIE5VTEwsICJNSUNMIn0sCisJeyJNaWMgUmlnaHQiLCBOVUxMLCAiTUlDUiJ9LAorCisJeyJJbiBNaXhlciBMZWZ0IiwgIk1pYyBMZWZ0IFN3aXRjaCIsICJNaWMgTGVmdCJ9LAorCXsiSW4gTWl4ZXIgTGVmdCIsICJNaWMgUmlnaHQgU3dpdGNoIiwgIk1pYyBSaWdodCJ9LAorCisJeyJJbiBNaXhlciBSaWdodCIsICJNaWMgUmlnaHQgU3dpdGNoIiwgIk1pYyBSaWdodCJ9LAorCXsiSW4gTWl4ZXIgUmlnaHQiLCAiTWljIExlZnQgU3dpdGNoIiwgIk1pYyBMZWZ0In0sCisKKwl7IklOUEdBIExlZnQiLCBOVUxMLCAiSW4gTWl4ZXIgTGVmdCJ9LAorCXsiQURDIExlZnQiLCBOVUxMLCAiSU5QR0EgTGVmdCJ9LAorCisJeyJJTlBHQSBSaWdodCIsIE5VTEwsICJJbiBNaXhlciBSaWdodCJ9LAorCXsiQURDIFJpZ2h0IiwgTlVMTCwgIklOUEdBIFJpZ2h0In0sCisKKwkvKiBPdXRwdXQgcGF0aCAqLworCXsiT3V0IE1peGVyIExlZnQiLCAiREFDIExlZnQgU3dpdGNoIiwgIkRBQyBMZWZ0In0sCisJeyJPdXQgTWl4ZXIgUmlnaHQiLCAiREFDIFJpZ2h0IFN3aXRjaCIsICJEQUMgUmlnaHQifSwKKworCXsiTW9ubyBNaXhlciIsICJPdXRtaXggUmlnaHQgU3dpdGNoIiwgIk91dCBNaXhlciBSaWdodCJ9LAorCXsiTW9ubyBNaXhlciIsICJPdXRtaXggTGVmdCBTd2l0Y2giLCAiT3V0IE1peGVyIExlZnQifSwKKworCXsiT1VUUEdBIExlZnQgRW5hYmxlIiwgTlVMTCwgIk91dCBNaXhlciBMZWZ0In0sCisJeyJPVVRQR0EgUmlnaHQgRW5hYmxlIiwgTlVMTCwgIk91dCBNaXhlciBSaWdodCJ9LAorCisJeyJPdXQxIExlZnQiLCBOVUxMLCAiT1VUUEdBIExlZnQgRW5hYmxlIn0sCisJeyJPVVQxTCIsIE5VTEwsICJPdXQxIExlZnQifSwKKworCXsiT3V0MSBSaWdodCIsIE5VTEwsICJPVVRQR0EgUmlnaHQgRW5hYmxlIn0sCisJeyJPVVQxUiIsIE5VTEwsICJPdXQxIFJpZ2h0In0sCisKKwl7IkhlYWRwaG9uZSBMZWZ0IiwgTlVMTCwgIk9VVFBHQSBMZWZ0IEVuYWJsZSJ9LAorCXsiSFBMIiwgTlVMTCwgIkhlYWRwaG9uZSBMZWZ0In0sCisKKwl7IkhlYWRwaG9uZSBSaWdodCIsIE5VTEwsICJPVVRQR0EgUmlnaHQgRW5hYmxlIn0sCisJeyJIUFIiLCBOVUxMLCAiSGVhZHBob25lIFJpZ2h0In0sCisKKwl7Ik91dDIgTW9ubyIsIE5VTEwsICJNb25vIE1peGVyIn0sCisJeyJPVVQyIiwgTlVMTCwgIk91dDIgTW9ubyJ9LAogfTsKIAogLyogQ29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgZGE3MjEwX3ByaXYgewogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKIC8qCkBAIC0xODgsNzIgKzU4MywxNSBAQAogCTB4MDAsCQkJCQkJLyogUjg4ICAgICAgICovCiB9OwogCi0vKgotICogUmVhZCBkYTcyMTAgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB1MzIgZGE3MjEwX3JlYWRfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTMyIHJlZykKK3N0YXRpYyBpbnQgZGE3MjEwX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKIHsKLQl1OCAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCUJVR19PTihyZWcgPj0gQVJSQVlfU0laRShkYTcyMTBfcmVnKSk7Ci0JcmV0dXJuIGNhY2hlW3JlZ107Ci19Ci0KLS8qCi0gKiBXcml0ZSB0byB0aGUgZGE3MjEwIHJlZ2lzdGVyIHNwYWNlCi0gKi8KLXN0YXRpYyBpbnQgZGE3MjEwX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTMyIHJlZywgdTMyIHZhbHVlKQotewotCXU4ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0JdTggZGF0YVsyXTsKLQotCUJVR19PTihjb2RlYy0+ZHJpdmVyLT52b2xhdGlsZV9yZWdpc3Rlcik7Ci0KLQlkYXRhWzBdID0gcmVnICYgMHhmZjsKLQlkYXRhWzFdID0gdmFsdWUgJiAweGZmOwotCi0JaWYgKHJlZyA+PSBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAoMiAhPSBjb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMikpCi0JCXJldHVybiAtRUlPOwotCi0JY2FjaGVbcmVnXSA9IHZhbHVlOwotCXJldHVybiAwOwotfQotCi0vKgotICogUmVhZCBmcm9tIHRoZSBkYTcyMTAgcmVnaXN0ZXIgc3BhY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGRhNzIxMF9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTMyIHJlZykKLXsKLQlpZiAoREE3MjEwX1NUQVRVUyA9PSByZWcpCi0JCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY29kZWMtPmNvbnRyb2xfZGF0YSwgcmVnKTsKLQotCXJldHVybiBkYTcyMTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbnQgZGE3MjEwX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWludCBpc19wbGF5ID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwotCi0JaWYgKGlzX3BsYXkpIHsKLQkJLyogRW5hYmxlIE91dCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTBfT1VUTUlYX0wsIDB4MUYsIDB4MTApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTBfT1VUTUlYX1IsIDB4MUYsIDB4MTApOwotCi0JfSBlbHNlIHsKLQkJLyogVm9sdW1lIDcgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEwX01JQ19MLCAweDcsIDB4Nyk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxMF9NSUNfUiwgMHg3LCAweDcpOwotCi0JCS8qIEVuYWJsZSBNaWMgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEwX0lOTUlYX0wsIDB4MUYsIDB4MSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxMF9JTk1JWF9SLCAweDFGLCAweDEpOworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBEQTcyMTBfU1RBVFVTOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTI2Niw5MyArNjA0LDc1IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJdTMyIGRhaV9jZmcxOwotCXUzMiBocGZfcmVnLCBocGZfbWFzaywgaHBmX3ZhbHVlOwogCXUzMiBmcywgYnlwYXNzOwogCiAJLyogc2V0IERBSSBzb3VyY2UgdG8gTGVmdCBhbmQgUmlnaHQgQURDICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFJX1NSQ19TRUwsCisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0RBSV9TUkNfU0VMLAogCQkgICAgIERBNzIxMF9EQUlfT1VUX1JfU1JDIHwgREE3MjEwX0RBSV9PVVRfTF9TUkMpOwogCiAJLyogRW5hYmxlIERBSSAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX0RBSV9DRkczLCBEQTcyMTBfREFJX09FIHwgREE3MjEwX0RBSV9FTik7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0RBSV9DRkczLCBEQTcyMTBfREFJX09FIHwgREE3MjEwX0RBSV9FTik7CiAKLQlkYWlfY2ZnMSA9IDB4RkMgJiBkYTcyMTBfcmVhZChjb2RlYywgREE3MjEwX0RBSV9DRkcxKTsKKwlkYWlfY2ZnMSA9IDB4RkMgJiBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMSk7CiAKIAlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CiAJCWRhaV9jZmcxIHw9IERBNzIxMF9EQUlfV09SRF9TMTZfTEU7CiAJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgorCQlkYWlfY2ZnMSB8PSBEQTcyMTBfREFJX1dPUkRfUzIwXzNMRTsKKwkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKIAkJZGFpX2NmZzEgfD0gREE3MjEwX0RBSV9XT1JEX1MyNF9MRTsKIAkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJZGFpX2NmZzEgfD0gREE3MjEwX0RBSV9XT1JEX1MzMl9MRTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFJX0NGRzEsIGRhaV9jZmcxKTsKLQotCWhwZl9yZWcgPSAoU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA9PSBzdWJzdHJlYW0tPnN0cmVhbSkgPwotCQlEQTcyMTBfREFDX0hQRiA6IERBNzIxMF9BRENfSFBGOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMSwgZGFpX2NmZzEpOwogCiAJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CiAJY2FzZSA4MDAwOgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzgwMDA7Ci0JCWhwZl9tYXNrCT0gREE3MjEwX1ZPSUNFX0YwX01BU0sJfCBEQTcyMTBfVk9JQ0VfRU47Ci0JCWhwZl92YWx1ZQk9IERBNzIxMF9WT0lDRV9GMF8yNQl8IERBNzIxMF9WT0lDRV9FTjsKIAkJYnlwYXNzCQk9IERBNzIxMF9QTExfQllQOwogCQlicmVhazsKIAljYXNlIDExMDI1OgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzExMDI1OwotCQlocGZfbWFzawk9IERBNzIxMF9WT0lDRV9GMF9NQVNLCXwgREE3MjEwX1ZPSUNFX0VOOwotCQlocGZfdmFsdWUJPSBEQTcyMTBfVk9JQ0VfRjBfMjUJfCBEQTcyMTBfVk9JQ0VfRU47CiAJCWJ5cGFzcwkJPSAwOwogCQlicmVhazsKIAljYXNlIDEyMDAwOgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzEyMDAwOwotCQlocGZfbWFzawk9IERBNzIxMF9WT0lDRV9GMF9NQVNLCXwgREE3MjEwX1ZPSUNFX0VOOwotCQlocGZfdmFsdWUJPSBEQTcyMTBfVk9JQ0VfRjBfMjUJfCBEQTcyMTBfVk9JQ0VfRU47CiAJCWJ5cGFzcwkJPSBEQTcyMTBfUExMX0JZUDsKIAkJYnJlYWs7CiAJY2FzZSAxNjAwMDoKIAkJZnMJCT0gREE3MjEwX1BMTF9GU18xNjAwMDsKLQkJaHBmX21hc2sJPSBEQTcyMTBfVk9JQ0VfRjBfTUFTSwl8IERBNzIxMF9WT0lDRV9FTjsKLQkJaHBmX3ZhbHVlCT0gREE3MjEwX1ZPSUNFX0YwXzI1CXwgREE3MjEwX1ZPSUNFX0VOOwogCQlieXBhc3MJCT0gREE3MjEwX1BMTF9CWVA7CiAJCWJyZWFrOwogCWNhc2UgMjIwNTA6CiAJCWZzCQk9IERBNzIxMF9QTExfRlNfMjIwNTA7Ci0JCWhwZl9tYXNrCT0gREE3MjEwX1ZPSUNFX0VOOwotCQlocGZfdmFsdWUJPSAwOwogCQlieXBhc3MJCT0gMDsKIAkJYnJlYWs7CiAJY2FzZSAzMjAwMDoKIAkJZnMJCT0gREE3MjEwX1BMTF9GU18zMjAwMDsKLQkJaHBmX21hc2sJPSBEQTcyMTBfVk9JQ0VfRU47Ci0JCWhwZl92YWx1ZQk9IDA7CiAJCWJ5cGFzcwkJPSBEQTcyMTBfUExMX0JZUDsKIAkJYnJlYWs7CiAJY2FzZSA0NDEwMDoKIAkJZnMJCT0gREE3MjEwX1BMTF9GU180NDEwMDsKLQkJaHBmX21hc2sJPSBEQTcyMTBfVk9JQ0VfRU47Ci0JCWhwZl92YWx1ZQk9IDA7CiAJCWJ5cGFzcwkJPSAwOwogCQlicmVhazsKIAljYXNlIDQ4MDAwOgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzQ4MDAwOwotCQlocGZfbWFzawk9IERBNzIxMF9WT0lDRV9FTjsKLQkJaHBmX3ZhbHVlCT0gMDsKIAkJYnlwYXNzCQk9IERBNzIxMF9QTExfQllQOwogCQlicmVhazsKIAljYXNlIDg4MjAwOgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzg4MjAwOwotCQlocGZfbWFzawk9IERBNzIxMF9WT0lDRV9FTjsKLQkJaHBmX3ZhbHVlCT0gMDsKIAkJYnlwYXNzCQk9IDA7CiAJCWJyZWFrOwogCWNhc2UgOTYwMDA6CiAJCWZzCQk9IERBNzIxMF9QTExfRlNfOTYwMDA7Ci0JCWhwZl9tYXNrCT0gREE3MjEwX1ZPSUNFX0VOOwotCQlocGZfdmFsdWUJPSAwOwogCQlieXBhc3MJCT0gREE3MjEwX1BMTF9CWVA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0zNjIsNyArNjgyLDYgQEAKIAkvKiBEaXNhYmxlIGFjdGl2ZSBtb2RlICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEwX1NUQVJUVVAxLCBEQTcyMTBfU0NfTVNUX0VOLCAwKTsKIAotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhwZl9yZWcsIGhwZl9tYXNrLCBocGZfdmFsdWUpOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxMF9QTEwsIERBNzIxMF9QTExfRlNfTUFTSywgZnMpOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxMF9QTExfRElWMywgREE3MjEwX1BMTF9CWVAsIGJ5cGFzcyk7CiAKQEAgLTM4MiwxMyArNzAxLDE2IEBACiAJdTMyIGRhaV9jZmcxOwogCXUzMiBkYWlfY2ZnMzsKIAotCWRhaV9jZmcxID0gMHg3ZiAmIGRhNzIxMF9yZWFkKGNvZGVjLCBEQTcyMTBfREFJX0NGRzEpOwotCWRhaV9jZmczID0gMHhmYyAmIGRhNzIxMF9yZWFkKGNvZGVjLCBEQTcyMTBfREFJX0NGRzMpOworCWRhaV9jZmcxID0gMHg3ZiAmIHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjEwX0RBSV9DRkcxKTsKKwlkYWlfY2ZnMyA9IDB4ZmMgJiBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMyk7CiAKIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgogCQlkYWlfY2ZnMSB8PSBEQTcyMTBfREFJX01PREVfTUFTVEVSOwogCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWRhaV9jZmcxIHw9IERBNzIxMF9EQUlfTU9ERV9TTEFWRTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDAxLDYgKzcyMywxMiBAQAogCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgogCQlkYWlfY2ZnMyB8PSBEQTcyMTBfREFJX0ZPUk1BVF9JMlNNT0RFOwogCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJZGFpX2NmZzMgfD0gREE3MjEwX0RBSV9GT1JNQVRfTEVGVF9KOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWRhaV9jZmczIHw9IERBNzIxMF9EQUlfRk9STUFUX1JJR0hUX0o7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQxMSwxOSArNzM5LDMyIEBACiAJICovCiAJZGFpX2NmZzEgfD0gREE3MjEwX0RBSV9GTEVOXzY0QklUOwogCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFJX0NGRzEsIGRhaV9jZmcxKTsKLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMywgZGFpX2NmZzMpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMSwgZGFpX2NmZzEpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMywgZGFpX2NmZzMpOwogCiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgREE3MjEwX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCitzdGF0aWMgaW50IGRhNzIxMF9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXU4IG11dGVfcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTBfREFDX0hQRikgJiAweEZCOworCisJaWYgKG11dGUpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9EQUNfSFBGLCBtdXRlX3JlZyB8IDB4NCk7CisJZWxzZQorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFDX0hQRiwgbXV0ZV9yZWcpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIERBNzIxMF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKIAogLyogREFJIG9wZXJhdGlvbnMgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGRhNzIxMF9kYWlfb3BzID0gewotCS5zdGFydHVwCT0gZGE3MjEwX3N0YXJ0dXAsCiAJLmh3X3BhcmFtcwk9IGRhNzIxMF9od19wYXJhbXMsCiAJLnNldF9mbXQJPSBkYTcyMTBfc2V0X2RhaV9mbXQsCisJLmRpZ2l0YWxfbXV0ZQk9IGRhNzIxMF9tdXRlLAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGE3MjEwX2RhaSA9IHsKQEAgLTQ1MSwxMSArNzkyLDE1IEBACiBzdGF0aWMgaW50IGRhNzIxMF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGRhNzIxMF9wcml2ICpkYTcyMTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OwogCiAJZGV2X2luZm8oY29kZWMtPmRldiwgIkRBNzIxMCBBdWRpbyBDb2RlYyAlc1xuIiwgREE3MjEwX1ZFUlNJT04pOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YQk9IGRhNzIxMC0+Y29udHJvbF9kYXRhOwotCWNvZGVjLT5od193cml0ZQkJPSAoaHdfd3JpdGVfdClpMmNfbWFzdGVyX3NlbmQ7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIGRhNzIxMC0+Y29udHJvbF90eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyogRklYTUUKIAkgKgpAQCAtNDcyLDggKzgxNyw4IEBACiAJLyoKIAkgKiBtYWtlIHN1cmUgdGhhdCBEQTcyMTAgdXNlIGJ5cGFzcyBtb2RlIGJlZm9yZSBzdGFydCB1cAogCSAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX1NUQVJUVVAxLCAwKTsKLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9QTExfRElWMywKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfU1RBUlRVUDEsIDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9QTExfRElWMywKIAkJICAgICBEQTcyMTBfTUNMS19SQU5HRV8xMF8yMF9NSFogfCBEQTcyMTBfUExMX0JZUCk7CiAKIAkvKgpAQCAtNDgxLDM2ICs4MjYsNzAgQEAKIAkgKi8KIAogCS8qIEVuYWJsZSBMZWZ0ICYgUmlnaHQgTUlDIFBHQSBhbmQgTWljIEJpYXMgKi8KLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9NSUNfTCwgREE3MjEwX01JQ19MX0VOIHwgREE3MjEwX01JQ0JJQVNfRU4pOwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX01JQ19SLCBEQTcyMTBfTUlDX1JfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9NSUNfTCwgREE3MjEwX01JQ19MX0VOIHwgREE3MjEwX01JQ0JJQVNfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9NSUNfUiwgREE3MjEwX01JQ19SX0VOKTsKIAogCS8qIEVuYWJsZSBMZWZ0IGFuZCBSaWdodCBpbnB1dCBQR0EgKi8KLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9JTk1JWF9MLCBEQTcyMTBfSU5fTF9FTik7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfSU5NSVhfUiwgREE3MjEwX0lOX1JfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9JTk1JWF9MLCBEQTcyMTBfSU5fTF9FTik7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0lOTUlYX1IsIERBNzIxMF9JTl9SX0VOKTsKIAogCS8qIEVuYWJsZSBMZWZ0IGFuZCBSaWdodCBBREMgKi8KLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9BREMsIERBNzIxMF9BRENfTF9FTiB8IERBNzIxMF9BRENfUl9FTik7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0FEQywgREE3MjEwX0FEQ19MX0VOIHwgREE3MjEwX0FEQ19SX0VOKTsKIAogCS8qCiAJICogREFDIHNldHRpbmdzCiAJICovCiAKIAkvKiBFbmFibGUgTGVmdCBhbmQgUmlnaHQgREFDICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFDX1NFTCwKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFDX1NFTCwKIAkJICAgICBEQTcyMTBfREFDX0xfU1JDX0RBSV9MIHwgREE3MjEwX0RBQ19MX0VOIHwKIAkJICAgICBEQTcyMTBfREFDX1JfU1JDX0RBSV9SIHwgREE3MjEwX0RBQ19SX0VOKTsKIAogCS8qIEVuYWJsZSBMZWZ0IGFuZCBSaWdodCBvdXQgUEdBICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfT1VUTUlYX0wsIERBNzIxMF9PVVRfTF9FTik7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfT1VUTUlYX1IsIERBNzIxMF9PVVRfUl9FTik7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX09VVE1JWF9MLCBEQTcyMTBfT1VUX0xfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9PVVRNSVhfUiwgREE3MjEwX09VVF9SX0VOKTsKIAogCS8qIEVuYWJsZSBMZWZ0IGFuZCBSaWdodCBIZWFkUGhvbmUgUEdBICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfSFBfQ0ZHLAorCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9IUF9DRkcsCiAJCSAgICAgREE3MjEwX0hQXzJDQVBfTU9ERSB8IERBNzIxMF9IUF9TRU5TRV9FTiB8CiAJCSAgICAgREE3MjEwX0hQX0xfRU4gfCBEQTcyMTBfSFBfTU9ERSB8IERBNzIxMF9IUF9SX0VOKTsKIAorCS8qIEVuYWJsZSByYW1wIG1vZGUgZm9yIERBQyBnYWluIHVwZGF0ZSAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9TT0ZUTVVURSwgREE3MjEwX1JBTVBfRU4pOworCisJLyoKKwkgKiBGb3IgREE3MjEwIGNvZGVjLCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gZW5hYmxlL2Rpc2FibGUgYW5hbG9nIElPcworCSAqIGFuZCBBREMvREFDLAorCSAqICgxKSBVc2luZyAiRW5hYmxlIEJpdCIgb2YgcmVnaXN0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSU8KKwkgKiAob3IgQURDL0RBQykKKwkgKgllLmcuIE1pYyBMZWZ0IGNhbiBiZSBlbmFibGVkIHVzaW5nIGJpdCA3IG9mIE1JQ19MKDB4NykgcmVnCisJICoKKwkgKiAoMikgVXNpbmcgIlN0YW5kYnkgQml0IiBvZiBTVEFSVFVQMiBvciBTVEFSVFVQMyByZWdpc3RlcgorCSAqCWUuZy4gTWljIGxlZnQgY2FuIGJlIHB1dCB0byBTVEFOREJZIHVzaW5nIGJpdCAwIG9mIFNUQVJUVVAzKDB4NSkKKwkgKgorCSAqIE91dCBvZiB0aGVzZSB0d28gbWV0aG9kcywgdGhlIG9uZSB1c2luZyBTVEFOREJZIGJpdHMgaXMgcHJlZmVycmVkCisJICogd2F5IHRvIGVuYWJsZS9kaXNhYmxlIGluZGl2aWR1YWwgYmxvY2tzLiBUaGlzIGlzIGJlY2F1c2UgU1RBTkRCWQorCSAqIHJlZ2lzdGVycyBhcmUgcGFydCBvZiBzeXN0ZW0gY29udHJvbGxlciB3aGljaCBhbGxvd3Mgc3lzdGVtIHBvd2VyCisJICogdXAvZG93biBpbiBhIGNvbnRyb2xsZWQsIHBvcC1mcmVlIG1hbm5lci4gQWxzbywgYXMgcGVyIGFwcGxpY2F0aW9uCisJICogbm90ZSBvZiBEQTcyMTAsIFNUQU5EQlkgcmVnaXN0ZXIgYml0cyBhcmUgb25seSBlZmZlY3RpdmUgaWYgYQorCSAqIHBhcnRpY3VsYXIgSU8gKG9yIEFEQy9EQUMpIGlzIGFscmVhZHkgZW5hYmxlZCB1c2luZyBlbmFibGUvZGlzYWJsZQorCSAqIHJlZ2lzdGVyIGJpdHMuIEtlZXBpbmcgdGhlc2UgdGhpbmdzIGluIG1pbmQsIGN1cnJlbnQgREFQTQorCSAqIGltcGxlbWVudGF0aW9uIG1hbmlwdWxhdGVzIG9ubHkgU1RBTkRCWSBiaXRzLgorCSAqCisJICogT3ZlcmFsbCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgb3V0bGluZWQgYXMgYmVsb3csCisJICoKKwkgKiAtICJFbmFibGUgYml0IiBvZiBhbiBJTyBvciBBREMvREFDIGlzIHVzZWQgdG8gZW5hYmxlIGl0IGluIHByb2JlKCkKKwkgKiAtICJTVEFOREJZIGJpdCIgaXMgY29udHJvbGxlZCBieSBEQVBNCisJICovCisKKwkvKiBFbmFibGUgTGluZSBvdXQgYW1wbGlmaWVycyAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9PVVQxX0wsIERBNzIxMF9PVVQxX0xfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9PVVQxX1IsIERBNzIxMF9PVVQxX1JfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9PVVQyLCBEQTcyMTBfT1VUMl9FTiB8CisJCSAgICAgREE3MjEwX09VVDJfT1VUTUlYX0wgfCBEQTcyMTBfT1VUMl9PVVRNSVhfUik7CisKIAkvKiBEaWFibGUgUExMIGFuZCBieXBhc3MgaXQgKi8KLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9QTEwsIERBNzIxMF9QTExfRlNfNDgwMDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9QTEwsIERBNzIxMF9QTExfRlNfNDgwMDApOwogCiAJLyoKIAkgKiBJZiA0OGtIeiBzb3VuZCBjYW1lLCBpdCB1c2UgYnlwYXNzIG1vZGUsCkBAIC01MjEsMjUgKzkwMCwyMiBAQAogCSAqIERBNzIxMF9QTExfRElWMyA6OiBEQTcyMTBfUExMX0JZUCBiaXQuCiAJICogICBzZWUgZGE3MjEwX2h3X3BhcmFtcwogCSAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX1BMTF9ESVYxLCAweEU1KTsgLyogTUNMSyA9IDEyLjI4OE1IeiAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX1BMTF9ESVYyLCAweDk5KTsKLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9QTExfRElWMywgMHgwQSB8CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX1BMTF9ESVYxLCAweEU1KTsgLyogTUNMSyA9IDEyLjI4OE1IeiAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9QTExfRElWMiwgMHg5OSk7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX1BMTF9ESVYzLCAweDBBIHwKIAkJICAgICBEQTcyMTBfTUNMS19SQU5HRV8xMF8yMF9NSFogfCBEQTcyMTBfUExMX0JZUCk7CiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEwX1BMTCwgREE3MjEwX1BMTF9FTiwgREE3MjEwX1BMTF9FTik7CiAKIAkvKiBBcyBzdWdnZXN0ZWQgYnkgRGlhbG9nICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9ISURfVU5MT0NLLAkweDhCKTsgLyogdW5sb2NrICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9URVNUX1VOTE9DSywJMHhCNCk7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9QTEwxLAkJMHgwMSk7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9DUF9NT0RFLAkJMHg3Qyk7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9ISURfVU5MT0NLLAkweDAwKTsgLyogcmUtbG9jayAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX0FfVEVTVF9VTkxPQ0ssCTB4MDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9BX0hJRF9VTkxPQ0ssCTB4OEIpOyAvKiB1bmxvY2sgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9URVNUX1VOTE9DSywJMHhCNCk7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0FfUExMMSwJCTB4MDEpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9BX0NQX01PREUsCQkweDdDKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9ISURfVU5MT0NLLAkweDAwKTsgLyogcmUtbG9jayAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9BX1RFU1RfVU5MT0NLLAkweDAwKTsKIAogCS8qIEFjdGl2YXRlIGFsbCBlbmFibGVkIHN1YnN5c3RlbSAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX1NUQVJUVVAxLCBEQTcyMTBfU0NfTVNUX0VOKTsKLQotCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBkYTcyMTBfc25kX2NvbnRyb2xzLAotCQkJICAgICBBUlJBWV9TSVpFKGRhNzIxMF9zbmRfY29udHJvbHMpKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfU1RBUlRVUDEsIERBNzIxMF9TQ19NU1RfRU4pOwogCiAJZGV2X2luZm8oY29kZWMtPmRldiwgIkRBNzIxMCBBdWRpbyBDb2RlYyAlc1xuIiwgREE3MjEwX1ZFUlNJT04pOwogCkBAIC01NDgsMTEgKzkyNCwxOCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfZGE3MjEwID0gewogCS5wcm9iZQkJCT0gZGE3MjEwX3Byb2JlLAotCS5yZWFkCQkJPSBkYTcyMTBfcmVhZCwKLQkud3JpdGUJCQk9IGRhNzIxMF93cml0ZSwKIAkucmVnX2NhY2hlX3NpemUJCT0gQVJSQVlfU0laRShkYTcyMTBfcmVnKSwKIAkucmVnX3dvcmRfc2l6ZQkJPSBzaXplb2YodTgpLAogCS5yZWdfY2FjaGVfZGVmYXVsdAk9IGRhNzIxMF9yZWcsCisJLnZvbGF0aWxlX3JlZ2lzdGVyCT0gZGE3MjEwX3ZvbGF0aWxlX3JlZ2lzdGVyLAorCisJLmNvbnRyb2xzCQk9IGRhNzIxMF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxMF9zbmRfY29udHJvbHMpLAorCisJLmRhcG1fd2lkZ2V0cwkJPSBkYTcyMTBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMTBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJCT0gZGE3MjEwX2F1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTcyMTBfYXVkaW9fbWFwKSwKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCkBAIC01NjcsNyArOTUwLDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBkYTcyMTApOwotCWRhNzIxMC0+Y29udHJvbF9kYXRhID0gaTJjOwogCWRhNzIxMC0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZG1pYy5jCmluZGV4IGY5YTg3NzMuLjZmYWU3NjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZG1pYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZG1pYy5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbG00ODU3LmMKaW5kZXggMmMyYTY4MS4uYzM4N2RhZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDg1Ny5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCiAgKiBBdXRob3I6IEdyYWVtZSBHcmVnb3J5Ci0gKiAgICAgICAgIGdyYWVtZS5ncmVnb3J5QHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogICAgICAgICBncmFlbWUuZ3JlZ29yeUB3b2xmc29ubWljcm8uY29tCiAgKiBDb3B5cmlnaHQgMjAxMSBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKaW5kZXggYWM2NWEyZC4uZWJiZjYzYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYwpAQCAtNDAsNyArNDAsNiBAQAogCiBzdHJ1Y3QgbWF4OTgwODhfcHJpdiB7CiAgICAgICAgZW51bSBtYXg5ODA4OF90eXBlIGRldnR5cGU7Ci0gICAgICAgdm9pZCAqY29udHJvbF9kYXRhOwogICAgICAgIHN0cnVjdCBtYXg5ODA4OF9wZGF0YSAqcGRhdGE7CiAgICAgICAgdW5zaWduZWQgaW50IHN5c2NsazsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfY2RhdGEgZGFpWzJdOwpAQCAtMTY5NywxMyArMTY5NiwxOSBAQAogfQogfTsKIAotc3RhdGljIGludCBtYXg5ODA4OF9nZXRfY2hhbm5lbChjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIGNvbnN0IGNoYXIgKmVxX21vZGVfbmFtZVtdID0geyJFUTEgTW9kZSIsICJFUTIgTW9kZSJ9OworCitzdGF0aWMgaW50IG1heDk4MDg4X2dldF9jaGFubmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICAgICBpZiAoc3RyY21wKG5hbWUsICJFUTEgTW9kZSIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICBpZiAoc3RyY21wKG5hbWUsICJFUTIgTW9kZSIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVxX21vZGVfbmFtZSk7IGkrKykKKwkJaWYgKHN0cmNtcChuYW1lLCBlcV9tb2RlX25hbWVbaV0pID09IDApCisJCQlyZXR1cm4gaTsKKworCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJCYWQgRVEgY2hhbm5lbCBuYW1lICclcydcbiIsIG5hbWUpOworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgdm9pZCBtYXg5ODA4OF9zZXR1cF9lcTEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpAQCAtMTgwNywxMCArMTgxMiwxMyBAQAogICAgICAgIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfcHJpdiAqbWF4OTgwODggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfcGRhdGEgKnBkYXRhID0gbWF4OTgwODgtPnBkYXRhOwotICAgICAgIGludCBjaGFubmVsID0gbWF4OTgwODhfZ2V0X2NoYW5uZWwoa2NvbnRyb2wtPmlkLm5hbWUpOworICAgICAgIGludCBjaGFubmVsID0gbWF4OTgwODhfZ2V0X2NoYW5uZWwoY29kZWMsIGtjb250cm9sLT5pZC5uYW1lKTsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfY2RhdGEgKmNkYXRhOwogICAgICAgIGludCBzZWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAorICAgICAgIGlmIChjaGFubmVsIDwgMCkKKwkgICAgICAgcmV0dXJuIGNoYW5uZWw7CisKICAgICAgICBjZGF0YSA9ICZtYXg5ODA4OC0+ZGFpW2NoYW5uZWxdOwogCiAgICAgICAgaWYgKHNlbCA+PSBwZGF0YS0+ZXFfY2ZnY250KQpAQCAtMTgzNSw5ICsxODQzLDEyIEBACiB7CiAgICAgICAgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogICAgICAgIHN0cnVjdCBtYXg5ODA4OF9wcml2ICptYXg5ODA4OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotICAgICAgIGludCBjaGFubmVsID0gbWF4OTgwODhfZ2V0X2NoYW5uZWwoa2NvbnRyb2wtPmlkLm5hbWUpOworICAgICAgIGludCBjaGFubmVsID0gbWF4OTgwODhfZ2V0X2NoYW5uZWwoY29kZWMsIGtjb250cm9sLT5pZC5uYW1lKTsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfY2RhdGEgKmNkYXRhOwogCisgICAgICAgaWYgKGNoYW5uZWwgPCAwKQorCSAgICAgICByZXR1cm4gY2hhbm5lbDsKKwogICAgICAgIGNkYXRhID0gJm1heDk4MDg4LT5kYWlbY2hhbm5lbF07CiAgICAgICAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGNkYXRhLT5lcV9zZWw7CiAgICAgICAgcmV0dXJuIDA7CkBAIC0xODUyLDE3ICsxODYzLDE3IEBACiAgICAgICAgaW50IGksIGo7CiAgICAgICAgY29uc3QgY2hhciAqKnQ7CiAgICAgICAgaW50IHJldDsKLQogICAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNvbnRyb2xzW10gPSB7Ci0gICAgICAgICAgICAgICBTT0NfRU5VTV9FWFQoIkVRMSBNb2RlIiwKKyAgICAgICAgICAgICAgIFNPQ19FTlVNX0VYVCgoY2hhciAqKWVxX21vZGVfbmFtZVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4OTgwODgtPmVxX2VudW0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1heDk4MDg4X2dldF9lcV9lbnVtLAogICAgICAgICAgICAgICAgICAgICAgICBtYXg5ODA4OF9wdXRfZXFfZW51bSksCi0gICAgICAgICAgICAgICBTT0NfRU5VTV9FWFQoIkVRMiBNb2RlIiwKKyAgICAgICAgICAgICAgIFNPQ19FTlVNX0VYVCgoY2hhciAqKWVxX21vZGVfbmFtZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4OTgwODgtPmVxX2VudW0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1heDk4MDg4X2dldF9lcV9lbnVtLAogICAgICAgICAgICAgICAgICAgICAgICBtYXg5ODA4OF9wdXRfZXFfZW51bSksCiAgICAgICAgfTsKKyAgICAgICBCVUlMRF9CVUdfT04oQVJSQVlfU0laRShjb250cm9scykgIT0gQVJSQVlfU0laRShlcV9tb2RlX25hbWUpKTsKIAogICAgICAgIGNmZyA9IHBkYXRhLT5lcV9jZmc7CiAgICAgICAgY2ZnY250ID0gcGRhdGEtPmVxX2NmZ2NudDsKQEAgLTIwNjYsNyArMjA3Nyw2IEBACiAgICAgICAgbWF4OTgwODgtPmRldnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CiAKICAgICAgICBpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBtYXg5ODA4OCk7Ci0gICAgICAgbWF4OTgwODgtPmNvbnRyb2xfZGF0YSA9IGkyYzsKICAgICAgICBtYXg5ODA4OC0+cGRhdGEgPSBpMmMtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAgICAgICAgcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMKaW5kZXggNjY4NDM0ZC4uMjZkN2IwOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYwpAQCAtNDAsNyArNDAsNiBAQAogCiBzdHJ1Y3QgbWF4OTgwOTVfcHJpdiB7CiAJZW51bSBtYXg5ODA5NV90eXBlIGRldnR5cGU7Ci0Jdm9pZCAqY29udHJvbF9kYXRhOwogCXN0cnVjdCBtYXg5ODA5NV9wZGF0YSAqcGRhdGE7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKIAlzdHJ1Y3QgbWF4OTgwOTVfY2RhdGEgZGFpWzNdOwpAQCAtNjE4LDE0ICs2MTcsMTMgQEAKIHN0YXRpYyBpbnQgbWF4OTgwOTVfaHdfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkJICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7Ci0JdTggZGF0YVsyXTsKKwlpbnQgcmV0OwogCi0JZGF0YVswXSA9IHJlZzsKLQlkYXRhWzFdID0gdmFsdWU7Ci0JaWYgKGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKSA9PSAyKQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAtRUlPOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAxOworCXJldCA9IHNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUpOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAwOworCisJcmV0dXJuIHJldCA/IC1FSU8gOiAwOwogfQogCiAvKgpAQCAtMTk5MiwxMiArMTk5MCwxOSBAQAogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gYWRkIEVRIGNvbnRyb2w6ICVkXG4iLCByZXQpOwogfQogCi1zdGF0aWMgaW50IG1heDk4MDk1X2dldF9icV9jaGFubmVsKGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgY29uc3QgY2hhciAqYnFfbW9kZV9uYW1lW10gPSB7IkJpcXVhZDEgTW9kZSIsICJCaXF1YWQyIE1vZGUifTsKKworc3RhdGljIGludCBtYXg5ODA5NV9nZXRfYnFfY2hhbm5lbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlpZiAoc3RyY21wKG5hbWUsICJCaXF1YWQxIE1vZGUiKSA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoc3RyY21wKG5hbWUsICJCaXF1YWQyIE1vZGUiKSA9PSAwKQotCQlyZXR1cm4gMTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJxX21vZGVfbmFtZSk7IGkrKykKKwkJaWYgKHN0cmNtcChuYW1lLCBicV9tb2RlX25hbWVbaV0pID09IDApCisJCQlyZXR1cm4gaTsKKworCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJCYWQgYmlxdWFkIGNoYW5uZWwgbmFtZSAnJXMnXG4iLCBuYW1lKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtMjAwNywxNCArMjAxMiwxNSBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgbWF4OTgwOTVfcHJpdiAqbWF4OTgwOTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3QgbWF4OTgwOTVfcGRhdGEgKnBkYXRhID0gbWF4OTgwOTUtPnBkYXRhOwotCWludCBjaGFubmVsID0gbWF4OTgwOTVfZ2V0X2JxX2NoYW5uZWwoa2NvbnRyb2wtPmlkLm5hbWUpOworCWludCBjaGFubmVsID0gbWF4OTgwOTVfZ2V0X2JxX2NoYW5uZWwoY29kZWMsIGtjb250cm9sLT5pZC5uYW1lKTsKIAlzdHJ1Y3QgbWF4OTgwOTVfY2RhdGEgKmNkYXRhOwogCWludCBzZWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAlzdHJ1Y3QgbWF4OTgwOTVfYmlxdWFkX2NmZyAqY29lZl9zZXQ7CiAJaW50IGZzLCBiZXN0LCBiZXN0X3ZhbCwgaTsKIAlpbnQgcmVnbWFzaywgcmVnc2F2ZTsKIAotCUJVR19PTihjaGFubmVsID4gMSk7CisJaWYgKGNoYW5uZWwgPCAwKQorCQlyZXR1cm4gY2hhbm5lbDsKIAogCWlmICghcGRhdGEgfHwgIW1heDk4MDk1LT5icV90ZXh0Y250KQogCQlyZXR1cm4gMDsKQEAgLTIwNjYsOSArMjA3MiwxMiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgbWF4OTgwOTVfcHJpdiAqbWF4OTgwOTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgY2hhbm5lbCA9IG1heDk4MDk1X2dldF9icV9jaGFubmVsKGtjb250cm9sLT5pZC5uYW1lKTsKKwlpbnQgY2hhbm5lbCA9IG1heDk4MDk1X2dldF9icV9jaGFubmVsKGNvZGVjLCBrY29udHJvbC0+aWQubmFtZSk7CiAJc3RydWN0IG1heDk4MDk1X2NkYXRhICpjZGF0YTsKIAorCWlmIChjaGFubmVsIDwgMCkKKwkJcmV0dXJuIGNoYW5uZWw7CisKIAljZGF0YSA9ICZtYXg5ODA5NS0+ZGFpW2NoYW5uZWxdOwogCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBjZGF0YS0+YnFfc2VsOwogCkBAIC0yMDg2LDE1ICsyMDk1LDE2IEBACiAJaW50IHJldDsKIAogCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNvbnRyb2xzW10gPSB7Ci0JCVNPQ19FTlVNX0VYVCgiQmlxdWFkMSBNb2RlIiwKKwkJU09DX0VOVU1fRVhUKChjaGFyICopYnFfbW9kZV9uYW1lWzBdLAogCQkJbWF4OTgwOTUtPmJxX2VudW0sCiAJCQltYXg5ODA5NV9nZXRfYnFfZW51bSwKIAkJCW1heDk4MDk1X3B1dF9icV9lbnVtKSwKLQkJU09DX0VOVU1fRVhUKCJCaXF1YWQyIE1vZGUiLAorCQlTT0NfRU5VTV9FWFQoKGNoYXIgKilicV9tb2RlX25hbWVbMV0sCiAJCQltYXg5ODA5NS0+YnFfZW51bSwKIAkJCW1heDk4MDk1X2dldF9icV9lbnVtLAogCQkJbWF4OTgwOTVfcHV0X2JxX2VudW0pLAogCX07CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoY29udHJvbHMpICE9IEFSUkFZX1NJWkUoYnFfbW9kZV9uYW1lKSk7CiAKIAljZmcgPSBwZGF0YS0+YnFfY2ZnOwogCWNmZ2NudCA9IHBkYXRhLT5icV9jZmdjbnQ7CkBAIC0yMzM3LDcgKzIzNDcsNiBAQAogCiAJbWF4OTgwOTUtPmRldnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgbWF4OTgwOTUpOwotCW1heDk4MDk1LT5jb250cm9sX2RhdGEgPSBpMmM7CiAJbWF4OTgwOTUtPnBkYXRhID0gaTJjLT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl9tYXg5ODA5NSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzAwOC5jIGIvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMKaW5kZXggYmQ4ZjI2ZS4uZjczMTY1MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2EwNzhjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwpAQCAtMCwwICsxLDE3NzMgQEAKKy8qCisgKiBydDU2MzEuYyAgLS0gIFJUNTYzMSBBTFNBIFNvYyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBSZWFsdGVrIE1pY3JvZWxlY3Ryb25pY3MKKyAqCisgKiBBdXRob3I6IGZsb3ZlIDxmbG92ZUByZWFsdGVrLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBXTTg3NTMuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCisjaW5jbHVkZSAicnQ1NjMxLmgiCisKK3N0cnVjdCBydDU2MzFfcHJpdiB7CisJaW50IGNvZGVjX3ZlcnNpb247CisJaW50IG1hc3RlcjsKKwlpbnQgc3lzY2xrOworCWludCByeF9yYXRlOworCWludCBiY2xrX3JhdGU7CisJaW50IGRtaWNfdXNlZF9mbGFnOworfTsKKworc3RhdGljIGNvbnN0IHUxNiBydDU2MzFfcmVnW1JUNTYzMV9WRU5ET1JfSUQyICsgMV0gPSB7CisJW1JUNTYzMV9TUEtfT1VUX1ZPTF0gPSAweDg4ODgsCisJW1JUNTYzMV9IUF9PVVRfVk9MXSA9IDB4ODA4MCwKKwlbUlQ1NjMxX01PTk9fQVhPXzFfMl9WT0xdID0gMHhhMDgwLAorCVtSVDU2MzFfQVVYX0lOX1ZPTF0gPSAweDA4MDgsCisJW1JUNTYzMV9BRENfUkVDX01JWEVSXSA9IDB4ZjBmMCwKKwlbUlQ1NjMxX1ZEQUNfRElHX1ZPTF0gPSAweDAwMTAsCisJW1JUNTYzMV9PVVRNSVhFUl9MX0NUUkxdID0gMHhmZmMwLAorCVtSVDU2MzFfT1VUTUlYRVJfUl9DVFJMXSA9IDB4ZmZjMCwKKwlbUlQ1NjMxX0FYTzFNSVhFUl9DVFJMXSA9IDB4ODhjMCwKKwlbUlQ1NjMxX0FYTzJNSVhFUl9DVFJMXSA9IDB4ODhjMCwKKwlbUlQ1NjMxX0RJR19NSUNfQ1RSTF0gPSAweDMwMDAsCisJW1JUNTYzMV9NT05PX0lOUFVUX1ZPTF0gPSAweDg4MDgsCisJW1JUNTYzMV9TUEtfTUlYRVJfQ1RSTF0gPSAweGY4ZjgsCisJW1JUNTYzMV9TUEtfTU9OT19PVVRfQ1RSTF0gPSAweGZjMDAsCisJW1JUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTF0gPSAweDQ0NDAsCisJW1JUNTYzMV9TRFBfQ1RSTF0gPSAweDgwMDAsCisJW1JUNTYzMV9NT05PX1NEUF9DVFJMXSA9IDB4ODAwMCwKKwlbUlQ1NjMxX1NURVJFT19BRF9EQV9DTEtfQ1RSTF0gPSAweDIwMTAsCisJW1JUNTYzMV9HRU5fUFVSX0NUUkxfUkVHXSA9IDB4MGUwMCwKKwlbUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yXSA9IDB4MDcxYSwKKwlbUlQ1NjMxX01JU0NfQ1RSTF0gPSAweDIwNDAsCisJW1JUNTYzMV9ERVBPUF9GVU5fQ1RSTF8yXSA9IDB4ODAwMCwKKwlbUlQ1NjMxX1NPRlRfVk9MX0NUUkxdID0gMHgwN2UwLAorCVtSVDU2MzFfQUxDX0NUUkxfMV0gPSAweDAyMDYsCisJW1JUNTYzMV9BTENfQ1RSTF8zXSA9IDB4MjAwMCwKKwlbUlQ1NjMxX1BTRVVET19TUEFUTF9DVFJMXSA9IDB4MDU1MywKK307CisKKy8qKgorICogcnQ1NjMxX3dyaXRlX2luZGV4IC0gd3JpdGUgaW5kZXggcmVnaXN0ZXIgb2YgMm5kIGxheWVyCisgKi8KK3N0YXRpYyB2b2lkIHJ0NTYzMV93cml0ZV9pbmRleChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5ERVhfQURELCByZWcpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9JTkRFWF9EQVRBLCB2YWx1ZSk7Cit9CisKKy8qKgorICogcnQ1NjMxX3JlYWRfaW5kZXggLSByZWFkIGluZGV4IHJlZ2lzdGVyIG9mIDJuZCBsYXllcgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0NTYzMV9yZWFkX2luZGV4KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQl1bnNpZ25lZCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9JTkRFWF9BREQsIHJlZyk7CisJdmFsdWUgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTYzMV9JTkRFWF9EQVRBKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBydDU2MzFfcmVzZXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfUkVTRVQsIDApOworfQorCitzdGF0aWMgaW50IHJ0NTYzMV92b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFJUNTYzMV9SRVNFVDoKKwljYXNlIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMjoKKwljYXNlIFJUNTYzMV9JTkRFWF9BREQ6CisJY2FzZSBSVDU2MzFfSU5ERVhfREFUQToKKwljYXNlIFJUNTYzMV9FUV9DVFJMOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlQ1NjMxX1JFU0VUOgorCWNhc2UgUlQ1NjMxX1NQS19PVVRfVk9MOgorCWNhc2UgUlQ1NjMxX0hQX09VVF9WT0w6CisJY2FzZSBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTDoKKwljYXNlIFJUNTYzMV9BVVhfSU5fVk9MOgorCWNhc2UgUlQ1NjMxX1NURVJFT19EQUNfVk9MXzE6CisJY2FzZSBSVDU2MzFfTUlDX0NUUkxfMToKKwljYXNlIFJUNTYzMV9TVEVSRU9fREFDX1ZPTF8yOgorCWNhc2UgUlQ1NjMxX0FEQ19DVFJMXzE6CisJY2FzZSBSVDU2MzFfQURDX1JFQ19NSVhFUjoKKwljYXNlIFJUNTYzMV9BRENfQ1RSTF8yOgorCWNhc2UgUlQ1NjMxX1ZEQUNfRElHX1ZPTDoKKwljYXNlIFJUNTYzMV9PVVRNSVhFUl9MX0NUUkw6CisJY2FzZSBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMOgorCWNhc2UgUlQ1NjMxX0FYTzFNSVhFUl9DVFJMOgorCWNhc2UgUlQ1NjMxX0FYTzJNSVhFUl9DVFJMOgorCWNhc2UgUlQ1NjMxX01JQ19DVFJMXzI6CisJY2FzZSBSVDU2MzFfRElHX01JQ19DVFJMOgorCWNhc2UgUlQ1NjMxX01PTk9fSU5QVVRfVk9MOgorCWNhc2UgUlQ1NjMxX1NQS19NSVhFUl9DVFJMOgorCWNhc2UgUlQ1NjMxX1NQS19NT05PX09VVF9DVFJMOgorCWNhc2UgUlQ1NjMxX1NQS19NT05PX0hQX09VVF9DVFJMOgorCWNhc2UgUlQ1NjMxX1NEUF9DVFJMOgorCWNhc2UgUlQ1NjMxX01PTk9fU0RQX0NUUkw6CisJY2FzZSBSVDU2MzFfU1RFUkVPX0FEX0RBX0NMS19DVFJMOgorCWNhc2UgUlQ1NjMxX1BXUl9NQU5BR19BREQxOgorCWNhc2UgUlQ1NjMxX1BXUl9NQU5BR19BREQyOgorCWNhc2UgUlQ1NjMxX1BXUl9NQU5BR19BREQzOgorCWNhc2UgUlQ1NjMxX1BXUl9NQU5BR19BREQ0OgorCWNhc2UgUlQ1NjMxX0dFTl9QVVJfQ1RSTF9SRUc6CisJY2FzZSBSVDU2MzFfR0xPQkFMX0NMS19DVFJMOgorCWNhc2UgUlQ1NjMxX1BMTF9DVFJMOgorCWNhc2UgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8xOgorCWNhc2UgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yOgorCWNhc2UgUlQ1NjMxX0dQSU9fQ1RSTDoKKwljYXNlIFJUNTYzMV9NSVNDX0NUUkw6CisJY2FzZSBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMToKKwljYXNlIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8yOgorCWNhc2UgUlQ1NjMxX0pBQ0tfREVUX0NUUkw6CisJY2FzZSBSVDU2MzFfU09GVF9WT0xfQ1RSTDoKKwljYXNlIFJUNTYzMV9BTENfQ1RSTF8xOgorCWNhc2UgUlQ1NjMxX0FMQ19DVFJMXzI6CisJY2FzZSBSVDU2MzFfQUxDX0NUUkxfMzoKKwljYXNlIFJUNTYzMV9QU0VVRE9fU1BBVExfQ1RSTDoKKwljYXNlIFJUNTYzMV9JTkRFWF9BREQ6CisJY2FzZSBSVDU2MzFfSU5ERVhfREFUQToKKwljYXNlIFJUNTYzMV9FUV9DVFJMOgorCWNhc2UgUlQ1NjMxX1ZFTkRPUl9JRDoKKwljYXNlIFJUNTYzMV9WRU5ET1JfSUQxOgorCWNhc2UgUlQ1NjMxX1ZFTkRPUl9JRDI6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKG91dF92b2xfdGx2LCAtNDY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYWNfdm9sX3RsdiwgLTk1NjI1LCAzNzUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGluX3ZvbF90bHYsIC0zNDUwLCAxNTAsIDApOworLyogezAsICsyMCwgKzI0LCArMzAsICszNSwgKzQwLCArNDQsICs1MCwgKzUyfWRCICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1pY19ic3RfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoNiksCisJMCwgMCwgVExWX0RCX1NDQUxFX0lURU0oMCwgMCwgMCksCisJMSwgMSwgVExWX0RCX1NDQUxFX0lURU0oMjAwMCwgMCwgMCksCisJMiwgMiwgVExWX0RCX1NDQUxFX0lURU0oMjQwMCwgMCwgMCksCisJMywgNSwgVExWX0RCX1NDQUxFX0lURU0oMzAwMCwgNTAwLCAwKSwKKwk2LCA2LCBUTFZfREJfU0NBTEVfSVRFTSg0NDAwLCAwLCAwKSwKKwk3LCA3LCBUTFZfREJfU0NBTEVfSVRFTSg1MDAwLCAwLCAwKSwKKwk4LCA4LCBUTFZfREJfU0NBTEVfSVRFTSg1MjAwLCAwLCAwKSwKK307CisKK3N0YXRpYyBpbnQgcnQ1NjMxX2RtaWNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcnQ1NjMxLT5kbWljX3VzZWRfZmxhZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTYzMV9kbWljX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBydDU2MzFfcHJpdiAqcnQ1NjMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlydDU2MzEtPmRtaWNfdXNlZF9mbGFnID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcmV0dXJuIDA7Cit9CisKKy8qIE1JQyBJbnB1dCBUeXBlICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2lucHV0X21vZGVbXSA9IHsKKwkiU2luZ2xlIGVuZGVkIiwgIkRpZmZlcmVudGlhbCJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX21pYzFfbW9kZV9lbnVtLCBSVDU2MzFfTUlDX0NUUkxfMSwKKwlSVDU2MzFfTUlDMV9ESUZGX0lOUFVUX1NISUZULCBydDU2MzFfaW5wdXRfbW9kZSk7CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKKwlydDU2MzFfbWljMl9tb2RlX2VudW0sIFJUNTYzMV9NSUNfQ1RSTF8xLAorCVJUNTYzMV9NSUMyX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKKworLyogTU9OTyBJbnB1dCBUeXBlICovCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX21vbm9pbl9tb2RlX2VudW0sIFJUNTYzMV9NT05PX0lOUFVUX1ZPTCwKKwlSVDU2MzFfTU9OT19ESUZGX0lOUFVUX1NISUZULCBydDU2MzFfaW5wdXRfbW9kZSk7CisKKy8qIFNQSyBSYXRpbyBHYWluIENvbnRyb2wgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfc3BrX3JhdGlvW10gPSB7IjEuMDB4IiwgIjEuMDl4IiwgIjEuMjd4IiwgIjEuNDR4IiwKKwkJCSIxLjU2eCIsICIxLjY4eCIsICIxLjk5eCIsICIyLjM0eCJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX3Nwa19yYXRpb19lbnVtLCBSVDU2MzFfR0VOX1BVUl9DVFJMX1JFRywKKwlSVDU2MzFfU1BLX0FNUF9SQVRJT19DVFJMX1NISUZULCBydDU2MzFfc3BrX3JhdGlvKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zbmRfY29udHJvbHNbXSA9IHsKKwkvKiBNSUMgKi8KKwlTT0NfRU5VTSgiTUlDMSBNb2RlIENvbnRyb2wiLCAgcnQ1NjMxX21pYzFfbW9kZV9lbnVtKSwKKwlTT0NfU0lOR0xFX1RMVigiTUlDMSBCb29zdCIsIFJUNTYzMV9NSUNfQ1RSTF8yLAorCQlSVDU2MzFfTUlDMV9CT09TVF9TSElGVCwgOCwgMCwgbWljX2JzdF90bHYpLAorCVNPQ19FTlVNKCJNSUMyIE1vZGUgQ29udHJvbCIsIHJ0NTYzMV9taWMyX21vZGVfZW51bSksCisJU09DX1NJTkdMRV9UTFYoIk1JQzIgQm9vc3QiLCBSVDU2MzFfTUlDX0NUUkxfMiwKKwkJUlQ1NjMxX01JQzJfQk9PU1RfU0hJRlQsIDgsIDAsIG1pY19ic3RfdGx2KSwKKwkvKiBNT05PIElOICovCisJU09DX0VOVU0oIk1PTk9JTiBNb2RlIENvbnRyb2wiLCBydDU2MzFfbW9ub2luX21vZGVfZW51bSksCisJU09DX0RPVUJMRV9UTFYoIk1PTk9JTl9SWCBDYXB0dXJlIFZvbHVtZSIsIFJUNTYzMV9NT05PX0lOUFVUX1ZPTCwKKwkJCVJUNTYzMV9MX1ZPTF9TSElGVCwgUlQ1NjMxX1JfVk9MX1NISUZULAorCQkJUlQ1NjMxX1ZPTF9NQVNLLCAxLCBpbl92b2xfdGx2KSwKKwkvKiBBWEkgKi8KKwlTT0NfRE9VQkxFX1RMVigiQVhJIENhcHR1cmUgVm9sdW1lIiwgUlQ1NjMxX0FVWF9JTl9WT0wsCisJCQlSVDU2MzFfTF9WT0xfU0hJRlQsIFJUNTYzMV9SX1ZPTF9TSElGVCwKKwkJCVJUNTYzMV9WT0xfTUFTSywgMSwgaW5fdm9sX3RsdiksCisJLyogREFDICovCisJU09DX0RPVUJMRV9UTFYoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCBSVDU2MzFfU1RFUkVPX0RBQ19WT0xfMiwKKwkJCVJUNTYzMV9MX1ZPTF9TSElGVCwgUlQ1NjMxX1JfVk9MX1NISUZULAorCQkJUlQ1NjMxX0RBQ19WT0xfTUFTSywgMSwgZGFjX3ZvbF90bHYpLAorCVNPQ19ET1VCTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1RFUkVPX0RBQ19WT0xfMSwKKwkJCVJUNTYzMV9MX01VVEVfU0hJRlQsIFJUNTYzMV9SX01VVEVfU0hJRlQsIDEsIDEpLAorCS8qIEFYTyAqLworCVNPQ19TSU5HTEUoIkFYTzEgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX01PTk9fQVhPXzFfMl9WT0wsCisJCQkJUlQ1NjMxX0xfTVVURV9TSElGVCwgMSwgMSksCisJU09DX1NJTkdMRSgiQVhPMiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKKwkJCQlSVDU2MzFfUl9WT0xfU0hJRlQsIDEsIDEpLAorCS8qIE9VVFZPTCAqLworCVNPQ19ET1VCTEUoIk9VVFZPTCBDaGFubmVsIFN3aXRjaCIsIFJUNTYzMV9TUEtfT1VUX1ZPTCwKKwkJUlQ1NjMxX0xfRU5fU0hJRlQsIFJUNTYzMV9SX0VOX1NISUZULCAxLCAwKSwKKworCS8qIFNQSyAqLworCVNPQ19ET1VCTEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX1NQS19PVVRfVk9MLAorCQlSVDU2MzFfTF9NVVRFX1NISUZULCBSVDU2MzFfUl9NVVRFX1NISUZULCAxLCAxKSwKKwlTT0NfRE9VQkxFX1RMVigiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCBSVDU2MzFfU1BLX09VVF9WT0wsCisJCVJUNTYzMV9MX1ZPTF9TSElGVCwgUlQ1NjMxX1JfVk9MX1NISUZULCAzOSwgMSwgb3V0X3ZvbF90bHYpLAorCS8qIE1PTk8gT1VUICovCisJU09DX1NJTkdMRSgiTU9OTyBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKKwkJCQlSVDU2MzFfTVVURV9NT05PX1NISUZULCAxLCAxKSwKKwkvKiBIUCAqLworCVNPQ19ET1VCTEUoIkhQIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9IUF9PVVRfVk9MLAorCQlSVDU2MzFfTF9NVVRFX1NISUZULCBSVDU2MzFfUl9NVVRFX1NISUZULCAxLCAxKSwKKwlTT0NfRE9VQkxFX1RMVigiSFAgUGxheWJhY2sgVm9sdW1lIiwgUlQ1NjMxX0hQX09VVF9WT0wsCisJCVJUNTYzMV9MX1ZPTF9TSElGVCwgUlQ1NjMxX1JfVk9MX1NISUZULAorCQlSVDU2MzFfVk9MX01BU0ssIDEsIG91dF92b2xfdGx2KSwKKwkvKiBETUlDICovCisJU09DX1NJTkdMRV9FWFQoIkRNSUMgU3dpdGNoIiwgMCwgMCwgMSwgMCwKKwkJcnQ1NjMxX2RtaWNfZ2V0LCBydDU2MzFfZG1pY19wdXQpLAorCVNPQ19ET1VCTEUoIkRNSUMgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfRElHX01JQ19DVFJMLAorCQlSVDU2MzFfRE1JQ19MX0NIX01VVEVfU0hJRlQsCisJCVJUNTYzMV9ETUlDX1JfQ0hfTVVURV9TSElGVCwgMSwgMSksCisKKwkvKiBTUEsgUmF0aW8gR2FpbiBDb250cm9sICovCisJU09DX0VOVU0oIlNQSyBSYXRpbyBDb250cm9sIiwgcnQ1NjMxX3Nwa19yYXRpb19lbnVtKSwKK307CisKK3N0YXRpYyBpbnQgY2hlY2tfc3lzY2xrMV9zb3VyY2Uoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gc25kX3NvY19yZWFkKHNvdXJjZS0+Y29kZWMsIFJUNTYzMV9HTE9CQUxfQ0xLX0NUUkwpOworCXJldHVybiByZWcgJiBSVDU2MzFfU1lTQ0xLX1NPVVJfU0VMX1BMTDsKK30KKworc3RhdGljIGludCBjaGVja19kbWljX3VzZWQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwlzdHJ1Y3QgcnQ1NjMxX3ByaXYgKnJ0NTYzMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoc291cmNlLT5jb2RlYyk7CisJcmV0dXJuIHJ0NTYzMS0+ZG1pY191c2VkX2ZsYWc7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGFjbF90b19vdXRtaXhsKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2UsCisJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IHNuZF9zb2NfcmVhZChzb3VyY2UtPmNvZGVjLCBSVDU2MzFfT1VUTUlYRVJfTF9DVFJMKTsKKwlyZXR1cm4gIShyZWcgJiBSVDU2MzFfTV9EQUNfTF9UT19PVVRNSVhFUl9MKTsKK30KKworc3RhdGljIGludCBjaGVja19kYWNyX3RvX291dG1peHIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gc25kX3NvY19yZWFkKHNvdXJjZS0+Y29kZWMsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwpOworCXJldHVybiAhKHJlZyAmIFJUNTYzMV9NX0RBQ19SX1RPX09VVE1JWEVSX1IpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RhY2xfdG9fc3BrbWl4bChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc291cmNlLAorCQkJIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSBzbmRfc29jX3JlYWQoc291cmNlLT5jb2RlYywgUlQ1NjMxX1NQS19NSVhFUl9DVFJMKTsKKwlyZXR1cm4gIShyZWcgJiBSVDU2MzFfTV9EQUNfTF9UT19TUEtNSVhFUl9MKTsKK30KKworc3RhdGljIGludCBjaGVja19kYWNyX3RvX3Nwa21peHIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gc25kX3NvY19yZWFkKHNvdXJjZS0+Y29kZWMsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCk7CisJcmV0dXJuICEocmVnICYgUlQ1NjMxX01fREFDX1JfVE9fU1BLTUlYRVJfUik7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYWRjbF9zZWxlY3Qoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gc25kX3NvY19yZWFkKHNvdXJjZS0+Y29kZWMsIFJUNTYzMV9BRENfUkVDX01JWEVSKTsKKwlyZXR1cm4gIShyZWcgJiBSVDU2MzFfTV9NSUMxX1RPX1JFQ01JWEVSX0wpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2FkY3Jfc2VsZWN0KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2UsCisJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IHNuZF9zb2NfcmVhZChzb3VyY2UtPmNvZGVjLCBSVDU2MzFfQURDX1JFQ19NSVhFUik7CisJcmV0dXJuICEocmVnICYgUlQ1NjMxX01fTUlDMl9UT19SRUNNSVhFUl9SKTsKK30KKworLyoqCisgKiBvbmViaXRfZGVwb3BfcG93ZXJfc3RhZ2UgLSBhdXRvIGRlcG9wIGluIHBvd2VyIHN0YWdlLgorICogQGVuYWJsZTogcG93ZXIgb24vb2ZmCisgKgorICogV2hlbiBwb3dlciBvbi9vZmYgaGVhZHBob25lLCB0aGUgZGVwb3Agc2VxdWVuY2UgaXMgZG9uZSBieSBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQgb25lYml0X2RlcG9wX3Bvd2VyX3N0YWdlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgc29mdF92b2wsIGhwX3pjOworCisJLyogZW5hYmxlIG9uZS1iaXQgZGVwb3AgZnVuY3Rpb24gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMiwKKwkJCQlSVDU2MzFfRU5fT05FX0JJVF9ERVBPUCwgMCk7CisKKwkvKiBrZWVwIHNvZnQgdm9sdW1lIGFuZCB6ZXJvIGNyb3NzaW5nIHNldHRpbmcgKi8KKwlzb2Z0X3ZvbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9TT0ZUX1ZPTF9DVFJMLCAwKTsKKwlocF96YyA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjICYgMHhmN2ZmKTsKKwlpZiAoZW5hYmxlKSB7CisJCS8qIGNvbmZpZyBvbmUtYml0IGRlcG9wIHBhcmFtZXRlciAqLworCQlydDU2MzFfd3JpdGVfaW5kZXgoY29kZWMsIFJUNTYzMV9URVNUX01PREVfQ1RSTCwgMHg4NGMwKTsKKwkJcnQ1NjMxX3dyaXRlX2luZGV4KGNvZGVjLCBSVDU2MzFfU1BLX0lOVExfQ1RSTCwgMHgzMDlmKTsKKwkJcnQ1NjMxX3dyaXRlX2luZGV4KGNvZGVjLCBSVDU2MzFfQ1BfSU5UTF9SRUcyLCAweDY1MzApOworCQkvKiBwb3dlciBvbiBjYXBsZXNzIGJsb2NrICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8yLAorCQkJCVJUNTYzMV9FTl9DQVBfRlJFRV9ERVBPUCk7CisJfSBlbHNlIHsKKwkJLyogcG93ZXIgb2ZmIGNhcGxlc3MgYmxvY2sgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0RFUE9QX0ZVTl9DVFJMXzIsIDApOworCQltc2xlZXAoMTAwKTsKKwl9CisKKwkvKiByZWNvdmVyIHNvZnQgdm9sdW1lIGFuZCB6ZXJvIGNyb3NzaW5nIHNldHRpbmcgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfU09GVF9WT0xfQ1RSTCwgc29mdF92b2wpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMiwgaHBfemMpOworfQorCisvKioKKyAqIG9uZWJpdF9kZXBvcF9tdXRlX3N0YWdlIC0gYXV0byBkZXBvcCBpbiBtdXRlIHN0YWdlLgorICogQGVuYWJsZTogbXV0ZS91bm11dGUKKyAqCisgKiBXaGVuIG11dGUvdW5tdXRlIGhlYWRwaG9uZSwgdGhlIGRlcG9wIHNlcXVlbmNlIGlzIGRvbmUgYnkgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIG9uZWJpdF9kZXBvcF9tdXRlX3N0YWdlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgc29mdF92b2wsIGhwX3pjOworCisJLyogZW5hYmxlIG9uZS1iaXQgZGVwb3AgZnVuY3Rpb24gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMiwKKwkJCQlSVDU2MzFfRU5fT05FX0JJVF9ERVBPUCwgMCk7CisKKwkvKiBrZWVwIHNvZnQgdm9sdW1lIGFuZCB6ZXJvIGNyb3NzaW5nIHNldHRpbmcgKi8KKwlzb2Z0X3ZvbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9TT0ZUX1ZPTF9DVFJMLCAwKTsKKwlocF96YyA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjICYgMHhmN2ZmKTsKKwlpZiAoZW5hYmxlKSB7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKKwkJLyogY29uZmlnIG9uZS1iaXQgZGVwb3AgcGFyYW1ldGVyICovCisJCXJ0NTYzMV93cml0ZV9pbmRleChjb2RlYywgUlQ1NjMxX1NQS19JTlRMX0NUUkwsIDB4MzA3Zik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9IUF9PVVRfVk9MLAorCQkJCVJUNTYzMV9MX01VVEUgfCBSVDU2MzFfUl9NVVRFLCAwKTsKKwkJbXNsZWVwKDMwMCk7CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX0hQX09VVF9WT0wsCisJCQlSVDU2MzFfTF9NVVRFIHwgUlQ1NjMxX1JfTVVURSwKKwkJCVJUNTYzMV9MX01VVEUgfCBSVDU2MzFfUl9NVVRFKTsKKwkJbXNsZWVwKDEwMCk7CisJfQorCisJLyogcmVjb3ZlciBzb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zc2luZyBzZXR0aW5nICovCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwsIHNvZnRfdm9sKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjKTsKK30KKworLyoqCisgKiBvbmViaXRfZGVwb3BfcG93ZXJfc3RhZ2UgLSBzdGVwIGJ5IHN0ZXAgZGVwb3Agc2VxdWVuY2UgaW4gcG93ZXIgc3RhZ2UuCisgKiBAZW5hYmxlOiBwb3dlciBvbi9vZmYKKyAqCisgKiBXaGVuIHBvd2VyIG9uL29mZiBoZWFkcGhvbmUsIHRoZSBkZXBvcCBzZXF1ZW5jZSBpcyBkb25lIGluIHN0ZXAgYnkgc3RlcC4KKyAqLworc3RhdGljIHZvaWQgZGVwb3Bfc2VxX3Bvd2VyX3N0YWdlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgc29mdF92b2wsIGhwX3pjOworCisJLyogZGVwb3AgY29udHJvbCBieSByZWdpc3RlciAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8yLAorCQlSVDU2MzFfRU5fT05FX0JJVF9ERVBPUCwgUlQ1NjMxX0VOX09ORV9CSVRfREVQT1ApOworCisJLyoga2VlcCBzb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zc2luZyBzZXR0aW5nICovCisJc29mdF92b2wgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTYzMV9TT0ZUX1ZPTF9DVFJMKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfU09GVF9WT0xfQ1RSTCwgMCk7CisJaHBfemMgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMik7CisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yLCBocF96YyAmIDB4ZjdmZik7CisJaWYgKGVuYWJsZSkgeworCQkvKiBjb25maWcgZGVwb3Agc2VxdWVuY2UgcGFyYW1ldGVyICovCisJCXJ0NTYzMV93cml0ZV9pbmRleChjb2RlYywgUlQ1NjMxX1NQS19JTlRMX0NUUkwsIDB4MzAzZSk7CisKKwkJLyogcG93ZXIgb24gaGVhZHBob25lIGFuZCBjaGFyZ2UgcHVtcCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCQlSVDU2MzFfUFdSX0NIQVJHRV9QVU1QIHwgUlQ1NjMxX1BXUl9IUF9MX0FNUCB8CisJCQlSVDU2MzFfUFdSX0hQX1JfQU1QLAorCQkJUlQ1NjMxX1BXUl9DSEFSR0VfUFVNUCB8IFJUNTYzMV9QV1JfSFBfTF9BTVAgfAorCQkJUlQ1NjMxX1BXUl9IUF9SX0FNUCk7CisKKwkJLyogcG93ZXIgb24gc29mdCBnZW5lcmF0b3IgYW5kIGRlcG9wIG1vZGUyICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8xLAorCQkJUlQ1NjMxX1BPV19PTl9TT0ZUX0dFTiB8IFJUNTYzMV9FTl9ERVBPUDJfRk9SX0hQKTsKKwkJbXNsZWVwKDEwMCk7CisKKwkJLyogc3RvcCBkZXBvcCBtb2RlICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9QV1JfTUFOQUdfQUREMywKKwkJCVJUNTYzMV9QV1JfSFBfREVQT1BfRElTLCBSVDU2MzFfUFdSX0hQX0RFUE9QX0RJUyk7CisJfSBlbHNlIHsKKwkJLyogY29uZmlnIGRlcG9wIHNlcXVlbmNlIHBhcmFtZXRlciAqLworCQlydDU2MzFfd3JpdGVfaW5kZXgoY29kZWMsIFJUNTYzMV9TUEtfSU5UTF9DVFJMLCAweDMwM0YpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMSwKKwkJCVJUNTYzMV9QT1dfT05fU09GVF9HRU4gfCBSVDU2MzFfRU5fTVVURV9VTk1VVEVfREVQT1AgfAorCQkJUlQ1NjMxX1BEX0hQQU1QX0xfU1RfVVAgfCBSVDU2MzFfUERfSFBBTVBfUl9TVF9VUCk7CisJCW1zbGVlcCg3NSk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8xLAorCQkJUlQ1NjMxX1BPV19PTl9TT0ZUX0dFTiB8IFJUNTYzMV9QRF9IUEFNUF9MX1NUX1VQIHwKKwkJCVJUNTYzMV9QRF9IUEFNUF9SX1NUX1VQKTsKKworCQkvKiBzdGFydCBkZXBvcCBtb2RlICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9QV1JfTUFOQUdfQUREMywKKwkJCQlSVDU2MzFfUFdSX0hQX0RFUE9QX0RJUywgMCk7CisKKwkJLyogY29uZmlnIGRlcG9wIHNlcXVlbmNlIHBhcmFtZXRlciAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMSwKKwkJCVJUNTYzMV9QT1dfT05fU09GVF9HRU4gfCBSVDU2MzFfRU5fREVQT1AyX0ZPUl9IUCB8CisJCQlSVDU2MzFfUERfSFBBTVBfTF9TVF9VUCB8IFJUNTYzMV9QRF9IUEFNUF9SX1NUX1VQKTsKKwkJbXNsZWVwKDgwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0RFUE9QX0ZVTl9DVFJMXzEsCisJCQlSVDU2MzFfUE9XX09OX1NPRlRfR0VOKTsKKworCQkvKiBwb3dlciBkb3duIGhlYWRwaG9uZSBhbmQgY2hhcmdlIHB1bXAgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX1BXUl9NQU5BR19BREQzLAorCQkJUlQ1NjMxX1BXUl9DSEFSR0VfUFVNUCB8IFJUNTYzMV9QV1JfSFBfTF9BTVAgfAorCQkJUlQ1NjMxX1BXUl9IUF9SX0FNUCwgMCk7CisJfQorCisJLyogcmVjb3ZlciBzb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zc2luZyBzZXR0aW5nICovCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwsIHNvZnRfdm9sKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjKTsKK30KKworLyoqCisgKiBkZXBvcF9zZXFfbXV0ZV9zdGFnZSAtIHN0ZXAgYnkgc3RlcCBkZXBvcCBzZXF1ZW5jZSBpbiBtdXRlIHN0YWdlLgorICogQGVuYWJsZTogbXV0ZS91bm11dGUKKyAqCisgKiBXaGVuIG11dGUvdW5tdXRlIGhlYWRwaG9uZSwgdGhlIGRlcG9wIHNlcXVlbmNlIGlzIGRvbmUgaW4gc3RlcCBieSBzdGVwLgorICovCitzdGF0aWMgdm9pZCBkZXBvcF9zZXFfbXV0ZV9zdGFnZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IHNvZnRfdm9sLCBocF96YzsKKworCS8qIGRlcG9wIGNvbnRyb2wgYnkgcmVnaXN0ZXIgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMiwKKwkJUlQ1NjMxX0VOX09ORV9CSVRfREVQT1AsIFJUNTYzMV9FTl9PTkVfQklUX0RFUE9QKTsKKworCS8qIGtlZXAgc29mdCB2b2x1bWUgYW5kIHplcm8gY3Jvc3Npbmcgc2V0dGluZyAqLworCXNvZnRfdm9sID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2MzFfU09GVF9WT0xfQ1RSTCk7CisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwsIDApOworCWhwX3pjID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMiwgaHBfemMgJiAweGY3ZmYpOworCWlmIChlbmFibGUpIHsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxMCkpOworCisJCS8qIGNvbmZpZyBkZXBvcCBzZXF1ZW5jZSBwYXJhbWV0ZXIgKi8KKwkJcnQ1NjMxX3dyaXRlX2luZGV4KGNvZGVjLCBSVDU2MzFfU1BLX0lOVExfQ1RSTCwgMHgzMDJmKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0RFUE9QX0ZVTl9DVFJMXzEsCisJCQlSVDU2MzFfUE9XX09OX1NPRlRfR0VOIHwgUlQ1NjMxX0VOX01VVEVfVU5NVVRFX0RFUE9QIHwKKwkJCVJUNTYzMV9FTl9IUF9SX01fVU5fTVVURV9ERVBPUCB8CisJCQlSVDU2MzFfRU5fSFBfTF9NX1VOX01VVEVfREVQT1ApOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9IUF9PVVRfVk9MLAorCQkJCVJUNTYzMV9MX01VVEUgfCBSVDU2MzFfUl9NVVRFLCAwKTsKKwkJbXNsZWVwKDE2MCk7CisJfSBlbHNlIHsKKwkJLyogY29uZmlnIGRlcG9wIHNlcXVlbmNlIHBhcmFtZXRlciAqLworCQlydDU2MzFfd3JpdGVfaW5kZXgoY29kZWMsIFJUNTYzMV9TUEtfSU5UTF9DVFJMLCAweDMwMmYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMSwKKwkJCVJUNTYzMV9QT1dfT05fU09GVF9HRU4gfCBSVDU2MzFfRU5fTVVURV9VTk1VVEVfREVQT1AgfAorCQkJUlQ1NjMxX0VOX0hQX1JfTV9VTl9NVVRFX0RFUE9QIHwKKwkJCVJUNTYzMV9FTl9IUF9MX01fVU5fTVVURV9ERVBPUCk7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX0hQX09VVF9WT0wsCisJCQlSVDU2MzFfTF9NVVRFIHwgUlQ1NjMxX1JfTVVURSwKKwkJCVJUNTYzMV9MX01VVEUgfCBSVDU2MzFfUl9NVVRFKTsKKwkJbXNsZWVwKDE1MCk7CisJfQorCisJLyogcmVjb3ZlciBzb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zc2luZyBzZXR0aW5nICovCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwsIHNvZnRfdm9sKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjKTsKK30KKworc3RhdGljIGludCBocF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCBydDU2MzFfcHJpdiAqcnQ1NjMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJaWYgKHJ0NTYzMS0+Y29kZWNfdmVyc2lvbikgeworCQkJb25lYml0X2RlcG9wX211dGVfc3RhZ2UoY29kZWMsIDApOworCQkJb25lYml0X2RlcG9wX3Bvd2VyX3N0YWdlKGNvZGVjLCAwKTsKKwkJfSBlbHNlIHsKKwkJCWRlcG9wX3NlcV9tdXRlX3N0YWdlKGNvZGVjLCAwKTsKKwkJCWRlcG9wX3NlcV9wb3dlcl9zdGFnZShjb2RlYywgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJaWYgKHJ0NTYzMS0+Y29kZWNfdmVyc2lvbikgeworCQkJb25lYml0X2RlcG9wX3Bvd2VyX3N0YWdlKGNvZGVjLCAxKTsKKwkJCW9uZWJpdF9kZXBvcF9tdXRlX3N0YWdlKGNvZGVjLCAxKTsKKwkJfSBlbHNlIHsKKwkJCWRlcG9wX3NlcV9wb3dlcl9zdGFnZShjb2RlYywgMSk7CisJCQlkZXBvcF9zZXFfbXV0ZV9zdGFnZShjb2RlYywgMSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfZG1pY19wYXJhbXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjMxX3ByaXYgKnJ0NTYzMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChydDU2MzEtPnJ4X3JhdGUpIHsKKwljYXNlIDQ0MTAwOgorCWNhc2UgNDgwMDA6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9ESUdfTUlDX0NUUkwsCisJCQlSVDU2MzFfRE1JQ19DTEtfQ1RSTF9NQVNLLAorCQkJUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfVE9fMzJGUyk7CisJCWJyZWFrOworCisJY2FzZSAzMjAwMDoKKwljYXNlIDIyMDUwOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfRElHX01JQ19DVFJMLAorCQkJUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfTUFTSywKKwkJCVJUNTYzMV9ETUlDX0NMS19DVFJMX1RPXzY0RlMpOworCQlicmVhazsKKworCWNhc2UgMTYwMDA6CisJY2FzZSAxMTAyNToKKwljYXNlIDgwMDA6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9ESUdfTUlDX0NUUkwsCisJCQlSVDU2MzFfRE1JQ19DTEtfQ1RSTF9NQVNLLAorCQkJUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfVE9fMTI4RlMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3JlY21peGxfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk9VVE1JWEwgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfQURDX1JFQ19NSVhFUiwKKwkJCVJUNTYzMV9NX09VVE1JWExfUkVDTUlYTF9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMV9CU1QxIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjMxX0FEQ19SRUNfTUlYRVIsCisJCQlSVDU2MzFfTV9NSUMxX1JFQ01JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFYSUxWT0wgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfQURDX1JFQ19NSVhFUiwKKwkJCVJUNTYzMV9NX0FYSUxfUkVDTUlYTF9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTU9OT0lOX1JYIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjMxX0FEQ19SRUNfTUlYRVIsCisJCQlSVDU2MzFfTV9NT05PX0lOX1JFQ01JWExfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfcmVjbWl4cl9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTU9OT0lOX1JYIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjMxX0FEQ19SRUNfTUlYRVIsCisJCQlSVDU2MzFfTV9NT05PX0lOX1JFQ01JWFJfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFYSVJWT0wgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfQURDX1JFQ19NSVhFUiwKKwkJCVJUNTYzMV9NX0FYSVJfUkVDTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMl9CU1QyIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjMxX0FEQ19SRUNfTUlYRVIsCisJCQlSVDU2MzFfTV9NSUMyX1JFQ01JWFJfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVE1JWFIgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfQURDX1JFQ19NSVhFUiwKKwkJCVJUNTYzMV9NX09VVE1JWFJfUkVDTUlYUl9CSVQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zcGttaXhsX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX1JFQ01JWExfU1BLTUlYTF9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMV9QIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX01JQzFQX1NQS01JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ0wgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX1NQS19NSVhFUl9DVFJMLAorCQkJUlQ1NjMxX01fREFDTF9TUEtNSVhMX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRNSVhMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX09VVE1JWExfU1BLTUlYTF9CSVQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zcGttaXhyX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJPVVRNSVhSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX09VVE1JWFJfU1BLTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDUiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01JWEVSX0NUUkwsCisJCQlSVDU2MzFfTV9EQUNSX1NQS01JWFJfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzJfUCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01JWEVSX0NUUkwsCisJCQlSVDU2MzFfTV9NSUMyUF9TUEtNSVhSX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX1JFQ01JWFJfU1BLTUlYUl9CSVQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9vdXRtaXhsX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9MX0NUUkwsCisJCQkJUlQ1NjMxX01fUkVDTUlYTF9PVVRNSVhMX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9MX0NUUkwsCisJCQkJUlQ1NjMxX01fUkVDTUlYUl9PVVRNSVhMX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9MX0NUUkwsCisJCQkJUlQ1NjMxX01fREFDTF9PVVRNSVhMX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJNSUMxX0JTVDEgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTCwKKwkJCQlSVDU2MzFfTV9NSUMxX09VVE1JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzJfQlNUMiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfTF9DVFJMLAorCQkJCVJUNTYzMV9NX01JQzJfT1VUTUlYTF9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTU9OT0lOX1JYUCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfTF9DVFJMLAorCQkJCVJUNTYzMV9NX01PTk9fSU5QX09VVE1JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFYSUxWT0wgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTCwKKwkJCQlSVDU2MzFfTV9BWElMX09VVE1JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFYSVJWT0wgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTCwKKwkJCQlSVDU2MzFfTV9BWElSX09VVE1JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIlZEQUMgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTCwKKwkJCQlSVDU2MzFfTV9WREFDX09VVE1JWExfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfb3V0bWl4cl9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiVkRBQyBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX1ZEQUNfT1VUTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQVhJUlZPTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX0FYSVJfT1VUTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQVhJTFZPTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX0FYSUxfT1VUTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTU9OT0lOX1JYTiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX01PTk9fSU5OX09VVE1JWFJfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzJfQlNUMiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX01JQzJfT1VUTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMV9CU1QxIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwsCisJCQkJUlQ1NjMxX01fTUlDMV9PVVRNSVhSX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwsCisJCQkJUlQ1NjMxX01fREFDUl9PVVRNSVhSX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwsCisJCQkJUlQ1NjMxX01fUkVDTUlYUl9PVVRNSVhSX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwsCisJCQkJUlQ1NjMxX01fUkVDTUlYTF9PVVRNSVhSX0JJVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX0FYTzFNSVhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzFfQlNUMSBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfQVhPMU1JWEVSX0NUUkwsCisJCQkJUlQ1NjMxX01fTUlDMV9BWE8xTUlYX0JJVCAsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMl9CU1QyIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9BWE8xTUlYRVJfQ1RSTCwKKwkJCQlSVDU2MzFfTV9NSUMyX0FYTzFNSVhfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVFZPTEwgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX0FYTzFNSVhFUl9DVFJMLAorCQkJCVJUNTYzMV9NX09VVE1JWExfQVhPMU1JWF9CSVQgLCAxICwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRWT0xSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9BWE8xTUlYRVJfQ1RSTCwKKwkJCQlSVDU2MzFfTV9PVVRNSVhSX0FYTzFNSVhfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfQVhPMk1JWF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTUlDMV9CU1QxIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9BWE8yTUlYRVJfQ1RSTCwKKwkJCQlSVDU2MzFfTV9NSUMxX0FYTzJNSVhfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzJfQlNUMiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfQVhPMk1JWEVSX0NUUkwsCisJCQkJUlQ1NjMxX01fTUlDMl9BWE8yTUlYX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRWT0xMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9BWE8yTUlYRVJfQ1RSTCwKKwkJCQlSVDU2MzFfTV9PVVRNSVhMX0FYTzJNSVhfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVFZPTFIgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX0FYTzJNSVhFUl9DVFJMLAorCQkJCVJUNTYzMV9NX09VVE1JWFJfQVhPMk1JWF9CSVQsIDEgLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3BvbG1peF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiU1BLVk9MTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01PTk9fT1VUX0NUUkwsCisJCQkJUlQ1NjMxX01fU1BLVk9MTF9TUE9MTUlYX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJTUEtWT0xSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTU9OT19PVVRfQ1RSTCwKKwkJCQlSVDU2MzFfTV9TUEtWT0xSX1NQT0xNSVhfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3Bvcm1peF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiU1BLVk9MTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01PTk9fT1VUX0NUUkwsCisJCQkJUlQ1NjMxX01fU1BLVk9MTF9TUE9STUlYX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJTUEtWT0xSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTU9OT19PVVRfQ1RSTCwKKwkJCQlSVDU2MzFfTV9TUEtWT0xSX1NQT1JNSVhfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfbW9ub21peF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiT1VUVk9MTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01PTk9fT1VUX0NUUkwsCisJCQkJUlQ1NjMxX01fT1VUVk9MTF9NT05PTUlYX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRWT0xSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTU9OT19PVVRfQ1RSTCwKKwkJCQlSVDU2MzFfTV9PVVRWT0xSX01PTk9NSVhfQklULCAxLCAxKSwKK307CisKKy8qIExlZnQgU1BLIFZvbHVtZSBJbnB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xsX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWEwifTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAorCXJ0NTYzMV9zcGt2b2xsX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKKwlSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbGxfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zcGt2b2xsX211eF9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJMZWZ0IFNQS1ZPTCBTUkMiLCBydDU2MzFfc3Brdm9sbF9lbnVtKTsKKworLyogTGVmdCBIUCBWb2x1bWUgSW5wdXQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfaHB2b2xsX3NlbFtdID0geyJWbWlkIiwgIk9VVE1JWEwifTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAorCXJ0NTYzMV9ocHZvbGxfZW51bSwgUlQ1NjMxX0hQX09VVF9WT0wsCisJUlQ1NjMxX0xfRU5fU0hJRlQsIHJ0NTYzMV9ocHZvbGxfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9ocHZvbGxfbXV4X2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIkxlZnQgSFBWT0wgU1JDIiwgcnQ1NjMxX2hwdm9sbF9lbnVtKTsKKworLyogTGVmdCBPdXQgVm9sdW1lIElucHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX291dHZvbGxfc2VsW10gPSB7IlZtaWQiLCAiT1VUTUlYTCJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX291dHZvbGxfZW51bSwgUlQ1NjMxX01PTk9fQVhPXzFfMl9WT0wsCisJUlQ1NjMxX0xfRU5fU0hJRlQsIHJ0NTYzMV9vdXR2b2xsX3NlbCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfb3V0dm9sbF9tdXhfY29udHJvbCA9CisJU09DX0RBUE1fRU5VTSgiTGVmdCBPVVRWT0wgU1JDIiwgcnQ1NjMxX291dHZvbGxfZW51bSk7CisKKy8qIFJpZ2h0IE91dCBWb2x1bWUgSW5wdXQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfb3V0dm9scl9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhSIn07CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKKwlydDU2MzFfb3V0dm9scl9lbnVtLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKKwlSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX291dHZvbHJfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9vdXR2b2xyX211eF9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJSaWdodCBPVVRWT0wgU1JDIiwgcnQ1NjMxX291dHZvbHJfZW51bSk7CisKKy8qIFJpZ2h0IEhQIFZvbHVtZSBJbnB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9ocHZvbHJfc2VsW10gPSB7IlZtaWQiLCAiT1VUTUlYUiJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX2hwdm9scl9lbnVtLCBSVDU2MzFfSFBfT1VUX1ZPTCwKKwlSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX2hwdm9scl9zZWwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwdm9scl9tdXhfY29udHJvbCA9CisJU09DX0RBUE1fRU5VTSgiUmlnaHQgSFBWT0wgU1JDIiwgcnQ1NjMxX2hwdm9scl9lbnVtKTsKKworLyogUmlnaHQgU1BLIFZvbHVtZSBJbnB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xyX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWFIifTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAorCXJ0NTYzMV9zcGt2b2xyX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKKwlSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbHJfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zcGt2b2xyX211eF9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJSaWdodCBTUEtWT0wgU1JDIiwgcnQ1NjMxX3Nwa3ZvbHJfZW51bSk7CisKKy8qIFNQTyBMZWZ0IENoYW5uZWwgSW5wdXQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfc3BvbF9zcmNfc2VsW10gPSB7CisJIlNQT0xNSVgiLCAiTU9OT0lOX1JYIiwgIlZEQUMiLCAiREFDTCJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX3Nwb2xfc3JjX2VudW0sIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTCwKKwlSVDU2MzFfU1BLX0xfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX3Nwb2xfc3JjX3NlbCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3BvbF9tdXhfY29udHJvbCA9CisJU09DX0RBUE1fRU5VTSgiU1BPTCBTUkMiLCBydDU2MzFfc3BvbF9zcmNfZW51bSk7CisKKy8qIFNQTyBSaWdodCBDaGFubmVsIElucHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX3Nwb3Jfc3JjX3NlbFtdID0geworCSJTUE9STUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIiwgIkRBQ1IifTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAorCXJ0NTYzMV9zcG9yX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJUlQ1NjMxX1NQS19SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9yX3NyY19zZWwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3Nwb3JfbXV4X2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIlNQT1IgU1JDIiwgcnQ1NjMxX3Nwb3Jfc3JjX2VudW0pOworCisvKiBNT05PIElucHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX21vbm9fc3JjX3NlbFtdID0geyJNT05PTUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIn07CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKKwlydDU2MzFfbW9ub19zcmNfZW51bSwgUlQ1NjMxX1NQS19NT05PX0hQX09VVF9DVFJMLAorCVJUNTYzMV9NT05PX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9tb25vX3NyY19zZWwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX21vbm9fbXV4X2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIk1PTk8gU1JDIiwgcnQ1NjMxX21vbm9fc3JjX2VudW0pOworCisvKiBMZWZ0IEhQTyBJbnB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9ocGxfc3JjX3NlbFtdID0geyJMZWZ0IEhQVk9MIiwgIkxlZnQgREFDIn07CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKKwlydDU2MzFfaHBsX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJUlQ1NjMxX0hQX0xfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX2hwbF9zcmNfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9ocGxfbXV4X2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIkhQTCBTUkMiLCBydDU2MzFfaHBsX3NyY19lbnVtKTsKKworLyogUmlnaHQgSFBPIElucHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwcl9zcmNfc2VsW10gPSB7IlJpZ2h0IEhQVk9MIiwgIlJpZ2h0IERBQyJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX2hwcl9zcmNfZW51bSwgUlQ1NjMxX1NQS19NT05PX0hQX09VVF9DVFJMLAorCVJUNTYzMV9IUF9SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9ocHJfc3JjX3NlbCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfaHByX211eF9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJIUFIgU1JDIiwgcnQ1NjMxX2hwcl9zcmNfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBydDU2MzFfZGFwbV93aWRnZXRzW10gPSB7CisJLyogVm1pZCAqLworCVNORF9TT0NfREFQTV9WTUlEKCJWbWlkIiksCisJLyogUExMMSAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIlBMTDEiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX1BMTDFfQklULCAwLCBOVUxMLCAwKSwKKworCS8qIElucHV0IFNpZGUgKi8KKwkvKiBJbnB1dCBMaW5lcyAqLworCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMSIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQVhJTCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQVhJUiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTU9OT0lOX1JYTiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTU9OT0lOX1JYUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiRE1JQyIpLAorCisJLyogTUlDQklBUyAqLworCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUMgQmlhczEiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX01JQ0JJQVMxX1ZPTF9CSVQsIDApLAorCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUMgQmlhczIiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX01JQ0JJQVMyX1ZPTF9CSVQsIDApLAorCisJLyogQm9vc3QgKi8KKwlTTkRfU09DX0RBUE1fUEdBKCJNSUMxIEJvb3N0IiwgUlQ1NjMxX1BXUl9NQU5BR19BREQyLAorCQkJUlQ1NjMxX1BXUl9NSUMxX0JPT1RfR0FJTl9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk1JQzIgQm9vc3QiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX01JQzJfQk9PVF9HQUlOX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTU9OT0lOX1JYUCBCb29zdCIsIFJUNTYzMV9QV1JfTUFOQUdfQURENCwKKwkJCVJUNTYzMV9QV1JfTU9OT19JTl9QX1ZPTF9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk1PTk9JTl9SWE4gQm9vc3QiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX01PTk9fSU5fTl9WT0xfQklULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJBWElMIEJvb3N0IiwgUlQ1NjMxX1BXUl9NQU5BR19BREQ0LAorCQkJUlQ1NjMxX1BXUl9BWElMX0lOX1ZPTF9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkFYSVIgQm9vc3QiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX0FYSVJfSU5fVk9MX0JJVCwgMCwgTlVMTCwgMCksCisKKwkvKiBNT05PIEluICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJNT05PX0lOIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKworCS8qIFJFQyBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiUkVDTUlYTCBNaXhlciIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMiwKKwkJUlQ1NjMxX1BXUl9SRUNNSVhFUl9MX0JJVCwgMCwKKwkJJnJ0NTYzMV9yZWNtaXhsX21peGVyX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKHJ0NTYzMV9yZWNtaXhsX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSRUNNSVhSIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQyLAorCQlSVDU2MzFfUFdSX1JFQ01JWEVSX1JfQklULCAwLAorCQkmcnQ1NjMxX3JlY21peHJfbWl4ZXJfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUocnQ1NjMxX3JlY21peHJfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBCZWNhdXNlIG9mIHJlY29yZCBkdXBsaWNhdGlvbiBmb3IgTC9SIGNoYW5uZWwsCisJICogTC9SIEFEQ3MgbmVlZCBwb3dlciB1cCBhdCB0aGUgc2FtZSB0aW1lICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJBREMgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJLyogRE1JQyAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkRNSUMgU3VwcGx5IiwgUlQ1NjMxX0RJR19NSUNfQ1RSTCwKKwkJUlQ1NjMxX0RNSUNfRU5BX1NISUZULCAwLAorCQlzZXRfZG1pY19wYXJhbXMsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKKwkvKiBBREMgRGF0YSBTcm91Y2UgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJMZWZ0IEFEQyBTZWxlY3QiLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsCisJCQlSVDU2MzFfQURDX0RBVEFfU0VMX01JQzFfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlJpZ2h0IEFEQyBTZWxlY3QiLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsCisJCQlSVDU2MzFfQURDX0RBVEFfU0VMX01JQzJfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogQURDcyAqLworCVNORF9TT0NfREFQTV9BREMoIkxlZnQgQURDIiwgIkhJRkkgQ2FwdHVyZSIsCisJCVJUNTYzMV9QV1JfTUFOQUdfQUREMSwgUlQ1NjMxX1BXUl9BRENfTF9DTEtfQklULCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJSaWdodCBBREMiLCAiSElGSSBDYXB0dXJlIiwKKwkJUlQ1NjMxX1BXUl9NQU5BR19BREQxLCBSVDU2MzFfUFdSX0FEQ19SX0NMS19CSVQsIDApLAorCisJLyogREFDIGFuZCBBREMgc3VwcGx5IHBvd2VyICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiSTJTIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQxLAorCQkJUlQ1NjMxX1BXUl9NQUlOX0kyU19CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkRBQyBSRUYiLCBSVDU2MzFfUFdSX01BTkFHX0FERDEsCisJCQlSVDU2MzFfUFdSX0RBQ19SRUZfQklULCAwLCBOVUxMLCAwKSwKKworCS8qIE91dHB1dCBTaWRlICovCisJLyogREFDcyAqLworCVNORF9TT0NfREFQTV9EQUMoIkxlZnQgREFDIiwgIkhJRkkgUGxheWJhY2siLAorCQlSVDU2MzFfUFdSX01BTkFHX0FERDEsIFJUNTYzMV9QV1JfREFDX0xfQ0xLX0JJVCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiUmlnaHQgREFDIiwgIkhJRkkgUGxheWJhY2siLAorCQlSVDU2MzFfUFdSX01BTkFHX0FERDEsIFJUNTYzMV9QV1JfREFDX1JfQ0xLX0JJVCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiVm9pY2UgREFDIiwgIlZvaWNlIERBQyBNb25vIFBsYXliYWNrIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlZvaWNlIERBQyBCb29zdCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJLyogREFDIHN1cHBseSBwb3dlciAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkxlZnQgREFDIFRvIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQxLAorCQkJUlQ1NjMxX1BXUl9EQUNfTF9UT19NSVhFUl9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlJpZ2h0IERBQyBUbyBNaXhlciIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMSwKKwkJCVJUNTYzMV9QV1JfREFDX1JfVE9fTUlYRVJfQklULCAwLCBOVUxMLCAwKSwKKworCS8qIExlZnQgU1BLIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJTUEtNSVhMIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQyLAorCQkJUlQ1NjMxX1BXUl9TUEtNSVhFUl9MX0JJVCwgMCwKKwkJCSZydDU2MzFfc3BrbWl4bF9taXhlcl9jb250cm9sc1swXSwKKwkJCUFSUkFZX1NJWkUocnQ1NjMxX3Nwa21peGxfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBMZWZ0IE91dCBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiT1VUTUlYTCBNaXhlciIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMiwKKwkJCVJUNTYzMV9QV1JfT1VUTUlYRVJfTF9CSVQsIDAsCisJCQkmcnQ1NjMxX291dG1peGxfbWl4ZXJfY29udHJvbHNbMF0sCisJCQlBUlJBWV9TSVpFKHJ0NTYzMV9vdXRtaXhsX21peGVyX2NvbnRyb2xzKSksCisJLyogUmlnaHQgT3V0IE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJPVVRNSVhSIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQyLAorCQkJUlQ1NjMxX1BXUl9PVVRNSVhFUl9SX0JJVCwgMCwKKwkJCSZydDU2MzFfb3V0bWl4cl9taXhlcl9jb250cm9sc1swXSwKKwkJCUFSUkFZX1NJWkUocnQ1NjMxX291dG1peHJfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBSaWdodCBTUEsgTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNQS01JWFIgTWl4ZXIiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX1NQS01JWEVSX1JfQklULCAwLAorCQkJJnJ0NTYzMV9zcGttaXhyX21peGVyX2NvbnRyb2xzWzBdLAorCQkJQVJSQVlfU0laRShydDU2MzFfc3BrbWl4cl9taXhlcl9jb250cm9scykpLAorCisJLyogVm9sdW1lIE11eCAqLworCVNORF9TT0NfREFQTV9NVVgoIkxlZnQgU1BLVk9MIE11eCIsIFJUNTYzMV9QV1JfTUFOQUdfQURENCwKKwkJCVJUNTYzMV9QV1JfU1BLX0xfVk9MX0JJVCwgMCwKKwkJCSZydDU2MzFfc3Brdm9sbF9tdXhfY29udHJvbCksCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBIUFZPTCBNdXgiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX0hQX0xfT1VUX1ZPTF9CSVQsIDAsCisJCQkmcnQ1NjMxX2hwdm9sbF9tdXhfY29udHJvbCksCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBPVVRWT0wgTXV4IiwgUlQ1NjMxX1BXUl9NQU5BR19BREQ0LAorCQkJUlQ1NjMxX1BXUl9MT1VUX1ZPTF9CSVQsIDAsCisJCQkmcnQ1NjMxX291dHZvbGxfbXV4X2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IE9VVFZPTCBNdXgiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX1JPVVRfVk9MX0JJVCwgMCwKKwkJCSZydDU2MzFfb3V0dm9scl9tdXhfY29udHJvbCksCisJU05EX1NPQ19EQVBNX01VWCgiUmlnaHQgSFBWT0wgTXV4IiwgUlQ1NjMxX1BXUl9NQU5BR19BREQ0LAorCQkJUlQ1NjMxX1BXUl9IUF9SX09VVF9WT0xfQklULCAwLAorCQkJJnJ0NTYzMV9ocHZvbHJfbXV4X2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IFNQS1ZPTCBNdXgiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX1NQS19SX1ZPTF9CSVQsIDAsCisJCQkmcnQ1NjMxX3Nwa3ZvbHJfbXV4X2NvbnRyb2wpLAorCisJLyogREFDIFRvIEhQICovCisJU05EX1NPQ19EQVBNX1BHQV9TKCJMZWZ0IERBQ19IUCIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQV9TKCJSaWdodCBEQUNfSFAiLCAwLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJLyogSFAgRGVwb3AgKi8KKwlTTkRfU09DX0RBUE1fUEdBX1MoIkhQIERlcG9wIiwgMSwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlocF9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCisJLyogQVhPMSBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiQVhPMU1JWCBNaXhlciIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMywKKwkJCVJUNTYzMV9QV1JfQVhPMU1JWEVSX0JJVCwgMCwKKwkJCSZydDU2MzFfQVhPMU1JWF9taXhlcl9jb250cm9sc1swXSwKKwkJCUFSUkFZX1NJWkUocnQ1NjMxX0FYTzFNSVhfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBTUE9MIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJTUE9MTUlYIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnJ0NTYzMV9zcG9sbWl4X21peGVyX2NvbnRyb2xzWzBdLAorCQkJQVJSQVlfU0laRShydDU2MzFfc3BvbG1peF9taXhlcl9jb250cm9scykpLAorCS8qIE1PTk8gTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIk1PTk9NSVggTWl4ZXIiLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCQlSVDU2MzFfUFdSX01PTk9NSVhFUl9CSVQsIDAsCisJCQkmcnQ1NjMxX21vbm9taXhfbWl4ZXJfY29udHJvbHNbMF0sCisJCQlBUlJBWV9TSVpFKHJ0NTYzMV9tb25vbWl4X21peGVyX2NvbnRyb2xzKSksCisJLyogU1BPUiBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiU1BPUk1JWCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZydDU2MzFfc3Bvcm1peF9taXhlcl9jb250cm9sc1swXSwKKwkJCUFSUkFZX1NJWkUocnQ1NjMxX3Nwb3JtaXhfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBBWE8yIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJBWE8yTUlYIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQzLAorCQkJUlQ1NjMxX1BXUl9BWE8yTUlYRVJfQklULCAwLAorCQkJJnJ0NTYzMV9BWE8yTUlYX21peGVyX2NvbnRyb2xzWzBdLAorCQkJQVJSQVlfU0laRShydDU2MzFfQVhPMk1JWF9taXhlcl9jb250cm9scykpLAorCisJLyogTXV4ICovCisJU05EX1NPQ19EQVBNX01VWCgiU1BPTCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmcnQ1NjMxX3Nwb2xfbXV4X2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIlNQT1IgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnJ0NTYzMV9zcG9yX211eF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJNT05PIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZydDU2MzFfbW9ub19tdXhfY29udHJvbCksCisJU05EX1NPQ19EQVBNX01VWCgiSFBMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZydDU2MzFfaHBsX211eF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJIUFIgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnJ0NTYzMV9ocHJfbXV4X2NvbnRyb2wpLAorCisJLyogQU1QIHN1cHBseSAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1PTk8gRGVwb3AiLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCQlSVDU2MzFfUFdSX01PTk9fREVQT1BfRElTX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQ2xhc3MgRCIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMSwKKwkJCVJUNTYzMV9QV1JfQ0xBU1NfRF9CSVQsIDAsIE5VTEwsIDApLAorCisJLyogT3V0cHV0IExpbmVzICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQVVYTzEiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJBVVhPMiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQT0wiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUE9SIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBPTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT1IiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJNT05PIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBydDU2MzFfZGFwbV9yb3V0ZXNbXSA9IHsKKwl7Ik1JQzEgQm9vc3QiLCBOVUxMLCAiTUlDMSJ9LAorCXsiTUlDMiBCb29zdCIsIE5VTEwsICJNSUMyIn0sCisJeyJNT05PSU5fUlhQIEJvb3N0IiwgTlVMTCwgIk1PTk9JTl9SWFAifSwKKwl7Ik1PTk9JTl9SWE4gQm9vc3QiLCBOVUxMLCAiTU9OT0lOX1JYTiJ9LAorCXsiQVhJTCBCb29zdCIsIE5VTEwsICJBWElMIn0sCisJeyJBWElSIEJvb3N0IiwgTlVMTCwgIkFYSVIifSwKKworCXsiTU9OT19JTiIsIE5VTEwsICJNT05PSU5fUlhQIEJvb3N0In0sCisJeyJNT05PX0lOIiwgTlVMTCwgIk1PTk9JTl9SWE4gQm9vc3QifSwKKworCXsiUkVDTUlYTCBNaXhlciIsICJPVVRNSVhMIENhcHR1cmUgU3dpdGNoIiwgIk9VVE1JWEwgTWl4ZXIifSwKKwl7IlJFQ01JWEwgTWl4ZXIiLCAiTUlDMV9CU1QxIENhcHR1cmUgU3dpdGNoIiwgIk1JQzEgQm9vc3QifSwKKwl7IlJFQ01JWEwgTWl4ZXIiLCAiQVhJTFZPTCBDYXB0dXJlIFN3aXRjaCIsICJBWElMIEJvb3N0In0sCisJeyJSRUNNSVhMIE1peGVyIiwgIk1PTk9JTl9SWCBDYXB0dXJlIFN3aXRjaCIsICJNT05PX0lOIn0sCisKKwl7IlJFQ01JWFIgTWl4ZXIiLCAiT1VUTUlYUiBDYXB0dXJlIFN3aXRjaCIsICJPVVRNSVhSIE1peGVyIn0sCisJeyJSRUNNSVhSIE1peGVyIiwgIk1JQzJfQlNUMiBDYXB0dXJlIFN3aXRjaCIsICJNSUMyIEJvb3N0In0sCisJeyJSRUNNSVhSIE1peGVyIiwgIkFYSVJWT0wgQ2FwdHVyZSBTd2l0Y2giLCAiQVhJUiBCb29zdCJ9LAorCXsiUkVDTUlYUiBNaXhlciIsICJNT05PSU5fUlggQ2FwdHVyZSBTd2l0Y2giLCAiTU9OT19JTiJ9LAorCisJeyJBREMgTWl4ZXIiLCBOVUxMLCAiUkVDTUlYTCBNaXhlciJ9LAorCXsiQURDIE1peGVyIiwgTlVMTCwgIlJFQ01JWFIgTWl4ZXIifSwKKworCXsiTGVmdCBBREMiLCBOVUxMLCAiQURDIE1peGVyIn0sCisJeyJMZWZ0IEFEQyIsIE5VTEwsICJMZWZ0IEFEQyBTZWxlY3QiLCBjaGVja19hZGNsX3NlbGVjdH0sCisJeyJMZWZ0IEFEQyIsIE5VTEwsICJQTEwxIiwgY2hlY2tfc3lzY2xrMV9zb3VyY2V9LAorCXsiTGVmdCBBREMiLCBOVUxMLCAiSTJTIn0sCisJeyJMZWZ0IEFEQyIsIE5VTEwsICJEQUMgUkVGIn0sCisKKwl7IlJpZ2h0IEFEQyIsIE5VTEwsICJBREMgTWl4ZXIifSwKKwl7IlJpZ2h0IEFEQyIsIE5VTEwsICJSaWdodCBBREMgU2VsZWN0IiwgY2hlY2tfYWRjcl9zZWxlY3R9LAorCXsiUmlnaHQgQURDIiwgTlVMTCwgIlBMTDEiLCBjaGVja19zeXNjbGsxX3NvdXJjZX0sCisJeyJSaWdodCBBREMiLCBOVUxMLCAiSTJTIn0sCisJeyJSaWdodCBBREMiLCBOVUxMLCAiREFDIFJFRiJ9LAorCisJeyJETUlDIiwgTlVMTCwgIkRNSUMgU3VwcGx5IiwgY2hlY2tfZG1pY191c2VkfSwKKwl7IkxlZnQgQURDIiwgTlVMTCwgIkRNSUMifSwKKwl7IlJpZ2h0IEFEQyIsIE5VTEwsICJETUlDIn0sCisKKwl7IkxlZnQgREFDIiwgTlVMTCwgIlBMTDEiLCBjaGVja19zeXNjbGsxX3NvdXJjZX0sCisJeyJMZWZ0IERBQyIsIE5VTEwsICJJMlMifSwKKwl7IkxlZnQgREFDIiwgTlVMTCwgIkRBQyBSRUYifSwKKwl7IlJpZ2h0IERBQyIsIE5VTEwsICJQTEwxIiwgY2hlY2tfc3lzY2xrMV9zb3VyY2V9LAorCXsiUmlnaHQgREFDIiwgTlVMTCwgIkkyUyJ9LAorCXsiUmlnaHQgREFDIiwgTlVMTCwgIkRBQyBSRUYifSwKKworCXsiVm9pY2UgREFDIEJvb3N0IiwgTlVMTCwgIlZvaWNlIERBQyJ9LAorCisJeyJTUEtNSVhMIE1peGVyIiwgTlVMTCwgIkxlZnQgREFDIFRvIE1peGVyIiwgY2hlY2tfZGFjbF90b19zcGttaXhsfSwKKwl7IlNQS01JWEwgTWl4ZXIiLCAiUkVDTUlYTCBQbGF5YmFjayBTd2l0Y2giLCAiUkVDTUlYTCBNaXhlciJ9LAorCXsiU1BLTUlYTCBNaXhlciIsICJNSUMxX1AgUGxheWJhY2sgU3dpdGNoIiwgIk1JQzEifSwKKwl7IlNQS01JWEwgTWl4ZXIiLCAiREFDTCBQbGF5YmFjayBTd2l0Y2giLCAiTGVmdCBEQUMifSwKKwl7IlNQS01JWEwgTWl4ZXIiLCAiT1VUTUlYTCBQbGF5YmFjayBTd2l0Y2giLCAiT1VUTUlYTCBNaXhlciJ9LAorCisJeyJTUEtNSVhSIE1peGVyIiwgTlVMTCwgIlJpZ2h0IERBQyBUbyBNaXhlciIsIGNoZWNrX2RhY3JfdG9fc3BrbWl4cn0sCisJeyJTUEtNSVhSIE1peGVyIiwgIk9VVE1JWFIgUGxheWJhY2sgU3dpdGNoIiwgIk9VVE1JWFIgTWl4ZXIifSwKKwl7IlNQS01JWFIgTWl4ZXIiLCAiREFDUiBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgREFDIn0sCisJeyJTUEtNSVhSIE1peGVyIiwgIk1JQzJfUCBQbGF5YmFjayBTd2l0Y2giLCAiTUlDMiJ9LAorCXsiU1BLTUlYUiBNaXhlciIsICJSRUNNSVhSIFBsYXliYWNrIFN3aXRjaCIsICJSRUNNSVhSIE1peGVyIn0sCisKKwl7Ik9VVE1JWEwgTWl4ZXIiLCBOVUxMLCAiTGVmdCBEQUMgVG8gTWl4ZXIiLCBjaGVja19kYWNsX3RvX291dG1peGx9LAorCXsiT1VUTUlYTCBNaXhlciIsICJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsICJSRUNNSVhMIE1peGVyIn0sCisJeyJPVVRNSVhMIE1peGVyIiwgIlJFQ01JWFIgUGxheWJhY2sgU3dpdGNoIiwgIlJFQ01JWFIgTWl4ZXIifSwKKwl7Ik9VVE1JWEwgTWl4ZXIiLCAiREFDTCBQbGF5YmFjayBTd2l0Y2giLCAiTGVmdCBEQUMifSwKKwl7Ik9VVE1JWEwgTWl4ZXIiLCAiTUlDMV9CU1QxIFBsYXliYWNrIFN3aXRjaCIsICJNSUMxIEJvb3N0In0sCisJeyJPVVRNSVhMIE1peGVyIiwgIk1JQzJfQlNUMiBQbGF5YmFjayBTd2l0Y2giLCAiTUlDMiBCb29zdCJ9LAorCXsiT1VUTUlYTCBNaXhlciIsICJNT05PSU5fUlhQIFBsYXliYWNrIFN3aXRjaCIsICJNT05PSU5fUlhQIEJvb3N0In0sCisJeyJPVVRNSVhMIE1peGVyIiwgIkFYSUxWT0wgUGxheWJhY2sgU3dpdGNoIiwgIkFYSUwgQm9vc3QifSwKKwl7Ik9VVE1JWEwgTWl4ZXIiLCAiQVhJUlZPTCBQbGF5YmFjayBTd2l0Y2giLCAiQVhJUiBCb29zdCJ9LAorCXsiT1VUTUlYTCBNaXhlciIsICJWREFDIFBsYXliYWNrIFN3aXRjaCIsICJWb2ljZSBEQUMgQm9vc3QifSwKKworCXsiT1VUTUlYUiBNaXhlciIsIE5VTEwsICJSaWdodCBEQUMgVG8gTWl4ZXIiLCBjaGVja19kYWNyX3RvX291dG1peHJ9LAorCXsiT1VUTUlYUiBNaXhlciIsICJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsICJSRUNNSVhMIE1peGVyIn0sCisJeyJPVVRNSVhSIE1peGVyIiwgIlJFQ01JWFIgUGxheWJhY2sgU3dpdGNoIiwgIlJFQ01JWFIgTWl4ZXIifSwKKwl7Ik9VVE1JWFIgTWl4ZXIiLCAiREFDUiBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgREFDIn0sCisJeyJPVVRNSVhSIE1peGVyIiwgIk1JQzFfQlNUMSBQbGF5YmFjayBTd2l0Y2giLCAiTUlDMSBCb29zdCJ9LAorCXsiT1VUTUlYUiBNaXhlciIsICJNSUMyX0JTVDIgUGxheWJhY2sgU3dpdGNoIiwgIk1JQzIgQm9vc3QifSwKKwl7Ik9VVE1JWFIgTWl4ZXIiLCAiTU9OT0lOX1JYTiBQbGF5YmFjayBTd2l0Y2giLCAiTU9OT0lOX1JYTiBCb29zdCJ9LAorCXsiT1VUTUlYUiBNaXhlciIsICJBWElMVk9MIFBsYXliYWNrIFN3aXRjaCIsICJBWElMIEJvb3N0In0sCisJeyJPVVRNSVhSIE1peGVyIiwgIkFYSVJWT0wgUGxheWJhY2sgU3dpdGNoIiwgIkFYSVIgQm9vc3QifSwKKwl7Ik9VVE1JWFIgTWl4ZXIiLCAiVkRBQyBQbGF5YmFjayBTd2l0Y2giLCAiVm9pY2UgREFDIEJvb3N0In0sCisKKwl7IkxlZnQgU1BLVk9MIE11eCIsICAiU1BLTUlYTCIsICJTUEtNSVhMIE1peGVyIn0sCisJeyJMZWZ0IFNQS1ZPTCBNdXgiLCAgIlZtaWQiLCAiVm1pZCJ9LAorCXsiTGVmdCBIUFZPTCBNdXgiLCAgIk9VVE1JWEwiLCAiT1VUTUlYTCBNaXhlciJ9LAorCXsiTGVmdCBIUFZPTCBNdXgiLCAgIlZtaWQiLCAiVm1pZCJ9LAorCXsiTGVmdCBPVVRWT0wgTXV4IiwgICJPVVRNSVhMIiwgIk9VVE1JWEwgTWl4ZXIifSwKKwl7IkxlZnQgT1VUVk9MIE11eCIsICAiVm1pZCIsICJWbWlkIn0sCisJeyJSaWdodCBPVVRWT0wgTXV4IiwgICJPVVRNSVhSIiwgIk9VVE1JWFIgTWl4ZXIifSwKKwl7IlJpZ2h0IE9VVFZPTCBNdXgiLCAgIlZtaWQiLCAiVm1pZCJ9LAorCXsiUmlnaHQgSFBWT0wgTXV4IiwgICJPVVRNSVhSIiwgIk9VVE1JWFIgTWl4ZXIifSwKKwl7IlJpZ2h0IEhQVk9MIE11eCIsICAiVm1pZCIsICJWbWlkIn0sCisJeyJSaWdodCBTUEtWT0wgTXV4IiwgICJTUEtNSVhSIiwgIlNQS01JWFIgTWl4ZXIifSwKKwl7IlJpZ2h0IFNQS1ZPTCBNdXgiLCAgIlZtaWQiLCAiVm1pZCJ9LAorCisJeyJBWE8xTUlYIE1peGVyIiwgIk1JQzFfQlNUMSBQbGF5YmFjayBTd2l0Y2giLCAiTUlDMSBCb29zdCJ9LAorCXsiQVhPMU1JWCBNaXhlciIsICJPVVRWT0xMIFBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IE9VVFZPTCBNdXgifSwKKwl7IkFYTzFNSVggTWl4ZXIiLCAiT1VUVk9MUiBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgT1VUVk9MIE11eCJ9LAorCXsiQVhPMU1JWCBNaXhlciIsICJNSUMyX0JTVDIgUGxheWJhY2sgU3dpdGNoIiwgIk1JQzIgQm9vc3QifSwKKworCXsiQVhPMk1JWCBNaXhlciIsICJNSUMxX0JTVDEgUGxheWJhY2sgU3dpdGNoIiwgIk1JQzEgQm9vc3QifSwKKwl7IkFYTzJNSVggTWl4ZXIiLCAiT1VUVk9MTCBQbGF5YmFjayBTd2l0Y2giLCAiTGVmdCBPVVRWT0wgTXV4In0sCisJeyJBWE8yTUlYIE1peGVyIiwgIk9VVFZPTFIgUGxheWJhY2sgU3dpdGNoIiwgIlJpZ2h0IE9VVFZPTCBNdXgifSwKKwl7IkFYTzJNSVggTWl4ZXIiLCAiTUlDMl9CU1QyIFBsYXliYWNrIFN3aXRjaCIsICJNSUMyIEJvb3N0In0sCisKKwl7IlNQT0xNSVggTWl4ZXIiLCAiU1BLVk9MTCBQbGF5YmFjayBTd2l0Y2giLCAiTGVmdCBTUEtWT0wgTXV4In0sCisJeyJTUE9MTUlYIE1peGVyIiwgIlNQS1ZPTFIgUGxheWJhY2sgU3dpdGNoIiwgIlJpZ2h0IFNQS1ZPTCBNdXgifSwKKworCXsiU1BPUk1JWCBNaXhlciIsICJTUEtWT0xMIFBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IFNQS1ZPTCBNdXgifSwKKwl7IlNQT1JNSVggTWl4ZXIiLCAiU1BLVk9MUiBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgU1BLVk9MIE11eCJ9LAorCisJeyJNT05PTUlYIE1peGVyIiwgIk9VVFZPTEwgUGxheWJhY2sgU3dpdGNoIiwgIkxlZnQgT1VUVk9MIE11eCJ9LAorCXsiTU9OT01JWCBNaXhlciIsICJPVVRWT0xSIFBsYXliYWNrIFN3aXRjaCIsICJSaWdodCBPVVRWT0wgTXV4In0sCisKKwl7IlNQT0wgTXV4IiwgIlNQT0xNSVgiLCAiU1BPTE1JWCBNaXhlciJ9LAorCXsiU1BPTCBNdXgiLCAiTU9OT0lOX1JYIiwgIk1PTk9fSU4ifSwKKwl7IlNQT0wgTXV4IiwgIlZEQUMiLCAiVm9pY2UgREFDIEJvb3N0In0sCisJeyJTUE9MIE11eCIsICJEQUNMIiwgIkxlZnQgREFDIn0sCisKKwl7IlNQT1IgTXV4IiwgIlNQT1JNSVgiLCAiU1BPUk1JWCBNaXhlciJ9LAorCXsiU1BPUiBNdXgiLCAiTU9OT0lOX1JYIiwgIk1PTk9fSU4ifSwKKwl7IlNQT1IgTXV4IiwgIlZEQUMiLCAiVm9pY2UgREFDIEJvb3N0In0sCisJeyJTUE9SIE11eCIsICJEQUNSIiwgIlJpZ2h0IERBQyJ9LAorCisJeyJNT05PIE11eCIsICJNT05PTUlYIiwgIk1PTk9NSVggTWl4ZXIifSwKKwl7Ik1PTk8gTXV4IiwgIk1PTk9JTl9SWCIsICJNT05PX0lOIn0sCisJeyJNT05PIE11eCIsICJWREFDIiwgIlZvaWNlIERBQyBCb29zdCJ9LAorCisJeyJSaWdodCBEQUNfSFAiLCBOVUxMLCAiUmlnaHQgREFDIn0sCisJeyJMZWZ0IERBQ19IUCIsIE5VTEwsICJMZWZ0IERBQyJ9LAorCisJeyJIUEwgTXV4IiwgIkxlZnQgSFBWT0wiLCAiTGVmdCBIUFZPTCBNdXgifSwKKwl7IkhQTCBNdXgiLCAiTGVmdCBEQUMiLCAiTGVmdCBEQUNfSFAifSwKKwl7IkhQUiBNdXgiLCAiUmlnaHQgSFBWT0wiLCAiUmlnaHQgSFBWT0wgTXV4In0sCisJeyJIUFIgTXV4IiwgIlJpZ2h0IERBQyIsICJSaWdodCBEQUNfSFAifSwKKworCXsiSFAgRGVwb3AiLCBOVUxMLCAiSFBMIE11eCJ9LAorCXsiSFAgRGVwb3AiLCBOVUxMLCAiSFBSIE11eCJ9LAorCisJeyJBVVhPMSIsIE5VTEwsICJBWE8xTUlYIE1peGVyIn0sCisJeyJBVVhPMiIsIE5VTEwsICJBWE8yTUlYIE1peGVyIn0sCisKKwl7IlNQT0wiLCBOVUxMLCAiQ2xhc3MgRCJ9LAorCXsiU1BPTCIsIE5VTEwsICJTUE9MIE11eCJ9LAorCXsiU1BPUiIsIE5VTEwsICJDbGFzcyBEIn0sCisJeyJTUE9SIiwgTlVMTCwgIlNQT1IgTXV4In0sCisKKwl7IkhQT0wiLCBOVUxMLCAiSFAgRGVwb3AifSwKKwl7IkhQT1IiLCBOVUxMLCAiSFAgRGVwb3AifSwKKworCXsiTU9OTyIsIE5VTEwsICJNT05PIERlcG9wIn0sCisJeyJNT05PIiwgTlVMTCwgIk1PTk8gTXV4In0sCit9OworCitzdHJ1Y3QgY29lZmZfY2xrX2RpdiB7CisJdTMyIG1jbGs7CisJdTMyIGJjbGs7CisJdTMyIHJhdGU7CisJdTE2IHJlZ192YWw7Cit9OworCisvKiBQTEwgZGl2aXNvcnMgKi8KK3N0cnVjdCBwbGxfZGl2IHsKKwl1MzIgcGxsX2luOworCXUzMiBwbGxfb3V0OworCXUxNiByZWdfdmFsOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGxfZGl2IGNvZGVjX21hc3Rlcl9wbGxfZGl2W10gPSB7CisJezIwNDgwMDAsICA4MTkyMDAwLCAgMHgwZWEwfSwKKwl7MzY4NjQwMCwgIDgxOTIwMDAsICAweDRlMjd9LAorCXsxMjAwMDAwMCwgIDgxOTIwMDAsICAweDQ1NmJ9LAorCXsxMzAwMDAwMCwgIDgxOTIwMDAsICAweDQ5NWZ9LAorCXsxMzEwMDAwMCwgIDgxOTIwMDAsICAweDAzMjB9LAorCXsyMDQ4MDAwLCAgMTEyODk2MDAsICAweGY2Mzd9LAorCXszNjg2NDAwLCAgMTEyODk2MDAsICAweDJmMjJ9LAorCXsxMjAwMDAwMCwgIDExMjg5NjAwLCAgMHgzZTJmfSwKKwl7MTMwMDAwMDAsICAxMTI4OTYwMCwgIDB4NGQ1Yn0sCisJezEzMTAwMDAwLCAgMTEyODk2MDAsICAweDM2M2J9LAorCXsyMDQ4MDAwLCAgMTYzODQwMDAsICAweDFlYTB9LAorCXszNjg2NDAwLCAgMTYzODQwMDAsICAweDllMjd9LAorCXsxMjAwMDAwMCwgIDE2Mzg0MDAwLCAgMHg0NTJifSwKKwl7MTMwMDAwMDAsICAxNjM4NDAwMCwgIDB4NTQyZn0sCisJezEzMTAwMDAwLCAgMTYzODQwMDAsICAweDAzYTB9LAorCXsyMDQ4MDAwLCAgMTY5MzQ0MDAsICAweGU2MjV9LAorCXszNjg2NDAwLCAgMTY5MzQ0MDAsICAweDkxMjZ9LAorCXsxMjAwMDAwMCwgIDE2OTM0NDAwLCAgMHg0ZDJjfSwKKwl7MTMwMDAwMDAsICAxNjkzNDQwMCwgIDB4NzQyZn0sCisJezEzMTAwMDAwLCAgMTY5MzQ0MDAsICAweDNjMjd9LAorCXsyMDQ4MDAwLCAgMjI1NzkyMDAsICAweDJhYTB9LAorCXszNjg2NDAwLCAgMjI1NzkyMDAsICAweDJmMjB9LAorCXsxMjAwMDAwMCwgIDIyNTc5MjAwLCAgMHg3ZTJmfSwKKwl7MTMwMDAwMDAsICAyMjU3OTIwMCwgIDB4NzQyZn0sCisJezEzMTAwMDAwLCAgMjI1NzkyMDAsICAweDNjMjd9LAorCXsyMDQ4MDAwLCAgMjQ1NzYwMDAsICAweDJlYTB9LAorCXszNjg2NDAwLCAgMjQ1NzYwMDAsICAweGVlMjd9LAorCXsxMjAwMDAwMCwgIDI0NTc2MDAwLCAgMHgyOTE1fSwKKwl7MTMwMDAwMDAsICAyNDU3NjAwMCwgIDB4NzcyZX0sCisJezEzMTAwMDAwLCAgMjQ1NzYwMDAsICAweDBkMjB9LAorCXsyNjAwMDAwMCwgIDI0NTc2MDAwLCAgMHgyMDI3fSwKKwl7MjYwMDAwMDAsICAyMjU3OTIwMCwgIDB4MzkyZn0sCisJezI0NTc2MDAwLCAgMjI1NzkyMDAsICAweDA5MjF9LAorCXsyNDU3NjAwMCwgIDI0NTc2MDAwLCAgMHgwMmEwfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxsX2RpdiBjb2RlY19zbGF2ZV9wbGxfZGl2W10gPSB7CisJezI1NjAwMCwgIDIwNDgwMDAsICAweDQ2ZjB9LAorCXsyNTYwMDAsICA0MDk2MDAwLCAgMHgzZWEwfSwKKwl7MzUyODAwLCAgNTY0NDgwMCwgIDB4M2VhMH0sCisJezUxMjAwMCwgIDgxOTIwMDAsICAweDNlYTB9LAorCXsxMDI0MDAwLCAgODE5MjAwMCwgIDB4NDZmMH0sCisJezcwNTYwMCwgIDExMjg5NjAwLCAgMHgzZWEwfSwKKwl7MTAyNDAwMCwgIDE2Mzg0MDAwLCAgMHgzZWEwfSwKKwl7MTQxMTIwMCwgIDIyNTc5MjAwLCAgMHgzZWEwfSwKKwl7MTUzNjAwMCwgIDI0NTc2MDAwLCAgMHgzZWEwfSwKKwl7MjA0ODAwMCwgIDE2Mzg0MDAwLCAgMHgxZWEwfSwKKwl7MjgyMjQwMCwgIDIyNTc5MjAwLCAgMHgxZWEwfSwKKwl7MjgyMjQwMCwgIDQ1MTU4NDAwLCAgMHg1ZWMwfSwKKwl7NTY0NDgwMCwgIDQ1MTU4NDAwLCAgMHg0NmYwfSwKKwl7MzA3MjAwMCwgIDI0NTc2MDAwLCAgMHgxZWEwfSwKKwl7MzA3MjAwMCwgIDQ5MTUyMDAwLCAgMHg1ZWMwfSwKKwl7NjE0NDAwMCwgIDQ5MTUyMDAwLCAgMHg0NmYwfSwKKwl7NzA1NjAwLCAgMTEyODk2MDAsICAweDNlYTB9LAorCXs3MDU2MDAsICA4NDY3MjAwLCAgMHgzYWIwfSwKKwl7MjQ1NzYwMDAsICAyNDU3NjAwMCwgIDB4MDJhMH0sCisJezE0MTEyMDAsICAxMTI4OTYwMCwgIDB4MTY5MH0sCisJezI4MjI0MDAsICAxMTI4OTYwMCwgIDB4MGE5MH0sCisJezE1MzYwMDAsICAxMjI4ODAwMCwgIDB4MTY5MH0sCisJezMwNzIwMDAsICAxMjI4ODAwMCwgIDB4MGE5MH0sCit9OworCitzdGF0aWMgc3RydWN0IGNvZWZmX2Nsa19kaXYgY29lZmZfZGl2W10gPSB7CisJLyogc3lzY2xrIGlzIDI1NmZzICovCisJezIwNDgwMDAsICA4MDAwICogMzIsICA4MDAwLCAweDEwMDB9LAorCXsyMDQ4MDAwLCAgODAwMCAqIDY0LCAgODAwMCwgMHgwMDAwfSwKKwl7MjgyMjQwMCwgIDExMDI1ICogMzIsICAxMTAyNSwgIDB4MTAwMH0sCisJezI4MjI0MDAsICAxMTAyNSAqIDY0LCAgMTEwMjUsICAweDAwMDB9LAorCXs0MDk2MDAwLCAgMTYwMDAgKiAzMiwgIDE2MDAwLCAgMHgxMDAwfSwKKwl7NDA5NjAwMCwgIDE2MDAwICogNjQsICAxNjAwMCwgIDB4MDAwMH0sCisJezU2NDQ4MDAsICAyMjA1MCAqIDMyLCAgMjIwNTAsICAweDEwMDB9LAorCXs1NjQ0ODAwLCAgMjIwNTAgKiA2NCwgIDIyMDUwLCAgMHgwMDAwfSwKKwl7ODE5MjAwMCwgIDMyMDAwICogMzIsICAzMjAwMCwgIDB4MTAwMH0sCisJezgxOTIwMDAsICAzMjAwMCAqIDY0LCAgMzIwMDAsICAweDAwMDB9LAorCXsxMTI4OTYwMCwgIDQ0MTAwICogMzIsICA0NDEwMCwgIDB4MTAwMH0sCisJezExMjg5NjAwLCAgNDQxMDAgKiA2NCwgIDQ0MTAwLCAgMHgwMDAwfSwKKwl7MTIyODgwMDAsICA0ODAwMCAqIDMyLCAgNDgwMDAsICAweDEwMDB9LAorCXsxMjI4ODAwMCwgIDQ4MDAwICogNjQsICA0ODAwMCwgIDB4MDAwMH0sCisJezIyNTc5MjAwLCAgODgyMDAgKiAzMiwgIDg4MjAwLCAgMHgxMDAwfSwKKwl7MjI1NzkyMDAsICA4ODIwMCAqIDY0LCAgODgyMDAsICAweDAwMDB9LAorCXsyNDU3NjAwMCwgIDk2MDAwICogMzIsICA5NjAwMCwgIDB4MTAwMH0sCisJezI0NTc2MDAwLCAgOTYwMDAgKiA2NCwgIDk2MDAwLCAgMHgwMDAwfSwKKwkvKiBzeXNjbGsgaXMgNTEyZnMgKi8KKwl7NDA5NjAwMCwgIDgwMDAgKiAzMiwgIDgwMDAsIDB4MzAwMH0sCisJezQwOTYwMDAsICA4MDAwICogNjQsICA4MDAwLCAweDIwMDB9LAorCXs1NjQ0ODAwLCAgMTEwMjUgKiAzMiwgIDExMDI1LCAweDMwMDB9LAorCXs1NjQ0ODAwLCAgMTEwMjUgKiA2NCwgIDExMDI1LCAweDIwMDB9LAorCXs4MTkyMDAwLCAgMTYwMDAgKiAzMiwgIDE2MDAwLCAweDMwMDB9LAorCXs4MTkyMDAwLCAgMTYwMDAgKiA2NCwgIDE2MDAwLCAweDIwMDB9LAorCXsxMTI4OTYwMCwgIDIyMDUwICogMzIsICAyMjA1MCwgMHgzMDAwfSwKKwl7MTEyODk2MDAsICAyMjA1MCAqIDY0LCAgMjIwNTAsIDB4MjAwMH0sCisJezE2Mzg0MDAwLCAgMzIwMDAgKiAzMiwgIDMyMDAwLCAweDMwMDB9LAorCXsxNjM4NDAwMCwgIDMyMDAwICogNjQsICAzMjAwMCwgMHgyMDAwfSwKKwl7MjI1NzkyMDAsICA0NDEwMCAqIDMyLCAgNDQxMDAsIDB4MzAwMH0sCisJezIyNTc5MjAwLCAgNDQxMDAgKiA2NCwgIDQ0MTAwLCAweDIwMDB9LAorCXsyNDU3NjAwMCwgIDQ4MDAwICogMzIsICA0ODAwMCwgMHgzMDAwfSwKKwl7MjQ1NzYwMDAsICA0ODAwMCAqIDY0LCAgNDgwMDAsIDB4MjAwMH0sCisJezQ1MTU4NDAwLCAgODgyMDAgKiAzMiwgIDg4MjAwLCAweDMwMDB9LAorCXs0NTE1ODQwMCwgIDg4MjAwICogNjQsICA4ODIwMCwgMHgyMDAwfSwKKwl7NDkxNTIwMDAsICA5NjAwMCAqIDMyLCAgOTYwMDAsIDB4MzAwMH0sCisJezQ5MTUyMDAwLCAgOTYwMDAgKiA2NCwgIDk2MDAwLCAweDIwMDB9LAorCS8qIHN5c2NsayBpcyAyNC41NzZNaHogb3IgMjIuNTc5Mk1oeiAqLworCXsyNDU3NjAwMCwgIDgwMDAgKiAzMiwgIDgwMDAsICAweDcwODB9LAorCXsyNDU3NjAwMCwgIDgwMDAgKiA2NCwgIDgwMDAsICAweDYwODB9LAorCXsyNDU3NjAwMCwgIDE2MDAwICogMzIsICAxNjAwMCwgIDB4NTA4MH0sCisJezI0NTc2MDAwLCAgMTYwMDAgKiA2NCwgIDE2MDAwLCAgMHg0MDgwfSwKKwl7MjQ1NzYwMDAsICAyNDAwMCAqIDMyLCAgMjQwMDAsICAweDUwMDB9LAorCXsyNDU3NjAwMCwgIDI0MDAwICogNjQsICAyNDAwMCwgIDB4NDAwMH0sCisJezI0NTc2MDAwLCAgMzIwMDAgKiAzMiwgIDMyMDAwLCAgMHgzMDgwfSwKKwl7MjQ1NzYwMDAsICAzMjAwMCAqIDY0LCAgMzIwMDAsICAweDIwODB9LAorCXsyMjU3OTIwMCwgIDExMDI1ICogMzIsICAxMTAyNSwgIDB4NzAwMH0sCisJezIyNTc5MjAwLCAgMTEwMjUgKiA2NCwgIDExMDI1LCAgMHg2MDAwfSwKKwl7MjI1NzkyMDAsICAyMjA1MCAqIDMyLCAgMjIwNTAsICAweDUwMDB9LAorCXsyMjU3OTIwMCwgIDIyMDUwICogNjQsICAyMjA1MCwgIDB4NDAwMH0sCit9OworCitzdGF0aWMgaW50IGdldF9jb2VmZihpbnQgbWNsaywgaW50IHJhdGUsIGludCB0aW1lc29mYmNsaykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZWZmX2Rpdik7IGkrKykgeworCQlpZiAoY29lZmZfZGl2W2ldLm1jbGsgPT0gbWNsayAmJiBjb2VmZl9kaXZbaV0ucmF0ZSA9PSByYXRlICYmCisJCQkoY29lZmZfZGl2W2ldLmJjbGsgLyBjb2VmZl9kaXZbaV0ucmF0ZSkgPT0gdGltZXNvZmJjbGspCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX2hpZmlfcGNtX3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBydDU2MzFfcHJpdiAqcnQ1NjMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHRpbWVzb2ZiY2xrID0gMzIsIGNvZWZmOworCXVuc2lnbmVkIGludCBpZmFjZSA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJlbnRlciAlc1xuIiwgX19mdW5jX18pOworCisJcnQ1NjMxLT5iY2xrX3JhdGUgPSBzbmRfc29jX3BhcmFtc190b19iY2xrKHBhcmFtcyk7CisJaWYgKHJ0NTYzMS0+YmNsa19yYXRlIDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsIHRvIGdldCBCQ0xLIHJhdGVcbiIpOworCQlyZXR1cm4gcnQ1NjMxLT5iY2xrX3JhdGU7CisJfQorCXJ0NTYzMS0+cnhfcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisKKwlpZiAocnQ1NjMxLT5tYXN0ZXIpCisJCWNvZWZmID0gZ2V0X2NvZWZmKHJ0NTYzMS0+c3lzY2xrLCBydDU2MzEtPnJ4X3JhdGUsCisJCQlydDU2MzEtPmJjbGtfcmF0ZSAvIHJ0NTYzMS0+cnhfcmF0ZSk7CisJZWxzZQorCQljb2VmZiA9IGdldF9jb2VmZihydDU2MzEtPnN5c2NsaywgcnQ1NjMxLT5yeF9yYXRlLAorCQkJCQl0aW1lc29mYmNsayk7CisJaWYgKGNvZWZmIDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsIHRvIGdldCBjb2VmZlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWlmYWNlIHw9IFJUNTYzMV9TRFBfSTJTX0RMXzIwOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQlpZmFjZSB8PSBSVDU2MzFfU0RQX0kyU19ETF8yNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1M4OgorCQlpZmFjZSB8PSBSVDU2MzFfU0RQX0kyU19ETF84OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfU0RQX0NUUkwsCisJCVJUNTYzMV9TRFBfSTJTX0RMX01BU0ssIGlmYWNlKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfU1RFUkVPX0FEX0RBX0NMS19DVFJMLAorCQkJCQljb2VmZl9kaXZbY29lZmZdLnJlZ192YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX2hpZmlfY29kZWNfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkJCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgaWZhY2UgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiZW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCXJ0NTYzMS0+bWFzdGVyID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlpZmFjZSB8PSBSVDU2MzFfU0RQX01PREVfU0VMX1NMQVZFOworCQlydDU2MzEtPm1hc3RlciA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCWlmYWNlIHw9IFJUNTYzMV9TRFBfSTJTX0RGX0xFRlQ7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJCWlmYWNlIHw9IFJUNTYzMV9TRFBfSTJTX0RGX1BDTV9BOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQlpZmFjZSAgfD0gUlQ1NjMxX1NEUF9JMlNfREZfUENNX0I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQlpZmFjZSB8PSBSVDU2MzFfU0RQX0kyU19CQ0xLX1BPTF9DVFJMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfU0RQX0NUUkwsIGlmYWNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTYzMV9oaWZpX2NvZGVjX3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQkJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgImVudGVyICVzLCBzeWNsaz0lZFxuIiwgX19mdW5jX18sIGZyZXEpOworCisJaWYgKChmcmVxID49ICgyNTYgKiA4MDAwKSkgJiYgKGZyZXEgPD0gKDUxMiAqIDk2MDAwKSkpIHsKKwkJcnQ1NjMxLT5zeXNjbGsgPSBmcmVxOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBydDU2MzFfY29kZWNfc2V0X2RhaV9wbGwoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksIGludCBwbGxfaWQsCisJCWludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjMxX3ByaXYgKnJ0NTYzMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBpLCByZXQgPSAtRUlOVkFMOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiZW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghZnJlcV9pbiB8fCAhZnJlcV9vdXQpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUExMIGRpc2FibGVkXG4iKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfR0xPQkFMX0NMS19DVFJMLAorCQkJUlQ1NjMxX1NZU0NMS19TT1VSX1NFTF9NQVNLLAorCQkJUlQ1NjMxX1NZU0NMS19TT1VSX1NFTF9NQ0xLKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocnQ1NjMxLT5tYXN0ZXIpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29kZWNfbWFzdGVyX3BsbF9kaXYpOyBpKyspCisJCQlpZiAoZnJlcV9pbiA9PSBjb2RlY19tYXN0ZXJfcGxsX2RpdltpXS5wbGxfaW4gJiYKKwkJCWZyZXFfb3V0ID09IGNvZGVjX21hc3Rlcl9wbGxfZGl2W2ldLnBsbF9vdXQpIHsKKwkJCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LAorCQkJCQkiY2hhbmdlIFBMTCBpbiBtYXN0ZXIgbW9kZVxuIik7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1BMTF9DVFJMLAorCQkJCQljb2RlY19tYXN0ZXJfcGxsX2RpdltpXS5yZWdfdmFsKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgKKwkJCQkJbXNlY3NfdG9famlmZmllcygyMCkpOworCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVJUNTYzMV9HTE9CQUxfQ0xLX0NUUkwsCisJCQkJCVJUNTYzMV9TWVNDTEtfU09VUl9TRUxfTUFTSyB8CisJCQkJCVJUNTYzMV9QTExDTEtfU09VUl9TRUxfTUFTSywKKwkJCQkJUlQ1NjMxX1NZU0NMS19TT1VSX1NFTF9QTEwgfAorCQkJCQlSVDU2MzFfUExMQ0xLX1NPVVJfU0VMX01DTEspOworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29kZWNfc2xhdmVfcGxsX2Rpdik7IGkrKykKKwkJCWlmIChmcmVxX2luID09IGNvZGVjX3NsYXZlX3BsbF9kaXZbaV0ucGxsX2luICYmCisJCQlmcmVxX291dCA9PSBjb2RlY19zbGF2ZV9wbGxfZGl2W2ldLnBsbF9vdXQpIHsKKwkJCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LAorCQkJCQkiY2hhbmdlIFBMTCBpbiBzbGF2ZSBtb2RlXG4iKTsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfUExMX0NUUkwsCisJCQkJCWNvZGVjX3NsYXZlX3BsbF9kaXZbaV0ucmVnX3ZhbCk7CisJCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjApKTsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlSVDU2MzFfR0xPQkFMX0NMS19DVFJMLAorCQkJCQlSVDU2MzFfU1lTQ0xLX1NPVVJfU0VMX01BU0sgfAorCQkJCQlSVDU2MzFfUExMQ0xLX1NPVVJfU0VMX01BU0ssCisJCQkJCVJUNTYzMV9TWVNDTEtfU09VUl9TRUxfUExMIHwKKwkJCQkJUlQ1NjMxX1BMTENMS19TT1VSX1NFTF9CQ0xLKTsKKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX01JQ0JJQVMxX1ZPTCB8IFJUNTYzMV9QV1JfTUlDQklBUzJfVk9MLAorCQkJUlQ1NjMxX1BXUl9NSUNCSUFTMV9WT0wgfCBSVDU2MzFfUFdSX01JQ0JJQVMyX1ZPTCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX1BXUl9NQU5BR19BREQzLAorCQkJCVJUNTYzMV9QV1JfVlJFRiB8IFJUNTYzMV9QV1JfTUFJTl9CSUFTLAorCQkJCVJUNTYzMV9QV1JfVlJFRiB8IFJUNTYzMV9QV1JfTUFJTl9CSUFTKTsKKwkJCW1zbGVlcCg4MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCQkJUlQ1NjMxX1BXUl9GQVNUX1ZSRUZfQ1RSTCwKKwkJCQlSVDU2MzFfUFdSX0ZBU1RfVlJFRl9DVFJMKTsKKwkJCWNvZGVjLT5jYWNoZV9vbmx5ID0gZmFsc2U7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDEsIDB4MDAwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9QV1JfTUFOQUdfQUREMiwgMHgwMDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1BXUl9NQU5BR19BREQzLCAweDAwMDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsIDB4MDAwMCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTYzMV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfSTJDKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZhbCA9IHJ0NTYzMV9yZWFkX2luZGV4KGNvZGVjLCBSVDU2MzFfQUREQV9NSVhFUl9JTlRMX1JFRzMpOworCWlmICh2YWwgJiAweDAwMDIpCisJCXJ0NTYzMS0+Y29kZWNfdmVyc2lvbiA9IDE7CisJZWxzZQorCQlydDU2MzEtPmNvZGVjX3ZlcnNpb24gPSAwOworCisJcnQ1NjMxX3Jlc2V0KGNvZGVjKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCVJUNTYzMV9QV1JfVlJFRiB8IFJUNTYzMV9QV1JfTUFJTl9CSUFTLAorCQlSVDU2MzFfUFdSX1ZSRUYgfCBSVDU2MzFfUFdSX01BSU5fQklBUyk7CisJbXNsZWVwKDgwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCVJUNTYzMV9QV1JfRkFTVF9WUkVGX0NUUkwsIFJUNTYzMV9QV1JfRkFTVF9WUkVGX0NUUkwpOworCS8qIGVuYWJsZSBIUCB6ZXJvIGNyb3NzICovCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yLCAweDBmMTgpOworCS8qIHBvd2VyIG9mZiBDbGFzc0QgYXV0byBSZWNvdmVyeSAqLworCWlmIChydDU2MzEtPmNvZGVjX3ZlcnNpb24pCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMiwKKwkJCQkJMHgyMDAwLCAweDIwMDApOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yLAorCQkJCQkweDIwMDAsIDApOworCS8qIERNSUMgKi8KKwlpZiAocnQ1NjMxLT5kbWljX3VzZWRfZmxhZykgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfR1BJT19DVFJMLAorCQkJUlQ1NjMxX0dQSU9fUElOX0ZVTl9TRUxfTUFTSyB8CisJCQlSVDU2MzFfR1BJT19ETUlDX0ZVTl9TRUxfTUFTSywKKwkJCVJUNTYzMV9HUElPX1BJTl9GVU5fU0VMX0dQSU9fRElNQyB8CisJCQlSVDU2MzFfR1BJT19ETUlDX0ZVTl9TRUxfRElNQyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9ESUdfTUlDX0NUUkwsCisJCQlSVDU2MzFfRE1JQ19MX0NIX0xBVENIX01BU0sgfAorCQkJUlQ1NjMxX0RNSUNfUl9DSF9MQVRDSF9NQVNLLAorCQkJUlQ1NjMxX0RNSUNfTF9DSF9MQVRDSF9GQUxMSU5HIHwKKwkJCVJUNTYzMV9ETUlDX1JfQ0hfTEFUQ0hfUklTSU5HKTsKKwl9CisKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX1NUQU5EQlk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2MzFfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlydDU2MzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJ0NTYzMV9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJ0NTYzMV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJcnQ1NjMxX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBydDU2MzFfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHJ0NTYzMV9yZXN1bWUgTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgUlQ1NjMxX1NURVJFT19SQVRFUyBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwCisjZGVmaW5lIFJUNTYzMV9GT1JNQVQJKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgXAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBcCisJCQlTTkRSVl9QQ01fRk1UQklUX1M4KQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBydDU2MzFfb3BzID0geworCS5od19wYXJhbXMgPSBydDU2MzFfaGlmaV9wY21fcGFyYW1zLAorCS5zZXRfZm10ID0gcnQ1NjMxX2hpZmlfY29kZWNfc2V0X2RhaV9mbXQsCisJLnNldF9zeXNjbGsgPSBydDU2MzFfaGlmaV9jb2RlY19zZXRfZGFpX3N5c2NsaywKKwkuc2V0X3BsbCA9IHJ0NTYzMV9jb2RlY19zZXRfZGFpX3BsbCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHJ0NTYzMV9kYWlbXSA9IHsKKwl7CisJCS5uYW1lID0gInJ0NTYzMS1oaWZpIiwKKwkJLmlkID0gMSwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkhJRkkgUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFJUNTYzMV9TVEVSRU9fUkFURVMsCisJCQkuZm9ybWF0cyA9IFJUNTYzMV9GT1JNQVQsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkhJRkkgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gUlQ1NjMxX1NURVJFT19SQVRFUywKKwkJCS5mb3JtYXRzID0gUlQ1NjMxX0ZPUk1BVCwKKwkJfSwKKwkJLm9wcyA9ICZydDU2MzFfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfcnQ1NjMxID0geworCS5wcm9iZSA9IHJ0NTYzMV9wcm9iZSwKKwkucmVtb3ZlID0gcnQ1NjMxX3JlbW92ZSwKKwkuc3VzcGVuZCA9IHJ0NTYzMV9zdXNwZW5kLAorCS5yZXN1bWUgPSBydDU2MzFfcmVzdW1lLAorCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTYzMV9zZXRfYmlhc19sZXZlbCwKKwkucmVnX2NhY2hlX3NpemUgPSBSVDU2MzFfVkVORE9SX0lEMiArIDEsCisJLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTE2KSwKKwkucmVnX2NhY2hlX2RlZmF1bHQgPSBydDU2MzFfcmVnLAorCS52b2xhdGlsZV9yZWdpc3RlciA9IHJ0NTYzMV92b2xhdGlsZV9yZWdpc3RlciwKKwkucmVhZGFibGVfcmVnaXN0ZXIgPSBydDU2MzFfcmVhZGFibGVfcmVnaXN0ZXIsCisJLnJlZ19jYWNoZV9zdGVwID0gMSwKKwkuY29udHJvbHMgPSBydDU2MzFfc25kX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTYzMV9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBydDU2MzFfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2MzFfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBydDU2MzFfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjMxX2RhcG1fcm91dGVzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBydDU2MzFfaTJjX2lkW10gPSB7CisJeyAicnQ1NjMxIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBydDU2MzFfaTJjX2lkKTsKKworc3RhdGljIGludCBydDU2MzFfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzE7CisJaW50IHJldDsKKworCXJ0NTYzMSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydDU2MzFfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IHJ0NTYzMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBydDU2MzEpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsICZzb2NfY29kZWNfZGV2X3J0NTYzMSwKKwkJCXJ0NTYzMV9kYWksIEFSUkFZX1NJWkUocnQ1NjMxX2RhaSkpOworCWlmIChyZXQgPCAwKQorCQlrZnJlZShydDU2MzEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9fZGV2ZXhpdCBpbnQgcnQ1NjMxX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBydDU2MzFfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJydDU2MzEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHJ0NTYzMV9pMmNfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3AocnQ1NjMxX2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IHJ0NTYzMV9pMmNfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBydDU2MzFfbW9kaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmcnQ1NjMxX2kyY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQocnQ1NjMxX21vZGluaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcnQ1NjMxX21vZGV4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmcnQ1NjMxX2kyY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocnQ1NjMxX21vZGV4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgUlQ1NjMxIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiZmxvdmUgPGZsb3ZlQHJlYWx0ZWsuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuaCBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0MDE1OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmgKQEAgLTAsMCArMSw3MDEgQEAKKyNpZm5kZWYgX19SVENPREVDNTYzMV9IX18KKyNkZWZpbmUgX19SVENPREVDNTYzMV9IX18KKworCisjZGVmaW5lIFJUNTYzMV9SRVNFVAkJCQkweDAwCisjZGVmaW5lIFJUNTYzMV9TUEtfT1VUX1ZPTAkJCTB4MDIKKyNkZWZpbmUgUlQ1NjMxX0hQX09VVF9WT0wJCQkweDA0CisjZGVmaW5lIFJUNTYzMV9NT05PX0FYT18xXzJfVk9MCQkweDA2CisjZGVmaW5lIFJUNTYzMV9BVVhfSU5fVk9MCQkJMHgwQQorI2RlZmluZSBSVDU2MzFfU1RFUkVPX0RBQ19WT0xfMQkJMHgwQworI2RlZmluZSBSVDU2MzFfTUlDX0NUUkxfMQkJCTB4MEUKKyNkZWZpbmUgUlQ1NjMxX1NURVJFT19EQUNfVk9MXzIJCTB4MTAKKyNkZWZpbmUgUlQ1NjMxX0FEQ19DVFJMXzEJCQkweDEyCisjZGVmaW5lIFJUNTYzMV9BRENfUkVDX01JWEVSCQkJMHgxNAorI2RlZmluZSBSVDU2MzFfQURDX0NUUkxfMgkJCTB4MTYKKyNkZWZpbmUgUlQ1NjMxX1ZEQUNfRElHX1ZPTAkJCTB4MTgKKyNkZWZpbmUgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTAkJCTB4MUEKKyNkZWZpbmUgUlQ1NjMxX09VVE1JWEVSX1JfQ1RSTAkJCTB4MUMKKyNkZWZpbmUgUlQ1NjMxX0FYTzFNSVhFUl9DVFJMCQkJMHgxRQorI2RlZmluZSBSVDU2MzFfQVhPMk1JWEVSX0NUUkwJCQkweDIwCisjZGVmaW5lIFJUNTYzMV9NSUNfQ1RSTF8yCQkJMHgyMgorI2RlZmluZSBSVDU2MzFfRElHX01JQ19DVFJMCQkJMHgyNAorI2RlZmluZSBSVDU2MzFfTU9OT19JTlBVVF9WT0wJCQkweDI2CisjZGVmaW5lIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTAkJCTB4MjgKKyNkZWZpbmUgUlQ1NjMxX1NQS19NT05PX09VVF9DVFJMCQkweDJBCisjZGVmaW5lIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTAkJMHgyQworI2RlZmluZSBSVDU2MzFfU0RQX0NUUkwJCQkJMHgzNAorI2RlZmluZSBSVDU2MzFfTU9OT19TRFBfQ1RSTAkJCTB4MzYKKyNkZWZpbmUgUlQ1NjMxX1NURVJFT19BRF9EQV9DTEtfQ1RSTAkJMHgzOAorI2RlZmluZSBSVDU2MzFfUFdSX01BTkFHX0FERDEJCTB4M0EKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NQU5BR19BREQyCQkweDNCCisjZGVmaW5lIFJUNTYzMV9QV1JfTUFOQUdfQUREMwkJMHgzQworI2RlZmluZSBSVDU2MzFfUFdSX01BTkFHX0FERDQJCTB4M0UKKyNkZWZpbmUgUlQ1NjMxX0dFTl9QVVJfQ1RSTF9SRUcJCTB4NDAKKyNkZWZpbmUgUlQ1NjMxX0dMT0JBTF9DTEtfQ1RSTAkJCTB4NDIKKyNkZWZpbmUgUlQ1NjMxX1BMTF9DVFJMCQkJCTB4NDQKKyNkZWZpbmUgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8xCQkweDQ4CisjZGVmaW5lIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMgkJMHg0QQorI2RlZmluZSBSVDU2MzFfR1BJT19DVFJMCQkJMHg0QworI2RlZmluZSBSVDU2MzFfTUlTQ19DVFJMCQkJMHg1MgorI2RlZmluZSBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMQkJMHg1NAorI2RlZmluZSBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMgkJMHg1NgorI2RlZmluZSBSVDU2MzFfSkFDS19ERVRfQ1RSTAkJCTB4NUEKKyNkZWZpbmUgUlQ1NjMxX1NPRlRfVk9MX0NUUkwJCQkweDVDCisjZGVmaW5lIFJUNTYzMV9BTENfQ1RSTF8xCQkJMHg2NAorI2RlZmluZSBSVDU2MzFfQUxDX0NUUkxfMgkJCTB4NjUKKyNkZWZpbmUgUlQ1NjMxX0FMQ19DVFJMXzMJCQkweDY2CisjZGVmaW5lIFJUNTYzMV9QU0VVRE9fU1BBVExfQ1RSTAkJMHg2OAorI2RlZmluZSBSVDU2MzFfSU5ERVhfQURECQkJMHg2QQorI2RlZmluZSBSVDU2MzFfSU5ERVhfREFUQQkJCTB4NkMKKyNkZWZpbmUgUlQ1NjMxX0VRX0NUUkwJCQkJMHg2RQorI2RlZmluZSBSVDU2MzFfVkVORE9SX0lECQkJMHg3QQorI2RlZmluZSBSVDU2MzFfVkVORE9SX0lEMQkJCTB4N0MKKyNkZWZpbmUgUlQ1NjMxX1ZFTkRPUl9JRDIJCQkweDdFCisKKy8qIEluZGV4IG9mIENvZGVjIFByaXZhdGUgUmVnaXN0ZXIgZGVmaW5pdGlvbiAqLworI2RlZmluZSBSVDU2MzFfRVFfQldfTE9QCQkJMHgwMAorI2RlZmluZSBSVDU2MzFfRVFfR0FJTl9MT1AJCQkweDAxCisjZGVmaW5lIFJUNTYzMV9FUV9GQ19CUDEJCQkweDAyCisjZGVmaW5lIFJUNTYzMV9FUV9CV19CUDEJCQkweDAzCisjZGVmaW5lIFJUNTYzMV9FUV9HQUlOX0JQMQkJCTB4MDQKKyNkZWZpbmUgUlQ1NjMxX0VRX0ZDX0JQMgkJCTB4MDUKKyNkZWZpbmUgUlQ1NjMxX0VRX0JXX0JQMgkJCTB4MDYKKyNkZWZpbmUgUlQ1NjMxX0VRX0dBSU5fQlAyCQkJMHgwNworI2RlZmluZSBSVDU2MzFfRVFfRkNfQlAzCQkJMHgwOAorI2RlZmluZSBSVDU2MzFfRVFfQldfQlAzCQkJMHgwOQorI2RlZmluZSBSVDU2MzFfRVFfR0FJTl9CUDMJCQkweDBhCisjZGVmaW5lIFJUNTYzMV9FUV9CV19ISVAJCQkweDBiCisjZGVmaW5lIFJUNTYzMV9FUV9HQUlOX0hJUAkJCTB4MGMKKyNkZWZpbmUgUlQ1NjMxX0VRX0hQRl9BMQkJCTB4MGQKKyNkZWZpbmUgUlQ1NjMxX0VRX0hQRl9BMgkJCTB4MGUKKyNkZWZpbmUgUlQ1NjMxX0VRX0hQRl9HQUlOCQkJMHgwZgorI2RlZmluZSBSVDU2MzFfRVFfUFJFX1ZPTF9DVFJMCQkJMHgxMQorI2RlZmluZSBSVDU2MzFfRVFfUE9TVF9WT0xfQ1RSTAkJMHgxMgorI2RlZmluZSBSVDU2MzFfVEVTVF9NT0RFX0NUUkwJCQkweDM5CisjZGVmaW5lIFJUNTYzMV9DUF9JTlRMX1JFRzIJCQkweDQ1CisjZGVmaW5lIFJUNTYzMV9BRERBX01JWEVSX0lOVExfUkVHMwkJMHg1MgorI2RlZmluZSBSVDU2MzFfU1BLX0lOVExfQ1RSTAkJCTB4NTYKKworCisvKiBnbG9iYWwgZGVmaW5pdGlvbiAqLworI2RlZmluZSBSVDU2MzFfTF9NVVRFCQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTF9NVVRFX1NISUZUCQkJCTE1CisjZGVmaW5lIFJUNTYzMV9MX0VOCQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfTF9FTl9TSElGVAkJCQkxNAorI2RlZmluZSBSVDU2MzFfUl9NVVRFCQkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9SX01VVEVfU0hJRlQJCQkJNworI2RlZmluZSBSVDU2MzFfUl9FTgkJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfUl9FTl9TSElGVAkJCQk2CisjZGVmaW5lIFJUNTYzMV9WT0xfTUFTSwkJCQkweDFmCisjZGVmaW5lIFJUNTYzMV9MX1ZPTF9TSElGVAkJCQk4CisjZGVmaW5lIFJUNTYzMV9SX1ZPTF9TSElGVAkJCQkwCisKKy8qIFNwZWFrZXIgT3V0cHV0IENvbnRyb2woMHgwMikgKi8KKyNkZWZpbmUgUlQ1NjMxX1NQS19MX1ZPTF9TRUxfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9TUEtfTF9WT0xfU0VMX1ZNSUQJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfU1BLX0xfVk9MX1NFTF9TUEtNSVhfTAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9WT0xfU0VMX01BU0sJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9WT0xfU0VMX1ZNSUQJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9WT0xfU0VMX1NQS01JWF9SCQkJKDB4MSA8PCA2KQorCisvKiBIZWFkcGhvbmUgT3V0cHV0IENvbnRyb2woMHgwNCkgKi8KKyNkZWZpbmUgUlQ1NjMxX0hQX0xfVk9MX1NFTF9NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0hQX0xfVk9MX1NFTF9WTUlECQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0hQX0xfVk9MX1NFTF9PVVRNSVhfTAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9IUF9SX1ZPTF9TRUxfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0hQX1JfVk9MX1NFTF9WTUlECQkJKDB4MCA8PCA2KQorI2RlZmluZSBSVDU2MzFfSFBfUl9WT0xfU0VMX09VVE1JWF9SCQkJKDB4MSA8PCA2KQorCisvKiBPdXRwdXQgQ29udHJvbCBmb3IgQVVYT1VUL01PTk8oMHgwNikgKi8KKyNkZWZpbmUgUlQ1NjMxX0FVWE9VVF8xX1ZPTF9TRUxfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9BVVhPVVRfMV9WT0xfU0VMX1ZNSUQJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQVVYT1VUXzFfVk9MX1NFTF9PVVRNSVhfTAkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX01VVEVfTU9OTwkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2MzFfTVVURV9NT05PX1NISUZUCQkJMTMKKyNkZWZpbmUgUlQ1NjMxX0FVWE9VVF8yX1ZPTF9TRUxfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0FVWE9VVF8yX1ZPTF9TRUxfVk1JRAkJCSgweDAgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0FVWE9VVF8yX1ZPTF9TRUxfT1VUTUlYX1IJCSgweDEgPDwgNikKKworLyogTWljcm9waG9uZSBJbnB1dCBDb250cm9sIDEoMHgwRSkgKi8KKyNkZWZpbmUgUlQ1NjMxX01JQzFfRElGRl9JTlBVVF9DVFJMCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX01JQzFfRElGRl9JTlBVVF9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTYzMV9NSUMyX0RJRkZfSU5QVVRfQ1RSTAkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX01JQzJfRElGRl9JTlBVVF9TSElGVAkJCTcKKworLyogU3RlcmVvIERBQyBEaWdpdGFsIFZvbHVtZTIoMHgxMCkgKi8KKyNkZWZpbmUgUlQ1NjMxX0RBQ19WT0xfTUFTSwkJCQkweGZmCisKKy8qIEFEQyBSZWNvcmRpbmcgTWl4ZXIgQ29udHJvbCgweDE0KSAqLworI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhFUl9MX1RPX1JFQ01JWEVSX0wJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWExfUkVDTUlYTF9CSVQJCQkxNQorI2RlZmluZSBSVDU2MzFfTV9NSUMxX1RPX1JFQ01JWEVSX0wJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfTV9NSUMxX1JFQ01JWExfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX01fQVhJTF9UT19SRUNNSVhFUl9MCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX01fQVhJTF9SRUNNSVhMX0JJVAkJCTEzCisjZGVmaW5lIFJUNTYzMV9NX01PTk9fSU5fVE9fUkVDTUlYRVJfTAkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjMxX01fTU9OT19JTl9SRUNNSVhMX0JJVAkJCTEyCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWEVSX1JfVE9fUkVDTUlYRVJfUgkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhSX1JFQ01JWFJfQklUCQkJNworI2RlZmluZSBSVDU2MzFfTV9NSUMyX1RPX1JFQ01JWEVSX1IJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NX01JQzJfUkVDTUlYUl9CSVQJCQk2CisjZGVmaW5lIFJUNTYzMV9NX0FYSVJfVE9fUkVDTUlYRVJfUgkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjMxX01fQVhJUl9SRUNNSVhSX0JJVAkJCTUKKyNkZWZpbmUgUlQ1NjMxX01fTU9OT19JTl9UT19SRUNNSVhFUl9SCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9NX01PTk9fSU5fUkVDTUlYUl9CSVQJCQk0CisKKy8qIExlZnQgT3V0cHV0IE1peGVyIENvbnRyb2woMHgxQSkgKi8KKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfTF9UT19PVVRNSVhFUl9MCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhMX09VVE1JWExfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfUl9UT19PVVRNSVhFUl9MCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhSX09VVE1JWExfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX01fREFDX0xfVE9fT1VUTUlYRVJfTAkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9NX0RBQ0xfT1VUTUlYTF9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfTV9NSUMxX1RPX09VVE1JWEVSX0wJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTV9NSUMxX09VVE1JWExfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9UT19PVVRNSVhFUl9MCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9PVVRNSVhMX0JJVAkJCTExCisjZGVmaW5lIFJUNTYzMV9NX01PTk9fSU5fUF9UT19PVVRNSVhFUl9MCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfTV9NT05PX0lOUF9PVVRNSVhMX0JJVAkJMTAKKyNkZWZpbmUgUlQ1NjMxX01fQVhJTF9UT19PVVRNSVhFUl9MCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfTV9BWElMX09VVE1JWExfQklUCQkJOQorI2RlZmluZSBSVDU2MzFfTV9BWElSX1RPX09VVE1JWEVSX0wJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NX0FYSVJfT1VUTUlYTF9CSVQJCQk4CisjZGVmaW5lIFJUNTYzMV9NX1ZEQUNfVE9fT1VUTUlYRVJfTAkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX01fVkRBQ19PVVRNSVhMX0JJVAkJCTcKKworLyogUmlnaHQgT3V0cHV0IE1peGVyIENvbnRyb2woMHgxQykgKi8KKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfTF9UT19PVVRNSVhFUl9SCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhMX09VVE1JWFJfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfUl9UT19PVVRNSVhFUl9SCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhSX09VVE1JWFJfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX01fREFDX1JfVE9fT1VUTUlYRVJfUgkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9NX0RBQ1JfT1VUTUlYUl9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfTV9NSUMxX1RPX09VVE1JWEVSX1IJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTV9NSUMxX09VVE1JWFJfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9UT19PVVRNSVhFUl9SCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9PVVRNSVhSX0JJVAkJCTExCisjZGVmaW5lIFJUNTYzMV9NX01PTk9fSU5fTl9UT19PVVRNSVhFUl9SCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfTV9NT05PX0lOTl9PVVRNSVhSX0JJVAkJMTAKKyNkZWZpbmUgUlQ1NjMxX01fQVhJTF9UT19PVVRNSVhFUl9SCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfTV9BWElMX09VVE1JWFJfQklUCQkJOQorI2RlZmluZSBSVDU2MzFfTV9BWElSX1RPX09VVE1JWEVSX1IJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NX0FYSVJfT1VUTUlYUl9CSVQJCQk4CisjZGVmaW5lIFJUNTYzMV9NX1ZEQUNfVE9fT1VUTUlYRVJfUgkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX01fVkRBQ19PVVRNSVhSX0JJVAkJCTcKKworLyogTG91dCBNaXhlciBDb250cm9sKDB4MUUpICovCisjZGVmaW5lIFJUNTYzMV9NX01JQzFfVE9fQVhPMU1JWEVSCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMV9BWE8xTUlYX0JJVAkJCTE1CisjZGVmaW5lIFJUNTYzMV9NX01JQzJfVE9fQVhPMU1JWEVSCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9BWE8xTUlYX0JJVAkJCTExCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWEVSX0xfVE9fQVhPMU1JWEVSCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWExfQVhPMU1JWF9CSVQJCQk3CisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWEVSX1JfVE9fQVhPMU1JWEVSCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWFJfQVhPMU1JWF9CSVQJCQk2CisKKy8qIFJvdXQgTWl4ZXIgQ29udHJvbCgweDIwKSAqLworI2RlZmluZSBSVDU2MzFfTV9NSUMxX1RPX0FYTzJNSVhFUgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9NX01JQzFfQVhPMk1JWF9CSVQJCQkxNQorI2RlZmluZSBSVDU2MzFfTV9NSUMyX1RPX0FYTzJNSVhFUgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTYzMV9NX01JQzJfQVhPMk1JWF9CSVQJCQkxMQorI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhFUl9MX1RPX0FYTzJNSVhFUgkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhMX0FYTzJNSVhfQklUCQkJNworI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhFUl9SX1RPX0FYTzJNSVhFUgkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhSX0FYTzJNSVhfQklUCQkJNgorCisvKiBNaWNwaG9uZSBJbnB1dCBDb250cm9sIDIoMHgyMikgKi8KKyNkZWZpbmUgUlQ1NjMxX01JQ19CSUFTXzkwX1BSRUNORVRfQVZERCAxCisjZGVmaW5lIFJUNTYzMV9NSUNfQklBU183NV9QUkVDTkVUX0FWREQgMgorCisjZGVmaW5lIFJUNTYzMV9NSUMxX0JPT1NUX0NUUkxfTUFTSwkJCSgweGYgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9NSUMxX0JPT1NUX0NUUkxfQllQQVNTCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzIwREIJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzI0REIJCQkoMHgyIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzMwREIJCQkoMHgzIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzM1REIJCQkoMHg0IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzQwREIJCQkoMHg1IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzM0REIJCQkoMHg2IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzUwREIJCQkoMHg3IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzUyREIJCQkoMHg4IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9TSElGVAkJCTEyCisKKyNkZWZpbmUgUlQ1NjMxX01JQzJfQk9PU1RfQ1RSTF9NQVNLCQkJKDB4ZiA8PCA4KQorI2RlZmluZSBSVDU2MzFfTUlDMl9CT09TVF9DVFJMX0JZUEFTUwkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2MzFfTUlDMl9CT09TVF9DVFJMXzIwREIJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NSUMyX0JPT1NUX0NUUkxfMjREQgkJCSgweDIgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX01JQzJfQk9PU1RfQ1RSTF8zMERCCQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2MzFfTUlDMl9CT09TVF9DVFJMXzM1REIJCQkoMHg0IDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NSUMyX0JPT1NUX0NUUkxfNDBEQgkJCSgweDUgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX01JQzJfQk9PU1RfQ1RSTF8zNERCCQkJKDB4NiA8PCA4KQorI2RlZmluZSBSVDU2MzFfTUlDMl9CT09TVF9DVFJMXzUwREIJCQkoMHg3IDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NSUMyX0JPT1NUX0NUUkxfNTJEQgkJCSgweDggPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX01JQzJfQk9PU1RfU0hJRlQJCQk4CisKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMxX1ZPTFRfQ1RSTF9NQVNLCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMV9WT0xUX0NUUkxfOTBQCQkJKDB4MCA8PCA3KQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfVk9MVF9DVFJMXzc1UAkJCSgweDEgPDwgNykKKworI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU19DX0RFVF9NQVNLCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU19DX0RFVF9ESVMJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMV9TX0NfREVUX0VOQQkJCSgweDEgPDwgNikKKworI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU0hPUlRfQ1VSUl9ERVRfTUFTSwkJKDB4MyA8PCA0KQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU0hPUlRfQ1VSUl9ERVRfNjAwVUEJKDB4MCA8PCA0KQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU0hPUlRfQ1VSUl9ERVRfMTUwMFVBCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMxX1NIT1JUX0NVUlJfREVUXzIwMDBVQQkoMHgyIDw8IDQpCisKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMyX1ZPTFRfQ1RSTF9NQVNLCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMl9WT0xUX0NUUkxfOTBQCQkJKDB4MCA8PCAzKQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzJfVk9MVF9DVFJMXzc1UAkJCSgweDEgPDwgMykKKworI2RlZmluZSBSVDU2MzFfTUlDQklBUzJfU19DX0RFVF9NQVNLCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzJfU19DX0RFVF9ESVMJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMl9TX0NfREVUX0VOQQkJCSgweDEgPDwgMikKKworI2RlZmluZSBSVDU2MzFfTUlDQklBUzJfU0hPUlRfQ1VSUl9ERVRfTUFTSwkJKDB4MykKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMyX1NIT1JUX0NVUlJfREVUXzYwMFVBCSgweDApCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMl9TSE9SVF9DVVJSX0RFVF8xNTAwVUEJKDB4MSkKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMyX1NIT1JUX0NVUlJfREVUXzIwMDBVQQkoMHgyKQorCisKKy8qIERpZ2l0YWwgTWljcm9waG9uZSBDb250cm9sKDB4MjQpICovCisjZGVmaW5lIFJUNTYzMV9ETUlDX0VOQV9NQVNLCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9ETUlDX0VOQV9TSElGVAkJCQkxNQorLyogRE1JQ19FTkE6IERNSUMgdG8gQURDIERpZ2l0YWwgZmlsdGVyICovCisjZGVmaW5lIFJUNTYzMV9ETUlDX0VOQQkJCQkoMHgxIDw8IDE1KQorLyogRE1JQ19ESVM6IEFEQyBtaXhlciB0byBBREMgRGlnaXRhbCBmaWx0ZXIgKi8KKyNkZWZpbmUgUlQ1NjMxX0RNSUNfRElTCQkJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfRE1JQ19MX0NIX01VVEUJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfTF9DSF9NVVRFX1NISUZUCQkJMTMKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfUl9DSF9NVVRFCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9ETUlDX1JfQ0hfTVVURV9TSElGVAkJCTEyCisjZGVmaW5lIFJUNTYzMV9ETUlDX0xfQ0hfTEFUQ0hfTUFTSwkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfTF9DSF9MQVRDSF9SSVNJTkcJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTYzMV9ETUlDX0xfQ0hfTEFUQ0hfRkFMTElORwkJKDB4MCA8PCA5KQorI2RlZmluZSBSVDU2MzFfRE1JQ19SX0NIX0xBVENIX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9ETUlDX1JfQ0hfTEFUQ0hfUklTSU5HCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2MzFfRE1JQ19SX0NIX0xBVENIX0ZBTExJTkcJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfTUFTSwkJCSgweDMgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfVE9fMTI4RlMJCQkoMHgwIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9ETUlDX0NMS19DVFJMX1RPXzY0RlMJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9ETUlDX0NMS19DVFJMX1RPXzMyRlMJCQkoMHgyIDw8IDQpCisKKy8qIE1pY3JvcGhvbmUgSW5wdXQgVm9sdW1lKDB4MjYpICovCisjZGVmaW5lIFJUNTYzMV9NT05PX0RJRkZfSU5QVVRfU0hJRlQJCQkxNQorCisvKiBTcGVha2VyIE1peGVyIENvbnRyb2woMHgyOCkgKi8KKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfTF9UT19TUEtNSVhFUl9MCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhMX1NQS01JWExfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMV9QX1RPX1NQS01JWEVSX0wJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9NX01JQzFQX1NQS01JWExfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX01fREFDX0xfVE9fU1BLTUlYRVJfTAkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9NX0RBQ0xfU1BLTUlYTF9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhFUl9MX1RPX1NQS01JWEVSX0wJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWExfU1BLTUlYTF9CSVQJCQkxMgorCisjZGVmaW5lIFJUNTYzMV9NX1JFQ01JWEVSX1JfVE9fU1BLTUlYRVJfUgkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhSX1NQS01JWFJfQklUCQkJNworI2RlZmluZSBSVDU2MzFfTV9NSUMyX1BfVE9fU1BLTUlYRVJfUgkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfTV9NSUMyUF9TUEtNSVhSX0JJVAkJCTYKKyNkZWZpbmUgUlQ1NjMxX01fREFDX1JfVE9fU1BLTUlYRVJfUgkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjMxX01fREFDUl9TUEtNSVhSX0JJVAkJCTUKKyNkZWZpbmUgUlQ1NjMxX01fT1VUTUlYRVJfUl9UT19TUEtNSVhFUl9SCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWFJfU1BLTUlYUl9CSVQJCQk0CisKKy8qIFNwZWFrZXIvTW9ubyBPdXRwdXQgQ29udHJvbCgweDJBKSAqLworI2RlZmluZSBSVDU2MzFfTV9TUEtWT0xfTF9UT19TUE9MX01JWEVSCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTV9TUEtWT0xMX1NQT0xNSVhfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX01fU1BLVk9MX1JfVE9fU1BPTF9NSVhFUgkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX01fU1BLVk9MUl9TUE9MTUlYX0JJVAkJCTE0CisjZGVmaW5lIFJUNTYzMV9NX1NQS1ZPTF9MX1RPX1NQT1JfTUlYRVIJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9NX1NQS1ZPTExfU1BPUk1JWF9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfTV9TUEtWT0xfUl9UT19TUE9SX01JWEVSCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTV9TUEtWT0xSX1NQT1JNSVhfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX01fT1VUVk9MX0xfVE9fTU9OT01JWEVSCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2MzFfTV9PVVRWT0xMX01PTk9NSVhfQklUCQkJMTEKKyNkZWZpbmUgUlQ1NjMxX01fT1VUVk9MX1JfVE9fTU9OT01JWEVSCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfTV9PVVRWT0xSX01PTk9NSVhfQklUCQkJMTAKKworLyogU3BlYWtlci9Nb25vL0hQIE91dHB1dCBDb250cm9sKDB4MkMpICovCisjZGVmaW5lIFJUNTYzMV9TUEtfTF9NVVhfU0VMX01BU0sJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfU1BLX0xfTVVYX1NFTF9TUEtNSVhFUl9MCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfU1BLX0xfTVVYX1NFTF9NT05PX0lOCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX1NQS19MX01VWF9TRUxfREFDX0wJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfU1BLX0xfTVVYX1NFTF9TSElGVAkJCTE0CisKKyNkZWZpbmUgUlQ1NjMxX1NQS19SX01VWF9TRUxfTUFTSwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9NVVhfU0VMX1NQS01JWEVSX1IJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9NVVhfU0VMX01PTk9fSU4JCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfU1BLX1JfTVVYX1NFTF9EQUNfUgkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9NVVhfU0VMX1NISUZUCQkJMTAKKworI2RlZmluZSBSVDU2MzFfTU9OT19NVVhfU0VMX01BU0sJCQkoMHgzIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NT05PX01VWF9TRUxfTU9OT01JWEVSCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NT05PX01VWF9TRUxfTU9OT19JTgkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX01PTk9fTVVYX1NFTF9TSElGVAkJCTYKKworI2RlZmluZSBSVDU2MzFfSFBfTF9NVVhfU0VMX01BU0sJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9IUF9MX01VWF9TRUxfSFBWT0xfTAkJCSgweDAgPDwgMykKKyNkZWZpbmUgUlQ1NjMxX0hQX0xfTVVYX1NFTF9EQUNfTAkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjMxX0hQX0xfTVVYX1NFTF9TSElGVAkJCTMKKworI2RlZmluZSBSVDU2MzFfSFBfUl9NVVhfU0VMX01BU0sJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9IUF9SX01VWF9TRUxfSFBWT0xfUgkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0hQX1JfTVVYX1NFTF9EQUNfUgkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0hQX1JfTVVYX1NFTF9TSElGVAkJCTIKKworLyogU3RlcmVvIEkyUyBTZXJpYWwgRGF0YSBQb3J0IENvbnRyb2woMHgzNCkgKi8KKyNkZWZpbmUgUlQ1NjMxX1NEUF9NT0RFX1NFTF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX1NEUF9NT0RFX1NFTF9NQVNURVIJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfU0RQX01PREVfU0VMX1NMQVZFCQkJKDB4MSA8PCAxNSkKKworI2RlZmluZSBSVDU2MzFfU0RQX0FEQ19DUFNfU0VMX01BU0sJCQkoMHgzIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfU0RQX0FEQ19DUFNfU0VMX09GRgkJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9TRFBfQURDX0NQU19TRUxfVV9MQVcJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfU0RQX0FEQ19DUFNfU0VMX0FfTEFXCQkJKDB4MiA8PCAxMCkKKworI2RlZmluZSBSVDU2MzFfU0RQX0RBQ19DUFNfU0VMX01BU0sJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9TRFBfREFDX0NQU19TRUxfT0ZGCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2MzFfU0RQX0RBQ19DUFNfU0VMX1VfTEFXCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2MzFfU0RQX0RBQ19DUFNfU0VMX0FfTEFXCQkJKDB4MiA8PCA4KQorLyogMDpOb3JtYWwgMTpJbnZlcnQgKi8KKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfQkNMS19QT0xfQ1RSTAkJCSgweDEgPDwgNykKKy8qIDA6Tm9ybWFsIDE6SW52ZXJ0ICovCisjZGVmaW5lIFJUNTYzMV9TRFBfREFDX1JfSU5WCQkJCSgweDEgPDwgNikKKy8qIDA6QURDIGRhdGEgYXBwZWFyIGF0IGxlZnQgcGhhc2Ugb2YgTFJDSworICogMTpBREMgZGF0YSBhcHBlYXIgYXQgcmlnaHQgcGhhc2Ugb2YgTFJDSworICovCisjZGVmaW5lIFJUNTYzMV9TRFBfQURDX0RBVEFfTF9SX1NXQVAJCQkoMHgxIDw8IDUpCisvKiAwOkRBQyBkYXRhIGFwcGVhciBhdCBsZWZ0IHBoYXNlIG9mIExSQ0sKKyAqIDE6REFDIGRhdGEgYXBwZWFyIGF0IHJpZ2h0IHBoYXNlIG9mIExSQ0sKKyAqLworI2RlZmluZSBSVDU2MzFfU0RQX0RBQ19EQVRBX0xfUl9TV0FQCQkJKDB4MSA8PCA0KQorCisvKiBEYXRhIExlbmd0aCBTbGVjdGlvbiAqLworI2RlZmluZSBSVDU2MzFfU0RQX0kyU19ETF9NQVNLCQkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfRExfMTYJCQkJKDB4MCA8PCAyKQorI2RlZmluZSBSVDU2MzFfU0RQX0kyU19ETF8yMAkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9TRFBfSTJTX0RMXzI0CQkJCSgweDIgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfRExfOAkJCQkoMHgzIDw8IDIpCisKKy8qIFBDTSBEYXRhIEZvcm1hdCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfREZfTUFTSwkJCQkoMHgzKQorI2RlZmluZSBSVDU2MzFfU0RQX0kyU19ERl9JMlMJCQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfREZfTEVGVAkJCQkoMHgxKQorI2RlZmluZSBSVDU2MzFfU0RQX0kyU19ERl9QQ01fQQkJCSgweDIpCisjZGVmaW5lIFJUNTYzMV9TRFBfSTJTX0RGX1BDTV9CCQkJKDB4MykKKworLyogU3RlcmVvIEFEL0RBIENsb2NrIENvbnRyb2woMHgzOGgpICovCisjZGVmaW5lIFJUNTYzMV9JMlNfUFJFX0RJVl9NQVNLCQkJKDB4NyA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzEJCQkJKDB4MCA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzIJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzQJCQkJKDB4MiA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzgJCQkJKDB4MyA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzE2CQkJCSgweDQgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9JMlNfUFJFX0RJVl8zMgkJCQkoMHg1IDw8IDEzKQorLyogQ0xPQ0sgUkVMQVRJVkUgT0YgQkNMSyBBTkQgTENSSyAqLworI2RlZmluZSBSVDU2MzFfSTJTX0xSQ0tfU0VMX05fQkNMS19NQVNLCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfSTJTX0xSQ0tfU0VMXzY0X0JDTEsJCQkoMHgwIDw8IDEyKSAvKiA2NEZTICovCisjZGVmaW5lIFJUNTYzMV9JMlNfTFJDS19TRUxfMzJfQkNMSwkJCSgweDEgPDwgMTIpIC8qIDMyRlMgKi8KKworI2RlZmluZSBSVDU2MzFfREFDX09TUl9TRUxfTUFTSwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9EQUNfT1NSX1NFTF8xMjhGUwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9EQUNfT1NSX1NFTF82NEZTCQkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjMxX0RBQ19PU1JfU0VMXzMyRlMJCQkoMHgzIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfREFDX09TUl9TRUxfMTZGUwkJCSgweDMgPDwgMTApCisKKyNkZWZpbmUgUlQ1NjMxX0FEQ19PU1JfU0VMX01BU0sJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9BRENfT1NSX1NFTF8xMjhGUwkJCSgweDMgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX0FEQ19PU1JfU0VMXzY0RlMJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9BRENfT1NSX1NFTF8zMkZTCQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2MzFfQURDX09TUl9TRUxfMTZGUwkJCSgweDMgPDwgOCkKKworI2RlZmluZSBSVDU2MzFfQUREQV9GSUxURVJfQ0xLX1NFTF8yNTZGUwkJKDAgPDwgNykgLyogMjU2RlMgKi8KKyNkZWZpbmUgUlQ1NjMxX0FEREFfRklMVEVSX0NMS19TRUxfMzg0RlMJCSgxIDw8IDcpIC8qIDM4NEZTICovCisKKy8qIFBvd2VyIG1hbmFnbWVudCBhZGRpdGlvbiAxICgweDNBKSAqLworI2RlZmluZSBSVDU2MzFfUFdSX01BSU5fSTJTX0VOCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NQUlOX0kyU19CSVQJCQkxNQorI2RlZmluZSBSVDU2MzFfUFdSX0NMQVNTX0QJCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjMxX1BXUl9DTEFTU19EX0JJVAkJCTEyCisjZGVmaW5lIFJUNTYzMV9QV1JfQURDX0xfQ0xLCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTYzMV9QV1JfQURDX0xfQ0xLX0JJVAkJCTExCisjZGVmaW5lIFJUNTYzMV9QV1JfQURDX1JfQ0xLCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9QV1JfQURDX1JfQ0xLX0JJVAkJCTEwCisjZGVmaW5lIFJUNTYzMV9QV1JfREFDX0xfQ0xLCQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfTF9DTEtfQklUCQkJOQorI2RlZmluZSBSVDU2MzFfUFdSX0RBQ19SX0NMSwkJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9QV1JfREFDX1JfQ0xLX0JJVAkJCTgKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfUkVGCQkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfUkVGX0JJVAkJCTcKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfTF9UT19NSVhFUgkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfTF9UT19NSVhFUl9CSVQJCTYKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfUl9UT19NSVhFUgkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfUl9UT19NSVhFUl9CSVQJCTUKKworLyogUG93ZXIgbWFuYWdtZW50IGFkZGl0aW9uIDIgKDB4M0IpICovCisjZGVmaW5lIFJUNTYzMV9QV1JfT1VUTUlYRVJfTAkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfUFdSX09VVE1JWEVSX0xfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX1BXUl9PVVRNSVhFUl9SCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9QV1JfT1VUTUlYRVJfUl9CSVQJCQkxNAorI2RlZmluZSBSVDU2MzFfUFdSX1NQS01JWEVSX0wJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9TUEtNSVhFUl9MX0JJVAkJCTEzCisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLTUlYRVJfUgkJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfUFdSX1NQS01JWEVSX1JfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX1BXUl9SRUNNSVhFUl9MCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTYzMV9QV1JfUkVDTUlYRVJfTF9CSVQJCQkxMQorI2RlZmluZSBSVDU2MzFfUFdSX1JFQ01JWEVSX1IJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9SRUNNSVhFUl9SX0JJVAkJCTEwCisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDMV9CT09UX0dBSU4JCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDMV9CT09UX0dBSU5fQklUCQk1CisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDMl9CT09UX0dBSU4JCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDMl9CT09UX0dBSU5fQklUCQk0CisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDQklBUzFfVk9MCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2MzFfUFdSX01JQ0JJQVMxX1ZPTF9CSVQJCQkzCisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDQklBUzJfVk9MCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2MzFfUFdSX01JQ0JJQVMyX1ZPTF9CSVQJCQkyCisjZGVmaW5lIFJUNTYzMV9QV1JfUExMMQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTYzMV9QV1JfUExMMV9CSVQJCQkJMQorI2RlZmluZSBSVDU2MzFfUFdSX1BMTDIJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBSVDU2MzFfUFdSX1BMTDJfQklUCQkJCTAKKworLyogUG93ZXIgbWFuYWdtZW50IGFkZGl0aW9uIDMoMHgzQykgKi8KKyNkZWZpbmUgUlQ1NjMxX1BXUl9WUkVGCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9QV1JfVlJFRl9CSVQJCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX1BXUl9GQVNUX1ZSRUZfQ1RSTAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9QV1JfRkFTVF9WUkVGX0NUUkxfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NQUlOX0JJQVMJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NQUlOX0JJQVNfQklUCQkJMTMKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWE8xTUlYRVIJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWE8xTUlYRVJfQklUCQkJMTEKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWE8yTUlYRVIJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWE8yTUlYRVJfQklUCQkJMTAKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NT05PTUlYRVIJCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfUFdSX01PTk9NSVhFUl9CSVQJCQk5CisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19ERVBPUF9ESVMJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19ERVBPUF9ESVNfQklUCQk4CisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19BTVBfRU4JCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19BTVBfRU5fQklUCQkJNworI2RlZmluZSBSVDU2MzFfUFdSX0NIQVJHRV9QVU1QCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2MzFfUFdSX0NIQVJHRV9QVU1QX0JJVAkJCTQKKyNkZWZpbmUgUlQ1NjMxX1BXUl9IUF9MX0FNUAkJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfTF9BTVBfQklUCQkJMworI2RlZmluZSBSVDU2MzFfUFdSX0hQX1JfQU1QCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX1BXUl9IUF9SX0FNUF9CSVQJCQkyCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfREVQT1BfRElTCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2MzFfUFdSX0hQX0RFUE9QX0RJU19CSVQJCQkxCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfQU1QX0RSSVZJTkcJCQkoMHgxIDw8IDApCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfQU1QX0RSSVZJTkdfQklUCQkwCisKKy8qIFBvd2VyIG1hbmFnbWVudCBhZGRpdGlvbiA0KDB4M0UpICovCisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLX0xfVk9MCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLX0xfVk9MX0JJVAkJCTE1CisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLX1JfVk9MCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLX1JfVk9MX0JJVAkJCTE0CisjZGVmaW5lIFJUNTYzMV9QV1JfTE9VVF9WT0wJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9MT1VUX1ZPTF9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfUFdSX1JPVVRfVk9MCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9QV1JfUk9VVF9WT0xfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX1BXUl9IUF9MX09VVF9WT0wJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2MzFfUFdSX0hQX0xfT1VUX1ZPTF9CSVQJCQkxMQorI2RlZmluZSBSVDU2MzFfUFdSX0hQX1JfT1VUX1ZPTAkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfUl9PVVRfVk9MX0JJVAkJCTEwCisjZGVmaW5lIFJUNTYzMV9QV1JfQVhJTF9JTl9WT0wJCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfUFdSX0FYSUxfSU5fVk9MX0JJVAkJCTkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWElSX0lOX1ZPTAkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWElSX0lOX1ZPTF9CSVQJCQk4CisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19JTl9QX1ZPTAkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NT05PX0lOX1BfVk9MX0JJVAkJCTcKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NT05PX0lOX05fVk9MCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfUFdSX01PTk9fSU5fTl9WT0xfQklUCQkJNgorCisvKiBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlcigweDQwKSAqLworI2RlZmluZSBSVDU2MzFfU1BLX0FNUF9BVVRPX1JBVElPX0VOCQkJKDB4MSA8PCAxNSkKKworI2RlZmluZSBSVDU2MzFfU1BLX0FNUF9SQVRJT19DVFJMX01BU0sJCSgweDcgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMl8zNAkJKDB4MCA8PCAxMikgLyogNy40MERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV85OQkJKDB4MSA8PCAxMikgLyogNS45OURCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV82OAkJKDB4MiA8PCAxMikgLyogNC41MERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV81NgkJKDB4MyA8PCAxMikgLyogMy44NkRCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV80NAkJKDB4NCA8PCAxMikgLyogMy4xNkRCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV8yNwkJKDB4NSA8PCAxMikgLyogMi4xMERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV8wOQkJKDB4NiA8PCAxMikgLyogMC44MERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV8wMAkJKDB4NyA8PCAxMikgLyogMC4wMERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfU0hJRlQJCTEyCisKKyNkZWZpbmUgUlQ1NjMxX1NURVJFT19EQUNfSElfUEFTU19GSUxUX0VOCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2MzFfU1RFUkVPX0FEQ19ISV9QQVNTX0ZJTFRfRU4JCSgweDEgPDwgMTApCisvKiBTZWxlY3QgQURDIFdpbmQgRmlsdGVyIENsb2NrIHR5cGUgKi8KKyNkZWZpbmUgUlQ1NjMxX0FEQ19XSU5EX0ZJTFRfTUFTSwkJCSgweDMgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX0FEQ19XSU5EX0ZJTFRfOF8xNl8zMksJCQkoMHgwIDw8IDQpIC8qOC8xNi8zMmsqLworI2RlZmluZSBSVDU2MzFfQURDX1dJTkRfRklMVF8xMV8yMl80NEsJCSgweDEgPDwgNCkgLyoxMS8yMi80NGsqLworI2RlZmluZSBSVDU2MzFfQURDX1dJTkRfRklMVF8xMl8yNF80OEsJCSgweDIgPDwgNCkgLyoxMi8yNC80OGsqLworI2RlZmluZSBSVDU2MzFfQURDX1dJTkRfRklMVF9FTgkJCSgweDEgPDwgMykKKy8qIFNlbGVjdEFEQyBXaW5kIEZpbHRlciBDb3JuZXIgRnJlcXVlbmN5ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV9NQVNLCSgweDcgPDwgMCkKKyNkZWZpbmUgUlQ1NjMxX0FEQ19XSU5EX0NOUl9GUkVRXzgyXzExM18xMjIJKDB4MCA8PCAwKSAvKiA4Mi8xMTMvMTIyIEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8xMDJfMTQxXzE1MyAoMHgxIDw8IDApIC8qIDEwMi8xNDEvMTUzIEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8xMzFfMTgwXzE1NiAoMHgyIDw8IDApIC8qIDEzMS8xODAvMTU2IEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8xNjNfMjI1XzI0NSAoMHgzIDw8IDApIC8qIDE2My8yMjUvMjQ1IEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8yMDRfMjgxXzMwNiAoMHg0IDw8IDApIC8qIDIwNC8yODEvMzA2IEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8yNjFfMzYwXzM5MiAoMHg1IDw8IDApIC8qIDI2MS8zNjAvMzkyIEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8zMjdfNDUwXzQ5MCAoMHg2IDw8IDApIC8qIDMyNy80NTAvNDkwIEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV80MDhfNTYzXzYxMiAoMHg3IDw8IDApIC8qIDQwOC81NjMvNjEyIEh6ICovCisKKy8qIEdsb2JhbCBDbG9jayBDb250cm9sIFJlZ2lzdGVyKDB4NDIpICovCisjZGVmaW5lIFJUNTYzMV9TWVNDTEtfU09VUl9TRUxfTUFTSwkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9TWVNDTEtfU09VUl9TRUxfTUNMSwkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9TWVNDTEtfU09VUl9TRUxfUExMCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX1NZU0NMS19TT1VSX1NFTF9QTExfVENLCQkoMHgyIDw8IDE0KQorCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfU09VUl9TRUxfTUFTSwkJCSgweDMgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfU09VUl9TRUxfTUNMSwkJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfU09VUl9TRUxfQkNMSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfU09VUl9TRUxfVkJDTEsJCQkoMHgyIDw8IDEyKQorCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfUFJFX0RJVjEJCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX1BMTENMS19QUkVfRElWMgkJCQkoMHgxIDw8IDExKQorCisvKiBQTEwgQ29udHJvbCgweDQ0KSAqLworI2RlZmluZSBSVDU2MzFfUExMX0NUUkxfTV9WQUwobSkJCQkoKG0pJjB4ZikKKyNkZWZpbmUgUlQ1NjMxX1BMTF9DVFJMX0tfVkFMKGspCQkJKCgoaykmMHg3KSA8PCA0KQorI2RlZmluZSBSVDU2MzFfUExMX0NUUkxfTl9WQUwobikJCQkoKChuKSYweGZmKSA8PCA4KQorCisvKiBJbnRlcm5hbCBTdGF0dXMgYW5kIElSUSBDb250cm9sMigweDRBKSAqLworI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX01BU0sJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX0Rpc2FibGUJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX01JQzEJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX01JQzFfU0hJRlQJCTE0CisjZGVmaW5lIFJUNTYzMV9BRENfREFUQV9TRUxfTUlDMgkJCSgweDIgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9BRENfREFUQV9TRUxfTUlDMl9TSElGVAkJMTUKKyNkZWZpbmUgUlQ1NjMxX0FEQ19EQVRBX1NFTF9TVE8JCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX1NISUZUCQkJMTQKKworLyogR1BJTyBQaW4gQ29uZmlndXJhdGlvbigweDRDKSAqLworI2RlZmluZSBSVDU2MzFfR1BJT19QSU5fRlVOX1NFTF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX0dQSU9fUElOX0ZVTl9TRUxfSVJRCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX0dQSU9fUElOX0ZVTl9TRUxfR1BJT19ESU1DCQkoMHgwIDw8IDE1KQorCisjZGVmaW5lIFJUNTYzMV9HUElPX0RNSUNfRlVOX1NFTF9NQVNLCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9HUElPX0RNSUNfRlVOX1NFTF9ESU1DCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9HUElPX0RNSUNfRlVOX1NFTF9HUElPCQkJKDB4MCA8PCAzKQorCisjZGVmaW5lIFJUNTYzMV9HUElPX1BJTl9DT05fTUFTSwkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0dQSU9fUElOX1NFVF9JTlBVVAkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0dQSU9fUElOX1NFVF9PVVRQVVQJCQkoMHgxIDw8IDIpCisKKy8qIERlLVBPUCBmdW5jdGlvbiBDb250cm9sIDEoMHg1NCkgKi8KKyNkZWZpbmUgUlQ1NjMxX1BPV19PTl9TT0ZUX0dFTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9FTl9NVVRFX1VOTVVURV9ERVBPUAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9FTl9ERVBPUDJfRk9SX0hQCQkJKDB4MSA8PCA3KQorLyogUG93ZXIgRG93biBIUEFNUF9MIFN0YXJ0cyBVcCBTaWduYWwgKi8KKyNkZWZpbmUgUlQ1NjMxX1BEX0hQQU1QX0xfU1RfVVAJCQkoMHgxIDw8IDUpCisvKiBQb3dlciBEb3duIEhQQU1QX1IgU3RhcnRzIFVwIFNpZ25hbCAqLworI2RlZmluZSBSVDU2MzFfUERfSFBBTVBfUl9TVF9VUAkJCSgweDEgPDwgNCkKKy8qIEVuYWJsZSBsZWZ0IEhQIG11dGUvdW5tdXRlIGRlcG9wICovCisjZGVmaW5lIFJUNTYzMV9FTl9IUF9MX01fVU5fTVVURV9ERVBPUAkJKDB4MSA8PCAxKQorLyogRW5hYmxlIHJpZ2h0IEhQIG11dGUvdW5tdXRlIGRlcG9wICovCisjZGVmaW5lIFJUNTYzMV9FTl9IUF9SX01fVU5fTVVURV9ERVBPUAkJKDB4MSA8PCAwKQorCisvKiBEZS1QT1AgRm5jdGlvbiBDb250cm9sKDB4NTYpICovCisjZGVmaW5lIFJUNTYzMV9FTl9PTkVfQklUX0RFUE9QCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX0VOX0NBUF9GUkVFX0RFUE9QCQkJKDB4MSA8PCAxNCkKKworLyogSmFjayBEZXRlY3QgQ29udHJvbCBSZWdpc3RlcigweDVBKSAqLworI2RlZmluZSBSVDU2MzFfSkRfVVNFX01BU0sJCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX1VTRV9KRDIJCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX1VTRV9KRDEJCQkJKDB4MiA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX1VTRV9HUElPCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9KRF9PRkYJCQkJCSgweDAgPDwgMTQpCisvKiBKRCB0cmlnZ2VyIGVuYWJsZSBmb3IgSFAgKi8KKyNkZWZpbmUgUlQ1NjMxX0pEX0hQX0VOCQkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2MzFfSkRfSFBfVFJJX01BU0sJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjMxX0pEX0hQX1RSSV9ISQkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfSkRfSFBfVFJJX0xPCQkJCSgweDEgPDwgMTApCisvKiBKRCB0cmlnZ2VyIGVuYWJsZSBmb3Igc3BlYWtlciBMUC9MTiAqLworI2RlZmluZSBSVDU2MzFfSkRfU1BLX0xfRU4JCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfSkRfU1BLX0xfVFJJX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9KRF9TUEtfTF9UUklfSEkJCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2MzFfSkRfU1BLX0xfVFJJX0xPCQkJCSgweDAgPDwgOCkKKy8qIEpEIHRyaWdnZXIgZW5hYmxlIGZvciBzcGVha2VyIFJQL1JOICovCisjZGVmaW5lIFJUNTYzMV9KRF9TUEtfUl9FTgkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9KRF9TUEtfUl9UUklfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0pEX1NQS19SX1RSSV9ISQkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9KRF9TUEtfUl9UUklfTE8JCQkJKDB4MCA8PCA2KQorLyogSkQgdHJpZ2dlciBlbmFibGUgZm9yIG1vbm9vdXQgKi8KKyNkZWZpbmUgUlQ1NjMxX0pEX01PTk9fRU4JCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2MzFfSkRfTU9OT19UUklfTUFTSwkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX01PTk9fVFJJX0hJCQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX01PTk9fVFJJX0xPCQkJCSgweDAgPDwgNCkKKy8qIEpEIHRyaWdnZXIgZW5hYmxlIGZvciBMb3V0ICovCisjZGVmaW5lIFJUNTYzMV9KRF9BVVhfMV9FTgkJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9KRF9BVVhfMV9NQVNLCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0pEX0FVWF8xX1RSSV9ISQkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9KRF9BVVhfMV9UUklfTE8JCQkJKDB4MCA8PCAyKQorLyogSkQgdHJpZ2dlciBlbmFibGUgZm9yIFJvdXQgKi8KKyNkZWZpbmUgUlQ1NjMxX0pEX0FVWF8yX0VOCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjMxX0pEX0FVWF8yX01BU0sJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBSVDU2MzFfSkRfQVVYXzJfVFJJX0hJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgUlQ1NjMxX0pEX0FVWF8yX1RSSV9MTwkJCQkoMHgwIDw8IDApCisKKy8qIEFMQyBDT05UUk9MIDEoMHg2NCkgKi8KKyNkZWZpbmUgUlQ1NjMxX0FMQ19BVFRBQ0tfUkFURV9NQVNLCQkJKDB4MUYgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX0FMQ19SRUNPVkVSWV9SQVRFX01BU0sJCSgweDFGIDw8IDApCisKKy8qIEFMQyBDT05UUk9MIDIoMHg2NSkgKi8KKy8qIHNlbGVjdCBDb21wZW5zYXRpb24gZ2FpbiBmb3IgTm9pc2UgZ2F0ZSBmdW5jdGlvbiAqLworI2RlZmluZSBSVDU2MzFfQUxDX0NPTV9OT0lTRV9HQVRFX01BU0sJCSgweEYgPDwgMCkKKworLyogQUxDIENPTlRST0wgMygweDY2KSAqLworI2RlZmluZSBSVDU2MzFfQUxDX0ZVTl9NQVNLCQkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9BTENfRlVOX0RJUwkJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQUxDX0VOQV9EQUNfUEFUSAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9BTENfRU5BX0FEQ19QQVRICQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0FMQ19QQVJBX1VQREFURQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9BTENfTElNSVRfTEVWRUxfTUFTSwkJCSgweDFGIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9BTENfTk9JU0VfR0FURV9GVU5fTUFTSwkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2MzFfQUxDX05PSVNFX0dBVEVfRlVOX0RJUwkJCSgweDAgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX0FMQ19OT0lTRV9HQVRFX0ZVTl9FTkEJCSgweDEgPDwgNykKKy8qIEFMQyBub2lzZSBnYXRlIGhvbGQgZGF0YSBmdW5jdGlvbiAqLworI2RlZmluZSBSVDU2MzFfQUxDX05PSVNFX0dBVEVfSF9EX01BU0sJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0FMQ19OT0lTRV9HQVRFX0hfRF9ESVMJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9BTENfTk9JU0VfR0FURV9IX0RfRU5BCQkoMHgxIDw8IDYpCisKKy8qIFBzZWR1ZW8gU3RlcmVvICYgU3BhdGlhbCBFZmZlY3QgQmxvY2sgQ29udHJvbCgweDY4KSAqLworI2RlZmluZSBSVDU2MzFfU1BBVElBTF9DVFJMX0VOCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9BTExfUEFTU19GSUxURVJfRU4JCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfUFNFVURPX1NURVJFT19FTgkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9TVEVSRU9fRVhQRU5TSU9OX0VOCQkJKDB4MSA8PCAxMikKKy8qIDNEIGdhaW4gcGFyYW1ldGVyICovCisjZGVmaW5lIFJUNTYzMV9HQUlOXzNEX1BBUkFfTUFTSwkJKDB4MyA8PCA2KQorI2RlZmluZSBSVDU2MzFfR0FJTl8zRF9QQVJBXzFfMDAJCSgweDAgPDwgNikgLyogM0QgZ2FpbiAxLjAgKi8KKyNkZWZpbmUgUlQ1NjMxX0dBSU5fM0RfUEFSQV8xXzUwCQkoMHgxIDw8IDYpIC8qIDNEIGdhaW4gMS41ICovCisjZGVmaW5lIFJUNTYzMV9HQUlOXzNEX1BBUkFfMl8wMAkJKDB4MiA8PCA2KSAvKiAzRCBnYWluIDIuMCAqLworLyogM0QgcmF0aW8gcGFyYW1ldGVyICovCisjZGVmaW5lIFJUNTYzMV9SQVRJT18zRF9NQVNLCQkJKDB4MyA8PCA0KQorI2RlZmluZSBSVDU2MzFfUkFUSU9fM0RfMF8wCQkJKDB4MCA8PCA0KSAvKiAzRCByYXRpbyAwLjAgKi8KKyNkZWZpbmUgUlQ1NjMxX1JBVElPXzNEXzBfNjYJCQkoMHgxIDw8IDQpIC8qIDNEIHJhdGlvIDAuNjYgKi8KKyNkZWZpbmUgUlQ1NjMxX1JBVElPXzNEXzFfMAkJCSgweDIgPDwgNCkgLyogM0QgcmF0aW8gMS4wICovCisvKiBzZWxlY3Qgc2FtcGxlcmF0ZSBmb3IgYWxsIHBhc3MgZmlsdGVyICovCisjZGVmaW5lIFJUNTYzMV9BUEZfRlVOX1NMRV9NQVNLCQkJKDB4MyA8PCAwKQorI2RlZmluZSBSVDU2MzFfQVBGX0ZVTl9TRUxfNDhLCQkJCSgweDMgPDwgMCkKKyNkZWZpbmUgUlQ1NjMxX0FQRl9GVU5fU0VMXzQ0XzFLCQkJKDB4MiA8PCAwKQorI2RlZmluZSBSVDU2MzFfQVBGX0ZVTl9TRUxfMzJLCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgUlQ1NjMxX0FQRl9GVU5fRElTCQkJCSgweDAgPDwgMCkKKworLyogRVEgQ09OVFJPTCAxKDB4NkUpICovCisjZGVmaW5lIFJUNTYzMV9IV19FUV9QQVRIX1NFTF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX0hXX0VRX1BBVEhfU0VMX0RBQwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9IV19FUV9QQVRIX1NFTF9BREMJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfSFdfRVFfVVBEQVRFX0NUUkwJCQkoMHgxIDw8IDE0KQorCisjZGVmaW5lIFJUNTYzMV9FTl9IV19FUV9IUEYyCQkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjMxX0VOX0hXX0VRX0hQRjEJCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2MzFfRU5fSFdfRVFfQlAzCQkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjMxX0VOX0hXX0VRX0JQMgkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9FTl9IV19FUV9CUDEJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2MzFfRU5fSFdfRVFfTFBGCQkJCSgweDEgPDwgMCkKKworCisjZW5kaWYgLyogX19SVENPREVDNTYzMV9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYwppbmRleCA3ZTQwNjZlLi5kMTU2OTVkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtMTMwLDE2ICsxMzEsMTMgQEAKIAljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKIAkJLyogY2hhbmdlIG1pYyBiaWFzIHJlc2lzdG9yIHRvIDRLb2htICovCiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMody0+Y29kZWMsIFNHVEw1MDAwX0NISVBfTUlDX0NUUkwsCi0JCQkJU0dUTDUwMDBfQklBU19SXzRrLCBTR1RMNTAwMF9CSUFTX1JfNGspOworCQkJCVNHVEw1MDAwX0JJQVNfUl9NQVNLLAorCQkJCVNHVEw1MDAwX0JJQVNfUl80ayA8PCBTR1RMNTAwMF9CSUFTX1JfU0hJRlQpOwogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCS8qCi0JCSAqIFNHVEw1MDAwX0JJQVNfUl84ayBhcyBtYXNrIHRvIGNsZWFuIHRoZSB0d28gYml0cwotCQkgKiBvZiBtaWMgYmlhcyBhbmQgb3V0cHV0IGltcGVkYW5jZQotCQkgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyh3LT5jb2RlYywgU0dUTDUwMDBfQ0hJUF9NSUNfQ1RSTCwKLQkJCQlTR1RMNTAwMF9CSUFTX1JfOGssIDApOworCQkJCVNHVEw1MDAwX0JJQVNfUl9NQVNLLCAwKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtNzI1LDcgKzcyMyw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfSTJTX0NUUkwsIGkyc19jdGwsIGkyc19jdGwpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfSTJTX0NUUkwsCisJCQkgICAgU0dUTDUwMDBfSTJTX0RMRU5fTUFTSyB8IFNHVEw1MDAwX0kyU19TQ0xLRlJFUV9NQVNLLAorCQkJICAgIGkyc19jdGwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NTYsNyArNzU2LDcgQEAKIAogCS8qIHNldCB2b2x0YWdlIHRvIHJlZ2lzdGVyICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU0dUTDUwMDBfQ0hJUF9MSU5SRUdfQ1RSTCwKLQkJCQkoMHgxIDw8IDQpIC0gMSwgcmVnKTsKKwkJCQlTR1RMNTAwMF9MSU5SRUdfVkRERF9NQVNLLCByZWcpOwogCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU0dUTDUwMDBfQ0hJUF9BTkFfUE9XRVIsCiAJCQkJU0dUTDUwMDBfTElORVJFR19EX1BPV0VSVVAsCkBAIC03ODIsNyArNzgyLDcgQEAKIAogCS8qIGNsZWFyIHZvbHRhZ2UgaW5mbyAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfTElOUkVHX0NUUkwsCi0JCQkJKDB4MSA8PCA0KSAtIDEsIDApOworCQkJCVNHVEw1MDAwX0xJTlJFR19WREREX01BU0ssIDApOwogCiAJbGRvLT5lbmFibGVkID0gMDsKIApAQCAtODA4LDYgKzgwOCw3IEBACiAJCQkJaW50IHZvbHRhZ2UpCiB7CiAJc3RydWN0IGxkb19yZWd1bGF0b3IgKmxkbzsKKwlzdHJ1Y3Qgc2d0bDUwMDBfcHJpdiAqc2d0bDUwMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAogCWxkbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsZG9fcmVndWxhdG9yKSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTg0Miw2ICs4NDMsNyBAQAogCiAJCXJldHVybiByZXQ7CiAJfQorCXNndGw1MDAwLT5sZG8gPSBsZG87CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExMTUsNyArMTExNyw3IEBACiAKIAkvKiBzZXQgdm9sdGFnZSB0byByZWdpc3RlciAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfTElOUkVHX0NUUkwsCi0JCQkJKDB4MSA8PCA0KSAtIDEsIDB4OCk7CisJCQkJU0dUTDUwMDBfTElOUkVHX1ZERERfTUFTSywgMHg4KTsKIAogCS8qCiAJICogaWYgdmRkZCBsaW5lYXIgcmVnIGhhcyBiZWVuIGVuYWJsZWQsCkBAIC0xMTQ2LDggKzExNDgsNyBAQAogCQl2YWcgPSAodmFnIC0gU0dUTDUwMDBfQU5BX0dORF9CQVNFKSAvIFNHVEw1MDAwX0FOQV9HTkRfU1RQOwogCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU0dUTDUwMDBfQ0hJUF9SRUZfQ1RSTCwKLQkJCXZhZyA8PCBTR1RMNTAwMF9BTkFfR05EX1NISUZULAotCQkJdmFnIDw8IFNHVEw1MDAwX0FOQV9HTkRfU0hJRlQpOworCQkJU0dUTDUwMDBfQU5BX0dORF9NQVNLLCB2YWcgPDwgU0dUTDUwMDBfQU5BX0dORF9TSElGVCk7CiAKIAkvKiBzZXQgbGluZSBvdXQgVkFHIHRvIHZkZGlvIC8gMiwgaW4gcmFuZ2UgKDAuOHYsIDEuNjc1dikgKi8KIAl2YWcgPSB2ZGRpbyAvIDI7CkBAIC0xMTYxLDkgKzExNjIsOCBAQAogCQkgICAgU0dUTDUwMDBfTElORV9PVVRfR05EX1NUUDsKIAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfTElORV9PVVRfQ1RSTCwKLQkJCXZhZyA8PCBTR1RMNTAwMF9MSU5FX09VVF9HTkRfU0hJRlQgfAotCQkJU0dUTDUwMDBfTElORV9PVVRfQ1VSUkVOVF8zNjB1IDw8Ci0JCQkJU0dUTDUwMDBfTElORV9PVVRfQ1VSUkVOVF9TSElGVCwKKwkJCVNHVEw1MDAwX0xJTkVfT1VUX0NVUlJFTlRfTUFTSyB8CisJCQlTR1RMNTAwMF9MSU5FX09VVF9HTkRfTUFTSywKIAkJCXZhZyA8PCBTR1RMNTAwMF9MSU5FX09VVF9HTkRfU0hJRlQgfAogCQkJU0dUTDUwMDBfTElORV9PVVRfQ1VSUkVOVF8zNjB1IDw8CiAJCQkJU0dUTDUwMDBfTElORV9PVVRfQ1VSUkVOVF9TSElGVCk7CkBAIC0xNDM2LDEwICsxNDM2LDE3IEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzZ3RsNTAwMF9pZCk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNndGw1MDAwX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLHNndGw1MDAwIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzZ3RsNTAwMF9kdF9pZHMpOworCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc2d0bDUwMDBfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkgICAubmFtZSA9ICJzZ3RsNTAwMCIsCiAJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICAub2ZfbWF0Y2hfdGFibGUgPSBzZ3RsNTAwMF9kdF9pZHMsCiAJCSAgIH0sCiAJLnByb2JlID0gc2d0bDUwMDBfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzZ3RsNTAwMF9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuaAppbmRleCBlZWMzYWIzLi44YTlmNDM1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5oCkBAIC0yODAsNyArMjgwLDcgQEAKIC8qCiAgKiBTR1RMNTAwMF9DSElQX01JQ19DVFJMCiAgKi8KLSNkZWZpbmUgU0dUTDUwMDBfQklBU19SX01BU0sJCQkweDAyMDAKKyNkZWZpbmUgU0dUTDUwMDBfQklBU19SX01BU0sJCQkweDAzMDAKICNkZWZpbmUgU0dUTDUwMDBfQklBU19SX1NISUZUCQkJOAogI2RlZmluZSBTR1RMNTAwMF9CSUFTX1JfV0lEVEgJCQkyCiAjZGVmaW5lIFNHVEw1MDAwX0JJQVNfUl9vZmYJCQkweDAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc245NTAzMS5jIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKaW5kZXggODRmZmRlYi4uODg3ZDYxOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pbnRlbF9zY3VfaXBjLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC03OSw3ICs4MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZmluZF9mcmVlX2NoYW5uZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKnNuOTUwMzFfY29kZWMpCiB7Ci0JaW50IHJldCA9IDAsIGksIHZhbHVlOworCWludCBpLCB2YWx1ZTsKIAogCS8qIGNoZWNrIHdoZXRoZXIgQURDIGlzIGVuYWJsZWQgKi8KIAl2YWx1ZSA9IHNuZF9zb2NfcmVhZChzbjk1MDMxX2NvZGVjLCBTTjk1MDMxX0FEQzFDTlRMMSk7CkBAIC05MSwxMiArOTIsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwJU045NTAzMV9BRENfQ0hBTkxTX01BWDsgaSsrKSB7CiAJCXZhbHVlID0gc25kX3NvY19yZWFkKHNuOTUwMzFfY29kZWMsCiAJCQkJU045NTAzMV9BRENfQ0hOTF9TVEFSVF9BRERSICsgaSk7Ci0JCWlmICh2YWx1ZSAmIFNOOTUwMzFfU1RPUEJJVF9NQVNLKSB7Ci0JCQlyZXQgPSBpOworCQlpZiAodmFsdWUgJiBTTjk1MDMxX1NUT1BCSVRfTUFTSykKIAkJCWJyZWFrOwotCQl9CiAJfQotCXJldHVybiAocmV0ID4gU045NTAzMV9BRENfTE9PUF9NQVgpID8gKC1FSU5WQUwpIDogcmV0OworCXJldHVybiAoaSA9PSBTTjk1MDMxX0FEQ19DSEFOTFNfTUFYKSA/ICgtRUlOVkFMKSA6IGk7CiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIEFEQyBmb3IgcmVhZGluZyBtaWNiaWFzIHZhbHVlcy4gQ2FuIHNsZWVwLiAqLwpAQCAtMTA0LDcgKzEwMyw3IEBACiB7CiAJaW50IGJhc2VfYWRkciwgY2hubF9hZGRyOwogCWludCB2YWx1ZTsKLQlzdGF0aWMgaW50IGNoYW5uZWxfaW5kZXg7CisJaW50IGNoYW5uZWxfaW5kZXg7CiAKIAkvKiBJbmRleCBvZiB0aGUgZmlyc3QgY2hhbm5lbCBpbiB3aGljaCB0aGUgc3RvcCBiaXQgaXMgc2V0ICovCiAJY2hhbm5lbF9pbmRleCA9IGZpbmRfZnJlZV9jaGFubmVsKHNuOTUwMzFfY29kZWMpOwpAQCAtMTYzLDcgKzE2Miw2IEBACiAJcHJfZGVidWcoIm1pYyBiaWFzID0gJWRtVlxuIiwgbWljX2JpYXMpOwogCXJldHVybiBtaWNfYmlhczsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuOTUwMzFfZ2V0X21pY19iaWFzKTsKIC8qZW5kIC0gYWRjIGhlbHBlciBmdW5jdGlvbnMgKi8KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc245NTAzMV9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKQEAgLTY2MCw3ICs2NTgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc245NTAzMV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorc3RhdGljIGludCBzbjk1MDMxX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKIAl1bnNpZ25lZCBpbnQgZm9ybWF0LCByYXRlOwpAQCAtNzE4LDcgKzcxNiw3IEBACiAJLmh3X3BhcmFtcwk9IHNuOTUwMzFfcGNtX2h3X3BhcmFtcywKIH07CiAKLXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgc245NTAzMV9kYWlzW10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzbjk1MDMxX2RhaXNbXSA9IHsKIHsKIAkubmFtZSA9ICJTTjk1MDMxIEhlYWRzZXQiLAogCS5wbGF5YmFjayA9IHsKQEAgLTgyOSw3ICs4MjcsNiBAQAogewogCXByX2RlYnVnKCJjb2RlY19wcm9iZSBjYWxsZWRcbiIpOwogCi0JY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PRkY7CiAJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CiAKIAkvKiBQQ00gaW50ZXJmYWNlIGNvbmZpZwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYwppbmRleCA5ODAxY2Q3Li4zY2IzMjcxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYwpAQCAtNTksNiArNTksNyBAQAogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc2xhdmVfc3Vic3RyZWFtOwogCiAJZW51bSBzc20yNjAyX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBpbnQgY2xrX291dF9wd3I7CiB9OwogCiAvKgpAQCAtMjk0LDcgKzI5NSw2IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNzbTI2MDJfcHJpdiAqc3NtMjYwMiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjb2RlYy0+Y29udHJvbF9kYXRhOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKm1hc3Rlcl9ydW50aW1lOwogCiAJLyogVGhlIERBSSBoYXMgc2hhcmVkIGNsb2NrcyBzbyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBwbGF5YmFjayBvcgpAQCAtMzAzLDcgKzMwMyw3IEBACiAJICovCiAJaWYgKHNzbTI2MDItPm1hc3Rlcl9zdWJzdHJlYW0pIHsKIAkJbWFzdGVyX3J1bnRpbWUgPSBzc20yNjAyLT5tYXN0ZXJfc3Vic3RyZWFtLT5ydW50aW1lOwotCQlkZXZfZGJnKCZpMmMtPmRldiwgIkNvbnN0cmFpbmluZyB0byAlZCBiaXRzIGF0ICVkSHpcbiIsCisJCWRldl9kYmcoY29kZWMtPmRldiwgIkNvbnN0cmFpbmluZyB0byAlZCBiaXRzIGF0ICVkSHpcbiIsCiAJCQltYXN0ZXJfcnVudGltZS0+c2FtcGxlX2JpdHMsCiAJCQltYXN0ZXJfcnVudGltZS0+cmF0ZSk7CiAKQEAgLTM0MywxMiArMzQzLDE0IEBACiBzdGF0aWMgaW50IHNzbTI2MDJfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKLQl1MTYgbXV0ZV9yZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFNTTTI2MDJfQVBESUdJKSAmIH5BUERJR0lfRU5BQkxFX0RBQ19NVVRFOworCiAJaWYgKG11dGUpCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFNTTTI2MDJfQVBESUdJLAotCQkJCW11dGVfcmVnIHwgQVBESUdJX0VOQUJMRV9EQUNfTVVURSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfQVBESUdJLAorCQkJCSAgICBBUERJR0lfRU5BQkxFX0RBQ19NVVRFLAorCQkJCSAgICBBUERJR0lfRU5BQkxFX0RBQ19NVVRFKTsKIAllbHNlCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFNTTTI2MDJfQVBESUdJLCBtdXRlX3JlZyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfQVBESUdJLAorCQkJCSAgICBBUERJR0lfRU5BQkxFX0RBQ19NVVRFLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzU3LDE2ICszNTksNDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOwogCXN0cnVjdCBzc20yNjAyX3ByaXYgKnNzbTI2MDIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzd2l0Y2ggKGZyZXEpIHsKLQljYXNlIDExMjg5NjAwOgotCWNhc2UgMTIwMDAwMDA6Ci0JY2FzZSAxMjI4ODAwMDoKLQljYXNlIDE2OTM0NDAwOgotCWNhc2UgMTg0MzIwMDA6Ci0JCXNzbTI2MDItPnN5c2NsayA9IGZyZXE7Ci0JCXJldHVybiAwOworCisJaWYgKGRpciA9PSBTTkRfU09DX0NMT0NLX0lOKSB7CisJCWlmIChjbGtfaWQgIT0gU1NNMjYwMl9TWVNDTEspCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKGZyZXEpIHsKKwkJY2FzZSAxMTI4OTYwMDoKKwkJY2FzZSAxMjAwMDAwMDoKKwkJY2FzZSAxMjI4ODAwMDoKKwkJY2FzZSAxNjkzNDQwMDoKKwkJY2FzZSAxODQzMjAwMDoKKwkJCXNzbTI2MDItPnN5c2NsayA9IGZyZXE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IG1hc2s7CisKKwkJc3dpdGNoIChjbGtfaWQpIHsKKwkJY2FzZSBTU00yNjAyX0NMS19DTEtPVVQ6CisJCQltYXNrID0gUFdSX0NMS19PVVRfUEROOworCQkJYnJlYWs7CisJCWNhc2UgU1NNMjYwMl9DTEtfWFRPOgorCQkJbWFzayA9IFBXUl9PU0NfUEROOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChmcmVxID09IDApCisJCQlzc20yNjAyLT5jbGtfb3V0X3B3ciB8PSBtYXNrOworCQllbHNlCisJCQlzc20yNjAyLT5jbGtfb3V0X3B3ciAmPSB+bWFzazsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTU00yNjAyX1BXUiwKKwkJCVBXUl9DTEtfT1VUX1BETiB8IFBXUl9PU0NfUEROLCBzc20yNjAyLT5jbGtfb3V0X3B3cik7CiAJfQotCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc3NtMjYwMl9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKQEAgLTQzMSwyMyArNDYzLDI3IEBACiBzdGF0aWMgaW50IHNzbTI2MDJfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKLQl1MTYgcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBTU00yNjAyX1BXUik7Ci0JcmVnICY9IH4oUFdSX1BPV0VSX09GRiB8IFBXUl9PU0NfUEROKTsKKwlzdHJ1Y3Qgc3NtMjYwMl9wcml2ICpzc20yNjAyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046Ci0JCS8qIHZyZWYvbWlkLCBvc2Mgb24sIGRhYyB1bm11dGUgKi8KLQkJc25kX3NvY193cml0ZShjb2RlYywgU1NNMjYwMl9QV1IsIHJlZyk7CisJCS8qIHZyZWYvbWlkIG9uLCBvc2MgYW5kIGNsa291dCBvbiBpZiBlbmFibGVkICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfUFdSLAorCQkJUFdSX1BPV0VSX09GRiB8IFBXUl9DTEtfT1VUX1BETiB8IFBXUl9PU0NfUEROLAorCQkJc3NtMjYwMi0+Y2xrX291dF9wd3IpOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQkvKiBldmVyeXRoaW5nIG9mZiBleGNlcHQgdnJlZi92bWlkLCAqLwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTU00yNjAyX1BXUiwgcmVnIHwgUFdSX0NMS19PVVRfUEROKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU1NNMjYwMl9QV1IsCisJCQlQV1JfUE9XRVJfT0ZGIHwgUFdSX0NMS19PVVRfUEROIHwgUFdSX09TQ19QRE4sCisJCQlQV1JfQ0xLX09VVF9QRE4gfCBQV1JfT1NDX1BETik7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJLyogZXZlcnl0aGluZyBvZmYsIGRhYyBtdXRlLCBpbmFjdGl2ZSAqLwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTU00yNjAyX1BXUiwgMHhmZmZmKTsKKwkJLyogZXZlcnl0aGluZyBvZmYgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU1NNMjYwMl9QV1IsCisJCQlQV1JfUE9XRVJfT0ZGLCBQV1JfUE9XRVJfT0ZGKTsKIAkJYnJlYWs7CiAKIAl9CkBAIC01MDYsMTIgKzU0MiwxMiBAQAogc3RhdGljIGludCBzc20yNjAyX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0JaW50IHJldCwgcmVnOworCWludCByZXQ7CiAKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFNTTTI2MDJfTE9VVDFWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTU00yNjAyX0xPVVQxViwgcmVnIHwgTE9VVDFWX0xSSFBfQk9USCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBTU00yNjAyX1JPVVQxVik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgU1NNMjYwMl9ST1VUMVYsIHJlZyB8IFJPVVQxVl9STEhQX0JPVEgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfTE9VVDFWLAorCQkJICAgIExPVVQxVl9MUkhQX0JPVEgsIExPVVQxVl9MUkhQX0JPVEgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfUk9VVDFWLAorCQkJICAgIFJPVVQxVl9STEhQX0JPVEgsIFJPVVQxVl9STEhQX0JPVEgpOwogCiAJcmV0ID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHNzbTI2MDJfc25kX2NvbnRyb2xzLAogCQkJQVJSQVlfU0laRShzc20yNjAyX3NuZF9jb250cm9scykpOwpAQCAtNTQ0LDcgKzU4MCw3IEBACiBzdGF0aWMgaW50IHNzbTI2MHhfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBzc20yNjAyX3ByaXYgKnNzbTI2MDIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0LCByZWc7CisJaW50IHJldDsKIAogCXByX2luZm8oInNzbTI2MDIgQXVkaW8gQ29kZWMgJXMiLCBTU00yNjAyX1ZFUlNJT04pOwogCkBAIC01NjEsMTAgKzU5NywxMCBAQAogCX0KIAogCS8qIHNldCB0aGUgdXBkYXRlIGJpdHMgKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFNTTTI2MDJfTElOVk9MKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTU00yNjAyX0xJTlZPTCwgcmVnIHwgTElOVk9MX0xSSU5fQk9USCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBTU00yNjAyX1JJTlZPTCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgU1NNMjYwMl9SSU5WT0wsIHJlZyB8IFJJTlZPTF9STElOX0JPVEgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfTElOVk9MLAorCQkJICAgIExJTlZPTF9MUklOX0JPVEgsIExJTlZPTF9MUklOX0JPVEgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfUklOVk9MLAorCQkJICAgIFJJTlZPTF9STElOX0JPVEgsIFJJTlZPTF9STElOX0JPVEgpOwogCS8qc2VsZWN0IExpbmUgaW4gYXMgZGVmYXVsdCBpbnB1dCovCiAJc25kX3NvY193cml0ZShjb2RlYywgU1NNMjYwMl9BUEFOQSwgQVBBTkFfU0VMRUNUX0RBQyB8CiAJCQlBUEFOQV9FTkFCTEVfTUlDX0JPT1NUKTsKQEAgLTU3OCw3ICs2MTQsMTIgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3NtMjYwMl9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIHJlbW92ZSBldmVyeXRoaW5nIGhlcmUgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5oIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKaW5kZXggYjk4YzY5MS4uZmJkMDdkNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKQEAgLTExNiw2ICsxMTYsMTAgQEAKIAogI2RlZmluZSBTU00yNjAyX0NBQ0hFUkVHTlVNIAkxMAogCi0jZGVmaW5lIFNTTTI2MDJfU1lTQ0xLCTAKK2VudW0gc3NtMjYwMl9jbGsgeworCVNTTTI2MDJfU1lTQ0xLLAorCVNTTTI2MDJfQ0xLX0NMS09VVCwKKwlTU00yNjAyX0NMS19YVE8KK307CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmMKaW5kZXggZmJkN2ViOS4uYmI4MjQwOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jCkBAIC01MjQsMTMgKzUyNCwxNyBAQAogCXJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwogCXByX2RlYnVnKCJyYXRlOiAldVxuIiwgcmF0ZSk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50ZXJwb2xhdGlvbl9yYXRpb3MpOyBpKyspCi0JCWlmIChpbnRlcnBvbGF0aW9uX3JhdGlvc1tpXS5mcyA9PSByYXRlKQorCQlpZiAoaW50ZXJwb2xhdGlvbl9yYXRpb3NbaV0uZnMgPT0gcmF0ZSkgewogCQkJaXIgPSBpbnRlcnBvbGF0aW9uX3JhdGlvc1tpXS5pcjsKKwkJCWJyZWFrOworCQl9CiAJaWYgKGlyIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZm9yIChpID0gMDsgbWNsa19yYXRpb3NbaXJdW2ldLnJhdGlvOyBpKyspCi0JCWlmIChtY2xrX3JhdGlvc1tpcl1baV0ucmF0aW8gKiByYXRlID09IHN0YTMyeC0+bWNsaykKKwkJaWYgKG1jbGtfcmF0aW9zW2lyXVtpXS5yYXRpbyAqIHJhdGUgPT0gc3RhMzJ4LT5tY2xrKSB7CiAJCQltY3MgPSBtY2xrX3JhdGlvc1tpcl1baV0ubWNzOworCQkJYnJlYWs7CisJCX0KIAlpZiAobWNzIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTc1MiwyNSArNzU2LDE5IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogcmVhZCByZWcgcmVzZXQgdmFsdWVzIGludG8gY2FjaGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgU1RBMzJYX1JFR0lTVEVSX0NPVU5UOyBpKyspCi0JCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIGksIHN0YTMyeF9yZWdzW2ldKTsKLQotCS8qIHByZXNlcnZlIHJlc2V0IHZhbHVlcyBvZiByZXNlcnZlZCByZWdpc3RlciBiaXRzICovCi0Jc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0NPTkZDLAotCQkJICAgIGNvZGVjLT5od19yZWFkKGNvZGVjLCBTVEEzMlhfQ09ORkMpKTsKLQlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ09ORkUsCi0JCQkgICAgY29kZWMtPmh3X3JlYWQoY29kZWMsIFNUQTMyWF9DT05GRSkpOwotCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9DT05GRiwKLQkJCSAgICBjb2RlYy0+aHdfcmVhZChjb2RlYywgU1RBMzJYX0NPTkZGKSk7Ci0Jc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX01NVVRFLAotCQkJICAgIGNvZGVjLT5od19yZWFkKGNvZGVjLCBTVEEzMlhfTU1VVEUpKTsKLQlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQVVUTzEsCi0JCQkgICAgY29kZWMtPmh3X3JlYWQoY29kZWMsIFNUQTMyWF9BVVRPMSkpOwotCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9BVVRPMywKLQkJCSAgICBjb2RlYy0+aHdfcmVhZChjb2RlYywgU1RBMzJYX0FVVE8zKSk7Ci0Jc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0MzQ0ZHLAotCQkJICAgIGNvZGVjLT5od19yZWFkKGNvZGVjLCBTVEEzMlhfQzNDRkcpKTsKKwkvKiBDaGlwIGRvY3VtZW50YXRpb24gZXhwbGljaXRseSByZXF1aXJlcyB0aGF0IHRoZSByZXNldCB2YWx1ZXMKKwkgKiBvZiByZXNlcnZlZCByZWdpc3RlciBiaXRzIGFyZSBsZWZ0IHVudG91Y2hlZC4KKwkgKiBXcml0ZSB0aGUgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZSB0byBjYWNoZSBmb3IgcmVzZXJ2ZWQgcmVnaXN0ZXJzLAorCSAqIHNvIHRoZSB3cml0ZSB0byB0aGUgdGhlc2UgcmVnaXN0ZXJzIGFyZSBzdXBwcmVzc2VkIGJ5IHRoZSBjYWNoZQorCSAqIHJlc3RvcmUgY29kZSB3aGVuIGl0IHNraXBzIHdyaXRlcyBvZiBkZWZhdWx0IHJlZ2lzdGVycy4KKwkgKi8KKwlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ09ORkMsIDB4YzIpOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9DT05GRSwgMHhjMik7CisJc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0NPTkZGLCAweDVjKTsKKwlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfTU1VVEUsIDB4MTApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9BVVRPMSwgMHg2MCk7CisJc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0FVVE8zLCAweDAwKTsKKwlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQzNDRkcsIDB4NDApOwogCiAJLyogRklYTUUgZW5hYmxlIHRoZXJtYWwgd2FybmluZyBhZGp1c3RtZW50IGFuZCByZWNvdmVyeSAgKi8KIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTVEEzMlhfQ09ORkEsCkBAIC04MDgsNiArODA2LDcgQEAKIHsKIAlzdHJ1Y3Qgc3RhMzJ4X3ByaXYgKnN0YTMyeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCisJc3RhMzJ4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKIAlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUoc3RhMzJ4LT5zdXBwbGllcyksIHN0YTMyeC0+c3VwcGxpZXMpOwogCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7CiAKQEAgLTgzMiw2ICs4MzEsNyBAQAogCS5yZXN1bWUgPQkJc3RhMzJ4X3Jlc3VtZSwKIAkucmVnX2NhY2hlX3NpemUgPQlTVEEzMlhfUkVHSVNURVJfQ09VTlQsCiAJLnJlZ193b3JkX3NpemUgPQlzaXplb2YodTgpLAorCS5yZWdfY2FjaGVfZGVmYXVsdCA9CXN0YTMyeF9yZWdzLAogCS52b2xhdGlsZV9yZWdpc3RlciA9CXN0YTMyeF9yZWdfaXNfdm9sYXRpbGUsCiAJLnNldF9iaWFzX2xldmVsID0Jc3RhMzJ4X3NldF9iaWFzX2xldmVsLAogCS5jb250cm9scyA9CQlzdGEzMnhfc25kX2NvbnRyb2xzLApAQCAtODY3LDE4ICs4NjcsOCBAQAogc3RhdGljIF9fZGV2ZXhpdCBpbnQgc3RhMzJ4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3Qgc3RhMzJ4X3ByaXYgKnN0YTMyeCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHN0YTMyeC0+Y29kZWM7CiAKLQlpZiAoY29kZWMpCi0JCXN0YTMyeF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7Ci0KLQlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUoc3RhMzJ4LT5zdXBwbGllcyksIHN0YTMyeC0+c3VwcGxpZXMpOwotCi0JaWYgKGNvZGVjKSB7Ci0JCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOwotCQlzbmRfc29jX2NvZGVjX3NldF9kcnZkYXRhKGNvZGVjLCBOVUxMKTsKLQl9Ci0KKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKIAlrZnJlZShzdGEzMngpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCmluZGV4IDMzYmI1MmYuLjMzNmRlOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKQEAgLTQ3LDYzICs0Nyw2IEBACiAJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAkvKiAxMiAqLwogfTsKIAotLyoKLSAqIHJlYWQgdGx2MzIwYWljMjMgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMKLQkJCQkJCSAgICAgICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKLXsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpZiAocmVnID49IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfcmVnKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBjYWNoZVtyZWddOwotfQotCi0vKgotICogd3JpdGUgdGx2MzIwYWljMjMgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHRsdjMyMGFpYzIzX3dyaXRlX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgICAgICB1OCByZWcsIHUxNiB2YWx1ZSkKLXsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpZiAocmVnID49IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfcmVnKSkKLQkJcmV0dXJuOwotCWNhY2hlW3JlZ10gPSB2YWx1ZTsKLX0KLQotLyoKLSAqIHdyaXRlIHRvIHRoZSB0bHYzMjBhaWMyMyByZWdpc3RlciBzcGFjZQotICovCi1zdGF0aWMgaW50IHRsdjMyMGFpYzIzX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKLQkJCSAgICAgdW5zaWduZWQgaW50IHZhbHVlKQotewotCi0JdTggZGF0YVsyXTsKLQotCS8qIFRMVjMyMEFJQzIzIGhhcyA3IGJpdCBhZGRyZXNzIGFuZCA5IGJpdHMgb2YgZGF0YQotCSAqIHNvIHdlIG5lZWQgdG8gc3dpdGNoIG9uZSBkYXRhIGJpdCBpbnRvIHJlZyBhbmQgcmVzdAotCSAqIG9mIGRhdGEgaW50byB2YWwKLQkgKi8KLQotCWlmIChyZWcgPiA5ICYmIHJlZyAhPSAxNSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBJbnZhbGlkIHJlZ2lzdGVyIFIldVxuIiwgX19mdW5jX18sIHJlZyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlkYXRhWzBdID0gKHJlZyA8PCAxKSB8ICh2YWx1ZSA+PiA4ICYgMHgwMSk7Ci0JZGF0YVsxXSA9IHZhbHVlICYgMHhmZjsKLQotCXRsdjMyMGFpYzIzX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgcmVnLCB2YWx1ZSk7Ci0KLQlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpCi0JCXJldHVybiAwOwotCi0JcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3Qgd3JpdGUgJTAzeCB0byByZWdpc3RlciBSJXVcbiIsIF9fZnVuY19fLAotCSAgICAgICB2YWx1ZSwgcmVnKTsKLQotCXJldHVybiAtRUlPOwotfQotCiBzdGF0aWMgY29uc3QgY2hhciAqcmVjX3NyY190ZXh0W10gPSB7ICJMaW5lIiwgIk1pYyIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICpkZWVtcGhfdGV4dFtdID0geyJOb25lIiwgIjMyS2h6IiwgIjQ0LjFLaHoiLCAiNDhLaHoifTsKIApAQCAtMTM5LDggKzgyLDggQEAKIAkqLwogCXZhbCA9ICh2YWwgPj0gNCkgPyA0ICA6ICgzIC0gdmFsKTsKIAotCXJlZyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19BTkxHKSAmICh+MHgxQzApOwotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BTkxHLCByZWcgfCAodmFsIDw8IDYpKTsKKwlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFRMVjMyMEFJQzIzX0FOTEcpICYgKH4weDFDMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQU5MRywgcmVnIHwgKHZhbCA8PCA2KSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MSw3ICs5NCw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXUxNiB2YWw7CiAKLQl2YWwgPSB0bHYzMjBhaWMyM19yZWFkX3JlZ19jYWNoZShjb2RlYywgVExWMzIwQUlDMjNfQU5MRykgJiAoMHgxQzApOworCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgVExWMzIwQUlDMjNfQU5MRykgJiAoMHgxQzApOwogCXZhbCA9IHZhbCA+PiA2OwogCXZhbCA9ICh2YWwgPj0gNCkgPyA0ICA6ICgzIC0gIHZhbCk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWw7CkBAIC0xNTksMTUgKzEwMiw2IEBACiAKIH0KIAotI2RlZmluZSBTT0NfVExWMzIwQUlDMjNfU0lOR0xFX1RMVih4bmFtZSwgcmVnLCBzaGlmdCwgbWF4LCBpbnZlcnQsIHRsdl9hcnJheSkgXAotewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfFwKLQkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsXAotCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCi0JLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIC5nZXQgPSBzbmRfc29jX3RsdjMyMGFpYzIzX2dldF92b2xzdyxcCi0JLnB1dCA9IHNuZF9zb2NfdGx2MzIwYWljMjNfcHV0X3ZvbHN3LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAgU09DX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGx2MzIwYWljMjNfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLCBUTFYzMjBBSUMyM19MQ0hOVk9MLAogCQkJIFRMVjMyMEFJQzIzX1JDSE5WT0wsIDAsIDEyNywgMCwgb3V0X2dhaW5fdGx2KSwKQEAgLTE3OCw4ICsxMTIsOSBAQAogCQkJIFRMVjMyMEFJQzIzX1JJTlZPTCwgMCwgMzEsIDAsIGlucHV0X2dhaW5fdGx2KSwKIAlTT0NfU0lOR0xFKCJNaWMgSW5wdXQgU3dpdGNoIiwgVExWMzIwQUlDMjNfQU5MRywgMSwgMSwgMSksCiAJU09DX1NJTkdMRSgiTWljIEJvb3N0ZXIgU3dpdGNoIiwgVExWMzIwQUlDMjNfQU5MRywgMCwgMSwgMCksCi0JU09DX1RMVjMyMEFJQzIzX1NJTkdMRV9UTFYoIlNpZGV0b25lIFZvbHVtZSIsIFRMVjMyMEFJQzIzX0FOTEcsCi0JCQkJICA2LCA0LCAwLCBzaWRldG9uZV92b2xfdGx2KSwKKwlTT0NfU0lOR0xFX0VYVF9UTFYoIlNpZGV0b25lIFZvbHVtZSIsIFRMVjMyMEFJQzIzX0FOTEcsIDYsIDQsIDAsCisJCQkgICBzbmRfc29jX3RsdjMyMGFpYzIzX2dldF92b2xzdywKKwkJCSAgIHNuZF9zb2NfdGx2MzIwYWljMjNfcHV0X3ZvbHN3LCBzaWRldG9uZV92b2xfdGx2KSwKIAlTT0NfRU5VTSgiUGxheWJhY2sgRGUtZW1waGFzaXMiLCB0bHYzMjBhaWMyM19kZWVtcGgpLAogfTsKIApAQCAtMjQwLDcgKzE3NSw2IEBACiAvKiBBSUMyMyBkcml2ZXIgZGF0YSAqLwogc3RydWN0IGFpYzIzIHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJaW50IG1jbGs7CiAJaW50IHJlcXVlc3RlZF9hZGM7CiAJaW50IHJlcXVlc3RlZF9kYWM7CkBAIC0zNTIsNyArMjg2LDcgQEAKIHN0YXRpYyB2b2lkIGdldF9jdXJyZW50X3NhbXBsZV9yYXRlcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBtY2xrLAogCQl1MzIgKnNhbXBsZV9yYXRlX2FkYywgdTMyICpzYW1wbGVfcmF0ZV9kYWMpCiB7Ci0JaW50IHNyYyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19TUkFURSk7CisJaW50IHNyYyA9IHNuZF9zb2NfcmVhZChjb2RlYywgVExWMzIwQUlDMjNfU1JBVEUpOwogCWludCBzciA9IChzcmMgPj4gMikgJiAweDBmOwogCWludCB2YWwgPSAobWNsayAvIGJvc3JfdXNiX2Rpdmlzb3JfdGFibGVbc3JjICYgM10pOwogCWludCBhZGMgPSAodmFsICogc3JfYWRjX211bHRfdGFibGVbc3JdKSAvIFNSX01VTFQ7CkBAIC0zNzYsNyArMzEwLDcgQEAKIAkJCQlfX2Z1bmNfXywgc2FtcGxlX3JhdGVfYWRjLCBzYW1wbGVfcmF0ZV9kYWMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX1NSQVRFLCBkYXRhKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19TUkFURSwgZGF0YSk7CiAjaWZkZWYgREVCVUcKIAl7CiAJCXUzMiBhZGMsIGRhYzsKQEAgLTQxNSw5ICszNDksOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWZhY2VfcmVnID0KLQkgICAgdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsCi0JCQkJICAgICAgIFRMVjMyMEFJQzIzX0RJR1RfRk1UKSAmIH4oMHgwMyA8PCAyKTsKKwlpZmFjZV9yZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1UKSAmIH4oMHgwMyA8PCAyKTsKKwogCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKIAkJYnJlYWs7CkBAIC00MzEsNyArMzY0LDcgQEAKIAkJaWZhY2VfcmVnIHw9ICgweDAzIDw8IDIpOwogCQlicmVhazsKIAl9Ci0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1ULCBpZmFjZV9yZWcpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1ULCBpZmFjZV9yZWcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NDMsNyArMzc2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCiAJLyogc2V0IGFjdGl2ZSAqLwotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BQ1RJVkUsIDB4MDAwMSk7CisJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQUNUSVZFLCAweDAwMDEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTgsNyArMzkxLDcgQEAKIAkvKiBkZWFjdGl2YXRlICovCiAJaWYgKCFjb2RlYy0+YWN0aXZlKSB7CiAJCXVkZWxheSg1MCk7Ci0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BQ1RJVkUsIDB4MCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0FDVElWRSwgMHgwKTsKIAl9CiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCiAJCWFpYzIzLT5yZXF1ZXN0ZWRfZGFjID0gMDsKQEAgLTQ3MSwxNCArNDA0LDE0IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAl1MTYgcmVnOwogCi0JcmVnID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1QpOworCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgVExWMzIwQUlDMjNfRElHVCk7CiAJaWYgKG11dGUpCiAJCXJlZyB8PSBUTFYzMjBBSUMyM19EQUNNX01VVEU7CiAKIAllbHNlCiAJCXJlZyAmPSB+VExWMzIwQUlDMjNfREFDTV9NVVRFOwogCi0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1QsIHJlZyk7CisJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfRElHVCwgcmVnKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDg5LDggKzQyMiw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKIAl1MTYgaWZhY2VfcmVnOwogCi0JaWZhY2VfcmVnID0KLQkgICAgdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1UKSAmICh+MHgwMyk7CisJaWZhY2VfcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdUX0ZNVCkgJiAofjB4MDMpOwogCiAJLyogc2V0IG1hc3Rlci9zbGF2ZSBhdWRpbyBpbnRlcmZhY2UgKi8KIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CkBAIC00OTgsNiArNDMwLDcgQEAKIAkJaWZhY2VfcmVnIHw9IFRMVjMyMEFJQzIzX01TX01BU1RFUjsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlpZmFjZV9yZWcgJj0gflRMVjMyMEFJQzIzX01TX01BU1RFUjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01MjQsNyArNDU3LDcgQEAKIAogCX0KIAotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdUX0ZNVCwgaWZhY2VfcmVnKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdUX0ZNVCwgaWZhY2VfcmVnKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTQwLDI2ICs0NzMsMjYgQEAKIHN0YXRpYyBpbnQgdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCSAgICAgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewotCXUxNiByZWcgPSB0bHYzMjBhaWMyM19yZWFkX3JlZ19jYWNoZShjb2RlYywgVExWMzIwQUlDMjNfUFdSKSAmIDB4ZmY3ZjsKKwl1MTYgcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IpICYgMHhmZjdmOwogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgogCQkvKiB2cmVmL21pZCwgb3NjIG9uLCBkYWMgdW5tdXRlICovCiAJCXJlZyAmPSB+KFRMVjMyMEFJQzIzX0RFVklDRV9QV1JfT0ZGIHwgVExWMzIwQUlDMjNfT1NDX09GRiB8IFwKIAkJCVRMVjMyMEFJQzIzX0RBQ19PRkYpOwotCQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfUFdSLCByZWcpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsIHJlZyk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCS8qIGV2ZXJ5dGhpbmcgb2ZmIGV4Y2VwdCB2cmVmL3ZtaWQsICovCi0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsIHJlZyB8IFwKLQkJCVRMVjMyMEFJQzIzX0NMS19PRkYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsCisJCQkgICAgICByZWcgfCBUTFYzMjBBSUMyM19DTEtfT0ZGKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgogCQkvKiBldmVyeXRoaW5nIG9mZiwgZGFjIG11dGUsIGluYWN0aXZlICovCi0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BQ1RJVkUsIDB4MCk7Ci0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsIDB4ZmZmZik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0FDVElWRSwgMHgwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfUFdSLCAweGZmZmYpOwogCQlicmVhazsKIAl9CiAJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwpAQCAtNjA2LDEzICs1MzksNyBAQAogCiBzdGF0aWMgaW50IHRsdjMyMGFpYzIzX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JdTE2IHJlZzsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChyZWcgPSAwOyByZWcgPD0gVExWMzIwQUlDMjNfQUNUSVZFOyByZWcrKykgewotCQl1MTYgdmFsID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIHJlZyk7Ci0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCByZWcsIHZhbCk7Ci0JfQorCXNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CiAJdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAogCXJldHVybiAwOwpAQCAtNjIxLDQ2ICs1NDgsNTIgQEAKIHN0YXRpYyBpbnQgdGx2MzIwYWljMjNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhaWMyMyAqYWljMjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmVnOworCWludCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBSUMyMyBBdWRpbyBDb2RlYyAlc1xuIiwgQUlDMjNfVkVSU0lPTik7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFpYzIzLT5jb250cm9sX2RhdGE7Ci0JY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotCWNvZGVjLT5od19yZWFkID0gTlVMTDsKKworCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBhaWMyMy0+Y29udHJvbF90eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyogUmVzZXQgY29kZWMgKi8KLQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfUkVTRVQsIDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX1JFU0VULCAwKTsKKworCS8qIFdyaXRlIHRoZSByZWdpc3RlciBkZWZhdWx0IHZhbHVlIHRvIGNhY2hlIGZvciByZXNlcnZlZCByZWdpc3RlcnMsCisJICogc28gdGhlIHdyaXRlIHRvIHRoZSB0aGVzZSByZWdpc3RlcnMgYXJlIHN1cHByZXNzZWQgYnkgdGhlIGNhY2hlCisJICogcmVzdG9yZSBjb2RlIHdoZW4gaXQgc2tpcHMgd3JpdGVzIG9mIGRlZmF1bHQgcmVnaXN0ZXJzLgorCSAqLworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEEsIDApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEIsIDApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEMsIDApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEQsIDApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEUsIDApOwogCiAJLyogcG93ZXIgb24gZGV2aWNlICovCiAJdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdULCBUTFYzMjBBSUMyM19ERUVNUF80NEspOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1QsIFRMVjMyMEFJQzIzX0RFRU1QXzQ0Syk7CiAKIAkvKiBVbm11dGUgaW5wdXQgKi8KLQlyZWcgPSB0bHYzMjBhaWMyM19yZWFkX3JlZ19jYWNoZShjb2RlYywgVExWMzIwQUlDMjNfTElOVk9MKTsKLQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfTElOVk9MLAotCQkJICAocmVnICYgKH5UTFYzMjBBSUMyM19MSU1fTVVURUQpKSB8Ci0JCQkgIChUTFYzMjBBSUMyM19MUlNfRU5BQkxFRCkpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRMVjMyMEFJQzIzX0xJTlZPTCwKKwkJCSAgICBUTFYzMjBBSUMyM19MSU1fTVVURUQsIFRMVjMyMEFJQzIzX0xSU19FTkFCTEVEKTsKIAotCXJlZyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19SSU5WT0wpOwotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SSU5WT0wsCi0JCQkgIChyZWcgJiAoflRMVjMyMEFJQzIzX0xJTV9NVVRFRCkpIHwKLQkJCSAgVExWMzIwQUlDMjNfTFJTX0VOQUJMRUQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRMVjMyMEFJQzIzX1JJTlZPTCwKKwkJCSAgICBUTFYzMjBBSUMyM19MSU1fTVVURUQsIFRMVjMyMEFJQzIzX0xSU19FTkFCTEVEKTsKIAotCXJlZyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19BTkxHKTsKLQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQU5MRywKLQkJCSAocmVnKSAmICh+VExWMzIwQUlDMjNfQllQQVNTX09OKSAmCi0JCQkgKH5UTFYzMjBBSUMyM19NSUNNX01VVEVEKSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVExWMzIwQUlDMjNfQU5MRywKKwkJCSAgICBUTFYzMjBBSUMyM19CWVBBU1NfT04gfCBUTFYzMjBBSUMyM19NSUNNX01VVEVELAorCQkJICAgIDApOwogCiAJLyogRGVmYXVsdCBvdXRwdXQgdm9sdW1lICovCi0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0xDSE5WT0wsCi0JCQkgIFRMVjMyMEFJQzIzX0RFRkFVTFRfT1VUX1ZPTCAmCi0JCQkgIFRMVjMyMEFJQzIzX09VVF9WT0xfTUFTSyk7Ci0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX1JDSE5WT0wsCi0JCQkgIFRMVjMyMEFJQzIzX0RFRkFVTFRfT1VUX1ZPTCAmCi0JCQkgIFRMVjMyMEFJQzIzX09VVF9WT0xfTUFTSyk7CisJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfTENITlZPTCwKKwkJICAgICAgVExWMzIwQUlDMjNfREVGQVVMVF9PVVRfVk9MICYgVExWMzIwQUlDMjNfT1VUX1ZPTF9NQVNLKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SQ0hOVk9MLAorCQkgICAgICBUTFYzMjBBSUMyM19ERUZBVUxUX09VVF9WT0wgJiBUTFYzMjBBSUMyM19PVVRfVk9MX01BU0spOwogCi0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0FDVElWRSwgMHgxKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BQ1RJVkUsIDB4MSk7CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdGx2MzIwYWljMjNfc25kX2NvbnRyb2xzLAogCQkJCUFSUkFZX1NJWkUodGx2MzIwYWljMjNfc25kX2NvbnRyb2xzKSk7CkBAIC02ODIsOCArNjE1LDYgQEAKIAkucmVtb3ZlID0gdGx2MzIwYWljMjNfcmVtb3ZlLAogCS5zdXNwZW5kID0gdGx2MzIwYWljMjNfc3VzcGVuZCwKIAkucmVzdW1lID0gdGx2MzIwYWljMjNfcmVzdW1lLAotCS5yZWFkID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUsCi0JLndyaXRlID0gdGx2MzIwYWljMjNfd3JpdGUsCiAJLnNldF9iaWFzX2xldmVsID0gdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwsCiAJLmRhcG1fd2lkZ2V0cyA9IHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSwKQEAgLTcxMCw3ICs2NDEsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGFpYzIzKTsKLQlhaWMyMy0+Y29udHJvbF9kYXRhID0gaTJjOwogCWFpYzIzLT5jb250cm9sX3R5cGUgPSBTTkRfU09DX0kyQzsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzJ4NC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMKaW5kZXggZTkzYjlkMS4uYjIxYzYxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMKQEAgLTUyOCw0MCArNTI4LDMzIEBACiAJCQkJICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKIAlzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTggdmFsdWU7CiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046CiAJCWlmIChhaWMzMng0LT5tYXN0ZXIpIHsKIAkJCS8qIFN3aXRjaCBvbiBQTEwgKi8KLQkJCXZhbHVlID0gc25kX3NvY19yZWFkKGNvZGVjLCBBSUMzMlg0X1BMTFBSKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfUExMUFIsCi0JCQkJICAgICAgKHZhbHVlIHwgQUlDMzJYNF9QTExFTikpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9QTExQUiwKKwkJCQkJICAgIEFJQzMyWDRfUExMRU4sIEFJQzMyWDRfUExMRU4pOwogCiAJCQkvKiBTd2l0Y2ggb24gTkRBQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9OREFDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTkRBQywKLQkJCQkgICAgICB2YWx1ZSB8IEFJQzMyWDRfTkRBQ0VOKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTkRBQywKKwkJCQkJICAgIEFJQzMyWDRfTkRBQ0VOLCBBSUMzMlg0X05EQUNFTik7CiAKIAkJCS8qIFN3aXRjaCBvbiBNREFDIERpdmlkZXIgKi8KLQkJCXZhbHVlID0gc25kX3NvY19yZWFkKGNvZGVjLCBBSUMzMlg0X01EQUMpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzJYNF9NREFDLAotCQkJCSAgICAgIHZhbHVlIHwgQUlDMzJYNF9NREFDRU4pOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9NREFDLAorCQkJCQkgICAgQUlDMzJYNF9NREFDRU4sIEFJQzMyWDRfTURBQ0VOKTsKIAogCQkJLyogU3dpdGNoIG9uIE5BREMgRGl2aWRlciAqLwotCQkJdmFsdWUgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFJQzMyWDRfTkFEQyk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMlg0X05BREMsCi0JCQkJICAgICAgdmFsdWUgfCBBSUMzMlg0X01EQUNFTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X05BREMsCisJCQkJCSAgICBBSUMzMlg0X05BRENFTiwgQUlDMzJYNF9OQURDRU4pOwogCiAJCQkvKiBTd2l0Y2ggb24gTUFEQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9NQURDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTUFEQywKLQkJCQkgICAgICB2YWx1ZSB8IEFJQzMyWDRfTURBQ0VOKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTUFEQywKKwkJCQkJICAgIEFJQzMyWDRfTUFEQ0VOLCBBSUMzMlg0X01BRENFTik7CiAKIAkJCS8qIFN3aXRjaCBvbiBCQ0xLX04gRGl2aWRlciAqLwotCQkJdmFsdWUgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFJQzMyWDRfQkNMS04pOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzJYNF9CQ0xLTiwKLQkJCQkgICAgICB2YWx1ZSB8IEFJQzMyWDRfQkNMS0VOKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfQkNMS04sCisJCQkJCSAgICBBSUMzMlg0X0JDTEtFTiwgQUlDMzJYNF9CQ0xLRU4pOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CkBAIC01NjksMzQgKzU2MiwyOCBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCWlmIChhaWMzMng0LT5tYXN0ZXIpIHsKIAkJCS8qIFN3aXRjaCBvZmYgUExMICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9QTExQUik7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMlg0X1BMTFBSLAotCQkJCSAgICAgICh2YWx1ZSAmIH5BSUMzMlg0X1BMTEVOKSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X1BMTFBSLAorCQkJCQkgICAgQUlDMzJYNF9QTExFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgTkRBQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9OREFDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTkRBQywKLQkJCQkgICAgICB2YWx1ZSAmIH5BSUMzMlg0X05EQUNFTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X05EQUMsCisJCQkJCSAgICBBSUMzMlg0X05EQUNFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgTURBQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9NREFDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTURBQywKLQkJCQkgICAgICB2YWx1ZSAmIH5BSUMzMlg0X01EQUNFTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X01EQUMsCisJCQkJCSAgICBBSUMzMlg0X01EQUNFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgTkFEQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9OQURDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTkFEQywKLQkJCQkgICAgICB2YWx1ZSAmIH5BSUMzMlg0X05EQUNFTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X05BREMsCisJCQkJCSAgICBBSUMzMlg0X05BRENFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgTUFEQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9NQURDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTUFEQywKLQkJCQkgICAgICB2YWx1ZSAmIH5BSUMzMlg0X01EQUNFTik7Ci0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9CQ0xLTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X01BREMsCisJCQkJCSAgICBBSUMzMlg0X01BRENFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgQkNMS19OIERpdmlkZXIgKi8KLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfQkNMS04sCi0JCQkJICAgICAgdmFsdWUgJiB+QUlDMzJYNF9CQ0xLRU4pOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9CQ0xLTiwKKwkJCQkJICAgIEFJQzMyWDRfQkNMS0VOLCAwKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CkBAIC02ODUsMTAgKzY3MiwxMCBAQAogCX0KIAogCS8qIE1pYyBQR0Egcm91dGluZyAqLwotCWlmIChhaWMzMng0LT5taWNwZ2Ffcm91dGluZyB8IEFJQzMyWDRfTUlDUEdBX1JPVVRFX0xNSUNfSU4yUl8xMEspIHsKKwlpZiAoYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgJiBBSUMzMlg0X01JQ1BHQV9ST1VURV9MTUlDX0lOMlJfMTBLKSB7CiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTE1JQ1BHQU5JTiwgQUlDMzJYNF9MTUlDUEdBTklOX0lOMlJfMTBLKTsKIAl9Ci0JaWYgKGFpYzMyeDQtPm1pY3BnYV9yb3V0aW5nIHwgQUlDMzJYNF9NSUNQR0FfUk9VVEVfUk1JQ19JTjFMXzEwSykgeworCWlmIChhaWMzMng0LT5taWNwZ2Ffcm91dGluZyAmIEFJQzMyWDRfTUlDUEdBX1JPVVRFX1JNSUNfSU4xTF8xMEspIHsKIAkJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzJYNF9STUlDUEdBTklOLCBBSUMzMlg0X1JNSUNQR0FOSU5fSU4xTF8xMEspOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCmluZGV4IDA5NjNjNGMuLjg3ZDVlZjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKQEAgLTc2LDcgKzc2LDYgQEAKIAlzdHJ1Y3QgYWljM3hfZGlzYWJsZV9uYiBkaXNhYmxlX25iW0FJQzNYX05VTV9TVVBQTElFU107CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJc3RydWN0IGFpYzN4X3NldHVwX2RhdGEgKnNldHVwOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlpbnQgbWFzdGVyOwpAQCAtMTM4LDcgKzEzNywxMCBAQAogCWlmIChyZWcgPj0gQUlDM1hfQ0FDSEVSRUdOVU0pCiAJCXJldHVybiAtMTsKIAotCSp2YWx1ZSA9IGNvZGVjLT5od19yZWFkKGNvZGVjLCByZWcpOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAxOworCSp2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKTsKKwljb2RlYy0+Y2FjaGVfYnlwYXNzID0gMDsKKwogCWNhY2hlW3JlZ10gPSAqdmFsdWU7CiAKIAlyZXR1cm4gMDsKQEAgLTE5OCw2ICsyMDAsMTAgQEAKIAkJCWVsc2UKIAkJCQkvKiBvbGQgY29ubmVjdGlvbiBtdXN0IGJlIHBvd2VyZWQgZG93biAqLwogCQkJCXBhdGgtPmNvbm5lY3QgPSBpbnZlcnQgPyAxIDogMDsKKworCQkJZGFwbV9tYXJrX2RpcnR5KHBhdGgtPnNvdXJjZSwgInRsdjMyMGFpYzN4IHNvdXJjZSIpOworCQkJZGFwbV9tYXJrX2RpcnR5KHBhdGgtPnNpbmssICJ0bHYzMjBhaWMzeCBzaW5rIik7CisKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTEwMTcsNiArMTAyMyw3IEBACiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKIAkJYWljM3gtPm1hc3RlciA9IDA7CisJCWlmYWNlX2FyZWcgJj0gfihCSVRfQ0xLX01BU1RFUiB8IFdPUkRfQ0xLX01BU1RFUik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTM4Myw3ICsxMzkwLDYgQEAKIAlpbnQgcmV0LCBpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmFpYzN4LT5saXN0KTsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gYWljM3gtPmNvbnRyb2xfZGF0YTsKIAlhaWMzeC0+Y29kZWMgPSBjb2RlYzsKIAljb2RlYy0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gMTsKIApAQCAtMTQ5NSw5ICsxNTAxLDkgQEAKICAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWljM3hfaTJjX2lkW10gPSB7Ci0JW0FJQzNYX01PREVMXzNYXSA9IHsgInRsdjMyMGFpYzN4IiwgMCB9LAotCVtBSUMzWF9NT0RFTF8zM10gPSB7ICJ0bHYzMjBhaWMzMyIsIDAgfSwKLQlbQUlDM1hfTU9ERUxfMzAwN10gPSB7ICJ0bHYzMjBhaWMzMDA3IiwgMCB9LAorCXsgInRsdjMyMGFpYzN4IiwgQUlDM1hfTU9ERUxfM1ggfSwKKwl7ICJ0bHYzMjBhaWMzMyIsIEFJQzNYX01PREVMXzMzIH0sCisJeyAidGx2MzIwYWljMzAwNyIsIEFJQzNYX01PREVMXzMwMDcgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWljM3hfaTJjX2lkKTsKQEAgLTE1MTIsNyArMTUxOCw2IEBACiAJc3RydWN0IGFpYzN4X3BkYXRhICpwZGF0YSA9IGkyYy0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGFpYzN4X3ByaXYgKmFpYzN4OwogCWludCByZXQ7Ci0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKnRibDsKIAogCWFpYzN4ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFpYzN4X3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoYWljM3ggPT0gTlVMTCkgewpAQCAtMTUyMCw3ICsxNTI1LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JYWljM3gtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAlhaWMzeC0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBhaWMzeCk7CkBAIC0xNTMxLDExICsxNTM1LDcgQEAKIAkJYWljM3gtPmdwaW9fcmVzZXQgPSAtMTsKIAl9CiAKLQlmb3IgKHRibCA9IGFpYzN4X2kyY19pZDsgdGJsLT5uYW1lWzBdOyB0YmwrKykgewotCQlpZiAoIXN0cmNtcCh0YmwtPm5hbWUsIGlkLT5uYW1lKSkKLQkJCWJyZWFrOwotCX0KLQlhaWMzeC0+bW9kZWwgPSB0YmwgLSBhaWMzeF9pMmNfaWQ7CisJYWljM3gtPm1vZGVsID0gaWQtPmRyaXZlcl9kYXRhOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCiAJCQkmc29jX2NvZGVjX2Rldl9haWMzeCwgJmFpYzN4X2RhaSwgMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMKaW5kZXggZmFhNWU5Zi4uZGM4YTJiMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYwpAQCAtNTUsMTMgKzU1LDEzIEBACiAjZGVmaW5lIEJVUlNUX0JBU0VGUkVRX0haCTQ5MTUyMDAwCiAKICNkZWZpbmUgU0FNUExFU19UT19VUyhyYXRlLCBzYW1wbGVzKSBcCi0JKDEwMDAwMDAwMDAgLyAoKHJhdGUgKiAxMDAwKSAvIHNhbXBsZXMpKQorCSgxMDAwMDAwMDAwIC8gKCgocmF0ZSkgKiAxMDAwKSAvIChzYW1wbGVzKSkpCiAKICNkZWZpbmUgVVNfVE9fU0FNUExFUyhyYXRlLCB1cykgXAotCShyYXRlIC8gKDEwMDAwMDAgLyAodXMgPCAxMDAwMDAwID8gdXMgOiAxMDAwMDAwKSkpCisJKChyYXRlKSAvICgxMDAwMDAwIC8gKCh1cykgPCAxMDAwMDAwID8gKHVzKSA6IDEwMDAwMDApKSkKIAogI2RlZmluZSBVVEhSX0ZST01fUEVSSU9EX1NJWkUoc2FtcGxlcywgcGxheXJhdGUsIGJ1cnN0cmF0ZSkgXAotCSgoc2FtcGxlcyAqIDUwMDApIC8gKChidXJzdHJhdGUgKiA1MDAwKSAvIChidXJzdHJhdGUgLSBwbGF5cmF0ZSkpKQorCSgoKHNhbXBsZXMpKjUwMDApIC8gKCgoYnVyc3RyYXRlKSo1MDAwKSAvICgoYnVyc3RyYXRlKSAtIChwbGF5cmF0ZSkpKSkKIAogc3RhdGljIHZvaWQgZGFjMzNfY2FsY3VsYXRlX3RpbWVzKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIHN0YXRpYyBpbnQgZGFjMzNfcHJlcGFyZV9jaGlwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKQEAgLTYyNywxOCArNjI3LDYgQEAKIAl7IlJJR0hUX0xPIiwgTlVMTCwgIkNvZGVjIFBvd2VyIn0sCiB9OwogCi1zdGF0aWMgaW50IGRhYzMzX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGRhYzMzX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoZGFjMzNfZGFwbV93aWRnZXRzKSk7Ci0JLyogc2V0IHVwIGF1ZGlvIHBhdGggaW50ZXJjb25uZWN0cyAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGRhYzMzX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKQEAgLTE0MzEsNyArMTQxOSw3IEBACiAJLyogQ2hlY2sgaWYgdGhlIElSUSBudW1iZXIgaXMgdmFsaWQgYW5kIHJlcXVlc3QgaXQgKi8KIAlpZiAoZGFjMzMtPmlycSA+PSAwKSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKGRhYzMzLT5pcnEsIGRhYzMzX2ludGVycnVwdF9oYW5kbGVyLAotCQkJCSAgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfRElTQUJMRUQsCisJCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HLAogCQkJCSAgY29kZWMtPm5hbWUsIGNvZGVjKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoY29kZWMtPmRldiwgIkNvdWxkIG5vdCByZXF1ZXN0IElSUSVkICglZClcbiIsCkBAIC0xNDUxLDE1ICsxNDM5LDExIEBACiAJCX0KIAl9CiAKLQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgZGFjMzNfc25kX2NvbnRyb2xzLAotCQkJICAgICBBUlJBWV9TSVpFKGRhYzMzX3NuZF9jb250cm9scykpOwogCS8qIE9ubHkgYWRkIHRoZSBGSUZPIGNvbnRyb2xzLCBpZiB3ZSBoYXZlIHZhbGlkIElSUSBudW1iZXIgKi8KIAlpZiAoZGFjMzMtPmlycSA+PSAwKQogCQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgZGFjMzNfbW9kZV9zbmRfY29udHJvbHMsCiAJCQkJICAgICBBUlJBWV9TSVpFKGRhYzMzX21vZGVfc25kX2NvbnRyb2xzKSk7CiAKLQlkYWMzM19hZGRfd2lkZ2V0cyhjb2RlYyk7Ci0KIGVycl9wb3dlcjoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTUwMiw2ICsxNDg2LDEzIEBACiAJLnJlbW92ZSA9IGRhYzMzX3NvY19yZW1vdmUsCiAJLnN1c3BlbmQgPSBkYWMzM19zb2Nfc3VzcGVuZCwKIAkucmVzdW1lID0gZGFjMzNfc29jX3Jlc3VtZSwKKworCS5jb250cm9scyA9IGRhYzMzX3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShkYWMzM19zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBkYWMzM19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGRhYzMzX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiAjZGVmaW5lIERBQzMzX1JBVEVTCShTTkRSVl9QQ01fUkFURV80NDEwMCB8IFwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RwYTYxMzBhMi5jCmluZGV4IDIzOWUwYzQuLjdlZWNhNzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90cGE2MTMwYTIuYwpAQCAtMzMsNiArMzMsMTEgQEAKIAogI2luY2x1ZGUgInRwYTYxMzBhMi5oIgogCitlbnVtIHRwYV9tb2RlbCB7CisJVFBBNjEzMEEyLAorCVRQQTYxNDBBMiwKK307CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqdHBhNjEzMGEyX2NsaWVudDsKIAogLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBzYXZlIHRoZSBjb250ZXh0ICovCkBAIC0zODMsNyArMzg4LDcgQEAKIAogCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlkYXRhLT5wb3dlcl9ncGlvID0gcGRhdGEtPnBvd2VyX2dwaW87Ci0JZGF0YS0+aWQgPSBwZGF0YS0+aWQ7CisJZGF0YS0+aWQgPSBpZC0+ZHJpdmVyX2RhdGE7CiAKIAltdXRleF9pbml0KCZkYXRhLT5tdXRleCk7CiAKQEAgLTQwNSw3ICs0MTAsNyBAQAogCXN3aXRjaCAoZGF0YS0+aWQpIHsKIAlkZWZhdWx0OgogCQlkZXZfd2FybihkZXYsICJVbmtub3duIFRQQSBtb2RlbCAoJWQpLiBBc3N1bWluZyA2MTMwQTJcbiIsCi0JCQkgcGRhdGEtPmlkKTsKKwkJCSBkYXRhLT5pZCk7CiAJY2FzZSBUUEE2MTMwQTI6CiAJCXJlZ3VsYXRvciA9ICJWZGQiOwogCQlicmVhazsKQEAgLTQ0Niw3ICs0NTEsNiBAQAogCQlncGlvX2ZyZWUoZGF0YS0+cG93ZXJfZ3Bpbyk7CiBlcnJfZ3BpbzoKIAlrZnJlZShkYXRhKTsKLQlpMmNfc2V0X2NsaWVudGRhdGEodHBhNjEzMGEyX2NsaWVudCwgTlVMTCk7CiAJdHBhNjEzMGEyX2NsaWVudCA9IE5VTEw7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNDcwLDcgKzQ3NCw4IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0cGE2MTMwYTJfaWRbXSA9IHsKLQl7ICJ0cGE2MTMwYTIiLCAwIH0sCisJeyAidHBhNjEzMGEyIiwgVFBBNjEzMEEyIH0sCisJeyAidHBhNjE0MGEyIiwgVFBBNjE0MEEyIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRwYTYxMzBhMl9pZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCmluZGV4IDcxNjc0YmUuLmY3OTgyNDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCkBAIC04NjMsMzQgKzg2Myw2IEBACiAgKiBJbnZlcnRpbmcgbm90IGdvaW5nIHRvIGhlbHAgd2l0aCB0aGVzZS4KICAqIEN1c3RvbSB2b2xzdyBhbmQgdm9sc3dfMnIgZ2V0L3B1dCBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoZXNlIGdhaW4gYml0cy4KICAqLwotI2RlZmluZSBTT0NfRE9VQkxFX1RMVl9UV0w0MDMwKHhuYW1lLCB4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgeG1heCxcCi0JCQkgICAgICAgeGludmVydCwgdGx2X2FycmF5KSBcCi17CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksXAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfFwKLQkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsXAotCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCi0JLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKLQkuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3dfdHdsNDAzMCwgXAotCS5wdXQgPSBzbmRfc29jX3B1dF92b2xzd190d2w0MDMwLCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCxcCi0JCSAubWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9IH0KLSNkZWZpbmUgU09DX0RPVUJMRV9SX1RMVl9UV0w0MDMwKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtYXgsXAotCQkJCSB4aW52ZXJ0LCB0bHZfYXJyYXkpIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8XAotCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSxcCi0JLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAotCS5nZXQgPSBzbmRfc29jX2dldF92b2xzd19yMl90d2w0MDMwLFwKLQkucHV0ID0gc25kX3NvY19wdXRfdm9sc3dfcjJfdHdsNDAzMCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKLQkJey5yZWcgPSByZWdfbGVmdCwgLnJyZWcgPSByZWdfcmlnaHQsIC5zaGlmdCA9IHhzaGlmdCwgXAotCQkgLnJzaGlmdCA9IHhzaGlmdCwgLm1heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9Ci0jZGVmaW5lIFNPQ19TSU5HTEVfVExWX1RXTDQwMzAoeG5hbWUsIHhyZWcsIHhzaGlmdCwgeG1heCwgeGludmVydCwgdGx2X2FycmF5KSBcCi0JU09DX0RPVUJMRV9UTFZfVFdMNDAzMCh4bmFtZSwgeHJlZywgeHNoaWZ0LCB4c2hpZnQsIHhtYXgsIFwKLQkJCSAgICAgICB4aW52ZXJ0LCB0bHZfYXJyYXkpCi0KIHN0YXRpYyBpbnQgc25kX3NvY19nZXRfdm9sc3dfdHdsNDAzMChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKQEAgLTExOTcsMTkgKzExNjksMjMgQEAKIAkJVFdMNDAzMF9SRUdfVkRMX0FQR0FfQ1RMLCAxLCAxLCAwKSwKIAogCS8qIFNlcGFyYXRlIG91dHB1dCBnYWluIGNvbnRyb2xzICovCi0JU09DX0RPVUJMRV9SX1RMVl9UV0w0MDMwKCJQcmVEcml2IFBsYXliYWNrIFZvbHVtZSIsCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIlByZURyaXYgUGxheWJhY2sgVm9sdW1lIiwKIAkJVFdMNDAzMF9SRUdfUFJFRExfQ1RMLCBUV0w0MDMwX1JFR19QUkVEUl9DVEwsCi0JCTQsIDMsIDAsIG91dHB1dF90dmwpLAorCQk0LCAzLCAwLCBzbmRfc29jX2dldF92b2xzd19yMl90d2w0MDMwLAorCQlzbmRfc29jX3B1dF92b2xzd19yMl90d2w0MDMwLCBvdXRwdXRfdHZsKSwKIAotCVNPQ19ET1VCTEVfVExWX1RXTDQwMzAoIkhlYWRzZXQgUGxheWJhY2sgVm9sdW1lIiwKLQkJVFdMNDAzMF9SRUdfSFNfR0FJTl9TRVQsIDAsIDIsIDMsIDAsIG91dHB1dF90dmwpLAorCVNPQ19ET1VCTEVfRVhUX1RMVigiSGVhZHNldCBQbGF5YmFjayBWb2x1bWUiLAorCQlUV0w0MDMwX1JFR19IU19HQUlOX1NFVCwgMCwgMiwgMywgMCwgc25kX3NvY19nZXRfdm9sc3dfdHdsNDAzMCwKKwkJc25kX3NvY19wdXRfdm9sc3dfdHdsNDAzMCwgb3V0cHV0X3R2bCksCiAKLQlTT0NfRE9VQkxFX1JfVExWX1RXTDQwMzAoIkNhcmtpdCBQbGF5YmFjayBWb2x1bWUiLAorCVNPQ19ET1VCTEVfUl9FWFRfVExWKCJDYXJraXQgUGxheWJhY2sgVm9sdW1lIiwKIAkJVFdMNDAzMF9SRUdfUFJFQ0tMX0NUTCwgVFdMNDAzMF9SRUdfUFJFQ0tSX0NUTCwKLQkJNCwgMywgMCwgb3V0cHV0X3R2bCksCisJCTQsIDMsIDAsIHNuZF9zb2NfZ2V0X3ZvbHN3X3IyX3R3bDQwMzAsCisJCXNuZF9zb2NfcHV0X3ZvbHN3X3IyX3R3bDQwMzAsIG91dHB1dF90dmwpLAogCi0JU09DX1NJTkdMRV9UTFZfVFdMNDAzMCgiRWFycGllY2UgUGxheWJhY2sgVm9sdW1lIiwKLQkJVFdMNDAzMF9SRUdfRUFSX0NUTCwgNCwgMywgMCwgb3V0cHV0X2Vhcl90dmwpLAorCVNPQ19TSU5HTEVfRVhUX1RMVigiRWFycGllY2UgUGxheWJhY2sgVm9sdW1lIiwKKwkJVFdMNDAzMF9SRUdfRUFSX0NUTCwgNCwgMywgMCwgc25kX3NvY19nZXRfdm9sc3dfdHdsNDAzMCwKKwkJc25kX3NvY19wdXRfdm9sc3dfdHdsNDAzMCwgb3V0cHV0X2Vhcl90dmwpLAogCiAJLyogQ29tbW9uIGNhcHR1cmUgZ2FpbiBjb250cm9scyAqLwogCVNPQ19ET1VCTEVfUl9UTFYoIlRYMSBEaWdpdGFsIENhcHR1cmUgVm9sdW1lIiwKQEAgLTE2MzMsMTcgKzE2MDksNiBAQAogCiB9OwogCi1zdGF0aWMgaW50IHR3bDQwMzBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdHdsNDAzMF9kYXBtX3dpZGdldHMsCi0JCQkJIEFSUkFZX1NJWkUodHdsNDAzMF9kYXBtX3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgdHdsNDAzMF9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkJICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKQEAgLTIyNjUsOSArMjIzMCw2IEBACiAKIAl0d2w0MDMwX2luaXRfY2hpcChjb2RlYyk7CiAKLQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdHdsNDAzMF9zbmRfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRSh0d2w0MDMwX3NuZF9jb250cm9scykpOwotCXR3bDQwMzBfYWRkX3dpZGdldHMoY29kZWMpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjkzLDYgKzIyNTUsMTMgQEAKIAkucmVnX2NhY2hlX3NpemUgPSBzaXplb2YodHdsNDAzMF9yZWcpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHU4KSwKIAkucmVnX2NhY2hlX2RlZmF1bHQgPSB0d2w0MDMwX3JlZywKKworCS5jb250cm9scyA9IHR3bDQwMzBfc25kX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHR3bDQwMzBfc25kX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gdHdsNDAzMF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHR3bDQwMzBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBpbnRlcmNvbiwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShpbnRlcmNvbiksCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0d2w0MDMwX2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCmluZGV4IDQ0MzAzMmIuLjczZTExZjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCkBAIC01Nyw2ICs1NywxMyBAQAogI2RlZmluZSBUV0w2MDQwX0hGX1ZPTF9NQVNLCTB4MUYKICNkZWZpbmUgVFdMNjA0MF9IRl9WT0xfU0hJRlQJMAogCisvKiBTaGFkb3cgcmVnaXN0ZXIgdXNlZCBieSB0aGUgZHJpdmVyICovCisjZGVmaW5lIFRXTDYwNDBfUkVHX1NXX1NIQURPVwkweDJGCisjZGVmaW5lIFRXTDYwNDBfQ0FDSEVSRUdOVU0JKFRXTDYwNDBfUkVHX1NXX1NIQURPVyArIDEpCisKKy8qIFRXTDYwNDBfUkVHX1NXX1NIQURPVyAoMHgyRikgZmllbGRzICovCisjZGVmaW5lIFRXTDYwNDBfRUFSX1BBVEhfRU5BQkxFCTB4MDEKKwogc3RydWN0IHR3bDYwNDBfb3V0cHV0IHsKIAl1MTYgYWN0aXZlOwogCXUxNiBsZWZ0X3ZvbDsKQEAgLTY1LDEyICs3MiwxMyBAQAogCXUxNiByaWdodF9zdGVwOwogCXVuc2lnbmVkIGludCBzdGVwX2RlbGF5OwogCXUxNiByYW1wOwotCXUxNiBtdXRlOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3QgY29tcGxldGlvbiByYW1wX2RvbmU7CiB9OwogCiBzdHJ1Y3QgdHdsNjA0MF9qYWNrX2RhdGEgewogCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCWludCByZXBvcnQ7CiB9OwogCkBAIC03OSw3ICs4Nyw2IEBACiAJaW50IHBsdWdfaXJxOwogCWludCBjb2RlY19wb3dlcmVkOwogCWludCBwbGw7Ci0JaW50IG5vbl9scDsKIAlpbnQgcGxsX3Bvd2VyX21vZGU7CiAJaW50IGhzX3Bvd2VyX21vZGU7CiAJaW50IGhzX3Bvd2VyX21vZGVfbG9ja2VkOwpAQCAtOTIsMTA0ICs5OSw2OCBAQAogCXN0cnVjdCB0d2w2MDQwX2phY2tfZGF0YSBoc19qYWNrOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOwogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgaGVhZHNldDsKIAlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgaGFuZHNmcmVlOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpoZl93b3JrcXVldWU7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmhzX3dvcmtxdWV1ZTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGhzX2RlbGF5ZWRfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGhmX2RlbGF5ZWRfd29yazsKIH07CiAKIC8qCiAgKiB0d2w2MDQwIHJlZ2lzdGVyIGNhY2hlICYgZGVmYXVsdCByZWdpc3RlciBzZXR0aW5ncwogICovCiBzdGF0aWMgY29uc3QgdTggdHdsNjA0MF9yZWdbVFdMNjA0MF9DQUNIRVJFR05VTV0gPSB7Ci0JMHgwMCwgLyogbm90IHVzZWQJCTB4MDAJKi8KLQkweDRCLCAvKiBUV0w2MDQwX0FTSUNJRCAocm8pCTB4MDEJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0FTSUNSRVYgKHJvKQkweDAyCSovCi0JMHgwMCwgLyogVFdMNjA0MF9JTlRJRAkJMHgwMwkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSU5UTVIJCTB4MDQJKi8KLQkweDAwLCAvKiBUV0w2MDQwX05DUENUUkwJMHgwNQkqLwotCTB4MDAsIC8qIFRXTDYwNDBfTERPQ1RMCQkweDA2CSovCi0JMHg2MCwgLyogVFdMNjA0MF9IUFBMTENUTAkweDA3CSovCi0JMHgwMCwgLyogVFdMNjA0MF9MUFBMTENUTAkweDA4CSovCi0JMHg0QSwgLyogVFdMNjA0MF9MUFBMTERJVgkweDA5CSovCi0JMHgwMCwgLyogVFdMNjA0MF9BTUlDQkNUTAkweDBBCSovCi0JMHgwMCwgLyogVFdMNjA0MF9ETUlDQkNUTAkweDBCCSovCi0JMHgxOCwgLyogVFdMNjA0MF9NSUNMQ1RMCTB4MEMJLSBObyBpbnB1dCBzZWxlY3RlZCBvbiBMZWZ0IE1pYyAqLwotCTB4MTgsIC8qIFRXTDYwNDBfTUlDUkNUTAkweDBECS0gTm8gaW5wdXQgc2VsZWN0ZWQgb24gUmlnaHQgTWljICovCi0JMHgwMCwgLyogVFdMNjA0MF9NSUNHQUlOCTB4MEUJKi8KLQkweDFCLCAvKiBUV0w2MDQwX0xJTkVHQUlOCTB4MEYJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0hTTENUTAkJMHgxMAkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSFNSQ1RMCQkweDExCSovCi0JMHgwMCwgLyogVFdMNjA0MF9IU0dBSU4JCTB4MTIJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0VBUkNUTAkJMHgxMwkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSEZMQ1RMCQkweDE0CSovCi0JMHgwMCwgLyogVFdMNjA0MF9IRkxHQUlOCTB4MTUJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0hGUkNUTAkJMHgxNgkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSEZSR0FJTgkweDE3CSovCi0JMHgwMCwgLyogVFdMNjA0MF9WSUJDVExMCTB4MTgJKi8KLQkweDAwLCAvKiBUV0w2MDQwX1ZJQkRBVEwJMHgxOQkqLwotCTB4MDAsIC8qIFRXTDYwNDBfVklCQ1RMUgkweDFBCSovCi0JMHgwMCwgLyogVFdMNjA0MF9WSUJEQVRSCTB4MUIJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0hLQ1RMMQkJMHgxQwkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSEtDVEwyCQkweDFECSovCi0JMHgwMCwgLyogVFdMNjA0MF9HUE9DVEwJCTB4MUUJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0FMQgkJMHgxRgkqLwotCTB4MDAsIC8qIFRXTDYwNDBfRExCCQkweDIwCSovCi0JMHgwMCwgLyogbm90IHVzZWQJCTB4MjEJKi8KLQkweDAwLCAvKiBub3QgdXNlZAkJMHgyMgkqLwotCTB4MDAsIC8qIG5vdCB1c2VkCQkweDIzCSovCi0JMHgwMCwgLyogbm90IHVzZWQJCTB4MjQJKi8KLQkweDAwLCAvKiBub3QgdXNlZAkJMHgyNQkqLwotCTB4MDAsIC8qIG5vdCB1c2VkCQkweDI2CSovCi0JMHgwMCwgLyogbm90IHVzZWQJCTB4MjcJKi8KLQkweDAwLCAvKiBUV0w2MDQwX1RSSU0xCQkweDI4CSovCi0JMHgwMCwgLyogVFdMNjA0MF9UUklNMgkJMHgyOQkqLwotCTB4MDAsIC8qIFRXTDYwNDBfVFJJTTMJCTB4MkEJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0hTT1RSSU0JMHgyQgkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSEZPVFJJTQkweDJDCSovCi0JMHgwOSwgLyogVFdMNjA0MF9BQ0NDVEwJCTB4MkQJKi8KLQkweDAwLCAvKiBUV0w2MDQwX1NUQVRVUyAocm8pCTB4MkUJKi8KKwkweDAwLCAvKiBub3QgdXNlZAkweDAwCSovCisJMHg0QiwgLyogUkVHX0FTSUNJRAkweDAxIChybykgKi8KKwkweDAwLCAvKiBSRUdfQVNJQ1JFVgkweDAyIChybykgKi8KKwkweDAwLCAvKiBSRUdfSU5USUQJMHgwMwkqLworCTB4MDAsIC8qIFJFR19JTlRNUgkweDA0CSovCisJMHgwMCwgLyogUkVHX05DUENUUkwJMHgwNQkqLworCTB4MDAsIC8qIFJFR19MRE9DVEwJMHgwNgkqLworCTB4NjAsIC8qIFJFR19IUFBMTENUTAkweDA3CSovCisJMHgwMCwgLyogUkVHX0xQUExMQ1RMCTB4MDgJKi8KKwkweDRBLCAvKiBSRUdfTFBQTExESVYJMHgwOQkqLworCTB4MDAsIC8qIFJFR19BTUlDQkNUTAkweDBBCSovCisJMHgwMCwgLyogUkVHX0RNSUNCQ1RMCTB4MEIJKi8KKwkweDAwLCAvKiBSRUdfTUlDTENUTAkweDBDCSovCisJMHgwMCwgLyogUkVHX01JQ1JDVEwJMHgwRAkqLworCTB4MDAsIC8qIFJFR19NSUNHQUlOCTB4MEUJKi8KKwkweDFCLCAvKiBSRUdfTElORUdBSU4JMHgwRgkqLworCTB4MDAsIC8qIFJFR19IU0xDVEwJMHgxMAkqLworCTB4MDAsIC8qIFJFR19IU1JDVEwJMHgxMQkqLworCTB4MDAsIC8qIFJFR19IU0dBSU4JMHgxMgkqLworCTB4MDAsIC8qIFJFR19FQVJDVEwJMHgxMwkqLworCTB4MDAsIC8qIFJFR19IRkxDVEwJMHgxNAkqLworCTB4MDAsIC8qIFJFR19IRkxHQUlOCTB4MTUJKi8KKwkweDAwLCAvKiBSRUdfSEZSQ1RMCTB4MTYJKi8KKwkweDAwLCAvKiBSRUdfSEZSR0FJTgkweDE3CSovCisJMHgwMCwgLyogUkVHX1ZJQkNUTEwJMHgxOAkqLworCTB4MDAsIC8qIFJFR19WSUJEQVRMCTB4MTkJKi8KKwkweDAwLCAvKiBSRUdfVklCQ1RMUgkweDFBCSovCisJMHgwMCwgLyogUkVHX1ZJQkRBVFIJMHgxQgkqLworCTB4MDAsIC8qIFJFR19IS0NUTDEJMHgxQwkqLworCTB4MDAsIC8qIFJFR19IS0NUTDIJMHgxRAkqLworCTB4MDAsIC8qIFJFR19HUE9DVEwJMHgxRQkqLworCTB4MDAsIC8qIFJFR19BTEIJMHgxRgkqLworCTB4MDAsIC8qIFJFR19ETEIJMHgyMAkqLworCTB4MDAsIC8qIG5vdCB1c2VkCTB4MjEJKi8KKwkweDAwLCAvKiBub3QgdXNlZAkweDIyCSovCisJMHgwMCwgLyogbm90IHVzZWQJMHgyMwkqLworCTB4MDAsIC8qIG5vdCB1c2VkCTB4MjQJKi8KKwkweDAwLCAvKiBub3QgdXNlZAkweDI1CSovCisJMHgwMCwgLyogbm90IHVzZWQJMHgyNgkqLworCTB4MDAsIC8qIG5vdCB1c2VkCTB4MjcJKi8KKwkweDAwLCAvKiBSRUdfVFJJTTEJMHgyOAkqLworCTB4MDAsIC8qIFJFR19UUklNMgkweDI5CSovCisJMHgwMCwgLyogUkVHX1RSSU0zCTB4MkEJKi8KKwkweDAwLCAvKiBSRUdfSFNPVFJJTQkweDJCCSovCisJMHgwMCwgLyogUkVHX0hGT1RSSU0JMHgyQwkqLworCTB4MDksIC8qIFJFR19BQ0NDVEwJMHgyRAkqLworCTB4MDAsIC8qIFJFR19TVEFUVVMJMHgyRSAocm8pICovCisKKwkweDAwLCAvKiBSRUdfU1dfU0hBRE9XCTB4MkYgLSBTaGFkb3csIG5vbiBIVyByZWdpc3RlciAqLwogfTsKIAotLyoKLSAqIHR3bDYwNDAgdmlvL2duZCByZWdpc3RlcnM6Ci0gKiByZWdpc3RlcnMgdW5kZXIgdmlvL2duZCBzdXBwbHkgY2FuIGJlIGFjY2Vzc2VkCi0gKiBiZWZvcmUgdGhlIHBvd2VyLXVwIHNlcXVlbmNlLCBhZnRlciBOUkVTUFdST04gZ29lcyBoaWdoCi0gKi8KLXN0YXRpYyBjb25zdCBpbnQgdHdsNjA0MF92aW9fcmVnW1RXTDYwNDBfVklPUkVHTlVNXSA9IHsKLQlUV0w2MDQwX1JFR19BU0lDSUQsCi0JVFdMNjA0MF9SRUdfQVNJQ1JFViwKLQlUV0w2MDQwX1JFR19JTlRJRCwKLQlUV0w2MDQwX1JFR19JTlRNUiwKLQlUV0w2MDQwX1JFR19OQ1BDVEwsCi0JVFdMNjA0MF9SRUdfTERPQ1RMLAotCVRXTDYwNDBfUkVHX0FNSUNCQ1RMLAotCVRXTDYwNDBfUkVHX0RNSUNCQ1RMLAotCVRXTDYwNDBfUkVHX0hLQ1RMMSwKLQlUV0w2MDQwX1JFR19IS0NUTDIsCi0JVFdMNjA0MF9SRUdfR1BPQ1RMLAotCVRXTDYwNDBfUkVHX1RSSU0xLAotCVRXTDYwNDBfUkVHX1RSSU0yLAotCVRXTDYwNDBfUkVHX1RSSU0zLAotCVRXTDYwNDBfUkVHX0hTT1RSSU0sCi0JVFdMNjA0MF9SRUdfSEZPVFJJTSwKLQlUV0w2MDQwX1JFR19BQ0NDVEwsCi0JVFdMNjA0MF9SRUdfU1RBVFVTLAotfTsKLQotLyoKLSAqIHR3bDYwNDAgdmRkL3ZzcyByZWdpc3RlcnM6Ci0gKiByZWdpc3RlcnMgdW5kZXIgdmRkL3ZzcyBzdXBwbGllcyBjYW4gb25seSBiZSBhY2Nlc3NlZAotICogYWZ0ZXIgdGhlIHBvd2VyLXVwIHNlcXVlbmNlCi0gKi8KLXN0YXRpYyBjb25zdCBpbnQgdHdsNjA0MF92ZGRfcmVnW1RXTDYwNDBfVkREUkVHTlVNXSA9IHsKLQlUV0w2MDQwX1JFR19IUFBMTENUTCwKLQlUV0w2MDQwX1JFR19MUFBMTENUTCwKLQlUV0w2MDQwX1JFR19MUFBMTERJViwKKy8qIExpc3Qgb2YgcmVnaXN0ZXJzIHRvIGJlIHJlc3RvcmVkIGFmdGVyIHBvd2VyIHVwICovCitzdGF0aWMgY29uc3QgaW50IHR3bDYwNDBfcmVzdG9yZV9saXN0W10gPSB7CiAJVFdMNjA0MF9SRUdfTUlDTENUTCwKIAlUV0w2MDQwX1JFR19NSUNSQ1RMLAogCVRXTDYwNDBfUkVHX01JQ0dBSU4sCkBAIC0yMDIsMTIgKzE3Myw2IEBACiAJVFdMNjA0MF9SRUdfSEZMR0FJTiwKIAlUV0w2MDQwX1JFR19IRlJDVEwsCiAJVFdMNjA0MF9SRUdfSEZSR0FJTiwKLQlUV0w2MDQwX1JFR19WSUJDVExMLAotCVRXTDYwNDBfUkVHX1ZJQkRBVEwsCi0JVFdMNjA0MF9SRUdfVklCQ1RMUiwKLQlUV0w2MDQwX1JFR19WSUJEQVRSLAotCVRXTDYwNDBfUkVHX0FMQiwKLQlUV0w2MDQwX1JFR19ETEIsCiB9OwogCiAvKiBzZXQgb2YgcmF0ZXMgZm9yIGVhY2ggcGxsOiBsb3ctcG93ZXIgYW5kIGhpZ2gtcGVyZm9ybWFuY2UgKi8KQEAgLTI3NSw4ICsyNDAsMTIgQEAKIAlpZiAocmVnID49IFRXTDYwNDBfQ0FDSEVSRUdOVU0pCiAJCXJldHVybiAtRUlPOwogCi0JdmFsdWUgPSB0d2w2MDQwX3JlZ19yZWFkKHR3bDYwNDAsIHJlZyk7Ci0JdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIHJlZywgdmFsdWUpOworCWlmIChsaWtlbHkocmVnIDwgVFdMNjA0MF9SRUdfU1dfU0hBRE9XKSkgeworCQl2YWx1ZSA9IHR3bDYwNDBfcmVnX3JlYWQodHdsNjA0MCwgcmVnKTsKKwkJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIHJlZywgdmFsdWUpOworCX0gZWxzZSB7CisJCXZhbHVlID0gdHdsNjA0MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgcmVnKTsKKwl9CiAKIAlyZXR1cm4gdmFsdWU7CiB9CkBAIC0yOTMsNTkgKzI2Miw1MSBAQAogCQlyZXR1cm4gLUVJTzsKIAogCXR3bDYwNDBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCByZWcsIHZhbHVlKTsKLQlyZXR1cm4gdHdsNjA0MF9yZWdfd3JpdGUodHdsNjA0MCwgcmVnLCB2YWx1ZSk7CisJaWYgKGxpa2VseShyZWcgPCBUV0w2MDQwX1JFR19TV19TSEFET1cpKQorCQlyZXR1cm4gdHdsNjA0MF9yZWdfd3JpdGUodHdsNjA0MCwgcmVnLCB2YWx1ZSk7CisJZWxzZQorCQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdHdsNjA0MF9pbml0X3Zpb19yZWdzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIHR3bDYwNDBfaW5pdF9jaGlwKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdHdsNjA0MCAqdHdsNjA0MCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJdTggdmFsOworCisJLyogVXBkYXRlIHJlZ19jYWNoZTogQVNJQ1JFViwgYW5kIFRSSU0gdmFsdWVzICovCisJdmFsID0gdHdsNjA0MF9nZXRfcmV2aWQodHdsNjA0MCk7CisJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0FTSUNSRVYsIHZhbCk7CisKKwl0d2w2MDQwX3JlYWRfcmVnX3ZvbGF0aWxlKGNvZGVjLCBUV0w2MDQwX1JFR19UUklNMSk7CisJdHdsNjA0MF9yZWFkX3JlZ192b2xhdGlsZShjb2RlYywgVFdMNjA0MF9SRUdfVFJJTTIpOworCXR3bDYwNDBfcmVhZF9yZWdfdm9sYXRpbGUoY29kZWMsIFRXTDYwNDBfUkVHX1RSSU0zKTsKKwl0d2w2MDQwX3JlYWRfcmVnX3ZvbGF0aWxlKGNvZGVjLCBUV0w2MDQwX1JFR19IU09UUklNKTsKKwl0d2w2MDQwX3JlYWRfcmVnX3ZvbGF0aWxlKGNvZGVjLCBUV0w2MDQwX1JFR19IRk9UUklNKTsKKworCS8qIENoYW5nZSBjaGlwIGRlZmF1bHRzICovCisJLyogTm8gaW1wdXQgc2VsZWN0ZWQgZm9yIG1pY3JvcGhvbmUgYW1wbGlmaWVycyAqLworCXR3bDYwNDBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCBUV0w2MDQwX1JFR19NSUNMQ1RMLCAweDE4KTsKKwl0d2w2MDQwX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfTUlDUkNUTCwgMHgxOCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gbG93ZXIgdGhlIGRlZmF1bHQgZ2FpbiB2YWx1ZXMsIHNvIHRoZSByYW1wIGNvZGUKKwkgKiBjYW4gd29yayBjb3JyZWN0bHkgZm9yIHRoZSBmaXJzdCBwbGF5YmFjay4KKwkgKiBUaGlzIHJlZHVjZXMgdGhlIHBvcCBub2lzZSBoZWFyZCBhdCB0aGUgZmlyc3QgcGxheWJhY2suCisJICovCisJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTR0FJTiwgMHhmZik7CisJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0VBUkNUTCwgMHgxZSk7CisJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0hGTEdBSU4sIDB4MWQpOworCXR3bDYwNDBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCBUV0w2MDQwX1JFR19IRlJHQUlOLCAweDFkKTsKKwl0d2w2MDQwX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfTElORUdBSU4sIDApOworfQorCitzdGF0aWMgdm9pZCB0d2w2MDQwX3Jlc3RvcmVfcmVncyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJdTggKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKIAlpbnQgcmVnLCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRXTDYwNDBfVklPUkVHTlVNOyBpKyspIHsKLQkJcmVnID0gdHdsNjA0MF92aW9fcmVnW2ldOwotCQkvKgotCQkgKiBza2lwIHJlYWQtb25seSByZWdpc3RlcnMgKEFTSUNJRCwgQVNJQ1JFViwgU1RBVFVTKQotCQkgKiBhbmQgcmVnaXN0ZXJzIHNoYXJlZCBhbW9uZyBNRkQgY2hpbGRyZW4KLQkJICovCi0JCXN3aXRjaCAocmVnKSB7Ci0JCWNhc2UgVFdMNjA0MF9SRUdfQVNJQ0lEOgotCQljYXNlIFRXTDYwNDBfUkVHX0FTSUNSRVY6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfSU5USUQ6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfSU5UTVI6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfTkNQQ1RMOgotCQljYXNlIFRXTDYwNDBfUkVHX0xET0NUTDoKLQkJY2FzZSBUV0w2MDQwX1JFR19HUE9DVEw6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfQUNDQ1RMOgotCQljYXNlIFRXTDYwNDBfUkVHX1NUQVRVUzoKLQkJCWNvbnRpbnVlOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJdHdsNjA0MF93cml0ZShjb2RlYywgcmVnLCBjYWNoZVtyZWddKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHR3bDYwNDBfaW5pdF92ZGRfcmVncyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTggKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpbnQgcmVnLCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFRXTDYwNDBfVkREUkVHTlVNOyBpKyspIHsKLQkJcmVnID0gdHdsNjA0MF92ZGRfcmVnW2ldOwotCQkvKiBza2lwIHZpYnJhIGFuZCBQTEwgcmVnaXN0ZXJzICovCi0JCXN3aXRjaCAocmVnKSB7Ci0JCWNhc2UgVFdMNjA0MF9SRUdfVklCQ1RMTDoKLQkJY2FzZSBUV0w2MDQwX1JFR19WSUJEQVRMOgotCQljYXNlIFRXTDYwNDBfUkVHX1ZJQkNUTFI6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfVklCREFUUjoKLQkJY2FzZSBUV0w2MDQwX1JFR19IUFBMTENUTDoKLQkJY2FzZSBUV0w2MDQwX1JFR19MUFBMTENUTDoKLQkJY2FzZSBUV0w2MDQwX1JFR19MUFBMTERJVjoKLQkJCWNvbnRpbnVlOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR3bDYwNDBfcmVzdG9yZV9saXN0KTsgaSsrKSB7CisJCXJlZyA9IHR3bDYwNDBfcmVzdG9yZV9saXN0W2ldOwogCQl0d2w2MDQwX3dyaXRlKGNvZGVjLCByZWcsIGNhY2hlW3JlZ10pOwogCX0KIH0KQEAgLTUyNCwxOCArNDg1LDE3IEBACiBzdGF0aWMgdm9pZCB0d2w2MDQwX3BnYV9oc193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0d2w2MDQwX2RhdGEsIGhzX2RlbGF5ZWRfd29yay53b3JrKTsKKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0d2w2MDQwX2RhdGEsIGhlYWRzZXQud29yay53b3JrKTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBwcml2LT5jb2RlYzsKIAlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKmhlYWRzZXQgPSAmcHJpdi0+aGVhZHNldDsKLQl1bnNpZ25lZCBpbnQgZGVsYXkgPSBoZWFkc2V0LT5zdGVwX2RlbGF5OwogCWludCBpLCBoZWFkc2V0X2NvbXBsZXRlOwogCiAJLyogZG8gd2UgbmVlZCB0byByYW1wIGF0IGFsbCA/ICovCiAJaWYgKGhlYWRzZXQtPnJhbXAgPT0gVFdMNjA0MF9SQU1QX05PTkUpCiAJCXJldHVybjsKIAotCS8qIEhTIFBHQSB2b2x1bWVzIGhhdmUgNCBiaXRzIG9mIHJlc29sdXRpb24gdG8gcmFtcCAqLwotCWZvciAoaSA9IDA7IGkgPD0gMTY7IGkrKykgeworCS8qIEhTIFBHQSBnYWluIHJhbmdlOiAweDAgLSAweGYgKDAgLSAxNSkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQloZWFkc2V0X2NvbXBsZXRlID0gdHdsNjA0MF9oc19yYW1wX3N0ZXAoY29kZWMsCiAJCQkJCQloZWFkc2V0LT5sZWZ0X3N0ZXAsCiAJCQkJCQloZWFkc2V0LT5yaWdodF9zdGVwKTsKQEAgLTU0NCwxNSArNTA0LDggQEAKIAkJaWYgKGhlYWRzZXRfY29tcGxldGUpCiAJCQlicmVhazsKIAotCQkvKgotCQkgKiBUT0RPOiB0dW5lOiBkZWxheSBpcyBsb25nZXIgb3ZlciAwZEIKLQkJICogYXMgaW5jcmVhc2VzIGFyZSBsYXJnZXIuCi0JCSAqLwotCQlpZiAoaSA+PSA4KQotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkgKwotCQkJCQkJCShkZWxheSA+PiAxKSkpOwotCQllbHNlCi0JCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyhkZWxheSkpOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoCisJCQkJbXNlY3NfdG9famlmZmllcyhoZWFkc2V0LT5zdGVwX2RlbGF5KSk7CiAJfQogCiAJaWYgKGhlYWRzZXQtPnJhbXAgPT0gVFdMNjA0MF9SQU1QX0RPV04pIHsKQEAgLTU2NywxOCArNTIwLDE4IEBACiBzdGF0aWMgdm9pZCB0d2w2MDQwX3BnYV9oZl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0d2w2MDQwX2RhdGEsIGhmX2RlbGF5ZWRfd29yay53b3JrKTsKKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0d2w2MDQwX2RhdGEsIGhhbmRzZnJlZS53b3JrLndvcmspOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHByaXYtPmNvZGVjOwogCXN0cnVjdCB0d2w2MDQwX291dHB1dCAqaGFuZHNmcmVlID0gJnByaXYtPmhhbmRzZnJlZTsKLQl1bnNpZ25lZCBpbnQgZGVsYXkgPSBoYW5kc2ZyZWUtPnN0ZXBfZGVsYXk7CiAJaW50IGksIGhhbmRzZnJlZV9jb21wbGV0ZTsKIAogCS8qIGRvIHdlIG5lZWQgdG8gcmFtcCBhdCBhbGwgPyAqLwogCWlmIChoYW5kc2ZyZWUtPnJhbXAgPT0gVFdMNjA0MF9SQU1QX05PTkUpCiAJCXJldHVybjsKIAotCS8qIEhGIFBHQSB2b2x1bWVzIGhhdmUgNSBiaXRzIG9mIHJlc29sdXRpb24gdG8gcmFtcCAqLwotCWZvciAoaSA9IDA7IGkgPD0gMzI7IGkrKykgeworCS8qCisJICogSEYgUEdBIGdhaW4gcmFuZ2U6IDB4MDAgLSAweDFkICgwIC0gMjkpICovCisJZm9yIChpID0gMDsgaSA8IDMwOyBpKyspIHsKIAkJaGFuZHNmcmVlX2NvbXBsZXRlID0gdHdsNjA0MF9oZl9yYW1wX3N0ZXAoY29kZWMsCiAJCQkJCQloYW5kc2ZyZWUtPmxlZnRfc3RlcCwKIAkJCQkJCWhhbmRzZnJlZS0+cmlnaHRfc3RlcCk7CkBAIC01ODcsMTUgKzU0MCw4IEBACiAJCWlmIChoYW5kc2ZyZWVfY29tcGxldGUpCiAJCQlicmVhazsKIAotCQkvKgotCQkgKiBUT0RPOiB0dW5lOiBkZWxheSBpcyBsb25nZXIgb3ZlciAwZEIKLQkJICogYXMgaW5jcmVhc2VzIGFyZSBsYXJnZXIuCi0JCSAqLwotCQlpZiAoaSA+PSAxNikKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKGRlbGF5ICsKLQkJCQkJCSAgICAgICAoZGVsYXkgPj4gMSkpKTsKLQkJZWxzZQotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoaGFuZHNmcmVlLT5zdGVwX2RlbGF5KSk7CiAJfQogCiAKQEAgLTYwNywzNiArNTUzLDQwIEBACiAJaGFuZHNmcmVlLT5yYW1wID0gVFdMNjA0MF9SQU1QX05PTkU7CiB9CiAKLXN0YXRpYyBpbnQgcGdhX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorc3RhdGljIGludCBvdXRfZHJ2X2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAogCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IHR3bDYwNDBfb3V0cHV0ICpvdXQ7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqd29yazsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcXVldWU7CiAKIAlzd2l0Y2ggKHctPnNoaWZ0KSB7Ci0JY2FzZSAyOgotCWNhc2UgMzoKKwljYXNlIDI6IC8qIEhlYWRzZXQgb3V0cHV0IGRyaXZlciAqLwogCQlvdXQgPSAmcHJpdi0+aGVhZHNldDsKLQkJd29yayA9ICZwcml2LT5oc19kZWxheWVkX3dvcms7Ci0JCXF1ZXVlID0gcHJpdi0+aHNfd29ya3F1ZXVlOworCQl3b3JrID0gJm91dC0+d29yazsKKwkJLyoKKwkJICogTWFrZSBzdXJlLCB0aGF0IHdlIGRvIG5vdCBtZXNzIHVwIHZhcmlhYmxlcyBmb3IgYWxyZWFkeQorCQkgKiBleGVjdXRpbmcgd29yay4KKwkJICovCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyh3b3JrKTsKKwogCQlvdXQtPmxlZnRfc3RlcCA9IHByaXYtPmhzX2xlZnRfc3RlcDsKIAkJb3V0LT5yaWdodF9zdGVwID0gcHJpdi0+aHNfcmlnaHRfc3RlcDsKIAkJb3V0LT5zdGVwX2RlbGF5ID0gNTsJLyogNSBtcyBiZXR3ZWVuIHZvbHVtZSByYW1wIHN0ZXBzICovCiAJCWJyZWFrOwotCWNhc2UgNDoKKwljYXNlIDQ6IC8qIEhhbmRzZnJlZSBvdXRwdXQgZHJpdmVyICovCiAJCW91dCA9ICZwcml2LT5oYW5kc2ZyZWU7Ci0JCXdvcmsgPSAmcHJpdi0+aGZfZGVsYXllZF93b3JrOwotCQlxdWV1ZSA9IHByaXYtPmhmX3dvcmtxdWV1ZTsKKwkJd29yayA9ICZvdXQtPndvcms7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSwgdGhhdCB3ZSBkbyBub3QgbWVzcyB1cCB2YXJpYWJsZXMgZm9yIGFscmVhZHkKKwkJICogZXhlY3V0aW5nIHdvcmsuCisJCSAqLworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMod29yayk7CisKIAkJb3V0LT5sZWZ0X3N0ZXAgPSBwcml2LT5oZl9sZWZ0X3N0ZXA7CiAJCW91dC0+cmlnaHRfc3RlcCA9IHByaXYtPmhmX3JpZ2h0X3N0ZXA7CiAJCW91dC0+c3RlcF9kZWxheSA9IDU7CS8qIDUgbXMgYmV0d2VlbiB2b2x1bWUgcmFtcCBzdGVwcyAqLwotCQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKLQkJCXByaXYtPm5vbl9scCsrOwotCQllbHNlCi0JCQlwcml2LT5ub25fbHAtLTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC0xOwpAQCAtNjQ4LDMxICs1OTgsMjUgQEAKIAkJCWJyZWFrOwogCiAJCS8qIGRvbid0IHVzZSB2b2x1bWUgcmFtcCBmb3IgcG93ZXItdXAgKi8KKwkJb3V0LT5yYW1wID0gVFdMNjA0MF9SQU1QX1VQOwogCQlvdXQtPmxlZnRfc3RlcCA9IG91dC0+bGVmdF92b2w7CiAJCW91dC0+cmlnaHRfc3RlcCA9IG91dC0+cmlnaHRfdm9sOwogCi0JCWlmICghZGVsYXllZF93b3JrX3BlbmRpbmcod29yaykpIHsKLQkJCW91dC0+cmFtcCA9IFRXTDYwNDBfUkFNUF9VUDsKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhxdWV1ZSwgd29yaywKLQkJCQkJbXNlY3NfdG9famlmZmllcygxKSk7Ci0JCX0KKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgd29yaywgbXNlY3NfdG9famlmZmllcygxKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKIAkJaWYgKCFvdXQtPmFjdGl2ZSkKIAkJCWJyZWFrOwogCi0JCWlmICghZGVsYXllZF93b3JrX3BlbmRpbmcod29yaykpIHsKLQkJCS8qIHVzZSB2b2x1bWUgcmFtcCBmb3IgcG93ZXItZG93biAqLwotCQkJb3V0LT5yYW1wID0gVFdMNjA0MF9SQU1QX0RPV047Ci0JCQlJTklUX0NPTVBMRVRJT04ob3V0LT5yYW1wX2RvbmUpOworCQkvKiB1c2Ugdm9sdW1lIHJhbXAgZm9yIHBvd2VyLWRvd24gKi8KKwkJb3V0LT5yYW1wID0gVFdMNjA0MF9SQU1QX0RPV047CisJCUlOSVRfQ09NUExFVElPTihvdXQtPnJhbXBfZG9uZSk7CiAKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhxdWV1ZSwgd29yaywKLQkJCQkJbXNlY3NfdG9famlmZmllcygxKSk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsIHdvcmssIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCi0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm91dC0+cmFtcF9kb25lLAotCQkJCQltc2Vjc190b19qaWZmaWVzKDIwMDApKTsKLQkJfQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm91dC0+cmFtcF9kb25lLAorCQkJCQkgICAgbXNlY3NfdG9famlmZmllcygyMDAwKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNjgzLDcgKzYyNyw3IEBACiBzdGF0aWMgaW50IGhlYWRzZXRfcG93ZXJfbW9kZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBoaWdoX3BlcmYpCiB7CiAJaW50IGhzbGN0bCwgaHNyY3RsOwotCWludCBtYXNrID0gVFdMNjA0MF9IU0RSVk1PREVMIHwgVFdMNjA0MF9IU0RBQ01PREVMOworCWludCBtYXNrID0gVFdMNjA0MF9IU0RSVk1PREUgfCBUV0w2MDQwX0hTREFDTU9ERTsKIAogCWhzbGN0bCA9IHR3bDYwNDBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTTENUTCk7CiAJaHNyY3RsID0gdHdsNjA0MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfSFNSQ1RMKTsKQEAgLTcwNSwxMSArNjQ5LDMxIEBACiBzdGF0aWMgaW50IHR3bDYwNDBfaHNfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAogCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKIHsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwl1OCBoc2xjdGwsIGhzcmN0bDsKKworCS8qCisJICogV29ya2Fyb3VuZCBmb3IgSGVhZHNldCBEQyBvZmZzZXQgY2F1c2VkIHBvcCBub2lzZToKKwkgKiBCb3RoIEhTIERBQyBuZWVkIHRvIGJlIHR1cm5lZCBvbiAoYmVmb3JlIHRoZSBIUyBkcml2ZXIpIGFuZCBvZmYgYXQKKwkgKiB0aGUgc2FtZSB0aW1lLgorCSAqLworCWhzbGN0bCA9IHR3bDYwNDBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTTENUTCk7CisJaHNyY3RsID0gdHdsNjA0MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfSFNSQ1RMKTsKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgeworCQloc2xjdGwgfD0gVFdMNjA0MF9IU0RBQ0VOQTsKKwkJaHNyY3RsIHw9IFRXTDYwNDBfSFNEQUNFTkE7CisJfSBlbHNlIHsKKwkJaHNsY3RsICY9IH5UV0w2MDQwX0hTREFDRU5BOworCQloc3JjdGwgJj0gflRXTDYwNDBfSFNEQUNFTkE7CisJfQorCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTTENUTCwgaHNsY3RsKTsKKwl0d2w2MDQwX3dyaXRlKGNvZGVjLCBUV0w2MDQwX1JFR19IU1JDVEwsIGhzcmN0bCk7CisKIAltc2xlZXAoMSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdHdsNjA0MF9wb3dlcl9tb2RlX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorc3RhdGljIGludCB0d2w2MDQwX2VwX2Rydl9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKIAkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CkBAIC03MTcsMTggKzY4MSwxMiBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKLQkJcHJpdi0+bm9uX2xwKys7Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJFYXJwaG9uZSBEcml2ZXIiKSkgewotCQkJLyogRWFycGhvbmUgZG9lc24ndCBzdXBwb3J0IGxvdyBwb3dlciBtb2RlICovCi0JCQlwcml2LT5oc19wb3dlcl9tb2RlX2xvY2tlZCA9IDE7Ci0JCQlyZXQgPSBoZWFkc2V0X3Bvd2VyX21vZGUoY29kZWMsIDEpOwotCQl9CisJCS8qIEVhcnBob25lIGRvZXNuJ3Qgc3VwcG9ydCBsb3cgcG93ZXIgbW9kZSAqLworCQlwcml2LT5oc19wb3dlcl9tb2RlX2xvY2tlZCA9IDE7CisJCXJldCA9IGhlYWRzZXRfcG93ZXJfbW9kZShjb2RlYywgMSk7CiAJfSBlbHNlIHsKLQkJcHJpdi0+bm9uX2xwLS07Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJFYXJwaG9uZSBEcml2ZXIiKSkgewotCQkJcHJpdi0+aHNfcG93ZXJfbW9kZV9sb2NrZWQgPSAwOwotCQkJcmV0ID0gaGVhZHNldF9wb3dlcl9tb2RlKGNvZGVjLCBwcml2LT5oc19wb3dlcl9tb2RlKTsKLQkJfQorCQlwcml2LT5oc19wb3dlcl9tb2RlX2xvY2tlZCA9IDA7CisJCXJldCA9IGhlYWRzZXRfcG93ZXJfbW9kZShjb2RlYywgcHJpdi0+aHNfcG93ZXJfbW9kZSk7CiAJfQogCiAJbXNsZWVwKDEpOwpAQCAtNzcwLDcgKzcyOCw3IEBACiBzdGF0aWMgdm9pZCB0d2w2MDQwX2FjY2Vzc29yeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssCi0JCQkJCXN0cnVjdCB0d2w2MDQwX2RhdGEsIGRlbGF5ZWRfd29yay53b3JrKTsKKwkJCQkJc3RydWN0IHR3bDYwNDBfZGF0YSwgaHNfamFjay53b3JrLndvcmspOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHByaXYtPmNvZGVjOwogCXN0cnVjdCB0d2w2MDQwX2phY2tfZGF0YSAqaHNfamFjayA9ICZwcml2LT5oc19qYWNrOwogCkBAIC03ODEsMTUgKzczOSwxMCBAQAogc3RhdGljIGlycXJldHVybl90IHR3bDYwNDBfYXVkaW9faGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhdGE7Ci0Jc3RydWN0IHR3bDYwNDAgKnR3bDYwNDAgPSBjb2RlYy0+Y29udHJvbF9kYXRhOwogCXN0cnVjdCB0d2w2MDQwX2RhdGEgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1OCBpbnRpZDsKIAotCWludGlkID0gdHdsNjA0MF9yZWdfcmVhZCh0d2w2MDQwLCBUV0w2MDQwX1JFR19JTlRJRCk7Ci0KLQlpZiAoKGludGlkICYgVFdMNjA0MF9QTFVHSU5UKSB8fCAoaW50aWQgJiBUV0w2MDQwX1VOUExVR0lOVCkpCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5kZWxheWVkX3dvcmssCi0JCQkJCQkJbXNlY3NfdG9famlmZmllcygyMDApKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+aHNfamFjay53b3JrLAorCQkJICAgbXNlY3NfdG9famlmZmllcygyMDApKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTgwMywyNSArNzU2LDI3IEBACiAJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CiAJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlpbnQgcmV0OwotCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOwogCiAJLyogRm9yIEhTIGFuZCBIRiB3ZSBzaGFkb3cgdGhlIHZhbHVlcyBhbmQgb25seSBhY3R1YWxseSB3cml0ZQogCSAqIHRoZW0gb3V0IHdoZW4gYWN0aXZlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgYW1wbGlmaWVyIGNvbWVzIG9uCiAJICogYXMgcXVpZXRseSBhcyBwb3NzaWJsZS4gKi8KLQlzd2l0Y2ggKHJlZykgeworCXN3aXRjaCAobWMtPnJlZykgewogCWNhc2UgVFdMNjA0MF9SRUdfSFNHQUlOOgogCQlvdXQgPSAmdHdsNjA0MF9wcml2LT5oZWFkc2V0OwogCQlicmVhazsKLQlkZWZhdWx0OgorCWNhc2UgVFdMNjA0MF9SRUdfSEZMR0FJTjoKKwkJb3V0ID0gJnR3bDYwNDBfcHJpdi0+aGFuZHNmcmVlOwogCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiJXM6IFVuZXhwZWN0ZWQgcmVnaXN0ZXI6IDB4JTAyeFxuIiwKKwkJCQkJX19mdW5jX18sIG1jLT5yZWcpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAob3V0KSB7Ci0JCW91dC0+bGVmdF92b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQkJb3V0LT5yaWdodF92b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKLQkJaWYgKCFvdXQtPmFjdGl2ZSkKLQkJCXJldHVybiAxOwotCX0KKwlvdXQtPmxlZnRfdm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJb3V0LT5yaWdodF92b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwlpZiAoIW91dC0+YWN0aXZlKQorCQlyZXR1cm4gMTsKIAogCXJldCA9IHNuZF9zb2NfcHV0X3ZvbHN3KGtjb250cm9sLCB1Y29udHJvbCk7CiAJaWYgKHJldCA8IDApCkBAIC04MzgsMTEyICs3OTMsNDIgQEAKIAlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKm91dCA9ICZ0d2w2MDQwX3ByaXYtPmhlYWRzZXQ7CiAJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CiAJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKIAotCXN3aXRjaCAocmVnKSB7CisJc3dpdGNoIChtYy0+cmVnKSB7CiAJY2FzZSBUV0w2MDQwX1JFR19IU0dBSU46CiAJCW91dCA9ICZ0d2w2MDQwX3ByaXYtPmhlYWRzZXQ7Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gb3V0LT5sZWZ0X3ZvbDsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBvdXQtPnJpZ2h0X3ZvbDsKLQkJcmV0dXJuIDA7Ci0KLQlkZWZhdWx0OgogCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gc25kX3NvY19nZXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKLX0KLQotc3RhdGljIGludCB0d2w2MDQwX3B1dF92b2xzd18ycl92dShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgdHdsNjA0MF9kYXRhICp0d2w2MDQwX3ByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKm91dCA9IE5VTEw7Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOwotCi0JLyogRm9yIEhTIGFuZCBIRiB3ZSBzaGFkb3cgdGhlIHZhbHVlcyBhbmQgb25seSBhY3R1YWxseSB3cml0ZQotCSAqIHRoZW0gb3V0IHdoZW4gYWN0aXZlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgYW1wbGlmaWVyIGNvbWVzIG9uCi0JICogYXMgcXVpZXRseSBhcyBwb3NzaWJsZS4gKi8KLQlzd2l0Y2ggKHJlZykgewogCWNhc2UgVFdMNjA0MF9SRUdfSEZMR0FJTjoKLQljYXNlIFRXTDYwNDBfUkVHX0hGUkdBSU46CiAJCW91dCA9ICZ0d2w2MDQwX3ByaXYtPmhhbmRzZnJlZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYnJlYWs7CisJCWRldl93YXJuKGNvZGVjLT5kZXYsICIlczogVW5leHBlY3RlZCByZWdpc3RlcjogMHglMDJ4XG4iLAorCQkJCQlfX2Z1bmNfXywgbWMtPnJlZyk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChvdXQpIHsKLQkJb3V0LT5sZWZ0X3ZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCQlvdXQtPnJpZ2h0X3ZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCQlpZiAoIW91dC0+YWN0aXZlKQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIoa2NvbnRyb2wsIHVjb250cm9sKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAxOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gb3V0LT5sZWZ0X3ZvbDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IG91dC0+cmlnaHRfdm9sOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHR3bDYwNDBfZ2V0X3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCB0d2w2MDQwX3NvY19kYXBtX3B1dF92aWJyYV9lbnVtKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgdHdsNjA0MF9kYXRhICp0d2w2MDQwX3ByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKm91dCA9ICZ0d2w2MDQwX3ByaXYtPmhhbmRzZnJlZTsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KLQkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3aWRnZXQtPmNvZGVjOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsOwogCi0JLyogSWYgdGhlc2UgYXJlIGNhY2hlZCByZWdpc3RlcnMgdXNlIHRoZSBjYWNoZSAqLwotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSBUV0w2MDQwX1JFR19IRkxHQUlOOgotCWNhc2UgVFdMNjA0MF9SRUdfSEZSR0FJTjoKLQkJb3V0ID0gJnR3bDYwNDBfcHJpdi0+aGFuZHNmcmVlOwotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG91dC0+bGVmdF92b2w7Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gb3V0LT5yaWdodF92b2w7Ci0JCXJldHVybiAwOworCS8qIERvIG5vdCBhbGxvdyBjaGFuZ2VzIHdoaWxlIElucHV0L0ZGIGVmZWN0IGlzIHJ1bm5pbmcgKi8KKwl2YWwgPSB0d2w2MDQwX3JlYWRfcmVnX3ZvbGF0aWxlKGNvZGVjLCBlLT5yZWcpOworCWlmICh2YWwgJiBUV0w2MDQwX1ZJQkVOQSAmJiAhKHZhbCAmIFRXTDYwNDBfVklCU0VMKSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBzbmRfc29jX2dldF92b2xzd18ycihrY29udHJvbCwgdWNvbnRyb2wpOworCXJldHVybiBzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKGtjb250cm9sLCB1Y29udHJvbCk7CiB9CiAKLS8qIGRvdWJsZSBjb250cm9sIHdpdGggdm9sdW1lIHVwZGF0ZSAqLwotI2RlZmluZSBTT0NfVFdMNjA0MF9ET1VCTEVfVExWKHhuYW1lLCB4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgeG1heCxcCi0JCQkJCQkJeGludmVydCwgdGx2X2FycmF5KVwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8XAotCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSxcCi0JLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgLmdldCA9IHR3bDYwNDBfZ2V0X3ZvbHN3LCBcCi0JLnB1dCA9IHR3bDYwNDBfcHV0X3ZvbHN3LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCxcCi0JCSAubWF4ID0geG1heCwgLnBsYXRmb3JtX21heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9Ci0KLS8qIGRvdWJsZSBjb250cm9sIHdpdGggdm9sdW1lIHVwZGF0ZSAqLwotI2RlZmluZSBTT0NfVFdMNjA0MF9ET1VCTEVfUl9UTFYoeG5hbWUsIHJlZ19sZWZ0LCByZWdfcmlnaHQsIHhzaGlmdCwgeG1heCxcCi0JCQkJeGludmVydCwgdGx2X2FycmF5KVwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8IFwKLQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFwKLQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCi0JLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAotCS5nZXQgPSB0d2w2MDQwX2dldF92b2xzd18yciwgLnB1dCA9IHR3bDYwNDBfcHV0X3ZvbHN3XzJyX3Z1LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHJlZ19sZWZ0LCAucnJlZyA9IHJlZ19yaWdodCwgLnNoaWZ0ID0geHNoaWZ0LCBcCi0JCSAucnNoaWZ0ID0geHNoaWZ0LCAubWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9LCB9Ci0KIC8qCiAgKiBNSUNBVFQgdm9sdW1lIGNvbnRyb2w6CiAgKiBmcm9tIC02IHRvIDAgZEIgaW4gNiBkQiBzdGVwcwpAQCAtMTAxNSw2ICs5MDAsMTkgQEAKIAkJCXR3bDYwNDBfaGZfdGV4dHMpLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKnR3bDYwNDBfdmlicmFwYXRoX3RleHRzW10gPSB7CisJIklucHV0IEZGIiwgIkF1ZGlvIFBETSIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNjA0MF92aWJyYV9lbnVtW10gPSB7CisJU09DX0VOVU1fU0lOR0xFKFRXTDYwNDBfUkVHX1ZJQkNUTEwsIDEsCisJCQlBUlJBWV9TSVpFKHR3bDYwNDBfdmlicmFwYXRoX3RleHRzKSwKKwkJCXR3bDYwNDBfdmlicmFwYXRoX3RleHRzKSwKKwlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfVklCQ1RMUiwgMSwKKwkJCUFSUkFZX1NJWkUodHdsNjA0MF92aWJyYXBhdGhfdGV4dHMpLAorCQkJdHdsNjA0MF92aWJyYXBhdGhfdGV4dHMpLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFtaWNsX2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNjA0MF9lbnVtWzBdKTsKIApAQCAtMTAzNSw4ICs5MzMsMjUgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoZnJfbXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDYwNDBfaGZfZW51bVsxXSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBlcF9kcml2ZXJfc3dpdGNoX2NvbnRyb2xzID0KLQlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFRXTDYwNDBfUkVHX0VBUkNUTCwgMCwgMSwgMCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXBfcGF0aF9lbmFibGVfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBUV0w2MDQwX1JFR19TV19TSEFET1csIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXV4bF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBUV0w2MDQwX1JFR19IRkxDVEwsIDYsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXV4cl9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBUV0w2MDQwX1JFR19IRlJDVEwsIDYsIDEsIDApOworCisvKiBWaWJyYSBwbGF5YmFjayBzd2l0Y2hlcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZpYnJhbF9tdXhfY29udHJvbHMgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJSb3V0ZSIsIHR3bDYwNDBfdmlicmFfZW51bVswXSwKKwkJc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwKKwkJdHdsNjA0MF9zb2NfZGFwbV9wdXRfdmlicmFfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2aWJyYXJfbXV4X2NvbnRyb2xzID0KKwlTT0NfREFQTV9FTlVNX0VYVCgiUm91dGUiLCB0d2w2MDQwX3ZpYnJhX2VudW1bMV0sCisJCXNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsCisJCXR3bDYwNDBfc29jX2RhcG1fcHV0X3ZpYnJhX2VudW0pOwogCiAvKiBIZWFkc2V0IHBvd2VyIG1vZGUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICp0d2w2MDQwX3Bvd2VyX21vZGVfdGV4dHNbXSA9IHsKQEAgLTExMDUsNiArMTAyMCwxNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodHdsNjA0MF9nZXRfY2xrX2lkKTsKIAoraW50IHR3bDYwNDBfZ2V0X3RyaW1fdmFsdWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBlbnVtIHR3bDYwNDBfdHJpbSB0cmltKQoreworCWlmICh1bmxpa2VseSh0cmltID49IFRXTDYwNDBfVFJJTV9JTlZBTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHR3bDYwNDBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX1RSSU0xICsgdHJpbSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0d2w2MDQwX2dldF90cmltX3ZhbHVlKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDYwNDBfc25kX2NvbnRyb2xzW10gPSB7CiAJLyogQ2FwdHVyZSBnYWlucyAqLwogCVNPQ19ET1VCTEVfVExWKCJDYXB0dXJlIFByZWFtcGxpZmllciBWb2x1bWUiLApAQCAtMTExNywxMCArMTA0MSwxMiBAQAogCQlUV0w2MDQwX1JFR19MSU5FR0FJTiwgMCwgMywgNywgMCwgYWZtX2FtcF90bHYpLAogCiAJLyogUGxheWJhY2sgZ2FpbnMgKi8KLQlTT0NfVFdMNjA0MF9ET1VCTEVfVExWKCJIZWFkc2V0IFBsYXliYWNrIFZvbHVtZSIsCi0JCVRXTDYwNDBfUkVHX0hTR0FJTiwgMCwgNCwgMHhGLCAxLCBoc190bHYpLAotCVNPQ19UV0w2MDQwX0RPVUJMRV9SX1RMVigiSGFuZHNmcmVlIFBsYXliYWNrIFZvbHVtZSIsCi0JCVRXTDYwNDBfUkVHX0hGTEdBSU4sIFRXTDYwNDBfUkVHX0hGUkdBSU4sIDAsIDB4MUQsIDEsIGhmX3RsdiksCisJU09DX0RPVUJMRV9FWFRfVExWKCJIZWFkc2V0IFBsYXliYWNrIFZvbHVtZSIsCisJCVRXTDYwNDBfUkVHX0hTR0FJTiwgMCwgNCwgMHhGLCAxLCB0d2w2MDQwX2dldF92b2xzdywKKwkJdHdsNjA0MF9wdXRfdm9sc3csIGhzX3RsdiksCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIkhhbmRzZnJlZSBQbGF5YmFjayBWb2x1bWUiLAorCQlUV0w2MDQwX1JFR19IRkxHQUlOLCBUV0w2MDQwX1JFR19IRlJHQUlOLCAwLCAweDFELCAxLAorCQl0d2w2MDQwX2dldF92b2xzdywgdHdsNjA0MF9wdXRfdm9sc3csIGhmX3RsdiksCiAJU09DX1NJTkdMRV9UTFYoIkVhcnBob25lIFBsYXliYWNrIFZvbHVtZSIsCiAJCVRXTDYwNDBfUkVHX0VBUkNUTCwgMSwgMHhGLCAxLCBlcF90bHYpLAogCkBAIC0xMTQ2LDYgKzEwNzIsMTAgQEAKIAlTTkRfU09DX0RBUE1fT1VUUFVUKCJIRkwiKSwKIAlTTkRfU09DX0RBUE1fT1VUUFVUKCJIRlIiKSwKIAlTTkRfU09DX0RBUE1fT1VUUFVUKCJFUCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkFVWEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJBVVhSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiVklCUkFMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiVklCUkFSIiksCiAKIAkvKiBBbmFsb2cgaW5wdXQgbXV4ZXMgZm9yIHRoZSBjYXB0dXJlIGFtcGxpZmllcnMgKi8KIAlTTkRfU09DX0RBUE1fTVVYKCJBbmFsb2cgTGVmdCBDYXB0dXJlIFJvdXRlIiwKQEAgLTExODIsNTkgKzExMTIsNzYgQEAKIAkJCVRXTDYwNDBfUkVHX0RNSUNCQ1RMLCA0LCAwKSwKIAogCS8qIERBQ3MgKi8KLQlTTkRfU09DX0RBUE1fREFDX0UoIkhTREFDIExlZnQiLCAiSGVhZHNldCBQbGF5YmFjayIsCi0JCQlUV0w2MDQwX1JFR19IU0xDVEwsIDAsIDAsCi0JCQl0d2w2MDQwX2hzX2RhY19ldmVudCwKLQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0RBQ19FKCJIU0RBQyBSaWdodCIsICJIZWFkc2V0IFBsYXliYWNrIiwKLQkJCVRXTDYwNDBfUkVHX0hTUkNUTCwgMCwgMCwKLQkJCXR3bDYwNDBfaHNfZGFjX2V2ZW50LAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fREFDX0UoIkhGREFDIExlZnQiLCAiSGFuZHNmcmVlIFBsYXliYWNrIiwKLQkJCVRXTDYwNDBfUkVHX0hGTENUTCwgMCwgMCwKLQkJCXR3bDYwNDBfcG93ZXJfbW9kZV9ldmVudCwKLQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0RBQ19FKCJIRkRBQyBSaWdodCIsICJIYW5kc2ZyZWUgUGxheWJhY2siLAotCQkJVFdMNjA0MF9SRUdfSEZSQ1RMLCAwLCAwLAotCQkJdHdsNjA0MF9wb3dlcl9tb2RlX2V2ZW50LAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fREFDKCJIU0RBQyBMZWZ0IiwgIkhlYWRzZXQgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkhTREFDIFJpZ2h0IiwgIkhlYWRzZXQgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkhGREFDIExlZnQiLCAiSGFuZHNmcmVlIFBsYXliYWNrIiwKKwkJCSBUV0w2MDQwX1JFR19IRkxDVEwsIDAsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkhGREFDIFJpZ2h0IiwgIkhhbmRzZnJlZSBQbGF5YmFjayIsCisJCQkgVFdMNjA0MF9SRUdfSEZSQ1RMLCAwLCAwKSwKKwkvKiBWaXJ0dWFsIERBQyBmb3IgdmlicmEgcGF0aCAoREw0IGNoYW5uZWwpICovCisJU05EX1NPQ19EQVBNX0RBQygiVklCUkEgREFDIiwgIlZpYnJhIFBsYXliYWNrIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMCksCiAKLQlTTkRfU09DX0RBUE1fTVVYKCJIRiBMZWZ0IFBsYXliYWNrIiwKKwlTTkRfU09DX0RBUE1fTVVYKCJIYW5kc2ZyZWUgTGVmdCBQbGF5YmFjayIsCiAJCQlTTkRfU09DX05PUE0sIDAsIDAsICZoZmxfbXV4X2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJIRiBSaWdodCBQbGF5YmFjayIsCisJU05EX1NPQ19EQVBNX01VWCgiSGFuZHNmcmVlIFJpZ2h0IFBsYXliYWNrIiwKIAkJCVNORF9TT0NfTk9QTSwgMCwgMCwgJmhmcl9tdXhfY29udHJvbHMpLAogCS8qIEFuYWxvZyBwbGF5YmFjayBNdXhlcyAqLwotCVNORF9TT0NfREFQTV9NVVgoIkhTIExlZnQgUGxheWJhY2siLAorCVNORF9TT0NfREFQTV9NVVgoIkhlYWRzZXQgTGVmdCBQbGF5YmFjayIsCiAJCQlTTkRfU09DX05PUE0sIDAsIDAsICZoc2xfbXV4X2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJIUyBSaWdodCBQbGF5YmFjayIsCisJU05EX1NPQ19EQVBNX01VWCgiSGVhZHNldCBSaWdodCBQbGF5YmFjayIsCiAJCQlTTkRfU09DX05PUE0sIDAsIDAsICZoc3JfbXV4X2NvbnRyb2xzKSwKIAorCVNORF9TT0NfREFQTV9NVVgoIlZpYnJhIExlZnQgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmdmlicmFsX211eF9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiVmlicmEgUmlnaHQgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmdmlicmFyX211eF9jb250cm9scyksCisKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJFYXJwaG9uZSBQbGF5YmFjayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZlcF9wYXRoX2VuYWJsZV9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBVVhMIFBsYXliYWNrIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJmF1eGxfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkFVWFIgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmYXV4cl9zd2l0Y2hfY29udHJvbCksCisKIAkvKiBBbmFsb2cgcGxheWJhY2sgZHJpdmVycyAqLwotCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIkhhbmRzZnJlZSBMZWZ0IERyaXZlciIsCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiSEYgTGVmdCBEcml2ZXIiLAogCQkJVFdMNjA0MF9SRUdfSEZMQ1RMLCA0LCAwLCBOVUxMLCAwLAotCQkJcGdhX2V2ZW50LAorCQkJb3V0X2Rydl9ldmVudCwKIAkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIYW5kc2ZyZWUgUmlnaHQgRHJpdmVyIiwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIRiBSaWdodCBEcml2ZXIiLAogCQkJVFdMNjA0MF9SRUdfSEZSQ1RMLCA0LCAwLCBOVUxMLCAwLAotCQkJcGdhX2V2ZW50LAorCQkJb3V0X2Rydl9ldmVudCwKIAkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIZWFkc2V0IExlZnQgRHJpdmVyIiwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIUyBMZWZ0IERyaXZlciIsCiAJCQlUV0w2MDQwX1JFR19IU0xDVEwsIDIsIDAsIE5VTEwsIDAsCi0JCQlwZ2FfZXZlbnQsCisJCQlvdXRfZHJ2X2V2ZW50LAogCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIkhlYWRzZXQgUmlnaHQgRHJpdmVyIiwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIUyBSaWdodCBEcml2ZXIiLAogCQkJVFdMNjA0MF9SRUdfSFNSQ1RMLCAyLCAwLCBOVUxMLCAwLAotCQkJcGdhX2V2ZW50LAorCQkJb3V0X2Rydl9ldmVudCwKIAkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIX0UoIkVhcnBob25lIERyaXZlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDAsICZlcF9kcml2ZXJfc3dpdGNoX2NvbnRyb2xzLAotCQkJdHdsNjA0MF9wb3dlcl9tb2RlX2V2ZW50LAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJFYXJwaG9uZSBEcml2ZXIiLAorCQkJVFdMNjA0MF9SRUdfRUFSQ1RMLCAwLCAwLCBOVUxMLCAwLAorCQkJdHdsNjA0MF9lcF9kcnZfZXZlbnQsCisJCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIlZpYnJhIExlZnQgRHJpdmVyIiwKKwkJCVRXTDYwNDBfUkVHX1ZJQkNUTEwsIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9PVVRfRFJWKCJWaWJyYSBSaWdodCBEcml2ZXIiLAorCQkJVFdMNjA0MF9SRUdfVklCQ1RMUiwgMCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJWaWJyYSBMZWZ0IENvbnRyb2wiLCBUV0w2MDQwX1JFR19WSUJDVExMLCAyLCAwLAorCQkJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlZpYnJhIFJpZ2h0IENvbnRyb2wiLCBUV0w2MDQwX1JFR19WSUJDVExSLCAyLCAwLAorCQkJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFlfUygiSFNEQUMgUG93ZXIiLCAxLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgICB0d2w2MDQwX2hzX2RhY19ldmVudCwKKwkJCSAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCiAKIAkvKiBBbmFsb2cgcGxheWJhY2sgUEdBcyAqLwotCVNORF9TT0NfREFQTV9QR0EoIkhGREFDIExlZnQgUEdBIiwKKwlTTkRfU09DX0RBUE1fUEdBKCJIRiBMZWZ0IFBHQSIsCiAJCQlUV0w2MDQwX1JFR19IRkxDVEwsIDEsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9QR0EoIkhGREFDIFJpZ2h0IFBHQSIsCisJU05EX1NPQ19EQVBNX1BHQSgiSEYgUmlnaHQgUEdBIiwKIAkJCVRXTDYwNDBfUkVHX0hGUkNUTCwgMSwgMCwgTlVMTCwgMCksCiAKIH07CkBAIC0xMjU2LDUzICsxMjAzLDYzIEBACiAJeyJBREMgUmlnaHQiLCBOVUxMLCAiTWljQW1wUiJ9LAogCiAJLyogQUZNIHBhdGggKi8KLQl7IkFGTUFtcEwiLCAiTlVMTCIsICJBRk1MIn0sCi0JeyJBRk1BbXBSIiwgIk5VTEwiLCAiQUZNUiJ9LAorCXsiQUZNQW1wTCIsIE5VTEwsICJBRk1MIn0sCisJeyJBRk1BbXBSIiwgTlVMTCwgIkFGTVIifSwKIAotCXsiSFMgTGVmdCBQbGF5YmFjayIsICJIUyBEQUMiLCAiSFNEQUMgTGVmdCJ9LAotCXsiSFMgTGVmdCBQbGF5YmFjayIsICJMaW5lLUluIGFtcCIsICJBRk1BbXBMIn0sCisJeyJIU0RBQyBMZWZ0IiwgTlVMTCwgIkhTREFDIFBvd2VyIn0sCisJeyJIU0RBQyBSaWdodCIsIE5VTEwsICJIU0RBQyBQb3dlciJ9LAogCi0JeyJIUyBSaWdodCBQbGF5YmFjayIsICJIUyBEQUMiLCAiSFNEQUMgUmlnaHQifSwKLQl7IkhTIFJpZ2h0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcFIifSwKKwl7IkhlYWRzZXQgTGVmdCBQbGF5YmFjayIsICJIUyBEQUMiLCAiSFNEQUMgTGVmdCJ9LAorCXsiSGVhZHNldCBMZWZ0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcEwifSwKIAotCXsiSGVhZHNldCBMZWZ0IERyaXZlciIsICJOVUxMIiwgIkhTIExlZnQgUGxheWJhY2sifSwKLQl7IkhlYWRzZXQgUmlnaHQgRHJpdmVyIiwgIk5VTEwiLCAiSFMgUmlnaHQgUGxheWJhY2sifSwKKwl7IkhlYWRzZXQgUmlnaHQgUGxheWJhY2siLCAiSFMgREFDIiwgIkhTREFDIFJpZ2h0In0sCisJeyJIZWFkc2V0IFJpZ2h0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcFIifSwKIAotCXsiSFNPTCIsIE5VTEwsICJIZWFkc2V0IExlZnQgRHJpdmVyIn0sCi0JeyJIU09SIiwgTlVMTCwgIkhlYWRzZXQgUmlnaHQgRHJpdmVyIn0sCisJeyJIUyBMZWZ0IERyaXZlciIsIE5VTEwsICJIZWFkc2V0IExlZnQgUGxheWJhY2sifSwKKwl7IkhTIFJpZ2h0IERyaXZlciIsIE5VTEwsICJIZWFkc2V0IFJpZ2h0IFBsYXliYWNrIn0sCisKKwl7IkhTT0wiLCBOVUxMLCAiSFMgTGVmdCBEcml2ZXIifSwKKwl7IkhTT1IiLCBOVUxMLCAiSFMgUmlnaHQgRHJpdmVyIn0sCiAKIAkvKiBFYXJwaG9uZSBwbGF5YmFjayBwYXRoICovCi0JeyJFYXJwaG9uZSBEcml2ZXIiLCAiU3dpdGNoIiwgIkhTREFDIExlZnQifSwKKwl7IkVhcnBob25lIFBsYXliYWNrIiwgIlN3aXRjaCIsICJIU0RBQyBMZWZ0In0sCisJeyJFYXJwaG9uZSBEcml2ZXIiLCBOVUxMLCAiRWFycGhvbmUgUGxheWJhY2sifSwKIAl7IkVQIiwgTlVMTCwgIkVhcnBob25lIERyaXZlciJ9LAogCi0JeyJIRiBMZWZ0IFBsYXliYWNrIiwgIkhGIERBQyIsICJIRkRBQyBMZWZ0In0sCi0JeyJIRiBMZWZ0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcEwifSwKKwl7IkhhbmRzZnJlZSBMZWZ0IFBsYXliYWNrIiwgIkhGIERBQyIsICJIRkRBQyBMZWZ0In0sCisJeyJIYW5kc2ZyZWUgTGVmdCBQbGF5YmFjayIsICJMaW5lLUluIGFtcCIsICJBRk1BbXBMIn0sCiAKLQl7IkhGIFJpZ2h0IFBsYXliYWNrIiwgIkhGIERBQyIsICJIRkRBQyBSaWdodCJ9LAotCXsiSEYgUmlnaHQgUGxheWJhY2siLCAiTGluZS1JbiBhbXAiLCAiQUZNQW1wUiJ9LAorCXsiSGFuZHNmcmVlIFJpZ2h0IFBsYXliYWNrIiwgIkhGIERBQyIsICJIRkRBQyBSaWdodCJ9LAorCXsiSGFuZHNmcmVlIFJpZ2h0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcFIifSwKIAotCXsiSEZEQUMgTGVmdCBQR0EiLCBOVUxMLCAiSEYgTGVmdCBQbGF5YmFjayJ9LAotCXsiSEZEQUMgUmlnaHQgUEdBIiwgTlVMTCwgIkhGIFJpZ2h0IFBsYXliYWNrIn0sCisJeyJIRiBMZWZ0IFBHQSIsIE5VTEwsICJIYW5kc2ZyZWUgTGVmdCBQbGF5YmFjayJ9LAorCXsiSEYgUmlnaHQgUEdBIiwgTlVMTCwgIkhhbmRzZnJlZSBSaWdodCBQbGF5YmFjayJ9LAogCi0JeyJIYW5kc2ZyZWUgTGVmdCBEcml2ZXIiLCAiU3dpdGNoIiwgIkhGREFDIExlZnQgUEdBIn0sCi0JeyJIYW5kc2ZyZWUgUmlnaHQgRHJpdmVyIiwgIlN3aXRjaCIsICJIRkRBQyBSaWdodCBQR0EifSwKKwl7IkhGIExlZnQgRHJpdmVyIiwgTlVMTCwgIkhGIExlZnQgUEdBIn0sCisJeyJIRiBSaWdodCBEcml2ZXIiLCBOVUxMLCAiSEYgUmlnaHQgUEdBIn0sCiAKLQl7IkhGTCIsIE5VTEwsICJIYW5kc2ZyZWUgTGVmdCBEcml2ZXIifSwKLQl7IkhGUiIsIE5VTEwsICJIYW5kc2ZyZWUgUmlnaHQgRHJpdmVyIn0sCisJeyJIRkwiLCBOVUxMLCAiSEYgTGVmdCBEcml2ZXIifSwKKwl7IkhGUiIsIE5VTEwsICJIRiBSaWdodCBEcml2ZXIifSwKKworCXsiQVVYTCBQbGF5YmFjayIsICJTd2l0Y2giLCAiSEYgTGVmdCBQR0EifSwKKwl7IkFVWFIgUGxheWJhY2siLCAiU3dpdGNoIiwgIkhGIFJpZ2h0IFBHQSJ9LAorCisJeyJBVVhMIiwgTlVMTCwgIkFVWEwgUGxheWJhY2sifSwKKwl7IkFVWFIiLCBOVUxMLCAiQVVYUiBQbGF5YmFjayJ9LAorCisJLyogVmlicmF0b3IgcGF0aHMgKi8KKwl7IlZpYnJhIExlZnQgUGxheWJhY2siLCAiQXVkaW8gUERNIiwgIlZJQlJBIERBQyJ9LAorCXsiVmlicmEgUmlnaHQgUGxheWJhY2siLCAiQXVkaW8gUERNIiwgIlZJQlJBIERBQyJ9LAorCisJeyJWaWJyYSBMZWZ0IERyaXZlciIsIE5VTEwsICJWaWJyYSBMZWZ0IFBsYXliYWNrIn0sCisJeyJWaWJyYSBSaWdodCBEcml2ZXIiLCBOVUxMLCAiVmlicmEgUmlnaHQgUGxheWJhY2sifSwKKwl7IlZpYnJhIExlZnQgRHJpdmVyIiwgTlVMTCwgIlZpYnJhIExlZnQgQ29udHJvbCJ9LAorCXsiVmlicmEgUmlnaHQgRHJpdmVyIiwgTlVMTCwgIlZpYnJhIFJpZ2h0IENvbnRyb2wifSwKKworCXsiVklCUkFMIiwgTlVMTCwgIlZpYnJhIExlZnQgRHJpdmVyIn0sCisJeyJWSUJSQVIiLCBOVUxMLCAiVmlicmEgUmlnaHQgRHJpdmVyIn0sCiB9OwogCi1zdGF0aWMgaW50IHR3bDYwNDBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdHdsNjA0MF9kYXBtX3dpZGdldHMsCi0JCQkJIEFSUkFZX1NJWkUodHdsNjA0MF9kYXBtX3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwotCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhkYXBtKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHR3bDYwNDBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewpAQCAtMTMyNSw4ICsxMjgyLDcgQEAKIAogCQlwcml2LT5jb2RlY19wb3dlcmVkID0gMTsKIAotCQkvKiBpbml0aWFsaXplIHZkZC92c3MgcmVnaXN0ZXJzIHdpdGggcmVnX2NhY2hlICovCi0JCXR3bDYwNDBfaW5pdF92ZGRfcmVncyhjb2RlYyk7CisJCXR3bDYwNDBfcmVzdG9yZV9yZWdzKGNvZGVjKTsKIAogCQkvKiBTZXQgZXh0ZXJuYWwgYm9vc3QgR1BPICovCiAJCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0dQT0NUTCwgMHgwMik7CkBAIC0xMzgwLDEzICsxMzM2LDYgQEAKIAkJCQlyYXRlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCS8qIENhcHR1cmUgaXMgbm90IHN1cHBvcnRlZCB3aXRoIDE3LjY0TUh6IHN5c2NsayAqLwotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJImNhcHR1cmUgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGF0ICVkSHpcbiIsCi0JCQkJcmF0ZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQogCQlwcml2LT5zeXNjbGsgPSAxNzY0MDAwMDsKIAkJYnJlYWs7CiAJY2FzZSA4MDAwOgpAQCAtMTQxOSwxMyArMTM2OCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICgocHJpdi0+c3lzY2xrID09IDE3NjQwMDAwKSAmJiBwcml2LT5ub25fbHApIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkic29tZSBlbmFibGVkIHBhdGhzIGFyZW4ndCBzdXBwb3J0ZWQgYXQgJWRIelxuIiwKLQkJCQlwcml2LT5zeXNjbGspOwotCQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KIAlyZXQgPSB0d2w2MDQwX3NldF9wbGwodHdsNjA0MCwgcHJpdi0+cGxsLCBwcml2LT5jbGtfaW4sIHByaXYtPnN5c2Nsayk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDYW4gbm90IHNldCBQTEwgKCVkKVxuIiwgcmV0KTsKQEAgLTE0NjQsMTEgKzE0MDYsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdHdsNjA0MF9kYWlbXSA9IHsKIHsKLQkubmFtZSA9ICJ0d2w2MDQwLWhpZmkiLAorCS5uYW1lID0gInR3bDYwNDAtbGVnYWN5IiwKIAkucGxheWJhY2sgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCiAJCS5jaGFubmVsc19taW4gPSAxLAotCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDUsCiAJCS5yYXRlcyA9IFRXTDYwNDBfUkFURVMsCiAJCS5mb3JtYXRzID0gVFdMNjA0MF9GT1JNQVRTLAogCX0sCkBAIC0xNTE4LDggKzE0NjAsOCBAQAogCS5uYW1lID0gInR3bDYwNDAtdmliIiwKIAkucGxheWJhY2sgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJWaWJyYSBQbGF5YmFjayIsCi0JCS5jaGFubmVsc19taW4gPSAyLAotCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAogCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAogCQkuZm9ybWF0cyA9IFRXTDYwNDBfRk9STUFUUywKIAl9LApAQCAtMTU2Miw2ICsxNTA0LDcgQEAKIAogCXByaXYtPmNvZGVjID0gY29kZWM7CiAJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCWNvZGVjLT5pZ25vcmVfcG1kb3duX3RpbWUgPSAxOwogCiAJaWYgKHBkYXRhICYmIHBkYXRhLT5oc19sZWZ0X3N0ZXAgJiYgcGRhdGEtPmhzX3JpZ2h0X3N0ZXApIHsKIAkJcHJpdi0+aHNfbGVmdF9zdGVwID0gcGRhdGEtPmhzX2xlZnRfc3RlcDsKQEAgLTE1ODYsMzMgKzE1MjksMjEgQEAKIAkJZ290byB3b3JrX2VycjsKIAl9CiAKLQlwcml2LT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidHdsNjA0MC1jb2RlYyIpOworCXByaXYtPndvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgidHdsNjA0MC1jb2RlYyIsIDAsIDApOwogCWlmICghcHJpdi0+d29ya3F1ZXVlKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gd29ya19lcnI7CiAJfQogCi0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmRlbGF5ZWRfd29yaywgdHdsNjA0MF9hY2Nlc3Nvcnlfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmhzX2phY2sud29yaywgdHdsNjA0MF9hY2Nlc3Nvcnlfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmhlYWRzZXQud29yaywgdHdsNjA0MF9wZ2FfaHNfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmhhbmRzZnJlZS53b3JrLCB0d2w2MDQwX3BnYV9oZl93b3JrKTsKIAogCW11dGV4X2luaXQoJnByaXYtPm11dGV4KTsKIAogCWluaXRfY29tcGxldGlvbigmcHJpdi0+aGVhZHNldC5yYW1wX2RvbmUpOwogCWluaXRfY29tcGxldGlvbigmcHJpdi0+aGFuZHNmcmVlLnJhbXBfZG9uZSk7CiAKLQlwcml2LT5oZl93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidHdsNjA0MC1oZiIpOwotCWlmIChwcml2LT5oZl93b3JrcXVldWUgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGhmd3FfZXJyOwotCX0KLQlwcml2LT5oc193b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidHdsNjA0MC1ocyIpOwotCWlmIChwcml2LT5oc193b3JrcXVldWUgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGhzd3FfZXJyOwotCX0KLQotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5oc19kZWxheWVkX3dvcmssIHR3bDYwNDBfcGdhX2hzX3dvcmspOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5oZl9kZWxheWVkX3dvcmssIHR3bDYwNDBfcGdhX2hmX3dvcmspOwotCiAJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocHJpdi0+cGx1Z19pcnEsIE5VTEwsIHR3bDYwNDBfYXVkaW9faGFuZGxlciwKIAkJCQkgICAwLCAidHdsNjA0MF9pcnFfcGx1ZyIsIGNvZGVjKTsKIAlpZiAocmV0KSB7CkBAIC0xNjIwLDI3ICsxNTUxLDE2IEBACiAJCWdvdG8gcGx1Z2lycV9lcnI7CiAJfQogCi0JLyogaW5pdCB2aW8gcmVnaXN0ZXJzICovCi0JdHdsNjA0MF9pbml0X3Zpb19yZWdzKGNvZGVjKTsKKwl0d2w2MDQwX2luaXRfY2hpcChjb2RlYyk7CiAKIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAlyZXQgPSB0d2w2MDQwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0JaWYgKHJldCkKLQkJZ290byBiaWFzX2VycjsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CiAKLQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdHdsNjA0MF9zbmRfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRSh0d2w2MDQwX3NuZF9jb250cm9scykpOwotCXR3bDYwNDBfYWRkX3dpZGdldHMoY29kZWMpOwotCi0JcmV0dXJuIDA7Ci0KLWJpYXNfZXJyOgorCS8qIEVycm9yIHBhdGggKi8KIAlmcmVlX2lycShwcml2LT5wbHVnX2lycSwgY29kZWMpOwogcGx1Z2lycV9lcnI6Ci0JZGVzdHJveV93b3JrcXVldWUocHJpdi0+aHNfd29ya3F1ZXVlKTsKLWhzd3FfZXJyOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPmhmX3dvcmtxdWV1ZSk7Ci1oZndxX2VycjoKIAlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwogd29ya19lcnI6CiAJa2ZyZWUocHJpdik7CkBAIC0xNjU0LDggKzE1NzQsNiBAQAogCXR3bDYwNDBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOwogCWZyZWVfaXJxKHByaXYtPnBsdWdfaXJxLCBjb2RlYyk7CiAJZGVzdHJveV93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT5oZl93b3JrcXVldWUpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPmhzX3dvcmtxdWV1ZSk7CiAJa2ZyZWUocHJpdik7CiAKIAlyZXR1cm4gMDsKQEAgLTE2NzIsNiArMTU5MCwxMyBAQAogCS5yZWdfY2FjaGVfc2l6ZSA9IEFSUkFZX1NJWkUodHdsNjA0MF9yZWcpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHU4KSwKIAkucmVnX2NhY2hlX2RlZmF1bHQgPSB0d2w2MDQwX3JlZywKKworCS5jb250cm9scyA9IHR3bDYwNDBfc25kX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHR3bDYwNDBfc25kX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gdHdsNjA0MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHR3bDYwNDBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBpbnRlcmNvbiwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShpbnRlcmNvbiksCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0d2w2MDQwX2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuaCBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5oCmluZGV4IGQ4ZGU2NzguLmE4MzI3N2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5oCkBAIC0yMiw4ICsyMiwyMSBAQAogI2lmbmRlZiBfX1RXTDYwNDBfSF9fCiAjZGVmaW5lIF9fVFdMNjA0MF9IX18KIAorZW51bSB0d2w2MDQwX3RyaW0geworCVRXTDYwNDBfVFJJTV9UUklNMSA9IDAsCisJVFdMNjA0MF9UUklNX1RSSU0yLAorCVRXTDYwNDBfVFJJTV9UUklNMywKKwlUV0w2MDQwX1RSSU1fSFNPVFJJTSwKKwlUV0w2MDQwX1RSSU1fSEZPVFJJTSwKKwlUV0w2MDQwX1RSSU1fSU5WQUwsCit9OworCisjZGVmaW5lIFRXTDYwNDBfSFNGX1RSSU1fTEVGVCh4KQkoeCAmIDB4MGYpCisjZGVmaW5lIFRXTDYwNDBfSFNGX1RSSU1fUklHSFQoeCkJKCh4ID4+IDQpICYgMHgwZikKKwogdm9pZCB0d2w2MDQwX2hzX2phY2tfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCSAgICBzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLCBpbnQgcmVwb3J0KTsKIGludCB0d2w2MDQwX2dldF9jbGtfaWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK2ludCB0d2w2MDQwX2dldF90cmltX3ZhbHVlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgZW51bSB0d2w2MDQwX3RyaW0gdHJpbSk7CiAKICNlbmRpZiAvKiBFbmQgb2YgX19UV0w2MDQwX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMKaW5kZXggNTgzNjIwMS4uYTg1NDk4OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tZmQvd2wxMjczLWNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtNDYyLDcgKzQ2Myw2IEBACiAJd2wxMjczLT5jb3JlID0gKmNvcmU7CiAKIAlzbmRfc29jX2NvZGVjX3NldF9kcnZkYXRhKGNvZGVjLCB3bDEyNzMpOwotCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7CiAKIAlyID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdsMTI3M19jb250cm9scywKIAkJCQkgQVJSQVlfU0laRSh3bDEyNzNfY29udHJvbHMpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd20xMjUwLWV2MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMKaW5kZXggYmNjMjA4OS4uY2QwZWMwZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMKQEAgLTEyLDEwICsxMiw1OSBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3dtMTI1MC1ldjEuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKndtMTI1MF9ncGlvX25hbWVzW1dNMTI1MF9FVjFfTlVNX0dQSU9TXSA9IHsKKwkiV00xMjUwIENMS19FTkEiLAorCSJXTTEyNTAgQ0xLX1NFTDAiLAorCSJXTTEyNTAgQ0xLX1NFTDEiLAorCSJXTTEyNTAgT1NSIiwKKwkiV00xMjUwIE1BU1RFUiIsCit9OworCitzdHJ1Y3Qgd20xMjUwX3ByaXYgeworCXN0cnVjdCBncGlvIGdwaW9zW1dNMTI1MF9FVjFfTlVNX0dQSU9TXTsKK307CisKK3N0YXRpYyBpbnQgd20xMjUwX2V2MV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgd20xMjUwX3ByaXYgKndtMTI1MCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKKwlpbnQgZW5hOworCisJaWYgKHdtMTI1MCkKKwkJZW5hID0gd20xMjUwLT5ncGlvc1tXTTEyNTBfRVYxX0dQSU9fQ0xLX0VOQV0uZ3BpbzsKKwllbHNlCisJCWVuYSA9IC0xOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKGVuYSA+PSAwKQorCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZW5hLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCWlmIChlbmEgPj0gMCkKKwkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGVuYSwgMCk7CisJCWJyZWFrOworCX0KKworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd20xMjUwX2V2MV9kYXBtX3dpZGdldHNbXSA9IHsKIFNORF9TT0NfREFQTV9BREMoIkFEQyIsICJ3bTEyNTAtZXYxIENhcHR1cmUiLCBTTkRfU09DX05PUE0sIDAsIDApLApAQCAtNTMsMTggKzEwMiwxMDMgQEAKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod20xMjUwX2V2MV9kYXBtX3dpZGdldHMpLAogCS5kYXBtX3JvdXRlcyA9IHdtMTI1MF9ldjFfZGFwbV9yb3V0ZXMsCiAJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod20xMjUwX2V2MV9kYXBtX3JvdXRlcyksCisKKwkuc2V0X2JpYXNfbGV2ZWwgPSB3bTEyNTBfZXYxX3NldF9iaWFzX2xldmVsLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHdtMTI1MF9ldjFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTEyNTBfZXYxX3BkYXRhKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCiB7Ci0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl93bTEyNTBfZXYxLAotCQkJCSAgICAgICZ3bTEyNTBfZXYxX2RhaSwgMSk7CisJc3RydWN0IHdtMTI1MF9ldjFfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmaTJjLT5kZXYpOworCXN0cnVjdCB3bTEyNTBfcHJpdiAqd20xMjUwOworCWludCBpLCByZXQ7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gMDsKKworCXdtMTI1MCA9IGt6YWxsb2Moc2l6ZW9mKCp3bTEyNTApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdtMTI1MCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTEyNTAtPmdwaW9zKTsgaSsrKSB7CisJCXdtMTI1MC0+Z3Bpb3NbaV0uZ3BpbyA9IHBkYXRhLT5ncGlvc1tpXTsKKwkJd20xMjUwLT5ncGlvc1tpXS5sYWJlbCA9IHdtMTI1MF9ncGlvX25hbWVzW2ldOworCQl3bTEyNTAtPmdwaW9zW2ldLmZsYWdzID0gR1BJT0ZfT1VUX0lOSVRfTE9XOworCX0KKwl3bTEyNTAtPmdwaW9zW1dNMTI1MF9FVjFfR1BJT19DTEtfU0VMMF0uZmxhZ3MgPSBHUElPRl9PVVRfSU5JVF9ISUdIOworCXdtMTI1MC0+Z3Bpb3NbV00xMjUwX0VWMV9HUElPX0NMS19TRUwxXS5mbGFncyA9IEdQSU9GX09VVF9JTklUX0hJR0g7CisKKwlyZXQgPSBncGlvX3JlcXVlc3RfYXJyYXkod20xMjUwLT5ncGlvcywgQVJSQVlfU0laRSh3bTEyNTAtPmdwaW9zKSk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGdldCBHUElPczogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2FsbG9jOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YSgmaTJjLT5kZXYsIHdtMTI1MCk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfYWxsb2M6CisJa2ZyZWUod20xMjUwKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3bTEyNTBfZXYxX2ZyZWUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlzdHJ1Y3Qgd20xMjUwX3ByaXYgKndtMTI1MCA9IGRldl9nZXRfZHJ2ZGF0YSgmaTJjLT5kZXYpOworCisJaWYgKHdtMTI1MCkgeworCQlncGlvX2ZyZWVfYXJyYXkod20xMjUwLT5ncGlvcywgQVJSQVlfU0laRSh3bTEyNTAtPmdwaW9zKSk7CisJCWtmcmVlKHdtMTI1MCk7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTEyNTBfZXYxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKK3sKKwlpbnQgaWQsIGJvYXJkLCByZXYsIHJldDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmaTJjLT5kZXYsIE5VTEwpOworCisJYm9hcmQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoaTJjLCAwKTsKKwlpZiAoYm9hcmQgPCAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgSUQ6ICVkXG4iLCBib2FyZCk7CisJCXJldHVybiBib2FyZDsKKwl9CisKKwlpZCA9IChib2FyZCAmIDB4ZmUpID4+IDI7CisJcmV2ID0gYm9hcmQgJiAweDM7CisKKwlpZiAoaWQgIT0gMSkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIlVua25vd24gYm9hcmQgSUQgJWRcbiIsIGlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2X2luZm8oJmkyYy0+ZGV2LCAicmV2aXNpb24gJWRcbiIsIHJldiArIDEpOworCisJcmV0ID0gd20xMjUwX2V2MV9wZGF0YShpMmMpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl93bTEyNTBfZXYxLAorCQkJCSAgICAgJndtMTI1MF9ldjFfZGFpLCAxKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ09ERUM6ICVkXG4iLCByZXQpOworCQl3bTEyNTBfZXYxX2ZyZWUoaTJjKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgd20xMjUwX2V2MV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKIHsKIAlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2KTsKKwl3bTEyNTBfZXYxX2ZyZWUoaTJjKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDAtdGFibGVzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC10YWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWNlODFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAtdGFibGVzLmMKQEAgLTAsMCArMSwxNTMxIEBACisvKgorICogd201MTAwLXRhYmxlcy5jICAtLSAgV001MTAwIEFMU0EgU29DIEF1ZGlvIGRyaXZlciBkYXRhCisgKgorICogQ29weXJpZ2h0IDIwMTEgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIndtNTEwMC5oIgorCitpbnQgd201MTAwX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV001MTAwX1NPRlRXQVJFX1JFU0VUOgorCWNhc2UgV001MTAwX0RFVklDRV9SRVZJU0lPTjoKKwljYXNlIFdNNTEwMF9GWF9DVFJMOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfMToKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzI6CisJY2FzZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfNDoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfUkFXX1NUQVRVU18yOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9SQVdfU1RBVFVTXzM6CisJY2FzZSBXTTUxMDBfSU5URVJSVVBUX1JBV19TVEFUVVNfNDoKKwljYXNlIFdNNTEwMF9PVVRQVVRfU1RBVFVTXzE6CisJY2FzZSBXTTUxMDBfT1VUUFVUX1NUQVRVU18yOgorCWNhc2UgV001MTAwX0lOUFVUX0VOQUJMRVNfU1RBVFVTOgorCWNhc2UgV001MTAwX01JQ19ERVRFQ1RfMzoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgd201MTAwX3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV001MTAwX1NPRlRXQVJFX1JFU0VUOgorCWNhc2UgV001MTAwX0RFVklDRV9SRVZJU0lPTjoKKwljYXNlIFdNNTEwMF9DVFJMX0lGXzE6CisJY2FzZSBXTTUxMDBfVE9ORV9HRU5FUkFUT1JfMToKKwljYXNlIFdNNTEwMF9QV01fRFJJVkVfMToKKwljYXNlIFdNNTEwMF9QV01fRFJJVkVfMjoKKwljYXNlIFdNNTEwMF9QV01fRFJJVkVfMzoKKwljYXNlIFdNNTEwMF9DTE9DS0lOR18xOgorCWNhc2UgV001MTAwX0NMT0NLSU5HXzM6CisJY2FzZSBXTTUxMDBfQ0xPQ0tJTkdfNDoKKwljYXNlIFdNNTEwMF9DTE9DS0lOR181OgorCWNhc2UgV001MTAwX0NMT0NLSU5HXzY6CisJY2FzZSBXTTUxMDBfQ0xPQ0tJTkdfNzoKKwljYXNlIFdNNTEwMF9DTE9DS0lOR184OgorCWNhc2UgV001MTAwX0FTUkNfRU5BQkxFOgorCWNhc2UgV001MTAwX0FTUkNfU1RBVFVTOgorCWNhc2UgV001MTAwX0FTUkNfUkFURTE6CisJY2FzZSBXTTUxMDBfSVNSQ18xX0NUUkxfMToKKwljYXNlIFdNNTEwMF9JU1JDXzFfQ1RSTF8yOgorCWNhc2UgV001MTAwX0lTUkNfMl9DVFJMMToKKwljYXNlIFdNNTEwMF9JU1JDXzJfQ1RSTF8yOgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF8xOgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF8yOgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF8zOgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF81OgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF82OgorCWNhc2UgV001MTAwX0ZMTDFfRUZTXzE6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzE6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzI6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzM6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzU6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzY6CisJY2FzZSBXTTUxMDBfRkxMMl9FRlNfMToKKwljYXNlIFdNNTEwMF9NSUNfQ0hBUkdFX1BVTVBfMToKKwljYXNlIFdNNTEwMF9NSUNfQ0hBUkdFX1BVTVBfMjoKKwljYXNlIFdNNTEwMF9IUF9DSEFSR0VfUFVNUF8xOgorCWNhc2UgV001MTAwX0xETzFfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9NSUNfQklBU19DVFJMXzE6CisJY2FzZSBXTTUxMDBfTUlDX0JJQVNfQ1RSTF8yOgorCWNhc2UgV001MTAwX01JQ19CSUFTX0NUUkxfMzoKKwljYXNlIFdNNTEwMF9BQ0NFU1NPUllfREVURUNUX01PREVfMToKKwljYXNlIFdNNTEwMF9IRUFEUEhPTkVfREVURUNUXzE6CisJY2FzZSBXTTUxMDBfSEVBRFBIT05FX0RFVEVDVF8yOgorCWNhc2UgV001MTAwX01JQ19ERVRFQ1RfMToKKwljYXNlIFdNNTEwMF9NSUNfREVURUNUXzI6CisJY2FzZSBXTTUxMDBfTUlDX0RFVEVDVF8zOgorCWNhc2UgV001MTAwX0lOUFVUX0VOQUJMRVM6CisJY2FzZSBXTTUxMDBfSU5QVVRfRU5BQkxFU19TVEFUVVM6CisJY2FzZSBXTTUxMDBfSU4xTF9DT05UUk9MOgorCWNhc2UgV001MTAwX0lOMVJfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9JTjJMX0NPTlRST0w6CisJY2FzZSBXTTUxMDBfSU4yUl9DT05UUk9MOgorCWNhc2UgV001MTAwX0lOM0xfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9JTjNSX0NPTlRST0w6CisJY2FzZSBXTTUxMDBfSU40TF9DT05UUk9MOgorCWNhc2UgV001MTAwX0lONFJfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9SWEFOQ19TUkM6CisJY2FzZSBXTTUxMDBfSU5QVVRfVk9MVU1FX1JBTVA6CisJY2FzZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzFMOgorCWNhc2UgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8xUjoKKwljYXNlIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMkw6CisJY2FzZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzJSOgorCWNhc2UgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8zTDoKKwljYXNlIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfM1I6CisJY2FzZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzRMOgorCWNhc2UgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV80UjoKKwljYXNlIFdNNTEwMF9PVVRQVVRfRU5BQkxFU18yOgorCWNhc2UgV001MTAwX09VVFBVVF9TVEFUVVNfMToKKwljYXNlIFdNNTEwMF9PVVRQVVRfU1RBVFVTXzI6CisJY2FzZSBXTTUxMDBfQ0hBTk5FTF9FTkFCTEVTXzE6CisJY2FzZSBXTTUxMDBfT1VUX1ZPTFVNRV8xTDoKKwljYXNlIFdNNTEwMF9PVVRfVk9MVU1FXzFSOgorCWNhc2UgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfMUw6CisJY2FzZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF8xUjoKKwljYXNlIFdNNTEwMF9PVVRfVk9MVU1FXzJMOgorCWNhc2UgV001MTAwX09VVF9WT0xVTUVfMlI6CisJY2FzZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF8yTDoKKwljYXNlIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzJSOgorCWNhc2UgV001MTAwX09VVF9WT0xVTUVfM0w6CisJY2FzZSBXTTUxMDBfT1VUX1ZPTFVNRV8zUjoKKwljYXNlIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzNMOgorCWNhc2UgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfM1I6CisJY2FzZSBXTTUxMDBfT1VUX1ZPTFVNRV80TDoKKwljYXNlIFdNNTEwMF9PVVRfVk9MVU1FXzRSOgorCWNhc2UgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfNUw6CisJY2FzZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF81UjoKKwljYXNlIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzZMOgorCWNhc2UgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfNlI6CisJY2FzZSBXTTUxMDBfREFDX0FFQ19DT05UUk9MXzE6CisJY2FzZSBXTTUxMDBfT1VUUFVUX1ZPTFVNRV9SQU1QOgorCWNhc2UgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8xTDoKKwljYXNlIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfMVI6CisJY2FzZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzJMOgorCWNhc2UgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8yUjoKKwljYXNlIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfM0w6CisJY2FzZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzNSOgorCWNhc2UgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV80TDoKKwljYXNlIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNFI6CisJY2FzZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzVMOgorCWNhc2UgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV81UjoKKwljYXNlIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNkw6CisJY2FzZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzZSOgorCWNhc2UgV001MTAwX1BETV9TUEsxX0NUUkxfMToKKwljYXNlIFdNNTEwMF9QRE1fU1BLMV9DVFJMXzI6CisJY2FzZSBXTTUxMDBfUERNX1NQSzJfQ1RSTF8xOgorCWNhc2UgV001MTAwX1BETV9TUEsyX0NUUkxfMjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8yOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzQ6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV81OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfNjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzc6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV84OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfOToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzEwOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMTE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8xMjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzEzOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMTQ6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8xNToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzE2OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMTc6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8xODoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzE5OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMjA6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8yMToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzIyOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMjM6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8yNDoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzI1OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMjY6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8yNzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl8yOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfMzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzQ6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl81OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfNjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzc6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl84OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfOToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzEwOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfMTE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl8xODoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzE5OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfMjY6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl8yNzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM18yOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfMzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzQ6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM181OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfNjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzc6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM184OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfOToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzEwOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfMTE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM18xODoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzE5OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfMjY6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM18yNzoKKwljYXNlIFdNNTEwMF9QV00xTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX1BXTTFNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfUFdNMU1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9QV00xTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX1BXTTFNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfUFdNMU1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9QV00xTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX1BXTTFNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9QV00yTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX1BXTTJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9QV00yTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX1BXTTJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9QV00yTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRMU1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTFNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVExTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0VRMU1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTFNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVExTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRMU1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTFNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0VRMk1JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRMk1JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0VRMk1JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRM01JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTNNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0VRM01JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTNNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRNE1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTRNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0VRNE1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTRNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRNE1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTRNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDVNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDZNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDVNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDZNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDVNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDZNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQVNSQzFMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FTUkMxUk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BU1JDMkxNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQVNSQzJSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMxREVDMU1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMURFQzJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzFERUMzTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMxREVDNE1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMUlOVDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzFJTlQyTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMxSU5UM01JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMUlOVDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzJERUMxTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMyREVDMk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMkRFQzNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzJERUM0TUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMySU5UMU1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMklOVDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzJJTlQzTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMySU5UNE1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfMToKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfMjoKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfMzoKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfNDoKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfNToKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfNjoKKwljYXNlIFdNNTEwMF9NSVNDX1BBRF9DVFJMXzE6CisJY2FzZSBXTTUxMDBfTUlTQ19QQURfQ1RSTF8yOgorCWNhc2UgV001MTAwX01JU0NfUEFEX0NUUkxfMzoKKwljYXNlIFdNNTEwMF9NSVNDX1BBRF9DVFJMXzQ6CisJY2FzZSBXTTUxMDBfTUlTQ19QQURfQ1RSTF81OgorCWNhc2UgV001MTAwX01JU0NfR1BJT18xOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfMToKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzI6CisJY2FzZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfNDoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfUkFXX1NUQVRVU18yOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9SQVdfU1RBVFVTXzM6CisJY2FzZSBXTTUxMDBfSU5URVJSVVBUX1JBV19TVEFUVVNfNDoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSzoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzJfTUFTSzoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzNfTUFTSzoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzRfTUFTSzoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9JUlFfREVCT1VOQ0VfMToKKwljYXNlIFdNNTEwMF9JUlFfREVCT1VOQ0VfMjoKKwljYXNlIFdNNTEwMF9GWF9DVFJMOgorCWNhc2UgV001MTAwX0VRMV8xOgorCWNhc2UgV001MTAwX0VRMV8yOgorCWNhc2UgV001MTAwX0VRMV8zOgorCWNhc2UgV001MTAwX0VRMV80OgorCWNhc2UgV001MTAwX0VRMV81OgorCWNhc2UgV001MTAwX0VRMV82OgorCWNhc2UgV001MTAwX0VRMV83OgorCWNhc2UgV001MTAwX0VRMV84OgorCWNhc2UgV001MTAwX0VRMV85OgorCWNhc2UgV001MTAwX0VRMV8xMDoKKwljYXNlIFdNNTEwMF9FUTFfMTE6CisJY2FzZSBXTTUxMDBfRVExXzEyOgorCWNhc2UgV001MTAwX0VRMV8xMzoKKwljYXNlIFdNNTEwMF9FUTFfMTQ6CisJY2FzZSBXTTUxMDBfRVExXzE1OgorCWNhc2UgV001MTAwX0VRMV8xNjoKKwljYXNlIFdNNTEwMF9FUTFfMTc6CisJY2FzZSBXTTUxMDBfRVExXzE4OgorCWNhc2UgV001MTAwX0VRMV8xOToKKwljYXNlIFdNNTEwMF9FUTFfMjA6CisJY2FzZSBXTTUxMDBfRVEyXzE6CisJY2FzZSBXTTUxMDBfRVEyXzI6CisJY2FzZSBXTTUxMDBfRVEyXzM6CisJY2FzZSBXTTUxMDBfRVEyXzQ6CisJY2FzZSBXTTUxMDBfRVEyXzU6CisJY2FzZSBXTTUxMDBfRVEyXzY6CisJY2FzZSBXTTUxMDBfRVEyXzc6CisJY2FzZSBXTTUxMDBfRVEyXzg6CisJY2FzZSBXTTUxMDBfRVEyXzk6CisJY2FzZSBXTTUxMDBfRVEyXzEwOgorCWNhc2UgV001MTAwX0VRMl8xMToKKwljYXNlIFdNNTEwMF9FUTJfMTI6CisJY2FzZSBXTTUxMDBfRVEyXzEzOgorCWNhc2UgV001MTAwX0VRMl8xNDoKKwljYXNlIFdNNTEwMF9FUTJfMTU6CisJY2FzZSBXTTUxMDBfRVEyXzE2OgorCWNhc2UgV001MTAwX0VRMl8xNzoKKwljYXNlIFdNNTEwMF9FUTJfMTg6CisJY2FzZSBXTTUxMDBfRVEyXzE5OgorCWNhc2UgV001MTAwX0VRMl8yMDoKKwljYXNlIFdNNTEwMF9FUTNfMToKKwljYXNlIFdNNTEwMF9FUTNfMjoKKwljYXNlIFdNNTEwMF9FUTNfMzoKKwljYXNlIFdNNTEwMF9FUTNfNDoKKwljYXNlIFdNNTEwMF9FUTNfNToKKwljYXNlIFdNNTEwMF9FUTNfNjoKKwljYXNlIFdNNTEwMF9FUTNfNzoKKwljYXNlIFdNNTEwMF9FUTNfODoKKwljYXNlIFdNNTEwMF9FUTNfOToKKwljYXNlIFdNNTEwMF9FUTNfMTA6CisJY2FzZSBXTTUxMDBfRVEzXzExOgorCWNhc2UgV001MTAwX0VRM18xMjoKKwljYXNlIFdNNTEwMF9FUTNfMTM6CisJY2FzZSBXTTUxMDBfRVEzXzE0OgorCWNhc2UgV001MTAwX0VRM18xNToKKwljYXNlIFdNNTEwMF9FUTNfMTY6CisJY2FzZSBXTTUxMDBfRVEzXzE3OgorCWNhc2UgV001MTAwX0VRM18xODoKKwljYXNlIFdNNTEwMF9FUTNfMTk6CisJY2FzZSBXTTUxMDBfRVEzXzIwOgorCWNhc2UgV001MTAwX0VRNF8xOgorCWNhc2UgV001MTAwX0VRNF8yOgorCWNhc2UgV001MTAwX0VRNF8zOgorCWNhc2UgV001MTAwX0VRNF80OgorCWNhc2UgV001MTAwX0VRNF81OgorCWNhc2UgV001MTAwX0VRNF82OgorCWNhc2UgV001MTAwX0VRNF83OgorCWNhc2UgV001MTAwX0VRNF84OgorCWNhc2UgV001MTAwX0VRNF85OgorCWNhc2UgV001MTAwX0VRNF8xMDoKKwljYXNlIFdNNTEwMF9FUTRfMTE6CisJY2FzZSBXTTUxMDBfRVE0XzEyOgorCWNhc2UgV001MTAwX0VRNF8xMzoKKwljYXNlIFdNNTEwMF9FUTRfMTQ6CisJY2FzZSBXTTUxMDBfRVE0XzE1OgorCWNhc2UgV001MTAwX0VRNF8xNjoKKwljYXNlIFdNNTEwMF9FUTRfMTc6CisJY2FzZSBXTTUxMDBfRVE0XzE4OgorCWNhc2UgV001MTAwX0VRNF8xOToKKwljYXNlIFdNNTEwMF9FUTRfMjA6CisJY2FzZSBXTTUxMDBfRFJDMV9DVFJMMToKKwljYXNlIFdNNTEwMF9EUkMxX0NUUkwyOgorCWNhc2UgV001MTAwX0RSQzFfQ1RSTDM6CisJY2FzZSBXTTUxMDBfRFJDMV9DVFJMNDoKKwljYXNlIFdNNTEwMF9EUkMxX0NUUkw1OgorCWNhc2UgV001MTAwX0hQTFBGMV8xOgorCWNhc2UgV001MTAwX0hQTFBGMV8yOgorCWNhc2UgV001MTAwX0hQTFBGMl8xOgorCWNhc2UgV001MTAwX0hQTFBGMl8yOgorCWNhc2UgV001MTAwX0hQTFBGM18xOgorCWNhc2UgV001MTAwX0hQTFBGM18yOgorCWNhc2UgV001MTAwX0hQTFBGNF8xOgorCWNhc2UgV001MTAwX0hQTFBGNF8yOgorCWNhc2UgV001MTAwX0RTUDFfRE1fMDoKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzE6CisJY2FzZSBXTTUxMDBfRFNQMV9ETV8yOgorCWNhc2UgV001MTAwX0RTUDFfRE1fMzoKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzUwODoKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzUwOToKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzUxMDoKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzUxMToKKwljYXNlIFdNNTEwMF9EU1AxX1BNXzA6CisJY2FzZSBXTTUxMDBfRFNQMV9QTV8xOgorCWNhc2UgV001MTAwX0RTUDFfUE1fMjoKKwljYXNlIFdNNTEwMF9EU1AxX1BNXzM6CisJY2FzZSBXTTUxMDBfRFNQMV9QTV80OgorCWNhc2UgV001MTAwX0RTUDFfUE1fNToKKwljYXNlIFdNNTEwMF9EU1AxX1BNXzE1MzA6CisJY2FzZSBXTTUxMDBfRFNQMV9QTV8xNTMxOgorCWNhc2UgV001MTAwX0RTUDFfUE1fMTUzMjoKKwljYXNlIFdNNTEwMF9EU1AxX1BNXzE1MzM6CisJY2FzZSBXTTUxMDBfRFNQMV9QTV8xNTM0OgorCWNhc2UgV001MTAwX0RTUDFfUE1fMTUzNToKKwljYXNlIFdNNTEwMF9EU1AxX1pNXzA6CisJY2FzZSBXTTUxMDBfRFNQMV9aTV8xOgorCWNhc2UgV001MTAwX0RTUDFfWk1fMjoKKwljYXNlIFdNNTEwMF9EU1AxX1pNXzM6CisJY2FzZSBXTTUxMDBfRFNQMV9aTV8yMDQ0OgorCWNhc2UgV001MTAwX0RTUDFfWk1fMjA0NToKKwljYXNlIFdNNTEwMF9EU1AxX1pNXzIwNDY6CisJY2FzZSBXTTUxMDBfRFNQMV9aTV8yMDQ3OgorCWNhc2UgV001MTAwX0RTUDJfRE1fMDoKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzE6CisJY2FzZSBXTTUxMDBfRFNQMl9ETV8yOgorCWNhc2UgV001MTAwX0RTUDJfRE1fMzoKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzUwODoKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzUwOToKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzUxMDoKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzUxMToKKwljYXNlIFdNNTEwMF9EU1AyX1BNXzA6CisJY2FzZSBXTTUxMDBfRFNQMl9QTV8xOgorCWNhc2UgV001MTAwX0RTUDJfUE1fMjoKKwljYXNlIFdNNTEwMF9EU1AyX1BNXzM6CisJY2FzZSBXTTUxMDBfRFNQMl9QTV80OgorCWNhc2UgV001MTAwX0RTUDJfUE1fNToKKwljYXNlIFdNNTEwMF9EU1AyX1BNXzE1MzA6CisJY2FzZSBXTTUxMDBfRFNQMl9QTV8xNTMxOgorCWNhc2UgV001MTAwX0RTUDJfUE1fMTUzMjoKKwljYXNlIFdNNTEwMF9EU1AyX1BNXzE1MzM6CisJY2FzZSBXTTUxMDBfRFNQMl9QTV8xNTM0OgorCWNhc2UgV001MTAwX0RTUDJfUE1fMTUzNToKKwljYXNlIFdNNTEwMF9EU1AyX1pNXzA6CisJY2FzZSBXTTUxMDBfRFNQMl9aTV8xOgorCWNhc2UgV001MTAwX0RTUDJfWk1fMjoKKwljYXNlIFdNNTEwMF9EU1AyX1pNXzM6CisJY2FzZSBXTTUxMDBfRFNQMl9aTV8yMDQ0OgorCWNhc2UgV001MTAwX0RTUDJfWk1fMjA0NToKKwljYXNlIFdNNTEwMF9EU1AyX1pNXzIwNDY6CisJY2FzZSBXTTUxMDBfRFNQMl9aTV8yMDQ3OgorCWNhc2UgV001MTAwX0RTUDNfRE1fMDoKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzE6CisJY2FzZSBXTTUxMDBfRFNQM19ETV8yOgorCWNhc2UgV001MTAwX0RTUDNfRE1fMzoKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzUwODoKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzUwOToKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzUxMDoKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzUxMToKKwljYXNlIFdNNTEwMF9EU1AzX1BNXzA6CisJY2FzZSBXTTUxMDBfRFNQM19QTV8xOgorCWNhc2UgV001MTAwX0RTUDNfUE1fMjoKKwljYXNlIFdNNTEwMF9EU1AzX1BNXzM6CisJY2FzZSBXTTUxMDBfRFNQM19QTV80OgorCWNhc2UgV001MTAwX0RTUDNfUE1fNToKKwljYXNlIFdNNTEwMF9EU1AzX1BNXzE1MzA6CisJY2FzZSBXTTUxMDBfRFNQM19QTV8xNTMxOgorCWNhc2UgV001MTAwX0RTUDNfUE1fMTUzMjoKKwljYXNlIFdNNTEwMF9EU1AzX1BNXzE1MzM6CisJY2FzZSBXTTUxMDBfRFNQM19QTV8xNTM0OgorCWNhc2UgV001MTAwX0RTUDNfUE1fMTUzNToKKwljYXNlIFdNNTEwMF9EU1AzX1pNXzA6CisJY2FzZSBXTTUxMDBfRFNQM19aTV8xOgorCWNhc2UgV001MTAwX0RTUDNfWk1fMjoKKwljYXNlIFdNNTEwMF9EU1AzX1pNXzM6CisJY2FzZSBXTTUxMDBfRFNQM19aTV8yMDQ0OgorCWNhc2UgV001MTAwX0RTUDNfWk1fMjA0NToKKwljYXNlIFdNNTEwMF9EU1AzX1pNXzIwNDY6CisJY2FzZSBXTTUxMDBfRFNQM19aTV8yMDQ3OgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3UxNiB3bTUxMDBfcmVnX2RlZmF1bHRzW1dNNTEwMF9NQVhfUkVHSVNURVIgKyAxXSA9IHsKKwlbMHgwMDAwXSA9IDB4MDAwMCwgICAgIC8qIFIwICAgICAtIHNvZnR3YXJlIHJlc2V0ICovCisJWzB4MDAwMV0gPSAweDAwMDAsICAgICAvKiBSMSAgICAgLSBEZXZpY2UgUmV2aXNpb24gKi8KKwlbMHgwMDEwXSA9IDB4MDgwMSwgICAgIC8qIFIxNiAgICAtIEN0cmwgSUYgMSAqLworCVsweDAwMjBdID0gMHgwMDAwLCAgICAgLyogUjMyICAgIC0gVG9uZSBHZW5lcmF0b3IgMSAqLworCVsweDAwMzBdID0gMHgwMDAwLCAgICAgLyogUjQ4ICAgIC0gUFdNIERyaXZlIDEgKi8KKwlbMHgwMDMxXSA9IDB4MDEwMCwgICAgIC8qIFI0OSAgICAtIFBXTSBEcml2ZSAyICovCisJWzB4MDAzMl0gPSAweDAxMDAsICAgICAvKiBSNTAgICAgLSBQV00gRHJpdmUgMyAqLworCVsweDAxMDBdID0gMHgwMDAyLCAgICAgLyogUjI1NiAgIC0gQ2xvY2tpbmcgMSAqLworCVsweDAxMDFdID0gMHgwMDAwLCAgICAgLyogUjI1NyAgIC0gQ2xvY2tpbmcgMyAqLworCVsweDAxMDJdID0gMHgwMDExLCAgICAgLyogUjI1OCAgIC0gQ2xvY2tpbmcgNCAqLworCVsweDAxMDNdID0gMHgwMDExLCAgICAgLyogUjI1OSAgIC0gQ2xvY2tpbmcgNSAqLworCVsweDAxMDRdID0gMHgwMDExLCAgICAgLyogUjI2MCAgIC0gQ2xvY2tpbmcgNiAqLworCVsweDAxMDddID0gMHgwMDAwLCAgICAgLyogUjI2MyAgIC0gQ2xvY2tpbmcgNyAqLworCVsweDAxMDhdID0gMHgwMDAwLCAgICAgLyogUjI2NCAgIC0gQ2xvY2tpbmcgOCAqLworCVsweDAxMjBdID0gMHgwMDAwLCAgICAgLyogUjI4OCAgIC0gQVNSQ19FTkFCTEUgKi8KKwlbMHgwMTIxXSA9IDB4MDAwMCwgICAgIC8qIFIyODkgICAtIEFTUkNfU1RBVFVTICovCisJWzB4MDEyMl0gPSAweDAwMDAsICAgICAvKiBSMjkwICAgLSBBU1JDX1JBVEUxICovCisJWzB4MDE0MV0gPSAweDgwMDAsICAgICAvKiBSMzIxICAgLSBJU1JDIDEgQ1RSTCAxICovCisJWzB4MDE0Ml0gPSAweDAwMDAsICAgICAvKiBSMzIyICAgLSBJU1JDIDEgQ1RSTCAyICovCisJWzB4MDE0M10gPSAweDgwMDAsICAgICAvKiBSMzIzICAgLSBJU1JDIDIgQ1RSTDEgKi8KKwlbMHgwMTQ0XSA9IDB4MDAwMCwgICAgIC8qIFIzMjQgICAtIElTUkMgMiBDVFJMIDIgKi8KKwlbMHgwMTgyXSA9IDB4MDAwMCwgICAgIC8qIFIzODYgICAtIEZMTDEgQ29udHJvbCAxICovCisJWzB4MDE4M10gPSAweDAwMDAsICAgICAvKiBSMzg3ICAgLSBGTEwxIENvbnRyb2wgMiAqLworCVsweDAxODRdID0gMHgwMDAwLCAgICAgLyogUjM4OCAgIC0gRkxMMSBDb250cm9sIDMgKi8KKwlbMHgwMTg2XSA9IDB4MDE3NywgICAgIC8qIFIzOTAgICAtIEZMTDEgQ29udHJvbCA1ICovCisJWzB4MDE4N10gPSAweDAwMDEsICAgICAvKiBSMzkxICAgLSBGTEwxIENvbnRyb2wgNiAqLworCVsweDAxODhdID0gMHgwMDAwLCAgICAgLyogUjM5MiAgIC0gRkxMMSBFRlMgMSAqLworCVsweDAxQTJdID0gMHgwMDAwLCAgICAgLyogUjQxOCAgIC0gRkxMMiBDb250cm9sIDEgKi8KKwlbMHgwMUEzXSA9IDB4MDAwMCwgICAgIC8qIFI0MTkgICAtIEZMTDIgQ29udHJvbCAyICovCisJWzB4MDFBNF0gPSAweDAwMDAsICAgICAvKiBSNDIwICAgLSBGTEwyIENvbnRyb2wgMyAqLworCVsweDAxQTZdID0gMHgwMTc3LCAgICAgLyogUjQyMiAgIC0gRkxMMiBDb250cm9sIDUgKi8KKwlbMHgwMUE3XSA9IDB4MDAwMSwgICAgIC8qIFI0MjMgICAtIEZMTDIgQ29udHJvbCA2ICovCisJWzB4MDFBOF0gPSAweDAwMDAsICAgICAvKiBSNDI0ICAgLSBGTEwyIEVGUyAxICovCisJWzB4MDIwMF0gPSAweDAwMjAsICAgICAvKiBSNTEyICAgLSBNaWMgQ2hhcmdlIFB1bXAgMSAqLworCVsweDAyMDFdID0gMHhCMDg0LCAgICAgLyogUjUxMyAgIC0gTWljIENoYXJnZSBQdW1wIDIgKi8KKwlbMHgwMjAyXSA9IDB4QkJERSwgICAgIC8qIFI1MTQgICAtIEhQIENoYXJnZSBQdW1wIDEgKi8KKwlbMHgwMjExXSA9IDB4MjBENCwgICAgIC8qIFI1MjkgICAtIExETzEgQ29udHJvbCAqLworCVsweDAyMTVdID0gMHgwMDYyLCAgICAgLyogUjUzMyAgIC0gTWljIEJpYXMgQ3RybCAxICovCisJWzB4MDIxNl0gPSAweDAwNjIsICAgICAvKiBSNTM0ICAgLSBNaWMgQmlhcyBDdHJsIDIgKi8KKwlbMHgwMjE3XSA9IDB4MDA2MiwgICAgIC8qIFI1MzUgICAtIE1pYyBCaWFzIEN0cmwgMyAqLworCVsweDAyODBdID0gMHgwMDA0LCAgICAgLyogUjY0MCAgIC0gQWNjZXNzb3J5IERldGVjdCBNb2RlIDEgKi8KKwlbMHgwMjg4XSA9IDB4MDAyMCwgICAgIC8qIFI2NDggICAtIEhlYWRwaG9uZSBEZXRlY3QgMSAqLworCVsweDAyODldID0gMHgwMDAwLCAgICAgLyogUjY0OSAgIC0gSGVhZHBob25lIERldGVjdCAyICovCisJWzB4MDI5MF0gPSAweDExMDAsICAgICAvKiBSNjU2ICAgLSBNaWMgRGV0ZWN0IDEgKi8KKwlbMHgwMjkxXSA9IDB4MDA5RiwgICAgIC8qIFI2NTcgICAtIE1pYyBEZXRlY3QgMiAqLworCVsweDAyOTJdID0gMHgwMDAwLCAgICAgLyogUjY1OCAgIC0gTWljIERldGVjdCAzICovCisJWzB4MDMwMV0gPSAweDAwMDAsICAgICAvKiBSNzY5ICAgLSBJbnB1dCBFbmFibGVzICovCisJWzB4MDMwMl0gPSAweDAwMDAsICAgICAvKiBSNzcwICAgLSBJbnB1dCBFbmFibGVzIFN0YXR1cyAqLworCVsweDAzMTBdID0gMHgyMjgwLCAgICAgLyogUjc4NCAgIC0gU3RhdHVzICovCisJWzB4MDMxMV0gPSAweDAwODAsICAgICAvKiBSNzg1ICAgLSBJTjFSIENvbnRyb2wgKi8KKwlbMHgwMzEyXSA9IDB4MjI4MCwgICAgIC8qIFI3ODYgICAtIElOMkwgQ29udHJvbCAqLworCVsweDAzMTNdID0gMHgwMDgwLCAgICAgLyogUjc4NyAgIC0gSU4yUiBDb250cm9sICovCisJWzB4MDMxNF0gPSAweDIyODAsICAgICAvKiBSNzg4ICAgLSBJTjNMIENvbnRyb2wgKi8KKwlbMHgwMzE1XSA9IDB4MDA4MCwgICAgIC8qIFI3ODkgICAtIElOM1IgQ29udHJvbCAqLworCVsweDAzMTZdID0gMHgyMjgwLCAgICAgLyogUjc5MCAgIC0gSU40TCBDb250cm9sICovCisJWzB4MDMxN10gPSAweDAwODAsICAgICAvKiBSNzkxICAgLSBJTjRSIENvbnRyb2wgKi8KKwlbMHgwMzE4XSA9IDB4MDAwMCwgICAgIC8qIFI3OTIgICAtIFJYQU5DX1NSQyAqLworCVsweDAzMTldID0gMHgwMDIyLCAgICAgLyogUjc5MyAgIC0gSW5wdXQgVm9sdW1lIFJhbXAgKi8KKwlbMHgwMzIwXSA9IDB4MDE4MCwgICAgIC8qIFI4MDAgICAtIEFEQyBEaWdpdGFsIFZvbHVtZSAxTCAqLworCVsweDAzMjFdID0gMHgwMTgwLCAgICAgLyogUjgwMSAgIC0gQURDIERpZ2l0YWwgVm9sdW1lIDFSICovCisJWzB4MDMyMl0gPSAweDAxODAsICAgICAvKiBSODAyICAgLSBBREMgRGlnaXRhbCBWb2x1bWUgMkwgKi8KKwlbMHgwMzIzXSA9IDB4MDE4MCwgICAgIC8qIFI4MDMgICAtIEFEQyBEaWdpdGFsIFZvbHVtZSAyUiAqLworCVsweDAzMjRdID0gMHgwMTgwLCAgICAgLyogUjgwNCAgIC0gQURDIERpZ2l0YWwgVm9sdW1lIDNMICovCisJWzB4MDMyNV0gPSAweDAxODAsICAgICAvKiBSODA1ICAgLSBBREMgRGlnaXRhbCBWb2x1bWUgM1IgKi8KKwlbMHgwMzI2XSA9IDB4MDE4MCwgICAgIC8qIFI4MDYgICAtIEFEQyBEaWdpdGFsIFZvbHVtZSA0TCAqLworCVsweDAzMjddID0gMHgwMTgwLCAgICAgLyogUjgwNyAgIC0gQURDIERpZ2l0YWwgVm9sdW1lIDRSICovCisJWzB4MDQwMV0gPSAweDAwMDAsICAgICAvKiBSMTAyNSAgLSBPdXRwdXQgRW5hYmxlcyAyICovCisJWzB4MDQwMl0gPSAweDAwMDAsICAgICAvKiBSMTAyNiAgLSBPdXRwdXQgU3RhdHVzIDEgKi8KKwlbMHgwNDAzXSA9IDB4MDAwMCwgICAgIC8qIFIxMDI3ICAtIE91dHB1dCBTdGF0dXMgMiAqLworCVsweDA0MDhdID0gMHgwMDAwLCAgICAgLyogUjEwMzIgIC0gQ2hhbm5lbCBFbmFibGVzIDEgKi8KKwlbMHgwNDEwXSA9IDB4MDA4MCwgICAgIC8qIFIxMDQwICAtIE91dCBWb2x1bWUgMUwgKi8KKwlbMHgwNDExXSA9IDB4MDA4MCwgICAgIC8qIFIxMDQxICAtIE91dCBWb2x1bWUgMVIgKi8KKwlbMHgwNDEyXSA9IDB4MDA4MCwgICAgIC8qIFIxMDQyICAtIERBQyBWb2x1bWUgTGltaXQgMUwgKi8KKwlbMHgwNDEzXSA9IDB4MDA4MCwgICAgIC8qIFIxMDQzICAtIERBQyBWb2x1bWUgTGltaXQgMVIgKi8KKwlbMHgwNDE0XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ0ICAtIE91dCBWb2x1bWUgMkwgKi8KKwlbMHgwNDE1XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ1ICAtIE91dCBWb2x1bWUgMlIgKi8KKwlbMHgwNDE2XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ2ICAtIERBQyBWb2x1bWUgTGltaXQgMkwgKi8KKwlbMHgwNDE3XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ3ICAtIERBQyBWb2x1bWUgTGltaXQgMlIgKi8KKwlbMHgwNDE4XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ4ICAtIE91dCBWb2x1bWUgM0wgKi8KKwlbMHgwNDE5XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ5ICAtIE91dCBWb2x1bWUgM1IgKi8KKwlbMHgwNDFBXSA9IDB4MDA4MCwgICAgIC8qIFIxMDUwICAtIERBQyBWb2x1bWUgTGltaXQgM0wgKi8KKwlbMHgwNDFCXSA9IDB4MDA4MCwgICAgIC8qIFIxMDUxICAtIERBQyBWb2x1bWUgTGltaXQgM1IgKi8KKwlbMHgwNDFDXSA9IDB4MDA4MCwgICAgIC8qIFIxMDUyICAtIE91dCBWb2x1bWUgNEwgKi8KKwlbMHgwNDFEXSA9IDB4MDA4MCwgICAgIC8qIFIxMDUzICAtIE91dCBWb2x1bWUgNFIgKi8KKwlbMHgwNDFFXSA9IDB4MDA4MCwgICAgIC8qIFIxMDU0ICAtIERBQyBWb2x1bWUgTGltaXQgNUwgKi8KKwlbMHgwNDFGXSA9IDB4MDA4MCwgICAgIC8qIFIxMDU1ICAtIERBQyBWb2x1bWUgTGltaXQgNVIgKi8KKwlbMHgwNDIwXSA9IDB4MDA4MCwgICAgIC8qIFIxMDU2ICAtIERBQyBWb2x1bWUgTGltaXQgNkwgKi8KKwlbMHgwNDIxXSA9IDB4MDA4MCwgICAgIC8qIFIxMDU3ICAtIERBQyBWb2x1bWUgTGltaXQgNlIgKi8KKwlbMHgwNDQwXSA9IDB4MDAwMCwgICAgIC8qIFIxMDg4ICAtIERBQyBBRUMgQ29udHJvbCAxICovCisJWzB4MDQ0MV0gPSAweDAwMjIsICAgICAvKiBSMTA4OSAgLSBPdXRwdXQgVm9sdW1lIFJhbXAgKi8KKwlbMHgwNDgwXSA9IDB4MDE4MCwgICAgIC8qIFIxMTUyICAtIERBQyBEaWdpdGFsIFZvbHVtZSAxTCAqLworCVsweDA0ODFdID0gMHgwMTgwLCAgICAgLyogUjExNTMgIC0gREFDIERpZ2l0YWwgVm9sdW1lIDFSICovCisJWzB4MDQ4Ml0gPSAweDAxODAsICAgICAvKiBSMTE1NCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgMkwgKi8KKwlbMHgwNDgzXSA9IDB4MDE4MCwgICAgIC8qIFIxMTU1ICAtIERBQyBEaWdpdGFsIFZvbHVtZSAyUiAqLworCVsweDA0ODRdID0gMHgwMTgwLCAgICAgLyogUjExNTYgIC0gREFDIERpZ2l0YWwgVm9sdW1lIDNMICovCisJWzB4MDQ4NV0gPSAweDAxODAsICAgICAvKiBSMTE1NyAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgM1IgKi8KKwlbMHgwNDg2XSA9IDB4MDE4MCwgICAgIC8qIFIxMTU4ICAtIERBQyBEaWdpdGFsIFZvbHVtZSA0TCAqLworCVsweDA0ODddID0gMHgwMTgwLCAgICAgLyogUjExNTkgIC0gREFDIERpZ2l0YWwgVm9sdW1lIDRSICovCisJWzB4MDQ4OF0gPSAweDAxODAsICAgICAvKiBSMTE2MCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgNUwgKi8KKwlbMHgwNDg5XSA9IDB4MDE4MCwgICAgIC8qIFIxMTYxICAtIERBQyBEaWdpdGFsIFZvbHVtZSA1UiAqLworCVsweDA0OEFdID0gMHgwMTgwLCAgICAgLyogUjExNjIgIC0gREFDIERpZ2l0YWwgVm9sdW1lIDZMICovCisJWzB4MDQ4Ql0gPSAweDAxODAsICAgICAvKiBSMTE2MyAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgNlIgKi8KKwlbMHgwNEMwXSA9IDB4MDA2OSwgICAgIC8qIFIxMjE2ICAtIFBETSBTUEsxIENUUkwgMSAqLworCVsweDA0QzFdID0gMHgwMDAwLCAgICAgLyogUjEyMTcgIC0gUERNIFNQSzEgQ1RSTCAyICovCisJWzB4MDRDMl0gPSAweDAwNjksICAgICAvKiBSMTIxOCAgLSBQRE0gU1BLMiBDVFJMIDEgKi8KKwlbMHgwNEMzXSA9IDB4MDAwMCwgICAgIC8qIFIxMjE5ICAtIFBETSBTUEsyIENUUkwgMiAqLworCVsweDA1MDBdID0gMHgwMDBDLCAgICAgLyogUjEyODAgIC0gQXVkaW8gSUYgMV8xICovCisJWzB4MDUwMV0gPSAweDAwMDgsICAgICAvKiBSMTI4MSAgLSBBdWRpbyBJRiAxXzIgKi8KKwlbMHgwNTAyXSA9IDB4MDAwMCwgICAgIC8qIFIxMjgyICAtIEF1ZGlvIElGIDFfMyAqLworCVsweDA1MDNdID0gMHgwMDAwLCAgICAgLyogUjEyODMgIC0gQXVkaW8gSUYgMV80ICovCisJWzB4MDUwNF0gPSAweDAwMDAsICAgICAvKiBSMTI4NCAgLSBBdWRpbyBJRiAxXzUgKi8KKwlbMHgwNTA1XSA9IDB4MDMwMCwgICAgIC8qIFIxMjg1ICAtIEF1ZGlvIElGIDFfNiAqLworCVsweDA1MDZdID0gMHgwMzAwLCAgICAgLyogUjEyODYgIC0gQXVkaW8gSUYgMV83ICovCisJWzB4MDUwN10gPSAweDE4MjAsICAgICAvKiBSMTI4NyAgLSBBdWRpbyBJRiAxXzggKi8KKwlbMHgwNTA4XSA9IDB4MTgyMCwgICAgIC8qIFIxMjg4ICAtIEF1ZGlvIElGIDFfOSAqLworCVsweDA1MDldID0gMHgwMDAwLCAgICAgLyogUjEyODkgIC0gQXVkaW8gSUYgMV8xMCAqLworCVsweDA1MEFdID0gMHgwMDAxLCAgICAgLyogUjEyOTAgIC0gQXVkaW8gSUYgMV8xMSAqLworCVsweDA1MEJdID0gMHgwMDAyLCAgICAgLyogUjEyOTEgIC0gQXVkaW8gSUYgMV8xMiAqLworCVsweDA1MENdID0gMHgwMDAzLCAgICAgLyogUjEyOTIgIC0gQXVkaW8gSUYgMV8xMyAqLworCVsweDA1MERdID0gMHgwMDA0LCAgICAgLyogUjEyOTMgIC0gQXVkaW8gSUYgMV8xNCAqLworCVsweDA1MEVdID0gMHgwMDA1LCAgICAgLyogUjEyOTQgIC0gQXVkaW8gSUYgMV8xNSAqLworCVsweDA1MEZdID0gMHgwMDA2LCAgICAgLyogUjEyOTUgIC0gQXVkaW8gSUYgMV8xNiAqLworCVsweDA1MTBdID0gMHgwMDA3LCAgICAgLyogUjEyOTYgIC0gQXVkaW8gSUYgMV8xNyAqLworCVsweDA1MTFdID0gMHgwMDAwLCAgICAgLyogUjEyOTcgIC0gQXVkaW8gSUYgMV8xOCAqLworCVsweDA1MTJdID0gMHgwMDAxLCAgICAgLyogUjEyOTggIC0gQXVkaW8gSUYgMV8xOSAqLworCVsweDA1MTNdID0gMHgwMDAyLCAgICAgLyogUjEyOTkgIC0gQXVkaW8gSUYgMV8yMCAqLworCVsweDA1MTRdID0gMHgwMDAzLCAgICAgLyogUjEzMDAgIC0gQXVkaW8gSUYgMV8yMSAqLworCVsweDA1MTVdID0gMHgwMDA0LCAgICAgLyogUjEzMDEgIC0gQXVkaW8gSUYgMV8yMiAqLworCVsweDA1MTZdID0gMHgwMDA1LCAgICAgLyogUjEzMDIgIC0gQXVkaW8gSUYgMV8yMyAqLworCVsweDA1MTddID0gMHgwMDA2LCAgICAgLyogUjEzMDMgIC0gQXVkaW8gSUYgMV8yNCAqLworCVsweDA1MThdID0gMHgwMDA3LCAgICAgLyogUjEzMDQgIC0gQXVkaW8gSUYgMV8yNSAqLworCVsweDA1MTldID0gMHgwMDAwLCAgICAgLyogUjEzMDUgIC0gQXVkaW8gSUYgMV8yNiAqLworCVsweDA1MUFdID0gMHgwMDAwLCAgICAgLyogUjEzMDYgIC0gQXVkaW8gSUYgMV8yNyAqLworCVsweDA1NDBdID0gMHgwMDBDLCAgICAgLyogUjEzNDQgIC0gQXVkaW8gSUYgMl8xICovCisJWzB4MDU0MV0gPSAweDAwMDgsICAgICAvKiBSMTM0NSAgLSBBdWRpbyBJRiAyXzIgKi8KKwlbMHgwNTQyXSA9IDB4MDAwMCwgICAgIC8qIFIxMzQ2ICAtIEF1ZGlvIElGIDJfMyAqLworCVsweDA1NDNdID0gMHgwMDAwLCAgICAgLyogUjEzNDcgIC0gQXVkaW8gSUYgMl80ICovCisJWzB4MDU0NF0gPSAweDAwMDAsICAgICAvKiBSMTM0OCAgLSBBdWRpbyBJRiAyXzUgKi8KKwlbMHgwNTQ1XSA9IDB4MDMwMCwgICAgIC8qIFIxMzQ5ICAtIEF1ZGlvIElGIDJfNiAqLworCVsweDA1NDZdID0gMHgwMzAwLCAgICAgLyogUjEzNTAgIC0gQXVkaW8gSUYgMl83ICovCisJWzB4MDU0N10gPSAweDE4MjAsICAgICAvKiBSMTM1MSAgLSBBdWRpbyBJRiAyXzggKi8KKwlbMHgwNTQ4XSA9IDB4MTgyMCwgICAgIC8qIFIxMzUyICAtIEF1ZGlvIElGIDJfOSAqLworCVsweDA1NDldID0gMHgwMDAwLCAgICAgLyogUjEzNTMgIC0gQXVkaW8gSUYgMl8xMCAqLworCVsweDA1NEFdID0gMHgwMDAxLCAgICAgLyogUjEzNTQgIC0gQXVkaW8gSUYgMl8xMSAqLworCVsweDA1NTFdID0gMHgwMDAwLCAgICAgLyogUjEzNjEgIC0gQXVkaW8gSUYgMl8xOCAqLworCVsweDA1NTJdID0gMHgwMDAxLCAgICAgLyogUjEzNjIgIC0gQXVkaW8gSUYgMl8xOSAqLworCVsweDA1NTldID0gMHgwMDAwLCAgICAgLyogUjEzNjkgIC0gQXVkaW8gSUYgMl8yNiAqLworCVsweDA1NUFdID0gMHgwMDAwLCAgICAgLyogUjEzNzAgIC0gQXVkaW8gSUYgMl8yNyAqLworCVsweDA1ODBdID0gMHgwMDBDLCAgICAgLyogUjE0MDggIC0gQXVkaW8gSUYgM18xICovCisJWzB4MDU4MV0gPSAweDAwMDgsICAgICAvKiBSMTQwOSAgLSBBdWRpbyBJRiAzXzIgKi8KKwlbMHgwNTgyXSA9IDB4MDAwMCwgICAgIC8qIFIxNDEwICAtIEF1ZGlvIElGIDNfMyAqLworCVsweDA1ODNdID0gMHgwMDAwLCAgICAgLyogUjE0MTEgIC0gQXVkaW8gSUYgM180ICovCisJWzB4MDU4NF0gPSAweDAwMDAsICAgICAvKiBSMTQxMiAgLSBBdWRpbyBJRiAzXzUgKi8KKwlbMHgwNTg1XSA9IDB4MDMwMCwgICAgIC8qIFIxNDEzICAtIEF1ZGlvIElGIDNfNiAqLworCVsweDA1ODZdID0gMHgwMzAwLCAgICAgLyogUjE0MTQgIC0gQXVkaW8gSUYgM183ICovCisJWzB4MDU4N10gPSAweDE4MjAsICAgICAvKiBSMTQxNSAgLSBBdWRpbyBJRiAzXzggKi8KKwlbMHgwNTg4XSA9IDB4MTgyMCwgICAgIC8qIFIxNDE2ICAtIEF1ZGlvIElGIDNfOSAqLworCVsweDA1ODldID0gMHgwMDAwLCAgICAgLyogUjE0MTcgIC0gQXVkaW8gSUYgM18xMCAqLworCVsweDA1OEFdID0gMHgwMDAxLCAgICAgLyogUjE0MTggIC0gQXVkaW8gSUYgM18xMSAqLworCVsweDA1OTFdID0gMHgwMDAwLCAgICAgLyogUjE0MjUgIC0gQXVkaW8gSUYgM18xOCAqLworCVsweDA1OTJdID0gMHgwMDAxLCAgICAgLyogUjE0MjYgIC0gQXVkaW8gSUYgM18xOSAqLworCVsweDA1OTldID0gMHgwMDAwLCAgICAgLyogUjE0MzMgIC0gQXVkaW8gSUYgM18yNiAqLworCVsweDA1OUFdID0gMHgwMDAwLCAgICAgLyogUjE0MzQgIC0gQXVkaW8gSUYgM18yNyAqLworCVsweDA2NDBdID0gMHgwMDAwLCAgICAgLyogUjE2MDAgIC0gUFdNMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2NDFdID0gMHgwMDgwLCAgICAgLyogUjE2MDEgIC0gUFdNMU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2NDJdID0gMHgwMDAwLCAgICAgLyogUjE2MDIgIC0gUFdNMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2NDNdID0gMHgwMDgwLCAgICAgLyogUjE2MDMgIC0gUFdNMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2NDRdID0gMHgwMDAwLCAgICAgLyogUjE2MDQgIC0gUFdNMU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2NDVdID0gMHgwMDgwLCAgICAgLyogUjE2MDUgIC0gUFdNMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2NDZdID0gMHgwMDAwLCAgICAgLyogUjE2MDYgIC0gUFdNMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2NDddID0gMHgwMDgwLCAgICAgLyogUjE2MDcgIC0gUFdNMU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2NDhdID0gMHgwMDAwLCAgICAgLyogUjE2MDggIC0gUFdNMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2NDldID0gMHgwMDgwLCAgICAgLyogUjE2MDkgIC0gUFdNMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2NEFdID0gMHgwMDAwLCAgICAgLyogUjE2MTAgIC0gUFdNMk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2NEJdID0gMHgwMDgwLCAgICAgLyogUjE2MTEgIC0gUFdNMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2NENdID0gMHgwMDAwLCAgICAgLyogUjE2MTIgIC0gUFdNMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2NERdID0gMHgwMDgwLCAgICAgLyogUjE2MTMgIC0gUFdNMk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2NEVdID0gMHgwMDAwLCAgICAgLyogUjE2MTQgIC0gUFdNMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2NEZdID0gMHgwMDgwLCAgICAgLyogUjE2MTUgIC0gUFdNMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2ODBdID0gMHgwMDAwLCAgICAgLyogUjE2NjQgIC0gT1VUMUxNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwNjgxXSA9IDB4MDA4MCwgICAgIC8qIFIxNjY1ICAtIE9VVDFMTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDY4Ml0gPSAweDAwMDAsICAgICAvKiBSMTY2NiAgLSBPVVQxTE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2ODNdID0gMHgwMDgwLCAgICAgLyogUjE2NjcgIC0gT1VUMUxNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwNjg0XSA9IDB4MDAwMCwgICAgIC8qIFIxNjY4ICAtIE9VVDFMTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDY4NV0gPSAweDAwODAsICAgICAvKiBSMTY2OSAgLSBPVVQxTE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2ODZdID0gMHgwMDAwLCAgICAgLyogUjE2NzAgIC0gT1VUMUxNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwNjg3XSA9IDB4MDA4MCwgICAgIC8qIFIxNjcxICAtIE9VVDFMTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDY4OF0gPSAweDAwMDAsICAgICAvKiBSMTY3MiAgLSBPVVQxUk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2ODldID0gMHgwMDgwLCAgICAgLyogUjE2NzMgIC0gT1VUMVJNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwNjhBXSA9IDB4MDAwMCwgICAgIC8qIFIxNjc0ICAtIE9VVDFSTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDY4Ql0gPSAweDAwODAsICAgICAvKiBSMTY3NSAgLSBPVVQxUk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2OENdID0gMHgwMDAwLCAgICAgLyogUjE2NzYgIC0gT1VUMVJNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwNjhEXSA9IDB4MDA4MCwgICAgIC8qIFIxNjc3ICAtIE9VVDFSTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDY4RV0gPSAweDAwMDAsICAgICAvKiBSMTY3OCAgLSBPVVQxUk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2OEZdID0gMHgwMDgwLCAgICAgLyogUjE2NzkgIC0gT1VUMVJNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwNjkwXSA9IDB4MDAwMCwgICAgIC8qIFIxNjgwICAtIE9VVDJMTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDY5MV0gPSAweDAwODAsICAgICAvKiBSMTY4MSAgLSBPVVQyTE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2OTJdID0gMHgwMDAwLCAgICAgLyogUjE2ODIgIC0gT1VUMkxNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwNjkzXSA9IDB4MDA4MCwgICAgIC8qIFIxNjgzICAtIE9VVDJMTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDY5NF0gPSAweDAwMDAsICAgICAvKiBSMTY4NCAgLSBPVVQyTE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2OTVdID0gMHgwMDgwLCAgICAgLyogUjE2ODUgIC0gT1VUMkxNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwNjk2XSA9IDB4MDAwMCwgICAgIC8qIFIxNjg2ICAtIE9VVDJMTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDY5N10gPSAweDAwODAsICAgICAvKiBSMTY4NyAgLSBPVVQyTE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2OThdID0gMHgwMDAwLCAgICAgLyogUjE2ODggIC0gT1VUMlJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwNjk5XSA9IDB4MDA4MCwgICAgIC8qIFIxNjg5ICAtIE9VVDJSTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDY5QV0gPSAweDAwMDAsICAgICAvKiBSMTY5MCAgLSBPVVQyUk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2OUJdID0gMHgwMDgwLCAgICAgLyogUjE2OTEgIC0gT1VUMlJNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwNjlDXSA9IDB4MDAwMCwgICAgIC8qIFIxNjkyICAtIE9VVDJSTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDY5RF0gPSAweDAwODAsICAgICAvKiBSMTY5MyAgLSBPVVQyUk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2OUVdID0gMHgwMDAwLCAgICAgLyogUjE2OTQgIC0gT1VUMlJNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwNjlGXSA9IDB4MDA4MCwgICAgIC8qIFIxNjk1ICAtIE9VVDJSTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDZBMF0gPSAweDAwMDAsICAgICAvKiBSMTY5NiAgLSBPVVQzTE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2QTFdID0gMHgwMDgwLCAgICAgLyogUjE2OTcgIC0gT1VUM0xNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwNkEyXSA9IDB4MDAwMCwgICAgIC8qIFIxNjk4ICAtIE9VVDNMTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDZBM10gPSAweDAwODAsICAgICAvKiBSMTY5OSAgLSBPVVQzTE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2QTRdID0gMHgwMDAwLCAgICAgLyogUjE3MDAgIC0gT1VUM0xNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwNkE1XSA9IDB4MDA4MCwgICAgIC8qIFIxNzAxICAtIE9VVDNMTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDZBNl0gPSAweDAwMDAsICAgICAvKiBSMTcwMiAgLSBPVVQzTE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2QTddID0gMHgwMDgwLCAgICAgLyogUjE3MDMgIC0gT1VUM0xNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwNkE4XSA9IDB4MDAwMCwgICAgIC8qIFIxNzA0ICAtIE9VVDNSTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDZBOV0gPSAweDAwODAsICAgICAvKiBSMTcwNSAgLSBPVVQzUk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2QUFdID0gMHgwMDAwLCAgICAgLyogUjE3MDYgIC0gT1VUM1JNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwNkFCXSA9IDB4MDA4MCwgICAgIC8qIFIxNzA3ICAtIE9VVDNSTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDZBQ10gPSAweDAwMDAsICAgICAvKiBSMTcwOCAgLSBPVVQzUk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2QURdID0gMHgwMDgwLCAgICAgLyogUjE3MDkgIC0gT1VUM1JNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwNkFFXSA9IDB4MDAwMCwgICAgIC8qIFIxNzEwICAtIE9VVDNSTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDZBRl0gPSAweDAwODAsICAgICAvKiBSMTcxMSAgLSBPVVQzUk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2QjBdID0gMHgwMDAwLCAgICAgLyogUjE3MTIgIC0gT1VUNExNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwNkIxXSA9IDB4MDA4MCwgICAgIC8qIFIxNzEzICAtIE9VVDRMTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDZCMl0gPSAweDAwMDAsICAgICAvKiBSMTcxNCAgLSBPVVQ0TE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2QjNdID0gMHgwMDgwLCAgICAgLyogUjE3MTUgIC0gT1VUNExNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwNkI0XSA9IDB4MDAwMCwgICAgIC8qIFIxNzE2ICAtIE9VVDRMTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDZCNV0gPSAweDAwODAsICAgICAvKiBSMTcxNyAgLSBPVVQ0TE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2QjZdID0gMHgwMDAwLCAgICAgLyogUjE3MTggIC0gT1VUNExNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwNkI3XSA9IDB4MDA4MCwgICAgIC8qIFIxNzE5ICAtIE9VVDRMTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDZCOF0gPSAweDAwMDAsICAgICAvKiBSMTcyMCAgLSBPVVQ0Uk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2QjldID0gMHgwMDgwLCAgICAgLyogUjE3MjEgIC0gT1VUNFJNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwNkJBXSA9IDB4MDAwMCwgICAgIC8qIFIxNzIyICAtIE9VVDRSTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDZCQl0gPSAweDAwODAsICAgICAvKiBSMTcyMyAgLSBPVVQ0Uk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2QkNdID0gMHgwMDAwLCAgICAgLyogUjE3MjQgIC0gT1VUNFJNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwNkJEXSA9IDB4MDA4MCwgICAgIC8qIFIxNzI1ICAtIE9VVDRSTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDZCRV0gPSAweDAwMDAsICAgICAvKiBSMTcyNiAgLSBPVVQ0Uk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2QkZdID0gMHgwMDgwLCAgICAgLyogUjE3MjcgIC0gT1VUNFJNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwNkMwXSA9IDB4MDAwMCwgICAgIC8qIFIxNzI4ICAtIE9VVDVMTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDZDMV0gPSAweDAwODAsICAgICAvKiBSMTcyOSAgLSBPVVQ1TE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2QzJdID0gMHgwMDAwLCAgICAgLyogUjE3MzAgIC0gT1VUNUxNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwNkMzXSA9IDB4MDA4MCwgICAgIC8qIFIxNzMxICAtIE9VVDVMTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDZDNF0gPSAweDAwMDAsICAgICAvKiBSMTczMiAgLSBPVVQ1TE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2QzVdID0gMHgwMDgwLCAgICAgLyogUjE3MzMgIC0gT1VUNUxNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwNkM2XSA9IDB4MDAwMCwgICAgIC8qIFIxNzM0ICAtIE9VVDVMTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDZDN10gPSAweDAwODAsICAgICAvKiBSMTczNSAgLSBPVVQ1TE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2QzhdID0gMHgwMDAwLCAgICAgLyogUjE3MzYgIC0gT1VUNVJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwNkM5XSA9IDB4MDA4MCwgICAgIC8qIFIxNzM3ICAtIE9VVDVSTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDZDQV0gPSAweDAwMDAsICAgICAvKiBSMTczOCAgLSBPVVQ1Uk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2Q0JdID0gMHgwMDgwLCAgICAgLyogUjE3MzkgIC0gT1VUNVJNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwNkNDXSA9IDB4MDAwMCwgICAgIC8qIFIxNzQwICAtIE9VVDVSTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDZDRF0gPSAweDAwODAsICAgICAvKiBSMTc0MSAgLSBPVVQ1Uk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2Q0VdID0gMHgwMDAwLCAgICAgLyogUjE3NDIgIC0gT1VUNVJNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwNkNGXSA9IDB4MDA4MCwgICAgIC8qIFIxNzQzICAtIE9VVDVSTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDZEMF0gPSAweDAwMDAsICAgICAvKiBSMTc0NCAgLSBPVVQ2TE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2RDFdID0gMHgwMDgwLCAgICAgLyogUjE3NDUgIC0gT1VUNkxNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwNkQyXSA9IDB4MDAwMCwgICAgIC8qIFIxNzQ2ICAtIE9VVDZMTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDZEM10gPSAweDAwODAsICAgICAvKiBSMTc0NyAgLSBPVVQ2TE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2RDRdID0gMHgwMDAwLCAgICAgLyogUjE3NDggIC0gT1VUNkxNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwNkQ1XSA9IDB4MDA4MCwgICAgIC8qIFIxNzQ5ICAtIE9VVDZMTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDZENl0gPSAweDAwMDAsICAgICAvKiBSMTc1MCAgLSBPVVQ2TE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2RDddID0gMHgwMDgwLCAgICAgLyogUjE3NTEgIC0gT1VUNkxNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwNkQ4XSA9IDB4MDAwMCwgICAgIC8qIFIxNzUyICAtIE9VVDZSTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDZEOV0gPSAweDAwODAsICAgICAvKiBSMTc1MyAgLSBPVVQ2Uk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2REFdID0gMHgwMDAwLCAgICAgLyogUjE3NTQgIC0gT1VUNlJNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwNkRCXSA9IDB4MDA4MCwgICAgIC8qIFIxNzU1ICAtIE9VVDZSTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDZEQ10gPSAweDAwMDAsICAgICAvKiBSMTc1NiAgLSBPVVQ2Uk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2RERdID0gMHgwMDgwLCAgICAgLyogUjE3NTcgIC0gT1VUNlJNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwNkRFXSA9IDB4MDAwMCwgICAgIC8qIFIxNzU4ICAtIE9VVDZSTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDZERl0gPSAweDAwODAsICAgICAvKiBSMTc1OSAgLSBPVVQ2Uk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MDBdID0gMHgwMDAwLCAgICAgLyogUjE3OTIgIC0gQUlGMVRYMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MDFdID0gMHgwMDgwLCAgICAgLyogUjE3OTMgIC0gQUlGMVRYMU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MDJdID0gMHgwMDAwLCAgICAgLyogUjE3OTQgIC0gQUlGMVRYMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MDNdID0gMHgwMDgwLCAgICAgLyogUjE3OTUgIC0gQUlGMVRYMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MDRdID0gMHgwMDAwLCAgICAgLyogUjE3OTYgIC0gQUlGMVRYMU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MDVdID0gMHgwMDgwLCAgICAgLyogUjE3OTcgIC0gQUlGMVRYMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MDZdID0gMHgwMDAwLCAgICAgLyogUjE3OTggIC0gQUlGMVRYMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MDddID0gMHgwMDgwLCAgICAgLyogUjE3OTkgIC0gQUlGMVRYMU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MDhdID0gMHgwMDAwLCAgICAgLyogUjE4MDAgIC0gQUlGMVRYMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MDldID0gMHgwMDgwLCAgICAgLyogUjE4MDEgIC0gQUlGMVRYMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MEFdID0gMHgwMDAwLCAgICAgLyogUjE4MDIgIC0gQUlGMVRYMk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MEJdID0gMHgwMDgwLCAgICAgLyogUjE4MDMgIC0gQUlGMVRYMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MENdID0gMHgwMDAwLCAgICAgLyogUjE4MDQgIC0gQUlGMVRYMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MERdID0gMHgwMDgwLCAgICAgLyogUjE4MDUgIC0gQUlGMVRYMk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MEVdID0gMHgwMDAwLCAgICAgLyogUjE4MDYgIC0gQUlGMVRYMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MEZdID0gMHgwMDgwLCAgICAgLyogUjE4MDcgIC0gQUlGMVRYMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MTBdID0gMHgwMDAwLCAgICAgLyogUjE4MDggIC0gQUlGMVRYM01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MTFdID0gMHgwMDgwLCAgICAgLyogUjE4MDkgIC0gQUlGMVRYM01JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MTJdID0gMHgwMDAwLCAgICAgLyogUjE4MTAgIC0gQUlGMVRYM01JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MTNdID0gMHgwMDgwLCAgICAgLyogUjE4MTEgIC0gQUlGMVRYM01JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MTRdID0gMHgwMDAwLCAgICAgLyogUjE4MTIgIC0gQUlGMVRYM01JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MTVdID0gMHgwMDgwLCAgICAgLyogUjE4MTMgIC0gQUlGMVRYM01JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MTZdID0gMHgwMDAwLCAgICAgLyogUjE4MTQgIC0gQUlGMVRYM01JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MTddID0gMHgwMDgwLCAgICAgLyogUjE4MTUgIC0gQUlGMVRYM01JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MThdID0gMHgwMDAwLCAgICAgLyogUjE4MTYgIC0gQUlGMVRYNE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MTldID0gMHgwMDgwLCAgICAgLyogUjE4MTcgIC0gQUlGMVRYNE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MUFdID0gMHgwMDAwLCAgICAgLyogUjE4MTggIC0gQUlGMVRYNE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MUJdID0gMHgwMDgwLCAgICAgLyogUjE4MTkgIC0gQUlGMVRYNE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MUNdID0gMHgwMDAwLCAgICAgLyogUjE4MjAgIC0gQUlGMVRYNE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MURdID0gMHgwMDgwLCAgICAgLyogUjE4MjEgIC0gQUlGMVRYNE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MUVdID0gMHgwMDAwLCAgICAgLyogUjE4MjIgIC0gQUlGMVRYNE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MUZdID0gMHgwMDgwLCAgICAgLyogUjE4MjMgIC0gQUlGMVRYNE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MjBdID0gMHgwMDAwLCAgICAgLyogUjE4MjQgIC0gQUlGMVRYNU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MjFdID0gMHgwMDgwLCAgICAgLyogUjE4MjUgIC0gQUlGMVRYNU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MjJdID0gMHgwMDAwLCAgICAgLyogUjE4MjYgIC0gQUlGMVRYNU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MjNdID0gMHgwMDgwLCAgICAgLyogUjE4MjcgIC0gQUlGMVRYNU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MjRdID0gMHgwMDAwLCAgICAgLyogUjE4MjggIC0gQUlGMVRYNU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MjVdID0gMHgwMDgwLCAgICAgLyogUjE4MjkgIC0gQUlGMVRYNU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MjZdID0gMHgwMDAwLCAgICAgLyogUjE4MzAgIC0gQUlGMVRYNU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MjddID0gMHgwMDgwLCAgICAgLyogUjE4MzEgIC0gQUlGMVRYNU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MjhdID0gMHgwMDAwLCAgICAgLyogUjE4MzIgIC0gQUlGMVRYNk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MjldID0gMHgwMDgwLCAgICAgLyogUjE4MzMgIC0gQUlGMVRYNk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MkFdID0gMHgwMDAwLCAgICAgLyogUjE4MzQgIC0gQUlGMVRYNk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MkJdID0gMHgwMDgwLCAgICAgLyogUjE4MzUgIC0gQUlGMVRYNk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MkNdID0gMHgwMDAwLCAgICAgLyogUjE4MzYgIC0gQUlGMVRYNk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MkRdID0gMHgwMDgwLCAgICAgLyogUjE4MzcgIC0gQUlGMVRYNk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MkVdID0gMHgwMDAwLCAgICAgLyogUjE4MzggIC0gQUlGMVRYNk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MkZdID0gMHgwMDgwLCAgICAgLyogUjE4MzkgIC0gQUlGMVRYNk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MzBdID0gMHgwMDAwLCAgICAgLyogUjE4NDAgIC0gQUlGMVRYN01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MzFdID0gMHgwMDgwLCAgICAgLyogUjE4NDEgIC0gQUlGMVRYN01JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MzJdID0gMHgwMDAwLCAgICAgLyogUjE4NDIgIC0gQUlGMVRYN01JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MzNdID0gMHgwMDgwLCAgICAgLyogUjE4NDMgIC0gQUlGMVRYN01JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MzRdID0gMHgwMDAwLCAgICAgLyogUjE4NDQgIC0gQUlGMVRYN01JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MzVdID0gMHgwMDgwLCAgICAgLyogUjE4NDUgIC0gQUlGMVRYN01JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MzZdID0gMHgwMDAwLCAgICAgLyogUjE4NDYgIC0gQUlGMVRYN01JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MzddID0gMHgwMDgwLCAgICAgLyogUjE4NDcgIC0gQUlGMVRYN01JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MzhdID0gMHgwMDAwLCAgICAgLyogUjE4NDggIC0gQUlGMVRYOE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MzldID0gMHgwMDgwLCAgICAgLyogUjE4NDkgIC0gQUlGMVRYOE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3M0FdID0gMHgwMDAwLCAgICAgLyogUjE4NTAgIC0gQUlGMVRYOE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3M0JdID0gMHgwMDgwLCAgICAgLyogUjE4NTEgIC0gQUlGMVRYOE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3M0NdID0gMHgwMDAwLCAgICAgLyogUjE4NTIgIC0gQUlGMVRYOE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3M0RdID0gMHgwMDgwLCAgICAgLyogUjE4NTMgIC0gQUlGMVRYOE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3M0VdID0gMHgwMDAwLCAgICAgLyogUjE4NTQgIC0gQUlGMVRYOE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3M0ZdID0gMHgwMDgwLCAgICAgLyogUjE4NTUgIC0gQUlGMVRYOE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3NDBdID0gMHgwMDAwLCAgICAgLyogUjE4NTYgIC0gQUlGMlRYMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3NDFdID0gMHgwMDgwLCAgICAgLyogUjE4NTcgIC0gQUlGMlRYMU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3NDJdID0gMHgwMDAwLCAgICAgLyogUjE4NTggIC0gQUlGMlRYMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3NDNdID0gMHgwMDgwLCAgICAgLyogUjE4NTkgIC0gQUlGMlRYMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3NDRdID0gMHgwMDAwLCAgICAgLyogUjE4NjAgIC0gQUlGMlRYMU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3NDVdID0gMHgwMDgwLCAgICAgLyogUjE4NjEgIC0gQUlGMlRYMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3NDZdID0gMHgwMDAwLCAgICAgLyogUjE4NjIgIC0gQUlGMlRYMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3NDddID0gMHgwMDgwLCAgICAgLyogUjE4NjMgIC0gQUlGMlRYMU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3NDhdID0gMHgwMDAwLCAgICAgLyogUjE4NjQgIC0gQUlGMlRYMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3NDldID0gMHgwMDgwLCAgICAgLyogUjE4NjUgIC0gQUlGMlRYMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3NEFdID0gMHgwMDAwLCAgICAgLyogUjE4NjYgIC0gQUlGMlRYMk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3NEJdID0gMHgwMDgwLCAgICAgLyogUjE4NjcgIC0gQUlGMlRYMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3NENdID0gMHgwMDAwLCAgICAgLyogUjE4NjggIC0gQUlGMlRYMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3NERdID0gMHgwMDgwLCAgICAgLyogUjE4NjkgIC0gQUlGMlRYMk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3NEVdID0gMHgwMDAwLCAgICAgLyogUjE4NzAgIC0gQUlGMlRYMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3NEZdID0gMHgwMDgwLCAgICAgLyogUjE4NzEgIC0gQUlGMlRYMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3ODBdID0gMHgwMDAwLCAgICAgLyogUjE5MjAgIC0gQUlGM1RYMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3ODFdID0gMHgwMDgwLCAgICAgLyogUjE5MjEgIC0gQUlGM1RYMU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3ODJdID0gMHgwMDAwLCAgICAgLyogUjE5MjIgIC0gQUlGM1RYMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3ODNdID0gMHgwMDgwLCAgICAgLyogUjE5MjMgIC0gQUlGM1RYMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3ODRdID0gMHgwMDAwLCAgICAgLyogUjE5MjQgIC0gQUlGM1RYMU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3ODVdID0gMHgwMDgwLCAgICAgLyogUjE5MjUgIC0gQUlGM1RYMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3ODZdID0gMHgwMDAwLCAgICAgLyogUjE5MjYgIC0gQUlGM1RYMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3ODddID0gMHgwMDgwLCAgICAgLyogUjE5MjcgIC0gQUlGM1RYMU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3ODhdID0gMHgwMDAwLCAgICAgLyogUjE5MjggIC0gQUlGM1RYMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3ODldID0gMHgwMDgwLCAgICAgLyogUjE5MjkgIC0gQUlGM1RYMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3OEFdID0gMHgwMDAwLCAgICAgLyogUjE5MzAgIC0gQUlGM1RYMk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3OEJdID0gMHgwMDgwLCAgICAgLyogUjE5MzEgIC0gQUlGM1RYMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3OENdID0gMHgwMDAwLCAgICAgLyogUjE5MzIgIC0gQUlGM1RYMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3OERdID0gMHgwMDgwLCAgICAgLyogUjE5MzMgIC0gQUlGM1RYMk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3OEVdID0gMHgwMDAwLCAgICAgLyogUjE5MzQgIC0gQUlGM1RYMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3OEZdID0gMHgwMDgwLCAgICAgLyogUjE5MzUgIC0gQUlGM1RYMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA4ODBdID0gMHgwMDAwLCAgICAgLyogUjIxNzYgIC0gRVExTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDg4MV0gPSAweDAwODAsICAgICAvKiBSMjE3NyAgLSBFUTFNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwODgyXSA9IDB4MDAwMCwgICAgIC8qIFIyMTc4ICAtIEVRMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA4ODNdID0gMHgwMDgwLCAgICAgLyogUjIxNzkgIC0gRVExTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDg4NF0gPSAweDAwMDAsICAgICAvKiBSMjE4MCAgLSBFUTFNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwODg1XSA9IDB4MDA4MCwgICAgIC8qIFIyMTgxICAtIEVRMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA4ODZdID0gMHgwMDAwLCAgICAgLyogUjIxODIgIC0gRVExTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDg4N10gPSAweDAwODAsICAgICAvKiBSMjE4MyAgLSBFUTFNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwODg4XSA9IDB4MDAwMCwgICAgIC8qIFIyMTg0ICAtIEVRMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA4ODldID0gMHgwMDgwLCAgICAgLyogUjIxODUgIC0gRVEyTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDg4QV0gPSAweDAwMDAsICAgICAvKiBSMjE4NiAgLSBFUTJNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwODhCXSA9IDB4MDA4MCwgICAgIC8qIFIyMTg3ICAtIEVRMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA4OENdID0gMHgwMDAwLCAgICAgLyogUjIxODggIC0gRVEyTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDg4RF0gPSAweDAwODAsICAgICAvKiBSMjE4OSAgLSBFUTJNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwODhFXSA9IDB4MDAwMCwgICAgIC8qIFIyMTkwICAtIEVRMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA4OEZdID0gMHgwMDgwLCAgICAgLyogUjIxOTEgIC0gRVEyTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDg5MF0gPSAweDAwMDAsICAgICAvKiBSMjE5MiAgLSBFUTNNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwODkxXSA9IDB4MDA4MCwgICAgIC8qIFIyMTkzICAtIEVRM01JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA4OTJdID0gMHgwMDAwLCAgICAgLyogUjIxOTQgIC0gRVEzTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDg5M10gPSAweDAwODAsICAgICAvKiBSMjE5NSAgLSBFUTNNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwODk0XSA9IDB4MDAwMCwgICAgIC8qIFIyMTk2ICAtIEVRM01JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA4OTVdID0gMHgwMDgwLCAgICAgLyogUjIxOTcgIC0gRVEzTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDg5Nl0gPSAweDAwMDAsICAgICAvKiBSMjE5OCAgLSBFUTNNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwODk3XSA9IDB4MDA4MCwgICAgIC8qIFIyMTk5ICAtIEVRM01JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA4OThdID0gMHgwMDAwLCAgICAgLyogUjIyMDAgIC0gRVE0TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDg5OV0gPSAweDAwODAsICAgICAvKiBSMjIwMSAgLSBFUTRNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwODlBXSA9IDB4MDAwMCwgICAgIC8qIFIyMjAyICAtIEVRNE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA4OUJdID0gMHgwMDgwLCAgICAgLyogUjIyMDMgIC0gRVE0TUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDg5Q10gPSAweDAwMDAsICAgICAvKiBSMjIwNCAgLSBFUTRNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwODlEXSA9IDB4MDA4MCwgICAgIC8qIFIyMjA1ICAtIEVRNE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA4OUVdID0gMHgwMDAwLCAgICAgLyogUjIyMDYgIC0gRVE0TUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDg5Rl0gPSAweDAwODAsICAgICAvKiBSMjIwNyAgLSBFUTRNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOEMwXSA9IDB4MDAwMCwgICAgIC8qIFIyMjQwICAtIERSQzFMTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDhDMV0gPSAweDAwODAsICAgICAvKiBSMjI0MSAgLSBEUkMxTE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA4QzJdID0gMHgwMDAwLCAgICAgLyogUjIyNDIgIC0gRFJDMUxNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwOEMzXSA9IDB4MDA4MCwgICAgIC8qIFIyMjQzICAtIERSQzFMTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDhDNF0gPSAweDAwMDAsICAgICAvKiBSMjI0NCAgLSBEUkMxTE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA4QzVdID0gMHgwMDgwLCAgICAgLyogUjIyNDUgIC0gRFJDMUxNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwOEM2XSA9IDB4MDAwMCwgICAgIC8qIFIyMjQ2ICAtIERSQzFMTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDhDN10gPSAweDAwODAsICAgICAvKiBSMjI0NyAgLSBEUkMxTE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA4QzhdID0gMHgwMDAwLCAgICAgLyogUjIyNDggIC0gRFJDMVJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOEM5XSA9IDB4MDA4MCwgICAgIC8qIFIyMjQ5ICAtIERSQzFSTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDhDQV0gPSAweDAwMDAsICAgICAvKiBSMjI1MCAgLSBEUkMxUk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA4Q0JdID0gMHgwMDgwLCAgICAgLyogUjIyNTEgIC0gRFJDMVJNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwOENDXSA9IDB4MDAwMCwgICAgIC8qIFIyMjUyICAtIERSQzFSTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDhDRF0gPSAweDAwODAsICAgICAvKiBSMjI1MyAgLSBEUkMxUk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA4Q0VdID0gMHgwMDAwLCAgICAgLyogUjIyNTQgIC0gRFJDMVJNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwOENGXSA9IDB4MDA4MCwgICAgIC8qIFIyMjU1ICAtIERSQzFSTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDkwMF0gPSAweDAwMDAsICAgICAvKiBSMjMwNCAgLSBIUExQMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5MDFdID0gMHgwMDgwLCAgICAgLyogUjIzMDUgIC0gSFBMUDFNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwOTAyXSA9IDB4MDAwMCwgICAgIC8qIFIyMzA2ICAtIEhQTFAxTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDkwM10gPSAweDAwODAsICAgICAvKiBSMjMwNyAgLSBIUExQMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA5MDRdID0gMHgwMDAwLCAgICAgLyogUjIzMDggIC0gSFBMUDFNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwOTA1XSA9IDB4MDA4MCwgICAgIC8qIFIyMzA5ICAtIEhQTFAxTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDkwNl0gPSAweDAwMDAsICAgICAvKiBSMjMxMCAgLSBIUExQMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA5MDddID0gMHgwMDgwLCAgICAgLyogUjIzMTEgIC0gSFBMUDFNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOTA4XSA9IDB4MDAwMCwgICAgIC8qIFIyMzEyICAtIEhQTFAyTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDkwOV0gPSAweDAwODAsICAgICAvKiBSMjMxMyAgLSBIUExQMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA5MEFdID0gMHgwMDAwLCAgICAgLyogUjIzMTQgIC0gSFBMUDJNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwOTBCXSA9IDB4MDA4MCwgICAgIC8qIFIyMzE1ICAtIEhQTFAyTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDkwQ10gPSAweDAwMDAsICAgICAvKiBSMjMxNiAgLSBIUExQMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA5MERdID0gMHgwMDgwLCAgICAgLyogUjIzMTcgIC0gSFBMUDJNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwOTBFXSA9IDB4MDAwMCwgICAgIC8qIFIyMzE4ICAtIEhQTFAyTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDkwRl0gPSAweDAwODAsICAgICAvKiBSMjMxOSAgLSBIUExQMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA5MTBdID0gMHgwMDAwLCAgICAgLyogUjIzMjAgIC0gSFBMUDNNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTExXSA9IDB4MDA4MCwgICAgIC8qIFIyMzIxICAtIEhQTFAzTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDkxMl0gPSAweDAwMDAsICAgICAvKiBSMjMyMiAgLSBIUExQM01JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA5MTNdID0gMHgwMDgwLCAgICAgLyogUjIzMjMgIC0gSFBMUDNNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwOTE0XSA9IDB4MDAwMCwgICAgIC8qIFIyMzI0ICAtIEhQTFAzTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDkxNV0gPSAweDAwODAsICAgICAvKiBSMjMyNSAgLSBIUExQM01JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA5MTZdID0gMHgwMDAwLCAgICAgLyogUjIzMjYgIC0gSFBMUDNNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwOTE3XSA9IDB4MDA4MCwgICAgIC8qIFIyMzI3ICAtIEhQTFAzTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDkxOF0gPSAweDAwMDAsICAgICAvKiBSMjMyOCAgLSBIUExQNE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5MTldID0gMHgwMDgwLCAgICAgLyogUjIzMjkgIC0gSFBMUDRNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwOTFBXSA9IDB4MDAwMCwgICAgIC8qIFIyMzMwICAtIEhQTFA0TUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDkxQl0gPSAweDAwODAsICAgICAvKiBSMjMzMSAgLSBIUExQNE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA5MUNdID0gMHgwMDAwLCAgICAgLyogUjIzMzIgIC0gSFBMUDRNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwOTFEXSA9IDB4MDA4MCwgICAgIC8qIFIyMzMzICAtIEhQTFA0TUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDkxRV0gPSAweDAwMDAsICAgICAvKiBSMjMzNCAgLSBIUExQNE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA5MUZdID0gMHgwMDgwLCAgICAgLyogUjIzMzUgIC0gSFBMUDRNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOTQwXSA9IDB4MDAwMCwgICAgIC8qIFIyMzY4ICAtIERTUDFMTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDk0MV0gPSAweDAwODAsICAgICAvKiBSMjM2OSAgLSBEU1AxTE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA5NDJdID0gMHgwMDAwLCAgICAgLyogUjIzNzAgIC0gRFNQMUxNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwOTQzXSA9IDB4MDA4MCwgICAgIC8qIFIyMzcxICAtIERTUDFMTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDk0NF0gPSAweDAwMDAsICAgICAvKiBSMjM3MiAgLSBEU1AxTE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA5NDVdID0gMHgwMDgwLCAgICAgLyogUjIzNzMgIC0gRFNQMUxNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwOTQ2XSA9IDB4MDAwMCwgICAgIC8qIFIyMzc0ICAtIERTUDFMTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDk0N10gPSAweDAwODAsICAgICAvKiBSMjM3NSAgLSBEU1AxTE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA5NDhdID0gMHgwMDAwLCAgICAgLyogUjIzNzYgIC0gRFNQMVJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTQ5XSA9IDB4MDA4MCwgICAgIC8qIFIyMzc3ICAtIERTUDFSTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDk0QV0gPSAweDAwMDAsICAgICAvKiBSMjM3OCAgLSBEU1AxUk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA5NEJdID0gMHgwMDgwLCAgICAgLyogUjIzNzkgIC0gRFNQMVJNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwOTRDXSA9IDB4MDAwMCwgICAgIC8qIFIyMzgwICAtIERTUDFSTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDk0RF0gPSAweDAwODAsICAgICAvKiBSMjM4MSAgLSBEU1AxUk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA5NEVdID0gMHgwMDAwLCAgICAgLyogUjIzODIgIC0gRFNQMVJNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwOTRGXSA9IDB4MDA4MCwgICAgIC8qIFIyMzgzICAtIERTUDFSTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDk1MF0gPSAweDAwMDAsICAgICAvKiBSMjM4NCAgLSBEU1AxQVVYMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5NThdID0gMHgwMDAwLCAgICAgLyogUjIzOTIgIC0gRFNQMUFVWDJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTYwXSA9IDB4MDAwMCwgICAgIC8qIFIyNDAwICAtIERTUDFBVVgzTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDk2OF0gPSAweDAwMDAsICAgICAvKiBSMjQwOCAgLSBEU1AxQVVYNE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5NzBdID0gMHgwMDAwLCAgICAgLyogUjI0MTYgIC0gRFNQMUFVWDVNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTc4XSA9IDB4MDAwMCwgICAgIC8qIFIyNDI0ICAtIERTUDFBVVg2TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDk4MF0gPSAweDAwMDAsICAgICAvKiBSMjQzMiAgLSBEU1AyTE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5ODFdID0gMHgwMDgwLCAgICAgLyogUjI0MzMgIC0gRFNQMkxNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwOTgyXSA9IDB4MDAwMCwgICAgIC8qIFIyNDM0ICAtIERTUDJMTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDk4M10gPSAweDAwODAsICAgICAvKiBSMjQzNSAgLSBEU1AyTE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA5ODRdID0gMHgwMDAwLCAgICAgLyogUjI0MzYgIC0gRFNQMkxNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwOTg1XSA9IDB4MDA4MCwgICAgIC8qIFIyNDM3ICAtIERTUDJMTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDk4Nl0gPSAweDAwMDAsICAgICAvKiBSMjQzOCAgLSBEU1AyTE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA5ODddID0gMHgwMDgwLCAgICAgLyogUjI0MzkgIC0gRFNQMkxNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOTg4XSA9IDB4MDAwMCwgICAgIC8qIFIyNDQwICAtIERTUDJSTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDk4OV0gPSAweDAwODAsICAgICAvKiBSMjQ0MSAgLSBEU1AyUk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA5OEFdID0gMHgwMDAwLCAgICAgLyogUjI0NDIgIC0gRFNQMlJNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwOThCXSA9IDB4MDA4MCwgICAgIC8qIFIyNDQzICAtIERTUDJSTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDk4Q10gPSAweDAwMDAsICAgICAvKiBSMjQ0NCAgLSBEU1AyUk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA5OERdID0gMHgwMDgwLCAgICAgLyogUjI0NDUgIC0gRFNQMlJNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwOThFXSA9IDB4MDAwMCwgICAgIC8qIFIyNDQ2ICAtIERTUDJSTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDk4Rl0gPSAweDAwODAsICAgICAvKiBSMjQ0NyAgLSBEU1AyUk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA5OTBdID0gMHgwMDAwLCAgICAgLyogUjI0NDggIC0gRFNQMkFVWDFNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTk4XSA9IDB4MDAwMCwgICAgIC8qIFIyNDU2ICAtIERTUDJBVVgyTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDlBMF0gPSAweDAwMDAsICAgICAvKiBSMjQ2NCAgLSBEU1AyQVVYM01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5QThdID0gMHgwMDAwLCAgICAgLyogUjI0NzIgIC0gRFNQMkFVWDRNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOUIwXSA9IDB4MDAwMCwgICAgIC8qIFIyNDgwICAtIERTUDJBVVg1TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDlCOF0gPSAweDAwMDAsICAgICAvKiBSMjQ4OCAgLSBEU1AyQVVYNk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5QzBdID0gMHgwMDAwLCAgICAgLyogUjI0OTYgIC0gRFNQM0xNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOUMxXSA9IDB4MDA4MCwgICAgIC8qIFIyNDk3ICAtIERTUDNMTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDlDMl0gPSAweDAwMDAsICAgICAvKiBSMjQ5OCAgLSBEU1AzTE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA5QzNdID0gMHgwMDgwLCAgICAgLyogUjI0OTkgIC0gRFNQM0xNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwOUM0XSA9IDB4MDAwMCwgICAgIC8qIFIyNTAwICAtIERTUDNMTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDlDNV0gPSAweDAwODAsICAgICAvKiBSMjUwMSAgLSBEU1AzTE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA5QzZdID0gMHgwMDAwLCAgICAgLyogUjI1MDIgIC0gRFNQM0xNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwOUM3XSA9IDB4MDA4MCwgICAgIC8qIFIyNTAzICAtIERTUDNMTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDlDOF0gPSAweDAwMDAsICAgICAvKiBSMjUwNCAgLSBEU1AzUk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5QzldID0gMHgwMDgwLCAgICAgLyogUjI1MDUgIC0gRFNQM1JNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwOUNBXSA9IDB4MDAwMCwgICAgIC8qIFIyNTA2ICAtIERTUDNSTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDlDQl0gPSAweDAwODAsICAgICAvKiBSMjUwNyAgLSBEU1AzUk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA5Q0NdID0gMHgwMDAwLCAgICAgLyogUjI1MDggIC0gRFNQM1JNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwOUNEXSA9IDB4MDA4MCwgICAgIC8qIFIyNTA5ICAtIERTUDNSTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDlDRV0gPSAweDAwMDAsICAgICAvKiBSMjUxMCAgLSBEU1AzUk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA5Q0ZdID0gMHgwMDgwLCAgICAgLyogUjI1MTEgIC0gRFNQM1JNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOUQwXSA9IDB4MDAwMCwgICAgIC8qIFIyNTEyICAtIERTUDNBVVgxTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDlEOF0gPSAweDAwMDAsICAgICAvKiBSMjUyMCAgLSBEU1AzQVVYMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5RTBdID0gMHgwMDAwLCAgICAgLyogUjI1MjggIC0gRFNQM0FVWDNNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOUU4XSA9IDB4MDAwMCwgICAgIC8qIFIyNTM2ICAtIERTUDNBVVg0TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDlGMF0gPSAweDAwMDAsICAgICAvKiBSMjU0NCAgLSBEU1AzQVVYNU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5RjhdID0gMHgwMDAwLCAgICAgLyogUjI1NTIgIC0gRFNQM0FVWDZNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQTgwXSA9IDB4MDAwMCwgICAgIC8qIFIyNjg4ICAtIEFTUkMxTE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBBODhdID0gMHgwMDAwLCAgICAgLyogUjI2OTYgIC0gQVNSQzFSTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEE5MF0gPSAweDAwMDAsICAgICAvKiBSMjcwNCAgLSBBU1JDMkxNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQTk4XSA9IDB4MDAwMCwgICAgIC8qIFIyNzEyICAtIEFTUkMyUk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCMDBdID0gMHgwMDAwLCAgICAgLyogUjI4MTYgIC0gSVNSQzFERUMxTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEIwOF0gPSAweDAwMDAsICAgICAvKiBSMjgyNCAgLSBJU1JDMURFQzJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjEwXSA9IDB4MDAwMCwgICAgIC8qIFIyODMyICAtIElTUkMxREVDM01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCMThdID0gMHgwMDAwLCAgICAgLyogUjI4NDAgIC0gSVNSQzFERUM0TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEIyMF0gPSAweDAwMDAsICAgICAvKiBSMjg0OCAgLSBJU1JDMUlOVDFNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjI4XSA9IDB4MDAwMCwgICAgIC8qIFIyODU2ICAtIElTUkMxSU5UMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCMzBdID0gMHgwMDAwLCAgICAgLyogUjI4NjQgIC0gSVNSQzFJTlQzTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEIzOF0gPSAweDAwMDAsICAgICAvKiBSMjg3MiAgLSBJU1JDMUlOVDRNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjQwXSA9IDB4MDAwMCwgICAgIC8qIFIyODgwICAtIElTUkMyREVDMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCNDhdID0gMHgwMDAwLCAgICAgLyogUjI4ODggIC0gSVNSQzJERUMyTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEI1MF0gPSAweDAwMDAsICAgICAvKiBSMjg5NiAgLSBJU1JDMkRFQzNNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjU4XSA9IDB4MDAwMCwgICAgIC8qIFIyOTA0ICAtIElTUkMyREVDNE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCNjBdID0gMHgwMDAwLCAgICAgLyogUjI5MTIgIC0gSVNSQzJJTlQxTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEI2OF0gPSAweDAwMDAsICAgICAvKiBSMjkyMCAgLSBJU1JDMklOVDJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjcwXSA9IDB4MDAwMCwgICAgIC8qIFIyOTI4ICAtIElTUkMySU5UM01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCNzhdID0gMHgwMDAwLCAgICAgLyogUjI5MzYgIC0gSVNSQzJJTlQ0TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEMwMF0gPSAweEEwMDEsICAgICAvKiBSMzA3MiAgLSBHUElPIENUUkwgMSAqLworCVsweDBDMDFdID0gMHhBMDAxLCAgICAgLyogUjMwNzMgIC0gR1BJTyBDVFJMIDIgKi8KKwlbMHgwQzAyXSA9IDB4QTAwMSwgICAgIC8qIFIzMDc0ICAtIEdQSU8gQ1RSTCAzICovCisJWzB4MEMwM10gPSAweEEwMDEsICAgICAvKiBSMzA3NSAgLSBHUElPIENUUkwgNCAqLworCVsweDBDMDRdID0gMHhBMDAxLCAgICAgLyogUjMwNzYgIC0gR1BJTyBDVFJMIDUgKi8KKwlbMHgwQzA1XSA9IDB4QTAwMSwgICAgIC8qIFIzMDc3ICAtIEdQSU8gQ1RSTCA2ICovCisJWzB4MEMyM10gPSAweDQwMDMsICAgICAvKiBSMzEwNyAgLSBNaXNjIFBhZCBDdHJsIDEgKi8KKwlbMHgwQzI0XSA9IDB4MDAwMCwgICAgIC8qIFIzMTA4ICAtIE1pc2MgUGFkIEN0cmwgMiAqLworCVsweDBDMjVdID0gMHgwMDAwLCAgICAgLyogUjMxMDkgIC0gTWlzYyBQYWQgQ3RybCAzICovCisJWzB4MEMyNl0gPSAweDAwMDAsICAgICAvKiBSMzExMCAgLSBNaXNjIFBhZCBDdHJsIDQgKi8KKwlbMHgwQzI3XSA9IDB4MDAwMCwgICAgIC8qIFIzMTExICAtIE1pc2MgUGFkIEN0cmwgNSAqLworCVsweDBDMjhdID0gMHgwMDAwLCAgICAgLyogUjMxMTIgIC0gTWlzYyBHUElPIDEgKi8KKwlbMHgwRDAwXSA9IDB4MDAwMCwgICAgIC8qIFIzMzI4ICAtIEludGVycnVwdCBTdGF0dXMgMSAqLworCVsweDBEMDFdID0gMHgwMDAwLCAgICAgLyogUjMzMjkgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJWzB4MEQwMl0gPSAweDAwMDAsICAgICAvKiBSMzMzMCAgLSBJbnRlcnJ1cHQgU3RhdHVzIDMgKi8KKwlbMHgwRDAzXSA9IDB4MDAwMCwgICAgIC8qIFIzMzMxICAtIEludGVycnVwdCBTdGF0dXMgNCAqLworCVsweDBEMDRdID0gMHgwMDAwLCAgICAgLyogUjMzMzIgIC0gSW50ZXJydXB0IFJhdyBTdGF0dXMgMiAqLworCVsweDBEMDVdID0gMHgwMDAwLCAgICAgLyogUjMzMzMgIC0gSW50ZXJydXB0IFJhdyBTdGF0dXMgMyAqLworCVsweDBEMDZdID0gMHgwMDAwLCAgICAgLyogUjMzMzQgIC0gSW50ZXJydXB0IFJhdyBTdGF0dXMgNCAqLworCVsweDBEMDddID0gMHhGRkZGLCAgICAgLyogUjMzMzUgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwlbMHgwRDA4XSA9IDB4RkZGRiwgICAgIC8qIFIzMzM2ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJWzB4MEQwOV0gPSAweEZGRkYsICAgICAvKiBSMzMzNyAgLSBJbnRlcnJ1cHQgU3RhdHVzIDMgTWFzayAqLworCVsweDBEMEFdID0gMHhGRkZGLCAgICAgLyogUjMzMzggIC0gSW50ZXJydXB0IFN0YXR1cyA0IE1hc2sgKi8KKwlbMHgwRDFGXSA9IDB4MDAwMCwgICAgIC8qIFIzMzU5ICAtIEludGVycnVwdCBDb250cm9sICovCisJWzB4MEQyMF0gPSAweEZGRkYsICAgICAvKiBSMzM2MCAgLSBJUlEgRGVib3VuY2UgMSAqLworCVsweDBEMjFdID0gMHhGRkZGLCAgICAgLyogUjMzNjEgIC0gSVJRIERlYm91bmNlIDIgKi8KKwlbMHgwRTAwXSA9IDB4MDAwMCwgICAgIC8qIFIzNTg0ICAtIEZYX0N0cmwgKi8KKwlbMHgwRTEwXSA9IDB4NjMxOCwgICAgIC8qIFIzNjAwICAtIEVRMV8xICovCisJWzB4MEUxMV0gPSAweDYzMDAsICAgICAvKiBSMzYwMSAgLSBFUTFfMiAqLworCVsweDBFMTJdID0gMHgwRkM4LCAgICAgLyogUjM2MDIgIC0gRVExXzMgKi8KKwlbMHgwRTEzXSA9IDB4MDNGRSwgICAgIC8qIFIzNjAzICAtIEVRMV80ICovCisJWzB4MEUxNF0gPSAweDAwRTAsICAgICAvKiBSMzYwNCAgLSBFUTFfNSAqLworCVsweDBFMTVdID0gMHgxRUM0LCAgICAgLyogUjM2MDUgIC0gRVExXzYgKi8KKwlbMHgwRTE2XSA9IDB4RjEzNiwgICAgIC8qIFIzNjA2ICAtIEVRMV83ICovCisJWzB4MEUxN10gPSAweDA0MDksICAgICAvKiBSMzYwNyAgLSBFUTFfOCAqLworCVsweDBFMThdID0gMHgwNENDLCAgICAgLyogUjM2MDggIC0gRVExXzkgKi8KKwlbMHgwRTE5XSA9IDB4MUM5QiwgICAgIC8qIFIzNjA5ICAtIEVRMV8xMCAqLworCVsweDBFMUFdID0gMHhGMzM3LCAgICAgLyogUjM2MTAgIC0gRVExXzExICovCisJWzB4MEUxQl0gPSAweDA0MEIsICAgICAvKiBSMzYxMSAgLSBFUTFfMTIgKi8KKwlbMHgwRTFDXSA9IDB4MENCQiwgICAgIC8qIFIzNjEyICAtIEVRMV8xMyAqLworCVsweDBFMURdID0gMHgxNkY4LCAgICAgLyogUjM2MTMgIC0gRVExXzE0ICovCisJWzB4MEUxRV0gPSAweEY3RDksICAgICAvKiBSMzYxNCAgLSBFUTFfMTUgKi8KKwlbMHgwRTFGXSA9IDB4MDQwQSwgICAgIC8qIFIzNjE1ICAtIEVRMV8xNiAqLworCVsweDBFMjBdID0gMHgxRjE0LCAgICAgLyogUjM2MTYgIC0gRVExXzE3ICovCisJWzB4MEUyMV0gPSAweDA1OEMsICAgICAvKiBSMzYxNyAgLSBFUTFfMTggKi8KKwlbMHgwRTIyXSA9IDB4MDU2MywgICAgIC8qIFIzNjE4ICAtIEVRMV8xOSAqLworCVsweDBFMjNdID0gMHg0MDAwLCAgICAgLyogUjM2MTkgIC0gRVExXzIwICovCisJWzB4MEUyNl0gPSAweDYzMTgsICAgICAvKiBSMzYyMiAgLSBFUTJfMSAqLworCVsweDBFMjddID0gMHg2MzAwLCAgICAgLyogUjM2MjMgIC0gRVEyXzIgKi8KKwlbMHgwRTI4XSA9IDB4MEZDOCwgICAgIC8qIFIzNjI0ICAtIEVRMl8zICovCisJWzB4MEUyOV0gPSAweDAzRkUsICAgICAvKiBSMzYyNSAgLSBFUTJfNCAqLworCVsweDBFMkFdID0gMHgwMEUwLCAgICAgLyogUjM2MjYgIC0gRVEyXzUgKi8KKwlbMHgwRTJCXSA9IDB4MUVDNCwgICAgIC8qIFIzNjI3ICAtIEVRMl82ICovCisJWzB4MEUyQ10gPSAweEYxMzYsICAgICAvKiBSMzYyOCAgLSBFUTJfNyAqLworCVsweDBFMkRdID0gMHgwNDA5LCAgICAgLyogUjM2MjkgIC0gRVEyXzggKi8KKwlbMHgwRTJFXSA9IDB4MDRDQywgICAgIC8qIFIzNjMwICAtIEVRMl85ICovCisJWzB4MEUyRl0gPSAweDFDOUIsICAgICAvKiBSMzYzMSAgLSBFUTJfMTAgKi8KKwlbMHgwRTMwXSA9IDB4RjMzNywgICAgIC8qIFIzNjMyICAtIEVRMl8xMSAqLworCVsweDBFMzFdID0gMHgwNDBCLCAgICAgLyogUjM2MzMgIC0gRVEyXzEyICovCisJWzB4MEUzMl0gPSAweDBDQkIsICAgICAvKiBSMzYzNCAgLSBFUTJfMTMgKi8KKwlbMHgwRTMzXSA9IDB4MTZGOCwgICAgIC8qIFIzNjM1ICAtIEVRMl8xNCAqLworCVsweDBFMzRdID0gMHhGN0Q5LCAgICAgLyogUjM2MzYgIC0gRVEyXzE1ICovCisJWzB4MEUzNV0gPSAweDA0MEEsICAgICAvKiBSMzYzNyAgLSBFUTJfMTYgKi8KKwlbMHgwRTM2XSA9IDB4MUYxNCwgICAgIC8qIFIzNjM4ICAtIEVRMl8xNyAqLworCVsweDBFMzddID0gMHgwNThDLCAgICAgLyogUjM2MzkgIC0gRVEyXzE4ICovCisJWzB4MEUzOF0gPSAweDA1NjMsICAgICAvKiBSMzY0MCAgLSBFUTJfMTkgKi8KKwlbMHgwRTM5XSA9IDB4NDAwMCwgICAgIC8qIFIzNjQxICAtIEVRMl8yMCAqLworCVsweDBFM0NdID0gMHg2MzE4LCAgICAgLyogUjM2NDQgIC0gRVEzXzEgKi8KKwlbMHgwRTNEXSA9IDB4NjMwMCwgICAgIC8qIFIzNjQ1ICAtIEVRM18yICovCisJWzB4MEUzRV0gPSAweDBGQzgsICAgICAvKiBSMzY0NiAgLSBFUTNfMyAqLworCVsweDBFM0ZdID0gMHgwM0ZFLCAgICAgLyogUjM2NDcgIC0gRVEzXzQgKi8KKwlbMHgwRTQwXSA9IDB4MDBFMCwgICAgIC8qIFIzNjQ4ICAtIEVRM181ICovCisJWzB4MEU0MV0gPSAweDFFQzQsICAgICAvKiBSMzY0OSAgLSBFUTNfNiAqLworCVsweDBFNDJdID0gMHhGMTM2LCAgICAgLyogUjM2NTAgIC0gRVEzXzcgKi8KKwlbMHgwRTQzXSA9IDB4MDQwOSwgICAgIC8qIFIzNjUxICAtIEVRM184ICovCisJWzB4MEU0NF0gPSAweDA0Q0MsICAgICAvKiBSMzY1MiAgLSBFUTNfOSAqLworCVsweDBFNDVdID0gMHgxQzlCLCAgICAgLyogUjM2NTMgIC0gRVEzXzEwICovCisJWzB4MEU0Nl0gPSAweEYzMzcsICAgICAvKiBSMzY1NCAgLSBFUTNfMTEgKi8KKwlbMHgwRTQ3XSA9IDB4MDQwQiwgICAgIC8qIFIzNjU1ICAtIEVRM18xMiAqLworCVsweDBFNDhdID0gMHgwQ0JCLCAgICAgLyogUjM2NTYgIC0gRVEzXzEzICovCisJWzB4MEU0OV0gPSAweDE2RjgsICAgICAvKiBSMzY1NyAgLSBFUTNfMTQgKi8KKwlbMHgwRTRBXSA9IDB4RjdEOSwgICAgIC8qIFIzNjU4ICAtIEVRM18xNSAqLworCVsweDBFNEJdID0gMHgwNDBBLCAgICAgLyogUjM2NTkgIC0gRVEzXzE2ICovCisJWzB4MEU0Q10gPSAweDFGMTQsICAgICAvKiBSMzY2MCAgLSBFUTNfMTcgKi8KKwlbMHgwRTREXSA9IDB4MDU4QywgICAgIC8qIFIzNjYxICAtIEVRM18xOCAqLworCVsweDBFNEVdID0gMHgwNTYzLCAgICAgLyogUjM2NjIgIC0gRVEzXzE5ICovCisJWzB4MEU0Rl0gPSAweDQwMDAsICAgICAvKiBSMzY2MyAgLSBFUTNfMjAgKi8KKwlbMHgwRTUyXSA9IDB4NjMxOCwgICAgIC8qIFIzNjY2ICAtIEVRNF8xICovCisJWzB4MEU1M10gPSAweDYzMDAsICAgICAvKiBSMzY2NyAgLSBFUTRfMiAqLworCVsweDBFNTRdID0gMHgwRkM4LCAgICAgLyogUjM2NjggIC0gRVE0XzMgKi8KKwlbMHgwRTU1XSA9IDB4MDNGRSwgICAgIC8qIFIzNjY5ICAtIEVRNF80ICovCisJWzB4MEU1Nl0gPSAweDAwRTAsICAgICAvKiBSMzY3MCAgLSBFUTRfNSAqLworCVsweDBFNTddID0gMHgxRUM0LCAgICAgLyogUjM2NzEgIC0gRVE0XzYgKi8KKwlbMHgwRTU4XSA9IDB4RjEzNiwgICAgIC8qIFIzNjcyICAtIEVRNF83ICovCisJWzB4MEU1OV0gPSAweDA0MDksICAgICAvKiBSMzY3MyAgLSBFUTRfOCAqLworCVsweDBFNUFdID0gMHgwNENDLCAgICAgLyogUjM2NzQgIC0gRVE0XzkgKi8KKwlbMHgwRTVCXSA9IDB4MUM5QiwgICAgIC8qIFIzNjc1ICAtIEVRNF8xMCAqLworCVsweDBFNUNdID0gMHhGMzM3LCAgICAgLyogUjM2NzYgIC0gRVE0XzExICovCisJWzB4MEU1RF0gPSAweDA0MEIsICAgICAvKiBSMzY3NyAgLSBFUTRfMTIgKi8KKwlbMHgwRTVFXSA9IDB4MENCQiwgICAgIC8qIFIzNjc4ICAtIEVRNF8xMyAqLworCVsweDBFNUZdID0gMHgxNkY4LCAgICAgLyogUjM2NzkgIC0gRVE0XzE0ICovCisJWzB4MEU2MF0gPSAweEY3RDksICAgICAvKiBSMzY4MCAgLSBFUTRfMTUgKi8KKwlbMHgwRTYxXSA9IDB4MDQwQSwgICAgIC8qIFIzNjgxICAtIEVRNF8xNiAqLworCVsweDBFNjJdID0gMHgxRjE0LCAgICAgLyogUjM2ODIgIC0gRVE0XzE3ICovCisJWzB4MEU2M10gPSAweDA1OEMsICAgICAvKiBSMzY4MyAgLSBFUTRfMTggKi8KKwlbMHgwRTY0XSA9IDB4MDU2MywgICAgIC8qIFIzNjg0ICAtIEVRNF8xOSAqLworCVsweDBFNjVdID0gMHg0MDAwLCAgICAgLyogUjM2ODUgIC0gRVE0XzIwICovCisJWzB4MEU4MF0gPSAweDAwMTgsICAgICAvKiBSMzcxMiAgLSBEUkMxIGN0cmwxICovCisJWzB4MEU4MV0gPSAweDA5MzMsICAgICAvKiBSMzcxMyAgLSBEUkMxIGN0cmwyICovCisJWzB4MEU4Ml0gPSAweDAwMTgsICAgICAvKiBSMzcxNCAgLSBEUkMxIGN0cmwzICovCisJWzB4MEU4M10gPSAweDAwMDAsICAgICAvKiBSMzcxNSAgLSBEUkMxIGN0cmw0ICovCisJWzB4MEU4NF0gPSAweDAwMDAsICAgICAvKiBSMzcxNiAgLSBEUkMxIGN0cmw1ICovCisJWzB4MEVDMF0gPSAweDAwMDAsICAgICAvKiBSMzc3NiAgLSBIUExQRjFfMSAqLworCVsweDBFQzFdID0gMHgwMDAwLCAgICAgLyogUjM3NzcgIC0gSFBMUEYxXzIgKi8KKwlbMHgwRUM0XSA9IDB4MDAwMCwgICAgIC8qIFIzNzgwICAtIEhQTFBGMl8xICovCisJWzB4MEVDNV0gPSAweDAwMDAsICAgICAvKiBSMzc4MSAgLSBIUExQRjJfMiAqLworCVsweDBFQzhdID0gMHgwMDAwLCAgICAgLyogUjM3ODQgIC0gSFBMUEYzXzEgKi8KKwlbMHgwRUM5XSA9IDB4MDAwMCwgICAgIC8qIFIzNzg1ICAtIEhQTFBGM18yICovCisJWzB4MEVDQ10gPSAweDAwMDAsICAgICAvKiBSMzc4OCAgLSBIUExQRjRfMSAqLworCVsweDBFQ0RdID0gMHgwMDAwLCAgICAgLyogUjM3ODkgIC0gSFBMUEY0XzIgKi8KKwlbMHg0MDAwXSA9IDB4MDAwMCwgICAgIC8qIFIxNjM4NCAtIERTUDEgRE0gMCAqLworCVsweDQwMDFdID0gMHgwMDAwLCAgICAgLyogUjE2Mzg1IC0gRFNQMSBETSAxICovCisJWzB4NDAwMl0gPSAweDAwMDAsICAgICAvKiBSMTYzODYgLSBEU1AxIERNIDIgKi8KKwlbMHg0MDAzXSA9IDB4MDAwMCwgICAgIC8qIFIxNjM4NyAtIERTUDEgRE0gMyAqLworCVsweDQxRkNdID0gMHgwMDAwLCAgICAgLyogUjE2ODkyIC0gRFNQMSBETSA1MDggKi8KKwlbMHg0MUZEXSA9IDB4MDAwMCwgICAgIC8qIFIxNjg5MyAtIERTUDEgRE0gNTA5ICovCisJWzB4NDFGRV0gPSAweDAwMDAsICAgICAvKiBSMTY4OTQgLSBEU1AxIERNIDUxMCAqLworCVsweDQxRkZdID0gMHgwMDAwLCAgICAgLyogUjE2ODk1IC0gRFNQMSBETSA1MTEgKi8KKwlbMHg0ODAwXSA9IDB4MDAwMCwgICAgIC8qIFIxODQzMiAtIERTUDEgUE0gMCAqLworCVsweDQ4MDFdID0gMHgwMDAwLCAgICAgLyogUjE4NDMzIC0gRFNQMSBQTSAxICovCisJWzB4NDgwMl0gPSAweDAwMDAsICAgICAvKiBSMTg0MzQgLSBEU1AxIFBNIDIgKi8KKwlbMHg0ODAzXSA9IDB4MDAwMCwgICAgIC8qIFIxODQzNSAtIERTUDEgUE0gMyAqLworCVsweDQ4MDRdID0gMHgwMDAwLCAgICAgLyogUjE4NDM2IC0gRFNQMSBQTSA0ICovCisJWzB4NDgwNV0gPSAweDAwMDAsICAgICAvKiBSMTg0MzcgLSBEU1AxIFBNIDUgKi8KKwlbMHg0REZBXSA9IDB4MDAwMCwgICAgIC8qIFIxOTk2MiAtIERTUDEgUE0gMTUzMCAqLworCVsweDRERkJdID0gMHgwMDAwLCAgICAgLyogUjE5OTYzIC0gRFNQMSBQTSAxNTMxICovCisJWzB4NERGQ10gPSAweDAwMDAsICAgICAvKiBSMTk5NjQgLSBEU1AxIFBNIDE1MzIgKi8KKwlbMHg0REZEXSA9IDB4MDAwMCwgICAgIC8qIFIxOTk2NSAtIERTUDEgUE0gMTUzMyAqLworCVsweDRERkVdID0gMHgwMDAwLCAgICAgLyogUjE5OTY2IC0gRFNQMSBQTSAxNTM0ICovCisJWzB4NERGRl0gPSAweDAwMDAsICAgICAvKiBSMTk5NjcgLSBEU1AxIFBNIDE1MzUgKi8KKwlbMHg1MDAwXSA9IDB4MDAwMCwgICAgIC8qIFIyMDQ4MCAtIERTUDEgWk0gMCAqLworCVsweDUwMDFdID0gMHgwMDAwLCAgICAgLyogUjIwNDgxIC0gRFNQMSBaTSAxICovCisJWzB4NTAwMl0gPSAweDAwMDAsICAgICAvKiBSMjA0ODIgLSBEU1AxIFpNIDIgKi8KKwlbMHg1MDAzXSA9IDB4MDAwMCwgICAgIC8qIFIyMDQ4MyAtIERTUDEgWk0gMyAqLworCVsweDU3RkNdID0gMHgwMDAwLCAgICAgLyogUjIyNTI0IC0gRFNQMSBaTSAyMDQ0ICovCisJWzB4NTdGRF0gPSAweDAwMDAsICAgICAvKiBSMjI1MjUgLSBEU1AxIFpNIDIwNDUgKi8KKwlbMHg1N0ZFXSA9IDB4MDAwMCwgICAgIC8qIFIyMjUyNiAtIERTUDEgWk0gMjA0NiAqLworCVsweDU3RkZdID0gMHgwMDAwLCAgICAgLyogUjIyNTI3IC0gRFNQMSBaTSAyMDQ3ICovCisJWzB4NjAwMF0gPSAweDAwMDAsICAgICAvKiBSMjQ1NzYgLSBEU1AyIERNIDAgKi8KKwlbMHg2MDAxXSA9IDB4MDAwMCwgICAgIC8qIFIyNDU3NyAtIERTUDIgRE0gMSAqLworCVsweDYwMDJdID0gMHgwMDAwLCAgICAgLyogUjI0NTc4IC0gRFNQMiBETSAyICovCisJWzB4NjAwM10gPSAweDAwMDAsICAgICAvKiBSMjQ1NzkgLSBEU1AyIERNIDMgKi8KKwlbMHg2MUZDXSA9IDB4MDAwMCwgICAgIC8qIFIyNTA4NCAtIERTUDIgRE0gNTA4ICovCisJWzB4NjFGRF0gPSAweDAwMDAsICAgICAvKiBSMjUwODUgLSBEU1AyIERNIDUwOSAqLworCVsweDYxRkVdID0gMHgwMDAwLCAgICAgLyogUjI1MDg2IC0gRFNQMiBETSA1MTAgKi8KKwlbMHg2MUZGXSA9IDB4MDAwMCwgICAgIC8qIFIyNTA4NyAtIERTUDIgRE0gNTExICovCisJWzB4NjgwMF0gPSAweDAwMDAsICAgICAvKiBSMjY2MjQgLSBEU1AyIFBNIDAgKi8KKwlbMHg2ODAxXSA9IDB4MDAwMCwgICAgIC8qIFIyNjYyNSAtIERTUDIgUE0gMSAqLworCVsweDY4MDJdID0gMHgwMDAwLCAgICAgLyogUjI2NjI2IC0gRFNQMiBQTSAyICovCisJWzB4NjgwM10gPSAweDAwMDAsICAgICAvKiBSMjY2MjcgLSBEU1AyIFBNIDMgKi8KKwlbMHg2ODA0XSA9IDB4MDAwMCwgICAgIC8qIFIyNjYyOCAtIERTUDIgUE0gNCAqLworCVsweDY4MDVdID0gMHgwMDAwLCAgICAgLyogUjI2NjI5IC0gRFNQMiBQTSA1ICovCisJWzB4NkRGQV0gPSAweDAwMDAsICAgICAvKiBSMjgxNTQgLSBEU1AyIFBNIDE1MzAgKi8KKwlbMHg2REZCXSA9IDB4MDAwMCwgICAgIC8qIFIyODE1NSAtIERTUDIgUE0gMTUzMSAqLworCVsweDZERkNdID0gMHgwMDAwLCAgICAgLyogUjI4MTU2IC0gRFNQMiBQTSAxNTMyICovCisJWzB4NkRGRF0gPSAweDAwMDAsICAgICAvKiBSMjgxNTcgLSBEU1AyIFBNIDE1MzMgKi8KKwlbMHg2REZFXSA9IDB4MDAwMCwgICAgIC8qIFIyODE1OCAtIERTUDIgUE0gMTUzNCAqLworCVsweDZERkZdID0gMHgwMDAwLCAgICAgLyogUjI4MTU5IC0gRFNQMiBQTSAxNTM1ICovCisJWzB4NzAwMF0gPSAweDAwMDAsICAgICAvKiBSMjg2NzIgLSBEU1AyIFpNIDAgKi8KKwlbMHg3MDAxXSA9IDB4MDAwMCwgICAgIC8qIFIyODY3MyAtIERTUDIgWk0gMSAqLworCVsweDcwMDJdID0gMHgwMDAwLCAgICAgLyogUjI4Njc0IC0gRFNQMiBaTSAyICovCisJWzB4NzAwM10gPSAweDAwMDAsICAgICAvKiBSMjg2NzUgLSBEU1AyIFpNIDMgKi8KKwlbMHg3N0ZDXSA9IDB4MDAwMCwgICAgIC8qIFIzMDcxNiAtIERTUDIgWk0gMjA0NCAqLworCVsweDc3RkRdID0gMHgwMDAwLCAgICAgLyogUjMwNzE3IC0gRFNQMiBaTSAyMDQ1ICovCisJWzB4NzdGRV0gPSAweDAwMDAsICAgICAvKiBSMzA3MTggLSBEU1AyIFpNIDIwNDYgKi8KKwlbMHg3N0ZGXSA9IDB4MDAwMCwgICAgIC8qIFIzMDcxOSAtIERTUDIgWk0gMjA0NyAqLworCVsweDgwMDBdID0gMHgwMDAwLCAgICAgLyogUjMyNzY4IC0gRFNQMyBETSAwICovCisJWzB4ODAwMV0gPSAweDAwMDAsICAgICAvKiBSMzI3NjkgLSBEU1AzIERNIDEgKi8KKwlbMHg4MDAyXSA9IDB4MDAwMCwgICAgIC8qIFIzMjc3MCAtIERTUDMgRE0gMiAqLworCVsweDgwMDNdID0gMHgwMDAwLCAgICAgLyogUjMyNzcxIC0gRFNQMyBETSAzICovCisJWzB4ODFGQ10gPSAweDAwMDAsICAgICAvKiBSMzMyNzYgLSBEU1AzIERNIDUwOCAqLworCVsweDgxRkRdID0gMHgwMDAwLCAgICAgLyogUjMzMjc3IC0gRFNQMyBETSA1MDkgKi8KKwlbMHg4MUZFXSA9IDB4MDAwMCwgICAgIC8qIFIzMzI3OCAtIERTUDMgRE0gNTEwICovCisJWzB4ODFGRl0gPSAweDAwMDAsICAgICAvKiBSMzMyNzkgLSBEU1AzIERNIDUxMSAqLworCVsweDg4MDBdID0gMHgwMDAwLCAgICAgLyogUjM0ODE2IC0gRFNQMyBQTSAwICovCisJWzB4ODgwMV0gPSAweDAwMDAsICAgICAvKiBSMzQ4MTcgLSBEU1AzIFBNIDEgKi8KKwlbMHg4ODAyXSA9IDB4MDAwMCwgICAgIC8qIFIzNDgxOCAtIERTUDMgUE0gMiAqLworCVsweDg4MDNdID0gMHgwMDAwLCAgICAgLyogUjM0ODE5IC0gRFNQMyBQTSAzICovCisJWzB4ODgwNF0gPSAweDAwMDAsICAgICAvKiBSMzQ4MjAgLSBEU1AzIFBNIDQgKi8KKwlbMHg4ODA1XSA9IDB4MDAwMCwgICAgIC8qIFIzNDgyMSAtIERTUDMgUE0gNSAqLworCVsweDhERkFdID0gMHgwMDAwLCAgICAgLyogUjM2MzQ2IC0gRFNQMyBQTSAxNTMwICovCisJWzB4OERGQl0gPSAweDAwMDAsICAgICAvKiBSMzYzNDcgLSBEU1AzIFBNIDE1MzEgKi8KKwlbMHg4REZDXSA9IDB4MDAwMCwgICAgIC8qIFIzNjM0OCAtIERTUDMgUE0gMTUzMiAqLworCVsweDhERkRdID0gMHgwMDAwLCAgICAgLyogUjM2MzQ5IC0gRFNQMyBQTSAxNTMzICovCisJWzB4OERGRV0gPSAweDAwMDAsICAgICAvKiBSMzYzNTAgLSBEU1AzIFBNIDE1MzQgKi8KKwlbMHg4REZGXSA9IDB4MDAwMCwgICAgIC8qIFIzNjM1MSAtIERTUDMgUE0gMTUzNSAqLworCVsweDkwMDBdID0gMHgwMDAwLCAgICAgLyogUjM2ODY0IC0gRFNQMyBaTSAwICovCisJWzB4OTAwMV0gPSAweDAwMDAsICAgICAvKiBSMzY4NjUgLSBEU1AzIFpNIDEgKi8KKwlbMHg5MDAyXSA9IDB4MDAwMCwgICAgIC8qIFIzNjg2NiAtIERTUDMgWk0gMiAqLworCVsweDkwMDNdID0gMHgwMDAwLCAgICAgLyogUjM2ODY3IC0gRFNQMyBaTSAzICovCisJWzB4OTdGQ10gPSAweDAwMDAsICAgICAvKiBSMzg5MDggLSBEU1AzIFpNIDIwNDQgKi8KKwlbMHg5N0ZEXSA9IDB4MDAwMCwgICAgIC8qIFIzODkwOSAtIERTUDMgWk0gMjA0NSAqLworCVsweDk3RkVdID0gMHgwMDAwLCAgICAgLyogUjM4OTEwIC0gRFNQMyBaTSAyMDQ2ICovCisJWzB4OTdGRl0gPSAweDAwMDAgICAgICAvKiBSMzg5MTEgLSBEU1AzIFpNIDIwNDcgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ5MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwpAQCAtMCwwICsxLDI4MTMgQEAKKy8qCisgKiB3bTUxMDAuYyAgLS0gIFdNNTEwMCBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogQXV0aG9yOiBNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZ2NkLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvd201MTAwLmg+CisKKyNpbmNsdWRlICJ3bTUxMDAuaCIKKworI2RlZmluZSBXTTUxMDBfTlVNX0NPUkVfU1VQUExJRVMgMgorc3RhdGljIGNvbnN0IGNoYXIgKndtNTEwMF9jb3JlX3N1cHBseV9uYW1lc1tXTTUxMDBfTlVNX0NPUkVfU1VQUExJRVNdID0geworCSJEQlZERDEiLAorCSJMRE9WREQiLCAvKiBJZiBEQ1ZERCBpcyBzdXBwbGllZCBleHRlcm5hbGx5IHNwZWNpZnkgYXMgTERPVkREICovCit9OworCisjZGVmaW5lIFdNNTEwMF9BSUZTICAgICAzCisjZGVmaW5lIFdNNTEwMF9TWU5DX1NSUyAzCisKK3N0cnVjdCB3bTUxMDBfZmxsIHsKKwlpbnQgZnJlZjsKKwlpbnQgZm91dDsKKwlpbnQgc3JjOworCXN0cnVjdCBjb21wbGV0aW9uIGxvY2s7Cit9OworCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCB3bTUxMDBfcHJpdiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgY29yZV9zdXBwbGllc1tXTTUxMDBfTlVNX0NPUkVfU1VQUExJRVNdOworCXN0cnVjdCByZWd1bGF0b3IgKmNwdmRkOworCXN0cnVjdCByZWd1bGF0b3IgKmRidmRkMjsKKwlzdHJ1Y3QgcmVndWxhdG9yICpkYnZkZDM7CisKKwlpbnQgcmV2OworCisJaW50IHN5c2NsazsKKwlpbnQgYXN5bmNjbGs7CisKKwlib29sIGFpZl9hc3luY1tXTTUxMDBfQUlGU107CisJYm9vbCBhaWZfc3ltbWV0cmljW1dNNTEwMF9BSUZTXTsKKwlpbnQgc3JfcmVmW1dNNTEwMF9TWU5DX1NSU107CisKKwlib29sIG91dF9lbmFbMl07CisKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrOworCWJvb2wgamFja19kZXRlY3Rpbmc7CisJYm9vbCBqYWNrX21pYzsKKwlpbnQgamFja19tb2RlOworCisJc3RydWN0IHdtNTEwMF9mbGwgZmxsWzJdOworCisJc3RydWN0IHdtNTEwMF9wZGF0YSBwZGF0YTsKKworI2lmZGVmIENPTkZJR19HUElPTElCCisJc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7CisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgd201MTAwX3NyX2NvZGVbXSA9IHsKKwkwLAorCTEyMDAwLAorCTI0MDAwLAorCTQ4MDAwLAorCTk2MDAwLAorCTE5MjAwMCwKKwkzODQwMDAsCisJNzY4MDAwLAorCTAsCisJMTEwMjUsCisJMjIwNTAsCisJNDQxMDAsCisJODgyMDAsCisJMTc2NDAwLAorCTM1MjgwMCwKKwk3MDU2MDAsCisJNDAwMCwKKwk4MDAwLAorCTE2MDAwLAorCTMyMDAwLAorCTY0MDAwLAorCTEyODAwMCwKKwkyNTYwMDAsCisJNTEyMDAwLAorfTsKKworc3RhdGljIGludCB3bTUxMDBfc3JfcmVnc1tXTTUxMDBfU1lOQ19TUlNdID0geworCVdNNTEwMF9DTE9DS0lOR180LAorCVdNNTEwMF9DTE9DS0lOR181LAorCVdNNTEwMF9DTE9DS0lOR182LAorfTsKKworc3RhdGljIGludCB3bTUxMDBfYWxsb2Nfc3Ioc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgcmF0ZSkKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBzcl9jb2RlLCBzcl9mcmVlLCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod201MTAwX3NyX2NvZGUpOyBpKyspCisJCWlmICh3bTUxMDBfc3JfY29kZVtpXSA9PSByYXRlKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gQVJSQVlfU0laRSh3bTUxMDBfc3JfY29kZSkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGU6ICVkSHpcbiIsIHJhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3JfY29kZSA9IGk7CisKKwlpZiAoKHdtNTEwMC0+c3lzY2xrICUgcmF0ZSkgPT0gMCkgeworCQkvKiBJcyB0aGlzIHJhdGUgYWxyZWFkeSBpbiB1c2U/ICovCisJCXNyX2ZyZWUgPSAtMTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod201MTAwX3NyX3JlZ3MpOyBpKyspIHsKKwkJCWlmICghd201MTAwLT5zcl9yZWZbaV0gJiYgc3JfZnJlZSA9PSAtMSkgeworCQkJCXNyX2ZyZWUgPSBpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIHdtNTEwMF9zcl9yZWdzW2ldKSAmCisJCQkgICAgIFdNNTEwMF9TQU1QTEVfUkFURV8xX01BU0spID09IHNyX2NvZGUpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IEFSUkFZX1NJWkUod201MTAwX3NyX3JlZ3MpKSB7CisJCQl3bTUxMDAtPnNyX3JlZltpXSsrOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiU1IgJWRIeiwgc2xvdCAlZCwgcmVmICVkXG4iLAorCQkJCXJhdGUsIGksIHdtNTEwMC0+c3JfcmVmW2ldKTsKKwkJCXJldHVybiBpOworCQl9CisKKwkJaWYgKHNyX2ZyZWUgPT0gLTEpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIkFsbCBTUiBzbG90cyBhbHJlYWR5IGluIHVzZVxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQWxsb2NhdGluZyBTUiBzbG90ICVkIGZvciAlZEh6XG4iLAorCQkJc3JfZnJlZSwgcmF0ZSk7CisJCXdtNTEwMC0+c3JfcmVmW3NyX2ZyZWVdKys7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHdtNTEwMF9zcl9yZWdzW3NyX2ZyZWVdLAorCQkJCSAgICBXTTUxMDBfU0FNUExFX1JBVEVfMV9NQVNLLAorCQkJCSAgICBzcl9jb2RlKTsKKworCQlyZXR1cm4gc3JfZnJlZTsKKworCX0gZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSJTUiAlZEh6IGluY29tcGF0aWJsZSB3aXRoICVkSHogU1lTQ0xLIGFuZCAlZEh6IEFTWU5DQ0xLXG4iLAorCQkJcmF0ZSwgd201MTAwLT5zeXNjbGssIHdtNTEwMC0+YXN5bmNjbGspOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdtNTEwMF9mcmVlX3NyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IHJhdGUpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaSwgc3JfY29kZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtNTEwMF9zcl9jb2RlKTsgaSsrKQorCQlpZiAod201MTAwX3NyX2NvZGVbaV0gPT0gcmF0ZSkKKwkJCWJyZWFrOworCWlmIChpID09IEFSUkFZX1NJWkUod201MTAwX3NyX2NvZGUpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlOiAlZEh6XG4iLCByYXRlKTsKKwkJcmV0dXJuOworCX0KKwlzcl9jb2RlID0gd201MTAwX3NyX2NvZGVbaV07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTUxMDBfc3JfcmVncyk7IGkrKykgeworCQlpZiAoIXdtNTEwMC0+c3JfcmVmW2ldKQorCQkJY29udGludWU7CisKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIHdtNTEwMF9zcl9yZWdzW2ldKSAmCisJCSAgICAgV001MTAwX1NBTVBMRV9SQVRFXzFfTUFTSykgPT0gc3JfY29kZSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA8IEFSUkFZX1NJWkUod201MTAwX3NyX3JlZ3MpKSB7CisJCXdtNTEwMC0+c3JfcmVmW2ldLS07CisJCWRldl9kYmcoY29kZWMtPmRldiwgIkRlcmVmZXJlbmNlIFNSICVkSHosIGNvdW50IG5vdyAlZFxuIiwKKwkJCXJhdGUsIHdtNTEwMC0+c3JfcmVmW2ldKTsKKwl9IGVsc2UgeworCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiRnJlZWluZyB1bnJlZmVyZW5jZWQgc2FtcGxlIHJhdGUgJWRIelxuIiwKKwkJCSByYXRlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd201MTAwX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKHdtNTEwMC0+cGRhdGEucmVzZXQpIHsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod201MTAwLT5wZGF0YS5yZXNldCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHdtNTEwMC0+cGRhdGEucmVzZXQsIDEpOworCisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTUxMDBfU09GVFdBUkVfUkVTRVQsIDApOworCX0KK30KKworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGluX3RsdiwgLTYzMDAsIDEwMCwgMCk7CitzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaXhlcl90bHYsIC0zMjAwLCAxMDAsIDApOworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKG91dF90bHYsIC02NDAwLCAxMDAsIDApOworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ2l0YWxfdGx2LCAtNjQwMCwgNTAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqd201MTAwX21peGVyX3RleHRzW10gPSB7CisJIk5vbmUiLAorCSJUb25lIEdlbmVyYXRvciAxIiwKKwkiVG9uZSBHZW5lcmF0b3IgMiIsCisJIkFFQyBsb29wYmFjayIsCisJIklOMUwiLAorCSJJTjFSIiwKKwkiSU4yTCIsCisJIklOMlIiLAorCSJJTjNMIiwKKwkiSU4zUiIsCisJIklONEwiLAorCSJJTjRSIiwKKwkiQUlGMVJYMSIsCisJIkFJRjFSWDIiLAorCSJBSUYxUlgzIiwKKwkiQUlGMVJYNCIsCisJIkFJRjFSWDUiLAorCSJBSUYxUlg2IiwKKwkiQUlGMVJYNyIsCisJIkFJRjFSWDgiLAorCSJBSUYyUlgxIiwKKwkiQUlGMlJYMiIsCisJIkFJRjNSWDEiLAorCSJBSUYzUlgyIiwKKwkiRVExIiwKKwkiRVEyIiwKKwkiRVEzIiwKKwkiRVE0IiwKKwkiRFJDMUwiLAorCSJEUkMxUiIsCisJIkxIUEYxIiwKKwkiTEhQRjIiLAorCSJMSFBGMyIsCisJIkxIUEY0IiwKKwkiRFNQMS4xIiwKKwkiRFNQMS4yIiwKKwkiRFNQMS4zIiwKKwkiRFNQMS40IiwKKwkiRFNQMS41IiwKKwkiRFNQMS42IiwKKwkiRFNQMi4xIiwKKwkiRFNQMi4yIiwKKwkiRFNQMi4zIiwKKwkiRFNQMi40IiwKKwkiRFNQMi41IiwKKwkiRFNQMi42IiwKKwkiRFNQMy4xIiwKKwkiRFNQMy4yIiwKKwkiRFNQMy4zIiwKKwkiRFNQMy40IiwKKwkiRFNQMy41IiwKKwkiRFNQMy42IiwKKwkiQVNSQzFMIiwKKwkiQVNSQzFSIiwKKwkiQVNSQzJMIiwKKwkiQVNSQzJSIiwKKwkiSVNSQzFJTlQxIiwKKwkiSVNSQzFJTlQyIiwKKwkiSVNSQzFJTlQzIiwKKwkiSVNSQzFJTlQ0IiwKKwkiSVNSQzJJTlQxIiwKKwkiSVNSQzJJTlQyIiwKKwkiSVNSQzJJTlQzIiwKKwkiSVNSQzJJTlQ0IiwKKwkiSVNSQzFERUMxIiwKKwkiSVNSQzFERUMyIiwKKwkiSVNSQzFERUMzIiwKKwkiSVNSQzFERUM0IiwKKwkiSVNSQzJERUMxIiwKKwkiSVNSQzJERUMyIiwKKwkiSVNSQzJERUMzIiwKKwkiSVNSQzJERUM0IiwKK307CisKK3N0YXRpYyBpbnQgd201MTAwX21peGVyX3ZhbHVlc1tdID0geworCTB4MDAsCisJMHgwNCwgICAvKiBUb25lICovCisJMHgwNSwKKwkweDA4LCAgIC8qIEFFQyAqLworCTB4MTAsICAgLyogSW5wdXQgKi8KKwkweDExLAorCTB4MTIsCisJMHgxMywKKwkweDE0LAorCTB4MTUsCisJMHgxNiwKKwkweDE3LAorCTB4MjAsICAgLyogQUlGICovCisJMHgyMSwKKwkweDIyLAorCTB4MjMsCisJMHgyNCwKKwkweDI1LAorCTB4MjYsCisJMHgyNywKKwkweDI4LAorCTB4MjksCisJMHgzMCwgICAvKiBBSUYzIC0gY2hlY2sgKi8KKwkweDMxLAorCTB4NTAsICAgLyogRVEgKi8KKwkweDUxLAorCTB4NTIsCisJMHg1MywKKwkweDU0LAorCTB4NTgsICAgLyogRFJDICovCisJMHg1OSwKKwkweDYwLCAgIC8qIExIUEYxICovCisJMHg2MSwgICAvKiBMSFBGMiAqLworCTB4NjIsICAgLyogTEhQRjMgKi8KKwkweDYzLCAgIC8qIExIUEY0ICovCisJMHg2OCwgICAvKiBEU1AxICovCisJMHg2OSwKKwkweDZhLAorCTB4NmIsCisJMHg2YywKKwkweDZkLAorCTB4NzAsICAgLyogRFNQMiAqLworCTB4NzEsCisJMHg3MiwKKwkweDczLAorCTB4NzQsCisJMHg3NSwKKwkweDc4LCAgIC8qIERTUDMgKi8KKwkweDc5LAorCTB4N2EsCisJMHg3YiwKKwkweDdjLAorCTB4N2QsCisJMHg5MCwgICAvKiBBU1JDMSAqLworCTB4OTEsCisJMHg5MiwgICAvKiBBU1JDMiAqLworCTB4OTMsCisJMHhhMCwgICAvKiBJU1JDMURFQzEgKi8KKwkweGExLAorCTB4YTIsCisJMHhhMywKKwkweGE0LCAgIC8qIElTUkMxSU5UMSAqLworCTB4YTUsCisJMHhhNiwKKwkweGE3LAorCTB4YTgsICAgLyogSVNSQzJERUMxICovCisJMHhhOSwKKwkweGFhLAorCTB4YWIsCisJMHhhYywgICAvKiBJU1JDMklOVDEgKi8KKwkweGFkLAorCTB4YWUsCisJMHhhZiwKK307CisKKyNkZWZpbmUgV001MTAwX01JWEVSX0NPTlRST0xTKG5hbWUsIGJhc2UpIFwKKwlTT0NfU0lOR0xFX1RMVihuYW1lICIgSW5wdXQgMSBWb2x1bWUiLCBiYXNlICsgMSAsIFwKKwkJICAgICAgIFdNNTEwMF9NSVhFUl9WT0xfU0hJRlQsIDgwLCAwLCBtaXhlcl90bHYpLCBcCisJU09DX1NJTkdMRV9UTFYobmFtZSAiIElucHV0IDIgVm9sdW1lIiwgYmFzZSArIDMgLCBcCisJCSAgICAgICBXTTUxMDBfTUlYRVJfVk9MX1NISUZULCA4MCwgMCwgbWl4ZXJfdGx2KSwgXAorCVNPQ19TSU5HTEVfVExWKG5hbWUgIiBJbnB1dCAzIFZvbHVtZSIsIGJhc2UgKyA1ICwgXAorCQkgICAgICAgV001MTAwX01JWEVSX1ZPTF9TSElGVCwgODAsIDAsIG1peGVyX3RsdiksIFwKKwlTT0NfU0lOR0xFX1RMVihuYW1lICIgSW5wdXQgNCBWb2x1bWUiLCBiYXNlICsgNyAsIFwKKwkJICAgICAgIFdNNTEwMF9NSVhFUl9WT0xfU0hJRlQsIDgwLCAwLCBtaXhlcl90bHYpCisKKyNkZWZpbmUgV001MTAwX01VWF9FTlVNX0RFQ0wobmFtZSwgcmVnKSBcCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFX0RFQ0wobmFtZSwgcmVnLCAwLCAweGZmLCAJCQlcCisJCQkJICAgd201MTAwX21peGVyX3RleHRzLCB3bTUxMDBfbWl4ZXJfdmFsdWVzKQorCisjZGVmaW5lIFdNNTEwMF9NVVhfQ1RMX0RFQ0wobmFtZSkgXAorCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hbWUjI19tdXggPQlcCisJCVNPQ19EQVBNX1ZBTFVFX0VOVU0oIlJvdXRlIiwgbmFtZSMjX2VudW0pCisKKyNkZWZpbmUgV001MTAwX01JWEVSX0VOVU1TKG5hbWUsIGJhc2VfcmVnKSBcCisJc3RhdGljIFdNNTEwMF9NVVhfRU5VTV9ERUNMKG5hbWUjI19pbjFfZW51bSwgYmFzZV9yZWcpOwkgICAgIFwKKwlzdGF0aWMgV001MTAwX01VWF9FTlVNX0RFQ0wobmFtZSMjX2luMl9lbnVtLCBiYXNlX3JlZyArIDIpOyAgXAorCXN0YXRpYyBXTTUxMDBfTVVYX0VOVU1fREVDTChuYW1lIyNfaW4zX2VudW0sIGJhc2VfcmVnICsgNCk7ICBcCisJc3RhdGljIFdNNTEwMF9NVVhfRU5VTV9ERUNMKG5hbWUjI19pbjRfZW51bSwgYmFzZV9yZWcgKyA2KTsgIFwKKwlzdGF0aWMgV001MTAwX01VWF9DVExfREVDTChuYW1lIyNfaW4xKTsgXAorCXN0YXRpYyBXTTUxMDBfTVVYX0NUTF9ERUNMKG5hbWUjI19pbjIpOyBcCisJc3RhdGljIFdNNTEwMF9NVVhfQ1RMX0RFQ0wobmFtZSMjX2luMyk7IFwKKwlzdGF0aWMgV001MTAwX01VWF9DVExfREVDTChuYW1lIyNfaW40KSAKKworV001MTAwX01JWEVSX0VOVU1TKEhQT1VUMUwsIFdNNTEwMF9PVVQxTE1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoSFBPVVQxUiwgV001MTAwX09VVDFSTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhIUE9VVDJMLCBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEhQT1VUMlIsIFdNNTEwMF9PVVQyUk1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoSFBPVVQzTCwgV001MTAwX09VVDNMTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhIUE9VVDNSLCBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfMV9TT1VSQ0UpOworCitXTTUxMDBfTUlYRVJfRU5VTVMoU1BLT1VUTCwgV001MTAwX09VVDRMTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhTUEtPVVRSLCBXTTUxMDBfT1VUNFJNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFNQS0RBVDFMLCBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFNQS0RBVDFSLCBXTTUxMDBfT1VUNVJNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFNQS0RBVDJMLCBXTTUxMDBfT1VUNkxNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFNQS0RBVDJSLCBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfMV9TT1VSQ0UpOworCitXTTUxMDBfTUlYRVJfRU5VTVMoUFdNMSwgV001MTAwX1BXTTFNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFBXTTIsIFdNNTEwMF9QV00xTUlYX0lOUFVUXzFfU09VUkNFKTsKKworV001MTAwX01JWEVSX0VOVU1TKEFJRjFUWDEsIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhBSUYxVFgyLCBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoQUlGMVRYMywgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEFJRjFUWDQsIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhBSUYxVFg1LCBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoQUlGMVRYNiwgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEFJRjFUWDcsIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhBSUYxVFg4LCBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8xX1NPVVJDRSk7CisKK1dNNTEwMF9NSVhFUl9FTlVNUyhBSUYyVFgxLCBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoQUlGMlRYMiwgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMV9TT1VSQ0UpOworCitXTTUxMDBfTUlYRVJfRU5VTVMoQUlGM1RYMSwgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEFJRjNUWDIsIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzFfU09VUkNFKTsKKworV001MTAwX01JWEVSX0VOVU1TKEVRMSwgV001MTAwX0VRMU1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoRVEyLCBXTTUxMDBfRVEyTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhFUTMsIFdNNTEwMF9FUTNNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEVRNCwgV001MTAwX0VRNE1JWF9JTlBVVF8xX1NPVVJDRSk7CisKK1dNNTEwMF9NSVhFUl9FTlVNUyhEUkMxTCwgV001MTAwX0RSQzFMTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhEUkMxUiwgV001MTAwX0RSQzFSTUlYX0lOUFVUXzFfU09VUkNFKTsKKworV001MTAwX01JWEVSX0VOVU1TKExIUEYxLCBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKExIUEYyLCBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKExIUEYzLCBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKExIUEY0LCBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9TT1VSQ0UpOworCisjZGVmaW5lIFdNNTEwMF9NVVgobmFtZSwgY3RybCkgXAorCVNORF9TT0NfREFQTV9WQUxVRV9NVVgobmFtZSwgU05EX1NPQ19OT1BNLCAwLCAwLCBjdHJsKQorCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9XSURHRVRTKG5hbWUsIG5hbWVfc3RyKQlcCisJV001MTAwX01VWChuYW1lX3N0ciAiIElucHV0IDEiLCAmbmFtZSMjX2luMV9tdXgpLCBcCisJV001MTAwX01VWChuYW1lX3N0ciAiIElucHV0IDIiLCAmbmFtZSMjX2luMl9tdXgpLCBcCisJV001MTAwX01VWChuYW1lX3N0ciAiIElucHV0IDMiLCAmbmFtZSMjX2luM19tdXgpLCBcCisJV001MTAwX01VWChuYW1lX3N0ciAiIElucHV0IDQiLCAmbmFtZSMjX2luNF9tdXgpLCBcCisJU05EX1NPQ19EQVBNX01JWEVSKG5hbWVfc3RyICIgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApCisKKyNkZWZpbmUgV001MTAwX01JWEVSX0lOUFVUX1JPVVRFUyhuYW1lKQlcCisJeyBuYW1lLCAiVG9uZSBHZW5lcmF0b3IgMSIsICJUb25lIEdlbmVyYXRvciAxIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIlRvbmUgR2VuZXJhdG9yIDIiLCAiVG9uZSBHZW5lcmF0b3IgMiIgfSwgXAorICAgICAgICB7IG5hbWUsICJJTjFMIiwgIklOMUwgUEdBIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIklOMVIiLCAiSU4xUiBQR0EiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiSU4yTCIsICJJTjJMIFBHQSIgfSwgXAorICAgICAgICB7IG5hbWUsICJJTjJSIiwgIklOMlIgUEdBIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIklOM0wiLCAiSU4zTCBQR0EiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiSU4zUiIsICJJTjNSIFBHQSIgfSwgXAorICAgICAgICB7IG5hbWUsICJJTjRMIiwgIklONEwgUEdBIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIklONFIiLCAiSU40UiBQR0EiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiQUlGMVJYMSIsICJBSUYxUlgxIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkFJRjFSWDIiLCAiQUlGMVJYMiIgfSwgXAorICAgICAgICB7IG5hbWUsICJBSUYxUlgzIiwgIkFJRjFSWDMiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiQUlGMVJYNCIsICJBSUYxUlg0IiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkFJRjFSWDUiLCAiQUlGMVJYNSIgfSwgXAorICAgICAgICB7IG5hbWUsICJBSUYxUlg2IiwgIkFJRjFSWDYiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiQUlGMVJYNyIsICJBSUYxUlg3IiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkFJRjFSWDgiLCAiQUlGMVJYOCIgfSwgXAorICAgICAgICB7IG5hbWUsICJBSUYyUlgxIiwgIkFJRjJSWDEiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiQUlGMlJYMiIsICJBSUYyUlgyIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkFJRjNSWDEiLCAiQUlGM1JYMSIgfSwgXAorICAgICAgICB7IG5hbWUsICJBSUYzUlgyIiwgIkFJRjNSWDIiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiRVExIiwgIkVRMSIgfSwgXAorICAgICAgICB7IG5hbWUsICJFUTIiLCAiRVEyIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkVRMyIsICJFUTMiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiRVE0IiwgIkVRNCIgfSwgXAorICAgICAgICB7IG5hbWUsICJEUkMxTCIsICJEUkMxTCIgfSwgXAorICAgICAgICB7IG5hbWUsICJEUkMxUiIsICJEUkMxUiIgfSwgXAorICAgICAgICB7IG5hbWUsICJMSFBGMSIsICJMSFBGMSIgfSwgXAorICAgICAgICB7IG5hbWUsICJMSFBGMiIsICJMSFBGMiIgfSwgXAorICAgICAgICB7IG5hbWUsICJMSFBGMyIsICJMSFBGMyIgfSwgXAorICAgICAgICB7IG5hbWUsICJMSFBGNCIsICJMSFBGNCIgfQorCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9ST1VURVMod2lkZ2V0LCBuYW1lKSBcCisJeyB3aWRnZXQsIE5VTEwsIG5hbWUgIiBNaXhlciIgfSwgICAgICAgICBcCisJeyBuYW1lICIgTWl4ZXIiLCBOVUxMLCBuYW1lICIgSW5wdXQgMSIgfSwgXAorCXsgbmFtZSAiIE1peGVyIiwgTlVMTCwgbmFtZSAiIElucHV0IDIiIH0sIFwKKwl7IG5hbWUgIiBNaXhlciIsIE5VTEwsIG5hbWUgIiBJbnB1dCAzIiB9LCBcCisJeyBuYW1lICIgTWl4ZXIiLCBOVUxMLCBuYW1lICIgSW5wdXQgNCIgfSwgXAorCVdNNTEwMF9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIElucHV0IDEiKSwgXAorCVdNNTEwMF9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIElucHV0IDIiKSwgXAorCVdNNTEwMF9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIElucHV0IDMiKSwgXAorCVdNNTEwMF9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIElucHV0IDQiKQorCitzdGF0aWMgY29uc3QgY2hhciAqd201MTAwX2xocGZfbW9kZV90ZXh0W10gPSB7CisJIkxvdy1wYXNzIiwgIkhpZ2gtcGFzcyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYxX21vZGUgPQorCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYxXzEsIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZULCAyLAorCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTUxMDBfbGhwZjJfbW9kZSA9CisJU09DX0VOVU1fU0lOR0xFKFdNNTEwMF9IUExQRjJfMSwgV001MTAwX0xIUEYyX01PREVfU0hJRlQsIDIsCisJCQl3bTUxMDBfbGhwZl9tb2RlX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtNTEwMF9saHBmM19tb2RlID0KKwlTT0NfRU5VTV9TSU5HTEUoV001MTAwX0hQTFBGM18xLCBXTTUxMDBfTEhQRjNfTU9ERV9TSElGVCwgMiwKKwkJCXdtNTEwMF9saHBmX21vZGVfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGY0X21vZGUgPQorCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEY0XzEsIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZULCAyLAorCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtNTEwMF9zbmRfY29udHJvbHNbXSA9IHsKK1NPQ19TSU5HTEUoIklOMSBIaWdoIFBlcmZvcm1hbmNlIFN3aXRjaCIsIFdNNTEwMF9JTjFMX0NPTlRST0wsCisJICAgV001MTAwX0lOMV9PU1JfU0hJRlQsIDEsIDApLAorU09DX1NJTkdMRSgiSU4yIEhpZ2ggUGVyZm9ybWFuY2UgU3dpdGNoIiwgV001MTAwX0lOMkxfQ09OVFJPTCwKKwkgICBXTTUxMDBfSU4yX09TUl9TSElGVCwgMSwgMCksCitTT0NfU0lOR0xFKCJJTjMgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTUxMDBfSU4zTF9DT05UUk9MLAorCSAgIFdNNTEwMF9JTjNfT1NSX1NISUZULCAxLCAwKSwKK1NPQ19TSU5HTEUoIklONCBIaWdoIFBlcmZvcm1hbmNlIFN3aXRjaCIsIFdNNTEwMF9JTjRMX0NPTlRST0wsCisJICAgV001MTAwX0lONF9PU1JfU0hJRlQsIDEsIDApLAorCisvKiBPbmx5IGFwcGxpY2FibGUgZm9yIGFuYWxvZ3VlIGlucHV0cyAqLworU09DX0RPVUJMRV9SX1RMVigiSU4xIFZvbHVtZSIsIFdNNTEwMF9JTjFMX0NPTlRST0wsIFdNNTEwMF9JTjFSX0NPTlRST0wsCisJCSBXTTUxMDBfSU4xTF9QR0FfVk9MX1NISUZULCA5NCwgMCwgaW5fdGx2KSwKK1NPQ19ET1VCTEVfUl9UTFYoIklOMiBWb2x1bWUiLCBXTTUxMDBfSU4yTF9DT05UUk9MLCBXTTUxMDBfSU4yUl9DT05UUk9MLAorCQkgV001MTAwX0lOMkxfUEdBX1ZPTF9TSElGVCwgOTQsIDAsIGluX3RsdiksCitTT0NfRE9VQkxFX1JfVExWKCJJTjMgVm9sdW1lIiwgV001MTAwX0lOM0xfQ09OVFJPTCwgV001MTAwX0lOM1JfQ09OVFJPTCwKKwkJIFdNNTEwMF9JTjNMX1BHQV9WT0xfU0hJRlQsIDk0LCAwLCBpbl90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSU40IFZvbHVtZSIsIFdNNTEwMF9JTjRMX0NPTlRST0wsIFdNNTEwMF9JTjRSX0NPTlRST0wsCisJCSBXTTUxMDBfSU40TF9QR0FfVk9MX1NISUZULCA5NCwgMCwgaW5fdGx2KSwKKworU09DX0RPVUJMRV9SX1RMVigiSU4xIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8xTCwKKwkJIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMVIsIFdNNTEwMF9JTjFMX1ZPTF9TSElGVCwgMTkxLAorCQkgMCwgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSU4yIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8yTCwKKwkJIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMlIsIFdNNTEwMF9JTjJMX1ZPTF9TSElGVCwgMTkxLAorCQkgMCwgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSU4zIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8zTCwKKwkJIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfM1IsIFdNNTEwMF9JTjNMX1ZPTF9TSElGVCwgMTkxLAorCQkgMCwgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSU40IERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV80TCwKKwkJIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfNFIsIFdNNTEwMF9JTjRMX1ZPTF9TSElGVCwgMTkxLAorCQkgMCwgZGlnaXRhbF90bHYpLAorCitTT0NfRE9VQkxFX1IoIklOMSBTd2l0Y2giLCBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzFMLAorCSAgICAgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8xUiwgV001MTAwX0lOMUxfTVVURV9TSElGVCwgMSwgMSksCitTT0NfRE9VQkxFX1IoIklOMiBTd2l0Y2giLCBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzJMLAorCSAgICAgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8yUiwgV001MTAwX0lOMkxfTVVURV9TSElGVCwgMSwgMSksCitTT0NfRE9VQkxFX1IoIklOMyBTd2l0Y2giLCBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzNMLAorCSAgICAgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8zUiwgV001MTAwX0lOM0xfTVVURV9TSElGVCwgMSwgMSksCitTT0NfRE9VQkxFX1IoIklONCBTd2l0Y2giLCBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzRMLAorCSAgICAgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV80UiwgV001MTAwX0lONExfTVVURV9TSElGVCwgMSwgMSksCisKK1NPQ19TSU5HTEUoIkhQT1VUMSBIaWdoIFBlcmZvcm1hbmNlIFN3aXRjaCIsIFdNNTEwMF9PVVRfVk9MVU1FXzFMLAorCSAgIFdNNTEwMF9PVVQxX09TUl9TSElGVCwgMSwgMCksCitTT0NfU0lOR0xFKCJIUE9VVDIgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTUxMDBfT1VUX1ZPTFVNRV8yTCwKKwkgICBXTTUxMDBfT1VUMl9PU1JfU0hJRlQsIDEsIDApLAorU09DX1NJTkdMRSgiSFBPVVQzIEhpZ2ggUGVyZm9ybWFuY2UgU3dpdGNoIiwgV001MTAwX09VVF9WT0xVTUVfM0wsCisJICAgV001MTAwX09VVDNfT1NSX1NISUZULCAxLCAwKSwKK1NPQ19TSU5HTEUoIlNQS09VVCBIaWdoIFBlcmZvcm1hbmNlIFN3aXRjaCIsIFdNNTEwMF9PVVRfVk9MVU1FXzRMLAorCSAgIFdNNTEwMF9PVVQ0X09TUl9TSElGVCwgMSwgMCksCitTT0NfU0lOR0xFKCJTUEtEQVQxIEhpZ2ggUGVyZm9ybWFuY2UgU3dpdGNoIiwgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfNUwsCisJICAgV001MTAwX09VVDVfT1NSX1NISUZULCAxLCAwKSwKK1NPQ19TSU5HTEUoIlNQS0RBVDIgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF82TCwKKwkgICBXTTUxMDBfT1VUNl9PU1JfU0hJRlQsIDEsIDApLAorCitTT0NfRE9VQkxFX1JfVExWKCJIUE9VVDEgRGlnaXRhbCBWb2x1bWUiLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzFMLAorCQkgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8xUiwgV001MTAwX09VVDFMX1ZPTF9TSElGVCwgMTU5LCAwLAorCQkgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSFBPVVQyIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8yTCwKKwkJIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfMlIsIFdNNTEwMF9PVVQyTF9WT0xfU0hJRlQsIDE1OSwgMCwKKwkJIGRpZ2l0YWxfdGx2KSwKK1NPQ19ET1VCTEVfUl9UTFYoIkhQT1VUMyBEaWdpdGFsIFZvbHVtZSIsIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfM0wsCisJCSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzNSLCBXTTUxMDBfT1VUM0xfVk9MX1NISUZULCAxNTksIDAsCisJCSBkaWdpdGFsX3RsdiksCitTT0NfRE9VQkxFX1JfVExWKCJTUEtPVVQgRGlnaXRhbCBWb2x1bWUiLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzRMLAorCQkgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV80UiwgV001MTAwX09VVDRMX1ZPTF9TSElGVCwgMTU5LCAwLAorCQkgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiU1BLREFUMSBEaWdpdGFsIFZvbHVtZSIsIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNUwsCisJCSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzVSLCBXTTUxMDBfT1VUNUxfVk9MX1NISUZULCAxNTksIDAsCisJCSBkaWdpdGFsX3RsdiksCitTT0NfRE9VQkxFX1JfVExWKCJTUEtEQVQyIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV82TCwKKwkJIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNlIsIFdNNTEwMF9PVVQ2TF9WT0xfU0hJRlQsIDE1OSwgMCwKKwkJIGRpZ2l0YWxfdGx2KSwKKworU09DX0RPVUJMRV9SKCJIUE9VVDEgRGlnaXRhbCBTd2l0Y2giLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzFMLAorCSAgICAgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8xUiwgV001MTAwX09VVDFMX01VVEVfU0hJRlQsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJIUE9VVDIgRGlnaXRhbCBTd2l0Y2giLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzJMLAorCSAgICAgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8yUiwgV001MTAwX09VVDJMX01VVEVfU0hJRlQsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJIUE9VVDMgRGlnaXRhbCBTd2l0Y2giLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzNMLAorCSAgICAgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8zUiwgV001MTAwX09VVDNMX01VVEVfU0hJRlQsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJTUEtPVVQgRGlnaXRhbCBTd2l0Y2giLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzRMLAorCSAgICAgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV80UiwgV001MTAwX09VVDRMX01VVEVfU0hJRlQsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJTUEtEQVQxIERpZ2l0YWwgU3dpdGNoIiwgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV81TCwKKwkgICAgIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNVIsIFdNNTEwMF9PVVQ1TF9NVVRFX1NISUZULCAxLCAxKSwKK1NPQ19ET1VCTEVfUigiU1BLREFUMiBEaWdpdGFsIFN3aXRjaCIsIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNkwsCisJICAgICBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzZSLCBXTTUxMDBfT1VUNkxfTVVURV9TSElGVCwgMSwgMSksCisKKy8qIEZJWE1FOiBPbmx5IHZhbGlkIGZyb20gLTEyZEIgdG8gMGRCICg1Mi02NCkgKi8KK1NPQ19ET1VCTEVfUl9UTFYoIkhQT1VUMSBWb2x1bWUiLCBXTTUxMDBfT1VUX1ZPTFVNRV8xTCwgV001MTAwX09VVF9WT0xVTUVfMVIsCisJCSBXTTUxMDBfT1VUMUxfUEdBX1ZPTF9TSElGVCwgNjQsIDAsIG91dF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSFBPVVQyIFZvbHVtZSIsIFdNNTEwMF9PVVRfVk9MVU1FXzJMLCBXTTUxMDBfT1VUX1ZPTFVNRV8yUiwKKwkJIFdNNTEwMF9PVVQyTF9QR0FfVk9MX1NISUZULCA2NCwgMCwgb3V0X3RsdiksCitTT0NfRE9VQkxFX1JfVExWKCJIUE9VVDMgVm9sdW1lIiwgV001MTAwX09VVF9WT0xVTUVfM0wsIFdNNTEwMF9PVVRfVk9MVU1FXzNSLAorCQkgV001MTAwX09VVDJMX1BHQV9WT0xfU0hJRlQsIDY0LCAwLCBvdXRfdGx2KSwKKworU09DX0RPVUJMRSgiU1BLREFUMSBTd2l0Y2giLCBXTTUxMDBfUERNX1NQSzFfQ1RSTF8xLCBXTTUxMDBfU1BLMUxfTVVURV9TSElGVCwKKwkgICBXTTUxMDBfU1BLMVJfTVVURV9TSElGVCwgMSwgMSksCitTT0NfRE9VQkxFKCJTUEtEQVQyIFN3aXRjaCIsIFdNNTEwMF9QRE1fU1BLMl9DVFJMXzEsIFdNNTEwMF9TUEsyTF9NVVRFX1NISUZULAorCSAgIFdNNTEwMF9TUEsyUl9NVVRFX1NISUZULCAxLCAxKSwKKworU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDEgVm9sdW1lIiwgV001MTAwX0VRMV8xLCBXTTUxMDBfRVExX0IxX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDIgVm9sdW1lIiwgV001MTAwX0VRMV8xLCBXTTUxMDBfRVExX0IyX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDMgVm9sdW1lIiwgV001MTAwX0VRMV8xLCBXTTUxMDBfRVExX0IzX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDQgVm9sdW1lIiwgV001MTAwX0VRMV8yLCBXTTUxMDBfRVExX0I0X0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDUgVm9sdW1lIiwgV001MTAwX0VRMV8yLCBXTTUxMDBfRVExX0I1X0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgMSBWb2x1bWUiLCBXTTUxMDBfRVEyXzEsIFdNNTEwMF9FUTJfQjFfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgMiBWb2x1bWUiLCBXTTUxMDBfRVEyXzEsIFdNNTEwMF9FUTJfQjJfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgMyBWb2x1bWUiLCBXTTUxMDBfRVEyXzEsIFdNNTEwMF9FUTJfQjNfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgNCBWb2x1bWUiLCBXTTUxMDBfRVEyXzIsIFdNNTEwMF9FUTJfQjRfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgNSBWb2x1bWUiLCBXTTUxMDBfRVEyXzIsIFdNNTEwMF9FUTJfQjVfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCisKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCAxIFZvbHVtZSIsIFdNNTEwMF9FUTFfMSwgV001MTAwX0VRM19CMV9HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCAyIFZvbHVtZSIsIFdNNTEwMF9FUTNfMSwgV001MTAwX0VRM19CMl9HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCAzIFZvbHVtZSIsIFdNNTEwMF9FUTNfMSwgV001MTAwX0VRM19CM19HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCA0IFZvbHVtZSIsIFdNNTEwMF9FUTNfMiwgV001MTAwX0VRM19CNF9HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCA1IFZvbHVtZSIsIFdNNTEwMF9FUTNfMiwgV001MTAwX0VRM19CNV9HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKKworU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDEgVm9sdW1lIiwgV001MTAwX0VRNF8xLCBXTTUxMDBfRVE0X0IxX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDIgVm9sdW1lIiwgV001MTAwX0VRNF8xLCBXTTUxMDBfRVE0X0IyX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDMgVm9sdW1lIiwgV001MTAwX0VRNF8xLCBXTTUxMDBfRVE0X0IzX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDQgVm9sdW1lIiwgV001MTAwX0VRNF8yLCBXTTUxMDBfRVE0X0I0X0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDUgVm9sdW1lIiwgV001MTAwX0VRNF8yLCBXTTUxMDBfRVE0X0I1X0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorCitTT0NfRU5VTSgiTEhQRjEgTW9kZSIsIHdtNTEwMF9saHBmMV9tb2RlKSwKK1NPQ19FTlVNKCJMSFBGMiBNb2RlIiwgd201MTAwX2xocGYyX21vZGUpLAorU09DX0VOVU0oIkxIUEYzIE1vZGUiLCB3bTUxMDBfbGhwZjNfbW9kZSksCitTT0NfRU5VTSgiTEhQRjQgTW9kZSIsIHdtNTEwMF9saHBmNF9tb2RlKSwKKworV001MTAwX01JWEVSX0NPTlRST0xTKCJIUE9VVDFMIiwgV001MTAwX09VVDFMTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiSFBPVVQxUiIsIFdNNTEwMF9PVVQxUk1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkhQT1VUMkwiLCBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJIUE9VVDJSIiwgV001MTAwX09VVDJSTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiSFBPVVQzTCIsIFdNNTEwMF9PVVQzTE1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkhQT1VUM1IiLCBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfMV9TT1VSQ0UpLAorCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIlNQS09VVEwiLCBXTTUxMDBfT1VUNExNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJTUEtPVVRSIiwgV001MTAwX09VVDRSTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiU1BLREFUMUwiLCBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJTUEtEQVQxUiIsIFdNNTEwMF9PVVQ1Uk1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIlNQS0RBVDJMIiwgV001MTAwX09VVDZMTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiU1BLREFUMlIiLCBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfMV9TT1VSQ0UpLAorCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIlBXTTEiLCBXTTUxMDBfUFdNMU1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIlBXTTIiLCBXTTUxMDBfUFdNMk1JWF9JTlBVVF8xX1NPVVJDRSksCisKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYMSIsIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYMiIsIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYMyIsIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYNCIsIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYNSIsIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYNiIsIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYNyIsIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYOCIsIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzFfU09VUkNFKSwKKworV001MTAwX01JWEVSX0NPTlRST0xTKCJBSUYyVFgxIiwgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJBSUYyVFgyIiwgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMV9TT1VSQ0UpLAorCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkFJRjNUWDEiLCBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkFJRjNUWDIiLCBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8xX1NPVVJDRSksCisKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiRVExIiwgV001MTAwX0VRMU1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkVRMiIsIFdNNTEwMF9FUTJNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJFUTMiLCBXTTUxMDBfRVEzTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiRVE0IiwgV001MTAwX0VRNE1JWF9JTlBVVF8xX1NPVVJDRSksCisKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiRFJDMUwiLCBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJEUkMxUiIsIFdNNTEwMF9EUkMxUk1JWF9JTlBVVF8xX1NPVVJDRSksCisKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiTEhQRjEiLCBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJMSFBGMiIsIFdNNTEwMF9IUExQMk1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkxIUEYzIiwgV001MTAwX0hQTFAzTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiTEhQRjQiLCBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9TT1VSQ0UpLAorfTsKKworc3RhdGljIHZvaWQgd201MTAwX3NlcV9ub3RpZmllcihzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCisJCQkJZW51bSBzbmRfc29jX2RhcG1fdHlwZSBldmVudCwgaW50IHN1YnNlcSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb250YWluZXJfb2YoZGFwbSwKKwkJCQkJCSAgIHN0cnVjdCBzbmRfc29jX2NvZGVjLCBkYXBtKTsKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXUxNiB2YWwsIGV4cGVjdCwgaTsKKworCS8qIFdhaXQgZm9yIHRoZSBvdXRwdXRzIHRvIGZsYWcgdGhlbXNlbHZlcyBhcyBlbmFibGVkICovCisJaWYgKHdtNTEwMC0+b3V0X2VuYVswXSkgeworCQlleHBlY3QgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9DSEFOTkVMX0VOQUJMRVNfMSk7CisJCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworCQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfT1VUUFVUX1NUQVRVU18xKTsKKwkJCWlmICh2YWwgPT0gZXhwZWN0KSB7CisJCQkJd201MTAwLT5vdXRfZW5hWzBdID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gMjAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yIE9VVFBVVDEgJXhcbiIsCisJCQkJZXhwZWN0KTsKKwkJfQorCX0KKworCWlmICh3bTUxMDAtPm91dF9lbmFbMV0pIHsKKwkJZXhwZWN0ID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfT1VUUFVUX0VOQUJMRVNfMik7CisJCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworCQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfT1VUUFVUX1NUQVRVU18yKTsKKwkJCWlmICh2YWwgPT0gZXhwZWN0KSB7CisJCQkJd201MTAwLT5vdXRfZW5hWzFdID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gMjAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yIE9VVFBVVDIgJXhcbiIsCisJCQkJZXhwZWN0KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB3bTUxMDBfb3V0X2V2KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEody0+Y29kZWMpOworCisJc3dpdGNoICh3LT5yZWcpIHsKKwljYXNlIFdNNTEwMF9DSEFOTkVMX0VOQUJMRVNfMToKKwkJd201MTAwLT5vdXRfZW5hWzBdID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBXTTUxMDBfT1VUUFVUX0VOQUJMRVNfMjoKKwkJd201MTAwLT5vdXRfZW5hWzBdID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd201MTAwX2NwX2V2KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQlpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUod201MTAwLT5jcHZkZCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBDUFZERDogJWRcbiIsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIHJldDsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZV9kZWZlcnJlZCh3bTUxMDAtPmNwdmRkLCAyMCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGRpc2FibGUgQ1BWREQ6ICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiByZXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IHdtNTEwMF9kYnZkZF9ldihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCSAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCB3bTUxMDBfcHJpdiAqd201MTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHctPnNoaWZ0KSB7CisJY2FzZSAyOgorCQlyZWd1bGF0b3IgPSB3bTUxMDAtPmRidmRkMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlyZWd1bGF0b3IgPSB3bTUxMDAtPmRidmRkMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHJlZ3VsYXRvcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBEQlZERCVkOiAlZFxuIiwKKwkJCQl3LT5zaGlmdCwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIHJldDsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZShyZWd1bGF0b3IpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgREJWREQlZDogJWRcbiIsCisJCQkJdy0+c2hpZnQsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiByZXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCB3bTUxMDBfbG9nX3N0YXR1czMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgdmFsKQoreworCWlmICh2YWwgJiBXTTUxMDBfU1BLX1NIVVRET1dOX1dBUk5fRUlOVCkKKwkJZGV2X2NyaXQoY29kZWMtPmRldiwgIlNwZWFrZXIgc2h1dGRvd24gd2FybmluZ1xuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9TUEtfU0hVVERPV05fRUlOVCkKKwkJZGV2X2NyaXQoY29kZWMtPmRldiwgIlNwZWFrZXIgc2h1dGRvd25cbiIpOworCWlmICh2YWwgJiBXTTUxMDBfQ0xLR0VOX0VSUl9FSU5UKQorCQlkZXZfY3JpdChjb2RlYy0+ZGV2LCAiU1lTQ0xLIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9DTEtHRU5fRVJSX0FTWU5DX0VJTlQpCisJCWRldl9jcml0KGNvZGVjLT5kZXYsICJBU1lOQ0NMSyB1bmRlcmNsb2NrZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCB3bTUxMDBfbG9nX3N0YXR1czQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgdmFsKQoreworCWlmICh2YWwgJiBXTTUxMDBfQUlGM19FUlJfRUlOVCkKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiQUlGMyBjb25maWd1cmF0aW9uIGVycm9yXG4iKTsKKwlpZiAodmFsICYgV001MTAwX0FJRjJfRVJSX0VJTlQpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIkFJRjIgY29uZmlndXJhdGlvbiBlcnJvclxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BSUYxX0VSUl9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBSUYxIGNvbmZpZ3VyYXRpb24gZXJyb3JcbiIpOworCWlmICh2YWwgJiBXTTUxMDBfQ1RSTElGX0VSUl9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDb250cm9sIGludGVyZmFjZSBlcnJvclxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9JU1JDMl9VTkRFUkNMT0NLRURfRUlOVCkKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSVNSQzIgdW5kZXJjbG9ja2VkXG4iKTsKKwlpZiAodmFsICYgV001MTAwX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJU1JDMSB1bmRlcmNsb2NrZWRcbiIpOworCWlmICh2YWwgJiBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlQpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZYIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BSUYzX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBSUYzIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBSUYyIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBSUYxIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BU1JDX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBU1JDIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX0VJTlQpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIkRBQyB1bmRlcmNsb2NrZWRcbiIpOworCWlmICh2YWwgJiBXTTUxMDBfQURDX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBREMgdW5kZXJjbG9ja2VkXG4iKTsKKwlpZiAodmFsICYgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJNaXhlciB1bmRlcmNsb2NrZWRcbiIpOworfQorCitzdGF0aWMgaW50IHdtNTEwMF9wb3N0X2V2KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9JTlRFUlJVUFRfUkFXX1NUQVRVU18zKTsKKwlyZXQgJj0gV001MTAwX1NQS19TSFVURE9XTl9XQVJOX1NUUyB8CisJCVdNNTEwMF9TUEtfU0hVVERPV05fU1RTIHwgV001MTAwX0NMS0dFTl9FUlJfU1RTIHwKKwkJV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTOworCXdtNTEwMF9sb2dfc3RhdHVzMyhjb2RlYywgcmV0KTsKKworCXJldCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV001MTAwX0lOVEVSUlVQVF9SQVdfU1RBVFVTXzQpOworCXdtNTEwMF9sb2dfc3RhdHVzNChjb2RlYywgcmV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd201MTAwX2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX1NVUFBMWSgiU1lTQ0xLIiwgV001MTAwX0NMT0NLSU5HXzMsIFdNNTEwMF9TWVNDTEtfRU5BX1NISUZULCAwLAorCQkgICAgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJBU1lOQ0NMSyIsIFdNNTEwMF9DTE9DS0lOR182LCBXTTUxMDBfQVNZTkNfQ0xLX0VOQV9TSElGVCwKKwkJICAgIDAsIE5VTEwsIDApLAorCitTTkRfU09DX0RBUE1fU1VQUExZKCJDUDEiLCBXTTUxMDBfSFBfQ0hBUkdFX1BVTVBfMSwgV001MTAwX0NQMV9FTkFfU0hJRlQsIDAsCisJCSAgICB3bTUxMDBfY3BfZXYsCisJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJDUDIiLCBXTTUxMDBfTUlDX0NIQVJHRV9QVU1QXzEsIFdNNTEwMF9DUDJfRU5BX1NISUZULCAwLAorCQkgICAgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJDUDIgQWN0aXZlIiwgV001MTAwX01JQ19DSEFSR0VfUFVNUF8xLAorCQkgICAgV001MTAwX0NQMl9CWVBBU1NfU0hJRlQsIDEsIHdtNTEwMF9jcF9ldiwKKwkJICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKK1NORF9TT0NfREFQTV9TVVBQTFkoIkRCVkREMiIsIFNORF9TT0NfTk9QTSwgMiwgMCwgd201MTAwX2RidmRkX2V2LAorCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiREJWREQzIiwgU05EX1NPQ19OT1BNLCAzLCAwLCB3bTUxMDBfZGJ2ZGRfZXYsCisJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKK1NORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMxIiwgV001MTAwX01JQ19CSUFTX0NUUkxfMSwgV001MTAwX01JQ0IxX0VOQV9TSElGVCwKKwkJICAgIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUzIiLCBXTTUxMDBfTUlDX0JJQVNfQ1RSTF8yLCBXTTUxMDBfTUlDQjJfRU5BX1NISUZULAorCQkgICAgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTMyIsIFdNNTEwMF9NSUNfQklBU19DVFJMXzMsIFdNNTEwMF9NSUNCM19FTkFfU0hJRlQsCisJCSAgICAwLCBOVUxMLCAwKSwKKworU05EX1NPQ19EQVBNX0lOUFVUKCJJTjFMIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIklOMVIiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiSU4yTCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJJTjJSIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIklOM0wiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiSU4zUiIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJJTjRMIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIklONFIiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiVE9ORSIpLAorCitTTkRfU09DX0RBUE1fUEdBX0UoIklOMUwgUEdBIiwgV001MTAwX0lOUFVUX0VOQUJMRVMsIFdNNTEwMF9JTjFMX0VOQV9TSElGVCwgMCwKKwkJICAgTlVMTCwgMCwgd201MTAwX291dF9ldiwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKK1NORF9TT0NfREFQTV9QR0FfRSgiSU4xUiBQR0EiLCBXTTUxMDBfSU5QVVRfRU5BQkxFUywgV001MTAwX0lOMVJfRU5BX1NISUZULCAwLAorCQkgICBOVUxMLCAwLCB3bTUxMDBfb3V0X2V2LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorU05EX1NPQ19EQVBNX1BHQV9FKCJJTjJMIFBHQSIsIFdNNTEwMF9JTlBVVF9FTkFCTEVTLCBXTTUxMDBfSU4yTF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIklOMlIgUEdBIiwgV001MTAwX0lOUFVUX0VOQUJMRVMsIFdNNTEwMF9JTjJSX0VOQV9TSElGVCwgMCwKKwkJICAgTlVMTCwgMCwgd201MTAwX291dF9ldiwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKK1NORF9TT0NfREFQTV9QR0FfRSgiSU4zTCBQR0EiLCBXTTUxMDBfSU5QVVRfRU5BQkxFUywgV001MTAwX0lOM0xfRU5BX1NISUZULCAwLAorCQkgICBOVUxMLCAwLCB3bTUxMDBfb3V0X2V2LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorU05EX1NPQ19EQVBNX1BHQV9FKCJJTjNSIFBHQSIsIFdNNTEwMF9JTlBVVF9FTkFCTEVTLCBXTTUxMDBfSU4zUl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIklONEwgUEdBIiwgV001MTAwX0lOUFVUX0VOQUJMRVMsIFdNNTEwMF9JTjRMX0VOQV9TSElGVCwgMCwKKwkJICAgTlVMTCwgMCwgd201MTAwX291dF9ldiwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKK1NORF9TT0NfREFQTV9QR0FfRSgiSU40UiBQR0EiLCBXTTUxMDBfSU5QVVRfRU5BQkxFUywgV001MTAwX0lONFJfRU5BX1NISUZULCAwLAorCQkgICBOVUxMLCAwLCB3bTUxMDBfb3V0X2V2LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCitTTkRfU09DX0RBUE1fUEdBKCJUb25lIEdlbmVyYXRvciAxIiwgV001MTAwX1RPTkVfR0VORVJBVE9SXzEsCisJCSBXTTUxMDBfVE9ORTFfRU5BX1NISUZULCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIlRvbmUgR2VuZXJhdG9yIDIiLCBXTTUxMDBfVE9ORV9HRU5FUkFUT1JfMSwKKwkJIFdNNTEwMF9UT05FMl9FTkFfU0hJRlQsIDAsIE5VTEwsIDApLAorCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlgxIiwgIkFJRjEgUGxheWJhY2siLCAwLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlgxX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlgyIiwgIkFJRjEgUGxheWJhY2siLCAxLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlgyX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlgzIiwgIkFJRjEgUGxheWJhY2siLCAyLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlgzX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg0IiwgIkFJRjEgUGxheWJhY2siLCAzLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg0X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg1IiwgIkFJRjEgUGxheWJhY2siLCA0LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg1X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg2IiwgIkFJRjEgUGxheWJhY2siLCA1LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg2X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg3IiwgIkFJRjEgUGxheWJhY2siLCA2LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg3X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg4IiwgIkFJRjEgUGxheWJhY2siLCA3LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg4X0VOQV9TSElGVCwgMCksCisKK1NORF9TT0NfREFQTV9BSUZfSU4oIkFJRjJSWDEiLCAiQUlGMiBQbGF5YmFjayIsIDAsCisJCSAgICBXTTUxMDBfQVVESU9fSUZfMl8yNywgV001MTAwX0FJRjJSWDFfRU5BX1NISUZULCAwKSwKK1NORF9TT0NfREFQTV9BSUZfSU4oIkFJRjJSWDIiLCAiQUlGMiBQbGF5YmFjayIsIDEsCisJCSAgICBXTTUxMDBfQVVESU9fSUZfMl8yNywgV001MTAwX0FJRjJSWDJfRU5BX1NISUZULCAwKSwKKworU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGM1JYMSIsICJBSUYzIFBsYXliYWNrIiwgMCwKKwkJICAgIFdNNTEwMF9BVURJT19JRl8zXzI3LCBXTTUxMDBfQUlGM1JYMV9FTkFfU0hJRlQsIDApLAorU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGM1JYMiIsICJBSUYzIFBsYXliYWNrIiwgMSwKKwkJICAgIFdNNTEwMF9BVURJT19JRl8zXzI3LCBXTTUxMDBfQUlGM1JYMl9FTkFfU0hJRlQsIDApLAorCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYMSIsICJBSUYxIENhcHR1cmUiLCAwLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFgxX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYMiIsICJBSUYxIENhcHR1cmUiLCAxLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFgyX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYMyIsICJBSUYxIENhcHR1cmUiLCAyLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFgzX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYNCIsICJBSUYxIENhcHR1cmUiLCAzLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg0X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYNSIsICJBSUYxIENhcHR1cmUiLCA0LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg1X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYNiIsICJBSUYxIENhcHR1cmUiLCA1LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg2X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYNyIsICJBSUYxIENhcHR1cmUiLCA2LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg3X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYOCIsICJBSUYxIENhcHR1cmUiLCA3LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg4X0VOQV9TSElGVCwgMCksCisKK1NORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYyVFgxIiwgIkFJRjIgQ2FwdHVyZSIsIDAsCisJCSAgICBXTTUxMDBfQVVESU9fSUZfMl8yNiwgV001MTAwX0FJRjJUWDFfRU5BX1NISUZULCAwKSwKK1NORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYyVFgyIiwgIkFJRjIgQ2FwdHVyZSIsIDEsCisJCSAgICBXTTUxMDBfQVVESU9fSUZfMl8yNiwgV001MTAwX0FJRjJUWDJfRU5BX1NISUZULCAwKSwKKworU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjNUWDEiLCAiQUlGMyBDYXB0dXJlIiwgMCwKKwkJICAgIFdNNTEwMF9BVURJT19JRl8zXzI2LCBXTTUxMDBfQUlGM1RYMV9FTkFfU0hJRlQsIDApLAorU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjNUWDIiLCAiQUlGMyBDYXB0dXJlIiwgMSwKKwkJICAgIFdNNTEwMF9BVURJT19JRl8zXzI2LCBXTTUxMDBfQUlGM1RYMl9FTkFfU0hJRlQsIDApLAorCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDZMIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ2TF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDZSIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ2Ul9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDVMIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ1TF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDVSIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ1Ul9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDRMIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ0TF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDRSIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ0Ul9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDNMIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAzTF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDNSIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAzUl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDJMIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAyTF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDJSIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAyUl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDFMIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAxTF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDFSIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAxUl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIlBXTTEgRHJpdmVyIiwgV001MTAwX1BXTV9EUklWRV8xLCBXTTUxMDBfUFdNMV9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIlBXTTIgRHJpdmVyIiwgV001MTAwX1BXTV9EUklWRV8xLCBXTTUxMDBfUFdNMl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKK1NORF9TT0NfREFQTV9QR0EoIkVRMSIsIFdNNTEwMF9FUTFfMSwgV001MTAwX0VRMV9FTkFfU0hJRlQsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiRVEyIiwgV001MTAwX0VRMl8xLCBXTTUxMDBfRVEyX0VOQV9TSElGVCwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJFUTMiLCBXTTUxMDBfRVEzXzEsIFdNNTEwMF9FUTNfRU5BX1NISUZULCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIkVRNCIsIFdNNTEwMF9FUTRfMSwgV001MTAwX0VRNF9FTkFfU0hJRlQsIDAsIE5VTEwsIDApLAorCitTTkRfU09DX0RBUE1fUEdBKCJEUkMxTCIsIFdNNTEwMF9EUkMxX0NUUkwxLCBXTTUxMDBfRFJDTF9FTkFfU0hJRlQsIDAsCisJCSBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIkRSQzFSIiwgV001MTAwX0RSQzFfQ1RSTDEsIFdNNTEwMF9EUkNSX0VOQV9TSElGVCwgMCwKKwkJIE5VTEwsIDApLAorCitTTkRfU09DX0RBUE1fUEdBKCJMSFBGMSIsIFdNNTEwMF9IUExQRjFfMSwgV001MTAwX0xIUEYxX0VOQV9TSElGVCwgMCwKKwkJIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiTEhQRjIiLCBXTTUxMDBfSFBMUEYyXzEsIFdNNTEwMF9MSFBGMl9FTkFfU0hJRlQsIDAsCisJCSBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIkxIUEYzIiwgV001MTAwX0hQTFBGM18xLCBXTTUxMDBfTEhQRjNfRU5BX1NISUZULCAwLAorCQkgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJMSFBGNCIsIFdNNTEwMF9IUExQRjRfMSwgV001MTAwX0xIUEY0X0VOQV9TSElGVCwgMCwKKwkJIE5VTEwsIDApLAorCitXTTUxMDBfTUlYRVJfV0lER0VUUyhFUTEsICJFUTEiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEVRMiwgIkVRMiIpLAorV001MTAwX01JWEVSX1dJREdFVFMoRVEzLCAiRVEzIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhFUTQsICJFUTQiKSwKKworV001MTAwX01JWEVSX1dJREdFVFMoRFJDMUwsICJEUkMxTCIpLAorV001MTAwX01JWEVSX1dJREdFVFMoRFJDMVIsICJEUkMxUiIpLAorCitXTTUxMDBfTUlYRVJfV0lER0VUUyhMSFBGMSwgIkxIUEYxIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhMSFBGMiwgIkxIUEYyIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhMSFBGMywgIkxIUEYzIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhMSFBGNCwgIkxIUEY0IiksCisKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEFJRjFUWDEsICJBSUYxVFgxIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhBSUYxVFgyLCAiQUlGMVRYMiIpLAorV001MTAwX01JWEVSX1dJREdFVFMoQUlGMVRYMywgIkFJRjFUWDMiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEFJRjFUWDQsICJBSUYxVFg0IiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhBSUYxVFg1LCAiQUlGMVRYNSIpLAorV001MTAwX01JWEVSX1dJREdFVFMoQUlGMVRYNiwgIkFJRjFUWDYiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEFJRjFUWDcsICJBSUYxVFg3IiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhBSUYxVFg4LCAiQUlGMVRYOCIpLAorCitXTTUxMDBfTUlYRVJfV0lER0VUUyhBSUYyVFgxLCAiQUlGMlRYMSIpLAorV001MTAwX01JWEVSX1dJREdFVFMoQUlGMlRYMiwgIkFJRjJUWDIiKSwKKworV001MTAwX01JWEVSX1dJREdFVFMoQUlGM1RYMSwgIkFJRjNUWDEiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEFJRjNUWDIsICJBSUYzVFgyIiksCisKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEhQT1VUMUwsICJIUE9VVDFMIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhIUE9VVDFSLCAiSFBPVVQxUiIpLAorV001MTAwX01JWEVSX1dJREdFVFMoSFBPVVQyTCwgIkhQT1VUMkwiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEhQT1VUMlIsICJIUE9VVDJSIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhIUE9VVDNMLCAiSFBPVVQzTCIpLAorV001MTAwX01JWEVSX1dJREdFVFMoSFBPVVQzUiwgIkhQT1VUM1IiKSwKKworV001MTAwX01JWEVSX1dJREdFVFMoU1BLT1VUTCwgIlNQS09VVEwiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKFNQS09VVFIsICJTUEtPVVRSIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhTUEtEQVQxTCwgIlNQS0RBVDFMIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhTUEtEQVQxUiwgIlNQS0RBVDFSIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhTUEtEQVQyTCwgIlNQS0RBVDJMIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhTUEtEQVQyUiwgIlNQS0RBVDJSIiksCisKK1dNNTEwMF9NSVhFUl9XSURHRVRTKFBXTTEsICJQV00xIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhQV00yLCAiUFdNMiIpLAorCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDFMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDFSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDJMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDJSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDNMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDNSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtPVVRMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtPVVRSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtEQVQxIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtEQVQyIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJQV00xIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJQV00yIiksCit9OworCisvKiBXZSByZWdpc3RlciBhIF9QT1NUIGV2ZW50IGlmIHdlIGRvbid0IGhhdmUgSVJRIHN1cHBvcnQgc28gd2UgY2FuCisgKiBsb29rIGF0IHRoZSBlcnJvciBzdGF0dXMgZnJvbSB0aGUgQ09ERUMgLSBpZiB3ZSd2ZSBnb3QgdGhlIElSUQorICogaG9va2VkIHVwIHRoZW4gd2Ugd2lsbCBnZXQgcHJvbXB0ZWQgdG8gbG9vayBieSBhbiBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTUxMDBfZGFwbV93aWRnZXRzX25vaXJxW10gPSB7CitTTkRfU09DX0RBUE1fUE9TVCgiUG9zdCIsIHdtNTEwMF9wb3N0X2V2KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdtNTEwMF9kYXBtX3JvdXRlc1tdID0geworCXsgIklOMUwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOMVIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOMkwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOMlIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOM0wiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOM1IiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklONEwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklONFIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCisJeyAiT1VUMUwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIk9VVDFSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJPVVQyTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiT1VUMlIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIk9VVDNMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJPVVQzUiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiT1VUNEwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIk9VVDRSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJPVVQ1TCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiT1VUNVIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIk9VVDZMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJPVVQ2UiIsIE5VTEwsICJTWVNDTEsiIH0sCisKKwl7ICJBSUYxUlgxIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlgyIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlgzIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg0IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg1IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg2IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg3IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg4IiwgTlVMTCwgIlNZU0NMSyIgfSwKKworCXsgIkFJRjJSWDEiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFJRjJSWDEiLCBOVUxMLCAiREJWREQyIiB9LAorCXsgIkFJRjJSWDIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFJRjJSWDIiLCBOVUxMLCAiREJWREQyIiB9LAorCisJeyAiQUlGM1JYMSIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGM1JYMSIsIE5VTEwsICJEQlZERDMiIH0sCisJeyAiQUlGM1JYMiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGM1JYMiIsIE5VTEwsICJEQlZERDMiIH0sCisKKwl7ICJBSUYxVFgxIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFgyIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFgzIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg0IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg1IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg2IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg3IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg4IiwgTlVMTCwgIlNZU0NMSyIgfSwKKworCXsgIkFJRjJUWDEiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFJRjJUWDEiLCBOVUxMLCAiREJWREQyIiB9LAorCXsgIkFJRjJUWDIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFJRjJUWDIiLCBOVUxMLCAiREJWREQyIiB9LAorCisJeyAiQUlGM1RYMSIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGM1RYMSIsIE5VTEwsICJEQlZERDMiIH0sCisJeyAiQUlGM1RYMiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGM1RYMiIsIE5VTEwsICJEQlZERDMiIH0sCisKKwl7ICJNSUNCSUFTMSIsIE5VTEwsICJDUDIiIH0sCisJeyAiTUlDQklBUzIiLCBOVUxMLCAiQ1AyIiB9LAorCXsgIk1JQ0JJQVMzIiwgTlVMTCwgIkNQMiIgfSwKKworCXsgIklOMUwgUEdBIiwgTlVMTCwgIkNQMiIgfSwKKwl7ICJJTjFSIFBHQSIsIE5VTEwsICJDUDIiIH0sCisJeyAiSU4yTCBQR0EiLCBOVUxMLCAiQ1AyIiB9LAorCXsgIklOMlIgUEdBIiwgTlVMTCwgIkNQMiIgfSwKKwl7ICJJTjNMIFBHQSIsIE5VTEwsICJDUDIiIH0sCisJeyAiSU4zUiBQR0EiLCBOVUxMLCAiQ1AyIiB9LAorCXsgIklONEwgUEdBIiwgTlVMTCwgIkNQMiIgfSwKKwl7ICJJTjRSIFBHQSIsIE5VTEwsICJDUDIiIH0sCisKKwl7ICJJTjFMIFBHQSIsIE5VTEwsICJDUDIgQWN0aXZlIiB9LAorCXsgIklOMVIgUEdBIiwgTlVMTCwgIkNQMiBBY3RpdmUiIH0sCisJeyAiSU4yTCBQR0EiLCBOVUxMLCAiQ1AyIEFjdGl2ZSIgfSwKKwl7ICJJTjJSIFBHQSIsIE5VTEwsICJDUDIgQWN0aXZlIiB9LAorCXsgIklOM0wgUEdBIiwgTlVMTCwgIkNQMiBBY3RpdmUiIH0sCisJeyAiSU4zUiBQR0EiLCBOVUxMLCAiQ1AyIEFjdGl2ZSIgfSwKKwl7ICJJTjRMIFBHQSIsIE5VTEwsICJDUDIgQWN0aXZlIiB9LAorCXsgIklONFIgUEdBIiwgTlVMTCwgIkNQMiBBY3RpdmUiIH0sCisKKwl7ICJPVVQxTCIsIE5VTEwsICJDUDEiIH0sCisJeyAiT1VUMVIiLCBOVUxMLCAiQ1AxIiB9LAorCXsgIk9VVDJMIiwgTlVMTCwgIkNQMSIgfSwKKwl7ICJPVVQyUiIsIE5VTEwsICJDUDEiIH0sCisJeyAiT1VUM0wiLCBOVUxMLCAiQ1AxIiB9LAorCXsgIk9VVDNSIiwgTlVMTCwgIkNQMSIgfSwKKworCXsgIlRvbmUgR2VuZXJhdG9yIDEiLCBOVUxMLCAiVE9ORSIgfSwKKwl7ICJUb25lIEdlbmVyYXRvciAyIiwgTlVMTCwgIlRPTkUiIH0sCisKKwl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjFMIiB9LAorCXsgIklOMVIgUEdBIiwgTlVMTCwgIklOMVIiIH0sCisJeyAiSU4yTCBQR0EiLCBOVUxMLCAiSU4yTCIgfSwKKwl7ICJJTjJSIFBHQSIsIE5VTEwsICJJTjJSIiB9LAorCXsgIklOM0wgUEdBIiwgTlVMTCwgIklOM0wiIH0sCisJeyAiSU4zUiBQR0EiLCBOVUxMLCAiSU4zUiIgfSwKKwl7ICJJTjRMIFBHQSIsIE5VTEwsICJJTjRMIiB9LAorCXsgIklONFIgUEdBIiwgTlVMTCwgIklONFIiIH0sCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJPVVQxTCIsICJIUE9VVDFMIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiT1VUMVIiLCAiSFBPVVQxUiIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIk9VVDJMIiwgIkhQT1VUMkwiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJPVVQyUiIsICJIUE9VVDJSIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiT1VUM0wiLCAiSFBPVVQzTCIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIk9VVDNSIiwgIkhQT1VUM1IiKSwKKworCVdNNTEwMF9NSVhFUl9ST1VURVMoIk9VVDRMIiwgIlNQS09VVEwiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJPVVQ0UiIsICJTUEtPVVRSIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiT1VUNUwiLCAiU1BLREFUMUwiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJPVVQ1UiIsICJTUEtEQVQxUiIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIk9VVDZMIiwgIlNQS0RBVDJMIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiT1VUNlIiLCAiU1BLREFUMlIiKSwKKworCVdNNTEwMF9NSVhFUl9ST1VURVMoIlBXTTEgRHJpdmVyIiwgIlBXTTEiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJQV00yIERyaXZlciIsICJQV00yIiksCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFgxIiwgIkFJRjFUWDEiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFgyIiwgIkFJRjFUWDIiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFgzIiwgIkFJRjFUWDMiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg0IiwgIkFJRjFUWDQiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg1IiwgIkFJRjFUWDUiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg2IiwgIkFJRjFUWDYiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg3IiwgIkFJRjFUWDciKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg4IiwgIkFJRjFUWDgiKSwKKworCVdNNTEwMF9NSVhFUl9ST1VURVMoIkFJRjJUWDEiLCAiQUlGMlRYMSIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIkFJRjJUWDIiLCAiQUlGMlRYMiIpLAorCisJV001MTAwX01JWEVSX1JPVVRFUygiQUlGM1RYMSIsICJBSUYzVFgxIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiQUlGM1RYMiIsICJBSUYzVFgyIiksCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJFUTEiLCAiRVExIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiRVEyIiwgIkVRMiIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIkVRMyIsICJFUTMiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJFUTQiLCAiRVE0IiksCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJEUkMxTCIsICJEUkMxTCIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIkRSQzFSIiwgIkRSQzFSIiksCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJMSFBGMSIsICJMSFBGMSIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIkxIUEYyIiwgIkxIUEYyIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiTEhQRjMiLCAiTEhQRjMiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJMSFBGNCIsICJMSFBGNCIpLAorCisJeyAiSFBPVVQxTCIsIE5VTEwsICJPVVQxTCIgfSwKKwl7ICJIUE9VVDFSIiwgTlVMTCwgIk9VVDFSIiB9LAorCXsgIkhQT1VUMkwiLCBOVUxMLCAiT1VUMkwiIH0sCisJeyAiSFBPVVQyUiIsIE5VTEwsICJPVVQyUiIgfSwKKwl7ICJIUE9VVDNMIiwgTlVMTCwgIk9VVDNMIiB9LAorCXsgIkhQT1VUM1IiLCBOVUxMLCAiT1VUM1IiIH0sCisJeyAiU1BLT1VUTCIsIE5VTEwsICJPVVQ0TCIgfSwKKwl7ICJTUEtPVVRSIiwgTlVMTCwgIk9VVDRSIiB9LAorCXsgIlNQS0RBVDEiLCBOVUxMLCAiT1VUNUwiIH0sCisJeyAiU1BLREFUMSIsIE5VTEwsICJPVVQ1UiIgfSwKKwl7ICJTUEtEQVQyIiwgTlVMTCwgIk9VVDZMIiB9LAorCXsgIlNQS0RBVDIiLCBOVUxMLCAiT1VUNlIiIH0sCisJeyAiUFdNMSIsIE5VTEwsICJQV00xIERyaXZlciIgfSwKKwl7ICJQV00yIiwgTlVMTCwgIlBXTTIgRHJpdmVyIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJaW50IHJlZzsKKwlpbnQgdmFsOworfSB3bTUxMDBfcmV2YV9wYXRjaGVzW10gPSB7CisJeyBXTTUxMDBfQVVESU9fSUZfMV8xMCwgMCB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMTEsIDEgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzEyLCAyIH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMV8xMywgMyB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMTQsIDQgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzE1LCA1IH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMV8xNiwgNiB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMTcsIDcgfSwKKworCXsgV001MTAwX0FVRElPX0lGXzFfMTgsIDAgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzE5LCAxIH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMV8yMCwgMiB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMjEsIDMgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzIyLCA0IH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMV8yMywgNSB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMjQsIDYgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzI1LCA3IH0sCisKKwl7IFdNNTEwMF9BVURJT19JRl8yXzEwLCAwIH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMl8xMSwgMSB9LAorCisJeyBXTTUxMDBfQVVESU9fSUZfMl8xOCwgMCB9LAorCXsgV001MTAwX0FVRElPX0lGXzJfMTksIDEgfSwKKworCXsgV001MTAwX0FVRElPX0lGXzNfMTAsIDAgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8zXzExLCAxIH0sCisKKwl7IFdNNTEwMF9BVURJT19JRl8zXzE4LCAwIH0sCisJeyBXTTUxMDBfQVVESU9fSUZfM18xOSwgMSB9LAorfTsKKworc3RhdGljIGludCB3bTUxMDBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQsIGk7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfT046CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTUxMDAtPmNvcmVfc3VwcGxpZXMpLAorCQkJCQkJICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CisJCQlpZiAocmV0ICE9IDApIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwKKwkJCQkJcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlpZiAod201MTAwLT5wZGF0YS5sZG9fZW5hKSB7CisJCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod201MTAwLT5wZGF0YS5sZG9fZW5hLAorCQkJCQkJCTEpOworCQkJCW1zbGVlcCgyKTsKKwkJCX0KKworCQkJY29kZWMtPmNhY2hlX29ubHkgPSBmYWxzZTsKKworCQkJc3dpdGNoICh3bTUxMDAtPnJldikgeworCQkJY2FzZSAwOgorCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MTEsIDB4Myk7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHgyMDMsIDB4Yyk7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHgyMDYsIDApOworCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MjA3LCAweGYwKTsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDIwOCwgMHgzYyk7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHgyMDksIDApOworCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MjExLCAweDIwZDgpOworCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MTEsIDApOworCisJCQkJZm9yIChpID0gMDsKKwkJCQkgICAgIGkgPCBBUlJBWV9TSVpFKHdtNTEwMF9yZXZhX3BhdGNoZXMpOworCQkJCSAgICAgaSsrKQorCQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQkJICAgICAgd201MTAwX3JldmFfcGF0Y2hlc1tpXS5yZWcsCisJCQkJCQkgICAgICB3bTUxMDBfcmV2YV9wYXRjaGVzW2ldLnZhbCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlpZiAod201MTAwLT5wZGF0YS5sZG9fZW5hKQorCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod201MTAwLT5wZGF0YS5sZG9fZW5hLCAwKTsKKwkJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtNTEwMC0+Y29yZV9zdXBwbGllcyksCisJCQkJICAgICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CisJCWJyZWFrOworCX0KKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTUxMDBfZGFpX3RvX2Jhc2Uoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3dpdGNoIChkYWktPmlkKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gV001MTAwX0FVRElPX0lGXzFfMSAtIDE7CisJY2FzZSAxOgorCQlyZXR1cm4gV001MTAwX0FVRElPX0lGXzJfMSAtIDE7CisJY2FzZSAyOgorCQlyZXR1cm4gV001MTAwX0FVRElPX0lGXzNfMSAtIDE7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCB3bTUxMDBfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCWludCBscmNsaywgYmNsaywgbWFzaywgYmFzZTsKKworCWJhc2UgPSB3bTUxMDBfZGFpX3RvX2Jhc2UoZGFpKTsKKwlpZiAoYmFzZSA8IDApCisJCXJldHVybiBiYXNlOworCisJbHJjbGsgPSAwOworCWJjbGsgPSAwOworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJCW1hc2sgPSAwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQltYXNrID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCW1hc2sgPSAyOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJbWFzayA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIERBSSBmb3JtYXQgJWRcbiIsCisJCQlmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTToKKwkJbHJjbGsgfD0gV001MTAwX0FJRjFUWF9MUkNMS19NU1RSOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CisJCWJjbGsgfD0gV001MTAwX0FJRjFfQkNMS19NU1RSOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWxyY2xrIHw9IFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUjsKKwkJYmNsayB8PSBXTTUxMDBfQUlGMV9CQ0xLX01TVFI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIG1hc3RlciBtb2RlICVkXG4iLAorCQkJZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJYmNsayB8PSBXTTUxMDBfQUlGMV9CQ0xLX0lOVjsKKwkJbHJjbGsgfD0gV001MTAwX0FJRjFUWF9MUkNMS19JTlY7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWJjbGsgfD0gV001MTAwX0FJRjFfQkNMS19JTlY7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCWxyY2xrIHw9IFdNNTEwMF9BSUYxVFhfTFJDTEtfSU5WOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgMSwgV001MTAwX0FJRjFfQkNMS19NU1RSIHwKKwkJCSAgICBXTTUxMDBfQUlGMV9CQ0xLX0lOViwgYmNsayk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDIsIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUiB8CisJCQkgICAgV001MTAwX0FJRjFUWF9MUkNMS19JTlYsIGxyY2xrKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgMywgV001MTAwX0FJRjFUWF9MUkNMS19NU1RSIHwKKwkJCSAgICBXTTUxMDBfQUlGMVRYX0xSQ0xLX0lOViwgbHJjbGspOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA1LCBXTTUxMDBfQUlGMV9GTVRfTUFTSywgbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBXTTUxMDBfTlVNX0JDTEtfUkFURVMgMTkKKworc3RhdGljIGludCB3bTUxMDBfYmNsa19yYXRlc19kYXRbV001MTAwX05VTV9CQ0xLX1JBVEVTXSA9IHsKKwkzMjAwMCwKKwk0ODAwMCwKKwk2NDAwMCwKKwk5NjAwMCwKKwkxMjgwMDAsCisJMTkyMDAwLAorCTI1NjAwMCwKKwkzODQwMDAsCisJNTEyMDAwLAorCTc2ODAwMCwKKwkxMDI0MDAwLAorCTE1MzYwMDAsCisJMjA0ODAwMCwKKwkzMDcyMDAwLAorCTQwOTYwMDAsCisJNjE0NDAwMCwKKwk4MTkyMDAwLAorCTEyMjg4MDAwLAorCTI0NTc2MDAwLAorfTsKKworc3RhdGljIGludCB3bTUxMDBfYmNsa19yYXRlc19jZFtXTTUxMDBfTlVNX0JDTEtfUkFURVNdID0geworCTI5NDAwLAorCTQ0MTAwLAorCTU4ODAwLAorCTg4MjAwLAorCTExNzYwMCwKKwkxNzY0MDAsCisJMjM1MjAwLAorCTM1MjgwMCwKKwk0NzA0MDAsCisJNzA1NjAwLAorCTk0MDgwMCwKKwkxNDExMjAwLAorCTE4ODE2MDAsCisJMjg4MjQwMCwKKwkzNzYzMjAwLAorCTU2NDQ4MDAsCisJNzUyNjQwMCwKKwkxMTI4OTYwMCwKKwkyMjU3OTYwMCwKK307CisKK3N0YXRpYyBpbnQgd201MTAwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCB3bTUxMDBfcHJpdiAqd201MTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJYm9vbCBhc3luYyA9IHdtNTEwMC0+YWlmX2FzeW5jW2RhaS0+aWRdOworCWludCBpLCBiYXNlLCBiY2xrLCBhaWZfcmF0ZSwgbHJjbGssIHdsLCBmbCwgc3I7CisJaW50ICpiY2xrX3JhdGVzOworCisJYmFzZSA9IHdtNTEwMF9kYWlfdG9fYmFzZShkYWkpOworCWlmIChiYXNlIDwgMCkKKwkJcmV0dXJuIGJhc2U7CisKKwkvKiBEYXRhIHNpemVzIGlmIG5vdCB1c2luZyBURE0gKi8KKwl3bCA9IHNuZF9wY21fZm9ybWF0X3dpZHRoKHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJaWYgKHdsIDwgMCkKKwkJcmV0dXJuIHdsOworCWZsID0gc25kX3NvY19wYXJhbXNfdG9fZnJhbWVfc2l6ZShwYXJhbXMpOworCWlmIChmbCA8IDApCisJCXJldHVybiBmbDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIldvcmQgbGVuZ3RoICVkIGJpdHMsIGZyYW1lIGxlbmd0aCAlZCBiaXRzXG4iLAorCQl3bCwgZmwpOworCisJLyogVGFyZ2V0IEJDTEsgcmF0ZSAqLworCWJjbGsgPSBzbmRfc29jX3BhcmFtc190b19iY2xrKHBhcmFtcyk7CisJaWYgKGJjbGsgPCAwKQorCQlyZXR1cm4gYmNsazsKKworCS8qIFJvb3QgZm9yIEJDTEsgZGVwZW5kcyBvbiBTWVMvQVNZTkNDTEsgKi8KKwlpZiAoIWFzeW5jKSB7CisJCWFpZl9yYXRlID0gd201MTAwLT5zeXNjbGs7CisJCXNyID0gd201MTAwX2FsbG9jX3NyKGNvZGVjLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwkJaWYgKHNyIDwgMCkKKwkJCXJldHVybiBzcjsKKwl9IGVsc2UgeworCQkvKiBJZiB3ZSdyZSBpbiBBU1lOQ0NMSyBzZXQgdGhlIEFTWU5DIHNhbXBsZSByYXRlICovCisJCWFpZl9yYXRlID0gd201MTAwLT5hc3luY2NsazsKKwkJc3IgPSAzOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtNTEwMF9zcl9jb2RlKTsgaSsrKQorCQkJaWYgKHBhcmFtc19yYXRlKHBhcmFtcykgPT0gd201MTAwX3NyX2NvZGVbaV0pCisJCQkJYnJlYWs7CisJCWlmIChpID09IEFSUkFZX1NJWkUod201MTAwX3NyX2NvZGUpKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIHJhdGUgJWRIem4iLAorCQkJCXBhcmFtc19yYXRlKHBhcmFtcykpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBUT0RPOiBXZSBzaG91bGQgcmVhbGx5IGNoZWNrIGZvciBzeW1tZXRyeSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfQ0xPQ0tJTkdfOCwKKwkJCQkgICAgV001MTAwX0FTWU5DX1NBTVBMRV9SQVRFX01BU0ssIGkpOworCX0KKworCWlmICghYWlmX3JhdGUpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgaGFzIG5vIHJhdGUgc2V0XG4iLAorCQkJYXN5bmMgPyAiQVNZTkNDTEsiIDogIlNZU0NMSyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJUYXJnZXQgQkNMSyBpcyAlZEh6LCB1c2luZyAlZEh6ICVzXG4iLAorCQliY2xrLCBhaWZfcmF0ZSwgYXN5bmMgPyAiQVNZTkNDTEsiIDogIlNZU0NMSyIpOworCisJaWYgKGFpZl9yYXRlICUgNDAwMCkKKwkJYmNsa19yYXRlcyA9IHdtNTEwMF9iY2xrX3JhdGVzX2NkOworCWVsc2UKKwkJYmNsa19yYXRlcyA9IHdtNTEwMF9iY2xrX3JhdGVzX2RhdDsKKworCWZvciAoaSA9IDA7IGkgPCBXTTUxMDBfTlVNX0JDTEtfUkFURVM7IGkrKykKKwkJaWYgKGJjbGtfcmF0ZXNbaV0gPj0gYmNsayAmJiAoYmNsa19yYXRlc1tpXSAlIGJjbGsgPT0gMCkpCisJCQlicmVhazsKKwlpZiAoaSA9PSBXTTUxMDBfTlVNX0JDTEtfUkFURVMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIk5vIHZhbGlkIEJDTEsgZm9yICVkSHogZm91bmQgZnJvbSAlZEh6ICVzXG4iLAorCQkJYmNsaywgYWlmX3JhdGUsIGFzeW5jID8gIkFTWU5DQ0xLIiA6ICJTWVNDTEsiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmNsayA9IGk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiU2V0dGluZyAlZEh6IEJDTEtcbiIsIGJjbGtfcmF0ZXNbYmNsa10pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyAxLCBXTTUxMDBfQUlGMV9CQ0xLX0ZSRVFfTUFTSywgYmNsayk7CisKKwlscmNsayA9IGJjbGtfcmF0ZXNbYmNsa10gLyBwYXJhbXNfcmF0ZShwYXJhbXMpOworCWRldl9kYmcoY29kZWMtPmRldiwgIlNldHRpbmcgJWRIeiBMUkNMS1xuIiwgYmNsa19yYXRlc1tiY2xrXSAvIGxyY2xrKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyB8fAorCSAgICB3bTUxMDAtPmFpZl9zeW1tZXRyaWNbZGFpLT5pZF0pCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA3LAorCQkJCSAgICBXTTUxMDBfQUlGMVJYX0JDUEZfTUFTSywgbHJjbGspOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDYsCisJCQkJICAgIFdNNTEwMF9BSUYxVFhfQkNQRl9NQVNLLCBscmNsayk7CisKKwlpID0gKHdsIDw8IFdNNTEwMF9BSUYxVFhfV0xfU0hJRlQpIHwgZmw7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA5LAorCQkJCSAgICBXTTUxMDBfQUlGMVJYX1dMX01BU0sgfAorCQkJCSAgICBXTTUxMDBfQUlGMVJYX1NMT1RfTEVOX01BU0ssIGkpOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDgsCisJCQkJICAgIFdNNTEwMF9BSUYxVFhfV0xfTUFTSyB8CisJCQkJICAgIFdNNTEwMF9BSUYxVFhfU0xPVF9MRU5fTUFTSywgaSk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgNCwgV001MTAwX0FJRjFfUkFURV9NQVNLLCBzcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgd201MTAwX2RhaV9vcHMgPSB7CisJLnNldF9mbXQgPSB3bTUxMDBfc2V0X2ZtdCwKKwkuaHdfcGFyYW1zID0gd201MTAwX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBpbnQgd201MTAwX3NldF9zeXNjbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgY2xrX2lkLAorCQkJICAgICBpbnQgc291cmNlLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCAqcmF0ZV9zdG9yZTsKKwlpbnQgZnZhbCwgYXVkaW9fcmF0ZSwgcmV0LCByZWc7CisKKwlzd2l0Y2ggKGNsa19pZCkgeworCWNhc2UgV001MTAwX0NMS19TWVNDTEs6CisJCXJlZyA9IFdNNTEwMF9DTE9DS0lOR18zOworCQlyYXRlX3N0b3JlID0gJndtNTEwMC0+c3lzY2xrOworCQlicmVhazsKKwljYXNlIFdNNTEwMF9DTEtfQVNZTkNDTEs6CisJCXJlZyA9IFdNNTEwMF9DTE9DS0lOR183OworCQlyYXRlX3N0b3JlID0gJndtNTEwMC0+YXN5bmNjbGs7CisJCWJyZWFrOworCWNhc2UgV001MTAwX0NMS18zMktIWjoKKwkJLyogVGhlIDMya0h6IGNsb2NrIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb3RoZXJzICovCisJCXN3aXRjaCAoc291cmNlKSB7CisJCWNhc2UgV001MTAwX0NMS1NSQ19NQ0xLMToKKwkJY2FzZSBXTTUxMDBfQ0xLU1JDX01DTEsyOgorCQljYXNlIFdNNTEwMF9DTEtTUkNfU1lTQ0xLOgorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV001MTAwX0NMT0NLSU5HXzEsCisJCQkJCSAgICBXTTUxMDBfQ0xLXzMyS19TUkNfTUFTSywKKwkJCQkJICAgIHNvdXJjZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBXTTUxMDBfQ0xLX0FJRjE6CisJY2FzZSBXTTUxMDBfQ0xLX0FJRjI6CisJY2FzZSBXTTUxMDBfQ0xLX0FJRjM6CisJCS8qIE5vdCByZWFsIGNsb2NrcywgcmVjb3JkIHdoaWNoIGNsb2NrIGRvbWFpbiB0aGV5J3JlIGluICovCisJCXN3aXRjaCAoc291cmNlKSB7CisJCWNhc2UgV001MTAwX0NMS1NSQ19TWVNDTEs6CisJCQl3bTUxMDAtPmFpZl9hc3luY1tjbGtfaWQgLSAxXSA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgV001MTAwX0NMS1NSQ19BU1lOQ0NMSzoKKwkJCXdtNTEwMC0+YWlmX2FzeW5jW2Nsa19pZCAtIDFdID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBzb3VyY2UgJWRcbiIsIHNvdXJjZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQkKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdNNTEwMF9DTEtfT1BDTEs6CisJCXN3aXRjaCAoZnJlcSkgeworCQljYXNlIDU2NDQ4MDA6CisJCWNhc2UgNjE0NDAwMDoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSVNDX0dQSU9fMSwKKwkJCQkJICAgIFdNNTEwMF9PUENMS19TRUxfTUFTSywgMCk7CisJCQlicmVhazsKKwkJY2FzZSAxMTI4OTYwMDoKKwkJY2FzZSAxMjI4ODAwMDoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSVNDX0dQSU9fMSwKKwkJCQkJICAgIFdNNTEwMF9PUENMS19TRUxfTUFTSywgMCk7CisJCQlicmVhazsKKwkJY2FzZSAyMjU3OTIwMDoKKwkJY2FzZSAyNDU3NjAwMDoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSVNDX0dQSU9fMSwKKwkJCQkJICAgIFdNNTEwMF9PUENMS19TRUxfTUFTSywgMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIE9QQ0xLICVkSHpcbiIsCisJCQkJZnJlcSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gY2xvY2sgJWRcbiIsIGNsa19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc291cmNlKSB7CisJY2FzZSBXTTUxMDBfQ0xLU1JDX1NZU0NMSzoKKwljYXNlIFdNNTEwMF9DTEtTUkNfQVNZTkNDTEs6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgc291cmNlICVkXG4iLCBzb3VyY2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlIDU2NDQ4MDA6CisJY2FzZSA2MTQ0MDAwOgorCQlmdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxMTI4OTYwMDoKKwljYXNlIDEyMjg4MDAwOgorCQlmdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSAyMjU3OTIwMDoKKwljYXNlIDI0NTc2MDAwOgorCQlmdmFsID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBjbG9jayByYXRlOiAlZFxuIiwgZnJlcSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZnJlcSkgeworCWNhc2UgNTY0NDgwMDoKKwljYXNlIDExMjg5NjAwOgorCWNhc2UgMjI1NzkyMDA6CisJCWF1ZGlvX3JhdGUgPSA0NDEwMDsKKwkJYnJlYWs7CisKKwljYXNlIDYxNDQwMDA6CisJY2FzZSAxMjI4ODAwMDoKKwljYXNlIDI0NTc2MDAwOgorCQlhdWRpb19yYXRlID0gNDgwMDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWF1ZGlvX3JhdGUgPSAwOworCQlicmVhazsKKwl9CisKKwkvKiBUT0RPOiBDaGVjayBpZiBNQ0xLcyBhcmUgaW4gdXNlIGFuZCBlbmFibGUvZGlzYWJsZSBwdWxscyB0bworCSAqIG1hdGNoLgorCSAqLworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCBXTTUxMDBfU1lTQ0xLX0ZSRVFfTUFTSyB8CisJCQkgICAgV001MTAwX1NZU0NMS19TUkNfTUFTSywKKwkJCSAgICBmdmFsIDw8IFdNNTEwMF9TWVNDTEtfRlJFUV9TSElGVCB8IHNvdXJjZSk7CisKKwkvKiBJZiB0aGlzIGlzIFNZU0NMSyB0aGVuIGNvbmZpZ3VyZSB0aGUgY2xvY2sgcmF0ZSBmb3IgdGhlCisJICogaW50ZXJuYWwgYXVkaW8gZnVuY3Rpb25zIHRvIHRoZSBuYXR1cmFsIHNhbXBsZSByYXRlIGZvcgorCSAqIHRoaXMgY2xvY2sgcmF0ZS4KKwkgKi8KKwlpZiAoY2xrX2lkID09IFdNNTEwMF9DTEtfU1lTQ0xLKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIlNldHRpbmcgcHJpbWFyeSBhdWRpbyByYXRlIHRvICVkSHoiLAorCQkJYXVkaW9fcmF0ZSk7CisJCWlmICgwICYmICpyYXRlX3N0b3JlKQorCQkJd201MTAwX2ZyZWVfc3IoY29kZWMsIGF1ZGlvX3JhdGUpOworCQlyZXQgPSB3bTUxMDBfYWxsb2Nfc3IoY29kZWMsIGF1ZGlvX3JhdGUpOworCQlpZiAocmV0ICE9IDApCisJCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiUHJpbWFyeSBhdWRpbyBzbG90IGlzICVkXG4iLAorCQkJCSByZXQpOworCX0KKworCSpyYXRlX3N0b3JlID0gZnJlcTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgX2ZsbF9kaXYgeworCXUxNiBmbGxfZnJhdGlvOworCXUxNiBmbGxfb3V0ZGl2OworCXUxNiBmbGxfcmVmY2xrX2RpdjsKKwl1MTYgbjsKKwl1MTYgdGhldGE7CisJdTE2IGxhbWJkYTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtaW47CisJdW5zaWduZWQgaW50IG1heDsKKwl1MTYgZmxsX2ZyYXRpbzsKKwlpbnQgcmF0aW87Cit9IGZsbF9mcmF0aW9zW10gPSB7CisJeyAgICAgICAwLCAgICA2NDAwMCwgNCwgMTYgfSwKKwl7ICAgNjQwMDAsICAgMTI4MDAwLCAzLCAgOCB9LAorCXsgIDEyODAwMCwgICAyNTYwMDAsIDIsICA0IH0sCisJeyAgMjU2MDAwLCAgMTAwMDAwMCwgMSwgIDIgfSwKKwl7IDEwMDAwMDAsIDEzNTAwMDAwLCAwLCAgMSB9LAorfTsKKworc3RhdGljIGludCBmbGxfZmFjdG9ycyhzdHJ1Y3QgX2ZsbF9kaXYgKmZsbF9kaXYsIHVuc2lnbmVkIGludCBGcmVmLAorCQkgICAgICAgdW5zaWduZWQgaW50IEZvdXQpCit7CisJdW5zaWduZWQgaW50IHRhcmdldDsKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCBmcmF0aW8sIGdjZF9mbGw7CisJaW50IGk7CisKKwkvKiBGcmVmIG11c3QgYmUgPD0xMy41TUh6ICovCisJZGl2ID0gMTsKKwlmbGxfZGl2LT5mbGxfcmVmY2xrX2RpdiA9IDA7CisJd2hpbGUgKChGcmVmIC8gZGl2KSA+IDEzNTAwMDAwKSB7CisJCWRpdiAqPSAyOworCQlmbGxfZGl2LT5mbGxfcmVmY2xrX2RpdisrOworCisJCWlmIChkaXYgPiA4KSB7CisJCQlwcl9lcnIoIkNhbid0IHNjYWxlICVkTUh6IGlucHV0IGRvd24gdG8gPD0xMy41TUh6XG4iLAorCQkJICAgICAgIEZyZWYpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlwcl9kZWJ1ZygiRkxMIEZyZWY9JXUgRm91dD0ldVxuIiwgRnJlZiwgRm91dCk7CisKKwkvKiBBcHBseSB0aGUgZGl2aXNpb24gZm9yIG91ciByZW1haW5pbmcgY2FsY3VsYXRpb25zICovCisJRnJlZiAvPSBkaXY7CisKKwkvKiBGdmNvIHNob3VsZCBiZSA5MC0xMDBNSHo7IGRvbid0IGNoZWNrIHRoZSB1cHBlciBib3VuZCAqLworCWRpdiA9IDI7CisJd2hpbGUgKEZvdXQgKiBkaXYgPCA5MDAwMDAwMCkgeworCQlkaXYrKzsKKwkJaWYgKGRpdiA+IDY0KSB7CisJCQlwcl9lcnIoIlVuYWJsZSB0byBmaW5kIEZMTF9PVVRESVYgZm9yIEZvdXQ9JXVIelxuIiwKKwkJCSAgICAgICBGb3V0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXRhcmdldCA9IEZvdXQgKiBkaXY7CisJZmxsX2Rpdi0+ZmxsX291dGRpdiA9IGRpdiAtIDE7CisKKwlwcl9kZWJ1ZygiRkxMIEZ2Y289JWRIelxuIiwgdGFyZ2V0KTsKKworCS8qIEZpbmQgYW4gYXBwcm9wcmFpdGUgRkxMX0ZSQVRJTyBhbmQgZmFjdG9yIGl0IG91dCBvZiB0aGUgdGFyZ2V0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmxsX2ZyYXRpb3MpOyBpKyspIHsKKwkJaWYgKGZsbF9mcmF0aW9zW2ldLm1pbiA8PSBGcmVmICYmIEZyZWYgPD0gZmxsX2ZyYXRpb3NbaV0ubWF4KSB7CisJCQlmbGxfZGl2LT5mbGxfZnJhdGlvID0gZmxsX2ZyYXRpb3NbaV0uZmxsX2ZyYXRpbzsKKwkJCWZyYXRpbyA9IGZsbF9mcmF0aW9zW2ldLnJhdGlvOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gQVJSQVlfU0laRShmbGxfZnJhdGlvcykpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gZmluZCBGTExfRlJBVElPIGZvciBGcmVmPSV1SHpcbiIsIEZyZWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmbGxfZGl2LT5uID0gdGFyZ2V0IC8gKGZyYXRpbyAqIEZyZWYpOworCisJaWYgKHRhcmdldCAlIEZyZWYgPT0gMCkgeworCQlmbGxfZGl2LT50aGV0YSA9IDA7CisJCWZsbF9kaXYtPmxhbWJkYSA9IDA7CisJfSBlbHNlIHsKKwkJZ2NkX2ZsbCA9IGdjZCh0YXJnZXQsIGZyYXRpbyAqIEZyZWYpOworCisJCWZsbF9kaXYtPnRoZXRhID0gKHRhcmdldCAtIChmbGxfZGl2LT5uICogZnJhdGlvICogRnJlZikpCisJCQkvIGdjZF9mbGw7CisJCWZsbF9kaXYtPmxhbWJkYSA9IChmcmF0aW8gKiBGcmVmKSAvIGdjZF9mbGw7CisJfQorCisJcHJfZGVidWcoIkZMTCBOPSV4IFRIRVRBPSV4IExBTUJEQT0leFxuIiwKKwkJIGZsbF9kaXYtPm4sIGZsbF9kaXYtPnRoZXRhLCBmbGxfZGl2LT5sYW1iZGEpOworCXByX2RlYnVnKCJGTExfRlJBVElPPSV4KCVkKSBGTExfT1VURElWPSV4IEZMTF9SRUZDTEtfRElWPSV4XG4iLAorCQkgZmxsX2Rpdi0+ZmxsX2ZyYXRpbywgZnJhdGlvLCBmbGxfZGl2LT5mbGxfb3V0ZGl2LAorCQkgZmxsX2Rpdi0+ZmxsX3JlZmNsa19kaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd201MTAwX3NldF9mbGwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZmxsX2lkLCBpbnQgc291cmNlLAorCQkJICB1bnNpZ25lZCBpbnQgRnJlZiwgdW5zaWduZWQgaW50IEZvdXQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IHRvX2kyY19jbGllbnQoY29kZWMtPmRldik7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgX2ZsbF9kaXYgZmFjdG9yczsKKwlzdHJ1Y3Qgd201MTAwX2ZsbCAqZmxsOworCWludCByZXQsIGJhc2UsIGxvY2ssIGksIHRpbWVvdXQ7CisKKwlzd2l0Y2ggKGZsbF9pZCkgeworCWNhc2UgV001MTAwX0ZMTDE6CisJCWZsbCA9ICZ3bTUxMDAtPmZsbFswXTsKKwkJYmFzZSA9IFdNNTEwMF9GTEwxX0NPTlRST0xfMSAtIDE7CisJCWxvY2sgPSBXTTUxMDBfRkxMMV9MT0NLX1NUUzsKKwkJYnJlYWs7CisJY2FzZSBXTTUxMDBfRkxMMjoKKwkJZmxsID0gJndtNTEwMC0+ZmxsWzFdOworCQliYXNlID0gV001MTAwX0ZMTDJfQ09OVFJPTF8yIC0gMTsKKwkJbG9jayA9IFdNNTEwMF9GTEwyX0xPQ0tfU1RTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIEZMTCAlZFxuIixmbGxfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIUZvdXQpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRkxMJWQgZGlzYWJsZWQiLCBmbGxfaWQpOworCQlmbGwtPmZvdXQgPSAwOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgMSwgV001MTAwX0ZMTDFfRU5BLCAwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChzb3VyY2UpIHsKKwljYXNlIFdNNTEwMF9GTExfU1JDX01DTEsxOgorCWNhc2UgV001MTAwX0ZMTF9TUkNfTUNMSzI6CisJY2FzZSBXTTUxMDBfRkxMX1NSQ19GTEwxOgorCWNhc2UgV001MTAwX0ZMTF9TUkNfRkxMMjoKKwljYXNlIFdNNTEwMF9GTExfU1JDX0FJRjFCQ0xLOgorCWNhc2UgV001MTAwX0ZMTF9TUkNfQUlGMkJDTEs6CisJY2FzZSBXTTUxMDBfRkxMX1NSQ19BSUYzQkNMSzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBGTEwgc291cmNlICVkXG4iLCBzb3VyY2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBmbGxfZmFjdG9ycygmZmFjdG9ycywgRnJlZiwgRm91dCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBEaXNhYmxlIHRoZSBGTEwgd2hpbGUgd2UgcmVjb25maWd1cmUgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgMSwgV001MTAwX0ZMTDFfRU5BLCAwKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyAyLAorCQkJICAgIFdNNTEwMF9GTEwxX09VVERJVl9NQVNLIHwgV001MTAwX0ZMTDFfRlJBVElPX01BU0ssCisJCQkgICAgKGZhY3RvcnMuZmxsX291dGRpdiA8PCBXTTUxMDBfRkxMMV9PVVRESVZfU0hJRlQpIHwKKwkJCSAgICBmYWN0b3JzLmZsbF9mcmF0aW8pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyAzLCBXTTUxMDBfRkxMMV9USEVUQV9NQVNLLAorCQkJICAgIGZhY3RvcnMudGhldGEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA1LCBXTTUxMDBfRkxMMV9OX01BU0ssIGZhY3RvcnMubik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDYsCisJCQkgICAgV001MTAwX0ZMTDFfUkVGQ0xLX0RJVl9NQVNLIHwKKwkJCSAgICBXTTUxMDBfRkxMMV9SRUZDTEtfU1JDX01BU0ssCisJCQkgICAgKGZhY3RvcnMuZmxsX3JlZmNsa19kaXYKKwkJCSAgICAgPDwgV001MTAwX0ZMTDFfUkVGQ0xLX0RJVl9TSElGVCkgfCBzb3VyY2UpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA3LCBXTTUxMDBfRkxMMV9MQU1CREFfTUFTSywKKwkJCSAgICBmYWN0b3JzLmxhbWJkYSk7CisKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBjb21wbGV0aW9ucyAqLworCXRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZmbGwtPmxvY2spOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDEsIFdNNTEwMF9GTEwxX0VOQSwgV001MTAwX0ZMTDFfRU5BKTsKKworCWlmIChpMmMtPmlycSkKKwkJdGltZW91dCA9IDI7CisJZWxzZQorCQl0aW1lb3V0ID0gNTA7CisKKwkvKiBQb2xsIGZvciB0aGUgbG9jazsgd2lsbCB1c2UgaW50ZXJydXB0IHdoZW4gd2UgY2FuIHRlc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCWlmIChpMmMtPmlycSkgeworCQkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmbGwtPmxvY2ssCisJCQkJCQkJICBtc2Vjc190b19qaWZmaWVzKDI1KSk7CisJCQlpZiAocmV0ID4gMCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCW1zbGVlcCgxKTsKKwkJfQorCisJCXJldCA9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkgICBXTTUxMDBfSU5URVJSVVBUX1JBV19TVEFUVVNfMyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIkZhaWxlZCB0byByZWFkIEZMTCBzdGF0dXM6ICVkXG4iLAorCQkJCXJldCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmV0ICYgbG9jaykKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSB0aW1lb3V0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZMTCVkIGxvY2sgdGltZWQgb3V0XG4iLCBmbGxfaWQpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlmbGwtPnNyYyA9IHNvdXJjZTsKKwlmbGwtPmZyZWYgPSBGcmVmOworCWZsbC0+Zm91dCA9IEZvdXQ7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJGTEwlZCBydW5uaW5nICVkSHotPiVkSHpcbiIsIGZsbF9pZCwKKwkJRnJlZiwgRm91dCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWN0dWFsbHkgZ28gbXVjaCBoaWdoZXIgKi8KKyNkZWZpbmUgV001MTAwX1JBVEVTIFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCisKKyNkZWZpbmUgV001MTAwX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHxcCisJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB3bTUxMDBfZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJ3bTUxMDAtYWlmMSIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBXTTUxMDBfUkFURVMsCisJCQkuZm9ybWF0cyA9IFdNNTEwMF9GT1JNQVRTLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCSAuc3RyZWFtX25hbWUgPSAiQUlGMSBDYXB0dXJlIiwKKwkJCSAuY2hhbm5lbHNfbWluID0gMiwKKwkJCSAuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCSAucmF0ZXMgPSBXTTUxMDBfUkFURVMsCisJCQkgLmZvcm1hdHMgPSBXTTUxMDBfRk9STUFUUywKKwkJIH0sCisJCS5vcHMgPSAmd201MTAwX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtNTEwMC1haWYyIiwKKwkJLmlkID0gMSwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFdNNTEwMF9SQVRFUywKKwkJCS5mb3JtYXRzID0gV001MTAwX0ZPUk1BVFMsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJIC5zdHJlYW1fbmFtZSA9ICJBSUYyIENhcHR1cmUiLAorCQkJIC5jaGFubmVsc19taW4gPSAyLAorCQkJIC5jaGFubmVsc19tYXggPSAyLAorCQkJIC5yYXRlcyA9IFdNNTEwMF9SQVRFUywKKwkJCSAuZm9ybWF0cyA9IFdNNTEwMF9GT1JNQVRTLAorCQkgfSwKKwkJLm9wcyA9ICZ3bTUxMDBfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAid201MTAwLWFpZjMiLAorCQkuaWQgPSAyLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMyBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gV001MTAwX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBXTTUxMDBfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkgLnN0cmVhbV9uYW1lID0gIkFJRjMgQ2FwdHVyZSIsCisJCQkgLmNoYW5uZWxzX21pbiA9IDIsCisJCQkgLmNoYW5uZWxzX21heCA9IDIsCisJCQkgLnJhdGVzID0gV001MTAwX1JBVEVTLAorCQkJIC5mb3JtYXRzID0gV001MTAwX0ZPUk1BVFMsCisJCSB9LAorCQkub3BzID0gJndtNTEwMF9kYWlfb3BzLAorCX0sCit9OworCitzdGF0aWMgaW50IHdtNTEwMF9kaWdfdnVbXSA9IHsKKwlXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzFMLAorCVdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMVIsCisJV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8yTCwKKwlXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzJSLAorCVdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfM0wsCisJV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8zUiwKKwlXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzRMLAorCVdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfNFIsCisKKwlXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzFMLAorCVdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfMVIsCisJV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8yTCwKKwlXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzJSLAorCVdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfM0wsCisJV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8zUiwKKwlXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzRMLAorCVdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNFIsCisJV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV81TCwKKwlXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzVSLAorCVdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNkwsCisJV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV82UiwKK307CisKK3N0YXRpYyB2b2lkIHdtNTEwMF9zZXRfZGV0ZWN0X21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgdGhlX21vZGUpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd201MTAwX2phY2tfbW9kZSAqbW9kZSA9ICZ3bTUxMDAtPnBkYXRhLmphY2tfbW9kZXNbdGhlX21vZGVdOworCisJQlVHX09OKHRoZV9tb2RlID49IEFSUkFZX1NJWkUod201MTAwLT5wZGF0YS5qYWNrX21vZGVzKSk7CisKKwlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh3bTUxMDAtPnBkYXRhLmhwX3BvbCwgbW9kZS0+aHBfcG9sKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfQUNDRVNTT1JZX0RFVEVDVF9NT0RFXzEsCisJCQkgICAgV001MTAwX0FDQ0RFVF9CSUFTX1NSQ19NQVNLIHwKKwkJCSAgICBXTTUxMDBfQUNDREVUX1NSQywKKwkJCSAgICAobW9kZS0+YmlhcyA8PCBXTTUxMDBfQUNDREVUX0JJQVNfU1JDX1NISUZUKSB8CisJCQkgICAgbW9kZS0+bWljZF9zcmMgPDwgV001MTAwX0FDQ0RFVF9TUkNfU0hJRlQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSVNDX0NPTlRST0wsCisJCQkgICAgV001MTAwX0hQQ09NX1NSQywKKwkJCSAgICBtb2RlLT5taWNkX3NyYyA8PCBXTTUxMDBfSFBDT01fU1JDX1NISUZUKTsKKworCXdtNTEwMC0+amFja19tb2RlID0gdGhlX21vZGU7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJTZXQgbWljcm9waG9uZSBwb2xhcml0eSB0byAlZFxuIiwKKwkJd201MTAwLT5qYWNrX21vZGUpOworfQorCitzdGF0aWMgdm9pZCB3bTUxMDBfbWljZF9pcnEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB3bTUxMDBfcHJpdiAqd201MTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbDsKKworCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV001MTAwX01JQ19ERVRFQ1RfMyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWNyb3Bob25lIGV2ZW50OiAleFxuIiwgdmFsKTsKKworCWlmICghKHZhbCAmIFdNNTEwMF9BQ0NERVRfVkFMSUQpKSB7CisJCWRldl93YXJuKGNvZGVjLT5kZXYsICJNaWNyb3Bob25lIGRldGVjdGlvbiBzdGF0ZSBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5vIGFjY2Vzc29yeSwgcmVzZXQgZXZlcnl0aGluZyBhbmQgcmVwb3J0IHJlbW92YWwgKi8KKwlpZiAoISh2YWwgJiBXTTUxMDBfQUNDREVUX1NUUykpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiSmFjayByZW1vdmFsIGRldGVjdGVkXG4iKTsKKwkJd201MTAwLT5qYWNrX21pYyA9IGZhbHNlOworCQl3bTUxMDAtPmphY2tfZGV0ZWN0aW5nID0gdHJ1ZTsKKwkJc25kX3NvY19qYWNrX3JlcG9ydCh3bTUxMDAtPmphY2ssIDAsCisJCQkJICAgIFNORF9KQUNLX0xJTkVPVVQgfCBTTkRfSkFDS19IRUFEU0VUIHwKKwkJCQkgICAgU05EX0pBQ0tfQlROXzApOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSUNfREVURUNUXzEsCisJCQkJICAgIFdNNTEwMF9BQ0NERVRfUkFURV9NQVNLLAorCQkJCSAgICBXTTUxMDBfQUNDREVUX1JBVEVfTUFTSyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB0aGUgbWVhc3VyZW1lbnQgaXMgdmVyeSBoaWdoIHdlJ3ZlIGdvdCBhIG1pY3JvcGhvbmUsCisJICogZWl0aGVyIHdlIGp1c3QgZGV0ZWN0ZWQgb25lIG9yIGlmIHdlIGFscmVhZHkgcmVwb3J0ZWQgdGhlbgorCSAqIHdlJ3ZlIGdvdCBhIGJ1dHRvbiByZWxlYXNlIGV2ZW50LgorCSAqLworCWlmICh2YWwgJiAweDQwMCkgeworCQlpZiAod201MTAwLT5qYWNrX2RldGVjdGluZykgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiTWljcm9waG9uZSBkZXRlY3RlZFxuIik7CisJCQl3bTUxMDAtPmphY2tfbWljID0gdHJ1ZTsKKwkJCXNuZF9zb2NfamFja19yZXBvcnQod201MTAwLT5qYWNrLAorCQkJCQkgICAgU05EX0pBQ0tfSEVBRFNFVCwKKwkJCQkJICAgIFNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19CVE5fMCk7CisKKwkJCS8qIEluY3JlYXNlIHBvbGwgcmF0ZSB0byBnaXZlIGJldHRlciByZXNwb25zaXZlbmVzcworCQkJICogZm9yIGJ1dHRvbnMgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSUNfREVURUNUXzEsCisJCQkJCSAgICBXTTUxMDBfQUNDREVUX1JBVEVfTUFTSywKKwkJCQkJICAgIDUgPDwgV001MTAwX0FDQ0RFVF9SQVRFX1NISUZUKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIk1pYyBidXR0b24gdXBcbiIpOworCQkJc25kX3NvY19qYWNrX3JlcG9ydCh3bTUxMDAtPmphY2ssIDAsIFNORF9KQUNLX0JUTl8wKTsKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB3ZSBkZXRlY3RlZCBhIGxvd2VyIGltcGVkZW5jZSBkdXJpbmcgaW5pdGlhbCBzdGFydHVwCisJICogdGhlbiB3ZSBwcm9iYWJseSBoYXZlIHRoZSB3cm9uZyBwb2xhcml0eSwgZmxpcCBpdC4gIERvbid0CisJICogZG8gdGhpcyBmb3IgdGhlIGxvd2VzdCBpbXBlZGVuY2VzIHRvIHNwZWVkIHVwIGRldGVjdGlvbiBvZgorCSAqIHBsYWluIGhlYWRwaG9uZXMuCisJICovCisJaWYgKHdtNTEwMC0+amFja19kZXRlY3RpbmcgJiYgKHZhbCAmIDB4M2Y4KSkgeworCQl3bTUxMDBfc2V0X2RldGVjdF9tb2RlKGNvZGVjLCAhd201MTAwLT5qYWNrX21vZGUpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBEb24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGJ1dHRvbnMsIGp1c3QgcmVwb3J0IGFueSBsb3cKKwkgKiBpbXBlZGVuY2UgYXMgQlROXzAuCisJICovCisJaWYgKHZhbCAmIDB4M2ZjKSB7CisJCWlmICh3bTUxMDAtPmphY2tfbWljKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWMgYnV0dG9uIGRldGVjdGVkXG4iKTsKKwkJCXNuZF9zb2NfamFja19yZXBvcnQod201MTAwLT5qYWNrLCBTTkRfSkFDS19CVE5fMCwKKwkJCQkJICAgIFNORF9KQUNLX0JUTl8wKTsKKwkJfSBlbHNlIGlmICh3bTUxMDAtPmphY2tfZGV0ZWN0aW5nKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJIZWFkcGhvbmUgZGV0ZWN0ZWRcbiIpOworCQkJc25kX3NvY19qYWNrX3JlcG9ydCh3bTUxMDAtPmphY2ssIFNORF9KQUNLX0hFQURQSE9ORSwKKwkJCQkJICAgIFNORF9KQUNLX0hFQURQSE9ORSk7CisKKwkJCS8qIEluY3JlYXNlIHRoZSBkZXRlY3Rpb24gcmF0ZSBhIGJpdCBmb3IKKwkJCSAqIHJlc3BvbnNpdmVuZXNzLgorCQkJICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfTUlDX0RFVEVDVF8xLAorCQkJCQkgICAgV001MTAwX0FDQ0RFVF9SQVRFX01BU0ssCisJCQkJCSAgICA3IDw8IFdNNTEwMF9BQ0NERVRfUkFURV9TSElGVCk7CisJCX0KKwl9Cit9CisKK2ludCB3bTUxMDBfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfamFjayAqamFjaykKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKGphY2spIHsKKwkJd201MTAwLT5qYWNrID0gamFjazsKKwkJd201MTAwLT5qYWNrX2RldGVjdGluZyA9IHRydWU7CisKKwkJd201MTAwX3NldF9kZXRlY3RfbW9kZShjb2RlYywgMCk7CisKKwkJLyogU2xvd2VzdCBkZXRlY3Rpb24gcmF0ZSwgZ2l2ZXMgZGVib3VuY2UgZm9yIGluaXRpYWwKKwkJICogZGV0ZWN0aW9uICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSUNfREVURUNUXzEsCisJCQkJICAgIFdNNTEwMF9BQ0NERVRfQklBU19TVEFSVFRJTUVfTUFTSyB8CisJCQkJICAgIFdNNTEwMF9BQ0NERVRfUkFURV9NQVNLLAorCQkJCSAgICAoNyA8PCBXTTUxMDBfQUNDREVUX0JJQVNfU1RBUlRUSU1FX1NISUZUKSB8CisJCQkJICAgIFdNNTEwMF9BQ0NERVRfUkFURV9NQVNLKTsKKworCQkvKiBXZSBuZWVkIHRoZSBjaGFyZ2UgcHVtcCB0byBwb3dlciBNSUNCSUFTICovCisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkNQMiIpOworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJTWVNDTEsiKTsKKwkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKworCQkvKiBXZSBzdGFydCBvZmYganVzdCBlbmFibGluZyBtaWNyb3Bob25lIGRldGVjdGlvbiAtIGV2ZW4gYQorCQkgKiBwbGFpbiBoZWFkcGhvbmUgd2lsbCB0cmlnZ2VyIGRldGVjdGlvbi4KKwkJICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSUNfREVURUNUXzEsCisJCQkJICAgIFdNNTEwMF9BQ0NERVRfRU5BLCBXTTUxMDBfQUNDREVUX0VOQSk7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfM19NQVNLLAorCQkJCSAgICBXTTUxMDBfSU1fQUNDREVUX0VJTlQsIDApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzNfTUFTSywKKwkJCQkgICAgV001MTAwX0lNX0hQREVUX0VJTlQgfAorCQkJCSAgICBXTTUxMDBfSU1fQUNDREVUX0VJTlQsCisJCQkJICAgIFdNNTEwMF9JTV9IUERFVF9FSU5UIHwKKwkJCQkgICAgV001MTAwX0lNX0FDQ0RFVF9FSU5UKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV001MTAwX01JQ19ERVRFQ1RfMSwKKwkJCQkgICAgV001MTAwX0FDQ0RFVF9FTkEsIDApOworCQl3bTUxMDAtPmphY2sgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd201MTAwX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhdGE7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpcnFyZXR1cm5fdCBzdGF0dXMgPSBJUlFfTk9ORTsKKwlpbnQgaXJxX3ZhbDsKKworCWlycV92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzMpOworCWlmIChpcnFfdmFsIDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBJUlEgc3RhdHVzIDM6ICVkXG4iLAorCQkJaXJxX3ZhbCk7CisJCWlycV92YWwgPSAwOworCX0KKwlpcnFfdmFsICY9IH5zbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzNfTUFTSyk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zLCBpcnFfdmFsKTsKKworCWlmIChpcnFfdmFsKQorCQlzdGF0dXMgPSBJUlFfSEFORExFRDsKKworCXdtNTEwMF9sb2dfc3RhdHVzMyhjb2RlYywgaXJxX3ZhbCk7CisKKwlpZiAoaXJxX3ZhbCAmIFdNNTEwMF9GTEwxX0xPQ0tfRUlOVCkgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJGTEwxIGxvY2tlZFxuIik7CisJCWNvbXBsZXRlKCZ3bTUxMDAtPmZsbFswXS5sb2NrKTsKKwl9CisJaWYgKGlycV92YWwgJiBXTTUxMDBfRkxMMl9MT0NLX0VJTlQpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRkxMMiBsb2NrZWRcbiIpOworCQljb21wbGV0ZSgmd201MTAwLT5mbGxbMV0ubG9jayk7CisJfQorCisJaWYgKGlycV92YWwgJiBXTTUxMDBfQUNDREVUX0VJTlQpCisJCXdtNTEwMF9taWNkX2lycShjb2RlYyk7CisKKwlpcnFfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU180KTsKKwlpZiAoaXJxX3ZhbCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgSVJRIHN0YXR1cyA0OiAlZFxuIiwKKwkJCWlycV92YWwpOworCQlpcnFfdmFsID0gMDsKKwl9CisJaXJxX3ZhbCAmPSB+c25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU180X01BU0spOworCisJaWYgKGlycV92YWwpCisJCXN0YXR1cyA9IElSUV9IQU5ETEVEOworCisJc25kX3NvY193cml0ZShjb2RlYywgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfNCwgaXJxX3ZhbCk7CisKKwl3bTUxMDBfbG9nX3N0YXR1czQoY29kZWMsIGlycV92YWwpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlycXJldHVybl90IHdtNTEwMF9lZGdlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCWlycXJldHVybl90IHZhbDsKKworCWRvIHsKKwkJdmFsID0gd201MTAwX2lycShpcnEsIGRhdGEpOworCQlpZiAodmFsICE9IElSUV9OT05FKQorCQkJcmV0ID0gdmFsOworCX0gd2hpbGUgKHZhbCAhPSBJUlFfTk9ORSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHdtNTEwMF9wcml2ICpncGlvX3RvX3dtNTEwMChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQoreworCXJldHVybiBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHdtNTEwMF9wcml2LCBncGlvX2NoaXApOworfQorCitzdGF0aWMgdm9pZCB3bTUxMDBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBncGlvX3RvX3dtNTEwMChjaGlwKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTUxMDAtPmNvZGVjOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV001MTAwX0dQSU9fQ1RSTF8xICsgb2Zmc2V0LAorCQkJICAgIFdNNTEwMF9HUDFfTFZMLCAhIXZhbHVlIDw8IFdNNTEwMF9HUDFfTFZMX1NISUZUKTsKK30KKworc3RhdGljIGludCB3bTUxMDBfZ3Bpb19kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IGdwaW9fdG9fd201MTAwKGNoaXApOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdtNTEwMC0+Y29kZWM7CisJaW50IHZhbCwgcmV0OworCisJdmFsID0gKDEgPDwgV001MTAwX0dQMV9GTl9TSElGVCkgfCAoISF2YWx1ZSA8PCBXTTUxMDBfR1AxX0xWTF9TSElGVCk7CisKKwlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfR1BJT19DVFJMXzEgKyBvZmZzZXQsCisJCQkJICBXTTUxMDBfR1AxX0ZOX01BU0sgfCBXTTUxMDBfR1AxX0RJUiB8CisJCQkJICBXTTUxMDBfR1AxX0xWTCwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtNTEwMF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBncGlvX3RvX3dtNTEwMChjaGlwKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTUxMDAtPmNvZGVjOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9HUElPX0NUUkxfMSArIG9mZnNldCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKHJldCAmIFdNNTEwMF9HUDFfTFZMKSAhPSAwOworfQorCitzdGF0aWMgaW50IHdtNTEwMF9ncGlvX2RpcmVjdGlvbl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBncGlvX3RvX3dtNTEwMChjaGlwKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTUxMDAtPmNvZGVjOworCisJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9HUElPX0NUUkxfMSArIG9mZnNldCwKKwkJCQkgICBXTTUxMDBfR1AxX0ZOX01BU0sgfCBXTTUxMDBfR1AxX0RJUiwKKwkJCQkgICAoMSA8PCBXTTUxMDBfR1AxX0ZOX1NISUZUKSB8CisJCQkJICAgKDEgPDwgV001MTAwX0dQMV9ESVJfU0hJRlQpKTsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgd201MTAwX3RlbXBsYXRlX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAid201MTAwIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gd201MTAwX2dwaW9fZGlyZWN0aW9uX291dCwKKwkuc2V0CQkJPSB3bTUxMDBfZ3Bpb19zZXQsCisJLmRpcmVjdGlvbl9pbnB1dAk9IHdtNTEwMF9ncGlvX2RpcmVjdGlvbl9pbiwKKwkuZ2V0CQkJPSB3bTUxMDBfZ3Bpb19nZXQsCisJLmNhbl9zbGVlcAkJPSAxLAorfTsKKworc3RhdGljIHZvaWQgd201MTAwX2luaXRfZ3BpbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCisJd201MTAwLT5ncGlvX2NoaXAgPSB3bTUxMDBfdGVtcGxhdGVfY2hpcDsKKwl3bTUxMDAtPmdwaW9fY2hpcC5uZ3BpbyA9IDY7CisJd201MTAwLT5ncGlvX2NoaXAuZGV2ID0gY29kZWMtPmRldjsKKworCWlmICh3bTUxMDAtPnBkYXRhLmdwaW9fYmFzZSkKKwkJd201MTAwLT5ncGlvX2NoaXAuYmFzZSA9IHdtNTEwMC0+cGRhdGEuZ3Bpb19iYXNlOworCWVsc2UKKwkJd201MTAwLT5ncGlvX2NoaXAuYmFzZSA9IC0xOworCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZ3bTUxMDAtPmdwaW9fY2hpcCk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gYWRkIEdQSU9zOiAlZFxuIiwgcmV0KTsKK30KKworc3RhdGljIHZvaWQgd201MTAwX2ZyZWVfZ3BpbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZ3bTUxMDAtPmdwaW9fY2hpcCk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVtb3ZlIEdQSU9zOiAlZFxuIiwgcmV0KTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCB3bTUxMDBfaW5pdF9ncGlvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKK30KKworc3RhdGljIHZvaWQgd201MTAwX2ZyZWVfZ3BpbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB3bTUxMDBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSB0b19pMmNfY2xpZW50KGNvZGVjLT5kZXYpOworCXN0cnVjdCB3bTUxMDBfcHJpdiAqd201MTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCwgaSwgaXJxX2ZsYWdzOworCisJd201MTAwLT5jb2RlYyA9IGNvZGVjOworCisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19JMkMpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod201MTAwLT5jb3JlX3N1cHBsaWVzKTsgaSsrKQorCQl3bTUxMDAtPmNvcmVfc3VwcGxpZXNbaV0uc3VwcGx5ID0gd201MTAwX2NvcmVfc3VwcGx5X25hbWVzW2ldOworCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZ2V0KCZpMmMtPmRldiwgQVJSQVlfU0laRSh3bTUxMDAtPmNvcmVfc3VwcGxpZXMpLAorCQkJCSB3bTUxMDAtPmNvcmVfc3VwcGxpZXMpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBjb3JlIHN1cHBsaWVzOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJd201MTAwLT5jcHZkZCA9IHJlZ3VsYXRvcl9nZXQoJmkyYy0+ZGV2LCAiQ1BWREQiKTsKKwlpZiAoSVNfRVJSKHdtNTEwMC0+Y3B2ZGQpKSB7CisJCXJldCA9IFBUUl9FUlIod201MTAwLT5jcHZkZCk7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGdldCBDUFZERDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2NvcmU7CisJfQorCisJd201MTAwLT5kYnZkZDIgPSByZWd1bGF0b3JfZ2V0KCZpMmMtPmRldiwgIkRCVkREMiIpOworCWlmIChJU19FUlIod201MTAwLT5kYnZkZDIpKSB7CisJCXJldCA9IFBUUl9FUlIod201MTAwLT5kYnZkZDIpOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBnZXQgREJWREQyOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfY3B2ZGQ7CisJfQorCisJd201MTAwLT5kYnZkZDMgPSByZWd1bGF0b3JfZ2V0KCZpMmMtPmRldiwgIkRCVkREMyIpOworCWlmIChJU19FUlIod201MTAwLT5kYnZkZDMpKSB7CisJCXJldCA9IFBUUl9FUlIod201MTAwLT5kYnZkZDMpOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBnZXQgREJWREQyOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZGJ2ZGQyOworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtNTEwMC0+Y29yZV9zdXBwbGllcyksCisJCQkJICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgY29yZSBzdXBwbGllczogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9kYnZkZDM7CisJfQorCisJaWYgKHdtNTEwMC0+cGRhdGEubGRvX2VuYSkgeworCQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHdtNTEwMC0+cGRhdGEubGRvX2VuYSwKKwkJCQkgICAgICAgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIldNNTEwMCBMRE9FTkEiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgTERPRU5BICVkOiAlZFxuIiwKKwkJCQl3bTUxMDAtPnBkYXRhLmxkb19lbmEsIHJldCk7CisJCQlnb3RvIGVycl9lbmFibGU7CisJCX0KKwkJbXNsZWVwKDIpOworCX0KKworCWlmICh3bTUxMDAtPnBkYXRhLnJlc2V0KSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUod201MTAwLT5wZGF0YS5yZXNldCwKKwkJCQkgICAgICAgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIldNNTEwMCAvUkVTRVQiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgL1JFU0VUICVkOiAlZFxuIiwKKwkJCQl3bTUxMDAtPnBkYXRhLnJlc2V0LCByZXQpOworCQkJZ290byBlcnJfbGRvOworCQl9CisJfQorCisJcmV0ID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfU09GVFdBUkVfUkVTRVQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZWFkIElEIHJlZ2lzdGVyXG4iKTsKKwkJZ290byBlcnJfcmVzZXQ7CisJfQorCXN3aXRjaCAocmV0KSB7CisJY2FzZSAweDg5OTc6CisJY2FzZSAweDUxMDA6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRGV2aWNlIGlzIG5vdCBhIFdNNTEwMCwgSUQgaXMgJXhcbiIsIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3Jlc2V0OworCX0KKworCXJldCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV001MTAwX0RFVklDRV9SRVZJU0lPTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgcmV2aXNpb24gcmVnaXN0ZXJcbiIpOworCQlnb3RvIGVycl9yZXNldDsKKwl9CisJd201MTAwLT5yZXYgPSByZXQgJiBXTTUxMDBfREVWSUNFX1JFVklTSU9OX01BU0s7CisKKwlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAicmV2aXNpb24gJWNcbiIsIHdtNTEwMC0+cmV2ICsgJ0EnKTsKKworCXJldCA9IHdtNTEwMF9yZXNldChjb2RlYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKKwkJZ290byBlcnJfcmVzZXQ7CisJfQorCisJY29kZWMtPmNhY2hlX29ubHkgPSB0cnVlOworCisJd201MTAwX2luaXRfZ3Bpbyhjb2RlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTUxMDBfZGlnX3Z1KTsgaSsrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB3bTUxMDBfZGlnX3Z1W2ldLCBXTTUxMDBfT1VUX1ZVLAorCQkJCSAgICBXTTUxMDBfT1VUX1ZVKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtNTEwMC0+cGRhdGEuaW5fbW9kZSk7IGkrKykgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfSU4xTF9DT05UUk9MLAorCQkJCSAgICBXTTUxMDBfSU4xX01PREVfTUFTSyB8CisJCQkJICAgIFdNNTEwMF9JTjFfRE1JQ19TVVBfTUFTSywKKwkJCQkgICAgKHdtNTEwMC0+cGRhdGEuaW5fbW9kZVtpXSA8PAorCQkJCSAgICAgV001MTAwX0lOMV9NT0RFX1NISUZUKSB8CisJCQkJICAgICh3bTUxMDAtPnBkYXRhLmRtaWNfc3VwW2ldIDw8CisJCQkJICAgICBXTTUxMDBfSU4xX0RNSUNfU1VQX1NISUZUKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod201MTAwLT5wZGF0YS5ncGlvX2RlZmF1bHRzKTsgaSsrKSB7CisJCWlmICghd201MTAwLT5wZGF0YS5ncGlvX2RlZmF1bHRzW2ldKQorCQkJY29udGludWU7CisKKwkJc25kX3NvY193cml0ZShjb2RlYywgV001MTAwX0dQSU9fQ1RSTF8xICsgaSwKKwkJCSAgICAgIHdtNTEwMC0+cGRhdGEuZ3Bpb19kZWZhdWx0c1tpXSk7CisJfQorCisJLyogRG9uJ3QgZGVib3VuY2UgaW50ZXJydXB0cyB0byBzdXBwb3J0IHVzZSBvZiBTWVNDTEsgb25seSAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNNTEwMF9JUlFfREVCT1VOQ0VfMSwgMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV001MTAwX0lSUV9ERUJPVU5DRV8yLCAwKTsKKworCS8qIFRPRE86IGNoZWNrIGlmIHdlJ3JlIHN5bW1ldHJpYyAqLworCisJaWYgKGkyYy0+aXJxKSB7CisJCWlmICh3bTUxMDAtPnBkYXRhLmlycV9mbGFncykKKwkJCWlycV9mbGFncyA9IHdtNTEwMC0+cGRhdGEuaXJxX2ZsYWdzOworCQllbHNlCisJCQlpcnFfZmxhZ3MgPSBJUlFGX1RSSUdHRVJfTE9XOworCisJCWlycV9mbGFncyB8PSBJUlFGX09ORVNIT1Q7CisKKwkJaWYgKGlycV9mbGFncyAmIChJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcpKQorCQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaTJjLT5pcnEsIE5VTEwsCisJCQkJCQkgICB3bTUxMDBfZWRnZV9pcnEsCisJCQkJCQkgICBpcnFfZmxhZ3MsICJ3bTUxMDAiLCBjb2RlYyk7CisJCWVsc2UKKwkJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGkyYy0+aXJxLCBOVUxMLCB3bTUxMDBfaXJxLAorCQkJCQkJICAgaXJxX2ZsYWdzLCAid201MTAwIiwgY29kZWMpOworCisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRICVkOiAlZFxuIiwKKwkJCQlpMmMtPmlycSwgcmV0KTsKKwkJfSBlbHNlIHsKKwkJCS8qIEVuYWJsZSBkZWZhdWx0IGludGVycnVwdHMgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zX01BU0ssCisJCQkJCSAgICBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX1dBUk5fRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0lNX0FTUkMyX0xPQ0tfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfSU1fQVNSQzFfTE9DS19FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9JTV9GTEwyX0xPQ0tfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0NMS0dFTl9FUlJfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfQ0xLR0VOX0VSUl9BU1lOQ19FSU5ULCAwKTsKKworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzRfTUFTSywKKwkJCQkJICAgIFdNNTEwMF9BSUYzX0VSUl9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9BSUYyX0VSUl9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9BSUYxX0VSUl9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9DVFJMSUZfRVJSX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9JU1JDMV9VTkRFUkNMT0NLRURfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0FJRjJfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0RBQ19VTkRFUkNMT0NLRURfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfQURDX1VOREVSQ0xPQ0tFRF9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVCwgMCk7CisJCX0KKwl9IGVsc2UgeworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKCZjb2RlYy0+ZGFwbSwKKwkJCQkJICB3bTUxMDBfZGFwbV93aWRnZXRzX25vaXJxLAorCQkJCQkgIEFSUkFZX1NJWkUod201MTAwX2RhcG1fd2lkZ2V0c19ub2lycSkpOworCX0KKworCWlmICh3bTUxMDAtPnBkYXRhLmhwX3BvbCkgeworCQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHdtNTEwMC0+cGRhdGEuaHBfcG9sLAorCQkJCSAgICAgICBHUElPRl9PVVRfSU5JVF9ISUdILCAiV001MTAwIEhQX1BPTCIpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBIUF9QT0wgJWQ6ICVkXG4iLAorCQkJCXdtNTEwMC0+cGRhdGEuaHBfcG9sLCByZXQpOworCQkJZ290byBlcnJfZ3BpbzsKKwkJfQorCX0KKworCS8qIFdlJ2xsIGdldCB3b2tlbiB1cCBhZ2FpbiB3aGVuIHRoZSBzeXN0ZW0gaGFzIHNvbWV0aGluZyB1c2VmdWwKKwkgKiBmb3IgdXMgdG8gZG8uCisJICovCisJaWYgKHdtNTEwMC0+cGRhdGEubGRvX2VuYSkKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod201MTAwLT5wZGF0YS5sZG9fZW5hLCAwKTsKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod201MTAwLT5jb3JlX3N1cHBsaWVzKSwKKwkJCSAgICAgICB3bTUxMDAtPmNvcmVfc3VwcGxpZXMpOworCisJcmV0dXJuIDA7CisKK2Vycl9ncGlvOgorCWlmIChpMmMtPmlycSkKKwkJZnJlZV9pcnEoaTJjLT5pcnEsIGNvZGVjKTsKKwl3bTUxMDBfZnJlZV9ncGlvKGNvZGVjKTsKK2Vycl9yZXNldDoKKwlpZiAod201MTAwLT5wZGF0YS5yZXNldCkgeworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh3bTUxMDAtPnBkYXRhLnJlc2V0LCAxKTsKKwkJZ3Bpb19mcmVlKHdtNTEwMC0+cGRhdGEucmVzZXQpOworCX0KK2Vycl9sZG86CisJaWYgKHdtNTEwMC0+cGRhdGEubGRvX2VuYSkgeworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh3bTUxMDAtPnBkYXRhLmxkb19lbmEsIDApOworCQlncGlvX2ZyZWUod201MTAwLT5wZGF0YS5sZG9fZW5hKTsKKwl9CitlcnJfZW5hYmxlOgorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRSh3bTUxMDAtPmNvcmVfc3VwcGxpZXMpLAorCQkJICAgICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CitlcnJfZGJ2ZGQzOgorCXJlZ3VsYXRvcl9wdXQod201MTAwLT5kYnZkZDMpOworZXJyX2RidmRkMjoKKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+ZGJ2ZGQyKTsKK2Vycl9jcHZkZDoKKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+Y3B2ZGQpOworZXJyX2NvcmU6CisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtNTEwMC0+Y29yZV9zdXBwbGllcyksCisJCQkgICAgd201MTAwLT5jb3JlX3N1cHBsaWVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd201MTAwX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKKworCXdtNTEwMF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJaWYgKHdtNTEwMC0+cGRhdGEuaHBfcG9sKSB7CisJCWdwaW9fZnJlZSh3bTUxMDAtPnBkYXRhLmhwX3BvbCk7CisJfQorCWlmIChpMmMtPmlycSkKKwkJZnJlZV9pcnEoaTJjLT5pcnEsIGNvZGVjKTsKKwl3bTUxMDBfZnJlZV9ncGlvKGNvZGVjKTsKKwlpZiAod201MTAwLT5wZGF0YS5yZXNldCkgeworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh3bTUxMDAtPnBkYXRhLnJlc2V0LCAxKTsKKwkJZ3Bpb19mcmVlKHdtNTEwMC0+cGRhdGEucmVzZXQpOworCX0KKwlpZiAod201MTAwLT5wZGF0YS5sZG9fZW5hKSB7CisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHdtNTEwMC0+cGRhdGEubGRvX2VuYSwgMCk7CisJCWdwaW9fZnJlZSh3bTUxMDAtPnBkYXRhLmxkb19lbmEpOworCX0KKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+ZGJ2ZGQzKTsKKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+ZGJ2ZGQyKTsKKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+Y3B2ZGQpOworCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRSh3bTUxMDAtPmNvcmVfc3VwcGxpZXMpLAorCQkJICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTUxMDAgPSB7CisJLnByb2JlID0Jd201MTAwX3Byb2JlLAorCS5yZW1vdmUgPQl3bTUxMDBfcmVtb3ZlLAorCisJLnNldF9zeXNjbGsgPSB3bTUxMDBfc2V0X3N5c2NsaywKKwkuc2V0X3BsbCA9IHdtNTEwMF9zZXRfZmxsLAorCS5zZXRfYmlhc19sZXZlbCA9IHdtNTEwMF9zZXRfYmlhc19sZXZlbCwKKwkuaWRsZV9iaWFzX29mZiA9IDEsCisKKwkuc2VxX25vdGlmaWVyID0gd201MTAwX3NlcV9ub3RpZmllciwKKwkuY29udHJvbHMgPSB3bTUxMDBfc25kX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtNTEwMF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSB3bTUxMDBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTUxMDBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSB3bTUxMDBfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod201MTAwX2RhcG1fcm91dGVzKSwKKworCS5yZWdfY2FjaGVfc2l6ZSA9IEFSUkFZX1NJWkUod201MTAwX3JlZ19kZWZhdWx0cyksCisJLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTE2KSwKKwkuY29tcHJlc3NfdHlwZSA9IFNORF9TT0NfUkJUUkVFX0NPTVBSRVNTSU9OLAorCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtNTEwMF9yZWdfZGVmYXVsdHMsCisKKwkudm9sYXRpbGVfcmVnaXN0ZXIgPSB3bTUxMDBfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLnJlYWRhYmxlX3JlZ2lzdGVyID0gd201MTAwX3JlYWRhYmxlX3JlZ2lzdGVyLAorfTsKKworc3RhdGljIF9fZGV2aW5pdCBpbnQgd201MTAwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgd201MTAwX3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmkyYy0+ZGV2KTsKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMDsKKwlpbnQgcmV0LCBpOworCisJd201MTAwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdtNTEwMF9wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHdtNTEwMCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtNTEwMC0+ZmxsKTsgaSsrKQorCQlpbml0X2NvbXBsZXRpb24oJndtNTEwMC0+ZmxsW2ldLmxvY2spOworCisJaWYgKHBkYXRhKQorCQl3bTUxMDAtPnBkYXRhID0gKnBkYXRhOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd201MTAwKTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAorCQkJCSAgICAgJnNvY19jb2RlY19kZXZfd201MTAwLCB3bTUxMDBfZGFpLAorCQkJCSAgICAgQVJSQVlfU0laRSh3bTUxMDBfZGFpKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgV001MTAwOiAlZFxuIiwgcmV0KTsKKwkJa2ZyZWUod201MTAwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgX19kZXZleGl0IGludCB3bTUxMDBfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtNTEwMF9pMmNfaWRbXSA9IHsKKwl7ICJ3bTUxMDAiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtNTEwMF9pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd201MTAwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid201MTAwIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSAgICB3bTUxMDBfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtNTEwMF9pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSB3bTUxMDBfaTJjX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd201MTAwX21vZGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJndtNTEwMF9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHdtNTEwMF9tb2Rpbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHdtNTEwMF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJndtNTEwMF9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHdtNTEwMF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFdNNTEwMCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDAuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwNzU5NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmgKQEAgLTAsMCArMSw1MTU1IEBACisvKgorICogd201MTAwLmggIC0tICBXTTUxMDAgQUxTQSBTb0MgQXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTEgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBXTTUxMDBfQVNPQ19ICisjZGVmaW5lIFdNNTEwMF9BU09DX0gKKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCitpbnQgd201MTAwX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2spOworCisjZGVmaW5lIFdNNTEwMF9DTEtfQUlGMSAgICAgMQorI2RlZmluZSBXTTUxMDBfQ0xLX0FJRjIgICAgIDIKKyNkZWZpbmUgV001MTAwX0NMS19BSUYzICAgICAzCisjZGVmaW5lIFdNNTEwMF9DTEtfU1lTQ0xLICAgNAorI2RlZmluZSBXTTUxMDBfQ0xLX0FTWU5DQ0xLIDUKKyNkZWZpbmUgV001MTAwX0NMS18zMktIWiAgICA2CisjZGVmaW5lIFdNNTEwMF9DTEtfT1BDTEsgICAgNworCisjZGVmaW5lIFdNNTEwMF9DTEtTUkNfTUNMSzEgICAgMAorI2RlZmluZSBXTTUxMDBfQ0xLU1JDX01DTEsyICAgIDEKKyNkZWZpbmUgV001MTAwX0NMS1NSQ19TWVNDTEsgICAyCisjZGVmaW5lIFdNNTEwMF9DTEtTUkNfRkxMMSAgICAgNAorI2RlZmluZSBXTTUxMDBfQ0xLU1JDX0ZMTDIgICAgIDUKKyNkZWZpbmUgV001MTAwX0NMS1NSQ19BSUYxQkNMSyA4CisjZGVmaW5lIFdNNTEwMF9DTEtTUkNfQUlGMkJDTEsgOQorI2RlZmluZSBXTTUxMDBfQ0xLU1JDX0FJRjNCQ0xLIDEwCisjZGVmaW5lIFdNNTEwMF9DTEtTUkNfQVNZTkNDTEsgMHgxMDAKKworI2RlZmluZSBXTTUxMDBfRkxMMSAxCisjZGVmaW5lIFdNNTEwMF9GTEwyIDIKKworI2RlZmluZSBXTTUxMDBfRkxMX1NSQ19NQ0xLMSAgICAweDAKKyNkZWZpbmUgV001MTAwX0ZMTF9TUkNfTUNMSzIgICAgMHgxCisjZGVmaW5lIFdNNTEwMF9GTExfU1JDX0ZMTDEgICAgIDB4NAorI2RlZmluZSBXTTUxMDBfRkxMX1NSQ19GTEwyICAgICAweDUKKyNkZWZpbmUgV001MTAwX0ZMTF9TUkNfQUlGMUJDTEsgMHg4CisjZGVmaW5lIFdNNTEwMF9GTExfU1JDX0FJRjJCQ0xLIDB4OQorI2RlZmluZSBXTTUxMDBfRkxMX1NSQ19BSUYzQkNMSyAweGEKKworLyoKKyAqIFJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBXTTUxMDBfU09GVFdBUkVfUkVTRVQgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBXTTUxMDBfREVWSUNFX1JFVklTSU9OICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTUxMDBfQ1RSTF9JRl8xICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTUxMDBfVE9ORV9HRU5FUkFUT1JfMSAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBXTTUxMDBfUFdNX0RSSVZFXzEgICAgICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBXTTUxMDBfUFdNX0RSSVZFXzIgICAgICAgICAgICAgICAgICAgICAgMHgzMQorI2RlZmluZSBXTTUxMDBfUFdNX0RSSVZFXzMgICAgICAgICAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBXTTUxMDBfQ0xPQ0tJTkdfMSAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgV001MTAwX0NMT0NLSU5HXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxCisjZGVmaW5lIFdNNTEwMF9DTE9DS0lOR180ICAgICAgICAgICAgICAgICAgICAgICAweDEwMgorI2RlZmluZSBXTTUxMDBfQ0xPQ0tJTkdfNSAgICAgICAgICAgICAgICAgICAgICAgMHgxMDMKKyNkZWZpbmUgV001MTAwX0NMT0NLSU5HXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MTA0CisjZGVmaW5lIFdNNTEwMF9DTE9DS0lOR183ICAgICAgICAgICAgICAgICAgICAgICAweDEwNworI2RlZmluZSBXTTUxMDBfQ0xPQ0tJTkdfOCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDgKKyNkZWZpbmUgV001MTAwX0FTUkNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MTIwCisjZGVmaW5lIFdNNTEwMF9BU1JDX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweDEyMQorI2RlZmluZSBXTTUxMDBfQVNSQ19SQVRFMSAgICAgICAgICAgICAgICAgICAgICAgMHgxMjIKKyNkZWZpbmUgV001MTAwX0lTUkNfMV9DVFJMXzEgICAgICAgICAgICAgICAgICAgIDB4MTQxCisjZGVmaW5lIFdNNTEwMF9JU1JDXzFfQ1RSTF8yICAgICAgICAgICAgICAgICAgICAweDE0MgorI2RlZmluZSBXTTUxMDBfSVNSQ18yX0NUUkwxICAgICAgICAgICAgICAgICAgICAgMHgxNDMKKyNkZWZpbmUgV001MTAwX0lTUkNfMl9DVFJMXzIgICAgICAgICAgICAgICAgICAgIDB4MTQ0CisjZGVmaW5lIFdNNTEwMF9GTEwxX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAweDE4MgorI2RlZmluZSBXTTUxMDBfRkxMMV9DT05UUk9MXzIgICAgICAgICAgICAgICAgICAgMHgxODMKKyNkZWZpbmUgV001MTAwX0ZMTDFfQ09OVFJPTF8zICAgICAgICAgICAgICAgICAgIDB4MTg0CisjZGVmaW5lIFdNNTEwMF9GTEwxX0NPTlRST0xfNSAgICAgICAgICAgICAgICAgICAweDE4NgorI2RlZmluZSBXTTUxMDBfRkxMMV9DT05UUk9MXzYgICAgICAgICAgICAgICAgICAgMHgxODcKKyNkZWZpbmUgV001MTAwX0ZMTDFfRUZTXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MTg4CisjZGVmaW5lIFdNNTEwMF9GTEwyX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAweDFBMgorI2RlZmluZSBXTTUxMDBfRkxMMl9DT05UUk9MXzIgICAgICAgICAgICAgICAgICAgMHgxQTMKKyNkZWZpbmUgV001MTAwX0ZMTDJfQ09OVFJPTF8zICAgICAgICAgICAgICAgICAgIDB4MUE0CisjZGVmaW5lIFdNNTEwMF9GTEwyX0NPTlRST0xfNSAgICAgICAgICAgICAgICAgICAweDFBNgorI2RlZmluZSBXTTUxMDBfRkxMMl9DT05UUk9MXzYgICAgICAgICAgICAgICAgICAgMHgxQTcKKyNkZWZpbmUgV001MTAwX0ZMTDJfRUZTXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MUE4CisjZGVmaW5lIFdNNTEwMF9NSUNfQ0hBUkdFX1BVTVBfMSAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBXTTUxMDBfTUlDX0NIQVJHRV9QVU1QXzIgICAgICAgICAgICAgICAgMHgyMDEKKyNkZWZpbmUgV001MTAwX0hQX0NIQVJHRV9QVU1QXzEgICAgICAgICAgICAgICAgIDB4MjAyCisjZGVmaW5lIFdNNTEwMF9MRE8xX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDIxMQorI2RlZmluZSBXTTUxMDBfTUlDX0JJQVNfQ1RSTF8xICAgICAgICAgICAgICAgICAgMHgyMTUKKyNkZWZpbmUgV001MTAwX01JQ19CSUFTX0NUUkxfMiAgICAgICAgICAgICAgICAgIDB4MjE2CisjZGVmaW5lIFdNNTEwMF9NSUNfQklBU19DVFJMXzMgICAgICAgICAgICAgICAgICAweDIxNworI2RlZmluZSBXTTUxMDBfQUNDRVNTT1JZX0RFVEVDVF9NT0RFXzEgICAgICAgICAgMHgyODAKKyNkZWZpbmUgV001MTAwX0hFQURQSE9ORV9ERVRFQ1RfMSAgICAgICAgICAgICAgIDB4Mjg4CisjZGVmaW5lIFdNNTEwMF9IRUFEUEhPTkVfREVURUNUXzIgICAgICAgICAgICAgICAweDI4OQorI2RlZmluZSBXTTUxMDBfTUlDX0RFVEVDVF8xICAgICAgICAgICAgICAgICAgICAgMHgyOTAKKyNkZWZpbmUgV001MTAwX01JQ19ERVRFQ1RfMiAgICAgICAgICAgICAgICAgICAgIDB4MjkxCisjZGVmaW5lIFdNNTEwMF9NSUNfREVURUNUXzMgICAgICAgICAgICAgICAgICAgICAweDI5MgorI2RlZmluZSBXTTUxMDBfTUlTQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgyQkIKKyNkZWZpbmUgV001MTAwX0lOUFVUX0VOQUJMRVMgICAgICAgICAgICAgICAgICAgIDB4MzAxCisjZGVmaW5lIFdNNTEwMF9JTlBVVF9FTkFCTEVTX1NUQVRVUyAgICAgICAgICAgICAweDMwMgorI2RlZmluZSBXTTUxMDBfSU4xTF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgzMTAKKyNkZWZpbmUgV001MTAwX0lOMVJfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MzExCisjZGVmaW5lIFdNNTEwMF9JTjJMX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDMxMgorI2RlZmluZSBXTTUxMDBfSU4yUl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgzMTMKKyNkZWZpbmUgV001MTAwX0lOM0xfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MzE0CisjZGVmaW5lIFdNNTEwMF9JTjNSX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDMxNQorI2RlZmluZSBXTTUxMDBfSU40TF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgzMTYKKyNkZWZpbmUgV001MTAwX0lONFJfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MzE3CisjZGVmaW5lIFdNNTEwMF9SWEFOQ19TUkMgICAgICAgICAgICAgICAgICAgICAgICAweDMxOAorI2RlZmluZSBXTTUxMDBfSU5QVVRfVk9MVU1FX1JBTVAgICAgICAgICAgICAgICAgMHgzMTkKKyNkZWZpbmUgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8xTCAgICAgICAgICAgIDB4MzIwCisjZGVmaW5lIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMVIgICAgICAgICAgICAweDMyMQorI2RlZmluZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzJMICAgICAgICAgICAgMHgzMjIKKyNkZWZpbmUgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8yUiAgICAgICAgICAgIDB4MzIzCisjZGVmaW5lIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfM0wgICAgICAgICAgICAweDMyNAorI2RlZmluZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzNSICAgICAgICAgICAgMHgzMjUKKyNkZWZpbmUgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV80TCAgICAgICAgICAgIDB4MzI2CisjZGVmaW5lIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfNFIgICAgICAgICAgICAweDMyNworI2RlZmluZSBXTTUxMDBfT1VUUFVUX0VOQUJMRVNfMiAgICAgICAgICAgICAgICAgMHg0MDEKKyNkZWZpbmUgV001MTAwX09VVFBVVF9TVEFUVVNfMSAgICAgICAgICAgICAgICAgIDB4NDAyCisjZGVmaW5lIFdNNTEwMF9PVVRQVVRfU1RBVFVTXzIgICAgICAgICAgICAgICAgICAweDQwMworI2RlZmluZSBXTTUxMDBfQ0hBTk5FTF9FTkFCTEVTXzEgICAgICAgICAgICAgICAgMHg0MDgKKyNkZWZpbmUgV001MTAwX09VVF9WT0xVTUVfMUwgICAgICAgICAgICAgICAgICAgIDB4NDEwCisjZGVmaW5lIFdNNTEwMF9PVVRfVk9MVU1FXzFSICAgICAgICAgICAgICAgICAgICAweDQxMQorI2RlZmluZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF8xTCAgICAgICAgICAgICAgMHg0MTIKKyNkZWZpbmUgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfMVIgICAgICAgICAgICAgIDB4NDEzCisjZGVmaW5lIFdNNTEwMF9PVVRfVk9MVU1FXzJMICAgICAgICAgICAgICAgICAgICAweDQxNAorI2RlZmluZSBXTTUxMDBfT1VUX1ZPTFVNRV8yUiAgICAgICAgICAgICAgICAgICAgMHg0MTUKKyNkZWZpbmUgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfMkwgICAgICAgICAgICAgIDB4NDE2CisjZGVmaW5lIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzJSICAgICAgICAgICAgICAweDQxNworI2RlZmluZSBXTTUxMDBfT1VUX1ZPTFVNRV8zTCAgICAgICAgICAgICAgICAgICAgMHg0MTgKKyNkZWZpbmUgV001MTAwX09VVF9WT0xVTUVfM1IgICAgICAgICAgICAgICAgICAgIDB4NDE5CisjZGVmaW5lIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzNMICAgICAgICAgICAgICAweDQxQQorI2RlZmluZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF8zUiAgICAgICAgICAgICAgMHg0MUIKKyNkZWZpbmUgV001MTAwX09VVF9WT0xVTUVfNEwgICAgICAgICAgICAgICAgICAgIDB4NDFDCisjZGVmaW5lIFdNNTEwMF9PVVRfVk9MVU1FXzRSICAgICAgICAgICAgICAgICAgICAweDQxRAorI2RlZmluZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF81TCAgICAgICAgICAgICAgMHg0MUUKKyNkZWZpbmUgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfNVIgICAgICAgICAgICAgIDB4NDFGCisjZGVmaW5lIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzZMICAgICAgICAgICAgICAweDQyMAorI2RlZmluZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF82UiAgICAgICAgICAgICAgMHg0MjEKKyNkZWZpbmUgV001MTAwX0RBQ19BRUNfQ09OVFJPTF8xICAgICAgICAgICAgICAgIDB4NDQwCisjZGVmaW5lIFdNNTEwMF9PVVRQVVRfVk9MVU1FX1JBTVAgICAgICAgICAgICAgICAweDQ0MQorI2RlZmluZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzFMICAgICAgICAgICAgMHg0ODAKKyNkZWZpbmUgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8xUiAgICAgICAgICAgIDB4NDgxCisjZGVmaW5lIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfMkwgICAgICAgICAgICAweDQ4MgorI2RlZmluZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzJSICAgICAgICAgICAgMHg0ODMKKyNkZWZpbmUgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8zTCAgICAgICAgICAgIDB4NDg0CisjZGVmaW5lIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfM1IgICAgICAgICAgICAweDQ4NQorI2RlZmluZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzRMICAgICAgICAgICAgMHg0ODYKKyNkZWZpbmUgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV80UiAgICAgICAgICAgIDB4NDg3CisjZGVmaW5lIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNUwgICAgICAgICAgICAweDQ4OAorI2RlZmluZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzVSICAgICAgICAgICAgMHg0ODkKKyNkZWZpbmUgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV82TCAgICAgICAgICAgIDB4NDhBCisjZGVmaW5lIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNlIgICAgICAgICAgICAweDQ4QgorI2RlZmluZSBXTTUxMDBfUERNX1NQSzFfQ1RSTF8xICAgICAgICAgICAgICAgICAgMHg0QzAKKyNkZWZpbmUgV001MTAwX1BETV9TUEsxX0NUUkxfMiAgICAgICAgICAgICAgICAgIDB4NEMxCisjZGVmaW5lIFdNNTEwMF9QRE1fU1BLMl9DVFJMXzEgICAgICAgICAgICAgICAgICAweDRDMgorI2RlZmluZSBXTTUxMDBfUERNX1NQSzJfQ1RSTF8yICAgICAgICAgICAgICAgICAgMHg0QzMKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMSAgICAgICAgICAgICAgICAgICAgIDB4NTAwCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzIgICAgICAgICAgICAgICAgICAgICAweDUwMQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8zICAgICAgICAgICAgICAgICAgICAgMHg1MDIKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfNCAgICAgICAgICAgICAgICAgICAgIDB4NTAzCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzUgICAgICAgICAgICAgICAgICAgICAweDUwNAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV82ICAgICAgICAgICAgICAgICAgICAgMHg1MDUKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfNyAgICAgICAgICAgICAgICAgICAgIDB4NTA2CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzggICAgICAgICAgICAgICAgICAgICAweDUwNworI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV85ICAgICAgICAgICAgICAgICAgICAgMHg1MDgKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMTAgICAgICAgICAgICAgICAgICAgIDB4NTA5CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzExICAgICAgICAgICAgICAgICAgICAweDUwQQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8xMiAgICAgICAgICAgICAgICAgICAgMHg1MEIKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMTMgICAgICAgICAgICAgICAgICAgIDB4NTBDCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzE0ICAgICAgICAgICAgICAgICAgICAweDUwRAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8xNSAgICAgICAgICAgICAgICAgICAgMHg1MEUKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMTYgICAgICAgICAgICAgICAgICAgIDB4NTBGCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzE3ICAgICAgICAgICAgICAgICAgICAweDUxMAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8xOCAgICAgICAgICAgICAgICAgICAgMHg1MTEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMTkgICAgICAgICAgICAgICAgICAgIDB4NTEyCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzIwICAgICAgICAgICAgICAgICAgICAweDUxMworI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8yMSAgICAgICAgICAgICAgICAgICAgMHg1MTQKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMjIgICAgICAgICAgICAgICAgICAgIDB4NTE1CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzIzICAgICAgICAgICAgICAgICAgICAweDUxNgorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8yNCAgICAgICAgICAgICAgICAgICAgMHg1MTcKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMjUgICAgICAgICAgICAgICAgICAgIDB4NTE4CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzI2ICAgICAgICAgICAgICAgICAgICAweDUxOQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8yNyAgICAgICAgICAgICAgICAgICAgMHg1MUEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfMSAgICAgICAgICAgICAgICAgICAgIDB4NTQwCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzIgICAgICAgICAgICAgICAgICAgICAweDU0MQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl8zICAgICAgICAgICAgICAgICAgICAgMHg1NDIKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfNCAgICAgICAgICAgICAgICAgICAgIDB4NTQzCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzUgICAgICAgICAgICAgICAgICAgICAweDU0NAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl82ICAgICAgICAgICAgICAgICAgICAgMHg1NDUKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfNyAgICAgICAgICAgICAgICAgICAgIDB4NTQ2CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzggICAgICAgICAgICAgICAgICAgICAweDU0NworI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl85ICAgICAgICAgICAgICAgICAgICAgMHg1NDgKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfMTAgICAgICAgICAgICAgICAgICAgIDB4NTQ5CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzExICAgICAgICAgICAgICAgICAgICAweDU0QQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl8xOCAgICAgICAgICAgICAgICAgICAgMHg1NTEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfMTkgICAgICAgICAgICAgICAgICAgIDB4NTUyCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzI2ICAgICAgICAgICAgICAgICAgICAweDU1OQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl8yNyAgICAgICAgICAgICAgICAgICAgMHg1NUEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfMSAgICAgICAgICAgICAgICAgICAgIDB4NTgwCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzIgICAgICAgICAgICAgICAgICAgICAweDU4MQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM18zICAgICAgICAgICAgICAgICAgICAgMHg1ODIKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfNCAgICAgICAgICAgICAgICAgICAgIDB4NTgzCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzUgICAgICAgICAgICAgICAgICAgICAweDU4NAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM182ICAgICAgICAgICAgICAgICAgICAgMHg1ODUKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfNyAgICAgICAgICAgICAgICAgICAgIDB4NTg2CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzggICAgICAgICAgICAgICAgICAgICAweDU4NworI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM185ICAgICAgICAgICAgICAgICAgICAgMHg1ODgKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfMTAgICAgICAgICAgICAgICAgICAgIDB4NTg5CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzExICAgICAgICAgICAgICAgICAgICAweDU4QQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM18xOCAgICAgICAgICAgICAgICAgICAgMHg1OTEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfMTkgICAgICAgICAgICAgICAgICAgIDB4NTkyCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzI2ICAgICAgICAgICAgICAgICAgICAweDU5OQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM18yNyAgICAgICAgICAgICAgICAgICAgMHg1OUEKKyNkZWZpbmUgV001MTAwX1BXTTFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgIDB4NjQwCisjZGVmaW5lIFdNNTEwMF9QV00xTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgICAweDY0MQorI2RlZmluZSBXTTUxMDBfUFdNMU1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAgMHg2NDIKKyNkZWZpbmUgV001MTAwX1BXTTFNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgIDB4NjQzCisjZGVmaW5lIFdNNTEwMF9QV00xTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgICAweDY0NAorI2RlZmluZSBXTTUxMDBfUFdNMU1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAgMHg2NDUKKyNkZWZpbmUgV001MTAwX1BXTTFNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgIDB4NjQ2CisjZGVmaW5lIFdNNTEwMF9QV00xTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgICAweDY0NworI2RlZmluZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAgMHg2NDgKKyNkZWZpbmUgV001MTAwX1BXTTJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgIDB4NjQ5CisjZGVmaW5lIFdNNTEwMF9QV00yTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgICAweDY0QQorI2RlZmluZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAgMHg2NEIKKyNkZWZpbmUgV001MTAwX1BXTTJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgIDB4NjRDCisjZGVmaW5lIFdNNTEwMF9QV00yTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgICAweDY0RAorI2RlZmluZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAgMHg2NEUKKyNkZWZpbmUgV001MTAwX1BXTTJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgIDB4NjRGCisjZGVmaW5lIFdNNTEwMF9PVVQxTE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDY4MAorI2RlZmluZSBXTTUxMDBfT1VUMUxNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg2ODEKKyNkZWZpbmUgV001MTAwX09VVDFMTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4NjgyCisjZGVmaW5lIFdNNTEwMF9PVVQxTE1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDY4MworI2RlZmluZSBXTTUxMDBfT1VUMUxNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg2ODQKKyNkZWZpbmUgV001MTAwX09VVDFMTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4Njg1CisjZGVmaW5lIFdNNTEwMF9PVVQxTE1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDY4NgorI2RlZmluZSBXTTUxMDBfT1VUMUxNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg2ODcKKyNkZWZpbmUgV001MTAwX09VVDFSTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4Njg4CisjZGVmaW5lIFdNNTEwMF9PVVQxUk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDY4OQorI2RlZmluZSBXTTUxMDBfT1VUMVJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg2OEEKKyNkZWZpbmUgV001MTAwX09VVDFSTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4NjhCCisjZGVmaW5lIFdNNTEwMF9PVVQxUk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDY4QworI2RlZmluZSBXTTUxMDBfT1VUMVJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg2OEQKKyNkZWZpbmUgV001MTAwX09VVDFSTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4NjhFCisjZGVmaW5lIFdNNTEwMF9PVVQxUk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDY4RgorI2RlZmluZSBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg2OTAKKyNkZWZpbmUgV001MTAwX09VVDJMTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4NjkxCisjZGVmaW5lIFdNNTEwMF9PVVQyTE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDY5MgorI2RlZmluZSBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg2OTMKKyNkZWZpbmUgV001MTAwX09VVDJMTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4Njk0CisjZGVmaW5lIFdNNTEwMF9PVVQyTE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDY5NQorI2RlZmluZSBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg2OTYKKyNkZWZpbmUgV001MTAwX09VVDJMTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4Njk3CisjZGVmaW5lIFdNNTEwMF9PVVQyUk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDY5OAorI2RlZmluZSBXTTUxMDBfT1VUMlJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg2OTkKKyNkZWZpbmUgV001MTAwX09VVDJSTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4NjlBCisjZGVmaW5lIFdNNTEwMF9PVVQyUk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDY5QgorI2RlZmluZSBXTTUxMDBfT1VUMlJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg2OUMKKyNkZWZpbmUgV001MTAwX09VVDJSTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4NjlECisjZGVmaW5lIFdNNTEwMF9PVVQyUk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDY5RQorI2RlZmluZSBXTTUxMDBfT1VUMlJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg2OUYKKyNkZWZpbmUgV001MTAwX09VVDNMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4NkEwCisjZGVmaW5lIFdNNTEwMF9PVVQzTE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDZBMQorI2RlZmluZSBXTTUxMDBfT1VUM0xNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg2QTIKKyNkZWZpbmUgV001MTAwX09VVDNMTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4NkEzCisjZGVmaW5lIFdNNTEwMF9PVVQzTE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDZBNAorI2RlZmluZSBXTTUxMDBfT1VUM0xNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg2QTUKKyNkZWZpbmUgV001MTAwX09VVDNMTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4NkE2CisjZGVmaW5lIFdNNTEwMF9PVVQzTE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDZBNworI2RlZmluZSBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg2QTgKKyNkZWZpbmUgV001MTAwX09VVDNSTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4NkE5CisjZGVmaW5lIFdNNTEwMF9PVVQzUk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDZBQQorI2RlZmluZSBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg2QUIKKyNkZWZpbmUgV001MTAwX09VVDNSTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4NkFDCisjZGVmaW5lIFdNNTEwMF9PVVQzUk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDZBRAorI2RlZmluZSBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg2QUUKKyNkZWZpbmUgV001MTAwX09VVDNSTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4NkFGCisjZGVmaW5lIFdNNTEwMF9PVVQ0TE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDZCMAorI2RlZmluZSBXTTUxMDBfT1VUNExNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg2QjEKKyNkZWZpbmUgV001MTAwX09VVDRMTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4NkIyCisjZGVmaW5lIFdNNTEwMF9PVVQ0TE1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDZCMworI2RlZmluZSBXTTUxMDBfT1VUNExNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg2QjQKKyNkZWZpbmUgV001MTAwX09VVDRMTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4NkI1CisjZGVmaW5lIFdNNTEwMF9PVVQ0TE1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDZCNgorI2RlZmluZSBXTTUxMDBfT1VUNExNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg2QjcKKyNkZWZpbmUgV001MTAwX09VVDRSTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4NkI4CisjZGVmaW5lIFdNNTEwMF9PVVQ0Uk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDZCOQorI2RlZmluZSBXTTUxMDBfT1VUNFJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg2QkEKKyNkZWZpbmUgV001MTAwX09VVDRSTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4NkJCCisjZGVmaW5lIFdNNTEwMF9PVVQ0Uk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDZCQworI2RlZmluZSBXTTUxMDBfT1VUNFJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg2QkQKKyNkZWZpbmUgV001MTAwX09VVDRSTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4NkJFCisjZGVmaW5lIFdNNTEwMF9PVVQ0Uk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDZCRgorI2RlZmluZSBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg2QzAKKyNkZWZpbmUgV001MTAwX09VVDVMTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4NkMxCisjZGVmaW5lIFdNNTEwMF9PVVQ1TE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDZDMgorI2RlZmluZSBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg2QzMKKyNkZWZpbmUgV001MTAwX09VVDVMTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4NkM0CisjZGVmaW5lIFdNNTEwMF9PVVQ1TE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDZDNQorI2RlZmluZSBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg2QzYKKyNkZWZpbmUgV001MTAwX09VVDVMTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4NkM3CisjZGVmaW5lIFdNNTEwMF9PVVQ1Uk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDZDOAorI2RlZmluZSBXTTUxMDBfT1VUNVJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg2QzkKKyNkZWZpbmUgV001MTAwX09VVDVSTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4NkNBCisjZGVmaW5lIFdNNTEwMF9PVVQ1Uk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDZDQgorI2RlZmluZSBXTTUxMDBfT1VUNVJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg2Q0MKKyNkZWZpbmUgV001MTAwX09VVDVSTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4NkNECisjZGVmaW5lIFdNNTEwMF9PVVQ1Uk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDZDRQorI2RlZmluZSBXTTUxMDBfT1VUNVJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg2Q0YKKyNkZWZpbmUgV001MTAwX09VVDZMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4NkQwCisjZGVmaW5lIFdNNTEwMF9PVVQ2TE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDZEMQorI2RlZmluZSBXTTUxMDBfT1VUNkxNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg2RDIKKyNkZWZpbmUgV001MTAwX09VVDZMTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4NkQzCisjZGVmaW5lIFdNNTEwMF9PVVQ2TE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDZENAorI2RlZmluZSBXTTUxMDBfT1VUNkxNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg2RDUKKyNkZWZpbmUgV001MTAwX09VVDZMTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4NkQ2CisjZGVmaW5lIFdNNTEwMF9PVVQ2TE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDZENworI2RlZmluZSBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg2RDgKKyNkZWZpbmUgV001MTAwX09VVDZSTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4NkQ5CisjZGVmaW5lIFdNNTEwMF9PVVQ2Uk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDZEQQorI2RlZmluZSBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg2REIKKyNkZWZpbmUgV001MTAwX09VVDZSTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4NkRDCisjZGVmaW5lIFdNNTEwMF9PVVQ2Uk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDZERAorI2RlZmluZSBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg2REUKKyNkZWZpbmUgV001MTAwX09VVDZSTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4NkRGCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAweDcwMAorI2RlZmluZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgMHg3MDEKKyNkZWZpbmUgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgIDB4NzAyCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAweDcwMworI2RlZmluZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgMHg3MDQKKyNkZWZpbmUgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgIDB4NzA1CisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAweDcwNgorI2RlZmluZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgMHg3MDcKKyNkZWZpbmUgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgIDB4NzA4CisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAweDcwOQorI2RlZmluZSBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgMHg3MEEKKyNkZWZpbmUgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgIDB4NzBCCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAweDcwQworI2RlZmluZSBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgMHg3MEQKKyNkZWZpbmUgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgIDB4NzBFCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAweDcwRgorI2RlZmluZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgMHg3MTAKKyNkZWZpbmUgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgIDB4NzExCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAweDcxMgorI2RlZmluZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgMHg3MTMKKyNkZWZpbmUgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgIDB4NzE0CisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAweDcxNQorI2RlZmluZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgMHg3MTYKKyNkZWZpbmUgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgIDB4NzE3CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAweDcxOAorI2RlZmluZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgMHg3MTkKKyNkZWZpbmUgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgIDB4NzFBCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAweDcxQgorI2RlZmluZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgMHg3MUMKKyNkZWZpbmUgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgIDB4NzFECisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAweDcxRQorI2RlZmluZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgMHg3MUYKKyNkZWZpbmUgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgIDB4NzIwCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAweDcyMQorI2RlZmluZSBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgMHg3MjIKKyNkZWZpbmUgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgIDB4NzIzCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAweDcyNAorI2RlZmluZSBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgMHg3MjUKKyNkZWZpbmUgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgIDB4NzI2CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAweDcyNworI2RlZmluZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgMHg3MjgKKyNkZWZpbmUgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgIDB4NzI5CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAweDcyQQorI2RlZmluZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgMHg3MkIKKyNkZWZpbmUgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgIDB4NzJDCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAweDcyRAorI2RlZmluZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgMHg3MkUKKyNkZWZpbmUgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgIDB4NzJGCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAweDczMAorI2RlZmluZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgMHg3MzEKKyNkZWZpbmUgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgIDB4NzMyCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAweDczMworI2RlZmluZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgMHg3MzQKKyNkZWZpbmUgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgIDB4NzM1CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAweDczNgorI2RlZmluZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgMHg3MzcKKyNkZWZpbmUgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgIDB4NzM4CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAweDczOQorI2RlZmluZSBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgMHg3M0EKKyNkZWZpbmUgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgIDB4NzNCCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAweDczQworI2RlZmluZSBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgMHg3M0QKKyNkZWZpbmUgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgIDB4NzNFCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAweDczRgorI2RlZmluZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgMHg3NDAKKyNkZWZpbmUgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgIDB4NzQxCisjZGVmaW5lIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAweDc0MgorI2RlZmluZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgMHg3NDMKKyNkZWZpbmUgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgIDB4NzQ0CisjZGVmaW5lIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAweDc0NQorI2RlZmluZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgMHg3NDYKKyNkZWZpbmUgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgIDB4NzQ3CisjZGVmaW5lIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAweDc0OAorI2RlZmluZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgMHg3NDkKKyNkZWZpbmUgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgIDB4NzRBCisjZGVmaW5lIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAweDc0QgorI2RlZmluZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgMHg3NEMKKyNkZWZpbmUgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgIDB4NzRECisjZGVmaW5lIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAweDc0RQorI2RlZmluZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgMHg3NEYKKyNkZWZpbmUgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgIDB4NzgwCisjZGVmaW5lIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAweDc4MQorI2RlZmluZSBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgMHg3ODIKKyNkZWZpbmUgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgIDB4NzgzCisjZGVmaW5lIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAweDc4NAorI2RlZmluZSBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgMHg3ODUKKyNkZWZpbmUgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgIDB4Nzg2CisjZGVmaW5lIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAweDc4NworI2RlZmluZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgMHg3ODgKKyNkZWZpbmUgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgIDB4Nzg5CisjZGVmaW5lIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAweDc4QQorI2RlZmluZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgMHg3OEIKKyNkZWZpbmUgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgIDB4NzhDCisjZGVmaW5lIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAweDc4RAorI2RlZmluZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgMHg3OEUKKyNkZWZpbmUgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgIDB4NzhGCisjZGVmaW5lIFdNNTEwMF9FUTFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgICAweDg4MAorI2RlZmluZSBXTTUxMDBfRVExTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgICAgMHg4ODEKKyNkZWZpbmUgV001MTAwX0VRMU1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAgIDB4ODgyCisjZGVmaW5lIFdNNTEwMF9FUTFNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgICAweDg4MworI2RlZmluZSBXTTUxMDBfRVExTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgICAgMHg4ODQKKyNkZWZpbmUgV001MTAwX0VRMU1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAgIDB4ODg1CisjZGVmaW5lIFdNNTEwMF9FUTFNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgICAweDg4NgorI2RlZmluZSBXTTUxMDBfRVExTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgICAgMHg4ODcKKyNkZWZpbmUgV001MTAwX0VRMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAgIDB4ODg4CisjZGVmaW5lIFdNNTEwMF9FUTJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgICAweDg4OQorI2RlZmluZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgICAgMHg4OEEKKyNkZWZpbmUgV001MTAwX0VRMk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAgIDB4ODhCCisjZGVmaW5lIFdNNTEwMF9FUTJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgICAweDg4QworI2RlZmluZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgICAgMHg4OEQKKyNkZWZpbmUgV001MTAwX0VRMk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAgIDB4ODhFCisjZGVmaW5lIFdNNTEwMF9FUTJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgICAweDg4RgorI2RlZmluZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgICAgMHg4OTAKKyNkZWZpbmUgV001MTAwX0VRM01JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAgIDB4ODkxCisjZGVmaW5lIFdNNTEwMF9FUTNNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgICAweDg5MgorI2RlZmluZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgICAgMHg4OTMKKyNkZWZpbmUgV001MTAwX0VRM01JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAgIDB4ODk0CisjZGVmaW5lIFdNNTEwMF9FUTNNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgICAweDg5NQorI2RlZmluZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgICAgMHg4OTYKKyNkZWZpbmUgV001MTAwX0VRM01JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAgIDB4ODk3CisjZGVmaW5lIFdNNTEwMF9FUTRNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgICAweDg5OAorI2RlZmluZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgICAgMHg4OTkKKyNkZWZpbmUgV001MTAwX0VRNE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAgIDB4ODlBCisjZGVmaW5lIFdNNTEwMF9FUTRNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgICAweDg5QgorI2RlZmluZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgICAgMHg4OUMKKyNkZWZpbmUgV001MTAwX0VRNE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAgIDB4ODlECisjZGVmaW5lIFdNNTEwMF9FUTRNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgICAweDg5RQorI2RlZmluZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgICAgMHg4OUYKKyNkZWZpbmUgV001MTAwX0RSQzFMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4OEMwCisjZGVmaW5lIFdNNTEwMF9EUkMxTE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDhDMQorI2RlZmluZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg4QzIKKyNkZWZpbmUgV001MTAwX0RSQzFMTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4OEMzCisjZGVmaW5lIFdNNTEwMF9EUkMxTE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDhDNAorI2RlZmluZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg4QzUKKyNkZWZpbmUgV001MTAwX0RSQzFMTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4OEM2CisjZGVmaW5lIFdNNTEwMF9EUkMxTE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDhDNworI2RlZmluZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg4QzgKKyNkZWZpbmUgV001MTAwX0RSQzFSTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4OEM5CisjZGVmaW5lIFdNNTEwMF9EUkMxUk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDhDQQorI2RlZmluZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg4Q0IKKyNkZWZpbmUgV001MTAwX0RSQzFSTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4OENDCisjZGVmaW5lIFdNNTEwMF9EUkMxUk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDhDRAorI2RlZmluZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg4Q0UKKyNkZWZpbmUgV001MTAwX0RSQzFSTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4OENGCisjZGVmaW5lIFdNNTEwMF9IUExQMU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDkwMAorI2RlZmluZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg5MDEKKyNkZWZpbmUgV001MTAwX0hQTFAxTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4OTAyCisjZGVmaW5lIFdNNTEwMF9IUExQMU1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDkwMworI2RlZmluZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg5MDQKKyNkZWZpbmUgV001MTAwX0hQTFAxTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4OTA1CisjZGVmaW5lIFdNNTEwMF9IUExQMU1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDkwNgorI2RlZmluZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg5MDcKKyNkZWZpbmUgV001MTAwX0hQTFAyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4OTA4CisjZGVmaW5lIFdNNTEwMF9IUExQMk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDkwOQorI2RlZmluZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg5MEEKKyNkZWZpbmUgV001MTAwX0hQTFAyTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4OTBCCisjZGVmaW5lIFdNNTEwMF9IUExQMk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDkwQworI2RlZmluZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg5MEQKKyNkZWZpbmUgV001MTAwX0hQTFAyTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4OTBFCisjZGVmaW5lIFdNNTEwMF9IUExQMk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDkwRgorI2RlZmluZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg5MTAKKyNkZWZpbmUgV001MTAwX0hQTFAzTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4OTExCisjZGVmaW5lIFdNNTEwMF9IUExQM01JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDkxMgorI2RlZmluZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg5MTMKKyNkZWZpbmUgV001MTAwX0hQTFAzTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4OTE0CisjZGVmaW5lIFdNNTEwMF9IUExQM01JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDkxNQorI2RlZmluZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg5MTYKKyNkZWZpbmUgV001MTAwX0hQTFAzTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4OTE3CisjZGVmaW5lIFdNNTEwMF9IUExQNE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDkxOAorI2RlZmluZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg5MTkKKyNkZWZpbmUgV001MTAwX0hQTFA0TUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4OTFBCisjZGVmaW5lIFdNNTEwMF9IUExQNE1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDkxQgorI2RlZmluZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg5MUMKKyNkZWZpbmUgV001MTAwX0hQTFA0TUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4OTFECisjZGVmaW5lIFdNNTEwMF9IUExQNE1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDkxRQorI2RlZmluZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg5MUYKKyNkZWZpbmUgV001MTAwX0RTUDFMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4OTQwCisjZGVmaW5lIFdNNTEwMF9EU1AxTE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDk0MQorI2RlZmluZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg5NDIKKyNkZWZpbmUgV001MTAwX0RTUDFMTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4OTQzCisjZGVmaW5lIFdNNTEwMF9EU1AxTE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDk0NAorI2RlZmluZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg5NDUKKyNkZWZpbmUgV001MTAwX0RTUDFMTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4OTQ2CisjZGVmaW5lIFdNNTEwMF9EU1AxTE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDk0NworI2RlZmluZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg5NDgKKyNkZWZpbmUgV001MTAwX0RTUDFSTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4OTQ5CisjZGVmaW5lIFdNNTEwMF9EU1AxUk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDk0QQorI2RlZmluZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg5NEIKKyNkZWZpbmUgV001MTAwX0RTUDFSTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4OTRDCisjZGVmaW5lIFdNNTEwMF9EU1AxUk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDk0RAorI2RlZmluZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg5NEUKKyNkZWZpbmUgV001MTAwX0RTUDFSTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4OTRGCisjZGVmaW5lIFdNNTEwMF9EU1AxQVVYMU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDk1MAorI2RlZmluZSBXTTUxMDBfRFNQMUFVWDJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5NTgKKyNkZWZpbmUgV001MTAwX0RTUDFBVVgzTUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OTYwCisjZGVmaW5lIFdNNTEwMF9EU1AxQVVYNE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDk2OAorI2RlZmluZSBXTTUxMDBfRFNQMUFVWDVNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5NzAKKyNkZWZpbmUgV001MTAwX0RTUDFBVVg2TUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OTc4CisjZGVmaW5lIFdNNTEwMF9EU1AyTE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDk4MAorI2RlZmluZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg5ODEKKyNkZWZpbmUgV001MTAwX0RTUDJMTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4OTgyCisjZGVmaW5lIFdNNTEwMF9EU1AyTE1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDk4MworI2RlZmluZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg5ODQKKyNkZWZpbmUgV001MTAwX0RTUDJMTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4OTg1CisjZGVmaW5lIFdNNTEwMF9EU1AyTE1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDk4NgorI2RlZmluZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg5ODcKKyNkZWZpbmUgV001MTAwX0RTUDJSTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4OTg4CisjZGVmaW5lIFdNNTEwMF9EU1AyUk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDk4OQorI2RlZmluZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg5OEEKKyNkZWZpbmUgV001MTAwX0RTUDJSTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4OThCCisjZGVmaW5lIFdNNTEwMF9EU1AyUk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDk4QworI2RlZmluZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg5OEQKKyNkZWZpbmUgV001MTAwX0RTUDJSTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4OThFCisjZGVmaW5lIFdNNTEwMF9EU1AyUk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDk4RgorI2RlZmluZSBXTTUxMDBfRFNQMkFVWDFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5OTAKKyNkZWZpbmUgV001MTAwX0RTUDJBVVgyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OTk4CisjZGVmaW5lIFdNNTEwMF9EU1AyQVVYM01JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDlBMAorI2RlZmluZSBXTTUxMDBfRFNQMkFVWDRNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5QTgKKyNkZWZpbmUgV001MTAwX0RTUDJBVVg1TUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OUIwCisjZGVmaW5lIFdNNTEwMF9EU1AyQVVYNk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDlCOAorI2RlZmluZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg5QzAKKyNkZWZpbmUgV001MTAwX0RTUDNMTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4OUMxCisjZGVmaW5lIFdNNTEwMF9EU1AzTE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDlDMgorI2RlZmluZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg5QzMKKyNkZWZpbmUgV001MTAwX0RTUDNMTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4OUM0CisjZGVmaW5lIFdNNTEwMF9EU1AzTE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDlDNQorI2RlZmluZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg5QzYKKyNkZWZpbmUgV001MTAwX0RTUDNMTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4OUM3CisjZGVmaW5lIFdNNTEwMF9EU1AzUk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDlDOAorI2RlZmluZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg5QzkKKyNkZWZpbmUgV001MTAwX0RTUDNSTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4OUNBCisjZGVmaW5lIFdNNTEwMF9EU1AzUk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDlDQgorI2RlZmluZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg5Q0MKKyNkZWZpbmUgV001MTAwX0RTUDNSTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4OUNECisjZGVmaW5lIFdNNTEwMF9EU1AzUk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDlDRQorI2RlZmluZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg5Q0YKKyNkZWZpbmUgV001MTAwX0RTUDNBVVgxTUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OUQwCisjZGVmaW5lIFdNNTEwMF9EU1AzQVVYMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDlEOAorI2RlZmluZSBXTTUxMDBfRFNQM0FVWDNNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5RTAKKyNkZWZpbmUgV001MTAwX0RTUDNBVVg0TUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OUU4CisjZGVmaW5lIFdNNTEwMF9EU1AzQVVYNU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDlGMAorI2RlZmluZSBXTTUxMDBfRFNQM0FVWDZNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5RjgKKyNkZWZpbmUgV001MTAwX0FTUkMxTE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgIDB4QTgwCisjZGVmaW5lIFdNNTEwMF9BU1JDMVJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAweEE4OAorI2RlZmluZSBXTTUxMDBfQVNSQzJMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgMHhBOTAKKyNkZWZpbmUgV001MTAwX0FTUkMyUk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgIDB4QTk4CisjZGVmaW5lIFdNNTEwMF9JU1JDMURFQzFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEIwMAorI2RlZmluZSBXTTUxMDBfSVNSQzFERUMyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCMDgKKyNkZWZpbmUgV001MTAwX0lTUkMxREVDM01JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjEwCisjZGVmaW5lIFdNNTEwMF9JU1JDMURFQzRNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEIxOAorI2RlZmluZSBXTTUxMDBfSVNSQzFJTlQxTUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCMjAKKyNkZWZpbmUgV001MTAwX0lTUkMxSU5UMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjI4CisjZGVmaW5lIFdNNTEwMF9JU1JDMUlOVDNNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEIzMAorI2RlZmluZSBXTTUxMDBfSVNSQzFJTlQ0TUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCMzgKKyNkZWZpbmUgV001MTAwX0lTUkMyREVDMU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjQwCisjZGVmaW5lIFdNNTEwMF9JU1JDMkRFQzJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEI0OAorI2RlZmluZSBXTTUxMDBfSVNSQzJERUMzTUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCNTAKKyNkZWZpbmUgV001MTAwX0lTUkMyREVDNE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjU4CisjZGVmaW5lIFdNNTEwMF9JU1JDMklOVDFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEI2MAorI2RlZmluZSBXTTUxMDBfSVNSQzJJTlQyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCNjgKKyNkZWZpbmUgV001MTAwX0lTUkMySU5UM01JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjcwCisjZGVmaW5lIFdNNTEwMF9JU1JDMklOVDRNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEI3OAorI2RlZmluZSBXTTUxMDBfR1BJT19DVFJMXzEgICAgICAgICAgICAgICAgICAgICAgMHhDMDAKKyNkZWZpbmUgV001MTAwX0dQSU9fQ1RSTF8yICAgICAgICAgICAgICAgICAgICAgIDB4QzAxCisjZGVmaW5lIFdNNTEwMF9HUElPX0NUUkxfMyAgICAgICAgICAgICAgICAgICAgICAweEMwMgorI2RlZmluZSBXTTUxMDBfR1BJT19DVFJMXzQgICAgICAgICAgICAgICAgICAgICAgMHhDMDMKKyNkZWZpbmUgV001MTAwX0dQSU9fQ1RSTF81ICAgICAgICAgICAgICAgICAgICAgIDB4QzA0CisjZGVmaW5lIFdNNTEwMF9HUElPX0NUUkxfNiAgICAgICAgICAgICAgICAgICAgICAweEMwNQorI2RlZmluZSBXTTUxMDBfTUlTQ19QQURfQ1RSTF8xICAgICAgICAgICAgICAgICAgMHhDMjMKKyNkZWZpbmUgV001MTAwX01JU0NfUEFEX0NUUkxfMiAgICAgICAgICAgICAgICAgIDB4QzI0CisjZGVmaW5lIFdNNTEwMF9NSVNDX1BBRF9DVFJMXzMgICAgICAgICAgICAgICAgICAweEMyNQorI2RlZmluZSBXTTUxMDBfTUlTQ19QQURfQ1RSTF80ICAgICAgICAgICAgICAgICAgMHhDMjYKKyNkZWZpbmUgV001MTAwX01JU0NfUEFEX0NUUkxfNSAgICAgICAgICAgICAgICAgIDB4QzI3CisjZGVmaW5lIFdNNTEwMF9NSVNDX0dQSU9fMSAgICAgICAgICAgICAgICAgICAgICAweEMyOAorI2RlZmluZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18xICAgICAgICAgICAgICAgMHhEMDAKKyNkZWZpbmUgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfMiAgICAgICAgICAgICAgIDB4RDAxCisjZGVmaW5lIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzMgICAgICAgICAgICAgICAweEQwMgorI2RlZmluZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU180ICAgICAgICAgICAgICAgMHhEMDMKKyNkZWZpbmUgV001MTAwX0lOVEVSUlVQVF9SQVdfU1RBVFVTXzIgICAgICAgICAgIDB4RDA0CisjZGVmaW5lIFdNNTEwMF9JTlRFUlJVUFRfUkFXX1NUQVRVU18zICAgICAgICAgICAweEQwNQorI2RlZmluZSBXTTUxMDBfSU5URVJSVVBUX1JBV19TVEFUVVNfNCAgICAgICAgICAgMHhEMDYKKyNkZWZpbmUgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfMV9NQVNLICAgICAgICAgIDB4RDA3CisjZGVmaW5lIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzJfTUFTSyAgICAgICAgICAweEQwOAorI2RlZmluZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zX01BU0sgICAgICAgICAgMHhEMDkKKyNkZWZpbmUgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfNF9NQVNLICAgICAgICAgIDB4RDBBCisjZGVmaW5lIFdNNTEwMF9JTlRFUlJVUFRfQ09OVFJPTCAgICAgICAgICAgICAgICAweEQxRgorI2RlZmluZSBXTTUxMDBfSVJRX0RFQk9VTkNFXzEgICAgICAgICAgICAgICAgICAgMHhEMjAKKyNkZWZpbmUgV001MTAwX0lSUV9ERUJPVU5DRV8yICAgICAgICAgICAgICAgICAgIDB4RDIxCisjZGVmaW5lIFdNNTEwMF9GWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAweEUwMAorI2RlZmluZSBXTTUxMDBfRVExXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMTAKKyNkZWZpbmUgV001MTAwX0VRMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTExCisjZGVmaW5lIFdNNTEwMF9FUTFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxMgorI2RlZmluZSBXTTUxMDBfRVExXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMTMKKyNkZWZpbmUgV001MTAwX0VRMV81ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTE0CisjZGVmaW5lIFdNNTEwMF9FUTFfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxNQorI2RlZmluZSBXTTUxMDBfRVExXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMTYKKyNkZWZpbmUgV001MTAwX0VRMV84ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTE3CisjZGVmaW5lIFdNNTEwMF9FUTFfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxOAorI2RlZmluZSBXTTUxMDBfRVExXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMTkKKyNkZWZpbmUgV001MTAwX0VRMV8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTFBCisjZGVmaW5lIFdNNTEwMF9FUTFfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxQgorI2RlZmluZSBXTTUxMDBfRVExXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMUMKKyNkZWZpbmUgV001MTAwX0VRMV8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTFECisjZGVmaW5lIFdNNTEwMF9FUTFfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxRQorI2RlZmluZSBXTTUxMDBfRVExXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMUYKKyNkZWZpbmUgV001MTAwX0VRMV8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTIwCisjZGVmaW5lIFdNNTEwMF9FUTFfMTggICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyMQorI2RlZmluZSBXTTUxMDBfRVExXzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMjIKKyNkZWZpbmUgV001MTAwX0VRMV8yMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTIzCisjZGVmaW5lIFdNNTEwMF9FUTJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyNgorI2RlZmluZSBXTTUxMDBfRVEyXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMjcKKyNkZWZpbmUgV001MTAwX0VRMl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTI4CisjZGVmaW5lIFdNNTEwMF9FUTJfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyOQorI2RlZmluZSBXTTUxMDBfRVEyXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMkEKKyNkZWZpbmUgV001MTAwX0VRMl82ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTJCCisjZGVmaW5lIFdNNTEwMF9FUTJfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyQworI2RlZmluZSBXTTUxMDBfRVEyXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMkQKKyNkZWZpbmUgV001MTAwX0VRMl85ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTJFCisjZGVmaW5lIFdNNTEwMF9FUTJfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyRgorI2RlZmluZSBXTTUxMDBfRVEyXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMzAKKyNkZWZpbmUgV001MTAwX0VRMl8xMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTMxCisjZGVmaW5lIFdNNTEwMF9FUTJfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUzMgorI2RlZmluZSBXTTUxMDBfRVEyXzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMzMKKyNkZWZpbmUgV001MTAwX0VRMl8xNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTM0CisjZGVmaW5lIFdNNTEwMF9FUTJfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUzNQorI2RlZmluZSBXTTUxMDBfRVEyXzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMzYKKyNkZWZpbmUgV001MTAwX0VRMl8xOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTM3CisjZGVmaW5lIFdNNTEwMF9FUTJfMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUzOAorI2RlZmluZSBXTTUxMDBfRVEyXzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMzkKKyNkZWZpbmUgV001MTAwX0VRM18xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTNDCisjZGVmaW5lIFdNNTEwMF9FUTNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUzRAorI2RlZmluZSBXTTUxMDBfRVEzXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFM0UKKyNkZWZpbmUgV001MTAwX0VRM180ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTNGCisjZGVmaW5lIFdNNTEwMF9FUTNfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0MAorI2RlZmluZSBXTTUxMDBfRVEzXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNDEKKyNkZWZpbmUgV001MTAwX0VRM183ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTQyCisjZGVmaW5lIFdNNTEwMF9FUTNfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0MworI2RlZmluZSBXTTUxMDBfRVEzXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNDQKKyNkZWZpbmUgV001MTAwX0VRM18xMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTQ1CisjZGVmaW5lIFdNNTEwMF9FUTNfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0NgorI2RlZmluZSBXTTUxMDBfRVEzXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNDcKKyNkZWZpbmUgV001MTAwX0VRM18xMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTQ4CisjZGVmaW5lIFdNNTEwMF9FUTNfMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0OQorI2RlZmluZSBXTTUxMDBfRVEzXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNEEKKyNkZWZpbmUgV001MTAwX0VRM18xNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTRCCisjZGVmaW5lIFdNNTEwMF9FUTNfMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0QworI2RlZmluZSBXTTUxMDBfRVEzXzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNEQKKyNkZWZpbmUgV001MTAwX0VRM18xOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTRFCisjZGVmaW5lIFdNNTEwMF9FUTNfMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0RgorI2RlZmluZSBXTTUxMDBfRVE0XzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNTIKKyNkZWZpbmUgV001MTAwX0VRNF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTUzCisjZGVmaW5lIFdNNTEwMF9FUTRfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU1NAorI2RlZmluZSBXTTUxMDBfRVE0XzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNTUKKyNkZWZpbmUgV001MTAwX0VRNF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTU2CisjZGVmaW5lIFdNNTEwMF9FUTRfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU1NworI2RlZmluZSBXTTUxMDBfRVE0XzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNTgKKyNkZWZpbmUgV001MTAwX0VRNF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTU5CisjZGVmaW5lIFdNNTEwMF9FUTRfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU1QQorI2RlZmluZSBXTTUxMDBfRVE0XzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNUIKKyNkZWZpbmUgV001MTAwX0VRNF8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTVDCisjZGVmaW5lIFdNNTEwMF9FUTRfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU1RAorI2RlZmluZSBXTTUxMDBfRVE0XzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNUUKKyNkZWZpbmUgV001MTAwX0VRNF8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTVGCisjZGVmaW5lIFdNNTEwMF9FUTRfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU2MAorI2RlZmluZSBXTTUxMDBfRVE0XzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNjEKKyNkZWZpbmUgV001MTAwX0VRNF8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTYyCisjZGVmaW5lIFdNNTEwMF9FUTRfMTggICAgICAgICAgICAgICAgICAgICAgICAgICAweEU2MworI2RlZmluZSBXTTUxMDBfRVE0XzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNjQKKyNkZWZpbmUgV001MTAwX0VRNF8yMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTY1CisjZGVmaW5lIFdNNTEwMF9EUkMxX0NUUkwxICAgICAgICAgICAgICAgICAgICAgICAweEU4MAorI2RlZmluZSBXTTUxMDBfRFJDMV9DVFJMMiAgICAgICAgICAgICAgICAgICAgICAgMHhFODEKKyNkZWZpbmUgV001MTAwX0RSQzFfQ1RSTDMgICAgICAgICAgICAgICAgICAgICAgIDB4RTgyCisjZGVmaW5lIFdNNTEwMF9EUkMxX0NUUkw0ICAgICAgICAgICAgICAgICAgICAgICAweEU4MworI2RlZmluZSBXTTUxMDBfRFJDMV9DVFJMNSAgICAgICAgICAgICAgICAgICAgICAgMHhFODQKKyNkZWZpbmUgV001MTAwX0hQTFBGMV8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUMwCisjZGVmaW5lIFdNNTEwMF9IUExQRjFfMiAgICAgICAgICAgICAgICAgICAgICAgICAweEVDMQorI2RlZmluZSBXTTUxMDBfSFBMUEYyXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHhFQzQKKyNkZWZpbmUgV001MTAwX0hQTFBGMl8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUM1CisjZGVmaW5lIFdNNTEwMF9IUExQRjNfMSAgICAgICAgICAgICAgICAgICAgICAgICAweEVDOAorI2RlZmluZSBXTTUxMDBfSFBMUEYzXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHhFQzkKKyNkZWZpbmUgV001MTAwX0hQTFBGNF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUNDCisjZGVmaW5lIFdNNTEwMF9IUExQRjRfMiAgICAgICAgICAgICAgICAgICAgICAgICAweEVDRAorI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8wICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzEgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDEKKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fMiAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgorI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8zICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAzCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzUwOCAgICAgICAgICAgICAgICAgICAgICAweDQxRkMKKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fNTA5ICAgICAgICAgICAgICAgICAgICAgIDB4NDFGRAorI2RlZmluZSBXTTUxMDBfRFNQMV9ETV81MTAgICAgICAgICAgICAgICAgICAgICAgMHg0MUZFCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzUxMSAgICAgICAgICAgICAgICAgICAgICAweDQxRkYKKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMAorI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODAxCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzIgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDIKKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMyAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV80ICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODA0CisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDUKKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMTUzMCAgICAgICAgICAgICAgICAgICAgIDB4NERGQQorI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xNTMxICAgICAgICAgICAgICAgICAgICAgMHg0REZCCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzE1MzIgICAgICAgICAgICAgICAgICAgICAweDRERkMKKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMTUzMyAgICAgICAgICAgICAgICAgICAgIDB4NERGRAorI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xNTM0ICAgICAgICAgICAgICAgICAgICAgMHg0REZFCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzE1MzUgICAgICAgICAgICAgICAgICAgICAweDRERkYKKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMAorI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAxCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzIgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDIKKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMyAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8yMDQ0ICAgICAgICAgICAgICAgICAgICAgMHg1N0ZDCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzIwNDUgICAgICAgICAgICAgICAgICAgICAweDU3RkQKKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMjA0NiAgICAgICAgICAgICAgICAgICAgIDB4NTdGRQorI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgMHg1N0ZGCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzAgICAgICAgICAgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fMSAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAwMQorI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDAyCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzMgICAgICAgICAgICAgICAgICAgICAgICAweDYwMDMKKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fNTA4ICAgICAgICAgICAgICAgICAgICAgIDB4NjFGQworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV81MDkgICAgICAgICAgICAgICAgICAgICAgMHg2MUZECisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzUxMCAgICAgICAgICAgICAgICAgICAgICAweDYxRkUKKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fNTExICAgICAgICAgICAgICAgICAgICAgIDB4NjFGRgorI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8wICAgICAgICAgICAgICAgICAgICAgICAgMHg2ODAwCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzEgICAgICAgICAgICAgICAgICAgICAgICAweDY4MDEKKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMiAgICAgICAgICAgICAgICAgICAgICAgIDB4NjgwMgorI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8zICAgICAgICAgICAgICAgICAgICAgICAgMHg2ODAzCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzQgICAgICAgICAgICAgICAgICAgICAgICAweDY4MDQKKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fNSAgICAgICAgICAgICAgICAgICAgICAgIDB4NjgwNQorI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8xNTMwICAgICAgICAgICAgICAgICAgICAgMHg2REZBCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzE1MzEgICAgICAgICAgICAgICAgICAgICAweDZERkIKKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMTUzMiAgICAgICAgICAgICAgICAgICAgIDB4NkRGQworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8xNTMzICAgICAgICAgICAgICAgICAgICAgMHg2REZECisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzE1MzQgICAgICAgICAgICAgICAgICAgICAweDZERkUKKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMTUzNSAgICAgICAgICAgICAgICAgICAgIDB4NkRGRgorI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8wICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAwCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEgICAgICAgICAgICAgICAgICAgICAgICAweDcwMDEKKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fMiAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAwMgorI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8zICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAzCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzIwNDQgICAgICAgICAgICAgICAgICAgICAweDc3RkMKKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fMjA0NSAgICAgICAgICAgICAgICAgICAgIDB4NzdGRAorI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8yMDQ2ICAgICAgICAgICAgICAgICAgICAgMHg3N0ZFCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzIwNDcgICAgICAgICAgICAgICAgICAgICAweDc3RkYKKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fMCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTUxMDBfRFNQM19ETV8xICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAxCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzIgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDIKKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fMyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBXTTUxMDBfRFNQM19ETV81MDggICAgICAgICAgICAgICAgICAgICAgMHg4MUZDCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzUwOSAgICAgICAgICAgICAgICAgICAgICAweDgxRkQKKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fNTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODFGRQorI2RlZmluZSBXTTUxMDBfRFNQM19ETV81MTEgICAgICAgICAgICAgICAgICAgICAgMHg4MUZGCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MDAKKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgwMQorI2RlZmluZSBXTTUxMDBfRFNQM19QTV8yICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODAyCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzMgICAgICAgICAgICAgICAgICAgICAgICAweDg4MDMKKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fNCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgwNAorI2RlZmluZSBXTTUxMDBfRFNQM19QTV81ICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODA1CisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzE1MzAgICAgICAgICAgICAgICAgICAgICAweDhERkEKKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMTUzMSAgICAgICAgICAgICAgICAgICAgIDB4OERGQgorI2RlZmluZSBXTTUxMDBfRFNQM19QTV8xNTMyICAgICAgICAgICAgICAgICAgICAgMHg4REZDCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzE1MzMgICAgICAgICAgICAgICAgICAgICAweDhERkQKKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMTUzNCAgICAgICAgICAgICAgICAgICAgIDB4OERGRQorI2RlZmluZSBXTTUxMDBfRFNQM19QTV8xNTM1ICAgICAgICAgICAgICAgICAgICAgMHg4REZGCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzAgICAgICAgICAgICAgICAgICAgICAgICAweDkwMDAKKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMSAgICAgICAgICAgICAgICAgICAgICAgIDB4OTAwMQorI2RlZmluZSBXTTUxMDBfRFNQM19aTV8yICAgICAgICAgICAgICAgICAgICAgICAgMHg5MDAyCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzMgICAgICAgICAgICAgICAgICAgICAgICAweDkwMDMKKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMjA0NCAgICAgICAgICAgICAgICAgICAgIDB4OTdGQworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8yMDQ1ICAgICAgICAgICAgICAgICAgICAgMHg5N0ZECisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzIwNDYgICAgICAgICAgICAgICAgICAgICAweDk3RkUKKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMjA0NyAgICAgICAgICAgICAgICAgICAgIDB4OTdGRgorCisjZGVmaW5lIFdNNTEwMF9SRUdJU1RFUl9DT1VOVCAgICAgICAgICAgICAgICAgICAxNDM1CisjZGVmaW5lIFdNNTEwMF9NQVhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAweDk3RkYKKworLyoKKyAqIEZpZWxkIERlZmluaXRpb25zLgorICovCisKKy8qCisgKiBSMCAoMHgwMCkgLSBzb2Z0d2FyZSByZXNldAorICovCisjZGVmaW5lIFdNNTEwMF9TV19SU1RfREVWX0lEMV9NQVNLICAgICAgICAgICAgICAweEZGRkYgIC8qIFNXX1JTVF9ERVZfSUQxIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9TV19SU1RfREVWX0lEMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIFNXX1JTVF9ERVZfSUQxIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9TV19SU1RfREVWX0lEMV9XSURUSCAgICAgICAgICAgICAgICAgMTYgIC8qIFNXX1JTVF9ERVZfSUQxIC0gWzE1OjBdICovCisKKy8qCisgKiBSMSAoMHgwMSkgLSBEZXZpY2UgUmV2aXNpb24KKyAqLworI2RlZmluZSBXTTUxMDBfREVWSUNFX1JFVklTSU9OX01BU0sgICAgICAgICAgICAgMHgwMDBGICAvKiBERVZJQ0VfUkVWSVNJT04gLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfREVWSUNFX1JFVklTSU9OX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBERVZJQ0VfUkVWSVNJT04gLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfREVWSUNFX1JFVklTSU9OX1dJRFRIICAgICAgICAgICAgICAgICA0ICAvKiBERVZJQ0VfUkVWSVNJT04gLSBbMzowXSAqLworCisvKgorICogUjE2ICgweDEwKSAtIEN0cmwgSUYgMQorICovCisjZGVmaW5lIFdNNTEwMF9BVVRPX0lOQyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFVVE9fSU5DICovCisjZGVmaW5lIFdNNTEwMF9BVVRPX0lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFVVE9fSU5DICovCisjZGVmaW5lIFdNNTEwMF9BVVRPX0lOQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFVVE9fSU5DICovCisjZGVmaW5lIFdNNTEwMF9BVVRPX0lOQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFVVE9fSU5DICovCisKKy8qCisgKiBSMzIgKDB4MjApIC0gVG9uZSBHZW5lcmF0b3IgMQorICovCisjZGVmaW5lIFdNNTEwMF9UT05FX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDMwMDAgIC8qIFRPTkVfUkFURSAtIFsxMzoxMl0gKi8KKyNkZWZpbmUgV001MTAwX1RPTkVfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogVE9ORV9SQVRFIC0gWzEzOjEyXSAqLworI2RlZmluZSBXTTUxMDBfVE9ORV9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBUT05FX1JBVEUgLSBbMTM6MTJdICovCisjZGVmaW5lIFdNNTEwMF9UT05FX09GRlNFVF9NQVNLICAgICAgICAgICAgICAgICAweDAzMDAgIC8qIFRPTkVfT0ZGU0VUIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX1RPTkVfT0ZGU0VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgOCAgLyogVE9ORV9PRkZTRVQgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfVE9ORV9PRkZTRVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAyICAvKiBUT05FX09GRlNFVCAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9UT05FMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFRPTkUyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfVE9ORTJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBUT05FMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX1RPTkUyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVE9ORTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9UT05FMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFRPTkUyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfVE9ORTFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBUT05FMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX1RPTkUxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogVE9ORTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9UT05FMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFRPTkUxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfVE9ORTFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBUT05FMV9FTkEgKi8KKworLyoKKyAqIFI0OCAoMHgzMCkgLSBQV00gRHJpdmUgMQorICovCisjZGVmaW5lIFdNNTEwMF9QV01fUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDMwMDAgIC8qIFBXTV9SQVRFIC0gWzEzOjEyXSAqLworI2RlZmluZSBXTTUxMDBfUFdNX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBQV01fUkFURSAtIFsxMzoxMl0gKi8KKyNkZWZpbmUgV001MTAwX1BXTV9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogUFdNX1JBVEUgLSBbMTM6MTJdICovCisjZGVmaW5lIFdNNTEwMF9QV01fQ0xLX1NFTF9NQVNLICAgICAgICAgICAgICAgICAweDAzMDAgIC8qIFBXTV9DTEtfU0VMIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX1BXTV9DTEtfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgOCAgLyogUFdNX0NMS19TRUwgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfUFdNX0NMS19TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAyICAvKiBQV01fQ0xLX1NFTCAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9QV00yX09WRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFBXTTJfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00yX09WRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFBXTTJfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00yX09WRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIFBXTTJfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00yX09WRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTJfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00xX09WRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFBXTTFfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00xX09WRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFBXTTFfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00xX09WRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFBXTTFfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00xX09WRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTFfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFBXTTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFBXTTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFBXTTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFBXTTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFBXTTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTFfRU5BICovCisKKy8qCisgKiBSNDkgKDB4MzEpIC0gUFdNIERyaXZlIDIKKyAqLworI2RlZmluZSBXTTUxMDBfUFdNMV9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwM0ZGICAvKiBQV00xX0xWTCAtIFs5OjBdICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFBXTTFfTFZMIC0gWzk6MF0gKi8KKyNkZWZpbmUgV001MTAwX1BXTTFfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogUFdNMV9MVkwgLSBbOTowXSAqLworCisvKgorICogUjUwICgweDMyKSAtIFBXTSBEcml2ZSAzCisgKi8KKyNkZWZpbmUgV001MTAwX1BXTTJfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDNGRiAgLyogUFdNMl9MVkwgLSBbOTowXSAqLworI2RlZmluZSBXTTUxMDBfUFdNMl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBQV00yX0xWTCAtIFs5OjBdICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIFBXTTJfTFZMIC0gWzk6MF0gKi8KKworLyoKKyAqIFIyNTYgKDB4MTAwKSAtIENsb2NraW5nIDEKKyAqLworI2RlZmluZSBXTTUxMDBfQ0xLXzMyS19TUkNfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBDTEtfMzJLX1NSQyAtIFszOjBdICovCisjZGVmaW5lIFdNNTEwMF9DTEtfMzJLX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIENMS18zMktfU1JDIC0gWzM6MF0gKi8KKyNkZWZpbmUgV001MTAwX0NMS18zMktfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNCAgLyogQ0xLXzMyS19TUkMgLSBbMzowXSAqLworCisvKgorICogUjI1NyAoMHgxMDEpIC0gQ2xvY2tpbmcgMworICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRlJFUV9NQVNLICAgICAgICAgICAgICAgICAweDA3MDAgIC8qIFNZU0NMS19GUkVRIC0gWzEwOjhdICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRlJFUV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIFNZU0NMS19GUkVRIC0gWzEwOjhdICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRlJFUV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFNZU0NMS19GUkVRIC0gWzEwOjhdICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFNZU0NMS19FTkEgKi8KKyNkZWZpbmUgV001MTAwX1NZU0NMS19FTkFfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogU1lTQ0xLX0VOQSAqLworI2RlZmluZSBXTTUxMDBfU1lTQ0xLX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBTWVNDTEtfRU5BICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNZU0NMS19FTkEgKi8KKyNkZWZpbmUgV001MTAwX1NZU0NMS19TUkNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwRiAgLyogU1lTQ0xLX1NSQyAtIFszOjBdICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFNZU0NMS19TUkMgLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfU1lTQ0xLX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBTWVNDTEtfU1JDIC0gWzM6MF0gKi8KKworLyoKKyAqIFIyNTggKDB4MTAyKSAtIENsb2NraW5nIDQKKyAqLworI2RlZmluZSBXTTUxMDBfU0FNUExFX1JBVEVfMV9NQVNLICAgICAgICAgICAgICAgMHgwMDFGICAvKiBTQU1QTEVfUkFURV8xIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX1NBTVBMRV9SQVRFXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogU0FNUExFX1JBVEVfMSAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9TQU1QTEVfUkFURV8xX1dJRFRIICAgICAgICAgICAgICAgICAgIDUgIC8qIFNBTVBMRV9SQVRFXzEgLSBbNDowXSAqLworCisvKgorICogUjI1OSAoMHgxMDMpIC0gQ2xvY2tpbmcgNQorICovCisjZGVmaW5lIFdNNTEwMF9TQU1QTEVfUkFURV8yX01BU0sgICAgICAgICAgICAgICAweDAwMUYgIC8qIFNBTVBMRV9SQVRFXzIgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfU0FNUExFX1JBVEVfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBTQU1QTEVfUkFURV8yIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX1NBTVBMRV9SQVRFXzJfV0lEVEggICAgICAgICAgICAgICAgICAgNSAgLyogU0FNUExFX1JBVEVfMiAtIFs0OjBdICovCisKKy8qCisgKiBSMjYwICgweDEwNCkgLSBDbG9ja2luZyA2CisgKi8KKyNkZWZpbmUgV001MTAwX1NBTVBMRV9SQVRFXzNfTUFTSyAgICAgICAgICAgICAgIDB4MDAxRiAgLyogU0FNUExFX1JBVEVfMyAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9TQU1QTEVfUkFURV8zX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIFNBTVBMRV9SQVRFXzMgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfU0FNUExFX1JBVEVfM19XSURUSCAgICAgICAgICAgICAgICAgICA1ICAvKiBTQU1QTEVfUkFURV8zIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIyNjMgKDB4MTA3KSAtIENsb2NraW5nIDcKKyAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0ZSRVFfTUFTSyAgICAgICAgICAgICAgMHgwNzAwICAvKiBBU1lOQ19DTEtfRlJFUSAtIFsxMDo4XSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0ZSRVFfU0hJRlQgICAgICAgICAgICAgICAgICA4ICAvKiBBU1lOQ19DTEtfRlJFUSAtIFsxMDo4XSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0ZSRVFfV0lEVEggICAgICAgICAgICAgICAgICAzICAvKiBBU1lOQ19DTEtfRlJFUSAtIFsxMDo4XSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0VOQSAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBU1lOQ19DTEtfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1lOQ19DTEtfRU5BX01BU0sgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFTWU5DX0NMS19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTWU5DX0NMS19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgNiAgLyogQVNZTkNfQ0xLX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBU1lOQ19DTEtfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1lOQ19DTEtfU1JDX01BU0sgICAgICAgICAgICAgICAweDAwMEYgIC8qIEFTWU5DX0NMS19TUkMgLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBBU1lOQ19DTEtfU1JDIC0gWzM6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FTWU5DX0NMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgNCAgLyogQVNZTkNfQ0xLX1NSQyAtIFszOjBdICovCisKKy8qCisgKiBSMjY0ICgweDEwOCkgLSBDbG9ja2luZyA4CisgKi8KKyNkZWZpbmUgV001MTAwX0FTWU5DX1NBTVBMRV9SQVRFX01BU0sgICAgICAgICAgIDB4MDAxRiAgLyogQVNZTkNfU0FNUExFX1JBVEUgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfU0FNUExFX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAwICAvKiBBU1lOQ19TQU1QTEVfUkFURSAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9BU1lOQ19TQU1QTEVfUkFURV9XSURUSCAgICAgICAgICAgICAgIDUgIC8qIEFTWU5DX1NBTVBMRV9SQVRFIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIyODggKDB4MTIwKSAtIEFTUkNfRU5BQkxFCisgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMyTF9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQVNSQzJMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBU1JDMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMkxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFTUkMyTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMyTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQVNSQzJMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBU1JDMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMlJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFTUkMyUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMyUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQVNSQzJSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMUxfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFTUkMxTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMxTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQVNSQzFMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMUxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFTUkMxTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMxUl9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQVNSQzFSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBU1JDMVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMVJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFTUkMxUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMxUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQVNSQzFSX0VOQSAqLworCisvKgorICogUjI4OSAoMHgxMjEpIC0gQVNSQ19TVEFUVVMKKyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBU1JDMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBU1JDMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAzICAvKiBBU1JDMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBU1JDMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBU1JDMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAyICAvKiBBU1JDMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBU1JDMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDAyICAvKiBBU1JDMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBU1JDMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDAxICAvKiBBU1JDMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBBU1JDMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMVJfRU5BX1NUUyAqLworCisvKgorICogUjI5MCAoMHgxMjIpIC0gQVNSQ19SQVRFMQorICovCisjZGVmaW5lIFdNNTEwMF9BU1JDX1JBVEUxX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDYgIC8qIEFTUkNfUkFURTEgLSBbMjoxXSAqLworI2RlZmluZSBXTTUxMDBfQVNSQ19SQVRFMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBU1JDX1JBVEUxIC0gWzI6MV0gKi8KKyNkZWZpbmUgV001MTAwX0FTUkNfUkFURTFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMiAgLyogQVNSQ19SQVRFMSAtIFsyOjFdICovCisKKy8qCisgKiBSMzIxICgweDE0MSkgLSBJU1JDIDEgQ1RSTCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX0RGU19FTkEgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSVNSQzFfREZTX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfREZTX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJU1JDMV9ERlNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERlNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMTMgIC8qIElTUkMxX0RGU19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX0RGU19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogSVNSQzFfREZTX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfQ0xLX1NFTF9NQVNLICAgICAgICAgICAgICAgMHgwMzAwICAvKiBJU1JDMV9DTEtfU0VMIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX0NMS19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgOCAgLyogSVNSQzFfQ0xLX1NFTCAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9DTEtfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgIDIgIC8qIElTUkMxX0NMS19TRUwgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNIX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDBDICAvKiBJU1JDMV9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMV9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMV9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBJU1JDMV9GU0wgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJU1JDMV9GU0wgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMV9GU0wgLSBbMTowXSAqLworCisvKgorICogUjMyMiAoMHgxNDIpIC0gSVNSQyAxIENUUkwgMgorICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQxX0VOQSAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIElTUkMxX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQxX0VOQV9NQVNLICAgICAgICAgICAgICAweDgwMDAgIC8qIElTUkMxX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTUgIC8qIElTUkMxX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQyX0VOQSAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIElTUkMxX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQyX0VOQV9NQVNLICAgICAgICAgICAgICAweDQwMDAgIC8qIElTUkMxX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTQgIC8qIElTUkMxX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQzX0VOQSAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIElTUkMxX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQzX0VOQV9NQVNLICAgICAgICAgICAgICAweDIwMDAgIC8qIElTUkMxX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTMgIC8qIElTUkMxX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQ0X0VOQSAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElTUkMxX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQ0X0VOQV9NQVNLICAgICAgICAgICAgICAweDEwMDAgIC8qIElTUkMxX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQ0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTIgIC8qIElTUkMxX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQ0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMxX0VOQSAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElTUkMxX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMxX0VOQV9NQVNLICAgICAgICAgICAgICAweDAyMDAgIC8qIElTUkMxX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDkgIC8qIElTUkMxX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMyX0VOQSAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElTUkMxX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMyX0VOQV9NQVNLICAgICAgICAgICAgICAweDAxMDAgIC8qIElTUkMxX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDggIC8qIElTUkMxX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMzX0VOQSAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIElTUkMxX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMzX0VOQV9NQVNLICAgICAgICAgICAgICAweDAwODAgIC8qIElTUkMxX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDcgIC8qIElTUkMxX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUM0X0VOQSAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElTUkMxX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUM0X0VOQV9NQVNLICAgICAgICAgICAgICAweDAwNDAgIC8qIElTUkMxX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUM0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDYgIC8qIElTUkMxX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUM0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9OT1RDSF9FTkEgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElTUkMxX05PVENIX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfTk9UQ0hfRU5BX01BU0sgICAgICAgICAgICAgMHgwMDAxICAvKiBJU1JDMV9OT1RDSF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX05PVENIX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogSVNSQzFfTk9UQ0hfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9OT1RDSF9FTkFfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX05PVENIX0VOQSAqLworCisvKgorICogUjMyMyAoMHgxNDMpIC0gSVNSQyAyIENUUkwxCisgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX0RGU19FTkEgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSVNSQzJfREZTX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfREZTX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJU1JDMl9ERlNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERlNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMTMgIC8qIElTUkMyX0RGU19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX0RGU19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogSVNSQzJfREZTX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfQ0xLX1NFTF9NQVNLICAgICAgICAgICAgICAgMHgwMzAwICAvKiBJU1JDMl9DTEtfU0VMIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX0NMS19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgOCAgLyogSVNSQzJfQ0xLX1NFTCAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9DTEtfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgIDIgIC8qIElTUkMyX0NMS19TRUwgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNIX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDBDICAvKiBJU1JDMl9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMl9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMl9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBJU1JDMl9GU0wgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJU1JDMl9GU0wgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMl9GU0wgLSBbMTowXSAqLworCisvKgorICogUjMyNCAoMHgxNDQpIC0gSVNSQyAyIENUUkwgMgorICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQxX0VOQSAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIElTUkMyX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQxX0VOQV9NQVNLICAgICAgICAgICAgICAweDgwMDAgIC8qIElTUkMyX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTUgIC8qIElTUkMyX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQyX0VOQSAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIElTUkMyX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQyX0VOQV9NQVNLICAgICAgICAgICAgICAweDQwMDAgIC8qIElTUkMyX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTQgIC8qIElTUkMyX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQzX0VOQSAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIElTUkMyX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQzX0VOQV9NQVNLICAgICAgICAgICAgICAweDIwMDAgIC8qIElTUkMyX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTMgIC8qIElTUkMyX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQ0X0VOQSAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElTUkMyX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQ0X0VOQV9NQVNLICAgICAgICAgICAgICAweDEwMDAgIC8qIElTUkMyX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQ0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTIgIC8qIElTUkMyX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQ0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMxX0VOQSAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElTUkMyX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMxX0VOQV9NQVNLICAgICAgICAgICAgICAweDAyMDAgIC8qIElTUkMyX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDkgIC8qIElTUkMyX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMyX0VOQSAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElTUkMyX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMyX0VOQV9NQVNLICAgICAgICAgICAgICAweDAxMDAgIC8qIElTUkMyX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDggIC8qIElTUkMyX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMzX0VOQSAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIElTUkMyX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMzX0VOQV9NQVNLICAgICAgICAgICAgICAweDAwODAgIC8qIElTUkMyX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDcgIC8qIElTUkMyX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUM0X0VOQSAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElTUkMyX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUM0X0VOQV9NQVNLICAgICAgICAgICAgICAweDAwNDAgIC8qIElTUkMyX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUM0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDYgIC8qIElTUkMyX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUM0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9OT1RDSF9FTkEgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElTUkMyX05PVENIX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfTk9UQ0hfRU5BX01BU0sgICAgICAgICAgICAgMHgwMDAxICAvKiBJU1JDMl9OT1RDSF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX05PVENIX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogSVNSQzJfTk9UQ0hfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9OT1RDSF9FTkFfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX05PVENIX0VOQSAqLworCisvKgorICogUjM4NiAoMHgxODIpIC0gRkxMMSBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBGTEwxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBGTEwxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTEwxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBGTEwxX0VOQSAqLworCisvKgorICogUjM4NyAoMHgxODMpIC0gRkxMMSBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9PVVRESVZfTUFTSyAgICAgICAgICAgICAgICAgMHgzRjAwICAvKiBGTEwxX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9PVVRESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTEwxX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9PVVRESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICA2ICAvKiBGTEwxX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9GUkFUSU9fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBGTEwxX0ZSQVRJTyAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0ZSQVRJT19TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDFfRlJBVElPIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfRlJBVElPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRkxMMV9GUkFUSU8gLSBbMjowXSAqLworCisvKgorICogUjM4OCAoMHgxODQpIC0gRkxMMSBDb250cm9sIDMKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9USEVUQV9NQVNLICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBGTEwxX1RIRVRBIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX1RIRVRBX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDFfVEhFVEEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfVEhFVEFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxNiAgLyogRkxMMV9USEVUQSAtIFsxNTowXSAqLworCisvKgorICogUjM5MCAoMHgxODYpIC0gRkxMMSBDb250cm9sIDUKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwM0ZGICAvKiBGTEwxX04gLSBbOTowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTEwxX04gLSBbOTowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9OX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBGTEwxX04gLSBbOTowXSAqLworCisvKgorICogUjM5MSAoMHgxODcpIC0gRkxMMSBDb250cm9sIDYKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfRElWX01BU0sgICAgICAgICAgICAgMHgwMEMwICAvKiBGTEwxX1JFRkNMS19ESVYgLSBbNzo2XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfRElWX1NISUZUICAgICAgICAgICAgICAgICA2ICAvKiBGTEwxX1JFRkNMS19ESVYgLSBbNzo2XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfRElWX1dJRFRIICAgICAgICAgICAgICAgICAyICAvKiBGTEwxX1JFRkNMS19ESVYgLSBbNzo2XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfU1JDX01BU0sgICAgICAgICAgICAgMHgwMDBGICAvKiBGTEwxX1JFRkNMS19TUkMgLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBGTEwxX1JFRkNMS19TUkMgLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfU1JDX1dJRFRIICAgICAgICAgICAgICAgICA0ICAvKiBGTEwxX1JFRkNMS19TUkMgLSBbMzowXSAqLworCisvKgorICogUjM5MiAoMHgxODgpIC0gRkxMMSBFRlMgMQorICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xBTUJEQV9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEZMTDFfTEFNQkRBIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xBTUJEQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDFfTEFNQkRBIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xBTUJEQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEZMTDFfTEFNQkRBIC0gWzE1OjBdICovCisKKy8qCisgKiBSNDE4ICgweDFBMikgLSBGTEwyIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEZMTDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEZMTDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTDJfRU5BICovCisKKy8qCisgKiBSNDE5ICgweDFBMykgLSBGTEwyIENvbnRyb2wgMgorICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX09VVERJVl9NQVNLICAgICAgICAgICAgICAgICAweDNGMDAgIC8qIEZMTDJfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX09VVERJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEZMTDJfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX09VVERJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEZMTDJfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0ZSQVRJT19NQVNLICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIEZMTDJfRlJBVElPIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfRlJBVElPX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMMl9GUkFUSU8gLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9GUkFUSU9fV0lEVEggICAgICAgICAgICAgICAgICAgICAzICAvKiBGTEwyX0ZSQVRJTyAtIFsyOjBdICovCisKKy8qCisgKiBSNDIwICgweDFBNCkgLSBGTEwyIENvbnRyb2wgMworICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1RIRVRBX01BU0sgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEZMTDJfVEhFVEEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfVEhFVEFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMMl9USEVUQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9USEVUQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBGTEwyX1RIRVRBIC0gWzE1OjBdICovCisKKy8qCisgKiBSNDIyICgweDFBNikgLSBGTEwyIENvbnRyb2wgNQorICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX05fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAzRkYgIC8qIEZMTDJfTiAtIFs5OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDJfTiAtIFs5OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX05fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEZMTDJfTiAtIFs5OjBdICovCisKKy8qCisgKiBSNDIzICgweDFBNykgLSBGTEwyIENvbnRyb2wgNgorICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19ESVZfTUFTSyAgICAgICAgICAgICAweDAwQzAgIC8qIEZMTDJfUkVGQ0xLX0RJViAtIFs3OjZdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19ESVZfU0hJRlQgICAgICAgICAgICAgICAgIDYgIC8qIEZMTDJfUkVGQ0xLX0RJViAtIFs3OjZdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19ESVZfV0lEVEggICAgICAgICAgICAgICAgIDIgIC8qIEZMTDJfUkVGQ0xLX0RJViAtIFs3OjZdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19TUkNfTUFTSyAgICAgICAgICAgICAweDAwMEYgIC8qIEZMTDJfUkVGQ0xLX1NSQyAtIFszOjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDJfUkVGQ0xLX1NSQyAtIFszOjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgIDQgIC8qIEZMTDJfUkVGQ0xLX1NSQyAtIFszOjBdICovCisKKy8qCisgKiBSNDI0ICgweDFBOCkgLSBGTEwyIEVGUyAxCisgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTEFNQkRBX01BU0sgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRkxMMl9MQU1CREEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTEFNQkRBX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMMl9MQU1CREEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTEFNQkRBX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogRkxMMl9MQU1CREEgLSBbMTU6MF0gKi8KKworLyoKKyAqIFI1MTIgKDB4MjAwKSAtIE1pYyBDaGFyZ2UgUHVtcCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0NQMl9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQ1AyX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfQ1AyX0JZUEFTU19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBDUDJfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9DUDJfQllQQVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIENQMl9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX0NQMl9CWVBBU1NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ1AyX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfQ1AyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBDUDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9DUDJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIENQMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0NQMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQ1AyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQ1AyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDUDJfRU5BICovCisKKy8qCisgKiBSNTEzICgweDIwMSkgLSBNaWMgQ2hhcmdlIFB1bXAgMgorICovCisjZGVmaW5lIFdNNTEwMF9MRE8yX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIExETzJfVlNFTCAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0xETzJfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMSAgLyogTERPMl9WU0VMIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfTERPMl9WU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMRE8yX1ZTRUwgLSBbMTU6MTFdICovCisKKy8qCisgKiBSNTE0ICgweDIwMikgLSBIUCBDaGFyZ2UgUHVtcCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0NQMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQ1AxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQ1AxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBDUDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9DUDFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIENQMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0NQMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ1AxX0VOQSAqLworCisvKgorICogUjUyOSAoMHgyMTEpIC0gTERPMSBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0xETzFfQllQQVNTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTERPMV9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX0xETzFfQllQQVNTX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTERPMV9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX0xETzFfQllQQVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMV9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX0xETzFfQllQQVNTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMV9CWVBBU1MgKi8KKworLyoKKyAqIFI1MzMgKDB4MjE1KSAtIE1pYyBCaWFzIEN0cmwgMQorICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9ESVNDSCAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9ESVNDSF9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9ESVNDSF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9ESVNDSF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE1JQ0IxX1JBVEUgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTUlDQjFfUkFURSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjFfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBNSUNCMV9SQVRFICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX1JBVEUgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxQyAgLyogTUlDQjFfTFZMIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTUlDQjFfTFZMIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTUlDQjFfTFZMIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlDQjFfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9CWVBBU1NfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIgIC8qIE1JQ0IxX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjFfQllQQVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCMV9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0JZUEFTU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjFfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0IxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjFfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSUNCMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTUlDQjFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX0VOQSAqLworCisvKgorICogUjUzNCAoMHgyMTYpIC0gTWljIEJpYXMgQ3RybCAyCisgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0RJU0NIICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0RJU0NIX01BU0sgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0RJU0NIX1NISUZUICAgICAgICAgICAgICAgICAgICAgNiAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0RJU0NIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX1JBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTUlDQjJfUkFURSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBNSUNCMl9SQVRFICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMl9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIE1JQ0IyX1JBVEUgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfUkFURSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDFDICAvKiBNSUNCMl9MVkwgLSBbNDoyXSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBNSUNCMl9MVkwgLSBbNDoyXSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBNSUNCMl9MVkwgLSBbNDoyXSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfQllQQVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBNSUNCMl9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0JZUEFTU19NQVNLICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlDQjJfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMl9CWVBBU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IyX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfQllQQVNTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCMl9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQjJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0IyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBNSUNCMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfRU5BICovCisKKy8qCisgKiBSNTM1ICgweDIxNykgLSBNaWMgQmlhcyBDdHJsIDMKKyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRElTQ0ggICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBNSUNCM19ESVNDSCAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRElTQ0hfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBNSUNCM19ESVNDSCAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRElTQ0hfU0hJRlQgICAgICAgICAgICAgICAgICAgICA2ICAvKiBNSUNCM19ESVNDSCAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRElTQ0hfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCM19ESVNDSCAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfUkFURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBNSUNCM19SQVRFICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19SQVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE1JQ0IzX1JBVEUgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IzX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTUlDQjNfUkFURSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCM19SQVRFICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUMgIC8qIE1JQ0IzX0xWTCAtIFs0OjJdICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIE1JQ0IzX0xWTCAtIFs0OjJdICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE1JQ0IzX0xWTCAtIFs0OjJdICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19CWVBBU1MgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIE1JQ0IzX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfQllQQVNTX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBNSUNCM19CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IzX0JZUEFTU19TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjNfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19CWVBBU1NfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IzX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSUNCM19FTkEgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IzX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQjNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1JQ0IzX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCM19FTkEgKi8KKworLyoKKyAqIFI2NDAgKDB4MjgwKSAtIEFjY2Vzc29yeSBEZXRlY3QgTW9kZSAxCisgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9CSUFTX1NSQ19NQVNLICAgICAgICAgICAgIDB4QzAwMCAgLyogQUNDREVUX0JJQVNfU1JDIC0gWzE1OjE0XSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0JJQVNfU1JDX1NISUZUICAgICAgICAgICAgICAgIDE0ICAvKiBBQ0NERVRfQklBU19TUkMgLSBbMTU6MTRdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfQklBU19TUkNfV0lEVEggICAgICAgICAgICAgICAgIDIgIC8qIEFDQ0RFVF9CSUFTX1NSQyAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9TUkMgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUNDREVUX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBBQ0NERVRfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEFDQ0RFVF9TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUNDREVUX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX01PREVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBBQ0NERVRfTU9ERSAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFDQ0RFVF9NT0RFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUNDREVUX01PREUgLSBbMTowXSAqLworCisvKgorICogUjY0OCAoMHgyODgpIC0gSGVhZHBob25lIERldGVjdCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0hQX0hPTERUSU1FX01BU0sgICAgICAgICAgICAgICAgIDB4MDBFMCAgLyogSFBfSE9MRFRJTUUgLSBbNzo1XSAqLworI2RlZmluZSBXTTUxMDBfSFBfSE9MRFRJTUVfU0hJRlQgICAgICAgICAgICAgICAgICAgICA1ICAvKiBIUF9IT0xEVElNRSAtIFs3OjVdICovCisjZGVmaW5lIFdNNTEwMF9IUF9IT0xEVElNRV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEhQX0hPTERUSU1FIC0gWzc6NV0gKi8KKyNkZWZpbmUgV001MTAwX0hQX0NMS19ESVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxOCAgLyogSFBfQ0xLX0RJViAtIFs0OjNdICovCisjZGVmaW5lIFdNNTEwMF9IUF9DTEtfRElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEhQX0NMS19ESVYgLSBbNDozXSAqLworI2RlZmluZSBXTTUxMDBfSFBfQ0xLX0RJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAyICAvKiBIUF9DTEtfRElWIC0gWzQ6M10gKi8KKyNkZWZpbmUgV001MTAwX0hQX1NURVBfU0laRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSFBfU1RFUF9TSVpFICovCisjZGVmaW5lIFdNNTEwMF9IUF9TVEVQX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEhQX1NURVBfU0laRSAqLworI2RlZmluZSBXTTUxMDBfSFBfU1RFUF9TSVpFX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBIUF9TVEVQX1NJWkUgKi8KKyNkZWZpbmUgV001MTAwX0hQX1NURVBfU0laRV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBfU1RFUF9TSVpFICovCisjZGVmaW5lIFdNNTEwMF9IUF9QT0xMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhQX1BPTEwgKi8KKyNkZWZpbmUgV001MTAwX0hQX1BPTExfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSFBfUE9MTCAqLworI2RlZmluZSBXTTUxMDBfSFBfUE9MTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBIUF9QT0xMICovCisjZGVmaW5lIFdNNTEwMF9IUF9QT0xMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQX1BPTEwgKi8KKworLyoKKyAqIFI2NDkgKDB4Mjg5KSAtIEhlYWRwaG9uZSBEZXRlY3QgMgorICovCisjZGVmaW5lIFdNNTEwMF9IUF9ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEhQX0RPTkUgKi8KKyNkZWZpbmUgV001MTAwX0hQX0RPTkVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSFBfRE9ORSAqLworI2RlZmluZSBXTTUxMDBfSFBfRE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBIUF9ET05FICovCisjZGVmaW5lIFdNNTEwMF9IUF9ET05FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQX0RPTkUgKi8KKyNkZWZpbmUgV001MTAwX0hQX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA3RiAgLyogSFBfTFZMIC0gWzY6MF0gKi8KKyNkZWZpbmUgV001MTAwX0hQX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSFBfTFZMIC0gWzY6MF0gKi8KKyNkZWZpbmUgV001MTAwX0hQX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogSFBfTFZMIC0gWzY6MF0gKi8KKworLyoKKyAqIFI2NTYgKDB4MjkwKSAtIE1pYyBEZXRlY3QgMQorICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfQklBU19TVEFSVFRJTUVfTUFTSyAgICAgICAweEYwMDAgIC8qIEFDQ0RFVF9CSUFTX1NUQVJUVElNRSAtIFsxNToxMl0gKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9CSUFTX1NUQVJUVElNRV9TSElGVCAgICAgICAgICAxMiAgLyogQUNDREVUX0JJQVNfU1RBUlRUSU1FIC0gWzE1OjEyXSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0JJQVNfU1RBUlRUSU1FX1dJRFRIICAgICAgICAgICA0ICAvKiBBQ0NERVRfQklBU19TVEFSVFRJTUUgLSBbMTU6MTJdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfUkFURV9NQVNLICAgICAgICAgICAgICAgICAweDBGMDAgIC8qIEFDQ0RFVF9SQVRFIC0gWzExOjhdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFDQ0RFVF9SQVRFIC0gWzExOjhdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFDQ0RFVF9SQVRFIC0gWzExOjhdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfREJUSU1FICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFDQ0RFVF9EQlRJTUUgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9EQlRJTUVfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUNDREVUX0RCVElNRSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0RCVElNRV9TSElGVCAgICAgICAgICAgICAgICAgICAxICAvKiBBQ0NERVRfREJUSU1FICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfREJUSU1FX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEFDQ0RFVF9EQlRJTUUgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUNDREVUX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBQ0NERVRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFDQ0RFVF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUNDREVUX0VOQSAqLworCisvKgorICogUjY1NyAoMHgyOTEpIC0gTWljIERldGVjdCAyCisgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9MVkxfU0VMX01BU0sgICAgICAgICAgICAgIDB4MDBGRiAgLyogQUNDREVUX0xWTF9TRUwgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0xWTF9TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBBQ0NERVRfTFZMX1NFTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfTFZMX1NFTF9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIEFDQ0RFVF9MVkxfU0VMIC0gWzc6MF0gKi8KKworLyoKKyAqIFI2NTggKDB4MjkyKSAtIE1pYyBEZXRlY3QgMworICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfTFZMX01BU0sgICAgICAgICAgICAgICAgICAweDA3RkMgIC8qIEFDQ0RFVF9MVkwgLSBbMTA6Ml0gKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUNDREVUX0xWTCAtIFsxMDoyXSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBBQ0NERVRfTFZMIC0gWzEwOjJdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfVkFMSUQgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFDQ0RFVF9WQUxJRCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX1ZBTElEX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBQ0NERVRfVkFMSUQgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9WQUxJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUNDREVUX1ZBTElEICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfVkFMSURfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFDQ0RFVF9WQUxJRCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX1NUUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBQ0NERVRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfU1RTX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFDQ0RFVF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUNDREVUX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBQ0NERVRfU1RTICovCisKKy8qCisgKiBSNjk5ICgweDJCQikgLSBNaXNjIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTUxMDBfSFBDT01fU1JDICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwICAvKiBIUENPTV9TUkMgKi8KKyNkZWZpbmUgV001MTAwX0hQQ09NX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogSFBDT01fU1JDICovCisKKy8qCisgKiBSNzY5ICgweDMwMSkgLSBJbnB1dCBFbmFibGVzCisgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSU40TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSU40TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogSU40TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSU40Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSU40Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogSU40Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogSU4zTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogSU4zTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogSU4zTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4zTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogSU4zUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogSU4zUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogSU4zUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4zUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogSU4yTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogSU4yTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogSU4yTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4yTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogSU4yUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogSU4yUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogSU4yUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4yUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSU4xTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSU4xTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU4xUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU4xUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSU4xUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xUl9FTkEgKi8KKworLyoKKyAqIFI3NzAgKDB4MzAyKSAtIElucHV0IEVuYWJsZXMgU3RhdHVzCisgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSU40TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjRMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwODAgIC8qIElONExfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU40TF9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICA3ICAvKiBJTjRMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElONFJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU40Ul9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBJTjRSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgNiAgLyogSU40Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIElONFJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4zTF9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBJTjNMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogSU4zTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDUgIC8qIElOM0xfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4zTF9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjNMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogSU4zUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjNSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElOM1JfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICA0ICAvKiBJTjNSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4zUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjJMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIElOMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4yTF9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBJTjJMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgMyAgLyogSU4yTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjJMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTjJSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogSU4yUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDIgIC8qIElOMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjJSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSU4xTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjFMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIgIC8qIElOMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjFMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElOMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4xUl9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBJTjFSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogSU4xUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMVJfRU5BX1NUUyAqLworCisvKgorICogUjc4NCAoMHgzMTApIC0gSU4xTCBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0lOX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4QzAwMCAgLyogSU5fUkFURSAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX0lOX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogSU5fUkFURSAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX0lOX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogSU5fUkFURSAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX0lOMV9PU1IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSU4xX09TUiAqLworI2RlZmluZSBXTTUxMDBfSU4xX09TUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTjFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjFfT1NSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIElOMV9PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lOMV9PU1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xX09TUiAqLworI2RlZmluZSBXTTUxMDBfSU4xX0RNSUNfU1VQX01BU0sgICAgICAgICAgICAgICAgMHgxODAwICAvKiBJTjFfRE1JQ19TVVAgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNNTEwMF9JTjFfRE1JQ19TVVBfU0hJRlQgICAgICAgICAgICAgICAgICAgMTEgIC8qIElOMV9ETUlDX1NVUCAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMV9ETUlDX1NVUF9XSURUSCAgICAgICAgICAgICAgICAgICAgMiAgLyogSU4xX0RNSUNfU1VQIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTUxMDBfSU4xX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwNjAwICAvKiBJTjFfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU4xX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTjFfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU4xX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJTjFfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMEZFICAvKiBJTjFMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjFMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICA3ICAvKiBJTjFMX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjc4NSAoMHgzMTEpIC0gSU4xUiBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRSAgLyogSU4xUl9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xUl9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgNyAgLyogSU4xUl9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFI3ODYgKDB4MzEyKSAtIElOMkwgQ29udHJvbAorICovCisjZGVmaW5lIFdNNTEwMF9JTjJfT1NSICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIElOMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lOMl9PU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSU4yX09TUiAqLworI2RlZmluZSBXTTUxMDBfSU4yX09TUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBJTjJfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjJfT1NSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lOMl9ETUlDX1NVUF9NQVNLICAgICAgICAgICAgICAgIDB4MTgwMCAgLyogSU4yX0RNSUNfU1VQIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTUxMDBfSU4yX0RNSUNfU1VQX1NISUZUICAgICAgICAgICAgICAgICAgIDExICAvKiBJTjJfRE1JQ19TVVAgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNNTEwMF9JTjJfRE1JQ19TVVBfV0lEVEggICAgICAgICAgICAgICAgICAgIDIgIC8qIElOMl9ETUlDX1NVUCAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMl9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDYwMCAgLyogSU4yX01PREUgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMl9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogSU4yX01PREUgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogSU4yX01PREUgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRSAgLyogSU4yTF9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4yTF9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgNyAgLyogSU4yTF9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFI3ODcgKDB4MzEzKSAtIElOMlIgQ29udHJvbAorICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX1BHQV9WT0xfTUFTSyAgICAgICAgICAgICAgICAweDAwRkUgIC8qIElOMlJfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX1BHQV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMlJfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX1BHQV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDcgIC8qIElOMlJfUEdBX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSNzg4ICgweDMxNCkgLSBJTjNMIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTUxMDBfSU4zX09TUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTjNfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjNfT1NSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIElOM19PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lOM19PU1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogSU4zX09TUiAqLworI2RlZmluZSBXTTUxMDBfSU4zX09TUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjNfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjNfRE1JQ19TVVBfTUFTSyAgICAgICAgICAgICAgICAweDE4MDAgIC8qIElOM19ETUlDX1NVUCAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV001MTAwX0lOM19ETUlDX1NVUF9TSElGVCAgICAgICAgICAgICAgICAgICAxMSAgLyogSU4zX0RNSUNfU1VQIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTUxMDBfSU4zX0RNSUNfU1VQX1dJRFRIICAgICAgICAgICAgICAgICAgICAyICAvKiBJTjNfRE1JQ19TVVAgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNNTEwMF9JTjNfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgICAweDA2MDAgIC8qIElOM19NT0RFIC0gWzEwOjldICovCisjZGVmaW5lIFdNNTEwMF9JTjNfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIElOM19NT0RFIC0gWzEwOjldICovCisjZGVmaW5lIFdNNTEwMF9JTjNfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIElOM19NT0RFIC0gWzEwOjldICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX1BHQV9WT0xfTUFTSyAgICAgICAgICAgICAgICAweDAwRkUgIC8qIElOM0xfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX1BHQV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOM0xfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX1BHQV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDcgIC8qIElOM0xfUEdBX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSNzg5ICgweDMxNSkgLSBJTjNSIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMEZFICAvKiBJTjNSX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjNSX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICA3ICAvKiBJTjNSX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjc5MCAoMHgzMTYpIC0gSU40TCBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0lONF9PU1IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSU40X09TUiAqLworI2RlZmluZSBXTTUxMDBfSU40X09TUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTjRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjRfT1NSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIElONF9PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lONF9PU1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40X09TUiAqLworI2RlZmluZSBXTTUxMDBfSU40X0RNSUNfU1VQX01BU0sgICAgICAgICAgICAgICAgMHgxODAwICAvKiBJTjRfRE1JQ19TVVAgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNNTEwMF9JTjRfRE1JQ19TVVBfU0hJRlQgICAgICAgICAgICAgICAgICAgMTEgIC8qIElONF9ETUlDX1NVUCAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV001MTAwX0lONF9ETUlDX1NVUF9XSURUSCAgICAgICAgICAgICAgICAgICAgMiAgLyogSU40X0RNSUNfU1VQIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTUxMDBfSU40X01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwNjAwICAvKiBJTjRfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU40X01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTjRfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU40X01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJTjRfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMEZFICAvKiBJTjRMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjRMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICA3ICAvKiBJTjRMX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjc5MSAoMHgzMTcpIC0gSU40UiBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRSAgLyogSU40Ul9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lONFJfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40Ul9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lONFJfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgNyAgLyogSU40Ul9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFI3OTIgKDB4MzE4KSAtIFJYQU5DX1NSQworICovCisjZGVmaW5lIFdNNTEwMF9JTl9SWEFOQ19TRUxfTUFTSyAgICAgICAgICAgICAgICAweDAwMDcgIC8qIElOX1JYQU5DX1NFTCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9JTl9SWEFOQ19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIElOX1JYQU5DX1NFTCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9JTl9SWEFOQ19TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgIDMgIC8qIElOX1JYQU5DX1NFTCAtIFsyOjBdICovCisKKy8qCisgKiBSNzkzICgweDMxOSkgLSBJbnB1dCBWb2x1bWUgUmFtcAorICovCisjZGVmaW5lIFdNNTEwMF9JTl9WRF9SQU1QX01BU0sgICAgICAgICAgICAgICAgICAweDAwNzAgIC8qIElOX1ZEX1JBTVAgLSBbNjo0XSAqLworI2RlZmluZSBXTTUxMDBfSU5fVkRfUkFNUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBJTl9WRF9SQU1QIC0gWzY6NF0gKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZEX1JBTVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMyAgLyogSU5fVkRfUkFNUCAtIFs2OjRdICovCisjZGVmaW5lIFdNNTEwMF9JTl9WSV9SQU1QX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIElOX1ZJX1JBTVAgLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfSU5fVklfUkFNUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTl9WSV9SQU1QIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZJX1JBTVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMyAgLyogSU5fVklfUkFNUCAtIFsyOjBdICovCisKKy8qCisgKiBSODAwICgweDMyMCkgLSBBREMgRGlnaXRhbCBWb2x1bWUgMUwKKyAqLworI2RlZmluZSBXTTUxMDBfSU5fVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU4xTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjFMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElOMUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogSU4xTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTjFMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjFMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElOMUxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFI4MDEgKDB4MzIxKSAtIEFEQyBEaWdpdGFsIFZvbHVtZSAxUgorICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElOMVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4xUl9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjFSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU4xUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4xUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBJTjFSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElOMVJfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU4xUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjgwMiAoMHgzMjIpIC0gQURDIERpZ2l0YWwgVm9sdW1lIDJMCisgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfTVVURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU4yTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjJMX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElOMkxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4yTF9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJTjJMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4yTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjJMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIElOMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSU4yTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU4yTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJTjJMX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSODAzICgweDMyMykgLSBBREMgRGlnaXRhbCBWb2x1bWUgMlIKKyAqLworI2RlZmluZSBXTTUxMDBfSU5fVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjJSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU4yUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElOMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjJSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogSU4yUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTjJSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElOMlJfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFI4MDQgKDB4MzI0KSAtIEFEQyBEaWdpdGFsIFZvbHVtZSAzTAorICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElOM0xfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4zTF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjNMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU4zTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOM0xfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4zTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBJTjNMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElOM0xfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU4zTF9WT0wgLSBbNzowXSAqLworCisvKgorICogUjgwNSAoMHgzMjUpIC0gQURDIERpZ2l0YWwgVm9sdW1lIDNSCisgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfTVVURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU4zUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjNSX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElOM1JfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJTjNSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4zUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjNSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIElOM1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSU4zUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJTjNSX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSODA2ICgweDMyNikgLSBBREMgRGlnaXRhbCBWb2x1bWUgNEwKKyAqLworI2RlZmluZSBXTTUxMDBfSU5fVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjRMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lONExfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU40TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjRMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElONExfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjRMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lONExfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogSU40TF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTjRMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjRMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElONExfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFI4MDcgKDB4MzI3KSAtIEFEQyBEaWdpdGFsIFZvbHVtZSA0UgorICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElONFJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU40Ul9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjRSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU40Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElONFJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU40Ul9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBJTjRSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElONFJfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lONFJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU40Ul9WT0wgLSBbNzowXSAqLworCisvKgorICogUjEwMjUgKDB4NDAxKSAtIE91dHB1dCBFbmFibGVzIDIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ2TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDZMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ2TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogT1VUNlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIE9VVDZSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBPVVQ2Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVDVMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVQ1TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUNUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDVMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ1Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDVSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ1Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogT1VUNExfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIE9VVDRMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBPVVQ0TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNExfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE9VVDRSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBPVVQ0Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogT1VUNFJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDRSX0VOQSAqLworCisvKgorICogUjEwMjYgKDB4NDAyKSAtIE91dHB1dCBTdGF0dXMgMQorICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE9VVDNMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDAyMCAgLyogT1VUM0xfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICA1ICAvKiBPVVQzTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDNMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogT1VUM1JfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwMDEwICAvKiBPVVQzUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgIDQgIC8qIE9VVDNSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM1JfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBPVVQyTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwMDggIC8qIE9VVDJMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMyAgLyogT1VUMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQyTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIE9VVDJSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDAwNCAgLyogT1VUMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAyICAvKiBPVVQyUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDJSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogT1VUMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwMDAyICAvKiBPVVQxTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBPVVQxUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwMDEgIC8qIE9VVDFSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQxUl9FTkFfU1RTICovCisKKy8qCisgKiBSMTAyNyAoMHg0MDMpIC0gT3V0cHV0IFN0YXR1cyAyCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ2TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDZMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBPVVQ2Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAweDA0MDAgIC8qIE9VVDZSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAxMCAgLyogT1VUNlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ2Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVDVMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUNUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVQ1TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDVMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ1Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDVSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBPVVQ0TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwODAgIC8qIE9VVDRMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgNyAgLyogT1VUNExfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE9VVDRSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDA0MCAgLyogT1VUNFJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICA2ICAvKiBPVVQ0Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDRSX0VOQV9TVFMgKi8KKworLyoKKyAqIFIxMDMyICgweDQwOCkgLSBDaGFubmVsIEVuYWJsZXMgMQorICovCisjZGVmaW5lIFdNNTEwMF9IUDNMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEhQM0xfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEhQM0xfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEhQM0xfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQM0xfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEhQM1JfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEhQM1JfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEhQM1JfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQM1JfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEhQMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEhQMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEhQMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEhQMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEhQMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEhQMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEhQMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEhQMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhQMVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhQMVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEhQMVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMVJfRU5BICovCisKKy8qCisgKiBSMTA0MCAoMHg0MTApIC0gT3V0IFZvbHVtZSAxTAorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAweEMwMDAgIC8qIE9VVF9SQVRFIC0gWzE1OjE0XSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBPVVRfUkFURSAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX09VVF9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogT1VUX1JBVEUgLSBbMTU6MTRdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX09TUiAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIE9VVDFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX09TUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIE9VVDFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX09TUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIE9VVDFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX09TUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIE9VVDFfTU9OTyAqLworI2RlZmluZSBXTTUxMDBfT1VUMV9NT05PX01BU0sgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBPVVQxX01PTk8gKi8KKyNkZWZpbmUgV001MTAwX09VVDFfTU9OT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogT1VUMV9NT05PICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX01PTk9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFfTU9OTyAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfQU5DX1NSQyAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQxTF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9BTkNfU1JDX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDFMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX0FOQ19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogT1VUMUxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfQU5DX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQxTF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAweDAwRkUgIC8qIE9VVDFMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQxTF9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX1BHQV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgNyAgLyogT1VUMUxfUEdBX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSMTA0MSAoMHg0MTEpIC0gT3V0IFZvbHVtZSAxUgorICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9BTkNfU1JDICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDFSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX0FOQ19TUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUMVJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfQU5DX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgIDExICAvKiBPVVQxUl9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9BTkNfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX1BHQV9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRSAgLyogT1VUMVJfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFSX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA3ICAvKiBPVVQxUl9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFIxMDQyICgweDQxMikgLSBEQUMgVm9sdW1lIExpbWl0IDFMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX1ZPTF9MSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUMUxfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9WT0xfTElNX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDFMX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfVk9MX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQxTF9WT0xfTElNIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDQzICgweDQxMykgLSBEQUMgVm9sdW1lIExpbWl0IDFSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX1ZPTF9MSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUMVJfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9WT0xfTElNX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDFSX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfVk9MX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQxUl9WT0xfTElNIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDQ0ICgweDQxNCkgLSBPdXQgVm9sdW1lIDJMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfT1NSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogT1VUMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfT1NSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogT1VUMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfT1NSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogT1VUMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfT1NSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfTU9OTyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogT1VUMl9NT05PICovCisjZGVmaW5lIFdNNTEwMF9PVVQyX01PTk9fTUFTSyAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIE9VVDJfTU9OTyAqLworI2RlZmluZSBXTTUxMDBfT1VUMl9NT05PX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBPVVQyX01PTk8gKi8KKyNkZWZpbmUgV001MTAwX09VVDJfTU9OT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMl9NT05PICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9BTkNfU1JDICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDJMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX0FOQ19TUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUMkxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfQU5DX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgIDExICAvKiBPVVQyTF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9BTkNfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDJMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1BHQV9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRSAgLyogT1VUMkxfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDJMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA3ICAvKiBPVVQyTF9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFIxMDQ1ICgweDQxNSkgLSBPdXQgVm9sdW1lIDJSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX0FOQ19TUkMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUMlJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfQU5DX1NSQ19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQyUl9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9BTkNfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDJSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX0FOQ19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMlJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMEZFICAvKiBPVVQyUl9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX1BHQV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMlJfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgIDcgIC8qIE9VVDJSX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjEwNDYgKDB4NDE2KSAtIERBQyBWb2x1bWUgTGltaXQgMkwKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfVk9MX0xJTV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQyTF9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1ZPTF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUMkxfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9WT0xfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDJMX1ZPTF9MSU0gLSBbNzowXSAqLworCisvKgorICogUjEwNDcgKDB4NDE3KSAtIERBQyBWb2x1bWUgTGltaXQgMlIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfVk9MX0xJTV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQyUl9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX1ZPTF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUMlJfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9WT0xfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDJSX1ZPTF9MSU0gLSBbNzowXSAqLworCisvKgorICogUjEwNDggKDB4NDE4KSAtIE91dCBWb2x1bWUgM0wKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUM19PU1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBPVVQzX09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUM19PU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBPVVQzX09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUM19PU1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBPVVQzX09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUM19PU1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzX09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUM19NT05PICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBPVVQzX01PTk8gKi8KKyNkZWZpbmUgV001MTAwX09VVDNfTU9OT19NQVNLICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogT1VUM19NT05PICovCisjZGVmaW5lIFdNNTEwMF9PVVQzX01PTk9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIE9VVDNfTU9OTyAqLworI2RlZmluZSBXTTUxMDBfT1VUM19NT05PX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzX01PTk8gKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX0FOQ19TUkMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUM0xfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfQU5DX1NSQ19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQzTF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9BTkNfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDNMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX0FOQ19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM0xfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMEZFICAvKiBPVVQzTF9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX1BHQV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM0xfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgIDcgIC8qIE9VVDNMX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjEwNDkgKDB4NDE5KSAtIE91dCBWb2x1bWUgM1IKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfQU5DX1NSQyAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQzUl9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9BTkNfU1JDX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDNSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX0FOQ19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogT1VUM1JfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfQU5DX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzUl9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAweDAwRkUgIC8qIE9VVDNSX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzUl9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1BHQV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgNyAgLyogT1VUM1JfUEdBX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSMTA1MCAoMHg0MUEpIC0gREFDIFZvbHVtZSBMaW1pdCAzTAorICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9WT0xfTElNX01BU0sgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDNMX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfVk9MX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQzTF9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX1ZPTF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogT1VUM0xfVk9MX0xJTSAtIFs3OjBdICovCisKKy8qCisgKiBSMTA1MSAoMHg0MUIpIC0gREFDIFZvbHVtZSBMaW1pdCAzUgorICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9WT0xfTElNX01BU0sgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDNSX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfVk9MX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQzUl9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1ZPTF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogT1VUM1JfVk9MX0xJTSAtIFs3OjBdICovCisKKy8qCisgKiBSMTA1MiAoMHg0MUMpIC0gT3V0IFZvbHVtZSA0TAorICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0X09TUiAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIE9VVDRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0X09TUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIE9VVDRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0X09TUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIE9VVDRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0X09TUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9BTkNfU1JDICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDRMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX0FOQ19TUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNExfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfQU5DX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgIDExICAvKiBPVVQ0TF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9BTkNfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDRMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX1ZPTF9MSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUNExfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9WT0xfTElNX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDRMX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfVk9MX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ0TF9WT0xfTElNIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDUzICgweDQxRCkgLSBPdXQgVm9sdW1lIDRSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX0FOQ19TUkMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNFJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfQU5DX1NSQ19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ0Ul9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9BTkNfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDRSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX0FOQ19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNFJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfVk9MX0xJTV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQ0Ul9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX1ZPTF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUNFJfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9WT0xfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDRSX1ZPTF9MSU0gLSBbNzowXSAqLworCisvKgorICogUjEwNTQgKDB4NDFFKSAtIERBQyBWb2x1bWUgTGltaXQgNUwKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUNV9PU1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBPVVQ1X09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUNV9PU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBPVVQ1X09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUNV9PU1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBPVVQ1X09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUNV9PU1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ1X09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfQU5DX1NSQyAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ1TF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9BTkNfU1JDX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDVMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX0FOQ19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogT1VUNUxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfQU5DX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ1TF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9WT0xfTElNX01BU0sgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDVMX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfVk9MX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQ1TF9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX1ZPTF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNUxfVk9MX0xJTSAtIFs3OjBdICovCisKKy8qCisgKiBSMTA1NSAoMHg0MUYpIC0gREFDIFZvbHVtZSBMaW1pdCA1UgorICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9BTkNfU1JDICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDVSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX0FOQ19TUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNVJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfQU5DX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgIDExICAvKiBPVVQ1Ul9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9BTkNfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDVSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX1ZPTF9MSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUNVJfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9WT0xfTElNX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDVSX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfVk9MX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ1Ul9WT0xfTElNIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDU2ICgweDQyMCkgLSBEQUMgVm9sdW1lIExpbWl0IDZMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDZfT1NSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogT1VUNl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDZfT1NSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogT1VUNl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDZfT1NSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogT1VUNl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDZfT1NSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0FOQ19TUkMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNkxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfQU5DX1NSQ19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ2TF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9BTkNfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDZMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0FOQ19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNkxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfVk9MX0xJTV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQ2TF9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX1ZPTF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUNkxfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9WT0xfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDZMX1ZPTF9MSU0gLSBbNzowXSAqLworCisvKgorICogUjEwNTcgKDB4NDIxKSAtIERBQyBWb2x1bWUgTGltaXQgNlIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfQU5DX1NSQyAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ2Ul9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9BTkNfU1JDX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDZSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX0FOQ19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogT1VUNlJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfQU5DX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ2Ul9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9WT0xfTElNX01BU0sgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDZSX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfVk9MX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQ2Ul9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX1ZPTF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNlJfVk9MX0xJTSAtIFs3OjBdICovCisKKy8qCisgKiBSMTA4OCAoMHg0NDApIC0gREFDIEFFQyBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0xPT1BCQUNLX1NSQ19NQVNLICAgICAgICAgICAgMHgwMDNDICAvKiBBRUNfTE9PUEJBQ0tfU1JDIC0gWzU6Ml0gKi8KKyNkZWZpbmUgV001MTAwX0FFQ19MT09QQkFDS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgMiAgLyogQUVDX0xPT1BCQUNLX1NSQyAtIFs1OjJdICovCisjZGVmaW5lIFdNNTEwMF9BRUNfTE9PUEJBQ0tfU1JDX1dJRFRIICAgICAgICAgICAgICAgIDQgIC8qIEFFQ19MT09QQkFDS19TUkMgLSBbNToyXSAqLworI2RlZmluZSBXTTUxMDBfQUVDX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRUNfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRUNfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRUNfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBRUNfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0xPT1BCQUNLX0VOQSAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRUNfTE9PUEJBQ0tfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BRUNfTE9PUEJBQ0tfRU5BX01BU0sgICAgICAgICAgICAweDAwMDEgIC8qIEFFQ19MT09QQkFDS19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FFQ19MT09QQkFDS19FTkFfU0hJRlQgICAgICAgICAgICAgICAgMCAgLyogQUVDX0xPT1BCQUNLX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUVDX0xPT1BCQUNLX0VOQV9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBRUNfTE9PUEJBQ0tfRU5BICovCisKKy8qCisgKiBSMTA4OSAoMHg0NDEpIC0gT3V0cHV0IFZvbHVtZSBSYW1wCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WRF9SQU1QX01BU0sgICAgICAgICAgICAgICAgIDB4MDA3MCAgLyogT1VUX1ZEX1JBTVAgLSBbNjo0XSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZEX1JBTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0ICAvKiBPVVRfVkRfUkFNUCAtIFs2OjRdICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVkRfUkFNUF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE9VVF9WRF9SQU1QIC0gWzY6NF0gKi8KKyNkZWZpbmUgV001MTAwX09VVF9WSV9SQU1QX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogT1VUX1ZJX1JBTVAgLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZJX1JBTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVRfVklfUkFNUCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVklfUkFNUF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE9VVF9WSV9SQU1QIC0gWzI6MF0gKi8KKworLyoKKyAqIFIxMTUyICgweDQ4MCkgLSBEQUMgRGlnaXRhbCBWb2x1bWUgMUwKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUMUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQxTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQxTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQxTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQxTF9WT0wgLSBbNzowXSAqLworCisvKgorICogUjExNTMgKDB4NDgxKSAtIERBQyBEaWdpdGFsIFZvbHVtZSAxUgorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQxUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDFSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUMVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQxUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDFSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDFSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDFSX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMTE1NCAoMHg0ODIpIC0gREFDIERpZ2l0YWwgVm9sdW1lIDJMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDJMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUMkxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQyTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDJMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUMkxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMTU1ICgweDQ4MykgLSBEQUMgRGlnaXRhbCBWb2x1bWUgMlIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQyUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDJSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQyUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQyUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQyUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjExNTYgKDB4NDg0KSAtIERBQyBEaWdpdGFsIFZvbHVtZSAzTAorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQzTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDNMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUM0xfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDNMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDNMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDNMX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMTE1NyAoMHg0ODUpIC0gREFDIERpZ2l0YWwgVm9sdW1lIDNSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDNSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUM1JfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQzUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDNSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUM1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUM1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUM1JfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMTU4ICgweDQ4NikgLSBEQUMgRGlnaXRhbCBWb2x1bWUgNEwKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNExfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ0TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDRMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNExfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQ0TF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQ0TF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ0TF9WT0wgLSBbNzowXSAqLworCisvKgorICogUjExNTkgKDB4NDg3KSAtIERBQyBEaWdpdGFsIFZvbHVtZSA0UgorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ0Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDRSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNFJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDRSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDRSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDRSX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMTE2MCAoMHg0ODgpIC0gREFDIERpZ2l0YWwgVm9sdW1lIDVMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDVMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ1TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDVMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUNUxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUNUxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNUxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMTYxICgweDQ4OSkgLSBEQUMgRGlnaXRhbCBWb2x1bWUgNVIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ1Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDVSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQ1Ul9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQ1Ul9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ1Ul9WT0wgLSBbNzowXSAqLworCisvKgorICogUjExNjIgKDB4NDhBKSAtIERBQyBEaWdpdGFsIFZvbHVtZSA2TAorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ2TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDZMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNkxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ2TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDZMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDZMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDZMX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMTE2MyAoMHg0OEIpIC0gREFDIERpZ2l0YWwgVm9sdW1lIDZSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDZSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ2Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDZSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUNlJfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUNlJfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNlJfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMjE2ICgweDRDMCkgLSBQRE0gU1BLMSBDVFJMIDEKKyAqLworI2RlZmluZSBXTTUxMDBfU1BLMVJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBTUEsxUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsxUl9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFNQSzFSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzFSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMyAgLyogU1BLMVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMVJfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEsxUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsxTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIFNQSzFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzFMX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogU1BLMUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMUxfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBTUEsxTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsxTF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNQSzFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzFfTVVURV9FTkRJQU4gICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogU1BLMV9NVVRFX0VORElBTiAqLworI2RlZmluZSBXTTUxMDBfU1BLMV9NVVRFX0VORElBTl9NQVNLICAgICAgICAgICAgMHgwMTAwICAvKiBTUEsxX01VVEVfRU5ESUFOICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX01VVEVfRU5ESUFOX1NISUZUICAgICAgICAgICAgICAgIDggIC8qIFNQSzFfTVVURV9FTkRJQU4gKi8KKyNkZWZpbmUgV001MTAwX1NQSzFfTVVURV9FTkRJQU5fV0lEVEggICAgICAgICAgICAgICAgMSAgLyogU1BLMV9NVVRFX0VORElBTiAqLworI2RlZmluZSBXTTUxMDBfU1BLMV9NVVRFX1NFUTFfTUFTSyAgICAgICAgICAgICAgMHgwMEZGICAvKiBTUEsxX01VVEVfU0VRMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX01VVEVfU0VRMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIFNQSzFfTVVURV9TRVExIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX1NQSzFfTVVURV9TRVExX1dJRFRIICAgICAgICAgICAgICAgICAgOCAgLyogU1BLMV9NVVRFX1NFUTEgLSBbNzowXSAqLworCisvKgorICogUjEyMTcgKDB4NEMxKSAtIFBETSBTUEsxIENUUkwgMgorICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX0ZNVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFNQSzFfRk1UICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX0ZNVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFNQSzFfRk1UICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX0ZNVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFNQSzFfRk1UICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX0ZNVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNQSzFfRk1UICovCisKKy8qCisgKiBSMTIxOCAoMHg0QzIpIC0gUERNIFNQSzIgQ1RSTCAxCisgKi8KKyNkZWZpbmUgV001MTAwX1NQSzJSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogU1BLMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMlJfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBTUEsyUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsyUl9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIFNQSzJSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzJSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMkxfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBTUEsyTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsyTF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIFNQSzJMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzJMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMiAgLyogU1BLMkxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMkxfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEsyTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsyX01VVEVfRU5ESUFOICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFNQSzJfTVVURV9FTkRJQU4gKi8KKyNkZWZpbmUgV001MTAwX1NQSzJfTVVURV9FTkRJQU5fTUFTSyAgICAgICAgICAgIDB4MDEwMCAgLyogU1BLMl9NVVRFX0VORElBTiAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9NVVRFX0VORElBTl9TSElGVCAgICAgICAgICAgICAgICA4ICAvKiBTUEsyX01VVEVfRU5ESUFOICovCisjZGVmaW5lIFdNNTEwMF9TUEsyX01VVEVfRU5ESUFOX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIFNQSzJfTVVURV9FTkRJQU4gKi8KKyNkZWZpbmUgV001MTAwX1NQSzJfTVVURV9TRVExX01BU0sgICAgICAgICAgICAgIDB4MDBGRiAgLyogU1BLMl9NVVRFX1NFUTEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9NVVRFX1NFUTFfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBTUEsyX01VVEVfU0VRMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9TUEsyX01VVEVfU0VRMV9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIFNQSzJfTVVURV9TRVExIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMjE5ICgweDRDMykgLSBQRE0gU1BLMiBDVFJMIDIKKyAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9GTVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTUEsyX0ZNVCAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTUEsyX0ZNVCAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9GTVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBTUEsyX0ZNVCAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9GTVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEsyX0ZNVCAqLworCisvKgorICogUjEyODAgKDB4NTAwKSAtIEF1ZGlvIElGIDFfMQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0JDTEtfSU5WICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFfQkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfQkNMS19JTlZfTUFTSyAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQUlGMV9CQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgICA3ICAvKiBBSUYxX0JDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0JDTEtfSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFfQkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfQkNMS19GUkMgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGMV9CQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX0ZSQ19NQVNLICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBSUYxX0JDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0JDTEtfRlJDX1NISUZUICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFfQkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfQkNMS19GUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMV9CQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX01TVFIgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYxX0JDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX01TVFJfTUFTSyAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYxX0JDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX01TVFJfU0hJRlQgICAgICAgICAgICAgICAgICA1ICAvKiBBSUYxX0JDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX01TVFJfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYxX0JDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX0ZSRVFfTUFTSyAgICAgICAgICAgICAgMHgwMDFGICAvKiBBSUYxX0JDTEtfRlJFUSAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0JDTEtfRlJFUV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFfQkNMS19GUkVRIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfQkNMS19GUkVRX1dJRFRIICAgICAgICAgICAgICAgICAgNSAgLyogQUlGMV9CQ0xLX0ZSRVEgLSBbNDowXSAqLworCisvKgorICogUjEyODEgKDB4NTAxKSAtIEF1ZGlvIElGIDFfMgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfREFUX1RSSSAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFUWF9EQVRfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfREFUX1RSSV9NQVNLICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFUWF9EQVRfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfREFUX1RSSV9TSElGVCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjFUWF9EQVRfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfREFUX1RSSV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWF9EQVRfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfU1JDICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFUWF9MUkNMS19TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9MUkNMS19TUkNfTUFTSyAgICAgICAgICAgIDB4MDAwOCAgLyogQUlGMVRYX0xSQ0xLX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX0xSQ0xLX1NSQ19TSElGVCAgICAgICAgICAgICAgICAzICAvKiBBSUYxVFhfTFJDTEtfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfU1JDX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWF9MUkNMS19TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9MUkNMS19JTlYgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGMVRYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX0xSQ0xLX0lOVl9NQVNLICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYxVFhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfSU5WX1NISUZUICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFUWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9MUkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGMVRYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX0xSQ0xLX0ZSQyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYxVFhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfRlJDX01BU0sgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFUWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9MUkNMS19GUkNfU0hJRlQgICAgICAgICAgICAgICAgMSAgLyogQUlGMVRYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX0xSQ0xLX0ZSQ19XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYxVFhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUiAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFUWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUl9NQVNLICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFUWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUl9TSElGVCAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUl9XSURUSCAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWF9MUkNMS19NU1RSICovCisKKy8qCisgKiBSMTI4MiAoMHg1MDIpIC0gQXVkaW8gSUYgMV8zCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9MUkNMS19JTlYgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGMVJYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYX0xSQ0xLX0lOVl9NQVNLICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYxUlhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfSU5WX1NISUZUICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFSWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9MUkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGMVJYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYX0xSQ0xLX0ZSQyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYxUlhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfRlJDX01BU0sgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFSWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9MUkNMS19GUkNfU0hJRlQgICAgICAgICAgICAgICAgMSAgLyogQUlGMVJYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYX0xSQ0xLX0ZSQ19XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYxUlhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfTVNUUiAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfTVNUUl9NQVNLICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfTVNUUl9TSElGVCAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfTVNUUl9XSURUSCAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWF9MUkNMS19NU1RSICovCisKKy8qCisgKiBSMTI4MyAoMHg1MDMpIC0gQXVkaW8gSUYgMV80CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVFJJICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGMV9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVFJJX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGMV9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVFJJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMV9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVFJJX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMV9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogQUlGMV9SQVRFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMV9SQVRFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlGMV9SQVRFIC0gWzE6MF0gKi8KKworLyoKKyAqIFIxMjg0ICgweDUwNCkgLSBBdWRpbyBJRiAxXzUKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBBSUYxX0ZNVCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0ZNVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFfRk1UIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfRk1UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogQUlGMV9GTVQgLSBbMjowXSAqLworCisvKgorICogUjEyODUgKDB4NTA1KSAtIEF1ZGlvIElGIDFfNgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfQkNQRl9NQVNLICAgICAgICAgICAgICAgICAweDFGRkYgIC8qIEFJRjFUWF9CQ1BGIC0gWzEyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfQkNQRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWF9CQ1BGIC0gWzEyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfQkNQRl9XSURUSCAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEFJRjFUWF9CQ1BGIC0gWzEyOjBdICovCisKKy8qCisgKiBSMTI4NiAoMHg1MDYpIC0gQXVkaW8gSUYgMV83CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9CQ1BGX01BU0sgICAgICAgICAgICAgICAgIDB4MUZGRiAgLyogQUlGMVJYX0JDUEYgLSBbMTI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9CQ1BGX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMVJYX0JDUEYgLSBbMTI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9CQ1BGX1dJRFRIICAgICAgICAgICAgICAgICAgICAxMyAgLyogQUlGMVJYX0JDUEYgLSBbMTI6MF0gKi8KKworLyoKKyAqIFIxMjg3ICgweDUwNykgLSBBdWRpbyBJRiAxXzgKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX1dMX01BU0sgICAgICAgICAgICAgICAgICAgMHgzRjAwICAvKiBBSUYxVFhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9XTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQUlGMVRYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfV0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX1NMT1RfTEVOX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBBSUYxVFhfU0xPVF9MRU4gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX1NMT1RfTEVOX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBBSUYxVFhfU0xPVF9MRU4gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX1NMT1RfTEVOX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBBSUYxVFhfU0xPVF9MRU4gLSBbNzowXSAqLworCisvKgorICogUjEyODggKDB4NTA4KSAtIEF1ZGlvIElGIDFfOQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfV0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDNGMDAgIC8qIEFJRjFSWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYX1dMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBSUYxUlhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9XTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMVJYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfU0xPVF9MRU5fTUFTSyAgICAgICAgICAgICAweDAwRkYgIC8qIEFJRjFSWF9TTE9UX0xFTiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfU0xPVF9MRU5fU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWF9TTE9UX0xFTiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfU0xPVF9MRU5fV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIEFJRjFSWF9TTE9UX0xFTiAtIFs3OjBdICovCisKKy8qCisgKiBSMTI4OSAoMHg1MDkpIC0gQXVkaW8gSUYgMV8xMAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDFfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDFfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDFfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5MCAoMHg1MEEpIC0gQXVkaW8gSUYgMV8xMQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDJfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDJfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDJfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5MSAoMHg1MEIpIC0gQXVkaW8gSUYgMV8xMgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDNfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDNfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDNfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5MiAoMHg1MEMpIC0gQXVkaW8gSUYgMV8xMworICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDRfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDRfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDRfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5MyAoMHg1MEQpIC0gQXVkaW8gSUYgMV8xNAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDVfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDVfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDVfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5NCAoMHg1MEUpIC0gQXVkaW8gSUYgMV8xNQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDZfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDZfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDZfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5NSAoMHg1MEYpIC0gQXVkaW8gSUYgMV8xNgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDdfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDdfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDdfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5NiAoMHg1MTApIC0gQXVkaW8gSUYgMV8xNworICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDhfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDhfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDhfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5NyAoMHg1MTEpIC0gQXVkaW8gSUYgMV8xOAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDFfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDFfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDFfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5OCAoMHg1MTIpIC0gQXVkaW8gSUYgMV8xOQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDJfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDJfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDJfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5OSAoMHg1MTMpIC0gQXVkaW8gSUYgMV8yMAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDNfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDNfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDNfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwMCAoMHg1MTQpIC0gQXVkaW8gSUYgMV8yMQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDRfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDRfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDRfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwMSAoMHg1MTUpIC0gQXVkaW8gSUYgMV8yMgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDVfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDVfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDVfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwMiAoMHg1MTYpIC0gQXVkaW8gSUYgMV8yMworICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDZfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDZfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDZfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwMyAoMHg1MTcpIC0gQXVkaW8gSUYgMV8yNAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDdfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDdfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDdfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwNCAoMHg1MTgpIC0gQXVkaW8gSUYgMV8yNQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDhfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDhfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDhfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwNSAoMHg1MTkpIC0gQXVkaW8gSUYgMV8yNgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFUWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFUWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEFJRjFUWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjFUWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjFUWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFUWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFUWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjFUWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjFUWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjFUWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFJRjFUWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFUWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFUWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRjFUWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjFUWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjFUWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFUWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFUWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFUWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFUWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFUWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDFfRU5BICovCisKKy8qCisgKiBSMTMwNiAoMHg1MUEpIC0gQXVkaW8gSUYgMV8yNworICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFSWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFSWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEFJRjFSWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjFSWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjFSWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFSWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFSWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjFSWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjFSWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjFSWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFJRjFSWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFSWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFSWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRjFSWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjFSWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjFSWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFSWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFSWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFSWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDFfRU5BICovCisKKy8qCisgKiBSMTM0NCAoMHg1NDApIC0gQXVkaW8gSUYgMl8xCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfQkNMS19JTlYgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQUlGMl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9CQ0xLX0lOVl9NQVNLICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBSUYyX0JDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfSU5WX1NISUZUICAgICAgICAgICAgICAgICAgIDcgIC8qIEFJRjJfQkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfQkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9CQ0xLX0ZSQyAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBSUYyX0JDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfRlJDX01BU0sgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjJfQkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfQkNMS19GUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMl9CQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9CQ0xLX0ZSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYyX0JDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfTVNUUiAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjJfQkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfTVNUUl9NQVNLICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjJfQkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfTVNUUl9TSElGVCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjJfQkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfTVNUUl9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJfQkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfRlJFUV9NQVNLICAgICAgICAgICAgICAweDAwMUYgIC8qIEFJRjJfQkNMS19GUkVRIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfQkNMS19GUkVRX1NISUZUICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMl9CQ0xLX0ZSRVEgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9CQ0xLX0ZSRVFfV0lEVEggICAgICAgICAgICAgICAgICA1ICAvKiBBSUYyX0JDTEtfRlJFUSAtIFs0OjBdICovCisKKy8qCisgKiBSMTM0NSAoMHg1NDEpIC0gQXVkaW8gSUYgMl8yCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9EQVRfVFJJICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGMlRYX0RBVF9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9EQVRfVFJJX01BU0sgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGMlRYX0RBVF9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9EQVRfVFJJX1NISUZUICAgICAgICAgICAgICAgICAgNSAgLyogQUlGMlRYX0RBVF9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9EQVRfVFJJX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYX0RBVF9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19TUkMgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQUlGMlRYX0xSQ0xLX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX0xSQ0xLX1NSQ19NQVNLICAgICAgICAgICAgMHgwMDA4ICAvKiBBSUYyVFhfTFJDTEtfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfTFJDTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgIDMgIC8qIEFJRjJUWF9MUkNMS19TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYX0xSQ0xLX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX0xSQ0xLX0lOViAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYyVFhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfTFJDTEtfSU5WX01BU0sgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjJUWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgMiAgLyogQUlGMlRYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX0xSQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYyVFhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfTFJDTEtfRlJDICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjJUWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19GUkNfTUFTSyAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlRYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX0xSQ0xLX0ZSQ19TSElGVCAgICAgICAgICAgICAgICAxICAvKiBBSUYyVFhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfTFJDTEtfRlJDX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJUWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19NU1RSICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlRYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19NU1RSX01BU0sgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlRYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19NU1RSX1NISUZUICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19NU1RSX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYX0xSQ0xLX01TVFIgKi8KKworLyoKKyAqIFIxMzQ2ICgweDU0MikgLSBBdWRpbyBJRiAyXzMKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0xSQ0xLX0lOViAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYyUlhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhfTFJDTEtfSU5WX01BU0sgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjJSWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgMiAgLyogQUlGMlJYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0xSQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYyUlhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhfTFJDTEtfRlJDICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjJSWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19GUkNfTUFTSyAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlJYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0xSQ0xLX0ZSQ19TSElGVCAgICAgICAgICAgICAgICAxICAvKiBBSUYyUlhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhfTFJDTEtfRlJDX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJSWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19NU1RSICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlJYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19NU1RSX01BU0sgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlJYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19NU1RSX1NISUZUICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19NU1RSX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYX0xSQ0xLX01TVFIgKi8KKworLyoKKyAqIFIxMzQ3ICgweDU0MykgLSBBdWRpbyBJRiAyXzQKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9UUkkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBSUYyX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9UUklfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBSUYyX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9UUklfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYyX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9UUklfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYyX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9SQVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBBSUYyX1JBVEUgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYyX1JBVEUgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBSUYyX1JBVEUgLSBbMTowXSAqLworCisvKgorICogUjEzNDggKDB4NTQ0KSAtIEF1ZGlvIElGIDJfNQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0ZNVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIEFJRjJfRk1UIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfRk1UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMl9GTVQgLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9GTVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBSUYyX0ZNVCAtIFsyOjBdICovCisKKy8qCisgKiBSMTM0OSAoMHg1NDUpIC0gQXVkaW8gSUYgMl82CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9CQ1BGX01BU0sgICAgICAgICAgICAgICAgIDB4MUZGRiAgLyogQUlGMlRYX0JDUEYgLSBbMTI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9CQ1BGX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYX0JDUEYgLSBbMTI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9CQ1BGX1dJRFRIICAgICAgICAgICAgICAgICAgICAxMyAgLyogQUlGMlRYX0JDUEYgLSBbMTI6MF0gKi8KKworLyoKKyAqIFIxMzUwICgweDU0NikgLSBBdWRpbyBJRiAyXzcKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0JDUEZfTUFTSyAgICAgICAgICAgICAgICAgMHgxRkZGICAvKiBBSUYyUlhfQkNQRiAtIFsxMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0JDUEZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYyUlhfQkNQRiAtIFsxMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0JDUEZfV0lEVEggICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUYyUlhfQkNQRiAtIFsxMjowXSAqLworCisvKgorICogUjEzNTEgKDB4NTQ3KSAtIEF1ZGlvIElGIDJfOAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfV0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDNGMDAgIC8qIEFJRjJUWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX1dMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBSUYyVFhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9XTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlRYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfU0xPVF9MRU5fTUFTSyAgICAgICAgICAgICAweDAwRkYgIC8qIEFJRjJUWF9TTE9UX0xFTiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfU0xPVF9MRU5fU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjJUWF9TTE9UX0xFTiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfU0xPVF9MRU5fV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIEFJRjJUWF9TTE9UX0xFTiAtIFs3OjBdICovCisKKy8qCisgKiBSMTM1MiAoMHg1NDgpIC0gQXVkaW8gSUYgMl85CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9XTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4M0YwMCAgLyogQUlGMlJYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhfV0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFJRjJSWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX1dMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYyUlhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9TTE9UX0xFTl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogQUlGMlJYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9TTE9UX0xFTl9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9TTE9UX0xFTl9XSURUSCAgICAgICAgICAgICAgICAgOCAgLyogQUlGMlJYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMzUzICgweDU0OSkgLSBBdWRpbyBJRiAyXzEwCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfU0xPVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogQUlGMlRYMV9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYMV9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlRYMV9TTE9UIC0gWzU6MF0gKi8KKworLyoKKyAqIFIxMzU0ICgweDU0QSkgLSBBdWRpbyBJRiAyXzExCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfU0xPVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogQUlGMlRYMl9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYMl9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlRYMl9TTE9UIC0gWzU6MF0gKi8KKworLyoKKyAqIFIxMzYxICgweDU1MSkgLSBBdWRpbyBJRiAyXzE4CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfU0xPVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogQUlGMlJYMV9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYMV9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlJYMV9TTE9UIC0gWzU6MF0gKi8KKworLyoKKyAqIFIxMzYyICgweDU1MikgLSBBdWRpbyBJRiAyXzE5CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfU0xPVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogQUlGMlJYMl9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYMl9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlJYMl9TTE9UIC0gWzU6MF0gKi8KKworLyoKKyAqIFIxMzY5ICgweDU1OSkgLSBBdWRpbyBJRiAyXzI2CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlRYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlRYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlRYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlRYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYMV9FTkEgKi8KKworLyoKKyAqIFIxMzcwICgweDU1QSkgLSBBdWRpbyBJRiAyXzI3CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlJYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlJYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlJYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlJYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYMV9FTkEgKi8KKworLyoKKyAqIFIxNDA4ICgweDU4MCkgLSBBdWRpbyBJRiAzXzEKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM19CQ0xLX0lOViAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBSUYzX0JDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0JDTEtfSU5WX01BU0sgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjNfQkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgNyAgLyogQUlGM19CQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGM19CQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzX0JDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0JDTEtfRlJDICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjNfQkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19GUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGM19CQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM19CQ0xLX0ZSQ19TSElGVCAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzX0JDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0JDTEtfRlJDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNfQkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19NU1RSICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGM19CQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19NU1RSX01BU0sgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGM19CQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19NU1RSX1NISUZUICAgICAgICAgICAgICAgICAgNSAgLyogQUlGM19CQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19NU1RSX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQUlGM19CQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19GUkVRX01BU0sgICAgICAgICAgICAgIDB4MDAxRiAgLyogQUlGM19CQ0xLX0ZSRVEgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM19CQ0xLX0ZSRVFfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzX0JDTEtfRlJFUSAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0JDTEtfRlJFUV9XSURUSCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjNfQkNMS19GUkVRIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNDA5ICgweDU4MSkgLSBBdWRpbyBJRiAzXzIKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0RBVF9UUkkgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYzVFhfREFUX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0RBVF9UUklfTUFTSyAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYzVFhfREFUX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0RBVF9UUklfU0hJRlQgICAgICAgICAgICAgICAgICA1ICAvKiBBSUYzVFhfREFUX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0RBVF9UUklfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFhfREFUX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX1NSQyAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBSUYzVFhfTFJDTEtfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfTFJDTEtfU1JDX01BU0sgICAgICAgICAgICAweDAwMDggIC8qIEFJRjNUWF9MUkNMS19TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9MUkNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgMyAgLyogQUlGM1RYX0xSQ0xLX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX1NSQ19XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFhfTFJDTEtfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfTFJDTEtfSU5WICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjNUWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9MUkNMS19JTlZfTUFTSyAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGM1RYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAyICAvKiBBSUYzVFhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfTFJDTEtfSU5WX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNUWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9MUkNMS19GUkMgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGM1RYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX0ZSQ19NQVNLICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzVFhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfTFJDTEtfRlJDX1NISUZUICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNUWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9MUkNMS19GUkNfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGM1RYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX01TVFIgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzVFhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX01TVFJfTUFTSyAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzVFhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX01TVFJfU0hJRlQgICAgICAgICAgICAgICAwICAvKiBBSUYzVFhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX01TVFJfV0lEVEggICAgICAgICAgICAgICAxICAvKiBBSUYzVFhfTFJDTEtfTVNUUiAqLworCisvKgorICogUjE0MTAgKDB4NTgyKSAtIEF1ZGlvIElGIDNfMworICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfTFJDTEtfSU5WICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjNSWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWF9MUkNMS19JTlZfTUFTSyAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGM1JYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAyICAvKiBBSUYzUlhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfTFJDTEtfSU5WX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWF9MUkNMS19GUkMgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGM1JYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX0ZSQ19NQVNLICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzUlhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfTFJDTEtfRlJDX1NISUZUICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWF9MUkNMS19GUkNfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGM1JYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX01TVFIgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX01TVFJfTUFTSyAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX01TVFJfU0hJRlQgICAgICAgICAgICAgICAwICAvKiBBSUYzUlhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX01TVFJfV0lEVEggICAgICAgICAgICAgICAxICAvKiBBSUYzUlhfTFJDTEtfTVNUUiAqLworCisvKgorICogUjE0MTEgKDB4NTgzKSAtIEF1ZGlvIElGIDNfNAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1RSSSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjNfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1RSSV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjNfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1RSSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjNfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1RSSV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIEFJRjNfUkFURSAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjNfUkFURSAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjNfUkFURSAtIFsxOjBdICovCisKKy8qCisgKiBSMTQxMiAoMHg1ODQpIC0gQXVkaW8gSUYgM181CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfRk1UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogQUlGM19GTVQgLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM19GTVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzX0ZNVCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0ZNVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRjNfRk1UIC0gWzI6MF0gKi8KKworLyoKKyAqIFIxNDEzICgweDU4NSkgLSBBdWRpbyBJRiAzXzYKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0JDUEZfTUFTSyAgICAgICAgICAgICAgICAgMHgxRkZGICAvKiBBSUYzVFhfQkNQRiAtIFsxMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0JDUEZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzVFhfQkNQRiAtIFsxMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0JDUEZfV0lEVEggICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUYzVFhfQkNQRiAtIFsxMjowXSAqLworCisvKgorICogUjE0MTQgKDB4NTg2KSAtIEF1ZGlvIElGIDNfNworICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfQkNQRl9NQVNLICAgICAgICAgICAgICAgICAweDFGRkYgIC8qIEFJRjNSWF9CQ1BGIC0gWzEyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfQkNQRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjNSWF9CQ1BGIC0gWzEyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfQkNQRl9XSURUSCAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEFJRjNSWF9CQ1BGIC0gWzEyOjBdICovCisKKy8qCisgKiBSMTQxNSAoMHg1ODcpIC0gQXVkaW8gSUYgM184CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9XTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4M0YwMCAgLyogQUlGM1RYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfV0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFJRjNUWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX1dMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzVFhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9TTE9UX0xFTl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogQUlGM1RYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9TTE9UX0xFTl9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogQUlGM1RYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9TTE9UX0xFTl9XSURUSCAgICAgICAgICAgICAgICAgOCAgLyogQUlGM1RYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxNDE2ICgweDU4OCkgLSBBdWRpbyBJRiAzXzkKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX1dMX01BU0sgICAgICAgICAgICAgICAgICAgMHgzRjAwICAvKiBBSUYzUlhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWF9XTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQUlGM1JYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfV0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjNSWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX1NMT1RfTEVOX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBBSUYzUlhfU0xPVF9MRU4gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX1NMT1RfTEVOX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBBSUYzUlhfU0xPVF9MRU4gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX1NMT1RfTEVOX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBBSUYzUlhfU0xPVF9MRU4gLSBbNzowXSAqLworCisvKgorICogUjE0MTcgKDB4NTg5KSAtIEF1ZGlvIElGIDNfMTAKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9TTE9UX01BU0sgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBBSUYzVFgxX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzVFgxX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9TTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzVFgxX1NMT1QgLSBbNTowXSAqLworCisvKgorICogUjE0MTggKDB4NThBKSAtIEF1ZGlvIElGIDNfMTEKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9TTE9UX01BU0sgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBBSUYzVFgyX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzVFgyX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9TTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzVFgyX1NMT1QgLSBbNTowXSAqLworCisvKgorICogUjE0MjUgKDB4NTkxKSAtIEF1ZGlvIElGIDNfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9TTE9UX01BU0sgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBBSUYzUlgxX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzUlgxX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9TTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzUlgxX1NMT1QgLSBbNTowXSAqLworCisvKgorICogUjE0MjYgKDB4NTkyKSAtIEF1ZGlvIElGIDNfMTkKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9TTE9UX01BU0sgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBBSUYzUlgyX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzUlgyX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9TTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzUlgyX1NMT1QgLSBbNTowXSAqLworCisvKgorICogUjE0MzMgKDB4NTk5KSAtIEF1ZGlvIElGIDNfMjYKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzVFgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzVFgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzVFgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzVFgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzVFgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFgxX0VOQSAqLworCisvKgorICogUjE0MzQgKDB4NTlBKSAtIEF1ZGlvIElGIDNfMjcKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzUlgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzUlgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzUlgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzUlgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzUlgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzUlgxX0VOQSAqLworCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAweDAwRkUgIC8qIE1JWEVSX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JWEVSX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDcgIC8qIE1JWEVSX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSMzA3MiAoMHhDMDApIC0gR1BJTyBDVFJMIDEKKyAqLworI2RlZmluZSBXTTUxMDBfR1AxX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDFfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDFfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQMV9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1AxX0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1AxX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDFfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQMV9QVSAqLworI2RlZmluZSBXTTUxMDBfR1AxX1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDFfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1AxX1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDFfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMV9QVSAqLworI2RlZmluZSBXTTUxMDBfR1AxX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1AxX1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDFfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQMV9QRCAqLworI2RlZmluZSBXTTUxMDBfR1AxX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1AxX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AxX1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDFfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDFfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQMV9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AxX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AxX09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDFfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDFfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQMV9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1AxX09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1AxX09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDFfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQMV9EQiAqLworI2RlZmluZSBXTTUxMDBfR1AxX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDFfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1AxX0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDFfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMV9EQiAqLworI2RlZmluZSBXTTUxMDBfR1AxX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDFfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDFfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQMV9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1AxX0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1AxX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDFfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQMV9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDFfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQMV9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDFfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQMV9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3MyAoMHhDMDEpIC0gR1BJTyBDVFJMIDIKKyAqLworI2RlZmluZSBXTTUxMDBfR1AyX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDJfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDJfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQMl9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1AyX0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1AyX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDJfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQMl9QVSAqLworI2RlZmluZSBXTTUxMDBfR1AyX1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDJfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1AyX1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDJfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMl9QVSAqLworI2RlZmluZSBXTTUxMDBfR1AyX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1AyX1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDJfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQMl9QRCAqLworI2RlZmluZSBXTTUxMDBfR1AyX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1AyX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AyX1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDJfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDJfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQMl9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AyX09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDJfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDJfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQMl9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1AyX09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1AyX09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDJfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQMl9EQiAqLworI2RlZmluZSBXTTUxMDBfR1AyX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDJfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1AyX0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDJfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMl9EQiAqLworI2RlZmluZSBXTTUxMDBfR1AyX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDJfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDJfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQMl9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1AyX0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1AyX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDJfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQMl9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDJfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQMl9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDJfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQMl9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3NCAoMHhDMDIpIC0gR1BJTyBDVFJMIDMKKyAqLworI2RlZmluZSBXTTUxMDBfR1AzX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDNfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDNfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQM19ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQM19ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1AzX0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1AzX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDNfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQM19QVSAqLworI2RlZmluZSBXTTUxMDBfR1AzX1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDNfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQM19QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1AzX1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDNfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQM19QVSAqLworI2RlZmluZSBXTTUxMDBfR1AzX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1AzX1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDNfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQM19QRCAqLworI2RlZmluZSBXTTUxMDBfR1AzX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1AzX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AzX1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDNfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDNfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQM19QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQM19QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AzX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AzX09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDNfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDNfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQM19PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQM19PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1AzX09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1AzX09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDNfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQM19EQiAqLworI2RlZmluZSBXTTUxMDBfR1AzX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDNfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQM19EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1AzX0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDNfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQM19EQiAqLworI2RlZmluZSBXTTUxMDBfR1AzX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDNfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDNfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQM19MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQM19MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1AzX0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1AzX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDNfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQM19GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDNfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQM19GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDNfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQM19GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3NSAoMHhDMDMpIC0gR1BJTyBDVFJMIDQKKyAqLworI2RlZmluZSBXTTUxMDBfR1A0X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDRfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDRfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQNF9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1A0X0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1A0X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDRfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQNF9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A0X1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1A0X1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDRfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNF9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A0X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1A0X1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDRfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQNF9QRCAqLworI2RlZmluZSBXTTUxMDBfR1A0X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1A0X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A0X1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDRfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDRfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQNF9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A0X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A0X09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDRfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDRfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQNF9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1A0X09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1A0X09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDRfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQNF9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A0X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDRfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1A0X0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDRfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNF9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A0X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDRfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDRfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQNF9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1A0X0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1A0X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDRfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQNF9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDRfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQNF9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDRfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQNF9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3NiAoMHhDMDQpIC0gR1BJTyBDVFJMIDUKKyAqLworI2RlZmluZSBXTTUxMDBfR1A1X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDVfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDVfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQNV9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1A1X0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1A1X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDVfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQNV9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A1X1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDVfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1A1X1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDVfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNV9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A1X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDVfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1A1X1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDVfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQNV9QRCAqLworI2RlZmluZSBXTTUxMDBfR1A1X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1A1X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A1X1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDVfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDVfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQNV9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A1X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A1X09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDVfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDVfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQNV9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1A1X09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1A1X09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDVfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQNV9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A1X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDVfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1A1X0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDVfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNV9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A1X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDVfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDVfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQNV9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1A1X0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1A1X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDVfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQNV9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDVfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQNV9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDVfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQNV9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3NyAoMHhDMDUpIC0gR1BJTyBDVFJMIDYKKyAqLworI2RlZmluZSBXTTUxMDBfR1A2X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDZfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDZfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQNl9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1A2X0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1A2X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDZfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDZfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQNl9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A2X1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDZfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1A2X1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDZfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNl9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A2X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDZfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1A2X1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDZfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQNl9QRCAqLworI2RlZmluZSBXTTUxMDBfR1A2X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDZfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1A2X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A2X1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDZfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDZfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQNl9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A2X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A2X09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDZfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDZfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQNl9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1A2X09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1A2X09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDZfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDZfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQNl9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A2X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDZfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1A2X0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDZfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNl9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A2X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDZfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDZfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQNl9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1A2X0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1A2X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDZfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDZfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQNl9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDZfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQNl9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDZfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQNl9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzEwNyAoMHhDMjMpIC0gTWlzYyBQYWQgQ3RybCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0xETzFFTkFfUEQgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTERPMUVOQV9QRCAqLworI2RlZmluZSBXTTUxMDBfTERPMUVOQV9QRF9NQVNLICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBMRE8xRU5BX1BEICovCisjZGVmaW5lIFdNNTEwMF9MRE8xRU5BX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIExETzFFTkFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0xETzFFTkFfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMUVOQV9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzJfUEQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzJfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzJfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzJfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzFfUEQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBNQ0xLMV9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzFfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBNQ0xLMV9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzFfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBNQ0xLMV9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzFfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNQ0xLMV9QRCAqLworI2RlZmluZSBXTTUxMDBfUkVTRVRfUFUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBSRVNFVF9QVSAqLworI2RlZmluZSBXTTUxMDBfUkVTRVRfUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBSRVNFVF9QVSAqLworI2RlZmluZSBXTTUxMDBfUkVTRVRfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSRVNFVF9QVSAqLworI2RlZmluZSBXTTUxMDBfUkVTRVRfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSRVNFVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUREUl9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRERSX1BEICovCisjZGVmaW5lIFdNNTEwMF9BRERSX1BEX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFERFJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FERFJfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUREUl9QRCAqLworI2RlZmluZSBXTTUxMDBfQUREUl9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRERSX1BEICovCisKKy8qCisgKiBSMzEwOCAoMHhDMjQpIC0gTWlzYyBQYWQgQ3RybCAyCisgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQ0X1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRE1JQ0RBVDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQ0X1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRE1JQ0RBVDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQ0X1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMyAgLyogRE1JQ0RBVDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQ0X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQzX1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQzX1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQzX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMiAgLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQzX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQyX1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRE1JQ0RBVDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQyX1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRE1JQ0RBVDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQyX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQyX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQxX1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRE1JQ0RBVDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQxX1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRE1JQ0RBVDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQxX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRE1JQ0RBVDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQxX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDFfUEQgKi8KKworLyoKKyAqIFIzMTA5ICgweEMyNSkgLSBNaXNjIFBhZCBDdHJsIDMKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUFUgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYxUlhMUkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUFVfTUFTSyAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYxUlhMUkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUFVfU0hJRlQgICAgICAgICAgICAgICAgICA1ICAvKiBBSUYxUlhMUkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUFVfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYxUlhMUkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUEQgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBBSUYxUlhMUkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUERfTUFTSyAgICAgICAgICAgICAgMHgwMDEwICAvKiBBSUYxUlhMUkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUERfU0hJRlQgICAgICAgICAgICAgICAgICA0ICAvKiBBSUYxUlhMUkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUERfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYxUlhMUkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUFUgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBSUYxQkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUFVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBSUYxQkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAzICAvKiBBSUYxQkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxQkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUEQgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYxQkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUERfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYxQkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyICAvKiBBSUYxQkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxQkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYREFUX1BVICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYxUlhEQVRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWERBVF9QVV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMVJYREFUX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhEQVRfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWERBVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYREFUX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxUlhEQVRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWERBVF9QRCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMVJYREFUX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhEQVRfUERfTUFTSyAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWERBVF9QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYREFUX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYxUlhEQVRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWERBVF9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMVJYREFUX1BEICovCisKKy8qCisgKiBSMzExMCAoMHhDMjYpIC0gTWlzYyBQYWQgQ3RybCA0CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BVICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGMlJYTFJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BVX01BU0sgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGMlJYTFJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BVX1NISUZUICAgICAgICAgICAgICAgICAgNSAgLyogQUlGMlJYTFJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYTFJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BEICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogQUlGMlJYTFJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BEX01BU0sgICAgICAgICAgICAgIDB4MDAxMCAgLyogQUlGMlJYTFJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BEX1NISUZUICAgICAgICAgICAgICAgICAgNCAgLyogQUlGMlJYTFJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYTFJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BVICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQUlGMkJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BVX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQUlGMkJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgMyAgLyogQUlGMkJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMkJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGMkJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGMkJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlGMkJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMkJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWERBVF9QVSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlJYREFUX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhEQVRfUFVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjJSWERBVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYREFUX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYyUlhEQVRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWERBVF9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYREFUX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhEQVRfUEQgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjJSWERBVF9QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYREFUX1BEX01BU0sgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYyUlhEQVRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWERBVF9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYREFUX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhEQVRfUERfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJSWERBVF9QRCAqLworCisvKgorICogUjMxMTEgKDB4QzI3KSAtIE1pc2MgUGFkIEN0cmwgNQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QVSAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjNSWExSQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QVV9NQVNLICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjNSWExSQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QVV9TSElGVCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjNSWExSQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QVV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWExSQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QRCAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjNSWExSQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QRF9NQVNLICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjNSWExSQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QRF9TSElGVCAgICAgICAgICAgICAgICAgIDQgIC8qIEFJRjNSWExSQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QRF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWExSQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QVSAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjNCQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QVV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjNCQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRjNCQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNCQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QRCAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjNCQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QRF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjNCQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjNCQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNCQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhEQVRfUFUgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjNSWERBVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYREFUX1BVX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzUlhEQVRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWERBVF9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGM1JYREFUX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhEQVRfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWERBVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYREFUX1BEICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlhEQVRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWERBVF9QRF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGM1JYREFUX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhEQVRfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjNSWERBVF9QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYREFUX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzUlhEQVRfUEQgKi8KKworLyoKKyAqIFIzMTEyICgweEMyOCkgLSBNaXNjIEdQSU8gMQorICovCisjZGVmaW5lIFdNNTEwMF9PUENMS19TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIE9QQ0xLX1NFTCAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9PUENMS19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9QQ0xLX1NFTCAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9PUENMS19TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIE9QQ0xLX1NFTCAtIFsxOjBdICovCisKKy8qCisgKiBSMzMyOCAoMHhEMDApIC0gSW50ZXJydXB0IFN0YXR1cyAxCisgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1A2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1A2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogR1A2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogR1A0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogR1A0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogR1A0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogR1AzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogR1AzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogR1AzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1AxX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1AxX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogR1AxX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AxX0VJTlQgKi8KKworLyoKKyAqIFIzMzI5ICgweEQwMSkgLSBJbnRlcnJ1cHQgU3RhdHVzIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTZfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBEU1BfSVJRNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNl9FSU5UX01BU0sgICAgICAgICAgICAgICAweDAwMjAgIC8qIERTUF9JUlE2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE2X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgNSAgLyogRFNQX0lSUTZfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNV9FSU5UICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERTUF9JUlE1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE1X0VJTlRfTUFTSyAgICAgICAgICAgICAgIDB4MDAxMCAgLyogRFNQX0lSUTVfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTVfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICA0ICAvKiBEU1BfSVJRNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUF9JUlE1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE0X0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRFNQX0lSUTRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTRfRUlOVF9NQVNLICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEU1BfSVJRNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDMgIC8qIERTUF9JUlE0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE0X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTNfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBEU1BfSVJRM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRM19FSU5UX01BU0sgICAgICAgICAgICAgICAweDAwMDQgIC8qIERTUF9JUlEzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEzX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMiAgLyogRFNQX0lSUTNfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTNfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMl9FSU5UICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERTUF9JUlEyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEyX0VJTlRfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRFNQX0lSUTJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUF9JUlEyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlExX0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRFNQX0lSUTFfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTFfRUlOVF9NQVNLICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEU1BfSVJRMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUF9JUlExX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlExX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTFfRUlOVCAqLworCisvKgorICogUjMzMzAgKDB4RDAyKSAtIEludGVycnVwdCBTdGF0dXMgMworICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9FSU5UICAgICAgICAgICAweDgwMDAgIC8qIFNQS19TSFVURE9XTl9XQVJOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9XQVJOX0VJTlRfTUFTSyAgICAgIDB4ODAwMCAgLyogU1BLX1NIVVRET1dOX1dBUk5fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfU1BLX1NIVVRET1dOX1dBUk5fRUlOVF9TSElGVCAgICAgICAgIDE1ICAvKiBTUEtfU0hVVERPV05fV0FSTl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9FSU5UX1dJRFRIICAgICAgICAgIDEgIC8qIFNQS19TSFVURE9XTl9XQVJOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9FSU5UICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogU1BLX1NIVVRET1dOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9FSU5UX01BU0sgICAgICAgICAgIDB4NDAwMCAgLyogU1BLX1NIVVRET1dOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9FSU5UX1NISUZUICAgICAgICAgICAgICAxNCAgLyogU1BLX1NIVVRET1dOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogU1BLX1NIVVRET1dOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0hQREVUX0VJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSFBERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSFBERVRfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBIUERFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9IUERFVF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEhQREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0hQREVUX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBBQ0NERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBBQ0NERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEyICAvKiBBQ0NERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBQ0NERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfRUlOVCAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBEUkNfU0lHX0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9FSU5UX01BU0sgICAgICAgICAgICAweDAyMDAgIC8qIERSQ19TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgOSAgLyogRFJDX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBEUkNfU0lHX0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMl9MT0NLX0VJTlQgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFTUkMyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19FSU5UX01BU0sgICAgICAgICAgICAgMHgwMTAwICAvKiBBU1JDMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMyX0xPQ0tfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgOCAgLyogQVNSQzJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMl9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIEFTUkMyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19FSU5UICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBU1JDMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMxX0xPQ0tfRUlOVF9NQVNLICAgICAgICAgICAgIDB4MDA4MCAgLyogQVNSQzFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMV9MT0NLX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgIDcgIC8qIEFTUkMxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19FSU5UX01BU0sgICAgICAgICAgICAgIDB4MDAwOCAgLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgMyAgLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19FSU5UX01BU0sgICAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgMiAgLyogRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DTEtHRU5fRVJSX0VJTlRfTUFTSyAgICAgICAgICAgICAweDAwMDIgIC8qIENMS0dFTl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQ0xLR0VOX0VSUl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAxICAvKiBDTEtHRU5fRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DTEtHRU5fRVJSX0FTWU5DX0VJTlQgICAgICAgICAgICAweDAwMDEgIC8qIENMS0dFTl9FUlJfQVNZTkNfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQ0xLR0VOX0VSUl9BU1lOQ19FSU5UX01BU0sgICAgICAgMHgwMDAxICAvKiBDTEtHRU5fRVJSX0FTWU5DX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfRUlOVF9TSElGVCAgICAgICAgICAgMCAgLyogQ0xLR0VOX0VSUl9BU1lOQ19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DTEtHRU5fRVJSX0FTWU5DX0VJTlRfV0lEVEggICAgICAgICAgIDEgIC8qIENMS0dFTl9FUlJfQVNZTkNfRUlOVCAqLworCisvKgorICogUjMzMzEgKDB4RDAzKSAtIEludGVycnVwdCBTdGF0dXMgNAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0VSUl9FSU5UICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRjNfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfRVJSX0VJTlRfTUFTSyAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUlGM19FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGM19FUlJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUYzX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0VSUl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfRVJSX0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogQUlGMl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9FUlJfRUlOVF9NQVNLICAgICAgICAgICAgICAgMHgxMDAwICAvKiBBSUYyX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0VSUl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgMTIgIC8qIEFJRjJfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfRVJSX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9FUlJfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBBSUYxX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0VSUl9FSU5UX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIEFJRjFfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfRVJSX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogQUlGMV9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9FUlJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DVFJMSUZfRVJSX0VJTlQgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIENUUkxJRl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQ1RSTElGX0VSUl9FSU5UX01BU0sgICAgICAgICAgICAgMHgwNDAwICAvKiBDVFJMSUZfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAxMCAgLyogQ1RSTElGX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DVFJMSUZfRVJSX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIENUUkxJRl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgMHgwMjAwICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAgMHgwMjAwICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICA5ICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAxICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgMHgwMTAwICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAgMHgwMTAwICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICA4ICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAxICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgICAgMHgwMDgwICAvKiBGWF9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAgICAgMHgwMDgwICAvKiBGWF9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICAgICA3ICAvKiBGWF9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAgICAxICAvKiBGWF9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGM19VTkRFUkNMT0NLRURfRUlOVCAgICAgICAgICAgMHgwMDQwICAvKiBBSUYzX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgICAweDAwNDAgIC8qIEFJRjNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICAgNiAgLyogQUlGM19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGM19VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgICAgICAxICAvKiBBSUYzX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgICAweDAwMjAgIC8qIEFJRjJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAgIDB4MDAyMCAgLyogQUlGMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9VTkRFUkNMT0NLRURfRUlOVF9TSElGVCAgICAgICAgICA1ICAvKiBBSUYyX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAgIDEgIC8qIEFJRjJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgIDB4MDAxMCAgLyogQUlGMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgICAgMHgwMDEwICAvKiBBSUYxX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgICAgIDQgIC8qIEFJRjFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAgMSAgLyogQUlGMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQ19VTkRFUkNMT0NLRURfRUlOVCAgICAgICAgICAgMHgwMDA4ICAvKiBBU1JDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BU1JDX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgICAweDAwMDggIC8qIEFTUkNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICAgMyAgLyogQVNSQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQ19VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgICAgICAxICAvKiBBU1JDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgICAweDAwMDQgIC8qIERBQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfREFDX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgICAgMHgwMDA0ICAvKiBEQUNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RBQ19VTkRFUkNMT0NLRURfRUlOVF9TSElGVCAgICAgICAgICAgMiAgLyogREFDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAgIDEgIC8qIERBQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQURDX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgICAgMHgwMDAyICAvKiBBRENfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FEQ19VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgICAgIDB4MDAwMiAgLyogQURDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICAgIDEgIC8qIEFEQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQURDX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAgICAxICAvKiBBRENfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgIDB4MDAwMSAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgIDB4MDAwMSAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgICAgMCAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAgMSAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKworLyoKKyAqIFIzMzMyICgweEQwNCkgLSBJbnRlcnJ1cHQgUmF3IFN0YXR1cyAyCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE2X1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogRFNQX0lSUTZfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNl9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwMjAgIC8qIERTUF9JUlE2X1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTZfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICA1ICAvKiBEU1BfSVJRNl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE2X1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTZfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNV9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERTUF9JUlE1X1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTVfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEU1BfSVJRNV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE1X1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgNCAgLyogRFNQX0lSUTVfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUF9JUlE1X1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTRfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEU1BfSVJRNF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE0X1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRFNQX0lSUTRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDMgIC8qIERTUF9JUlE0X1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTRfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRNF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEzX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRFNQX0lSUTNfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRM19TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERTUF9JUlEzX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTNfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICAyICAvKiBEU1BfSVJRM19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEzX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTNfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMl9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERTUF9JUlEyX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTJfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEU1BfSVJRMl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEyX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMl9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUF9JUlEyX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTFfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEU1BfSVJRMV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlExX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRFNQX0lSUTFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUF9JUlExX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRMV9TVFMgKi8KKworLyoKKyAqIFIzMzMzICgweEQwNSkgLSBJbnRlcnJ1cHQgUmF3IFN0YXR1cyAzCisgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9XQVJOX1NUUyAgICAgICAgICAgIDB4ODAwMCAgLyogU1BLX1NIVVRET1dOX1dBUk5fU1RTICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9TVFNfTUFTSyAgICAgICAweDgwMDAgIC8qIFNQS19TSFVURE9XTl9XQVJOX1NUUyAqLworI2RlZmluZSBXTTUxMDBfU1BLX1NIVVRET1dOX1dBUk5fU1RTX1NISUZUICAgICAgICAgIDE1ICAvKiBTUEtfU0hVVERPV05fV0FSTl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9XQVJOX1NUU19XSURUSCAgICAgICAgICAgMSAgLyogU1BLX1NIVVRET1dOX1dBUk5fU1RTICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fU1RTICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIFNQS19TSFVURE9XTl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9TVFNfTUFTSyAgICAgICAgICAgIDB4NDAwMCAgLyogU1BLX1NIVVRET1dOX1NUUyAqLworI2RlZmluZSBXTTUxMDBfU1BLX1NIVVRET1dOX1NUU19TSElGVCAgICAgICAgICAgICAgIDE0ICAvKiBTUEtfU0hVVERPV05fU1RTICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fU1RTX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIFNQS19TSFVURE9XTl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0hQREVUX1NUUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSFBERVRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9IUERFVF9TVFNfTUFTSyAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEhQREVUX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSFBERVRfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBIUERFVF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0hQREVUX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBERVRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lEX0RFVF9TVFMgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIERSQ19TSURfREVUX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJRF9ERVRfU1RTX01BU0sgICAgICAgICAgICAgMHgwMjAwICAvKiBEUkNfU0lEX0RFVF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSURfREVUX1NUU19TSElGVCAgICAgICAgICAgICAgICAgOSAgLyogRFJDX1NJRF9ERVRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lEX0RFVF9TVFNfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIERSQ19TSURfREVUX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19TVFMgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBU1JDMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMTAwICAvKiBBU1JDMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19TVFNfU0hJRlQgICAgICAgICAgICAgICAgICA4ICAvKiBBU1JDMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19TVFMgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDgwICAvKiBBU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19TVFNfU0hJRlQgICAgICAgICAgICAgICAgICA3ICAvKiBBU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9MT0NLX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBGTEwyX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0xPQ0tfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwMDggIC8qIEZMTDJfTE9DS19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMyAgLyogRkxMMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9MT0NLX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBGTEwyX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xPQ0tfU1RTICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEZMTDFfTE9DS19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9MT0NLX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAyICAvKiBGTEwxX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xPQ0tfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTDFfTE9DS19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfU1RTICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfU1RTX01BU0sgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTICAgICAgICAgICAgIDB4MDAwMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTX01BU0sgICAgICAgIDB4MDAwMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTX1NISUZUICAgICAgICAgICAgMCAgLyogQ0xLR0VOX0VSUl9BU1lOQ19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTX1dJRFRIICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19TVFMgKi8KKworLyoKKyAqIFIzMzM0ICgweEQwNikgLSBJbnRlcnJ1cHQgUmF3IFN0YXR1cyA0CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfRVJSX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUlGM19FUlJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0VSUl9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRjNfRVJSX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGM19FUlJfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUYzX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfRVJSX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGM19FUlJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0VSUl9TVFMgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEFJRjJfRVJSX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9FUlJfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBBSUYyX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfRVJSX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAxMiAgLyogQUlGMl9FUlJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0VSUl9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJfRVJSX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9FUlJfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBBSUYxX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfRVJSX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogQUlGMV9FUlJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0VSUl9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMTEgIC8qIEFJRjFfRVJSX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9FUlJfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfU1RTICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogQ1RSTElGX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfU1RTX01BU0sgICAgICAgICAgICAgIDB4MDQwMCAgLyogQ1RSTElGX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfU1RTX1NISUZUICAgICAgICAgICAgICAgICAxMCAgLyogQ1RSTElGX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQ1RSTElGX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX1VOREVSQ0xPQ0tFRF9TVFMgICAgICAgICAgIDB4MDIwMCAgLyogSVNSQzJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX1NUU19NQVNLICAgICAgMHgwMjAwICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9VTkRFUkNMT0NLRURfU1RTX1NISUZUICAgICAgICAgIDkgIC8qIElTUkMyX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX1VOREVSQ0xPQ0tFRF9TVFNfV0lEVEggICAgICAgICAgMSAgLyogSVNSQzJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgMHgwMTAwICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9VTkRFUkNMT0NLRURfU1RTX01BU0sgICAgICAweDAxMDAgIC8qIElTUkMxX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX1VOREVSQ0xPQ0tFRF9TVFNfU0hJRlQgICAgICAgICAgOCAgLyogSVNSQzFfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAxICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GWF9VTkRFUkNMT0NLRURfU1RTICAgICAgICAgICAgICAweDAwODAgIC8qIEZYX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0ZYX1VOREVSQ0xPQ0tFRF9TVFNfTUFTSyAgICAgICAgIDB4MDA4MCAgLyogRlhfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAgICA3ICAvKiBGWF9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GWF9VTkRFUkNMT0NLRURfU1RTX1dJRFRIICAgICAgICAgICAgIDEgIC8qIEZYX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGM19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1VOREVSQ0xPQ0tFRF9TVFNfTUFTSyAgICAgICAweDAwNDAgIC8qIEFJRjNfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGM19VTkRFUkNMT0NLRURfU1RTX1NISUZUICAgICAgICAgICA2ICAvKiBBSUYzX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAgMSAgLyogQUlGM19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9TVFMgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9VTkRFUkNMT0NLRURfU1RTX01BU0sgICAgICAgMHgwMDIwICAvKiBBSUYyX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAgNSAgLyogQUlGMl9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9TVFNfV0lEVEggICAgICAgICAgIDEgIC8qIEFJRjJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9VTkRFUkNMT0NLRURfU1RTICAgICAgICAgICAgMHgwMDEwICAvKiBBSUYxX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVU5ERVJDTE9DS0VEX1NUU19NQVNLICAgICAgIDB4MDAxMCAgLyogQUlGMV9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX1VOREVSQ0xPQ0tFRF9TVFNfU0hJRlQgICAgICAgICAgIDQgIC8qIEFJRjFfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9VTkRFUkNMT0NLRURfU1RTX1dJRFRIICAgICAgICAgICAxICAvKiBBSUYxX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FTUkNfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgIDB4MDAwOCAgLyogQVNSQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BU1JDX1VOREVSQ0xPQ0tFRF9TVFNfTUFTSyAgICAgICAweDAwMDggIC8qIEFTUkNfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQ19VTkRFUkNMT0NLRURfU1RTX1NISUZUICAgICAgICAgICAzICAvKiBBU1JDX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FTUkNfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAgMSAgLyogQVNSQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX1NUU19NQVNLICAgICAgICAweDAwMDQgIC8qIERBQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAgIDIgIC8qIERBQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAgIDEgIC8qIERBQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgICAweDAwMDIgIC8qIEFEQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX1NUU19NQVNLICAgICAgICAweDAwMDIgIC8qIEFEQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAgIDEgIC8qIEFEQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAgIDEgIC8qIEFEQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9VTkRFUkNMT0NLRURfU1RTICAgICAgICAgICAweDAwMDEgIC8qIE1JWEVSX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9TVFNfTUFTSyAgICAgIDB4MDAwMSAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfTUlYRVJfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAwICAvKiBNSVhFUl9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9VTkRFUkNMT0NLRURfU1RTX1dJRFRIICAgICAgICAgIDEgIC8qIE1JWEVSX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKworLyoKKyAqIFIzMzM1ICgweEQwNykgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzaworICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDZfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDZfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDZfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDVfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElNX0dQNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDVfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElNX0dQNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDVfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIElNX0dQNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDVfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDRfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIElNX0dQNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDRfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIElNX0dQNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDRfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIElNX0dQNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDRfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDNfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDNfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDNfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDNfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDJfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIElNX0dQMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDJfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIElNX0dQMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDFfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElNX0dQMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDFfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElNX0dQMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDFfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElNX0dQMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDFfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQMV9FSU5UICovCisKKy8qCisgKiBSMzMzNiAoMHhEMDgpIC0gSW50ZXJydXB0IFN0YXR1cyAyIE1hc2sKKyAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTZfRUlOVCAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBJTV9EU1BfSVJRNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRNl9FSU5UX01BU0sgICAgICAgICAgICAweDAwMjAgIC8qIElNX0RTUF9JUlE2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlE2X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgNSAgLyogSU1fRFNQX0lSUTZfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBJTV9EU1BfSVJRNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRNV9FSU5UICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElNX0RTUF9JUlE1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlE1X0VJTlRfTUFTSyAgICAgICAgICAgIDB4MDAxMCAgLyogSU1fRFNQX0lSUTVfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTVfRUlOVF9TSElGVCAgICAgICAgICAgICAgICA0ICAvKiBJTV9EU1BfSVJRNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRNV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIElNX0RTUF9JUlE1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlE0X0VJTlQgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogSU1fRFNQX0lSUTRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTRfRUlOVF9NQVNLICAgICAgICAgICAgMHgwMDA4ICAvKiBJTV9EU1BfSVJRNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRNF9FSU5UX1NISUZUICAgICAgICAgICAgICAgIDMgIC8qIElNX0RTUF9JUlE0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlE0X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogSU1fRFNQX0lSUTRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTNfRUlOVCAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9EU1BfSVJRM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRM19FSU5UX01BU0sgICAgICAgICAgICAweDAwMDQgIC8qIElNX0RTUF9JUlEzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlEzX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgMiAgLyogSU1fRFNQX0lSUTNfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTNfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBJTV9EU1BfSVJRM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRMl9FSU5UICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIElNX0RTUF9JUlEyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlEyX0VJTlRfTUFTSyAgICAgICAgICAgIDB4MDAwMiAgLyogSU1fRFNQX0lSUTJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAxICAvKiBJTV9EU1BfSVJRMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRMl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIElNX0RTUF9JUlEyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlExX0VJTlQgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU1fRFNQX0lSUTFfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTFfRUlOVF9NQVNLICAgICAgICAgICAgMHgwMDAxICAvKiBJTV9EU1BfSVJRMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRMV9FSU5UX1NISUZUICAgICAgICAgICAgICAgIDAgIC8qIElNX0RTUF9JUlExX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlExX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogSU1fRFNQX0lSUTFfRUlOVCAqLworCisvKgorICogUjMzMzcgKDB4RDA5KSAtIEludGVycnVwdCBTdGF0dXMgMyBNYXNrCisgKi8KKyNkZWZpbmUgV001MTAwX0lNX1NQS19TSFVURE9XTl9XQVJOX0VJTlQgICAgICAgIDB4ODAwMCAgLyogSU1fU1BLX1NIVVRET1dOX1dBUk5fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX1dBUk5fRUlOVF9NQVNLICAgMHg4MDAwICAvKiBJTV9TUEtfU0hVVERPV05fV0FSTl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9TUEtfU0hVVERPV05fV0FSTl9FSU5UX1NISUZUICAgICAgMTUgIC8qIElNX1NQS19TSFVURE9XTl9XQVJOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX1NQS19TSFVURE9XTl9XQVJOX0VJTlRfV0lEVEggICAgICAgMSAgLyogSU1fU1BLX1NIVVRET1dOX1dBUk5fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlQgICAgICAgICAgICAgMHg0MDAwICAvKiBJTV9TUEtfU0hVVERPV05fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlRfTUFTSyAgICAgICAgMHg0MDAwICAvKiBJTV9TUEtfU0hVVERPV05fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlRfU0hJRlQgICAgICAgICAgIDE0ICAvKiBJTV9TUEtfU0hVVERPV05fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlRfV0lEVEggICAgICAgICAgICAxICAvKiBJTV9TUEtfU0hVVERPV05fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fSFBERVRfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTV9IUERFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9IUERFVF9FSU5UX01BU0sgICAgICAgICAgICAgICAweDIwMDAgIC8qIElNX0hQREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0hQREVUX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAxMyAgLyogSU1fSFBERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fSFBERVRfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9IUERFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BQ0NERVRfRUlOVCAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElNX0FDQ0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BQ0NERVRfRUlOVF9NQVNLICAgICAgICAgICAgICAweDEwMDAgIC8qIElNX0FDQ0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BQ0NERVRfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgMTIgIC8qIElNX0FDQ0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BQ0NERVRfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0FDQ0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EUkNfU0lHX0RFVF9FSU5UICAgICAgICAgICAgICAweDAyMDAgIC8qIElNX0RSQ19TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RSQ19TSUdfREVUX0VJTlRfTUFTSyAgICAgICAgIDB4MDIwMCAgLyogSU1fRFJDX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFJDX1NJR19ERVRfRUlOVF9TSElGVCAgICAgICAgICAgICA5ICAvKiBJTV9EUkNfU0lHX0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EUkNfU0lHX0RFVF9FSU5UX1dJRFRIICAgICAgICAgICAgIDEgIC8qIElNX0RSQ19TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkMyX0xPQ0tfRUlOVCAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU1fQVNSQzJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BU1JDMl9MT0NLX0VJTlRfTUFTSyAgICAgICAgICAweDAxMDAgIC8qIElNX0FTUkMyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQVNSQzJfTE9DS19FSU5UX1NISUZUICAgICAgICAgICAgICA4ICAvKiBJTV9BU1JDMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkMyX0xPQ0tfRUlOVF9XSURUSCAgICAgICAgICAgICAgMSAgLyogSU1fQVNSQzJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BU1JDMV9MT0NLX0VJTlQgICAgICAgICAgICAgICAweDAwODAgIC8qIElNX0FTUkMxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQVNSQzFfTE9DS19FSU5UX01BU0sgICAgICAgICAgMHgwMDgwICAvKiBJTV9BU1JDMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkMxX0xPQ0tfRUlOVF9TSElGVCAgICAgICAgICAgICAgNyAgLyogSU1fQVNSQzFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BU1JDMV9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgIDEgIC8qIElNX0FTUkMxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMl9MT0NLX0VJTlQgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMl9MT0NLX0VJTlRfTUFTSyAgICAgICAgICAgMHgwMDA4ICAvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMl9MT0NLX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAzICAvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMl9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgICAxICAvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlQgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9GTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlRfTUFTSyAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9GTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAyICAvKiBJTV9GTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgICAxICAvKiBJTV9GTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ0xLR0VOX0VSUl9FSU5UICAgICAgICAgICAgICAgMHgwMDAyICAvKiBJTV9DTEtHRU5fRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0NMS0dFTl9FUlJfRUlOVF9NQVNLICAgICAgICAgIDB4MDAwMiAgLyogSU1fQ0xLR0VOX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9DTEtHRU5fRVJSX0VJTlRfU0hJRlQgICAgICAgICAgICAgIDEgIC8qIElNX0NMS0dFTl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ0xLR0VOX0VSUl9FSU5UX1dJRFRIICAgICAgICAgICAgICAxICAvKiBJTV9DTEtHRU5fRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0NMS0dFTl9FUlJfQVNZTkNfRUlOVCAgICAgICAgIDB4MDAwMSAgLyogSU1fQ0xLR0VOX0VSUl9BU1lOQ19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9DTEtHRU5fRVJSX0FTWU5DX0VJTlRfTUFTSyAgICAweDAwMDEgIC8qIElNX0NMS0dFTl9FUlJfQVNZTkNfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ0xLR0VOX0VSUl9BU1lOQ19FSU5UX1NISUZUICAgICAgICAwICAvKiBJTV9DTEtHRU5fRVJSX0FTWU5DX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0NMS0dFTl9FUlJfQVNZTkNfRUlOVF9XSURUSCAgICAgICAgMSAgLyogSU1fQ0xLR0VOX0VSUl9BU1lOQ19FSU5UICovCisKKy8qCisgKiBSMzMzOCAoMHhEMEEpIC0gSW50ZXJydXB0IFN0YXR1cyA0IE1hc2sKKyAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGM19FUlJfRUlOVCAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTV9BSUYzX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYzX0VSUl9FSU5UX01BU0sgICAgICAgICAgICAweDIwMDAgIC8qIElNX0FJRjNfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjNfRVJSX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAxMyAgLyogSU1fQUlGM19FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGM19FUlJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBJTV9BSUYzX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYyX0VSUl9FSU5UICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElNX0FJRjJfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjJfRVJSX0VJTlRfTUFTSyAgICAgICAgICAgIDB4MTAwMCAgLyogSU1fQUlGMl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMl9FUlJfRUlOVF9TSElGVCAgICAgICAgICAgICAgIDEyICAvKiBJTV9BSUYyX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYyX0VSUl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIElNX0FJRjJfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjFfRVJSX0VJTlQgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogSU1fQUlGMV9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMV9FUlJfRUlOVF9NQVNLICAgICAgICAgICAgMHgwODAwICAvKiBJTV9BSUYxX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYxX0VSUl9FSU5UX1NISUZUICAgICAgICAgICAgICAgMTEgIC8qIElNX0FJRjFfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjFfRVJSX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogSU1fQUlGMV9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ1RSTElGX0VSUl9FSU5UICAgICAgICAgICAgICAgMHgwNDAwICAvKiBJTV9DVFJMSUZfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0NUUkxJRl9FUlJfRUlOVF9NQVNLICAgICAgICAgIDB4MDQwMCAgLyogSU1fQ1RSTElGX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9DVFJMSUZfRVJSX0VJTlRfU0hJRlQgICAgICAgICAgICAgMTAgIC8qIElNX0NUUkxJRl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ1RSTElGX0VSUl9FSU5UX1dJRFRIICAgICAgICAgICAgICAxICAvKiBJTV9DVFJMSUZfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgIDB4MDIwMCAgLyogSU1fSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgIDB4MDIwMCAgLyogSU1fSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgOSAgLyogSU1fSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgMSAgLyogSU1fSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgIDB4MDEwMCAgLyogSU1fSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgIDB4MDEwMCAgLyogSU1fSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgOCAgLyogSU1fSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgMSAgLyogSU1fSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0ZYX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgIDB4MDA4MCAgLyogSU1fRlhfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0ZYX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgIDB4MDA4MCAgLyogSU1fRlhfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0ZYX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgICAgNyAgLyogSU1fRlhfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0ZYX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAgMSAgLyogSU1fRlhfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgIDB4MDA0MCAgLyogSU1fQUlGM19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGM19VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgMHgwMDQwICAvKiBJTV9BSUYzX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYzX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgIDYgIC8qIElNX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgMSAgLyogSU1fQUlGM19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMl9VTkRFUkNMT0NLRURfRUlOVCAgICAgICAgMHgwMDIwICAvKiBJTV9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAweDAwMjAgIC8qIElNX0FJRjJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjJfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgNSAgLyogSU1fQUlGMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMl9VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgICAxICAvKiBJTV9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAweDAwMTAgIC8qIElNX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgIDB4MDAxMCAgLyogSU1fQUlGMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMV9VTkRFUkNMT0NLRURfRUlOVF9TSElGVCAgICAgICA0ICAvKiBJTV9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgIDEgIC8qIElNX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgIDB4MDAwOCAgLyogSU1fQVNSQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQVNSQ19VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgMHgwMDA4ICAvKiBJTV9BU1JDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BU1JDX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgIDMgIC8qIElNX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgMSAgLyogSU1fQVNSQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fREFDX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgMHgwMDA0ICAvKiBJTV9EQUNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RBQ19VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgIDB4MDAwNCAgLyogSU1fREFDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EQUNfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgIDIgIC8qIElNX0RBQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fREFDX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAxICAvKiBJTV9EQUNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FEQ19VTkRFUkNMT0NLRURfRUlOVCAgICAgICAgIDB4MDAwMiAgLyogSU1fQURDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BRENfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAweDAwMDIgIC8qIElNX0FEQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQURDX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgICAxICAvKiBJTV9BRENfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FEQ19VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgICAgMSAgLyogSU1fQURDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVCAgICAgICAweDAwMDEgIC8qIElNX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAweDAwMDEgIC8qIElNX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVF9TSElGVCAgICAgIDAgIC8qIElNX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgIDEgIC8qIElNX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICovCisKKy8qCisgKiBSMzM1OSAoMHhEMUYpIC0gSW50ZXJydXB0IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTUxMDBfSU1fSVJRICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBJTV9JUlEgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lSUV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU1fSVJRICovCisjZGVmaW5lIFdNNTEwMF9JTV9JUlFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElNX0lSUSAqLworI2RlZmluZSBXTTUxMDBfSU1fSVJRX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9JUlEgKi8KKworLyoKKyAqIFIzMzYwICgweEQyMCkgLSBJUlEgRGVib3VuY2UgMQorICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9EQiAgICAgICAgICAgICAweDAyMDAgIC8qIFNQS19TSFVURE9XTl9XQVJOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9EQl9NQVNLICAgICAgICAweDAyMDAgIC8qIFNQS19TSFVURE9XTl9XQVJOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9EQl9TSElGVCAgICAgICAgICAgIDkgIC8qIFNQS19TSFVURE9XTl9XQVJOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9EQl9XSURUSCAgICAgICAgICAgIDEgIC8qIFNQS19TSFVURE9XTl9XQVJOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fREIgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFNQS19TSFVURE9XTl9EQiAqLworI2RlZmluZSBXTTUxMDBfU1BLX1NIVVRET1dOX0RCX01BU0sgICAgICAgICAgICAgMHgwMTAwICAvKiBTUEtfU0hVVERPV05fREIgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9EQl9TSElGVCAgICAgICAgICAgICAgICAgOCAgLyogU1BLX1NIVVRET1dOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fREJfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIFNQS19TSFVURE9XTl9EQiAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9MT0NLX0lSUV9EQiAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBGTEwxX0xPQ0tfSVJRX0RCICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xPQ0tfSVJRX0RCX01BU0sgICAgICAgICAgICAweDAwMDggIC8qIEZMTDFfTE9DS19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19JUlFfREJfU0hJRlQgICAgICAgICAgICAgICAgMyAgLyogRkxMMV9MT0NLX0lSUV9EQiAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9MT0NLX0lSUV9EQl9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBGTEwxX0xPQ0tfSVJRX0RCICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0xPQ0tfSVJRX0RCICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEZMTDJfTE9DS19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19JUlFfREJfTUFTSyAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMMl9MT0NLX0lSUV9EQiAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9MT0NLX0lSUV9EQl9TSElGVCAgICAgICAgICAgICAgICAyICAvKiBGTEwyX0xPQ0tfSVJRX0RCICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0xPQ0tfSVJRX0RCX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEZMTDJfTE9DS19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfSVJRX0RCICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfSVJRX0RCX01BU0sgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfSVJRX0RCX1NISUZUICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfSVJRX0RCX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfSVJRX0RCICAgICAgICAgIDB4MDAwMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfSVJRX0RCX01BU0sgICAgIDB4MDAwMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfSVJRX0RCX1NISUZUICAgICAgICAgMCAgLyogQ0xLR0VOX0VSUl9BU1lOQ19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfSVJRX0RCX1dJRFRIICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19JUlFfREIgKi8KKworLyoKKyAqIFIzMzYxICgweEQyMSkgLSBJUlEgRGVib3VuY2UgMgorICovCisjZGVmaW5lIFdNNTEwMF9BSUZfRVJSX0RCICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRl9FUlJfREIgKi8KKyNkZWZpbmUgV001MTAwX0FJRl9FUlJfREJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGX0VSUl9EQiAqLworI2RlZmluZSBXTTUxMDBfQUlGX0VSUl9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUZfRVJSX0RCICovCisjZGVmaW5lIFdNNTEwMF9BSUZfRVJSX0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRl9FUlJfREIgKi8KKworLyoKKyAqIFIzNTg0ICgweEUwMCkgLSBGWF9DdHJsCisgKi8KKyNkZWZpbmUgV001MTAwX0ZYX1NUU19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMCAgLyogRlhfU1RTIC0gWzE1OjZdICovCisjZGVmaW5lIFdNNTEwMF9GWF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEZYX1NUUyAtIFsxNTo2XSAqLworI2RlZmluZSBXTTUxMDBfRlhfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBGWF9TVFMgLSBbMTU6Nl0gKi8KKyNkZWZpbmUgV001MTAwX0ZYX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogRlhfUkFURSAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9GWF9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZYX1JBVEUgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfRlhfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBGWF9SQVRFIC0gWzE6MF0gKi8KKworLyoKKyAqIFIzNjAwICgweEUxMCkgLSBFUTFfMQorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjFfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRMV9CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTFfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVExX0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRMV9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRMV9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRMV9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDAwM0UgIC8qIEVRMV9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRVExX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTFfQjNfR0FJTiAtIFs1OjFdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEVRMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRVExX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRVExX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9FUTFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRMV9FTkEgKi8KKworLyoKKyAqIFIzNjAxICgweEUxMSkgLSBFUTFfMgorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRMV9CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTFfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVExX0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRMV9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRMV9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRMV9CNV9HQUlOIC0gWzEwOjZdICovCisKKy8qCisgKiBSMzYwMiAoMHhFMTIpIC0gRVExXzMKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MDMgKDB4RTEzKSAtIEVRMV80CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IxX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjA0ICgweEUxNCkgLSBFUTFfNQorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjFfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjFfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IxX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYwNSAoMHhFMTUpIC0gRVExXzYKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0IyX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IyX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IyX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjJfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MDYgKDB4RTE2KSAtIEVRMV83CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMl9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMl9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMl9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IyX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjA3ICgweEUxNykgLSBFUTFfOAorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CMl9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYwOCAoMHhFMTgpIC0gRVExXzkKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0IyX1BHX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMl9QR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0IyX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfUEdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CMl9QRyAtIFsxNTowXSAqLworCisvKgorICogUjM2MDkgKDB4RTE5KSAtIEVRMV8xMAorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfQV9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CM19BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYxMCAoMHhFMUEpIC0gRVExXzExCisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IzX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjExICgweEUxQikgLSBFUTFfMTIKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX0NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjNfQyAtIFsxNTowXSAqLworCisvKgorICogUjM2MTIgKDB4RTFDKSAtIEVRMV8xMworICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IzX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYxMyAoMHhFMUQpIC0gRVExXzE0CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0I0X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjE0ICgweEUxRSkgLSBFUTFfMTUKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X0JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X0JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X0JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjM2MTUgKDB4RTFGKSAtIEVRMV8xNgorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CNF9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYxNiAoMHhFMjApIC0gRVExXzE3CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjE3ICgweEUyMSkgLSBFUTFfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0I1X0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I1X0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I1X0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjVfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MTggKDB4RTIyKSAtIEVRMV8xOQorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfQl9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CNV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYxOSAoMHhFMjMpIC0gRVExXzIwCisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNV9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0I1X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I1X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjVfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjIyICgweEUyNikgLSBFUTJfMQorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjFfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRMl9CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTJfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVEyX0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRMl9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRMl9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRMl9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDAwM0UgIC8qIEVRMl9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRVEyX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTJfQjNfR0FJTiAtIFs1OjFdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEVRMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRVEyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9FUTJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRMl9FTkEgKi8KKworLyoKKyAqIFIzNjIzICgweEUyNykgLSBFUTJfMgorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRMl9CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTJfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVEyX0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRMl9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRMl9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRMl9CNV9HQUlOIC0gWzEwOjZdICovCisKKy8qCisgKiBSMzYyNCAoMHhFMjgpIC0gRVEyXzMKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MjUgKDB4RTI5KSAtIEVRMl80CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IxX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjI2ICgweEUyQSkgLSBFUTJfNQorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjFfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjFfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IxX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYyNyAoMHhFMkIpIC0gRVEyXzYKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IyX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IyX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IyX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjJfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MjggKDB4RTJDKSAtIEVRMl83CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMl9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMl9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMl9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IyX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjI5ICgweEUyRCkgLSBFUTJfOAorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CMl9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzMCAoMHhFMkUpIC0gRVEyXzkKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IyX1BHX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMl9QR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0IyX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfUEdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CMl9QRyAtIFsxNTowXSAqLworCisvKgorICogUjM2MzEgKDB4RTJGKSAtIEVRMl8xMAorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfQV9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CM19BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzMiAoMHhFMzApIC0gRVEyXzExCisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IzX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjMzICgweEUzMSkgLSBFUTJfMTIKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX0NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjNfQyAtIFsxNTowXSAqLworCisvKgorICogUjM2MzQgKDB4RTMyKSAtIEVRMl8xMworICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IzX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzNSAoMHhFMzMpIC0gRVEyXzE0CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0I0X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjM2ICgweEUzNCkgLSBFUTJfMTUKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X0JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X0JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X0JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjM2MzcgKDB4RTM1KSAtIEVRMl8xNgorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CNF9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzOCAoMHhFMzYpIC0gRVEyXzE3CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjM5ICgweEUzNykgLSBFUTJfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I1X0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I1X0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I1X0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjVfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NDAgKDB4RTM4KSAtIEVRMl8xOQorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfQl9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CNV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY0MSAoMHhFMzkpIC0gRVEyXzIwCisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNV9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0I1X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I1X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjVfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjQ0ICgweEUzQykgLSBFUTNfMQorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjFfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRM19CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTNfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVEzX0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRM19CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRM19CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRM19CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDAwM0UgIC8qIEVRM19CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRVEzX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTNfQjNfR0FJTiAtIFs1OjFdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEVRM19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0VRM19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRVEzX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9FUTNfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRM19FTkEgKi8KKworLyoKKyAqIFIzNjQ1ICgweEUzRCkgLSBFUTNfMgorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRM19CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTNfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVEzX0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRM19CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRM19CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRM19CNV9HQUlOIC0gWzEwOjZdICovCisKKy8qCisgKiBSMzY0NiAoMHhFM0UpIC0gRVEzXzMKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NDcgKDB4RTNGKSAtIEVRM180CisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IxX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjQ4ICgweEU0MCkgLSBFUTNfNQorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjFfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjFfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IxX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY0OSAoMHhFNDEpIC0gRVEzXzYKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IyX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IyX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IyX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjJfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NTAgKDB4RTQyKSAtIEVRM183CisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMl9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMl9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMl9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IyX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjUxICgweEU0MykgLSBFUTNfOAorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CMl9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY1MiAoMHhFNDQpIC0gRVEzXzkKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IyX1BHX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMl9QR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0IyX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfUEdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CMl9QRyAtIFsxNTowXSAqLworCisvKgorICogUjM2NTMgKDB4RTQ1KSAtIEVRM18xMAorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfQV9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CM19BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY1NCAoMHhFNDYpIC0gRVEzXzExCisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IzX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjU1ICgweEU0NykgLSBFUTNfMTIKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX0NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjNfQyAtIFsxNTowXSAqLworCisvKgorICogUjM2NTYgKDB4RTQ4KSAtIEVRM18xMworICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IzX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY1NyAoMHhFNDkpIC0gRVEzXzE0CisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0I0X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjU4ICgweEU0QSkgLSBFUTNfMTUKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X0JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X0JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X0JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjM2NTkgKDB4RTRCKSAtIEVRM18xNgorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CNF9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY2MCAoMHhFNEMpIC0gRVEzXzE3CisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjYxICgweEU0RCkgLSBFUTNfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I1X0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I1X0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I1X0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjVfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NjIgKDB4RTRFKSAtIEVRM18xOQorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfQl9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CNV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY2MyAoMHhFNEYpIC0gRVEzXzIwCisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNV9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0I1X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I1X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjVfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjY2ICgweEU1MikgLSBFUTRfMQorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjFfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRNF9CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTRfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVE0X0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRNF9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRNF9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRNF9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDAwM0UgIC8qIEVRNF9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRVE0X0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTRfQjNfR0FJTiAtIFs1OjFdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEVRNF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRVE0X0VOQSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9FUTRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRNF9FTkEgKi8KKworLyoKKyAqIFIzNjY3ICgweEU1MykgLSBFUTRfMgorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRNF9CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTRfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVE0X0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRNF9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRNF9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRNF9CNV9HQUlOIC0gWzEwOjZdICovCisKKy8qCisgKiBSMzY2OCAoMHhFNTQpIC0gRVE0XzMKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NjkgKDB4RTU1KSAtIEVRNF80CisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IxX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjcwICgweEU1NikgLSBFUTRfNQorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjFfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjFfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IxX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY3MSAoMHhFNTcpIC0gRVE0XzYKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IyX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IyX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IyX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjJfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NzIgKDB4RTU4KSAtIEVRNF83CisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMl9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMl9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMl9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IyX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjczICgweEU1OSkgLSBFUTRfOAorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CMl9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY3NCAoMHhFNUEpIC0gRVE0XzkKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IyX1BHX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMl9QR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0IyX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfUEdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CMl9QRyAtIFsxNTowXSAqLworCisvKgorICogUjM2NzUgKDB4RTVCKSAtIEVRNF8xMAorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfQV9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CM19BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY3NiAoMHhFNUMpIC0gRVE0XzExCisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IzX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjc3ICgweEU1RCkgLSBFUTRfMTIKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX0NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjNfQyAtIFsxNTowXSAqLworCisvKgorICogUjM2NzggKDB4RTVFKSAtIEVRNF8xMworICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IzX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY3OSAoMHhFNUYpIC0gRVE0XzE0CisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0I0X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjgwICgweEU2MCkgLSBFUTRfMTUKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X0JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X0JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X0JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjM2ODEgKDB4RTYxKSAtIEVRNF8xNgorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CNF9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY4MiAoMHhFNjIpIC0gRVE0XzE3CisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjgzICgweEU2MykgLSBFUTRfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I1X0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I1X0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I1X0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjVfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2ODQgKDB4RTY0KSAtIEVRNF8xOQorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfQl9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CNV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY4NSAoMHhFNjUpIC0gRVE0XzIwCisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNV9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0I1X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I1X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjVfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNzEyICgweEU4MCkgLSBEUkMxIGN0cmwxCisgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX1JNU19NQVNLICAgICAgICAgICAgIDB4RjgwMCAgLyogRFJDX1NJR19ERVRfUk1TIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfUk1TX1NISUZUICAgICAgICAgICAgICAgIDExICAvKiBEUkNfU0lHX0RFVF9STVMgLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9STVNfV0lEVEggICAgICAgICAgICAgICAgIDUgIC8qIERSQ19TSUdfREVUX1JNUyAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX1BLX01BU0sgICAgICAgICAgICAgIDB4MDYwMCAgLyogRFJDX1NJR19ERVRfUEsgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX1BLX1NISUZUICAgICAgICAgICAgICAgICAgOSAgLyogRFJDX1NJR19ERVRfUEsgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX1BLX1dJRFRIICAgICAgICAgICAgICAgICAgMiAgLyogRFJDX1NJR19ERVRfUEsgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19OR19FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRFJDX05HX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEUkNfTkdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTkdfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERSQ19OR19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19OR19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogRFJDX05HX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfTU9ERSAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEUkNfU0lHX0RFVF9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9NT0RFX01BU0sgICAgICAgICAgICAweDAwODAgIC8qIERSQ19TSUdfREVUX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX01PREVfU0hJRlQgICAgICAgICAgICAgICAgNyAgLyogRFJDX1NJR19ERVRfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBEUkNfU0lHX0RFVF9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVCAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIERSQ19TSUdfREVUICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIERSQ19TSUdfREVUICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIERSQ19TSUdfREVUICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERSQ19TSUdfREVUICovCisjZGVmaW5lIFdNNTEwMF9EUkNfS05FRTJfT1BfRU5BICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIERSQ19LTkVFMl9PUF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19LTkVFMl9PUF9FTkFfTUFTSyAgICAgICAgICAgIDB4MDAyMCAgLyogRFJDX0tORUUyX09QX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX09QX0VOQV9TSElGVCAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRTJfT1BfRU5BICovCisjZGVmaW5lIFdNNTEwMF9EUkNfS05FRTJfT1BfRU5BX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIERSQ19LTkVFMl9PUF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19RUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogRFJDX1FSICovCisjZGVmaW5lIFdNNTEwMF9EUkNfUVJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERSQ19RUiAqLworI2RlZmluZSBXTTUxMDBfRFJDX1FSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBEUkNfUVIgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19RUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRFJDX1FSICovCisjZGVmaW5lIFdNNTEwMF9EUkNfQU5USUNMSVAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERSQ19BTlRJQ0xJUCAqLworI2RlZmluZSBXTTUxMDBfRFJDX0FOVElDTElQX01BU0sgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEUkNfQU5USUNMSVAgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19BTlRJQ0xJUF9TSElGVCAgICAgICAgICAgICAgICAgICAgMyAgLyogRFJDX0FOVElDTElQICovCisjZGVmaW5lIFdNNTEwMF9EUkNfQU5USUNMSVBfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERSQ19BTlRJQ0xJUCAqLworI2RlZmluZSBXTTUxMDBfRFJDTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEUkNMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEUkNMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEUkNMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEUkNMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEUkNSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEUkNSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEUkNSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEUkNSX0VOQSAqLworCisvKgorICogUjM3MTMgKDB4RTgxKSAtIERSQzEgY3RybDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFJDX0FUS19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxRTAwICAvKiBEUkNfQVRLIC0gWzEyOjldICovCisjZGVmaW5lIFdNNTEwMF9EUkNfQVRLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIERSQ19BVEsgLSBbMTI6OV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19BVEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogRFJDX0FUSyAtIFsxMjo5XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0RDWV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMUUwICAvKiBEUkNfRENZIC0gWzg6NV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19EQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogRFJDX0RDWSAtIFs4OjVdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfRENZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIERSQ19EQ1kgLSBbODo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX01JTkdBSU5fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDFDICAvKiBEUkNfTUlOR0FJTiAtIFs0OjJdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTUlOR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERSQ19NSU5HQUlOIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19NSU5HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRFJDX01JTkdBSU4gLSBbNDoyXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX01BWEdBSU5fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBEUkNfTUFYR0FJTiAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTUFYR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERSQ19NQVhHQUlOIC0gWzE6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19NQVhHQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogRFJDX01BWEdBSU4gLSBbMTowXSAqLworCisvKgorICogUjM3MTQgKDB4RTgyKSAtIERSQzEgY3RybDMKKyAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX01JTkdBSU5fTUFTSyAgICAgICAgICAgICAgMHhGMDAwICAvKiBEUkNfTkdfTUlOR0FJTiAtIFsxNToxMl0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19OR19NSU5HQUlOX1NISUZUICAgICAgICAgICAgICAgICAxMiAgLyogRFJDX05HX01JTkdBSU4gLSBbMTU6MTJdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTkdfTUlOR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgIDQgIC8qIERSQ19OR19NSU5HQUlOIC0gWzE1OjEyXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX0VYUF9NQVNLICAgICAgICAgICAgICAgICAgMHgwQzAwICAvKiBEUkNfTkdfRVhQIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX0VYUF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBEUkNfTkdfRVhQIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX0VYUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAyICAvKiBEUkNfTkdfRVhQIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1FSX1RIUl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMzAwICAvKiBEUkNfUVJfVEhSIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19RUl9USFJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogRFJDX1FSX1RIUiAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfUVJfVEhSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERSQ19RUl9USFIgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1FSX0RDWV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMEMwICAvKiBEUkNfUVJfRENZIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19RUl9EQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNiAgLyogRFJDX1FSX0RDWSAtIFs3OjZdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfUVJfRENZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERSQ19RUl9EQ1kgLSBbNzo2XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0hJX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDM4ICAvKiBEUkNfSElfQ09NUCAtIFs1OjNdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfSElfQ09NUF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIERSQ19ISV9DT01QIC0gWzU6M10gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19ISV9DT01QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRFJDX0hJX0NPTVAgLSBbNTozXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0xPX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBEUkNfTE9fQ09NUCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTE9fQ09NUF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERSQ19MT19DT01QIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19MT19DT01QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRFJDX0xPX0NPTVAgLSBbMjowXSAqLworCisvKgorICogUjM3MTUgKDB4RTgzKSAtIERSQzEgY3RybDQKKyAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUVfSVBfTUFTSyAgICAgICAgICAgICAgICAgMHgwN0UwICAvKiBEUkNfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUVfSVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUVfSVBfV0lEVEggICAgICAgICAgICAgICAgICAgICA2ICAvKiBEUkNfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUVfT1BfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBEUkNfS05FRV9PUCAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfS05FRV9PUF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERSQ19LTkVFX09QIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19LTkVFX09QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRFJDX0tORUVfT1AgLSBbNDowXSAqLworCisvKgorICogUjM3MTYgKDB4RTg0KSAtIERSQzEgY3RybDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX0lQX01BU0sgICAgICAgICAgICAgICAgMHgwM0UwICAvKiBEUkNfS05FRTJfSVAgLSBbOTo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX0lQX1NISUZUICAgICAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRTJfSVAgLSBbOTo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX0lQX1dJRFRIICAgICAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRTJfSVAgLSBbOTo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX09QX01BU0sgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBEUkNfS05FRTJfT1AgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX09QX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBEUkNfS05FRTJfT1AgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX09QX1dJRFRIICAgICAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRTJfT1AgLSBbNDowXSAqLworCisvKgorICogUjM3NzYgKDB4RUMwKSAtIEhQTFBGMV8xCisgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYxX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTEhQRjFfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjFfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMSFBGMV9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExIUEYxX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYxX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEhQRjFfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMSFBGMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTEhQRjFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExIUEYxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSFBGMV9FTkEgKi8KKworLyoKKyAqIFIzNzc3ICgweEVDMSkgLSBIUExQRjFfMgorICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9DT0VGRl9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIExIUEYxX0NPRUZGIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9DT0VGRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExIUEYxX0NPRUZGIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9DT0VGRl9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIExIUEYxX0NPRUZGIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzc4MCAoMHhFQzQpIC0gSFBMUEYyXzEKKyAqLworI2RlZmluZSBXTTUxMDBfTEhQRjJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMSFBGMl9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMl9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExIUEYyX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEhQRjJfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjJfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSFBGMl9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExIUEYyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMSFBGMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTEhQRjJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExIUEYyX0VOQSAqLworCisvKgorICogUjM3ODEgKDB4RUM1KSAtIEhQTFBGMl8yCisgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX0NPRUZGX01BU0sgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogTEhQRjJfQ09FRkYgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX0NPRUZGX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogTEhQRjJfQ09FRkYgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX0NPRUZGX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogTEhQRjJfQ09FRkYgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNzg0ICgweEVDOCkgLSBIUExQRjNfMQorICovCisjZGVmaW5lIFdNNTEwMF9MSFBGM19NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExIUEYzX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYzX01PREVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTEhQRjNfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSFBGM19NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGM19NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExIUEYzX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYzX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTEhQRjNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9MSFBGM19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExIUEYzX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMSFBGM19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEhQRjNfRU5BICovCisKKy8qCisgKiBSMzc4NSAoMHhFQzkpIC0gSFBMUEYzXzIKKyAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfQ09FRkZfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBMSFBGM19DT0VGRiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfQ09FRkZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBMSFBGM19DT0VGRiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfQ09FRkZfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBMSFBGM19DT0VGRiAtIFsxNTowXSAqLworCisvKgorICogUjM3ODggKDB4RUNDKSAtIEhQTFBGNF8xCisgKi8KKyNkZWZpbmUgV001MTAwX0xIUEY0X01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTEhQRjRfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjRfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMSFBGNF9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExIUEY0X01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEY0X01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEhQRjRfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMSFBGNF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0xIUEY0X0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTEhQRjRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExIUEY0X0VOQSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSFBGNF9FTkEgKi8KKworLyoKKyAqIFIzNzg5ICgweEVDRCkgLSBIUExQRjRfMgorICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9DT0VGRl9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIExIUEY0X0NPRUZGIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9DT0VGRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExIUEY0X0NPRUZGIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9DT0VGRl9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIExIUEY0X0NPRUZGIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTYzODQgKDB4NDAwMCkgLSBEU1AxIERNIDAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9TVEFSVF8xX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AxX0RNX1NUQVJUIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9ETV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNX1NUQVJUXzFfV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIERTUDFfRE1fU1RBUlQgLSBbNzowXSAqLworCisvKgorICogUjE2Mzg1ICgweDQwMDEpIC0gRFNQMSBETSAxCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fU1RBUlRfTUFTSyAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQMV9ETV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9TVEFSVF9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX0RNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNX1NUQVJUX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfRE1fU1RBUlQgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNjM4NiAoMHg0MDAyKSAtIERTUDEgRE0gMgorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDFfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzFfMV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzFfMV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfRE1fMSAtIFs3OjBdICovCisKKy8qCisgKiBSMTYzODcgKDB4NDAwMykgLSBEU1AxIERNIDMKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX0RNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9ETV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfRE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjE2ODkyICgweDQxRkMpIC0gRFNQMSBETSA1MDgKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8yNTRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AxX0RNXzI1NCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzI1NF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfRE1fMjU0IC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fMjU0XzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMV9ETV8yNTQgLSBbNzowXSAqLworCisvKgorICogUjE2ODkzICgweDQxRkQpIC0gRFNQMSBETSA1MDkKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8yNTRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8yNTRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8yNTRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX0RNXzI1NCAtIFsxNTowXSAqLworCisvKgorICogUjE2ODk0ICgweDQxRkUpIC0gRFNQMSBETSA1MTAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9FTkRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AxX0RNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfRE1fRU5EIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fRU5EXzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMV9ETV9FTkQgLSBbNzowXSAqLworCisvKgorICogUjE2ODk1ICgweDQxRkYpIC0gRFNQMSBETSA1MTEKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX0RNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjE4NDMyICgweDQ4MDApIC0gRFNQMSBQTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fU1RBUlRfMl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9QTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX1NUQVJUXzJfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfUE1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9TVEFSVF8yX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AxX1BNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxODQzMyAoMHg0ODAxKSAtIERTUDEgUE0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX1NUQVJUXzFfTUFTSyAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9QTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1BNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTg0MzQgKDB4NDgwMikgLSBEU1AxIFBNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9TVEFSVF9NQVNLICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1BNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX1NUQVJUX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fU1RBUlRfV0lEVEggICAgICAgICAgICAgICAgICAxNiAgLyogRFNQMV9QTV9TVEFSVCAtIFsxNTowXSAqLworCisvKgorICogUjE4NDM1ICgweDQ4MDMpIC0gRFNQMSBQTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV8yX01BU0sgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV8yX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV8yX1dJRFRIICAgICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMV9QTV8xIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxODQzNiAoMHg0ODA0KSAtIERTUDEgUE0gNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfUE1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogRFNQMV9QTV8xIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTg0MzcgKDB4NDgwNSkgLSBEU1AxIFBNIDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9QTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfUE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjE5OTYyICgweDRERkEpIC0gRFNQMSBQTSAxNTMwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fNTEwXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9QTV81MTAgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV81MTBfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNXzUxMCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUxMF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfUE1fNTEwIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxOTk2MyAoMHg0REZCKSAtIERTUDEgUE0gMTUzMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUxMF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUxMF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUxMF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfUE1fNTEwIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTk5NjQgKDB4NERGQykgLSBEU1AxIFBNIDE1MzIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV81MTBfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV81MTBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV81MTBfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1BNXzUxMCAtIFsxNTowXSAqLworCisvKgorICogUjE5OTY1ICgweDRERkQpIC0gRFNQMSBQTSAxNTMzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fRU5EXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9QTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9FTkRfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX0VORF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfUE1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxOTk2NiAoMHg0REZFKSAtIERTUDEgUE0gMTUzNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX0VORF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfUE1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTk5NjcgKDB4NERGRikgLSBEU1AxIFBNIDE1MzUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1BNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjIwNDgwICgweDUwMDApIC0gRFNQMSBaTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fU1RBUlRfMV9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9aTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX1NUQVJUXzFfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfWk1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AxX1pNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyMDQ4MSAoMHg1MDAxKSAtIERTUDEgWk0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX1NUQVJUX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfWk1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fU1RBUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9aTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV9TVEFSVF9XSURUSCAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1pNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjA0ODIgKDB4NTAwMikgLSBEU1AxIFpNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xXzFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AxX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICA4ICAvKiBEU1AxX1pNXzEgLSBbNzowXSAqLworCisvKgorICogUjIwNDgzICgweDUwMDMpIC0gRFNQMSBaTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMV9NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQMV9aTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfWk1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1pNXzEgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIyMjUyNCAoMHg1N0ZDKSAtIERTUDEgWk0gMjA0NAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzEwMjJfMV9NQVNLICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDFfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzEwMjJfMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzEwMjJfMV9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfWk1fMTAyMiAtIFs3OjBdICovCisKKy8qCisgKiBSMjI1MjUgKDB4NTdGRCkgLSBEU1AxIFpNIDIwNDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xMDIyX01BU0sgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1pNXzEwMjIgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMTAyMl9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9aTV8xMDIyIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzEwMjJfV0lEVEggICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfWk1fMTAyMiAtIFsxNTowXSAqLworCisvKgorICogUjIyNTI2ICgweDU3RkUpIC0gRFNQMSBaTSAyMDQ2CisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fRU5EXzFfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9aTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV9FTkRfMV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1pNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfWk1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyMjUyNyAoMHg1N0ZGKSAtIERTUDEgWk0gMjA0NworICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX0VORF9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX0VORF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX0VORF9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfWk1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjQ1NzYgKDB4NjAwMCkgLSBEU1AyIERNIDAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9TVEFSVF8xX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX0RNX1NUQVJUIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9ETV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNX1NUQVJUXzFfV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIERTUDJfRE1fU1RBUlQgLSBbNzowXSAqLworCisvKgorICogUjI0NTc3ICgweDYwMDEpIC0gRFNQMiBETSAxCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fU1RBUlRfTUFTSyAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQMl9ETV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9TVEFSVF9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX0RNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNX1NUQVJUX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfRE1fU1RBUlQgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIyNDU3OCAoMHg2MDAyKSAtIERTUDIgRE0gMgorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDJfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzFfMV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzFfMV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfRE1fMSAtIFs3OjBdICovCisKKy8qCisgKiBSMjQ1NzkgKDB4NjAwMykgLSBEU1AyIERNIDMKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX0RNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9ETV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfRE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjI1MDg0ICgweDYxRkMpIC0gRFNQMiBETSA1MDgKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yNTRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX0RNXzI1NCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzI1NF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfRE1fMjU0IC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fMjU0XzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMl9ETV8yNTQgLSBbNzowXSAqLworCisvKgorICogUjI1MDg1ICgweDYxRkQpIC0gRFNQMiBETSA1MDkKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yNTRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yNTRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yNTRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX0RNXzI1NCAtIFsxNTowXSAqLworCisvKgorICogUjI1MDg2ICgweDYxRkUpIC0gRFNQMiBETSA1MTAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9FTkRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX0RNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfRE1fRU5EIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fRU5EXzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMl9ETV9FTkQgLSBbNzowXSAqLworCisvKgorICogUjI1MDg3ICgweDYxRkYpIC0gRFNQMiBETSA1MTEKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX0RNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjI2NjI0ICgweDY4MDApIC0gRFNQMiBQTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fU1RBUlRfMl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9QTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX1NUQVJUXzJfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUE1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9TVEFSVF8yX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AyX1BNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyNjYyNSAoMHg2ODAxKSAtIERTUDIgUE0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX1NUQVJUXzFfTUFTSyAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9QTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1BNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjY2MjYgKDB4NjgwMikgLSBEU1AyIFBNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9TVEFSVF9NQVNLICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1BNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX1NUQVJUX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fU1RBUlRfV0lEVEggICAgICAgICAgICAgICAgICAxNiAgLyogRFNQMl9QTV9TVEFSVCAtIFsxNTowXSAqLworCisvKgorICogUjI2NjI3ICgweDY4MDMpIC0gRFNQMiBQTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV8yX01BU0sgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV8yX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV8yX1dJRFRIICAgICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMl9QTV8xIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyNjYyOCAoMHg2ODA0KSAtIERTUDIgUE0gNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfUE1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogRFNQMl9QTV8xIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjY2MjkgKDB4NjgwNSkgLSBEU1AyIFBNIDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9QTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfUE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjI4MTU0ICgweDZERkEpIC0gRFNQMiBQTSAxNTMwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fNTEwXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9QTV81MTAgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV81MTBfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNXzUxMCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzUxMF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfUE1fNTEwIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyODE1NSAoMHg2REZCKSAtIERTUDIgUE0gMTUzMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzUxMF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzUxMF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzUxMF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfUE1fNTEwIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjgxNTYgKDB4NkRGQykgLSBEU1AyIFBNIDE1MzIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV81MTBfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV81MTBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV81MTBfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1BNXzUxMCAtIFsxNTowXSAqLworCisvKgorICogUjI4MTU3ICgweDZERkQpIC0gRFNQMiBQTSAxNTMzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fRU5EXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9QTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9FTkRfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX0VORF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfUE1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyODE1OCAoMHg2REZFKSAtIERTUDIgUE0gMTUzNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX0VORF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfUE1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjgxNTkgKDB4NkRGRikgLSBEU1AyIFBNIDE1MzUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1BNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjI4NjcyICgweDcwMDApIC0gRFNQMiBaTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fU1RBUlRfMV9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9aTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX1NUQVJUXzFfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfWk1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AyX1pNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyODY3MyAoMHg3MDAxKSAtIERTUDIgWk0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX1NUQVJUX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfWk1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fU1RBUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9aTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV9TVEFSVF9XSURUSCAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1pNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjg2NzQgKDB4NzAwMikgLSBEU1AyIFpNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xXzFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICA4ICAvKiBEU1AyX1pNXzEgLSBbNzowXSAqLworCisvKgorICogUjI4Njc1ICgweDcwMDMpIC0gRFNQMiBaTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fMV9NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQMl9aTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfWk1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1pNXzEgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzMDcxNiAoMHg3N0ZDKSAtIERTUDIgWk0gMjA0NAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEwMjJfMV9NQVNLICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDJfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEwMjJfMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEwMjJfMV9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfWk1fMTAyMiAtIFs3OjBdICovCisKKy8qCisgKiBSMzA3MTcgKDB4NzdGRCkgLSBEU1AyIFpNIDIwNDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xMDIyX01BU0sgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1pNXzEwMjIgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fMTAyMl9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9aTV8xMDIyIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEwMjJfV0lEVEggICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfWk1fMTAyMiAtIFsxNTowXSAqLworCisvKgorICogUjMwNzE4ICgweDc3RkUpIC0gRFNQMiBaTSAyMDQ2CisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fRU5EXzFfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9aTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV9FTkRfMV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1pNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfWk1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzMDcxOSAoMHg3N0ZGKSAtIERTUDIgWk0gMjA0NworICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX0VORF9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX0VORF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX0VORF9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfWk1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzI3NjggKDB4ODAwMCkgLSBEU1AzIERNIDAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9TVEFSVF8xX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AzX0RNX1NUQVJUIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19ETV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNX1NUQVJUXzFfV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIERTUDNfRE1fU1RBUlQgLSBbNzowXSAqLworCisvKgorICogUjMyNzY5ICgweDgwMDEpIC0gRFNQMyBETSAxCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fU1RBUlRfTUFTSyAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQM19ETV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9TVEFSVF9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX0RNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNX1NUQVJUX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfRE1fU1RBUlQgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzMjc3MCAoMHg4MDAyKSAtIERTUDMgRE0gMgorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDNfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzFfMV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzFfMV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfRE1fMSAtIFs3OjBdICovCisKKy8qCisgKiBSMzI3NzEgKDB4ODAwMykgLSBEU1AzIERNIDMKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX0RNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19ETV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfRE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjMzMjc2ICgweDgxRkMpIC0gRFNQMyBETSA1MDgKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8yNTRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AzX0RNXzI1NCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzI1NF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfRE1fMjU0IC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fMjU0XzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQM19ETV8yNTQgLSBbNzowXSAqLworCisvKgorICogUjMzMjc3ICgweDgxRkQpIC0gRFNQMyBETSA1MDkKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8yNTRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8yNTRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8yNTRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX0RNXzI1NCAtIFsxNTowXSAqLworCisvKgorICogUjMzMjc4ICgweDgxRkUpIC0gRFNQMyBETSA1MTAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9FTkRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AzX0RNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfRE1fRU5EIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fRU5EXzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQM19ETV9FTkQgLSBbNzowXSAqLworCisvKgorICogUjMzMjc5ICgweDgxRkYpIC0gRFNQMyBETSA1MTEKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX0RNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjM0ODE2ICgweDg4MDApIC0gRFNQMyBQTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fU1RBUlRfMl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19QTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX1NUQVJUXzJfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfUE1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9TVEFSVF8yX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AzX1BNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNDgxNyAoMHg4ODAxKSAtIERTUDMgUE0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX1NUQVJUXzFfTUFTSyAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19QTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1BNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzQ4MTggKDB4ODgwMikgLSBEU1AzIFBNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9TVEFSVF9NQVNLICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1BNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX1NUQVJUX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fU1RBUlRfV0lEVEggICAgICAgICAgICAgICAgICAxNiAgLyogRFNQM19QTV9TVEFSVCAtIFsxNTowXSAqLworCisvKgorICogUjM0ODE5ICgweDg4MDMpIC0gRFNQMyBQTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV8yX01BU0sgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV8yX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV8yX1dJRFRIICAgICAgICAgICAgICAgICAgICAgOCAgLyogRFNQM19QTV8xIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNDgyMCAoMHg4ODA0KSAtIERTUDMgUE0gNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfUE1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogRFNQM19QTV8xIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzQ4MjEgKDB4ODgwNSkgLSBEU1AzIFBNIDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19QTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfUE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjM2MzQ2ICgweDhERkEpIC0gRFNQMyBQTSAxNTMwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fNTEwXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19QTV81MTAgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV81MTBfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNXzUxMCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzUxMF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfUE1fNTEwIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNjM0NyAoMHg4REZCKSAtIERTUDMgUE0gMTUzMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzUxMF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzUxMF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzUxMF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfUE1fNTEwIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzNDggKDB4OERGQykgLSBEU1AzIFBNIDE1MzIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV81MTBfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV81MTBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV81MTBfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1BNXzUxMCAtIFsxNTowXSAqLworCisvKgorICogUjM2MzQ5ICgweDhERkQpIC0gRFNQMyBQTSAxNTMzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fRU5EXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19QTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9FTkRfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX0VORF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfUE1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNjM1MCAoMHg4REZFKSAtIERTUDMgUE0gMTUzNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX0VORF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfUE1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzNTEgKDB4OERGRikgLSBEU1AzIFBNIDE1MzUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1BNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjM2ODY0ICgweDkwMDApIC0gRFNQMyBaTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fU1RBUlRfMV9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19aTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX1NUQVJUXzFfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfWk1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AzX1pNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNjg2NSAoMHg5MDAxKSAtIERTUDMgWk0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX1NUQVJUX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfWk1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fU1RBUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19aTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV9TVEFSVF9XSURUSCAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1pNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY4NjYgKDB4OTAwMikgLSBEU1AzIFpNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xXzFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AzX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICA4ICAvKiBEU1AzX1pNXzEgLSBbNzowXSAqLworCisvKgorICogUjM2ODY3ICgweDkwMDMpIC0gRFNQMyBaTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMV9NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQM19aTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfWk1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1pNXzEgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzODkwOCAoMHg5N0ZDKSAtIERTUDMgWk0gMjA0NAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzEwMjJfMV9NQVNLICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDNfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzEwMjJfMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzEwMjJfMV9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfWk1fMTAyMiAtIFs3OjBdICovCisKKy8qCisgKiBSMzg5MDkgKDB4OTdGRCkgLSBEU1AzIFpNIDIwNDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xMDIyX01BU0sgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1pNXzEwMjIgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMTAyMl9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19aTV8xMDIyIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzEwMjJfV0lEVEggICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfWk1fMTAyMiAtIFsxNTowXSAqLworCisvKgorICogUjM4OTEwICgweDk3RkUpIC0gRFNQMyBaTSAyMDQ2CisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fRU5EXzFfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19aTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV9FTkRfMV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1pNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfWk1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzODkxMSAoMHg5N0ZGKSAtIERTUDMgWk0gMjA0NworICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX0VORF9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX0VORF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX0VORF9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfWk1fRU5EIC0gWzE1OjBdICovCisKK2ludCB3bTUxMDBfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnKTsKK2ludCB3bTUxMDBfdm9sYXRpbGVfcmVnaXN0ZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnKTsKKworZXh0ZXJuIHUxNiB3bTUxMDBfcmVnX2RlZmF1bHRzW1dNNTEwMF9NQVhfUkVHSVNURVIgKyAxXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYwppbmRleCA2ZDZkYzllLi4zNWYzYWQ4MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJCXJldHVybiAxOwogCX0KIAotCXJldCA9IHNuZF9zb2NfcHV0X3ZvbHN3XzJyKGtjb250cm9sLCB1Y29udHJvbCk7CisJcmV0ID0gc25kX3NvY19wdXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzkyLDIzICszOTIsOSBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gc25kX3NvY19nZXRfdm9sc3dfMnIoa2NvbnRyb2wsIHVjb250cm9sKTsKKwlyZXR1cm4gc25kX3NvY19nZXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKIH0KIAotLyogZG91YmxlIGNvbnRyb2wgd2l0aCB2b2x1bWUgdXBkYXRlICovCi0jZGVmaW5lIFNPQ19XTTgzNTBfRE9VQkxFX1JfVExWKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtYXgsIFwKLQkJCQl4aW52ZXJ0LCB0bHZfYXJyYXkpIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCi0JCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBcCi0JCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXAotCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCi0JLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3dfMnIsIFwKLQkuZ2V0ID0gd204MzUwX2dldF92b2xzd18yciwgLnB1dCA9IHdtODM1MF9wdXRfdm9sc3dfMnJfdnUsIFwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCi0JCXsucmVnID0gcmVnX2xlZnQsIC5ycmVnID0gcmVnX3JpZ2h0LCAuc2hpZnQgPSB4c2hpZnQsIFwKLQkJIC5yc2hpZnQgPSB4c2hpZnQsIC5tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0sIH0KLQogc3RhdGljIGNvbnN0IGNoYXIgKndtODM1MF9kZWVtcFtdID0geyAiTm9uZSIsICIzMmtIeiIsICI0NC4xa0h6IiwgIjQ4a0h6IiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKndtODM1MF9wb2xbXSA9IHsgIk5vcm1hbCIsICJJbnYgUiIsICJJbnYgTCIsICJJbnYgTCAmIFIiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqd204MzUwX2RhY211dGVtW10gPSB7ICJOb3JtYWwiLCAiU29mdCIgfTsKQEAgLTQ0MywyNiArNDI5LDI5IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204MzUwX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19FTlVNKCJQbGF5YmFjayBEZWVtcGhhc2lzIiwgd204MzUwX2VudW1bMF0pLAogCVNPQ19FTlVNKCJQbGF5YmFjayBEQUMgSW52ZXJzaW9uIiwgd204MzUwX2VudW1bMV0pLAotCVNPQ19XTTgzNTBfRE9VQkxFX1JfVExWKCJQbGF5YmFjayBQQ00gVm9sdW1lIiwKKwlTT0NfRE9VQkxFX1JfRVhUX1RMVigiUGxheWJhY2sgUENNIFZvbHVtZSIsCiAJCQkJV004MzUwX0RBQ19ESUdJVEFMX1ZPTFVNRV9MLAogCQkJCVdNODM1MF9EQUNfRElHSVRBTF9WT0xVTUVfUiwKLQkJCQkwLCAyNTUsIDAsIGRhY19wY21fdGx2KSwKKwkJCQkwLCAyNTUsIDAsIHdtODM1MF9nZXRfdm9sc3dfMnIsCisJCQkJd204MzUwX3B1dF92b2xzd18ycl92dSwgZGFjX3BjbV90bHYpLAogCVNPQ19FTlVNKCJQbGF5YmFjayBQQ00gTXV0ZSBGdW5jdGlvbiIsIHdtODM1MF9lbnVtWzJdKSwKIAlTT0NfRU5VTSgiUGxheWJhY2sgUENNIE11dGUgU3BlZWQiLCB3bTgzNTBfZW51bVszXSksCiAJU09DX0VOVU0oIkNhcHR1cmUgUENNIEZpbHRlciIsIHdtODM1MF9lbnVtWzRdKSwKIAlTT0NfRU5VTSgiQ2FwdHVyZSBQQ00gSFAgRmlsdGVyIiwgd204MzUwX2VudW1bNV0pLAogCVNPQ19FTlVNKCJDYXB0dXJlIEFEQyBJbnZlcnNpb24iLCB3bTgzNTBfZW51bVs2XSksCi0JU09DX1dNODM1MF9ET1VCTEVfUl9UTFYoIkNhcHR1cmUgUENNIFZvbHVtZSIsCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIkNhcHR1cmUgUENNIFZvbHVtZSIsCiAJCQkJV004MzUwX0FEQ19ESUdJVEFMX1ZPTFVNRV9MLAogCQkJCVdNODM1MF9BRENfRElHSVRBTF9WT0xVTUVfUiwKLQkJCQkwLCAyNTUsIDAsIGFkY19wY21fdGx2KSwKKwkJCQkwLCAyNTUsIDAsIHdtODM1MF9nZXRfdm9sc3dfMnIsCisJCQkJd204MzUwX3B1dF92b2xzd18ycl92dSwgYWRjX3BjbV90bHYpLAogCVNPQ19ET1VCTEVfVExWKCJDYXB0dXJlIFNpZGV0b25lIFZvbHVtZSIsCiAJCSAgICAgICBXTTgzNTBfQURDX0RJVklERVIsCiAJCSAgICAgICA4LCA0LCAxNSwgMSwgY2FwdHVyZV9zZF90bHYpLAotCVNPQ19XTTgzNTBfRE9VQkxFX1JfVExWKCJDYXB0dXJlIFZvbHVtZSIsCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIkNhcHR1cmUgVm9sdW1lIiwKIAkJCQlXTTgzNTBfTEVGVF9JTlBVVF9WT0xVTUUsCiAJCQkJV004MzUwX1JJR0hUX0lOUFVUX1ZPTFVNRSwKLQkJCQkyLCA2MywgMCwgcHJlX2FtcF90bHYpLAorCQkJCTIsIDYzLCAwLCB3bTgzNTBfZ2V0X3ZvbHN3XzJyLAorCQkJCXdtODM1MF9wdXRfdm9sc3dfMnJfdnUsIHByZV9hbXBfdGx2KSwKIAlTT0NfRE9VQkxFX1IoIkNhcHR1cmUgWkMgU3dpdGNoIiwKIAkJICAgICBXTTgzNTBfTEVGVF9JTlBVVF9WT0xVTUUsCiAJCSAgICAgV004MzUwX1JJR0hUX0lOUFVUX1ZPTFVNRSwgMTMsIDEsIDApLApAQCAtNDkwLDE3ICs0NzksMTkgQEAKIAlTT0NfU0lOR0xFX1RMVigiT3V0NCBDYXB0dXJlIFZvbHVtZSIsCiAJCSAgICAgICBXTTgzNTBfSU5QVVRfTUlYRVJfVk9MVU1FLAogCQkgICAgICAgMSwgNywgMCwgb3V0X21peF90bHYpLAotCVNPQ19XTTgzNTBfRE9VQkxFX1JfVExWKCJPdXQxIFBsYXliYWNrIFZvbHVtZSIsCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIk91dDEgUGxheWJhY2sgVm9sdW1lIiwKIAkJCQlXTTgzNTBfTE9VVDFfVk9MVU1FLAogCQkJCVdNODM1MF9ST1VUMV9WT0xVTUUsCi0JCQkJMiwgNjMsIDAsIG91dF9wZ2FfdGx2KSwKKwkJCQkyLCA2MywgMCwgd204MzUwX2dldF92b2xzd18yciwKKwkJCQl3bTgzNTBfcHV0X3ZvbHN3XzJyX3Z1LCBvdXRfcGdhX3RsdiksCiAJU09DX0RPVUJMRV9SKCJPdXQxIFBsYXliYWNrIFpDIFN3aXRjaCIsCiAJCSAgICAgV004MzUwX0xPVVQxX1ZPTFVNRSwKIAkJICAgICBXTTgzNTBfUk9VVDFfVk9MVU1FLCAxMywgMSwgMCksCi0JU09DX1dNODM1MF9ET1VCTEVfUl9UTFYoIk91dDIgUGxheWJhY2sgVm9sdW1lIiwKKwlTT0NfRE9VQkxFX1JfRVhUX1RMVigiT3V0MiBQbGF5YmFjayBWb2x1bWUiLAogCQkJCVdNODM1MF9MT1VUMl9WT0xVTUUsCiAJCQkJV004MzUwX1JPVVQyX1ZPTFVNRSwKLQkJCQkyLCA2MywgMCwgb3V0X3BnYV90bHYpLAorCQkJCTIsIDYzLCAwLCB3bTgzNTBfZ2V0X3ZvbHN3XzJyLAorCQkJCXdtODM1MF9wdXRfdm9sc3dfMnJfdnUsIG91dF9wZ2FfdGx2KSwKIAlTT0NfRE9VQkxFX1IoIk91dDIgUGxheWJhY2sgWkMgU3dpdGNoIiwgV004MzUwX0xPVVQyX1ZPTFVNRSwKIAkJICAgICBXTTgzNTBfUk9VVDJfVk9MVU1FLCAxMywgMSwgMCksCiAJU09DX1NJTkdMRSgiT3V0MiBSaWdodCBJbnZlcnQgU3dpdGNoIiwgV004MzUwX1JPVVQyX1ZPTFVNRSwgMTAsIDEsIDApLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKaW5kZXggZmJlZTU1NmMuLmRjMTNiZTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYwpAQCAtMzgzLDcgKzM4Myw3IEBACiAJCSgxIDw8IFdNODQwMF9BSU5STVVYX1BXUikpKSB7CiAJCXJlZyB8PSBXTTg0MDBfQUlOUl9FTkE7CiAJfSBlbHNlIHsKLQkJcmVnICY9IH5XTTg0MDBfQUlOTF9FTkE7CisJCXJlZyAmPSB+V004NDAwX0FJTlJfRU5BOwogCX0KIAl3bTg0MDBfd3JpdGUody0+Y29kZWMsIFdNODQwMF9QT1dFUl9NQU5BR0VNRU5UXzIsIHJlZyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCmluZGV4IGRiMGRjZWQuLjA3YzljYzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTQ3OSw2ICs0ODAsOCBAQAogCQlwb3dlcjEgfD0gV004NTEwX1BPV0VSMV9CSUFTRU4gfCBXTTg1MTBfUE9XRVIxX0JVRklPRU47CiAKIAkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJc25kX3NvY19jYWNoZV9zeW5jKGNvZGVjKTsKKwogCQkJLyogSW5pdGlhbCBjYXAgY2hhcmdlIGF0IFZNSUQgNWsgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODUxMF9QT1dFUjEsIHBvd2VyMSB8IDB4Myk7CiAJCQltZGVsYXkoMTAwKTsKQEAgLTU0MCwxOCArNTQzLDcgQEAKIAogc3RhdGljIGludCB3bTg1MTBfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgaTsKLQl1OCBkYXRhWzJdOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCi0JLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg1MTBfcmVnKTsgaSsrKSB7Ci0JCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkgJiAweDAwMDEpOwotCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCWNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKTsKLQl9CiAJd204NTEwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTk4LDYgKzU5MCwxMSBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9d204NTEwX3JlZywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODUxMF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODUxMCIgfSwKKwl7IH0sCit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKIHN0YXRpYyBpbnQgX19kZXZpbml0IHdtODUxMF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKQEAgLTYyOCw2ICs2MjUsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gIndtODUxMCIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg1MTBfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gd204NTEwX3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODUxMF9zcGlfcmVtb3ZlKSwKQEAgLTY3MSw2ICs2NjksNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIndtODUxMC1jb2RlYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg1MTBfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg1MTBfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODUxMF9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jCmluZGV4IDRmZDRkOGQuLmRiN2E2ODEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtODQsNyArODUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg1MjNfemNfY291bnQgPQogCVNPQ19FTlVNX1NJTkdMRShXTTg1MjNfWkVST19ERVRFQ1QsIDAsIDIsIHdtODUyM196ZF9jb3VudF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODUyM19zbmRfY29udHJvbHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg1MjNfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIFdNODUyM19EQUNfR0FJTkwsIFdNODUyM19EQUNfR0FJTlIsCiAJCSAwLCA0NDgsIDAsIGRhY190bHYpLAogU09DX1NJTkdMRSgiWkMgU3dpdGNoIiwgV004NTIzX0RBQ19DVFJMMywgNCwgMSwgMCksCkBAIC0xMDEsMjIgKzEwMiwxMSBAQAogU05EX1NPQ19EQVBNX09VVFBVVCgiTElORVZPVVRSIiksCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgd204NTIzX2RhcG1fcm91dGVzW10gPSB7CiAJeyAiTElORVZPVVRMIiwgTlVMTCwgIkRBQyIgfSwKIAl7ICJMSU5FVk9VVFIiLCBOVUxMLCAiREFDIiB9LAogfTsKIAotc3RhdGljIGludCB3bTg1MjNfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204NTIzX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUod204NTIzX2RhcG1fd2lkZ2V0cykpOwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCB7CiAJaW50IHZhbHVlOwogCWludCByYXRpbzsKQEAgLTQxNiw3ICs0MDYsNiBAQAogCXN0cnVjdCB3bTg1MjNfcHJpdiAqd204NTIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldCwgaTsKIAotCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKIAl3bTg1MjMtPnJhdGVfY29uc3RyYWludC5saXN0ID0gJndtODUyMy0+cmF0ZV9jb25zdHJhaW50X2xpc3RbMF07CiAJd204NTIzLT5yYXRlX2NvbnN0cmFpbnQuY291bnQgPQogCQlBUlJBWV9TSVpFKHdtODUyMy0+cmF0ZV9jb25zdHJhaW50X2xpc3QpOwpAQCAtNDc5LDEwICs0NjgsNiBAQAogCS8qIEJpYXMgbGV2ZWwgY29uZmlndXJhdGlvbiB3aWxsIGhhdmUgZG9uZSBhbiBleHRyYSBlbmFibGUgKi8KIAlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204NTIzLT5zdXBwbGllcyksIHdtODUyMy0+c3VwcGxpZXMpOwogCi0Jc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODUyM19zbmRfY29udHJvbHMsCi0JCQkgICAgIEFSUkFZX1NJWkUod204NTIzX3NuZF9jb250cm9scykpOwotCXdtODUyM19hZGRfd2lkZ2V0cyhjb2RlYyk7Ci0KIAlyZXR1cm4gMDsKIAogZXJyX2VuYWJsZToKQEAgLTUxMiw2ICs0OTcsMTggQEAKIAkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1MTYpLAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODUyM19yZWcsCiAJLnZvbGF0aWxlX3JlZ2lzdGVyID0gd204NTIzX3ZvbGF0aWxlX3JlZ2lzdGVyLAorCisJLmNvbnRyb2xzID0gd204NTIzX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODUyM19jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IHdtODUyM19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODUyM19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IHdtODUyM19kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg1MjNfZGFwbV9yb3V0ZXMpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NTIzX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ3bGYsd204NTIzIiB9LAorCXsgfSwKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCkBAIC01NTEsOCArNTQ4LDkgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODUyM19pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIndtODUyMy1jb2RlYyIsCisJCS5uYW1lID0gIndtODUyMyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg1MjNfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg1MjNfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODUyM19pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jCmluZGV4IDRiYmMwYTcuLjgyMTJiM2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KQEAgLTIxMiw3ICsyMTMsNyBAQAogCXJlZ19jYWNoZVtyZWddID0gMDsKIAlyZWdfY2FjaGVbcmVnMl0gPSAwOwogCi0JcmV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIoa2NvbnRyb2wsIHVjb250cm9sKTsKKwlyZXQgPSBzbmRfc29jX3B1dF92b2xzdyhrY29udHJvbCwgdWNvbnRyb2wpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0yMjMsMzEgKzIyNCwxOSBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIFNPQ19XTTg1ODBfT1VUX0RPVUJMRV9SX1RMVih4bmFtZSwgcmVnX2xlZnQsIHJlZ19yaWdodCwgeHNoaWZ0LCB4bWF4LCBcCi0JCQkJICAgIHhpbnZlcnQsIHRsdl9hcnJheSkJCQlcCi17CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksIFwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEIHxcCi0JCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsICBcCi0JLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAotCS5nZXQgPSBzbmRfc29jX2dldF92b2xzd18yciwgLnB1dCA9IHdtODU4MF9vdXRfdnUsIFwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCi0JCXsucmVnID0gcmVnX2xlZnQsIC5ycmVnID0gcmVnX3JpZ2h0LCAuc2hpZnQgPSB4c2hpZnQsIFwKLQkJLm1heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg1ODBfc25kX2NvbnRyb2xzW10gPSB7Ci1TT0NfV004NTgwX09VVF9ET1VCTEVfUl9UTFYoIkRBQzEgUGxheWJhY2sgVm9sdW1lIiwKLQkJCSAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNMMSwKLQkJCSAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNSMSwKLQkJCSAgICAwLCAweGZmLCAwLCBkYWNfdGx2KSwKLVNPQ19XTTg1ODBfT1VUX0RPVUJMRV9SX1RMVigiREFDMiBQbGF5YmFjayBWb2x1bWUiLAotCQkJICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ0wyLAotCQkJICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ1IyLAotCQkJICAgIDAsIDB4ZmYsIDAsIGRhY190bHYpLAotU09DX1dNODU4MF9PVVRfRE9VQkxFX1JfVExWKCJEQUMzIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDTDMsCi0JCQkgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDUjMsCi0JCQkgICAgMCwgMHhmZiwgMCwgZGFjX3RsdiksCitTT0NfRE9VQkxFX1JfRVhUX1RMVigiREFDMSBQbGF5YmFjayBWb2x1bWUiLAorCQkgICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ0wxLAorCQkgICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ1IxLAorCQkgICAgIDAsIDB4ZmYsIDAsIHNuZF9zb2NfZ2V0X3ZvbHN3LCB3bTg1ODBfb3V0X3Z1LCBkYWNfdGx2KSwKK1NPQ19ET1VCTEVfUl9FWFRfVExWKCJEQUMyIFBsYXliYWNrIFZvbHVtZSIsCisJCSAgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDTDIsCisJCSAgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDUjIsCisJCSAgICAgMCwgMHhmZiwgMCwgc25kX3NvY19nZXRfdm9sc3csIHdtODU4MF9vdXRfdnUsIGRhY190bHYpLAorU09DX0RPVUJMRV9SX0VYVF9UTFYoIkRBQzMgUGxheWJhY2sgVm9sdW1lIiwKKwkJICAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNMMywKKwkJICAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNSMywKKwkJICAgICAwLCAweGZmLCAwLCBzbmRfc29jX2dldF92b2xzdywgd204NTgwX291dF92dSwgZGFjX3RsdiksCiAKIFNPQ19TSU5HTEUoIkRBQzEgRGVlbXBoYXNpcyBTd2l0Y2giLCBXTTg1ODBfREFDX0NPTlRST0wzLCAwLCAxLCAwKSwKIFNPQ19TSU5HTEUoIkRBQzIgRGVlbXBoYXNpcyBTd2l0Y2giLCBXTTg1ODBfREFDX0NPTlRST0wzLCAxLCAxLCAwKSwKQEAgLTQ0MSw4ICs0MzAsNyBAQAogCS8qIEFsd2F5cyBkaXNhYmxlIHRoZSBQTEwgLSBpdCBpcyBub3Qgc2FmZSB0byBsZWF2ZSBpdCBydW5uaW5nCiAJICogd2hpbGUgcmVwcm9ncmFtbWluZyBpdC4KIAkgKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODU4MF9QV1JETjIpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODU4MF9QV1JETjIsIHJlZyB8IHB3cl9tYXNrKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg1ODBfUFdSRE4yLCBwd3JfbWFzaywgcHdyX21hc2spOwogCiAJaWYgKCFmcmVxX2luIHx8ICFmcmVxX291dCkKIAkJcmV0dXJuIDA7CkBAIC00NjAsOCArNDQ4LDcgQEAKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg1ODBfUExMQTQgKyBvZmZzZXQsIHJlZyk7CiAKIAkvKiBBbGwgZG9uZSwgdHVybiBpdCBvbiAqLwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004NTgwX1BXUkROMik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NTgwX1BXUkROMiwgcmVnICYgfnB3cl9tYXNrKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg1ODBfUFdSRE4yLCBwd3JfbWFzaywgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc1OSw3ICs3NDYsNiBAQAogc3RhdGljIGludCB3bTg1ODBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewotCXUxNiByZWc7CiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CkBAIC03NjgsMjAgKzc1NCwxOSBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKIAkJCS8qIFBvd2VyIHVwIGFuZCBnZXQgaW5kaXZpZHVhbCBjb250cm9sIG9mIHRoZSBEQUNzICovCi0JCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODU4MF9QV1JETjEpOwotCQkJcmVnICY9IH4oV004NTgwX1BXUkROMV9QV0ROIHwgV004NTgwX1BXUkROMV9BTExEQUNQRCk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg1ODBfUFdSRE4xLCByZWcpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NTgwX1BXUkROMSwKKwkJCQkJICAgIFdNODU4MF9QV1JETjFfUFdETiB8CisJCQkJCSAgICBXTTg1ODBfUFdSRE4xX0FMTERBQ1BELCAwKTsKIAogCQkJLyogTWFrZSBWTUlEIGhpZ2ggaW1wZWRhbmNlICovCi0JCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsICBXTTg1ODBfQURDX0NPTlRST0wxKTsKLQkJCXJlZyAmPSB+MHgxMDA7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg1ODBfQURDX0NPTlRST0wxLCByZWcpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NTgwX0FEQ19DT05UUk9MMSwKKwkJCQkJICAgIDB4MTAwLCAwKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg1ODBfUFdSRE4xKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004NTgwX1BXUkROMSwgcmVnIHwgV004NTgwX1BXUkROMV9QV0ROKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NTgwX1BXUkROMSwKKwkJCQkgICAgV004NTgwX1BXUkROMV9QV0ROLCBXTTg1ODBfUFdSRE4xX1BXRE4pOwogCQlicmVhazsKIAl9CiAJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwpAQCAtOTA3LDYgKzg5MiwxMSBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODU4MF9yZWcsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg1ODBfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg1ODAiIH0sCisJeyB9LAorfTsKKwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKIHN0YXRpYyBpbnQgd204NTgwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKQEAgLTk0Myw4ICs5MzMsOSBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NTgwX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAid204NTgwLWNvZGVjIiwKKwkJLm5hbWUgPSAid204NTgwIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODU4MF9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9ICAgIHdtODU4MF9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9ICAgd204NTgwX2kyY19yZW1vdmUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYwppbmRleCBhNTM3ZTRhLi4wNzZiZGI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDYgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzCiAgKgotICogQXV0aG9yOiBNaWtlIEFydGh1ciA8bGludXhAd29sZnNvbm1pY3JvLmNvbT4KKyAqIEF1dGhvcjogTWlrZSBBcnRodXIgPE1pa2UuQXJ0aHVyQHdvbGZzb25taWNyby5jb20+CiAgKgogICogQmFzZWQgb24gd204NzMxLmMgYnkgUmljaGFyZCBQdXJkaWUKICAqCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtMTUwLDcgKzE1MSw3IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAlzdHJ1Y3Qgd204NzExX3ByaXYgKndtODcxMSA9ICBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1MTYgaWZhY2UgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODcxMV9JRkFDRSkgJiAweGZmZmM7CisJdTE2IGlmYWNlID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3MTFfSUZBQ0UpICYgMHhmZmYzOwogCWludCBpID0gZ2V0X2NvZWZmKHdtODcxMS0+c3lzY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKIAl1MTYgc3JhdGUgPSAoY29lZmZfZGl2W2ldLnNyIDw8IDIpIHwKIAkJKGNvZWZmX2RpdltpXS5ib3NyIDw8IDEpIHwgY29lZmZfZGl2W2ldLnVzYjsKQEAgLTIzMSw3ICsyMzIsNyBAQAogCQl1bnNpZ25lZCBpbnQgZm10KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7Ci0JdTE2IGlmYWNlID0gMDsKKwl1MTYgaWZhY2UgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODcxMV9JRkFDRSkgJiAweDAwMGM7CiAKIAkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLwogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKQEAgLTI4Niw3ICsyODcsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgd204NzExX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKQEAgLTI5OSw2ICsyOTksOSBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpCisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODcxMV9QV1IsIHJlZyB8IDB4MDA0MCk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKQEAgLTM0NSwyNSArMzQ4LDE0IEBACiAKIHN0YXRpYyBpbnQgd204NzExX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IGk7Ci0JdTggZGF0YVsyXTsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzExX3JlZyk7IGkrKykgewotCQlkYXRhWzBdID0gKGkgPDwgMSkgfCAoKGNhY2hlW2ldID4+IDgpICYgMHgwMDAxKTsKLQkJZGF0YVsxXSA9IGNhY2hlW2ldICYgMHgwMGZmOwotCQljb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMik7Ci0JfQogCXdtODcxMV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd204NzExX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204NzExX3ByaXYgKndtODcxMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQsIHJlZzsKKwlpbnQgcmV0OwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIHdtODcxMS0+YnVzX3R5cGUpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0zODAsMTAgKzM3Miw4IEBACiAJd204NzExX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAkvKiBMYXRjaCB0aGUgdXBkYXRlIGJpdHMgKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODcxMV9MT1VUMVYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODcxMV9MT1VUMVYsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3MTFfUk9VVDFWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3MTFfUk9VVDFWLCByZWcgfCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODcxMV9MT1VUMVYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3MTFfUk9VVDFWLCAweDAxMDAsIDB4MDEwMCk7CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgd204NzExX3NuZF9jb250cm9scywKIAkJCSAgICAgQVJSQVlfU0laRSh3bTg3MTFfc25kX2NvbnRyb2xzKSk7CkBAIC00MTQsNiArNDA0LDEyIEBACiAJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzExX2ludGVyY29uKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODcxMV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODcxMSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd204NzExX29mX21hdGNoKTsKKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTg3MTFfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CkBAIC00NDMsOCArNDM5LDkgQEAKIAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODcxMV9zcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gIndtODcxMS1jb2RlYyIsCisJCS5uYW1lCT0gIndtODcxMSIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3MTFfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gd204NzExX3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODcxMV9zcGlfcmVtb3ZlKSwKQEAgLTQ4Nyw4ICs0ODQsOSBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzExX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAid204NzExLWNvZGVjIiwKKwkJLm5hbWUgPSAid204NzExIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODcxMV9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9ICAgIHdtODcxMV9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9ICAgX19kZXZleGl0X3Aod204NzExX2kyY19yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMKaW5kZXggODZkNDcxOC4uMDRiMDI3ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtMjY5LDYgKzI3MCwxMiBAQAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODcyOF9pbnRlcmNvbiksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3Mjhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg3MjgiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdtODcyOF9vZl9tYXRjaCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogc3RhdGljIGludCBfX2RldmluaXQgd204NzI4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewpAQCAtMjk4LDggKzMwNSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bTg3Mjhfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZQk9ICJ3bTg3MjgtY29kZWMiLAorCQkubmFtZQk9ICJ3bTg3MjgiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzI4X29mX21hdGNoLAogCX0sCiAJLnByb2JlCQk9IHdtODcyOF9zcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTg3Mjhfc3BpX3JlbW92ZSksCkBAIC0zNDIsOCArMzUwLDkgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODcyOF9pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIndtODcyOC1jb2RlYyIsCisJCS5uYW1lID0gIndtODcyOCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3Mjhfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg3MjhfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODcyOF9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCmluZGV4IDc2YjQzNjEuLjdlNWVjMDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtNDI2LDkgKzQyNyw3IEBACiAJCQkJIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewogCXN0cnVjdCB3bTg3MzFfcHJpdiAqd204NzMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGksIHJldDsKLQl1OCBkYXRhWzJdOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWludCByZXQ7CiAJdTE2IHJlZzsKIAogCXN3aXRjaCAobGV2ZWwpIHsKQEAgLTQ0MywxNiArNDQyLDcgQEAKIAkJCWlmIChyZXQgIT0gMCkKIAkJCQlyZXR1cm4gcmV0OwogCi0JCQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSAqLwotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzMxX3JlZyk7IGkrKykgewotCQkJCWlmIChjYWNoZVtpXSA9PSB3bTg3MzFfcmVnW2ldKQotCQkJCQljb250aW51ZTsKLQotCQkJCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkKLQkJCQkJCSAgICAgICYgMHgwMDAxKTsKLQkJCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCQkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOwotCQkJfQorCQkJc25kX3NvY19jYWNoZV9zeW5jKGNvZGVjKTsKIAkJfQogCiAJCS8qIENsZWFyIFBXUk9GRiwgZ2F0ZSBDTEtPVVQsIGV2ZXJ5dGhpbmcgZWxzZSBhcy1pcyAqLwpAQCAtNjA3LDYgKzU5NywxMyBAQAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODczMV9pbnRlcmNvbiksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3MzFfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg3MzEiLCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd204NzMxX29mX21hdGNoKTsKKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTg3MzFfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CkBAIC02MzgsNiArNjM1LDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJ3bTg3MzEiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzMxX29mX21hdGNoLAogCX0sCiAJLnByb2JlCQk9IHdtODczMV9zcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTg3MzFfc3BpX3JlbW92ZSksCkBAIC02ODIsNiArNjgwLDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJ3bTg3MzEiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzMxX29mX21hdGNoLAogCX0sCiAJLnByb2JlID0gICAgd204NzMxX2kyY19wcm9iZSwKIAkucmVtb3ZlID0gICBfX2RldmV4aXRfcCh3bTg3MzFfaTJjX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYwppbmRleCAzMGM2N2QwLi5mNmFlZjU4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC02MzQsNiArNjM1LDEzIEBACiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204NzM3X3JlZywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODczN19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODczNyIsIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB3bTg3Mzdfb2ZfbWF0Y2gpOworCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogc3RhdGljIF9fZGV2aW5pdCBpbnQgd204NzM3X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKQEAgLTY3Myw2ICs2ODEsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIndtODczNyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3Mzdfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg3MzdfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODczN19pMmNfcmVtb3ZlKSwKQEAgLTcxMSw2ICs3MjAsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gIndtODczNyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3Mzdfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gd204NzM3X3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODczN19zcGlfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCmluZGV4IDI1YWY5MDEuLjU3YWQyMmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYwpAQCAtMTcsOSArMTcsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtMzM3LDEwICszMzksMTAgQEAKIAkJaWZhY2UgfD0gMHgwMDA0OwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgotCQlpZmFjZSB8PSAweDAwMDM7CisJCWlmYWNlIHw9IDB4MDAwQzsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKLQkJaWZhY2UgfD0gMHgwMDEzOworCQlpZmFjZSB8PSAweDAwMUM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDAyLDE1ICs0MDQsNyBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCB3bTg3NDFfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpbnQgaTsKLQotCS8qIFJFU1RPUkUgUkVHIENhY2hlICovCi0JZm9yIChpID0gMDsgaSA8IFdNODc0MV9SRUdJU1RFUl9DT1VOVDsgaSsrKSB7Ci0JCWlmIChjYWNoZVtpXSA9PSB3bTg3NDFfcmVnX2RlZmF1bHRzW2ldIHx8IFdNODc0MV9SRVNFVCA9PSBpKQotCQkJY29udGludWU7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGksIGNhY2hlW2ldKTsKLQl9CisJc25kX3NvY19jYWNoZV9zeW5jKGNvZGVjKTsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCkBAIC00MjIsMTcgKzQxNiwzNSBAQAogewogCXN0cnVjdCB3bTg3NDFfcHJpdiAqd204NzQxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKTsgaSsrKQorCQl3bTg3NDEtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODc0MV9zdXBwbHlfbmFtZXNbaV07CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoY29kZWMtPmRldiwgQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKSwKKwkJCQkgd204NzQxLT5zdXBwbGllcyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksCisJCQkJICAgIHdtODc0MS0+c3VwcGxpZXMpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZ2V0OworCX0KIAogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCB3bTg3NDEtPmNvbnRyb2xfdHlwZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfZW5hYmxlOwogCX0KIAogCXJldCA9IHdtODc0MV9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfZW5hYmxlOwogCX0KIAogCS8qIENoYW5nZSBzb21lIGRlZmF1bHQgc2V0dGluZ3MgLSBsYXRjaCBWVSAqLwpAQCAtNDQyLDcgKzQ1NCw3IEBACiAJCQkgICAgV004NzQxX1VQREFURUxNLCBXTTg3NDFfVVBEQVRFTE0pOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc0MV9EQUNSTFNCX0FUVEVOVUFUSU9OLAogCQkJICAgIFdNODc0MV9VUERBVEVSTCwgV004NzQxX1VQREFURVJMKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NDFfREFDUkxTQl9BVFRFTlVBVElPTiwKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NDFfREFDUk1TQl9BVFRFTlVBVElPTiwKIAkJCSAgICBXTTg3NDFfVVBEQVRFUk0sIFdNODc0MV9VUERBVEVSTSk7CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgd204NzQxX3NuZF9jb250cm9scywKQEAgLTQ1MSw1OCArNDYzLDYxIEBACiAKIAlkZXZfZGJnKGNvZGVjLT5kZXYsICJTdWNjZXNzZnVsIHJlZ2lzdHJhdGlvblxuIik7CiAJcmV0dXJuIHJldDsKKworZXJyX2VuYWJsZToKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksIHdtODc0MS0+c3VwcGxpZXMpOworZXJyX2dldDoKKwlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksIHdtODc0MS0+c3VwcGxpZXMpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd204NzQxX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODc0MV9wcml2ICp3bTg3NDEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKSwgd204NzQxLT5zdXBwbGllcyk7CisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtODc0MS0+c3VwcGxpZXMpLCB3bTg3NDEtPnN1cHBsaWVzKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzQxID0gewogCS5wcm9iZSA9CXdtODc0MV9wcm9iZSwKKwkucmVtb3ZlID0Jd204NzQxX3JlbW92ZSwKIAkucmVzdW1lID0Jd204NzQxX3Jlc3VtZSwKIAkucmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKHdtODc0MV9yZWdfZGVmYXVsdHMpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204NzQxX3JlZ19kZWZhdWx0cywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODc0MV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODc0MSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd204NzQxX29mX21hdGNoKTsKKwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKIHN0YXRpYyBpbnQgd204NzQxX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgd204NzQxX3ByaXYgKndtODc0MTsKLQlpbnQgcmV0LCBpOworCWludCByZXQ7CiAKIAl3bTg3NDEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204NzQxX3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAod204NzQxID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyk7IGkrKykKLQkJd204NzQxLT5zdXBwbGllc1tpXS5zdXBwbHkgPSB3bTg3NDFfc3VwcGx5X25hbWVzW2ldOwotCi0JcmV0ID0gcmVndWxhdG9yX2J1bGtfZ2V0KCZpMmMtPmRldiwgQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKSwKLQkJCQkgd204NzQxLT5zdXBwbGllcyk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3Qgc3VwcGxpZXM6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKSwKLQkJCQkgICAgd204NzQxLT5zdXBwbGllcyk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBzdXBwbGllczogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2dldDsKLQl9Ci0KIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTg3NDEpOwogCXdtODc0MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKLQlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCi0JCQkmc29jX2NvZGVjX2Rldl93bTg3NDEsICZ3bTg3NDFfZGFpLCAxKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZW5hYmxlOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAorCQkJCSAgICAgJnNvY19jb2RlY19kZXZfd204NzQxLCAmd204NzQxX2RhaSwgMSk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGVycjsKKwogCXJldHVybiByZXQ7CiAKLWVycl9lbmFibGU6Ci0JcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODc0MS0+c3VwcGxpZXMpLCB3bTg3NDEtPnN1cHBsaWVzKTsKLQotZXJyX2dldDoKLQlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksIHdtODc0MS0+c3VwcGxpZXMpOwogZXJyOgogCWtmcmVlKHdtODc0MSk7CiAJcmV0dXJuIHJldDsKQEAgLTUxMCwxMCArNTI1LDcgQEAKIAogc3RhdGljIGludCB3bTg3NDFfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCB3bTg3NDFfcHJpdiAqd204NzQxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KIAlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKLQlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksIHdtODc0MS0+c3VwcGxpZXMpOwogCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUyNiw4ICs1MzgsOSBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzQxX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAid204NzQxLWNvZGVjIiwKKwkJLm5hbWUgPSAid204NzQxIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODc0MV9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9ICAgIHdtODc0MV9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9ICAgd204NzQxX2kyY19yZW1vdmUsCkBAIC01MzUsNiArNTQ4LDQ0IEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorc3RhdGljIGludCBfX2RldmluaXQgd204NzQxX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB3bTg3NDFfcHJpdiAqd204NzQxOworCWludCByZXQ7CisKKwl3bTg3NDEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204NzQxX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAod204NzQxID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd204NzQxLT5jb250cm9sX3R5cGUgPSBTTkRfU09DX1NQSTsKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCB3bTg3NDEpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYsCisJCQkmc29jX2NvZGVjX2Rldl93bTg3NDEsICZ3bTg3NDFfZGFpLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJa2ZyZWUod204NzQxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB3bTg3NDFfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCWtmcmVlKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODc0MV9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIndtODc0MSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3NDFfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUJCT0gd204NzQxX3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODc0MV9zcGlfcmVtb3ZlKSwKK307CisjZW5kaWYgLyogQ09ORklHX1NQSV9NQVNURVIgKi8KKwogc3RhdGljIGludCBfX2luaXQgd204NzQxX21vZGluaXQodm9pZCkKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTU0NCw2ICs1OTUsMTMgQEAKIAlpZiAocmV0ICE9IDApCiAJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIFdNODc0MSBJMkMgZHJpdmVyOiAlZFxuIiwgcmV0KTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmd204NzQxX3NwaV9kcml2ZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciB3bTg3NDEgU1BJIGRyaXZlcjogJWRcbiIsCisJCSAgICAgICByZXQpOworCX0KKyNlbmRpZgogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU1MSw2ICs2MDksOSBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgd204NzQxX2V4aXQodm9pZCkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204NzQxX3NwaV9kcml2ZXIpOworI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogCWkyY19kZWxfZHJpdmVyKCZ3bTg3NDFfaTJjX2RyaXZlcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCmluZGV4IGQwMDAzY2MuLmNhNzVhODEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTYxNSw2ICs2MTYsOCBAQAogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCQkvKiBTZXQgVk1JRCB0byA1ayAqLwogCQkJc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX1BXUjEsIHB3cl9yZWcgfCAweDAxYzEpOwogCkBAIC02NzIsMjggKzY3NSwxNCBAQAogCiBzdGF0aWMgaW50IHdtODc1MF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCXU4IGRhdGFbMl07Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0KLQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODc1MF9yZWcpOyBpKyspIHsKLQkJaWYgKGkgPT0gV004NzUwX1JFU0VUKQotCQkJY29udGludWU7Ci0JCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkgJiAweDAwMDEpOwotCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCWNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKTsKLQl9Ci0KIAl3bTg3NTBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODc1MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODc1MF9wcml2ICp3bTg3NTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmVnLCByZXQ7CisJaW50IHJldDsKIAogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCB3bTg3NTAtPmNvbnRyb2xfdHlwZSk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTcxMSwyMiArNzAwLDE0IEBACiAJd204NzUwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3NTBfTERBQyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX0xEQUMsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3NTBfUkRBQyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX1JEQUMsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3NTBfTE9VVDFWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTBfTE9VVDFWLCByZWcgfCAweDAxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004NzUwX1JPVVQxVik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX1JPVVQxViwgcmVnIHwgMHgwMTAwKTsKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODc1MF9MT1VUMlYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODc1MF9MT1VUMlYsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3NTBfUk9VVDJWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTBfUk9VVDJWLCByZWcgfCAweDAxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004NzUwX0xJTlZPTCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX0xJTlZPTCwgcmVnIHwgMHgwMTAwKTsKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODc1MF9SSU5WT0wpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODc1MF9SSU5WT0wsIHJlZyB8IDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzUwX0xEQUMsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NTBfUkRBQywgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc1MF9MT1VUMVYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NTBfUk9VVDFWLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzUwX0xPVVQyViwgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc1MF9ST1VUMlYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NTBfTElOVk9MLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzUwX1JJTlZPTCwgMHgwMTAwLCAweDAxMDApOwogCiAJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODc1MF9zbmRfY29udHJvbHMsCiAJCQkJQVJSQVlfU0laRSh3bTg3NTBfc25kX2NvbnRyb2xzKSk7CkBAIC03NTEsNiArNzMyLDEzIEBACiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204NzUwX3JlZywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODc1MF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODc1MCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ3bGYsd204OTg3IiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB3bTg3NTBfb2ZfbWF0Y2gpOworCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKIHN0YXRpYyBpbnQgX19kZXZpbml0IHdtODc1MF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKQEAgLTc4Nyw4ICs3NzUsOSBAQAogCiBzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgd204NzUwX3NwaV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAid204NzUwLWNvZGVjIiwKKwkJLm5hbWUJPSAid204NzUwIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODc1MF9vZl9tYXRjaCwKIAl9LAogCS5pZF90YWJsZQk9IHdtODc1MF9zcGlfaWRzLAogCS5wcm9iZQkJPSB3bTg3NTBfc3BpX3Byb2JlLApAQCAtODMzLDggKzgyMiw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg3NTBfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ3bTg3NTAtY29kZWMiLAorCQkubmFtZSA9ICJ3bTg3NTAiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzUwX29mX21hdGNoLAogCX0sCiAJLnByb2JlID0gICAgd204NzUwX2kyY19wcm9iZSwKIAkucmVtb3ZlID0gICBfX2RldmV4aXRfcCh3bTg3NTBfaTJjX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYwppbmRleCBhYTA5MWEwLi5hOTUwNDcxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE0OTAsNiArMTQ5MSwxMiBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODc1M19yZWcsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3NTNfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg3NTMiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdtODc1M19vZl9tYXRjaCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogc3RhdGljIGludCBfX2RldmluaXQgd204NzUzX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewpAQCAtMTUxOSw4ICsxNTI2LDkgQEAKIAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODc1M19zcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gIndtODc1My1jb2RlYyIsCisJCS5uYW1lCT0gIndtODc1MyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3NTNfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gd204NzUzX3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODc1M19zcGlfcmVtb3ZlKSwKQEAgLTE1NjMsOCArMTU3MSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg3NTNfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ3bTg3NTMtY29kZWMiLAorCQkubmFtZSA9ICJ3bTg3NTMiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzUzX29mX21hdGNoLAogCX0sCiAJLnByb2JlID0gICAgd204NzUzX2kyY19wcm9iZSwKIAkucmVtb3ZlID0gICBfX2RldmV4aXRfcCh3bTg3NTNfaTJjX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzAuYwppbmRleCAxOWI5MmJhLi5hYTA1ZTY1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgpAQCAtNjg0LDYgKzY4NSwxMiBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODc3MF9yZWdfZGVmcwogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzcwX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ3bGYsd204NzcwIiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB3bTg3NzBfb2ZfbWF0Y2gpOworCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKIHN0YXRpYyBpbnQgX19kZXZpbml0IHdtODc3MF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKQEAgLTcxNSw2ICs3MjIsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIndtODc3MCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3NzBfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSB3bTg3NzBfc3BpX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh3bTg3NzBfc3BpX3JlbW92ZSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCmluZGV4IDhlNzk1M2IuLmJmZGM1MjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjE1LDggKzIxNiw2IEBACiAJaW50IHJhdGlvX3NoaWZ0LCBtYXN0ZXI7CiAJaW50IGk7CiAKLQlpZmFjZSA9IDA7Ci0KIAlzd2l0Y2ggKGRhaS0+ZHJpdmVyLT5pZCkgewogCWNhc2UgV004Nzc2X0RBSV9EQUM6CiAJCWlmYWNlX3JlZyA9IFdNODc3Nl9EQUNJRkNUUkw7CkBAIC0yMzIsMjAgKzIzMSwyMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQogCS8qIFNldCB3b3JkIGxlbmd0aCAqLwotCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlzd2l0Y2ggKHNuZF9wY21fZm9ybWF0X3dpZHRoKHBhcmFtc19mb3JtYXQocGFyYW1zKSkpIHsKKwljYXNlIDE2OgorCQlpZmFjZSA9IDA7CisJY2FzZSAyMDoKKwkJaWZhY2UgPSAweDEwOwogCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKLQkJaWZhY2UgfD0gMHgxMDsKKwljYXNlIDI0OgorCQlpZmFjZSA9IDB4MjA7CiAJCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCWlmYWNlIHw9IDB4MjA7CisJY2FzZSAzMjoKKwkJaWZhY2UgPSAweDMwOwogCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQlpZmFjZSB8PSAweDMwOwotCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnRlZCBzYW1wbGUgc2l6ZTogJWlcbiIsCisJCQlzbmRfcGNtX2Zvcm1hdF93aWR0aChwYXJhbXNfZm9ybWF0KHBhcmFtcykpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogT25seSBuZWVkIHRvIHNldCBNQ0xLL0xSQ0xLIHJhdGlvIGlmIHdlJ3JlIG1hc3RlciAqLwpAQCAtMzA2LDYgKzMwOCw4IEBACiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CisKIAkJCS8qIERpc2FibGUgdGhlIGdsb2JhbCBwb3dlcmRvd247IERBUE0gZG9lcyB0aGUgcmVzdCAqLwogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004Nzc2X1BXUkRPV04sIDEsIDApOwogCQl9CkBAIC0zMjAsMTEgKzMyNCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgV004Nzc2X1JBVEVTIChTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHxcCi0JCSAgICAgIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfFwKLQkJICAgICAgU05EUlZfUENNX1JBVEVfOTYwMDApCi0KLQogI2RlZmluZSBXTTg3NzZfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfFwKIAkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCiAKQEAgLTM0OSw3ICszNDgsOSBAQAogCQkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKIAkJCS5jaGFubmVsc19taW4gPSAyLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBXTTg3NzZfUkFURVMsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAorCQkJLnJhdGVfbWluID0gMzIwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCiAJCQkuZm9ybWF0cyA9IFdNODc3Nl9GT1JNQVRTLAogCQl9LAogCQkub3BzID0gJndtODc3Nl9kYWNfb3BzLApAQCAtMzYxLDcgKzM2Miw5IEBACiAJCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCiAJCQkuY2hhbm5lbHNfbWluID0gMiwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gV004Nzc2X1JBVEVTLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUywKKwkJCS5yYXRlX21pbiA9IDMyMDAwLAorCQkJLnJhdGVfbWF4ID0gOTYwMDAsCiAJCQkuZm9ybWF0cyA9IFdNODc3Nl9GT1JNQVRTLAogCQl9LAogCQkub3BzID0gJndtODc3Nl9hZGNfb3BzLApAQCAtMzc4LDIxICszODEsNyBAQAogCiBzdGF0aWMgaW50IHdtODc3Nl9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCXU4IGRhdGFbMl07Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0KLQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODc3Nl9yZWcpOyBpKyspIHsKLQkJaWYgKGNhY2hlW2ldID09IHdtODc3Nl9yZWdbaV0pCi0JCQljb250aW51ZTsKLQkJZGF0YVswXSA9IChpIDw8IDEpIHwgKChjYWNoZVtpXSA+PiA4KSAmIDB4MDAwMSk7Ci0JCWRhdGFbMV0gPSBjYWNoZVtpXSAmIDB4MDBmZjsKLQkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOwotCX0KLQogCXdtODc3Nl9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwotCiAJcmV0dXJuIDA7CiB9CiAjZWxzZQpAQCAtNDUyLDYgKzQ0MSwxMiBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODc3Nl9yZWcsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3NzZfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg3NzYiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdtODc3Nl9vZl9tYXRjaCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogc3RhdGljIGludCBfX2RldmluaXQgd204Nzc2X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewpAQCAtNDgxLDggKzQ3Niw5IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bTg3NzZfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZQk9ICJ3bTg3NzYtY29kZWMiLAorCQkubmFtZQk9ICJ3bTg3NzYiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204Nzc2X29mX21hdGNoLAogCX0sCiAJLnByb2JlCQk9IHdtODc3Nl9zcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTg3NzZfc3BpX3JlbW92ZSksCkBAIC01MjUsOCArNTIxLDkgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODc3Nl9pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIndtODc3Ni1jb2RlYyIsCisJCS5uYW1lID0gIndtODc3NiIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3NzZfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg3NzZfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODc3Nl9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc4Mi5jCmluZGV4IGEyYTA5ZjguLmYyY2VkNzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3ODIuYwpAQCAtNjAsNyArNjAsNyBAQAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZSA9IHdtODc4Ml9wcm9iZSwKLQkucmVtb3ZlID0gd204NzgyX3JlbW92ZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aod204NzgyX3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB3bTg3ODJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKaW5kZXggOWE1ZTY3Yy4uOWVlMDcyYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC03MTcsNiArNzE4LDEyIEBACiAJLnZvbGF0aWxlX3JlZ2lzdGVyID0gd204ODA0X3ZvbGF0aWxlCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg4MDRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg4MDQiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdtODgwNF9vZl9tYXRjaCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogc3RhdGljIGludCBfX2RldmluaXQgd204ODA0X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewpAQCAtNzQ4LDYgKzc1NSw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAid204ODA0IiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODgwNF9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9IHdtODgwNF9zcGlfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODgwNF9zcGlfcmVtb3ZlKQpAQCAtNzkyLDYgKzgwMCw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAid204ODA0IiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODgwNF9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9IHdtODgwNF9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODgwNF9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCmluZGV4IDA4MjA0MGUuLjNkMGRjMTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYwpAQCAtMTEwLDggKzExMCw4IEBACiAKICNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzFfQkNMS19ESVIgICAweDEKICNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzFfTUNMS19TUkMgICAweDEwMAotI2RlZmluZSBXTTg5MDBfUkVHX0NMT0NLSU5HMV9CQ0xLX01BU0sgICh+MHgwMWUpCi0jZGVmaW5lIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX09QQ0xLX01BU0sgKH4weDcwMDApCisjZGVmaW5lIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX0JDTEtfTUFTSyAgMHgwMWUKKyNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzFfT1BDTEtfTUFTSyAweDcwMDAKIAogI2RlZmluZSBXTTg5MDBfUkVHX0NMT0NLSU5HMl9BRENfQ0xLRElWIDB4ZTAKICNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzJfREFDX0NMS0RJViAweDFjCkBAIC0xMzUsNyArMTM1LDcgQEAKICNkZWZpbmUgV004OTAwX1JFR19IUENUTDFfSFBfU0hPUlQgICAgICAgMHgwOAogI2RlZmluZSBXTTg5MDBfUkVHX0hQQ1RMMV9IUF9TSE9SVDIgICAgICAweDA0CiAKLSNkZWZpbmUgV004OTAwX0xSQ19NQVNLIDB4ZmMwMAorI2RlZmluZSBXTTg5MDBfTFJDX01BU0sgMHgwM2ZmCiAKIHN0cnVjdCB3bTg5MDBfcHJpdiB7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CkBAIC03NDIsMjYgKzc0MiwyMCBAQAogewogCXN0cnVjdCB3bTg5MDBfcHJpdiAqd204OTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IF9mbGxfZGl2IGZsbF9kaXY7Ci0JdW5zaWduZWQgaW50IHJlZzsKIAogCWlmICh3bTg5MDAtPmZsbF9pbiA9PSBmcmVxX2luICYmIHdtODkwMC0+ZmxsX291dCA9PSBmcmVxX291dCkKIAkJcmV0dXJuIDA7CiAKIAkvKiBUaGUgZGlnaXRhbCBzaWRlIHNob3VsZCBiZSBkaXNhYmxlZCBkdXJpbmcgYW55IGNoYW5nZS4gKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSwKLQkJICAgICByZWcgJiAofldNODkwMF9SRUdfUE9XRVIxX0ZMTF9FTkEpKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSwKKwkJCSAgICBXTTg5MDBfUkVHX1BPV0VSMV9GTExfRU5BLCAwKTsKIAogCS8qIERpc2FibGUgdGhlIEZMTD8gKi8KIAlpZiAoIWZyZXFfaW4gfHwgIWZyZXFfb3V0KSB7Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKLQkJCSAgICAgcmVnICYgKH5XTTg5MDBfUkVHX0NMT0NLSU5HMV9NQ0xLX1NSQykpOwotCi0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19GTExDVEwxKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19GTExDVEwxLAotCQkJICAgICByZWcgJiAofldNODkwMF9SRUdfRkxMQ1RMMV9PU0NfRU5BKSk7Ci0KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCisJCQkJICAgIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX01DTEtfU1JDLCAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19GTExDVEwxLAorCQkJCSAgICBXTTg5MDBfUkVHX0ZMTENUTDFfT1NDX0VOQSwgMCk7CiAJCXdtODkwMC0+ZmxsX2luID0gZnJlcV9pbjsKIAkJd204OTAwLT5mbGxfb3V0ID0gZnJlcV9vdXQ7CiAKQEAgLTc5NiwxNSArNzkwLDE0IEBACiAJZWxzZQogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0ZMTENUTDYsIDApOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19QT1dFUjEsCi0JCSAgICAgcmVnIHwgV004OTAwX1JFR19QT1dFUjFfRkxMX0VOQSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19QT1dFUjEsCisJCQkgICAgV004OTAwX1JFR19QT1dFUjFfRkxMX0VOQSwKKwkJCSAgICBXTTg5MDBfUkVHX1BPV0VSMV9GTExfRU5BKTsKIAogcmVlbmFibGU6Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCi0JCSAgICAgcmVnIHwgV004OTAwX1JFR19DTE9DS0lORzFfTUNMS19TUkMpOwotCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCisJCQkgICAgV004OTAwX1JFR19DTE9DS0lORzFfTUNMS19TUkMsCisJCQkgICAgV004OTAwX1JFR19DTE9DS0lORzFfTUNMS19TUkMpOwogCXJldHVybiAwOwogfQogCkBAIC04MTgsNDMgKzgxMSwzNSBAQAogCQkJCSBpbnQgZGl2X2lkLCBpbnQgZGl2KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7Ci0JdW5zaWduZWQgaW50IHJlZzsKIAogCXN3aXRjaCAoZGl2X2lkKSB7CiAJY2FzZSBXTTg5MDBfQkNMS19ESVY6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKLQkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX0JDTEtfTUFTSykpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKKwkJCQkgICAgV004OTAwX1JFR19DTE9DS0lORzFfQkNMS19NQVNLLCBkaXYpOwogCQlicmVhazsKIAljYXNlIFdNODkwMF9PUENMS19ESVY6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKLQkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX09QQ0xLX01BU0spKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCisJCQkJICAgIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX09QQ0xLX01BU0ssIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0RBQ19MUkNMSzoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPNCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQVVESU80LAotCQkJICAgICBkaXYgfCAocmVnICYgV004OTAwX0xSQ19NQVNLKSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfQVVESU80LAorCQkJCSAgICBXTTg5MDBfTFJDX01BU0ssIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0FEQ19MUkNMSzoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPMyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQVVESU8zLAotCQkJICAgICBkaXYgfCAocmVnICYgV004OTAwX0xSQ19NQVNLKSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfQVVESU8zLAorCQkJCSAgICBXTTg5MDBfTFJDX01BU0ssIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0RBQ19DTEtESVY6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzIpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMiwKLQkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0RBQ19DTEtESVYpKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzIsCisJCQkJICAgIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0RBQ19DTEtESVYsIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0FEQ19DTEtESVY6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzIpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMiwKLQkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0FEQ19DTEtESVYpKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzIsCisJCQkJICAgIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0FEQ19DTEtESVYsIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0xSQ0xLX01PREU6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19EQUNDVFJMKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19EQUNDVFJMLAotCQkJICAgICBkaXYgfCAocmVnICYgV004OTAwX1JFR19EQUNDVFJMX0FJRl9MUkNMS1JBVEUpKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19EQUNDVFJMLAorCQkJCSAgICBXTTg5MDBfUkVHX0RBQ0NUUkxfQUlGX0xSQ0xLUkFURSwgZGl2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDM3LDEyICsxMDIyLDEyIEBACiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgogCQkvKiBFbmFibGUgdGhlcm1hbCBzaHV0ZG93biAqLwotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfR1BJTyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfR1BJTywKLQkJCSAgICAgcmVnIHwgV004OTAwX1JFR19HUElPX1RFTVBfRU5BKTsKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FERENUTCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQUREQ1RMLAotCQkJICAgICByZWcgfCBXTTg5MDBfUkVHX0FERENUTF9URU1QX1NEKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19HUElPLAorCQkJCSAgICBXTTg5MDBfUkVHX0dQSU9fVEVNUF9FTkEsCisJCQkJICAgIFdNODkwMF9SRUdfR1BJT19URU1QX0VOQSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfQUREQ1RMLAorCQkJCSAgICBXTTg5MDBfUkVHX0FERENUTF9URU1QX1NELAorCQkJCSAgICBXTTg5MDBfUkVHX0FERENUTF9URU1QX1NEKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgpAQCAtMTIwNSwyNiArMTE5MCwxNiBAQAogCXdtODkwMF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCiAJLyogTGF0Y2ggdGhlIHZvbHVtZSB1cGRhdGUgYml0cyAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfTElOVk9MLAotCQkgICAgICBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfTElOVk9MKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JJTlZPTCwKLQkJICAgICAgc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX1JJTlZPTCkgfCAweDEwMCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19MT1VUMUNUTCwKLQkJICAgICAgc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0xPVVQxQ1RMKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JPVVQxQ1RMLAotCQkgICAgICBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUk9VVDFDVEwpIHwgMHgxMDApOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfTE9VVDJDVEwsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19MT1VUMkNUTCkgfCAweDEwMCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19ST1VUMkNUTCwKLQkJICAgICAgc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX1JPVVQyQ1RMKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0xEQUNfRFYsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19MREFDX0RWKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JEQUNfRFYsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19SREFDX0RWKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0xBRENfRFYsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19MQURDX0RWKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JBRENfRFYsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19SQURDX0RWKSB8IDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX0xJTlZPTCwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX1JJTlZPTCwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX0xPVVQxQ1RMLCAweDEwMCwgMHgxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfUk9VVDFDVEwsIDB4MTAwLCAweDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19MT1VUMkNUTCwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX1JPVVQyQ1RMLCAweDEwMCwgMHgxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfTERBQ19EViwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX1JEQUNfRFYsIDB4MTAwLCAweDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19MQURDX0RWLCAweDEwMCwgMHgxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfUkFEQ19EViwgMHgxMDAsIDB4MTAwKTsKIAogCS8qIFNldCB0aGUgREFDIGFuZCBtaXhlciBvdXRwdXQgYmlhcyAqLwogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfT1VUQklBU0NUTCwgMHg4MSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYwppbmRleCBiMDg1NTc1Li4yODVlZjg3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKQEAgLTUwLDcgKzUwLDYgQEAKIHN0cnVjdCB3bTg5MDRfcHJpdiB7CiAKIAllbnVtIHdtODkwNF90eXBlIGRldnR5cGU7Ci0Jdm9pZCAqY29udHJvbF9kYXRhOwogCiAJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbV004OTA0X05VTV9TVVBQTElFU107CiAKQEAgLTg2OCw3ICs4NjcsNyBAQAogU09DX0RPVUJMRV9SKCJDYXB0dXJlIFZvbHVtZSIsIFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzAsCiAJICAgICBXTTg5MDRfQU5BTE9HVUVfUklHSFRfSU5QVVRfMCwgMCwgMzEsIDApLAogU09DX0RPVUJMRV9SKCJDYXB0dXJlIFN3aXRjaCIsIFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzAsCi0JICAgICBXTTg5MDRfQU5BTE9HVUVfUklHSFRfSU5QVVRfMCwgNywgMSwgMCksCisJICAgICBXTTg5MDRfQU5BTE9HVUVfUklHSFRfSU5QVVRfMCwgNywgMSwgMSksCiAKIFNPQ19TSU5HTEUoIkhpZ2ggUGFzcyBGaWx0ZXIgU3dpdGNoIiwgV004OTA0X0FEQ19ESUdJVEFMXzAsIDQsIDEsIDApLAogU09DX0VOVU0oIkhpZ2ggUGFzcyBGaWx0ZXIgTW9kZSIsIGhwZl9tb2RlKSwKQEAgLTI1NDAsNyArMjUzOSw2IEBACiAKIAl3bTg5MDQtPmRldnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd204OTA0KTsKLQl3bTg5MDQtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAl3bTg5MDQtPnBkYXRhID0gaTJjLT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKaW5kZXggMDU2ZGFhMC4uZGU5ZWM5YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCkBAIC00Myw5ICs0MywxOSBAQAogc3RydWN0IHdtODk0MF9wcml2IHsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKK3N0YXRpYyBpbnQgd204OTQwX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV004OTQwX1NPRlRSRVNFVDoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCiBzdGF0aWMgdTE2IHdtODk0MF9yZWdfZGVmYXVsdHNbXSA9IHsKIAkweDg5NDAsIC8qIFNvZnQgUmVzZXQgKi8KIAkweDAwMDAsIC8qIFBvd2VyIDEgKi8KQEAgLTQ2MCw2ICs0NzAsMTQgQEAKIAkJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgV004OTQwX1BPV0VSMSwgcHdyX3JlZyB8IDB4MSk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXJldCA9IHNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzeW5jIGNhY2hlOiAlZFxuIiwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisKIAkJLyogZW5zdXJlIGJ1ZmlvZW4gYW5kIGJpYXNlbiAqLwogCQlwd3JfcmVnIHw9ICgxIDw8IDIpIHwgKDEgPDwgMyk7CiAJCS8qIHNldCB2bWlkIHRvIDMwMGsgZm9yIHN0YW5kYnkgKi8KQEAgLTQ3MCw2ICs0ODgsOCBAQAogCQlicmVhazsKIAl9CiAKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MDEsNyArNjIxLDcgQEAKIAogCXN3aXRjaCAoZGl2X2lkKSB7CiAJY2FzZSBXTTg5NDBfQkNMS0RJVjoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NDBfQ0xPQ0spICYgMHhGRkVGMzsKKwkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NDBfQ0xPQ0spICYgMHhGRkUzOwogCQlyZXQgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NDBfQ0xPQ0ssIHJlZyB8IChkaXYgPDwgMikpOwogCQlicmVhazsKIAljYXNlIFdNODk0MF9NQ0xLRElWOgpAQCAtNjYwLDMwICs2ODAsOCBAQAogCiBzdGF0aWMgaW50IHdtODk0MF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCWludCByZXQ7Ci0JdTggZGF0YVszXTsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlCi0JICogQ291bGQgdXNlIGF1dG8gaW5jcmVtZW50ZWQgd3JpdGVzIHRvIHNwZWVkIHRoaXMgdXAKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5NDBfcmVnX2RlZmF1bHRzKTsgaSsrKSB7Ci0JCWRhdGFbMF0gPSBpOwotCQlkYXRhWzFdID0gKGNhY2hlW2ldICYgMHhGRjAwKSA+PiA4OwotCQlkYXRhWzJdID0gY2FjaGVbaV0gJiAweDAwRkY7Ci0JCXJldCA9IGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yX3JldDsKLQkJZWxzZSBpZiAocmV0ICE9IDMpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIGVycm9yX3JldDsKLQkJfQotCX0KLQlyZXQgPSB3bTg5NDBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKLQotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7CisJd204OTQwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd204OTQwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKQEAgLTY5Myw3ICs2OTEsNiBAQAogCWludCByZXQ7CiAJdTE2IHJlZzsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTg5NDAtPmNvbnRyb2xfZGF0YTsKIAlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIHdtODk0MC0+Y29udHJvbF90eXBlKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CkBAIC03NDQsNiArNzQxLDcgQEAKIAkucmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKHdtODk0MF9yZWdfZGVmYXVsdHMpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204OTQwX3JlZ19kZWZhdWx0cywKKwkudm9sYXRpbGVfcmVnaXN0ZXIgPSB3bTg5NDBfdm9sYXRpbGVfcmVnaXN0ZXIsCiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQpAQCAtNzU4LDcgKzc1Niw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd204OTQwKTsKLQl3bTg5NDAtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAl3bTg5NDAtPmNvbnRyb2xfdHlwZSA9IFNORF9TT0NfSTJDOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYwppbmRleCA0MzkzMzk0Li4yZGYyNTNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKQEAgLTcyLDcgKzcyLDYgQEAKIAogc3RydWN0IHdtODk2MF9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJaW50ICgqc2V0X2JpYXNfbGV2ZWwpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosCiAJCQkgICAgICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCk7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmxvdXQxOwpAQCAtNTc1LDYgKzU3NCw4IEBACiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCQkvKiBFbmFibGUgYW50aS1wb3AgZmVhdHVyZXMgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2MF9BUE9QMSwKIAkJCQkgICAgICBXTTg5NjBfUE9CQ1RSTCB8IFdNODk2MF9TT0ZUX1NUIHwKQEAgLTY3Nyw2ICs2NzgsOSBAQAogCQkJCQkgICAgV004OTYwX1ZSRUYgfCBXTTg5NjBfVk1JRF9NQVNLLCAwKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJCXNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9CkBAIC05MDIsMTYgKzkwNiw2IEBACiBzdGF0aWMgaW50IHdtODk2MF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5NjBfcHJpdiAqd204OTYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGk7Ci0JdTggZGF0YVsyXTsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTYwX3JlZyk7IGkrKykgewotCQlkYXRhWzBdID0gKGkgPDwgMSkgfCAoKGNhY2hlW2ldID4+IDgpICYgMHgwMDAxKTsKLQkJZGF0YVsxXSA9IGNhY2hlW2ldICYgMHgwMGZmOwotCQljb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMik7Ci0JfQogCiAJd204OTYwLT5zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCXJldHVybiAwOwpAQCAtOTI1LDcgKzkxOSw2IEBACiAJdTE2IHJlZzsKIAogCXdtODk2MC0+c2V0X2JpYXNfbGV2ZWwgPSB3bTg5NjBfc2V0X2JpYXNfbGV2ZWxfb3V0MzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTYwLT5jb250cm9sX2RhdGE7CiAKIAlpZiAoIXBkYXRhKSB7CiAJCWRldl93YXJuKGNvZGVjLT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKQEAgLTEwMTUsNyArMTAwOCw2IEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTg5NjApOwogCXdtODk2MC0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7Ci0Jd204OTYwLT5jb250cm9sX2RhdGEgPSBpMmM7CiAKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKIAkJCSZzb2NfY29kZWNfZGV2X3dtODk2MCwgJndtODk2MF9kYWksIDEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMKaW5kZXggY2RlZTgxMC4uOTU2OGM4YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jCkBAIC05NzQsNyArOTc0LDkgQEAKIAl9CiAKIAkvKiBUaGlzIGlzbid0IHZvbGF0aWxlIC0gcmVhZGJhY2sgZG9lc24ndCBjb3JyZXNwb25kIHRvIHdyaXRlICovCi0JcmVnID0gY29kZWMtPmh3X3JlYWQoY29kZWMsIFdNODk2MV9SSUdIVF9JTlBVVF9WT0xVTUUpOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAxOworCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYxX1JJR0hUX0lOUFVUX1ZPTFVNRSk7CisJY29kZWMtPmNhY2hlX2J5cGFzcyA9IDA7CiAJZGV2X2luZm8oY29kZWMtPmRldiwgIldNODk2MSBmYW1pbHkgJWQgcmV2aXNpb24gJWNcbiIsCiAJCSAocmVnICYgV004OTYxX0RFVklDRV9JRF9NQVNLKSA+PiBXTTg5NjFfREVWSUNFX0lEX1NISUZULAogCQkgKChyZWcgJiBXTTg5NjFfQ0hJUF9SRVZfTUFTSykgPj4gV004OTYxX0NISVBfUkVWX1NISUZUKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKaW5kZXggZDJjMzE1Zi4uOTFkM2M2ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCkBAIC02Myw2ICs2Myw4IEBACiAJaW50IGZsbF9mcmVmOwogCWludCBmbGxfZm91dDsKIAorCXUxNiBkc3AyX2VuYTsKKwogCXN0cnVjdCBkZWxheWVkX3dvcmsgbWljX3dvcms7CiAJc3RydWN0IHNuZF9zb2NfamFjayAqamFjazsKIApAQCAtODM3LDcgKzgzOSw3IEBACiAJWzQwXSA9IHsgMHgwMEZGLCAweDAxRkYsIDB4MDAwMCB9LCAvKiBSNDAgICAgLSBTUEtPVVRMIHZvbHVtZSAqLwogCVs0MV0gPSB7IDB4MDBGRiwgMHgwMUZGLCAweDAwMDAgfSwgLyogUjQxICAgIC0gU1BLT1VUUiB2b2x1bWUgKi8KIAotCVs0N10gPSB7IDB4MDAwRiwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjQ3ICAgIC0gVGhlcm1hbCBTaHV0ZG93biBTdGF0dXMgKi8KKwlbNDddID0geyAweDAwMEYsIDB4MDAwMCwgMHhGRkZGIH0sIC8qIFI0NyAgICAtIFRoZXJtYWwgU2h1dGRvd24gU3RhdHVzICovCiAJWzQ4XSA9IHsgMHg3RUM3LCAweDdFMDcsIDB4RkZGRiB9LCAvKiBSNDggICAgLSBBZGRpdGlvbmFsIENvbnRyb2wgKDQpICovCiAJWzQ5XSA9IHsgMHgwMEQzLCAweDAwRDcsIDB4RkZGRiB9LCAvKiBSNDkgICAgLSBDbGFzcyBEIENvbnRyb2wgMSAqLwogCVs1MV0gPSB7IDB4MDA0NywgMHgwMDQ3LCAweDAwMDAgfSwgLyogUjUxICAgIC0gQ2xhc3MgRCBDb250cm9sIDIgKi8KQEAgLTk2NSw3ICs5NjcsNyBAQAogCVs1ODRdID0geyAweDAwMkQsIDB4MDAyRCwgMHgwMDAwIH0sIC8qIFI1ODQgICAtIElSUSBEZWJvdW5jZSAqLwogCVs1ODZdID0geyAweEMwMDAsIDB4QzAwMCwgMHgwMDAwIH0sIC8qIFI1ODYgICAtICBNSUNJTlQgU291cmNlIFBvbCAqLwogCVs3NjhdID0geyAweDAwMDEsIDB4MDAwMSwgMHgwMDAwIH0sIC8qIFI3NjggICAtIERTUDIgUG93ZXIgTWFuYWdlbWVudCAqLwotCVsxMDM3XSA9IHsgMHgwMDAwLCAweDAwM0YsIDB4MDAwMCB9LCAvKiBSMTAzNyAgLSBEU1AyX0V4ZWNDb250cm9sICovCisJWzEwMzddID0geyAweDAwMDAsIDB4MDAzRiwgMHhGRkZGIH0sIC8qIFIxMDM3ICAtIERTUDJfRXhlY0NvbnRyb2wgKi8KIAlbNDA5Nl0gPSB7IDB4M0ZGRiwgMHgzRkZGLCAweDAwMDAgfSwgLyogUjQwOTYgIC0gV3JpdGUgU2VxdWVuY2VyIDAgKi8KIAlbNDA5N10gPSB7IDB4MDBGRiwgMHgwMEZGLCAweDAwMDAgfSwgLyogUjQwOTcgIC0gV3JpdGUgU2VxdWVuY2VyIDEgKi8KIAlbNDA5OF0gPSB7IDB4MDcwRiwgMHgwNzBGLCAweDAwMDAgfSwgLyogUjQwOTggIC0gV3JpdGUgU2VxdWVuY2VyIDIgKi8KQEAgLTE5NTksNyArMTk2MSwxMyBAQAogCiBzdGF0aWMgaW50IHdtODk2Ml9yZXNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9TT0ZUV0FSRV9SRVNFVCwgMHg2MjQzKTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX1NPRlRXQVJFX1JFU0VULCAweDYyNDMpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfUExMX1NPRlRXQVJFX1JFU0VULCAwKTsKIH0KIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGlucGdhX3RsdiwgLTIzMjUsIDc1LCAwKTsKQEAgLTE5ODYsNiArMTk5NCwxMjIgQEAKIH07CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKIAorc3RhdGljIGludCB3bTg5NjJfZHNwMl93cml0ZV9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX3NldF9lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1MTYgdmFsKQoreworCXUxNiBhZGNsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NjJfTEVGVF9BRENfVk9MVU1FKTsKKwl1MTYgYWRjciA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX1JJR0hUX0FEQ19WT0xVTUUpOworCXUxNiBkYWMgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMSk7CisKKwkvKiBNdXRlIHRoZSBBRENzIGFuZCBEQUNzICovCisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0xFRlRfQURDX1ZPTFVNRSwgMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX1JJR0hUX0FEQ19WT0xVTUUsIFdNODk2Ml9BRENfVlUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMSwKKwkJCSAgICBXTTg5NjJfREFDX01VVEUsIFdNODk2Ml9EQUNfTVVURSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfU09VTkRTVEFHRV9FTkFCTEVTXzAsIHZhbCk7CisKKwkvKiBSZXN0b3JlIHRoZSBBRENzIGFuZCBEQUNzICovCisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0xFRlRfQURDX1ZPTFVNRSwgYWRjbCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX1JJR0hUX0FEQ19WT0xVTUUsIGFkY3IpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMSwKKwkJCSAgICBXTTg5NjJfREFDX01VVEUsIGRhYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5NjJfZHNwMl9zdGFydChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODk2Ml9wcml2ICp3bTg5NjIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdtODk2Ml9kc3AyX3dyaXRlX2NvbmZpZyhjb2RlYyk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfRFNQMl9FWEVDQ09OVFJPTCwgV004OTYyX0RTUDJfUlVOUik7CisKKwl3bTg5NjJfZHNwMl9zZXRfZW5hYmxlKGNvZGVjLCB3bTg5NjItPmRzcDJfZW5hKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX3N0b3Aoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXdtODk2Ml9kc3AyX3NldF9lbmFibGUoY29kZWMsIDApOworCisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0RTUDJfRVhFQ0NPTlRST0wsIFdNODk2Ml9EU1AyX1NUT1ApOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV004OTYyX0RTUDJfRU5BQkxFKHhuYW1lLCB4c2hpZnQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHdtODk2Ml9kc3AyX2VuYV9pbmZvLCBcCisJLmdldCA9IHdtODk2Ml9kc3AyX2VuYV9nZXQsIC5wdXQgPSB3bTg5NjJfZHNwMl9lbmFfcHV0LCBcCisJLnByaXZhdGVfdmFsdWUgPSB4c2hpZnQgfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX2VuYV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX2VuYV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNoaWZ0ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICEhKHdtODk2Mi0+ZHNwMl9lbmEgJiAxIDw8IHNoaWZ0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX2VuYV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNoaWZ0ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IG9sZCA9IHdtODk2Mi0+ZHNwMl9lbmE7CisJaW50IHJldCA9IDA7CisJaW50IGRzcDJfcnVubmluZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX0RTUDJfUE9XRVJfTUFOQUdFTUVOVCkgJgorCQlXTTg5NjJfRFNQMl9FTkE7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQl3bTg5NjItPmRzcDJfZW5hIHw9IDEgPDwgc2hpZnQ7CisJZWxzZQorCQl3bTg5NjItPmRzcDJfZW5hICY9IH4oMSA8PCBzaGlmdCk7CisKKwlpZiAod204OTYyLT5kc3AyX2VuYSA9PSBvbGQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMTsKKworCWlmIChkc3AyX3J1bm5pbmcpIHsKKwkJaWYgKHdtODk2Mi0+ZHNwMl9lbmEpCisJCQl3bTg5NjJfZHNwMl9zZXRfZW5hYmxlKGNvZGVjLCB3bTg5NjItPmRzcDJfZW5hKTsKKwkJZWxzZQorCQkJd204OTYyX2RzcDJfc3RvcChjb2RlYyk7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKwogLyogVGhlIFZVIGJpdHMgZm9yIHRoZSBoZWFkcGhvbmVzIGFyZSBpbiBhIGRpZmZlcmVudCByZWdpc3RlciB0byB0aGUgbXV0ZQogICogYml0cyBhbmQgb25seSB0YWtlIGVmZmVjdCBvbiB0aGUgUEdBIGlmIGl0IGlzIGFjdHVhbGx5IHBvd2VyZWQuCiAgKi8KQEAgLTIwMjEsNyArMjE0NSw2IEBACiAJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXUxNiAqcmVnX2NhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKIAlpbnQgcmV0OwogCiAJLyogQXBwbHkgdGhlIHVwZGF0ZSAoaWYgYW55KSAqLwpAQCAtMjAzMCwxNiArMjE1MywxOSBAQAogCQlyZXR1cm4gMDsKIAogCS8qIElmIHRoZSBsZWZ0IFBHQSBpcyBlbmFibGVkIGhpdCB0aGF0IFZVIGJpdC4uLiAqLwotCWlmIChyZWdfY2FjaGVbV004OTYyX1BXUl9NR01UXzJdICYgV004OTYyX1NQS09VVExfUEdBX0VOQSkKLQkJcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9TUEtPVVRMX1ZPTFVNRSwKLQkJCQkgICAgIHJlZ19jYWNoZVtXTTg5NjJfU1BLT1VUTF9WT0xVTUVdKTsKKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk2Ml9QV1JfTUdNVF8yKTsKKwlpZiAocmV0ICYgV004OTYyX1NQS09VVExfUEdBX0VOQSkgeworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfU1BLT1VUTF9WT0xVTUUsCisJCQkgICAgICBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk2Ml9TUEtPVVRMX1ZPTFVNRSkpOworCQlyZXR1cm4gMTsKKwl9CiAKIAkvKiAuLi5vdGhlcndpc2UgdGhlIHJpZ2h0LiAgVGhlIFZVIGlzIHN0ZXJlby4gKi8KLQlpZiAocmVnX2NhY2hlW1dNODk2Ml9QV1JfTUdNVF8yXSAmIFdNODk2Ml9TUEtPVVRSX1BHQV9FTkEpCi0JCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfU1BLT1VUUl9WT0xVTUUsCi0JCQkJICAgICByZWdfY2FjaGVbV004OTYyX1NQS09VVFJfVk9MVU1FXSk7CisJaWYgKHJldCAmIFdNODk2Ml9TUEtPVVRSX1BHQV9FTkEpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9TUEtPVVRSX1ZPTFVNRSwKKwkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX1NQS09VVFJfVk9MVU1FKSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmNhcF9ocGZfbW9kZV90ZXh0W10gPSB7CkBAIC0yMDQ5LDYgKzIxNzUsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2FwX2hwZl9tb2RlID0KIAlTT0NfRU5VTV9TSU5HTEUoV004OTYyX0FEQ19EQUNfQ09OVFJPTF8yLCAxMCwgMiwgY2FwX2hwZl9tb2RlX3RleHQpOwogCisKK3N0YXRpYyBjb25zdCBjaGFyICpjYXBfbGhwZl9tb2RlX3RleHRbXSA9IHsKKwkiTFBGIiwgIkhQRiIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2FwX2xocGZfbW9kZSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODk2Ml9MSFBGMSwgMSwgMiwgY2FwX2xocGZfbW9kZV90ZXh0KTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk2Ml9zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEUoIklucHV0IE1peGVyIFN3aXRjaCIsIFdNODk2Ml9JTlBVVF9NSVhFUl9DT05UUk9MXzEsIDMsIDIsIDEsIDEpLAogCkBAIC0yMDc3LDYgKzIyMTEsOCBAQAogU09DX1NJTkdMRSgiQ2FwdHVyZSBIUEYgU3dpdGNoIiwgV004OTYyX0FEQ19EQUNfQ09OVFJPTF8xLCAwLCAxLCAxKSwKIFNPQ19FTlVNKCJDYXB0dXJlIEhQRiBNb2RlIiwgY2FwX2hwZl9tb2RlKSwKIFNPQ19TSU5HTEUoIkNhcHR1cmUgSFBGIEN1dG9mZiIsIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMiwgNywgNywgMCksCitTT0NfU0lOR0xFKCJDYXB0dXJlIExIUEYgU3dpdGNoIiwgV004OTYyX0xIUEYxLCAwLCAxLCAwKSwKK1NPQ19FTlVNKCJDYXB0dXJlIExIUEYgTW9kZSIsIGNhcF9saHBmX21vZGUpLAogCiBTT0NfRE9VQkxFX1JfVExWKCJTaWRldG9uZSBWb2x1bWUiLCBXTTg5NjJfREFDX0RTUF9NSVhJTkdfMSwKIAkJIFdNODk2Ml9EQUNfRFNQX01JWElOR18yLCA0LCAxMiwgMCwgc3RfdGx2KSwKQEAgLTIxMzQsNiArMjI3MCwxMSBAQAogCQkgV004OTYyX0VRTF9CNF9HQUlOX1NISUZULCAzMSwgMCwgZXFfdGx2KSwKIFNPQ19ET1VCTEVfUl9UTFYoIkVRNSBWb2x1bWUiLCBXTTg5NjJfRVEzLCBXTTg5NjJfRVEyMywKIAkJIFdNODk2Ml9FUUxfQjVfR0FJTl9TSElGVCwgMzEsIDAsIGVxX3RsdiksCisKK1dNODk2Ml9EU1AyX0VOQUJMRSgiVlNTIFN3aXRjaCIsIFdNODk2Ml9WU1NfRU5BX1NISUZUKSwKK1dNODk2Ml9EU1AyX0VOQUJMRSgiSFBGMSBTd2l0Y2giLCBXTTg5NjJfSFBGMV9FTkFfU0hJRlQpLAorV004OTYyX0RTUDJfRU5BQkxFKCJIUEYyIFN3aXRjaCIsIFdNODk2Ml9IUEYyX0VOQV9TSElGVCksCitXTTg5NjJfRFNQMl9FTkFCTEUoIkhEIEJhc3MgU3dpdGNoIiwgV004OTYyX0hEQkFTU19FTkFfU0hJRlQpLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk2Ml9zcGtfbW9ub19jb250cm9sc1tdID0gewpAQCAtMjIyNSwxNSArMjM2NiwxNCBAQAogCiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NjJfRkxMX0NPTlRST0xfMSwKIAkJCQkJICAgIFdNODk2Ml9GTExfRU5BLCBXTTg5NjJfRkxMX0VOQSk7Ci0JCQlpZiAod204OTYyLT5pcnEpIHsKLQkJCQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyg1KTsKLQkJCQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ3bTg5NjItPmZsbF9sb2NrLAotCQkJCQkJCQkgICAgICB0aW1lb3V0KTsKIAotCQkJCWlmICh0aW1lb3V0ID09IDApCi0JCQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkJCSJUaW1lZCBvdXQgc3RhcnRpbmcgRkxMXG4iKTsKLQkJCX0KKwkJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDUpOworCQkJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd204OTYyLT5mbGxfbG9jaywKKwkJCQkJCQkgICAgICB0aW1lb3V0KTsKKworCQkJaWYgKHdtODk2Mi0+aXJxICYmIHRpbWVvdXQgPT0gMCkKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSJUaW1lZCBvdXQgc3RhcnRpbmcgRkxMXG4iKTsKIAkJfQogCQlicmVhazsKIApAQCAtMjM2NSw3ICsyNTA1LDYgQEAKIAkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOwotCXUxNiAqcmVnX2NhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKIAlpbnQgcmVnOwogCiAJc3dpdGNoICh3LT5zaGlmdCkgewpAQCAtMjM4OCwxMyArMjUyNywzOCBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgcmVnLCByZWdfY2FjaGVbcmVnXSk7CisJCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcsIHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKSk7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KIAorc3RhdGljIGludCBkc3AyX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWlmICh3bTg5NjItPmRzcDJfZW5hKQorCQkJd204OTYyX2RzcDJfc3RhcnQoY29kZWMpOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmICh3bTg5NjItPmRzcDJfZW5hKQorCQkJd204OTYyX2RzcDJfc3RvcChjb2RlYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqc3RfdGV4dFtdID0geyAiTm9uZSIsICJSaWdodCIsICJMZWZ0IiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0cl9lbnVtID0KQEAgLTI1MDksNyArMjY3Myw3IEBACiBTTkRfU09DX0RBUE1fSU5QVVQoIkJlZXAiKSwKIFNORF9TT0NfREFQTV9JTlBVVCgiRE1JQ0RBVCIpLAogCi1TTkRfU09DX0RBUE1fTUlDQklBUygiTUlDQklBUyIsIFdNODk2Ml9QV1JfTUdNVF8xLCAxLCAwKSwKK1NORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMiLCBXTTg5NjJfUFdSX01HTVRfMSwgMSwgMCwgTlVMTCwgMCksCiAKIFNORF9TT0NfREFQTV9TVVBQTFkoIkNsYXNzIEciLCBXTTg5NjJfQ0hBUkdFX1BVTVBfQiwgMCwgMSwgTlVMTCwgMCksCiBTTkRfU09DX0RBUE1fU1VQUExZKCJTWVNDTEsiLCBXTTg5NjJfQ0xPQ0tJTkcyLCA1LCAwLCBzeXNjbGtfZXZlbnQsCkBAIC0yNTE3LDYgKzI2ODEsOSBAQAogU05EX1NPQ19EQVBNX1NVUFBMWSgiQ2hhcmdlIFB1bXAiLCBXTTg5NjJfQ0hBUkdFX1BVTVBfMSwgMCwgMCwgY3BfZXZlbnQsCiAJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAogU05EX1NPQ19EQVBNX1NVUFBMWSgiVE9DTEsiLCBXTTg5NjJfQURESVRJT05BTF9DT05UUk9MXzEsIDAsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJEU1AyIiwgMSwgV004OTYyX0RTUDJfUE9XRVJfTUFOQUdFTUVOVCwKKwkJICAgICAgV004OTYyX0RTUDJfRU5BX1NISUZULCAwLCBkc3AyX2V2ZW50LAorCQkgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCiAKIFNORF9TT0NfREFQTV9NSVhFUigiSU5QR0FMIiwgV004OTYyX0xFRlRfSU5QVVRfUEdBX0NPTlRST0wsIDQsIDAsCiAJCSAgIGlucGdhbCwgQVJSQVlfU0laRShpbnBnYWwpKSwKQEAgLTI1MjcsNyArMjY5NCw3IEBACiBTTkRfU09DX0RBUE1fTUlYRVIoIk1JWElOUiIsIFdNODk2Ml9QV1JfTUdNVF8xLCA0LCAwLAogCQkgICBtaXhpbnIsIEFSUkFZX1NJWkUobWl4aW5yKSksCiAKLVNORF9TT0NfREFQTV9BSUZfSU4oIkRNSUMiLCBOVUxMLCAwLCBXTTg5NjJfUFdSX01HTVRfMSwgMTAsIDApLAorU05EX1NPQ19EQVBNX0FJRl9JTigiRE1JQ19FTkEiLCBOVUxMLCAwLCBXTTg5NjJfUFdSX01HTVRfMSwgMTAsIDApLAogCiBTTkRfU09DX0RBUE1fQURDKCJBRENMIiwgIkNhcHR1cmUiLCBXTTg5NjJfUFdSX01HTVRfMSwgMywgMCksCiBTTkRfU09DX0RBUE1fQURDKCJBRENSIiwgIkNhcHR1cmUiLCBXTTg5NjJfUFdSX01HTVRfMSwgMiwgMCksCkBAIC0yNjA2LDE3ICsyNzczLDE5IEBACiAKIAl7ICJNSUNCSUFTIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAotCXsgIkRNSUMiLCBOVUxMLCAiRE1JQ0RBVCIgfSwKKwl7ICJETUlDX0VOQSIsIE5VTEwsICJETUlDREFUIiB9LAogCiAJeyAiQURDTCIsIE5VTEwsICJTWVNDTEsiIH0sCiAJeyAiQURDTCIsIE5VTEwsICJUT0NMSyIgfSwKIAl7ICJBRENMIiwgTlVMTCwgIk1JWElOTCIgfSwKLQl7ICJBRENMIiwgTlVMTCwgIkRNSUMiIH0sCisJeyAiQURDTCIsIE5VTEwsICJETUlDX0VOQSIgfSwKKwl7ICJBRENMIiwgTlVMTCwgIkRTUDIiIH0sCiAKIAl7ICJBRENSIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAl7ICJBRENSIiwgTlVMTCwgIlRPQ0xLIiB9LAogCXsgIkFEQ1IiLCBOVUxMLCAiTUlYSU5SIiB9LAotCXsgIkFEQ1IiLCBOVUxMLCAiRE1JQyIgfSwKKwl7ICJBRENSIiwgTlVMTCwgIkRNSUNfRU5BIiB9LAorCXsgIkFEQ1IiLCBOVUxMLCAiRFNQMiIgfSwKIAogCXsgIlNUTCIsICJMZWZ0IiwgIkFEQ0wiIH0sCiAJeyAiU1RMIiwgIlJpZ2h0IiwgIkFEQ1IiIH0sCkBAIC0yNjI4LDExICsyNzk3LDEzIEBACiAJeyAiREFDTCIsIE5VTEwsICJUT0NMSyIgfSwKIAl7ICJEQUNMIiwgTlVMTCwgIkJlZXAiIH0sCiAJeyAiREFDTCIsIE5VTEwsICJTVEwiIH0sCisJeyAiREFDTCIsIE5VTEwsICJEU1AyIiB9LAogCiAJeyAiREFDUiIsIE5VTEwsICJTWVNDTEsiIH0sCiAJeyAiREFDUiIsIE5VTEwsICJUT0NMSyIgfSwKIAl7ICJEQUNSIiwgTlVMTCwgIkJlZXAiIH0sCiAJeyAiREFDUiIsIE5VTEwsICJTVFIiIH0sCisJeyAiREFDUiIsIE5VTEwsICJEU1AyIiB9LAogCiAJeyAiSFBNSVhMIiwgIklONEwgU3dpdGNoIiwgIklONEwiIH0sCiAJeyAiSFBNSVhMIiwgIklONFIgU3dpdGNoIiwgIklONFIiIH0sCkBAIC0zMDU4LDkgKzMyMjksOSBAQAogCWludCBhaWYwID0gMDsKIAogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKLQljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgotCQlhaWYwIHw9IFdNODk2Ml9MUkNMS19JTlY7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJYWlmMCB8PSBXTTg5NjJfTFJDTEtfSU5WIHwgMzsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgogCQlhaWYwIHw9IDM7CiAKIAkJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgewpAQCAtMzQwMywxMiArMzU3NCwxNiBAQAogCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IG1hc2s7CiAJaW50IGFjdGl2ZTsKKwlpbnQgcmVnOwogCiAJbWFzayA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX0lOVEVSUlVQVF9TVEFUVVNfMl9NQVNLKTsKIAogCWFjdGl2ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX0lOVEVSUlVQVF9TVEFUVVNfMik7CiAJYWN0aXZlICY9IH5tYXNrOwogCisJaWYgKCFhY3RpdmUpCisJCXJldHVybiBJUlFfTk9ORTsKKwogCS8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHRzICovCiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0lOVEVSUlVQVF9TVEFUVVNfMiwgYWN0aXZlKTsKIApAQCAtMzQyMCw5ICszNTk1LDIxIEBACiAJaWYgKGFjdGl2ZSAmIFdNODk2Ml9GSUZPU19FUlJfRUlOVCkKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRklGTyBlcnJvclxuIik7CiAKLQlpZiAoYWN0aXZlICYgV004OTYyX1RFTVBfU0hVVF9FSU5UKQorCWlmIChhY3RpdmUgJiBXTTg5NjJfVEVNUF9TSFVUX0VJTlQpIHsKIAkJZGV2X2NyaXQoY29kZWMtPmRldiwgIlRoZXJtYWwgc2h1dGRvd25cbiIpOwogCisJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX1RIRVJNQUxfU0hVVERPV05fU1RBVFVTKTsKKworCQlpZiAocmVnICYgV004OTYyX1RFTVBfRVJSX0hQKQorCQkJZGV2X2NyaXQoY29kZWMtPmRldiwgIkhlYWRwaG9uZSB0aGVybWFsIGVycm9yXG4iKTsKKwkJaWYgKHJlZyAmIFdNODk2Ml9URU1QX1dBUk5fSFApCisJCQlkZXZfY3JpdChjb2RlYy0+ZGV2LCAiSGVhZHBob25lIHRoZXJtYWwgd2FybmluZ1xuIik7CisJCWlmIChyZWcgJiBXTTg5NjJfVEVNUF9FUlJfU1BLKQorCQkJZGV2X2NyaXQoY29kZWMtPmRldiwgIlNwZWFrZXIgdGhlcm1hbCBlcnJvclxuIik7CisJCWlmIChyZWcgJiBXTTg5NjJfVEVNUF9XQVJOX1NQSykKKwkJCWRldl9jcml0KGNvZGVjLT5kZXYsICJTcGVha2VyIHRoZXJtYWwgd2FybmluZ1xuIik7CisJfQorCiAJaWYgKGFjdGl2ZSAmIChXTTg5NjJfTUlDU0NEX0VJTlQgfCBXTTg5NjJfTUlDRF9FSU5UKSkgewogCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWNyb3Bob25lIGV2ZW50IGRldGVjdGVkXG4iKTsKIApAQCAtMzg0Nyw2ICs0MDM0LDExIEBACiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTYyX0NMT0NLSU5HMiwKIAkJCSAgICBXTTg5NjJfQ0xLUkVHX09WRCwgV004OTYyX0NMS1JFR19PVkQpOwogCisJLyogRW5zdXJlIHRoYXQgdGhlIG9zY2lsbGF0b3IgYW5kIFBMTHMgYXJlIGRpc2FibGVkICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTYyX1BMTDIsCisJCQkgICAgV004OTYyX09TQ19FTkEgfCBXTTg5NjJfUExMMl9FTkEgfCBXTTg5NjJfUExMM19FTkEsCisJCQkgICAgMCk7CisKIAlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204OTYyLT5zdXBwbGllcyksIHdtODk2Mi0+c3VwcGxpZXMpOwogCiAJaWYgKHBkYXRhKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYwppbmRleCA1NzJiYjgwLi5iNDQ0YjI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKQEAgLTU0Niw2ICs1NDYsOSBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpCisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCS8qIG11dGUgZGFjIGFuZCBzZXQgdm1pZCB0byA1MDBrLCBlbmFibGUgVlJFRiAqLwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfUFdSMSwgcHdyX3JlZyB8IDB4MDE0MCk7CiAJCWJyZWFrOwpAQCAtNjA1LDIwICs2MDgsOCBAQAogCiBzdGF0aWMgaW50IHdtODk3MV9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCXU4IGRhdGFbMl07Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CiAJdTE2IHJlZzsKIAotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTcxX3JlZyk7IGkrKykgewotCQlpZiAoaSArIDEgPT0gV004OTcxX1JFU0VUKQotCQkJY29udGludWU7Ci0JCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkgJiAweDAwMDEpOwotCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCWNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKTsKLQl9Ci0KIAl3bTg5NzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAogCS8qIGNoYXJnZSB3bTg5NzEgY2FwcyAqLwpAQCAtNjYwLDI1ICs2NTEsMTQgQEAKIAkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CiAKIAkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfTERBQyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX0xEQUMsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfUkRBQyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX1JEQUMsIHJlZyB8IDB4MDEwMCk7Ci0KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk3MV9MT1VUMVYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk3MV9MT1VUMVYsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfUk9VVDFWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfUk9VVDFWLCByZWcgfCAweDAxMDApOwotCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfTE9VVDJWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfTE9VVDJWLCByZWcgfCAweDAxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTcxX1JPVVQyVik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX1JPVVQyViwgcmVnIHwgMHgwMTAwKTsKLQotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTcxX0xJTlZPTCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX0xJTlZPTCwgcmVnIHwgMHgwMTAwKTsKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk3MV9SSU5WT0wpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk3MV9SSU5WT0wsIHJlZyB8IDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTcxX0xEQUMsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NzFfUkRBQywgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk3MV9MT1VUMVYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NzFfUk9VVDFWLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTcxX0xPVVQyViwgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk3MV9ST1VUMlYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NzFfTElOVk9MLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTcxX1JJTlZPTCwgMHgwMTAwLCAweDAxMDApOwogCiAJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODk3MV9zbmRfY29udHJvbHMsCiAJCQkJQVJSQVlfU0laRSh3bTg5NzFfc25kX2NvbnRyb2xzKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYwppbmRleCBjYTY0NmE4Li45MzUyZjFlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDYtMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgogICoKLSAqIEF1dGhvcjogTGlhbSBHaXJkd29vZCA8bGludXhAd29sZnNvbm1pY3JvLmNvbT4KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZCA8TGlhbS5HaXJkd29vZEB3b2xmc29ubWljcm8uY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNTMwLDYgKzUzMCw4IEBACiAJCXBvd2VyMSB8PSBXTTg5NzRfUE9XRVIxX0JJQVNFTiB8IFdNODk3NF9QT1dFUjFfQlVGSU9FTjsKIAogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCQkvKiBJbml0aWFsIGNhcCBjaGFyZ2UgYXQgVk1JRCA1ayAqLwogCQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTc0X1BPV0VSMSwgcG93ZXIxIHwgMHgzKTsKIAkJCW1kZWxheSgxMDApOwpAQCAtNTg5LDE4ICs1OTEsNyBAQAogCiBzdGF0aWMgaW50IHdtODk3NF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCXU4IGRhdGFbMl07Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0KLQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk3NF9yZWcpOyBpKyspIHsKLQkJZGF0YVswXSA9IChpIDw8IDEpIHwgKChjYWNoZVtpXSA+PiA4KSAmIDB4MDAwMSk7Ci0JCWRhdGFbMV0gPSBjYWNoZVtpXSAmIDB4MDBmZjsKLQkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOwotCX0KIAl3bTg5NzRfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzguYwppbmRleCA4NWUzZTYzLi40MWNhNGQ5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMKQEAgLTUyLDcgKzUyLDYgQEAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IHdtODk3OF9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJdW5zaWduZWQgaW50IGZfcGxsb3V0OwogCXVuc2lnbmVkIGludCBmX21jbGs7CiAJdW5zaWduZWQgaW50IGZfMjU2ZnM7CkBAIC05NTUsNyArOTU0LDYgQEAKIAkgKiBkZWZhdWx0IGhhcmR3YXJlIHNldHRpbmcKIAkgKi8KIAl3bTg5NzgtPnN5c2NsayA9IFdNODk3OF9QTEw7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk3OC0+Y29udHJvbF9kYXRhOwogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX0kyQyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwpAQCAtMTAxNiw3ICsxMDE0LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTg5NzgpOwotCXdtODk3OC0+Y29udHJvbF9kYXRhID0gaTJjOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCiAJCQkmc29jX2NvZGVjX2Rldl93bTg5NzgsICZ3bTg5NzhfZGFpLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jCmluZGV4IDE3ZjA0ZWMuLjkzZWUyODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYwpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODNfU09GVFdBUkVfUkVTRVQsIDB4ODk4Myk7CisJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgV004OTgzX1NPRlRXQVJFX1JFU0VULCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXQ6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg4LmMKaW5kZXggZDcxNzBmMS4uMmU5ZWJhNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jCkBAIC01NSw3ICs1NSw2IEBACiAJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpzeXNjbGtfY29uc3RyYWludHM7CiB9OwogCi0KICNkZWZpbmUgd204OTg4X3Jlc2V0KGMpCXNuZF9zb2Nfd3JpdGUoYywgV004OTg4X1JFU0VULCAwKQogCiAvKgpAQCAtNjc2LDYgKzY3NSw4IEBACiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCQkvKiBWUkVGLCBWTUlEPTJ4NWsgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4OF9QV1IxLCBwd3JfcmVnIHwgMHgxYzEpOwogCkBAIC03MzYsMjEgKzczNyw3IEBACiAKIHN0YXRpYyBpbnQgd204OTg4X3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IGk7Ci0JdTggZGF0YVsyXTsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChpID0gMDsgaSA8IFdNODk4OF9OVU1fUkVHOyBpKyspIHsKLQkJaWYgKGkgPT0gV004OTg4X1JFU0VUKQotCQkJY29udGludWU7Ci0JCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkgJiAweDAwMDEpOwotCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCWNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKTsKLQl9Ci0KIAl3bTg5ODhfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKLQogCXJldHVybiAwOwogfQogCkBAIC03NTksNyArNzQ2LDYgQEAKIAlzdHJ1Y3Qgd204OTg4X3ByaXYgKndtODk4OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0ID0gMDsKLQl1MTYgcmVnOwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIHdtODk4OC0+Y29udHJvbF90eXBlKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNzc0LDE2ICs3NjAsMTEgQEAKIAl9CiAKIAkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICh3ZSBhbHdheXMgdXBkYXRlIGxlZnQgdGhlbiByaWdodCkgKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk4OF9SQURDKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODhfUkFEQywgcmVnIHwgMHgxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTg4X1JEQUMpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4OF9SREFDLCByZWcgfCAweDAxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTg4X1JPVVQxVik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTg4X1JPVVQxViwgcmVnIHwgMHgwMTAwKTsKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk4OF9ST1VUMlYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4OF9ST1VUMlYsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5ODhfUklOVk9MKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODhfUklOVk9MLCByZWcgfCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4OF9SQURDLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTg4X1JEQUMsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODhfUk9VVDFWLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTg4X1JPVVQyViwgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4OF9SSU5WT0wsIDB4MDEwMCwgMHgwMTAwKTsKIAogCXdtODk4OF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYwppbmRleCAxMDBhZWVlLi5kMjlhOTYyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKQEAgLTM2LDEwICszNiwxNyBAQAogCXVuc2lnbmVkIGludCBwY21jbGs7CiB9OwogCi0vKgotICogd204OTkwIHJlZ2lzdGVyIGNhY2hlLiAgTm90ZSB0aGF0IHJlZ2lzdGVyIDAgaXMgbm90IGluY2x1ZGVkIGluIHRoZQotICogY2FjaGUuCi0gKi8KK3N0YXRpYyBpbnQgd204OTkwX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV004OTkwX1JFU0VUOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKIHN0YXRpYyBjb25zdCB1MTYgd204OTkwX3JlZ1tdID0gewogCTB4ODk5MCwgICAgIC8qIFIwICAtIFJlc2V0ICovCiAJMHgwMDAwLCAgICAgLyogUjEgIC0gUG93ZXIgTWFuYWdlbWVudCAoMSkgKi8KQEAgLTM5NCw3ICs0MDEsNyBAQAogCQkoMSA8PCBXTTg5OTBfQUlOUk1VWF9QV1JfQklUKSkpIHsKIAkJcmVnIHw9IFdNODk5MF9BSU5SX0VOQTsKIAl9IGVsc2UgewotCQlyZWcgJj0gfldNODk5MF9BSU5MX0VOQTsKKwkJcmVnICY9IH5XTTg5OTBfQUlOUl9FTkE7CiAJfQogCXNuZF9zb2Nfd3JpdGUody0+Y29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIsIHJlZyk7CiAKQEAgLTk3NCw3ICs5ODEsNiBAQAogc3RhdGljIGludCB3bTg5OTBfc2V0X2RhaV9wbGwoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksIGludCBwbGxfaWQsCiAJCWludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCiB7Ci0JdTE2IHJlZzsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOwogCXN0cnVjdCBfcGxsX2RpdiBwbGxfZGl2OwogCkBAIC05ODIsMTMgKzk4OCwxMiBAQAogCQlwbGxfZmFjdG9ycygmcGxsX2RpdiwgZnJlcV9vdXQgKiA0LCBmcmVxX2luKTsKIAogCQkvKiBUdXJuIG9uIFBMTCAqLwotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIpOwotCQlyZWcgfD0gV004OTkwX1BMTF9FTkE7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIsIHJlZyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIsCisJCQkJICAgIFdNODk5MF9QTExfRU5BLCBXTTg5OTBfUExMX0VOQSk7CiAKIAkJLyogc3lzY2xrIGNvbWVzIGZyb20gUExMICovCi0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkwX0NMT0NLSU5HXzIpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMiwgcmVnIHwgV004OTkwX1NZU0NMS19TUkMpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMiwKKwkJCQkgICAgV004OTkwX1NZU0NMS19TUkMsIFdNODk5MF9TWVNDTEtfU1JDKTsKIAogCQkvKiBzZXQgdXAgTiAsIGZyYWN0aW9uYWwgbW9kZSBhbmQgcHJlLWRpdmlzb3IgaWYgbmVjZXNzYXJ5ICovCiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QTEwxLCBwbGxfZGl2Lm4gfCBXTTg5OTBfU0RNIHwKQEAgLTk5NiwxMCArMTAwMSw5IEBACiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QTEwyLCAodTgpKHBsbF9kaXYuaz4+OCkpOwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfUExMMywgKHU4KShwbGxfZGl2LmsgJiAweEZGKSk7CiAJfSBlbHNlIHsKLQkJLyogVHVybiBvbiBQTEwgKi8KLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8yKTsKLQkJcmVnICY9IH5XTTg5OTBfUExMX0VOQTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX1BPV0VSX01BTkFHRU1FTlRfMiwgcmVnKTsKKwkJLyogVHVybiBvZmYgUExMICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIsCisJCQkJICAgIFdNODk5MF9QTExfRU5BLCAwKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDc3LDI4ICsxMDgxLDIzIEBACiAJCWludCBkaXZfaWQsIGludCBkaXYpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKLQl1MTYgcmVnOwogCiAJc3dpdGNoIChkaXZfaWQpIHsKIAljYXNlIFdNODk5MF9NQ0xLX0RJVjoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMikgJgotCQkJfldNODk5MF9NQ0xLX0RJVl9NQVNLOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMiwgcmVnIHwgZGl2KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkwX0NMT0NLSU5HXzIsCisJCQkJICAgIFdNODk5MF9NQ0xLX0RJVl9NQVNLLCBkaXYpOwogCQlicmVhazsKIAljYXNlIFdNODk5MF9EQUNDTEtfRElWOgotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9DTE9DS0lOR18yKSAmCi0JCQl+V004OTkwX0RBQ19DTEtESVZfTUFTSzsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX0NMT0NLSU5HXzIsIHJlZyB8IGRpdik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9DTE9DS0lOR18yLAorCQkJCSAgICBXTTg5OTBfREFDX0NMS0RJVl9NQVNLLCBkaXYpOwogCQlicmVhazsKIAljYXNlIFdNODk5MF9BRENDTEtfRElWOgotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9DTE9DS0lOR18yKSAmCi0JCQl+V004OTkwX0FEQ19DTEtESVZfTUFTSzsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX0NMT0NLSU5HXzIsIHJlZyB8IGRpdik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9DTE9DS0lOR18yLAorCQkJCSAgICBXTTg5OTBfQURDX0NMS0RJVl9NQVNLLCBkaXYpOwogCQlicmVhazsKIAljYXNlIFdNODk5MF9CQ0xLX0RJVjoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMSkgJgotCQkJfldNODk5MF9CQ0xLX0RJVl9NQVNLOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMSwgcmVnIHwgZGl2KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkwX0NMT0NLSU5HXzEsCisJCQkJICAgIFdNODk5MF9CQ0xLX0RJVl9NQVNLLCBkaXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExNTYsNyArMTE1NSw3IEBACiBzdGF0aWMgaW50IHdtODk5MF9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCiB7Ci0JdTE2IHZhbDsKKwlpbnQgcmV0OwogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgpAQCAtMTE2NCwxMyArMTE2MywxOCBAQAogCiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKIAkJLyogVk1JRD0yKjUwayAqLwotCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzEpICYKLQkJCX5XTTg5OTBfVk1JRF9NT0RFX01BU0s7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzEsIHZhbCB8IDB4Mik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkJICAgIFdNODk5MF9WTUlEX01PREVfTUFTSywgMHgyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlyZXQgPSBzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc3luYyBjYWNoZTogJWRcbiIsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwogCQkJLyogRW5hYmxlIGFsbCBvdXRwdXQgZGlzY2hhcmdlIGJpdHMgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9BTlRJUE9QMSwgV004OTkwX0RJU19MTElORSB8CiAJCQkJV004OTkwX0RJU19STElORSB8IFdNODk5MF9ESVNfT1VUMyB8CkBAIC0xMjI1LDkgKzEyMjksOCBAQAogCQl9CiAKIAkJLyogVk1JRD0yKjI1MGsgKi8KLQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8xKSAmCi0JCQl+V004OTkwX1ZNSURfTU9ERV9NQVNLOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8xLCB2YWwgfCAweDQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJCSAgICBXTTg5OTBfVk1JRF9NT0RFX01BU0ssIDB4NCk7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgpAQCAtMTI0MSw4ICsxMjQ0LDggQEAKIAkJCVdNODk5MF9CVUZJT0VOKTsKIAogCQkvKiBtdXRlIERBQyAqLwotCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9EQUNfQ1RSTCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9EQUNfQ1RSTCwgdmFsIHwgV004OTkwX0RBQ19NVVRFKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkwX0RBQ19DVFJMLAorCQkJCSAgICBXTTg5OTBfREFDX01VVEUsIFdNODk5MF9EQUNfTVVURSk7CiAKIAkJLyogRW5hYmxlIGFueSBkaXNhYmxlZCBvdXRwdXRzICovCiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzEsIDB4MWYwMyk7CkBAIC0xMzE5LDE5ICsxMzIyLDYgQEAKIAogc3RhdGljIGludCB3bTg5OTBfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgaTsKLQl1OCBkYXRhWzJdOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCi0JLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5OTBfcmVnKTsgaSsrKSB7Ci0JCWlmIChpICsgMSA9PSBXTTg5OTBfUkVTRVQpCi0JCQljb250aW51ZTsKLQkJZGF0YVswXSA9ICgoaSArIDEpIDw8IDEpIHwgKChjYWNoZVtpXSA+PiA4KSAmIDB4MDAwMSk7Ci0JCWRhdGFbMV0gPSBjYWNoZVtpXSAmIDB4MDBmZjsKLQkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOwotCX0KLQogCXdtODk5MF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCXJldHVybiAwOwogfQpAQCAtMTM0Myw3ICsxMzMzLDYgQEAKIHN0YXRpYyBpbnQgd204OTkwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlpbnQgcmV0OwotCXUxNiByZWc7CiAKIAlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfSTJDKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMTM1NiwxNSArMTM0NSwxNCBAQAogCS8qIGNoYXJnZSBvdXRwdXQgY2FwcyAqLwogCXdtODk5MF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfQVVESU9fSU5URVJGQUNFXzQpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9BVURJT19JTlRFUkZBQ0VfNCwgcmVnIHwgV004OTkwX0FMUkNHUElPMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkwX0FVRElPX0lOVEVSRkFDRV80LAorCQkJICAgIFdNODk5MF9BTFJDR1BJTzEsIFdNODk5MF9BTFJDR1BJTzEpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfR1BJTzFfR1BJTzIpICYKLQkJfldNODk5MF9HUElPMV9TRUxfTUFTSzsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfR1BJTzFfR1BJTzIsIHJlZyB8IDEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9HUElPMV9HUElPMiwKKwkJCSAgICBXTTg5OTBfR1BJTzFfU0VMX01BU0ssIDEpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8yKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8yLCByZWcgfCBXTTg5OTBfT1BDTEtfRU5BKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8yLAorCQkJICAgIFdNODk5MF9PUENMS19FTkEsIFdNODk5MF9PUENMS19FTkEpOwogCiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX0xFRlRfT1VUUFVUX1ZPTFVNRSwgMHg1MCB8ICgxPDw4KSk7CiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX1JJR0hUX09VVFBVVF9WT0xVTUUsIDB4NTAgfCAoMTw8OCkpOwpAQCAtMTM5Miw2ICsxMzgwLDcgQEAKIAkucmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKHdtODk5MF9yZWcpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204OTkwX3JlZywKKwkudm9sYXRpbGVfcmVnaXN0ZXIgPSB3bTg5OTBfdm9sYXRpbGVfcmVnaXN0ZXIsCiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKaW5kZXggNmFmMjNkMC4uYzlhYjNiYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAyMDA3LTIwMTAgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KICAqIEF1dGhvcjogR3JhZW1lIEdyZWdvcnkKLSAqICAgICAgICAgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogICAgICAgICBHcmFlbWUuR3JlZ29yeUB3b2xmc29ubWljcm8uY29tCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtMzkzLDcgKzM5Myw3IEBACiAJCQkgKDEgPDwgV004OTkxX0FJTlJNVVhfUFdSX0JJVCkpKQogCQlyZWcgfD0gV004OTkxX0FJTlJfRU5BOwogCWVsc2UKLQkJcmVnICY9IH5XTTg5OTFfQUlOTF9FTkE7CisJCXJlZyAmPSB+V004OTkxX0FJTlJfRU5BOwogCiAJc25kX3NvY193cml0ZSh3LT5jb2RlYywgV004OTkxX1BPV0VSX01BTkFHRU1FTlRfMiwgcmVnKTsKIAlyZXR1cm4gMDsKQEAgLTEyNjQsNyArMTI2NCw2IEBACiB7CiAJc3RydWN0IHdtODk5MV9wcml2ICp3bTg5OTE7CiAJaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgcmVnOwogCiAJd204OTkxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKQEAgLTEyODIsMTkgKzEyODEsMTggQEAKIAogCXdtODk5MV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTFfQVVESU9fSU5URVJGQUNFXzQpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MV9BVURJT19JTlRFUkZBQ0VfNCwgcmVnIHwgV004OTkxX0FMUkNHUElPMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkxX0FVRElPX0lOVEVSRkFDRV80LAorCQkJICAgIFdNODk5MV9BTFJDR1BJTzEsIFdNODk5MV9BTFJDR1BJTzEpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTFfR1BJTzFfR1BJTzIpICYKLQkgICAgICB+V004OTkxX0dQSU8xX1NFTF9NQVNLOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MV9HUElPMV9HUElPMiwgcmVnIHwgMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkxX0dQSU8xX0dQSU8yLAorCQkJICAgIFdNODk5MV9HUElPMV9TRUxfTUFTSywgMSk7CiAKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MV9QT1dFUl9NQU5BR0VNRU5UXzEpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MV9QT1dFUl9NQU5BR0VNRU5UXzEsIHJlZyB8IFdNODk5MV9WUkVGX0VOQXwKLQkJICAgICAgV004OTkxX1ZNSURfTU9ERV9NQVNLKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTFfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJICAgIFdNODk5MV9WUkVGX0VOQSB8IFdNODk5MV9WTUlEX01PREVfTUFTSywKKwkJCSAgICBXTTg5OTFfVlJFRl9FTkEgfCBXTTg5OTFfVk1JRF9NT0RFX01BU0spOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTFfUE9XRVJfTUFOQUdFTUVOVF8yKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTFfUE9XRVJfTUFOQUdFTUVOVF8yLCByZWcgfCBXTTg5OTFfT1BDTEtfRU5BKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTFfUE9XRVJfTUFOQUdFTUVOVF8yLAorCQkJICAgIFdNODk5MV9PUENMS19FTkEsIFdNODk5MV9PUENMS19FTkEpOwogCiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTkxX0RBQ19DVFJMLCAwKTsKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTFfTEVGVF9PVVRQVVRfVk9MVU1FLCAweDUwIHwgKDE8PDgpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCmluZGV4IDZlODViODguLmVlYzhlMTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwpAQCAtODQ3LDYgKzg0Nyw3IEBACiAJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCiBTTkRfU09DX0RBUE1fU1VQUExZKCJUT0NMSyIsIFdNODk5M19DTE9DS0lOR18xLCAxNCwgMCwgTlVMTCwgMCksCiBTTkRfU09DX0RBUE1fU1VQUExZKCJDTEtfRFNQIiwgV004OTkzX0NMT0NLSU5HXzMsIDAsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiVk1JRCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCiAKIFNORF9TT0NfREFQTV9BREMoIkFEQ0wiLCBOVUxMLCBXTTg5OTNfUE9XRVJfTUFOQUdFTUVOVF8yLCAxLCAwKSwKIFNORF9TT0NfREFQTV9BREMoIkFEQ1IiLCBOVUxMLCBXTTg5OTNfUE9XRVJfTUFOQUdFTUVOVF8yLCAwLCAwKSwKQEAgLTg4MCw2ICs4ODEsOSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcm91dGVzW10gPSB7CisJeyAiTUlDQklBUzEiLCBOVUxMLCAiVk1JRCIgfSwKKwl7ICJNSUNCSUFTMiIsIE5VTEwsICJWTUlEIiB9LAorCiAJeyAiQURDTCIsIE5VTEwsICJDTEtfU1lTIiB9LAogCXsgIkFEQ0wiLCBOVUxMLCAiQ0xLX0RTUCIgfSwKIAl7ICJBRENSIiwgTlVMTCwgIkNMS19TWVMiIH0sCkBAIC0xNDMzLDcgKzE0MzcsOCBAQAogCWludCByZXQsIGksIHZhbDsKIAogCXdtODk5My0+aHVic19kYXRhLmhwX3N0YXJ0dXBfbW9kZSA9IDE7Ci0Jd204OTkzLT5odWJzX2RhdGEuZGNzX2NvZGVzID0gLTI7CisJd204OTkzLT5odWJzX2RhdGEuZGNzX2NvZGVzX2wgPSAtMjsKKwl3bTg5OTMtPmh1YnNfZGF0YS5kY3NfY29kZXNfciA9IC0yOwogCXdtODk5My0+aHVic19kYXRhLnNlcmllc19zdGFydHVwID0gMTsKIAogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19JMkMpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQtdGFibGVzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC10YWJsZXMuYwppbmRleCBhODdhZGJkLi5kZjVhOGI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC10YWJsZXMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC10YWJsZXMuYwpAQCAtMTA3Myw4ICsxMDczLDggQEAKIAl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDY5ICovCiAJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3MCAqLwogCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDcyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3MyAqLworCXsgMHgwMDZGLCAweDAwNkYgfSwgLyogUjEwNzIgIC0gQUlGMSBEQUMxIE5vaXNlIEdhdGUgKi8KKwl7IDB4MDA2RiwgMHgwMDZGIH0sIC8qIFIxMDczICAtIEFJRjEgREFDMiBOb2lzZSBHYXRlICovCiAJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3NCAqLwogCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzUgKi8KIAl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDc2ICovCkBAIC0xMzI5LDcgKzEzMjksNyBAQAogCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjUgKi8KIAl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzI2ICovCiAJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjggKi8KKwl7IDB4MDA2RiwgMHgwMDZGIH0sIC8qIFIxMzI4ICAtIEFJRjIgREFDIE5vaXNlIEdhdGUgKi8KIAl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzI5ICovCiAJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzMCAqLwogCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMzEgKi8KQEAgLTE2MzUsOCArMTYzNSw4IEBACiAJMHgwMDAwLCAgICAgLyogUjU4ICAgIC0gTUlDQklBUyAqLwogCTB4MDAwRCwgICAgIC8qIFI1OSAgICAtIExETyAxICovCiAJMHgwMDAzLCAgICAgLyogUjYwICAgIC0gTERPIDIgKi8KLQkweDAwMDAsICAgICAvKiBSNjEgKi8KLQkweDAwMDAsICAgICAvKiBSNjIgKi8KKwkweDAwMzksICAgICAvKiBSNjEgICAgLSBNSUNCSUFTMSAqLworCTB4MDAzOSwgICAgIC8qIFI2MiAgICAtIE1JQ0JJQVMyICovCiAJMHgwMDAwLCAgICAgLyogUjYzICovCiAJMHgwMDAwLCAgICAgLyogUjY0ICovCiAJMHgwMDAwLCAgICAgLyogUjY1ICovCkBAIC0yNjQ2LDggKzI2NDYsOCBAQAogCTB4MDAwMCwgICAgIC8qIFIxMDY5ICovCiAJMHgwMDAwLCAgICAgLyogUjEwNzAgKi8KIAkweDAwMDAsICAgICAvKiBSMTA3MSAqLwotCTB4MDAwMCwgICAgIC8qIFIxMDcyICovCi0JMHgwMDAwLCAgICAgLyogUjEwNzMgKi8KKwkweDAwNjgsICAgICAvKiBSMTA3MiAgLSBBSUYxIERBQzEgTm9pc2UgR2F0ZSAqLworCTB4MDA2OCwgICAgIC8qIFIxMDczICAtIEFJRjEgREFDMiBOb2lzZSBHYXRlICovCiAJMHgwMDAwLCAgICAgLyogUjEwNzQgKi8KIAkweDAwMDAsICAgICAvKiBSMTA3NSAqLwogCTB4MDAwMCwgICAgIC8qIFIxMDc2ICovCkBAIC0yOTAyLDcgKzI5MDIsNyBAQAogCTB4MDAwMCwgICAgIC8qIFIxMzI1ICovCiAJMHgwMDAwLCAgICAgLyogUjEzMjYgKi8KIAkweDAwMDAsICAgICAvKiBSMTMyNyAqLwotCTB4MDAwMCwgICAgIC8qIFIxMzI4ICovCisJMHgwMDY4LCAgICAgLyogUjEzMjggIC0gQUlGMiBEQUMgTm9pc2UgR2F0ZSAqLwogCTB4MDAwMCwgICAgIC8qIFIxMzI5ICovCiAJMHgwMDAwLCAgICAgLyogUjEzMzAgKi8KIAkweDAwMDAsICAgICAvKiBSMTMzMSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKaW5kZXggYjM5M2Y5Zi4uOWM5ODJlNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCkBAIC01Niw3ICs1Niw3IEBACiBzdGF0aWMgaW50IHdtODk5NF9yZWFkYWJsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcpCiB7CiAJc3RydWN0IHdtODk5NF9wcml2ICp3bTg5OTQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd204OTk0ICpjb250cm9sID0gd204OTk0LT5jb250cm9sX2RhdGE7CisJc3RydWN0IHdtODk5NCAqY29udHJvbCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CiAKIAlzd2l0Y2ggKHJlZykgewogCWNhc2UgV004OTk0X0dQSU9fMToKQEAgLTEwNyw2ICsxMDcsNyBAQAogCWNhc2UgV004OTk0X0xET18yOgogCWNhc2UgV004OTU4X0RTUDJfRVhFQ0NPTlRST0w6CiAJY2FzZSBXTTg5NThfTUlDX0RFVEVDVF8zOgorCWNhc2UgV004OTk0X0RDX1NFUlZPXzRFOgogCQlyZXR1cm4gMTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKQEAgLTIwNyw3ICsyMDgsNyBAQAogc3RhdGljIGludCBjb25maWd1cmVfY2xvY2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IG9sZCwgbmV3OworCWludCBjaGFuZ2UsIG5ldzsKIAogCS8qIEJyaW5nIHVwIHRoZSBBSUYgY2xvY2tzIGZpcnN0ICovCiAJY29uZmlndXJlX2FpZl9jbG9jayhjb2RlYywgMCk7CkBAIC0yMjgsMTQgKzIyOSwxMSBAQAogCWVsc2UKIAkJbmV3ID0gMDsKIAotCW9sZCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTk0X0NMT0NLSU5HXzEpICYgV004OTk0X1NZU0NMS19TUkM7Ci0KLQkvKiBJZiB0aGVyZSdzIG5vIGNoYW5nZSB0aGVuIHdlJ3JlIGRvbmUuICovCi0JaWYgKG9sZCA9PSBuZXcpCisJY2hhbmdlID0gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X0NMT0NLSU5HXzEsCisJCQkJICAgICBXTTg5OTRfU1lTQ0xLX1NSQywgbmV3KTsKKwlpZiAoIWNoYW5nZSkKIAkJcmV0dXJuIDA7CiAKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQ0xPQ0tJTkdfMSwgV004OTk0X1NZU0NMS19TUkMsIG5ldyk7Ci0KIAlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOwogCiAJcmV0dXJuIDA7CkBAIC0yODEsNiArMjc5LDggQEAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzdF90bHYsIC0zNjAwLCAzMDAsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHdtODk5NF8zZF90bHYsIC0xNjAwLCAxODMsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGVxX3RsdiwgLTEyMDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobmdfdGx2LCAtMTAyMDAsIDYwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobWl4aW5fYm9vc3RfdGx2LCAwLCA5MDAsIDApOwogCiAjZGVmaW5lIFdNODk5NF9EUkNfU1dJVENIKHhuYW1lLCByZWcsIHNoaWZ0KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCkBAIC02NjAsOCArNjYwLDUyIEBACiAJICAgICAgIGVxX3RsdiksCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqd204OTU4X25nX3RleHRbXSA9IHsKKwkiMzBtcyIsICIxMjVtcyIsICIyNTBtcyIsICI1MDBtcyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk1OF9haWYxZGFjMV9uZ19ob2xkID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTU4X0FJRjFfREFDMV9OT0lTRV9HQVRFLAorCQkJV004OTU4X0FJRjFEQUMxX05HX1RIUl9TSElGVCwgNCwgd204OTU4X25nX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk1OF9haWYxZGFjMl9uZ19ob2xkID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTU4X0FJRjFfREFDMl9OT0lTRV9HQVRFLAorCQkJV004OTU4X0FJRjFEQUMyX05HX1RIUl9TSElGVCwgNCwgd204OTU4X25nX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk1OF9haWYyZGFjX25nX2hvbGQgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5NThfQUlGMl9EQUNfTk9JU0VfR0FURSwKKwkJCVdNODk1OF9BSUYyREFDX05HX1RIUl9TSElGVCwgNCwgd204OTU4X25nX3RleHQpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTU4X3NuZF9jb250cm9sc1tdID0gewogU09DX1NJTkdMRV9UTFYoIkFJRjMgQm9vc3QgVm9sdW1lIiwgV004OTU4X0FJRjNfQ09OVFJPTF8yLCAxMCwgMywgMCwgYWlmX3RsdiksCisKK1NPQ19TSU5HTEUoIkFJRjFEQUMxIE5vaXNlIEdhdGUgU3dpdGNoIiwgV004OTU4X0FJRjFfREFDMV9OT0lTRV9HQVRFLAorCSAgIFdNODk1OF9BSUYxREFDMV9OR19FTkFfU0hJRlQsIDEsIDApLAorU09DX0VOVU0oIkFJRjFEQUMxIE5vaXNlIEdhdGUgSG9sZCBUaW1lIiwgd204OTU4X2FpZjFkYWMxX25nX2hvbGQpLAorU09DX1NJTkdMRV9UTFYoIkFJRjFEQUMxIE5vaXNlIEdhdGUgVGhyZXNob2xkIFZvbHVtZSIsCisJICAgICAgIFdNODk1OF9BSUYxX0RBQzFfTk9JU0VfR0FURSwgV004OTU4X0FJRjFEQUMxX05HX1RIUl9TSElGVCwKKwkgICAgICAgNywgMSwgbmdfdGx2KSwKKworU09DX1NJTkdMRSgiQUlGMURBQzIgTm9pc2UgR2F0ZSBTd2l0Y2giLCBXTTg5NThfQUlGMV9EQUMyX05PSVNFX0dBVEUsCisJICAgV004OTU4X0FJRjFEQUMyX05HX0VOQV9TSElGVCwgMSwgMCksCitTT0NfRU5VTSgiQUlGMURBQzIgTm9pc2UgR2F0ZSBIb2xkIFRpbWUiLCB3bTg5NThfYWlmMWRhYzJfbmdfaG9sZCksCitTT0NfU0lOR0xFX1RMVigiQUlGMURBQzIgTm9pc2UgR2F0ZSBUaHJlc2hvbGQgVm9sdW1lIiwKKwkgICAgICAgV004OTU4X0FJRjFfREFDMl9OT0lTRV9HQVRFLCBXTTg5NThfQUlGMURBQzJfTkdfVEhSX1NISUZULAorCSAgICAgICA3LCAxLCBuZ190bHYpLAorCitTT0NfU0lOR0xFKCJBSUYyREFDIE5vaXNlIEdhdGUgU3dpdGNoIiwgV004OTU4X0FJRjJfREFDX05PSVNFX0dBVEUsCisJICAgV004OTU4X0FJRjJEQUNfTkdfRU5BX1NISUZULCAxLCAwKSwKK1NPQ19FTlVNKCJBSUYyREFDIE5vaXNlIEdhdGUgSG9sZCBUaW1lIiwgd204OTU4X2FpZjJkYWNfbmdfaG9sZCksCitTT0NfU0lOR0xFX1RMVigiQUlGMkRBQyBOb2lzZSBHYXRlIFRocmVzaG9sZCBWb2x1bWUiLAorCSAgICAgICBXTTg5NThfQUlGMl9EQUNfTk9JU0VfR0FURSwgV004OTU4X0FJRjJEQUNfTkdfVEhSX1NISUZULAorCSAgICAgICA3LCAxLCBuZ190bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtMTgxMV9zbmRfY29udHJvbHNbXSA9IHsKK1NPQ19TSU5HTEVfVExWKCJNSVhJTkwgSU4xTFAgQm9vc3QgVm9sdW1lIiwgV004OTk0X0lOUFVUX01JWEVSXzEsIDcsIDEsIDAsCisJICAgICAgIG1peGluX2Jvb3N0X3RsdiksCitTT0NfU0lOR0xFX1RMVigiTUlYSU5MIElOMVJQIEJvb3N0IFZvbHVtZSIsIFdNODk5NF9JTlBVVF9NSVhFUl8xLCA4LCAxLCAwLAorCSAgICAgICBtaXhpbl9ib29zdF90bHYpLAogfTsKIAogc3RhdGljIGludCBjbGtfc3lzX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LApAQCAtNjgxLDYgKzcyNSw5NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB2bWlkX3JlZmVyZW5jZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODk5NF9wcml2ICp3bTg5OTQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdtODk5NC0+dm1pZF9yZWZjb3VudCsrOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUmVmZXJlbmNpbmcgVk1JRCwgcmVmY291bnQgaXMgbm93ICVkXG4iLAorCQl3bTg5OTQtPnZtaWRfcmVmY291bnQpOworCisJaWYgKHdtODk5NC0+dm1pZF9yZWZjb3VudCA9PSAxKSB7CisJCS8qIFN0YXJ0dXAgYmlhcywgVk1JRCByYW1wICYgYnVmZmVyICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzIsCisJCQkJICAgIFdNODk5NF9TVEFSVFVQX0JJQVNfRU5BIHwKKwkJCQkgICAgV004OTk0X1ZNSURfQlVGX0VOQSB8CisJCQkJICAgIFdNODk5NF9WTUlEX1JBTVBfTUFTSywKKwkJCQkgICAgV004OTk0X1NUQVJUVVBfQklBU19FTkEgfAorCQkJCSAgICBXTTg5OTRfVk1JRF9CVUZfRU5BIHwKKwkJCQkgICAgKDB4MTEgPDwgV004OTk0X1ZNSURfUkFNUF9TSElGVCkpOworCisJCS8qIE1haW4gYmlhcyBlbmFibGUsIFZNSUQ9Mng0MGsgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfMSwKKwkJCQkgICAgV004OTk0X0JJQVNfRU5BIHwKKwkJCQkgICAgV004OTk0X1ZNSURfU0VMX01BU0ssCisJCQkJICAgIFdNODk5NF9CSUFTX0VOQSB8IDB4Mik7CisKKwkJbXNsZWVwKDIwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZtaWRfZGVyZWZlcmVuY2Uoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl3bTg5OTQtPnZtaWRfcmVmY291bnQtLTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIkRlcmVmZXJlbmNpbmcgVk1JRCwgcmVmY291bnQgaXMgbm93ICVkXG4iLAorCQl3bTg5OTQtPnZtaWRfcmVmY291bnQpOworCisJaWYgKHdtODk5NC0+dm1pZF9yZWZjb3VudCA9PSAwKSB7CisJCS8qIFN3aXRjaCBvdmVyIHRvIHN0YXJ0dXAgYmlhc2VzICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzIsCisJCQkJICAgIFdNODk5NF9CSUFTX1NSQyB8CisJCQkJICAgIFdNODk5NF9TVEFSVFVQX0JJQVNfRU5BIHwKKwkJCQkgICAgV004OTk0X1ZNSURfQlVGX0VOQSB8CisJCQkJICAgIFdNODk5NF9WTUlEX1JBTVBfTUFTSywKKwkJCQkgICAgV004OTk0X0JJQVNfU1JDIHwKKwkJCQkgICAgV004OTk0X1NUQVJUVVBfQklBU19FTkEgfAorCQkJCSAgICBXTTg5OTRfVk1JRF9CVUZfRU5BIHwKKwkJCQkgICAgKDEgPDwgV004OTk0X1ZNSURfUkFNUF9TSElGVCkpOworCisJCS8qIERpc2FibGUgbWFpbiBiaWFzZXMgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfMSwKKwkJCQkgICAgV004OTk0X0JJQVNfRU5BIHwKKwkJCQkgICAgV004OTk0X1ZNSURfU0VMX01BU0ssIDApOworCisJCS8qIERpc2NoYXJnZSBsaW5lICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzEsCisJCQkJICAgIFdNODk5NF9MSU5FT1VUMV9ESVNDSCB8CisJCQkJICAgIFdNODk5NF9MSU5FT1VUMl9ESVNDSCwKKwkJCQkgICAgV004OTk0X0xJTkVPVVQxX0RJU0NIIHwKKwkJCQkgICAgV004OTk0X0xJTkVPVVQyX0RJU0NIKTsKKworCQltc2xlZXAoNSk7CisKKwkJLyogU3dpdGNoIG9mZiBzdGFydHVwIGJpYXNlcyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQU5USVBPUF8yLAorCQkJCSAgICBXTTg5OTRfQklBU19TUkMgfAorCQkJCSAgICBXTTg5OTRfU1RBUlRVUF9CSUFTX0VOQSB8CisJCQkJICAgIFdNODk5NF9WTUlEX0JVRl9FTkEgfAorCQkJCSAgICBXTTg5OTRfVk1JRF9SQU1QX01BU0ssIDApOworCX0KK30KKworc3RhdGljIGludCB2bWlkX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXZtaWRfcmVmZXJlbmNlKGNvZGVjKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJdm1pZF9kZXJlZmVyZW5jZShjb2RlYyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCB3bTg5OTRfdXBkYXRlX2NsYXNzX3coc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CkBAIC0xMjA4LDYgKzEzNDMsOCBAQAogCiBTTkRfU09DX0RBUE1fU1VQUExZX1MoIk1JQ0JJQVMgU3VwcGx5IiwgMSwgU05EX1NPQ19OT1BNLCAwLCAwLCBtaWNiaWFzX2V2LAogCQkgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSksCitTTkRfU09DX0RBUE1fU1VQUExZKCJWTUlEIiwgU05EX1NPQ19OT1BNLCAwLCAwLCB2bWlkX2V2ZW50LAorCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAogCiBTTkRfU09DX0RBUE1fU1VQUExZKCJDTEtfU1lTIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBjbGtfc3lzX2V2ZW50LAogCQkgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLApAQCAtMTI4Miw3ICsxNDE5LDcgQEAKIFNORF9TT0NfREFQTV9NVVgoIkFJRjJBREMgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmYWlmMmFkY19tdXgpLAogCiBTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYzREFDREFUIiwgIkFJRjMgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGM0FEQ0RBVCIsICJBSUYzIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjNBRENEQVQiLCAiQUlGMyBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKIAogU05EX1NPQ19EQVBNX1NVUFBMWSgiVE9DTEsiLCBXTTg5OTRfQ0xPQ0tJTkdfMSwgNCwgMCwgTlVMTCwgMCksCiAKQEAgLTE1MjUsNiArMTY2Miw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3bTg5OTRfaW50ZXJjb25bXSA9IHsKIAl7ICJBSUYyREFDTCIsIE5VTEwsICJBSUYyREFDIE11eCIgfSwKIAl7ICJBSUYyREFDUiIsIE5VTEwsICJBSUYyREFDIE11eCIgfSwKKwl7ICJNSUNCSUFTMSIsIE5VTEwsICJWTUlEIiB9LAorCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIlZNSUQiIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3bTg5NThfaW50ZXJjb25bXSA9IHsKQEAgLTE2MjksMTAgKzE3NjgsMTIgQEAKIAkJCSAgdW5zaWduZWQgaW50IGZyZXFfaW4sIHVuc2lnbmVkIGludCBmcmVxX291dCkKIHsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3bTg5OTQgKmNvbnRyb2wgPSBjb2RlYy0+Y29udHJvbF9kYXRhOwogCWludCByZWdfb2Zmc2V0LCByZXQ7CiAJc3RydWN0IGZsbF9kaXYgZmxsOwogCXUxNiByZWcsIGFpZjEsIGFpZjI7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWJvb2wgd2FzX2VuYWJsZWQ7CiAKIAlhaWYxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTRfQUlGMV9DTE9DS0lOR18xKQogCQkmIFdNODk5NF9BSUYxQ0xLX0VOQTsKQEAgLTE2NTMsNiArMTc5NCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTk0X0ZMTDFfQ09OVFJPTF8xICsgcmVnX29mZnNldCk7CisJd2FzX2VuYWJsZWQgPSByZWcgJiBXTTg5OTRfRkxMMV9FTkE7CisKIAlzd2l0Y2ggKHNyYykgewogCWNhc2UgMDoKIAkJLyogQWxsb3cgbm8gc291cmNlIHNwZWNpZmljYXRpb24gd2hlbiBzdG9wcGluZyAqLwpAQCAtMTcxOSw2ICsxODYzLDIxIEBACiAKIAkvKiBFbmFibGUgKHdpdGggZnJhY3Rpb25hbCBtb2RlIGlmIHJlcXVpcmVkKSAqLwogCWlmIChmcmVxX291dCkgeworCQkvKiBFbmFibGUgVk1JRCBpZiB3ZSBuZWVkIGl0ICovCisJCWlmICghd2FzX2VuYWJsZWQpIHsKKwkJCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCQkJY2FzZSBXTTg5OTQ6CisJCQkJdm1pZF9yZWZlcmVuY2UoY29kZWMpOworCQkJCWJyZWFrOworCQkJY2FzZSBXTTg5NTg6CisJCQkJaWYgKHdtODk5NC0+cmV2aXNpb24gPCAxKQorCQkJCQl2bWlkX3JlZmVyZW5jZShjb2RlYyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKIAkJaWYgKGZsbC5rKQogCQkJcmVnID0gV004OTk0X0ZMTDFfRU5BIHwgV004OTk0X0ZMTDFfRlJBQzsKIAkJZWxzZQpAQCAtMTczNiw2ICsxODk1LDIwIEBACiAJCX0gZWxzZSB7CiAJCQltc2xlZXAoNSk7CiAJCX0KKwl9IGVsc2UgeworCQlpZiAod2FzX2VuYWJsZWQpIHsKKwkJCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCQkJY2FzZSBXTTg5OTQ6CisJCQkJdm1pZF9kZXJlZmVyZW5jZShjb2RlYyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFdNODk1ODoKKwkJCQlpZiAod204OTk0LT5yZXZpc2lvbiA8IDEpCisJCQkJCXZtaWRfZGVyZWZlcmVuY2UoY29kZWMpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQogCX0KIAogCXdtODk5NC0+ZmxsW2lkXS5pbiA9IGZyZXFfaW47CkBAIC0xODUyLDkgKzIwMjUsNiBAQAogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6Ci0JCS8qIFZNSUQ9Mng0MGsgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfMSwKLQkJCQkgICAgV004OTk0X1ZNSURfU0VMX01BU0ssIDB4Mik7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKQEAgLTE4ODgsNiArMjA1OCwxNSBAQAogCQkJCQkJCSAgICBXTTg5NThfQ1BfRElTQ0gpOwogCQkJCX0KIAkJCQlicmVhazsKKworCQkJY2FzZSBXTTE4MTE6CisJCQkJaWYgKHdtODk5NC0+cmV2aXNpb24gPCAyKSB7CisJCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MTAyLCAweDMpOworCQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDVkLCAweDdlKTsKKwkJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHg1ZSwgMHgwKTsKKwkJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHgxMDIsIDB4MCk7CisJCQkJfQorCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKiBEaXNjaGFyZ2UgTElORU9VVDEgJiAyICovCkBAIC0xODk2LDY1ICsyMDc1LDEzIEBACiAJCQkJCSAgICBXTTg5OTRfTElORU9VVDJfRElTQ0gsCiAJCQkJCSAgICBXTTg5OTRfTElORU9VVDFfRElTQ0ggfAogCQkJCQkgICAgV004OTk0X0xJTkVPVVQyX0RJU0NIKTsKLQotCQkJLyogU3RhcnR1cCBiaWFzLCBWTUlEIHJhbXAgJiBidWZmZXIgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzIsCi0JCQkJCSAgICBXTTg5OTRfU1RBUlRVUF9CSUFTX0VOQSB8Ci0JCQkJCSAgICBXTTg5OTRfVk1JRF9CVUZfRU5BIHwKLQkJCQkJICAgIFdNODk5NF9WTUlEX1JBTVBfTUFTSywKLQkJCQkJICAgIFdNODk5NF9TVEFSVFVQX0JJQVNfRU5BIHwKLQkJCQkJICAgIFdNODk5NF9WTUlEX0JVRl9FTkEgfAotCQkJCQkgICAgKDB4MTEgPDwgV004OTk0X1ZNSURfUkFNUF9TSElGVCkpOwotCi0JCQkvKiBNYWluIGJpYXMgZW5hYmxlLCBWTUlEPTJ4NDBrICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF8xLAotCQkJCQkgICAgV004OTk0X0JJQVNfRU5BIHwKLQkJCQkJICAgIFdNODk5NF9WTUlEX1NFTF9NQVNLLAotCQkJCQkgICAgV004OTk0X0JJQVNfRU5BIHwgMHgyKTsKLQotCQkJbXNsZWVwKDIwKTsKIAkJfQogCi0JCS8qIFZNSUQ9Mng1MDBrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzEsCi0JCQkJICAgIFdNODk5NF9WTUlEX1NFTF9NQVNLLCAweDQpOwogCiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgewotCQkJLyogU3dpdGNoIG92ZXIgdG8gc3RhcnR1cCBiaWFzZXMgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzIsCi0JCQkJCSAgICBXTTg5OTRfQklBU19TUkMgfAotCQkJCQkgICAgV004OTk0X1NUQVJUVVBfQklBU19FTkEgfAotCQkJCQkgICAgV004OTk0X1ZNSURfQlVGX0VOQSB8Ci0JCQkJCSAgICBXTTg5OTRfVk1JRF9SQU1QX01BU0ssCi0JCQkJCSAgICBXTTg5OTRfQklBU19TUkMgfAotCQkJCQkgICAgV004OTk0X1NUQVJUVVBfQklBU19FTkEgfAotCQkJCQkgICAgV004OTk0X1ZNSURfQlVGX0VOQSB8Ci0JCQkJCSAgICAoMSA8PCBXTTg5OTRfVk1JRF9SQU1QX1NISUZUKSk7Ci0KLQkJCS8qIERpc2FibGUgbWFpbiBiaWFzZXMgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzEsCi0JCQkJCSAgICBXTTg5OTRfQklBU19FTkEgfAotCQkJCQkgICAgV004OTk0X1ZNSURfU0VMX01BU0ssIDApOwotCi0JCQkvKiBEaXNjaGFyZ2UgbGluZSAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X0FOVElQT1BfMSwKLQkJCQkJICAgIFdNODk5NF9MSU5FT1VUMV9ESVNDSCB8Ci0JCQkJCSAgICBXTTg5OTRfTElORU9VVDJfRElTQ0gsCi0JCQkJCSAgICBXTTg5OTRfTElORU9VVDFfRElTQ0ggfAotCQkJCQkgICAgV004OTk0X0xJTkVPVVQyX0RJU0NIKTsKLQotCQkJbXNsZWVwKDUpOwotCi0JCQkvKiBTd2l0Y2ggb2ZmIHN0YXJ0dXAgYmlhc2VzICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQU5USVBPUF8yLAotCQkJCQkgICAgV004OTk0X0JJQVNfU1JDIHwKLQkJCQkJICAgIFdNODk5NF9TVEFSVFVQX0JJQVNfRU5BIHwKLQkJCQkJICAgIFdNODk5NF9WTUlEX0JVRl9FTkEgfAotCQkJCQkgICAgV004OTk0X1ZNSURfUkFNUF9NQVNLLCAwKTsKLQogCQkJd204OTk0LT5jdXJfZncgPSBOVUxMOwogCiAJCQlwbV9ydW50aW1lX3B1dChjb2RlYy0+ZGV2KTsKQEAgLTIwNTUsMTAgKzIxODIsMTggQEAKIAogCS8qIFRoZSBBSUYyIGZvcm1hdCBjb25maWd1cmF0aW9uIG5lZWRzIHRvIGJlIG1pcnJvcmVkIHRvIEFJRjMKIAkgKiBvbiBXTTg5NTggaWYgaXQncyBpbiB1c2Ugc28ganVzdCBkbyBpdCBhbGwgdGhlIHRpbWUuICovCi0JaWYgKGNvbnRyb2wtPnR5cGUgPT0gV004OTU4ICYmIGRhaS0+aWQgPT0gMikKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTU4X0FJRjNfQ09OVFJPTF8xLAotCQkJCSAgICBXTTg5OTRfQUlGMV9MUkNMS19JTlYgfAotCQkJCSAgICBXTTg5NThfQUlGM19GTVRfTUFTSywgYWlmMSk7CisJc3dpdGNoIChjb250cm9sLT50eXBlKSB7CisJY2FzZSBXTTE4MTE6CisJY2FzZSBXTTg5NTg6CisJCWlmIChkYWktPmlkID09IDIpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NThfQUlGM19DT05UUk9MXzEsCisJCQkJCSAgICBXTTg5OTRfQUlGMV9MUkNMS19JTlYgfAorCQkJCQkgICAgV004OTU4X0FJRjNfRk1UX01BU0ssIGFpZjEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGFpZjFfcmVnLAogCQkJICAgIFdNODk5NF9BSUYxX0JDTEtfSU5WIHwgV004OTk0X0FJRjFfTFJDTEtfSU5WIHwKQEAgLTIxMDAsNyArMjIzNSw2IEBACiAJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKLQlzdHJ1Y3Qgd204OTk0ICpjb250cm9sID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCBhaWYxX3JlZzsKIAlpbnQgYWlmMl9yZWc7CkBAIC0yMTQzLDE0ICsyMjc3LDYgQEAKIAkJCWRldl9kYmcoY29kZWMtPmRldiwgIkFJRjIgdXNpbmcgc3BsaXQgTFJDTEtcbiIpOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgMzoKLQkJc3dpdGNoIChjb250cm9sLT50eXBlKSB7Ci0JCWNhc2UgV004OTU4OgotCQkJYWlmMV9yZWcgPSBXTTg5NThfQUlGM19DT05UUk9MXzE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCQl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjI3MSw2ICsyMzk3LDcgQEAKIAlzd2l0Y2ggKGRhaS0+aWQpIHsKIAljYXNlIDM6CiAJCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCQljYXNlIFdNMTgxMToKIAkJY2FzZSBXTTg5NTg6CiAJCQlhaWYxX3JlZyA9IFdNODk1OF9BSUYzX0NPTlRST0xfMTsKIAkJCWJyZWFrOwpAQCAtMjMxMSw3ICsyNDM4LDcgQEAKIAkJcmF0ZV9yZWcgPSBXTTg5OTRfQUlGMV9SQVRFOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCXJhdGVfcmVnID0gV004OTk0X0FJRjFfUkFURTsKKwkJcmF0ZV9yZWcgPSBXTTg5OTRfQUlGMl9SQVRFOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTIzODQsNiArMjUxMSwyMSBAQAogCXJldHVybiBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsIG1hc2ssIHZhbCk7CiB9CiAKK3N0YXRpYyBpbnQgd204OTk0X2FpZjJfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKworCS8qIERpc2FibGUgdGhlIHB1bGxzIG9uIHRoZSBBSUYgaWYgd2UncmUgdXNpbmcgaXQgdG8gc2F2ZSBwb3dlci4gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfR1BJT18zLAorCQkJICAgIFdNODk5NF9HUE5fUFUgfCBXTTg5OTRfR1BOX1BELCAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfR1BJT180LAorCQkJICAgIFdNODk5NF9HUE5fUFUgfCBXTTg5OTRfR1BOX1BELCAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfR1BJT181LAorCQkJICAgIFdNODk5NF9HUE5fUFUgfCBXTTg5OTRfR1BOX1BELCAwKTsKKworCXJldHVybiAwOworfQorCiAjZGVmaW5lIFdNODk5NF9SQVRFUyBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwCiAKICNkZWZpbmUgV004OTk0X0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHxcCkBAIC0yNDUxLDYgKzI1OTMsNyBAQAogCQkJLnJhdGVzID0gV004OTk0X1JBVEVTLAogCQkJLmZvcm1hdHMgPSBXTTg5OTRfRk9STUFUUywKIAkJfSwKKwkJLnByb2JlID0gd204OTk0X2FpZjJfcHJvYmUsCiAJCS5vcHMgPSAmd204OTk0X2FpZjJfZGFpX29wcywKIAl9LAogCXsKQEAgLTI0ODUsNiArMjYyOCw3IEBACiAJY2FzZSBXTTg5OTQ6CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9NSUNCSUFTLCBXTTg5OTRfTUlDRF9FTkEsIDApOwogCQlicmVhazsKKwljYXNlIFdNMTgxMToKIAljYXNlIFdNODk1ODoKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTU4X01JQ19ERVRFQ1RfMSwKIAkJCQkgICAgV004OTU4X01JQ0RfRU5BLCAwKTsKQEAgLTI1NTMsNiArMjY5Nyw3IEBACiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfTUlDQklBUywKIAkJCQkJICAgIFdNODk5NF9NSUNEX0VOQSwgV004OTk0X01JQ0RfRU5BKTsKIAkJYnJlYWs7CisJY2FzZSBXTTE4MTE6CiAJY2FzZSBXTTg5NTg6CiAJCWlmICh3bTg5OTQtPmphY2tfY2IpCiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NThfTUlDX0RFVEVDVF8xLApAQCAtMjg1MSw4ICsyOTk2LDEzIEBACiAJc3RydWN0IHdtODk5NF9wcml2ICp3bTg5OTQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgd204OTk0ICpjb250cm9sID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKIAotCWlmIChjb250cm9sLT50eXBlICE9IFdNODk1OCkKKwlzd2l0Y2ggKGNvbnRyb2wtPnR5cGUpIHsKKwljYXNlIFdNMTgxMToKKwljYXNlIFdNODk1ODoKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJaWYgKGphY2spIHsKIAkJaWYgKCFjYikgewpAQCAtMjg4MCwxOSArMzAzMCwzNCBAQAogewogCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTg5OTQtPmNvZGVjOwotCWludCByZWc7CisJaW50IHJlZywgY291bnQ7CiAKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk1OF9NSUNfREVURUNUXzMpOwotCWlmIChyZWcgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZWFkIG1pYyBkZXRlY3Qgc3RhdHVzOiAlZFxuIiwKLQkJCXJlZyk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9CisJLyogV2UgbWF5IG9jY2FzaW9uYWxseSByZWFkIGEgZGV0ZWN0aW9uIHdpdGhvdXQgYW4gaW1wZWRlbmNlCisJICogcmFuZ2UgYmVpbmcgcHJvdmlkZWQgLSBpZiB0aGF0IGhhcHBlbnMgbG9vcCBhZ2Fpbi4KKwkgKi8KKwljb3VudCA9IDEwOworCWRvIHsKKwkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NThfTUlDX0RFVEVDVF8zKTsKKwkJaWYgKHJlZyA8IDApIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHJlYWQgbWljIGRldGVjdCBzdGF0dXM6ICVkXG4iLAorCQkJCXJlZyk7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KIAotCWlmICghKHJlZyAmIFdNODk1OF9NSUNEX1ZBTElEKSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWMgZGV0ZWN0IGRhdGEgbm90IHZhbGlkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQorCQlpZiAoIShyZWcgJiBXTTg5NThfTUlDRF9WQUxJRCkpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIk1pYyBkZXRlY3QgZGF0YSBub3QgdmFsaWRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIShyZWcgJiBXTTg5NThfTUlDRF9TVFMpIHx8IChyZWcgJiBXTTg5NThfTUlDRF9MVkxfTUFTSykpCisJCQlicmVhazsKKworCQltc2xlZXAoMSk7CisJfSB3aGlsZSAoY291bnQtLSk7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJZGV2X3dhcm4oY29kZWMtPmRldiwgIk5vIGltcGVkZW5jZSByYW5nZSByZXBvcnRlZCBmb3IgamFja1xuIik7CiAKICNpZm5kZWYgQ09ORklHX1NORF9TT0NfV004OTk0X01PRFVMRQogCXRyYWNlX3NuZF9zb2NfamFja19pcnEoZGV2X25hbWUoY29kZWMtPmRldikpOwpAQCAtMjkxNiw2ICszMDgxLDI0IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204OTk0X3RlbXBfd2FybihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhdGE7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJUaGVybWFsIHdhcm5pbmdcbiIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204OTk0X3RlbXBfc2h1dChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhdGE7CisKKwlkZXZfY3JpdChjb2RlYy0+ZGV2LCAiVGhlcm1hbCBzaHV0ZG93blxuIik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIHN0YXRpYyBpbnQgd204OTk0X2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204OTk0ICpjb250cm9sOwpAQCAtMjk3MiwxMyArMzE1NSwxNCBAQAogCQlzd2l0Y2ggKHdtODk5NC0+cmV2aXNpb24pIHsKIAkJY2FzZSAyOgogCQljYXNlIDM6Ci0JCQl3bTg5OTQtPmh1YnMuZGNzX2NvZGVzID0gLTU7CisJCQl3bTg5OTQtPmh1YnMuZGNzX2NvZGVzX2wgPSAtNTsKKwkJCXdtODk5NC0+aHVicy5kY3NfY29kZXNfciA9IC01OwogCQkJd204OTk0LT5odWJzLmhwX3N0YXJ0dXBfbW9kZSA9IDE7CiAJCQl3bTg5OTQtPmh1YnMuZGNzX3JlYWRiYWNrX21vZGUgPSAxOwogCQkJd204OTk0LT5odWJzLnNlcmllc19zdGFydHVwID0gMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJd204OTk0LT5odWJzLmRjc19yZWFkYmFja19tb2RlID0gMTsKKwkJCXdtODk5NC0+aHVicy5kY3NfcmVhZGJhY2tfbW9kZSA9IDI7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTI5ODcsMTIgKzMxNzEsMzQgQEAKIAkJd204OTk0LT5odWJzLmRjc19yZWFkYmFja19tb2RlID0gMTsKIAkJYnJlYWs7CiAKKwljYXNlIFdNMTgxMToKKwkJd204OTk0LT5odWJzLmRjc19yZWFkYmFja19tb2RlID0gMjsKKwkJd204OTk0LT5odWJzLm5vX3Nlcmllc191cGRhdGUgPSAxOworCisJCXN3aXRjaCAod204OTk0LT5yZXZpc2lvbikgeworCQljYXNlIDA6CisJCWNhc2UgMToKKwkJCXdtODk5NC0+aHVicy5kY3NfY29kZXNfbCA9IC05OworCQkJd204OTk0LT5odWJzLmRjc19jb2Rlc19yID0gLTU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X0FOQUxPR1VFX0hQXzEsCisJCQkJICAgIFdNMTgxMV9IUE9VVDFfQVRUTiwgV00xODExX0hQT1VUMV9BVFROKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKIAl3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9GSUZPU19FUlIsCiAJCQkgICB3bTg5OTRfZmlmb19lcnJvciwgIkZJRk8gZXJyb3IiLCBjb2RlYyk7CisJd204OTk0X3JlcXVlc3RfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfVEVNUF9XQVJOLAorCQkJICAgd204OTk0X3RlbXBfd2FybiwgIlRoZXJtYWwgd2FybmluZyIsIGNvZGVjKTsKKwl3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9URU1QX1NIVVQsCisJCQkgICB3bTg5OTRfdGVtcF9zaHV0LCAiVGhlcm1hbCBzaHV0ZG93biIsIGNvZGVjKTsKIAogCXJldCA9IHdtODk5NF9yZXF1ZXN0X2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX0RDU19ET05FLAogCQkJCSB3bV9odWJzX2Rjc19kb25lLCAiREMgc2Vydm8gZG9uZSIsCkBAIC0zMDQzLDYgKzMyNDksNyBAQAogCQlicmVhazsKIAogCWNhc2UgV004OTU4OgorCWNhc2UgV00xODExOgogCQlpZiAod204OTk0LT5taWNkZXRfaXJxKSB7CiAJCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh3bTg5OTQtPm1pY2RldF9pcnEsIE5VTEwsCiAJCQkJCQkgICB3bTg5NThfbWljX2lycSwKQEAgLTMyMDUsNiArMzQxMiwxOSBAQAogCQkJCQkJICBBUlJBWV9TSVpFKHdtODk5NF9kYWNfd2lkZ2V0cykpOwogCQl9CiAJCWJyZWFrOworCisJY2FzZSBXTTE4MTE6CisJCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg5NThfc25kX2NvbnRyb2xzLAorCQkJCSAgICAgQVJSQVlfU0laRSh3bTg5NThfc25kX2NvbnRyb2xzKSk7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTU4X2RhcG1fd2lkZ2V0cywKKwkJCQkJICBBUlJBWV9TSVpFKHdtODk1OF9kYXBtX3dpZGdldHMpKTsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5OTRfbGF0ZWNsa193aWRnZXRzLAorCQkJCQkgIEFSUkFZX1NJWkUod204OTk0X2xhdGVjbGtfd2lkZ2V0cykpOworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODk5NF9hZGNfd2lkZ2V0cywKKwkJCQkJICBBUlJBWV9TSVpFKHdtODk5NF9hZGNfd2lkZ2V0cykpOworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODk5NF9kYWNfd2lkZ2V0cywKKwkJCQkJICBBUlJBWV9TSVpFKHdtODk5NF9kYWNfd2lkZ2V0cykpOworCQlicmVhazsKIAl9CiAJCQogCkBAIC0zMjQxLDYgKzM0NjEsMTIgQEAKIAogCQl3bTg5NThfZHNwMl9pbml0KGNvZGVjKTsKIAkJYnJlYWs7CisJY2FzZSBXTTE4MTE6CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdtODk5NF9sYXRlY2xrX2ludGVyY29uLAorCQkJCQlBUlJBWV9TSVpFKHdtODk5NF9sYXRlY2xrX2ludGVyY29uKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdtODk1OF9pbnRlcmNvbiwKKwkJCQkJQVJSQVlfU0laRSh3bTg5NThfaW50ZXJjb24pKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMjU3LDYgKzM0ODMsOCBAQAogCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX0RDU19ET05FLAogCQkJJndtODk5NC0+aHVicyk7CiAJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfRklGT1NfRVJSLCBjb2RlYyk7CisJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfVEVNUF9TSFVULCBjb2RlYyk7CisJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfVEVNUF9XQVJOLCBjb2RlYyk7CiBlcnI6CiAJa2ZyZWUod204OTk0KTsKIAlyZXR1cm4gcmV0OwpAQCAtMzI3OSw2ICszNTA3LDggQEAKIAl3bTg5OTRfZnJlZV9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9EQ1NfRE9ORSwKIAkJCSZ3bTg5OTQtPmh1YnMpOwogCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX0ZJRk9TX0VSUiwgY29kZWMpOworCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX1RFTVBfU0hVVCwgY29kZWMpOworCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX1RFTVBfV0FSTiwgY29kZWMpOwogCiAJc3dpdGNoIChjb250cm9sLT50eXBlKSB7CiAJY2FzZSBXTTg5OTQ6CkBAIC0zMjkyLDYgKzM1MjIsNyBAQAogCQkJCXdtODk5NCk7CiAJCWJyZWFrOwogCisJY2FzZSBXTTE4MTE6CiAJY2FzZSBXTTg5NTg6CiAJCWlmICh3bTg5OTQtPm1pY2RldF9pcnEpCiAJCQlmcmVlX2lycSh3bTg5OTQtPm1pY2RldF9pcnEsIHdtODk5NCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5oIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuaAppbmRleCAxYWIyMjY2Li5mNGYxMzU1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmgKQEAgLTgzLDYgKzgzLDggQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiBmbGxfbG9ja2VkWzJdOwogCWJvb2wgZmxsX2xvY2tlZF9pcnE7CiAKKwlpbnQgdm1pZF9yZWZjb3VudDsKKwogCWludCBkYWNfcmF0ZXNbMl07CiAJaW50IGxyY2xrX3NoYXJlZFsyXTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk1LmMKaW5kZXggNWFkODczZi4uNzhlZWIyMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jCkBAIC00ODUsNyArNDg1LDcgQEAKIHN0YXRpYyBpbnQgY29uZmlndXJlX2Nsb2NrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKLQlpbnQgb2xkLCBuZXc7CisJaW50IGNoYW5nZSwgbmV3OwogCiAJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKQEAgLTUwOSwxNSArNTA5LDExIEBACiAJZWxzZQogCQluZXcgPSAwOwogCi0Jb2xkID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTVfQ0xPQ0tJTkdfMSkgJiBXTTg5OTVfU1lTQ0xLX1NSQzsKLQotCS8qIElmIHRoZXJlJ3Mgbm8gY2hhbmdlIHRoZW4gd2UncmUgZG9uZS4gKi8KLQlpZiAob2xkID09IG5ldykKKwljaGFuZ2UgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQ0xPQ0tJTkdfMSwKKwkJCQkgICAgIFdNODk5NV9TWVNDTEtfU1JDX01BU0ssIG5ldyk7CisJaWYgKCFjaGFuZ2UpCiAJCXJldHVybiAwOwogCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk1X0NMT0NLSU5HXzEsCi0JCQkgICAgV004OTk1X1NZU0NMS19TUkNfTUFTSywgbmV3KTsKLQogCXNuZF9zb2NfZGFwbV9zeW5jKCZjb2RlYy0+ZGFwbSk7CiAKIAlyZXR1cm4gMDsKQEAgLTE1NzMsMTEgKzE1NjksMTYgQEAKIHN0YXRpYyBpbnQgd204OTk1X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODk5NV9wcml2ICp3bTg5OTU7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyYzsKKwlpbnQgaTsKIAotCWkyYyA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKIAl3bTg5OTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl3bTg5OTVfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk1LT5zdXBwbGllcyk7ICsraSkKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIod204OTk1LT5zdXBwbGllc1tpXS5jb25zdW1lciwKKwkJCQkJICAgICAgJndtODk5NS0+ZGlzYWJsZV9uYltpXSk7CisKKwlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUod204OTk1LT5zdXBwbGllcyksIHdtODk5NS0+c3VwcGxpZXMpOwogCXJldHVybiAwOwogfQogCkBAIC0xNjQyLDYgKzE2NDMsNyBAQAogCiAJaWYgKHJldCAhPSAweDg5OTUpIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBkZXZpY2UgSUQ6ICUjeFxuIiwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJfcmVnX2VuYWJsZTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCmluZGV4IDBjZGI5ZDEuLjY0NWM5ODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYwpAQCAtNDEsMTIgKzQxLDExIEBACiAjZGVmaW5lIEhQT1VUMkwgNAogI2RlZmluZSBIUE9VVDJSIDgKIAotI2RlZmluZSBXTTg5OTZfTlVNX1NVUFBMSUVTIDQKKyNkZWZpbmUgV004OTk2X05VTV9TVVBQTElFUyAzCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTk2X3N1cHBseV9uYW1lc1tXTTg5OTZfTlVNX1NVUFBMSUVTXSA9IHsKIAkiREJWREQiLAogCSJBVkREMSIsCiAJIkFWREQyIiwKLQkiQ1BWREQiLAogfTsKIAogc3RydWN0IHdtODk5Nl9wcml2IHsKQEAgLTcxLDYgKzcwLDggQEAKIAogCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW1dNODk5Nl9OVU1fU1VQUExJRVNdOwogCXN0cnVjdCBub3RpZmllcl9ibG9jayBkaXNhYmxlX25iW1dNODk5Nl9OVU1fU1VQUExJRVNdOworCXN0cnVjdCByZWd1bGF0b3IgKmNwdmRkOworCWludCBiZ19lbmE7CiAKIAlzdHJ1Y3Qgd204OTk2X3BkYXRhIHBkYXRhOwogCkBAIC0xMTIsNyArMTEzLDYgQEAKIFdNODk5Nl9SRUdVTEFUT1JfRVZFTlQoMCkKIFdNODk5Nl9SRUdVTEFUT1JfRVZFTlQoMSkKIFdNODk5Nl9SRUdVTEFUT1JfRVZFTlQoMikKLVdNODk5Nl9SRUdVTEFUT1JfRVZFTlQoMykKIAogc3RhdGljIGNvbnN0IHUxNiB3bTg5OTZfcmVnW1dNODk5Nl9NQVhfUkVHSVNURVJdID0gewogCVtXTTg5OTZfU09GVFdBUkVfUkVTRVRdID0gMHg4OTk2LApAQCAtNDE0LDYgKzQxNCw3IEBACiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUob3V0X3RsdiwgLTkwMCwgNzUsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHNwa190bHYsIC05MDAsIDE1MCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRSh0aHJlZWRzdGVyZW9fdGx2LCAtMTYwMCwgMTgzLCAxKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNpZGV0b25lX2hwZl90ZXh0W10gPSB7CiAJIjIuOWtIeiIsICIxLjVrSHoiLCAiNzM1SHoiLCAiNDAzSHoiLCAiMTk2SHoiLCAiOThIeiIsICI0OUh6IgpAQCAtNjA4LDYgKzYwOSwxNCBAQAogU09DX1NJTkdMRSgiREFDIFNvZnQgTXV0ZSBTd2l0Y2giLCBXTTg5OTZfREFDX1NPRlRNVVRFLCAxLCAxLCAwKSwKIFNPQ19TSU5HTEUoIkRBQyBTbG93IFNvZnQgTXV0ZSBTd2l0Y2giLCBXTTg5OTZfREFDX1NPRlRNVVRFLCAwLCAxLCAwKSwKIAorU09DX1NJTkdMRSgiRFNQMSAzRCBTdGVyZW8gU3dpdGNoIiwgV004OTk2X0RTUDFfUlhfRklMVEVSU18yLCA4LCAxLCAwKSwKK1NPQ19TSU5HTEUoIkRTUDIgM0QgU3RlcmVvIFN3aXRjaCIsIFdNODk5Nl9EU1AyX1JYX0ZJTFRFUlNfMiwgOCwgMSwgMCksCisKK1NPQ19TSU5HTEVfVExWKCJEU1AxIDNEIFN0ZXJlbyBWb2x1bWUiLCBXTTg5OTZfRFNQMV9SWF9GSUxURVJTXzIsIDEwLCAxNSwKKwkJMCwgdGhyZWVkc3RlcmVvX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRFNQMiAzRCBTdGVyZW8gVm9sdW1lIiwgV004OTk2X0RTUDJfUlhfRklMVEVSU18yLCAxMCwgMTUsCisJCTAsIHRocmVlZHN0ZXJlb190bHYpLAorCiBTT0NfRE9VQkxFX1RMVigiRGlnaXRhbCBPdXRwdXQgMSBWb2x1bWUiLCBXTTg5OTZfREFDMV9IUE9VVDFfVk9MVU1FLCAwLCA0LAogCSAgICAgICA4LCAwLCBvdXRfZGlnaXRhbF90bHYpLAogU09DX0RPVUJMRV9UTFYoIkRpZ2l0YWwgT3V0cHV0IDIgVm9sdW1lIiwgV004OTk2X0RBQzJfSFBPVVQyX1ZPTFVNRSwgMCwgNCwKQEAgLTYzMiw2ICs2NDEsMTQgQEAKIAogU09DX1NJTkdMRSgiRFNQMSBFUSBTd2l0Y2giLCBXTTg5OTZfRFNQMV9SWF9FUV9HQUlOU18xLCAwLCAxLCAwKSwKIFNPQ19TSU5HTEUoIkRTUDIgRVEgU3dpdGNoIiwgV004OTk2X0RTUDJfUlhfRVFfR0FJTlNfMSwgMCwgMSwgMCksCisKK1NPQ19TSU5HTEUoIkRTUDEgRFJDIFRYTCBTd2l0Y2giLCBXTTg5OTZfRFNQMV9EUkNfMSwgMCwgMSwgMCksCitTT0NfU0lOR0xFKCJEU1AxIERSQyBUWFIgU3dpdGNoIiwgV004OTk2X0RTUDFfRFJDXzEsIDEsIDEsIDApLAorU09DX1NJTkdMRSgiRFNQMSBEUkMgUlggU3dpdGNoIiwgV004OTk2X0RTUDFfRFJDXzEsIDIsIDEsIDApLAorCitTT0NfU0lOR0xFKCJEU1AyIERSQyBUWEwgU3dpdGNoIiwgV004OTk2X0RTUDJfRFJDXzEsIDAsIDEsIDApLAorU09DX1NJTkdMRSgiRFNQMiBEUkMgVFhSIFN3aXRjaCIsIFdNODk5Nl9EU1AyX0RSQ18xLCAxLCAxLCAwKSwKK1NPQ19TSU5HTEUoIkRTUDIgRFJDIFJYIFN3aXRjaCIsIFdNODk5Nl9EU1AyX0RSQ18xLCAyLCAxLCAwKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTZfZXFfY29udHJvbHNbXSA9IHsKQEAgLTY1OCwxOSArNjc1LDc1IEBACiAJICAgICAgIGVxX3RsdiksCiB9OwogCi1zdGF0aWMgaW50IGNwX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorc3RhdGljIHZvaWQgd204OTk2X2JnX2VuYWJsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODk5Nl9wcml2ICp3bTg5OTYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdtODk5Ni0+YmdfZW5hKys7CisJaWYgKHdtODk5Ni0+YmdfZW5hID09IDEpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfMSwKKwkJCQkgICAgV004OTk2X0JHX0VOQSwgV004OTk2X0JHX0VOQSk7CisJCW1zbGVlcCgyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdtODk5Nl9iZ19kaXNhYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd204OTk2X3ByaXYgKndtODk5NiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJd204OTk2LT5iZ19lbmEtLTsKKwlpZiAoIXdtODk5Ni0+YmdfZW5hKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJCSAgICBXTTg5OTZfQkdfRU5BLCAwKTsKK30KKworc3RhdGljIGludCBiZ19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKIAkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CisJaW50IHJldCA9IDA7CisKIAlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCW1zbGVlcCg1KTsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQl3bTg5OTZfYmdfZW5hYmxlKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXdtODk5Nl9iZ19kaXNhYmxlKGNvZGVjKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3BfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCB3bTg5OTZfcHJpdiAqd204OTk2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZSh3bTg5OTYtPmNwdmRkKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBDUFZERDogJWRcbiIsCisJCQkJcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCW1zbGVlcCg1KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXJlZ3VsYXRvcl9kaXNhYmxlX2RlZmVycmVkKHdtODk5Ni0+Y3B2ZGQsIDIwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBybXZfc2hvcnRfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCkBAIC02OTgsNyArNzcxLDcgQEAKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKIAlzdHJ1Y3Qgd204OTk2X3ByaXYgKndtODk5NiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBpLCByZXQ7CisJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAyMDA7CiAKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTZfRENfU0VSVk9fMiwgbWFzayk7CkBAIC03MTMsMTUgKzc4NiwxMiBAQAogCiAJCX0gZWxzZSB7CiAJCQltc2xlZXAoMSk7Ci0JCQlpZiAoLS1pKSB7Ci0JCQkJdGltZW91dCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQl0aW1lb3V0LS07CiAJCX0KIAogCQlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5Nl9EQ19TRVJWT18yKTsKIAkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiREMgc2Vydm8gc3RhdGU6ICV4XG4iLCByZXQpOwotCX0gd2hpbGUgKHJldCAmIG1hc2spOworCX0gd2hpbGUgKHRpbWVvdXQgJiYgcmV0ICYgbWFzayk7CiAKIAlpZiAodGltZW91dCA9PSAwKQogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJEQyBzZXJ2byB0aW1lZCBvdXQgZm9yICV4XG4iLCBtYXNrKTsKQEAgLTk3OSw5ICsxMDQ5LDEyIEBACiBTTkRfU09DX0RBUE1fU1VQUExZX1MoIlNZU0RTUENMSyIsIDIsIFdNODk5Nl9DTE9DS0lOR18xLCAxLCAwLCBOVUxMLCAwKSwKIFNORF9TT0NfREFQTV9TVVBQTFlfUygiQUlGQ0xLIiwgMiwgV004OTk2X0NMT0NLSU5HXzEsIDIsIDAsIE5VTEwsIDApLAogU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJDaGFyZ2UgUHVtcCIsIDIsIFdNODk5Nl9DSEFSR0VfUFVNUF8xLCAxNSwgMCwgY3BfZXZlbnQsCi0JCSAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCi0KKwkJICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiQmFuZGdhcCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgYmdfZXZlbnQsCisJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCiBTTkRfU09DX0RBUE1fU1VQUExZKCJMRE8yIiwgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfMiwgMSwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCMSBBdWRpbyIsIFdNODk5Nl9NSUNCSUFTXzEsIDQsIDEsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQjIgQXVkaW8iLCBXTTg5OTZfTUlDQklBU18yLCA0LCAxLCBOVUxMLCAwKSwKIFNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUNCMiIsIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzEsIDksIDApLAogU05EX1NPQ19EQVBNX01JQ0JJQVMoIk1JQ0IxIiwgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfMSwgOCwgMCksCiAKQEAgLTEwMzUsMTQgKzExMDgsMTQgQEAKIFNORF9TT0NfREFQTV9EQUMoIkRBQzFMIiwgTlVMTCwgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNSwgMSwgMCksCiBTTkRfU09DX0RBUE1fREFDKCJEQUMxUiIsIE5VTEwsIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzUsIDAsIDApLAogCi1TTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYyUlgxIiwgIkFJRjIgUGxheWJhY2siLCAxLAorU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMlJYMSIsICJBSUYyIFBsYXliYWNrIiwgMCwKIAkJICAgIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzQsIDksIDApLAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMlJYMCIsICJBSUYyIFBsYXliYWNrIiwgMiwKK1NORF9TT0NfREFQTV9BSUZfSU4oIkFJRjJSWDAiLCAiQUlGMiBQbGF5YmFjayIsIDEsCiAJCSAgICBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF80LCA4LCAwKSwKIAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMlRYMSIsICJBSUYyIENhcHR1cmUiLCAxLAorU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjJUWDEiLCAiQUlGMiBDYXB0dXJlIiwgMCwKIAkJICAgIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzYsIDksIDApLAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMlRYMCIsICJBSUYyIENhcHR1cmUiLCAyLAorU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjJUWDAiLCAiQUlGMiBDYXB0dXJlIiwgMSwKIAkJICAgIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzYsIDgsIDApLAogCiBTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg1IiwgIkFJRjEgUGxheWJhY2siLCA1LApAQCAtMTEzNywxNyArMTIxMCwyMyBAQAogCXsgIkNoYXJnZSBQdW1wIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCXsgIk1JQ0IxIiwgTlVMTCwgIkxETzIiIH0sCisJeyAiTUlDQjEiLCBOVUxMLCAiTUlDQjEgQXVkaW8iIH0sCisJeyAiTUlDQjEiLCBOVUxMLCAiQmFuZGdhcCIgfSwKIAl7ICJNSUNCMiIsIE5VTEwsICJMRE8yIiB9LAorCXsgIk1JQ0IyIiwgTlVMTCwgIk1JQ0IyIEF1ZGlvIiB9LAorCXsgIk1JQ0IyIiwgTlVMTCwgIkJhbmRnYXAiIH0sCiAKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjJMTiIgfSwKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjJMUCIgfSwKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjFMTiIgfSwKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjFMUCIgfSwKKwl7ICJJTjFMIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4yUk4iIH0sCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4yUlAiIH0sCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4xUk4iIH0sCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4xUlAiIH0sCisJeyAiSU4xUiBQR0EiLCBOVUxMLCAiQmFuZGdhcCIgfSwKIAogCXsgIkFEQ0wiLCBOVUxMLCAiSU4xTCBQR0EiIH0sCiAKQEAgLTEyODEsNiArMTM2MCw3IEBACiAJeyAiREFDMlIiLCBOVUxMLCAiREFDMlIgTWl4ZXIiIH0sCiAKIAl7ICJIUE9VVDJMIFBHQSIsIE5VTEwsICJDaGFyZ2UgUHVtcCIgfSwKKwl7ICJIUE9VVDJMIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCXsgIkhQT1VUMkwgUEdBIiwgTlVMTCwgIkRBQzJMIiB9LAogCXsgIkhQT1VUMkxfRExZIiwgTlVMTCwgIkhQT1VUMkwgUEdBIiB9LAogCXsgIkhQT1VUMkxfRENTIiwgTlVMTCwgIkhQT1VUMkxfRExZIiB9LApAQCAtMTI4OCw2ICsxMzY4LDcgQEAKIAl7ICJIUE9VVDJMX1JNVl9TSE9SVCIsIE5VTEwsICJIUE9VVDJMX09VVFAiIH0sCiAKIAl7ICJIUE9VVDJSIFBHQSIsIE5VTEwsICJDaGFyZ2UgUHVtcCIgfSwKKwl7ICJIUE9VVDJSIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCXsgIkhQT1VUMlIgUEdBIiwgTlVMTCwgIkRBQzJSIiB9LAogCXsgIkhQT1VUMlJfRExZIiwgTlVMTCwgIkhQT1VUMlIgUEdBIiB9LAogCXsgIkhQT1VUMlJfRENTIiwgTlVMTCwgIkhQT1VUMlJfRExZIiB9LApAQCAtMTI5NSw2ICsxMzc2LDcgQEAKIAl7ICJIUE9VVDJSX1JNVl9TSE9SVCIsIE5VTEwsICJIUE9VVDJSX09VVFAiIH0sCiAKIAl7ICJIUE9VVDFMIFBHQSIsIE5VTEwsICJDaGFyZ2UgUHVtcCIgfSwKKwl7ICJIUE9VVDFMIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCXsgIkhQT1VUMUwgUEdBIiwgTlVMTCwgIkRBQzFMIiB9LAogCXsgIkhQT1VUMUxfRExZIiwgTlVMTCwgIkhQT1VUMUwgUEdBIiB9LAogCXsgIkhQT1VUMUxfRENTIiwgTlVMTCwgIkhQT1VUMUxfRExZIiB9LApAQCAtMTMwMiw2ICsxMzg0LDcgQEAKIAl7ICJIUE9VVDFMX1JNVl9TSE9SVCIsIE5VTEwsICJIUE9VVDFMX09VVFAiIH0sCiAKIAl7ICJIUE9VVDFSIFBHQSIsIE5VTEwsICJDaGFyZ2UgUHVtcCIgfSwKKwl7ICJIUE9VVDFSIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCXsgIkhQT1VUMVIgUEdBIiwgTlVMTCwgIkRBQzFSIiB9LAogCXsgIkhQT1VUMVJfRExZIiwgTlVMTCwgIkhQT1VUMVIgUEdBIiB9LAogCXsgIkhQT1VUMVJfRENTIiwgTlVMTCwgIkhQT1VUMVJfRExZIiB9LApAQCAtMTYyMCwxNCArMTcwMyw3IEBACiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046Ci0JCWJyZWFrOwotCiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKLQkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzEsCi0JCQkJCSAgICBXTTg5OTZfQkdfRU5BLCBXTTg5OTZfQkdfRU5BKTsKLQkJCW1zbGVlcCgyKTsKLQkJfQogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CkBAIC0xNjUwLDkgKzE3MjYsNiBAQAogCQkJY29kZWMtPmNhY2hlX29ubHkgPSBmYWxzZTsKIAkJCXNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CiAJCX0KLQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF8xLAotCQkJCSAgICBXTTg5OTZfQkdfRU5BLCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CkBAIC0xODQ3LDcgKzE5MjAsNyBAQAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGxyY2xrX3JlZywgV004OTk2X0FJRjFSWF9SQVRFX01BU0ssCiAJCQkgICAgbHJjbGspOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9BSUZfQ0xPQ0tJTkdfMiwKLQkJCSAgICBXTTg5OTZfRFNQMV9ESVZfU0hJRlQgPDwgZHNwX3NoaWZ0LCBkc3ApOworCQkJICAgIFdNODk5Nl9EU1AxX0RJVl9NQVNLIDw8IGRzcF9zaGlmdCwgZHNwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA0MSw3ICsyMTE0LDcgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKIAlzdHJ1Y3QgX2ZsbF9kaXYgZmxsX2RpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JaW50IHJldCwgcmVnOworCWludCByZXQsIHJlZywgcmV0cnk7CiAKIAkvKiBBbnkgY2hhbmdlPyAqLwogCWlmIChzb3VyY2UgPT0gd204OTk2LT5mbGxfc3JjICYmIEZyZWYgPT0gd204OTk2LT5mbGxfZnJlZiAmJgpAQCAtMjA1Nyw2ICsyMTMwLDggQEAKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0ZMTF9DT05UUk9MXzEsCiAJCQkJICAgIFdNODk5Nl9GTExfRU5BLCAwKTsKIAorCQl3bTg5OTZfYmdfZGlzYWJsZShjb2RlYyk7CisKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMTExLDYgKzIxODYsMTEgQEAKIAogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5Nl9GTExfRUZTXzEsIGZsbF9kaXYubGFtYmRhKTsKIAorCS8qIEVuYWJsZSB0aGUgYmFuZGdhcCBpZiBpdCdzIG5vdCBhbHJlYWR5IGVuYWJsZWQgKi8KKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5Nl9GTExfQ09OVFJPTF8xKTsKKwlpZiAoIShyZXQgJiBXTTg5OTZfRkxMX0VOQSkpCisJCXdtODk5Nl9iZ19lbmFibGUoY29kZWMpOworCiAJLyogQ2xlYXIgYW55IHBlbmRpbmcgY29tcGxldGlvbnMgKGVnLCBmcm9tIGZhaWxlZCBzdGFydHVwcykgKi8KIAl0cnlfd2FpdF9mb3JfY29tcGxldGlvbigmd204OTk2LT5mbGxfbG9jayk7CiAKQEAgLTIxMjgsMTcgKzIyMDgsMjkgQEAKIAllbHNlCiAJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDIpOwogCi0JLyogQWxsb3cgc3Vic3RhbnRpYWxseSBsb25nZXIgaWYgd2UndmUgYWN0dWFsbHkgZ290IHRoZSBJUlEgKi8KKwkvKiBBbGxvdyBzdWJzdGFudGlhbGx5IGxvbmdlciBpZiB3ZSd2ZSBhY3R1YWxseSBnb3QgdGhlIElSUSwgcG9sbAorCSAqIGF0IGEgc2xpZ2h0bHkgaGlnaGVyIHJhdGUgaWYgd2UgZG9uJ3QuCisJICovCiAJaWYgKGkyYy0+aXJxKQotCQl0aW1lb3V0ICo9IDEwMDA7CisJCXRpbWVvdXQgKj0gMTA7CisJZWxzZQorCQl0aW1lb3V0IC89IDI7CiAKLQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndtODk5Ni0+ZmxsX2xvY2ssIHRpbWVvdXQpOworCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDEwOyByZXRyeSsrKSB7CisJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd204OTk2LT5mbGxfbG9jaywKKwkJCQkJCSAgdGltZW91dCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJV0FSTl9PTighaTJjLT5pcnEpOworCQkJYnJlYWs7CisJCX0KIAotCWlmIChyZXQgPT0gMCAmJiBpMmMtPmlycSkgeworCQlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5Nl9JTlRFUlJVUFRfUkFXX1NUQVRVU18yKTsKKwkJaWYgKHJldCAmIFdNODk5Nl9GTExfTE9DS19TVFMpCisJCQlicmVhazsKKwl9CisJaWYgKHJldHJ5ID09IDEwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBGTExcbiIpOwogCQlyZXQgPSAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJldCA9IDA7CiAJfQogCiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRkxMIGNvbmZpZ3VyZWQgZm9yICVkSHotPiVkSHpcbiIsIEZyZWYsIEZvdXQpOwpAQCAtMjI5NywxMiArMjM4OSw5NCBAQAogCiAJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHdlJ3JlIG9mZiAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9JTlRFUlJVUFRfU1RBVFVTXzJfTUFTSywKLQkJCSAgICBXTTg5OTZfSU1fTUlDRF9FSU5ULCAwKTsKKwkJCSAgICBXTTg5OTZfSU1fTUlDRF9FSU5UIHwgV004OTk2X0hQX0RPTkVfRUlOVCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdtODk5Nl9kZXRlY3QpOwogCitzdGF0aWMgdm9pZCB3bTg5OTZfaHBkZXRfaXJxKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd204OTk2X3ByaXYgKndtODk5NiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCB2YWwsIHJlZywgcmVwb3J0OworCisJLyogQXNzdW1lIGhlYWRwaG9uZSBpbiBlcnJvciBjb25kaXRpb25zOyB3ZSBuZWVkIHRvIHJlcG9ydAorCSAqIHNvbWV0aGluZyBvciB3ZSBzdGFsbCBvdXIgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlyZXBvcnQgPSBTTkRfSkFDS19IRUFEUEhPTkU7CisKKwlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5Nl9IRUFEUEhPTkVfREVURUNUXzIpOworCWlmIChyZWcgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZWFkIEhQREVUIHN0YXR1c1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKHJlZyAmIFdNODk5Nl9IUF9ET05FKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJHb3QgSFBERVQgSVJRIGJ1dCBIUERFVCBpcyBidXN5XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJdmFsID0gcmVnICYgV004OTk2X0hQX0xWTF9NQVNLOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiSFBERVQgbWVhc3VyZWQgJWQgb2htc1xuIiwgdmFsKTsKKworCS8qIElmIHdlJ3ZlIGdvdCBoaWdoIGVub3VnaCBpbXBlZGVuY2UgdGhlbiByZXBvcnQgYXMgbGluZSwKKwkgKiBvdGhlcndpc2UgYXNzdW1lIGhlYWRwaG9uZS4KKwkgKi8KKwlpZiAodmFsID49IDEyNikKKwkJcmVwb3J0ID0gU05EX0pBQ0tfTElORU9VVDsKKwllbHNlCisJCXJlcG9ydCA9IFNORF9KQUNLX0hFQURQSE9ORTsKKworb3V0OgorCWlmICh3bTg5OTYtPmphY2tfbWljKQorCQlyZXBvcnQgfD0gU05EX0pBQ0tfTUlDUk9QSE9ORTsKKworCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCByZXBvcnQsCisJCQkgICAgU05EX0pBQ0tfTElORU9VVCB8IFNORF9KQUNLX0hFQURTRVQpOworCisJd204OTk2LT5kZXRlY3RpbmcgPSBmYWxzZTsKKworCS8qIElmIHRoZSBvdXRwdXQgaXNuJ3QgcnVubmluZyByZS1jbGFtcCBpdCAqLworCWlmICghKHNuZF9zb2NfcmVhZChjb2RlYywgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfMSkgJgorCSAgICAgIChXTTg5OTZfSFBPVVQxTF9FTkEgfCBXTTg5OTZfSFBPVVQxUl9STVZfU0hPUlQpKSkKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0FOQUxPR1VFX0hQXzEsCisJCQkJICAgIFdNODk5Nl9IUE9VVDFMX1JNVl9TSE9SVCB8CisJCQkJICAgIFdNODk5Nl9IUE9VVDFSX1JNVl9TSE9SVCwgMCk7CisKKwkvKiBHbyBiYWNrIHRvIGxvb2tpbmcgYXQgdGhlIG1pY3JvcGhvbmUgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTZfQUNDRVNTT1JZX0RFVEVDVF9NT0RFXzEsCisJCQkgICAgV004OTk2X0pEX01PREVfTUFTSywgMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X01JQ19ERVRFQ1RfMSwgV004OTk2X01JQ0RfRU5BLAorCQkJICAgIFdNODk5Nl9NSUNEX0VOQSk7CisKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiQmFuZGdhcCIpOworCXNuZF9zb2NfZGFwbV9zeW5jKCZjb2RlYy0+ZGFwbSk7Cit9CisKK3N0YXRpYyB2b2lkIHdtODk5Nl9ocGRldF9zdGFydChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJLyogVW5jbGFtcCB0aGUgb3V0cHV0LCB3ZSBjYW4ndCBtZWFzdXJlIHdoaWxlIHdlJ3JlIHNob3J0aW5nIGl0ICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0FOQUxPR1VFX0hQXzEsCisJCQkgICAgV004OTk2X0hQT1VUMUxfUk1WX1NIT1JUIHwKKwkJCSAgICBXTTg5OTZfSFBPVVQxUl9STVZfU0hPUlQsCisJCQkgICAgV004OTk2X0hQT1VUMUxfUk1WX1NIT1JUIHwKKwkJCSAgICBXTTg5OTZfSFBPVVQxUl9STVZfU0hPUlQpOworCisJLyogV2UgbmVlZCBiYW5kZ2FwIGZvciBIUERFVCAqLworCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkJhbmRnYXAiKTsKKwlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCisJLyogR28gaW50byBoZWFkcGhvbmUgZGV0ZWN0IGxlZnQgbW9kZSAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9NSUNfREVURUNUXzEsIFdNODk5Nl9NSUNEX0VOQSwgMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0FDQ0VTU09SWV9ERVRFQ1RfTU9ERV8xLAorCQkJICAgIFdNODk5Nl9KRF9NT0RFX01BU0ssIDEpOworCisJLyogVHJpZ2dlciBhIG1lYXN1cmVtZW50ICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0hFQURQSE9ORV9ERVRFQ1RfMSwKKwkJCSAgICBXTTg5OTZfSFBfUE9MTCwgV004OTk2X0hQX1BPTEwpOworfQorCiBzdGF0aWMgdm9pZCB3bTg5OTZfbWljZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODk5Nl9wcml2ICp3bTg5OTYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKQEAgLTIzMjMsMjggKzI0OTcsMzYgQEAKIAkJd204OTk2LT5qYWNrX21pYyA9IGZhbHNlOwogCQl3bTg5OTYtPmRldGVjdGluZyA9IHRydWU7CiAJCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCAwLAotCQkJCSAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzApOworCQkJCSAgICBTTkRfSkFDS19MSU5FT1VUIHwgU05EX0pBQ0tfSEVBRFNFVCB8CisJCQkJICAgIFNORF9KQUNLX0JUTl8wKTsKKwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTZfTUlDX0RFVEVDVF8xLAogCQkJCSAgICBXTTg5OTZfTUlDRF9SQVRFX01BU0ssCiAJCQkJICAgIFdNODk5Nl9NSUNEX1JBVEVfTUFTSyk7CiAJCXJldHVybjsKIAl9CiAKLQkvKiBJZiB0aGUgbWVhc3VyZW1lbnQgaXMgdmVyeSBoaWdoIHdlJ3ZlIGdvdCBhIG1pY3JvcGhvbmUgYnV0Ci0JICogZG8gYSBsaXR0bGUgZGVib3VuY2UgdG8gYWNjb3VudCBmb3IgbWVjaGFuaWNhbCBpc3N1ZXMuCisJLyogSWYgdGhlIG1lYXN1cmVtZW50IGlzIHZlcnkgaGlnaCB3ZSd2ZSBnb3QgYSBtaWNyb3Bob25lLAorCSAqIGVpdGhlciB3ZSBqdXN0IGRldGVjdGVkIG9uZSBvciBpZiB3ZSBhbHJlYWR5IHJlcG9ydGVkIHRoZW4KKwkgKiB3ZSd2ZSBnb3QgYSBidXR0b24gcmVsZWFzZSBldmVudC4KIAkgKi8KIAlpZiAodmFsICYgMHg0MDApIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiTWljcm9waG9uZSBkZXRlY3RlZFxuIik7Ci0JCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCBTTkRfSkFDS19IRUFEU0VULAotCQkJCSAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzApOwotCQl3bTg5OTYtPmphY2tfbWljID0gdHJ1ZTsKLQkJd204OTk2LT5kZXRlY3RpbmcgPSBmYWxzZTsKKwkJaWYgKHdtODk5Ni0+ZGV0ZWN0aW5nKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKKwkJCXdtODk5Ni0+amFja19taWMgPSB0cnVlOworCQkJd204OTk2X2hwZGV0X3N0YXJ0KGNvZGVjKTsKIAotCQkvKiBJbmNyZWFzZSBwb2xsIHJhdGUgdG8gZ2l2ZSBiZXR0ZXIgcmVzcG9uc2l2ZW5lc3MKLQkJICogZm9yIGJ1dHRvbnMgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X01JQ19ERVRFQ1RfMSwKLQkJCQkgICAgV004OTk2X01JQ0RfUkFURV9NQVNLLAotCQkJCSAgICA1IDw8IFdNODk5Nl9NSUNEX1JBVEVfU0hJRlQpOworCQkJLyogSW5jcmVhc2UgcG9sbCByYXRlIHRvIGdpdmUgYmV0dGVyIHJlc3BvbnNpdmVuZXNzCisJCQkgKiBmb3IgYnV0dG9ucyAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X01JQ19ERVRFQ1RfMSwKKwkJCQkJICAgIFdNODk5Nl9NSUNEX1JBVEVfTUFTSywKKwkJCQkJICAgIDUgPDwgV004OTk2X01JQ0RfUkFURV9TSElGVCk7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWMgYnV0dG9uIHVwXG4iKTsKKwkJCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCAwLCBTTkRfSkFDS19CVE5fMCk7CisJCX0KKworCQlyZXR1cm47CiAJfQogCiAJLyogSWYgd2UgZGV0ZWN0ZWQgYSBsb3dlciBpbXBlZGVuY2UgZHVyaW5nIGluaXRpYWwgc3RhcnR1cApAQCAtMjM3NiwxNSArMjU1OCwxMSBAQAogCWlmICh2YWwgJiAweDNmYykgewogCQlpZiAod204OTk2LT5qYWNrX21pYykgewogCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiTWljIGJ1dHRvbiBkZXRlY3RlZFxuIik7Ci0JCQlzbmRfc29jX2phY2tfcmVwb3J0KHdtODk5Ni0+amFjaywKLQkJCQkJICAgIFNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19CVE5fMCwKLQkJCQkJICAgIFNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19CVE5fMCk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJIZWFkcGhvbmUgZGV0ZWN0ZWRcbiIpOwotCQkJc25kX3NvY19qYWNrX3JlcG9ydCh3bTg5OTYtPmphY2ssCi0JCQkJCSAgICBTTkRfSkFDS19IRUFEUEhPTkUsCi0JCQkJCSAgICBTTkRfSkFDS19IRUFEU0VUIHwKKwkJCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCBTTkRfSkFDS19CVE5fMCwKIAkJCQkJICAgIFNORF9KQUNLX0JUTl8wKTsKKwkJfSBlbHNlIGlmICh3bTg5OTYtPmRldGVjdGluZykgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiSGVhZHBob25lIGRldGVjdGVkXG4iKTsKKwkJCXdtODk5Nl9ocGRldF9zdGFydChjb2RlYyk7CiAKIAkJCS8qIEluY3JlYXNlIHRoZSBkZXRlY3Rpb24gcmF0ZSBhIGJpdCBmb3IKIAkJCSAqIHJlc3BvbnNpdmVuZXNzLgpAQCAtMjM5Miw4ICsyNTcwLDYgQEAKIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9NSUNfREVURUNUXzEsCiAJCQkJCSAgICBXTTg5OTZfTUlDRF9SQVRFX01BU0ssCiAJCQkJCSAgICA3IDw8IFdNODk5Nl9NSUNEX1JBVEVfU0hJRlQpOwotCi0JCQl3bTg5OTYtPmRldGVjdGluZyA9IGZhbHNlOwogCQl9CiAJfQogfQpAQCAtMjQxMiw2ICsyNTg4LDkgQEAKIAl9CiAJaXJxX3ZhbCAmPSB+c25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTZfSU5URVJSVVBUX1NUQVRVU18yX01BU0spOwogCisJaWYgKCFpcnFfdmFsKQorCQlyZXR1cm4gSVJRX05PTkU7CisKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTZfSU5URVJSVVBUX1NUQVRVU18yLCBpcnFfdmFsKTsKIAogCWlmIChpcnFfdmFsICYgKFdNODk5Nl9EQ1NfRE9ORV8wMV9FSU5UIHwgV004OTk2X0RDU19ET05FXzIzX0VJTlQpKSB7CkBAIC0yNDMwLDEwICsyNjA5LDEwIEBACiAJaWYgKGlycV92YWwgJiBXTTg5OTZfTUlDRF9FSU5UKQogCQl3bTg5OTZfbWljZChjb2RlYyk7CiAKLQlpZiAoaXJxX3ZhbCkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCWVsc2UKLQkJcmV0dXJuIElSUV9OT05FOworCWlmIChpcnFfdmFsICYgV004OTk2X0hQX0RPTkVfRUlOVCkKKwkJd204OTk2X2hwZGV0X2lycShjb2RlYyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB3bTg5OTZfZWRnZV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKQEAgLTI1MjcsNyArMjcwNiw2IEBACiAJaW5pdF9jb21wbGV0aW9uKCZ3bTg5OTYtPmZsbF9sb2NrKTsKIAogCWRhcG0tPmlkbGVfYmlhc19vZmYgPSB0cnVlOwotCWRhcG0tPmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19JMkMpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtMjU0OCw3ICsyNzI2LDEzIEBACiAJd204OTk2LT5kaXNhYmxlX25iWzBdLm5vdGlmaWVyX2NhbGwgPSB3bTg5OTZfcmVndWxhdG9yX2V2ZW50XzA7CiAJd204OTk2LT5kaXNhYmxlX25iWzFdLm5vdGlmaWVyX2NhbGwgPSB3bTg5OTZfcmVndWxhdG9yX2V2ZW50XzE7CiAJd204OTk2LT5kaXNhYmxlX25iWzJdLm5vdGlmaWVyX2NhbGwgPSB3bTg5OTZfcmVndWxhdG9yX2V2ZW50XzI7Ci0Jd204OTk2LT5kaXNhYmxlX25iWzNdLm5vdGlmaWVyX2NhbGwgPSB3bTg5OTZfcmVndWxhdG9yX2V2ZW50XzM7CisKKwl3bTg5OTYtPmNwdmRkID0gcmVndWxhdG9yX2dldCgmaTJjLT5kZXYsICJDUFZERCIpOworCWlmIChJU19FUlIod204OTk2LT5jcHZkZCkpIHsKKwkJcmV0ID0gUFRSX0VSUih3bTg5OTYtPmNwdmRkKTsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gZ2V0IENQVkREOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZ2V0OworCX0KIAogCS8qIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBtb3ZlZCBpbnRvIHRoZSByZWd1bGF0b3IgY29yZSAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5Ni0+c3VwcGxpZXMpOyBpKyspIHsKQEAgLTI1NjUsNyArMjc0OSw3IEBACiAJCQkJICAgIHdtODk5Ni0+c3VwcGxpZXMpOwogCWlmIChyZXQgIT0gMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfZ2V0OworCQlnb3RvIGVycl9jcHZkZDsKIAl9CiAKIAlpZiAod204OTk2LT5wZGF0YS5sZG9fZW5hID49IDApIHsKQEAgLTI4MDgsNiArMjk5Miw4IEBACiAJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHdtODk5Ni0+cGRhdGEubGRvX2VuYSwgMCk7CiAKIAlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204OTk2LT5zdXBwbGllcyksIHdtODk5Ni0+c3VwcGxpZXMpOworZXJyX2NwdmRkOgorCXJlZ3VsYXRvcl9wdXQod204OTk2LT5jcHZkZCk7CiBlcnJfZ2V0OgogCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRSh3bTg5OTYtPnN1cHBsaWVzKSwgd204OTk2LT5zdXBwbGllcyk7CiBlcnI6CkBAIC0yODMxLDYgKzMwMTcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5Ni0+c3VwcGxpZXMpOyBpKyspCiAJCXJlZ3VsYXRvcl91bnJlZ2lzdGVyX25vdGlmaWVyKHdtODk5Ni0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCiAJCQkJCSAgICAgICZ3bTg5OTYtPmRpc2FibGVfbmJbaV0pOworCXJlZ3VsYXRvcl9wdXQod204OTk2LT5jcHZkZCk7CiAJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtODk5Ni0+c3VwcGxpZXMpLCB3bTg5OTYtPnN1cHBsaWVzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKaW5kZXggYTQ2OTEzMi4uM2NkMzVhMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCkBAIC0xNTcsNyArMTU3LDYgQEAKIAogc3RydWN0IHdtOTA4MV9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJaW50IHN5c2Nsa19zb3VyY2U7CiAJaW50IG1jbGtfcmF0ZTsKIAlpbnQgc3lzY2xrX3JhdGU7CkBAIC0xNzQsNiArMTczLDcgQEAKIHsKIAlzd2l0Y2ggKHJlZykgewogCWNhc2UgV005MDgxX1NPRlRXQVJFX1JFU0VUOgorCWNhc2UgV005MDgxX0lOVEVSUlVQVF9TVEFUVVM6CiAJCXJldHVybiAxOwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwpAQCAtODIwLDcgKzgyMCw3IEBACiAJCS8qIFZNSUQgMioyNDBrICovCiAJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV005MDgxX0JJQVNfQ09OVFJPTF8xKTsKIAkJcmVnICY9IH5XTTkwODFfVk1JRF9TRUxfTUFTSzsKLQkJcmVnIHw9IDB4NDA7CisJCXJlZyB8PSAweDA0OwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTkwODFfVk1JRF9DT05UUk9MLCByZWcpOwogCiAJCS8qIFN0YW5kYnkgYmlhcyBjdXJyZW50IG9uICovCkBAIC0xMTIwLDggKzExMjAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtOTA4MV9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCSAgICAgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCitzdGF0aWMgaW50IHdtOTA4MV9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGNsa19pZCwKKwkJCSAgICAgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCiB7CiAJc3RydWN0IHdtOTA4MV9wcml2ICp3bTkwODEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIApAQCAtMTIxMyw3ICsxMjEzLDYgQEAKIAlpbnQgcmV0OwogCXUxNiByZWc7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd205MDgxLT5jb250cm9sX2RhdGE7CiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCB3bTkwODEtPmNvbnRyb2xfdHlwZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKQEAgLTEyNTAsOCArMTI0OSw2IEBACiAJc25kX3NvY193cml0ZShjb2RlYywgV005MDgxX0FOQUxPR1VFX1NQRUFLRVJfUEdBLAogCQkgICAgIHJlZyB8IFdNOTA4MV9TUEtQR0FaQyk7CiAKLQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgd205MDgxX3NuZF9jb250cm9scywKLQkJCSAgICAgQVJSQVlfU0laRSh3bTkwODFfc25kX2NvbnRyb2xzKSk7CiAJaWYgKCF3bTkwODEtPnBkYXRhLm51bV9yZXR1bmVfY29uZmlncykgewogCQlkZXZfZGJnKGNvZGVjLT5kZXYsCiAJCQkiTm8gUmVUdW5lIE1vYmlsZSBkYXRhLCB1c2luZyBub3JtYWwgRVFcbiIpOwpAQCAtMTMxMSw2ICsxMzA4LDggQEAKIAkucmVnX2NhY2hlX2RlZmF1bHQgPSB3bTkwODFfcmVnX2RlZmF1bHRzLAogCS52b2xhdGlsZV9yZWdpc3RlciA9IHdtOTA4MV92b2xhdGlsZV9yZWdpc3RlciwKIAorCS5jb250cm9scyAgICAgICAgID0gd205MDgxX3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzICAgICA9IEFSUkFZX1NJWkUod205MDgxX3NuZF9jb250cm9scyksCiAJLmRhcG1fd2lkZ2V0cwkgID0gd205MDgxX2RhcG1fd2lkZ2V0cywKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod205MDgxX2RhcG1fd2lkZ2V0cyksCiAJLmRhcG1fcm91dGVzICAgICA9IHdtOTA4MV9hdWRpb19wYXRocywKQEAgLTEzMzAsNyArMTMyOSw2IEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTkwODEpOwogCXdtOTA4MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7Ci0Jd205MDgxLT5jb250cm9sX2RhdGEgPSBpMmM7CiAKIAlpZiAoZGV2X2dldF9wbGF0ZGF0YSgmaTJjLT5kZXYpKQogCQltZW1jcHkoJndtOTA4MS0+cGRhdGEsIGRldl9nZXRfcGxhdGRhdGEoJmkyYy0+ZGV2KSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jCmluZGV4IDRkZTEyMjAuLjJiNTI1MmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYwpAQCAtMTM5LDkgKzEzOSw3IEBACiAKIC8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gc2F2ZSB0aGUgY29udGV4dCAqLwogc3RydWN0IHdtOTA5MF9wcml2IHsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJc3RydWN0IHdtOTA5MF9wbGF0Zm9ybV9kYXRhIHBkYXRhOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKIHN0YXRpYyBpbnQgd205MDkwX3ZvbGF0aWxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKQEAgLTU1MCwxMCArNTQ4LDggQEAKIAogc3RhdGljIGludCB3bTkwOTBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCB3bTkwOTBfcHJpdiAqd205MDkwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTkwOTAtPmNvbnRyb2xfZGF0YTsKIAlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfSTJDKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwpAQCAtNjYyLDggKzY1OCw2IEBACiAJCSAgICAgICBzaXplb2Yod205MDkwLT5wZGF0YSkpOwogCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd205MDkwKTsKLQl3bTkwOTAtPmNvbnRyb2xfZGF0YSA9IGkyYzsKLQltdXRleF9pbml0KCZ3bTkwOTAtPm11dGV4KTsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKIAkJCSZzb2NfY29kZWNfZGV2X3dtOTA5MCwgIE5VTEwsIDApOwpAQCAtNjg0LDYgKzY3OCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bTkwOTBfaWRbXSA9IHsKIAl7ICJ3bTkwOTAiLCAwIH0sCisJeyAid205MDkzIiwgMCB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB3bTkwOTBfaWQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuYwppbmRleCBlNzYzYzU0Li44NGYzM2Q0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtMTE2LDE0ICsxMTcsMjMgQEAKIHsKIAlzdHJ1Y3Qgd21faHVic19kYXRhICpodWJzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJczggb2Zmc2V0OwotCXUxNiByZWcsIHJlZ19sLCByZWdfciwgZGNzX2NmZzsKKwl1MTYgcmVnLCByZWdfbCwgcmVnX3IsIGRjc19jZmcsIGRjc19yZWc7CisKKwlzd2l0Y2ggKGh1YnMtPmRjc19yZWFkYmFja19tb2RlKSB7CisJY2FzZSAyOgorCQlkY3NfcmVnID0gV004OTk0X0RDX1NFUlZPXzRFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkY3NfcmVnID0gV004OTkzX0RDX1NFUlZPXzM7CisJCWJyZWFrOworCX0KIAogCS8qIElmIHdlJ3JlIHVzaW5nIGEgZGlnaXRhbCBvbmx5IHBhdGggYW5kIGhhdmUgYSBwcmV2aW91c2x5CiAJICogY2FsbGlicmF0ZWQgREMgc2Vydm8gb2Zmc2V0IHN0b3JlZCB0aGVuIHVzZSB0aGF0LiAqLwogCWlmIChodWJzLT5jbGFzc193ICYmIGh1YnMtPmNsYXNzX3dfZGNzKSB7CiAJCWRldl9kYmcoY29kZWMtPmRldiwgIlVzaW5nIGNhY2hlZCBEQyBzZXJ2byBvZmZzZXQgJXhcbiIsCiAJCQlodWJzLT5jbGFzc193X2Rjcyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5M19EQ19TRVJWT18zLCBodWJzLT5jbGFzc193X2Rjcyk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGRjc19yZWcsIGh1YnMtPmNsYXNzX3dfZGNzKTsKIAkJd2FpdF9mb3JfZGNfc2Vydm8oY29kZWMsCiAJCQkJICBXTTg5OTNfRENTX1RSSUdfREFDX1dSXzAgfAogCQkJCSAgV004OTkzX0RDU19UUklHX0RBQ19XUl8xKTsKQEAgLTE1NCw4ICsxNjQsOSBAQAogCQlyZWdfciA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkzX0RDX1NFUlZPX1JFQURCQUNLXzIpCiAJCQkmIFdNODk5M19EQ1NfSU5URUdfQ0hBTl8xX01BU0s7CiAJCWJyZWFrOworCWNhc2UgMjoKIAljYXNlIDE6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkzX0RDX1NFUlZPXzMpOworCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIGRjc19yZWcpOwogCQlyZWdfciA9IChyZWcgJiBXTTg5OTNfRENTX0RBQ19XUl9WQUxfMV9NQVNLKQogCQkJPj4gV004OTkzX0RDU19EQUNfV1JfVkFMXzFfU0hJRlQ7CiAJCXJlZ19sID0gcmVnICYgV004OTkzX0RDU19EQUNfV1JfVkFMXzBfTUFTSzsKQEAgLTE2OCwyNCArMTc5LDI1IEBACiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRENTIGlucHV0OiAleCAleFxuIiwgcmVnX2wsIHJlZ19yKTsKIAogCS8qIEFwcGx5IGNvcnJlY3Rpb24gdG8gREMgc2Vydm8gcmVzdWx0ICovCi0JaWYgKGh1YnMtPmRjc19jb2RlcykgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJBcHBseWluZyAlZCBjb2RlIERDIHNlcnZvIGNvcnJlY3Rpb25cbiIsCi0JCQlodWJzLT5kY3NfY29kZXMpOworCWlmIChodWJzLT5kY3NfY29kZXNfbCB8fCBodWJzLT5kY3NfY29kZXNfcikgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkiQXBwbHlpbmcgJWQvJWQgY29kZSBEQyBzZXJ2byBjb3JyZWN0aW9uXG4iLAorCQkJaHVicy0+ZGNzX2NvZGVzX2wsIGh1YnMtPmRjc19jb2Rlc19yKTsKIAogCQkvKiBIUE9VVDFSICovCiAJCW9mZnNldCA9IHJlZ19yOwotCQlvZmZzZXQgKz0gaHVicy0+ZGNzX2NvZGVzOworCQlvZmZzZXQgKz0gaHVicy0+ZGNzX2NvZGVzX3I7CiAJCWRjc19jZmcgPSAodTgpb2Zmc2V0IDw8IFdNODk5M19EQ1NfREFDX1dSX1ZBTF8xX1NISUZUOwogCiAJCS8qIEhQT1VUMUwgKi8KIAkJb2Zmc2V0ID0gcmVnX2w7Ci0JCW9mZnNldCArPSBodWJzLT5kY3NfY29kZXM7CisJCW9mZnNldCArPSBodWJzLT5kY3NfY29kZXNfbDsKIAkJZGNzX2NmZyB8PSAodTgpb2Zmc2V0OwogCiAJCWRldl9kYmcoY29kZWMtPmRldiwgIkRDUyByZXN1bHQ6ICV4XG4iLCBkY3NfY2ZnKTsKIAogCQkvKiBEbyBpdCAqLwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTNfRENfU0VSVk9fMywgZGNzX2NmZyk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGRjc19yZWcsIGRjc19jZmcpOwogCQl3YWl0X2Zvcl9kY19zZXJ2byhjb2RlYywKIAkJCQkgIFdNODk5M19EQ1NfVFJJR19EQUNfV1JfMCB8CiAJCQkJICBXTTg5OTNfRENTX1RSSUdfREFDX1dSXzEpOwpAQCAtMjEwLDE0ICsyMjIsMTQgQEAKIAlzdHJ1Y3Qgd21faHVic19kYXRhICpodWJzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfcHV0X3ZvbHN3XzJyKGtjb250cm9sLCB1Y29udHJvbCk7CisJcmV0ID0gc25kX3NvY19wdXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKIAogCS8qIFVwZGF0aW5nIHRoZSBhbmFsb2d1ZSBnYWlucyBpbnZhbGlkYXRlcyB0aGUgREMgc2Vydm8gY2FjaGUgKi8KIAlodWJzLT5jbGFzc193X2RjcyA9IDA7CiAKIAkvKiBJZiB3ZSdyZSBhcHBseWluZyBhbiBvZmZzZXQgY29ycmVjdGlvbiB0aGVuIHVwZGF0aW5nIHRoZQogCSAqIGNhbGxpYnJhdGlvbiB3b3VsZCBiZSBsaWtlbHkgdG8gaW50cm9kdWNlIGZ1cnRoZXIgb2Zmc2V0cy4gKi8KLQlpZiAoaHVicy0+ZGNzX2NvZGVzIHx8IGh1YnMtPm5vX3Nlcmllc191cGRhdGUpCisJaWYgKGh1YnMtPmRjc19jb2Rlc19sIHx8IGh1YnMtPmRjc19jb2Rlc19yIHx8IGh1YnMtPm5vX3Nlcmllc191cGRhdGUpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBPbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB0aGUgb3V0cHV0cyBhcmUgYWN0aXZlICovCkBAIC0zNTAsMTkgKzM2MiwxMSBAQAogU09DX0VOVU0oIlNwZWFrZXIgUmVmZXJlbmNlIiwgc3BlYWtlcl9yZWYpLAogU09DX0VOVU0oIlNwZWFrZXIgTW9kZSIsIHNwZWFrZXJfbW9kZSksCiAKLXsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAiSGVhZHBob25lIFZvbHVtZSIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8Ci0JCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCS50bHYucCA9IG91dHBnYV90bHYsCi0JLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3dfMnIsCi0JLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3XzJyLCAucHV0ID0gd204OTkzX3B1dF9kY19zZXJ2bywKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSB7Ci0JCS5yZWcgPSBXTTg5OTNfTEVGVF9PVVRQVVRfVk9MVU1FLAotCQkucnJlZyA9IFdNODk5M19SSUdIVF9PVVRQVVRfVk9MVU1FLAotCQkuc2hpZnQgPSAwLCAubWF4ID0gNjMKLQl9LAotfSwKK1NPQ19ET1VCTEVfUl9FWFRfVExWKCJIZWFkcGhvbmUgVm9sdW1lIiwKKwkJICAgICBXTTg5OTNfTEVGVF9PVVRQVVRfVk9MVU1FLCBXTTg5OTNfUklHSFRfT1VUUFVUX1ZPTFVNRSwKKwkJICAgICAwLCA2MywgMCwgc25kX3NvY19nZXRfdm9sc3csIHdtODk5M19wdXRfZGNfc2Vydm8sCisJCSAgICAgb3V0cGdhX3RsdiksCisKIFNPQ19ET1VCTEVfUigiSGVhZHBob25lIFN3aXRjaCIsIFdNODk5M19MRUZUX09VVFBVVF9WT0xVTUUsCiAJICAgICBXTTg5OTNfUklHSFRfT1VUUFVUX1ZPTFVNRSwgNiwgMSwgMCksCiBTT0NfRE9VQkxFX1IoIkhlYWRwaG9uZSBaQyBTd2l0Y2giLCBXTTg5OTNfTEVGVF9PVVRQVVRfVk9MVU1FLApAQCAtNjk5LDYgKzcwMywxMSBAQAogCXsgIklOMUwgUEdBIiwgIklOMUxQIFN3aXRjaCIsICJJTjFMUCIgfSwKIAl7ICJJTjFMIFBHQSIsICJJTjFMTiBTd2l0Y2giLCAiSU4xTE4iIH0sCiAKKwl7ICJJTjFMIFBHQSIsIE5VTEwsICJWTUlEIiB9LAorCXsgIklOMVIgUEdBIiwgTlVMTCwgIlZNSUQiIH0sCisJeyAiSU4yTCBQR0EiLCBOVUxMLCAiVk1JRCIgfSwKKwl7ICJJTjJSIFBHQSIsIE5VTEwsICJWTUlEIiB9LAorCiAJeyAiSU4xUiBQR0EiLCAiSU4xUlAgU3dpdGNoIiwgIklOMVJQIiB9LAogCXsgIklOMVIgUEdBIiwgIklOMVJOIFN3aXRjaCIsICJJTjFSTiIgfSwKIApAQCAtNzE2LDEyICs3MjUsMTQgQEAKIAl7ICJNSVhJTkwiLCBOVUxMLCAiRGlyZWN0IFZvaWNlIiB9LAogCXsgIk1JWElOTCIsIE5VTEwsICJJTjFMUCIgfSwKIAl7ICJNSVhJTkwiLCBOVUxMLCAiTGVmdCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiTUlYSU5MIiwgTlVMTCwgIlZNSUQiIH0sCiAKIAl7ICJNSVhJTlIiLCAiSU4xUiBTd2l0Y2giLCAiSU4xUiBQR0EiIH0sCiAJeyAiTUlYSU5SIiwgIklOMlIgU3dpdGNoIiwgIklOMlIgUEdBIiB9LAogCXsgIk1JWElOUiIsIE5VTEwsICJEaXJlY3QgVm9pY2UiIH0sCiAJeyAiTUlYSU5SIiwgTlVMTCwgIklOMVJQIiB9LAogCXsgIk1JWElOUiIsIE5VTEwsICJSaWdodCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiTUlYSU5SIiwgTlVMTCwgIlZNSUQiIH0sCiAKIAl7ICJBRENMIiwgTlVMTCwgIk1JWElOTCIgfSwKIAl7ICJBRENSIiwgTlVMTCwgIk1JWElOUiIgfSwKQEAgLTc1Miw2ICs3NjMsNyBAQAogCXsgIkVhcnBpZWNlIE1peGVyIiwgIkxlZnQgT3V0cHV0IFN3aXRjaCIsICJMZWZ0IE91dHB1dCBQR0EiIH0sCiAJeyAiRWFycGllY2UgTWl4ZXIiLCAiUmlnaHQgT3V0cHV0IFN3aXRjaCIsICJSaWdodCBPdXRwdXQgUEdBIiB9LAogCisJeyAiRWFycGllY2UgRHJpdmVyIiwgTlVMTCwgIlZNSUQiIH0sCiAJeyAiRWFycGllY2UgRHJpdmVyIiwgTlVMTCwgIkVhcnBpZWNlIE1peGVyIiB9LAogCXsgIkhQT1VUMk4iLCBOVUxMLCAiRWFycGllY2UgRHJpdmVyIiB9LAogCXsgIkhQT1VUMlAiLCBOVUxMLCAiRWFycGllY2UgRHJpdmVyIiB9LApAQCAtNzc0LDkgKzc4NiwxMSBAQAogCXsgIlNQS1IgQm9vc3QiLCAiU1BLUiBTd2l0Y2giLCAiU1BLUiIgfSwKIAl7ICJTUEtSIEJvb3N0IiwgIlNQS0wgU3dpdGNoIiwgIlNQS0wiIH0sCiAKKwl7ICJTUEtMIERyaXZlciIsIE5VTEwsICJWTUlEIiB9LAogCXsgIlNQS0wgRHJpdmVyIiwgTlVMTCwgIlNQS0wgQm9vc3QiIH0sCiAJeyAiU1BLTCBEcml2ZXIiLCBOVUxMLCAiQ0xLX1NZUyIgfSwKIAorCXsgIlNQS1IgRHJpdmVyIiwgTlVMTCwgIlZNSUQiIH0sCiAJeyAiU1BLUiBEcml2ZXIiLCBOVUxMLCAiU1BLUiBCb29zdCIgfSwKIAl7ICJTUEtSIERyaXZlciIsIE5VTEwsICJDTEtfU1lTIiB9LAogCkBAIC03OTAsMTIgKzgwNCwxOCBAQAogCiAJeyAiSGVhZHBob25lIFBHQSIsIE5VTEwsICJMZWZ0IEhlYWRwaG9uZSBNdXgiIH0sCiAJeyAiSGVhZHBob25lIFBHQSIsIE5VTEwsICJSaWdodCBIZWFkcGhvbmUgTXV4IiB9LAorCXsgIkhlYWRwaG9uZSBQR0EiLCBOVUxMLCAiVk1JRCIgfSwKIAl7ICJIZWFkcGhvbmUgUEdBIiwgTlVMTCwgIkNMS19TWVMiIH0sCiAJeyAiSGVhZHBob25lIFBHQSIsIE5VTEwsICJIZWFkcGhvbmUgU3VwcGx5IiB9LAogCiAJeyAiSFBPVVQxTCIsIE5VTEwsICJIZWFkcGhvbmUgUEdBIiB9LAogCXsgIkhQT1VUMVIiLCBOVUxMLCAiSGVhZHBob25lIFBHQSIgfSwKIAorCXsgIkxJTkVPVVQxTiBEcml2ZXIiLCBOVUxMLCAiVk1JRCIgfSwKKwl7ICJMSU5FT1VUMVAgRHJpdmVyIiwgTlVMTCwgIlZNSUQiIH0sCisJeyAiTElORU9VVDJOIERyaXZlciIsIE5VTEwsICJWTUlEIiB9LAorCXsgIkxJTkVPVVQyUCBEcml2ZXIiLCBOVUxMLCAiVk1JRCIgfSwKKwogCXsgIkxJTkVPVVQxTiIsIE5VTEwsICJMSU5FT1VUMU4gRHJpdmVyIiB9LAogCXsgIkxJTkVPVVQxUCIsIE5VTEwsICJMSU5FT1VUMVAgRHJpdmVyIiB9LAogCXsgIkxJTkVPVVQyTiIsIE5VTEwsICJMSU5FT1VUMk4gRHJpdmVyIiB9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmggYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaAppbmRleCA2NzZiMTI1Li5jNjc0YzdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaApAQCAtMjMsNyArMjMsOCBAQAogCiAvKiBUaGlzICptdXN0KiBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgY29kZWMtPnByaXZhdGVfZGF0YSBzdHJ1Y3QgKi8KIHN0cnVjdCB3bV9odWJzX2RhdGEgewotCWludCBkY3NfY29kZXM7CisJaW50IGRjc19jb2Rlc19sOworCWludCBkY3NfY29kZXNfcjsKIAlpbnQgZGNzX3JlYWRiYWNrX21vZGU7CiAJaW50IGhwX3N0YXJ0dXBfbW9kZTsKIAlpbnQgc2VyaWVzX3N0YXJ0dXA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYwppbmRleCBmZTc5ODQyLi5mNzhjM2YwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKQEAgLTE1MCw4ICsxNTAsNiBAQAogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEluIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWkycy5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1pMnMuYwppbmRleCBkMGQ2MGI4Li4zMDBlMTIxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWkycy5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktaTJzLmMKQEAgLTI2NSw2ICsyNjUsNyBAQAogCXN0cnVjdCBkYXZpbmNpX21jYnNwX2RldiAqZGV2ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7CiAJdW5zaWduZWQgaW50IHBjcjsKIAl1bnNpZ25lZCBpbnQgc3JncjsKKwlib29sIGludl9mcyA9IGZhbHNlOwogCS8qIEF0dGVudGlvbiBzcmdyIGlzIHVwZGF0ZWQgYnkgaHdfcGFyYW1zISAqLwogCXNyZ3IgPSBEQVZJTkNJX01DQlNQX1NSR1JfRlNHTSB8CiAJCURBVklOQ0lfTUNCU1BfU1JHUl9GUEVSKERFRkFVTFRfQklUUEVSU0FNUExFICogMiAtIDEpIHwKQEAgLTMzMCw3ICszMzEsNyBAQAogCQkgKiBtb3JlIGVtcHR5IGJpdCBjbG9jayBzbG90cyBiZXR3ZWVuIGNoYW5uZWxzIGFzIHRoZSBzYW1wbGUKIAkJICogcmF0ZSBpcyBsb3dlcmVkLgogCQkgKi8KLQkJZm10IF49IFNORF9TT0NfREFJRk1UX05CX0lGOworCQlpbnZfZnMgPSB0cnVlOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CiAJCWRldi0+bW9kZSA9IE1PRF9EU1BfQTsKIAkJYnJlYWs7CkBAIC0zOTQsNiArMzk1LDggQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJaWYgKGludl9mcyA9PSB0cnVlKQorCQlwY3IgXj0gKERBVklOQ0lfTUNCU1BfUENSX0ZTWFAgfCBEQVZJTkNJX01DQlNQX1BDUl9GU1JQKTsKIAlkYXZpbmNpX21jYnNwX3dyaXRlX3JlZyhkZXYsIERBVklOQ0lfTUNCU1BfU1JHUl9SRUcsIHNyZ3IpOwogCWRldi0+cGNyID0gcGNyOwogCWRhdmluY2lfbWNic3Bfd3JpdGVfcmVnKGRldiwgREFWSU5DSV9NQ0JTUF9QQ1JfUkVHLCBwY3IpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCmluZGV4IDg1NjYyMzguLjcxNzNkZjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKQEAgLTczMiwxNiArNzMyLDE5IEBACiAJCWRhdmluY2lfaHdfcGFyYW0oZGV2LCBzdWJzdHJlYW0tPnN0cmVhbSk7CiAKIAlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9VODoKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzg6CiAJCWRtYV9wYXJhbXMtPmRhdGFfdHlwZSA9IDE7CiAJCXdvcmRfbGVuZ3RoID0gREFWSU5DSV9BVURJT19XT1JEXzg7CiAJCWJyZWFrOwogCisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1UxNl9MRToKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgogCQlkbWFfcGFyYW1zLT5kYXRhX3R5cGUgPSAyOwogCQl3b3JkX2xlbmd0aCA9IERBVklOQ0lfQVVESU9fV09SRF8xNjsKIAkJYnJlYWs7CiAKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfVTMyX0xFOgogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CiAJCWRtYV9wYXJhbXMtPmRhdGFfdHlwZSA9IDQ7CiAJCXdvcmRfbGVuZ3RoID0gREFWSU5DSV9BVURJT19XT1JEXzMyOwpAQCAtODE4LDYgKzgyMSwxMyBAQAogCiB9OwogCisjZGVmaW5lIERBVklOQ0lfTUNBU1BfUENNX0ZNVFMgKFNORFJWX1BDTV9GTVRCSVRfUzggfCBcCisJCQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSB8IFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSB8IFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UzMl9MRSkKKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGF2aW5jaV9tY2FzcF9kYWlbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJkYXZpbmNpLW1jYXNwLjAiLApAQCAtODI1LDE3ICs4MzUsMTMgQEAKIAkJCS5jaGFubmVsc19taW4JPSAyLAogCQkJLmNoYW5uZWxzX21heCAJPSAyLAogCQkJLnJhdGVzIAkJPSBEQVZJTkNJX01DQVNQX1JBVEVTLAotCQkJLmZvcm1hdHMgCT0gU05EUlZfUENNX0ZNVEJJVF9TOCB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkJCS5mb3JtYXRzCT0gREFWSU5DSV9NQ0FTUF9QQ01fRk1UUywKIAkJfSwKIAkJLmNhcHR1cmUgCT0gewogCQkJLmNoYW5uZWxzX21pbiAJPSAyLAogCQkJLmNoYW5uZWxzX21heCAJPSAyLAogCQkJLnJhdGVzIAkJPSBEQVZJTkNJX01DQVNQX1JBVEVTLAotCQkJLmZvcm1hdHMJPSBTTkRSVl9QQ01fRk1UQklUX1M4IHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAorCQkJLmZvcm1hdHMJPSBEQVZJTkNJX01DQVNQX1BDTV9GTVRTLAogCQl9LAogCQkub3BzIAkJPSAmZGF2aW5jaV9tY2FzcF9kYWlfb3BzLAogCkBAIC04NDYsNyArODUyLDcgQEAKIAkJCS5jaGFubmVsc19taW4JPSAxLAogCQkJLmNoYW5uZWxzX21heAk9IDM4NCwKIAkJCS5yYXRlcwkJPSBEQVZJTkNJX01DQVNQX1JBVEVTLAotCQkJLmZvcm1hdHMJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5mb3JtYXRzCT0gREFWSU5DSV9NQ0FTUF9QQ01fRk1UUywKIAkJfSwKIAkJLm9wcyAJCT0gJmRhdmluY2lfbWNhc3BfZGFpX29wcywKIAl9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMKaW5kZXggYTQ5ZTY2Ny4uZDVmZTA4YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jCkBAIC0xODAsNyArMTgwLDYgQEAKIHsKIAlzdHJ1Y3QgZGF2aW5jaV9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCWludCBsaW5rID0gcHJ0ZC0+YXNwX2xpbmtbMF07CiAJdW5zaWduZWQgaW50IHBlcmlvZF9zaXplOwogCXVuc2lnbmVkIGludCBkbWFfb2Zmc2V0OwogCWRtYV9hZGRyX3QgZG1hX3BvczsKQEAgLTE5OCw3ICsxOTcsOCBAQAogCWZpZm9fbGV2ZWwgPSBwcnRkLT5wYXJhbXMtPmZpZm9fbGV2ZWw7CiAKIAlwcl9kZWJ1ZygiZGF2aW5jaV9wY206IGF1ZGlvX3NldF9kbWFfcGFyYW1zX3BsYXkgY2hhbm5lbCA9ICVkICIKLQkJImRtYV9wdHIgPSAleCBwZXJpb2Rfc2l6ZT0leFxuIiwgbGluaywgZG1hX3BvcywgcGVyaW9kX3NpemUpOworCQkiZG1hX3B0ciA9ICV4IHBlcmlvZF9zaXplPSV4XG4iLCBwcnRkLT5hc3BfbGlua1swXSwgZG1hX3BvcywKKwkJcGVyaW9kX3NpemUpOwogCiAJZGF0YV90eXBlID0gcHJ0ZC0+cGFyYW1zLT5kYXRhX3R5cGU7CiAJY291bnQgPSBwZXJpb2Rfc2l6ZSAvIGRhdGFfdHlwZTsKQEAgLTIyMiwxNyArMjIyLDE5IEBACiAJfQogCiAJYWNudCA9IHBydGQtPnBhcmFtcy0+YWNudDsKLQllZG1hX3NldF9zcmMobGluaywgc3JjLCBJTkNSLCBXOEJJVCk7Ci0JZWRtYV9zZXRfZGVzdChsaW5rLCBkc3QsIElOQ1IsIFc4QklUKTsKKwllZG1hX3NldF9zcmMocHJ0ZC0+YXNwX2xpbmtbMF0sIHNyYywgSU5DUiwgVzhCSVQpOworCWVkbWFfc2V0X2Rlc3QocHJ0ZC0+YXNwX2xpbmtbMF0sIGRzdCwgSU5DUiwgVzhCSVQpOwogCi0JZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIHNyY19iaWR4LCBzcmNfY2lkeCk7Ci0JZWRtYV9zZXRfZGVzdF9pbmRleChsaW5rLCBkc3RfYmlkeCwgZHN0X2NpZHgpOworCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5hc3BfbGlua1swXSwgc3JjX2JpZHgsIHNyY19jaWR4KTsKKwllZG1hX3NldF9kZXN0X2luZGV4KHBydGQtPmFzcF9saW5rWzBdLCBkc3RfYmlkeCwgZHN0X2NpZHgpOwogCiAJaWYgKCFmaWZvX2xldmVsKQotCQllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMobGluaywgYWNudCwgY291bnQsIDEsIDAsIEFTWU5DKTsKKwkJZWRtYV9zZXRfdHJhbnNmZXJfcGFyYW1zKHBydGQtPmFzcF9saW5rWzBdLCBhY250LCBjb3VudCwgMSwgMCwKKwkJCQkJCQlBU1lOQyk7CiAJZWxzZQotCQllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMobGluaywgYWNudCwgZmlmb19sZXZlbCwgY291bnQsCi0JCQkJCQkJZmlmb19sZXZlbCwgQUJTWU5DKTsKKwkJZWRtYV9zZXRfdHJhbnNmZXJfcGFyYW1zKHBydGQtPmFzcF9saW5rWzBdLCBhY250LCBmaWZvX2xldmVsLAorCQkJCQkJCWNvdW50LCBmaWZvX2xldmVsLAorCQkJCQkJCUFCU1lOQyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRhdmluY2lfcGNtX2RtYV9pcnEodW5zaWduZWQgbGluaywgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKQEAgLTMwNSw3ICszMDcsNiBAQAogCXVuc2lnbmVkIGludCBhY250ID0gcGFyYW1zLT5hY250OwogCS8qIGRpdmlkZSBieSAyIGZvciBwaW5nL3BvbmcgKi8KIAl1bnNpZ25lZCBpbnQgcGluZ19zaXplID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSkgPj4gMTsKLQlpbnQgbGluayA9IHBydGQtPmFzcF9saW5rWzFdOwogCXVuc2lnbmVkIGludCBmaWZvX2xldmVsID0gcHJ0ZC0+cGFyYW1zLT5maWZvX2xldmVsOwogCXVuc2lnbmVkIGludCBjb3VudDsKIAlpZiAoKGRhdGFfdHlwZSA9PSAwKSB8fCAoZGF0YV90eXBlID4gNCkpIHsKQEAgLTMxNiwyOCArMzE3LDI2IEBACiAJCWRtYV9hZGRyX3QgYXNwX3NyY19wb25nID0gaXJhbV9kbWEtPmFkZHIgKyBwaW5nX3NpemU7CiAJCXJhbV9zcmNfY2lkeCA9IHBpbmdfc2l6ZTsKIAkJcmFtX2RzdF9jaWR4ID0gLXBpbmdfc2l6ZTsKLQkJZWRtYV9zZXRfc3JjKGxpbmssIGFzcF9zcmNfcG9uZywgSU5DUiwgVzhCSVQpOworCQllZG1hX3NldF9zcmMocHJ0ZC0+YXNwX2xpbmtbMV0sIGFzcF9zcmNfcG9uZywgSU5DUiwgVzhCSVQpOwogCi0JCWxpbmsgPSBwcnRkLT5hc3BfbGlua1swXTsKLQkJZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIGRhdGFfdHlwZSwgZGF0YV90eXBlICogZmlmb19sZXZlbCk7Ci0JCWxpbmsgPSBwcnRkLT5hc3BfbGlua1sxXTsKLQkJZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIGRhdGFfdHlwZSwgZGF0YV90eXBlICogZmlmb19sZXZlbCk7CisJCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5hc3BfbGlua1swXSwgZGF0YV90eXBlLAorCQkJCWRhdGFfdHlwZSAqIGZpZm9fbGV2ZWwpOworCQllZG1hX3NldF9zcmNfaW5kZXgocHJ0ZC0+YXNwX2xpbmtbMV0sIGRhdGFfdHlwZSwKKwkJCQlkYXRhX3R5cGUgKiBmaWZvX2xldmVsKTsKIAotCQlsaW5rID0gcHJ0ZC0+cmFtX2xpbms7Ci0JCWVkbWFfc2V0X3NyYyhsaW5rLCBydW50aW1lLT5kbWFfYWRkciwgSU5DUiwgVzMyQklUKTsKKwkJZWRtYV9zZXRfc3JjKHBydGQtPnJhbV9saW5rLCBydW50aW1lLT5kbWFfYWRkciwgSU5DUiwgVzMyQklUKTsKIAl9IGVsc2UgewogCQlkbWFfYWRkcl90IGFzcF9kc3RfcG9uZyA9IGlyYW1fZG1hLT5hZGRyICsgcGluZ19zaXplOwogCQlyYW1fc3JjX2NpZHggPSAtcGluZ19zaXplOwogCQlyYW1fZHN0X2NpZHggPSBwaW5nX3NpemU7Ci0JCWVkbWFfc2V0X2Rlc3QobGluaywgYXNwX2RzdF9wb25nLCBJTkNSLCBXOEJJVCk7CisJCWVkbWFfc2V0X2Rlc3QocHJ0ZC0+YXNwX2xpbmtbMV0sIGFzcF9kc3RfcG9uZywgSU5DUiwgVzhCSVQpOwogCi0JCWxpbmsgPSBwcnRkLT5hc3BfbGlua1swXTsKLQkJZWRtYV9zZXRfZGVzdF9pbmRleChsaW5rLCBkYXRhX3R5cGUsIGRhdGFfdHlwZSAqIGZpZm9fbGV2ZWwpOwotCQlsaW5rID0gcHJ0ZC0+YXNwX2xpbmtbMV07Ci0JCWVkbWFfc2V0X2Rlc3RfaW5kZXgobGluaywgZGF0YV90eXBlLCBkYXRhX3R5cGUgKiBmaWZvX2xldmVsKTsKKwkJZWRtYV9zZXRfZGVzdF9pbmRleChwcnRkLT5hc3BfbGlua1swXSwgZGF0YV90eXBlLAorCQkJCWRhdGFfdHlwZSAqIGZpZm9fbGV2ZWwpOworCQllZG1hX3NldF9kZXN0X2luZGV4KHBydGQtPmFzcF9saW5rWzFdLCBkYXRhX3R5cGUsCisJCQkJZGF0YV90eXBlICogZmlmb19sZXZlbCk7CiAKLQkJbGluayA9IHBydGQtPnJhbV9saW5rOwotCQllZG1hX3NldF9kZXN0KGxpbmssIHJ1bnRpbWUtPmRtYV9hZGRyLCBJTkNSLCBXMzJCSVQpOworCQllZG1hX3NldF9kZXN0KHBydGQtPnJhbV9saW5rLCBydW50aW1lLT5kbWFfYWRkciwgSU5DUiwgVzMyQklUKTsKIAl9CiAKIAlpZiAoIWZpZm9fbGV2ZWwpIHsKQEAgLTM1NCwxMCArMzUzLDkgQEAKIAkJCQljb3VudCwgZmlmb19sZXZlbCwgQUJTWU5DKTsKIAl9CiAKLQlsaW5rID0gcHJ0ZC0+cmFtX2xpbms7Ci0JZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIHBpbmdfc2l6ZSwgcmFtX3NyY19jaWR4KTsKLQllZG1hX3NldF9kZXN0X2luZGV4KGxpbmssIHBpbmdfc2l6ZSwgcmFtX2RzdF9jaWR4KTsKLQllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMobGluaywgcGluZ19zaXplLCAyLAorCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5yYW1fbGluaywgcGluZ19zaXplLCByYW1fc3JjX2NpZHgpOworCWVkbWFfc2V0X2Rlc3RfaW5kZXgocHJ0ZC0+cmFtX2xpbmssIHBpbmdfc2l6ZSwgcmFtX2RzdF9jaWR4KTsKKwllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMocHJ0ZC0+cmFtX2xpbmssIHBpbmdfc2l6ZSwgMiwKIAkJCXJ1bnRpbWUtPnBlcmlvZHMsIDIsIEFTWU5DKTsKIAogCS8qIGluaXQgbWFzdGVyIHBhcmFtcyAqLwpAQCAtNDA2LDMyICs0MDQsMzIgQEAKIHsKIAlkbWFfYWRkcl90IGFzcF9zcmNfcGluZzsKIAlkbWFfYWRkcl90IGFzcF9kc3RfcGluZzsKLQlpbnQgbGluazsKKwlpbnQgcmV0OwogCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpwYXJhbXMgPSBwcnRkLT5wYXJhbXM7CiAKIAkvKiBSZXF1ZXN0IHJhbSBtYXN0ZXIgY2hhbm5lbCAqLwotCWxpbmsgPSBwcnRkLT5yYW1fY2hhbm5lbCA9IGVkbWFfYWxsb2NfY2hhbm5lbChFRE1BX0NIQU5ORUxfQU5ZLAorCXJldCA9IHBydGQtPnJhbV9jaGFubmVsID0gZWRtYV9hbGxvY19jaGFubmVsKEVETUFfQ0hBTk5FTF9BTlksCiAJCQkJICBkYXZpbmNpX3BjbV9kbWFfaXJxLCBzdWJzdHJlYW0sCiAJCQkJICBwcnRkLT5wYXJhbXMtPnJhbV9jaGFuX3EpOwotCWlmIChsaW5rIDwgMCkKKwlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0MTsKIAogCS8qIFJlcXVlc3QgcmFtIGxpbmsgY2hhbm5lbCAqLwotCWxpbmsgPSBwcnRkLT5yYW1fbGluayA9IGVkbWFfYWxsb2Nfc2xvdCgKKwlyZXQgPSBwcnRkLT5yYW1fbGluayA9IGVkbWFfYWxsb2Nfc2xvdCgKIAkJCUVETUFfQ1RMUihwcnRkLT5yYW1fY2hhbm5lbCksIEVETUFfU0xPVF9BTlkpOwotCWlmIChsaW5rIDwgMCkKKwlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0MjsKIAotCWxpbmsgPSBwcnRkLT5hc3BfbGlua1sxXSA9IGVkbWFfYWxsb2Nfc2xvdCgKKwlyZXQgPSBwcnRkLT5hc3BfbGlua1sxXSA9IGVkbWFfYWxsb2Nfc2xvdCgKIAkJCUVETUFfQ1RMUihwcnRkLT5hc3BfY2hhbm5lbCksIEVETUFfU0xPVF9BTlkpOwotCWlmIChsaW5rIDwgMCkKKwlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0MzsKIAogCXBydGQtPnJhbV9saW5rMiA9IC0xOwogCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCWxpbmsgPSBwcnRkLT5yYW1fbGluazIgPSBlZG1hX2FsbG9jX3Nsb3QoCisJCXJldCA9IHBydGQtPnJhbV9saW5rMiA9IGVkbWFfYWxsb2Nfc2xvdCgKIAkJCUVETUFfQ1RMUihwcnRkLT5yYW1fY2hhbm5lbCksIEVETUFfU0xPVF9BTlkpOwotCQlpZiAobGluayA8IDApCisJCWlmIChyZXQgPCAwKQogCQkJZ290byBleGl0NDsKIAl9CiAJLyogY2lyY2xlIHBpbmctcG9uZyBidWZmZXJzICovCkBAIC00NDgsMzYgKzQ0NiwzMyBAQAogCQlhc3BfZHN0X3BpbmcgPSBpcmFtX2RtYS0+YWRkcjsKIAl9CiAJLyogcGluZyAqLwotCWxpbmsgPSBwcnRkLT5hc3BfbGlua1swXTsKLQllZG1hX3NldF9zcmMobGluaywgYXNwX3NyY19waW5nLCBJTkNSLCBXMTZCSVQpOwotCWVkbWFfc2V0X2Rlc3QobGluaywgYXNwX2RzdF9waW5nLCBJTkNSLCBXMTZCSVQpOwotCWVkbWFfc2V0X3NyY19pbmRleChsaW5rLCAwLCAwKTsKLQllZG1hX3NldF9kZXN0X2luZGV4KGxpbmssIDAsIDApOworCWVkbWFfc2V0X3NyYyhwcnRkLT5hc3BfbGlua1swXSwgYXNwX3NyY19waW5nLCBJTkNSLCBXMTZCSVQpOworCWVkbWFfc2V0X2Rlc3QocHJ0ZC0+YXNwX2xpbmtbMF0sIGFzcF9kc3RfcGluZywgSU5DUiwgVzE2QklUKTsKKwllZG1hX3NldF9zcmNfaW5kZXgocHJ0ZC0+YXNwX2xpbmtbMF0sIDAsIDApOworCWVkbWFfc2V0X2Rlc3RfaW5kZXgocHJ0ZC0+YXNwX2xpbmtbMF0sIDAsIDApOwogCi0JZWRtYV9yZWFkX3Nsb3QobGluaywgJnBydGQtPmFzcF9wYXJhbXMpOworCWVkbWFfcmVhZF9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAJcHJ0ZC0+YXNwX3BhcmFtcy5vcHQgJj0gfihUQ0NNT0RFIHwgRURNQV9UQ0MoMHgzZikgfCBUQ0lOVEVOKTsKIAlwcnRkLT5hc3BfcGFyYW1zLm9wdCB8PSBUQ0NIRU4gfAogCQlFRE1BX1RDQyhwcnRkLT5yYW1fY2hhbm5lbCAmIDB4M2YpOwotCWVkbWFfd3JpdGVfc2xvdChsaW5rLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CisJZWRtYV93cml0ZV9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAKIAkvKiBwb25nICovCi0JbGluayA9IHBydGQtPmFzcF9saW5rWzFdOwotCWVkbWFfc2V0X3NyYyhsaW5rLCBhc3Bfc3JjX3BpbmcsIElOQ1IsIFcxNkJJVCk7Ci0JZWRtYV9zZXRfZGVzdChsaW5rLCBhc3BfZHN0X3BpbmcsIElOQ1IsIFcxNkJJVCk7Ci0JZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIDAsIDApOwotCWVkbWFfc2V0X2Rlc3RfaW5kZXgobGluaywgMCwgMCk7CisJZWRtYV9zZXRfc3JjKHBydGQtPmFzcF9saW5rWzFdLCBhc3Bfc3JjX3BpbmcsIElOQ1IsIFcxNkJJVCk7CisJZWRtYV9zZXRfZGVzdChwcnRkLT5hc3BfbGlua1sxXSwgYXNwX2RzdF9waW5nLCBJTkNSLCBXMTZCSVQpOworCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5hc3BfbGlua1sxXSwgMCwgMCk7CisJZWRtYV9zZXRfZGVzdF9pbmRleChwcnRkLT5hc3BfbGlua1sxXSwgMCwgMCk7CiAKLQllZG1hX3JlYWRfc2xvdChsaW5rLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CisJZWRtYV9yZWFkX3Nsb3QocHJ0ZC0+YXNwX2xpbmtbMV0sICZwcnRkLT5hc3BfcGFyYW1zKTsKIAlwcnRkLT5hc3BfcGFyYW1zLm9wdCAmPSB+KFRDQ01PREUgfCBFRE1BX1RDQygweDNmKSk7CiAJLyogaW50ZXJydXB0IGFmdGVyIGV2ZXJ5IHBvbmcgY29tcGxldGlvbiAqLwogCXBydGQtPmFzcF9wYXJhbXMub3B0IHw9IFRDSU5URU4gfCBUQ0NIRU4gfAogCQlFRE1BX1RDQyhwcnRkLT5yYW1fY2hhbm5lbCAmIDB4M2YpOwotCWVkbWFfd3JpdGVfc2xvdChsaW5rLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CisJZWRtYV93cml0ZV9zbG90KHBydGQtPmFzcF9saW5rWzFdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAKIAkvKiByYW0gKi8KLQlsaW5rID0gcHJ0ZC0+cmFtX2xpbms7Ci0JZWRtYV9zZXRfc3JjKGxpbmssIGlyYW1fZG1hLT5hZGRyLCBJTkNSLCBXMzJCSVQpOwotCWVkbWFfc2V0X2Rlc3QobGluaywgaXJhbV9kbWEtPmFkZHIsIElOQ1IsIFczMkJJVCk7CisJZWRtYV9zZXRfc3JjKHBydGQtPnJhbV9saW5rLCBpcmFtX2RtYS0+YWRkciwgSU5DUiwgVzMyQklUKTsKKwllZG1hX3NldF9kZXN0KHBydGQtPnJhbV9saW5rLCBpcmFtX2RtYS0+YWRkciwgSU5DUiwgVzMyQklUKTsKIAlwcl9kZWJ1ZygiJXM6IGF1ZGlvIGRtYSBjaGFubmVscy9zbG90cyBpbiB1c2UgZm9yIHJhbToldSAldSAldSwiCiAJCSJmb3IgYXNwOiV1ICV1ICV1XG4iLCBfX2Z1bmNfXywKIAkJcHJ0ZC0+cmFtX2NoYW5uZWwsIHBydGQtPnJhbV9saW5rLCBwcnRkLT5yYW1fbGluazIsCkBAIC00OTQsNyArNDg5LDcgQEAKIAllZG1hX2ZyZWVfY2hhbm5lbChwcnRkLT5yYW1fY2hhbm5lbCk7CiAJcHJ0ZC0+cmFtX2NoYW5uZWwgPSAtMTsKIGV4aXQxOgotCXJldHVybiBsaW5rOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGF2aW5jaV9wY21fZG1hX3JlcXVlc3Qoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC01MDIsMjIgKzQ5NywyMiBAQAogCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqaXJhbV9kbWE7CiAJc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgKnBhcmFtcyA9IHBydGQtPnBhcmFtczsKLQlpbnQgbGluazsKKwlpbnQgcmV0OwogCiAJaWYgKCFwYXJhbXMpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogUmVxdWVzdCBhc3AgbWFzdGVyIERNQSBjaGFubmVsICovCi0JbGluayA9IHBydGQtPmFzcF9jaGFubmVsID0gZWRtYV9hbGxvY19jaGFubmVsKHBhcmFtcy0+Y2hhbm5lbCwKKwlyZXQgPSBwcnRkLT5hc3BfY2hhbm5lbCA9IGVkbWFfYWxsb2NfY2hhbm5lbChwYXJhbXMtPmNoYW5uZWwsCiAJCQlkYXZpbmNpX3BjbV9kbWFfaXJxLCBzdWJzdHJlYW0sCiAJCQlwcnRkLT5wYXJhbXMtPmFzcF9jaGFuX3EpOwotCWlmIChsaW5rIDwgMCkKKwlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0MTsKIAogCS8qIFJlcXVlc3QgYXNwIGxpbmsgY2hhbm5lbHMgKi8KLQlsaW5rID0gcHJ0ZC0+YXNwX2xpbmtbMF0gPSBlZG1hX2FsbG9jX3Nsb3QoCisJcmV0ID0gcHJ0ZC0+YXNwX2xpbmtbMF0gPSBlZG1hX2FsbG9jX3Nsb3QoCiAJCQlFRE1BX0NUTFIocHJ0ZC0+YXNwX2NoYW5uZWwpLCBFRE1BX1NMT1RfQU5ZKTsKLQlpZiAobGluayA8IDApCisJaWYgKHJldCA8IDApCiAJCWdvdG8gZXhpdDI7CiAKIAlpcmFtX2RtYSA9IChzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKilzdWJzdHJlYW0tPmRtYV9idWZmZXIucHJpdmF0ZV9kYXRhOwpAQCAtNTM3LDE3ICs1MzIsMTcgQEAKIAkgKiB0aGUgYnVmZmVyIGFuZCBpdHMgbGVuZ3RoIChjY250KSAuLi4gdXNlIGl0IGFzIGEgdGVtcGxhdGUKIAkgKiBzbyBkYXZpbmNpX3BjbV9lbnF1ZXVlX2RtYSgpIHRha2VzIGxlc3MgdGltZSBpbiBJUlEuCiAJICovCi0JZWRtYV9yZWFkX3Nsb3QobGluaywgJnBydGQtPmFzcF9wYXJhbXMpOworCWVkbWFfcmVhZF9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAJcHJ0ZC0+YXNwX3BhcmFtcy5vcHQgfD0gVENJTlRFTiB8CiAJCUVETUFfVENDKEVETUFfQ0hBTl9TTE9UKHBydGQtPmFzcF9jaGFubmVsKSk7Ci0JcHJ0ZC0+YXNwX3BhcmFtcy5saW5rX2JjbnRybGQgPSBFRE1BX0NIQU5fU0xPVChsaW5rKSA8PCA1OwotCWVkbWFfd3JpdGVfc2xvdChsaW5rLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CisJcHJ0ZC0+YXNwX3BhcmFtcy5saW5rX2JjbnRybGQgPSBFRE1BX0NIQU5fU0xPVChwcnRkLT5hc3BfbGlua1swXSkgPDwgNTsKKwllZG1hX3dyaXRlX3Nsb3QocHJ0ZC0+YXNwX2xpbmtbMF0sICZwcnRkLT5hc3BfcGFyYW1zKTsKIAlyZXR1cm4gMDsKIGV4aXQyOgogCWVkbWFfZnJlZV9jaGFubmVsKHBydGQtPmFzcF9jaGFubmVsKTsKIAlwcnRkLT5hc3BfY2hhbm5lbCA9IC0xOwogZXhpdDE6Ci0JcmV0dXJuIGxpbms7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkYXZpbmNpX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2VwOTN4eC9lZGI5M3h4LmMgYi9zb3VuZC9zb2MvZXA5M3h4L2VkYjkzeHguYwppbmRleCBkM2FhMTUxLi41MTkzMGI2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZXA5M3h4L2VkYjkzeHguYworKysgYi9zb3VuZC9zb2MvZXA5M3h4L2VkYjkzeHguYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KQEAgLTI4LDEyICsyOSw2IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgImVwOTN4eC1wY20uaCIKIAotI2RlZmluZSBlZGI5M3h4X2hhc19hdWRpbygpIChtYWNoaW5lX2lzX2VkYjkzMDEoKSB8fAlcCi0JCQkgICAgIG1hY2hpbmVfaXNfZWRiOTMwMigpIHx8CVwKLQkJCSAgICAgbWFjaGluZV9pc19lZGI5MzAyYSgpIHx8CVwKLQkJCSAgICAgbWFjaGluZV9pc19lZGI5MzA3YSgpIHx8CVwKLQkJCSAgICAgbWFjaGluZV9pc19lZGI5MzE1YSgpKQotCiBzdGF0aWMgaW50IGVkYjkzeHhfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTk0LDQ5ICs4OSw2MSBAQAogCS5udW1fbGlua3MJPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmVkYjkzeHhfc25kX2RldmljZTsKLQotc3RhdGljIGludCBfX2luaXQgZWRiOTN4eF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlZGI5M3h4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZzbmRfc29jX2VkYjkzeHg7CiAJaW50IHJldDsKIAotCWlmICghZWRiOTN4eF9oYXNfYXVkaW8oKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlyZXQgPSBlcDkzeHhfaTJzX2FjcXVpcmUoRVA5M1hYX1NZU0NPTl9ERVZDRkdfSTJTT05BQzk3LAogCQkJCSBFUDkzWFhfU1lTQ09OX0kyU0NMS0RJVl9PUklERSB8CiAJCQkJIEVQOTNYWF9TWVNDT05fSTJTQ0xLRElWX1NQT0wpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQllZGI5M3h4X3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKLQlpZiAoIWVkYjkzeHhfc25kX2RldmljZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZyZWVfaTJzOworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoY2FyZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQoKSBmYWlsZWQ6ICVkXG4iLAorCQkJcmV0KTsKKwkJZXA5M3h4X2kyc19yZWxlYXNlKCk7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZWRiOTN4eF9zbmRfZGV2aWNlLCAmc25kX3NvY19lZGI5M3h4KTsKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGVkYjkzeHhfc25kX2RldmljZSk7Ci0JaWYgKHJldCkKLQkJZ290byBkZXZpY2VfcHV0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGVkYjkzeHhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoY2FyZCk7CisJZXA5M3h4X2kyc19yZWxlYXNlKCk7CiAKIAlyZXR1cm4gMDsKK30KIAotZGV2aWNlX3B1dDoKLQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGVkYjkzeHhfc25kX2RldmljZSk7Ci1mcmVlX2kyczoKLQllcDkzeHhfaTJzX3JlbGVhc2UoKTsKLQlyZXR1cm4gcmV0Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWRiOTN4eF9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImVkYjkzeHgtYXVkaW8iLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBlZGI5M3h4X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZWRiOTN4eF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZWRiOTN4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZWRiOTN4eF9kcml2ZXIpOwogfQogbW9kdWxlX2luaXQoZWRiOTN4eF9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IGVkYjkzeHhfZXhpdCh2b2lkKQogewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGVkYjkzeHhfc25kX2RldmljZSk7Ci0JZXA5M3h4X2kyc19yZWxlYXNlKCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmVkYjkzeHhfZHJpdmVyKTsKIH0KIG1vZHVsZV9leGl0KGVkYjkzeHhfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIkFsZXhhbmRlciBTdmVyZGxpbiA8c3ViYXBhcnRzQHlhbmRleC5ydT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgRURCOTN4eCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTplZGI5M3h4LWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1hYzk3LmMgYi9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1hYzk3LmMKaW5kZXggYzc0MTdjNy4uM2NkNjE1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9lcDkzeHgvZXA5M3h4LWFjOTcuYwpAQCAtMzM1LDcgKzMzNSw3IEBACiAJLnRyaWdnZXIJPSBlcDkzeHhfYWM5N190cmlnZ2VyLAogfTsKIAotc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBlcDkzeHhfYWM5N19kYWkgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBlcDkzeHhfYWM5N19kYWkgPSB7CiAJLm5hbWUJCT0gImVwOTN4eC1hYzk3IiwKIAkuaWQJCT0gMCwKIAkuYWM5N19jb250cm9sCT0gMSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9lcDkzeHgvZXA5M3h4LXBjbS5jIGIvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtcGNtLmMKaW5kZXggOGRmZDNhZC4uZDAwMjMwYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtcGNtLmMKKysrIGIvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtcGNtLmMKQEAgLTM1NSwzICszNTUsNCBAQAogTU9EVUxFX0FVVEhPUigiUnlhbiBNYWxsb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRVA5M3h4IEFMU0EgUENNIGludGVyZmFjZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTplcDkzeHgtcGNtLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZXA5M3h4L3NpbW9uZS5jIGIvc291bmQvc29jL2VwOTN4eC9zaW1vbmUuYwppbmRleCAyODY4MTc5Li45NjhjYjMxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZXA5M3h4L3NpbW9uZS5jCisrKyBiL3NvdW5kL3NvYy9lcDkzeHgvc2ltb25lLmMKQEAgLTM5LDUzICszOSw2MSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNpbW9uZV9zbmRfYWM5N19kZXZpY2U7Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2ltb25lX3NuZF9kZXZpY2U7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpbW9uZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmc25kX3NvY19zaW1vbmU7CisJaW50IHJldDsKKworCXNpbW9uZV9zbmRfYWM5N19kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJhYzk3LWNvZGVjIiwKKwkJCQkJCQkJIC0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHNpbW9uZV9zbmRfYWM5N19kZXZpY2UpKQorCQlyZXR1cm4gUFRSX0VSUihzaW1vbmVfc25kX2FjOTdfZGV2aWNlKTsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoY2FyZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQoKSBmYWlsZWQ6ICVkXG4iLAorCQkJcmV0KTsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2ltb25lX3NuZF9hYzk3X2RldmljZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2ltb25lX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNpbW9uZV9zbmRfYWM5N19kZXZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNpbW9uZV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNpbW9uZS1hdWRpbyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHNpbW9uZV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNpbW9uZV9yZW1vdmUpLAorfTsKIAogc3RhdGljIGludCBfX2luaXQgc2ltb25lX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OwotCi0JaWYgKCFtYWNoaW5lX2lzX3NpbV9vbmUoKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlzaW1vbmVfc25kX2FjOTdfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJhYzk3LWNvZGVjIiwgLTEpOwotCWlmICghc2ltb25lX3NuZF9hYzk3X2RldmljZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNpbW9uZV9zbmRfYWM5N19kZXZpY2UpOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbDE7Ci0KLQlzaW1vbmVfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOwotCWlmICghc2ltb25lX3NuZF9kZXZpY2UpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsMjsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShzaW1vbmVfc25kX2RldmljZSwgJnNuZF9zb2Nfc2ltb25lKTsKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNpbW9uZV9zbmRfZGV2aWNlKTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWwzOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWwzOgotCXBsYXRmb3JtX2RldmljZV9wdXQoc2ltb25lX3NuZF9kZXZpY2UpOwotZmFpbDI6Ci0JcGxhdGZvcm1fZGV2aWNlX2RlbChzaW1vbmVfc25kX2FjOTdfZGV2aWNlKTsKLWZhaWwxOgotCXBsYXRmb3JtX2RldmljZV9wdXQoc2ltb25lX3NuZF9hYzk3X2RldmljZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaW1vbmVfZHJpdmVyKTsKIH0KIG1vZHVsZV9pbml0KHNpbW9uZV9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IHNpbW9uZV9leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2ltb25lX3NuZF9kZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNpbW9uZV9zbmRfYWM5N19kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaW1vbmVfZHJpdmVyKTsKIH0KIG1vZHVsZV9leGl0KHNpbW9uZV9leGl0KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBTaW1wbGVtYWNoaW5lcyBTaW0uT25lIik7CiBNT0RVTEVfQVVUSE9SKCJNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0Bpa2kuZmk+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNpbW9uZS1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2VwOTN4eC9zbmFwcGVyY2wxNS5jIGIvc291bmQvc29jL2VwOTN4eC9zbmFwcGVyY2wxNS5jCmluZGV4IGM4YWE4YTUuLjJjZGU0MzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9lcDkzeHgvc25hcHBlcmNsMTUuYworKysgYi9zb3VuZC9zb2MvZXA5M3h4L3NuYXBwZXJjbDE1LmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMTA0LDM3ICsxMDUsNTYgQEAKIAkubnVtX2xpbmtzCT0gMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbmFwcGVyY2wxNV9zbmRfZGV2aWNlOwotCi1zdGF0aWMgaW50IF9faW5pdCBzbmFwcGVyY2wxNV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmFwcGVyY2wxNV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmc25kX3NvY19zbmFwcGVyY2wxNTsKIAlpbnQgcmV0OwogCi0JaWYgKCFtYWNoaW5lX2lzX3NuYXBwZXJfY2wxNSgpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXJldCA9IGVwOTN4eF9pMnNfYWNxdWlyZShFUDkzWFhfU1lTQ09OX0RFVkNGR19JMlNPTkFDOTcsCiAJCQkJIEVQOTNYWF9TWVNDT05fSTJTQ0xLRElWX09SSURFIHwKIAkJCQkgRVA5M1hYX1NZU0NPTl9JMlNDTEtESVZfU1BPTCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXNuYXBwZXJjbDE1X3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKLQlpZiAoIXNuYXBwZXJjbDE1X3NuZF9kZXZpY2UpCi0JCXJldHVybiAtRU5PTUVNOwotCQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHNuYXBwZXJjbDE1X3NuZF9kZXZpY2UsICZzbmRfc29jX3NuYXBwZXJjbDE1KTsKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNuYXBwZXJjbDE1X3NuZF9kZXZpY2UpOwotCWlmIChyZXQpCi0JCXBsYXRmb3JtX2RldmljZV9wdXQoc25hcHBlcmNsMTVfc25kX2RldmljZSk7CisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgpIGZhaWxlZDogJWRcbiIsCisJCQlyZXQpOworCQllcDkzeHhfaTJzX3JlbGVhc2UoKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmFwcGVyY2wxNV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKwllcDkzeHhfaTJzX3JlbGVhc2UoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmFwcGVyY2wxNV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNuYXBwZXJjbDE1LWF1ZGlvIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gc25hcHBlcmNsMTVfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzbmFwcGVyY2wxNV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc25hcHBlcmNsMTVfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuYXBwZXJjbDE1X2RyaXZlcik7Cit9CisKIHN0YXRpYyB2b2lkIF9fZXhpdCBzbmFwcGVyY2wxNV9leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc25hcHBlcmNsMTVfc25kX2RldmljZSk7Ci0JZXA5M3h4X2kyc19yZWxlYXNlKCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuYXBwZXJjbDE1X2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHNuYXBwZXJjbDE1X2luaXQpOwpAQCAtMTQzLDQgKzE2Myw0IEBACiBNT0RVTEVfQVVUSE9SKCJSeWFuIE1hbGxvbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBTbmFwcGVyIENMMTUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQorTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzbmFwcGVyY2wxNS1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfZG1hLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYwppbmRleCBjYjUwNTk4Li5lZjE1NDAyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYwpAQCAtMjk3LDcgKzI5Nyw2IEBACiBzdGF0aWMgaW50IGZzbF9kbWFfbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CiAJc3RhdGljIHU2NCBmc2xfZG1hX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzYpOwogCWludCByZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9zc2kuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCmluZGV4IGQ0OGFmZWEuLjAyNjhjZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCkBAIC03OCw3ICs3OCw2IEBACiAgKiBAc2Vjb25kX3N0cmVhbTogcG9pbnRlciB0byBzZWNvbmQgc3RyZWFtCiAgKiBAcGxheWJhY2s6IHRoZSBudW1iZXIgb2YgcGxheWJhY2sgc3RyZWFtcyBvcGVuZWQKICAqIEBjYXB0dXJlOiB0aGUgbnVtYmVyIG9mIGNhcHR1cmUgc3RyZWFtcyBvcGVuZWQKLSAqIEBhc3luY2hyb25vdXM6IDA9c3luY2hyb25vdXMgbW9kZSwgMT1hc3luY2hyb25vdXMgbW9kZQogICogQGNwdV9kYWk6IHRoZSBDUFUgREFJIGZvciB0aGlzIGRldmljZQogICogQGRldl9hdHRyOiB0aGUgc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUKICAqIEBzdGF0czogU1NJIHN0YXRpc3RpY3MKQEAgLTkwLDkgKzg5LDYgQEAKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqZmlyc3Rfc3RyZWFtOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc2Vjb25kX3N0cmVhbTsKLQl1bnNpZ25lZCBpbnQgcGxheWJhY2s7Ci0JdW5zaWduZWQgaW50IGNhcHR1cmU7Ci0JaW50IGFzeW5jaHJvbm91czsKIAl1bnNpZ25lZCBpbnQgZmlmb19kZXB0aDsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGNwdV9kYWlfZHJ2OwogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyOwpAQCAtMjgxLDI0ICsyNzcsMTggQEAKIAkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZnNsX3NzaV9wcml2YXRlICpzc2lfcHJpdmF0ZSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKHJ0ZC0+Y3B1X2RhaSk7CisJc3RydWN0IGZzbF9zc2lfcHJpdmF0ZSAqc3NpX3ByaXZhdGUgPQorCQlzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShydGQtPmNwdV9kYWkpOworCWludCBzeW5jaHJvbm91cyA9IHNzaV9wcml2YXRlLT5jcHVfZGFpX2Rydi5zeW1tZXRyaWNfcmF0ZXM7CiAKIAkvKgogCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN0cmVhbSBvcGVuZWQsIHRoZW4gcmVxdWVzdCB0aGUgSVJRCiAJICogYW5kIGluaXRpYWxpemUgdGhlIFNTSSByZWdpc3RlcnMuCiAJICovCi0JaWYgKCFzc2lfcHJpdmF0ZS0+cGxheWJhY2sgJiYgIXNzaV9wcml2YXRlLT5jYXB0dXJlKSB7CisJaWYgKCFzc2lfcHJpdmF0ZS0+Zmlyc3Rfc3RyZWFtKSB7CiAJCXN0cnVjdCBjY3NyX3NzaSBfX2lvbWVtICpzc2kgPSBzc2lfcHJpdmF0ZS0+c3NpOwotCQlpbnQgcmV0OwogCi0JCS8qIFRoZSAnbmFtZScgc2hvdWxkIG5vdCBoYXZlIGFueSBzbGFzaGVzIGluIGl0LiAqLwotCQlyZXQgPSByZXF1ZXN0X2lycShzc2lfcHJpdmF0ZS0+aXJxLCBmc2xfc3NpX2lzciwgMCwKLQkJCQkgIHNzaV9wcml2YXRlLT5uYW1lLCBzc2lfcHJpdmF0ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsCi0JCQkJImNvdWxkIG5vdCBjbGFpbSBpcnEgJXVcbiIsIHNzaV9wcml2YXRlLT5pcnEpOwotCQkJcmV0dXJuIHJldDsKLQkJfQorCQlzc2lfcHJpdmF0ZS0+Zmlyc3Rfc3RyZWFtID0gc3Vic3RyZWFtOwogCiAJCS8qCiAJCSAqIFNlY3Rpb24gMTYuNSBvZiB0aGUgTVBDODYxMCByZWZlcmVuY2UgbWFudWFsIHNheXMgdGhhdCB0aGUKQEAgLTMxNiw3ICszMDYsNyBAQAogCQljbHJzZXRiaXRzX2JlMzIoJnNzaS0+c2NyLAogCQkJQ0NTUl9TU0lfU0NSX0kyU19NT0RFX01BU0sgfCBDQ1NSX1NTSV9TQ1JfU1lOLAogCQkJQ0NTUl9TU0lfU0NSX1RGUl9DTEtfRElTIHwgQ0NTUl9TU0lfU0NSX0kyU19NT0RFX1NMQVZFCi0JCQl8IChzc2lfcHJpdmF0ZS0+YXN5bmNocm9ub3VzID8gMCA6IENDU1JfU1NJX1NDUl9TWU4pKTsKKwkJCXwgKHN5bmNocm9ub3VzID8gQ0NTUl9TU0lfU0NSX1NZTiA6IDApKTsKIAogCQlvdXRfYmUzMigmc3NpLT5zdGNyLAogCQkJIENDU1JfU1NJX1NUQ1JfVFhCSVQwIHwgQ0NTUl9TU0lfU1RDUl9URkVOMCB8CkBAIC0zMzMsNyArMzIzLDcgQEAKIAkJICogbWFzdGVyLgogCQkgKi8KIAotCQkvKiA0LiBFbmFibGUgdGhlIGludGVycnVwdHMgYW5kIERNQSByZXF1ZXN0cyAqLworCQkvKiBFbmFibGUgdGhlIGludGVycnVwdHMgYW5kIERNQSByZXF1ZXN0cyAqLwogCQlvdXRfYmUzMigmc3NpLT5zaWVyLCBTSUVSX0ZMQUdTKTsKIAogCQkvKgpAQCAtMzYyLDU4ICszNTIsNDcgQEAKIAkJICogdGhpcyBpcyBiYWQgaXMgYmVjYXVzZSBhdCB0aGlzIHBvaW50LCB0aGUgUENNIGRyaXZlciBoYXMgbm90CiAJCSAqIGZpbmlzaGVkIGluaXRpYWxpemluZyB0aGUgRE1BIGNvbnRyb2xsZXIuCiAJCSAqLwotCX0KKwl9IGVsc2UgeworCQlpZiAoc3luY2hyb25vdXMpIHsKKwkJCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKmZpcnN0X3J1bnRpbWUgPQorCQkJCXNzaV9wcml2YXRlLT5maXJzdF9zdHJlYW0tPnJ1bnRpbWU7CisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgc2Vjb25kIHN0cmVhbSBvcGVuLCBhbmQgd2UncmUgaW4KKwkJCSAqIHN5bmNocm9ub3VzIG1vZGUsIHNvIHdlIG5lZWQgdG8gaW1wb3NlIHNhbXBsZQorCQkJICogc2FtcGxlIHNpemUgY29uc3RyYWludHMuIFRoaXMgaXMgYmVjYXVzZSBTVENDUiBpcworCQkJICogdXNlZCBmb3IgcGxheWJhY2sgYW5kIGNhcHR1cmUgaW4gc3luY2hyb25vdXMgbW9kZSwKKwkJCSAqIHNvIHRoZXJlJ3Mgbm8gd2F5IHRvIHNwZWNpZnkgZGlmZmVyZW50IHdvcmQKKwkJCSAqIGxlbmd0aHMuCisJCQkgKgorCQkJICogTm90ZSB0aGF0IHRoaXMgY2FuIGNhdXNlIGEgcmFjZSBjb25kaXRpb24gaWYgdGhlCisJCQkgKiBzZWNvbmQgc3RyZWFtIGlzIG9wZW5lZCBiZWZvcmUgdGhlIGZpcnN0IHN0cmVhbSBpcworCQkJICogZnVsbHkgaW5pdGlhbGl6ZWQuICBXZSBwcm92aWRlIHNvbWUgcHJvdGVjdGlvbiBieQorCQkJICogY2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoZSBmaXJzdCBzdHJlYW0gaXMKKwkJCSAqIGluaXRpYWxpemVkLCBidXQgaXQncyBub3QgcGVyZmVjdC4gIEFMU0Egc29tZXRpbWVzCisJCQkgKiByZS1pbml0aWFsaXplcyB0aGUgZHJpdmVyIHdpdGggYSBkaWZmZXJlbnQgc2FtcGxlCisJCQkgKiByYXRlIG9yIHNpemUuICBJZiB0aGUgc2Vjb25kIHN0cmVhbSBpcyBvcGVuZWQKKwkJCSAqIGJlZm9yZSB0aGUgZmlyc3Qgc3RyZWFtIGhhcyByZWNlaXZlZCBpdHMgZmluYWwKKwkJCSAqIHBhcmFtZXRlcnMsIHRoZW4gdGhlIHNlY29uZCBzdHJlYW0gbWF5IGJlCisJCQkgKiBjb25zdHJhaW5lZCB0byB0aGUgd3Jvbmcgc2FtcGxlIHJhdGUgb3Igc2l6ZS4KKwkJCSAqLworCQkJaWYgKCFmaXJzdF9ydW50aW1lLT5zYW1wbGVfYml0cykgeworCQkJCWRldl9lcnIoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwKKwkJCQkJInNldCBzYW1wbGUgc2l6ZSBpbiAlcyBzdHJlYW0gZmlyc3RcbiIsCisJCQkJCXN1YnN0cmVhbS0+c3RyZWFtID09CisJCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sKKwkJCQkJPyAiY2FwdHVyZSIgOiAicGxheWJhY2siKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KIAotCWlmICghc3NpX3ByaXZhdGUtPmZpcnN0X3N0cmVhbSkKLQkJc3NpX3ByaXZhdGUtPmZpcnN0X3N0cmVhbSA9IHN1YnN0cmVhbTsKLQllbHNlIHsKLQkJLyogVGhpcyBpcyB0aGUgc2Vjb25kIHN0cmVhbSBvcGVuLCBzbyB3ZSBuZWVkIHRvIGltcG9zZSBzYW1wbGUKLQkJICogcmF0ZSBhbmQgbWF5YmUgc2FtcGxlIHNpemUgY29uc3RyYWludHMuICBOb3RlIHRoYXQgdGhpcyBjYW4KLQkJICogY2F1c2UgYSByYWNlIGNvbmRpdGlvbiBpZiB0aGUgc2Vjb25kIHN0cmVhbSBpcyBvcGVuZWQgYmVmb3JlCi0JCSAqIHRoZSBmaXJzdCBzdHJlYW0gaXMgZnVsbHkgaW5pdGlhbGl6ZWQuCi0JCSAqCi0JCSAqIFdlIHByb3ZpZGUgc29tZSBwcm90ZWN0aW9uIGJ5IGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGUgZmlyc3QKLQkJICogc3RyZWFtIGlzIGluaXRpYWxpemVkLCBidXQgaXQncyBub3QgcGVyZmVjdC4gIEFMU0Egc29tZXRpbWVzCi0JCSAqIHJlLWluaXRpYWxpemVzIHRoZSBkcml2ZXIgd2l0aCBhIGRpZmZlcmVudCBzYW1wbGUgcmF0ZSBvcgotCQkgKiBzaXplLiAgSWYgdGhlIHNlY29uZCBzdHJlYW0gaXMgb3BlbmVkIGJlZm9yZSB0aGUgZmlyc3Qgc3RyZWFtCi0JCSAqIGhhcyByZWNlaXZlZCBpdHMgZmluYWwgcGFyYW1ldGVycywgdGhlbiB0aGUgc2Vjb25kIHN0cmVhbSBtYXkKLQkJICogYmUgY29uc3RyYWluZWQgdG8gdGhlIHdyb25nIHNhbXBsZSByYXRlIG9yIHNpemUuCi0JCSAqCi0JCSAqIEZJWE1FOiBUaGlzIGNvZGUgZG9lcyBub3QgaGFuZGxlIG9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyZWFtcwotCQkgKiByZXBlYXRlZGx5LiAgSWYgeW91IG9wZW4gdHdvIHN0cmVhbXMgYW5kIHRoZW4gY2xvc2UgdGhlIGZpcnN0Ci0JCSAqIG9uZSwgeW91IG1heSBub3QgYmUgYWJsZSB0byBvcGVuIGFub3RoZXIgc3RyZWFtIHVudGlsIHlvdQotCQkgKiBjbG9zZSB0aGUgc2Vjb25kIG9uZSBhcyB3ZWxsLgotCQkgKi8KLQkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqZmlyc3RfcnVudGltZSA9Ci0JCQlzc2lfcHJpdmF0ZS0+Zmlyc3Rfc3RyZWFtLT5ydW50aW1lOwotCi0JCWlmICghZmlyc3RfcnVudGltZS0+c2FtcGxlX2JpdHMpIHsKLQkJCWRldl9lcnIoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwKLQkJCQkic2V0IHNhbXBsZSBzaXplIGluICVzIHN0cmVhbSBmaXJzdFxuIiwKLQkJCQlzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLCi0JCQkJPyAiY2FwdHVyZSIgOiAicGxheWJhY2siKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0KLQkJLyogSWYgd2UncmUgaW4gc3luY2hyb25vdXMgbW9kZSwgdGhlbiB3ZSBuZWVkIHRvIGNvbnN0cmFpbgotCQkgKiB0aGUgc2FtcGxlIHNpemUgYXMgd2VsbC4gIFdlIGRvbid0IHN1cHBvcnQgaW5kZXBlbmRlbnQgc2FtcGxlCi0JCSAqIHJhdGVzIGluIGFzeW5jaHJvbm91cyBtb2RlLgotCQkgKi8KLQkJaWYgKCFzc2lfcHJpdmF0ZS0+YXN5bmNocm9ub3VzKQogCQkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChzdWJzdHJlYW0tPnJ1bnRpbWUsCiAJCQkJU05EUlZfUENNX0hXX1BBUkFNX1NBTVBMRV9CSVRTLAogCQkJCWZpcnN0X3J1bnRpbWUtPnNhbXBsZV9iaXRzLAogCQkJCWZpcnN0X3J1bnRpbWUtPnNhbXBsZV9iaXRzKTsKKwkJfQogCiAJCXNzaV9wcml2YXRlLT5zZWNvbmRfc3RyZWFtID0gc3Vic3RyZWFtOwogCX0KIAotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlzc2lfcHJpdmF0ZS0+cGxheWJhY2srKzsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXNzaV9wcml2YXRlLT5jYXB0dXJlKys7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDM0LDI0ICs0MTMsMzUgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcywgc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQogewogCXN0cnVjdCBmc2xfc3NpX3ByaXZhdGUgKnNzaV9wcml2YXRlID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7CisJc3RydWN0IGNjc3Jfc3NpIF9faW9tZW0gKnNzaSA9IHNzaV9wcml2YXRlLT5zc2k7CisJdW5zaWduZWQgaW50IHNhbXBsZV9zaXplID0KKwkJc25kX3BjbV9mb3JtYXRfd2lkdGgocGFyYW1zX2Zvcm1hdChod19wYXJhbXMpKTsKKwl1MzIgd2wgPSBDQ1NSX1NTSV9TeENDUl9XTChzYW1wbGVfc2l6ZSk7CisJaW50IGVuYWJsZWQgPSBpbl9iZTMyKCZzc2ktPnNjcikgJiBDQ1NSX1NTSV9TQ1JfU1NJRU47CiAKLQlpZiAoc3Vic3RyZWFtID09IHNzaV9wcml2YXRlLT5maXJzdF9zdHJlYW0pIHsKLQkJc3RydWN0IGNjc3Jfc3NpIF9faW9tZW0gKnNzaSA9IHNzaV9wcml2YXRlLT5zc2k7Ci0JCXVuc2lnbmVkIGludCBzYW1wbGVfc2l6ZSA9Ci0JCQlzbmRfcGNtX2Zvcm1hdF93aWR0aChwYXJhbXNfZm9ybWF0KGh3X3BhcmFtcykpOwotCQl1MzIgd2wgPSBDQ1NSX1NTSV9TeENDUl9XTChzYW1wbGVfc2l6ZSk7CisJLyoKKwkgKiBJZiB3ZSdyZSBpbiBzeW5jaHJvbm91cyBtb2RlLCBhbmQgdGhlIFNTSSBpcyBhbHJlYWR5IGVuYWJsZWQsCisJICogdGhlbiBTVENDUiBpcyBhbHJlYWR5IHNldCBwcm9wZXJseS4KKwkgKi8KKwlpZiAoZW5hYmxlZCAmJiBzc2lfcHJpdmF0ZS0+Y3B1X2RhaV9kcnYuc3ltbWV0cmljX3JhdGVzKQorCQlyZXR1cm4gMDsKIAotCQkvKiBUaGUgU1NJIHNob3VsZCBhbHdheXMgYmUgZGlzYWJsZWQgYXQgdGhpcyBwb2ludHMgKFNTSUVOPTApICovCisJLyoKKwkgKiBGSVhNRTogVGhlIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IFN4Q0NSW1dMXSBzaG91bGQgbm90IGJlCisJICogbW9kaWZpZWQgd2hpbGUgdGhlIFNTSSBpcyBlbmFibGVkLiAgVGhlIG9ubHkgdGltZSB0aGlzIGNhbgorCSAqIGhhcHBlbiBpcyBpZiB3ZSdyZSB0cnlpbmcgdG8gZG8gc2ltdWx0YW5lb3VzIHBsYXliYWNrIGFuZAorCSAqIGNhcHR1cmUgaW4gYXN5bmNocm9ub3VzIG1vZGUuICBVbmZvcnR1bmF0ZWx5LCBJIGhhdmUgYmVlbiBlbmFibGUKKwkgKiB0byBnZXQgdGhhdCB0byB3b3JrIGF0IGFsbCBvbiB0aGUgUDEwMjJEUy4gIFRoZXJlZm9yZSwgd2UgZG9uJ3QKKwkgKiBib3RoZXIgdG8gZGlzYWJsZS9lbmFibGUgdGhlIFNTSSB3aGVuIHNldHRpbmcgU3hDQ1JbV0xdLCBiZWNhdXNlCisJICogdGhlIFNTSSB3aWxsIHN0b3AgYW55d2F5LiAgTWF5YmUgb25lIGRheSwgdGhpcyB3aWxsIGdldCBmaXhlZC4KKwkgKi8KIAotCQkvKiBJbiBzeW5jaHJvbm91cyBtb2RlLCB0aGUgU1NJIHVzZXMgU1RDQ1IgZm9yIGNhcHR1cmUgKi8KLQkJaWYgKChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB8fAotCQkgICAgIXNzaV9wcml2YXRlLT5hc3luY2hyb25vdXMpCi0JCQljbHJzZXRiaXRzX2JlMzIoJnNzaS0+c3RjY3IsCi0JCQkJCUNDU1JfU1NJX1N4Q0NSX1dMX01BU0ssIHdsKTsKLQkJZWxzZQotCQkJY2xyc2V0Yml0c19iZTMyKCZzc2ktPnNyY2NyLAotCQkJCQlDQ1NSX1NTSV9TeENDUl9XTF9NQVNLLCB3bCk7Ci0JfQorCS8qIEluIHN5bmNocm9ub3VzIG1vZGUsIHRoZSBTU0kgdXNlcyBTVENDUiBmb3IgY2FwdHVyZSAqLworCWlmICgoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgfHwKKwkgICAgc3NpX3ByaXZhdGUtPmNwdV9kYWlfZHJ2LnN5bW1ldHJpY19yYXRlcykKKwkJY2xyc2V0Yml0c19iZTMyKCZzc2ktPnN0Y2NyLCBDQ1NSX1NTSV9TeENDUl9XTF9NQVNLLCB3bCk7CisJZWxzZQorCQljbHJzZXRiaXRzX2JlMzIoJnNzaS0+c3JjY3IsIENDU1JfU1NJX1N4Q0NSX1dMX01BU0ssIHdsKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDc0LDcgKzQ2NCw2IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JCWNscmJpdHMzMigmc3NpLT5zY3IsIENDU1JfU1NJX1NDUl9TU0lFTik7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgogCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKIAkJCXNldGJpdHMzMigmc3NpLT5zY3IsCkBAIC01MTAsMjcgKzQ5OSwxOCBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZnNsX3NzaV9wcml2YXRlICpzc2lfcHJpdmF0ZSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKHJ0ZC0+Y3B1X2RhaSk7CiAKLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJc3NpX3ByaXZhdGUtPnBsYXliYWNrLS07Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlzc2lfcHJpdmF0ZS0+Y2FwdHVyZS0tOwotCiAJaWYgKHNzaV9wcml2YXRlLT5maXJzdF9zdHJlYW0gPT0gc3Vic3RyZWFtKQogCQlzc2lfcHJpdmF0ZS0+Zmlyc3Rfc3RyZWFtID0gc3NpX3ByaXZhdGUtPnNlY29uZF9zdHJlYW07CiAKIAlzc2lfcHJpdmF0ZS0+c2Vjb25kX3N0cmVhbSA9IE5VTEw7CiAKIAkvKgotCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgYWN0aXZlIHN1YnN0cmVhbSwgZGlzYWJsZSB0aGUgU1NJIGFuZCByZWxlYXNlCi0JICogdGhlIElSUS4KKwkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGFjdGl2ZSBzdWJzdHJlYW0sIGRpc2FibGUgdGhlIFNTSS4KIAkgKi8KLQlpZiAoIXNzaV9wcml2YXRlLT5wbGF5YmFjayAmJiAhc3NpX3ByaXZhdGUtPmNhcHR1cmUpIHsKKwlpZiAoIXNzaV9wcml2YXRlLT5maXJzdF9zdHJlYW0pIHsKIAkJc3RydWN0IGNjc3Jfc3NpIF9faW9tZW0gKnNzaSA9IHNzaV9wcml2YXRlLT5zc2k7CiAKIAkJY2xyYml0czMyKCZzc2ktPnNjciwgQ0NTUl9TU0lfU0NSX1NTSUVOKTsKLQotCQlmcmVlX2lycShzc2lfcHJpdmF0ZS0+aXJxLCBzc2lfcHJpdmF0ZSk7CiAJfQogfQogCkBAIC02NzUsMjIgKzY1NSwzMyBAQAogCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGRldGVybWluZSBkZXZpY2UgcmVzb3VyY2VzXG4iKTsKLQkJa2ZyZWUoc3NpX3ByaXZhdGUpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX2ttYWxsb2M7CiAJfQogCXNzaV9wcml2YXRlLT5zc2kgPSBvZl9pb21hcChucCwgMCk7CiAJaWYgKCFzc2lfcHJpdmF0ZS0+c3NpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBtYXAgZGV2aWNlIHJlc291cmNlc1xuIik7Ci0JCWtmcmVlKHNzaV9wcml2YXRlKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfa21hbGxvYzsKIAl9CiAJc3NpX3ByaXZhdGUtPnNzaV9waHlzID0gcmVzLnN0YXJ0OworCiAJc3NpX3ByaXZhdGUtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwlpZiAoc3NpX3ByaXZhdGUtPmlycSA9PSBOT19JUlEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIGZvciBub2RlICVzXG4iLCBucC0+ZnVsbF9uYW1lKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGVycm9yX2lvbWFwOworCX0KKworCS8qIFRoZSAnbmFtZScgc2hvdWxkIG5vdCBoYXZlIGFueSBzbGFzaGVzIGluIGl0LiAqLworCXJldCA9IHJlcXVlc3RfaXJxKHNzaV9wcml2YXRlLT5pcnEsIGZzbF9zc2lfaXNyLCAwLCBzc2lfcHJpdmF0ZS0+bmFtZSwKKwkJCSAgc3NpX3ByaXZhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBjbGFpbSBpcnEgJXVcbiIsIHNzaV9wcml2YXRlLT5pcnEpOworCQlnb3RvIGVycm9yX2lycW1hcDsKKwl9CiAKIAkvKiBBcmUgdGhlIFJYIGFuZCB0aGUgVFggY2xvY2tzIGxvY2tlZD8gKi8KLQlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgImZzbCxzc2ktYXN5bmNocm9ub3VzIiwgTlVMTCkpCi0JCXNzaV9wcml2YXRlLT5hc3luY2hyb25vdXMgPSAxOwotCWVsc2UKKwlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobnAsICJmc2wsc3NpLWFzeW5jaHJvbm91cyIsIE5VTEwpKQogCQlzc2lfcHJpdmF0ZS0+Y3B1X2RhaV9kcnYuc3ltbWV0cmljX3JhdGVzID0gMTsKIAogCS8qIERldGVybWluZSB0aGUgRklGTyBkZXB0aC4gKi8KQEAgLTcxMSw3ICs3MDIsNyBAQAogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGNyZWF0ZSBzeXNmcyAlcyBmaWxlXG4iLAogCQkJc3NpX3ByaXZhdGUtPmRldl9hdHRyLmF0dHIubmFtZSk7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyb3JfaXJxOwogCX0KIAogCS8qIFJlZ2lzdGVyIHdpdGggQVNvQyAqLwpAQCAtNzIwLDcgKzcxMSw3IEBACiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldiwgJnNzaV9wcml2YXRlLT5jcHVfZGFpX2Rydik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgREFJOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJvcjsKKwkJZ290byBlcnJvcl9kZXY7CiAJfQogCiAJLyogVHJpZ2dlciB0aGUgbWFjaGluZSBkcml2ZXIncyBwcm9iZSBmdW5jdGlvbi4gIFRoZSBwbGF0Zm9ybSBkcml2ZXIKQEAgLTc0MSwxOCArNzMyLDI4IEBACiAJaWYgKElTX0VSUihzc2lfcHJpdmF0ZS0+cGRldikpIHsKIAkJcmV0ID0gUFRSX0VSUihzc2lfcHJpdmF0ZS0+cGRldik7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBwbGF0Zm9ybTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyb3JfZGFpOwogCX0KIAogCXJldHVybiAwOwogCi1lcnJvcjoKK2Vycm9yX2RhaToKIAlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYpOworCitlcnJvcl9kZXY6CiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIE5VTEwpOwotCWlmIChkZXZfYXR0cikKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsIGRldl9hdHRyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgZGV2X2F0dHIpOworCitlcnJvcl9pcnE6CisJZnJlZV9pcnEoc3NpX3ByaXZhdGUtPmlycSwgc3NpX3ByaXZhdGUpOworCitlcnJvcl9pcnFtYXA6CiAJaXJxX2Rpc3Bvc2VfbWFwcGluZyhzc2lfcHJpdmF0ZS0+aXJxKTsKKworZXJyb3JfaW9tYXA6CiAJaW91bm1hcChzc2lfcHJpdmF0ZS0+c3NpKTsKKworZXJyb3Jfa21hbGxvYzoKIAlrZnJlZShzc2lfcHJpdmF0ZSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNzY2LDYgKzc2Nyw5IEBACiAJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJnNzaV9wcml2YXRlLT5kZXZfYXR0cik7CiAKKwlmcmVlX2lycShzc2lfcHJpdmF0ZS0+aXJxLCBzc2lfcHJpdmF0ZSk7CisJaXJxX2Rpc3Bvc2VfbWFwcGluZyhzc2lfcHJpdmF0ZS0+aXJxKTsKKwogCWtmcmVlKHNzaV9wcml2YXRlKTsKIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMgYi9zb3VuZC9zb2MvZnNsL21wYzg2MTBfaHBjZC5jCmluZGV4IDM1OGYwYmEuLjMxYWY0MDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMKKysrIGIvc291bmQvc29jL2ZzbC9tcGM4NjEwX2hwY2QuYwpAQCAtNTA1LDcgKzUwNSw3IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yX3NvdW5kOgotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNvdW5kX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzb3VuZF9kZXZpY2UpOwogZXJyb3I6CiAJa2ZyZWUobWFjaGluZV9kYXRhKTsKIGVycm9yX2FsbG9jOgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9wMTAyMl9kcy5jIGIvc291bmQvc29jL2ZzbC9wMTAyMl9kcy5jCmluZGV4IGZjYjg2MmUuLjJjMDY0YTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvcDEwMjJfZHMuYworKysgYi9zb3VuZC9zb2MvZnNsL3AxMDIyX2RzLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCWlmIChidXMgPCAwKQogCQlyZXR1cm4gYnVzOwogCi0Jc25wcmludGYoYnVmLCBsZW4sICIlcy1jb2RlYy4ldS0lMDR4IiwgdGVtcCwgYnVzLCBhZGRyKTsKKwlzbnByaW50ZihidWYsIGxlbiwgIiVzLiV1LSUwNHgiLCB0ZW1wLCBidXMsIGFkZHIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDYsNyArNTA2LDcgQEAKIAogZXJyb3I6CiAJaWYgKHNvdW5kX2RldmljZSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc291bmRfZGV2aWNlKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChzb3VuZF9kZXZpY2UpOwogCiAJa2ZyZWUobWRhdGEpOwogZXJyb3JfcHV0OgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9LY29uZmlnIGIvc291bmQvc29jL2lteC9LY29uZmlnCmluZGV4IGJiNjk5YmIuLmIxMzNiZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbXgvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvaW14L0tjb25maWcKQEAgLTI5LDcgKzI5LDcgQEAKIGNvbmZpZyBTTkRfU09DX01YMjdWSVNfQUlDMzJYNAogCXRyaXN0YXRlICJTb0MgYXVkaW8gc3VwcG9ydCBmb3IgVmlzc3RyaW0gTTEwIGJvYXJkcyIKIAlkZXBlbmRzIG9uIE1BQ0hfSU1YMjdfVklTU1RSSU1fTTEwCi0Jc2VsZWN0IFNORF9TT0NfVFZMMzIwQUlDMzJYNAorCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzMyWDQKIAlzZWxlY3QgU05EX01YQ19TT0NfTVgyCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBWaXNzdHJpbSBTTTEwCkBAIC01MCw2ICs1MCw3IEBACiAJCXx8IE1BQ0hfRVVLUkVBX01CSU1YU0QyNV9CQVNFQk9BUkQgXAogCQl8fCBNQUNIX0VVS1JFQV9NQklNWFNEMzVfQkFTRUJPQVJEIFwKIAkJfHwgTUFDSF9FVUtSRUFfTUJJTVhTRDUxX0JBU0VCT0FSRAorCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKIAlzZWxlY3QgU05EX01YQ19TT0NfRklRCiAJaGVscApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9pbXgtcGNtLWZpcS5jIGIvc291bmQvc29jL2lteC9pbXgtcGNtLWZpcS5jCmluZGV4IDc5NDU2MjUuLjhkZjBmYWUyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L2lteC1wY20tZmlxLmMKKysrIGIvc291bmQvc29jL2lteC9pbXgtcGNtLWZpcS5jCkBAIC0yNDAsMjUgKzI0MCwyMyBAQAogCiBzdGF0aWMgaW50IGlteF9wY21fZmlxX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOwogCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gaW14X3BjbV9uZXcocnRkKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5jaGFubmVsc19taW4pIHsKLQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPQotCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKKwlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOworCWlmIChzdWJzdHJlYW0pIHsKIAkJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOwogCiAJCWlteF9zc2lfZmlxX3R4X2J1ZmZlciA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YXJlYTsKIAl9CiAKLQlpZiAoZGFpLT5kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWluKSB7Ci0JCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KLQkJCXBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbTsKKwlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW07CisJaWYgKHN1YnN0cmVhbSkgewogCQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CiAKIAkJaW14X3NzaV9maXFfcnhfYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5hcmVhOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9pbXgtc3NpLmMgYi9zb3VuZC9zb2MvaW14L2lteC1zc2kuYwppbmRleCAxMGE4ZTI3Li40YzA1ZTJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L2lteC1zc2kuYworKysgYi9zb3VuZC9zb2MvaW14L2lteC1zc2kuYwpAQCAtMzU3LDggKzM1Nyw4IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZG1hX21tYXBfY29oZXJlbnQoTlVMTCwgdm1hLCBydW50aW1lLT5kbWFfYXJlYSwKLQkJCXJ1bnRpbWUtPmRtYV9hZGRyLCBydW50aW1lLT5kbWFfYnl0ZXMpOworCXJldCA9IGRtYV9tbWFwX3dyaXRlY29tYmluZShzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCB2bWEsCisJCXJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5kbWFfYWRkciwgcnVudGltZS0+ZG1hX2J5dGVzKTsKIAogCXByX2RlYnVnKCIlczogcmV0OiAlZCAlcCAweCUwOHggMHglMDh4XG4iLCBfX2Z1bmNfXywgcmV0LAogCQkJcnVudGltZS0+ZG1hX2FyZWEsCkBAIC0zOTEsNyArMzkxLDYgQEAKIGludCBpbXhfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CiAJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwogCWludCByZXQgPSAwOwogCkBAIC0zOTksMTQgKzM5OCwxNCBAQAogCQljYXJkLT5kZXYtPmRtYV9tYXNrID0gJmlteF9wY21fZG1hbWFzazsKIAlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCiAJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suY2hhbm5lbHNfbWluKSB7CisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gaW14X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKIAkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmNoYW5uZWxzX21pbikgeworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gaW14X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKIAkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW14L2lteC1zc2kuaCBiL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5oCmluZGV4IDBhODRjZWMuLjEwNzJkZmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5oCisrKyBiL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5oCkBAIC0yMTgsMTIgKzIxOCw2IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc29jX3BsYXRmb3JtX3BkZXZfZmlxOwogfTsKIAotc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKmlteF9zc2lfZmlxX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJc3RydWN0IGlteF9zc2kgKnNzaSk7Ci12b2lkIGlteF9zc2lfZmlxX2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGlteF9zc2kgKnNzaSk7Ci1zdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqaW14X3NzaV9kbWFfbXgyX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJc3RydWN0IGlteF9zc2kgKnNzaSk7Ci0KIGludCBzbmRfaW14X3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBpbnQgaW14X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCk7CiB2b2lkIGlteF9wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbXgvd20xMTMzLWV2MS5jIGIvc291bmQvc29jL2lteC93bTExMzMtZXYxLmMKaW5kZXggNzViNGM3Mi4uNDkwYTEyNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2lteC93bTExMzMtZXYxLmMKKysrIGIvc291bmQvc29jL2lteC93bTExMzMtZXYxLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1wY20uYyBiL3NvdW5kL3NvYy9qejQ3NDAvano0NzQwLXBjbS5jCmluZGV4IGE3Yzk1NzguLmQxOTg5Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9qejQ3NDAvano0NzQwLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9qejQ3NDAvano0NzQwLXBjbS5jCkBAIC0yOTksNyArMjk5LDcgQEAKIAogc3RhdGljIHU2NCBqejQ3NDBfcGNtX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1pbnQgano0NzQwX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3N0YXRpYyBpbnQgano0NzQwX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWkycy5jIGIvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWkycy5jCmluZGV4IGQwYmNmM2YuLjcxNWU4NDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1pMnMuYworKysgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMKQEAgLTQ3Niw3ICs0NzYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBraXJrd29vZF9pMnNfZHJpdmVyID0gewogCS5wcm9iZSAgPSBraXJrd29vZF9pMnNfZGV2X3Byb2JlLAotCS5yZW1vdmUgPSBraXJrd29vZF9pMnNfZGV2X3JlbW92ZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoa2lya3dvb2RfaTJzX2Rldl9yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gRFJWX05BTUUsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLXQ1MzI1LmMgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtdDUzMjUuYwppbmRleCBjOGQyMTk1Li5jNzcyYjNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtdDUzMjUuYworKysgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtdDUzMjUuYwpAQCAtNzksOCArNzksNiBAQAogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbWlkLXg4Ni9tZmxkX21hY2hpbmUuYyBiL3NvdW5kL3NvYy9taWQteDg2L21mbGRfbWFjaGluZS5jCmluZGV4IDQyOWFhMWIuLmNjYTY5M2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9taWQteDg2L21mbGRfbWFjaGluZS5jCisrKyBiL3NvdW5kL3NvYy9taWQteDg2L21mbGRfbWFjaGluZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtNTQsOSArNTUsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludAlsb19kYWM7CiAKIHN0cnVjdCBtZmxkX21jX3ByaXZhdGUgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNvY2RldjsKIAl2b2lkIF9faW9tZW0gKmludF9iYXNlOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAl1OCBpbnRlcnJ1cHRfc3RhdHVzOwogfTsKIApAQCAtMjM1LDcgKzIzNCw2IEBACiAJLyogYWx3YXlzIGNvbm5lY3RlZCAqLwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmVzIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJcmV0X3ZhbCA9IHNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBtZmxkX3NuZF9jb250cm9scywKIAkJCQlBUlJBWV9TSVpFKG1mbGRfc25kX2NvbnRyb2xzKSk7CkBAIC0yNTMsNyArMjUxLDYgQEAKIAkvKiB3ZSBkb250IHVzZSBsaW5laW4gaW4gdGhpcyBzbyBzZXQgdG8gTkMgKi8KIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVJTkwiKTsKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVJTlIiKTsKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCS8qIEhlYWRzZXQgYW5kIGJ1dHRvbiBqYWNrIGRldGVjdGlvbiAqLwogCXJldF92YWwgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSW50ZWwoUikgTUlEIEF1ZGlvIEphY2siLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL21pZC14ODYvc3N0X3BsYXRmb3JtLmMgYi9zb3VuZC9zb2MvbWlkLXg4Ni9zc3RfcGxhdGZvcm0uYwppbmRleCAzZTc4MjYwLi4yMzA1NzAyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvbWlkLXg4Ni9zc3RfcGxhdGZvcm0uYworKysgYi9zb3VuZC9zb2MvbWlkLXg4Ni9zc3RfcGxhdGZvcm0uYwpAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTYzLDcgKzY0LDcgQEAKIH07CiAKIC8qIE1GTEQgLSBNU0lDICovCi1zdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHNzdF9wbGF0Zm9ybV9kYWlbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHNzdF9wbGF0Zm9ybV9kYWlbXSA9IHsKIHsKIAkubmFtZSA9ICJIZWFkc2V0LWNwdS1kYWkiLAogCS5pZCA9IDAsCkBAIC0yMjYsMTMgKzIyNywxOCBAQAogCiBzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07CiAJaW50IHJldF92YWwgPSAwOwogCiAJcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9vcGVuIGNhbGxlZFxuIik7Ci0JcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlydW50aW1lLT5odyA9IHNzdF9wbGF0Zm9ybV9wY21faHc7CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnNzdF9wbGF0Zm9ybV9wY21faHcpOworCXJldF92YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCWlmIChyZXRfdmFsIDwgMCkKKwkJcmV0dXJuIHJldF92YWw7CisKIAlzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzdHJlYW0pCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjU5LDggKzI2NSw4IEBACiAJCXJldHVybiByZXRfdmFsOwogCX0KIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBzdHJlYW07Ci0JcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCi0JCQkgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpAQCAtNDY5LDcgKzQ3NSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBzc3Rfc29jX3BsYXRmb3JtX2luaXQodm9pZCkKIHsKIAlwcl9kZWJ1Zygic3N0X3NvY19wbGF0Zm9ybV9pbml0IGNhbGxlZFxuIik7Ci0JcmV0dXJuICBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNzdF9wbGF0Zm9ybV9kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNzdF9wbGF0Zm9ybV9kcml2ZXIpOwogfQogbW9kdWxlX2luaXQoc3N0X3NvY19wbGF0Zm9ybV9pbml0KTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL214cy9LY29uZmlnIGIvc291bmQvc29jL214cy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YmE4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXhzL0tjb25maWcKQEAgLTAsMCArMSwyMCBAQAorbWVudWNvbmZpZyBTTkRfTVhTX1NPQworCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIEZyZWVzY2FsZSBNWFMgQ1BVcyIKKwlkZXBlbmRzIG9uIEFSQ0hfTVhTCisJc2VsZWN0IFNORF9QQ00KKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KKwkgIHRoZSBNWFMgU0FJRiBpbnRlcmZhY2UuCisKKworaWYgU05EX01YU19TT0MKKworY29uZmlnIFNORF9TT0NfTVhTX1NHVEw1MDAwCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBpLk1YIGJvYXJkcyB3aXRoIHNndGw1MDAwIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFNORF9TT0NfU0dUTDUwMDAKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIGFuIE1YUyBib2FyZCB3aXRoCisJICBhIHNndGw1MDAwIGNvZGVjLgorCitlbmRpZgkjIFNORF9NWFNfU09DCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXhzL01ha2VmaWxlIGIvc291bmQvc29jL214cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjViNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL214cy9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjIE1YUyBQbGF0Zm9ybSBTdXBwb3J0CitzbmQtc29jLW14cy1vYmpzIDo9IG14cy1zYWlmLm8KK3NuZC1zb2MtbXhzLXBjbS1vYmpzIDo9IG14cy1wY20ubworCitvYmotJChDT05GSUdfU05EX01YU19TT0MpICs9IHNuZC1zb2MtbXhzLm8gc25kLXNvYy1teHMtcGNtLm8KKworIyBpLk1YIE1hY2hpbmUgU3VwcG9ydAorc25kLXNvYy1teHMtc2d0bDUwMDAtb2JqcyA6PSBteHMtc2d0bDUwMDAubworCitvYmotJChDT05GSUdfU05EX1NPQ19NWFNfU0dUTDUwMDApICs9IHNuZC1zb2MtbXhzLXNndGw1MDAwLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9teHMvbXhzLXBjbS5jIGIvc291bmQvc29jL214cy9teHMtcGNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNWFhNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9teHMvbXhzLXBjbS5jCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gc291bmQvc29jL2lteC9pbXgtcGNtLWRtYS1teDIuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorI2luY2x1ZGUgIm14cy1wY20uaCIKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9teHNfaGFyZHdhcmUgPSB7CisJLmluZm8JCQk9IFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJICBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQkJICBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQsCisJLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwKKwkJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCS5jaGFubmVsc19taW4JCT0gMiwKKwkuY2hhbm5lbHNfbWF4CQk9IDIsCisJLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKKwkucGVyaW9kX2J5dGVzX21heAk9IDgxOTIsCisJLnBlcmlvZHNfbWluCQk9IDEsCisJLnBlcmlvZHNfbWF4CQk9IDUyLAorCS5idWZmZXJfYnl0ZXNfbWF4CT0gNjQgKiAxMDI0LAorCS5maWZvX3NpemUJCT0gMzIsCisKK307CisKK3N0YXRpYyB2b2lkIGF1ZGlvX2RtYV9pcnEodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKilkYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG14c19wY21fcnVudGltZV9kYXRhICppcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlwcnRkLT5vZmZzZXQgKz0gaXBydGQtPnBlcmlvZF9ieXRlczsKKwlpcHJ0ZC0+b2Zmc2V0ICU9IGlwcnRkLT5wZXJpb2RfYnl0ZXMgKiBpcHJ0ZC0+cGVyaW9kczsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBib29sIGZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBteHNfcGNtX3J1bnRpbWVfZGF0YSAqaXBydGQgPSBwYXJhbTsKKwlzdHJ1Y3QgbXhzX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zID0gaXBydGQtPmRtYV9wYXJhbXM7CisKKwlpZiAoIW14c19kbWFfaXNfYXBieChjaGFuKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGNoYW4tPmNoYW5faWQgIT0gZG1hX3BhcmFtcy0+Y2hhbl9udW0pCisJCXJldHVybiBmYWxzZTsKKworCWNoYW4tPnByaXZhdGUgPSAmaXBydGQtPmRtYV9kYXRhOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgbXhzX2RtYV9hbGxvYyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXhzX3BjbV9ydW50aW1lX2RhdGEgKmlwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWRtYV9jYXBfbWFza190IG1hc2s7CisKKwlpcHJ0ZC0+ZG1hX3BhcmFtcyA9IHNuZF9zb2NfZGFpX2dldF9kbWFfZGF0YShydGQtPmNwdV9kYWksIHN1YnN0cmVhbSk7CisKKwlkbWFfY2FwX3plcm8obWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKKwlpcHJ0ZC0+ZG1hX2RhdGEuY2hhbl9pcnEgPSBpcHJ0ZC0+ZG1hX3BhcmFtcy0+Y2hhbl9pcnE7CisJaXBydGQtPmRtYV9jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBmaWx0ZXIsIGlwcnRkKTsKKwlpZiAoIWlwcnRkLT5kbWFfY2hhbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfbXhzX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXhzX3BjbV9ydW50aW1lX2RhdGEgKmlwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZG1hX2FkZHI7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCWludCByZXQ7CisKKwlyZXQgPSBteHNfZG1hX2FsbG9jKHN1YnN0cmVhbSwgcGFyYW1zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWNoYW4gPSBpcHJ0ZC0+ZG1hX2NoYW47CisKKwlpcHJ0ZC0+c2l6ZSA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKTsKKwlpcHJ0ZC0+cGVyaW9kcyA9IHBhcmFtc19wZXJpb2RzKHBhcmFtcyk7CisJaXBydGQtPnBlcmlvZF9ieXRlcyA9IHBhcmFtc19wZXJpb2RfYnl0ZXMocGFyYW1zKTsKKwlpcHJ0ZC0+b2Zmc2V0ID0gMDsKKwlpcHJ0ZC0+cGVyaW9kX3RpbWUgPSBIWiAvIChwYXJhbXNfcmF0ZShwYXJhbXMpIC8KKwkJCXBhcmFtc19wZXJpb2Rfc2l6ZShwYXJhbXMpKTsKKworCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CisKKwlkbWFfYWRkciA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCisJaXBydGQtPmJ1ZiA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhOworCisJaXBydGQtPmRlc2MgPSBjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX2RtYV9jeWNsaWMoY2hhbiwgZG1hX2FkZHIsCisJCQlpcHJ0ZC0+cGVyaW9kX2J5dGVzICogaXBydGQtPnBlcmlvZHMsCisJCQlpcHJ0ZC0+cGVyaW9kX2J5dGVzLAorCQkJc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/CisJCQlETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoIWlwcnRkLT5kZXNjKSB7CisJCWRldl9lcnIoJmNoYW4tPmRldi0+ZGV2aWNlLCAiY2Fubm90IHByZXBhcmUgc2xhdmUgZG1hXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXBydGQtPmRlc2MtPmNhbGxiYWNrID0gYXVkaW9fZG1hX2lycTsKKwlpcHJ0ZC0+ZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBzdWJzdHJlYW07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfbXhzX3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG14c19wY21fcnVudGltZV9kYXRhICppcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlmIChpcHJ0ZC0+ZG1hX2NoYW4pIHsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChpcHJ0ZC0+ZG1hX2NoYW4pOworCQlpcHJ0ZC0+ZG1hX2NoYW4gPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9teHNfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXhzX3BjbV9ydW50aW1lX2RhdGEgKmlwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJZG1hZW5naW5lX3N1Ym1pdChpcHJ0ZC0+ZGVzYyk7CisKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGlwcnRkLT5kbWFfY2hhbik7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfbXhzX3BjbV9wb2ludGVyKAorCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBteHNfcGNtX3J1bnRpbWVfZGF0YSAqaXBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgaXBydGQtPm9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX214c19vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG14c19wY21fcnVudGltZV9kYXRhICppcHJ0ZDsKKwlpbnQgcmV0OworCisJaXBydGQgPSBremFsbG9jKHNpemVvZigqaXBydGQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaXBydGQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gaXBydGQ7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihzdWJzdHJlYW0tPnJ1bnRpbWUsCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoaXBydGQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmc25kX214c19oYXJkd2FyZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfbXhzX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG14c19wY21fcnVudGltZV9kYXRhICppcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWtmcmVlKGlwcnRkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9teHNfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlyZXR1cm4gZG1hX21tYXBfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIHZtYSwKKwkJCQkJcnVudGltZS0+ZG1hX2FyZWEsCisJCQkJCXJ1bnRpbWUtPmRtYV9hZGRyLAorCQkJCQlydW50aW1lLT5kbWFfYnl0ZXMpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIG14c19wY21fb3BzID0geworCS5vcGVuCQk9IHNuZF9teHNfb3BlbiwKKwkuY2xvc2UJCT0gc25kX214c19jbG9zZSwKKwkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcwk9IHNuZF9teHNfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IHNuZF9teHNfcGNtX2h3X2ZyZWUsCisJLnRyaWdnZXIJPSBzbmRfbXhzX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyCT0gc25kX214c19wY21fcG9pbnRlciwKKwkubW1hcAkJPSBzbmRfbXhzX3BjbV9tbWFwLAorfTsKKworc3RhdGljIGludCBteHNfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc2l6ZV90IHNpemUgPSBzbmRfbXhzX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXg7CisKKwlidWYtPmRldi50eXBlID0gU05EUlZfRE1BX1RZUEVfREVWOworCWJ1Zi0+ZGV2LmRldiA9IHBjbS0+Y2FyZC0+ZGV2OworCWJ1Zi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlidWYtPmFyZWEgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKHBjbS0+Y2FyZC0+ZGV2LCBzaXplLAorCQkJCQkgICAmYnVmLT5hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi0+YXJlYSkKKwkJcmV0dXJuIC1FTk9NRU07CisJYnVmLT5ieXRlcyA9IHNpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCBteHNfcGNtX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworc3RhdGljIGludCBteHNfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCWludCByZXQgPSAwOworCisJaWYgKCFjYXJkLT5kZXYtPmRtYV9tYXNrKQorCQljYXJkLT5kZXYtPmRtYV9tYXNrID0gJm14c19wY21fZG1hbWFzazsKKwlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pIHsKKwkJcmV0ID0gbXhzX3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkgeworCQlyZXQgPSBteHNfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIocGNtLAorCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG14c19wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmOworCWludCBzdHJlYW07CisKKwlmb3IgKHN0cmVhbSA9IDA7IHN0cmVhbSA8IDI7IHN0cmVhbSsrKSB7CisJCXN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwkJaWYgKCFzdWJzdHJlYW0pCisJCQljb250aW51ZTsKKworCQlidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOworCQlpZiAoIWJ1Zi0+YXJlYSkKKwkJCWNvbnRpbnVlOworCisJCWRtYV9mcmVlX3dyaXRlY29tYmluZShwY20tPmNhcmQtPmRldiwgYnVmLT5ieXRlcywKKwkJCQkgICAgICBidWYtPmFyZWEsIGJ1Zi0+YWRkcik7CisJCWJ1Zi0+YXJlYSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG14c19zb2NfcGxhdGZvcm0gPSB7CisJLm9wcwkJPSAmbXhzX3BjbV9vcHMsCisJLnBjbV9uZXcJPSBteHNfcGNtX25ldywKKwkucGNtX2ZyZWUJPSBteHNfcGNtX2ZyZWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteHNfc29jX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwgJm14c19zb2NfcGxhdGZvcm0pOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBteHNfc29jX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteHNfcGNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJteHMtcGNtLWF1ZGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBteHNfc29jX3BsYXRmb3JtX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChteHNfc29jX3BsYXRmb3JtX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzbmRfbXhzX3BjbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhzX3BjbV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoc25kX214c19wY21faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbmRfbXhzX3BjbV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm14c19wY21fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNuZF9teHNfcGNtX2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL214cy9teHMtcGNtLmggYi9zb3VuZC9zb2MvbXhzL214cy1wY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTVhYzRmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL214cy9teHMtcGNtLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfTVhTX1BDTV9ICisjZGVmaW5lIF9NWFNfUENNX0gKKworI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisKK3N0cnVjdCBteHNfcGNtX2RtYV9wYXJhbXMgeworCWludCBjaGFuX2lycTsKKwlpbnQgY2hhbl9udW07Cit9OworCitzdHJ1Y3QgbXhzX3BjbV9ydW50aW1lX2RhdGEgeworCWludCBwZXJpb2RfYnl0ZXM7CisJaW50IHBlcmlvZHM7CisJaW50IGRtYTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdm9pZCAqYnVmOworCWludCBwZXJpb2RfdGltZTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IGRtYV9jaGFuICpkbWFfY2hhbjsKKwlzdHJ1Y3QgbXhzX2RtYV9kYXRhIGRtYV9kYXRhOworCXN0cnVjdCBteHNfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9teHMvbXhzLXNhaWYuYyBiL3NvdW5kL3NvYy9teHMvbXhzLXNhaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmRjNzRkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL214cy9teHMtc2FpZi5jCkBAIC0wLDAgKzEsNzk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zYWlmLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL214cy5oPgorCisjaW5jbHVkZSAibXhzLXNhaWYuaCIKKworc3RhdGljIHN0cnVjdCBteHNfc2FpZiAqbXhzX3NhaWZbMl07CisKKy8qCisgKiBTQUlGIGlzIGEgbGl0dGxlIGRpZmZlcmVudCB3aXRoIG90aGVyIG5vcm1hbCBTT0MgREFJcyBvbiBjbG9jayB1c2luZy4KKyAqCisgKiBGb3IgTVhTLCB0d28gU0FJRiBtb2R1bGVzIGFyZSBpbnN0YW50aWF0ZWQgb24tY2hpcC4KKyAqIEVhY2ggU0FJRiBoYXMgYSBzZXQgb2YgY2xvY2sgcGlucyBhbmQgY2FuIGJlIG9wZXJhdGluZyBpbiBtYXN0ZXIKKyAqIG1vZGUgc2ltdWx0YW5lb3VzbHkgaWYgdGhleSBhcmUgY29ubmVjdGVkIHRvIGRpZmZlcmVudCBvZmYtY2hpcCBjb2RlY3MuCisgKiBBbHNvLCBvbmUgb2YgdGhlIHR3byBTQUlGcyBjYW4gbWFzdGVyIG9yIGRyaXZlIHRoZSBjbG9jayBwaW5zIHdoaWxlIHRoZQorICogb3RoZXIgU0FJRiwgaW4gc2xhdmUgbW9kZSwgcmVjZWl2ZXMgY2xvY2tpbmcgZnJvbSB0aGUgbWFzdGVyIFNBSUYuCisgKiBUaGlzIGFsc28gbWVhbnMgdGhhdCBib3RoIFNBSUZzIG11c3Qgb3BlcmF0ZSBhdCB0aGUgc2FtZSBzYW1wbGUgcmF0ZS4KKyAqCisgKiBXZSBhYnN0cmFjdCB0aGlzIGFzIGVhY2ggc2FpZiBoYXMgYSBtYXN0ZXIsIHRoZSBtYXN0ZXIgY291bGQgYmUKKyAqIGhpbXNlbGYgb3Igb3RoZXIgc2FpZnMuIEluIHRoZSBnZW5lcmljIHNhaWYgZHJpdmVyLCBzYWlmIGRvZXMgbm90IG5lZWQKKyAqIHRvIGtub3cgdGhlIGRpZmZlcmVudCBjbGttdXguIFNhaWYgb25seSBuZWVkcyB0byBrbm93IHdobyBpcyBoaXMgbWFzdGVyCisgKiBhbmQgb3BlcmF0aW5nIGhpcyBtYXN0ZXIgdG8gZ2VuZXJhdGUgdGhlIHByb3BlciBjbG9jayByYXRlIGZvciBoaW0uCisgKiBUaGUgbWFzdGVyIGlkIGlzIHByb3ZpZGVkIGluIG1hY2gtc3BlY2lmaWMgbGF5ZXIgYWNjb3JkaW5nIHRvIGRpZmZlcmVudAorICogY2xrbXV4IHNldHRpbmcuCisgKi8KKworc3RhdGljIGludCBteHNfc2FpZl9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksCisJCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3QgbXhzX3NhaWYgKnNhaWYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKworCXN3aXRjaCAoY2xrX2lkKSB7CisJY2FzZSBNWFNfU0FJRl9NQ0xLOgorCQlzYWlmLT5tY2xrID0gZnJlcTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU2luY2UgU0FJRiBtYXkgd29yayBvbiBFWFRNQVNURVIgbW9kZSwgSU9XLCBpdCdzIHdvcmtpbmcgQklUQ0xLJkxSQ0xLCisgKiBpcyBwcm92aWRlZCBieSBvdGhlciBTQUlGLCB3ZSBwcm92aWRlIGEgaW50ZXJmYWNlIGhlcmUgdG8gZ2V0IGl0cyBtYXN0ZXIKKyAqIGZyb20gaXRzIG1hc3Rlcl9pZC4KKyAqIE5vdGUgdGhhdCB0aGUgbWFzdGVyIGNvdWxkIGJlIGhpbXNlbGYuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG14c19zYWlmICpteHNfc2FpZl9nZXRfbWFzdGVyKHN0cnVjdCBteHNfc2FpZiAqIHNhaWYpCit7CisJcmV0dXJuIG14c19zYWlmW3NhaWYtPm1hc3Rlcl9pZF07Cit9CisKKy8qCisgKiBTZXQgU0FJRiBjbG9jayBhbmQgTUNMSworICovCitzdGF0aWMgaW50IG14c19zYWlmX3NldF9jbGsoc3RydWN0IG14c19zYWlmICpzYWlmLAorCQkJCSAgdW5zaWduZWQgaW50IG1jbGssCisJCQkJICB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1MzIgc2NyOworCWludCByZXQ7CisJc3RydWN0IG14c19zYWlmICptYXN0ZXJfc2FpZjsKKworCWRldl9kYmcoc2FpZi0+ZGV2LCAibWNsayAlZCByYXRlICVkXG4iLCBtY2xrLCByYXRlKTsKKworCS8qIFNldCBtYXN0ZXIgc2FpZiB0byBnZW5lcmF0ZSBwcm9wZXIgY2xvY2sgKi8KKwltYXN0ZXJfc2FpZiA9IG14c19zYWlmX2dldF9tYXN0ZXIoc2FpZik7CisJaWYgKCFtYXN0ZXJfc2FpZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKHNhaWYtPmRldiwgIm1hc3RlciBzYWlmJWRcbiIsIG1hc3Rlcl9zYWlmLT5pZCk7CisKKwkvKiBDaGVja2luZyBpZiBjYW4gcGxheWJhY2sgYW5kIGNhcHR1cmUgc2ltdXRhbmVvdXNseSAqLworCWlmIChtYXN0ZXJfc2FpZi0+b25nb2luZyAmJiByYXRlICE9IG1hc3Rlcl9zYWlmLT5jdXJfcmF0ZSkgeworCQlkZXZfZXJyKHNhaWYtPmRldiwKKwkJCSJjYW4gbm90IGNoYW5nZSBjbG9jaywgbWFzdGVyIHNhaWYlZChyYXRlICVkKSBpcyBvbmdvaW5nXG4iLAorCQkJbWFzdGVyX3NhaWYtPmlkLCBtYXN0ZXJfc2FpZi0+Y3VyX3JhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzY3IgPSBfX3Jhd19yZWFkbChtYXN0ZXJfc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCk7CisJc2NyICY9IH5CTV9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURTsKKwlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9CSVRDTEtfQkFTRV9SQVRFOworCisJLyoKKwkgKiBTZXQgU0FJRiBjbG9jaworCSAqCisJICogVGhlIFNBSUYgY2xvY2sgc2hvdWxkIGJlIGVpdGhlciAzODQqZnMgb3IgNTEyKmZzLgorCSAqIElmIE1DTEsgaXMgdXNlZCwgdGhlIFNBSUYgY2xrIHJhdGlvIG5lZWQgdG8gbWF0Y2ggbWNsayByYXRpby4KKwkgKiAgRm9yIDMyeCBtY2xrLCBzZXQgc2FpZiBjbGsgYXMgNTEyKmZzLgorCSAqICBGb3IgNDh4IG1jbGssIHNldCBzYWlmIGNsayBhcyAzODQqZnMuCisJICoKKwkgKiBJZiBNQ0xLIGlzIG5vdCB1c2VkLCB3ZSBqdXN0IHNldCBzYWlmIGNsayB0byA1MTIqZnMuCisJICovCisJaWYgKG1hc3Rlcl9zYWlmLT5tY2xrX2luX3VzZSkgeworCQlpZiAobWNsayAlIDMyID09IDApIHsKKwkJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0JJVENMS19CQVNFX1JBVEU7CisJCQlyZXQgPSBjbGtfc2V0X3JhdGUobWFzdGVyX3NhaWYtPmNsaywgNTEyICogcmF0ZSk7CisJCX0gZWxzZSBpZiAobWNsayAlIDQ4ID09IDApIHsKKwkJCXNjciB8PSBCTV9TQUlGX0NUUkxfQklUQ0xLX0JBU0VfUkFURTsKKwkJCXJldCA9IGNsa19zZXRfcmF0ZShtYXN0ZXJfc2FpZi0+Y2xrLCAzODQgKiByYXRlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNBSUYgTUNMSyBzaG91bGQgYmUgZWl0aGVyIDMyeCBvciA0OHggKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gY2xrX3NldF9yYXRlKG1hc3Rlcl9zYWlmLT5jbGssIDUxMiAqIHJhdGUpOworCQlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9CSVRDTEtfQkFTRV9SQVRFOworCX0KKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltYXN0ZXJfc2FpZi0+Y3VyX3JhdGUgPSByYXRlOworCisJaWYgKCFtYXN0ZXJfc2FpZi0+bWNsa19pbl91c2UpIHsKKwkJX19yYXdfd3JpdGVsKHNjciwgbWFzdGVyX3NhaWYtPmJhc2UgKyBTQUlGX0NUUkwpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFByb2dyYW0gdGhlIG92ZXItc2FtcGxlIHJhdGUgZm9yIE1DTEsgb3V0cHV0CisJICoKKwkgKiBUaGUgYXZhaWxhYmxlIE1DTEsgcmFuZ2UgaXMgMzJ4LCA0OHguLi4gNTEyeC4gVGhlIHJhdGUKKwkgKiBjb3VsZCBiZSBmcm9tIDhrSHogdG8gMTkya0guCisJICovCisJc3dpdGNoIChtY2xrIC8gcmF0ZSkgeworCWNhc2UgMzI6CisJCXNjciB8PSBCRl9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURSg0KTsKKwkJYnJlYWs7CisJY2FzZSA2NDoKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKDMpOworCQlicmVhazsKKwljYXNlIDEyODoKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKDIpOworCQlicmVhazsKKwljYXNlIDI1NjoKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKDEpOworCQlicmVhazsKKwljYXNlIDUxMjoKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKDApOworCQlicmVhazsKKwljYXNlIDQ4OgorCQlzY3IgfD0gQkZfU0FJRl9DVFJMX0JJVENMS19NVUxUX1JBVEUoMyk7CisJCWJyZWFrOworCWNhc2UgOTY6CisJCXNjciB8PSBCRl9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURSgyKTsKKwkJYnJlYWs7CisJY2FzZSAxOTI6CisJCXNjciB8PSBCRl9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURSgxKTsKKwkJYnJlYWs7CisJY2FzZSAzODQ6CisJCXNjciB8PSBCRl9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURSgwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJX19yYXdfd3JpdGVsKHNjciwgbWFzdGVyX3NhaWYtPmJhc2UgKyBTQUlGX0NUUkwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQdXQgYW5kIGRpc2FibGUgTUNMSy4KKyAqLworaW50IG14c19zYWlmX3B1dF9tY2xrKHVuc2lnbmVkIGludCBzYWlmX2lkKQoreworCXN0cnVjdCBteHNfc2FpZiAqc2FpZiA9IG14c19zYWlmW3NhaWZfaWRdOworCXUzMiBzdGF0OworCisJaWYgKCFzYWlmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXQgPSBfX3Jhd19yZWFkbChzYWlmLT5iYXNlICsgU0FJRl9TVEFUKTsKKwlpZiAoc3RhdCAmIEJNX1NBSUZfU1RBVF9CVVNZKSB7CisJCWRldl9lcnIoc2FpZi0+ZGV2LCAiZXJyb3I6IGJ1c3lcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNsa19kaXNhYmxlKHNhaWYtPmNsayk7CisKKwkvKiBkaXNhYmxlIE1DTEsgb3V0cHV0ICovCisJX19yYXdfd3JpdGVsKEJNX1NBSUZfQ1RSTF9DTEtHQVRFLAorCQlzYWlmLT5iYXNlICsgU0FJRl9DVFJMICsgTVhTX1NFVF9BRERSKTsKKwlfX3Jhd193cml0ZWwoQk1fU0FJRl9DVFJMX1JVTiwKKwkJc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCArIE1YU19DTFJfQUREUik7CisKKwlzYWlmLT5tY2xrX2luX3VzZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgTUNMSyBhbmQgc2V0IGNsb2NrIHJhdGUsIHRoZW4gZW5hYmxlIGl0CisgKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgY29kZWNzIHdobyBhcmUgdXNpbmcgTUNMSyBwcm92aWRlZAorICogYnkgc2FpZi4KKyAqLworaW50IG14c19zYWlmX2dldF9tY2xrKHVuc2lnbmVkIGludCBzYWlmX2lkLCB1bnNpZ25lZCBpbnQgbWNsaywKKwkJCQkJdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gbXhzX3NhaWZbc2FpZl9pZF07CisJdTMyIHN0YXQ7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXhzX3NhaWYgKm1hc3Rlcl9zYWlmOworCisJaWYgKCFzYWlmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENsZWFyIFJlc2V0ICovCisJX19yYXdfd3JpdGVsKEJNX1NBSUZfQ1RSTF9TRlRSU1QsCisJCXNhaWYtPmJhc2UgKyBTQUlGX0NUUkwgKyBNWFNfQ0xSX0FERFIpOworCisJLyogRklYTUU6IG5lZWQgY2xlYXIgY2xrIGdhdGUgZm9yIHJlZ2lzdGVyIHIvdyAqLworCV9fcmF3X3dyaXRlbChCTV9TQUlGX0NUUkxfQ0xLR0FURSwKKwkJc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCArIE1YU19DTFJfQUREUik7CisKKwltYXN0ZXJfc2FpZiA9IG14c19zYWlmX2dldF9tYXN0ZXIoc2FpZik7CisJaWYgKHNhaWYgIT0gbWFzdGVyX3NhaWYpIHsKKwkJZGV2X2VycihzYWlmLT5kZXYsICJjYW4gbm90IGdldCBtY2xrIGZyb20gYSBub24tbWFzdGVyIHNhaWZcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdGF0ID0gX19yYXdfcmVhZGwoc2FpZi0+YmFzZSArIFNBSUZfU1RBVCk7CisJaWYgKHN0YXQgJiBCTV9TQUlGX1NUQVRfQlVTWSkgeworCQlkZXZfZXJyKHNhaWYtPmRldiwgImVycm9yOiBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzYWlmLT5tY2xrX2luX3VzZSA9IDE7CisJcmV0ID0gbXhzX3NhaWZfc2V0X2NsayhzYWlmLCBtY2xrLCByYXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX2VuYWJsZShzYWlmLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBlbmFibGUgTUNMSyBvdXRwdXQgKi8KKwlfX3Jhd193cml0ZWwoQk1fU0FJRl9DVFJMX1JVTiwKKwkJc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCArIE1YU19TRVRfQUREUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNBSUYgREFJIGZvcm1hdCBjb25maWd1cmF0aW9uLgorICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gcG9ydCBpcyBpbmFjdGl2ZS4KKyAqLworc3RhdGljIGludCBteHNfc2FpZl9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksIHVuc2lnbmVkIGludCBmbXQpCit7CisJdTMyIHNjciwgc3RhdDsKKwl1MzIgc2NyMDsKKwlzdHJ1Y3QgbXhzX3NhaWYgKnNhaWYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKworCXN0YXQgPSBfX3Jhd19yZWFkbChzYWlmLT5iYXNlICsgU0FJRl9TVEFUKTsKKwlpZiAoc3RhdCAmIEJNX1NBSUZfU1RBVF9CVVNZKSB7CisJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LCAiZXJyb3I6IGJ1c3lcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNjcjAgPSBfX3Jhd19yZWFkbChzYWlmLT5iYXNlICsgU0FJRl9DVFJMKTsKKwlzY3IwID0gc2NyMCAmIH5CTV9TQUlGX0NUUkxfQklUQ0xLX0VER0UgJiB+Qk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZIFwKKwkJJiB+Qk1fU0FJRl9DVFJMX0pVU1RJRlkgJiB+Qk1fU0FJRl9DVFJMX0RFTEFZOworCXNjciA9IDA7CisKKwkvKiBEQUkgbW9kZSAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJLyogZGF0YSBmcmFtZSBsb3cgMWNsayBiZWZvcmUgZGF0YSAqLworCQlzY3IgfD0gQk1fU0FJRl9DVFJMX0RFTEFZOworCQlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9MUkNMS19QT0xBUklUWTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCS8qIGRhdGEgZnJhbWUgaGlnaCB3aXRoIGRhdGEgKi8KKwkJc2NyICY9IH5CTV9TQUlGX0NUUkxfREVMQVk7CisJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZOworCQlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9KVVNUSUZZOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBEQUkgY2xvY2sgaW52ZXJzaW9uICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCXNjciB8PSBCTV9TQUlGX0NUUkxfQklUQ0xLX0VER0U7CisJCXNjciB8PSBCTV9TQUlGX0NUUkxfTFJDTEtfUE9MQVJJVFk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCXNjciB8PSBCTV9TQUlGX0NUUkxfQklUQ0xLX0VER0U7CisJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9CSVRDTEtfRURHRTsKKwkJc2NyIHw9IEJNX1NBSUZfQ1RSTF9MUkNMS19QT0xBUklUWTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJc2NyICY9IH5CTV9TQUlGX0NUUkxfQklUQ0xLX0VER0U7CisJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIE5vdGU6IFdlIHNpbXBseSBqdXN0IHN1cHBvcnQgbWFzdGVyIG1vZGUgc2luY2UgU0FJRiBUWCBjYW4gb25seQorCSAqIHdvcmsgYXMgbWFzdGVyLgorCSAqIEhlcmUgdGhlIG1hc3RlciBpcyByZWxhdGl2ZSB0byBjb2RlYyBzaWRlLgorCSAqIFNhaWYgaW50ZXJuYWxseSBjb3VsZCBiZSBzbGF2ZSB3aGVuIHdvcmtpbmcgb24gRVhUTUFTVEVSIG1vZGUuCisJICogV2UganVzdCBoaWRlIHRoaXMgdG8gbWFjaGluZSBkcml2ZXIuCisJICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJaWYgKHNhaWYtPmlkID09IHNhaWYtPm1hc3Rlcl9pZCkKKwkJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX1NMQVZFX01PREU7CisJCWVsc2UKKwkJCXNjciB8PSBCTV9TQUlGX0NUUkxfU0xBVkVfTU9ERTsKKworCQlfX3Jhd193cml0ZWwoc2NyIHwgc2NyMCwgc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14c19zYWlmX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7CisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGNwdV9kYWksIHN1YnN0cmVhbSwgJnNhaWYtPmRtYV9wYXJhbSk7CisKKwkvKiBjbGVhciBlcnJvciBzdGF0dXMgdG8gMCBmb3IgZWFjaCByZS1vcGVuICovCisJc2FpZi0+Zmlmb191bmRlcnJ1biA9IDA7CisJc2FpZi0+Zmlmb19vdmVycnVuID0gMDsKKworCS8qIENsZWFyIFJlc2V0IGZvciBub3JtYWwgb3BlcmF0aW9ucyAqLworCV9fcmF3X3dyaXRlbChCTV9TQUlGX0NUUkxfU0ZUUlNULAorCQlzYWlmLT5iYXNlICsgU0FJRl9DVFJMICsgTVhTX0NMUl9BRERSKTsKKworCS8qIGNsZWFyIGNsb2NrIGdhdGUgKi8KKwlfX3Jhd193cml0ZWwoQk1fU0FJRl9DVFJMX0NMS0dBVEUsCisJCXNhaWYtPmJhc2UgKyBTQUlGX0NUUkwgKyBNWFNfQ0xSX0FERFIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBwb3J0IGlzIGluYWN0aXZlLgorICogYWx0aG91Z2ggY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSB1cHBlciBsYXllcnMuCisgKi8KK3N0YXRpYyBpbnQgbXhzX3NhaWZfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQoreworCXN0cnVjdCBteHNfc2FpZiAqc2FpZiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOworCXUzMiBzY3IsIHN0YXQ7CisJaW50IHJldDsKKworCS8qIG1jbGsgc2hvdWxkIGFscmVhZHkgYmUgc2V0ICovCisJaWYgKCFzYWlmLT5tY2xrICYmIHNhaWYtPm1jbGtfaW5fdXNlKSB7CisJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LCAic2V0IG1jbGsgZmlyc3RcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdGF0ID0gX19yYXdfcmVhZGwoc2FpZi0+YmFzZSArIFNBSUZfU1RBVCk7CisJaWYgKHN0YXQgJiBCTV9TQUlGX1NUQVRfQlVTWSkgeworCQlkZXZfZXJyKGNwdV9kYWktPmRldiwgImVycm9yOiBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKgorCSAqIFNldCBzYWlmIGNsayBiYXNlZCBvbiBzYW1wbGUgcmF0ZS4KKwkgKiBJZiBtY2xrIGlzIHVzZWQsIHdlIGFsc28gc2V0IG1jbGssIGlmIG5vdCwgc2FpZi0+bWNsayBpcworCSAqIGRlZmF1bHQgMCwgbWVhbnMgbm90IHVzZWQuCisJICovCisJcmV0ID0gbXhzX3NhaWZfc2V0X2NsayhzYWlmLCBzYWlmLT5tY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LCAidW5hYmxlIHRvIGdldCBwcm9wZXIgY2xrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzY3IgPSBfX3Jhd19yZWFkbChzYWlmLT5iYXNlICsgU0FJRl9DVFJMKTsKKworCXNjciAmPSB+Qk1fU0FJRl9DVFJMX1dPUkRfTEVOR1RIOworCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0JJVENMS180OFhGU19FTkFCTEU7CisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlzY3IgfD0gQkZfU0FJRl9DVFJMX1dPUkRfTEVOR1RIKDApOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9XT1JEX0xFTkdUSCg0KTsKKwkJc2NyIHw9IEJNX1NBSUZfQ1RSTF9CSVRDTEtfNDhYRlNfRU5BQkxFOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQlzY3IgfD0gQkZfU0FJRl9DVFJMX1dPUkRfTEVOR1RIKDgpOworCQlzY3IgfD0gQk1fU0FJRl9DVFJMX0JJVENMS180OFhGU19FTkFCTEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFR4L1J4IGNvbmZpZyAqLworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCS8qIGVuYWJsZSBUWCBtb2RlICovCisJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX1JFQURfTU9ERTsKKwl9IGVsc2UgeworCQkvKiBlbmFibGUgUlggbW9kZSAqLworCQlzY3IgfD0gQk1fU0FJRl9DVFJMX1JFQURfTU9ERTsKKwl9CisKKwlfX3Jhd193cml0ZWwoc2NyLCBzYWlmLT5iYXNlICsgU0FJRl9DVFJMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteHNfc2FpZl9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQoreworCXN0cnVjdCBteHNfc2FpZiAqc2FpZiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOworCisJLyogZW5hYmxlIEZJRk8gZXJyb3IgaXJxcyAqLworCV9fcmF3X3dyaXRlbChCTV9TQUlGX0NUUkxfRklGT19FUlJPUl9JUlFfRU4sCisJCXNhaWYtPmJhc2UgKyBTQUlGX0NUUkwgKyBNWFNfU0VUX0FERFIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhzX3NhaWZfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCwKKwkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7CisJc3RydWN0IG14c19zYWlmICptYXN0ZXJfc2FpZjsKKwl1MzIgZGVsYXk7CisKKwltYXN0ZXJfc2FpZiA9IG14c19zYWlmX2dldF9tYXN0ZXIoc2FpZik7CisJaWYgKCFtYXN0ZXJfc2FpZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlkZXZfZGJnKGNwdV9kYWktPmRldiwgInN0YXJ0XG4iKTsKKworCQljbGtfZW5hYmxlKG1hc3Rlcl9zYWlmLT5jbGspOworCQlpZiAoIW1hc3Rlcl9zYWlmLT5tY2xrX2luX3VzZSkKKwkJCV9fcmF3X3dyaXRlbChCTV9TQUlGX0NUUkxfUlVOLAorCQkJCW1hc3Rlcl9zYWlmLT5iYXNlICsgU0FJRl9DVFJMICsgTVhTX1NFVF9BRERSKTsKKworCQkvKgorCQkgKiBJZiB0aGUgc2FpZidzIG1hc3RlciBpcyBub3QgaGltc2VsZiwgd2UgYWxzbyBuZWVkIHRvIGVuYWJsZQorCQkgKiBpdHNlbGYgY2xrIGZvciBpdHMgaW50ZXJuYWwgYmFzaWMgbG9naWMgdG8gd29yay4KKwkJICovCisJCWlmIChzYWlmICE9IG1hc3Rlcl9zYWlmKSB7CisJCQljbGtfZW5hYmxlKHNhaWYtPmNsayk7CisJCQlfX3Jhd193cml0ZWwoQk1fU0FJRl9DVFJMX1JVTiwKKwkJCQlzYWlmLT5iYXNlICsgU0FJRl9DVFJMICsgTVhTX1NFVF9BRERSKTsKKwkJfQorCisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCQkvKgorCQkJICogd3JpdGUgYSBkYXRhIHRvIHNhaWYgZGF0YSByZWdpc3RlciB0byB0cmlnZ2VyCisJCQkgKiB0aGUgdHJhbnNmZXIKKwkJCSAqLworCQkJX19yYXdfd3JpdGVsKDAsIHNhaWYtPmJhc2UgKyBTQUlGX0RBVEEpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHJlYWQgYSBkYXRhIGZyb20gc2FpZiBkYXRhIHJlZ2lzdGVyIHRvIHRyaWdnZXIKKwkJCSAqIHRoZSByZWNlaXZlCisJCQkgKi8KKwkJCV9fcmF3X3JlYWRsKHNhaWYtPmJhc2UgKyBTQUlGX0RBVEEpOworCQl9CisKKwkJbWFzdGVyX3NhaWYtPm9uZ29pbmcgPSAxOworCisJCWRldl9kYmcoc2FpZi0+ZGV2LCAiQ1RSTCAweCV4IFNUQVQgMHgleFxuIiwKKwkJCV9fcmF3X3JlYWRsKHNhaWYtPmJhc2UgKyBTQUlGX0NUUkwpLAorCQkJX19yYXdfcmVhZGwoc2FpZi0+YmFzZSArIFNBSUZfU1RBVCkpOworCisJCWRldl9kYmcobWFzdGVyX3NhaWYtPmRldiwgIkNUUkwgMHgleCBTVEFUIDB4JXhcbiIsCisJCQlfX3Jhd19yZWFkbChtYXN0ZXJfc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCksCisJCQlfX3Jhd19yZWFkbChtYXN0ZXJfc2FpZi0+YmFzZSArIFNBSUZfU1RBVCkpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJZGV2X2RiZyhjcHVfZGFpLT5kZXYsICJzdG9wXG4iKTsKKworCQkvKiB3YWl0IGEgd2hpbGUgZm9yIHRoZSBjdXJyZW50IHNhbXBsZSB0byBjb21wbGV0ZSAqLworCQlkZWxheSA9IFVTRUNfUEVSX1NFQyAvIG1hc3Rlcl9zYWlmLT5jdXJfcmF0ZTsKKworCQlpZiAoIW1hc3Rlcl9zYWlmLT5tY2xrX2luX3VzZSkgeworCQkJX19yYXdfd3JpdGVsKEJNX1NBSUZfQ1RSTF9SVU4sCisJCQkJbWFzdGVyX3NhaWYtPmJhc2UgKyBTQUlGX0NUUkwgKyBNWFNfQ0xSX0FERFIpOworCQkJdWRlbGF5KGRlbGF5KTsKKwkJfQorCQljbGtfZGlzYWJsZShtYXN0ZXJfc2FpZi0+Y2xrKTsKKworCQlpZiAoc2FpZiAhPSBtYXN0ZXJfc2FpZikgeworCQkJX19yYXdfd3JpdGVsKEJNX1NBSUZfQ1RSTF9SVU4sCisJCQkJc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCArIE1YU19DTFJfQUREUik7CisJCQl1ZGVsYXkoZGVsYXkpOworCQkJY2xrX2Rpc2FibGUoc2FpZi0+Y2xrKTsKKwkJfQorCisJCW1hc3Rlcl9zYWlmLT5vbmdvaW5nID0gMDsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNWFNfU0FJRl9SQVRFUwkJU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAKKyNkZWZpbmUgTVhTX1NBSUZfRk9STUFUUyBcCisJKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBteHNfc2FpZl9kYWlfb3BzID0geworCS5zdGFydHVwID0gbXhzX3NhaWZfc3RhcnR1cCwKKwkudHJpZ2dlciA9IG14c19zYWlmX3RyaWdnZXIsCisJLnByZXBhcmUgPSBteHNfc2FpZl9wcmVwYXJlLAorCS5od19wYXJhbXMgPSBteHNfc2FpZl9od19wYXJhbXMsCisJLnNldF9zeXNjbGsgPSBteHNfc2FpZl9zZXRfZGFpX3N5c2NsaywKKwkuc2V0X2ZtdCA9IG14c19zYWlmX3NldF9kYWlfZm10LAorfTsKKworc3RhdGljIGludCBteHNfc2FpZl9kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCXNuZF9zb2NfZGFpX3NldF9kcnZkYXRhKGRhaSwgc2FpZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXhzX3NhaWZfZGFpID0geworCS5uYW1lID0gIm14cy1zYWlmIiwKKwkucHJvYmUgPSBteHNfc2FpZl9kYWlfcHJvYmUsCisJLnBsYXliYWNrID0geworCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IE1YU19TQUlGX1JBVEVTLAorCQkuZm9ybWF0cyA9IE1YU19TQUlGX0ZPUk1BVFMsCisJfSwKKwkuY2FwdHVyZSA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBNWFNfU0FJRl9SQVRFUywKKwkJLmZvcm1hdHMgPSBNWFNfU0FJRl9GT1JNQVRTLAorCX0sCisJLm9wcyA9ICZteHNfc2FpZl9kYWlfb3BzLAorfTsKKworc3RhdGljIGlycXJldHVybl90IG14c19zYWlmX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0OworCisJc3RhdCA9IF9fcmF3X3JlYWRsKHNhaWYtPmJhc2UgKyBTQUlGX1NUQVQpOworCWlmICghKHN0YXQgJiAoQk1fU0FJRl9TVEFUX0ZJRk9fVU5ERVJGTE9XX0lSUSB8CisJCQlCTV9TQUlGX1NUQVRfRklGT19PVkVSRkxPV19JUlEpKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKHN0YXQgJiBCTV9TQUlGX1NUQVRfRklGT19VTkRFUkZMT1dfSVJRKSB7CisJCWRldl9kYmcoc2FpZi0+ZGV2LCAidW5kZXJydW4hISEgJWRcbiIsICsrc2FpZi0+Zmlmb191bmRlcnJ1bik7CisJCV9fcmF3X3dyaXRlbChCTV9TQUlGX1NUQVRfRklGT19VTkRFUkZMT1dfSVJRLAorCQkJCXNhaWYtPmJhc2UgKyBTQUlGX1NUQVQgKyBNWFNfQ0xSX0FERFIpOworCX0KKworCWlmIChzdGF0ICYgQk1fU0FJRl9TVEFUX0ZJRk9fT1ZFUkZMT1dfSVJRKSB7CisJCWRldl9kYmcoc2FpZi0+ZGV2LCAib3ZlcnJ1biEhISAlZFxuIiwgKytzYWlmLT5maWZvX292ZXJydW4pOworCQlfX3Jhd193cml0ZWwoQk1fU0FJRl9TVEFUX0ZJRk9fT1ZFUkZMT1dfSVJRLAorCQkJCXNhaWYtPmJhc2UgKyBTQUlGX1NUQVQgKyBNWFNfQ0xSX0FERFIpOworCX0KKworCWRldl9kYmcoc2FpZi0+ZGV2LCAiU0FJRl9DVFJMICV4IFNBSUZfU1RBVCAleFxuIiwKKwkgICAgICAgX19yYXdfcmVhZGwoc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCksCisJICAgICAgIF9fcmF3X3JlYWRsKHNhaWYtPmJhc2UgKyBTQUlGX1NUQVQpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBteHNfc2FpZl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqaW9yZXMsICpkbWFyZXM7CisJc3RydWN0IG14c19zYWlmICpzYWlmOworCXN0cnVjdCBteHNfc2FpZl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwZGV2LT5pZCA+PSBBUlJBWV9TSVpFKG14c19zYWlmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSAmJiBwZGF0YS0+aW5pdCkgeworCQlyZXQgPSBwZGF0YS0+aW5pdCgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlzYWlmID0ga3phbGxvYyhzaXplb2YoKnNhaWYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNhaWYpCisJCXJldHVybiAtRU5PTUVNOworCisJbXhzX3NhaWZbcGRldi0+aWRdID0gc2FpZjsKKwlzYWlmLT5pZCA9IHBkZXYtPmlkOworCisJc2FpZi0+bWFzdGVyX2lkID0gc2FpZi0+aWQ7CisJaWYgKHBkYXRhICYmIHBkYXRhLT5nZXRfbWFzdGVyX2lkKSB7CisJCXNhaWYtPm1hc3Rlcl9pZCA9IHBkYXRhLT5nZXRfbWFzdGVyX2lkKHNhaWYtPmlkKTsKKwkJaWYgKHNhaWYtPm1hc3Rlcl9pZCA8IDAgfHwKKwkJCXNhaWYtPm1hc3Rlcl9pZCA+PSBBUlJBWV9TSVpFKG14c19zYWlmKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNhaWYtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihzYWlmLT5jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoc2FpZi0+Y2xrKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGdldCB0aGUgY2xvY2s6ICVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBmYWlsZWRfY2xrOworCX0KKworCWlvcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIWlvcmVzKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaW8gcmVzb3VyY2U6ICVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBmYWlsZWRfZ2V0X3Jlc291cmNlOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcyksCisJCQkJIm14cy1zYWlmIikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZFxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBmYWlsZWRfZ2V0X3Jlc291cmNlOworCX0KKworCXNhaWYtPmJhc2UgPSBpb3JlbWFwKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcykpOworCWlmICghc2FpZi0+YmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbGVkX2lvcmVtYXA7CisJfQorCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAoIWRtYXJlcykgeworCQlyZXQgPSAtRU5PREVWOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGRtYSByZXNvdXJjZTogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGZhaWxlZF9pb3JlbWFwOworCX0KKwlzYWlmLT5kbWFfcGFyYW0uY2hhbl9udW0gPSBkbWFyZXMtPnN0YXJ0OworCisJc2FpZi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoc2FpZi0+aXJxIDwgMCkgeworCQlyZXQgPSBzYWlmLT5pcnE7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaXJxIHJlc291cmNlOiAlZFxuIiwKKwkJCXJldCk7CisJCWdvdG8gZmFpbGVkX2dldF9pcnExOworCX0KKworCXNhaWYtPmRldiA9ICZwZGV2LT5kZXY7CisJcmV0ID0gcmVxdWVzdF9pcnEoc2FpZi0+aXJxLCBteHNfc2FpZl9pcnEsIDAsICJteHMtc2FpZiIsIHNhaWYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxXG4iKTsKKwkJZ290byBmYWlsZWRfZ2V0X2lycTE7CisJfQorCisJc2FpZi0+ZG1hX3BhcmFtLmNoYW5faXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAoc2FpZi0+ZG1hX3BhcmFtLmNoYW5faXJxIDwgMCkgeworCQlyZXQgPSBzYWlmLT5kbWFfcGFyYW0uY2hhbl9pcnE7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgZG1hIGlycSByZXNvdXJjZTogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGZhaWxlZF9nZXRfaXJxMjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzYWlmKTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYsICZteHNfc2FpZl9kYWkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnaXN0ZXIgREFJIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkX3JlZ2lzdGVyOworCX0KKworCXNhaWYtPnNvY19wbGF0Zm9ybV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKAorCQkJCQkibXhzLXBjbS1hdWRpbyIsIHBkZXYtPmlkKTsKKwlpZiAoIXNhaWYtPnNvY19wbGF0Zm9ybV9wZGV2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX3BkZXZfYWxsb2M7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoc2FpZi0+c29jX3BsYXRmb3JtX3BkZXYsIHNhaWYpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc2FpZi0+c29jX3BsYXRmb3JtX3BkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBzb2MgcGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJZ290byBmYWlsZWRfcGRldl9hZGQ7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxlZF9wZGV2X2FkZDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNhaWYtPnNvY19wbGF0Zm9ybV9wZGV2KTsKK2ZhaWxlZF9wZGV2X2FsbG9jOgorCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldik7CitmYWlsZWRfcmVnaXN0ZXI6CitmYWlsZWRfZ2V0X2lycTI6CisJZnJlZV9pcnEoc2FpZi0+aXJxLCBzYWlmKTsKK2ZhaWxlZF9nZXRfaXJxMToKKwlpb3VubWFwKHNhaWYtPmJhc2UpOworZmFpbGVkX2lvcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcykpOworZmFpbGVkX2dldF9yZXNvdXJjZToKKwljbGtfcHV0KHNhaWYtPmNsayk7CitmYWlsZWRfY2xrOgorCWtmcmVlKHNhaWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbXhzX3NhaWZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXN0cnVjdCBteHNfc2FpZiAqc2FpZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2FpZi0+c29jX3BsYXRmb3JtX3BkZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKKworCWlvdW5tYXAoc2FpZi0+YmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJZnJlZV9pcnEoc2FpZi0+aXJxLCBzYWlmKTsKKworCWNsa19wdXQoc2FpZi0+Y2xrKTsKKwlrZnJlZShzYWlmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteHNfc2FpZl9kcml2ZXIgPSB7CisJLnByb2JlID0gbXhzX3NhaWZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG14c19zYWlmX3JlbW92ZSksCisKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJteHMtc2FpZiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBteHNfc2FpZl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhzX3NhaWZfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG14c19zYWlmX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXhzX3NhaWZfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXhzX3NhaWZfaW5pdCk7Cittb2R1bGVfZXhpdChteHNfc2FpZl9leGl0KTsKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1YUyBBU29DIFNBSUYgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXhzL214cy1zYWlmLmggYi9zb3VuZC9zb2MvbXhzL214cy1zYWlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjOTFlNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9teHMvbXhzLXNhaWYuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworCisjaWZuZGVmIF9NWFNfU0FJRl9ICisjZGVmaW5lIF9NWFNfU0FJRl9ICisKKyNkZWZpbmUgU0FJRl9DVFJMCTB4MAorI2RlZmluZSBTQUlGX1NUQVQJMHgxMAorI2RlZmluZSBTQUlGX0RBVEEJMHgyMAorI2RlZmluZSBTQUlGX1ZFUlNJT04JMFgzMAorCisvKiBTQUlGX0NUUkwgKi8KKyNkZWZpbmUgQk1fU0FJRl9DVFJMX1NGVFJTVAkJMHg4MDAwMDAwMAorI2RlZmluZSBCTV9TQUlGX0NUUkxfQ0xLR0FURQkJMHg0MDAwMDAwMAorI2RlZmluZSBCUF9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURQkyNworI2RlZmluZSBCTV9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURQkweDM4MDAwMDAwCisjZGVmaW5lIEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKHYpIFwKKwkJKCgodikgPDwgMjcpICYgQk1fU0FJRl9DVFJMX0JJVENMS19NVUxUX1JBVEUpCisjZGVmaW5lIEJNX1NBSUZfQ1RSTF9CSVRDTEtfQkFTRV9SQVRFCTB4MDQwMDAwMDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0ZJRk9fRVJST1JfSVJRX0VOCTB4MDIwMDAwMDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0ZJRk9fU0VSVklDRV9JUlFfRU4JMHgwMTAwMDAwMAorI2RlZmluZSBCUF9TQUlGX0NUUkxfUlNSVkQyCQkyMQorI2RlZmluZSBCTV9TQUlGX0NUUkxfUlNSVkQyCQkweDAwRTAwMDAwCisKKyNkZWZpbmUgQlBfU0FJRl9DVFJMX0RNQVdBSVRfQ09VTlQJMTYKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0RNQVdBSVRfQ09VTlQJMHgwMDFGMDAwMAorI2RlZmluZSBCRl9TQUlGX0NUUkxfRE1BV0FJVF9DT1VOVCh2KSBcCisJCSgoKHYpIDw8IDE2KSAmIEJNX1NBSUZfQ1RSTF9ETUFXQUlUX0NPVU5UKQorI2RlZmluZSBCUF9TQUlGX0NUUkxfQ0hBTk5FTF9OVU1fU0VMRUNUIDE0CisjZGVmaW5lIEJNX1NBSUZfQ1RSTF9DSEFOTkVMX05VTV9TRUxFQ1QgMHgwMDAwQzAwMAorI2RlZmluZSBCRl9TQUlGX0NUUkxfQ0hBTk5FTF9OVU1fU0VMRUNUKHYpIFwKKwkJKCgodikgPDwgMTQpICYgQk1fU0FJRl9DVFJMX0NIQU5ORUxfTlVNX1NFTEVDVCkKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0xSQ0xLX1BVTFNFCTB4MDAwMDIwMDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0JJVF9PUkRFUgkJMHgwMDAwMTAwMAorI2RlZmluZSBCTV9TQUlGX0NUUkxfREVMQVkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0pVU1RJRlkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZCTB4MDAwMDAyMDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0JJVENMS19FREdFCTB4MDAwMDAxMDAKKyNkZWZpbmUgQlBfU0FJRl9DVFJMX1dPUkRfTEVOR1RICTQKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX1dPUkRfTEVOR1RICTB4MDAwMDAwRjAKKyNkZWZpbmUgQkZfU0FJRl9DVFJMX1dPUkRfTEVOR1RIKHYpIFwKKwkJKCgodikgPDwgNCkgJiBCTV9TQUlGX0NUUkxfV09SRF9MRU5HVEgpCisjZGVmaW5lIEJNX1NBSUZfQ1RSTF9CSVRDTEtfNDhYRlNfRU5BQkxFCTB4MDAwMDAwMDgKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX1NMQVZFX01PREUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX1JFQURfTU9ERQkJMHgwMDAwMDAwMgorI2RlZmluZSBCTV9TQUlGX0NUUkxfUlVOCQkweDAwMDAwMDAxCisKKy8qIFNBSUZfU1RBVCAqLworI2RlZmluZSBCTV9TQUlGX1NUQVRfUFJFU0VOVAkJMHg4MDAwMDAwMAorI2RlZmluZSBCUF9TQUlGX1NUQVRfUlNSVkQyCQkxNworI2RlZmluZSBCTV9TQUlGX1NUQVRfUlNSVkQyCQkweDdGRkUwMDAwCisjZGVmaW5lIEJGX1NBSUZfU1RBVF9SU1JWRDIodikgXAorCQkoKCh2KSA8PCAxNykgJiBCTV9TQUlGX1NUQVRfUlNSVkQyKQorI2RlZmluZSBCTV9TQUlGX1NUQVRfRE1BX1BSRVEJCTB4MDAwMTAwMDAKKyNkZWZpbmUgQlBfU0FJRl9TVEFUX1JTUlZEMQkJNworI2RlZmluZSBCTV9TQUlGX1NUQVRfUlNSVkQxCQkweDAwMDBGRjgwCisjZGVmaW5lIEJGX1NBSUZfU1RBVF9SU1JWRDEodikgXAorCQkoKCh2KSA8PCA3KSAmIEJNX1NBSUZfU1RBVF9SU1JWRDEpCisKKyNkZWZpbmUgQk1fU0FJRl9TVEFUX0ZJRk9fVU5ERVJGTE9XX0lSUSAweDAwMDAwMDQwCisjZGVmaW5lIEJNX1NBSUZfU1RBVF9GSUZPX09WRVJGTE9XX0lSUQkweDAwMDAwMDIwCisjZGVmaW5lIEJNX1NBSUZfU1RBVF9GSUZPX1NFUlZJQ0VfSVJRCTB4MDAwMDAwMTAKKyNkZWZpbmUgQlBfU0FJRl9TVEFUX1JTUlZEMAkJMQorI2RlZmluZSBCTV9TQUlGX1NUQVRfUlNSVkQwCQkweDAwMDAwMDBFCisjZGVmaW5lIEJGX1NBSUZfU1RBVF9SU1JWRDAodikgXAorCQkoKCh2KSA8PCAxKSAmIEJNX1NBSUZfU1RBVF9SU1JWRDApCisjZGVmaW5lIEJNX1NBSUZfU1RBVF9CVVNZCQkweDAwMDAwMDAxCisKKy8qIFNBRklfREFUQSAqLworI2RlZmluZSBCUF9TQUlGX0RBVEFfUENNX1JJR0hUCQkxNgorI2RlZmluZSBCTV9TQUlGX0RBVEFfUENNX1JJR0hUCQkweEZGRkYwMDAwCisjZGVmaW5lIEJGX1NBSUZfREFUQV9QQ01fUklHSFQodikgXAorCQkoKCh2KSA8PCAxNikgJiBCTV9TQUlGX0RBVEFfUENNX1JJR0hUKQorI2RlZmluZSBCUF9TQUlGX0RBVEFfUENNX0xFRlQJCTAKKyNkZWZpbmUgQk1fU0FJRl9EQVRBX1BDTV9MRUZUCQkweDAwMDBGRkZGCisjZGVmaW5lIEJGX1NBSUZfREFUQV9QQ01fTEVGVCh2KQlcCisJCSgoKHYpIDw8IDApICYgQk1fU0FJRl9EQVRBX1BDTV9MRUZUKQorCisvKiBTQUlGX1ZFUlNJT04gKi8KKyNkZWZpbmUgQlBfU0FJRl9WRVJTSU9OX01BSk9SCQkyNAorI2RlZmluZSBCTV9TQUlGX1ZFUlNJT05fTUFKT1IJCTB4RkYwMDAwMDAKKyNkZWZpbmUgQkZfU0FJRl9WRVJTSU9OX01BSk9SKHYpIFwKKwkJKCgodikgPDwgMjQpICYgQk1fU0FJRl9WRVJTSU9OX01BSk9SKQorI2RlZmluZSBCUF9TQUlGX1ZFUlNJT05fTUlOT1IJCTE2CisjZGVmaW5lIEJNX1NBSUZfVkVSU0lPTl9NSU5PUgkJMHgwMEZGMDAwMAorI2RlZmluZSBCRl9TQUlGX1ZFUlNJT05fTUlOT1IodikgXAorCQkoKCh2KSA8PCAxNikgJiBCTV9TQUlGX1ZFUlNJT05fTUlOT1IpCisjZGVmaW5lIEJQX1NBSUZfVkVSU0lPTl9TVEVQCQkwCisjZGVmaW5lIEJNX1NBSUZfVkVSU0lPTl9TVEVQCQkweDAwMDBGRkZGCisjZGVmaW5lIEJGX1NBSUZfVkVSU0lPTl9TVEVQKHYpIFwKKwkJKCgodikgPDwgMCkgJiBCTV9TQUlGX1ZFUlNJT05fU1RFUCkKKworI2RlZmluZSBNWFNfU0FJRl9NQ0xLCQkwCisKKyNpbmNsdWRlICJteHMtcGNtLmgiCisKK3N0cnVjdCBteHNfc2FpZiB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBjbGsgKmNsazsKKwl1bnNpZ25lZCBpbnQgbWNsazsKKwl1bnNpZ25lZCBpbnQgbWNsa19pbl91c2U7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCBpcnE7CisJc3RydWN0IG14c19wY21fZG1hX3BhcmFtcyBkbWFfcGFyYW07CisJdW5zaWduZWQgaW50IGlkOworCXVuc2lnbmVkIGludCBtYXN0ZXJfaWQ7CisJdW5zaWduZWQgaW50IGN1cl9yYXRlOworCXVuc2lnbmVkIGludCBvbmdvaW5nOworCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc29jX3BsYXRmb3JtX3BkZXY7CisJdTMyIGZpZm9fdW5kZXJydW47CisJdTMyIGZpZm9fb3ZlcnJ1bjsKK307CisKK2V4dGVybiBpbnQgbXhzX3NhaWZfcHV0X21jbGsodW5zaWduZWQgaW50IHNhaWZfaWQpOworZXh0ZXJuIGludCBteHNfc2FpZl9nZXRfbWNsayh1bnNpZ25lZCBpbnQgc2FpZl9pZCwgdW5zaWduZWQgaW50IG1jbGssCisJCQkJCXVuc2lnbmVkIGludCByYXRlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL214cy9teHMtc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy9teHMvbXhzLXNndGw1MDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZWFlYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9teHMvbXhzLXNndGw1MDAwLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSAiLi4vY29kZWNzL3NndGw1MDAwLmgiCisjaW5jbHVkZSAibXhzLXNhaWYuaCIKKworc3RhdGljIGludCBteHNfc2d0bDUwMDBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwl1bnNpZ25lZCBpbnQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJdTMyIGRhaV9mb3JtYXQsIG1jbGs7CisJaW50IHJldDsKKworCS8qIHNndGw1MDAwIGRvZXMgbm90IHN1cHBvcnQgNTEyKnJhdGUgd2hlbiBpbiA5NjAwMCBmcyAqLworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgOTYwMDA6CisJCW1jbGsgPSAyNTYgKiByYXRlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltY2xrID0gNTEyICogcmF0ZTsKKwkJYnJlYWs7CisJfQorCisJLyogU2d0bDUwMDAgc3lzY2xrIHNob3VsZCBiZSA+PSA4TUh6IGFuZCA8PSAyN00gKi8KKwlpZiAobWNsayA8IDgwMDAwMDAgfHwgbWNsayA+IDI3MDAwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNldCBTR1RMNTAwMCdzIFNZU0NMSyAocHJvdmlkZWQgYnkgU0FJRiBNQ0xLKSAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBTR1RMNTAwMF9TWVNDTEssIG1jbGssIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBUaGUgU0FJRiBNQ0xLIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBTR1RMNTAwMF9TWVNDTEsgKi8KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNwdV9kYWksIE1YU19TQUlGX01DTEssIG1jbGssIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgY29kZWMgdG8gc2xhdmUgbW9kZSAqLworCWRhaV9mb3JtYXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOworCisJLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksIGRhaV9mb3JtYXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBkYWlfZm9ybWF0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXhzX3NndGw1MDAwX2hpZmlfb3BzID0geworCS5od19wYXJhbXMgPSBteHNfc2d0bDUwMDBfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG14c19zZ3RsNTAwMF9kYWlbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJIaUZpIFR4IiwKKwkJLnN0cmVhbV9uYW1lCT0gIkhpRmkgUGxheWJhY2siLAorCQkuY29kZWNfZGFpX25hbWUJPSAic2d0bDUwMDAiLAorCQkuY29kZWNfbmFtZQk9ICJzZ3RsNTAwMC4wLTAwMGEiLAorCQkuY3B1X2RhaV9uYW1lCT0gIm14cy1zYWlmLjAiLAorCQkucGxhdGZvcm1fbmFtZQk9ICJteHMtcGNtLWF1ZGlvLjAiLAorCQkub3BzCQk9ICZteHNfc2d0bDUwMDBfaGlmaV9vcHMsCisJfSwgeworCQkubmFtZQkJPSAiSGlGaSBSeCIsCisJCS5zdHJlYW1fbmFtZQk9ICJIaUZpIENhcHR1cmUiLAorCQkuY29kZWNfZGFpX25hbWUJPSAic2d0bDUwMDAiLAorCQkuY29kZWNfbmFtZQk9ICJzZ3RsNTAwMC4wLTAwMGEiLAorCQkuY3B1X2RhaV9uYW1lCT0gIm14cy1zYWlmLjEiLAorCQkucGxhdGZvcm1fbmFtZQk9ICJteHMtcGNtLWF1ZGlvLjEiLAorCQkub3BzCQk9ICZteHNfc2d0bDUwMDBfaGlmaV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIG14c19zZ3RsNTAwMCA9IHsKKwkubmFtZQkJPSAibXhzX3NndGw1MDAwIiwKKwkuZGFpX2xpbmsJPSBteHNfc2d0bDUwMDBfZGFpLAorCS5udW1fbGlua3MJPSBBUlJBWV9TSVpFKG14c19zZ3RsNTAwMF9kYWkpLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbXhzX3NndGw1MDAwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZteHNfc2d0bDUwMDA7CisJaW50IHJldDsKKworCS8qCisJICogU2V0IGFuIGluaXQgY2xvY2soMTEuMjhNaHopIGZvciBzZ3RsNTAwMCBpbml0aWFsaXphdGlvbihpMmMgci93KS4KKwkgKiBUaGUgU2d0bDUwMDAgc3lzY2xrIGlzIGRlcml2ZWQgZnJvbSBzYWlmMCBtY2xrIGFuZCBpdCdzIHJhbmdlCisJICogc2hvdWxkIGJlID49IDhNSHogYW5kIDw9IDI3TS4KKwkgKi8KKwlyZXQgPSBteHNfc2FpZl9nZXRfbWNsaygwLCA0NDEwMCAqIDI1NiwgNDQxMDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKGNhcmQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAic25kX3NvY19yZWdpc3Rlcl9jYXJkIGZhaWxlZCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbXhzX3NndGw1MDAwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW14c19zYWlmX3B1dF9tY2xrKDApOworCisJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoY2FyZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXhzX3NndGw1MDAwX2F1ZGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJteHMtc2d0bDUwMDAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG14c19zZ3RsNTAwMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobXhzX3NndGw1MDAwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBteHNfc2d0bDUwMDBfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm14c19zZ3RsNTAwMF9hdWRpb19kcml2ZXIpOworfQorbW9kdWxlX2luaXQobXhzX3NndGw1MDAwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXhzX3NndGw1MDAwX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXhzX3NndGw1MDAwX2F1ZGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChteHNfc2d0bDUwMDBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1YUyBBTFNBIFNvQyBNYWNoaW5lIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL251YzkwMC9udWM5MDAtcGNtLmMgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYwppbmRleCBkNTg5ZWYxLi5hZThkNjgwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYworKysgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG51YzkwMF9kbWFfZ2V0cG9zaXRpb24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCitzdGF0aWMgaW50IG51YzkwMF9kbWFfZ2V0cG9zaXRpb24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJCWRtYV9hZGRyX3QgKnNyYywgZG1hX2FkZHJfdCAqZHN0KQogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CkBAIC0yNjgsNyArMjY4LDcgQEAKIAludWM5MDBfYXVkaW8gPSBudWM5MDBfYWM5N19kYXRhOwogCiAJaWYgKHJlcXVlc3RfaXJxKG51YzkwMF9hdWRpby0+aXJxX251bSwgbnVjOTAwX2RtYV9pbnRlcnJ1cHQsCi0JCQlJUlFGX0RJU0FCTEVELCAibnVjOTAwLWRtYSIsIHN1YnN0cmVhbSkpCisJCQkwLCAibnVjOTAwLWRtYSIsIHN1YnN0cmVhbSkpCiAJCXJldHVybiAtRUJVU1k7CiAKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBudWM5MDBfYXVkaW87CkBAIC0zMTgsNyArMzE4LDYgQEAKIHN0YXRpYyBpbnQgbnVjOTAwX2RtYV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOwogCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKIAogCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL01ha2VmaWxlIGIvc291bmQvc29jL29tYXAvTWFrZWZpbGUKaW5kZXggNTllMmM4ZC4uMDUyZmQ3NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL29tYXAvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiAjIE9NQVAgUGxhdGZvcm0gU3VwcG9ydAogc25kLXNvYy1vbWFwLW9ianMgOj0gb21hcC1wY20ubwogc25kLXNvYy1vbWFwLW1jYnNwLW9ianMgOj0gb21hcC1tY2JzcC5vCi1zbmQtc29jLW9tYXAtbWNwZG0tb2JqcyA6PSBvbWFwLW1jcGRtLm8gbWNwZG0ubworc25kLXNvYy1vbWFwLW1jcGRtLW9ianMgOj0gb21hcC1tY3BkbS5vCiBzbmQtc29jLW9tYXAtaGRtaS1vYmpzIDo9IG9tYXAtaGRtaS5vCiAKIG9iai0kKENPTkZJR19TTkRfT01BUF9TT0MpICs9IHNuZC1zb2Mtb21hcC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9hbTM1MTdldm0uYyBiL3NvdW5kL3NvYy9vbWFwL2FtMzUxN2V2bS5jCmluZGV4IDczZGRlNGEuLmMxY2Q0YTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL2FtMzUxN2V2bS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL2FtMzUxN2V2bS5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CkBAIC00MywyNiArNDQsNiBAQAogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKIAlpbnQgcmV0OwogCi0JLyogU2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksCi0JCQkJICBTTkRfU09DX0RBSUZNVF9EU1BfQiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogU2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0RTUF9CIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsCiAJCQlDT0RFQ19DTE9DSywgU05EX1NPQ19DTE9DS19JTik7CkBAIC0xMTAsMjggKzkxLDYgQEAKIAl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBJbiJ9LAogfTsKIAotc3RhdGljIGludCBhbTM1MTdldm1fYWljMjNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCi0JLyogQWRkIGFtMzUxNy1ldm0gc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMpKTsKLQotCS8qIFNldCB1cCBkYXZpbmNpLWV2bSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCS8qIGFsd2F5cyBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBJbiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSW4iKTsKLQotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGFtMzUxN2V2bV9kYWkgPSB7CiAJLm5hbWUgPSAiVExWMzIwQUlDMjMiLApAQCAtMTQwLDcgKzk5LDggQEAKIAkuY29kZWNfZGFpX25hbWUgPSAidGx2MzIwYWljMjMtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjLjItMDAxYSIsCi0JLmluaXQgPSBhbTM1MTdldm1fYWljMjNfaW5pdCwKKwkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0RTUF9CIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5vcHMgPSAmYW0zNTE3ZXZtX29wcywKIH07CiAKQEAgLTE0OSw2ICsxMDksMTEgQEAKIAkubmFtZSA9ICJhbTM1MTdldm0iLAogCS5kYWlfbGluayA9ICZhbTM1MTdldm1fZGFpLAogCS5udW1fbGlua3MgPSAxLAorCisJLmRhcG1fd2lkZ2V0cyA9IHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphbTM1MTdldm1fc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL2Ftcy1kZWx0YS5jIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKaW5kZXggMGFhNDc1Zi4uY2NiOGE2YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKKysrIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KQEAgLTU2OSw3ICs1NzAsNiBAQAogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQUdDSU4iKTsKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFHQ09VVCIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJLyogQWRkIHZpcnR1YWwgc3dpdGNoICovCiAJcmV0ID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIGFtc19kZWx0YV9hdWRpb19jb250cm9scywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL2lnZXAwMDIwLmMgYi9zb3VuZC9zb2Mvb21hcC9pZ2VwMDAyMC5jCmluZGV4IDBhZTM0NzAuLjU5MWZiZjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL2lnZXAwMDIwLmMKKysrIGIvc291bmQvc29jL29tYXAvaWdlcDAwMjAuYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzgsMjkgKzM5LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIDI2MDAwMDAwLAogCQkJCQkgICAgU05EX1NPQ19DTE9DS19JTik7CkBAIC04NCw2ICs2NCw4IEBACiAJLmNvZGVjX2RhaV9uYW1lID0gInR3bDQwMzAtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5vcHMgPSAmaWdlcDJfb3BzLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvbWNwZG0uYyBiL3NvdW5kL3NvYy9vbWFwL21jcGRtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTU5MTkuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL29tYXAvbWNwZG0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MCArMCwwIEBACi0vKgotICogbWNwZG0uYyAgLS0JTWNQRE0gaW50ZXJmYWNlIGRyaXZlcgotICoKLSAqIEF1dGhvcjogSm9yZ2UgRWR1YXJkbyBDYW5kZWxhcmlhIDx4MDEwNzIwOUB0aS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgLSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2luY2x1ZGUgIm1jcGRtLmgiCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX21jcGRtX3dyaXRlKHUxNiByZWcsIHUzMiB2YWwpCi17Ci0JX19yYXdfd3JpdGVsKHZhbCwgbWNwZG0tPmlvX2Jhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBvbWFwX21jcGRtX3JlYWQodTE2IHJlZykKLXsKLQlyZXR1cm4gX19yYXdfcmVhZGwobWNwZG0tPmlvX2Jhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwX21jcGRtX3JlZ19kdW1wKHZvaWQpCi17Ci0JZGV2X2RiZyhtY3BkbS0+ZGV2LCAiKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVNUQVRVU19SQVc6ICAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fSVJRU1RBVFVTX1JBVykpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVNUQVRVUzoJMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0lSUVNUQVRVUykpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUUVOQUJMRV9TRVQ6ICAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fSVJRRU5BQkxFX1NFVCkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUUVOQUJMRV9DTFI6ICAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fSVJRRU5BQkxFX0NMUikpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVdBS0VfRU46IDB4JTA0eFxuIiwKLQkJCW9tYXBfbWNwZG1fcmVhZChNQ1BETV9JUlFXQUtFX0VOKSk7Ci0JZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRE1BRU5BQkxFX1NFVDogMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0RNQUVOQUJMRV9TRVQpKTsKLQlkZXZfZGJnKG1jcGRtLT5kZXYsICJETUFFTkFCTEVfQ0xSOiAgMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0RNQUVOQUJMRV9DTFIpKTsKLQlkZXZfZGJnKG1jcGRtLT5kZXYsICJETUFXQUtFRU46CTB4JTA0eFxuIiwKLQkJCW9tYXBfbWNwZG1fcmVhZChNQ1BETV9ETUFXQUtFRU4pKTsKLQlkZXZfZGJnKG1jcGRtLT5kZXYsICJDVFJMOgkweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fQ1RSTCkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIkROX0RBVEE6ICAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fRE5fREFUQSkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIlVQX0RBVEE6IDB4JTA0eFxuIiwKLQkJCW9tYXBfbWNwZG1fcmVhZChNQ1BETV9VUF9EQVRBKSk7Ci0JZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRklGT19DVFJMX0ROOiAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fRklGT19DVFJMX0ROKSk7Ci0JZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRklGT19DVFJMX1VQOiAgMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0ZJRk9fQ1RSTF9VUCkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIkROX09GRlNFVDoJMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0ROX09GRlNFVCkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLX0KLQotLyoKLSAqIFRha2VzIHRoZSBNY1BETSBtb2R1bGUgaW4gYW5kIG91dCBvZiByZXNldCBzdGF0ZS4KLSAqIFVwbGluayBhbmQgZG93bmxpbmsgY2FuIGJlIHJlc2V0IGluZGl2aWR1YWxseS4KLSAqLwotc3RhdGljIHZvaWQgb21hcF9tY3BkbV9yZXNldF9jYXB0dXJlKGludCByZXNldCkKLXsKLQlpbnQgY3RybCA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9DVFJMKTsKLQotCWlmIChyZXNldCkKLQkJY3RybCB8PSBTV19VUF9SU1Q7Ci0JZWxzZQotCQljdHJsICY9IH5TV19VUF9SU1Q7Ci0KLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0NUUkwsIGN0cmwpOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwX21jcGRtX3Jlc2V0X3BsYXliYWNrKGludCByZXNldCkKLXsKLQlpbnQgY3RybCA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9DVFJMKTsKLQotCWlmIChyZXNldCkKLQkJY3RybCB8PSBTV19ETl9SU1Q7Ci0JZWxzZQotCQljdHJsICY9IH5TV19ETl9SU1Q7Ci0KLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0NUUkwsIGN0cmwpOwotfQotCi0vKgotICogRW5hYmxlcyB0aGUgdHJhbnNmZXIgdGhyb3VnaCB0aGUgUERNIGludGVyZmFjZSB0by9mcm9tIHRoZSBQaG9lbml4Ci0gKiBjb2RlYyBieSBlbmFibGluZyB0aGUgY29ycmVzcG9uZGluZyBVUCBvciBETiBjaGFubmVscy4KLSAqLwotdm9pZCBvbWFwX21jcGRtX3N0YXJ0KGludCBzdHJlYW0pCi17Ci0JaW50IGN0cmwgPSBvbWFwX21jcGRtX3JlYWQoTUNQRE1fQ1RSTCk7Ci0KLQlpZiAoc3RyZWFtKQotCQljdHJsIHw9IG1jcGRtLT51cF9jaGFubmVsczsKLQllbHNlCi0JCWN0cmwgfD0gbWNwZG0tPmRuX2NoYW5uZWxzOwotCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9DVFJMLCBjdHJsKTsKLX0KLQotLyoKLSAqIERpc2FibGVzIHRoZSB0cmFuc2ZlciB0aHJvdWdoIHRoZSBQRE0gaW50ZXJmYWNlIHRvL2Zyb20gdGhlIFBob2VuaXgKLSAqIGNvZGVjIGJ5IGRpc2FibGluZyB0aGUgY29ycmVzcG9uZGluZyBVUCBvciBETiBjaGFubmVscy4KLSAqLwotdm9pZCBvbWFwX21jcGRtX3N0b3AoaW50IHN0cmVhbSkKLXsKLQlpbnQgY3RybCA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9DVFJMKTsKLQotCWlmIChzdHJlYW0pCi0JCWN0cmwgJj0gfm1jcGRtLT51cF9jaGFubmVsczsKLQllbHNlCi0JCWN0cmwgJj0gfm1jcGRtLT5kbl9jaGFubmVsczsKLQotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fQ1RSTCwgY3RybCk7Ci19Ci0KLS8qCi0gKiBDb25maWd1cmVzIE1jUERNIHVwbGluayBmb3IgYXVkaW8gcmVjb3JkaW5nLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBvbWFwX21jcGRtX3N0YXJ0LgotICovCi1pbnQgb21hcF9tY3BkbV9jYXB0dXJlX29wZW4oc3RydWN0IG9tYXBfbWNwZG1fbGluayAqdXBsaW5rKQotewotCWludCBpcnFfbWFzayA9IDA7Ci0JaW50IGN0cmw7Ci0KLQlpZiAoIXVwbGluaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltY3BkbS0+dXBsaW5rID0gdXBsaW5rOwotCi0JLyogRW5hYmxlIGlycSByZXF1ZXN0IGdlbmVyYXRpb24gKi8KLQlpcnFfbWFzayB8PSB1cGxpbmstPmlycV9tYXNrICYgTUNQRE1fVVBMSU5LX0lSUV9NQVNLOwotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fSVJRRU5BQkxFX1NFVCwgaXJxX21hc2spOwotCi0JLyogQ29uZmlndXJlIHVwbGluayB0aHJlc2hvbGQgKi8KLQlpZiAodXBsaW5rLT50aHJlc2hvbGQgPiBVUF9USFJFU19NQVgpCi0JCXVwbGluay0+dGhyZXNob2xkID0gVVBfVEhSRVNfTUFYOwotCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9GSUZPX0NUUkxfVVAsIHVwbGluay0+dGhyZXNob2xkKTsKLQotCS8qIENvbmZpZ3VyZSBETUEgY29udHJvbGxlciAqLwotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fRE1BRU5BQkxFX1NFVCwgRE1BX1VQX0VOQUJMRSk7Ci0KLQkvKiBTZXQgcGRtIG91dCBmb3JtYXQgKi8KLQljdHJsID0gb21hcF9tY3BkbV9yZWFkKE1DUERNX0NUUkwpOwotCWN0cmwgJj0gflBETU9VVEZPUk1BVDsKLQljdHJsIHw9IHVwbGluay0+Zm9ybWF0ICYgUERNT1VURk9STUFUOwotCi0JLyogVXBsaW5rIGNoYW5uZWxzICovCi0JbWNwZG0tPnVwX2NoYW5uZWxzID0gdXBsaW5rLT5jaGFubmVscyAmIChQRE1fVVBfTUFTSyB8IFBETV9TVEFUVVNfTUFTSyk7Ci0KLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0NUUkwsIGN0cmwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb25maWd1cmVzIE1jUERNIGRvd25saW5rIGZvciBhdWRpbyBwbGF5YmFjay4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgb21hcF9tY3BkbV9zdGFydC4KLSAqLwotaW50IG9tYXBfbWNwZG1fcGxheWJhY2tfb3BlbihzdHJ1Y3Qgb21hcF9tY3BkbV9saW5rICpkb3dubGluaykKLXsKLQlpbnQgaXJxX21hc2sgPSAwOwotCWludCBjdHJsOwotCi0JaWYgKCFkb3dubGluaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltY3BkbS0+ZG93bmxpbmsgPSBkb3dubGluazsKLQotCS8qIEVuYWJsZSBpcnEgcmVxdWVzdCBnZW5lcmF0aW9uICovCi0JaXJxX21hc2sgfD0gZG93bmxpbmstPmlycV9tYXNrICYgTUNQRE1fRE9XTkxJTktfSVJRX01BU0s7Ci0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9JUlFFTkFCTEVfU0VULCBpcnFfbWFzayk7Ci0KLQkvKiBDb25maWd1cmUgdXBsaW5rIHRocmVzaG9sZCAqLwotCWlmIChkb3dubGluay0+dGhyZXNob2xkID4gRE5fVEhSRVNfTUFYKQotCQlkb3dubGluay0+dGhyZXNob2xkID0gRE5fVEhSRVNfTUFYOwotCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9GSUZPX0NUUkxfRE4sIGRvd25saW5rLT50aHJlc2hvbGQpOwotCi0JLyogRW5hYmxlIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gKi8KLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0RNQUVOQUJMRV9TRVQsIERNQV9ETl9FTkFCTEUpOwotCi0JLyogU2V0IHBkbSBvdXQgZm9ybWF0ICovCi0JY3RybCA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9DVFJMKTsKLQljdHJsICY9IH5QRE1PVVRGT1JNQVQ7Ci0JY3RybCB8PSBkb3dubGluay0+Zm9ybWF0ICYgUERNT1VURk9STUFUOwotCi0JLyogRG93bmxpbmsgY2hhbm5lbHMgKi8KLQltY3BkbS0+ZG5fY2hhbm5lbHMgPSBkb3dubGluay0+Y2hhbm5lbHMgJiAoUERNX0ROX01BU0sgfCBQRE1fQ01EX01BU0spOwotCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9DVFJMLCBjdHJsKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ2xlYW5zIE1jUERNIHVwbGluayBjb25maWd1cmF0aW9uLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0gKi8KLWludCBvbWFwX21jcGRtX2NhcHR1cmVfY2xvc2Uoc3RydWN0IG9tYXBfbWNwZG1fbGluayAqdXBsaW5rKQotewotCWludCBpcnFfbWFzayA9IDA7Ci0KLQlpZiAoIXVwbGluaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBEaXNhYmxlIGlycSByZXF1ZXN0IGdlbmVyYXRpb24gKi8KLQlpcnFfbWFzayB8PSB1cGxpbmstPmlycV9tYXNrICYgTUNQRE1fVVBMSU5LX0lSUV9NQVNLOwotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fSVJRRU5BQkxFX0NMUiwgaXJxX21hc2spOwotCi0JLyogRGlzYWJsZSBETUEgcmVxdWVzdCBnZW5lcmF0aW9uICovCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9ETUFFTkFCTEVfQ0xSLCBETUFfVVBfRU5BQkxFKTsKLQotCS8qIENsZWFyIERvd25saW5rIGNoYW5uZWxzICovCi0JbWNwZG0tPnVwX2NoYW5uZWxzID0gMDsKLQotCW1jcGRtLT51cGxpbmsgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDbGVhbnMgTWNQRE0gZG93bmxpbmsgY29uZmlndXJhdGlvbi4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgotICovCi1pbnQgb21hcF9tY3BkbV9wbGF5YmFja19jbG9zZShzdHJ1Y3Qgb21hcF9tY3BkbV9saW5rICpkb3dubGluaykKLXsKLQlpbnQgaXJxX21hc2sgPSAwOwotCi0JaWYgKCFkb3dubGluaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBEaXNhYmxlIGlycSByZXF1ZXN0IGdlbmVyYXRpb24gKi8KLQlpcnFfbWFzayB8PSBkb3dubGluay0+aXJxX21hc2sgJiBNQ1BETV9ET1dOTElOS19JUlFfTUFTSzsKLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0lSUUVOQUJMRV9DTFIsIGlycV9tYXNrKTsKLQotCS8qIERpc2FibGUgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiAqLwotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fRE1BRU5BQkxFX0NMUiwgRE1BX0ROX0VOQUJMRSk7Ci0KLQkvKiBjbGVhciBEb3dubGluayBjaGFubmVscyAqLwotCW1jcGRtLT5kbl9jaGFubmVscyA9IDA7Ci0KLQltY3BkbS0+ZG93bmxpbmsgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX21jcGRtX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG1faXJxID0gZGV2X2lkOwotCWludCBpcnFfc3RhdHVzOwotCi0JaXJxX3N0YXR1cyA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9JUlFTVEFUVVMpOwotCi0JLyogQWNrbm93bGVkZ2UgaXJxIGV2ZW50ICovCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9JUlFTVEFUVVMsIGlycV9zdGF0dXMpOwotCi0JaWYgKGlycSAmIE1DUERNX0ROX0lSUV9GVUxMKSB7Ci0JCWRldl9lcnIobWNwZG1faXJxLT5kZXYsICJETiBGSUZPIGVycm9yICV4XG4iLCBpcnFfc3RhdHVzKTsKLQkJb21hcF9tY3BkbV9yZXNldF9wbGF5YmFjaygxKTsKLQkJb21hcF9tY3BkbV9wbGF5YmFja19vcGVuKG1jcGRtX2lycS0+ZG93bmxpbmspOwotCQlvbWFwX21jcGRtX3Jlc2V0X3BsYXliYWNrKDApOwotCX0KLQotCWlmIChpcnEgJiBNQ1BETV9ETl9JUlFfRU1QVFkpIHsKLQkJZGV2X2VycihtY3BkbV9pcnEtPmRldiwgIkROIEZJRk8gZXJyb3IgJXhcbiIsIGlycV9zdGF0dXMpOwotCQlvbWFwX21jcGRtX3Jlc2V0X3BsYXliYWNrKDEpOwotCQlvbWFwX21jcGRtX3BsYXliYWNrX29wZW4obWNwZG1faXJxLT5kb3dubGluayk7Ci0JCW9tYXBfbWNwZG1fcmVzZXRfcGxheWJhY2soMCk7Ci0JfQotCi0JaWYgKGlycSAmIE1DUERNX0ROX0lSUSkgewotCQlkZXZfZGJnKG1jcGRtX2lycS0+ZGV2LCAiRE4gd3JpdGUgcmVxdWVzdFxuIik7Ci0JfQotCi0JaWYgKGlycSAmIE1DUERNX1VQX0lSUV9GVUxMKSB7Ci0JCWRldl9lcnIobWNwZG1faXJxLT5kZXYsICJVUCBGSUZPIGVycm9yICV4XG4iLCBpcnFfc3RhdHVzKTsKLQkJb21hcF9tY3BkbV9yZXNldF9jYXB0dXJlKDEpOwotCQlvbWFwX21jcGRtX2NhcHR1cmVfb3BlbihtY3BkbV9pcnEtPnVwbGluayk7Ci0JCW9tYXBfbWNwZG1fcmVzZXRfY2FwdHVyZSgwKTsKLQl9Ci0KLQlpZiAoaXJxICYgTUNQRE1fVVBfSVJRX0VNUFRZKSB7Ci0JCWRldl9lcnIobWNwZG1faXJxLT5kZXYsICJVUCBGSUZPIGVycm9yICV4XG4iLCBpcnFfc3RhdHVzKTsKLQkJb21hcF9tY3BkbV9yZXNldF9jYXB0dXJlKDEpOwotCQlvbWFwX21jcGRtX2NhcHR1cmVfb3BlbihtY3BkbV9pcnEtPnVwbGluayk7Ci0JCW9tYXBfbWNwZG1fcmVzZXRfY2FwdHVyZSgwKTsKLQl9Ci0KLQlpZiAoaXJxICYgTUNQRE1fVVBfSVJRKSB7Ci0JCWRldl9kYmcobWNwZG1faXJxLT5kZXYsICJVUCB3cml0ZSByZXF1ZXN0XG4iKTsKLQl9Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLWludCBvbWFwX21jcGRtX3JlcXVlc3Qodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JY2xrX2VuYWJsZShtY3BkbS0+Y2xrKTsKLQotCXNwaW5fbG9jaygmbWNwZG0tPmxvY2spOwotCi0JaWYgKCFtY3BkbS0+ZnJlZSkgewotCQlkZXZfZXJyKG1jcGRtLT5kZXYsICJNY1BETSBpbnRlcmZhY2UgaXMgaW4gdXNlXG4iKTsKLQkJc3Bpbl91bmxvY2soJm1jcGRtLT5sb2NrKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycjsKLQl9Ci0JbWNwZG0tPmZyZWUgPSAwOwotCi0Jc3Bpbl91bmxvY2soJm1jcGRtLT5sb2NrKTsKLQotCS8qIERpc2FibGUgbGluZXMgd2hpbGUgcmVxdWVzdCBpcyBvbmdvaW5nICovCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9DVFJMLCAweDAwKTsKLQotCXJldCA9IHJlcXVlc3RfaXJxKG1jcGRtLT5pcnEsIG9tYXBfbWNwZG1faXJxX2hhbmRsZXIsCi0JCQkJMCwgIk1jUERNIiwgKHZvaWQgKiltY3BkbSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKG1jcGRtLT5kZXYsICJSZXF1ZXN0IGZvciBNY1BETSBJUlEgZmFpbGVkXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQljbGtfZGlzYWJsZShtY3BkbS0+Y2xrKTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIG9tYXBfbWNwZG1fZnJlZSh2b2lkKQotewotCXNwaW5fbG9jaygmbWNwZG0tPmxvY2spOwotCWlmIChtY3BkbS0+ZnJlZSkgewotCQlkZXZfZXJyKG1jcGRtLT5kZXYsICJNY1BETSBpbnRlcmZhY2UgaXMgYWxyZWFkeSBmcmVlXG4iKTsKLQkJc3Bpbl91bmxvY2soJm1jcGRtLT5sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQltY3BkbS0+ZnJlZSA9IDE7Ci0Jc3Bpbl91bmxvY2soJm1jcGRtLT5sb2NrKTsKLQotCWNsa19kaXNhYmxlKG1jcGRtLT5jbGspOwotCi0JZnJlZV9pcnEobWNwZG0tPmlycSwgKHZvaWQgKiltY3BkbSk7Ci19Ci0KLS8qIEVuYWJsZS9kaXNhYmxlIERDIG9mZnNldCBjYW5jZWxhdGlvbiBmb3IgdGhlIGFuYWxvZwotICogaGVhZHNldCBwYXRoIChQRE0gY2hhbm5lbHMgMSBhbmQgMikuCi0gKi8KLWludCBvbWFwX21jcGRtX3NldF9vZmZzZXQoaW50IG9mZnNldDEsIGludCBvZmZzZXQyKQotewotCWludCBvZmZzZXQ7Ci0KLQlpZiAoKG9mZnNldDEgPiBETl9PRlNUX01BWCkgfHwgKG9mZnNldDIgPiBETl9PRlNUX01BWCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jb2Zmc2V0ID0gKG9mZnNldDEgPDwgRE5fT0ZTVF9SWDEpIHwgKG9mZnNldDIgPDwgRE5fT0ZTVF9SWDIpOwotCi0JLyogb2Zmc2V0IGNhbmNlbGxhdGlvbiBmb3IgY2hhbm5lbCAxICovCi0JaWYgKG9mZnNldDEpCi0JCW9mZnNldCB8PSBETl9PRlNUX1JYMV9FTjsKLQllbHNlCi0JCW9mZnNldCAmPSB+RE5fT0ZTVF9SWDFfRU47Ci0KLQkvKiBvZmZzZXQgY2FuY2VsbGF0aW9uIGZvciBjaGFubmVsIDIgKi8KLQlpZiAob2Zmc2V0MikKLQkJb2Zmc2V0IHw9IEROX09GU1RfUlgyX0VOOwotCWVsc2UKLQkJb2Zmc2V0ICY9IH5ETl9PRlNUX1JYMl9FTjsKLQotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fRE5fT0ZGU0VULCBvZmZzZXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBfX2RldmluaXQgb21hcF9tY3BkbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCByZXQgPSAwOwotCi0JbWNwZG0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9tY3BkbSksIEdGUF9LRVJORUwpOwotCWlmICghbWNwZG0pIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHJlc291cmNlXG4iKTsKLQkJZ290byBlcnJfcmVzb3VyY2U7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJm1jcGRtLT5sb2NrKTsKLQltY3BkbS0+ZnJlZSA9IDE7Ci0JbWNwZG0tPmlvX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKCFtY3BkbS0+aW9fYmFzZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9yZXNvdXJjZTsKLQl9Ci0KLQltY3BkbS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQotCW1jcGRtLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJwZG1fY2siKTsKLQlpZiAoSVNfRVJSKG1jcGRtLT5jbGspKSB7Ci0JCXJldCA9IFBUUl9FUlIobWNwZG0tPmNsayk7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgcGRtX2NrOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfY2xrOwotCX0KLQotCW1jcGRtLT5kZXYgPSAmcGRldi0+ZGV2OwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1jcGRtKTsKLQotCXJldHVybiAwOwotCi1lcnJfY2xrOgotCWlvdW5tYXAobWNwZG0tPmlvX2Jhc2UpOwotZXJyX3Jlc291cmNlOgotCWtmcmVlKG1jcGRtKTsKLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IG9tYXBfbWNwZG1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtX3B0ciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQljbGtfcHV0KG1jcGRtX3B0ci0+Y2xrKTsKLQotCWlvdW5tYXAobWNwZG1fcHRyLT5pb19iYXNlKTsKLQotCW1jcGRtX3B0ci0+Y2xrID0gTlVMTDsKLQltY3BkbV9wdHItPmZyZWUgPSAwOwotCW1jcGRtX3B0ci0+ZGV2ID0gTlVMTDsKLQotCWtmcmVlKG1jcGRtX3B0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvbWNwZG0uaCBiL3NvdW5kL3NvYy9vbWFwL21jcGRtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYzIwYTguLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL29tYXAvbWNwZG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogbWNwZG0uaCAtLSBEZWZpbmVzIGZvciBNY1BETSBkcml2ZXIKLSAqCi0gKiBBdXRob3I6IEpvcmdlIEVkdWFyZG8gQ2FuZGVsYXJpYSA8eDAxMDcyMDlAdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSBVU0EKLSAqCi0gKi8KLQotLyogTWNQRE0gcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgTUNQRE1fUkVWSVNJT04gICAgICAgICAweDAwCi0jZGVmaW5lIE1DUERNX1NZU0NPTkZJRyAgICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIE1DUERNX0lSUVNUQVRVU19SQVcgICAgMHgyNAotI2RlZmluZSBNQ1BETV9JUlFTVEFUVVMgICAgICAgICAgICAgICAgMHgyOAotI2RlZmluZSBNQ1BETV9JUlFFTkFCTEVfU0VUICAgIDB4MkMKLSNkZWZpbmUgTUNQRE1fSVJRRU5BQkxFX0NMUiAgICAweDMwCi0jZGVmaW5lIE1DUERNX0lSUVdBS0VfRU4gICAgICAgMHgzNAotI2RlZmluZSBNQ1BETV9ETUFFTkFCTEVfU0VUICAgIDB4MzgKLSNkZWZpbmUgTUNQRE1fRE1BRU5BQkxFX0NMUiAgICAweDNDCi0jZGVmaW5lIE1DUERNX0RNQVdBS0VFTiAgICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIE1DUERNX0NUUkwgICAgICAgICAgICAgMHg0NAotI2RlZmluZSBNQ1BETV9ETl9EQVRBICAgICAgICAgIDB4NDgKLSNkZWZpbmUgTUNQRE1fVVBfREFUQSAgICAgICAgICAweDRDCi0jZGVmaW5lIE1DUERNX0ZJRk9fQ1RSTF9ETiAgICAgMHg1MAotI2RlZmluZSBNQ1BETV9GSUZPX0NUUkxfVVAgICAgIDB4NTQKLSNkZWZpbmUgTUNQRE1fRE5fT0ZGU0VUICAgICAgICAgICAgICAgIDB4NTgKLQotLyoKLSAqIE1DUERNX0lSUSBiaXQgZmllbGRzCi0gKiBJUlFTVEFUVVNfUkFXLCBJUlFTVEFUVVMsIElSUUVOQUJMRV9TRVQsIElSUUVOQUJMRV9DTFIKLSAqLwotCi0jZGVmaW5lIE1DUERNX0ROX0lSUSAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQotI2RlZmluZSBNQ1BETV9ETl9JUlFfRU1QVFkgICAgICAgICAgICAgKDEgPDwgMSkKLSNkZWZpbmUgTUNQRE1fRE5fSVJRX0FMTVNUX0VNUFRZICAgICAgICgxIDw8IDIpCi0jZGVmaW5lIE1DUERNX0ROX0lSUV9GVUxMICAgICAgICAgICAgICAoMSA8PCAzKQotCi0jZGVmaW5lIE1DUERNX1VQX0lSUSAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQotI2RlZmluZSBNQ1BETV9VUF9JUlFfRU1QVFkgICAgICAgICAgICAgKDEgPDwgOSkKLSNkZWZpbmUgTUNQRE1fVVBfSVJRX0FMTVNUX0ZVTEwgICAgICAgICAgICAgICAgKDEgPDwgMTApCi0jZGVmaW5lIE1DUERNX1VQX0lSUV9GVUxMICAgICAgICAgICAgICAoMSA8PCAxMSkKLQotI2RlZmluZSBNQ1BETV9ET1dOTElOS19JUlFfTUFTSyAgICAgICAgICAgICAgICAweDAwRgotI2RlZmluZSBNQ1BETV9VUExJTktfSVJRX01BU0sgICAgICAgICAgMHhGMDAKLQotLyoKLSAqIE1DUERNX0RNQUVOQUJMRSBiaXQgZmllbGRzCi0gKi8KLQotI2RlZmluZSBETUFfRE5fRU5BQkxFICAgICAgICAgIDB4MQotI2RlZmluZSBETUFfVVBfRU5BQkxFICAgICAgICAgIDB4MgotCi0vKgotICogTUNQRE1fQ1RSTCBiaXQgZmllbGRzCi0gKi8KLQotI2RlZmluZSBQRE1fVVAxX0VOICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBQRE1fVVAyX0VOICAgICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBQRE1fVVAzX0VOICAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBQRE1fRE4xX0VOICAgICAgICAgICAgIDB4MDAwOAotI2RlZmluZSBQRE1fRE4yX0VOICAgICAgICAgICAgIDB4MDAxMAotI2RlZmluZSBQRE1fRE4zX0VOICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBQRE1fRE40X0VOICAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBQRE1fRE41X0VOICAgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBQRE1PVVRGT1JNQVQgICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBDTURfSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIFNUQVRVU19JTlQgICAgICAgICAgICAgMHgwNDAwCi0jZGVmaW5lIFNXX1VQX1JTVCAgICAgICAgICAgICAgMHgwODAwCi0jZGVmaW5lIFNXX0ROX1JTVCAgICAgICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIFBETV9VUF9NQVNLICAgICAgICAgICAgMHgwMDcKLSNkZWZpbmUgUERNX0ROX01BU0sgICAgICAgICAgICAweDBGOAotI2RlZmluZSBQRE1fQ01EX01BU0sgICAgICAgICAgIDB4MjAwCi0jZGVmaW5lIFBETV9TVEFUVVNfTUFTSyAgICAgICAgICAgICAgICAweDQwMAotCi0KLSNkZWZpbmUgUERNT1VURk9STUFUX0xKVVNUICAgICAoMCA8PCA4KQotI2RlZmluZSBQRE1PVVRGT1JNQVRfUkpVU1QgICAgICgxIDw8IDgpCi0KLS8qCi0gKiBNQ1BETV9GSUZPX0NUUkwgYml0IGZpZWxkcwotICovCi0KLSNkZWZpbmUgVVBfVEhSRVNfTUFYICAgICAgICAgICAweEYKLSNkZWZpbmUgRE5fVEhSRVNfTUFYICAgICAgICAgICAweEYKLQotLyoKLSAqIE1DUERNX0ROX09GRlNFVCBiaXQgZmllbGRzCi0gKi8KLQotI2RlZmluZSBETl9PRlNUX1JYMV9FTiAgICAgICAgIDB4MDAwMQotI2RlZmluZSBETl9PRlNUX1JYMl9FTiAgICAgICAgIDB4MDEwMAotCi0jZGVmaW5lIEROX09GU1RfUlgxICAgICAgICAgICAgMQotI2RlZmluZSBETl9PRlNUX1JYMiAgICAgICAgICAgIDkKLSNkZWZpbmUgRE5fT0ZTVF9NQVggICAgICAgICAgICAweDFGCi0KLSNkZWZpbmUgTUNQRE1fVVBMSU5LICAgICAgICAgICAxCi0jZGVmaW5lIE1DUERNX0RPV05MSU5LICAgICAgICAgMgotCi1zdHJ1Y3Qgb21hcF9tY3BkbV9saW5rIHsKLSAgICAgICBpbnQgaXJxX21hc2s7Ci0gICAgICAgaW50IHRocmVzaG9sZDsKLSAgICAgICBpbnQgZm9ybWF0OwotICAgICAgIGludCBjaGFubmVsczsKLX07Ci0KLXN0cnVjdCBvbWFwX21jcGRtX3BsYXRmb3JtX2RhdGEgewotICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19iYXNlOwotICAgICAgIHUxNiBpcnE7Ci19OwotCi1zdHJ1Y3Qgb21hcF9tY3BkbSB7Ci0gICAgICAgc3RydWN0IGRldmljZSAqZGV2OwotICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19iYXNlOwotICAgICAgIHZvaWQgX19pb21lbSAqaW9fYmFzZTsKLSAgICAgICB1OCBmcmVlOwotICAgICAgIGludCBpcnE7Ci0KLSAgICAgICBzcGlubG9ja190IGxvY2s7Ci0gICAgICAgc3RydWN0IG9tYXBfbWNwZG1fcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0gICAgICAgc3RydWN0IGNsayAqY2xrOwotICAgICAgIHN0cnVjdCBvbWFwX21jcGRtX2xpbmsgKmRvd25saW5rOwotICAgICAgIHN0cnVjdCBvbWFwX21jcGRtX2xpbmsgKnVwbGluazsKLSAgICAgICBzdHJ1Y3QgY29tcGxldGlvbiBpcnFfY29tcGxldGlvbjsKLQotICAgICAgIGludCBkbl9jaGFubmVsczsKLSAgICAgICBpbnQgdXBfY2hhbm5lbHM7Ci19OwotCi1leHRlcm4gdm9pZCBvbWFwX21jcGRtX3N0YXJ0KGludCBzdHJlYW0pOwotZXh0ZXJuIHZvaWQgb21hcF9tY3BkbV9zdG9wKGludCBzdHJlYW0pOwotZXh0ZXJuIGludCBvbWFwX21jcGRtX2NhcHR1cmVfb3BlbihzdHJ1Y3Qgb21hcF9tY3BkbV9saW5rICp1cGxpbmspOwotZXh0ZXJuIGludCBvbWFwX21jcGRtX3BsYXliYWNrX29wZW4oc3RydWN0IG9tYXBfbWNwZG1fbGluayAqZG93bmxpbmspOwotZXh0ZXJuIGludCBvbWFwX21jcGRtX2NhcHR1cmVfY2xvc2Uoc3RydWN0IG9tYXBfbWNwZG1fbGluayAqdXBsaW5rKTsKLWV4dGVybiBpbnQgb21hcF9tY3BkbV9wbGF5YmFja19jbG9zZShzdHJ1Y3Qgb21hcF9tY3BkbV9saW5rICpkb3dubGluayk7Ci1leHRlcm4gaW50IG9tYXBfbWNwZG1fcmVxdWVzdCh2b2lkKTsKLWV4dGVybiB2b2lkIG9tYXBfbWNwZG1fZnJlZSh2b2lkKTsKLWV4dGVybiBpbnQgb21hcF9tY3BkbV9zZXRfb2Zmc2V0KGludCBvZmZzZXQxLCBpbnQgb2Zmc2V0Mik7Ci1pbnQgX19kZXZpbml0IG9tYXBfbWNwZG1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci1pbnQgb21hcF9tY3BkbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9uODEwLmMgYi9zb3VuZC9zb2Mvb21hcC9uODEwLmMKaW5kZXggNjJlMjkyZi4uZmM2MjA5YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvbjgxMC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL244MTAuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxwbGF0L21jYnNwLmg+CiAKICNpbmNsdWRlICJvbWFwLW1jYnNwLmgiCkBAIC0xMTUsMjUgKzExNiw4IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCWludCBlcnI7CiAKLQkvKiBTZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQllcnIgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwKLQkJCQkJIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCQkJCSBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJCSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIFNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQllcnIgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksCi0JCQkJICAgICAgIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCQkJICAgICAgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgICAgICAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KIAkvKiBTZXQgdGhlIGNvZGVjIHN5c3RlbSBjbG9jayBmb3IgREFDIGFuZCBBREMgKi8KIAllcnIgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgMTIwMDAwMDAsCiAJCQkJCSAgICBTTkRfU09DX0NMT0NLX0lOKTsKQEAgLTI3NCw3ICsyNTgsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCBlcnI7CiAKIAkvKiBOb3QgY29ubmVjdGVkICovCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTU9OT19MT1VUIik7CkBAIC0yODYsMjEgKzI2OSw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJMIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJSIik7CiAKLQkvKiBBZGQgTjgxMCBzcGVjaWZpYyBjb250cm9scyAqLwotCWVyciA9IHNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhaWMzM19uODEwX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUoYWljMzNfbjgxMF9jb250cm9scykpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogQWRkIE44MTAgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYWljMzNfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRShhaWMzM19kYXBtX3dpZGdldHMpKTsKLQotCS8qIFNldCB1cCBOODEwIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzEyLDYgKzI4MCw4IEBACiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInRsdjMyMGFpYzN4LWNvZGVjLjItMDAxOCIsCiAJLmNvZGVjX2RhaV9uYW1lID0gInRsdjMyMGFpYzN4LWhpZmkiLAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5pbml0ID0gbjgxMF9haWMzM19pbml0LAogCS5vcHMgPSAmbjgxMF9vcHMsCiB9OwpAQCAtMzIxLDYgKzI5MSwxMyBAQAogCS5uYW1lID0gIk44MTAiLAogCS5kYWlfbGluayA9ICZuODEwX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKKworCS5jb250cm9scyA9IGFpYzMzX244MTBfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWljMzNfbjgxMF9jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IGFpYzMzX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWljMzNfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpuODEwX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jYnNwLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jYnNwLmMKaW5kZXggNDc4ZDYwNy4uNDMxNDY0NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcC1tY2JzcC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNic3AuYwpAQCAtMzE3LDYgKzMxNywxMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlyZWdzLT5yY3IyCSY9IH4oUlBIQVNFIHwgUkZSTEVOMigweDdmKSB8IFJXRExFTjIoNykpOworCXJlZ3MtPnhjcjIJJj0gfihSUEhBU0UgfCBYRlJMRU4yKDB4N2YpIHwgWFdETEVOMig3KSk7CisJcmVncy0+cmNyMQkmPSB+KFJGUkxFTjEoMHg3ZikgfCBSV0RMRU4xKDcpKTsKKwlyZWdzLT54Y3IxCSY9IH4oWEZSTEVOMSgweDdmKSB8IFhXRExFTjEoNykpOwogCWZvcm1hdCA9IG1jYnNwX2RhdGEtPmZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLOwogCXdwZiA9IGNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CiAJaWYgKGNoYW5uZWxzID09IDIgJiYgKGZvcm1hdCA9PSBTTkRfU09DX0RBSUZNVF9JMlMgfHwKQEAgLTM2OSw2ICszNzMsOCBAQAogCQlmcmFtZXNpemUgPSB3bGVuICogY2hhbm5lbHM7CiAKIAkvKiBTZXQgRlMgcGVyaW9kIGFuZCBsZW5ndGggaW4gdGVybXMgb2YgYml0IGNsb2NrIHBlcmlvZHMgKi8KKwlyZWdzLT5zcmdyMgkmPSB+RlBFUigweGZmZik7CisJcmVncy0+c3JncjEJJj0gfkZXSUQoMHhmZik7CiAJc3dpdGNoIChmb3JtYXQpIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKIAljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKQEAgLTM5OCw3ICs0MDQsNyBAQAogewogCXN0cnVjdCBvbWFwX21jYnNwX2RhdGEgKm1jYnNwX2RhdGEgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKIAlzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnICpyZWdzID0gJm1jYnNwX2RhdGEtPnJlZ3M7Ci0JdW5zaWduZWQgaW50IHRlbXBfZm10ID0gZm10OworCWJvb2wgaW52X2ZzID0gZmFsc2U7CiAKIAlpZiAobWNic3BfZGF0YS0+Y29uZmlndXJlZCkKIAkJcmV0dXJuIDA7CkBAIC00MzAsMjEgKzQzNiwyMSBAQAogCQlyZWdzLT54Y3IyCXw9IFhEQVRETFkoMCk7CiAJCXJlZ3MtPnNwY3IxCXw9IFJKVVNUKDIpOwogCQkvKiBJbnZlcnQgRlMgcG9sYXJpdHkgY29uZmlndXJhdGlvbiAqLwotCQl0ZW1wX2ZtdCBePSBTTkRfU09DX0RBSUZNVF9OQl9JRjsKKwkJaW52X2ZzID0gdHJ1ZTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKIAkJLyogMS1iaXQgZGF0YSBkZWxheSAqLwogCQlyZWdzLT5yY3IyICAgICAgfD0gUkRBVERMWSgxKTsKIAkJcmVncy0+eGNyMiAgICAgIHw9IFhEQVRETFkoMSk7CiAJCS8qIEludmVydCBGUyBwb2xhcml0eSBjb25maWd1cmF0aW9uICovCi0JCXRlbXBfZm10IF49IFNORF9TT0NfREFJRk1UX05CX0lGOworCQlpbnZfZnMgPSB0cnVlOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgogCQkvKiAwLWJpdCBkYXRhIGRlbGF5ICovCiAJCXJlZ3MtPnJjcjIgICAgICB8PSBSREFURExZKDApOwogCQlyZWdzLT54Y3IyICAgICAgfD0gWERBVERMWSgwKTsKIAkJLyogSW52ZXJ0IEZTIHBvbGFyaXR5IGNvbmZpZ3VyYXRpb24gKi8KLQkJdGVtcF9mbXQgXj0gU05EX1NPQ19EQUlGTVRfTkJfSUY7CisJCWludl9mcyA9IHRydWU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIFVuc3VwcG9ydGVkIGRhdGEgZm9ybWF0ICovCkBAIC00NjgsNyArNDc0LDcgQEAKIAl9CiAKIAkvKiBTZXQgYml0IGNsb2NrIChDTEtYL0NMS1IpIGFuZCBGUyBwb2xhcml0aWVzICovCi0Jc3dpdGNoICh0ZW1wX2ZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgewogCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CiAJCS8qCiAJCSAqIE5vcm1hbCBCQ0xLICsgRlMuCkBAIC00ODksNiArNDk1LDggQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJaWYgKGludl9mcyA9PSB0cnVlKQorCQlyZWdzLT5wY3IwIF49IEZTWFAgfCBGU1JQOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDMsNiArNTExLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAltY2JzcF9kYXRhLT5jbGtfZGl2ID0gZGl2OworCXJlZ3MtPnNyZ3IxCSY9IH5DTEtHRFYoMHhmZik7CiAJcmVncy0+c3JncjEJfD0gQ0xLR0RWKGRpdiAtIDEpOwogCiAJcmV0dXJuIDA7CkBAIC01MTYsMTEgKzUyNSwxMiBAQAogCXN0cnVjdCBvbWFwX21jYnNwX3JlZ19jZmcgKnJlZ3MgPSAmbWNic3BfZGF0YS0+cmVnczsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChtY2JzcF9kYXRhLT5hY3RpdmUpCisJaWYgKG1jYnNwX2RhdGEtPmFjdGl2ZSkgewogCQlpZiAoZnJlcSA9PSBtY2JzcF9kYXRhLT5pbl9mcmVxKQogCQkJcmV0dXJuIDA7CiAJCWVsc2UKIAkJCXJldHVybiAtRUJVU1k7CisJfQogCiAJLyogVGhlIE1jQlNQIHNpZ25hbCBtdXhpbmcgZnVuY3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBNY0JTUDEgKi8KIAlpZiAoY2xrX2lkID09IE9NQVBfTUNCU1BfQ0xLUl9TUkNfQ0xLUiB8fApAQCAtNTMxLDYgKzU0MSw4IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1jYnNwX2RhdGEtPmluX2ZyZXEgPSBmcmVxOworCXJlZ3MtPnNyZ3IyCSY9IH5DTEtTTTsKKwlyZWdzLT5wY3IwCSY9IH5TQ0xLTUU7CiAKIAlzd2l0Y2ggKGNsa19pZCkgewogCWNhc2UgT01BUF9NQ0JTUF9TWVNDTEtfQ0xLOgpAQCAtNjA1LDggKzYxNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG9tYXBfbWNic3BfZGFpID0KLXsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG9tYXBfbWNic3BfZGFpID0gewogCS5wcm9iZSA9IG1jYnNwX2RhaV9wcm9iZSwKIAkucGxheWJhY2sgPSB7CiAJCS5jaGFubmVsc19taW4gPSAxLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5jIGIvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5jCmluZGV4IGJlZDA5YzIuLjQxZDE3MDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNwZG0uYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jcGRtLmMKQEAgLTEsMTEgKzEsMTIgQEAKIC8qCiAgKiBvbWFwLW1jcGRtLmMgIC0tICBPTUFQIEFMU0EgU29DIERBSSBkcml2ZXIgdXNpbmcgTWNQRE0gcG9ydAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cworICogQ29weXJpZ2h0IChDKSAyMDA5IC0gMjAxMSBUZXhhcyBJbnN0cnVtZW50cwogICoKLSAqIEF1dGhvcjogTWlzYWVsIExvcGV6IENydXogPHgwMDUyNzI5QHRpLmNvbT4KKyAqIEF1dGhvcjogTWlzYWVsIExvcGV6IENydXogPG1pc2FlbC5sb3BlekB0aS5jb20+CiAgKiBDb250YWN0OiBKb3JnZSBFZHVhcmRvIENhbmRlbGFyaWEgPHgwMTA3MjA5QHRpLmNvbT4KICAqICAgICAgICAgIE1hcmdhcml0YSBPbGF5YSA8bWFnaS5vbGF5YUB0aS5jb20+CisgKiAgICAgICAgICBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0yNSw0MSArMjYsNDIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+Ci0jaW5jbHVkZSA8cGxhdC9tY2JzcC5oPgotI2luY2x1ZGUgIm1jcGRtLmgiCisjaW5jbHVkZSA8cGxhdC9vbWFwX2h3bW9kLmg+CisjaW5jbHVkZSAib21hcC1tY3BkbS5oIgogI2luY2x1ZGUgIm9tYXAtcGNtLmgiCiAKLXN0cnVjdCBvbWFwX21jcGRtX2RhdGEgewotCXN0cnVjdCBvbWFwX21jcGRtX2xpbmsgKmxpbmtzOwotCWludCBhY3RpdmU7Ci19Oworc3RydWN0IG9tYXBfbWNwZG0geworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYmFzZTsKKwl2b2lkIF9faW9tZW0gKmlvX2Jhc2U7CisJaW50IGlycTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX21jcGRtX2xpbmsgb21hcF9tY3BkbV9saW5rc1tdID0gewotCS8qIGRvd25saW5rICovCi0JewotCQkuaXJxX21hc2sgPSBNQ1BETV9ETl9JUlFfRU1QVFkgfCBNQ1BETV9ETl9JUlFfRlVMTCwKLQkJLnRocmVzaG9sZCA9IDEsCi0JCS5mb3JtYXQgPSBQRE1PVVRGT1JNQVRfTEpVU1QsCi0JfSwKLQkvKiB1cGxpbmsgKi8KLQl7Ci0JCS5pcnFfbWFzayA9IE1DUERNX1VQX0lSUV9FTVBUWSB8IE1DUERNX1VQX0lSUV9GVUxMLAotCQkudGhyZXNob2xkID0gMSwKLQkJLmZvcm1hdCA9IFBETU9VVEZPUk1BVF9MSlVTVCwKLQl9LAotfTsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tY3BkbV9kYXRhIG1jcGRtX2RhdGEgPSB7Ci0JLmxpbmtzID0gb21hcF9tY3BkbV9saW5rcywKLQkuYWN0aXZlID0gMCwKKwkvKiBjaGFubmVsIGRhdGEgKi8KKwl1MzIgZG5fY2hhbm5lbHM7CisJdTMyIHVwX2NoYW5uZWxzOworCisJLyogTWNQRE0gRklGTyB0aHJlc2hvbGRzICovCisJdTMyIGRuX3RocmVzaG9sZDsKKwl1MzIgdXBfdGhyZXNob2xkOworCisJLyogTWNQRE0gZG4gb2Zmc2V0cyBmb3IgcngxLCBhbmQgMiBjaGFubmVscyAqLworCXUzMiBkbl9yeF9vZmZzZXQ7CiB9OwogCiAvKgpAQCAtNzEsODggKzczLDI1OSBAQAogCQkuZG1hX3JlcSA9IE9NQVA0NFhYX0RNQV9NQ1BETV9ETCwKIAkJLmRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIsCiAJCS5zeW5jX21vZGUgPSBPTUFQX0RNQV9TWU5DX1BBQ0tFVCwKLQkJLnBhY2tldF9zaXplID0gMTYsCi0JCS5wb3J0X2FkZHIgPSBPTUFQNDRYWF9NQ1BETV9MM19CQVNFICsgTUNQRE1fRE5fREFUQSwKKwkJLnBvcnRfYWRkciA9IE9NQVA0NFhYX01DUERNX0wzX0JBU0UgKyBNQ1BETV9SRUdfRE5fREFUQSwKIAl9LAogCXsKIAkJLm5hbWUgPSAiQXVkaW8gY2FwdHVyZSIsCiAJCS5kbWFfcmVxID0gT01BUDQ0WFhfRE1BX01DUERNX1VQLAogCQkuZGF0YV90eXBlID0gT01BUF9ETUFfREFUQV9UWVBFX1MzMiwKIAkJLnN5bmNfbW9kZSA9IE9NQVBfRE1BX1NZTkNfUEFDS0VULAotCQkucGFja2V0X3NpemUgPSAxNiwKLQkJLnBvcnRfYWRkciA9IE9NQVA0NFhYX01DUERNX0wzX0JBU0UgKyBNQ1BETV9VUF9EQVRBLAorCQkucG9ydF9hZGRyID0gT01BUDQ0WFhfTUNQRE1fTDNfQkFTRSArIE1DUERNX1JFR19VUF9EQVRBLAogCX0sCiB9OwogCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9tY3BkbV93cml0ZShzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0sIHUxNiByZWcsIHUzMiB2YWwpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgbWNwZG0tPmlvX2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIGludCBvbWFwX21jcGRtX3JlYWQoc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtLCB1MTYgcmVnKQoreworCXJldHVybiBfX3Jhd19yZWFkbChtY3BkbS0+aW9fYmFzZSArIHJlZyk7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgb21hcF9tY3BkbV9yZWdfZHVtcChzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0pCit7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVNUQVRVU19SQVc6ICAweCUwNHhcbiIsCisJCQlvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19JUlFTVEFUVVNfUkFXKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiSVJRU1RBVFVTOiAgMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfSVJRU1RBVFVTKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiSVJRRU5BQkxFX1NFVDogIDB4JTA0eFxuIiwKKwkJCW9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0lSUUVOQUJMRV9TRVQpKTsKKwlkZXZfZGJnKG1jcGRtLT5kZXYsICJJUlFFTkFCTEVfQ0xSOiAgMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfSVJRRU5BQkxFX0NMUikpOworCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVdBS0VfRU46IDB4JTA0eFxuIiwKKwkJCW9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0lSUVdBS0VfRU4pKTsKKwlkZXZfZGJnKG1jcGRtLT5kZXYsICJETUFFTkFCTEVfU0VUOiAweCUwNHhcbiIsCisJCQlvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19ETUFFTkFCTEVfU0VUKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRE1BRU5BQkxFX0NMUjogIDB4JTA0eFxuIiwKKwkJCW9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0RNQUVOQUJMRV9DTFIpKTsKKwlkZXZfZGJnKG1jcGRtLT5kZXYsICJETUFXQUtFRU46ICAweCUwNHhcbiIsCisJCQlvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19ETUFXQUtFRU4pKTsKKwlkZXZfZGJnKG1jcGRtLT5kZXYsICJDVFJMOiAgMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfQ1RSTCkpOworCWRldl9kYmcobWNwZG0tPmRldiwgIkROX0RBVEE6ICAweCUwNHhcbiIsCisJCQlvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19ETl9EQVRBKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiVVBfREFUQTogMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfVVBfREFUQSkpOworCWRldl9kYmcobWNwZG0tPmRldiwgIkZJRk9fQ1RSTF9ETjogMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfRklGT19DVFJMX0ROKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRklGT19DVFJMX1VQOiAgMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfRklGT19DVFJMX1VQKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIG9tYXBfbWNwZG1fcmVnX2R1bXAoc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtKSB7fQorI2VuZGlmCisKKy8qCisgKiBFbmFibGVzIHRoZSB0cmFuc2ZlciB0aHJvdWdoIHRoZSBQRE0gaW50ZXJmYWNlIHRvL2Zyb20gdGhlIFBob2VuaXgKKyAqIGNvZGVjIGJ5IGVuYWJsaW5nIHRoZSBjb3JyZXNwb25kaW5nIFVQIG9yIEROIGNoYW5uZWxzLgorICovCitzdGF0aWMgdm9pZCBvbWFwX21jcGRtX3N0YXJ0KHN0cnVjdCBvbWFwX21jcGRtICptY3BkbSkKK3sKKwl1MzIgY3RybCA9IG9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0NUUkwpOworCisJY3RybCB8PSAoTUNQRE1fU1dfRE5fUlNUIHwgTUNQRE1fU1dfVVBfUlNUKTsKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfQ1RSTCwgY3RybCk7CisKKwljdHJsIHw9IG1jcGRtLT5kbl9jaGFubmVscyB8IG1jcGRtLT51cF9jaGFubmVsczsKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfQ1RSTCwgY3RybCk7CisKKwljdHJsICY9IH4oTUNQRE1fU1dfRE5fUlNUIHwgTUNQRE1fU1dfVVBfUlNUKTsKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfQ1RSTCwgY3RybCk7Cit9CisKKy8qCisgKiBEaXNhYmxlcyB0aGUgdHJhbnNmZXIgdGhyb3VnaCB0aGUgUERNIGludGVyZmFjZSB0by9mcm9tIHRoZSBQaG9lbml4CisgKiBjb2RlYyBieSBkaXNhYmxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVVAgb3IgRE4gY2hhbm5lbHMuCisgKi8KK3N0YXRpYyB2b2lkIG9tYXBfbWNwZG1fc3RvcChzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0pCit7CisJdTMyIGN0cmwgPSBvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19DVFJMKTsKKworCWN0cmwgfD0gKE1DUERNX1NXX0ROX1JTVCB8IE1DUERNX1NXX1VQX1JTVCk7CisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0NUUkwsIGN0cmwpOworCisJY3RybCAmPSB+KG1jcGRtLT5kbl9jaGFubmVscyB8IG1jcGRtLT51cF9jaGFubmVscyk7CisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0NUUkwsIGN0cmwpOworCisJY3RybCAmPSB+KE1DUERNX1NXX0ROX1JTVCB8IE1DUERNX1NXX1VQX1JTVCk7CisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0NUUkwsIGN0cmwpOworCit9CisKKy8qCisgKiBJcyB0aGUgcGh5c2ljYWwgTWNQRE0gaW50ZXJmYWNlIGFjdGl2ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb21hcF9tY3BkbV9hY3RpdmUoc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtKQoreworCXJldHVybiBvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19DVFJMKSAmCisJCQkJCShNQ1BETV9QRE1fRE5fTUFTSyB8IE1DUERNX1BETV9VUF9NQVNLKTsKK30KKworLyoKKyAqIENvbmZpZ3VyZXMgTWNQRE0gdXBsaW5rLCBhbmQgZG93bmxpbmsgZm9yIGF1ZGlvLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBvbWFwX21jcGRtX3N0YXJ0LgorICovCitzdGF0aWMgdm9pZCBvbWFwX21jcGRtX29wZW5fc3RyZWFtcyhzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0pCit7CisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0lSUUVOQUJMRV9TRVQsCisJCQlNQ1BETV9ETl9JUlFfRU1QVFkgfCBNQ1BETV9ETl9JUlFfRlVMTCB8CisJCQlNQ1BETV9VUF9JUlFfRU1QVFkgfCBNQ1BETV9VUF9JUlFfRlVMTCk7CisKKwkvKiBFbmFibGUgRE4gUlgxLzIgb2Zmc2V0IGNhbmNlbGxhdGlvbiBmZWF0dXJlLCBpZiBjb25maWd1cmVkICovCisJaWYgKG1jcGRtLT5kbl9yeF9vZmZzZXQpIHsKKwkJdTMyIGRuX29mZnNldCA9IG1jcGRtLT5kbl9yeF9vZmZzZXQ7CisKKwkJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0ROX09GRlNFVCwgZG5fb2Zmc2V0KTsKKwkJZG5fb2Zmc2V0IHw9IChNQ1BETV9ETl9PRlNUX1JYMV9FTiB8IE1DUERNX0ROX09GU1RfUlgyX0VOKTsKKwkJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0ROX09GRlNFVCwgZG5fb2Zmc2V0KTsKKwl9CisKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfRklGT19DVFJMX0ROLCBtY3BkbS0+ZG5fdGhyZXNob2xkKTsKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfRklGT19DVFJMX1VQLCBtY3BkbS0+dXBfdGhyZXNob2xkKTsKKworCW9tYXBfbWNwZG1fd3JpdGUobWNwZG0sIE1DUERNX1JFR19ETUFFTkFCTEVfU0VULAorCQkJTUNQRE1fRE1BX0ROX0VOQUJMRSB8IE1DUERNX0RNQV9VUF9FTkFCTEUpOworfQorCisvKgorICogQ2xlYW5zIE1jUERNIHVwbGluaywgYW5kIGRvd25saW5rIGNvbmZpZ3VyYXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQgb21hcF9tY3BkbV9jbG9zZV9zdHJlYW1zKHN0cnVjdCBvbWFwX21jcGRtICptY3BkbSkKK3sKKwkvKiBEaXNhYmxlIGlycSByZXF1ZXN0IGdlbmVyYXRpb24gZm9yIGRvd25saW5rICovCisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0lSUUVOQUJMRV9DTFIsCisJCQlNQ1BETV9ETl9JUlFfRU1QVFkgfCBNQ1BETV9ETl9JUlFfRlVMTCk7CisKKwkvKiBEaXNhYmxlIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gZm9yIGRvd25saW5rICovCisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0RNQUVOQUJMRV9DTFIsIE1DUERNX0RNQV9ETl9FTkFCTEUpOworCisJLyogRGlzYWJsZSBpcnEgcmVxdWVzdCBnZW5lcmF0aW9uIGZvciB1cGxpbmsgKi8KKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfSVJRRU5BQkxFX0NMUiwKKwkJCU1DUERNX1VQX0lSUV9FTVBUWSB8IE1DUERNX1VQX0lSUV9GVUxMKTsKKworCS8qIERpc2FibGUgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBmb3IgdXBsaW5rICovCisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0RNQUVOQUJMRV9DTFIsIE1DUERNX0RNQV9VUF9FTkFCTEUpOworCisJLyogRGlzYWJsZSBSWDEvMiBvZmZzZXQgY2FuY2VsbGF0aW9uICovCisJaWYgKG1jcGRtLT5kbl9yeF9vZmZzZXQpCisJCW9tYXBfbWNwZG1fd3JpdGUobWNwZG0sIE1DUERNX1JFR19ETl9PRkZTRVQsIDApOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9tY3BkbV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtID0gZGV2X2lkOworCWludCBpcnFfc3RhdHVzOworCisJaXJxX3N0YXR1cyA9IG9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0lSUVNUQVRVUyk7CisKKwkvKiBBY2tub3dsZWRnZSBpcnEgZXZlbnQgKi8KKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfSVJRU1RBVFVTLCBpcnFfc3RhdHVzKTsKKworCWlmIChpcnFfc3RhdHVzICYgTUNQRE1fRE5fSVJRX0ZVTEwpCisJCWRldl9kYmcobWNwZG0tPmRldiwgIkROIChwbGF5YmFjaykgRklGTyBGdWxsXG4iKTsKKworCWlmIChpcnFfc3RhdHVzICYgTUNQRE1fRE5fSVJRX0VNUFRZKQorCQlkZXZfZGJnKG1jcGRtLT5kZXYsICJETiAocGxheWJhY2spIEZJRk8gRW1wdHlcbiIpOworCisJaWYgKGlycV9zdGF0dXMgJiBNQ1BETV9ETl9JUlEpCisJCWRldl9kYmcobWNwZG0tPmRldiwgIkROIChwbGF5YmFjaykgd3JpdGUgcmVxdWVzdFxuIik7CisKKwlpZiAoaXJxX3N0YXR1cyAmIE1DUERNX1VQX0lSUV9GVUxMKQorCQlkZXZfZGJnKG1jcGRtLT5kZXYsICJVUCAoY2FwdHVyZSkgRklGTyBGdWxsXG4iKTsKKworCWlmIChpcnFfc3RhdHVzICYgTUNQRE1fVVBfSVJRX0VNUFRZKQorCQlkZXZfZGJnKG1jcGRtLT5kZXYsICJVUCAoY2FwdHVyZSkgRklGTyBFbXB0eVxuIik7CisKKwlpZiAoaXJxX3N0YXR1cyAmIE1DUERNX1VQX0lSUSkKKwkJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiVVAgKGNhcHR1cmUpIHdyaXRlIHJlcXVlc3RcbiIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiBzdGF0aWMgaW50IG9tYXBfbWNwZG1fZGFpX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlpbnQgZXJyID0gMDsKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCi0JaWYgKCFkYWktPmFjdGl2ZSkKLQkJZXJyID0gb21hcF9tY3BkbV9yZXF1ZXN0KCk7CisJbXV0ZXhfbG9jaygmbWNwZG0tPm11dGV4KTsKIAotCXJldHVybiBlcnI7CisJaWYgKCFkYWktPmFjdGl2ZSkgeworCQlwbV9ydW50aW1lX2dldF9zeW5jKG1jcGRtLT5kZXYpOworCisJCS8qIEVuYWJsZSB3YXRjaCBkb2cgZm9yIEVTIGFib3ZlIEVTIDEuMCB0byBhdm9pZCBzYXR1cmF0aW9uICovCisJCWlmIChvbWFwX3JldigpICE9IE9NQVA0NDMwX1JFVl9FUzFfMCkgeworCQkJdTMyIGN0cmwgPSBvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19DVFJMKTsKKworCQkJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0NUUkwsCisJCQkJCSBjdHJsIHwgTUNQRE1fV0RfRU4pOworCQl9CisJCW9tYXBfbWNwZG1fb3Blbl9zdHJlYW1zKG1jcGRtKTsKKwl9CisKKwltdXRleF91bmxvY2soJm1jcGRtLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgb21hcF9tY3BkbV9kYWlfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWlmICghZGFpLT5hY3RpdmUpCi0JCW9tYXBfbWNwZG1fZnJlZSgpOwotfQotCi1zdGF0aWMgaW50IG9tYXBfbWNwZG1fZGFpX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQsCiAJCQkJICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgb21hcF9tY3BkbV9kYXRhICptY3BkbV9wcml2ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKLQlpbnQgc3RyZWFtID0gc3Vic3RyZWFtLT5zdHJlYW07Ci0JaW50IGVyciA9IDA7CisJc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKIAotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCWlmICghbWNwZG1fcHJpdi0+YWN0aXZlKyspCi0JCQlvbWFwX21jcGRtX3N0YXJ0KHN0cmVhbSk7Ci0JCWJyZWFrOworCW11dGV4X2xvY2soJm1jcGRtLT5tdXRleCk7CiAKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQkJaWYgKCEtLW1jcGRtX3ByaXYtPmFjdGl2ZSkKLQkJCW9tYXBfbWNwZG1fc3RvcChzdHJlYW0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllcnIgPSAtRUlOVkFMOworCWlmICghZGFpLT5hY3RpdmUpIHsKKwkJaWYgKG9tYXBfbWNwZG1fYWN0aXZlKG1jcGRtKSkgeworCQkJb21hcF9tY3BkbV9zdG9wKG1jcGRtKTsKKwkJCW9tYXBfbWNwZG1fY2xvc2Vfc3RyZWFtcyhtY3BkbSk7CisJCX0KKworCQlpZiAoIW9tYXBfbWNwZG1fYWN0aXZlKG1jcGRtKSkKKwkJCXBtX3J1bnRpbWVfcHV0X3N5bmMobWNwZG0tPmRldik7CiAJfQogCi0JcmV0dXJuIGVycjsKKwltdXRleF91bmxvY2soJm1jcGRtLT5tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9tY3BkbV9kYWlfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0Jc3RydWN0IG9tYXBfbWNwZG1fZGF0YSAqbWNwZG1fcHJpdiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0Jc3RydWN0IG9tYXBfbWNwZG1fbGluayAqbWNwZG1fbGlua3MgPSBtY3BkbV9wcml2LT5saW5rczsKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCWludCBzdHJlYW0gPSBzdWJzdHJlYW0tPnN0cmVhbTsKLQlpbnQgY2hhbm5lbHMsIGVyciwgbGlua19tYXNrID0gMDsKLQotCXNuZF9zb2NfZGFpX3NldF9kbWFfZGF0YShkYWksIHN1YnN0cmVhbSwKLQkJCQkgJm9tYXBfbWNwZG1fZGFpX2RtYV9wYXJhbXNbc3RyZWFtXSk7CisJc3RydWN0IG9tYXBfcGNtX2RtYV9kYXRhICpkbWFfZGF0YTsKKwlpbnQgY2hhbm5lbHM7CisJaW50IGxpbmtfbWFzayA9IDA7CiAKIAljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwogCXN3aXRjaCAoY2hhbm5lbHMpIHsKKwljYXNlIDU6CisJCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQkJLyogdXAgdG8gMyBjaGFubmVscyBmb3IgY2FwdHVyZSAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWxpbmtfbWFzayB8PSAxIDw8IDQ7CiAJY2FzZSA0OgogCQlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKLQkJCS8qIHVwIHRvIDIgY2hhbm5lbHMgZm9yIGNhcHR1cmUgKi8KKwkJCS8qIHVwIHRvIDMgY2hhbm5lbHMgZm9yIGNhcHR1cmUgKi8KIAkJCXJldHVybiAtRUlOVkFMOwogCQlsaW5rX21hc2sgfD0gMSA8PCAzOwogCWNhc2UgMzoKLQkJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCQkvKiB1cCB0byAyIGNoYW5uZWxzIGZvciBjYXB0dXJlICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKIAkJbGlua19tYXNrIHw9IDEgPDwgMjsKIAljYXNlIDI6CiAJCWxpbmtfbWFzayB8PSAxIDw8IDE7CkBAIC0xNjQsOTUgKzMzNywxODcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJZG1hX2RhdGEgPSAmb21hcF9tY3BkbV9kYWlfZG1hX3BhcmFtc1tzdHJlYW1dOworCisJLyogQ29uZmlndXJlIE1jUERNIGNoYW5uZWxzLCBhbmQgRE1BIHBhY2tldCBzaXplICovCiAJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCW1jcGRtX2xpbmtzW3N0cmVhbV0uY2hhbm5lbHMgPSBsaW5rX21hc2sgPDwgMzsKLQkJZXJyID0gb21hcF9tY3BkbV9wbGF5YmFja19vcGVuKCZtY3BkbV9saW5rc1tzdHJlYW1dKTsKKwkJbWNwZG0tPmRuX2NoYW5uZWxzID0gbGlua19tYXNrIDw8IDM7CisJCWRtYV9kYXRhLT5wYWNrZXRfc2l6ZSA9CisJCQkoTUNQRE1fRE5fVEhSRVNfTUFYIC0gbWNwZG0tPmRuX3RocmVzaG9sZCkgKiBjaGFubmVsczsKIAl9IGVsc2UgewotCQltY3BkbV9saW5rc1tzdHJlYW1dLmNoYW5uZWxzID0gbGlua19tYXNrIDw8IDA7Ci0JCWVyciA9IG9tYXBfbWNwZG1fY2FwdHVyZV9vcGVuKCZtY3BkbV9saW5rc1tzdHJlYW1dKTsKKwkJbWNwZG0tPnVwX2NoYW5uZWxzID0gbGlua19tYXNrIDw8IDA7CisJCWRtYV9kYXRhLT5wYWNrZXRfc2l6ZSA9IG1jcGRtLT51cF90aHJlc2hvbGQgKiBjaGFubmVsczsKIAl9CiAKLQlyZXR1cm4gZXJyOworCXNuZF9zb2NfZGFpX3NldF9kbWFfZGF0YShkYWksIHN1YnN0cmVhbSwgZG1hX2RhdGEpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9tY3BkbV9kYWlfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKK3N0YXRpYyBpbnQgb21hcF9tY3BkbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0Jc3RydWN0IG9tYXBfbWNwZG1fZGF0YSAqbWNwZG1fcHJpdiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0Jc3RydWN0IG9tYXBfbWNwZG1fbGluayAqbWNwZG1fbGlua3MgPSBtY3BkbV9wcml2LT5saW5rczsKLQlpbnQgc3RyZWFtID0gc3Vic3RyZWFtLT5zdHJlYW07Ci0JaW50IGVycjsKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09ICBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQllcnIgPSBvbWFwX21jcGRtX3BsYXliYWNrX2Nsb3NlKCZtY3BkbV9saW5rc1tzdHJlYW1dKTsKLQllbHNlCi0JCWVyciA9IG9tYXBfbWNwZG1fY2FwdHVyZV9jbG9zZSgmbWNwZG1fbGlua3Nbc3RyZWFtXSk7CisJaWYgKCFvbWFwX21jcGRtX2FjdGl2ZShtY3BkbSkpIHsKKwkJb21hcF9tY3BkbV9zdGFydChtY3BkbSk7CisJCW9tYXBfbWNwZG1fcmVnX2R1bXAobWNwZG0pOworCX0KIAotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG9tYXBfbWNwZG1fZGFpX29wcyA9IHsKIAkuc3RhcnR1cAk9IG9tYXBfbWNwZG1fZGFpX3N0YXJ0dXAsCiAJLnNodXRkb3duCT0gb21hcF9tY3BkbV9kYWlfc2h1dGRvd24sCi0JLnRyaWdnZXIJPSBvbWFwX21jcGRtX2RhaV90cmlnZ2VyLAogCS5od19wYXJhbXMJPSBvbWFwX21jcGRtX2RhaV9od19wYXJhbXMsCi0JLmh3X2ZyZWUJPSBvbWFwX21jcGRtX2RhaV9od19mcmVlLAorCS5wcmVwYXJlCT0gb21hcF9tY3BkbV9wcmVwYXJlLAogfTsKIAotI2RlZmluZSBPTUFQX01DUERNX1JBVEVTCShTTkRSVl9QQ01fUkFURV84ODIwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwKQotI2RlZmluZSBPTUFQX01DUERNX0ZPUk1BVFMJKFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQotCi1zdGF0aWMgaW50IG9tYXBfbWNwZG1fZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQorc3RhdGljIGludCBvbWFwX21jcGRtX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXNuZF9zb2NfZGFpX3NldF9kcnZkYXRhKGRhaSwgJm1jcGRtX2RhdGEpOworCXN0cnVjdCBvbWFwX21jcGRtICptY3BkbSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJaW50IHJldDsKKworCXBtX3J1bnRpbWVfZW5hYmxlKG1jcGRtLT5kZXYpOworCisJLyogRGlzYWJsZSBsaW5lcyB3aGlsZSByZXF1ZXN0IGlzIG9uZ29pbmcgKi8KKwlwbV9ydW50aW1lX2dldF9zeW5jKG1jcGRtLT5kZXYpOworCW9tYXBfbWNwZG1fd3JpdGUobWNwZG0sIE1DUERNX1JFR19DVFJMLCAweDAwKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKG1jcGRtLT5pcnEsIG9tYXBfbWNwZG1faXJxX2hhbmRsZXIsCisJCQkJMCwgIk1jUERNIiwgKHZvaWQgKiltY3BkbSk7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKG1jcGRtLT5kZXYpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1jcGRtLT5kZXYsICJSZXF1ZXN0IGZvciBJUlEgZmFpbGVkXG4iKTsKKwkJcG1fcnVudGltZV9kaXNhYmxlKG1jcGRtLT5kZXYpOworCX0KKworCS8qIENvbmZpZ3VyZSBNY1BETSB0aHJlc2hvbGQgdmFsdWVzICovCisJbWNwZG0tPmRuX3RocmVzaG9sZCA9IDI7CisJbWNwZG0tPnVwX3RocmVzaG9sZCA9IE1DUERNX1VQX1RIUkVTX01BWCAtIDM7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvbWFwX21jcGRtX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCisJZnJlZV9pcnEobWNwZG0tPmlycSwgKHZvaWQgKiltY3BkbSk7CisJcG1fcnVudGltZV9kaXNhYmxlKG1jcGRtLT5kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgT01BUF9NQ1BETV9SQVRFUwkoU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCkKKyNkZWZpbmUgT01BUF9NQ1BETV9GT1JNQVRTCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFCisKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG9tYXBfbWNwZG1fZGFpID0gewotCS5wcm9iZSA9IG9tYXBfbWNwZG1fZGFpX3Byb2JlLAorCS5wcm9iZSA9IG9tYXBfbWNwZG1fcHJvYmUsCisJLnJlbW92ZSA9IG9tYXBfbWNwZG1fcmVtb3ZlLAorCS5wcm9iZV9vcmRlciA9IFNORF9TT0NfQ09NUF9PUkRFUl9MQVRFLAorCS5yZW1vdmVfb3JkZXIgPSBTTkRfU09DX0NPTVBfT1JERVJfRUFSTFksCiAJLnBsYXliYWNrID0gewogCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJLmNoYW5uZWxzX21heCA9IDQsCisJCS5jaGFubmVsc19tYXggPSA1LAogCQkucmF0ZXMgPSBPTUFQX01DUERNX1JBVEVTLAogCQkuZm9ybWF0cyA9IE9NQVBfTUNQRE1fRk9STUFUUywKIAl9LAogCS5jYXB0dXJlID0gewogCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5jaGFubmVsc19tYXggPSAzLAogCQkucmF0ZXMgPSBPTUFQX01DUERNX1JBVEVTLAogCQkuZm9ybWF0cyA9IE9NQVBfTUNQRE1fRk9STUFUUywKIAl9LAogCS5vcHMgPSAmb21hcF9tY3BkbV9kYWlfb3BzLAogfTsKIAordm9pZCBvbWFwX21jcGRtX2NvbmZpZ3VyZV9kbl9vZmZzZXRzKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJICAgIHU4IHJ4MSwgdTggcngyKQoreworCXN0cnVjdCBvbWFwX21jcGRtICptY3BkbSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKHJ0ZC0+Y3B1X2RhaSk7CisKKwltY3BkbS0+ZG5fcnhfb2Zmc2V0ID0gTUNQRE1fRE5PRlNUX1JYMShyeDEpIHwgTUNQRE1fRE5PRlNUX1JYMihyeDIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF9tY3BkbV9jb25maWd1cmVfZG5fb2Zmc2V0cyk7CisKIHN0YXRpYyBfX2RldmluaXQgaW50IGFzb2NfbWNwZG1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgcmV0OworCXN0cnVjdCBvbWFwX21jcGRtICptY3BkbTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0ID0gMDsKIAotCXJldCA9IG9tYXBfbWNwZG1fcHJvYmUocGRldik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJbWNwZG0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9tY3BkbSksIEdGUF9LRVJORUwpOworCWlmICghbWNwZG0pCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWNwZG0pOworCisJbXV0ZXhfaW5pdCgmbWNwZG0tPm11dGV4KTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHJlc291cmNlXG4iKTsKKwkJZ290byBlcnJfcmVzOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgIk1jUERNIikpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9yZXM7CisJfQorCisJbWNwZG0tPmlvX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFtY3BkbS0+aW9fYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb21hcDsKKwl9CisKKwltY3BkbS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAobWNwZG0tPmlycSA8IDApIHsKKwkJcmV0ID0gbWNwZG0tPmlycTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCW1jcGRtLT5kZXYgPSAmcGRldi0+ZGV2OworCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldiwgJm9tYXBfbWNwZG1fZGFpKTsKLQlpZiAocmV0IDwgMCkKLQkJb21hcF9tY3BkbV9yZW1vdmUocGRldik7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCitlcnJfaXJxOgorCWlvdW5tYXAobWNwZG0tPmlvX2Jhc2UpOworZXJyX2lvbWFwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworZXJyX3JlczoKKwlrZnJlZShtY3BkbSk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgYXNvY19tY3BkbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwogCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldik7Ci0Jb21hcF9tY3BkbV9yZW1vdmUocGRldik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlvdW5tYXAobWNwZG0tPmlvX2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCisJa2ZyZWUobWNwZG0pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhc29jX21jcGRtX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkJLm5hbWUgPSAib21hcC1tY3BkbS1kYWkiLAotCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gIm9tYXAtbWNwZG0iLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogCi0JLnByb2JlID0gYXNvY19tY3BkbV9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoYXNvY19tY3BkbV9yZW1vdmUpLAorCS5wcm9iZQk9IGFzb2NfbWNwZG1fcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGFzb2NfbWNwZG1fcmVtb3ZlKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNuZF9vbWFwX21jcGRtX2luaXQodm9pZCkKQEAgLTI2Nyw2ICs1MzIsNiBAQAogfQogbW9kdWxlX2V4aXQoc25kX29tYXBfbWNwZG1fZXhpdCk7CiAKLU1PRFVMRV9BVVRIT1IoIk1pc2FlbCBMb3BleiBDcnV6IDx4MDA1MjcyOUB0aS5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJNaXNhZWwgTG9wZXogQ3J1eiA8bWlzYWVsLmxvcGV6QHRpLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiT01BUCBQRE0gU29DIEludGVyZmFjZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5oIGIvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOGNmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jcGRtLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBvbWFwLW1jcGRtLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDExIFRleGFzIEluc3RydW1lbnRzCisgKgorICogQ29udGFjdDogTWlzYWVsIExvcGV6IENydXogPG1pc2FlbC5sb3BlekB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fT01BUF9NQ1BETV9IX18KKyNkZWZpbmUgX19PTUFQX01DUERNX0hfXworCisjZGVmaW5lIE1DUERNX1JFR19SRVZJU0lPTgkJMHgwMAorI2RlZmluZSBNQ1BETV9SRUdfU1lTQ09ORklHCQkweDEwCisjZGVmaW5lIE1DUERNX1JFR19JUlFTVEFUVVNfUkFXCQkweDI0CisjZGVmaW5lIE1DUERNX1JFR19JUlFTVEFUVVMJCTB4MjgKKyNkZWZpbmUgTUNQRE1fUkVHX0lSUUVOQUJMRV9TRVQJCTB4MkMKKyNkZWZpbmUgTUNQRE1fUkVHX0lSUUVOQUJMRV9DTFIJCTB4MzAKKyNkZWZpbmUgTUNQRE1fUkVHX0lSUVdBS0VfRU4JCTB4MzQKKyNkZWZpbmUgTUNQRE1fUkVHX0RNQUVOQUJMRV9TRVQJCTB4MzgKKyNkZWZpbmUgTUNQRE1fUkVHX0RNQUVOQUJMRV9DTFIJCTB4M0MKKyNkZWZpbmUgTUNQRE1fUkVHX0RNQVdBS0VFTgkJMHg0MAorI2RlZmluZSBNQ1BETV9SRUdfQ1RSTAkJCTB4NDQKKyNkZWZpbmUgTUNQRE1fUkVHX0ROX0RBVEEJCTB4NDgKKyNkZWZpbmUgTUNQRE1fUkVHX1VQX0RBVEEJCTB4NEMKKyNkZWZpbmUgTUNQRE1fUkVHX0ZJRk9fQ1RSTF9ETgkJMHg1MAorI2RlZmluZSBNQ1BETV9SRUdfRklGT19DVFJMX1VQCQkweDU0CisjZGVmaW5lIE1DUERNX1JFR19ETl9PRkZTRVQJCTB4NTgKKworLyoKKyAqIE1DUERNX0lSUSBiaXQgZmllbGRzCisgKiBJUlFTVEFUVVNfUkFXLCBJUlFTVEFUVVMsIElSUUVOQUJMRV9TRVQsIElSUUVOQUJMRV9DTFIKKyAqLworCisjZGVmaW5lIE1DUERNX0ROX0lSUQkJCSgxIDw8IDApCisjZGVmaW5lIE1DUERNX0ROX0lSUV9FTVBUWQkJKDEgPDwgMSkKKyNkZWZpbmUgTUNQRE1fRE5fSVJRX0FMTVNUX0VNUFRZCSgxIDw8IDIpCisjZGVmaW5lIE1DUERNX0ROX0lSUV9GVUxMCQkoMSA8PCAzKQorCisjZGVmaW5lIE1DUERNX1VQX0lSUQkJCSgxIDw8IDgpCisjZGVmaW5lIE1DUERNX1VQX0lSUV9FTVBUWQkJKDEgPDwgOSkKKyNkZWZpbmUgTUNQRE1fVVBfSVJRX0FMTVNUX0ZVTEwJCSgxIDw8IDEwKQorI2RlZmluZSBNQ1BETV9VUF9JUlFfRlVMTAkJKDEgPDwgMTEpCisKKyNkZWZpbmUgTUNQRE1fRE9XTkxJTktfSVJRX01BU0sJCTB4MDBGCisjZGVmaW5lIE1DUERNX1VQTElOS19JUlFfTUFTSwkJMHhGMDAKKworLyoKKyAqIE1DUERNX0RNQUVOQUJMRSBiaXQgZmllbGRzCisgKi8KKworI2RlZmluZSBNQ1BETV9ETUFfRE5fRU5BQkxFCQkoMSA8PCAwKQorI2RlZmluZSBNQ1BETV9ETUFfVVBfRU5BQkxFCQkoMSA8PCAxKQorCisvKgorICogTUNQRE1fQ1RSTCBiaXQgZmllbGRzCisgKi8KKworI2RlZmluZSBNQ1BETV9QRE1fVVBMSU5LX0VOKHgpCQkoMSA8PCAoeCAtIDEpKSAvKiBjaDEgaXMgYXQgYml0IDAgKi8KKyNkZWZpbmUgTUNQRE1fUERNX0RPV05MSU5LX0VOKHgpCSgxIDw8ICh4ICsgMikpIC8qIGNoMSBpcyBhdCBiaXQgMyAqLworI2RlZmluZSBNQ1BETV9QRE1PVVRGT1JNQVQJCSgxIDw8IDgpCisjZGVmaW5lIE1DUERNX0NNRF9JTlQJCQkoMSA8PCA5KQorI2RlZmluZSBNQ1BETV9TVEFUVVNfSU5UCQkoMSA8PCAxMCkKKyNkZWZpbmUgTUNQRE1fU1dfVVBfUlNUCQkJKDEgPDwgMTEpCisjZGVmaW5lIE1DUERNX1NXX0ROX1JTVAkJCSgxIDw8IDEyKQorI2RlZmluZSBNQ1BETV9XRF9FTgkJCSgxIDw8IDE0KQorI2RlZmluZSBNQ1BETV9QRE1fVVBfTUFTSwkJMHg3CisjZGVmaW5lIE1DUERNX1BETV9ETl9NQVNLCQkoMHgxZiA8PCAzKQorCisKKyNkZWZpbmUgTUNQRE1fUERNT1VURk9STUFUX0xKVVNUCSgwIDw8IDgpCisjZGVmaW5lIE1DUERNX1BETU9VVEZPUk1BVF9SSlVTVAkoMSA8PCA4KQorCisvKgorICogTUNQRE1fRklGT19DVFJMIGJpdCBmaWVsZHMKKyAqLworCisjZGVmaW5lIE1DUERNX1VQX1RIUkVTX01BWAkJMHhGCisjZGVmaW5lIE1DUERNX0ROX1RIUkVTX01BWAkJMHhGCisKKy8qCisgKiBNQ1BETV9ETl9PRkZTRVQgYml0IGZpZWxkcworICovCisKKyNkZWZpbmUgTUNQRE1fRE5fT0ZTVF9SWDFfRU4JCSgxIDw8IDApCisjZGVmaW5lIE1DUERNX0ROT0ZTVF9SWDEoeCkJCSgoeCAmIDB4MWYpIDw8IDEpCisjZGVmaW5lIE1DUERNX0ROX09GU1RfUlgyX0VOCQkoMSA8PCA4KQorI2RlZmluZSBNQ1BETV9ETk9GU1RfUlgyKHgpCQkoKHggJiAweDFmKSA8PCA5KQorCit2b2lkIG9tYXBfbWNwZG1fY29uZmlndXJlX2RuX29mZnNldHMoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkgICAgdTggcngxLCB1OCByeDIpOworCisjZW5kaWYJLyogRW5kIG9mIF9fT01BUF9NQ1BETV9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jCmluZGV4IDliNWM4OGEuLjZlZGU3ZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMKKysrIGIvc291bmQvc29jL29tYXAvb21hcC1wY20uYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTE5OCw2ICsxOTksMTQgQEAKIAkJCSAgICAgIE9NQVBfRE1BX0xBU1RfSVJRIHwgT01BUF9ETUFfQkxPQ0tfSVJRKTsKIAllbHNlIGlmICghc3Vic3RyZWFtLT5ydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwKQogCQlvbWFwX2VuYWJsZV9kbWFfaXJxKHBydGQtPmRtYV9jaCwgT01BUF9ETUFfRlJBTUVfSVJRKTsKKwllbHNlIHsKKwkJLyoKKwkJICogTm8gcGVyaW9kIHdha2V1cDoKKwkJICogd2UgbmVlZCB0byBkaXNhYmxlIEJMT0NLX0lSUSwgd2hpY2ggaXMgZW5hYmxlZCBieSB0aGUgb21hcAorCQkgKiBkbWEgY29yZSBhdCByZXF1ZXN0IGRtYSB0aW1lLgorCQkgKi8KKwkJb21hcF9kaXNhYmxlX2RtYV9pcnEocHJ0ZC0+ZG1hX2NoLCBPTUFQX0RNQV9CTE9DS19JUlEpOworCX0KIAogCWlmICghKGNwdV9jbGFzc19pc19vbWFwMSgpKSkgewogCQlvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUocHJ0ZC0+ZG1hX2NoLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcDNiZWFnbGUuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAzYmVhZ2xlLmMKaW5kZXggNDBkYjgxMy4uMzM1N2RjYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcDNiZWFnbGUuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM2JlYWdsZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwM2V2bS5jIGIvc291bmQvc29jL29tYXAvb21hcDNldm0uYwppbmRleCAwZGFhMDQ0Li42ODU3ODk1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwM2V2bS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAzZXZtLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KQEAgLTM2LDI5ICszNyw4IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCWludCByZXQ7CiAKLQkvKiBTZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogU2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIFNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLwogCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCAwLCAyNjAwMDAwMCwKIAkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOwpAQCAtODIsNiArNjIsOCBAQAogCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCS5wbGF0Zm9ybV9uYW1lID0gIm9tYXAtcGNtLWF1ZGlvIiwKIAkuY29kZWNfbmFtZSA9ICJ0d2w0MDMwLWNvZGVjIiwKKwkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJICAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkub3BzIAkJPSAmb21hcDNldm1fb3BzLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcDNwYW5kb3JhLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYwppbmRleCA4MDQ3YzUyMWUuLjc2MDVjMzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAzcGFuZG9yYS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAzcGFuZG9yYS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC00OCwyNCArNDksOCBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAotCQkgIFNORF9TT0NfREFJRk1UX0NCU19DRlM7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBmbXQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycihQUkVGSVggImNhbid0IHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogU2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgZm10KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoUFJFRklYICJjYW4ndCBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBTZXQgdGhlIGNvZGVjIHN5c3RlbSBjbG9jayBmb3IgREFDIGFuZCBBREMgKi8KIAlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgMjYwMDAwMDAsCiAJCQkJCSAgICBTTkRfU09DX0NMT0NLX0lOKTsKQEAgLTE4OSwxMCArMTc0LDggQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIG9tYXAzcGFuZG9yYV9vdXRfbWFwLAorCXJldHVybiBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBvbWFwM3BhbmRvcmFfb3V0X21hcCwKIAkJQVJSQVlfU0laRShvbWFwM3BhbmRvcmFfb3V0X21hcCkpOwotCi0JcmV0dXJuIHNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IG9tYXAzcGFuZG9yYV9pbl9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCkBAIC0yMTIsMTAgKzE5NSw4IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBvbWFwM3BhbmRvcmFfaW5fbWFwLAorCXJldHVybiBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBvbWFwM3BhbmRvcmFfaW5fbWFwLAogCQlBUlJBWV9TSVpFKG9tYXAzcGFuZG9yYV9pbl9tYXApKTsKLQotCXJldHVybiBzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBvbWFwM3BhbmRvcmFfb3BzID0gewpAQCAtMjMxLDYgKzIxMiw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJCS5vcHMgPSAmb21hcDNwYW5kb3JhX29wcywKIAkJLmluaXQgPSBvbWFwM3BhbmRvcmFfb3V0X2luaXQsCiAJfSwgewpAQCAtMjQwLDYgKzIyMyw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJCS5vcHMgPSAmb21hcDNwYW5kb3JhX29wcywKIAkJLmluaXQgPSBvbWFwM3BhbmRvcmFfaW5faW5pdCwKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwNC1oZG1pLWNhcmQuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXA0LWhkbWktY2FyZC5jCmluZGV4IDlmMzI2MTUuLjg2NzEyNjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXA0LWhkbWktY2FyZC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXA0LWhkbWktY2FyZC5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb3NrNTkxMi5jIGIvc291bmQvc29jL29tYXAvb3NrNTkxMi5jCmluZGV4IDdlNzVlNzcuLjM1MWVjOWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29zazU5MTIuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vc2s1OTEyLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8cGxhdC9tY2JzcC5oPgogCiAjaW5jbHVkZSAib21hcC1tY2JzcC5oIgpAQCAtNTUsMjkgKzU2LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IGVycjsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCWVyciA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfRFNQX0IgfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7Ci0JaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBzZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIFNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQllcnIgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksCi0JCQkJICBTTkRfU09DX0RBSUZNVF9EU1BfQiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQogCS8qIFNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLwogCWVyciA9CiAJICAgIHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCAwLCBDT0RFQ19DTE9DSywgU05EX1NPQ19DTE9DS19JTik7CkBAIC0xMTIsMjcgKzkyLDYgQEAKIAl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBKYWNrIn0sCiB9OwogCi1zdGF0aWMgaW50IG9za190bHYzMjBhaWMyM19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQkvKiBBZGQgb3NrNTkxMiBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cykpOwotCi0JLyogU2V0IHVwIG9zazU5MTIgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBJbiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogRGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgb3NrX2RhaSA9IHsKIAkubmFtZSA9ICJUTFYzMjBBSUMyMyIsCkBAIC0xNDEsNyArMTAwLDggQEAKIAkuY29kZWNfZGFpX25hbWUgPSAidGx2MzIwYWljMjMtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjIiwKLQkuaW5pdCA9IG9za190bHYzMjBhaWMyM19pbml0LAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfRFNQX0IgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCSAgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJLm9wcyA9ICZvc2tfb3BzLAogfTsKIApAQCAtMTUwLDYgKzExMCwxMSBAQAogCS5uYW1lID0gIk9TSzU5MTIiLAogCS5kYWlfbGluayA9ICZvc2tfZGFpLAogCS5udW1fbGlua3MgPSAxLAorCisJLmRhcG1fd2lkZ2V0cyA9IHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvc2tfc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL292ZXJvLmMgYi9zb3VuZC9zb2Mvb21hcC9vdmVyby5jCmluZGV4IGJiY2YzODAuLmMzNTUwYWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL292ZXJvLmMKKysrIGIvc291bmQvc29jL29tYXAvb3Zlcm8uYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzgsMjkgKzM5LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIDI2MDAwMDAwLAogCQkJCQkgICAgU05EX1NPQ19DTE9DS19JTik7CkBAIC04NCw2ICs2NCw4IEBACiAJLmNvZGVjX2RhaV9uYW1lID0gInR3bDQwMzAtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5vcHMgPSAmb3Zlcm9fb3BzLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvcng1MS5jIGIvc291bmQvc29jL29tYXAvcng1MS5jCmluZGV4IDg5MzMwMGEuLjRjYWJiNzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL3J4NTEuYworKysgYi9zb3VuZC9zb2Mvb21hcC9yeDUxLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtMTE1LDI0ICsxMTYsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgZXJyOwotCi0JLyogU2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCi0JZXJyID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksCi0JCQkJICBTTkRfU09DX0RBSUZNVF9EU1BfQSB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9JQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIFNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQllcnIgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksCi0JCQkJICBTTkRfU09DX0RBSUZNVF9EU1BfQSB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9JQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKIAogCS8qIFNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLwogCXJldHVybiBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgMTkyMDAwMDAsCkBAIC0zMzUsOCArMzE4LDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJLyogQVYgamFjayBkZXRlY3Rpb24gKi8KIAllcnIgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiQVYgSmFjayIsCiAJCQkgICAgICAgU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX1ZJREVPT1VULApAQCAtMzc3LDYgKzM1OCw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0bHYzMjBhaWMzeC1oaWZpIiwKIAkJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCQkuY29kZWNfbmFtZSA9ICJ0bHYzMjBhaWMzeC1jb2RlYy4yLTAwMTgiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0RTUF9BIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYgfAorCQkJICAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkJLmluaXQgPSByeDUxX2FpYzM0X2luaXQsCiAJCS5vcHMgPSAmcng1MV9vcHMsCiAJfSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL3NkcDM0MzAuYyBiL3NvdW5kL3NvYy9vbWFwL3NkcDM0MzAuYwppbmRleCA5ZjZhNzU4Li5lOGZiZjhlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9zZHAzNDMwLmMKKysrIGIvc291bmQvc29jL29tYXAvc2RwMzQzMC5jCkBAIC0zNyw2ICszNyw3IEBACiAKIC8qIFJlZ2lzdGVyIGRlc2NyaXB0aW9ucyBmb3IgdHdsNDAzMCBjb2RlYyBwYXJ0ICovCiAjaW5jbHVkZSA8bGludXgvbWZkL3R3bDQwMzAtYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIm9tYXAtbWNic3AuaCIKICNpbmNsdWRlICJvbWFwLXBjbS5oIgpAQCAtNTMsMjkgKzU0LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIDI2MDAwMDAwLAogCQkJCQkgICAgU05EX1NPQ19DTE9DS19JTik7CkBAIC05MSw0OSArNzEsNiBAQAogCS5od19wYXJhbXMgPSBzZHAzNDMwX2h3X3BhcmFtcywKIH07CiAKLXN0YXRpYyBpbnQgc2RwMzQzMF9od192b2ljZV9wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0Jc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCWludCByZXQ7Ci0KLQkvKiBTZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwKLQkJCQlTTkRfU09DX0RBSUZNVF9EU1BfQSB8Ci0JCQkJU05EX1NPQ19EQUlGTVRfSUJfTkYgfAotCQkJCVNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBzZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIFNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksCi0JCQkJU05EX1NPQ19EQUlGTVRfRFNQX0EgfAotCQkJCVNORF9TT0NfREFJRk1UX0lCX05GIHwKLQkJCQlTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIFNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCAwLCAyNjAwMDAwMCwKLQkJCQkJICAgIFNORF9TT0NfQ0xPQ0tfSU4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIHN5c3RlbSBjbG9ja1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgc2RwMzQzMF92b2ljZV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IHNkcDM0MzBfaHdfdm9pY2VfcGFyYW1zLAotfTsKLQogLyogSGVhZHNldCBqYWNrICovCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFjayBoc19qYWNrOwogCkBAIC0xOTMsMTUgKzEzMCw2IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKLQkvKiBBZGQgU0RQMzQzMCBzcGVjaWZpYyB3aWRnZXRzICovCi0JcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBzZHAzNDMwX3R3bDQwMzBfZGFwbV93aWRnZXRzLAotCQkJCUFSUkFZX1NJWkUoc2RwMzQzMF90d2w0MDMwX2RhcG1fd2lkZ2V0cykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBTZXQgdXAgU0RQMzQzMCBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQogCS8qIFNEUDM0MzAgY29ubmVjdGVkIHBpbnMgKi8KIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IE1pYyIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CkBAIC0yMjMsMTAgKzE1MSw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQ0FSS0lUTCIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNBUktJVFIiKTsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAkvKiBIZWFkc2V0IGphY2sgZGV0ZWN0aW9uICovCiAJcmV0ID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRzZXQgSmFjayIsCiAJCQkJU05EX0pBQ0tfSEVBRFNFVCwgJmhzX2phY2spOwpAQCAtMjY3LDYgKzE5MSw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCS5pbml0ID0gc2RwMzQzMF90d2w0MDMwX2luaXQsCiAJCS5vcHMgPSAmc2RwMzQzMF9vcHMsCiAJfSwKQEAgLTI3Nyw4ICsyMDMsMTAgQEAKIAkJLmNvZGVjX2RhaV9uYW1lID0gInR3bDQwMzAtdm9pY2UiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0RTUF9BIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYgfAorCQkJICAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkJLmluaXQgPSBzZHAzNDMwX3R3bDQwMzBfdm9pY2VfaW5pdCwKLQkJLm9wcyA9ICZzZHAzNDMwX3ZvaWNlX29wcywKKwkJLm9wcyA9ICZzZHAzNDMwX29wcywKIAl9LAogfTsKIApAQCAtMjg3LDYgKzIxNSwxMSBAQAogCS5uYW1lID0gIlNEUDM0MzAiLAogCS5kYWlfbGluayA9IHNkcDM0MzBfZGFpLAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHNkcDM0MzBfZGFpKSwKKworCS5kYXBtX3dpZGdldHMgPSBzZHAzNDMwX3R3bDQwMzBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzZHAzNDMwX3R3bDQwMzBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzZHAzNDMwX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9zZHA0NDMwLmMgYi9zb3VuZC9zb2Mvb21hcC9zZHA0NDMwLmMKaW5kZXggYjgwZWZiMC4uMDNkOWZhNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvc2RwNDQzMC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL3NkcDQ0MzAuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC90d2w2MDQwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC0zMiw3ICszMyw3IEBACiAjaW5jbHVkZSA8cGxhdC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAKLSNpbmNsdWRlICJtY3BkbS5oIgorI2luY2x1ZGUgIm9tYXAtbWNwZG0uaCIKICNpbmNsdWRlICJvbWFwLXBjbS5oIgogI2luY2x1ZGUgIi4uL2NvZGVjcy90d2w2MDQwLmgiCiAKQEAgLTg4LDcgKzg5LDcgQEAKIAlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9IUCgiSGVhZHNldCBTdGVyZW9waG9uZSIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9TUEsoIkVhcnBob25lIFNwayIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiQXV4L0ZNIFN0ZXJlbyBJbiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiRk0gU3RlcmVvIEluIiksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBbXSA9IHsKQEAgLTExMywzNiArMTE0LDIyIEBACiAJeyJFYXJwaG9uZSBTcGsiLCBOVUxMLCAiRVAifSwKIAogCS8qIEF1eC9GTSBTdGVyZW8gSW46IEFGTUwsIEFGTVIgKi8KLQl7IkFGTUwiLCBOVUxMLCAiQXV4L0ZNIFN0ZXJlbyBJbiJ9LAotCXsiQUZNUiIsIE5VTEwsICJBdXgvRk0gU3RlcmVvIEluIn0sCisJeyJBRk1MIiwgTlVMTCwgIkZNIFN0ZXJlbyBJbiJ9LAorCXsiQUZNUiIsIE5VTEwsICJGTSBTdGVyZW8gSW4ifSwKIH07CiAKIHN0YXRpYyBpbnQgc2RwNDQzMF90d2w2MDQwX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgcmV0OworCWludCByZXQsIGhzX3RyaW07CiAKLQkvKiBBZGQgU0RQNDQzMCBzcGVjaWZpYyB3aWRnZXRzICovCi0JcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBzZHA0NDMwX3R3bDYwNDBfZGFwbV93aWRnZXRzLAotCQkJCUFSUkFZX1NJWkUoc2RwNDQzMF90d2w2MDQwX2RhcG1fd2lkZ2V0cykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBTZXQgdXAgU0RQNDQzMCBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCS8qIFNEUDQ0MzAgY29ubmVjdGVkIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFGTUwiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQUZNUiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IFN0ZXJlb3Bob25lIik7Ci0KLQlyZXQgPSBzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCS8qCisJICogQ29uZmlndXJlIE1jUERNIG9mZnNldCBjYW5jZWxsYXRpb24gYmFzZWQgb24gdGhlIEhTT1RSSU0gdmFsdWUgZnJvbQorCSAqIHR3bDYwNDAuCisJICovCisJaHNfdHJpbSA9IHR3bDYwNDBfZ2V0X3RyaW1fdmFsdWUoY29kZWMsIFRXTDYwNDBfVFJJTV9IU09UUklNKTsKKwlvbWFwX21jcGRtX2NvbmZpZ3VyZV9kbl9vZmZzZXRzKHJ0ZCwgVFdMNjA0MF9IU0ZfVFJJTV9MRUZUKGhzX3RyaW0pLAorCQkJCQlUV0w2MDQwX0hTRl9UUklNX1JJR0hUKGhzX3RyaW0pKTsKIAogCS8qIEhlYWRzZXQgamFjayBkZXRlY3Rpb24gKi8KIAlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCBKYWNrIiwKQEAgLTE2NSw4ICsxNTIsOCBAQAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNkcDQ0MzBfZGFpID0gewogCS5uYW1lID0gIlRXTDYwNDAiLAogCS5zdHJlYW1fbmFtZSA9ICJUV0w2MDQwIiwKLQkuY3B1X2RhaV9uYW1lID0ib21hcC1tY3BkbS1kYWkiLAotCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w2MDQwLWhpZmkiLAorCS5jcHVfZGFpX25hbWUgPSAib21hcC1tY3BkbSIsCisJLmNvZGVjX2RhaV9uYW1lID0gInR3bDYwNDAtbGVnYWN5IiwKIAkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJLmNvZGVjX25hbWUgPSAidHdsNjA0MC1jb2RlYyIsCiAJLmluaXQgPSBzZHA0NDMwX3R3bDYwNDBfaW5pdCwKQEAgLTE3OCw2ICsxNjUsMTEgQEAKIAkubmFtZSA9ICJTRFA0NDMwIiwKIAkuZGFpX2xpbmsgPSAmc2RwNDQzMF9kYWksCiAJLm51bV9saW5rcyA9IDEsCisKKwkuZGFwbV93aWRnZXRzID0gc2RwNDQzMF90d2w2MDQwX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc2RwNDQzMF90d2w2MDQwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2RwNDQzMF9zbmRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvem9vbTIuYyBiL3NvdW5kL3NvYy9vbWFwL3pvb20yLmMKaW5kZXggOWEyNjY2Zi4uNzY0MWE3ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvem9vbTIuYworKysgYi9zb3VuZC9zb2Mvb21hcC96b29tMi5jCkBAIC0zMyw2ICszMyw3IEBACiAKIC8qIFJlZ2lzdGVyIGRlc2NyaXB0aW9ucyBmb3IgdHdsNDAzMCBjb2RlYyBwYXJ0ICovCiAjaW5jbHVkZSA8bGludXgvbWZkL3R3bDQwMzAtYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIm9tYXAtbWNic3AuaCIKICNpbmNsdWRlICJvbWFwLXBjbS5oIgpAQCAtNDQsMjkgKzQ1LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIDI2MDAwMDAwLAogCQkJCQlTTkRfU09DX0NMT0NLX0lOKTsKQEAgLTgyLDQ5ICs2Miw2IEBACiAJLmh3X3BhcmFtcyA9IHpvb20yX2h3X3BhcmFtcywKIH07CiAKLXN0YXRpYyBpbnQgem9vbTJfaHdfdm9pY2VfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcmV0OwotCi0JLyogU2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksCi0JCQkJU05EX1NPQ19EQUlGTVRfRFNQX0EgfAotCQkJCVNORF9TT0NfREFJRk1UX0lCX05GIHwKLQkJCQlTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCVNORF9TT0NfREFJRk1UX0RTUF9BIHwKLQkJCQlTTkRfU09DX0RBSUZNVF9JQl9ORiB8Ci0JCQkJU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgdGhlIGNvZGVjIHN5c3RlbSBjbG9jayBmb3IgREFDIGFuZCBBREMgKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgMjYwMDAwMDAsCi0JCQkJCVNORF9TT0NfQ0xPQ0tfSU4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIHN5c3RlbSBjbG9ja1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgem9vbTJfdm9pY2Vfb3BzID0gewotCS5od19wYXJhbXMgPSB6b29tMl9od192b2ljZV9wYXJhbXMsCi19OwotCiAvKiBab29tMiBtYWNoaW5lIERBUE0gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB6b29tMl90d2w0MDMwX2RhcG1fd2lkZ2V0c1tdID0gewogCVNORF9TT0NfREFQTV9NSUMoIkV4dCBNaWMiLCBOVUxMKSwKQEAgLTE2MiwyMyArOTksNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCByZXQ7Ci0KLQkvKiBBZGQgWm9vbTIgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgem9vbTJfdHdsNDAzMF9kYXBtX3dpZGdldHMsCi0JCQkJQVJSQVlfU0laRSh6b29tMl90d2w0MDMwX2RhcG1fd2lkZ2V0cykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBTZXQgdXAgWm9vbTIgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KLQkvKiBab29tMiBjb25uZWN0ZWQgcGlucyAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBTdGVyZW9waG9uZSIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBdXggSW4iKTsKIAogCS8qIFRXTDQwMzAgbm90IGNvbm5lY3RlZCBwaW5zICovCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQ0FSS0lUTUlDIik7CkBAIC0xOTAsOSArMTEwLDcgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJDQVJLSVRMIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQ0FSS0lUUiIpOwogCi0JcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHpvb20yX3R3bDQwMzBfdm9pY2VfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQpAQCAtMjE3LDYgKzEzNSw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCS5pbml0ID0gem9vbTJfdHdsNDAzMF9pbml0LAogCQkub3BzID0gJnpvb20yX29wcywKIAl9LApAQCAtMjI3LDggKzE0NywxMCBAQAogCQkuY29kZWNfZGFpX25hbWUgPSAidHdsNDAzMC12b2ljZSIsCiAJCS5wbGF0Zm9ybV9uYW1lID0gIm9tYXAtcGNtLWF1ZGlvIiwKIAkJLmNvZGVjX25hbWUgPSAidHdsNDAzMC1jb2RlYyIsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfRFNQX0EgfCBTTkRfU09DX0RBSUZNVF9JQl9ORiB8CisJCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCQkuaW5pdCA9IHpvb20yX3R3bDQwMzBfdm9pY2VfaW5pdCwKLQkJLm9wcyA9ICZ6b29tMl92b2ljZV9vcHMsCisJCS5vcHMgPSAmem9vbTJfb3BzLAogCX0sCiB9OwogCkBAIC0yMzcsNiArMTU5LDExIEBACiAJLm5hbWUgPSAiWm9vbTIiLAogCS5kYWlfbGluayA9IHpvb20yX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRSh6b29tMl9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IHpvb20yX3R3bDQwMzBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh6b29tMl90d2w0MDMwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqem9vbTJfc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvS2NvbmZpZyBiL3NvdW5kL3NvYy9weGEvS2NvbmZpZwppbmRleCAzM2ViYzQ2Li5mZmQyMjQyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL0tjb25maWcKKysrIGIvc291bmQvc29jL3B4YS9LY29uZmlnCkBAIC0xMjEsNiArMTIxLDcgQEAKIGNvbmZpZyBTTkRfU09DX1NBQVJCCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBNYXJ2ZWxsIFNhYXJiIgogCWRlcGVuZHMgb24gU05EX1BYQTJYWF9TT0MgJiYgTUFDSF9TQUFSQgorCXNlbGVjdCBNRkRfODhQTTg2MFgKIAlzZWxlY3QgU05EX1BYQV9TT0NfU1NQCiAJc2VsZWN0IFNORF9TT0NfODhQTTg2MFgKIAloZWxwCkBAIC0xMzAsNiArMTMxLDcgQEAKIGNvbmZpZyBTTkRfU09DX1RBVk9SRVZCMwogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgTWFydmVsbCBUYXZvciBFVkIzIgogCWRlcGVuZHMgb24gU05EX1BYQTJYWF9TT0MgJiYgTUFDSF9UQVZPUkVWQjMKKwlzZWxlY3QgTUZEXzg4UE04NjBYCiAJc2VsZWN0IFNORF9QWEFfU09DX1NTUAogCXNlbGVjdCBTTkRfU09DXzg4UE04NjBYCiAJaGVscApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9jb3JnaS5jIGIvc291bmQvc29jL3B4YS9jb3JnaS5jCmluZGV4IDI4NzU3ZmIuLmIwZTJmYjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvY29yZ2kuYworKysgYi9zb3VuZC9zb2MvcHhhL2NvcmdpLmMKQEAgLTI5OSw3ICsyOTksNiBAQAogCS8qIFNldCB1cCBjb3JnaSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwogCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2U3NDBfd205NzA1LmMgYi9zb3VuZC9zb2MvcHhhL2U3NDBfd205NzA1LmMKaW5kZXggZGM2NTY1MC4uMzVlZDdlYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9lNzQwX3dtOTcwNS5jCisrKyBiL3NvdW5kL3NvYy9weGEvZTc0MF93bTk3MDUuYwpAQCAtMTA4LDggKzEwOCw2IEBACiAKIAlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMgYi9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMKaW5kZXggNTE4OTdmYy4uY2U1ZjA1NjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvZTc1MF93bTk3MDUuYworKysgYi9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMKQEAgLTkwLDggKzkwLDYgQEAKIAogCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvZTgwMF93bTk3MTIuYyBiL3NvdW5kL3NvYy9weGEvZTgwMF93bTk3MTIuYwppbmRleCAwNTNlZDIwLi42YThmMzhiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2U4MDBfd205NzEyLmMKKysrIGIvc291bmQvc29jL3B4YS9lODAwX3dtOTcxMi5jCkBAIC04MCw3ICs4MCw2IEBACiAJCQkJCUFSUkFZX1NJWkUoZTgwMF9kYXBtX3dpZGdldHMpKTsKIAogCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jIGIvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jCmluZGV4IDY3ZGNjMzYuLmU3OWY1MTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvbWFnaWNpYW4uYworKysgYi9zb3VuZC9zb2MvcHhhL21hZ2ljaWFuLmMKQEAgLTkyLDExICs5MiwxMCBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQl1bnNpZ25lZCBpbnQgYWNwcywgYWNkcywgd2lkdGgsIHJhdGU7CisJdW5zaWduZWQgaW50IGFjcHMsIGFjZHMsIHdpZHRoOwogCXVuc2lnbmVkIGludCBkaXY0ID0gUFhBX1NTUF9DTEtfU0NEQl80OwogCWludCByZXQgPSAwOwogCi0JcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CiAJd2lkdGggPSBzbmRfcGNtX2Zvcm1hdF9waHlzaWNhbF93aWR0aChwYXJhbXNfZm9ybWF0KHBhcmFtcykpOwogCiAJLyoKQEAgLTQyNCw3ICs0MjMsNiBAQAogCS8qIFNldCB1cCBtYWdpY2lhbiBzcGVjaWZpYyBhdWRpbyBwYXRoIGludGVyY29ubmVjdHMgKi8KIAlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jIGIvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jCmluZGV4IDM4Y2E2NzUuLjBiOGQxZWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvbWlvYTcwMV93bTk3MTMuYworKysgYi9zb3VuZC9zb2MvcHhhL21pb2E3MDFfd205NzEzLmMKQEAgLTE1MSw3ICsxNTEsNiBAQAogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJGcm9udCBNaWMiKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgSW4iKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgT3V0Iik7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcGFsbTI3eC5jIGIvc291bmQvc29jL3B4YS9wYWxtMjd4LmMKaW5kZXggNTA0ZTQwMC4uN2VkYzFmYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9wYWxtMjd4LmMKKysrIGIvc291bmQvc29jL3B4YS9wYWxtMjd4LmMKQEAgLTEwNywxMCArMTA3LDYgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJQSE9ORSIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1JQzIiKTsKIAotCWVyciA9IHNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KIAkvKiBKYWNrIGRldGVjdGlvbiBBUEkgc3R1ZmYgKi8KIAllcnIgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLAogCQkJCVNORF9KQUNLX0hFQURQSE9ORSwgJmhzX2phY2spOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9wb29kbGUuYyBiL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMKaW5kZXggZGEzYWU0My4uNGMyOWJjMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9wb29kbGUuYworKysgYi9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCkBAIC0yNjUsNyArMjY1LDYgQEAKIAkvKiBTZXQgdXAgcG9vZGxlIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCiAJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5jIGIvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKaW5kZXggYzQzMDYwMC4uNjAwNjc2ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcmF1bWZlbGQuYyBiL3NvdW5kL3NvYy9weGEvcmF1bWZlbGQuYwppbmRleCAxYTU5MWYxLi5iODk5YTNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3JhdW1mZWxkLmMKKysrIGIvc291bmQvc29jL3B4YS9yYXVtZmVsZC5jCkBAIC0zMDYsOCArMzA2LDEwIEBACiAJCQkJICAgICAmc25kX3NvY19yYXVtZmVsZF9jb25uZWN0b3IpOwogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChyYXVtZmVsZF9hdWRpb19kZXZpY2UpOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCXBsYXRmb3JtX2RldmljZV9wdXQocmF1bWZlbGRfYXVkaW9fZGV2aWNlKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAlyYXVtZmVsZF9lbmFibGVfYXVkaW8odHJ1ZSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3NhYXJiLmMgYi9zb3VuZC9zb2MvcHhhL3NhYXJiLmMKaW5kZXggOTU5NTE4OS4uZDk0NjdhMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9zYWFyYi5jCisrKyBiL3NvdW5kL3NvYy9weGEvc2FhcmIuYwpAQCAtMTQ2LDEwICsxNDYsNiBAQAogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMgMiIpOwogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBTdGVyZW9waG9uZSIpOwogCi0JcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCS8qIEhlYWRzZXQgamFjayBkZXRlY3Rpb24gKi8KIAlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCBTTkRfSkFDS19IRUFEUEhPTkUKIAkJCXwgU05EX0pBQ0tfQlROXzAgfCBTTkRfSkFDS19CVE5fMSB8IFNORF9KQUNLX0JUTl8yLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9zcGl0ei5jIGIvc291bmQvc29jL3B4YS9zcGl0ei5jCmluZGV4IGIyNTNkODYuLmMyZDZmZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvc3BpdHouYworKysgYi9zb3VuZC9zb2MvcHhhL3NwaXR6LmMKQEAgLTMwMSw3ICszMDEsNiBAQAogCS8qIFNldCB1cCBzcGl0eiBzcGVjaWZpYyBhdWRpbyBwYXRocyAqLwogCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCXJldHVybiAwOwogfQogCkBAIC0zMTIsNyArMzExLDcgQEAKIAkuY3B1X2RhaV9uYW1lID0gInB4YTJ4eC1pMnMiLAogCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg3NTAtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAicHhhLXBjbS1hdWRpbyIsCi0JLmNvZGVjX25hbWUgPSAid204NzUwLWNvZGVjLjAtMDAxYiIsCisJLmNvZGVjX25hbWUgPSAid204NzUwLjAtMDAxYiIsCiAJLmluaXQgPSBzcGl0el93bTg3NTBfaW5pdCwKIAkub3BzID0gJnNwaXR6X29wcywKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3Rhdm9yZXZiMy5jIGIvc291bmQvc29jL3B4YS90YXZvcmV2YjMuYwppbmRleCBmODgxZjY1Li5lZWVjODkyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3Rhdm9yZXZiMy5jCisrKyBiL3NvdW5kL3NvYy9weGEvdGF2b3JldmIzLmMKQEAgLTE0NiwxMCArMTQ2LDYgQEAKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIDIiKTsKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgU3RlcmVvcGhvbmUiKTsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAkvKiBIZWFkc2V0IGphY2sgZGV0ZWN0aW9uICovCiAJc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgU05EX0pBQ0tfSEVBRFBIT05FCiAJCQl8IFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfCBTTkRfSkFDS19CVE5fMiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvdG9zYS5jIGIvc291bmQvc29jL3B4YS90b3NhLmMKaW5kZXggOWEyMzUxMy4uNjIwZmM2OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS90b3NhLmMKKysrIGIvc291bmQvc29jL3B4YS90b3NhLmMKQEAgLTIxMSw3ICsyMTEsNiBAQAogCS8qIHNldCB1cCB0b3NhIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCiAJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvejIuYyBiL3NvdW5kL3NvYy9weGEvejIuYwppbmRleCBkNjlkOWZjLi5iMzExZmZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3oyLmMKKysrIGIvc291bmQvc29jL3B4YS96Mi5jCkBAIC0xNjEsMTAgKzE2MSw2IEBACiAJLyogU2V0IHVwIHoyIHNwZWNpZmljIGF1ZGlvIHBhdGhzICovCiAJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCi0JcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KIAkvKiBKYWNrIGRldGVjdGlvbiBBUEkgc3R1ZmYgKi8KIAlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCBKYWNrIiwgU05EX0pBQ0tfSEVBRFNFVCwKIAkJCQkmaHNfamFjayk7CkBAIC0xOTgsNyArMTk0LDcgQEAKIAkuY3B1X2RhaV9uYW1lCT0gInB4YTJ4eC1pMnMiLAogCS5jb2RlY19kYWlfbmFtZQk9ICJ3bTg3NTAtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAicHhhLXBjbS1hdWRpbyIsCi0JLmNvZGVjX25hbWUJPSAid204NzUwLWNvZGVjLjAtMDAxYiIsCisJLmNvZGVjX25hbWUJPSAid204NzUwLjAtMDAxYiIsCiAJLmluaXQJCT0gejJfd204NzUwX2luaXQsCiAJLm9wcwkJPSAmejJfb3BzLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvenlsb25pdGUuYyBiL3NvdW5kL3NvYy9weGEvenlsb25pdGUuYwppbmRleCAyYjgzNTBiLi41ODBhYWUzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3p5bG9uaXRlLmMKKysrIGIvc291bmQvc29jL3B4YS96eWxvbml0ZS5jCkBAIC04Nyw3ICs4Nyw2IEBACiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEVhcnBpZWNlIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3M2MDAwL3M2MDAwLXBjbS5jIGIvc291bmQvc29jL3M2MDAwL3M2MDAwLXBjbS5jCmluZGV4IDgwYzg1ZmQ2Li41NWVmYzJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczYwMDAvczYwMDAtcGNtLmMKKysrIGIvc291bmQvc29jL3M2MDAwL3M2MDAwLXBjbS5jCkBAIC00NDYsNyArNDQ2LDYgQEAKIHN0YXRpYyBpbnQgczYwMDBfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydW50aW1lLT5jYXJkLT5zbmRfY2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ1bnRpbWUtPmNwdV9kYWk7CiAJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ1bnRpbWUtPnBjbTsKIAlzdHJ1Y3QgczYwMDBfcGNtX2RtYV9wYXJhbXMgKnBhcmFtczsKIAlpbnQgcmVzOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZyBiL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcKaW5kZXggNjVmOTgwZS4uNTNhYWE2OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCkBAIC02Myw3ICs2Myw5IEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU01ES19XTTg5OTQKIAl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBXTTg5OTQgb24gU01ESyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLVjMxMCB8fCBNQUNIX1NNREtDMjEwKQorCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIChNQUNIX1NNREtWMzEwIHx8IE1BQ0hfU01ES0MyMTAgfHwgTUFDSF9TTURLNDIxMikKKwlkZXBlbmRzIG9uIEkyQz15ICYmIEdFTkVSSUNfSEFSRElSUVMKKwlzZWxlY3QgTUZEX1dNODk5NAogCXNlbGVjdCBTTkRfU09DX1dNODk5NAogCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKIAloZWxwCkBAIC0xNTAsNyArMTUyLDkgQEAKIGNvbmZpZyBTTkRfU09DX0dPTklfQVFVSUxBX1dNODk5NAogCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIEFRVUlMQS9HT05JIC0gV004OTk0IgogCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIChNQUNIX0dPTkkgfHwgTUFDSF9BUVVJTEEpCisJZGVwZW5kcyBvbiBJMkM9eSAmJiBHRU5FUklDX0hBUkRJUlFTCiAJc2VsZWN0IFNORF9TQU1TVU5HX0kyUworCXNlbGVjdCBNRkRfV004OTk0CiAJc2VsZWN0IFNORF9TT0NfV004OTk0CiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBnb25pIG9yIGFxdWlsYQpAQCAtMTU4LDcgKzE2Miw3IEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU01ES19TUERJRgogCXRyaXN0YXRlICJTb0MgUy9QRElGIEF1ZGlvIHN1cHBvcnQgZm9yIFNNREsiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgKE1BQ0hfU01ES0MxMDAgfHwgTUFDSF9TTURLQzExMCB8fCBNQUNIX1NNREtWMjEwIHx8IE1BQ0hfU01ES1YzMTApCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgKE1BQ0hfU01ES0MxMDAgfHwgTUFDSF9TTURLQzExMCB8fCBNQUNIX1NNREtWMjEwIHx8IE1BQ0hfU01ES1YzMTAgfHwgTUFDSF9TTURLNDIxMikKIAlzZWxlY3QgU05EX1NBTVNVTkdfU1BESUYKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIFMvUERJRiBhdWRpbyBvbiB0aGUgU01ESy4KQEAgLTE3Myw3ICsxNzcsOSBAQAogCiBjb25maWcgU05EX1NPQ19TTURLX1dNODk5NF9QQ00KIAl0cmlzdGF0ZSAiU29DIFBDTSBBdWRpbyBzdXBwb3J0IGZvciBXTTg5OTQgb24gU01ESyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLQzIxMCB8fCBNQUNIX1NNREtWMzEwKQorCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIChNQUNIX1NNREtDMjEwIHx8IE1BQ0hfU01ES1YzMTAgfHwgTUFDSF9TTURLNDIxMikKKwlkZXBlbmRzIG9uIEkyQz15ICYmIEdFTkVSSUNfSEFSRElSUVMKKwlzZWxlY3QgTUZEX1dNODk5NAogCXNlbGVjdCBTTkRfU09DX1dNODk5NAogCXNlbGVjdCBTTkRfU0FNU1VOR19QQ00KIAloZWxwCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9hYzk3LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9hYzk3LmMKaW5kZXggZjk3MTEwZS4uMTY1MjFlMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2FjOTcuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogCkBAIC0yNzEsNyArMjcyLDEwIEBACiAKIAl3cml0ZWwoYWNfZ2xiY3RybCwgczNjX2FjOTcucmVncyArIFMzQ19BQzk3X0dMQkNUUkwpOwogCi0JczNjMjQxMF9kbWFfY3RybChkbWFfZGF0YS0+Y2hhbm5lbCwgUzNDMjQxMF9ETUFPUF9TVEFSVEVEKTsKKwlpZiAoIWRtYV9kYXRhLT5vcHMpCisJCWRtYV9kYXRhLT5vcHMgPSBzYW1zdW5nX2RtYV9nZXRfb3BzKCk7CisKKwlkbWFfZGF0YS0+b3BzLT5zdGFydGVkKGRtYV9kYXRhLT5jaGFubmVsKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzE3LDcgKzMyMSwxMCBAQAogCiAJd3JpdGVsKGFjX2dsYmN0cmwsIHMzY19hYzk3LnJlZ3MgKyBTM0NfQUM5N19HTEJDVFJMKTsKIAotCXMzYzI0MTBfZG1hX2N0cmwoZG1hX2RhdGEtPmNoYW5uZWwsIFMzQzI0MTBfRE1BT1BfU1RBUlRFRCk7CisJaWYgKCFkbWFfZGF0YS0+b3BzKQorCQlkbWFfZGF0YS0+b3BzID0gc2Ftc3VuZ19kbWFfZ2V0X29wcygpOworCisJZG1hX2RhdGEtPm9wcy0+c3RhcnRlZChkbWFfZGF0YS0+Y2hhbm5lbCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ0NCw3ICs0NTEsNyBAQAogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKGlycV9yZXMtPnN0YXJ0LCBzM2NfYWM5N19pcnEsCi0JCQkJCUlSUUZfRElTQUJMRUQsICJBQzk3IiwgTlVMTCk7CisJCQkJCTAsICJBQzk3IiwgTlVMTCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWM5NzogaW50ZXJydXB0IHJlcXVlc3QgZmFpbGVkLlxuIik7CiAJCWdvdG8gZXJyNDsKQEAgLTQ5NSw3ICs1MDIsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2NfYWM5N19kcml2ZXIgPSB7CiAJLnByb2JlICA9IHMzY19hYzk3X3Byb2JlLAotCS5yZW1vdmUgPSBzM2NfYWM5N19yZW1vdmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHMzY19hYzk3X3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAic2Ftc3VuZy1hYzk3IiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2RtYS5jCmluZGV4IDk0NjU1ODguLmE2OGIyNjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2RtYS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2RtYS5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTU0LDcgKzU1LDYgQEAKIAlzcGlubG9ja190IGxvY2s7CiAJaW50IHN0YXRlOwogCXVuc2lnbmVkIGludCBkbWFfbG9hZGVkOwotCXVuc2lnbmVkIGludCBkbWFfbGltaXQ7CiAJdW5zaWduZWQgaW50IGRtYV9wZXJpb2Q7CiAJZG1hX2FkZHJfdCBkbWFfc3RhcnQ7CiAJZG1hX2FkZHJfdCBkbWFfcG9zOwpAQCAtNjIsNzcgKzYyLDc5IEBACiAJc3RydWN0IHMzY19kbWFfcGFyYW1zICpwYXJhbXM7CiB9OwogCitzdGF0aWMgdm9pZCBhdWRpb19idWZmZG9uZSh2b2lkICpkYXRhKTsKKwogLyogZG1hX2VucXVldWUKICAqCiAgKiBwbGFjZSBhIGRtYSBidWZmZXIgb250byB0aGUgcXVldWUgZm9yIHRoZSBkbWEgc3lzdGVtCiAgKiB0byBoYW5kbGUuCi0qLworICovCiBzdGF0aWMgdm9pZCBkbWFfZW5xdWV1ZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QgcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJZG1hX2FkZHJfdCBwb3MgPSBwcnRkLT5kbWFfcG9zOwogCXVuc2lnbmVkIGludCBsaW1pdDsKLQlpbnQgcmV0OworCXN0cnVjdCBzYW1zdW5nX2RtYV9wcmVwX2luZm8gZG1hX2luZm87CiAKIAlwcl9kZWJ1ZygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCi0JaWYgKHMzY19kbWFfaGFzX2NpcmN1bGFyKCkpCi0JCWxpbWl0ID0gKHBydGQtPmRtYV9lbmQgLSBwcnRkLT5kbWFfc3RhcnQpIC8gcHJ0ZC0+ZG1hX3BlcmlvZDsKLQllbHNlCi0JCWxpbWl0ID0gcHJ0ZC0+ZG1hX2xpbWl0OworCWxpbWl0ID0gKHBydGQtPmRtYV9lbmQgLSBwcnRkLT5kbWFfc3RhcnQpIC8gcHJ0ZC0+ZG1hX3BlcmlvZDsKIAogCXByX2RlYnVnKCIlczogbG9hZGVkICVkLCBsaW1pdCAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgcHJ0ZC0+ZG1hX2xvYWRlZCwgbGltaXQpOwogCi0Jd2hpbGUgKHBydGQtPmRtYV9sb2FkZWQgPCBsaW1pdCkgewotCQl1bnNpZ25lZCBsb25nIGxlbiA9IHBydGQtPmRtYV9wZXJpb2Q7CisJZG1hX2luZm8uY2FwID0gKHNhbXN1bmdfZG1hX2hhc19jaXJjdWxhcigpID8gRE1BX0NZQ0xJQyA6IERNQV9TTEFWRSk7CisJZG1hX2luZm8uZGlyZWN0aW9uID0KKwkJKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sKKwkJPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfaW5mby5mcCA9IGF1ZGlvX2J1ZmZkb25lOworCWRtYV9pbmZvLmZwX3BhcmFtID0gc3Vic3RyZWFtOworCWRtYV9pbmZvLnBlcmlvZCA9IHBydGQtPmRtYV9wZXJpb2Q7CisJZG1hX2luZm8ubGVuID0gcHJ0ZC0+ZG1hX3BlcmlvZCpsaW1pdDsKIAorCXdoaWxlIChwcnRkLT5kbWFfbG9hZGVkIDwgbGltaXQpIHsKIAkJcHJfZGVidWcoImRtYV9sb2FkZWQ6ICVkXG4iLCBwcnRkLT5kbWFfbG9hZGVkKTsKIAotCQlpZiAoKHBvcyArIGxlbikgPiBwcnRkLT5kbWFfZW5kKSB7Ci0JCQlsZW4gID0gcHJ0ZC0+ZG1hX2VuZCAtIHBvczsKLQkJCXByX2RlYnVnKCIlczogY29ycmVjdGVkIGRtYSBsZW4gJWxkXG4iLCBfX2Z1bmNfXywgbGVuKTsKKwkJaWYgKChwb3MgKyBkbWFfaW5mby5wZXJpb2QpID4gcHJ0ZC0+ZG1hX2VuZCkgeworCQkJZG1hX2luZm8ucGVyaW9kICA9IHBydGQtPmRtYV9lbmQgLSBwb3M7CisJCQlwcl9kZWJ1ZygiJXM6IGNvcnJlY3RlZCBkbWEgbGVuICVsZFxuIiwKKwkJCQkJX19mdW5jX18sIGRtYV9pbmZvLnBlcmlvZCk7CiAJCX0KIAotCQlyZXQgPSBzM2MyNDEwX2RtYV9lbnF1ZXVlKHBydGQtPnBhcmFtcy0+Y2hhbm5lbCwKLQkJCXN1YnN0cmVhbSwgcG9zLCBsZW4pOworCQlkbWFfaW5mby5idWYgPSBwb3M7CisJCXBydGQtPnBhcmFtcy0+b3BzLT5wcmVwYXJlKHBydGQtPnBhcmFtcy0+Y2gsICZkbWFfaW5mbyk7CiAKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlwcnRkLT5kbWFfbG9hZGVkKys7Ci0JCQlwb3MgKz0gcHJ0ZC0+ZG1hX3BlcmlvZDsKLQkJCWlmIChwb3MgPj0gcHJ0ZC0+ZG1hX2VuZCkKLQkJCQlwb3MgPSBwcnRkLT5kbWFfc3RhcnQ7Ci0JCX0gZWxzZQotCQkJYnJlYWs7CisJCXBydGQtPmRtYV9sb2FkZWQrKzsKKwkJcG9zICs9IHBydGQtPmRtYV9wZXJpb2Q7CisJCWlmIChwb3MgPj0gcHJ0ZC0+ZG1hX2VuZCkKKwkJCXBvcyA9IHBydGQtPmRtYV9zdGFydDsKIAl9CiAKIAlwcnRkLT5kbWFfcG9zID0gcG9zOwogfQogCi1zdGF0aWMgdm9pZCBhdWRpb19idWZmZG9uZShzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbm5lbCwKLQkJCQl2b2lkICpkZXZfaWQsIGludCBzaXplLAotCQkJCWVudW0gczNjMjQxMF9kbWFfYnVmZnJlc3VsdCByZXN1bHQpCitzdGF0aWMgdm9pZCBhdWRpb19idWZmZG9uZSh2b2lkICpkYXRhKQogewotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gZGV2X2lkOwotCXN0cnVjdCBydW50aW1lX2RhdGEgKnBydGQ7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBkYXRhOworCXN0cnVjdCBydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAogCXByX2RlYnVnKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAocmVzdWx0ID09IFMzQzI0MTBfUkVTX0FCT1JUIHx8IHJlc3VsdCA9PSBTM0MyNDEwX1JFU19FUlIpCi0JCXJldHVybjsKKwlpZiAocHJ0ZC0+c3RhdGUgJiBTVF9SVU5OSU5HKSB7CisJCXBydGQtPmRtYV9wb3MgKz0gcHJ0ZC0+ZG1hX3BlcmlvZDsKKwkJaWYgKHBydGQtPmRtYV9wb3MgPj0gcHJ0ZC0+ZG1hX2VuZCkKKwkJCXBydGQtPmRtYV9wb3MgPSBwcnRkLT5kbWFfc3RhcnQ7CiAKLQlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJCWlmIChzdWJzdHJlYW0pCisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CiAKLQlpZiAoc3Vic3RyZWFtKQotCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0KLQlzcGluX2xvY2soJnBydGQtPmxvY2spOwotCWlmIChwcnRkLT5zdGF0ZSAmIFNUX1JVTk5JTkcgJiYgIXMzY19kbWFfaGFzX2NpcmN1bGFyKCkpIHsKLQkJcHJ0ZC0+ZG1hX2xvYWRlZC0tOwotCQlkbWFfZW5xdWV1ZShzdWJzdHJlYW0pOworCQlzcGluX2xvY2soJnBydGQtPmxvY2spOworCQlpZiAoIXNhbXN1bmdfZG1hX2hhc19jaXJjdWxhcigpKSB7CisJCQlwcnRkLT5kbWFfbG9hZGVkLS07CisJCQlkbWFfZW5xdWV1ZShzdWJzdHJlYW0pOworCQl9CisJCXNwaW5fdW5sb2NrKCZwcnRkLT5sb2NrKTsKIAl9Ci0KLQlzcGluX3VubG9jaygmcHJ0ZC0+bG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgZG1hX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKQEAgLTE0NCw4ICsxNDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgdG90Ynl0ZXMgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyk7CiAJc3RydWN0IHMzY19kbWFfcGFyYW1zICpkbWEgPQogCQlzbmRfc29jX2RhaV9nZXRfZG1hX2RhdGEocnRkLT5jcHVfZGFpLCBzdWJzdHJlYW0pOwotCWludCByZXQgPSAwOwotCisJc3RydWN0IHNhbXN1bmdfZG1hX2luZm8gZG1hX2luZm87CiAKIAlwcl9kZWJ1ZygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCkBAIC0xNjMsMzAgKzE2NCwyNiBAQAogCQlwcl9kZWJ1ZygicGFyYW1zICVwLCBjbGllbnQgJXAsIGNoYW5uZWwgJWRcbiIsIHBydGQtPnBhcmFtcywKIAkJCXBydGQtPnBhcmFtcy0+Y2xpZW50LCBwcnRkLT5wYXJhbXMtPmNoYW5uZWwpOwogCi0JCXJldCA9IHMzYzI0MTBfZG1hX3JlcXVlc3QocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCQkgIHBydGQtPnBhcmFtcy0+Y2xpZW50LCBOVUxMKTsKKwkJcHJ0ZC0+cGFyYW1zLT5vcHMgPSBzYW1zdW5nX2RtYV9nZXRfb3BzKCk7CiAKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGdldCBkbWEgY2hhbm5lbFxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLyogdXNlIHRoZSBjaXJjdWxhciBidWZmZXJpbmcgaWYgd2UgaGF2ZSBpdCBhdmFpbGFibGUuICovCi0JCWlmIChzM2NfZG1hX2hhc19jaXJjdWxhcigpKQotCQkJczNjMjQxMF9kbWFfc2V0ZmxhZ3MocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCQkgICAgIFMzQzI0MTBfRE1BRl9DSVJDVUxBUik7CisJCWRtYV9pbmZvLmNhcCA9IChzYW1zdW5nX2RtYV9oYXNfY2lyY3VsYXIoKSA/CisJCQlETUFfQ1lDTElDIDogRE1BX1NMQVZFKTsKKwkJZG1hX2luZm8uY2xpZW50ID0gcHJ0ZC0+cGFyYW1zLT5jbGllbnQ7CisJCWRtYV9pbmZvLmRpcmVjdGlvbiA9CisJCQkoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSworCQkJPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwkJZG1hX2luZm8ud2lkdGggPSBwcnRkLT5wYXJhbXMtPmRtYV9zaXplOworCQlkbWFfaW5mby5maWZvID0gcHJ0ZC0+cGFyYW1zLT5kbWFfYWRkcjsKKwkJcHJ0ZC0+cGFyYW1zLT5jaCA9IHBydGQtPnBhcmFtcy0+b3BzLT5yZXF1ZXN0KAorCQkJCXBydGQtPnBhcmFtcy0+Y2hhbm5lbCwgJmRtYV9pbmZvKTsKIAl9CiAKLQlzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4ocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCSAgICBhdWRpb19idWZmZG9uZSk7Ci0KIAlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOwogCiAJcnVudGltZS0+ZG1hX2J5dGVzID0gdG90Ynl0ZXM7CiAKIAlzcGluX2xvY2tfaXJxKCZwcnRkLT5sb2NrKTsKIAlwcnRkLT5kbWFfbG9hZGVkID0gMDsKLQlwcnRkLT5kbWFfbGltaXQgPSBydW50aW1lLT5ody5wZXJpb2RzX21pbjsKIAlwcnRkLT5kbWFfcGVyaW9kID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhwYXJhbXMpOwogCXBydGQtPmRtYV9zdGFydCA9IHJ1bnRpbWUtPmRtYV9hZGRyOwogCXBydGQtPmRtYV9wb3MgPSBwcnRkLT5kbWFfc3RhcnQ7CkBAIC0yMDIsMTEgKzE5OSwxMiBAQAogCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAotCS8qIFRPRE8gLSBkbyB3ZSBuZWVkIHRvIGVuc3VyZSBETUEgZmx1c2hlZCAqLwogCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgTlVMTCk7CiAKIAlpZiAocHJ0ZC0+cGFyYW1zKSB7Ci0JCXMzYzI0MTBfZG1hX2ZyZWUocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLCBwcnRkLT5wYXJhbXMtPmNsaWVudCk7CisJCXBydGQtPnBhcmFtcy0+b3BzLT5mbHVzaChwcnRkLT5wYXJhbXMtPmNoKTsKKwkJcHJ0ZC0+cGFyYW1zLT5vcHMtPnJlbGVhc2UocHJ0ZC0+cGFyYW1zLT5jaCwKKwkJCQkJcHJ0ZC0+cGFyYW1zLT5jbGllbnQpOwogCQlwcnRkLT5wYXJhbXMgPSBOVUxMOwogCX0KIApAQCAtMjI1LDIzICsyMjMsOSBAQAogCWlmICghcHJ0ZC0+cGFyYW1zKQogCQlyZXR1cm4gMDsKIAotCS8qIGNoYW5uZWwgbmVlZHMgY29uZmlndXJpbmcgZm9yIG1lbT0+ZGV2aWNlLCBpbmNyZW1lbnQgbWVtb3J5IGFkZHIsCi0JICogc3luYyB0byBwY2xrLCBoYWxmLXdvcmQgdHJhbnNmZXJzIHRvIHRoZSBJSVMtRklGTy4gKi8KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlzM2MyNDEwX2RtYV9kZXZjb25maWcocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCSAgICAgIFMzQzI0MTBfRE1BU1JDX01FTSwKLQkJCQkgICAgICBwcnRkLT5wYXJhbXMtPmRtYV9hZGRyKTsKLQl9IGVsc2UgewotCQlzM2MyNDEwX2RtYV9kZXZjb25maWcocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCSAgICAgIFMzQzI0MTBfRE1BU1JDX0hXLAotCQkJCSAgICAgIHBydGQtPnBhcmFtcy0+ZG1hX2FkZHIpOwotCX0KLQotCXMzYzI0MTBfZG1hX2NvbmZpZyhwcnRkLT5wYXJhbXMtPmNoYW5uZWwsCi0JCQkgICBwcnRkLT5wYXJhbXMtPmRtYV9zaXplKTsKLQogCS8qIGZsdXNoIHRoZSBETUEgY2hhbm5lbCAqLwotCXMzYzI0MTBfZG1hX2N0cmwocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLCBTM0MyNDEwX0RNQU9QX0ZMVVNIKTsKKwlwcnRkLT5wYXJhbXMtPm9wcy0+Zmx1c2gocHJ0ZC0+cGFyYW1zLT5jaCk7CisKIAlwcnRkLT5kbWFfbG9hZGVkID0gMDsKIAlwcnRkLT5kbWFfcG9zID0gcHJ0ZC0+ZG1hX3N0YXJ0OwogCkBAIC0yNjUsMTQgKzI0OSwxNCBAQAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAkJcHJ0ZC0+c3RhdGUgfD0gU1RfUlVOTklORzsKLQkJczNjMjQxMF9kbWFfY3RybChwcnRkLT5wYXJhbXMtPmNoYW5uZWwsIFMzQzI0MTBfRE1BT1BfU1RBUlQpOworCQlwcnRkLT5wYXJhbXMtPm9wcy0+dHJpZ2dlcihwcnRkLT5wYXJhbXMtPmNoKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKIAkJcHJ0ZC0+c3RhdGUgJj0gflNUX1JVTk5JTkc7Ci0JCXMzYzI0MTBfZG1hX2N0cmwocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLCBTM0MyNDEwX0RNQU9QX1NUT1ApOworCQlwcnRkLT5wYXJhbXMtPm9wcy0+c3RvcChwcnRkLT5wYXJhbXMtPmNoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjkxLDIxICsyNzUsMTIgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgbG9uZyByZXM7Ci0JZG1hX2FkZHJfdCBzcmMsIGRzdDsKIAogCXByX2RlYnVnKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlzcGluX2xvY2soJnBydGQtPmxvY2spOwotCXMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKHBydGQtPnBhcmFtcy0+Y2hhbm5lbCwgJnNyYywgJmRzdCk7CisJcmVzID0gcHJ0ZC0+ZG1hX3BvcyAtIHBydGQtPmRtYV9zdGFydDsKIAotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJlcyA9IGRzdCAtIHBydGQtPmRtYV9zdGFydDsKLQllbHNlCi0JCXJlcyA9IHNyYyAtIHBydGQtPmRtYV9zdGFydDsKLQotCXNwaW5fdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQotCXByX2RlYnVnKCJQb2ludGVyICV4ICV4XG4iLCBzcmMsIGRzdCk7CisJcHJfZGVidWcoIlBvaW50ZXIgb2Zmc2V0OiAlbHVcbiIsIHJlcyk7CiAKIAkvKiB3ZSBzZWVtIHRvIGJlIGdldHRpbmcgdGhlIG9kZCBlcnJvciBmcm9tIHRoZSBwY20gbGlicmFyeSBkdWUKIAkgKiB0byBvdXQtb2YtYm91bmRzIHBvaW50ZXJzLiB0aGlzIGlzIG1heWJlIGR1ZSB0byB0aGUgZG1hIGVuZ2luZQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvZG1hLmggYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaAppbmRleCBjNTA2NTkyLi43ZDFlYWQ3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaApAQCAtNiw3ICs2LDcgQEAKICAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKICAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKLSAqICBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBTYW1zdW5nIFMzQzI0eHggQ1BVCisgKiAgQUxTQSBQQ00gaW50ZXJmYWNlIGZvciB0aGUgU2Ftc3VuZyBTb0MKICAqLwogCiAjaWZuZGVmIF9TM0NfQVVESU9fSApAQCAtMTcsNiArMTcsOCBAQAogCWludCBjaGFubmVsOwkJCQkvKiBDaGFubmVsIElEICovCiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAlpbnQgZG1hX3NpemU7CQkJLyogU2l6ZSBvZiB0aGUgRE1BIHRyYW5zZmVyICovCisJdW5zaWduZWQgY2g7CisJc3RydWN0IHNhbXN1bmdfZG1hX29wcyAqb3BzOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9nb25pX3dtODk5NC5jIGIvc291bmQvc29jL3NhbXN1bmcvZ29uaV93bTg5OTQuYwppbmRleCBlYjZkNzJlLi44NGY5YzNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9nb25pX3dtODk5NC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2dvbmlfd204OTk0LmMKQEAgLTExLDYgKzExLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KIApAQCAtOTksMTQgKzEwMCw2IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKLQkvKiBhZGQgZ29uaSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBnb25pX2RhcG1fd2lkZ2V0cywKLQkJCUFSUkFZX1NJWkUoZ29uaV9kYXBtX3dpZGdldHMpKTsKLQotCS8qIHNldCB1cCBnb25pIHNwZWNpZmljIGF1ZGlvIHJvdXRlcyAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGdvbmlfZGFwbV9yb3V0ZXMsCi0JCQlBUlJBWV9TSVpFKGdvbmlfZGFwbV9yb3V0ZXMpKTsKLQogCS8qIHNldCBlbmRwb2ludHMgdG8gbm90IGNvbm5lY3RlZCAqLwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIklOMkxQOlZYUk4iKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJJTjJSUDpWWFJQIik7CkBAIC0xMjAsOCArMTEzLDYgQEAKIAkJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiU1BLT1VUUlAiKTsKIAl9CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCS8qIEhlYWRzZXQgamFjayBkZXRlY3Rpb24gKi8KIAlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCBKYWNrIiwKIAkJCVNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19NRUNIQU5JQ0FMIHwgU05EX0pBQ0tfQVZPVVQsCkBAIC0yNTUsNiArMjQ2LDExIEBACiAJLm5hbWUgPSAiZ29uaSIsCiAJLmRhaV9saW5rID0gZ29uaV9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoZ29uaV9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IGdvbmlfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShnb25pX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gZ29uaV9kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShnb25pX2RhcG1fcm91dGVzKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGdvbmlfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jIGIvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jCmluZGV4IGM2YzY1ODkuLjAzY2ZhNWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2gxOTQwX3VkYTEzODAuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgpAQCAtMTgyLDI0ICsxODMsMTAgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGVycjsKIAotCS8qIEFkZCBoMTk0MCBzcGVjaWZpYyB3aWRnZXRzICovCi0JZXJyID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB1ZGExMzgwX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3dpZGdldHMpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogU2V0IHVwIGgxOTQwIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwbmVjdHMgKi8KLQllcnIgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsCi0JCQkJICAgICAgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgU05EX0pBQ0tfSEVBRFBIT05FLAogCQkmaHBfamFjayk7CiAKQEAgLTIzMCw2ICsyMTcsMTEgQEAKIAkubmFtZSA9ICJoMTk0MCIsCiAJLmRhaV9saW5rID0gaDE5NDBfdWRhMTM4MF9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoaDE5NDBfdWRhMTM4MF9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IHVkYTEzODBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBoMTk0MF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCmluZGV4IGMwODZiNzguLmJmZjQyYmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0xMTM2LDcgKzExMzcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzYW1zdW5nX2kyc19kcml2ZXIgPSB7CiAJLnByb2JlICA9IHNhbXN1bmdfaTJzX3Byb2JlLAotCS5yZW1vdmUgPSBzYW1zdW5nX2kyc19yZW1vdmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNhbXN1bmdfaTJzX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAic2Ftc3VuZy1pMnMiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2lkbWEuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2lkbWEuYwppbmRleCBlYmRlMDc0Li5jNDExNzhlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9pZG1hLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaWRtYS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvaml2ZV93bTg3NTAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2ppdmVfd204NzUwLmMKaW5kZXggMTRlYjZlYS4uMTgyNmFjZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvaml2ZV93bTg3NTAuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9qaXZlX3dtODc1MC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0xMTAsMTggKzExMSw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiT1VUMyIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1PTk8iKTsKIAotCS8qIEFkZCBqaXZlIHNwZWNpZmljIHdpZGdldHMgKi8KLQllcnIgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODc1MF9kYXBtX3dpZGdldHMsCi0JCQkJCUFSUkFZX1NJWkUod204NzUwX2RhcG1fd2lkZ2V0cykpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFkZCB3aWRnZXRzICglZClcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMxLDcgKzEyMCw3IEBACiAJLmNwdV9kYWlfbmFtZQk9ICJzM2MyNDEyLWkycyIsCiAJLmNvZGVjX2RhaV9uYW1lID0gIndtODc1MC1oaWZpIiwKIAkucGxhdGZvcm1fbmFtZQk9ICJzYW1zdW5nLWF1ZGlvIiwKLQkuY29kZWNfbmFtZQk9ICJ3bTg3NTAtY29kZWMuMC0wMDFhIiwKKwkuY29kZWNfbmFtZQk9ICJ3bTg3NTAuMC0wMDFhIiwKIAkuaW5pdAkJPSBqaXZlX3dtODc1MF9pbml0LAogCS5vcHMJCT0gJmppdmVfb3BzLAogfTsKQEAgLTE0MSw2ICsxMzAsMTEgQEAKIAkubmFtZQkJPSAiSml2ZSIsCiAJLmRhaV9saW5rCT0gJmppdmVfZGFpLAogCS5udW1fbGlua3MJPSAxLAorCisJLmRhcG1fd2lkZ3RldHMJPSB3bTg3NTBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3NTBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpqaXZlX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9sbjI0NDBzYmNfYWxjNjUwLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9sbjI0NDBzYmNfYWxjNjUwLmMKaW5kZXggYmQ5MWMxOS4uY2RlMzhiOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvbG4yNDQwc2JjX2FsYzY1MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2xuMjQ0MHNiY19hbGM2NTAuYwpAQCAtMTYsNiArMTYsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGxuMjQ0MHNiYzsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9uZW8xOTczX3dtODc1My5jCmluZGV4IDE2MTUyZWQuLjcyMDcxODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvbmVvMTk3M193bTg3NTMuYwpAQCAtMzY3LDggKzM2Nyw2IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwOSw4ICs0MDcsNiBAQAogCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGFuZHNldCBTcGsiKTsKIAlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhlYWRwaG9uZSIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvcGNtLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYwppbmRleCA5YzdlOGI0Li4wNWE0N2NmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTYyNCw3ICs2MjUsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2NfcGNtX2RyaXZlciA9IHsKIAkucHJvYmUgID0gczNjX3BjbV9kZXZfcHJvYmUsCi0JLnJlbW92ZSA9IHMzY19wY21fZGV2X3JlbW92ZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoczNjX3BjbV9kZXZfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJzYW1zdW5nLXBjbSIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3J4MTk1MF91ZGExMzgwLmMKaW5kZXggYmM4YzE2Ny4uNzFiNGMwMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KQEAgLTkwLDEyICs5MSw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHJ4MTk1MF9hc29jID0gewotCS5uYW1lID0gInJ4MTk1MCIsCi0JLmRhaV9saW5rID0gcngxOTUwX3VkYTEzODBfZGFpLAotCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHJ4MTk1MF91ZGExMzgwX2RhaSksCi19OwotCiAvKiByeDE5NTAgbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB1ZGExMzgwX2RhcG1fd2lkZ2V0c1tdID0gewogCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIEphY2siLCBOVUxMKSwKQEAgLTExNyw2ICsxMTIsMTcgQEAKIAl7IlZJTk0iLCBOVUxMLCAiTWljIEphY2sifSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHJ4MTk1MF9hc29jID0geworCS5uYW1lID0gInJ4MTk1MCIsCisJLmRhaV9saW5rID0gcngxOTUwX3VkYTEzODBfZGFpLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHJ4MTk1MF91ZGExMzgwX2RhaSksCisKKwkuZGFwbV93aWRnZXRzID0gdWRhMTM4MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzM2MyNHh4X3NuZF9kZXZpY2U7CiAKIHN0YXRpYyBpbnQgcngxOTUwX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC0yMjAsMjYgKzIyNiwxMCBAQAogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgZXJyOwogCi0JLyogQWRkIHJ4MTk1MCBzcGVjaWZpYyB3aWRnZXRzICovCi0JZXJyID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB1ZGExMzgwX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3dpZGdldHMpKTsKLQotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBTZXQgdXAgcngxOTUwIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwbmVjdHMgKi8KLQllcnIgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsCi0JCQkJICAgICAgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCBTTkRfSkFDS19IRUFEUEhPTkUsCiAJCSZocF9qYWNrKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jCmluZGV4IDUyMDc0YTJiLi43YTczMzgwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJzLXYyLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNDEyLWkycy5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuYwppbmRleCA4NDFhYjE0Li43YmJlYzI1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNDEyLWkycy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0MTItaTJzLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTY5LDEwICs3MCwxMCBAQAogCXMzYzI0MTJfaTJzLmRtYV9wbGF5YmFjayA9ICZzM2MyNDEyX2kyc19wY21fc3RlcmVvX291dDsKIAogCXMzYzI0MTJfaTJzLmlpc19jY2xrID0gY2xrX2dldChkYWktPmRldiwgImkyc2NsayIpOwotCWlmIChzM2MyNDEyX2kycy5paXNfY2NsayA9PSBOVUxMKSB7CisJaWYgKElTX0VSUihzM2MyNDEyX2kycy5paXNfY2NsaykpIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gZ2V0IGkyc2NsayBjbG9ja1xuIik7CiAJCWlvdW5tYXAoczNjMjQxMl9pMnMucmVncyk7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gUFRSX0VSUihzM2MyNDEyX2kycy5paXNfY2Nsayk7CiAJfQogCiAJLyogU2V0IE1QTEwgYXMgdGhlIHNvdXJjZSBmb3IgSUlTIENMSyAqLwpAQCAtMTc2LDcgKzE3Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0MTJfaWlzX2RyaXZlciA9IHsKIAkucHJvYmUgID0gczNjMjQxMl9paXNfZGV2X3Byb2JlLAotCS5yZW1vdmUgPSBzM2MyNDEyX2lpc19kZXZfcmVtb3ZlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzM2MyNDEyX2lpc19kZXZfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJzM2MyNDEyLWlpcyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eC1pMnMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHgtaTJzLmMKaW5kZXggNjNkODg0OS4uNTU4YzY0YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eC1pMnMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4LWkycy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0zODMsMTAgKzM4NCwxMCBAQAogCQlyZXR1cm4gLUVOWElPOwogCiAJczNjMjR4eF9pMnMuaWlzX2NsayA9IGNsa19nZXQoZGFpLT5kZXYsICJpaXMiKTsKLQlpZiAoczNjMjR4eF9pMnMuaWlzX2NsayA9PSBOVUxMKSB7CisJaWYgKElTX0VSUihzM2MyNHh4X2kycy5paXNfY2xrKSkgewogCQlwcl9lcnIoImZhaWxlZCB0byBnZXQgaWlzX2Nsb2NrXG4iKTsKIAkJaW91bm1hcChzM2MyNHh4X2kycy5yZWdzKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiBQVFJfRVJSKHMzYzI0eHhfaTJzLmlpc19jbGspOwogCX0KIAljbGtfZW5hYmxlKHMzYzI0eHhfaTJzLmlpc19jbGspOwogCkBAIC00ODEsNyArNDgyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjR4eF9paXNfZHJpdmVyID0gewogCS5wcm9iZSAgPSBzM2MyNHh4X2lpc19kZXZfcHJvYmUsCi0JLnJlbW92ZSA9IHMzYzI0eHhfaWlzX2Rldl9yZW1vdmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHMzYzI0eHhfaWlzX2Rldl9yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInMzYzI0eHgtaWlzIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlYy5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWMuYwppbmRleCAzNDk1NjZmLi5hMjUzYmNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlYy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjLmMKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIApAQCAtMzAwLDcgKzMwMSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLWludCBzaW10ZWNfYXVkaW9fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc2ltdGVjX2F1ZGlvX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc2ltdGVjX2NhbGxfc3RhcnR1cChwZGF0YSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlY19oZXJtZXMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjX2hlcm1lcy5jCmluZGV4IGNlNmFlZjYuLmQxMjVlNzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjX2hlcm1lcy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjX2hlcm1lcy5jCkBAIC03LDYgKzcsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKICNpbmNsdWRlICJzM2MyNHh4X3NpbXRlYy5oIgpAQCAtNjUsMTggKzY2LDEyIEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGRhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBiYXNlX21hcCwgQVJSQVlfU0laRShiYXNlX21hcCkpOwotCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmUgSW4iKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBPdXQiKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAogCXNpbXRlY19hdWRpb19pbml0KHJ0ZCk7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk2LDYgKzkxLDExIEBACiAJLm5hbWUJCT0gIlNpbXRlYy1IZXJtZXMiLAogCS5kYWlfbGluawk9ICZzaW10ZWNfZGFpX2FpYzMzLAogCS5udW1fbGlua3MJPSAxLAorCisJLmRhcG1fd2lkZ2V0cwk9IGRhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJPSBiYXNlX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShiYXNlX21hcCksCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzaW10ZWNfYXVkaW9faGVybWVzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWNfdGx2MzIwYWljMjMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjX3RsdjMyMGFpYzIzLmMKaW5kZXggYTdlZjdkYi4uNWU0ZmQ0NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWNfdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlY190bHYzMjBhaWMyMy5jCkBAIC03LDYgKzcsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKICNpbmNsdWRlICJzM2MyNHh4X3NpbXRlYy5oIgpAQCAtNTQsMTggKzU1LDEyIEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGRhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBiYXNlX21hcCwgQVJSQVlfU0laRShiYXNlX21hcCkpOwotCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmUgSW4iKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBPdXQiKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAogCXNpbXRlY19hdWRpb19pbml0KHJ0ZCk7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg1LDYgKzgwLDExIEBACiAJLm5hbWUJCT0gIlNpbXRlYyIsCiAJLmRhaV9saW5rCT0gJnNpbXRlY19kYWlfYWljMjMsCiAJLm51bV9saW5rcwk9IDEsCisKKwkuZGFwbV93aWRnZXRzCT0gZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShkYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcwk9IGJhc2VfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJhc2VfbWFwKSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNpbXRlY19hdWRpb190bHYzMjBhaWMyM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfdWRhMTM0eC5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKaW5kZXggZGM5ZDU1MS4uNTQ4YzZhYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3MzYzI0eHhfdWRhMTM0eC5oPgpAQCAtNjYsMTcgKzY3LDE3IEBACiAJcHJfZGVidWcoIiVzICVkXG4iLCBfX2Z1bmNfXywgY2xrX3VzZXJzKTsKIAlpZiAoY2xrX3VzZXJzID09IDApIHsKIAkJeHRhbCA9IGNsa19nZXQoJnMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlLT5kZXYsICJ4dGFsIik7Ci0JCWlmICgheHRhbCkgeworCQlpZiAoSVNfRVJSKHh0YWwpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzIGNhbm5vdCBnZXQgeHRhbFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVCVVNZOworCQkJcmV0ID0gUFRSX0VSUih4dGFsKTsKIAkJfSBlbHNlIHsKIAkJCXBjbGsgPSBjbGtfZ2V0KCZzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZS0+ZGV2LAogCQkJCSAgICAgICAicGNsayIpOwotCQkJaWYgKCFwY2xrKSB7CisJCQlpZiAoSVNfRVJSKHBjbGspKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3QgZ2V0IHBjbGtcbiIsCiAJCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCQljbGtfcHV0KHh0YWwpOwotCQkJCXJldCA9IC1FQlVTWTsKKwkJCQlyZXQgPSBQVFJfRVJSKHBjbGspOwogCQkJfQogCQl9CiAJCWlmICghcmV0KSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWFydHFfd204OTg3LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWFydHFfd204OTg3LmMKaW5kZXggMGEyYzRmMi4uYTIyZmM0NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21hcnRxX3dtODk4Ny5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtYXJ0cV93bTg5ODcuYwpAQCAtMTQsNiArMTQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CkBAIC0xNTMsMjAgKzE1NCw2IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCBlcnIgPSAwOwogCi0JLyogQWRkIFNtYXJ0USBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5ODdfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh3bTg5ODdfZGFwbV93aWRnZXRzKSk7Ci0KLQkvKiBhZGQgU21hcnRRIHNwZWNpZmljIGNvbnRyb2xzICovCi0JZXJyID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODk4N19zbWFydHFfY29udHJvbHMsCi0JCQkJICAgQVJSQVlfU0laRSh3bTg5ODdfc21hcnRxX2NvbnRyb2xzKSk7Ci0KLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIHNldHVwIFNtYXJ0USBzcGVjaWZpYyBhdWRpbyBwYXRoICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCiAJLyogc2V0IGVuZHBvaW50cyB0byBub3QgY29ubmVjdGVkICovCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElOUFVUMSIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlJJTlBVVDEiKTsKQEAgLTE3OCwxMCArMTY1LDYgQEAKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSW50ZXJuYWwgTWljIik7CiAJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCi0JZXJyID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCS8qIEhlYWRwaG9uZSBqYWNrIGRldGVjdGlvbiAqLwogCWVyciA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkcGhvbmUgSmFjayIsCiAJCQkgICAgICAgU05EX0pBQ0tfSEVBRFBIT05FLCAmc21hcnRxX2phY2spOwpAQCAtMjA3LDcgKzE5MCw3IEBACiAJCS5jcHVfZGFpX25hbWUJPSAic2Ftc3VuZy1pMnMuMCIsCiAJCS5jb2RlY19kYWlfbmFtZQk9ICJ3bTg3NTAtaGlmaSIsCiAJCS5wbGF0Zm9ybV9uYW1lCT0gInNhbXN1bmctYXVkaW8iLAotCQkuY29kZWNfbmFtZQk9ICJ3bTg3NTAtY29kZWMuMC0weDFhIiwKKwkJLmNvZGVjX25hbWUJPSAid204NzUwLjAtMHgxYSIsCiAJCS5pbml0CQk9IHNtYXJ0cV93bTg5ODdfaW5pdCwKIAkJLm9wcwkJPSAmc21hcnRxX2hpZmlfb3BzLAogCX0sCkBAIC0yMTcsNiArMjAwLDEzIEBACiAJLm5hbWUgPSAiU21hcnRRIiwKIAkuZGFpX2xpbmsgPSBzbWFydHFfZGFpLAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHNtYXJ0cV9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IHdtODk4N19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk4N19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAorCS5jb250cm9scyA9IHdtODk4N19zbWFydHFfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTg3X3NtYXJ0cV9jb250cm9scyksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21hcnRxX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3NwZGlmLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3NwZGlmLmMKaW5kZXggZThhYzk2MS4uZTBmZDhhZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21ka19zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfc3BkaWYuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODU4MC5jIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODAuYwppbmRleCAzZDI2ZjY2Li44MWI0NDc4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODU4MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAKQEAgLTExOSwzMCArMTIwLDI0IEBACiB9OwogCiAvKiBTTURLIFBsYXliYWNrIHdpZGdldHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg1ODBfZGFwbV93aWRnZXRzX3Bia1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHNtZGtfd204NTgwX2RhcG1fd2lkZ2V0c1tdID0gewogCVNORF9TT0NfREFQTV9IUCgiRnJvbnQiLCBOVUxMKSwKIAlTTkRfU09DX0RBUE1fSFAoIkNlbnRlcitTdWIiLCBOVUxMKSwKIAlTTkRfU09DX0RBUE1fSFAoIlJlYXIiLCBOVUxMKSwKLX07CiAKLS8qIFNNREsgQ2FwdHVyZSB3aWRnZXRzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204NTgwX2RhcG1fd2lkZ2V0c19jcHRbXSA9IHsKIAlTTkRfU09DX0RBUE1fTUlDKCJNaWNJbiIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lSW4iLCBOVUxMKSwKIH07CiAKIC8qIFNNREstUEFJRlRYIGNvbm5lY3Rpb25zICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBfdHhbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHNtZGtfd204NTgwX2F1ZGlvX21hcFtdID0gewogCS8qIE1pY0luIGZlZWRzIEFJTkwgKi8KIAl7IkFJTkwiLCBOVUxMLCAiTWljSW4ifSwKIAogCS8qIExpbmVJbiBmZWVkcyBBSU5ML1IgKi8KIAl7IkFJTkwiLCBOVUxMLCAiTGluZUluIn0sCiAJeyJBSU5SIiwgTlVMTCwgIkxpbmVJbiJ9LAotfTsKIAotLyogU01ESy1QQUlGUlggY29ubmVjdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcF9yeFtdID0gewogCS8qIEZyb250IExlZnQvUmlnaHQgYXJlIGZlZCBWT1VUMUwvUiAqLwogCXsiRnJvbnQiLCBOVUxMLCAiVk9VVDFMIn0sCiAJeyJGcm9udCIsIE5VTEwsICJWT1VUMVIifSwKQEAgLTE2MSwzOSArMTU2LDExIEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQkvKiBBZGQgc21kayBzcGVjaWZpYyBDYXB0dXJlIHdpZGdldHMgKi8KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODU4MF9kYXBtX3dpZGdldHNfY3B0LAotCQkJCSAgQVJSQVlfU0laRSh3bTg1ODBfZGFwbV93aWRnZXRzX2NwdCkpOwotCi0JLyogU2V0IHVwIFBBSUZUWCBhdWRpbyBwYXRoICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwX3R4LCBBUlJBWV9TSVpFKGF1ZGlvX21hcF90eCkpOwotCiAJLyogRW5hYmxpbmcgdGhlIG1pY3JvcGhvbmUgcmVxdWlyZXMgdGhlIGZpdHRpbmcgb2YgYSAwUgogCSAqIHJlc2lzdG9yIHRvIGNvbm5lY3QgdGhlIGxpbmUgZnJvbSB0aGUgbWljcm9waG9uZSBqYWNrLgogCSAqLwogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljSW4iKTsKIAotCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNtZGtfd204NTgwX2luaXRfcGFpZnJ4KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQkvKiBBZGQgc21kayBzcGVjaWZpYyBQbGF5YmFjayB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg1ODBfZGFwbV93aWRnZXRzX3BiaywKLQkJCQkgIEFSUkFZX1NJWkUod204NTgwX2RhcG1fd2lkZ2V0c19wYmspKTsKLQotCS8qIFNldCB1cCBQQUlGUlggYXVkaW8gcGF0aCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcF9yeCwgQVJSQVlfU0laRShhdWRpb19tYXBfcngpKTsKLQotCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0yMTAsOCArMTc3LDcgQEAKIAkJLmNwdV9kYWlfbmFtZSA9ICJzYW1zdW5nLWkycy4wIiwKIAkJLmNvZGVjX2RhaV9uYW1lID0gIndtODU4MC1oaWZpLXBsYXliYWNrIiwKIAkJLnBsYXRmb3JtX25hbWUgPSAic2Ftc3VuZy1hdWRpbyIsCi0JCS5jb2RlY19uYW1lID0gIndtODU4MC1jb2RlYy4wLTAwMWIiLAotCQkuaW5pdCA9IHNtZGtfd204NTgwX2luaXRfcGFpZnJ4LAorCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAuMC0wMDFiIiwKIAkJLm9wcyA9ICZzbWRrX29wcywKIAl9LAogCVtQUklfQ0FQVFVSRV0gPSB7IC8qIFByaW1hcnkgQ2FwdHVyZSBpL2YgKi8KQEAgLTIyMCw3ICsxODYsNyBAQAogCQkuY3B1X2RhaV9uYW1lID0gInNhbXN1bmctaTJzLjAiLAogCQkuY29kZWNfZGFpX25hbWUgPSAid204NTgwLWhpZmktY2FwdHVyZSIsCiAJCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAotCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAtY29kZWMuMC0wMDFiIiwKKwkJLmNvZGVjX25hbWUgPSAid204NTgwLjAtMDAxYiIsCiAJCS5pbml0ID0gc21ka193bTg1ODBfaW5pdF9wYWlmdHgsCiAJCS5vcHMgPSAmc21ka19vcHMsCiAJfSwKQEAgLTIzMCw4ICsxOTYsNyBAQAogCQkuY3B1X2RhaV9uYW1lID0gInNhbXN1bmctaTJzLngiLAogCQkuY29kZWNfZGFpX25hbWUgPSAid204NTgwLWhpZmktcGxheWJhY2siLAogCQkucGxhdGZvcm1fbmFtZSA9ICJzYW1zdW5nLWF1ZGlvIiwKLQkJLmNvZGVjX25hbWUgPSAid204NTgwLWNvZGVjLjAtMDAxYiIsCi0JCS5pbml0ID0gc21ka193bTg1ODBfaW5pdF9wYWlmcngsCisJCS5jb2RlY19uYW1lID0gIndtODU4MC4wLTAwMWIiLAogCQkub3BzID0gJnNtZGtfb3BzLAogCX0sCiB9OwpAQCAtMjQwLDYgKzIwNSwxMSBAQAogCS5uYW1lID0gIlNNREstSTJTIiwKIAkuZGFpX2xpbmsgPSBzbWRrX2RhaSwKIAkubnVtX2xpbmtzID0gMiwKKworCS5kYXBtX3dpZGdldHMgPSBzbWRrX3dtODU4MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHNtZGtfd204NTgwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gc21ka193bTg1ODBfYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNtZGtfd204NTgwX2F1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21ka19zbmRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODBwY20uYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwcGNtLmMKaW5kZXggMGQxMjA5Mi4uMDY3NzQ3MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODBwY20uYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODU4MHBjbS5jCkBAIC04LDYgKzgsNyBAQAogICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgogICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC0xMjcsNyArMTI4LDcgQEAKIAkJLmNwdV9kYWlfbmFtZSA9ICJzYW1zdW5nLXBjbS4wIiwKIAkJLmNvZGVjX2RhaV9uYW1lID0gIndtODU4MC1oaWZpLXBsYXliYWNrIiwKIAkJLnBsYXRmb3JtX25hbWUgPSAic2Ftc3VuZy1hdWRpbyIsCi0JCS5jb2RlY19uYW1lID0gIndtODU4MC1jb2RlYy4wLTAwMWIiLAorCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAuMC0wMDFiIiwKIAkJLm9wcyA9ICZzbWRrX3dtODU4MF9wY21fb3BzLAogCX0sIHsKIAkJLm5hbWUgPSAiV004NTgwIFBBSUYgUENNIFRYIiwKQEAgLTEzNSw3ICsxMzYsNyBAQAogCQkuY3B1X2RhaV9uYW1lID0gInNhbXN1bmctcGNtLjAiLAogCQkuY29kZWNfZGFpX25hbWUgPSAid204NTgwLWhpZmktY2FwdHVyZSIsCiAJCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAotCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAtY29kZWMuMC0wMDFiIiwKKwkJLmNvZGVjX25hbWUgPSAid204NTgwLjAtMDAxYiIsCiAJCS5vcHMgPSAmc21ka193bTg1ODBfcGNtX29wcywKIAl9LAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NC5jCmluZGV4IDQ1ZmJlMmIuLmY3NWU0MzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYwpAQCAtMTE3LDggKzExNyw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSU4xUlAiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJJTjJSUDpWWFJQIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTRwY20uYwppbmRleCA1ZjIxMTE2Li5kYTljMmEyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0cGNtLmMKQEAgLTksNiArOSw3IEBACiAgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd205NzEzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtOTcxMy5jCmluZGV4IGZmZmUzYzEuLjMxYzZkYWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd205NzEzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTk3MTMuYwpAQCAtMTEsNiArMTEsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNtZGs7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jIGIvc291bmQvc29jL3NhbXN1bmcvc3BkaWYuYwppbmRleCAyOGM0OTFkLi40NjhjZmYxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZGlmLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0zNDAsNyArMzQxLDcgQEAKIAkuc2h1dGRvd24JPSBzcGRpZl9zaHV0ZG93biwKIH07CiAKLXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgc2Ftc3VuZ19zcGRpZl9kYWkgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzYW1zdW5nX3NwZGlmX2RhaSA9IHsKIAkubmFtZSA9ICJzYW1zdW5nLXNwZGlmIiwKIAkucGxheWJhY2sgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJTL1BESUYgUGxheWJhY2siLApAQCAtNDc1LDcgKzQ3Niw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNhbXN1bmdfc3BkaWZfZHJpdmVyID0gewogCS5wcm9iZQk9IHNwZGlmX3Byb2JlLAotCS5yZW1vdmUJPSBzcGRpZl9yZW1vdmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHNwZGlmX3JlbW92ZSksCiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJPSAic2Ftc3VuZy1zcGRpZiIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc3BleXNpZGUuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlLmMKaW5kZXggNTkwZTkyNy4uODViZjU0MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc3BleXNpZGUuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGV5c2lkZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vY29kZWNzL3dtODk5Ni5oIgogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTkwODEuaCIKQEAgLTEyNSwxMCArMTI2LDYgQEAKIAkJLnBpbiA9ICJIZWFkc2V0IE1pYyIsCiAJCS5tYXNrID0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKIAl9LAotCXsKLQkJLnBpbiA9ICJIZWFkcGhvbmUiLAotCQkubWFzayA9IFNORF9KQUNLX0hFQURQSE9ORSwKLQl9LAogfTsKIAogLyogRGVmYXVsdCB0aGUgaGVhZHBob25lIHNlbGVjdGlvbiB0byBhY3RpdmUgaGlnaCAqLwpAQCAtMTcxLDcgKzE2OCw4IEBACiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFdNODk5Nl9IUFNFTF9HUElPLCBzcGV5c2lkZV9qYWNrX3BvbGFyaXR5KTsKIAogCXJldCA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkc2V0IiwKLQkJCSAgICAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzAsCisJCQkgICAgICAgU05EX0pBQ0tfTElORU9VVCB8IFNORF9KQUNLX0hFQURTRVQgfAorCQkJICAgICAgIFNORF9KQUNLX0JUTl8wLAogCQkJICAgICAgICZzcGV5c2lkZV9oZWFkc2V0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMjI3LDcgKzIyNSw3IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORU9VVCIpOwogCiAJLyogQXQgYW55IHRpbWUgdGhlIFdNOTA4MSBpcyBhY3RpdmUgaXQgd2lsbCBoYXZlIHRoaXMgY2xvY2sgKi8KLQlyZXR1cm4gc25kX3NvY19jb2RlY19zZXRfc3lzY2xrKGRhcG0tPmNvZGVjLCBXTTkwODFfU1lTQ0xLX01DTEssCisJcmV0dXJuIHNuZF9zb2NfY29kZWNfc2V0X3N5c2NsayhkYXBtLT5jb2RlYywgV005MDgxX1NZU0NMS19NQ0xLLCAwLAogCQkJCQk0ODAwMCAqIDI1NiwgMCk7CiB9CiAKQEAgLTI1Miw2ICsyNTAsNyBAQAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIk1haW4gQU1JQyIpLAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIldNMTI1MCBJbnB1dCIpLAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIldNMTI1MCBPdXRwdXQiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3aWRnZXRzW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGV5c2lkZV93bTg5NjIuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlX3dtODk2Mi5jCmluZGV4IDcyNTM1ZjIuLmUzZTI3MTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlX3dtODk2Mi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlX3dtODk2Mi5jCkBAIC0xMyw5ICsxMywxMiBAQAogI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg5NjIuaCIKIAorc3RhdGljIGludCBzYW1wbGVfcmF0ZSA9IDQ0MTAwOworCiBzdGF0aWMgaW50IHNwZXlzaWRlX3dtODk2Ml9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAogCQkJCQkgIHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAkJCQkJICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKQEAgLTMxLDEzICszNCwxMyBAQAogCQlpZiAoZGFwbS0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgewogCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIFdNODk2Ml9GTEwsCiAJCQkJCQkgIFdNODk2Ml9GTExfTUNMSywgMzI3NjgsCi0JCQkJCQkgIDQ0MTAwICogMjU2KTsKKwkJCQkJCSAgc2FtcGxlX3JhdGUgKiA1MTIpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcHJfZXJyKCJGYWlsZWQgdG8gc3RhcnQgRkxMOiAlZFxuIiwgcmV0KTsKIAogCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksCiAJCQkJCQkgICAgIFdNODk2Ml9TWVNDTEtfRkxMLAotCQkJCQkJICAgICA0NDEwMCAqIDI1NiwKKwkJCQkJCSAgICAgc2FtcGxlX3JhdGUgKiA1MTIsCiAJCQkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgU1lTQ0xLOiAlZFxuIiwgcmV0KTsKQEAgLTkyLDIyICs5NSw3IEBACiBzdGF0aWMgaW50IHNwZXlzaWRlX3dtODk2Ml9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMKLQkJCQkJIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYKLQkJCQkJIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUwotCQkJCQkgfCBTTkRfU09DX0RBSUZNVF9OQl9ORgotCQkJCQkgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlzYW1wbGVfcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNCwxMiArMTEyLDE1IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg5NjIiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJzYW1zdW5nLWF1ZGlvIiwKIAkJLmNvZGVjX25hbWUgPSAid204OTYyLjEtMDAxYSIsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYKKwkJCQl8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCS5vcHMgPSAmc3BleXNpZGVfd204OTYyX29wcywKIAl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNvbnRyb2xzW10gPSB7CiAJU09DX0RBUE1fUElOX1NXSVRDSCgiTWFpbiBTcGVha2VyIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiRE1JQyIpLAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdpZGdldHNbXSA9IHsKQEAgLTEzNyw2ICsxMjgsNyBAQAogCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCiAKIAlTTkRfU09DX0RBUE1fTUlDKCJETUlDIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQU1JQyIsIE5VTEwpLAogCiAJU05EX1NPQ19EQVBNX1NQSygiTWFpbiBTcGVha2VyIiwgTlVMTCksCiB9OwpAQCAtMTQ4LDEyICsxNDAsMTYgQEAKIAl7ICJNYWluIFNwZWFrZXIiLCBOVUxMLCAiU1BLT1VUTCIgfSwKIAl7ICJNYWluIFNwZWFrZXIiLCBOVUxMLCAiU1BLT1VUUiIgfSwKIAotCXsgIk1JQ0JJQVMiLCBOVUxMLCAiSGVhZHNldCBNaWMiIH0sCi0JeyAiSU40TCIsIE5VTEwsICJNSUNCSUFTIiB9LAotCXsgIklONFIiLCBOVUxMLCAiTUlDQklBUyIgfSwKKwl7ICJIZWFkc2V0IE1pYyIsIE5VTEwsICJNSUNCSUFTIiB9LAorCXsgIklONEwiLCBOVUxMLCAiSGVhZHNldCBNaWMiIH0sCisJeyAiSU40UiIsIE5VTEwsICJIZWFkc2V0IE1pYyIgfSwKIAotCXsgIk1JQ0JJQVMiLCBOVUxMLCAiRE1JQyIgfSwKLQl7ICJETUlDREFUIiwgTlVMTCwgIk1JQ0JJQVMiIH0sCisJeyAiQU1JQyIsIE5VTEwsICJNSUNCSUFTIiB9LAorCXsgIklOMUwiLCBOVUxMLCAiQU1JQyIgfSwKKwl7ICJJTjFSIiwgTlVMTCwgIkFNSUMiIH0sCisKKwl7ICJETUlDIiwgTlVMTCwgIk1JQ0JJQVMiIH0sCisJeyAiRE1JQ0RBVCIsIE5VTEwsICJETUlDIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2sgc3BleXNpZGVfd204OTYyX2hlYWRzZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvZnNpLWFrNDY0Mi5jIGIvc291bmQvc29jL3NoL2ZzaS1hazQ2NDIuYwppbmRleCA3NzBhNzFhLi5kZmY2NGI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvZnNpLWFrNDY0Mi5jCisrKyBiL3NvdW5kL3NvYy9zaC9mc2ktYWs0NjQyLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc2hfZnNpLmg+CiAKIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS1kYTcyMTAuYyBiL3NvdW5kL3NvYy9zaC9mc2ktZGE3MjEwLmMKaW5kZXggNTk1NTNmZC4uZjU1ODZiNWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9mc2ktZGE3MjEwLmMKKysrIGIvc291bmQvc29jL3NoL2ZzaS1kYTcyMTAuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9zaF9mc2kuaD4KIAogc3RhdGljIGludCBmc2lfZGE3MjEwX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9mc2ktaGRtaS5jIGIvc291bmQvc29jL3NoL2ZzaS1oZG1pLmMKaW5kZXggZDNkOWZkOC4uM2ViZWJlNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL2ZzaS1oZG1pLmMKKysrIGIvc291bmQvc29jL3NoL2ZzaS1oZG1pLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc2hfZnNpLmg+CiAKIHN0cnVjdCBmc2lfaGRtaV9kYXRhIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9mc2kuYyBiL3NvdW5kL3NvYy9zaC9mc2kuYwppbmRleCA4ZTExMmNjLi4zZDcwMTZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvZnNpLmMKKysrIGIvc291bmQvc29jL3NoL2ZzaS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3NoX2ZzaS5oPgogCkBAIC0yMTAsNyArMjExLDcgQEAKICAqCQliYXNpYyByZWFkIHdyaXRlIGZ1bmN0aW9uCiAgKi8KIAotc3RhdGljIHZvaWQgX19mc2lfcmVnX3dyaXRlKHUzMiByZWcsIHUzMiBkYXRhKQorc3RhdGljIHZvaWQgX19mc2lfcmVnX3dyaXRlKHUzMiBfX2lvbWVtICpyZWcsIHUzMiBkYXRhKQogewogCS8qIHZhbGlkIGRhdGEgYXJlYSBpcyAyNGJpdCAqLwogCWRhdGEgJj0gMHgwMGZmZmZmZjsKQEAgLTIxOCwxMiArMjE5LDEyIEBACiAJX19yYXdfd3JpdGVsKGRhdGEsIHJlZyk7CiB9CiAKLXN0YXRpYyB1MzIgX19mc2lfcmVnX3JlYWQodTMyIHJlZykKK3N0YXRpYyB1MzIgX19mc2lfcmVnX3JlYWQodTMyIF9faW9tZW0gKnJlZykKIHsKIAlyZXR1cm4gX19yYXdfcmVhZGwocmVnKTsKIH0KIAotc3RhdGljIHZvaWQgX19mc2lfcmVnX21hc2tfc2V0KHUzMiByZWcsIHUzMiBtYXNrLCB1MzIgZGF0YSkKK3N0YXRpYyB2b2lkIF9fZnNpX3JlZ19tYXNrX3NldCh1MzIgX19pb21lbSAqcmVnLCB1MzIgbWFzaywgdTMyIGRhdGEpCiB7CiAJdTMyIHZhbCA9IF9fZnNpX3JlZ19yZWFkKHJlZyk7CiAKQEAgLTI1MCw3ICsyNTEsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVyLT5sb2NrLCBmbGFncyk7Ci0JcmV0ID0gX19mc2lfcmVnX3JlYWQoKHUzMikobWFzdGVyLT5iYXNlICsgcmVnKSk7CisJcmV0ID0gX19mc2lfcmVnX3JlYWQobWFzdGVyLT5iYXNlICsgcmVnKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CkBAIC0yNjQsNyArMjY1LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1hc3Rlci0+bG9jaywgZmxhZ3MpOwotCV9fZnNpX3JlZ19tYXNrX3NldCgodTMyKShtYXN0ZXItPmJhc2UgKyByZWcpLCBtYXNrLCBkYXRhKTsKKwlfX2ZzaV9yZWdfbWFza19zZXQobWFzdGVyLT5iYXNlICsgcmVnLCBtYXNrLCBkYXRhKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTI4NSw3ICsxMjg2LDcgQEAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbWFzdGVyKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgJmZzaV9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCAmZnNpX2ludGVycnVwdCwgMCwKIAkJCSAgaWRfZW50cnktPm5hbWUsIG1hc3Rlcik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpcnEgcmVxdWVzdCBlcnJcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3NoNzc2MC1hYzk3LmMgYi9zb3VuZC9zb2Mvc2gvc2g3NzYwLWFjOTcuYwppbmRleCA5MTdkM2NlLi5jNjJhZTY4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvc2g3NzYwLWFjOTcuYworKysgYi9zb3VuZC9zb2Mvc2gvc2g3NzYwLWFjOTcuYwpAQCAtMjAsMTIgKzIwLDYgQEAKIGV4dGVybiBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHNoNF9oYWNfZGFpWzJdOwogZXh0ZXJuIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBzaDc3NjBfc29jX3BsYXRmb3JtOwogCi1zdGF0aWMgaW50IG1hY2hpbmVfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXNuZF9zb2NfZGFwbV9zeW5jKCZydGQtPmNvZGVjLT5kYXBtKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNoNzc2MF9hYzk3X2RhaSA9IHsKIAkubmFtZSA9ICJBQzk3IiwKIAkuc3RyZWFtX25hbWUgPSAiQUM5NyBIaUZpIiwKQEAgLTMzLDcgKzI3LDYgQEAKIAkuY29kZWNfZGFpX25hbWUgPSAiYWM5Ny1oaWZpIiwKIAkucGxhdGZvcm1fbmFtZSA9ICJzaDc3NjAtcGNtLWF1ZGlvIiwKIAkuY29kZWNfbmFtZSA9ICJhYzk3LWNvZGVjIiwKLQkuaW5pdCA9IG1hY2hpbmVfaW5pdCwKIAkub3BzID0gTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9zaXVfZGFpLmMgYi9zb3VuZC9zb2Mvc2gvc2l1X2RhaS5jCmluZGV4IDQ5NzNjMjkuLmVkYWNmZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9zaXVfZGFpLmMKKysrIGIvc291bmQvc29jL3NoL3NpdV9kYWkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9zaXUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9zc2kuYyBiL3NvdW5kL3NvYy9zaC9zc2kuYwppbmRleCAwNTE5MmQ5Li5lMGM2MjFjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvc3NpLmMKKysrIGIvc291bmQvc29jL3NoL3NzaS5jCkBAIC0zNDIsNyArMzQyLDcgQEAKIAkuc2V0X2ZtdAk9IHNzaV9zZXRfZm10LAogfTsKIAotc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzaDRfc3NpX2RhaVtdID0geworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgc2g0X3NzaV9kYWlbXSA9IHsKIHsKIAkubmFtZQkJCT0gInNzaS1kYWkuMCIsCiAJLnBsYXliYWNrID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jYWNoZS5jIGIvc291bmQvc29jL3NvYy1jYWNoZS5jCmluZGV4IDIwYjdmM2IuLjkwNzdhYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY2FjaGUuYworKysgYi9zb3VuZC9zb2Mvc29jLWNhY2hlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sem8uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9hc29jLmg+CiAKQEAgLTU0OCw5ICs1NDksNiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBzbmRfc29jX2x6b19nZXRfYmxrc2l6ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyICpjb2RlY19kcnY7Ci0KLQljb2RlY19kcnYgPSBjb2RlYy0+ZHJpdmVyOwogCXJldHVybiBESVZfUk9VTkRfVVAoY29kZWMtPnJlZ19zaXplLCBzbmRfc29jX2x6b19ibG9ja19jb3VudCgpKTsKIH0KIApAQCAtODY4LDEwICs4NjYsNiBAQAogCiBzdGF0aWMgaW50IHNuZF9zb2NfZmxhdF9jYWNoZV9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQljb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgKmNvZGVjX2RydjsKLQotCWNvZGVjX2RydiA9IGNvZGVjLT5kcml2ZXI7Ci0KIAlpZiAoY29kZWMtPnJlZ19kZWZfY29weSkKIAkJY29kZWMtPnJlZ19jYWNoZSA9IGttZW1kdXAoY29kZWMtPnJlZ19kZWZfY29weSwKIAkJCQkJICAgY29kZWMtPnJlZ19zaXplLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY29yZS5jIGIvc291bmQvc29jL3NvYy1jb3JlLmMKaW5kZXggZWY2OWY1YS4uYTVkMzY4NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1jb3JlLmMKKysrIGIvc291bmQvc29jL3NvYy1jb3JlLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCWlmICh3b3Jkc2l6ZSArIHJlZ3NpemUgKyAyICsgMSAhPSBsZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gc25kX3NvY19yZWFkKGNvZGVjICwgcmVnKTsKKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZyk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWVtc2V0KHJlZ2J1ZiwgJ1gnLCByZWdzaXplKTsKIAkJcmVnYnVmW3JlZ3NpemVdID0gJ1wwJzsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCQlzdGVwID0gY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3N0ZXA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemU7IGkgKz0gc3RlcCkgewotCQlpZiAoY29kZWMtPnJlYWRhYmxlX3JlZ2lzdGVyICYmICFjb2RlYy0+cmVhZGFibGVfcmVnaXN0ZXIoY29kZWMsIGkpKQorCQlpZiAoIXNuZF9zb2NfY29kZWNfcmVhZGFibGVfcmVnaXN0ZXIoY29kZWMsIGkpKQogCQkJY29udGludWU7CiAJCWlmIChjb2RlYy0+ZHJpdmVyLT5kaXNwbGF5X3JlZ2lzdGVyKSB7CiAJCQljb3VudCArPSBjb2RlYy0+ZHJpdmVyLT5kaXNwbGF5X3JlZ2lzdGVyKGNvZGVjLCBidWYgKyBjb3VudCwKQEAgLTI0NSw3ICsyNDUsNiBAQAogCXNpemVfdCBidWZfc2l6ZTsKIAljaGFyICpzdGFydCA9IGJ1ZjsKIAl1bnNpZ25lZCBsb25nIHJlZywgdmFsdWU7Ci0JaW50IHN0ZXAgPSAxOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCWJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZiktMSkpOwpAQCAtMjUzLDkgKzI1Miw2IEBACiAJCXJldHVybiAtRUZBVUxUOwogCWJ1ZltidWZfc2l6ZV0gPSAwOwogCi0JaWYgKGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zdGVwKQotCQlzdGVwID0gY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3N0ZXA7Ci0KIAl3aGlsZSAoKnN0YXJ0ID09ICcgJykKIAkJc3RhcnQrKzsKIAlyZWcgPSBzaW1wbGVfc3RydG91bChzdGFydCwgJnN0YXJ0LCAxNik7CkBAIC05NTcsNiArOTUzLDggQEAKIAkJc25kX3NvY19kYXBtX25ld19jb250cm9scygmY29kZWMtPmRhcG0sIGRyaXZlci0+ZGFwbV93aWRnZXRzLAogCQkJCQkgIGRyaXZlci0+bnVtX2RhcG1fd2lkZ2V0cyk7CiAKKwljb2RlYy0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gZHJpdmVyLT5pZGxlX2JpYXNfb2ZmOworCiAJaWYgKGRyaXZlci0+cHJvYmUpIHsKIAkJcmV0ID0gZHJpdmVyLT5wcm9iZShjb2RlYyk7CiAJCWlmIChyZXQgPCAwKSB7CkBAIC0xMDU3LDYgKzEwNTUsOSBAQAogCX0KIAlydGQtPmNhcmQgPSBjYXJkOwogCisJLyogTWFrZSBzdXJlIGFsbCBEQVBNIHdpZGdldHMgYXJlIGluc3RhbnRpYXRlZCAqLworCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cygmY29kZWMtPmRhcG0pOworCiAJLyogbWFjaGluZSBjb250cm9scywgcm91dGVzIGFuZCB3aWRnZXRzIGFyZSBub3QgcHJlZml4ZWQgKi8KIAl0ZW1wID0gY29kZWMtPm5hbWVfcHJlZml4OwogCWNvZGVjLT5uYW1lX3ByZWZpeCA9IE5VTEw7CkBAIC0xMDcyLDkgKzEwNzMsNiBAQAogCX0KIAljb2RlYy0+bmFtZV9wcmVmaXggPSB0ZW1wOwogCi0JLyogTWFrZSBzdXJlIGFsbCBEQVBNIHdpZGdldHMgYXJlIGluc3RhbnRpYXRlZCAqLwotCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cygmY29kZWMtPmRhcG0pOwotCiAJLyogcmVnaXN0ZXIgdGhlIHJ0ZCBkZXZpY2UgKi8KIAlydGQtPmNvZGVjID0gY29kZWM7CiAJcnRkLT5kZXYucGFyZW50ID0gY2FyZC0+ZGV2OwpAQCAtMTMxOSw2ICsxMzE3LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CiAJc3RydWN0IHNuZF9zb2NfY29kZWNfY29uZiAqY29kZWNfY29uZjsKIAllbnVtIHNuZF9zb2NfY29tcHJlc3NfdHlwZSBjb21wcmVzc190eXBlOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKIAlpbnQgcmV0LCBpLCBvcmRlcjsKIAogCW11dGV4X2xvY2soJmNhcmQtPm11dGV4KTsKQEAgLTE0MzEsNiArMTQzMCwyOCBAQAogCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmY2FyZC0+ZGFwbSwgY2FyZC0+ZGFwbV9yb3V0ZXMsCiAJCQkJCWNhcmQtPm51bV9kYXBtX3JvdXRlcyk7CiAKKwlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoJmNhcmQtPmRhcG0pOworCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9saW5rczsgaSsrKSB7CisJCWRhaV9saW5rID0gJmNhcmQtPmRhaV9saW5rW2ldOworCisJCWlmIChkYWlfbGluay0+ZGFpX2ZtdCkgeworCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjYXJkLT5ydGRbaV0uY29kZWNfZGFpLAorCQkJCQkJICBkYWlfbGluay0+ZGFpX2ZtdCk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZGV2X3dhcm4oY2FyZC0+cnRkW2ldLmNvZGVjX2RhaS0+ZGV2LAorCQkJCQkgIkZhaWxlZCB0byBzZXQgREFJIGZvcm1hdDogJWRcbiIsCisJCQkJCSByZXQpOworCisJCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNhcmQtPnJ0ZFtpXS5jcHVfZGFpLAorCQkJCQkJICBkYWlfbGluay0+ZGFpX2ZtdCk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZGV2X3dhcm4oY2FyZC0+cnRkW2ldLmNwdV9kYWktPmRldiwKKwkJCQkJICJGYWlsZWQgdG8gc2V0IERBSSBmb3JtYXQ6ICVkXG4iLAorCQkJCQkgcmV0KTsKKwkJfQorCX0KKwogCXNucHJpbnRmKGNhcmQtPnNuZF9jYXJkLT5zaG9ydG5hbWUsIHNpemVvZihjYXJkLT5zbmRfY2FyZC0+c2hvcnRuYW1lKSwKIAkJICIlcyIsIGNhcmQtPm5hbWUpOwogCXNucHJpbnRmKGNhcmQtPnNuZF9jYXJkLT5sb25nbmFtZSwgc2l6ZW9mKGNhcmQtPnNuZF9jYXJkLT5sb25nbmFtZSksCkBAIC0xNDU5LDYgKzE0ODAsOCBAQAogCQl9CiAJfQogCisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKCZjYXJkLT5kYXBtKTsKKwogCXJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQtPnNuZF9jYXJkKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGZhaWxlZCB0byByZWdpc3RlciBzb3VuZGNhcmQgZm9yICVzXG4iLCBjYXJkLT5uYW1lKTsKQEAgLTE0NzksNiArMTUwMiw3IEBACiAjZW5kaWYKIAogCWNhcmQtPmluc3RhbnRpYXRlZCA9IDE7CisJc25kX3NvY19kYXBtX3N5bmMoJmNhcmQtPmRhcG0pOwogCW11dGV4X3VubG9jaygmY2FyZC0+bXV0ZXgpOwogCXJldHVybjsKIApAQCAtMjIyOSw3ICsyMjUzLDggQEAKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAogICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KICAqCi0gKiBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIG1peGVyIGNvbnRyb2wuCisgKiBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIG1peGVyIGNvbnRyb2wsIG9yIGEgZG91YmxlCisgKiBtaXhlciBjb250cm9sIHRoYXQgc3BhbnMgMiByZWdpc3RlcnMuCiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgogICovCkBAIC0yMjM5LDggKzIyNjQsNiBAQAogCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQogCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJaW50IHBsYXRmb3JtX21heDsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7Ci0JdW5zaWduZWQgaW50IHJzaGlmdCA9IG1jLT5yc2hpZnQ7CiAKIAlpZiAoIW1jLT5wbGF0Zm9ybV9tYXgpCiAJCW1jLT5wbGF0Zm9ybV9tYXggPSBtYy0+bWF4OwpAQCAtMjI1MSw3ICsyMjc0LDcgQEAKIAllbHNlCiAJCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwogCi0JdWluZm8tPmNvdW50ID0gc2hpZnQgPT0gcnNoaWZ0ID8gMSA6IDI7CisJdWluZm8tPmNvdW50ID0gc25kX3NvY192b2xzd19pc19zdGVyZW8obWMpID8gMiA6IDE7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKIAl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBwbGF0Zm9ybV9tYXg7CiAJcmV0dXJuIDA7CkBAIC0yMjYzLDcgKzIyODYsOCBAQAogICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCiAgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKLSAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgbWl4ZXIgY29udHJvbC4KKyAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgbWl4ZXIgY29udHJvbCwgb3IgYSBkb3VibGUgbWl4ZXIKKyAqIGNvbnRyb2wgdGhhdCBzcGFucyAyIHJlZ2lzdGVycy4KICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCiAgKi8KQEAgLTIyNzQsNiArMjI5OCw3IEBACiAJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgaW50IHJlZyA9IG1jLT5yZWc7CisJdW5zaWduZWQgaW50IHJlZzIgPSBtYy0+cnJlZzsKIAl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7CiAJdW5zaWduZWQgaW50IHJzaGlmdCA9IG1jLT5yc2hpZnQ7CiAJaW50IG1heCA9IG1jLT5tYXg7CkBAIC0yMjgyLDEzICsyMzA3LDE4IEBACiAKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKLQlpZiAoc2hpZnQgIT0gcnNoaWZ0KQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9Ci0JCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcpID4+IHJzaGlmdCkgJiBtYXNrOwotCWlmIChpbnZlcnQpIHsKKwlpZiAoaW52ZXJ0KQogCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCQltYXggLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQkJaWYgKHNoaWZ0ICE9IHJzaGlmdCkKKworCWlmIChzbmRfc29jX3ZvbHN3X2lzX3N0ZXJlbyhtYykpIHsKKwkJaWYgKHJlZyA9PSByZWcyKQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gcnNoaWZ0KSAmIG1hc2s7CisJCWVsc2UKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KKwkJCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcyKSA+PiBzaGlmdCkgJiBtYXNrOworCQlpZiAoaW52ZXJ0KQogCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQogCQkJCW1heCAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwogCX0KQEAgLTIzMDIsNyArMjMzMiw4IEBACiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKICAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgotICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBtaXhlciBjb250cm9sLgorICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBtaXhlciBjb250cm9sLCBvciBhIGRvdWJsZSBtaXhlcgorICogY29udHJvbCB0aGF0IHNwYW5zIDIgcmVnaXN0ZXJzLgogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KICAqLwpAQCAtMjMxMywxNDMgKzIzNDQsNDQgQEAKIAkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKKwl1bnNpZ25lZCBpbnQgcmVnMiA9IG1jLT5ycmVnOwogCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKIAl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKIAlpbnQgbWF4ID0gbWMtPm1heDsKIAl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7CiAJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7Ci0JdW5zaWduZWQgaW50IHZhbCwgdmFsMiwgdmFsX21hc2s7CisJaW50IGVycjsKKwlib29sIHR5cGVfMnIgPSAwOworCXVuc2lnbmVkIGludCB2YWwyID0gMDsKKwl1bnNpZ25lZCBpbnQgdmFsLCB2YWxfbWFzazsKIAogCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2spOwogCWlmIChpbnZlcnQpCiAJCXZhbCA9IG1heCAtIHZhbDsKIAl2YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7CiAJdmFsID0gdmFsIDw8IHNoaWZ0OwotCWlmIChzaGlmdCAhPSByc2hpZnQpIHsKKwlpZiAoc25kX3NvY192b2xzd19pc19zdGVyZW8obWMpKSB7CiAJCXZhbDIgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBtYXNrKTsKIAkJaWYgKGludmVydCkKIAkJCXZhbDIgPSBtYXggLSB2YWwyOwotCQl2YWxfbWFzayB8PSBtYXNrIDw8IHJzaGlmdDsKLQkJdmFsIHw9IHZhbDIgPDwgcnNoaWZ0OworCQlpZiAocmVnID09IHJlZzIpIHsKKwkJCXZhbF9tYXNrIHw9IG1hc2sgPDwgcnNoaWZ0OworCQkJdmFsIHw9IHZhbDIgPDwgcnNoaWZ0OworCQl9IGVsc2UgeworCQkJdmFsMiA9IHZhbDIgPDwgc2hpZnQ7CisJCQl0eXBlXzJyID0gMTsKKwkJfQogCX0KLQlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0c19sb2NrZWQoY29kZWMsIHJlZywgdmFsX21hc2ssIHZhbCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzdyk7Ci0KLS8qKgotICogc25kX3NvY19pbmZvX3ZvbHN3XzJyIC0gZG91YmxlIG1peGVyIGluZm8gY2FsbGJhY2sKLSAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KLSAqCi0gKiBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdAotICogc3BhbnMgMiBjb2RlYyByZWdpc3RlcnMuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19pbmZvX3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgcGxhdGZvcm1fbWF4OwotCi0JaWYgKCFtYy0+cGxhdGZvcm1fbWF4KQotCQltYy0+cGxhdGZvcm1fbWF4ID0gbWMtPm1heDsKLQlwbGF0Zm9ybV9tYXggPSBtYy0+cGxhdGZvcm1fbWF4OwotCi0JaWYgKHBsYXRmb3JtX21heCA9PSAxICYmICFzdHJzdHIoa2NvbnRyb2wtPmlkLm5hbWUsICIgVm9sdW1lIikpCi0JCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOwotCWVsc2UKLQkJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0KLQl1aW5mby0+Y291bnQgPSAyOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gcGxhdGZvcm1fbWF4OwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZvbHN3XzJyKTsKLQotLyoqCi0gKiBzbmRfc29jX2dldF92b2xzd18yciAtIGRvdWJsZSBtaXhlciBnZXQgY2FsbGJhY2sKLSAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KLSAqCi0gKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdCBzcGFucyAyIHJlZ2lzdGVycy4KLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCi0gKi8KLWludCBzbmRfc29jX2dldF92b2xzd18ycihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KLQkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKLQl1bnNpZ25lZCBpbnQgcmVnMiA9IG1jLT5ycmVnOwotCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKLQlpbnQgbWF4ID0gbWMtPm1heDsKLQl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7Ci0JdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9Ci0JCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZzIpID4+IHNoaWZ0KSAmIG1hc2s7Ci0JaWYgKGludmVydCkgewotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCQltYXggLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQotCQkJbWF4IC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2dldF92b2xzd18ycik7Ci0KLS8qKgotICogc25kX3NvY19wdXRfdm9sc3dfMnIgLSBkb3VibGUgbWl4ZXIgc2V0IGNhbGxiYWNrCi0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBtaXhlciBjb250cm9sIHRoYXQgc3BhbnMgMiByZWdpc3RlcnMuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19wdXRfdm9sc3dfMnIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdW5zaWduZWQgaW50IHJlZyA9IG1jLT5yZWc7Ci0JdW5zaWduZWQgaW50IHJlZzIgPSBtYy0+cnJlZzsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7Ci0JaW50IG1heCA9IG1jLT5tYXg7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAoMSA8PCBmbHMobWF4KSkgLSAxOwotCXVuc2lnbmVkIGludCBpbnZlcnQgPSBtYy0+aW52ZXJ0OwotCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IHZhbCwgdmFsMiwgdmFsX21hc2s7Ci0KLQl2YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7Ci0JdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7Ci0JdmFsMiA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIG1hc2spOwotCi0JaWYgKGludmVydCkgewotCQl2YWwgPSBtYXggLSB2YWw7Ci0JCXZhbDIgPSBtYXggLSB2YWwyOwotCX0KLQotCXZhbCA9IHZhbCA8PCBzaGlmdDsKLQl2YWwyID0gdmFsMiA8PCBzaGlmdDsKLQogCWVyciA9IHNuZF9zb2NfdXBkYXRlX2JpdHNfbG9ja2VkKGNvZGVjLCByZWcsIHZhbF9tYXNrLCB2YWwpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gc25kX3NvY191cGRhdGVfYml0c19sb2NrZWQoY29kZWMsIHJlZzIsIHZhbF9tYXNrLCB2YWwyKTsKKwlpZiAodHlwZV8ycikKKwkJZXJyID0gc25kX3NvY191cGRhdGVfYml0c19sb2NrZWQoY29kZWMsIHJlZzIsIHZhbF9tYXNrLCB2YWwyKTsKKwogCXJldHVybiBlcnI7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzd18ycik7CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzdyk7CiAKIC8qKgogICogc25kX3NvY19pbmZvX3ZvbHN3X3M4IC0gc2lnbmVkIG1peGVyIGluZm8gY2FsbGJhY2sKQEAgLTI2ODAsNyArMjYxMiw3IEBACiAJaWYgKGRhaS0+ZHJpdmVyICYmIGRhaS0+ZHJpdmVyLT5vcHMtPnNldF9zeXNjbGspCiAJCXJldHVybiBkYWktPmRyaXZlci0+b3BzLT5zZXRfc3lzY2xrKGRhaSwgY2xrX2lkLCBmcmVxLCBkaXIpOwogCWVsc2UgaWYgKGRhaS0+Y29kZWMgJiYgZGFpLT5jb2RlYy0+ZHJpdmVyLT5zZXRfc3lzY2xrKQotCQlyZXR1cm4gZGFpLT5jb2RlYy0+ZHJpdmVyLT5zZXRfc3lzY2xrKGRhaS0+Y29kZWMsIGNsa19pZCwKKwkJcmV0dXJuIGRhaS0+Y29kZWMtPmRyaXZlci0+c2V0X3N5c2NsayhkYWktPmNvZGVjLCBjbGtfaWQsIDAsCiAJCQkJCQkgICAgICBmcmVxLCBkaXIpOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNjkxLDE2ICsyNjIzLDE4IEBACiAgKiBzbmRfc29jX2NvZGVjX3NldF9zeXNjbGsgLSBjb25maWd1cmUgQ09ERUMgc3lzdGVtIG9yIG1hc3RlciBjbG9jay4KICAqIEBjb2RlYzogQ09ERUMKICAqIEBjbGtfaWQ6IERBSSBzcGVjaWZpYyBjbG9jayBJRAorICogQHNvdXJjZTogU291cmNlIGZvciB0aGUgY2xvY2sKICAqIEBmcmVxOiBuZXcgY2xvY2sgZnJlcXVlbmN5IGluIEh6CiAgKiBAZGlyOiBuZXcgY2xvY2sgZGlyZWN0aW9uIC0gaW5wdXQvb3V0cHV0LgogICoKICAqIENvbmZpZ3VyZXMgdGhlIENPREVDIG1hc3RlciAoTUNMSykgb3Igc3lzdGVtIChTWVNDTEspIGNsb2NraW5nLgogICovCiBpbnQgc25kX3NvY19jb2RlY19zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGNsa19pZCwKLQl1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKKwkJCSAgICAgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCiB7CiAJaWYgKGNvZGVjLT5kcml2ZXItPnNldF9zeXNjbGspCi0JCXJldHVybiBjb2RlYy0+ZHJpdmVyLT5zZXRfc3lzY2xrKGNvZGVjLCBjbGtfaWQsIGZyZXEsIGRpcik7CisJCXJldHVybiBjb2RlYy0+ZHJpdmVyLT5zZXRfc3lzY2xrKGNvZGVjLCBjbGtfaWQsIHNvdXJjZSwKKwkJCQkJCSBmcmVxLCBkaXIpOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0yODk1LDYgKzI4MjksNyBAQAogCQljYXJkLT5ydGRbaV0uZGFpX2xpbmsgPSAmY2FyZC0+ZGFpX2xpbmtbaV07CiAKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+bGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmRhcG1fZGlydHkpOwogCWNhcmQtPmluc3RhbnRpYXRlZCA9IDA7CiAJbXV0ZXhfaW5pdCgmY2FyZC0+bXV0ZXgpOwogCkBAIC0zMTUzLDYgKzMwODgsNyBAQAogCXBsYXRmb3JtLT5kcml2ZXIgPSBwbGF0Zm9ybV9kcnY7CiAJcGxhdGZvcm0tPmRhcG0uZGV2ID0gZGV2OwogCXBsYXRmb3JtLT5kYXBtLnBsYXRmb3JtID0gcGxhdGZvcm07CisJcGxhdGZvcm0tPmRhcG0uc3RyZWFtX2V2ZW50ID0gcGxhdGZvcm1fZHJ2LT5zdHJlYW1fZXZlbnQ7CiAKIAltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOwogCWxpc3RfYWRkKCZwbGF0Zm9ybS0+bGlzdCwgJnBsYXRmb3JtX2xpc3QpOwpAQCAtMzI2NSw2ICszMjAxLDcgQEAKIAljb2RlYy0+ZGFwbS5kZXYgPSBkZXY7CiAJY29kZWMtPmRhcG0uY29kZWMgPSBjb2RlYzsKIAljb2RlYy0+ZGFwbS5zZXFfbm90aWZpZXIgPSBjb2RlY19kcnYtPnNlcV9ub3RpZmllcjsKKwljb2RlYy0+ZGFwbS5zdHJlYW1fZXZlbnQgPSBjb2RlY19kcnYtPnN0cmVhbV9ldmVudDsKIAljb2RlYy0+ZGV2ID0gZGV2OwogCWNvZGVjLT5kcml2ZXIgPSBjb2RlY19kcnY7CiAJY29kZWMtPm51bV9kYWkgPSBudW1fZGFpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1kYXBtLmMgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwppbmRleCBkNjdjNjM3Li5mNDJlOGI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWRhcG0uYworKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtNDgsNiArNDgsOCBAQAogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Fzb2MuaD4KIAorI2RlZmluZSBEQVBNX1VQREFURV9TVEFUKHdpZGdldCwgdmFsKSB3aWRnZXQtPmRhcG0tPmNhcmQtPmRhcG1fc3RhdHMudmFsKys7CisKIC8qIGRhcG0gcG93ZXIgc2VxdWVuY2VzIC0gbWFrZSB0aGlzIHBlciBjb2RlYyBpbiB0aGUgZnV0dXJlICovCiBzdGF0aWMgaW50IGRhcG1fdXBfc2VxW10gPSB7CiAJW3NuZF9zb2NfZGFwbV9wcmVdID0gMCwKQEAgLTExNyw2ICsxMTksMjEgQEAKIAlrZnJlZShidWYpOwogfQogCitzdGF0aWMgYm9vbCBkYXBtX2RpcnR5X3dpZGdldChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3sKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJnctPmRpcnR5KTsKK30KKwordm9pZCBkYXBtX21hcmtfZGlydHkoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKwlpZiAoIWRhcG1fZGlydHlfd2lkZ2V0KHcpKSB7CisJCWRldl92ZGJnKHctPmRhcG0tPmRldiwgIk1hcmtpbmcgJXMgZGlydHkgZHVlIHRvICVzXG4iLAorCQkJIHctPm5hbWUsIHJlYXNvbik7CisJCWxpc3RfYWRkX3RhaWwoJnctPmRpcnR5LCAmdy0+ZGFwbS0+Y2FyZC0+ZGFwbV9kaXJ0eSk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZGFwbV9tYXJrX2RpcnR5KTsKKwogLyogY3JlYXRlIGEgbmV3IGRhcG0gd2lkZ2V0ICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkYXBtX2NuZXdfd2lkZ2V0KAogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpfd2lkZ2V0KQpAQCAtMzE2LDcgKzMzMyw3IEBACiAJCX0KIAl9CiAJYnJlYWs7Ci0JLyogZG9lcyBub3QgZWZmZWN0IHJvdXRpbmcgLSBhbHdheXMgY29ubmVjdGVkICovCisJLyogZG9lcyBub3QgYWZmZWN0IHJvdXRpbmcgLSBhbHdheXMgY29ubmVjdGVkICovCiAJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgogCWNhc2Ugc25kX3NvY19kYXBtX291dF9kcnY6CiAJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgpAQCAtMzI4LDEzICszNDUsMTMgQEAKIAljYXNlIHNuZF9zb2NfZGFwbV9zdXBwbHk6CiAJY2FzZSBzbmRfc29jX2RhcG1fYWlmX2luOgogCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9vdXQ6Ci0JCXAtPmNvbm5lY3QgPSAxOwotCWJyZWFrOwotCS8qIGRvZXMgZWZmZWN0IHJvdXRpbmcgLSBkeW5hbWljYWxseSBjb25uZWN0ZWQgKi8KIAljYXNlIHNuZF9zb2NfZGFwbV9ocDoKIAljYXNlIHNuZF9zb2NfZGFwbV9taWM6CiAJY2FzZSBzbmRfc29jX2RhcG1fc3BrOgogCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6CisJCXAtPmNvbm5lY3QgPSAxOworCWJyZWFrOworCS8qIGRvZXMgYWZmZWN0IHJvdXRpbmcgLSBkeW5hbWljYWxseSBjb25uZWN0ZWQgKi8KIAljYXNlIHNuZF9zb2NfZGFwbV9wcmU6CiAJY2FzZSBzbmRfc29jX2RhcG1fcG9zdDoKIAkJcC0+Y29ubmVjdCA9IDA7CkBAIC00NDMsNiArNDYwLDExIEBACiAJCQlpZiAocGF0aC0+bmFtZSAhPSAoY2hhciAqKXctPmtjb250cm9sX25ld3NbaV0ubmFtZSkKIAkJCQljb250aW51ZTsKIAorCQkJaWYgKHctPmtjb250cm9sc1tpXSkgeworCQkJCXBhdGgtPmtjb250cm9sID0gdy0+a2NvbnRyb2xzW2ldOworCQkJCWNvbnRpbnVlOworCQkJfQorCiAJCQl3bGlzdHNpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCkgKwogCQkJCSAgICBzaXplb2Yoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKiksCiAJCQl3bGlzdCA9IGt6YWxsb2Mod2xpc3RzaXplLCBHRlBfS0VSTkVMKTsKQEAgLTU3OSw4ICs2MDEsOCBAQAogCQkJCQluYW1lICsgcHJlZml4X2xlbiwgcHJlZml4KTsKIAkJcmV0ID0gc25kX2N0bF9hZGQoY2FyZCwga2NvbnRyb2wpOwogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihkYXBtLT5kZXYsCi0JCQkJImFzb2M6IGZhaWxlZCB0byBhZGQga2NvbnRyb2wgJXNcbiIsIHctPm5hbWUpOworCQkJZGV2X2VycihkYXBtLT5kZXYsICJmYWlsZWQgdG8gYWRkIGtjb250cm9sICVzOiAlZFxuIiwKKwkJCQl3LT5uYW1lLCByZXQpOwogCQkJa2ZyZWUod2xpc3QpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtNjQ0LDMwICs2NjYsNDUgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGg7CiAJaW50IGNvbiA9IDA7CiAKKwlpZiAod2lkZ2V0LT5vdXRwdXRzID49IDApCisJCXJldHVybiB3aWRnZXQtPm91dHB1dHM7CisKKwlEQVBNX1VQREFURV9TVEFUKHdpZGdldCwgcGF0aF9jaGVja3MpOworCiAJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3N1cHBseSkKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKHdpZGdldC0+aWQpIHsKIAljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CiAJY2FzZSBzbmRfc29jX2RhcG1fYWlmX291dDoKLQkJaWYgKHdpZGdldC0+YWN0aXZlKQotCQkJcmV0dXJuIHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCWlmICh3aWRnZXQtPmFjdGl2ZSkgeworCQkJd2lkZ2V0LT5vdXRwdXRzID0gc25kX3NvY19kYXBtX3N1c3BlbmRfY2hlY2sod2lkZ2V0KTsKKwkJCXJldHVybiB3aWRnZXQtPm91dHB1dHM7CisJCX0KIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKIAlpZiAod2lkZ2V0LT5jb25uZWN0ZWQpIHsKIAkJLyogY29ubmVjdGVkIHBpbiA/ICovCi0JCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9vdXRwdXQgJiYgIXdpZGdldC0+ZXh0KQotCQkJcmV0dXJuIHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9vdXRwdXQgJiYgIXdpZGdldC0+ZXh0KSB7CisJCQl3aWRnZXQtPm91dHB1dHMgPSBzbmRfc29jX2RhcG1fc3VzcGVuZF9jaGVjayh3aWRnZXQpOworCQkJcmV0dXJuIHdpZGdldC0+b3V0cHV0czsKKwkJfQogCiAJCS8qIGNvbm5lY3RlZCBqYWNrIG9yIHNwayA/ICovCi0JCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9ocCB8fCB3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9zcGsgfHwKLQkJICAgICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9saW5lICYmICFsaXN0X2VtcHR5KCZ3aWRnZXQtPnNvdXJjZXMpKSkKLQkJCXJldHVybiBzbmRfc29jX2RhcG1fc3VzcGVuZF9jaGVjayh3aWRnZXQpOworCQlpZiAod2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1faHAgfHwKKwkJICAgIHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3NwayB8fAorCQkgICAgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2xpbmUgJiYKKwkJICAgICAhbGlzdF9lbXB0eSgmd2lkZ2V0LT5zb3VyY2VzKSkpIHsKKwkJCXdpZGdldC0+b3V0cHV0cyA9IHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCQlyZXR1cm4gd2lkZ2V0LT5vdXRwdXRzOworCQl9CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5zaW5rcywgbGlzdF9zb3VyY2UpIHsKKwkJREFQTV9VUERBVEVfU1RBVCh3aWRnZXQsIG5laWdoYm91cl9jaGVja3MpOworCiAJCWlmIChwYXRoLT53ZWFrKQogCQkJY29udGludWU7CiAKQEAgLTY4MCw2ICs3MTcsOCBAQAogCQl9CiAJfQogCisJd2lkZ2V0LT5vdXRwdXRzID0gY29uOworCiAJcmV0dXJuIGNvbjsKIH0KIApAQCAtNjkyLDYgKzczMSwxMSBAQAogCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKIAlpbnQgY29uID0gMDsKIAorCWlmICh3aWRnZXQtPmlucHV0cyA+PSAwKQorCQlyZXR1cm4gd2lkZ2V0LT5pbnB1dHM7CisKKwlEQVBNX1VQREFURV9TVEFUKHdpZGdldCwgcGF0aF9jaGVja3MpOworCiAJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3N1cHBseSkKIAkJcmV0dXJuIDA7CiAKQEAgLTY5OSwyOCArNzQzLDQwIEBACiAJc3dpdGNoICh3aWRnZXQtPmlkKSB7CiAJY2FzZSBzbmRfc29jX2RhcG1fZGFjOgogCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9pbjoKLQkJaWYgKHdpZGdldC0+YWN0aXZlKQotCQkJcmV0dXJuIHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCWlmICh3aWRnZXQtPmFjdGl2ZSkgeworCQkJd2lkZ2V0LT5pbnB1dHMgPSBzbmRfc29jX2RhcG1fc3VzcGVuZF9jaGVjayh3aWRnZXQpOworCQkJcmV0dXJuIHdpZGdldC0+aW5wdXRzOworCQl9CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCiAJaWYgKHdpZGdldC0+Y29ubmVjdGVkKSB7CiAJCS8qIGNvbm5lY3RlZCBwaW4gPyAqLwotCQlpZiAod2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1faW5wdXQgJiYgIXdpZGdldC0+ZXh0KQotCQkJcmV0dXJuIHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9pbnB1dCAmJiAhd2lkZ2V0LT5leHQpIHsKKwkJCXdpZGdldC0+aW5wdXRzID0gc25kX3NvY19kYXBtX3N1c3BlbmRfY2hlY2sod2lkZ2V0KTsKKwkJCXJldHVybiB3aWRnZXQtPmlucHV0czsKKwkJfQogCiAJCS8qIGNvbm5lY3RlZCBWTUlEL0JpYXMgZm9yIGxvd2VyIHBvcHMgKi8KLQkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3ZtaWQpCi0JCQlyZXR1cm4gc25kX3NvY19kYXBtX3N1c3BlbmRfY2hlY2sod2lkZ2V0KTsKKwkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3ZtaWQpIHsKKwkJCXdpZGdldC0+aW5wdXRzID0gc25kX3NvY19kYXBtX3N1c3BlbmRfY2hlY2sod2lkZ2V0KTsKKwkJCXJldHVybiB3aWRnZXQtPmlucHV0czsKKwkJfQogCiAJCS8qIGNvbm5lY3RlZCBqYWNrID8gKi8KIAkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fAotCQkgICAgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2xpbmUgJiYgIWxpc3RfZW1wdHkoJndpZGdldC0+c2lua3MpKSkKLQkJCXJldHVybiBzbmRfc29jX2RhcG1fc3VzcGVuZF9jaGVjayh3aWRnZXQpOworCQkgICAgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2xpbmUgJiYKKwkJICAgICAhbGlzdF9lbXB0eSgmd2lkZ2V0LT5zaW5rcykpKSB7CisJCQl3aWRnZXQtPmlucHV0cyA9IHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCQlyZXR1cm4gd2lkZ2V0LT5pbnB1dHM7CisJCX0KKwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+c291cmNlcywgbGlzdF9zaW5rKSB7CisJCURBUE1fVVBEQVRFX1NUQVQod2lkZ2V0LCBuZWlnaGJvdXJfY2hlY2tzKTsKKwogCQlpZiAocGF0aC0+d2VhaykKIAkJCWNvbnRpbnVlOwogCkBAIC03MzMsNiArNzg5LDggQEAKIAkJfQogCX0KIAorCXdpZGdldC0+aW5wdXRzID0gY29uOworCiAJcmV0dXJuIGNvbjsKIH0KIApAQCAtNzU2LDEyICs4MTQsMjkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRhcG1fcmVnX2V2ZW50KTsKIAorc3RhdGljIGludCBkYXBtX3dpZGdldF9wb3dlcl9jaGVjayhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3sKKwlpZiAody0+cG93ZXJfY2hlY2tlZCkKKwkJcmV0dXJuIHctPm5ld19wb3dlcjsKKworCWlmICh3LT5mb3JjZSkKKwkJdy0+bmV3X3Bvd2VyID0gMTsKKwllbHNlCisJCXctPm5ld19wb3dlciA9IHctPnBvd2VyX2NoZWNrKHcpOworCisJdy0+cG93ZXJfY2hlY2tlZCA9IHRydWU7CisKKwlyZXR1cm4gdy0+bmV3X3Bvd2VyOworfQorCiAvKiBHZW5lcmljIGNoZWNrIHRvIHNlZSBpZiBhIHdpZGdldCBzaG91bGQgYmUgcG93ZXJlZC4KICAqLwogc3RhdGljIGludCBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CiAJaW50IGluLCBvdXQ7CiAKKwlEQVBNX1VQREFURV9TVEFUKHcsIHBvd2VyX2NoZWNrcyk7CisKIAlpbiA9IGlzX2Nvbm5lY3RlZF9pbnB1dF9lcCh3KTsKIAlkYXBtX2NsZWFyX3dhbGsody0+ZGFwbSk7CiAJb3V0ID0gaXNfY29ubmVjdGVkX291dHB1dF9lcCh3KTsKQEAgLTc3NCw2ICs4NDksOCBAQAogewogCWludCBpbjsKIAorCURBUE1fVVBEQVRFX1NUQVQodywgcG93ZXJfY2hlY2tzKTsKKwogCWlmICh3LT5hY3RpdmUpIHsKIAkJaW4gPSBpc19jb25uZWN0ZWRfaW5wdXRfZXAodyk7CiAJCWRhcG1fY2xlYXJfd2Fsayh3LT5kYXBtKTsKQEAgLTc4OCw2ICs4NjUsOCBAQAogewogCWludCBvdXQ7CiAKKwlEQVBNX1VQREFURV9TVEFUKHcsIHBvd2VyX2NoZWNrcyk7CisKIAlpZiAody0+YWN0aXZlKSB7CiAJCW91dCA9IGlzX2Nvbm5lY3RlZF9vdXRwdXRfZXAodyk7CiAJCWRhcG1fY2xlYXJfd2Fsayh3LT5kYXBtKTsKQEAgLTgwMSwxMCArODgwLDEzIEBACiBzdGF0aWMgaW50IGRhcG1fc3VwcGx5X2NoZWNrX3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQogewogCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKLQlpbnQgcG93ZXIgPSAwOworCisJREFQTV9VUERBVEVfU1RBVCh3LCBwb3dlcl9jaGVja3MpOwogCiAJLyogQ2hlY2sgaWYgb25lIG9mIG91ciBvdXRwdXRzIGlzIGNvbm5lY3RlZCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJnctPnNpbmtzLCBsaXN0X3NvdXJjZSkgeworCQlEQVBNX1VQREFURV9TVEFUKHcsIG5laWdoYm91cl9jaGVja3MpOworCiAJCWlmIChwYXRoLT53ZWFrKQogCQkJY29udGludWU7CiAKQEAgLTgxNSwyMSArODk3LDE4IEBACiAJCWlmICghcGF0aC0+c2luaykKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChwYXRoLT5zaW5rLT5mb3JjZSkgewotCQkJcG93ZXIgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocGF0aC0+c2luay0+cG93ZXJfY2hlY2sgJiYKLQkJICAgIHBhdGgtPnNpbmstPnBvd2VyX2NoZWNrKHBhdGgtPnNpbmspKSB7Ci0JCQlwb3dlciA9IDE7Ci0JCQlicmVhazsKLQkJfQorCQlpZiAoZGFwbV93aWRnZXRfcG93ZXJfY2hlY2socGF0aC0+c2luaykpCisJCQlyZXR1cm4gMTsKIAl9CiAKIAlkYXBtX2NsZWFyX3dhbGsody0+ZGFwbSk7CiAKLQlyZXR1cm4gcG93ZXI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFwbV9hbHdheXNfb25fY2hlY2tfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCit7CisJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQgZGFwbV9zZXFfY29tcGFyZShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqYSwKQEAgLTExNzIsNiArMTI1MSw4NSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZGFwbV93aWRnZXRfc2V0X3BlZXJfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnBlZXIsCisJCQkJICAgICAgIGJvb2wgcG93ZXIsIGJvb2wgY29ubmVjdCkKK3sKKwkvKiBJZiBhIGNvbm5lY3Rpb24gaXMgYmVpbmcgbWFkZSBvciBicm9rZW4gdGhlbiB0aGF0IHVwZGF0ZQorCSAqIHdpbGwgaGF2ZSBtYXJrZWQgdGhlIHBlZXIgZGlydHksIG90aGVyd2lzZSB0aGUgd2lkZ2V0cyBhcmUKKwkgKiBub3QgY29ubmVjdGVkIGFuZCB0aGlzIHVwZGF0ZSBoYXMgbm8gaW1wYWN0LiAqLworCWlmICghY29ubmVjdCkKKwkJcmV0dXJuOworCisJLyogSWYgdGhlIHBlZXIgaXMgYWxyZWFkeSBpbiB0aGUgc3RhdGUgd2UncmUgbW92aW5nIHRvIHRoZW4gd2UKKwkgKiB3b24ndCBoYXZlIGFuIGltcGFjdCBvbiBpdC4gKi8KKwlpZiAocG93ZXIgIT0gcGVlci0+cG93ZXIpCisJCWRhcG1fbWFya19kaXJ0eShwZWVyLCAicGVlciBzdGF0ZSBjaGFuZ2UiKTsKK30KKworc3RhdGljIHZvaWQgZGFwbV93aWRnZXRfc2V0X3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBib29sIHBvd2VyLAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqdXBfbGlzdCwKKwkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKmRvd25fbGlzdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGg7CisKKwlpZiAody0+cG93ZXIgPT0gcG93ZXIpCisJCXJldHVybjsKKworCXRyYWNlX3NuZF9zb2NfZGFwbV93aWRnZXRfcG93ZXIodywgcG93ZXIpOworCisJLyogSWYgd2UgY2hhbmdlZCBvdXIgcG93ZXIgc3RhdGUgcGVyaGFwcyBvdXIgbmVpZ2JvdXJzIGNoYW5nZWQKKwkgKiBhbHNvLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJnctPnNvdXJjZXMsIGxpc3Rfc2luaykgeworCQlpZiAocGF0aC0+c291cmNlKSB7CisJCQlkYXBtX3dpZGdldF9zZXRfcGVlcl9wb3dlcihwYXRoLT5zb3VyY2UsIHBvd2VyLAorCQkJCQkJICAgcGF0aC0+Y29ubmVjdCk7CisJCX0KKwl9CisJc3dpdGNoICh3LT5pZCkgeworCWNhc2Ugc25kX3NvY19kYXBtX3N1cHBseToKKwkJLyogU3VwcGxpZXMgY2FuJ3QgYWZmZWN0IHRoZWlyIG91dHB1dHMsIG9ubHkgdGhlaXIgaW5wdXRzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJnctPnNpbmtzLCBsaXN0X3NvdXJjZSkgeworCQkJaWYgKHBhdGgtPnNpbmspIHsKKwkJCQlkYXBtX3dpZGdldF9zZXRfcGVlcl9wb3dlcihwYXRoLT5zaW5rLCBwb3dlciwKKwkJCQkJCQkgICBwYXRoLT5jb25uZWN0KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAocG93ZXIpCisJCWRhcG1fc2VxX2luc2VydCh3LCB1cF9saXN0LCB0cnVlKTsKKwllbHNlCisJCWRhcG1fc2VxX2luc2VydCh3LCBkb3duX2xpc3QsIGZhbHNlKTsKKworCXctPnBvd2VyID0gcG93ZXI7Cit9CisKK3N0YXRpYyB2b2lkIGRhcG1fcG93ZXJfb25lX3dpZGdldChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKnVwX2xpc3QsCisJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpkb3duX2xpc3QpCit7CisJaW50IHBvd2VyOworCisJc3dpdGNoICh3LT5pZCkgeworCWNhc2Ugc25kX3NvY19kYXBtX3ByZToKKwkJZGFwbV9zZXFfaW5zZXJ0KHcsIGRvd25fbGlzdCwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9wb3N0OgorCQlkYXBtX3NlcV9pbnNlcnQodywgdXBfbGlzdCwgdHJ1ZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcG93ZXIgPSBkYXBtX3dpZGdldF9wb3dlcl9jaGVjayh3KTsKKworCQlkYXBtX3dpZGdldF9zZXRfcG93ZXIodywgcG93ZXIsIHVwX2xpc3QsIGRvd25fbGlzdCk7CisJCWJyZWFrOworCX0KK30KKwogLyoKICAqIFNjYW4gZWFjaCBkYXBtIHdpZGdldCBmb3IgY29tcGxldGUgYXVkaW8gcGF0aC4KICAqIEEgY29tcGxldGUgcGF0aCBpcyBhIHJvdXRlIHRoYXQgaGFzIHZhbGlkIGVuZHBvaW50cyBpLmUuOi0KQEAgLTExOTAsNyArMTM0OCw2IEBACiAJTElTVF9IRUFEKGRvd25fbGlzdCk7CiAJTElTVF9IRUFEKGFzeW5jX2RvbWFpbik7CiAJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgYmlhczsKLQlpbnQgcG93ZXI7CiAKIAl0cmFjZV9zbmRfc29jX2RhcG1fc3RhcnQoY2FyZCk7CiAKQEAgLTEyMDMsNjEgKzEzNjAsNDcgQEAKIAkJfQogCX0KIAotCS8qIENoZWNrIHdoaWNoIHdpZGdldHMgd2UgbmVlZCB0byBwb3dlciBhbmQgc3RvcmUgdGhlbSBpbgotCSAqIGxpc3RzIGluZGljYXRpbmcgaWYgdGhleSBzaG91bGQgYmUgcG93ZXJlZCB1cCBvciBkb3duLgotCSAqLworCW1lbXNldCgmY2FyZC0+ZGFwbV9zdGF0cywgMCwgc2l6ZW9mKGNhcmQtPmRhcG1fc3RhdHMpKTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNhcmQtPndpZGdldHMsIGxpc3QpIHsKLQkJc3dpdGNoICh3LT5pZCkgewotCQljYXNlIHNuZF9zb2NfZGFwbV9wcmU6Ci0JCQlkYXBtX3NlcV9pbnNlcnQodywgJmRvd25fbGlzdCwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2Ugc25kX3NvY19kYXBtX3Bvc3Q6Ci0JCQlkYXBtX3NlcV9pbnNlcnQodywgJnVwX2xpc3QsIHRydWUpOwotCQkJYnJlYWs7CisJCXctPnBvd2VyX2NoZWNrZWQgPSBmYWxzZTsKKwkJdy0+aW5wdXRzID0gLTE7CisJCXctPm91dHB1dHMgPSAtMTsKKwl9CiAKLQkJZGVmYXVsdDoKLQkJCWlmICghdy0+cG93ZXJfY2hlY2spCi0JCQkJY29udGludWU7CisJLyogQ2hlY2sgd2hpY2ggd2lkZ2V0cyB3ZSBuZWVkIHRvIHBvd2VyIGFuZCBzdG9yZSB0aGVtIGluCisJICogbGlzdHMgaW5kaWNhdGluZyBpZiB0aGV5IHNob3VsZCBiZSBwb3dlcmVkIHVwIG9yIGRvd24uICBXZQorCSAqIG9ubHkgY2hlY2sgd2lkZ2V0cyB0aGF0IGhhdmUgYmVlbiBmbGFnZ2VkIGFzIGRpcnR5IGJ1dCBub3RlCisJICogdGhhdCBuZXcgd2lkZ2V0cyBtYXkgYmUgYWRkZWQgdG8gdGhlIGRpcnR5IGxpc3Qgd2hpbGUgd2UKKwkgKiBpdGVyYXRlLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNhcmQtPmRhcG1fZGlydHksIGRpcnR5KSB7CisJCWRhcG1fcG93ZXJfb25lX3dpZGdldCh3LCAmdXBfbGlzdCwgJmRvd25fbGlzdCk7CisJfQogCi0JCQlpZiAoIXctPmZvcmNlKQotCQkJCXBvd2VyID0gdy0+cG93ZXJfY2hlY2sodyk7Ci0JCQllbHNlCi0JCQkJcG93ZXIgPSAxOworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNhcmQtPndpZGdldHMsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmdy0+ZGlydHkpOwogCi0JCQlpZiAocG93ZXIpIHsKLQkJCQlkID0gdy0+ZGFwbTsKKwkJaWYgKHctPnBvd2VyKSB7CisJCQlkID0gdy0+ZGFwbTsKIAotCQkJCS8qIFN1cHBsaWVzIGFuZCBtaWNiaWFzZXMgb25seSBicmluZwotCQkJCSAqIHRoZSBjb250ZXh0IHVwIHRvIFNUQU5EQlkgYXMgdW5sZXNzCi0JCQkJICogc29tZXRoaW5nIGVsc2UgaXMgYWN0aXZlIGFuZAotCQkJCSAqIHBhc3NpbmcgYXVkaW8gdGhleSBnZW5lcmFsbHkgZG9uJ3QKLQkJCQkgKiByZXF1aXJlIGZ1bGwgcG93ZXIuCi0JCQkJICovCi0JCQkJc3dpdGNoICh3LT5pZCkgewotCQkJCWNhc2Ugc25kX3NvY19kYXBtX3N1cHBseToKLQkJCQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgotCQkJCQlpZiAoZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPCBTTkRfU09DX0JJQVNfU1RBTkRCWSkKLQkJCQkJCWQtPnRhcmdldF9iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX1NUQU5EQlk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWQtPnRhcmdldF9iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09OOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkvKiBTdXBwbGllcyBhbmQgbWljYmlhc2VzIG9ubHkgYnJpbmcgdGhlCisJCQkgKiBjb250ZXh0IHVwIHRvIFNUQU5EQlkgYXMgdW5sZXNzIHNvbWV0aGluZworCQkJICogZWxzZSBpcyBhY3RpdmUgYW5kIHBhc3NpbmcgYXVkaW8gdGhleQorCQkJICogZ2VuZXJhbGx5IGRvbid0IHJlcXVpcmUgZnVsbCBwb3dlci4KKwkJCSAqLworCQkJc3dpdGNoICh3LT5pZCkgeworCQkJY2FzZSBzbmRfc29jX2RhcG1fc3VwcGx5OgorCQkJY2FzZSBzbmRfc29jX2RhcG1fbWljYmlhczoKKwkJCQlpZiAoZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPCBTTkRfU09DX0JJQVNfU1RBTkRCWSkKKwkJCQkJZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfU1RBTkRCWTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT047CisJCQkJYnJlYWs7CiAJCQl9Ci0KLQkJCWlmICh3LT5wb3dlciA9PSBwb3dlcikKLQkJCQljb250aW51ZTsKLQotCQkJdHJhY2Vfc25kX3NvY19kYXBtX3dpZGdldF9wb3dlcih3LCBwb3dlcik7Ci0KLQkJCWlmIChwb3dlcikKLQkJCQlkYXBtX3NlcV9pbnNlcnQodywgJnVwX2xpc3QsIHRydWUpOwotCQkJZWxzZQotCQkJCWRhcG1fc2VxX2luc2VydCh3LCAmZG93bl9saXN0LCBmYWxzZSk7Ci0KLQkJCXctPnBvd2VyID0gcG93ZXI7Ci0JCQlicmVhazsKIAkJfQorCiAJfQogCiAJLyogSWYgdGhlcmUgYXJlIG5vIERBUE0gd2lkZ2V0cyB0aGVuIHRyeSB0byBmaWd1cmUgb3V0IHBvd2VyIGZyb20gdGhlCkBAIC0xMjg2LDE0ICsxNDI5LDE4IEBACiAJCX0KIAl9CiAKLQkvKiBGb3JjZSBhbGwgY29udGV4dHMgaW4gdGhlIGNhcmQgdG8gdGhlIHNhbWUgYmlhcyBzdGF0ZSAqLworCS8qIEZvcmNlIGFsbCBjb250ZXh0cyBpbiB0aGUgY2FyZCB0byB0aGUgc2FtZSBiaWFzIHN0YXRlIGlmCisJICogdGhleSdyZSBub3QgZ3JvdW5kIHJlZmVyZW5jZWQuCisJICovCiAJYmlhcyA9IFNORF9TT0NfQklBU19PRkY7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmY2FyZC0+ZGFwbV9saXN0LCBsaXN0KQogCQlpZiAoZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPiBiaWFzKQogCQkJYmlhcyA9IGQtPnRhcmdldF9iaWFzX2xldmVsOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkKLQkJZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPSBiaWFzOworCQlpZiAoIWQtPmlkbGVfYmlhc19vZmYpCisJCQlkLT50YXJnZXRfYmlhc19sZXZlbCA9IGJpYXM7CiAKKwl0cmFjZV9zbmRfc29jX2RhcG1fd2Fsa19kb25lKGNhcmQpOwogCiAJLyogUnVuIGFsbCB0aGUgYmlhcyBjaGFuZ2VzIGluIHBhcmFsbGVsICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmZGFwbS0+Y2FyZC0+ZGFwbV9saXN0LCBsaXN0KQpAQCAtMTUyNCwxNCArMTY3MSwyMSBAQAogCiAJCWZvdW5kID0gMTsKIAkJLyogd2Ugbm93IG5lZWQgdG8gbWF0Y2ggdGhlIHN0cmluZyBpbiB0aGUgZW51bSB0byB0aGUgcGF0aCAqLwotCQlpZiAoIShzdHJjbXAocGF0aC0+bmFtZSwgZS0+dGV4dHNbbXV4XSkpKQorCQlpZiAoIShzdHJjbXAocGF0aC0+bmFtZSwgZS0+dGV4dHNbbXV4XSkpKSB7CiAJCQlwYXRoLT5jb25uZWN0ID0gMTsgLyogbmV3IGNvbm5lY3Rpb24gKi8KLQkJZWxzZQorCQkJZGFwbV9tYXJrX2RpcnR5KHBhdGgtPnNvdXJjZSwgIm11eCBjb25uZWN0aW9uIik7CisJCX0gZWxzZSB7CisJCQlpZiAocGF0aC0+Y29ubmVjdCkKKwkJCQlkYXBtX21hcmtfZGlydHkocGF0aC0+c291cmNlLAorCQkJCQkJIm11eCBkaXNjb25uZWN0aW9uIik7CiAJCQlwYXRoLT5jb25uZWN0ID0gMDsgLyogb2xkIGNvbm5lY3Rpb24gbXVzdCBiZSBwb3dlcmVkIGRvd24gKi8KKwkJfQogCX0KIAotCWlmIChmb3VuZCkKKwlpZiAoZm91bmQpIHsKKwkJZGFwbV9tYXJrX2RpcnR5KHdpZGdldCwgIm11eCBjaGFuZ2UiKTsKIAkJZGFwbV9wb3dlcl93aWRnZXRzKHdpZGdldC0+ZGFwbSwgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTU1NiwxMSArMTcxMCwxMyBAQAogCQkvKiBmb3VuZCwgbm93IGNoZWNrIHR5cGUgKi8KIAkJZm91bmQgPSAxOwogCQlwYXRoLT5jb25uZWN0ID0gY29ubmVjdDsKLQkJYnJlYWs7CisJCWRhcG1fbWFya19kaXJ0eShwYXRoLT5zb3VyY2UsICJtaXhlciBjb25uZWN0aW9uIik7CiAJfQogCi0JaWYgKGZvdW5kKQorCWlmIChmb3VuZCkgeworCQlkYXBtX21hcmtfZGlydHkod2lkZ2V0LCAibWl4ZXIgdXBkYXRlIik7CiAJCWRhcG1fcG93ZXJfd2lkZ2V0cyh3aWRnZXQtPmRhcG0sIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MDQsNiArMTg2MCw3IEBACiAJdy0+Y29ubmVjdGVkID0gc3RhdHVzOwogCWlmIChzdGF0dXMgPT0gMCkKIAkJdy0+Zm9yY2UgPSAwOworCWRhcG1fbWFya19kaXJ0eSh3LCAicGluIGNvbmZpZ3VyYXRpb24iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTcxOSw2ICsxODc2LDEzIEBACiAgKi8KIGludCBzbmRfc29jX2RhcG1fc3luYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CisJLyoKKwkgKiBTdXBwcmVzcyBlYXJseSByZXBvcnRzIChlZywgamFja3Mgc3luY2luZyB0aGVpciBzdGF0ZSkgdG8gYXZvaWQKKwkgKiBzaWxseSBEQVBNIHJ1bnMgZHVyaW5nIGNhcmQgc3RhcnR1cC4KKwkgKi8KKwlpZiAoIWRhcG0tPmNhcmQgfHwgIWRhcG0tPmNhcmQtPmluc3RhbnRpYXRlZCkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gZGFwbV9wb3dlcl93aWRnZXRzKGRhcG0sIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9zeW5jKTsKQEAgLTIwMDQsNDIgKzIxNjgsMTggQEAKIAkJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgogCQljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKIAkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOgotCQkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7CiAJCQlkYXBtX25ld19taXhlcih3KTsKIAkJCWJyZWFrOwogCQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6CiAJCWNhc2Ugc25kX3NvY19kYXBtX3ZpcnRfbXV4OgogCQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcjsKIAkJCWRhcG1fbmV3X211eCh3KTsKIAkJCWJyZWFrOwotCQljYXNlIHNuZF9zb2NfZGFwbV9hZGM6Ci0JCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9vdXQ6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fYWRjX2NoZWNrX3Bvd2VyOwotCQkJYnJlYWs7Ci0JCWNhc2Ugc25kX3NvY19kYXBtX2RhYzoKLQkJY2FzZSBzbmRfc29jX2RhcG1fYWlmX2luOgotCQkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2RhY19jaGVja19wb3dlcjsKLQkJCWJyZWFrOwogCQljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CiAJCWNhc2Ugc25kX3NvY19kYXBtX291dF9kcnY6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcjsKIAkJCWRhcG1fbmV3X3BnYSh3KTsKIAkJCWJyZWFrOwotCQljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKLQkJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgotCQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgotCQljYXNlIHNuZF9zb2NfZGFwbV9zcGs6Ci0JCWNhc2Ugc25kX3NvY19kYXBtX2hwOgotCQljYXNlIHNuZF9zb2NfZGFwbV9taWM6Ci0JCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcjsKLQkJCWJyZWFrOwotCQljYXNlIHNuZF9zb2NfZGFwbV9zdXBwbHk6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fc3VwcGx5X2NoZWNrX3Bvd2VyOwotCQljYXNlIHNuZF9zb2NfZGFwbV92bWlkOgotCQljYXNlIHNuZF9zb2NfZGFwbV9wcmU6Ci0JCWNhc2Ugc25kX3NvY19kYXBtX3Bvc3Q6CisJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQogCkBAIC0yMDU2LDYgKzIxOTYsNyBAQAogCiAJCXctPm5ldyA9IDE7CiAKKwkJZGFwbV9tYXJrX2RpcnR5KHcsICJuZXcgd2lkZ2V0Iik7CiAJCWRhcG1fZGVidWdmc19hZGRfd2lkZ2V0KHcpOwogCX0KIApAQCAtMjUzMCw2ICsyNjcxLDQ0IEBACiAJZWxzZQogCQlzbnByaW50Zih3LT5uYW1lLCBuYW1lX2xlbiwgIiVzIiwgd2lkZ2V0LT5uYW1lKTsKIAorCXN3aXRjaCAody0+aWQpIHsKKwljYXNlIHNuZF9zb2NfZGFwbV9zd2l0Y2g6CisJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CisJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOgorCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcjsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCWNhc2Ugc25kX3NvY19kYXBtX3ZpcnRfbXV4OgorCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKKwkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKKwljYXNlIHNuZF9zb2NfZGFwbV9haWZfb3V0OgorCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fYWRjX2NoZWNrX3Bvd2VyOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9kYWM6CisJY2FzZSBzbmRfc29jX2RhcG1fYWlmX2luOgorCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZGFjX2NoZWNrX3Bvd2VyOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CisJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKKwljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKKwljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CisJY2FzZSBzbmRfc29jX2RhcG1fbWljYmlhczoKKwljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJY2FzZSBzbmRfc29jX2RhcG1faHA6CisJY2FzZSBzbmRfc29jX2RhcG1fbWljOgorCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6CisJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9zdXBwbHk6CisJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9zdXBwbHlfY2hlY2tfcG93ZXI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9hbHdheXNfb25fY2hlY2tfcG93ZXI7CisJCWJyZWFrOworCX0KKwogCWRhcG0tPm5fd2lkZ2V0cysrOwogCXctPmRhcG0gPSBkYXBtOwogCXctPmNvZGVjID0gZGFwbS0+Y29kZWM7CkBAIC0yNTM3LDYgKzI3MTYsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZ3LT5zb3VyY2VzKTsKIAlJTklUX0xJU1RfSEVBRCgmdy0+c2lua3MpOwogCUlOSVRfTElTVF9IRUFEKCZ3LT5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmdy0+ZGlydHkpOwogCWxpc3RfYWRkKCZ3LT5saXN0LCAmZGFwbS0+Y2FyZC0+d2lkZ2V0cyk7CiAKIAkvKiBtYWNoaW5lIGxheWVyIHNldCB1cHMgdW5jb25uZWN0ZWQgcGlucyBhbmQgaW5zZXJ0aW9ucyAqLwpAQCAtMjU4NCw5ICsyNzY0LDEwIEBACiAJewogCQlpZiAoIXctPnNuYW1lIHx8IHctPmRhcG0gIT0gZGFwbSkKIAkJCWNvbnRpbnVlOwotCQlkZXZfZGJnKHctPmRhcG0tPmRldiwgIndpZGdldCAlc1xuICVzIHN0cmVhbSAlcyBldmVudCAlZFxuIiwKKwkJZGV2X3ZkYmcody0+ZGFwbS0+ZGV2LCAid2lkZ2V0ICVzXG4gJXMgc3RyZWFtICVzIGV2ZW50ICVkXG4iLAogCQkJdy0+bmFtZSwgdy0+c25hbWUsIHN0cmVhbSwgZXZlbnQpOwogCQlpZiAoc3Ryc3RyKHctPnNuYW1lLCBzdHJlYW0pKSB7CisJCQlkYXBtX21hcmtfZGlydHkodywgInN0cmVhbSBldmVudCIpOwogCQkJc3dpdGNoKGV2ZW50KSB7CiAJCQljYXNlIFNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQ6CiAJCQkJdy0+YWN0aXZlID0gMTsKQEAgLTI2MDQsNiArMjc4NSwxMCBAQAogCX0KIAogCWRhcG1fcG93ZXJfd2lkZ2V0cyhkYXBtLCBldmVudCk7CisKKwkvKiBkbyB3ZSBuZWVkIHRvIG5vdGlmeSBhbnkgY2xpZW50cyB0aGF0IERBUE0gc3RyZWFtIGlzIGNvbXBsZXRlICovCisJaWYgKGRhcG0tPnN0cmVhbV9ldmVudCkKKwkJZGFwbS0+c3RyZWFtX2V2ZW50KGRhcG0sIGV2ZW50KTsKIH0KIAogLyoqCkBAIC0yNjcyLDYgKzI4NTcsNyBAQAogCWRldl9kYmcody0+ZGFwbS0+ZGV2LCAiZGFwbTogZm9yY2UgZW5hYmxlIHBpbiAlc1xuIiwgcGluKTsKIAl3LT5jb25uZWN0ZWQgPSAxOwogCXctPmZvcmNlID0gMTsKKwlkYXBtX21hcmtfZGlydHkodywgImZvcmNlIGVuYWJsZSIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWlvLmMgYi9zb3VuZC9zb2Mvc29jLWlvLmMKaW5kZXggYTYyZjdkZC4uYzg2MTBjYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1pby5jCisrKyBiL3NvdW5kL3NvYy9zb2MtaW8uYwpAQCAtMTMsMjYgKzEzLDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYXNvYy5oPgogCi0jaWZkZWYgQ09ORklHX1NQSV9NQVNURVIKLXN0YXRpYyBpbnQgZG9fc3BpX3dyaXRlKHZvaWQgKmNvbnRyb2wsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGNvbnRyb2w7Ci0JaW50IHJldDsKLQotCXJldCA9IHNwaV93cml0ZShzcGksIGRhdGEsIGxlbik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gbGVuOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZG9faHdfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkgICAgICAgdW5zaWduZWQgaW50IHZhbHVlLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKQorI2lmZGVmIENPTkZJR19SRUdNQVAKK3N0YXRpYyBpbnQgaHdfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkgICAgdW5zaWduZWQgaW50IHZhbHVlKQogewogCWludCByZXQ7CiAKQEAgLTQ5LDEzICszOCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCXJldCA9IGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCBsZW4pOwotCWlmIChyZXQgPT0gbGVuKQotCQlyZXR1cm4gMDsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQllbHNlCi0JCXJldHVybiAtRUlPOworCXJldHVybiByZWdtYXBfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgcmVnLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaHdfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcpCkBAIC02OSw4ICs1MiwxMSBAQAogCQlpZiAoY29kZWMtPmNhY2hlX29ubHkpCiAJCQlyZXR1cm4gLTE7CiAKLQkJQlVHX09OKCFjb2RlYy0+aHdfcmVhZCk7Ci0JCXJldHVybiBjb2RlYy0+aHdfcmVhZChjb2RlYywgcmVnKTsKKwkJcmV0ID0gcmVnbWFwX3JlYWQoY29kZWMtPmNvbnRyb2xfZGF0YSwgcmVnLCAmdmFsKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOwogCX0KIAogCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgcmVnLCAmdmFsKTsKQEAgLTc5LDIwMiArNjUsMTggQEAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgaW50IHNuZF9zb2NfNF8xMl93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTE2IGRhdGE7Ci0KLQlkYXRhID0gY3B1X3RvX2JlMTYoKHJlZyA8PCAxMikgfCAodmFsdWUgJiAweGZmZmZmZikpOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCAmZGF0YSwgMik7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvY183Xzlfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkJICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTE2IGRhdGE7Ci0KLQlkYXRhID0gY3B1X3RvX2JlMTYoKHJlZyA8PCA5KSB8ICh2YWx1ZSAmIDB4MWZmKSk7Ci0KLQlyZXR1cm4gZG9faHdfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUsICZkYXRhLCAyKTsKLX0KLQotc3RhdGljIGludCBzbmRfc29jXzhfOF93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCi0JCQkgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1OCBkYXRhWzJdOwotCi0JcmVnICY9IDB4ZmY7Ci0JZGF0YVswXSA9IHJlZzsKLQlkYXRhWzFdID0gdmFsdWUgJiAweGZmOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCAyKTsKLX0KLQotc3RhdGljIGludCBzbmRfc29jXzhfMTZfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkJICAgICAgdW5zaWduZWQgaW50IHZhbHVlKQotewotCXU4IGRhdGFbM107Ci0JdTE2IHZhbCA9IGNwdV90b19iZTE2KHZhbHVlKTsKLQotCWRhdGFbMF0gPSByZWc7Ci0JbWVtY3B5KCZkYXRhWzFdLCAmdmFsLCBzaXplb2YodmFsKSk7Ci0KLQlyZXR1cm4gZG9faHdfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUsIGRhdGEsIDMpOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCAoZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotc3RhdGljIHVuc2lnbmVkIGludCBkb19pMmNfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJdm9pZCAqcmVnLCBpbnQgcmVnbGVuLAotCQkJCXZvaWQgKmRhdGEsIGludCBkYXRhbGVuKQotewotCXN0cnVjdCBpMmNfbXNnIHhmZXJbMl07Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKLQotCS8qIFdyaXRlIHJlZ2lzdGVyICovCi0JeGZlclswXS5hZGRyID0gY2xpZW50LT5hZGRyOwotCXhmZXJbMF0uZmxhZ3MgPSAwOwotCXhmZXJbMF0ubGVuID0gcmVnbGVuOwotCXhmZXJbMF0uYnVmID0gcmVnOwotCi0JLyogUmVhZCBkYXRhICovCi0JeGZlclsxXS5hZGRyID0gY2xpZW50LT5hZGRyOwotCXhmZXJbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKLQl4ZmVyWzFdLmxlbiA9IGRhdGFsZW47Ci0JeGZlclsxXS5idWYgPSBkYXRhOwotCi0JcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgeGZlciwgMik7Ci0JaWYgKHJldCA9PSAyKQotCQlyZXR1cm4gMDsKLQllbHNlIGlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCWVsc2UKLQkJcmV0dXJuIC1FSU87Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY184XzhfcmVhZF9pMmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgdW5zaWduZWQgaW50IHIpCi17Ci0JdTggcmVnID0gcjsKLQl1OCBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBkb19pMmNfcmVhZChjb2RlYywgJnJlZywgMSwgJmRhdGEsIDEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gZGF0YTsKLX0KLSNlbHNlCi0jZGVmaW5lIHNuZF9zb2NfOF84X3JlYWRfaTJjIE5VTEwKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCAoZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzhfMTZfcmVhZF9pMmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgIHVuc2lnbmVkIGludCByKQotewotCXU4IHJlZyA9IHI7Ci0JdTE2IGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IGRvX2kyY19yZWFkKGNvZGVjLCAmcmVnLCAxLCAmZGF0YSwgMik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiAoZGF0YSA+PiA4KSB8ICgoZGF0YSAmIDB4ZmYpIDw8IDgpOwotfQotI2Vsc2UKLSNkZWZpbmUgc25kX3NvY184XzE2X3JlYWRfaTJjIE5VTEwKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCAoZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzE2XzhfcmVhZF9pMmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgIHVuc2lnbmVkIGludCByKQotewotCXUxNiByZWcgPSByOwotCXU4IGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IGRvX2kyY19yZWFkKGNvZGVjLCAmcmVnLCAyLCAmZGF0YSwgMSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiBkYXRhOwotfQotI2Vsc2UKLSNkZWZpbmUgc25kX3NvY18xNl84X3JlYWRfaTJjIE5VTEwKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY18xNl84X3JlYWRfc3BpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcikKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKLQotCWNvbnN0IHUxNiByZWcgPSBjcHVfdG9fYmUxNihyIHwgMHgxMDApOwotCXU4IGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmcmVnLCAyLCAmZGF0YSwgMSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiBkYXRhOwotfQotI2Vsc2UKLSNkZWZpbmUgc25kX3NvY18xNl84X3JlYWRfc3BpIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IHNuZF9zb2NfMTZfOF93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTggZGF0YVszXTsKLQl1MTYgcnZhbCA9IGNwdV90b19iZTE2KHJlZyk7Ci0KLQltZW1jcHkoZGF0YSwgJnJ2YWwsIHNpemVvZihydmFsKSk7Ci0JZGF0YVsyXSA9IHZhbHVlOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCAzKTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY18xNl8xNl9yZWFkX2kyYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgIHVuc2lnbmVkIGludCByKQotewotCXUxNiByZWcgPSBjcHVfdG9fYmUxNihyKTsKLQl1MTYgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG9faTJjX3JlYWQoY29kZWMsICZyZWcsIDIsICZkYXRhLCAyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGJlMTZfdG9fY3B1KGRhdGEpOwotfQotI2Vsc2UKLSNkZWZpbmUgc25kX3NvY18xNl8xNl9yZWFkX2kyYyBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBzbmRfc29jXzE2XzE2X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTE2IGRhdGFbMl07Ci0KLQlkYXRhWzBdID0gY3B1X3RvX2JlMTYocmVnKTsKLQlkYXRhWzFdID0gY3B1X3RvX2JlMTYodmFsdWUpOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCBzaXplb2YoZGF0YSkpOwotfQotCiAvKiBQcmltaXRpdmUgYnVsayB3cml0ZSBzdXBwb3J0IGZvciBzb2MtY2FjaGUuICBUaGUgZGF0YSBwb2ludGVkIHRvIGJ5Ci0gKiBgZGF0YScgbmVlZHMgdG8gYWxyZWFkeSBiZSBpbiB0aGUgZm9ybSB0aGUgaGFyZHdhcmUgZXhwZWN0cwotICogaW5jbHVkaW5nIGFueSBsZWFkaW5nIHJlZ2lzdGVyIHNwZWNpZmljIGRhdGEuICBBbnkgZGF0YSB3cml0dGVuCi0gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZ28gdGhyb3VnaCB0aGUgY2FjaGUgYXMgaXQgb25seQotICogaGFuZGxlcyB3cml0aW5nIHRvIHZvbGF0aWxlIG9yIG91dCBvZiBib3VuZHMgcmVnaXN0ZXJzLgorICogYGRhdGEnIG5lZWRzIHRvIGFscmVhZHkgYmUgaW4gdGhlIGZvcm0gdGhlIGhhcmR3YXJlIGV4cGVjdHMuICBBbnkKKyAqIGRhdGEgd3JpdHRlbiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZ28gdGhyb3VnaCB0aGUgY2FjaGUgYXMKKyAqIGl0IG9ubHkgaGFuZGxlcyB3cml0aW5nIHRvIHZvbGF0aWxlIG9yIG91dCBvZiBib3VuZHMgcmVnaXN0ZXJzLgorICoKKyAqIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2VzIHVzaW5nIHRoZSByZWdtYXAgQVBJCisgKiB3cmFwcGVycy4KICAqLwotc3RhdGljIGludCBzbmRfc29jX2h3X2J1bGtfd3JpdGVfcmF3KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKK3N0YXRpYyBpbnQgc25kX3NvY19od19idWxrX3dyaXRlX3JhdyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnLAogCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKIHsKLQlpbnQgcmV0OwotCiAJLyogVG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgZ2V0IG91dCBvZiBzeW5jIHdpdGggdGhlIGNhY2hlLCBjaGVjawogCSAqIHdoZXRoZXIgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgdm9sYXRpbGUgb3IgaWYgd2UndmUgZGlyZWN0bHkgYXNrZWQKIAkgKiB0byBieXBhc3MgdGhlIGNhY2hlLiAgT3V0IG9mIGJvdW5kcyByZWdpc3RlcnMgYXJlIGNvbnNpZGVyZWQKQEAgLTI4NSw2OCArODcsOSBAQAogCSAgICAmJiByZWcgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzd2l0Y2ggKGNvZGVjLT5jb250cm9sX3R5cGUpIHsKLSNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IChkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCi0JY2FzZSBTTkRfU09DX0kyQzoKLQkJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHRvX2kyY19jbGllbnQoY29kZWMtPmRldiksIGRhdGEsIGxlbik7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLQljYXNlIFNORF9TT0NfU1BJOgotCQlyZXQgPSBzcGlfd3JpdGUodG9fc3BpX2RldmljZShjb2RlYy0+ZGV2KSwgZGF0YSwgbGVuKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLQlpZiAocmV0ID09IGxlbikKLQkJcmV0dXJuIDA7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gcmVnbWFwX3Jhd193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCByZWcsIGRhdGEsIGxlbik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgewotCWludCBhZGRyX2JpdHM7Ci0JaW50IGRhdGFfYml0czsKLQlpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci0JdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKLQl1bnNpZ25lZCBpbnQgKCppMmNfcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKLQl1bnNpZ25lZCBpbnQgKCpzcGlfcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKLX0gaW9fdHlwZXNbXSA9IHsKLQl7Ci0JCS5hZGRyX2JpdHMgPSA0LCAuZGF0YV9iaXRzID0gMTIsCi0JCS53cml0ZSA9IHNuZF9zb2NfNF8xMl93cml0ZSwKLQl9LAotCXsKLQkJLmFkZHJfYml0cyA9IDcsIC5kYXRhX2JpdHMgPSA5LAotCQkud3JpdGUgPSBzbmRfc29jXzdfOV93cml0ZSwKLQl9LAotCXsKLQkJLmFkZHJfYml0cyA9IDgsIC5kYXRhX2JpdHMgPSA4LAotCQkud3JpdGUgPSBzbmRfc29jXzhfOF93cml0ZSwKLQkJLmkyY19yZWFkID0gc25kX3NvY184XzhfcmVhZF9pMmMsCi0JfSwKLQl7Ci0JCS5hZGRyX2JpdHMgPSA4LCAuZGF0YV9iaXRzID0gMTYsCi0JCS53cml0ZSA9IHNuZF9zb2NfOF8xNl93cml0ZSwKLQkJLmkyY19yZWFkID0gc25kX3NvY184XzE2X3JlYWRfaTJjLAotCX0sCi0JewotCQkuYWRkcl9iaXRzID0gMTYsIC5kYXRhX2JpdHMgPSA4LAotCQkud3JpdGUgPSBzbmRfc29jXzE2Xzhfd3JpdGUsCi0JCS5pMmNfcmVhZCA9IHNuZF9zb2NfMTZfOF9yZWFkX2kyYywKLQkJLnNwaV9yZWFkID0gc25kX3NvY18xNl84X3JlYWRfc3BpLAotCX0sCi0JewotCQkuYWRkcl9iaXRzID0gMTYsIC5kYXRhX2JpdHMgPSAxNiwKLQkJLndyaXRlID0gc25kX3NvY18xNl8xNl93cml0ZSwKLQkJLmkyY19yZWFkID0gc25kX3NvY18xNl8xNl9yZWFkX2kyYywKLQl9LAotfTsKLQogLyoqCiAgKiBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbzogU2V0IHVwIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMuCiAgKgpAQCAtMzcwLDUwICsxMTMsNTEgQEAKIAkJCSAgICAgICBpbnQgYWRkcl9iaXRzLCBpbnQgZGF0YV9iaXRzLAogCQkJICAgICAgIGVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbCkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjb25maWc7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpb190eXBlcyk7IGkrKykKLQkJaWYgKGlvX3R5cGVzW2ldLmFkZHJfYml0cyA9PSBhZGRyX2JpdHMgJiYKLQkJICAgIGlvX3R5cGVzW2ldLmRhdGFfYml0cyA9PSBkYXRhX2JpdHMpCi0JCQlicmVhazsKLQlpZiAoaSA9PSBBUlJBWV9TSVpFKGlvX3R5cGVzKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJObyBJL08gZnVuY3Rpb25zIGZvciAlZCBiaXQgYWRkcmVzcyAlZCBiaXQgZGF0YVxuIiwKLQkJICAgICAgIGFkZHJfYml0cywgZGF0YV9iaXRzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY29kZWMtPndyaXRlID0gaW9fdHlwZXNbaV0ud3JpdGU7CisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwljb2RlYy0+d3JpdGUgPSBod193cml0ZTsKIAljb2RlYy0+cmVhZCA9IGh3X3JlYWQ7CiAJY29kZWMtPmJ1bGtfd3JpdGVfcmF3ID0gc25kX3NvY19od19idWxrX3dyaXRlX3JhdzsKIAorCWNvbmZpZy5yZWdfYml0cyA9IGFkZHJfYml0czsKKwljb25maWcudmFsX2JpdHMgPSBkYXRhX2JpdHM7CisKIAlzd2l0Y2ggKGNvbnRyb2wpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19SRUdNQVBfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19SRUdNQVBfSTJDX01PRFVMRSkKIAljYXNlIFNORF9TT0NfSTJDOgotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLQkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotI2VuZGlmCi0JCWlmIChpb190eXBlc1tpXS5pMmNfcmVhZCkKLQkJCWNvZGVjLT5od19yZWFkID0gaW9fdHlwZXNbaV0uaTJjX3JlYWQ7Ci0KLQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LAotCQkJCQkJICAgc3RydWN0IGkyY19jbGllbnQsCi0JCQkJCQkgICBkZXYpOworCQljb2RlYy0+Y29udHJvbF9kYXRhID0gcmVnbWFwX2luaXRfaTJjKHRvX2kyY19jbGllbnQoY29kZWMtPmRldiksCisJCQkJCQkgICAgICAmY29uZmlnKTsKIAkJYnJlYWs7CisjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1JFR01BUF9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1JFR01BUF9TUElfTU9EVUxFKQogCWNhc2UgU05EX1NPQ19TUEk6Ci0jaWZkZWYgQ09ORklHX1NQSV9NQVNURVIKLQkJY29kZWMtPmh3X3dyaXRlID0gZG9fc3BpX3dyaXRlOwotI2VuZGlmCi0JCWlmIChpb190eXBlc1tpXS5zcGlfcmVhZCkKLQkJCWNvZGVjLT5od19yZWFkID0gaW9fdHlwZXNbaV0uc3BpX3JlYWQ7Ci0KLQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LAotCQkJCQkJICAgc3RydWN0IHNwaV9kZXZpY2UsCi0JCQkJCQkgICBkZXYpOworCQljb2RlYy0+Y29udHJvbF9kYXRhID0gcmVnbWFwX2luaXRfc3BpKHRvX3NwaV9kZXZpY2UoY29kZWMtPmRldiksCisJCQkJCQkgICAgICAmY29uZmlnKTsKIAkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgU05EX1NPQ19SRUdNQVA6CisJCS8qIERldmljZSBoYXMgbWFkZSBpdHMgb3duIHJlZ21hcCBhcnJhbmdlbWVudHMgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoSVNfRVJSKGNvZGVjLT5jb250cm9sX2RhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8pOwotCisjZWxzZQoraW50IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBpbnQgYWRkcl9iaXRzLCBpbnQgZGF0YV9iaXRzLAorCQkJICAgICAgIGVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbCkKK3sKKwlyZXR1cm4gLUVOT1RTVVBQOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8pOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWphY2suYyBiL3NvdW5kL3NvYy9zb2MtamFjay5jCmluZGV4IGZhMzFkOWMuLjZjNWViZDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtamFjay5jCisrKyBiL3NvdW5kL3NvYy9zb2MtamFjay5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYXNvYy5oPgogCiAvKioKQEAgLTE4OCw2ICsxODksOCBAQAogCQlsaXN0X2FkZCgmKHBpbnNbaV0ubGlzdCksICZqYWNrLT5waW5zKTsKIAl9CiAKKwlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoJmphY2stPmNvZGVjLT5jYXJkLT5kYXBtKTsKKwogCS8qIFVwZGF0ZSB0byByZWZsZWN0IHRoZSBsYXN0IHJlcG9ydGVkIHN0YXR1czsgY2FubmVkIGphY2sKIAkgKiBpbXBsZW1lbnRhdGlvbnMgYXJlIGxpa2VseSB0byBzZXQgdGhlaXIgc3RhdGUgYmVmb3JlIHRoZQogCSAqIGNhcmQgaGFzIGFuIG9wcG9ydHVuaXR5IHRvIGFzc29jaWF0ZSBwaW5zLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1wY20uYyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKaW5kZXggMjg3OWM4OC4uZWUxNTMzNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1wY20uYworKysgYi9zb3VuZC9zb2Mvc29jLXBjbS5jCkBAIC0yNywxNyArMjcsMTMgQEAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKLXN0YXRpYyBERUZJTkVfTVVURVgocGNtX211dGV4KTsKLQotc3RhdGljIGludCBzb2NfcGNtX2FwcGx5X3N5bW1ldHJ5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc3RhdGljIGludCBzb2NfcGNtX2FwcGx5X3N5bW1ldHJ5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKnNvY19kYWkpCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwogCWludCByZXQ7CiAKLQlpZiAoIWNvZGVjX2RhaS0+ZHJpdmVyLT5zeW1tZXRyaWNfcmF0ZXMgJiYKLQkgICAgIWNwdV9kYWktPmRyaXZlci0+c3ltbWV0cmljX3JhdGVzICYmCisJaWYgKCFzb2NfZGFpLT5kcml2ZXItPnN5bW1ldHJpY19yYXRlcyAmJgogCSAgICAhcnRkLT5kYWlfbGluay0+c3ltbWV0cmljX3JhdGVzKQogCQlyZXR1cm4gMDsKIApAQCAtNDUsMTkgKzQxLDE5IEBACiAJICogdGhlIHNlY29uZCBjYW4gbmVlZCB0byBnZXQgaXRzIGNvbnN0cmFpbnRzIGJlZm9yZSB0aGUgZmlyc3QgaGFzCiAJICogcGlja2VkIGEgcmF0ZS4gIENvbXBsYWluIGFuZCBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gY2Fycnkgb24uCiAJICovCi0JaWYgKCFydGQtPnJhdGUpIHsKLQkJZGV2X3dhcm4oJnJ0ZC0+ZGV2LAorCWlmICghc29jX2RhaS0+cmF0ZSkgeworCQlkZXZfd2Fybihzb2NfZGFpLT5kZXYsCiAJCQkgIk5vdCBlbmZvcmNpbmcgc3ltbWV0cmljX3JhdGVzIGR1ZSB0byByYWNlXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZGV2X2RiZygmcnRkLT5kZXYsICJTeW1tZXRyeSBmb3JjZXMgJWRIeiByYXRlXG4iLCBydGQtPnJhdGUpOworCWRldl9kYmcoc29jX2RhaS0+ZGV2LCAiU3ltbWV0cnkgZm9yY2VzICVkSHogcmF0ZVxuIiwgc29jX2RhaS0+cmF0ZSk7CiAKIAlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKIAkJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCi0JCQkJCSAgIHJ0ZC0+cmF0ZSwgcnRkLT5yYXRlKTsKKwkJCQkJICAgc29jX2RhaS0+cmF0ZSwgc29jX2RhaS0+cmF0ZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcnRkLT5kZXYsCisJCWRldl9lcnIoc29jX2RhaS0+ZGV2LAogCQkJIlVuYWJsZSB0byBhcHBseSByYXRlIHN5bW1ldHJ5IGNvbnN0cmFpbnQ6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE4Nyw4ICsxODMsMTQgQEAKIAl9CiAKIAkvKiBTeW1tZXRyeSBvbmx5IGFwcGxpZXMgaWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYWN0aXZlIHN0cmVhbS4gKi8KLQlpZiAoY3B1X2RhaS0+YWN0aXZlIHx8IGNvZGVjX2RhaS0+YWN0aXZlKSB7Ci0JCXJldCA9IHNvY19wY21fYXBwbHlfc3ltbWV0cnkoc3Vic3RyZWFtKTsKKwlpZiAoY3B1X2RhaS0+YWN0aXZlKSB7CisJCXJldCA9IHNvY19wY21fYXBwbHlfc3ltbWV0cnkoc3Vic3RyZWFtLCBjcHVfZGFpKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBjb25maWdfZXJyOworCX0KKworCWlmIChjb2RlY19kYWktPmFjdGl2ZSkgeworCQlyZXQgPSBzb2NfcGNtX2FwcGx5X3N5bW1ldHJ5KHN1YnN0cmVhbSwgY29kZWNfZGFpKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJZ290byBjb25maWdfZXJyOwogCX0KQEAgLTI5MCw4ICsyOTIsMTIgQEAKIAljb2RlY19kYWktPmFjdGl2ZS0tOwogCWNvZGVjLT5hY3RpdmUtLTsKIAotCWlmICghY3B1X2RhaS0+YWN0aXZlICYmICFjb2RlY19kYWktPmFjdGl2ZSkKLQkJcnRkLT5yYXRlID0gMDsKKwkvKiBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBEQUlzIHJhdGUgd2hlbiBpbmFjdGl2ZSAqLworCWlmICghY3B1X2RhaS0+YWN0aXZlKQorCQljcHVfZGFpLT5yYXRlID0gMDsKKworCWlmICghY29kZWNfZGFpLT5hY3RpdmUpCisJCWNvZGVjX2RhaS0+cmF0ZSA9IDA7CiAKIAkvKiBNdXRpbmcgdGhlIERBQyBzdXBwcmVzc2VzIGFydGlmYWN0cyBjYXVzZWQgZHVyaW5nIGRpZ2l0YWwKIAkgKiBzaHV0ZG93biwgZm9yIGV4YW1wbGUgZnJvbSBzdG9wcGluZyBjbG9ja3MuCkBAIC0zMTMsMTAgKzMxOSwxNyBAQAogCWNwdV9kYWktPnJ1bnRpbWUgPSBOVUxMOwogCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJLyogc3RhcnQgZGVsYXllZCBwb3Agd3EgaGVyZSBmb3IgcGxheWJhY2sgc3RyZWFtcyAqLwotCQljb2RlY19kYWktPnBvcF93YWl0ID0gMTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZydGQtPmRlbGF5ZWRfd29yaywKLQkJCW1zZWNzX3RvX2ppZmZpZXMocnRkLT5wbWRvd25fdGltZSkpOworCQlpZiAodW5saWtlbHkoY29kZWMtPmlnbm9yZV9wbWRvd25fdGltZSkpIHsKKwkJCS8qIHBvd2VyZWQgZG93biBwbGF5YmFjayBzdHJlYW0gbm93ICovCisJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHJ0ZCwKKwkJCQljb2RlY19kYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUsCisJCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHN0YXJ0IGRlbGF5ZWQgcG9wIHdxIGhlcmUgZm9yIHBsYXliYWNrIHN0cmVhbXMgKi8KKwkJCWNvZGVjX2RhaS0+cG9wX3dhaXQgPSAxOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZydGQtPmRlbGF5ZWRfd29yaywKKwkJCQltc2Vjc190b19qaWZmaWVzKHJ0ZC0+cG1kb3duX3RpbWUpKTsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIGNhcHR1cmUgc3RyZWFtcyBjYW4gYmUgcG93ZXJlZCBkb3duIG5vdyAqLwogCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHJ0ZCwKQEAgLTQ0OSw3ICs0NjIsOSBAQAogCQl9CiAJfQogCi0JcnRkLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwkvKiBzdG9yZSB0aGUgcmF0ZSBmb3IgZWFjaCBEQUlzICovCisJY3B1X2RhaS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJY29kZWNfZGFpLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAogb3V0OgogCW11dGV4X3VubG9jaygmcnRkLT5wY21fbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy11dGlscy5jIGIvc291bmQvc29jL3NvYy11dGlscy5jCmluZGV4IGVjOTIxZWMuLjBjMTJiOTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtdXRpbHMuYworKysgYi9zb3VuZC9zb2Mvc29jLXV0aWxzLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9hc29jX3V0aWxzLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfYXNvY191dGlscy5jCmluZGV4IGRmYTg1Y2IuLmY4NDI4ZTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9hc29jX3V0aWxzLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2Fzb2NfdXRpbHMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAidGVncmFfYXNvY191dGlscy5oIgogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfZGFzLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfZGFzLmMKaW5kZXggOWYyNGVmNy4uM2I1NWE0NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2Rhcy5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9kYXMuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiBlcnJfZnJlZToKIAlrZnJlZShkYXMpOwotCWRhcyA9IDA7CisJZGFzID0gTlVMTDsKIGV4aXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIzNCw3ICsyMzQsNyBAQAogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCiAJa2ZyZWUoZGFzKTsKLQlkYXMgPSAwOworCWRhcyA9IE5VTEw7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9pMnMuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9pMnMuYwppbmRleCBmMzZiOTk2Li42NzI4ZmFiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfaTJzLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2kycy5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkudHJpZ2dlcgk9IHRlZ3JhX2kyc190cmlnZ2VyLAogfTsKIAotc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB0ZWdyYV9pMnNfZGFpW10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB0ZWdyYV9pMnNfZGFpW10gPSB7CiAJewogCQkubmFtZSA9IERSVl9OQU1FICIuMCIsCiAJCS5wcm9iZSA9IHRlZ3JhX2kyc19wcm9iZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9wY20uYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9wY20uYwppbmRleCBjN2NmZDk2Li40MzZkZWYxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfcGNtLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3BjbS5jCkBAIC0zNjcsNyArMzY3LDcgQEAKIAl0ZWdyYV9wY21fZGVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CiB9CiAKLXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciB0ZWdyYV9wY21fcGxhdGZvcm0gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX3BjbV9wbGF0Zm9ybSA9IHsKIAkub3BzCQk9ICZ0ZWdyYV9wY21fb3BzLAogCS5wY21fbmV3CT0gdGVncmFfcGNtX25ldywKIAkucGNtX2ZyZWUJPSB0ZWdyYV9wY21fZnJlZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9zcGRpZi5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3NwZGlmLmMKaW5kZXggYWJlNjA2Yi4uZGQxMWQwYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3NwZGlmLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3NwZGlmLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXY7CiAJc3RydWN0IHRlZ3JhX3NwZGlmICpzcGRpZiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0JaW50IHJldCwgc3JhdGUsIHNwZGlmY2xvY2s7CisJaW50IHJldCwgc3BkaWZjbG9jazsKIAogCXNwZGlmLT5yZWdfY3RybCAmPSB+VEVHUkFfU1BESUZfQ1RSTF9QQUNLOwogCXNwZGlmLT5yZWdfY3RybCAmPSB+VEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV9NQVNLOwpAQCAtMTQwLDcgKzE0MCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNyYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKIAljYXNlIDMyMDAwOgogCQlzcGRpZmNsb2NrID0gNDA5NjAwMDsKQEAgLTIzMiw3ICsyMzEsNyBAQAogCS50cmlnZ2VyCT0gdGVncmFfc3BkaWZfdHJpZ2dlciwKIH07CiAKLXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdGVncmFfc3BkaWZfZGFpID0geworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdGVncmFfc3BkaWZfZGFpID0gewogCS5uYW1lID0gRFJWX05BTUUsCiAJLnByb2JlID0gdGVncmFfc3BkaWZfcHJvYmUsCiAJLnBsYXliYWNrID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtODkwMy5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtODkwMy5jCmluZGV4IGJlMjdmMWQuLmE4MWNmMzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTg5MDMuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfd204OTAzLmMKQEAgLTMzOSw4ICszMzksNiBAQAogCQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FT1VUTCIpOwogCX0KIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90cmltc2xpY2UuYyBiL3NvdW5kL3NvYy90ZWdyYS90cmltc2xpY2UuYwppbmRleCA4ZmMwN2U5Li5iM2E3ZWZhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdHJpbXNsaWNlLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RyaW1zbGljZS5jCkBAIC0xMjQsOCArMTI0LDYgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJSSFBPVVQiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUNJTiIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3R4eDkvdHh4OWFjbGMtYWM5Ny5jIGIvc291bmQvc29jL3R4eDkvdHh4OWFjbGMtYWM5Ny5jCmluZGV4IDc0M2QwN2IuLmE0ZTNmNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90eHg5L3R4eDlhY2xjLWFjOTcuYworKysgYi9zb3VuZC9zb2MvdHh4OS90eHg5YWNsYy1hYzk3LmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWlmICghZHJ2ZGF0YS0+YmFzZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgdHh4OWFjbGNfYWM5N19pcnEsCi0JCQkgICAgICAgSVJRRl9ESVNBQkxFRCwgZGV2X25hbWUoJnBkZXYtPmRldiksIGRydmRhdGEpOworCQkJICAgICAgIDAsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBkcnZkYXRhKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3R4eDkvdHh4OWFjbGMtZ2VuZXJpYy5jIGIvc291bmQvc29jL3R4eDkvdHh4OWFjbGMtZ2VuZXJpYy5jCmluZGV4IDY3NzBlNzEuLjliNWUyODMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90eHg5L3R4eDlhY2xjLWdlbmVyaWMuYworKysgYi9zb3VuZC9zb2MvdHh4OS90eHg5YWNsYy1nZW5lcmljLmMKQEAgLTYyLDcgKzYyLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHh4OWFjbGNfZ2VuZXJpY19kcml2ZXIgPSB7Ci0JLnJlbW92ZSA9IHR4eDlhY2xjX2dlbmVyaWNfcmVtb3ZlLAorCS5yZW1vdmUgPSBfX2V4aXRfcCh0eHg5YWNsY19nZW5lcmljX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAidHh4OWFjbGMtZ2VuZXJpYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvYW1kNzkzMC5jIGIvc291bmQvc3BhcmMvYW1kNzkzMC5jCmluZGV4IGFkN2Q0ZDcuLmYwMzY3NzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2FtZDc5MzAuYworKysgYi9zb3VuZC9zcGFyYy9hbWQ3OTMwLmMKQEAgLTk2Miw3ICs5NjIsNyBAQAogCWFtZDc5MzBfaWRsZShhbWQpOwogCiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX2FtZDc5MzBfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELCAiYW1kNzkzMCIsIGFtZCkpIHsKKwkJCUlSUUZfU0hBUkVELCAiYW1kNzkzMCIsIGFtZCkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiYW1kNzkzMC0lZDogVW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLAogCQkJICAgZGV2LCBpcnEpOwogCQlzbmRfYW1kNzkzMF9mcmVlKGFtZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zcGFyYy9kYnJpLmMgYi9zb3VuZC9zcGFyYy9kYnJpLmMKaW5kZXggMWI4MzlhMC4uNGE0ZjFkNyAxMDA2NDQKLS0tIGEvc291bmQvc3BhcmMvZGJyaS5jCisrKyBiL3NvdW5kL3NwYXJjL2RicmkuYwpAQCAtNzAsNiArNzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlJ1ZG9sZiBLb2VuaWcsIEJyZW50IEJhY2NhbGEgYW5kIE1hcnRpbiBIYWJldHMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3VuIERCUkkiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eC5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4LmMKaW5kZXggZjE2YTNmYy4uOTM1MjIwNyAxMDA2NDQKLS0tIGEvc291bmQvc3ludGgvZW11eC9lbXV4LmMKKysrIGIvc291bmQvc3ludGgvZW11eC9lbXV4LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZW11eF9zeW50aC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJlbXV4X3ZvaWNlLmgiCiAKIE1PRFVMRV9BVVRIT1IoIlRha2FzaGkgSXdhaSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc3ludGgvZW11eC9lbXV4X29zcy5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4X29zcy5jCmluZGV4IDg3ZTQyMjAuLjMxOTc1NGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9vc3MuYworKysgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfb3NzLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2lmZGVmIENPTkZJR19TTkRfU0VRVUVOQ0VSX09TUwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiZW11eF92b2ljZS5oIgpkaWZmIC0tZ2l0IGEvc291bmQvc3ludGgvZW11eC9lbXV4X3NlcS5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4X3NlcS5jCmluZGV4IGNhNWY3ZWYuLjc3NzhiOGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zZXEuYworKysgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc2VxLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgImVtdXhfdm9pY2UuaCIKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucyAqLwogc3RhdGljIHZvaWQgZnJlZV9wb3J0KHZvaWQgKnByaXZhdGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc3ludGgvZW11eC9lbXV4X3N5bnRoLmMgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc3ludGguYwppbmRleCAzZTkyMWIzLi45YTM4ZGU0IDEwMDY0NAotLS0gYS9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc3ludGguYworKysgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc3ludGguYwpAQCAtMjIsNiArMjIsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZW11eF92b2ljZS5oIgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvc291bmRmb250LmMgYi9zb3VuZC9zeW50aC9lbXV4L3NvdW5kZm9udC5jCmluZGV4IDY3YzkxMjMuLjExMzdiODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvc291bmRmb250LmMKKysrIGIvc291bmQvc3ludGgvZW11eC9zb3VuZGZvbnQuYwpAQCAtMjcsNiArMjcsNyBAQAogICovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvdW5kZm9udC5oPgogI2luY2x1ZGUgPHNvdW5kL3NlcV9vc3NfbGVnYWN5Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zeW50aC91dGlsX21lbS5jIGIvc291bmQvc3ludGgvdXRpbF9tZW0uYwppbmRleCBjODU1MjJlLi44ZTM0YmM0IDEwMDY0NAotLS0gYS9zb3VuZC9zeW50aC91dGlsX21lbS5jCisrKyBiL3NvdW5kL3N5bnRoL3V0aWxfbWVtLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3V0aWxfbWVtLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jIGIvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMKaW5kZXggMWUzYWUzMy4uM2I1ZjUxNyAxMDA2NDQKLS0tIGEvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMKQEAgLTE1LDcgKzE1LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgImZpcm13YXJlLmgiCiAjaW5jbHVkZSAiY2hpcC5oIgpAQCAtNTksMjEgKzYxLDE5IEBACiAJdW5zaWduZWQgaW50IHR4dF9vZmZzZXQ7IC8qIGN1cnJlbnQgcG9zaXRpb24gaW4gdHh0X2RhdGEgKi8KIH07CiAKLXN0YXRpYyB1OCB1c2I2ZmlyZV9md19paGV4X25pYmJsZShjb25zdCB1OCBuKQotewotCWlmIChuID49ICcwJyAmJiBuIDw9ICc5JykKLQkJcmV0dXJuIG4gLSAnMCc7Ci0JZWxzZSBpZiAobiA+PSAnQScgJiYgbiA8PSAnRicpCi0JCXJldHVybiBuIC0gKCdBJyAtIDEwKTsKLQllbHNlIGlmIChuID49ICdhJyAmJiBuIDw9ICdmJykKLQkJcmV0dXJuIG4gLSAoJ2EnIC0gMTApOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdTggdXNiNmZpcmVfZndfaWhleF9oZXgoY29uc3QgdTggKmRhdGEsIHU4ICpjcmMpCiB7Ci0JdTggdmFsID0gKHVzYjZmaXJlX2Z3X2loZXhfbmliYmxlKGRhdGFbMF0pIDw8IDQpIHwKLQkJCXVzYjZmaXJlX2Z3X2loZXhfbmliYmxlKGRhdGFbMV0pOworCXU4IHZhbCA9IDA7CisJaW50IGh2YWw7CisKKwlodmFsID0gaGV4X3RvX2JpbihkYXRhWzBdKTsKKwlpZiAoaHZhbCA+PSAwKQorCQl2YWwgfD0gKGh2YWwgPDwgNCk7CisKKwlodmFsID0gaGV4X3RvX2JpbihkYXRhWzFdKTsKKwlpZiAoaHZhbCA+PSAwKQorCQl2YWwgfD0gaHZhbDsKKwogCSpjcmMgKz0gdmFsOwogCXJldHVybiB2YWw7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvS2NvbmZpZyBiL3NvdW5kL3VzYi9LY29uZmlnCmluZGV4IDhiZWI3NzUuLjNlZmMyMWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9LY29uZmlnCisrKyBiL3NvdW5kL3VzYi9LY29uZmlnCkBAIC02Nyw2ICs2Nyw3IEBACiAJICAgICogTmF0aXZlIEluc3RydW1lbnRzIEd1aXRhciBSaWcgbW9iaWxlCiAJICAgICogTmF0aXZlIEluc3RydW1lbnRzIFRyYWt0b3IgS29udHJvbCBYMQogCSAgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBUcmFrdG9yIEtvbnRyb2wgUzQKKwkgICAgKiBOYXRpdmUgSW5zdHJ1bWVudHMgTWFzY2hpbmUgQ29udHJvbGxlcgogCiAJICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgIHdpbGwgYmUgY2FsbGVkIHNuZC11c2ItY2FpYXEuCkBAIC04NSw2ICs4Niw3IEBACiAJICAgKiBOYXRpdmUgSW5zdHJ1bWVudHMgS29yZSBDb250cm9sbGVyIDIKIAkgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBBdWRpbyBLb250cm9sIDEKIAkgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBUcmFrdG9yIEtvbnRyb2wgUzQKKwkgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBNYXNjaGluZSBDb250cm9sbGVyCiAKIGNvbmZpZyBTTkRfVVNCX1VTMTIyTAogCXRyaXN0YXRlICJUYXNjYW0gVVMtMTIyTCBVU0IgZHJpdmVyIgpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL01ha2VmaWxlIGIvc291bmQvdXNiL01ha2VmaWxlCmluZGV4IGNmOWVkNjYuLmFjMjU2ZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9NYWtlZmlsZQorKysgYi9zb3VuZC91c2IvTWFrZWZpbGUKQEAgLTMsMTYgKzMsMTYgQEAKICMKIAogc25kLXVzYi1hdWRpby1vYmpzIDo9IAljYXJkLm8gXAorCQkJY2xvY2subyBcCisJCQllbmRwb2ludC5vIFwKKwkJCWZvcm1hdC5vIFwKKwkJCWhlbHBlci5vIFwKIAkJCW1peGVyLm8gXAogCQkJbWl4ZXJfcXVpcmtzLm8gXAorCQkJcGNtLm8gXAogCQkJcHJvYy5vIFwKIAkJCXF1aXJrcy5vIFwKLQkJCWZvcm1hdC5vIFwKLQkJCWVuZHBvaW50Lm8gXAotCQkJdXJiLm8gXAotCQkJcGNtLm8gXAotCQkJaGVscGVyLm8gXAotCQkJY2xvY2subworCQkJc3RyZWFtLm8KIAogc25kLXVzYm1pZGktbGliLW9ianMgOj0gbWlkaS5vCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuYyBiL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuYwppbmRleCA0NWJjNGEyLi4zZWI2MDViIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmMKKysrIGIvc291bmQvdXNiL2NhaWFxL2RldmljZS5jCkBAIC01MCw3ICs1MCw4IEBACiAJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIFNlc3Npb24gSS9PfSwiCiAJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIEd1aXRhclJpZyBtb2JpbGV9IgogCQkJICJ7TmF0aXZlIEluc3RydW1lbnRzLCBUcmFrdG9yIEtvbnRyb2wgWDF9IgotCQkJICJ7TmF0aXZlIEluc3RydW1lbnRzLCBUcmFrdG9yIEtvbnRyb2wgUzR9Iik7CisJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIFRyYWt0b3IgS29udHJvbCBTNH0iCisJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIE1hc2NoaW5lIENvbnRyb2xsZXJ9Iik7CiAKIHN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7IC8qIEluZGV4IDAtbWF4ICovCiBzdGF0aWMgY2hhciogaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7IC8qIElkIGZvciB0aGlzIGNhcmQgKi8KQEAgLTE0Niw2ICsxNDcsMTEgQEAKIAkJLmlkVmVuZG9yID0gICAgIFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsCiAJCS5pZFByb2R1Y3QgPSAgICBVU0JfUElEX1RSQUtUT1JBVURJTzIKIAl9LAorCXsKKwkJLm1hdGNoX2ZsYWdzID0gIFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCQkuaWRWZW5kb3IgPSAgICAgVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywKKwkJLmlkUHJvZHVjdCA9ICAgIFVTQl9QSURfTUFTQ0hJTkVDT05UUk9MTEVSCisJfSwKIAl7IC8qIHRlcm1pbmF0b3IgKi8gfQogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2NhaWFxL2RldmljZS5oIGIvc291bmQvdXNiL2NhaWFxL2RldmljZS5oCmluZGV4IDNmOWM2MzMuLjU2MmIwYmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuaAorKysgYi9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgVVNCX1BJRF9UUkFLVE9SS09OVFJPTFgxCTB4MjMwNQogI2RlZmluZSBVU0JfUElEX1RSQUtUT1JLT05UUk9MUzQJMHhiYWZmCiAjZGVmaW5lIFVTQl9QSURfVFJBS1RPUkFVRElPMgkJMHgwNDFkCisjZGVmaW5lIFVTQl9QSURfTUFTQ0hJTkVDT05UUk9MTEVSICAweDA4MDgKIAogI2RlZmluZSBFUDFfQlVGU0laRSA2NAogI2RlZmluZSBFUDRfQlVGU0laRSA1MTIKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9pbnB1dC5jIGIvc291bmQvdXNiL2NhaWFxL2lucHV0LmMKaW5kZXggYTIxMzgxMy4uMjZhMTIxYiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhaWFxL2lucHV0LmMKKysrIGIvc291bmQvdXNiL2NhaWFxL2lucHV0LmMKQEAgLTY3LDYgKzY3LDYxIEBACiAJS0VZX0JSTF9ET1Q1CiB9OwogCisjZGVmaW5lIE1BU0NISU5FX0JVVFRPTlMgICAoNDIpCisjZGVmaW5lIE1BU0NISU5FX0JVVFRPTihYKSAoKFgpICsgQlROX01JU0MpCisjZGVmaW5lIE1BU0NISU5FX1BBRFMgICAgICAoMTYpCisjZGVmaW5lIE1BU0NISU5FX1BBRChYKSAgICAoKFgpICsgQUJTX1BSRVNTVVJFKQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQga2V5Y29kZV9tYXNjaGluZVtdID0geworCU1BU0NISU5FX0JVVFRPTig0MCksIC8qIG11dGUgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMzkpLCAvKiBzb2xvICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDM4KSwgLyogc2VsZWN0ICAgICAqLworCU1BU0NISU5FX0JVVFRPTigzNyksIC8qIGR1cGxpY2F0ZSAgKi8KKwlNQVNDSElORV9CVVRUT04oMzYpLCAvKiBuYXZpZ2F0ZSAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDM1KSwgLyogcGFkIG1vZGUgICAqLworCU1BU0NISU5FX0JVVFRPTigzNCksIC8qIHBhdHRlcm4gICAgKi8KKwlNQVNDSElORV9CVVRUT04oMzMpLCAvKiBzY2VuZSAgICAgICovCisJS0VZX1JFU0VSVkVELCAvKiBzcGFjZXIgKi8KKworCU1BU0NISU5FX0JVVFRPTigzMCksIC8qIHJlYyAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMzEpLCAvKiBlcmFzZSAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDMyKSwgLyogc2hpZnQgICAgICAqLworCU1BU0NISU5FX0JVVFRPTigyOCksIC8qIGdyaWQgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMjcpLCAvKiA+ICAgICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDI2KSwgLyogPCAgICAgICAgICAqLworCU1BU0NISU5FX0JVVFRPTigyNSksIC8qIHJlc3RhcnQgICAgKi8KKworCU1BU0NISU5FX0JVVFRPTigyMSksIC8qIEUgICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMjIpLCAvKiBGICAgICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDIzKSwgLyogRyAgICAgICAgICAqLworCU1BU0NISU5FX0JVVFRPTigyNCksIC8qIEggICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMjApLCAvKiBEICAgICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDE5KSwgLyogQyAgICAgICAgICAqLworCU1BU0NISU5FX0JVVFRPTigxOCksIC8qIEIgICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMTcpLCAvKiBBICAgICAgICAgICovCisKKwlNQVNDSElORV9CVVRUT04oMCksICAvKiBjb250cm9sICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDIpLCAgLyogYnJvd3NlICAgICAqLworCU1BU0NISU5FX0JVVFRPTig0KSwgIC8qIDwgICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oNiksICAvKiBzbmFwICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDcpLCAgLyogYXV0b3dyaXRlICAqLworCU1BU0NISU5FX0JVVFRPTig1KSwgIC8qID4gICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMyksICAvKiBzYW1wbGluZyAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDEpLCAgLyogc3RlcCAgICAgICAqLworCisJTUFTQ0hJTkVfQlVUVE9OKDE1KSwgLyogOCBzb2Z0a2V5cyAqLworCU1BU0NISU5FX0JVVFRPTigxNCksCisJTUFTQ0hJTkVfQlVUVE9OKDEzKSwKKwlNQVNDSElORV9CVVRUT04oMTIpLAorCU1BU0NISU5FX0JVVFRPTigxMSksCisJTUFTQ0hJTkVfQlVUVE9OKDEwKSwKKwlNQVNDSElORV9CVVRUT04oOSksCisJTUFTQ0hJTkVfQlVUVE9OKDgpLAorCisJTUFTQ0hJTkVfQlVUVE9OKDE2KSwgLyogbm90ZSByZXBlYXQgKi8KKwlNQVNDSElORV9CVVRUT04oMjkpICAvKiBwbGF5ICAgICAgICAqLworfTsKKwogI2RlZmluZSBLT05UUk9MWDFfSU5QVVRTCSg0MCkKICNkZWZpbmUgS09OVFJPTFM0X0JVVFRPTlMJKDEyICogOCkKICNkZWZpbmUgS09OVFJPTFM0X0FYSVMJCSg0NikKQEAgLTIxOCw2ICsyNzMsMjkgQEAKIAkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19IQVQzWSwgaSk7CiAJCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKIAkJYnJlYWs7CisKKwljYXNlIFVTQl9JRChVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTLCBVU0JfUElEX01BU0NISU5FQ09OVFJPTExFUik6CisJCS8qIDQgdW5kZXIgdGhlIGxlZnQgc2NyZWVuICovCisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfSEFUMFgsIGRlY29kZV9lcnAoYnVmWzIxXSwgYnVmWzIwXSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2RldiwgQUJTX0hBVDBZLCBkZWNvZGVfZXJwKGJ1ZlsxNV0sIGJ1ZlsxNF0pKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19IQVQxWCwgZGVjb2RlX2VycChidWZbOV0sICBidWZbOF0pKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19IQVQxWSwgZGVjb2RlX2VycChidWZbM10sICBidWZbMl0pKTsKKworCQkvKiA0IHVuZGVyIHRoZSByaWdodCBzY3JlZW4gKi8KKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19IQVQyWCwgZGVjb2RlX2VycChidWZbMTldLCBidWZbMThdKSk7CisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfSEFUMlksIGRlY29kZV9lcnAoYnVmWzEzXSwgYnVmWzEyXSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2RldiwgQUJTX0hBVDNYLCBkZWNvZGVfZXJwKGJ1Zls3XSwgIGJ1Zls2XSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2RldiwgQUJTX0hBVDNZLCBkZWNvZGVfZXJwKGJ1ZlsxXSwgIGJ1ZlswXSkpOworCisJCS8qIHZvbHVtZSAqLworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2RldiwgQUJTX1JYLCBkZWNvZGVfZXJwKGJ1ZlsxN10sIGJ1ZlsxNl0pKTsKKwkJLyogdGVtcG8gKi8KKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19SWSwgZGVjb2RlX2VycChidWZbMTFdLCBidWZbMTBdKSk7CisJCS8qIHN3aW5nICovCisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfUlosIGRlY29kZV9lcnAoYnVmWzVdLCAgYnVmWzRdKSk7CisKKwkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTQwMCw2ICs0NzgsMjUgQEAKIAlpbnB1dF9zeW5jKGRldi0+aW5wdXRfZGV2KTsKIH0KIAorI2RlZmluZSBNQVNDSElORV9NU0dCTE9DS19TSVpFIDIKKworc3RhdGljIHZvaWQgc25kX3VzYl9jYWlhcV9tYXNjaGluZV9kaXNwYXRjaChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJCXVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGksIHBhZF9pZDsKKwl1aW50MTZfdCBwcmVzc3VyZTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVNDSElORV9QQURTOyBpKyspIHsKKwkJcHJlc3N1cmUgPSBiZTE2X3RvX2NwdShidWZbaSAqIDJdIDw8IDggfCBidWZbKGkgKiAyKSArIDFdKTsKKwkJcGFkX2lkID0gcHJlc3N1cmUgPj4gMTI7CisKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYtPmlucHV0X2RldiwgTUFTQ0hJTkVfUEFEKHBhZF9pZCksIHByZXNzdXJlICYgMHhmZmYpOworCX0KKworCWlucHV0X3N5bmMoZGV2LT5pbnB1dF9kZXYpOworfQorCiBzdGF0aWMgdm9pZCBzbmRfdXNiX2NhaWFxX2VwNF9yZXBseV9kaXNwYXRjaChzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiA9IHVyYi0+Y29udGV4dDsKQEAgLTQyNSw2ICs1MjIsMTMgQEAKIAljYXNlIFVTQl9JRChVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTLCBVU0JfUElEX1RSQUtUT1JLT05UUk9MUzQpOgogCQlzbmRfdXNiX2NhaWFxX3RrczRfZGlzcGF0Y2goZGV2LCBidWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCWJyZWFrOworCisJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9NQVNDSElORUNPTlRST0xMRVIpOgorCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDwgKE1BU0NISU5FX1BBRFMgKiBNQVNDSElORV9NU0dCTE9DS19TSVpFKSkKKwkJCWdvdG8gcmVxdWV1ZTsKKworCQlzbmRfdXNiX2NhaWFxX21hc2NoaW5lX2Rpc3BhdGNoKGRldiwgYnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlicmVhazsKIAl9CiAKIHJlcXVldWU6CkBAIC00NDQsNiArNTQ4LDcgQEAKIAlzd2l0Y2ggKGRldi0+Y2hpcC51c2JfaWQpIHsKIAljYXNlIFVTQl9JRChVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTLCBVU0JfUElEX1RSQUtUT1JLT05UUk9MWDEpOgogCWNhc2UgVVNCX0lEKFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsIFVTQl9QSURfVFJBS1RPUktPTlRST0xTNCk6CisJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9NQVNDSElORUNPTlRST0xMRVIpOgogCQlpZiAodXNiX3N1Ym1pdF91cmIoZGV2LT5lcDRfaW5fdXJiLCBHRlBfS0VSTkVMKSAhPSAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWJyZWFrOwpAQCAtNDYyLDYgKzU2Nyw3IEBACiAJc3dpdGNoIChkZXYtPmNoaXAudXNiX2lkKSB7CiAJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9UUkFLVE9SS09OVFJPTFgxKToKIAljYXNlIFVTQl9JRChVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTLCBVU0JfUElEX1RSQUtUT1JLT05UUk9MUzQpOgorCWNhc2UgVVNCX0lEKFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsIFVTQl9QSURfTUFTQ0hJTkVDT05UUk9MTEVSKToKIAkJdXNiX2tpbGxfdXJiKGRldi0+ZXA0X2luX3VyYik7CiAJCWJyZWFrOwogCX0KQEAgLTY1Miw2ICs3NTgsNTAgQEAKIAogCQlicmVhazsKIAorCWNhc2UgVVNCX0lEKFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsIFVTQl9QSURfTUFTQ0hJTkVDT05UUk9MTEVSKToKKwkJaW5wdXQtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJCWlucHV0LT5hYnNiaXRbMF0gPSBCSVRfTUFTSyhBQlNfSEFUMFgpIHwgQklUX01BU0soQUJTX0hBVDBZKSB8CisJCQlCSVRfTUFTSyhBQlNfSEFUMVgpIHwgQklUX01BU0soQUJTX0hBVDFZKSB8CisJCQlCSVRfTUFTSyhBQlNfSEFUMlgpIHwgQklUX01BU0soQUJTX0hBVDJZKSB8CisJCQlCSVRfTUFTSyhBQlNfSEFUM1gpIHwgQklUX01BU0soQUJTX0hBVDNZKSB8CisJCQlCSVRfTUFTSyhBQlNfUlgpIHwgQklUX01BU0soQUJTX1JZKSB8CisJCQlCSVRfTUFTSyhBQlNfUlopOworCisJCUJVSUxEX0JVR19PTihzaXplb2YoZGV2LT5rZXljb2RlKSA8IHNpemVvZihrZXljb2RlX21hc2NoaW5lKSk7CisJCW1lbWNweShkZXYtPmtleWNvZGUsIGtleWNvZGVfbWFzY2hpbmUsIHNpemVvZihrZXljb2RlX21hc2NoaW5lKSk7CisJCWlucHV0LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShrZXljb2RlX21hc2NoaW5lKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUFTQ0hJTkVfUEFEUzsgaSsrKSB7CisJCQlpbnB1dC0+YWJzYml0WzBdIHw9IE1BU0NISU5FX1BBRChpKTsKKwkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBNQVNDSElORV9QQUQoaSksIDAsIDB4ZmZmLCA1LCAxMCk7CisJCX0KKworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX0hBVDBYLCAwLCA5OTksIDAsIDEwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19IQVQwWSwgMCwgOTk5LCAwLCAxMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBBQlNfSEFUMVgsIDAsIDk5OSwgMCwgMTApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX0hBVDFZLCAwLCA5OTksIDAsIDEwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19IQVQyWCwgMCwgOTk5LCAwLCAxMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBBQlNfSEFUMlksIDAsIDk5OSwgMCwgMTApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX0hBVDNYLCAwLCA5OTksIDAsIDEwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19IQVQzWSwgMCwgOTk5LCAwLCAxMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBBQlNfUlgsIDAsIDk5OSwgMCwgMTApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX1JZLCAwLCA5OTksIDAsIDEwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19SWiwgMCwgOTk5LCAwLCAxMCk7CisKKwkJZGV2LT5lcDRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkZXYtPmVwNF9pbl91cmIpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGV4aXRfZnJlZV9pZGV2OworCQl9CisKKwkJdXNiX2ZpbGxfYnVsa191cmIoZGV2LT5lcDRfaW5fdXJiLCB1c2JfZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIDB4NCksCisJCQkJICBkZXYtPmVwNF9pbl9idWYsIEVQNF9CVUZTSVpFLAorCQkJCSAgc25kX3VzYl9jYWlhcV9lcDRfcmVwbHlfZGlzcGF0Y2gsIGRldik7CisKKwkJc25kX3VzYl9jYWlhcV9zZXRfYXV0b19tc2coZGV2LCAxLCAxMCwgNSk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJLyogbm8gaW5wdXQgbWV0aG9kcyBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UgKi8KIAkJZ290byBleGl0X2ZyZWVfaWRldjsKQEAgLTY2NCwxNSArODE0LDE3IEBACiAJZm9yIChpID0gMDsgaSA8IGlucHV0LT5rZXljb2RlbWF4OyBpKyspCiAJCV9fc2V0X2JpdChkZXYtPmtleWNvZGVbaV0sIGlucHV0LT5rZXliaXQpOwogCisJZGV2LT5pbnB1dF9kZXYgPSBpbnB1dDsKKwogCXJldCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXhpdF9mcmVlX2lkZXY7CiAKLQlkZXYtPmlucHV0X2RldiA9IGlucHV0OwogCXJldHVybiAwOwogCiBleGl0X2ZyZWVfaWRldjoKIAlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7CisJZGV2LT5pbnB1dF9kZXYgPSBOVUxMOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY4OCw0ICs4NDAsMyBAQAogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+aW5wdXRfZGV2KTsKIAlkZXYtPmlucHV0X2RldiA9IE5VTEw7CiB9Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYXJkLmMgYi9zb3VuZC91c2IvY2FyZC5jCmluZGV4IDMwNjhmMDQuLjBmNmRjMGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9jYXJkLmMKKysrIGIvc291bmQvdXNiL2NhcmQuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtNjUsOSArNjYsOSBAQAogI2luY2x1ZGUgImhlbHBlci5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAicGNtLmgiCi0jaW5jbHVkZSAidXJiLmgiCiAjaW5jbHVkZSAiZm9ybWF0LmgiCiAjaW5jbHVkZSAicG93ZXIuaCIKKyNpbmNsdWRlICJzdHJlYW0uaCIKIAogTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgQXVkaW8iKTsKQEAgLTE4NSw3ICsxODYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoISBzbmRfdXNiX3BhcnNlX2F1ZGlvX2VuZHBvaW50cyhjaGlwLCBpbnRlcmZhY2UpKSB7CisJaWYgKCEgc25kX3VzYl9wYXJzZV9hdWRpb19pbnRlcmZhY2UoY2hpcCwgaW50ZXJmYWNlKSkgewogCQl1c2Jfc2V0X2ludGVyZmFjZShkZXYsIGludGVyZmFjZSwgMCk7IC8qIHJlc2V0IHRoZSBjdXJyZW50IGludGVyZmFjZSAqLwogCQl1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgmdXNiX2F1ZGlvX2RyaXZlciwgaWZhY2UsICh2b2lkICopLTFMKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FyZC5oIGIvc291bmQvdXNiL2NhcmQuaAppbmRleCBhZTQyNTFkLi5hMzllZGNjIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FyZC5oCisrKyBiL3NvdW5kL3VzYi9jYXJkLmgKQEAgLTk0LDYgKzk0LDggQEAKIAlzcGlubG9ja190IGxvY2s7CiAKIAlzdHJ1Y3Qgc25kX3VyYl9vcHMgb3BzOwkJLyogY2FsbGJhY2tzIChtdXN0IGJlIGZpbGxlZCBhdCBpbml0KSAqLworCWludCBsYXN0X2ZyYW1lX251bWJlcjsgICAgICAgICAgLyogc3RvcmVkIGZyYW1lIG51bWJlciAqLworCWludCBsYXN0X2RlbGF5OyAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGRlbGF5ICovCiB9OwogCiBzdHJ1Y3Qgc25kX3VzYl9zdHJlYW0gewpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2Nsb2NrLmMgYi9zb3VuZC91c2IvY2xvY2suYwppbmRleCAwNzUxOTVlLi4zNzliYWFkIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2xvY2suYworKysgYi9zb3VuZC91c2IvY2xvY2suYwpAQCAtOTEsNyArOTEsNyBAQAogCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9JTiwKIAkJCSAgICAgIFVBQzJfQ1hfQ0xPQ0tfU0VMRUNUT1IgPDwgOCwKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKHNlbGVjdG9yX2lkIDw8IDgpLAotCQkJICAgICAgJmJ1Ziwgc2l6ZW9mKGJ1ZiksIDEwMDApOworCQkJICAgICAgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJCSAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCiAJCQkgICAgICBVQUMyX0NTX0NPTlRST0xfQ0xPQ0tfVkFMSUQgPDwgOCwKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKHNvdXJjZV9pZCA8PCA4KSwKLQkJCSAgICAgICZkYXRhLCBzaXplb2YoZGF0YSksIDEwMDApOworCQkJICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogY2Fubm90IGdldCBjbG9jayB2YWxpZGl0eSBmb3IgaWQgJWRcbiIsCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlpZiAoKGVyciA9IHNuZF91c2JfY3RsX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLCBVQUNfU0VUX0NVUiwKIAkJCQkgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9FTkRQT0lOVCB8IFVTQl9ESVJfT1VULAogCQkJCSAgIFVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFIDw8IDgsIGVwLAotCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSwgMTAwMCkpIDwgMCkgeworCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSkpIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZDogY2Fubm90IHNldCBmcmVxICVkIHRvIGVwICUjeFxuIiwKIAkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBlcCk7CiAJCXJldHVybiBlcnI7CkBAIC0yMzEsNyArMjMxLDcgQEAKIAlpZiAoKGVyciA9IHNuZF91c2JfY3RsX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLCBVQUNfR0VUX0NVUiwKIAkJCQkgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9FTkRQT0lOVCB8IFVTQl9ESVJfSU4sCiAJCQkJICAgVUFDX0VQX0NTX0FUVFJfU0FNUExFX1JBVEUgPDwgOCwgZXAsCi0JCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpLCAxMDAwKSkgPCAwKSB7CisJCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICIlZDolZDolZDogY2Fubm90IGdldCBmcmVxIGF0IGVwICUjeFxuIiwKIAkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCBlcCk7CiAJCXJldHVybiAwOyAvKiBzb21lIGRldmljZXMgZG9uJ3Qgc3VwcG9ydCByZWFkaW5nICovCkBAIC0yNzMsNyArMjczLDcgQEAKIAkJCQkgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKIAkJCQkgICBVQUMyX0NTX0NPTlRST0xfU0FNX0ZSRVEgPDwgOCwKIAkJCQkgICBzbmRfdXNiX2N0cmxfaW50ZihjaGlwKSB8IChjbG9jayA8PCA4KSwKLQkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSksIDEwMDApKSA8IDApIHsKKwkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSkpKSA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JWQ6JWQ6IGNhbm5vdCBzZXQgZnJlcSAlZCAodjIpXG4iLAogCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIHJhdGUpOwogCQlyZXR1cm4gZXJyOwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJCQkJICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9JTiwKIAkJCQkgICBVQUMyX0NTX0NPTlRST0xfU0FNX0ZSRVEgPDwgOCwKIAkJCQkgICBzbmRfdXNiX2N0cmxfaW50ZihjaGlwKSB8IChjbG9jayA8PCA4KSwKLQkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSksIDEwMDApKSA8IDApIHsKKwkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSkpKSA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiVkOiVkOiBjYW5ub3QgZ2V0IGZyZXEgKHYyKVxuIiwKIAkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9lbmRwb2ludC5jIGIvc291bmQvdXNiL2VuZHBvaW50LmMKaW5kZXggN2Q0NmU0OC4uODFjNmVkZSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2VuZHBvaW50LmMKKysrIGIvc291bmQvdXNiL2VuZHBvaW50LmMKQEAgLTE1LDQzNiArMTUsOTUxIEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9hdWRpby12Mi5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogCiAjaW5jbHVkZSAidXNiYXVkaW8uaCIKLSNpbmNsdWRlICJjYXJkLmgiCi0jaW5jbHVkZSAicHJvYy5oIgotI2luY2x1ZGUgInF1aXJrcy5oIgotI2luY2x1ZGUgImVuZHBvaW50LmgiCi0jaW5jbHVkZSAidXJiLmgiCi0jaW5jbHVkZSAicGNtLmgiCiAjaW5jbHVkZSAiaGVscGVyLmgiCi0jaW5jbHVkZSAiZm9ybWF0LmgiCi0jaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJjYXJkLmgiCisjaW5jbHVkZSAiZW5kcG9pbnQuaCIKKyNpbmNsdWRlICJwY20uaCIKIAogLyoKLSAqIGZyZWUgYSBzdWJzdHJlYW0KKyAqIGNvbnZlcnQgYSBzYW1wbGluZyByYXRlIGludG8gb3VyIGZ1bGwgc3BlZWQgZm9ybWF0IChmcy8xMDAwIGluIFExNi4xNikKKyAqIHRoaXMgd2lsbCBvdmVyZmxvdyBhdCBhcHByb3ggNTI0IGtIegogICovCi1zdGF0aWMgdm9pZCBmcmVlX3N1YnN0cmVhbShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF91c2JfZnVsbF9zcGVlZF9yYXRlKHVuc2lnbmVkIGludCByYXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCi0JaWYgKCFzdWJzLT5udW1fZm9ybWF0cykKLQkJcmV0dXJuOyAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJnN1YnMtPmZtdF9saXN0KSB7Ci0JCXN0cnVjdCBhdWRpb2Zvcm1hdCAqZnAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBhdWRpb2Zvcm1hdCwgbGlzdCk7Ci0JCWtmcmVlKGZwLT5yYXRlX3RhYmxlKTsKLQkJa2ZyZWUoZnApOwotCX0KLQlrZnJlZShzdWJzLT5yYXRlX2xpc3QubGlzdCk7CisJcmV0dXJuICgocmF0ZSA8PCAxMykgKyA2MikgLyAxMjU7CiB9CiAKLQogLyoKLSAqIGZyZWUgYSB1c2Igc3RyZWFtIGluc3RhbmNlCisgKiBjb252ZXJ0IGEgc2FtcGxpbmcgcmF0ZSBpbnRvIFVTQiBoaWdoIHNwZWVkIGZvcm1hdCAoZnMvODAwMCBpbiBRMTYuMTYpCisgKiB0aGlzIHdpbGwgb3ZlcmZsb3cgYXQgYXBwcm94IDQgTUh6CiAgKi8KLXN0YXRpYyB2b2lkIHNuZF91c2JfYXVkaW9fc3RyZWFtX2ZyZWUoc3RydWN0IHNuZF91c2Jfc3RyZWFtICpzdHJlYW0pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF91c2JfaGlnaF9zcGVlZF9yYXRlKHVuc2lnbmVkIGludCByYXRlKQogewotCWZyZWVfc3Vic3RyZWFtKCZzdHJlYW0tPnN1YnN0cmVhbVswXSk7Ci0JZnJlZV9zdWJzdHJlYW0oJnN0cmVhbS0+c3Vic3RyZWFtWzFdKTsKLQlsaXN0X2RlbCgmc3RyZWFtLT5saXN0KTsKLQlrZnJlZShzdHJlYW0pOworCXJldHVybiAoKHJhdGUgPDwgMTApICsgNjIpIC8gMTI1OwogfQogCi1zdGF0aWMgdm9pZCBzbmRfdXNiX2F1ZGlvX3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCi17Ci0Jc3RydWN0IHNuZF91c2Jfc3RyZWFtICpzdHJlYW0gPSBwY20tPnByaXZhdGVfZGF0YTsKLQlpZiAoc3RyZWFtKSB7Ci0JCXN0cmVhbS0+cGNtID0gTlVMTDsKLQkJc25kX3VzYl9hdWRpb19zdHJlYW1fZnJlZShzdHJlYW0pOwotCX0KLX0KLQotCiAvKgotICogYWRkIHRoaXMgZW5kcG9pbnQgdG8gdGhlIGNoaXAgaW5zdGFuY2UuCi0gKiBpZiBhIHN0cmVhbSB3aXRoIHRoZSBzYW1lIGVuZHBvaW50IGFscmVhZHkgZXhpc3RzLCBhcHBlbmQgdG8gaXQuCi0gKiBpZiBub3QsIGNyZWF0ZSBhIG5ldyBwY20gc3RyZWFtLgorICogdW5saW5rIGFjdGl2ZSB1cmJzLgogICovCi1pbnQgc25kX3VzYl9hZGRfYXVkaW9fZW5kcG9pbnQoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsIGludCBzdHJlYW0sIHN0cnVjdCBhdWRpb2Zvcm1hdCAqZnApCitzdGF0aWMgaW50IGRlYWN0aXZhdGVfdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsIGludCBmb3JjZSwgaW50IGNhbl9zbGVlcCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCXN0cnVjdCBzbmRfdXNiX3N0cmVhbSAqYXM7Ci0Jc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzOwotCXN0cnVjdCBzbmRfcGNtICpwY207Ci0JaW50IGVycjsKKwlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IHN1YnMtPnN0cmVhbS0+Y2hpcDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgYXN5bmM7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZjaGlwLT5wY21fbGlzdCkgewotCQlhcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF91c2Jfc3RyZWFtLCBsaXN0KTsKLQkJaWYgKGFzLT5mbXRfdHlwZSAhPSBmcC0+Zm10X3R5cGUpCi0JCQljb250aW51ZTsKLQkJc3VicyA9ICZhcy0+c3Vic3RyZWFtW3N0cmVhbV07Ci0JCWlmICghc3Vicy0+ZW5kcG9pbnQpCi0JCQljb250aW51ZTsKLQkJaWYgKHN1YnMtPmVuZHBvaW50ID09IGZwLT5lbmRwb2ludCkgewotCQkJbGlzdF9hZGRfdGFpbCgmZnAtPmxpc3QsICZzdWJzLT5mbXRfbGlzdCk7Ci0JCQlzdWJzLT5udW1fZm9ybWF0cysrOwotCQkJc3Vicy0+Zm9ybWF0cyB8PSBmcC0+Zm9ybWF0czsKLQkJCXJldHVybiAwOworCXN1YnMtPnJ1bm5pbmcgPSAwOworCisJaWYgKCFmb3JjZSAmJiBzdWJzLT5zdHJlYW0tPmNoaXAtPnNodXRkb3duKSAvKiB0byBiZSBzdXJlLi4uICovCisJCXJldHVybiAtRUJBREZEOworCisJYXN5bmMgPSAhY2FuX3NsZWVwICYmIGNoaXAtPmFzeW5jX3VubGluazsKKworCWlmICghYXN5bmMgJiYgaW5faW50ZXJydXB0KCkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHN1YnMtPm51cmJzOyBpKyspIHsKKwkJaWYgKHRlc3RfYml0KGksICZzdWJzLT5hY3RpdmVfbWFzaykpIHsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChpLCAmc3Vicy0+dW5saW5rX21hc2spKSB7CisJCQkJc3RydWN0IHVyYiAqdSA9IHN1YnMtPmRhdGF1cmJbaV0udXJiOworCQkJCWlmIChhc3luYykKKwkJCQkJdXNiX3VubGlua191cmIodSk7CisJCQkJZWxzZQorCQkJCQl1c2Jfa2lsbF91cmIodSk7CisJCQl9CiAJCX0KIAl9Ci0JLyogbG9vayBmb3IgYW4gZW1wdHkgc3RyZWFtICovCi0JbGlzdF9mb3JfZWFjaChwLCAmY2hpcC0+cGNtX2xpc3QpIHsKLQkJYXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdXNiX3N0cmVhbSwgbGlzdCk7Ci0JCWlmIChhcy0+Zm10X3R5cGUgIT0gZnAtPmZtdF90eXBlKQotCQkJY29udGludWU7Ci0JCXN1YnMgPSAmYXMtPnN1YnN0cmVhbVtzdHJlYW1dOwotCQlpZiAoc3Vicy0+ZW5kcG9pbnQpCi0JCQljb250aW51ZTsKLQkJZXJyID0gc25kX3BjbV9uZXdfc3RyZWFtKGFzLT5wY20sIHN0cmVhbSwgMSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJc25kX3VzYl9pbml0X3N1YnN0cmVhbShhcywgc3RyZWFtLCBmcCk7Ci0JCXJldHVybiAwOworCWlmIChzdWJzLT5zeW5jcGlwZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgU1lOQ19VUkJTOyBpKyspIHsKKwkJCWlmICh0ZXN0X2JpdChpKzE2LCAmc3Vicy0+YWN0aXZlX21hc2spKSB7CisJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGkrMTYsICZzdWJzLT51bmxpbmtfbWFzaykpIHsKKwkJCQkJc3RydWN0IHVyYiAqdSA9IHN1YnMtPnN5bmN1cmJbaV0udXJiOworCQkJCQlpZiAoYXN5bmMpCisJCQkJCQl1c2JfdW5saW5rX3VyYih1KTsKKwkJCQkJZWxzZQorCQkJCQkJdXNiX2tpbGxfdXJiKHUpOworCQkJCX0KKwkJCX0KKwkJfQogCX0KKwlyZXR1cm4gMDsKK30KIAotCS8qIGNyZWF0ZSBhIG5ldyBwY20gKi8KLQlhcyA9IGt6YWxsb2Moc2l6ZW9mKCphcyksIEdGUF9LRVJORUwpOwotCWlmICghYXMpCi0JCXJldHVybiAtRU5PTUVNOwotCWFzLT5wY21faW5kZXggPSBjaGlwLT5wY21fZGV2czsKLQlhcy0+Y2hpcCA9IGNoaXA7Ci0JYXMtPmZtdF90eXBlID0gZnAtPmZtdF90eXBlOwotCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJVU0IgQXVkaW8iLCBjaGlwLT5wY21fZGV2cywKLQkJCSAgc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyAxIDogMCwKLQkJCSAgc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyAwIDogMSwKLQkJCSAgJnBjbSk7Ci0JaWYgKGVyciA8IDApIHsKLQkJa2ZyZWUoYXMpOwotCQlyZXR1cm4gZXJyOworCisvKgorICogcmVsZWFzZSBhIHVyYiBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHJlbGVhc2VfdXJiX2N0eChzdHJ1Y3Qgc25kX3VyYl9jdHggKnUpCit7CisJaWYgKHUtPnVyYikgeworCQlpZiAodS0+YnVmZmVyX3NpemUpCisJCQl1c2JfZnJlZV9jb2hlcmVudCh1LT5zdWJzLT5kZXYsIHUtPmJ1ZmZlcl9zaXplLAorCQkJCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkJdS0+dXJiLT50cmFuc2Zlcl9kbWEpOworCQl1c2JfZnJlZV91cmIodS0+dXJiKTsKKwkJdS0+dXJiID0gTlVMTDsKIAl9Ci0JYXMtPnBjbSA9IHBjbTsKLQlwY20tPnByaXZhdGVfZGF0YSA9IGFzOwotCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX3VzYl9hdWRpb19wY21fZnJlZTsKLQlwY20tPmluZm9fZmxhZ3MgPSAwOwotCWlmIChjaGlwLT5wY21fZGV2cyA+IDApCi0JCXNwcmludGYocGNtLT5uYW1lLCAiVVNCIEF1ZGlvICMlZCIsIGNoaXAtPnBjbV9kZXZzKTsKK30KKworLyoKKyAqICB3YWl0IHVudGlsIGFsbCB1cmJzIGFyZSBwcm9jZXNzZWQuCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9jbGVhcl91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicykKK3sKKwl1bnNpZ25lZCBsb25nIGVuZF90aW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGFsaXZlOworCisJZG8geworCQlhbGl2ZSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBzdWJzLT5udXJiczsgaSsrKSB7CisJCQlpZiAodGVzdF9iaXQoaSwgJnN1YnMtPmFjdGl2ZV9tYXNrKSkKKwkJCQlhbGl2ZSsrOworCQl9CisJCWlmIChzdWJzLT5zeW5jcGlwZSkgeworCQkJZm9yIChpID0gMDsgaSA8IFNZTkNfVVJCUzsgaSsrKSB7CisJCQkJaWYgKHRlc3RfYml0KGkgKyAxNiwgJnN1YnMtPmFjdGl2ZV9tYXNrKSkKKwkJCQkJYWxpdmUrKzsKKwkJCX0KKwkJfQorCQlpZiAoISBhbGl2ZSkKKwkJCWJyZWFrOworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOworCWlmIChhbGl2ZSkKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidGltZW91dDogc3RpbGwgJWQgYWN0aXZlIHVyYnMuLlxuIiwgYWxpdmUpOworCXJldHVybiAwOworfQorCisvKgorICogcmVsZWFzZSBhIHN1YnN0cmVhbQorICovCit2b2lkIHNuZF91c2JfcmVsZWFzZV9zdWJzdHJlYW1fdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsIGludCBmb3JjZSkKK3sKKwlpbnQgaTsKKworCS8qIHN0b3AgdXJicyAodG8gYmUgc3VyZSkgKi8KKwlkZWFjdGl2YXRlX3VyYnMoc3VicywgZm9yY2UsIDEpOworCXdhaXRfY2xlYXJfdXJicyhzdWJzKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVVJCUzsgaSsrKQorCQlyZWxlYXNlX3VyYl9jdHgoJnN1YnMtPmRhdGF1cmJbaV0pOworCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykKKwkJcmVsZWFzZV91cmJfY3R4KCZzdWJzLT5zeW5jdXJiW2ldKTsKKwl1c2JfZnJlZV9jb2hlcmVudChzdWJzLT5kZXYsIFNZTkNfVVJCUyAqIDQsCisJCQlzdWJzLT5zeW5jYnVmLCBzdWJzLT5zeW5jX2RtYSk7CisJc3Vicy0+c3luY2J1ZiA9IE5VTEw7CisJc3Vicy0+bnVyYnMgPSAwOworfQorCisvKgorICogY29tcGxldGUgY2FsbGJhY2sgZnJvbSBkYXRhIHVyYgorICovCitzdGF0aWMgdm9pZCBzbmRfY29tcGxldGVfdXJiKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMgPSBjdHgtPnN1YnM7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBjdHgtPnN1YnMtPnBjbV9zdWJzdHJlYW07CisJaW50IGVyciA9IDA7CisKKwlpZiAoKHN1YnMtPnJ1bm5pbmcgJiYgc3Vicy0+b3BzLnJldGlyZShzdWJzLCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHVyYikpIHx8CisJICAgICFzdWJzLT5ydW5uaW5nIHx8IC8qIGNhbiBiZSBzdG9wcGVkIGR1cmluZyByZXRpcmUgY2FsbGJhY2sgKi8KKwkgICAgKGVyciA9IHN1YnMtPm9wcy5wcmVwYXJlKHN1YnMsIHN1YnN0cmVhbS0+cnVudGltZSwgdXJiKSkgPCAwIHx8CisJICAgIChlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKKwkJY2xlYXJfYml0KGN0eC0+aW5kZXgsICZzdWJzLT5hY3RpdmVfbWFzayk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJjYW5ub3Qgc3VibWl0IHVyYiAoZXJyID0gJWQpXG4iLCBlcnIpOworCQkJc25kX3BjbV9zdG9wKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOworCQl9CisJfQorfQorCisKKy8qCisgKiBjb21wbGV0ZSBjYWxsYmFjayBmcm9tIHN5bmMgdXJiCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9jb21wbGV0ZV9zeW5jX3VyYihzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzID0gY3R4LT5zdWJzOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gY3R4LT5zdWJzLT5wY21fc3Vic3RyZWFtOworCWludCBlcnIgPSAwOworCisJaWYgKChzdWJzLT5ydW5uaW5nICYmIHN1YnMtPm9wcy5yZXRpcmVfc3luYyhzdWJzLCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHVyYikpIHx8CisJICAgICFzdWJzLT5ydW5uaW5nIHx8IC8qIGNhbiBiZSBzdG9wcGVkIGR1cmluZyByZXRpcmUgY2FsbGJhY2sgKi8KKwkgICAgKGVyciA9IHN1YnMtPm9wcy5wcmVwYXJlX3N5bmMoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lLCB1cmIpKSA8IDAgfHwKKwkgICAgKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpIDwgMCkgeworCQljbGVhcl9iaXQoY3R4LT5pbmRleCArIDE2LCAmc3Vicy0+YWN0aXZlX21hc2spOworCQlpZiAoZXJyIDwgMCkgeworCQkJc25kX3ByaW50ZChLRVJOX0VSUiAiY2Fubm90IHN1Ym1pdCBzeW5jIHVyYiAoZXJyID0gJWQpXG4iLCBlcnIpOworCQkJc25kX3BjbV9zdG9wKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOworCQl9CisJfQorfQorCisKKy8qCisgKiBpbml0aWFsaXplIGEgc3Vic3RyZWFtIGZvciBwbGFiYWNrL2NhcHR1cmUKKyAqLworaW50IHNuZF91c2JfaW5pdF9zdWJzdHJlYW1fdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJdW5zaWduZWQgaW50IHBlcmlvZF9ieXRlcywKKwkJCQl1bnNpZ25lZCBpbnQgcmF0ZSwKKwkJCQl1bnNpZ25lZCBpbnQgZnJhbWVfYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgbWF4c2l6ZSwgaTsKKwlpbnQgaXNfcGxheWJhY2sgPSBzdWJzLT5kaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwl1bnNpZ25lZCBpbnQgdXJiX3BhY2tzLCB0b3RhbF9wYWNrcywgcGFja3NfcGVyX21zOworCXN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwID0gc3Vicy0+c3RyZWFtLT5jaGlwOworCisJLyogY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgaW4gMTYuMTYgZm9ybWF0ICovCisJaWYgKHNuZF91c2JfZ2V0X3NwZWVkKHN1YnMtPmRldikgPT0gVVNCX1NQRUVEX0ZVTEwpCisJCXN1YnMtPmZyZXFuID0gZ2V0X3VzYl9mdWxsX3NwZWVkX3JhdGUocmF0ZSk7CiAJZWxzZQotCQlzdHJjcHkocGNtLT5uYW1lLCAiVVNCIEF1ZGlvIik7CisJCXN1YnMtPmZyZXFuID0gZ2V0X3VzYl9oaWdoX3NwZWVkX3JhdGUocmF0ZSk7CisJc3Vicy0+ZnJlcW0gPSBzdWJzLT5mcmVxbjsKKwlzdWJzLT5mcmVxc2hpZnQgPSBJTlRfTUlOOworCS8qIGNhbGN1bGF0ZSBtYXguIGZyZXF1ZW5jeSAqLworCWlmIChzdWJzLT5tYXhwYWNrc2l6ZSkgeworCQkvKiB3aGF0ZXZlciBmaXRzIGludG8gYSBtYXguIHNpemUgcGFja2V0ICovCisJCW1heHNpemUgPSBzdWJzLT5tYXhwYWNrc2l6ZTsKKwkJc3Vicy0+ZnJlcW1heCA9IChtYXhzaXplIC8gKGZyYW1lX2JpdHMgPj4gMykpCisJCQkJPDwgKDE2IC0gc3Vicy0+ZGF0YWludGVydmFsKTsKKwl9IGVsc2UgeworCQkvKiBubyBtYXguIHBhY2tldCBzaXplOiBqdXN0IHRha2UgMjUlIGhpZ2hlciB0aGFuIG5vbWluYWwgKi8KKwkJc3Vicy0+ZnJlcW1heCA9IHN1YnMtPmZyZXFuICsgKHN1YnMtPmZyZXFuID4+IDIpOworCQltYXhzaXplID0gKChzdWJzLT5mcmVxbWF4ICsgMHhmZmZmKSAqIChmcmFtZV9iaXRzID4+IDMpKQorCQkJCT4+ICgxNiAtIHN1YnMtPmRhdGFpbnRlcnZhbCk7CisJfQorCXN1YnMtPnBoYXNlID0gMDsKIAotCXNuZF91c2JfaW5pdF9zdWJzdHJlYW0oYXMsIHN0cmVhbSwgZnApOworCWlmIChzdWJzLT5maWxsX21heCkKKwkJc3Vicy0+Y3VycGFja3NpemUgPSBzdWJzLT5tYXhwYWNrc2l6ZTsKKwllbHNlCisJCXN1YnMtPmN1cnBhY2tzaXplID0gbWF4c2l6ZTsKIAotCWxpc3RfYWRkKCZhcy0+bGlzdCwgJmNoaXAtPnBjbV9saXN0KTsKLQljaGlwLT5wY21fZGV2cysrOworCWlmIChzbmRfdXNiX2dldF9zcGVlZChzdWJzLT5kZXYpICE9IFVTQl9TUEVFRF9GVUxMKQorCQlwYWNrc19wZXJfbXMgPSA4ID4+IHN1YnMtPmRhdGFpbnRlcnZhbDsKKwllbHNlCisJCXBhY2tzX3Blcl9tcyA9IDE7CiAKLQlzbmRfdXNiX3Byb2NfcGNtX2Zvcm1hdF9hZGQoYXMpOworCWlmIChpc19wbGF5YmFjaykgeworCQl1cmJfcGFja3MgPSBtYXgoY2hpcC0+bnJwYWNrcywgMSk7CisJCXVyYl9wYWNrcyA9IG1pbih1cmJfcGFja3MsICh1bnNpZ25lZCBpbnQpTUFYX1BBQ0tTKTsKKwl9IGVsc2UKKwkJdXJiX3BhY2tzID0gMTsKKwl1cmJfcGFja3MgKj0gcGFja3NfcGVyX21zOworCWlmIChzdWJzLT5zeW5jcGlwZSkKKwkJdXJiX3BhY2tzID0gbWluKHVyYl9wYWNrcywgMVUgPDwgc3Vicy0+c3luY2ludGVydmFsKTsKKworCS8qIGRlY2lkZSBob3cgbWFueSBwYWNrZXRzIHRvIGJlIHVzZWQgKi8KKwlpZiAoaXNfcGxheWJhY2spIHsKKwkJdW5zaWduZWQgaW50IG1pbnNpemUsIG1heHBhY2tzOworCQkvKiBkZXRlcm1pbmUgaG93IHNtYWxsIGEgcGFja2V0IGNhbiBiZSAqLworCQltaW5zaXplID0gKHN1YnMtPmZyZXFuID4+ICgxNiAtIHN1YnMtPmRhdGFpbnRlcnZhbCkpCisJCQkgICogKGZyYW1lX2JpdHMgPj4gMyk7CisJCS8qIHdpdGggc3luYyBmcm9tIGRldmljZSwgYXNzdW1lIGl0IGNhbiBiZSAxMiUgbG93ZXIgKi8KKwkJaWYgKHN1YnMtPnN5bmNwaXBlKQorCQkJbWluc2l6ZSAtPSBtaW5zaXplID4+IDM7CisJCW1pbnNpemUgPSBtYXgobWluc2l6ZSwgMXUpOworCQl0b3RhbF9wYWNrcyA9IChwZXJpb2RfYnl0ZXMgKyBtaW5zaXplIC0gMSkgLyBtaW5zaXplOworCQkvKiB3ZSBuZWVkIGF0IGxlYXN0IHR3byBVUkJzIGZvciBxdWV1ZWluZyAqLworCQlpZiAodG90YWxfcGFja3MgPCAyKSB7CisJCQl0b3RhbF9wYWNrcyA9IDI7CisJCX0gZWxzZSB7CisJCQkvKiBhbmQgd2UgZG9uJ3Qgd2FudCB0b28gbG9uZyBhIHF1ZXVlIGVpdGhlciAqLworCQkJbWF4cGFja3MgPSBtYXgoTUFYX1FVRVVFICogcGFja3NfcGVyX21zLCB1cmJfcGFja3MgKiAyKTsKKwkJCXRvdGFsX3BhY2tzID0gbWluKHRvdGFsX3BhY2tzLCBtYXhwYWNrcyk7CisJCX0KKwl9IGVsc2UgeworCQl3aGlsZSAodXJiX3BhY2tzID4gMSAmJiB1cmJfcGFja3MgKiBtYXhzaXplID49IHBlcmlvZF9ieXRlcykKKwkJCXVyYl9wYWNrcyA+Pj0gMTsKKwkJdG90YWxfcGFja3MgPSBNQVhfVVJCUyAqIHVyYl9wYWNrczsKKwl9CisJc3Vicy0+bnVyYnMgPSAodG90YWxfcGFja3MgKyB1cmJfcGFja3MgLSAxKSAvIHVyYl9wYWNrczsKKwlpZiAoc3Vicy0+bnVyYnMgPiBNQVhfVVJCUykgeworCQkvKiB0b28gbXVjaC4uLiAqLworCQlzdWJzLT5udXJicyA9IE1BWF9VUkJTOworCQl0b3RhbF9wYWNrcyA9IE1BWF9VUkJTICogdXJiX3BhY2tzOworCX0gZWxzZSBpZiAoc3Vicy0+bnVyYnMgPCAyKSB7CisJCS8qIHRvbyBsaXR0bGUgLSB3ZSBuZWVkIGF0IGxlYXN0IHR3byBwYWNrZXRzCisJCSAqIHRvIGVuc3VyZSBjb250aWd1b3VzIHBsYXliYWNrL2NhcHR1cmUKKwkJICovCisJCXN1YnMtPm51cmJzID0gMjsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhIHVyYnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3Vicy0+bnVyYnM7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3VyYl9jdHggKnUgPSAmc3Vicy0+ZGF0YXVyYltpXTsKKwkJdS0+aW5kZXggPSBpOworCQl1LT5zdWJzID0gc3ViczsKKwkJdS0+cGFja2V0cyA9IChpICsgMSkgKiB0b3RhbF9wYWNrcyAvIHN1YnMtPm51cmJzCisJCQktIGkgKiB0b3RhbF9wYWNrcyAvIHN1YnMtPm51cmJzOworCQl1LT5idWZmZXJfc2l6ZSA9IG1heHNpemUgKiB1LT5wYWNrZXRzOworCQlpZiAoc3Vicy0+Zm10X3R5cGUgPT0gVUFDX0ZPUk1BVF9UWVBFX0lJKQorCQkJdS0+cGFja2V0cysrOyAvKiBmb3IgdHJhbnNmZXIgZGVsaW1pdGVyICovCisJCXUtPnVyYiA9IHVzYl9hbGxvY191cmIodS0+cGFja2V0cywgR0ZQX0tFUk5FTCk7CisJCWlmICghdS0+dXJiKQorCQkJZ290byBvdXRfb2ZfbWVtb3J5OworCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlciA9CisJCQl1c2JfYWxsb2NfY29oZXJlbnQoc3Vicy0+ZGV2LCB1LT5idWZmZXJfc2l6ZSwKKwkJCQkJICAgR0ZQX0tFUk5FTCwgJnUtPnVyYi0+dHJhbnNmZXJfZG1hKTsKKwkJaWYgKCF1LT51cmItPnRyYW5zZmVyX2J1ZmZlcikKKwkJCWdvdG8gb3V0X29mX21lbW9yeTsKKwkJdS0+dXJiLT5waXBlID0gc3Vicy0+ZGF0YXBpcGU7CisJCXUtPnVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJdS0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgc3Vicy0+ZGF0YWludGVydmFsOworCQl1LT51cmItPmNvbnRleHQgPSB1OworCQl1LT51cmItPmNvbXBsZXRlID0gc25kX2NvbXBsZXRlX3VyYjsKKwl9CisKKwlpZiAoc3Vicy0+c3luY3BpcGUpIHsKKwkJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3luYyB1cmJzICovCisJCXN1YnMtPnN5bmNidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoc3Vicy0+ZGV2LCBTWU5DX1VSQlMgKiA0LAorCQkJCQkJIEdGUF9LRVJORUwsICZzdWJzLT5zeW5jX2RtYSk7CisJCWlmICghc3Vicy0+c3luY2J1ZikKKwkJCWdvdG8gb3V0X29mX21lbW9yeTsKKwkJZm9yIChpID0gMDsgaSA8IFNZTkNfVVJCUzsgaSsrKSB7CisJCQlzdHJ1Y3Qgc25kX3VyYl9jdHggKnUgPSAmc3Vicy0+c3luY3VyYltpXTsKKwkJCXUtPmluZGV4ID0gaTsKKwkJCXUtPnN1YnMgPSBzdWJzOworCQkJdS0+cGFja2V0cyA9IDE7CisJCQl1LT51cmIgPSB1c2JfYWxsb2NfdXJiKDEsIEdGUF9LRVJORUwpOworCQkJaWYgKCF1LT51cmIpCisJCQkJZ290byBvdXRfb2ZfbWVtb3J5OworCQkJdS0+dXJiLT50cmFuc2Zlcl9idWZmZXIgPSBzdWJzLT5zeW5jYnVmICsgaSAqIDQ7CisJCQl1LT51cmItPnRyYW5zZmVyX2RtYSA9IHN1YnMtPnN5bmNfZG1hICsgaSAqIDQ7CisJCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSA0OworCQkJdS0+dXJiLT5waXBlID0gc3Vicy0+c3luY3BpcGU7CisJCQl1LT51cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQIHwKKwkJCQkJCSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJCXUtPnVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAxOworCQkJdS0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgc3Vicy0+c3luY2ludGVydmFsOworCQkJdS0+dXJiLT5jb250ZXh0ID0gdTsKKwkJCXUtPnVyYi0+Y29tcGxldGUgPSBzbmRfY29tcGxldGVfc3luY191cmI7CisJCX0KKwl9CisJcmV0dXJuIDA7CisKK291dF9vZl9tZW1vcnk6CisJc25kX3VzYl9yZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN1YnMsIDApOworCXJldHVybiAtRU5PTUVNOworfQorCisvKgorICogcHJlcGFyZSB1cmIgZm9yIGZ1bGwgc3BlZWQgY2FwdHVyZSBzeW5jIHBpcGUKKyAqCisgKiBmaWxsIHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiBlYWNoIHVyYiBkZXNjcmlwdG9yLgorICogdGhlIGZpeGVkIDEwLjE0IGZyZXF1ZW5jeSBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgcGlwZS4KKyAqLworc3RhdGljIGludCBwcmVwYXJlX2NhcHR1cmVfc3luY191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAorCQkJCSAgICBzdHJ1Y3QgdXJiICp1cmIpCit7CisJdW5zaWduZWQgY2hhciAqY3AgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKKworCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7IC8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXQgZWFjaCB0aW1lICovCisJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSAzOworCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKKwljcFswXSA9IHN1YnMtPmZyZXFuID4+IDI7CisJY3BbMV0gPSBzdWJzLT5mcmVxbiA+PiAxMDsKKwljcFsyXSA9IHN1YnMtPmZyZXFuID4+IDE4OworCXJldHVybiAwOworfQorCisvKgorICogcHJlcGFyZSB1cmIgZm9yIGhpZ2ggc3BlZWQgY2FwdHVyZSBzeW5jIHBpcGUKKyAqCisgKiBmaWxsIHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiBlYWNoIHVyYiBkZXNjcmlwdG9yLgorICogdGhlIGZpeGVkIDEyLjEzIGZyZXF1ZW5jeSBpcyBwYXNzZWQgYXMgMTYuMTYgdGhyb3VnaCB0aGUgcGlwZS4KKyAqLworc3RhdGljIGludCBwcmVwYXJlX2NhcHR1cmVfc3luY191cmJfaHMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAorCQkJCSAgICAgICBzdHJ1Y3QgdXJiICp1cmIpCit7CisJdW5zaWduZWQgY2hhciAqY3AgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKKworCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7IC8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXQgZWFjaCB0aW1lICovCisJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSA0OworCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKKwljcFswXSA9IHN1YnMtPmZyZXFuOworCWNwWzFdID0gc3Vicy0+ZnJlcW4gPj4gODsKKwljcFsyXSA9IHN1YnMtPmZyZXFuID4+IDE2OworCWNwWzNdID0gc3Vicy0+ZnJlcW4gPj4gMjQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcm9jZXNzIGFmdGVyIGNhcHR1cmUgc3luYyBjb21wbGV0ZQorICogLSBub3RoaW5nIHRvIGRvCisgKi8KK3N0YXRpYyBpbnQgcmV0aXJlX2NhcHR1cmVfc3luY191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkJICAgc3RydWN0IHVyYiAqdXJiKQoreworCXJldHVybiAwOworfQorCisvKgorICogcHJlcGFyZSB1cmIgZm9yIGNhcHR1cmUgZGF0YSBwaXBlCisgKgorICogZmlsbCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggb2YgZWFjaCBkZXNjcmlwdG9yLgorICoKKyAqIHdlIHVzZSBhIHRlbXBvcmFyeSBidWZmZXIgdG8gd3JpdGUgdGhlIGNhcHR1cmVkIGRhdGEuCisgKiBzaW5jZSB0aGUgbGVuZ3RoIG9mIHdyaXR0ZW4gZGF0YSBpcyBkZXRlcm1pbmVkIGJ5IGhvc3QsIHdlIGNhbm5vdAorICogd3JpdGUgb250byB0aGUgcGNtIGJ1ZmZlciBkaXJlY3RseS4uLiAgdGhlIGRhdGEgaXMgdGh1cyBjb3BpZWQKKyAqIGxhdGVyIGF0IGNvbXBsZXRlIGNhbGxiYWNrIHRvIHRoZSBnbG9iYWwgYnVmZmVyLgorICovCitzdGF0aWMgaW50IHByZXBhcmVfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQoreworCWludCBpLCBvZmZzOworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OworCisJb2ZmcyA9IDA7CisJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3R4LT5wYWNrZXRzOyBpKyspIHsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBvZmZzOworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IHN1YnMtPmN1cnBhY2tzaXplOworCQlvZmZzICs9IHN1YnMtPmN1cnBhY2tzaXplOworCX0KKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBvZmZzOworCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBjdHgtPnBhY2tldHM7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcm9jZXNzIGFmdGVyIGNhcHR1cmUgY29tcGxldGUKKyAqCisgKiBjb3B5IHRoZSBkYXRhIGZyb20gZWFjaCBkZXNjdGlwdG9yIHRvIHRoZSBwY20gYnVmZmVyLCBhbmQKKyAqIHVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAqLworc3RhdGljIGludCByZXRpcmVfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCSAgICAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgKmNwOworCWludCBpOworCXVuc2lnbmVkIGludCBzdHJpZGUsIGZyYW1lcywgYnl0ZXMsIG9sZHB0cjsKKwlpbnQgcGVyaW9kX2VsYXBzZWQgPSAwOworCisJc3RyaWRlID0gcnVudGltZS0+ZnJhbWVfYml0cyA+PiAzOworCisJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQljcCA9ICh1bnNpZ25lZCBjaGFyICopdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKKwkJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKSB7CisJCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJmcmFtZSAlZCBhY3RpdmU6ICVkXG4iLCBpLCB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CisJCQkvLyBjb250aW51ZTsKKwkJfQorCQlieXRlcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJZnJhbWVzID0gYnl0ZXMgLyBzdHJpZGU7CisJCWlmICghc3Vicy0+dHhmcl9xdWlyaykKKwkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOworCQlpZiAoYnl0ZXMgJSAocnVudGltZS0+c2FtcGxlX2JpdHMgPj4gMykgIT0gMCkgeworI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQorCQkJaW50IG9sZGJ5dGVzID0gYnl0ZXM7CisjZW5kaWYKKwkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOworCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIkNvcnJlY3RlZCB1cmIgZGF0YSBsZW4uICVkLT4lZFxuIiwKKwkJCQkJCQlvbGRieXRlcywgYnl0ZXMpOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgY3VycmVudCBwb2ludGVyICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJzLT5sb2NrLCBmbGFncyk7CisJCW9sZHB0ciA9IHN1YnMtPmh3cHRyX2RvbmU7CisJCXN1YnMtPmh3cHRyX2RvbmUgKz0gYnl0ZXM7CisJCWlmIChzdWJzLT5od3B0cl9kb25lID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlKQorCQkJc3Vicy0+aHdwdHJfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZTsKKwkJZnJhbWVzID0gKGJ5dGVzICsgKG9sZHB0ciAlIHN0cmlkZSkpIC8gc3RyaWRlOworCQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGZyYW1lczsKKwkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKKwkJCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7CisJCQlwZXJpb2RfZWxhcHNlZCA9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOworCQkvKiBjb3B5IGEgZGF0YSBjaHVuayAqLworCQlpZiAob2xkcHRyICsgYnl0ZXMgPiBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkgeworCQkJdW5zaWduZWQgaW50IGJ5dGVzMSA9CisJCQkJCXJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlIC0gb2xkcHRyOworCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgb2xkcHRyLCBjcCwgYnl0ZXMxKTsKKwkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgY3AgKyBieXRlczEsIGJ5dGVzIC0gYnl0ZXMxKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArIG9sZHB0ciwgY3AsIGJ5dGVzKTsKKwkJfQorCX0KKwlpZiAocGVyaW9kX2VsYXBzZWQpCisJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vicy0+cGNtX3N1YnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFmdGVyIGNhcHR1cmUgY29tcGxldGUgd2hlbiBwYXVzZWQuICBOb3RoaW5nIHRvIGRvLgorICovCitzdGF0aWMgaW50IHJldGlyZV9wYXVzZWRfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcHJlcGFyZSB1cmIgZm9yIHBsYXliYWNrIHN5bmMgcGlwZQorICoKKyAqIHNldCB1cCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggdG8gcmVjZWl2ZSB0aGUgY3VycmVudCBmcmVxdWVuY3kuCisgKi8KK3N0YXRpYyBpbnQgcHJlcGFyZV9wbGF5YmFja19zeW5jX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAorCQkJCSAgICAgc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OworCisJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KKwl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IG1pbig0dSwgY3R4LT5zdWJzLT5zeW5jbWF4c2l6ZSk7CisJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogcHJvY2VzcyBhZnRlciBwbGF5YmFjayBzeW5jIGNvbXBsZXRlCisgKgorICogRnVsbCBzcGVlZCBkZXZpY2VzIHJlcG9ydCBmZWVkYmFjayB2YWx1ZXMgaW4gMTAuMTQgZm9ybWF0IGFzIHNhbXBsZXMgcGVyCisgKiBmcmFtZSwgaGlnaCBzcGVlZCBkZXZpY2VzIGluIDE2LjE2IGZvcm1hdCBhcyBzYW1wbGVzIHBlciBtaWNyb2ZyYW1lLgorICogQmVjYXVzZSB0aGUgQXVkaW8gQ2xhc3MgMSBzcGVjIHdhcyB3cml0dGVuIGJlZm9yZSBVU0IgMi4wLCBtYW55IGhpZ2ggc3BlZWQKKyAqIGRldmljZXMgdXNlIGEgd3JvbmcgaW50ZXJwcmV0YXRpb24sIHNvbWUgb3RoZXJzIHVzZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQKKyAqIGZvcm1hdC4gIFRoZXJlZm9yZSwgd2UgY2Fubm90IHByZWRpY3Qgd2hhdCBmb3JtYXQgYW55IHBhcnRpY3VsYXIgZGV2aWNlIHVzZXMKKyAqIGFuZCBtdXN0IGRldGVjdCBpdCBhdXRvbWF0aWNhbGx5LgorICovCitzdGF0aWMgaW50IHJldGlyZV9wbGF5YmFja19zeW5jX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkJICAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBpbnQgZjsKKwlpbnQgc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh1cmItPmlzb19mcmFtZV9kZXNjWzBdLnN0YXR1cyAhPSAwIHx8CisJICAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uYWN0dWFsX2xlbmd0aCA8IDMpCisJCXJldHVybiAwOworCisJZiA9IGxlMzJfdG9fY3B1cCh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uYWN0dWFsX2xlbmd0aCA9PSAzKQorCQlmICY9IDB4MDBmZmZmZmY7CisJZWxzZQorCQlmICY9IDB4MGZmZmZmZmY7CisJaWYgKGYgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5saWtlbHkoc3Vicy0+ZnJlcXNoaWZ0ID09IElOVF9NSU4pKSB7CisJCS8qCisJCSAqIFRoZSBmaXJzdCB0aW1lIHdlIHNlZSBhIGZlZWRiYWNrIHZhbHVlLCBkZXRlcm1pbmUgaXRzIGZvcm1hdAorCQkgKiBieSBzaGlmdGluZyBpdCBsZWZ0IG9yIHJpZ2h0IHVudGlsIGl0IG1hdGNoZXMgdGhlIG5vbWluYWwKKwkJICogZnJlcXVlbmN5IHZhbHVlLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGZlZWRiYWNrIGRvZXMgbm90CisJCSAqIGRpZmZlciBmcm9tIHRoZSBub21pbmFsIHZhbHVlIG1vcmUgdGhhbiArNTAlIG9yIC0yNSUuCisJCSAqLworCQlzaGlmdCA9IDA7CisJCXdoaWxlIChmIDwgc3Vicy0+ZnJlcW4gLSBzdWJzLT5mcmVxbiAvIDQpIHsKKwkJCWYgPDw9IDE7CisJCQlzaGlmdCsrOworCQl9CisJCXdoaWxlIChmID4gc3Vicy0+ZnJlcW4gKyBzdWJzLT5mcmVxbiAvIDIpIHsKKwkJCWYgPj49IDE7CisJCQlzaGlmdC0tOworCQl9CisJCXN1YnMtPmZyZXFzaGlmdCA9IHNoaWZ0OworCX0KKwllbHNlIGlmIChzdWJzLT5mcmVxc2hpZnQgPj0gMCkKKwkJZiA8PD0gc3Vicy0+ZnJlcXNoaWZ0OworCWVsc2UKKwkJZiA+Pj0gLXN1YnMtPmZyZXFzaGlmdDsKKworCWlmIChsaWtlbHkoZiA+PSBzdWJzLT5mcmVxbiAtIHN1YnMtPmZyZXFuIC8gOCAmJiBmIDw9IHN1YnMtPmZyZXFtYXgpKSB7CisJCS8qCisJCSAqIElmIHRoZSBmcmVxdWVuY3kgbG9va3MgdmFsaWQsIHNldCBpdC4KKwkJICogVGhpcyB2YWx1ZSBpcyByZWZlcnJlZCB0byBpbiBwcmVwYXJlX3BsYXliYWNrX3VyYigpLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN1YnMtPmxvY2ssIGZsYWdzKTsKKwkJc3Vicy0+ZnJlcW0gPSBmOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJzLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT3V0IG9mIHJhbmdlOyBtYXliZSB0aGUgc2hpZnQgdmFsdWUgaXMgd3JvbmcuCisJCSAqIFJlc2V0IGl0IHNvIHRoYXQgd2UgYXV0b2RldGVjdCBhZ2FpbiB0aGUgbmV4dCB0aW1lLgorCQkgKi8KKwkJc3Vicy0+ZnJlcXNoaWZ0ID0gSU5UX01JTjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwYXJzZV91YWNfZW5kcG9pbnRfYXR0cmlidXRlcyhzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwKLQkJCQkJIHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdHMsCi0JCQkJCSBpbnQgcHJvdG9jb2wsIGludCBpZmFjZV9ubykKKy8qIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGUgbmV4dCBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgc25kX3VzYl9hdWRpb19uZXh0X3BhY2tldF9zaXplKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicykKIHsKLQkvKiBwYXJzZWQgd2l0aCBhIHYxIGhlYWRlciBoZXJlLiB0aGF0J3Mgb2sgYXMgd2Ugb25seSBsb29rIGF0IHRoZQotCSAqIGhlYWRlciBmaXJzdCB3aGljaCBpcyB0aGUgc2FtZSBmb3IgYm90aCB2ZXJzaW9ucyAqLwotCXN0cnVjdCB1YWNfaXNvX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmNzZXA7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqYWx0c2QgPSBnZXRfaWZhY2VfZGVzYyhhbHRzKTsKLQlpbnQgYXR0cmlidXRlcyA9IDA7CisJaWYgKHN1YnMtPmZpbGxfbWF4KQorCQlyZXR1cm4gc3Vicy0+bWF4ZnJhbWVzaXplOworCWVsc2UgeworCQlzdWJzLT5waGFzZSA9IChzdWJzLT5waGFzZSAmIDB4ZmZmZikKKwkJCSsgKHN1YnMtPmZyZXFtIDw8IHN1YnMtPmRhdGFpbnRlcnZhbCk7CisJCXJldHVybiBtaW4oc3Vicy0+cGhhc2UgPj4gMTYsIHN1YnMtPm1heGZyYW1lc2l6ZSk7CisJfQorfQogCi0JY3NlcCA9IHNuZF91c2JfZmluZF9kZXNjKGFsdHMtPmVuZHBvaW50WzBdLmV4dHJhLCBhbHRzLT5lbmRwb2ludFswXS5leHRyYWxlbiwgTlVMTCwgVVNCX0RUX0NTX0VORFBPSU5UKTsKKy8qCisgKiBQcmVwYXJlIHVyYiBmb3Igc3RyZWFtaW5nIGJlZm9yZSBwbGF5YmFjayBzdGFydHMgb3Igd2hlbiBwYXVzZWQuCisgKgorICogV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSwgc28gd2Ugc2VuZCBzaWxlbmNlLgorICovCitzdGF0aWMgaW50IHByZXBhcmVfbm9kYXRhX3BsYXliYWNrX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkJICAgICAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgb2ZmcywgY291bnRzOworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OworCWludCBzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7CiAKLQkvKiBDcmVhbXdhcmUgTm9haCBoYXMgdGhpcyBkZXNjcmlwdG9yIGFmdGVyIHRoZSAybmQgZW5kcG9pbnQgKi8KLQlpZiAoIWNzZXAgJiYgYWx0c2QtPmJOdW1FbmRwb2ludHMgPj0gMikKLQkJY3NlcCA9IHNuZF91c2JfZmluZF9kZXNjKGFsdHMtPmVuZHBvaW50WzFdLmV4dHJhLCBhbHRzLT5lbmRwb2ludFsxXS5leHRyYWxlbiwgTlVMTCwgVVNCX0RUX0NTX0VORFBPSU5UKTsKKwlvZmZzID0gMDsKKwl1cmItPmRldiA9IGN0eC0+c3Vicy0+ZGV2OworCWZvciAoaSA9IDA7IGkgPCBjdHgtPnBhY2tldHM7ICsraSkgeworCQljb3VudHMgPSBzbmRfdXNiX2F1ZGlvX25leHRfcGFja2V0X3NpemUoc3Vicyk7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ID0gb2ZmcyAqIHN0cmlkZTsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGggPSBjb3VudHMgKiBzdHJpZGU7CisJCW9mZnMgKz0gY291bnRzOworCX0KKwl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gY3R4LT5wYWNrZXRzOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IG9mZnMgKiBzdHJpZGU7CisJbWVtc2V0KHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCSAgICAgICBydW50aW1lLT5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9VOCA/IDB4ODAgOiAwLAorCSAgICAgICBvZmZzICogc3RyaWRlKTsKKwlyZXR1cm4gMDsKK30KIAotCWlmICghY3NlcCB8fCBjc2VwLT5iTGVuZ3RoIDwgNyB8fAotCSAgICBjc2VwLT5iRGVzY3JpcHRvclN1YnR5cGUgIT0gVUFDX0VQX0dFTkVSQUwpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiV1OiVkIDogbm8gb3IgaW52YWxpZCIKLQkJCSAgICIgY2xhc3Mgc3BlY2lmaWMgZW5kcG9pbnQgZGVzY3JpcHRvclxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBpZmFjZV9ubywKLQkJCSAgIGFsdHNkLT5iQWx0ZXJuYXRlU2V0dGluZyk7CisvKgorICogcHJlcGFyZSB1cmIgZm9yIHBsYXliYWNrIGRhdGEgcGlwZQorICoKKyAqIFNpbmNlIGEgVVJCIGNhbiBoYW5kbGUgb25seSBhIHNpbmdsZSBsaW5lYXIgYnVmZmVyLCB3ZSBtdXN0IHVzZSBkb3VibGUKKyAqIGJ1ZmZlcmluZyB3aGVuIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIG92ZXJmbG93cyB0aGUgYnVmZmVyIGJvdW5kYXJ5LgorICogVG8gYXZvaWQgaW5jb25zaXN0ZW5jaWVzIHdoZW4gdXBkYXRpbmcgaHdwdHJfZG9uZSwgd2UgdXNlIGRvdWJsZSBidWZmZXJpbmcKKyAqIGZvciBhbGwgVVJCcy4KKyAqLworc3RhdGljIGludCBwcmVwYXJlX3BsYXliYWNrX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCQlzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IGksIHN0cmlkZTsKKwl1bnNpZ25lZCBpbnQgY291bnRzLCBmcmFtZXMsIGJ5dGVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBlcmlvZF9lbGFwc2VkID0gMDsKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKKworCXN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsKKworCWZyYW1lcyA9IDA7CisJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KKwl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3Vicy0+bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBjdHgtPnBhY2tldHM7IGkrKykgeworCQljb3VudHMgPSBzbmRfdXNiX2F1ZGlvX25leHRfcGFja2V0X3NpemUoc3Vicyk7CisJCS8qIHNldCB1cCBkZXNjcmlwdG9yICovCisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ID0gZnJhbWVzICogc3RyaWRlOworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IGNvdW50cyAqIHN0cmlkZTsKKwkJZnJhbWVzICs9IGNvdW50czsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cysrOworCQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGNvdW50czsKKwkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKKwkJCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7CisJCQlwZXJpb2RfZWxhcHNlZCA9IDE7CisJCQlpZiAoc3Vicy0+Zm10X3R5cGUgPT0gVUFDX0ZPUk1BVF9UWVBFX0lJKSB7CisJCQkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPiAwKSB7CisJCQkJCS8qIEZJWE1FOiBmaWxsLW1heCBtb2RlIGlzIG5vdAorCQkJCQkgKiBzdXBwb3J0ZWQgeWV0ICovCisJCQkJCWZyYW1lcyAtPSBzdWJzLT50cmFuc2Zlcl9kb25lOworCQkJCQljb3VudHMgLT0gc3Vicy0+dHJhbnNmZXJfZG9uZTsKKwkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGggPQorCQkJCQkJY291bnRzICogc3RyaWRlOworCQkJCQlzdWJzLT50cmFuc2Zlcl9kb25lID0gMDsKKwkJCQl9CisJCQkJaSsrOworCQkJCWlmIChpIDwgY3R4LT5wYWNrZXRzKSB7CisJCQkJCS8qIGFkZCBhIHRyYW5zZmVyIGRlbGltaXRlciAqLworCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCA9CisJCQkJCQlmcmFtZXMgKiBzdHJpZGU7CisJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoID0gMDsKKwkJCQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cysrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocGVyaW9kX2VsYXBzZWQpIC8qIGZpbmlzaCBhdCB0aGUgcGVyaW9kIGJvdW5kYXJ5ICovCisJCQlicmVhazsKKwl9CisJYnl0ZXMgPSBmcmFtZXMgKiBzdHJpZGU7CisJaWYgKHN1YnMtPmh3cHRyX2RvbmUgKyBieXRlcyA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlKSB7CisJCS8qIGVyciwgdGhlIHRyYW5zZmVycmVkIGFyZWEgZ29lcyBvdmVyIGJ1ZmZlciBib3VuZGFyeS4gKi8KKwkJdW5zaWduZWQgaW50IGJ5dGVzMSA9CisJCQlydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSAtIHN1YnMtPmh3cHRyX2RvbmU7CisJCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJICAgICAgIHJ1bnRpbWUtPmRtYV9hcmVhICsgc3Vicy0+aHdwdHJfZG9uZSwgYnl0ZXMxKTsKKwkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgYnl0ZXMxLAorCQkgICAgICAgcnVudGltZS0+ZG1hX2FyZWEsIGJ5dGVzIC0gYnl0ZXMxKTsKKwl9IGVsc2UgeworCQltZW1jcHkodXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCSAgICAgICBydW50aW1lLT5kbWFfYXJlYSArIHN1YnMtPmh3cHRyX2RvbmUsIGJ5dGVzKTsKKwl9CisJc3Vicy0+aHdwdHJfZG9uZSArPSBieXRlczsKKwlpZiAoc3Vicy0+aHdwdHJfZG9uZSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkKKwkJc3Vicy0+aHdwdHJfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZTsKKworCS8qIHVwZGF0ZSBkZWxheSB3aXRoIGV4YWN0IG51bWJlciBvZiBzYW1wbGVzIHF1ZXVlZCAqLworCXJ1bnRpbWUtPmRlbGF5ID0gc3Vicy0+bGFzdF9kZWxheTsKKwlydW50aW1lLT5kZWxheSArPSBmcmFtZXM7CisJc3Vicy0+bGFzdF9kZWxheSA9IHJ1bnRpbWUtPmRlbGF5OworCisJLyogcmVhbGlnbiBsYXN0X2ZyYW1lX251bWJlciAqLworCXN1YnMtPmxhc3RfZnJhbWVfbnVtYmVyID0gdXNiX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcihzdWJzLT5kZXYpOworCXN1YnMtPmxhc3RfZnJhbWVfbnVtYmVyICY9IDB4RkY7IC8qIGtlZXAgOCBMU0JzICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJzLT5sb2NrLCBmbGFncyk7CisJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gYnl0ZXM7CisJaWYgKHBlcmlvZF9lbGFwc2VkKQorCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnMtPnBjbV9zdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCisvKgorICogcHJvY2VzcyBhZnRlciBwbGF5YmFjayBkYXRhIGNvbXBsZXRlCisgKiAtIGRlY3JlYXNlIHRoZSBkZWxheSBjb3VudCBhZ2FpbgorICovCitzdGF0aWMgaW50IHJldGlyZV9wbGF5YmFja191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsKKwlpbnQgcHJvY2Vzc2VkID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC8gc3RyaWRlOworCWludCBlc3RfZGVsYXk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3Vicy0+bG9jaywgZmxhZ3MpOworCisJZXN0X2RlbGF5ID0gc25kX3VzYl9wY21fZGVsYXkoc3VicywgcnVudGltZS0+cmF0ZSk7CisJLyogdXBkYXRlIGRlbGF5IHdpdGggZXhhY3QgbnVtYmVyIG9mIHNhbXBsZXMgcGxheWVkICovCisJaWYgKHByb2Nlc3NlZCA+IHN1YnMtPmxhc3RfZGVsYXkpCisJCXN1YnMtPmxhc3RfZGVsYXkgPSAwOworCWVsc2UKKwkJc3Vicy0+bGFzdF9kZWxheSAtPSBwcm9jZXNzZWQ7CisJcnVudGltZS0+ZGVsYXkgPSBzdWJzLT5sYXN0X2RlbGF5OworCisJLyoKKwkgKiBSZXBvcnQgd2hlbiBkZWxheSBlc3RpbWF0ZSBpcyBvZmYgYnkgbW9yZSB0aGFuIDJtcy4KKwkgKiBUaGUgZXJyb3Igc2hvdWxkIGJlIGxvd2VyIHRoYW4gMm1zIHNpbmNlIHRoZSBlc3RpbWF0ZSByZWxpZXMKKwkgKiBvbiB0d28gcmVhZHMgb2YgYSBjb3VudGVyIHVwZGF0ZWQgZXZlcnkgbXMuCisJICovCisJaWYgKGFicyhlc3RfZGVsYXkgLSBzdWJzLT5sYXN0X2RlbGF5KSAqIDEwMDAgPiBydW50aW1lLT5yYXRlICogMikKKwkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJkZWxheTogZXN0aW1hdGVkICVkLCBhY3R1YWwgJWRcbiIsCisJCQllc3RfZGVsYXksIHN1YnMtPmxhc3RfZGVsYXkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdXNiX2Vycm9yX3N0cmluZyhpbnQgZXJyKQoreworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSAtRU5PREVWOgorCQlyZXR1cm4gIm5vIGRldmljZSI7CisJY2FzZSAtRU5PRU5UOgorCQlyZXR1cm4gImVuZHBvaW50IG5vdCBlbmFibGVkIjsKKwljYXNlIC1FUElQRToKKwkJcmV0dXJuICJlbmRwb2ludCBzdGFsbGVkIjsKKwljYXNlIC1FTk9TUEM6CisJCXJldHVybiAibm90IGVub3VnaCBiYW5kd2lkdGgiOworCWNhc2UgLUVTSFVURE9XTjoKKwkJcmV0dXJuICJkZXZpY2UgZGlzYWJsZWQiOworCWNhc2UgLUVIT1NUVU5SRUFDSDoKKwkJcmV0dXJuICJkZXZpY2Ugc3VzcGVuZGVkIjsKKwljYXNlIC1FSU5WQUw6CisJY2FzZSAtRUFHQUlOOgorCWNhc2UgLUVGQklHOgorCWNhc2UgLUVNU0dTSVpFOgorCQlyZXR1cm4gImludGVybmFsIGVycm9yIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24gZXJyb3IiOworCX0KK30KKworLyoKKyAqIHNldCB1cCBhbmQgc3RhcnQgZGF0YS9zeW5jIHVyYnMKKyAqLworc3RhdGljIGludCBzdGFydF91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3Vicywgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJaWYgKHN1YnMtPnN0cmVhbS0+Y2hpcC0+c2h1dGRvd24pCisJCXJldHVybiAtRUJBREZEOworCisJZm9yIChpID0gMDsgaSA8IHN1YnMtPm51cmJzOyBpKyspIHsKKwkJaWYgKHNuZF9CVUdfT04oIXN1YnMtPmRhdGF1cmJbaV0udXJiKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoc3Vicy0+b3BzLnByZXBhcmUoc3VicywgcnVudGltZSwgc3Vicy0+ZGF0YXVyYltpXS51cmIpIDwgMCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHByZXBhcmUgZGF0YXBpcGUgZm9yIHVyYiAlZFxuIiwgaSk7CisJCQlnb3RvIF9fZXJyb3I7CisJCX0KKwl9CisJaWYgKHN1YnMtPnN5bmNwaXBlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgeworCQkJaWYgKHNuZF9CVUdfT04oIXN1YnMtPnN5bmN1cmJbaV0udXJiKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChzdWJzLT5vcHMucHJlcGFyZV9zeW5jKHN1YnMsIHJ1bnRpbWUsIHN1YnMtPnN5bmN1cmJbaV0udXJiKSA8IDApIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcHJlcGFyZSBzeW5jcGlwZSBmb3IgdXJiICVkXG4iLCBpKTsKKwkJCQlnb3RvIF9fZXJyb3I7CisJCQl9CisJCX0KKwl9CisKKwlzdWJzLT5hY3RpdmVfbWFzayA9IDA7CisJc3Vicy0+dW5saW5rX21hc2sgPSAwOworCXN1YnMtPnJ1bm5pbmcgPSAxOworCWZvciAoaSA9IDA7IGkgPCBzdWJzLT5udXJiczsgaSsrKSB7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHN1YnMtPmRhdGF1cmJbaV0udXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBzdWJtaXQgZGF0YXBpcGUgIgorCQkJCSAgICJmb3IgdXJiICVkLCBlcnJvciAlZDogJXNcbiIsCisJCQkJICAgaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOworCQkJZ290byBfX2Vycm9yOworCQl9CisJCXNldF9iaXQoaSwgJnN1YnMtPmFjdGl2ZV9tYXNrKTsKKwl9CisJaWYgKHN1YnMtPnN5bmNwaXBlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgeworCQkJZXJyID0gdXNiX3N1Ym1pdF91cmIoc3Vicy0+c3luY3VyYltpXS51cmIsIEdGUF9BVE9NSUMpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc3VibWl0IHN5bmNwaXBlICIKKwkJCQkJICAgImZvciB1cmIgJWQsIGVycm9yICVkOiAlc1xuIiwKKwkJCQkJICAgaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOworCQkJCWdvdG8gX19lcnJvcjsKKwkJCX0KKwkJCXNldF9iaXQoaSArIDE2LCAmc3Vicy0+YWN0aXZlX21hc2spOworCQl9CisJfQorCXJldHVybiAwOworCisgX19lcnJvcjoKKwkvLyBzbmRfcGNtX3N0b3Aoc3Vicy0+cGNtX3N1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOworCWRlYWN0aXZhdGVfdXJicyhzdWJzLCAwLCAwKTsKKwlyZXR1cm4gLUVQSVBFOworfQorCisKKy8qCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3VyYl9vcHMgYXVkaW9fdXJiX29wc1syXSA9IHsKKwl7CisJCS5wcmVwYXJlID0JcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiLAorCQkucmV0aXJlID0JcmV0aXJlX3BsYXliYWNrX3VyYiwKKwkJLnByZXBhcmVfc3luYyA9CXByZXBhcmVfcGxheWJhY2tfc3luY191cmIsCisJCS5yZXRpcmVfc3luYyA9CXJldGlyZV9wbGF5YmFja19zeW5jX3VyYiwKKwl9LAorCXsKKwkJLnByZXBhcmUgPQlwcmVwYXJlX2NhcHR1cmVfdXJiLAorCQkucmV0aXJlID0JcmV0aXJlX2NhcHR1cmVfdXJiLAorCQkucHJlcGFyZV9zeW5jID0JcHJlcGFyZV9jYXB0dXJlX3N5bmNfdXJiLAorCQkucmV0aXJlX3N5bmMgPQlyZXRpcmVfY2FwdHVyZV9zeW5jX3VyYiwKKwl9LAorfTsKKworLyoKKyAqIGluaXRpYWxpemUgdGhlIHN1YnN0cmVhbSBpbnN0YW5jZS4KKyAqLworCit2b2lkIHNuZF91c2JfaW5pdF9zdWJzdHJlYW0oc3RydWN0IHNuZF91c2Jfc3RyZWFtICphcywKKwkJCSAgICBpbnQgc3RyZWFtLCBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKQoreworCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9ICZhcy0+c3Vic3RyZWFtW3N0cmVhbV07CisKKwlJTklUX0xJU1RfSEVBRCgmc3Vicy0+Zm10X2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZzdWJzLT5sb2NrKTsKKworCXN1YnMtPnN0cmVhbSA9IGFzOworCXN1YnMtPmRpcmVjdGlvbiA9IHN0cmVhbTsKKwlzdWJzLT5kZXYgPSBhcy0+Y2hpcC0+ZGV2OworCXN1YnMtPnR4ZnJfcXVpcmsgPSBhcy0+Y2hpcC0+dHhmcl9xdWlyazsKKwlzdWJzLT5vcHMgPSBhdWRpb191cmJfb3BzW3N0cmVhbV07CisJaWYgKHNuZF91c2JfZ2V0X3NwZWVkKHN1YnMtPmRldikgPj0gVVNCX1NQRUVEX0hJR0gpCisJCXN1YnMtPm9wcy5wcmVwYXJlX3N5bmMgPSBwcmVwYXJlX2NhcHR1cmVfc3luY191cmJfaHM7CisKKwlzbmRfdXNiX3NldF9wY21fb3BzKGFzLT5wY20sIHN0cmVhbSk7CisKKwlsaXN0X2FkZF90YWlsKCZmcC0+bGlzdCwgJnN1YnMtPmZtdF9saXN0KTsKKwlzdWJzLT5mb3JtYXRzIHw9IGZwLT5mb3JtYXRzOworCXN1YnMtPmVuZHBvaW50ID0gZnAtPmVuZHBvaW50OworCXN1YnMtPm51bV9mb3JtYXRzKys7CisJc3Vicy0+Zm10X3R5cGUgPSBmcC0+Zm10X3R5cGU7Cit9CisKK2ludCBzbmRfdXNiX3N1YnN0cmVhbV9wbGF5YmFja190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX3BsYXliYWNrX3VyYjsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlyZXR1cm4gZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDApOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX25vZGF0YV9wbGF5YmFja191cmI7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8xKSB7Ci0JCWF0dHJpYnV0ZXMgPSBjc2VwLT5ibUF0dHJpYnV0ZXM7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHVhYzJfaXNvX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmNzZXAyID0KLQkJCShzdHJ1Y3QgdWFjMl9pc29fZW5kcG9pbnRfZGVzY3JpcHRvciAqKSBjc2VwOwotCi0JCWF0dHJpYnV0ZXMgPSBjc2VwLT5ibUF0dHJpYnV0ZXMgJiBVQUNfRVBfQ1NfQVRUUl9GSUxMX01BWDsKLQotCQkvKiBlbXVsYXRlIHRoZSBlbmRwb2ludCBhdHRyaWJ1dGVzIG9mIGEgdjEgZGV2aWNlICovCi0JCWlmIChjc2VwMi0+Ym1Db250cm9scyAmIFVBQzJfQ09OVFJPTF9QSVRDSCkKLQkJCWF0dHJpYnV0ZXMgfD0gVUFDX0VQX0NTX0FUVFJfUElUQ0hfQ09OVFJPTDsKLQl9Ci0KLQlyZXR1cm4gYXR0cmlidXRlczsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCB1YWMyX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKgotCXNuZF91c2JfZmluZF9pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmN0cmxfaWZhY2UsCi0JCQkJCSAgICAgICBpbnQgdGVybWluYWxfaWQpCitpbnQgc25kX3VzYl9zdWJzdHJlYW1fY2FwdHVyZV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQogewotCXN0cnVjdCB1YWMyX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKnRlcm0gPSBOVUxMOworCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCi0Jd2hpbGUgKCh0ZXJtID0gc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoY3RybF9pZmFjZS0+ZXh0cmEsCi0JCQkJCSAgICAgICBjdHJsX2lmYWNlLT5leHRyYWxlbiwKLQkJCQkJICAgICAgIHRlcm0sIFVBQ19JTlBVVF9URVJNSU5BTCkpKSB7Ci0JCWlmICh0ZXJtLT5iVGVybWluYWxJRCA9PSB0ZXJtaW5hbF9pZCkKLQkJCXJldHVybiB0ZXJtOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJc3Vicy0+b3BzLnJldGlyZSA9IHJldGlyZV9jYXB0dXJlX3VyYjsKKwkJcmV0dXJuIHN0YXJ0X3VyYnMoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lKTsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXJldHVybiBkZWFjdGl2YXRlX3VyYnMoc3VicywgMCwgMCk7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlzdWJzLT5vcHMucmV0aXJlID0gcmV0aXJlX3BhdXNlZF9jYXB0dXJlX3VyYjsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlzdWJzLT5vcHMucmV0aXJlID0gcmV0aXJlX2NhcHR1cmVfdXJiOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCB1YWMyX291dHB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yICoKLQlzbmRfdXNiX2ZpbmRfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqY3RybF9pZmFjZSwKLQkJCQkJCWludCB0ZXJtaW5hbF9pZCkKK2ludCBzbmRfdXNiX3N1YnN0cmVhbV9wcmVwYXJlKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCiB7Ci0Jc3RydWN0IHVhYzJfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKnRlcm0gPSBOVUxMOworCS8qIGNsZWFyIHVyYnMgKHRvIGJlIHN1cmUpICovCisJZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDEpOworCXdhaXRfY2xlYXJfdXJicyhzdWJzKTsKIAotCXdoaWxlICgodGVybSA9IHNuZF91c2JfZmluZF9jc2ludF9kZXNjKGN0cmxfaWZhY2UtPmV4dHJhLAotCQkJCQkgICAgICAgY3RybF9pZmFjZS0+ZXh0cmFsZW4sCi0JCQkJCSAgICAgICB0ZXJtLCBVQUNfT1VUUFVUX1RFUk1JTkFMKSkpIHsKLQkJaWYgKHRlcm0tPmJUZXJtaW5hbElEID09IHRlcm1pbmFsX2lkKQotCQkJcmV0dXJuIHRlcm07CisJLyogZm9yIHBsYXliYWNrLCBzdWJtaXQgdGhlIFVSQnMgbm93OyBvdGhlcndpc2UsIHRoZSBmaXJzdCBod3B0cl9kb25lCisJICogdXBkYXRlcyBmb3IgYWxsIFVSQnMgd291bGQgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBzdGFydGluZyAqLworCWlmIChzdWJzLT5kaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlzdWJzLT5vcHMucHJlcGFyZSA9IHByZXBhcmVfbm9kYXRhX3BsYXliYWNrX3VyYjsKKwkJcmV0dXJuIHN0YXJ0X3VyYnMoc3VicywgcnVudGltZSk7CiAJfQogCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBzbmRfdXNiX3BhcnNlX2F1ZGlvX2VuZHBvaW50cyhzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwgaW50IGlmYWNlX25vKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlOwotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdHM7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqYWx0c2Q7Ci0JaW50IGksIGFsdG5vLCBlcnIsIHN0cmVhbTsKLQlpbnQgZm9ybWF0ID0gMCwgbnVtX2NoYW5uZWxzID0gMDsKLQlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwID0gTlVMTDsKLQlpbnQgbnVtLCBwcm90b2NvbCwgY2xvY2sgPSAwOwotCXN0cnVjdCB1YWNfZm9ybWF0X3R5cGVfaV9jb250aW51b3VzX2Rlc2NyaXB0b3IgKmZtdDsKLQotCWRldiA9IGNoaXAtPmRldjsKLQotCS8qIHBhcnNlIHRoZSBpbnRlcmZhY2UncyBhbHRzZXR0aW5ncyAqLwotCWlmYWNlID0gdXNiX2lmbnVtX3RvX2lmKGRldiwgaWZhY2Vfbm8pOwotCi0JbnVtID0gaWZhY2UtPm51bV9hbHRzZXR0aW5nOwotCi0JLyoKLQkgKiBEYWxsYXMgRFM0MjAxIHdvcmthcm91bmQ6IEl0IHByZXNlbnRzIDUgYWx0c2V0dGluZ3MsIGJ1dCB0aGUgbGFzdAotCSAqIG9uZSBtaXNzZXMgc3luY3BpcGUsIGFuZCBkb2VzIG5vdCBwcm9kdWNlIGFueSBzb3VuZC4KLQkgKi8KLQlpZiAoY2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA0ZmEsIDB4NDIwMSkpCi0JCW51bSA9IDQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJYWx0cyA9ICZpZmFjZS0+YWx0c2V0dGluZ1tpXTsKLQkJYWx0c2QgPSBnZXRfaWZhY2VfZGVzYyhhbHRzKTsKLQkJcHJvdG9jb2wgPSBhbHRzZC0+YkludGVyZmFjZVByb3RvY29sOwotCQkvKiBza2lwIGludmFsaWQgb25lICovCi0JCWlmICgoYWx0c2QtPmJJbnRlcmZhY2VDbGFzcyAhPSBVU0JfQ0xBU1NfQVVESU8gJiYKLQkJICAgICBhbHRzZC0+YkludGVyZmFjZUNsYXNzICE9IFVTQl9DTEFTU19WRU5ET1JfU1BFQykgfHwKLQkJICAgIChhbHRzZC0+YkludGVyZmFjZVN1YkNsYXNzICE9IFVTQl9TVUJDTEFTU19BVURJT1NUUkVBTUlORyAmJgotCQkgICAgIGFsdHNkLT5iSW50ZXJmYWNlU3ViQ2xhc3MgIT0gVVNCX1NVQkNMQVNTX1ZFTkRPUl9TUEVDKSB8fAotCQkgICAgYWx0c2QtPmJOdW1FbmRwb2ludHMgPCAxIHx8Ci0JCSAgICBsZTE2X3RvX2NwdShnZXRfZW5kcG9pbnQoYWx0cywgMCktPndNYXhQYWNrZXRTaXplKSA9PSAwKQotCQkJY29udGludWU7Ci0JCS8qIG11c3QgYmUgaXNvY2hyb25vdXMgKi8KLQkJaWYgKChnZXRfZW5kcG9pbnQoYWx0cywgMCktPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPQotCQkgICAgVVNCX0VORFBPSU5UX1hGRVJfSVNPQykKLQkJCWNvbnRpbnVlOwotCQkvKiBjaGVjayBkaXJlY3Rpb24gKi8KLQkJc3RyZWFtID0gKGdldF9lbmRwb2ludChhbHRzLCAwKS0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pID8KLQkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSA6IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JCWFsdG5vID0gYWx0c2QtPmJBbHRlcm5hdGVTZXR0aW5nOwotCi0JCWlmIChzbmRfdXNiX2FwcGx5X2ludGVyZmFjZV9xdWlyayhjaGlwLCBpZmFjZV9ubywgYWx0bm8pKQotCQkJY29udGludWU7Ci0KLQkJLyogZ2V0IGF1ZGlvIGZvcm1hdHMgKi8KLQkJc3dpdGNoIChwcm90b2NvbCkgewotCQlkZWZhdWx0OgotCQkJc25kX3ByaW50ZGQoS0VSTl9XQVJOSU5HICIlZDoldTolZDogdW5rbm93biBpbnRlcmZhY2UgcHJvdG9jb2wgJSMwMngsIGFzc3VtaW5nIHYxXG4iLAotCQkJCSAgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vLCBwcm90b2NvbCk7Ci0JCQlwcm90b2NvbCA9IFVBQ19WRVJTSU9OXzE7Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCQljYXNlIFVBQ19WRVJTSU9OXzE6IHsKLQkJCXN0cnVjdCB1YWMxX2FzX2hlYWRlcl9kZXNjcmlwdG9yICphcyA9Ci0JCQkJc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoYWx0cy0+ZXh0cmEsIGFsdHMtPmV4dHJhbGVuLCBOVUxMLCBVQUNfQVNfR0VORVJBTCk7Ci0KLQkJCWlmICghYXMpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IFVBQ19BU19HRU5FUkFMIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4iLAotCQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGFzLT5iTGVuZ3RoIDwgc2l6ZW9mKCphcykpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKLQkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvcm1hdCA9IGxlMTZfdG9fY3B1KGFzLT53Rm9ybWF0VGFnKTsgLyogcmVtZW1iZXIgdGhlIGZvcm1hdCB2YWx1ZSAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFVBQ19WRVJTSU9OXzI6IHsKLQkJCXN0cnVjdCB1YWMyX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKmlucHV0X3Rlcm07Ci0JCQlzdHJ1Y3QgdWFjMl9vdXRwdXRfdGVybWluYWxfZGVzY3JpcHRvciAqb3V0cHV0X3Rlcm07Ci0JCQlzdHJ1Y3QgdWFjMl9hc19oZWFkZXJfZGVzY3JpcHRvciAqYXMgPQotCQkJCXNuZF91c2JfZmluZF9jc2ludF9kZXNjKGFsdHMtPmV4dHJhLCBhbHRzLT5leHRyYWxlbiwgTlVMTCwgVUFDX0FTX0dFTkVSQUwpOwotCi0JCQlpZiAoIWFzKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBVQUNfQVNfR0VORVJBTCBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuIiwKLQkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChhcy0+Ykxlbmd0aCA8IHNpemVvZigqYXMpKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIFVBQ19BU19HRU5FUkFMIGRlc2NcbiIsCi0JCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQludW1fY2hhbm5lbHMgPSBhcy0+Yk5yQ2hhbm5lbHM7Ci0JCQlmb3JtYXQgPSBsZTMyX3RvX2NwdShhcy0+Ym1Gb3JtYXRzKTsKLQotCQkJLyogbG9va3VwIHRoZSB0ZXJtaW5hbCBhc3NvY2lhdGVkIHRvIHRoaXMgaW50ZXJmYWNlCi0JCQkgKiB0byBleHRyYWN0IHRoZSBjbG9jayAqLwotCQkJaW5wdXRfdGVybSA9IHNuZF91c2JfZmluZF9pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yKGNoaXAtPmN0cmxfaW50ZiwKLQkJCQkJCQkJCSAgICBhcy0+YlRlcm1pbmFsTGluayk7Ci0JCQlpZiAoaW5wdXRfdGVybSkgewotCQkJCWNsb2NrID0gaW5wdXRfdGVybS0+YkNTb3VyY2VJRDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJb3V0cHV0X3Rlcm0gPSBzbmRfdXNiX2ZpbmRfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IoY2hpcC0+Y3RybF9pbnRmLAotCQkJCQkJCQkJICAgICAgYXMtPmJUZXJtaW5hbExpbmspOwotCQkJaWYgKG91dHB1dF90ZXJtKSB7Ci0JCQkJY2xvY2sgPSBvdXRwdXRfdGVybS0+YkNTb3VyY2VJRDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBib2d1cyBiVGVybWluYWxMaW5rICVkXG4iLAotCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIGFzLT5iVGVybWluYWxMaW5rKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCX0KLQotCQkvKiBnZXQgZm9ybWF0IHR5cGUgKi8KLQkJZm10ID0gc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoYWx0cy0+ZXh0cmEsIGFsdHMtPmV4dHJhbGVuLCBOVUxMLCBVQUNfRk9STUFUX1RZUEUpOwotCQlpZiAoIWZtdCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBubyBVQUNfRk9STUFUX1RZUEUgZGVzY1xuIiwKLQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICgoKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpICYmIChmbXQtPmJMZW5ndGggPCA4KSkgfHwKLQkJICAgICgocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMikgJiYgKGZtdC0+Ykxlbmd0aCA8IDYpKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAotCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkgKiBCbHVlIE1pY3JvcGhvbmVzIHdvcmthcm91bmQ6IFRoZSBsYXN0IGFsdHNldHRpbmcgaXMgaWRlbnRpY2FsCi0JCSAqIHdpdGggdGhlIHByZXZpb3VzIG9uZSwgZXhjZXB0IGZvciBhIGxhcmdlciBwYWNrZXQgc2l6ZSwgYnV0Ci0JCSAqIGlzIGFjdHVhbGx5IGEgbWlzbGFiZWxlZCB0d28tY2hhbm5lbCBzZXR0aW5nOyBpZ25vcmUgaXQuCi0JCSAqLwotCQlpZiAoZm10LT5iTnJDaGFubmVscyA9PSAxICYmCi0JCSAgICBmbXQtPmJTdWJmcmFtZVNpemUgPT0gMiAmJgotCQkgICAgYWx0bm8gPT0gMiAmJiBudW0gPT0gMyAmJgotCQkgICAgZnAgJiYgZnAtPmFsdHNldHRpbmcgPT0gMSAmJiBmcC0+Y2hhbm5lbHMgPT0gMSAmJgotCQkgICAgZnAtPmZvcm1hdHMgPT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgJiYKLQkJICAgIHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEgJiYKLQkJICAgIGxlMTZfdG9fY3B1KGdldF9lbmRwb2ludChhbHRzLCAwKS0+d01heFBhY2tldFNpemUpID09Ci0JCQkJCQkJZnAtPm1heHBhY2tzaXplICogMikKLQkJCWNvbnRpbnVlOwotCi0JCWZwID0ga3phbGxvYyhzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghIGZwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJZnAtPmlmYWNlID0gaWZhY2Vfbm87Ci0JCWZwLT5hbHRzZXR0aW5nID0gYWx0bm87Ci0JCWZwLT5hbHRzZXRfaWR4ID0gaTsKLQkJZnAtPmVuZHBvaW50ID0gZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5iRW5kcG9pbnRBZGRyZXNzOwotCQlmcC0+ZXBfYXR0ciA9IGdldF9lbmRwb2ludChhbHRzLCAwKS0+Ym1BdHRyaWJ1dGVzOwotCQlmcC0+ZGF0YWludGVydmFsID0gc25kX3VzYl9wYXJzZV9kYXRhaW50ZXJ2YWwoY2hpcCwgYWx0cyk7Ci0JCWZwLT5tYXhwYWNrc2l6ZSA9IGxlMTZfdG9fY3B1KGdldF9lbmRwb2ludChhbHRzLCAwKS0+d01heFBhY2tldFNpemUpOwotCQkvKiBudW1fY2hhbm5lbHMgaXMgb25seSBzZXQgZm9yIHYyIGludGVyZmFjZXMgKi8KLQkJZnAtPmNoYW5uZWxzID0gbnVtX2NoYW5uZWxzOwotCQlpZiAoc25kX3VzYl9nZXRfc3BlZWQoZGV2KSA9PSBVU0JfU1BFRURfSElHSCkKLQkJCWZwLT5tYXhwYWNrc2l6ZSA9ICgoKGZwLT5tYXhwYWNrc2l6ZSA+PiAxMSkgJiAzKSArIDEpCi0JCQkJCSogKGZwLT5tYXhwYWNrc2l6ZSAmIDB4N2ZmKTsKLQkJZnAtPmF0dHJpYnV0ZXMgPSBwYXJzZV91YWNfZW5kcG9pbnRfYXR0cmlidXRlcyhjaGlwLCBhbHRzLCBwcm90b2NvbCwgaWZhY2Vfbm8pOwotCQlmcC0+Y2xvY2sgPSBjbG9jazsKLQotCQkvKiBzb21lIHF1aXJrcyBmb3IgYXR0cmlidXRlcyBoZXJlICovCi0KLQkJc3dpdGNoIChjaGlwLT51c2JfaWQpIHsKLQkJY2FzZSBVU0JfSUQoMHgwYTkyLCAweDAwNTMpOiAvKiBBdWRpb1RyYWsgT3B0b3BsYXkgKi8KLQkJCS8qIE9wdG9wbGF5IHNldHMgdGhlIHNhbXBsZSByYXRlIGF0dHJpYnV0ZSBhbHRob3VnaAotCQkJICogaXQgc2VlbXMgbm90IHN1cHBvcnRpbmcgaXQgaW4gZmFjdC4KLQkJCSAqLwotCQkJZnAtPmF0dHJpYnV0ZXMgJj0gflVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX0lEKDB4MDQxZSwgMHgzMDIwKTogLyogQ3JlYXRpdmUgU0IgQXVkaWd5IDIgTlggKi8KLQkJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMDMpOiAvKiBNLUF1ZGlvIEF1ZGlvcGhpbGUgVVNCICovCi0JCQkvKiBkb2Vzbid0IHNldCB0aGUgc2FtcGxlIHJhdGUgYXR0cmlidXRlLCBidXQgc3VwcG9ydHMgaXQgKi8KLQkJCWZwLT5hdHRyaWJ1dGVzIHw9IFVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDAxKTogIC8qIE0tQXVkaW8gUXVhdHRybyBVU0IgKi8KLQkJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMTIpOiAgLyogTS1BdWRpbyBGYXN0IFRyYWNrIFBybyBVU0IgKi8KLQkJY2FzZSBVU0JfSUQoMHgwNDdmLCAweDBjYTEpOiAvKiBwbGFudHJvbmljcyBoZWFkc2V0ICovCi0JCWNhc2UgVVNCX0lEKDB4MDc3ZCwgMHgwN2FmKTogLyogR3JpZmZpbiBpTWljIChub3RlIHRoYXQgdGhlcmUgaXMKLQkJCQkJCWFuIG9sZGVyIG1vZGVsIDc3ZDoyMjMpICovCi0JCS8qCi0JCSAqIHBsYW50cm9uaWNzIGhlYWRzZXQgYW5kIEdyaWZmaW4gaU1pYyBoYXZlIHNldCBhZGFwdGl2ZS1pbgotCQkgKiBhbHRob3VnaCBpdCdzIHJlYWxseSBub3QuLi4KLQkJICovCi0JCQlmcC0+ZXBfYXR0ciAmPSB+VVNCX0VORFBPSU5UX1NZTkNUWVBFOwotCQkJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQkJCWZwLT5lcF9hdHRyIHw9IFVTQl9FTkRQT0lOVF9TWU5DX0FEQVBUSVZFOwotCQkJZWxzZQotCQkJCWZwLT5lcF9hdHRyIHw9IFVTQl9FTkRQT0lOVF9TWU5DX1NZTkM7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIG9rLCBsZXQncyBwYXJzZSBmdXJ0aGVyLi4uICovCi0JCWlmIChzbmRfdXNiX3BhcnNlX2F1ZGlvX2Zvcm1hdChjaGlwLCBmcCwgZm9ybWF0LCBmbXQsIHN0cmVhbSwgYWx0cykgPCAwKSB7Ci0JCQlrZnJlZShmcC0+cmF0ZV90YWJsZSk7Ci0JCQlrZnJlZShmcCk7Ci0JCQlmcCA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiJWQ6JXU6JWQ6IGFkZCBhdWRpbyBlbmRwb2ludCAlI3hcbiIsIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIGZwLT5lbmRwb2ludCk7Ci0JCWVyciA9IHNuZF91c2JfYWRkX2F1ZGlvX2VuZHBvaW50KGNoaXAsIHN0cmVhbSwgZnApOwotCQlpZiAoZXJyIDwgMCkgewotCQkJa2ZyZWUoZnAtPnJhdGVfdGFibGUpOwotCQkJa2ZyZWUoZnApOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCQkvKiB0cnkgdG8gc2V0IHRoZSBpbnRlcmZhY2UuLi4gKi8KLQkJdXNiX3NldF9pbnRlcmZhY2UoY2hpcC0+ZGV2LCBpZmFjZV9ubywgYWx0bm8pOwotCQlzbmRfdXNiX2luaXRfcGl0Y2goY2hpcCwgaWZhY2Vfbm8sIGFsdHMsIGZwKTsKLQkJc25kX3VzYl9pbml0X3NhbXBsZV9yYXRlKGNoaXAsIGlmYWNlX25vLCBhbHRzLCBmcCwgZnAtPnJhdGVfbWF4KTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9lbmRwb2ludC5oIGIvc291bmQvdXNiL2VuZHBvaW50LmgKaW5kZXggNjRkZDBkYi4uODhlYjYzYSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2VuZHBvaW50LmgKKysrIGIvc291bmQvdXNiL2VuZHBvaW50LmgKQEAgLTEsMTEgKzEsMjEgQEAKICNpZm5kZWYgX19VU0JBVURJT19FTkRQT0lOVF9ICiAjZGVmaW5lIF9fVVNCQVVESU9fRU5EUE9JTlRfSAogCi1pbnQgc25kX3VzYl9wYXJzZV9hdWRpb19lbmRwb2ludHMoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsCi0JCQkJICBpbnQgaWZhY2Vfbm8pOwordm9pZCBzbmRfdXNiX2luaXRfc3Vic3RyZWFtKHN0cnVjdCBzbmRfdXNiX3N0cmVhbSAqYXMsCisJCQkgICAgaW50IHN0cmVhbSwKKwkJCSAgICBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKTsKIAotaW50IHNuZF91c2JfYWRkX2F1ZGlvX2VuZHBvaW50KHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAotCQkJICAgICAgIGludCBzdHJlYW0sCi0JCQkgICAgICAgc3RydWN0IGF1ZGlvZm9ybWF0ICpmcCk7CitpbnQgc25kX3VzYl9pbml0X3N1YnN0cmVhbV91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCQl1bnNpZ25lZCBpbnQgcGVyaW9kX2J5dGVzLAorCQkJCXVuc2lnbmVkIGludCByYXRlLAorCQkJCXVuc2lnbmVkIGludCBmcmFtZV9iaXRzKTsKKwordm9pZCBzbmRfdXNiX3JlbGVhc2Vfc3Vic3RyZWFtX3VyYnMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLCBpbnQgZm9yY2UpOworCitpbnQgc25kX3VzYl9zdWJzdHJlYW1fcHJlcGFyZShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKTsKKworaW50IHNuZF91c2Jfc3Vic3RyZWFtX3BsYXliYWNrX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpOworaW50IHNuZF91c2Jfc3Vic3RyZWFtX2NhcHR1cmVfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCk7CiAKICNlbmRpZiAvKiBfX1VTQkFVRElPX0VORFBPSU5UX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9mb3JtYXQuYyBiL3NvdW5kL3VzYi9mb3JtYXQuYwppbmRleCA4ZDA0MmRjLi44OTQyMWQxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvZm9ybWF0LmMKKysrIGIvc291bmQvdXNiL2Zvcm1hdC5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAkJCSAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCiAJCQkgICAgICBVQUMyX0NTX0NPTlRST0xfU0FNX0ZSRVEgPDwgOCwKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKGNsb2NrIDw8IDgpLAotCQkJICAgICAgdG1wLCBzaXplb2YodG1wKSwgMTAwMCk7CisJCQkgICAgICB0bXAsIHNpemVvZih0bXApKTsKIAogCWlmIChyZXQgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzKCk6IHVuYWJsZSB0byByZXRyaWV2ZSBudW1iZXIgb2Ygc2FtcGxlIHJhdGVzIChjbG9jayAlZClcbiIsCkBAIC0zMDcsNyArMzA3LDcgQEAKIAkJCSAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCiAJCQkgICAgICBVQUMyX0NTX0NPTlRST0xfU0FNX0ZSRVEgPDwgOCwKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKGNsb2NrIDw8IDgpLAotCQkJICAgICAgZGF0YSwgZGF0YV9zaXplLCAxMDAwKTsKKwkJCSAgICAgIGRhdGEsIGRhdGFfc2l6ZSk7CiAKIAlpZiAocmV0IDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlcygpOiB1bmFibGUgdG8gcmV0cmlldmUgc2FtcGxlIHJhdGUgcmFuZ2UgKGNsb2NrICVkKVxuIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9oZWxwZXIuYyBiL3NvdW5kL3VzYi9oZWxwZXIuYwppbmRleCBmMjgwYzE5Li45ZWVkOGY0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvaGVscGVyLmMKKysrIGIvc291bmQvdXNiL2hlbHBlci5jCkBAIC04MSw3ICs4MSw3IEBACiAgKi8KIGludCBzbmRfdXNiX2N0bF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUsIF9fdTggcmVxdWVzdCwKIAkJICAgIF9fdTggcmVxdWVzdHR5cGUsIF9fdTE2IHZhbHVlLCBfX3UxNiBpbmRleCwgdm9pZCAqZGF0YSwKLQkJICAgIF9fdTE2IHNpemUsIGludCB0aW1lb3V0KQorCQkgICAgX191MTYgc2l6ZSkKIHsKIAlpbnQgZXJyOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CkBAIC05Miw3ICs5Miw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgcGlwZSwgcmVxdWVzdCwgcmVxdWVzdHR5cGUsCi0JCQkgICAgICB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc2l6ZSwgdGltZW91dCk7CisJCQkgICAgICB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc2l6ZSwgMTAwMCk7CiAJaWYgKHNpemUgPiAwKSB7CiAJCW1lbWNweShkYXRhLCBidWYsIHNpemUpOwogCQlrZnJlZShidWYpOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2hlbHBlci5oIGIvc291bmQvdXNiL2hlbHBlci5oCmluZGV4IDA5YmQ5NDMuLjgwNWMzMDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9oZWxwZXIuaAorKysgYi9zb3VuZC91c2IvaGVscGVyLmgKQEAgLTgsNyArOCw3IEBACiAKIGludCBzbmRfdXNiX2N0bF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUsCiAJCSAgICBfX3U4IHJlcXVlc3QsIF9fdTggcmVxdWVzdHR5cGUsIF9fdTE2IHZhbHVlLCBfX3UxNiBpbmRleCwKLQkJICAgIHZvaWQgKmRhdGEsIF9fdTE2IHNpemUsIGludCB0aW1lb3V0KTsKKwkJICAgIHZvaWQgKmRhdGEsIF9fdTE2IHNpemUpOwogCiB1bnNpZ25lZCBjaGFyIHNuZF91c2JfcGFyc2VfZGF0YWludGVydmFsKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAogCQkJCQkgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0cyk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWlkaS5jIGIvc291bmQvdXNiL21pZGkuYwppbmRleCBmOTI4OTEwLi5jODNmNjE0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWlkaS5jCisrKyBiL3NvdW5kL3VzYi9taWRpLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtODE2LDYgKzgxNywyMiBAQAogCS5vdXRwdXQgPSBzbmRfdXNibWlkaV9yYXdfb3V0cHV0LAogfTsKIAorLyoKKyAqIEZUREkgcHJvdG9jb2w6IHJhdyBNSURJIGJ5dGVzLCBidXQgaW5wdXQgcGFja2V0cyBoYXZlIHR3byBtb2RlbSBzdGF0dXMgYnl0ZXMuCisgKi8KKworc3RhdGljIHZvaWQgc25kX3VzYm1pZGlfZnRkaV9pbnB1dChzdHJ1Y3Qgc25kX3VzYl9taWRpX2luX2VuZHBvaW50KiBlcCwKKwkJCQkgICB1aW50OF90KiBidWZmZXIsIGludCBidWZmZXJfbGVuZ3RoKQoreworCWlmIChidWZmZXJfbGVuZ3RoID4gMikKKwkJc25kX3VzYm1pZGlfaW5wdXRfZGF0YShlcCwgMCwgYnVmZmVyICsgMiwgYnVmZmVyX2xlbmd0aCAtIDIpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9wcm90b2NvbF9vcHMgc25kX3VzYm1pZGlfZnRkaV9vcHMgPSB7CisJLmlucHV0ID0gc25kX3VzYm1pZGlfZnRkaV9pbnB1dCwKKwkub3V0cHV0ID0gc25kX3VzYm1pZGlfcmF3X291dHB1dCwKK307CisKIHN0YXRpYyB2b2lkIHNuZF91c2JtaWRpX3VzMTIybF9pbnB1dChzdHJ1Y3Qgc25kX3VzYl9taWRpX2luX2VuZHBvaW50ICplcCwKIAkJCQkgICAgIHVpbnQ4X3QgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgpCiB7CkBAIC0yMTYzLDYgKzIxODAsMTcgQEAKIAkJLyogZW5kcG9pbnQgMSBpcyBpbnB1dC1vbmx5ICovCiAJCWVuZHBvaW50c1sxXS5vdXRfY2FibGVzID0gMDsKIAkJYnJlYWs7CisJY2FzZSBRVUlSS19NSURJX0ZUREk6CisJCXVtaWRpLT51c2JfcHJvdG9jb2xfb3BzID0gJnNuZF91c2JtaWRpX2Z0ZGlfb3BzOworCisJCS8qIHNldCBiYXVkIHJhdGUgdG8gMzEyNTAgKDQ4IE1IeiAvIDE2IC8gOTYpICovCisJCWVyciA9IHVzYl9jb250cm9sX21zZyh1bWlkaS0+ZGV2LCB1c2Jfc25kY3RybHBpcGUodW1pZGktPmRldiwgMCksCisJCQkJICAgICAgMywgMHg0MCwgMHg2MCwgMCwgTlVMTCwgMCwgMTAwMCk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJZXJyID0gc25kX3VzYm1pZGlfZGV0ZWN0X3Blcl9wb3J0X2VuZHBvaW50cyh1bWlkaSwgZW5kcG9pbnRzKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCBxdWlyayB0eXBlICVkXG4iLCBxdWlyay0+dHlwZSk7CiAJCWVyciA9IC1FTlhJTzsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMgYi9zb3VuZC91c2IvbWlzYy91YTEwMS5jCmluZGV4IDY3YmVjNzYuLmMwNjA5YzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMKKysrIGIvc291bmQvdXNiL21pc2MvdWExMDEuYwpAQCAtNDU5LDcgKzQ1OSw4IEBACiAJdW5zaWduZWQgaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc3RyZWFtLT5xdWV1ZV9sZW5ndGg7ICsraSkKLQkJdXNiX2tpbGxfdXJiKCZzdHJlYW0tPnVyYnNbaV0tPnVyYik7CisJCWlmIChzdHJlYW0tPnVyYnNbaV0pCisJCQl1c2Jfa2lsbF91cmIoJnN0cmVhbS0+dXJic1tpXS0+dXJiKTsKIH0KIAogc3RhdGljIGludCBlbmFibGVfaXNvX2ludGVyZmFjZShzdHJ1Y3QgdWExMDEgKnVhLCB1bnNpZ25lZCBpbnQgaW50Zl9pbmRleCkKQEAgLTQ4NCw2ICs0ODUsOSBAQAogewogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdHM7CiAKKwlpZiAoIXVhLT5pbnRmW2ludGZfaW5kZXhdKQorCQlyZXR1cm47CisKIAlhbHRzID0gdWEtPmludGZbaW50Zl9pbmRleF0tPmN1cl9hbHRzZXR0aW5nOwogCWlmIChhbHRzLT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nICE9IDApIHsKIAkJaW50IGVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKHVhLT5kZXYsCkBAIC0xMTQ0LDI3ICsxMTQ4LDM3IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc3RyZWFtLT5xdWV1ZV9sZW5ndGg7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgc3RyZWFtLT5xdWV1ZV9sZW5ndGg7ICsraSkgewogCQlrZnJlZShzdHJlYW0tPnVyYnNbaV0pOworCQlzdHJlYW0tPnVyYnNbaV0gPSBOVUxMOworCX0KIH0KIAogc3RhdGljIHZvaWQgZnJlZV91c2JfcmVsYXRlZF9yZXNvdXJjZXMoc3RydWN0IHVhMTAxICp1YSwKIAkJCQkgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKIAorCW11dGV4X2xvY2soJnVhLT5tdXRleCk7CiAJZnJlZV9zdHJlYW1fdXJicygmdWEtPmNhcHR1cmUpOwogCWZyZWVfc3RyZWFtX3VyYnMoJnVhLT5wbGF5YmFjayk7CisJbXV0ZXhfdW5sb2NrKCZ1YS0+bXV0ZXgpOwogCWZyZWVfc3RyZWFtX2J1ZmZlcnModWEsICZ1YS0+Y2FwdHVyZSk7CiAJZnJlZV9zdHJlYW1fYnVmZmVycyh1YSwgJnVhLT5wbGF5YmFjayk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1YS0+aW50Zik7ICsraSkKLQkJaWYgKHVhLT5pbnRmW2ldKSB7Ci0JCQl1c2Jfc2V0X2ludGZkYXRhKHVhLT5pbnRmW2ldLCBOVUxMKTsKLQkJCWlmICh1YS0+aW50ZltpXSAhPSBpbnRlcmZhY2UpCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodWEtPmludGYpOyArK2kpIHsKKwkJbXV0ZXhfbG9jaygmdWEtPm11dGV4KTsKKwkJaW50ZiA9IHVhLT5pbnRmW2ldOworCQl1YS0+aW50ZltpXSA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmdWEtPm11dGV4KTsKKwkJaWYgKGludGYpIHsKKwkJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCQlpZiAoaW50ZiAhPSBpbnRlcmZhY2UpCiAJCQkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmdWExMDFfZHJpdmVyLAotCQkJCQkJCSAgICAgdWEtPmludGZbaV0pOworCQkJCQkJCSAgICAgaW50Zik7CiAJCX0KKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHVhMTAxX2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuYyBiL3NvdW5kL3VzYi9taXhlci5jCmluZGV4IGNkZDE5ZDcuLmFiMjM4NjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlci5jCisrKyBiL3NvdW5kL3VzYi9taXhlci5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIAkJaWYgKHNuZF91c2JfY3RsX21zZyhjaGlwLT5kZXYsIHVzYl9yY3ZjdHJscGlwZShjaGlwLT5kZXYsIDApLCByZXF1ZXN0LAogCQkJCSAgICBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX0lOLAogCQkJCSAgICB2YWxpZHgsIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKGN2YWwtPmlkIDw8IDgpLAotCQkJCSAgICBidWYsIHZhbF9sZW4sIDEwMCkgPj0gdmFsX2xlbikgeworCQkJCSAgICBidWYsIHZhbF9sZW4pID49IHZhbF9sZW4pIHsKIAkJCSp2YWx1ZV9yZXQgPSBjb252ZXJ0X3NpZ25lZF92YWx1ZShjdmFsLCBzbmRfdXNiX2NvbWJpbmVfYnl0ZXMoYnVmLCB2YWxfbGVuKSk7CiAJCQlzbmRfdXNiX2F1dG9zdXNwZW5kKGN2YWwtPm1peGVyLT5jaGlwKTsKIAkJCXJldHVybiAwOwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJcmV0ID0gc25kX3VzYl9jdGxfbXNnKGNoaXAtPmRldiwgdXNiX3JjdmN0cmxwaXBlKGNoaXAtPmRldiwgMCksIGJSZXF1ZXN0LAogCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9JTiwKIAkJCSAgICAgIHZhbGlkeCwgc25kX3VzYl9jdHJsX2ludGYoY2hpcCkgfCAoY3ZhbC0+aWQgPDwgOCksCi0JCQkgICAgICBidWYsIHNpemUsIDEwMDApOworCQkJICAgICAgYnVmLCBzaXplKTsKIAlzbmRfdXNiX2F1dG9zdXNwZW5kKGNoaXApOwogCiAJaWYgKHJldCA8IDApIHsKQEAgLTQ0NSw3ICs0NDUsNyBAQAogCQkJCSAgICB1c2Jfc25kY3RybHBpcGUoY2hpcC0+ZGV2LCAwKSwgcmVxdWVzdCwKIAkJCQkgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQsCiAJCQkJICAgIHZhbGlkeCwgc25kX3VzYl9jdHJsX2ludGYoY2hpcCkgfCAoY3ZhbC0+aWQgPDwgOCksCi0JCQkJICAgIGJ1ZiwgdmFsX2xlbiwgMTAwKSA+PSAwKSB7CisJCQkJICAgIGJ1ZiwgdmFsX2xlbikgPj0gMCkgewogCQkJc25kX3VzYl9hdXRvc3VzcGVuZChjaGlwKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC03NjUsMTAgKzc2NSw2MSBAQAogICogaW50ZXJmYWNlIHRvIEFMU0EgY29udHJvbCBmb3IgZmVhdHVyZS9taXhlciB1bml0cwogICovCiAKKy8qIHZvbHVtZSBjb250cm9sIHF1aXJrcyAqLworc3RhdGljIHZvaWQgdm9sdW1lX2NvbnRyb2xfcXVpcmtzKHN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsLAorCQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCkKK3sKKwlzd2l0Y2ggKGN2YWwtPm1peGVyLT5jaGlwLT51c2JfaWQpIHsKKwljYXNlIFVTQl9JRCgweDA0NzEsIDB4MDEwMSk6CisJY2FzZSBVU0JfSUQoMHgwNDcxLCAweDAxMDQpOgorCWNhc2UgVVNCX0lEKDB4MDQ3MSwgMHgwMTA1KToKKwljYXNlIFVTQl9JRCgweDA2NzIsIDB4MTA0MSk6CisJLyogcXVpcmsgZm9yIFVEQTEzMjEvTjEwMS4KKwkgKiBub3RlIHRoYXQgZGV0ZWN0aW9uIGJldHdlZW4gZmlybXdhcmUgMi4xLjEuNyAoTjEwMSkKKwkgKiBhbmQgbGF0ZXIgMi4xLjEuMjEgaXMgbm90IHZlcnkgY2xlYXIgZnJvbSBkYXRhc2hlZXRzLgorCSAqIEkgaG9wZSB0aGF0IHRoZSBtaW4gdmFsdWUgaXMgLTE1MzYwIGZvciBuZXdlciBmaXJtd2FyZSAtLWprCisJICovCisJCWlmICghc3RyY21wKGtjdGwtPmlkLm5hbWUsICJQQ00gUGxheWJhY2sgVm9sdW1lIikgJiYKKwkJICAgIGN2YWwtPm1pbiA9PSAtMTU2MTYpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9JTkZPCisJCQkJICJzZXQgdm9sdW1lIHF1aXJrIGZvciBVREExMzIxL04xMDEgY2hpcFxuIik7CisJCQljdmFsLT5tYXggPSAtMjU2OworCQl9CisJCWJyZWFrOworCisJY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA5YTQpOgorCQlpZiAoIXN0cmNtcChrY3RsLT5pZC5uYW1lLCAiTWljIENhcHR1cmUgVm9sdW1lIikpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9JTkZPCisJCQkJInNldCB2b2x1bWUgcXVpcmsgZm9yIFF1aWNrQ2FtIEUzNTAwXG4iKTsKKwkJCWN2YWwtPm1pbiA9IDYwODA7CisJCQljdmFsLT5tYXggPSA4NzY4OworCQkJY3ZhbC0+cmVzID0gMTkyOworCQl9CisJCWJyZWFrOworCisJY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA4MDgpOgorCWNhc2UgVVNCX0lEKDB4MDQ2ZCwgMHgwODA5KToKKwljYXNlIFVTQl9JRCgweDA0NmQsIDB4MDgxZCk6IC8qIEhEIFdlYmNhbSBjNTEwICovCisJY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA5OTEpOgorCS8qIE1vc3QgYXVkaW8gdXNiIGRldmljZXMgbGllIGFib3V0IHZvbHVtZSByZXNvbHV0aW9uLgorCSAqIE1vc3QgTG9naXRlY2ggd2ViY2FtcyBoYXZlIHJlcyA9IDM4NC4KKwkgKiBQcm9ib2x5IHRoZXJlIGlzIHNvbWUgbG9naXRlY2ggbWFnaWMgYmVoaW5kIHRoaXMgbnVtYmVyIC0tZmlzaG9yCisJICovCisJCWlmICghc3RyY21wKGtjdGwtPmlkLm5hbWUsICJNaWMgQ2FwdHVyZSBWb2x1bWUiKSkgeworCQkJc25kX3ByaW50ayhLRVJOX0lORk8KKwkJCQkic2V0IHJlc29sdXRpb24gcXVpcms6IGN2YWwtPnJlcyA9IDM4NFxuIik7CisJCQljdmFsLT5yZXMgPSAzODQ7CisJCX0KKwkJYnJlYWs7CisKKwl9Cit9CisKIC8qCiAgKiByZXRyaWV2ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29udHJvbAogICovCi1zdGF0aWMgaW50IGdldF9taW5fbWF4KHN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsLCBpbnQgZGVmYXVsdF9taW4pCitzdGF0aWMgaW50IGdldF9taW5fbWF4X3dpdGhfcXVpcmtzKHN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsLAorCQkJCSAgIGludCBkZWZhdWx0X21pbiwgc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCkKIHsKIAkvKiBmb3IgZmFpbHNhZmUgKi8KIAljdmFsLT5taW4gPSBkZWZhdWx0X21pbjsKQEAgLTg0NCw2ICs4OTUsOSBAQAogCQljdmFsLT5pbml0aWFsaXplZCA9IDE7CiAJfQogCisJaWYgKGtjdGwpCisJCXZvbHVtZV9jb250cm9sX3F1aXJrcyhjdmFsLCBrY3RsKTsKKwogCS8qIFVTQiBkZXNjcmlwdGlvbnMgY29udGFpbiB0aGUgZEIgc2NhbGUgaW4gMS8yNTYgZEIgdW5pdAogCSAqIHdoaWxlIEFMU0EgVExWIGNvbnRhaW5zIGluIDEvMTAwIGRCIHVuaXQKIAkgKi8KQEAgLTg2NCw2ICs5MTgsNyBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIGdldF9taW5fbWF4KGN2YWwsIGRlZikJZ2V0X21pbl9tYXhfd2l0aF9xdWlya3MoY3ZhbCwgZGVmLCBOVUxMKQogCiAvKiBnZXQgYSBmZWF0dXJlL21peGVyIHVuaXQgaW5mbyAqLwogc3RhdGljIGludCBtaXhlcl9jdGxfZmVhdHVyZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQpAQCAtODgxLDggKzkzNiwxNyBAQAogCQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwogCQl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOwogCX0gZWxzZSB7Ci0JCWlmICghIGN2YWwtPmluaXRpYWxpemVkKQotCQkJZ2V0X21pbl9tYXgoY3ZhbCwgIDApOworCQlpZiAoIWN2YWwtPmluaXRpYWxpemVkKSB7CisJCQlnZXRfbWluX21heF93aXRoX3F1aXJrcyhjdmFsLCAwLCBrY29udHJvbCk7CisJCQlpZiAoY3ZhbC0+aW5pdGlhbGl6ZWQgJiYgY3ZhbC0+ZEJtaW4gPj0gY3ZhbC0+ZEJtYXgpIHsKKwkJCQlrY29udHJvbC0+dmRbMF0uYWNjZXNzICY9IAorCQkJCQl+KFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8CisJCQkJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DQUxMQkFDSyk7CisJCQkJc25kX2N0bF9ub3RpZnkoY3ZhbC0+bWl4ZXItPmNoaXAtPmNhcmQsCisJCQkJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLAorCQkJCQkgICAgICAgJmtjb250cm9sLT5pZCk7CisJCQl9CisJCX0KIAkJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKIAkJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0KIAkJCShjdmFsLT5tYXggLSBjdmFsLT5taW4gKyBjdmFsLT5yZXMgLSAxKSAvIGN2YWwtPnJlczsKQEAgLTEwMzYsOSArMTEwMCw2IEBACiAJCWN2YWwtPmNoX3JlYWRvbmx5ID0gcmVhZG9ubHlfbWFzazsKIAl9CiAKLQkvKiBnZXQgbWluL21heCB2YWx1ZXMgKi8KLQlnZXRfbWluX21heChjdmFsLCAwKTsKLQogCS8qIGlmIGFsbCBjaGFubmVscyBpbiB0aGUgbWFzayBhcmUgbWFya2VkIHJlYWQtb25seSwgbWFrZSB0aGUgY29udHJvbAogCSAqIHJlYWQtb25seS4gc2V0X2N1cl9taXhfdmFsdWUoKSB3aWxsIGNoZWNrIHRoZSBtYXNrIGFnYWluIGFuZCB3b24ndAogCSAqIGlzc3VlIHdyaXRlIGNvbW1hbmRzIHRvIHJlYWQtb25seSBjaGFubmVscy4gKi8KQEAgLTEwNjAsNiArMTEyMSw5IEBACiAJCWxlbiA9IHNuZF91c2JfY29weV9zdHJpbmdfZGVzYyhzdGF0ZSwgbmFtZWlkLAogCQkJCWtjdGwtPmlkLm5hbWUsIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7CiAKKwkvKiBnZXQgbWluL21heCB2YWx1ZXMgKi8KKwlnZXRfbWluX21heF93aXRoX3F1aXJrcyhjdmFsLCAwLCBrY3RsKTsKKwogCXN3aXRjaCAoY29udHJvbCkgewogCWNhc2UgVUFDX0ZVX01VVEU6CiAJY2FzZSBVQUNfRlVfVk9MVU1FOgpAQCAtMTEwOSw1MSArMTE3Myw2IEBACiAJCWJyZWFrOwogCX0KIAotCS8qIHZvbHVtZSBjb250cm9sIHF1aXJrcyAqLwotCXN3aXRjaCAoc3RhdGUtPmNoaXAtPnVzYl9pZCkgewotCWNhc2UgVVNCX0lEKDB4MDQ3MSwgMHgwMTAxKToKLQljYXNlIFVTQl9JRCgweDA0NzEsIDB4MDEwNCk6Ci0JY2FzZSBVU0JfSUQoMHgwNDcxLCAweDAxMDUpOgotCWNhc2UgVVNCX0lEKDB4MDY3MiwgMHgxMDQxKToKLQkvKiBxdWlyayBmb3IgVURBMTMyMS9OMTAxLgotCSAqIG5vdGUgdGhhdCBkZXRlY3Rpb24gYmV0d2VlbiBmaXJtd2FyZSAyLjEuMS43IChOMTAxKQotCSAqIGFuZCBsYXRlciAyLjEuMS4yMSBpcyBub3QgdmVyeSBjbGVhciBmcm9tIGRhdGFzaGVldHMuCi0JICogSSBob3BlIHRoYXQgdGhlIG1pbiB2YWx1ZSBpcyAtMTUzNjAgZm9yIG5ld2VyIGZpcm13YXJlIC0tamsKLQkgKi8KLQkJaWYgKCFzdHJjbXAoa2N0bC0+aWQubmFtZSwgIlBDTSBQbGF5YmFjayBWb2x1bWUiKSAmJgotCQkgICAgY3ZhbC0+bWluID09IC0xNTYxNikgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkgInNldCB2b2x1bWUgcXVpcmsgZm9yIFVEQTEzMjEvTjEwMSBjaGlwXG4iKTsKLQkJCWN2YWwtPm1heCA9IC0yNTY7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFVTQl9JRCgweDA0NmQsIDB4MDlhNCk6Ci0JCWlmICghc3RyY21wKGtjdGwtPmlkLm5hbWUsICJNaWMgQ2FwdHVyZSBWb2x1bWUiKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkic2V0IHZvbHVtZSBxdWlyayBmb3IgUXVpY2tDYW0gRTM1MDBcbiIpOwotCQkJY3ZhbC0+bWluID0gNjA4MDsKLQkJCWN2YWwtPm1heCA9IDg3Njg7Ci0JCQljdmFsLT5yZXMgPSAxOTI7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFVTQl9JRCgweDA0NmQsIDB4MDgwOCk6Ci0JY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA4MDkpOgotCWNhc2UgVVNCX0lEKDB4MDQ2ZCwgMHgwOTkxKToKLQkvKiBNb3N0IGF1ZGlvIHVzYiBkZXZpY2VzIGxpZSBhYm91dCB2b2x1bWUgcmVzb2x1dGlvbi4KLQkgKiBNb3N0IExvZ2l0ZWNoIHdlYmNhbXMgaGF2ZSByZXMgPSAzODQuCi0JICogUHJvYm9seSB0aGVyZSBpcyBzb21lIGxvZ2l0ZWNoIG1hZ2ljIGJlaGluZCB0aGlzIG51bWJlciAtLWZpc2hvcgotCSAqLwotCQlpZiAoIXN0cmNtcChrY3RsLT5pZC5uYW1lLCAiTWljIENhcHR1cmUgVm9sdW1lIikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPCi0JCQkJInNldCByZXNvbHV0aW9uIHF1aXJrOiBjdmFsLT5yZXMgPSAzODRcbiIpOwotCQkJY3ZhbC0+cmVzID0gMzg0OwotCQl9Ci0JCWJyZWFrOwotCi0JfQotCiAJcmFuZ2UgPSAoY3ZhbC0+bWF4IC0gY3ZhbC0+bWluKSAvIGN2YWwtPnJlczsKIAkvKiBBcmUgdGhlcmUgZGV2aWNlcyB3aXRoIHZvbHVtZSByYW5nZSBtb3JlIHRoYW4gMjU1PyBJIHVzZSBhIGJpdCBtb3JlCiAJICogdG8gYmUgc3VyZS4gMzg0IGlzIGEgcmVzb2x1dGlvbiBtYWdpYyBudW1iZXIgZm91bmQgb24gTG9naXRlY2gKQEAgLTEyNTAsNyArMTI2OSw3IEBACiAJCQkJYnVpbGRfZmVhdHVyZV9jdGwoc3RhdGUsIF9mdHIsIDAsIGksICZpdGVybSwgdW5pdGlkLCAwKTsKIAkJfQogCX0gZWxzZSB7IC8qIFVBQ19WRVJTSU9OXzIgKi8KLQkJZm9yIChpID0gMDsgaSA8IDMwLzI7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdWRpb19mZWF0dXJlX2luZm8pOyBpKyspIHsKIAkJCXVuc2lnbmVkIGludCBjaF9iaXRzID0gMDsKIAkJCXVuc2lnbmVkIGludCBjaF9yZWFkX29ubHkgPSAwOwogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMgYi9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKaW5kZXggM2QwZjQ4Ny4uYWIxMjVlZSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYwpAQCAtMTkwLDE4ICsxOTAsMTggQEAKIAkJZXJyID0gc25kX3VzYl9jdGxfbXNnKG1peGVyLT5jaGlwLT5kZXYsCiAJCQkgICAgICB1c2Jfc25kY3RybHBpcGUobWl4ZXItPmNoaXAtPmRldiwgMCksIDB4MjQsCiAJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9PVEhFUiwKLQkJCSAgICAgICF2YWx1ZSwgMCwgTlVMTCwgMCwgMTAwKTsKKwkJCSAgICAgICF2YWx1ZSwgMCwgTlVMTCwgMCk7CiAJLyogVVNCIFgtRmkgUzUxIFBybyAqLwogCWlmIChtaXhlci0+Y2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA0MWUsIDB4MzBkZikpCiAJCWVyciA9IHNuZF91c2JfY3RsX21zZyhtaXhlci0+Y2hpcC0+ZGV2LAogCQkJICAgICAgdXNiX3NuZGN0cmxwaXBlKG1peGVyLT5jaGlwLT5kZXYsIDApLCAweDI0LAogCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfT1RIRVIsCi0JCQkgICAgICAhdmFsdWUsIDAsIE5VTEwsIDAsIDEwMCk7CisJCQkgICAgICAhdmFsdWUsIDAsIE5VTEwsIDApOwogCWVsc2UKIAkJZXJyID0gc25kX3VzYl9jdGxfbXNnKG1peGVyLT5jaGlwLT5kZXYsCiAJCQkgICAgICB1c2Jfc25kY3RybHBpcGUobWl4ZXItPmNoaXAtPmRldiwgMCksIDB4MjQsCiAJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9PVEhFUiwKLQkJCSAgICAgIHZhbHVlLCBpbmRleCArIDIsIE5VTEwsIDAsIDEwMCk7CisJCQkgICAgICB2YWx1ZSwgaW5kZXggKyAyLCBOVUxMLCAwKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAltaXhlci0+YXVkaWd5Mm54X2xlZHNbaW5kZXhdID0gdmFsdWU7CkBAIC0yOTksNyArMjk5LDcgQEAKIAkJCQkgICAgICB1c2JfcmN2Y3RybHBpcGUobWl4ZXItPmNoaXAtPmRldiwgMCksCiAJCQkJICAgICAgVUFDX0dFVF9NRU0sIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8CiAJCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgMCwKLQkJCQkgICAgICBqYWNrc1tpXS51bml0aWQgPDwgOCwgYnVmLCAzLCAxMDApOworCQkJCSAgICAgIGphY2tzW2ldLnVuaXRpZCA8PCA4LCBidWYsIDMpOwogCQlpZiAoZXJyID09IDMgJiYgKGJ1ZlswXSA9PSAzIHx8IGJ1ZlswXSA9PSA2KSkKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwMnggJTAyeFxuIiwgYnVmWzFdLCBidWZbMl0pOwogCQllbHNlCkBAIC0zMzIsNyArMzMyLDcgQEAKIAllcnIgPSBzbmRfdXNiX2N0bF9tc2cobWl4ZXItPmNoaXAtPmRldiwKIAkJCSAgICAgIHVzYl9zbmRjdHJscGlwZShtaXhlci0+Y2hpcC0+ZGV2LCAwKSwgMHgwOCwKIAkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX09USEVSLAotCQkJICAgICAgNTAsIDAsICZuZXdfc3RhdHVzLCAxLCAxMDApOworCQkJICAgICAgNTAsIDAsICZuZXdfc3RhdHVzLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAltaXhlci0+eG9uYXJfdTFfc3RhdHVzID0gbmV3X3N0YXR1czsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9wY20uYyBiL3NvdW5kL3VzYi9wY20uYwppbmRleCBiOGRjYmY0Li4wMjIwYjBmIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcGNtLmMKKysrIGIvc291bmQvdXNiL3BjbS5jCkBAIC0yOCwxMiArMjgsMzYgQEAKICNpbmNsdWRlICJjYXJkLmgiCiAjaW5jbHVkZSAicXVpcmtzLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ1cmIuaCIKKyNpbmNsdWRlICJlbmRwb2ludC5oIgogI2luY2x1ZGUgImhlbHBlci5oIgogI2luY2x1ZGUgInBjbS5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAicG93ZXIuaCIKIAorLyogcmV0dXJuIHRoZSBlc3RpbWF0ZWQgZGVsYXkgYmFzZWQgb24gVVNCIGZyYW1lIGNvdW50ZXJzICovCitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfdXNiX3BjbV9kZWxheShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgIHVuc2lnbmVkIGludCByYXRlKQoreworCWludCBjdXJyZW50X2ZyYW1lX251bWJlcjsKKwlpbnQgZnJhbWVfZGlmZjsKKwlpbnQgZXN0X2RlbGF5OworCisJY3VycmVudF9mcmFtZV9udW1iZXIgPSB1c2JfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyKHN1YnMtPmRldik7CisJLyoKKwkgKiBIQ0QgaW1wbGVtZW50YXRpb25zIHVzZSBkaWZmZXJlbnQgd2lkdGhzLCB1c2UgbG93ZXIgOCBiaXRzLgorCSAqIFRoZSBkZWxheSB3aWxsIGJlIG1hbmFnZWQgdXAgdG8gMjU2bXMsIHdoaWNoIGlzIG1vcmUgdGhhbgorCSAqIGVub3VnaAorCSAqLworCWZyYW1lX2RpZmYgPSAoY3VycmVudF9mcmFtZV9udW1iZXIgLSBzdWJzLT5sYXN0X2ZyYW1lX251bWJlcikgJiAweGZmOworCisJLyogQXBwcm94aW1hdGlvbiBiYXNlZCBvbiBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgVVNCIGZyYW1lIChtcyksCisJICAgc29tZSB0cnVuY2F0aW9uIGZvciA0NC4xIGJ1dCB0aGUgZXN0aW1hdGUgaXMgZ29vZCBlbm91Z2ggKi8KKwllc3RfZGVsYXkgPSAgc3Vicy0+bGFzdF9kZWxheSAtIChmcmFtZV9kaWZmICogcmF0ZSAvIDEwMDApOworCWlmIChlc3RfZGVsYXkgPCAwKQorCQllc3RfZGVsYXkgPSAwOworCXJldHVybiBlc3RfZGVsYXk7Cit9CisKIC8qCiAgKiByZXR1cm4gdGhlIGN1cnJlbnQgcGNtIHBvaW50ZXIuICBqdXN0IGJhc2VkIG9uIHRoZSBod3B0cl9kb25lIHZhbHVlLgogICovCkBAIC00NSw2ICs2OSw4IEBACiAJc3VicyA9IChzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlzcGluX2xvY2soJnN1YnMtPmxvY2spOwogCWh3cHRyX2RvbmUgPSBzdWJzLT5od3B0cl9kb25lOworCXN1YnN0cmVhbS0+cnVudGltZS0+ZGVsYXkgPSBzbmRfdXNiX3BjbV9kZWxheShzdWJzLAorCQkJCQkJc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKTsKIAlzcGluX3VubG9jaygmc3Vicy0+bG9jayk7CiAJcmV0dXJuIGh3cHRyX2RvbmUgLyAoc3Vic3RyZWFtLT5ydW50aW1lLT5mcmFtZV9iaXRzID4+IDMpOwogfQpAQCAtMTI2LDcgKzE1Miw3IEBACiAJaWYgKChlcnIgPSBzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgVUFDX1NFVF9DVVIsCiAJCQkJICAgVVNCX1RZUEVfQ0xBU1N8VVNCX1JFQ0lQX0VORFBPSU5UfFVTQl9ESVJfT1VULAogCQkJCSAgIFVBQ19FUF9DU19BVFRSX1BJVENIX0NPTlRST0wgPDwgOCwgZXAsCi0JCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpLCAxMDAwKSkgPCAwKSB7CisJCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiBjYW5ub3Qgc2V0IGVuYWJsZSBQSVRDSFxuIiwKIAkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZXApOwogCQlyZXR1cm4gZXJyOwpAQCAtMTUwLDcgKzE3Niw3IEBACiAJaWYgKChlcnIgPSBzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgVUFDMl9DU19DVVIsCiAJCQkJICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfRU5EUE9JTlQgfCBVU0JfRElSX09VVCwKIAkJCQkgICBVQUMyX0VQX0NTX1BJVENIIDw8IDgsIDAsCi0JCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpLCAxMDAwKSkgPCAwKSB7CisJCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiBjYW5ub3Qgc2V0IGVuYWJsZSBQSVRDSCAodjIpXG4iLAogCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBmbXQtPmFsdHNldHRpbmcpOwogCQlyZXR1cm4gZXJyOwpAQCAtNDE3LDYgKzQ0Myw4IEBACiAJc3Vicy0+aHdwdHJfZG9uZSA9IDA7CiAJc3Vicy0+dHJhbnNmZXJfZG9uZSA9IDA7CiAJc3Vicy0+cGhhc2UgPSAwOworCXN1YnMtPmxhc3RfZGVsYXkgPSAwOworCXN1YnMtPmxhc3RfZnJhbWVfbnVtYmVyID0gMDsKIAlydW50aW1lLT5kZWxheSA9IDA7CiAKIAlyZXR1cm4gc25kX3VzYl9zdWJzdHJlYW1fcHJlcGFyZShzdWJzLCBydW50aW1lKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9wY20uaCBiL3NvdW5kL3VzYi9wY20uaAppbmRleCBlZDNlMjgzLi5kZjdhMDAzIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcGNtLmgKKysrIGIvc291bmQvdXNiL3BjbS5oCkBAIC0xLDYgKzEsOSBAQAogI2lmbmRlZiBfX1VTQkFVRElPX1BDTV9ICiAjZGVmaW5lIF9fVVNCQVVESU9fUENNX0gKIAorc25kX3BjbV91ZnJhbWVzX3Qgc25kX3VzYl9wY21fZGVsYXkoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSk7CisKIHZvaWQgc25kX3VzYl9zZXRfcGNtX29wcyhzdHJ1Y3Qgc25kX3BjbSAqcGNtLCBpbnQgc3RyZWFtKTsKIAogaW50IHNuZF91c2JfaW5pdF9waXRjaChzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwgaW50IGlmYWNlLApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3F1aXJrcy10YWJsZS5oIGIvc291bmQvdXNiL3F1aXJrcy10YWJsZS5oCmluZGV4IGE0MmUzZWYuLmI2MTk0NWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9xdWlya3MtdGFibGUuaAorKysgYi9zb3VuZC91c2IvcXVpcmtzLXRhYmxlLmgKQEAgLTM5LDYgKzM5LDE3IEBACiAJLmlkUHJvZHVjdCA9IHByb2QsIFwKIAkuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDCiAKKy8qIEZUREkgZGV2aWNlcyAqLworeworCVVTQl9ERVZJQ0UoMHgwNDAzLCAweGI4ZDgpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmIChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlyaykgeworCQkvKiAudmVuZG9yX25hbWUgPSAiU1RBUlIgTEFCUyIsICovCisJCS8qIC5wcm9kdWN0X25hbWUgPSAiU3RhcnIgTGFicyBNSURJIFVTQiBkZXZpY2UiLCAqLworCQkuaWZudW0gPSAwLAorCQkudHlwZSA9IFFVSVJLX01JRElfRlRESQorCX0KK30sCisKIC8qIENyZWF0aXZlL1Rvc2hpYmEgTXVsdGltZWRpYSBDZW50ZXIgU0ItMDUwMCAqLwogewogCVVTQl9ERVZJQ0UoMHgwNDFlLCAweDMwNDgpLApAQCAtMTY3OCw2ICsxNjg5LDIwIEBACiAJfQogfSwKIHsKKwkvKiBBZGRlZCBzdXBwb3J0IGZvciBSb2xhbmQgVU0tT05FIHdoaWNoIGRpZmZlcnMgZnJvbSBVTS0xICovCisJVVNCX0RFVklDRSgweDA1ODIsIDB4MDEyYSksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICYgKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrKSB7CisJCS8qIC52ZW5kb3JfbmFtZSA9ICJST0xBTkQiLCAqLworCQkvKiAucHJvZHVjdF9uYW1lID0gIlVNLU9ORSIsICovCisJCS5pZm51bSA9IDAsCisJCS50eXBlID0gUVVJUktfTUlESV9GSVhFRF9FTkRQT0lOVCwKKwkJLmRhdGEgPSAmIChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9taWRpX2VuZHBvaW50X2luZm8pIHsKKwkJCS5vdXRfY2FibGVzID0gMHgwMDAxLAorCQkJLmluX2NhYmxlcyAgPSAweDAwMDMKKwkJfQorCX0KK30sCit7CiAJVVNCX0RFVklDRSgweDA1ODIsIDB4MDExZSksCiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICYgKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrKSB7CiAJCS8qIC52ZW5kb3JfbmFtZSA9ICJCT1NTIiwgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9xdWlya3MuYyBiL3NvdW5kL3VzYi9xdWlya3MuYwppbmRleCA4MWUwN2Q4Li5hM2RkYWMwIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcXVpcmtzLmMKKysrIGIvc291bmQvdXNiL3F1aXJrcy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiZW5kcG9pbnQuaCIKICNpbmNsdWRlICJwY20uaCIKICNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgInN0cmVhbS5oIgogCiAvKgogICogaGFuZGxlIHRoZSBxdWlya3MgZm9yIHRoZSBjb250YWluZWQgaW50ZXJmYWNlcwpAQCAtMTA2LDcgKzEwNyw3IEBACiAKIAlhbHRzID0gJmlmYWNlLT5hbHRzZXR0aW5nWzBdOwogCWFsdHNkID0gZ2V0X2lmYWNlX2Rlc2MoYWx0cyk7Ci0JZXJyID0gc25kX3VzYl9wYXJzZV9hdWRpb19lbmRwb2ludHMoY2hpcCwgYWx0c2QtPmJJbnRlcmZhY2VOdW1iZXIpOworCWVyciA9IHNuZF91c2JfcGFyc2VfYXVkaW9faW50ZXJmYWNlKGNoaXAsIGFsdHNkLT5iSW50ZXJmYWNlTnVtYmVyKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc2V0dXAgaWYgJWQ6IGVycm9yICVkXG4iLAogCQkJICAgYWx0c2QtPmJJbnRlcmZhY2VOdW1iZXIsIGVycik7CkBAIC0xMzYsMTggKzEzNywxOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaWYgKGZwLT5ucl9yYXRlcyA+IDApIHsKLQkJcmF0ZV90YWJsZSA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBmcC0+bnJfcmF0ZXMsIEdGUF9LRVJORUwpOworCQlyYXRlX3RhYmxlID0ga21lbWR1cChmcC0+cmF0ZV90YWJsZSwKKwkJCQkgICAgIHNpemVvZihpbnQpICogZnAtPm5yX3JhdGVzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFyYXRlX3RhYmxlKSB7CiAJCQlrZnJlZShmcCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQltZW1jcHkocmF0ZV90YWJsZSwgZnAtPnJhdGVfdGFibGUsIHNpemVvZihpbnQpICogZnAtPm5yX3JhdGVzKTsKIAkJZnAtPnJhdGVfdGFibGUgPSByYXRlX3RhYmxlOwogCX0KIAogCXN0cmVhbSA9IChmcC0+ZW5kcG9pbnQgJiBVU0JfRElSX0lOKQogCQk/IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSA6IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fZW5kcG9pbnQoY2hpcCwgc3RyZWFtLCBmcCk7CisJZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKGNoaXAsIHN0cmVhbSwgZnApOwogCWlmIChlcnIgPCAwKSB7CiAJCWtmcmVlKGZwKTsKIAkJa2ZyZWUocmF0ZV90YWJsZSk7CkBAIC0yMjMsMTAgKzIyNCw5IEBACiAJaWYgKGFsdHNkLT5iTnVtRW5kcG9pbnRzICE9IDEpCiAJCXJldHVybiAtRU5YSU87CiAKLQlmcCA9IGttYWxsb2Moc2l6ZW9mKCpmcCksIEdGUF9LRVJORUwpOworCWZwID0ga21lbWR1cCgmdWFfZm9ybWF0LCBzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmcCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KGZwLCAmdWFfZm9ybWF0LCBzaXplb2YoKmZwKSk7CiAKIAlmcC0+aWZhY2UgPSBhbHRzZC0+YkludGVyZmFjZU51bWJlcjsKIAlmcC0+ZW5kcG9pbnQgPSBnZXRfZW5kcG9pbnQoYWx0cywgMCktPmJFbmRwb2ludEFkZHJlc3M7CkBAIC0yNTQsNyArMjU0LDcgQEAKIAogCXN0cmVhbSA9IChmcC0+ZW5kcG9pbnQgJiBVU0JfRElSX0lOKQogCQk/IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSA6IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fZW5kcG9pbnQoY2hpcCwgc3RyZWFtLCBmcCk7CisJZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKGNoaXAsIHN0cmVhbSwgZnApOwogCWlmIChlcnIgPCAwKSB7CiAJCWtmcmVlKGZwKTsKIAkJcmV0dXJuIGVycjsKQEAgLTMwNiw2ICszMDYsNyBAQAogCQlbUVVJUktfTUlESV9FTUFHSUNdID0gY3JlYXRlX2FueV9taWRpX3F1aXJrLAogCQlbUVVJUktfTUlESV9DTUVdID0gY3JlYXRlX2FueV9taWRpX3F1aXJrLAogCQlbUVVJUktfTUlESV9BS0FJXSA9IGNyZWF0ZV9hbnlfbWlkaV9xdWlyaywKKwkJW1FVSVJLX01JRElfRlRESV0gPSBjcmVhdGVfYW55X21pZGlfcXVpcmssCiAJCVtRVUlSS19BVURJT19TVEFOREFSRF9JTlRFUkZBQ0VdID0gY3JlYXRlX3N0YW5kYXJkX2F1ZGlvX3F1aXJrLAogCQlbUVVJUktfQVVESU9fRklYRURfRU5EUE9JTlRdID0gY3JlYXRlX2ZpeGVkX3N0cmVhbV9xdWlyaywKIAkJW1FVSVJLX0FVRElPX0VESVJPTF9VQVhYXSA9IGNyZWF0ZV91YXh4X3F1aXJrLApAQCAtMzM4LDcgKzMzOSw3IEBACiAJCXNuZF9wcmludGRkKCJzZW5kaW5nIEV4dGlneSBib290IHNlcXVlbmNlLi4uXG4iKTsKIAkJLyogU2VuZCBtZXNzYWdlIHRvIGZvcmNlIGl0IHRvIHJlY29ubmVjdCB3aXRoIGZ1bGwgaW50ZXJmYWNlLiAqLwogCQllcnIgPSBzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LDApLAotCQkJCSAgICAgIDB4MTAsIDB4NDMsIDB4MDAwMSwgMHgwMDBhLCBOVUxMLCAwLCAxMDAwKTsKKwkJCQkgICAgICAweDEwLCAweDQzLCAweDAwMDEsIDB4MDAwYSwgTlVMTCwgMCk7CiAJCWlmIChlcnIgPCAwKSBzbmRfcHJpbnRkZCgiZXJyb3Igc2VuZGluZyBib290IG1lc3NhZ2U6ICVkXG4iLCBlcnIpOwogCQllcnIgPSB1c2JfZ2V0X2Rlc2NyaXB0b3IoZGV2LCBVU0JfRFRfREVWSUNFLCAwLAogCQkJCSZkZXYtPmRlc2NyaXB0b3IsIHNpemVvZihkZXYtPmRlc2NyaXB0b3IpKTsKQEAgLTM1OSwxMSArMzYwLDExIEBACiAKIAlzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwgMHgyYSwKIAkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfT1RIRVIsCi0JCQkwLCAwLCAmYnVmLCAxLCAxMDAwKTsKKwkJCTAsIDAsICZidWYsIDEpOwogCWlmIChidWYgPT0gMCkgewogCQlzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgMHgyOSwKIAkJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9PVEhFUiwKLQkJCQkxLCAyMDAwLCBOVUxMLCAwLCAxMDAwKTsKKwkJCQkxLCAyMDAwLCBOVUxMLCAwKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXJldHVybiAwOwpAQCAtNDA2LDcgKzQwNyw3IEBACiAJYnVmWzNdID0gcmVnOwogCXJldHVybiBzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTiwKIAkJCSAgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5ULAotCQkJICAgICAgIDAsIDAsICZidWYsIDQsIDEwMDApOworCQkJICAgICAgIDAsIDAsICZidWYsIDQpOwogfQogCiBzdGF0aWMgaW50IHNuZF91c2JfY20xMDZfYm9vdF9xdWlyayhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3N0cmVhbS5jIGIvc291bmQvdXNiL3N0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjgwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC91c2Ivc3RyZWFtLmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvYXVkaW8tdjIuaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKworI2luY2x1ZGUgInVzYmF1ZGlvLmgiCisjaW5jbHVkZSAiY2FyZC5oIgorI2luY2x1ZGUgInByb2MuaCIKKyNpbmNsdWRlICJxdWlya3MuaCIKKyNpbmNsdWRlICJlbmRwb2ludC5oIgorI2luY2x1ZGUgInBjbS5oIgorI2luY2x1ZGUgImhlbHBlci5oIgorI2luY2x1ZGUgImZvcm1hdC5oIgorI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAic3RyZWFtLmgiCisKKy8qCisgKiBmcmVlIGEgc3Vic3RyZWFtCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfc3Vic3RyZWFtKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKworCWlmICghc3Vicy0+bnVtX2Zvcm1hdHMpCisJCXJldHVybjsgLyogbm90IGluaXRpYWxpemVkICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzdWJzLT5mbXRfbGlzdCkgeworCQlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYXVkaW9mb3JtYXQsIGxpc3QpOworCQlrZnJlZShmcC0+cmF0ZV90YWJsZSk7CisJCWtmcmVlKGZwKTsKKwl9CisJa2ZyZWUoc3Vicy0+cmF0ZV9saXN0Lmxpc3QpOworfQorCisKKy8qCisgKiBmcmVlIGEgdXNiIHN0cmVhbSBpbnN0YW5jZQorICovCitzdGF0aWMgdm9pZCBzbmRfdXNiX2F1ZGlvX3N0cmVhbV9mcmVlKHN0cnVjdCBzbmRfdXNiX3N0cmVhbSAqc3RyZWFtKQoreworCWZyZWVfc3Vic3RyZWFtKCZzdHJlYW0tPnN1YnN0cmVhbVswXSk7CisJZnJlZV9zdWJzdHJlYW0oJnN0cmVhbS0+c3Vic3RyZWFtWzFdKTsKKwlsaXN0X2RlbCgmc3RyZWFtLT5saXN0KTsKKwlrZnJlZShzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZCBzbmRfdXNiX2F1ZGlvX3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc3RydWN0IHNuZF91c2Jfc3RyZWFtICpzdHJlYW0gPSBwY20tPnByaXZhdGVfZGF0YTsKKwlpZiAoc3RyZWFtKSB7CisJCXN0cmVhbS0+cGNtID0gTlVMTDsKKwkJc25kX3VzYl9hdWRpb19zdHJlYW1fZnJlZShzdHJlYW0pOworCX0KK30KKworCisvKgorICogYWRkIHRoaXMgZW5kcG9pbnQgdG8gdGhlIGNoaXAgaW5zdGFuY2UuCisgKiBpZiBhIHN0cmVhbSB3aXRoIHRoZSBzYW1lIGVuZHBvaW50IGFscmVhZHkgZXhpc3RzLCBhcHBlbmQgdG8gaXQuCisgKiBpZiBub3QsIGNyZWF0ZSBhIG5ldyBwY20gc3RyZWFtLgorICovCitpbnQgc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAorCQkJICAgICBpbnQgc3RyZWFtLAorCQkJICAgICBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IHNuZF91c2Jfc3RyZWFtICphczsKKwlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnM7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlpbnQgZXJyOworCisJbGlzdF9mb3JfZWFjaChwLCAmY2hpcC0+cGNtX2xpc3QpIHsKKwkJYXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdXNiX3N0cmVhbSwgbGlzdCk7CisJCWlmIChhcy0+Zm10X3R5cGUgIT0gZnAtPmZtdF90eXBlKQorCQkJY29udGludWU7CisJCXN1YnMgPSAmYXMtPnN1YnN0cmVhbVtzdHJlYW1dOworCQlpZiAoIXN1YnMtPmVuZHBvaW50KQorCQkJY29udGludWU7CisJCWlmIChzdWJzLT5lbmRwb2ludCA9PSBmcC0+ZW5kcG9pbnQpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmZwLT5saXN0LCAmc3Vicy0+Zm10X2xpc3QpOworCQkJc3Vicy0+bnVtX2Zvcm1hdHMrKzsKKwkJCXN1YnMtPmZvcm1hdHMgfD0gZnAtPmZvcm1hdHM7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKiBsb29rIGZvciBhbiBlbXB0eSBzdHJlYW0gKi8KKwlsaXN0X2Zvcl9lYWNoKHAsICZjaGlwLT5wY21fbGlzdCkgeworCQlhcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF91c2Jfc3RyZWFtLCBsaXN0KTsKKwkJaWYgKGFzLT5mbXRfdHlwZSAhPSBmcC0+Zm10X3R5cGUpCisJCQljb250aW51ZTsKKwkJc3VicyA9ICZhcy0+c3Vic3RyZWFtW3N0cmVhbV07CisJCWlmIChzdWJzLT5lbmRwb2ludCkKKwkJCWNvbnRpbnVlOworCQllcnIgPSBzbmRfcGNtX25ld19zdHJlYW0oYXMtPnBjbSwgc3RyZWFtLCAxKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlzbmRfdXNiX2luaXRfc3Vic3RyZWFtKGFzLCBzdHJlYW0sIGZwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogY3JlYXRlIGEgbmV3IHBjbSAqLworCWFzID0ga3phbGxvYyhzaXplb2YoKmFzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhcykKKwkJcmV0dXJuIC1FTk9NRU07CisJYXMtPnBjbV9pbmRleCA9IGNoaXAtPnBjbV9kZXZzOworCWFzLT5jaGlwID0gY2hpcDsKKwlhcy0+Zm10X3R5cGUgPSBmcC0+Zm10X3R5cGU7CisJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIlVTQiBBdWRpbyIsIGNoaXAtPnBjbV9kZXZzLAorCQkJICBzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IDEgOiAwLAorCQkJICBzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IDAgOiAxLAorCQkJICAmcGNtKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZShhcyk7CisJCXJldHVybiBlcnI7CisJfQorCWFzLT5wY20gPSBwY207CisJcGNtLT5wcml2YXRlX2RhdGEgPSBhczsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF91c2JfYXVkaW9fcGNtX2ZyZWU7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlpZiAoY2hpcC0+cGNtX2RldnMgPiAwKQorCQlzcHJpbnRmKHBjbS0+bmFtZSwgIlVTQiBBdWRpbyAjJWQiLCBjaGlwLT5wY21fZGV2cyk7CisJZWxzZQorCQlzdHJjcHkocGNtLT5uYW1lLCAiVVNCIEF1ZGlvIik7CisKKwlzbmRfdXNiX2luaXRfc3Vic3RyZWFtKGFzLCBzdHJlYW0sIGZwKTsKKworCWxpc3RfYWRkKCZhcy0+bGlzdCwgJmNoaXAtPnBjbV9saXN0KTsKKwljaGlwLT5wY21fZGV2cysrOworCisJc25kX3VzYl9wcm9jX3BjbV9mb3JtYXRfYWRkKGFzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3VhY19lbmRwb2ludF9hdHRyaWJ1dGVzKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAorCQkJCQkgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0cywKKwkJCQkJIGludCBwcm90b2NvbCwgaW50IGlmYWNlX25vKQoreworCS8qIHBhcnNlZCB3aXRoIGEgdjEgaGVhZGVyIGhlcmUuIHRoYXQncyBvayBhcyB3ZSBvbmx5IGxvb2sgYXQgdGhlCisJICogaGVhZGVyIGZpcnN0IHdoaWNoIGlzIHRoZSBzYW1lIGZvciBib3RoIHZlcnNpb25zICovCisJc3RydWN0IHVhY19pc29fZW5kcG9pbnRfZGVzY3JpcHRvciAqY3NlcDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICphbHRzZCA9IGdldF9pZmFjZV9kZXNjKGFsdHMpOworCWludCBhdHRyaWJ1dGVzID0gMDsKKworCWNzZXAgPSBzbmRfdXNiX2ZpbmRfZGVzYyhhbHRzLT5lbmRwb2ludFswXS5leHRyYSwgYWx0cy0+ZW5kcG9pbnRbMF0uZXh0cmFsZW4sIE5VTEwsIFVTQl9EVF9DU19FTkRQT0lOVCk7CisKKwkvKiBDcmVhbXdhcmUgTm9haCBoYXMgdGhpcyBkZXNjcmlwdG9yIGFmdGVyIHRoZSAybmQgZW5kcG9pbnQgKi8KKwlpZiAoIWNzZXAgJiYgYWx0c2QtPmJOdW1FbmRwb2ludHMgPj0gMikKKwkJY3NlcCA9IHNuZF91c2JfZmluZF9kZXNjKGFsdHMtPmVuZHBvaW50WzFdLmV4dHJhLCBhbHRzLT5lbmRwb2ludFsxXS5leHRyYWxlbiwgTlVMTCwgVVNCX0RUX0NTX0VORFBPSU5UKTsKKworCWlmICghY3NlcCB8fCBjc2VwLT5iTGVuZ3RoIDwgNyB8fAorCSAgICBjc2VwLT5iRGVzY3JpcHRvclN1YnR5cGUgIT0gVUFDX0VQX0dFTkVSQUwpIHsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiV1OiVkIDogbm8gb3IgaW52YWxpZCIKKwkJCSAgICIgY2xhc3Mgc3BlY2lmaWMgZW5kcG9pbnQgZGVzY3JpcHRvclxuIiwKKwkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBpZmFjZV9ubywKKwkJCSAgIGFsdHNkLT5iQWx0ZXJuYXRlU2V0dGluZyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8xKSB7CisJCWF0dHJpYnV0ZXMgPSBjc2VwLT5ibUF0dHJpYnV0ZXM7CisJfSBlbHNlIHsKKwkJc3RydWN0IHVhYzJfaXNvX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmNzZXAyID0KKwkJCShzdHJ1Y3QgdWFjMl9pc29fZW5kcG9pbnRfZGVzY3JpcHRvciAqKSBjc2VwOworCisJCWF0dHJpYnV0ZXMgPSBjc2VwLT5ibUF0dHJpYnV0ZXMgJiBVQUNfRVBfQ1NfQVRUUl9GSUxMX01BWDsKKworCQkvKiBlbXVsYXRlIHRoZSBlbmRwb2ludCBhdHRyaWJ1dGVzIG9mIGEgdjEgZGV2aWNlICovCisJCWlmIChjc2VwMi0+Ym1Db250cm9scyAmIFVBQzJfQ09OVFJPTF9QSVRDSCkKKwkJCWF0dHJpYnV0ZXMgfD0gVUFDX0VQX0NTX0FUVFJfUElUQ0hfQ09OVFJPTDsKKwl9CisKKwlyZXR1cm4gYXR0cmlidXRlczsKK30KKworc3RhdGljIHN0cnVjdCB1YWMyX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKgorCXNuZF91c2JfZmluZF9pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmN0cmxfaWZhY2UsCisJCQkJCSAgICAgICBpbnQgdGVybWluYWxfaWQpCit7CisJc3RydWN0IHVhYzJfaW5wdXRfdGVybWluYWxfZGVzY3JpcHRvciAqdGVybSA9IE5VTEw7CisKKwl3aGlsZSAoKHRlcm0gPSBzbmRfdXNiX2ZpbmRfY3NpbnRfZGVzYyhjdHJsX2lmYWNlLT5leHRyYSwKKwkJCQkJICAgICAgIGN0cmxfaWZhY2UtPmV4dHJhbGVuLAorCQkJCQkgICAgICAgdGVybSwgVUFDX0lOUFVUX1RFUk1JTkFMKSkpIHsKKwkJaWYgKHRlcm0tPmJUZXJtaW5hbElEID09IHRlcm1pbmFsX2lkKQorCQkJcmV0dXJuIHRlcm07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWFjMl9vdXRwdXRfdGVybWluYWxfZGVzY3JpcHRvciAqCisJc25kX3VzYl9maW5kX291dHB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmN0cmxfaWZhY2UsCisJCQkJCQlpbnQgdGVybWluYWxfaWQpCit7CisJc3RydWN0IHVhYzJfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKnRlcm0gPSBOVUxMOworCisJd2hpbGUgKCh0ZXJtID0gc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoY3RybF9pZmFjZS0+ZXh0cmEsCisJCQkJCSAgICAgICBjdHJsX2lmYWNlLT5leHRyYWxlbiwKKwkJCQkJICAgICAgIHRlcm0sIFVBQ19PVVRQVVRfVEVSTUlOQUwpKSkgeworCQlpZiAodGVybS0+YlRlcm1pbmFsSUQgPT0gdGVybWluYWxfaWQpCisJCQlyZXR1cm4gdGVybTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IHNuZF91c2JfcGFyc2VfYXVkaW9faW50ZXJmYWNlKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLCBpbnQgaWZhY2Vfbm8pCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2U7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0czsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICphbHRzZDsKKwlpbnQgaSwgYWx0bm8sIGVyciwgc3RyZWFtOworCWludCBmb3JtYXQgPSAwLCBudW1fY2hhbm5lbHMgPSAwOworCXN0cnVjdCBhdWRpb2Zvcm1hdCAqZnAgPSBOVUxMOworCWludCBudW0sIHByb3RvY29sLCBjbG9jayA9IDA7CisJc3RydWN0IHVhY19mb3JtYXRfdHlwZV9pX2NvbnRpbnVvdXNfZGVzY3JpcHRvciAqZm10OworCisJZGV2ID0gY2hpcC0+ZGV2OworCisJLyogcGFyc2UgdGhlIGludGVyZmFjZSdzIGFsdHNldHRpbmdzICovCisJaWZhY2UgPSB1c2JfaWZudW1fdG9faWYoZGV2LCBpZmFjZV9ubyk7CisKKwludW0gPSBpZmFjZS0+bnVtX2FsdHNldHRpbmc7CisKKwkvKgorCSAqIERhbGxhcyBEUzQyMDEgd29ya2Fyb3VuZDogSXQgcHJlc2VudHMgNSBhbHRzZXR0aW5ncywgYnV0IHRoZSBsYXN0CisJICogb25lIG1pc3NlcyBzeW5jcGlwZSwgYW5kIGRvZXMgbm90IHByb2R1Y2UgYW55IHNvdW5kLgorCSAqLworCWlmIChjaGlwLT51c2JfaWQgPT0gVVNCX0lEKDB4MDRmYSwgMHg0MjAxKSkKKwkJbnVtID0gNDsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlhbHRzID0gJmlmYWNlLT5hbHRzZXR0aW5nW2ldOworCQlhbHRzZCA9IGdldF9pZmFjZV9kZXNjKGFsdHMpOworCQlwcm90b2NvbCA9IGFsdHNkLT5iSW50ZXJmYWNlUHJvdG9jb2w7CisJCS8qIHNraXAgaW52YWxpZCBvbmUgKi8KKwkJaWYgKChhbHRzZC0+YkludGVyZmFjZUNsYXNzICE9IFVTQl9DTEFTU19BVURJTyAmJgorCQkgICAgIGFsdHNkLT5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDKSB8fAorCQkgICAgKGFsdHNkLT5iSW50ZXJmYWNlU3ViQ2xhc3MgIT0gVVNCX1NVQkNMQVNTX0FVRElPU1RSRUFNSU5HICYmCisJCSAgICAgYWx0c2QtPmJJbnRlcmZhY2VTdWJDbGFzcyAhPSBVU0JfU1VCQ0xBU1NfVkVORE9SX1NQRUMpIHx8CisJCSAgICBhbHRzZC0+Yk51bUVuZHBvaW50cyA8IDEgfHwKKwkJICAgIGxlMTZfdG9fY3B1KGdldF9lbmRwb2ludChhbHRzLCAwKS0+d01heFBhY2tldFNpemUpID09IDApCisJCQljb250aW51ZTsKKwkJLyogbXVzdCBiZSBpc29jaHJvbm91cyAqLworCQlpZiAoKGdldF9lbmRwb2ludChhbHRzLCAwKS0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9CisJCSAgICBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQorCQkJY29udGludWU7CisJCS8qIGNoZWNrIGRpcmVjdGlvbiAqLworCQlzdHJlYW0gPSAoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgPworCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFIDogU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwkJYWx0bm8gPSBhbHRzZC0+YkFsdGVybmF0ZVNldHRpbmc7CisKKwkJaWYgKHNuZF91c2JfYXBwbHlfaW50ZXJmYWNlX3F1aXJrKGNoaXAsIGlmYWNlX25vLCBhbHRubykpCisJCQljb250aW51ZTsKKworCQkvKiBnZXQgYXVkaW8gZm9ybWF0cyAqLworCQlzd2l0Y2ggKHByb3RvY29sKSB7CisJCWRlZmF1bHQ6CisJCQlzbmRfcHJpbnRkZChLRVJOX1dBUk5JTkcgIiVkOiV1OiVkOiB1bmtub3duIGludGVyZmFjZSBwcm90b2NvbCAlIzAyeCwgYXNzdW1pbmcgdjFcbiIsCisJCQkJICAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIHByb3RvY29sKTsKKwkJCXByb3RvY29sID0gVUFDX1ZFUlNJT05fMTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCWNhc2UgVUFDX1ZFUlNJT05fMTogeworCQkJc3RydWN0IHVhYzFfYXNfaGVhZGVyX2Rlc2NyaXB0b3IgKmFzID0KKwkJCQlzbmRfdXNiX2ZpbmRfY3NpbnRfZGVzYyhhbHRzLT5leHRyYSwgYWx0cy0+ZXh0cmFsZW4sIE5VTEwsIFVBQ19BU19HRU5FUkFMKTsKKworCQkJaWYgKCFhcykgeworCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogVUFDX0FTX0dFTkVSQUwgZGVzY3JpcHRvciBub3QgZm91bmRcbiIsCisJCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoYXMtPmJMZW5ndGggPCBzaXplb2YoKmFzKSkgeworCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogaW52YWxpZCBVQUNfQVNfR0VORVJBTCBkZXNjXG4iLAorCQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZm9ybWF0ID0gbGUxNl90b19jcHUoYXMtPndGb3JtYXRUYWcpOyAvKiByZW1lbWJlciB0aGUgZm9ybWF0IHZhbHVlICovCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVUFDX1ZFUlNJT05fMjogeworCQkJc3RydWN0IHVhYzJfaW5wdXRfdGVybWluYWxfZGVzY3JpcHRvciAqaW5wdXRfdGVybTsKKwkJCXN0cnVjdCB1YWMyX291dHB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yICpvdXRwdXRfdGVybTsKKwkJCXN0cnVjdCB1YWMyX2FzX2hlYWRlcl9kZXNjcmlwdG9yICphcyA9CisJCQkJc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoYWx0cy0+ZXh0cmEsIGFsdHMtPmV4dHJhbGVuLCBOVUxMLCBVQUNfQVNfR0VORVJBTCk7CisKKwkJCWlmICghYXMpIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IFVBQ19BU19HRU5FUkFMIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4iLAorCQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGFzLT5iTGVuZ3RoIDwgc2l6ZW9mKCphcykpIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKKwkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCW51bV9jaGFubmVscyA9IGFzLT5iTnJDaGFubmVsczsKKwkJCWZvcm1hdCA9IGxlMzJfdG9fY3B1KGFzLT5ibUZvcm1hdHMpOworCisJCQkvKiBsb29rdXAgdGhlIHRlcm1pbmFsIGFzc29jaWF0ZWQgdG8gdGhpcyBpbnRlcmZhY2UKKwkJCSAqIHRvIGV4dHJhY3QgdGhlIGNsb2NrICovCisJCQlpbnB1dF90ZXJtID0gc25kX3VzYl9maW5kX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IoY2hpcC0+Y3RybF9pbnRmLAorCQkJCQkJCQkJICAgIGFzLT5iVGVybWluYWxMaW5rKTsKKwkJCWlmIChpbnB1dF90ZXJtKSB7CisJCQkJY2xvY2sgPSBpbnB1dF90ZXJtLT5iQ1NvdXJjZUlEOworCQkJCWJyZWFrOworCQkJfQorCisJCQlvdXRwdXRfdGVybSA9IHNuZF91c2JfZmluZF9vdXRwdXRfdGVybWluYWxfZGVzY3JpcHRvcihjaGlwLT5jdHJsX2ludGYsCisJCQkJCQkJCQkgICAgICBhcy0+YlRlcm1pbmFsTGluayk7CisJCQlpZiAob3V0cHV0X3Rlcm0pIHsKKwkJCQljbG9jayA9IG91dHB1dF90ZXJtLT5iQ1NvdXJjZUlEOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGJvZ3VzIGJUZXJtaW5hbExpbmsgJWRcbiIsCisJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubywgYXMtPmJUZXJtaW5hbExpbmspOworCQkJY29udGludWU7CisJCX0KKwkJfQorCisJCS8qIGdldCBmb3JtYXQgdHlwZSAqLworCQlmbXQgPSBzbmRfdXNiX2ZpbmRfY3NpbnRfZGVzYyhhbHRzLT5leHRyYSwgYWx0cy0+ZXh0cmFsZW4sIE5VTEwsIFVBQ19GT1JNQVRfVFlQRSk7CisJCWlmICghZm10KSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IG5vIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAorCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCgocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMSkgJiYgKGZtdC0+Ykxlbmd0aCA8IDgpKSB8fAorCQkgICAgKChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8yKSAmJiAoZm10LT5iTGVuZ3RoIDwgNikpKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0ZPUk1BVF9UWVBFIGRlc2NcbiIsCisJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEJsdWUgTWljcm9waG9uZXMgd29ya2Fyb3VuZDogVGhlIGxhc3QgYWx0c2V0dGluZyBpcyBpZGVudGljYWwKKwkJICogd2l0aCB0aGUgcHJldmlvdXMgb25lLCBleGNlcHQgZm9yIGEgbGFyZ2VyIHBhY2tldCBzaXplLCBidXQKKwkJICogaXMgYWN0dWFsbHkgYSBtaXNsYWJlbGVkIHR3by1jaGFubmVsIHNldHRpbmc7IGlnbm9yZSBpdC4KKwkJICovCisJCWlmIChmbXQtPmJOckNoYW5uZWxzID09IDEgJiYKKwkJICAgIGZtdC0+YlN1YmZyYW1lU2l6ZSA9PSAyICYmCisJCSAgICBhbHRubyA9PSAyICYmIG51bSA9PSAzICYmCisJCSAgICBmcCAmJiBmcC0+YWx0c2V0dGluZyA9PSAxICYmIGZwLT5jaGFubmVscyA9PSAxICYmCisJCSAgICBmcC0+Zm9ybWF0cyA9PSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSAmJgorCQkgICAgcHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMSAmJgorCQkgICAgbGUxNl90b19jcHUoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT53TWF4UGFja2V0U2l6ZSkgPT0KKwkJCQkJCQlmcC0+bWF4cGFja3NpemUgKiAyKQorCQkJY29udGludWU7CisKKwkJZnAgPSBremFsbG9jKHNpemVvZigqZnApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEgZnApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2NcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlmcC0+aWZhY2UgPSBpZmFjZV9ubzsKKwkJZnAtPmFsdHNldHRpbmcgPSBhbHRubzsKKwkJZnAtPmFsdHNldF9pZHggPSBpOworCQlmcC0+ZW5kcG9pbnQgPSBnZXRfZW5kcG9pbnQoYWx0cywgMCktPmJFbmRwb2ludEFkZHJlc3M7CisJCWZwLT5lcF9hdHRyID0gZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5ibUF0dHJpYnV0ZXM7CisJCWZwLT5kYXRhaW50ZXJ2YWwgPSBzbmRfdXNiX3BhcnNlX2RhdGFpbnRlcnZhbChjaGlwLCBhbHRzKTsKKwkJZnAtPm1heHBhY2tzaXplID0gbGUxNl90b19jcHUoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT53TWF4UGFja2V0U2l6ZSk7CisJCS8qIG51bV9jaGFubmVscyBpcyBvbmx5IHNldCBmb3IgdjIgaW50ZXJmYWNlcyAqLworCQlmcC0+Y2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7CisJCWlmIChzbmRfdXNiX2dldF9zcGVlZChkZXYpID09IFVTQl9TUEVFRF9ISUdIKQorCQkJZnAtPm1heHBhY2tzaXplID0gKCgoZnAtPm1heHBhY2tzaXplID4+IDExKSAmIDMpICsgMSkKKwkJCQkJKiAoZnAtPm1heHBhY2tzaXplICYgMHg3ZmYpOworCQlmcC0+YXR0cmlidXRlcyA9IHBhcnNlX3VhY19lbmRwb2ludF9hdHRyaWJ1dGVzKGNoaXAsIGFsdHMsIHByb3RvY29sLCBpZmFjZV9ubyk7CisJCWZwLT5jbG9jayA9IGNsb2NrOworCisJCS8qIHNvbWUgcXVpcmtzIGZvciBhdHRyaWJ1dGVzIGhlcmUgKi8KKworCQlzd2l0Y2ggKGNoaXAtPnVzYl9pZCkgeworCQljYXNlIFVTQl9JRCgweDBhOTIsIDB4MDA1Myk6IC8qIEF1ZGlvVHJhayBPcHRvcGxheSAqLworCQkJLyogT3B0b3BsYXkgc2V0cyB0aGUgc2FtcGxlIHJhdGUgYXR0cmlidXRlIGFsdGhvdWdoCisJCQkgKiBpdCBzZWVtcyBub3Qgc3VwcG9ydGluZyBpdCBpbiBmYWN0LgorCQkJICovCisJCQlmcC0+YXR0cmlidXRlcyAmPSB+VUFDX0VQX0NTX0FUVFJfU0FNUExFX1JBVEU7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfSUQoMHgwNDFlLCAweDMwMjApOiAvKiBDcmVhdGl2ZSBTQiBBdWRpZ3kgMiBOWCAqLworCQljYXNlIFVTQl9JRCgweDA3NjMsIDB4MjAwMyk6IC8qIE0tQXVkaW8gQXVkaW9waGlsZSBVU0IgKi8KKwkJCS8qIGRvZXNuJ3Qgc2V0IHRoZSBzYW1wbGUgcmF0ZSBhdHRyaWJ1dGUsIGJ1dCBzdXBwb3J0cyBpdCAqLworCQkJZnAtPmF0dHJpYnV0ZXMgfD0gVUFDX0VQX0NTX0FUVFJfU0FNUExFX1JBVEU7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMDEpOiAgLyogTS1BdWRpbyBRdWF0dHJvIFVTQiAqLworCQljYXNlIFVTQl9JRCgweDA3NjMsIDB4MjAxMik6ICAvKiBNLUF1ZGlvIEZhc3QgVHJhY2sgUHJvIFVTQiAqLworCQljYXNlIFVTQl9JRCgweDA0N2YsIDB4MGNhMSk6IC8qIHBsYW50cm9uaWNzIGhlYWRzZXQgKi8KKwkJY2FzZSBVU0JfSUQoMHgwNzdkLCAweDA3YWYpOiAvKiBHcmlmZmluIGlNaWMgKG5vdGUgdGhhdCB0aGVyZSBpcworCQkJCQkJYW4gb2xkZXIgbW9kZWwgNzdkOjIyMykgKi8KKwkJLyoKKwkJICogcGxhbnRyb25pY3MgaGVhZHNldCBhbmQgR3JpZmZpbiBpTWljIGhhdmUgc2V0IGFkYXB0aXZlLWluCisJCSAqIGFsdGhvdWdoIGl0J3MgcmVhbGx5IG5vdC4uLgorCQkgKi8KKwkJCWZwLT5lcF9hdHRyICY9IH5VU0JfRU5EUE9JTlRfU1lOQ1RZUEU7CisJCQlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQkJZnAtPmVwX2F0dHIgfD0gVVNCX0VORFBPSU5UX1NZTkNfQURBUFRJVkU7CisJCQllbHNlCisJCQkJZnAtPmVwX2F0dHIgfD0gVVNCX0VORFBPSU5UX1NZTkNfU1lOQzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogb2ssIGxldCdzIHBhcnNlIGZ1cnRoZXIuLi4gKi8KKwkJaWYgKHNuZF91c2JfcGFyc2VfYXVkaW9fZm9ybWF0KGNoaXAsIGZwLCBmb3JtYXQsIGZtdCwgc3RyZWFtLCBhbHRzKSA8IDApIHsKKwkJCWtmcmVlKGZwLT5yYXRlX3RhYmxlKTsKKwkJCWtmcmVlKGZwKTsKKwkJCWZwID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICIlZDoldTolZDogYWRkIGF1ZGlvIGVuZHBvaW50ICUjeFxuIiwgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubywgZnAtPmVuZHBvaW50KTsKKwkJZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKGNoaXAsIHN0cmVhbSwgZnApOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWUoZnAtPnJhdGVfdGFibGUpOworCQkJa2ZyZWUoZnApOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQkvKiB0cnkgdG8gc2V0IHRoZSBpbnRlcmZhY2UuLi4gKi8KKwkJdXNiX3NldF9pbnRlcmZhY2UoY2hpcC0+ZGV2LCBpZmFjZV9ubywgYWx0bm8pOworCQlzbmRfdXNiX2luaXRfcGl0Y2goY2hpcCwgaWZhY2Vfbm8sIGFsdHMsIGZwKTsKKwkJc25kX3VzYl9pbml0X3NhbXBsZV9yYXRlKGNoaXAsIGlmYWNlX25vLCBhbHRzLCBmcCwgZnAtPnJhdGVfbWF4KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9zdHJlYW0uaCBiL3NvdW5kL3VzYi9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdmNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL3N0cmVhbS5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX19VU0JBVURJT19TVFJFQU1fSAorI2RlZmluZSBfX1VTQkFVRElPX1NUUkVBTV9ICisKK2ludCBzbmRfdXNiX3BhcnNlX2F1ZGlvX2ludGVyZmFjZShzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwKKwkJCQkgIGludCBpZmFjZV9ubyk7CisKK2ludCBzbmRfdXNiX2FkZF9hdWRpb19zdHJlYW0oc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsCisJCQkgICAgIGludCBzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBhdWRpb2Zvcm1hdCAqZnApOworCisjZW5kaWYgLyogX19VU0JBVURJT19TVFJFQU1fSCAqLworCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXJiLmMgYi9zb3VuZC91c2IvdXJiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODQzNDkuLjAwMDAwMDAKLS0tIGEvc291bmQvdXNiL3VyYi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQxICswLDAgQEAKLS8qCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0KLSNpbmNsdWRlICJ1c2JhdWRpby5oIgotI2luY2x1ZGUgImhlbHBlci5oIgotI2luY2x1ZGUgImNhcmQuaCIKLSNpbmNsdWRlICJ1cmIuaCIKLSNpbmNsdWRlICJwY20uaCIKLQotLyoKLSAqIGNvbnZlcnQgYSBzYW1wbGluZyByYXRlIGludG8gb3VyIGZ1bGwgc3BlZWQgZm9ybWF0IChmcy8xMDAwIGluIFExNi4xNikKLSAqIHRoaXMgd2lsbCBvdmVyZmxvdyBhdCBhcHByb3ggNTI0IGtIegotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF91c2JfZnVsbF9zcGVlZF9yYXRlKHVuc2lnbmVkIGludCByYXRlKQotewotCXJldHVybiAoKHJhdGUgPDwgMTMpICsgNjIpIC8gMTI1OwotfQotCi0vKgotICogY29udmVydCBhIHNhbXBsaW5nIHJhdGUgaW50byBVU0IgaGlnaCBzcGVlZCBmb3JtYXQgKGZzLzgwMDAgaW4gUTE2LjE2KQotICogdGhpcyB3aWxsIG92ZXJmbG93IGF0IGFwcHJveCA0IE1IegotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF91c2JfaGlnaF9zcGVlZF9yYXRlKHVuc2lnbmVkIGludCByYXRlKQotewotCXJldHVybiAoKHJhdGUgPDwgMTApICsgNjIpIC8gMTI1OwotfQotCi0vKgotICogdW5saW5rIGFjdGl2ZSB1cmJzLgotICovCi1zdGF0aWMgaW50IGRlYWN0aXZhdGVfdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsIGludCBmb3JjZSwgaW50IGNhbl9zbGVlcCkKLXsKLQlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IHN1YnMtPnN0cmVhbS0+Y2hpcDsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgYXN5bmM7Ci0KLQlzdWJzLT5ydW5uaW5nID0gMDsKLQotCWlmICghZm9yY2UgJiYgc3Vicy0+c3RyZWFtLT5jaGlwLT5zaHV0ZG93bikgLyogdG8gYmUgc3VyZS4uLiAqLwotCQlyZXR1cm4gLUVCQURGRDsKLQotCWFzeW5jID0gIWNhbl9zbGVlcCAmJiBjaGlwLT5hc3luY191bmxpbms7Ci0KLQlpZiAoIWFzeW5jICYmIGluX2ludGVycnVwdCgpKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBzdWJzLT5udXJiczsgaSsrKSB7Ci0JCWlmICh0ZXN0X2JpdChpLCAmc3Vicy0+YWN0aXZlX21hc2spKSB7Ci0JCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJnN1YnMtPnVubGlua19tYXNrKSkgewotCQkJCXN0cnVjdCB1cmIgKnUgPSBzdWJzLT5kYXRhdXJiW2ldLnVyYjsKLQkJCQlpZiAoYXN5bmMpCi0JCQkJCXVzYl91bmxpbmtfdXJiKHUpOwotCQkJCWVsc2UKLQkJCQkJdXNiX2tpbGxfdXJiKHUpOwotCQkJfQotCQl9Ci0JfQotCWlmIChzdWJzLT5zeW5jcGlwZSkgewotCQlmb3IgKGkgPSAwOyBpIDwgU1lOQ19VUkJTOyBpKyspIHsKLQkJCWlmICh0ZXN0X2JpdChpKzE2LCAmc3Vicy0+YWN0aXZlX21hc2spKSB7Ci0JCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGkrMTYsICZzdWJzLT51bmxpbmtfbWFzaykpIHsKLQkJCQkJc3RydWN0IHVyYiAqdSA9IHN1YnMtPnN5bmN1cmJbaV0udXJiOwotCQkJCQlpZiAoYXN5bmMpCi0JCQkJCQl1c2JfdW5saW5rX3VyYih1KTsKLQkJCQkJZWxzZQotCQkJCQkJdXNiX2tpbGxfdXJiKHUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogcmVsZWFzZSBhIHVyYiBkYXRhCi0gKi8KLXN0YXRpYyB2b2lkIHJlbGVhc2VfdXJiX2N0eChzdHJ1Y3Qgc25kX3VyYl9jdHggKnUpCi17Ci0JaWYgKHUtPnVyYikgewotCQlpZiAodS0+YnVmZmVyX3NpemUpCi0JCQl1c2JfZnJlZV9jb2hlcmVudCh1LT5zdWJzLT5kZXYsIHUtPmJ1ZmZlcl9zaXplLAotCQkJCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJCQkJdS0+dXJiLT50cmFuc2Zlcl9kbWEpOwotCQl1c2JfZnJlZV91cmIodS0+dXJiKTsKLQkJdS0+dXJiID0gTlVMTDsKLQl9Ci19Ci0KLS8qCi0gKiAgd2FpdCB1bnRpbCBhbGwgdXJicyBhcmUgcHJvY2Vzc2VkLgotICovCi1zdGF0aWMgaW50IHdhaXRfY2xlYXJfdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMpCi17Ci0JdW5zaWduZWQgbG9uZyBlbmRfdGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOwotCXVuc2lnbmVkIGludCBpOwotCWludCBhbGl2ZTsKLQotCWRvIHsKLQkJYWxpdmUgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgc3Vicy0+bnVyYnM7IGkrKykgewotCQkJaWYgKHRlc3RfYml0KGksICZzdWJzLT5hY3RpdmVfbWFzaykpCi0JCQkJYWxpdmUrKzsKLQkJfQotCQlpZiAoc3Vicy0+c3luY3BpcGUpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgewotCQkJCWlmICh0ZXN0X2JpdChpICsgMTYsICZzdWJzLT5hY3RpdmVfbWFzaykpCi0JCQkJCWFsaXZlKys7Ci0JCQl9Ci0JCX0KLQkJaWYgKCEgYWxpdmUpCi0JCQlicmVhazsKLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZW5kX3RpbWUpKTsKLQlpZiAoYWxpdmUpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInRpbWVvdXQ6IHN0aWxsICVkIGFjdGl2ZSB1cmJzLi5cbiIsIGFsaXZlKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHJlbGVhc2UgYSBzdWJzdHJlYW0KLSAqLwotdm9pZCBzbmRfdXNiX3JlbGVhc2Vfc3Vic3RyZWFtX3VyYnMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLCBpbnQgZm9yY2UpCi17Ci0JaW50IGk7Ci0KLQkvKiBzdG9wIHVyYnMgKHRvIGJlIHN1cmUpICovCi0JZGVhY3RpdmF0ZV91cmJzKHN1YnMsIGZvcmNlLCAxKTsKLQl3YWl0X2NsZWFyX3VyYnMoc3Vicyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1VSQlM7IGkrKykKLQkJcmVsZWFzZV91cmJfY3R4KCZzdWJzLT5kYXRhdXJiW2ldKTsKLQlmb3IgKGkgPSAwOyBpIDwgU1lOQ19VUkJTOyBpKyspCi0JCXJlbGVhc2VfdXJiX2N0eCgmc3Vicy0+c3luY3VyYltpXSk7Ci0JdXNiX2ZyZWVfY29oZXJlbnQoc3Vicy0+ZGV2LCBTWU5DX1VSQlMgKiA0LAotCQkJc3Vicy0+c3luY2J1Ziwgc3Vicy0+c3luY19kbWEpOwotCXN1YnMtPnN5bmNidWYgPSBOVUxMOwotCXN1YnMtPm51cmJzID0gMDsKLX0KLQotLyoKLSAqIGNvbXBsZXRlIGNhbGxiYWNrIGZyb20gZGF0YSB1cmIKLSAqLwotc3RhdGljIHZvaWQgc25kX2NvbXBsZXRlX3VyYihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzID0gY3R4LT5zdWJzOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gY3R4LT5zdWJzLT5wY21fc3Vic3RyZWFtOwotCWludCBlcnIgPSAwOwotCi0JaWYgKChzdWJzLT5ydW5uaW5nICYmIHN1YnMtPm9wcy5yZXRpcmUoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lLCB1cmIpKSB8fAotCSAgICAhc3Vicy0+cnVubmluZyB8fCAvKiBjYW4gYmUgc3RvcHBlZCBkdXJpbmcgcmV0aXJlIGNhbGxiYWNrICovCi0JICAgIChlcnIgPSBzdWJzLT5vcHMucHJlcGFyZShzdWJzLCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHVyYikpIDwgMCB8fAotCSAgICAoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgPCAwKSB7Ci0JCWNsZWFyX2JpdChjdHgtPmluZGV4LCAmc3Vicy0+YWN0aXZlX21hc2spOwotCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ZChLRVJOX0VSUiAiY2Fubm90IHN1Ym1pdCB1cmIgKGVyciA9ICVkKVxuIiwgZXJyKTsKLQkJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKLQkJfQotCX0KLX0KLQotCi0vKgotICogY29tcGxldGUgY2FsbGJhY2sgZnJvbSBzeW5jIHVyYgotICovCi1zdGF0aWMgdm9pZCBzbmRfY29tcGxldGVfc3luY191cmIoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IGN0eC0+c3ViczsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGN0eC0+c3Vicy0+cGNtX3N1YnN0cmVhbTsKLQlpbnQgZXJyID0gMDsKLQotCWlmICgoc3Vicy0+cnVubmluZyAmJiBzdWJzLT5vcHMucmV0aXJlX3N5bmMoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lLCB1cmIpKSB8fAotCSAgICAhc3Vicy0+cnVubmluZyB8fCAvKiBjYW4gYmUgc3RvcHBlZCBkdXJpbmcgcmV0aXJlIGNhbGxiYWNrICovCi0JICAgIChlcnIgPSBzdWJzLT5vcHMucHJlcGFyZV9zeW5jKHN1YnMsIHN1YnN0cmVhbS0+cnVudGltZSwgdXJiKSkgPCAwIHx8Ci0JICAgIChlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKLQkJY2xlYXJfYml0KGN0eC0+aW5kZXggKyAxNiwgJnN1YnMtPmFjdGl2ZV9tYXNrKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGQoS0VSTl9FUlIgImNhbm5vdCBzdWJtaXQgc3luYyB1cmIgKGVyciA9ICVkKVxuIiwgZXJyKTsKLQkJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKLQkJfQotCX0KLX0KLQotCi0vKgotICogaW5pdGlhbGl6ZSBhIHN1YnN0cmVhbSBmb3IgcGxhYmFjay9jYXB0dXJlCi0gKi8KLWludCBzbmRfdXNiX2luaXRfc3Vic3RyZWFtX3VyYnMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMsCi0JCQkJdW5zaWduZWQgaW50IHJhdGUsCi0JCQkJdW5zaWduZWQgaW50IGZyYW1lX2JpdHMpCi17Ci0JdW5zaWduZWQgaW50IG1heHNpemUsIGk7Ci0JaW50IGlzX3BsYXliYWNrID0gc3Vicy0+ZGlyZWN0aW9uID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JdW5zaWduZWQgaW50IHVyYl9wYWNrcywgdG90YWxfcGFja3MsIHBhY2tzX3Blcl9tczsKLQlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IHN1YnMtPnN0cmVhbS0+Y2hpcDsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IGluIDE2LjE2IGZvcm1hdCAqLwotCWlmIChzbmRfdXNiX2dldF9zcGVlZChzdWJzLT5kZXYpID09IFVTQl9TUEVFRF9GVUxMKQotCQlzdWJzLT5mcmVxbiA9IGdldF91c2JfZnVsbF9zcGVlZF9yYXRlKHJhdGUpOwotCWVsc2UKLQkJc3Vicy0+ZnJlcW4gPSBnZXRfdXNiX2hpZ2hfc3BlZWRfcmF0ZShyYXRlKTsKLQlzdWJzLT5mcmVxbSA9IHN1YnMtPmZyZXFuOwotCXN1YnMtPmZyZXFzaGlmdCA9IElOVF9NSU47Ci0JLyogY2FsY3VsYXRlIG1heC4gZnJlcXVlbmN5ICovCi0JaWYgKHN1YnMtPm1heHBhY2tzaXplKSB7Ci0JCS8qIHdoYXRldmVyIGZpdHMgaW50byBhIG1heC4gc2l6ZSBwYWNrZXQgKi8KLQkJbWF4c2l6ZSA9IHN1YnMtPm1heHBhY2tzaXplOwotCQlzdWJzLT5mcmVxbWF4ID0gKG1heHNpemUgLyAoZnJhbWVfYml0cyA+PiAzKSkKLQkJCQk8PCAoMTYgLSBzdWJzLT5kYXRhaW50ZXJ2YWwpOwotCX0gZWxzZSB7Ci0JCS8qIG5vIG1heC4gcGFja2V0IHNpemU6IGp1c3QgdGFrZSAyNSUgaGlnaGVyIHRoYW4gbm9taW5hbCAqLwotCQlzdWJzLT5mcmVxbWF4ID0gc3Vicy0+ZnJlcW4gKyAoc3Vicy0+ZnJlcW4gPj4gMik7Ci0JCW1heHNpemUgPSAoKHN1YnMtPmZyZXFtYXggKyAweGZmZmYpICogKGZyYW1lX2JpdHMgPj4gMykpCi0JCQkJPj4gKDE2IC0gc3Vicy0+ZGF0YWludGVydmFsKTsKLQl9Ci0Jc3Vicy0+cGhhc2UgPSAwOwotCi0JaWYgKHN1YnMtPmZpbGxfbWF4KQotCQlzdWJzLT5jdXJwYWNrc2l6ZSA9IHN1YnMtPm1heHBhY2tzaXplOwotCWVsc2UKLQkJc3Vicy0+Y3VycGFja3NpemUgPSBtYXhzaXplOwotCi0JaWYgKHNuZF91c2JfZ2V0X3NwZWVkKHN1YnMtPmRldikgIT0gVVNCX1NQRUVEX0ZVTEwpCi0JCXBhY2tzX3Blcl9tcyA9IDggPj4gc3Vicy0+ZGF0YWludGVydmFsOwotCWVsc2UKLQkJcGFja3NfcGVyX21zID0gMTsKLQotCWlmIChpc19wbGF5YmFjaykgewotCQl1cmJfcGFja3MgPSBtYXgoY2hpcC0+bnJwYWNrcywgMSk7Ci0JCXVyYl9wYWNrcyA9IG1pbih1cmJfcGFja3MsICh1bnNpZ25lZCBpbnQpTUFYX1BBQ0tTKTsKLQl9IGVsc2UKLQkJdXJiX3BhY2tzID0gMTsKLQl1cmJfcGFja3MgKj0gcGFja3NfcGVyX21zOwotCWlmIChzdWJzLT5zeW5jcGlwZSkKLQkJdXJiX3BhY2tzID0gbWluKHVyYl9wYWNrcywgMVUgPDwgc3Vicy0+c3luY2ludGVydmFsKTsKLQotCS8qIGRlY2lkZSBob3cgbWFueSBwYWNrZXRzIHRvIGJlIHVzZWQgKi8KLQlpZiAoaXNfcGxheWJhY2spIHsKLQkJdW5zaWduZWQgaW50IG1pbnNpemUsIG1heHBhY2tzOwotCQkvKiBkZXRlcm1pbmUgaG93IHNtYWxsIGEgcGFja2V0IGNhbiBiZSAqLwotCQltaW5zaXplID0gKHN1YnMtPmZyZXFuID4+ICgxNiAtIHN1YnMtPmRhdGFpbnRlcnZhbCkpCi0JCQkgICogKGZyYW1lX2JpdHMgPj4gMyk7Ci0JCS8qIHdpdGggc3luYyBmcm9tIGRldmljZSwgYXNzdW1lIGl0IGNhbiBiZSAxMiUgbG93ZXIgKi8KLQkJaWYgKHN1YnMtPnN5bmNwaXBlKQotCQkJbWluc2l6ZSAtPSBtaW5zaXplID4+IDM7Ci0JCW1pbnNpemUgPSBtYXgobWluc2l6ZSwgMXUpOwotCQl0b3RhbF9wYWNrcyA9IChwZXJpb2RfYnl0ZXMgKyBtaW5zaXplIC0gMSkgLyBtaW5zaXplOwotCQkvKiB3ZSBuZWVkIGF0IGxlYXN0IHR3byBVUkJzIGZvciBxdWV1ZWluZyAqLwotCQlpZiAodG90YWxfcGFja3MgPCAyKSB7Ci0JCQl0b3RhbF9wYWNrcyA9IDI7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBhbmQgd2UgZG9uJ3Qgd2FudCB0b28gbG9uZyBhIHF1ZXVlIGVpdGhlciAqLwotCQkJbWF4cGFja3MgPSBtYXgoTUFYX1FVRVVFICogcGFja3NfcGVyX21zLCB1cmJfcGFja3MgKiAyKTsKLQkJCXRvdGFsX3BhY2tzID0gbWluKHRvdGFsX3BhY2tzLCBtYXhwYWNrcyk7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAodXJiX3BhY2tzID4gMSAmJiB1cmJfcGFja3MgKiBtYXhzaXplID49IHBlcmlvZF9ieXRlcykKLQkJCXVyYl9wYWNrcyA+Pj0gMTsKLQkJdG90YWxfcGFja3MgPSBNQVhfVVJCUyAqIHVyYl9wYWNrczsKLQl9Ci0Jc3Vicy0+bnVyYnMgPSAodG90YWxfcGFja3MgKyB1cmJfcGFja3MgLSAxKSAvIHVyYl9wYWNrczsKLQlpZiAoc3Vicy0+bnVyYnMgPiBNQVhfVVJCUykgewotCQkvKiB0b28gbXVjaC4uLiAqLwotCQlzdWJzLT5udXJicyA9IE1BWF9VUkJTOwotCQl0b3RhbF9wYWNrcyA9IE1BWF9VUkJTICogdXJiX3BhY2tzOwotCX0gZWxzZSBpZiAoc3Vicy0+bnVyYnMgPCAyKSB7Ci0JCS8qIHRvbyBsaXR0bGUgLSB3ZSBuZWVkIGF0IGxlYXN0IHR3byBwYWNrZXRzCi0JCSAqIHRvIGVuc3VyZSBjb250aWd1b3VzIHBsYXliYWNrL2NhcHR1cmUKLQkJICovCi0JCXN1YnMtPm51cmJzID0gMjsKLQl9Ci0KLQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhIHVyYnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc3Vicy0+bnVyYnM7IGkrKykgewotCQlzdHJ1Y3Qgc25kX3VyYl9jdHggKnUgPSAmc3Vicy0+ZGF0YXVyYltpXTsKLQkJdS0+aW5kZXggPSBpOwotCQl1LT5zdWJzID0gc3ViczsKLQkJdS0+cGFja2V0cyA9IChpICsgMSkgKiB0b3RhbF9wYWNrcyAvIHN1YnMtPm51cmJzCi0JCQktIGkgKiB0b3RhbF9wYWNrcyAvIHN1YnMtPm51cmJzOwotCQl1LT5idWZmZXJfc2l6ZSA9IG1heHNpemUgKiB1LT5wYWNrZXRzOwotCQlpZiAoc3Vicy0+Zm10X3R5cGUgPT0gVUFDX0ZPUk1BVF9UWVBFX0lJKQotCQkJdS0+cGFja2V0cysrOyAvKiBmb3IgdHJhbnNmZXIgZGVsaW1pdGVyICovCi0JCXUtPnVyYiA9IHVzYl9hbGxvY191cmIodS0+cGFja2V0cywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdS0+dXJiKQotCQkJZ290byBvdXRfb2ZfbWVtb3J5OwotCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlciA9Ci0JCQl1c2JfYWxsb2NfY29oZXJlbnQoc3Vicy0+ZGV2LCB1LT5idWZmZXJfc2l6ZSwKLQkJCQkJICAgR0ZQX0tFUk5FTCwgJnUtPnVyYi0+dHJhbnNmZXJfZG1hKTsKLQkJaWYgKCF1LT51cmItPnRyYW5zZmVyX2J1ZmZlcikKLQkJCWdvdG8gb3V0X29mX21lbW9yeTsKLQkJdS0+dXJiLT5waXBlID0gc3Vicy0+ZGF0YXBpcGU7Ci0JCXUtPnVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQkJdS0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgc3Vicy0+ZGF0YWludGVydmFsOwotCQl1LT51cmItPmNvbnRleHQgPSB1OwotCQl1LT51cmItPmNvbXBsZXRlID0gc25kX2NvbXBsZXRlX3VyYjsKLQl9Ci0KLQlpZiAoc3Vicy0+c3luY3BpcGUpIHsKLQkJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3luYyB1cmJzICovCi0JCXN1YnMtPnN5bmNidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoc3Vicy0+ZGV2LCBTWU5DX1VSQlMgKiA0LAotCQkJCQkJIEdGUF9LRVJORUwsICZzdWJzLT5zeW5jX2RtYSk7Ci0JCWlmICghc3Vicy0+c3luY2J1ZikKLQkJCWdvdG8gb3V0X29mX21lbW9yeTsKLQkJZm9yIChpID0gMDsgaSA8IFNZTkNfVVJCUzsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc25kX3VyYl9jdHggKnUgPSAmc3Vicy0+c3luY3VyYltpXTsKLQkJCXUtPmluZGV4ID0gaTsKLQkJCXUtPnN1YnMgPSBzdWJzOwotCQkJdS0+cGFja2V0cyA9IDE7Ci0JCQl1LT51cmIgPSB1c2JfYWxsb2NfdXJiKDEsIEdGUF9LRVJORUwpOwotCQkJaWYgKCF1LT51cmIpCi0JCQkJZ290byBvdXRfb2ZfbWVtb3J5OwotCQkJdS0+dXJiLT50cmFuc2Zlcl9idWZmZXIgPSBzdWJzLT5zeW5jYnVmICsgaSAqIDQ7Ci0JCQl1LT51cmItPnRyYW5zZmVyX2RtYSA9IHN1YnMtPnN5bmNfZG1hICsgaSAqIDQ7Ci0JCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSA0OwotCQkJdS0+dXJiLT5waXBlID0gc3Vicy0+c3luY3BpcGU7Ci0JCQl1LT51cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQIHwKLQkJCQkJCSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQkJCXUtPnVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAxOwotCQkJdS0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgc3Vicy0+c3luY2ludGVydmFsOwotCQkJdS0+dXJiLT5jb250ZXh0ID0gdTsKLQkJCXUtPnVyYi0+Y29tcGxldGUgPSBzbmRfY29tcGxldGVfc3luY191cmI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci0KLW91dF9vZl9tZW1vcnk6Ci0Jc25kX3VzYl9yZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN1YnMsIDApOwotCXJldHVybiAtRU5PTUVNOwotfQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIGZ1bGwgc3BlZWQgY2FwdHVyZSBzeW5jIHBpcGUKLSAqCi0gKiBmaWxsIHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiBlYWNoIHVyYiBkZXNjcmlwdG9yLgotICogdGhlIGZpeGVkIDEwLjE0IGZyZXF1ZW5jeSBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgcGlwZS4KLSAqLwotc3RhdGljIGludCBwcmVwYXJlX2NhcHR1cmVfc3luY191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJCSAgICBzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JdW5zaWduZWQgY2hhciAqY3AgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKLQotCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7IC8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXQgZWFjaCB0aW1lICovCi0JdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSAzOwotCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKLQljcFswXSA9IHN1YnMtPmZyZXFuID4+IDI7Ci0JY3BbMV0gPSBzdWJzLT5mcmVxbiA+PiAxMDsKLQljcFsyXSA9IHN1YnMtPmZyZXFuID4+IDE4OwotCXJldHVybiAwOwotfQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIGhpZ2ggc3BlZWQgY2FwdHVyZSBzeW5jIHBpcGUKLSAqCi0gKiBmaWxsIHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiBlYWNoIHVyYiBkZXNjcmlwdG9yLgotICogdGhlIGZpeGVkIDEyLjEzIGZyZXF1ZW5jeSBpcyBwYXNzZWQgYXMgMTYuMTYgdGhyb3VnaCB0aGUgcGlwZS4KLSAqLwotc3RhdGljIGludCBwcmVwYXJlX2NhcHR1cmVfc3luY191cmJfaHMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJCSAgICAgICBzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JdW5zaWduZWQgY2hhciAqY3AgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKLQotCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7IC8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXQgZWFjaCB0aW1lICovCi0JdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSA0OwotCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKLQljcFswXSA9IHN1YnMtPmZyZXFuOwotCWNwWzFdID0gc3Vicy0+ZnJlcW4gPj4gODsKLQljcFsyXSA9IHN1YnMtPmZyZXFuID4+IDE2OwotCWNwWzNdID0gc3Vicy0+ZnJlcW4gPj4gMjQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBwcm9jZXNzIGFmdGVyIGNhcHR1cmUgc3luYyBjb21wbGV0ZQotICogLSBub3RoaW5nIHRvIGRvCi0gKi8KLXN0YXRpYyBpbnQgcmV0aXJlX2NhcHR1cmVfc3luY191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCi0JCQkJICAgc3RydWN0IHVyYiAqdXJiKQotewotCXJldHVybiAwOwotfQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIGNhcHR1cmUgZGF0YSBwaXBlCi0gKgotICogZmlsbCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggb2YgZWFjaCBkZXNjcmlwdG9yLgotICoKLSAqIHdlIHVzZSBhIHRlbXBvcmFyeSBidWZmZXIgdG8gd3JpdGUgdGhlIGNhcHR1cmVkIGRhdGEuCi0gKiBzaW5jZSB0aGUgbGVuZ3RoIG9mIHdyaXR0ZW4gZGF0YSBpcyBkZXRlcm1pbmVkIGJ5IGhvc3QsIHdlIGNhbm5vdAotICogd3JpdGUgb250byB0aGUgcGNtIGJ1ZmZlciBkaXJlY3RseS4uLiAgdGhlIGRhdGEgaXMgdGh1cyBjb3BpZWQKLSAqIGxhdGVyIGF0IGNvbXBsZXRlIGNhbGxiYWNrIHRvIHRoZSBnbG9iYWwgYnVmZmVyLgotICovCi1zdGF0aWMgaW50IHByZXBhcmVfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCi0JCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQotewotCWludCBpLCBvZmZzOwotCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwotCi0Jb2ZmcyA9IDA7Ci0JdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY3R4LT5wYWNrZXRzOyBpKyspIHsKLQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBvZmZzOwotCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IHN1YnMtPmN1cnBhY2tzaXplOwotCQlvZmZzICs9IHN1YnMtPmN1cnBhY2tzaXplOwotCX0KLQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBvZmZzOwotCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBjdHgtPnBhY2tldHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBwcm9jZXNzIGFmdGVyIGNhcHR1cmUgY29tcGxldGUKLSAqCi0gKiBjb3B5IHRoZSBkYXRhIGZyb20gZWFjaCBkZXNjdGlwdG9yIHRvIHRoZSBwY20gYnVmZmVyLCBhbmQKLSAqIHVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAqLwotc3RhdGljIGludCByZXRpcmVfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKLQkJCSAgICAgIHN0cnVjdCB1cmIgKnVyYikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgKmNwOwotCWludCBpOwotCXVuc2lnbmVkIGludCBzdHJpZGUsIGZyYW1lcywgYnl0ZXMsIG9sZHB0cjsKLQlpbnQgcGVyaW9kX2VsYXBzZWQgPSAwOwotCi0Jc3RyaWRlID0gcnVudGltZS0+ZnJhbWVfYml0cyA+PiAzOwotCi0JZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgewotCQljcCA9ICh1bnNpZ25lZCBjaGFyICopdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKLQkJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKSB7Ci0JCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJmcmFtZSAlZCBhY3RpdmU6ICVkXG4iLCBpLCB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7Ci0JCQkvLyBjb250aW51ZTsKLQkJfQotCQlieXRlcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKLQkJZnJhbWVzID0gYnl0ZXMgLyBzdHJpZGU7Ci0JCWlmICghc3Vicy0+dHhmcl9xdWlyaykKLQkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOwotCQlpZiAoYnl0ZXMgJSAocnVudGltZS0+c2FtcGxlX2JpdHMgPj4gMykgIT0gMCkgewotI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQotCQkJaW50IG9sZGJ5dGVzID0gYnl0ZXM7Ci0jZW5kaWYKLQkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOwotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIkNvcnJlY3RlZCB1cmIgZGF0YSBsZW4uICVkLT4lZFxuIiwKLQkJCQkJCQlvbGRieXRlcywgYnl0ZXMpOwotCQl9Ci0JCS8qIHVwZGF0ZSB0aGUgY3VycmVudCBwb2ludGVyICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJzLT5sb2NrLCBmbGFncyk7Ci0JCW9sZHB0ciA9IHN1YnMtPmh3cHRyX2RvbmU7Ci0JCXN1YnMtPmh3cHRyX2RvbmUgKz0gYnl0ZXM7Ci0JCWlmIChzdWJzLT5od3B0cl9kb25lID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlKQotCQkJc3Vicy0+aHdwdHJfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZTsKLQkJZnJhbWVzID0gKGJ5dGVzICsgKG9sZHB0ciAlIHN0cmlkZSkpIC8gc3RyaWRlOwotCQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGZyYW1lczsKLQkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKLQkJCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7Ci0JCQlwZXJpb2RfZWxhcHNlZCA9IDE7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwotCQkvKiBjb3B5IGEgZGF0YSBjaHVuayAqLwotCQlpZiAob2xkcHRyICsgYnl0ZXMgPiBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkgewotCQkJdW5zaWduZWQgaW50IGJ5dGVzMSA9Ci0JCQkJCXJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlIC0gb2xkcHRyOwotCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgb2xkcHRyLCBjcCwgYnl0ZXMxKTsKLQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgY3AgKyBieXRlczEsIGJ5dGVzIC0gYnl0ZXMxKTsKLQkJfSBlbHNlIHsKLQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArIG9sZHB0ciwgY3AsIGJ5dGVzKTsKLQkJfQotCX0KLQlpZiAocGVyaW9kX2VsYXBzZWQpCi0JCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vicy0+cGNtX3N1YnN0cmVhbSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcm9jZXNzIGFmdGVyIGNhcHR1cmUgY29tcGxldGUgd2hlbiBwYXVzZWQuICBOb3RoaW5nIHRvIGRvLgotICovCi1zdGF0aWMgaW50IHJldGlyZV9wYXVzZWRfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCSAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKLQkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYikKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIHBsYXliYWNrIHN5bmMgcGlwZQotICoKLSAqIHNldCB1cCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggdG8gcmVjZWl2ZSB0aGUgY3VycmVudCBmcmVxdWVuY3kuCi0gKi8KLXN0YXRpYyBpbnQgcHJlcGFyZV9wbGF5YmFja19zeW5jX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJCSAgICAgc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwotCi0JdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KLQl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IG1pbig0dSwgY3R4LT5zdWJzLT5zeW5jbWF4c2l6ZSk7Ci0JdXJiLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOwotCXJldHVybiAwOwotfQotCi0vKgotICogcHJvY2VzcyBhZnRlciBwbGF5YmFjayBzeW5jIGNvbXBsZXRlCi0gKgotICogRnVsbCBzcGVlZCBkZXZpY2VzIHJlcG9ydCBmZWVkYmFjayB2YWx1ZXMgaW4gMTAuMTQgZm9ybWF0IGFzIHNhbXBsZXMgcGVyCi0gKiBmcmFtZSwgaGlnaCBzcGVlZCBkZXZpY2VzIGluIDE2LjE2IGZvcm1hdCBhcyBzYW1wbGVzIHBlciBtaWNyb2ZyYW1lLgotICogQmVjYXVzZSB0aGUgQXVkaW8gQ2xhc3MgMSBzcGVjIHdhcyB3cml0dGVuIGJlZm9yZSBVU0IgMi4wLCBtYW55IGhpZ2ggc3BlZWQKLSAqIGRldmljZXMgdXNlIGEgd3JvbmcgaW50ZXJwcmV0YXRpb24sIHNvbWUgb3RoZXJzIHVzZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQKLSAqIGZvcm1hdC4gIFRoZXJlZm9yZSwgd2UgY2Fubm90IHByZWRpY3Qgd2hhdCBmb3JtYXQgYW55IHBhcnRpY3VsYXIgZGV2aWNlIHVzZXMKLSAqIGFuZCBtdXN0IGRldGVjdCBpdCBhdXRvbWF0aWNhbGx5LgotICovCi1zdGF0aWMgaW50IHJldGlyZV9wbGF5YmFja19zeW5jX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCi0JCQkJICAgIHN0cnVjdCB1cmIgKnVyYikKLXsKLQl1bnNpZ25lZCBpbnQgZjsKLQlpbnQgc2hpZnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICh1cmItPmlzb19mcmFtZV9kZXNjWzBdLnN0YXR1cyAhPSAwIHx8Ci0JICAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uYWN0dWFsX2xlbmd0aCA8IDMpCi0JCXJldHVybiAwOwotCi0JZiA9IGxlMzJfdG9fY3B1cCh1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uYWN0dWFsX2xlbmd0aCA9PSAzKQotCQlmICY9IDB4MDBmZmZmZmY7Ci0JZWxzZQotCQlmICY9IDB4MGZmZmZmZmY7Ci0JaWYgKGYgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodW5saWtlbHkoc3Vicy0+ZnJlcXNoaWZ0ID09IElOVF9NSU4pKSB7Ci0JCS8qCi0JCSAqIFRoZSBmaXJzdCB0aW1lIHdlIHNlZSBhIGZlZWRiYWNrIHZhbHVlLCBkZXRlcm1pbmUgaXRzIGZvcm1hdAotCQkgKiBieSBzaGlmdGluZyBpdCBsZWZ0IG9yIHJpZ2h0IHVudGlsIGl0IG1hdGNoZXMgdGhlIG5vbWluYWwKLQkJICogZnJlcXVlbmN5IHZhbHVlLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGZlZWRiYWNrIGRvZXMgbm90Ci0JCSAqIGRpZmZlciBmcm9tIHRoZSBub21pbmFsIHZhbHVlIG1vcmUgdGhhbiArNTAlIG9yIC0yNSUuCi0JCSAqLwotCQlzaGlmdCA9IDA7Ci0JCXdoaWxlIChmIDwgc3Vicy0+ZnJlcW4gLSBzdWJzLT5mcmVxbiAvIDQpIHsKLQkJCWYgPDw9IDE7Ci0JCQlzaGlmdCsrOwotCQl9Ci0JCXdoaWxlIChmID4gc3Vicy0+ZnJlcW4gKyBzdWJzLT5mcmVxbiAvIDIpIHsKLQkJCWYgPj49IDE7Ci0JCQlzaGlmdC0tOwotCQl9Ci0JCXN1YnMtPmZyZXFzaGlmdCA9IHNoaWZ0OwotCX0KLQllbHNlIGlmIChzdWJzLT5mcmVxc2hpZnQgPj0gMCkKLQkJZiA8PD0gc3Vicy0+ZnJlcXNoaWZ0OwotCWVsc2UKLQkJZiA+Pj0gLXN1YnMtPmZyZXFzaGlmdDsKLQotCWlmIChsaWtlbHkoZiA+PSBzdWJzLT5mcmVxbiAtIHN1YnMtPmZyZXFuIC8gOCAmJiBmIDw9IHN1YnMtPmZyZXFtYXgpKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBmcmVxdWVuY3kgbG9va3MgdmFsaWQsIHNldCBpdC4KLQkJICogVGhpcyB2YWx1ZSBpcyByZWZlcnJlZCB0byBpbiBwcmVwYXJlX3BsYXliYWNrX3VyYigpLgotCQkgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN1YnMtPmxvY2ssIGZsYWdzKTsKLQkJc3Vicy0+ZnJlcW0gPSBmOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJzLT5sb2NrLCBmbGFncyk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogT3V0IG9mIHJhbmdlOyBtYXliZSB0aGUgc2hpZnQgdmFsdWUgaXMgd3JvbmcuCi0JCSAqIFJlc2V0IGl0IHNvIHRoYXQgd2UgYXV0b2RldGVjdCBhZ2FpbiB0aGUgbmV4dCB0aW1lLgotCQkgKi8KLQkJc3Vicy0+ZnJlcXNoaWZ0ID0gSU5UX01JTjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBuZXh0IHBhY2tldCAqLwotc3RhdGljIGludCBzbmRfdXNiX2F1ZGlvX25leHRfcGFja2V0X3NpemUoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzKQotewotCWlmIChzdWJzLT5maWxsX21heCkKLQkJcmV0dXJuIHN1YnMtPm1heGZyYW1lc2l6ZTsKLQllbHNlIHsKLQkJc3Vicy0+cGhhc2UgPSAoc3Vicy0+cGhhc2UgJiAweGZmZmYpCi0JCQkrIChzdWJzLT5mcmVxbSA8PCBzdWJzLT5kYXRhaW50ZXJ2YWwpOwotCQlyZXR1cm4gbWluKHN1YnMtPnBoYXNlID4+IDE2LCBzdWJzLT5tYXhmcmFtZXNpemUpOwotCX0KLX0KLQotLyoKLSAqIFByZXBhcmUgdXJiIGZvciBzdHJlYW1pbmcgYmVmb3JlIHBsYXliYWNrIHN0YXJ0cyBvciB3aGVuIHBhdXNlZC4KLSAqCi0gKiBXZSBkb24ndCBoYXZlIGFueSBkYXRhLCBzbyB3ZSBzZW5kIHNpbGVuY2UuCi0gKi8KLXN0YXRpYyBpbnQgcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKLQkJCQkgICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKLQkJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQotewotCXVuc2lnbmVkIGludCBpLCBvZmZzLCBjb3VudHM7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7Ci0JaW50IHN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsKLQotCW9mZnMgPSAwOwotCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7Ci0JZm9yIChpID0gMDsgaSA8IGN0eC0+cGFja2V0czsgKytpKSB7Ci0JCWNvdW50cyA9IHNuZF91c2JfYXVkaW9fbmV4dF9wYWNrZXRfc2l6ZShzdWJzKTsKLQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBvZmZzICogc3RyaWRlOwotCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IGNvdW50cyAqIHN0cmlkZTsKLQkJb2ZmcyArPSBjb3VudHM7Ci0JfQotCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBjdHgtPnBhY2tldHM7Ci0JdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gb2ZmcyAqIHN0cmlkZTsKLQltZW1zZXQodXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JICAgICAgIHJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1U4ID8gMHg4MCA6IDAsCi0JICAgICAgIG9mZnMgKiBzdHJpZGUpOwotCXJldHVybiAwOwotfQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIHBsYXliYWNrIGRhdGEgcGlwZQotICoKLSAqIFNpbmNlIGEgVVJCIGNhbiBoYW5kbGUgb25seSBhIHNpbmdsZSBsaW5lYXIgYnVmZmVyLCB3ZSBtdXN0IHVzZSBkb3VibGUKLSAqIGJ1ZmZlcmluZyB3aGVuIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIG92ZXJmbG93cyB0aGUgYnVmZmVyIGJvdW5kYXJ5LgotICogVG8gYXZvaWQgaW5jb25zaXN0ZW5jaWVzIHdoZW4gdXBkYXRpbmcgaHdwdHJfZG9uZSwgd2UgdXNlIGRvdWJsZSBidWZmZXJpbmcKLSAqIGZvciBhbGwgVVJCcy4KLSAqLwotc3RhdGljIGludCBwcmVwYXJlX3BsYXliYWNrX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKLQkJCQlzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JaW50IGksIHN0cmlkZTsKLQl1bnNpZ25lZCBpbnQgY291bnRzLCBmcmFtZXMsIGJ5dGVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHBlcmlvZF9lbGFwc2VkID0gMDsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKLQotCXN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsKLQotCWZyYW1lcyA9IDA7Ci0JdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KLQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBjdHgtPnBhY2tldHM7IGkrKykgewotCQljb3VudHMgPSBzbmRfdXNiX2F1ZGlvX25leHRfcGFja2V0X3NpemUoc3Vicyk7Ci0JCS8qIHNldCB1cCBkZXNjcmlwdG9yICovCi0JCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ID0gZnJhbWVzICogc3RyaWRlOwotCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IGNvdW50cyAqIHN0cmlkZTsKLQkJZnJhbWVzICs9IGNvdW50czsKLQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cysrOwotCQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGNvdW50czsKLQkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKLQkJCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7Ci0JCQlwZXJpb2RfZWxhcHNlZCA9IDE7Ci0JCQlpZiAoc3Vicy0+Zm10X3R5cGUgPT0gVUFDX0ZPUk1BVF9UWVBFX0lJKSB7Ci0JCQkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPiAwKSB7Ci0JCQkJCS8qIEZJWE1FOiBmaWxsLW1heCBtb2RlIGlzIG5vdAotCQkJCQkgKiBzdXBwb3J0ZWQgeWV0ICovCi0JCQkJCWZyYW1lcyAtPSBzdWJzLT50cmFuc2Zlcl9kb25lOwotCQkJCQljb3VudHMgLT0gc3Vicy0+dHJhbnNmZXJfZG9uZTsKLQkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGggPQotCQkJCQkJY291bnRzICogc3RyaWRlOwotCQkJCQlzdWJzLT50cmFuc2Zlcl9kb25lID0gMDsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJCWlmIChpIDwgY3R4LT5wYWNrZXRzKSB7Ci0JCQkJCS8qIGFkZCBhIHRyYW5zZmVyIGRlbGltaXRlciAqLwotCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCA9Ci0JCQkJCQlmcmFtZXMgKiBzdHJpZGU7Ci0JCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoID0gMDsKLQkJCQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cysrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocGVyaW9kX2VsYXBzZWQpIC8qIGZpbmlzaCBhdCB0aGUgcGVyaW9kIGJvdW5kYXJ5ICovCi0JCQlicmVhazsKLQl9Ci0JYnl0ZXMgPSBmcmFtZXMgKiBzdHJpZGU7Ci0JaWYgKHN1YnMtPmh3cHRyX2RvbmUgKyBieXRlcyA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlKSB7Ci0JCS8qIGVyciwgdGhlIHRyYW5zZmVycmVkIGFyZWEgZ29lcyBvdmVyIGJ1ZmZlciBib3VuZGFyeS4gKi8KLQkJdW5zaWduZWQgaW50IGJ5dGVzMSA9Ci0JCQlydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSAtIHN1YnMtPmh3cHRyX2RvbmU7Ci0JCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJICAgICAgIHJ1bnRpbWUtPmRtYV9hcmVhICsgc3Vicy0+aHdwdHJfZG9uZSwgYnl0ZXMxKTsKLQkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgYnl0ZXMxLAotCQkgICAgICAgcnVudGltZS0+ZG1hX2FyZWEsIGJ5dGVzIC0gYnl0ZXMxKTsKLQl9IGVsc2UgewotCQltZW1jcHkodXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCSAgICAgICBydW50aW1lLT5kbWFfYXJlYSArIHN1YnMtPmh3cHRyX2RvbmUsIGJ5dGVzKTsKLQl9Ci0Jc3Vicy0+aHdwdHJfZG9uZSArPSBieXRlczsKLQlpZiAoc3Vicy0+aHdwdHJfZG9uZSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkKLQkJc3Vicy0+aHdwdHJfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZTsKLQlydW50aW1lLT5kZWxheSArPSBmcmFtZXM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwotCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGJ5dGVzOwotCWlmIChwZXJpb2RfZWxhcHNlZCkKLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzLT5wY21fc3Vic3RyZWFtKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHByb2Nlc3MgYWZ0ZXIgcGxheWJhY2sgZGF0YSBjb21wbGV0ZQotICogLSBkZWNyZWFzZSB0aGUgZGVsYXkgY291bnQgYWdhaW4KLSAqLwotc3RhdGljIGludCByZXRpcmVfcGxheWJhY2tfdXJiKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJICAgICAgIHN0cnVjdCB1cmIgKnVyYikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7Ci0JaW50IHByb2Nlc3NlZCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAvIHN0cmlkZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJzLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHByb2Nlc3NlZCA+IHJ1bnRpbWUtPmRlbGF5KQotCQlydW50aW1lLT5kZWxheSA9IDA7Ci0JZWxzZQotCQlydW50aW1lLT5kZWxheSAtPSBwcm9jZXNzZWQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdXNiX2Vycm9yX3N0cmluZyhpbnQgZXJyKQotewotCXN3aXRjaCAoZXJyKSB7Ci0JY2FzZSAtRU5PREVWOgotCQlyZXR1cm4gIm5vIGRldmljZSI7Ci0JY2FzZSAtRU5PRU5UOgotCQlyZXR1cm4gImVuZHBvaW50IG5vdCBlbmFibGVkIjsKLQljYXNlIC1FUElQRToKLQkJcmV0dXJuICJlbmRwb2ludCBzdGFsbGVkIjsKLQljYXNlIC1FTk9TUEM6Ci0JCXJldHVybiAibm90IGVub3VnaCBiYW5kd2lkdGgiOwotCWNhc2UgLUVTSFVURE9XTjoKLQkJcmV0dXJuICJkZXZpY2UgZGlzYWJsZWQiOwotCWNhc2UgLUVIT1NUVU5SRUFDSDoKLQkJcmV0dXJuICJkZXZpY2Ugc3VzcGVuZGVkIjsKLQljYXNlIC1FSU5WQUw6Ci0JY2FzZSAtRUFHQUlOOgotCWNhc2UgLUVGQklHOgotCWNhc2UgLUVNU0dTSVpFOgotCQlyZXR1cm4gImludGVybmFsIGVycm9yIjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gInVua25vd24gZXJyb3IiOwotCX0KLX0KLQotLyoKLSAqIHNldCB1cCBhbmQgc3RhcnQgZGF0YS9zeW5jIHVyYnMKLSAqLwotc3RhdGljIGludCBzdGFydF91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3Vicywgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgZXJyOwotCi0JaWYgKHN1YnMtPnN0cmVhbS0+Y2hpcC0+c2h1dGRvd24pCi0JCXJldHVybiAtRUJBREZEOwotCi0JZm9yIChpID0gMDsgaSA8IHN1YnMtPm51cmJzOyBpKyspIHsKLQkJaWYgKHNuZF9CVUdfT04oIXN1YnMtPmRhdGF1cmJbaV0udXJiKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoc3Vicy0+b3BzLnByZXBhcmUoc3VicywgcnVudGltZSwgc3Vicy0+ZGF0YXVyYltpXS51cmIpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHByZXBhcmUgZGF0YXBpcGUgZm9yIHVyYiAlZFxuIiwgaSk7Ci0JCQlnb3RvIF9fZXJyb3I7Ci0JCX0KLQl9Ci0JaWYgKHN1YnMtPnN5bmNwaXBlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgewotCQkJaWYgKHNuZF9CVUdfT04oIXN1YnMtPnN5bmN1cmJbaV0udXJiKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChzdWJzLT5vcHMucHJlcGFyZV9zeW5jKHN1YnMsIHJ1bnRpbWUsIHN1YnMtPnN5bmN1cmJbaV0udXJiKSA8IDApIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcHJlcGFyZSBzeW5jcGlwZSBmb3IgdXJiICVkXG4iLCBpKTsKLQkJCQlnb3RvIF9fZXJyb3I7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdWJzLT5hY3RpdmVfbWFzayA9IDA7Ci0Jc3Vicy0+dW5saW5rX21hc2sgPSAwOwotCXN1YnMtPnJ1bm5pbmcgPSAxOwotCWZvciAoaSA9IDA7IGkgPCBzdWJzLT5udXJiczsgaSsrKSB7Ci0JCWVyciA9IHVzYl9zdWJtaXRfdXJiKHN1YnMtPmRhdGF1cmJbaV0udXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBzdWJtaXQgZGF0YXBpcGUgIgotCQkJCSAgICJmb3IgdXJiICVkLCBlcnJvciAlZDogJXNcbiIsCi0JCQkJICAgaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOwotCQkJZ290byBfX2Vycm9yOwotCQl9Ci0JCXNldF9iaXQoaSwgJnN1YnMtPmFjdGl2ZV9tYXNrKTsKLQl9Ci0JaWYgKHN1YnMtPnN5bmNwaXBlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgewotCQkJZXJyID0gdXNiX3N1Ym1pdF91cmIoc3Vicy0+c3luY3VyYltpXS51cmIsIEdGUF9BVE9NSUMpOwotCQkJaWYgKGVyciA8IDApIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc3VibWl0IHN5bmNwaXBlICIKLQkJCQkJICAgImZvciB1cmIgJWQsIGVycm9yICVkOiAlc1xuIiwKLQkJCQkJICAgaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOwotCQkJCWdvdG8gX19lcnJvcjsKLQkJCX0KLQkJCXNldF9iaXQoaSArIDE2LCAmc3Vicy0+YWN0aXZlX21hc2spOwotCQl9Ci0JfQotCXJldHVybiAwOwotCi0gX19lcnJvcjoKLQkvLyBzbmRfcGNtX3N0b3Aoc3Vicy0+cGNtX3N1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOwotCWRlYWN0aXZhdGVfdXJicyhzdWJzLCAwLCAwKTsKLQlyZXR1cm4gLUVQSVBFOwotfQotCi0KLS8qCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3VyYl9vcHMgYXVkaW9fdXJiX29wc1syXSA9IHsKLQl7Ci0JCS5wcmVwYXJlID0JcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiLAotCQkucmV0aXJlID0JcmV0aXJlX3BsYXliYWNrX3VyYiwKLQkJLnByZXBhcmVfc3luYyA9CXByZXBhcmVfcGxheWJhY2tfc3luY191cmIsCi0JCS5yZXRpcmVfc3luYyA9CXJldGlyZV9wbGF5YmFja19zeW5jX3VyYiwKLQl9LAotCXsKLQkJLnByZXBhcmUgPQlwcmVwYXJlX2NhcHR1cmVfdXJiLAotCQkucmV0aXJlID0JcmV0aXJlX2NhcHR1cmVfdXJiLAotCQkucHJlcGFyZV9zeW5jID0JcHJlcGFyZV9jYXB0dXJlX3N5bmNfdXJiLAotCQkucmV0aXJlX3N5bmMgPQlyZXRpcmVfY2FwdHVyZV9zeW5jX3VyYiwKLQl9LAotfTsKLQotLyoKLSAqIGluaXRpYWxpemUgdGhlIHN1YnN0cmVhbSBpbnN0YW5jZS4KLSAqLwotCi12b2lkIHNuZF91c2JfaW5pdF9zdWJzdHJlYW0oc3RydWN0IHNuZF91c2Jfc3RyZWFtICphcywKLQkJCSAgICBpbnQgc3RyZWFtLCBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKQotewotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9ICZhcy0+c3Vic3RyZWFtW3N0cmVhbV07Ci0KLQlJTklUX0xJU1RfSEVBRCgmc3Vicy0+Zm10X2xpc3QpOwotCXNwaW5fbG9ja19pbml0KCZzdWJzLT5sb2NrKTsKLQotCXN1YnMtPnN0cmVhbSA9IGFzOwotCXN1YnMtPmRpcmVjdGlvbiA9IHN0cmVhbTsKLQlzdWJzLT5kZXYgPSBhcy0+Y2hpcC0+ZGV2OwotCXN1YnMtPnR4ZnJfcXVpcmsgPSBhcy0+Y2hpcC0+dHhmcl9xdWlyazsKLQlzdWJzLT5vcHMgPSBhdWRpb191cmJfb3BzW3N0cmVhbV07Ci0JaWYgKHNuZF91c2JfZ2V0X3NwZWVkKHN1YnMtPmRldikgPj0gVVNCX1NQRUVEX0hJR0gpCi0JCXN1YnMtPm9wcy5wcmVwYXJlX3N5bmMgPSBwcmVwYXJlX2NhcHR1cmVfc3luY191cmJfaHM7Ci0KLQlzbmRfdXNiX3NldF9wY21fb3BzKGFzLT5wY20sIHN0cmVhbSk7Ci0KLQlsaXN0X2FkZF90YWlsKCZmcC0+bGlzdCwgJnN1YnMtPmZtdF9saXN0KTsKLQlzdWJzLT5mb3JtYXRzIHw9IGZwLT5mb3JtYXRzOwotCXN1YnMtPmVuZHBvaW50ID0gZnAtPmVuZHBvaW50OwotCXN1YnMtPm51bV9mb3JtYXRzKys7Ci0Jc3Vicy0+Zm10X3R5cGUgPSBmcC0+Zm10X3R5cGU7Ci19Ci0KLWludCBzbmRfdXNiX3N1YnN0cmVhbV9wbGF5YmFja190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKLQkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX3BsYXliYWNrX3VyYjsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlyZXR1cm4gZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDApOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX25vZGF0YV9wbGF5YmFja191cmI7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgc25kX3VzYl9zdWJzdHJlYW1fY2FwdHVyZV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlzdWJzLT5vcHMucmV0aXJlID0gcmV0aXJlX2NhcHR1cmVfdXJiOwotCQlyZXR1cm4gc3RhcnRfdXJicyhzdWJzLCBzdWJzdHJlYW0tPnJ1bnRpbWUpOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJcmV0dXJuIGRlYWN0aXZhdGVfdXJicyhzdWJzLCAwLCAwKTsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCXN1YnMtPm9wcy5yZXRpcmUgPSByZXRpcmVfcGF1c2VkX2NhcHR1cmVfdXJiOwotCQlyZXR1cm4gMDsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCXN1YnMtPm9wcy5yZXRpcmUgPSByZXRpcmVfY2FwdHVyZV91cmI7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgc25kX3VzYl9zdWJzdHJlYW1fcHJlcGFyZShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKQotewotCS8qIGNsZWFyIHVyYnMgKHRvIGJlIHN1cmUpICovCi0JZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDEpOwotCXdhaXRfY2xlYXJfdXJicyhzdWJzKTsKLQotCS8qIGZvciBwbGF5YmFjaywgc3VibWl0IHRoZSBVUkJzIG5vdzsgb3RoZXJ3aXNlLCB0aGUgZmlyc3QgaHdwdHJfZG9uZQotCSAqIHVwZGF0ZXMgZm9yIGFsbCBVUkJzIHdvdWxkIGhhcHBlbiBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gc3RhcnRpbmcgKi8KLQlpZiAoc3Vicy0+ZGlyZWN0aW9uID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX25vZGF0YV9wbGF5YmFja191cmI7Ci0JCXJldHVybiBzdGFydF91cmJzKHN1YnMsIHJ1bnRpbWUpOwotCX0KLQotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXJiLmggYi9zb3VuZC91c2IvdXJiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OGRhMzguLjAwMDAwMDAKLS0tIGEvc291bmQvdXNiL3VyYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotI2lmbmRlZiBfX1VTQkFVRElPX1VSQl9ICi0jZGVmaW5lIF9fVVNCQVVESU9fVVJCX0gKLQotdm9pZCBzbmRfdXNiX2luaXRfc3Vic3RyZWFtKHN0cnVjdCBzbmRfdXNiX3N0cmVhbSAqYXMsCi0JCQkgICAgaW50IHN0cmVhbSwKLQkJCSAgICBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKTsKLQotaW50IHNuZF91c2JfaW5pdF9zdWJzdHJlYW1fdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJdW5zaWduZWQgaW50IHBlcmlvZF9ieXRlcywKLQkJCQl1bnNpZ25lZCBpbnQgcmF0ZSwKLQkJCQl1bnNpZ25lZCBpbnQgZnJhbWVfYml0cyk7Ci0KLXZvaWQgc25kX3VzYl9yZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywgaW50IGZvcmNlKTsKLQotaW50IHNuZF91c2Jfc3Vic3RyZWFtX3ByZXBhcmUoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSk7Ci0KLWludCBzbmRfdXNiX3N1YnN0cmVhbV9wbGF5YmFja190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKTsKLWludCBzbmRfdXNiX3N1YnN0cmVhbV9jYXB0dXJlX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpOwotCi0jZW5kaWYgLyogX19VU0JBVURJT19VUkJfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmggYi9zb3VuZC91c2IvdXNiYXVkaW8uaAppbmRleCAxZTc5OTg2Li4zZTJiMDM1IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uaAorKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uaApAQCAtODAsNiArODAsNyBAQAogCVFVSVJLX01JRElfQ01FLAogCVFVSVJLX01JRElfQUtBSSwKIAlRVUlSS19NSURJX1VTMTIyTCwKKwlRVUlSS19NSURJX0ZUREksCiAJUVVJUktfQVVESU9fU1RBTkRBUkRfSU5URVJGQUNFLAogCVFVSVJLX0FVRElPX0ZJWEVEX0VORFBPSU5ULAogCVFVSVJLX0FVRElPX0VESVJPTF9VQVhYLApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCmluZGV4IDA4NGU2ZmMuLjcyNmMxYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2h3ZGVwLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnlhdWRpby5jIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5YXVkaW8uYwppbmRleCA1ZDM3ZDFjLi42ZmZiMzcxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnlhdWRpby5jCisrKyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeWF1ZGlvLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCmluZGV4IGY4MjQ4MGYuLjZhYjU4Y2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKQEAgLTI2MiwxMyArMjYyLDE2IEBACiAKIHN0YXRpYyB2b2lkIG9wZW5fY291bnRlcnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCiB7Ci0Jc3RydWN0IHBlcmZfZXZzZWwgKnBvczsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zLCAqZmlyc3Q7CiAKIAlpZiAoZXZsaXN0LT5jcHVzLT5tYXBbMF0gPCAwKQogCQlub19pbmhlcml0ID0gdHJ1ZTsKIAorCWZpcnN0ID0gbGlzdF9lbnRyeShldmxpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpIHsKIAkJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZwb3MtPmF0dHI7CisJCXN0cnVjdCB4eWFycmF5ICpncm91cF9mZCA9IE5VTEw7CiAJCS8qCiAJCSAqIENoZWNrIGlmIHBhcnNlX3NpbmdsZV90cmFjZXBvaW50X2V2ZW50IGhhcyBhbHJlYWR5IGFza2VkIGZvcgogCQkgKiBQRVJGX1NBTVBMRV9USU1FLgpAQCAtMjgzLDE1ICsyODYsMTkgQEAKIAkJICovCiAJCWJvb2wgdGltZV9uZWVkZWQgPSBhdHRyLT5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1RJTUU7CiAKKwkJaWYgKGdyb3VwICYmIHBvcyAhPSBmaXJzdCkKKwkJCWdyb3VwX2ZkID0gZmlyc3QtPmZkOworCiAJCWNvbmZpZ19hdHRyKHBvcywgZXZsaXN0KTsKIHJldHJ5X3NhbXBsZV9pZDoKIAkJYXR0ci0+c2FtcGxlX2lkX2FsbCA9IHNhbXBsZV9pZF9hbGxfYXZhaWwgPyAxIDogMDsKIHRyeV9hZ2FpbjoKLQkJaWYgKHBlcmZfZXZzZWxfX29wZW4ocG9zLCBldmxpc3QtPmNwdXMsIGV2bGlzdC0+dGhyZWFkcywgZ3JvdXApIDwgMCkgeworCQlpZiAocGVyZl9ldnNlbF9fb3Blbihwb3MsIGV2bGlzdC0+Y3B1cywgZXZsaXN0LT50aHJlYWRzLCBncm91cCwKKwkJCQkgICAgIGdyb3VwX2ZkKSA8IDApIHsKIAkJCWludCBlcnIgPSBlcnJubzsKIAogCQkJaWYgKGVyciA9PSBFUEVSTSB8fCBlcnIgPT0gRUFDQ0VTKSB7Ci0JCQkJdWlfX3dhcm5pbmdfcGFyYW5vaWQoKTsKKwkJCQl1aV9fZXJyb3JfcGFyYW5vaWQoKTsKIAkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CiAJCQl9IGVsc2UgaWYgKGVyciA9PSAgRU5PREVWICYmIGNwdV9saXN0KSB7CiAJCQkJZGllKCJObyBzdWNoIGRldmljZSAtIGRpZCB5b3Ugc3BlY2lmeSIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCmluZGV4IDdjZTY1ZjUuLjdkOTg2NzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwpAQCAtMjc4LDkgKzI3OCwxNCBAQAogc3RydWN0IHN0YXRzCQkJcnVudGltZV9kdGxiX2NhY2hlX3N0YXRzW01BWF9OUl9DUFVTXTsKIHN0cnVjdCBzdGF0cwkJCXdhbGx0aW1lX25zZWNzX3N0YXRzOwogCi1zdGF0aWMgaW50IGNyZWF0ZV9wZXJmX3N0YXRfY291bnRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCitzdGF0aWMgaW50IGNyZWF0ZV9wZXJmX3N0YXRfY291bnRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkJICAgIHN0cnVjdCBwZXJmX2V2c2VsICpmaXJzdCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJmV2c2VsLT5hdHRyOworCXN0cnVjdCB4eWFycmF5ICpncm91cF9mZCA9IE5VTEw7CisKKwlpZiAoZ3JvdXAgJiYgZXZzZWwgIT0gZmlyc3QpCisJCWdyb3VwX2ZkID0gZmlyc3QtPmZkOwogCiAJaWYgKHNjYWxlKQogCQlhdHRyLT5yZWFkX2Zvcm1hdCA9IFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRCB8CkBAIC0yODksMTQgKzI5NCwxNSBAQAogCWF0dHItPmluaGVyaXQgPSAhbm9faW5oZXJpdDsKIAogCWlmIChzeXN0ZW1fd2lkZSkKLQkJcmV0dXJuIHBlcmZfZXZzZWxfX29wZW5fcGVyX2NwdShldnNlbCwgZXZzZWxfbGlzdC0+Y3B1cywgZ3JvdXApOwotCisJCXJldHVybiBwZXJmX2V2c2VsX19vcGVuX3Blcl9jcHUoZXZzZWwsIGV2c2VsX2xpc3QtPmNwdXMsCisJCQkJCQlncm91cCwgZ3JvdXBfZmQpOwogCWlmICh0YXJnZXRfcGlkID09IC0xICYmIHRhcmdldF90aWQgPT0gLTEpIHsKIAkJYXR0ci0+ZGlzYWJsZWQgPSAxOwogCQlhdHRyLT5lbmFibGVfb25fZXhlYyA9IDE7CiAJfQogCi0JcmV0dXJuIHBlcmZfZXZzZWxfX29wZW5fcGVyX3RocmVhZChldnNlbCwgZXZzZWxfbGlzdC0+dGhyZWFkcywgZ3JvdXApOworCXJldHVybiBwZXJmX2V2c2VsX19vcGVuX3Blcl90aHJlYWQoZXZzZWwsIGV2c2VsX2xpc3QtPnRocmVhZHMsCisJCQkJCSAgIGdyb3VwLCBncm91cF9mZCk7CiB9CiAKIC8qCkBAIC0zOTYsNyArNDAyLDcgQEAKIHN0YXRpYyBpbnQgcnVuX3BlcmZfc3RhdChpbnQgYXJnYyBfX3VzZWQsIGNvbnN0IGNoYXIgKiphcmd2KQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyB0MCwgdDE7Ci0Jc3RydWN0IHBlcmZfZXZzZWwgKmNvdW50ZXI7CisJc3RydWN0IHBlcmZfZXZzZWwgKmNvdW50ZXIsICpmaXJzdDsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgY2hpbGRfcmVhZHlfcGlwZVsyXSwgZ29fcGlwZVsyXTsKIAljb25zdCBib29sIGZvcmtzID0gKGFyZ2MgPiAwKTsKQEAgLTQ1Myw4ICs0NTksMTAgQEAKIAkJY2xvc2UoY2hpbGRfcmVhZHlfcGlwZVswXSk7CiAJfQogCisJZmlyc3QgPSBsaXN0X2VudHJ5KGV2c2VsX2xpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmZXZzZWxfbGlzdC0+ZW50cmllcywgbm9kZSkgewotCQlpZiAoY3JlYXRlX3BlcmZfc3RhdF9jb3VudGVyKGNvdW50ZXIpIDwgMCkgeworCQlpZiAoY3JlYXRlX3BlcmZfc3RhdF9jb3VudGVyKGNvdW50ZXIsIGZpcnN0KSA8IDApIHsKIAkJCWlmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRU5PU1lTIHx8IGVycm5vID09IEVOT0VOVCkgewogCQkJCWlmICh2ZXJib3NlKQogCQkJCQl1aV9fd2FybmluZygiJXMgZXZlbnQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUga2VybmVsLlxuIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tdGVzdC5jCmluZGV4IGVmZTY5NmYuLjgzMWQxYmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJCWdvdG8gb3V0X3RocmVhZF9tYXBfZGVsZXRlOwogCX0KIAotCWlmIChwZXJmX2V2c2VsX19vcGVuX3Blcl90aHJlYWQoZXZzZWwsIHRocmVhZHMsIGZhbHNlKSA8IDApIHsKKwlpZiAocGVyZl9ldnNlbF9fb3Blbl9wZXJfdGhyZWFkKGV2c2VsLCB0aHJlYWRzLCBmYWxzZSwgTlVMTCkgPCAwKSB7CiAJCXByX2RlYnVnKCJmYWlsZWQgdG8gb3BlbiBjb3VudGVyOiAlcywgIgogCQkJICJ0d2VhayAvcHJvYy9zeXMva2VybmVsL3BlcmZfZXZlbnRfcGFyYW5vaWQ/XG4iLAogCQkJIHN0cmVycm9yKGVycm5vKSk7CkBAIC0zNjYsNyArMzY2LDcgQEAKIAkJZ290byBvdXRfdGhyZWFkX21hcF9kZWxldGU7CiAJfQogCi0JaWYgKHBlcmZfZXZzZWxfX29wZW4oZXZzZWwsIGNwdXMsIHRocmVhZHMsIGZhbHNlKSA8IDApIHsKKwlpZiAocGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgdGhyZWFkcywgZmFsc2UsIE5VTEwpIDwgMCkgewogCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIG9wZW4gY291bnRlcjogJXMsICIKIAkJCSAidHdlYWsgL3Byb2Mvc3lzL2tlcm5lbC9wZXJmX2V2ZW50X3BhcmFub2lkP1xuIiwKIAkJCSBzdHJlcnJvcihlcnJubykpOwpAQCAtNTMxLDcgKzUzMSw3IEBACiAKIAkJcGVyZl9ldmxpc3RfX2FkZChldmxpc3QsIGV2c2Vsc1tpXSk7CiAKLQkJaWYgKHBlcmZfZXZzZWxfX29wZW4oZXZzZWxzW2ldLCBjcHVzLCB0aHJlYWRzLCBmYWxzZSkgPCAwKSB7CisJCWlmIChwZXJmX2V2c2VsX19vcGVuKGV2c2Vsc1tpXSwgY3B1cywgdGhyZWFkcywgZmFsc2UsIE5VTEwpIDwgMCkgewogCQkJcHJfZGVidWcoImZhaWxlZCB0byBvcGVuIGNvdW50ZXI6ICVzLCAiCiAJCQkJICJ0d2VhayAvcHJvYy9zeXMva2VybmVsL3BlcmZfZXZlbnRfcGFyYW5vaWQ/XG4iLAogCQkJCSBzdHJlcnJvcihlcnJubykpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCmluZGV4IDdhODcxNzEuLmM5Y2RlZGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKQEAgLTg5LDYgKzg5LDcgQEAKIHN0YXRpYyBib29sCQkJaW5oZXJpdAkJCQk9ICBmYWxzZTsKIHN0YXRpYyBpbnQJCQlyZWFsdGltZV9wcmlvCQkJPSAgICAgIDA7CiBzdGF0aWMgYm9vbAkJCWdyb3VwCQkJCT0gIGZhbHNlOworc3RhdGljIGJvb2wJCQlzYW1wbGVfaWRfYWxsX2F2YWlsCQk9ICAgdHJ1ZTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQJCW1tYXBfcGFnZXMJCQk9ICAgIDEyODsKIAogc3RhdGljIGJvb2wJCQlkdW1wX3N5bXRhYiAgICAgICAgICAgICAgICAgICAgID0gIGZhbHNlOwpAQCAtMTk5LDcgKzIwMCw4IEBACiAJc3RydWN0IHN5bWJvbCAqc3ltOwogCiAJaWYgKGhlID09IE5VTEwgfHwgaGUtPm1zLnN5bSA9PSBOVUxMIHx8Ci0JICAgIChoZSAhPSB0b3Auc3ltX2ZpbHRlcl9lbnRyeSAmJiB1c2VfYnJvd3NlciAhPSAxKSkKKwkgICAgKCh0b3Auc3ltX2ZpbHRlcl9lbnRyeSA9PSBOVUxMIHx8CisJICAgICAgdG9wLnN5bV9maWx0ZXJfZW50cnktPm1zLnN5bSAhPSBoZS0+bXMuc3ltKSAmJiB1c2VfYnJvd3NlciAhPSAxKSkKIAkJcmV0dXJuOwogCiAJc3ltID0gaGUtPm1zLnN5bTsKQEAgLTI4OSwxMSArMjkxLDEzIEBACiAKIAlwcmludGYoIiUtKi4qc1xuIiwgd2luX3dpZHRoLCB3aW5fd2lkdGgsIGdyYXBoX2RvdHRlZF9saW5lKTsKIAotCWlmICh0b3AudG90YWxfbG9zdF93YXJuZWQgIT0gdG9wLnNlc3Npb24tPmhpc3RzLnN0YXRzLnRvdGFsX2xvc3QpIHsKLQkJdG9wLnRvdGFsX2xvc3Rfd2FybmVkID0gdG9wLnNlc3Npb24tPmhpc3RzLnN0YXRzLnRvdGFsX2xvc3Q7Ci0JCWNvbG9yX2ZwcmludGYoc3Rkb3V0LCBQRVJGX0NPTE9SX1JFRCwgIldBUk5JTkc6Iik7Ci0JCXByaW50ZigiIExPU1QgJSIgUFJJdTY0ICIgZXZlbnRzLCBDaGVjayBJTy9DUFUgb3ZlcmxvYWRcbiIsCi0JCSAgICAgICB0b3AudG90YWxfbG9zdF93YXJuZWQpOworCWlmICh0b3Auc3ltX2V2c2VsLT5oaXN0cy5zdGF0cy5ucl9sb3N0X3dhcm5lZCAhPQorCSAgICB0b3Auc3ltX2V2c2VsLT5oaXN0cy5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF0pIHsKKwkJdG9wLnN5bV9ldnNlbC0+aGlzdHMuc3RhdHMubnJfbG9zdF93YXJuZWQgPQorCQkJdG9wLnN5bV9ldnNlbC0+aGlzdHMuc3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX0xPU1RdOworCQljb2xvcl9mcHJpbnRmKHN0ZG91dCwgUEVSRl9DT0xPUl9SRUQsCisJCQkgICAgICAiV0FSTklORzogTE9TVCAlZCBjaHVua3MsIENoZWNrIElPL0NQVSBvdmVybG9hZCIsCisJCQkgICAgICB0b3Auc3ltX2V2c2VsLT5oaXN0cy5zdGF0cy5ucl9sb3N0X3dhcm5lZCk7CiAJCSsrcHJpbnRlZDsKIAl9CiAKQEAgLTU2MSw3ICs1NjUsNiBAQAogCWhpc3RzX19kZWNheV9lbnRyaWVzX3RocmVhZGVkKCZ0LT5zeW1fZXZzZWwtPmhpc3RzLAogCQkJCSAgICAgIHRvcC5oaWRlX3VzZXJfc3ltYm9scywKIAkJCQkgICAgICB0b3AuaGlkZV9rZXJuZWxfc3ltYm9scyk7Ci0JaGlzdHNfX291dHB1dF9yZWNhbGNfY29sX2xlbigmdC0+c3ltX2V2c2VsLT5oaXN0cywgd2luc2l6ZS53c19yb3cgLSAzKTsKIH0KIAogc3RhdGljIHZvaWQgKmRpc3BsYXlfdGhyZWFkX3R1aSh2b2lkICphcmcgX191c2VkKQpAQCAtNjcxLDYgKzY3NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfX3Byb2Nlc3Nfc2FtcGxlKGNvbnN0IHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCQkJICAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQogewpAQCAtNzcwLDEyICs3NzQsOCBAQAogCX0KIAogCWlmIChhbC5zeW0gPT0gTlVMTCB8fCAhYWwuc3ltLT5pZ25vcmUpIHsKLQkJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOwogCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CiAKLQkJZXZzZWwgPSBwZXJmX2V2bGlzdF9faWQyZXZzZWwodG9wLmV2bGlzdCwgc2FtcGxlLT5pZCk7Ci0JCWFzc2VydChldnNlbCAhPSBOVUxMKTsKLQogCQlpZiAoKHNvcnRfX2hhc19wYXJlbnQgfHwgc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikgJiYKIAkJICAgIHNhbXBsZS0+Y2FsbGNoYWluKSB7CiAJCQllcnIgPSBwZXJmX3Nlc3Npb25fX3Jlc29sdmVfY2FsbGNoYWluKHNlc3Npb24sIGFsLnRocmVhZCwKQEAgLTgwNyw2ICs4MDcsNyBAQAogc3RhdGljIHZvaWQgcGVyZl9zZXNzaW9uX19tbWFwX3JlYWRfaWR4KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsIGludCBpZHgpCiB7CiAJc3RydWN0IHBlcmZfc2FtcGxlIHNhbXBsZTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CiAJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQ7CiAJaW50IHJldDsKIApAQCAtODE3LDEwICs4MTgsMTYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJZXZzZWwgPSBwZXJmX2V2bGlzdF9faWQyZXZzZWwoc2VsZi0+ZXZsaXN0LCBzYW1wbGUuaWQpOworCQlhc3NlcnQoZXZzZWwgIT0gTlVMTCk7CisKIAkJaWYgKGV2ZW50LT5oZWFkZXIudHlwZSA9PSBQRVJGX1JFQ09SRF9TQU1QTEUpCi0JCQlwZXJmX2V2ZW50X19wcm9jZXNzX3NhbXBsZShldmVudCwgJnNhbXBsZSwgc2VsZik7Ci0JCWVsc2UKKwkJCXBlcmZfZXZlbnRfX3Byb2Nlc3Nfc2FtcGxlKGV2ZW50LCBldnNlbCwgJnNhbXBsZSwgc2VsZik7CisJCWVsc2UgaWYgKGV2ZW50LT5oZWFkZXIudHlwZSA8IFBFUkZfUkVDT1JEX01BWCkgeworCQkJaGlzdHNfX2luY19ucl9ldmVudHMoJmV2c2VsLT5oaXN0cywgZXZlbnQtPmhlYWRlci50eXBlKTsKIAkJCXBlcmZfZXZlbnRfX3Byb2Nlc3MoZXZlbnQsICZzYW1wbGUsIHNlbGYpOworCQl9IGVsc2UKKwkJCSsrc2VsZi0+aGlzdHMuc3RhdHMubnJfdW5rbm93bl9ldmVudHM7CiAJfQogfQogCkBAIC04MzQsMTAgKzg0MSwxNiBAQAogCiBzdGF0aWMgdm9pZCBzdGFydF9jb3VudGVycyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKIHsKLQlzdHJ1Y3QgcGVyZl9ldnNlbCAqY291bnRlcjsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqY291bnRlciwgKmZpcnN0OworCisJZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvdW50ZXIsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpIHsKIAkJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZjb3VudGVyLT5hdHRyOworCQlzdHJ1Y3QgeHlhcnJheSAqZ3JvdXBfZmQgPSBOVUxMOworCisJCWlmIChncm91cCAmJiBjb3VudGVyICE9IGZpcnN0KQorCQkJZ3JvdXBfZmQgPSBmaXJzdC0+ZmQ7CiAKIAkJYXR0ci0+c2FtcGxlX3R5cGUgPSBQRVJGX1NBTVBMRV9JUCB8IFBFUkZfU0FNUExFX1RJRDsKIApAQCAtODU4LDE0ICs4NzEsMjMgQEAKIAkJYXR0ci0+bW1hcCA9IDE7CiAJCWF0dHItPmNvbW0gPSAxOwogCQlhdHRyLT5pbmhlcml0ID0gaW5oZXJpdDsKK3JldHJ5X3NhbXBsZV9pZDoKKwkJYXR0ci0+c2FtcGxlX2lkX2FsbCA9IHNhbXBsZV9pZF9hbGxfYXZhaWwgPyAxIDogMDsKIHRyeV9hZ2FpbjoKIAkJaWYgKHBlcmZfZXZzZWxfX29wZW4oY291bnRlciwgdG9wLmV2bGlzdC0+Y3B1cywKLQkJCQkgICAgIHRvcC5ldmxpc3QtPnRocmVhZHMsIGdyb3VwKSA8IDApIHsKKwkJCQkgICAgIHRvcC5ldmxpc3QtPnRocmVhZHMsIGdyb3VwLAorCQkJCSAgICAgZ3JvdXBfZmQpIDwgMCkgewogCQkJaW50IGVyciA9IGVycm5vOwogCiAJCQlpZiAoZXJyID09IEVQRVJNIHx8IGVyciA9PSBFQUNDRVMpIHsKLQkJCQl1aV9fd2FybmluZ19wYXJhbm9pZCgpOworCQkJCXVpX19lcnJvcl9wYXJhbm9pZCgpOwogCQkJCWdvdG8gb3V0X2VycjsKKwkJCX0gZWxzZSBpZiAoZXJyID09IEVJTlZBTCAmJiBzYW1wbGVfaWRfYWxsX2F2YWlsKSB7CisJCQkJLyoKKwkJCQkgKiBPbGQga2VybmVsLCBubyBhdHRyLT5zYW1wbGVfaWRfdHlwZV9hbGwgZmllbGQKKwkJCQkgKi8KKwkJCQlzYW1wbGVfaWRfYWxsX2F2YWlsID0gZmFsc2U7CisJCQkJZ290byByZXRyeV9zYW1wbGVfaWQ7CiAJCQl9CiAJCQkvKgogCQkJICogSWYgaXQncyBjeWNsZXMgdGhlbiBmYWxsIGJhY2sgdG8gaHJ0aW1lcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMgYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYwppbmRleCBiYzhmNDc3Li4xMTllOTk2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYworKysgYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYwpAQCAtMzEwLDkgKzMxMCwxMiBAQAogCQl9CiAJCWVyciA9IC1FTk9FTlQ7CiAJCWRzby0+YW5ub3RhdGVfd2FybmVkID0gMTsKLQkJcHJfZXJyKCJDYW4ndCBhbm5vdGF0ZSAlczogTm8gdm1saW51eCBmaWxlJXMgd2FzIGZvdW5kIGluIHRoZSAiCi0JCSAgICAgICAicGF0aC5cblBsZWFzZSB1c2UgJ3BlcmYgYnVpbGRpZC1jYWNoZSAtYXYgdm1saW51eCcgb3IgIgotCQkgICAgICAgIi0tdm1saW51eCB2bWxpbnV4LlxuIiwKKwkJcHJfZXJyKCJDYW4ndCBhbm5vdGF0ZSAlczpcblxuIgorCQkgICAgICAgIk5vIHZtbGludXggZmlsZSVzXG53YXMgZm91bmQgaW4gdGhlIHBhdGguXG5cbiIKKwkJICAgICAgICJQbGVhc2UgdXNlOlxuXG4iCisJCSAgICAgICAiICBwZXJmIGJ1aWxkaWQtY2FjaGUgLWF2IHZtbGludXhcblxuIgorCQkgICAgICAgIm9yOlxuXG4iCisJCSAgICAgICAiICAtLXZtbGludXggdm1saW51eCIsCiAJCSAgICAgICBzeW0tPm5hbWUsIGJ1aWxkX2lkX21zZyA/OiAiIik7CiAJCWdvdG8gb3V0X2ZyZWVfZmlsZW5hbWU7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmMgYi90b29scy9wZXJmL3V0aWwvZGVidWcuYwppbmRleCAxNTU3NDlkLi4yNjgxN2RhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZGVidWcuYworKysgYi90b29scy9wZXJmL3V0aWwvZGVidWcuYwpAQCAtNDcsMTkgKzQ3LDIwIEBACiB9CiAKICNpZmRlZiBOT19ORVdUX1NVUFBPUlQKLXZvaWQgdWlfX3dhcm5pbmcoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCitpbnQgdWlfX3dhcm5pbmcoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKIAl2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOworCXJldHVybiAwOwogfQogI2VuZGlmCiAKLXZvaWQgdWlfX3dhcm5pbmdfcGFyYW5vaWQodm9pZCkKK2ludCB1aV9fZXJyb3JfcGFyYW5vaWQodm9pZCkKIHsKLQl1aV9fd2FybmluZygiUGVybWlzc2lvbiBlcnJvciAtIGFyZSB5b3Ugcm9vdD9cbiIKKwlyZXR1cm4gdWlfX2Vycm9yKCJQZXJtaXNzaW9uIGVycm9yIC0gYXJlIHlvdSByb290P1xuIgogCQkgICAgIkNvbnNpZGVyIHR3ZWFraW5nIC9wcm9jL3N5cy9rZXJuZWwvcGVyZl9ldmVudF9wYXJhbm9pZDpcbiIKIAkJICAgICIgLTEgLSBOb3QgcGFyYW5vaWQgYXQgYWxsXG4iCiAJCSAgICAiICAwIC0gRGlzYWxsb3cgcmF3IHRyYWNlcG9pbnQgYWNjZXNzIGZvciB1bnByaXZcbiIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5oIGIvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmgKaW5kZXggZmQ1M2RiNC4uZjJjZTg4ZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmgKQEAgLTE5LDIzICsxOSwxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB1aV9wcm9ncmVzcyAqdWlfcHJvZ3Jlc3NfX25ldyhjb25zdCBjaGFyICp0aXRsZSBfX3VzZWQsCi0JCQkJCQkgICB1NjQgdG90YWwgX191c2VkKQotewotCXJldHVybiAoc3RydWN0IHVpX3Byb2dyZXNzICopMTsKLX0KK3N0YXRpYyBpbmxpbmUgdm9pZCB1aV9wcm9ncmVzc19fdXBkYXRlKHU2NCBjdXJyIF9fdXNlZCwgdTY0IHRvdGFsIF9fdXNlZCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqdGl0bGUgX191c2VkKSB7fQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdWlfcHJvZ3Jlc3NfX3VwZGF0ZShzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnNlbGYgX191c2VkLAotCQkJCSAgICAgICB1NjQgY3VyciBfX3VzZWQpIHt9Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1aV9wcm9ncmVzc19fZGVsZXRlKHN0cnVjdCB1aV9wcm9ncmVzcyAqc2VsZiBfX3VzZWQpIHt9CisjZGVmaW5lIHVpX19lcnJvcihmb3JtYXQsIGFyZy4uLikgdWlfX3dhcm5pbmcoZm9ybWF0LCAjI2FyZykKICNlbHNlCiBleHRlcm4gY2hhciB1aV9oZWxwbGluZV9fbGFzdF9tc2dbXTsKIGludCB1aV9oZWxwbGluZV9fc2hvd19oZWxwKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CiAjaW5jbHVkZSAidWkvcHJvZ3Jlc3MuaCIKK2ludCB1aV9fZXJyb3IoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CiAjZW5kaWYKIAotdm9pZCB1aV9fd2FybmluZyhjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKLXZvaWQgdWlfX3dhcm5pbmdfcGFyYW5vaWQodm9pZCk7CitpbnQgdWlfX3dhcm5pbmcoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CitpbnQgdWlfX2Vycm9yX3BhcmFub2lkKHZvaWQpOwogCiAjZW5kaWYJLyogX19QRVJGX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYwppbmRleCAyZjZiYzg5Li5mYmI0YjRhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCkBAIC01MzksMyArNTM5LDMzIEBACiB7CiAJZXZsaXN0LT5zZWxlY3RlZCA9IGV2c2VsOwogfQorCitpbnQgcGVyZl9ldmxpc3RfX29wZW4oc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIGJvb2wgZ3JvdXApCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCAqZmlyc3Q7CisJaW50IGVyciwgbmNwdXMsIG50aHJlYWRzOworCisJZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2c2VsLCAmZXZsaXN0LT5lbnRyaWVzLCBub2RlKSB7CisJCXN0cnVjdCB4eWFycmF5ICpncm91cF9mZCA9IE5VTEw7CisKKwkJaWYgKGdyb3VwICYmIGV2c2VsICE9IGZpcnN0KQorCQkJZ3JvdXBfZmQgPSBmaXJzdC0+ZmQ7CisKKwkJZXJyID0gcGVyZl9ldnNlbF9fb3BlbihldnNlbCwgZXZsaXN0LT5jcHVzLCBldmxpc3QtPnRocmVhZHMsCisJCQkJICAgICAgIGdyb3VwLCBncm91cF9mZCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfZXJyOworCX0KKworCXJldHVybiAwOworb3V0X2VycjoKKwluY3B1cyA9IGV2bGlzdC0+Y3B1cyA/IGV2bGlzdC0+Y3B1cy0+bnIgOiAxOworCW50aHJlYWRzID0gZXZsaXN0LT50aHJlYWRzID8gZXZsaXN0LT50aHJlYWRzLT5uciA6IDE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZXZzZWwsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpCisJCXBlcmZfZXZzZWxfX2Nsb3NlKGV2c2VsLCBuY3B1cywgbnRocmVhZHMpOworCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaAppbmRleCA2YmU3MWZjLi4xNzc5ZmZlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5oCkBAIC01MCw2ICs1MCw4IEBACiAKIHVuaW9uIHBlcmZfZXZlbnQgKnBlcmZfZXZsaXN0X19tbWFwX3JlYWQoc3RydWN0IHBlcmZfZXZsaXN0ICpzZWxmLCBpbnQgaWR4KTsKIAoraW50IHBlcmZfZXZsaXN0X19vcGVuKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBib29sIGdyb3VwKTsKKwogaW50IHBlcmZfZXZsaXN0X19hbGxvY19tbWFwKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKIGludCBwZXJmX2V2bGlzdF9fbW1hcChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgaW50IHBhZ2VzLCBib29sIG92ZXJ3cml0ZSk7CiB2b2lkIHBlcmZfZXZsaXN0X19tdW5tYXAoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwppbmRleCBiNDZmNmU0Li5lNDI2MjY0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgInRocmVhZF9tYXAuaCIKIAogI2RlZmluZSBGRChlLCB4LCB5KSAoKihpbnQgKil4eWFycmF5X19lbnRyeShlLT5mZCwgeCwgeSkpCisjZGVmaW5lIEdST1VQX0ZEKGdyb3VwX2ZkLCBjcHUpICgqKGludCAqKXh5YXJyYXlfX2VudHJ5KGdyb3VwX2ZkLCBjcHUsIDApKQogCiBpbnQgX19wZXJmX2V2c2VsX19zYW1wbGVfc2l6ZSh1NjQgc2FtcGxlX3R5cGUpCiB7CkBAIC0yMDQsMTUgKzIwNSwxNiBAQAogfQogCiBzdGF0aWMgaW50IF9fcGVyZl9ldnNlbF9fb3BlbihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBjcHVfbWFwICpjcHVzLAotCQkJICAgICAgc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXApCisJCQkgICAgICBzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcywgYm9vbCBncm91cCwKKwkJCSAgICAgIHN0cnVjdCB4eWFycmF5ICpncm91cF9mZHMpCiB7CiAJaW50IGNwdSwgdGhyZWFkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCWludCBwaWQgPSAtMTsKKwlpbnQgcGlkID0gLTEsIGVycjsKIAogCWlmIChldnNlbC0+ZmQgPT0gTlVMTCAmJgogCSAgICBwZXJmX2V2c2VsX19hbGxvY19mZChldnNlbCwgY3B1cy0+bnIsIHRocmVhZHMtPm5yKSA8IDApCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoZXZzZWwtPmNncnApIHsKIAkJZmxhZ3MgPSBQRVJGX0ZMQUdfUElEX0NHUk9VUDsKQEAgLTIyMCw3ICsyMjIsNyBAQAogCX0KIAogCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1cy0+bnI7IGNwdSsrKSB7Ci0JCWludCBncm91cF9mZCA9IC0xOworCQlpbnQgZ3JvdXBfZmQgPSBncm91cF9mZHMgPyBHUk9VUF9GRChncm91cF9mZHMsIGNwdSkgOiAtMTsKIAogCQlmb3IgKHRocmVhZCA9IDA7IHRocmVhZCA8IHRocmVhZHMtPm5yOyB0aHJlYWQrKykgewogCkBAIC0yMzEsOCArMjMzLDEwIEBACiAJCQkJCQkJCSAgICAgcGlkLAogCQkJCQkJCQkgICAgIGNwdXMtPm1hcFtjcHVdLAogCQkJCQkJCQkgICAgIGdyb3VwX2ZkLCBmbGFncyk7Ci0JCQlpZiAoRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSA8IDApCisJCQlpZiAoRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSA8IDApIHsKKwkJCQllcnIgPSAtZXJybm87CiAJCQkJZ290byBvdXRfY2xvc2U7CisJCQl9CiAKIAkJCWlmIChncm91cCAmJiBncm91cF9mZCA9PSAtMSkKIAkJCQlncm91cF9mZCA9IEZEKGV2c2VsLCBjcHUsIHRocmVhZCk7CkBAIC0yNDksNyArMjUzLDE3IEBACiAJCX0KIAkJdGhyZWFkID0gdGhyZWFkcy0+bnI7CiAJfSB3aGlsZSAoLS1jcHUgPj0gMCk7Ci0JcmV0dXJuIC0xOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgcGVyZl9ldnNlbF9fY2xvc2Uoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBpbnQgbmNwdXMsIGludCBudGhyZWFkcykKK3sKKwlpZiAoZXZzZWwtPmZkID09IE5VTEwpCisJCXJldHVybjsKKworCXBlcmZfZXZzZWxfX2Nsb3NlX2ZkKGV2c2VsLCBuY3B1cywgbnRocmVhZHMpOworCXBlcmZfZXZzZWxfX2ZyZWVfZmQoZXZzZWwpOworCWV2c2VsLT5mZCA9IE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMjY5LDcgKzI4Myw4IEBACiB9OwogCiBpbnQgcGVyZl9ldnNlbF9fb3BlbihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBjcHVfbWFwICpjcHVzLAotCQkgICAgIHN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzLCBib29sIGdyb3VwKQorCQkgICAgIHN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzLCBib29sIGdyb3VwLAorCQkgICAgIHN0cnVjdCB4eWFycmF5ICpncm91cF9mZCkKIHsKIAlpZiAoY3B1cyA9PSBOVUxMKSB7CiAJCS8qIFdvcmsgYXJvdW5kIG9sZCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpY3QgYWxpYXNpbmcgKi8KQEAgLTI3OSwxOSArMjk0LDIzIEBACiAJaWYgKHRocmVhZHMgPT0gTlVMTCkKIAkJdGhyZWFkcyA9ICZlbXB0eV90aHJlYWRfbWFwLm1hcDsKIAotCXJldHVybiBfX3BlcmZfZXZzZWxfX29wZW4oZXZzZWwsIGNwdXMsIHRocmVhZHMsIGdyb3VwKTsKKwlyZXR1cm4gX19wZXJmX2V2c2VsX19vcGVuKGV2c2VsLCBjcHVzLCB0aHJlYWRzLCBncm91cCwgZ3JvdXBfZmQpOwogfQogCiBpbnQgcGVyZl9ldnNlbF9fb3Blbl9wZXJfY3B1KHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKLQkJCSAgICAgc3RydWN0IGNwdV9tYXAgKmNwdXMsIGJvb2wgZ3JvdXApCisJCQkgICAgIHN0cnVjdCBjcHVfbWFwICpjcHVzLCBib29sIGdyb3VwLAorCQkJICAgICBzdHJ1Y3QgeHlhcnJheSAqZ3JvdXBfZmQpCiB7Ci0JcmV0dXJuIF9fcGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgJmVtcHR5X3RocmVhZF9tYXAubWFwLCBncm91cCk7CisJcmV0dXJuIF9fcGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgJmVtcHR5X3RocmVhZF9tYXAubWFwLCBncm91cCwKKwkJCQkgIGdyb3VwX2ZkKTsKIH0KIAogaW50IHBlcmZfZXZzZWxfX29wZW5fcGVyX3RocmVhZChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkJc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXApCisJCQkJc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXAsCisJCQkJc3RydWN0IHh5YXJyYXkgKmdyb3VwX2ZkKQogewotCXJldHVybiBfX3BlcmZfZXZzZWxfX29wZW4oZXZzZWwsICZlbXB0eV9jcHVfbWFwLm1hcCwgdGhyZWFkcywgZ3JvdXApOworCXJldHVybiBfX3BlcmZfZXZzZWxfX29wZW4oZXZzZWwsICZlbXB0eV9jcHVfbWFwLm1hcCwgdGhyZWFkcywgZ3JvdXAsCisJCQkJICBncm91cF9mZCk7CiB9CiAKIHN0YXRpYyBpbnQgcGVyZl9ldmVudF9fcGFyc2VfaWRfc2FtcGxlKGNvbnN0IHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCB1NjQgdHlwZSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKaW5kZXggZTlhMzE1NS4uYjFkMTVlNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKQEAgLTgyLDExICs4MiwxNSBAQAogdm9pZCBwZXJmX2V2c2VsX19jbG9zZV9mZChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGludCBuY3B1cywgaW50IG50aHJlYWRzKTsKIAogaW50IHBlcmZfZXZzZWxfX29wZW5fcGVyX2NwdShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkgICAgIHN0cnVjdCBjcHVfbWFwICpjcHVzLCBib29sIGdyb3VwKTsKKwkJCSAgICAgc3RydWN0IGNwdV9tYXAgKmNwdXMsIGJvb2wgZ3JvdXAsCisJCQkgICAgIHN0cnVjdCB4eWFycmF5ICpncm91cF9mZHMpOwogaW50IHBlcmZfZXZzZWxfX29wZW5fcGVyX3RocmVhZChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkJc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXApOworCQkJCXN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzLCBib29sIGdyb3VwLAorCQkJCXN0cnVjdCB4eWFycmF5ICpncm91cF9mZHMpOwogaW50IHBlcmZfZXZzZWxfX29wZW4oc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBzdHJ1Y3QgY3B1X21hcCAqY3B1cywKLQkJICAgICBzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcywgYm9vbCBncm91cCk7CisJCSAgICAgc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXAsCisJCSAgICAgc3RydWN0IHh5YXJyYXkgKmdyb3VwX2Zkcyk7Cit2b2lkIHBlcmZfZXZzZWxfX2Nsb3NlKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgaW50IG5jcHVzLCBpbnQgbnRocmVhZHMpOwogCiAjZGVmaW5lIHBlcmZfZXZzZWxfX21hdGNoKGV2c2VsLCB0LCBjKQkJXAogCShldnNlbC0+YXR0ci50eXBlID09IFBFUkZfVFlQRV8jI3QgJiYJXApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jIGIvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCmluZGV4IDc2YzBiMmMuLmJjZDA1ZDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKQEAgLTEsNSArMSw2IEBACiAjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CiAKKyNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTExLDcgKzEyLDYgQEAKIAogI2luY2x1ZGUgImV2bGlzdC5oIgogI2luY2x1ZGUgImV2c2VsLmgiCi0jaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImhlYWRlci5oIgogI2luY2x1ZGUgIi4uL3BlcmYuaCIKICNpbmNsdWRlICJ0cmFjZS1ldmVudC5oIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKaW5kZXggZjZhOTkzOS4uYTM2YTNmYSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvaGlzdC5jCkBAIC0zNjUsNyArMzY1LDYgQEAKIAogCXJvb3QgPSBoaXN0c19fZ2V0X3JvdGF0ZV9lbnRyaWVzX2luKGhpc3RzKTsKIAluZXh0ID0gcmJfZmlyc3Qocm9vdCk7Ci0JaGlzdHMtPnN0YXRzLnRvdGFsX3BlcmlvZCA9IDA7CiAKIAl3aGlsZSAobmV4dCkgewogCQluID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGVfaW4pOwpAQCAtMzc5LDcgKzM3OCw2IEBACiAJCQkgKiBiZWVuIHNldCBieSwgc2F5LCB0aGUgaGlzdF9icm93c2VyLgogCQkJICovCiAJCQloaXN0c19fYXBwbHlfZmlsdGVycyhoaXN0cywgbik7Ci0JCQloaXN0c19faW5jX25yX2VudHJpZXMoaGlzdHMsIG4pOwogCQl9CiAJfQogfQpAQCAtNDQyLDYgKzQ0MCw3IEBACiAJaGlzdHMtPmVudHJpZXMgPSBSQl9ST09UOwogCiAJaGlzdHMtPm5yX2VudHJpZXMgPSAwOworCWhpc3RzLT5zdGF0cy50b3RhbF9wZXJpb2QgPSAwOwogCWhpc3RzX19yZXNldF9jb2xfbGVuKGhpc3RzKTsKIAogCXdoaWxlIChuZXh0KSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5oIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaAppbmRleCBmZjkzZGRjLi5jODZjMWQyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKQEAgLTI4LDYgKzI4LDcgQEAKIAl1NjQgdG90YWxfbG9zdDsKIAl1NjQgdG90YWxfaW52YWxpZF9jaGFpbnM7CiAJdTMyIG5yX2V2ZW50c1tQRVJGX1JFQ09SRF9IRUFERVJfTUFYXTsKKwl1MzIgbnJfbG9zdF93YXJuZWQ7CiAJdTMyIG5yX3Vua25vd25fZXZlbnRzOwogCXUzMiBucl9pbnZhbGlkX2NoYWluczsKIAl1MzIgbnJfdW5rbm93bl9pZDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9weXRob24uYyBiL3Rvb2xzL3BlcmYvdXRpbC9weXRob24uYwppbmRleCA3NjI0MzI0Li45ZGQ0N2E0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHl0aG9uLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi5jCkBAIC02MjMsNyArNjIzLDExIEBACiAJCWNwdXMgPSAoKHN0cnVjdCBweXJmX2NwdV9tYXAgKilwY3B1cyktPmNwdXM7CiAKIAlldnNlbC0+YXR0ci5pbmhlcml0ID0gaW5oZXJpdDsKLQlpZiAocGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgdGhyZWFkcywgZ3JvdXApIDwgMCkgeworCS8qCisJICogVGhpcyB3aWxsIGdyb3VwIGp1c3QgdGhlIGZkcyBmb3IgdGhpcyBzaW5nbGUgZXZzZWwsIHRvIGdyb3VwCisJICogbXVsdGlwbGUgZXZlbnRzLCB1c2UgZXZsaXN0Lm9wZW4oKS4KKwkgKi8KKwlpZiAocGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgdGhyZWFkcywgZ3JvdXAsIE5VTEwpIDwgMCkgewogCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTgxNCw2ICs4MTgsMjUgQEAKIAlyZXR1cm4gUHlfTm9uZTsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICpweXJmX2V2bGlzdF9fb3BlbihzdHJ1Y3QgcHlyZl9ldmxpc3QgKnBldmxpc3QsCisJCQkJICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgPSAmcGV2bGlzdC0+ZXZsaXN0OworCWludCBncm91cCA9IDA7CisJc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyAiZ3JvdXAiLCBOVUxMIH07CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T09paSIsIGt3bGlzdCwgJmdyb3VwKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocGVyZl9ldmxpc3RfX29wZW4oZXZsaXN0LCBncm91cCkgPCAwKSB7CisJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOworfQorCiBzdGF0aWMgUHlNZXRob2REZWYgcHlyZl9ldmxpc3RfX21ldGhvZHNbXSA9IHsKIAl7CiAJCS5tbF9uYW1lICA9ICJtbWFwIiwKQEAgLTgyMiw2ICs4NDUsMTIgQEAKIAkJLm1sX2RvYwkgID0gUHlEb2NfU1RSKCJtbWFwIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUuIikKIAl9LAogCXsKKwkJLm1sX25hbWUgID0gIm9wZW4iLAorCQkubWxfbWV0aCAgPSAoUHlDRnVuY3Rpb24pcHlyZl9ldmxpc3RfX29wZW4sCisJCS5tbF9mbGFncyA9IE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisJCS5tbF9kb2MJICA9IFB5RG9jX1NUUigib3BlbiB0aGUgZmlsZSBkZXNjcmlwdG9ycy4iKQorCX0sCisJewogCQkubWxfbmFtZSAgPSAicG9sbCIsCiAJCS5tbF9tZXRoICA9IChQeUNGdW5jdGlvbilweXJmX2V2bGlzdF9fcG9sbCwKIAkJLm1sX2ZsYWdzID0gTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCmluZGV4IDIwZTAxMWMuLjg1YzFlNmI3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKQEAgLTUwMiw2ICs1MDIsNyBAQAogCXN0cnVjdCBwZXJmX3NhbXBsZSBzYW1wbGU7CiAJdTY0IGxpbWl0ID0gb3MtPm5leHRfZmx1c2g7CiAJdTY0IGxhc3RfdHMgPSBvcy0+bGFzdF9zYW1wbGUgPyBvcy0+bGFzdF9zYW1wbGUtPnRpbWVzdGFtcCA6IDBVTEw7CisJdW5zaWduZWQgaWR4ID0gMCwgcHJvZ3Jlc3NfbmV4dCA9IG9zLT5ucl9zYW1wbGVzIC8gMTY7CiAJaW50IHJldDsKIAogCWlmICghb3BzLT5vcmRlcmVkX3NhbXBsZXMgfHwgIWxpbWl0KQpAQCAtNTIxLDYgKzUyMiwxMSBAQAogCQlvcy0+bGFzdF9mbHVzaCA9IGl0ZXItPnRpbWVzdGFtcDsKIAkJbGlzdF9kZWwoJml0ZXItPmxpc3QpOwogCQlsaXN0X2FkZCgmaXRlci0+bGlzdCwgJm9zLT5zYW1wbGVfY2FjaGUpOworCQlpZiAoKytpZHggPj0gcHJvZ3Jlc3NfbmV4dCkgeworCQkJcHJvZ3Jlc3NfbmV4dCArPSBvcy0+bnJfc2FtcGxlcyAvIDE2OworCQkJdWlfcHJvZ3Jlc3NfX3VwZGF0ZShpZHgsIG9zLT5ucl9zYW1wbGVzLAorCQkJCQkgICAgIlByb2Nlc3NpbmcgdGltZSBvcmRlcmVkIGV2ZW50cy4uLiIpOworCQl9CiAJfQogCiAJaWYgKGxpc3RfZW1wdHkoaGVhZCkpIHsKQEAgLTUyOSw2ICs1MzUsOCBAQAogCQlvcy0+bGFzdF9zYW1wbGUgPQogCQkJbGlzdF9lbnRyeShoZWFkLT5wcmV2LCBzdHJ1Y3Qgc2FtcGxlX3F1ZXVlLCBsaXN0KTsKIAl9CisKKwlvcy0+bnJfc2FtcGxlcyA9IDA7CiB9CiAKIC8qCkBAIC01ODgsNiArNTk2LDcgQEAKIAl1NjQgdGltZXN0YW1wID0gbmV3LT50aW1lc3RhbXA7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAorCSsrb3MtPm5yX3NhbXBsZXM7CiAJb3MtPmxhc3Rfc2FtcGxlID0gbmV3OwogCiAJaWYgKCFzYW1wbGUpIHsKQEAgLTczOCwxMCArNzQ3LDI3IEBACiAKIAlkdW1wX2V2ZW50KHNlc3Npb24sIGV2ZW50LCBmaWxlX29mZnNldCwgc2FtcGxlKTsKIAorCWV2c2VsID0gcGVyZl9ldmxpc3RfX2lkMmV2c2VsKHNlc3Npb24tPmV2bGlzdCwgc2FtcGxlLT5pZCk7CisJaWYgKGV2c2VsICE9IE5VTEwgJiYgZXZlbnQtPmhlYWRlci50eXBlICE9IFBFUkZfUkVDT1JEX1NBTVBMRSkgeworCQkvKgorCQkgKiBYWFggV2UncmUgbGVhdmluZyBQRVJGX1JFQ09SRF9TQU1QTEUgdW5uYWNvdW50ZWQgaGVyZQorCQkgKiBiZWNhdXNlIHRoZSB0b29scyByaWdodCBub3cgbWF5IGFwcGx5IGZpbHRlcnMsIGRpc2NhcmRpbmcKKwkJICogc29tZSBvZiB0aGUgc2FtcGxlcy4gRm9yIGNvbnNpc3RlbmN5LCBpbiB0aGUgZnV0dXJlIHdlCisJCSAqIHNob3VsZCBoYXZlIHNvbWV0aGluZyBsaWtlIG5yX2ZpbHRlcmVkX3NhbXBsZXMgYW5kIHJlbW92ZQorCQkgKiB0aGUgc2FtcGxlLT5wZXJpb2QgZnJvbSB0b3RhbF9zYW1wbGVfcGVyaW9kLCBldGMsIEtJU1MgZm9yCisJCSAqIG5vdyB0aG8uCisJCSAqCisJCSAqIEFsc28gdGVzdGluZyBhZ2FpbnN0IE5VTEwgYWxsb3dzIHVzIHRvIGhhbmRsZSBmaWxlcyB3aXRob3V0CisJCSAqIGF0dHIuc2FtcGxlX2lkX2FsbCBhbmQvb3Igd2l0aG91dCBQRVJGX1NBTVBMRV9JRC4gSW4gdGhlCisJCSAqIGZ1dHVyZSBwcm9iYWJseSBpdCdsbCBiZSBhIGdvb2QgaWRlYSB0byByZXN0cmljdCBldmVudAorCQkgKiBwcm9jZXNzaW5nIHZpYSBwZXJmX3Nlc3Npb24gdG8gZmlsZXMgd2l0aCBib3RoIHNldC4KKwkJICovCisJCWhpc3RzX19pbmNfbnJfZXZlbnRzKCZldnNlbC0+aGlzdHMsIGV2ZW50LT5oZWFkZXIudHlwZSk7CisJfQorCiAJc3dpdGNoIChldmVudC0+aGVhZGVyLnR5cGUpIHsKIAljYXNlIFBFUkZfUkVDT1JEX1NBTVBMRToKIAkJZHVtcF9zYW1wbGUoc2Vzc2lvbiwgZXZlbnQsIHNhbXBsZSk7Ci0JCWV2c2VsID0gcGVyZl9ldmxpc3RfX2lkMmV2c2VsKHNlc3Npb24tPmV2bGlzdCwgc2FtcGxlLT5pZCk7CiAJCWlmIChldnNlbCA9PSBOVUxMKSB7CiAJCQkrK3Nlc3Npb24tPmhpc3RzLnN0YXRzLm5yX3Vua25vd25faWQ7CiAJCQlyZXR1cm4gLTE7CkBAIC04NzQsMTEgKzkwMCwxMSBAQAogCQkJCQkgICAgY29uc3Qgc3RydWN0IHBlcmZfZXZlbnRfb3BzICpvcHMpCiB7CiAJaWYgKG9wcy0+bG9zdCA9PSBwZXJmX2V2ZW50X19wcm9jZXNzX2xvc3QgJiYKLQkgICAgc2Vzc2lvbi0+aGlzdHMuc3RhdHMudG90YWxfbG9zdCAhPSAwKSB7Ci0JCXVpX193YXJuaW5nKCJQcm9jZXNzZWQgJSIgUFJJdTY0ICIgZXZlbnRzIGFuZCBMT1NUICUiIFBSSXU2NAotCQkJICAgICIhXG5cbkNoZWNrIElPL0NQVSBvdmVybG9hZCFcblxuIiwKLQkJCSAgICBzZXNzaW9uLT5oaXN0cy5zdGF0cy50b3RhbF9wZXJpb2QsCi0JCQkgICAgc2Vzc2lvbi0+aGlzdHMuc3RhdHMudG90YWxfbG9zdCk7CisJICAgIHNlc3Npb24tPmhpc3RzLnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9MT1NUXSAhPSAwKSB7CisJCXVpX193YXJuaW5nKCJQcm9jZXNzZWQgJWQgZXZlbnRzIGFuZCBsb3N0ICVkIGNodW5rcyFcblxuIgorCQkJICAgICJDaGVjayBJTy9DUFUgb3ZlcmxvYWQhXG5cbiIsCisJCQkgICAgc2Vzc2lvbi0+aGlzdHMuc3RhdHMubnJfZXZlbnRzWzBdLAorCQkJICAgIHNlc3Npb24tPmhpc3RzLnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9MT1NUXSk7CiAJfQogCiAJaWYgKHNlc3Npb24tPmhpc3RzLnN0YXRzLm5yX3Vua25vd25fZXZlbnRzICE9IDApIHsKQEAgLTEwMTIsNyArMTAzOCw2IEBACiB7CiAJdTY0IGhlYWQsIHBhZ2Vfb2Zmc2V0LCBmaWxlX29mZnNldCwgZmlsZV9wb3MsIHByb2dyZXNzX25leHQ7CiAJaW50IGVyciwgbW1hcF9wcm90LCBtbWFwX2ZsYWdzLCBtYXBfaWR4ID0gMDsKLQlzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnByb2dyZXNzOwogCXNpemVfdAlwYWdlX3NpemUsIG1tYXBfc2l6ZTsKIAljaGFyICpidWYsICptbWFwc1s4XTsKIAl1bmlvbiBwZXJmX2V2ZW50ICpldmVudDsKQEAgLTEwMzAsOSArMTA1NSw2IEBACiAJCWZpbGVfc2l6ZSA9IGRhdGFfb2Zmc2V0ICsgZGF0YV9zaXplOwogCiAJcHJvZ3Jlc3NfbmV4dCA9IGZpbGVfc2l6ZSAvIDE2OwotCXByb2dyZXNzID0gdWlfcHJvZ3Jlc3NfX25ldygiUHJvY2Vzc2luZyBldmVudHMuLi4iLCBmaWxlX3NpemUpOwotCWlmIChwcm9ncmVzcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CiAKIAltbWFwX3NpemUgPSBzZXNzaW9uLT5tbWFwX3dpbmRvdzsKIAlpZiAobW1hcF9zaXplID4gZmlsZV9zaXplKQpAQCAtMTA5NSw3ICsxMTE3LDggQEAKIAogCWlmIChmaWxlX3BvcyA+PSBwcm9ncmVzc19uZXh0KSB7CiAJCXByb2dyZXNzX25leHQgKz0gZmlsZV9zaXplIC8gMTY7Ci0JCXVpX3Byb2dyZXNzX191cGRhdGUocHJvZ3Jlc3MsIGZpbGVfcG9zKTsKKwkJdWlfcHJvZ3Jlc3NfX3VwZGF0ZShmaWxlX3BvcywgZmlsZV9zaXplLAorCQkJCSAgICAiUHJvY2Vzc2luZyBldmVudHMuLi4iKTsKIAl9CiAKIAlpZiAoZmlsZV9wb3MgPCBmaWxlX3NpemUpCkBAIC0xMTA2LDcgKzExMjksNiBAQAogCXNlc3Npb24tPm9yZGVyZWRfc2FtcGxlcy5uZXh0X2ZsdXNoID0gVUxMT05HX01BWDsKIAlmbHVzaF9zYW1wbGVfcXVldWUoc2Vzc2lvbiwgb3BzKTsKIG91dF9lcnI6Ci0JdWlfcHJvZ3Jlc3NfX2RlbGV0ZShwcm9ncmVzcyk7CiAJcGVyZl9zZXNzaW9uX193YXJuX2Fib3V0X2Vycm9ycyhzZXNzaW9uLCBvcHMpOwogCXBlcmZfc2Vzc2lvbl9mcmVlX3NhbXBsZV9idWZmZXJzKHNlc3Npb24pOwogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uaAppbmRleCA1MTRiMDZkLi42ZTM5M2M5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmgKQEAgLTIzLDYgKzIzLDcgQEAKIAlzdHJ1Y3Qgc2FtcGxlX3F1ZXVlCSpzYW1wbGVfYnVmZmVyOwogCXN0cnVjdCBzYW1wbGVfcXVldWUJKmxhc3Rfc2FtcGxlOwogCWludAkJCXNhbXBsZV9idWZmZXJfaWR4OworCXVuc2lnbmVkIGludAkJbnJfc2FtcGxlczsKIH07CiAKIHN0cnVjdCBwZXJmX3Nlc3Npb24gewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RvcC5oIGIvdG9vbHMvcGVyZi91dGlsL3RvcC5oCmluZGV4IDAxZDEwNTcuLjM5OTY1MDkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90b3AuaAorKysgYi90b29scy9wZXJmL3V0aWwvdG9wLmgKQEAgLTE5LDcgKzE5LDYgQEAKIAl1NjQJCSAgIGtlcm5lbF9zYW1wbGVzLCB1c19zYW1wbGVzOwogCXU2NAkJICAgZXhhY3Rfc2FtcGxlczsKIAl1NjQJCSAgIGd1ZXN0X3VzX3NhbXBsZXMsIGd1ZXN0X2tlcm5lbF9zYW1wbGVzOwotCXU2NAkJICAgdG90YWxfbG9zdF93YXJuZWQ7CiAJaW50CQkgICBwcmludF9lbnRyaWVzLCBjb3VudF9maWx0ZXIsIGRlbGF5X3NlY3M7CiAJaW50CQkgICBmcmVxOwogCXBpZF90CQkgICB0YXJnZXRfcGlkLCB0YXJnZXRfdGlkOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LWluZm8uYyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1pbmZvLmMKaW5kZXggMmQ1MzBjZi4uZDI2NTVmMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LWluZm8uYworKysgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtaW5mby5jCkBAIC04MCw3ICs4MCw3IEBACiAJaW50IHJldCA9IGVycm5vOwogCiAJaWYgKGVycm5vKQotCQlwZXJyb3IoInRyYWNlLWNtZCIpOworCQlwZXJyb3IoInBlcmYiKTsKIAllbHNlCiAJCXJldCA9IC0xOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3Nlci5jIGIvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXIuYwppbmRleCA1MzU5ZjM3Li41NTY4MjkxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3Nlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9icm93c2VyLmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSAibGlic2xhbmcuaCIKICNpbmNsdWRlIDxuZXd0Lmg+CiAjaW5jbHVkZSAidWkuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CkBAIC0xNjgsNiArMTY5LDU5IEBACiAJc2VsZi0+eCA9IDA7CiB9CiAKK3ZvaWQgdWlfYnJvd3Nlcl9faGFuZGxlX3Jlc2l6ZShzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3NlcikKK3sKKwl1aV9fcmVmcmVzaF9kaW1lbnNpb25zKGZhbHNlKTsKKwl1aV9icm93c2VyX19zaG93KGJyb3dzZXIsIGJyb3dzZXItPnRpdGxlLCB1aV9oZWxwbGluZV9fY3VycmVudCk7CisJdWlfYnJvd3Nlcl9fcmVmcmVzaChicm93c2VyKTsKK30KKworaW50IHVpX2Jyb3dzZXJfX3dhcm5pbmcoc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIsIGludCB0aW1lb3V0LAorCQkJY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgKnRleHQ7CisJaW50IGtleSA9IDAsIGVycjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJZXJyID0gdmFzcHJpbnRmKCZ0ZXh0LCBmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWlmIChlcnIgPCAwKSB7CisJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCXVpX2hlbHBsaW5lX192cHVzaChmb3JtYXQsIGFyZ3MpOworCQl2YV9lbmQoYXJncyk7CisJfSBlbHNlIHsKKwkJd2hpbGUgKChrZXkgPT0gdWlfX3F1ZXN0aW9uX3dpbmRvdygiV2FybmluZyEiLCB0ZXh0LAorCQkJCQkJICAgIlByZXNzIGFueSBrZXkuLi4iLAorCQkJCQkJICAgdGltZW91dCkpID09IEtfUkVTSVpFKQorCQkJdWlfYnJvd3Nlcl9faGFuZGxlX3Jlc2l6ZShicm93c2VyKTsKKwkJZnJlZSh0ZXh0KTsKKwl9CisKKwlyZXR1cm4ga2V5OworfQorCitpbnQgdWlfYnJvd3Nlcl9faGVscF93aW5kb3coc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJaW50IGtleTsKKworCXdoaWxlICgoa2V5ID0gdWlfX2hlbHBfd2luZG93KHRleHQpKSA9PSBLX1JFU0laRSkKKwkJdWlfYnJvd3Nlcl9faGFuZGxlX3Jlc2l6ZShicm93c2VyKTsKKworCXJldHVybiBrZXk7Cit9CisKK2Jvb2wgdWlfYnJvd3Nlcl9fZGlhbG9nX3llc25vKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyLCBjb25zdCBjaGFyICp0ZXh0KQoreworCWludCBrZXk7CisKKwl3aGlsZSAoKGtleSA9IHVpX19kaWFsb2dfeWVzbm8odGV4dCkpID09IEtfUkVTSVpFKQorCQl1aV9icm93c2VyX19oYW5kbGVfcmVzaXplKGJyb3dzZXIpOworCisJcmV0dXJuIGtleSA9PSBLX0VOVEVSIHx8IHRvdXBwZXIoa2V5KSA9PSAnWSc7Cit9CisKIHZvaWQgdWlfYnJvd3Nlcl9fcmVzZXRfaW5kZXgoc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYpCiB7CiAJc2VsZi0+aW5kZXggPSBzZWxmLT50b3BfaWR4ID0gMDsKQEAgLTIzMCwxMyArMjg0LDE1IEBACiAJCSAgICAgICAoYnJvd3Nlci0+bnJfZW50cmllcyAtIDEpKTsKIAl9CiAKKwlTTHNtZ19zZXRfY2hhcl9zZXQoMSk7CisKIAl3aGlsZSAoaCA8IGhlaWdodCkgewogCSAgICAgICAgdWlfYnJvd3Nlcl9fZ290b3JjKGJyb3dzZXIsIHJvdysrLCBjb2wpOwotCQlTTHNtZ19zZXRfY2hhcl9zZXQoMSk7Ci0JCVNMc21nX3dyaXRlX2NoYXIoaCA9PSBwY3QgPyBTTFNNR19ESUFNT05EX0NIQVIgOiBTTFNNR19CT0FSRF9DSEFSKTsKLQkJU0xzbWdfc2V0X2NoYXJfc2V0KDApOworCQlTTHNtZ193cml0ZV9jaGFyKGggPT0gcGN0ID8gU0xTTUdfRElBTU9ORF9DSEFSIDogU0xTTUdfQ0tCUkRfQ0hBUik7CiAJCSsraDsKIAl9CisKKwlTTHNtZ19zZXRfY2hhcl9zZXQoMCk7CiB9CiAKIHN0YXRpYyBpbnQgX191aV9icm93c2VyX19yZWZyZXNoKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyKQpAQCAtMjkxLDUzICszNDcsMTAgQEAKIAlicm93c2VyLT5zZWVrKGJyb3dzZXIsIGJyb3dzZXItPnRvcF9pZHgsIFNFRUtfU0VUKTsKIH0KIAotc3RhdGljIGludCB1aV9fZ2V0Y2goaW50IGRlbGF5X3NlY3MpCi17Ci0Jc3RydWN0IHRpbWV2YWwgdGltZW91dCwgKnB0aW1lb3V0ID0gZGVsYXlfc2VjcyA/ICZ0aW1lb3V0IDogTlVMTDsKLQlmZF9zZXQgcmVhZF9zZXQ7Ci0JaW50IGVyciwga2V5OwotCi0JRkRfWkVSTygmcmVhZF9zZXQpOwotCUZEX1NFVCgwLCAmcmVhZF9zZXQpOwotCi0JaWYgKGRlbGF5X3NlY3MpIHsKLQkJdGltZW91dC50dl9zZWMgPSBkZWxheV9zZWNzOwotCQl0aW1lb3V0LnR2X3VzZWMgPSAwOwotCX0KLQotICAgICAgICBlcnIgPSBzZWxlY3QoMSwgJnJlYWRfc2V0LCBOVUxMLCBOVUxMLCBwdGltZW91dCk7Ci0KLQlpZiAoZXJyID09IDApCi0JCXJldHVybiBLX1RJTUVSOwotCi0JaWYgKGVyciA9PSAtMSkgewotCQlpZiAoZXJybm8gPT0gRUlOVFIpCi0JCQlyZXR1cm4gS19SRVNJWkU7Ci0JCXJldHVybiBLX0VSUk9SOwotCX0KLQotCWtleSA9IFNMYW5nX2dldGtleSgpOwotCWlmIChrZXkgIT0gS19FU0MpCi0JCXJldHVybiBrZXk7Ci0KLQlGRF9aRVJPKCZyZWFkX3NldCk7Ci0JRkRfU0VUKDAsICZyZWFkX3NldCk7Ci0JdGltZW91dC50dl9zZWMgPSAwOwotCXRpbWVvdXQudHZfdXNlYyA9IDIwOwotICAgICAgICBlcnIgPSBzZWxlY3QoMSwgJnJlYWRfc2V0LCBOVUxMLCBOVUxMLCAmdGltZW91dCk7Ci0JaWYgKGVyciA9PSAwKQotCQlyZXR1cm4gS19FU0M7Ci0KLQlTTGFuZ191bmdldGtleShrZXkpOwotCXJldHVybiBTTGtwX2dldGtleSgpOwotfQotCiBpbnQgdWlfYnJvd3Nlcl9fcnVuKHN0cnVjdCB1aV9icm93c2VyICpzZWxmLCBpbnQgZGVsYXlfc2VjcykKIHsKIAlpbnQgZXJyLCBrZXk7CiAKLQlwdGhyZWFkX191bmJsb2NrX3NpZ3dpbmNoKCk7Ci0KIAl3aGlsZSAoMSkgewogCQlvZmZfdCBvZmZzZXQ7CiAKQEAgLTM1MSwxMCArMzY0LDcgQEAKIAkJa2V5ID0gdWlfX2dldGNoKGRlbGF5X3NlY3MpOwogCiAJCWlmIChrZXkgPT0gS19SRVNJWkUpIHsKLQkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdWlfX2xvY2spOwotCQkJU0x0dF9nZXRfc2NyZWVuX3NpemUoKTsKLQkJCVNMc21nX3JlaW5pdF9zbWcoKTsKLQkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ1aV9fbG9jayk7CisJCQl1aV9fcmVmcmVzaF9kaW1lbnNpb25zKGZhbHNlKTsKIAkJCXVpX2Jyb3dzZXJfX3JlZnJlc2hfZGltZW5zaW9ucyhzZWxmKTsKIAkJCV9fdWlfYnJvd3Nlcl9fc2hvd190aXRsZShzZWxmLCBzZWxmLT50aXRsZSk7CiAJCQl1aV9oZWxwbGluZV9fcHV0cyhzZWxmLT5oZWxwbGluZSk7CkBAIC01MzMsNiArNTQzLDQ3IEBACiAJcmV0dXJuIC0xOwogfQogCit2b2lkIHVpX2Jyb3dzZXJfX2FyZ3Zfc2VlayhzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3Nlciwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworCXN3aXRjaCAod2hlbmNlKSB7CisJY2FzZSBTRUVLX1NFVDoKKwkJYnJvd3Nlci0+dG9wID0gYnJvd3Nlci0+ZW50cmllczsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0NVUjoKKwkJYnJvd3Nlci0+dG9wID0gYnJvd3Nlci0+dG9wICsgYnJvd3Nlci0+dG9wX2lkeCArIG9mZnNldDsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0VORDoKKwkJYnJvd3Nlci0+dG9wID0gYnJvd3Nlci0+dG9wICsgYnJvd3Nlci0+bnJfZW50cmllcyArIG9mZnNldDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KK30KKwordW5zaWduZWQgaW50IHVpX2Jyb3dzZXJfX2FyZ3ZfcmVmcmVzaChzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3NlcikKK3sKKwl1bnNpZ25lZCBpbnQgcm93ID0gMCwgaWR4ID0gYnJvd3Nlci0+dG9wX2lkeDsKKwljaGFyICoqcG9zOworCisJaWYgKGJyb3dzZXItPnRvcCA9PSBOVUxMKQorCQlicm93c2VyLT50b3AgPSBicm93c2VyLT5lbnRyaWVzOworCisJcG9zID0gKGNoYXIgKiopYnJvd3Nlci0+dG9wOworCXdoaWxlIChpZHggPCBicm93c2VyLT5ucl9lbnRyaWVzKSB7CisJCWlmICghYnJvd3Nlci0+ZmlsdGVyIHx8ICFicm93c2VyLT5maWx0ZXIoYnJvd3NlciwgKnBvcykpIHsKKwkJCXVpX2Jyb3dzZXJfX2dvdG9yYyhicm93c2VyLCByb3csIDApOworCQkJYnJvd3Nlci0+d3JpdGUoYnJvd3NlciwgcG9zLCByb3cpOworCQkJaWYgKCsrcm93ID09IGJyb3dzZXItPmhlaWdodCkKKwkJCQlicmVhazsKKwkJfQorCisJCSsraWR4OworCQkrK3BvczsKKwl9CisKKwlyZXR1cm4gcm93OworfQorCiB2b2lkIHVpX2Jyb3dzZXJfX2luaXQodm9pZCkKIHsKIAlpbnQgaSA9IDA7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3Nlci5oIGIvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXIuaAppbmRleCBhMmM3MDdkLi44NGQ3NjFiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3Nlci5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9icm93c2VyLmgKQEAgLTQzLDYgKzQzLDE1IEBACiBpbnQgdWlfYnJvd3Nlcl9fcmVmcmVzaChzdHJ1Y3QgdWlfYnJvd3NlciAqc2VsZik7CiBpbnQgdWlfYnJvd3Nlcl9fcnVuKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyLCBpbnQgZGVsYXlfc2Vjcyk7CiB2b2lkIHVpX2Jyb3dzZXJfX3VwZGF0ZV9ucl9lbnRyaWVzKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyLCB1MzIgbnJfZW50cmllcyk7Cit2b2lkIHVpX2Jyb3dzZXJfX2hhbmRsZV9yZXNpemUoc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIpOworCitpbnQgdWlfYnJvd3Nlcl9fd2FybmluZyhzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3NlciwgaW50IHRpbWVvdXQsCisJCQljb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitpbnQgdWlfYnJvd3Nlcl9faGVscF93aW5kb3coc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIsIGNvbnN0IGNoYXIgKnRleHQpOworYm9vbCB1aV9icm93c2VyX19kaWFsb2dfeWVzbm8oc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIsIGNvbnN0IGNoYXIgKnRleHQpOworCit2b2lkIHVpX2Jyb3dzZXJfX2FyZ3Zfc2VlayhzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3Nlciwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKK3Vuc2lnbmVkIGludCB1aV9icm93c2VyX19hcmd2X3JlZnJlc2goc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIpOwogCiB2b2lkIHVpX2Jyb3dzZXJfX3JiX3RyZWVfc2VlayhzdHJ1Y3QgdWlfYnJvd3NlciAqc2VsZiwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKIHVuc2lnbmVkIGludCB1aV9icm93c2VyX19yYl90cmVlX3JlZnJlc2goc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMgYi90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvYW5ub3RhdGUuYwppbmRleCA0ZTBjYjdmZS4uMDU3NTkwNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMKQEAgLTEsNiArMSw5IEBACisjaW5jbHVkZSAiLi4vLi4vdXRpbC5oIgogI2luY2x1ZGUgIi4uL2Jyb3dzZXIuaCIKICNpbmNsdWRlICIuLi9oZWxwbGluZS5oIgogI2luY2x1ZGUgIi4uL2xpYnNsYW5nLmgiCisjaW5jbHVkZSAiLi4vdWkuaCIKKyNpbmNsdWRlICIuLi91dGlsLmgiCiAjaW5jbHVkZSAiLi4vLi4vYW5ub3RhdGUuaCIKICNpbmNsdWRlICIuLi8uLi9oaXN0LmgiCiAjaW5jbHVkZSAiLi4vLi4vc29ydC5oIgpAQCAtOCwxNSArMTEsNiBAQAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxuZXd0Lmg+CiAKLXN0YXRpYyB2b2lkIHVpX19lcnJvcl93aW5kb3coY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCW5ld3RXaW5NZXNzYWdldigoY2hhciAqKSJFcnJvciIsIChjaGFyICopIk9rIiwgKGNoYXIgKilmbXQsIGFwKTsKLQl2YV9lbmQoYXApOwotfQotCiBzdHJ1Y3QgYW5ub3RhdGVfYnJvd3NlciB7CiAJc3RydWN0IHVpX2Jyb3dzZXIgYjsKIAlzdHJ1Y3QgcmJfcm9vdAkgIGVudHJpZXM7CkBAIC00MDAsNyArMzk0LDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKHN5bWJvbF9fYW5ub3RhdGUoc3ltLCBtYXAsIHNpemVvZihzdHJ1Y3Qgb2JqZHVtcF9saW5lX3JiX25vZGUpKSA8IDApIHsKLQkJdWlfX2Vycm9yX3dpbmRvdyh1aV9oZWxwbGluZV9fbGFzdF9tc2cpOworCQl1aV9fZXJyb3IoIiVzIiwgdWlfaGVscGxpbmVfX2xhc3RfbXNnKTsKIAkJcmV0dXJuIC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXJzL2hpc3RzLmMgYi90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvaGlzdHMuYwppbmRleCA0NjYzZGNiLi5kMGM5NGI0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvaGlzdHMuYworKysgYi90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvaGlzdHMuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgIi4uL2Jyb3dzZXIuaCIKICNpbmNsdWRlICIuLi9oZWxwbGluZS5oIgogI2luY2x1ZGUgIi4uL3V0aWwuaCIKKyNpbmNsdWRlICIuLi91aS5oIgogI2luY2x1ZGUgIm1hcC5oIgogCiBzdHJ1Y3QgaGlzdF9icm93c2VyIHsKQEAgLTI5NCw2ICsyOTUsMTUgQEAKIAl1aV9icm93c2VyX19yZXNldF9pbmRleCgmc2VsZi0+Yik7CiB9CiAKK3N0YXRpYyB2b2lkIHVpX2Jyb3dzZXJfX3dhcm5fbG9zdF9ldmVudHMoc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIpCit7CisJdWlfYnJvd3Nlcl9fd2FybmluZyhicm93c2VyLCA0LAorCQkiRXZlbnRzIGFyZSBiZWluZyBsb3N0LCBjaGVjayBJTy9DUFUgb3ZlcmxvYWQhXG5cbiIKKwkJIllvdSBtYXkgd2FudCB0byBydW4gJ3BlcmYnIHVzaW5nIGEgUlQgc2NoZWR1bGVyIHBvbGljeTpcblxuIgorCQkiIHBlcmYgdG9wIC1yIDgwXG5cbiIKKwkJIk9yIHJlZHVjZSB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5LiIpOworfQorCiBzdGF0aWMgaW50IGhpc3RfYnJvd3Nlcl9fcnVuKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKnNlbGYsIGNvbnN0IGNoYXIgKmV2X25hbWUsCiAJCQkgICAgIHZvaWQoKnRpbWVyKSh2b2lkICphcmcpLCB2b2lkICphcmcsIGludCBkZWxheV9zZWNzKQogewpAQCAtMzE0LDEyICszMjQsMTggQEAKIAkJa2V5ID0gdWlfYnJvd3Nlcl9fcnVuKCZzZWxmLT5iLCBkZWxheV9zZWNzKTsKIAogCQlzd2l0Y2ggKGtleSkgewotCQljYXNlIC0xOgotCQkJLyogRklYTUUgd2UgbmVlZCB0byBjaGVjayBpZiBpdCB3YXMgZXMucmVhc29uID09IE5FV1RfRVhJVF9USU1FUiAqLworCQljYXNlIEtfVElNRVI6CiAJCQl0aW1lcihhcmcpOwogCQkJdWlfYnJvd3Nlcl9fdXBkYXRlX25yX2VudHJpZXMoJnNlbGYtPmIsIHNlbGYtPmhpc3RzLT5ucl9lbnRyaWVzKTsKLQkJCWhpc3RzX19icm93c2VyX3RpdGxlKHNlbGYtPmhpc3RzLCB0aXRsZSwgc2l6ZW9mKHRpdGxlKSwKLQkJCQkJICAgICBldl9uYW1lKTsKKworCQkJaWYgKHNlbGYtPmhpc3RzLT5zdGF0cy5ucl9sb3N0X3dhcm5lZCAhPQorCQkJICAgIHNlbGYtPmhpc3RzLT5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF0pIHsKKwkJCQlzZWxmLT5oaXN0cy0+c3RhdHMubnJfbG9zdF93YXJuZWQgPQorCQkJCQlzZWxmLT5oaXN0cy0+c3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX0xPU1RdOworCQkJCXVpX2Jyb3dzZXJfX3dhcm5fbG9zdF9ldmVudHMoJnNlbGYtPmIpOworCQkJfQorCisJCQloaXN0c19fYnJvd3Nlcl90aXRsZShzZWxmLT5oaXN0cywgdGl0bGUsIHNpemVvZih0aXRsZSksIGV2X25hbWUpOwogCQkJdWlfYnJvd3Nlcl9fc2hvd190aXRsZSgmc2VsZi0+YiwgdGl0bGUpOwogCQkJY29udGludWU7CiAJCWNhc2UgJ0QnOiB7IC8qIERlYnVnICovCkBAIC04ODMsNyArODk5LDcgQEAKIAkJCWdvdG8gb3V0X2ZyZWVfc3RhY2s7CiAJCWNhc2UgJ2EnOgogCQkJaWYgKCFicm93c2VyLT5oYXNfc3ltYm9scykgewotCQkJCXVpX193YXJuaW5nKAorCQkJCXVpX2Jyb3dzZXJfX3dhcm5pbmcoJmJyb3dzZXItPmIsIGRlbGF5X3NlY3MgKiAyLAogCQkJIkFubm90YXRpb24gaXMgb25seSBhdmFpbGFibGUgZm9yIHN5bWJvbGljIHZpZXdzLCAiCiAJCQkiaW5jbHVkZSBcInN5bVwiIGluIC0tc29ydCB0byB1c2UgaXQuIik7CiAJCQkJY29udGludWU7CkBAIC05MDEsNyArOTE3LDggQEAKIAkJY2FzZSBLX0YxOgogCQljYXNlICdoJzoKIAkJY2FzZSAnPyc6Ci0JCQl1aV9faGVscF93aW5kb3coImgvPy9GMSAgICAgICAgU2hvdyB0aGlzIHdpbmRvd1xuIgorCQkJdWlfYnJvd3Nlcl9faGVscF93aW5kb3coJmJyb3dzZXItPmIsCisJCQkJCSJoLz8vRjEgICAgICAgIFNob3cgdGhpcyB3aW5kb3dcbiIKIAkJCQkJIlVQL0RPV04vUEdVUFxuIgogCQkJCQkiUEdETi9TUEFDRSAgICBOYXZpZ2F0ZVxuIgogCQkJCQkicS9FU0MvQ1RSTCtDICBFeGl0IGJyb3dzZXJcblxuIgpAQCAtOTE0LDcgKzkzMSw3IEBACiAJCQkJCSJDICAgICAgICAgICAgIENvbGxhcHNlIGFsbCBjYWxsY2hhaW5zXG4iCiAJCQkJCSJFICAgICAgICAgICAgIEV4cGFuZCBhbGwgY2FsbGNoYWluc1xuIgogCQkJCQkiZCAgICAgICAgICAgICBab29tIGludG8gY3VycmVudCBEU09cbiIKLQkJCQkJInQgICAgICAgICAgICAgWm9vbSBpbnRvIGN1cnJlbnQgVGhyZWFkXG4iKTsKKwkJCQkJInQgICAgICAgICAgICAgWm9vbSBpbnRvIGN1cnJlbnQgVGhyZWFkIik7CiAJCQljb250aW51ZTsKIAkJY2FzZSBLX0VOVEVSOgogCQljYXNlIEtfUklHSFQ6CkBAIC05NDAsNyArOTU3LDggQEAKIAkJfQogCQljYXNlIEtfRVNDOgogCQkJaWYgKCFsZWZ0X2V4aXRzICYmCi0JCQkgICAgIXVpX19kaWFsb2dfeWVzbm8oIkRvIHlvdSByZWFsbHkgd2FudCB0byBleGl0PyIpKQorCQkJICAgICF1aV9icm93c2VyX19kaWFsb2dfeWVzbm8oJmJyb3dzZXItPmIsCisJCQkJCSAgICAgICAiRG8geW91IHJlYWxseSB3YW50IHRvIGV4aXQ/IikpCiAJCQkJY29udGludWU7CiAJCQkvKiBGYWxsIHRocnUgKi8KIAkJY2FzZSAncSc6CkBAIC05OTMsNiArMTAxMSw3IEBACiAKIAkJaWYgKGNob2ljZSA9PSBhbm5vdGF0ZSkgewogCQkJc3RydWN0IGhpc3RfZW50cnkgKmhlOworCQkJaW50IGVycjsKIGRvX2Fubm90YXRlOgogCQkJaGUgPSBoaXN0X2Jyb3dzZXJfX3NlbGVjdGVkX2VudHJ5KGJyb3dzZXIpOwogCQkJaWYgKGhlID09IE5VTEwpCkBAIC0xMDAxLDEwICsxMDIwLDEyIEBACiAJCQkgKiBEb24ndCBsZXQgdGhpcyBiZSBmcmVlZCwgc2F5LCBieSBoaXN0c19fZGVjYXlfZW50cnkuCiAJCQkgKi8KIAkJCWhlLT51c2VkID0gdHJ1ZTsKLQkJCWhpc3RfZW50cnlfX3R1aV9hbm5vdGF0ZShoZSwgZXZzZWwtPmlkeCwgbnJfZXZlbnRzLAotCQkJCQkJIHRpbWVyLCBhcmcsIGRlbGF5X3NlY3MpOworCQkJZXJyID0gaGlzdF9lbnRyeV9fdHVpX2Fubm90YXRlKGhlLCBldnNlbC0+aWR4LCBucl9ldmVudHMsCisJCQkJCQkgICAgICAgdGltZXIsIGFyZywgZGVsYXlfc2Vjcyk7CiAJCQloZS0+dXNlZCA9IGZhbHNlOwogCQkJdWlfYnJvd3Nlcl9fdXBkYXRlX25yX2VudHJpZXMoJmJyb3dzZXItPmIsIGJyb3dzZXItPmhpc3RzLT5ucl9lbnRyaWVzKTsKKwkJCWlmIChlcnIpCisJCQkJdWlfYnJvd3Nlcl9faGFuZGxlX3Jlc2l6ZSgmYnJvd3Nlci0+Yik7CiAJCX0gZWxzZSBpZiAoY2hvaWNlID09IGJyb3dzZV9tYXApCiAJCQltYXBfX2Jyb3dzZShicm93c2VyLT5zZWxlY3Rpb24tPm1hcCk7CiAJCWVsc2UgaWYgKGNob2ljZSA9PSB6b29tX2RzbykgewpAQCAtMTA1Niw2ICsxMDc3LDcgQEAKIHN0cnVjdCBwZXJmX2V2c2VsX21lbnUgewogCXN0cnVjdCB1aV9icm93c2VyIGI7CiAJc3RydWN0IHBlcmZfZXZzZWwgKnNlbGVjdGlvbjsKKwlib29sIGxvc3RfZXZlbnRzLCBsb3N0X2V2ZW50c193YXJuZWQ7CiB9OwogCiBzdGF0aWMgdm9pZCBwZXJmX2V2c2VsX21lbnVfX3dyaXRlKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyLApAQCAtMTA2OCwxNCArMTA5MCwyOSBAQAogCXVuc2lnbmVkIGxvbmcgbnJfZXZlbnRzID0gZXZzZWwtPmhpc3RzLnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9TQU1QTEVdOwogCWNvbnN0IGNoYXIgKmV2X25hbWUgPSBldmVudF9uYW1lKGV2c2VsKTsKIAljaGFyIGJmWzI1Nl0sIHVuaXQ7CisJY29uc3QgY2hhciAqd2FybiA9ICIgIjsKKwlzaXplX3QgcHJpbnRlZDsKIAogCXVpX2Jyb3dzZXJfX3NldF9jb2xvcihicm93c2VyLCBjdXJyZW50X2VudHJ5ID8gSEVfQ09MT1JTRVRfU0VMRUNURUQgOgogCQkJCQkJICAgICAgIEhFX0NPTE9SU0VUX05PUk1BTCk7CiAKIAlucl9ldmVudHMgPSBjb252ZXJ0X3VuaXQobnJfZXZlbnRzLCAmdW5pdCk7Ci0Jc25wcmludGYoYmYsIHNpemVvZihiZiksICIlbHUlYyVzJXMiLCBucl9ldmVudHMsCi0JCSB1bml0LCB1bml0ID09ICcgJyA/ICIiIDogIiAiLCBldl9uYW1lKTsKLQlzbHNtZ193cml0ZV9uc3RyaW5nKGJmLCBicm93c2VyLT53aWR0aCk7CisJcHJpbnRlZCA9IHNucHJpbnRmKGJmLCBzaXplb2YoYmYpLCAiJWx1JWMlcyVzIiwgbnJfZXZlbnRzLAorCQkJICAgdW5pdCwgdW5pdCA9PSAnICcgPyAiIiA6ICIgIiwgZXZfbmFtZSk7CisJc2xzbWdfcHJpbnRmKCIlcyIsIGJmKTsKKworCW5yX2V2ZW50cyA9IGV2c2VsLT5oaXN0cy5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF07CisJaWYgKG5yX2V2ZW50cyAhPSAwKSB7CisJCW1lbnUtPmxvc3RfZXZlbnRzID0gdHJ1ZTsKKwkJaWYgKCFjdXJyZW50X2VudHJ5KQorCQkJdWlfYnJvd3Nlcl9fc2V0X2NvbG9yKGJyb3dzZXIsIEhFX0NPTE9SU0VUX1RPUCk7CisJCW5yX2V2ZW50cyA9IGNvbnZlcnRfdW5pdChucl9ldmVudHMsICZ1bml0KTsKKwkJc25wcmludGYoYmYsIHNpemVvZihiZiksICI6ICVsZCVjJXNjaHVua3MgTE9TVCEiLCBucl9ldmVudHMsCisJCQkgdW5pdCwgdW5pdCA9PSAnICcgPyAiIiA6ICIgIik7CisJCXdhcm4gPSBiZjsKKwl9CisKKwlzbHNtZ193cml0ZV9uc3RyaW5nKHdhcm4sIGJyb3dzZXItPndpZHRoIC0gcHJpbnRlZCk7CiAKIAlpZiAoY3VycmVudF9lbnRyeSkKIAkJbWVudS0+c2VsZWN0aW9uID0gZXZzZWw7CkBAIC0xMTAwLDYgKzExMzcsMTEgQEAKIAkJc3dpdGNoIChrZXkpIHsKIAkJY2FzZSBLX1RJTUVSOgogCQkJdGltZXIoYXJnKTsKKworCQkJaWYgKCFtZW51LT5sb3N0X2V2ZW50c193YXJuZWQgJiYgbWVudS0+bG9zdF9ldmVudHMpIHsKKwkJCQl1aV9icm93c2VyX193YXJuX2xvc3RfZXZlbnRzKCZtZW51LT5iKTsKKwkJCQltZW51LT5sb3N0X2V2ZW50c193YXJuZWQgPSB0cnVlOworCQkJfQogCQkJY29udGludWU7CiAJCWNhc2UgS19SSUdIVDoKIAkJY2FzZSBLX0VOVEVSOgpAQCAtMTEzMyw3ICsxMTc1LDggQEAKIAkJCQkJcG9zID0gbGlzdF9lbnRyeShwb3MtPm5vZGUucHJldiwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOwogCQkJCWdvdG8gYnJvd3NlX2hpc3RzOwogCQkJY2FzZSBLX0VTQzoKLQkJCQlpZiAoIXVpX19kaWFsb2dfeWVzbm8oIkRvIHlvdSByZWFsbHkgd2FudCB0byBleGl0PyIpKQorCQkJCWlmICghdWlfYnJvd3Nlcl9fZGlhbG9nX3llc25vKCZtZW51LT5iLAorCQkJCQkJIkRvIHlvdSByZWFsbHkgd2FudCB0byBleGl0PyIpKQogCQkJCQljb250aW51ZTsKIAkJCQkvKiBGYWxsIHRocnUgKi8KIAkJCWNhc2UgJ3EnOgpAQCAtMTE0NSw3ICsxMTg4LDggQEAKIAkJY2FzZSBLX0xFRlQ6CiAJCQljb250aW51ZTsKIAkJY2FzZSBLX0VTQzoKLQkJCWlmICghdWlfX2RpYWxvZ195ZXNubygiRG8geW91IHJlYWxseSB3YW50IHRvIGV4aXQ/IikpCisJCQlpZiAoIXVpX2Jyb3dzZXJfX2RpYWxvZ195ZXNubygmbWVudS0+YiwKKwkJCQkJICAgICAgICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZXhpdD8iKSkKIAkJCQljb250aW51ZTsKIAkJCS8qIEZhbGwgdGhydSAqLwogCQljYXNlICdxJzoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91aS9oZWxwbGluZS5jIGIvdG9vbHMvcGVyZi91dGlsL3VpL2hlbHBsaW5lLmMKaW5kZXggZjM2ZDJmZjUuLjZlZjNjNTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91aS9oZWxwbGluZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9oZWxwbGluZS5jCkBAIC0xLDIwICsxLDI4IEBACiAjZGVmaW5lIF9HTlVfU09VUkNFCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxuZXd0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICIuLi9kZWJ1Zy5oIgogI2luY2x1ZGUgImhlbHBsaW5lLmgiCiAjaW5jbHVkZSAidWkuaCIKKyNpbmNsdWRlICJsaWJzbGFuZy5oIgogCiB2b2lkIHVpX2hlbHBsaW5lX19wb3Aodm9pZCkKIHsKLQluZXd0UG9wSGVscExpbmUoKTsKIH0KIAorY2hhciB1aV9oZWxwbGluZV9fY3VycmVudFs1MTJdOworCiB2b2lkIHVpX2hlbHBsaW5lX19wdXNoKGNvbnN0IGNoYXIgKm1zZykKIHsKLQluZXd0UHVzaEhlbHBMaW5lKG1zZyk7CisJY29uc3Qgc2l6ZV90IHN6ID0gc2l6ZW9mKHVpX2hlbHBsaW5lX19jdXJyZW50KTsKKworCVNMc21nX2dvdG9yYyhTTHR0X1NjcmVlbl9Sb3dzIC0gMSwgMCk7CisJU0xzbWdfc2V0X2NvbG9yKDApOworCVNMc21nX3dyaXRlX25zdHJpbmcoKGNoYXIgKiltc2csIFNMdHRfU2NyZWVuX0NvbHMpOworCVNMc21nX3JlZnJlc2goKTsKKwlzdHJuY3B5KHVpX2hlbHBsaW5lX19jdXJyZW50LCBtc2csIHN6KVtzeiAtIDFdID0gJ1wwJzsKIH0KIAogdm9pZCB1aV9oZWxwbGluZV9fdnB1c2goY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQpAQCAtNjMsNyArNzEsNyBAQAogCiAJaWYgKHVpX2hlbHBsaW5lX19sYXN0X21zZ1tiYWNrbG9nIC0gMV0gPT0gJ1xuJykgewogCQl1aV9oZWxwbGluZV9fcHV0cyh1aV9oZWxwbGluZV9fbGFzdF9tc2cpOwotCQluZXd0UmVmcmVzaCgpOworCQlTTHNtZ19yZWZyZXNoKCk7CiAJCWJhY2tsb2cgPSAwOwogCX0KIAlwdGhyZWFkX211dGV4X3VubG9jaygmdWlfX2xvY2spOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL2hlbHBsaW5lLmggYi90b29scy9wZXJmL3V0aWwvdWkvaGVscGxpbmUuaAppbmRleCBmZGNiYzAyLi43YmFiNmIzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvaGVscGxpbmUuaAorKysgYi90b29scy9wZXJmL3V0aWwvdWkvaGVscGxpbmUuaApAQCAtMTEsNCArMTEsNiBAQAogdm9pZCB1aV9oZWxwbGluZV9fZnB1c2goY29uc3QgY2hhciAqZm10LCAuLi4pOwogdm9pZCB1aV9oZWxwbGluZV9fcHV0cyhjb25zdCBjaGFyICptc2cpOwogCitleHRlcm4gY2hhciB1aV9oZWxwbGluZV9fY3VycmVudFtdOworCiAjZW5kaWYgLyogX1BFUkZfVUlfSEVMUExJTkVfSF8gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91aS9wcm9ncmVzcy5jIGIvdG9vbHMvcGVyZi91dGlsL3VpL3Byb2dyZXNzLmMKaW5kZXggZDdmYzM5OS4uMjk1ZTM2NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL3Byb2dyZXNzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VpL3Byb2dyZXNzLmMKQEAgLTEsNjAgKzEsMjkgQEAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxuZXd0Lmg+CiAjaW5jbHVkZSAiLi4vY2FjaGUuaCIKICNpbmNsdWRlICJwcm9ncmVzcy5oIgorI2luY2x1ZGUgImxpYnNsYW5nLmgiCisjaW5jbHVkZSAidWkuaCIKKyNpbmNsdWRlICJicm93c2VyLmgiCiAKLXN0cnVjdCB1aV9wcm9ncmVzcyB7Ci0JbmV3dENvbXBvbmVudCBmb3JtLCBzY2FsZTsKLX07Ci0KLXN0cnVjdCB1aV9wcm9ncmVzcyAqdWlfcHJvZ3Jlc3NfX25ldyhjb25zdCBjaGFyICp0aXRsZSwgdTY0IHRvdGFsKQordm9pZCB1aV9wcm9ncmVzc19fdXBkYXRlKHU2NCBjdXJyLCB1NjQgdG90YWwsIGNvbnN0IGNoYXIgKnRpdGxlKQogewotCXN0cnVjdCB1aV9wcm9ncmVzcyAqc2VsZiA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKLQotCWlmIChzZWxmICE9IE5VTEwpIHsKLQkJaW50IGNvbHM7Ci0KLQkJaWYgKHVzZV9icm93c2VyIDw9IDApCi0JCQlyZXR1cm4gc2VsZjsKLQkJbmV3dEdldFNjcmVlblNpemUoJmNvbHMsIE5VTEwpOwotCQljb2xzIC09IDQ7Ci0JCW5ld3RDZW50ZXJlZFdpbmRvdyhjb2xzLCAxLCB0aXRsZSk7Ci0JCXNlbGYtPmZvcm0gID0gbmV3dEZvcm0oTlVMTCwgTlVMTCwgMCk7Ci0JCWlmIChzZWxmLT5mb3JtID09IE5VTEwpCi0JCQlnb3RvIG91dF9mcmVlX3NlbGY7Ci0JCXNlbGYtPnNjYWxlID0gbmV3dFNjYWxlKDAsIDAsIGNvbHMsIHRvdGFsKTsKLQkJaWYgKHNlbGYtPnNjYWxlID09IE5VTEwpCi0JCQlnb3RvIG91dF9mcmVlX2Zvcm07Ci0JCW5ld3RGb3JtQWRkQ29tcG9uZW50KHNlbGYtPmZvcm0sIHNlbGYtPnNjYWxlKTsKLQkJbmV3dFJlZnJlc2goKTsKLQl9Ci0KLQlyZXR1cm4gc2VsZjsKLQotb3V0X2ZyZWVfZm9ybToKLQluZXd0Rm9ybURlc3Ryb3koc2VsZi0+Zm9ybSk7Ci1vdXRfZnJlZV9zZWxmOgotCWZyZWUoc2VsZik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgdWlfcHJvZ3Jlc3NfX3VwZGF0ZShzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnNlbGYsIHU2NCBjdXJyKQoteworCWludCBiYXIsIHk7CiAJLyoKIAkgKiBGSVhNRTogV2Ugc2hvdWxkIGhhdmUgYSBwZXIgVUkgYmFja2VuZCB3YXkgb2Ygc2hvd2luZyBwcm9ncmVzcywKIAkgKiBzdGRpbyB3aWxsIGp1c3Qgc2hvdyBhIHBlcmNlbnRhZ2UgYXMgTk4lLCBldGMuCiAJICovCiAJaWYgKHVzZV9icm93c2VyIDw9IDApCiAJCXJldHVybjsKLQluZXd0U2NhbGVTZXQoc2VsZi0+c2NhbGUsIGN1cnIpOwotCW5ld3RSZWZyZXNoKCk7Ci19CiAKLXZvaWQgdWlfcHJvZ3Jlc3NfX2RlbGV0ZShzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnNlbGYpCi17Ci0JaWYgKHVzZV9icm93c2VyID4gMCkgewotCQluZXd0Rm9ybURlc3Ryb3koc2VsZi0+Zm9ybSk7Ci0JCW5ld3RQb3BXaW5kb3coKTsKLQl9Ci0JZnJlZShzZWxmKTsKKwl1aV9fcmVmcmVzaF9kaW1lbnNpb25zKHRydWUpOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdWlfX2xvY2spOworCXkgPSBTTHR0X1NjcmVlbl9Sb3dzIC8gMiAtIDI7CisJU0xzbWdfc2V0X2NvbG9yKDApOworCVNMc21nX2RyYXdfYm94KHksIDAsIDMsIFNMdHRfU2NyZWVuX0NvbHMpOworCVNMc21nX2dvdG9yYyh5KyssIDEpOworCVNMc21nX3dyaXRlX3N0cmluZygoY2hhciAqKXRpdGxlKTsKKwlTTHNtZ19zZXRfY29sb3IoSEVfQ09MT1JTRVRfU0VMRUNURUQpOworCWJhciA9ICgoU0x0dF9TY3JlZW5fQ29scyAtIDIpICogY3VycikgLyB0b3RhbDsKKwlTTHNtZ19maWxsX3JlZ2lvbih5LCAxLCAxLCBiYXIsICcgJyk7CisJU0xzbWdfcmVmcmVzaCgpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ1aV9fbG9jayk7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdWkvcHJvZ3Jlc3MuaCBiL3Rvb2xzL3BlcmYvdXRpbC91aS9wcm9ncmVzcy5oCmluZGV4IGEzODIwYTAuLmQ5YzIwNWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91aS9wcm9ncmVzcy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9wcm9ncmVzcy5oCkBAIC0xLDExICsxLDggQEAKICNpZm5kZWYgX1BFUkZfVUlfUFJPR1JFU1NfSF8KICNkZWZpbmUgX1BFUkZfVUlfUFJPR1JFU1NfSF8gMQogCi1zdHJ1Y3QgdWlfcHJvZ3Jlc3M7CisjaW5jbHVkZSA8Li4vdHlwZXMuaD4KIAotc3RydWN0IHVpX3Byb2dyZXNzICp1aV9wcm9ncmVzc19fbmV3KGNvbnN0IGNoYXIgKnRpdGxlLCB1NjQgdG90YWwpOwotdm9pZCB1aV9wcm9ncmVzc19fZGVsZXRlKHN0cnVjdCB1aV9wcm9ncmVzcyAqc2VsZik7Ci0KLXZvaWQgdWlfcHJvZ3Jlc3NfX3VwZGF0ZShzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnNlbGYsIHU2NCBjdXJyKTsKK3ZvaWQgdWlfcHJvZ3Jlc3NfX3VwZGF0ZSh1NjQgY3VyciwgdTY0IHRvdGFsLCBjb25zdCBjaGFyICp0aXRsZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL3NldHVwLmMgYi90b29scy9wZXJmL3V0aWwvdWkvc2V0dXAuYwppbmRleCAxZTZiYTA2Li44NWE2OWZhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvc2V0dXAuYworKysgYi90b29scy9wZXJmL3V0aWwvdWkvc2V0dXAuYwpAQCAtNywxMCArNyw4NSBAQAogI2luY2x1ZGUgImJyb3dzZXIuaCIKICNpbmNsdWRlICJoZWxwbGluZS5oIgogI2luY2x1ZGUgInVpLmgiCisjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImxpYnNsYW5nLmgiCisjaW5jbHVkZSAia2V5c3ltcy5oIgogCiBwdGhyZWFkX211dGV4X3QgdWlfX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogCitzdGF0aWMgdm9sYXRpbGUgaW50IHVpX19uZWVkX3Jlc2l6ZTsKKwordm9pZCB1aV9fcmVmcmVzaF9kaW1lbnNpb25zKGJvb2wgZm9yY2UpCit7CisJaWYgKGZvcmNlIHx8IHVpX19uZWVkX3Jlc2l6ZSkgeworCQl1aV9fbmVlZF9yZXNpemUgPSAwOworCQlwdGhyZWFkX211dGV4X2xvY2soJnVpX19sb2NrKTsKKwkJU0x0dF9nZXRfc2NyZWVuX3NpemUoKTsKKwkJU0xzbWdfcmVpbml0X3NtZygpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdWlfX2xvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgdWlfX3NpZ3dpbmNoKGludCBzaWcgX191c2VkKQoreworCXVpX19uZWVkX3Jlc2l6ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHVpX19zZXR1cF9zaWd3aW5jaCh2b2lkKQoreworCXN0YXRpYyBib29sIGRvbmU7CisKKwlpZiAoZG9uZSkKKwkJcmV0dXJuOworCisJZG9uZSA9IHRydWU7CisJcHRocmVhZF9fdW5ibG9ja19zaWd3aW5jaCgpOworCXNpZ25hbChTSUdXSU5DSCwgdWlfX3NpZ3dpbmNoKTsKK30KKworaW50IHVpX19nZXRjaChpbnQgZGVsYXlfc2VjcykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0LCAqcHRpbWVvdXQgPSBkZWxheV9zZWNzID8gJnRpbWVvdXQgOiBOVUxMOworCWZkX3NldCByZWFkX3NldDsKKwlpbnQgZXJyLCBrZXk7CisKKwl1aV9fc2V0dXBfc2lnd2luY2goKTsKKworCUZEX1pFUk8oJnJlYWRfc2V0KTsKKwlGRF9TRVQoMCwgJnJlYWRfc2V0KTsKKworCWlmIChkZWxheV9zZWNzKSB7CisJCXRpbWVvdXQudHZfc2VjID0gZGVsYXlfc2VjczsKKwkJdGltZW91dC50dl91c2VjID0gMDsKKwl9CisKKyAgICAgICAgZXJyID0gc2VsZWN0KDEsICZyZWFkX3NldCwgTlVMTCwgTlVMTCwgcHRpbWVvdXQpOworCisJaWYgKGVyciA9PSAwKQorCQlyZXR1cm4gS19USU1FUjsKKworCWlmIChlcnIgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJcmV0dXJuIEtfUkVTSVpFOworCQlyZXR1cm4gS19FUlJPUjsKKwl9CisKKwlrZXkgPSBTTGFuZ19nZXRrZXkoKTsKKwlpZiAoa2V5ICE9IEtfRVNDKQorCQlyZXR1cm4ga2V5OworCisJRkRfWkVSTygmcmVhZF9zZXQpOworCUZEX1NFVCgwLCAmcmVhZF9zZXQpOworCXRpbWVvdXQudHZfc2VjID0gMDsKKwl0aW1lb3V0LnR2X3VzZWMgPSAyMDsKKyAgICAgICAgZXJyID0gc2VsZWN0KDEsICZyZWFkX3NldCwgTlVMTCwgTlVMTCwgJnRpbWVvdXQpOworCWlmIChlcnIgPT0gMCkKKwkJcmV0dXJuIEtfRVNDOworCisJU0xhbmdfdW5nZXRrZXkoa2V5KTsKKwlyZXR1cm4gU0xrcF9nZXRrZXkoKTsKK30KKwogc3RhdGljIHZvaWQgbmV3dF9zdXNwZW5kKHZvaWQgKmQgX191c2VkKQogewogCW5ld3RTdXNwZW5kKCk7CkBAIC03MSwxMCArMTQ2LDEwIEBACiB2b2lkIGV4aXRfYnJvd3Nlcihib29sIHdhaXRfZm9yX29rKQogewogCWlmICh1c2VfYnJvd3NlciA+IDApIHsKLQkJaWYgKHdhaXRfZm9yX29rKSB7Ci0JCQljaGFyIHRpdGxlW10gPSAiRmF0YWwgRXJyb3IiLCBva1tdID0gIk9rIjsKLQkJCW5ld3RXaW5NZXNzYWdlKHRpdGxlLCBvaywgdWlfaGVscGxpbmVfX2xhc3RfbXNnKTsKLQkJfQorCQlpZiAod2FpdF9mb3Jfb2spCisJCQl1aV9fcXVlc3Rpb25fd2luZG93KCJGYXRhbCBFcnJvciIsCisJCQkJCSAgICB1aV9oZWxwbGluZV9fbGFzdF9tc2csCisJCQkJCSAgICAiUHJlc3MgYW55IGtleS4uLiIsIDApOwogCQl1aV9fZXhpdCgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91aS91aS5oIGIvdG9vbHMvcGVyZi91dGlsL3VpL3VpLmgKaW5kZXggZDI2NGUwNS4uN2I2NzA0NSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL3VpLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VpL3VpLmgKQEAgLTIsNyArMiwxMCBAQAogI2RlZmluZSBfUEVSRl9VSV9IXyAxCiAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgogCiBleHRlcm4gcHRocmVhZF9tdXRleF90IHVpX19sb2NrOwogCit2b2lkIHVpX19yZWZyZXNoX2RpbWVuc2lvbnMoYm9vbCBmb3JjZSk7CisKICNlbmRpZiAvKiBfUEVSRl9VSV9IXyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL3V0aWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC91aS91dGlsLmMKaW5kZXggZmRmMWZjOC4uNDVkYWE3YyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL3V0aWwuYworKysgYi90b29scy9wZXJmL3V0aWwvdWkvdXRpbC5jCkBAIC0xLDYgKzEsNSBAQAotI2luY2x1ZGUgPG5ld3QuaD4KKyNpbmNsdWRlICIuLi91dGlsLmgiCiAjaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3R0eWRlZmF1bHRzLmg+CkBAIC04LDcyICs3LDc1IEBACiAjaW5jbHVkZSAiLi4vY2FjaGUuaCIKICNpbmNsdWRlICIuLi9kZWJ1Zy5oIgogI2luY2x1ZGUgImJyb3dzZXIuaCIKKyNpbmNsdWRlICJrZXlzeW1zLmgiCiAjaW5jbHVkZSAiaGVscGxpbmUuaCIKICNpbmNsdWRlICJ1aS5oIgogI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJsaWJzbGFuZy5oIgogCi1zdGF0aWMgdm9pZCBuZXd0X2Zvcm1fX3NldF9leGl0X2tleXMobmV3dENvbXBvbmVudCBzZWxmKQorc3RhdGljIHZvaWQgdWlfYnJvd3Nlcl9fYXJndl93cml0ZShzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3NlciwKKwkJCQkgICB2b2lkICplbnRyeSwgaW50IHJvdykKIHsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLCBORVdUX0tFWV9MRUZUKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLCBORVdUX0tFWV9FU0NBUEUpOwotCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYsICdRJyk7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZiwgJ3EnKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLCBDVFJMKCdjJykpOworCWNoYXIgKiphcmcgPSBlbnRyeTsKKwlib29sIGN1cnJlbnRfZW50cnkgPSB1aV9icm93c2VyX19pc19jdXJyZW50X2VudHJ5KGJyb3dzZXIsIHJvdyk7CisKKwl1aV9icm93c2VyX19zZXRfY29sb3IoYnJvd3NlciwgY3VycmVudF9lbnRyeSA/IEhFX0NPTE9SU0VUX1NFTEVDVEVEIDoKKwkJCQkJCSAgICAgICBIRV9DT0xPUlNFVF9OT1JNQUwpOworCXNsc21nX3dyaXRlX25zdHJpbmcoKmFyZywgYnJvd3Nlci0+d2lkdGgpOwogfQogCi1zdGF0aWMgbmV3dENvbXBvbmVudCBuZXd0X2Zvcm1fX25ldyh2b2lkKQorc3RhdGljIGludCBwb3B1cF9tZW51X19ydW4oc3RydWN0IHVpX2Jyb3dzZXIgKm1lbnUpCiB7Ci0JbmV3dENvbXBvbmVudCBzZWxmID0gbmV3dEZvcm0oTlVMTCwgTlVMTCwgMCk7Ci0JaWYgKHNlbGYpCi0JCW5ld3RfZm9ybV9fc2V0X2V4aXRfa2V5cyhzZWxmKTsKLQlyZXR1cm4gc2VsZjsKKwlpbnQga2V5OworCisJaWYgKHVpX2Jyb3dzZXJfX3Nob3cobWVudSwgIiAiLCAiRVNDOiBleGl0LCBFTlRFUnwtPjogU2VsZWN0IG9wdGlvbiIpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJd2hpbGUgKDEpIHsKKwkJa2V5ID0gdWlfYnJvd3Nlcl9fcnVuKG1lbnUsIDApOworCisJCXN3aXRjaCAoa2V5KSB7CisJCWNhc2UgS19SSUdIVDoKKwkJY2FzZSBLX0VOVEVSOgorCQkJa2V5ID0gbWVudS0+aW5kZXg7CisJCQlicmVhazsKKwkJY2FzZSBLX0xFRlQ6CisJCWNhc2UgS19FU0M6CisJCWNhc2UgJ3EnOgorCQljYXNlIENUUkwoJ2MnKToKKwkJCWtleSA9IC0xOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCisJCWJyZWFrOworCX0KKworCXVpX2Jyb3dzZXJfX2hpZGUobWVudSk7CisJcmV0dXJuIGtleTsKIH0KIAogaW50IHVpX19wb3B1cF9tZW51KGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQogewotCXN0cnVjdCBuZXd0RXhpdFN0cnVjdCBlczsKLQlpbnQgaSwgcmMgPSAtMSwgbWF4X2xlbiA9IDU7Ci0JbmV3dENvbXBvbmVudCBsaXN0Ym94LCBmb3JtID0gbmV3dF9mb3JtX19uZXcoKTsKKwlzdHJ1Y3QgdWlfYnJvd3NlciBtZW51ID0geworCQkuZW50cmllcyAgICA9ICh2b2lkICopYXJndiwKKwkJLnJlZnJlc2ggICAgPSB1aV9icm93c2VyX19hcmd2X3JlZnJlc2gsCisJCS5zZWVrCSAgICA9IHVpX2Jyb3dzZXJfX2FyZ3Zfc2VlaywKKwkJLndyaXRlCSAgICA9IHVpX2Jyb3dzZXJfX2FyZ3Zfd3JpdGUsCisJCS5ucl9lbnRyaWVzID0gYXJnYywKKwl9OwogCi0JaWYgKGZvcm0gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JbGlzdGJveCA9IG5ld3RMaXN0Ym94KDAsIDAsIGFyZ2MsIE5FV1RfRkxBR19SRVRVUk5FWElUKTsKLQlpZiAobGlzdGJveCA9PSBOVUxMKQotCQlnb3RvIG91dF9kZXN0cm95X2Zvcm07Ci0KLQluZXd0Rm9ybUFkZENvbXBvbmVudChmb3JtLCBsaXN0Ym94KTsKLQotCWZvciAoaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKLQkJaW50IGxlbiA9IHN0cmxlbihhcmd2W2ldKTsKLQkJaWYgKGxlbiA+IG1heF9sZW4pCi0JCQltYXhfbGVuID0gbGVuOwotCQlpZiAobmV3dExpc3Rib3hBZGRFbnRyeShsaXN0Ym94LCBhcmd2W2ldLCAodm9pZCAqKShsb25nKWkpKQotCQkJZ290byBvdXRfZGVzdHJveV9mb3JtOwotCX0KLQotCW5ld3RDZW50ZXJlZFdpbmRvdyhtYXhfbGVuLCBhcmdjLCBOVUxMKTsKLQluZXd0Rm9ybVJ1bihmb3JtLCAmZXMpOwotCXJjID0gbmV3dExpc3Rib3hHZXRDdXJyZW50KGxpc3Rib3gpIC0gTlVMTDsKLQlpZiAoZXMucmVhc29uID09IE5FV1RfRVhJVF9IT1RLRVkpCi0JCXJjID0gLTE7Ci0JbmV3dFBvcFdpbmRvdygpOwotb3V0X2Rlc3Ryb3lfZm9ybToKLQluZXd0Rm9ybURlc3Ryb3koZm9ybSk7Ci0JcmV0dXJuIHJjOworCXJldHVybiBwb3B1cF9tZW51X19ydW4oJm1lbnUpOwogfQogCi1pbnQgdWlfX2hlbHBfd2luZG93KGNvbnN0IGNoYXIgKnRleHQpCitpbnQgdWlfX3F1ZXN0aW9uX3dpbmRvdyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwKKwkJCWNvbnN0IGNoYXIgKmV4aXRfbXNnLCBpbnQgZGVsYXlfc2VjcykKIHsKLQlzdHJ1Y3QgbmV3dEV4aXRTdHJ1Y3QgZXM7Ci0JbmV3dENvbXBvbmVudCB0YiwgZm9ybSA9IG5ld3RfZm9ybV9fbmV3KCk7Ci0JaW50IHJjID0gLTE7CisJaW50IHgsIHk7CiAJaW50IG1heF9sZW4gPSAwLCBucl9saW5lcyA9IDA7CiAJY29uc3QgY2hhciAqdDsKIAotCWlmIChmb3JtID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQogCXQgPSB0ZXh0OwogCXdoaWxlICgxKSB7CiAJCWNvbnN0IGNoYXIgKnNlcCA9IHN0cmNocih0LCAnXG4nKTsKQEAgLTkwLDQxICs5Miw3NyBAQAogCQl0ID0gc2VwICsgMTsKIAl9CiAKLQl0YiA9IG5ld3RUZXh0Ym94KDAsIDAsIG1heF9sZW4sIG5yX2xpbmVzLCAwKTsKLQlpZiAodGIgPT0gTlVMTCkKLQkJZ290byBvdXRfZGVzdHJveV9mb3JtOworCW1heF9sZW4gKz0gMjsKKwlucl9saW5lcyArPSA0OworCXkgPSBTTHR0X1NjcmVlbl9Sb3dzIC8gMiAtIG5yX2xpbmVzIC8gMiwKKwl4ID0gU0x0dF9TY3JlZW5fQ29scyAvIDIgLSBtYXhfbGVuIC8gMjsKIAotCW5ld3RUZXh0Ym94U2V0VGV4dCh0YiwgdGV4dCk7Ci0JbmV3dEZvcm1BZGRDb21wb25lbnQoZm9ybSwgdGIpOwotCW5ld3RDZW50ZXJlZFdpbmRvdyhtYXhfbGVuLCBucl9saW5lcywgTlVMTCk7Ci0JbmV3dEZvcm1SdW4oZm9ybSwgJmVzKTsKLQluZXd0UG9wV2luZG93KCk7Ci0JcmMgPSAwOwotb3V0X2Rlc3Ryb3lfZm9ybToKLQluZXd0Rm9ybURlc3Ryb3koZm9ybSk7Ci0JcmV0dXJuIHJjOworCVNMc21nX3NldF9jb2xvcigwKTsKKwlTTHNtZ19kcmF3X2JveCh5LCB4KyssIG5yX2xpbmVzLCBtYXhfbGVuKTsKKwlpZiAodGl0bGUpIHsKKwkJU0xzbWdfZ290b3JjKHksIHggKyAxKTsKKwkJU0xzbWdfd3JpdGVfc3RyaW5nKChjaGFyICopdGl0bGUpOworCX0KKwlTTHNtZ19nb3RvcmMoKyt5LCB4KTsKKwlucl9saW5lcyAtPSAyOworCW1heF9sZW4gLT0gMjsKKwlTTHNtZ193cml0ZV93cmFwcGVkX3N0cmluZygodW5zaWduZWQgY2hhciAqKXRleHQsIHksIHgsCisJCQkJICAgbnJfbGluZXMsIG1heF9sZW4sIDEpOworCVNMc21nX2dvdG9yYyh5ICsgbnJfbGluZXMgLSAyLCB4KTsKKwlTTHNtZ193cml0ZV9uc3RyaW5nKChjaGFyICopIiAiLCBtYXhfbGVuKTsKKwlTTHNtZ19nb3RvcmMoeSArIG5yX2xpbmVzIC0gMSwgeCk7CisJU0xzbWdfd3JpdGVfbnN0cmluZygoY2hhciAqKWV4aXRfbXNnLCBtYXhfbGVuKTsKKwlTTHNtZ19yZWZyZXNoKCk7CisJcmV0dXJuIHVpX19nZXRjaChkZWxheV9zZWNzKTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgeWVzW10gPSAiWWVzIiwgbm9bXSA9ICJObyIsCi0JCSAgd2FybmluZ19zdHJbXSA9ICJXYXJuaW5nISIsIG9rW10gPSAiT2siOwotCi1ib29sIHVpX19kaWFsb2dfeWVzbm8oY29uc3QgY2hhciAqbXNnKQoraW50IHVpX19oZWxwX3dpbmRvdyhjb25zdCBjaGFyICp0ZXh0KQogewotCS8qIG5ld3RXaW5DaG9pY2Ugc2hvdWxkIHJlYWxseSBiZSBhY2NlcHRpbmcgY29uc3QgY2hhciBwb2ludGVycy4uLiAqLwotCXJldHVybiBuZXd0V2luQ2hvaWNlKE5VTEwsIChjaGFyICopeWVzLCAoY2hhciAqKW5vLCAoY2hhciAqKW1zZykgPT0gMTsKKwlyZXR1cm4gdWlfX3F1ZXN0aW9uX3dpbmRvdygiSGVscCIsIHRleHQsICJQcmVzcyBhbnkga2V5Li4uIiwgMCk7CiB9CiAKLXZvaWQgdWlfX3dhcm5pbmcoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCitpbnQgdWlfX2RpYWxvZ195ZXNubyhjb25zdCBjaGFyICptc2cpCiB7CisJcmV0dXJuIHVpX19xdWVzdGlvbl93aW5kb3coTlVMTCwgbXNnLCAiRW50ZXI6IFllcywgRVNDOiBObyIsIDApOworfQorCitpbnQgX191aV9fd2FybmluZyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisJY2hhciAqczsKKworCWlmICh1c2VfYnJvd3NlciA+IDAgJiYgdmFzcHJpbnRmKCZzLCBmb3JtYXQsIGFyZ3MpID4gMCkgeworCQlpbnQga2V5OworCisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdWlfX2xvY2spOworCQlrZXkgPSB1aV9fcXVlc3Rpb25fd2luZG93KHRpdGxlLCBzLCAiUHJlc3MgYW55IGtleS4uLiIsIDApOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdWlfX2xvY2spOworCQlmcmVlKHMpOworCQlyZXR1cm4ga2V5OworCX0KKworCWZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCB0aXRsZSk7CisJdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworCXJldHVybiBLX0VTQzsKK30KKworaW50IHVpX193YXJuaW5nKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCWludCBrZXk7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLQlpZiAodXNlX2Jyb3dzZXIgPiAwKSB7Ci0JCXB0aHJlYWRfbXV0ZXhfbG9jaygmdWlfX2xvY2spOwotCQluZXd0V2luTWVzc2FnZXYoKGNoYXIgKil3YXJuaW5nX3N0ciwgKGNoYXIgKilvaywKLQkJCQkoY2hhciAqKWZvcm1hdCwgYXJncyk7Ci0JCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ1aV9fbG9jayk7Ci0JfSBlbHNlCi0JCXZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKwlrZXkgPSBfX3VpX193YXJuaW5nKCJXYXJuaW5nIiwgZm9ybWF0LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7CisJcmV0dXJuIGtleTsKK30KKworaW50IHVpX19lcnJvcihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwlpbnQga2V5OworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJa2V5ID0gX191aV9fd2FybmluZygiRXJyb3IiLCBmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlyZXR1cm4ga2V5OwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL3V0aWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC91aS91dGlsLmgKaW5kZXggYWZjYmMxZC4uMmQxNzM4YiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL3V0aWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvdWkvdXRpbC5oCkBAIC0xLDEwICsxLDE0IEBACiAjaWZuZGVmIF9QRVJGX1VJX1VUSUxfSF8KICNkZWZpbmUgX1BFUkZfVUlfVVRJTF9IXyAxCiAKLSNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CiAKK2ludCB1aV9fZ2V0Y2goaW50IGRlbGF5X3NlY3MpOwogaW50IHVpX19wb3B1cF9tZW51KGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKIGludCB1aV9faGVscF93aW5kb3coY29uc3QgY2hhciAqdGV4dCk7Ci1ib29sIHVpX19kaWFsb2dfeWVzbm8oY29uc3QgY2hhciAqbXNnKTsKK2ludCB1aV9fZGlhbG9nX3llc25vKGNvbnN0IGNoYXIgKm1zZyk7CitpbnQgdWlfX3F1ZXN0aW9uX3dpbmRvdyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwKKwkJCWNvbnN0IGNoYXIgKmV4aXRfbXNnLCBpbnQgZGVsYXlfc2Vjcyk7CitpbnQgX191aV9fd2FybmluZyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOwogCiAjZW5kaWYgLyogX1BFUkZfVUlfVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC90dXJib3N0YXQuYyBiL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvdHVyYm9zdGF0LmMKaW5kZXggOGIyZDM3Yi4uM2M2Zjc4MCAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC90dXJib3N0YXQuYworKysgYi90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L3R1cmJvc3RhdC5jCkBAIC0xNjIsMTkgKzE2MiwyMSBAQAogCiB2b2lkIGR1bXBfY250KHN0cnVjdCBjb3VudGVycyAqY250KQogewotCWZwcmludGYoc3RkZXJyLCAicGFja2FnZTogJWQgIiwgY250LT5wa2cpOwotCWZwcmludGYoc3RkZXJyLCAiY29yZTo6ICVkICIsIGNudC0+Y29yZSk7Ci0JZnByaW50ZihzdGRlcnIsICJDUFU6ICVkICIsIGNudC0+Y3B1KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlRTQzogJTAxNmxsWFxuIiwgY250LT50c2MpOwotCWZwcmludGYoc3RkZXJyLCAiYzM6ICUwMTZsbFhcbiIsIGNudC0+YzMpOwotCWZwcmludGYoc3RkZXJyLCAiYzY6ICUwMTZsbFhcbiIsIGNudC0+YzYpOwotCWZwcmludGYoc3RkZXJyLCAiYzc6ICUwMTZsbFhcbiIsIGNudC0+YzcpOwotCWZwcmludGYoc3RkZXJyLCAiYXBlcmY6ICUwMTZsbFhcbiIsIGNudC0+YXBlcmYpOwotCWZwcmludGYoc3RkZXJyLCAicGMyOiAlMDE2bGxYXG4iLCBjbnQtPnBjMik7Ci0JZnByaW50ZihzdGRlcnIsICJwYzM6ICUwMTZsbFhcbiIsIGNudC0+cGMzKTsKLQlmcHJpbnRmKHN0ZGVyciwgInBjNjogJTAxNmxsWFxuIiwgY250LT5wYzYpOwotCWZwcmludGYoc3RkZXJyLCAicGM3OiAlMDE2bGxYXG4iLCBjbnQtPnBjNyk7Ci0JZnByaW50ZihzdGRlcnIsICJtc3IweCV4OiAlMDE2bGxYXG4iLCBleHRyYV9tc3Jfb2Zmc2V0LCBjbnQtPmV4dHJhX21zcik7CisJaWYgKCFjbnQpCisJCXJldHVybjsKKwlpZiAoY250LT5wa2cpIGZwcmludGYoc3RkZXJyLCAicGFja2FnZTogJWQgIiwgY250LT5wa2cpOworCWlmIChjbnQtPmNvcmUpIGZwcmludGYoc3RkZXJyLCAiY29yZTo6ICVkICIsIGNudC0+Y29yZSk7CisJaWYgKGNudC0+Y3B1KSBmcHJpbnRmKHN0ZGVyciwgIkNQVTogJWQgIiwgY250LT5jcHUpOworCWlmIChjbnQtPnRzYykgZnByaW50ZihzdGRlcnIsICJUU0M6ICUwMTZsbFhcbiIsIGNudC0+dHNjKTsKKwlpZiAoY250LT5jMykgZnByaW50ZihzdGRlcnIsICJjMzogJTAxNmxsWFxuIiwgY250LT5jMyk7CisJaWYgKGNudC0+YzYpIGZwcmludGYoc3RkZXJyLCAiYzY6ICUwMTZsbFhcbiIsIGNudC0+YzYpOworCWlmIChjbnQtPmM3KSBmcHJpbnRmKHN0ZGVyciwgImM3OiAlMDE2bGxYXG4iLCBjbnQtPmM3KTsKKwlpZiAoY250LT5hcGVyZikgZnByaW50ZihzdGRlcnIsICJhcGVyZjogJTAxNmxsWFxuIiwgY250LT5hcGVyZik7CisJaWYgKGNudC0+cGMyKSBmcHJpbnRmKHN0ZGVyciwgInBjMjogJTAxNmxsWFxuIiwgY250LT5wYzIpOworCWlmIChjbnQtPnBjMykgZnByaW50ZihzdGRlcnIsICJwYzM6ICUwMTZsbFhcbiIsIGNudC0+cGMzKTsKKwlpZiAoY250LT5wYzYpIGZwcmludGYoc3RkZXJyLCAicGM2OiAlMDE2bGxYXG4iLCBjbnQtPnBjNik7CisJaWYgKGNudC0+cGM3KSBmcHJpbnRmKHN0ZGVyciwgInBjNzogJTAxNmxsWFxuIiwgY250LT5wYzcpOworCWlmIChjbnQtPmV4dHJhX21zcikgZnByaW50ZihzdGRlcnIsICJtc3IweCV4OiAlMDE2bGxYXG4iLCBleHRyYV9tc3Jfb2Zmc2V0LCBjbnQtPmV4dHJhX21zcik7CiB9CiAKIHZvaWQgZHVtcF9saXN0KHN0cnVjdCBjb3VudGVycyAqY250KQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbCBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qva3Rlc3QucGwKaW5kZXggOGQwMmNjYi4uMzBlMmJlZiAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbAorKysgYi90b29scy90ZXN0aW5nL2t0ZXN0L2t0ZXN0LnBsCkBAIC00Miw2ICs0Miw3IEBACiAkZGVmYXVsdHsiQklTRUNUX1NLSVAifQkJPSAxOwogJGRlZmF1bHR7IlNVQ0NFU1NfTElORSJ9CT0gImxvZ2luOiI7CiAkZGVmYXVsdHsiREVURUNUX1RSSVBMRV9GQVVMVCJ9ID0gMTsKKyRkZWZhdWx0eyJOT19JTlNUQUxMIn0JCT0gMDsKICRkZWZhdWx0eyJCT09URURfVElNRU9VVCJ9CT0gMTsKICRkZWZhdWx0eyJESUVfT05fRkFJTFVSRSJ9CT0gMTsKICRkZWZhdWx0eyJTU0hfRVhFQyJ9CQk9ICJzc2ggXCRTU0hfVVNFUlxAXCRNQUNISU5FIFwkU1NIX0NPTU1BTkQiOwpAQCAtODQsNiArODUsNyBAQAogbXkgJHRhcmdldDsKIG15ICRtYWtlOwogbXkgJHBvc3RfaW5zdGFsbDsKK215ICRub19pbnN0YWxsOwogbXkgJG5vY2xlYW47CiBteSAkbWluY29uZmlnOwogbXkgJHN0YXJ0X21pbmNvbmZpZzsKQEAgLTExNSw2ICsxMTcsNyBAQAogbXkgJGJvb3RlZF90aW1lb3V0OwogbXkgJGRldGVjdF90cmlwbGVmYXVsdDsKIG15ICRjb25zb2xlOworbXkgJHJlYm9vdF9zdWNjZXNzX2xpbmU7CiBteSAkc3VjY2Vzc19saW5lOwogbXkgJHN0b3BfYWZ0ZXJfc3VjY2VzczsKIG15ICRzdG9wX2FmdGVyX2ZhaWx1cmU7CkBAIC0xMzAsNiArMTMzLDEyIEBACiBteSAldmFyaWFibGU7CiBteSAlZm9yY2VfY29uZmlnOwogCisjIGRvIG5vdCBmb3JjZSByZWJvb3RzIG9uIGNvbmZpZyBwcm9ibGVtcworbXkgJG5vX3JlYm9vdCA9IDE7CisKKyMgZGVmYXVsdCB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgdXNlZAorY2hvbXAgKCR2YXJpYWJsZXsiUFdEIn0gPSBgcHdkYCk7CisKICRjb25maWdfaGVscHsiTUFDSElORSJ9ID0gPDwgIkVPRiIKICBUaGUgbWFjaGluZSBob3N0bmFtZSB0aGF0IHlvdSB3aWxsIHRlc3QuCiBFT0YKQEAgLTI0MSw2ICsyNTAsNyBAQAogCiBzdWIgZ2V0X2t0ZXN0X2NvbmZpZyB7CiAgICAgbXkgKCRjb25maWcpID0gQF87CisgICAgbXkgJGFuczsKIAogICAgIHJldHVybiBpZiAoZGVmaW5lZCgkb3B0eyRjb25maWd9KSk7CiAKQEAgLTI1NCwxNiArMjY0LDE3IEBACiAJaWYgKGRlZmluZWQoJGRlZmF1bHR7JGNvbmZpZ30pKSB7CiAJICAgIHByaW50ICJcWyRkZWZhdWx0eyRjb25maWd9XF0gIjsKIAl9Ci0JJGVudGVyZWRfY29uZmlnc3skY29uZmlnfSA9IDxTVERJTj47Ci0JJGVudGVyZWRfY29uZmlnc3skY29uZmlnfSA9fiBzL15ccyooLipcUylccyokLyQxLzsKLQlpZiAoJGVudGVyZWRfY29uZmlnc3skY29uZmlnfSA9fiAvXlxzKiQvKSB7CisJJGFucyA9IDxTVERJTj47CisJJGFucyA9fiBzL15ccyooLipcUylccyokLyQxLzsKKwlpZiAoJGFucyA9fiAvXlxzKiQvKSB7CiAJICAgIGlmICgkZGVmYXVsdHskY29uZmlnfSkgewotCQkkZW50ZXJlZF9jb25maWdzeyRjb25maWd9ID0gJGRlZmF1bHR7JGNvbmZpZ307CisJCSRhbnMgPSAkZGVmYXVsdHskY29uZmlnfTsKIAkgICAgfSBlbHNlIHsKIAkJcHJpbnQgIllvdXIgYW5zd2VyIGNhbiBub3QgYmUgYmxhbmtcbiI7CiAJCW5leHQ7CiAJICAgIH0KIAl9CisJJGVudGVyZWRfY29uZmlnc3skY29uZmlnfSA9IHByb2Nlc3NfdmFyaWFibGVzKCRhbnMpOwogCWxhc3Q7CiAgICAgfQogfQpAQCAtMjk4LDcgKzMwOSw3IEBACiB9CiAKIHN1YiBwcm9jZXNzX3ZhcmlhYmxlcyB7Ci0gICAgbXkgKCR2YWx1ZSkgPSBAXzsKKyAgICBteSAoJHZhbHVlLCAkcmVtb3ZlX3VuZGVmKSA9IEBfOwogICAgIG15ICRyZXR2YWwgPSAiIjsKIAogICAgICMgV2Ugd2FudCB0byBjaGVjayBmb3IgJ1wnLCBhbmQgaXQgaXMganVzdCBlYXNpZXIKQEAgLTMxNiw2ICszMjcsMTAgQEAKIAkkcmV0dmFsID0gIiRyZXR2YWwkYmVnaW4iOwogCWlmIChkZWZpbmVkKCR2YXJpYWJsZXskdmFyfSkpIHsKIAkgICAgJHJldHZhbCA9ICIkcmV0dmFsJHZhcmlhYmxleyR2YXJ9IjsKKwl9IGVsc2lmIChkZWZpbmVkKCRyZW1vdmVfdW5kZWYpICYmICRyZW1vdmVfdW5kZWYpIHsKKwkgICAgIyBmb3IgaWYgc3RhdGVtZW50cywgYW55IHZhcmlhYmxlIHRoYXQgaXMgbm90IGRlZmluZWQsCisJICAgICMgd2Ugc2ltcGxlIGNvbnZlcnQgdG8gMAorCSAgICAkcmV0dmFsID0gIiR7cmV0dmFsfTAiOwogCX0gZWxzZSB7CiAJICAgICMgcHV0IGJhY2sgdGhlIG9yaWdpbiBwaWVjZS4KIAkgICAgJHJldHZhbCA9ICIkcmV0dmFsXCRceyR2YXJcfSI7CkBAIC0zMzEsMTAgKzM0NiwxNyBAQAogfQogCiBzdWIgc2V0X3ZhbHVlIHsKLSAgICBteSAoJGx2YWx1ZSwgJHJ2YWx1ZSkgPSBAXzsKKyAgICBteSAoJGx2YWx1ZSwgJHJ2YWx1ZSwgJG92ZXJyaWRlLCAkb3ZlcnJpZGVzLCAkbmFtZSkgPSBAXzsKIAogICAgIGlmIChkZWZpbmVkKCRvcHR7JGx2YWx1ZX0pKSB7Ci0JZGllICJFcnJvcjogT3B0aW9uICRsdmFsdWUgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSFcbiI7CisJaWYgKCEkb3ZlcnJpZGUgfHwgZGVmaW5lZCgkeyRvdmVycmlkZXN9eyRsdmFsdWV9KSkgeworCSAgICBteSAkZXh0cmEgPSAiIjsKKwkgICAgaWYgKCRvdmVycmlkZSkgeworCQkkZXh0cmEgPSAiSW4gdGhlIHNhbWUgb3ZlcnJpZGUgc2VjdGlvbiFcbiI7CisJICAgIH0KKwkgICAgZGllICIkbmFtZTogJC46IE9wdGlvbiAkbHZhbHVlIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UhXG4kZXh0cmEiOworCX0KKwkkeyRvdmVycmlkZXN9eyRsdmFsdWV9ID0gJHJ2YWx1ZTsKICAgICB9CiAgICAgaWYgKCRydmFsdWUgPX4gL15ccyokLykgewogCWRlbGV0ZSAkb3B0eyRsdmFsdWV9OwpAQCAtMzU1LDg2ICszNzcsMjc0IEBACiAgICAgfQogfQogCi1zdWIgcmVhZF9jb25maWcgewotICAgIG15ICgkY29uZmlnKSA9IEBfOworc3ViIHByb2Nlc3NfY29tcGFyZSB7CisgICAgbXkgKCRsdmFsLCAkY21wLCAkcnZhbCkgPSBAXzsKIAotICAgIG9wZW4oSU4sICRjb25maWcpIHx8IGRpZSAiY2FuJ3QgcmVhZCBmaWxlICRjb25maWciOworICAgICMgcmVtb3ZlIHdoaXRlc3BhY2UKKworICAgICRsdmFsID1+IHMvXlxzKi8vOworICAgICRsdmFsID1+IHMvXHMqJC8vOworCisgICAgJHJ2YWwgPX4gcy9eXHMqLy87CisgICAgJHJ2YWwgPX4gcy9ccyokLy87CisKKyAgICBpZiAoJGNtcCBlcSAiPT0iKSB7CisJcmV0dXJuICRsdmFsIGVxICRydmFsOworICAgIH0gZWxzaWYgKCRjbXAgZXEgIiE9IikgeworCXJldHVybiAkbHZhbCBuZSAkcnZhbDsKKyAgICB9CisKKyAgICBteSAkc3RhdGVtZW50ID0gIiRsdmFsICRjbXAgJHJ2YWwiOworICAgIG15ICRyZXQgPSBldmFsICRzdGF0ZW1lbnQ7CisKKyAgICAjICRAIHN0b3JlcyBlcnJvciBvZiBldmFsCisgICAgaWYgKCRAKSB7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAkcmV0OworfQorCitzdWIgdmFsdWVfZGVmaW5lZCB7CisgICAgbXkgKCR2YWwpID0gQF87CisKKyAgICByZXR1cm4gZGVmaW5lZCgkdmFyaWFibGV7JDJ9KSB8fAorCWRlZmluZWQoJG9wdHskMn0pOworfQorCitteSAkZCA9IDA7CitzdWIgcHJvY2Vzc19leHByZXNzaW9uIHsKKyAgICBteSAoJG5hbWUsICR2YWwpID0gQF87CisKKyAgICBteSAkYyA9ICRkKys7CisKKyAgICB3aGlsZSAoJHZhbCA9fiBzL1woKFteXChdKj8pXCkvXCZcJlwmXCZWQUxcJlwmXCZcJi8pIHsKKwlteSAkZXhwcmVzcyA9ICQxOworCisJaWYgKHByb2Nlc3NfZXhwcmVzc2lvbigkbmFtZSwgJGV4cHJlc3MpKSB7CisJICAgICR2YWwgPX4gcy9cJlwmXCZcJlZBTFwmXCZcJlwmLyAxIC87CisJfSBlbHNlIHsKKwkgICAgJHZhbCA9fiBzL1wmXCZcJlwmVkFMXCZcJlwmXCYvIDAgLzsKKwl9CisgICAgfQorCisgICAgJGQtLTsKKyAgICBteSAkT1IgPSAiXFx8XFx8IjsKKyAgICBteSAkQU5EID0gIlxcJlxcJiI7CisKKyAgICB3aGlsZSAoJHZhbCA9fiBzL14oLio/KSgkT1J8JEFORCkvLykgeworCW15ICRleHByZXNzID0gJDE7CisJbXkgJG9wID0gJDI7CisKKwlpZiAocHJvY2Vzc19leHByZXNzaW9uKCRuYW1lLCAkZXhwcmVzcykpIHsKKwkgICAgaWYgKCRvcCBlcSAifHwiKSB7CisJCXJldHVybiAxOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYgKCRvcCBlcSAiJiYiKSB7CisJCXJldHVybiAwOworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmICgkdmFsID1+IC8oLiopKD09fFwhPXw+PXw8PXw+fDwpKC4qKS8pIHsKKwlteSAkcmV0ID0gcHJvY2Vzc19jb21wYXJlKCQxLCAkMiwgJDMpOworCWlmICgkcmV0IDwgMCkgeworCSAgICBkaWUgIiRuYW1lOiAkLjogVW5hYmxlIHRvIHByb2Nlc3MgY29tcGFyaXNvblxuIjsKKwl9CisJcmV0dXJuICRyZXQ7CisgICAgfQorCisgICAgaWYgKCR2YWwgPX4gL15ccyooTk9UXHMqKT9ERUZJTkVEXHMrKFxTKylccyokLykgeworCWlmIChkZWZpbmVkICQxKSB7CisJICAgIHJldHVybiAhdmFsdWVfZGVmaW5lZCgkMik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIHZhbHVlX2RlZmluZWQoJDIpOworCX0KKyAgICB9CisKKyAgICBpZiAoJHZhbCA9fiAvXlxzKjBccyokLykgeworCXJldHVybiAwOworICAgIH0gZWxzaWYgKCR2YWwgPX4gL15ccypcZCtccyokLykgeworCXJldHVybiAxOworICAgIH0KKworICAgIGRpZSAoIiRuYW1lOiAkLjogVW5kZWZpbmVkIGNvbnRlbnQgJHZhbCBpbiBpZiBzdGF0ZW1lbnRcbiIpOworfQorCitzdWIgcHJvY2Vzc19pZiB7CisgICAgbXkgKCRuYW1lLCAkdmFsdWUpID0gQF87CisKKyAgICAjIENvbnZlcnQgdmFyaWFibGVzIGFuZCByZXBsYWNlIHVuZGVmaW5lZCBvbmVzIHdpdGggMAorICAgIG15ICR2YWwgPSBwcm9jZXNzX3ZhcmlhYmxlcygkdmFsdWUsIDEpOworICAgIG15ICRyZXQgPSBwcm9jZXNzX2V4cHJlc3Npb24gJG5hbWUsICR2YWw7CisKKyAgICByZXR1cm4gJHJldDsKK30KKworc3ViIF9fcmVhZF9jb25maWcgeworICAgIG15ICgkY29uZmlnLCAkY3VycmVudF90ZXN0X251bSkgPSBAXzsKKworICAgIG15ICRpbjsKKyAgICBvcGVuKCRpbiwgJGNvbmZpZykgfHwgZGllICJjYW4ndCByZWFkIGZpbGUgJGNvbmZpZyI7CiAKICAgICBteSAkbmFtZSA9ICRjb25maWc7CiAgICAgJG5hbWUgPX4gcywuKi8oLiopLCQxLDsKIAotICAgIG15ICR0ZXN0X251bSA9IDA7CisgICAgbXkgJHRlc3RfbnVtID0gJCRjdXJyZW50X3Rlc3RfbnVtOwogICAgIG15ICRkZWZhdWx0ID0gMTsKICAgICBteSAkcmVwZWF0ID0gMTsKICAgICBteSAkbnVtX3Rlc3RzX3NldCA9IDA7CiAgICAgbXkgJHNraXAgPSAwOwogICAgIG15ICRyZXN0OworICAgIG15ICRsaW5lOwogICAgIG15ICR0ZXN0X2Nhc2UgPSAwOworICAgIG15ICRpZiA9IDA7CisgICAgbXkgJGlmX3NldCA9IDA7CisgICAgbXkgJG92ZXJyaWRlID0gMDsKIAotICAgIHdoaWxlICg8SU4+KSB7CisgICAgbXkgJW92ZXJyaWRlczsKKworICAgIHdoaWxlICg8JGluPikgewogCiAJIyBpZ25vcmUgYmxhbmsgbGluZXMgYW5kIGNvbW1lbnRzCiAJbmV4dCBpZiAoL15ccyokLyB8fCAvXHMqXCMvKTsKIAotCWlmICgvXlxzKlRFU1RfU1RBUlQoLiopLykgeworCWlmICgvXlxzKihURVNUX1NUQVJUfERFRkFVTFRTKVxiKC4qKS8pIHsKIAotCSAgICAkcmVzdCA9ICQxOworCSAgICBteSAkdHlwZSA9ICQxOworCSAgICAkcmVzdCA9ICQyOworCSAgICAkbGluZSA9ICQyOwogCi0JICAgIGlmICgkbnVtX3Rlc3RzX3NldCkgewotCQlkaWUgIiRuYW1lOiAkLjogQ2FuIG5vdCBzcGVjaWZ5IGJvdGggTlVNX1RFU1RTIGFuZCBURVNUX1NUQVJUXG4iOworCSAgICBteSAkb2xkX3Rlc3RfbnVtOworCSAgICBteSAkb2xkX3JlcGVhdDsKKwkgICAgJG92ZXJyaWRlID0gMDsKKworCSAgICBpZiAoJHR5cGUgZXEgIlRFU1RfU1RBUlQiKSB7CisKKwkJaWYgKCRudW1fdGVzdHNfc2V0KSB7CisJCSAgICBkaWUgIiRuYW1lOiAkLjogQ2FuIG5vdCBzcGVjaWZ5IGJvdGggTlVNX1RFU1RTIGFuZCBURVNUX1NUQVJUXG4iOworCQl9CisKKwkJJG9sZF90ZXN0X251bSA9ICR0ZXN0X251bTsKKwkJJG9sZF9yZXBlYXQgPSAkcmVwZWF0OworCisJCSR0ZXN0X251bSArPSAkcmVwZWF0OworCQkkZGVmYXVsdCA9IDA7CisJCSRyZXBlYXQgPSAxOworCSAgICB9IGVsc2UgeworCQkkZGVmYXVsdCA9IDE7CiAJICAgIH0KIAotCSAgICBteSAkb2xkX3Rlc3RfbnVtID0gJHRlc3RfbnVtOwotCSAgICBteSAkb2xkX3JlcGVhdCA9ICRyZXBlYXQ7Ci0KLQkgICAgJHRlc3RfbnVtICs9ICRyZXBlYXQ7Ci0JICAgICRkZWZhdWx0ID0gMDsKLQkgICAgJHJlcGVhdCA9IDE7Ci0KLQkgICAgaWYgKCRyZXN0ID1+IC9ccytTS0lQKC4qKS8pIHsKLQkJJHJlc3QgPSAkMTsKKwkgICAgIyBJZiBTS0lQIGlzIGFueXdoZXJlIGluIHRoZSBsaW5lLCB0aGUgY29tbWFuZCB3aWxsIGJlIHNraXBwZWQKKwkgICAgaWYgKCRyZXN0ID1+IHMvXHMrU0tJUFxiLy8pIHsKIAkJJHNraXAgPSAxOwogCSAgICB9IGVsc2UgewogCQkkdGVzdF9jYXNlID0gMTsKIAkJJHNraXAgPSAwOwogCSAgICB9CiAKLQkgICAgaWYgKCRyZXN0ID1+IC9ccytJVEVSQVRFXHMrKFxkKykoLiopJC8pIHsKLQkJJHJlcGVhdCA9ICQxOwotCQkkcmVzdCA9ICQyOwotCQkkcmVwZWF0X3Rlc3RzeyIkdGVzdF9udW0ifSA9ICRyZXBlYXQ7CisJICAgIGlmICgkcmVzdCA9fiBzL1xzRUxTRVxiLy8pIHsKKwkJaWYgKCEkaWYpIHsKKwkJICAgIGRpZSAiJG5hbWU6ICQuOiBFTFNFIGZvdW5kIHdpdGggb3V0IG1hdGNoaW5nIElGIHNlY3Rpb25cbiRfIjsKKwkJfQorCQkkaWYgPSAwOworCisJCWlmICgkaWZfc2V0KSB7CisJCSAgICAkc2tpcCA9IDE7CisJCX0gZWxzZSB7CisJCSAgICAkc2tpcCA9IDA7CisJCX0KIAkgICAgfQogCi0JICAgIGlmICgkcmVzdCA9fiAvXHMrU0tJUCguKikvKSB7Ci0JCSRyZXN0ID0gJDE7Ci0JCSRza2lwID0gMTsKKwkgICAgaWYgKCRyZXN0ID1+IHMvXHNJRlxzKyguKikvLykgeworCQlpZiAocHJvY2Vzc19pZigkbmFtZSwgJDEpKSB7CisJCSAgICAkaWZfc2V0ID0gMTsKKwkJfSBlbHNlIHsKKwkJICAgICRza2lwID0gMTsKKwkJfQorCQkkaWYgPSAxOworCSAgICB9IGVsc2UgeworCQkkaWYgPSAwOworCQkkaWZfc2V0ID0gMDsKIAkgICAgfQogCi0JICAgIGlmICgkcmVzdCAhfiAvXlxzKiQvKSB7Ci0JCWRpZSAiJG5hbWU6ICQuOiBHYXJnYmFnZSBmb3VuZCBhZnRlciBURVNUX1NUQVJUXG4kXyI7CisJICAgIGlmICghJHNraXApIHsKKwkJaWYgKCR0eXBlIGVxICJURVNUX1NUQVJUIikgeworCQkgICAgaWYgKCRyZXN0ID1+IHMvXHMrSVRFUkFURVxzKyhcZCspLy8pIHsKKwkJCSRyZXBlYXQgPSAkMTsKKwkJCSRyZXBlYXRfdGVzdHN7IiR0ZXN0X251bSJ9ID0gJHJlcGVhdDsKKwkJICAgIH0KKwkJfSBlbHNpZiAoJHJlc3QgPX4gcy9cc09WRVJSSURFXGIvLykgeworCQkgICAgIyBERUZBVUxUIG9ubHkKKwkJICAgICRvdmVycmlkZSA9IDE7CisJCSAgICAjIENsZWFyIHByZXZpb3VzIG92ZXJyaWRlcworCQkgICAgJW92ZXJyaWRlcyA9ICgpOworCQl9CiAJICAgIH0KIAotCSAgICBpZiAoJHNraXApIHsKKwkgICAgaWYgKCEkc2tpcCAmJiAkcmVzdCAhfiAvXlxzKiQvKSB7CisJCWRpZSAiJG5hbWU6ICQuOiBHYXJnYmFnZSBmb3VuZCBhZnRlciAkdHlwZVxuJF8iOworCSAgICB9CisKKwkgICAgaWYgKCRza2lwICYmICR0eXBlIGVxICJURVNUX1NUQVJUIikgewogCQkkdGVzdF9udW0gPSAkb2xkX3Rlc3RfbnVtOwogCQkkcmVwZWF0ID0gJG9sZF9yZXBlYXQ7CiAJICAgIH0KIAotCX0gZWxzaWYgKC9eXHMqREVGQVVMVFMoLiopJC8pIHsKLQkgICAgJGRlZmF1bHQgPSAxOwotCisJfSBlbHNpZiAoL15ccypFTFNFXGIoLiopJC8pIHsKKwkgICAgaWYgKCEkaWYpIHsKKwkJZGllICIkbmFtZTogJC46IEVMU0UgZm91bmQgd2l0aCBvdXQgbWF0Y2hpbmcgSUYgc2VjdGlvblxuJF8iOworCSAgICB9CiAJICAgICRyZXN0ID0gJDE7Ci0KLQkgICAgaWYgKCRyZXN0ID1+IC9ccytTS0lQKC4qKS8pIHsKLQkJJHJlc3QgPSAkMTsKKwkgICAgaWYgKCRpZl9zZXQpIHsKIAkJJHNraXAgPSAxOworCQkkcmVzdCA9ICIiOwogCSAgICB9IGVsc2UgewogCQkkc2tpcCA9IDA7CisKKwkJaWYgKCRyZXN0ID1+IC9cc0lGXHMrKC4qKS8pIHsKKwkJICAgICMgTWF5IGJlIGEgRUxTRSBJRiBzZWN0aW9uLgorCQkgICAgaWYgKCFwcm9jZXNzX2lmKCRuYW1lLCAkMSkpIHsKKwkJCSRza2lwID0gMTsKKwkJICAgIH0KKwkJICAgICRyZXN0ID0gIiI7CisJCX0gZWxzZSB7CisJCSAgICAkaWYgPSAwOworCQl9CiAJICAgIH0KIAogCSAgICBpZiAoJHJlc3QgIX4gL15ccyokLykgewogCQlkaWUgIiRuYW1lOiAkLjogR2FyZ2JhZ2UgZm91bmQgYWZ0ZXIgREVGQVVMVFNcbiRfIjsKIAkgICAgfQogCisJfSBlbHNpZiAoL15ccypJTkNMVURFXHMrKFxTKykvKSB7CisKKwkgICAgbmV4dCBpZiAoJHNraXApOworCisJICAgIGlmICghJGRlZmF1bHQpIHsKKwkJZGllICIkbmFtZTogJC46IElOQ0xVREUgY2FuIG9ubHkgYmUgZG9uZSBpbiBkZWZhdWx0IHNlY3Rpb25zXG4kXyI7CisJICAgIH0KKworCSAgICBteSAkZmlsZSA9IHByb2Nlc3NfdmFyaWFibGVzKCQxKTsKKworCSAgICBpZiAoJGZpbGUgIX4gbSxeLywpIHsKKwkJIyBjaGVjayB0aGUgcGF0aCBvZiB0aGUgY29uZmlnIGZpbGUgZmlyc3QKKwkJaWYgKCRjb25maWcgPX4gbSwoLiopLywpIHsKKwkJICAgIGlmICgtZiAiJDEvJGZpbGUiKSB7CisJCQkkZmlsZSA9ICIkMS8kZmlsZSI7CisJCSAgICB9CisJCX0KKwkgICAgfQorCQkKKwkgICAgaWYgKCAhIC1yICRmaWxlICkgeworCQlkaWUgIiRuYW1lOiAkLjogQ2FuJ3QgcmVhZCBmaWxlICRmaWxlXG4kXyI7CisJICAgIH0KKworCSAgICBpZiAoX19yZWFkX2NvbmZpZygkZmlsZSwgXCR0ZXN0X251bSkpIHsKKwkJJHRlc3RfY2FzZSA9IDE7CisJICAgIH0KKwogCX0gZWxzaWYgKC9eXHMqKFtBLVpfXFtcXVxkXSspXHMqPVxzKiguKj8pXHMqJC8pIHsKIAogCSAgICBuZXh0IGlmICgkc2tpcCk7CkBAIC00NjAsMTAgKzY3MCwxMCBAQAogCSAgICB9CiAKIAkgICAgaWYgKCRkZWZhdWx0IHx8ICRsdmFsdWUgPX4gL1xbXGQrXF0kLykgewotCQlzZXRfdmFsdWUoJGx2YWx1ZSwgJHJ2YWx1ZSk7CisJCXNldF92YWx1ZSgkbHZhbHVlLCAkcnZhbHVlLCAkb3ZlcnJpZGUsIFwlb3ZlcnJpZGVzLCAkbmFtZSk7CiAJICAgIH0gZWxzZSB7CiAJCW15ICR2YWwgPSAiJGx2YWx1ZVxbJHRlc3RfbnVtXF0iOwotCQlzZXRfdmFsdWUoJHZhbCwgJHJ2YWx1ZSk7CisJCXNldF92YWx1ZSgkdmFsLCAkcnZhbHVlLCAkb3ZlcnJpZGUsIFwlb3ZlcnJpZGVzLCAkbmFtZSk7CiAKIAkJaWYgKCRyZXBlYXQgPiAxKSB7CiAJCSAgICAkcmVwZWF0c3skdmFsfSA9ICRyZXBlYXQ7CkBAIC00OTAsMTMgKzcwMCwyNiBAQAogCX0KICAgICB9CiAKLSAgICBjbG9zZShJTik7Ci0KICAgICBpZiAoJHRlc3RfbnVtKSB7CiAJJHRlc3RfbnVtICs9ICRyZXBlYXQgLSAxOwogCSRvcHR7Ik5VTV9URVNUUyJ9ID0gJHRlc3RfbnVtOwogICAgIH0KIAorICAgIGNsb3NlKCRpbik7CisKKyAgICAkJGN1cnJlbnRfdGVzdF9udW0gPSAkdGVzdF9udW07CisKKyAgICByZXR1cm4gJHRlc3RfY2FzZTsKK30KKworc3ViIHJlYWRfY29uZmlnIHsKKyAgICBteSAoJGNvbmZpZykgPSBAXzsKKworICAgIG15ICR0ZXN0X2Nhc2U7CisgICAgbXkgJHRlc3RfbnVtID0gMDsKKworICAgICR0ZXN0X2Nhc2UgPSBfX3JlYWRfY29uZmlnICRjb25maWcsIFwkdGVzdF9udW07CisKICAgICAjIG1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCBtYW5kYXRvcnkgY29uZmlncwogICAgIGdldF9rdGVzdF9jb25maWdzOwogCkBAIC02MDMsOCArODI2LDIwIEBACiB9CiAKIHN1YiBydW5fY29tbWFuZDsKK3N1YiBzdGFydF9tb25pdG9yOworc3ViIGVuZF9tb25pdG9yOworc3ViIHdhaXRfZm9yX21vbml0b3I7CiAKIHN1YiByZWJvb3QgeworICAgIG15ICgkdGltZSkgPSBAXzsKKworICAgIGlmIChkZWZpbmVkKCR0aW1lKSkgeworCXN0YXJ0X21vbml0b3I7CisJIyBmbHVzaCBvdXQgY3VycmVudCBtb25pdG9yCisJIyBNYXkgY29udGFpbiB0aGUgcmVib290IHN1Y2Nlc3MgbGluZQorCXdhaXRfZm9yX21vbml0b3IgMTsKKyAgICB9CisKICAgICAjIHRyeSB0byByZWJvb3Qgbm9ybWFsbHkKICAgICBpZiAocnVuX2NvbW1hbmQgJHJlYm9vdCkgewogCWlmIChkZWZpbmVkKCRwb3dlcmN5Y2xlX2FmdGVyX3JlYm9vdCkpIHsKQEAgLTYxNSwxMiArODUwLDE3IEBACiAJIyBub3BlPyBwb3dlciBjeWNsZSBpdC4KIAlydW5fY29tbWFuZCAiJHBvd2VyX2N5Y2xlIjsKICAgICB9CisKKyAgICBpZiAoZGVmaW5lZCgkdGltZSkpIHsKKwl3YWl0X2Zvcl9tb25pdG9yKCR0aW1lLCAkcmVib290X3N1Y2Nlc3NfbGluZSk7CisJZW5kX21vbml0b3I7CisgICAgfQogfQogCiBzdWIgZG9fbm90X3JlYm9vdCB7CiAgICAgbXkgJGkgPSAkaXRlcmF0aW9uOwogCi0gICAgcmV0dXJuICR0ZXN0X3R5cGUgZXEgImJ1aWxkIiB8fAorICAgIHJldHVybiAkdGVzdF90eXBlIGVxICJidWlsZCIgfHwgJG5vX3JlYm9vdCB8fAogCSgkdGVzdF90eXBlIGVxICJwYXRjaGNoZWNrIiAmJiAkb3B0eyJQQVRDSENIRUNLX1RZUEVbJGldIn0gZXEgImJ1aWxkIikgfHwKIAkoJHRlc3RfdHlwZSBlcSAiYmlzZWN0IiAmJiAkb3B0eyJCSVNFQ1RfVFlQRVskaV0ifSBlcSAiYnVpbGQiKTsKIH0KQEAgLTY5MywxNiArOTMzLDI5IEBACiB9CiAKIHN1YiB3YWl0X2Zvcl9tb25pdG9yIHsKLSAgICBteSAoJHRpbWUpID0gQF87CisgICAgbXkgKCR0aW1lLCAkc3RvcCkgPSBAXzsKKyAgICBteSAkZnVsbF9saW5lID0gIiI7CiAgICAgbXkgJGxpbmU7CisgICAgbXkgJGJvb3RlZCA9IDA7CiAKICAgICBkb3ByaW50ICIqKiBXYWl0IGZvciBtb25pdG9yIHRvIHNldHRsZSBkb3duICoqXG4iOwogCiAgICAgIyByZWFkIHRoZSBtb25pdG9yIGFuZCB3YWl0IGZvciB0aGUgc3lzdGVtIHRvIGNhbG0gZG93bgotICAgIGRvIHsKKyAgICB3aGlsZSAoISRib290ZWQpIHsKIAkkbGluZSA9IHdhaXRfZm9yX2lucHV0KCRtb25pdG9yX2ZwLCAkdGltZSk7Ci0JcHJpbnQgIiRsaW5lIiBpZiAoZGVmaW5lZCgkbGluZSkpOwotICAgIH0gd2hpbGUgKGRlZmluZWQoJGxpbmUpKTsKKwlsYXN0IGlmICghZGVmaW5lZCgkbGluZSkpOworCXByaW50ICIkbGluZSI7CisJJGZ1bGxfbGluZSAuPSAkbGluZTsKKworCWlmIChkZWZpbmVkKCRzdG9wKSAmJiAkZnVsbF9saW5lID1+IC8kc3RvcC8pIHsKKwkgICAgZG9wcmludCAid2FpdCBmb3IgbW9uaXRvciBkZXRlY3RlZCAkc3RvcFxuIjsKKwkgICAgJGJvb3RlZCA9IDE7CisJfQorCisJaWYgKCRsaW5lID1+IC9cbi8pIHsKKwkgICAgJGZ1bGxfbGluZSA9ICIiOworCX0KKyAgICB9CiAgICAgcHJpbnQgIioqIE1vbml0b3IgZmx1c2hlZCAqKlxuIjsKIH0KIApAQCAtNzE5LDEwICs5NzIsNyBAQAogCSMgbm8gbmVlZCB0byByZWJvb3QgZm9yIGp1c3QgYnVpbGRpbmcuCiAJaWYgKCFkb19ub3RfcmVib290KSB7CiAJICAgIGRvcHJpbnQgIlJFQk9PVElOR1xuIjsKLQkgICAgcmVib290OwotCSAgICBzdGFydF9tb25pdG9yOwotCSAgICB3YWl0X2Zvcl9tb25pdG9yICRzbGVlcF90aW1lOwotCSAgICBlbmRfbW9uaXRvcjsKKwkgICAgcmVib290ICRzbGVlcF90aW1lOwogCX0KIAogCW15ICRuYW1lID0gIiI7CkBAIC04NTQsOSArMTEwNCwxMiBAQAogICAgIG9wZW4oSU4sICIkc3NoX2dydWIgfCIpCiAJb3IgZGllICJ1bmFibGUgdG8gZ2V0IG1lbnUubHN0IjsKIAorICAgIG15ICRmb3VuZCA9IDA7CisKICAgICB3aGlsZSAoPElOPikgewogCWlmICgvXlxzKnRpdGxlXHMrJGdydWJfbWVudVxzKiQvKSB7CiAJICAgICRncnViX251bWJlcisrOworCSAgICAkZm91bmQgPSAxOwogCSAgICBsYXN0OwogCX0gZWxzaWYgKC9eXHMqdGl0bGVccy8pIHsKIAkgICAgJGdydWJfbnVtYmVyKys7CkBAIC04NjUsNyArMTExOCw3IEBACiAgICAgY2xvc2UoSU4pOwogCiAgICAgZGllICJDb3VsZCBub3QgZmluZCAnJGdydWJfbWVudScgaW4gL2Jvb3QvZ3J1Yi9tZW51IG9uICRtYWNoaW5lIgotCWlmICgkZ3J1Yl9udW1iZXIgPCAwKTsKKwlpZiAoISRmb3VuZCk7CiAgICAgZG9wcmludCAiJGdydWJfbnVtYmVyXG4iOwogfQogCkBAIC05MDIsNyArMTE1NSw4IEBACiAKIHN1YiByZWJvb3RfdG8gewogICAgIGlmICgkcmVib290X3R5cGUgZXEgImdydWIiKSB7Ci0JcnVuX3NzaCAiJyhlY2hvIFwic2F2ZWRlZmF1bHQgLS1kZWZhdWx0PSRncnViX251bWJlciAtLW9uY2VcIiB8IGdydWIgLS1iYXRjaCAmJiByZWJvb3QpJyI7CisJcnVuX3NzaCAiJyhlY2hvIFwic2F2ZWRlZmF1bHQgLS1kZWZhdWx0PSRncnViX251bWJlciAtLW9uY2VcIiB8IGdydWIgLS1iYXRjaCknIjsKKwlyZWJvb3Q7CiAJcmV0dXJuOwogICAgIH0KIApAQCAtMTA4Myw2ICsxMzM3LDggQEAKIAogc3ViIGluc3RhbGwgewogCisgICAgcmV0dXJuIGlmICgkbm9faW5zdGFsbCk7CisKICAgICBydW5fc2NwICIkb3V0cHV0ZGlyLyRidWlsZF90YXJnZXQiLCAiJHRhcmdldF9pbWFnZSIgb3IKIAlkb2RpZSAiZmFpbGVkIHRvIGNvcHkgaW1hZ2UiOwogCkBAIC0xMTQwLDYgKzEzOTYsMTEgQEAKIH0KIAogc3ViIHN0YXJ0X21vbml0b3JfYW5kX2Jvb3QgeworICAgICMgTWFrZSBzdXJlIHRoZSBzdGFibGUga2VybmVsIGhhcyBmaW5pc2hlZCBib290aW5nCisgICAgc3RhcnRfbW9uaXRvcjsKKyAgICB3YWl0X2Zvcl9tb25pdG9yIDU7CisgICAgZW5kX21vbml0b3I7CisKICAgICBnZXRfZ3J1Yl9pbmRleDsKICAgICBnZXRfdmVyc2lvbjsKICAgICBpbnN0YWxsOwpAQCAtMTI1MCw2ICsxNTExLDEwIEBACiAKICAgICB1bmxpbmsgJGJ1aWxkbG9nOwogCisgICAgIyBGYWlsZWQgYnVpbGRzIHNob3VsZCBub3QgcmVib290IHRoZSB0YXJnZXQKKyAgICBteSAkc2F2ZV9ub19yZWJvb3QgPSAkbm9fcmVib290OworICAgICRub19yZWJvb3QgPSAxOworCiAgICAgaWYgKGRlZmluZWQoJHByZV9idWlsZCkpIHsKIAlteSAkcmV0ID0gcnVuX2NvbW1hbmQgJHByZV9idWlsZDsKIAlpZiAoISRyZXQgJiYgZGVmaW5lZCgkcHJlX2J1aWxkX2RpZSkgJiYKQEAgLTEyNzIsMTYgKzE1MzcsMTYgQEAKIAkjIGFsbG93IGZvciBlbXB0eSBjb25maWdzCiAJcnVuX2NvbW1hbmQgInRvdWNoICRvdXRwdXRfY29uZmlnIjsKIAotCXJ1bl9jb21tYW5kICJtdiAkb3V0cHV0X2NvbmZpZyAkb3V0cHV0ZGlyL2NvbmZpZ190ZW1wIiBvcgotCSAgICBkb2RpZSAibW92aW5nIC5jb25maWciOworCWlmICghJG5vY2xlYW4pIHsKKwkgICAgcnVuX2NvbW1hbmQgIm12ICRvdXRwdXRfY29uZmlnICRvdXRwdXRkaXIvY29uZmlnX3RlbXAiIG9yCisJCWRvZGllICJtb3ZpbmcgLmNvbmZpZyI7CiAKLQlpZiAoISRub2NsZWFuICYmICFydW5fY29tbWFuZCAiJG1ha2UgbXJwcm9wZXIiKSB7Ci0JICAgIGRvZGllICJtYWtlIG1ycHJvcGVyIjsKKwkgICAgcnVuX2NvbW1hbmQgIiRtYWtlIG1ycHJvcGVyIiBvciBkb2RpZSAibWFrZSBtcnByb3BlciI7CisKKwkgICAgcnVuX2NvbW1hbmQgIm12ICRvdXRwdXRkaXIvY29uZmlnX3RlbXAgJG91dHB1dF9jb25maWciIG9yCisJCWRvZGllICJtb3ZpbmcgY29uZmlnX3RlbXAiOwogCX0KIAotCXJ1bl9jb21tYW5kICJtdiAkb3V0cHV0ZGlyL2NvbmZpZ190ZW1wICRvdXRwdXRfY29uZmlnIiBvcgotCSAgICBkb2RpZSAibW92aW5nIGNvbmZpZ190ZW1wIjsKLQogICAgIH0gZWxzaWYgKCEkbm9jbGVhbikgewogCXVubGluayAiJG91dHB1dF9jb25maWciOwogCXJ1bl9jb21tYW5kICIkbWFrZSBtcnByb3BlciIgb3IKQEAgLTEzMTgsMTAgKzE1ODMsMTUgQEAKIAogICAgIGlmICghJGJ1aWxkX3JldCkgewogCSMgYmlzZWN0IG1heSBuZWVkIHRoaXMgdG8gcGFzcwotCXJldHVybiAwIGlmICgkaW5fYmlzZWN0KTsKKwlpZiAoJGluX2Jpc2VjdCkgeworCSAgICAkbm9fcmVib290ID0gJHNhdmVfbm9fcmVib290OworCSAgICByZXR1cm4gMDsKKwl9CiAJZmFpbCAiZmFpbGVkIGJ1aWxkIiBhbmQgcmV0dXJuIDA7CiAgICAgfQogCisgICAgJG5vX3JlYm9vdCA9ICRzYXZlX25vX3JlYm9vdDsKKwogICAgIHJldHVybiAxOwogfQogCkBAIC0xMzU2LDEwICsxNjI2LDcgQEAKIAogICAgIGlmICgkaSAhPSAkb3B0eyJOVU1fVEVTVFMifSAmJiAhZG9fbm90X3JlYm9vdCkgewogCWRvcHJpbnQgIlJlYm9vdCBhbmQgd2FpdCAkc2xlZXBfdGltZSBzZWNvbmRzXG4iOwotCXJlYm9vdDsKLQlzdGFydF9tb25pdG9yOwotCXdhaXRfZm9yX21vbml0b3IgJHNsZWVwX3RpbWU7Ci0JZW5kX21vbml0b3I7CisJcmVib290ICRzbGVlcF90aW1lOwogICAgIH0KIH0KIApAQCAtMTUwMCwxMCArMTc2Nyw3IEBACiAKIHN1YiBiaXNlY3RfcmVib290IHsKICAgICBkb3ByaW50ICJSZWJvb3QgYW5kIHNsZWVwICRiaXNlY3Rfc2xlZXBfdGltZSBzZWNvbmRzXG4iOwotICAgIHJlYm9vdDsKLSAgICBzdGFydF9tb25pdG9yOwotICAgIHdhaXRfZm9yX21vbml0b3IgJGJpc2VjdF9zbGVlcF90aW1lOwotICAgIGVuZF9tb25pdG9yOworICAgIHJlYm9vdCAkYmlzZWN0X3NsZWVwX3RpbWU7CiB9CiAKICMgcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZSwgLTEgb24gc2tpcApAQCAtMjA2NiwxMCArMjMzMCw3IEBACiAKIHN1YiBwYXRjaGNoZWNrX3JlYm9vdCB7CiAgICAgZG9wcmludCAiUmVib290IGFuZCBzbGVlcCAkcGF0Y2hjaGVja19zbGVlcF90aW1lIHNlY29uZHNcbiI7Ci0gICAgcmVib290OwotICAgIHN0YXJ0X21vbml0b3I7Ci0gICAgd2FpdF9mb3JfbW9uaXRvciAkcGF0Y2hjaGVja19zbGVlcF90aW1lOwotICAgIGVuZF9tb25pdG9yOworICAgIHJlYm9vdCAkcGF0Y2hjaGVja19zbGVlcF90aW1lOwogfQogCiBzdWIgcGF0Y2hjaGVjayB7CkBAIC0yMTc4LDEyICsyNDM5LDMxIEBACiB9CiAKIG15ICVkZXBlbmRzOworbXkgJWRlcGNvdW50OwogbXkgJGlmbGV2ZWwgPSAwOwogbXkgQGlmZGVwczsKIAogIyBwcmV2ZW50IHJlY3Vyc2lvbgogbXkgJXJlYWRfa2NvbmZpZ3M7CiAKK3N1YiBhZGRfZGVwIHsKKyAgICAjICRjb25maWcgZGVwZW5kcyBvbiAkZGVwCisgICAgbXkgKCRjb25maWcsICRkZXApID0gQF87CisKKyAgICBpZiAoZGVmaW5lZCgkZGVwZW5kc3skY29uZmlnfSkpIHsKKwkkZGVwZW5kc3skY29uZmlnfSAuPSAiICIgLiAkZGVwOworICAgIH0gZWxzZSB7CisJJGRlcGVuZHN7JGNvbmZpZ30gPSAkZGVwOworICAgIH0KKworICAgICMgcmVjb3JkIHRoZSBudW1iZXIgb2YgY29uZmlncyBkZXBlbmRpbmcgb24gJGRlcAorICAgIGlmIChkZWZpbmVkICRkZXBjb3VudHskZGVwfSkgeworCSRkZXBjb3VudHskZGVwfSsrOworICAgIH0gZWxzZSB7CisJJGRlcGNvdW50eyRkZXB9ID0gMTsKKyAgICB9IAorfQorCiAjIHRha2VuIGZyb20gc3RyZWFtbGluZV9jb25maWcucGwKIHN1YiByZWFkX2tjb25maWcgewogICAgIG15ICgka2NvbmZpZykgPSBAXzsKQEAgLTIyMzAsMzAgKzI1MTAsMTkgQEAKIAkgICAgJGNvbmZpZyA9ICQyOwogCiAJICAgIGZvciAobXkgJGkgPSAwOyAkaSA8ICRpZmxldmVsOyAkaSsrKSB7Ci0JCWlmICgkaSkgewotCQkgICAgJGRlcGVuZHN7JGNvbmZpZ30gLj0gIiAiIC4gJGlmZGVwc1skaV07Ci0JCX0gZWxzZSB7Ci0JCSAgICAkZGVwZW5kc3skY29uZmlnfSA9ICRpZmRlcHNbJGldOwotCQl9Ci0JCSRzdGF0ZSA9ICJERVAiOworCQlhZGRfZGVwICRjb25maWcsICRpZmRlcHNbJGldOwogCSAgICB9CiAKIAkjIGNvbGxlY3QgdGhlIGRlcGVuZHMgZm9yIHRoZSBjb25maWcKIAl9IGVsc2lmICgkc3RhdGUgZXEgIk5FVyIgJiYgL15ccypkZXBlbmRzXHMrb25ccysoLiopJC8pIHsKIAotCSAgICBpZiAoZGVmaW5lZCgkZGVwZW5kc3skMX0pKSB7Ci0JCSRkZXBlbmRzeyRjb25maWd9IC49ICIgIiAuICQxOwotCSAgICB9IGVsc2UgewotCQkkZGVwZW5kc3skY29uZmlnfSA9ICQxOwotCSAgICB9CisJICAgIGFkZF9kZXAgJGNvbmZpZywgJDE7CiAKIAkjIEdldCB0aGUgY29uZmlncyB0aGF0IHNlbGVjdCB0aGlzIGNvbmZpZwotCX0gZWxzaWYgKCRzdGF0ZSBuZSAiTk9ORSIgJiYgL15ccypzZWxlY3RccysoXFMrKS8pIHsKLQkgICAgaWYgKGRlZmluZWQoJGRlcGVuZHN7JDF9KSkgewotCQkkZGVwZW5kc3skMX0gLj0gIiAiIC4gJGNvbmZpZzsKLQkgICAgfSBlbHNlIHsKLQkJJGRlcGVuZHN7JDF9ID0gJGNvbmZpZzsKLQkgICAgfQorCX0gZWxzaWYgKCRzdGF0ZSBlcSAiTkVXIiAmJiAvXlxzKnNlbGVjdFxzKyhcUyspLykgeworCisJICAgICMgc2VsZWN0ZWQgYnkgZGVwZW5kcyBvbiBjb25maWcKKwkgICAgYWRkX2RlcCAkMSwgJGNvbmZpZzsKIAogCSMgQ2hlY2sgZm9yIGlmIHN0YXRlbWVudHMKIAl9IGVsc2lmICgvXmlmXHMrKC4qXFMpXHMqJC8pIHsKQEAgLTIzNjUsMTEgKzI2MzQsMTggQEAKICAgICBjbG9zZSBPVVQ7CiB9CiAKK3N1YiBjaG9tcF9jb25maWcgeworICAgIG15ICgkY29uZmlnKSA9IEBfOworCisgICAgJGNvbmZpZyA9fiBzL0NPTkZJR18vLzsKKworICAgIHJldHVybiAkY29uZmlnOworfQorCiBzdWIgZ2V0X2RlcGVuZHMgewogICAgIG15ICgkZGVwKSA9IEBfOwogCi0gICAgbXkgJGtjb25maWcgPSAkZGVwOwotICAgICRrY29uZmlnID1+IHMvQ09ORklHXy8vOworICAgIG15ICRrY29uZmlnID0gY2hvbXBfY29uZmlnICRkZXA7CiAKICAgICAkZGVwID0gJGRlcGVuZHN7IiRrY29uZmlnIn07CiAKQEAgLTI0MTksOCArMjY5NSw3IEBACiAJcmV0dXJuIHVuZGVmOwogICAgIH0KIAotICAgIG15ICRrY29uZmlnID0gJGNvbmZpZzsKLSAgICAka2NvbmZpZyA9fiBzL0NPTkZJR18vLzsKKyAgICBteSAka2NvbmZpZyA9IGNob21wX2NvbmZpZyAkY29uZmlnOwogCiAgICAgIyBUZXN0IGRlcGVuZGVuY2llcyBmaXJzdAogICAgIGlmIChkZWZpbmVkKCRkZXBlbmRzeyIka2NvbmZpZyJ9KSkgewpAQCAtMjUxMCw2ICsyNzg1LDE0IEBACiAKICAgICBteSBAY29uZmlnX2tleXMgPSBrZXlzICVtaW5fY29uZmlnczsKIAorICAgICMgQWxsIGNvbmZpZ3MgbmVlZCBhIGRlcGNvdW50CisgICAgZm9yZWFjaCBteSAkY29uZmlnIChAY29uZmlnX2tleXMpIHsKKwlteSAka2NvbmZpZyA9IGNob21wX2NvbmZpZyAkY29uZmlnOworCWlmICghZGVmaW5lZCAkZGVwY291bnR7JGtjb25maWd9KSB7CisJCSRkZXBjb3VudHska2NvbmZpZ30gPSAwOworCX0KKyAgICB9CisKICAgICAjIFJlbW92ZSBhbnl0aGluZyB0aGF0IHdhcyBzZXQgYnkgdGhlIG1ha2UgYWxsbm9jb25maWcKICAgICAjIHdlIHNob3VsZG4ndCBuZWVkIHRoZW0gYXMgdGhleSBnZXQgc2V0IGZvciB1cyBhbnl3YXkuCiAgICAgZm9yZWFjaCBteSAkY29uZmlnIChAY29uZmlnX2tleXMpIHsKQEAgLTI1NDgsOCArMjgzMSwxMyBAQAogCSMgTm93IGRpc2FibGUgZWFjaCBjb25maWcgb25lIGJ5IG9uZSBhbmQgZG8gYSBtYWtlIG9sZGNvbmZpZwogCSMgdGlsbCB3ZSBmaW5kIGEgY29uZmlnIHRoYXQgY2hhbmdlcyBvdXIgbGlzdC4KIAotCSMgUHV0IGNvbmZpZ3MgdGhhdCBkaWQgbm90IG1vZGlmeSB0aGUgY29uZmlnIGF0IHRoZSBlbmQuCiAJbXkgQHRlc3RfY29uZmlncyA9IGtleXMgJW1pbl9jb25maWdzOworCisJIyBTb3J0IGtleXMgYnkgd2hvIGlzIG1vc3QgZGVwZW5kZW50IG9uCisJQHRlc3RfY29uZmlncyA9IHNvcnQgIHsgJGRlcGNvdW50e2Nob21wX2NvbmZpZygkYil9IDw9PiAkZGVwY291bnR7Y2hvbXBfY29uZmlnKCRhKX0gfQorCQkJICBAdGVzdF9jb25maWdzIDsKKworCSMgUHV0IGNvbmZpZ3MgdGhhdCBkaWQgbm90IG1vZGlmeSB0aGUgY29uZmlnIGF0IHRoZSBlbmQuCiAJbXkgJHJlc2V0ID0gMTsKIAlmb3IgKG15ICRpID0gMDsgJGkgPCAkI3Rlc3RfY29uZmlnczsgJGkrKykgewogCSAgICBpZiAoIWRlZmluZWQoJG5vY2hhbmdlX2NvbmZpZ3skdGVzdF9jb25maWdzWzBdfSkpIHsKQEAgLTI2NTksMTAgKzI5NDcsNyBAQAogCX0KIAogCWRvcHJpbnQgIlJlYm9vdCBhbmQgd2FpdCAkc2xlZXBfdGltZSBzZWNvbmRzXG4iOwotCXJlYm9vdDsKLQlzdGFydF9tb25pdG9yOwotCXdhaXRfZm9yX21vbml0b3IgJHNsZWVwX3RpbWU7Ci0JZW5kX21vbml0b3I7CisJcmVib290ICRzbGVlcF90aW1lOwogICAgIH0KIAogICAgIHN1Y2Nlc3MgJGk7CkBAIC0yNzgzLDYgKzMwNjgsOSBAQAogIyBGaXJzdCB3ZSBuZWVkIHRvIGRvIGlzIHRoZSBidWlsZHMKIGZvciAobXkgJGkgPSAxOyAkaSA8PSAkb3B0eyJOVU1fVEVTVFMifTsgJGkrKykgewogCisgICAgIyBEbyBub3QgcmVib290IG9uIGZhaWxpbmcgdGVzdCBvcHRpb25zCisgICAgJG5vX3JlYm9vdCA9IDE7CisKICAgICAkaXRlcmF0aW9uID0gJGk7CiAKICAgICBteSAkbWFrZWNtZCA9IHNldF90ZXN0X29wdGlvbigiTUFLRV9DTUQiLCAkaSk7CkBAIC0yODExLDYgKzMwOTksNyBAQAogICAgICRyZWJvb3RfdHlwZSA9IHNldF90ZXN0X29wdGlvbigiUkVCT09UX1RZUEUiLCAkaSk7CiAgICAgJGdydWJfbWVudSA9IHNldF90ZXN0X29wdGlvbigiR1JVQl9NRU5VIiwgJGkpOwogICAgICRwb3N0X2luc3RhbGwgPSBzZXRfdGVzdF9vcHRpb24oIlBPU1RfSU5TVEFMTCIsICRpKTsKKyAgICAkbm9faW5zdGFsbCA9IHNldF90ZXN0X29wdGlvbigiTk9fSU5TVEFMTCIsICRpKTsKICAgICAkcmVib290X3NjcmlwdCA9IHNldF90ZXN0X29wdGlvbigiUkVCT09UX1NDUklQVCIsICRpKTsKICAgICAkcmVib290X29uX2Vycm9yID0gc2V0X3Rlc3Rfb3B0aW9uKCJSRUJPT1RfT05fRVJST1IiLCAkaSk7CiAgICAgJHBvd2Vyb2ZmX29uX2Vycm9yID0gc2V0X3Rlc3Rfb3B0aW9uKCJQT1dFUk9GRl9PTl9FUlJPUiIsICRpKTsKQEAgLTI4MzIsNiArMzEyMSw3IEBACiAgICAgJGNvbnNvbGUgPSBzZXRfdGVzdF9vcHRpb24oIkNPTlNPTEUiLCAkaSk7CiAgICAgJGRldGVjdF90cmlwbGVmYXVsdCA9IHNldF90ZXN0X29wdGlvbigiREVURUNUX1RSSVBMRV9GQVVMVCIsICRpKTsKICAgICAkc3VjY2Vzc19saW5lID0gc2V0X3Rlc3Rfb3B0aW9uKCJTVUNDRVNTX0xJTkUiLCAkaSk7CisgICAgJHJlYm9vdF9zdWNjZXNzX2xpbmUgPSBzZXRfdGVzdF9vcHRpb24oIlJFQk9PVF9TVUNDRVNTX0xJTkUiLCAkaSk7CiAgICAgJHN0b3BfYWZ0ZXJfc3VjY2VzcyA9IHNldF90ZXN0X29wdGlvbigiU1RPUF9BRlRFUl9TVUNDRVNTIiwgJGkpOwogICAgICRzdG9wX2FmdGVyX2ZhaWx1cmUgPSBzZXRfdGVzdF9vcHRpb24oIlNUT1BfQUZURVJfRkFJTFVSRSIsICRpKTsKICAgICAkc3RvcF90ZXN0X2FmdGVyID0gc2V0X3Rlc3Rfb3B0aW9uKCJTVE9QX1RFU1RfQUZURVIiLCAkaSk7CkBAIC0yODUwLDkgKzMxNDAsMTEgQEAKIAogICAgIGNoZGlyICRidWlsZGRpciB8fCBkaWUgImNhbid0IGNoYW5nZSBkaXJlY3RvcnkgdG8gJGJ1aWxkZGlyIjsKIAotICAgIGlmICghLWQgJHRtcGRpcikgewotCW1rcGF0aCgkdG1wZGlyKSBvcgotCSAgICBkaWUgImNhbid0IGNyZWF0ZSAkdG1wZGlyIjsKKyAgICBmb3JlYWNoIG15ICRkaXIgKCR0bXBkaXIsICRvdXRwdXRkaXIpIHsKKwlpZiAoIS1kICRkaXIpIHsKKwkgICAgbWtwYXRoKCRkaXIpIG9yCisJCWRpZSAiY2FuJ3QgY3JlYXRlICRkaXIiOworCX0KICAgICB9CiAKICAgICAkRU5WeyJTU0hfVVNFUiJ9ID0gJHNzaF91c2VyOwpAQCAtMjg4OSw4ICszMTgxLDExIEBACiAJJHJ1bl90eXBlID0gIkVSUk9SIjsKICAgICB9CiAKKyAgICBteSAkaW5zdGFsbG1lID0gIiI7CisgICAgJGluc3RhbGxtZSA9ICIgbm9faW5zdGFsbCIgaWYgKCRub19pbnN0YWxsKTsKKwogICAgIGRvcHJpbnQgIlxuXG4iOwotICAgIGRvcHJpbnQgIlJVTk5JTkcgVEVTVCAkaSBvZiAkb3B0e05VTV9URVNUU30gd2l0aCBvcHRpb24gJHRlc3RfdHlwZSAkcnVuX3R5cGVcblxuIjsKKyAgICBkb3ByaW50ICJSVU5OSU5HIFRFU1QgJGkgb2YgJG9wdHtOVU1fVEVTVFN9IHdpdGggb3B0aW9uICR0ZXN0X3R5cGUgJHJ1bl90eXBlJGluc3RhbGxtZVxuXG4iOwogCiAgICAgdW5saW5rICRkbWVzZzsKICAgICB1bmxpbmsgJGJ1aWxkbG9nOwpAQCAtMjkxMSw2ICszMjA2LDkgQEAKIAkgICAgZGllICJmYWlsZWQgdG8gY2hlY2tvdXQgJGNoZWNrb3V0IjsKICAgICB9CiAKKyAgICAkbm9fcmVib290ID0gMDsKKworCiAgICAgaWYgKCR0ZXN0X3R5cGUgZXEgImJpc2VjdCIpIHsKIAliaXNlY3QgJGk7CiAJbmV4dDsKQEAgLTI5MjksNiArMzIyNywxMyBAQAogCWJ1aWxkICRidWlsZF90eXBlIG9yIG5leHQ7CiAgICAgfQogCisgICAgaWYgKCR0ZXN0X3R5cGUgZXEgImluc3RhbGwiKSB7CisJZ2V0X3ZlcnNpb247CisJaW5zdGFsbDsKKwlzdWNjZXNzICRpOworCW5leHQ7CisgICAgfQorCiAgICAgaWYgKCR0ZXN0X3R5cGUgbmUgImJ1aWxkIikgewogCW15ICRmYWlsZWQgPSAwOwogCXN0YXJ0X21vbml0b3JfYW5kX2Jvb3Qgb3IgJGZhaWxlZCA9IDE7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL2t0ZXN0L3NhbXBsZS5jb25mIGIvdG9vbHMvdGVzdGluZy9rdGVzdC9zYW1wbGUuY29uZgppbmRleCBiOGJjZDE0Li5kYmVkZmExIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL2t0ZXN0L3NhbXBsZS5jb25mCisrKyBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qvc2FtcGxlLmNvbmYKQEAgLTcyLDYgKzcyLDEyOCBAQAogIyB0aGUgc2FtZSBvcHRpb24gbmFtZSB1bmRlciB0aGUgc2FtZSB0ZXN0IG9yIGFzIGRlZmF1bHQKICMga3Rlc3Qgd2lsbCBmYWlsIHRvIGV4ZWN1dGUsIGFuZCBubyB0ZXN0cyB3aWxsIHJ1bi4KICMKKyMgREVGQVVMVFMgT1ZFUlJJREUKKyMKKyMgT3B0aW9ucyBkZWZpbmVkIGluIHRoZSBERUZBVUxUUyBzZWN0aW9uIGNhbiBub3QgYmUgZHVwbGljYXRlZAorIyBldmVuIGlmIHRoZXkgYXJlIGRlZmluZWQgaW4gdHdvIGRpZmZlcmVudCBERUZBVUxUIHNlY3Rpb25zLgorIyBUaGlzIGlzIGRvbmUgdG8gY2F0Y2ggbWlzdGFrZXMgd2hlcmUgYW4gb3B0aW9uIGlzIGFkZGVkIGJ1dAorIyB0aGUgcHJldmlvdXMgb3B0aW9uIHdhcyBmb3Jnb3R0ZW4gYWJvdXQgYW5kIG5vdCBjb21tZW50ZWQuCisjCisjIFRoZSBPVkVSUklERSBrZXl3b3JkIGNhbiBiZSBhZGRlZCB0byBhIHNlY3Rpb24gdG8gYWxsb3cgdGhpcworIyBzZWN0aW9uIHRvIG92ZXJyaWRlIG90aGVyIERFRkFVTFQgc2VjdGlvbnMgdmFsdWVzIHRoYXQgaGF2ZQorIyBiZWVuIGRlZmluZWQgcHJldmlvdXNseS4gSXQgd2lsbCBvbmx5IG92ZXJyaWRlIG9wdGlvbnMgdGhhdAorIyBoYXZlIGJlZW4gZGVmaW5lZCBiZWZvcmUgaXRzIHVzZS4gT3B0aW9ucyBkZWZpbmVkIGxhdGVyCisjIGluIGEgbm9uIG92ZXJyaWRlIHNlY3Rpb24gd2lsbCBzdGlsbCBlcnJvci4gVGhlIHNhbWUgb3B0aW9uCisjIGNhbiBub3QgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBzZWN0aW9uIGV2ZW4gaWYgdGhhdCBzZWN0aW9uCisjIGlzIG1hcmtlZCBPVkVSUklERS4KKyMKKyMKKyMKKyMgQm90aCBURVNUX1NUQVJUIGFuZCBERUZBVUxUUyBzZWN0aW9ucyBjYW4gYWxzbyBoYXZlIHRoZSBJRiBrZXl3b3JkCisjIFRoZSB2YWx1ZSBhZnRlciB0aGUgSUYgbXVzdCBldmFsdWF0ZSBpbnRvIGEgMCBvciBub24gMCBwb3NpdGl2ZQorIyBpbnRlZ2VyLCBhbmQgY2FuIHVzZSB0aGUgY29uZmlnIHZhcmlhYmxlcyAoZXhwbGFpbmVkIGJlbG93KS4KKyMKKyMgREVGQVVMVFMgSUYgJHtJU19YODZfMzJ9CisjCisjIFRoZSBhYm92ZSB3aWxsIHByb2Nlc3MgdGhlIERFRkFVTFRTIHNlY3Rpb24gaWYgdGhlIGNvbmZpZworIyB2YXJpYWJsZSBJU19YODZfMzIgZXZhbHVhdGVzIHRvIGEgbm9uIHplcm8gcG9zaXRpdmUgaW50ZWdlcgorIyBvdGhlcndpc2UgaWYgaXQgZXZhbHVhdGVzIHRvIHplcm8sIGl0IHdpbGwgYWN0IHRoZSBzYW1lCisjIGFzIGlmIHRoZSBTS0lQIGtleXdvcmQgd2FzIHVzZWQuCisjCisjIFRoZSBFTFNFIGtleXdvcmQgY2FuIGJlIHVzZWQgZGlyZWN0bHkgYWZ0ZXIgYSBzZWN0aW9uIHdpdGgKKyMgYSBJRiBzdGF0ZW1lbnQuCisjCisjIFRFU1RfU1RBUlQgSUYgJHtSVU5fTkVUX1RFU1RTfQorIyBCVUlMRF9UWVBFID0gdXNlY29uZmlnOiR7Q09ORklHX0RJUn0vY29uZmlnLW5ldHdvcmsKKyMKKyMgRUxTRQorIworIyBCVUlMRF9UWVBFID0gdXNlY29uZmlnOiR7Q09ORklHX0RJUn0vY29uZmlnLW5vcm1hbAorIworIworIyBUaGUgRUxTRSBrZXl3b3JkIGNhbiBhbHNvIGNvbnRhaW4gYW4gSUYgc3RhdGVtZW50IHRvIGFsbG93IG11bHRpcGxlCisjIGlmIHRoZW4gZWxzZSBzZWN0aW9ucy4gQnV0IGFsbCB0aGUgc2VjdGlvbnMgbXVzdCBiZSBlaXRoZXIKKyMgREVGQVVMVCBvciBURVNUX1NUQVJULCB0aGV5IGNhbiBub3QgYmUgYSBtaXh0dXJlLgorIworIyBURVNUX1NUQVJUIElGICR7UlVOX05FVF9URVNUU30KKyMgQlVJTERfVFlQRSA9IHVzZWNvbmZpZzoke0NPTkZJR19ESVJ9L2NvbmZpZy1uZXR3b3JrCisjCisjIEVMU0UgSUYgJHtSVU5fRElTS19URVNUU30KKyMgQlVJTERfVFlQRSA9IHVzZWNvbmZpZzoke0NPTkZJR19ESVJ9L2NvbmZpZy10ZXN0cworIworIyBFTFNFIElGICR7UlVOX0NQVV9URVNUU30KKyMgQlVJTERfVFlQRSA9IHVzZWNvbmZpZzoke0NPTkZJR19ESVJ9L2NvbmZpZy1jcHUKKyMKKyMgRUxTRQorIyBCVUlMRF9UWVBFID0gdXNlY29uZmlnOiR7Q09ORklHX0RJUn0vY29uZmlnLW5ldHdvcmsKKyMKKyMgVGhlIGlmIHN0YXRlbWVudCBtYXkgYWxzbyBoYXZlIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBhbmQgZm9yCisjID09IGFuZCAhPSwgc3RyaW5ncyBtYXkgYmUgdXNlZCBmb3IgYm90aCBzaWRlcy4KKyMKKyMgQk9YX1RZUEUgOj0geDg2XzMyCisjCisjIERFRkFVTFRTIElGICR7Qk9YX1RZUEV9ID09IHg4Nl8zMgorIyBCVUlMRF9UWVBFID0gdXNlY29uZmlnOiR7Q09ORklHX0RJUn0vY29uZmlnLTMyCisjIEVMU0UKKyMgQlVJTERfVFlQRSA9IHVzZWNvbmZpZzoke0NPTkZJR19ESVJ9L2NvbmZpZy02NAorIworIyBUaGUgREVGSU5FRCBrZXl3b3JkIGNhbiBiZSB1c2VkIGJ5IHRoZSBJRiBzdGF0ZW1lbnRzIHRvby4KKyMgSXQgcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb25maWcgdmFyaWFibGUgb3Igb3B0aW9uIGhhcyBiZWVuIGRlZmluZWQKKyMgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorIworIyAKKyMgREVGQVVMVFMgSUYgREVGSU5FRCBVU0VfQ0MKKyMgQ0MgOj0gJHtVU0VfQ0N9CisjIEVMU0UKKyMgQ0MgOj0gZ2NjCisjCisjCisjIEFzIHdlbGwgYXMgTk9UIERFRklORUQuCisjCisjIERFRkFVTFRTIElGIE5PVCBERUZJTkVEIE1BS0VfQ01ECisjIE1BS0VfQ01EIDo9IG1ha2UgQVJDSD14ODYKKyMKKyMKKyMgQW5kL29yIG9wcyAoJiYsfHwpIG1heSBhbHNvIGJlIHVzZWQgdG8gbWFrZSBjb21wbGV4IGNvbmRpdGlvbmFscy4KKyMKKyMgVEVTVF9TVEFSVCBJRiAoREVGSU5FRCBBTExfVEVTVFMgfHwgJHtNWVRFU1R9ID09IGJvb3R0ZXN0KSAmJiAke01BQ0hJTkV9ID09IGdhbmRhbGYKKyMKKyMgTm90aWNlIHRoZSB1c2Ugb2YgcGFyYW50aGVzaXMuIFdpdGhvdXQgYW55IHBhcmFudGhlc2lzIHRoZSBhYm92ZSB3b3VsZCBiZQorIyBwcm9jZXNzZWQgdGhlIHNhbWUgYXM6CisjCisjIFRFU1RfU1RBUlQgSUYgREVGSU5FRCBBTExfVEVTVFMgfHwgKCR7TVlURVNUfSA9PSBib290dGVzdCAmJiAke01BQ0hJTkV9ID09IGdhbmRhbGYpCisjCisjCisjCisjIElOQ0xVREUgZmlsZQorIworIyBUaGUgSU5DTFVERSBrZXl3b3JkIG1heSBiZSB1c2VkIGluIERFRkFVTFQgc2VjdGlvbnMuIFRoaXMgd2lsbAorIyByZWFkIGFub3RoZXIgY29uZmlnIGZpbGUgYW5kIHByb2Nlc3MgdGhhdCBmaWxlIGFzIHdlbGwuIFRoZSBpbmNsdWRlZAorIyBmaWxlIGNhbiBpbmNsdWRlIG90aGVyIGZpbGVzLCBhZGQgbmV3IHRlc3QgY2FzZXMgb3IgZGVmYXVsdAorIyBzdGF0ZW1lbnRzLiBDb25maWcgdmFyaWFibGVzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZXNlIGZpbGVzIGFuZCBjaGFuZ2VzCisjIHRvIGNvbmZpZyB2YXJpYWJsZXMgd2lsbCBiZSBzZWVuIGJ5IHRvcCBsZXZlbCBjb25maWcgZmlsZXMuIEluY2x1ZGluZworIyBhIGZpbGUgaXMgcHJvY2Vzc2VkIGp1c3QgbGlrZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgd2FzIGN1dCBhbmQgcGFzdGVkCisjIGludG8gdGhlIHRvcCBsZXZlbCBmaWxlLCBleGNlcHQsIHRoYXQgaW5jbHVkZSBmaWxlcyB0aGF0IGVuZCB3aXRoCisjIFRFU1RfU1RBUlQgc2VjdGlvbnMgd2lsbCBoYXZlIHRoYXQgc2VjdGlvbiBlbmRlZCBhdCB0aGUgZW5kIG9mCisjIHRoZSBpbmNsdWRlIGZpbGUuIFRoYXQgaXMsIGFuIGluY2x1ZGVkIGZpbGUgaXMgaW5jbHVkZWQgZm9sbG93ZWQKKyMgYnkgYW5vdGhlciBERUZBVUxUIGtleXdvcmQuCisjCisjIFVubGlrZSBvdGhlciBmaWxlcyByZWZlcmVuY2VkIGluIHRoaXMgY29uZmlnLCB0aGUgZmlsZSBwYXRoIGRvZXMgbm90IG5lZWQKKyMgdG8gYmUgYWJzb2x1dGUuIElmIHRoZSBmaWxlIGRvZXMgbm90IHN0YXJ0IHdpdGggJy8nLCB0aGVuIHRoZSBkaXJlY3RvcnkKKyMgdGhhdCB0aGUgY3VycmVudCBjb25maWcgZmlsZSB3YXMgbG9jYXRlZCBpbiBpcyB1c2VkLiBJZiBubyBjb25maWcgYnkgdGhlCisjIGdpdmVuIG5hbWUgaXMgZm91bmQgdGhlcmUsIHRoZW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgorIworIyBJTkNMVURFIG15ZmlsZQorIyBERUZBVUxUCisjCisjIGlzIHRoZSBzYW1lIGFzOgorIworIyBJTkNMVURFIG15ZmlsZQorIworIyBOb3RlLCBpZiB0aGUgaW5jbHVkZSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSBmdWxsIHBhdGgsIHRoZSBmaWxlIGlzCisjIHNlYXJjaGVkIGZpcnN0IGJ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgaW5jbHVkZSBmaWxlLCBhbmQgdGhlbgorIyBieSB0aGUgbG9jYXRpb24gdGhhdCBrdGVzdC5wbCB3YXMgZXhlY3V0ZWQgaW4uCisjCiAKICMjIyMgQ29uZmlnIHZhcmlhYmxlcyAjIyMjCiAjCkBAIC0yNTMsOSArMzc1LDEwIEBACiAKICMgVGhlIGRlZmF1bHQgdGVzdCB0eXBlIChkZWZhdWx0IHRlc3QpCiAjIFRoZSB0ZXN0IHR5cGVzIG1heSBiZToKLSMgICBidWlsZCAtIG9ubHkgYnVpbGQgdGhlIGtlcm5lbCwgZG8gbm90aGluZyBlbHNlCi0jICAgYm9vdCAtIGJ1aWxkIGFuZCBib290IHRoZSBrZXJuZWwKLSMgICB0ZXN0IC0gYnVpbGQsIGJvb3QgYW5kIGlmIFRFU1QgaXMgc2V0LCBydW4gdGhlIHRlc3Qgc2NyaXB0CisjICAgYnVpbGQgICAtIG9ubHkgYnVpbGQgdGhlIGtlcm5lbCwgZG8gbm90aGluZyBlbHNlCisjICAgaW5zdGFsbCAtIGJ1aWxkIGFuZCBpbnN0YWxsLCBidXQgZG8gbm90aGluZyBlbHNlIChkb2VzIG5vdCByZWJvb3QpCisjICAgYm9vdCAgICAtIGJ1aWxkLCBpbnN0YWxsLCBhbmQgYm9vdCB0aGUga2VybmVsCisjICAgdGVzdCAgICAtIGJ1aWxkLCBib290IGFuZCBpZiBURVNUIGlzIHNldCwgcnVuIHRoZSB0ZXN0IHNjcmlwdAogIyAgICAgICAgICAoSWYgVEVTVCBpcyBub3Qgc2V0LCBpdCBkZWZhdWx0cyBiYWNrIHRvIGJvb3QpCiAjICAgYmlzZWN0IC0gUGVyZm9ybSBhIGJpc2VjdCBvbiB0aGUga2VybmVsIChzZWUgQklTRUNUX1RZUEUgYmVsb3cpCiAjICAgcGF0Y2hjaGVjayAtIERvIGEgdGVzdCBvbiBhIHNlcmllcyBvZiBjb21taXRzIGluIGdpdCAoc2VlIFBBVENIQ0hFQ0sgYmVsb3cpCkBAIC0yOTMsNiArNDE2LDEzIEBACiAjIG9yIG9uIHNvbWUgc3lzdGVtczoKICNQT1NUX0lOU1RBTEwgPSBzc2ggdXNlckB0YXJnZXQgL3NiaW4vZHJhY3V0IC1mIC9ib290L2luaXRyYW1mcy10ZXN0LmltZyAkS0VSTkVMX1ZFUlNJT04KIAorIyBJZiBmb3Igc29tZSByZWFzb24geW91IGp1c3Qgd2FudCB0byBib290IHRoZSBrZXJuZWwgYW5kIHlvdSBkbyBub3QKKyMgd2FudCB0aGUgdGVzdCB0byBpbnN0YWxsIGFueXRoaW5nIG5ldy4gRm9yIGV4YW1wbGUsIHlvdSBtYXkganVzdCB3YW50CisjIHRvIGJvb3QgdGVzdCB0aGUgc2FtZSBrZXJuZWwgb3ZlciBhbmQgb3ZlciBhbmQgZG8gbm90IHdhbnQgdG8gZ28gdGhyb3VnaAorIyB0aGUgaGFzc2xlIG9mIGluc3RhbGxpbmcgYW55dGhpbmcsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIDEKKyMgKGRlZmF1bHQgMCkKKyNOT19JTlNUQUxMID0gMQorCiAjIElmIHRoZXJlIGlzIGEgc2NyaXB0IHRoYXQgeW91IHJlcXVpcmUgdG8gcnVuIGJlZm9yZSB0aGUgYnVpbGQgaXMgZG9uZQogIyB5b3UgY2FuIHNwZWNpZnkgaXQgd2l0aCBQUkVfQlVJTEQuCiAjCkBAIC00MTUsNiArNTQ1LDE0IEBACiAjIChkZWZhdWx0ICJsb2dpbjoiKQogI1NVQ0NFU1NfTElORSA9IGxvZ2luOgogCisjIFRvIHNwZWVkIHVwIGJldHdlZW4gcmVib290cywgZGVmaW5pbmcgYSBsaW5lIHRoYXQgdGhlCisjIGRlZmF1bHQga2VybmVsIHByb2R1Y2VzIHRoYXQgcmVwcmVzZW50cyB0aGF0IHRoZSBkZWZhdWx0CisjIGtlcm5lbCBoYXMgc3VjY2Vzc2Z1bGx5IGJvb3RlZCBhbmQgY2FuIGJlIHVzZWQgdG8gcGFzcworIyBhIG5ldyB0ZXN0IGtlcm5lbCB0byBpdC4gT3RoZXJ3aXNlIGt0ZXN0LnBsIHdpbGwgd2FpdCB0aWxsCisjIFNMRUVQX1RJTUUgdG8gY29udGludWUuCisjIChkZWZhdWx0IHVuZGVmaW5lZCkKKyNSRUJPT1RfU1VDQ0VTU19MSU5FID0gbG9naW46CisKICMgSW4gY2FzZSB0aGUgY29uc29sZSBjb25zdGFudGx5IGZpbGxzIHRoZSBzY3JlZW4sIGhhdmluZwogIyBhIHNwZWNpZmllZCB0aW1lIHRvIHN0b3AgdGhlIHRlc3QgYWZ0ZXIgc3VjY2VzcyBpcyByZWNvbW1lbmRlZC4KICMgKGluIHNlY29uZHMpCkBAIC00ODAsNiArNjE4LDggQEAKICMgYW5vdGhlciB0ZXN0LiBJZiBhIHJlYm9vdCB0byB0aGUgcmVsaWFibGUga2VybmVsIGhhcHBlbnMsCiAjIHdlIHdhaXQgU0xFRVBfVElNRSBmb3IgdGhlIGNvbnNvbGUgdG8gc3RvcCBwcm9kdWNpbmcgb3V0cHV0CiAjIGJlZm9yZSBzdGFydGluZyB0aGUgbmV4dCB0ZXN0LgorIworIyBZb3UgY2FuIHNwZWVkIHVwIHJlYm9vdCB0aW1lcyBldmVuIG1vcmUgYnkgc2V0dGluZyBSRUJPT1RfU1VDQ0VTU19MSU5FLgogIyAoZGVmYXVsdCA2MCkKICNTTEVFUF9USU1FID0gNjAKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXNzaWduZWQtZGV2LmMgYi92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYwppbmRleCBlYWYzYTUwLi4zYWQwOTI1IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYworKysgYi92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYwpAQCAtNTgsOCArNTgsNiBAQAogc3RhdGljIGlycXJldHVybl90IGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldiA9IGRldl9pZDsKLQl1MzIgdmVjdG9yOwotCWludCBpbmRleDsKIAogCWlmIChhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9ERVZfSVJRX0hPU1RfSU5UWCkgewogCQlzcGluX2xvY2soJmFzc2lnbmVkX2Rldi0+aW50eF9sb2NrKTsKQEAgLTY4LDMxICs2NiwzNSBAQAogCQlzcGluX3VubG9jaygmYXNzaWduZWRfZGV2LT5pbnR4X2xvY2spOwogCX0KIAotCWlmIChhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9ERVZfSVJRX0hPU1RfTVNJWCkgewotCQlpbmRleCA9IGZpbmRfaW5kZXhfZnJvbV9ob3N0X2lycShhc3NpZ25lZF9kZXYsIGlycSk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQl2ZWN0b3IgPSBhc3NpZ25lZF9kZXYtPgotCQkJCQlndWVzdF9tc2l4X2VudHJpZXNbaW5kZXhdLnZlY3RvcjsKLQkJCWt2bV9zZXRfaXJxKGFzc2lnbmVkX2Rldi0+a3ZtLAotCQkJCSAgICBhc3NpZ25lZF9kZXYtPmlycV9zb3VyY2VfaWQsIHZlY3RvciwgMSk7Ci0JCX0KLQl9IGVsc2UKLQkJa3ZtX3NldF9pcnEoYXNzaWduZWRfZGV2LT5rdm0sIGFzc2lnbmVkX2Rldi0+aXJxX3NvdXJjZV9pZCwKLQkJCSAgICBhc3NpZ25lZF9kZXYtPmd1ZXN0X2lycSwgMSk7CisJa3ZtX3NldF9pcnEoYXNzaWduZWRfZGV2LT5rdm0sIGFzc2lnbmVkX2Rldi0+aXJxX3NvdXJjZV9pZCwKKwkJICAgIGFzc2lnbmVkX2Rldi0+Z3Vlc3RfaXJxLCAxKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorI2lmZGVmIF9fS1ZNX0hBVkVfTVNJWAorc3RhdGljIGlycXJldHVybl90IGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkX21zaXgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqYXNzaWduZWRfZGV2ID0gZGV2X2lkOworCWludCBpbmRleCA9IGZpbmRfaW5kZXhfZnJvbV9ob3N0X2lycShhc3NpZ25lZF9kZXYsIGlycSk7CisJdTMyIHZlY3RvcjsKKworCWlmIChpbmRleCA+PSAwKSB7CisJCXZlY3RvciA9IGFzc2lnbmVkX2Rldi0+Z3Vlc3RfbXNpeF9lbnRyaWVzW2luZGV4XS52ZWN0b3I7CisJCWt2bV9zZXRfaXJxKGFzc2lnbmVkX2Rldi0+a3ZtLCBhc3NpZ25lZF9kZXYtPmlycV9zb3VyY2VfaWQsCisJCQkgICAgdmVjdG9yLCAxKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKKwogLyogQWNrIHRoZSBpcnEgbGluZSBmb3IgYW4gYXNzaWduZWQgZGV2aWNlICovCiBzdGF0aWMgdm9pZCBrdm1fYXNzaWduZWRfZGV2X2Fja19pcnEoc3RydWN0IGt2bV9pcnFfYWNrX25vdGlmaWVyICpraWFuKQogewotCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqZGV2OwotCi0JaWYgKGtpYW4tPmdzaSA9PSAtMSkKLQkJcmV0dXJuOwotCi0JZGV2ID0gY29udGFpbmVyX29mKGtpYW4sIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCwKLQkJCSAgIGFja19ub3RpZmllcik7CisJc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICpkZXYgPQorCQljb250YWluZXJfb2Yoa2lhbiwgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsLAorCQkJICAgICBhY2tfbm90aWZpZXIpOwogCiAJa3ZtX3NldF9pcnEoZGV2LT5rdm0sIGRldi0+aXJxX3NvdXJjZV9pZCwgZGV2LT5ndWVzdF9pcnEsIDApOwogCkBAIC0xMTAsOCArMTEyLDkgQEAKIHN0YXRpYyB2b2lkIGRlYXNzaWduX2d1ZXN0X2lycShzdHJ1Y3Qga3ZtICprdm0sCiAJCQkgICAgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICphc3NpZ25lZF9kZXYpCiB7Ci0Ja3ZtX3VucmVnaXN0ZXJfaXJxX2Fja19ub3RpZmllcihrdm0sICZhc3NpZ25lZF9kZXYtPmFja19ub3RpZmllcik7Ci0JYXNzaWduZWRfZGV2LT5hY2tfbm90aWZpZXIuZ3NpID0gLTE7CisJaWYgKGFzc2lnbmVkX2Rldi0+YWNrX25vdGlmaWVyLmdzaSAhPSAtMSkKKwkJa3ZtX3VucmVnaXN0ZXJfaXJxX2Fja19ub3RpZmllcihrdm0sCisJCQkJCQkmYXNzaWduZWRfZGV2LT5hY2tfbm90aWZpZXIpOwogCiAJa3ZtX3NldF9pcnEoYXNzaWduZWRfZGV2LT5rdm0sIGFzc2lnbmVkX2Rldi0+aXJxX3NvdXJjZV9pZCwKIAkJICAgIGFzc2lnbmVkX2Rldi0+Z3Vlc3RfaXJxLCAwKTsKQEAgLTE0Myw3ICsxNDYsNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBhc3NpZ25lZF9kZXYtPmVudHJpZXNfbnI7IGkrKykKIAkJCWZyZWVfaXJxKGFzc2lnbmVkX2Rldi0+aG9zdF9tc2l4X2VudHJpZXNbaV0udmVjdG9yLAotCQkJCSAodm9pZCAqKWFzc2lnbmVkX2Rldik7CisJCQkJIGFzc2lnbmVkX2Rldik7CiAKIAkJYXNzaWduZWRfZGV2LT5lbnRyaWVzX25yID0gMDsKIAkJa2ZyZWUoYXNzaWduZWRfZGV2LT5ob3N0X21zaXhfZW50cmllcyk7CkBAIC0xNTMsNyArMTU2LDcgQEAKIAkJLyogRGVhbCB3aXRoIE1TSSBhbmQgSU5UeCAqLwogCQlkaXNhYmxlX2lycShhc3NpZ25lZF9kZXYtPmhvc3RfaXJxKTsKIAotCQlmcmVlX2lycShhc3NpZ25lZF9kZXYtPmhvc3RfaXJxLCAodm9pZCAqKWFzc2lnbmVkX2Rldik7CisJCWZyZWVfaXJxKGFzc2lnbmVkX2Rldi0+aG9zdF9pcnEsIGFzc2lnbmVkX2Rldik7CiAKIAkJaWYgKGFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfSE9TVF9NU0kpCiAJCQlwY2lfZGlzYWJsZV9tc2koYXNzaWduZWRfZGV2LT5kZXYpOwpAQCAtMjM5LDcgKzI0Miw3IEBACiAJICogYXJlIGdvaW5nIHRvIGJlIGxvbmcgZGVsYXlzIGluIGFjY2VwdGluZywgYWNraW5nLCBldGMuCiAJICovCiAJaWYgKHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+aG9zdF9pcnEsIE5VTEwsIGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkLAotCQkJCSBJUlFGX09ORVNIT1QsIGRldi0+aXJxX25hbWUsICh2b2lkICopZGV2KSkKKwkJCQkgSVJRRl9PTkVTSE9ULCBkZXYtPmlycV9uYW1lLCBkZXYpKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KQEAgLTI1OCw3ICsyNjEsNyBAQAogCiAJZGV2LT5ob3N0X2lycSA9IGRldi0+ZGV2LT5pcnE7CiAJaWYgKHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+aG9zdF9pcnEsIE5VTEwsIGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkLAotCQkJCSAwLCBkZXYtPmlycV9uYW1lLCAodm9pZCAqKWRldikpIHsKKwkJCQkgMCwgZGV2LT5pcnFfbmFtZSwgZGV2KSkgewogCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5kZXYpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yODQsOCArMjg3LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPmVudHJpZXNfbnI7IGkrKykgewogCQlyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LT5ob3N0X21zaXhfZW50cmllc1tpXS52ZWN0b3IsCi0JCQkJCSBOVUxMLCBrdm1fYXNzaWduZWRfZGV2X3RocmVhZCwKLQkJCQkJIDAsIGRldi0+aXJxX25hbWUsICh2b2lkICopZGV2KTsKKwkJCQkJIE5VTEwsIGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkX21zaXgsCisJCQkJCSAwLCBkZXYtPmlycV9uYW1lLCBkZXYpOwogCQlpZiAocikKIAkJCWdvdG8gZXJyOwogCX0KQEAgLTI5Myw3ICsyOTYsNyBAQAogCXJldHVybiAwOwogZXJyOgogCWZvciAoaSAtPSAxOyBpID49IDA7IGktLSkKLQkJZnJlZV9pcnEoZGV2LT5ob3N0X21zaXhfZW50cmllc1tpXS52ZWN0b3IsICh2b2lkICopZGV2KTsKKwkJZnJlZV9pcnEoZGV2LT5ob3N0X21zaXhfZW50cmllc1tpXS52ZWN0b3IsIGRldik7CiAJcGNpX2Rpc2FibGVfbXNpeChkZXYtPmRldik7CiAJcmV0dXJuIHI7CiB9CkBAIC00MDYsNyArNDA5LDggQEAKIAogCWlmICghcikgewogCQlkZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSB8PSBndWVzdF9pcnFfdHlwZTsKLQkJa3ZtX3JlZ2lzdGVyX2lycV9hY2tfbm90aWZpZXIoa3ZtLCAmZGV2LT5hY2tfbm90aWZpZXIpOworCQlpZiAoZGV2LT5hY2tfbm90aWZpZXIuZ3NpICE9IC0xKQorCQkJa3ZtX3JlZ2lzdGVyX2lycV9hY2tfbm90aWZpZXIoa3ZtLCAmZGV2LT5hY2tfbm90aWZpZXIpOwogCX0gZWxzZQogCQlrdm1fZnJlZV9pcnFfc291cmNlX2lkKGt2bSwgZGV2LT5pcnFfc291cmNlX2lkKTsKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vY29hbGVzY2VkX21taW8uYyBiL3ZpcnQva3ZtL2NvYWxlc2NlZF9tbWlvLmMKaW5kZXggZmM4NDg3NS4uYTZlYzIwNiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vY29hbGVzY2VkX21taW8uYworKysgYi92aXJ0L2t2bS9jb2FsZXNjZWRfbW1pby5jCkBAIC0yNCwxMCArMjQsMTkgQEAKIHN0YXRpYyBpbnQgY29hbGVzY2VkX21taW9faW5fcmFuZ2Uoc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldiwKIAkJCQkgICBncGFfdCBhZGRyLCBpbnQgbGVuKQogewotCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fem9uZSAqem9uZTsKKwkvKiBpcyBpdCBpbiBhIGJhdGNoYWJsZSBhcmVhID8KKwkgKiAoYWRkcixsZW4pIGlzIGZ1bGx5IGluY2x1ZGVkIGluCisJICogKHpvbmUtPmFkZHIsIHpvbmUtPnNpemUpCisJICovCisKKwlyZXR1cm4gKGRldi0+em9uZS5hZGRyIDw9IGFkZHIgJiYKKwkJYWRkciArIGxlbiA8PSBkZXYtPnpvbmUuYWRkciArIGRldi0+em9uZS5zaXplKTsKK30KKworc3RhdGljIGludCBjb2FsZXNjZWRfbW1pb19oYXNfcm9vbShzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX2RldiAqZGV2KQorewogCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fcmluZyAqcmluZzsKIAl1bnNpZ25lZCBhdmFpbDsKLQlpbnQgaTsKIAogCS8qIEFyZSB3ZSBhYmxlIHRvIGJhdGNoIGl0ID8gKi8KIApAQCAtMzcsMjUgKzQ2LDEyIEBACiAJICovCiAJcmluZyA9IGRldi0+a3ZtLT5jb2FsZXNjZWRfbW1pb19yaW5nOwogCWF2YWlsID0gKHJpbmctPmZpcnN0IC0gcmluZy0+bGFzdCAtIDEpICUgS1ZNX0NPQUxFU0NFRF9NTUlPX01BWDsKLQlpZiAoYXZhaWwgPCBLVk1fTUFYX1ZDUFVTKSB7CisJaWYgKGF2YWlsID09IDApIHsKIAkJLyogZnVsbCAqLwogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBpcyBpdCBpbiBhIGJhdGNoYWJsZSBhcmVhID8gKi8KLQotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5iX3pvbmVzOyBpKyspIHsKLQkJem9uZSA9ICZkZXYtPnpvbmVbaV07Ci0KLQkJLyogKGFkZHIsbGVuKSBpcyBmdWxseSBpbmNsdWRlZCBpbgotCQkgKiAoem9uZS0+YWRkciwgem9uZS0+c2l6ZSkKLQkJICovCi0KLQkJaWYgKHpvbmUtPmFkZHIgPD0gYWRkciAmJgotCQkgICAgYWRkciArIGxlbiA8PSB6b25lLT5hZGRyICsgem9uZS0+c2l6ZSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBjb2FsZXNjZWRfbW1pb193cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKQEAgLTYzLDEwICs1OSwxNiBAQAogewogCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fZGV2ICpkZXYgPSB0b19tbWlvKHRoaXMpOwogCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fcmluZyAqcmluZyA9IGRldi0+a3ZtLT5jb2FsZXNjZWRfbW1pb19yaW5nOworCiAJaWYgKCFjb2FsZXNjZWRfbW1pb19pbl9yYW5nZShkZXYsIGFkZHIsIGxlbikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKKwlzcGluX2xvY2soJmRldi0+a3ZtLT5yaW5nX2xvY2spOworCisJaWYgKCFjb2FsZXNjZWRfbW1pb19oYXNfcm9vbShkZXYpKSB7CisJCXNwaW5fdW5sb2NrKCZkZXYtPmt2bS0+cmluZ19sb2NrKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIAogCS8qIGNvcHkgZGF0YSBpbiBmaXJzdCBmcmVlIGVudHJ5IG9mIHRoZSByaW5nICovCiAKQEAgLTc1LDcgKzc3LDcgQEAKIAltZW1jcHkocmluZy0+Y29hbGVzY2VkX21taW9bcmluZy0+bGFzdF0uZGF0YSwgdmFsLCBsZW4pOwogCXNtcF93bWIoKTsKIAlyaW5nLT5sYXN0ID0gKHJpbmctPmxhc3QgKyAxKSAlIEtWTV9DT0FMRVNDRURfTU1JT19NQVg7Ci0Jc3Bpbl91bmxvY2soJmRldi0+bG9jayk7CisJc3Bpbl91bmxvY2soJmRldi0+a3ZtLT5yaW5nX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC04Myw2ICs4NSw4IEBACiB7CiAJc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldiA9IHRvX21taW8odGhpcyk7CiAKKwlsaXN0X2RlbCgmZGV2LT5saXN0KTsKKwogCWtmcmVlKGRldik7CiB9CiAKQEAgLTkzLDcgKzk3LDYgQEAKIAogaW50IGt2bV9jb2FsZXNjZWRfbW1pb19pbml0KHN0cnVjdCBrdm0gKmt2bSkKIHsKLQlzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX2RldiAqZGV2OwogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCByZXQ7CiAKQEAgLTEwMSwzMSArMTA0LDE4IEBACiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOwogCWlmICghcGFnZSkKIAkJZ290byBvdXRfZXJyOworCisJcmV0ID0gMDsKIAlrdm0tPmNvYWxlc2NlZF9tbWlvX3JpbmcgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAKLQlyZXQgPSAtRU5PTUVNOwotCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCWdvdG8gb3V0X2ZyZWVfcGFnZTsKLQlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKLQlrdm1faW9kZXZpY2VfaW5pdCgmZGV2LT5kZXYsICZjb2FsZXNjZWRfbW1pb19vcHMpOwotCWRldi0+a3ZtID0ga3ZtOwotCWt2bS0+Y29hbGVzY2VkX21taW9fZGV2ID0gZGV2OworCS8qCisJICogV2UncmUgdXNpbmcgdGhpcyBzcGlubG9jayB0byBzeW5jIGFjY2VzcyB0byB0aGUgY29hbGVzY2VkIHJpbmcuCisJICogVGhlIGxpc3QgZG9lc24ndCBuZWVkIGl0J3Mgb3duIGxvY2sgc2luY2UgZGV2aWNlIHJlZ2lzdHJhdGlvbiBhbmQKKwkgKiB1bnJlZ2lzdHJhdGlvbiBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBrdm0tPnNsb3RzX2xvY2sgaXMgaGVsZC4KKwkgKi8KKwlzcGluX2xvY2tfaW5pdCgma3ZtLT5yaW5nX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZrdm0tPmNvYWxlc2NlZF96b25lcyk7CiAKLQltdXRleF9sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwotCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX01NSU9fQlVTLCAmZGV2LT5kZXYpOwotCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZV9kZXY7Ci0KLQlyZXR1cm4gcmV0OwotCi1vdXRfZnJlZV9kZXY6Ci0Ja3ZtLT5jb2FsZXNjZWRfbW1pb19kZXYgPSBOVUxMOwotCWtmcmVlKGRldik7Ci1vdXRfZnJlZV9wYWdlOgotCWt2bS0+Y29hbGVzY2VkX21taW9fcmluZyA9IE5VTEw7Ci0JX19mcmVlX3BhZ2UocGFnZSk7CiBvdXRfZXJyOgogCXJldHVybiByZXQ7CiB9CkBAIC0xMzksNTEgKzEyOSw1MCBAQAogaW50IGt2bV92bV9pb2N0bF9yZWdpc3Rlcl9jb2FsZXNjZWRfbW1pbyhzdHJ1Y3Qga3ZtICprdm0sCiAJCQkJCSBzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUgKnpvbmUpCiB7Ci0Jc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldiA9IGt2bS0+Y29hbGVzY2VkX21taW9fZGV2OworCWludCByZXQ7CisJc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldjsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJa3ZtX2lvZGV2aWNlX2luaXQoJmRldi0+ZGV2LCAmY29hbGVzY2VkX21taW9fb3BzKTsKKwlkZXYtPmt2bSA9IGt2bTsKKwlkZXYtPnpvbmUgPSAqem9uZTsKKworCW11dGV4X2xvY2soJmt2bS0+c2xvdHNfbG9jayk7CisJcmV0ID0ga3ZtX2lvX2J1c19yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fTU1JT19CVVMsIHpvbmUtPmFkZHIsCisJCQkJICAgICAgem9uZS0+c2l6ZSwgJmRldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfZnJlZV9kZXY7CisJbGlzdF9hZGRfdGFpbCgmZGV2LT5saXN0LCAma3ZtLT5jb2FsZXNjZWRfem9uZXMpOworCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKKworCXJldHVybiByZXQ7CisKK291dF9mcmVlX2RldjoKKwltdXRleF91bmxvY2soJmt2bS0+c2xvdHNfbG9jayk7CisKKwlrZnJlZShkZXYpOwogCiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwogCi0JbXV0ZXhfbG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlpZiAoZGV2LT5uYl96b25lcyA+PSBLVk1fQ09BTEVTQ0VEX01NSU9fWk9ORV9NQVgpIHsKLQkJbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwotCQlyZXR1cm4gLUVOT0JVRlM7Ci0JfQotCi0JZGV2LT56b25lW2Rldi0+bmJfem9uZXNdID0gKnpvbmU7Ci0JZGV2LT5uYl96b25lcysrOwotCi0JbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCXJldHVybiAwOwogfQogCiBpbnQga3ZtX3ZtX2lvY3RsX3VucmVnaXN0ZXJfY29hbGVzY2VkX21taW8oc3RydWN0IGt2bSAqa3ZtLAogCQkJCQkgICBzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUgKnpvbmUpCiB7Ci0JaW50IGk7Ci0Jc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldiA9IGt2bS0+Y29hbGVzY2VkX21taW9fZGV2OwotCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fem9uZSAqejsKLQotCWlmIChkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTlhJTzsKKwlzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX2RldiAqZGV2LCAqdG1wOwogCiAJbXV0ZXhfbG9jaygma3ZtLT5zbG90c19sb2NrKTsKIAotCWkgPSBkZXYtPm5iX3pvbmVzOwotCXdoaWxlIChpKSB7Ci0JCXogPSAmZGV2LT56b25lW2kgLSAxXTsKLQotCQkvKiB1bnJlZ2lzdGVyIGFsbCB6b25lcwotCQkgKiBpbmNsdWRlZCBpbiAoem9uZS0+YWRkciwgem9uZS0+c2l6ZSkKLQkJICovCi0KLQkJaWYgKHpvbmUtPmFkZHIgPD0gei0+YWRkciAmJgotCQkgICAgei0+YWRkciArIHotPnNpemUgPD0gem9uZS0+YWRkciArIHpvbmUtPnNpemUpIHsKLQkJCWRldi0+bmJfem9uZXMtLTsKLQkJCSp6ID0gZGV2LT56b25lW2Rldi0+bmJfem9uZXNdOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmt2bS0+Y29hbGVzY2VkX3pvbmVzLCBsaXN0KQorCQlpZiAoY29hbGVzY2VkX21taW9faW5fcmFuZ2UoZGV2LCB6b25lLT5hZGRyLCB6b25lLT5zaXplKSkgeworCQkJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9NTUlPX0JVUywgJmRldi0+ZGV2KTsKKwkJCWt2bV9pb2RldmljZV9kZXN0cnVjdG9yKCZkZXYtPmRldik7CiAJCX0KLQkJaS0tOwotCX0KIAogCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vY29hbGVzY2VkX21taW8uaCBiL3ZpcnQva3ZtL2NvYWxlc2NlZF9tbWlvLmgKaW5kZXggOGE1OTU5ZS4uYjI4MGMyMCAxMDA2NDQKLS0tIGEvdmlydC9rdm0vY29hbGVzY2VkX21taW8uaAorKysgYi92aXJ0L2t2bS9jb2FsZXNjZWRfbW1pby5oCkBAIC0xMiwxNCArMTIsMTMgQEAKIAogI2lmZGVmIENPTkZJR19LVk1fTU1JTwogCi0jZGVmaW5lIEtWTV9DT0FMRVNDRURfTU1JT19aT05FX01BWCAxMDAKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKIHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGt2bV9pb19kZXZpY2UgZGV2OwogCXN0cnVjdCBrdm0gKmt2bTsKLQlzcGlubG9ja190IGxvY2s7Ci0JaW50IG5iX3pvbmVzOwotCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fem9uZSB6b25lW0tWTV9DT0FMRVNDRURfTU1JT19aT05FX01BWF07CisJc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb196b25lIHpvbmU7CiB9OwogCiBpbnQga3ZtX2NvYWxlc2NlZF9tbWlvX2luaXQoc3RydWN0IGt2bSAqa3ZtKTsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2V2ZW50ZmQuYyBiL3ZpcnQva3ZtL2V2ZW50ZmQuYwppbmRleCA3MzM1OGQyLi5mNTljMWU4IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9ldmVudGZkLmMKKysrIGIvdmlydC9rdm0vZXZlbnRmZC5jCkBAIC01ODYsNyArNTg2LDggQEAKIAogCWt2bV9pb2RldmljZV9pbml0KCZwLT5kZXYsICZpb2V2ZW50ZmRfb3BzKTsKIAotCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgYnVzX2lkeCwgJnAtPmRldik7CisJcmV0ID0ga3ZtX2lvX2J1c19yZWdpc3Rlcl9kZXYoa3ZtLCBidXNfaWR4LCBwLT5hZGRyLCBwLT5sZW5ndGgsCisJCQkJICAgICAgJnAtPmRldik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gdW5sb2NrX2ZhaWw7CiAKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2lvYXBpYy5jIGIvdmlydC9rdm0vaW9hcGljLmMKaW5kZXggOGRmMWNhMS4uM2VlZDYxZSAxMDA2NDQKLS0tIGEvdmlydC9rdm0vaW9hcGljLmMKKysrIGIvdmlydC9rdm0vaW9hcGljLmMKQEAgLTM5NCw3ICszOTQsOCBAQAogCWt2bV9pb2RldmljZV9pbml0KCZpb2FwaWMtPmRldiwgJmlvYXBpY19tbWlvX29wcyk7CiAJaW9hcGljLT5rdm0gPSBrdm07CiAJbXV0ZXhfbG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9NTUlPX0JVUywgJmlvYXBpYy0+ZGV2KTsKKwlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9NTUlPX0JVUywgaW9hcGljLT5iYXNlX2FkZHJlc3MsCisJCQkJICAgICAgSU9BUElDX01FTV9MRU5HVEgsICZpb2FwaWMtPmRldik7CiAJbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCWlmIChyZXQgPCAwKSB7CiAJCWt2bS0+YXJjaC52aW9hcGljID0gTlVMTDsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2lvbW11LmMgYi92aXJ0L2t2bS9pb21tdS5jCmluZGV4IDk2N2FiYTEuLmExOTVjMDcgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2lvbW11LmMKKysrIGIvdmlydC9rdm0vaW9tbXUuYwpAQCAtMjUsNyArMjUsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYXIuaD4KICNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVsLWlvbW11Lmg+CkBAIC0yMzIsMTIgKzIzNCwxMiBAQAogewogCWludCByOwogCi0JaWYgKCFpb21tdV9mb3VuZCgpKSB7CisJaWYgKCFpb21tdV9wcmVzZW50KCZwY2lfYnVzX3R5cGUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlvbW11IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlrdm0tPmFyY2guaW9tbXVfZG9tYWluID0gaW9tbXVfZG9tYWluX2FsbG9jKCk7CisJa3ZtLT5hcmNoLmlvbW11X2RvbWFpbiA9IGlvbW11X2RvbWFpbl9hbGxvYygmcGNpX2J1c190eXBlKTsKIAlpZiAoIWt2bS0+YXJjaC5pb21tdV9kb21haW4pCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCBhZWZkZGEzLi5kOWNmYjc4IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTQ3LDYgKzQ3LDggQEAKICNpbmNsdWRlIDxsaW51eC9zcmN1Lmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYnNlYXJjaC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMjM5MSwyNCArMjM5Myw5MiBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGJ1cy0+ZGV2X2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGt2bV9pb19kZXZpY2UgKnBvcyA9IGJ1cy0+ZGV2c1tpXTsKKwkJc3RydWN0IGt2bV9pb19kZXZpY2UgKnBvcyA9IGJ1cy0+cmFuZ2VbaV0uZGV2OwogCiAJCWt2bV9pb2RldmljZV9kZXN0cnVjdG9yKHBvcyk7CiAJfQogCWtmcmVlKGJ1cyk7CiB9CiAKK2ludCBrdm1faW9fYnVzX3NvcnRfY21wKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwljb25zdCBzdHJ1Y3Qga3ZtX2lvX3JhbmdlICpyMSA9IHAxOworCWNvbnN0IHN0cnVjdCBrdm1faW9fcmFuZ2UgKnIyID0gcDI7CisKKwlpZiAocjEtPmFkZHIgPCByMi0+YWRkcikKKwkJcmV0dXJuIC0xOworCWlmIChyMS0+YWRkciArIHIxLT5sZW4gPiByMi0+YWRkciArIHIyLT5sZW4pCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQga3ZtX2lvX2J1c19pbnNlcnRfZGV2KHN0cnVjdCBrdm1faW9fYnVzICpidXMsIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsCisJCQkgIGdwYV90IGFkZHIsIGludCBsZW4pCit7CisJaWYgKGJ1cy0+ZGV2X2NvdW50ID09IE5SX0lPQlVTX0RFVlMpCisJCXJldHVybiAtRU5PU1BDOworCisJYnVzLT5yYW5nZVtidXMtPmRldl9jb3VudCsrXSA9IChzdHJ1Y3Qga3ZtX2lvX3JhbmdlKSB7CisJCS5hZGRyID0gYWRkciwKKwkJLmxlbiA9IGxlbiwKKwkJLmRldiA9IGRldiwKKwl9OworCisJc29ydChidXMtPnJhbmdlLCBidXMtPmRldl9jb3VudCwgc2l6ZW9mKHN0cnVjdCBrdm1faW9fcmFuZ2UpLAorCQlrdm1faW9fYnVzX3NvcnRfY21wLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitpbnQga3ZtX2lvX2J1c19nZXRfZmlyc3RfZGV2KHN0cnVjdCBrdm1faW9fYnVzICpidXMsCisJCQkgICAgIGdwYV90IGFkZHIsIGludCBsZW4pCit7CisJc3RydWN0IGt2bV9pb19yYW5nZSAqcmFuZ2UsIGtleTsKKwlpbnQgb2ZmOworCisJa2V5ID0gKHN0cnVjdCBrdm1faW9fcmFuZ2UpIHsKKwkJLmFkZHIgPSBhZGRyLAorCQkubGVuID0gbGVuLAorCX07CisKKwlyYW5nZSA9IGJzZWFyY2goJmtleSwgYnVzLT5yYW5nZSwgYnVzLT5kZXZfY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGt2bV9pb19yYW5nZSksIGt2bV9pb19idXNfc29ydF9jbXApOworCWlmIChyYW5nZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW9mZiA9IHJhbmdlIC0gYnVzLT5yYW5nZTsKKworCXdoaWxlIChvZmYgPiAwICYmIGt2bV9pb19idXNfc29ydF9jbXAoJmtleSwgJmJ1cy0+cmFuZ2Vbb2ZmLTFdKSA9PSAwKQorCQlvZmYtLTsKKworCXJldHVybiBvZmY7Cit9CisKIC8qIGt2bV9pb19idXNfd3JpdGUgLSBjYWxsZWQgdW5kZXIga3ZtLT5zbG90c19sb2NrICovCiBpbnQga3ZtX2lvX2J1c193cml0ZShzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAogCQkgICAgIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCkKIHsKLQlpbnQgaTsKKwlpbnQgaWR4OwogCXN0cnVjdCBrdm1faW9fYnVzICpidXM7CisJc3RydWN0IGt2bV9pb19yYW5nZSByYW5nZTsKKworCXJhbmdlID0gKHN0cnVjdCBrdm1faW9fcmFuZ2UpIHsKKwkJLmFkZHIgPSBhZGRyLAorCQkubGVuID0gbGVuLAorCX07CiAKIAlidXMgPSBzcmN1X2RlcmVmZXJlbmNlKGt2bS0+YnVzZXNbYnVzX2lkeF0sICZrdm0tPnNyY3UpOwotCWZvciAoaSA9IDA7IGkgPCBidXMtPmRldl9jb3VudDsgaSsrKQotCQlpZiAoIWt2bV9pb2RldmljZV93cml0ZShidXMtPmRldnNbaV0sIGFkZHIsIGxlbiwgdmFsKSkKKwlpZHggPSBrdm1faW9fYnVzX2dldF9maXJzdF9kZXYoYnVzLCBhZGRyLCBsZW4pOworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl3aGlsZSAoaWR4IDwgYnVzLT5kZXZfY291bnQgJiYKKwkJa3ZtX2lvX2J1c19zb3J0X2NtcCgmcmFuZ2UsICZidXMtPnJhbmdlW2lkeF0pID09IDApIHsKKwkJaWYgKCFrdm1faW9kZXZpY2Vfd3JpdGUoYnVzLT5yYW5nZVtpZHhdLmRldiwgYWRkciwgbGVuLCB2YWwpKQogCQkJcmV0dXJuIDA7CisJCWlkeCsrOworCX0KKwogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIApAQCAtMjQxNiwxOSArMjQ4NiwzMyBAQAogaW50IGt2bV9pb19idXNfcmVhZChzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAogCQkgICAgaW50IGxlbiwgdm9pZCAqdmFsKQogewotCWludCBpOworCWludCBpZHg7CiAJc3RydWN0IGt2bV9pb19idXMgKmJ1czsKKwlzdHJ1Y3Qga3ZtX2lvX3JhbmdlIHJhbmdlOworCisJcmFuZ2UgPSAoc3RydWN0IGt2bV9pb19yYW5nZSkgeworCQkuYWRkciA9IGFkZHIsCisJCS5sZW4gPSBsZW4sCisJfTsKIAogCWJ1cyA9IHNyY3VfZGVyZWZlcmVuY2Uoa3ZtLT5idXNlc1tidXNfaWR4XSwgJmt2bS0+c3JjdSk7Ci0JZm9yIChpID0gMDsgaSA8IGJ1cy0+ZGV2X2NvdW50OyBpKyspCi0JCWlmICgha3ZtX2lvZGV2aWNlX3JlYWQoYnVzLT5kZXZzW2ldLCBhZGRyLCBsZW4sIHZhbCkpCisJaWR4ID0ga3ZtX2lvX2J1c19nZXRfZmlyc3RfZGV2KGJ1cywgYWRkciwgbGVuKTsKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJd2hpbGUgKGlkeCA8IGJ1cy0+ZGV2X2NvdW50ICYmCisJCWt2bV9pb19idXNfc29ydF9jbXAoJnJhbmdlLCAmYnVzLT5yYW5nZVtpZHhdKSA9PSAwKSB7CisJCWlmICgha3ZtX2lvZGV2aWNlX3JlYWQoYnVzLT5yYW5nZVtpZHhdLmRldiwgYWRkciwgbGVuLCB2YWwpKQogCQkJcmV0dXJuIDA7CisJCWlkeCsrOworCX0KKwogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAogLyogQ2FsbGVyIG11c3QgaG9sZCBzbG90c19sb2NrLiAqLwotaW50IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KHN0cnVjdCBrdm0gKmt2bSwgZW51bSBrdm1fYnVzIGJ1c19pZHgsCi0JCQkgICAgc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldikKK2ludCBrdm1faW9fYnVzX3JlZ2lzdGVyX2RldihzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAorCQkJICAgIGludCBsZW4sIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGt2bV9pb19idXMgKm5ld19idXMsICpidXM7CiAKQEAgLTI0NDAsNyArMjUyNCw3IEBACiAJaWYgKCFuZXdfYnVzKQogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1jcHkobmV3X2J1cywgYnVzLCBzaXplb2Yoc3RydWN0IGt2bV9pb19idXMpKTsKLQluZXdfYnVzLT5kZXZzW25ld19idXMtPmRldl9jb3VudCsrXSA9IGRldjsKKwlrdm1faW9fYnVzX2luc2VydF9kZXYobmV3X2J1cywgZGV2LCBhZGRyLCBsZW4pOwogCXJjdV9hc3NpZ25fcG9pbnRlcihrdm0tPmJ1c2VzW2J1c19pZHhdLCBuZXdfYnVzKTsKIAlzeW5jaHJvbml6ZV9zcmN1X2V4cGVkaXRlZCgma3ZtLT5zcmN1KTsKIAlrZnJlZShidXMpOwpAQCAtMjQ2NCw5ICsyNTQ4LDEzIEBACiAKIAlyID0gLUVOT0VOVDsKIAlmb3IgKGkgPSAwOyBpIDwgbmV3X2J1cy0+ZGV2X2NvdW50OyBpKyspCi0JCWlmIChuZXdfYnVzLT5kZXZzW2ldID09IGRldikgeworCQlpZiAobmV3X2J1cy0+cmFuZ2VbaV0uZGV2ID09IGRldikgewogCQkJciA9IDA7Ci0JCQluZXdfYnVzLT5kZXZzW2ldID0gbmV3X2J1cy0+ZGV2c1stLW5ld19idXMtPmRldl9jb3VudF07CisJCQluZXdfYnVzLT5kZXZfY291bnQtLTsKKwkJCW5ld19idXMtPnJhbmdlW2ldID0gbmV3X2J1cy0+cmFuZ2VbbmV3X2J1cy0+ZGV2X2NvdW50XTsKKwkJCXNvcnQobmV3X2J1cy0+cmFuZ2UsIG5ld19idXMtPmRldl9jb3VudCwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBrdm1faW9fcmFuZ2UpLAorCQkJICAgICBrdm1faW9fYnVzX3NvcnRfY21wLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9CiAK